[
  {
    "path": ".gitattributes",
    "content": "*.sh text=auto eol=lf\n"
  },
  {
    "path": ".github/workflows/builds.yml",
    "content": "name: builds\r\n\r\non:\r\n  push:\r\n    paths-ignore:\r\n      - '**.md'\r\n  pull_request:\r\n    paths-ignore:\r\n      - '**.md'\r\n\r\njobs:\r\n  build-windows-2022:\r\n    runs-on: windows-2022\r\n    strategy:\r\n      fail-fast: false\r\n      matrix:\r\n        target:\r\n          - raddbg\r\n          - radlink\r\n          - radbin\r\n        compiler:\r\n          - msvc\r\n          - clang\r\n        mode:\r\n          - debug\r\n          - release\r\n    steps:\r\n      - name: checkout\r\n        uses: actions/checkout@v2\r\n      - name: build (vs 2022)\r\n        shell: cmd\r\n        run: |\r\n          call \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\r\n          call build \"${{ matrix.target }}\" \"${{ matrix.compiler }}\" \"${{ matrix.mode }}\" || exit /b 1\r\n\r\n  run-torture:\r\n    runs-on: windows-2022\r\n    steps:\r\n      # - name: Install ASAN\r\n      #   shell: cmd\r\n      #   run: |\r\n      #     \"C:\\Program Files (x86)\\Microsoft Visual Studio\\Installer\\vs_installer.exe\" modify --installPath \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\" --quiet --force --norestart --add Microsoft.VisualStudio.Component.VC.ASAN\r\n      - name: checkout\r\n        uses: actions/checkout@v2\r\n      - name: run-torture\r\n        shell: cmd\r\n        run: |\r\n          call \"C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Auxiliary\\Build\\vcvarsall.bat\" x64\r\n          call build radlink asan debug no_meta || exit /b 1\r\n          call build torture debug no_meta || exit /b 1\r\n          cd build\r\n          torture -l:radlink || exit /b 1\r\n"
  },
  {
    "path": ".gitignore",
    "content": "/build/\r\n/local/\r\n*~\r\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# v0.9.24-alpha\n\n## Debugger Changes\n\n- Added the ability for the debugger to load, use, and evaluate using debug\n  info, even when not actively debugging. The debugger will now keep a process'\n  debug info loaded, even after the process ends. It stores the set of loaded\n  debug info files in the project configuration file, meaning it will also\n  automatically load the same debug info across many runs. Debug info can also\n  be loaded manually (without ever launching a process) with the\n  `Load Debug Info` command. There is also a new tab, `Debug Info`, which allows\n  viewing and managing the set of loaded debug info files.\n- Improved the debugger's behavior when used as a drag & drop target, to allow\n  for debug info loading as an option (when relevant), and to better handle the\n  case where many files (potentially of different types) are dropped together.\n- Improved debug info searching performance and reponsiveness in large projects.\n- Fixed some crashes and incorrect results with the new `list` view.\n- Fixed some cases where RDIs did not contain some basic types from their\n  originating PDBs.\n- Allowed `.` and `->` operators to be used with array types.\n- Fixed the debugger's treatment of quoted command line arguments when building\n  targets. In previous versions, calling `raddbg main.exe \"foo bar baz\"` would\n  create a target `main.exe` with arguments `foo bar baz` (dropping the quotes).\n  This is now fixed, such that the target's arguments string will also contain\n  the quotes, and pass them to the target when launched.\n- Fixed the debugger not correctly responding (through font and UI scale) to DPI\n  changes.\n- Fixed the debugger incorrectly generating conflicting source line info records\n  in PDB -> RDI conversion, which in some scenarios was preventing source line\n  maps from working (leading to breakpoint resolution failing).\n- Other small fixes, improvements, and tweaks.\n\n# v0.9.23-alpha\n\n## Debugger Changes\n\n- Further improved PDB -> RDI conversion performance & memory usage.\n- Adjusted limits for the amount of PDB -> RDI conversion work that the\n  debugger will kick off, to prevent PDB -> RDI conversion interfering with\n  debuggee performance.\n- Reintroduced the `list` lens, which gathers all nodes in a linked list, and\n  visualizes them as a flat list of pointers (the same as how an array of\n  pointers is visualized).\n- Fixed a crash when closing empty Geometry 3D views. (#652, #657)\n- Fixed the debugger not visualizing `enum` types when evaluated through a\n  bitfield type. (#655)\n- Fixed the PDB -> RDI conversion not correctly generating location information\n  for function parameters, when the EXE/PDB were built to include support for\n  Edit and Continue (`-ZI` switch). (#656)\n\n## Binary Utility Changes\n\n- Fixed a crash when using the `--compress` option, when generating RDI files.\n\n# v0.9.22-alpha\n\n## Debugger Changes\n\n- Further improved PDB -> RDI conversion performance.\n- Capped the number of additional threads / processes spawned for PDB -> RDI\n  conversion.\n- Prioritize PDB -> RDI conversion based on what is actually found to be\n  necessary by the debugger, rather than converting all PDBs in the order in\n  which they're discovered.\n- Added preliminary support for DWARF -> RDI conversion on Windows.\n- The debugger now relies on source file checksums to determine whether or not\n  a source file is out-of-date with respect to what was compiled when debug info\n  was produced, rather than just the modification timestamp.\n- The debugger now will rely on debug info to detect the language of source code\n  files, if it cannot infer from the source file's extension, or view settings.\n  This will enable features like syntax highlighting and hover evaluation in\n  cases like `.inl` files being included in C++ projects.\n- The debugger now will restore the last focused window when continuing\n  automatically. (#245, #596)\n- Watch tables have been simplified in that they no longer have a separate\n  column for evaluation types, since this was usually taking a lot more space\n  than it deserved. The type of evaluations is still displayed in watch table\n  cells, and it can always be evaluated directly via `typeof`.\n- Type evaluations have been simplified in watch tables as well; they no longer\n  have untitled columns for sizes and offsets, this is instead displayed as\n  an extra note by default. Similar behavior to the original behavior can still\n  be obtained using the `columns` view, if needed.\n- The debugger no longer uses complex `union` types for most registers, and\n  instead just displays the register value plainly.\n- The hover evaluation UI has been made larger when needed.\n- The debugger now prefers matching global, function, and type identifiers to\n  the most relevant debug info and module in context; this fixes evaluation in\n  some multi-process debugging contexts. (#581)\n- Fixed the debugger unnecessarily stripping `enum` type information when\n  accessed through array operators. (#634)\n- The debugger now understands a standalone `unsigned` keyword as an\n  `unsigned int` type, to match C rules.\n- The debugger now uses the current working directory to form the working\n  directory for targets specified on the command line, to match behavior when\n  running a command from the command line without the debugger.\n- Improved call stack computation performance.\n- Improved debugger memory usage over long periods of time.\n- Fixed string-pointer comparison not working with not-equal (`!=`) operations.\n- Fixed a bug which was causing bad debuggee performance on some threads after\n  some interactions with the debugger controller.\n- Fixed incorrect results when adding two register values. (#642)\n- Fixed the interpretation of register expressions in visualizers. (#649)\n- Fixed \"forever loading\" states in disassembly views in some cases. (#643)\n- Fixed jittering on window resizing. (#636)\n- Fixed the bitmap visualizer crashing in some circumstances relating to\n  unsupported bitmap sizes. (#444, #563)\n- Fixed a crash when an empty `cast()` expression would be evaluated. (#625)\n- Fixed a crash when an invalid expression would be visualized using the `text`\n  view. (#647)\n\n## Linker Changes\n\n- Changed symbol resolution in libaries to match MSVC behavior.\n- Optimized image building step to reduce memory usage.\n- Linker memory maps all input files by default to lower memory usage.\n  (`/RAD_MEMORY_MAP_FILES`)\n- If debug info is available, linker uses it to show file and line number for\n  unresolved relocations.\n- Improved base relocation build performance for large images, cutting build\n  time by 70%.\n- Added stubs for `/Brepro`, `/D2`, and /ErrorReport to improve compatability\n  with existing response files\n- Implemented section garbage collection (`/OPT:REF`)\n- Fixed bug where thread local variables pointed to incorrect types.\n- Changed rules for weak and undefined symbols, now weak symbol is not allowed\n  to replace an undefined symbol.\n- Linker no longer creates thunks for imports that don't require them.\n\n## Binary Utility Changes\n\n- The binary utility, like the debugger, now can convert DWARF debug info to\n  RDI files. When both DWARF and PDB info is present, it can now convert both,\n  and produce a single final RDI file with all information.\n- Textual dumping of RDI files is now done in parallel, massively improving\n  dumping performance.\n- PDB -> Breakpad conversion performance has now been parallelized to a greater\n  degree, improving performance.\n"
  },
  {
    "path": "LICENSE",
    "content": "Copyright (c) Epic Games Tools\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the “Software”), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\nof the Software, and to permit persons to whom the Software is furnished to do\r\nso, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n"
  },
  {
    "path": "README.md",
    "content": "# The RAD Debugger Project\r\n\r\n_**NOTE:** This README does not document usage instructions and tips for the\r\ndebugger itself, and is intended as a technical overview of the project. The\r\ndebugger's README, which includes usage instructions and tips, can be found\r\npackaged along with debugger releases, or within the `build` folder after a\r\nlocal copy has been built. You can find pre-built release binaries\r\n[here](https://github.com/EpicGamesExt/raddebugger/releases)._\r\n\r\nThe RAD Debugger is a native, user-mode, multi-process, graphical debugger. It\r\ncurrently only supports local-machine Windows x64 debugging with PDBs, with\r\nplans to expand and port in the future. In the future we'll expand to also\r\nsupport native Linux debugging and DWARF debug info.\r\n\r\nThe debugger is currently in *ALPHA*. In order to get the debugger\r\nbullet-proof, it'd greatly help out if you submitted the issues you find\r\n[here](https://github.com/EpicGamesExt/raddebugger/issues), along with any\r\ninformation you can gather, like dump files (along with the build you used),\r\ninstructions to reproduce, test executables, and so on.\r\n\r\nIn addition to the debugger, we aim to further improve the toolchain with two\r\nadditional related technologies: **(1)** the RAD Debug Info (RDI) format, and\r\n**(2)** the RAD Linker.\r\n\r\n## The RAD Debug Info (RDI) Format\r\n\r\nThe RAD Debug Info (RDI) format is our custom debug information format, which\r\nthe debugger parses and uses, rather than the debug information natively\r\nproduced by toolchains, like PDB or DWARF. To work with these existing\r\ntoolchains, we convert PDB (and eventually PE/ELF files with embedded DWARF)\r\ninto the RDI format on-demand.\r\n\r\nThe RDI format is currently specified in code, in the files within the\r\n`src/lib_rdi` folder. In [`rdi.h`](src/lib_rdi/rdi.h) and\r\n[`rdi.c`](src/lib_rdi/rdi.c), the types and functions which define the format\r\nitself are specified. In [`rdi_parse.h`](src/lib_rdi/rdi_parse.h) and\r\n[`rdi_parse.c`](src/lib_rdi/rdi_parse.c), helpers for parsing the format are\r\nincluded.\r\n\r\nWe also have an in-progress library for constructing and serializing RDI data,\r\nlocated within the `src/lib_rdi_make` folder.\r\n\r\nOur `radbin` utility (accessible through the debugger too, via the `--bin`\r\ncommand line argument) is capable of converting native debug information formats\r\nto RDI, and of producing textual dumps of contents stored within RDI files.\r\n\r\n## The RAD Linker\r\n\r\nThe RAD Linker is a new performance linker for generating x64 PE/COFF binaries.\r\nIt is designed to be very fast when creating gigantic executables. It generates\r\nstandard PDB files for debugging, but it can also (optionally) natively create\r\nRAD Debug Info too, which is useful both to eliminate on-demand conversion time\r\nwhen debugging, but also for huge executables that otherwise create broken\r\nPDBs that overflow internal 32-bit tables.\r\n\r\nThe RAD Linker is primarily optimized to handle huge linking projects. In our\r\ntest cases (where debug info is multiple gigabytes), we see 50% faster link\r\ntimes.\r\n\r\nThe command line syntax is fully compatible with MSVC; you can get a full list\r\nof implemented switches from `/help`.\r\n\r\nOur current designed-for use case for the linker is to help with the\r\ncompile-debug cycle of huge projects. We don't yet have support for\r\nlink-time-optimizations, but this feature is on the road map.\r\n\r\nBy default, the linker spawns as many threads as there are cores, so if you plan\r\nto run multiple linkers in parallel, you can limit the number of thread workers\r\nvia `/rad_workers`.\r\n\r\nWe also have support for large memory pages, which, when enabled, reduce link\r\ntime by another 25%. To link with large pages, you need to explicitly request\r\nthem via `/rad_large_pages`. Large pages are off by default, since Windows\r\nsupport for large pages is a bit buggy; we recommend they only be used in Docker\r\nor VM images where the environment is reset after each link. In a standard\r\nWindows environment, using large pages otherwise will fragment memory quickly,\r\nforcing a reboot. We are working on a Linux port of the linker that will be able\r\nto build with large pages robustly.\r\n\r\nA benchmark of the linker's performance is below:\r\n\r\n![AMD Ryzen Threadripper PRO 3995WX 64-Cores, 256 GiB RAM (Windows x64)](https://github.com/user-attachments/assets/a95b382a-76b4-4a4c-b809-b61fe25e667a)\r\n\r\n---\r\n\r\n# Project Development Setup Instructions\r\n\r\n**NOTE: Currently, only x64 Windows development is supported for the project.**\r\n\r\n## 1. Installing the Required Tools (MSVC & Windows SDK)\r\n\r\nIn order to work with the codebase, you'll need the [Microsoft C/C++ Build Tools\r\nv15 (2017) or later](https://aka.ms/vs/17/release/vs_BuildTools.exe), for both\r\nthe Windows SDK and the MSVC compiler and linker.\r\n\r\nIf the Windows SDK is installed (e.g. via installation of the Microsoft C/C++\r\nBuild Tools), you may also build with [Clang](https://releases.llvm.org/).\r\n\r\n## 2. Build Environment Setup\r\n\r\nBuilding the codebase can be done in a terminal which is equipped with the\r\nability to call either MSVC or Clang from command line.\r\n\r\nThis is generally done by calling `vcvarsall.bat x64`, which is included in the\r\nMicrosoft C/C++ Build Tools. This script is automatically called by the `x64\r\nNative Tools Command Prompt for VS <year>` variant of the vanilla `cmd.exe`. If\r\nyou've installed the build tools, this command prompt may be easily located by\r\nsearching for `Native` from the Windows Start Menu search.\r\n\r\nYou can ensure that the MSVC compiler is accessible from your command line by\r\nrunning:\r\n\r\n```\r\ncl\r\n```\r\n\r\nIf everything is set up correctly, you should have output very similar to the\r\nfollowing:\r\n\r\n```\r\nMicrosoft (R) C/C++ Optimizing Compiler Version 19.29.30151 for x64\r\nCopyright (C) Microsoft Corporation.  All rights reserved.\r\n\r\nusage: cl [ option... ] filename... [ /link linkoption... ]\r\n```\r\n\r\n### 3. Building\r\n\r\nWithin this terminal, `cd` to the root directory of the codebase, and just run\r\nthe `build.bat` script:\r\n\r\n```\r\nbuild\r\n```\r\n\r\nYou should see the following output:\r\n\r\n```\r\n[debug mode]\r\n[msvc compile]\r\n[default mode, assuming `raddbg` build]\r\nmetagen_main.c\r\nsearching C:\\devel\\raddebugger/src... 458 files found\r\nparsing metadesk... 16 metadesk files parsed\r\ngathering tables... 97 tables found\r\ngenerating layer code...\r\nraddbg_main.c\r\n```\r\n\r\nIf everything worked correctly, there will be a `build` folder in the root\r\nlevel of the codebase, and it will contain a freshly-built `raddbg.exe`.\r\n\r\nThis `raddbg.exe` will have been built in **debug mode**, which is not built\r\nwith optimizations, and may perform worse. To produce a\r\n**release mode executable**, run `build.bat` with a `release` argument:\r\n\r\n```\r\nbuild release\r\n```\r\n\r\nThis build will take significantly longer.\r\n\r\nBy default, `build.bat` only builds the debugger if no arguments (or just\r\n`release`) are passed, but additional arguments can be passed to build the RAD\r\nLinker, or the `radbin` CLI binary file utility:\r\n\r\n```\r\nbuild radlink release\r\nbuild radbin release\r\n```\r\n\r\n---\r\n\r\n# Project Roadmap\r\n\r\n### The Initial Alpha Battle-Testing Phase\r\n\r\nThe first priority for the project is to ensure that the most crucial components\r\nare functioning extremely reliably for local, x64, Windows development.\r\nFor the debugger, this would include parts like debug info conversion, debug\r\ninfo loading, process control, stepping, evaluation (correct usage of both\r\nlocation info and type info), and a robust frontend which ensures the lower\r\nlevel parts are usable. For the linker, this is a matter of reliability and\r\nconvergence with existing linker behavior.\r\n\r\nWe feel that we've already come a long way in all of these respects, but given\r\nthe massive set of possible combinations of languages, build settings,\r\ntoolchains, used language features, and patterns of generated code, we still\r\nexpect some issues, and are prioritizing these issues being resolved first.\r\n\r\nWe also hope to continue to improve performance in this phase. For the debugger,\r\nthis primarily includes frontend performance, introducing caches when economical\r\nto do so, and tightening existing systems up. For the linker, it has been mostly\r\ntuned thus far for giant projects, and so we'd like to improve linking speed for\r\nsmall-to-mid sized projects as well.\r\n\r\nFor the linker, there are also a number of features to come, like\r\ndead-code-elimination (`/opt:ref`), and link-time-optimizations with the help\r\nof `clang` (we won't support LTCG from MSVC, since it is undocumented).\r\n\r\n### Local x64 Linux Debugging Phase\r\n\r\nThe next priority for the project is to take the rock solid x64 Windows\r\ndebugging experience, and port all of the relevant pieces to support local x64\r\nLinux debugging also.\r\n\r\nThe debugger has been written to abstract over the parts that need to differ on\r\neither Linux or Windows, and this is mainly going to be a task in building out\r\ndifferent backends for those abstraction layers.\r\n\r\nThe major parts of this phase are:\r\n\r\n- Porting the `src/demon` layer to implement the Demon local process control\r\nabstraction API.\r\n- Implementing an x64 ELF Linux unwinder in the `src/ctrl` layer.\r\n- Creating a DWARF-to-RDI converter (in the same way that we've built a\r\nPDB-to-RDI converter). A partial implementation of this is in\r\n`src/rdi_from_dwarf`.\r\n- Porting the `src/render` layer to implement all of the rendering features the\r\nfrontend needs on a Linux-compatible API (the backend used on Windows is D3D11).\r\n- Porting the `src/font_provider` layer to a Linux-compatible font\r\nrasterization backend, like FreeType (the backend used on Windows is\r\nDirectWrite).\r\n- Porting the `src/os` layers to Linux. This includes core operating system\r\nabstraction (virtual memory allocation, threading and synchronization\r\nprimitives, and so on), and graphical operating system abstraction (windows,\r\ninput events, and so on).\r\n\r\nOnce the above list is complete, and once every part is rock solid, the Windows\r\ndebugging experience we'll have worked diligently to create will also be\r\navailable natively on Linux machines.\r\n\r\n### And Beyond!\r\n\r\nThere are several directions we might take after these two major phases,\r\nlike remote debugging, porting to different architectures, further improving\r\nthe debugger's features (like improving the visualization engine), and so on.\r\nBut for now, we're mostly focused on those first two phases.\r\n\r\n---\r\n\r\n# Codebase Introduction\r\n\r\n## Top-Level Directory Descriptions\r\n\r\n- `data`: Small binary files which are used when building, either to embed\r\n  within build artifacts, or to package with them.\r\n- `src`: All source code.\r\n\r\nAfter setting up the codebase and building, the following directories will\r\nalso exist:\r\n\r\n- `build`: All build artifacts. Not checked in to version control.\r\n- `local`: Local files, used for local build configuration input files. Not\r\n  checked in to version control.\r\n\r\n## Layer Descriptions\r\n\r\nThe codebase is organized into *layers*. Layers are separated either to isolate\r\ncertain problems, and to allow inclusion into various builds without needing to\r\npull everything in the codebase into a build. Layers correspond with folders\r\ninside of the `src` directory. Sometimes, one folder inside of the `src`\r\ndirectory will include multiple sub-layers, but the structure is intended to be\r\nfairly flat.\r\n\r\nLayers correspond roughly 1-to-1 with *namespaces*. The term \"namespaces\" in\r\nthis context does not refer to specific namespace language features, but rather\r\na naming convention for C-style namespaces, which are written in the codebase as\r\na short prefix, usually 1-3 characters, followed by an underscore. These\r\nnamespaces are used such that the layer to which certain code belongs may be\r\nquickly understood by glancing at code. The namespaces are generally quite short\r\nto ensure that they aren't much of a hassle to write. Sometimes, multiple sub-\r\nlayers will share a namespace. A few layers do not have a namespace, but most\r\ndo. Namespaces are either all-caps or lowercase depending on the context in\r\nwhich they're used. For types, enum values, and some macros, they are\r\ncapitalized. For functions and global variables, they are lowercase.\r\n\r\nLayers depend on other layers, but circular dependencies would break the\r\nseparability and isolation utility of layers (in effect, forming one big layer),\r\nso in other words, layers are arranged into a directed acyclic graph.\r\n\r\nA few layers are built to be used completely independently from the rest of the\r\ncodebase, as libraries in other codebases and projects. As such, these layers do\r\nnot depend on any other layers in the codebase. The folders which contain these\r\nlayers are prefixed with `lib_`, like `lib_rdi`.\r\n\r\nA list of the layers in the codebase and their associated namespaces is below:\r\n- `artifact_cache` (`AC_`): Implements an asynchronously-filled cache of\r\n  computation artifacts, which are automatically evicted when not accessed. Used\r\n  for asynchronously streaming and caching process memory and file system\r\n  contents, as well as asynchronously preparing visualizer data.\r\n- `base` (no namespace): Universal, codebase-wide constructs. Strings, math,\r\n  memory allocators, helper macros, command-line parsing, and so on. Requires\r\n  no other codebase layers.\r\n- `codeview` (`CV_`): Code for parsing and writing the CodeView format.\r\n- `coff` (`COFF_`): Code for parsing and writing the COFF (Common Object File\r\n  Format) file format.\r\n- `content` (`C_`): Implements a cache for general data blobs, keyed by a\r\n  128-bit hash of the data. Also implements a keying system on top, where keys\r\n  refer to a unique identity which corresponds to a history of 128-bit hashes.\r\n  Used as a general data store by other layers.\r\n- `ctrl` (`CTRL_`): The debugger's \"control system\" layer. Implements\r\n  asynchronous process control, stepping, and breakpoints for all attached\r\n  processes. Runs in lockstep with attached processes. When it runs, attached\r\n  processes are halted. When attached processes are running, it is halted.\r\n  Driven by a debugger frontend on another thread.\r\n- `dbg_engine` (`D_`): Implements the core debugger system, without any\r\n  graphical components. This contains top-level logic for things like stepping,\r\n  launching, freezing threads, mid-run breakpoint addition, some caches, and so\r\n  on.\r\n- `dbg_info` (`DI_`): Implements asynchronous debug info conversion and loading.\r\n  Maintains a cache for loaded debug info. Loads RAD Debug Info (RDI) files.\r\n  Launches separate processes for on-demand conversion to the RDI format if\r\n  necessary. Also provides various asynchronous operations for using debug info,\r\n  like fuzzy searching across all records in loaded debug info.\r\n- `demon` (`DMN_`): An abstraction layer for local-machine, low-level process\r\n  control. The abstraction is used to provide a common interface for process\r\n  control on target platforms. Used to implement part of `ctrl`.\r\n- `disasm` (`DASM_`): Implements disassembly generation, including exposing the\r\n  ability to compute and cache disassembly asynchronously.\r\n- `draw` (`DR_`): Implements a high-level graphics drawing API for the\r\n  debugger's purposes, using the underlying `render` abstraction layer. Provides\r\n  high-level APIs for various draw commands, but takes care of batching them,\r\n  and so on.\r\n- `dwarf` (`DW_`): Code for parsing the DWARF format.\r\n- `eh` (`EH_`): Code for parsing the EH frame format.\r\n- `elf` (`ELF_`): Code for parsing the ELF format.\r\n- `eval` (`E_`): A compiler for an expression language, built for evaluation of\r\n  variables, registers, types, and more, from debugger-attached processes,\r\n  debug info, debugger state, and files. Broken into several phases mostly\r\n  corresponding to traditional compiler phases: lexer, parser, type-checker, IR\r\n  generation, and IR evaluation.\r\n- `eval_visualization` (`EV_`): Implements the core non-graphical evaluation\r\n  visualization engine, which can be used to visualize evaluations (provided by\r\n  the `eval` layer) in a number of ways. Implements core data structures and\r\n  transforms for watch tables.\r\n- `file_stream` (`FS_`): Implements asynchronous file streaming, storing the\r\n  artifacts inside of the cache implemented by the `content` and\r\n  `artifact_cache` layers, hot-reloading the contents of files when they change.\r\n  Allows callers to map file paths to data hashes, which can then be used to\r\n  obtain the file's data.\r\n- `font_cache` (`FNT_`): Implements a cache of rasterized font data, both in\r\n  CPU-side data for text shaping, and in GPU texture atlases for rasterized\r\n  glyphs. All cache information is sourced from the `font_provider` abstraction\r\n  layer.\r\n- `font_provider` (`FP_`): An abstraction layer for various font file decoding\r\n  and font rasterization backends.\r\n- `lib_raddbg_markup` (`RADDBG_`): Standalone library for marking up user\r\n  programs to work with various features in the debugger. Does not depend on\r\n  `base`, and can be independently relocated to other codebases.\r\n- `lib_rdi` (`RDI_`): Standalone library which defines the core RDI types\r\n  and helper functions for reading and writing the RDI debug info file format.\r\n  Does not depend on `base`, and can be independently relocated to other\r\n  codebases.\r\n- `lib_rdi_make` (`RDIM_`): Standalone library for constructing RDI debug info\r\n  data. Does not depend on `base`, and can be independently relocated\r\n  to other codebases.\r\n- `linker` (`LNK_`): The layer which implements the RAD Linker executable\r\n  itself.\r\n- `mdesk` (`MD_`): Code for parsing Metadesk files (stored as `.mdesk`), which\r\n  is the JSON-like (technically a JSON superset) text format used for the\r\n  debugger's user and project configuration files and metacode, which is parsed\r\n  and used to generate code with the `metagen` layer.\r\n- `metagen` (`MG_`): A metaprogram which is used to generate primarily code and\r\n  data tables. Consumes Metadesk files, stored with the extension `.mdesk`, and\r\n  generates C code which is then included by hand-written C code. Currently, it\r\n  does not analyze the codebase's hand-written C code, but in principle this is\r\n  possible. This allows easier & less-error-prone management of large data\r\n  tables, which are then used to produce e.g. C `enum`s and a number of\r\n  associated data tables. There are also a number of other generation features,\r\n  like embedding binary files or complex multi-line strings into source code.\r\n- `msf` (`MSF_`): Code for parsing and writing the MSF file format.\r\n- `msvc_crt` (`MSCRT_`): Code for parsing that's specific to the MSVC CRT.\r\n- `mule` (no namespace): Test executables for battle testing debugger\r\n  functionality.\r\n- `mutable_text` (`MTX_`): Implements an asynchronously-filled-and-mutated\r\n  cache for text buffers which are mutated across time. In the debugger, this is\r\n  used to implement the `Output` log.\r\n- `natvis` (no namespace): NatVis files for type visualization of the codebase's\r\n  types in other debuggers.\r\n- `os/core` (`OS_`): An abstraction layer providing core, non-graphical\r\n  functionality from the operating system under an abstract API, which is\r\n  implemented per-target-operating-system.\r\n- `os/gfx` (`OS_`): An abstraction layer, building on `os/core`, providing\r\n  graphical operating system features under an abstract API, which is\r\n  implemented per-target-operating-system.\r\n- `pdb` (`PDB_`): Code for parsing and writing the PDB file format.\r\n- `pe` (`PE_`): Code for parsing and writing the PE (Portable Executable) file\r\n  format.\r\n- `radbin` (`RB_`): The layer implementing the `radbin` binary utility\r\n  executable.\r\n- `raddbg` (`RD_`): The layer which ties everything together for the main\r\n  graphical debugger executable. Implements the debugger's graphical frontend,\r\n  all of the debugger-specific UI, the debugger executable's command line\r\n  interface, and all of the built-in visualizers.\r\n- `rdi` (`RDI_`): A layer which includes the `lib_rdi` layer and bundles it with\r\n  codebase-specific helpers, to easily include the library in codebase programs,\r\n  and have it be integrated with codebase constructs.\r\n- `rdi_from_coff` (`C2R_`): Code for converting information in COFF files to the\r\n  equivalent RDI data.\r\n- `rdi_from_dwarf` (`D2R_`): In-progress code for converting DWARF to the\r\n  equivalent RDI data.\r\n- `rdi_from_elf` (`E2R_`)): Code for converting ELF data to the equivalent RDI\r\n  data.\r\n- `rdi_from_pdb` (`P2R_`): Code for converting PDB data to the equivalent RDI\r\n  data.\r\n- `rdi_make` (`RDIM_`): A layer which includes the `lib_rdi_make` layer and\r\n  bundles it with codebase-specific helpers, to easily include the library in\r\n  codebase programs, and have it be integrated with codebase constructs.\r\n- `regs` (`REGS_`): Types, helper functions, and metadata for registers on\r\n  supported architectures. Used in reading/writing registers in `demon`, or in\r\n  looking up register metadata.\r\n- `render` (`R_`): An abstraction layer providing an abstract API for rendering\r\n  using various GPU APIs under a common interface. Does not implement a high\r\n  level drawing API - this layer is strictly for minimally abstracting on an\r\n  as-needed basis. Higher level drawing features are implemented in the `draw`\r\n  layer.\r\n- `scratch` (no namespace): Scratch space for small and transient test programs.\r\n- `tester` (no namespace): A program used for automated testing.\r\n- `text` (`TXT_`): Implements text processing functions, like parsing line\r\n  breaks, and lexing and parsing source code. Also offers an API to do this\r\n  asynchronously.\r\n- `third_party` (no namespace): External code from other projects, which some\r\n  layers in the codebase depend on. All external code is included and built\r\n  directly within the codebase.\r\n- `ui` (`UI_`): Machinery for building graphical user interfaces. Provides a\r\n  core immediate mode hierarchical user interface data structure building\r\n  API, and has helper layers for building some higher-level widgets.\r\n"
  },
  {
    "path": "build.bat",
    "content": "@echo off\r\nsetlocal enabledelayedexpansion\r\ncd /D \"%~dp0\"\r\n:restart\r\n\r\n:: --- Usage Notes (2024/1/10) ------------------------------------------------\r\n::\r\n:: This is a central build script for the RAD Debugger project, for use in\r\n:: Windows development environments. It takes a list of simple alphanumeric-\r\n:: only arguments which control (a) what is built, (b) which compiler & linker\r\n:: are used, and (c) extra high-level build options. By default, if no options\r\n:: are passed, then the main \"raddbg\" graphical debugger is built.\r\n::\r\n:: Below is a non-exhaustive list of possible ways to use the script:\r\n:: `build raddbg`\r\n:: `build raddbg clang`\r\n:: `build raddbg release`\r\n:: `build raddbg asan telemetry`\r\n:: `build rdi_from_pdb`\r\n::\r\n:: For a full list of possible build targets and their build command lines,\r\n:: search for @build_targets in this file.\r\n::\r\n:: Below is a list of all possible non-target command line options:\r\n::\r\n:: - `asan`: enable address sanitizer\r\n:: - `telemetry`: enable RAD telemetry profiling support\r\n:: - `spall`: enable spall profiling support\r\n\r\n:: --- Unpack Arguments -------------------------------------------------------\r\nfor %%a in (%*) do set \"%%~a=1\"\r\nif not \"%msvc%\"==\"1\" if not \"%clang%\"==\"1\" set msvc=1\r\nif not \"%release%\"==\"1\" set debug=1\r\nif \"%debug%\"==\"1\"   set release=0 && echo [debug mode]\r\nif \"%release%\"==\"1\" set debug=0 && echo [release mode]\r\nif \"%msvc%\"==\"1\"    set clang=0 && echo [msvc compile]\r\nif \"%clang%\"==\"1\"   set msvc=0 && echo [clang compile]\r\nif \"%~1\"==\"\"                     echo [default mode, assuming `raddbg` build] && set raddbg=1\r\nif \"%~1\"==\"release\" if \"%~2\"==\"\" echo [default mode, assuming `raddbg` build] && set raddbg=1\r\n\r\n:: --- Unpack Command Line Build Arguments ------------------------------------\r\nset auto_compile_flags=\r\nif \"%telemetry%\"==\"1\"               set auto_compile_flags=%auto_compile_flags% -DPROFILE_TELEMETRY=1 && echo [telemetry profiling enabled]\r\nif \"%spall%\"==\"1\"                   set auto_compile_flags=%auto_compile_flags% -DPROFILE_SPALL=1 && echo [spall profiling enabled]\r\nif \"%asan%\"==\"1\"                    set auto_compile_flags=%auto_compile_flags% -fsanitize=address && echo [asan enabled]\r\nif \"%opengl%\"==\"1\"                  set auto_compile_flags=%auto_compile_flags% -DR_BACKEND=R_BACKEND_OPENGL && echo [opengl render backend]\r\nif \"%dwarf%\"==\"1\" if \"%clang%\"==\"1\" set auto_compile_flags=%auto_compile_flags% -gdwarf && echo [dwarf debug info]\r\nif \"%dwarf%\"==\"\"  if \"%clang%\"==\"1\" set auto_compile_flags=%auto_compile_flags% -gcodeview\r\nif \"%pgo%\"==\"1\" (\r\n  where llvm-profdata /q || echo llvm-profdata is not in the PATH || exit /b 1 \r\n  if \"%clang%\"==\"1\" (\r\n    if \"%pgo_run%\" == \"1\" (\r\n      call llvm-profdata merge %LLVM_PROFILE_FILE% -output=%~dp0build\\build.profdata || exit /b 1\r\n      set auto_compile_flags=%auto_compile_flags% -fprofile-use=%~dp0build\\build.profdata\r\n      set pgo_run=0\r\n    ) else (\r\n      echo [pgo enabled]\r\n      set auto_compile_flags=%auto_compile_flags% -fprofile-generate -mllvm -vp-counters-per-site=5\r\n      set LLVM_PROFILE_FILE=%~dp0build\\build.profraw\r\n      set pgo_run=1\r\n    )\r\n  ) else (\r\n    echo ERROR: PGO build is not supported with current compiler\r\n    exit /b 1\r\n  )\r\n)\r\n\r\n:: --- Compile/Link Line Definitions ------------------------------------------\r\nset cl_common=     /I..\\src\\ /I..\\local\\ /nologo /FC /Z7\r\nset cl_debug=      call cl /Od /Ob1 /DBUILD_DEBUG=1 %cl_common% %auto_compile_flags%\r\nset cl_release=    call cl /O2 /DBUILD_DEBUG=0 %cl_common% %auto_compile_flags%\r\nset cl_link=       /link /MANIFEST:EMBED /INCREMENTAL:NO /pdbaltpath:%%%%_PDB%%%% /NATVIS:\"%~dp0\\src\\natvis\\base.natvis\" /noexp /nocoffgrpinfo /opt:ref /opt:icf\r\nset cl_out=        /out:\r\nset cl_linker=     \r\nset clang_common=  -I..\\src\\ -I..\\local\\ -fdiagnostics-absolute-paths -Wall -Wno-unknown-warning-option -Wno-missing-braces -Wno-unused-function -Wno-unused-parameter -Wno-writable-strings -Wno-missing-field-initializers -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf -ferror-limit=10000 -mcx16 -msha\r\nset clang_debug=   call clang -g -O0 -DBUILD_DEBUG=1 %clang_common% %auto_compile_flags%\r\nset clang_release= call clang -g -O2 -DBUILD_DEBUG=0 %clang_common% %auto_compile_flags%\r\nset clang_link=    -fuse-ld=lld -Xlinker /MANIFEST:EMBED -Xlinker /pdbaltpath:%%%%_PDB%%%% -Xlinker /NATVIS:\"%~dp0\\src\\natvis\\base.natvis\" -Xlinker /opt:ref -Xlinker /opt:icf\r\nset clang_out=     -o\r\nset clang_linker=  -Xlinker\r\n\r\n:: --- Per-Build Settings -----------------------------------------------------\r\nset link_dll=-DLL\r\nset link_icon=logo.res\r\nif \"%msvc%\"==\"1\"    set linker=%cl_linker%\r\nif \"%clang%\"==\"1\"   set linker=%clang_linker%\r\nif \"%msvc%\"==\"1\"    set only_compile=/c\r\nif \"%clang%\"==\"1\"   set only_compile=-c\r\nif \"%msvc%\"==\"1\"    set EHsc=/EHsc\r\nif \"%clang%\"==\"1\"   set EHsc=\r\nif \"%msvc%\"==\"1\"    set no_aslr=/DYNAMICBASE:NO\r\nif \"%clang%\"==\"1\"   set no_aslr=-Wl,/DYNAMICBASE:NO\r\nif \"%msvc%\"==\"1\"    set rc=call rc\r\nif \"%clang%\"==\"1\"   set rc=call llvm-rc\r\n\r\n:: --- Choose Compile/Link Lines ----------------------------------------------\r\nif \"%msvc%\"==\"1\"      set compile_debug=%cl_debug%\r\nif \"%msvc%\"==\"1\"      set compile_release=%cl_release%\r\nif \"%msvc%\"==\"1\"      set compile_link=%cl_link%\r\nif \"%msvc%\"==\"1\"      set out=%cl_out%\r\nif \"%clang%\"==\"1\"     set compile_debug=%clang_debug%\r\nif \"%clang%\"==\"1\"     set compile_release=%clang_release%\r\nif \"%clang%\"==\"1\"     set compile_link=%clang_link%\r\nif \"%clang%\"==\"1\"     set out=%clang_out%\r\nif \"%debug%\"==\"1\"     set compile=%compile_debug%\r\nif \"%release%\"==\"1\"   set compile=%compile_release%\r\n\r\n:: --- Prep Directories -------------------------------------------------------\r\nif not exist build mkdir build\r\nif not exist local mkdir local\r\n\r\n:: --- Produce Logo Icon File -------------------------------------------------\r\npushd build\r\n%rc% /nologo /fo logo.res ..\\data\\logo.rc || exit /b 1\r\npopd\r\n\r\n:: --- Get Current Git Commit Id ----------------------------------------------\r\nfor /f %%i in ('call git describe --always --dirty')   do set compile=%compile% -DBUILD_GIT_HASH=\\\"%%i\\\"\r\nfor /f %%i in ('call git rev-parse HEAD')              do set compile=%compile% -DBUILD_GIT_HASH_FULL=\\\"%%i\\\"\r\n\r\n:: --- Build & Run Metaprogram ------------------------------------------------\r\nif \"%meta%\"==\"1\" (\r\n  echo [doing metagen]\r\n  pushd build\r\n  %compile_debug% ..\\src\\metagen\\metagen_main.c %compile_link% %out%metagen.exe || exit /b 1\r\n  metagen.exe || exit /b 1\r\n  popd\r\n)\r\n\r\n:: --- Build Everything (@build_targets) --------------------------------------\r\npushd build\r\nif \"%raddbg%\"==\"1\"                     set didbuild=1 && %compile% ..\\src\\raddbg\\raddbg_main.c                               %compile_link% %link_icon% %out%raddbg.exe || exit /b 1\r\nif \"%radlink%\"==\"1\"                    set didbuild=1 && %compile% ..\\src\\linker\\lnk.c                                       %compile_link% %linker% /NOIMPLIB %linker% /NATVIS:\"%~dp0\\src\\linker\\linker.natvis\" %out%radlink.exe || exit /b 1\r\nif \"%radbin%\"==\"1\"                     set didbuild=1 && %compile% ..\\src\\radbin\\radbin_main.c                               %compile_link% %out%radbin.exe || exit /b 1\r\nif \"%raddump%\"==\"1\"                    set didbuild=1 && %compile% ..\\src\\raddump\\raddump_main.c                             %compile_link% %out%raddump.exe || exit /b 1\r\nif \"%tester%\"==\"1\"                     set didbuild=1 && %compile% ..\\src\\tester\\tester_main.c                               %compile_link% %out%tester.exe || exit /b 1\r\nif \"%ryan_scratch%\"==\"1\"               set didbuild=1 && %compile% ..\\src\\scratch\\ryan_scratch.c                             %compile_link% %out%ryan_scratch.exe || exit /b 1\r\nif \"%eval_scratch%\"==\"1\"               set didbuild=1 && %compile% ..\\src\\scratch\\eval_scratch.c                             %compile_link% %out%eval_scratch.exe || exit /b 1\r\nif \"%textperf%\"==\"1\"                   set didbuild=1 && %compile% ..\\src\\scratch\\textperf.c                                 %compile_link% %out%textperf.exe || exit /b 1\r\nif \"%convertperf%\"==\"1\"                set didbuild=1 && %compile% ..\\src\\scratch\\convertperf.c                              %compile_link% %out%convertperf.exe || exit /b 1\r\nif \"%debugstringperf%\"==\"1\"            set didbuild=1 && %compile% ..\\src\\scratch\\debugstringperf.c                          %compile_link% %out%debugstringperf.exe || exit /b 1\r\nif \"%parse_inline_sites%\"==\"1\"         set didbuild=1 && %compile% ..\\src\\scratch\\parse_inline_sites.c                       %compile_link% %out%parse_inline_sites.exe || exit /b 1\r\nif \"%strip_lib_debug%\"==\"1\"            set didbuild=1 && %compile% ..\\src\\strip_lib_debug\\strip_lib_debug.c                  %compile_link% %out%strip_lib_debug.exe || exit /b 1\r\nif \"%mule_main%\"==\"1\"                  set didbuild=1 && del vc*.pdb mule*.pdb && %compile_release% %only_compile% ..\\src\\mule\\mule_inline.cpp && %compile_release% %only_compile% ..\\src\\mule\\mule_o2.cpp && %compile_debug% %EHsc% ..\\src\\mule\\mule_main.cpp ..\\src\\mule\\mule_c.c mule_inline.obj mule_o2.obj %compile_link% %no_aslr% %out%mule_main.exe || exit /b 1\r\nif \"%mule_module%\"==\"1\"                set didbuild=1 && %compile% ..\\src\\mule\\mule_module.cpp                               %compile_link% %link_dll% %out%mule_module.dll || exit /b 1\r\nif \"%mule_hotload%\"==\"1\"               set didbuild=1 && %compile% ..\\src\\mule\\mule_hotload_main.c %compile_link% %out%mule_hotload.exe & %compile% ..\\src\\mule\\mule_hotload_module_main.c %compile_link% %link_dll% %out%mule_hotload_module.dll || exit /b 1\r\nif \"%torture%\"==\"1\"                    set didbuild=1 && %compile% ..\\src\\torture\\torture.c                                  %compile_link% %out%torture.exe || exit /b1\r\nif \"%mule_peb_trample%\"==\"1\" (\r\n  set didbuild=1\r\n  if exist mule_peb_trample.exe move mule_peb_trample.exe mule_peb_trample_old_%random%.exe\r\n  if exist mule_peb_trample_new.pdb move mule_peb_trample_new.pdb mule_peb_trample_old_%random%.pdb\r\n  if exist mule_peb_trample_new.rdi move mule_peb_trample_new.rdi mule_peb_trample_old_%random%.rdi\r\n  %compile% ..\\src\\mule\\mule_peb_trample.c %compile_link% %out%mule_peb_trample_new.exe || exit /b 1\r\n  move mule_peb_trample_new.exe mule_peb_trample.exe\r\n)\r\npopd\r\n\r\n:: --- Warn On No Builds ------------------------------------------------------\r\nif \"%didbuild%\"==\"\" (\r\n  echo [WARNING] no valid build target specified; must use build target names as arguments to this script, like `build raddbg` or `build rdi_from_pdb`.\r\n  exit /b 1\r\n)\r\n\r\n:: --- PGO Run ----------------------------------------------------------------\r\nif \"%pgo_run%\"==\"1\" (\r\n  if \"%radlink%\"==\"1\" (\r\n    pushd local\\lyra_pgo\r\n    call %~dp0build\\radlink @lyra.rsp /rad_alt_pch_dir:%~dp0local\\lyra_pgo || exit /b 1\r\n    popd\r\n  )\r\n  goto restart\r\n)\r\n"
  },
  {
    "path": "build.sh",
    "content": "#!/bin/bash\nset -eu\ncd \"$(dirname \"$0\")\"\n\n# --- Unpack Arguments --------------------------------------------------------\nfor arg in \"$@\"; do declare $arg='1'; done\nif [ ! -v gcc ];     then clang=1; fi\nif [ ! -v release ]; then debug=1; fi\nif [ -v debug ];     then echo \"[debug mode]\"; fi\nif [ -v release ];   then echo \"[release mode]\"; fi\nif [ -v clang ];     then compiler=\"${CC:-clang}\"; echo \"[clang compile]\"; fi\nif [ -v gcc ];       then compiler=\"${CC:-gcc}\"; echo \"[gcc compile]\"; fi\n\n# --- Unpack Command Line Build Arguments -------------------------------------\nauto_compile_flags=''\n\n# --- Get Current Git Commit Id -----------------------------------------------\ngit_hash=$(git describe --always --dirty)\ngit_hash_full=$(git rev-parse HEAD)\n\n# --- Compile/Link Line Definitions -------------------------------------------\nclang_common=\"-I../src/ -I/usr/include/freetype2/ -I../local/ -D_GNU_SOURCE -g -DBUILD_GIT_HASH=\\\"$git_hash\\\" -DBUILD_GIT_HASH_FULL=\\\"$git_hash_full\\\" -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -Xclang -flto-visibility-public-std -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf\"\nclang_debug=\"$compiler -g -O0 -DBUILD_DEBUG=1 ${clang_common} ${auto_compile_flags}\"\nclang_release=\"$compiler -g -O2 -DBUILD_DEBUG=0 ${clang_common} ${auto_compile_flags}\"\nclang_link=\"-lpthread -lm -lrt -ldl\"\nclang_out=\"-o\"\ngcc_common=\"-I../src/ -I../local/ -g -D_GNU_SOURCE -DBUILD_GIT_HASH=\\\"$git_hash\\\" -DBUILD_GIT_HASH_FULL=\\\"$git_hash_full\\\" -Wno-unknown-warning-option -Wall -Wno-missing-braces -Wno-unused-function -Wno-attributes -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-compare-distinct-pointer-types -D_USE_MATH_DEFINES -Dstrdup=_strdup -Dgnu_printf=printf\"\ngcc_debug=\"$compiler -g -O0 -DBUILD_DEBUG=1 ${gcc_common} ${auto_compile_flags}\"\ngcc_release=\"$compiler -g -O2 -DBUILD_DEBUG=0 ${gcc_common} ${auto_compile_flags}\"\ngcc_link=\"-lpthread -lm -lrt -ldl\"\ngcc_out=\"-o\"\n\n# --- Per-Build Settings ------------------------------------------------------\nlink_dll=\"-fPIC\"\nlink_os_gfx=\"-lX11 -lXext\"\nlink_render=\"-lGL -lEGL\"\nlink_font_provider=\"-lfreetype\"\n\n# --- Choose Compile/Link Lines -----------------------------------------------\nif [ -v gcc ];     then compile_debug=\"$gcc_debug\"; fi\nif [ -v gcc ];     then compile_release=\"$gcc_release\"; fi\nif [ -v gcc ];     then compile_link=\"$gcc_link\"; fi\nif [ -v gcc ];     then out=\"$gcc_out\"; fi\nif [ -v clang ];   then compile_debug=\"$clang_debug\"; fi\nif [ -v clang ];   then compile_release=\"$clang_release\"; fi\nif [ -v clang ];   then compile_link=\"$clang_link\"; fi\nif [ -v clang ];   then out=\"$clang_out\"; fi\nif [ -v debug ];   then compile=\"$compile_debug\"; fi\nif [ -v release ]; then compile=\"$compile_release\"; fi\n\n# --- Prep Directories --------------------------------------------------------\nmkdir -p build\nmkdir -p local\n\n# --- Build & Run Metaprogram -------------------------------------------------\nif [ -v meta ]\nthen\n  echo \"[doing metagen]\"\n  cd build\n  $compile_debug ../src/metagen/metagen_main.c $compile_link $out metagen\n  ./metagen\n  cd ..\nfi\n\n# --- Build Everything (@build_targets) ---------------------------------------\ncd build\nif [ -v raddbg ];                then didbuild=1 && $compile ../src/raddbg/raddbg_main.c                                    $compile_link $link_os_gfx $link_render $link_font_provider $out raddbg; fi\nif [ -v radbin ];                then didbuild=1 && $compile ../src/radbin/radbin_main.c                                    $compile_link $out radbin; fi\nif [ -v radlink ];               then didbuild=1 && $compile ../src/linker/lnk.c                                            $compile_link $out radlink; fi\ncd ..\n\n# --- Warn On No Builds -------------------------------------------------------\nif [ ! -v didbuild ]\nthen\n  echo \"[WARNING] no valid build target specified; must use build target names as arguments to this script, like \\`./build.sh raddbg\\` or \\`./build.sh rdi_from_pdb\\`.\"\n  exit 1\nfi\n"
  },
  {
    "path": "data/logo.rc",
    "content": "1 ICON DISCARDABLE \"logo.ico\""
  },
  {
    "path": "project.4coder",
    "content": "version(2);\r\nproject_name = \"The RAD Debugger\";\r\n\r\nindent_width = \"2\";\r\ndefault_tab_width = \"2\";\r\n\r\npatterns =\r\n{\r\n  \"*.c\",\r\n  \"*.cpp\",\r\n  \"*.h\",\r\n  \"*.inc\",\r\n  \"*.hpp\",\r\n  \"*.bat\",\r\n  \"*.sh\",\r\n  \"*.4coder\",\r\n  \"*.glsl\",\r\n  \"*.bfs\",\r\n  \"*.html\",\r\n  \"*.txt\",\r\n  \"*.md\",\r\n  \"*.mdesk\",\r\n  \"*.asm\",\r\n};\r\n\r\nblacklist_patterns =\r\n{\r\n  \".*\",\r\n  \"metagen_base_*\",\r\n  \"metagen_os_*\",\r\n};\r\n\r\npaths =\r\n{\r\n  { .path = \".\",     .recursive = false, .relative = true, },\r\n  { .path = \"src\",   .recursive = true , .relative = true, },\r\n  { .path = \"local\", .recursive = true , .relative = true, },\r\n};\r\n\r\nload_paths =\r\n{\r\n  .win = paths,\r\n  .linux = paths,\r\n};\r\n\r\ncommands =\r\n{\r\n  //- rjf: [raddbg]\r\n  // .f1 = { .win = \"raddbg_stable --ipc kill_all && build raddbg meta telemetry\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .f1 = { .win = \"raddbg_stable --ipc kill_all && build radbin debug telemetry\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: [raddbg wsl]\r\n  // .f1 = { .win = \"wsl ./build.sh raddbg\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: [scratch]\r\n  .f2 = { .win = \"wsl ./build.sh raddbg\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: [textperf]\r\n  // .f1 = { .win = \"raddbg_stable --ipc kill_all && build no_meta telemetry textperf && raddbg_stable --ipc bring_to_front && raddbg_stable --ipc run\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: [tester]\r\n  // .f1 = { .win = \"raddbg_stable --ipc kill_all && build no_meta tester\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: [radbin]\r\n  // .f1 = { .win = \"raddbg_stable --ipc kill_all && build radbin\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: running target\r\n  .f3 = { .win = \"raddbg_stable --ipc run\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  // .f3 = { .win = \"wsl ./build/raddbg\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  // .f3 = { .win = \"pushd build && raddbg --user:dev.raddbg_user && popd\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  // .f3 = { .win = \"C:/devel/raddebugger/build/raddbg.exe --capture --user:C:/devel/raddebugger/build/local_dev.raddbg_user --project:C:/devel/raddebugger/build/local_dev.raddbg_project\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  // .f3 = { .win = \"wsl_launch /mnt/c/devel/raddebugger/build/raddbg\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: local target builds\r\n  .build_raddbg                = { .win = \"build raddbg\",                .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_from_pdb          = { .win = \"build rdi_from_pdb\",          .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_from_dwarf        = { .win = \"build rdi_from_dwarf\",        .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_dump              = { .win = \"build rdi_dump\",              .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_breakpad_from_pdb = { .win = \"build rdi_breakpad_from_pdb\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_ryan_scratch          = { .win = \"build ryan_scratch\",          .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_main             = { .win = \"build mule_main\",             .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_module           = { .win = \"build mule_module\",           .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_hotload          = { .win = \"build mule_hotload\",          .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_peb_trample      = { .win = \"build mule_peb_trample\",      .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: wsl target builds\r\n  .build_raddbg_wsl                = { .win = \"wsl ./build.sh raddbg\",                .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_from_pdb_wsl          = { .win = \"wsl ./build.sh rdi_from_pdb\",          .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_from_dwarf_wsl        = { .win = \"wsl ./build.sh rdi_from_dwarf\",        .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_dump_wsl              = { .win = \"wsl ./build.sh rdi_dump\",              .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_rdi_breakpad_from_pdb_wsl = { .win = \"wsl ./build.sh rdi_breakpad_from_pdb\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_ryan_scratch_wsl          = { .win = \"wsl ./build.sh ryan_scratch\",          .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_main_wsl             = { .win = \"wsl ./build.sh mule_main\",             .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_module_wsl           = { .win = \"wsl ./build.sh mule_module\",           .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_hotload_wsl          = { .win = \"wsl ./build.sh mule_hotload\",          .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  .build_mule_peb_trample_wsl      = { .win = \"wsl ./build.sh mule_peb_trample\",      .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n  \r\n  //- rjf: local target runs\r\n  .run_raddbg                  = { .win = \"pushd build && raddbg.exe && popd\", .linux = \"\", .out = \"*compilation*\", .footer_panel = true, .save_dirty_files = true, .cursor_at_end = false, },\r\n};\r\n\r\nfkey_command =\r\n{\r\n  .F1 = \"f1\",\r\n  .F2 = \"f2\",\r\n  .F3 = \"f3\",\r\n};\r\n\r\nfkey_command_override =\r\n{\r\n  .rjf =\r\n  {\r\n    .F1 = \"f1\",\r\n    .F2 = \"f2\",\r\n    .F3 = \"f3\",\r\n  },\r\n};\r\n"
  },
  {
    "path": "run_tests.bat",
    "content": "@echo off\r\nsetlocal\r\ncd /D \"%~dp0\"\r\n\r\necho --- getting test data folder path ---------------------------------------------\r\nif not exist .\\local\\test_data_path.txt (\r\n  echo error: You must first store the full path of your test data folder inside of `local/test_data_path.txt`.\r\n  goto :EOF\r\n)\r\nset /p test_data_folder=<.\\local\\test_data_path.txt\t\r\necho test data path: %test_data_folder%\r\necho:\r\n\r\necho --- building all testing executables ------------------------------------------\r\ncall build rdi_from_pdb rdi_dump raddbg radlink tester\r\necho:\r\n\r\necho --- running tests -------------------------------------------------------------\r\npushd build\r\ncall tester.exe --test_data:%test_data_folder%\r\npopd\r\n"
  },
  {
    "path": "src/artifact_cache/artifact_cache.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Layer Initialization\r\n\r\ninternal void\r\nac_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  ac_shared = push_array(arena, AC_Shared, 1);\r\n  ac_shared->arena = arena;\r\n  ac_shared->cache_slots_count = 256;\r\n  ac_shared->cache_slots = push_array(arena, AC_Cache *, ac_shared->cache_slots_count);\r\n  ac_shared->cache_stripes = stripe_array_alloc(arena);\r\n  for EachElement(idx, ac_shared->req_batches)\r\n  {\r\n    ac_shared->req_batches[idx].mutex = mutex_alloc();\r\n    ac_shared->req_batches[idx].arena = arena_alloc();\r\n  }\r\n  ac_shared->cancel_thread = thread_launch(ac_cancel_thread_entry_point, 0);\r\n  ac_shared->cancel_thread_semaphore = semaphore_alloc(0, 1, str8_zero());\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Lookups\r\n\r\ninternal AC_Artifact\r\nac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U64 endt_us)\r\n{\r\n  ProfBeginFunction();\r\n  AC_RequestBatch *req_batch = &ac_shared->req_batches[params->flags & AC_Flag_HighPriority ? 0 : 1];\r\n  \r\n  //- rjf: create function -> cache\r\n  AC_Cache *cache = 0;\r\n  {\r\n    U64 cache_hash = u64_hash_from_str8(str8_struct(&params->create));\r\n    U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;\r\n    Stripe *cache_stripe = stripe_from_slot_idx(&ac_shared->cache_stripes, cache_slot_idx);\r\n    for(B32 write_mode = 0; write_mode <= 1; write_mode += 1)\r\n    {\r\n      RWMutexScope(cache_stripe->rw_mutex, write_mode)\r\n      {\r\n        for(AC_Cache *c = ac_shared->cache_slots[cache_slot_idx]; c != 0; c = c->next)\r\n        {\r\n          if(c->create == params->create)\r\n          {\r\n            cache = c;\r\n            break;\r\n          }\r\n        }\r\n        if(write_mode && cache == 0)\r\n        {\r\n          cache = push_array(cache_stripe->arena, AC_Cache, 1);\r\n          SLLStackPush(ac_shared->cache_slots[cache_slot_idx], cache);\r\n          cache->create = params->create;\r\n          cache->destroy = params->destroy;\r\n          cache->slots_count = Max(256, params->slots_count);\r\n          cache->slots = push_array(cache_stripe->arena, AC_Slot, cache->slots_count);\r\n          cache->stripes = stripe_array_alloc(cache_stripe->arena);\r\n        }\r\n      }\r\n      if(cache != 0)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: unpack key\r\n  U64 hash = u64_hash_from_str8(key);\r\n  U64 slot_idx = hash%cache->slots_count;\r\n  AC_Slot *slot = &cache->slots[slot_idx];\r\n  Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx);\r\n  \r\n  //- rjf: cache * key -> existing artifact\r\n  B32 artifact_is_stale = 1;\r\n  B32 got_artifact = 0;\r\n  B32 need_request = 0;\r\n  AC_Artifact artifact = {0};\r\n  RWMutexScope(stripe->rw_mutex, 0)\r\n  {\r\n    for(AC_Node *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->key, key, 0))\r\n      {\r\n        ins_atomic_u64_eval_assign(&n->last_requested_gen, params->gen);\r\n        B32 is_stale = (n->last_completed_gen != params->gen);\r\n        if(ins_atomic_u64_eval(&n->completion_count) != 0 && (!is_stale || !(params->flags & AC_Flag_WaitForFresh)))\r\n        {\r\n          got_artifact = 1;\r\n          artifact_is_stale = is_stale;\r\n          artifact = n->val;\r\n          access_touch(access, &n->access_pt, stripe->cv);\r\n        }\r\n        if(is_stale)\r\n        {\r\n          B32 got_task = (ins_atomic_u64_eval_cond_assign(&n->working_count, 1, 0) == 0);\r\n          need_request = got_task;\r\n        }\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: didn't get artifact we want? -> fall back to slow path\r\n  if(!got_artifact || need_request)\r\n  {\r\n    RWMutexScope(stripe->rw_mutex, 1) for(;;)\r\n    {\r\n      B32 out_of_time = (os_now_microseconds() >= endt_us);\r\n      \r\n      // rjf: find node in cache\r\n      AC_Node *node = 0;\r\n      for(AC_Node *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(str8_match(n->key, key, 0))\r\n        {\r\n          node = n;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: no node? -> create\r\n      if(node == 0)\r\n      {\r\n        need_request = 1;\r\n        node = stripe->free;\r\n        if(node)\r\n        {\r\n          stripe->free = node->next;\r\n        }\r\n        else\r\n        {\r\n          node = push_array_no_zero(stripe->arena, AC_Node, 1);\r\n        }\r\n        MemoryZeroStruct(node);\r\n        DLLPushBack(slot->first, slot->last, node);\r\n        // TODO(rjf): string allocator for keys\r\n        node->key = str8_copy(stripe->arena, key);\r\n        node->working_count = 1;\r\n        node->evict_threshold_us = params->evict_threshold_us;\r\n      }\r\n      node->access_pt.last_time_touched_us = os_now_microseconds();\r\n      node->access_pt.last_update_idx_touched = update_tick_idx();\r\n      \r\n      // rjf: request\r\n      if(need_request)\r\n      {\r\n        need_request = 0;\r\n        MutexScope(req_batch->mutex)\r\n        {\r\n          AC_RequestNode *n = push_array(req_batch->arena, AC_RequestNode, 1);\r\n          if(params->flags & AC_Flag_Wide)\r\n          {\r\n            SLLQueuePush(req_batch->first_wide, req_batch->last_wide, n);\r\n            req_batch->wide_count += 1;\r\n          }\r\n          else\r\n          {\r\n            SLLQueuePush(req_batch->first_thin, req_batch->last_thin, n);\r\n            req_batch->thin_count += 1;\r\n          }\r\n          n->v.key = str8_copy(req_batch->arena, key);\r\n          n->v.gen = params->gen;\r\n          n->v.cancel_signal = &node->cancelled;\r\n          n->v.create = params->create;\r\n        }\r\n        cond_var_broadcast(async_tick_start_cond_var);\r\n        ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n        if(params->flags & AC_Flag_HighPriority)\r\n        {\r\n          ins_atomic_u32_eval_assign(&async_loop_again_high_priority, 1);\r\n        }\r\n      }\r\n      \r\n      // rjf: get value from node, if possible\r\n      if(!got_artifact && ins_atomic_u64_eval(&node->completion_count) != 0 && ((node->last_completed_gen == params->gen) || !(params->flags & AC_Flag_WaitForFresh) || out_of_time))\r\n      {\r\n        got_artifact = 1;\r\n        artifact_is_stale = (node->last_completed_gen == params->gen);\r\n        artifact = node->val;\r\n        access_touch(access, &node->access_pt, stripe->cv);\r\n      }\r\n      \r\n      // rjf: abort if needed\r\n      if(out_of_time || got_artifact || is_async_thread)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      // rjf: wait for results\r\n      cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 1, endt_us);\r\n    }\r\n  }\r\n  \r\n  //- rjf: report staleness\r\n  if(params->stale_out)\r\n  {\r\n    params->stale_out[0] = artifact_is_stale;\r\n  }\r\n  \r\n  ProfEnd();\r\n  return artifact;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void\r\nac_async_tick(void)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: enable cancellation scanning\r\n  //\r\n  if(lane_idx() == 0)\r\n  {\r\n    semaphore_drop(ac_shared->cancel_thread_semaphore);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do eviction pass across all caches\r\n  //\r\n  for EachIndex(cache_slot_idx, ac_shared->cache_slots_count)\r\n  {\r\n    Stripe *cache_stripe = stripe_from_slot_idx(&ac_shared->cache_stripes, cache_slot_idx);\r\n    RWMutexScope(cache_stripe->rw_mutex, 0)\r\n    {\r\n      for EachNode(cache, AC_Cache, ac_shared->cache_slots[cache_slot_idx])\r\n      {\r\n        Rng1U64 slot_range = lane_range(cache->slots_count);\r\n        for EachInRange(slot_idx, slot_range)\r\n        {\r\n          AC_Slot *slot = &cache->slots[slot_idx];\r\n          Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx);\r\n          for(B32 write_mode = 0; write_mode <= 1; write_mode += 1)\r\n          {\r\n            B32 slot_has_work = 0;\r\n            RWMutexScope(stripe->rw_mutex, write_mode)\r\n            {\r\n              for(AC_Node *n = slot->first, *next = 0; n != 0; n = next)\r\n              {\r\n                next = n->next;\r\n                if(access_pt_is_expired(&n->access_pt, .time = n->evict_threshold_us) && ins_atomic_u64_eval(&n->working_count) == 0)\r\n                {\r\n                  slot_has_work = 1;\r\n                  if(!write_mode)\r\n                  {\r\n                    break;\r\n                  }\r\n                  else\r\n                  {\r\n                    DLLRemove(slot->first, slot->last, n);\r\n                    n->next = (AC_Node *)stripe->free;\r\n                    stripe->free = n;\r\n                    if(cache->destroy)\r\n                    {\r\n                      cache->destroy(n->val);\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            if(!slot_has_work)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather requests\r\n  //\r\n  typedef struct RequestBatchTask RequestBatchTask;\r\n  struct RequestBatchTask\r\n  {\r\n    AC_Request *wide;\r\n    U64 wide_count;\r\n    AC_Request *thin;\r\n    U64 thin_count;\r\n  };\r\n  RequestBatchTask *tasks = 0;\r\n  U64 tasks_count = 0;\r\n  if(lane_idx() == 0)\r\n  {\r\n    tasks_count = 2;\r\n    tasks = push_array(scratch.arena, RequestBatchTask, tasks_count);\r\n    for EachElement(task_idx, ac_shared->req_batches)\r\n    {\r\n      AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];\r\n      MutexScope(batch->mutex)\r\n      {\r\n        tasks[task_idx].wide_count = batch->wide_count;\r\n        tasks[task_idx].thin_count = batch->thin_count;\r\n        tasks[task_idx].wide = push_array(scratch.arena, AC_Request, tasks[task_idx].wide_count);\r\n        tasks[task_idx].thin = push_array(scratch.arena, AC_Request, tasks[task_idx].thin_count);\r\n        {\r\n          U64 idx = 0;\r\n          for EachNode(n, AC_RequestNode, batch->first_wide)\r\n          {\r\n            MemoryCopyStruct(&tasks[task_idx].wide[idx], &n->v);\r\n            tasks[task_idx].wide[idx].key = str8_copy(scratch.arena, tasks[task_idx].wide[idx].key);\r\n            idx += 1;\r\n          }\r\n        }\r\n        {\r\n          U64 idx = 0;\r\n          for EachNode(n, AC_RequestNode, batch->first_thin)\r\n          {\r\n            MemoryCopyStruct(&tasks[task_idx].thin[idx], &n->v);\r\n            tasks[task_idx].thin[idx].key = str8_copy(scratch.arena, tasks[task_idx].thin[idx].key);\r\n            idx += 1;\r\n          }\r\n        }\r\n        arena_clear(batch->arena);\r\n        batch->first_wide = batch->last_wide = batch->first_thin = batch->last_thin = 0;\r\n        batch->wide_count = batch->thin_count = 0;\r\n      }\r\n    }\r\n  }\r\n  lane_sync_u64(&tasks, 0);\r\n  lane_sync_u64(&tasks_count, 0);\r\n  lane_sync();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do all requests\r\n  //\r\n  for EachIndex(task_idx, tasks_count)\r\n  {\r\n    lane_sync();\r\n    RequestBatchTask *task = &tasks[task_idx];\r\n    \r\n    //- rjf: set up cancellation signal\r\n    U64 cancelled = 0;\r\n    U64 *cancelled_ptr = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      cancelled_ptr = &cancelled;\r\n    }\r\n    lane_sync_u64(&cancelled_ptr, 0);\r\n    \r\n    //- rjf: do all wide requests for this priority\r\n    U64 done_wide_count = 0;\r\n    ProfScope(\"wide requests (p%I64u)\", task_idx)\r\n    {\r\n      for EachIndex(idx, task->wide_count)\r\n      {\r\n        lane_sync();\r\n        AC_Request *r = &task->wide[idx];\r\n        \r\n        // rjf: any new higher priority tasks? -> cancel\r\n        if(lane_idx() == 0)\r\n        {\r\n          if(task_idx == 1 && idx != 0 && ins_atomic_u32_eval(&async_loop_again_high_priority))\r\n          {\r\n            ins_atomic_u64_eval_assign(cancelled_ptr, 1);\r\n          }\r\n        }\r\n        lane_sync();\r\n        \r\n        // rjf: cancelled? -> exit\r\n        if(ins_atomic_u32_eval(cancelled_ptr))\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: compute val\r\n        B32 retry = 0;\r\n        U64 gen = r->gen;\r\n        AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen);\r\n        \r\n        // rjf: retry? -> resubmit request\r\n        if(retry && lane_idx() == 0 && !ins_atomic_u32_eval(r->cancel_signal))\r\n        {\r\n          AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];\r\n          MutexScope(batch->mutex)\r\n          {\r\n            AC_RequestNode *n = push_array(batch->arena, AC_RequestNode, 1);\r\n            SLLQueuePush(batch->first_wide, batch->last_wide, n);\r\n            batch->wide_count += 1;\r\n            MemoryCopyStruct(&n->v, r);\r\n            n->v.key = str8_copy(batch->arena, n->v.key);\r\n          }\r\n          ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n        }\r\n        \r\n        // rjf: create function -> cache\r\n        AC_Cache *cache = 0;\r\n        if(!retry && lane_idx() == 0)\r\n        {\r\n          U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create));\r\n          U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;\r\n          Stripe *cache_stripe = stripe_from_slot_idx(&ac_shared->cache_stripes, cache_slot_idx);\r\n          RWMutexScope(cache_stripe->rw_mutex, 0)\r\n          {\r\n            for(AC_Cache *c = ac_shared->cache_slots[cache_slot_idx]; c != 0; c = c->next)\r\n            {\r\n              if(c->create == r->create)\r\n              {\r\n                cache = c;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: write value into cache\r\n        if(!retry && lane_idx() == 0)\r\n        {\r\n          U64 hash = u64_hash_from_str8(r->key);\r\n          U64 slot_idx = hash%cache->slots_count;\r\n          AC_Slot *slot = &cache->slots[slot_idx];\r\n          Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx);\r\n          RWMutexScope(stripe->rw_mutex, 1)\r\n          {\r\n            for(AC_Node *n = slot->first; n != 0; n = n->next)\r\n            {\r\n              if(str8_match(n->key, r->key, 0))\r\n              {\r\n                n->last_completed_gen = gen;\r\n                n->val = val;\r\n                ins_atomic_u64_dec_eval(&n->working_count);\r\n                ins_atomic_u64_inc_eval(&n->completion_count);\r\n              }\r\n            }\r\n          }\r\n          cond_var_broadcast(stripe->cv);\r\n        }\r\n        \r\n        // rjf: increment count\r\n        lane_sync();\r\n        done_wide_count += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: do all thin requests for this priority\r\n    U64 done_thin_count = 0;\r\n    ProfScope(\"thin requests (p%I64u)\", task_idx)\r\n    {\r\n      U64 req_take_counter = 0;\r\n      U64 *req_take_counter_ptr = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        req_take_counter_ptr = &req_take_counter;\r\n      }\r\n      lane_sync_u64(&req_take_counter_ptr, 0);\r\n      for(;;)\r\n      {\r\n        // rjf: any new higher priority tasks? -> cancel\r\n        if(task_idx == 1 && ins_atomic_u64_eval(req_take_counter_ptr) >= task->thin_count/2 &&\r\n           ins_atomic_u32_eval(&async_loop_again_high_priority))\r\n        {\r\n          ins_atomic_u64_eval_assign(cancelled_ptr, 1);\r\n        }\r\n        \r\n        // rjf: cancelled? -> exit\r\n        if(ins_atomic_u64_eval(cancelled_ptr))\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: take next task\r\n        U64 req_idx = ins_atomic_u64_inc_eval(req_take_counter_ptr) - 1;\r\n        if(req_idx >= task->thin_count) { break; }\r\n        AC_Request *r = &task->thin[req_idx];\r\n        \r\n        // rjf: push thin lane ctx\r\n        U64 thin_lane_ctx_broadcast_memory = 0;\r\n        LaneCtx thin_lane_ctx = {0, 1, {0}, &thin_lane_ctx_broadcast_memory};\r\n        LaneCtx lane_ctx_restore = lane_ctx(thin_lane_ctx);\r\n        \r\n        // rjf: compute val\r\n        B32 retry = 0;\r\n        U64 gen = r->gen;\r\n        AC_Artifact val = r->create(r->key, r->cancel_signal, &retry, &gen);\r\n        \r\n        // rjf: restore wide lane ctx\r\n        lane_ctx(lane_ctx_restore);\r\n        \r\n        // rjf: retry? -> resubmit request\r\n        if(retry && !ins_atomic_u32_eval(r->cancel_signal))\r\n        {\r\n          AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];\r\n          MutexScope(batch->mutex)\r\n          {\r\n            AC_RequestNode *n = push_array(batch->arena, AC_RequestNode, 1);\r\n            SLLQueuePush(batch->first_thin, batch->last_thin, n);\r\n            batch->thin_count += 1;\r\n            MemoryCopyStruct(&n->v, r);\r\n            n->v.key = str8_copy(batch->arena, n->v.key);\r\n          }\r\n          ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n        }\r\n        \r\n        // rjf: create function -> cache\r\n        AC_Cache *cache = 0;\r\n        if(!retry)\r\n        {\r\n          U64 cache_hash = u64_hash_from_str8(str8_struct(&r->create));\r\n          U64 cache_slot_idx = cache_hash%ac_shared->cache_slots_count;\r\n          Stripe *cache_stripe = stripe_from_slot_idx(&ac_shared->cache_stripes, cache_slot_idx);\r\n          RWMutexScope(cache_stripe->rw_mutex, 0)\r\n          {\r\n            for(AC_Cache *c = ac_shared->cache_slots[cache_slot_idx]; c != 0; c = c->next)\r\n            {\r\n              if(c->create == r->create)\r\n              {\r\n                cache = c;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: write value into cache\r\n        if(!retry)\r\n        {\r\n          U64 hash = u64_hash_from_str8(r->key);\r\n          U64 slot_idx = hash%cache->slots_count;\r\n          AC_Slot *slot = &cache->slots[slot_idx];\r\n          Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx);\r\n          RWMutexScope(stripe->rw_mutex, 1)\r\n          {\r\n            for(AC_Node *n = slot->first; n != 0; n = n->next)\r\n            {\r\n              if(str8_match(n->key, r->key, 0))\r\n              {\r\n                n->last_completed_gen = gen;\r\n                n->val = val;\r\n                ins_atomic_u64_dec_eval(&n->working_count);\r\n                ins_atomic_u64_inc_eval(&n->completion_count);\r\n              }\r\n            }\r\n          }\r\n          cond_var_broadcast(stripe->cv);\r\n        }\r\n      }\r\n      lane_sync();\r\n      done_thin_count = ins_atomic_u64_eval(req_take_counter_ptr);\r\n      lane_sync();\r\n    }\r\n    \r\n    //- rjf: cancelled early, unfinished tasks? -> defer to next tick\r\n    if(lane_idx() == 0 && task_idx > 0)\r\n    {\r\n      B32 need_another_try = (done_wide_count < task->wide_count || done_thin_count < task->thin_count);\r\n      AC_RequestBatch *batch = &ac_shared->req_batches[task_idx];\r\n      MutexScope(batch->mutex)\r\n      {\r\n        // rjf: push leftover wide tasks\r\n        for(U64 idx = done_wide_count; idx < task->wide_count; idx += 1)\r\n        {\r\n          AC_Request *r = &task->wide[idx];\r\n          AC_RequestNode *n = push_array(batch->arena, AC_RequestNode, 1);\r\n          SLLQueuePush(batch->first_wide, batch->last_wide, n);\r\n          batch->wide_count += 1;\r\n          MemoryCopyStruct(&n->v, r);\r\n          n->v.key = str8_copy(batch->arena, n->v.key);\r\n        }\r\n        \r\n        // rjf: push leftover thin tasks\r\n        for(U64 idx = done_thin_count; idx < task->thin_count; idx += 1)\r\n        {\r\n          AC_Request *r = &task->thin[idx];\r\n          AC_RequestNode *n = push_array(batch->arena, AC_RequestNode, 1);\r\n          SLLQueuePush(batch->first_thin, batch->last_thin, n);\r\n          batch->thin_count += 1;\r\n          MemoryCopyStruct(&n->v, r);\r\n          n->v.key = str8_copy(batch->arena, n->v.key);\r\n        }\r\n      }\r\n      if(need_another_try)\r\n      {\r\n        ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n      }\r\n    }\r\n    lane_sync();\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: disable cancellation scanning\r\n  //\r\n  if(lane_idx() == 0)\r\n  {\r\n    semaphore_take(ac_shared->cancel_thread_semaphore, max_U64);\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cancel Thread\r\n\r\ninternal void\r\nac_cancel_thread_entry_point(void *p)\r\n{\r\n  for(;;)\r\n  {\r\n    os_sleep_milliseconds(50);\r\n    semaphore_take(ac_shared->cancel_thread_semaphore, max_U64);\r\n    {\r\n      for EachIndex(cache_slot_idx, ac_shared->cache_slots_count)\r\n      {\r\n        Stripe *cache_stripe = stripe_from_slot_idx(&ac_shared->cache_stripes, cache_slot_idx);\r\n        RWMutexScope(cache_stripe->rw_mutex, 0)\r\n        {\r\n          for EachNode(cache, AC_Cache, ac_shared->cache_slots[cache_slot_idx])\r\n          {\r\n            Rng1U64 slot_range = lane_range(cache->slots_count);\r\n            for EachInRange(slot_idx, slot_range)\r\n            {\r\n              AC_Slot *slot = &cache->slots[slot_idx];\r\n              Stripe *stripe = stripe_from_slot_idx(&cache->stripes, slot_idx);\r\n              for(B32 write_mode = 0; write_mode <= 1; write_mode += 1)\r\n              {\r\n                B32 slot_has_work = 0;\r\n                RWMutexScope(stripe->rw_mutex, write_mode)\r\n                {\r\n                  for(AC_Node *n = slot->first, *next = 0; n != 0; n = next)\r\n                  {\r\n                    next = n->next;\r\n                    if(access_pt_is_expired(&n->access_pt, .time = n->evict_threshold_us) && ins_atomic_u64_eval(&n->working_count) > 0)\r\n                    {\r\n                      slot_has_work = 1;\r\n                      if(!write_mode)\r\n                      {\r\n                        break;\r\n                      }\r\n                      else\r\n                      {\r\n                        n->cancelled = 1;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n                if(!slot_has_work)\r\n                {\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    semaphore_drop(ac_shared->cancel_thread_semaphore);\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/artifact_cache/artifact_cache.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef ARTIFACT_CACHE_H\r\n#define ARTIFACT_CACHE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Handle Type\r\n\r\ntypedef struct AC_Artifact AC_Artifact;\r\nstruct AC_Artifact\r\n{\r\n  U64 u64[4];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Computation Function Types\r\n\r\ntypedef AC_Artifact AC_CreateFunctionType(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ntypedef void AC_DestroyFunctionType(AC_Artifact artifact);\r\n\r\ntypedef U32 AC_Flags;\r\ntypedef enum AC_FlagsEnum\r\n{\r\n  AC_Flag_WaitForFresh = (1<<0),\r\n  AC_Flag_HighPriority = (1<<1),\r\n  AC_Flag_Wide = (1<<2),\r\n}\r\nAC_FlagsEnum;\r\n\r\ntypedef struct AC_ArtifactParams AC_ArtifactParams;\r\nstruct AC_ArtifactParams\r\n{\r\n  AC_CreateFunctionType *create;\r\n  AC_DestroyFunctionType *destroy;\r\n  U64 slots_count;\r\n  U64 gen;\r\n  U64 evict_threshold_us;\r\n  B32 *stale_out;\r\n  AC_Flags flags;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Types\r\n\r\ntypedef struct AC_Request AC_Request;\r\nstruct AC_Request\r\n{\r\n  String8 key;\r\n  U64 gen;\r\n  B32 *cancel_signal;\r\n  AC_CreateFunctionType *create;\r\n};\r\n\r\ntypedef struct AC_RequestNode AC_RequestNode;\r\nstruct AC_RequestNode\r\n{\r\n  AC_RequestNode *next;\r\n  AC_Request v;\r\n};\r\n\r\ntypedef struct AC_Node AC_Node;\r\nstruct AC_Node\r\n{\r\n  AC_Node *next;\r\n  AC_Node *prev;\r\n  \r\n  // rjf: key/gen/value\r\n  String8 key;\r\n  U64 last_requested_gen;\r\n  U64 last_completed_gen;\r\n  AC_Artifact val;\r\n  \r\n  // rjf: metadata\r\n  AccessPt access_pt;\r\n  U64 working_count;\r\n  U64 completion_count;\r\n  U64 evict_threshold_us;\r\n  B32 cancelled;\r\n  U64 _unused_;\r\n};\r\n\r\ntypedef struct AC_Slot AC_Slot;\r\nstruct AC_Slot\r\n{\r\n  AC_Node *first;\r\n  AC_Node *last;\r\n};\r\n\r\ntypedef struct AC_Cache AC_Cache;\r\nstruct AC_Cache\r\n{\r\n  // rjf: link / key for cache-cache\r\n  AC_Cache *next;\r\n  AC_CreateFunctionType *create;\r\n  AC_DestroyFunctionType *destroy;\r\n  \r\n  // rjf: artifact cache\r\n  U64 slots_count;\r\n  AC_Slot *slots;\r\n  StripeArray stripes;\r\n};\r\n\r\ntypedef struct AC_RequestBatch AC_RequestBatch;\r\nstruct AC_RequestBatch\r\n{\r\n  Mutex mutex;\r\n  Arena *arena;\r\n  AC_RequestNode *first_wide;\r\n  AC_RequestNode *last_wide;\r\n  AC_RequestNode *first_thin;\r\n  AC_RequestNode *last_thin;\r\n  U64 wide_count;\r\n  U64 thin_count;\r\n};\r\n\r\ntypedef struct AC_Shared AC_Shared;\r\nstruct AC_Shared\r\n{\r\n  Arena *arena;\r\n  \r\n  // rjf: cache cache\r\n  U64 cache_slots_count;\r\n  AC_Cache **cache_slots;\r\n  StripeArray cache_stripes;\r\n  \r\n  // rjf: requests\r\n  AC_RequestBatch req_batches[2]; // 0: high priority, 1: low priority\r\n  \r\n  // rjf: cancel thread\r\n  Thread cancel_thread;\r\n  Semaphore cancel_thread_semaphore;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal AC_Shared *ac_shared = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Layer Initialization\r\n\r\ninternal void ac_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Lookups\r\n\r\ninternal AC_Artifact ac_artifact_from_key_(Access *access, String8 key, AC_ArtifactParams *params, U64 endt_us);\r\n#define ac_artifact_from_key(access, key, create_fn, destroy_fn, endt_us, ...) ac_artifact_from_key_((access), (key), &(AC_ArtifactParams){.create = (create_fn), .destroy = (destroy_fn), .evict_threshold_us = (2000000), __VA_ARGS__}, (endt_us))\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void ac_async_tick(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cancel Thread\r\n\r\ninternal void ac_cancel_thread_entry_point(void *p);\r\n\r\n#endif // ARTIFACT_CACHE_H\r\n"
  },
  {
    "path": "src/base/base_arena.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Arena Functions\r\n\r\n//- rjf: arena creation/destruction\r\n\r\ninternal Arena *\r\narena_alloc_(ArenaParams *params)\r\n{\r\n  // rjf: round up reserve/commit sizes\r\n  U64 reserve_size = params->reserve_size;\r\n  U64 commit_size = params->commit_size;\r\n  if(params->flags & ArenaFlag_LargePages)\r\n  {\r\n    reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size);\r\n    commit_size  = AlignPow2(commit_size,  os_get_system_info()->large_page_size);\r\n  }\r\n  else\r\n  {\r\n    reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size);\r\n    commit_size  = AlignPow2(commit_size,  os_get_system_info()->page_size);\r\n  }\r\n  \r\n  // rjf: reserve/commit initial block\r\n  void *base = params->optional_backing_buffer;\r\n  if(base == 0)\r\n  {\r\n    if(params->flags & ArenaFlag_LargePages)\r\n    {\r\n      base = os_reserve_large(reserve_size);\r\n      os_commit_large(base, commit_size);\r\n    }\r\n    else\r\n    {\r\n      base = os_reserve(reserve_size);\r\n      os_commit(base, commit_size);\r\n    }\r\n    raddbg_annotate_vaddr_range(base, reserve_size, \"arena %s:%i\", params->allocation_site_file, params->allocation_site_line);\r\n  }\r\n  \r\n  // rjf: panic on arena creation failure\r\n#if OS_FEATURE_GRAPHICAL\r\n  if(Unlikely(base == 0))\r\n  {\r\n    os_graphical_message(1, str8_lit(\"Fatal Allocation Failure\"), str8_lit(\"Unexpected memory allocation failure.\"));\r\n    os_abort(1);\r\n  }\r\n#endif\r\n  \r\n  // rjf: extract arena header & fill\r\n  Arena *arena = (Arena *)base;\r\n  arena->current = arena;\r\n  arena->flags = params->flags;\r\n  arena->cmt_size = params->commit_size;\r\n  arena->res_size = params->reserve_size;\r\n  arena->base_pos = 0;\r\n  arena->pos = ARENA_HEADER_SIZE;\r\n  arena->cmt = commit_size;\r\n  arena->res = reserve_size;\r\n  arena->allocation_site_file = params->allocation_site_file;\r\n  arena->allocation_site_line = params->allocation_site_line;\r\n#if ARENA_FREE_LIST\r\n  arena->free_last = 0;\r\n#endif\r\n  AsanPoisonMemoryRegion(base, commit_size);\r\n  AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE);\r\n  return arena;\r\n}\r\n\r\ninternal void\r\narena_release(Arena *arena)\r\n{\r\n  for(Arena *n = arena->current, *prev = 0; n != 0; n = prev)\r\n  {\r\n    prev = n->prev;\r\n    os_release(n, n->res);\r\n  }\r\n}\r\n\r\n//- rjf: arena push/pop core functions\r\n\r\ninternal void *\r\narena_push(Arena *arena, U64 size, U64 align, B32 zero)\r\n{\r\n  Arena *current = arena->current;\r\n  U64 pos_pre = AlignPow2(current->pos, align);\r\n  U64 pos_pst = pos_pre + size;\r\n  \r\n  // rjf: chain, if needed\r\n  if(current->res < pos_pst && !(arena->flags & ArenaFlag_NoChain))\r\n  {\r\n    Arena *new_block = 0;\r\n    \r\n#if ARENA_FREE_LIST\r\n    {\r\n      Arena *prev_block;\r\n      for(new_block = arena->free_last, prev_block = 0; new_block != 0; prev_block = new_block, new_block = new_block->prev)\r\n      {\r\n        if(new_block->res >= AlignPow2(new_block->pos, align) + size)\r\n        {\r\n          if(prev_block)\r\n          {\r\n            prev_block->prev = new_block->prev;\r\n          }\r\n          else\r\n          {\r\n            arena->free_last = new_block->prev;\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n#endif\r\n    \r\n    if(new_block == 0)\r\n    {\r\n      U64 res_size = current->res_size;\r\n      U64 cmt_size = current->cmt_size;\r\n      if(size + ARENA_HEADER_SIZE > res_size)\r\n      {\r\n        res_size = AlignPow2(size + ARENA_HEADER_SIZE, align);\r\n        cmt_size = AlignPow2(size + ARENA_HEADER_SIZE, align);\r\n      }\r\n      new_block = arena_alloc(.reserve_size = res_size,\r\n                              .commit_size  = cmt_size,\r\n                              .flags        = current->flags,\r\n                              .allocation_site_file = current->allocation_site_file,\r\n                              .allocation_site_line = current->allocation_site_line);\r\n    }\r\n    \r\n    new_block->base_pos = current->base_pos + current->res;\r\n    SLLStackPush_N(arena->current, new_block, prev);\r\n    \r\n    current = new_block;\r\n    pos_pre = AlignPow2(current->pos, align);\r\n    pos_pst = pos_pre + size;\r\n  }\r\n  \r\n  // rjf: compute the size we need to zero\r\n  U64 size_to_zero = 0;\r\n  if(zero)\r\n  {\r\n    size_to_zero = Min(current->cmt, pos_pst) - pos_pre;\r\n  }\r\n  \r\n  // rjf: commit new pages, if needed\r\n  if(current->cmt < pos_pst)\r\n  {\r\n    U64 cmt_pst_aligned = pos_pst + current->cmt_size-1;\r\n    cmt_pst_aligned -= cmt_pst_aligned%current->cmt_size;\r\n    U64 cmt_pst_clamped = ClampTop(cmt_pst_aligned, current->res);\r\n    U64 cmt_size = cmt_pst_clamped - current->cmt;\r\n    U8 *cmt_ptr = (U8 *)current + current->cmt;\r\n    if(current->flags & ArenaFlag_LargePages)\r\n    {\r\n      os_commit_large(cmt_ptr, cmt_size);\r\n    }\r\n    else\r\n    {\r\n      os_commit(cmt_ptr, cmt_size);\r\n    }\r\n    current->cmt = cmt_pst_clamped;\r\n  }\r\n  \r\n  // rjf: push onto current block\r\n  void *result = 0;\r\n  if(current->cmt >= pos_pst)\r\n  {\r\n    result = (U8 *)current+pos_pre;\r\n    current->pos = pos_pst;\r\n    AsanUnpoisonMemoryRegion(result, size);\r\n    if(size_to_zero != 0)\r\n    {\r\n      MemoryZero(result, size_to_zero);\r\n    }\r\n  }\r\n  \r\n  // rjf: panic on failure\r\n#if OS_FEATURE_GRAPHICAL\r\n  if(Unlikely(result == 0))\r\n  {\r\n    os_graphical_message(1, str8_lit(\"Fatal Allocation Failure\"), str8_lit(\"Unexpected memory allocation failure.\"));\r\n    os_abort(1);\r\n  }\r\n#endif\r\n  \r\n  return result;\r\n}\r\n\r\ninternal U64\r\narena_pos(Arena *arena)\r\n{\r\n  Arena *current = arena->current;\r\n  U64 pos = current->base_pos + current->pos;\r\n  return pos;\r\n}\r\n\r\ninternal void\r\narena_pop_to(Arena *arena, U64 pos)\r\n{\r\n  U64 big_pos = ClampBot(ARENA_HEADER_SIZE, pos);\r\n  Arena *current = arena->current;\r\n  \r\n#if ARENA_FREE_LIST\r\n  for(Arena *prev = 0; current->base_pos >= big_pos; current = prev)\r\n  {\r\n    prev = current->prev;\r\n    current->pos = ARENA_HEADER_SIZE;\r\n    SLLStackPush_N(arena->free_last, current, prev);\r\n    AsanPoisonMemoryRegion((U8*)current + ARENA_HEADER_SIZE, current->res - ARENA_HEADER_SIZE);\r\n  }\r\n#else\r\n  for(Arena *prev = 0; current->base_pos >= big_pos; current = prev)\r\n  {\r\n    prev = current->prev;\r\n    os_release(current, current->res);\r\n  }\r\n#endif\r\n  arena->current = current;\r\n  U64 new_pos = big_pos - current->base_pos;\r\n  AssertAlways(new_pos <= current->pos);\r\n  AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos));\r\n  current->pos = new_pos;\r\n}\r\n\r\n//- rjf: arena push/pop helpers\r\n\r\ninternal void\r\narena_clear(Arena *arena)\r\n{\r\n  arena_pop_to(arena, 0);\r\n}\r\n\r\ninternal void\r\narena_pop(Arena *arena, U64 amt)\r\n{\r\n  U64 pos_old = arena_pos(arena);\r\n  U64 pos_new = pos_old;\r\n  if(amt < pos_old)\r\n  {\r\n    pos_new = pos_old - amt;\r\n  }\r\n  arena_pop_to(arena, pos_new);\r\n}\r\n\r\n//- rjf: temporary arena scopes\r\n\r\ninternal Temp\r\ntemp_begin(Arena *arena)\r\n{\r\n  U64 pos = arena_pos(arena);\r\n  Temp temp = {arena, pos};\r\n  return temp;\r\n}\r\n\r\ninternal void\r\ntemp_end(Temp temp)\r\n{\r\n  arena_pop_to(temp.arena, temp.pos);\r\n}\r\n"
  },
  {
    "path": "src/base/base_arena.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_ARENA_H\r\n#define BASE_ARENA_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Arena Types\r\n\r\n#define ARENA_HEADER_SIZE 128\r\n\r\ntypedef U64 ArenaFlags;\r\nenum\r\n{\r\n  ArenaFlag_NoChain    = (1<<0),\r\n  ArenaFlag_LargePages = (1<<1),\r\n};\r\n\r\ntypedef struct ArenaParams ArenaParams;\r\nstruct ArenaParams\r\n{\r\n  ArenaFlags flags;\r\n  U64 reserve_size;\r\n  U64 commit_size;\r\n  void *optional_backing_buffer;\r\n  char *allocation_site_file;\r\n  int allocation_site_line;\r\n};\r\n\r\ntypedef struct Arena Arena;\r\nstruct Arena\r\n{\r\n  Arena *prev;    // previous arena in chain\r\n  Arena *current; // current arena in chain\r\n  ArenaFlags flags;\r\n  U64 cmt_size;\r\n  U64 res_size;\r\n  U64 base_pos;\r\n  U64 pos;\r\n  U64 cmt;\r\n  U64 res;\r\n  char *allocation_site_file;\r\n  int allocation_site_line;\r\n#if ARENA_FREE_LIST\r\n  Arena *free_last;\r\n#endif\r\n};\r\nStaticAssert(sizeof(Arena) <= ARENA_HEADER_SIZE, arena_header_size_check);\r\n\r\ntypedef struct Temp Temp;\r\nstruct Temp\r\n{\r\n  Arena *arena;\r\n  U64 pos;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Arena Functions\r\n\r\nglobal U64 arena_default_reserve_size = MB(64);\r\nglobal U64 arena_default_commit_size  = KB(64);\r\nglobal ArenaFlags arena_default_flags = 0;\r\n\r\n//- rjf: arena creation/destruction\r\ninternal Arena *arena_alloc_(ArenaParams *params);\r\n#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = arena_default_reserve_size, .commit_size = arena_default_commit_size, .flags = arena_default_flags, .allocation_site_file = __FILE__, .allocation_site_line = __LINE__, __VA_ARGS__})\r\ninternal void arena_release(Arena *arena);\r\n\r\n//- rjf: arena push/pop/pos core functions\r\ninternal void *arena_push(Arena *arena, U64 size, U64 align, B32 zero);\r\ninternal U64   arena_pos(Arena *arena);\r\ninternal void  arena_pop_to(Arena *arena, U64 pos);\r\n\r\n//- rjf: arena push/pop helpers\r\ninternal void arena_clear(Arena *arena);\r\ninternal void arena_pop(Arena *arena, U64 amt);\r\n\r\n//- rjf: temporary arena scopes\r\ninternal Temp temp_begin(Arena *arena);\r\ninternal void temp_end(Temp temp);\r\n\r\n//- rjf: push helper macros\r\n#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align), (0))\r\n#define push_array_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align), (1))\r\n#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, AlignOf(T)))\r\n#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, AlignOf(T)))\r\n\r\n#endif // BASE_ARENA_H\r\n"
  },
  {
    "path": "src/base/base_command_line.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Line Parsing Functions\r\n\r\ninternal CmdLineOpt **\r\ncmd_line_slot_from_string(CmdLine *cmd_line, String8 string)\r\n{\r\n  CmdLineOpt **slot = 0;\r\n  if(cmd_line->option_table_size != 0)\r\n  {\r\n    U64 hash = u64_hash_from_str8(string);\r\n    U64 bucket = hash % cmd_line->option_table_size;\r\n    slot = &cmd_line->option_table[bucket];\r\n  }\r\n  return slot;\r\n}\r\n\r\ninternal CmdLineOpt *\r\ncmd_line_opt_from_slot(CmdLineOpt **slot, String8 string)\r\n{\r\n  CmdLineOpt *result = 0;\r\n  for(CmdLineOpt *var = *slot; var; var = var->hash_next)\r\n  {\r\n    if(str8_match(string, var->string, 0))\r\n    {\r\n      result = var;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ncmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var)\r\n{\r\n  SLLQueuePush(list->first, list->last, var);\r\n  list->count += 1;\r\n}\r\n\r\ninternal CmdLineOpt *\r\ncmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values)\r\n{\r\n  CmdLineOpt *var = 0;\r\n  CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string);\r\n  CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string);\r\n  if(existing_var != 0)\r\n  {\r\n    var = existing_var;\r\n  }\r\n  else\r\n  {\r\n    var = push_array(arena, CmdLineOpt, 1);\r\n    var->hash_next = *slot;\r\n    var->hash = u64_hash_from_str8(string);\r\n    var->string = push_str8_copy(arena, string);\r\n    var->value_strings = values;\r\n    StringJoin join = {0};\r\n    join.pre = str8_lit(\"\");\r\n    join.sep = str8_lit(\",\");\r\n    join.post = str8_lit(\"\");\r\n    var->value_string = str8_list_join(arena, &var->value_strings, &join);\r\n    *slot = var;\r\n    cmd_line_push_opt(&cmd_line->options, var);\r\n  }\r\n  return var;\r\n}\r\n\r\ninternal CmdLine\r\ncmd_line_from_string_list(Arena *arena, String8List command_line)\r\n{\r\n  CmdLine parsed = {0};\r\n  parsed.exe_name = command_line.first->string;\r\n  parsed.option_table_size = 64;\r\n  parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size);\r\n  \r\n  //- rjf: parse options / inputs\r\n  B32 after_passthrough_option = 0;\r\n  B32 first_passthrough = 1;\r\n  for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next)\r\n  {\r\n    next = node->next;\r\n    \r\n    //- rjf: look at --, -, or / (only on Windows) at the start of an\r\n    // argument to determine if it's a flag option. all arguments after a\r\n    // single \"--\" (with no trailing string on the command line will be\r\n    // considered as passthrough input strings.\r\n    B32 is_option = 0;\r\n    String8 option_name = node->string;\r\n    if(!after_passthrough_option)\r\n    {\r\n      is_option = 1;\r\n      if(str8_match(node->string, str8_lit(\"--\"), 0))\r\n      {\r\n        after_passthrough_option = 1;\r\n        is_option = 0;\r\n      }\r\n      else if(str8_match(str8_prefix(node->string, 2), str8_lit(\"--\"), 0))\r\n      {\r\n        option_name = str8_skip(option_name, 2);\r\n      }\r\n      else if(str8_match(str8_prefix(node->string, 1), str8_lit(\"-\"), 0))\r\n      {\r\n        option_name = str8_skip(option_name, 1);\r\n      }\r\n      else if(OperatingSystem_CURRENT == OperatingSystem_Windows &&\r\n              str8_match(str8_prefix(node->string, 1), str8_lit(\"/\"), 0))\r\n      {\r\n        option_name = str8_skip(option_name, 1);\r\n      }\r\n      else\r\n      {\r\n        is_option = 0;\r\n      }\r\n    }\r\n    \r\n    //- rjf: string is an option\r\n    if(is_option)\r\n    {\r\n      // rjf: unpack option prefix\r\n      B32 has_values = 0;\r\n      U64 value_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(\":\"), 0);\r\n      U64 value_signifier_position2 = str8_find_needle(option_name, 0, str8_lit(\"=\"), 0);\r\n      U64 value_signifier_position = Min(value_signifier_position1, value_signifier_position2);\r\n      String8 value_portion_this_string = str8_skip(option_name, value_signifier_position+1);\r\n      if(value_signifier_position < option_name.size)\r\n      {\r\n        has_values = 1;\r\n      }\r\n      option_name = str8_prefix(option_name, value_signifier_position);\r\n      \r\n      // rjf: parse option's values\r\n      String8List values = {0};\r\n      if(has_values)\r\n      {\r\n        for(String8Node *n = node; n; n = n->next)\r\n        {\r\n          next = n->next;\r\n          String8 string = n->string;\r\n          if(n == node)\r\n          {\r\n            string = value_portion_this_string;\r\n          }\r\n          U8 splits[] = { ',' };\r\n          String8List values_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0);\r\n          for(String8Node *sub_val = values_in_this_string.first; sub_val; sub_val = sub_val->next)\r\n          {\r\n            str8_list_push(arena, &values, sub_val->string);\r\n          }\r\n          if(!str8_match(str8_postfix(n->string, 1), str8_lit(\",\"), 0) &&\r\n             (n != node || value_portion_this_string.size != 0))\r\n          {\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: store\r\n      cmd_line_insert_opt(arena, &parsed, option_name, values);\r\n    }\r\n    \r\n    //- rjf: default path - treat as a passthrough input\r\n    else if(!str8_match(node->string, str8_lit(\"--\"), 0) || !first_passthrough)\r\n    {\r\n      str8_list_push(arena, &parsed.inputs, node->string);\r\n      first_passthrough = 0;\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill argc/argv\r\n  parsed.argc = command_line.node_count;\r\n  parsed.argv = push_array(arena, char *, parsed.argc);\r\n  {\r\n    U64 idx = 0;\r\n    for(String8Node *n = command_line.first; n != 0; n = n->next)\r\n    {\r\n      parsed.argv[idx] = (char *)push_str8_copy(arena, n->string).str;\r\n      idx += 1;\r\n    }\r\n  }\r\n  \r\n  return parsed;\r\n}\r\n\r\ninternal CmdLineOpt *\r\ncmd_line_opt_from_string(CmdLine *cmd_line, String8 name)\r\n{\r\n  return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name);\r\n}\r\n\r\ninternal String8List \r\ncmd_line_strings(CmdLine *cmd_line, String8 name)\r\n{\r\n  String8List result = {0};\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  if(var != 0)\r\n  {\r\n    result = var->value_strings;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8     \r\ncmd_line_string(CmdLine *cmd_line, String8 name)\r\n{\r\n  String8 result = {0};\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  if(var != 0)\r\n  {\r\n    result = var->value_string;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ncmd_line_has_flag(CmdLine *cmd_line, String8 name)\r\n{\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  return (var != 0);\r\n}\r\n\r\ninternal B32\r\ncmd_line_has_argument(CmdLine *cmd_line, String8 name)\r\n{\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  return (var != 0 && var->value_strings.node_count > 0);\r\n}\r\n"
  },
  {
    "path": "src/base/base_command_line.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_COMMAND_LINE_H\r\n#define BASE_COMMAND_LINE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Parsed Command Line Types\r\n\r\ntypedef struct CmdLineOpt CmdLineOpt;\r\nstruct CmdLineOpt\r\n{\r\n  CmdLineOpt *next;\r\n  CmdLineOpt *hash_next;\r\n  U64 hash;\r\n  String8 string;\r\n  String8List value_strings;\r\n  String8 value_string;\r\n};\r\n\r\ntypedef struct CmdLineOptList CmdLineOptList;\r\nstruct CmdLineOptList\r\n{\r\n  U64 count;\r\n  CmdLineOpt *first;\r\n  CmdLineOpt *last;\r\n};\r\n\r\ntypedef struct CmdLine CmdLine;\r\nstruct CmdLine\r\n{\r\n  String8 exe_name;\r\n  CmdLineOptList options;\r\n  String8List inputs;\r\n  U64 option_table_size;\r\n  CmdLineOpt **option_table;\r\n  U64 argc;\r\n  char **argv;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Line Parsing Functions\r\n\r\ninternal CmdLineOpt**     cmd_line_slot_from_string(CmdLine *cmd_line, String8 string);\r\ninternal CmdLineOpt*      cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string);\r\ninternal void             cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var);\r\ninternal CmdLineOpt*      cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values);\r\ninternal CmdLine          cmd_line_from_string_list(Arena *arena, String8List arguments);\r\ninternal CmdLineOpt*      cmd_line_opt_from_string(CmdLine *cmd_line, String8 name);\r\ninternal String8List      cmd_line_strings(CmdLine *cmd_line, String8 name);\r\ninternal String8          cmd_line_string(CmdLine *cmd_line, String8 name);\r\ninternal B32              cmd_line_has_flag(CmdLine *cmd_line, String8 name);\r\ninternal B32              cmd_line_has_argument(CmdLine *cmd_line, String8 name);\r\n\r\n#endif // BASE_COMMAND_LINE_H\r\n"
  },
  {
    "path": "src/base/base_context_cracking.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_CONTEXT_CRACKING_H\r\n#define BASE_CONTEXT_CRACKING_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Clang OS/Arch Cracking\r\n\r\n#if defined(__clang__)\r\n\r\n# define COMPILER_CLANG 1\r\n\r\n# if defined(_WIN32)\r\n#  define OS_WINDOWS 1\r\n# elif defined(__gnu_linux__) || defined(__linux__)\r\n#  define OS_LINUX 1\r\n# elif defined(__APPLE__) && defined(__MACH__)\r\n#  define OS_MAC 1\r\n# else\r\n#  error This compiler/OS combo is not supported.\r\n# endif\r\n\r\n# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)\r\n#  define ARCH_X64 1\r\n# elif defined(i386) || defined(__i386) || defined(__i386__)\r\n#  define ARCH_X86 1\r\n# elif defined(__aarch64__)\r\n#  define ARCH_ARM64 1\r\n# elif defined(__arm__)\r\n#  define ARCH_ARM32 1\r\n# else\r\n#  error Architecture not supported.\r\n# endif\r\n\r\n////////////////////////////////\r\n//~ rjf: MSVC OS/Arch Cracking\r\n\r\n#elif defined(_MSC_VER)\r\n\r\n# define COMPILER_MSVC 1\r\n\r\n# if _MSC_VER >= 1920\r\n#  define COMPILER_MSVC_YEAR 2019\r\n# elif _MSC_VER >= 1910\r\n#  define COMPILER_MSVC_YEAR 2017\r\n# elif _MSC_VER >= 1900\r\n#  define COMPILER_MSVC_YEAR 2015\r\n# elif _MSC_VER >= 1800\r\n#  define COMPILER_MSVC_YEAR 2013\r\n# elif _MSC_VER >= 1700\r\n#  define COMPILER_MSVC_YEAR 2012\r\n# elif _MSC_VER >= 1600\r\n#  define COMPILER_MSVC_YEAR 2010\r\n# elif _MSC_VER >= 1500\r\n#  define COMPILER_MSVC_YEAR 2008\r\n# elif _MSC_VER >= 1400\r\n#  define COMPILER_MSVC_YEAR 2005\r\n# else\r\n#  define COMPILER_MSVC_YEAR 0\r\n# endif\r\n\r\n# if defined(_WIN32)\r\n#  define OS_WINDOWS 1\r\n# else\r\n#  error This compiler/OS combo is not supported.\r\n# endif\r\n\r\n# if defined(_M_AMD64)\r\n#  define ARCH_X64 1\r\n# elif defined(_M_IX86)\r\n#  define ARCH_X86 1\r\n# elif defined(_M_ARM64)\r\n#  define ARCH_ARM64 1\r\n# elif defined(_M_ARM)\r\n#  define ARCH_ARM32 1\r\n# else\r\n#  error Architecture not supported.\r\n# endif\r\n\r\n////////////////////////////////\r\n//~ rjf: GCC OS/Arch Cracking\r\n\r\n#elif defined(__GNUC__) || defined(__GNUG__)\r\n\r\n# define COMPILER_GCC 1\r\n\r\n# if defined(__gnu_linux__) || defined(__linux__)\r\n#  define OS_LINUX 1\r\n# else\r\n#  error This compiler/OS combo is not supported.\r\n# endif\r\n\r\n# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)\r\n#  define ARCH_X64 1\r\n# elif defined(i386) || defined(__i386) || defined(__i386__)\r\n#  define ARCH_X86 1\r\n# elif defined(__aarch64__)\r\n#  define ARCH_ARM64 1\r\n# elif defined(__arm__)\r\n#  define ARCH_ARM32 1\r\n# else\r\n#  error Architecture not supported.\r\n# endif\r\n\r\n#else\r\n# error Compiler not supported.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Arch Cracking\r\n\r\n#if defined(ARCH_X64)\r\n# define ARCH_64BIT 1\r\n#elif defined(ARCH_X86)\r\n# define ARCH_32BIT 1\r\n#endif\r\n\r\n#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86\r\n# define ARCH_LITTLE_ENDIAN 1\r\n#else\r\n# error Endianness of this architecture not understood by context cracker.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Language Cracking\r\n\r\n#if defined(__cplusplus)\r\n# define LANG_CPP 1\r\n#else\r\n# define LANG_C 1\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Build Option Cracking\r\n\r\n#if !defined(BUILD_DEBUG)\r\n# define BUILD_DEBUG 1\r\n#endif\r\n\r\n#if !defined(BUILD_SUPPLEMENTARY_UNIT)\r\n# define BUILD_SUPPLEMENTARY_UNIT 0\r\n#endif\r\n\r\n#if !defined(BUILD_ENTRY_DEFINING_UNIT)\r\n# define BUILD_ENTRY_DEFINING_UNIT 1\r\n#endif\r\n\r\n#if !defined(BUILD_CONSOLE_INTERFACE)\r\n# define BUILD_CONSOLE_INTERFACE 0\r\n#endif\r\n\r\n#if !defined(BUILD_VERSION_MAJOR)\r\n# define BUILD_VERSION_MAJOR 0\r\n#endif\r\n\r\n#if !defined(BUILD_VERSION_MINOR)\r\n# define BUILD_VERSION_MINOR 9\r\n#endif\r\n\r\n#if !defined(BUILD_VERSION_PATCH)\r\n# define BUILD_VERSION_PATCH 25\r\n#endif\r\n\r\n#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) \".\" Stringify(BUILD_VERSION_MINOR) \".\" Stringify(BUILD_VERSION_PATCH)\r\n#if BUILD_DEBUG\r\n# define BUILD_MODE_STRING_LITERAL_APPEND \" [Debug]\"\r\n#else\r\n# define BUILD_MODE_STRING_LITERAL_APPEND \"\"\r\n#endif\r\n#if defined(BUILD_GIT_HASH)\r\n# define BUILD_GIT_HASH_STRING_LITERAL_APPEND \" [\" BUILD_GIT_HASH \"]\"\r\n#else\r\n# define BUILD_GIT_HASH_STRING_LITERAL_APPEND \"\"\r\n#endif\r\n\r\n#if !defined(BUILD_TITLE)\r\n# define BUILD_TITLE \"Untitled\"\r\n#endif\r\n\r\n#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL)\r\n# define BUILD_RELEASE_PHASE_STRING_LITERAL \"ALPHA\"\r\n#endif\r\n\r\n#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL)\r\n# define BUILD_ISSUES_LINK_STRING_LITERAL \"https://github.com/EpicGamesExt/raddebugger/issues\"\r\n#endif\r\n\r\n#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE \" (\" BUILD_VERSION_STRING_LITERAL \" \" BUILD_RELEASE_PHASE_STRING_LITERAL \") - \" __DATE__ \"\" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND\r\n\r\n////////////////////////////////\r\n//~ rjf: Zero All Undefined Options\r\n\r\n#if !defined(ARCH_32BIT)\r\n# define ARCH_32BIT 0\r\n#endif\r\n#if !defined(ARCH_64BIT)\r\n# define ARCH_64BIT 0\r\n#endif\r\n#if !defined(ARCH_X64)\r\n# define ARCH_X64 0\r\n#endif\r\n#if !defined(ARCH_X86)\r\n# define ARCH_X86 0\r\n#endif\r\n#if !defined(ARCH_ARM64)\r\n# define ARCH_ARM64 0\r\n#endif\r\n#if !defined(ARCH_ARM32)\r\n# define ARCH_ARM32 0\r\n#endif\r\n#if !defined(COMPILER_MSVC)\r\n# define COMPILER_MSVC 0\r\n#endif\r\n#if !defined(COMPILER_GCC)\r\n# define COMPILER_GCC 0\r\n#endif\r\n#if !defined(COMPILER_CLANG)\r\n# define COMPILER_CLANG 0\r\n#endif\r\n#if !defined(OS_WINDOWS)\r\n# define OS_WINDOWS 0\r\n#endif\r\n#if !defined(OS_LINUX)\r\n# define OS_LINUX 0\r\n#endif\r\n#if !defined(OS_MAC)\r\n# define OS_MAC 0\r\n#endif\r\n#if !defined(LANG_CPP)\r\n# define LANG_CPP 0\r\n#endif\r\n#if !defined(LANG_C)\r\n# define LANG_C 0\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Unsupported Errors\r\n\r\n#if ARCH_X86\r\n# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported.\r\n#endif\r\n#if !ARCH_X64\r\n# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported.\r\n#endif\r\n\r\n#endif // BASE_CONTEXT_CRACKING_H\r\n"
  },
  {
    "path": "src/base/base_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Safe Casts\r\n\r\ninternal U16\r\nsafe_cast_u16(U32 x)\r\n{\r\n  AssertAlways(x <= max_U16);\r\n  U16 result = (U16)x;\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nsafe_cast_u32(U64 x)\r\n{\r\n  AssertAlways(x <= max_U32);\r\n  U32 result = (U32)x;\r\n  return result;\r\n}\r\n\r\ninternal S32\r\nsafe_cast_s32(S64 x)\r\n{\r\n  AssertAlways(x <= max_S32);\r\n  S32 result = (S32)x;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Large Base Type Functions\r\n\r\ninternal U128\r\nu128_zero(void)\r\n{\r\n  U128 v = {0};\r\n  return v;\r\n}\r\n\r\ninternal U128\r\nu128_make(U64 v0, U64 v1)\r\n{\r\n  U128 v = { .u64 = { v0, v1 }};\r\n  return v;\r\n}\r\n\r\ninternal B32\r\nu128_match(U128 a, U128 b)\r\n{\r\n  return MemoryMatchStruct(&a, &b);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Bit Patterns\r\n\r\ninternal U32\r\nu32_from_u64_saturate(U64 x){\r\n  U32 x32 = (x > max_U32)?max_U32:(U32)x;\r\n  return(x32);\r\n}\r\n\r\ninternal U64\r\nu64_up_to_pow2(U64 x){\r\n  if (x == 0){\r\n    x = 1;\r\n  }\r\n  else{\r\n    x -= 1;\r\n    x |= (x >> 1);\r\n    x |= (x >> 2);\r\n    x |= (x >> 4);\r\n    x |= (x >> 8);\r\n    x |= (x >> 16);\r\n    x |= (x >> 32);\r\n    x += 1;\r\n  }\r\n  return(x);\r\n}\r\n\r\ninternal S32\r\nextend_sign32(U32 x, U32 size){\r\n  U32 high_bit = size * 8;\r\n  U32 shift = 32 - high_bit;\r\n  S32 result = ((S32)x << shift) >> shift;\r\n  return result;\r\n}\r\n\r\ninternal S64\r\nextend_sign64(U64 x, U64 size){\r\n  U64 high_bit = size * 8;\r\n  U64 shift = 64 - high_bit;\r\n  S64 result = ((S64)x << shift) >> shift;\r\n  return result;\r\n}\r\n\r\ninternal F32\r\ninf32(void){\r\n  union { U32 u; F32 f; } x;\r\n  x.u = exponent32;\r\n  return(x.f);\r\n}\r\n\r\ninternal F32\r\nneg_inf32(void){\r\n  union { U32 u; F32 f; } x;\r\n  x.u = sign32 | exponent32;\r\n  return(x.f);\r\n}\r\n\r\ninternal U16\r\nbswap_u16(U16 x)\r\n{\r\n  U16 result = (((x & 0xFF00) >> 8) |\r\n                ((x & 0x00FF) << 8));\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nbswap_u32(U32 x)\r\n{\r\n  U32 result = (((x & 0xFF000000) >> 24) |\r\n                ((x & 0x00FF0000) >> 8)  |\r\n                ((x & 0x0000FF00) << 8)  |\r\n                ((x & 0x000000FF) << 24));\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nbswap_u64(U64 x)\r\n{\r\n  // TODO(nick): naive bswap, replace with something that is faster like an intrinsic\r\n  U64 result = (((x & 0xFF00000000000000ULL) >> 56) |\r\n                ((x & 0x00FF000000000000ULL) >> 40) |\r\n                ((x & 0x0000FF0000000000ULL) >> 24) |\r\n                ((x & 0x000000FF00000000ULL) >> 8)  |\r\n                ((x & 0x00000000FF000000ULL) << 8)  |\r\n                ((x & 0x0000000000FF0000ULL) << 24) |\r\n                ((x & 0x000000000000FF00ULL) << 40) |\r\n                ((x & 0x00000000000000FFULL) << 56));\r\n  return result;\r\n}\r\n\r\n#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS)\r\n\r\ninternal U64\r\ncount_bits_set32(U32 val)\r\n{\r\n  return __popcnt(val);\r\n}\r\n\r\ninternal U64\r\ncount_bits_set64(U64 val)\r\n{\r\n  return __popcnt64(val);\r\n}\r\n\r\ninternal U64\r\nctz32(U32 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanForward(&idx, mask);\r\n  return idx;\r\n}\r\n\r\ninternal U64\r\nctz64(U64 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanForward64(&idx, mask);\r\n  return idx;\r\n}\r\n\r\ninternal U64\r\nclz32(U32 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanReverse(&idx, mask);\r\n  return 31 - idx;\r\n}\r\n\r\ninternal U64\r\nclz64(U64 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanReverse64(&idx, mask);\r\n  return 63 - idx;\r\n}\r\n\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n\r\ninternal U64\r\ncount_bits_set32(U32 val)\r\n{\r\n  return __builtin_popcount(val);\r\n}\r\n\r\ninternal U64\r\ncount_bits_set64(U64 val)\r\n{\r\n  return __builtin_popcountll(val);\r\n}\r\n\r\ninternal U64\r\nctz32(U32 val)\r\n{\r\n  return __builtin_ctz(val);\r\n}\r\n\r\ninternal U64\r\nclz32(U32 val)\r\n{\r\n  return __builtin_clz(val);\r\n}\r\n\r\ninternal U64\r\nctz64(U64 val)\r\n{\r\n  return __builtin_ctzll(val);\r\n}\r\n\r\ninternal U64\r\nclz64(U64 val)\r\n{\r\n  return __builtin_clzll(val);\r\n}\r\n\r\n#else\r\n# error \"Bit intrinsic functions not defined for this compiler.\"\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> Sign\r\n\r\ninternal S32\r\nsign_from_side_S32(Side side){\r\n  return((side == Side_Min)?-1:1);\r\n}\r\n\r\ninternal F32\r\nsign_from_side_F32(Side side){\r\n  return((side == Side_Min)?-1.f:1.f);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Memory Functions\r\n\r\ninternal B32\r\nmemory_is_zero(void *ptr, U64 size)\r\n{\r\n  B32 result = 1;\r\n  \r\n  // break down size\r\n  U64 extra = (size&0x7);\r\n  U64 count8 = (size >> 3);\r\n  \r\n  // check with 8-byte stride\r\n  U64 *p64 = (U64*)ptr;\r\n  if(result)\r\n  {\r\n    for(U64 i = 0; i < count8; i += 1, p64 += 1)\r\n    {\r\n      if(*p64 != 0)\r\n      {\r\n        result = 0;\r\n        goto done;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // check extra\r\n  if(result)\r\n  {\r\n    U8 *p8 = (U8*)p64;\r\n    for(U64 i = 0; i < extra; i += 1, p8 += 1)\r\n    {\r\n      if(*p8 != 0)\r\n      {\r\n        result = 0;\r\n        goto done;\r\n      }\r\n    }\r\n  }\r\n  \r\n  done:;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text 2D Coordinate/Range Functions\r\n\r\ninternal TxtPt\r\ntxt_pt(S64 line, S64 column)\r\n{\r\n  TxtPt p = {0};\r\n  p.line = line;\r\n  p.column = column;\r\n  return p;\r\n}\r\n\r\ninternal B32\r\ntxt_pt_match(TxtPt a, TxtPt b)\r\n{\r\n  return a.line == b.line && a.column == b.column;\r\n}\r\n\r\ninternal B32\r\ntxt_pt_less_than(TxtPt a, TxtPt b)\r\n{\r\n  B32 result = 0;\r\n  if(a.line < b.line)\r\n  {\r\n    result = 1;\r\n  }\r\n  else if(a.line == b.line)\r\n  {\r\n    result = a.column < b.column;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtPt\r\ntxt_pt_min(TxtPt a, TxtPt b)\r\n{\r\n  TxtPt result = b;\r\n  if(txt_pt_less_than(a, b))\r\n  {\r\n    result = a;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtPt\r\ntxt_pt_max(TxtPt a, TxtPt b)\r\n{\r\n  TxtPt result = a;\r\n  if(txt_pt_less_than(a, b))\r\n  {\r\n    result = b;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtRng\r\ntxt_rng(TxtPt min, TxtPt max)\r\n{\r\n  TxtRng range = {0};\r\n  if(txt_pt_less_than(min, max))\r\n  {\r\n    range.min = min;\r\n    range.max = max;\r\n  }\r\n  else\r\n  {\r\n    range.min = max;\r\n    range.max = min;\r\n  }\r\n  return range;\r\n}\r\n\r\ninternal TxtRng\r\ntxt_rng_intersect(TxtRng a, TxtRng b)\r\n{\r\n  TxtRng result = {0};\r\n  result.min = txt_pt_max(a.min, b.min);\r\n  result.max = txt_pt_min(a.max, b.max);\r\n  if(txt_pt_less_than(result.max, result.min))\r\n  {\r\n    MemoryZeroStruct(&result);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtRng\r\ntxt_rng_union(TxtRng a, TxtRng b)\r\n{\r\n  TxtRng result = {0};\r\n  result.min = txt_pt_min(a.min, b.min);\r\n  result.max = txt_pt_max(a.max, b.max);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ntxt_rng_contains(TxtRng r, TxtPt pt)\r\n{\r\n  B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) &&\r\n                txt_pt_less_than(pt, r.max));\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Toolchain/Environment Enum Functions\r\n\r\ninternal U64\r\nbit_size_from_arch(Arch arch)\r\n{\r\n  // TODO(rjf): metacode\r\n  U64 arch_bitsize = 0;\r\n  switch(arch)\r\n  {\r\n    case Arch_x64:   arch_bitsize = 64; break;\r\n    case Arch_x86:   arch_bitsize = 32; break;\r\n    case Arch_arm64: arch_bitsize = 64; break;\r\n    case Arch_arm32: arch_bitsize = 32; break;\r\n    default: break;\r\n  }\r\n  return arch_bitsize;\r\n}\r\n\r\ninternal U64\r\nbyte_size_from_arch(Arch arch)\r\n{\r\n  return bit_size_from_arch(arch) / 8;\r\n}\r\n\r\ninternal U64\r\nmax_instruction_size_from_arch(Arch arch)\r\n{\r\n  // TODO(rjf): make this real\r\n  return 64;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Functions\r\n\r\ninternal DenseTime\r\ndense_time_from_date_time(DateTime date_time){\r\n  DenseTime result = 0;\r\n  result += date_time.year;\r\n  result *= 12;\r\n  result += date_time.mon;\r\n  result *= 31;\r\n  result += date_time.day;\r\n  result *= 24;\r\n  result += date_time.hour;\r\n  result *= 60;\r\n  result += date_time.min;\r\n  result *= 61;\r\n  result += date_time.sec;\r\n  result *= 1000;\r\n  result += date_time.msec;\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\ndate_time_from_dense_time(DenseTime time){\r\n  DateTime result = {0};\r\n  result.msec = time%1000;\r\n  time /= 1000;\r\n  result.sec  = time%61;\r\n  time /= 61;\r\n  result.min  = time%60;\r\n  time /= 60;\r\n  result.hour = time%24;\r\n  time /= 24;\r\n  result.day  = time%31;\r\n  time /= 31;\r\n  result.mon  = time%12;\r\n  time /= 12;\r\n  Assert(time <= max_U32);\r\n  result.year = (U32)time;\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\ndate_time_from_micro_seconds(U64 time){\r\n  DateTime result = {0};\r\n  result.micro_sec = time%1000;\r\n  time /= 1000;\r\n  result.msec = time%1000;\r\n  time /= 1000;\r\n  result.sec = time%60;\r\n  time /= 60;\r\n  result.min = time%60;\r\n  time /= 60;\r\n  result.hour = time%24;\r\n  time /= 24;\r\n  result.day = time%31;\r\n  time /= 31;\r\n  result.mon = time%12;\r\n  time /= 12;\r\n  Assert(time <= max_U32);\r\n  result.year = (U32)time;\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\ndate_time_from_unix_time(U64 unix_time)\r\n{\r\n  DateTime date = {0};\r\n  date.year     = 1970;\r\n  date.day      = 1 + (unix_time / 86400);\r\n  date.sec      = (U32)unix_time % 60;\r\n  date.min      = (U32)(unix_time / 60) % 60;\r\n  date.hour     = (U32)(unix_time / 3600) % 24;\r\n  \r\n  for(;;)\r\n  {\r\n    for(date.month = 0; date.month < 12; ++date.month)\r\n    {\r\n      U64 c = 0;\r\n      switch(date.month)\r\n      {\r\n        case Month_Jan: c = 31; break;\r\n        case Month_Feb:\r\n        {\r\n          if((date.year % 4 == 0) && ((date.year % 100) != 0 || (date.year % 400) == 0))\r\n          {\r\n            c = 29;\r\n          }\r\n          else\r\n          {\r\n            c = 28;\r\n          }\r\n        } break;\r\n        case Month_Mar: c = 31; break;\r\n        case Month_Apr: c = 30; break;\r\n        case Month_May: c = 31; break;\r\n        case Month_Jun: c = 30; break;\r\n        case Month_Jul: c = 31; break;\r\n        case Month_Aug: c = 31; break;\r\n        case Month_Sep: c = 30; break;\r\n        case Month_Oct: c = 31; break;\r\n        case Month_Nov: c = 30; break;\r\n        case Month_Dec: c = 31; break;\r\n        default: InvalidPath;\r\n      }\r\n      if(date.day <= c)\r\n      {\r\n        goto exit;\r\n      }\r\n      date.day -= c;\r\n    }\r\n    ++date.year;\r\n  }\r\n  exit:;\r\n  \r\n  return date;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Non-Fancy Ring Buffer Reads/Writes\r\n\r\ninternal U64\r\nring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size)\r\n{\r\n  Assert(src_data_size <= ring_size);\r\n  {\r\n    U64 ring_off = ring_pos%ring_size;\r\n    U64 bytes_before_split = ring_size-ring_off;\r\n    U64 pre_split_bytes = Min(bytes_before_split, src_data_size);\r\n    U64 pst_split_bytes = src_data_size-pre_split_bytes;\r\n    void *pre_split_data = src_data;\r\n    void *pst_split_data = ((U8 *)src_data + pre_split_bytes);\r\n    MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes);\r\n    MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes);\r\n  }\r\n  return src_data_size;\r\n}\r\n\r\ninternal U64\r\nring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size)\r\n{\r\n  Assert(read_size <= ring_size);\r\n  {\r\n    U64 ring_off = ring_pos%ring_size;\r\n    U64 bytes_before_split = ring_size-ring_off;\r\n    U64 pre_split_bytes = Min(bytes_before_split, read_size);\r\n    U64 pst_split_bytes = read_size-pre_split_bytes;\r\n    MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes);\r\n    MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes);\r\n  }\r\n  return read_size;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal U64\r\nu64_array_bsearch(U64 *arr, U64 count, U64 value)\r\n{\r\n  if(count > 1 && arr[0] <= value && value < arr[count-1])\r\n  {\r\n    U64 l = 0;\r\n    U64 r = count - 1;\r\n    for(; l <= r; )\r\n    {\r\n      U64 m = l + (r - l) / 2;\r\n      if(arr[m] == value)\r\n      {\r\n        return m;\r\n      }\r\n      else if(arr[m] < value)\r\n      {\r\n        l = m + 1;\r\n      }\r\n      else\r\n      {\r\n        r = m - 1;\r\n      }\r\n    }\r\n  }\r\n  else if (count == 1 && arr[0] == value)\r\n  {\r\n    return 0;\r\n  }\r\n  return max_U64;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal U64\r\nindex_of_zero_u32(U32 *ptr, U64 count)\r\n{\r\n  for (U64 i = 0; i < count; i += 1) {\r\n    if (ptr[i] == 0) {\r\n      return i;\r\n    }\r\n  }\r\n  return max_U64;\r\n}\r\n\r\ninternal U64\r\nindex_of_zero_u64(U64 *ptr, U64 count)\r\n{\r\n  for (U64 i = 0; i < count; i += 1) {\r\n    if (ptr[i] == 0) {\r\n      return i;\r\n    }\r\n  }\r\n  return max_U64;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Third Party Includes\r\n\r\n#if !BUILD_SUPPLEMENTARY_UNIT\r\n#if defined(__clang__)\r\n#pragma clang diagnostic push\r\n#pragma clang diagnostic ignored \"-Wsign-conversion\"\r\n#elif defined(_MSC_VER)\r\n#pragma warning (push, 0)\r\n#endif\r\n\r\n# define STB_SPRINTF_IMPLEMENTATION\r\n# define STB_SPRINTF_STATIC\r\n# include \"third_party/stb/stb_sprintf.h\"\r\n#endif\r\n\r\n#if defined(__clang__)\r\n#pragma clang diagnostic pop\r\n#elif defined(_MSC_VER)\r\n#pragma warning (pop, 0)\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Integer Tables\r\n\r\nread_only global U8 integer_symbols[16] =\r\n{\r\n  '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',\r\n};\r\n\r\n// NOTE(rjf): Includes reverses for uppercase and lowercase hex.\r\nread_only global U8 integer_symbol_reverse[128] =\r\n{\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n};\r\n\r\nread_only global U8 base64[64] =\r\n{\r\n  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\r\n  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',\r\n  'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\r\n  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\r\n  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\r\n  '_', '$',\r\n};\r\n\r\nread_only global U8 base64_reverse[128] =\r\n{\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,\r\n  0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,\r\n  0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E,\r\n  0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,\r\n  0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n};\r\n"
  },
  {
    "path": "src/base/base_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_CORE_H\r\n#define BASE_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Foreign Includes\r\n\r\n#include <stdio.h>\r\n#include <stdarg.h>\r\n#include <math.h>\r\n#include <string.h>\r\n#include <stdint.h>\r\n\r\n////////////////////////////////\r\n//~ rjf: Third Party Includes\r\n\r\n#define STB_SPRINTF_DECORATE(name) raddbg_##name\r\n#define STB_SPRINTF_STATIC\r\n#include \"third_party/stb/stb_sprintf.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Codebase Keywords\r\n\r\n#define internal      static\r\n#define global        static\r\n#define local_persist static\r\n\r\n#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS)\r\n# pragma section(\".rdata$\", read)\r\n# define read_only __declspec(allocate(\".rdata$\"))\r\n#elif (COMPILER_CLANG && OS_LINUX)\r\n# define read_only __attribute__((section(\".rodata\")))\r\n#else\r\n// NOTE(rjf): I don't know of a useful way to do this in GCC land.\r\n// __attribute__((section(\".rodata\"))) looked promising, but it introduces a\r\n// strange warning about malformed section attributes, and it doesn't look\r\n// like writing to that section reliably produces access violations, strangely\r\n// enough. (It does on Clang)\r\n# define read_only\r\n#endif\r\n\r\n#if COMPILER_MSVC\r\n# define thread_static __declspec(thread)\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define thread_static __thread\r\n#else\r\n# error thread_static not defined for this compiler.\r\n#endif\r\n\r\n#if COMPILER_MSVC\r\n# define force_inline __forceinline\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define force_inline __attribute__((always_inline))\r\n#else\r\n# error force_inline not defined for this compiler.\r\n#endif\r\n\r\n#if COMPILER_MSVC\r\n# define no_inline __declspec(noinline)\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define no_inline __attribute__((noinline))\r\n#else\r\n# error no_inline not defined for this compiler.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Linkage Keyword Macros\r\n\r\n#if OS_WINDOWS\r\n# define shared_function C_LINKAGE __declspec(dllexport)\r\n#else\r\n# define shared_function C_LINKAGE\r\n#endif\r\n\r\n#if LANG_CPP\r\n# define C_LINKAGE_BEGIN extern \"C\"{\r\n# define C_LINKAGE_END }\r\n# define C_LINKAGE extern \"C\"\r\n#else\r\n# define C_LINKAGE_BEGIN\r\n# define C_LINKAGE_END\r\n# define C_LINKAGE\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Optimization Settings\r\n\r\n#if COMPILER_MSVC\r\n# define OPTIMIZE_BEGIN _Pragma(\"optimize(\\\"\\\", on)\")\r\n# define OPTIMIZE_END _Pragma(\"optimize(\\\"\\\", off)\")\r\n#elif COMPILER_CLANG\r\n# define OPTIMIZE_BEGIN _Pragma(\"clang optimize on\")\r\n# define OPTIMIZE_END _Pragma(\"clang optimize off\")\r\n#elif COMPILER_GCC\r\n# define OPTIMIZE_BEGIN _Pragma(\"GCC push_options\") _Pragma(\"GCC optimize(\\\"O2\\\")\")\r\n# define OPTIMIZE_END _Pragma(\"GCC pop_options\")\r\n#else\r\n# define OPTIMIZE_BEGIN\r\n# define OPTIMIZE_END\r\n#endif\r\n\r\n#if COMPILER_MSVC && !BUILD_DEBUG\r\n# define NO_OPTIMIZE_BEGIN _Pragma(\"optimize(\\\"\\\", off)\")\r\n# define NO_OPTIMIZE_END _Pragma(\"optimize(\\\"\\\", on)\")\r\n#elif COMPILER_CLANG && !BUILD_DEBUG\r\n# define NO_OPTIMIZE_BEGIN _Pragma(\"clang optimize off\")\r\n# define NO_OPTIMIZE_END _Pragma(\"clang optimize on\")\r\n#elif COMPILER_GCC && !BUILD_DEBUG\r\n# define NO_OPTIMIZE_BEGIN _Pragma(\"GCC push_options\") _Pragma(\"GCC optimize(\\\"O0\\\")\")\r\n# define NO_OPTIMIZE_END _Pragma(\"GCC pop_options\")\r\n#else\r\n# define NO_OPTIMIZE_BEGIN\r\n# define NO_OPTIMIZE_END\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Versions\r\n\r\n#define Version(major, minor, patch) (U64)((((U64)(major) & 0xffff) << 32) | ((((U64)(minor) & 0xffff) << 16)) | ((((U64)(patch) & 0xffff) << 0)))\r\n#define MajorFromVersion(version) (((version) & 0xffff00000000ull) >> 32)\r\n#define MinorFromVersion(version) (((version) & 0x0000ffff0000ull) >> 16)\r\n#define PatchFromVersion(version) (((version) & 0x00000000ffffull) >> 0)\r\n\r\n////////////////////////////////\r\n//~ rjf: Units\r\n\r\n#define KB(n)  (((U64)(n)) << 10)\r\n#define MB(n)  (((U64)(n)) << 20)\r\n#define GB(n)  (((U64)(n)) << 30)\r\n#define TB(n)  (((U64)(n)) << 40)\r\n#define Thousand(n)   ((n)*1000)\r\n#define Million(n)    ((n)*1000000)\r\n#define Billion(n)    ((n)*1000000000)\r\n\r\n////////////////////////////////\r\n//~ rjf: Branch Predictor Hints\r\n\r\n#if defined(__clang__)\r\n# define Expect(expr, val) __builtin_expect((expr), (val))\r\n#else\r\n# define Expect(expr, val) (expr)\r\n#endif\r\n\r\n#define Likely(expr)            Expect(expr,1)\r\n#define Unlikely(expr)          Expect(expr,0)\r\n\r\n////////////////////////////////\r\n//~ rjf: Clamps, Mins, Maxes\r\n\r\n#define Min(A,B) (((A)<(B))?(A):(B))\r\n#define Max(A,B) (((A)>(B))?(A):(B))\r\n#define ClampTop(A,X) Min(A,X)\r\n#define ClampBot(X,B) Max(X,B)\r\n#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X))\r\n\r\n////////////////////////////////\r\n//~ rjf: Type -> Alignment\r\n\r\n#if COMPILER_MSVC\r\n# define AlignOf(T) __alignof(T)\r\n#elif COMPILER_CLANG\r\n# define AlignOf(T) __alignof(T)\r\n#elif COMPILER_GCC\r\n# define AlignOf(T) __alignof__(T)\r\n#else\r\n# error AlignOf not defined for this compiler.\r\n#endif\r\n\r\n#if COMPILER_MSVC\r\n# define AlignType(x) __declspec(align(x))\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define AlignType(x) __attribute__((aligned(x)))\r\n#else\r\n# error AlignType not defined for this compiler.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Member Offsets\r\n\r\n#define Member(T,m)                 (((T*)0)->m)\r\n#define OffsetOf(T,m)               IntFromPtr(&Member(T,m))\r\n#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off)))\r\n#define CastFromMember(T,m,ptr)     (T*)(((U8*)ptr) - OffsetOf(T,m))\r\n\r\n////////////////////////////////\r\n//~ rjf: For-Loop Construct Macros\r\n\r\n#define DeferLoop(begin, end)        for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end))\r\n#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end))\r\n\r\n#define EachIndex(it, count) (U64 it = 0; it < (count); it += 1)\r\n#define EachElement(it, array) (U64 it = 0; it < ArrayCount(array); it += 1)\r\n#define EachEnumVal(type, it) (type it = (type)0; it < type##_COUNT; it = (type)(it+1))\r\n#define EachNonZeroEnumVal(type, it) (type it = (type)1; it < type##_COUNT; it = (type)(it+1))\r\n#define EachInRange(it, range) (U64 it = (range).min; it < (range).max; it += 1)\r\n#define EachNode(it, T, first) (T *it = first; it != 0; it = it->next)\r\n\r\n////////////////////////////////\r\n//~ rjf: Memory Operation Macros\r\n\r\n#define MemoryCopy(dst, src, size)    memmove((dst), (src), (size))\r\n#define MemorySet(dst, byte, size)    memset((dst), (byte), (size))\r\n#define MemoryCompare(a, b, size)     memcmp((a), (b), (size))\r\n#define MemoryStrlen(ptr)             strlen(ptr)\r\n\r\n#define MemoryCopyStruct(d,s)  MemoryCopy((d),(s),sizeof(*(d)))\r\n#define MemoryCopyArray(d,s)   MemoryCopy((d),(s),sizeof(d))\r\n#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c))\r\n#define MemoryCopyStr8(dst, s) MemoryCopy(dst, (s).str, (s).size)\r\n\r\n#define MemoryZero(s,z)       memset((s),0,(z))\r\n#define MemoryZeroStruct(s)   MemoryZero((s),sizeof(*(s)))\r\n#define MemoryZeroArray(a)    MemoryZero((a),sizeof(a))\r\n#define MemoryZeroTyped(m,c)  MemoryZero((m),sizeof(*(m))*(c))\r\n\r\n#define MemoryMatch(a,b,z)     (MemoryCompare((a),(b),(z)) == 0)\r\n#define MemoryMatchStruct(a,b)  MemoryMatch((a),(b),sizeof(*(a)))\r\n#define MemoryMatchArray(a,b)   MemoryMatch((a),(b),sizeof(a))\r\n\r\n#define MemoryIsZeroStruct(ptr) memory_is_zero((ptr), sizeof(*(ptr)))\r\n\r\n#define MemoryRead(T,p,e)    ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) )\r\n#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) )\r\n\r\n////////////////////////////////\r\n//~ rjf: Asserts\r\n\r\n#if COMPILER_MSVC\r\n# define Trap() __debugbreak()\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define Trap() __builtin_trap()\r\n#else\r\n# error Unknown trap intrinsic for this compiler.\r\n#endif\r\n\r\n#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0)\r\n#if BUILD_DEBUG\r\n# define Assert(x) AssertAlways(x)\r\n#else\r\n# define Assert(x) (void)(x)\r\n#endif\r\n#define InvalidPath        Assert(!\"Invalid Path!\")\r\n#define NotImplemented     Assert(!\"Not Implemented!\")\r\n#define NoOp               ((void)0)\r\n#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1]\r\n\r\n////////////////////////////////\r\n//~ rjf: Atomic Operations\r\n\r\n#if COMPILER_MSVC\r\n# include <intrin.h>\r\n# if ARCH_X64\r\n#  define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)InterlockedCompareExchange128((__int64 *)(x), ((__int64 *)&(k))[1], ((__int64 *)&(k))[0], (__int64 *)c)\r\n#  define ins_atomic_u64_eval(x)                  *((volatile U64 *)(x))\r\n#  define ins_atomic_u64_inc_eval(x)              InterlockedIncrement64((__int64 *)(x))\r\n#  define ins_atomic_u64_dec_eval(x)              InterlockedDecrement64((__int64 *)(x))\r\n#  define ins_atomic_u64_eval_assign(x,c)         InterlockedExchange64((__int64 *)(x),(c))\r\n#  define ins_atomic_u64_add_eval(x,c)            InterlockedAdd64((__int64 *)(x), c)\r\n#  define ins_atomic_u64_eval_cond_assign(x,k,c)  InterlockedCompareExchange64((__int64 *)(x),(k),(c))\r\n#  define ins_atomic_u32_eval(x)                  *((volatile U32 *)(x))\r\n#  define ins_atomic_u32_inc_eval(x)              InterlockedIncrement((LONG *)(x))\r\n#  define ins_atomic_u32_dec_eval(x)              InterlockedDecrement((LONG *)(x))\r\n#  define ins_atomic_u32_eval_assign(x,c)         InterlockedExchange((LONG *)(x),(c))\r\n#  define ins_atomic_u32_eval_cond_assign(x,k,c)  InterlockedCompareExchange((LONG *)(x),(k),(c))\r\n#  define ins_atomic_u32_add_eval(x,c)            InterlockedAdd((LONG *)(x), (c))\r\n#  define ins_atomic_u8_eval_assign(x,c)          InterlockedExchange8((CHAR *)(x), (c))\r\n# else\r\n#  error Atomic intrinsics not defined for this compiler / architecture combination.\r\n# endif\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n#  define ins_atomic_u128_eval_cond_assign(x,k,c) (B32)__atomic_compare_exchange_n((__int128 *)(x),(__int128 *)(c),*(__int128 *)(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u64_eval(x)                  __atomic_load_n(x, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u64_inc_eval(x)              (__atomic_fetch_add((U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1)\r\n#  define ins_atomic_u64_dec_eval(x)              (__atomic_fetch_sub((U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1)\r\n#  define ins_atomic_u64_eval_assign(x,c)         __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u64_add_eval(x,c)            (__atomic_fetch_add((U64 *)(x), c, __ATOMIC_SEQ_CST) + (c))\r\n#  define ins_atomic_u64_eval_cond_assign(x,k,c)  ({ U64 _new = (c); __atomic_compare_exchange_n((U64 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; })\r\n#  define ins_atomic_u32_eval(x)                  __atomic_load_n(x, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u32_inc_eval(x)              (__atomic_fetch_add((U32 *)(x), 1, __ATOMIC_SEQ_CST) + 1)\r\n#  define ins_atomic_u32_dec_eval(x)              (__atomic_fetch_sub((U32 *)(x), 1, __ATOMIC_SEQ_CST) - 1)\r\n#  define ins_atomic_u32_add_eval(x,c)            (__atomic_fetch_add((U32 *)(x), c, __ATOMIC_SEQ_CST) + (c))\r\n#  define ins_atomic_u32_eval_assign(x,c)         __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u32_eval_cond_assign(x,k,c)  ({ U32 _new = (c); __atomic_compare_exchange_n((U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; })\r\n#  define ins_atomic_u8_eval_assign(x,c)          __atomic_exchange_n((x), (c), __ATOMIC_SEQ_CST)\r\n#else\r\n#  error Atomic intrinsics not defined for this compiler / architecture.\r\n#endif\r\n\r\n#if ARCH_64BIT\r\n# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void *)ins_atomic_u64_eval_cond_assign((U64 *)(x), (U64)(k), (U64)(c))\r\n# define ins_atomic_ptr_eval_assign(x,c)        (void *)ins_atomic_u64_eval_assign((U64 *)(x), (U64)(c))\r\n# define ins_atomic_ptr_eval(x)                 (void *)ins_atomic_u64_eval((U64 *)x)\r\n#else\r\n# error Atomic intrinsics for pointers not defined for this architecture.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Linked List Building Macros\r\n\r\n//- rjf: linked list macro helpers\r\n#define CheckNil(nil,p) ((p) == 0 || (p) == nil)\r\n#define SetNil(nil,p) ((p) = nil)\r\n\r\n//- rjf: doubly-linked-lists\r\n#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \\\r\n((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\\\r\nCheckNil(nil,p) ? \\\r\n((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\\\r\n((p)==(l)) ? \\\r\n((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\\\r\n(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p))))\r\n#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev)\r\n#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next)\r\n#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\\\r\n((n) == (l) ? (l) = (l)->prev : (0)),\\\r\n(CheckNil(nil,(n)->prev) ? (0) :\\\r\n((n)->prev->next = (n)->next)),\\\r\n(CheckNil(nil,(n)->next) ? (0) :\\\r\n((n)->next->prev = (n)->prev)))\r\n\r\n//- rjf: singly-linked, doubly-headed lists (queues)\r\n#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\\\r\n((f)=(l)=(n),SetNil(nil,(n)->next)):\\\r\n((l)->next=(n),(l)=(n),SetNil(nil,(n)->next)))\r\n#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\\\r\n((f)=(l)=(n),SetNil(nil,(n)->next)):\\\r\n((n)->next=(f),(f)=(n)))\r\n#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\\\r\n(SetNil(nil,f),SetNil(nil,l)):\\\r\n((f)=(f)->next))\r\n\r\n//- rjf: singly-linked, singly-headed lists (stacks)\r\n#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n))\r\n#define SLLStackPop_N(f,next) ((f)=(f)->next)\r\n\r\n//- rjf: doubly-linked-list helpers\r\n#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev)\r\n#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev)\r\n#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev)\r\n#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev)\r\n#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev)\r\n#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev)\r\n#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev)\r\n#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev)\r\n\r\n//- rjf: singly-linked, doubly-headed list helpers\r\n#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next)\r\n#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next)\r\n#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next)\r\n#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next)\r\n#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next)\r\n#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next)\r\n\r\n//- rjf: singly-linked, singly-headed list helpers\r\n#define SLLStackPush(f,n) SLLStackPush_N(f,n,next)\r\n#define SLLStackPop(f) SLLStackPop_N(f,next)\r\n\r\n////////////////////////////////\r\n//~ rjf: Address Sanitizer Markup\r\n\r\n#if COMPILER_MSVC\r\n# if defined(__SANITIZE_ADDRESS__)\r\n#  define ASAN_ENABLED 1\r\n#  define NO_ASAN __declspec(no_sanitize_address)\r\n# else\r\n#  define NO_ASAN\r\n# endif\r\n#elif COMPILER_CLANG\r\n# if defined(__has_feature)\r\n#  if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)\r\n#   define ASAN_ENABLED 1\r\n#  endif\r\n# endif\r\n# define NO_ASAN __attribute__((no_sanitize(\"address\")))\r\n#else\r\n# define NO_ASAN\r\n#endif\r\n\r\n#if ASAN_ENABLED\r\nC_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size);\r\nC_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size);\r\n# define AsanPoisonMemoryRegion(addr, size)   __asan_poison_memory_region((addr), (size))\r\n# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size))\r\n#else\r\n# define AsanPoisonMemoryRegion(addr, size)   ((void)(addr), (void)(size))\r\n# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size))\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Misc. Helper Macros\r\n\r\n#define Stringify_(S) #S\r\n#define Stringify(S) Stringify_(S)\r\n\r\n#define Glue_(A,B) A##B\r\n#define Glue(A,B) Glue_(A,B)\r\n\r\n#define ArrayCount(a) (sizeof(a) / sizeof((a)[0]))\r\n\r\n#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b))\r\n\r\n#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0)\r\n\r\n#if ARCH_64BIT\r\n# define IntFromPtr(ptr) ((U64)(ptr))\r\n#elif ARCH_32BIT\r\n# define IntFromPtr(ptr) ((U32)(ptr))\r\n#else\r\n# error Missing pointer-to-integer cast for this architecture.\r\n#endif\r\n#define PtrFromInt(i) (void*)(i)\r\n\r\n#define Compose64Bit(a,b)  ((((U64)a) << 32) | ((U64)b))\r\n#define Compose32Bit(a,b)  ((((U32)a) << 16) | ((U32)b))\r\n#define AlignPow2(x,b)     (((x) + (b) - 1)&(~((b) - 1)))\r\n#define AlignDownPow2(x,b) ((x)&(~((b) - 1)))\r\n#define AlignPadPow2(x,b)  ((0-(x)) & ((b) - 1))\r\n#define IsPow2(x)          ((x)!=0 && ((x)&((x)-1))==0)\r\n#define IsPow2OrZero(x)    ((((x) - 1)&(x)) == 0)\r\n\r\n#define ExtractBit(word, idx) (((word) >> (idx)) & 1)\r\n#define Extract8(word, pos)   (((word) >> ((pos)*8))  & max_U8)\r\n#define Extract16(word, pos)  (((word) >> ((pos)*16)) & max_U16)\r\n#define Extract32(word, pos)  (((word) >> ((pos)*32)) & max_U32)\r\n\r\n#if LANG_CPP\r\n# define zero_struct {}\r\n#else\r\n# define zero_struct {0}\r\n#endif\r\n\r\n#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015\r\n# define this_function_name \"unknown\"\r\n#else\r\n# define this_function_name __func__\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Types\r\n\r\ntypedef uint8_t  U8;\r\ntypedef uint16_t U16;\r\ntypedef uint32_t U32;\r\ntypedef uint64_t U64;\r\ntypedef int8_t   S8;\r\ntypedef int16_t  S16;\r\ntypedef int32_t  S32;\r\ntypedef int64_t  S64;\r\ntypedef S8       B8;\r\ntypedef S16      B16;\r\ntypedef S32      B32;\r\ntypedef S64      B64;\r\ntypedef float    F32;\r\ntypedef double   F64;\r\ntypedef void VoidProc(void);\r\ntypedef union U128 U128;\r\nunion U128\r\n{\r\n  U8 u8[16];\r\n  U16 u16[8];\r\n  U32 u32[4];\r\n  U64 u64[2];\r\n};\r\ntypedef union U256 U256;\r\nunion U256\r\n{\r\n  U8 u8[32];\r\n  U16 u16[16];\r\n  U32 u32[8];\r\n  U64 u64[4];\r\n  U128 u128[2];\r\n};\r\ntypedef union U512 U512;\r\nunion U512\r\n{\r\n  U8 u8[64];\r\n  U16 u16[32];\r\n  U32 u32[16];\r\n  U64 u64[8];\r\n  U128 u128[4];\r\n  U256 u256[2];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Structures\r\n\r\ntypedef struct U16Array U16Array;\r\nstruct U16Array\r\n{\r\n  U64  count;\r\n  U16 *v;\r\n};\r\n\r\ntypedef struct U32Array U32Array;\r\nstruct U32Array\r\n{\r\n  U64  count;\r\n  U32 *v;\r\n};\r\n\r\ntypedef struct U64Array U64Array;\r\nstruct U64Array\r\n{\r\n  U64  count;\r\n  U64 *v;\r\n};\r\n\r\ntypedef struct U128Array U128Array;\r\nstruct U128Array\r\n{\r\n  U64   count;\r\n  U128 *v;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Types & Spaces\r\n\r\ntypedef enum Dimension\r\n{\r\n  Dimension_X,\r\n  Dimension_Y,\r\n  Dimension_Z,\r\n  Dimension_W,\r\n}\r\nDimension;\r\n\r\ntypedef enum Side\r\n{\r\n  Side_Invalid = -1,\r\n  Side_Min,\r\n  Side_Max,\r\n  Side_COUNT,\r\n}\r\nSide;\r\n#define side_flip(s) ((Side)(!(s)))\r\n\r\ntypedef enum Axis2\r\n{\r\n  Axis2_Invalid = -1,\r\n  Axis2_X,\r\n  Axis2_Y,\r\n  Axis2_COUNT,\r\n}\r\nAxis2;\r\n#define axis2_flip(a) ((Axis2)(!(a)))\r\n\r\ntypedef enum Corner\r\n{\r\n  Corner_Invalid = -1,\r\n  Corner_00,\r\n  Corner_01,\r\n  Corner_10,\r\n  Corner_11,\r\n  Corner_COUNT\r\n}\r\nCorner;\r\n\r\ntypedef enum Dir2\r\n{\r\n  Dir2_Invalid = -1,\r\n  Dir2_Left,\r\n  Dir2_Up,\r\n  Dir2_Right,\r\n  Dir2_Down,\r\n  Dir2_COUNT\r\n}\r\nDir2;\r\n#define axis2_from_dir2(d) (((d) & 1) ? Axis2_Y : Axis2_X)\r\n#define side_from_dir2(d) (((d) < Dir2_Right) ? Side_Min : Side_Max)\r\n\r\n////////////////////////////////\r\n//~ rjf: Toolchain/Environment Enums\r\n\r\ntypedef enum OperatingSystem\r\n{\r\n  OperatingSystem_Null,\r\n  OperatingSystem_Windows,\r\n  OperatingSystem_Linux,\r\n  OperatingSystem_Mac,\r\n  OperatingSystem_COUNT,\r\n#if OS_WINDOWS\r\n  OperatingSystem_CURRENT = OperatingSystem_Windows,\r\n#elif OS_LINUX\r\n  OperatingSystem_CURRENT = OperatingSystem_Linux,\r\n#elif OS_MAC\r\n  OperatingSystem_CURRENT = OperatingSystem_Mac,\r\n#else\r\n  OperatingSystem_CURRENT = OperatingSystem_Null,\r\n#endif\r\n}\r\nOperatingSystem;\r\n\r\ntypedef enum ExecutableImageKind\r\n{\r\n  ExecutableImageKind_Null,\r\n  ExecutableImageKind_CoffPe,\r\n  ExecutableImageKind_Elf32,\r\n  ExecutableImageKind_Elf64,\r\n  ExecutableImageKind_Macho,\r\n  ExecutableImageKind_COUNT\r\n}\r\nExecutableImageKind;\r\n\r\ntypedef enum Arch\r\n{\r\n  Arch_Null,\r\n  Arch_x64,\r\n  Arch_x86,\r\n  Arch_arm64,\r\n  Arch_arm32,\r\n  Arch_COUNT,\r\n}\r\nArch;\r\n#if ARCH_X64\r\n# define Arch_CURRENT Arch_x64\r\n#elif ARCH_X86\r\n# define Arch_CURRENT Arch_x86\r\n#elif ARCH_ARM64\r\n# define Arch_CURRENT Arch_arm64\r\n#elif ARCH_ARM32\r\n# define Arch_CURRENT Arch_arm32\r\n#else\r\n# define Arch_CURRENT Arch_Null\r\n#endif\r\n\r\ntypedef enum Compiler\r\n{\r\n  Compiler_Null,\r\n  Compiler_msvc,\r\n  Compiler_gcc,\r\n  Compiler_clang,\r\n  Compiler_COUNT,\r\n}\r\nCompiler;\r\n#if COMPILER_MSVC\r\n# define Compiler_CURRENT Compiler_msvc\r\n#elif COMPILER_GCC\r\n# define Compiler_CURRENT Compiler_gcc\r\n#elif COMPILER_CLANG\r\n# define Compiler_CURRENT Compiler_clang\r\n#else\r\n# define Compiler_CURRENT Compiler_Null\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Text 2D Coordinates & Ranges\r\n\r\ntypedef struct TxtPt TxtPt;\r\nstruct TxtPt\r\n{\r\n  S64 line;\r\n  S64 column;\r\n};\r\n\r\ntypedef struct TxtRng TxtRng;\r\nstruct TxtRng\r\n{\r\n  TxtPt min;\r\n  TxtPt max;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globally Unique Ids\r\n\r\ntypedef union Guid Guid;\r\nunion Guid\r\n{\r\n  struct\r\n  {\r\n    U32 data1;\r\n    U16 data2;\r\n    U16 data3;\r\n    U8  data4[8];\r\n  };\r\n  U8 v[16];\r\n};\r\nStaticAssert(sizeof(Guid) == 16, g_guid_size_check);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Constants\r\n\r\nglobal U32 sign32     = 0x80000000;\r\nglobal U32 exponent32 = 0x7F800000;\r\nglobal U32 mantissa32 = 0x007FFFFF;\r\n\r\nglobal F32   big_golden32 = 1.61803398875f;\r\nglobal F32 small_golden32 = 0.61803398875f;\r\n\r\nglobal F32 pi32 = 3.1415926535897f;\r\n\r\nglobal F64 machine_epsilon64 = 4.94065645841247e-324;\r\n\r\nglobal U64 max_U64 = 0xffffffffffffffffull;\r\nglobal U32 max_U32 = 0xffffffff;\r\nglobal U16 max_U16 = 0xffff;\r\nglobal U8  max_U8  = 0xff;\r\n\r\nglobal S64 max_S64 = (S64)0x7fffffffffffffffll;\r\nglobal S32 max_S32 = (S32)0x7fffffff;\r\nglobal S16 max_S16 = (S16)0x7fff;\r\nglobal S8  max_S8  =  (S8)0x7f;\r\n\r\nglobal S64 min_S64 = (S64)0x8000000000000000ll;\r\nglobal S32 min_S32 = (S32)0x80000000;\r\nglobal S16 min_S16 = (S16)0x8000;\r\nglobal S8  min_S8  =  (S8)0x80;\r\n\r\nglobal const U32 bitmask1  = 0x00000001;\r\nglobal const U32 bitmask2  = 0x00000003;\r\nglobal const U32 bitmask3  = 0x00000007;\r\nglobal const U32 bitmask4  = 0x0000000f;\r\nglobal const U32 bitmask5  = 0x0000001f;\r\nglobal const U32 bitmask6  = 0x0000003f;\r\nglobal const U32 bitmask7  = 0x0000007f;\r\nglobal const U32 bitmask8  = 0x000000ff;\r\nglobal const U32 bitmask9  = 0x000001ff;\r\nglobal const U32 bitmask10 = 0x000003ff;\r\nglobal const U32 bitmask11 = 0x000007ff;\r\nglobal const U32 bitmask12 = 0x00000fff;\r\nglobal const U32 bitmask13 = 0x00001fff;\r\nglobal const U32 bitmask14 = 0x00003fff;\r\nglobal const U32 bitmask15 = 0x00007fff;\r\nglobal const U32 bitmask16 = 0x0000ffff;\r\nglobal const U32 bitmask17 = 0x0001ffff;\r\nglobal const U32 bitmask18 = 0x0003ffff;\r\nglobal const U32 bitmask19 = 0x0007ffff;\r\nglobal const U32 bitmask20 = 0x000fffff;\r\nglobal const U32 bitmask21 = 0x001fffff;\r\nglobal const U32 bitmask22 = 0x003fffff;\r\nglobal const U32 bitmask23 = 0x007fffff;\r\nglobal const U32 bitmask24 = 0x00ffffff;\r\nglobal const U32 bitmask25 = 0x01ffffff;\r\nglobal const U32 bitmask26 = 0x03ffffff;\r\nglobal const U32 bitmask27 = 0x07ffffff;\r\nglobal const U32 bitmask28 = 0x0fffffff;\r\nglobal const U32 bitmask29 = 0x1fffffff;\r\nglobal const U32 bitmask30 = 0x3fffffff;\r\nglobal const U32 bitmask31 = 0x7fffffff;\r\nglobal const U32 bitmask32 = 0xffffffff;\r\n\r\nglobal const U64 bitmask33 = 0x00000001ffffffffull;\r\nglobal const U64 bitmask34 = 0x00000003ffffffffull;\r\nglobal const U64 bitmask35 = 0x00000007ffffffffull;\r\nglobal const U64 bitmask36 = 0x0000000fffffffffull;\r\nglobal const U64 bitmask37 = 0x0000001fffffffffull;\r\nglobal const U64 bitmask38 = 0x0000003fffffffffull;\r\nglobal const U64 bitmask39 = 0x0000007fffffffffull;\r\nglobal const U64 bitmask40 = 0x000000ffffffffffull;\r\nglobal const U64 bitmask41 = 0x000001ffffffffffull;\r\nglobal const U64 bitmask42 = 0x000003ffffffffffull;\r\nglobal const U64 bitmask43 = 0x000007ffffffffffull;\r\nglobal const U64 bitmask44 = 0x00000fffffffffffull;\r\nglobal const U64 bitmask45 = 0x00001fffffffffffull;\r\nglobal const U64 bitmask46 = 0x00003fffffffffffull;\r\nglobal const U64 bitmask47 = 0x00007fffffffffffull;\r\nglobal const U64 bitmask48 = 0x0000ffffffffffffull;\r\nglobal const U64 bitmask49 = 0x0001ffffffffffffull;\r\nglobal const U64 bitmask50 = 0x0003ffffffffffffull;\r\nglobal const U64 bitmask51 = 0x0007ffffffffffffull;\r\nglobal const U64 bitmask52 = 0x000fffffffffffffull;\r\nglobal const U64 bitmask53 = 0x001fffffffffffffull;\r\nglobal const U64 bitmask54 = 0x003fffffffffffffull;\r\nglobal const U64 bitmask55 = 0x007fffffffffffffull;\r\nglobal const U64 bitmask56 = 0x00ffffffffffffffull;\r\nglobal const U64 bitmask57 = 0x01ffffffffffffffull;\r\nglobal const U64 bitmask58 = 0x03ffffffffffffffull;\r\nglobal const U64 bitmask59 = 0x07ffffffffffffffull;\r\nglobal const U64 bitmask60 = 0x0fffffffffffffffull;\r\nglobal const U64 bitmask61 = 0x1fffffffffffffffull;\r\nglobal const U64 bitmask62 = 0x3fffffffffffffffull;\r\nglobal const U64 bitmask63 = 0x7fffffffffffffffull;\r\nglobal const U64 bitmask64 = 0xffffffffffffffffull;\r\n\r\nglobal const U32 bit1  = (1<<0);\r\nglobal const U32 bit2  = (1<<1);\r\nglobal const U32 bit3  = (1<<2);\r\nglobal const U32 bit4  = (1<<3);\r\nglobal const U32 bit5  = (1<<4);\r\nglobal const U32 bit6  = (1<<5);\r\nglobal const U32 bit7  = (1<<6);\r\nglobal const U32 bit8  = (1<<7);\r\nglobal const U32 bit9  = (1<<8);\r\nglobal const U32 bit10 = (1<<9);\r\nglobal const U32 bit11 = (1<<10);\r\nglobal const U32 bit12 = (1<<11);\r\nglobal const U32 bit13 = (1<<12);\r\nglobal const U32 bit14 = (1<<13);\r\nglobal const U32 bit15 = (1<<14);\r\nglobal const U32 bit16 = (1<<15);\r\nglobal const U32 bit17 = (1<<16);\r\nglobal const U32 bit18 = (1<<17);\r\nglobal const U32 bit19 = (1<<18);\r\nglobal const U32 bit20 = (1<<19);\r\nglobal const U32 bit21 = (1<<20);\r\nglobal const U32 bit22 = (1<<21);\r\nglobal const U32 bit23 = (1<<22);\r\nglobal const U32 bit24 = (1<<23);\r\nglobal const U32 bit25 = (1<<24);\r\nglobal const U32 bit26 = (1<<25);\r\nglobal const U32 bit27 = (1<<26);\r\nglobal const U32 bit28 = (1<<27);\r\nglobal const U32 bit29 = (1<<28);\r\nglobal const U32 bit30 = (1<<29);\r\nglobal const U32 bit31 = (1<<30);\r\nglobal const U32 bit32 = (1<<31);\r\n\r\nglobal const U64 bit33 = (1ull<<32);\r\nglobal const U64 bit34 = (1ull<<33);\r\nglobal const U64 bit35 = (1ull<<34);\r\nglobal const U64 bit36 = (1ull<<35);\r\nglobal const U64 bit37 = (1ull<<36);\r\nglobal const U64 bit38 = (1ull<<37);\r\nglobal const U64 bit39 = (1ull<<38);\r\nglobal const U64 bit40 = (1ull<<39);\r\nglobal const U64 bit41 = (1ull<<40);\r\nglobal const U64 bit42 = (1ull<<41);\r\nglobal const U64 bit43 = (1ull<<42);\r\nglobal const U64 bit44 = (1ull<<43);\r\nglobal const U64 bit45 = (1ull<<44);\r\nglobal const U64 bit46 = (1ull<<45);\r\nglobal const U64 bit47 = (1ull<<46);\r\nglobal const U64 bit48 = (1ull<<47);\r\nglobal const U64 bit49 = (1ull<<48);\r\nglobal const U64 bit50 = (1ull<<49);\r\nglobal const U64 bit51 = (1ull<<50);\r\nglobal const U64 bit52 = (1ull<<51);\r\nglobal const U64 bit53 = (1ull<<52);\r\nglobal const U64 bit54 = (1ull<<53);\r\nglobal const U64 bit55 = (1ull<<54);\r\nglobal const U64 bit56 = (1ull<<55);\r\nglobal const U64 bit57 = (1ull<<56);\r\nglobal const U64 bit58 = (1ull<<57);\r\nglobal const U64 bit59 = (1ull<<58);\r\nglobal const U64 bit60 = (1ull<<59);\r\nglobal const U64 bit61 = (1ull<<60);\r\nglobal const U64 bit62 = (1ull<<61);\r\nglobal const U64 bit63 = (1ull<<62);\r\nglobal const U64 bit64 = (1ull<<63);\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Types\r\n\r\ntypedef enum WeekDay\r\n{\r\n  WeekDay_Sun,\r\n  WeekDay_Mon,\r\n  WeekDay_Tue,\r\n  WeekDay_Wed,\r\n  WeekDay_Thu,\r\n  WeekDay_Fri,\r\n  WeekDay_Sat,\r\n  WeekDay_COUNT,\r\n}\r\nWeekDay;\r\n\r\ntypedef enum Month\r\n{\r\n  Month_Jan,\r\n  Month_Feb,\r\n  Month_Mar,\r\n  Month_Apr,\r\n  Month_May,\r\n  Month_Jun,\r\n  Month_Jul,\r\n  Month_Aug,\r\n  Month_Sep,\r\n  Month_Oct,\r\n  Month_Nov,\r\n  Month_Dec,\r\n  Month_COUNT,\r\n}\r\nMonth;\r\n\r\ntypedef struct DateTime DateTime;\r\nstruct DateTime\r\n{\r\n  U16 micro_sec; // [0,999]\r\n  U16 msec; // [0,999]\r\n  U16 sec;  // [0,60]\r\n  U16 min;  // [0,59]\r\n  U16 hour; // [0,24]\r\n  U16 day;  // [0,30]\r\n  union\r\n  {\r\n    WeekDay week_day;\r\n    U32 wday;\r\n  };\r\n  union\r\n  {\r\n    Month month;\r\n    U32 mon;\r\n  };\r\n  U32 year; // 1 = 1 CE, 0 = 1 BC\r\n};\r\n\r\ntypedef U64 DenseTime;\r\n\r\n////////////////////////////////\r\n//~ rjf: File Types\r\n\r\ntypedef U32 FilePropertyFlags;\r\nenum\r\n{\r\n  FilePropertyFlag_IsFolder = (1 << 0),\r\n};\r\n\r\ntypedef struct FileProperties FileProperties;\r\nstruct FileProperties\r\n{\r\n  U64 size;\r\n  DenseTime modified;\r\n  DenseTime created;\r\n  FilePropertyFlags flags;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Safe Casts\r\n\r\ninternal U16 safe_cast_u16(U32 x);\r\ninternal U32 safe_cast_u32(U64 x);\r\ninternal S32 safe_cast_s32(S64 x);\r\n\r\n////////////////////////////////\r\n//~ rjf: Large Base Type Functions\r\n\r\ninternal U128 u128_zero(void);\r\ninternal U128 u128_make(U64 v0, U64 v1);\r\ninternal B32 u128_match(U128 a, U128 b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Bit Patterns\r\n\r\ninternal U32 u32_from_u64_saturate(U64 x);\r\ninternal U64 u64_up_to_pow2(U64 x);\r\ninternal S32 extend_sign32(U32 x, U32 size);\r\ninternal S64 extend_sign64(U64 x, U64 size);\r\n\r\ninternal F32 inf32(void);\r\ninternal F32 neg_inf32(void);\r\n\r\ninternal U16 bswap_u16(U16 x);\r\ninternal U32 bswap_u32(U32 x);\r\ninternal U64 bswap_u64(U64 x);\r\n\r\n#if ARCH_LITTLE_ENDIAN\r\n# define from_be_u16(x) bswap_u16(x)\r\n# define from_be_u32(x) bswap_u32(x)\r\n# define from_be_u64(x) bswap_u64(x)\r\n#else\r\n# define from_be_u16(x) (x)\r\n# define from_be_u32(x) (x)\r\n# define from_be_u64(x) (x)\r\n#endif\r\n\r\ninternal U64 count_bits_set32(U32 val);\r\ninternal U64 count_bits_set64(U64 val);\r\n\r\ninternal U64 ctz32(U32 val);\r\ninternal U64 ctz64(U64 val);\r\ninternal U64 clz32(U32 val);\r\ninternal U64 clz64(U64 val);\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> Sign\r\n\r\ninternal S32 sign_from_side_S32(Side side);\r\ninternal F32 sign_from_side_F32(Side side);\r\n\r\n////////////////////////////////\r\n//~ rjf: Memory Functions\r\n\r\ninternal B32 memory_is_zero(void *ptr, U64 size);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text 2D Coordinate/Range Functions\r\n\r\ninternal TxtPt txt_pt(S64 line, S64 column);\r\ninternal B32 txt_pt_match(TxtPt a, TxtPt b);\r\ninternal B32 txt_pt_less_than(TxtPt a, TxtPt b);\r\ninternal TxtPt txt_pt_min(TxtPt a, TxtPt b);\r\ninternal TxtPt txt_pt_max(TxtPt a, TxtPt b);\r\ninternal TxtRng txt_rng(TxtPt min, TxtPt max);\r\ninternal TxtRng txt_rng_intersect(TxtRng a, TxtRng b);\r\ninternal TxtRng txt_rng_union(TxtRng a, TxtRng b);\r\ninternal B32 txt_rng_contains(TxtRng r, TxtPt pt);\r\n\r\n////////////////////////////////\r\n//~ rjf: Toolchain/Environment Enum Functions\r\n\r\ninternal U64 bit_size_from_arch(Arch arch);\r\ninternal U64 byte_size_from_arch(Arch arch);\r\ninternal U64 max_instruction_size_from_arch(Arch arch);\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Functions\r\n\r\ninternal DenseTime dense_time_from_date_time(DateTime date_time);\r\ninternal DateTime  date_time_from_dense_time(DenseTime time);\r\ninternal DateTime  date_time_from_micro_seconds(U64 time);\r\ninternal DateTime  date_time_from_unix_time(U64 unix_time);\r\n\r\n////////////////////////////////\r\n//~ rjf: Non-Fancy Ring Buffer Reads/Writes\r\n\r\ninternal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size);\r\ninternal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size);\r\n#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr)))\r\n#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr)))\r\n\r\n////////////////////////////////\r\n//~ rjf: Sorts\r\n\r\n#define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function))\r\n\r\n////////////////////////////////\r\n\r\ninternal U64 u64_array_bsearch(U64 *arr, U64 count, U64 value);\r\n\r\n////////////////////////////////\r\n\r\ninternal U64 index_of_zero_u32(U32 *ptr, U64 count);\r\ninternal U64 index_of_zero_u64(U64 *ptr, U64 count);\r\n\r\n#endif // BASE_CORE_H\r\n"
  },
  {
    "path": "src/base/base_entry_point.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\nglobal U64 global_update_tick_idx = 0;\r\nglobal U64 async_threads_count = 0;\r\nglobal CondVar async_tick_start_cond_var = {0};\r\nglobal Mutex async_tick_start_mutex = {0};\r\nglobal Mutex async_tick_stop_mutex = {0};\r\nglobal B32 async_loop_again = 0;\r\nglobal B32 async_loop_again_high_priority = 0;\r\nglobal B32 global_async_exit = 0;\r\nthread_static B32 is_async_thread = 0;\r\n\r\ninternal void\r\nmain_thread_base_entry_point(int arguments_count, char **arguments)\r\n{\r\n  ThreadNameF(\"main_thread\");\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: set up async thread group info\r\n  async_tick_start_cond_var = cond_var_alloc();\r\n  async_tick_start_mutex = mutex_alloc();\r\n  async_tick_stop_mutex = mutex_alloc();\r\n  \r\n  //- rjf: set up telemetry\r\n#if PROFILE_TELEMETRY\r\n  local_persist char tm_data[MB(64)];\r\n  tmLoadLibrary(TM_RELEASE);\r\n  tmSetMaxThreadCount(256);\r\n  tmInitialize(sizeof(tm_data), tm_data);\r\n#endif\r\n  \r\n  //- rjf: set up spall\r\n#if PROFILE_SPALL\r\n  spall_profile = spall_init_file_ex(\"spall_capture\", 1, 0);\r\n#endif\r\n  \r\n  //- rjf: parse command line\r\n  String8List command_line_argument_strings = {0};\r\n  {\r\n    for EachIndex(idx, arguments_count)\r\n    {\r\n      str8_list_push(scratch.arena, &command_line_argument_strings, str8_cstring(arguments[idx]));\r\n    }\r\n  }\r\n  CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings);\r\n  \r\n  //- rjf: begin captures\r\n  B32 capture = cmd_line_has_flag(&cmdline, str8_lit(\"capture\"));\r\n  if(capture)\r\n  {\r\n    ProfBeginCapture(arguments[0]);\r\n    ProfMsg(BUILD_TITLE);\r\n  }\r\n  \r\n  //- rjf: initialize all included layers\r\n#if defined(ARTIFACT_CACHE_H) && !defined(AC_INIT_MANUAL)\r\n  ac_init();\r\n#endif\r\n#if defined(CONTENT_H) && !defined(C_INIT_MANUAL)\r\n  c_init();\r\n#endif\r\n#if defined(FILE_STREAM_H) && !defined(FS_INIT_MANUAL)\r\n  fs_init();\r\n#endif\r\n#if defined(MUTABLE_TEXT_H) && !defined(MTX_INIT_MANUAL)\r\n  mtx_init();\r\n#endif\r\n#if defined(DBG_INFO_H) && !defined(DI_INIT_MANUAL)\r\n  di_init(&cmdline);\r\n#endif\r\n#if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL)\r\n  dmn_init();\r\n#endif\r\n#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL)\r\n  ctrl_init();\r\n#endif\r\n#if defined(OS_GFX_H) && !defined(OS_GFX_INIT_MANUAL)\r\n  os_gfx_init();\r\n#endif\r\n#if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL)\r\n  fp_init();\r\n#endif\r\n#if defined(RENDER_CORE_H) && !defined(R_INIT_MANUAL)\r\n  r_init(&cmdline);\r\n#endif\r\n#if defined(FONT_CACHE_H) && !defined(FNT_INIT_MANUAL)\r\n  fnt_init();\r\n#endif\r\n#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL)\r\n  d_init();\r\n#endif\r\n#if defined(RADDBG_CORE_H) && !defined(RD_INIT_MANUAL)\r\n  rd_init(&cmdline);\r\n#endif\r\n  \r\n  //- rjf: launch async threads\r\n  Thread *async_threads = 0;\r\n  U64 lane_broadcast_val = 0;\r\n  {\r\n    U64 num_main_threads = 1;\r\n#if defined(CTRL_CORE_H)\r\n    num_main_threads += 1;\r\n#endif\r\n    U64 num_async_threads = os_get_system_info()->logical_processor_count;\r\n    U64 num_main_threads_clamped = Min(num_async_threads, num_main_threads);\r\n    num_async_threads -= num_main_threads_clamped;\r\n    String8 num_async_threads_string = cmd_line_string(&cmdline, str8_lit(\"async_thread_count\"));\r\n    if(num_async_threads_string.size != 0)\r\n    {\r\n      try_u64_from_str8_c_rules(num_async_threads_string, &num_async_threads);\r\n    }\r\n    num_async_threads = Max(1, num_async_threads);\r\n    Barrier barrier = barrier_alloc(num_async_threads);\r\n    LaneCtx *lane_ctxs = push_array(scratch.arena, LaneCtx, num_async_threads);\r\n    async_threads_count = num_async_threads;\r\n    async_threads = push_array(scratch.arena, Thread, async_threads_count);\r\n    for EachIndex(idx, num_async_threads)\r\n    {\r\n      lane_ctxs[idx].lane_idx = idx;\r\n      lane_ctxs[idx].lane_count = async_threads_count;\r\n      lane_ctxs[idx].barrier = barrier;\r\n      lane_ctxs[idx].broadcast_memory = &lane_broadcast_val;\r\n      async_threads[idx] = thread_launch(async_thread_entry_point, &lane_ctxs[idx]);\r\n    }\r\n  }\r\n  \r\n  //- rjf: call into entry point\r\n  entry_point(&cmdline);\r\n  \r\n  //- rjf: join async threads\r\n  ins_atomic_u32_inc_eval(&global_async_exit);\r\n  cond_var_broadcast(async_tick_start_cond_var);\r\n  for EachIndex(idx, async_threads_count)\r\n  {\r\n    thread_join(async_threads[idx], max_U64);\r\n  }\r\n  \r\n  //- rjf: end captures\r\n  if(capture)\r\n  {\r\n    ProfEndCapture();\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nsupplement_thread_base_entry_point(void (*entry_point)(void *params), void *params)\r\n{\r\n  TCTX *tctx = tctx_alloc();\r\n  tctx_select(tctx);\r\n  entry_point(params);\r\n  tctx_release(tctx);\r\n}\r\n\r\ninternal U64\r\nupdate_tick_idx(void)\r\n{\r\n  U64 result = ins_atomic_u64_eval(&global_update_tick_idx);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nupdate(void)\r\n{\r\n  ProfTick(0);\r\n  ins_atomic_u64_inc_eval(&global_update_tick_idx);\r\n#if defined(FONT_CACHE_H)\r\n  fnt_frame();\r\n#endif\r\n#if OS_FEATURE_GRAPHICAL\r\n  B32 result = frame();\r\n#else\r\n  B32 result = 0;\r\n#endif\r\n  return result;\r\n}\r\n\r\ninternal void\r\nasync_thread_entry_point(void *params)\r\n{\r\n  LaneCtx lctx = *(LaneCtx *)params;\r\n  lane_ctx(lctx);\r\n  is_async_thread = 1;\r\n  ThreadNameF(\"async_thread_%I64u\", lane_idx());\r\n  for(;;)\r\n  {\r\n    // rjf: wait for signal if we need, otherwise reset loop signal & continue\r\n    if(lane_idx() == 0)\r\n    {\r\n      if(!ins_atomic_u32_eval(&async_loop_again))\r\n      {\r\n        MutexScope(async_tick_start_mutex) cond_var_wait(async_tick_start_cond_var, async_tick_start_mutex, os_now_microseconds()+1000000);\r\n      }\r\n      ins_atomic_u32_eval_assign(&async_loop_again, 0);\r\n      ins_atomic_u32_eval_assign(&async_loop_again_high_priority, 0);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: do all ticks for all layers\r\n    ProfScope(\"async tick\")\r\n    {\r\n#if defined(ARTIFACT_CACHE_H)\r\n      ac_async_tick();\r\n#endif\r\n#if defined(CONTENT_H)\r\n      c_async_tick();\r\n#endif\r\n#if defined(FILE_STREAM_H)\r\n      fs_async_tick();\r\n#endif\r\n#if defined(DBG_INFO_H)\r\n      di_async_tick();\r\n#endif\r\n    }\r\n    \r\n    // rjf: take exit signal; break if set\r\n    lane_sync();\r\n    B32 need_exit = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      need_exit = ins_atomic_u32_eval(&global_async_exit);\r\n    }\r\n    lane_sync_u64(&need_exit, 0);\r\n    if(need_exit)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/base/base_entry_point.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_ENTRY_POINT_H\r\n#define BASE_ENTRY_POINT_H\r\n\r\ninternal void main_thread_base_entry_point(int argc, char **argv);\r\ninternal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params);\r\ninternal U64 update_tick_idx(void);\r\ninternal B32 update(void);\r\ninternal void async_thread_entry_point(void *params);\r\n\r\n#endif // BASE_ENTRY_POINT_H\r\n"
  },
  {
    "path": "src/base/base_hash.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: MD5\n\n#include \"third_party/martins_hash/md5.h\"\n\ninternal MD5\nmd5_from_data(String8 data)\n{\n  md5_ctx ctx = {0};\n  md5_init(&ctx);\n  md5_update(&ctx, (void*)data.str, data.size);\n  MD5 result = {0};\n  md5_finish(&ctx, result.u8);\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: SHA\n\n#include \"third_party/martins_hash/sha1.h\"\n#include \"third_party/martins_hash/sha256.h\"\n\ninternal SHA1\nsha1_from_data(String8 data)\n{\n  SHA1 result = {0};\n  {\n    sha1_ctx ctx = {0};\n    sha1_init(&ctx);\n    sha1_update(&ctx, data.str, data.size);\n    sha1_finish(&ctx, result.u8);\n  }\n  return result;\n}\n\ninternal SHA256\nsha256_from_data(String8 data)\n{\n  SHA256 result = {0};\n  {\n    sha256_ctx ctx = {0};\n    sha256_init(&ctx);\n    sha256_update(&ctx, data.str, data.size);\n    sha256_finish(&ctx, result.u8);\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/base/base_hash.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef BASE_HASH_H\n#define BASE_HASH_H\n\n////////////////////////////////\n//~ rjf: Hash Result Types\n\ntypedef union MD5 MD5;\nunion MD5\n{\n  U8 u8[16];\n  U16 u16[8];\n  U32 u32[4];\n  U64 u64[2];\n  U128 u128;\n};\n\ntypedef union SHA1 SHA1;\nunion SHA1\n{\n  U8 u8[20];\n};\n\ntypedef union SHA256 SHA256;\nunion SHA256\n{\n  U8 u8[32];\n  U16 u16[16];\n  U32 u32[8];\n  U64 u64[4];\n  U128 u128[2];\n  U256 u256;\n};\n\n////////////////////////////////\n//~ rjf: MD5\n\ninternal MD5 md5_from_data(String8 data);\n\n////////////////////////////////\n//~ rjf: SHA\n\ninternal SHA1 sha1_from_data(String8 data);\ninternal SHA256 sha256_from_data(String8 data);\n\n#endif // BASE_HASH_H\n"
  },
  {
    "path": "src/base/base_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Includes\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0x3399ccff\r\n\r\n#include \"base_core.c\"\r\n#include \"base_profile.c\"\r\n#include \"base_arena.c\"\r\n#include \"base_math.c\"\r\n#include \"base_strings.c\"\r\n#include \"base_hash.c\"\r\n#include \"base_threads.c\"\r\n#include \"base_thread_context.c\"\r\n#include \"base_command_line.c\"\r\n#include \"base_markup.c\"\r\n#include \"base_meta.c\"\r\n#include \"base_log.c\"\r\n#include \"base_entry_point.c\"\r\n"
  },
  {
    "path": "src/base/base_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_INC_H\r\n#define BASE_INC_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Includes\r\n\r\n#include \"base_context_cracking.h\"\r\n\r\n#include \"base_core.h\"\r\n#include \"base_profile.h\"\r\n#include \"base_arena.h\"\r\n#include \"base_math.h\"\r\n#include \"base_strings.h\"\r\n#include \"base_hash.h\"\r\n#include \"base_threads.h\"\r\n#include \"base_thread_context.h\"\r\n#include \"base_command_line.h\"\r\n#include \"base_markup.h\"\r\n#include \"base_meta.h\"\r\n#include \"base_log.h\"\r\n#include \"base_entry_point.h\"\r\n\r\n#endif // BASE_INC_H\r\n"
  },
  {
    "path": "src/base/base_log.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals/Thread-Locals\r\n\r\nC_LINKAGE thread_static Log *log_active;\r\n#if !BUILD_SUPPLEMENTARY_UNIT\r\nC_LINKAGE thread_static Log *log_active = 0;\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Creation/Selection\r\n\r\ninternal Log *\r\nlog_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  Log *log = push_array(arena, Log, 1);\r\n  log->arena = arena;\r\n  return log;\r\n}\r\n\r\ninternal void\r\nlog_release(Log *log)\r\n{\r\n  arena_release(log->arena);\r\n}\r\n\r\ninternal void\r\nlog_select(Log *log)\r\n{\r\n  log_active = log;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Building/Clearing\r\n\r\ninternal void\r\nlog_msg(LogMsgKind kind, String8 string)\r\n{\r\n  if(log_active != 0 && log_active->top_scope != 0)\r\n  {\r\n    String8 string_copy = push_str8_copy(log_active->arena, string);\r\n    str8_list_push(log_active->arena, &log_active->top_scope->strings[kind], string_copy);\r\n  }\r\n}\r\n\r\ninternal void\r\nlog_msgf(LogMsgKind kind, char *fmt, ...)\r\n{\r\n  if(log_active != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    va_list args;\r\n    va_start(args, fmt);\r\n    String8 string = push_str8fv(scratch.arena, fmt, args);\r\n    log_msg(kind, string);\r\n    va_end(args);\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Scopes\r\n\r\ninternal void\r\nlog_scope_begin(void)\r\n{\r\n  if(log_active != 0)\r\n  {\r\n    U64 pos = arena_pos(log_active->arena);\r\n    LogScope *scope = push_array(log_active->arena, LogScope, 1);\r\n    scope->pos = pos;\r\n    SLLStackPush(log_active->top_scope, scope);\r\n  }\r\n}\r\n\r\ninternal LogScopeResult\r\nlog_scope_end(Arena *arena)\r\n{\r\n  LogScopeResult result = {0};\r\n  if(log_active != 0)\r\n  {\r\n    LogScope *scope = log_active->top_scope;\r\n    if(scope != 0)\r\n    {\r\n      SLLStackPop(log_active->top_scope);\r\n      if(arena != 0)\r\n      {\r\n        for EachEnumVal(LogMsgKind, kind)\r\n        {\r\n          Temp scratch = scratch_begin(&arena, 1);\r\n          String8 result_unindented = str8_list_join(scratch.arena, &scope->strings[kind], 0);\r\n          result.strings[kind] = indented_from_string(arena, result_unindented);\r\n          scratch_end(scratch);\r\n        }\r\n      }\r\n      arena_pop_to(log_active->arena, scope->pos);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/base/base_log.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_LOG_H\r\n#define BASE_LOG_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Types\r\n\r\ntypedef enum LogMsgKind\r\n{\r\n  LogMsgKind_Info,\r\n  LogMsgKind_UserError,\r\n  LogMsgKind_COUNT\r\n}\r\nLogMsgKind;\r\n\r\ntypedef struct LogScope LogScope;\r\nstruct LogScope\r\n{\r\n  LogScope *next;\r\n  U64 pos;\r\n  String8List strings[LogMsgKind_COUNT];\r\n};\r\n\r\ntypedef struct LogScopeResult LogScopeResult;\r\nstruct LogScopeResult\r\n{\r\n  String8 strings[LogMsgKind_COUNT];\r\n};\r\n\r\ntypedef struct Log Log;\r\nstruct Log\r\n{\r\n  Arena *arena;\r\n  LogScope *top_scope;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Creation/Selection\r\n\r\ninternal Log *log_alloc(void);\r\ninternal void log_release(Log *log);\r\ninternal void log_select(Log *log);\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Building\r\n\r\ninternal void log_msg(LogMsgKind kind, String8 string);\r\ninternal void log_msgf(LogMsgKind kind, char *fmt, ...);\r\n#define log_info(s)          log_msg(LogMsgKind_Info, (s))\r\n#define log_infof(...)       log_msgf(LogMsgKind_Info, __VA_ARGS__)\r\n#define log_user_error(s)    log_msg(LogMsgKind_UserError, (s))\r\n#define log_user_errorf(...) log_msgf(LogMsgKind_UserError, __VA_ARGS__)\r\n\r\n#define LogInfoNamedBlock(s) DeferLoop(log_infof(\"%S:\\n{\\n\", (s)), log_infof(\"}\\n\"))\r\n#define LogInfoNamedBlockF(...) DeferLoop((log_infof(__VA_ARGS__), log_infof(\":\\n{\\n\")), log_infof(\"}\\n\"))\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Scopes\r\n\r\ninternal void log_scope_begin(void);\r\ninternal LogScopeResult log_scope_end(Arena *arena);\r\n\r\n#endif // BASE_LOG_H\r\n"
  },
  {
    "path": "src/base/base_markup.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal void\r\nset_thread_name(String8 string)\r\n{\r\n  ProfThreadName(\"%.*s\", str8_varg(string));\r\n  os_set_thread_name(string);\r\n}\r\n\r\ninternal void\r\nset_thread_namef(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  set_thread_name(string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n}\r\n"
  },
  {
    "path": "src/base/base_markup.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_MARKUP_H\r\n#define BASE_MARKUP_H\r\n\r\n#define RADDBG_MARKUP_IMPLEMENTATION\r\n#define RADDBG_MARKUP_VSNPRINTF raddbg_vsnprintf\r\n#if OS_LINUX\r\n# define RADDBG_MARKUP_STUBS\r\n#endif\r\n#include \"lib_raddbg_markup/raddbg_markup.h\"\r\n\r\n#if !defined(LAYER_COLOR)\r\n# define LAYER_COLOR 0x404040ff\r\n#endif\r\n\r\ninternal void set_thread_name(String8 string);\r\ninternal void set_thread_namef(char *fmt, ...);\r\n#define ThreadNameF(...) (set_thread_namef(__VA_ARGS__), raddbg_thread_color_u32(LAYER_COLOR))\r\n\r\n#endif // BASE_MARKUP_H\r\n"
  },
  {
    "path": "src/base/base_math.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Scalar Math Ops\r\n\r\ninternal F32\r\nmix_1f32(F32 a, F32 b, F32 t)\r\n{\r\n  F32 c = (a + (b-a) * Clamp(0.f, t, 1.f));\r\n  return c;\r\n}\r\n\r\ninternal F64\r\nmix_1f64(F64 a, F64 b, F64 t)\r\n{\r\n  F64 c = (a + (b-a) * Clamp(0.0, t, 1.0));\r\n  return c;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Vector Ops\r\n\r\ninternal Vec2F32 vec_2f32(F32 x, F32 y)                         {Vec2F32 v = {x, y}; return v;}\r\ninternal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;}\r\ninternal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;}\r\ninternal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;}\r\ninternal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;}\r\ninternal Vec2F32 scale_2f32(Vec2F32 v, F32 s)                   {Vec2F32 c = {v.x*s, v.y*s}; return c;}\r\ninternal F32 dot_2f32(Vec2F32 a, Vec2F32 b)                     {F32 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal F32 length_squared_2f32(Vec2F32 v)                     {F32 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal F32 length_2f32(Vec2F32 v)                             {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;}\r\ninternal Vec2F32 normalize_2f32(Vec2F32 v)                      {v = scale_2f32(v, 1.f/length_2f32(v)); return v;}\r\ninternal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t)          {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;}\r\n\r\ninternal Vec2S64 vec_2s64(S64 x, S64 y)                         {Vec2S64 v = {x, y}; return v;}\r\ninternal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;}\r\ninternal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;}\r\ninternal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;}\r\ninternal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;}\r\ninternal Vec2S64 scale_2s64(Vec2S64 v, S64 s)                   {Vec2S64 c = {v.x*s, v.y*s}; return c;}\r\ninternal S64 dot_2s64(Vec2S64 a, Vec2S64 b)                     {S64 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal S64 length_squared_2s64(Vec2S64 v)                     {S64 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal S64 length_2s64(Vec2S64 v)                             {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;}\r\ninternal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t)          {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;}\r\n\r\ninternal Vec2S32 vec_2s32(S32 x, S32 y)                         {Vec2S32 v = {x, y}; return v;}\r\ninternal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;}\r\ninternal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;}\r\ninternal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;}\r\ninternal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;}\r\ninternal Vec2S32 scale_2s32(Vec2S32 v, S32 s)                   {Vec2S32 c = {v.x*s, v.y*s}; return c;}\r\ninternal S32 dot_2s32(Vec2S32 a, Vec2S32 b)                     {S32 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal S32 length_squared_2s32(Vec2S32 v)                     {S32 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal S32 length_2s32(Vec2S32 v)                             {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;}\r\ninternal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t)          {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;}\r\n\r\ninternal Vec2S16 vec_2s16(S16 x, S16 y)                         {Vec2S16 v = {x, y}; return v;}\r\ninternal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;}\r\ninternal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;}\r\ninternal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;}\r\ninternal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;}\r\ninternal Vec2S16 scale_2s16(Vec2S16 v, S16 s)                   {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;}\r\ninternal S16 dot_2s16(Vec2S16 a, Vec2S16 b)                     {S16 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal S16 length_squared_2s16(Vec2S16 v)                     {S16 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal S16 length_2s16(Vec2S16 v)                             {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;}\r\ninternal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t)          {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;}\r\n\r\ninternal Vec3F32 vec_3f32(F32 x, F32 y, F32 z)                  {Vec3F32 v = {x, y, z}; return v;}\r\ninternal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;}\r\ninternal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;}\r\ninternal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;}\r\ninternal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;}\r\ninternal Vec3F32 scale_3f32(Vec3F32 v, F32 s)                   {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;}\r\ninternal F32 dot_3f32(Vec3F32 a, Vec3F32 b)                     {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;}\r\ninternal F32 length_squared_3f32(Vec3F32 v)                     {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;}\r\ninternal F32 length_3f32(Vec3F32 v)                             {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;}\r\ninternal Vec3F32 normalize_3f32(Vec3F32 v)                      {v = scale_3f32(v, 1.f/length_3f32(v)); return v;}\r\ninternal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t)          {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;}\r\ninternal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b)               {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;}\r\ninternal Vec3F32 xform_3f32(Vec3F32 v, Mat3x3F32 m)\r\n{\r\n  Vec3F32 result;\r\n  result.x = v.x*m.v[0][0] + v.y*m.v[1][0] + v.z*m.v[2][0];\r\n  result.y = v.x*m.v[0][1] + v.y*m.v[1][1] + v.z*m.v[2][1];\r\n  result.z = v.x*m.v[0][2] + v.y*m.v[1][2] + v.z*m.v[2][2];\r\n  return result;\r\n}\r\n\r\ninternal Vec3S32 vec_3s32(S32 x, S32 y, S32 z)                  {Vec3S32 v = {x, y, z}; return v;}\r\ninternal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;}\r\ninternal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;}\r\ninternal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;}\r\ninternal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;}\r\ninternal Vec3S32 scale_3s32(Vec3S32 v, S32 s)                   {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;}\r\ninternal S32 dot_3s32(Vec3S32 a, Vec3S32 b)                     {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;}\r\ninternal S32 length_squared_3s32(Vec3S32 v)                     {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;}\r\ninternal S32 length_3s32(Vec3S32 v)                             {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;}\r\ninternal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t)          {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;}\r\ninternal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b)               {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;}\r\n\r\ninternal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w)           {Vec4F32 v = {x, y, z, w}; return v;}\r\ninternal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;}\r\ninternal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;}\r\ninternal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;}\r\ninternal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;}\r\ninternal Vec4F32 scale_4f32(Vec4F32 v, F32 s)                   {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;}\r\ninternal F32 dot_4f32(Vec4F32 a, Vec4F32 b)                     {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;}\r\ninternal F32 length_squared_4f32(Vec4F32 v)                     {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;}\r\ninternal F32 length_4f32(Vec4F32 v)                             {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;}\r\ninternal Vec4F32 normalize_4f32(Vec4F32 v)                      {v = scale_4f32(v, 1.f/length_4f32(v)); return v;}\r\ninternal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t)          {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;}\r\n\r\ninternal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w)           {Vec4S32 v = {x, y, z, w}; return v;}\r\ninternal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;}\r\ninternal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;}\r\ninternal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;}\r\ninternal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;}\r\ninternal Vec4S32 scale_4s32(Vec4S32 v, S32 s)                   {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;}\r\ninternal S32 dot_4s32(Vec4S32 a, Vec4S32 b)                     {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;}\r\ninternal S32 length_squared_4s32(Vec4S32 v)                     {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;}\r\ninternal S32 length_4s32(Vec4S32 v)                             {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;}\r\ninternal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t)          {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;}\r\n\r\n////////////////////////////////\r\n//~ rjf: Matrix Ops\r\n\r\ninternal Mat3x3F32\r\nmat_3x3f32(F32 diagonal)\r\n{\r\n  Mat3x3F32 result = {0};\r\n  result.v[0][0] = diagonal;\r\n  result.v[1][1] = diagonal;\r\n  result.v[2][2] = diagonal;\r\n  return result;\r\n}\r\n\r\ninternal Mat3x3F32\r\nmake_translate_3x3f32(Vec2F32 delta)\r\n{\r\n  Mat3x3F32 mat = mat_3x3f32(1.f);\r\n  mat.v[2][0] = delta.x;\r\n  mat.v[2][1] = delta.y;\r\n  return mat;\r\n}\r\n\r\ninternal Mat3x3F32\r\nmake_scale_3x3f32(Vec2F32 scale)\r\n{\r\n  Mat3x3F32 mat = mat_3x3f32(1.f);\r\n  mat.v[0][0] = scale.x;\r\n  mat.v[1][1] = scale.y;\r\n  return mat;\r\n}\r\n\r\ninternal Mat3x3F32\r\nmul_3x3f32(Mat3x3F32 a, Mat3x3F32 b)\r\n{\r\n  Mat3x3F32 c = {0};\r\n  for(int j = 0; j < 3; j += 1)\r\n  {\r\n    for(int i = 0; i < 3; i += 1)\r\n    {\r\n      c.v[i][j] = (a.v[0][j]*b.v[i][0] +\r\n                   a.v[1][j]*b.v[i][1] +\r\n                   a.v[2][j]*b.v[i][2]);\r\n    }\r\n  }\r\n  return c;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmat_4x4f32(F32 diagonal)\r\n{\r\n  Mat4x4F32 result = {0};\r\n  result.v[0][0] = diagonal;\r\n  result.v[1][1] = diagonal;\r\n  result.v[2][2] = diagonal;\r\n  result.v[3][3] = diagonal;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_translate_4x4f32(Vec3F32 delta)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  result.v[3][0] = delta.x;\r\n  result.v[3][1] = delta.y;\r\n  result.v[3][2] = delta.z;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_scale_4x4f32(Vec3F32 scale)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  result.v[0][0] = scale.x;\r\n  result.v[1][1] = scale.y;\r\n  result.v[2][2] = scale.z;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  F32 tan_theta_over_2 = tan_f32(fov / 2);\r\n  result.v[0][0] = 1.f / tan_theta_over_2;\r\n  result.v[1][1] = aspect_ratio / tan_theta_over_2;\r\n  result.v[2][3] = 1.f;\r\n  result.v[2][2] = -(near_z + far_z) / (near_z - far_z);\r\n  result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z);\r\n  result.v[3][3] = 0.f;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  \r\n  result.v[0][0] = 2.f / (right - left);\r\n  result.v[1][1] = 2.f / (top - bottom);\r\n  result.v[2][2] = 2.f / (far_z - near_z);\r\n  result.v[3][3] = 1.f;\r\n  \r\n  result.v[3][0] = (left + right) / (left - right);\r\n  result.v[3][1] = (bottom + top) / (bottom - top);\r\n  result.v[3][2] = (near_z + far_z) / (near_z - far_z);\r\n  \r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up)\r\n{\r\n  Mat4x4F32 result;\r\n  Vec3F32 f = normalize_3f32(sub_3f32(eye, center));\r\n  Vec3F32 s = normalize_3f32(cross_3f32(f, up));\r\n  Vec3F32 u = cross_3f32(s, f);\r\n  result.v[0][0] = s.x;\r\n  result.v[0][1] = u.x;\r\n  result.v[0][2] = -f.x;\r\n  result.v[0][3] = 0.0f;\r\n  result.v[1][0] = s.y;\r\n  result.v[1][1] = u.y;\r\n  result.v[1][2] = -f.y;\r\n  result.v[1][3] = 0.0f;\r\n  result.v[2][0] = s.z;\r\n  result.v[2][1] = u.z;\r\n  result.v[2][2] = -f.z;\r\n  result.v[2][3] = 0.0f;\r\n  result.v[3][0] = -dot_3f32(s, eye);\r\n  result.v[3][1] = -dot_3f32(u, eye);\r\n  result.v[3][2] = dot_3f32(f, eye);\r\n  result.v[3][3] = 1.0f;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_rotate_4x4f32(Vec3F32 axis, F32 turns)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  axis = normalize_3f32(axis);\r\n  F32 sin_theta = sin_f32(turns);\r\n  F32 cos_theta = cos_f32(turns);\r\n  F32 cos_value = 1.f - cos_theta;\r\n  result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta;\r\n  result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta);\r\n  result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta);\r\n  result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta);\r\n  result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta;\r\n  result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta);\r\n  result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta);\r\n  result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta);\r\n  result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmul_4x4f32(Mat4x4F32 a, Mat4x4F32 b)\r\n{\r\n  Mat4x4F32 c = {0};\r\n  for(int j = 0; j < 4; j += 1)\r\n  {\r\n    for(int i = 0; i < 4; i += 1)\r\n    {\r\n      c.v[i][j] = (a.v[0][j]*b.v[i][0] +\r\n                   a.v[1][j]*b.v[i][1] +\r\n                   a.v[2][j]*b.v[i][2] +\r\n                   a.v[3][j]*b.v[i][3]);\r\n    }\r\n  }\r\n  return c;\r\n}\r\n\r\ninternal Mat4x4F32\r\nscale_4x4f32(Mat4x4F32 m, F32 scale)\r\n{\r\n  for(int j = 0; j < 4; j += 1)\r\n  {\r\n    for(int i = 0; i < 4; i += 1)\r\n    {\r\n      m.v[i][j] *= scale;\r\n    }\r\n  }\r\n  return m;\r\n}\r\n\r\ninternal Mat4x4F32\r\ninverse_4x4f32(Mat4x4F32 m)\r\n{\r\n  F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3];\r\n  F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3];\r\n  F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3];\r\n  F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3];\r\n  F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3];\r\n  F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3];\r\n  F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2];\r\n  F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2];\r\n  F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2];\r\n  F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3];\r\n  F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3];\r\n  F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3];\r\n  F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2];\r\n  F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2];\r\n  F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2];\r\n  F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1];\r\n  F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1];\r\n  F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1];\r\n  \r\n  Vec4F32 fac0 = { coef00, coef00, coef02, coef03 };\r\n  Vec4F32 fac1 = { coef04, coef04, coef06, coef07 };\r\n  Vec4F32 fac2 = { coef08, coef08, coef10, coef11 };\r\n  Vec4F32 fac3 = { coef12, coef12, coef14, coef15 };\r\n  Vec4F32 fac4 = { coef16, coef16, coef18, coef19 };\r\n  Vec4F32 fac5 = { coef20, coef20, coef22, coef23 };\r\n  \r\n  Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] };\r\n  Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] };\r\n  Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] };\r\n  Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] };\r\n  \r\n  Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2));\r\n  Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4));\r\n  Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5));\r\n  Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5));\r\n  \r\n  Vec4F32 sign_a = { +1, -1, +1, -1 };\r\n  Vec4F32 sign_b = { -1, +1, -1, +1 };\r\n  \r\n  Mat4x4F32 inverse;\r\n  for(U32 i = 0; i < 4; i += 1)\r\n  {\r\n    inverse.v[0][i] = inv0.v[i] * sign_a.v[i];\r\n    inverse.v[1][i] = inv1.v[i] * sign_b.v[i];\r\n    inverse.v[2][i] = inv2.v[i] * sign_a.v[i];\r\n    inverse.v[3][i] = inv3.v[i] * sign_b.v[i];\r\n  }\r\n  \r\n  Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] };\r\n  Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] };\r\n  Vec4F32 dot0 = mul_4f32(m0, row0);\r\n  F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w);\r\n  \r\n  F32 one_over_det = 1 / dot1;\r\n  \r\n  return scale_4x4f32(inverse, one_over_det);\r\n}\r\n\r\ninternal Mat4x4F32\r\nderotate_4x4f32(Mat4x4F32 mat)\r\n{\r\n  Vec3F32 scale =\r\n  {\r\n    length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])),\r\n    length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])),\r\n    length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])),\r\n  };\r\n  mat.v[0][0] = scale.x;\r\n  mat.v[1][0] = 0.f;\r\n  mat.v[2][0] = 0.f;\r\n  mat.v[0][1] = 0.f;\r\n  mat.v[1][1] = scale.y;\r\n  mat.v[2][1] = 0.f;\r\n  mat.v[0][2] = 0.f;\r\n  mat.v[1][2] = 0.f;\r\n  mat.v[2][2] = scale.z;\r\n  return mat;\r\n}\r\n\r\ninternal Mat4x4F32\r\ntranspose_4x4f32(Mat4x4F32 mat)\r\n{\r\n  Mat4x4F32 result =\r\n  {\r\n    {\r\n      mat.v[0][0], mat.v[1][0], mat.v[2][0], mat.v[3][0],\r\n      mat.v[0][1], mat.v[1][1], mat.v[2][1], mat.v[3][1],\r\n      mat.v[0][2], mat.v[1][2], mat.v[2][2], mat.v[3][2],\r\n      mat.v[0][3], mat.v[1][3], mat.v[2][3], mat.v[3][3],\r\n    }\r\n  };\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Range Ops\r\n\r\ninternal Rng1U32 rng_1u32(U32 min, U32 max)                     {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;}\r\ninternal Rng1U32 shift_1u32(Rng1U32 r, U32 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1U32 pad_1u32(Rng1U32 r, U32 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal U32 center_1u32(Rng1U32 r)                             {U32 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1u32(Rng1U32 r, U32 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal U32 dim_1u32(Rng1U32 r)                                {U32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b)               {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b)           {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal U32 clamp_1u32(Rng1U32 r, U32 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1S32 rng_1s32(S32 min, S32 max)                     {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;}\r\ninternal Rng1S32 shift_1s32(Rng1S32 r, S32 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1S32 pad_1s32(Rng1S32 r, S32 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal S32 center_1s32(Rng1S32 r)                             {S32 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1s32(Rng1S32 r, S32 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal S32 dim_1s32(Rng1S32 r)                                {S32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b)               {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b)           {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal S32 clamp_1s32(Rng1S32 r, S32 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1U64 rng_1u64(U64 min, U64 max)                     {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;}\r\ninternal Rng1U64 shift_1u64(Rng1U64 r, U64 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1U64 pad_1u64(Rng1U64 r, U64 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal U64 center_1u64(Rng1U64 r)                             {U64 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1u64(Rng1U64 r, U64 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal U64 dim_1u64(Rng1U64 r)                                {U64 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b)               {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b)           {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal U64 clamp_1u64(Rng1U64 r, U64 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1S64 rng_1s64(S64 min, S64 max)                     {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;}\r\ninternal Rng1S64 shift_1s64(Rng1S64 r, S64 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1S64 pad_1s64(Rng1S64 r, S64 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal S64 center_1s64(Rng1S64 r)                             {S64 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1s64(Rng1S64 r, S64 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal S64 dim_1s64(Rng1S64 r)                                {S64 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b)               {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b)           {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal S64 clamp_1s64(Rng1S64 r, S64 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1F32 rng_1f32(F32 min, F32 max)                     {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;}\r\ninternal Rng1F32 shift_1f32(Rng1F32 r, F32 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1F32 pad_1f32(Rng1F32 r, F32 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal F32 center_1f32(Rng1F32 r)                             {F32 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1f32(Rng1F32 r, F32 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal F32 dim_1f32(Rng1F32 r)                                {F32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b)               {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b)           {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal F32 clamp_1f32(Rng1F32 r, F32 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max)             {Rng2S16 r = {min, max}; return r;}\r\ninternal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x)               {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;}\r\ninternal Rng2S16 pad_2s16(Rng2S16 r, S16 x)                     {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;}\r\ninternal Vec2S16 center_2s16(Rng2S16 r)                         {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;}\r\ninternal B32 contains_2s16(Rng2S16 r, Vec2S16 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2S16 dim_2s16(Rng2S16 r)                            {Vec2S16 dim = {(S16)(((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0)), (S16)(((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0))}; return dim;}\r\ninternal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b)               {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b)           {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\ninternal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max)             {Rng2S32 r = {min, max}; return r;}\r\ninternal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x)               {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;}\r\ninternal Rng2S32 pad_2s32(Rng2S32 r, S32 x)                     {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;}\r\ninternal Vec2S32 center_2s32(Rng2S32 r)                         {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;}\r\ninternal B32 contains_2s32(Rng2S32 r, Vec2S32 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2S32 dim_2s32(Rng2S32 r)                            {Vec2S32 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;}\r\ninternal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b)               {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b)           {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\ninternal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max)             {Rng2S64 r = {min, max}; return r;}\r\ninternal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x)               {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;}\r\ninternal Rng2S64 pad_2s64(Rng2S64 r, S64 x)                     {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;}\r\ninternal Vec2S64 center_2s64(Rng2S64 r)                         {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;}\r\ninternal B32 contains_2s64(Rng2S64 r, Vec2S64 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2S64 dim_2s64(Rng2S64 r)                            {Vec2S64 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;}\r\ninternal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b)               {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b)           {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\ninternal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max)             {Rng2F32 r = {min, max}; return r;}\r\ninternal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x)               {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;}\r\ninternal Rng2F32 pad_2f32(Rng2F32 r, F32 x)                     {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;}\r\ninternal Vec2F32 center_2f32(Rng2F32 r)                         {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;}\r\ninternal B32 contains_2f32(Rng2F32 r, Vec2F32 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2F32 dim_2f32(Rng2F32 r)                            {Vec2F32 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;}\r\ninternal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b)               {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b)           {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\n////////////////////////////////\r\n//~ rjf: Color Operations\r\n\r\n//- rjf: hsv <-> rgb\r\n\r\ninternal Vec3F32\r\nhsv_from_rgb(Vec3F32 rgb)\r\n{\r\n  F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z));\r\n  F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z));\r\n  F32 delta = c_max - c_min;\r\n  F32 h = ((delta == 0.f) ? 0.f :\r\n           (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) :\r\n           (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f :\r\n           (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f :\r\n           0.f);\r\n  F32 s = (c_max == 0.f) ? 0.f : (delta/c_max);\r\n  F32 v = c_max;\r\n  Vec3F32 hsv = {h/6.f, s, v};\r\n  return hsv;\r\n}\r\n\r\ninternal Vec3F32\r\nrgb_from_hsv(Vec3F32 hsv)\r\n{\r\n  F32 h = mod_f32(hsv.x * 360.f, 360.f);\r\n  F32 s = hsv.y;\r\n  F32 v = hsv.z;\r\n  \r\n  F32 c = v*s;\r\n  F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f));\r\n  F32 m = v - c;\r\n  \r\n  F32 r = 0;\r\n  F32 g = 0;\r\n  F32 b = 0;\r\n  \r\n  if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){\r\n    r = c;\r\n    g = x;\r\n    b = 0;\r\n  }\r\n  else if (h >= 60.f && h < 120.f){\r\n    r = x;\r\n    g = c;\r\n    b = 0;\r\n  }\r\n  else if (h >= 120.f && h < 180.f){\r\n    r = 0;\r\n    g = c;\r\n    b = x;\r\n  }\r\n  else if (h >= 180.f && h < 240.f){\r\n    r = 0;\r\n    g = x;\r\n    b = c;\r\n  }\r\n  else if (h >= 240.f && h < 300.f){\r\n    r = x;\r\n    g = 0;\r\n    b = c;\r\n  }\r\n  else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){\r\n    r = c;\r\n    g = 0;\r\n    b = x;\r\n  }\r\n  \r\n  Vec3F32 rgb = {r + m, g + m, b + m};\r\n  return(rgb);\r\n}\r\n\r\ninternal Vec4F32\r\nhsva_from_rgba(Vec4F32 rgba)\r\n{\r\n  Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z);\r\n  Vec3F32 hsv = hsv_from_rgb(rgb);\r\n  Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w);\r\n  return hsva;\r\n}\r\n\r\ninternal Vec4F32\r\nrgba_from_hsva(Vec4F32 hsva)\r\n{\r\n  Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z);\r\n  Vec3F32 rgb = rgb_from_hsv(hsv);\r\n  Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w);\r\n  return rgba;\r\n}\r\n\r\n//- rjf: srgb <-> linear\r\n\r\ninternal Vec3F32\r\nlinear_from_srgb(Vec3F32 srgb)\r\n{\r\n  Vec3F32 result;\r\n  for EachElement(idx, srgb.v)\r\n  {\r\n    result.v[idx] = (srgb.v[idx] < 0.0404482362771082f ? srgb.v[idx] / 12.92f : pow_f32((srgb.v[idx] + 0.055f) / 1.055f, 2.4f));\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Vec3F32\r\nsrgb_from_linear(Vec3F32 linear)\r\n{\r\n  Vec3F32 result;\r\n  for EachElement(idx, linear.v)\r\n  {\r\n    result.v[idx] = (0 <= linear.v[idx] && linear.v[idx] < 0.00313066844250063) ? linear.v[idx]*12.92f : 1.05f * pow_f32(linear.v[idx], 1.f/2.4f) - 0.055f;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nlinear_from_srgba(Vec4F32 srgba)\r\n{\r\n  Vec4F32 result;\r\n  result.xyz = linear_from_srgb(srgba.xyz);\r\n  result.w = srgba.w;\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nsrgba_from_linear(Vec4F32 linear)\r\n{\r\n  Vec4F32 result;\r\n  result.xyz = srgb_from_linear(linear.xyz);\r\n  result.w = linear.w;\r\n  return result;\r\n}\r\n\r\n//- rjf: oklab <-> linear\r\n\r\ninternal Vec3F32\r\noklab_from_linear(Vec3F32 linear)\r\n{\r\n  F32 l = (0.4122214708f * linear.x + 0.5363325363f * linear.y + 0.0514459929f * linear.z);\r\n\tF32 m = (0.2119034982f * linear.x + 0.6806995451f * linear.y + 0.1073969566f * linear.z);\r\n\tF32 s = (0.0883024619f * linear.x + 0.2817188376f * linear.y + 0.6299787005f * linear.z);\r\n  F32 l_ = cbrt_f32(l);\r\n  F32 m_ = cbrt_f32(m);\r\n  F32 s_ = cbrt_f32(s);\r\n  Vec3F32 result;\r\n  result.x = 0.2104542553f*l_ + 0.7936177850f*m_ - 0.0040720468f*s_;\r\n  result.y = 1.9779984951f*l_ - 2.4285922050f*m_ + 0.4505937099f*s_;\r\n  result.z = 0.0259040371f*l_ + 0.7827717662f*m_ - 0.8086757660f*s_;\r\n  return result;\r\n}\r\n\r\ninternal Vec3F32\r\nlinear_from_oklab(Vec3F32 oklab)\r\n{\r\n  F32 l_ = oklab.x + 0.3963377774f * oklab.y + 0.2158037573f * oklab.z;\r\n  F32 m_ = oklab.x - 0.1055613458f * oklab.y - 0.0638541728f * oklab.z;\r\n  F32 s_ = oklab.x - 0.0894841775f * oklab.y - 1.2914855480f * oklab.z;\r\n  F32 l = l_*l_*l_;\r\n  F32 m = m_*m_*m_;\r\n  F32 s = s_*s_*s_;\r\n  Vec3F32 result;\r\n  result.x = +4.0767416621f * l - 3.3077115913f * m + 0.2309699292f * s;\r\n  result.y = -1.2684380046f * l + 2.6097574011f * m - 0.3413193965f * s;\r\n  result.z = -0.0041960863f * l - 0.7034186147f * m + 1.7076147010f * s;\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\noklab_from_lineara(Vec4F32 lineara)\r\n{\r\n  Vec4F32 result;\r\n  result.xyz = oklab_from_linear(lineara.xyz);\r\n  result.w = lineara.w;\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nlineara_from_oklab(Vec4F32 oklab)\r\n{\r\n  Vec4F32 result;\r\n  result.xyz = linear_from_oklab(oklab.xyz);\r\n  result.w = oklab.w;\r\n  return result;\r\n}\r\n\r\n//- rjf: rgba <-> u32\r\n\r\ninternal U32\r\nu32_from_rgba(Vec4F32 rgba)\r\n{\r\n  U32 result = 0;\r\n  result |= ((U32)((U8)(rgba.x*255.f))) << 24;\r\n  result |= ((U32)((U8)(rgba.y*255.f))) << 16;\r\n  result |= ((U32)((U8)(rgba.z*255.f))) <<  8;\r\n  result |= ((U32)((U8)(rgba.w*255.f))) <<  0;\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nrgba_from_u32(U32 hex)\r\n{\r\n  Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f,\r\n                         ((hex&0x00ff0000)>>16)/255.f,\r\n                         ((hex&0x0000ff00)>> 8)/255.f,\r\n                         ((hex&0x000000ff)>> 0)/255.f);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: List Type Functions\r\n\r\ninternal void\r\nrng1u64_list_push_node(Rng1U64List *list, Rng1U64Node *n)\r\n{\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal Rng1U64Node *\r\nrng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng)\r\n{\r\n  Rng1U64Node *n = push_array(arena, Rng1U64Node, 1);\r\n  MemoryCopyStruct(&n->v, &rng);\r\n  rng1u64_list_push_node(list, n);\r\n  return n;\r\n}\r\n\r\ninternal void\r\nrng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat)\r\n{\r\n  if(to_concat->first)\r\n  {\r\n    if(list->first)\r\n    {\r\n      list->last->next = to_concat->first;\r\n      list->last       = to_concat->last;\r\n    }\r\n    else\r\n    {\r\n      list->first = to_concat->first;\r\n      list->last  = to_concat->last;\r\n    }\r\n    MemoryZeroStruct(to_concat);\r\n  }\r\n}\r\n\r\ninternal Rng1U64Array\r\nrng1u64_array_from_list(Arena *arena, Rng1U64List *list)\r\n{\r\n  Rng1U64Array arr = {0};\r\n  arr.count        = list->count;\r\n  arr.v            = push_array_no_zero(arena, Rng1U64, arr.count);\r\n  U64 idx = 0;\r\n  for(Rng1U64Node *n = list->first; n != 0; n = n->next)\r\n  {\r\n    arr.v[idx] = n->v;\r\n    idx += 1;\r\n  }\r\n  return arr;\r\n}\r\n\r\ninternal U64\r\nrng_1u64_array_bsearch(Rng1U64Array arr, U64 value)\r\n{\r\n  if(arr.count > 0 && arr.v[0].min < value && value < arr.v[arr.count-1].max)\r\n  {\r\n    U64 l = 0;\r\n    U64 r = arr.count - 1;\r\n    for(; l <= r; )\r\n    {\r\n      U64 m = l + (r - l) / 2;\r\n      if(contains_1u64(arr.v[m], value))\r\n      {\r\n        return m;\r\n      }\r\n      else if(arr.v[m].min < value)\r\n      {\r\n        l = m + 1;\r\n      }\r\n      else\r\n      {\r\n        r = m - 1;\r\n      }\r\n    }\r\n  }\r\n  else if(arr.count == 1 && contains_1u64(arr.v[0], value))\r\n  {\r\n    return 0;\r\n  }\r\n  return max_U64;\r\n}\r\n\r\ninternal void\r\nrng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng)\r\n{\r\n  Rng1S64Node *n = push_array(arena, Rng1S64Node, 1);\r\n  MemoryCopyStruct(&n->v, &rng);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal Rng1S64Array\r\nrng1s64_array_from_list(Arena *arena, Rng1S64List *list)\r\n{\r\n  Rng1S64Array arr = {0};\r\n  arr.count = list->count;\r\n  arr.v = push_array_no_zero(arena, Rng1S64, arr.count);\r\n  U64 idx = 0;\r\n  for(Rng1S64Node *n = list->first; n != 0; n = n->next)\r\n  {\r\n    arr.v[idx] = n->v;\r\n    idx += 1;\r\n  }\r\n  return arr;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: N -> M Element Subdivision\r\n\r\ninternal Rng1U64\r\nm_range_from_n_idx_m_count(U64 n_idx, U64 n_count, U64 m_count)\r\n{\r\n  U64 main_idxes_per_lane = m_count/n_count;\r\n  U64 leftover_idxes_count = m_count - main_idxes_per_lane*n_count;\r\n  U64 leftover_idxes_before_this_lane_count = Min(n_idx, leftover_idxes_count);\r\n  U64 lane_base_idx = n_idx*main_idxes_per_lane + leftover_idxes_before_this_lane_count;\r\n  U64 lane_base_idx__clamped = Min(lane_base_idx, m_count);\r\n  U64 lane_opl_idx = lane_base_idx__clamped + main_idxes_per_lane + ((n_idx < leftover_idxes_count) ? 1 : 0);\r\n  U64 lane_opl_idx__clamped = Min(lane_opl_idx, m_count);\r\n  Rng1U64 result = r1u64(lane_base_idx__clamped, lane_opl_idx__clamped);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/base/base_math.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef BASE_MATH_H\n#define BASE_MATH_H\n\n////////////////////////////////\n//~ rjf: Vector Types\n\n//- rjf: 2-vectors\n\ntypedef union Vec2F32 Vec2F32;\nunion Vec2F32\n{\n  struct\n  {\n    F32 x;\n    F32 y;\n  };\n  F32 v[2];\n};\n\ntypedef union Vec2S64 Vec2S64;\nunion Vec2S64\n{\n  struct\n  {\n    S64 x;\n    S64 y;\n  };\n  S64 v[2];\n};\n\ntypedef union Vec2S32 Vec2S32;\nunion Vec2S32\n{\n  struct\n  {\n    S32 x;\n    S32 y;\n  };\n  S32 v[2];\n};\n\ntypedef union Vec2S16 Vec2S16;\nunion Vec2S16\n{\n  struct\n  {\n    S16 x;\n    S16 y;\n  };\n  S16 v[2];\n};\n\n//- rjf: 3-vectors\n\ntypedef union Vec3F32 Vec3F32;\nunion Vec3F32\n{\n  struct\n  {\n    F32 x;\n    F32 y;\n    F32 z;\n  };\n  struct\n  {\n    Vec2F32 xy;\n    F32 _z0;\n  };\n  struct\n  {\n    F32 _x0;\n    Vec2F32 yz;\n  };\n  F32 v[3];\n};\n\ntypedef union Vec3S32 Vec3S32;\nunion Vec3S32\n{\n  struct\n  {\n    S32 x;\n    S32 y;\n    S32 z;\n  };\n  struct\n  {\n    Vec2S32 xy;\n    S32 _z0;\n  };\n  struct\n  {\n    S32 _x0;\n    Vec2S32 yz;\n  };\n  S32 v[3];\n};\n\n//- rjf: 4-vectors\n\ntypedef union Vec4F32 Vec4F32;\nunion Vec4F32\n{\n  struct\n  {\n    F32 x;\n    F32 y;\n    F32 z;\n    F32 w;\n  };\n  struct\n  {\n    Vec2F32 xy;\n    Vec2F32 zw;\n  };\n  struct\n  {\n    Vec3F32 xyz;\n    F32 _z0;\n  };\n  struct\n  {\n    F32 _x0;\n    Vec3F32 yzw;\n  };\n  F32 v[4];\n};\n\ntypedef union Vec4S32 Vec4S32;\nunion Vec4S32\n{\n  struct\n  {\n    S32 x;\n    S32 y;\n    S32 z;\n    S32 w;\n  };\n  struct\n  {\n    Vec2S32 xy;\n    Vec2S32 zw;\n  };\n  struct\n  {\n    Vec3S32 xyz;\n    S32 _z0;\n  };\n  struct\n  {\n    S32 _x0;\n    Vec3S32 yzw;\n  };\n  S32 v[4];\n};\n\n////////////////////////////////\n//~ rjf: Matrix Types\n\ntypedef struct Mat3x3F32 Mat3x3F32;\nstruct Mat3x3F32\n{\n  F32 v[3][3];\n};\n\ntypedef struct Mat4x4F32 Mat4x4F32;\nstruct Mat4x4F32\n{\n  F32 v[4][4];\n};\n\n////////////////////////////////\n//~ rjf: Range Types\n\n//- rjf: 1-range\n\ntypedef union Rng1U32 Rng1U32;\nunion Rng1U32\n{\n  struct\n  {\n    U32 min;\n    U32 max;\n  };\n  U32 v[2];\n};\n\ntypedef union Rng1S32 Rng1S32;\nunion Rng1S32\n{\n  struct\n  {\n    S32 min;\n    S32 max;\n  };\n  S32 v[2];\n};\n\ntypedef union Rng1U64 Rng1U64;\nunion Rng1U64\n{\n  struct\n  {\n    U64 min;\n    U64 max;\n  };\n  U64 v[2];\n};\n\ntypedef union Rng1S64 Rng1S64;\nunion Rng1S64\n{\n  struct\n  {\n    S64 min;\n    S64 max;\n  };\n  S64 v[2];\n};\n\ntypedef union Rng1F32 Rng1F32;\nunion Rng1F32\n{\n  struct\n  {\n    F32 min;\n    F32 max;\n  };\n  F32 v[2];\n};\n\n//- rjf: 2-range (rectangles)\n\ntypedef union Rng2S16 Rng2S16;\nunion Rng2S16\n{\n  struct\n  {\n    Vec2S16 min;\n    Vec2S16 max;\n  };\n  struct\n  {\n    Vec2S16 p0;\n    Vec2S16 p1;\n  };\n  struct\n  {\n    S16 x0;\n    S16 y0;\n    S16 x1;\n    S16 y1;\n  };\n  Vec2S16 v[2];\n};\n\ntypedef union Rng2S32 Rng2S32;\nunion Rng2S32\n{\n  struct\n  {\n    Vec2S32 min;\n    Vec2S32 max;\n  };\n  struct\n  {\n    Vec2S32 p0;\n    Vec2S32 p1;\n  };\n  struct\n  {\n    S32 x0;\n    S32 y0;\n    S32 x1;\n    S32 y1;\n  };\n  Vec2S32 v[2];\n};\n\ntypedef union Rng2F32 Rng2F32;\nunion Rng2F32\n{\n  struct\n  {\n    Vec2F32 min;\n    Vec2F32 max;\n  };\n  struct\n  {\n    Vec2F32 p0;\n    Vec2F32 p1;\n  };\n  struct\n  {\n    F32 x0;\n    F32 y0;\n    F32 x1;\n    F32 y1;\n  };\n  Vec2F32 v[2];\n};\n\ntypedef union Rng2S64 Rng2S64;\nunion Rng2S64\n{\n  struct\n  {\n    Vec2S64 min;\n    Vec2S64 max;\n  };\n  struct\n  {\n    Vec2S64 p0;\n    Vec2S64 p1;\n  };\n  struct\n  {\n    S64 x0;\n    S64 y0;\n    S64 x1;\n    S64 y1;\n  };\n  Vec2S64 v[2];\n};\n\n////////////////////////////////\n//~ rjf: Range List Types\n\ntypedef struct Rng1U64Node Rng1U64Node;\nstruct Rng1U64Node\n{\n  Rng1U64Node *next;\n  Rng1U64 v;\n};\n\ntypedef struct Rng1U64List Rng1U64List;\nstruct Rng1U64List\n{\n  U64 count;\n  Rng1U64Node *first;\n  Rng1U64Node *last;\n};\n\ntypedef struct Rng1U64Array Rng1U64Array;\nstruct Rng1U64Array\n{\n  Rng1U64 *v;\n  U64 count;\n};\n\ntypedef struct Rng1S64Node Rng1S64Node;\nstruct Rng1S64Node\n{\n  Rng1S64Node *next;\n  Rng1S64 v;\n};\n\ntypedef struct Rng1S64List Rng1S64List;\nstruct Rng1S64List\n{\n  Rng1S64Node *first;\n  Rng1S64Node *last;\n  U64 count;\n};\n\ntypedef struct Rng1S64Array Rng1S64Array;\nstruct Rng1S64Array\n{\n  Rng1S64 *v;\n  U64 count;\n};\n\n////////////////////////////////\n//~ rjf: Scalar Math Ops\n\n#define abs_s64(v) (S64)llabs(v)\n\n#define sqrt_f32(v)   sqrtf(v)\n#define cbrt_f32(v)   cbrtf(v)\n#define mod_f32(a, b) fmodf((a), (b))\n#define pow_f32(b, e) powf((b), (e))\n#define ceil_f32(v)   ceilf(v)\n#define floor_f32(v)  floorf(v)\n#define round_f32(v)  roundf(v)\n#define abs_f32(v)    fabsf(v)\n#define radians_from_turns_f32(v) ((v)*(2*3.1415926535897f))\n#define turns_from_radians_f32(v) ((v)/(2*3.1415926535897f))\n#define degrees_from_turns_f32(v) ((v)*360.f)\n#define turns_from_degrees_f32(v) ((v)/360.f)\n#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v)))\n#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v)))\n#define sin_f32(v)    sinf(radians_from_turns_f32(v))\n#define cos_f32(v)    cosf(radians_from_turns_f32(v))\n#define tan_f32(v)    tanf(radians_from_turns_f32(v))\n\n#define sqrt_f64(v)   sqrt(v)\n#define cbrt_f64(v)   cbrt(v)\n#define mod_f64(a, b) fmod((a), (b))\n#define pow_f64(b, e) pow((b), (e))\n#define ceil_f64(v)   ceil(v)\n#define floor_f64(v)  floor(v)\n#define round_f64(v)  round(v)\n#define abs_f64(v)    fabs(v)\n#define radians_from_turns_f64(v) ((v)*(2*3.1415926535897))\n#define turns_from_radians_f64(v) ((v)/(2*3.1415926535897))\n#define degrees_from_turns_f64(v) ((v)*360.0)\n#define turns_from_degrees_f64(v) ((v)/360.0)\n#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v)))\n#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v)))\n#define sin_f64(v)    sin(radians_from_turns_f64(v))\n#define cos_f64(v)    cos(radians_from_turns_f64(v))\n#define tan_f64(v)    tan(radians_from_turns_f64(v))\n\ninternal F32 mix_1f32(F32 a, F32 b, F32 t);\ninternal F64 mix_1f64(F64 a, F64 b, F64 t);\n\n////////////////////////////////\n//~ rjf: Vector Ops\n\n#define v2f32(x, y) vec_2f32((x), (y))\ninternal Vec2F32 vec_2f32(F32 x, F32 y);\ninternal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b);\ninternal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b);\ninternal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b);\ninternal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b);\ninternal Vec2F32 scale_2f32(Vec2F32 v, F32 s);\ninternal F32 dot_2f32(Vec2F32 a, Vec2F32 b);\ninternal F32 length_squared_2f32(Vec2F32 v);\ninternal F32 length_2f32(Vec2F32 v);\ninternal Vec2F32 normalize_2f32(Vec2F32 v);\ninternal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t);\n\n#define v2s64(x, y) vec_2s64((x), (y))\ninternal Vec2S64 vec_2s64(S64 x, S64 y);\ninternal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b);\ninternal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b);\ninternal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b);\ninternal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b);\ninternal Vec2S64 scale_2s64(Vec2S64 v, S64 s);\ninternal S64 dot_2s64(Vec2S64 a, Vec2S64 b);\ninternal S64 length_squared_2s64(Vec2S64 v);\ninternal S64 length_2s64(Vec2S64 v);\ninternal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t);\n\n#define v2s32(x, y) vec_2s32((x), (y))\ninternal Vec2S32 vec_2s32(S32 x, S32 y);\ninternal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b);\ninternal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b);\ninternal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b);\ninternal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b);\ninternal Vec2S32 scale_2s32(Vec2S32 v, S32 s);\ninternal S32 dot_2s32(Vec2S32 a, Vec2S32 b);\ninternal S32 length_squared_2s32(Vec2S32 v);\ninternal S32 length_2s32(Vec2S32 v);\ninternal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t);\n\n#define v2s16(x, y) vec_2s16((x), (y))\ninternal Vec2S16 vec_2s16(S16 x, S16 y);\ninternal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b);\ninternal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b);\ninternal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b);\ninternal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b);\ninternal Vec2S16 scale_2s16(Vec2S16 v, S16 s);\ninternal S16 dot_2s16(Vec2S16 a, Vec2S16 b);\ninternal S16 length_squared_2s16(Vec2S16 v);\ninternal S16 length_2s16(Vec2S16 v);\ninternal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t);\n\n#define v3f32(x, y, z) vec_3f32((x), (y), (z))\ninternal Vec3F32 vec_3f32(F32 x, F32 y, F32 z);\ninternal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b);\ninternal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b);\ninternal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b);\ninternal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b);\ninternal Vec3F32 scale_3f32(Vec3F32 v, F32 s);\ninternal F32 dot_3f32(Vec3F32 a, Vec3F32 b);\ninternal F32 length_squared_3f32(Vec3F32 v);\ninternal F32 length_3f32(Vec3F32 v);\ninternal Vec3F32 normalize_3f32(Vec3F32 v);\ninternal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t);\ninternal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b);\ninternal Vec3F32 xform_3f32(Vec3F32 v, Mat3x3F32 m);\n\n#define v3s32(x, y, z) vec_3s32((x), (y), (z))\ninternal Vec3S32 vec_3s32(S32 x, S32 y, S32 z);\ninternal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b);\ninternal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b);\ninternal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b);\ninternal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b);\ninternal Vec3S32 scale_3s32(Vec3S32 v, S32 s);\ninternal S32 dot_3s32(Vec3S32 a, Vec3S32 b);\ninternal S32 length_squared_3s32(Vec3S32 v);\ninternal S32 length_3s32(Vec3S32 v);\ninternal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t);\ninternal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b);\n\n#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w))\ninternal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w);\ninternal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b);\ninternal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b);\ninternal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b);\ninternal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b);\ninternal Vec4F32 scale_4f32(Vec4F32 v, F32 s);\ninternal F32 dot_4f32(Vec4F32 a, Vec4F32 b);\ninternal F32 length_squared_4f32(Vec4F32 v);\ninternal F32 length_4f32(Vec4F32 v);\ninternal Vec4F32 normalize_4f32(Vec4F32 v);\ninternal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t);\n\n#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w))\ninternal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w);\ninternal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b);\ninternal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b);\ninternal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b);\ninternal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b);\ninternal Vec4S32 scale_4s32(Vec4S32 v, S32 s);\ninternal S32 dot_4s32(Vec4S32 a, Vec4S32 b);\ninternal S32 length_squared_4s32(Vec4S32 v);\ninternal S32 length_4s32(Vec4S32 v);\ninternal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t);\n\n////////////////////////////////\n//~ rjf: Matrix Ops\n\ninternal Mat3x3F32 mat_3x3f32(F32 diagonal);\ninternal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta);\ninternal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale);\ninternal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b);\n\ninternal Mat4x4F32 mat_4x4f32(F32 diagonal);\ninternal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta);\ninternal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale);\ninternal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z);\ninternal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z);\ninternal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up);\ninternal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns);\ninternal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b);\ninternal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale);\ninternal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m);\ninternal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat);\ninternal Mat4x4F32 transpose_4x4f32(Mat4x4F32 mat);\n\n////////////////////////////////\n//~ rjf: Range Ops\n\n#define r1u32(min, max) rng_1u32((min), (max))\ninternal Rng1U32 rng_1u32(U32 min, U32 max);\ninternal Rng1U32 shift_1u32(Rng1U32 r, U32 x);\ninternal Rng1U32 pad_1u32(Rng1U32 r, U32 x);\ninternal U32 center_1u32(Rng1U32 r);\ninternal B32 contains_1u32(Rng1U32 r, U32 x);\ninternal U32 dim_1u32(Rng1U32 r);\ninternal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b);\ninternal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b);\ninternal U32 clamp_1u32(Rng1U32 r, U32 v);\n\n#define r1s32(min, max) rng_1s32((min), (max))\ninternal Rng1S32 rng_1s32(S32 min, S32 max);\ninternal Rng1S32 shift_1s32(Rng1S32 r, S32 x);\ninternal Rng1S32 pad_1s32(Rng1S32 r, S32 x);\ninternal S32 center_1s32(Rng1S32 r);\ninternal B32 contains_1s32(Rng1S32 r, S32 x);\ninternal S32 dim_1s32(Rng1S32 r);\ninternal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b);\ninternal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b);\ninternal S32 clamp_1s32(Rng1S32 r, S32 v);\n\n#define r1u64(min, max) rng_1u64((min), (max))\ninternal Rng1U64 rng_1u64(U64 min, U64 max);\ninternal Rng1U64 shift_1u64(Rng1U64 r, U64 x);\ninternal Rng1U64 pad_1u64(Rng1U64 r, U64 x);\ninternal U64 center_1u64(Rng1U64 r);\ninternal B32 contains_1u64(Rng1U64 r, U64 x);\ninternal U64 dim_1u64(Rng1U64 r);\ninternal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b);\ninternal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b);\ninternal U64 clamp_1u64(Rng1U64 r, U64 v);\n\n#define r1s64(min, max) rng_1s64((min), (max))\ninternal Rng1S64 rng_1s64(S64 min, S64 max);\ninternal Rng1S64 shift_1s64(Rng1S64 r, S64 x);\ninternal Rng1S64 pad_1s64(Rng1S64 r, S64 x);\ninternal S64 center_1s64(Rng1S64 r);\ninternal B32 contains_1s64(Rng1S64 r, S64 x);\ninternal S64 dim_1s64(Rng1S64 r);\ninternal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b);\ninternal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b);\ninternal S64 clamp_1s64(Rng1S64 r, S64 v);\n\n#define r1f32(min, max) rng_1f32((min), (max))\ninternal Rng1F32 rng_1f32(F32 min, F32 max);\ninternal Rng1F32 shift_1f32(Rng1F32 r, F32 x);\ninternal Rng1F32 pad_1f32(Rng1F32 r, F32 x);\ninternal F32 center_1f32(Rng1F32 r);\ninternal B32 contains_1f32(Rng1F32 r, F32 x);\ninternal F32 dim_1f32(Rng1F32 r);\ninternal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b);\ninternal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b);\ninternal F32 clamp_1f32(Rng1F32 r, F32 v);\n\n#define r2s16(min, max) rng_2s16((min), (max))\n#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w)))\ninternal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max);\ninternal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x);\ninternal Rng2S16 pad_2s16(Rng2S16 r, S16 x);\ninternal Vec2S16 center_2s16(Rng2S16 r);\ninternal B32 contains_2s16(Rng2S16 r, Vec2S16 x);\ninternal Vec2S16 dim_2s16(Rng2S16 r);\ninternal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b);\ninternal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b);\ninternal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v);\n\n#define r2s32(min, max) rng_2s32((min), (max))\n#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w)))\ninternal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max);\ninternal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x);\ninternal Rng2S32 pad_2s32(Rng2S32 r, S32 x);\ninternal Vec2S32 center_2s32(Rng2S32 r);\ninternal B32 contains_2s32(Rng2S32 r, Vec2S32 x);\ninternal Vec2S32 dim_2s32(Rng2S32 r);\ninternal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b);\ninternal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b);\ninternal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v);\n\n#define r2s64(min, max) rng_2s64((min), (max))\n#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w)))\ninternal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max);\ninternal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x);\ninternal Rng2S64 pad_2s64(Rng2S64 r, S64 x);\ninternal Vec2S64 center_2s64(Rng2S64 r);\ninternal B32 contains_2s64(Rng2S64 r, Vec2S64 x);\ninternal Vec2S64 dim_2s64(Rng2S64 r);\ninternal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b);\ninternal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b);\ninternal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v);\n\n#define r2f32(min, max) rng_2f32((min), (max))\n#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w)))\ninternal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max);\ninternal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x);\ninternal Rng2F32 pad_2f32(Rng2F32 r, F32 x);\ninternal Vec2F32 center_2f32(Rng2F32 r);\ninternal B32 contains_2f32(Rng2F32 r, Vec2F32 x);\ninternal Vec2F32 dim_2f32(Rng2F32 r);\ninternal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b);\ninternal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b);\ninternal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v);\n\n////////////////////////////////\n//~ rjf: Color Operations\n\n//- rjf: hsv <-> rgb\ninternal Vec3F32 hsv_from_rgb(Vec3F32 rgb);\ninternal Vec3F32 rgb_from_hsv(Vec3F32 hsv);\ninternal Vec4F32 hsva_from_rgba(Vec4F32 rgba);\ninternal Vec4F32 rgba_from_hsva(Vec4F32 hsva);\n\n//- rjf: srgb <-> linear\ninternal Vec3F32 linear_from_srgb(Vec3F32 srgb);\ninternal Vec3F32 srgb_from_linear(Vec3F32 linear);\ninternal Vec4F32 linear_from_srgba(Vec4F32 srgba);\ninternal Vec4F32 srgba_from_linear(Vec4F32 linear);\n\n//- rjf: oklab <-> linear\ninternal Vec3F32 oklab_from_linear(Vec3F32 linear);\ninternal Vec3F32 linear_from_oklab(Vec3F32 oklab);\ninternal Vec4F32 oklab_from_lineara(Vec4F32 lineara);\ninternal Vec4F32 lineara_from_oklab(Vec4F32 oklab);\n\n//- rjf: rgba <-> u32\ninternal U32 u32_from_rgba(Vec4F32 rgba);\ninternal Vec4F32 rgba_from_u32(U32 hex);\n#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f }\n\n////////////////////////////////\n//~ rjf: List Type Functions\n\ninternal void rng1u64_list_push_node(Rng1U64List *list, Rng1U64Node *n);\ninternal Rng1U64Node * rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng);\ninternal void rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat);\ninternal Rng1U64Array rng1u64_array_from_list(Arena *arena, Rng1U64List *list);\ninternal U64 rng_1u64_array_bsearch(Rng1U64Array arr, U64 value);\n\ninternal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng);\ninternal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list);\n\n////////////////////////////////\n//~ rjf: N -> M Element Subdivision\n\ninternal Rng1U64 m_range_from_n_idx_m_count(U64 n_idx, U64 n_count, U64 m_count);\n\n#endif //BASE_MATH_H\n"
  },
  {
    "path": "src/base/base_meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Lookups\r\n\r\ninternal Member *\r\nmember_from_name(Type *type, String8 name)\r\n{\r\n  Member *member = &member_nil;\r\n  if(type->members != 0 && name.size != 0)\r\n  {\r\n    for(U64 idx = 0; idx < type->count; idx += 1)\r\n    {\r\n      if(str8_match(type->members[idx].name, name, 0))\r\n      {\r\n        member = &type->members[idx];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return member;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info * Instance Operations\r\n\r\ninternal void\r\ntyped_data_rebase_ptrs(Type *type, String8 data, void *base_ptr)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  typedef struct RebaseTypeTask RebaseTypeTask;\r\n  struct RebaseTypeTask\r\n  {\r\n    RebaseTypeTask *next;\r\n    Type *type;\r\n    U8 *ptr;\r\n  };\r\n  RebaseTypeTask start_task = {0, type, data.str};\r\n  RebaseTypeTask *first_task = &start_task;\r\n  RebaseTypeTask *last_task = first_task;\r\n  for(RebaseTypeTask *t = first_task; t != 0; t = t->next)\r\n  {\r\n    switch(t->type->kind)\r\n    {\r\n      default:{}break;\r\n      case TypeKind_Ptr:\r\n      {\r\n        *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr));\r\n      }break;\r\n      case TypeKind_Array:\r\n      {\r\n        for(U64 idx = 0; idx < t->type->count; idx += 1)\r\n        {\r\n          RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1);\r\n          task->type = t->type->direct;\r\n          task->ptr  = t->ptr + t->type->direct->size * idx;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }\r\n      }break;\r\n      case TypeKind_Struct:\r\n      {\r\n        for(U64 idx = 0; idx < t->type->count; idx += 1)\r\n        {\r\n          Member *member = &t->type->members[idx];\r\n          RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1);\r\n          task->type = member->type;\r\n          task->ptr  = t->ptr + member->value;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8\r\nserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strings = {0};\r\n  str8_serial_begin(scratch.arena, &strings);\r\n  {\r\n    typedef struct SerializeTypeTask SerializeTypeTask;\r\n    struct SerializeTypeTask\r\n    {\r\n      SerializeTypeTask *next;\r\n      Type *type;\r\n      U64 count;\r\n      U8 *src;\r\n      Type *containing_type;\r\n      U8 *containing_ptr;\r\n      B32 is_post_header;\r\n    };\r\n    SerializeTypeTask start_task = {0, type, 1, data.str};\r\n    SerializeTypeTask *first_task = &start_task;\r\n    SerializeTypeTask *last_task = first_task;\r\n    for(SerializeTypeTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      switch(t->type->kind)\r\n      {\r\n        //- rjf: leaf -> just copy the data directly\r\n        default:\r\n        if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf)\r\n        {\r\n          str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));\r\n        }break;\r\n        \r\n        //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise just write as plain data\r\n        case TypeKind_Ptr:\r\n        {\r\n          // rjf: unpack info about this pointer\r\n          TypeSerializePtrRefInfo *ptr_ref_info = 0;\r\n          for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1)\r\n          {\r\n            if(params->ptr_ref_infos[idx].type == t->type->direct)\r\n            {\r\n              ptr_ref_info = &params->ptr_ref_infos[idx];\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: indexification -> subtract base, divide direct size, write index\r\n          if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t->src, sizeof(ptr_value));\r\n            U64 ptr_write_value = ((U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->indexify_base)/t->type->direct->size);\r\n            str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value);\r\n          }\r\n          \r\n          // rjf: offsetification -> subtract base, write offsets\r\n          else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t->src, sizeof(ptr_value));\r\n            U64 ptr_write_value = (U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->offsetify_base);\r\n            str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value);\r\n          }\r\n          \r\n          // rjf: size-by-member (pre-header): still potentially dependent on other members which\r\n          // delimit our size, so push a new post-header task for pointer.\r\n          else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header)\r\n          {\r\n            SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n            task->type  = t->type;\r\n            task->count = t->count;\r\n            task->src   = t->src;\r\n            task->containing_type = t->containing_type;\r\n            task->containing_ptr  = t->containing_ptr;\r\n            task->is_post_header = 1;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\r\n          \r\n          // rjf: size-by-member (post-header): all flat parts of containing struct have been\r\n          // iterated, so now we can read the size, & descend to new task to read pointer\r\n          // destination contents\r\n          else if(t->type->count_delimiter_name.size != 0 && t->is_post_header)\r\n          {\r\n            // rjf: determine count of this pointer\r\n            U64 count = 0;\r\n            {\r\n              Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name);\r\n              MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size);\r\n            }\r\n            \r\n            // rjf: push task\r\n            SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n            task->type                 = t->type->direct;\r\n            task->count                = count;\r\n            task->src                  = *(void **)t->src;\r\n            task->containing_type      = t->containing_type;\r\n            task->containing_ptr       = t->containing_ptr;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\r\n          \r\n          // rjf: catch-all: write pointer value\r\n          else\r\n          {\r\n            str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: arrays -> descend to underlying type, + count\r\n        case TypeKind_Array:\r\n        {\r\n          SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->type->count;\r\n          task->src   = t->src;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n        \r\n        //- rjf: struct -> descend to members\r\n        case TypeKind_Struct:\r\n        {\r\n          U64 off = 0;\r\n          for(U64 idx = 0; idx < t->count; idx += 1)\r\n          {\r\n            for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1)\r\n            {\r\n              if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize)\r\n              {\r\n                continue;\r\n              }\r\n              SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n              task->type            = t->type->members[member_idx].type;\r\n              task->count           = 1;\r\n              task->src             = t->src + idx*t->type->size + t->type->members[member_idx].value;\r\n              task->containing_type = t->type;\r\n              task->containing_ptr  = t->src;\r\n              SLLQueuePush(first_task, last_task, task);\r\n            }\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: enum -> descend to basic type interpretation\r\n        case TypeKind_Enum:\r\n        {\r\n          SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->count;\r\n          task->src   = t->src;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  String8 result = str8_serial_end(arena, &strings);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndeserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)\r\n{\r\n  String8 result = {0};\r\n  result.size = type->size;\r\n  result.str  = push_array(arena, U8, result.size);\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    typedef struct DeserializeTypeTask DeserializeTypeTask;\r\n    struct DeserializeTypeTask\r\n    {\r\n      DeserializeTypeTask *next;\r\n      Type *type;\r\n      U64 count;\r\n      U8 *dst;\r\n      Type *containing_type;\r\n      U8 *containing_ptr;\r\n      B32 is_post_header;\r\n    };\r\n    U64 read_off = 0;\r\n    DeserializeTypeTask start_task = {0, type, 1, result.str};\r\n    DeserializeTypeTask *first_task = &start_task;\r\n    DeserializeTypeTask *last_task = first_task;\r\n    for(DeserializeTypeTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      U8 *t_src = data.str + read_off;\r\n      switch(t->type->kind)\r\n      {\r\n        //- rjf: leaf -> copy the data directly\r\n        default:\r\n        if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf)\r\n        {\r\n          MemoryCopy(t->dst, t_src, t->type->size*t->count);\r\n          read_off += t->type->size*t->count;\r\n        }break;\r\n        \r\n        //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise skip\r\n        case TypeKind_Ptr:\r\n        {\r\n          // rjf: unpack info about this pointer\r\n          TypeSerializePtrRefInfo *ptr_ref_info = 0;\r\n          for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1)\r\n          {\r\n            if(params->ptr_ref_infos[idx].type == t->type->direct)\r\n            {\r\n              ptr_ref_info = &params->ptr_ref_infos[idx];\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: indexification -> add base, multiply direct size\r\n          if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t_src, sizeof(ptr_value));\r\n            U64 ptr_write_value = (ptr_value + (U64)ptr_ref_info->indexify_base) * t->type->direct->size;\r\n            MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value));\r\n            read_off += sizeof(ptr_value);\r\n          }\r\n          \r\n          // rjf: offsetification -> subtract base, write offsets\r\n          else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t_src, sizeof(ptr_value));\r\n            U64 ptr_write_value = ptr_value + (U64)ptr_ref_info->offsetify_base;\r\n            MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value));\r\n            read_off += sizeof(ptr_value);\r\n          }\r\n          \r\n          // rjf: size-by-member (pre-header): still potentially dependent on other members which\r\n          // delimit our size, so push a new post-header task for pointer.\r\n          else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header)\r\n          {\r\n            DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n            task->type  = t->type;\r\n            task->count = t->count;\r\n            task->dst   = t->dst;\r\n            task->containing_type = t->containing_type;\r\n            task->containing_ptr = t->containing_ptr;\r\n            task->is_post_header = 1;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\r\n          \r\n          // rjf: size-by-member (post-header): all flat parts of containing struct have been\r\n          // iterated, so now we can read the size, & descend to new task to read pointer\r\n          // destination contents\r\n          else if(t->type->count_delimiter_name.size != 0 && t->is_post_header)\r\n          {\r\n            // rjf: determine count of this pointer\r\n            U64 count = 0;\r\n            {\r\n              Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name);\r\n              MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size);\r\n            }\r\n            \r\n            // rjf: allocate buffer for pointer destination; write address into pointer value slot\r\n            U64 ptr_dest_buffer_size = (count+1)*t->type->direct->size;\r\n            U8 *ptr_dest_buffer = push_array(arena, U8, ptr_dest_buffer_size);\r\n            MemoryCopy(t->dst, &ptr_dest_buffer, sizeof(ptr_dest_buffer));\r\n            \r\n            // rjf: push task\r\n            DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n            task->type                 = t->type->direct;\r\n            task->count                = count;\r\n            task->dst                  = ptr_dest_buffer;\r\n            task->containing_type      = t->containing_type;\r\n            task->containing_ptr       = t->containing_ptr;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\r\n          \r\n          // rjf: catch-all: read pointer value\r\n          else\r\n          {\r\n            MemoryCopy(t->dst, t_src, t->type->size*t->count);\r\n            read_off += t->type->size*t->count;\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: arrays -> descend to underlying type, + count\r\n        case TypeKind_Array:\r\n        {\r\n          DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->type->count;\r\n          task->dst   = t->dst;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n        \r\n        //- rjf: struct -> descend to members\r\n        case TypeKind_Struct:\r\n        {\r\n          for(U64 idx = 0; idx < t->count; idx += 1)\r\n          {\r\n            for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1)\r\n            {\r\n              if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize)\r\n              {\r\n                continue;\r\n              }\r\n              DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n              task->type            = t->type->members[member_idx].type;\r\n              task->count           = 1;\r\n              task->dst             = t->dst + idx*t->type->size + t->type->members[member_idx].value;\r\n              task->containing_type = t->type;\r\n              task->containing_ptr  = t->dst;\r\n              SLLQueuePush(first_task, last_task, task);\r\n            }\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: enum -> descend to basic type interpretation\r\n        case TypeKind_Enum:\r\n        {\r\n          DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->count;\r\n          task->dst   = t->dst;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n      }\r\n    }\r\n    if(params->advance_out != 0)\r\n    {\r\n      params->advance_out[0] = read_off;\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndeep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 data_srlz = serialized_from_typed_data(scratch.arena, type, data, params);\r\n  String8 data_copy = deserialized_from_typed_data(arena, type, data_srlz, params);\r\n  scratch_end(scratch);\r\n  return data_copy;\r\n}\r\n"
  },
  {
    "path": "src/base/base_meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_META_H\r\n#define BASE_META_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Meta Markup Features\r\n\r\n#define EmbedFile(name, path)\r\n#define TweakB32(name, default)           (TWEAK_##name)\r\n#define TweakF32(name, default, min, max) (TWEAK_##name)\r\n\r\n////////////////////////////////\r\n//~ rjf: Tweak Info Tables\r\n\r\ntypedef struct TweakB32Info TweakB32Info;\r\nstruct TweakB32Info\r\n{\r\n  String8 name;\r\n  B32 default_value;\r\n  B32 *value_ptr;\r\n};\r\n\r\ntypedef struct TweakF32Info TweakF32Info;\r\nstruct TweakF32Info\r\n{\r\n  String8 name;\r\n  F32 default_value;\r\n  Rng1F32 value_range;\r\n  F32 *value_ptr;\r\n};\r\n\r\ntypedef struct TweakB32InfoTable TweakB32InfoTable;\r\nstruct TweakB32InfoTable\r\n{\r\n  TweakB32Info *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct TweakF32InfoTable TweakF32InfoTable;\r\nstruct TweakF32InfoTable\r\n{\r\n  TweakF32Info *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct EmbedInfo EmbedInfo;\r\nstruct EmbedInfo\r\n{\r\n  String8 name;\r\n  String8 *data;\r\n  U128 *hash;\r\n};\r\n\r\ntypedef struct EmbedInfoTable EmbedInfoTable;\r\nstruct EmbedInfoTable\r\n{\r\n  EmbedInfo *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Types\r\n\r\ntypedef enum TypeKind\r\n{\r\n  TypeKind_Null,\r\n  \r\n  // rjf: leaves\r\n  TypeKind_Void, TypeKind_FirstLeaf = TypeKind_Void,\r\n  TypeKind_U8,\r\n  TypeKind_U16,\r\n  TypeKind_U32,\r\n  TypeKind_U64,\r\n  TypeKind_S8,\r\n  TypeKind_S16,\r\n  TypeKind_S32,\r\n  TypeKind_S64,\r\n  TypeKind_B8,\r\n  TypeKind_B16,\r\n  TypeKind_B32,\r\n  TypeKind_B64,\r\n  TypeKind_F32,\r\n  TypeKind_F64, TypeKind_LastLeaf = TypeKind_F64,\r\n  \r\n  // rjf: operators\r\n  TypeKind_Ptr,\r\n  TypeKind_Array,\r\n  \r\n  // rjf: user-defined-types\r\n  TypeKind_Struct,\r\n  TypeKind_Union,\r\n  TypeKind_Enum,\r\n  \r\n  TypeKind_COUNT\r\n}\r\nTypeKind;\r\n\r\ntypedef U32 TypeFlags;\r\nenum\r\n{\r\n  TypeFlag_IsPlainText = (1<<0),\r\n  TypeFlag_IsCodeText  = (1<<1),\r\n  TypeFlag_IsPathText  = (1<<2),\r\n};\r\n\r\ntypedef U32 MemberFlags;\r\nenum\r\n{\r\n  MemberFlag_DoNotSerialize  = (1<<0),\r\n};\r\n\r\ntypedef struct Type Type;\r\ntypedef struct Member Member;\r\nstruct Member\r\n{\r\n  String8 name;\r\n  String8 pretty_name;\r\n  Type *type;\r\n  U64 value;\r\n  MemberFlags flags;\r\n};\r\n\r\ntypedef struct Type Type;\r\nstruct Type\r\n{\r\n  TypeKind kind;\r\n  TypeFlags flags;\r\n  U64 size;\r\n  Type *direct;\r\n  String8 name;\r\n  String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N]\r\n  U64 count;\r\n  Member *members;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Serialization Parameters\r\n\r\ntypedef struct TypeSerializePtrRefInfo TypeSerializePtrRefInfo;\r\nstruct TypeSerializePtrRefInfo\r\n{\r\n  Type *type;           // pointers to this\r\n  void *indexify_base;  // can be indexified using this\r\n  void *offsetify_base; // can be offsetified using this\r\n  void *nil_ptr;        // is terminal if matching 0 or this\r\n};\r\n\r\ntypedef struct TypeSerializeParams TypeSerializeParams;\r\nstruct TypeSerializeParams\r\n{\r\n  U64 *advance_out;\r\n  TypeSerializePtrRefInfo *ptr_ref_infos;\r\n  U64 ptr_ref_infos_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Name -> Type Info\r\n\r\n#define type(T) (&T##__type)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Table Initializer Helpers\r\n\r\n#define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), {0}, (ti), OffsetOf(S, m), __VA_ARGS__}\r\n#define struct_members(S) read_only global Member S##__members[] =\r\n#define struct_type(S, ...) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members, __VA_ARGS__}\r\n#define named_struct_type(name, S, ...) read_only global Type name##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#name), {0}, ArrayCount(name##__members), name##__members, __VA_ARGS__}\r\n#define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, 0, sizeof(void *), (ti), __VA_ARGS__}\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nread_only global Type type_nil   = {TypeKind_Null, 0, 0, &type_nil};\r\nread_only global Member member_nil = {{0}, {0}, &type_nil};\r\n\r\n////////////////////////////////\r\n//~ rjf: Built-In Types\r\n\r\n//- rjf: leaves\r\nread_only global Type void__type = {TypeKind_Void, 0, 0,           &type_nil, str8_lit_comp(\"void\")};\r\nread_only global Type U8__type   = {TypeKind_U8,   0, sizeof(U8),  &type_nil, str8_lit_comp(\"U8\")};\r\nread_only global Type U16__type  = {TypeKind_U16,  0, sizeof(U16), &type_nil, str8_lit_comp(\"U16\")};\r\nread_only global Type U32__type  = {TypeKind_U32,  0, sizeof(U32), &type_nil, str8_lit_comp(\"U32\")};\r\nread_only global Type U64__type  = {TypeKind_U64,  0, sizeof(U64), &type_nil, str8_lit_comp(\"U64\")};\r\nread_only global Type S8__type   = {TypeKind_S8,   0, sizeof(S8),  &type_nil, str8_lit_comp(\"S8\")};\r\nread_only global Type S16__type  = {TypeKind_S16,  0, sizeof(S16), &type_nil, str8_lit_comp(\"S16\")};\r\nread_only global Type S32__type  = {TypeKind_S32,  0, sizeof(S32), &type_nil, str8_lit_comp(\"S32\")};\r\nread_only global Type S64__type  = {TypeKind_S64,  0, sizeof(S64), &type_nil, str8_lit_comp(\"S64\")};\r\nread_only global Type B8__type   = {TypeKind_B8,   0, sizeof(B8),  &type_nil, str8_lit_comp(\"B8\")};\r\nread_only global Type B16__type  = {TypeKind_B16,  0, sizeof(B16), &type_nil, str8_lit_comp(\"B16\")};\r\nread_only global Type B32__type  = {TypeKind_B32,  0, sizeof(B32), &type_nil, str8_lit_comp(\"B32\")};\r\nread_only global Type B64__type  = {TypeKind_B64,  0, sizeof(B64), &type_nil, str8_lit_comp(\"B64\")};\r\nread_only global Type F32__type  = {TypeKind_F32,  0, sizeof(F32), &type_nil, str8_lit_comp(\"F32\")};\r\nread_only global Type F64__type  = {TypeKind_F64,  0, sizeof(F64), &type_nil, str8_lit_comp(\"F64\")};\r\nread_only global Type *type_kind_type_table[] =\r\n{\r\n  &type_nil,\r\n  type(void),\r\n  type(U8),\r\n  type(U16),\r\n  type(U32),\r\n  type(U64),\r\n  type(S8),\r\n  type(S16),\r\n  type(S32),\r\n  type(S64),\r\n  type(B8),\r\n  type(B16),\r\n  type(B32),\r\n  type(B64),\r\n  type(F32),\r\n  type(F64),\r\n  &type_nil,\r\n  &type_nil,\r\n  &type_nil,\r\n  &type_nil,\r\n  &type_nil,\r\n};\r\n\r\n//- rjf: Rng1U64\r\nstruct_members(Rng1U64)\r\n{\r\n  member_lit_comp(Rng1U64, type(U64), min),\r\n  member_lit_comp(Rng1U64, type(U64), max),\r\n};\r\nstruct_type(Rng1U64);\r\n\r\n//- rjf: String8\r\nptr_type(String8__str_ptr_type, type(U8), str8_lit_comp(\"size\"));\r\nstruct_members(String8)\r\n{\r\n  member_lit_comp(String8, &String8__str_ptr_type, str),\r\n  member_lit_comp(String8, type(U64),              size),\r\n};\r\nstruct_type(String8);\r\n\r\n//- rjf: String8Node\r\nextern Type String8Node__type;\r\nType String8Node__ptr_type = {TypeKind_Ptr, 0, sizeof(void *), &String8Node__type};\r\nMember String8Node__members[] =\r\n{\r\n  {str8_lit_comp(\"next\"),   {0}, &String8Node__ptr_type,     OffsetOf(String8Node, next)},\r\n  {str8_lit_comp(\"string\"), {0}, type(String8),              OffsetOf(String8Node, string)},\r\n};\r\nType String8Node__type =\r\n{\r\n  TypeKind_Struct,\r\n  0,\r\n  sizeof(String8Node),\r\n  &type_nil,\r\n  str8_lit_comp(\"String8Node\"),\r\n  {0},\r\n  ArrayCount(String8Node__members),\r\n  String8Node__members,\r\n};\r\n\r\n//- rjf: String8List\r\nMember String8List__members[] =\r\n{\r\n  {str8_lit_comp(\"first\"),      {0}, &String8Node__ptr_type,     OffsetOf(String8List, first)},\r\n  {str8_lit_comp(\"last\"),       {0}, &String8Node__ptr_type,     OffsetOf(String8List, last), MemberFlag_DoNotSerialize},\r\n  {str8_lit_comp(\"node_count\"), {0}, type(U64), OffsetOf(String8List, node_count)},\r\n  {str8_lit_comp(\"total_size\"), {0}, type(U64), OffsetOf(String8List, total_size)},\r\n};\r\nType String8List__type =\r\n{\r\n  TypeKind_Struct,\r\n  0,\r\n  sizeof(String8List),\r\n  &type_nil,\r\n  str8_lit_comp(\"String8List\"),\r\n  {0},\r\n  ArrayCount(String8List__members),\r\n  String8List__members,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Lookups\r\n\r\ninternal Member *member_from_name(Type *type, String8 name);\r\n#define EachMember(T, it) (Member *it = (type(T))->members; it != 0 && it < (type(T))->members + (type(T))->count; it += 1)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info * Instance Operations\r\n\r\ninternal void typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr);\r\ninternal String8 serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);\r\ninternal String8 deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);\r\ninternal String8 deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);\r\n#define struct_rebase_ptrs(T, ptr, base)                   typed_data_rebase_ptrs(type(T), str8_struct(ptr), (base))\r\n#define serialized_from_struct(arena, T, ptr, ...)         serialized_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__})\r\n#define struct_from_serialized(arena, T, string, ...) (T *)deserialized_from_typed_data((arena), type(T), (string), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str\r\n#define deep_copy_from_struct(arena, T, ptr, ...)     (T *)deep_copy_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str\r\n\r\n#endif // BASE_META_H\r\n"
  },
  {
    "path": "src/base/base_profile.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#if PROFILE_SPALL\r\ninternal inline void\r\nspall_begin(char *fmt, ...)\r\n{\r\n  if(spall_buffer.data == 0)\r\n  {\r\n    spall_buffer.length = MB(1);\r\n    spall_buffer.data   = os_reserve(spall_buffer.length);\r\n    os_commit(spall_buffer.data, spall_buffer.length);\r\n    spall_buffer_init(&spall_profile, &spall_buffer);\r\n  }\r\n  if(spall_pid == 0)\r\n  {\r\n    spall_pid = os_get_process_info()->pid;\r\n  }\r\n  if(spall_tid == 0)\r\n  {\r\n    spall_tid = os_tid();\r\n  }\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  spall_buffer_begin_ex(&spall_profile, &spall_buffer, string.str, string.size, os_now_microseconds(), spall_tid, spall_pid);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n}\r\n#endif\r\n"
  },
  {
    "path": "src/base/base_profile.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_PROFILE_H\r\n#define BASE_PROFILE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Zero Settings\r\n\r\n#if !defined(PROFILE_TELEMETRY)\r\n# define PROFILE_TELEMETRY 0\r\n#endif\r\n#if !defined(PROFILE_SPALL)\r\n# define PROFILE_SPALL 0\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Third Party Includes\r\n\r\n#if PROFILE_TELEMETRY\r\n# include \"rad_tm.h\"\r\n# if OS_WINDOWS\r\n#  pragma comment(lib, \"ws2_32.lib\")\r\n#  pragma comment(lib, \"rad_tm_win64.lib\")\r\n# endif\r\n#elif PROFILE_SPALL\r\n# include \"spall.h\"\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Telemetry Profile Defines\r\n\r\n#if PROFILE_TELEMETRY\r\n# define ProfBegin(...)            tmEnter(0, 0, __VA_ARGS__)\r\n# define ProfBeginDynamic(...)     (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0)\r\n# define ProfEnd(...)              (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0)\r\n# define ProfTick(...)             tmTick(0)\r\n# define ProfIsCapturing(...)      tmRunning()\r\n# define ProfBeginCapture(...)     tmOpen(0, __VA_ARGS__, __DATE__, \"localhost\", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100)\r\n# define ProfEndCapture(...)       tmClose(0)\r\n# define ProfThreadName(...)       (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0)\r\n# define ProfMsg(...)              (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0)\r\n# define ProfBeginLockWait(...)    tmStartWaitForLock(0, 0, __VA_ARGS__)\r\n# define ProfEndLockWait(...)      tmEndWaitForLock(0)\r\n# define ProfLockTake(...)         tmAcquiredLock(0, 0, __VA_ARGS__)\r\n# define ProfLockDrop(...)         tmReleasedLock(0, __VA_ARGS__)\r\n# define ProfColor(color)          tmZoneColor((((color) & 0xff000000) >> 24) / 255.f, (((color) & 0x00ff0000) >> 16) / 255.f, (((color) & 0x0000ff00) >> 8) / 255.f)\r\n# define ProfBeginV(...)                                                         \\\r\nif (TM_API_PTR) {                                                               \\\r\nstatic tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \\\r\nTemp scratch = scratch_begin(0,0);                                             \\\r\nString8 string = push_str8f(scratch.arena, __VA_ARGS__);                       \\\r\ntm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size);          \\\r\nhash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str);              \\\r\nTM_API_PTR->_tmEnterZoneFast_Core(0, 0, file_id, __LINE__, hash);              \\\r\nscratch_end(scratch);                                                          \\\r\n}\r\n# define ProfNoteV(...) \t\t\t\t\t\t\t\t\t\t\t\t\t\t                             \\\r\nif (TM_API_PTR) {     \t\t\t\t\t\t\t\t\t\t\t\t\t\t                              \\\r\nstatic tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \\\r\nTemp scratch = scratch_begin(0,0);                                             \\\r\nString8 string = push_str8f(scratch.arena, __VA_ARGS__);                       \\\r\ntm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size);          \\\r\nhash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str);              \\\r\nTM_API_PTR->_tmMessageFast_Core(0, TMMF_ICON_NOTE, file_id, __LINE__, hash);   \\\r\nscratch_end(scratch);                                                          \\\r\n}\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Spall Profile Defines\r\n\r\n#if PROFILE_SPALL\r\nglobal U64 spall_capturing = 0;\r\nglobal SpallProfile spall_profile = {0};\r\nthread_static SpallBuffer spall_buffer = {0};\r\nthread_static U32 spall_tid = 0;\r\nthread_static U32 spall_pid = 0;\r\ninternal inline void spall_begin(char *fmt, ...);\r\n# define ProfBegin(...)           (spall_capturing ? (spall_begin(__VA_ARGS__), 0) : 0)\r\n# define ProfBeginDynamic(...)    (spall_capturing ? (spall_begin(__VA_ARGS__), 0) : 0)\r\n# define ProfEnd(...)             (spall_capturing ? (spall_buffer_end_ex(&spall_profile, &spall_buffer, os_now_microseconds(), spall_tid, spall_pid)), 0 : 0)\r\n# define ProfTick(...)\r\n# define ProfIsCapturing(...)     (!!spall_capturing)\r\n# define ProfBeginCapture(...)    (spall_capturing = 1)\r\n# define ProfEndCapture(...)      (spall_capturing = 0, spall_flush(&spall_profile))\r\n# define ProfThreadName(...)\r\n# define ProfMsg(...)\r\n# define ProfBeginLockWait(...)\r\n# define ProfEndLockWait(...)\r\n# define ProfLockTake(...)\r\n# define ProfLockDrop(...)\r\n# define ProfColor(color)\r\n# define ProfBeginV(...)\r\n# define ProfNoteV(...)\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Zeroify Undefined Defines\r\n\r\n#if !defined(ProfBegin)\r\n# define ProfBegin(...)         (0)\r\n# define ProfBeginDynamic(...)  (0)\r\n# define ProfEnd(...)           (0)\r\n# define ProfTick(...)          (0)\r\n# define ProfIsCapturing(...)   (0)\r\n# define ProfBeginCapture(...)  (0)\r\n# define ProfEndCapture(...)    (0)\r\n# define ProfThreadName(...)    (0)\r\n# define ProfMsg(...)           (0)\r\n# define ProfBeginLockWait(...) (0)\r\n# define ProfEndLockWait(...)   (0)\r\n# define ProfLockTake(...)      (0)\r\n# define ProfLockDrop(...)      (0)\r\n# define ProfColor(...)         (0)\r\n# define ProfBeginV(...)        (0)\r\n# define ProfNoteV(...)         (0)\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Helper Wrappers\r\n\r\n#define ProfBeginFunction(...) ProfBegin(this_function_name)\r\n#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd())\r\n\r\n#endif // BASE_PROFILE_H\r\n"
  },
  {
    "path": "src/base/base_strings.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Character Classification & Conversion Functions\r\n\r\ninternal B32\r\nchar_is_space(U8 c)\r\n{\r\n  return (c == ' ' || c == '\\n' || c == '\\t' || c == '\\r' || c == '\\f' || c == '\\v');\r\n}\r\n\r\ninternal B32\r\nchar_is_upper(U8 c)\r\n{\r\n  return ('A' <= c && c <= 'Z');\r\n}\r\n\r\ninternal B32\r\nchar_is_lower(U8 c)\r\n{\r\n  return ('a' <= c && c <= 'z');\r\n}\r\n\r\ninternal B32\r\nchar_is_alpha(U8 c)\r\n{\r\n  return (char_is_upper(c) || char_is_lower(c));\r\n}\r\n\r\ninternal B32\r\nchar_is_slash(U8 c)\r\n{\r\n  return (c == '/' || c == '\\\\');\r\n}\r\n\r\ninternal B32\r\nchar_is_digit(U8 c, U32 base)\r\n{\r\n  B32 result = 0;\r\n  if(0 < base && base <= 16)\r\n  {\r\n    U8 val = integer_symbol_reverse[c];\r\n    if(val < base)\r\n    {\r\n      result = 1;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U8\r\nlower_from_char(U8 c)\r\n{\r\n  if(char_is_upper(c))\r\n  {\r\n    c += ('a' - 'A');\r\n  }\r\n  return c;\r\n}\r\n\r\ninternal U8\r\nupper_from_char(U8 c)\r\n{\r\n  if(char_is_lower(c))\r\n  {\r\n    c += ('A' - 'a');\r\n  }\r\n  return c;\r\n}\r\n\r\ninternal U8\r\ncorrect_slash_from_char(U8 c)\r\n{\r\n  if(char_is_slash(c))\r\n  {\r\n    c = '/';\r\n  }\r\n  return c;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: C-String Measurement\r\n\r\ninternal U64\r\ncstring8_length(U8 *c)\r\n{\r\n  U64 length = 0;\r\n  if(c)\r\n  {\r\n    U8 *p = c;\r\n    for (;*p != 0; p += 1);\r\n    length = (U64)(p - c);\r\n  }\r\n  return length;\r\n}\r\n\r\ninternal U64\r\ncstring16_length(U16 *c)\r\n{\r\n  U64 length = 0;\r\n  if(c)\r\n  {\r\n    U16 *p = c;\r\n    for (;*p != 0; p += 1);\r\n    length = (U64)(p - c);\r\n  }\r\n  return length;\r\n}\r\n\r\ninternal U64\r\ncstring32_length(U32 *c)\r\n{\r\n  U64 length = 0;\r\n  if(c)\r\n  {\r\n    U32 *p = c;\r\n    for (;*p != 0; p += 1);\r\n    length = (U64)(p - c);\r\n  }\r\n  return length;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Constructors\r\n\r\ninternal String8\r\nstr8(U8 *str, U64 size)\r\n{\r\n  String8 result = {str, size};\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_range(U8 *first, U8 *one_past_last)\r\n{\r\n  String8 result = {first, (U64)(one_past_last - first)};\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_zero(void)\r\n{\r\n  String8 result = {0};\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16(U16 *str, U64 size)\r\n{\r\n  String16 result = {str, size};\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_range(U16 *first, U16 *one_past_last)\r\n{\r\n  String16 result = {first, (U64)(one_past_last - first)};\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_zero(void)\r\n{\r\n  String16 result = {0};\r\n  return result;\r\n}\r\n\r\ninternal String32\r\nstr32(U32 *str, U64 size)\r\n{\r\n  String32 result = {str, size};\r\n  return result;\r\n}\r\n\r\ninternal String32\r\nstr32_range(U32 *first, U32 *one_past_last)\r\n{\r\n  String32 result = {first, (U64)(one_past_last - first)};\r\n  return result;\r\n}\r\n\r\ninternal String32\r\nstr32_zero(void)\r\n{\r\n  String32 result = {0};\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_cstring(char *c)\r\n{\r\n  String8 result = {(U8*)c, cstring8_length((U8*)c)};\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_cstring(U16 *c)\r\n{\r\n  String16 result = {(U16*)c, cstring16_length((U16*)c)};\r\n  return result;\r\n}\r\n\r\ninternal String32\r\nstr32_cstring(U32 *c)\r\n{\r\n  String32 result = {(U32*)c, cstring32_length((U32*)c)};\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_cstring_capped(void *cstr, void *cap)\r\n{\r\n  char *ptr = (char *)cstr;\r\n  char *opl = (char *)cap;\r\n  for (;ptr < opl && *ptr != 0; ptr += 1);\r\n  U64 size = (U64)(ptr - (char *)cstr);\r\n  String8 result = str8((U8*)cstr, size);\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_cstring_capped(void *cstr, void *cap)\r\n{\r\n  U16 *ptr = (U16 *)cstr;\r\n  U16 *opl = (U16 *)cap;\r\n  for (;ptr < opl && *ptr != 0; ptr += 1);\r\n  U64 size = (U64)(ptr - (U16 *)cstr);\r\n  String16 result = str16(cstr, size);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_cstring_capped_reverse(void *raw_start, void *raw_cap)\r\n{\r\n  U8 *start = raw_start;\r\n  U8 *ptr   = raw_cap;\r\n  for(; ptr > start; )\r\n  {\r\n    ptr -= 1;\r\n    if (*ptr == '\\0')\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  U64 size = (U64)(ptr - start);\r\n  String8 result  = str8(start, size);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Stylization\r\n\r\ninternal String8\r\nupper_from_str8(Arena *arena, String8 string)\r\n{\r\n  string = push_str8_copy(arena, string);\r\n  for(U64 idx = 0; idx < string.size; idx += 1)\r\n  {\r\n    string.str[idx] = upper_from_char(string.str[idx]);\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nlower_from_str8(Arena *arena, String8 string)\r\n{\r\n  string = push_str8_copy(arena, string);\r\n  for(U64 idx = 0; idx < string.size; idx += 1)\r\n  {\r\n    string.str[idx] = lower_from_char(string.str[idx]);\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nbackslashed_from_str8(Arena *arena, String8 string)\r\n{\r\n  string = push_str8_copy(arena, string);\r\n  for(U64 idx = 0; idx < string.size; idx += 1)\r\n  {\r\n    string.str[idx] = char_is_slash(string.str[idx]) ? '\\\\' : string.str[idx];\r\n  }\r\n  return string;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Matching\r\n\r\ninternal B32\r\nstr8_match(String8 a, String8 b, StringMatchFlags flags)\r\n{\r\n  B32 result = 0;\r\n  if(a.size == b.size && flags == 0)\r\n  {\r\n    result = MemoryMatch(a.str, b.str, b.size);\r\n  }\r\n  else if(a.size == b.size || (flags & StringMatchFlag_RightSideSloppy))\r\n  {\r\n    B32 case_insensitive  = (flags & StringMatchFlag_CaseInsensitive);\r\n    B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive);\r\n    U64 size              = Min(a.size, b.size);\r\n    result = 1;\r\n    for(U64 i = 0; i < size; i += 1)\r\n    {\r\n      U8 at = a.str[i];\r\n      U8 bt = b.str[i];\r\n      if(case_insensitive)\r\n      {\r\n        at = upper_from_char(at);\r\n        bt = upper_from_char(bt);\r\n      }\r\n      if(slash_insensitive)\r\n      {\r\n        at = correct_slash_from_char(at);\r\n        bt = correct_slash_from_char(bt);\r\n      }\r\n      if(at != bt)\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nstr8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags)\r\n{\r\n  U8 *p = string.str + start_pos;\r\n  U64 stop_offset = Max(string.size + 1, needle.size) - needle.size;\r\n  U8 *stop_p = string.str + stop_offset;\r\n  if(needle.size > 0)\r\n  {\r\n    U8 *string_opl = string.str + string.size;\r\n    String8 needle_tail = str8_skip(needle, 1);\r\n    StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy;\r\n    U8 needle_first_char_adjusted = needle.str[0];\r\n    if(adjusted_flags & StringMatchFlag_CaseInsensitive)\r\n    {\r\n      needle_first_char_adjusted = upper_from_char(needle_first_char_adjusted);\r\n    }\r\n    for(;p < stop_p; p += 1)\r\n    {\r\n      U8 haystack_char_adjusted = *p;\r\n      if(adjusted_flags & StringMatchFlag_CaseInsensitive)\r\n      {\r\n        haystack_char_adjusted = upper_from_char(haystack_char_adjusted);\r\n      }\r\n      if(haystack_char_adjusted == needle_first_char_adjusted)\r\n      {\r\n        if(str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags))\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  U64 result = string.size;\r\n  if(p < stop_p)\r\n  {\r\n    result = (U64)(p - string.str);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nstr8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags)\r\n{\r\n  U64 result = 0;\r\n  for(S64 i = string.size - start_pos - needle.size; i >= 0; --i)\r\n  {\r\n    String8 haystack = str8_substr(string, rng_1u64(i, i + needle.size));\r\n    if(str8_match(haystack, needle, flags))\r\n    {\r\n      result = (U64)i + needle.size;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nstr8_is_before(String8 a, String8 b)\r\n{\r\n  B32 result = 0;\r\n  {\r\n    U64 common_size = Min(a.size, b.size);\r\n    for(U64 off = 0; off < common_size; off += 1)\r\n    {\r\n      if(a.str[off] < b.str[off])\r\n      {\r\n        result = 1;\r\n        break;\r\n      }\r\n      else if(a.str[off] > b.str[off])\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n      else if(off+1 == common_size)\r\n      {\r\n        result = (a.size < b.size);\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Slicing\r\n\r\ninternal String8\r\nstr8_substr(String8 str, Rng1U64 range)\r\n{\r\n  range.min = ClampTop(range.min, str.size);\r\n  range.max = ClampTop(range.max, str.size);\r\n  str.str += range.min;\r\n  str.size = dim_1u64(range);\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8_prefix(String8 str, U64 size)\r\n{\r\n  str.size = ClampTop(size, str.size);\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8_skip(String8 str, U64 amt)\r\n{\r\n  amt = ClampTop(amt, str.size);\r\n  str.str += amt;\r\n  str.size -= amt;\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8_postfix(String8 str, U64 size)\r\n{\r\n  size = ClampTop(size, str.size);\r\n  str.str = (str.str + str.size) - size;\r\n  str.size = size;\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8_chop(String8 str, U64 amt)\r\n{\r\n  amt = ClampTop(amt, str.size);\r\n  str.size -= amt;\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8_skip_chop_whitespace(String8 string)\r\n{\r\n  U8 *first = string.str;\r\n  U8 *opl = first + string.size;\r\n  for(;first < opl; first += 1)\r\n  {\r\n    if(!char_is_space(*first))\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  for(;opl > first;)\r\n  {\r\n    opl -= 1;\r\n    if(!char_is_space(*opl))\r\n    {\r\n      opl += 1;\r\n      break;\r\n    }\r\n  }\r\n  String8 result = str8_range(first, opl);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_skip_chop_slashes(String8 string)\r\n{\r\n  U8 *first = string.str;\r\n  U8 *opl = first + string.size;\r\n  for(;first < opl; first += 1)\r\n  {\r\n    if(!char_is_slash(*first))\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  for(;opl > first;)\r\n  {\r\n    opl -= 1;\r\n    if(!char_is_slash(*opl))\r\n    {\r\n      opl += 1;\r\n      break;\r\n    }\r\n  }\r\n  String8 result = str8_range(first, opl);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Formatting & Copying\r\n\r\ninternal String8\r\nstr8_cat(Arena *arena, String8 s1, String8 s2)\r\n{\r\n  String8 str;\r\n  str.size = s1.size + s2.size;\r\n  str.str = push_array_no_zero(arena, U8, str.size + 1);\r\n  MemoryCopy(str.str, s1.str, s1.size);\r\n  MemoryCopy(str.str + s1.size, s2.str, s2.size);\r\n  str.str[str.size] = 0;\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8_copy(Arena *arena, String8 s)\r\n{\r\n  String8 str;\r\n  str.size = s.size;\r\n  str.str = push_array_no_zero(arena, U8, str.size + 1);\r\n  MemoryCopy(str.str, s.str, s.size);\r\n  str.str[str.size] = 0;\r\n  return str;\r\n}\r\n\r\ninternal String8\r\nstr8fv(Arena *arena, char *fmt, va_list args){\r\n  va_list args2;\r\n  va_copy(args2, args);\r\n  U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1;\r\n  String8 result = {0};\r\n  result.str = push_array_no_zero(arena, U8, needed_bytes);\r\n  result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2);\r\n  result.str[result.size] = 0;\r\n  va_end(args2);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8f(Arena *arena, char *fmt, ...)\r\n{\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 result = push_str8fv(arena, fmt, args);\r\n  va_end(args);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\npush_cstr(Arena *arena, String8 str)\r\n{\r\n  U64 buffer_size = str.size + 1;\r\n  U8 *buffer = push_array_no_zero(arena, U8, buffer_size);\r\n  MemoryCopy(buffer, str.str, str.size);\r\n  buffer[str.size] = 0;\r\n  String8 result = str8(buffer, buffer_size);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Integer Conversions\r\n\r\n//- rjf: string -> integer\r\n\r\ninternal S64\r\nsign_from_str8(String8 string, String8 *string_tail)\r\n{\r\n  // count negative signs\r\n  U64 neg_count = 0;\r\n  U64 i = 0;\r\n  for(; i < string.size; i += 1)\r\n  {\r\n    if (string.str[i] == '-'){\r\n      neg_count += 1;\r\n    }\r\n    else if (string.str[i] != '+'){\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // output part of string after signs\r\n  *string_tail = str8_skip(string, i);\r\n  \r\n  // output integer sign\r\n  S64 sign = (neg_count & 1)?-1:+1;\r\n  return sign;\r\n}\r\n\r\ninternal B32\r\nstr8_is_integer(String8 string, U32 radix)\r\n{\r\n  B32 result = 0;\r\n  if(string.size > 0)\r\n  {\r\n    if(1 < radix && radix <= 16)\r\n    {\r\n      result = 1;\r\n      for(U64 i = 0; i < string.size; i += 1)\r\n      {\r\n        U8 c = string.str[i];\r\n        if(!(c < 0x80) || integer_symbol_reverse[c] >= radix)\r\n        {\r\n          result = 0;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nstr8_is_integer_signed(String8 string, U32 radix)\r\n{\r\n  B32 result = 0;\r\n  String8 sign = str8_prefix(string, 1);\r\n  if(str8_match(sign, str8_lit(\"-\"), 0))\r\n  {\r\n    result = str8_is_integer(str8_skip(string, 1), radix);\r\n  }\r\n  else\r\n  {\r\n    result = str8_is_integer(string, radix);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nu64_from_str8(String8 string, U32 radix)\r\n{\r\n  U64 x = 0;\r\n  if(1 < radix && radix <= 16)\r\n  {\r\n    for(U64 i = 0; i < string.size; i += 1)\r\n    {\r\n      x *= radix;\r\n      x += integer_symbol_reverse[string.str[i]&0x7F];\r\n    }\r\n  }\r\n  return x;\r\n}\r\n\r\ninternal S64\r\ns64_from_str8(String8 string, U32 radix)\r\n{\r\n  S64 sign = sign_from_str8(string, &string);\r\n  S64 x = (S64)u64_from_str8(string, radix) * sign;\r\n  return x;\r\n}\r\n\r\ninternal U32\r\nu32_from_str8(String8 string, U32 radix)\r\n{\r\n  U64 x64 = u64_from_str8(string, radix);\r\n  U32 x32 = safe_cast_u32(x64);\r\n  return x32;\r\n}\r\n\r\ninternal S32\r\ns32_from_str8(String8 string, U32 radix)\r\n{\r\n  S64 x64 = s64_from_str8(string, radix);\r\n  S32 x32 = safe_cast_s32(x64);\r\n  return x32;\r\n}\r\n\r\ninternal B32\r\ntry_u64_from_str8_c_rules(String8 string, U64 *x)\r\n{\r\n  // rjf: unpack radix / prefix size based on string prefix\r\n  U64 radix = 0;\r\n  U64 prefix_size = 0;\r\n  {\r\n    // hex\r\n    if(str8_match(str8_prefix(string, 2), str8_lit(\"0x\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      radix = 0x10, prefix_size = 2;\r\n    }\r\n    // binary\r\n    else if(str8_match(str8_prefix(string, 2), str8_lit(\"0b\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      radix = 2, prefix_size = 2;\r\n    }\r\n    // octal\r\n    else if(str8_match(str8_prefix(string, 1), str8_lit(\"0\"), StringMatchFlag_CaseInsensitive) && string.size > 1)\r\n    {\r\n      radix = 010, prefix_size = 1;\r\n    }\r\n    // decimal\r\n    else\r\n    {\r\n      radix = 10, prefix_size = 0;\r\n    }\r\n  }\r\n  \r\n  // rjf: convert if we can\r\n  String8 integer    = str8_skip(string, prefix_size);\r\n  B32     is_integer = str8_is_integer(integer, radix);\r\n  if(is_integer)\r\n  {\r\n    *x = u64_from_str8(integer, radix);\r\n  }\r\n  \r\n  return is_integer;\r\n}\r\n\r\ninternal B32\r\ntry_s64_from_str8_c_rules(String8 string, S64 *x)\r\n{\r\n  String8 string_tail = {0};\r\n  S64 sign = sign_from_str8(string, &string_tail);\r\n  U64 x_u64 = 0;\r\n  B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64);\r\n  *x = x_u64*sign;\r\n  return is_integer;\r\n}\r\n\r\n//- rjf: integer -> string\r\n\r\ninternal String8\r\nstr8_from_memory_size(Arena *arena, U64 size)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    if(size < KB(1))\r\n    {\r\n      result = push_str8f(arena, \"%llu Bytes\", size);\r\n    }\r\n    else if(size < MB(1))\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02llu KiB\", size / KB(1), ((size * 100) / KB(1)) % 100);\r\n    }\r\n    else if(size < GB(1))\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02llu MiB\", size / MB(1), ((size * 100) / MB(1)) % 100);\r\n    }\r\n    else if(size < TB(1))\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02llu GiB\", size / GB(1), ((size * 100) / GB(1)) % 100);\r\n    }\r\n    else\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02llu TiB\", size / TB(1), ((size * 100) / TB(1)) % 100);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_count(Arena *arena, U64 count)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    if(count < 1 * 1000)\r\n    {\r\n      result = push_str8f(arena, \"%llu\", count);\r\n    }\r\n    else if(count < 1000000)\r\n    {\r\n      U64 frac = ((count * 100) / 1000) % 100;\r\n      if(frac > 0)\r\n      {\r\n        result = push_str8f(arena, \"%llu.%02lluK\", count / 1000, frac);\r\n      }\r\n      else\r\n      {\r\n        result = push_str8f(arena, \"%lluK\", count / 1000);\r\n      }\r\n    }\r\n    else if(count < 1000000000)\r\n    {\r\n      U64 frac = ((count * 100) / 1000000) % 100;\r\n      if(frac > 0)\r\n      {\r\n        result = push_str8f(arena, \"%llu.%02lluM\", count / 1000000, frac);\r\n      }\r\n      else\r\n      {\r\n        result = push_str8f(arena, \"%lluM\", count / 1000000);\r\n      }\r\n    }\r\n    else\r\n    {\r\n      U64 frac = ((count * 100) * 1000000000) % 100;\r\n      if(frac > 0)\r\n      {\r\n        result = push_str8f(arena, \"%llu.%02lluB\", count / 1000000000, frac);\r\n      }\r\n      else\r\n      {\r\n        result = push_str8f(arena, \"%lluB\", count / 1000000000, frac);\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_bits_u32(Arena *arena, U32 x)\r\n{\r\n  U8 c0 = 'a' + ((x >> 28) & 0xf);\r\n  U8 c1 = 'a' + ((x >> 24) & 0xf);\r\n  U8 c2 = 'a' + ((x >> 20) & 0xf);\r\n  U8 c3 = 'a' + ((x >> 16) & 0xf);\r\n  U8 c4 = 'a' + ((x >> 12) & 0xf);\r\n  U8 c5 = 'a' + ((x >>  8) & 0xf);\r\n  U8 c6 = 'a' + ((x >>  4) & 0xf);\r\n  U8 c7 = 'a' + ((x >>  0) & 0xf);\r\n  String8 result = push_str8f(arena, \"%c%c%c%c%c%c%c%c\", c0, c1, c2, c3, c4, c5, c6, c7);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_bits_u64(Arena *arena, U64 x)\r\n{\r\n  U8 c0 = 'a' + ((x >> 60) & 0xf);\r\n  U8 c1 = 'a' + ((x >> 56) & 0xf);\r\n  U8 c2 = 'a' + ((x >> 52) & 0xf);\r\n  U8 c3 = 'a' + ((x >> 48) & 0xf);\r\n  U8 c4 = 'a' + ((x >> 44) & 0xf);\r\n  U8 c5 = 'a' + ((x >> 40) & 0xf);\r\n  U8 c6 = 'a' + ((x >> 36) & 0xf);\r\n  U8 c7 = 'a' + ((x >> 32) & 0xf);\r\n  U8 c8 = 'a' + ((x >> 28) & 0xf);\r\n  U8 c9 = 'a' + ((x >> 24) & 0xf);\r\n  U8 ca = 'a' + ((x >> 20) & 0xf);\r\n  U8 cb = 'a' + ((x >> 16) & 0xf);\r\n  U8 cc = 'a' + ((x >> 12) & 0xf);\r\n  U8 cd = 'a' + ((x >>  8) & 0xf);\r\n  U8 ce = 'a' + ((x >>  4) & 0xf);\r\n  U8 cf = 'a' + ((x >>  0) & 0xf);\r\n  String8 result = push_str8f(arena,\r\n                              \"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\",\r\n                              c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    // rjf: prefix\r\n    String8 prefix = {0};\r\n    switch(radix)\r\n    {\r\n      case 16:{prefix = str8_lit(\"0x\");}break;\r\n      case 8: {prefix = str8_lit(\"0o\");}break;\r\n      case 2: {prefix = str8_lit(\"0b\");}break;\r\n    }\r\n    \r\n    // rjf: determine # of chars between separators\r\n    U8 digit_group_size = 3;\r\n    switch(radix)\r\n    {\r\n      default:break;\r\n      case 2:\r\n      case 8:\r\n      case 16:\r\n      {digit_group_size = 4;}break;\r\n    }\r\n    \r\n    // rjf: prep\r\n    U64 needed_leading_0s = 0;\r\n    {\r\n      U64 needed_digits = 1;\r\n      {\r\n        U64 u64_reduce = u64;\r\n        for(;;)\r\n        {\r\n          u64_reduce /= radix;\r\n          if(u64_reduce == 0)\r\n          {\r\n            break;\r\n          }\r\n          needed_digits += 1;\r\n        }\r\n      }\r\n      needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0;\r\n      U64 needed_separators = 0;\r\n      if(digit_group_separator != 0)\r\n      {\r\n        needed_separators = (needed_digits+needed_leading_0s)/digit_group_size;\r\n        if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0)\r\n        {\r\n          needed_separators -= 1;\r\n        }\r\n      }\r\n      result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits;\r\n      result.str = push_array_no_zero(arena, U8, result.size + 1);\r\n      result.str[result.size] = 0;\r\n    }\r\n    \r\n    // rjf: fill contents\r\n    {\r\n      U64 u64_reduce = u64;\r\n      U64 digits_until_separator = digit_group_size;\r\n      for(U64 idx = 0; idx < result.size; idx += 1)\r\n      {\r\n        if(digits_until_separator == 0 && digit_group_separator != 0)\r\n        {\r\n          result.str[result.size - idx - 1] = digit_group_separator;\r\n          digits_until_separator = digit_group_size+1;\r\n        }\r\n        else\r\n        {\r\n          result.str[result.size - idx - 1] = lower_from_char(integer_symbols[u64_reduce%radix]);\r\n          u64_reduce /= radix;\r\n        }\r\n        digits_until_separator -= 1;\r\n        if(u64_reduce == 0)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n      for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1)\r\n      {\r\n        result.str[prefix.size + leading_0_idx] = '0';\r\n      }\r\n    }\r\n    \r\n    // rjf: fill prefix\r\n    if(prefix.size != 0)\r\n    {\r\n      MemoryCopy(result.str, prefix.str, prefix.size);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator)\r\n{\r\n  String8 result = {0};\r\n  // TODO(rjf): preeeeetty sloppy...\r\n  if(s64 < 0)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator);\r\n    result = push_str8f(arena, \"-%S\", numeric_part);\r\n    scratch_end(scratch);\r\n  }\r\n  else\r\n  {\r\n    result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Float Conversions\r\n\r\ninternal F64\r\nf64_from_str8(String8 string)\r\n{\r\n  // TODO(rjf): crappy implementation for now that just uses atof.\r\n  F64 result = 0;\r\n  if(string.size > 0)\r\n  {\r\n    // rjf: find starting pos of numeric string, as well as sign\r\n    F64 sign = +1.0;\r\n    if(string.str[0] == '-')\r\n    {\r\n      sign = -1.0;\r\n    }\r\n    else if(string.str[0] == '+')\r\n    {\r\n      sign = 1.0;\r\n    }\r\n    \r\n    // rjf: gather numerics\r\n    U64 num_valid_chars = 0;\r\n    char buffer[64];\r\n    B32 exp = 0;\r\n    for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1)\r\n    {\r\n      if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.' || string.str[idx] == 'e' ||\r\n         (exp && (string.str[idx] == '+' || string.str[idx] == '-')))\r\n      {\r\n        buffer[num_valid_chars] = string.str[idx];\r\n        num_valid_chars += 1;\r\n        exp = 0;\r\n        exp = (string.str[idx] == 'e');\r\n      }\r\n    }\r\n    \r\n    // rjf: null-terminate (the reason for all of this!!!!!!)\r\n    buffer[num_valid_chars] = 0;\r\n    \r\n    // rjf: do final conversion\r\n    result = sign * atof(buffer);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String List Construction Functions\r\n\r\ninternal String8Node *\r\nstr8_list_push_node(String8List *list, String8Node *node)\r\n{\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += node->string.size;\r\n  return node;\r\n}\r\n\r\ninternal String8Node *\r\nstr8_list_push_node_set_string(String8List *list, String8Node *node, String8 string)\r\n{\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += string.size;\r\n  node->string = string;\r\n  return node;\r\n}\r\n\r\ninternal String8Node *\r\nstr8_list_push_node_front(String8List *list, String8Node *node)\r\n{\r\n  SLLQueuePushFront(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += node->string.size;\r\n  return node;\r\n}\r\n\r\ninternal String8Node *\r\nstr8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string)\r\n{\r\n  SLLQueuePushFront(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += string.size;\r\n  node->string = string;\r\n  return node;\r\n}\r\n\r\ninternal String8Node *\r\nstr8_list_push(Arena *arena, String8List *list, String8 string)\r\n{\r\n  String8Node *node = push_array_no_zero(arena, String8Node, 1);\r\n  str8_list_push_node_set_string(list, node, string);\r\n  return node;\r\n}\r\n\r\ninternal String8Node *\r\nstr8_list_push_front(Arena *arena, String8List *list, String8 string)\r\n{\r\n  String8Node *node = push_array_no_zero(arena, String8Node, 1);\r\n  str8_list_push_node_front_set_string(list, node, string);\r\n  return node;\r\n}\r\n\r\ninternal void\r\nstr8_list_concat_in_place(String8List *list, String8List *to_push)\r\n{\r\n  if(to_push->node_count != 0)\r\n  {\r\n    if(list->last)\r\n    {\r\n      list->node_count += to_push->node_count;\r\n      list->total_size += to_push->total_size;\r\n      list->last->next = to_push->first;\r\n      list->last = to_push->last;\r\n    }\r\n    else\r\n    {\r\n      *list = *to_push;\r\n    }\r\n    MemoryZeroStruct(to_push);\r\n  }\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){\r\n  String8Node *node = push_array_no_zero(arena, String8Node, 1);\r\n  U64 new_size = list->total_size + min;\r\n  U64 increase_size = 0;\r\n  if (align > 1){\r\n    // NOTE(allen): assert is power of 2\r\n    Assert(((align - 1) & align) == 0);\r\n    U64 mask = align - 1;\r\n    new_size += mask;\r\n    new_size &= (~mask);\r\n    increase_size = new_size - list->total_size;\r\n  }\r\n  local_persist const U8 zeroes_buffer[64] = {0};\r\n  Assert(increase_size <= ArrayCount(zeroes_buffer));\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size = new_size;\r\n  node->string.str = (U8*)zeroes_buffer;\r\n  node->string.size = increase_size;\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_pushf(Arena *arena, String8List *list, char *fmt, ...)\r\n{\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(arena, fmt, args);\r\n  String8Node *result = str8_list_push(arena, list, string);\r\n  va_end(args);\r\n  return result;\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...)\r\n{\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(arena, fmt, args);\r\n  String8Node *result = str8_list_push_front(arena, list, string);\r\n  va_end(args);\r\n  return result;\r\n}\r\n\r\ninternal String8List\r\nstr8_list_copy(Arena *arena, String8List *list)\r\n{\r\n  String8List result = {0};\r\n  for(String8Node *node = list->first; node != 0; node = node->next)\r\n  {\r\n    String8Node *new_node = push_array_no_zero(arena, String8Node, 1);\r\n    String8 new_string = push_str8_copy(arena, node->string);\r\n    str8_list_push_node_set_string(&result, new_node, new_string);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Splitting & Joining\r\n\r\ninternal String8List\r\nstr8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags)\r\n{\r\n  String8List list = {0};\r\n  B32 keep_empties = (flags & StringSplitFlag_KeepEmpties);\r\n  U8 *ptr = string.str;\r\n  U8 *opl = string.str + string.size;\r\n  for(;ptr < opl;)\r\n  {\r\n    U8 *first = ptr;\r\n    for(;ptr < opl; ptr += 1)\r\n    {\r\n      U8 c = *ptr;\r\n      B32 is_split = 0;\r\n      for(U64 i = 0; i < split_char_count; i += 1)\r\n      {\r\n        if(split_chars[i] == c)\r\n        {\r\n          is_split = 1;\r\n          break;\r\n        }\r\n      }\r\n      if(is_split)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    String8 string = str8_range(first, ptr);\r\n    if(keep_empties || string.size > 0)\r\n    {\r\n      str8_list_push(arena, &list, string);\r\n    }\r\n    ptr += 1;\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal String8List\r\nstr8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags)\r\n{\r\n  String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags);\r\n  return list;\r\n}\r\n\r\ninternal String8\r\nstr8_list_join(Arena *arena, String8List *list, StringJoin *optional_params)\r\n{\r\n  StringJoin join = {0};\r\n  if(optional_params != 0)\r\n  {\r\n    MemoryCopyStruct(&join, optional_params);\r\n  }\r\n  U64 sep_count = 0;\r\n  if(list->node_count > 0)\r\n  {\r\n    sep_count = list->node_count - 1;\r\n  }\r\n  String8 result;\r\n  result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size;\r\n  U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1);\r\n  MemoryCopy(ptr, join.pre.str, join.pre.size);\r\n  ptr += join.pre.size;\r\n  for(String8Node *node = list->first;\r\n      node != 0;\r\n      node = node->next)\r\n  {\r\n    MemoryCopy(ptr, node->string.str, node->string.size);\r\n    ptr += node->string.size;\r\n    if(node->next != 0)\r\n    {\r\n      MemoryCopy(ptr, join.sep.str, join.sep.size);\r\n      ptr += join.sep.size;\r\n    }\r\n  }\r\n  MemoryCopy(ptr, join.post.str, join.post.size);\r\n  ptr += join.post.size;\r\n  *ptr = 0;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Data Structure Stringification Helpers\r\n\r\ninternal String8List\r\nnumeric_str8_list_from_data(Arena *arena, U32 radix, String8 data, U64 stride)\r\n{\r\n  String8List strs = {0};\r\n  U64 count = data.size/stride;\r\n  for EachIndex(idx, count)\r\n  {\r\n    U64 val = 0;\r\n    MemoryCopy(&val, data.str + idx*stride, stride);\r\n    str8_list_push(arena, &strs, str8_from_u64(arena, val, radix, 0, 0));\r\n  }\r\n  return strs;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf; String Arrays\r\n\r\ninternal String8Array\r\nstr8_array_zero(void)\r\n{\r\n  String8Array result = {0};\r\n  return result;\r\n}\r\n\r\ninternal String8Array\r\nstr8_array_from_list(Arena *arena, String8List *list)\r\n{\r\n  String8Array array;\r\n  array.count   = list->node_count;\r\n  array.v = push_array_no_zero(arena, String8, array.count);\r\n  U64 idx = 0;\r\n  for(String8Node *n = list->first; n != 0; n = n->next, idx += 1)\r\n  {\r\n    array.v[idx] = n->string;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal String8Array *\r\nstr8_array_from_list_arr(Arena *arena, String8List *lists, U64 count)\r\n{\r\n  String8Array *result = push_array(arena, String8Array, count);\r\n  for (U64 idx = 0; idx < count; idx += 1) {\r\n    result[idx] = str8_array_from_list(arena, &lists[idx]);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8Array\r\nstr8_array_reserve(Arena *arena, U64 count)\r\n{\r\n  String8Array arr;\r\n  arr.count = 0;\r\n  arr.v = push_array(arena, String8, count);\r\n  return arr;\r\n}\r\n\r\ninternal String8Array\r\nstr8_array_copy(Arena *arena, String8Array array)\r\n{\r\n  String8Array result = {0};\r\n  result.count = array.count;\r\n  result.v = push_array(arena, String8, result.count);\r\n  for EachIndex(idx, result.count)\r\n  {\r\n    result.v[idx] = push_str8_copy(arena, array.v[idx]);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Version Helpers\r\n\r\ninternal U64\r\nversion_from_str8(String8 string)\r\n{\r\n  U64 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U64 version_major = 0;\r\n  U64 version_minor = 0;\r\n  U64 version_patch = 0;\r\n  String8List version_parts = str8_split(scratch.arena, string, (U8 *)\".\", 1, 0);\r\n  if(version_parts.first &&\r\n     version_parts.first->next &&\r\n     version_parts.first->next->next)\r\n  {\r\n    try_u64_from_str8_c_rules(version_parts.first->string, &version_major);\r\n    try_u64_from_str8_c_rules(version_parts.first->next->string, &version_minor);\r\n    try_u64_from_str8_c_rules(version_parts.first->next->next->string, &version_patch);\r\n    result = Version(version_major, version_minor, version_patch);\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_version(Arena *arena, U64 version)\r\n{\r\n  U64 version_major = MajorFromVersion(version);\r\n  U64 version_minor = MinorFromVersion(version);\r\n  U64 version_patch = PatchFromVersion(version);\r\n  String8 result = str8f(arena, \"%I64d.%I64d.%I64d\", version_major, version_minor, version_patch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Path Helpers\r\n\r\ninternal String8\r\nstr8_chop_last_slash(String8 string)\r\n{\r\n  if(string.size > 0)\r\n  {\r\n    U8 *ptr = string.str + string.size - 1;\r\n    for(;ptr >= string.str; ptr -= 1)\r\n    {\r\n      if(*ptr == '/' || *ptr == '\\\\')\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    if(ptr >= string.str)\r\n    {\r\n      string.size = (U64)(ptr - string.str);\r\n    }\r\n    else\r\n    {\r\n      string.size = 0;\r\n    }\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nstr8_skip_last_slash(String8 string)\r\n{\r\n  if(string.size > 0)\r\n  {\r\n    U8 *ptr = string.str + string.size - 1;\r\n    for(;ptr >= string.str; ptr -= 1)\r\n    {\r\n      if(*ptr == '/' || *ptr == '\\\\')\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    if(ptr >= string.str)\r\n    {\r\n      ptr += 1;\r\n      string.size = (U64)(string.str + string.size - ptr);\r\n      string.str = ptr;\r\n    }\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nstr8_chop_last_dot(String8 string)\r\n{\r\n  String8 result = string;\r\n  U64 p = string.size;\r\n  for(;p > 0;)\r\n  {\r\n    p -= 1;\r\n    if(string.str[p] == '.')\r\n    {\r\n      result = str8_prefix(string, p);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_skip_last_dot(String8 string)\r\n{\r\n  String8 result = string;\r\n  U64 p = string.size;\r\n  for(;p > 0;)\r\n  {\r\n    p -= 1;\r\n    if(string.str[p] == '.')\r\n    {\r\n      result = str8_skip(string, p + 1);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal PathStyle\r\npath_style_from_str8(String8 string)\r\n{\r\n  PathStyle result = PathStyle_Relative;\r\n  if(string.size >= 1 && string.str[0] == '/')\r\n  {\r\n    result = PathStyle_UnixAbsolute;\r\n  }\r\n  else if(string.size >= 2 &&\r\n          char_is_alpha(string.str[0]) &&\r\n          string.str[1] == ':')\r\n  {\r\n    if(string.size == 2 || char_is_slash(string.str[2]))\r\n    {\r\n      result = PathStyle_WindowsAbsolute;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8List\r\nstr8_split_path(Arena *arena, String8 string)\r\n{\r\n  String8List result = str8_split(arena, string, (U8*)\"/\\\\\", 2, 0);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nstr8_path_list_resolve_dots_in_place(String8List *path, PathStyle style)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  typedef struct String8MetaNode String8MetaNode;\r\n  struct String8MetaNode\r\n  {\r\n    String8MetaNode *next;\r\n    String8Node *node;\r\n  };\r\n  String8MetaNode *stack = 0;\r\n  String8MetaNode *free_meta_node = 0;\r\n  String8Node *first = path->first;\r\n  MemoryZeroStruct(path);\r\n  for(String8Node *node = first, *next = 0;\r\n      node != 0;\r\n      node = next)\r\n  {\r\n    // save next now\r\n    next = node->next;\r\n    \r\n    // cases:\r\n    if(node == first && style == PathStyle_WindowsAbsolute)\r\n    {\r\n      goto save_without_stack;\r\n    }\r\n    if(node->string.size == 1 && node->string.str[0] == '.')\r\n    {\r\n      goto do_nothing;\r\n    }\r\n    if(node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.')\r\n    {\r\n      if(stack != 0)\r\n      {\r\n        goto eliminate_stack_top;\r\n      }\r\n      else\r\n      {\r\n        goto save_without_stack;\r\n      }\r\n    }\r\n    goto save_with_stack;\r\n    \r\n    \r\n    // handlers:\r\n    save_with_stack:\r\n    {\r\n      str8_list_push_node(path, node);\r\n      String8MetaNode *stack_node = free_meta_node;\r\n      if(stack_node != 0)\r\n      {\r\n        SLLStackPop(free_meta_node);\r\n      }\r\n      else\r\n      {\r\n        stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1);\r\n      }\r\n      SLLStackPush(stack, stack_node);\r\n      stack_node->node = node;\r\n      continue;\r\n    }\r\n    \r\n    save_without_stack:\r\n    {\r\n      str8_list_push_node(path, node);\r\n      continue;\r\n    }\r\n    \r\n    eliminate_stack_top:\r\n    {\r\n      path->node_count -= 1;\r\n      path->total_size -= stack->node->string.size;\r\n      SLLStackPop(stack);\r\n      if(stack == 0)\r\n      {\r\n        path->last = path->first;\r\n      }\r\n      else\r\n      {\r\n        path->last = stack->node;\r\n      }\r\n      continue;\r\n    }\r\n    \r\n    do_nothing: continue;\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8\r\nstr8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style)\r\n{\r\n  StringJoin params = {0};\r\n  switch(style)\r\n  {\r\n    case PathStyle_Null:{}break;\r\n    case PathStyle_Relative:\r\n    case PathStyle_WindowsAbsolute:\r\n    {\r\n      params.sep = str8_lit(\"/\");\r\n    }break;\r\n    \r\n    case PathStyle_UnixAbsolute:\r\n    {\r\n      params.pre = str8_lit(\"/\");\r\n      params.sep = str8_lit(\"/\");\r\n    }break;\r\n  }\r\n  String8 result = str8_list_join(arena, path, &params);\r\n  return result;\r\n}\r\n\r\ninternal String8TxtPtPair\r\nstr8_txt_pt_pair_from_string(String8 string)\r\n{\r\n  String8TxtPtPair pair = {0};\r\n  {\r\n    String8 file_part = {0};\r\n    String8 line_part = {0};\r\n    String8 col_part = {0};\r\n    \r\n    // rjf: grab file part\r\n    for(U64 idx = 0; idx <= string.size; idx += 1)\r\n    {\r\n      U8 byte = (idx < string.size) ? (string.str[idx]) : 0;\r\n      U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0);\r\n      if(byte == ':' && next_byte != '/' && next_byte != '\\\\')\r\n      {\r\n        file_part = str8_prefix(string, idx);\r\n        line_part = str8_skip(string, idx+1);\r\n        break;\r\n      }\r\n      else if(byte == 0)\r\n      {\r\n        file_part = string;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: grab line/column\r\n    {\r\n      U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(\":\"), 0);\r\n      if(colon_pos < line_part.size)\r\n      {\r\n        col_part = str8_skip(line_part, colon_pos+1);\r\n        line_part = str8_prefix(line_part, colon_pos);\r\n      }\r\n    }\r\n    \r\n    // rjf: convert line/column strings to numerics\r\n    U64 line = 0;\r\n    U64 column = 0;\r\n    try_u64_from_str8_c_rules(line_part, &line);\r\n    try_u64_from_str8_c_rules(col_part, &column);\r\n    \r\n    // rjf: fill\r\n    pair.string = file_part;\r\n    pair.pt = txt_pt((S64)line, (S64)column);\r\n    if(pair.pt.line == 0) { pair.pt.line = 1; }\r\n    if(pair.pt.column == 0) { pair.pt.column = 1; }\r\n  }\r\n  return pair;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Relative <-> Absolute Path\r\n\r\ninternal String8\r\npath_relative_dst_from_absolute_dst_src(Arena *arena, String8 dst, String8 src)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  // rjf: gather path parts\r\n  String8 dst_name = str8_skip_last_slash(dst);\r\n  String8 src_folder = src;\r\n  String8 dst_folder = str8_chop_last_slash(dst);\r\n  String8List src_folders = str8_split_path(scratch.arena, src_folder);\r\n  String8List dst_folders = str8_split_path(scratch.arena, dst_folder);\r\n  \r\n  // rjf: count # of backtracks to get from src -> dest\r\n  U64 num_backtracks = src_folders.node_count;\r\n  for(String8Node *src_n = src_folders.first, *bp_n = dst_folders.first;\r\n      src_n != 0 && bp_n != 0;\r\n      src_n = src_n->next, bp_n = bp_n->next)\r\n  {\r\n    if(str8_match(src_n->string, bp_n->string, path_match_flags_from_os(OperatingSystem_CURRENT)))\r\n    {\r\n      num_backtracks -= 1;\r\n    }\r\n    else\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // rjf: only build relative string if # of backtracks is not the entire `src`.\r\n  // if getting to `dst` from `src` requires erasing the entire `src`, then the\r\n  // only possible way to get to `dst` from `src` is via absolute path.\r\n  String8 dst_path = {0};\r\n  if(num_backtracks >= src_folders.node_count)\r\n  {\r\n    dst_path = dst;\r\n  }\r\n  else\r\n  {\r\n    // rjf: build backtrack parts\r\n    String8List dst_path_strs = {0};\r\n    for(U64 idx = 0; idx < num_backtracks; idx += 1)\r\n    {\r\n      str8_list_push(scratch.arena, &dst_path_strs, str8_lit(\"..\"));\r\n    }\r\n    \r\n    // rjf: build parts of dst which are unique from src\r\n    {\r\n      B32 unique_from_src = 0;\r\n      for(String8Node *src_n = src_folders.first, *bp_n = dst_folders.first;\r\n          bp_n != 0;\r\n          bp_n = bp_n->next)\r\n      {\r\n        if(!unique_from_src && (src_n == 0 || !str8_match(src_n->string, bp_n->string, path_match_flags_from_os(OperatingSystem_CURRENT))))\r\n        {\r\n          unique_from_src = 1;\r\n        }\r\n        if(unique_from_src)\r\n        {\r\n          str8_list_push(scratch.arena, &dst_path_strs, bp_n->string);\r\n        }\r\n        if(src_n != 0)\r\n        {\r\n          src_n = src_n->next;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: build file name\r\n    str8_list_push(scratch.arena, &dst_path_strs, dst_name);\r\n    \r\n    // rjf: join\r\n    StringJoin join = {0};\r\n    {\r\n      join.sep = str8_lit(\"/\");\r\n    }\r\n    dst_path = str8_list_join(arena, &dst_path_strs, &join);\r\n  }\r\n  scratch_end(scratch);\r\n  return dst_path;\r\n}\r\n\r\ninternal String8\r\npath_absolute_dst_from_relative_dst_src(Arena *arena, String8 dst, String8 src)\r\n{\r\n  String8 result = dst;\r\n  PathStyle dst_style = path_style_from_str8(dst);\r\n  if(dst.size != 0 && dst_style == PathStyle_Relative)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8 dst_from_src_absolute = push_str8f(scratch.arena, \"%S/%S\", src, dst);\r\n    String8List dst_from_src_absolute_parts = str8_split_path(scratch.arena, dst_from_src_absolute);\r\n    PathStyle dst_from_src_absolute_style = path_style_from_str8(src);\r\n    str8_path_list_resolve_dots_in_place(&dst_from_src_absolute_parts, dst_from_src_absolute_style);\r\n    result = str8_path_list_join_by_style(arena, &dst_from_src_absolute_parts, dst_from_src_absolute_style);\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Path Normalization\r\n\r\ninternal String8List\r\npath_normalized_list_from_string(Arena *arena, String8 path_string, PathStyle *style_out)\r\n{\r\n  // rjf: analyze path\r\n  PathStyle path_style = path_style_from_str8(path_string);\r\n  String8List path = str8_split_path(arena, path_string);\r\n  \r\n  // rjf: resolve dots\r\n  str8_path_list_resolve_dots_in_place(&path, path_style);\r\n  \r\n  // rjf: return\r\n  if(style_out != 0)\r\n  {\r\n    *style_out = path_style;\r\n  }\r\n  return path;\r\n}\r\n\r\ninternal String8\r\npath_normalized_from_string(Arena *arena, String8 path_string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  PathStyle style = PathStyle_Relative;\r\n  String8List path = path_normalized_list_from_string(scratch.arena, path_string, &style);\r\n  String8 result = str8_path_list_join_by_style(arena, &path, style);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\npath_match_normalized(String8 left, String8 right)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 left_normalized = path_normalized_from_string(scratch.arena, left);\r\n  String8 right_normalized = path_normalized_from_string(scratch.arena, right);\r\n  B32 result = str8_match(left_normalized, right_normalized, StringMatchFlag_CaseInsensitive);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Misc. Path Helpers\r\n\r\ninternal PathStyle\r\npath_style_from_string(String8 string)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_path_style_map); ++i)\r\n  {\r\n    if(str8_match(g_path_style_map[i].string, string, StringMatchFlag_CaseInsensitive))\r\n    {\r\n      return g_path_style_map[i].path_style;\r\n    }\r\n  }\r\n  return PathStyle_Null;\r\n}\r\n\r\ninternal String8\r\nstring_from_path_style(PathStyle style)\r\n{\r\n  Assert(style < ArrayCount(g_path_style_map));\r\n  return g_path_style_map[style].string;\r\n}\r\n\r\ninternal String8\r\npath_separator_string_from_style(PathStyle style)\r\n{\r\n  String8 result = str8_zero();\r\n  switch (style)\r\n  {\r\n    case PathStyle_Null:     break;\r\n    case PathStyle_Relative: break;\r\n    case PathStyle_WindowsAbsolute: result = str8_lit(\"\\\\\"); break;\r\n    case PathStyle_UnixAbsolute:    result = str8_lit(\"/\");  break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal StringMatchFlags\r\npath_match_flags_from_os(OperatingSystem os)\r\n{\r\n  StringMatchFlags flags = StringMatchFlag_SlashInsensitive;\r\n  switch(os)\r\n  {\r\n    default:{}break;\r\n    case OperatingSystem_Windows:\r\n    {\r\n      flags |= StringMatchFlag_CaseInsensitive;\r\n    }break;\r\n    case OperatingSystem_Linux:\r\n    case OperatingSystem_Mac:\r\n    {\r\n      // NOTE(rjf): no-op\r\n    }break;\r\n  }\r\n  return flags;\r\n}\r\n\r\ninternal String8\r\npath_convert_slashes(Arena *arena, String8 path, PathStyle path_style)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = str8_split_path(scratch.arena, path);\r\n  StringJoin join = {0};\r\n  join.sep = path_separator_string_from_style(path_style);\r\n  String8 result = str8_list_join(arena, &list, &join);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\npath_replace_file_extension(Arena *arena, String8 file_name, String8 ext)\r\n{\r\n  String8 file_name_no_ext = str8_chop_last_dot(file_name);\r\n  String8 result           = str8f(arena, \"%S.%S\", file_name_no_ext, ext);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UTF-8 & UTF-16 Decoding/Encoding\r\n\r\nread_only global U8 utf8_class[32] =\r\n{\r\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5,\r\n};\r\n\r\ninternal UnicodeDecode\r\nutf8_decode(U8 *str, U64 max)\r\n{\r\n  UnicodeDecode result = {1, max_U32};\r\n  U8 byte = str[0];\r\n  U8 byte_class = utf8_class[byte >> 3];\r\n  switch(byte_class)\r\n  {\r\n    case 1:\r\n    {\r\n      result.codepoint = byte;\r\n    }break;\r\n    case 2:\r\n    {\r\n      if(1 < max)\r\n      {\r\n        U8 cont_byte = str[1];\r\n        if(utf8_class[cont_byte >> 3] == 0)\r\n        {\r\n          result.codepoint = (byte & bitmask5) << 6;\r\n          result.codepoint |=  (cont_byte & bitmask6);\r\n          result.inc = 2;\r\n        }\r\n      }\r\n    }break;\r\n    case 3:\r\n    {\r\n      if(2 < max)\r\n      {\r\n        U8 cont_byte[2] = {str[1], str[2]};\r\n        if(utf8_class[cont_byte[0] >> 3] == 0 &&\r\n           utf8_class[cont_byte[1] >> 3] == 0)\r\n        {\r\n          result.codepoint = (byte & bitmask4) << 12;\r\n          result.codepoint |= ((cont_byte[0] & bitmask6) << 6);\r\n          result.codepoint |=  (cont_byte[1] & bitmask6);\r\n          result.inc = 3;\r\n        }\r\n      }\r\n    }break;\r\n    case 4:\r\n    {\r\n      if(3 < max)\r\n      {\r\n        U8 cont_byte[3] = {str[1], str[2], str[3]};\r\n        if(utf8_class[cont_byte[0] >> 3] == 0 &&\r\n           utf8_class[cont_byte[1] >> 3] == 0 &&\r\n           utf8_class[cont_byte[2] >> 3] == 0)\r\n        {\r\n          result.codepoint = (byte & bitmask3) << 18;\r\n          result.codepoint |= ((cont_byte[0] & bitmask6) << 12);\r\n          result.codepoint |= ((cont_byte[1] & bitmask6) <<  6);\r\n          result.codepoint |=  (cont_byte[2] & bitmask6);\r\n          result.inc = 4;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal UnicodeDecode\r\nutf16_decode(U16 *str, U64 max)\r\n{\r\n  UnicodeDecode result = {1, max_U32};\r\n  result.codepoint = str[0];\r\n  result.inc = 1;\r\n  if(max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000)\r\n  {\r\n    result.codepoint = ((str[0] - 0xD800) << 10) | ((str[1] - 0xDC00) + 0x10000);\r\n    result.inc = 2;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nutf8_encode(U8 *str, U32 codepoint)\r\n{\r\n  U32 inc = 0;\r\n  if(codepoint <= 0x7F)\r\n  {\r\n    str[0] = (U8)codepoint;\r\n    inc = 1;\r\n  }\r\n  else if(codepoint <= 0x7FF)\r\n  {\r\n    str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5);\r\n    str[1] = bit8 | (codepoint & bitmask6);\r\n    inc = 2;\r\n  }\r\n  else if(codepoint <= 0xFFFF)\r\n  {\r\n    str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4);\r\n    str[1] = bit8 | ((codepoint >> 6) & bitmask6);\r\n    str[2] = bit8 | ( codepoint       & bitmask6);\r\n    inc = 3;\r\n  }\r\n  else if(codepoint <= 0x10FFFF)\r\n  {\r\n    str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3);\r\n    str[1] = bit8 | ((codepoint >> 12) & bitmask6);\r\n    str[2] = bit8 | ((codepoint >>  6) & bitmask6);\r\n    str[3] = bit8 | ( codepoint        & bitmask6);\r\n    inc = 4;\r\n  }\r\n  else\r\n  {\r\n    str[0] = '?';\r\n    inc = 1;\r\n  }\r\n  return inc;\r\n}\r\n\r\ninternal U32\r\nutf16_encode(U16 *str, U32 codepoint)\r\n{\r\n  U32 inc = 1;\r\n  if(codepoint == max_U32)\r\n  {\r\n    str[0] = (U16)'?';\r\n  }\r\n  else if(codepoint < 0x10000)\r\n  {\r\n    str[0] = (U16)codepoint;\r\n  }\r\n  else\r\n  {\r\n    U32 v = codepoint - 0x10000;\r\n    str[0] = safe_cast_u16(0xD800 + (v >> 10));\r\n    str[1] = safe_cast_u16(0xDC00 + (v & bitmask10));\r\n    inc = 2;\r\n  }\r\n  return inc;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Unicode String Conversions\r\n\r\ninternal String8\r\nstr8_from_16(Arena *arena, String16 in)\r\n{\r\n  String8 result = str8_zero();\r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size*3;\r\n    U8 *str = push_array_no_zero(arena, U8, cap + 1);\r\n    U16 *ptr = in.str;\r\n    U16 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    UnicodeDecode consume;\r\n    for(;ptr < opl; ptr += consume.inc)\r\n    {\r\n      consume = utf16_decode(ptr, opl - ptr);\r\n      size += utf8_encode(str + size, consume.codepoint);\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size));\r\n    result = str8(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_from_8(Arena *arena, String8 in)\r\n{\r\n  String16 result = str16_zero();\r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size*2;\r\n    U16 *str = push_array_no_zero(arena, U16, cap + 1);\r\n    U8 *ptr = in.str;\r\n    U8 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    UnicodeDecode consume;\r\n    for(;ptr < opl; ptr += consume.inc)\r\n    {\r\n      consume = utf8_decode(ptr, opl - ptr);\r\n      size += utf16_encode(str + size, consume.codepoint);\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size)*2);\r\n    result = str16(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_32(Arena *arena, String32 in)\r\n{\r\n  String8 result = str8_zero();\r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size*4;\r\n    U8 *str = push_array_no_zero(arena, U8, cap + 1);\r\n    U32 *ptr = in.str;\r\n    U32 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    for(;ptr < opl; ptr += 1)\r\n    {\r\n      size += utf8_encode(str + size, *ptr);\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size));\r\n    result = str8(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String32\r\nstr32_from_8(Arena *arena, String8 in)\r\n{\r\n  String32 result = str32_zero(); \r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size;\r\n    U32 *str = push_array_no_zero(arena, U32, cap + 1);\r\n    U8 *ptr = in.str;\r\n    U8 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    UnicodeDecode consume;\r\n    for(;ptr < opl; ptr += consume.inc)\r\n    {\r\n      consume = utf8_decode(ptr, opl - ptr);\r\n      str[size] = consume.codepoint;\r\n      size += 1;\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size)*4);\r\n    result = str32(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Types & Space Enum -> String Conversions\r\n\r\nread_only global struct\r\n{\r\n  String8         string;\r\n  OperatingSystem os;\r\n} g_os_enum_map[] =\r\n{\r\n  { str8_lit_comp(\"\"),        OperatingSystem_Null     },\r\n  { str8_lit_comp(\"Windows\"), OperatingSystem_Windows, },\r\n  { str8_lit_comp(\"Linux\"),   OperatingSystem_Linux,   },\r\n  { str8_lit_comp(\"Mac\"),     OperatingSystem_Mac,     },\r\n};\r\nStaticAssert(ArrayCount(g_os_enum_map) == OperatingSystem_COUNT, g_os_enum_map_count_check);\r\n\r\ninternal OperatingSystem\r\noperating_system_from_string(String8 string)\r\n{\r\n  for EachElement(idx, g_os_enum_map)\r\n  {\r\n    if(str8_match(g_os_enum_map[idx].string, string, StringMatchFlag_CaseInsensitive))\r\n    {\r\n      return g_os_enum_map[idx].os;\r\n    }\r\n  }\r\n  return OperatingSystem_Null;\r\n}\r\n\r\ninternal String8\r\nstring_from_dimension(Dimension dimension)\r\n{\r\n  read_only local_persist String8 strings[] =\r\n  {\r\n    str8_lit_comp(\"X\"),\r\n    str8_lit_comp(\"Y\"),\r\n    str8_lit_comp(\"Z\"),\r\n    str8_lit_comp(\"W\"),\r\n  };\r\n  String8 result = str8_lit(\"error\");\r\n  if((U32)dimension < 4)\r\n  {\r\n    result = strings[dimension];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_side(Side side)\r\n{\r\n  local_persist String8 strings[] =\r\n  {\r\n    str8_lit_comp(\"Min\"),\r\n    str8_lit_comp(\"Max\"),\r\n  };\r\n  String8 result = str8_lit(\"error\");\r\n  if((U32)side < 2)\r\n  {\r\n    result = strings[side];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_operating_system(OperatingSystem os)\r\n{\r\n  String8 result = g_os_enum_map[OperatingSystem_Null].string;\r\n  if(os < ArrayCount(g_os_enum_map))\r\n  {\r\n    result = g_os_enum_map[os].string;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_arch(Arch arch)\r\n{\r\n  String8 result = {0};\r\n  switch(arch)\r\n  {\r\n    case Arch_Null:  {result = str8_lit(\"Null\");}break;\r\n    case Arch_x64:   {result = str8_lit(\"x64\");}break;\r\n    case Arch_x86:   {result = str8_lit(\"x86\");}break;\r\n    case Arch_arm64: {result = str8_lit(\"arm64\");}break;\r\n    case Arch_arm32: {result = str8_lit(\"arm32\");}break;\r\n    case Arch_COUNT:\r\n    {result = str8_lit(\"Invalid\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_week_day(WeekDay week_day)\r\n{\r\n  read_only local_persist String8 strings[] =\r\n  {\r\n    str8_lit_comp(\"Sun\"),\r\n    str8_lit_comp(\"Mon\"),\r\n    str8_lit_comp(\"Tue\"),\r\n    str8_lit_comp(\"Wed\"),\r\n    str8_lit_comp(\"Thu\"),\r\n    str8_lit_comp(\"Fri\"),\r\n    str8_lit_comp(\"Sat\"),\r\n  };\r\n  String8 result = str8_lit(\"Err\");\r\n  if((U32)week_day < WeekDay_COUNT)\r\n  {\r\n    result = strings[week_day];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_month(Month month)\r\n{\r\n  read_only local_persist String8 strings[] =\r\n  {\r\n    str8_lit_comp(\"Jan\"),\r\n    str8_lit_comp(\"Feb\"),\r\n    str8_lit_comp(\"Mar\"),\r\n    str8_lit_comp(\"Apr\"),\r\n    str8_lit_comp(\"May\"),\r\n    str8_lit_comp(\"Jun\"),\r\n    str8_lit_comp(\"Jul\"),\r\n    str8_lit_comp(\"Aug\"),\r\n    str8_lit_comp(\"Sep\"),\r\n    str8_lit_comp(\"Oct\"),\r\n    str8_lit_comp(\"Nov\"),\r\n    str8_lit_comp(\"Dec\"),\r\n  };\r\n  String8 result = str8_lit(\"Err\");\r\n  if((U32)month < Month_COUNT)\r\n  {\r\n    result = strings[month];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_date_time(Arena *arena, DateTime *date_time)\r\n{\r\n  char *mon_str = (char*)string_from_month(date_time->month).str;\r\n  U32 adjusted_hour = date_time->hour%12;\r\n  if(adjusted_hour == 0)\r\n  {\r\n    adjusted_hour = 12;\r\n  }\r\n  char *ampm = \"am\";\r\n  if(date_time->hour >= 12)\r\n  {\r\n    ampm = \"pm\";\r\n  }\r\n  String8 result = push_str8f(arena, \"%d %s %d, %02d:%02d:%02d %s\",\r\n                              date_time->day, mon_str, date_time->year,\r\n                              adjusted_hour, date_time->min, date_time->sec, ampm);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_date_time__file_name(Arena *arena, DateTime *date_time)\r\n{\r\n  char *mon_str = (char*)string_from_month(date_time->month).str;\r\n  String8 result = str8f(arena, \"%d-%s-%0d--%02d-%02d-%02d\",\r\n                         date_time->year, mon_str, date_time->day,\r\n                         date_time->hour, date_time->min, date_time->sec);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_elapsed_time(Arena *arena, DateTime dt)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if(dt.year)\r\n  {\r\n    str8_list_pushf(scratch.arena, &list, \"%dy\", dt.year);\r\n    str8_list_pushf(scratch.arena, &list, \"%um\", dt.mon);\r\n    str8_list_pushf(scratch.arena, &list, \"%ud\", dt.day);\r\n  }\r\n  else if(dt.mon)\r\n  {\r\n    str8_list_pushf(scratch.arena, &list, \"%um\", dt.mon);\r\n    str8_list_pushf(scratch.arena, &list, \"%ud\", dt.day);\r\n  }\r\n  else if (dt.day)\r\n  {\r\n    str8_list_pushf(scratch.arena, &list, \"%ud\", dt.day);\r\n  }\r\n  str8_list_pushf(scratch.arena, &list, \"%u:%u:%u:%u ms\", dt.hour, dt.min, dt.sec, dt.msec);\r\n  StringJoin join = { str8_lit_comp(\"\"), str8_lit_comp(\" \"), str8_lit_comp(\"\") };\r\n  String8 result = str8_list_join(arena, &list, &join);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Globally Unique IDs\r\n\r\ninternal String8\r\nstring_from_guid(Arena *arena, Guid guid)\r\n{\r\n  String8 result = str8f(arena, \"%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\",\r\n                         guid.data1,\r\n                         guid.data2,\r\n                         guid.data3,\r\n                         guid.data4[0],\r\n                         guid.data4[1],\r\n                         guid.data4[2],\r\n                         guid.data4[3],\r\n                         guid.data4[4],\r\n                         guid.data4[5],\r\n                         guid.data4[6],\r\n                         guid.data4[7]);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ntry_guid_from_string(String8 string, Guid *guid_out)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  B32 is_parsed = 0;\r\n  String8List list = str8_split_by_string_chars(scratch.arena, string, str8_lit(\"-\"), StringSplitFlag_KeepEmpties);\r\n  if(list.node_count == 5)\r\n  {\r\n    String8 data1_str    = list.first->string;\r\n    String8 data2_str    = list.first->next->string;\r\n    String8 data3_str    = list.first->next->next->string;\r\n    String8 data4_hi_str = list.first->next->next->next->string;\r\n    String8 data4_lo_str = list.first->next->next->next->next->string;\r\n    if(str8_is_integer(data1_str, 16) && \r\n       str8_is_integer(data2_str, 16) &&\r\n       str8_is_integer(data3_str, 16) &&\r\n       str8_is_integer(data4_hi_str, 16) &&\r\n       str8_is_integer(data4_lo_str, 16))\r\n    {\r\n      U64 data1    = u64_from_str8(data1_str, 16);\r\n      U64 data2    = u64_from_str8(data2_str, 16);\r\n      U64 data3    = u64_from_str8(data3_str, 16);\r\n      U64 data4_hi = u64_from_str8(data4_hi_str, 16);\r\n      U64 data4_lo = u64_from_str8(data4_lo_str, 16);\r\n      if(data1 <= max_U32 &&\r\n         data2 <= max_U16 &&\r\n         data3 <= max_U16 &&\r\n         data4_hi <= max_U16 &&\r\n         data4_lo <= 0xffffffffffff)\r\n      {\r\n        guid_out->data1 = (U32)data1;\r\n        guid_out->data2 = (U16)data2;\r\n        guid_out->data3 = (U16)data3;\r\n        U64 data4 = (data4_hi << 48) | data4_lo;\r\n        MemoryCopy(&guid_out->data4[0], &data4, sizeof(data4));\r\n        is_parsed = 1;\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return is_parsed;\r\n}\r\n\r\ninternal Guid\r\nguid_from_string(String8 string)\r\n{\r\n  Guid guid = {0};\r\n  try_guid_from_string(string, &guid);\r\n  return guid;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Text Indentation\r\n\r\ninternal String8\r\nindented_from_string(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  read_only local_persist U8 indentation_bytes[] = \"                                                                                                                                \";\r\n  String8List indented_strings = {0};\r\n  S64 depth = 0;\r\n  S64 next_depth = 0;\r\n  U64 line_begin_off = 0;\r\n  for(U64 off = 0; off <= string.size; off += 1)\r\n  {\r\n    U8 byte = off<string.size ? string.str[off] : 0;\r\n    switch(byte)\r\n    {\r\n      default:{}break;\r\n      case '{':case '[':case '(':{next_depth += 1; next_depth = Max(0, next_depth);}break;\r\n      case '}':case ']':case ')':{next_depth -= 1; next_depth = Max(0, next_depth); depth = next_depth;}break;\r\n      case '\\n':\r\n      case 0:\r\n      {\r\n        String8 line = str8_skip_chop_whitespace(str8_substr(string, r1u64(line_begin_off, off)));\r\n        if(line.size != 0)\r\n        {\r\n          str8_list_pushf(scratch.arena, &indented_strings, \"%.*s%S\\n\", (int)depth*2, indentation_bytes, line);\r\n        }\r\n        if(line.size == 0 && indented_strings.node_count != 0 && off < string.size)\r\n        {\r\n          str8_list_pushf(scratch.arena, &indented_strings, \"\\n\");\r\n        }\r\n        line_begin_off = off+1;\r\n        depth = next_depth;\r\n      }break;\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &indented_strings, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Escaping\r\n\r\ninternal String8\r\nescaped_from_raw_str8(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List parts = {0};\r\n  U64 start_split_idx = 0;\r\n  for(U64 idx = 0; idx <= string.size; idx += 1)\r\n  {\r\n    U8 byte = (idx < string.size) ? string.str[idx] : 0;\r\n    B32 split = 1;\r\n    String8 separator_replace = {0};\r\n    switch(byte)\r\n    {\r\n      default:{split = 0;}break;\r\n      case 0:    {}break;\r\n      case '\\a': {separator_replace = str8_lit(\"\\\\a\");}break;\r\n      case '\\b': {separator_replace = str8_lit(\"\\\\b\");}break;\r\n      case '\\f': {separator_replace = str8_lit(\"\\\\f\");}break;\r\n      case '\\n': {separator_replace = str8_lit(\"\\\\n\");}break;\r\n      case '\\r': {separator_replace = str8_lit(\"\\\\r\");}break;\r\n      case '\\t': {separator_replace = str8_lit(\"\\\\t\");}break;\r\n      case '\\v': {separator_replace = str8_lit(\"\\\\v\");}break;\r\n      case '\\\\': {separator_replace = str8_lit(\"\\\\\\\\\");}break;\r\n      case '\"':  {separator_replace = str8_lit(\"\\\\\\\"\");}break;\r\n    }\r\n    if(split)\r\n    {\r\n      String8 substr = str8_substr(string, r1u64(start_split_idx, idx));\r\n      start_split_idx = idx+1;\r\n      str8_list_push(scratch.arena, &parts, substr);\r\n      if(separator_replace.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &parts, separator_replace);\r\n      }\r\n    }\r\n  }\r\n  StringJoin join = {0};\r\n  String8 result = str8_list_join(arena, &parts, &join);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nraw_from_escaped_str8(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strs = {0};\r\n  U64 start = 0;\r\n  for(U64 idx = 0; idx <= string.size; idx += 1)\r\n  {\r\n    if(idx == string.size || string.str[idx] == '\\\\' || string.str[idx] == '\\r')\r\n    {\r\n      String8 str = str8_substr(string, r1u64(start, idx));\r\n      if(str.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &strs, str);\r\n      }\r\n      start = idx+1;\r\n    }\r\n    if(idx < string.size && string.str[idx] == '\\\\')\r\n    {\r\n      U8 next_char = string.str[idx+1];\r\n      U8 replace_byte = 0;\r\n      switch(next_char)\r\n      {\r\n        default:{}break;\r\n        case 'a': replace_byte = 0x07; break;\r\n        case 'b': replace_byte = 0x08; break;\r\n        case 'e': replace_byte = 0x1b; break;\r\n        case 'f': replace_byte = 0x0c; break;\r\n        case 'n': replace_byte = 0x0a; break;\r\n        case 'r': replace_byte = 0x0d; break;\r\n        case 't': replace_byte = 0x09; break;\r\n        case 'v': replace_byte = 0x0b; break;\r\n        case '\\\\':replace_byte = '\\\\'; break;\r\n        case '\\'':replace_byte = '\\''; break;\r\n        case '\"': replace_byte = '\"';  break;\r\n        case '?': replace_byte = '?';  break;\r\n      }\r\n      String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1));\r\n      str8_list_push(scratch.arena, &strs, replace_string);\r\n      idx += 1;\r\n      start += 1;\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &strs, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Wrapping\r\n\r\ninternal String8List\r\nwrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent)\r\n{\r\n  String8List list = {0};\r\n  Rng1U64 line_range = r1u64(0, 0);\r\n  U64 wrapped_indent_level = 0;\r\n  static char *spaces = \"                                                                \";\r\n  for (U64 idx = 0; idx <= string.size; idx += 1){\r\n    U8 chr = idx < string.size ? string.str[idx] : 0;\r\n    if (chr == '\\n'){\r\n      Rng1U64 candidate_line_range = line_range;\r\n      candidate_line_range.max = idx;\r\n      // NOTE(nick): when wrapping is interrupted with \\n we emit a string without including \\n\r\n      // because later tool_fprint_list inserts separator after each node\r\n      // except for last node, so don't strip last \\n.\r\n      if (idx + 1 == string.size){\r\n        candidate_line_range.max += 1;\r\n      }\r\n      String8 substr = str8_substr(string, candidate_line_range);\r\n      str8_list_push(arena, &list, substr);\r\n      line_range = r1u64(idx+1,idx+1);\r\n    }\r\n    else\r\n      if (char_is_space(chr) || chr == 0){\r\n      Rng1U64 candidate_line_range = line_range;\r\n      candidate_line_range.max = idx;\r\n      String8 substr = str8_substr(string, candidate_line_range);\r\n      U64 width_this_line = max_width-wrapped_indent_level;\r\n      if (list.node_count == 0){\r\n        width_this_line = first_line_max_width;\r\n      }\r\n      if (substr.size > width_this_line){\r\n        String8 line = str8_substr(string, line_range);\r\n        if (wrapped_indent_level > 0){\r\n          line = push_str8f(arena, \"%.*s%S\", wrapped_indent_level, spaces, line);\r\n        }\r\n        str8_list_push(arena, &list, line);\r\n        line_range = r1u64(line_range.max+1, candidate_line_range.max);\r\n        wrapped_indent_level = ClampTop(64, wrap_indent);\r\n      }\r\n      else{\r\n        line_range = candidate_line_range;\r\n      }\r\n    }\r\n  }\r\n  if (line_range.min < string.size && line_range.max > line_range.min){\r\n    String8 line = str8_substr(string, line_range);\r\n    if (wrapped_indent_level > 0){\r\n      line = push_str8f(arena, \"%.*s%S\", wrapped_indent_level, spaces, line);\r\n    }\r\n    str8_list_push(arena, &list, line);\r\n  }\r\n  return list;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Color\r\n\r\ninternal String8\r\nhex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba)\r\n{\r\n  String8 hex_string = str8f(arena, \"%02x%02x%02x%02x\", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f));\r\n  return hex_string;\r\n}\r\n\r\ninternal Vec4F32\r\nrgba_from_hex_string_4f32(String8 hex_string)\r\n{\r\n  U8 byte_text[8] = {0};\r\n  U64 byte_text_idx = 0;\r\n  for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1)\r\n  {\r\n    if(char_is_digit(hex_string.str[idx], 16))\r\n    {\r\n      byte_text[byte_text_idx] = lower_from_char(hex_string.str[idx]);\r\n      byte_text_idx += 1;\r\n    }\r\n  }\r\n  U8 byte_vals[4] = {0};\r\n  for(U64 idx = 0; idx < 4; idx += 1)\r\n  {\r\n    byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16);\r\n  }\r\n  Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f);\r\n  return rgba;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Fuzzy Matching\r\n\r\ninternal FuzzyMatchRangeList\r\nfuzzy_match_find(Arena *arena, String8 needle, String8 haystack)\r\n{\r\n  FuzzyMatchRangeList result = {0};\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List needles = str8_split(scratch.arena, needle, (U8*)\" \", 1, 0);\r\n  result.needle_part_count = needles.node_count;\r\n  for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next)\r\n  {\r\n    U64 find_pos = 0;\r\n    for(;find_pos < haystack.size;)\r\n    {\r\n      find_pos = str8_find_needle(haystack, find_pos, needle_n->string, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive);\r\n      B32 is_in_gathered_ranges = 0;\r\n      for(FuzzyMatchRangeNode *n = result.first; n != 0; n = n->next)\r\n      {\r\n        if(n->range.min <= find_pos && find_pos < n->range.max)\r\n        {\r\n          is_in_gathered_ranges = 1;\r\n          find_pos = n->range.max;\r\n          break;\r\n        }\r\n      }\r\n      if(!is_in_gathered_ranges)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    if(find_pos < haystack.size)\r\n    {\r\n      Rng1U64 range = r1u64(find_pos, find_pos+needle_n->string.size);\r\n      FuzzyMatchRangeNode *n = push_array(arena, FuzzyMatchRangeNode, 1);\r\n      n->range = range;\r\n      SLLQueuePush(result.first, result.last, n);\r\n      result.count += 1;\r\n      result.total_dim += dim_1u64(range);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal FuzzyMatchRangeList\r\nfuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src)\r\n{\r\n  FuzzyMatchRangeList dst = {0};\r\n  for(FuzzyMatchRangeNode *src_n = src->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    FuzzyMatchRangeNode *dst_n = push_array(arena, FuzzyMatchRangeNode, 1);\r\n    SLLQueuePush(dst.first, dst.last, dst_n);\r\n    dst_n->range = src_n->range;\r\n  }\r\n  dst.count = src->count;\r\n  dst.needle_part_count = src->needle_part_count;\r\n  dst.total_dim = src->total_dim;\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Serialization Helpers\r\n\r\ninternal void\r\nstr8_serial_begin(Arena *arena, String8List *srl){\r\n  String8Node *node = push_array(arena, String8Node, 1);\r\n  node->string.str = push_array_no_zero(arena, U8, 0);\r\n  srl->first = srl->last = node;\r\n  srl->node_count = 1;\r\n  srl->total_size = 0;\r\n}\r\n\r\ninternal String8\r\nstr8_serial_end(Arena *arena, String8List *srl){\r\n  U64 size = srl->total_size;\r\n  U8 *out = push_array_no_zero(arena, U8, size);\r\n  str8_serial_write_to_dst(srl, out);\r\n  String8 result = str8(out, size);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nstr8_serial_write_to_dst(String8List *srl, void *out){\r\n  U8 *ptr = (U8*)out;\r\n  for (String8Node *node = srl->first;\r\n       node != 0;\r\n       node = node->next){\r\n    U64 size = node->string.size;\r\n    MemoryCopy(ptr, node->string.str, size);\r\n    ptr += size;\r\n  }\r\n}\r\n\r\ninternal U64\r\nstr8_serial_push_align(Arena *arena, String8List *srl, U64 align){\r\n  Assert(IsPow2(align));\r\n  \r\n  U64 pos = srl->total_size;\r\n  U64 new_pos = AlignPow2(pos, align);\r\n  U64 size = (new_pos - pos);\r\n  \r\n  if(size != 0)\r\n  {\r\n    U8 *buf = push_array(arena, U8, size);\r\n    \r\n    String8 *str = &srl->last->string;\r\n    if (str->str + str->size == buf){\r\n      srl->last->string.size += size;\r\n      srl->total_size += size;\r\n    }\r\n    else{\r\n      str8_list_push(arena, srl, str8(buf, size));\r\n    }\r\n  }\r\n  return size;\r\n}\r\n\r\ninternal void *\r\nstr8_serial_push_size(Arena *arena, String8List *srl, U64 size)\r\n{\r\n  void *result = 0;\r\n  if(size != 0)\r\n  {\r\n    U8 *buf = push_array_no_zero(arena, U8, size);\r\n    String8 *str = &srl->last->string;\r\n    if (str->str + str->size == buf){\r\n      srl->last->string.size += size;\r\n      srl->total_size += size;\r\n    }\r\n    else{\r\n      str8_list_push(arena, srl, str8(buf, size));\r\n    }\r\n    result = buf;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void *\r\nstr8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){\r\n  void *result = str8_serial_push_size(arena, srl, size);\r\n  if(result != 0)\r\n  {\r\n    MemoryCopy(result, data, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){\r\n  for (String8Node *node = first;\r\n       node != 0;\r\n       node = node->next){\r\n    str8_serial_push_data(arena, srl, node->string.str, node->string.size);\r\n  }\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u64(Arena *arena, String8List *srl, U64 x){\r\n  U8 *buf = push_array_no_zero(arena, U8, 8);\r\n  MemoryCopy(buf, &x, 8);\r\n  String8 *str = &srl->last->string;\r\n  if (str->str + str->size == buf){\r\n    srl->last->string.size += 8;\r\n    srl->total_size += 8;\r\n  }\r\n  else{\r\n    str8_list_push(arena, srl, str8(buf, 8));\r\n  }\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u32(Arena *arena, String8List *srl, U32 x){\r\n  U8 *buf = push_array_no_zero(arena, U8, 4);\r\n  MemoryCopy(buf, &x, 4);\r\n  String8 *str = &srl->last->string;\r\n  if (str->str + str->size == buf){\r\n    srl->last->string.size += 4;\r\n    srl->total_size += 4;\r\n  }\r\n  else{\r\n    str8_list_push(arena, srl, str8(buf, 4));\r\n  }\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u16(Arena *arena, String8List *srl, U16 x){\r\n  str8_serial_push_data(arena, srl, &x, sizeof(x));\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u8(Arena *arena, String8List *srl, U8 x){\r\n  str8_serial_push_data(arena, srl, &x, sizeof(x));\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){\r\n  str8_serial_push_data(arena, srl, str.str, str.size);\r\n  str8_serial_push_u8(arena, srl, 0);\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_string(Arena *arena, String8List *srl, String8 str){\r\n  str8_serial_push_data(arena, srl, str.str, str.size);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Deserialization Helpers\r\n\r\ninternal U64\r\nstr8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity)\r\n{\r\n  U64 bytes_left = string.size-Min(off, string.size);\r\n  U64 actually_readable_size = Min(bytes_left, read_size);\r\n  U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity;\r\n  if(legally_readable_size > 0)\r\n  {\r\n    MemoryCopy(read_dst, string.str+off, legally_readable_size);\r\n  }\r\n  return legally_readable_size;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_find_first_match(String8 string, U64 off, U16 scan_val)\r\n{\r\n  U64 cursor = off;\r\n  for (;;) {\r\n    U16 val = 0;\r\n    str8_deserial_read_struct(string, cursor, &val);\r\n    if (val == scan_val) {\r\n      break;\r\n    }\r\n    cursor += sizeof(val);\r\n  }\r\n  return cursor;\r\n}\r\n\r\ninternal void *\r\nstr8_deserial_get_raw_ptr(String8 string, U64 off, U64 size)\r\n{\r\n  void *raw_ptr = 0;\r\n  if (off + size <= string.size) {\r\n    raw_ptr = string.str + off;\r\n  }\r\n  return raw_ptr;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out)\r\n{\r\n  U64 cstr_size = 0;\r\n  if (off < string.size) {\r\n    U8 *ptr = string.str + off;\r\n    U8 *cap = string.str + string.size;\r\n    *cstr_out = str8_cstring_capped(ptr, cap);\r\n    cstr_size = (cstr_out->size + 1);\r\n  }\r\n  return cstr_size;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out)\r\n{\r\n  U64 null_off = str8_deserial_find_first_match(string, off, 0);\r\n  U64 size = null_off - off;\r\n  U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size);\r\n  U64 count = size / sizeof(*str);\r\n  *str_out = str16(str, count);\r\n  \r\n  U64 read_size_with_null = size + sizeof(*str);\r\n  return read_size_with_null;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out)\r\n{\r\n  Rng1U64 range = rng_1u64(off, off + size);\r\n  *block_out = str8_substr(string, range);\r\n  return block_out->size;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal int\r\nstr8_compar(String8 a, String8 b, B32 ignore_case)\r\n{\r\n  int cmp = 0;\r\n  U64 size = Min(a.size, b.size);\r\n  if (ignore_case) {\r\n    for (U64 i = 0; i < size; ++i) {\r\n      U8 la = lower_from_char(a.str[i]);\r\n      U8 lb = lower_from_char(b.str[i]);\r\n      if (la < lb) {\r\n        cmp = -1;\r\n        break;\r\n      } else if (la > lb) {\r\n        cmp = +1;\r\n        break;\r\n      }\r\n    } \r\n  } else {\r\n    for (U64 i = 0; i < size; ++i) {\r\n      if (a.str[i] < b.str[i]) {\r\n        cmp = -1;\r\n        break;\r\n      } else if (a.str[i] > b.str[i]) {\r\n        cmp = +1;\r\n        break;\r\n      }\r\n    } \r\n  }\r\n  \r\n  if (cmp == 0) {\r\n    // shorter prefix must precede longer prefixes\r\n    if (a.size > b.size) {\r\n      cmp = +1;\r\n    } else if (b.size > a.size) {\r\n      cmp = -1;\r\n    }\r\n  }\r\n  \r\n  return cmp;\r\n}\r\n\r\ninternal int str8_compar_ignore_case(const void *a, const void *b)\r\n{\r\n  return str8_compar(*(String8*)a, *(String8*)b, 1);\r\n}\r\n\r\ninternal int\r\nstr8_compar_case_sensitive(const void *a, const void *b)\r\n{\r\n  return str8_compar(*(String8*)a, *(String8*)b, 0);\r\n}\r\n\r\ninternal int\r\nstr8_is_before_case_sensitive(const void *a, const void *b)\r\n{\r\n  int cmp = str8_compar_case_sensitive(a, b);\r\n  return cmp < 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic String Hashes\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_INLINE_ALL\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal U64\r\nu64_hash_from_seed_str8(U64 seed, String8 string)\r\n{\r\n  U64 result = XXH3_64bits_withSeed(string.str, string.size, seed);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nu64_hash_from_str8(String8 string)\r\n{\r\n  U64 result = u64_hash_from_seed_str8(5381, string);\r\n  return result;\r\n}\r\n\r\ninternal U128\r\nu128_hash_from_seed_str8(U64 seed, String8 string)\r\n{\r\n  U128 result = {0};\r\n  XXH128_hash_t hash = XXH3_128bits_withSeed(string.str, string.size, seed);\r\n  MemoryCopy(&result, &hash, sizeof(result));\r\n  return result;\r\n}\r\n\r\ninternal U128\r\nu128_hash_from_str8(String8 string)\r\n{\r\n  U128 result = u128_hash_from_seed_str8(5381, string);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/base/base_strings.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_STRINGS_H\r\n#define BASE_STRINGS_H\r\n\r\n////////////////////////////////\r\n//~ rjf: String Types\r\n\r\ntypedef struct String8 String8;\r\nstruct String8\r\n{\r\n  U8 *str;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct String16 String16;\r\nstruct String16\r\n{\r\n  U16 *str;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct String32 String32;\r\nstruct String32\r\n{\r\n  U32 *str;\r\n  U64 size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String List & Array Types\r\n\r\ntypedef struct String8Node String8Node;\r\nstruct String8Node\r\n{\r\n  String8Node *next;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct String8List String8List;\r\nstruct String8List\r\n{\r\n  String8Node *first;\r\n  String8Node *last;\r\n  U64 node_count;\r\n  U64 total_size;\r\n};\r\n\r\ntypedef struct String8Array String8Array;\r\nstruct String8Array\r\n{\r\n  String8 *v;\r\n  U64 count;\r\n  U64 total_size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Matching, Splitting, & Joining Types\r\n\r\ntypedef U32 StringMatchFlags;\r\nenum\r\n{\r\n  StringMatchFlag_CaseInsensitive  = (1 << 0),\r\n  StringMatchFlag_RightSideSloppy  = (1 << 1),\r\n  StringMatchFlag_SlashInsensitive = (1 << 2),\r\n};\r\n\r\ntypedef U32 StringSplitFlags;\r\nenum\r\n{\r\n  StringSplitFlag_KeepEmpties = (1 << 0),\r\n};\r\n\r\ntypedef enum PathStyle\r\n{\r\n  PathStyle_Null,\r\n  PathStyle_Relative,\r\n  PathStyle_WindowsAbsolute,\r\n  PathStyle_UnixAbsolute,\r\n  \r\n#if OS_WINDOWS\r\n  PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute\r\n#elif OS_LINUX\r\n  PathStyle_SystemAbsolute = PathStyle_UnixAbsolute\r\n#else\r\n# error Absolute path style is undefined for this OS.\r\n#endif\r\n}\r\nPathStyle;\r\n\r\ntypedef struct StringJoin StringJoin;\r\nstruct StringJoin\r\n{\r\n  String8 pre;\r\n  String8 sep;\r\n  String8 post;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Pair Types\r\n\r\ntypedef struct String8TxtPtPair String8TxtPtPair;\r\nstruct String8TxtPtPair\r\n{\r\n  String8 string;\r\n  TxtPt pt;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: UTF Decoding Types\r\n\r\ntypedef struct UnicodeDecode UnicodeDecode;\r\nstruct UnicodeDecode\r\n{\r\n  U32 inc;\r\n  U32 codepoint;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Fuzzy Matching Types\r\n\r\ntypedef struct FuzzyMatchRangeNode FuzzyMatchRangeNode;\r\nstruct FuzzyMatchRangeNode\r\n{\r\n  FuzzyMatchRangeNode *next;\r\n  Rng1U64 range;\r\n};\r\n\r\ntypedef struct FuzzyMatchRangeList FuzzyMatchRangeList;\r\nstruct FuzzyMatchRangeList\r\n{\r\n  FuzzyMatchRangeNode *first;\r\n  FuzzyMatchRangeNode *last;\r\n  U64 count;\r\n  U64 needle_part_count;\r\n  U64 total_dim;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Character Classification & Conversion Functions\r\n\r\ninternal B32 char_is_space(U8 c);\r\ninternal B32 char_is_upper(U8 c);\r\ninternal B32 char_is_lower(U8 c);\r\ninternal B32 char_is_alpha(U8 c);\r\ninternal B32 char_is_slash(U8 c);\r\ninternal B32 char_is_digit(U8 c, U32 base);\r\ninternal U8 lower_from_char(U8 c);\r\ninternal U8 upper_from_char(U8 c);\r\ninternal U8 correct_slash_from_char(U8 c);\r\n\r\n////////////////////////////////\r\n//~ rjf: C-String Measurement\r\n\r\ninternal U64 cstring8_length(U8 *c);\r\ninternal U64 cstring16_length(U16 *c);\r\ninternal U64 cstring32_length(U32 *c);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Constructors\r\n\r\n#define str8_lit(S)  str8((U8*)(S), sizeof(S) - 1)\r\n#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,}\r\n#define str8_varg(S) (int)((S).size), ((S).str)\r\n\r\n#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C))\r\n#define str8_array_fixed(S) str8((U8*)(S), sizeof(S))\r\n#define str8_struct(S) str8((U8*)(S), sizeof(*(S)))\r\n\r\ninternal String8  str8(U8 *str, U64 size);\r\ninternal String8  str8_range(U8 *first, U8 *one_past_last);\r\ninternal String8  str8_zero(void);\r\ninternal String16 str16(U16 *str, U64 size);\r\ninternal String16 str16_range(U16 *first, U16 *one_past_last);\r\ninternal String16 str16_zero(void);\r\ninternal String32 str32(U32 *str, U64 size);\r\ninternal String32 str32_range(U32 *first, U32 *one_past_last);\r\ninternal String32 str32_zero(void);\r\ninternal String8  str8_cstring(char *c);\r\ninternal String16 str16_cstring(U16 *c);\r\ninternal String32 str32_cstring(U32 *c);\r\ninternal String8  str8_cstring_capped(void *cstr, void *cap);\r\ninternal String16 str16_cstring_capped(void *cstr, void *cap);\r\ninternal String8  str8_cstring_capped_reverse(void *raw_start, void *raw_cap);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Stylization\r\n\r\ninternal String8 upper_from_str8(Arena *arena, String8 string);\r\ninternal String8 lower_from_str8(Arena *arena, String8 string);\r\ninternal String8 backslashed_from_str8(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Matching\r\n\r\n#define str8_match_lit(a_lit, b, flags)   str8_match(str8_lit(a_lit), (b), (flags))\r\n#define str8_match_cstr(a_cstr, b, flags) str8_match(str8_cstring(a_cstr), (b), (flags))\r\ninternal B32 str8_match(String8 a, String8 b, StringMatchFlags flags);\r\ninternal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags);\r\ninternal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags);\r\ninternal B32 str8_is_before(String8 a, String8 b);\r\n#define str8_ends_with(string, end, flags) str8_match(str8_postfix((string), (end).size), (end), (flags))\r\n\r\n////////////////////////////////\r\n//~ rjf: String Slicing\r\n\r\ninternal String8 str8_substr(String8 str, Rng1U64 range);\r\ninternal String8 str8_prefix(String8 str, U64 size);\r\ninternal String8 str8_skip(String8 str, U64 amt);\r\ninternal String8 str8_postfix(String8 str, U64 size);\r\ninternal String8 str8_chop(String8 str, U64 amt);\r\ninternal String8 str8_skip_chop_whitespace(String8 string);\r\ninternal String8 str8_skip_chop_slashes(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Formatting & Copying\r\n\r\ninternal String8 str8_cat(Arena *arena, String8 s1, String8 s2);\r\ninternal String8 str8_copy(Arena *arena, String8 s);\r\ninternal String8 str8fv(Arena *arena, char *fmt, va_list args);\r\ninternal String8 str8f(Arena *arena, char *fmt, ...);\r\n// TODO(rjf): remove these once we're ready to convert all usages:\r\n#define push_str8_cat(arena, s1, s2) str8_cat((arena), (s1), (s2))\r\n#define push_str8_copy(arena, s) str8_copy((arena), (s))\r\n#define push_str8fv(arena, fmt, args) str8fv((arena), (fmt), (args))\r\n#define push_str8f(arena, ...) str8f((arena), __VA_ARGS__)\r\ninternal String8 push_cstr(Arena *arena, String8 str); // TODO(rjf): this is unnecessary - this is implied by `push_str8_copy`. need to remove.\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Integer Conversions\r\n\r\n//- rjf: string -> integer\r\ninternal S64 sign_from_str8(String8 string, String8 *string_tail);\r\ninternal B32 str8_is_integer(String8 string, U32 radix);\r\ninternal B32 str8_is_integer_signed(String8 string, U32 radix);\r\ninternal U64 u64_from_str8(String8 string, U32 radix);\r\ninternal S64 s64_from_str8(String8 string, U32 radix);\r\ninternal U32 u32_from_str8(String8 string, U32 radix);\r\ninternal S32 s32_from_str8(String8 string, U32 radix);\r\ninternal B32 try_u64_from_str8_c_rules(String8 string, U64 *x);\r\ninternal B32 try_s64_from_str8_c_rules(String8 string, S64 *x);\r\n\r\n//- rjf: integer -> string\r\ninternal String8 str8_from_memory_size(Arena *arena, U64 size);\r\ninternal String8 str8_from_count(Arena *arena, U64 count);\r\ninternal String8 str8_from_bits_u32(Arena *arena, U32 x);\r\ninternal String8 str8_from_bits_u64(Arena *arena, U64 x);\r\ninternal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator);\r\ninternal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Float Conversions\r\n\r\ninternal F64 f64_from_str8(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String List Construction Functions\r\n\r\ninternal String8Node *str8_list_push_node(String8List *list, String8Node *node);\r\ninternal String8Node *str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string);\r\ninternal String8Node *str8_list_push_node_front(String8List *list, String8Node *node);\r\ninternal String8Node *str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string);\r\ninternal String8Node *str8_list_push(Arena *arena, String8List *list, String8 string);\r\ninternal String8Node *str8_list_push_front(Arena *arena, String8List *list, String8 string);\r\ninternal void         str8_list_concat_in_place(String8List *list, String8List *to_push);\r\ninternal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align);\r\ninternal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...);\r\ninternal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...);\r\ninternal String8List  str8_list_copy(Arena *arena, String8List *list);\r\n#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero())\r\n\r\n////////////////////////////////\r\n//~ rjf: String Splitting & Joining\r\n\r\ninternal String8List  str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags);\r\ninternal String8List  str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags);\r\ninternal String8      str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Data Stringification Helpers\r\n\r\ninternal String8List numeric_str8_list_from_data(Arena *arena, U32 radix, String8 data, U64 stride);\r\n\r\n////////////////////////////////\r\n//~ rjf; String Arrays\r\n\r\ninternal String8Array str8_array_zero(void);\r\ninternal String8Array str8_array_from_list(Arena *arena, String8List *list);\r\ninternal String8Array str8_array_reserve(Arena *arena, U64 count);\r\ninternal String8Array str8_array_copy(Arena *arena, String8Array array);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Version Helpers\r\n\r\ninternal U64 version_from_str8(String8 string);\r\ninternal String8 str8_from_version(Arena *arena, U64 version);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Path Helpers\r\n\r\nglobal read_only struct\r\n{\r\n  String8   string;\r\n  PathStyle path_style;\r\n}\r\ng_path_style_map[] =\r\n{\r\n  { str8_lit_comp(\"\"),         PathStyle_Null            },\r\n  { str8_lit_comp(\"relative\"), PathStyle_Relative        },\r\n  { str8_lit_comp(\"windows\"),  PathStyle_WindowsAbsolute },\r\n  { str8_lit_comp(\"unix\"),     PathStyle_UnixAbsolute    },\r\n  { str8_lit_comp(\"system\"),   PathStyle_SystemAbsolute  },\r\n};\r\n\r\ninternal String8 str8_chop_last_slash(String8 string);\r\ninternal String8 str8_skip_last_slash(String8 string);\r\ninternal String8 str8_chop_last_dot(String8 string);\r\ninternal String8 str8_skip_last_dot(String8 string);\r\n\r\ninternal PathStyle   path_style_from_str8(String8 string);\r\ninternal String8List str8_split_path(Arena *arena, String8 string);\r\ninternal void        str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style);\r\ninternal String8     str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style);\r\n\r\ninternal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Relative <-> Absolute Path\r\n\r\ninternal String8 path_relative_dst_from_absolute_dst_src(Arena *arena, String8 dst, String8 src);\r\ninternal String8 path_absolute_dst_from_relative_dst_src(Arena *arena, String8 dst, String8 src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Path Normalization\r\n\r\ninternal String8List path_normalized_list_from_string(Arena *arena, String8 path, PathStyle *style_out);\r\ninternal String8     path_normalized_from_string(Arena *arena, String8 path);\r\ninternal B32         path_match_normalized(String8 left, String8 right);\r\n\r\n////////////////////////////////\r\n//~ rjf: Misc. Path Helpers\r\n\r\ninternal PathStyle        path_style_from_string(String8 string);\r\ninternal String8          string_from_path_style(PathStyle style);\r\ninternal String8          path_separator_string_from_style(PathStyle style);\r\ninternal StringMatchFlags path_match_flags_from_os(OperatingSystem os);\r\ninternal String8          path_convert_slashes(Arena *arena, String8 path, PathStyle path_style);\r\ninternal String8          path_replace_file_extension(Arena *arena, String8 file_name, String8 ext);\r\n\r\n////////////////////////////////\r\n//~ rjf: UTF-8 & UTF-16 Decoding/Encoding\r\n\r\ninternal UnicodeDecode utf8_decode(U8 *str, U64 max);\r\ninternal UnicodeDecode utf16_decode(U16 *str, U64 max);\r\ninternal U32 utf8_encode(U8 *str, U32 codepoint);\r\ninternal U32 utf16_encode(U16 *str, U32 codepoint);\r\n\r\n////////////////////////////////\r\n//~ rjf: Unicode String Conversions\r\n\r\ninternal String8 str8_from_16(Arena *arena, String16 in);\r\ninternal String16 str16_from_8(Arena *arena, String8 in);\r\ninternal String8 str8_from_32(Arena *arena, String32 in);\r\ninternal String32 str32_from_8(Arena *arena, String8 in);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Types & Space Enum <-> String Conversions\r\n\r\ninternal OperatingSystem operating_system_from_string(String8 string);\r\ninternal String8 string_from_dimension(Dimension dimension);\r\ninternal String8 string_from_side(Side side);\r\ninternal String8 string_from_operating_system(OperatingSystem os);\r\ninternal String8 string_from_arch(Arch arch);\r\ninternal String8 string_from_week_day(WeekDay week_day);\r\ninternal String8 string_from_month(Month month);\r\ninternal String8 string_from_date_time(Arena *arena, DateTime *date_time);\r\ninternal String8 string_from_date_time__file_name(Arena *arena, DateTime *date_time);\r\ninternal String8 string_from_elapsed_time(Arena *arena, DateTime dt);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Globally Unique IDs\r\n\r\ninternal String8 string_from_guid(Arena *arena, Guid guid);\r\ninternal B32     try_guid_from_string(String8 string, Guid *guid_out);\r\ninternal Guid    guid_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Text Indentation\r\n\r\ninternal String8 indented_from_string(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Escaping\r\n\r\ninternal String8 escaped_from_raw_str8(Arena *arena, String8 string);\r\ninternal String8 raw_from_escaped_str8(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Wrapping\r\n\r\ninternal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Color\r\n\r\ninternal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba);\r\ninternal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Fuzzy Matching\r\n\r\ninternal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack);\r\ninternal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src);\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Serialization Helpers\r\n\r\ninternal void    str8_serial_begin(Arena *arena, String8List *srl);\r\ninternal String8 str8_serial_end(Arena *arena, String8List *srl);\r\ninternal void    str8_serial_write_to_dst(String8List *srl, void *out);\r\ninternal U64     str8_serial_push_align(Arena *arena, String8List *srl, U64 align);\r\ninternal void *  str8_serial_push_size(Arena *arena, String8List *srl, U64 size);\r\ninternal void *  str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size);\r\ninternal void    str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first);\r\ninternal void    str8_serial_push_u64(Arena *arena, String8List *srl, U64 x);\r\ninternal void    str8_serial_push_u32(Arena *arena, String8List *srl, U32 x);\r\ninternal void    str8_serial_push_u16(Arena *arena, String8List *srl, U16 x);\r\ninternal void    str8_serial_push_u8(Arena *arena, String8List *srl, U8 x);\r\ninternal void    str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str);\r\ninternal void    str8_serial_push_string(Arena *arena, String8List *srl, String8 str);\r\ninternal void    str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str);\r\n#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count))\r\n#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1)\r\n\r\n////////////////////////////////\r\n//~ rjf: Deserialization Helpers\r\n\r\ninternal U64    str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity);\r\ninternal U64    str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val);\r\ninternal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);\r\ninternal U64    str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out);\r\ninternal U64    str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out);\r\ninternal U64    str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out);\r\n#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr)))\r\n#define str8_deserial_read_struct(string, off, ptr)       str8_deserial_read_array(string, off, ptr, 1)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic String Hashes\r\n\r\ninternal U64 u64_hash_from_seed_str8(U64 seed, String8 string);\r\ninternal U64 u64_hash_from_str8(String8 string);\r\ninternal U128 u128_hash_from_seed_str8(U64 seed, String8 string);\r\ninternal U128 u128_hash_from_str8(String8 string);\r\n\r\n#endif // BASE_STRINGS_H\r\n"
  },
  {
    "path": "src/base/base_thread_context.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nC_LINKAGE thread_static TCTX *tctx_thread_local;\r\n#if !BUILD_SUPPLEMENTARY_UNIT\r\nC_LINKAGE thread_static TCTX *tctx_thread_local = 0;\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Context Functions\r\n\r\n//- rjf: thread-context allocation & selection\r\n\r\ninternal TCTX *\r\ntctx_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  TCTX *tctx = push_array(arena, TCTX, 1);\r\n  tctx->arenas[0] = arena;\r\n  tctx->arenas[1] = arena_alloc();\r\n  tctx->lane_ctx.lane_count = 1;\r\n  return tctx;\r\n}\r\n\r\ninternal void\r\ntctx_release(TCTX *tctx)\r\n{\r\n  arena_release(tctx->arenas[1]);\r\n  arena_release(tctx->arenas[0]);\r\n}\r\n\r\ninternal void\r\ntctx_select(TCTX *tctx)\r\n{\r\n  tctx_thread_local = tctx;\r\n}\r\n\r\ninternal TCTX *\r\ntctx_selected(void)\r\n{\r\n  return tctx_thread_local;\r\n}\r\n\r\n//- rjf: scratch arenas\r\n\r\ninternal Arena *\r\ntctx_get_scratch(Arena **conflicts, U64 count)\r\n{\r\n  TCTX *tctx = tctx_selected();\r\n  Arena *result = 0;\r\n  Arena **arena_ptr = tctx->arenas;\r\n  for(U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1)\r\n  {\r\n    Arena **conflict_ptr = conflicts;\r\n    B32 has_conflict = 0;\r\n    for(U64 j = 0; j < count; j += 1, conflict_ptr += 1)\r\n    {\r\n      if(*arena_ptr == *conflict_ptr)\r\n      {\r\n        has_conflict = 1;\r\n        break;\r\n      }\r\n    }\r\n    if(!has_conflict)\r\n    {\r\n      result = *arena_ptr;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: lane metadata\r\n\r\ninternal LaneCtx\r\ntctx_set_lane_ctx(LaneCtx lane_ctx)\r\n{\r\n  TCTX *tctx = tctx_selected();\r\n  LaneCtx restore = tctx->lane_ctx;\r\n  tctx->lane_ctx = lane_ctx;\r\n  return restore;\r\n}\r\n\r\ninternal void\r\ntctx_lane_barrier_wait(void *broadcast_ptr, U64 broadcast_size, U64 broadcast_src_lane_idx)\r\n{\r\n  ProfBeginFunction();\r\n  ProfColor(0x00000ff);\r\n  TCTX *tctx = tctx_selected();\r\n  \r\n  // rjf: doing broadcast -> copy to broadcast memory on source lane\r\n  U64 broadcast_size_clamped = ClampTop(broadcast_size, sizeof(tctx->lane_ctx.broadcast_memory[0]));\r\n  if(broadcast_ptr != 0 && lane_idx() == broadcast_src_lane_idx)\r\n  {\r\n    MemoryCopy(tctx->lane_ctx.broadcast_memory, broadcast_ptr, broadcast_size_clamped);\r\n  }\r\n  \r\n  // rjf: all cases: barrier\r\n  os_barrier_wait(tctx->lane_ctx.barrier);\r\n  \r\n  // rjf: doing broadcast -> copy from broadcast memory on destination lanes\r\n  if(broadcast_ptr != 0 && lane_idx() != broadcast_src_lane_idx)\r\n  {\r\n    MemoryCopy(broadcast_ptr, tctx->lane_ctx.broadcast_memory, broadcast_size_clamped);\r\n  }\r\n  \r\n  // rjf: doing broadcast -> barrier on all lanes\r\n  if(broadcast_ptr != 0)\r\n  {\r\n    os_barrier_wait(tctx->lane_ctx.barrier);\r\n  }\r\n  \r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: thread names\r\n\r\ninternal void\r\ntctx_set_thread_name(String8 string)\r\n{\r\n  TCTX *tctx = tctx_selected();\r\n  U64 size = ClampTop(string.size, sizeof(tctx->thread_name));\r\n  MemoryCopy(tctx->thread_name, string.str, size);\r\n  tctx->thread_name_size = size;\r\n}\r\n\r\ninternal String8\r\ntctx_get_thread_name(void)\r\n{\r\n  TCTX *tctx = tctx_selected();\r\n  String8 result = str8(tctx->thread_name, tctx->thread_name_size);\r\n  return result;\r\n}\r\n\r\n//- rjf: thread source-locations\r\n\r\ninternal void\r\ntctx_write_srcloc(char *file_name, U64 line_number)\r\n{\r\n  TCTX *tctx = tctx_selected();\r\n  tctx->file_name = file_name;\r\n  tctx->line_number = line_number;\r\n}\r\n\r\ninternal void\r\ntctx_read_srcloc(char **file_name, U64 *line_number)\r\n{\r\n  TCTX *tctx = tctx_selected();\r\n  *file_name = tctx->file_name;\r\n  *line_number = tctx->line_number;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Touch Scope Functions\r\n\r\ninternal Access *\r\naccess_open(void)\r\n{\r\n  if(tctx_thread_local->access_arena == 0)\r\n  {\r\n    tctx_thread_local->access_arena = arena_alloc();\r\n  }\r\n  Access *access = tctx_thread_local->free_access;\r\n  if(access != 0)\r\n  {\r\n    SLLStackPop(tctx_thread_local->free_access);\r\n  }\r\n  else\r\n  {\r\n    access = push_array_no_zero(tctx_thread_local->access_arena, Access, 1);\r\n  }\r\n  MemoryZeroStruct(access);\r\n  return access;\r\n}\r\n\r\ninternal void\r\naccess_close(Access *access)\r\n{\r\n  for(Touch *touch = access->top_touch, *next = 0; touch != 0; touch = next)\r\n  {\r\n    next = touch->next;\r\n    ins_atomic_u64_dec_eval(&touch->pt->access_refcount);\r\n    if(touch->cv.u64[0] != 0) { cond_var_broadcast(touch->cv); }\r\n    SLLStackPush(tctx_thread_local->free_touch, touch);\r\n  }\r\n  SLLStackPush(tctx_thread_local->free_access, access);\r\n}\r\n\r\ninternal void\r\naccess_touch(Access *access, AccessPt *pt, CondVar cv)\r\n{\r\n  ins_atomic_u64_inc_eval(&pt->access_refcount);\r\n  ins_atomic_u64_eval_assign(&pt->last_time_touched_us, os_now_microseconds());\r\n  ins_atomic_u64_eval_assign(&pt->last_update_idx_touched, update_tick_idx());\r\n  Touch *touch = tctx_thread_local->free_touch;\r\n  if(touch != 0)\r\n  {\r\n    SLLStackPop(tctx_thread_local->free_touch);\r\n  }\r\n  else\r\n  {\r\n    touch = push_array_no_zero(tctx_thread_local->access_arena, Touch, 1);\r\n  }\r\n  MemoryZeroStruct(touch);\r\n  SLLStackPush(access->top_touch, touch);\r\n  touch->cv = cv;\r\n  touch->pt = pt;\r\n}\r\n\r\n//- rjf: access points\r\n\r\ninternal B32\r\naccess_pt_is_expired_(AccessPt *pt, AccessPtExpireParams *params)\r\n{\r\n  U64 access_refcount = ins_atomic_u64_eval(&pt->access_refcount);\r\n  U64 last_time_touched_us = ins_atomic_u64_eval(&pt->last_time_touched_us);\r\n  U64 last_update_idx_touched = ins_atomic_u64_eval(&pt->last_update_idx_touched);\r\n  B32 result = (access_refcount == 0 &&\r\n                last_time_touched_us + params->time <= os_now_microseconds() &&\r\n                last_update_idx_touched + params->update_idxs <= update_tick_idx());\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/base/base_thread_context.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_THREAD_CONTEXT_H\r\n#define BASE_THREAD_CONTEXT_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Lane Context\r\n\r\ntypedef struct LaneCtx LaneCtx;\r\nstruct LaneCtx\r\n{\r\n  U64 lane_idx;\r\n  U64 lane_count;\r\n  Barrier barrier;\r\n  U64 *broadcast_memory;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Access Scopes\r\n\r\ntypedef struct AccessPt AccessPt;\r\nstruct AccessPt\r\n{\r\n  U64 access_refcount;\r\n  U64 last_time_touched_us;\r\n  U64 last_update_idx_touched;\r\n};\r\n\r\ntypedef struct AccessPtExpireParams AccessPtExpireParams;\r\nstruct AccessPtExpireParams\r\n{\r\n  U64 time;\r\n  U64 update_idxs;\r\n};\r\n\r\ntypedef struct Touch Touch;\r\nstruct Touch\r\n{\r\n  Touch *next;\r\n  AccessPt *pt;\r\n  CondVar cv;\r\n};\r\n\r\ntypedef struct Access Access;\r\nstruct Access\r\n{\r\n  Access *next;\r\n  Touch *top_touch;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Per-Thread State Bundle\r\n\r\ntypedef struct TCTX TCTX;\r\nstruct TCTX\r\n{\r\n  // rjf: scratch arenas\r\n  Arena *arenas[2];\r\n  \r\n  // rjf: thread name\r\n  U8 thread_name[32];\r\n  U64 thread_name_size;\r\n  \r\n  // rjf: lane context\r\n  LaneCtx lane_ctx;\r\n  \r\n  // rjf: source location info\r\n  char *file_name;\r\n  U64 line_number;\r\n  \r\n  // rjf: accesses\r\n  Arena *access_arena;\r\n  Access *free_access;\r\n  Touch *free_touch;\r\n  \r\n  // rjf: progress\r\n  U64 *progress_counter_ptr;\r\n  U64 *progress_target_ptr;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Context Functions\r\n\r\n//- rjf: thread-context allocation & selection\r\ninternal TCTX *tctx_alloc(void);\r\ninternal void tctx_release(TCTX *tctx);\r\ninternal void tctx_select(TCTX *tctx);\r\ninternal TCTX *tctx_selected(void);\r\n\r\n//- rjf: scratch arenas\r\ninternal Arena *tctx_get_scratch(Arena **conflicts, U64 count);\r\n#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count)))\r\n#define scratch_end(scratch) temp_end(scratch)\r\n\r\n//- rjf: lane metadata\r\ninternal LaneCtx tctx_set_lane_ctx(LaneCtx lane_ctx);\r\ninternal void tctx_lane_barrier_wait(void *broadcast_ptr, U64 broadcast_size, U64 broadcast_src_lane_idx);\r\n#define lane_idx() (tctx_selected()->lane_ctx.lane_idx)\r\n#define lane_count() (tctx_selected()->lane_ctx.lane_count)\r\n#define lane_from_task_idx(idx) ((idx)%lane_count())\r\n#define lane_ctx(ctx) tctx_set_lane_ctx((ctx))\r\n#define lane_sync() tctx_lane_barrier_wait(0, 0, 0)\r\n#define lane_sync_u64(ptr, src_lane_idx) tctx_lane_barrier_wait((ptr), sizeof(*(ptr)), (src_lane_idx))\r\n#define lane_range(count) m_range_from_n_idx_m_count(lane_idx(), lane_count(), (count))\r\n\r\n//- rjf: thread names\r\ninternal void tctx_set_thread_name(String8 name);\r\ninternal String8 tctx_get_thread_name(void);\r\n\r\n//- rjf: thread source-locations\r\ninternal void tctx_write_srcloc(char *file_name, U64 line_number);\r\ninternal void tctx_read_srcloc(char **file_name, U64 *line_number);\r\n#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__)\r\n\r\n//- rjf: access scopes\r\ninternal Access *access_open(void);\r\ninternal void access_close(Access *access);\r\ninternal void access_touch(Access *access, AccessPt *pt, CondVar cv);\r\n\r\n//- rjf: access points\r\ninternal B32 access_pt_is_expired_(AccessPt *pt, AccessPtExpireParams *params);\r\n#define access_pt_is_expired(pt, ...) access_pt_is_expired_((pt), &(AccessPtExpireParams){.time = 2000000, .update_idxs = 2, __VA_ARGS__})\r\n\r\n//- rjf: progress counters\r\n#define set_progress_ptr(ptr) (tctx_selected()->progress_counter_ptr = (ptr))\r\n#define set_progress_target_ptr(ptr) (tctx_selected()->progress_target_ptr = (ptr))\r\n#define set_progress(val) (tctx_selected()->progress_counter_ptr ? ins_atomic_u64_eval_assign(tctx_selected()->progress_counter_ptr, (val)) : (void)0)\r\n#define add_progress(val) (tctx_selected()->progress_counter_ptr ? ins_atomic_u64_add_eval(tctx_selected()->progress_counter_ptr, (val)) : (void)0)\r\n#define set_progress_target(val) (tctx_selected()->progress_target_ptr ? ins_atomic_u64_eval_assign(tctx_selected()->progress_target_ptr, (val)) : (void)0)\r\n\r\n#endif // BASE_THREAD_CONTEXT_H\r\n"
  },
  {
    "path": "src/base/base_threads.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Functions\r\n\r\ninternal Thread\r\nthread_launch(ThreadEntryPointFunctionType *f, void *p)\r\n{\r\n  Thread thread = os_thread_launch(f, p);\r\n  return thread;\r\n}\r\n\r\ninternal B32\r\nthread_join(Thread thread, U64 endt_us)\r\n{\r\n  B32 result = os_thread_join(thread, endt_us);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nthread_detach(Thread thread)\r\n{\r\n  os_thread_detach(thread);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Synchronization Primitive Functions\r\n\r\n//- rjf: recursive mutexes\r\n\r\ninternal Mutex mutex_alloc(void)                 {return os_mutex_alloc();}\r\ninternal void  mutex_release(Mutex mutex)        {os_mutex_release(mutex);}\r\ninternal void  mutex_take(Mutex mutex)           {os_mutex_take(mutex);}\r\ninternal void  mutex_drop(Mutex mutex)           {os_mutex_drop(mutex);}\r\n\r\n//- rjf: reader/writer mutexes\r\n\r\ninternal RWMutex rw_mutex_alloc(void)            {return os_rw_mutex_alloc();}\r\ninternal void    rw_mutex_release(RWMutex mutex) {os_rw_mutex_release(mutex);}\r\ninternal void    rw_mutex_take(RWMutex mutex, B32 write_mode) {os_rw_mutex_take(mutex, write_mode);}\r\ninternal void    rw_mutex_drop(RWMutex mutex, B32 write_mode) {os_rw_mutex_drop(mutex, write_mode);}\r\n\r\n//- rjf: condition variables\r\n\r\ninternal CondVar   cond_var_alloc(void)                                                        {return os_cond_var_alloc();}\r\ninternal void      cond_var_release(CondVar cv)                                                {os_cond_var_release(cv);}\r\ninternal B32       cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us)                         {return os_cond_var_wait(cv, mutex, endt_us);}\r\ninternal B32       cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us) {return os_cond_var_wait_rw(cv, mutex_rw, write_mode, endt_us);}\r\ninternal void      cond_var_signal(CondVar cv)                                                 {os_cond_var_signal(cv);}\r\ninternal void      cond_var_broadcast(CondVar cv)                                              {os_cond_var_broadcast(cv);}\r\n\r\n//- rjf: cross-process semaphores\r\n\r\ninternal Semaphore semaphore_alloc(U32 initial_count, U32 max_count, String8 name) {return os_semaphore_alloc(initial_count, max_count, name);}\r\ninternal void      semaphore_release(Semaphore semaphore)                          {os_semaphore_release(semaphore);}\r\ninternal Semaphore semaphore_open(String8 name)                                    {return os_semaphore_open(name);}\r\ninternal void      semaphore_close(Semaphore semaphore)                            {os_semaphore_close(semaphore);}\r\ninternal B32       semaphore_take(Semaphore semaphore, U64 endt_us)                {return os_semaphore_take(semaphore, endt_us);}\r\ninternal void      semaphore_drop(Semaphore semaphore)                             {os_semaphore_drop(semaphore);}\r\n\r\n//- rjf: barriers\r\n\r\ninternal Barrier   barrier_alloc(U64 count)         {return os_barrier_alloc(count);}\r\ninternal void      barrier_release(Barrier barrier) {os_barrier_release(barrier);}\r\ninternal void      barrier_wait(Barrier barrier)    {os_barrier_wait(barrier);}\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Stripe Functions\r\n\r\ninternal StripeArray\r\nstripe_array_alloc(Arena *arena)\r\n{\r\n  StripeArray array = {0};\r\n  array.count = os_get_system_info()->logical_processor_count;\r\n  array.v = push_array(arena, Stripe, array.count);\r\n  for EachIndex(idx, array.count)\r\n  {\r\n    array.v[idx].arena = arena_alloc();\r\n    array.v[idx].rw_mutex = rw_mutex_alloc();\r\n    array.v[idx].cv = cond_var_alloc();\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal void\r\nstripe_array_release(StripeArray *stripes)\r\n{\r\n  for EachIndex(idx, stripes->count)\r\n  {\r\n    arena_release(stripes->v[idx].arena);\r\n    rw_mutex_release(stripes->v[idx].rw_mutex);\r\n    cond_var_release(stripes->v[idx].cv);\r\n  }\r\n}\r\n\r\ninternal Stripe *\r\nstripe_from_slot_idx(StripeArray *stripes, U64 slot_idx)\r\n{\r\n  Stripe *stripe = &stripes->v[slot_idx%stripes->count];\r\n  return stripe;\r\n}\r\n"
  },
  {
    "path": "src/base/base_threads.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_THREADS_H\r\n#define BASE_THREADS_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Types\r\n\r\ntypedef struct Thread Thread;\r\nstruct Thread\r\n{\r\n  U64 u64[1];\r\n};\r\ntypedef void ThreadEntryPointFunctionType(void *p);\r\n\r\n////////////////////////////////\r\n//~ rjf: Synchronization Primitive Types\r\n\r\ntypedef struct Mutex Mutex;\r\nstruct Mutex\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct RWMutex RWMutex;\r\nstruct RWMutex\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct CondVar CondVar;\r\nstruct CondVar\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct Semaphore Semaphore;\r\nstruct Semaphore\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct Barrier Barrier;\r\nstruct Barrier\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Stripes\r\n\r\ntypedef struct Stripe Stripe;\r\nstruct Stripe\r\n{\r\n  Arena *arena;\r\n  RWMutex rw_mutex;\r\n  CondVar cv;\r\n  void *free;\r\n};\r\n\r\ntypedef struct StripeArray StripeArray;\r\nstruct StripeArray\r\n{\r\n  Stripe *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Functions\r\n\r\ninternal Thread thread_launch(ThreadEntryPointFunctionType *f, void *p);\r\ninternal B32 thread_join(Thread thread, U64 endt_us);\r\ninternal void thread_detach(Thread thread);\r\n\r\n////////////////////////////////\r\n//~ rjf: Synchronization Primitive Functions\r\n\r\n//- rjf: recursive mutexes\r\ninternal Mutex mutex_alloc(void);\r\ninternal void  mutex_release(Mutex mutex);\r\ninternal void  mutex_take(Mutex mutex);\r\ninternal void  mutex_drop(Mutex mutex);\r\n\r\n//- rjf: reader/writer mutexes\r\ninternal RWMutex rw_mutex_alloc(void);\r\ninternal void    rw_mutex_release(RWMutex mutex);\r\ninternal void    rw_mutex_take(RWMutex mutex, B32 write_mode);\r\ninternal void    rw_mutex_drop(RWMutex mutex, B32 write_mode);\r\n#define rw_mutex_take_r(m) rw_mutex_take((m), (0))\r\n#define rw_mutex_take_w(m) rw_mutex_take((m), (1))\r\n#define rw_mutex_drop_r(m) rw_mutex_drop((m), (0))\r\n#define rw_mutex_drop_w(m) rw_mutex_drop((m), (1))\r\n\r\n//- rjf: condition variables\r\ninternal CondVar   cond_var_alloc(void);\r\ninternal void      cond_var_release(CondVar cv);\r\n// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout\r\ninternal B32       cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us);\r\ninternal B32       cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us);\r\n#define cond_var_wait_rw_r(cv, m, endt) cond_var_wait_rw((cv), (m), (0), (endt))\r\n#define cond_var_wait_rw_w(cv, m, endt) cond_var_wait_rw((cv), (m), (1), (endt))\r\ninternal void      cond_var_signal(CondVar cv);\r\ninternal void      cond_var_broadcast(CondVar cv);\r\n\r\n//- rjf: cross-process semaphores\r\ninternal Semaphore semaphore_alloc(U32 initial_count, U32 max_count, String8 name);\r\ninternal void      semaphore_release(Semaphore semaphore);\r\ninternal Semaphore semaphore_open(String8 name);\r\ninternal void      semaphore_close(Semaphore semaphore);\r\ninternal B32       semaphore_take(Semaphore semaphore, U64 endt_us);\r\ninternal void      semaphore_drop(Semaphore semaphore);\r\n\r\n//- rjf: barriers\r\ninternal Barrier   barrier_alloc(U64 count);\r\ninternal void      barrier_release(Barrier barrier);\r\ninternal void      barrier_wait(Barrier barrier);\r\n\r\n//- rjf: scope macros\r\n#define MutexScope(mutex) DeferLoop(mutex_take(mutex), mutex_drop(mutex))\r\n#define RWMutexScope(mutex, write_mode) DeferLoop(rw_mutex_take((mutex), (write_mode)), rw_mutex_drop((mutex), (write_mode)))\r\n#define MutexScopeR(mutex) DeferLoop(rw_mutex_take_r(mutex), rw_mutex_drop_r(mutex))\r\n#define MutexScopeW(mutex) DeferLoop(rw_mutex_take_w(mutex), rw_mutex_drop_w(mutex))\r\n#define MutexScopeRWPromote(mutex) DeferLoop((rw_mutex_drop_r(mutex), rw_mutex_take_w(mutex)), (rw_mutex_drop_w(mutex), rw_mutex_take_r(mutex)))\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Stripe Functions\r\n\r\ninternal StripeArray stripe_array_alloc(Arena *arena);\r\ninternal void stripe_array_release(StripeArray *stripes);\r\ninternal Stripe *stripe_from_slot_idx(StripeArray *stripes, U64 slot_idx);\r\n\r\n#endif // BASE_THREADS_H\r\n"
  },
  {
    "path": "src/codeview/codeview.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ Generated Code\r\n\r\n#include \"generated/codeview.meta.c\"\r\n\r\n////////////////////////////////\r\n\r\ninternal CV_Arch\r\ncv_arch_from_coff_machine(COFF_MachineType machine)\r\n{\r\n  CV_Arch arch = 0;\r\n  switch(machine)\r\n  {\r\n    case COFF_MachineType_X64:       arch = CV_Arch_X64;    break;\r\n    case COFF_MachineType_X86:       arch = CV_Arch_8086;   break;\r\n    case COFF_MachineType_Am33:      arch = CV_Arch_AM33;   break;\r\n    case COFF_MachineType_Arm:       NotImplemented;        break;\r\n    case COFF_MachineType_Arm64:     arch = CV_Arch_ARM64;  break;\r\n    case COFF_MachineType_ArmNt:     arch = CV_Arch_ARMNT;  break;\r\n    case COFF_MachineType_Ebc:       arch = CV_Arch_EBC;    break;\r\n    case COFF_MachineType_Ia64:      arch = CV_Arch_IA64;   break;\r\n    case COFF_MachineType_M32R:      arch = CV_Arch_M32R;   break;\r\n    case COFF_MachineType_Mips16:    arch = CV_Arch_MIPS16; break;\r\n    case COFF_MachineType_MipsFpu:   NotImplemented;        break;\r\n    case COFF_MachineType_MipsFpu16: NotImplemented;        break;\r\n    case COFF_MachineType_PowerPc:   NotImplemented;        break;\r\n    case COFF_MachineType_PowerPcFp: arch = CV_Arch_PPCFP;  break;\r\n    case COFF_MachineType_R4000:     NotImplemented;        break;\r\n    case COFF_MachineType_RiscV32:   NotImplemented;        break;\r\n    case COFF_MachineType_RiscV64:   NotImplemented;        break;\r\n    case COFF_MachineType_RiscV128:  NotImplemented;        break;\r\n    case COFF_MachineType_Sh3:       arch = CV_Arch_SH3;    break;\r\n    case COFF_MachineType_Sh3Dsp:    arch = CV_Arch_SH3DSP; break;\r\n    case COFF_MachineType_Sh4:       arch = CV_Arch_SH4;    break;\r\n    case COFF_MachineType_Sh5:       NotImplemented;        break;\r\n    case COFF_MachineType_Thumb:     arch = CV_Arch_THUMB;  break;\r\n    case COFF_MachineType_WceMipsV2: NotImplemented;        break;\r\n  }\r\n  return arch;\r\n}\r\n\r\ninternal U64\r\ncv_size_from_reg(CV_Arch arch, CV_Reg reg)\r\n{\r\n  switch(arch)\r\n  {\r\n    case CV_Arch_8086: return cv_size_from_reg_x86(reg);\r\n    case CV_Arch_X64 : return cv_size_from_reg_x64(reg);\r\n    default: NotImplemented;\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\ncv_is_reg_sp(CV_Arch arch, CV_Reg reg)\r\n{\r\n  switch(arch)\r\n  {\r\n    case CV_Arch_8086: return reg == CV_Regx86_ESP;\r\n    case CV_Arch_X64:  return reg == CV_Regx64_RSP;\r\n    default: NotImplemented;\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\ncv_size_from_reg_x86(CV_Reg reg)\r\n{\r\n  switch(reg)\r\n  {\r\n#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx86_##NAME: return BYTE_SIZE;\r\n    CV_Reg_X86_XList(X)\r\n#undef X\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\ncv_size_from_reg_x64(CV_Reg reg)\r\n{\r\n  switch(reg)\r\n  {\r\n#define X(NAME, CODE, RDI_NAME, BYTE_POS, BYTE_SIZE) case CV_Regx64_##NAME: return BYTE_SIZE;\r\n    CV_Reg_X64_XList(X)\r\n#undef X \r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal CV_EncodedFramePtrReg\r\ncv_pick_fp_encoding(CV_SymFrameproc *frameproc, B32 is_local_param)\r\n{\r\n  CV_EncodedFramePtrReg fp_reg = 0;\r\n  if(is_local_param)\r\n  {\r\n    fp_reg = CV_FrameprocFlags_Extract_ParamBasePointer(frameproc->flags);\r\n  }\r\n  else\r\n  {\r\n    fp_reg = CV_FrameprocFlags_Extract_LocalBasePointer(frameproc->flags);\r\n  }\r\n  return fp_reg;\r\n}\r\n\r\ninternal CV_Reg\r\ncv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg)\r\n{\r\n  CV_Reg fp_reg = 0;\r\n  switch (arch)\r\n  {\r\n    case CV_Arch_8086:\r\n    {\r\n      switch (encoded_reg)\r\n      {\r\n        case CV_EncodedFramePtrReg_None    : break;\r\n        case CV_EncodedFramePtrReg_StackPtr: AssertAlways(!\"TODO: not tested, this is a guess\");\r\n        fp_reg = CV_Regx86_ESP; break;\r\n        case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx86_EBP; break;\r\n        case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx86_EBX; break;\r\n        default: InvalidPath;\r\n      }\r\n    } break;\r\n    case CV_Arch_X64:\r\n    {\r\n      switch (encoded_reg)\r\n      {\r\n        case CV_EncodedFramePtrReg_None    : break;\r\n        case CV_EncodedFramePtrReg_StackPtr: fp_reg = CV_Regx64_RSP; break;\r\n        case CV_EncodedFramePtrReg_FramePtr: fp_reg = CV_Regx64_RBP; break;\r\n        case CV_EncodedFramePtrReg_BasePtr : fp_reg = CV_Regx64_R13; break;\r\n        default: InvalidPath;\r\n      }\r\n    } break;\r\n    default: NotImplemented;\r\n  }\r\n  return fp_reg;\r\n}\r\n\r\ninternal U32\r\ncv_map_encoded_base_pointer(CV_Arch arch, U32 encoded_frame_reg)\r\n{\r\n  U32 r = 0;\r\n  switch (arch) {\r\n    case CV_Arch_8086: {\r\n      switch (encoded_frame_reg) {\r\n        case 0: r = 0;                    break;\r\n        case 1: r = CV_AllReg_VFRAME; break;\r\n        case 2: r = CV_Regx86_EBP;    break;\r\n        case 3: r = CV_Regx86_EBX;    break;\r\n      }\r\n    } break;\r\n    case CV_Arch_X64: {\r\n      switch (encoded_frame_reg) {\r\n        case 0: r = 0; break;\r\n        case 1: r = CV_Regx64_RSP; break;\r\n        case 2: r = CV_Regx64_RBP; break;\r\n        case 3: r = CV_Regx64_R13; break;\r\n      }\r\n    } break;\r\n    default: NotImplemented;\r\n  }\r\n  return r;\r\n}\r\n\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> String\r\n\r\ninternal String8\r\ncv_string_from_inline_range_kind(CV_InlineRangeKind kind)\r\n{\r\n  switch (kind) {\r\n    case CV_InlineRangeKind_Expr: return str8_lit(\"Expr\");\r\n    case CV_InlineRangeKind_Stmt: return str8_lit(\"Stmt\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_type_index_source(CV_TypeIndexSource ti_source)\r\n{\r\n  switch (ti_source) {\r\n    case CV_TypeIndexSource_NULL:  return str8_lit(\"\");    break;\r\n    case CV_TypeIndexSource_TPI:   return str8_lit(\"TPI\"); break;\r\n    case CV_TypeIndexSource_IPI:   return str8_lit(\"IPI\"); break;\r\n    case CV_TypeIndexSource_COUNT: break;\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_language(CV_Language x)\r\n{\r\n  switch (x) {\r\n#define X(_n,_i) case _i: return str8_lit(Stringify(_n));\r\n    CV_LanguageXList(X)\r\n#undef X\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8 \r\ncv_string_from_reg_id(Arena *arena, CV_Arch arch, U32 id)\r\n{\r\n  String8 result = str8_zero();\r\n  switch (arch) {\r\n    case CV_Arch_8086: {\r\n      switch (id) {\r\n#define X(_N, _ID, ...) case _ID: result = str8_lit(Stringify(_N)); break;\r\n        CV_Reg_X86_XList(X)\r\n#undef X\r\n      }\r\n    } break;\r\n    case CV_Arch_X64: {\r\n      switch (id) {\r\n#define X(_N, _ID, ...) case _ID: result = str8_lit(Stringify(_N)); break;\r\n        CV_Reg_X64_XList(X)\r\n#undef X\r\n      }\r\n    } break;\r\n    default: NotImplemented; break;\r\n  }\r\n  if (result.size == 0) {\r\n    result = push_str8f(arena, \"%x\", id);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_member_access(CV_MemberAccess x)\r\n{\r\n  switch (x) {\r\n    case CV_MemberAccess_Null:      break;\r\n    case CV_MemberAccess_Private:   return str8_lit(\"Private\");\r\n    case CV_MemberAccess_Protected: return str8_lit(\"Protected\");\r\n    case CV_MemberAccess_Public:    return str8_lit(\"Public\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_method_prop(CV_MethodProp x)\r\n{\r\n  switch (x) {\r\n    case CV_MethodProp_Vanilla:     return str8_lit(\"Vanilla\");\r\n    case CV_MethodProp_Virtual:     return str8_lit(\"Virtual\");\r\n    case CV_MethodProp_Static:      return str8_lit(\"Static\");\r\n    case CV_MethodProp_Friend:      return str8_lit(\"Friend\");\r\n    case CV_MethodProp_Intro:       return str8_lit(\"Intro\");\r\n    case CV_MethodProp_PureVirtual: return str8_lit(\"PureVirtual\");\r\n    case CV_MethodProp_PureIntro:   return str8_lit(\"PureIntro\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_hfa(CV_HFAKind x)\r\n{\r\n  switch (x) {\r\n    case CV_HFAKind_None:   return str8_lit(\"None\");\r\n    case CV_HFAKind_Float:  return str8_lit(\"Float\");\r\n    case CV_HFAKind_Double: return str8_lit(\"Double\");\r\n    case CV_HFAKind_Other:  return str8_lit(\"Other\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_mcom(CV_MoComUDTKind x)\r\n{\r\n  switch (x) {\r\n    case CV_MoComUDTKind_None:      return str8_lit(\"None\");\r\n    case CV_MoComUDTKind_Ref:       return str8_lit(\"Ref\");\r\n    case CV_MoComUDTKind_Value:     return str8_lit(\"Value\");\r\n    case CV_MoComUDTKind_Interface: return str8_lit(\"Interface\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_binary_opcode(CV_InlineBinaryAnnotation x)\r\n{\r\n  switch (x) {\r\n    case CV_InlineBinaryAnnotation_Null:                          break;\r\n    case CV_InlineBinaryAnnotation_CodeOffset:                    return str8_lit(\"CodeOffset\");\r\n    case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase:          return str8_lit(\"ChangeCodeOffsetBase\");\r\n    case CV_InlineBinaryAnnotation_ChangeCodeOffset:              return str8_lit(\"ChangeCodeOffset\");\r\n    case CV_InlineBinaryAnnotation_ChangeCodeLength:              return str8_lit(\"ChangeCodeLength\");\r\n    case CV_InlineBinaryAnnotation_ChangeFile:                    return str8_lit(\"ChangeFile\");\r\n    case CV_InlineBinaryAnnotation_ChangeLineOffset:              return str8_lit(\"ChangeLineOffset\");\r\n    case CV_InlineBinaryAnnotation_ChangeLineEndDelta:            return str8_lit(\"ChangeLineEndDelta\");\r\n    case CV_InlineBinaryAnnotation_ChangeRangeKind:               return str8_lit(\"ChangeRangeKind\");\r\n    case CV_InlineBinaryAnnotation_ChangeColumnStart:             return str8_lit(\"ChangeColumnStart\");\r\n    case CV_InlineBinaryAnnotation_ChangeColumnEndDelta:          return str8_lit(\"ChangeColumnEndDelta\");\r\n    case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: return str8_lit(\"ChangeCodeOffsetAndLineOffset\");\r\n    case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: return str8_lit(\"ChangeCodeLengthAndCodeOffset\");\r\n    case CV_InlineBinaryAnnotation_ChangeColumnEnd:               return str8_lit(\"ChangeColumnEnd\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_thunk_ordinal(CV_ThunkOrdinal x)\r\n{\r\n  switch (x) {\r\n    case CV_ThunkOrdinal_NoType:            return str8_lit(\"NoType\");\r\n    case CV_ThunkOrdinal_Adjustor:          return str8_lit(\"Adjustor\");\r\n    case CV_ThunkOrdinal_VCall:             return str8_lit(\"VCall\");\r\n    case CV_ThunkOrdinal_PCode:             return str8_lit(\"PCode\");\r\n    case CV_ThunkOrdinal_Load:              return str8_lit(\"Load\");\r\n    case CV_ThunkOrdinal_TrampIncremental:  return str8_lit(\"TrampIncremental\");\r\n    case CV_ThunkOrdinal_TrampBranchIsland: return str8_lit(\"TrampBranchIsland\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_frame_cookie_kind(CV_FrameCookieKind x)\r\n{\r\n  switch (x) {\r\n    case CV_FrameCookieKind_Copy:  return str8_lit(\"Copy\");\r\n    case CV_FrameCookieKind_XorSP: return str8_lit(\"XorSP\");\r\n    case CV_FrameCookieKind_XorBP: return str8_lit(\"XorR13\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_generic_style(CV_GenericStyle x)\r\n{\r\n  switch (x) {\r\n    case CV_GenericStyle_VOID:   return str8_lit(\"VOID\");\r\n    case CV_GenericStyle_REG:    return str8_lit(\"REG\");\r\n    case CV_GenericStyle_ICAN:   return str8_lit(\"ICAN\");\r\n    case CV_GenericStyle_ICAF:   return str8_lit(\"ICAF\");\r\n    case CV_GenericStyle_IRAN:   return str8_lit(\"IRAN\");\r\n    case CV_GenericStyle_IRAF:   return str8_lit(\"IRAF\");\r\n    case CV_GenericStyle_UNUSED: return str8_lit(\"UNUSED\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_trampoline_kind(CV_TrampolineKind x)\r\n{\r\n  switch (x) {\r\n    case CV_TrampolineKind_Incremental:  return str8_lit(\"Incremental\");\r\n    case CV_TrampolineKind_BranchIsland: return str8_lit(\"BranchIsland\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_virtual_table_shape_kind(CV_VirtualTableShape x)\r\n{\r\n  switch (x) {\r\n    case CV_VirtualTableShape_Near:   return str8_lit(\"Near\");\r\n    case CV_VirtualTableShape_Far:    return str8_lit(\"Far\");\r\n    case CV_VirtualTableShape_Thin:   return str8_lit(\"Thin\");\r\n    case CV_VirtualTableShape_Outer:  return str8_lit(\"Outer\");\r\n    case CV_VirtualTableShape_Meta:   return str8_lit(\"Meta\");\r\n    case CV_VirtualTableShape_Near32: return str8_lit(\"Near32\");\r\n    case CV_VirtualTableShape_Far32:  return str8_lit(\"Far32\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_call_kind(CV_CallKind x)\r\n{\r\n  switch (x) {\r\n    case CV_CallKind_NearC:          return str8_lit(\"NearC\");\r\n    case CV_CallKind_FarC:           return str8_lit(\"FarC\");\r\n    case CV_CallKind_NearPascal:     return str8_lit(\"NearPascal\");\r\n    case CV_CallKind_FarPascal:      return str8_lit(\"FarPascal\");\r\n    case CV_CallKind_NearFast:       return str8_lit(\"NearFast\");\r\n    case CV_CallKind_FarFast:        return str8_lit(\"FarFast\");\r\n    case CV_CallKind_UNUSED:         return str8_lit(\"UNUSED\");\r\n    case CV_CallKind_NearStd:        return str8_lit(\"NearStd\");\r\n    case CV_CallKind_FarStd:         return str8_lit(\"FarStd\");\r\n    case CV_CallKind_NearSys:        return str8_lit(\"NearSys\");\r\n    case CV_CallKind_FarSys:         return str8_lit(\"FarSys\");\r\n    case CV_CallKind_This:           return str8_lit(\"This\");\r\n    case CV_CallKind_Mips:           return str8_lit(\"Mips\");\r\n    case CV_CallKind_Generic:        return str8_lit(\"Generic\");\r\n    case CV_CallKind_Alpha:          return str8_lit(\"Alpha\");\r\n    case CV_CallKind_PPC:            return str8_lit(\"PPC\");\r\n    case CV_CallKind_HitachiSuperH:  return str8_lit(\"HitachiSuperH\");\r\n    case CV_CallKind_Arm:            return str8_lit(\"Arm\");\r\n    case CV_CallKind_AM33:           return str8_lit(\"AM33\");\r\n    case CV_CallKind_TriCore:        return str8_lit(\"TriCore\");\r\n    case CV_CallKind_HitachiSuperH5: return str8_lit(\"HitachiSuperH5\");\r\n    case CV_CallKind_M32R:           return str8_lit(\"M32R\");\r\n    case CV_CallKind_Clr:            return str8_lit(\"Clr\");\r\n    case CV_CallKind_Inline:         return str8_lit(\"Inline\");\r\n    case CV_CallKind_NearVector:     return str8_lit(\"NearVector\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_member_pointer_kind(CV_MemberPointerKind x)\r\n{\r\n  switch (x) {\r\n    case CV_MemberPointerKind_Undef:        return str8_lit(\"Undef\");\r\n    case CV_MemberPointerKind_DataSingle:   return str8_lit(\"DataSingle\");\r\n    case CV_MemberPointerKind_DataMultiple: return str8_lit(\"DataMultiple\");\r\n    case CV_MemberPointerKind_DataVirtual:  return str8_lit(\"DataVirtual\");\r\n    case CV_MemberPointerKind_DataGeneral:  return str8_lit(\"DataGeneral\");\r\n    case CV_MemberPointerKind_FuncSingle:   return str8_lit(\"FuncSingle\");\r\n    case CV_MemberPointerKind_FuncMultiple: return str8_lit(\"FuncMultiple\");\r\n    case CV_MemberPointerKind_FuncGeneral:  return str8_lit(\"FuncGeneral\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_pointer_kind(CV_PointerKind x)\r\n{\r\n  switch (x) {\r\n    case CV_PointerKind_Near:        return str8_lit(\"Near\");\r\n    case CV_PointerKind_Far:         return str8_lit(\"Far\");\r\n    case CV_PointerKind_Huge:        return str8_lit(\"Huge\");\r\n    case CV_PointerKind_BaseSeg:     return str8_lit(\"BaseSeg\");\r\n    case CV_PointerKind_BaseVal:     return str8_lit(\"BaseVal\");\r\n    case CV_PointerKind_BaseSegVal:  return str8_lit(\"BaseSegVal\");\r\n    case CV_PointerKind_BaseAddr:    return str8_lit(\"BaseAddr\");\r\n    case CV_PointerKind_BaseSegAddr: return str8_lit(\"BaseSegAddr\");\r\n    case CV_PointerKind_BaseType:    return str8_lit(\"BaseType\");\r\n    case CV_PointerKind_BaseSelf:    return str8_lit(\"BaseSelf\");\r\n    case CV_PointerKind_Near32:      return str8_lit(\"Near32\");\r\n    case CV_PointerKind_Far32:       return str8_lit(\"Far32\");\r\n    case CV_PointerKind_64:          return str8_lit(\"64Bit\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_pointer_mode(CV_PointerMode x)\r\n{\r\n  switch (x) {\r\n    case CV_PointerMode_Ptr:       return str8_lit(\"Ptr\");\r\n    case CV_PointerMode_LRef:      return str8_lit(\"LRef\");\r\n    case CV_PointerMode_PtrMem:    return str8_lit(\"PtrMem\");\r\n    case CV_PointerMode_PtrMethod: return str8_lit(\"PtrMethod\");\r\n    case CV_PointerMode_RRef:      return str8_lit(\"RRef\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_c13_checksum_kind(CV_C13ChecksumKind x)\r\n{\r\n  switch (x) {\r\n    case CV_C13ChecksumKind_Null:   break;\r\n    case CV_C13ChecksumKind_MD5:    return str8_lit(\"MD5\");\r\n    case CV_C13ChecksumKind_SHA1:   return str8_lit(\"SHA1\");\r\n    case CV_C13ChecksumKind_SHA256: return str8_lit(\"SHA256\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_label_kind(Arena *arena, CV_LabelKind x)\r\n{\r\n  switch (x) {\r\n    case CV_LabelKind_Near: return str8_lit(\"Near\");\r\n    case CV_LabelKind_Far:  return str8_lit(\"Far\");\r\n  }\r\n  return push_str8f(arena, \"%#x\", x);\r\n}\r\n\r\ninternal String8\r\ncv_string_from_c13_subsection_kind(CV_C13SubSectionKind x)\r\n{\r\n  switch (x) {\r\n#define X(_N, _ID) case CV_C13SubSectionKind_##_N: return str8_lit(Stringify(_N));\r\n    CV_C13SubSectionKindXList(X)\r\n#undef X\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncv_string_from_modifier_flags(Arena *arena, CV_ModifierFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_ModifierFlag_Const) {\r\n    str8_list_pushf(scratch.arena, &list, \"Const\");\r\n  }\r\n  if (x & CV_ModifierFlag_Volatile) {\r\n    str8_list_pushf(scratch.arena, &list, \"Volatile\");\r\n  }\r\n  if (x & CV_ModifierFlag_Unaligned) {\r\n    str8_list_pushf(scratch.arena, &list, \"Unaligned\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_pointer_attribs(Arena *arena, CV_PointerAttribs x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  String8List list = {0};\r\n  if (x & CV_PointerAttrib_IsFlat) {\r\n    x &= ~CV_PointerAttrib_IsFlat;\r\n    str8_list_pushf(scratch.arena, &list, \"IsFlat\");\r\n  }\r\n  if (x & CV_PointerAttrib_Volatile) {\r\n    x &= ~CV_PointerAttrib_Volatile;\r\n    str8_list_pushf(scratch.arena, &list, \"Volatile\");\r\n  }\r\n  if (x & CV_PointerAttrib_Const) {\r\n    x &= ~CV_PointerAttrib_Const;\r\n    str8_list_pushf(scratch.arena, &list, \"Const\");\r\n  }\r\n  if (x & CV_PointerAttrib_Unaligned) {\r\n    x &= ~CV_PointerAttrib_Unaligned;\r\n    str8_list_pushf(scratch.arena, &list, \"Unaligned\");\r\n  }\r\n  if (x & CV_PointerAttrib_Restricted) {\r\n    x &= ~CV_PointerAttrib_Restricted;\r\n    str8_list_pushf(scratch.arena, &list, \"Restricted\");\r\n  }\r\n  if (x & CV_PointerAttrib_MOCOM) {\r\n    x &= ~CV_PointerAttrib_MOCOM;\r\n    str8_list_pushf(scratch.arena, &list, \"MOCOM\");\r\n  }\r\n  if (x & CV_PointerAttrib_LRef) {\r\n    x &= ~CV_PointerAttrib_LRef;\r\n    str8_list_pushf(scratch.arena, &list, \"LRef\");\r\n  }\r\n  if (x & CV_PointerAttrib_RRef) {\r\n    x &= ~CV_PointerAttrib_RRef;\r\n    str8_list_pushf(scratch.arena, &list, \"RRef\");\r\n  }\r\n  \r\n  CV_PointerKind kind = CV_PointerAttribs_Extract_Kind(x);\r\n  CV_PointerMode mode = CV_PointerAttribs_Extract_Mode(x);\r\n  U64            size = CV_PointerAttribs_Extract_Size(x);\r\n  \r\n  x &= ~(0x1f|(0x7<<5)|(0x3f<<13));\r\n  \r\n  if (kind) {\r\n    String8 kind_str = cv_string_from_pointer_kind(kind);\r\n    str8_list_pushf(scratch.arena, &list, \"Kind=%S\", kind_str);\r\n  }\r\n  if (mode) {\r\n    String8 mode_str = cv_string_from_pointer_mode(mode);\r\n    str8_list_pushf(scratch.arena, &list, \"Mode=%S\", mode_str);\r\n  }\r\n  if (size) {\r\n    str8_list_pushf(scratch.arena, &list, \"Size=%llu\", size);\r\n  }\r\n  \r\n  if (x != 0) {\r\n    str8_list_pushf(scratch.arena, &list, \"Unknown=%x\", x);\r\n  }\r\n  \r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_function_attribs(Arena *arena, CV_FunctionAttribs x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_FunctionAttrib_CxxReturnUDT) {\r\n    str8_list_pushf(scratch.arena, &list, \"CxxReturnUDT\");\r\n  }\r\n  if (x & CV_FunctionAttrib_Constructor) {\r\n    str8_list_pushf(scratch.arena, &list, \"Constructor\");\r\n  }\r\n  if (x & CV_FunctionAttrib_ConstructorVBase) {\r\n    str8_list_pushf(scratch.arena, &list, \"ConstructorVBase\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_export_flags(Arena *arena, CV_ExportFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_ExportFlag_Constant) {\r\n    str8_list_pushf(scratch.arena, &list, \"Constant\");\r\n  }\r\n  if (x & CV_ExportFlag_Data) {\r\n    str8_list_pushf(scratch.arena, &list, \"Data\");\r\n  }\r\n  if (x & CV_ExportFlag_Private) {\r\n    str8_list_pushf(scratch.arena, &list, \"Private\");\r\n  }\r\n  if (x & CV_ExportFlag_NoName) {\r\n    str8_list_pushf(scratch.arena, &list, \"NoName\");\r\n  }\r\n  if (x & CV_ExportFlag_Ordinal) {\r\n    str8_list_pushf(scratch.arena, &list, \"Ordinal\");\r\n  }\r\n  if (x & CV_ExportFlag_Forwarder) {\r\n    str8_list_pushf(scratch.arena, &list, \"Forwarder\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_sepcode(Arena *arena, CV_SepcodeFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena,1);\r\n  String8List list = {0};\r\n  if (x & CV_SepcodeFlag_IsLexicalScope) {\r\n    str8_list_pushf(scratch.arena, &list, \"IsLexicalScope\");\r\n  }\r\n  if (x & CV_SepcodeFlag_ReturnsToParent) {\r\n    str8_list_pushf(scratch.arena, &list, \"ReturnsToParent\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_pub32_flags(Arena *arena, CV_Pub32Flags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_Pub32Flag_Code) {\r\n    str8_list_pushf(scratch.arena, &list, \"Code\");\r\n  }\r\n  if (x & CV_Pub32Flag_Function) {\r\n    str8_list_pushf(scratch.arena, &list, \"Function\");\r\n  }\r\n  if (x & CV_Pub32Flag_ManagedCode) {\r\n    str8_list_pushf(scratch.arena, &list, \"ManagedCode\");\r\n  }\r\n  if (x & CV_Pub32Flag_MSIL) {\r\n    str8_list_pushf(scratch.arena, &list, \"MSIL\");\r\n  }\r\n  String8 result = str8_list_join(scratch.arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_generic_flags(Arena *arena, CV_GenericFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_GenericFlags_CSTYLE) {\r\n    str8_list_pushf(scratch.arena, &list, \"CSTYLE\");\r\n  }\r\n  if (x & CV_GenericFlags_RSCLEAN) {\r\n    str8_list_pushf(scratch.arena, &list, \"RSCLEAN\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_frame_proc_flags(Arena *arena, CV_FrameprocFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_FrameprocFlag_UsesAlloca) {\r\n    str8_list_pushf(scratch.arena, &list, \"UsesAlloca\");\r\n  }\r\n  if (x & CV_FrameprocFlag_UsesSetJmp) {\r\n    str8_list_pushf(scratch.arena, &list, \"UsesSetJmp\");\r\n  }\r\n  if (x & CV_FrameprocFlag_UsesLongJmp) {\r\n    str8_list_pushf(scratch.arena, &list, \"UsesLongJmp\");\r\n  }\r\n  if (x & CV_FrameprocFlag_UsesInlAsm) {\r\n    str8_list_pushf(scratch.arena, &list, \"UsesInlAsm\");\r\n  }\r\n  if (x & CV_FrameprocFlag_UsesEH) {\r\n    str8_list_pushf(scratch.arena, &list, \"UsesEH\");\r\n  }\r\n  if (x & CV_FrameprocFlag_Inline) {\r\n    str8_list_pushf(scratch.arena, &list, \"Inline\");\r\n  }\r\n  if (x & CV_FrameprocFlag_HasSEH) {\r\n    str8_list_pushf(scratch.arena, &list, \"HasSEH\");\r\n  }\r\n  if (x & CV_FrameprocFlag_Naked) {\r\n    str8_list_pushf(scratch.arena, &list, \"Naked\");\r\n  }\r\n  if (x & CV_FrameprocFlag_HasSecurityChecks) {\r\n    str8_list_pushf(scratch.arena, &list, \"HasSecurityChecks\");\r\n  }\r\n  if (x & CV_FrameprocFlag_AsyncEH) {\r\n    str8_list_pushf(scratch.arena, &list, \"AsyncEH\");\r\n  }\r\n  if (x & CV_FrameprocFlag_GSNoStackOrdering) {\r\n    str8_list_pushf(scratch.arena, &list, \"GSNoStackOrdering\");\r\n  }\r\n  if (x & CV_FrameprocFlag_WasInlined) {\r\n    str8_list_pushf(scratch.arena, &list, \"WasInlined\");\r\n  }\r\n  if (x & CV_FrameprocFlag_GSCheck) {\r\n    str8_list_pushf(scratch.arena, &list, \"GSCheck\");\r\n  }\r\n  if (x & CV_FrameprocFlag_SafeBuffers) {\r\n    str8_list_pushf(scratch.arena, &list, \"SafeBuffers\");\r\n  }\r\n  if (x & CV_FrameprocFlag_PogoOn) {\r\n    str8_list_pushf(scratch.arena, &list, \"PogoOn\");\r\n  }\r\n  if (x & CV_FrameprocFlag_PogoCountsValid) {\r\n    str8_list_pushf(scratch.arena, &list, \"PogoCountsValid\");\r\n  }\r\n  if (x & CV_FrameprocFlag_OptSpeed) {\r\n    str8_list_pushf(scratch.arena, &list, \"OptSpeed\");\r\n  }\r\n  if (x & CV_FrameprocFlag_HasCFG) {\r\n    str8_list_pushf(scratch.arena, &list, \"HasCFG\");\r\n  }\r\n  if (x & CV_FrameprocFlag_HasCFW) {\r\n    str8_list_pushf(scratch.arena, &list, \"HasCFW\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_type_props(Arena *arena, CV_TypeProps32 x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  U32 hfa  = CV_TypeProps_Extract_HFA(x);\r\n  U32 mcom = CV_TypeProps_Extract_MOCOM(x);\r\n  \r\n  String8 hfa_str  = cv_string_from_hfa(hfa);\r\n  String8 mcom_str = cv_string_from_mcom(mcom);\r\n  \r\n  String8 flags_str;\r\n  {\r\n    String8List list = {0};\r\n    if (x & CV_TypeProp_Packed) {\r\n      x &= ~CV_TypeProp_Packed;\r\n      str8_list_pushf(scratch.arena, &list, \"Packed\");\r\n    }\r\n    if (x & CV_TypeProp_HasConstructorsDestructors) {\r\n      x &= ~CV_TypeProp_HasConstructorsDestructors;\r\n      str8_list_pushf(scratch.arena, &list, \"HasConstructorsDestructors\");\r\n    }\r\n    if (x & CV_TypeProp_OverloadedOperators) {\r\n      x &= ~CV_TypeProp_OverloadedOperators;\r\n      str8_list_pushf(scratch.arena, &list, \"OverloadedOperators\");\r\n    }\r\n    if (x & CV_TypeProp_IsNested) {\r\n      x &= ~CV_TypeProp_IsNested;\r\n      str8_list_pushf(scratch.arena, &list, \"IsNested\");\r\n    }\r\n    if (x & CV_TypeProp_ContainsNested) {\r\n      x &= ~CV_TypeProp_ContainsNested;\r\n      str8_list_pushf(scratch.arena, &list, \"ContainsNested\");\r\n    }\r\n    if (x & CV_TypeProp_OverloadedAssignment) {\r\n      x &= ~CV_TypeProp_OverloadedAssignment;\r\n      str8_list_pushf(scratch.arena, &list, \"OverloadedAssignment\");\r\n    }\r\n    if (x & CV_TypeProp_OverloadedCasting) {\r\n      x &= ~CV_TypeProp_OverloadedCasting;\r\n      str8_list_pushf(scratch.arena, &list, \"OverloadedCasting\");\r\n    }\r\n    if (x & CV_TypeProp_FwdRef) {\r\n      x &= ~CV_TypeProp_FwdRef;\r\n      str8_list_pushf(scratch.arena, &list, \"FwdRef\");\r\n    }\r\n    if (x & CV_TypeProp_Scoped) {\r\n      x &= ~CV_TypeProp_Scoped;\r\n      str8_list_pushf(scratch.arena, &list, \"Scoped\");\r\n    }\r\n    if (x & CV_TypeProp_HasUniqueName) {\r\n      x &= ~CV_TypeProp_HasUniqueName;\r\n      str8_list_pushf(scratch.arena, &list, \"HasUniqueName\");\r\n    }\r\n    if (x & CV_TypeProp_Sealed) {\r\n      x &= ~CV_TypeProp_Sealed;\r\n      str8_list_pushf(scratch.arena, &list, \"Sealed\");\r\n    }\r\n    if (x & CV_TypeProp_Intrinsic) {\r\n      x &= ~CV_TypeProp_Intrinsic;\r\n      str8_list_pushf(scratch.arena, &list, \"Intrinsic\");\r\n    }\r\n    if (x != 0) {\r\n      str8_list_pushf(scratch.arena, &list, \"%x\", x);\r\n    }\r\n    flags_str = str8_list_join(scratch.arena, &list, &(StringJoin){.sep=str8_lit(\", \") });\r\n    \r\n    if (hfa) {\r\n      str8_list_pushf(scratch.arena, &list, \"HFA = %S\", hfa_str);\r\n    }\r\n    if (mcom) {\r\n      str8_list_pushf(scratch.arena, &list, \"MCOM = %S\", mcom_str);\r\n    }\r\n  }\r\n  \r\n  String8 result = push_str8f(arena, \"%S\", flags_str);\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_local_flags(Arena *arena, CV_LocalFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_LocalFlag_Param) {\r\n    str8_list_pushf(scratch.arena, &list, \"Param\");\r\n  }\r\n  if (x & CV_LocalFlag_AddrTaken) {\r\n    str8_list_pushf(scratch.arena, &list, \"AddrTaken\");\r\n  }\r\n  if (x & CV_LocalFlag_Compgen) {\r\n    str8_list_pushf(scratch.arena, &list, \"Compgen\");\r\n  }\r\n  if (x & CV_LocalFlag_Aggregate) {\r\n    str8_list_pushf(scratch.arena, &list, \"Aggregate\");\r\n  }\r\n  if (x & CV_LocalFlag_PartOfAggregate) {\r\n    str8_list_pushf(scratch.arena, &list, \"PartOfAggregate\");\r\n  }\r\n  if (x & CV_LocalFlag_Aliased) {\r\n    str8_list_pushf(scratch.arena, &list, \"Aliased\");\r\n  }\r\n  if (x & CV_LocalFlag_Alias) {\r\n    str8_list_pushf(scratch.arena, &list, \"Alias\");\r\n  }\r\n  if (x & CV_LocalFlag_Retval) {\r\n    str8_list_pushf(scratch.arena, &list, \"Retval\");\r\n  }\r\n  if (x & CV_LocalFlag_OptOut) {\r\n    str8_list_pushf(scratch.arena, &list, \"OptOut\");\r\n  }\r\n  if (x & CV_LocalFlag_Global) {\r\n    str8_list_pushf(scratch.arena, &list, \"Global\");\r\n  }\r\n  if (x & CV_LocalFlag_Static) {\r\n    str8_list_pushf(scratch.arena, &list, \"Static\");\r\n  }\r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_proc_flags(Arena *arena, CV_ProcFlags x)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (x & CV_ProcFlag_NoFPO) {\r\n    x &= ~CV_ProcFlag_NoFPO;\r\n    str8_list_pushf(scratch.arena, &list, \"NoFPO\");\r\n  }\r\n  if (x & CV_ProcFlag_IntReturn) {\r\n    x &= ~CV_ProcFlag_IntReturn;\r\n    str8_list_pushf(scratch.arena, &list, \"IntReturn\");\r\n  }\r\n  if (x & CV_ProcFlag_FarReturn) {\r\n    x &= ~CV_ProcFlag_FarReturn;\r\n    str8_list_pushf(scratch.arena, &list, \"FarReturn\");\r\n  }\r\n  if (x & CV_ProcFlag_NeverReturn) {\r\n    x &= ~CV_ProcFlag_NeverReturn;\r\n    str8_list_pushf(scratch.arena, &list, \"NeverReturn\");\r\n  }\r\n  if (x & CV_ProcFlag_NotReached) {\r\n    x &= ~CV_ProcFlag_NotReached;\r\n    str8_list_pushf(scratch.arena, &list, \"NotReached\");\r\n  }\r\n  if (x & CV_ProcFlag_CustomCall) {\r\n    x &= ~CV_ProcFlag_CustomCall;\r\n    str8_list_pushf(scratch.arena, &list, \"CustomCall\");\r\n  }\r\n  if (x & CV_ProcFlag_NoInline) {\r\n    x &= ~CV_ProcFlag_NoInline;\r\n    str8_list_pushf(scratch.arena, &list, \"NoInline\");\r\n  }\r\n  if (x & CV_ProcFlag_OptDbgInfo) {\r\n    x &= ~CV_ProcFlag_OptDbgInfo;\r\n    str8_list_pushf(scratch.arena, &list, \"OptDbgInfo\");\r\n  }\r\n  if (x != 0) {\r\n    str8_list_pushf(scratch.arena, &list, \"%#x\", x);\r\n  }\r\n  String8 result;\r\n  if (list.node_count == 0) {\r\n    result = str8_lit(\"None\");\r\n  } else {\r\n    result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  }\r\n  temp_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_range_attribs(Arena *arena, CV_RangeAttribs x)\r\n{ (void)arena;\r\n  String8 result = str8_lit(\"None\");\r\n  if (x == CV_RangeAttrib_Maybe) {\r\n    result = str8_lit(\"Maybe\");\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_defrange_register_rel_flags(Arena *arena, CV_DefrangeRegisterRelFlags x)\r\n{ (void)arena;\r\n  String8 result = str8_lit(\"None\");\r\n  if (x == CV_DefrangeRegisterRelFlag_SpilledOutUDTMember) {\r\n    result = str8_lit(\"SpilledOutUDTMember\");\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_field_attribs(Arena *arena, CV_FieldAttribs attribs)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  U32 access = CV_FieldAttribs_Extract_Access(attribs);\r\n  U32 mprop  = CV_FieldAttribs_Extract_MethodProp(attribs);\r\n  attribs &= ~(0x3 | 0x7);\r\n  \r\n  String8 access_str = cv_string_from_member_access(access);\r\n  String8 mprop_str  = cv_string_from_method_prop(mprop);\r\n  \r\n  String8List list = {0};\r\n  {\r\n    if (attribs & CV_FieldAttrib_Pseudo) {\r\n      attribs &= ~CV_FieldAttrib_Pseudo;\r\n      str8_list_pushf(scratch.arena, &list, \"Pseudo\");\r\n    }\r\n    if (attribs & CV_FieldAttrib_NoInherit) {\r\n      attribs &= ~CV_FieldAttrib_NoInherit;\r\n      str8_list_pushf(scratch.arena, &list, \"NoInherit\");\r\n    }\r\n    if (attribs & CV_FieldAttrib_NoConstruct) {\r\n      attribs &= ~CV_FieldAttrib_NoConstruct;\r\n      str8_list_pushf(scratch.arena, &list, \"NoConstruct\");\r\n    }\r\n    if (attribs & CV_FieldAttrib_CompilerGenated) {\r\n      attribs &= ~CV_FieldAttrib_CompilerGenated;\r\n      str8_list_pushf(scratch.arena, &list, \"CompilerGenerated\");\r\n    }\r\n    if (attribs & CV_FieldAttrib_Sealed) {\r\n      attribs &= ~CV_FieldAttrib_Sealed;\r\n      str8_list_pushf(scratch.arena, &list, \"Sealed\");\r\n    }\r\n    if (attribs) {\r\n      str8_list_pushf(scratch.arena, &list, \"Unknown: %x\", attribs);\r\n    }\r\n  }\r\n  \r\n  if (access) {\r\n    str8_list_pushf(scratch.arena, &list, \"%S\", access_str);\r\n  }\r\n  if (mprop) {\r\n    str8_list_pushf(scratch.arena, &list, \"%S\", mprop_str);\r\n  }\r\n  \r\n  String8 result = str8_list_join(scratch.arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_itype(Arena *arena, CV_TypeIndex min_itype, CV_TypeIndex itype)\r\n{\r\n  String8 result = str8_zero();\r\n  if (itype < min_itype) {\r\n    String8 n = cv_type_name_from_basic_type((CV_BasicType)itype);\r\n    if (n.size) {\r\n      Temp scratch = scratch_begin(&arena, 1);\r\n      \r\n      U64 type = CV_BasicTypeFromTypeId(itype);\r\n      char *type_str = \"???\";\r\n      switch (type) {\r\n        case CV_BasicType_NOTYPE:     type_str = \"NOTYPE\";     break;\r\n        case CV_BasicType_ABS:        type_str = \"ABS\";        break;\r\n        case CV_BasicType_SEGMENT:    type_str = \"SEGMENT\";    break;\r\n        case CV_BasicType_VOID:       type_str = \"VOID\";       break;\r\n        case CV_BasicType_CURRENCY:   type_str = \"CURRENCY\";   break;\r\n        case CV_BasicType_NBASICSTR:  type_str = \"NBASICSTR\";  break;\r\n        case CV_BasicType_FBASICSTR:  type_str = \"FBASICSTR\";  break;\r\n        case CV_BasicType_NOTTRANS:   type_str = \"NOTTRANS\";   break;\r\n        case CV_BasicType_HRESULT:    type_str = \"HRESULT\";    break;\r\n        case CV_BasicType_CHAR:       type_str = \"CHAR\";       break;\r\n        case CV_BasicType_SHORT:      type_str = \"SHORT\";      break;\r\n        case CV_BasicType_LONG:       type_str = \"LONG\";       break;\r\n        case CV_BasicType_QUAD:       type_str = \"QUAD\";       break;\r\n        case CV_BasicType_OCT:        type_str = \"OCT\";        break;\r\n        case CV_BasicType_UCHAR:      type_str = \"UCHAR\";      break;\r\n        case CV_BasicType_USHORT:     type_str = \"USHORT\";     break;\r\n        case CV_BasicType_ULONG:      type_str = \"ULONG\";      break;\r\n        case CV_BasicType_UQUAD:      type_str = \"UQUAD\";      break;\r\n        case CV_BasicType_UOCT:       type_str = \"UOCT\";       break;\r\n        case CV_BasicType_BOOL8:      type_str = \"BOOL8\";      break;\r\n        case CV_BasicType_BOOL16:     type_str = \"BOOL16\";     break;\r\n        case CV_BasicType_BOOL32:     type_str = \"BOOL32\";     break;\r\n        case CV_BasicType_BOOL64:     type_str = \"BOOL64\";     break;\r\n        case CV_BasicType_FLOAT32:    type_str = \"FLOAT32\";    break;\r\n        case CV_BasicType_FLOAT64:    type_str = \"FLOAT64\";    break;\r\n        case CV_BasicType_FLOAT80:    type_str = \"FLOAT80\";    break;\r\n        case CV_BasicType_FLOAT128:   type_str = \"FLOAT128\";   break;\r\n        case CV_BasicType_FLOAT48:    type_str = \"FLOAT48\";    break;\r\n        case CV_BasicType_FLOAT32PP:  type_str = \"FLOAT32PP\";  break;\r\n        case CV_BasicType_FLOAT16:    type_str = \"FLOAT16\";    break;\r\n        case CV_BasicType_COMPLEX32:  type_str = \"COMPLEX32\";  break;\r\n        case CV_BasicType_COMPLEX64:  type_str = \"COMPLEX64\";  break;\r\n        case CV_BasicType_COMPLEX80:  type_str = \"COMPLEX80\";  break;\r\n        case CV_BasicType_COMPLEX128: type_str = \"COMPLEX128\"; break;\r\n        case CV_BasicType_BIT:        type_str = \"BIT\";        break;\r\n        case CV_BasicType_PASCHAR:    type_str = \"PASCHAR\";    break;\r\n        case CV_BasicType_BOOL32FF:   type_str = \"BOOL32FF\";   break;\r\n        case CV_BasicType_INT8:       type_str = \"INT8\";       break;\r\n        case CV_BasicType_UINT8:      type_str = \"UINT8\";      break;\r\n        case CV_BasicType_RCHAR:      type_str = \"RCHAR\";      break;\r\n        case CV_BasicType_WCHAR:      type_str = \"WCHAR\";      break;\r\n        case CV_BasicType_INT16:      type_str = \"INT16\";      break;\r\n        case CV_BasicType_UINT16:     type_str = \"UINT16\";     break;\r\n        case CV_BasicType_INT32:      type_str = \"INT32\";      break;\r\n        case CV_BasicType_UINT32:     type_str = \"UINT32\";     break;\r\n        case CV_BasicType_INT64:      type_str = \"INT64\";      break;\r\n        case CV_BasicType_UINT64:     type_str = \"UINT64\";     break;\r\n        case CV_BasicType_INT128:     type_str = \"INT128\";     break;\r\n        case CV_BasicType_UINT128:    type_str = \"UINT128\";    break;\r\n        case CV_BasicType_CHAR16:     type_str = \"CHAR16\";     break;\r\n        case CV_BasicType_CHAR32:     type_str = \"CHAR32\";     break;\r\n        case CV_BasicType_CHAR8:      type_str = \"CHAR8\";      break;\r\n        case CV_BasicType_PTR:        type_str = \"PTR\";        break;\r\n      }\r\n      \r\n      U64 ptr = CV_BasicPointerKindFromTypeId(itype);\r\n      char *ptr_str = \"\";\r\n      switch (ptr) {\r\n        case 0x1: ptr_str = \"P\";    break;\r\n        case 0x2: ptr_str = \"PF\";   break;\r\n        case 0x3: ptr_str = \"PH\";   break;\r\n        case 0x4: ptr_str = \"32P\";  break;\r\n        case 0x5: ptr_str = \"32PF\"; break;\r\n        case 0x6: ptr_str = \"64P\";  break;\r\n      }\r\n      \r\n      n = upper_from_str8(scratch.arena, n);\r\n      result = push_str8f(arena, \"T_%s%s(%x)\", ptr_str, type_str, itype);\r\n      scratch_end(scratch);\r\n    } else {\r\n      result = push_str8f(arena, \"%x\", itype);\r\n    }\r\n  } else {\r\n    result = push_str8f(arena, \"%x\", itype);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_itemid(Arena *arena, CV_ItemId itemid)\r\n{\r\n  String8 result = push_str8f(arena, \"%x\", itemid);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_symbol_type(Arena *arena, CV_SymKind symbol_type)\r\n{\r\n  String8 str    = cv_string_from_sym_kind(symbol_type);\r\n  String8 result = push_str8f(arena, \"S_%S\", str);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_symbol_kind(Arena *arena, CV_SymKind kind)\r\n{\r\n  String8 str    = cv_string_from_sym_kind(kind);\r\n  String8 result = push_str8f(arena, \"S_%S\", str);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_leaf_name(Arena *arena, U32 leaf_type)\r\n{\r\n  String8 str    = cv_string_from_leaf_kind(leaf_type);\r\n  String8 result = push_str8f(arena, \"LF_%S\", str);\r\n  return result;\r\n}\r\n\r\ninternal String8 \r\ncv_string_sec_off(Arena *arena, U32 sec, U32 off)\r\n{\r\n  return push_str8f(arena, \"%04x:%08x\", sec, off);\r\n}\r\n\r\n"
  },
  {
    "path": "src/codeview/codeview.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CODEVIEW_H\r\n#define CODEVIEW_H\r\n\r\n// https://github.com/microsoft/microsoft-pdb/blob/master/include/cvinfo.h\r\n\r\n////////////////////////////////\r\n//~ rjf: CodeView Format Shared Types\r\n\r\n#define CV_MinComplexTypeIndex 0x1000\r\n\r\n#define CV_TypeIndex_Max max_U32\r\ntypedef U32          CV_TypeIndex;\r\ntypedef CV_TypeIndex CV_TypeId;\r\ntypedef CV_TypeIndex CV_ItemId;\r\n\r\n#define CV_ModIndex_Max     max_U16\r\n#define CV_ModIndex_Invalid CV_ModIndex_Max\r\ntypedef U16 CV_ModIndex;\r\n\r\ntypedef U16 CV_SectionIndex;\r\ntypedef U16 CV_Reg;\r\n\r\nread_only global CV_TypeId cv_type_id_variadic = 0xFFFFFFFF;\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/codeview.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ Aligns\r\n\r\n#define CV_LeafAlign          4\r\n#define CV_SymbolAlign        1\r\n#define CV_C13SubSectionAlign 4\r\n#define CV_FileCheckSumsAlign 4\r\n\r\n////////////////////////////////\r\n//~ rjf: Registers\r\n\r\n// X(NAME, CODE, (RDI_RegCode_X86) NAME, BYTE_POS, BYTE_SIZE)\r\n#define CV_Reg_X86_XList(X)      \\\r\nX(NONE,     0, nil,    0,  0)  \\\r\nX(AL,       1, eax,    0,  1)  \\\r\nX(CL,       2, ecx,    0,  1)  \\\r\nX(DL,       3, edx,    0,  1)  \\\r\nX(BL,       4, ebx,    0,  1)  \\\r\nX(AH,       5, eax,    1,  1)  \\\r\nX(CH,       6, ecx,    1,  1)  \\\r\nX(DH,       7, edx,    1,  1)  \\\r\nX(BH,       8, ebx,    1,  1)  \\\r\nX(AX,       9, eax,    0,  2)  \\\r\nX(CX,      10, ecx,    0,  2)  \\\r\nX(DX,      11, edx,    0,  2)  \\\r\nX(BX,      12, ebx,    0,  2)  \\\r\nX(SP,      13, esp,    0,  2)  \\\r\nX(BP,      14, ebp,    0,  2)  \\\r\nX(SI,      15, esi,    0,  2)  \\\r\nX(DI,      16, edi,    0,  2)  \\\r\nX(EAX,     17, eax,    0,  4)  \\\r\nX(ECX,     18, ecx,    0,  4)  \\\r\nX(EDX,     19, edx,    0,  4)  \\\r\nX(EBX,     20, ebx,    0,  4)  \\\r\nX(ESP,     21, esp,    0,  4)  \\\r\nX(EBP,     22, ebp,    0,  4)  \\\r\nX(ESI,     23, esi,    0,  4)  \\\r\nX(EDI,     24, edi,    0,  4)  \\\r\nX(ES,      25, es,     0,  2)  \\\r\nX(CS,      26, cs,     0,  2)  \\\r\nX(SS,      27, ss,     0,  2)  \\\r\nX(DS,      28, ds,     0,  2)  \\\r\nX(FS,      29, fs,     0,  2)  \\\r\nX(GS,      30, gs,     0,  2)  \\\r\nX(IP,      31, eip,    0,  2)  \\\r\nX(FLAGS,   32, eflags, 0,  2)  \\\r\nX(EIP,     33, eip,    0,  4)  \\\r\nX(EFLAGS,  34, eflags, 0,  4)  \\\r\nX(MM0,    146, fpr0,   0,  8)  \\\r\nX(MM1,    147, fpr1,   0,  8)  \\\r\nX(MM2,    148, fpr2,   0,  8)  \\\r\nX(MM3,    149, fpr3,   0,  8)  \\\r\nX(MM4,    150, fpr4,   0,  8)  \\\r\nX(MM5,    151, fpr5,   0,  8)  \\\r\nX(MM6,    152, fpr6,   0,  8)  \\\r\nX(MM7,    153, fpr7,   0,  8)  \\\r\nX(XMM0,   154, ymm0,   0,  16) \\\r\nX(XMM1,   155, ymm1,   0,  16) \\\r\nX(XMM2,   156, ymm2,   0,  16) \\\r\nX(XMM3,   157, ymm3,   0,  16) \\\r\nX(XMM4,   158, ymm4,   0,  16) \\\r\nX(XMM5,   159, ymm5,   0,  16) \\\r\nX(XMM6,   160, ymm6,   0,  16) \\\r\nX(XMM7,   161, ymm7,   0,  16) \\\r\nX(XMM00,  162, ymm0,   0,  4)  \\\r\nX(XMM01,  163, ymm0,   4,  4)  \\\r\nX(XMM02,  164, ymm0,   8,  4)  \\\r\nX(XMM03,  165, ymm0,   12, 4)  \\\r\nX(XMM10,  166, ymm1,   0,  4)  \\\r\nX(XMM11,  167, ymm1,   4,  4)  \\\r\nX(XMM12,  168, ymm1,   8,  4)  \\\r\nX(XMM13,  169, ymm1,   12, 4)  \\\r\nX(XMM20,  170, ymm2,   0,  4)  \\\r\nX(XMM21,  171, ymm2,   4,  4)  \\\r\nX(XMM22,  172, ymm2,   8,  4)  \\\r\nX(XMM23,  173, ymm2,   12, 4)  \\\r\nX(XMM30,  174, ymm3,   0,  4)  \\\r\nX(XMM31,  175, ymm3,   4,  4)  \\\r\nX(XMM32,  176, ymm3,   8,  4)  \\\r\nX(XMM33,  177, ymm3,   12, 4)  \\\r\nX(XMM40,  178, ymm4,   0,  4)  \\\r\nX(XMM41,  179, ymm4,   4,  4)  \\\r\nX(XMM42,  180, ymm4,   8,  4)  \\\r\nX(XMM43,  181, ymm4,   12, 4)  \\\r\nX(XMM50,  182, ymm5,   0,  4)  \\\r\nX(XMM51,  183, ymm5,   4,  4)  \\\r\nX(XMM52,  184, ymm5,   8,  4)  \\\r\nX(XMM53,  185, ymm5,   12, 4)  \\\r\nX(XMM60,  186, ymm6,   0,  4)  \\\r\nX(XMM61,  187, ymm6,   4,  4)  \\\r\nX(XMM62,  188, ymm6,   8,  4)  \\\r\nX(XMM63,  189, ymm6,   12, 4)  \\\r\nX(XMM70,  190, ymm7,   0,  4)  \\\r\nX(XMM71,  191, ymm7,   4,  4)  \\\r\nX(XMM72,  192, ymm7,   8,  4)  \\\r\nX(XMM73,  193, ymm7,   12, 4)  \\\r\nX(XMM0L,  194, ymm0,   0,  8)  \\\r\nX(XMM1L,  195, ymm1,   0,  8)  \\\r\nX(XMM2L,  196, ymm2,   0,  8)  \\\r\nX(XMM3L,  197, ymm3,   0,  8)  \\\r\nX(XMM4L,  198, ymm4,   0,  8)  \\\r\nX(XMM5L,  199, ymm5,   0,  8)  \\\r\nX(XMM6L,  200, ymm6,   0,  8)  \\\r\nX(XMM7L,  201, ymm7,   0,  8)  \\\r\nX(XMM0H,  202, ymm0,   8,  8)  \\\r\nX(XMM1H,  203, ymm1,   8,  8)  \\\r\nX(XMM2H,  204, ymm2,   8,  8)  \\\r\nX(XMM3H,  205, ymm3,   8,  8)  \\\r\nX(XMM4H,  206, ymm4,   8,  8)  \\\r\nX(XMM5H,  207, ymm5,   8,  8)  \\\r\nX(XMM6H,  208, ymm6,   8,  8)  \\\r\nX(XMM7H,  209, ymm7,   8,  8)  \\\r\nX(YMM0,   252, ymm0,   0,  32) \\\r\nX(YMM1,   253, ymm1,   0,  32) \\\r\nX(YMM2,   254, ymm2,   0,  32) \\\r\nX(YMM3,   255, ymm3,   0,  32) \\\r\nX(YMM4,   256, ymm4,   0,  32) \\\r\nX(YMM5,   257, ymm5,   0,  32) \\\r\nX(YMM6,   258, ymm6,   0,  32) \\\r\nX(YMM7,   259, ymm7,   0,  32) \\\r\nX(YMM0H,  260, ymm0,   16, 16) \\\r\nX(YMM1H,  261, ymm1,   16, 16) \\\r\nX(YMM2H,  262, ymm2,   16, 16) \\\r\nX(YMM3H,  263, ymm3,   16, 16) \\\r\nX(YMM4H,  264, ymm4,   16, 16) \\\r\nX(YMM5H,  265, ymm5,   16, 16) \\\r\nX(YMM6H,  266, ymm6,   16, 16) \\\r\nX(YMM7H,  267, ymm7,   16, 16) \\\r\nX(YMM0I0, 268, ymm0,   0,  8)  \\\r\nX(YMM0I1, 269, ymm0,   8,  8)  \\\r\nX(YMM0I2, 270, ymm0,   16, 8)  \\\r\nX(YMM0I3, 271, ymm0,   24, 8)  \\\r\nX(YMM1I0, 272, ymm1,   0,  8)  \\\r\nX(YMM1I1, 273, ymm1,   8,  8)  \\\r\nX(YMM1I2, 274, ymm1,   16, 8)  \\\r\nX(YMM1I3, 275, ymm1,   24, 8)  \\\r\nX(YMM2I0, 276, ymm2,   0,  8)  \\\r\nX(YMM2I1, 277, ymm2,   8,  8)  \\\r\nX(YMM2I2, 278, ymm2,   16, 8)  \\\r\nX(YMM2I3, 279, ymm2,   24, 8)  \\\r\nX(YMM3I0, 280, ymm3,   0,  8)  \\\r\nX(YMM3I1, 281, ymm3,   8,  8)  \\\r\nX(YMM3I2, 282, ymm3,   16, 8)  \\\r\nX(YMM3I3, 283, ymm3,   24, 8)  \\\r\nX(YMM4I0, 284, ymm4,   0,  8)  \\\r\nX(YMM4I1, 285, ymm4,   8,  8)  \\\r\nX(YMM4I2, 286, ymm4,   16, 8)  \\\r\nX(YMM4I3, 287, ymm4,   24, 8)  \\\r\nX(YMM5I0, 288, ymm5,   0,  8)  \\\r\nX(YMM5I1, 289, ymm5,   8,  8)  \\\r\nX(YMM5I2, 290, ymm5,   16, 8)  \\\r\nX(YMM5I3, 291, ymm5,   24, 8)  \\\r\nX(YMM6I0, 292, ymm6,   0,  8)  \\\r\nX(YMM6I1, 293, ymm6,   8,  8)  \\\r\nX(YMM6I2, 294, ymm6,   16, 8)  \\\r\nX(YMM6I3, 295, ymm6,   24, 8)  \\\r\nX(YMM7I0, 296, ymm7,   0,  8)  \\\r\nX(YMM7I1, 297, ymm7,   8,  8)  \\\r\nX(YMM7I2, 298, ymm7,   16, 8)  \\\r\nX(YMM7I3, 299, ymm7,   24, 8)  \\\r\nX(YMM0F0, 300, ymm0,   0,  4)  \\\r\nX(YMM0F1, 301, ymm0,   4,  4)  \\\r\nX(YMM0F2, 302, ymm0,   8,  4)  \\\r\nX(YMM0F3, 303, ymm0,   12, 4)  \\\r\nX(YMM0F4, 304, ymm0,   16, 4)  \\\r\nX(YMM0F5, 305, ymm0,   20, 4)  \\\r\nX(YMM0F6, 306, ymm0,   24, 4)  \\\r\nX(YMM0F7, 307, ymm0,   28, 4)  \\\r\nX(YMM1F0, 308, ymm1,   0,  4)  \\\r\nX(YMM1F1, 309, ymm1,   4,  4)  \\\r\nX(YMM1F2, 310, ymm1,   8,  4)  \\\r\nX(YMM1F3, 311, ymm1,   12, 4)  \\\r\nX(YMM1F4, 312, ymm1,   16, 4)  \\\r\nX(YMM1F5, 313, ymm1,   20, 4)  \\\r\nX(YMM1F6, 314, ymm1,   24, 4)  \\\r\nX(YMM1F7, 315, ymm1,   28, 4)  \\\r\nX(YMM2F0, 316, ymm2,   0,  4)  \\\r\nX(YMM2F1, 317, ymm2,   4,  4)  \\\r\nX(YMM2F2, 318, ymm2,   8,  4)  \\\r\nX(YMM2F3, 319, ymm2,   12, 4)  \\\r\nX(YMM2F4, 320, ymm2,   16, 4)  \\\r\nX(YMM2F5, 321, ymm2,   20, 4)  \\\r\nX(YMM2F6, 322, ymm2,   24, 4)  \\\r\nX(YMM2F7, 323, ymm2,   28, 4)  \\\r\nX(YMM3F0, 324, ymm3,   0,  4)  \\\r\nX(YMM3F1, 325, ymm3,   4,  4)  \\\r\nX(YMM3F2, 326, ymm3,   8,  4)  \\\r\nX(YMM3F3, 327, ymm3,   12, 4)  \\\r\nX(YMM3F4, 328, ymm3,   16, 4)  \\\r\nX(YMM3F5, 329, ymm3,   20, 4)  \\\r\nX(YMM3F6, 330, ymm3,   24, 4)  \\\r\nX(YMM3F7, 331, ymm3,   28, 4)  \\\r\nX(YMM4F0, 332, ymm4,   0,  4)  \\\r\nX(YMM4F1, 333, ymm4,   4,  4)  \\\r\nX(YMM4F2, 334, ymm4,   8,  4)  \\\r\nX(YMM4F3, 335, ymm4,   12, 4)  \\\r\nX(YMM4F4, 336, ymm4,   16, 4)  \\\r\nX(YMM4F5, 337, ymm4,   20, 4)  \\\r\nX(YMM4F6, 338, ymm4,   24, 4)  \\\r\nX(YMM4F7, 339, ymm4,   28, 4)  \\\r\nX(YMM5F0, 340, ymm5,   0,  4)  \\\r\nX(YMM5F1, 341, ymm5,   4,  4)  \\\r\nX(YMM5F2, 342, ymm5,   8,  4)  \\\r\nX(YMM5F3, 343, ymm5,   12, 4)  \\\r\nX(YMM5F4, 344, ymm5,   16, 4)  \\\r\nX(YMM5F5, 345, ymm5,   20, 4)  \\\r\nX(YMM5F6, 346, ymm5,   24, 4)  \\\r\nX(YMM5F7, 347, ymm5,   28, 4)  \\\r\nX(YMM6F0, 348, ymm6,   0,  4)  \\\r\nX(YMM6F1, 349, ymm6,   4,  4)  \\\r\nX(YMM6F2, 350, ymm6,   8,  4)  \\\r\nX(YMM6F3, 351, ymm6,   12, 4)  \\\r\nX(YMM6F4, 352, ymm6,   16, 4)  \\\r\nX(YMM6F5, 353, ymm6,   20, 4)  \\\r\nX(YMM6F6, 354, ymm6,   24, 4)  \\\r\nX(YMM6F7, 355, ymm6,   28, 4)  \\\r\nX(YMM7F0, 356, ymm7,   0,  4)  \\\r\nX(YMM7F1, 357, ymm7,   4,  4)  \\\r\nX(YMM7F2, 358, ymm7,   8,  4)  \\\r\nX(YMM7F3, 359, ymm7,   12, 4)  \\\r\nX(YMM7F4, 360, ymm7,   16, 4)  \\\r\nX(YMM7F5, 361, ymm7,   20, 4)  \\\r\nX(YMM7F6, 362, ymm7,   24, 4)  \\\r\nX(YMM7F7, 363, ymm7,   28, 4)  \\\r\nX(YMM0D0, 364, ymm0,   0,  8)  \\\r\nX(YMM0D1, 365, ymm0,   8,  8)  \\\r\nX(YMM0D2, 366, ymm0,   16, 8)  \\\r\nX(YMM0D3, 367, ymm0,   24, 8)  \\\r\nX(YMM1D0, 368, ymm1,   0,  8)  \\\r\nX(YMM1D1, 369, ymm1,   8,  8)  \\\r\nX(YMM1D2, 370, ymm1,   16, 8)  \\\r\nX(YMM1D3, 371, ymm1,   24, 8)  \\\r\nX(YMM2D0, 372, ymm2,   0,  8)  \\\r\nX(YMM2D1, 373, ymm2,   8,  8)  \\\r\nX(YMM2D2, 374, ymm2,   16, 8)  \\\r\nX(YMM2D3, 375, ymm2,   24, 8)  \\\r\nX(YMM3D0, 376, ymm3,   0,  8)  \\\r\nX(YMM3D1, 377, ymm3,   8,  8)  \\\r\nX(YMM3D2, 378, ymm3,   16, 8)  \\\r\nX(YMM3D3, 379, ymm3,   24, 8)  \\\r\nX(YMM4D0, 380, ymm4,   0,  8)  \\\r\nX(YMM4D1, 381, ymm4,   8,  8)  \\\r\nX(YMM4D2, 382, ymm4,   16, 8)  \\\r\nX(YMM4D3, 383, ymm4,   24, 8)  \\\r\nX(YMM5D0, 384, ymm5,   0,  8)  \\\r\nX(YMM5D1, 385, ymm5,   8,  8)  \\\r\nX(YMM5D2, 386, ymm5,   16, 8)  \\\r\nX(YMM5D3, 387, ymm5,   24, 8)  \\\r\nX(YMM6D0, 388, ymm6,   0,  8)  \\\r\nX(YMM6D1, 389, ymm6,   8,  8)  \\\r\nX(YMM6D2, 390, ymm6,   16, 8)  \\\r\nX(YMM6D3, 391, ymm6,   24, 8)  \\\r\nX(YMM7D0, 392, ymm7,   0,  8)  \\\r\nX(YMM7D1, 393, ymm7,   8,  8)  \\\r\nX(YMM7D2, 394, ymm7,   16, 8)  \\\r\nX(YMM7D3, 395, ymm7,   24, 8)\r\n\r\ntypedef U16 CV_Regx86;\r\ntypedef enum CV_Regx86Enum\r\n{\r\n#define X(CVN,C,RDN,BP,BZ) CV_Regx86_##CVN = C,\r\n  CV_Reg_X86_XList(X)\r\n#undef X\r\n}\r\nCV_Regx86Enum;\r\n\r\n// X(NAME, CODE, (RDI_RegisterCode_X64) NAME, BYTE_POS, BYTE_SIZE)\r\n#define CV_Reg_X64_XList(X)       \\\r\nX(NONE,      0, nil,    0,  0)  \\\r\nX(AL,        1, rax,    0,  1)  \\\r\nX(CL,        2, rcx,    0,  1)  \\\r\nX(DL,        3, rdx,    0,  1)  \\\r\nX(BL,        4, rbx,    0,  1)  \\\r\nX(AH,        5, rax,    1,  1)  \\\r\nX(CH,        6, rcx,    1,  1)  \\\r\nX(DH,        7, rdx,    1,  1)  \\\r\nX(BH,        8, rbx,    1,  1)  \\\r\nX(AX,        9, rax,    0,  2)  \\\r\nX(CX,       10, rcx,    0,  2)  \\\r\nX(DX,       11, rdx,    0,  2)  \\\r\nX(BX,       12, rbx,    0,  2)  \\\r\nX(SP,       13, rsp,    0,  2)  \\\r\nX(BP,       14, rbp,    0,  2)  \\\r\nX(SI,       15, rsi,    0,  2)  \\\r\nX(DI,       16, rdi,    0,  2)  \\\r\nX(EAX,      17, rax,    0,  4)  \\\r\nX(ECX,      18, rcx,    0,  4)  \\\r\nX(EDX,      19, rdx,    0,  4)  \\\r\nX(EBX,      20, rbx,    0,  4)  \\\r\nX(ESP,      21, rsp,    0,  4)  \\\r\nX(EBP,      22, rbp,    0,  4)  \\\r\nX(ESI,      23, rsi,    0,  4)  \\\r\nX(EDI,      24, rdi,    0,  4)  \\\r\nX(ES,       25, es,     0,  2)  \\\r\nX(CS,       26, cs,     0,  2)  \\\r\nX(SS,       27, ss,     0,  2)  \\\r\nX(DS,       28, ds,     0,  2)  \\\r\nX(FS,       29, fs,     0,  2)  \\\r\nX(GS,       30, gs,     0,  2)  \\\r\nX(FLAGS,    32, rflags, 0,  2)  \\\r\nX(RIP,      33, rip,    0,  8)  \\\r\nX(EFLAGS,   34, rflags, 0,  4)  \\\r\n/* TODO: possibly missing control registers in x64 definitions? */ \\\r\nX(CR0,      80, nil,    0,  0)  \\\r\nX(CR1,      81, nil,    0,  0)  \\\r\nX(CR2,      82, nil,    0,  0)  \\\r\nX(CR3,      83, nil,    0,  0)  \\\r\nX(CR4,      84, nil,    0,  0)  \\\r\nX(CR8,      88, nil,    0,  0)  \\\r\nX(DR0,      90, dr0,    0,  4)  \\\r\nX(DR1,      91, dr1,    0,  4)  \\\r\nX(DR2,      92, dr2,    0,  4)  \\\r\nX(DR3,      93, dr3,    0,  4)  \\\r\nX(DR4,      94, dr4,    0,  4)  \\\r\nX(DR5,      95, dr5,    0,  4)  \\\r\nX(DR6,      96, dr6,    0,  4)  \\\r\nX(DR7,      97, dr7,    0,  4)  \\\r\n/* TODO: possibly missing debug registers 8-15 in x64 definitions? */ \\\r\nX(DR8,      98, nil,    0,  0)  \\\r\nX(DR9,      99, nil,    0,  0)  \\\r\nX(DR10,    100, nil,    0,  0)  \\\r\nX(DR11,    101, nil,    0,  0)  \\\r\nX(DR12,    102, nil,    0,  0)  \\\r\nX(DR13,    103, nil,    0,  0)  \\\r\nX(DR14,    104, nil,    0,  0)  \\\r\nX(DR15,    105, nil,    0,  0)  \\\r\n/* TODO: possibly missing ~whatever these are~ in x64 definitions? */ \\\r\nX(GDTR,    110, nil,    0,  0)  \\\r\nX(GDTL,    111, nil,    0,  0)  \\\r\nX(IDTR,    112, nil,    0,  0)  \\\r\nX(IDTL,    113, nil,    0,  0)  \\\r\nX(LDTR,    114, nil,    0,  0)  \\\r\nX(TR,      115, nil,    0,  0)  \\\r\nX(ST0,     128, st0,    0,  10) \\\r\nX(ST1,     129, st1,    0,  10) \\\r\nX(ST2,     130, st2,    0,  10) \\\r\nX(ST3,     131, st3,    0,  10) \\\r\nX(ST4,     132, st4,    0,  10) \\\r\nX(ST5,     133, st5,    0,  10) \\\r\nX(ST6,     134, st6,    0,  10) \\\r\nX(ST7,     135, st7,    0,  10) \\\r\n/* TODO: possibly missing these, or not sure how they map to our x64 definitions? */ \\\r\nX(CTRL,    136, nil,    0,  0)  \\\r\nX(STAT,    137, nil,    0,  0)  \\\r\nX(TAG,     138, nil,    0,  0)  \\\r\nX(FPIP,    139, nil,    0,  0)  \\\r\nX(FPCS,    140, nil,    0,  0)  \\\r\nX(FPDO,    141, nil,    0,  0)  \\\r\nX(FPDS,    142, nil,    0,  0)  \\\r\nX(ISEM,    143, nil,    0,  0)  \\\r\nX(FPEIP,   144, nil,    0,  0)  \\\r\nX(FPEDO,   145, nil,    0,  0)  \\\r\nX(MM0,     146, fpr0,   0,  8)  \\\r\nX(MM1,     147, fpr1,   0,  8)  \\\r\nX(MM2,     148, fpr2,   0,  8)  \\\r\nX(MM3,     149, fpr3,   0,  8)  \\\r\nX(MM4,     150, fpr4,   0,  8)  \\\r\nX(MM5,     151, fpr5,   0,  8)  \\\r\nX(MM6,     152, fpr6,   0,  8)  \\\r\nX(MM7,     153, fpr7,   0,  8)  \\\r\nX(XMM0,    154, zmm0,   0,  16) \\\r\nX(XMM1,    155, zmm1,   0,  16) \\\r\nX(XMM2,    156, zmm2,   0,  16) \\\r\nX(XMM3,    157, zmm3,   0,  16) \\\r\nX(XMM4,    158, zmm4,   0,  16) \\\r\nX(XMM5,    159, zmm5,   0,  16) \\\r\nX(XMM6,    160, zmm6,   0,  16) \\\r\nX(XMM7,    161, zmm7,   0,  16) \\\r\nX(XMM0_0,  162, zmm0,   0,  4)  \\\r\nX(XMM0_1,  163, zmm0,   4,  4)  \\\r\nX(XMM0_2,  164, zmm0,   8,  4)  \\\r\nX(XMM0_3,  165, zmm0,   12, 4)  \\\r\nX(XMM1_0,  166, zmm1,   0,  4)  \\\r\nX(XMM1_1,  167, zmm1,   4,  4)  \\\r\nX(XMM1_2,  168, zmm1,   8,  4)  \\\r\nX(XMM1_3,  169, zmm1,   12, 4)  \\\r\nX(XMM2_0,  170, zmm2,   0,  4)  \\\r\nX(XMM2_1,  171, zmm2,   4,  4)  \\\r\nX(XMM2_2,  172, zmm2,   8,  4)  \\\r\nX(XMM2_3,  173, zmm2,   12, 4)  \\\r\nX(XMM3_0,  174, zmm3,   0,  4)  \\\r\nX(XMM3_1,  175, zmm3,   4,  4)  \\\r\nX(XMM3_2,  176, zmm3,   8,  4)  \\\r\nX(XMM3_3,  177, zmm3,   12, 4)  \\\r\nX(XMM4_0,  178, zmm4,   0,  4)  \\\r\nX(XMM4_1,  179, zmm4,   4,  4)  \\\r\nX(XMM4_2,  180, zmm4,   8,  4)  \\\r\nX(XMM4_3,  181, zmm4,   12, 4)  \\\r\nX(XMM5_0,  182, zmm5,   0,  4)  \\\r\nX(XMM5_1,  183, zmm5,   4,  4)  \\\r\nX(XMM5_2,  184, zmm5,   8,  4)  \\\r\nX(XMM5_3,  185, zmm5,   12, 4)  \\\r\nX(XMM6_0,  186, zmm6,   0,  4)  \\\r\nX(XMM6_1,  187, zmm6,   4,  4)  \\\r\nX(XMM6_2,  188, zmm6,   8,  4)  \\\r\nX(XMM6_3,  189, zmm6,   12, 4)  \\\r\nX(XMM7_0,  190, zmm7,   0,  4)  \\\r\nX(XMM7_1,  191, zmm7,   4,  4)  \\\r\nX(XMM7_2,  192, zmm7,   8,  4)  \\\r\nX(XMM7_3,  193, zmm7,   12, 4)  \\\r\nX(XMM0L,   194, zmm0,   0,  8)  \\\r\nX(XMM1L,   195, zmm1,   0,  8)  \\\r\nX(XMM2L,   196, zmm2,   0,  8)  \\\r\nX(XMM3L,   197, zmm3,   0,  8)  \\\r\nX(XMM4L,   198, zmm4,   0,  8)  \\\r\nX(XMM5L,   199, zmm5,   0,  8)  \\\r\nX(XMM6L,   200, zmm6,   0,  8)  \\\r\nX(XMM7L,   201, zmm7,   0,  8)  \\\r\nX(XMM0H,   202, zmm0,   8,  8)  \\\r\nX(XMM1H,   203, zmm1,   8,  8)  \\\r\nX(XMM2H,   204, zmm2,   8,  8)  \\\r\nX(XMM3H,   205, zmm3,   8,  8)  \\\r\nX(XMM4H,   206, zmm4,   8,  8)  \\\r\nX(XMM5H,   207, zmm5,   8,  8)  \\\r\nX(XMM6H,   208, zmm6,   8,  8)  \\\r\nX(XMM7H,   209, zmm7,   8,  8)  \\\r\nX(MXCSR,   211, mxcsr,  0,  4)  \\\r\nX(EMM0L,   220, zmm0,   0,  8)  \\\r\nX(EMM1L,   221, zmm1,   0,  8)  \\\r\nX(EMM2L,   222, zmm2,   0,  8)  \\\r\nX(EMM3L,   223, zmm3,   0,  8)  \\\r\nX(EMM4L,   224, zmm4,   0,  8)  \\\r\nX(EMM5L,   225, zmm5,   0,  8)  \\\r\nX(EMM6L,   226, zmm6,   0,  8)  \\\r\nX(EMM7L,   227, zmm7,   0,  8)  \\\r\nX(EMM0H,   228, zmm0,   8,  8)  \\\r\nX(EMM1H,   229, zmm1,   8,  8)  \\\r\nX(EMM2H,   230, zmm2,   8,  8)  \\\r\nX(EMM3H,   231, zmm3,   8,  8)  \\\r\nX(EMM4H,   232, zmm4,   8,  8)  \\\r\nX(EMM5H,   233, zmm5,   8,  8)  \\\r\nX(EMM6H,   234, zmm6,   8,  8)  \\\r\nX(EMM7H,   235, zmm7,   8,  8)  \\\r\nX(MM00,    236, fpr0,   0,  4)  \\\r\nX(MM01,    237, fpr0,   4,  4)  \\\r\nX(MM10,    238, fpr1,   0,  4)  \\\r\nX(MM11,    239, fpr1,   4,  4)  \\\r\nX(MM20,    240, fpr2,   0,  4)  \\\r\nX(MM21,    241, fpr2,   4,  4)  \\\r\nX(MM30,    242, fpr3,   0,  4)  \\\r\nX(MM31,    243, fpr3,   4,  4)  \\\r\nX(MM40,    244, fpr4,   0,  4)  \\\r\nX(MM41,    245, fpr4,   4,  4)  \\\r\nX(MM50,    246, fpr5,   0,  4)  \\\r\nX(MM51,    247, fpr5,   4,  4)  \\\r\nX(MM60,    248, fpr6,   0,  4)  \\\r\nX(MM61,    249, fpr6,   4,  4)  \\\r\nX(MM70,    250, fpr7,   0,  4)  \\\r\nX(MM71,    251, fpr7,   4,  4)  \\\r\nX(XMM8,    252, zmm8,   0,  16) \\\r\nX(XMM9,    253, zmm9,   0,  16) \\\r\nX(XMM10,   254, zmm10,  0,  16) \\\r\nX(XMM11,   255, zmm11,  0,  16) \\\r\nX(XMM12,   256, zmm12,  0,  16) \\\r\nX(XMM13,   257, zmm13,  0,  16) \\\r\nX(XMM14,   258, zmm14,  0,  16) \\\r\nX(XMM15,   259, zmm15,  0,  16) \\\r\nX(XMM8_0,  260, zmm8,   0,  16) \\\r\nX(XMM8_1,  261, zmm8,   4,  16) \\\r\nX(XMM8_2,  262, zmm8,   8,  16) \\\r\nX(XMM8_3,  263, zmm8,   12, 16) \\\r\nX(XMM9_0,  264, zmm9,   0,  4)  \\\r\nX(XMM9_1,  265, zmm9,   4,  4)  \\\r\nX(XMM9_2,  266, zmm9,   8,  4)  \\\r\nX(XMM9_3,  267, zmm9,   12, 4)  \\\r\nX(XMM10_0, 268, zmm10,  0,  4)  \\\r\nX(XMM10_1, 269, zmm10,  4,  4)  \\\r\nX(XMM10_2, 270, zmm10,  8,  4)  \\\r\nX(XMM10_3, 271, zmm10,  12, 4)  \\\r\nX(XMM11_0, 272, zmm11,  0,  4)  \\\r\nX(XMM11_1, 273, zmm11,  4,  4)  \\\r\nX(XMM11_2, 274, zmm11,  8,  4)  \\\r\nX(XMM11_3, 275, zmm11,  12, 4)  \\\r\nX(XMM12_0, 276, zmm12,  0,  4)  \\\r\nX(XMM12_1, 277, zmm12,  4,  4)  \\\r\nX(XMM12_2, 278, zmm12,  8,  4)  \\\r\nX(XMM12_3, 279, zmm12,  12, 4)  \\\r\nX(XMM13_0, 280, zmm13,  0,  4)  \\\r\nX(XMM13_1, 281, zmm13,  4,  4)  \\\r\nX(XMM13_2, 282, zmm13,  8,  4)  \\\r\nX(XMM13_3, 283, zmm13,  12, 4)  \\\r\nX(XMM14_0, 284, zmm14,  0,  4)  \\\r\nX(XMM14_1, 285, zmm14,  4,  4)  \\\r\nX(XMM14_2, 286, zmm14,  8,  4)  \\\r\nX(XMM14_3, 287, zmm14,  12, 4)  \\\r\nX(XMM15_0, 288, zmm15,  0,  4)  \\\r\nX(XMM15_1, 289, zmm15,  4,  4)  \\\r\nX(XMM15_2, 290, zmm15,  8,  4)  \\\r\nX(XMM15_3, 291, zmm15,  12, 4)  \\\r\nX(XMM8L,   292, zmm8,   0,  8)  \\\r\nX(XMM9L,   293, zmm9,   0,  8)  \\\r\nX(XMM10L,  294, zmm10,  0,  8)  \\\r\nX(XMM11L,  295, zmm11,  0,  8)  \\\r\nX(XMM12L,  296, zmm12,  0,  8)  \\\r\nX(XMM13L,  297, zmm13,  0,  8)  \\\r\nX(XMM14L,  298, zmm14,  0,  8)  \\\r\nX(XMM15L,  299, zmm15,  0,  8)  \\\r\nX(XMM8H,   300, zmm8,   8,  8)  \\\r\nX(XMM9H,   301, zmm9,   8,  8)  \\\r\nX(XMM10H,  302, zmm10,  8,  8)  \\\r\nX(XMM11H,  303, zmm11,  8,  8)  \\\r\nX(XMM12H,  304, zmm12,  8,  8)  \\\r\nX(XMM13H,  305, zmm13,  8,  8)  \\\r\nX(XMM14H,  306, zmm14,  8,  8)  \\\r\nX(XMM15H,  307, zmm15,  8,  8)  \\\r\nX(EMM8L,   308, zmm8,   0,  8)  \\\r\nX(EMM9L,   309, zmm9,   0,  8)  \\\r\nX(EMM10L,  310, zmm10,  0,  8)  \\\r\nX(EMM11L,  311, zmm11,  0,  8)  \\\r\nX(EMM12L,  312, zmm12,  0,  8)  \\\r\nX(EMM13L,  313, zmm13,  0,  8)  \\\r\nX(EMM14L,  314, zmm14,  0,  8)  \\\r\nX(EMM15L,  315, zmm15,  0,  8)  \\\r\nX(EMM8H,   316, zmm8,   8,  8)  \\\r\nX(EMM9H,   317, zmm9,   8,  8)  \\\r\nX(EMM10H,  318, zmm10,  8,  8)  \\\r\nX(EMM11H,  319, zmm11,  8,  8)  \\\r\nX(EMM12H,  320, zmm12,  8,  8)  \\\r\nX(EMM13H,  321, zmm13,  8,  8)  \\\r\nX(EMM14H,  322, zmm14,  8,  8)  \\\r\nX(EMM15H,  323, zmm15,  8,  8)  \\\r\nX(SIL,     324, rsi,    0,  1)  \\\r\nX(DIL,     325, rdi,    0,  1)  \\\r\nX(BPL,     326, rbp,    0,  1)  \\\r\nX(SPL,     327, rsp,    0,  1)  \\\r\nX(RAX,     328, rax,    0,  8)  \\\r\nX(RBX,     329, rbx,    0,  8)  \\\r\nX(RCX,     330, rcx,    0,  8)  \\\r\nX(RDX,     331, rdx,    0,  8)  \\\r\nX(RSI,     332, rsi,    0,  8)  \\\r\nX(RDI,     333, rdi,    0,  8)  \\\r\nX(RBP,     334, rbp,    0,  8)  \\\r\nX(RSP,     335, rsp,    0,  8)  \\\r\nX(R8,      336, r8,     0,  8)  \\\r\nX(R9,      337, r9,     0,  8)  \\\r\nX(R10,     338, r10,    0,  8)  \\\r\nX(R11,     339, r11,    0,  8)  \\\r\nX(R12,     340, r12,    0,  8)  \\\r\nX(R13,     341, r13,    0,  8)  \\\r\nX(R14,     342, r14,    0,  8)  \\\r\nX(R15,     343, r15,    0,  8)  \\\r\nX(R8B,     344, r8,     0,  1)  \\\r\nX(R9B,     345, r9,     0,  1)  \\\r\nX(R10B,    346, r10,    0,  1)  \\\r\nX(R11B,    347, r11,    0,  1)  \\\r\nX(R12B,    348, r12,    0,  1)  \\\r\nX(R13B,    349, r13,    0,  1)  \\\r\nX(R14B,    350, r14,    0,  1)  \\\r\nX(R15B,    351, r15,    0,  1)  \\\r\nX(R8W,     352, r8,     0,  2)  \\\r\nX(R9W,     353, r9,     0,  2)  \\\r\nX(R10W,    354, r10,    0,  2)  \\\r\nX(R11W,    355, r11,    0,  2)  \\\r\nX(R12W,    356, r12,    0,  2)  \\\r\nX(R13W,    357, r13,    0,  2)  \\\r\nX(R14W,    358, r14,    0,  2)  \\\r\nX(R15W,    359, r15,    0,  2)  \\\r\nX(R8D,     360, r8,     0,  4)  \\\r\nX(R9D,     361, r9,     0,  4)  \\\r\nX(R10D,    362, r10,    0,  4)  \\\r\nX(R11D,    363, r11,    0,  4)  \\\r\nX(R12D,    364, r12,    0,  4)  \\\r\nX(R13D,    365, r13,    0,  4)  \\\r\nX(R14D,    366, r14,    0,  4)  \\\r\nX(R15D,    367, r15,    0,  4)  \\\r\nX(YMM0,    368, zmm0,   0,  32) \\\r\nX(YMM1,    369, zmm1,   0,  32) \\\r\nX(YMM2,    370, zmm2,   0,  32) \\\r\nX(YMM3,    371, zmm3,   0,  32) \\\r\nX(YMM4,    372, zmm4,   0,  32) \\\r\nX(YMM5,    373, zmm5,   0,  32) \\\r\nX(YMM6,    374, zmm6,   0,  32) \\\r\nX(YMM7,    375, zmm7,   0,  32) \\\r\nX(YMM8,    376, zmm8,   0,  32) \\\r\nX(YMM9,    377, zmm9,   0,  32) \\\r\nX(YMM10,   378, zmm10,  0,  32) \\\r\nX(YMM11,   379, zmm11,  0,  32) \\\r\nX(YMM12,   380, zmm12,  0,  32) \\\r\nX(YMM13,   381, zmm13,  0,  32) \\\r\nX(YMM14,   382, zmm14,  0,  32) \\\r\nX(YMM15,   383, zmm15,  0,  32) \\\r\nX(YMM0H,   384, zmm0,   16, 32) \\\r\nX(YMM1H,   385, zmm1,   16, 32) \\\r\nX(YMM2H,   386, zmm2,   16, 32) \\\r\nX(YMM3H,   387, zmm3,   16, 32) \\\r\nX(YMM4H,   388, zmm4,   16, 32) \\\r\nX(YMM5H,   389, zmm5,   16, 32) \\\r\nX(YMM6H,   390, zmm6,   16, 32) \\\r\nX(YMM7H,   391, zmm7,   16, 32) \\\r\nX(YMM8H,   392, zmm8,   16, 32) \\\r\nX(YMM9H,   393, zmm9,   16, 32) \\\r\nX(YMM10H,  394, zmm10,  16, 32) \\\r\nX(YMM11H,  395, zmm11,  16, 32) \\\r\nX(YMM12H,  396, zmm12,  16, 32) \\\r\nX(YMM13H,  397, zmm13,  16, 32) \\\r\nX(YMM14H,  398, zmm14,  16, 32) \\\r\nX(YMM15H,  399, zmm15,  16, 32) \\\r\nX(XMM0IL,  400, zmm0,   0,  8)  \\\r\nX(XMM1IL,  401, zmm1,   0,  8)  \\\r\nX(XMM2IL,  402, zmm2,   0,  8)  \\\r\nX(XMM3IL,  403, zmm3,   0,  8)  \\\r\nX(XMM4IL,  404, zmm4,   0,  8)  \\\r\nX(XMM5IL,  405, zmm5,   0,  8)  \\\r\nX(XMM6IL,  406, zmm6,   0,  8)  \\\r\nX(XMM7IL,  407, zmm7,   0,  8)  \\\r\nX(XMM8IL,  408, zmm8,   0,  8)  \\\r\nX(XMM9IL,  409, zmm9,   0,  8)  \\\r\nX(XMM10IL, 410, zmm10,  0,  8)  \\\r\nX(XMM11IL, 411, zmm11,  0,  8)  \\\r\nX(XMM12IL, 412, zmm12,  0,  8)  \\\r\nX(XMM13IL, 413, zmm13,  0,  8)  \\\r\nX(XMM14IL, 414, zmm14,  0,  8)  \\\r\nX(XMM15IL, 415, zmm15,  0,  8)  \\\r\nX(XMM0IH,  416, zmm0,   8,  8)  \\\r\nX(XMM1IH,  417, zmm1,   8,  8)  \\\r\nX(XMM2IH,  418, zmm2,   8,  8)  \\\r\nX(XMM3IH,  419, zmm3,   8,  8)  \\\r\nX(XMM4IH,  420, zmm4,   8,  8)  \\\r\nX(XMM5IH,  421, zmm5,   8,  8)  \\\r\nX(XMM6IH,  422, zmm6,   8,  8)  \\\r\nX(XMM7IH,  423, zmm7,   8,  8)  \\\r\nX(XMM8IH,  424, zmm8,   8,  8)  \\\r\nX(XMM9IH,  425, zmm9,   8,  8)  \\\r\nX(XMM10IH, 426, zmm10,  8,  8)  \\\r\nX(XMM11IH, 427, zmm11,  8,  8)  \\\r\nX(XMM12IH, 428, zmm12,  8,  8)  \\\r\nX(XMM13IH, 429, zmm13,  8,  8)  \\\r\nX(XMM14IH, 430, zmm14,  8,  8)  \\\r\nX(XMM15IH, 431, zmm15,  8,  8)  \\\r\nX(YMM0I0,  432, zmm0,   0,  8)  \\\r\nX(YMM0I1,  433, zmm0,   8,  8)  \\\r\nX(YMM0I2,  434, zmm0,   16, 8)  \\\r\nX(YMM0I3,  435, zmm0,   24, 8)  \\\r\nX(YMM1I0,  436, zmm1,   0,  8)  \\\r\nX(YMM1I1,  437, zmm1,   8,  8)  \\\r\nX(YMM1I2,  438, zmm1,   16, 8)  \\\r\nX(YMM1I3,  439, zmm1,   24, 8)  \\\r\nX(YMM2I0,  440, zmm2,   0,  8)  \\\r\nX(YMM2I1,  441, zmm2,   8,  8)  \\\r\nX(YMM2I2,  442, zmm2,   16, 8)  \\\r\nX(YMM2I3,  443, zmm2,   24, 8)  \\\r\nX(YMM3I0,  444, zmm3,   0,  8)  \\\r\nX(YMM3I1,  445, zmm3,   8,  8)  \\\r\nX(YMM3I2,  446, zmm3,   16, 8)  \\\r\nX(YMM3I3,  447, zmm3,   24, 8)  \\\r\nX(YMM4I0,  448, zmm4,   0,  8)  \\\r\nX(YMM4I1,  449, zmm4,   8,  8)  \\\r\nX(YMM4I2,  450, zmm4,   16, 8)  \\\r\nX(YMM4I3,  451, zmm4,   24, 8)  \\\r\nX(YMM5I0,  452, zmm5,   0,  8)  \\\r\nX(YMM5I1,  453, zmm5,   8,  8)  \\\r\nX(YMM5I2,  454, zmm5,   16, 8)  \\\r\nX(YMM5I3,  455, zmm5,   24, 8)  \\\r\nX(YMM6I0,  456, zmm6,   0,  8)  \\\r\nX(YMM6I1,  457, zmm6,   8,  8)  \\\r\nX(YMM6I2,  458, zmm6,   16, 8)  \\\r\nX(YMM6I3,  459, zmm6,   24, 8)  \\\r\nX(YMM7I0,  460, zmm7,   0,  8)  \\\r\nX(YMM7I1,  461, zmm7,   8,  8)  \\\r\nX(YMM7I2,  462, zmm7,   16, 8)  \\\r\nX(YMM7I3,  463, zmm7,   24, 8)  \\\r\nX(YMM8I0,  464, zmm8,   0,  8)  \\\r\nX(YMM8I1,  465, zmm8,   8,  8)  \\\r\nX(YMM8I2,  466, zmm8,   16, 8)  \\\r\nX(YMM8I3,  467, zmm8,   24, 8)  \\\r\nX(YMM9I0,  468, zmm9,   0,  8)  \\\r\nX(YMM9I1,  469, zmm9,   8,  8)  \\\r\nX(YMM9I2,  470, zmm9,   16, 8)  \\\r\nX(YMM9I3,  471, zmm9,   24, 8)  \\\r\nX(YMM10I0, 472, zmm10,  0,  8)  \\\r\nX(YMM10I1, 473, zmm10,  8,  8)  \\\r\nX(YMM10I2, 474, zmm10,  16, 8)  \\\r\nX(YMM10I3, 475, zmm10,  24, 8)  \\\r\nX(YMM11I0, 476, zmm11,  0,  8)  \\\r\nX(YMM11I1, 477, zmm11,  8,  8)  \\\r\nX(YMM11I2, 478, zmm11,  16, 8)  \\\r\nX(YMM11I3, 479, zmm11,  24, 8)  \\\r\nX(YMM12I0, 480, zmm12,  0,  8)  \\\r\nX(YMM12I1, 481, zmm12,  8,  8)  \\\r\nX(YMM12I2, 482, zmm12,  16, 8)  \\\r\nX(YMM12I3, 483, zmm12,  24, 8)  \\\r\nX(YMM13I0, 484, zmm13,  0,  8)  \\\r\nX(YMM13I1, 485, zmm13,  8,  8)  \\\r\nX(YMM13I2, 486, zmm13,  16, 8)  \\\r\nX(YMM13I3, 487, zmm13,  24, 8)  \\\r\nX(YMM14I0, 488, zmm14,  0,  8)  \\\r\nX(YMM14I1, 489, zmm14,  8,  8)  \\\r\nX(YMM14I2, 490, zmm14,  16, 8)  \\\r\nX(YMM14I3, 491, zmm14,  24, 8)  \\\r\nX(YMM15I0, 492, zmm15,  0,  8)  \\\r\nX(YMM15I1, 493, zmm15,  8,  8)  \\\r\nX(YMM15I2, 494, zmm15,  16, 8)  \\\r\nX(YMM15I3, 495, zmm15,  24, 8)  \\\r\nX(YMM0F0,  496, zmm0,   0,  4)  \\\r\nX(YMM0F1,  497, zmm0,   4,  4)  \\\r\nX(YMM0F2,  498, zmm0,   8,  4)  \\\r\nX(YMM0F3,  499, zmm0,   12, 4)  \\\r\nX(YMM0F4,  500, zmm0,   16, 4)  \\\r\nX(YMM0F5,  501, zmm0,   20, 4)  \\\r\nX(YMM0F6,  502, zmm0,   24, 4)  \\\r\nX(YMM0F7,  503, zmm0,   28, 4)  \\\r\nX(YMM1F0,  504, zmm1,   0,  4)  \\\r\nX(YMM1F1,  505, zmm1,   4,  4)  \\\r\nX(YMM1F2,  506, zmm1,   8,  4)  \\\r\nX(YMM1F3,  507, zmm1,   12, 4)  \\\r\nX(YMM1F4,  508, zmm1,   16, 4)  \\\r\nX(YMM1F5,  509, zmm1,   20, 4)  \\\r\nX(YMM1F6,  510, zmm1,   24, 4)  \\\r\nX(YMM1F7,  511, zmm1,   28, 4)  \\\r\nX(YMM2F0,  512, zmm2,   0,  4)  \\\r\nX(YMM2F1,  513, zmm2,   4,  4)  \\\r\nX(YMM2F2,  514, zmm2,   8,  4)  \\\r\nX(YMM2F3,  515, zmm2,   12, 4)  \\\r\nX(YMM2F4,  516, zmm2,   16, 4)  \\\r\nX(YMM2F5,  517, zmm2,   20, 4)  \\\r\nX(YMM2F6,  518, zmm2,   24, 4)  \\\r\nX(YMM2F7,  519, zmm2,   28, 4)  \\\r\nX(YMM3F0,  520, zmm3,   0,  4)  \\\r\nX(YMM3F1,  521, zmm3,   4,  4)  \\\r\nX(YMM3F2,  522, zmm3,   8,  4)  \\\r\nX(YMM3F3,  523, zmm3,   12, 4)  \\\r\nX(YMM3F4,  524, zmm3,   16, 4)  \\\r\nX(YMM3F5,  525, zmm3,   20, 4)  \\\r\nX(YMM3F6,  526, zmm3,   24, 4)  \\\r\nX(YMM3F7,  527, zmm3,   28, 4)  \\\r\nX(YMM4F0,  528, zmm4,   0,  4)  \\\r\nX(YMM4F1,  529, zmm4,   4,  4)  \\\r\nX(YMM4F2,  530, zmm4,   8,  4)  \\\r\nX(YMM4F3,  531, zmm4,   12, 4)  \\\r\nX(YMM4F4,  532, zmm4,   16, 4)  \\\r\nX(YMM4F5,  533, zmm4,   20, 4)  \\\r\nX(YMM4F6,  534, zmm4,   24, 4)  \\\r\nX(YMM4F7,  535, zmm4,   28, 4)  \\\r\nX(YMM5F0,  536, zmm5,   0,  4)  \\\r\nX(YMM5F1,  537, zmm5,   4,  4)  \\\r\nX(YMM5F2,  538, zmm5,   8,  4)  \\\r\nX(YMM5F3,  539, zmm5,   12, 4)  \\\r\nX(YMM5F4,  540, zmm5,   16, 4)  \\\r\nX(YMM5F5,  541, zmm5,   20, 4)  \\\r\nX(YMM5F6,  542, zmm5,   24, 4)  \\\r\nX(YMM5F7,  543, zmm5,   28, 4)  \\\r\nX(YMM6F0,  544, zmm6,   0,  4)  \\\r\nX(YMM6F1,  545, zmm6,   4,  4)  \\\r\nX(YMM6F2,  546, zmm6,   8,  4)  \\\r\nX(YMM6F3,  547, zmm6,   12, 4)  \\\r\nX(YMM6F4,  548, zmm6,   16, 4)  \\\r\nX(YMM6F5,  549, zmm6,   20, 4)  \\\r\nX(YMM6F6,  550, zmm6,   24, 4)  \\\r\nX(YMM6F7,  551, zmm6,   28, 4)  \\\r\nX(YMM7F0,  552, zmm7,   0,  4)  \\\r\nX(YMM7F1,  553, zmm7,   4,  4)  \\\r\nX(YMM7F2,  554, zmm7,   8,  4)  \\\r\nX(YMM7F3,  555, zmm7,   12, 4)  \\\r\nX(YMM7F4,  556, zmm7,   16, 4)  \\\r\nX(YMM7F5,  557, zmm7,   20, 4)  \\\r\nX(YMM7F6,  558, zmm7,   24, 4)  \\\r\nX(YMM7F7,  559, zmm7,   28, 4)  \\\r\nX(YMM8F0,  560, zmm8,   0,  4)  \\\r\nX(YMM8F1,  561, zmm8,   4,  4)  \\\r\nX(YMM8F2,  562, zmm8,   8,  4)  \\\r\nX(YMM8F3,  563, zmm8,   12, 4)  \\\r\nX(YMM8F4,  564, zmm8,   16, 4)  \\\r\nX(YMM8F5,  565, zmm8,   20, 4)  \\\r\nX(YMM8F6,  566, zmm8,   24, 4)  \\\r\nX(YMM8F7,  567, zmm8,   28, 4)  \\\r\nX(YMM9F0,  568, zmm9,   0,  4)  \\\r\nX(YMM9F1,  569, zmm9,   4,  4)  \\\r\nX(YMM9F2,  570, zmm9,   8,  4)  \\\r\nX(YMM9F3,  571, zmm9,   12, 4)  \\\r\nX(YMM9F4,  572, zmm9,   16, 4)  \\\r\nX(YMM9F5,  573, zmm9,   20, 4)  \\\r\nX(YMM9F6,  574, zmm9,   24, 4)  \\\r\nX(YMM9F7,  575, zmm9,   28, 4)  \\\r\nX(YMM10F0, 576, zmm10,  0,  4)  \\\r\nX(YMM10F1, 577, zmm10,  4,  4)  \\\r\nX(YMM10F2, 578, zmm10,  8,  4)  \\\r\nX(YMM10F3, 579, zmm10,  12, 4)  \\\r\nX(YMM10F4, 580, zmm10,  16, 4)  \\\r\nX(YMM10F5, 581, zmm10,  20, 4)  \\\r\nX(YMM10F6, 582, zmm10,  24, 4)  \\\r\nX(YMM10F7, 583, zmm10,  28, 4)  \\\r\nX(YMM11F0, 584, zmm11,  0,  4)  \\\r\nX(YMM11F1, 585, zmm11,  4,  4)  \\\r\nX(YMM11F2, 586, zmm11,  8,  4)  \\\r\nX(YMM11F3, 587, zmm11,  12, 4)  \\\r\nX(YMM11F4, 588, zmm11,  16, 4)  \\\r\nX(YMM11F5, 589, zmm11,  20, 4)  \\\r\nX(YMM11F6, 590, zmm11,  24, 4)  \\\r\nX(YMM11F7, 591, zmm11,  28, 4)  \\\r\nX(YMM12F0, 592, zmm12,  0,  4)  \\\r\nX(YMM12F1, 593, zmm12,  4,  4)  \\\r\nX(YMM12F2, 594, zmm12,  8,  4)  \\\r\nX(YMM12F3, 595, zmm12,  12, 4)  \\\r\nX(YMM12F4, 596, zmm12,  16, 4)  \\\r\nX(YMM12F5, 597, zmm12,  20, 4)  \\\r\nX(YMM12F6, 598, zmm12,  24, 4)  \\\r\nX(YMM12F7, 599, zmm12,  28, 4)  \\\r\nX(YMM13F0, 600, zmm13,  0,  4)  \\\r\nX(YMM13F1, 601, zmm13,  4,  4)  \\\r\nX(YMM13F2, 602, zmm13,  8,  4)  \\\r\nX(YMM13F3, 603, zmm13,  12, 4)  \\\r\nX(YMM13F4, 604, zmm13,  16, 4)  \\\r\nX(YMM13F5, 605, zmm13,  20, 4)  \\\r\nX(YMM13F6, 606, zmm13,  24, 4)  \\\r\nX(YMM13F7, 607, zmm13,  28, 4)  \\\r\nX(YMM14F0, 608, zmm14,  0,  4)  \\\r\nX(YMM14F1, 609, zmm14,  4,  4)  \\\r\nX(YMM14F2, 610, zmm14,  8,  4)  \\\r\nX(YMM14F3, 611, zmm14,  12, 4)  \\\r\nX(YMM14F4, 612, zmm14,  16, 4)  \\\r\nX(YMM14F5, 613, zmm14,  20, 4)  \\\r\nX(YMM14F6, 614, zmm14,  24, 4)  \\\r\nX(YMM14F7, 615, zmm14,  28, 4)  \\\r\nX(YMM15F0, 616, zmm15,  0,  4)  \\\r\nX(YMM15F1, 617, zmm15,  4,  4)  \\\r\nX(YMM15F2, 618, zmm15,  8,  4)  \\\r\nX(YMM15F3, 619, zmm15,  12, 4)  \\\r\nX(YMM15F4, 620, zmm15,  16, 4)  \\\r\nX(YMM15F5, 621, zmm15,  20, 4)  \\\r\nX(YMM15F6, 622, zmm15,  24, 4)  \\\r\nX(YMM15F7, 623, zmm15,  28, 4)  \\\r\nX(YMM0D0,  624, zmm0,   0,  8)  \\\r\nX(YMM0D1,  625, zmm0,   8,  8)  \\\r\nX(YMM0D2,  626, zmm0,   16, 8)  \\\r\nX(YMM0D3,  627, zmm0,   24, 8)  \\\r\nX(YMM1D0,  628, zmm1,   0,  8)  \\\r\nX(YMM1D1,  629, zmm1,   8,  8)  \\\r\nX(YMM1D2,  630, zmm1,   16, 8)  \\\r\nX(YMM1D3,  631, zmm1,   24, 8)  \\\r\nX(YMM2D0,  632, zmm2,   0,  8)  \\\r\nX(YMM2D1,  633, zmm2,   8,  8)  \\\r\nX(YMM2D2,  634, zmm2,   16, 8)  \\\r\nX(YMM2D3,  635, zmm2,   24, 8)  \\\r\nX(YMM3D0,  636, zmm3,   0,  8)  \\\r\nX(YMM3D1,  637, zmm3,   8,  8)  \\\r\nX(YMM3D2,  638, zmm3,   16, 8)  \\\r\nX(YMM3D3,  639, zmm3,   24, 8)  \\\r\nX(YMM4D0,  640, zmm4,   0,  8)  \\\r\nX(YMM4D1,  641, zmm4,   8,  8)  \\\r\nX(YMM4D2,  642, zmm4,   16, 8)  \\\r\nX(YMM4D3,  643, zmm4,   24, 8)  \\\r\nX(YMM5D0,  644, zmm5,   0,  8)  \\\r\nX(YMM5D1,  645, zmm5,   8,  8)  \\\r\nX(YMM5D2,  646, zmm5,   16, 8)  \\\r\nX(YMM5D3,  647, zmm5,   24, 8)  \\\r\nX(YMM6D0,  648, zmm6,   0,  8)  \\\r\nX(YMM6D1,  649, zmm6,   8,  8)  \\\r\nX(YMM6D2,  650, zmm6,   16, 8)  \\\r\nX(YMM6D3,  651, zmm6,   24, 8)  \\\r\nX(YMM7D0,  652, zmm7,   0,  8)  \\\r\nX(YMM7D1,  653, zmm7,   8,  8)  \\\r\nX(YMM7D2,  654, zmm7,   16, 8)  \\\r\nX(YMM7D3,  655, zmm7,   24, 8)  \\\r\nX(YMM8D0,  656, zmm8,   0,  8)  \\\r\nX(YMM8D1,  657, zmm8,   8,  8)  \\\r\nX(YMM8D2,  658, zmm8,   16, 8)  \\\r\nX(YMM8D3,  659, zmm8,   24, 8)  \\\r\nX(YMM9D0,  660, zmm9,   0,  8)  \\\r\nX(YMM9D1,  661, zmm9,   8,  8)  \\\r\nX(YMM9D2,  662, zmm9,   16, 8)  \\\r\nX(YMM9D3,  663, zmm9,   24, 8)  \\\r\nX(YMM10D0, 664, zmm10,  0,  8)  \\\r\nX(YMM10D1, 665, zmm10,  8,  8)  \\\r\nX(YMM10D2, 666, zmm10,  16, 8)  \\\r\nX(YMM10D3, 667, zmm10,  24, 8)  \\\r\nX(YMM11D0, 668, zmm11,  0,  8)  \\\r\nX(YMM11D1, 669, zmm11,  8,  8)  \\\r\nX(YMM11D2, 670, zmm11,  16, 8)  \\\r\nX(YMM11D3, 671, zmm11,  24, 8)  \\\r\nX(YMM12D0, 672, zmm12,  0,  8)  \\\r\nX(YMM12D1, 673, zmm12,  8,  8)  \\\r\nX(YMM12D2, 674, zmm12,  16, 8)  \\\r\nX(YMM12D3, 675, zmm12,  24, 8)  \\\r\nX(YMM13D0, 676, zmm13,  0,  8)  \\\r\nX(YMM13D1, 677, zmm13,  8,  8)  \\\r\nX(YMM13D2, 678, zmm13,  16, 8)  \\\r\nX(YMM13D3, 679, zmm13,  24, 8)  \\\r\nX(YMM14D0, 680, zmm14,  0,  8)  \\\r\nX(YMM14D1, 681, zmm14,  8,  8)  \\\r\nX(YMM14D2, 682, zmm14,  16, 8)  \\\r\nX(YMM14D3, 683, zmm14,  24, 8)  \\\r\nX(YMM15D0, 684, zmm15,  0,  8)  \\\r\nX(YMM15D1, 685, zmm15,  8,  8)  \\\r\nX(YMM15D2, 686, zmm15,  16, 8)  \\\r\nX(YMM15D3, 687, zmm15,  24, 8)  \\\r\nX(XMM16,   694, zmm16,  0,  16) \\\r\nX(XMM17,   695, zmm17,  0,  16) \\\r\nX(XMM18,   696, zmm18,  0,  16) \\\r\nX(XMM19,   697, zmm19,  0,  16) \\\r\nX(XMM20,   698, zmm20,  0,  16) \\\r\nX(XMM21,   699, zmm21,  0,  16) \\\r\nX(XMM22,   700, zmm22,  0,  16) \\\r\nX(XMM23,   701, zmm23,  0,  16) \\\r\nX(XMM24,   702, zmm24,  0,  16) \\\r\nX(XMM25,   703, zmm25,  0,  16) \\\r\nX(XMM26,   704, zmm26,  0,  16) \\\r\nX(XMM27,   705, zmm27,  0,  16) \\\r\nX(XMM28,   706, zmm28,  0,  16) \\\r\nX(XMM29,   707, zmm29,  0,  16) \\\r\nX(XMM30,   708, zmm30,  0,  16) \\\r\nX(XMM31,   709, zmm31,  0,  16) \\\r\nX(YMM16,   710, zmm16,  0,  32) \\\r\nX(YMM17,   711, zmm17,  0,  32) \\\r\nX(YMM18,   712, zmm18,  0,  32) \\\r\nX(YMM19,   713, zmm19,  0,  32) \\\r\nX(YMM20,   714, zmm20,  0,  32) \\\r\nX(YMM21,   715, zmm21,  0,  32) \\\r\nX(YMM22,   716, zmm22,  0,  32) \\\r\nX(YMM23,   717, zmm23,  0,  32) \\\r\nX(YMM24,   718, zmm24,  0,  32) \\\r\nX(YMM25,   719, zmm25,  0,  32) \\\r\nX(YMM26,   720, zmm26,  0,  32) \\\r\nX(YMM27,   721, zmm27,  0,  32) \\\r\nX(YMM28,   722, zmm28,  0,  32) \\\r\nX(YMM29,   723, zmm29,  0,  32) \\\r\nX(YMM30,   724, zmm30,  0,  32) \\\r\nX(YMM31,   725, zmm31,  0,  32) \\\r\nX(ZMM0,    726, zmm0,   0,  64) \\\r\nX(ZMM1,    727, zmm1,   0,  64) \\\r\nX(ZMM2,    728, zmm2,   0,  64) \\\r\nX(ZMM3,    729, zmm3,   0,  64) \\\r\nX(ZMM4,    730, zmm4,   0,  64) \\\r\nX(ZMM5,    731, zmm5,   0,  64) \\\r\nX(ZMM6,    732, zmm6,   0,  64) \\\r\nX(ZMM7,    733, zmm7,   0,  64) \\\r\nX(ZMM8,    734, zmm8,   0,  64) \\\r\nX(ZMM9,    735, zmm9,   0,  64) \\\r\nX(ZMM10,   736, zmm10,  0,  64) \\\r\nX(ZMM11,   737, zmm11,  0,  64) \\\r\nX(ZMM12,   738, zmm12,  0,  64) \\\r\nX(ZMM13,   739, zmm13,  0,  64) \\\r\nX(ZMM14,   740, zmm14,  0,  64) \\\r\nX(ZMM15,   741, zmm15,  0,  64) \\\r\nX(ZMM16,   742, zmm16,  0,  64) \\\r\nX(ZMM17,   743, zmm17,  0,  64) \\\r\nX(ZMM18,   744, zmm18,  0,  64) \\\r\nX(ZMM19,   745, zmm19,  0,  64) \\\r\nX(ZMM20,   746, zmm20,  0,  64) \\\r\nX(ZMM21,   747, zmm21,  0,  64) \\\r\nX(ZMM22,   748, zmm22,  0,  64) \\\r\nX(ZMM23,   749, zmm23,  0,  64) \\\r\nX(ZMM24,   750, zmm24,  0,  64) \\\r\nX(ZMM25,   751, zmm25,  0,  64) \\\r\nX(ZMM26,   752, zmm26,  0,  64) \\\r\nX(ZMM27,   753, zmm27,  0,  64) \\\r\nX(ZMM28,   754, zmm28,  0,  64) \\\r\nX(ZMM29,   755, zmm29,  0,  64) \\\r\nX(ZMM30,   756, zmm30,  0,  64) \\\r\nX(ZMM31,   757, zmm31,  0,  64) \\\r\nX(K0,      758, k0,     0,  8)  \\\r\nX(K1,      759, k1,     0,  8)  \\\r\nX(K2,      760, k2,     0,  8)  \\\r\nX(K3,      761, k3,     0,  8)  \\\r\nX(K4,      762, k4,     0,  8)  \\\r\nX(K5,      763, k5,     0,  8)  \\\r\nX(K6,      764, k6,     0,  8)  \\\r\nX(K7,      765, k7,     0,  8)  \\\r\nX(ZMM0H,   766, zmm0,   32, 32) \\\r\nX(ZMM1H,   767, zmm1,   32, 32) \\\r\nX(ZMM2H,   768, zmm2,   32, 32) \\\r\nX(ZMM3H,   769, zmm3,   32, 32) \\\r\nX(ZMM4H,   770, zmm4,   32, 32) \\\r\nX(ZMM5H,   771, zmm5,   32, 32) \\\r\nX(ZMM6H,   772, zmm6,   32, 32) \\\r\nX(ZMM7H,   773, zmm7,   32, 32) \\\r\nX(ZMM8H,   774, zmm8,   32, 32) \\\r\nX(ZMM9H,   775, zmm9,   32, 32) \\\r\nX(ZMM10H,  776, zmm10,  32, 32) \\\r\nX(ZMM11H,  777, zmm11,  32, 32) \\\r\nX(ZMM12H,  778, zmm12,  32, 32) \\\r\nX(ZMM13H,  779, zmm13,  32, 32) \\\r\nX(ZMM14H,  780, zmm14,  32, 32) \\\r\nX(ZMM15H,  781, zmm15,  32, 32)\r\n\r\ntypedef U16 CV_Regx64;\r\ntypedef enum CV_Regx64Enum\r\n{\r\n#define X(CVN,C,RDN,BP,BZ) CV_Regx64_##CVN = C,\r\n  CV_Reg_X64_XList(X)\r\n#undef X\r\n}\r\nCV_Regx64Enum;\r\n\r\n\r\n#define CV_SignatureXList(X) \\\r\nX(C6,       0)             \\\r\nX(C7,       1)             \\\r\nX(C11,      2)             \\\r\nX(C13,      4)             \\\r\nX(RESERVED, 5)\r\n\r\ntypedef U32 CV_Signature;\r\ntypedef enum CV_SignatureEnum\r\n{\r\n#define X(N,c) CV_Signature_##N = c,\r\n  CV_SignatureXList(X)\r\n#undef X\r\n}\r\nCV_SignatureEnum;\r\n\r\n\r\n#define CV_LanguageXList(X) \\\r\nX(C,       0x00)          \\\r\nX(CXX,     0x01)          \\\r\nX(FORTRAN, 0x02)          \\\r\nX(MASM,    0x03)          \\\r\nX(PASCAL,  0x04)          \\\r\nX(BASIC,   0x05)          \\\r\nX(COBOL,   0x06)          \\\r\nX(LINK,    0x07)          \\\r\nX(CVTRES,  0x08)          \\\r\nX(CVTPGD,  0x09)          \\\r\nX(CSHARP,  0x0A)          \\\r\nX(VB,      0x0B)          \\\r\nX(ILASM,   0x0C)          \\\r\nX(JAVA,    0x0D)          \\\r\nX(JSCRIPT, 0x0E)          \\\r\nX(MSIL,    0x0F)          \\\r\nX(HLSL,    0x10)\r\n\r\ntypedef U16 CV_Language;\r\ntypedef enum CV_LanguageEnum\r\n{\r\n#define X(N,c) CV_Language_##N = c,\r\n  CV_LanguageXList(X)\r\n#undef X\r\n}\r\nCV_LanguageEnum;\r\n\r\n#pragma pack(push, 1)\r\n\r\n////////////////////////////////\r\n//~ rjf: CodeView Format \"Sym\" and \"Leaf\" Header Type\r\n\r\n#define CV_LeafSize_Max max_U16\r\ntypedef U16 CV_LeafSize;\r\n\r\n#define CV_SymSize_Max max_U16\r\ntypedef U16 CV_SymSize;\r\n\r\ntypedef struct CV_RecHeader CV_RecHeader;\r\nstruct CV_RecHeader\r\n{\r\n  U16 size;\r\n  U16 kind;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: CodeView Format \"Sym\" Types\r\n//\r\n// (per-compilation-unit info, variables, procedures, etc.)\r\n//\r\n\r\ntypedef U8 CV_ProcFlags;\r\nenum\r\n{\r\n  CV_ProcFlag_NoFPO       = (1 << 0),\r\n  CV_ProcFlag_IntReturn   = (1 << 1),\r\n  CV_ProcFlag_FarReturn   = (1 << 2),\r\n  CV_ProcFlag_NeverReturn = (1 << 3),\r\n  CV_ProcFlag_NotReached  = (1 << 4),\r\n  CV_ProcFlag_CustomCall  = (1 << 5),\r\n  CV_ProcFlag_NoInline    = (1 << 6),\r\n  CV_ProcFlag_OptDbgInfo  = (1 << 7),\r\n};\r\n\r\ntypedef U16 CV_LocalFlags;\r\nenum\r\n{\r\n  CV_LocalFlag_Param           = (1 << 0),\r\n  CV_LocalFlag_AddrTaken       = (1 << 1),\r\n  CV_LocalFlag_Compgen         = (1 << 2),\r\n  CV_LocalFlag_Aggregate       = (1 << 3),\r\n  CV_LocalFlag_PartOfAggregate = (1 << 4),\r\n  CV_LocalFlag_Aliased         = (1 << 5),\r\n  CV_LocalFlag_Alias           = (1 << 6),\r\n  CV_LocalFlag_Retval          = (1 << 7),\r\n  CV_LocalFlag_OptOut          = (1 << 8),\r\n  CV_LocalFlag_Global          = (1 << 9),\r\n  CV_LocalFlag_Static          = (1 << 10),\r\n};\r\n\r\ntypedef struct CV_LocalVarAttr CV_LocalVarAttr;\r\nstruct CV_LocalVarAttr\r\n{\r\n  U32           off;\r\n  U16           seg;\r\n  CV_LocalFlags flags;\r\n};\r\n\r\n//- (SymKind: COMPILE)\r\n\r\ntypedef U32 CV_CompileFlags;\r\n#define CV_CompileFlags_Extract_Language(f)    (((f)    )&0xFF)\r\n#define CV_CompileFlags_Extract_FloatPrec(f)   (((f)>> 8)&0x03)\r\n#define CV_CompileFlags_Extract_FloatPkg(f)    (((f)>>10)&0x03)\r\n#define CV_CompileFlags_Extract_AmbientData(f) (((f)>>12)&0x07)\r\n#define CV_CompileFlags_Extract_AmbientCode(f) (((f)>>15)&0x07)\r\n#define CV_CompileFlags_Extract_Mode(f)        (((f)>>18)&0x01)\r\n\r\ntypedef struct CV_SymCompile CV_SymCompile;\r\nstruct CV_SymCompile\r\n{\r\n  U8              machine;\r\n  CV_CompileFlags flags;\r\n  // U8[] ver_str (null terminated)\r\n};\r\n\r\n//- (SymKind: SSEARCH)\r\n\r\ntypedef struct CV_SymStartSearch CV_SymStartSearch;\r\nstruct CV_SymStartSearch\r\n{\r\n  U32 start_symbol;\r\n  U16 segment;\r\n};\r\n\r\n//- (SymKind: END) (empty)\r\n\r\n//- (SymKind: RETURN)\r\n\r\ntypedef U8 CV_GenericStyle;\r\ntypedef enum CV_GenericStyleEnum\r\n{\r\n  CV_GenericStyle_VOID,\r\n  CV_GenericStyle_REG,    //  \"return data is in register\"\r\n  CV_GenericStyle_ICAN,   //  \"indirect caller allocated near\"\r\n  CV_GenericStyle_ICAF,   //  \"indirect caller allocated far\"\r\n  CV_GenericStyle_IRAN,   //  \"indirect returnee allocated near\"\r\n  CV_GenericStyle_IRAF,   //  \"indirect returnee allocated far\"\r\n  CV_GenericStyle_UNUSED,\r\n}\r\nCV_GenericStyleEnum;\r\n\r\ntypedef U16 CV_GenericFlags;\r\nenum\r\n{\r\n  CV_GenericFlags_CSTYLE  = (1 << 0),\r\n  CV_GenericFlags_RSCLEAN = (1 << 1), //  \"returnee stack cleanup\"\r\n};\r\n\r\ntypedef struct CV_SymReturn CV_SymReturn;\r\nstruct CV_SymReturn\r\n{\r\n  CV_GenericFlags flags;\r\n  CV_GenericStyle style;\r\n};\r\n\r\n//- (SymKind: SLINK32)\r\n\r\ntypedef struct CV_SymSLink32 CV_SymSLink32;\r\nstruct CV_SymSLink32\r\n{\r\n  U32 frame_size;\r\n  U32 offset;\r\n  U16 reg;\r\n};\r\n\r\n//- (SymKind: OEM)\r\n\r\ntypedef struct CV_SymOEM CV_SymOEM;\r\nstruct CV_SymOEM\r\n{\r\n  Guid      id;\r\n  CV_TypeId itype;\r\n  //  padding align(4)\r\n};\r\n\r\n//- (SymKind: VFTABLE32)\r\n\r\ntypedef struct CV_SymVPath32 CV_SymVPath32;\r\nstruct CV_SymVPath32\r\n{\r\n  CV_TypeId root;\r\n  CV_TypeId path;\r\n  U32       off;\r\n  U16       seg;\r\n};\r\n\r\n//- (SymKind: FRAMEPROC)\r\n\r\ntypedef U8 CV_EncodedFramePtrReg;\r\ntypedef enum CV_EncodedFramePtrRegEnum\r\n{\r\n  CV_EncodedFramePtrReg_None,\r\n  CV_EncodedFramePtrReg_StackPtr,\r\n  CV_EncodedFramePtrReg_FramePtr,\r\n  CV_EncodedFramePtrReg_BasePtr,\r\n}\r\nCV_EncodedFramePtrRegEnum;\r\n\r\ntypedef U32 CV_FrameprocFlags;\r\nenum\r\n{\r\n  CV_FrameprocFlag_UsesAlloca        = (1 << 0),\r\n  CV_FrameprocFlag_UsesSetJmp        = (1 << 1),\r\n  CV_FrameprocFlag_UsesLongJmp       = (1 << 2),\r\n  CV_FrameprocFlag_UsesInlAsm        = (1 << 3),\r\n  CV_FrameprocFlag_UsesEH            = (1 << 4),\r\n  CV_FrameprocFlag_Inline            = (1 << 5),\r\n  CV_FrameprocFlag_HasSEH            = (1 << 6),\r\n  CV_FrameprocFlag_Naked             = (1 << 7),\r\n  CV_FrameprocFlag_HasSecurityChecks = (1 << 8),\r\n  CV_FrameprocFlag_AsyncEH           = (1 << 9),\r\n  CV_FrameprocFlag_GSNoStackOrdering = (1 << 10),\r\n  CV_FrameprocFlag_WasInlined        = (1 << 11),\r\n  CV_FrameprocFlag_GSCheck           = (1 << 12),\r\n  CV_FrameprocFlag_SafeBuffers       = (1 << 13),\r\n  // LocalBasePointer: 14,15\r\n  // ParamBasePointer: 16,17\r\n  CV_FrameprocFlag_PogoOn            = (1 << 18),\r\n  CV_FrameprocFlag_PogoCountsValid   = (1 << 19),\r\n  CV_FrameprocFlag_OptSpeed          = (1 << 20),\r\n  CV_FrameprocFlag_HasCFG            = (1 << 21),\r\n  CV_FrameprocFlag_HasCFW            = (1 << 22),\r\n};\r\n#define CV_FrameprocFlags_Extract_LocalBasePointer(f) (((f) >> 14)&3)\r\n#define CV_FrameprocFlags_Extract_ParamBasePointer(f) (((f) >> 16)&3)\r\n\r\ntypedef struct CV_SymFrameproc CV_SymFrameproc;\r\nstruct CV_SymFrameproc\r\n{\r\n  U32               frame_size;\r\n  U32               pad_size;\r\n  U32               pad_off;\r\n  U32               save_reg_size;\r\n  U32               eh_off;\r\n  CV_SectionIndex   eh_sec;\r\n  CV_FrameprocFlags flags;\r\n};\r\n\r\n//- (SymKind: ANNOTATION)\r\n\r\ntypedef struct CV_SymAnnotation CV_SymAnnotation;\r\nstruct CV_SymAnnotation\r\n{\r\n  U32 off;\r\n  U16 seg;\r\n  U16 count;\r\n  // U8[] annotation (null terminated)\r\n};\r\n\r\n//- (SymKind: OBJNAME)\r\n\r\ntypedef struct CV_SymObjName CV_SymObjName;\r\nstruct CV_SymObjName\r\n{\r\n  U32 sig;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: THUNK32)\r\n\r\ntypedef U8 CV_ThunkOrdinal;\r\ntypedef enum CV_ThunkOrdinalEnum\r\n{\r\n  CV_ThunkOrdinal_NoType,\r\n  CV_ThunkOrdinal_Adjustor,\r\n  CV_ThunkOrdinal_VCall,\r\n  CV_ThunkOrdinal_PCode,\r\n  CV_ThunkOrdinal_Load,\r\n  CV_ThunkOrdinal_TrampIncremental,\r\n  CV_ThunkOrdinal_TrampBranchIsland,\r\n}\r\nCV_ThunkOrdinalEnum;\r\n\r\ntypedef struct CV_SymThunk32 CV_SymThunk32;\r\nstruct CV_SymThunk32\r\n{\r\n  U32             parent;\r\n  U32             end;\r\n  U32             next;\r\n  U32             off;\r\n  U16             sec;\r\n  U16             len;\r\n  CV_ThunkOrdinal ord;\r\n  // U8[] name (null terminated)\r\n  // U8[] variant (null terminated)\r\n};\r\n\r\n//- (SymKind: BLOCK32)\r\n\r\ntypedef struct CV_SymBlock32 CV_SymBlock32;\r\nstruct CV_SymBlock32\r\n{\r\n  U32 parent;\r\n  U32 end;\r\n  U32 len;\r\n  U32 off;\r\n  U16 sec;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: LABEL32)\r\n\r\ntypedef struct CV_SymLabel32 CV_SymLabel32;\r\nstruct CV_SymLabel32\r\n{\r\n  U32          off;\r\n  U16          sec;\r\n  CV_ProcFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: REGISTER)\r\n\r\ntypedef struct CV_SymRegister CV_SymRegister;\r\nstruct CV_SymRegister\r\n{\r\n  CV_TypeId itype;\r\n  U16       reg;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: CONSTANT)\r\n\r\ntypedef struct CV_SymConstant CV_SymConstant;\r\nstruct CV_SymConstant\r\n{\r\n  CV_TypeId itype;\r\n  // CV_Numeric num\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: UDT)\r\n\r\ntypedef struct CV_SymUDT CV_SymUDT;\r\nstruct CV_SymUDT\r\n{\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: MANYREG)\r\n\r\ntypedef struct CV_SymManyreg CV_SymManyreg;\r\nstruct CV_SymManyreg\r\n{\r\n  CV_TypeId itype;\r\n  U8        count;\r\n  // U8[count] regs;\r\n};\r\n\r\n//- (SymKind: BPREL32)\r\n\r\ntypedef struct CV_SymBPRel32 CV_SymBPRel32;\r\nstruct CV_SymBPRel32\r\n{\r\n  U32       off;\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: LDATA32, GDATA32)\r\n\r\ntypedef struct CV_SymData32 CV_SymData32;\r\nstruct CV_SymData32\r\n{\r\n  CV_TypeId       itype;\r\n  U32             off;\r\n  CV_SectionIndex sec;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: PUB32)\r\n\r\ntypedef U32 CV_Pub32Flags;\r\nenum\r\n{\r\n  CV_Pub32Flag_Code        = (1 << 0),\r\n  CV_Pub32Flag_Function    = (1 << 1),\r\n  CV_Pub32Flag_ManagedCode = (1 << 2),\r\n  CV_Pub32Flag_MSIL        = (1 << 3),\r\n};\r\n\r\ntypedef struct CV_SymPub32 CV_SymPub32;\r\nstruct CV_SymPub32\r\n{\r\n  CV_Pub32Flags   flags;\r\n  U32             off;\r\n  CV_SectionIndex sec;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: LPROC32, GPROC32)\r\n\r\ntypedef struct CV_SymProc32 CV_SymProc32;\r\nstruct CV_SymProc32\r\n{\r\n  U32          parent;\r\n  U32          end;\r\n  U32          next;\r\n  U32          len;\r\n  U32          dbg_start;\r\n  U32          dbg_end;\r\n  CV_TypeId    itype;\r\n  U32          off;\r\n  U16          sec;\r\n  CV_ProcFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: REGREL32)\r\n\r\ntypedef struct CV_SymRegrel32 CV_SymRegrel32;\r\nstruct CV_SymRegrel32\r\n{\r\n  U32       reg_off;\r\n  CV_TypeId itype;\r\n  CV_Reg    reg;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: LTHREAD32, GTHREAD32)\r\n\r\ntypedef struct CV_SymThread32 CV_SymThread32;\r\nstruct CV_SymThread32\r\n{\r\n  CV_TypeId itype;\r\n  U32       tls_off;\r\n  U16       tls_seg;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: COMPILE2)\r\n\r\ntypedef U32 CV_Compile2Flags;\r\n#define CV_Compile2Flags_Extract_Language(f)        (((f)    )&0xFF)\r\n#define CV_Compile2Flags_Extract_EditAndContinue(f) (((f)>> 8)&0x01)\r\n#define CV_Compile2Flags_Extract_NoDbgInfo(f)       (((f)>> 9)&0x01)\r\n#define CV_Compile2Flags_Extract_LTCG(f)            (((f)>>10)&0x01)\r\n#define CV_Compile2Flags_Extract_NoDataAlign(f)     (((f)>>11)&0x01)\r\n#define CV_Compile2Flags_Extract_ManagedPresent(f)  (((f)>>12)&0x01)\r\n#define CV_Compile2Flags_Extract_SecurityChecks(f)  (((f)>>13)&0x01)\r\n#define CV_Compile2Flags_Extract_HotPatch(f)        (((f)>>14)&0x01)\r\n#define CV_Compile2Flags_Extract_CVTCIL(f)          (((f)>>15)&0x01)\r\n#define CV_Compile2Flags_Extract_MSILModule(f)      (((f)>>16)&0x01)\r\n\r\ntypedef struct CV_SymCompile2 CV_SymCompile2;\r\nstruct CV_SymCompile2\r\n{\r\n  CV_Compile2Flags flags;\r\n  CV_Arch          machine;\r\n  U16              ver_fe_major;\r\n  U16              ver_fe_minor;\r\n  U16              ver_fe_build;\r\n  U16              ver_major;\r\n  U16              ver_minor;\r\n  U16              ver_build;\r\n  // U8[] ver_str (null terminated)\r\n};\r\n\r\n//- (SymKind: MANYREG2)\r\n\r\ntypedef struct CV_SymManyreg2 CV_SymManyreg2;\r\nstruct CV_SymManyreg2\r\n{\r\n  CV_TypeId itype;\r\n  U16       count;\r\n  // U16[count] regs;\r\n};\r\n\r\n//- (SymKind: LOCALSLOT)\r\n\r\ntypedef struct CV_SymSlot CV_SymSlot;\r\nstruct CV_SymSlot\r\n{\r\n  U32       slot_index;\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: MANFRAMEREL, ATTR_FRAMEREL)\r\n\r\ntypedef struct CV_SymAttrFrameRel CV_SymAttrFrameRel;\r\nstruct CV_SymAttrFrameRel\r\n{\r\n  U32             off;\r\n  CV_TypeId       itype;\r\n  CV_LocalVarAttr attr;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: MANREGISTER, ATTR_REGISTER)\r\n\r\ntypedef struct CV_SymAttrReg CV_SymAttrReg;\r\nstruct CV_SymAttrReg\r\n{\r\n  CV_TypeId       itype;\r\n  CV_LocalVarAttr attr;\r\n  U16             reg;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: MANMANYREG, ATTR_MANYREG)\r\n\r\n\r\ntypedef struct CV_SymAttrManyReg CV_SymAttrManyReg;\r\nstruct CV_SymAttrManyReg\r\n{\r\n  CV_TypeId       itype;\r\n  CV_LocalVarAttr attr;\r\n  U8              count;\r\n  // U8[count] regs\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: MANREGREL, ATTR_REGREL)\r\n\r\ntypedef struct CV_SymAttrRegRel CV_SymAttrRegRel;\r\nstruct CV_SymAttrRegRel\r\n{\r\n  U32             off;\r\n  CV_TypeId       itype;\r\n  U16             reg;\r\n  CV_LocalVarAttr attr;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: UNAMESPACE)\r\n\r\ntypedef struct CV_SymUNamespace CV_SymUNamespace;\r\nstruct CV_SymUNamespace\r\n{\r\n  // *** \"dummy\" is the first character of name - it should not be skipped!\r\n  // *** It is placed here so the C compiler will accept this struct.\r\n  // *** The actual fixed size part of this record has a size of zero.\r\n  \r\n  U8 dummy;\r\n  \r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: PROCREF, DATAREF, LPROCREF)\r\n\r\ntypedef struct CV_SymRef2 CV_SymRef2;\r\nstruct CV_SymRef2\r\n{\r\n  U32         suc_name;\r\n  U32         sym_off;\r\n  CV_ModIndex imod;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: TRAMPOLINE)\r\n\r\ntypedef U16 CV_TrampolineKind;\r\ntypedef enum CV_TrampolineKindEnum\r\n{\r\n  CV_TrampolineKind_Incremental,\r\n  CV_TrampolineKind_BranchIsland,\r\n}\r\nCV_TrampolineKindEnum;\r\n\r\ntypedef struct CV_SymTrampoline CV_SymTrampoline;\r\nstruct CV_SymTrampoline\r\n{\r\n  CV_TrampolineKind kind;\r\n  U16               thunk_size;\r\n  U32               thunk_sec_off;\r\n  U32               target_sec_off;\r\n  CV_SectionIndex   thunk_sec;\r\n  CV_SectionIndex   target_sec;\r\n};\r\n\r\n//- (SymKind: SEPCODE)\r\n\r\ntypedef U32 CV_SepcodeFlags;\r\nenum\r\n{\r\n  CV_SepcodeFlag_IsLexicalScope  = (1 << 0),\r\n  CV_SepcodeFlag_ReturnsToParent = (1 << 1),\r\n};\r\n\r\ntypedef struct CV_SymSepcode CV_SymSepcode;\r\nstruct CV_SymSepcode\r\n{\r\n  U32             parent;\r\n  U32             end;\r\n  U32             len;\r\n  CV_SepcodeFlags flags;\r\n  U32             sec_off;\r\n  U32             sec_parent_off;\r\n  U16             sec;\r\n  U16             sec_parent;\r\n};\r\n\r\n//- (SymKind: SECTION)\r\n\r\ntypedef struct CV_SymSection CV_SymSection;\r\nstruct CV_SymSection\r\n{\r\n  U16 sec_index;\r\n  U8  align;\r\n  U8  pad;\r\n  U32 rva;\r\n  U32 size;\r\n  U32 characteristics;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: COFFGROUP)\r\n\r\ntypedef struct CV_SymCoffGroup CV_SymCoffGroup;\r\nstruct CV_SymCoffGroup\r\n{\r\n  U32 size;\r\n  U32 characteristics;\r\n  U32 off;\r\n  U16 sec;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: EXPORT)\r\n\r\ntypedef U16 CV_ExportFlags;\r\nenum\r\n{\r\n  CV_ExportFlag_Constant  = (1 << 0),\r\n  CV_ExportFlag_Data      = (1 << 1),\r\n  CV_ExportFlag_Private   = (1 << 2),\r\n  CV_ExportFlag_NoName    = (1 << 3),\r\n  CV_ExportFlag_Ordinal   = (1 << 4),\r\n  CV_ExportFlag_Forwarder = (1 << 5),\r\n};\r\n\r\ntypedef struct CV_SymExport CV_SymExport;\r\nstruct CV_SymExport\r\n{\r\n  U16            ordinal;\r\n  CV_ExportFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: CALLSITEINFO)\r\n\r\ntypedef struct CV_SymCallSiteInfo CV_SymCallSiteInfo;\r\nstruct CV_SymCallSiteInfo\r\n{\r\n  U32       off;\r\n  U16       sec;\r\n  U16       pad;\r\n  CV_TypeId itype;\r\n};\r\n\r\n//- (SymKind: FRAMECOOKIE)\r\n\r\ntypedef U8 CV_FrameCookieKind;\r\ntypedef enum CV_FrameCookieKindEnum\r\n{\r\n  CV_FrameCookieKind_Copy,\r\n  CV_FrameCookieKind_XorSP,\r\n  CV_FrameCookieKind_XorBP,\r\n  CV_FrameCookieKind_XorR13,\r\n}\r\nCV_FrameCookieKindEnum;\r\n\r\ntypedef struct CV_SymFrameCookie CV_SymFrameCookie;\r\nstruct CV_SymFrameCookie\r\n{\r\n  U32                off;\r\n  CV_Reg             reg;\r\n  CV_FrameCookieKind kind;\r\n  U8                 flags;\r\n};\r\n\r\n//- (SymKind: DISCARDED)\r\n\r\ntypedef U8 CV_DiscardedKind;\r\ntypedef enum CV_DiscardedKindEnum\r\n{\r\n  CV_DiscardedKind_Unknown,\r\n  CV_DiscardedKind_NotSelected,\r\n  CV_DiscardedKind_NotReferenced,\r\n}\r\nCV_DiscardedKindEnum;\r\n\r\ntypedef struct CV_SymDiscarded CV_SymDiscarded;\r\nstruct CV_SymDiscarded\r\n{\r\n  CV_DiscardedKind kind;\r\n  U32              file_id;\r\n  U32              file_ln;\r\n  // U8[] data (rest of data)\r\n};\r\n\r\n//- (SymKind: COMPILE3)\r\ntypedef U32 CV_Compile3Flags;\r\nenum\r\n{\r\n  CV_Compile3Flag_EC             = (1 << 8),\r\n  CV_Compile3Flag_NoDbgInfo      = (1 << 9),\r\n  CV_Compile3Flag_LTCG           = (1 << 10),\r\n  CV_Compile3Flag_NoDataAlign    = (1 << 11),\r\n  CV_Compile3Flag_ManagedPresent = (1 << 12),\r\n  CV_Compile3Flag_SecurityChecks = (1 << 13),\r\n  CV_Compile3Flag_HotPatch       = (1 << 14),\r\n  CV_Compile3Flag_CVTCIL         = (1 << 15),\r\n  CV_Compile3Flag_MSILModule     = (1 << 16),\r\n  CV_Compile3Flag_SDL            = (1 << 17),\r\n  CV_Compile3Flag_PGO            = (1 << 18),\r\n  CV_Compile3Flag_EXP            = (1 << 19),\r\n  \r\n  CV_Compile3Flag_Language_Shift = 0, CV_Compile3Flag_Language_Mask = 0xff,\r\n};\r\n\r\ntypedef U32 CV_Compile3Flags;\r\n#define CV_Compile3Flags_Extract_Language(f)        (((f)    )&0xFF)\r\n#define CV_Compile3Flags_Extract_EditAndContinue(f) (((f)>> 9)&0x01)\r\n#define CV_Compile3Flags_Extract_NoDbgInfo(f)       (((f)>>10)&0x01)\r\n#define CV_Compile3Flags_Extract_LTCG(f)            (((f)>>11)&0x01)\r\n#define CV_Compile3Flags_Extract_NoDataAlign(f)     (((f)>>12)&0x01)\r\n#define CV_Compile3Flags_Extract_ManagedPresent(f)  (((f)>>13)&0x01)\r\n#define CV_Compile3Flags_Extract_SecurityChecks(f)  (((f)>>14)&0x01)\r\n#define CV_Compile3Flags_Extract_HotPatch(f)        (((f)>>15)&0x01)\r\n#define CV_Compile3Flags_Extract_CVTCIL(f)          (((f)>>16)&0x01)\r\n#define CV_Compile3Flags_Extract_MSILModule(f)      (((f)>>17)&0x01)\r\n#define CV_Compile3Flags_Extract_SDL(f)             (((f)>>18)&0x01)\r\n#define CV_Compile3Flags_Extract_PGO(f)             (((f)>>19)&0x01)\r\n#define CV_Compile3Flags_Extract_EXP(f)             (((f)>>20)&0x01)\r\n\r\ntypedef struct CV_SymCompile3 CV_SymCompile3;\r\nstruct CV_SymCompile3\r\n{\r\n  CV_Compile3Flags flags;\r\n  CV_Arch          machine;\r\n  U16              ver_fe_major;\r\n  U16              ver_fe_minor;\r\n  U16              ver_fe_build;\r\n  U16              ver_feqfe;\r\n  U16              ver_major;\r\n  U16              ver_minor;\r\n  U16              ver_build;\r\n  U16              ver_qfe;\r\n  // U8[] ver_str (null terminated)\r\n};\r\n\r\n//- (SymKind: ENVBLOCK)\r\n\r\ntypedef struct CV_SymEnvBlock CV_SymEnvBlock;\r\nstruct CV_SymEnvBlock\r\n{\r\n  U8 flags;\r\n  // U8[][] rgsz (sequence null terminated strings)\r\n};\r\n\r\n//- (SymKind: LOCAL)\r\n\r\ntypedef struct CV_SymLocal CV_SymLocal;\r\nstruct CV_SymLocal\r\n{\r\n  CV_TypeId     itype;\r\n  CV_LocalFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- DEFRANGE\r\n\r\ntypedef struct CV_LvarAddrRange CV_LvarAddrRange;\r\nstruct CV_LvarAddrRange\r\n{\r\n  U32 off;\r\n  U16 sec;\r\n  U16 len;\r\n};\r\n\r\ntypedef struct CV_LvarAddrGap CV_LvarAddrGap;\r\nstruct CV_LvarAddrGap\r\n{\r\n  U16 off;\r\n  U16 len;\r\n};\r\n\r\ntypedef U16 CV_RangeAttribs;\r\nenum\r\n{\r\n  CV_RangeAttrib_Maybe = (1 << 0),\r\n};\r\n\r\n//- (SymKind: DEFRANGE)\r\n\r\ntypedef struct CV_SymDefrange CV_SymDefrange;\r\nstruct CV_SymDefrange\r\n{\r\n  U32              program;\r\n  CV_LvarAddrRange range;\r\n  // variable-width: CV_LvarAddrGap gaps;\r\n};\r\n\r\n//- (SymKind: DEFRANGE_SUBFIELD)\r\n\r\ntypedef struct CV_SymDefrangeSubfield CV_SymDefrangeSubfield;\r\nstruct CV_SymDefrangeSubfield\r\n{\r\n  U32              program;\r\n  U32              off_in_parent;\r\n  CV_LvarAddrRange range;\r\n  // CV_LvarAddrGap[] gaps (rest of data)\r\n};\r\n\r\n//- (SymKind: DEFRANGE_REGISTER)\r\n\r\ntypedef struct CV_SymDefrangeRegister CV_SymDefrangeRegister;\r\nstruct CV_SymDefrangeRegister\r\n{\r\n  CV_Reg           reg;\r\n  CV_RangeAttribs  attribs;\r\n  CV_LvarAddrRange range;\r\n  // CV_LvarAddrGap[] gaps (rest of data)\r\n};\r\n\r\n//- (SymKind: DEFRANGE_FRAMEPOINTER_REL)\r\n\r\ntypedef struct CV_SymDefrangeFramepointerRel CV_SymDefrangeFramepointerRel;\r\nstruct CV_SymDefrangeFramepointerRel\r\n{\r\n  S32              off;\r\n  CV_LvarAddrRange range;\r\n  // CV_LvarAddrGap[] gaps (rest of data)\r\n};\r\n\r\n//- (SymKind: DEFRANGE_SUBFIELD_REGISTER)\r\n\r\n#define CV_DefrangeSubfieldRegister_Extract_ParentOffset(x) ((x) & 0x1FFF)\r\n\r\ntypedef struct CV_SymDefrangeSubfieldRegister CV_SymDefrangeSubfieldRegister;\r\nstruct CV_SymDefrangeSubfieldRegister\r\n{\r\n  CV_Reg           reg;\r\n  CV_RangeAttribs  attribs;\r\n  U32              field_offset;\r\n  CV_LvarAddrRange range;\r\n  // CV_LvarAddrGap[] gaps (rest of data)\r\n};\r\n\r\n//- (SymKind: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE)\r\n\r\ntypedef struct CV_SymDefrangeFramepointerRelFullScope CV_SymDefrangeFramepointerRelFullScope;\r\nstruct CV_SymDefrangeFramepointerRelFullScope\r\n{\r\n  S32 off;\r\n};\r\n\r\n//- (SymKind: DEFRANGE_REGISTER_REL)\r\n\r\ntypedef U16 CV_DefrangeRegisterRelFlags;\r\nenum\r\n{\r\n  CV_DefrangeRegisterRelFlag_SpilledOutUDTMember = (1 << 0),\r\n};\r\n#define CV_DefrangeRegisterRelFlag_Extract_OffsetParent(f) (((f)>>4)&0xFFF)\r\n\r\ntypedef struct CV_SymDefrangeRegisterRel CV_SymDefrangeRegisterRel;\r\nstruct CV_SymDefrangeRegisterRel\r\n{\r\n  CV_Reg                      reg;\r\n  CV_DefrangeRegisterRelFlags flags;\r\n  S32                         reg_off;\r\n  CV_LvarAddrRange            range;\r\n  // CV_LvarAddGap[] gaps (rest of data)\r\n};\r\n\r\n//- (SymKind: BUILDINFO)\r\n\r\ntypedef struct CV_SymBuildInfo CV_SymBuildInfo;\r\nstruct CV_SymBuildInfo\r\n{\r\n  CV_ItemId id;\r\n};\r\n\r\n//- (SymKind: INLINESITE)\r\n\r\ntypedef U32 CV_InlineBinaryAnnotation;\r\ntypedef enum CV_InlineBinaryAnnotationEnum\r\n{\r\n  CV_InlineBinaryAnnotation_Null,\r\n  CV_InlineBinaryAnnotation_CodeOffset,\r\n  CV_InlineBinaryAnnotation_ChangeCodeOffsetBase,\r\n  CV_InlineBinaryAnnotation_ChangeCodeOffset,\r\n  CV_InlineBinaryAnnotation_ChangeCodeLength,\r\n  CV_InlineBinaryAnnotation_ChangeFile,\r\n  CV_InlineBinaryAnnotation_ChangeLineOffset,\r\n  CV_InlineBinaryAnnotation_ChangeLineEndDelta,\r\n  CV_InlineBinaryAnnotation_ChangeRangeKind,\r\n  CV_InlineBinaryAnnotation_ChangeColumnStart,\r\n  CV_InlineBinaryAnnotation_ChangeColumnEndDelta,\r\n  CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset,\r\n  CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset,\r\n  CV_InlineBinaryAnnotation_ChangeColumnEnd\r\n}\r\nCV_InlineBinaryAnnotationEnum;\r\n\r\ntypedef U32 CV_InlineRangeKind;\r\ntypedef enum CV_InlineRangeKindEnum\r\n{\r\n  CV_InlineRangeKind_Expr,\r\n  CV_InlineRangeKind_Stmt\r\n}\r\nCV_InlineRangeKindEnum;\r\n\r\ntypedef struct CV_SymInlineSite CV_SymInlineSite;\r\nstruct CV_SymInlineSite\r\n{\r\n  U32       parent;\r\n  U32       end;\r\n  CV_ItemId inlinee;\r\n  // U8 annotations[] (rest of data)\r\n};\r\n\r\n//- (SymKind: INLINESITE2)\r\n\r\ntypedef struct CV_SymInlineSite2 CV_SymInlineSite2;\r\nstruct CV_SymInlineSite2\r\n{\r\n  U32       parent_off;\r\n  U32       end_off;\r\n  CV_ItemId inlinee;\r\n  U32       invocations;\r\n  // U8 annotations[] (rest of data)\r\n};\r\n\r\n//- (SymKind: INLINESITE_END) (empty)\r\n\r\n//- (SymKind: FILESTATIC)\r\n\r\ntypedef struct CV_SymFileStatic CV_SymFileStatic;\r\nstruct CV_SymFileStatic\r\n{\r\n  CV_TypeId     itype;\r\n  U32           mod_offset;\r\n  CV_LocalFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: ARMSWITCHTABLE)\r\n\r\ntypedef U16 CV_ArmSwitchKind;\r\ntypedef enum CV_ArmSwitchKindEnum\r\n{\r\n  CV_ArmSwitchKind_INT1,\r\n  CV_ArmSwitchKind_UINT1,\r\n  CV_ArmSwitchKind_INT2,\r\n  CV_ArmSwitchKind_UINT2,\r\n  CV_ArmSwitchKind_INT4,\r\n  CV_ArmSwitchKind_UINT5,\r\n  CV_ArmSwitchKind_POINTER,\r\n  CV_ArmSwitchKind_UINT1SHL1,\r\n  CV_ArmSwitchKind_UINT2SHL1,\r\n  CV_ArmSwitchKind_INT1SSHL1,\r\n  CV_ArmSwitchKind_INT2SSHL1,\r\n}\r\nCV_ArmSwitchKindEnum;\r\n\r\ntypedef struct CV_SymArmSwitchTable CV_SymArmSwitchTable;\r\nstruct CV_SymArmSwitchTable\r\n{\r\n  U32              off_base;\r\n  U16              sec_base;\r\n  CV_ArmSwitchKind kind;\r\n  U32              off_branch;\r\n  U32              off_table;\r\n  U16              sec_branch;\r\n  U16              sec_table;\r\n  U32              entry_count;\r\n};\r\n\r\n//- (SymKind: CALLEES, CALLERS)\r\n\r\ntypedef struct CV_SymFunctionList CV_SymFunctionList;\r\nstruct CV_SymFunctionList\r\n{\r\n  U32 count;\r\n  // CV_TypeId[count] funcs\r\n  // U32[clamp(count, rest_of_data/4)] invocations\r\n};\r\n\r\n//- (SymKind: POGODATA)\r\n\r\ntypedef struct CV_SymPogoInfo CV_SymPogoInfo;\r\nstruct CV_SymPogoInfo\r\n{\r\n  U32 invocations;\r\n  U64 dynamic_inst_count;\r\n  U32 static_inst_count;\r\n  U32 post_inline_static_inst_count;\r\n};\r\n\r\n//- (SymKind: HEAPALLOCSITE)\r\n\r\ntypedef struct CV_SymHeapAllocSite CV_SymHeapAllocSite;\r\nstruct CV_SymHeapAllocSite\r\n{\r\n  U32       off;\r\n  U16       sec;\r\n  U16       call_inst_len;\r\n  CV_TypeId itype;\r\n};\r\n\r\n//- (SymKind: MOD_TYPEREF)\r\n\r\ntypedef U32 CV_ModTypeRefFlags;\r\nenum\r\n{\r\n  CV_ModTypeRefFlag_None     = (1 << 0),\r\n  CV_ModTypeRefFlag_RefTMPCT = (1 << 1),\r\n  CV_ModTypeRefFlag_OwnTMPCT = (1 << 2),\r\n  CV_ModTypeRefFlag_OwnTMR   = (1 << 3),\r\n  CV_ModTypeRefFlag_OwnTM    = (1 << 4),\r\n  CV_ModTypeRefFlag_RefTM    = (1 << 5),\r\n};\r\n\r\ntypedef struct CV_SymModTypeRef CV_SymModTypeRef;\r\nstruct CV_SymModTypeRef\r\n{\r\n  CV_ModTypeRefFlags flags;\r\n  // contain stream number or module index depending on flags     (undocumented)\r\n  U32                word0;\r\n  U32                word1;\r\n};\r\n\r\n//- (SymKind: REF_MINIPDB)\r\n\r\ntypedef U16 CV_RefMiniPdbFlags;\r\nenum\r\n{\r\n  CV_RefMiniPdbFlag_Local = (1 << 0),\r\n  CV_RefMiniPdbFlag_Data  = (1 << 1),\r\n  CV_RefMiniPdbFlag_UDT   = (1 << 2),\r\n  CV_RefMiniPdbFlag_Label = (1 << 3),\r\n  CV_RefMiniPdbFlag_Const = (1 << 4),\r\n};\r\n\r\ntypedef struct CV_SymRefMiniPdb CV_SymRefMiniPdb;\r\nstruct CV_SymRefMiniPdb\r\n{\r\n  U32                data;\r\n  CV_ModIndex        imod;\r\n  CV_RefMiniPdbFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: FASTLINK)\r\n\r\ntypedef U16 CV_FastLinkFlags;\r\nenum\r\n{\r\n  CV_FastLinkFlag_IsGlobalData = (1 << 0),\r\n  CV_FastLinkFlag_IsData       = (1 << 1),\r\n  CV_FastLinkFlag_IsUDT        = (1 << 2),\r\n  // 3 ~ unknown/unused\r\n  CV_FastLinkFlag_IsConst      = (1 << 4),\r\n  // 5 ~ unknown/unused\r\n  CV_FastLinkFlag_IsNamespace  = (1 << 6),\r\n};\r\n\r\ntypedef struct CV_SymFastLink CV_SymFastLink;\r\nstruct CV_SymFastLink\r\n{\r\n  CV_TypeId        itype;\r\n  CV_FastLinkFlags flags;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (SymKind: INLINEES)\r\n\r\ntypedef struct CV_SymInlinees CV_SymInlinees;\r\nstruct CV_SymInlinees\r\n{\r\n  U32 count;\r\n  // U32[count] desc;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: CodeView Format \"Leaf\" Types\r\n//\r\n//   (type info)\r\n//\r\n\r\n#define CV_TypeId_Variadic 0\r\n\r\n#define CV_BasicPointerKindXList(X) \\\r\nX(VALUE,      0x0)                \\\r\nX(16BIT,      0x1)                \\\r\nX(FAR_16BIT,  0x2)                \\\r\nX(HUGE_16BIT, 0x3)                \\\r\nX(32BIT,      0x4)                \\\r\nX(16_32BIT,   0x5)                \\\r\nX(64BIT,      0x6)\r\n\r\ntypedef U8 CV_BasicPointerKind;\r\ntypedef enum\r\n{\r\n#define X(N,c) CV_BasicPointerKind_##N = c,\r\n  CV_BasicPointerKindXList(X)\r\n#undef X\r\n} CV_BasicPointerKindEnum;\r\n\r\n#define CV_BasicTypeFromTypeId(x)        ((x)&0xFF)\r\n#define CV_BasicPointerKindFromTypeId(x) (((x)>>8)&0xFF)\r\n\r\ntypedef U8 CV_HFAKind;\r\ntypedef enum CV_HFAKindEnum\r\n{\r\n  CV_HFAKind_None,\r\n  CV_HFAKind_Float,\r\n  CV_HFAKind_Double,\r\n  CV_HFAKind_Other\r\n} CV_HFAKindEnum;\r\n\r\ntypedef U8 CV_MoComUDTKind;\r\ntypedef enum CV_MoComUDTKindEnum\r\n{\r\n  CV_MoComUDTKind_None,\r\n  CV_MoComUDTKind_Ref,\r\n  CV_MoComUDTKind_Value,\r\n  CV_MoComUDTKind_Interface\r\n} CV_MoComUDTKindEnum;\r\n\r\ntypedef U16 CV_TypeProps;\r\ntypedef U32 CV_TypeProps32;\r\nenum\r\n{\r\n  CV_TypeProp_Packed                     = (1 << 0),\r\n  CV_TypeProp_HasConstructorsDestructors = (1 << 1),\r\n  CV_TypeProp_OverloadedOperators        = (1 << 2),\r\n  CV_TypeProp_IsNested                   = (1 << 3),\r\n  CV_TypeProp_ContainsNested             = (1 << 4),\r\n  CV_TypeProp_OverloadedAssignment       = (1 << 5),\r\n  CV_TypeProp_OverloadedCasting          = (1 << 6),\r\n  CV_TypeProp_FwdRef                     = (1 << 7),\r\n  CV_TypeProp_Scoped                     = (1 << 8),\r\n  CV_TypeProp_HasUniqueName              = (1 << 9),\r\n  CV_TypeProp_Sealed                     = (1 << 10),\r\n  // HFA: 11,12\r\n  CV_TypeProp_Intrinsic                  = (1 << 13),\r\n  // MOCOM: 14,15\r\n};\r\n#define CV_TypeProps_Extract_HFA(f)   (((f)>>11)&0x3)\r\n#define CV_TypeProps_Extract_MOCOM(f) (((f)>>14)&0x3)\r\n\r\ntypedef U8 CV_PointerKind;\r\ntypedef enum CV_PointerKindEnum\r\n{\r\n  CV_PointerKind_Near,      // 16 bit\r\n  CV_PointerKind_Far,       // 16:16 bit\r\n  CV_PointerKind_Huge,      // 16:16 bit\r\n  CV_PointerKind_BaseSeg,\r\n  CV_PointerKind_BaseVal,\r\n  CV_PointerKind_BaseSegVal,\r\n  CV_PointerKind_BaseAddr,\r\n  CV_PointerKind_BaseSegAddr,\r\n  CV_PointerKind_BaseType,\r\n  CV_PointerKind_BaseSelf,\r\n  CV_PointerKind_Near32,    // 32 bit\r\n  CV_PointerKind_Far32,     // 16:32 bit\r\n  CV_PointerKind_64,        // 64 bit\r\n} CV_PointerKindEnum;\r\n\r\ntypedef U8 CV_PointerMode;\r\ntypedef enum CV_PointerModeEnum\r\n{\r\n  CV_PointerMode_Ptr,\r\n  CV_PointerMode_LRef,\r\n  CV_PointerMode_PtrMem,\r\n  CV_PointerMode_PtrMethod,\r\n  CV_PointerMode_RRef,\r\n}\r\nCV_PointerModeEnum;\r\n\r\ntypedef U16 CV_MemberPointerKind;\r\ntypedef enum CV_MemberPointerKindEnum\r\n{\r\n  CV_MemberPointerKind_Undef,\r\n  CV_MemberPointerKind_DataSingle,\r\n  CV_MemberPointerKind_DataMultiple,\r\n  CV_MemberPointerKind_DataVirtual,\r\n  CV_MemberPointerKind_DataGeneral,\r\n  CV_MemberPointerKind_FuncSingle,\r\n  CV_MemberPointerKind_FuncMultiple,\r\n  CV_MemberPointerKind_FuncVirtual,\r\n  CV_MemberPointerKind_FuncGeneral,\r\n}\r\nCV_MemberPointerKindEnum;\r\n\r\ntypedef U32 CV_VirtualTableShape;\r\ntypedef enum CV_VirtualTableShapeEnum\r\n{\r\n  CV_VirtualTableShape_Near,    // 16 bit ptr\r\n  CV_VirtualTableShape_Far,     // 16:16 bit ptr\r\n  CV_VirtualTableShape_Thin,    // ???\r\n  CV_VirtualTableShape_Outer,   // address point displacment to outermost class entry[-1]\r\n  CV_VirtualTableShape_Meta,    // far pointer to metaclass descriptor entry[-2]\r\n  CV_VirtualTableShape_Near32,  // 32 bit ptr\r\n  CV_VirtualTableShape_Far32,   // ???\r\n}\r\nCV_VirtualTableShapeEnum;\r\n\r\ntypedef U8 CV_MethodProp;\r\nenum\r\n{\r\n  CV_MethodProp_Vanilla,\r\n  CV_MethodProp_Virtual,\r\n  CV_MethodProp_Static,\r\n  CV_MethodProp_Friend,\r\n  CV_MethodProp_Intro,\r\n  CV_MethodProp_PureVirtual,\r\n  CV_MethodProp_PureIntro,\r\n};\r\n\r\ntypedef U8 CV_MemberAccess;\r\ntypedef enum CV_MemberAccessEnum\r\n{\r\n  CV_MemberAccess_Null,\r\n  CV_MemberAccess_Private,\r\n  CV_MemberAccess_Protected,\r\n  CV_MemberAccess_Public\r\n}\r\nCV_MemberAccessEnum;\r\n\r\ntypedef U16 CV_FieldAttribs;\r\nenum\r\n{\r\n  // Access: 0,1\r\n  // MethodProp: [2:4]\r\n  CV_FieldAttrib_Pseudo          = (1<<5),\r\n  CV_FieldAttrib_NoInherit       = (1<<6),\r\n  CV_FieldAttrib_NoConstruct     = (1<<7),\r\n  CV_FieldAttrib_CompilerGenated = (1<<8),\r\n  CV_FieldAttrib_Sealed          = (1<<9),\r\n};\r\n#define CV_FieldAttribs_Extract_Access(f)     ((f)&0x3)\r\n#define CV_FieldAttribs_Extract_MethodProp(f) (((f)>>2)&0x7)\r\n\r\ntypedef U16 CV_LabelKind;\r\ntypedef enum CV_LabelKindEnum\r\n{\r\n  CV_LabelKind_Near = 0,\r\n  CV_LabelKind_Far  = 4,\r\n}\r\nCV_LabelKindEnum;\r\n\r\ntypedef U8 CV_FunctionAttribs;\r\nenum\r\n{\r\n  CV_FunctionAttrib_CxxReturnUDT     = (1<<0),\r\n  CV_FunctionAttrib_Constructor      = (1<<1),\r\n  CV_FunctionAttrib_ConstructorVBase = (1<<2),\r\n};\r\n\r\ntypedef U8 CV_CallKind;\r\ntypedef enum CV_CallKindEnum\r\n{\r\n  CV_CallKind_NearC,\r\n  CV_CallKind_FarC,\r\n  CV_CallKind_NearPascal,\r\n  CV_CallKind_FarPascal,\r\n  CV_CallKind_NearFast,\r\n  CV_CallKind_FarFast,\r\n  CV_CallKind_UNUSED,\r\n  CV_CallKind_NearStd,\r\n  CV_CallKind_FarStd,\r\n  CV_CallKind_NearSys,\r\n  CV_CallKind_FarSys,\r\n  CV_CallKind_This,\r\n  CV_CallKind_Mips,\r\n  CV_CallKind_Generic,\r\n  CV_CallKind_Alpha,\r\n  CV_CallKind_PPC,\r\n  CV_CallKind_HitachiSuperH,\r\n  CV_CallKind_Arm,\r\n  CV_CallKind_AM33,\r\n  CV_CallKind_TriCore,\r\n  CV_CallKind_HitachiSuperH5,\r\n  CV_CallKind_M32R,\r\n  CV_CallKind_Clr,\r\n  CV_CallKind_Inline,\r\n  CV_CallKind_NearVector,\r\n}\r\nCV_CallKindEnum;\r\n\r\n//- (LeafKind: PRECOMP)\r\n\r\ntypedef struct CV_LeafPreComp CV_LeafPreComp;\r\nstruct CV_LeafPreComp\r\n{\r\n  U32 start_index;\r\n  U32 count;\r\n  U32 sig;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind; END_PRECOMP)\r\n\r\ntypedef struct CV_LeafEndPreComp CV_LeafEndPreComp;\r\nstruct CV_LeafEndPreComp\r\n{\r\n  U32 sig;\r\n};\r\n\r\n//- (LeafKind: TYPESERVER)\r\n\r\ntypedef struct CV_LeafTypeServer CV_LeafTypeServer;\r\nstruct CV_LeafTypeServer\r\n{\r\n  U32 sig;\r\n  U32 age;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: TYPESERVER2)\r\n\r\ntypedef struct CV_LeafTypeServer2 CV_LeafTypeServer2;\r\nstruct CV_LeafTypeServer2\r\n{\r\n  Guid sig70;\r\n  U32  age;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: SKIP)\r\n\r\ntypedef struct CV_LeafSkip CV_LeafSkip;\r\nstruct CV_LeafSkip\r\n{\r\n  CV_TypeId itype;\r\n};\r\n\r\n//- (LeafKind: VTSHAPE)\r\n\r\ntypedef struct CV_LeafVTShape CV_LeafVTShape;\r\nstruct CV_LeafVTShape\r\n{\r\n  U16 count;\r\n  // U4[count] shapes (CV_VirtualTableShape)\r\n};\r\n\r\n//- (LeafKind: LABEL)\r\n\r\ntypedef struct CV_LeafLabel CV_LeafLabel;\r\nstruct CV_LeafLabel\r\n{\r\n  CV_LabelKind kind;\r\n};\r\n\r\n//- (LeafKind: MODIFIER)\r\n\r\ntypedef U16 CV_ModifierFlags;\r\nenum\r\n{\r\n  CV_ModifierFlag_Const     = (1 << 0),\r\n  CV_ModifierFlag_Volatile  = (1 << 1),\r\n  CV_ModifierFlag_Unaligned = (1 << 2),\r\n};\r\n\r\ntypedef struct CV_LeafModifier CV_LeafModifier;\r\nstruct CV_LeafModifier\r\n{\r\n  CV_TypeId        itype;\r\n  CV_ModifierFlags flags;\r\n};\r\n\r\n//- (LeafKind: POINTER)\r\n\r\ntypedef U32 CV_PointerAttribs;\r\nenum\r\n{\r\n  // Kind: [0:4]\r\n  // Mode: [5:7]\r\n  CV_PointerAttrib_IsFlat     = (1 << 8),\r\n  CV_PointerAttrib_Volatile   = (1 << 9),\r\n  CV_PointerAttrib_Const      = (1 << 10),\r\n  CV_PointerAttrib_Unaligned  = (1 << 11),\r\n  CV_PointerAttrib_Restricted = (1 << 12),\r\n  // Size: [13,18]\r\n  CV_PointerAttrib_MOCOM      = (1 << 19),\r\n  CV_PointerAttrib_LRef       = (1 << 21),\r\n  CV_PointerAttrib_RRef       = (1 << 22)\r\n};\r\n\r\n#define CV_PointerAttribs_Extract_Kind(a) ((a)&0x1F)\r\n#define CV_PointerAttribs_Extract_Mode(a) (((a)>>5)&0x7)\r\n#define CV_PointerAttribs_Extract_Size(a) (((a)>>13)&0x3F)\r\n\r\ntypedef struct CV_LeafPointer CV_LeafPointer;\r\nstruct CV_LeafPointer\r\n{\r\n  CV_TypeId         itype;\r\n  CV_PointerAttribs attribs;\r\n};\r\n\r\n//- (LeafKind: PROCEDURE)\r\n\r\ntypedef struct CV_LeafProcedure CV_LeafProcedure;\r\nstruct CV_LeafProcedure\r\n{\r\n  CV_TypeId          ret_itype;\r\n  CV_CallKind        call_kind;\r\n  CV_FunctionAttribs attribs;\r\n  U16                arg_count;\r\n  CV_TypeId          arg_itype;\r\n};\r\n\r\n//- (LeafKind: MFUNCTION)\r\n\r\ntypedef struct CV_LeafMFunction CV_LeafMFunction;\r\nstruct CV_LeafMFunction\r\n{\r\n  CV_TypeId          ret_itype;\r\n  CV_TypeId          class_itype;\r\n  CV_TypeId          this_itype;\r\n  CV_CallKind        call_kind;\r\n  CV_FunctionAttribs attribs;\r\n  U16                arg_count;\r\n  CV_TypeId          arg_itype;\r\n  S32                this_adjust;\r\n};\r\n\r\n//- (LeafKind: ARGLIST)\r\n\r\ntypedef struct CV_LeafArgList CV_LeafArgList;\r\nstruct CV_LeafArgList\r\n{\r\n  U32 count;\r\n  // CV_TypeId[count] itypes;\r\n};\r\n\r\n//- (LeafKind: BITFIELD)\r\n\r\ntypedef struct CV_LeafBitField CV_LeafBitField;\r\nstruct CV_LeafBitField\r\n{\r\n  CV_TypeId itype;\r\n  U8        len;\r\n  U8        pos;\r\n};\r\n\r\n//- (LeafKind: METHODLIST)\r\n\r\n//   (\"jagged\" array of these vvvvvvvv)\r\ntypedef struct CV_LeafMethodListMember CV_LeafMethodListMember;\r\nstruct CV_LeafMethodListMember\r\n{\r\n  CV_FieldAttribs attribs;\r\n  U16             pad;\r\n  CV_TypeId       itype;\r\n  // U32 vbaseoff (when Intro or PureIntro)\r\n};\r\n\r\n//- (LeafKind: INDEX)\r\n\r\ntypedef struct CV_LeafIndex CV_LeafIndex;\r\nstruct CV_LeafIndex\r\n{\r\n  U16       pad;\r\n  CV_TypeId itype;\r\n};\r\n\r\n//- (LeafKind: ARRAY)\r\n\r\ntypedef struct CV_LeafArray CV_LeafArray;\r\nstruct CV_LeafArray\r\n{\r\n  CV_TypeId entry_itype;\r\n  CV_TypeId index_itype;\r\n  // CV_Numeric count\r\n};\r\n\r\n//- (LeafKind: CLASS, STRUCTURE, INTERFACE)\r\n\r\ntypedef struct CV_LeafStruct CV_LeafStruct;\r\nstruct CV_LeafStruct\r\n{\r\n  U16          count;\r\n  CV_TypeProps props;\r\n  CV_TypeId    field_itype;\r\n  CV_TypeId    derived_itype;\r\n  CV_TypeId    vshape_itype;\r\n  // CV_Numeric size\r\n  // U8[] name (null terminated)\r\n  // U8[] unique_name (null terminated)\r\n};\r\n\r\n//- (LeafKind: UNION)\r\n\r\ntypedef struct CV_LeafUnion CV_LeafUnion;\r\nstruct CV_LeafUnion\r\n{\r\n  U16          count;\r\n  CV_TypeProps props;\r\n  CV_TypeId    field_itype;\r\n  // CV_Numeric size\r\n  // U8[] name (null terminated)\r\n  // U8[] unique_name (null terminated)\r\n};\r\n\r\n//- (LeafKind: ENUM)\r\n\r\ntypedef struct CV_LeafEnum CV_LeafEnum;\r\nstruct CV_LeafEnum\r\n{\r\n  U16          count;\r\n  CV_TypeProps props;\r\n  CV_TypeId    base_itype;\r\n  CV_TypeId    field_itype;\r\n  // U8[] name (null terminated)\r\n  // U8[] unique_name (null terminated)\r\n};\r\n\r\n//- (LeafKind: ALIAS)\r\n\r\ntypedef struct CV_LeafAlias CV_LeafAlias;\r\nstruct CV_LeafAlias\r\n{\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: MEMBER)\r\n\r\ntypedef struct CV_LeafMember CV_LeafMember;\r\nstruct CV_LeafMember\r\n{\r\n  CV_FieldAttribs attribs;\r\n  CV_TypeId       itype;\r\n  // CV_Numeric offset\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: STMEMBER)\r\n\r\ntypedef struct CV_LeafStMember CV_LeafStMember;\r\nstruct CV_LeafStMember\r\n{\r\n  CV_FieldAttribs attribs;\r\n  CV_TypeId       itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: METHOD)\r\n\r\ntypedef struct CV_LeafMethod CV_LeafMethod;\r\nstruct CV_LeafMethod\r\n{\r\n  U16       count;\r\n  CV_TypeId list_itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: ONEMETHOD)\r\n\r\ntypedef struct CV_LeafOneMethod CV_LeafOneMethod;\r\nstruct CV_LeafOneMethod\r\n{\r\n  CV_FieldAttribs attribs;\r\n  CV_TypeId       itype;\r\n  // U32 vbaseoff (when Intro or PureIntro)\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: ENUMERATE)\r\n\r\ntypedef struct CV_LeafEnumerate CV_LeafEnumerate;\r\nstruct CV_LeafEnumerate\r\n{\r\n  CV_FieldAttribs attribs;\r\n  // CV_Numeric val\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: NESTTYPE)\r\n\r\ntypedef struct CV_LeafNestType CV_LeafNestType;\r\nstruct CV_LeafNestType\r\n{\r\n  U16       pad;\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: NESTTYPEEX)\r\n\r\ntypedef struct CV_LeafNestTypeEx CV_LeafNestTypeEx;\r\nstruct CV_LeafNestTypeEx\r\n{\r\n  CV_FieldAttribs attribs;\r\n  CV_TypeId       itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafKind: BCLASS)\r\n\r\ntypedef struct CV_LeafBClass CV_LeafBClass;\r\nstruct CV_LeafBClass\r\n{\r\n  CV_FieldAttribs attribs;\r\n  CV_TypeId       itype;\r\n  // CV_Numeric offset\r\n};\r\n\r\n//- (LeafKind: VBCLASS, IVBCLASS)\r\n\r\ntypedef struct CV_LeafVBClass CV_LeafVBClass;\r\nstruct CV_LeafVBClass\r\n{\r\n  CV_FieldAttribs attribs;\r\n  CV_TypeId       itype;\r\n  CV_TypeId       vbptr_itype;\r\n  // CV_Numeric vbptr_off\r\n  // CV_Numeric vtable_off\r\n};\r\n\r\n//- (LeafKind: VFUNCTAB)\r\n\r\ntypedef struct CV_LeafVFuncTab CV_LeafVFuncTab;\r\nstruct CV_LeafVFuncTab\r\n{\r\n  U16       pad;\r\n  CV_TypeId itype;\r\n};\r\n\r\n//- (LeafKind: VFUNCOFF)\r\n\r\ntypedef struct CV_LeafVFuncOff CV_LeafVFuncOff;\r\nstruct CV_LeafVFuncOff\r\n{\r\n  U16       pad;\r\n  CV_TypeId itype;\r\n  U32       off;\r\n};\r\n\r\n//- (LeafKind: VFTABLE)\r\n\r\ntypedef struct CV_LeafVFTable CV_LeafVFTable;\r\nstruct CV_LeafVFTable\r\n{\r\n  CV_TypeId owner_itype;\r\n  CV_TypeId base_table_itype;\r\n  U32       offset_in_object_layout;\r\n  U32       names_len;\r\n  // U8[] names (multiple null terminated strings)\r\n};\r\n\r\n//- (LeafKind: VFTPATH)\r\n\r\ntypedef struct CV_LeafVFPath CV_LeafVFPath;\r\nstruct CV_LeafVFPath\r\n{\r\n  U32 count;\r\n  // CV_TypeId[count] base;\r\n};\r\n\r\n//- (LeafKind: CLASS2, STRUCT2)\r\n\r\ntypedef struct CV_LeafStruct2 CV_LeafStruct2;\r\nstruct CV_LeafStruct2\r\n{\r\n  // NOTE: still reverse engineering this - if you find docs please help!\r\n  CV_TypeProps32 props;\r\n  CV_TypeId      field_itype;\r\n  CV_TypeId      derived_itype;\r\n  CV_TypeId      vshape_itype;\r\n  U16            unknown; // count for something? (possibly CV_Numeric)\r\n  // CV_Numeric size\r\n  // U8[] name (null terminated)\r\n  // U8[] unique_name (null terminated)\r\n};\r\n\r\n//- (LeafIDKind: FUNC_ID)\r\n\r\ntypedef struct CV_LeafFuncId CV_LeafFuncId;\r\nstruct CV_LeafFuncId\r\n{\r\n  CV_ItemId scope_string_id;\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafIDKind: MFUNC_ID)\r\n\r\ntypedef struct CV_LeafMFuncId CV_LeafMFuncId;\r\nstruct CV_LeafMFuncId\r\n{\r\n  CV_TypeId owner_itype;\r\n  CV_TypeId itype;\r\n  // U8[] name (null terminated)\r\n};\r\n\r\n//- (LeafIDKind: STRING_ID)\r\n\r\ntypedef struct CV_LeafStringId CV_LeafStringId;\r\nstruct CV_LeafStringId\r\n{\r\n  CV_ItemId substr_list_id;\r\n  // U8[] string (null terminated)\r\n};\r\n\r\n//- (LeafIDKind: BUILDINFO)\r\n\r\ntypedef enum CV_BuildInfoIndexEnum\r\n{\r\n  CV_BuildInfoIndex_BuildDirectory     = 0,\r\n  CV_BuildInfoIndex_CompilerExecutable = 1,\r\n  CV_BuildInfoIndex_TargetSourceFile   = 2,\r\n  CV_BuildInfoIndex_CombinedPdb        = 3,\r\n  CV_BuildInfoIndex_CompileArguments   = 4,\r\n}\r\nCV_BuildInfoIndexEnum;\r\n\r\ntypedef struct CV_LeafBuildInfo CV_LeafBuildInfo;\r\nstruct CV_LeafBuildInfo\r\n{\r\n  U16 count;\r\n  // CV_ItemId[count] items\r\n};\r\n\r\n//- (LeafIDKind: SUBSTR_LIST)\r\n\r\ntypedef struct CV_LeafSubstrList CV_LeafSubstrList;\r\nstruct CV_LeafSubstrList\r\n{\r\n  U32 count;\r\n  // CV_ItemId[count] items\r\n};\r\n\r\n//- (LeafIDKind: UDT_SRC_LINE)\r\n\r\ntypedef struct CV_LeafUDTSrcLine CV_LeafUDTSrcLine;\r\nstruct CV_LeafUDTSrcLine\r\n{\r\n  CV_TypeId udt_itype;\r\n  CV_ItemId src_string_id;\r\n  U32       line;\r\n};\r\n\r\n//- (LeafIDKind: UDT_MOD_SRC_LINE)\r\n\r\ntypedef struct CV_LeafUDTModSrcLine CV_LeafUDTModSrcLine;\r\nstruct CV_LeafUDTModSrcLine\r\n{\r\n  CV_TypeId   udt_itype;\r\n  CV_ItemId   src_string_id;\r\n  U32         line;\r\n  CV_ModIndex imod;\r\n};\r\n\r\n////////////////////////////////\r\n//~ CodeView Format C13 Line Info Types\r\n\r\n#define CV_C13SubSectionKind_IgnoreFlag 0x80000000\r\n\r\n#define CV_C13SubSectionKindXList(X) \\\r\nX(Symbols,             0xF1)       \\\r\nX(Lines,               0xF2)       \\\r\nX(StringTable,         0xF3)       \\\r\nX(FileChksms,          0xF4)       \\\r\nX(FrameData,           0xF5)       \\\r\nX(InlineeLines,        0xF6)       \\\r\nX(CrossScopeImports,   0xF7)       \\\r\nX(CrossScopeExports,   0xF8)       \\\r\nX(IlLines,             0xF9)       \\\r\nX(FuncMDTokenMap,      0xFA)       \\\r\nX(TypeMDTokenMap,      0xFB)       \\\r\nX(MergedAssemblyInput, 0xFC)       \\\r\nX(CoffSymbolRVA,       0xFD)       \\\r\nX(XfgHashType,         0xFF)       \\\r\nX(XfgHashVirtual,      0x100)\r\n\r\ntypedef U32 CV_C13SubSectionKind;\r\ntypedef enum CV_C13SubSectionKindEnum\r\n{\r\n#define X(N,c) CV_C13SubSectionKind_##N = c,\r\n  CV_C13SubSectionKindXList(X)\r\n#undef X\r\n}\r\nCV_C13SubSectionKindEnum;\r\n\r\ntypedef struct CV_C13SubSectionHeader CV_C13SubSectionHeader;\r\nstruct CV_C13SubSectionHeader\r\n{\r\n  CV_C13SubSectionKind kind;\r\n  U32                  size;\r\n};\r\n\r\n//- FileChksms sub-section\r\n\r\ntypedef U8 CV_C13ChecksumKind;\r\ntypedef enum CV_C13ChecksumKindEnum\r\n{\r\n  CV_C13ChecksumKind_Null,\r\n  CV_C13ChecksumKind_MD5,\r\n  CV_C13ChecksumKind_SHA1,\r\n  CV_C13ChecksumKind_SHA256,\r\n}\r\nCV_C13ChecksumKindEnum;\r\n\r\ntypedef struct CV_C13Checksum CV_C13Checksum;\r\nstruct CV_C13Checksum\r\n{\r\n  U32                name_off;\r\n  U8                 len;\r\n  CV_C13ChecksumKind kind;\r\n};\r\n\r\n//- Lines sub-section\r\n\r\ntypedef U16 CV_C13SubSecLinesFlags;\r\nenum\r\n{\r\n  CV_C13SubSecLinesFlag_HasColumns = (1 << 0)\r\n};\r\n\r\ntypedef struct CV_C13SubSecLinesHeader CV_C13SubSecLinesHeader;\r\nstruct CV_C13SubSecLinesHeader\r\n{\r\n  U32                    sec_off;\r\n  CV_SectionIndex        sec;\r\n  CV_C13SubSecLinesFlags flags;\r\n  U32                    len;\r\n};\r\n\r\ntypedef struct CV_C13File CV_C13File;\r\nstruct CV_C13File\r\n{\r\n  U32 file_off;\r\n  U32 num_lines;\r\n  U32 block_size;\r\n  // CV_C13Line[num_lines] lines;\r\n  // CV_C13Column[num_lines] columns; (if HasColumns)\r\n};\r\n\r\ntypedef U32 CV_C13LineFlags;\r\n#define CV_C13LineFlags_Extract_LineNumber(f) ((f)&0xFFFFFF)\r\n#define CV_C13LineFlags_Extract_DeltaToEnd(f) (((f)>>24)&0x7F)\r\n#define CV_C13LineFlags_Extract_Statement(f)  (((f)>>31)&0x1)\r\n\r\ntypedef struct CV_C13Line CV_C13Line;\r\nstruct CV_C13Line\r\n{\r\n  U32             off;\r\n  CV_C13LineFlags flags;\r\n};\r\n\r\ntypedef struct CV_C13Column CV_C13Column;\r\nstruct CV_C13Column\r\n{\r\n  U16 start;\r\n  U16 end;\r\n};\r\n\r\n//- FrameData sub-section\r\n\r\ntypedef U32 CV_C13FrameDataFlags;\r\nenum\r\n{\r\n  CV_C13FrameDataFlag_HasStructuredExceptionHandling = (1 << 0),\r\n  CV_C13FrameDataFlag_HasExceptionHandling           = (1 << 1),\r\n  CV_C13FrameDataFlag_HasIsFuncStart                 = (1 << 2),\r\n};\r\n\r\ntypedef struct CV_C13FrameData CV_C13FrameData;\r\nstruct CV_C13FrameData\r\n{\r\n  U32                  start_voff;\r\n  U32                  code_size;\r\n  U32                  local_size;\r\n  U32                  params_size;\r\n  U32                  max_stack_size;\r\n  U32                  frame_func;\r\n  U16                  prolog_size;\r\n  U16                  saved_reg_size;\r\n  CV_C13FrameDataFlags flags;\r\n};\r\n\r\n//- InlineLines sub-section \r\n\r\ntypedef U32 CV_C13InlineeLinesSig;\r\nenum\r\n{\r\n  CV_C13InlineeLinesSig_NORMAL,\r\n  CV_C13InlineeLinesSig_EXTRA_FILES,\r\n};\r\n\r\ntypedef struct CV_C13InlineeSourceLineHeader CV_C13InlineeSourceLineHeader;\r\nstruct CV_C13InlineeSourceLineHeader\r\n{\r\n  CV_ItemId inlinee;          // LF_FUNC_ID or LF_MFUNC_ID\r\n  U32       file_off;         // offset into FileChksms sub-section\r\n  U32       first_source_ln;  // base source line number for binary annotations\r\n  // if sig set to CV_C13InlineeLinesSig_EXTRA_FILES\r\n  //  U32 extra_file_count;\r\n  //  U32 files[];\r\n};\r\n\r\n#pragma pack(pop)\r\n\r\n////////////////////////////////\r\n//~ Type Index Helper\r\n\r\nenum CV_TypeIndexSource\r\n{\r\n  CV_TypeIndexSource_NULL,\r\n  CV_TypeIndexSource_TPI,\r\n  CV_TypeIndexSource_IPI,\r\n  CV_TypeIndexSource_COUNT\r\n};\r\ntypedef enum CV_TypeIndexSource CV_TypeIndexSource;\r\n\r\ntypedef struct CV_TypeIndexInfo CV_TypeIndexInfo;\r\nstruct CV_TypeIndexInfo\r\n{\r\n  struct CV_TypeIndexInfo *next;\r\n  U64                      offset;\r\n  CV_TypeIndexSource       source;\r\n};\r\n\r\ntypedef struct CV_TypeIndexInfoList CV_TypeIndexInfoList;\r\nstruct CV_TypeIndexInfoList\r\n{\r\n  U64               count;\r\n  CV_TypeIndexInfo *first;\r\n  CV_TypeIndexInfo *last;\r\n};\r\n\r\ntypedef struct CV_TypeIndexArray CV_TypeIndexArray;\r\nstruct CV_TypeIndexArray\r\n{\r\n  U32           count;\r\n  CV_TypeIndex *v;\r\n};\r\n\r\n////////////////////////////////\r\n\r\ninternal CV_Arch               cv_arch_from_coff_machine(COFF_MachineType machine);\r\ninternal U64                   cv_size_from_reg_x86(CV_Reg reg);\r\ninternal U64                   cv_size_from_reg_x64(CV_Reg reg);\r\ninternal U64                   cv_size_from_reg(CV_Arch arch, CV_Reg reg);\r\ninternal B32                   cv_is_reg_sp(CV_Arch arch, CV_Reg reg);\r\ninternal CV_EncodedFramePtrReg cv_pick_fp_encoding(CV_SymFrameproc *frameproc, B32 is_local_param);\r\ninternal CV_Reg                cv_decode_fp_reg(CV_Arch arch, CV_EncodedFramePtrReg encoded_reg);\r\ninternal U32                   cv_map_encoded_base_pointer(CV_Arch arch, U32 encoded_frame_reg);\r\n\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> String\r\n\r\ninternal String8 cv_string_from_inline_range_kind(CV_InlineRangeKind kind);\r\ninternal String8 cv_string_from_type_index_source(CV_TypeIndexSource ti_source);\r\ninternal String8 cv_string_from_language(CV_Language x);\r\ninternal String8 cv_string_from_reg_id(Arena *arena, CV_Arch arch, U32 id);\r\ninternal String8 cv_string_from_member_access(CV_MemberAccess x);\r\ninternal String8 cv_string_from_method_prop(CV_MethodProp x);\r\ninternal String8 cv_string_from_hfa(CV_HFAKind x);\r\ninternal String8 cv_string_from_mcom(CV_MoComUDTKind x);\r\ninternal String8 cv_string_from_binary_opcode(CV_InlineBinaryAnnotation x);\r\ninternal String8 cv_string_from_thunk_ordinal(CV_ThunkOrdinal x);\r\ninternal String8 cv_string_from_frame_cookie_kind(CV_FrameCookieKind x);\r\ninternal String8 cv_string_from_generic_style(CV_GenericStyle x);\r\ninternal String8 cv_string_from_trampoline_kind(CV_TrampolineKind x);\r\ninternal String8 cv_string_from_virtual_table_shape_kind(CV_VirtualTableShape x);\r\ninternal String8 cv_string_from_call_kind(CV_CallKind x);\r\ninternal String8 cv_string_from_member_pointer_kind(CV_MemberPointerKind x);\r\ninternal String8 cv_string_from_pointer_kind(CV_PointerKind x);\r\ninternal String8 cv_string_from_pointer_mode(CV_PointerMode x);\r\ninternal String8 cv_string_from_c13_checksum_kind(CV_C13ChecksumKind x);\r\ninternal String8 cv_string_from_label_kind(Arena *arena, CV_LabelKind x);\r\ninternal String8 cv_string_from_c13_subsection_kind(CV_C13SubSectionKind x);\r\ninternal String8 cv_string_from_modifier_flags(Arena *arena, CV_ModifierFlags x);\r\ninternal String8 cv_string_from_pointer_attribs(Arena *arena, CV_PointerAttribs x);\r\ninternal String8 cv_string_from_function_attribs(Arena *arena, CV_FunctionAttribs x);\r\ninternal String8 cv_string_from_export_flags(Arena *arena, CV_ExportFlags x);\r\ninternal String8 cv_string_from_sepcode(Arena *arena, CV_SepcodeFlags x);\r\ninternal String8 cv_string_from_pub32_flags(Arena *arena, CV_Pub32Flags x);\r\ninternal String8 cv_string_from_generic_flags(Arena *arena, CV_GenericFlags x);\r\ninternal String8 cv_string_from_frame_proc_flags(Arena *arena, CV_FrameprocFlags x);\r\ninternal String8 cv_string_from_type_props(Arena *arena, CV_TypeProps32 x);\r\ninternal String8 cv_string_from_local_flags(Arena *arena, CV_LocalFlags x);\r\ninternal String8 cv_string_from_proc_flags(Arena *arena, CV_ProcFlags x);\r\ninternal String8 cv_string_from_range_attribs(Arena *arena, CV_RangeAttribs x);\r\ninternal String8 cv_string_from_defrange_register_rel_flags(Arena *arena, CV_DefrangeRegisterRelFlags x);\r\ninternal String8 cv_string_from_field_attribs(Arena *arena, CV_FieldAttribs attribs);\r\ninternal String8 cv_string_from_itype(Arena *arena, CV_TypeIndex min_itype, CV_TypeIndex itype);\r\ninternal String8 cv_string_from_itemid(Arena *arena, CV_ItemId itemid);\r\ninternal String8 cv_string_from_symbol_type(Arena *arena, CV_SymKind symbol_type);\r\ninternal String8 cv_string_from_symbol_kind(Arena *arena, CV_SymKind kind);\r\ninternal String8 cv_string_from_leaf_name(Arena *arena, U32 leaf_type);\r\ninternal String8 cv_string_sec_off(Arena *arena, U32 sec, U32 off);\r\n\r\n#endif // CODEVIEW_H\r\n\r\n"
  },
  {
    "path": "src/codeview/codeview.mdesk",
    "content": "////////////////////////////////\r\n//~ rjf: CV Numerics\r\n\r\n@table(name val)\r\nCV_NumericKindTable:\r\n{\r\n  {CHAR           0x8000}\r\n  {SHORT          0x8001}\r\n  {USHORT         0x8002}\r\n  {LONG           0x8003}\r\n  {ULONG          0x8004}\r\n  {FLOAT32        0x8005}\r\n  {FLOAT64        0x8006}\r\n  {FLOAT80        0x8007}\r\n  {FLOAT128       0x8008}\r\n  {QUADWORD       0x8009}\r\n  {UQUADWORD      0x800a}\r\n  {FLOAT48        0x800b}\r\n  {COMPLEX32      0x800c}\r\n  {COMPLEX64      0x800d}\r\n  {COMPLEX80      0x800e}\r\n  {COMPLEX128     0x800f}\r\n  {VARSTRING      0x8010}\r\n  {OCTWORD        0x8017}\r\n  {UOCTWORD       0x8018}\r\n  {DECIMAL        0x8019}\r\n  {DATE           0x801a}\r\n  {UTF8STRING     0x801b}\r\n  {FLOAT16        0x801c}\r\n}\r\n\r\n@enum(U16) CV_NumericKind:\r\n{\r\n  @expand(CV_NumericKindTable a) `$(a.name) = $(a.val)`\r\n}\r\n\r\n@enum2string_switch(CV_NumericKind)\r\ncv_string_from_numeric_kind:\r\n{\r\n  @expand(CV_NumericKindTable a) `case CV_NumericKind_$(a.name):{result = str8_lit(\"$(a.name)\");}break`;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: CV Architectures\r\n\r\n@table(name val)\r\nCV_ArchTable:\r\n{\r\n  {8080         0x00}\r\n  {8086         0x01}\r\n  {80286        0x02}\r\n  {80386        0x03}\r\n  {80486        0x04}\r\n  {PENTIUM      0x05}\r\n  {PENTIUMII    0x06}\r\n  {PENTIUMIII   0x07}\r\n  {MIPS         0x10}\r\n  {MIPS16       0x11}\r\n  {MIPS32       0x12}\r\n  {MIPS64       0x13}\r\n  {MIPSI        0x14}\r\n  {MIPSII       0x15}\r\n  {MIPSIII      0x16}\r\n  {MIPSIV       0x17}\r\n  {MIPSV        0x18}\r\n  {M68000       0x20}\r\n  {M68010       0x21}\r\n  {M68020       0x22}\r\n  {M68030       0x23}\r\n  {M68040       0x24}\r\n  {ALPHA        0x30}\r\n  {ALPHA_21164  0x31}\r\n  {ALPHA_21164A 0x32}\r\n  {ALPHA_21264  0x33}\r\n  {ALPHA_21364  0x34}\r\n  {PPC601       0x40}\r\n  {PPC603       0x41}\r\n  {PPC604       0x42}\r\n  {PPC620       0x43}\r\n  {PPCFP        0x44}\r\n  {PPCBE        0x45}\r\n  {SH3          0x50}\r\n  {SH3E         0x51}\r\n  {SH3DSP       0x52}\r\n  {SH4          0x53}\r\n  {SHMEDIA      0x54}\r\n  {ARM3         0x60}\r\n  {ARM4         0x61}\r\n  {ARM4T        0x62}\r\n  {ARM5         0x63}\r\n  {ARM5T        0x64}\r\n  {ARM6         0x65}\r\n  {ARM_XMAC     0x66}\r\n  {ARM_WMMX     0x67}\r\n  {ARM7         0x68}\r\n  {OMNI         0x70}\r\n  {IA64_1       0x80}\r\n  {IA64_2       0x81}\r\n  {CEE          0x90}\r\n  {AM33         0xA0}\r\n  {M32R         0xB0}\r\n  {TRICORE      0xC0}\r\n  {X64          0xD0}\r\n  {EBC          0xE0}\r\n  {THUMB        0xF0}\r\n  {ARMNT        0xF4}\r\n  {ARM64        0xF6}\r\n  {D3D11_SHADER 0x100}\r\n}\r\n\r\n@enum(U16) CV_Arch:\r\n{\r\n  @expand(CV_ArchTable a) `$(a.name) = $(a.val)`,\r\n  `IA64        = CV_Arch_IA64_1`,\r\n  `PENTIUMPRO  = CV_Arch_PENTIUMII`,\r\n  `MIPSR4000   = CV_Arch_MIPS`,\r\n  `ALPHA_21064 = CV_Arch_ALPHA`,\r\n  `AMD64       = CV_Arch_X64`,\r\n}\r\n\r\n@enum2string_switch(CV_Arch)\r\ncv_string_from_arch:\r\n{\r\n  @expand(CV_ArchTable a) `case CV_Arch_$(a.name):{result = str8_lit(\"$(a.name)\");}break`;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: CV Registers\r\n\r\n@table(name val) CV_AllRegTable:\r\n{\r\n  {ERR    30000}\r\n  {TEB    30001}\r\n  {TIMER  30002}\r\n  {EFAD1  30003}\r\n  {EFAD2  30004}\r\n  {EFAD3  30005}\r\n  {VFRAME 30006}\r\n  {HANDLE 30007}\r\n  {PARAMS 30008}\r\n  {LOCALS 30009}\r\n  {TID    30010}\r\n  {ENV    30011}\r\n  {CMDLN  30012}\r\n}\r\n\r\n@enum(U16) CV_AllReg:\r\n{\r\n  @expand(CV_AllRegTable a) `$(a.name) = $(a.val)`\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: CV Sym Kinds\r\n\r\n@table(name  header_type_name  val) CV_SymKindTable:\r\n{\r\n  {COMPILE                                       Compile                            0x0001}\r\n  {REGISTER_16t                                  -                                  0x0002}\r\n  {CONSTANT_16t                                  -                                  0x0003}\r\n  {UDT_16t                                       -                                  0x0004}\r\n  {SSEARCH                                       StartSearch                        0x0005}\r\n  {END                                           -                                  0x0006}\r\n  {SKIP                                          -                                  0x0007}\r\n  {CVRESERVE                                     -                                  0x0008}\r\n  {OBJNAME_ST                                    -                                  0x0009}\r\n  {ENDARG                                        -                                  0x000a}\r\n  {COBOLUDT_16t                                  -                                  0x000b}\r\n  {MANYREG_16t                                   -                                  0x000c}\r\n  {RETURN                                        Return                             0x000d}\r\n  {ENTRYTHIS                                     -                                  0x000e}\r\n  {BPREL16                                       -                                  0x0100}\r\n  {LDATA16                                       -                                  0x0101}\r\n  {GDATA16                                       -                                  0x0102}\r\n  {PUB16                                         -                                  0x0103}\r\n  {LPROC16                                       -                                  0x0104}\r\n  {GPROC16                                       -                                  0x0105}\r\n  {THUNK16                                       -                                  0x0106}\r\n  {BLOCK16                                       -                                  0x0107}\r\n  {WITH16                                        -                                  0x0108}\r\n  {LABEL16                                       -                                  0x0109}\r\n  {CEXMODEL16                                    -                                  0x010a}\r\n  {VFTABLE16                                     -                                  0x010b}\r\n  {REGREL16                                      -                                  0x010c}\r\n  {BPREL32_16t                                   -                                  0x0200}\r\n  {LDATA32_16t                                   -                                  0x0201}\r\n  {GDATA32_16t                                   -                                  0x0202}\r\n  {PUB32_16t                                     -                                  0x0203}\r\n  {LPROC32_16t                                   -                                  0x0204}\r\n  {GPROC32_16t                                   -                                  0x0205}\r\n  {THUNK32_ST                                    -                                  0x0206}\r\n  {BLOCK32_ST                                    -                                  0x0207}\r\n  {WITH32_ST                                     -                                  0x0208}\r\n  {LABEL32_ST                                    -                                  0x0209}\r\n  {CEXMODEL32                                    -                                  0x020a}\r\n  {VFTABLE32_16t                                 -                                  0x020b}\r\n  {REGREL32_16t                                  -                                  0x020c}\r\n  {LTHREAD32_16t                                 -                                  0x020d}\r\n  {GTHREAD32_16t                                 -                                  0x020e}\r\n  {SLINK32                                       SLink32                            0x020f}\r\n  {LPROCMIPS_16t                                 -                                  0x0300}\r\n  {GPROCMIPS_16t                                 -                                  0x0301}\r\n  {PROCREF_ST                                    -                                  0x0400}\r\n  {DATAREF_ST                                    -                                  0x0401}\r\n  {ALIGN                                         -                                  0x0402}\r\n  {LPROCREF_ST                                   -                                  0x0403}\r\n  {OEM                                           OEM                                0x0404}\r\n  {TI16_MAX                                      -                                  0x1000}\r\n  {CONSTANT_ST                                   -                                  0x1002}\r\n  {UDT_ST                                        -                                  0x1003}\r\n  {COBOLUDT_ST                                   -                                  0x1004}\r\n  {MANYREG_ST                                    -                                  0x1005}\r\n  {BPREL32_ST                                    -                                  0x1006}\r\n  {LDATA32_ST                                    -                                  0x1007}\r\n  {GDATA32_ST                                    -                                  0x1008}\r\n  {PUB32_ST                                      -                                  0x1009}\r\n  {LPROC32_ST                                    -                                  0x100a}\r\n  {GPROC32_ST                                    -                                  0x100b}\r\n  {VFTABLE32                                     VPath32                            0x100c}\r\n  {REGREL32_ST                                   -                                  0x100d}\r\n  {LTHREAD32_ST                                  -                                  0x100e}\r\n  {GTHREAD32_ST                                  -                                  0x100f}\r\n  {LPROCMIPS_ST                                  -                                  0x1010}\r\n  {GPROCMIPS_ST                                  -                                  0x1011}\r\n  {FRAMEPROC                                     Frameproc                          0x1012}\r\n  {COMPILE2_ST                                   -                                  0x1013}\r\n  {MANYREG2_ST                                   -                                  0x1014}\r\n  {LPROCIA64_ST                                  -                                  0x1015}\r\n  {GPROCIA64_ST                                  -                                  0x1016}\r\n  {LOCALSLOT_ST                                  -                                  0x1017}\r\n  {PARAMSLOT_ST                                  -                                  0x1018}\r\n  {ANNOTATION                                    Annotation                         0x1019}\r\n  {GMANPROC_ST                                   -                                  0x101a}\r\n  {LMANPROC_ST                                   -                                  0x101b}\r\n  {RESERVED1                                     -                                  0x101c}\r\n  {RESERVED2                                     -                                  0x101d}\r\n  {RESERVED3                                     -                                  0x101e}\r\n  {RESERVED4                                     -                                  0x101f}\r\n  {LMANDATA_ST                                   -                                  0x1020}\r\n  {GMANDATA_ST                                   -                                  0x1021}\r\n  {MANFRAMEREL_ST                                -                                  0x1022}\r\n  {MANREGISTER_ST                                -                                  0x1023}\r\n  {MANSLOT_ST                                    -                                  0x1024}\r\n  {MANMANYREG_ST                                 -                                  0x1025}\r\n  {MANREGREL_ST                                  -                                  0x1026}\r\n  {MANMANYREG2_ST                                -                                  0x1027}\r\n  {MANTYPREF                                     -                                  0x1028}\r\n  {UNAMESPACE_ST                                 -                                  0x1029}\r\n  {ST_MAX                                        -                                  0x1100}\r\n  {OBJNAME                                       ObjName                            0x1101}\r\n  {THUNK32                                       Thunk32                            0x1102}\r\n  {BLOCK32                                       Block32                            0x1103}\r\n  {WITH32                                        -                                  0x1104}\r\n  {LABEL32                                       Label32                            0x1105}\r\n  {REGISTER                                      Register                           0x1106}\r\n  {CONSTANT                                      Constant                           0x1107}\r\n  {UDT                                           UDT                                0x1108}\r\n  {COBOLUDT                                      -                                  0x1109}\r\n  {MANYREG                                       Manyreg                            0x110a}\r\n  {BPREL32                                       BPRel32                            0x110b}\r\n  {LDATA32                                       Data32                             0x110c}\r\n  {GDATA32                                       Data32                             0x110d}\r\n  {PUB32                                         Pub32                              0x110e}\r\n  {LPROC32                                       Proc32                             0x110f}\r\n  {GPROC32                                       Proc32                             0x1110}\r\n  {REGREL32                                      Regrel32                           0x1111}\r\n  {LTHREAD32                                     Thread32                           0x1112}\r\n  {GTHREAD32                                     Thread32                           0x1113}\r\n  {LPROCMIPS                                     -                                  0x1114}\r\n  {GPROCMIPS                                     -                                  0x1115}\r\n  {COMPILE2                                      Compile2                           0x1116}\r\n  {MANYREG2                                      Manyreg2                           0x1117}\r\n  {LPROCIA64                                     -                                  0x1118}\r\n  {GPROCIA64                                     -                                  0x1119}\r\n  {LOCALSLOT                                     Slot                               0x111a}\r\n  {PARAMSLOT                                     -                                  0x111b}\r\n  {LMANDATA                                      -                                  0x111c}\r\n  {GMANDATA                                      -                                  0x111d}\r\n  {MANFRAMEREL                                   AttrFrameRel                       0x111e}\r\n  {MANREGISTER                                   AttrReg                            0x111f}\r\n  {MANSLOT                                       -                                  0x1120}\r\n  {MANMANYREG                                    AttrManyReg                        0x1121}\r\n  {MANREGREL                                     AttrRegRel                         0x1122}\r\n  {MANMANYREG2                                   -                                  0x1123}\r\n  {UNAMESPACE                                    UNamespace                         0x1124}\r\n  {PROCREF                                       Ref2                               0x1125}\r\n  {DATAREF                                       Ref2                               0x1126}\r\n  {LPROCREF                                      Ref2                               0x1127}\r\n  {ANNOTATIONREF                                 -                                  0x1128}\r\n  {TOKENREF                                      -                                  0x1129}\r\n  {GMANPROC                                      -                                  0x112a}\r\n  {LMANPROC                                      -                                  0x112b}\r\n  {TRAMPOLINE                                    Trampoline                         0x112c}\r\n  {MANCONSTANT                                   -                                  0x112d}\r\n  {ATTR_FRAMEREL                                 AttrFrameRel                       0x112e}\r\n  {ATTR_REGISTER                                 AttrReg                            0x112f}\r\n  {ATTR_REGREL                                   AttrRegRel                         0x1130}\r\n  {ATTR_MANYREG                                  AttrManyReg                        0x1131}\r\n  {SEPCODE                                       Sepcode                            0x1132}\r\n  {DEFRANGE_2005                                 -                                  0x1134}\r\n  {DEFRANGE2_2005                                -                                  0x1135}\r\n  {SECTION                                       Section                            0x1136}\r\n  {COFFGROUP                                     CoffGroup                          0x1137}\r\n  {EXPORT                                        Export                             0x1138}\r\n  {CALLSITEINFO                                  CallSiteInfo                       0x1139}\r\n  {FRAMECOOKIE                                   FrameCookie                        0x113a}\r\n  {DISCARDED                                     Discarded                          0x113b}\r\n  {COMPILE3                                      Compile3                           0x113c}\r\n  {ENVBLOCK                                      EnvBlock                           0x113d}\r\n  {LOCAL                                         Local                              0x113e}\r\n  {DEFRANGE                                      -                                  0x113f}\r\n  {DEFRANGE_SUBFIELD                             DefrangeSubfield                   0x1140}\r\n  {DEFRANGE_REGISTER                             DefrangeRegister                   0x1141}\r\n  {DEFRANGE_FRAMEPOINTER_REL                     DefrangeFramepointerRel            0x1142}\r\n  {DEFRANGE_SUBFIELD_REGISTER                    DefrangeSubfieldRegister           0x1143}\r\n  {DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE          DefrangeFramepointerRelFullScope   0x1144}\r\n  {DEFRANGE_REGISTER_REL                         DefrangeRegisterRel                0x1145}\r\n  {LPROC32_ID                                    -                                  0x1146}\r\n  {GPROC32_ID                                    -                                  0x1147}\r\n  {LPROCMIPS_ID                                  -                                  0x1148}\r\n  {GPROCMIPS_ID                                  -                                  0x1149}\r\n  {LPROCIA64_ID                                  -                                  0x114a}\r\n  {GPROCIA64_ID                                  -                                  0x114b}\r\n  {BUILDINFO                                     BuildInfo                          0x114c}\r\n  {INLINESITE                                    InlineSite                         0x114d}\r\n  {INLINESITE_END                                -                                  0x114e}\r\n  {PROC_ID_END                                   -                                  0x114f}\r\n  {DEFRANGE_HLSL                                 -                                  0x1150}\r\n  {GDATA_HLSL                                    -                                  0x1151}\r\n  {LDATA_HLSL                                    -                                  0x1152}\r\n  {FILESTATIC                                    FileStatic                         0x1153}\r\n  {LPROC32_DPC                                   -                                  0x1155}\r\n  {LPROC32_DPC_ID                                -                                  0x1156}\r\n  {DEFRANGE_DPC_PTR_TAG                          -                                  0x1157}\r\n  {DPC_SYM_TAG_MAP                               -                                  0x1158}\r\n  {ARMSWITCHTABLE                                -                                  0x1159}\r\n  {CALLEES                                       FunctionList                       0x115a}\r\n  {CALLERS                                       FunctionList                       0x115b}\r\n  {POGODATA                                      PogoInfo                           0x115c}\r\n  {INLINESITE2                                   InlineSite2                        0x115d}\r\n  {HEAPALLOCSITE                                 HeapAllocSite                      0x115e}\r\n  {MOD_TYPEREF                                   ModTypeRef                         0x115f}\r\n  {REF_MINIPDB                                   RefMiniPdb                         0x1160}\r\n  {PDBMAP                                        -                                  0x1161}\r\n  {GDATA_HLSL32                                  -                                  0x1162}\r\n  {LDATA_HLSL32                                  -                                  0x1163}\r\n  {GDATA_HLSL32_EX                               -                                  0x1164}\r\n  {LDATA_HLSL32_EX                               -                                  0x1165}\r\n  {FASTLINK                                      FastLink                           0x1167}\r\n  {INLINEES                                      Inlinees                           0x1168}\r\n}\r\n\r\n@enum(U16) CV_SymKind:\r\n{\r\n  @expand(CV_SymKindTable a) `$(a.name) = $(a.val)`\r\n}\r\n\r\n@enum2string_switch(CV_SymKind)\r\ncv_string_from_sym_kind:\r\n{\r\n  @expand(CV_SymKindTable a) `case CV_SymKind_$(a.name):{result = str8_lit(\"$(a.name)\");}break`;\r\n}\r\n\r\n@gen(functions)\r\n{\r\n  `internal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);`;\r\n}\r\n\r\n@gen(functions) @c_file\r\n{\r\n  `internal U64`;\r\n  `cv_header_struct_size_from_sym_kind(CV_SymKind v)`;\r\n  `{`;\r\n    `U64 result = 0;`;\r\n    `switch(v)`;\r\n    `{`;\r\n      `default:{}break;`;\r\n      @expand(CV_SymKindTable a) `$(a.header_type_name != \"-\" -> \"case CV_SymKind_\"..a.name..\":{result = sizeof(CV_Sym\"..a.header_type_name..\");}break;\")`;\r\n      `}`;\r\n    `return result;`;\r\n    `}`;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: CV Basic Types\r\n\r\n@table(name val type_name)\r\nCV_BasicTypeTable:\r\n{\r\n  {NOTYPE     0x00    \"\"                         }\r\n  {ABS        0x01    \"\"                         }\r\n  {SEGMENT    0x02    \"\"                         }\r\n  {VOID       0x03    \"void\"                     }\r\n  {CURRENCY   0x04    \"\"                         }\r\n  {NBASICSTR  0x05    \"\"                         }\r\n  {FBASICSTR  0x06    \"\"                         }\r\n  {NOTTRANS   0x07    \"\"                         }\r\n  {HRESULT    0x08    \"HRESULT\"                  }\r\n  {CHAR       0x10    \"CHAR\"                     }\r\n  {SHORT      0x11    \"SHORT\"                    }\r\n  {LONG       0x12    \"LONG\"                     }\r\n  {QUAD       0x13    \"QUAD\"                     }\r\n  {OCT        0x14    \"OCT\"                      }\r\n  {UCHAR      0x20    \"UCHAR\"                    }\r\n  {USHORT     0x21    \"USHORT\"                   }\r\n  {ULONG      0x22    \"ULONG\"                    }\r\n  {UQUAD      0x23    \"UQUAD\"                    }\r\n  {UOCT       0x24    \"UOCT\"                     }\r\n  {BOOL8      0x30    \"BOOL8\"                    }\r\n  {BOOL16     0x31    \"BOOL16\"                   }\r\n  {BOOL32     0x32    \"BOOL32\"                   }\r\n  {BOOL64     0x33    \"BOOL64\"                   }\r\n  {FLOAT32    0x40    \"FLOAT32\"                  }\r\n  {FLOAT64    0x41    \"FLOAT64\"                  }\r\n  {FLOAT80    0x42    \"FLOAT80\"                  }\r\n  {FLOAT128   0x43    \"FLOAT128\"                 }\r\n  {FLOAT48    0x44    \"FLOAT48\"                  }\r\n  {FLOAT32PP  0x45    \"FLOAT32PP\"                }\r\n  {FLOAT16    0x46    \"FLOAT16\"                  }\r\n  {COMPLEX32  0x50    \"ComplexF32\"               }\r\n  {COMPLEX64  0x51    \"ComplexF64\"               }\r\n  {COMPLEX80  0x52    \"ComplexF80\"               }\r\n  {COMPLEX128 0x53    \"ComplexF128\"              }\r\n  {BIT        0x60    \"\"                         }\r\n  {PASCHAR    0x61    \"\"                         }\r\n  {BOOL32FF   0x62    \"BOOL32FF\"                 }\r\n  {INT8       0x68    \"int8\"                     }\r\n  {UINT8      0x69    \"uint8\"                    }\r\n  {RCHAR      0x70    \"char\"                     }\r\n  {WCHAR      0x71    \"WCHAR\"                    }\r\n  {INT16      0x72    \"int16\"                    }\r\n  {UINT16     0x73    \"uint16\"                   }\r\n  {INT32      0x74    \"int32\"                    }\r\n  {UINT32     0x75    \"uint32\"                   }\r\n  {INT64      0x76    \"int64\"                    }\r\n  {UINT64     0x77    \"uint64\"                   }\r\n  {INT128     0x78    \"int128\"                   }\r\n  {UINT128    0x79    \"uint128\"                  }\r\n  {CHAR16     0x7a    \"char16\"                   }\r\n  {CHAR32     0x7b    \"char32\"                   }\r\n  {CHAR8      0x7c    \"char\"                     }\r\n  {PTR        0xf0    \"PTR\"                      }\r\n}\r\n\r\n@enum(U8) CV_BasicType:\r\n{\r\n  @expand(CV_BasicTypeTable a) `$(a.name) = $(a.val)`\r\n}\r\n\r\n@enum2string_switch(CV_BasicType) cv_string_from_basic_type:\r\n{\r\n  @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit(\"$(a.name)\");}break`\r\n}\r\n\r\n@enum2string_switch(CV_BasicType) cv_type_name_from_basic_type:\r\n{\r\n  @expand(CV_BasicTypeTable a) `case CV_BasicType_$(a.name):{result = str8_lit(\"$(a.type_name)\");}break`\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: CV Leaf Kinds\r\n\r\n@table(name  header_type_name  val)\r\nCV_LeafKindTable:\r\n{\r\n  {NOTYPE                        -                            0x0000}\r\n  {MODIFIER_16t                  -                            0x0001}\r\n  {POINTER_16t                   -                            0x0002}\r\n  {ARRAY_16t                     -                            0x0003}\r\n  {CLASS_16t                     -                            0x0004}\r\n  {STRUCTURE_16t                 -                            0x0005}\r\n  {UNION_16t                     -                            0x0006}\r\n  {ENUM_16t                      -                            0x0007}\r\n  {PROCEDURE_16t                 -                            0x0008}\r\n  {MFUNCTION_16t                 -                            0x0009}\r\n  {VTSHAPE                       VTShape                      0x000a}\r\n  {COBOL0_16t                    -                            0x000b}\r\n  {COBOL1                        -                            0x000c}\r\n  {BARRAY_16t                    -                            0x000d}\r\n  {LABEL                         Label                        0x000e}\r\n  {NULL                          -                            0x000f}\r\n  {NOTTRAN                       -                            0x0010}\r\n  {DIMARRAY_16t                  -                            0x0011}\r\n  {VFTPATH_16t                   -                            0x0012}\r\n  {PRECOMP_16t                   -                            0x0013}\r\n  {ENDPRECOMP                    -                            0x0014}\r\n  {OEM_16t                       -                            0x0015}\r\n  {TYPESERVER_ST                 -                            0x0016}\r\n  {SKIP_16t                      -                            0x0200}\r\n  {ARGLIST_16t                   -                            0x0201}\r\n  {DEFARG_16t                    -                            0x0202}\r\n  {LIST                          -                            0x0203}\r\n  {FIELDLIST_16t                 -                            0x0204}\r\n  {DERIVED_16t                   -                            0x0205}\r\n  {BITFIELD_16t                  -                            0x0206}\r\n  {METHODLIST_16t                -                            0x0207}\r\n  {DIMCONU_16t                   -                            0x0208}\r\n  {DIMCONLU_16t                  -                            0x0209}\r\n  {DIMVARU_16t                   -                            0x020a}\r\n  {DIMVARLU_16t                  -                            0x020b}\r\n  {REFSYM                        -                            0x020c}\r\n  {BCLASS_16t                    -                            0x0400}\r\n  {VBCLASS_16t                   -                            0x0401}\r\n  {IVBCLASS_16t                  -                            0x0402}\r\n  {ENUMERATE_ST                  -                            0x0403}\r\n  {FRIENDFCN_16t                 -                            0x0404}\r\n  {INDEX_16t                     -                            0x0405}\r\n  {MEMBER_16t                    -                            0x0406}\r\n  {STMEMBER_16t                  -                            0x0407}\r\n  {METHOD_16t                    -                            0x0408}\r\n  {NESTTYPE_16t                  -                            0x0409}\r\n  {VFUNCTAB_16t                  -                            0x040a}\r\n  {FRIENDCLS_16t                 -                            0x040b}\r\n  {ONEMETHOD_16t                 -                            0x040c}\r\n  {VFUNCOFF_16t                  -                            0x040d}\r\n  {TI16_MAX                      -                            0x1000}\r\n  {MODIFIER                      Modifier                     0x1001}\r\n  {POINTER                       Pointer                      0x1002}\r\n  {ARRAY_ST                      -                            0x1003}\r\n  {CLASS_ST                      -                            0x1004}\r\n  {STRUCTURE_ST                  -                            0x1005}\r\n  {UNION_ST                      -                            0x1006}\r\n  {ENUM_ST                       -                            0x1007}\r\n  {PROCEDURE                     Procedure                    0x1008}\r\n  {MFUNCTION                     MFunction                    0x1009}\r\n  {COBOL0                        -                            0x100a}\r\n  {BARRAY                        -                            0x100b}\r\n  {DIMARRAY_ST                   -                            0x100c}\r\n  {VFTPATH                       VFPath                       0x100d}\r\n  {PRECOMP_ST                    -                            0x100e}\r\n  {OEM                           -                            0x100f}\r\n  {ALIAS_ST                      -                            0x1010}\r\n  {OEM2                          -                            0x1011}\r\n  {SKIP                          Skip                         0x1200}\r\n  {ARGLIST                       ArgList                      0x1201}\r\n  {DEFARG_ST                     -                            0x1202}\r\n  {FIELDLIST                     -                            0x1203}\r\n  {DERIVED                       -                            0x1204}\r\n  {BITFIELD                      BitField                     0x1205}\r\n  {METHODLIST                    MethodListMember             0x1206}\r\n  {DIMCONU                       -                            0x1207}\r\n  {DIMCONLU                      -                            0x1208}\r\n  {DIMVARU                       -                            0x1209}\r\n  {DIMVARLU                      -                            0x120a}\r\n  {BCLASS                        BClass                       0x1400}\r\n  {VBCLASS                       VBClass                      0x1401}\r\n  {IVBCLASS                      -                            0x1402}\r\n  {FRIENDFCN_ST                  -                            0x1403}\r\n  {INDEX                         Index                        0x1404}\r\n  {MEMBER_ST                     -                            0x1405}\r\n  {STMEMBER_ST                   -                            0x1406}\r\n  {METHOD_ST                     -                            0x1407}\r\n  {NESTTYPE_ST                   -                            0x1408}\r\n  {VFUNCTAB                      VFuncTab                     0x1409}\r\n  {FRIENDCLS                     -                            0x140a}\r\n  {ONEMETHOD_ST                  -                            0x140b}\r\n  {VFUNCOFF                      VFuncOff                     0x140c}\r\n  {NESTTYPEEX_ST                 -                            0x140d}\r\n  {MEMBERMODIFY_ST               -                            0x140e}\r\n  {MANAGED_ST                    -                            0x140f}\r\n  {ST_MAX                        -                            0x1500}\r\n  {TYPESERVER                    TypeServer                   0x1501}\r\n  {ENUMERATE                     Enumerate                    0x1502}\r\n  {ARRAY                         Array                        0x1503}\r\n  {CLASS                         Struct                       0x1504}\r\n  {STRUCTURE                     Struct                       0x1505}\r\n  {UNION                         Union                        0x1506}\r\n  {ENUM                          Enum                         0x1507}\r\n  {DIMARRAY                      -                            0x1508}\r\n  {PRECOMP                       PreComp                      0x1509}\r\n  {ALIAS                         Alias                        0x150a}\r\n  {DEFARG                        -                            0x150b}\r\n  {FRIENDFCN                     -                            0x150c}\r\n  {MEMBER                        Member                       0x150d}\r\n  {STMEMBER                      StMember                     0x150e}\r\n  {METHOD                        Method                       0x150f}\r\n  {NESTTYPE                      NestType                     0x1510}\r\n  {ONEMETHOD                     OneMethod                    0x1511}\r\n  {NESTTYPEEX                    NestTypeEx                   0x1512}\r\n  {MEMBERMODIFY                  -                            0x1513}\r\n  {MANAGED                       -                            0x1514}\r\n  {TYPESERVER2                   TypeServer2                  0x1515}\r\n  {STRIDED_ARRAY                 -                            0x1516}\r\n  {HLSL                          -                            0x1517}\r\n  {MODIFIER_EX                   -                            0x1518}\r\n  {INTERFACE                     Struct                       0x1519}\r\n  {BINTERFACE                    -                            0x151a}\r\n  {VECTOR                        -                            0x151b}\r\n  {MATRIX                        -                            0x151c}\r\n  {VFTABLE                       -                            0x151d}\r\n  {FUNC_ID                       FuncId                       0x1601}\r\n  {MFUNC_ID\t\t\t\t\t\t          MFuncId                      0x1602}\r\n  {BUILDINFO                     BuildInfo                    0x1603}\r\n  {SUBSTR_LIST                   SubstrList                   0x1604}\r\n  {STRING_ID                     StringId                     0x1605}\r\n  {UDT_SRC_LINE                  UDTSrcLine                   0x1606}\r\n  {UDT_MOD_SRC_LINE              UDTModSrcLine                0x1607}\r\n  {CLASS2                        Struct2                      0x1608}\r\n  {STRUCT2                       Struct2                      0x1609}\r\n}\r\n\r\n@enum(U16) CV_LeafKind:\r\n{\r\n  @expand(CV_LeafKindTable a) `$(a.name) = $(a.val)`;\r\n}\r\n\r\n@enum2string_switch(CV_LeafKind)\r\ncv_string_from_leaf_kind:\r\n{\r\n  @expand(CV_LeafKindTable a) `case CV_LeafKind_$(a.name):{result = str8_lit(\"$(a.name)\");}break`;\r\n}\r\n\r\n@gen(functions)\r\n{\r\n  `internal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v);`;\r\n}\r\n\r\n@gen(functions) @c_file\r\n{\r\n  `internal U64`;\r\n  `cv_header_struct_size_from_leaf_kind(CV_LeafKind v)`;\r\n  `{`;\r\n    `U64 result = 0;`;\r\n    `switch(v)`;\r\n    `{`;\r\n      `default:{}break;`;\r\n      @expand(CV_LeafKindTable a) `$(a.header_type_name != \"-\" -> \"case CV_LeafKind_\"..a.name..\":{result = sizeof(CV_Leaf\"..a.header_type_name..\");}break;\")`;\r\n      `}`;\r\n    `return result;`;\r\n    `}`;\r\n}\r\n"
  },
  {
    "path": "src/codeview/codeview_dump.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8\ncv_string_from_numeric(Arena *arena, CV_NumericParsed num)\n{\n  String8 result = str8_zero();\n  switch (num.kind) {\n    case CV_NumericKind_FLOAT16:   NotImplemented; break; // TODO: format float16\n    case CV_NumericKind_FLOAT32:   result = push_str8f(arena, \"%f\", (F64)(*(F32*)num.val)); break;\n    case CV_NumericKind_FLOAT48:   NotImplemented; break; // TODO: format float48\n    case CV_NumericKind_FLOAT64:   result = push_str8f(arena, \"%f\", *(F64*)num.val); break;\n    case CV_NumericKind_FLOAT80:   NotImplemented; break; // TODO: format float80\n    case CV_NumericKind_FLOAT128:  NotImplemented; break; // TODO: format float128\n    case CV_NumericKind_CHAR:      result = push_str8f(arena, \"%d\",   *(S8 *)num.val); break;\n    case CV_NumericKind_SHORT:     result = push_str8f(arena, \"%d\",   *(S16*)num.val); break;\n    case CV_NumericKind_LONG:      result = push_str8f(arena, \"%d\",   *(S32*)num.val); break;\n    case CV_NumericKind_QUADWORD:  result = push_str8f(arena, \"%lld\", *(S64*)num.val); break;\n    case CV_NumericKind_USHORT:    result = push_str8f(arena, \"%u\",   *(U16*)num.val); break;\n    case CV_NumericKind_ULONG:     result = push_str8f(arena, \"%u\",   *(U32*)num.val); break;\n    case CV_NumericKind_UQUADWORD: result = push_str8f(arena, \"%llu\", *(U64*)num.val); break;\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/codeview/codeview_dump.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef CODEVIEW_DUMP_H\n#define CODEVIEW_DUMP_H\n\ninternal String8 cv_string_from_numeric(Arena *arena, CV_NumericParsed num);\n\n#endif // CODEVIEW_DUMP_H\n"
  },
  {
    "path": "src/codeview/codeview_parse.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n//- Hasher\n\ninternal U64\ncv_hash_from_string(String8 string)\n{\n  U64 result = 5381;\n  for(U64 i = 0; i < string.size; i += 1)\n  {\n    result = ((result << 5) + result) + string.str[i];\n  }\n  return result;\n}\n\ninternal U64\ncv_hash_from_item_id(CV_ItemId item_id)\n{\n  U64 result = cv_hash_from_string(str8_struct(&item_id));\n  return result;\n}\n\n//- Numeric Decoder\n\ninternal CV_NumericParsed\ncv_numeric_from_data_range(U8 *first, U8 *opl)\n{\n  CV_NumericParsed result = {0};\n  if(first + 2 <= opl)\n  {\n    U16 x = *(U16*)first;\n    if(x < 0x8000)\n    {\n      result.kind = CV_NumericKind_USHORT;\n      result.val = first;\n      result.encoded_size = 2;\n    }\n    else\n    {\n      U64 val_size = 0;\n      switch(x)\n      {\n        case CV_NumericKind_CHAR:      val_size = 1; break;\n        case CV_NumericKind_SHORT:\n        case CV_NumericKind_USHORT:    val_size = 2; break;\n        case CV_NumericKind_LONG:\n        case CV_NumericKind_ULONG:     val_size = 4; break;\n        case CV_NumericKind_FLOAT32:   val_size = 4; break;\n        case CV_NumericKind_FLOAT64:   val_size = 8; break;\n        case CV_NumericKind_FLOAT80:   val_size = 10; break;\n        case CV_NumericKind_FLOAT128:  val_size = 16; break;\n        case CV_NumericKind_QUADWORD:\n        case CV_NumericKind_UQUADWORD: val_size = 8; break;\n        case CV_NumericKind_FLOAT48:   val_size = 6; break;\n        case CV_NumericKind_COMPLEX32: val_size = 8; break;\n        case CV_NumericKind_COMPLEX64: val_size = 16; break;\n        case CV_NumericKind_COMPLEX80: val_size = 20; break;\n        case CV_NumericKind_COMPLEX128:val_size = 32; break;\n        case CV_NumericKind_VARSTRING: val_size = 0; break; // TODO: ???\n        case CV_NumericKind_OCTWORD:\n        case CV_NumericKind_UOCTWORD:  val_size = 16; break;\n        case CV_NumericKind_DECIMAL:   val_size = 0; break; // TODO: ???\n        case CV_NumericKind_DATE:      val_size = 0; break; // TODO: ???\n        case CV_NumericKind_UTF8STRING:val_size = 0; break; // TODO: ???\n        case CV_NumericKind_FLOAT16:   val_size = 2; break;\n      }\n      if(first + 2 + val_size <= opl)\n      {\n        result.kind = x;\n        result.val = (first + 2);\n        result.encoded_size = 2 + val_size;\n      }\n    }\n  }\n  return result;\n}\n\ninternal U64\ncv_read_numeric(String8 data, U64 offset, CV_NumericParsed *out)\n{\n  *out = cv_numeric_from_data_range(data.str + offset, data.str + data.size);\n  return out->encoded_size;\n}\n\ninternal B32\ncv_numeric_fits_in_u64(CV_NumericParsed *num)\n{\n  B32 result = 0;\n  switch(num->kind)\n  {\n    case CV_NumericKind_USHORT:\n    case CV_NumericKind_ULONG:\n    case CV_NumericKind_UQUADWORD:\n    {\n      result = 1;\n    }break;\n  }\n  return result;\n}\n\ninternal B32\ncv_numeric_fits_in_s64(CV_NumericParsed *num)\n{\n  B32 result = 0;\n  switch(num->kind)\n  {\n    case CV_NumericKind_CHAR:\n    case CV_NumericKind_SHORT:\n    case CV_NumericKind_LONG:\n    case CV_NumericKind_QUADWORD:\n    {\n      result = 1;\n    }break;\n  }\n  return result;\n}\n\ninternal B32\ncv_numeric_fits_in_f64(CV_NumericParsed *num)\n{\n  B32 result = 0;\n  switch(num->kind)\n  {\n    case CV_NumericKind_FLOAT32:\n    case CV_NumericKind_FLOAT64:\n    {\n      result = 1;\n    }break;\n  }\n  return result;\n}\n\ninternal U64\ncv_u64_from_numeric(CV_NumericParsed *num)\n{\n  U64 result = 0;\n  switch(num->kind)\n  {\n    case CV_NumericKind_CHAR:     {result = (U64)(S64)*(S8*)num->val;}break;\n    case CV_NumericKind_SHORT:    {result = (U64)(S64)*(S16*)num->val;}break;\n    case CV_NumericKind_LONG:     {result = (U64)(S64)*(S32*)num->val;}break;\n    case CV_NumericKind_QUADWORD: {result = (U64)(S64)*(S64*)num->val;}break;\n    case CV_NumericKind_USHORT:   {result = *(U16*)num->val;}break;\n    case CV_NumericKind_ULONG:    {result = *(U32*)num->val;}break;\n    case CV_NumericKind_UQUADWORD:{result = *(U64*)num->val;}break;\n  }\n  return result;\n}\n\ninternal S64\ncv_s64_from_numeric(CV_NumericParsed *num)\n{\n  S64 result = 0;\n  switch(num->kind)\n  {\n    case CV_NumericKind_CHAR:     {result = *(S8*)num->val;}break;\n    case CV_NumericKind_SHORT:    {result = *(S16*)num->val;}break;\n    case CV_NumericKind_LONG:     {result = *(S32*)num->val;}break;\n    case CV_NumericKind_QUADWORD: {result = *(S64*)num->val;}break;\n  }\n  return(result);\n}\n\ninternal F64\ncv_f64_from_numeric(CV_NumericParsed *num)\n{\n  F64 result = 0;\n  switch(num->kind)\n  {\n    case CV_NumericKind_FLOAT32:{result = *(F32*)num->val;}break;\n    case CV_NumericKind_FLOAT64:{result = *(F64*)num->val;}break;\n  }\n  return(result);\n}\n\n//- Inline Site Binary Annot Decoder\n\ninternal U64\ncv_decode_inline_annot_u32(String8 data, U64 offset, U32 *out_value)\n{\n  U64 cursor = offset;\n  \n  // rjf: read header\n  U8 header = 0;\n  cursor += str8_deserial_read_struct(data, cursor, &header);\n  \n  // rjf: decode value\n  U32 value = 0;\n  {\n    // 1 byte\n    if((header & 0x80) == 0)\n    {\n      value = header;\n    }\n    \n    // 2 bytes\n    else if((header & 0xC0) == 0x80 && cursor+1 <= data.size)\n    {\n      U8 second_byte;\n      cursor += str8_deserial_read_struct(data, cursor, &second_byte);\n      value = ((header & 0x3F) << 8) | second_byte;\n    }\n    \n    // 4 bytes\n    else if((header & 0xE0) == 0xC0 && cursor+3 <= data.size)\n    {\n      U8 second_byte, third_byte, fourth_byte;\n      cursor += str8_deserial_read_struct(data, cursor, &second_byte);\n      cursor += str8_deserial_read_struct(data, cursor, &third_byte);\n      cursor += str8_deserial_read_struct(data, cursor, &fourth_byte);\n      value = (((U32)header & 0x1F) << 24) | ((U32)second_byte << 16) | ((U32)third_byte << 8) | (U32)fourth_byte;\n    }\n    \n    // bad encode\n    else if((header & 0xE0) == 0xE0)\n    {\n      value = max_U32;\n    }\n  }\n  \n  // rjf: output results\n  if(out_value)\n  {\n    *out_value = value;\n  }\n  \n  U64 read_size = cursor - offset;\n  return read_size;\n}\n\ninternal U64\ncv_decode_inline_annot_s32(String8 data, U64 offset, S32 *out_value)\n{\n  U32 value;\n  U64 read_size = cv_decode_inline_annot_u32(data, offset, &value);\n  if(value & 1)\n  {\n    value = -(value >> 1);\n  }\n  else\n  {\n    value = value >> 1;\n  }\n  *out_value = (S32)value;\n  return read_size;\n}\n\ninternal S32\ncv_inline_annot_signed_from_unsigned_operand(U32 value)\n{\n  if(value & 1)\n  {\n    value = -(value >> 1);\n  }\n  else\n  {\n    value = value >> 1;\n  }\n  S32 result = (S32)value;\n  return result;\n}\n\ninternal CV_C13InlineSiteDecoder\ncv_c13_inline_site_decoder_init(U32 file_off, U32 first_source_ln, U32 parent_voff)\n{\n  CV_C13InlineSiteDecoder decoder = {0};\n  decoder.parent_voff             = parent_voff;\n  decoder.file_off                = file_off;\n  decoder.ln                      = (S32)first_source_ln;\n  decoder.cn                      = 1;\n  decoder.ln_changed              = 1;\n  return decoder;\n}\n\ninternal CV_C13InlineSiteDecoderStep\ncv_c13_inline_site_decoder_step(CV_C13InlineSiteDecoder *decoder, String8 binary_annots)\n{\n  CV_C13InlineSiteDecoderStep result = {0};\n  \n  for (; decoder->cursor < binary_annots.size && result.flags == 0; ) {\n    U32 op = CV_InlineBinaryAnnotation_Null;\n    decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &op);\n    \n    switch (op) {\n      case CV_InlineBinaryAnnotation_Null: {\n        decoder->cursor              = binary_annots.size;\n        // this is last run, append range with left over code bytes\n        decoder->code_length         = decoder->code_offset - decoder->code_offset_lo;\n        decoder->code_length_changed = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_CodeOffset: {\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &decoder->code_offset);\n        decoder->code_offset_changed = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: {\n        AssertAlways(!\"TODO: test case\");\n        // U32 delta = 0;\n        // decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &delta);\n        // decoder->code_offset_base = decoder->code_offset;\n        // decoder->code_offset_end  = decoder->code_offset + delta;\n        // decoder->code_offset     += delta;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeOffset: {\n        U32 delta = 0;\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &delta);\n        \n        decoder->code_offset += delta;\n        \n        if (!decoder->code_offset_lo_changed) {\n          decoder->code_offset_lo         = decoder->code_offset;\n          decoder->code_offset_lo_changed = 1;\n        }\n        decoder->code_offset_changed = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeLength: {\n        decoder->code_length = 0;\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &decoder->code_length);\n        decoder->code_length_changed = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeFile: {\n        U32 old_file_off = decoder->file_off;\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &decoder->file_off);\n        decoder->file_off_changed = old_file_off != decoder->file_off;\n        // Compiler isn't obligated to terminate code sequence before chaning files,\n        // so we have to always force emit code range on file change.\n        decoder->code_length_changed = decoder->file_off_changed;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeLineOffset: {\n        S32 delta = 0;\n        decoder->cursor += cv_decode_inline_annot_s32(binary_annots, decoder->cursor, &delta);\n        \n        decoder->ln         += delta;\n        decoder->ln_changed  = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeLineEndDelta: {\n        AssertAlways(!\"TODO: test case\");\n        // S32 end_delta = 1;\n        // decoder->cursor += cv_decode_inline_annot_s32(binary_annots, decoder->cursor, &end_delta);\n        // decoder->ln += end_delta;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeRangeKind: {\n        AssertAlways(!\"TODO: test case\");\n        // decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &range_kind);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeColumnStart: {\n        AssertAlways(!\"TODO: test case\");\n        // S32 delta;\n        // decoder->cursor += cv_decode_inline_annot_s32(binary_annots, decoder->cursor, &delta);\n        // decoder->cn += delta;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeColumnEndDelta: {\n        AssertAlways(!\"TODO: test case\");\n        // S32 end_delta;\n        // decoder->cursor += cv_decode_inline_annot_s32(binary_annots, decoder->cursor, &end_delta);\n        // decoder->cn += end_delta;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: {\n        U32 code_offset_and_line_offset = 0;\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &code_offset_and_line_offset);\n        \n        S32 line_delta = cv_inline_annot_signed_from_unsigned_operand(code_offset_and_line_offset >> 4);\n        U32 code_delta = (code_offset_and_line_offset & 0xf);\n        \n        decoder->code_offset += code_delta;\n        decoder->ln          += line_delta;\n        \n        if (!decoder->code_offset_lo_changed) {\n          decoder->code_offset_lo         = decoder->code_offset;\n          decoder->code_offset_lo_changed = 1;\n        }\n        \n        decoder->code_offset_changed = 1;\n        decoder->ln_changed          = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: {\n        U32 offset_delta = 0;\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &decoder->code_length);\n        decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &offset_delta); \n        \n        decoder->code_offset += offset_delta;\n        \n        if (!decoder->code_offset_lo_changed) {\n          decoder->code_offset_lo         = decoder->code_offset;\n          decoder->code_offset_lo_changed = 1;\n        }\n        \n        decoder->code_offset_changed = 1;\n        decoder->code_length_changed = 1;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeColumnEnd: {\n        AssertAlways(!\"TODO: test case\");\n        // U32 column_end = 0;\n        // decoder->cursor += cv_decode_inline_annot_u32(binary_annots, decoder->cursor, &column_end);\n      } break;\n    }\n    \n    U64 line_code_offset = decoder->code_offset;\n    \n    if (decoder->code_length_changed) {\n      // compute upper bound of the range\n      U64 code_offset_hi = decoder->code_offset + decoder->code_length;\n      \n      // can last code range be extended to cover current sequence too?\n      if (decoder->last_range.max == decoder->parent_voff + decoder->code_offset_lo) {\n        decoder->last_range.max = decoder->parent_voff + code_offset_hi;\n        \n        result.flags |= CV_C13InlineSiteDecoderStepFlag_ExtendLastRange;\n        result.range  = decoder->last_range;\n      } else {\n        decoder->last_range      = rng_1u64(decoder->parent_voff + decoder->code_offset_lo, decoder->parent_voff + code_offset_hi);\n        decoder->file_last_range = decoder->last_range;\n        \n        result.flags |= CV_C13InlineSiteDecoderStepFlag_EmitRange;\n        result.range  = decoder->last_range;\n      }\n      \n      // update state\n      decoder->code_offset_lo         = code_offset_hi;\n      decoder->code_offset           += decoder->code_length;\n      decoder->code_offset_lo_changed = 0;\n      decoder->code_length_changed    = 0;\n      decoder->code_length            = 0;\n    }\n    \n    if (decoder->file_off_changed || (decoder->file_count == 0)) {\n      result.flags    |= CV_C13InlineSiteDecoderStepFlag_EmitFile;\n      result.file_off  = decoder->file_off;\n      \n      // update state\n      decoder->file_last_range   = decoder->last_range;\n      decoder->file_off_changed  = 0;\n      decoder->file_count       += 1;\n      decoder->file_line_count   = 0;\n    }\n    \n    if (decoder->code_offset_changed && decoder->ln_changed) {\n      if (decoder->file_line_count == 0 || decoder->file_last_ln != decoder->ln) {\n        result.flags         |= CV_C13InlineSiteDecoderStepFlag_EmitLine;\n        result.ln             = decoder->ln;\n        result.cn             = decoder->cn;\n        result.line_voff      = decoder->parent_voff + line_code_offset;\n        result.line_voff_end  = decoder->last_range.max;\n        \n        // update state\n        decoder->file_line_count += 1;\n        decoder->file_last_ln     = decoder->ln;\n      }\n      \n      // update state\n      decoder->code_offset_changed = 0;\n      decoder->ln_changed          = 0;\n    }\n  }\n  \n  return result;\n}\n\n//- Symbol/Leaf Helpers\n\ninternal B32\ncv_is_udt_name_anon(String8 name)\n{\n  // corresponds to fUDTAnon from dbi/tm.cpp:817\n  B32 is_anon = str8_match_lit(\"<unnamed-tag>\",   name, 0) ||\n    str8_match_lit(\"__unnamed\",       name, 0) ||\n    str8_match_lit(\"::<unnamed-tag>\", name, StringMatchFlag_RightSideSloppy) ||\n    str8_match_lit(\"::__unnamed\",     name, StringMatchFlag_RightSideSloppy);\n  return is_anon;\n}\n\ninternal B32\ncv_is_udt(CV_LeafKind kind)\n{\n  B32 is_udt = kind == CV_LeafKind_CLASS            ||\n    kind == CV_LeafKind_STRUCTURE        || \n    kind == CV_LeafKind_CLASS2           || \n    kind == CV_LeafKind_STRUCT2          || \n    kind == CV_LeafKind_INTERFACE        || \n    kind == CV_LeafKind_UNION            || \n    kind == CV_LeafKind_ENUM             || \n    kind == CV_LeafKind_UDT_MOD_SRC_LINE || \n    kind == CV_LeafKind_UDT_SRC_LINE     || \n    kind == CV_LeafKind_ALIAS;\n  return is_udt;\n}\n\ninternal B32\ncv_is_global_symbol(CV_SymKind kind)\n{\n  B32 is_global_symbol = kind == CV_SymKind_CONSTANT       ||\n    kind == CV_SymKind_GDATA16        ||\n    kind == CV_SymKind_GDATA32_16t    ||\n    kind == CV_SymKind_GDATA32_ST     ||\n    kind == CV_SymKind_GDATA32        ||\n    kind == CV_SymKind_GTHREAD32_16t  ||\n    kind == CV_SymKind_GTHREAD32_ST   ||\n    kind == CV_SymKind_GTHREAD32;\n  return is_global_symbol;\n}\n\ninternal B32\ncv_is_typedef(CV_SymKind kind)\n{\n  B32 is_typedef = kind == CV_SymKind_UDT_16t ||\n    kind == CV_SymKind_UDT_ST  ||\n    kind == CV_SymKind_UDT;\n  return is_typedef;\n}\n\ninternal B32\ncv_is_scope_symbol(CV_SymKind kind)\n{\n  B32 is_scope = kind == CV_SymKind_GPROC32     || \n    kind == CV_SymKind_LPROC32     || \n    kind == CV_SymKind_BLOCK32     || \n    kind == CV_SymKind_THUNK32     || \n    kind == CV_SymKind_INLINESITE  ||\n    kind == CV_SymKind_INLINESITE2 || \n    kind == CV_SymKind_WITH32      ||\n    kind == CV_SymKind_SEPCODE     ||\n    kind == CV_SymKind_GPROC32_ID  ||\n    kind == CV_SymKind_LPROC32_ID;\n  return is_scope;\n}\n\ninternal B32\ncv_is_end_symbol(CV_SymKind kind)\n{\n  B32 is_end = kind == CV_SymKind_END         ||\n    kind == CV_SymKind_PROC_ID_END ||\n    kind == CV_SymKind_INLINESITE_END;\n  return is_end;\n}\n\ninternal B32\ncv_is_leaf_type_server(CV_LeafKind kind)\n{\n  B32 is_type_server = kind == CV_LeafKind_TYPESERVER  ||\n    kind == CV_LeafKind_TYPESERVER2 ||\n    kind == CV_LeafKind_TYPESERVER_ST;\n  return is_type_server;\n}\n\ninternal B32\ncv_is_leaf_pch(CV_LeafKind kind)\n{\n  B32 is_pch = kind == CV_LeafKind_PRECOMP    ||\n    kind == CV_LeafKind_PRECOMP_ST ||\n    kind == CV_LeafKind_PRECOMP_16t;\n  return is_pch;\n}\n\ninternal CV_TypeIndexSource\ncv_type_index_source_from_leaf_kind(CV_LeafKind leaf_kind)\n{\n  CV_TypeIndexSource source;\n  if(leaf_kind == CV_LeafKind_FUNC_ID      ||\n     leaf_kind == CV_LeafKind_MFUNC_ID     ||\n     leaf_kind == CV_LeafKind_BUILDINFO    ||\n     leaf_kind == CV_LeafKind_SUBSTR_LIST  ||\n     leaf_kind == CV_LeafKind_STRING_ID    ||\n     leaf_kind == CV_LeafKind_UDT_SRC_LINE ||\n     leaf_kind == CV_LeafKind_UDT_MOD_SRC_LINE)\n  {\n    source = CV_TypeIndexSource_IPI;\n  }\n  else if(leaf_kind == CV_LeafKind_NOTYPE)\n  {\n    source = CV_TypeIndexSource_NULL;\n  }\n  else\n  {\n    source = CV_TypeIndexSource_TPI;\n  }\n  return source;\n}\n\ninternal CV_TypeIndexInfo *\ncv_symbol_type_index_info_push(Arena *arena, CV_TypeIndexInfoList *list, CV_TypeIndexSource source, U64 offset)\n{\n  CV_TypeIndexInfo *info = push_array_no_zero(arena, CV_TypeIndexInfo, 1);\n  info->next   = 0;\n  info->offset = offset;\n  info->source = source;\n  \n  SLLQueuePush(list->first, list->last, info);\n  list->count += 1;\n  \n  return info;\n}\n\ninternal CV_TypeIndexInfoList\ncv_get_symbol_type_index_offsets(Arena *arena, CV_SymKind kind, String8 data)\n{\n  CV_TypeIndexInfoList list = {0};\n  switch (kind) {\n    case CV_SymKind_BUILDINFO: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_SymBuildInfo, id));\n    } break;\n    case CV_SymKind_GDATA32:\n    case CV_SymKind_LDATA32: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymData32, itype));\n    } break;\n    case CV_SymKind_LPROC32_ID:\n    case CV_SymKind_GPROC32_ID: \n    case CV_SymKind_LPROC32_DPC_ID: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_SymProc32, itype));\n    } break;\n    case CV_SymKind_GPROC32:\n    case CV_SymKind_LPROC32: \n    case CV_SymKind_LPROC32_DPC: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymProc32, itype));\n    } break;\n    case CV_SymKind_UDT: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymUDT, itype));\n    } break;\n    case CV_SymKind_GTHREAD32:\n    case CV_SymKind_LTHREAD32: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymThread32, itype));\n    } break;\n    case CV_SymKind_FILESTATIC: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymFileStatic, itype));\n    } break;\n    case CV_SymKind_LOCAL: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymLocal, itype));\n    } break;\n    case CV_SymKind_REGREL32: \n    case CV_SymKind_BPREL32: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymRegrel32, itype));\n    } break;\n    case CV_SymKind_REGISTER: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymRegister, itype));\n    } break;\n    case CV_SymKind_CONSTANT: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymConstant, itype));\n    } break;\n    case CV_SymKind_CALLSITEINFO: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymCallSiteInfo, itype));\n    } break;\n    case CV_SymKind_CALLERS:\n    case CV_SymKind_CALLEES:\n    case CV_SymKind_INLINEES: {\n      Assert(data.size >= sizeof(CV_SymFunctionList));\n      CV_SymFunctionList *func_list = (CV_SymFunctionList*)data.str;\n      for (U64 i = 0; i < func_list->count; ++i) {\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, sizeof(CV_SymFunctionList) + i * sizeof(CV_TypeIndex));\n      }\n    } break;\n    case CV_SymKind_INLINESITE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_SymInlineSite, inlinee));\n    } break;\n    case CV_SymKind_HEAPALLOCSITE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_SymHeapAllocSite, itype));\n    } break;\n  }\n  return list;\n}\n\ninternal CV_TypeIndexInfoList\ncv_get_leaf_type_index_offsets(Arena *arena, CV_LeafKind leaf_kind, String8 data)\n{\n  CV_TypeIndexInfoList list = {0};\n  switch (leaf_kind) {\n    case CV_LeafKind_NOTYPE:\n    case CV_LeafKind_VTSHAPE:\n    case CV_LeafKind_LABEL:\n    case CV_LeafKind_NULL: \n    case CV_LeafKind_NOTTRAN: {\n      // no type indices\n    } break;\n    case CV_LeafKind_MODIFIER: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafModifier, itype));\n    } break;\n    case CV_LeafKind_POINTER: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafPointer, itype));\n      CV_LeafPointer *ptr = (CV_LeafPointer *)data.str;\n      CV_PointerKind ptr_kind = CV_PointerAttribs_Extract_Kind(ptr->attribs);\n      if (ptr_kind == CV_PointerKind_BaseType) {\n        // TODO: add CV_LeafPointerBaseType\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafPointer) + 0);\n      } else {\n        CV_PointerMode ptr_mode = CV_PointerAttribs_Extract_Mode(ptr->attribs);\n        if (ptr_mode == CV_PointerMode_PtrMem || ptr_mode == CV_PointerMode_PtrMethod) {\n          // TODO: add type for the CvLeafPointerMember to syms_cv.mc\n          cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafPointer) + 0);\n        }\n      }\n    } break;\n    case CV_LeafKind_ARRAY: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafArray, entry_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafArray, index_itype));\n    } break;\n    case CV_LeafKind_CLASS: \n    case CV_LeafKind_STRUCTURE:\n    case CV_LeafKind_INTERFACE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct, field_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct, derived_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct, vshape_itype));\n    } break;\n    case CV_LeafKind_CLASS2:\n    case CV_LeafKind_STRUCT2: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct2, field_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct2, derived_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafStruct2, vshape_itype));\n    } break;\n    case CV_LeafKind_UNION: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafUnion, field_itype));\n    } break;\n    case CV_LeafKind_ALIAS: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafAlias, itype));\n    } break;\n    case CV_LeafKind_FUNC_ID: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafFuncId, scope_string_id));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafFuncId, itype));\n    } break;\n    case CV_LeafKind_MFUNC_ID: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFuncId, owner_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFuncId, itype));\n    } break;\n    case CV_LeafKind_STRING_ID: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafStringId, substr_list_id));\n    } break;\n    case CV_LeafKind_UDT_SRC_LINE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafUDTSrcLine, udt_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafUDTSrcLine, src_string_id));\n    } break;\n    case CV_LeafKind_UDT_MOD_SRC_LINE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafUDTModSrcLine, udt_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, OffsetOf(CV_LeafUDTModSrcLine, src_string_id));\n    } break;\n    case CV_LeafKind_BUILDINFO: {\n      Assert(data.size >= sizeof(CV_LeafBuildInfo));\n      CV_LeafBuildInfo *build_info = (CV_LeafBuildInfo *)data.str;\n      for (U16 i = 0; i < build_info->count; ++i) {\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, sizeof(CV_LeafBuildInfo) + i * sizeof(CV_ItemId));\n      }\n    } break;\n    case CV_LeafKind_ENUM: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafEnum, base_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafEnum, field_itype));\n    } break;\n    case CV_LeafKind_PROCEDURE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafProcedure, ret_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafProcedure, arg_itype));\n    } break;\n    case CV_LeafKind_MFUNCTION: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, ret_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, class_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, this_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMFunction, arg_itype));\n    } break;\n    case CV_LeafKind_VFTABLE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFTable, owner_itype));\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFTable, base_table_itype));\n    } break;\n    case CV_LeafKind_VFTPATH: {\n      Assert(sizeof(CV_LeafVFPath) <= data.size);\n      CV_LeafVFPath *vfpath = (CV_LeafVFPath *)data.str;\n      for (U32 i = 0; i < vfpath->count; ++i) {\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafVFPath) + i * sizeof(CV_TypeId));\n      }\n    } break;\n    case CV_LeafKind_TYPESERVER:\n    case CV_LeafKind_TYPESERVER2:\n    case CV_LeafKind_TYPESERVER_ST: {\n      // no type indices\n    } break;\n    case CV_LeafKind_SKIP: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafSkip, itype));\n    } break;\n    case CV_LeafKind_SUBSTR_LIST: {\n      Assert(sizeof(CV_LeafArgList) <= data.size);\n      CV_LeafArgList *arg_list = (CV_LeafArgList*)data.str;\n      for (U32 i = 0; i < arg_list->count; ++i) {\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, sizeof(CV_LeafArgList) + i * sizeof(CV_TypeIndex));\n      }\n    } break;\n    case CV_LeafKind_ARGLIST: {\n      Assert(sizeof(CV_LeafArgList) <= data.size);\n      CV_LeafArgList *arg_list = (CV_LeafArgList*)data.str;\n      for (U32 i = 0; i < arg_list->count; ++i) {\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, sizeof(CV_LeafArgList) + i * sizeof(CV_TypeIndex));\n      }\n    } break;\n    case CV_LeafKind_LIST: \n    case CV_LeafKind_FIELDLIST: {\n      for (U64 cursor = 0; cursor < data.size; ) {\n        CV_LeafKind list_member_kind = 0;\n        U64 read_size = str8_deserial_read_struct(data, cursor, &list_member_kind);\n        \n        if(read_size != sizeof(list_member_kind)) {\n          Assert(!\"malformed LF_FIELDLIST\");\n          break;\n        }\n        cursor += read_size;\n        \n        switch (list_member_kind) {\n          default: Assert(!\"TODO: handle malformed field member\"); break;\n          case CV_LeafKind_INDEX: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafIndex, itype));\n            cursor += sizeof(CV_LeafIndex);\n          } break;\n          case CV_LeafKind_MEMBER: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafMember, itype));\n            cursor += sizeof(CV_LeafMember);\n            \n            CV_NumericParsed size;\n            cursor += cv_read_numeric(data, cursor, &size);\n            \n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_STMEMBER: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafStMember, itype));\n            cursor += sizeof(CV_LeafStMember);\n            \n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_METHOD: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafMethod, list_itype));\n            cursor += sizeof(CV_LeafMethod);\n            \n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_ONEMETHOD: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafOneMethod, itype));\n            \n            CV_LeafOneMethod onemethod;\n            cursor += str8_deserial_read_struct(data, cursor, &onemethod);\n            \n            CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(onemethod.attribs);\n            if(prop == CV_MethodProp_PureIntro || prop == CV_MethodProp_Intro)\n            {\n              cursor += sizeof(U32); // virtoff\n            }\n            \n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_ENUMERATE: {\n            // no type index\n            cursor += sizeof(CV_LeafEnumerate);\n            CV_NumericParsed value;\n            cursor += cv_read_numeric(data, cursor, &value);\n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_NESTTYPE: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafNestType, itype));\n            cursor += sizeof(CV_LeafNestType);\n            \n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_NESTTYPEEX: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafNestTypeEx, itype));\n            \n            cursor += sizeof(CV_LeafNestTypeEx);\n            String8 name;\n            cursor += str8_deserial_read_cstr(data, cursor, &name);\n          } break;\n          case CV_LeafKind_BCLASS: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafBClass, itype));\n            \n            cursor += sizeof(CV_LeafBClass);\n            CV_NumericParsed offset;\n            cursor += cv_read_numeric(data, cursor, &offset);\n          } break;\n          case CV_LeafKind_VBCLASS:\n          case CV_LeafKind_IVBCLASS: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafVBClass, itype));\n            cursor += sizeof(CV_LeafVBClass);\n            \n            CV_NumericParsed virtual_base_pointer;\n            cursor += cv_read_numeric(data, cursor, &virtual_base_pointer);\n            \n            CV_NumericParsed virtual_base_offset;\n            cursor += cv_read_numeric(data, cursor, &virtual_base_offset);\n          } break;\n          case CV_LeafKind_VFUNCTAB: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafVFuncTab, itype));\n            cursor += sizeof(CV_LeafVFuncTab);\n          } break;\n          case CV_LeafKind_VFUNCOFF: {\n            cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafVFuncOff, itype));\n            cursor += sizeof(CV_LeafVFuncOff);\n          } break;\n        }\n        cursor = AlignPow2(cursor, 4);\n      }\n    } break;\n    case CV_LeafKind_METHOD: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMethod, list_itype));\n    } break;\n    case CV_LeafKind_METHODLIST: {\n      for (U64 cursor = 0; cursor < data.size; ) {\n        // read method\n        CV_LeafMethodListMember method;\n        U64 read_size = str8_deserial_read_struct(data, cursor, &method);\n        \n        // error check read\n        if (read_size != sizeof(method)) {\n          Assert(!\"malformed LF_METHODLIST\");\n          break;\n        }\n        \n        // push type index offset\n        cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, cursor + OffsetOf(CV_LeafMethodListMember, itype));\n        \n        // take into account intro virtual offset\n        CV_MethodProp mprop = CV_FieldAttribs_Extract_MethodProp(method.attribs);\n        if (mprop == CV_MethodProp_Intro || mprop == CV_MethodProp_PureIntro) {\n          read_size += sizeof(U32);\n        }\n        \n        // advance\n        cursor += read_size;\n      }\n    } break;\n    case CV_LeafKind_ONEMETHOD: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafOneMethod, itype));\n    } break;\n    case CV_LeafKind_BITFIELD: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafBitField, itype));\n    } break;\n    case CV_LeafKind_PRECOMP:\n    case CV_LeafKind_REFSYM: {\n      // no type indices\n    } break;\n    case CV_LeafKind_INDEX: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafIndex, itype));\n    } break;\n    case CV_LeafKind_MEMBER: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafMember, itype));\n    } break;\n    case CV_LeafKind_VFUNCTAB: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFuncTab, itype));\n    } break;\n    case CV_LeafKind_VFUNCOFF: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafVFuncOff, itype));\n    } break;\n    case CV_LeafKind_NESTTYPE: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafNestType, itype));\n    } break;\n    case CV_LeafKind_NESTTYPEEX: {\n      cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_TPI, OffsetOf(CV_LeafNestTypeEx, itype));\n    } break;\n    default: {\n      NotImplemented;\n    } break;\n  }\n  return list;\n}\n\ninternal CV_TypeIndexInfoList\ncv_get_inlinee_type_index_offsets(Arena *arena, String8 raw_data)\n{\n  CV_TypeIndexInfoList list = {0};\n  \n  U64 cursor = 0;\n  \n  // first four bytes are always signature\n  CV_C13InlineeLinesSig sig = max_U32;\n  cursor += str8_deserial_read_struct(raw_data, cursor, &sig);\n  \n  while(cursor < raw_data.size)\n  {\n    // read header\n    CV_C13InlineeSourceLineHeader *header = (CV_C13InlineeSourceLineHeader *) str8_deserial_get_raw_ptr(raw_data, cursor, sizeof(CV_C13InlineeSourceLineHeader));\n    \n    // store type index offset\n    cv_symbol_type_index_info_push(arena, &list, CV_TypeIndexSource_IPI, cursor + OffsetOf(CV_C13InlineeSourceLineHeader, inlinee));\n    \n    // advance past header\n    cursor += sizeof(*header);\n    \n    // skip extra files\n    B32 has_extra_files = (sig == CV_C13InlineeLinesSig_EXTRA_FILES);\n    if (has_extra_files)\n    {\n      U32 file_count = 0;\n      cursor += str8_deserial_read_struct(raw_data, cursor, &file_count);\n      cursor += /* file id: */ sizeof(U32) * file_count;\n    }\n  }\n  \n  return list;\n}\n\ninternal String8Array\ncv_get_data_around_type_indices(Arena *arena, CV_TypeIndexInfoList ti_list, String8 data)\n{\n  String8Array result;\n  if(ti_list.count > 0)\n  {\n    result.count = ti_list.count + 1;\n    result.v = push_array_no_zero(arena, String8, result.count);\n    \n    U64 cursor = 0;\n    U64 ti_idx = 0;\n    \n    for(CV_TypeIndexInfo *ti_info = ti_list.first; ti_info != 0; ti_info = ti_info->next, ++ti_idx)\n    {\n      result.v[ti_idx].size = ti_info->offset - cursor;\n      result.v[ti_idx].str  = data.str + cursor;\n      cursor = ti_info->offset + sizeof(CV_TypeIndex);\n    }\n    \n    result.v[result.count-1].size = data.size - cursor;\n    result.v[result.count-1].str  = data.str + cursor;\n  }\n  else\n  {\n    result.count = 1;\n    result.v = push_array_no_zero(arena, String8, 1);\n    result.v[0] = data;\n  }\n  return result;\n}\n\ninternal U64\ncv_name_offset_from_symbol(CV_SymKind kind, String8 data)\n{\n  U64 offset = data.size;\n  switch (kind) {\n    case CV_SymKind_COMPILE: break;\n    case CV_SymKind_OBJNAME: break;\n    case CV_SymKind_THUNK32: {\n      offset = sizeof(CV_SymThunk32); \n    } break;\n    case CV_SymKind_LABEL32: {\n      offset = sizeof(CV_SymLabel32); \n    } break;\n    case CV_SymKind_REGISTER: {\n      offset = sizeof(CV_SymRegister); \n    } break;\n    case CV_SymKind_CONSTANT: {\n      offset = sizeof(CV_SymConstant);\n      CV_NumericParsed size;\n      offset += cv_read_numeric(data, offset, &size);\n    } break;\n    case CV_SymKind_UDT: {\n      offset = sizeof(CV_SymUDT);\n    } break;\n    case CV_SymKind_BPREL32: {\n      offset = sizeof(CV_SymBPRel32);\n    } break;\n    case CV_SymKind_LDATA32:\n    case CV_SymKind_GDATA32: {\n      offset = sizeof(CV_SymData32);\n    } break;\n    case CV_SymKind_PUB32: {\n      offset = sizeof(CV_SymPub32);\n    } break;\n    case CV_SymKind_LPROC32: \n    case CV_SymKind_GPROC32: \n    case CV_SymKind_LPROC32_ID:\n    case CV_SymKind_GPROC32_ID: {\n      offset = sizeof(CV_SymProc32);\n    } break;\n    case CV_SymKind_REGREL32: {\n      offset = sizeof(CV_SymRegrel32);\n    } break;\n    case CV_SymKind_LTHREAD32:\n    case CV_SymKind_GTHREAD32: {\n      offset = sizeof(CV_SymData32);\n    } break;\n    case CV_SymKind_COMPILE2: break;\n    case CV_SymKind_LOCALSLOT: {\n      offset = sizeof(CV_SymSlot);\n    } break;\n    case CV_SymKind_PROCREF: \n    case CV_SymKind_LPROCREF:\n    case CV_SymKind_DATAREF: {\n      offset = sizeof(CV_SymRef2);\n    } break;\n    case CV_SymKind_TRAMPOLINE: break;\n    case CV_SymKind_LOCAL: {\n      offset = sizeof(CV_SymLocal);\n    } break;\n    default: InvalidPath;\n  }\n  return offset;\n}\n\ninternal String8\ncv_name_from_symbol(CV_SymKind kind, String8 data)\n{\n  U64 buf_off = cv_name_offset_from_symbol(kind, data);\n  U8 *buf_ptr = data.str + buf_off;\n  U8 *buf_opl = data.str + data.size;\n  String8 name = str8_cstring_capped(buf_ptr, buf_opl);\n  return name;\n}\n\ninternal CV_UDTInfo\ncv_get_udt_info(CV_LeafKind kind, String8 data)\n{\n  String8      name        = str8_zero();\n  String8      unique_name = str8_zero();\n  CV_TypeProps props       = 0;\n  \n  switch(kind) {\n    case CV_LeafKind_CLASS:\n    case CV_LeafKind_STRUCTURE:\n    case CV_LeafKind_INTERFACE: {\n      U64 cursor = 0;\n      \n      CV_LeafStruct udt;\n      cursor += str8_deserial_read_struct(data, cursor, &udt);\n      \n      props = udt.props;\n      \n      CV_NumericParsed size;\n      cursor += cv_read_numeric(data, cursor, &size);\n      \n      cursor += str8_deserial_read_cstr(data, cursor, &name);\n      \n      if (udt.props & CV_TypeProp_HasUniqueName) {\n        cursor += str8_deserial_read_cstr(data, cursor, &unique_name);\n      }\n    } break;\n    \n    case CV_LeafKind_CLASS2:\n    case CV_LeafKind_STRUCT2: {\n      U64 cursor = 0;\n      \n      CV_LeafStruct2 udt;\n      cursor += str8_deserial_read_struct(data, cursor, &udt);\n      \n      props = udt.props;\n      \n      CV_NumericParsed size;\n      cursor += cv_read_numeric(data, cursor, &size);\n      \n      cursor += str8_deserial_read_cstr(data, cursor, &name);\n      \n      if (udt.props & CV_TypeProp_HasUniqueName) {\n        cursor += str8_deserial_read_cstr(data, cursor, &unique_name);\n      }\n    } break;\n    \n    case CV_LeafKind_UNION: {\n      U64 cursor = 0;\n      \n      CV_LeafUnion udt;\n      cursor += str8_deserial_read_struct(data, cursor, &udt);\n      \n      CV_NumericParsed size;\n      cursor += cv_read_numeric(data, cursor, &size);\n      \n      props = udt.props;\n      \n      cursor += str8_deserial_read_cstr(data, cursor, &name);\n      \n      if(udt.props & CV_TypeProp_HasUniqueName) {\n        cursor += str8_deserial_read_cstr(data, cursor, &unique_name);\n      }\n    } break;\n    \n    case CV_LeafKind_ENUM: {\n      U64 cursor = 0;\n      \n      CV_LeafEnum udt;\n      cursor += str8_deserial_read_struct(data, cursor, &udt);\n      \n      props = udt.props;\n      \n      cursor += str8_deserial_read_cstr(data, cursor, &name);\n      \n      if(udt.props & CV_TypeProp_HasUniqueName) {\n        cursor += str8_deserial_read_cstr(data, cursor, &unique_name);\n      }\n    } break;\n    \n    // dbi/tpi.cpp:1332\n    case CV_LeafKind_UDT_SRC_LINE: {\n      CV_LeafUDTSrcLine *src_line = str8_deserial_get_raw_ptr(data, 0, sizeof(CV_LeafUDTSrcLine));\n      name = str8_struct(&src_line->udt_itype);\n    } break;\n    case CV_LeafKind_UDT_MOD_SRC_LINE: {\n      CV_LeafUDTModSrcLine *mod_src_line = str8_deserial_get_raw_ptr(data, 0, sizeof(CV_LeafUDTModSrcLine));\n      name = str8_struct(&mod_src_line->udt_itype);\n    } break;\n    \n    case CV_LeafKind_ALIAS: {\n      str8_deserial_read_cstr(data, 0, &name);\n    } break;\n    \n    default: {\n      InvalidPath;\n    } break;\n  }\n  \n  CV_UDTInfo info  = {0};\n  info.name        = name;\n  info.unique_name = unique_name;\n  info.props       = props;\n  return info;\n}\n\ninternal String8\ncv_name_from_udt_info(CV_UDTInfo udt_info)\n{\n  if (udt_info.props & CV_TypeProp_HasUniqueName) {\n    return udt_info.unique_name;\n  }\n  return udt_info.name;\n}\n\n//- rjf: record range stream parsing\n\ninternal CV_RecRangeStream*\ncv_rec_range_stream_from_data(Arena *arena, String8 sym_data, U64 sym_align)\n{\n  Assert(1 <= sym_align && IsPow2OrZero(sym_align));\n  CV_RecRangeStream *result = push_array(arena, CV_RecRangeStream, 1);\n  U8 *data = sym_data.str;\n  U64 cursor = 0;\n  U64 cap = sym_data.size;\n  for(;cursor + sizeof(CV_RecHeader) <= cap;)\n  {\n    // setup a new chunk\n    CV_RecRangeChunk *cur_chunk = push_array_aligned(arena, CV_RecRangeChunk, 1, 64);\n    SLLQueuePush(result->first_chunk, result->last_chunk, cur_chunk);\n    U64 partial_count = 0;\n    for(;partial_count < CV_REC_RANGE_CHUNK_SIZE && cursor + sizeof(CV_RecHeader) <= cap; partial_count += 1)\n    {\n      // compute cap\n      CV_RecHeader *hdr = (CV_RecHeader*)(data + cursor);\n      U64 symbol_cap_unclamped = cursor + 2 + hdr->size;\n      U64 symbol_cap = ClampTop(symbol_cap_unclamped, cap);\n      \n      // push on range\n      cur_chunk->ranges[partial_count].off = cursor + 2;\n      cur_chunk->ranges[partial_count].hdr = *hdr;\n      \n      // update cursor\n      U32 next_pos = AlignPow2(symbol_cap, sym_align);\n      cursor = next_pos;\n    }\n    result->total_count += partial_count;\n  }\n  return result;\n}\n\ninternal CV_RecRangeArray\ncv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream)\n{\n  U64 total_count = stream->total_count;\n  CV_RecRange *ranges = push_array_no_zero_aligned(arena, CV_RecRange, total_count, 8);\n  U64 idx = 0;\n  for(CV_RecRangeChunk *chunk = stream->first_chunk; chunk != 0; chunk = chunk->next)\n  {\n    U64 copy_count_raw = total_count - idx;\n    U64 copy_count = ClampTop(copy_count_raw, CV_REC_RANGE_CHUNK_SIZE);\n    MemoryCopy(ranges + idx, chunk->ranges, copy_count*sizeof(CV_RecRange));\n    idx += copy_count;\n  }\n  CV_RecRangeArray result = {0};\n  result.ranges = ranges;\n  result.count = total_count;\n  return result;\n}\n\n//- rjf: sym stream parsing\n\ninternal CV_SymParsed *\ncv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align)\n{\n  Assert(1 <= sym_align && IsPow2OrZero(sym_align));\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  //- rjf: gather symbols\n  CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, sym_data, sym_align);\n  \n  //- rjf: convert to result, fill basics\n  CV_SymParsed *result = push_array(arena, CV_SymParsed, 1);\n  result->data = sym_data;\n  result->sym_align = sym_align;\n  result->sym_ranges = cv_rec_range_array_from_stream(arena, stream);\n  \n  //- rjf: extract top-level-info\n  {\n    CV_RecRange *range = result->sym_ranges.ranges;\n    CV_RecRange *opl = range + result->sym_ranges.count;\n    for(;range < opl; range += 1)\n    {\n      U8 *first = sym_data.str + range->off + 2;\n      U64 cap = range->hdr.size - 2;\n      switch(range->hdr.kind)\n      {\n        case CV_SymKind_COMPILE:\n        if(sizeof(CV_SymCompile) <= cap)\n        {\n          CV_SymCompile *compile = (CV_SymCompile*)first;\n          String8 ver_str = str8_cstring_capped((char*)(compile + 1), (char *)(first + cap));\n          result->info.arch = compile->machine;\n          result->info.language = CV_CompileFlags_Extract_Language(compile->flags);;\n          result->info.compiler_name = ver_str;\n        }break;\n        case CV_SymKind_COMPILE2:\n        if(sizeof(CV_SymCompile2) <= cap)\n        {\n          CV_SymCompile2 *compile2 = (CV_SymCompile2*)first;\n          String8 ver_str = str8_cstring_capped((char*)(compile2 + 1), (char*)(first + cap));\n          String8 compiler_name = push_str8f(arena, \"%.*s %u.%u.%u\",\n                                             str8_varg(ver_str),\n                                             compile2->ver_major,\n                                             compile2->ver_minor,\n                                             compile2->ver_build);\n          result->info.arch = compile2->machine;\n          result->info.language = CV_Compile2Flags_Extract_Language(compile2->flags);;\n          result->info.compiler_name = compiler_name;\n        }break;\n        case CV_SymKind_COMPILE3:\n        if(sizeof(CV_SymCompile3) <= cap)\n        {\n          CV_SymCompile3 *compile3 = (CV_SymCompile3*)first;\n          String8 ver_str = str8_cstring_capped((char*)(compile3 + 1), (char *)(first + cap));\n          String8 compiler_name = push_str8f(arena, \"%.*s %u.%u.%u\",\n                                             str8_varg(ver_str),\n                                             compile3->ver_major,\n                                             compile3->ver_minor,\n                                             compile3->ver_build);\n          result->info.arch = compile3->machine;\n          result->info.language = CV_Compile3Flags_Extract_Language(compile3->flags);;\n          result->info.compiler_name = compiler_name;\n        }break;\n      }\n    }\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\n//- rjf: leaf stream parsing\n\ninternal CV_LeafParsed *\ncv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId itype_first)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  // gather up symbols\n  CV_RecRangeStream *stream = cv_rec_range_stream_from_data(scratch.arena, leaf_data, 1);\n  \n  // convert to result\n  CV_LeafParsed *result = push_array(arena, CV_LeafParsed, 1);\n  result->data = leaf_data;\n  result->itype_first = itype_first;\n  result->itype_opl = itype_first + stream->total_count;\n  result->leaf_ranges = cv_rec_range_array_from_stream(arena, stream);\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal CV_C13Parsed *\ncv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections)\n{\n  ProfBeginFunction();\n  \n  //////////////////////////////\n  //- rjf: gather c13 sub-sections\n  //\n  CV_C13SubSectionNode *file_chksms = 0;\n  CV_C13SubSectionNode *first = 0;\n  CV_C13SubSectionNode *last = 0;\n  U64 count = 0;\n  {\n    U32 cursor = 0;\n    for(; cursor + sizeof(CV_C13SubSectionHeader) <= c13_data.size;)\n    {\n      // read header\n      CV_C13SubSectionHeader *hdr = (CV_C13SubSectionHeader*)(c13_data.str + cursor);\n      \n      // get sub section info\n      U32 sub_section_off = cursor + sizeof(*hdr);\n      U32 sub_section_size_raw = hdr->size;\n      U32 after_sub_section_off_unclamped = sub_section_off + sub_section_size_raw;\n      U32 after_sub_section_off = ClampTop(after_sub_section_off_unclamped, c13_data.size);\n      U32 sub_section_size = after_sub_section_off - sub_section_off;\n      \n      // emit sub section\n      if(!(hdr->kind & CV_C13SubSectionKind_IgnoreFlag))\n      {\n        CV_C13SubSectionNode *node = push_array(arena, CV_C13SubSectionNode, 1);\n        SLLQueuePush(first, last, node);\n        count += 1;\n        node->kind = hdr->kind;\n        node->off = sub_section_off;\n        node->size = sub_section_size;\n        if(hdr->kind == CV_C13SubSectionKind_FileChksms)\n        {\n          file_chksms = node;\n        }\n      }\n      \n      // move cursor\n      cursor = AlignPow2(after_sub_section_off, 4);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: parse each sub-section\n  //\n  U64 inlinee_lines_parsed_slots_count = 4096;\n  CV_C13InlineeLinesParsedNode **inlinee_lines_parsed_slots = push_array(arena, CV_C13InlineeLinesParsedNode *, inlinee_lines_parsed_slots_count);\n  for(CV_C13SubSectionNode *node = first;\n      node != 0;\n      node = node->next)\n  {\n    U8 *first = c13_data.str + node->off;\n    U32 cap = node->size;\n    switch(node->kind)\n    {\n      default:{}break;\n      \n      //////////////////////////\n      //- rjf: line info sub-section\n      //\n      case CV_C13SubSectionKind_Lines:\n      if(sizeof(CV_C13SubSecLinesHeader) <= cap)\n      {\n        // read header\n        U32 read_off = 0;\n        U64 read_off_opl = node->size;\n        CV_C13SubSecLinesHeader *hdr = (CV_C13SubSecLinesHeader*)(first + read_off);\n        read_off += sizeof(*hdr);\n        \n        // rjf: extract section index\n        U32 sec_idx = hdr->sec;\n        \n        // rjf: bad section index -> skip\n        if(sec_idx < 1 || sections.count < sec_idx)\n        {\n          continue;\n        }\n        \n        // extract top level info\n        B32 has_cols = !!(hdr->flags & CV_C13SubSecLinesFlag_HasColumns);\n        U64 secrel_off = hdr->sec_off;\n        U64 secrel_opl = secrel_off + hdr->len;\n        U64 sec_base_off = sections.v[sec_idx - 1].voff;\n        \n        // read files\n        for(;read_off+sizeof(CV_C13File) <= read_off_opl;)\n        {\n          // rjf: grab next file header\n          CV_C13File *file = (CV_C13File*)(first + read_off);\n          U32 file_off = file->file_off;\n          U32 line_count_unclamped = file->num_lines;\n          U32 block_size = file->block_size;\n          \n          // file_name / checksum from file_off\n          String8 file_name = {0};\n          CV_C13ChecksumKind checksum_kind = CV_C13ChecksumKind_Null;\n          String8 checksum_value = {0};\n          if(file_off + sizeof(CV_C13Checksum) <= file_chksms->size)\n          {\n            CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + file_off);\n            U32 name_off = checksum->name_off;\n            file_name =  str8_cstring_capped((char*)(strtbl.str + name_off), (char*)(strtbl.str + strtbl.size));\n            checksum_kind = checksum->kind;\n            checksum_value = str8_skip(c13_data, file_chksms->off + file_off + sizeof(*checksum));\n            checksum_value.size = Min(checksum->len, checksum_value.size);\n          }\n          \n          // array layouts\n          U32 line_item_size = sizeof(CV_C13Line);\n          if (has_cols){\n            line_item_size += sizeof(CV_C13Column);\n          }\n          \n          U32 line_array_off = read_off + sizeof(*file);\n          U32 line_count_max = (read_off_opl - line_array_off) / line_item_size;\n          U32 line_count = ClampTop(line_count_unclamped, line_count_max);\n          \n          U32 col_array_off = line_array_off + line_count*sizeof(CV_C13Line);\n          \n          // parse lines\n          U64 *voffs = push_array_no_zero(arena, U64, line_count + 1);\n          U32 *line_nums = push_array_no_zero(arena, U32, line_count);\n          \n          {\n            CV_C13Line *line_ptr = (CV_C13Line*)(first + line_array_off);\n            CV_C13Line *line_opl = line_ptr + line_count;\n            \n            // TODO(allen): check order correctness here\n            \n            U32 i = 0;\n            for (; line_ptr < line_opl; line_ptr += 1, i += 1){\n              voffs[i] = line_ptr->off + secrel_off + sec_base_off;\n              line_nums[i] = CV_C13LineFlags_Extract_LineNumber(line_ptr->flags);\n            }\n            voffs[i] = secrel_opl + sec_base_off;\n          }\n          \n          // emit parsed lines\n          CV_C13LinesParsedNode *lines_parsed_node = push_array(arena, CV_C13LinesParsedNode, 1);\n          CV_C13LinesParsed *lines_parsed = &lines_parsed_node->v;\n          lines_parsed->sec_idx         = sec_idx;\n          lines_parsed->file_off        = file_off;\n          lines_parsed->secrel_base_off = secrel_off;\n          lines_parsed->file_name       = file_name;\n          lines_parsed->checksum_kind   = checksum_kind;\n          lines_parsed->checksum        = checksum_value;\n          lines_parsed->voffs           = voffs;\n          lines_parsed->line_nums       = line_nums;\n          lines_parsed->line_count      = line_count;\n          SLLQueuePush(node->lines_first, node->lines_last, lines_parsed_node);\n          \n          // rjf: advance\n          read_off += sizeof(*file);\n          read_off += line_item_size*line_count;\n        }\n      }break;\n      \n      //////////////////////////\n      //- rjf: inlinee line info sub-section\n      //\n      case CV_C13SubSectionKind_InlineeLines:\n      if(sizeof(CV_C13InlineeLinesSig) <= cap)\n      {\n        // rjf: read sig\n        U32 read_off = 0;\n        U64 read_off_opl = node->size;\n        CV_C13InlineeLinesSig *sig = (CV_C13InlineeLinesSig *)(first + read_off);\n        read_off += sizeof(*sig);\n        \n        // rjf: read source lines\n        for(;read_off + sizeof(CV_C13InlineeSourceLineHeader) <= read_off_opl;)\n        {\n          // rjf: read next header\n          CV_C13InlineeSourceLineHeader *hdr = (CV_C13InlineeSourceLineHeader *)(first + read_off);\n          read_off += sizeof(*hdr);\n          \n          // rjf: file_off -> file_name\n          String8 file_name = {0};\n          CV_C13ChecksumKind checksum_kind = CV_C13ChecksumKind_Null;\n          String8 checksum_value = {0};\n          if(hdr->file_off + sizeof(CV_C13Checksum) <= file_chksms->size)\n          {\n            CV_C13Checksum *checksum = (CV_C13Checksum*)(c13_data.str + file_chksms->off + hdr->file_off);\n            U32 name_off = checksum->name_off;\n            file_name =  str8_cstring_capped((char*)(strtbl.str + name_off), (char*)(strtbl.str + strtbl.size));\n            checksum_kind = checksum->kind;\n            checksum_value = str8_skip(c13_data, file_chksms->off + hdr->file_off + sizeof(*checksum));\n            checksum_value.size = Min(checksum->len, checksum_value.size);\n          }\n          \n          // rjf: parse extra files\n          U32 extra_file_count = 0;\n          U32 *extra_files = 0;\n          if(*sig == CV_C13InlineeLinesSig_EXTRA_FILES && read_off+sizeof(U32) <= read_off_opl)\n          {\n            U32 *extra_file_count_ptr = (U32 *)(first + read_off);\n            read_off += sizeof(*extra_file_count_ptr);\n            U32 max_extra_file_count = (read_off_opl-read_off)/sizeof(U32);\n            extra_file_count = Min(*extra_file_count_ptr, max_extra_file_count);\n            extra_files      = (U32 *)(first + read_off);\n            read_off += sizeof(*extra_files)*extra_file_count;\n          }\n          \n          // rjf: push node for this inlinee lines parsed into this subsection's list\n          CV_C13InlineeLinesParsedNode *n = push_array(arena, CV_C13InlineeLinesParsedNode, 1);\n          SLLQueuePush(node->inlinee_lines_first, node->inlinee_lines_last, n);\n          n->v.inlinee          = hdr->inlinee;\n          n->v.file_off         = hdr->file_off;\n          n->v.file_name        = file_name;\n          n->v.checksum_kind    = checksum_kind;\n          n->v.checksum         = checksum_value;\n          n->v.first_source_ln  = hdr->first_source_ln;\n          n->v.extra_file_count = extra_file_count;\n          n->v.extra_files      = extra_files;\n          \n          // rjf: push node into inlinee parse hash table\n          U64 hash = cv_hash_from_item_id(hdr->inlinee);\n          U64 slot_idx = hash%inlinee_lines_parsed_slots_count;\n          SLLStackPush_N(inlinee_lines_parsed_slots[slot_idx], n, hash_next);\n        }\n      }break;\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: fill output\n  //\n  CV_C13Parsed *result = push_array(arena, CV_C13Parsed, 1);\n  result->data = c13_data;\n  result->first_sub_section = first;\n  result->last_sub_section = last;\n  result->sub_section_count = count;\n  result->file_chksms_sub_section = file_chksms;\n  result->inlinee_lines_parsed_slots = inlinee_lines_parsed_slots;\n  result->inlinee_lines_parsed_slots_count = inlinee_lines_parsed_slots_count;\n  ProfEnd();\n  return result;\n}\n\n"
  },
  {
    "path": "src/codeview/codeview_parse.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef CODEVIEW_PARSE_H\n#define CODEVIEW_PARSE_H\n\n////////////////////////////////\n//~ CodeView Common Parser Types\n\n// CV_Numeric layout\n// x: U16\n// buf: U8[]\n// case (x < 0x8000):  kind=U16 val=x\n// case (x >= 0x8000): kind=x   val=buf\n\ntypedef struct CV_NumericParsed CV_NumericParsed;\nstruct CV_NumericParsed\n{\n  CV_NumericKind  kind;\n  U8             *val;\n  U64             encoded_size;\n};\n\ntypedef struct CV_RecRange CV_RecRange;\nstruct CV_RecRange\n{\n  U32          off;\n  CV_RecHeader hdr;\n};\n\n#define CV_REC_RANGE_CHUNK_SIZE 511\n\ntypedef struct CV_RecRangeChunk CV_RecRangeChunk;\nstruct CV_RecRangeChunk\n{\n  struct CV_RecRangeChunk *next;\n  CV_RecRange              ranges[CV_REC_RANGE_CHUNK_SIZE];\n};\n\ntypedef struct CV_RecRangeStream CV_RecRangeStream;\nstruct CV_RecRangeStream\n{\n  CV_RecRangeChunk *first_chunk;\n  CV_RecRangeChunk *last_chunk;\n  U64               total_count;\n};\n\ntypedef struct CV_RecRangeArray CV_RecRangeArray;\nstruct CV_RecRangeArray\n{\n  CV_RecRange *ranges;\n  U64          count;\n};\n\n////////////////////////////////\n//~ CodeView Sym Parser Types\n\ntypedef struct CV_SymTopLevelInfo CV_SymTopLevelInfo;\nstruct CV_SymTopLevelInfo\n{\n  CV_Arch     arch;\n  CV_Language language;\n  String8     compiler_name;\n};\n\ntypedef struct CV_SymParsed CV_SymParsed;\nstruct CV_SymParsed\n{\n  // source information\n  String8 data;\n  U64     sym_align;\n  \n  // sym index derived from source\n  CV_RecRangeArray sym_ranges;\n  \n  // top-level info derived from the syms\n  CV_SymTopLevelInfo info;\n};\n\n////////////////////////////////\n//~ CodeView Leaf Parser Types\n\ntypedef struct CV_LeafParsed CV_LeafParsed;\nstruct CV_LeafParsed\n{\n  // source information\n  String8   data;\n  CV_TypeId itype_first;\n  CV_TypeId itype_opl;\n  \n  // leaf index derived from source\n  CV_RecRangeArray leaf_ranges;\n};\n\n////////////////////////////////\n//~ CodeView C13 Info Parser Types\n\ntypedef struct CV_C13InlineSiteDecoder CV_C13InlineSiteDecoder;\nstruct CV_C13InlineSiteDecoder\n{\n  U64                cursor;\n  U64                parent_voff;\n  CV_InlineRangeKind range_kind;\n  U32                code_length;\n  U32                code_offset;\n  U32                file_off;\n  S32                ln;\n  S32                cn;\n  U64                code_offset_lo;\n  B32                code_offset_changed;\n  B32                code_offset_lo_changed;\n  B32                code_length_changed;\n  B32                ln_changed;\n  B32                file_off_changed;\n  Rng1U64            last_range;\n  U32                file_count;\n  Rng1U64            file_last_range;\n  U64                file_line_count;\n  U64                file_last_ln;\n};\n\ntypedef U32 CV_C13InlineSiteDecoderStepFlags;\nenum\n{\n  CV_C13InlineSiteDecoderStepFlag_EmitRange       = (1 << 0),\n  CV_C13InlineSiteDecoderStepFlag_ExtendLastRange = (1 << 1),\n  CV_C13InlineSiteDecoderStepFlag_EmitFile        = (1 << 2),\n  CV_C13InlineSiteDecoderStepFlag_EmitLine        = (1 << 3),\n};\n\ntypedef struct CV_C13InlineSiteDecoderStep CV_C13InlineSiteDecoderStep;\nstruct CV_C13InlineSiteDecoderStep\n{\n  CV_C13InlineSiteDecoderStepFlags flags;\n  Rng1U64                     range;\n  U64                         line_voff;\n  U64                         line_voff_end;\n  U64                         ln;\n  U64                         cn;\n  U32                         file_off;\n};\n\ntypedef struct CV_C13LinesParsed CV_C13LinesParsed;\nstruct CV_C13LinesParsed\n{\n  // raw info\n  U32 sec_idx;\n  U32 file_off;\n  U64 secrel_base_off;\n  \n  // parsed info\n  String8  file_name;\n  CV_C13ChecksumKind checksum_kind;\n  String8 checksum;\n  U64     *voffs;     // [line_count + 1]\n  U32     *line_nums; // [line_count]\n  U16     *col_nums;  // [2*line_count]\n  U32      line_count;\n};\n\ntypedef struct CV_C13LinesParsedNode CV_C13LinesParsedNode;\nstruct CV_C13LinesParsedNode\n{\n  CV_C13LinesParsedNode *next;\n  CV_C13LinesParsed      v;\n};\n\ntypedef struct CV_C13InlineeLinesParsed CV_C13InlineeLinesParsed;\nstruct CV_C13InlineeLinesParsed\n{\n  CV_ItemId inlinee;\n  U32 file_off;\n  String8 file_name;\n  CV_C13ChecksumKind checksum_kind;\n  String8 checksum;\n  U32 first_source_ln;\n  U32 extra_file_count;\n  U32 *extra_files;\n};\n\ntypedef struct CV_C13InlineeLinesParsedNode CV_C13InlineeLinesParsedNode;\nstruct CV_C13InlineeLinesParsedNode\n{\n  CV_C13InlineeLinesParsedNode *next;\n  CV_C13InlineeLinesParsedNode *hash_next;\n  CV_C13InlineeLinesParsed      v;\n};\n\ntypedef struct CV_C13SubSectionNode CV_C13SubSectionNode;\nstruct CV_C13SubSectionNode\n{\n  struct CV_C13SubSectionNode  *next;\n  CV_C13SubSectionKind          kind;\n  U32                           off;\n  U32                           size;\n  CV_C13LinesParsedNode        *lines_first;\n  CV_C13LinesParsedNode        *lines_last;\n  CV_C13InlineeLinesParsedNode *inlinee_lines_first;\n  CV_C13InlineeLinesParsedNode *inlinee_lines_last;\n};\n\ntypedef struct CV_C13Parsed CV_C13Parsed;\nstruct CV_C13Parsed\n{\n  // rjf: source data\n  String8 data;\n  \n  // rjf: full sub-section list\n  CV_C13SubSectionNode *first_sub_section;\n  CV_C13SubSectionNode *last_sub_section;\n  U64                   sub_section_count;\n  \n  // rjf: fastpath to file checksums section\n  CV_C13SubSectionNode *file_chksms_sub_section;\n  \n  // rjf: fastpath to map inlinee CV_ItemId -> CV_InlineeLinesParsed quickly\n  CV_C13InlineeLinesParsedNode **inlinee_lines_parsed_slots;\n  U64                            inlinee_lines_parsed_slots_count;\n};\n\ntypedef struct CV_UDTInfo CV_UDTInfo;\nstruct CV_UDTInfo\n{\n  String8      name;\n  String8      unique_name;\n  CV_TypeProps props;\n};\n\n////////////////////////////////\n//~ CodeView Compound Types\n\ntypedef struct CV_TypeIdArray CV_TypeIdArray;\nstruct CV_TypeIdArray\n{\n  CV_TypeId *itypes;\n  U64        count;\n};\n\n////////////////////////////////\n\n//- Hasher\n\ninternal U64 cv_hash_from_string(String8 string);\ninternal U64 cv_hash_from_item_id(CV_ItemId item_id);\n\n//- Numeric Decoder\n\ninternal CV_NumericParsed cv_numeric_from_data_range(U8 *first, U8 *opl);\ninternal U64              cv_read_numeric(String8 data, U64 offset, CV_NumericParsed *out);\n\ninternal B32 cv_numeric_fits_in_u64(CV_NumericParsed *num);\ninternal B32 cv_numeric_fits_in_s64(CV_NumericParsed *num);\ninternal B32 cv_numeric_fits_in_f64(CV_NumericParsed *num);\n\ninternal U64 cv_u64_from_numeric(CV_NumericParsed *num);\ninternal S64 cv_s64_from_numeric(CV_NumericParsed *num);\ninternal F64 cv_f64_from_numeric(CV_NumericParsed *num);\n\n//- Inlinee Lines Binary Annot Decoder\n\ninternal U64 cv_decode_inline_annot_u32(String8 data, U64 offset, U32 *out_value);\ninternal U64 cv_decode_inline_annot_s32(String8 data, U64 offset, S32 *out_value);\ninternal S32 cv_inline_annot_signed_from_unsigned_operand(U32 value);\n\ninternal CV_C13InlineSiteDecoder      cv_c13_inline_site_decoder_init(U32 file_off, U32 first_source_ln, U32 parent_voff);\ninternal CV_C13InlineSiteDecoderStep cv_c13_inline_site_decoder_step(CV_C13InlineSiteDecoder *decoder, String8 binary_annots);\n\n//- Symbol/Leaf Helpers\n\ninternal B32 cv_is_udt_name_anon(String8 name);\n\ninternal B32 cv_is_global_symbol(CV_SymKind kind);\ninternal B32 cv_is_typedef(CV_SymKind kind);\ninternal B32 cv_is_scope_symbol(CV_SymKind kind);\ninternal B32 cv_is_end_symbol(CV_SymKind kind);\n\ninternal B32                cv_is_udt(CV_LeafKind kind);\ninternal B32                cv_is_leaf_type_server(CV_LeafKind kind);\ninternal B32                cv_is_leaf_pch(CV_LeafKind kind);\ninternal CV_TypeIndexSource cv_type_index_source_from_leaf_kind(CV_LeafKind leaf_kind);\n\ninternal CV_TypeIndexInfoList cv_get_symbol_type_index_offsets(Arena *arena, CV_SymKind kind, String8 data);\ninternal CV_TypeIndexInfoList cv_get_leaf_type_index_offsets(Arena *arena, CV_LeafKind leaf_kind, String8 data);\ninternal CV_TypeIndexInfoList cv_get_inlinee_type_index_offsets(Arena *arena, String8 raw_data);\ninternal String8Array         cv_get_data_around_type_indices(Arena *arena, CV_TypeIndexInfoList ti_list, String8 data);\n\ninternal U64     cv_name_offset_from_symbol(CV_SymKind kind, String8 data);\ninternal String8 cv_name_from_symbol(CV_SymKind kind, String8 data);\n\ninternal CV_UDTInfo cv_get_udt_info(CV_LeafKind kind, String8 data);\ninternal String8    cv_name_from_udt_info(CV_UDTInfo udt_info);\n\n//- rjf: record range stream parsing\ninternal CV_RecRangeStream * cv_rec_range_stream_from_data(Arena *arena, String8 data, U64 align);\ninternal CV_RecRangeArray    cv_rec_range_array_from_stream(Arena *arena, CV_RecRangeStream *stream);\n\n//- rjf: sym stream parsing\ninternal CV_SymParsed * cv_sym_from_data(Arena *arena, String8 sym_data, U64 sym_align);\n\n//- rjf: leaf stream parsing\ninternal CV_LeafParsed * cv_leaf_from_data(Arena *arena, String8 leaf_data, CV_TypeId first);\ninternal CV_C13Parsed  * cv_c13_parsed_from_data(Arena *arena, String8 c13_data, String8 strtbl, COFF_SectionHeaderArray sections);\n\n#endif // CODEVIEW_PARSE_H\n\n"
  },
  {
    "path": "src/codeview/generated/codeview.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\ninternal String8\r\ncv_string_from_numeric_kind(CV_NumericKind v)\r\n{\r\nString8 result = str8_lit(\"<Unknown CV_NumericKind>\");\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_NumericKind_CHAR:{result = str8_lit(\"CHAR\");}break;\r\ncase CV_NumericKind_SHORT:{result = str8_lit(\"SHORT\");}break;\r\ncase CV_NumericKind_USHORT:{result = str8_lit(\"USHORT\");}break;\r\ncase CV_NumericKind_LONG:{result = str8_lit(\"LONG\");}break;\r\ncase CV_NumericKind_ULONG:{result = str8_lit(\"ULONG\");}break;\r\ncase CV_NumericKind_FLOAT32:{result = str8_lit(\"FLOAT32\");}break;\r\ncase CV_NumericKind_FLOAT64:{result = str8_lit(\"FLOAT64\");}break;\r\ncase CV_NumericKind_FLOAT80:{result = str8_lit(\"FLOAT80\");}break;\r\ncase CV_NumericKind_FLOAT128:{result = str8_lit(\"FLOAT128\");}break;\r\ncase CV_NumericKind_QUADWORD:{result = str8_lit(\"QUADWORD\");}break;\r\ncase CV_NumericKind_UQUADWORD:{result = str8_lit(\"UQUADWORD\");}break;\r\ncase CV_NumericKind_FLOAT48:{result = str8_lit(\"FLOAT48\");}break;\r\ncase CV_NumericKind_COMPLEX32:{result = str8_lit(\"COMPLEX32\");}break;\r\ncase CV_NumericKind_COMPLEX64:{result = str8_lit(\"COMPLEX64\");}break;\r\ncase CV_NumericKind_COMPLEX80:{result = str8_lit(\"COMPLEX80\");}break;\r\ncase CV_NumericKind_COMPLEX128:{result = str8_lit(\"COMPLEX128\");}break;\r\ncase CV_NumericKind_VARSTRING:{result = str8_lit(\"VARSTRING\");}break;\r\ncase CV_NumericKind_OCTWORD:{result = str8_lit(\"OCTWORD\");}break;\r\ncase CV_NumericKind_UOCTWORD:{result = str8_lit(\"UOCTWORD\");}break;\r\ncase CV_NumericKind_DECIMAL:{result = str8_lit(\"DECIMAL\");}break;\r\ncase CV_NumericKind_DATE:{result = str8_lit(\"DATE\");}break;\r\ncase CV_NumericKind_UTF8STRING:{result = str8_lit(\"UTF8STRING\");}break;\r\ncase CV_NumericKind_FLOAT16:{result = str8_lit(\"FLOAT16\");}break;\r\n}\r\nreturn result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_arch(CV_Arch v)\r\n{\r\nString8 result = str8_lit(\"<Unknown CV_Arch>\");\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_Arch_8080:{result = str8_lit(\"8080\");}break;\r\ncase CV_Arch_8086:{result = str8_lit(\"8086\");}break;\r\ncase CV_Arch_80286:{result = str8_lit(\"80286\");}break;\r\ncase CV_Arch_80386:{result = str8_lit(\"80386\");}break;\r\ncase CV_Arch_80486:{result = str8_lit(\"80486\");}break;\r\ncase CV_Arch_PENTIUM:{result = str8_lit(\"PENTIUM\");}break;\r\ncase CV_Arch_PENTIUMII:{result = str8_lit(\"PENTIUMII\");}break;\r\ncase CV_Arch_PENTIUMIII:{result = str8_lit(\"PENTIUMIII\");}break;\r\ncase CV_Arch_MIPS:{result = str8_lit(\"MIPS\");}break;\r\ncase CV_Arch_MIPS16:{result = str8_lit(\"MIPS16\");}break;\r\ncase CV_Arch_MIPS32:{result = str8_lit(\"MIPS32\");}break;\r\ncase CV_Arch_MIPS64:{result = str8_lit(\"MIPS64\");}break;\r\ncase CV_Arch_MIPSI:{result = str8_lit(\"MIPSI\");}break;\r\ncase CV_Arch_MIPSII:{result = str8_lit(\"MIPSII\");}break;\r\ncase CV_Arch_MIPSIII:{result = str8_lit(\"MIPSIII\");}break;\r\ncase CV_Arch_MIPSIV:{result = str8_lit(\"MIPSIV\");}break;\r\ncase CV_Arch_MIPSV:{result = str8_lit(\"MIPSV\");}break;\r\ncase CV_Arch_M68000:{result = str8_lit(\"M68000\");}break;\r\ncase CV_Arch_M68010:{result = str8_lit(\"M68010\");}break;\r\ncase CV_Arch_M68020:{result = str8_lit(\"M68020\");}break;\r\ncase CV_Arch_M68030:{result = str8_lit(\"M68030\");}break;\r\ncase CV_Arch_M68040:{result = str8_lit(\"M68040\");}break;\r\ncase CV_Arch_ALPHA:{result = str8_lit(\"ALPHA\");}break;\r\ncase CV_Arch_ALPHA_21164:{result = str8_lit(\"ALPHA_21164\");}break;\r\ncase CV_Arch_ALPHA_21164A:{result = str8_lit(\"ALPHA_21164A\");}break;\r\ncase CV_Arch_ALPHA_21264:{result = str8_lit(\"ALPHA_21264\");}break;\r\ncase CV_Arch_ALPHA_21364:{result = str8_lit(\"ALPHA_21364\");}break;\r\ncase CV_Arch_PPC601:{result = str8_lit(\"PPC601\");}break;\r\ncase CV_Arch_PPC603:{result = str8_lit(\"PPC603\");}break;\r\ncase CV_Arch_PPC604:{result = str8_lit(\"PPC604\");}break;\r\ncase CV_Arch_PPC620:{result = str8_lit(\"PPC620\");}break;\r\ncase CV_Arch_PPCFP:{result = str8_lit(\"PPCFP\");}break;\r\ncase CV_Arch_PPCBE:{result = str8_lit(\"PPCBE\");}break;\r\ncase CV_Arch_SH3:{result = str8_lit(\"SH3\");}break;\r\ncase CV_Arch_SH3E:{result = str8_lit(\"SH3E\");}break;\r\ncase CV_Arch_SH3DSP:{result = str8_lit(\"SH3DSP\");}break;\r\ncase CV_Arch_SH4:{result = str8_lit(\"SH4\");}break;\r\ncase CV_Arch_SHMEDIA:{result = str8_lit(\"SHMEDIA\");}break;\r\ncase CV_Arch_ARM3:{result = str8_lit(\"ARM3\");}break;\r\ncase CV_Arch_ARM4:{result = str8_lit(\"ARM4\");}break;\r\ncase CV_Arch_ARM4T:{result = str8_lit(\"ARM4T\");}break;\r\ncase CV_Arch_ARM5:{result = str8_lit(\"ARM5\");}break;\r\ncase CV_Arch_ARM5T:{result = str8_lit(\"ARM5T\");}break;\r\ncase CV_Arch_ARM6:{result = str8_lit(\"ARM6\");}break;\r\ncase CV_Arch_ARM_XMAC:{result = str8_lit(\"ARM_XMAC\");}break;\r\ncase CV_Arch_ARM_WMMX:{result = str8_lit(\"ARM_WMMX\");}break;\r\ncase CV_Arch_ARM7:{result = str8_lit(\"ARM7\");}break;\r\ncase CV_Arch_OMNI:{result = str8_lit(\"OMNI\");}break;\r\ncase CV_Arch_IA64_1:{result = str8_lit(\"IA64_1\");}break;\r\ncase CV_Arch_IA64_2:{result = str8_lit(\"IA64_2\");}break;\r\ncase CV_Arch_CEE:{result = str8_lit(\"CEE\");}break;\r\ncase CV_Arch_AM33:{result = str8_lit(\"AM33\");}break;\r\ncase CV_Arch_M32R:{result = str8_lit(\"M32R\");}break;\r\ncase CV_Arch_TRICORE:{result = str8_lit(\"TRICORE\");}break;\r\ncase CV_Arch_X64:{result = str8_lit(\"X64\");}break;\r\ncase CV_Arch_EBC:{result = str8_lit(\"EBC\");}break;\r\ncase CV_Arch_THUMB:{result = str8_lit(\"THUMB\");}break;\r\ncase CV_Arch_ARMNT:{result = str8_lit(\"ARMNT\");}break;\r\ncase CV_Arch_ARM64:{result = str8_lit(\"ARM64\");}break;\r\ncase CV_Arch_D3D11_SHADER:{result = str8_lit(\"D3D11_SHADER\");}break;\r\n}\r\nreturn result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_sym_kind(CV_SymKind v)\r\n{\r\nString8 result = str8_lit(\"<Unknown CV_SymKind>\");\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_SymKind_COMPILE:{result = str8_lit(\"COMPILE\");}break;\r\ncase CV_SymKind_REGISTER_16t:{result = str8_lit(\"REGISTER_16t\");}break;\r\ncase CV_SymKind_CONSTANT_16t:{result = str8_lit(\"CONSTANT_16t\");}break;\r\ncase CV_SymKind_UDT_16t:{result = str8_lit(\"UDT_16t\");}break;\r\ncase CV_SymKind_SSEARCH:{result = str8_lit(\"SSEARCH\");}break;\r\ncase CV_SymKind_END:{result = str8_lit(\"END\");}break;\r\ncase CV_SymKind_SKIP:{result = str8_lit(\"SKIP\");}break;\r\ncase CV_SymKind_CVRESERVE:{result = str8_lit(\"CVRESERVE\");}break;\r\ncase CV_SymKind_OBJNAME_ST:{result = str8_lit(\"OBJNAME_ST\");}break;\r\ncase CV_SymKind_ENDARG:{result = str8_lit(\"ENDARG\");}break;\r\ncase CV_SymKind_COBOLUDT_16t:{result = str8_lit(\"COBOLUDT_16t\");}break;\r\ncase CV_SymKind_MANYREG_16t:{result = str8_lit(\"MANYREG_16t\");}break;\r\ncase CV_SymKind_RETURN:{result = str8_lit(\"RETURN\");}break;\r\ncase CV_SymKind_ENTRYTHIS:{result = str8_lit(\"ENTRYTHIS\");}break;\r\ncase CV_SymKind_BPREL16:{result = str8_lit(\"BPREL16\");}break;\r\ncase CV_SymKind_LDATA16:{result = str8_lit(\"LDATA16\");}break;\r\ncase CV_SymKind_GDATA16:{result = str8_lit(\"GDATA16\");}break;\r\ncase CV_SymKind_PUB16:{result = str8_lit(\"PUB16\");}break;\r\ncase CV_SymKind_LPROC16:{result = str8_lit(\"LPROC16\");}break;\r\ncase CV_SymKind_GPROC16:{result = str8_lit(\"GPROC16\");}break;\r\ncase CV_SymKind_THUNK16:{result = str8_lit(\"THUNK16\");}break;\r\ncase CV_SymKind_BLOCK16:{result = str8_lit(\"BLOCK16\");}break;\r\ncase CV_SymKind_WITH16:{result = str8_lit(\"WITH16\");}break;\r\ncase CV_SymKind_LABEL16:{result = str8_lit(\"LABEL16\");}break;\r\ncase CV_SymKind_CEXMODEL16:{result = str8_lit(\"CEXMODEL16\");}break;\r\ncase CV_SymKind_VFTABLE16:{result = str8_lit(\"VFTABLE16\");}break;\r\ncase CV_SymKind_REGREL16:{result = str8_lit(\"REGREL16\");}break;\r\ncase CV_SymKind_BPREL32_16t:{result = str8_lit(\"BPREL32_16t\");}break;\r\ncase CV_SymKind_LDATA32_16t:{result = str8_lit(\"LDATA32_16t\");}break;\r\ncase CV_SymKind_GDATA32_16t:{result = str8_lit(\"GDATA32_16t\");}break;\r\ncase CV_SymKind_PUB32_16t:{result = str8_lit(\"PUB32_16t\");}break;\r\ncase CV_SymKind_LPROC32_16t:{result = str8_lit(\"LPROC32_16t\");}break;\r\ncase CV_SymKind_GPROC32_16t:{result = str8_lit(\"GPROC32_16t\");}break;\r\ncase CV_SymKind_THUNK32_ST:{result = str8_lit(\"THUNK32_ST\");}break;\r\ncase CV_SymKind_BLOCK32_ST:{result = str8_lit(\"BLOCK32_ST\");}break;\r\ncase CV_SymKind_WITH32_ST:{result = str8_lit(\"WITH32_ST\");}break;\r\ncase CV_SymKind_LABEL32_ST:{result = str8_lit(\"LABEL32_ST\");}break;\r\ncase CV_SymKind_CEXMODEL32:{result = str8_lit(\"CEXMODEL32\");}break;\r\ncase CV_SymKind_VFTABLE32_16t:{result = str8_lit(\"VFTABLE32_16t\");}break;\r\ncase CV_SymKind_REGREL32_16t:{result = str8_lit(\"REGREL32_16t\");}break;\r\ncase CV_SymKind_LTHREAD32_16t:{result = str8_lit(\"LTHREAD32_16t\");}break;\r\ncase CV_SymKind_GTHREAD32_16t:{result = str8_lit(\"GTHREAD32_16t\");}break;\r\ncase CV_SymKind_SLINK32:{result = str8_lit(\"SLINK32\");}break;\r\ncase CV_SymKind_LPROCMIPS_16t:{result = str8_lit(\"LPROCMIPS_16t\");}break;\r\ncase CV_SymKind_GPROCMIPS_16t:{result = str8_lit(\"GPROCMIPS_16t\");}break;\r\ncase CV_SymKind_PROCREF_ST:{result = str8_lit(\"PROCREF_ST\");}break;\r\ncase CV_SymKind_DATAREF_ST:{result = str8_lit(\"DATAREF_ST\");}break;\r\ncase CV_SymKind_ALIGN:{result = str8_lit(\"ALIGN\");}break;\r\ncase CV_SymKind_LPROCREF_ST:{result = str8_lit(\"LPROCREF_ST\");}break;\r\ncase CV_SymKind_OEM:{result = str8_lit(\"OEM\");}break;\r\ncase CV_SymKind_TI16_MAX:{result = str8_lit(\"TI16_MAX\");}break;\r\ncase CV_SymKind_CONSTANT_ST:{result = str8_lit(\"CONSTANT_ST\");}break;\r\ncase CV_SymKind_UDT_ST:{result = str8_lit(\"UDT_ST\");}break;\r\ncase CV_SymKind_COBOLUDT_ST:{result = str8_lit(\"COBOLUDT_ST\");}break;\r\ncase CV_SymKind_MANYREG_ST:{result = str8_lit(\"MANYREG_ST\");}break;\r\ncase CV_SymKind_BPREL32_ST:{result = str8_lit(\"BPREL32_ST\");}break;\r\ncase CV_SymKind_LDATA32_ST:{result = str8_lit(\"LDATA32_ST\");}break;\r\ncase CV_SymKind_GDATA32_ST:{result = str8_lit(\"GDATA32_ST\");}break;\r\ncase CV_SymKind_PUB32_ST:{result = str8_lit(\"PUB32_ST\");}break;\r\ncase CV_SymKind_LPROC32_ST:{result = str8_lit(\"LPROC32_ST\");}break;\r\ncase CV_SymKind_GPROC32_ST:{result = str8_lit(\"GPROC32_ST\");}break;\r\ncase CV_SymKind_VFTABLE32:{result = str8_lit(\"VFTABLE32\");}break;\r\ncase CV_SymKind_REGREL32_ST:{result = str8_lit(\"REGREL32_ST\");}break;\r\ncase CV_SymKind_LTHREAD32_ST:{result = str8_lit(\"LTHREAD32_ST\");}break;\r\ncase CV_SymKind_GTHREAD32_ST:{result = str8_lit(\"GTHREAD32_ST\");}break;\r\ncase CV_SymKind_LPROCMIPS_ST:{result = str8_lit(\"LPROCMIPS_ST\");}break;\r\ncase CV_SymKind_GPROCMIPS_ST:{result = str8_lit(\"GPROCMIPS_ST\");}break;\r\ncase CV_SymKind_FRAMEPROC:{result = str8_lit(\"FRAMEPROC\");}break;\r\ncase CV_SymKind_COMPILE2_ST:{result = str8_lit(\"COMPILE2_ST\");}break;\r\ncase CV_SymKind_MANYREG2_ST:{result = str8_lit(\"MANYREG2_ST\");}break;\r\ncase CV_SymKind_LPROCIA64_ST:{result = str8_lit(\"LPROCIA64_ST\");}break;\r\ncase CV_SymKind_GPROCIA64_ST:{result = str8_lit(\"GPROCIA64_ST\");}break;\r\ncase CV_SymKind_LOCALSLOT_ST:{result = str8_lit(\"LOCALSLOT_ST\");}break;\r\ncase CV_SymKind_PARAMSLOT_ST:{result = str8_lit(\"PARAMSLOT_ST\");}break;\r\ncase CV_SymKind_ANNOTATION:{result = str8_lit(\"ANNOTATION\");}break;\r\ncase CV_SymKind_GMANPROC_ST:{result = str8_lit(\"GMANPROC_ST\");}break;\r\ncase CV_SymKind_LMANPROC_ST:{result = str8_lit(\"LMANPROC_ST\");}break;\r\ncase CV_SymKind_RESERVED1:{result = str8_lit(\"RESERVED1\");}break;\r\ncase CV_SymKind_RESERVED2:{result = str8_lit(\"RESERVED2\");}break;\r\ncase CV_SymKind_RESERVED3:{result = str8_lit(\"RESERVED3\");}break;\r\ncase CV_SymKind_RESERVED4:{result = str8_lit(\"RESERVED4\");}break;\r\ncase CV_SymKind_LMANDATA_ST:{result = str8_lit(\"LMANDATA_ST\");}break;\r\ncase CV_SymKind_GMANDATA_ST:{result = str8_lit(\"GMANDATA_ST\");}break;\r\ncase CV_SymKind_MANFRAMEREL_ST:{result = str8_lit(\"MANFRAMEREL_ST\");}break;\r\ncase CV_SymKind_MANREGISTER_ST:{result = str8_lit(\"MANREGISTER_ST\");}break;\r\ncase CV_SymKind_MANSLOT_ST:{result = str8_lit(\"MANSLOT_ST\");}break;\r\ncase CV_SymKind_MANMANYREG_ST:{result = str8_lit(\"MANMANYREG_ST\");}break;\r\ncase CV_SymKind_MANREGREL_ST:{result = str8_lit(\"MANREGREL_ST\");}break;\r\ncase CV_SymKind_MANMANYREG2_ST:{result = str8_lit(\"MANMANYREG2_ST\");}break;\r\ncase CV_SymKind_MANTYPREF:{result = str8_lit(\"MANTYPREF\");}break;\r\ncase CV_SymKind_UNAMESPACE_ST:{result = str8_lit(\"UNAMESPACE_ST\");}break;\r\ncase CV_SymKind_ST_MAX:{result = str8_lit(\"ST_MAX\");}break;\r\ncase CV_SymKind_OBJNAME:{result = str8_lit(\"OBJNAME\");}break;\r\ncase CV_SymKind_THUNK32:{result = str8_lit(\"THUNK32\");}break;\r\ncase CV_SymKind_BLOCK32:{result = str8_lit(\"BLOCK32\");}break;\r\ncase CV_SymKind_WITH32:{result = str8_lit(\"WITH32\");}break;\r\ncase CV_SymKind_LABEL32:{result = str8_lit(\"LABEL32\");}break;\r\ncase CV_SymKind_REGISTER:{result = str8_lit(\"REGISTER\");}break;\r\ncase CV_SymKind_CONSTANT:{result = str8_lit(\"CONSTANT\");}break;\r\ncase CV_SymKind_UDT:{result = str8_lit(\"UDT\");}break;\r\ncase CV_SymKind_COBOLUDT:{result = str8_lit(\"COBOLUDT\");}break;\r\ncase CV_SymKind_MANYREG:{result = str8_lit(\"MANYREG\");}break;\r\ncase CV_SymKind_BPREL32:{result = str8_lit(\"BPREL32\");}break;\r\ncase CV_SymKind_LDATA32:{result = str8_lit(\"LDATA32\");}break;\r\ncase CV_SymKind_GDATA32:{result = str8_lit(\"GDATA32\");}break;\r\ncase CV_SymKind_PUB32:{result = str8_lit(\"PUB32\");}break;\r\ncase CV_SymKind_LPROC32:{result = str8_lit(\"LPROC32\");}break;\r\ncase CV_SymKind_GPROC32:{result = str8_lit(\"GPROC32\");}break;\r\ncase CV_SymKind_REGREL32:{result = str8_lit(\"REGREL32\");}break;\r\ncase CV_SymKind_LTHREAD32:{result = str8_lit(\"LTHREAD32\");}break;\r\ncase CV_SymKind_GTHREAD32:{result = str8_lit(\"GTHREAD32\");}break;\r\ncase CV_SymKind_LPROCMIPS:{result = str8_lit(\"LPROCMIPS\");}break;\r\ncase CV_SymKind_GPROCMIPS:{result = str8_lit(\"GPROCMIPS\");}break;\r\ncase CV_SymKind_COMPILE2:{result = str8_lit(\"COMPILE2\");}break;\r\ncase CV_SymKind_MANYREG2:{result = str8_lit(\"MANYREG2\");}break;\r\ncase CV_SymKind_LPROCIA64:{result = str8_lit(\"LPROCIA64\");}break;\r\ncase CV_SymKind_GPROCIA64:{result = str8_lit(\"GPROCIA64\");}break;\r\ncase CV_SymKind_LOCALSLOT:{result = str8_lit(\"LOCALSLOT\");}break;\r\ncase CV_SymKind_PARAMSLOT:{result = str8_lit(\"PARAMSLOT\");}break;\r\ncase CV_SymKind_LMANDATA:{result = str8_lit(\"LMANDATA\");}break;\r\ncase CV_SymKind_GMANDATA:{result = str8_lit(\"GMANDATA\");}break;\r\ncase CV_SymKind_MANFRAMEREL:{result = str8_lit(\"MANFRAMEREL\");}break;\r\ncase CV_SymKind_MANREGISTER:{result = str8_lit(\"MANREGISTER\");}break;\r\ncase CV_SymKind_MANSLOT:{result = str8_lit(\"MANSLOT\");}break;\r\ncase CV_SymKind_MANMANYREG:{result = str8_lit(\"MANMANYREG\");}break;\r\ncase CV_SymKind_MANREGREL:{result = str8_lit(\"MANREGREL\");}break;\r\ncase CV_SymKind_MANMANYREG2:{result = str8_lit(\"MANMANYREG2\");}break;\r\ncase CV_SymKind_UNAMESPACE:{result = str8_lit(\"UNAMESPACE\");}break;\r\ncase CV_SymKind_PROCREF:{result = str8_lit(\"PROCREF\");}break;\r\ncase CV_SymKind_DATAREF:{result = str8_lit(\"DATAREF\");}break;\r\ncase CV_SymKind_LPROCREF:{result = str8_lit(\"LPROCREF\");}break;\r\ncase CV_SymKind_ANNOTATIONREF:{result = str8_lit(\"ANNOTATIONREF\");}break;\r\ncase CV_SymKind_TOKENREF:{result = str8_lit(\"TOKENREF\");}break;\r\ncase CV_SymKind_GMANPROC:{result = str8_lit(\"GMANPROC\");}break;\r\ncase CV_SymKind_LMANPROC:{result = str8_lit(\"LMANPROC\");}break;\r\ncase CV_SymKind_TRAMPOLINE:{result = str8_lit(\"TRAMPOLINE\");}break;\r\ncase CV_SymKind_MANCONSTANT:{result = str8_lit(\"MANCONSTANT\");}break;\r\ncase CV_SymKind_ATTR_FRAMEREL:{result = str8_lit(\"ATTR_FRAMEREL\");}break;\r\ncase CV_SymKind_ATTR_REGISTER:{result = str8_lit(\"ATTR_REGISTER\");}break;\r\ncase CV_SymKind_ATTR_REGREL:{result = str8_lit(\"ATTR_REGREL\");}break;\r\ncase CV_SymKind_ATTR_MANYREG:{result = str8_lit(\"ATTR_MANYREG\");}break;\r\ncase CV_SymKind_SEPCODE:{result = str8_lit(\"SEPCODE\");}break;\r\ncase CV_SymKind_DEFRANGE_2005:{result = str8_lit(\"DEFRANGE_2005\");}break;\r\ncase CV_SymKind_DEFRANGE2_2005:{result = str8_lit(\"DEFRANGE2_2005\");}break;\r\ncase CV_SymKind_SECTION:{result = str8_lit(\"SECTION\");}break;\r\ncase CV_SymKind_COFFGROUP:{result = str8_lit(\"COFFGROUP\");}break;\r\ncase CV_SymKind_EXPORT:{result = str8_lit(\"EXPORT\");}break;\r\ncase CV_SymKind_CALLSITEINFO:{result = str8_lit(\"CALLSITEINFO\");}break;\r\ncase CV_SymKind_FRAMECOOKIE:{result = str8_lit(\"FRAMECOOKIE\");}break;\r\ncase CV_SymKind_DISCARDED:{result = str8_lit(\"DISCARDED\");}break;\r\ncase CV_SymKind_COMPILE3:{result = str8_lit(\"COMPILE3\");}break;\r\ncase CV_SymKind_ENVBLOCK:{result = str8_lit(\"ENVBLOCK\");}break;\r\ncase CV_SymKind_LOCAL:{result = str8_lit(\"LOCAL\");}break;\r\ncase CV_SymKind_DEFRANGE:{result = str8_lit(\"DEFRANGE\");}break;\r\ncase CV_SymKind_DEFRANGE_SUBFIELD:{result = str8_lit(\"DEFRANGE_SUBFIELD\");}break;\r\ncase CV_SymKind_DEFRANGE_REGISTER:{result = str8_lit(\"DEFRANGE_REGISTER\");}break;\r\ncase CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = str8_lit(\"DEFRANGE_FRAMEPOINTER_REL\");}break;\r\ncase CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = str8_lit(\"DEFRANGE_SUBFIELD_REGISTER\");}break;\r\ncase CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = str8_lit(\"DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE\");}break;\r\ncase CV_SymKind_DEFRANGE_REGISTER_REL:{result = str8_lit(\"DEFRANGE_REGISTER_REL\");}break;\r\ncase CV_SymKind_LPROC32_ID:{result = str8_lit(\"LPROC32_ID\");}break;\r\ncase CV_SymKind_GPROC32_ID:{result = str8_lit(\"GPROC32_ID\");}break;\r\ncase CV_SymKind_LPROCMIPS_ID:{result = str8_lit(\"LPROCMIPS_ID\");}break;\r\ncase CV_SymKind_GPROCMIPS_ID:{result = str8_lit(\"GPROCMIPS_ID\");}break;\r\ncase CV_SymKind_LPROCIA64_ID:{result = str8_lit(\"LPROCIA64_ID\");}break;\r\ncase CV_SymKind_GPROCIA64_ID:{result = str8_lit(\"GPROCIA64_ID\");}break;\r\ncase CV_SymKind_BUILDINFO:{result = str8_lit(\"BUILDINFO\");}break;\r\ncase CV_SymKind_INLINESITE:{result = str8_lit(\"INLINESITE\");}break;\r\ncase CV_SymKind_INLINESITE_END:{result = str8_lit(\"INLINESITE_END\");}break;\r\ncase CV_SymKind_PROC_ID_END:{result = str8_lit(\"PROC_ID_END\");}break;\r\ncase CV_SymKind_DEFRANGE_HLSL:{result = str8_lit(\"DEFRANGE_HLSL\");}break;\r\ncase CV_SymKind_GDATA_HLSL:{result = str8_lit(\"GDATA_HLSL\");}break;\r\ncase CV_SymKind_LDATA_HLSL:{result = str8_lit(\"LDATA_HLSL\");}break;\r\ncase CV_SymKind_FILESTATIC:{result = str8_lit(\"FILESTATIC\");}break;\r\ncase CV_SymKind_LPROC32_DPC:{result = str8_lit(\"LPROC32_DPC\");}break;\r\ncase CV_SymKind_LPROC32_DPC_ID:{result = str8_lit(\"LPROC32_DPC_ID\");}break;\r\ncase CV_SymKind_DEFRANGE_DPC_PTR_TAG:{result = str8_lit(\"DEFRANGE_DPC_PTR_TAG\");}break;\r\ncase CV_SymKind_DPC_SYM_TAG_MAP:{result = str8_lit(\"DPC_SYM_TAG_MAP\");}break;\r\ncase CV_SymKind_ARMSWITCHTABLE:{result = str8_lit(\"ARMSWITCHTABLE\");}break;\r\ncase CV_SymKind_CALLEES:{result = str8_lit(\"CALLEES\");}break;\r\ncase CV_SymKind_CALLERS:{result = str8_lit(\"CALLERS\");}break;\r\ncase CV_SymKind_POGODATA:{result = str8_lit(\"POGODATA\");}break;\r\ncase CV_SymKind_INLINESITE2:{result = str8_lit(\"INLINESITE2\");}break;\r\ncase CV_SymKind_HEAPALLOCSITE:{result = str8_lit(\"HEAPALLOCSITE\");}break;\r\ncase CV_SymKind_MOD_TYPEREF:{result = str8_lit(\"MOD_TYPEREF\");}break;\r\ncase CV_SymKind_REF_MINIPDB:{result = str8_lit(\"REF_MINIPDB\");}break;\r\ncase CV_SymKind_PDBMAP:{result = str8_lit(\"PDBMAP\");}break;\r\ncase CV_SymKind_GDATA_HLSL32:{result = str8_lit(\"GDATA_HLSL32\");}break;\r\ncase CV_SymKind_LDATA_HLSL32:{result = str8_lit(\"LDATA_HLSL32\");}break;\r\ncase CV_SymKind_GDATA_HLSL32_EX:{result = str8_lit(\"GDATA_HLSL32_EX\");}break;\r\ncase CV_SymKind_LDATA_HLSL32_EX:{result = str8_lit(\"LDATA_HLSL32_EX\");}break;\r\ncase CV_SymKind_FASTLINK:{result = str8_lit(\"FASTLINK\");}break;\r\ncase CV_SymKind_INLINEES:{result = str8_lit(\"INLINEES\");}break;\r\n}\r\nreturn result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_basic_type(CV_BasicType v)\r\n{\r\nString8 result = str8_lit(\"<Unknown CV_BasicType>\");\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_BasicType_NOTYPE:{result = str8_lit(\"NOTYPE\");}break;\r\ncase CV_BasicType_ABS:{result = str8_lit(\"ABS\");}break;\r\ncase CV_BasicType_SEGMENT:{result = str8_lit(\"SEGMENT\");}break;\r\ncase CV_BasicType_VOID:{result = str8_lit(\"VOID\");}break;\r\ncase CV_BasicType_CURRENCY:{result = str8_lit(\"CURRENCY\");}break;\r\ncase CV_BasicType_NBASICSTR:{result = str8_lit(\"NBASICSTR\");}break;\r\ncase CV_BasicType_FBASICSTR:{result = str8_lit(\"FBASICSTR\");}break;\r\ncase CV_BasicType_NOTTRANS:{result = str8_lit(\"NOTTRANS\");}break;\r\ncase CV_BasicType_HRESULT:{result = str8_lit(\"HRESULT\");}break;\r\ncase CV_BasicType_CHAR:{result = str8_lit(\"CHAR\");}break;\r\ncase CV_BasicType_SHORT:{result = str8_lit(\"SHORT\");}break;\r\ncase CV_BasicType_LONG:{result = str8_lit(\"LONG\");}break;\r\ncase CV_BasicType_QUAD:{result = str8_lit(\"QUAD\");}break;\r\ncase CV_BasicType_OCT:{result = str8_lit(\"OCT\");}break;\r\ncase CV_BasicType_UCHAR:{result = str8_lit(\"UCHAR\");}break;\r\ncase CV_BasicType_USHORT:{result = str8_lit(\"USHORT\");}break;\r\ncase CV_BasicType_ULONG:{result = str8_lit(\"ULONG\");}break;\r\ncase CV_BasicType_UQUAD:{result = str8_lit(\"UQUAD\");}break;\r\ncase CV_BasicType_UOCT:{result = str8_lit(\"UOCT\");}break;\r\ncase CV_BasicType_BOOL8:{result = str8_lit(\"BOOL8\");}break;\r\ncase CV_BasicType_BOOL16:{result = str8_lit(\"BOOL16\");}break;\r\ncase CV_BasicType_BOOL32:{result = str8_lit(\"BOOL32\");}break;\r\ncase CV_BasicType_BOOL64:{result = str8_lit(\"BOOL64\");}break;\r\ncase CV_BasicType_FLOAT32:{result = str8_lit(\"FLOAT32\");}break;\r\ncase CV_BasicType_FLOAT64:{result = str8_lit(\"FLOAT64\");}break;\r\ncase CV_BasicType_FLOAT80:{result = str8_lit(\"FLOAT80\");}break;\r\ncase CV_BasicType_FLOAT128:{result = str8_lit(\"FLOAT128\");}break;\r\ncase CV_BasicType_FLOAT48:{result = str8_lit(\"FLOAT48\");}break;\r\ncase CV_BasicType_FLOAT32PP:{result = str8_lit(\"FLOAT32PP\");}break;\r\ncase CV_BasicType_FLOAT16:{result = str8_lit(\"FLOAT16\");}break;\r\ncase CV_BasicType_COMPLEX32:{result = str8_lit(\"COMPLEX32\");}break;\r\ncase CV_BasicType_COMPLEX64:{result = str8_lit(\"COMPLEX64\");}break;\r\ncase CV_BasicType_COMPLEX80:{result = str8_lit(\"COMPLEX80\");}break;\r\ncase CV_BasicType_COMPLEX128:{result = str8_lit(\"COMPLEX128\");}break;\r\ncase CV_BasicType_BIT:{result = str8_lit(\"BIT\");}break;\r\ncase CV_BasicType_PASCHAR:{result = str8_lit(\"PASCHAR\");}break;\r\ncase CV_BasicType_BOOL32FF:{result = str8_lit(\"BOOL32FF\");}break;\r\ncase CV_BasicType_INT8:{result = str8_lit(\"INT8\");}break;\r\ncase CV_BasicType_UINT8:{result = str8_lit(\"UINT8\");}break;\r\ncase CV_BasicType_RCHAR:{result = str8_lit(\"RCHAR\");}break;\r\ncase CV_BasicType_WCHAR:{result = str8_lit(\"WCHAR\");}break;\r\ncase CV_BasicType_INT16:{result = str8_lit(\"INT16\");}break;\r\ncase CV_BasicType_UINT16:{result = str8_lit(\"UINT16\");}break;\r\ncase CV_BasicType_INT32:{result = str8_lit(\"INT32\");}break;\r\ncase CV_BasicType_UINT32:{result = str8_lit(\"UINT32\");}break;\r\ncase CV_BasicType_INT64:{result = str8_lit(\"INT64\");}break;\r\ncase CV_BasicType_UINT64:{result = str8_lit(\"UINT64\");}break;\r\ncase CV_BasicType_INT128:{result = str8_lit(\"INT128\");}break;\r\ncase CV_BasicType_UINT128:{result = str8_lit(\"UINT128\");}break;\r\ncase CV_BasicType_CHAR16:{result = str8_lit(\"CHAR16\");}break;\r\ncase CV_BasicType_CHAR32:{result = str8_lit(\"CHAR32\");}break;\r\ncase CV_BasicType_CHAR8:{result = str8_lit(\"CHAR8\");}break;\r\ncase CV_BasicType_PTR:{result = str8_lit(\"PTR\");}break;\r\n}\r\nreturn result;\r\n}\r\n\r\ninternal String8\r\ncv_type_name_from_basic_type(CV_BasicType v)\r\n{\r\nString8 result = str8_lit(\"<Unknown CV_BasicType>\");\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_BasicType_NOTYPE:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_ABS:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_SEGMENT:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_VOID:{result = str8_lit(\"void\");}break;\r\ncase CV_BasicType_CURRENCY:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_NBASICSTR:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_FBASICSTR:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_NOTTRANS:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_HRESULT:{result = str8_lit(\"HRESULT\");}break;\r\ncase CV_BasicType_CHAR:{result = str8_lit(\"CHAR\");}break;\r\ncase CV_BasicType_SHORT:{result = str8_lit(\"SHORT\");}break;\r\ncase CV_BasicType_LONG:{result = str8_lit(\"LONG\");}break;\r\ncase CV_BasicType_QUAD:{result = str8_lit(\"QUAD\");}break;\r\ncase CV_BasicType_OCT:{result = str8_lit(\"OCT\");}break;\r\ncase CV_BasicType_UCHAR:{result = str8_lit(\"UCHAR\");}break;\r\ncase CV_BasicType_USHORT:{result = str8_lit(\"USHORT\");}break;\r\ncase CV_BasicType_ULONG:{result = str8_lit(\"ULONG\");}break;\r\ncase CV_BasicType_UQUAD:{result = str8_lit(\"UQUAD\");}break;\r\ncase CV_BasicType_UOCT:{result = str8_lit(\"UOCT\");}break;\r\ncase CV_BasicType_BOOL8:{result = str8_lit(\"BOOL8\");}break;\r\ncase CV_BasicType_BOOL16:{result = str8_lit(\"BOOL16\");}break;\r\ncase CV_BasicType_BOOL32:{result = str8_lit(\"BOOL32\");}break;\r\ncase CV_BasicType_BOOL64:{result = str8_lit(\"BOOL64\");}break;\r\ncase CV_BasicType_FLOAT32:{result = str8_lit(\"FLOAT32\");}break;\r\ncase CV_BasicType_FLOAT64:{result = str8_lit(\"FLOAT64\");}break;\r\ncase CV_BasicType_FLOAT80:{result = str8_lit(\"FLOAT80\");}break;\r\ncase CV_BasicType_FLOAT128:{result = str8_lit(\"FLOAT128\");}break;\r\ncase CV_BasicType_FLOAT48:{result = str8_lit(\"FLOAT48\");}break;\r\ncase CV_BasicType_FLOAT32PP:{result = str8_lit(\"FLOAT32PP\");}break;\r\ncase CV_BasicType_FLOAT16:{result = str8_lit(\"FLOAT16\");}break;\r\ncase CV_BasicType_COMPLEX32:{result = str8_lit(\"ComplexF32\");}break;\r\ncase CV_BasicType_COMPLEX64:{result = str8_lit(\"ComplexF64\");}break;\r\ncase CV_BasicType_COMPLEX80:{result = str8_lit(\"ComplexF80\");}break;\r\ncase CV_BasicType_COMPLEX128:{result = str8_lit(\"ComplexF128\");}break;\r\ncase CV_BasicType_BIT:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_PASCHAR:{result = str8_lit(\"\");}break;\r\ncase CV_BasicType_BOOL32FF:{result = str8_lit(\"BOOL32FF\");}break;\r\ncase CV_BasicType_INT8:{result = str8_lit(\"int8\");}break;\r\ncase CV_BasicType_UINT8:{result = str8_lit(\"uint8\");}break;\r\ncase CV_BasicType_RCHAR:{result = str8_lit(\"char\");}break;\r\ncase CV_BasicType_WCHAR:{result = str8_lit(\"WCHAR\");}break;\r\ncase CV_BasicType_INT16:{result = str8_lit(\"int16\");}break;\r\ncase CV_BasicType_UINT16:{result = str8_lit(\"uint16\");}break;\r\ncase CV_BasicType_INT32:{result = str8_lit(\"int32\");}break;\r\ncase CV_BasicType_UINT32:{result = str8_lit(\"uint32\");}break;\r\ncase CV_BasicType_INT64:{result = str8_lit(\"int64\");}break;\r\ncase CV_BasicType_UINT64:{result = str8_lit(\"uint64\");}break;\r\ncase CV_BasicType_INT128:{result = str8_lit(\"int128\");}break;\r\ncase CV_BasicType_UINT128:{result = str8_lit(\"uint128\");}break;\r\ncase CV_BasicType_CHAR16:{result = str8_lit(\"char16\");}break;\r\ncase CV_BasicType_CHAR32:{result = str8_lit(\"char32\");}break;\r\ncase CV_BasicType_CHAR8:{result = str8_lit(\"char\");}break;\r\ncase CV_BasicType_PTR:{result = str8_lit(\"PTR\");}break;\r\n}\r\nreturn result;\r\n}\r\n\r\ninternal String8\r\ncv_string_from_leaf_kind(CV_LeafKind v)\r\n{\r\nString8 result = str8_lit(\"<Unknown CV_LeafKind>\");\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_LeafKind_NOTYPE:{result = str8_lit(\"NOTYPE\");}break;\r\ncase CV_LeafKind_MODIFIER_16t:{result = str8_lit(\"MODIFIER_16t\");}break;\r\ncase CV_LeafKind_POINTER_16t:{result = str8_lit(\"POINTER_16t\");}break;\r\ncase CV_LeafKind_ARRAY_16t:{result = str8_lit(\"ARRAY_16t\");}break;\r\ncase CV_LeafKind_CLASS_16t:{result = str8_lit(\"CLASS_16t\");}break;\r\ncase CV_LeafKind_STRUCTURE_16t:{result = str8_lit(\"STRUCTURE_16t\");}break;\r\ncase CV_LeafKind_UNION_16t:{result = str8_lit(\"UNION_16t\");}break;\r\ncase CV_LeafKind_ENUM_16t:{result = str8_lit(\"ENUM_16t\");}break;\r\ncase CV_LeafKind_PROCEDURE_16t:{result = str8_lit(\"PROCEDURE_16t\");}break;\r\ncase CV_LeafKind_MFUNCTION_16t:{result = str8_lit(\"MFUNCTION_16t\");}break;\r\ncase CV_LeafKind_VTSHAPE:{result = str8_lit(\"VTSHAPE\");}break;\r\ncase CV_LeafKind_COBOL0_16t:{result = str8_lit(\"COBOL0_16t\");}break;\r\ncase CV_LeafKind_COBOL1:{result = str8_lit(\"COBOL1\");}break;\r\ncase CV_LeafKind_BARRAY_16t:{result = str8_lit(\"BARRAY_16t\");}break;\r\ncase CV_LeafKind_LABEL:{result = str8_lit(\"LABEL\");}break;\r\ncase CV_LeafKind_NULL:{result = str8_lit(\"NULL\");}break;\r\ncase CV_LeafKind_NOTTRAN:{result = str8_lit(\"NOTTRAN\");}break;\r\ncase CV_LeafKind_DIMARRAY_16t:{result = str8_lit(\"DIMARRAY_16t\");}break;\r\ncase CV_LeafKind_VFTPATH_16t:{result = str8_lit(\"VFTPATH_16t\");}break;\r\ncase CV_LeafKind_PRECOMP_16t:{result = str8_lit(\"PRECOMP_16t\");}break;\r\ncase CV_LeafKind_ENDPRECOMP:{result = str8_lit(\"ENDPRECOMP\");}break;\r\ncase CV_LeafKind_OEM_16t:{result = str8_lit(\"OEM_16t\");}break;\r\ncase CV_LeafKind_TYPESERVER_ST:{result = str8_lit(\"TYPESERVER_ST\");}break;\r\ncase CV_LeafKind_SKIP_16t:{result = str8_lit(\"SKIP_16t\");}break;\r\ncase CV_LeafKind_ARGLIST_16t:{result = str8_lit(\"ARGLIST_16t\");}break;\r\ncase CV_LeafKind_DEFARG_16t:{result = str8_lit(\"DEFARG_16t\");}break;\r\ncase CV_LeafKind_LIST:{result = str8_lit(\"LIST\");}break;\r\ncase CV_LeafKind_FIELDLIST_16t:{result = str8_lit(\"FIELDLIST_16t\");}break;\r\ncase CV_LeafKind_DERIVED_16t:{result = str8_lit(\"DERIVED_16t\");}break;\r\ncase CV_LeafKind_BITFIELD_16t:{result = str8_lit(\"BITFIELD_16t\");}break;\r\ncase CV_LeafKind_METHODLIST_16t:{result = str8_lit(\"METHODLIST_16t\");}break;\r\ncase CV_LeafKind_DIMCONU_16t:{result = str8_lit(\"DIMCONU_16t\");}break;\r\ncase CV_LeafKind_DIMCONLU_16t:{result = str8_lit(\"DIMCONLU_16t\");}break;\r\ncase CV_LeafKind_DIMVARU_16t:{result = str8_lit(\"DIMVARU_16t\");}break;\r\ncase CV_LeafKind_DIMVARLU_16t:{result = str8_lit(\"DIMVARLU_16t\");}break;\r\ncase CV_LeafKind_REFSYM:{result = str8_lit(\"REFSYM\");}break;\r\ncase CV_LeafKind_BCLASS_16t:{result = str8_lit(\"BCLASS_16t\");}break;\r\ncase CV_LeafKind_VBCLASS_16t:{result = str8_lit(\"VBCLASS_16t\");}break;\r\ncase CV_LeafKind_IVBCLASS_16t:{result = str8_lit(\"IVBCLASS_16t\");}break;\r\ncase CV_LeafKind_ENUMERATE_ST:{result = str8_lit(\"ENUMERATE_ST\");}break;\r\ncase CV_LeafKind_FRIENDFCN_16t:{result = str8_lit(\"FRIENDFCN_16t\");}break;\r\ncase CV_LeafKind_INDEX_16t:{result = str8_lit(\"INDEX_16t\");}break;\r\ncase CV_LeafKind_MEMBER_16t:{result = str8_lit(\"MEMBER_16t\");}break;\r\ncase CV_LeafKind_STMEMBER_16t:{result = str8_lit(\"STMEMBER_16t\");}break;\r\ncase CV_LeafKind_METHOD_16t:{result = str8_lit(\"METHOD_16t\");}break;\r\ncase CV_LeafKind_NESTTYPE_16t:{result = str8_lit(\"NESTTYPE_16t\");}break;\r\ncase CV_LeafKind_VFUNCTAB_16t:{result = str8_lit(\"VFUNCTAB_16t\");}break;\r\ncase CV_LeafKind_FRIENDCLS_16t:{result = str8_lit(\"FRIENDCLS_16t\");}break;\r\ncase CV_LeafKind_ONEMETHOD_16t:{result = str8_lit(\"ONEMETHOD_16t\");}break;\r\ncase CV_LeafKind_VFUNCOFF_16t:{result = str8_lit(\"VFUNCOFF_16t\");}break;\r\ncase CV_LeafKind_TI16_MAX:{result = str8_lit(\"TI16_MAX\");}break;\r\ncase CV_LeafKind_MODIFIER:{result = str8_lit(\"MODIFIER\");}break;\r\ncase CV_LeafKind_POINTER:{result = str8_lit(\"POINTER\");}break;\r\ncase CV_LeafKind_ARRAY_ST:{result = str8_lit(\"ARRAY_ST\");}break;\r\ncase CV_LeafKind_CLASS_ST:{result = str8_lit(\"CLASS_ST\");}break;\r\ncase CV_LeafKind_STRUCTURE_ST:{result = str8_lit(\"STRUCTURE_ST\");}break;\r\ncase CV_LeafKind_UNION_ST:{result = str8_lit(\"UNION_ST\");}break;\r\ncase CV_LeafKind_ENUM_ST:{result = str8_lit(\"ENUM_ST\");}break;\r\ncase CV_LeafKind_PROCEDURE:{result = str8_lit(\"PROCEDURE\");}break;\r\ncase CV_LeafKind_MFUNCTION:{result = str8_lit(\"MFUNCTION\");}break;\r\ncase CV_LeafKind_COBOL0:{result = str8_lit(\"COBOL0\");}break;\r\ncase CV_LeafKind_BARRAY:{result = str8_lit(\"BARRAY\");}break;\r\ncase CV_LeafKind_DIMARRAY_ST:{result = str8_lit(\"DIMARRAY_ST\");}break;\r\ncase CV_LeafKind_VFTPATH:{result = str8_lit(\"VFTPATH\");}break;\r\ncase CV_LeafKind_PRECOMP_ST:{result = str8_lit(\"PRECOMP_ST\");}break;\r\ncase CV_LeafKind_OEM:{result = str8_lit(\"OEM\");}break;\r\ncase CV_LeafKind_ALIAS_ST:{result = str8_lit(\"ALIAS_ST\");}break;\r\ncase CV_LeafKind_OEM2:{result = str8_lit(\"OEM2\");}break;\r\ncase CV_LeafKind_SKIP:{result = str8_lit(\"SKIP\");}break;\r\ncase CV_LeafKind_ARGLIST:{result = str8_lit(\"ARGLIST\");}break;\r\ncase CV_LeafKind_DEFARG_ST:{result = str8_lit(\"DEFARG_ST\");}break;\r\ncase CV_LeafKind_FIELDLIST:{result = str8_lit(\"FIELDLIST\");}break;\r\ncase CV_LeafKind_DERIVED:{result = str8_lit(\"DERIVED\");}break;\r\ncase CV_LeafKind_BITFIELD:{result = str8_lit(\"BITFIELD\");}break;\r\ncase CV_LeafKind_METHODLIST:{result = str8_lit(\"METHODLIST\");}break;\r\ncase CV_LeafKind_DIMCONU:{result = str8_lit(\"DIMCONU\");}break;\r\ncase CV_LeafKind_DIMCONLU:{result = str8_lit(\"DIMCONLU\");}break;\r\ncase CV_LeafKind_DIMVARU:{result = str8_lit(\"DIMVARU\");}break;\r\ncase CV_LeafKind_DIMVARLU:{result = str8_lit(\"DIMVARLU\");}break;\r\ncase CV_LeafKind_BCLASS:{result = str8_lit(\"BCLASS\");}break;\r\ncase CV_LeafKind_VBCLASS:{result = str8_lit(\"VBCLASS\");}break;\r\ncase CV_LeafKind_IVBCLASS:{result = str8_lit(\"IVBCLASS\");}break;\r\ncase CV_LeafKind_FRIENDFCN_ST:{result = str8_lit(\"FRIENDFCN_ST\");}break;\r\ncase CV_LeafKind_INDEX:{result = str8_lit(\"INDEX\");}break;\r\ncase CV_LeafKind_MEMBER_ST:{result = str8_lit(\"MEMBER_ST\");}break;\r\ncase CV_LeafKind_STMEMBER_ST:{result = str8_lit(\"STMEMBER_ST\");}break;\r\ncase CV_LeafKind_METHOD_ST:{result = str8_lit(\"METHOD_ST\");}break;\r\ncase CV_LeafKind_NESTTYPE_ST:{result = str8_lit(\"NESTTYPE_ST\");}break;\r\ncase CV_LeafKind_VFUNCTAB:{result = str8_lit(\"VFUNCTAB\");}break;\r\ncase CV_LeafKind_FRIENDCLS:{result = str8_lit(\"FRIENDCLS\");}break;\r\ncase CV_LeafKind_ONEMETHOD_ST:{result = str8_lit(\"ONEMETHOD_ST\");}break;\r\ncase CV_LeafKind_VFUNCOFF:{result = str8_lit(\"VFUNCOFF\");}break;\r\ncase CV_LeafKind_NESTTYPEEX_ST:{result = str8_lit(\"NESTTYPEEX_ST\");}break;\r\ncase CV_LeafKind_MEMBERMODIFY_ST:{result = str8_lit(\"MEMBERMODIFY_ST\");}break;\r\ncase CV_LeafKind_MANAGED_ST:{result = str8_lit(\"MANAGED_ST\");}break;\r\ncase CV_LeafKind_ST_MAX:{result = str8_lit(\"ST_MAX\");}break;\r\ncase CV_LeafKind_TYPESERVER:{result = str8_lit(\"TYPESERVER\");}break;\r\ncase CV_LeafKind_ENUMERATE:{result = str8_lit(\"ENUMERATE\");}break;\r\ncase CV_LeafKind_ARRAY:{result = str8_lit(\"ARRAY\");}break;\r\ncase CV_LeafKind_CLASS:{result = str8_lit(\"CLASS\");}break;\r\ncase CV_LeafKind_STRUCTURE:{result = str8_lit(\"STRUCTURE\");}break;\r\ncase CV_LeafKind_UNION:{result = str8_lit(\"UNION\");}break;\r\ncase CV_LeafKind_ENUM:{result = str8_lit(\"ENUM\");}break;\r\ncase CV_LeafKind_DIMARRAY:{result = str8_lit(\"DIMARRAY\");}break;\r\ncase CV_LeafKind_PRECOMP:{result = str8_lit(\"PRECOMP\");}break;\r\ncase CV_LeafKind_ALIAS:{result = str8_lit(\"ALIAS\");}break;\r\ncase CV_LeafKind_DEFARG:{result = str8_lit(\"DEFARG\");}break;\r\ncase CV_LeafKind_FRIENDFCN:{result = str8_lit(\"FRIENDFCN\");}break;\r\ncase CV_LeafKind_MEMBER:{result = str8_lit(\"MEMBER\");}break;\r\ncase CV_LeafKind_STMEMBER:{result = str8_lit(\"STMEMBER\");}break;\r\ncase CV_LeafKind_METHOD:{result = str8_lit(\"METHOD\");}break;\r\ncase CV_LeafKind_NESTTYPE:{result = str8_lit(\"NESTTYPE\");}break;\r\ncase CV_LeafKind_ONEMETHOD:{result = str8_lit(\"ONEMETHOD\");}break;\r\ncase CV_LeafKind_NESTTYPEEX:{result = str8_lit(\"NESTTYPEEX\");}break;\r\ncase CV_LeafKind_MEMBERMODIFY:{result = str8_lit(\"MEMBERMODIFY\");}break;\r\ncase CV_LeafKind_MANAGED:{result = str8_lit(\"MANAGED\");}break;\r\ncase CV_LeafKind_TYPESERVER2:{result = str8_lit(\"TYPESERVER2\");}break;\r\ncase CV_LeafKind_STRIDED_ARRAY:{result = str8_lit(\"STRIDED_ARRAY\");}break;\r\ncase CV_LeafKind_HLSL:{result = str8_lit(\"HLSL\");}break;\r\ncase CV_LeafKind_MODIFIER_EX:{result = str8_lit(\"MODIFIER_EX\");}break;\r\ncase CV_LeafKind_INTERFACE:{result = str8_lit(\"INTERFACE\");}break;\r\ncase CV_LeafKind_BINTERFACE:{result = str8_lit(\"BINTERFACE\");}break;\r\ncase CV_LeafKind_VECTOR:{result = str8_lit(\"VECTOR\");}break;\r\ncase CV_LeafKind_MATRIX:{result = str8_lit(\"MATRIX\");}break;\r\ncase CV_LeafKind_VFTABLE:{result = str8_lit(\"VFTABLE\");}break;\r\ncase CV_LeafKind_FUNC_ID:{result = str8_lit(\"FUNC_ID\");}break;\r\ncase CV_LeafKind_MFUNC_ID:{result = str8_lit(\"MFUNC_ID\");}break;\r\ncase CV_LeafKind_BUILDINFO:{result = str8_lit(\"BUILDINFO\");}break;\r\ncase CV_LeafKind_SUBSTR_LIST:{result = str8_lit(\"SUBSTR_LIST\");}break;\r\ncase CV_LeafKind_STRING_ID:{result = str8_lit(\"STRING_ID\");}break;\r\ncase CV_LeafKind_UDT_SRC_LINE:{result = str8_lit(\"UDT_SRC_LINE\");}break;\r\ncase CV_LeafKind_UDT_MOD_SRC_LINE:{result = str8_lit(\"UDT_MOD_SRC_LINE\");}break;\r\ncase CV_LeafKind_CLASS2:{result = str8_lit(\"CLASS2\");}break;\r\ncase CV_LeafKind_STRUCT2:{result = str8_lit(\"STRUCT2\");}break;\r\n}\r\nreturn result;\r\n}\r\n\r\ninternal U64\r\ncv_header_struct_size_from_sym_kind(CV_SymKind v)\r\n{\r\nU64 result = 0;\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_SymKind_COMPILE:{result = sizeof(CV_SymCompile);}break;\r\ncase CV_SymKind_SSEARCH:{result = sizeof(CV_SymStartSearch);}break;\r\ncase CV_SymKind_RETURN:{result = sizeof(CV_SymReturn);}break;\r\ncase CV_SymKind_SLINK32:{result = sizeof(CV_SymSLink32);}break;\r\ncase CV_SymKind_OEM:{result = sizeof(CV_SymOEM);}break;\r\ncase CV_SymKind_VFTABLE32:{result = sizeof(CV_SymVPath32);}break;\r\ncase CV_SymKind_FRAMEPROC:{result = sizeof(CV_SymFrameproc);}break;\r\ncase CV_SymKind_ANNOTATION:{result = sizeof(CV_SymAnnotation);}break;\r\ncase CV_SymKind_OBJNAME:{result = sizeof(CV_SymObjName);}break;\r\ncase CV_SymKind_THUNK32:{result = sizeof(CV_SymThunk32);}break;\r\ncase CV_SymKind_BLOCK32:{result = sizeof(CV_SymBlock32);}break;\r\ncase CV_SymKind_LABEL32:{result = sizeof(CV_SymLabel32);}break;\r\ncase CV_SymKind_REGISTER:{result = sizeof(CV_SymRegister);}break;\r\ncase CV_SymKind_CONSTANT:{result = sizeof(CV_SymConstant);}break;\r\ncase CV_SymKind_UDT:{result = sizeof(CV_SymUDT);}break;\r\ncase CV_SymKind_MANYREG:{result = sizeof(CV_SymManyreg);}break;\r\ncase CV_SymKind_BPREL32:{result = sizeof(CV_SymBPRel32);}break;\r\ncase CV_SymKind_LDATA32:{result = sizeof(CV_SymData32);}break;\r\ncase CV_SymKind_GDATA32:{result = sizeof(CV_SymData32);}break;\r\ncase CV_SymKind_PUB32:{result = sizeof(CV_SymPub32);}break;\r\ncase CV_SymKind_LPROC32:{result = sizeof(CV_SymProc32);}break;\r\ncase CV_SymKind_GPROC32:{result = sizeof(CV_SymProc32);}break;\r\ncase CV_SymKind_REGREL32:{result = sizeof(CV_SymRegrel32);}break;\r\ncase CV_SymKind_LTHREAD32:{result = sizeof(CV_SymThread32);}break;\r\ncase CV_SymKind_GTHREAD32:{result = sizeof(CV_SymThread32);}break;\r\ncase CV_SymKind_COMPILE2:{result = sizeof(CV_SymCompile2);}break;\r\ncase CV_SymKind_MANYREG2:{result = sizeof(CV_SymManyreg2);}break;\r\ncase CV_SymKind_LOCALSLOT:{result = sizeof(CV_SymSlot);}break;\r\ncase CV_SymKind_MANFRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break;\r\ncase CV_SymKind_MANREGISTER:{result = sizeof(CV_SymAttrReg);}break;\r\ncase CV_SymKind_MANMANYREG:{result = sizeof(CV_SymAttrManyReg);}break;\r\ncase CV_SymKind_MANREGREL:{result = sizeof(CV_SymAttrRegRel);}break;\r\ncase CV_SymKind_UNAMESPACE:{result = sizeof(CV_SymUNamespace);}break;\r\ncase CV_SymKind_PROCREF:{result = sizeof(CV_SymRef2);}break;\r\ncase CV_SymKind_DATAREF:{result = sizeof(CV_SymRef2);}break;\r\ncase CV_SymKind_LPROCREF:{result = sizeof(CV_SymRef2);}break;\r\ncase CV_SymKind_TRAMPOLINE:{result = sizeof(CV_SymTrampoline);}break;\r\ncase CV_SymKind_ATTR_FRAMEREL:{result = sizeof(CV_SymAttrFrameRel);}break;\r\ncase CV_SymKind_ATTR_REGISTER:{result = sizeof(CV_SymAttrReg);}break;\r\ncase CV_SymKind_ATTR_REGREL:{result = sizeof(CV_SymAttrRegRel);}break;\r\ncase CV_SymKind_ATTR_MANYREG:{result = sizeof(CV_SymAttrManyReg);}break;\r\ncase CV_SymKind_SEPCODE:{result = sizeof(CV_SymSepcode);}break;\r\ncase CV_SymKind_SECTION:{result = sizeof(CV_SymSection);}break;\r\ncase CV_SymKind_COFFGROUP:{result = sizeof(CV_SymCoffGroup);}break;\r\ncase CV_SymKind_EXPORT:{result = sizeof(CV_SymExport);}break;\r\ncase CV_SymKind_CALLSITEINFO:{result = sizeof(CV_SymCallSiteInfo);}break;\r\ncase CV_SymKind_FRAMECOOKIE:{result = sizeof(CV_SymFrameCookie);}break;\r\ncase CV_SymKind_DISCARDED:{result = sizeof(CV_SymDiscarded);}break;\r\ncase CV_SymKind_COMPILE3:{result = sizeof(CV_SymCompile3);}break;\r\ncase CV_SymKind_ENVBLOCK:{result = sizeof(CV_SymEnvBlock);}break;\r\ncase CV_SymKind_LOCAL:{result = sizeof(CV_SymLocal);}break;\r\ncase CV_SymKind_DEFRANGE_SUBFIELD:{result = sizeof(CV_SymDefrangeSubfield);}break;\r\ncase CV_SymKind_DEFRANGE_REGISTER:{result = sizeof(CV_SymDefrangeRegister);}break;\r\ncase CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:{result = sizeof(CV_SymDefrangeFramepointerRel);}break;\r\ncase CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:{result = sizeof(CV_SymDefrangeSubfieldRegister);}break;\r\ncase CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:{result = sizeof(CV_SymDefrangeFramepointerRelFullScope);}break;\r\ncase CV_SymKind_DEFRANGE_REGISTER_REL:{result = sizeof(CV_SymDefrangeRegisterRel);}break;\r\ncase CV_SymKind_BUILDINFO:{result = sizeof(CV_SymBuildInfo);}break;\r\ncase CV_SymKind_INLINESITE:{result = sizeof(CV_SymInlineSite);}break;\r\ncase CV_SymKind_FILESTATIC:{result = sizeof(CV_SymFileStatic);}break;\r\ncase CV_SymKind_CALLEES:{result = sizeof(CV_SymFunctionList);}break;\r\ncase CV_SymKind_CALLERS:{result = sizeof(CV_SymFunctionList);}break;\r\ncase CV_SymKind_POGODATA:{result = sizeof(CV_SymPogoInfo);}break;\r\ncase CV_SymKind_INLINESITE2:{result = sizeof(CV_SymInlineSite2);}break;\r\ncase CV_SymKind_HEAPALLOCSITE:{result = sizeof(CV_SymHeapAllocSite);}break;\r\ncase CV_SymKind_MOD_TYPEREF:{result = sizeof(CV_SymModTypeRef);}break;\r\ncase CV_SymKind_REF_MINIPDB:{result = sizeof(CV_SymRefMiniPdb);}break;\r\ncase CV_SymKind_FASTLINK:{result = sizeof(CV_SymFastLink);}break;\r\ncase CV_SymKind_INLINEES:{result = sizeof(CV_SymInlinees);}break;\r\n}\r\nreturn result;\r\n}\r\ninternal U64\r\ncv_header_struct_size_from_leaf_kind(CV_LeafKind v)\r\n{\r\nU64 result = 0;\r\nswitch(v)\r\n{\r\ndefault:{}break;\r\ncase CV_LeafKind_VTSHAPE:{result = sizeof(CV_LeafVTShape);}break;\r\ncase CV_LeafKind_LABEL:{result = sizeof(CV_LeafLabel);}break;\r\ncase CV_LeafKind_MODIFIER:{result = sizeof(CV_LeafModifier);}break;\r\ncase CV_LeafKind_POINTER:{result = sizeof(CV_LeafPointer);}break;\r\ncase CV_LeafKind_PROCEDURE:{result = sizeof(CV_LeafProcedure);}break;\r\ncase CV_LeafKind_MFUNCTION:{result = sizeof(CV_LeafMFunction);}break;\r\ncase CV_LeafKind_VFTPATH:{result = sizeof(CV_LeafVFPath);}break;\r\ncase CV_LeafKind_SKIP:{result = sizeof(CV_LeafSkip);}break;\r\ncase CV_LeafKind_ARGLIST:{result = sizeof(CV_LeafArgList);}break;\r\ncase CV_LeafKind_BITFIELD:{result = sizeof(CV_LeafBitField);}break;\r\ncase CV_LeafKind_METHODLIST:{result = sizeof(CV_LeafMethodListMember);}break;\r\ncase CV_LeafKind_BCLASS:{result = sizeof(CV_LeafBClass);}break;\r\ncase CV_LeafKind_VBCLASS:{result = sizeof(CV_LeafVBClass);}break;\r\ncase CV_LeafKind_INDEX:{result = sizeof(CV_LeafIndex);}break;\r\ncase CV_LeafKind_VFUNCTAB:{result = sizeof(CV_LeafVFuncTab);}break;\r\ncase CV_LeafKind_VFUNCOFF:{result = sizeof(CV_LeafVFuncOff);}break;\r\ncase CV_LeafKind_TYPESERVER:{result = sizeof(CV_LeafTypeServer);}break;\r\ncase CV_LeafKind_ENUMERATE:{result = sizeof(CV_LeafEnumerate);}break;\r\ncase CV_LeafKind_ARRAY:{result = sizeof(CV_LeafArray);}break;\r\ncase CV_LeafKind_CLASS:{result = sizeof(CV_LeafStruct);}break;\r\ncase CV_LeafKind_STRUCTURE:{result = sizeof(CV_LeafStruct);}break;\r\ncase CV_LeafKind_UNION:{result = sizeof(CV_LeafUnion);}break;\r\ncase CV_LeafKind_ENUM:{result = sizeof(CV_LeafEnum);}break;\r\ncase CV_LeafKind_PRECOMP:{result = sizeof(CV_LeafPreComp);}break;\r\ncase CV_LeafKind_ALIAS:{result = sizeof(CV_LeafAlias);}break;\r\ncase CV_LeafKind_MEMBER:{result = sizeof(CV_LeafMember);}break;\r\ncase CV_LeafKind_STMEMBER:{result = sizeof(CV_LeafStMember);}break;\r\ncase CV_LeafKind_METHOD:{result = sizeof(CV_LeafMethod);}break;\r\ncase CV_LeafKind_NESTTYPE:{result = sizeof(CV_LeafNestType);}break;\r\ncase CV_LeafKind_ONEMETHOD:{result = sizeof(CV_LeafOneMethod);}break;\r\ncase CV_LeafKind_NESTTYPEEX:{result = sizeof(CV_LeafNestTypeEx);}break;\r\ncase CV_LeafKind_TYPESERVER2:{result = sizeof(CV_LeafTypeServer2);}break;\r\ncase CV_LeafKind_INTERFACE:{result = sizeof(CV_LeafStruct);}break;\r\ncase CV_LeafKind_FUNC_ID:{result = sizeof(CV_LeafFuncId);}break;\r\ncase CV_LeafKind_MFUNC_ID:{result = sizeof(CV_LeafMFuncId);}break;\r\ncase CV_LeafKind_BUILDINFO:{result = sizeof(CV_LeafBuildInfo);}break;\r\ncase CV_LeafKind_SUBSTR_LIST:{result = sizeof(CV_LeafSubstrList);}break;\r\ncase CV_LeafKind_STRING_ID:{result = sizeof(CV_LeafStringId);}break;\r\ncase CV_LeafKind_UDT_SRC_LINE:{result = sizeof(CV_LeafUDTSrcLine);}break;\r\ncase CV_LeafKind_UDT_MOD_SRC_LINE:{result = sizeof(CV_LeafUDTModSrcLine);}break;\r\ncase CV_LeafKind_CLASS2:{result = sizeof(CV_LeafStruct2);}break;\r\ncase CV_LeafKind_STRUCT2:{result = sizeof(CV_LeafStruct2);}break;\r\n}\r\nreturn result;\r\n}\r\n"
  },
  {
    "path": "src/codeview/generated/codeview.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef CODEVIEW_META_H\r\n#define CODEVIEW_META_H\r\n\r\ntypedef U16 CV_NumericKind;\r\ntypedef enum CV_NumericKindEnum\r\n{\r\nCV_NumericKind_CHAR = 0x8000,\r\nCV_NumericKind_SHORT = 0x8001,\r\nCV_NumericKind_USHORT = 0x8002,\r\nCV_NumericKind_LONG = 0x8003,\r\nCV_NumericKind_ULONG = 0x8004,\r\nCV_NumericKind_FLOAT32 = 0x8005,\r\nCV_NumericKind_FLOAT64 = 0x8006,\r\nCV_NumericKind_FLOAT80 = 0x8007,\r\nCV_NumericKind_FLOAT128 = 0x8008,\r\nCV_NumericKind_QUADWORD = 0x8009,\r\nCV_NumericKind_UQUADWORD = 0x800a,\r\nCV_NumericKind_FLOAT48 = 0x800b,\r\nCV_NumericKind_COMPLEX32 = 0x800c,\r\nCV_NumericKind_COMPLEX64 = 0x800d,\r\nCV_NumericKind_COMPLEX80 = 0x800e,\r\nCV_NumericKind_COMPLEX128 = 0x800f,\r\nCV_NumericKind_VARSTRING = 0x8010,\r\nCV_NumericKind_OCTWORD = 0x8017,\r\nCV_NumericKind_UOCTWORD = 0x8018,\r\nCV_NumericKind_DECIMAL = 0x8019,\r\nCV_NumericKind_DATE = 0x801a,\r\nCV_NumericKind_UTF8STRING = 0x801b,\r\nCV_NumericKind_FLOAT16 = 0x801c,\r\n} CV_NumericKindEnum;\r\n\r\ntypedef U16 CV_Arch;\r\ntypedef enum CV_ArchEnum\r\n{\r\nCV_Arch_8080 = 0x00,\r\nCV_Arch_8086 = 0x01,\r\nCV_Arch_80286 = 0x02,\r\nCV_Arch_80386 = 0x03,\r\nCV_Arch_80486 = 0x04,\r\nCV_Arch_PENTIUM = 0x05,\r\nCV_Arch_PENTIUMII = 0x06,\r\nCV_Arch_PENTIUMIII = 0x07,\r\nCV_Arch_MIPS = 0x10,\r\nCV_Arch_MIPS16 = 0x11,\r\nCV_Arch_MIPS32 = 0x12,\r\nCV_Arch_MIPS64 = 0x13,\r\nCV_Arch_MIPSI = 0x14,\r\nCV_Arch_MIPSII = 0x15,\r\nCV_Arch_MIPSIII = 0x16,\r\nCV_Arch_MIPSIV = 0x17,\r\nCV_Arch_MIPSV = 0x18,\r\nCV_Arch_M68000 = 0x20,\r\nCV_Arch_M68010 = 0x21,\r\nCV_Arch_M68020 = 0x22,\r\nCV_Arch_M68030 = 0x23,\r\nCV_Arch_M68040 = 0x24,\r\nCV_Arch_ALPHA = 0x30,\r\nCV_Arch_ALPHA_21164 = 0x31,\r\nCV_Arch_ALPHA_21164A = 0x32,\r\nCV_Arch_ALPHA_21264 = 0x33,\r\nCV_Arch_ALPHA_21364 = 0x34,\r\nCV_Arch_PPC601 = 0x40,\r\nCV_Arch_PPC603 = 0x41,\r\nCV_Arch_PPC604 = 0x42,\r\nCV_Arch_PPC620 = 0x43,\r\nCV_Arch_PPCFP = 0x44,\r\nCV_Arch_PPCBE = 0x45,\r\nCV_Arch_SH3 = 0x50,\r\nCV_Arch_SH3E = 0x51,\r\nCV_Arch_SH3DSP = 0x52,\r\nCV_Arch_SH4 = 0x53,\r\nCV_Arch_SHMEDIA = 0x54,\r\nCV_Arch_ARM3 = 0x60,\r\nCV_Arch_ARM4 = 0x61,\r\nCV_Arch_ARM4T = 0x62,\r\nCV_Arch_ARM5 = 0x63,\r\nCV_Arch_ARM5T = 0x64,\r\nCV_Arch_ARM6 = 0x65,\r\nCV_Arch_ARM_XMAC = 0x66,\r\nCV_Arch_ARM_WMMX = 0x67,\r\nCV_Arch_ARM7 = 0x68,\r\nCV_Arch_OMNI = 0x70,\r\nCV_Arch_IA64_1 = 0x80,\r\nCV_Arch_IA64_2 = 0x81,\r\nCV_Arch_CEE = 0x90,\r\nCV_Arch_AM33 = 0xA0,\r\nCV_Arch_M32R = 0xB0,\r\nCV_Arch_TRICORE = 0xC0,\r\nCV_Arch_X64 = 0xD0,\r\nCV_Arch_EBC = 0xE0,\r\nCV_Arch_THUMB = 0xF0,\r\nCV_Arch_ARMNT = 0xF4,\r\nCV_Arch_ARM64 = 0xF6,\r\nCV_Arch_D3D11_SHADER = 0x100,\r\nCV_Arch_IA64        = CV_Arch_IA64_1,\r\nCV_Arch_PENTIUMPRO  = CV_Arch_PENTIUMII,\r\nCV_Arch_MIPSR4000   = CV_Arch_MIPS,\r\nCV_Arch_ALPHA_21064 = CV_Arch_ALPHA,\r\nCV_Arch_AMD64       = CV_Arch_X64,\r\n} CV_ArchEnum;\r\n\r\ntypedef U16 CV_AllReg;\r\ntypedef enum CV_AllRegEnum\r\n{\r\nCV_AllReg_ERR = 30000,\r\nCV_AllReg_TEB = 30001,\r\nCV_AllReg_TIMER = 30002,\r\nCV_AllReg_EFAD1 = 30003,\r\nCV_AllReg_EFAD2 = 30004,\r\nCV_AllReg_EFAD3 = 30005,\r\nCV_AllReg_VFRAME = 30006,\r\nCV_AllReg_HANDLE = 30007,\r\nCV_AllReg_PARAMS = 30008,\r\nCV_AllReg_LOCALS = 30009,\r\nCV_AllReg_TID = 30010,\r\nCV_AllReg_ENV = 30011,\r\nCV_AllReg_CMDLN = 30012,\r\n} CV_AllRegEnum;\r\n\r\ntypedef U16 CV_SymKind;\r\ntypedef enum CV_SymKindEnum\r\n{\r\nCV_SymKind_COMPILE = 0x0001,\r\nCV_SymKind_REGISTER_16t = 0x0002,\r\nCV_SymKind_CONSTANT_16t = 0x0003,\r\nCV_SymKind_UDT_16t = 0x0004,\r\nCV_SymKind_SSEARCH = 0x0005,\r\nCV_SymKind_END = 0x0006,\r\nCV_SymKind_SKIP = 0x0007,\r\nCV_SymKind_CVRESERVE = 0x0008,\r\nCV_SymKind_OBJNAME_ST = 0x0009,\r\nCV_SymKind_ENDARG = 0x000a,\r\nCV_SymKind_COBOLUDT_16t = 0x000b,\r\nCV_SymKind_MANYREG_16t = 0x000c,\r\nCV_SymKind_RETURN = 0x000d,\r\nCV_SymKind_ENTRYTHIS = 0x000e,\r\nCV_SymKind_BPREL16 = 0x0100,\r\nCV_SymKind_LDATA16 = 0x0101,\r\nCV_SymKind_GDATA16 = 0x0102,\r\nCV_SymKind_PUB16 = 0x0103,\r\nCV_SymKind_LPROC16 = 0x0104,\r\nCV_SymKind_GPROC16 = 0x0105,\r\nCV_SymKind_THUNK16 = 0x0106,\r\nCV_SymKind_BLOCK16 = 0x0107,\r\nCV_SymKind_WITH16 = 0x0108,\r\nCV_SymKind_LABEL16 = 0x0109,\r\nCV_SymKind_CEXMODEL16 = 0x010a,\r\nCV_SymKind_VFTABLE16 = 0x010b,\r\nCV_SymKind_REGREL16 = 0x010c,\r\nCV_SymKind_BPREL32_16t = 0x0200,\r\nCV_SymKind_LDATA32_16t = 0x0201,\r\nCV_SymKind_GDATA32_16t = 0x0202,\r\nCV_SymKind_PUB32_16t = 0x0203,\r\nCV_SymKind_LPROC32_16t = 0x0204,\r\nCV_SymKind_GPROC32_16t = 0x0205,\r\nCV_SymKind_THUNK32_ST = 0x0206,\r\nCV_SymKind_BLOCK32_ST = 0x0207,\r\nCV_SymKind_WITH32_ST = 0x0208,\r\nCV_SymKind_LABEL32_ST = 0x0209,\r\nCV_SymKind_CEXMODEL32 = 0x020a,\r\nCV_SymKind_VFTABLE32_16t = 0x020b,\r\nCV_SymKind_REGREL32_16t = 0x020c,\r\nCV_SymKind_LTHREAD32_16t = 0x020d,\r\nCV_SymKind_GTHREAD32_16t = 0x020e,\r\nCV_SymKind_SLINK32 = 0x020f,\r\nCV_SymKind_LPROCMIPS_16t = 0x0300,\r\nCV_SymKind_GPROCMIPS_16t = 0x0301,\r\nCV_SymKind_PROCREF_ST = 0x0400,\r\nCV_SymKind_DATAREF_ST = 0x0401,\r\nCV_SymKind_ALIGN = 0x0402,\r\nCV_SymKind_LPROCREF_ST = 0x0403,\r\nCV_SymKind_OEM = 0x0404,\r\nCV_SymKind_TI16_MAX = 0x1000,\r\nCV_SymKind_CONSTANT_ST = 0x1002,\r\nCV_SymKind_UDT_ST = 0x1003,\r\nCV_SymKind_COBOLUDT_ST = 0x1004,\r\nCV_SymKind_MANYREG_ST = 0x1005,\r\nCV_SymKind_BPREL32_ST = 0x1006,\r\nCV_SymKind_LDATA32_ST = 0x1007,\r\nCV_SymKind_GDATA32_ST = 0x1008,\r\nCV_SymKind_PUB32_ST = 0x1009,\r\nCV_SymKind_LPROC32_ST = 0x100a,\r\nCV_SymKind_GPROC32_ST = 0x100b,\r\nCV_SymKind_VFTABLE32 = 0x100c,\r\nCV_SymKind_REGREL32_ST = 0x100d,\r\nCV_SymKind_LTHREAD32_ST = 0x100e,\r\nCV_SymKind_GTHREAD32_ST = 0x100f,\r\nCV_SymKind_LPROCMIPS_ST = 0x1010,\r\nCV_SymKind_GPROCMIPS_ST = 0x1011,\r\nCV_SymKind_FRAMEPROC = 0x1012,\r\nCV_SymKind_COMPILE2_ST = 0x1013,\r\nCV_SymKind_MANYREG2_ST = 0x1014,\r\nCV_SymKind_LPROCIA64_ST = 0x1015,\r\nCV_SymKind_GPROCIA64_ST = 0x1016,\r\nCV_SymKind_LOCALSLOT_ST = 0x1017,\r\nCV_SymKind_PARAMSLOT_ST = 0x1018,\r\nCV_SymKind_ANNOTATION = 0x1019,\r\nCV_SymKind_GMANPROC_ST = 0x101a,\r\nCV_SymKind_LMANPROC_ST = 0x101b,\r\nCV_SymKind_RESERVED1 = 0x101c,\r\nCV_SymKind_RESERVED2 = 0x101d,\r\nCV_SymKind_RESERVED3 = 0x101e,\r\nCV_SymKind_RESERVED4 = 0x101f,\r\nCV_SymKind_LMANDATA_ST = 0x1020,\r\nCV_SymKind_GMANDATA_ST = 0x1021,\r\nCV_SymKind_MANFRAMEREL_ST = 0x1022,\r\nCV_SymKind_MANREGISTER_ST = 0x1023,\r\nCV_SymKind_MANSLOT_ST = 0x1024,\r\nCV_SymKind_MANMANYREG_ST = 0x1025,\r\nCV_SymKind_MANREGREL_ST = 0x1026,\r\nCV_SymKind_MANMANYREG2_ST = 0x1027,\r\nCV_SymKind_MANTYPREF = 0x1028,\r\nCV_SymKind_UNAMESPACE_ST = 0x1029,\r\nCV_SymKind_ST_MAX = 0x1100,\r\nCV_SymKind_OBJNAME = 0x1101,\r\nCV_SymKind_THUNK32 = 0x1102,\r\nCV_SymKind_BLOCK32 = 0x1103,\r\nCV_SymKind_WITH32 = 0x1104,\r\nCV_SymKind_LABEL32 = 0x1105,\r\nCV_SymKind_REGISTER = 0x1106,\r\nCV_SymKind_CONSTANT = 0x1107,\r\nCV_SymKind_UDT = 0x1108,\r\nCV_SymKind_COBOLUDT = 0x1109,\r\nCV_SymKind_MANYREG = 0x110a,\r\nCV_SymKind_BPREL32 = 0x110b,\r\nCV_SymKind_LDATA32 = 0x110c,\r\nCV_SymKind_GDATA32 = 0x110d,\r\nCV_SymKind_PUB32 = 0x110e,\r\nCV_SymKind_LPROC32 = 0x110f,\r\nCV_SymKind_GPROC32 = 0x1110,\r\nCV_SymKind_REGREL32 = 0x1111,\r\nCV_SymKind_LTHREAD32 = 0x1112,\r\nCV_SymKind_GTHREAD32 = 0x1113,\r\nCV_SymKind_LPROCMIPS = 0x1114,\r\nCV_SymKind_GPROCMIPS = 0x1115,\r\nCV_SymKind_COMPILE2 = 0x1116,\r\nCV_SymKind_MANYREG2 = 0x1117,\r\nCV_SymKind_LPROCIA64 = 0x1118,\r\nCV_SymKind_GPROCIA64 = 0x1119,\r\nCV_SymKind_LOCALSLOT = 0x111a,\r\nCV_SymKind_PARAMSLOT = 0x111b,\r\nCV_SymKind_LMANDATA = 0x111c,\r\nCV_SymKind_GMANDATA = 0x111d,\r\nCV_SymKind_MANFRAMEREL = 0x111e,\r\nCV_SymKind_MANREGISTER = 0x111f,\r\nCV_SymKind_MANSLOT = 0x1120,\r\nCV_SymKind_MANMANYREG = 0x1121,\r\nCV_SymKind_MANREGREL = 0x1122,\r\nCV_SymKind_MANMANYREG2 = 0x1123,\r\nCV_SymKind_UNAMESPACE = 0x1124,\r\nCV_SymKind_PROCREF = 0x1125,\r\nCV_SymKind_DATAREF = 0x1126,\r\nCV_SymKind_LPROCREF = 0x1127,\r\nCV_SymKind_ANNOTATIONREF = 0x1128,\r\nCV_SymKind_TOKENREF = 0x1129,\r\nCV_SymKind_GMANPROC = 0x112a,\r\nCV_SymKind_LMANPROC = 0x112b,\r\nCV_SymKind_TRAMPOLINE = 0x112c,\r\nCV_SymKind_MANCONSTANT = 0x112d,\r\nCV_SymKind_ATTR_FRAMEREL = 0x112e,\r\nCV_SymKind_ATTR_REGISTER = 0x112f,\r\nCV_SymKind_ATTR_REGREL = 0x1130,\r\nCV_SymKind_ATTR_MANYREG = 0x1131,\r\nCV_SymKind_SEPCODE = 0x1132,\r\nCV_SymKind_DEFRANGE_2005 = 0x1134,\r\nCV_SymKind_DEFRANGE2_2005 = 0x1135,\r\nCV_SymKind_SECTION = 0x1136,\r\nCV_SymKind_COFFGROUP = 0x1137,\r\nCV_SymKind_EXPORT = 0x1138,\r\nCV_SymKind_CALLSITEINFO = 0x1139,\r\nCV_SymKind_FRAMECOOKIE = 0x113a,\r\nCV_SymKind_DISCARDED = 0x113b,\r\nCV_SymKind_COMPILE3 = 0x113c,\r\nCV_SymKind_ENVBLOCK = 0x113d,\r\nCV_SymKind_LOCAL = 0x113e,\r\nCV_SymKind_DEFRANGE = 0x113f,\r\nCV_SymKind_DEFRANGE_SUBFIELD = 0x1140,\r\nCV_SymKind_DEFRANGE_REGISTER = 0x1141,\r\nCV_SymKind_DEFRANGE_FRAMEPOINTER_REL = 0x1142,\r\nCV_SymKind_DEFRANGE_SUBFIELD_REGISTER = 0x1143,\r\nCV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE = 0x1144,\r\nCV_SymKind_DEFRANGE_REGISTER_REL = 0x1145,\r\nCV_SymKind_LPROC32_ID = 0x1146,\r\nCV_SymKind_GPROC32_ID = 0x1147,\r\nCV_SymKind_LPROCMIPS_ID = 0x1148,\r\nCV_SymKind_GPROCMIPS_ID = 0x1149,\r\nCV_SymKind_LPROCIA64_ID = 0x114a,\r\nCV_SymKind_GPROCIA64_ID = 0x114b,\r\nCV_SymKind_BUILDINFO = 0x114c,\r\nCV_SymKind_INLINESITE = 0x114d,\r\nCV_SymKind_INLINESITE_END = 0x114e,\r\nCV_SymKind_PROC_ID_END = 0x114f,\r\nCV_SymKind_DEFRANGE_HLSL = 0x1150,\r\nCV_SymKind_GDATA_HLSL = 0x1151,\r\nCV_SymKind_LDATA_HLSL = 0x1152,\r\nCV_SymKind_FILESTATIC = 0x1153,\r\nCV_SymKind_LPROC32_DPC = 0x1155,\r\nCV_SymKind_LPROC32_DPC_ID = 0x1156,\r\nCV_SymKind_DEFRANGE_DPC_PTR_TAG = 0x1157,\r\nCV_SymKind_DPC_SYM_TAG_MAP = 0x1158,\r\nCV_SymKind_ARMSWITCHTABLE = 0x1159,\r\nCV_SymKind_CALLEES = 0x115a,\r\nCV_SymKind_CALLERS = 0x115b,\r\nCV_SymKind_POGODATA = 0x115c,\r\nCV_SymKind_INLINESITE2 = 0x115d,\r\nCV_SymKind_HEAPALLOCSITE = 0x115e,\r\nCV_SymKind_MOD_TYPEREF = 0x115f,\r\nCV_SymKind_REF_MINIPDB = 0x1160,\r\nCV_SymKind_PDBMAP = 0x1161,\r\nCV_SymKind_GDATA_HLSL32 = 0x1162,\r\nCV_SymKind_LDATA_HLSL32 = 0x1163,\r\nCV_SymKind_GDATA_HLSL32_EX = 0x1164,\r\nCV_SymKind_LDATA_HLSL32_EX = 0x1165,\r\nCV_SymKind_FASTLINK = 0x1167,\r\nCV_SymKind_INLINEES = 0x1168,\r\n} CV_SymKindEnum;\r\n\r\ntypedef U8 CV_BasicType;\r\ntypedef enum CV_BasicTypeEnum\r\n{\r\nCV_BasicType_NOTYPE = 0x00,\r\nCV_BasicType_ABS = 0x01,\r\nCV_BasicType_SEGMENT = 0x02,\r\nCV_BasicType_VOID = 0x03,\r\nCV_BasicType_CURRENCY = 0x04,\r\nCV_BasicType_NBASICSTR = 0x05,\r\nCV_BasicType_FBASICSTR = 0x06,\r\nCV_BasicType_NOTTRANS = 0x07,\r\nCV_BasicType_HRESULT = 0x08,\r\nCV_BasicType_CHAR = 0x10,\r\nCV_BasicType_SHORT = 0x11,\r\nCV_BasicType_LONG = 0x12,\r\nCV_BasicType_QUAD = 0x13,\r\nCV_BasicType_OCT = 0x14,\r\nCV_BasicType_UCHAR = 0x20,\r\nCV_BasicType_USHORT = 0x21,\r\nCV_BasicType_ULONG = 0x22,\r\nCV_BasicType_UQUAD = 0x23,\r\nCV_BasicType_UOCT = 0x24,\r\nCV_BasicType_BOOL8 = 0x30,\r\nCV_BasicType_BOOL16 = 0x31,\r\nCV_BasicType_BOOL32 = 0x32,\r\nCV_BasicType_BOOL64 = 0x33,\r\nCV_BasicType_FLOAT32 = 0x40,\r\nCV_BasicType_FLOAT64 = 0x41,\r\nCV_BasicType_FLOAT80 = 0x42,\r\nCV_BasicType_FLOAT128 = 0x43,\r\nCV_BasicType_FLOAT48 = 0x44,\r\nCV_BasicType_FLOAT32PP = 0x45,\r\nCV_BasicType_FLOAT16 = 0x46,\r\nCV_BasicType_COMPLEX32 = 0x50,\r\nCV_BasicType_COMPLEX64 = 0x51,\r\nCV_BasicType_COMPLEX80 = 0x52,\r\nCV_BasicType_COMPLEX128 = 0x53,\r\nCV_BasicType_BIT = 0x60,\r\nCV_BasicType_PASCHAR = 0x61,\r\nCV_BasicType_BOOL32FF = 0x62,\r\nCV_BasicType_INT8 = 0x68,\r\nCV_BasicType_UINT8 = 0x69,\r\nCV_BasicType_RCHAR = 0x70,\r\nCV_BasicType_WCHAR = 0x71,\r\nCV_BasicType_INT16 = 0x72,\r\nCV_BasicType_UINT16 = 0x73,\r\nCV_BasicType_INT32 = 0x74,\r\nCV_BasicType_UINT32 = 0x75,\r\nCV_BasicType_INT64 = 0x76,\r\nCV_BasicType_UINT64 = 0x77,\r\nCV_BasicType_INT128 = 0x78,\r\nCV_BasicType_UINT128 = 0x79,\r\nCV_BasicType_CHAR16 = 0x7a,\r\nCV_BasicType_CHAR32 = 0x7b,\r\nCV_BasicType_CHAR8 = 0x7c,\r\nCV_BasicType_PTR = 0xf0,\r\n} CV_BasicTypeEnum;\r\n\r\ntypedef U16 CV_LeafKind;\r\ntypedef enum CV_LeafKindEnum\r\n{\r\nCV_LeafKind_NOTYPE = 0x0000,\r\nCV_LeafKind_MODIFIER_16t = 0x0001,\r\nCV_LeafKind_POINTER_16t = 0x0002,\r\nCV_LeafKind_ARRAY_16t = 0x0003,\r\nCV_LeafKind_CLASS_16t = 0x0004,\r\nCV_LeafKind_STRUCTURE_16t = 0x0005,\r\nCV_LeafKind_UNION_16t = 0x0006,\r\nCV_LeafKind_ENUM_16t = 0x0007,\r\nCV_LeafKind_PROCEDURE_16t = 0x0008,\r\nCV_LeafKind_MFUNCTION_16t = 0x0009,\r\nCV_LeafKind_VTSHAPE = 0x000a,\r\nCV_LeafKind_COBOL0_16t = 0x000b,\r\nCV_LeafKind_COBOL1 = 0x000c,\r\nCV_LeafKind_BARRAY_16t = 0x000d,\r\nCV_LeafKind_LABEL = 0x000e,\r\nCV_LeafKind_NULL = 0x000f,\r\nCV_LeafKind_NOTTRAN = 0x0010,\r\nCV_LeafKind_DIMARRAY_16t = 0x0011,\r\nCV_LeafKind_VFTPATH_16t = 0x0012,\r\nCV_LeafKind_PRECOMP_16t = 0x0013,\r\nCV_LeafKind_ENDPRECOMP = 0x0014,\r\nCV_LeafKind_OEM_16t = 0x0015,\r\nCV_LeafKind_TYPESERVER_ST = 0x0016,\r\nCV_LeafKind_SKIP_16t = 0x0200,\r\nCV_LeafKind_ARGLIST_16t = 0x0201,\r\nCV_LeafKind_DEFARG_16t = 0x0202,\r\nCV_LeafKind_LIST = 0x0203,\r\nCV_LeafKind_FIELDLIST_16t = 0x0204,\r\nCV_LeafKind_DERIVED_16t = 0x0205,\r\nCV_LeafKind_BITFIELD_16t = 0x0206,\r\nCV_LeafKind_METHODLIST_16t = 0x0207,\r\nCV_LeafKind_DIMCONU_16t = 0x0208,\r\nCV_LeafKind_DIMCONLU_16t = 0x0209,\r\nCV_LeafKind_DIMVARU_16t = 0x020a,\r\nCV_LeafKind_DIMVARLU_16t = 0x020b,\r\nCV_LeafKind_REFSYM = 0x020c,\r\nCV_LeafKind_BCLASS_16t = 0x0400,\r\nCV_LeafKind_VBCLASS_16t = 0x0401,\r\nCV_LeafKind_IVBCLASS_16t = 0x0402,\r\nCV_LeafKind_ENUMERATE_ST = 0x0403,\r\nCV_LeafKind_FRIENDFCN_16t = 0x0404,\r\nCV_LeafKind_INDEX_16t = 0x0405,\r\nCV_LeafKind_MEMBER_16t = 0x0406,\r\nCV_LeafKind_STMEMBER_16t = 0x0407,\r\nCV_LeafKind_METHOD_16t = 0x0408,\r\nCV_LeafKind_NESTTYPE_16t = 0x0409,\r\nCV_LeafKind_VFUNCTAB_16t = 0x040a,\r\nCV_LeafKind_FRIENDCLS_16t = 0x040b,\r\nCV_LeafKind_ONEMETHOD_16t = 0x040c,\r\nCV_LeafKind_VFUNCOFF_16t = 0x040d,\r\nCV_LeafKind_TI16_MAX = 0x1000,\r\nCV_LeafKind_MODIFIER = 0x1001,\r\nCV_LeafKind_POINTER = 0x1002,\r\nCV_LeafKind_ARRAY_ST = 0x1003,\r\nCV_LeafKind_CLASS_ST = 0x1004,\r\nCV_LeafKind_STRUCTURE_ST = 0x1005,\r\nCV_LeafKind_UNION_ST = 0x1006,\r\nCV_LeafKind_ENUM_ST = 0x1007,\r\nCV_LeafKind_PROCEDURE = 0x1008,\r\nCV_LeafKind_MFUNCTION = 0x1009,\r\nCV_LeafKind_COBOL0 = 0x100a,\r\nCV_LeafKind_BARRAY = 0x100b,\r\nCV_LeafKind_DIMARRAY_ST = 0x100c,\r\nCV_LeafKind_VFTPATH = 0x100d,\r\nCV_LeafKind_PRECOMP_ST = 0x100e,\r\nCV_LeafKind_OEM = 0x100f,\r\nCV_LeafKind_ALIAS_ST = 0x1010,\r\nCV_LeafKind_OEM2 = 0x1011,\r\nCV_LeafKind_SKIP = 0x1200,\r\nCV_LeafKind_ARGLIST = 0x1201,\r\nCV_LeafKind_DEFARG_ST = 0x1202,\r\nCV_LeafKind_FIELDLIST = 0x1203,\r\nCV_LeafKind_DERIVED = 0x1204,\r\nCV_LeafKind_BITFIELD = 0x1205,\r\nCV_LeafKind_METHODLIST = 0x1206,\r\nCV_LeafKind_DIMCONU = 0x1207,\r\nCV_LeafKind_DIMCONLU = 0x1208,\r\nCV_LeafKind_DIMVARU = 0x1209,\r\nCV_LeafKind_DIMVARLU = 0x120a,\r\nCV_LeafKind_BCLASS = 0x1400,\r\nCV_LeafKind_VBCLASS = 0x1401,\r\nCV_LeafKind_IVBCLASS = 0x1402,\r\nCV_LeafKind_FRIENDFCN_ST = 0x1403,\r\nCV_LeafKind_INDEX = 0x1404,\r\nCV_LeafKind_MEMBER_ST = 0x1405,\r\nCV_LeafKind_STMEMBER_ST = 0x1406,\r\nCV_LeafKind_METHOD_ST = 0x1407,\r\nCV_LeafKind_NESTTYPE_ST = 0x1408,\r\nCV_LeafKind_VFUNCTAB = 0x1409,\r\nCV_LeafKind_FRIENDCLS = 0x140a,\r\nCV_LeafKind_ONEMETHOD_ST = 0x140b,\r\nCV_LeafKind_VFUNCOFF = 0x140c,\r\nCV_LeafKind_NESTTYPEEX_ST = 0x140d,\r\nCV_LeafKind_MEMBERMODIFY_ST = 0x140e,\r\nCV_LeafKind_MANAGED_ST = 0x140f,\r\nCV_LeafKind_ST_MAX = 0x1500,\r\nCV_LeafKind_TYPESERVER = 0x1501,\r\nCV_LeafKind_ENUMERATE = 0x1502,\r\nCV_LeafKind_ARRAY = 0x1503,\r\nCV_LeafKind_CLASS = 0x1504,\r\nCV_LeafKind_STRUCTURE = 0x1505,\r\nCV_LeafKind_UNION = 0x1506,\r\nCV_LeafKind_ENUM = 0x1507,\r\nCV_LeafKind_DIMARRAY = 0x1508,\r\nCV_LeafKind_PRECOMP = 0x1509,\r\nCV_LeafKind_ALIAS = 0x150a,\r\nCV_LeafKind_DEFARG = 0x150b,\r\nCV_LeafKind_FRIENDFCN = 0x150c,\r\nCV_LeafKind_MEMBER = 0x150d,\r\nCV_LeafKind_STMEMBER = 0x150e,\r\nCV_LeafKind_METHOD = 0x150f,\r\nCV_LeafKind_NESTTYPE = 0x1510,\r\nCV_LeafKind_ONEMETHOD = 0x1511,\r\nCV_LeafKind_NESTTYPEEX = 0x1512,\r\nCV_LeafKind_MEMBERMODIFY = 0x1513,\r\nCV_LeafKind_MANAGED = 0x1514,\r\nCV_LeafKind_TYPESERVER2 = 0x1515,\r\nCV_LeafKind_STRIDED_ARRAY = 0x1516,\r\nCV_LeafKind_HLSL = 0x1517,\r\nCV_LeafKind_MODIFIER_EX = 0x1518,\r\nCV_LeafKind_INTERFACE = 0x1519,\r\nCV_LeafKind_BINTERFACE = 0x151a,\r\nCV_LeafKind_VECTOR = 0x151b,\r\nCV_LeafKind_MATRIX = 0x151c,\r\nCV_LeafKind_VFTABLE = 0x151d,\r\nCV_LeafKind_FUNC_ID = 0x1601,\r\nCV_LeafKind_MFUNC_ID = 0x1602,\r\nCV_LeafKind_BUILDINFO = 0x1603,\r\nCV_LeafKind_SUBSTR_LIST = 0x1604,\r\nCV_LeafKind_STRING_ID = 0x1605,\r\nCV_LeafKind_UDT_SRC_LINE = 0x1606,\r\nCV_LeafKind_UDT_MOD_SRC_LINE = 0x1607,\r\nCV_LeafKind_CLASS2 = 0x1608,\r\nCV_LeafKind_STRUCT2 = 0x1609,\r\n} CV_LeafKindEnum;\r\n\r\ninternal String8 cv_string_from_numeric_kind(CV_NumericKind v);\r\ninternal String8 cv_string_from_arch(CV_Arch v);\r\ninternal String8 cv_string_from_sym_kind(CV_SymKind v);\r\ninternal String8 cv_string_from_basic_type(CV_BasicType v);\r\ninternal String8 cv_type_name_from_basic_type(CV_BasicType v);\r\ninternal String8 cv_string_from_leaf_kind(CV_LeafKind v);\r\ninternal U64 cv_header_struct_size_from_sym_kind(CV_SymKind v);\r\ninternal U64 cv_header_struct_size_from_leaf_kind(CV_LeafKind v);\r\n#endif // CODEVIEW_META_H\r\n"
  },
  {
    "path": "src/coff/coff.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal U64\r\ncoff_align_size_from_section_flags(COFF_SectionFlags flags)\r\n{\r\n  U32 align = 0;\r\n  U32 align_index = COFF_SectionFlags_ExtractAlign(flags);\r\n  switch (align_index) {\r\n    default: break;\r\n    case COFF_SectionAlign_1Bytes:    align = 1;    break;\r\n    case COFF_SectionAlign_2Bytes:    align = 2;    break;\r\n    case COFF_SectionAlign_4Bytes:    align = 4;    break;\r\n    case COFF_SectionAlign_8Bytes:    align = 8;    break;\r\n    case COFF_SectionAlign_16Bytes:   align = 16;   break;\r\n    case COFF_SectionAlign_32Bytes:   align = 32;   break;\r\n    case COFF_SectionAlign_64Bytes:   align = 64;   break;\r\n    case COFF_SectionAlign_128Bytes:  align = 128;  break;\r\n    case COFF_SectionAlign_256Bytes:  align = 256;  break;\r\n    case COFF_SectionAlign_512Bytes:  align = 512;  break;\r\n    case COFF_SectionAlign_1024Bytes: align = 1024; break;\r\n    case COFF_SectionAlign_2048Bytes: align = 2048; break;\r\n    case COFF_SectionAlign_4096Bytes: align = 4096; break;\r\n    case COFF_SectionAlign_8192Bytes: align = 8192; break;\r\n  }\r\n  return align;\r\n}\r\n\r\ninternal COFF_SectionFlags\r\ncoff_section_flag_from_align_size(U64 align)\r\n{\r\n  COFF_SectionFlags flags = 0;\r\n  switch (align) {\r\n    case 0:    flags = COFF_SectionAlign_None;      break;\r\n    case 1:    flags = COFF_SectionAlign_1Bytes;    break;\r\n    case 2:    flags = COFF_SectionAlign_2Bytes;    break;\r\n    case 4:    flags = COFF_SectionAlign_4Bytes;    break;\r\n    case 8:    flags = COFF_SectionAlign_8Bytes;    break;\r\n    case 16:   flags = COFF_SectionAlign_16Bytes;   break;\r\n    case 32:   flags = COFF_SectionAlign_32Bytes;   break;\r\n    case 64:   flags = COFF_SectionAlign_64Bytes;   break;\r\n    case 128:  flags = COFF_SectionAlign_128Bytes;  break;\r\n    case 256:  flags = COFF_SectionAlign_256Bytes;  break;\r\n    case 512:  flags = COFF_SectionAlign_512Bytes;  break;\r\n    case 1024: flags = COFF_SectionAlign_1024Bytes; break;\r\n    case 2048: flags = COFF_SectionAlign_2048Bytes; break;\r\n    case 4096: flags = COFF_SectionAlign_4096Bytes; break;\r\n    case 8192: flags = COFF_SectionAlign_8192Bytes; break;\r\n  }\r\n  flags <<= COFF_SectionFlag_AlignShift;\r\n  return flags;\r\n}\r\n\r\ninternal String8\r\ncoff_name_from_section_header(String8 string_table, COFF_SectionHeader *header)\r\n{\r\n  String8 name = str8_cstring_capped(header->name, header->name + sizeof(header->name));\r\n  if (name.str[0] == '/') {\r\n    String8 name_off_str = str8_skip(name, 1);\r\n    U64     name_off     = u64_from_str8(name_off_str, 10);\r\n    name = str8_cstring_capped(string_table.str + name_off, string_table.str+string_table.size);\r\n  }\r\n  return name;\r\n}\r\n\r\ninternal void\r\ncoff_parse_section_name(String8 full_name, String8 *name_out, String8 *postfix_out)\r\n{\r\n  // dollar sign has multiple interpretations that depend on the type of the section.\r\n  // 1. when section contains code/data it indicates section precedence\r\n  // 2. when section starts with .debug it indicates type of data inside the section\r\n  //    T: Types\r\n  //    S: Symbols\r\n  //    P: Precompiled types\r\n  //    F: FPO data\r\n  //    H: Clang extension produced with /debug:ghash, array of type hashes\r\n  *name_out    = full_name;\r\n  *postfix_out = str8_lit(\"\");\r\n  for (U64 i = 0; i < full_name.size; ++i) {\r\n    if (full_name.str[i] == '$') {\r\n      *name_out    = str8(full_name.str, i);\r\n      *postfix_out = str8(full_name.str + i, full_name.size - i);\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\ninternal String8\r\ncoff_read_symbol_name(String8 string_table, COFF_SymbolName *name)\r\n{\r\n  String8 name_str = str8_lit(\"\");\r\n  if (name->long_name.zeroes == 0) {\r\n    str8_deserial_read_cstr(string_table, name->long_name.string_table_offset, &name_str);\r\n  } else {\r\n    U32 i;\r\n    for (i = 0; i < sizeof(name->short_name); ++i) {\r\n      if (name->short_name[i] == '\\0') {\r\n        break;\r\n      }\r\n    }\r\n    name_str = str8(name->short_name, i);\r\n  }\r\n  return name_str;\r\n}\r\n\r\ninternal U64\r\ncoff_is_addr_reloc(COFF_MachineType machine, U32 type)\r\n{\r\n  U64 is_addr = 0;\r\n  switch (machine) {\r\n  case COFF_MachineType_Unknown: is_addr = 0; break;\r\n  case COFF_MachineType_X64: {\r\n    if (type == COFF_Reloc_X64_Addr32)      is_addr = 4;\r\n    else if (type == COFF_Reloc_X64_Addr64) is_addr = 8;\r\n  } break;\r\n  default: NotImplemented; break;\r\n  }\r\n  return is_addr;\r\n}\r\n\r\ninternal U64\r\ncoff_apply_size_from_reloc_x64(COFF_Reloc_X64 x)\r\n{\r\n  switch (x) {\r\n    case COFF_Reloc_X64_Abs:      return 4;\r\n    case COFF_Reloc_X64_Addr64:   return 8;\r\n    case COFF_Reloc_X64_Addr32:   return 4;\r\n    case COFF_Reloc_X64_Addr32Nb: return 4;\r\n    case COFF_Reloc_X64_Rel32:    return 4;\r\n    case COFF_Reloc_X64_Rel32_1:  return 4;\r\n    case COFF_Reloc_X64_Rel32_2:  return 4;\r\n    case COFF_Reloc_X64_Rel32_3:  return 4;\r\n    case COFF_Reloc_X64_Rel32_4:  return 4;\r\n    case COFF_Reloc_X64_Rel32_5:  return 4;\r\n    case COFF_Reloc_X64_Section:  return 2;\r\n    case COFF_Reloc_X64_SecRel:   return 4;\r\n    case COFF_Reloc_X64_SRel32:   return 4;\r\n    \r\n    case COFF_Reloc_X64_SecRel7:\r\n    case COFF_Reloc_X64_Token:\r\n    case COFF_Reloc_X64_Pair:\r\n    case COFF_Reloc_X64_SSpan32:\r\n    NotImplemented;\r\n    break;\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\ncoff_apply_size_from_reloc_x86(COFF_Reloc_X86 x)\r\n{\r\n  switch (x) {\r\n    case COFF_Reloc_X86_Abs:      return 4;\r\n    case COFF_Reloc_X86_Dir16:    return 2;\r\n    case COFF_Reloc_X86_Rel16:    return 2;\r\n    case COFF_Reloc_X86_Dir32:    return 4;\r\n    case COFF_Reloc_X86_Dir32Nb:  return 4;\r\n    case COFF_Reloc_X86_Seg12:    return 0;\r\n    case COFF_Reloc_X86_Section:  return 2;\r\n    case COFF_Reloc_X86_SecRel:   return 4;\r\n    case COFF_Reloc_X86_Token:    return 4;\r\n    case COFF_Reloc_X86_SecRel7:  return 1;\r\n    case COFF_Reloc_X86_Rel32:    return 4;\r\n    \r\n    case COFF_Reloc_X86_Unknown0:\r\n    case COFF_Reloc_X86_Unknown2:\r\n    case COFF_Reloc_X86_Unknown3:\r\n    case COFF_Reloc_X86_Unknown4:\r\n    case COFF_Reloc_X86_Unknown6:\r\n    case COFF_Reloc_X86_Unknown7:\r\n    case COFF_Reloc_X86_Unknown8:\r\n    case COFF_Reloc_X86_Unknown9:\r\n    NotImplemented;\r\n    break;\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\ncoff_apply_size_from_reloc(COFF_MachineType machine, COFF_RelocType x)\r\n{\r\n  switch (machine) {\r\n    case COFF_MachineType_X64: return coff_apply_size_from_reloc_x64(x);\r\n    case COFF_MachineType_X86: return coff_apply_size_from_reloc_x86(x);\r\n    default: NotImplemented;\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal COFF_RelocValue\r\ncoff_pick_reloc_value_x64(COFF_Reloc_X64 type,\r\n                          U64            image_base,\r\n                          U64            reloc_virtual_offset,\r\n                          U32            symbol_section_number,\r\n                          U32            symbol_section_offset,\r\n                          S64            symbol_virtual_offset)\r\n{\r\n  U64 reloc_value_size = 0;\r\n  S64 reloc_value      = 0;\r\n  \r\n  switch (type) {\r\n    case COFF_Reloc_X64_Abs: {} break;\r\n    case COFF_Reloc_X64_Addr64: {\r\n      reloc_value_size = 8;\r\n      reloc_value      = symbol_virtual_offset + (S64)image_base;\r\n    } break;\r\n    case COFF_Reloc_X64_Addr32: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = safe_cast_s32(symbol_virtual_offset + (S64)image_base);\r\n    } break;\r\n    case COFF_Reloc_X64_Addr32Nb: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = symbol_virtual_offset;\r\n    } break;\r\n    case COFF_Reloc_X64_Rel32: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = safe_cast_s32(symbol_virtual_offset - reloc_virtual_offset - (4 + 0));\r\n    } break;\r\n    case COFF_Reloc_X64_Rel32_1: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = safe_cast_s32(symbol_virtual_offset - reloc_virtual_offset - (4 + 1));\r\n    } break;\r\n    case COFF_Reloc_X64_Rel32_2: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = safe_cast_s32(symbol_virtual_offset - reloc_virtual_offset - (4 + 2));\r\n    } break;\r\n    case COFF_Reloc_X64_Rel32_3: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = safe_cast_s32(symbol_virtual_offset - reloc_virtual_offset - (4 + 3));\r\n    } break;\r\n    case COFF_Reloc_X64_Rel32_4: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = safe_cast_s32(symbol_virtual_offset - reloc_virtual_offset - (4 + 4));\r\n    } break;\r\n    case COFF_Reloc_X64_Rel32_5: {\r\n      reloc_value_size = 4;\r\n      reloc_value = safe_cast_s32(symbol_virtual_offset - reloc_virtual_offset - (4 + 5));\r\n    } break;\r\n    case COFF_Reloc_X64_Section: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = symbol_section_number;\r\n    } break;\r\n    case COFF_Reloc_X64_SecRel: {\r\n      reloc_value_size = 4;\r\n      reloc_value      = symbol_section_offset;\r\n    } break;\r\n    case COFF_Reloc_X64_SecRel7:\r\n    case COFF_Reloc_X64_Token:\r\n    case COFF_Reloc_X64_SRel32:\r\n    case COFF_Reloc_X64_Pair:\r\n    case COFF_Reloc_X64_SSpan32:\r\n    case COFF_Reloc_X64_Unknown_11: {\r\n      NotImplemented;\r\n    } break;\r\n  }\r\n  \r\n  COFF_RelocValue result = {0};\r\n  result.size            = reloc_value_size;\r\n  result.value           = reloc_value;\r\n  \r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_make_lib_member_header(Arena *arena, String8 name, COFF_TimeStamp time_stamp, U16 user_id, U16 group_id, U16 mode, U32 size)\r\n{\r\n  Assert(name.size < 16);\r\n  Assert(user_id < 10000);\r\n  Assert(group_id < 10000);\r\n  Assert(mode < 10000);\r\n  Assert(size < 1000000000);\r\n  \r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  str8_list_pushf(scratch.arena, &list, \"%-16.*s\", str8_varg(name));\r\n  str8_list_pushf(scratch.arena, &list, \"%-12u\", time_stamp);\r\n  str8_list_pushf(scratch.arena, &list, \"%-6u\", user_id);\r\n  str8_list_pushf(scratch.arena, &list, \"%-6u\", group_id);\r\n  str8_list_pushf(scratch.arena, &list, \"%-8u\", mode);\r\n  str8_list_pushf(scratch.arena, &list, \"%-10u\", size);\r\n  str8_list_pushf(scratch.arena, &list, \"`\\n\");\r\n  String8 result = str8_list_join(arena, &list, 0);\r\n  \r\n  Assert(result.size == sizeof(COFF_ArchiveMemberHeader));\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_make_import_lookup(Arena *arena, U16 hint, String8 name)\r\n{\r\n  U64 buffer_size = sizeof(hint) + (name.size + 1);\r\n  U8 *buffer = push_array(arena, U8, buffer_size);\r\n  *(U16*)buffer = hint;\r\n  MemoryCopy(buffer + sizeof(hint), name.str, name.size);\r\n  buffer[buffer_size - 1] = 0;\r\n  String8 result = str8(buffer, buffer_size);\r\n  return result;\r\n}\r\n\r\ninternal U32\r\ncoff_make_ordinal32(U16 hint)\r\n{\r\n  U32 ordinal = (1 << 31) | hint;\r\n  return ordinal;\r\n}\r\n\r\ninternal U64\r\ncoff_make_ordinal64(U16 hint)\r\n{\r\n  U64 ordinal = (1ULL << 63) | hint;\r\n  return ordinal;\r\n}\r\n\r\ninternal String8\r\ncoff_ordinal_data_from_hint(Arena *arena, COFF_MachineType machine, U16 hint)\r\n{\r\n  String8 ordinal_data = {0}; \r\n  switch (machine) {\r\n    case COFF_MachineType_Unknown: break;\r\n    case COFF_MachineType_X64: {\r\n      U64 *ordinal = push_array(arena, U64, 1);\r\n      *ordinal     = coff_make_ordinal64(hint);\r\n      ordinal_data = str8_struct(ordinal);\r\n    } break;\r\n    case COFF_MachineType_X86: {\r\n      U32 *ordinal = push_array(arena, U32, 1);\r\n      *ordinal     = coff_make_ordinal32(hint);\r\n      ordinal_data = str8_struct(ordinal);\r\n    } break;\r\n    default: { NotImplemented; } break;\r\n  }\r\n  return ordinal_data;\r\n}\r\n\r\ninternal String8\r\ncoff_make_import_header(Arena            *arena,\r\n                        COFF_MachineType  machine,\r\n                        COFF_TimeStamp    time_stamp,\r\n                        String8           dll_name,\r\n                        COFF_ImportByType import_by,\r\n                        String8           name,\r\n                        U16               hint_or_ordinal,\r\n                        COFF_ImportType   type)\r\n{\r\n  COFF_ImportHeaderFlags flags = 0;\r\n  flags |= (type & COFF_ImportHeader_TypeMask) << COFF_ImportHeader_TypeShift;\r\n  flags |= import_by << COFF_ImportHeader_ImportByShift;\r\n  \r\n  COFF_ImportHeader header = {0};\r\n  header.sig1              = COFF_MachineType_Unknown;\r\n  header.sig2              = max_U16;\r\n  header.version           = 0;\r\n  header.machine           = machine;\r\n  header.time_stamp        = time_stamp;\r\n  header.data_size         = safe_cast_u32(name.size + dll_name.size + 2);\r\n  header.hint_or_ordinal   = hint_or_ordinal;\r\n  header.flags             = flags;\r\n  \r\n  // alloc memory\r\n  U64  buffer_size = sizeof(header) + header.data_size;\r\n  U8  *buffer      = push_array_no_zero(arena, U8, buffer_size);\r\n  \r\n  // copy header\r\n  MemoryCopy(buffer, &header, sizeof(header));\r\n  \r\n  // copy function name\r\n  U8 *func_name = buffer + sizeof(header);\r\n  MemoryCopy(func_name, name.str, name.size);\r\n  func_name[name.size] = 0;\r\n  \r\n  // copy dll name\r\n  U8 *dll_name_buffer = buffer + sizeof(header) + name.size + 1;\r\n  MemoryCopy(dll_name_buffer, dll_name.str, dll_name.size);\r\n  dll_name_buffer[dll_name.size] = 0;\r\n  \r\n  String8 import_data = str8(buffer, buffer_size);\r\n  return import_data;\r\n}\r\n\r\ninternal U8\r\ncoff_code_align_byte_from_machine(COFF_MachineType machine)\r\n{\r\n  U8 align_byte = 0;\r\n  switch (machine) {\r\n    case COFF_MachineType_Unknown: break;\r\n    case COFF_MachineType_X64:\r\n    case COFF_MachineType_X86: {\r\n      align_byte = 0xCC;\r\n    } break;\r\n    default: { NotImplemented; } break;\r\n  }\r\n  return align_byte;\r\n}\r\n\r\ninternal U16\r\ncoff_default_align_from_machine(COFF_MachineType machine)\r\n{\r\n  U16 align = 0;\r\n  switch (machine) {\r\n    case COFF_MachineType_Unknown: break;\r\n    case COFF_MachineType_X64: {\r\n      align = 16;\r\n    } break;\r\n    default: { NotImplemented; } break;\r\n  }\r\n  return align;\r\n}\r\n\r\ninternal U64\r\ncoff_word_size_from_machine(COFF_MachineType machine)\r\n{\r\n  U64 result = 0;\r\n  switch (machine) {\r\n    case COFF_MachineType_X64: result = 8; break;\r\n    case COFF_MachineType_X86: result = 4; break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ncoff_default_exe_base_from_machine(COFF_MachineType machine)\r\n{\r\n  U64 exe_base = 0;\r\n  switch (coff_word_size_from_machine(machine)) {\r\n    case 4: exe_base = 0x400000;    break;\r\n    case 8: exe_base = 0x140000000; break;\r\n  }\r\n  return exe_base;\r\n}\r\n\r\ninternal U64\r\ncoff_default_dll_base_from_machine(COFF_MachineType machine)\r\n{\r\n  U64 dll_base = 0;\r\n  switch (coff_word_size_from_machine(machine)) {\r\n    case 4: dll_base = 0x10000000;  break;\r\n    case 8: dll_base = 0x180000000; break;\r\n  }\r\n  return dll_base;\r\n}\r\n\r\n\r\ninternal Arch\r\narch_from_coff_machine(COFF_MachineType machine)\r\n{\r\n  Arch result = Arch_Null;\r\n  switch (machine) {\r\n    case COFF_MachineType_Unknown: break;\r\n    case COFF_MachineType_X86:   result = Arch_x86;   break;\r\n    case COFF_MachineType_X64:   result = Arch_x64;   break;\r\n    case COFF_MachineType_Arm:   result = Arch_arm32; break;\r\n    case COFF_MachineType_Arm64: result = Arch_arm64; break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ncoff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff)\r\n{\r\n  U64 foff = 0;\r\n  for(U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1)\r\n  {\r\n    COFF_SectionHeader *sect = &sections[sect_idx];\r\n    if(sect->voff <= voff && voff < sect->voff+sect->vsize)\r\n    {\r\n      if(!(sect->flags & COFF_SectionFlag_CntUninitializedData))\r\n      {\r\n        foff = sect->foff + (voff - sect->voff);\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return foff;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> String\r\n\r\ninternal String8\r\ncoff_string_from_time_stamp(Arena *arena, COFF_TimeStamp time_stamp)\r\n{\r\n  String8 result;\r\n  if (time_stamp == 0) {\r\n    result = str8_lit(\"0\");\r\n  } else if (time_stamp >= max_U32) {\r\n    result = str8_lit(\"-1\");\r\n  } else {\r\n    DateTime dt = date_time_from_unix_time(time_stamp);\r\n    result = string_from_date_time(arena, &dt);\r\n  }\r\n  return result;\r\n}\r\n\r\nglobal read_only struct\r\n{\r\n  String8          string;\r\n  COFF_MachineType machine;\r\n} g_coff_machine_map[] = {\r\n  { str8_lit_comp(\"\"),          COFF_MachineType_Unknown   },\r\n  { str8_lit_comp(\"X86\"),       COFF_MachineType_X86       },\r\n  { str8_lit_comp(\"Amd64\"),     COFF_MachineType_X64       },\r\n  { str8_lit_comp(\"X64\"),       COFF_MachineType_X64       },\r\n  { str8_lit_comp(\"Am33\"),      COFF_MachineType_Am33      },\r\n  { str8_lit_comp(\"Arm\"),       COFF_MachineType_Arm       },\r\n  { str8_lit_comp(\"Arm64\"),     COFF_MachineType_Arm64     },\r\n  { str8_lit_comp(\"ArmNt\"),     COFF_MachineType_ArmNt     },\r\n  { str8_lit_comp(\"Ebc\"),       COFF_MachineType_Ebc       },\r\n  { str8_lit_comp(\"Ia64\"),      COFF_MachineType_Ia64      },\r\n  { str8_lit_comp(\"M32r\"),      COFF_MachineType_M32R      },\r\n  { str8_lit_comp(\"Mips16\"),    COFF_MachineType_Mips16    },\r\n  { str8_lit_comp(\"MipsFpu\"),   COFF_MachineType_MipsFpu   },\r\n  { str8_lit_comp(\"MipsFpu16\"), COFF_MachineType_MipsFpu16 },\r\n  { str8_lit_comp(\"PowerPc\"),   COFF_MachineType_PowerPc   },\r\n  { str8_lit_comp(\"PowerPcFp\"), COFF_MachineType_PowerPcFp },\r\n  { str8_lit_comp(\"R4000\"),     COFF_MachineType_R4000     },\r\n  { str8_lit_comp(\"RiscV32\"),   COFF_MachineType_RiscV32   },\r\n  { str8_lit_comp(\"RiscV64\"),   COFF_MachineType_RiscV64   },\r\n  { str8_lit_comp(\"Sh3\"),       COFF_MachineType_Sh3       },\r\n  { str8_lit_comp(\"Sh3Dsp\"),    COFF_MachineType_Sh3Dsp    },\r\n  { str8_lit_comp(\"Sh4\"),       COFF_MachineType_Sh4       },\r\n  { str8_lit_comp(\"Sh5\"),       COFF_MachineType_Sh5       },\r\n  { str8_lit_comp(\"Thumb\"),     COFF_MachineType_Thumb     },\r\n  { str8_lit_comp(\"WceMipsV2\"), COFF_MachineType_WceMipsV2 },\r\n};\r\n\r\nglobal read_only struct {\r\n  char *                name;\r\n  COFF_ImportType type;\r\n} g_coff_import_header_type_map[] = {\r\n  { \"Code\",  COFF_ImportHeader_Code  },\r\n  { \"Data\",  COFF_ImportHeader_Data  },\r\n  { \"Const\", COFF_ImportHeader_Const },\r\n};\r\n\r\ninternal String8\r\ncoff_string_from_comdat_select_type(COFF_ComdatSelectType type)\r\n{\r\n  String8 result = str8_zero();\r\n  switch (type) {\r\n    case COFF_ComdatSelect_Null:         result = str8_lit(\"Null\");         break;\r\n    case COFF_ComdatSelect_NoDuplicates: result = str8_lit(\"NoDuplicates\"); break;\r\n    case COFF_ComdatSelect_Any:          result = str8_lit(\"Any\");          break;\r\n    case COFF_ComdatSelect_SameSize:     result = str8_lit(\"SameSize\");     break;\r\n    case COFF_ComdatSelect_ExactMatch:   result = str8_lit(\"ExactMatch\");   break;\r\n    case COFF_ComdatSelect_Associative:  result = str8_lit(\"Associative\");  break;\r\n    case COFF_ComdatSelect_Largest:      result = str8_lit(\"Largest\");      break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_machine_type(COFF_MachineType machine)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) {\r\n    if (g_coff_machine_map[i].machine == machine) {\r\n      return g_coff_machine_map[i].string;\r\n    }\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_flags(Arena *arena, COFF_FileHeaderFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  \r\n  if (flags & COFF_FileHeaderFlag_RelocStripped) {\r\n    str8_list_pushf(scratch.arena, &list, \"Relocs Stripped\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_ExecutableImage) {\r\n    str8_list_pushf(scratch.arena, &list, \"Executable\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_LineNumbersStripped) {\r\n    str8_list_pushf(scratch.arena, &list, \"Line Numbers Stripped\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_SymbolsStripped) {\r\n    str8_list_pushf(scratch.arena, &list, \"Symbols Stripped\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_LargeAddressAware) {\r\n    str8_list_pushf(scratch.arena, &list, \"Large Address Aware\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_32BitMachine) {\r\n    str8_list_pushf(scratch.arena, &list, \"32-Bit Machine\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_DebugStripped) {\r\n    str8_list_pushf(scratch.arena, &list, \"Debug Stripped\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_RemovableRunFromSwap) {\r\n    str8_list_pushf(scratch.arena, &list, \"Removeable Run From Swap\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_NetRunFromSwap) {\r\n    str8_list_pushf(scratch.arena, &list, \"Net Run From Swap\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_System) {\r\n    str8_list_pushf(scratch.arena, &list, \"System\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_Dll) {\r\n    str8_list_pushf(scratch.arena, &list, \"DLL\");\r\n  }\r\n  if (flags & COFF_FileHeaderFlag_UpSystemOnly) {\r\n    str8_list_pushf(scratch.arena, &list, \"Up System Only\");\r\n  }\r\n  \r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  \r\n  if (flags & COFF_SectionFlag_TypeNoPad) {\r\n    str8_list_pushf(scratch.arena, &list, \"TypeNoPad\");\r\n  }\r\n  if (flags & COFF_SectionFlag_CntCode) {\r\n    str8_list_pushf(scratch.arena, &list, \"CntCode\");\r\n  }\r\n  if (flags & COFF_SectionFlag_CntInitializedData) {\r\n    str8_list_pushf(scratch.arena, &list, \"CntInitializedData\");\r\n  }\r\n  if (flags & COFF_SectionFlag_CntUninitializedData) {\r\n    str8_list_pushf(scratch.arena, &list, \"CntUninitializedData\");\r\n  }\r\n  if (flags & COFF_SectionFlag_LnkOther) {\r\n    str8_list_pushf(scratch.arena, &list, \"LnkOther\");\r\n  }\r\n  if (flags & COFF_SectionFlag_LnkInfo) {\r\n    str8_list_pushf(scratch.arena, &list, \"LnkInfo\");\r\n  }\r\n  if (flags & COFF_SectionFlag_LnkCOMDAT) {\r\n    str8_list_pushf(scratch.arena, &list, \"LnkCOMDAT\");\r\n  }\r\n  if (flags & COFF_SectionFlag_GpRel) {\r\n    str8_list_pushf(scratch.arena, &list, \"GpRel\");\r\n  }\r\n  if (flags & COFF_SectionFlag_Mem16Bit) {\r\n    str8_list_pushf(scratch.arena, &list, \"Mem16Bit\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemLocked) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemLocked\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemPreload) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemPreload\");\r\n  }\r\n  if (flags & COFF_SectionFlag_LnkNRelocOvfl) {\r\n    str8_list_pushf(scratch.arena, &list, \"LnkNRelocOvfl\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemDiscardable) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemDiscardable\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemNotCached) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemNotCached\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemNotPaged) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemNotPaged\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemShared) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemShared\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemExecute) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemExecute\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemRead) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemRead\");\r\n  }\r\n  if (flags & COFF_SectionFlag_MemWrite) {\r\n    str8_list_pushf(scratch.arena, &list, \"MemWrite\");\r\n  }\r\n  \r\n  U64 align = coff_align_size_from_section_flags(flags);\r\n  if (align) {\r\n    str8_list_pushf(scratch.arena, &list, \"Align=%u\", align);\r\n  }\r\n  \r\n  if (!list.node_count) {\r\n    str8_list_pushf(scratch.arena, &list, \"None\");\r\n  }\r\n  \r\n  StringJoin join = {0};\r\n  join.sep = str8_lit(\", \");\r\n  String8 result = str8_list_join(arena, &list, &join);\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_resource_memory_flags(Arena *arena, COFF_ResourceMemoryFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  String8List list = {0};\r\n  \r\n  if (flags & COFF_ResourceMemoryFlag_Moveable) {\r\n    flags &= COFF_ResourceMemoryFlag_Moveable;\r\n    str8_list_pushf(scratch.arena, &list, \"Moveable\");\r\n  }\r\n  if (flags & COFF_ResourceMemoryFlag_Pure) {\r\n    flags &= COFF_ResourceMemoryFlag_Pure;\r\n    str8_list_pushf(scratch.arena, &list, \"Pure\");\r\n  }\r\n  if (flags & COFF_ResourceMemoryFlag_Discardable) {\r\n    flags &= COFF_ResourceMemoryFlag_Discardable;\r\n    str8_list_pushf(scratch.arena, &list, \"Discardable\");\r\n  }\r\n  if (flags != 0) {\r\n    str8_list_pushf(scratch.arena, &list, \"%#x\", flags);\r\n  }\r\n  \r\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_import_header_type(COFF_ImportType type)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) {\r\n    if (g_coff_import_header_type_map[i].type == type) {\r\n      return str8_cstring(g_coff_import_header_type_map[i].name);\r\n    }\r\n  }\r\n  return str8(0,0);\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_sym_dtype(COFF_SymDType x)\r\n{\r\n  switch (x) {\r\n    case COFF_SymDType_Null:  return str8_lit(\"Null\");\r\n    case COFF_SymDType_Ptr :  return str8_lit(\"Ptr\");\r\n    case COFF_SymDType_Func:  return str8_lit(\"Func\");\r\n    case COFF_SymDType_Array: return str8_lit(\"Array\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_sym_type(COFF_SymType x)\r\n{\r\n  switch (x) {\r\n    case COFF_SymType_Null:   return str8_lit(\"Null\");\r\n    case COFF_SymType_Void:   return str8_lit(\"Void\");\r\n    case COFF_SymType_Char:   return str8_lit(\"Char\");\r\n    case COFF_SymType_Short:  return str8_lit(\"Short\");\r\n    case COFF_SymType_Int:    return str8_lit(\"Int\");\r\n    case COFF_SymType_Long:   return str8_lit(\"Long\");\r\n    case COFF_SymType_Float:  return str8_lit(\"Float\");\r\n    case COFF_SymType_Double: return str8_lit(\"Double\");\r\n    case COFF_SymType_Struct: return str8_lit(\"Struct\");\r\n    case COFF_SymType_Union:  return str8_lit(\"Union\");\r\n    case COFF_SymType_Enum:   return str8_lit(\"Enum\");\r\n    case COFF_SymType_MemberOfEnumeration: return str8_lit(\"MOE\");\r\n    case COFF_SymType_Byte:   return str8_lit(\"Byte\");\r\n    case COFF_SymType_Word:   return str8_lit(\"Word\");\r\n    case COFF_SymType_UInt:   return str8_lit(\"UInt\");\r\n    case COFF_SymType_DWord:  return str8_lit(\"DWord\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_sym_storage_class(COFF_SymStorageClass x)\r\n{\r\n  switch (x) {\r\n    case COFF_SymStorageClass_Null:            break;\r\n    case COFF_SymStorageClass_EndOfFunction:   return str8_lit(\"EndOfFunction\");\r\n    case COFF_SymStorageClass_Automatic:       return str8_lit(\"Automatic\");\r\n    case COFF_SymStorageClass_External:        return str8_lit(\"External\");\r\n    case COFF_SymStorageClass_Static:          return str8_lit(\"Static\");\r\n    case COFF_SymStorageClass_Register:        return str8_lit(\"Register\");\r\n    case COFF_SymStorageClass_ExternalDef:     return str8_lit(\"Def\");\r\n    case COFF_SymStorageClass_Label:           return str8_lit(\"Label\");\r\n    case COFF_SymStorageClass_UndefinedLabel:  return str8_lit(\"UndefinedLabel\");\r\n    case COFF_SymStorageClass_MemberOfStruct:  return str8_lit(\"Struct\");\r\n    case COFF_SymStorageClass_Argument:        return str8_lit(\"Argument\");\r\n    case COFF_SymStorageClass_StructTag:       return str8_lit(\"Tag\");\r\n    case COFF_SymStorageClass_MemberOfUnion:   return str8_lit(\"Union\");\r\n    case COFF_SymStorageClass_UnionTag:        return str8_lit(\"Tag\");\r\n    case COFF_SymStorageClass_TypeDefinition:  return str8_lit(\"Definition\");\r\n    case COFF_SymStorageClass_UndefinedStatic: return str8_lit(\"Static\");\r\n    case COFF_SymStorageClass_EnumTag:         return str8_lit(\"Tag\");\r\n    case COFF_SymStorageClass_MemberOfEnum:    return str8_lit(\"Enum\");\r\n    case COFF_SymStorageClass_RegisterParam:   return str8_lit(\"Param\");\r\n    case COFF_SymStorageClass_BitField:        return str8_lit(\"Field\");\r\n    case COFF_SymStorageClass_Block:           return str8_lit(\"Block\");\r\n    case COFF_SymStorageClass_Function:        return str8_lit(\"Function\");\r\n    case COFF_SymStorageClass_EndOfStruct:     return str8_lit(\"Struct\");\r\n    case COFF_SymStorageClass_File:            return str8_lit(\"File\");\r\n    case COFF_SymStorageClass_Section:         return str8_lit(\"Section\");\r\n    case COFF_SymStorageClass_WeakExternal:    return str8_lit(\"External\");\r\n    case COFF_SymStorageClass_CLRToken:        return str8_lit(\"Token\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_weak_ext_type(COFF_WeakExtType x)\r\n{\r\n  switch (x) {\r\n    case COFF_WeakExt_NoLibrary:     return str8_lit(\"NoLibrary\");\r\n    case COFF_WeakExt_SearchLibrary: return str8_lit(\"SearchLibrary\");\r\n    case COFF_WeakExt_SearchAlias:   return str8_lit(\"SearchAlias\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_reloc_x86(COFF_Reloc_X86 x)\r\n{\r\n  switch (x) {\r\n    case COFF_Reloc_X86_Abs:      return str8_lit(\"Abs\");\r\n    case COFF_Reloc_X86_Dir16:    return str8_lit(\"Dir16\");\r\n    case COFF_Reloc_X86_Rel16:    return str8_lit(\"Rel16\");\r\n    case COFF_Reloc_X86_Unknown0: return str8_lit(\"Unknown0\");\r\n    case COFF_Reloc_X86_Unknown2: return str8_lit(\"Unknown2\");\r\n    case COFF_Reloc_X86_Unknown3: return str8_lit(\"Unknown3\");\r\n    case COFF_Reloc_X86_Dir32:    return str8_lit(\"Dir32\");\r\n    case COFF_Reloc_X86_Dir32Nb:  return str8_lit(\"Dir32Nb\");\r\n    case COFF_Reloc_X86_Seg12:    return str8_lit(\"Seg12\");\r\n    case COFF_Reloc_X86_Section:  return str8_lit(\"Section\");\r\n    case COFF_Reloc_X86_SecRel:   return str8_lit(\"SecRel\");\r\n    case COFF_Reloc_X86_Token:    return str8_lit(\"Token\");\r\n    case COFF_Reloc_X86_SecRel7:  return str8_lit(\"SecRel7\");\r\n    case COFF_Reloc_X86_Unknown4: return str8_lit(\"Unknown4\");\r\n    case COFF_Reloc_X86_Unknown5: return str8_lit(\"Unknown5\");\r\n    case COFF_Reloc_X86_Unknown6: return str8_lit(\"Unknown6\");\r\n    case COFF_Reloc_X86_Unknown7: return str8_lit(\"Unknown7\");\r\n    case COFF_Reloc_X86_Unknown8: return str8_lit(\"Unknown8\");\r\n    case COFF_Reloc_X86_Unknown9: return str8_lit(\"Unknown9\");\r\n    case COFF_Reloc_X86_Rel32:    return str8_lit(\"Rel32\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_reloc_x64(COFF_Reloc_X64 x)\r\n{\r\n  switch (x) {\r\n    case COFF_Reloc_X64_Abs:      return str8_lit(\"Abs\");\r\n    case COFF_Reloc_X64_Addr64:   return str8_lit(\"Addr64\");\r\n    case COFF_Reloc_X64_Addr32:   return str8_lit(\"Addr32\");\r\n    case COFF_Reloc_X64_Addr32Nb: return str8_lit(\"Addr32Nb\");\r\n    case COFF_Reloc_X64_Rel32:    return str8_lit(\"Rel32\");\r\n    case COFF_Reloc_X64_Rel32_1:  return str8_lit(\"Rel32_1\");\r\n    case COFF_Reloc_X64_Rel32_2:  return str8_lit(\"Rel32_2\");\r\n    case COFF_Reloc_X64_Rel32_3:  return str8_lit(\"Rel32_3\");\r\n    case COFF_Reloc_X64_Rel32_4:  return str8_lit(\"Rel32_4\");\r\n    case COFF_Reloc_X64_Rel32_5:  return str8_lit(\"Rel32_5\");\r\n    case COFF_Reloc_X64_Section:  return str8_lit(\"Section\");\r\n    case COFF_Reloc_X64_SecRel:   return str8_lit(\"SecRel\");\r\n    case COFF_Reloc_X64_SecRel7:  return str8_lit(\"SecRel7\");\r\n    case COFF_Reloc_X64_Token:    return str8_lit(\"Token\");\r\n    case COFF_Reloc_X64_SRel32:   return str8_lit(\"SRel32\");\r\n    case COFF_Reloc_X64_Pair:     return str8_lit(\"Pair\");\r\n    case COFF_Reloc_X64_SSpan32:  return str8_lit(\"SSpan32\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_reloc_arm(COFF_Reloc_Arm x)\r\n{\r\n  switch (x) {\r\n    case COFF_Reloc_Arm_Abs:           return str8_lit(\"Abs\");\r\n    case COFF_Reloc_Arm_Addr32:        return str8_lit(\"Addr32\");\r\n    case COFF_Reloc_Arm_Addr32Nb:      return str8_lit(\"Addr32Nb\");\r\n    case COFF_Reloc_Arm_Branch24:      return str8_lit(\"Branch24\");\r\n    case COFF_Reloc_Arm_Branch11:      return str8_lit(\"Branch11\");\r\n    case COFF_Reloc_Arm_Unknown1:      return str8_lit(\"Unknown1\");\r\n    case COFF_Reloc_Arm_Unknown2:      return str8_lit(\"Unknown2\");\r\n    case COFF_Reloc_Arm_Unknown3:      return str8_lit(\"Unknown3\");\r\n    case COFF_Reloc_Arm_Unknown4:      return str8_lit(\"Unknown4\");\r\n    case COFF_Reloc_Arm_Unknown5:      return str8_lit(\"Unknown5\");\r\n    case COFF_Reloc_Arm_Rel32:         return str8_lit(\"Rel32\");\r\n    case COFF_Reloc_Arm_Section:       return str8_lit(\"Section\");\r\n    case COFF_Reloc_Arm_SecRel:        return str8_lit(\"SecRel\");\r\n    case COFF_Reloc_Arm_Mov32:         return str8_lit(\"Mov32\");\r\n    case COFF_Reloc_Arm_ThumbMov32:    return str8_lit(\"ThumbMov32\");\r\n    case COFF_Reloc_Arm_ThumbBranch20: return str8_lit(\"ThumbBranch20\");\r\n    case COFF_Reloc_Arm_Unused:        return str8_lit(\"Unused\");\r\n    case COFF_Reloc_Arm_ThumbBranch24: return str8_lit(\"ThumbBranch24\");\r\n    case COFF_Reloc_Arm_ThumbBlx23:    return str8_lit(\"ThumbBlx23\");\r\n    case COFF_Reloc_Arm_Pair:          return str8_lit(\"Pair\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_reloc_arm64(COFF_Reloc_Arm64 x)\r\n{\r\n  switch (x) {\r\n    case COFF_Reloc_Arm64_Abs:           return str8_lit(\"Abs\");\r\n    case COFF_Reloc_Arm64_Addr32:        return str8_lit(\"Addr32\");\r\n    case COFF_Reloc_Arm64_Addr32Nb:      return str8_lit(\"Addr32Nb\");\r\n    case COFF_Reloc_Arm64_Branch26:      return str8_lit(\"Branch26\");\r\n    case COFF_Reloc_Arm64_PageBaseRel21: return str8_lit(\"PageBaseRel21\");\r\n    case COFF_Reloc_Arm64_Rel21:         return str8_lit(\"Rel21\");\r\n    case COFF_Reloc_Arm64_PageOffset12a: return str8_lit(\"PageOffset12a\");\r\n    case COFF_Reloc_Arm64_SecRel:        return str8_lit(\"SecRel\");\r\n    case COFF_Reloc_Arm64_SecRelLow12a:  return str8_lit(\"SecRelLow12a\");\r\n    case COFF_Reloc_Arm64_SecRelHigh12a: return str8_lit(\"SecRelHigh12a\");\r\n    case COFF_Reloc_Arm64_SecRelLow12l:  return str8_lit(\"SecRelLow12l\");\r\n    case COFF_Reloc_Arm64_Token:         return str8_lit(\"Token\");\r\n    case COFF_Reloc_Arm64_Section:       return str8_lit(\"Section\");\r\n    case COFF_Reloc_Arm64_Addr64:        return str8_lit(\"Addr64\");\r\n    case COFF_Reloc_Arm64_Branch19:      return str8_lit(\"Branch19\");\r\n    case COFF_Reloc_Arm64_Branch14:      return str8_lit(\"Branch14\");\r\n    case COFF_Reloc_Arm64_Rel32:         return str8_lit(\"Rel32\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ncoff_string_from_reloc(COFF_MachineType machine, COFF_RelocType x)\r\n{\r\n  switch (machine) {\r\n    case COFF_MachineType_X86:   return coff_string_from_reloc_x86(x);\r\n    case COFF_MachineType_X64:   return coff_string_from_reloc_x64(x);\r\n    case COFF_MachineType_Arm:   return coff_string_from_reloc_arm(x);\r\n    case COFF_MachineType_Arm64: return coff_string_from_reloc_arm64(x);\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal COFF_MachineType\r\ncoff_machine_from_string(String8 string)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_coff_machine_map); ++i) {\r\n    if (str8_match(g_coff_machine_map[i].string, string, StringMatchFlag_CaseInsensitive)) {\r\n      return g_coff_machine_map[i].machine;\r\n    }\r\n  }\r\n  return COFF_MachineType_Unknown;\r\n}\r\n\r\ninternal COFF_ImportType\r\ncoff_import_header_type_from_string(String8 name)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_coff_import_header_type_map); ++i) {\r\n    if (str8_match(str8_cstring(g_coff_import_header_type_map[i].name), name, StringMatchFlag_CaseInsensitive)) {\r\n      return g_coff_import_header_type_map[i].type;\r\n    }\r\n  }\r\n  return COFF_ImportType_Invalid;\r\n}\r\n\r\n"
  },
  {
    "path": "src/coff/coff.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef COFF_H\n#define COFF_H\n\n////////////////////////////////\n//~ rjf: COFF Format Types\n\nread_only global U8 g_coff_big_header_magic[] =\n{\n  0xc7, 0xa1, 0xba, 0xd1, 0xee, 0xba, 0xa9, 0x4b, 0xaf, 0x20, 0xfa, 0xf6, 0x6a, 0xa4, 0xdc, 0xb8\n};\nread_only global U8 g_coff_res_magic[] =\n{\n  0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00\n};\nread_only global U8 g_coff_archive_sig[8]      = \"!<arch>\\n\";\nread_only global U8 g_coff_thin_archive_sig[8] = \"!<thin>\\n\";\n\n#pragma pack(push, 1)\n\n#define COFF_TimeStamp_Max max_U32\ntypedef U32 COFF_TimeStamp;\n\ntypedef U16 COFF_FileHeaderFlags;\nenum\n{\n  COFF_FileHeaderFlag_RelocStripped        = (1 << 0),\n  COFF_FileHeaderFlag_ExecutableImage      = (1 << 1),\n  COFF_FileHeaderFlag_LineNumbersStripped  = (1 << 2),\n  COFF_FileHeaderFlag_SymbolsStripped      = (1 << 3),\n  COFF_FileHeaderFlag_Reserved0            = (1 << 4),\n  COFF_FileHeaderFlag_LargeAddressAware    = (1 << 5),\n  COFF_FileHeaderFlag_Reserved1            = (1 << 6),\n  COFF_FileHeaderFlag_Reserved2            = (1 << 7),\n  COFF_FileHeaderFlag_32BitMachine         = (1 << 8),\n  COFF_FileHeaderFlag_DebugStripped        = (1 << 9),\n  COFF_FileHeaderFlag_RemovableRunFromSwap = (1 << 10),\n  COFF_FileHeaderFlag_NetRunFromSwap       = (1 << 11),\n  COFF_FileHeaderFlag_System               = (1 << 12),\n  COFF_FileHeaderFlag_Dll                  = (1 << 13),\n  COFF_FileHeaderFlag_UpSystemOnly         = (1 << 14),\n  COFF_FileHeaderFlag_BytesReservedHi      = (1 << 15)\n};\n\ntypedef U16 COFF_MachineType;\nenum\n{\n  COFF_MachineType_Unknown    = 0x0,\n  COFF_MachineType_X86        = 0x14c,\n  COFF_MachineType_X64        = 0x8664,\n  COFF_MachineType_Am33       = 0x1d3,\n  COFF_MachineType_Arm        = 0x1c0,\n  COFF_MachineType_Arm64      = 0xaa64,\n  COFF_MachineType_ArmNt      = 0x1c4,\n  COFF_MachineType_Ebc        = 0xebc,\n  COFF_MachineType_Ia64       = 0x200,\n  COFF_MachineType_M32R       = 0x9041,\n  COFF_MachineType_Mips16     = 0x266,\n  COFF_MachineType_MipsFpu    = 0x366,\n  COFF_MachineType_MipsFpu16  = 0x466,\n  COFF_MachineType_PowerPc    = 0x1f0,\n  COFF_MachineType_PowerPcFp  = 0x1f1,\n  COFF_MachineType_R4000      = 0x166,\n  COFF_MachineType_RiscV32    = 0x5032,\n  COFF_MachineType_RiscV64    = 0x5064,\n  COFF_MachineType_RiscV128   = 0x5128,\n  COFF_MachineType_Sh3        = 0x1a2,\n  COFF_MachineType_Sh3Dsp     = 0x1a3,\n  COFF_MachineType_Sh4        = 0x1a6,\n  COFF_MachineType_Sh5        = 0x1a8,\n  COFF_MachineType_Thumb      = 0x1c2,\n  COFF_MachineType_WceMipsV2  = 0x169\n};\n\ntypedef struct COFF_FileHeader\n{\n  COFF_MachineType     machine;\n  U16                  section_count;\n  COFF_TimeStamp       time_stamp;\n  U32                  symbol_table_foff;\n  U32                  symbol_count;\n  U16                  optional_header_size;\n  COFF_FileHeaderFlags flags;\n} COFF_FileHeader;\n\ntypedef struct COFF_BigObjHeader\n{\n  U16              sig1;              // COFF_MachineType_Unknown\n  U16              sig2;              // max_U16\n  U16              version;           // 2\n  COFF_MachineType machine;\n  COFF_TimeStamp   time_stamp;\n  U8               magic[16];         // g_coff_big_header_magic\n  U8               unused[16];\n  U32              section_count;\n  U32              symbol_table_foff;\n  U32              symbol_count;\n} COFF_BigObjHeader;\n\ntypedef U32 COFF_SectionAlign;\nenum\n{\n  COFF_SectionAlign_None      = 0x0,\n  COFF_SectionAlign_1Bytes    = 0x1,\n  COFF_SectionAlign_2Bytes    = 0x2,\n  COFF_SectionAlign_4Bytes    = 0x3,\n  COFF_SectionAlign_8Bytes    = 0x4,\n  COFF_SectionAlign_16Bytes   = 0x5,\n  COFF_SectionAlign_32Bytes   = 0x6,\n  COFF_SectionAlign_64Bytes   = 0x7,\n  COFF_SectionAlign_128Bytes  = 0x8,\n  COFF_SectionAlign_256Bytes  = 0x9,\n  COFF_SectionAlign_512Bytes  = 0xa,\n  COFF_SectionAlign_1024Bytes = 0xb,\n  COFF_SectionAlign_2048Bytes = 0xc,\n  COFF_SectionAlign_4096Bytes = 0xd,\n  COFF_SectionAlign_8192Bytes = 0xe\n};\n\ntypedef U32 COFF_SectionFlags;\nenum\n{\n  COFF_SectionFlag_TypeNoPad            = (1 << 3),\n  COFF_SectionFlag_CntCode              = (1 << 5),\n  COFF_SectionFlag_CntInitializedData   = (1 << 6),\n  COFF_SectionFlag_CntUninitializedData = (1 << 7),\n  COFF_SectionFlag_LnkOther             = (1 << 8),\n  COFF_SectionFlag_LnkInfo              = (1 << 9),\n  COFF_SectionFlag_LnkRemove            = (1 << 11),\n  COFF_SectionFlag_LnkCOMDAT            = (1 << 12),\n  COFF_SectionFlag_GpRel                = (1 << 15),\n  COFF_SectionFlag_Mem16Bit             = (1 << 17),\n  COFF_SectionFlag_MemLocked            = (1 << 18),\n  COFF_SectionFlag_MemPreload           = (1 << 19),\n  COFF_SectionFlag_AlignShift           = 20,\n  COFF_SectionFlag_AlignMask            = 0xf,\n  COFF_SectionFlag_Align1Bytes          = (COFF_SectionAlign_1Bytes    << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align2Bytes          = (COFF_SectionAlign_2Bytes    << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align4Bytes          = (COFF_SectionAlign_4Bytes    << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align8Bytes          = (COFF_SectionAlign_8Bytes    << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align16Bytes         = (COFF_SectionAlign_16Bytes   << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align32Bytes         = (COFF_SectionAlign_32Bytes   << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align64Bytes         = (COFF_SectionAlign_64Bytes   << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align128Bytes        = (COFF_SectionAlign_128Bytes  << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align256Bytes        = (COFF_SectionAlign_256Bytes  << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align512Bytes        = (COFF_SectionAlign_512Bytes  << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align1024Bytes       = (COFF_SectionAlign_1024Bytes << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align2048Bytes       = (COFF_SectionAlign_2048Bytes << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align4096Bytes       = (COFF_SectionAlign_4096Bytes << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_Align8192Bytes       = (COFF_SectionAlign_8192Bytes << COFF_SectionFlag_AlignShift),\n  COFF_SectionFlag_LnkNRelocOvfl        = (1 << 24),\n  COFF_SectionFlag_MemDiscardable       = (1 << 25),\n  COFF_SectionFlag_MemNotCached         = (1 << 26),\n  COFF_SectionFlag_MemNotPaged          = (1 << 27),\n  COFF_SectionFlag_MemShared            = (1 << 28),\n  COFF_SectionFlag_MemExecute           = (1 << 29),\n  COFF_SectionFlag_MemRead              = (1 << 30),\n  COFF_SectionFlag_MemWrite             = (1 << 31)\n};\n#define COFF_SectionFlags_ExtractAlign(f) (COFF_SectionAlign)(((f) >> COFF_SectionFlag_AlignShift) & COFF_SectionFlag_AlignMask)\n#define COFF_SectionFlags_LnkFlags        ((COFF_SectionFlag_AlignMask << COFF_SectionFlag_AlignShift) | COFF_SectionFlag_LnkCOMDAT | COFF_SectionFlag_LnkInfo | COFF_SectionFlag_LnkOther | COFF_SectionFlag_LnkRemove | COFF_SectionFlag_LnkNRelocOvfl)\n\ntypedef struct COFF_SectionHeader\n{\n  U8                name[8];\n  U32               vsize;\n  U32               voff;\n  U32               fsize;\n  U32               foff;\n  U32               relocs_foff;\n  U32               lines_foff;\n  U16               reloc_count;\n  U16               line_count;\n  COFF_SectionFlags flags;\n} COFF_SectionHeader;\n\n////////////////////////////////\n\ntypedef U8 COFF_SymType;\nenum\n{\n  COFF_SymType_Null,\n  COFF_SymType_Void,\n  COFF_SymType_Char,\n  COFF_SymType_Short,\n  COFF_SymType_Int,\n  COFF_SymType_Long,\n  COFF_SymType_Float,\n  COFF_SymType_Double,\n  COFF_SymType_Struct,\n  COFF_SymType_Union,\n  COFF_SymType_Enum,\n  COFF_SymType_MemberOfEnumeration,\n  COFF_SymType_Byte,\n  COFF_SymType_Word,\n  COFF_SymType_UInt,\n  COFF_SymType_DWord\n};\n\ntypedef U8 COFF_SymStorageClass;\nenum\n{\n  COFF_SymStorageClass_Null            = 0x00,\n  COFF_SymStorageClass_Automatic       = 0x01,\n  COFF_SymStorageClass_External        = 0x02,\n  COFF_SymStorageClass_Static          = 0x03,\n  COFF_SymStorageClass_Register        = 0x04,\n  COFF_SymStorageClass_ExternalDef     = 0x05,\n  COFF_SymStorageClass_Label           = 0x06,\n  COFF_SymStorageClass_UndefinedLabel  = 0x07,\n  COFF_SymStorageClass_MemberOfStruct  = 0x08,\n  COFF_SymStorageClass_Argument        = 0x09,\n  COFF_SymStorageClass_StructTag       = 0x0a,\n  COFF_SymStorageClass_MemberOfUnion   = 0x0b,\n  COFF_SymStorageClass_UnionTag        = 0x0c,\n  COFF_SymStorageClass_TypeDefinition  = 0x0d,\n  COFF_SymStorageClass_UndefinedStatic = 0x0e,\n  COFF_SymStorageClass_EnumTag         = 0x0f,\n  COFF_SymStorageClass_MemberOfEnum    = 0x10,\n  COFF_SymStorageClass_RegisterParam   = 0x11,\n  COFF_SymStorageClass_BitField        = 0x12,\n  COFF_SymStorageClass_Block           = 0x64,\n  COFF_SymStorageClass_Function        = 0x65,\n  COFF_SymStorageClass_EndOfStruct     = 0x66,\n  COFF_SymStorageClass_File            = 0x67,\n  COFF_SymStorageClass_Section         = 0x68,\n  COFF_SymStorageClass_WeakExternal    = 0x69,\n  COFF_SymStorageClass_CLRToken        = 0x6b,\n  COFF_SymStorageClass_EndOfFunction   = 0xff\n};\n\ntypedef U8 COFF_SymDType;\nenum\n{\n  COFF_SymDType_Null  = 0x00,\n  COFF_SymDType_Ptr   = 0x10,\n  COFF_SymDType_Func  = 0x20,\n  COFF_SymDType_Array = 0x30\n};\n\n// Special values for section number field in coff symbol\n#define COFF_Symbol_UndefinedSection 0\n#define COFF_Symbol_AbsSection32     ((U32)-1)\n#define COFF_Symbol_DebugSection32   ((U32)-2)\n#define COFF_Symbol_AbsSection16     ((U16)-1)\n#define COFF_Symbol_DebugSection16   ((U16)-2)\n\ntypedef union COFF_SymbolName\n{\n  U8 short_name[8];\n  struct {\n    // if this field is filled with zeroes we have a long name,\n    // which means name is stored in the string table\n    // and we need to use the offset to look it up...\n    U32 zeroes;\n    U32 string_table_offset;\n  } long_name;\n} COFF_SymbolName;\n\n#define COFF_SymbolType_IsFunc(x) ((x).u.lsb == COFF_SymType_Null && (x).u.msb == COFF_SymDType_Func)\n\ntypedef union COFF_SymbolType\n{\n  struct {\n    COFF_SymDType msb;\n    COFF_SymType lsb;\n  } u;\n  U16 v;\n} COFF_SymbolType;\n\ntypedef struct COFF_Symbol16\n{\n  COFF_SymbolName      name;\n  U32                  value;\n  U16                  section_number;\n  COFF_SymbolType      type;\n  COFF_SymStorageClass storage_class;\n  U8                   aux_symbol_count;\n} COFF_Symbol16;\n\ntypedef struct COFF_Symbol32\n{\n  COFF_SymbolName      name;\n  U32                  value;\n  U32                  section_number;\n  COFF_SymbolType      type;\n  COFF_SymStorageClass storage_class;\n  U8                   aux_symbol_count;\n} COFF_Symbol32;\n\ntypedef U32 COFF_WeakExtType;\nenum\n{\n  COFF_WeakExt_Null           = 0,\n  COFF_WeakExt_NoLibrary      = 1,\n  COFF_WeakExt_SearchLibrary  = 2,\n  COFF_WeakExt_SearchAlias    = 3,\n  COFF_WeakExt_AntiDependency = 4, // search libraries only if the default symbol is weak, even if the weak symbol points to itself\n};\n\n// storage class: External\ntypedef struct COFF_SymbolFuncDef\n{\n  U32 tag_index;\n  U32 total_size;\n  U32 ptr_to_ln;\n  U32 ptr_to_next_func;\n  U8  unused[2];\n} COFF_SymbolFuncDef;\n\n// storage class: Function\ntypedef struct COFF_SymbolFunc\n{\n  U8  unused[4];\n  U16 ln;\n  U8  unused2[2];\n  U32 ptr_to_next_func;\n  U8  unused3[2];\n} COFF_SymbolFunc;\n\n// storage class: WeakExternal\ntypedef struct COFF_SymbolWeakExt\n{\n  U32              tag_index;\n  COFF_WeakExtType characteristics;\n  U8               unused[10];\n} COFF_SymbolWeakExt;\n\ntypedef struct COFF_SymbolFile \n{\n  U8 name[18];\n} COFF_SymbolFile;\n\ntypedef U8 COFF_ComdatSelectType;\nenum\n{\n  COFF_ComdatSelect_Null         = 0, \n  COFF_ComdatSelect_NoDuplicates = 1, // Only one symbol is allowed to be in global symbol table, otherwise multiply defintion error is thrown.\n  COFF_ComdatSelect_Any          = 2, // Select any symbol, even if there are multiple definitions. (we default to first declaration)\n  COFF_ComdatSelect_SameSize     = 3, // Sections that symbols reference must match in size, otherwise multiply definition error is thrown.\n  COFF_ComdatSelect_ExactMatch   = 4, // Sections that symbols reference must have identical checksums, otherwise multiply defintion error is thrown.\n  COFF_ComdatSelect_Associative  = 5, // Symbols with associative type form a chain of sections are related to each other. (next link is indicated in COFF_SecDef in 'number')\n  COFF_ComdatSelect_Largest      = 6  // Linker selects section with largest size.\n};\n\n// provides information about section to which symbol refers to.\n// storage class: Static\ntypedef struct COFF_SymbolSecDef\n{\n  U32                   length;\n  U16                   number_of_relocations;\n  U16                   number_of_ln;\n  U32                   check_sum;\n  U16                   number_lo;  // low 16 bits of one-based section index\n  COFF_ComdatSelectType selection;\n  U8                    unused;\n  U16                   number_hi;\n} COFF_SymbolSecDef;\n\n////////////////////////////////\n\ntypedef U16 COFF_RelocType;\n\ntypedef COFF_RelocType COFF_Reloc_X64;\nenum\n{\n  COFF_Reloc_X64_Abs        = 0x0,\n  COFF_Reloc_X64_Addr64     = 0x1,\n  COFF_Reloc_X64_Addr32     = 0x2,\n  COFF_Reloc_X64_Addr32Nb   = 0x3,  // NB => No Base\n  COFF_Reloc_X64_Rel32      = 0x4,\n  COFF_Reloc_X64_Rel32_1    = 0x5,\n  COFF_Reloc_X64_Rel32_2    = 0x6,\n  COFF_Reloc_X64_Rel32_3    = 0x7,\n  COFF_Reloc_X64_Rel32_4    = 0x8,\n  COFF_Reloc_X64_Rel32_5    = 0x9,\n  COFF_Reloc_X64_Section    = 0xA,\n  COFF_Reloc_X64_SecRel     = 0xB,\n  COFF_Reloc_X64_SecRel7    = 0xC,  // TODO(nick): MSDN doesn't specify size for CLR token\n  COFF_Reloc_X64_Token      = 0xD,\n  COFF_Reloc_X64_SRel32     = 0xE,  // TODO(nick): MSDN doesn't specify size for PAIR\n  COFF_Reloc_X64_Pair       = 0xF,\n  COFF_Reloc_X64_SSpan32    = 0x10,\n  COFF_Reloc_X64_Unknown_11 = 0x11,\n  COFF_Reloc_X64_Last       = COFF_Reloc_X64_Unknown_11,\n};\n\ntypedef COFF_RelocType COFF_Reloc_X86;\nenum\n{\n  COFF_Reloc_X86_Abs      = 0x0,  //  relocation is ignored\n  COFF_Reloc_X86_Dir16    = 0x1,  //  no support\n  COFF_Reloc_X86_Rel16    = 0x2,  //  no support\n  COFF_Reloc_X86_Unknown0 = 0x3,\n  COFF_Reloc_X86_Unknown2 = 0x4,\n  COFF_Reloc_X86_Unknown3 = 0x5,\n  COFF_Reloc_X86_Dir32    = 0x6,  //  32-bit virtual address\n  COFF_Reloc_X86_Dir32Nb  = 0x7,  //  32-bit virtual offset\n  COFF_Reloc_X86_Seg12    = 0x9,  //  no support\n  COFF_Reloc_X86_Section  = 0xa,  //  16-bit section index, used for debug info purposes\n  COFF_Reloc_X86_SecRel   = 0xb,  //  32-bit offset from start of a section\n  COFF_Reloc_X86_Token    = 0xc,  //  CLR token? (for managed languages)\n  COFF_Reloc_X86_SecRel7  = 0xd,  //  7-bit offset from the base of the section that contains the target.\n  COFF_Reloc_X86_Unknown4 = 0xe,\n  COFF_Reloc_X86_Unknown5 = 0xf,\n  COFF_Reloc_X86_Unknown6 = 0x10,\n  COFF_Reloc_X86_Unknown7 = 0x11,\n  COFF_Reloc_X86_Unknown8 = 0x12,\n  COFF_Reloc_X86_Unknown9 = 0x13,\n  COFF_Reloc_X86_Rel32    = 0x14\n};\n\ntypedef COFF_RelocType COFF_Reloc_Arm;\nenum\n{\n  COFF_Reloc_Arm_Abs           = 0x0,\n  COFF_Reloc_Arm_Addr32        = 0x1,\n  COFF_Reloc_Arm_Addr32Nb      = 0x2,\n  COFF_Reloc_Arm_Branch24      = 0x3,\n  COFF_Reloc_Arm_Branch11      = 0x4,\n  COFF_Reloc_Arm_Unknown1      = 0x5,\n  COFF_Reloc_Arm_Unknown2      = 0x6,\n  COFF_Reloc_Arm_Unknown3      = 0x7,\n  COFF_Reloc_Arm_Unknown4      = 0x8,\n  COFF_Reloc_Arm_Unknown5      = 0x9,\n  COFF_Reloc_Arm_Rel32         = 0xa,\n  COFF_Reloc_Arm_Section       = 0xe,\n  COFF_Reloc_Arm_SecRel        = 0xf,\n  COFF_Reloc_Arm_Mov32         = 0x10,\n  COFF_Reloc_Arm_ThumbMov32    = 0x11,\n  COFF_Reloc_Arm_ThumbBranch20 = 0x12,\n  COFF_Reloc_Arm_Unused        = 0x13,\n  COFF_Reloc_Arm_ThumbBranch24 = 0x14,\n  COFF_Reloc_Arm_ThumbBlx23    = 0x15,\n  COFF_Reloc_Arm_Pair          = 0x16\n};\n\ntypedef COFF_RelocType COFF_Reloc_Arm64;\nenum\n{\n  COFF_Reloc_Arm64_Abs           = 0x0,\n  COFF_Reloc_Arm64_Addr32        = 0x1,\n  COFF_Reloc_Arm64_Addr32Nb      = 0x2,\n  COFF_Reloc_Arm64_Branch26      = 0x3,\n  COFF_Reloc_Arm64_PageBaseRel21 = 0x4,\n  COFF_Reloc_Arm64_Rel21         = 0x5,\n  COFF_Reloc_Arm64_PageOffset12a = 0x6,\n  COFF_Reloc_Arm64_SecRel        = 0x8,\n  COFF_Reloc_Arm64_SecRelLow12a  = 0x9,\n  COFF_Reloc_Arm64_SecRelHigh12a = 0xa,\n  COFF_Reloc_Arm64_SecRelLow12l  = 0xb,\n  COFF_Reloc_Arm64_Token         = 0xc,\n  COFF_Reloc_Arm64_Section       = 0xd,\n  COFF_Reloc_Arm64_Addr64        = 0xe,\n  COFF_Reloc_Arm64_Branch19      = 0xf,\n  COFF_Reloc_Arm64_Branch14      = 0x10,\n  COFF_Reloc_Arm64_Rel32         = 0x11\n};\n\ntypedef struct COFF_Reloc\n{\n  U32            apply_off; // section relative offset where relocation is placed\n  U32            isymbol;   // zero based index into coff symbol table\n  COFF_RelocType type;      // relocation type that depends on the arch\n} COFF_Reloc;\n\n////////////////////////////////\n\n#define COFF_ResourceAlign 4u\n\ntypedef struct COFF_ResourceHeaderPrefix\n{\n  U32 data_size;\n  U32 header_size;\n} COFF_ResourceHeaderPrefix;\n\ntypedef U16 COFF_ResourceMemoryFlags;\nenum\n{\n  COFF_ResourceMemoryFlag_Moveable    = 0x10,\n  COFF_ResourceMemoryFlag_Pure        = 0x20,\n  COFF_ResourceMemoryFlag_PreLoad     = 0x40,\n  COFF_ResourceMemoryFlag_Discardable = 0x1000\n};\n\ntypedef struct COFF_ResourceDataEntry\n{\n  U32 data_voff;\n  U32 data_size;\n  U32 code_page;\n  U32 reserved;\n} COFF_ResourceDataEntry;\n\ntypedef struct COFF_ResourceDirTable\n{\n  U32            characteristics;\n  COFF_TimeStamp time_stamp;\n  U16            major_version;\n  U16            minor_version;\n  U16            name_entry_count;\n  U16            id_entry_count;\n} COFF_ResourceDirTable;\n\n#define COFF_Resource_SubDirFlag (1u << 31u)\ntypedef struct COFF_ResourceDirEntry\n{\n  union {\n    U32 offset;\n    U32 id;\n  } name;\n  union {\n    U32 data_entry_offset;\n    U32 sub_dir_offset;\n  } id;\n} COFF_ResourceDirEntry;\n\n////////////////////////////////\n\n#define COFF_Archive_MemberAlign      2\n#define COFF_Archive_MaxShortNameSize 15\n\ntypedef struct COFF_ArchiveMemberHeader\n{\n  U8 name[16];\n  U8 date[12];\n  U8 user_id[6];\n  U8 group_id[6];\n  U8 mode[8];\n  U8 size[10];\n  U8 end[2];\n} COFF_ArchiveMemberHeader;\n\n#define COFF_ImportType_Invalid max_U16\ntypedef U16 COFF_ImportType;\nenum\n{\n  COFF_ImportHeader_Code  = 0,\n  COFF_ImportHeader_Data  = 1,\n  COFF_ImportHeader_Const = 2\n};\n\ntypedef U32 COFF_ImportByType;\nenum\n{\n  COFF_ImportBy_Ordinal      = 0,\n  COFF_ImportBy_Name         = 1,\n  COFF_ImportBy_NameNoPrefix = 2,\n  COFF_ImportBy_Undecorate   = 3\n};\n\ntypedef U16 COFF_ImportHeaderFlags;\nenum\n{\n  COFF_ImportHeader_TypeShift = 0,\n  COFF_ImportHeader_TypeMask  = 3,\n  COFF_ImportHeader_ImportByShift = 2,\n  COFF_ImportHeader_ImportByMask  = 3,\n};\n#define COFF_ImportHeader_ExtractType(x)     (((x) >> COFF_ImportHeader_TypeShift    ) & COFF_ImportHeader_TypeMask    )\n#define COFF_ImportHeader_ExtractImportBy(x) (((x) >> COFF_ImportHeader_ImportByShift) & COFF_ImportHeader_ImportByMask)\n\ntypedef struct COFF_ImportHeader\n{\n  U16                    sig1;     // COFF_MachineType_Unknown\n  U16                    sig2;     // max_U16\n  U16                    version;  // 0\n  COFF_MachineType       machine;\n  COFF_TimeStamp         time_stamp;\n  U32                    data_size;\n  U16                    hint_or_ordinal;\n  COFF_ImportHeaderFlags flags;\n  // char *func_name;\n  // char *dll_name;\n} COFF_ImportHeader;\n\n#pragma pack(pop)\n\ntypedef struct COFF_RelocValue\n{\n  U64 size;\n  S64 value;\n} COFF_RelocValue;\n\n////////////////////////////////\n// Section\n\ninternal U64               coff_align_size_from_section_flags(COFF_SectionFlags flags);\ninternal COFF_SectionFlags coff_section_flag_from_align_size (U64 align);\n\ninternal String8 coff_name_from_section_header(String8 string_table, COFF_SectionHeader *header);\ninternal void    coff_parse_section_name      (String8 full_name, String8 *name_out, String8 *postfix_out);\n\n////////////////////////////////\n// Symbol\n\ninternal String8 coff_read_symbol_name(String8 string_table, COFF_SymbolName *name);\n\n////////////////////////////////\n// Reloc\n\ninternal U64 coff_is_addr_reloc(COFF_MachineType machine, U32 type);\n\ninternal U64 coff_apply_size_from_reloc_x64(COFF_Reloc_X64 x);\ninternal U64 coff_apply_size_from_reloc_x86(COFF_Reloc_X86 x);\n\ninternal COFF_RelocValue coff_pick_reloc_value_x64(COFF_Reloc_X64 type, U64 image_base, U64 reloc_virtual_offset, U32 symbol_section_number, U32 symbol_section_offset, S64 symbol_virtual_offset);\n\n////////////////////////////////\n// Import\n\ninternal U32 coff_make_ordinal32(U16 hint);\ninternal U64 coff_make_ordinal64(U16 hint);\ninternal String8 coff_ordinal_data_from_hint(Arena *arena, COFF_MachineType machine, U16 hint);\n\ninternal String8 coff_make_lib_member_header(Arena *arena, String8 name, COFF_TimeStamp time_stamp, U16 user_id, U16 group_id, U16 mode, U32 size);\ninternal String8 coff_make_import_lookup(Arena *arena, U16 hint, String8 name);\ninternal String8 coff_make_import_header(Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportByType import_by, String8 name, U16 hint_or_ordinal, COFF_ImportType type);\n\n////////////////////////////////\n// Misc\n\ninternal U16 coff_default_align_from_machine   (COFF_MachineType machine);\ninternal U8  coff_code_align_byte_from_machine (COFF_MachineType machine);\ninternal U64 coff_word_size_from_machine       (COFF_MachineType machine);\ninternal U64 coff_default_exe_base_from_machine(COFF_MachineType machine);\ninternal U64 coff_default_dll_base_from_machine(COFF_MachineType machine);\n\ninternal Arch arch_from_coff_machine(COFF_MachineType machine);\ninternal U64  coff_foff_from_voff(COFF_SectionHeader *sections, U64 section_count, U64 voff);\n\n////////////////////////////////\n//~ rjf: Enum <=> String\n\ninternal String8 coff_string_from_time_stamp(Arena *arena, COFF_TimeStamp time_stamp);\ninternal String8 coff_string_from_comdat_select_type(COFF_ComdatSelectType type);\ninternal String8 coff_string_from_machine_type(COFF_MachineType machine);\ninternal String8 coff_string_from_flags(Arena *arena, COFF_FileHeaderFlags flags);\ninternal String8 coff_string_from_section_flags(Arena *arena, COFF_SectionFlags flags);\ninternal String8 coff_string_from_resource_memory_flags(Arena *arena, COFF_ResourceMemoryFlags flags);\ninternal String8 coff_string_from_import_header_type(COFF_ImportType type);\ninternal String8 coff_string_from_sym_dtype(COFF_SymDType x);\ninternal String8 coff_string_from_sym_type(COFF_SymType x);\ninternal String8 coff_string_from_sym_storage_class(COFF_SymStorageClass x);\ninternal String8 coff_string_from_weak_ext_type(COFF_WeakExtType x);\ninternal String8 coff_string_from_reloc_x86(COFF_Reloc_X86 x);\ninternal String8 coff_string_from_reloc_x64(COFF_Reloc_X64 x);\ninternal String8 coff_string_from_reloc_arm(COFF_Reloc_Arm x);\ninternal String8 coff_string_from_reloc_arm64(COFF_Reloc_Arm64 x);\ninternal String8 coff_string_from_reloc(COFF_MachineType machine, COFF_RelocType x);\n\ninternal COFF_MachineType coff_machine_from_string(String8 string);\ninternal COFF_ImportType  coff_import_header_type_from_string(String8 name);\n\n#endif // COFF_H\n"
  },
  {
    "path": "src/coff/coff_dump.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#if 0\ninternal void\ncoff_print_archive_member_header(Arena *arena, String8List *out, String8 indent, COFF_ParsedArchiveMemberHeader header, String8 long_names)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 time_stamp = coff_string_from_time_stamp(scratch.arena, header.time_stamp);\n  \n  rd_printf(\"Name      : %S\"             , header.name    );\n  rd_printf(\"Time Stamp: (%#x) %S\"       , header.time_stamp, time_stamp     );\n  rd_printf(\"User ID   : %u\"             , header.user_id );\n  rd_printf(\"Group ID  : %u\"             , header.group_id);\n  rd_printf(\"Mode      : %S\"             , header.mode    );\n  rd_printf(\"Data      : [%#llx-%#llx)\", header.data_range.min, header.data_range.max);\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_section_table(Arena               *arena,\n                         String8List        *out,\n                         String8             indent,\n                         String8             string_table,\n                         COFF_Symbol32Array  symbol_table,\n                         U64                 section_count,\n                         COFF_SectionHeader *section_table)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 *symlinks = push_array(scratch.arena, String8, section_count);\n  for (U64 i = 0; i < symbol_table.count; ++i) {\n    COFF_Symbol32              *symbol = symbol_table.v+i;\n    COFF_SymbolValueInterpType  interp = coff_interp_symbol(symbol->section_number, symbol->value, symbol->storage_class);\n    if (interp == COFF_SymbolValueInterp_Regular &&\n        symbol->aux_symbol_count == 0 &&\n        (symbol->storage_class == COFF_SymStorageClass_External || symbol->storage_class == COFF_SymStorageClass_Static)) {\n      if (symbol->section_number > 0 && symbol->section_number <= symbol_table.count) {\n        COFF_SectionHeader *header = section_table+(symbol->section_number-1);\n        if (header->flags & COFF_SectionFlag_LnkCOMDAT) {\n          symlinks[symbol->section_number-1] = coff_read_symbol_name(string_table, &symbol->name);\n        }\n      }\n    }\n    i += symbol->aux_symbol_count;\n  }\n  \n  if (section_count) {\n    rd_printf(\"# Section Table\");\n    rd_indent();\n    \n    rd_printf(\"%-4s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-8s %-5s %-10s %s\",\n              \"No.\",\n              \"Name\",\n              \"VirtSize\",\n              \"VirtOff\",\n              \"FileSize\",\n              \"FileOff\",\n              \"RelocOff\",\n              \"LinesOff\",\n              \"RelocCnt\",\n              \"LineCnt\",\n              \"Align\",\n              \"Flags\",\n              \"Symlink\");\n    \n    for (U64 i = 0; i < section_count; ++i) {\n      COFF_SectionHeader *header = section_table+i;\n      \n      String8 name      = str8_cstring_capped(header->name, header->name+sizeof(header->name));\n      String8 full_name = coff_name_from_section_header(string_table, header);\n      \n      String8 align;\n      {\n        U64 align_size = coff_align_size_from_section_flags(header->flags);\n        align = push_str8f(scratch.arena, \"%u\", align_size);\n      }\n      \n      String8 flags;\n      {\n        String8List mem_flags = {0};\n        if (header->flags & COFF_SectionFlag_MemRead) {\n          str8_list_pushf(scratch.arena, &mem_flags, \"r\");\n        }\n        if (header->flags & COFF_SectionFlag_MemWrite) {\n          str8_list_pushf(scratch.arena, &mem_flags, \"w\");\n        }\n        if (header->flags & COFF_SectionFlag_MemExecute) {\n          str8_list_pushf(scratch.arena, &mem_flags, \"x\");\n        }\n        \n        String8List cnt_flags = {0};\n        if (header->flags & COFF_SectionFlag_CntCode) {\n          str8_list_pushf(scratch.arena, &cnt_flags, \"c\");\n        }\n        if (header->flags & COFF_SectionFlag_CntInitializedData) {\n          str8_list_pushf(scratch.arena, &cnt_flags, \"d\");\n        }\n        if (header->flags & COFF_SectionFlag_CntUninitializedData) {\n          str8_list_pushf(scratch.arena, &cnt_flags, \"u\");\n        }\n        \n        String8List mem_extra_flags = {0};\n        if (header->flags & COFF_SectionFlag_MemShared) {\n          str8_list_pushf(scratch.arena, &mem_flags, \"s\");\n        }\n        if (header->flags & COFF_SectionFlag_Mem16Bit) {\n          str8_list_pushf(scratch.arena, &mem_extra_flags, \"h\");\n        }\n        if (header->flags & COFF_SectionFlag_MemLocked) {\n          str8_list_pushf(scratch.arena, &mem_extra_flags, \"l\");\n        }\n        if (header->flags & COFF_SectionFlag_MemDiscardable) {\n          str8_list_pushf(scratch.arena, &mem_extra_flags, \"d\");\n        }\n        if (header->flags & COFF_SectionFlag_MemNotCached) {\n          str8_list_pushf(scratch.arena, &mem_extra_flags, \"c\");\n        }\n        if (header->flags & COFF_SectionFlag_MemNotPaged) {\n          str8_list_pushf(scratch.arena, &mem_extra_flags, \"p\");\n        }\n        \n        String8List lnk_flags = {0};\n        if (header->flags & COFF_SectionFlag_LnkRemove) {\n          str8_list_pushf(scratch.arena, &lnk_flags, \"r\");\n        }\n        if (header->flags & COFF_SectionFlag_LnkCOMDAT) {\n          str8_list_pushf(scratch.arena, &lnk_flags, \"c\");\n        }\n        if (header->flags & COFF_SectionFlag_LnkOther) {\n          str8_list_pushf(scratch.arena, &lnk_flags, \"o\");\n        }\n        if (header->flags & COFF_SectionFlag_LnkInfo) {\n          str8_list_pushf(scratch.arena, &lnk_flags, \"i\");\n        }\n        if (header->flags & COFF_SectionFlag_LnkNRelocOvfl) {\n          str8_list_pushf(scratch.arena, &lnk_flags, \"f\");\n        }\n        \n        String8List other_flags = {0};\n        if (header->flags & COFF_SectionFlag_TypeNoPad) {\n          str8_list_pushf(scratch.arena, &other_flags, \"n\");\n        }\n        if (header->flags & COFF_SectionFlag_GpRel) {\n          str8_list_pushf(scratch.arena, &other_flags, \"g\");\n        }\n        \n        String8 mem = str8_list_join(scratch.arena, &mem_flags, 0);\n        String8 cnt = str8_list_join(scratch.arena, &cnt_flags, 0);\n        String8 lnk = str8_list_join(scratch.arena, &lnk_flags, 0);\n        String8 ext = str8_list_join(scratch.arena, &mem_extra_flags, 0);\n        String8 oth = str8_list_join(scratch.arena, &other_flags, 0);\n        \n        String8List f = {0};\n        str8_list_push(scratch.arena, &f, mem);\n        str8_list_push(scratch.arena, &f, cnt);\n        str8_list_push(scratch.arena, &f, ext);\n        str8_list_push(scratch.arena, &f, lnk);\n        str8_list_push(scratch.arena, &f, oth);\n        \n        flags = str8_list_join(scratch.arena, &f, &(StringJoin){ .sep = str8_lit(\"-\") });\n        \n        if (!flags.size) {\n          flags = str8_lit(\"none\");\n        }\n      }\n      \n      String8List l = {0};\n      str8_list_pushf(scratch.arena, &l, \"%-4x\",  i+1                );\n      str8_list_pushf(scratch.arena, &l, \"%-8S\",  name               );\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->vsize      );\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->voff       );\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->fsize      );\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->foff       );\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->relocs_foff);\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->lines_foff );\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->reloc_count);\n      str8_list_pushf(scratch.arena, &l, \"%08x\",  header->line_count );\n      str8_list_pushf(scratch.arena, &l, \"%-5S\",  align              );\n      str8_list_pushf(scratch.arena, &l, \"%-10S\", flags              );\n      if (symlinks[i].size > 0) {\n        str8_list_pushf(scratch.arena, &l, \"%S\", symlinks[i]);\n      } else {\n        str8_list_pushf(scratch.arena, &l, \"[no symlink]\");\n      }\n      \n      String8 line = str8_list_join(scratch.arena, &l, &(StringJoin){ .sep = str8_lit(\" \"), });\n      rd_printf(\"%S\", line);\n      \n      if (full_name.size != name.size) {\n        rd_indent();\n        rd_printf(\"Full Name: %S\", full_name);\n        rd_unindent();\n      }\n    }\n    \n    rd_newline();\n    rd_printf(\"Flags:\");\n    rd_indent();\n    rd_printf(\"r = MemRead    w = MemWrite        x = MemExecute\");\n    rd_printf(\"c = CntCode    d = InitializedData u = UninitializedData\");\n    rd_printf(\"s = MemShared  h = Mem16bit        l = MemLocked          d = MemDiscardable c = MemNotCached  p = MemNotPaged\");\n    rd_printf(\"r = LnkRemove  c = LnkComdat       o = LnkOther           i = LnkInfo        f = LnkNRelocOvfl\");\n    rd_printf(\"g = GpRel      n = TypeNoPad\");\n    rd_unindent();\n    \n    rd_unindent();\n    rd_newline();\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_disasm_sections(Arena              *arena,\n                     String8List        *out,\n                     String8             indent,\n                     String8             raw_data,\n                     COFF_MachineType    machine,\n                     U64                 image_base,\n                     B32                 is_obj,\n                     RD_MarkerArray     *section_markers,\n                     U64                 section_count,\n                     COFF_SectionHeader *sections)\n{\n  if (section_count) {\n    for (U64 sect_idx = 0; sect_idx < section_count; ++sect_idx) {\n      COFF_SectionHeader *sect = sections+sect_idx;\n      if (sect->flags & COFF_SectionFlag_CntCode) {\n        U64            sect_off    = is_obj ? sect->foff : sect->voff;\n        U64            sect_size   = is_obj ? sect->fsize : sect->vsize;\n        String8        raw_code    = str8_substr(raw_data, rng_1u64(sect->foff, sect->foff+sect_size));\n        U64            sect_number = sect_idx+1;\n        RD_MarkerArray markers     = section_markers[sect_number];\n        \n        rd_printf(\"# Disassembly [Section No. %#llx]\", sect_number);\n        rd_indent();\n        rd_print_disasm(arena, out, indent, arch_from_coff_machine(machine), image_base, sect_off, markers.count, markers.v, raw_code);\n        rd_unindent();\n      }\n    }\n  }\n}\n\ninternal void\ncoff_raw_data_sections(Arena              *arena,\n                       String8List        *out,\n                       String8             indent,\n                       String8             raw_data,\n                       B32                 is_obj,\n                       RD_MarkerArray     *section_markers,\n                       U64                 section_count,\n                       COFF_SectionHeader *section_table)\n{\n  if (section_count) {\n    for (U64 sect_idx = 0; sect_idx < section_count; ++sect_idx) {\n      COFF_SectionHeader *sect = section_table+sect_idx;\n      if (sect->fsize > 0) {\n        U64         sect_size = is_obj ? sect->fsize : sect->vsize;\n        String8     raw_sect  = str8_substr(raw_data, rng_1u64(sect->foff, sect->foff+sect_size));\n        RD_MarkerArray markers   = section_markers[sect_idx];\n        \n        rd_printf(\"# Raw Data [Section No. %#llx]\", (sect_idx+1));\n        rd_indent();\n        rd_print_raw_data(arena, out, indent, 32, markers.count, markers.v, raw_sect);\n        rd_unindent();\n        rd_newline();\n      }\n    }\n  }\n}\n\ninternal void\ncoff_print_relocs(Arena              *arena,\n                  String8List        *out,\n                  String8             indent,\n                  String8             raw_data,\n                  String8             string_table,\n                  COFF_MachineType    machine,\n                  U64                 sect_count,\n                  COFF_SectionHeader *sect_headers,\n                  COFF_Symbol32Array  symbols)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  B32 print_header = 1;\n  \n  for (U64 sect_idx = 0; sect_idx < sect_count; ++sect_idx) {\n    COFF_SectionHeader *sect_header = sect_headers+sect_idx;\n    COFF_RelocInfo      reloc_info  = coff_reloc_info_from_section_header(raw_data, sect_header);\n    \n    if (reloc_info.count) {\n      if (print_header) {\n        print_header = 0;\n        rd_printf(\"# Relocations\");\n        rd_indent();\n      }\n      \n      rd_printf(\"## Section %llx\", sect_idx);\n      rd_indent();\n      \n      rd_printf(\"%-4s %-8s %-16s %-16s %-8s %-7s\", \"No.\", \"Offset\", \"Type\", \"ApplyTo\", \"SymIdx\", \"SymName\");\n      \n      for (U64 reloc_idx = 0; reloc_idx < reloc_info.count; ++reloc_idx) {\n        COFF_Reloc *reloc      = (COFF_Reloc*)(raw_data.str + reloc_info.array_off) + reloc_idx;\n        String8     type       = coff_string_from_reloc(machine, reloc->type);\n        U64         apply_size = coff_apply_size_from_reloc(machine, reloc->type);\n        \n        U64 apply_foff = sect_header->foff + reloc->apply_off;\n        if (apply_foff + apply_size > raw_data.size) {\n          rd_errorf(\"out of bounds apply file offset %#llx in relocation %#llx\", apply_foff, reloc_idx);\n          break;\n        }\n        \n        U64 raw_apply;\n        AssertAlways(apply_size <= sizeof(raw_apply));\n        MemoryCopy(&raw_apply, raw_data.str + apply_foff, apply_size);\n        S64 apply = extend_sign64(raw_apply, apply_size);\n        \n        if (reloc->isymbol > symbols.count) {\n          rd_errorf(\"out of bounds symbol index %u in relocation %#llx\", reloc->isymbol, reloc_idx);\n          break;\n        }\n        \n        COFF_Symbol32 *symbol      = symbols.v+reloc->isymbol;\n        String8        symbol_name = coff_read_symbol_name(string_table, &symbol->name);\n        \n        String8List line = {0};\n        str8_list_pushf(scratch.arena, &line, \"%-4x\",  reloc_idx       );\n        str8_list_pushf(scratch.arena, &line, \"%08x\",  reloc->apply_off);\n        str8_list_pushf(scratch.arena, &line, \"%-16S\", type            );\n        str8_list_pushf(scratch.arena, &line, \"%016x\", apply           );\n        str8_list_pushf(scratch.arena, &line, \"%S\",    symbol_name     );\n        \n        String8 l = str8_list_join(scratch.arena, &line, &(StringJoin){.sep=str8_lit(\" \")});\n        rd_printf(\"%S\", l);\n      }\n      \n      rd_unindent();\n    }\n  }\n  \n  if (!print_header) {\n    rd_unindent();\n  }\n  rd_newline();\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_symbol_table(Arena              *arena,\n                        String8List        *out,\n                        String8             indent,\n                        String8             raw_data,\n                        B32                 is_big_obj,\n                        String8             string_table,\n                        COFF_Symbol32Array  symbols)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  if (symbols.count) {\n    rd_printf(\"# Symbol Table\");\n    rd_indent();\n    \n    rd_printf(\"%-4s %-8s %-10s %-4s %-4s %-4s %-16s %-20s\", \n              \"No.\", \"Value\", \"SectNum\", \"Aux\", \"Msb\", \"Lsb\", \"Storage\", \"Name\");\n    \n    for (U64 i = 0; i < symbols.count; ++i) {\n      COFF_Symbol32 *symbol        = &symbols.v[i];\n      String8        name          = coff_read_symbol_name(string_table, &symbol->name);\n      String8        msb           = coff_string_from_sym_dtype(symbol->type.u.msb);\n      String8        lsb           = coff_string_from_sym_type(symbol->type.u.lsb);\n      String8        storage_class = coff_string_from_sym_storage_class(symbol->storage_class);\n      String8        section_number;\n      switch (symbol->section_number) {\n        case COFF_Symbol_UndefinedSection: section_number = str8_lit(\"Undef\"); break;\n        case COFF_Symbol_AbsSection32:     section_number = str8_lit(\"Abs\");   break;\n        case COFF_Symbol_DebugSection32:   section_number = str8_lit(\"Debug\"); break;\n        default:                           section_number = push_str8f(scratch.arena, \"%010x\", symbol->section_number); break;\n      }\n      \n      String8List line = {0};\n      str8_list_pushf(scratch.arena, &line, \"%-4x\",  i                       );\n      str8_list_pushf(scratch.arena, &line, \"%08x\",  symbol->value           );\n      str8_list_pushf(scratch.arena, &line, \"%-10S\", section_number          );\n      str8_list_pushf(scratch.arena, &line, \"%-4u\",  symbol->aux_symbol_count);\n      str8_list_pushf(scratch.arena, &line, \"%-4S\",  msb                     );\n      str8_list_pushf(scratch.arena, &line, \"%-4S\",  lsb                     );\n      str8_list_pushf(scratch.arena, &line, \"%-16S\", storage_class           );\n      str8_list_pushf(scratch.arena, &line, \"%S\",    name                    );\n      \n      String8 l = str8_list_join(scratch.arena, &line, &(StringJoin){.sep = str8_lit(\" \")});\n      rd_printf(\"%S\", l);\n      \n      rd_indent();\n      for (U64 k=i+1, c = i+symbol->aux_symbol_count; k <= c; ++k) {\n        void *raw_aux = &symbols.v[k];\n        switch (symbol->storage_class) {\n          case COFF_SymStorageClass_External: {\n            COFF_SymbolFuncDef *func_def = (COFF_SymbolFuncDef*)&symbols.v[k];\n            rd_printf(\"Tag Index %#x, Total Size %#x, Line Numbers %#x, Next Function %#x\", \n                      func_def->tag_index, func_def->total_size, func_def->ptr_to_ln, func_def->ptr_to_next_func);\n          } break;\n          case COFF_SymStorageClass_Function: {\n            COFF_SymbolFunc *func = raw_aux;\n            rd_printf(\"Ordinal Line Number %#x, Next Function %#x\", func->ln, func->ptr_to_next_func);\n          } break;\n          case COFF_SymStorageClass_WeakExternal: {\n            COFF_SymbolWeakExt *weak = raw_aux;\n            String8             type = coff_string_from_weak_ext_type(weak->characteristics);\n            rd_printf(\"Tag Index %#x, Characteristics %S\", weak->tag_index, type);\n          } break;\n          case COFF_SymStorageClass_File: {\n            COFF_SymbolFile *file = raw_aux;\n            String8          name = str8_cstring_capped(file->name, file->name+sizeof(file->name));\n            rd_printf(\"Name %S\", name);\n          } break;\n          case COFF_SymStorageClass_Static: {\n            COFF_SymbolSecDef *sd        = raw_aux;\n            String8            selection = coff_string_from_comdat_select_type(sd->selection);\n            U32 number = sd->number_lo;\n            if (is_big_obj) {\n              number |= (U32)sd->number_hi << 16;\n            }\n            if (number) {\n              rd_printf(\"Length %x, Reloc Count %u, Line Count %u, Checksum %x, Section %x, Selection %S\",\n                        sd->length, sd->number_of_relocations, sd->number_of_ln, sd->check_sum, number, selection);\n            } else {\n              rd_printf(\"Length %x, Reloc Count %u, Line Count %u, Checksum %x\",\n                        sd->length, sd->number_of_relocations, sd->number_of_ln, sd->check_sum);\n            }\n          } break;\n          default: {\n            rd_printf(\"???\");\n          } break;\n        }\n      }\n      \n      i += symbol->aux_symbol_count;\n      rd_unindent();\n    }\n    \n    rd_unindent();\n    rd_newline();\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_big_obj_header(Arena *arena, String8List *out, String8 indent, COFF_BigObjHeader *header)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 time_stamp = coff_string_from_time_stamp(scratch.arena, header->time_stamp);\n  String8 machine    = coff_string_from_machine_type(header->machine);\n  \n  rd_printf(\"# Big Obj\");\n  rd_indent();\n  rd_printf(\"Time Stamp   : %#x (%S)\",  header->time_stamp, time_stamp);\n  rd_printf(\"Machine      : %#x (%S)\",  header->machine, machine      );\n  rd_printf(\"Section Count: %u\",  header->section_count    );\n  rd_printf(\"Symbol Table : %#x\", header->symbol_table_foff);\n  rd_printf(\"Symbol Count : %u\",  header->symbol_count     );\n  rd_unindent();\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_file_header(Arena *arena, String8List *out, String8 indent, COFF_FileHeader *header)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 time_stamp = coff_string_from_time_stamp(scratch.arena, header->time_stamp);\n  String8 machine    = coff_string_from_machine_type(header->machine);\n  String8 flags      = coff_string_from_flags(scratch.arena, header->flags);\n  \n  rd_printf(\"# COFF File Header\");\n  rd_indent();\n  rd_printf(\"Time Stamp          : %#x (%S)\", header->time_stamp, time_stamp                            );\n  rd_printf(\"Machine             : %#x %S\",   header->machine, machine                                  );\n  rd_printf(\"Section Count       : %u\",       header->section_count                                     );\n  rd_printf(\"Symbol Table        : %#x\",      header->symbol_table_foff                                 );\n  rd_printf(\"Symbol Count        : %u\",       header->symbol_count                                      );\n  rd_printf(\"Optional Header Size: %#x (%m)\", header->optional_header_size, header->optional_header_size);\n  rd_printf(\"Flags               : %#x (%S)\", header->flags, flags                                      );\n  rd_unindent();\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_import(Arena *arena, String8List *out, String8 indent, COFF_ParsedArchiveImportHeader *header)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 machine    = coff_string_from_machine_type(header->machine);\n  String8 time_stamp = coff_string_from_time_stamp(scratch.arena, header->time_stamp);\n  \n  rd_printf(\"# Import\");\n  rd_indent();\n  rd_printf(\"Version   : %u\", header->version        );\n  rd_printf(\"Machine   : %S\", machine                );\n  rd_printf(\"Time Stamp: %#x (%S)\", header->time_stamp, time_stamp      );\n  rd_printf(\"Data Size : %#x (%m)\", header->data_size, header->data_size);\n  rd_printf(\"Hint      : %u\", header->hint_or_ordinal);\n  rd_printf(\"Type      : %u\", header->type           );\n  rd_printf(\"Import By : %u\", header->import_by      );\n  rd_printf(\"Function  : %S\", header->func_name      );\n  rd_printf(\"DLL       : %S\", header->dll_name       );\n  rd_unindent();\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_big_obj(Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Option opts)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  COFF_FileHeaderInfo header_info = coff_file_header_info_from_data(raw_data);\n  \n  String8 raw_header        = str8_substr(raw_data, header_info.header_range);\n  String8 raw_section_table = str8_substr(raw_data, header_info.section_table_range);\n  String8 raw_string_table  = str8_substr(raw_data, header_info.string_table_range);\n  \n  COFF_BigObjHeader  *big_obj       = (COFF_BigObjHeader *)raw_header.str;\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_section_table.str;\n  COFF_Symbol32Array  symbol_table  = coff_symbol_array_from_data_32(scratch.arena, raw_data, header_info.symbol_table_range.min, big_obj->symbol_count);\n  \n  if (opts & RD_Option_Headers) {\n    coff_print_big_obj_header(arena, out, indent, big_obj);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Sections) {\n    Rng1U64 sect_headers_range = rng_1u64(sizeof(*big_obj), sizeof(*big_obj) + sizeof(COFF_SectionHeader)*big_obj->section_count);\n    Rng1U64 symbols_range      = rng_1u64(big_obj->symbol_table_foff, big_obj->symbol_table_foff + sizeof(COFF_Symbol32)*big_obj->symbol_count);\n    \n    if (sect_headers_range.max > raw_data.size) {\n      rd_errorf(\"not enough bytes to read big obj section headers\");\n      goto exit;\n    }\n    if (big_obj->symbol_count) {\n      if (symbols_range.max > raw_data.size) {\n        rd_errorf(\"not enough bytes to read big obj symbol table\");\n        goto exit;\n      }\n      if (contains_1u64(symbols_range, sect_headers_range.min) ||\n          contains_1u64(symbols_range, sect_headers_range.max)) {\n        rd_errorf(\"section headers and symbol table ranges overlap\");\n        goto exit;\n      }\n    }\n    \n    coff_print_section_table(arena, out, indent, raw_string_table, symbol_table, big_obj->section_count, section_table);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Relocs) {\n    coff_print_relocs(arena, out, indent, raw_data, raw_string_table, big_obj->machine, big_obj->section_count, section_table, symbol_table);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Symbols) {\n    coff_print_symbol_table(arena, out, indent, raw_data, 1, raw_string_table, symbol_table);\n    rd_newline();\n  }\n  \n  exit:;\n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_obj(Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Option opts)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  COFF_FileHeaderInfo header_info = coff_file_header_info_from_data(raw_data);\n  \n  String8 raw_header        = str8_substr(raw_data, header_info.header_range);\n  String8 raw_section_table = str8_substr(raw_data, header_info.section_table_range);\n  String8 raw_string_table  = str8_substr(raw_data, header_info.string_table_range);\n  \n  COFF_FileHeader    *header        = (COFF_FileHeader *)raw_header.str;\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_section_table.str;\n  COFF_Symbol32Array  symbol_table  = coff_symbol_array_from_data_16(scratch.arena, raw_data, header_info.symbol_table_range.min, header->symbol_count);\n  Arch                arch          = arch_from_coff_machine(header->machine);\n  \n  if (opts & RD_Option_Headers) {\n    coff_print_file_header(arena, out, indent, header);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Sections) {\n    Rng1U64 sect_headers_range = rng_1u64(sizeof(*header), sizeof(*header) + sizeof(COFF_SectionHeader)*header->section_count);\n    Rng1U64 symbols_range      = rng_1u64(header->symbol_table_foff, header->symbol_table_foff + sizeof(COFF_Symbol16)*header->symbol_count);\n    \n    if (sect_headers_range.max > raw_data.size) {\n      rd_errorf(\"not enough bytes to read obj section headers\");\n      goto exit;\n    }\n    if (header->symbol_count) {\n      if (symbols_range.max > raw_data.size) {\n        rd_errorf(\"not enough bytes to read obj symbol table\");\n        goto exit;\n      }\n      if (contains_1u64(symbols_range, sect_headers_range.min) ||\n          contains_1u64(symbols_range, sect_headers_range.max)) {\n        rd_errorf(\"section headers and symbol table ranges overlap\");\n        goto exit;\n      }\n    }\n    \n    coff_print_section_table(arena, out, indent, raw_string_table, symbol_table, header->section_count, section_table);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Relocs) {\n    coff_print_relocs(arena, out, indent, raw_data, raw_string_table, header->machine, header->section_count, section_table, symbol_table);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Symbols) {\n    coff_print_symbol_table(arena, out, indent, raw_data, 0, raw_string_table, symbol_table);\n    rd_newline();\n  }\n  \n  RD_MarkerArray *section_markers = 0;\n  if (opts & (RD_Option_Disasm|RD_Option_Rawdata)) {\n    section_markers = rd_section_markers_from_coff_symbol_table(scratch.arena, raw_string_table, header->section_count, symbol_table);\n  }\n  \n  if (opts & RD_Option_Rawdata) {\n    coff_raw_data_sections(arena, out, indent, raw_data, 1, section_markers, header->section_count, section_table);\n  }\n  \n  if (opts & RD_Option_Disasm) {\n    coff_disasm_sections(arena, out, indent, raw_data, header->machine, 0, 1, section_markers, header->section_count, section_table);\n    rd_newline();\n  }\n  \n  if (opts & RD_Option_Codeview) {\n    cv_format_debug_sections(arena, out, indent, raw_data, raw_string_table, header->section_count, section_table);\n  }\n  \n  if (opts & RD_Option_Dwarf) {\n    DW_Input dwarf_input = dw_input_from_coff_section_table(scratch.arena, raw_data, raw_string_table, header->section_count, section_table);\n    dw_format(arena, out, indent, opts, &dwarf_input, arch, ExecutableImageKind_CoffPe);\n  }\n  \n  exit:;\n  scratch_end(scratch);\n}\n\ninternal void\ncoff_print_archive(Arena *arena, String8List *out, String8 indent, String8 raw_archive, RD_Option opts)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  COFF_ArchiveParse archive_parse = coff_archive_parse_from_data(raw_archive);\n  \n  if (archive_parse.error.size) {\n    rd_errorf(\"%S\", archive_parse.error);\n    return;\n  }\n  \n  COFF_ArchiveFirstMember first_member = archive_parse.first_member;\n  {\n    rd_printf(\"# First Header\");\n    rd_indent();\n    \n    rd_printf(\"Symbol Count     : %u\",         first_member.symbol_count);\n    rd_printf(\"String Table Size: %#llx (%M)\", first_member.string_table.size, first_member.string_table.size);\n    \n    rd_printf(\"Members:\");\n    rd_indent();\n    \n    String8List string_table = str8_split_by_string_chars(scratch.arena, first_member.string_table, str8_lit(\"\\0\"), 0);\n    \n    if (string_table.node_count == first_member.member_offset_count) {\n      String8Node *string_n = string_table.first;\n      \n      for (U64 i = 0; i < string_table.node_count; ++i, string_n = string_n->next) {\n        U32 offset = from_be_u32(first_member.member_offsets[i]);\n        rd_printf(\"[%4u] %#08x %S\", i, offset, string_n->string);\n      }\n    } else {\n      rd_errorf(\"Member offset count (%llu) doesn't match string table count (%llu)\", first_member.member_offset_count);\n    }\n    \n    rd_unindent();\n    rd_unindent();\n    rd_newline();\n  }\n  \n  if (archive_parse.has_second_header) {\n    COFF_ArchiveSecondMember second_member = archive_parse.second_member;\n    \n    rd_printf(\"# Second Header\");\n    rd_indent();\n    \n    rd_printf(\"Member Count     : %u\",         second_member.member_count);\n    rd_printf(\"Symbol Count     : %u\",         second_member.symbol_count);\n    rd_printf(\"String Table Size: %#llx (%M)\", second_member.string_table.size, second_member.string_table.size);\n    \n    String8List string_table = str8_split_by_string_chars(scratch.arena, second_member.string_table, str8_lit(\"\\0\"), 0);\n    \n    rd_printf(\"Members:\");\n    rd_indent();\n    if (second_member.symbol_index_count == second_member.symbol_count) {\n      String8Node *string_n = string_table.first;\n      for (U64 i = 0; i < second_member.symbol_count; ++i, string_n = string_n->next) {\n        U16 symbol_number = second_member.symbol_indices[i];\n        if (symbol_number > 0 && symbol_number <= second_member.member_offset_count) {\n          U16 symbol_idx    = symbol_number - 1;\n          U32 member_offset = second_member.member_offsets[i];\n          rd_printf(\"[%4u] %#08x %S\", i, member_offset, string_n->string);\n        } else {\n          rd_errorf(\"[%4u] Out of bounds symbol number %u\", i, symbol_number);\n          break;\n        }\n      }\n    } else {\n      rd_errorf(\"Symbol index count %u doesn't match symbol count %u\",\n                second_member.symbol_index_count, second_member.symbol_count);\n    }\n    rd_unindent();\n    \n    rd_unindent();\n    rd_newline();\n  }\n  \n  if (archive_parse.has_long_names && opts & RD_Option_LongNames) {\n    rd_printf(\"# Long Names\");\n    rd_indent();\n    \n    String8List long_names = str8_split_by_string_chars(scratch.arena, archive_parse.long_names, str8_lit(\"\\0\"), 0);\n    U64 name_idx = 0;\n    for (String8Node *name_n = long_names.first; name_n != 0; name_n = name_n->next, ++name_idx) {\n      U64 offset = (U64)(name_n->string.str - archive_parse.long_names.str);\n      rd_printf(\"[%-4u] %#08x %S\", name_idx, offset, name_n->string);\n    }\n    \n    rd_unindent();\n    rd_newline();\n  }\n  \n  U64  member_offset_count = 0;\n  U32 *member_offsets      = 0;\n  if (archive_parse.has_second_header) {\n    member_offset_count = archive_parse.second_member.member_offset_count;\n    member_offsets      = archive_parse.second_member.member_offsets;\n  } else {\n    HashTable *ht = hash_table_init(scratch.arena, 0x1000);\n    for (U64 i = 0; i < archive_parse.first_member.member_offset_count; ++i) {\n      U32 member_offset = from_be_u32(archive_parse.first_member.member_offsets[i]);\n      if (!hash_table_search_u32(ht, member_offset)) {\n        hash_table_push_u32_raw(scratch.arena, ht, member_offset, 0);\n      }\n    }\n    member_offset_count = ht->count;\n    member_offsets      = keys_from_hash_table_u32(scratch.arena, ht);\n    radsort(member_offsets, member_offset_count, u32_is_before);\n  }\n  \n  rd_printf(\"# Members\");\n  rd_indent();\n  \n  for (U64 i = 0; i < member_offset_count; ++i) {\n    U64                next_member_offset = i+1 < member_offset_count ? member_offsets[i+1] : raw_archive.size;\n    U64                member_offset      = member_offsets[i];\n    String8            raw_member         = str8_substr(raw_archive, rng_1u64(member_offset, next_member_offset));\n    COFF_ArchiveMember member             = coff_archive_member_from_data(raw_member);\n    COFF_DataType      member_type        = coff_data_type_from_data(member.data);\n    \n    rd_printf(\"Member @ %#llx\", member_offset);\n    rd_indent();\n    \n    if (opts & RD_Option_Headers) {\n      coff_print_archive_member_header(arena, out, indent, member.header, archive_parse.long_names);\n      rd_newline();\n    }\n    \n    switch (member_type) {\n      case COFF_DataType_Obj: {\n        coff_print_obj(arena, out, indent, member.data, opts);\n      } break;\n      case COFF_DataType_BigObj: {\n        coff_print_big_obj(arena, out, indent, member.data, opts);\n      } break;\n      case COFF_DataType_Import: {\n        if (opts & RD_Option_Headers) {\n          COFF_ParsedArchiveImportHeader header = {0};\n          U64 parse_size = coff_parse_import(member.data, 0, &header);\n          if (parse_size) {\n            coff_print_import(arena, out, indent, &header);\n          } else {\n            rd_errorf(\"not enough bytes to parse import header\");\n          }\n        }\n      } break;\n      case COFF_DataType_Null: {\n        rd_errorf(\"unknown member format\", member_offset);\n      } break;\n    }\n    \n    rd_unindent();\n    rd_newline();\n  }\n  \n  rd_unindent();\n  \n  scratch_end(scratch);\n}\n#endif\n"
  },
  {
    "path": "src/coff/coff_dump.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef COFF_DUMP_H\n#define COFF_DUMP_H\n\n#if 0\ninternal void coff_print_archive_member_header(Arena *arena, String8List *out, String8 indent, COFF_ParsedArchiveMemberHeader header, String8 long_names);\ninternal void coff_print_section_table        (Arena *arena, String8List *out, String8 indent, String8 string_table, COFF_Symbol32Array symbols, U64 sect_count, COFF_SectionHeader *sect_headers);\ninternal void coff_disasm_sections            (Arena *arena, String8List *out, String8 indent, String8 raw_data, COFF_MachineType machine, U64 image_base, B32 is_obj, RD_MarkerArray *section_markers, U64 section_count, COFF_SectionHeader *sections);\ninternal void coff_raw_data_sections          (Arena *arena, String8List *out, String8 indent, String8 raw_data, B32 is_obj, RD_MarkerArray *section_markers, U64 section_count, COFF_SectionHeader *sections);\ninternal void coff_print_relocs               (Arena *arena, String8List *out, String8 indent, String8 raw_data, String8 string_table, COFF_MachineType machine, U64 sect_count, COFF_SectionHeader *sect_headers, COFF_Symbol32Array symbols);\ninternal void coff_print_symbol_table         (Arena *arena, String8List *out, String8 indent, String8 raw_data, B32 is_big_obj, String8 string_table, COFF_Symbol32Array symbols);\ninternal void coff_print_big_obj_header       (Arena *arena, String8List *out, String8 indent, COFF_BigObjHeader *header);\ninternal void coff_print_file_header          (Arena *arena, String8List *out, String8 indent, COFF_FileHeader *header);\ninternal void coff_print_import               (Arena *arena, String8List *out, String8 indent, COFF_ParsedArchiveImportHeader *header);\ninternal void coff_print_big_obj              (Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Option opts);\ninternal void coff_print_obj                  (Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Option opts);\ninternal void coff_print_archive              (Arena *arena, String8List *out, String8 indent, String8 raw_archive, RD_Option opts);\n#endif\n\n#endif // COFF_DUMP_H\n"
  },
  {
    "path": "src/coff/coff_enum.c",
    "content": "\n"
  },
  {
    "path": "src/coff/coff_inc.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#include \"coff/coff.c\"\n#include \"coff/coff_parse.c\"\n#include \"coff/coff_dump.c\"\n"
  },
  {
    "path": "src/coff/coff_inc.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef COFF_INC_H\n#define COFF_INC_H\n\n#include \"coff/coff.h\"\n#include \"coff/coff_parse.h\"\n#include \"coff/coff_dump.h\"\n\n#endif // COFF_INC_H\n"
  },
  {
    "path": "src/coff/coff_lib_writer.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal COFF_LibWriterSymbolNode *\ncoff_lib_writer_symbol_list_push(Arena *arena, COFF_LibWriterSymbolList *list, COFF_LibWriterSymbol symbol)\n{\n  COFF_LibWriterSymbolNode *node = push_array_no_zero(arena, COFF_LibWriterSymbolNode, 1);\n  node->next                     = 0;\n  node->data                     = symbol;\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n  return node;\n}\n\ninternal COFF_LibWriterMemberNode *\ncoff_lib_writer_member_list_push(Arena *arena, COFF_LibWriterMemberList *list, COFF_LibWriterMember member)\n{\n  COFF_LibWriterMemberNode *node = push_array_no_zero(arena, COFF_LibWriterMemberNode, 1);\n  node->next                     = 0;\n  node->data                     = member;\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n  return node;\n}\n\ninternal COFF_LibWriterSymbol *\ncoff_lib_writer_symbol_array_from_list(Arena *arena, COFF_LibWriterSymbolList list)\n{\n  COFF_LibWriterSymbol *arr = push_array_no_zero(arena, COFF_LibWriterSymbol, list.count + 2);\n  COFF_LibWriterSymbol *ptr = arr + 1;\n  for (COFF_LibWriterSymbolNode *i = list.first; i != 0; i = i->next, ptr += 1) {\n    *ptr = i->data;\n  }\n  MemoryZeroStruct(&arr[0]);\n  MemoryZeroStruct(&arr[list.count+1]);\n  return arr;\n}\n\ninternal COFF_LibWriterMember *\ncoff_lib_writer_member_array_from_list(Arena *arena, COFF_LibWriterMemberList list)\n{\n  COFF_LibWriterMember *arr = push_array_no_zero(arena, COFF_LibWriterMember, list.count);\n  COFF_LibWriterMember *ptr = arr;\n  for (COFF_LibWriterMemberNode *i = list.first; i != 0; i = i->next, ptr += 1) {\n    ptr->name = push_str8_copy(arena, i->data.name);\n    ptr->data = push_str8_copy(arena, i->data.data); \n  }\n  return arr;\n}\n\ninternal int\ncoff_lib_writer_symbol_name_compar(const void *raw_a, const void *raw_b)\n{\n  const COFF_LibWriterSymbol *sa = raw_a;\n  const COFF_LibWriterSymbol *sb = raw_b;\n  return str8_compar_case_sensitive(&sa->name, &sb->name);\n}\n\ninternal int\ncoff_lib_writer_symbol_is_before_name(void *raw_a, void *raw_b)\n{\n  return coff_lib_writer_symbol_name_compar(raw_a, raw_b) < 0;\n}\n\ninternal int\ncoff_lib_writer_symbol_is_before_member_idx(void *raw_a, void *raw_b)\n{\n  COFF_LibWriterSymbol *a = raw_a, *b = raw_b;\n  return a->member_idx < b->member_idx;\n}\n\ninternal void\ncoff_lib_writer_symbol_array_sort_on_name(COFF_LibWriterSymbol *arr, U64 count)\n{\n  Assert(count >= 2);\n  radsort(arr + 1, count - 2, coff_lib_writer_symbol_is_before_name);\n}\n\ninternal void\ncoff_lib_writer_symbol_array_sort_on_member_idx(COFF_LibWriterSymbol *arr, U64 count)\n{\n  Assert(count >= 2);\n  radsort(arr + 1, count - 2, coff_lib_writer_symbol_is_before_member_idx);\n}\n\ninternal COFF_LibWriter *\ncoff_lib_writer_alloc(void)\n{\n  Arena *arena = arena_alloc();\n  COFF_LibWriter *writer = push_array(arena, COFF_LibWriter, 1);\n  writer->arena = arena;\n  return writer;\n}\n\ninternal void\ncoff_lib_writer_release(COFF_LibWriter **writer_ptr)\n{\n  arena_release((*writer_ptr)->arena);\n  *writer_ptr = 0;\n}\n\ninternal U64\ncoff_lib_writer_push_obj(COFF_LibWriter *writer, String8 obj_path, String8 obj_data)\n{\n  U64 member_idx = writer->member_list.count;\n  \n  // push obj member\n  COFF_LibWriterMember member = { .name = obj_path, .data = obj_data };\n  COFF_LibWriterMemberNode *member_node = coff_lib_writer_member_list_push(writer->arena, &writer->member_list, member);\n  \n  // push external symbols\n  COFF_FileHeaderInfo obj_header   = coff_file_header_info_from_data(obj_data);\n  String8             string_table = str8_substr(obj_data, obj_header.string_table_range);\n  String8             symbol_table = str8_substr(obj_data, obj_header.symbol_table_range);\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj_header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = coff_parse_symbol(obj_header, string_table, symbol_table, symbol_idx);\n    COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol);\n    if (interp == COFF_SymbolValueInterp_Regular || interp == COFF_SymbolValueInterp_Common || interp == COFF_SymbolValueInterp_Abs) {\n      if (symbol.storage_class == COFF_SymStorageClass_External) {\n        COFF_LibWriterSymbol lib_symbol = { .name = symbol.name, .member_idx = member_idx };\n        coff_lib_writer_symbol_list_push(writer->arena, &writer->symbol_list, lib_symbol);\n      }\n    }\n  }\n\n  return member_idx;\n}\n\ninternal void\ncoff_lib_writer_push_import(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportByType import_by, String8 name, U16 hint_or_ordinal, COFF_ImportType import_type)\n{\n  U64 member_idx = lib_writer->member_list.count;\n\n  String8 member_data = coff_make_import_header(lib_writer->arena, machine, time_stamp, dll_name, import_by, name, hint_or_ordinal, import_type);\n  COFF_LibWriterMember member = { .name = dll_name, .data = member_data };\n  COFF_LibWriterMemberNode *member_node = coff_lib_writer_member_list_push(lib_writer->arena, &lib_writer->member_list, member);\n  \n  if (name.size) {\n    switch (import_type) {\n    case COFF_ImportHeader_Code: {\n      COFF_LibWriterSymbol thunk_symbol = {0};\n      thunk_symbol.name                 = push_str8_copy(lib_writer->arena, name);\n      thunk_symbol.member_idx           = member_idx;\n      coff_lib_writer_symbol_list_push(lib_writer->arena, &lib_writer->symbol_list, thunk_symbol);\n\n      COFF_LibWriterSymbol imp_symbol = {0};\n      imp_symbol.name                 = push_str8f(lib_writer->arena, \"__imp_%S\", name);\n      imp_symbol.member_idx           = member_idx;\n      coff_lib_writer_symbol_list_push(lib_writer->arena, &lib_writer->symbol_list, imp_symbol);\n    } break;\n    case COFF_ImportHeader_Data: {\n      COFF_LibWriterSymbol imp_symbol = {0};\n      imp_symbol.name                 = push_str8f(lib_writer->arena, \"__imp_%S\", name);\n      imp_symbol.member_idx           = member_idx;\n      coff_lib_writer_symbol_list_push(lib_writer->arena, &lib_writer->symbol_list, imp_symbol);\n    } break;\n    case COFF_ImportHeader_Const: { NotImplemented; } break;\n    default: { InvalidPath; } break;\n    }\n  }\n}\n\ninternal String8\ncoff_lib_writer_serialize(Arena *arena, COFF_LibWriter *lib_writer, COFF_TimeStamp time_stamp, U16 mode, B32 emit_second_member)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  // member lists -> arrays\n  U64                   member_count = lib_writer->member_list.count;\n  COFF_LibWriterMember *member_array = coff_lib_writer_member_array_from_list(scratch.arena, lib_writer->member_list);\n\n  // serialize members\n  U64         *member_offsets      = push_array_no_zero(scratch.arena, U64, member_count);\n  String8List  long_names_list     = {0};\n  String8List  member_data_list    = {0};\n  {\n    HashTable *name_ht = hash_table_init(scratch.arena, 1024);\n    for EachIndex(member_idx, member_count) {\n      COFF_LibWriterMember *member = &member_array[member_idx];\n\n      // make member name\n      String8 name;\n      U64 name_with_slash_size = member->name.size + 1;\n      if (name_with_slash_size > COFF_Archive_MaxShortNameSize) {\n        // have we seen this member name before?\n        if (!hash_table_search_string_string(name_ht, member->name, &name)) {\n          name = push_str8f(scratch.arena, \"/%u\", long_names_list.total_size);\n          str8_list_pushf(scratch.arena, &long_names_list, \"%S/\\n\", member->name);\n          hash_table_push_string_string(scratch.arena, name_ht, member->name, name);\n        }\n      } else {\n        name = push_str8f(scratch.arena, \"%S/\", member->name);\n      }\n\n      member_offsets[member_idx] = member_data_list.total_size;\n\n      String8 member_data   = member->data;\n      String8 member_header = coff_make_lib_member_header(scratch.arena, name, time_stamp, 0, 0, mode, member_data.size);\n\n      str8_list_push(scratch.arena, &member_data_list, member_header);\n      str8_list_push(scratch.arena, &member_data_list, member_data);\n      {\n        U64 pad_size = AlignPadPow2(member_data_list.total_size, COFF_Archive_MemberAlign);\n        U8 *pad      = push_array(scratch.arena, U8, pad_size);\n        str8_list_push(scratch.arena, &member_data_list, str8(pad, pad_size));\n      }\n    }\n  }\n  \n  // write long names member\n  if (long_names_list.total_size) {\n    String8 header        = coff_make_lib_member_header(scratch.arena, str8_lit(\"//\"), time_stamp, 0, 0, mode, long_names_list.total_size);\n    String8 data          = str8_list_join(scratch.arena, &long_names_list, 0);\n    U64     member_offset = member_data_list.total_size + data.size + header.size;\n    {\n      U64 pad_size = AlignPadPow2(member_offset, COFF_Archive_MemberAlign);\n      U8 *pad      = push_array(scratch.arena, U8, pad_size);\n      str8_list_push_front(scratch.arena, &member_data_list, str8(pad, pad_size));\n    }\n    str8_list_push_front(scratch.arena, &member_data_list, data);\n    str8_list_push_front(scratch.arena, &member_data_list, header);\n  }\n  \n  // compute size for symbol string table\n  U32 name_buffer_size = 0;\n  for (COFF_LibWriterSymbolNode *node = lib_writer->symbol_list.first; node != 0; node = node->next) {\n    name_buffer_size += node->data.name.size;\n    name_buffer_size += 1; // null\n  }\n   \n  // compute members base offset\n  U64 members_base_offset;\n  {\n    U64 sizeof_first_header  = sizeof(COFF_ArchiveMemberHeader) + sizeof(U32) + sizeof(U32) * lib_writer->symbol_list.count + name_buffer_size;\n    U64 sizeof_second_header = sizeof(COFF_ArchiveMemberHeader) + sizeof(U32) + sizeof(U32) * member_count + sizeof(U32) + sizeof(U16) * lib_writer->symbol_list.count + name_buffer_size;\n    U64 sizeof_long_names    = sizeof(COFF_ArchiveMemberHeader) + long_names_list.total_size;\n    \n    sizeof_first_header  = AlignPow2(sizeof_first_header,  COFF_Archive_MemberAlign);\n    sizeof_second_header = AlignPow2(sizeof_second_header, COFF_Archive_MemberAlign);\n    sizeof_long_names    = AlignPow2(sizeof_long_names,    COFF_Archive_MemberAlign);\n\n    members_base_offset = sizeof(g_coff_archive_sig);\n    members_base_offset += sizeof_first_header;\n    if (emit_second_member) {\n      members_base_offset += sizeof_second_header;\n    }\n    if (long_names_list.total_size) {\n      members_base_offset += sizeof_long_names;\n    }\n  }\n  \n  // write second linker member\n  if (emit_second_member) {\n    U64                   symbols_count;\n    COFF_LibWriterSymbol *symbols;\n    {\n      U64                   symbols_count_with_null = lib_writer->symbol_list.count + 2;\n      COFF_LibWriterSymbol *symbols_with_null       = coff_lib_writer_symbol_array_from_list(scratch.arena, lib_writer->symbol_list);\n      coff_lib_writer_symbol_array_sort_on_name(symbols_with_null, symbols_count_with_null);\n\n      symbols_count = symbols_count_with_null - 2;\n      symbols       = symbols_with_null + 1;\n    }\n\n    // write symbol name buffer\n    U8 *name_buffer = push_array_no_zero(scratch.arena, U8, name_buffer_size);\n    {\n      U64 name_cursor = 0;\n      for EachIndex(symbol_idx, symbols_count) {\n        COFF_LibWriterSymbol *symbol = &symbols[symbol_idx];\n        MemoryCopy(name_buffer + name_cursor, symbol->name.str, symbol->name.size);\n        name_buffer[name_cursor + symbol->name.size] = '\\0';\n        name_cursor += symbol->name.size + 1;\n      }\n    }\n\n    U32 member_count32 = safe_cast_u32(member_count);\n    U32 symbol_count32 = safe_cast_u32(symbols_count);\n\n    U32 *member_off32_arr = push_array_no_zero(scratch.arena, U32, member_count);\n    U16 *member_idx16_arr = push_array_no_zero(scratch.arena, U16, symbols_count);\n\n    // write member offset array\n    for EachIndex(member_idx, member_count) {\n      U64 member_offset = members_base_offset + member_offsets[member_idx];\n      U32 member_off32 = safe_cast_u32(member_offset);\n      member_off32_arr[member_idx] = member_off32; \n    }\n\n    // write member offset indices for each symbol\n    for EachIndex(symbol_idx, symbols_count) {\n      // member offset indices are 1-based\n      U64 member_idx = symbols[symbol_idx].member_idx + 1;\n      U16 member_idx16 = safe_cast_u16(member_idx);\n      member_idx16_arr[symbol_idx] = member_idx16;\n    }\n\n    // layout second member data\n    String8List second_member_data_list = {0};\n    str8_list_push(scratch.arena, &second_member_data_list, str8_struct(&member_count32));\n    str8_list_push(scratch.arena, &second_member_data_list, str8_array(member_off32_arr, member_count));\n    str8_list_push(scratch.arena, &second_member_data_list, str8_struct(&symbol_count32));\n    str8_list_push(scratch.arena, &second_member_data_list, str8_array(member_idx16_arr, symbols_count));\n    str8_list_push(scratch.arena, &second_member_data_list, str8(name_buffer, name_buffer_size));\n\n    String8 member_data   = str8_list_join(scratch.arena, &second_member_data_list, 0);\n    String8 member_header = coff_make_lib_member_header(scratch.arena, str8_lit(\"/\"), time_stamp, 0, 0, mode, member_data.size);\n    \n    U64 member_offset = member_data_list.total_size + member_data.size + member_header.size;\n    {\n      U64 pad_size = AlignPadPow2(member_offset, COFF_Archive_MemberAlign);\n      U8 *pad      = push_array(scratch.arena, U8, pad_size);\n      str8_list_push_front(scratch.arena, &member_data_list, str8(pad, pad_size));\n    }\n    str8_list_push_front(scratch.arena, &member_data_list, member_data);\n    str8_list_push_front(scratch.arena, &member_data_list, member_header);\n  }\n  \n  // write first linker member (obsolete, but kept for compatability reasons)\n  {\n    U64                   symbols_count;\n    COFF_LibWriterSymbol *symbols;\n    {\n      U64                   symbols_count_with_null = lib_writer->symbol_list.count + 2;\n      COFF_LibWriterSymbol *symbols_with_null       = coff_lib_writer_symbol_array_from_list(scratch.arena, lib_writer->symbol_list);\n      coff_lib_writer_symbol_array_sort_on_member_idx(symbols_with_null, symbols_count_with_null);\n\n      symbols_count = symbols_count_with_null - 2;\n      symbols       = symbols_with_null + 1;\n    }\n\n    // write symbol name buffer\n    U8 *name_buffer = push_array_no_zero(scratch.arena, U8, name_buffer_size);\n    {\n      U64 name_cursor = 0;\n      for EachIndex(symbol_idx, symbols_count) {\n        COFF_LibWriterSymbol *symbol = &symbols[symbol_idx];\n        MemoryCopy(name_buffer + name_cursor, symbol->name.str, symbol->name.size);\n        name_buffer[name_cursor + symbol->name.size] = '\\0';\n        name_cursor += symbol->name.size + 1;\n      }\n    }\n\n    U32  symbol_count_be  = from_be_u32(symbols_count);\n    U32 *member_off32_arr = push_array_no_zero(scratch.arena, U32, symbols_count);\n\n    for EachIndex(symbol_idx, symbols_count) {\n      COFF_LibWriterSymbol *symbol = &symbols[symbol_idx];\n\n      // write big endian member offset\n      U64 member_offset = members_base_offset + member_offsets[symbol->member_idx];\n      U32 member_off32 = from_be_u32(safe_cast_u32(member_offset));\n      member_off32_arr[symbol_idx] = member_off32;\n    }\n\n    // layout first member data\n    String8List first_member_data_list = {0};\n    str8_list_push(scratch.arena, &first_member_data_list, str8_struct(&symbol_count_be));\n    str8_list_push(scratch.arena, &first_member_data_list, str8_array(member_off32_arr, symbols_count));\n    str8_list_push(scratch.arena, &first_member_data_list, str8(name_buffer, name_buffer_size));\n\n    String8 member_data   = str8_list_join(scratch.arena, &first_member_data_list, 0);\n    String8 member_header = coff_make_lib_member_header(scratch.arena, str8_lit(\"/\"), time_stamp, 0, 0, mode, member_data.size);\n    \n    U64 member_offset = sizeof(g_coff_archive_sig) + member_header.size + member_data.size;\n    {\n      U64 pad_size = AlignPadPow2(member_offset, COFF_Archive_MemberAlign);\n      U8 *pad      = push_array(scratch.arena, U8, pad_size);\n      str8_list_push_front(scratch.arena, &member_data_list, str8(pad, pad_size));\n    }\n    str8_list_push_front(scratch.arena, &member_data_list, member_data);\n    str8_list_push_front(scratch.arena, &member_data_list, member_header);\n  }\n  \n  // archive signature\n  str8_list_push_front(scratch.arena, &member_data_list, str8_struct(&g_coff_archive_sig));\n\n  String8 raw_lib = str8_list_join(arena, &member_data_list, 0);\n  \n  scratch_end(scratch);\n  return raw_lib; \n}\n\n"
  },
  {
    "path": "src/coff/coff_lib_writer.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef COFF_LIB_WRITER_H\n#define COFF_LIB_WRITER_H\n\ntypedef struct COFF_LibWriterMember\n{\n  String8 name;\n  String8 data;\n} COFF_LibWriterMember;\n\ntypedef struct COFF_LibWriterMemberNode\n{\n  COFF_LibWriterMember             data;\n  struct COFF_LibWriterMemberNode *next;\n} COFF_LibWriterMemberNode;\n\ntypedef struct COFF_LibWriterMemberList\n{\n  U64                       count;\n  COFF_LibWriterMemberNode *first;\n  COFF_LibWriterMemberNode *last;\n} COFF_LibWriterMemberList;\n\ntypedef struct COFF_LibWriterSymbol\n{\n  String8 name;\n  U64     member_idx;\n} COFF_LibWriterSymbol;\n\ntypedef struct COFF_LibWriterSymbolNode\n{\n  COFF_LibWriterSymbol             data;\n  struct COFF_LibWriterSymbolNode *next;\n} COFF_LibWriterSymbolNode;\n\ntypedef struct COFF_LibWriterSymbolList\n{\n  U64                       count;\n  COFF_LibWriterSymbolNode *first;\n  COFF_LibWriterSymbolNode *last;\n} COFF_LibWriterSymbolList;\n\ntypedef struct COFF_LibWriter\n{\n  Arena                   *arena;\n  COFF_LibWriterMemberList member_list;\n  COFF_LibWriterSymbolList symbol_list;\n} COFF_LibWriter;\n\n////////////////////////////////\n\ninternal COFF_LibWriterSymbolNode * coff_lib_writer_symbol_list_push(Arena *arena, COFF_LibWriterSymbolList *list, COFF_LibWriterSymbol symbol);\ninternal COFF_LibWriterMemberNode * coff_lib_writer_member_list_push(Arena *arena, COFF_LibWriterMemberList *list, COFF_LibWriterMember member);\n\ninternal COFF_LibWriterSymbol * coff_lib_writer_symbol_array_from_list(Arena *arena, COFF_LibWriterSymbolList list);\ninternal COFF_LibWriterMember * coff_lib_writer_member_array_from_list(Arena *arena, COFF_LibWriterMemberList list);\n\ninternal void coff_lib_writer_symbol_array_sort_on_name(COFF_LibWriterSymbol *arr, U64 count);\ninternal void coff_lib_writer_symbol_array_sort_on_member_idx(COFF_LibWriterSymbol *arr, U64 count);\n\ninternal COFF_LibWriter * coff_lib_writer_alloc(void);\ninternal void             coff_lib_writer_release(COFF_LibWriter **writer_ptr);\ninternal U64              coff_lib_writer_push_obj(COFF_LibWriter *writer, String8 obj_path, String8 obj_data);\ninternal void             coff_lib_writer_push_import(COFF_LibWriter *lib_writer, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, COFF_ImportByType import_by, String8 name, U16 hint_or_ordinal, COFF_ImportType import_type);\ninternal String8          coff_lib_writer_serialize(Arena *arena, COFF_LibWriter *lib_writer, COFF_TimeStamp time_stamp, U16 mode, B32 emit_second_member);\n\n#endif // COFF_LIB_WRITER_H\n\n"
  },
  {
    "path": "src/coff/coff_obj_writer.c",
    "content": "internal COFF_ObjWriter*\ncoff_obj_writer_alloc(COFF_TimeStamp time_stamp, COFF_MachineType machine)\n{\n  Arena *arena = arena_alloc();\n  COFF_ObjWriter *obj_writer = push_array(arena, COFF_ObjWriter, 1);\n  obj_writer->arena          = arena;\n  obj_writer->time_stamp     = time_stamp;\n  obj_writer->machine   = machine;\n  return obj_writer;\n}\n\ninternal void\ncoff_obj_writer_release(COFF_ObjWriter **obj_writer)\n{\n  arena_release((*obj_writer)->arena);\n  *obj_writer = 0;\n}\n\ninternal String8\ncoff_obj_writer_serialize(Arena *arena, COFF_ObjWriter *obj_writer)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8List srl = {0};\n  \n  String8List string_table = {0};\n  U32 *string_table_size = push_array(scratch.arena, U32, 1);\n  *string_table_size = sizeof(*string_table_size);\n  str8_list_push(scratch.arena, &string_table, str8_struct(string_table_size));\n  \n  //\n  // assing section numbers\n  //\n  U64               obj_sections_count;\n  COFF_ObjSection **obj_sections;\n  {\n    obj_sections_count = obj_writer->sect_count;\n    obj_sections       = push_array(scratch.arena, COFF_ObjSection *, obj_writer->sect_count);\n    U64 sect_idx = 0;\n    for (COFF_ObjSectionNode *sect_n = obj_writer->sect_first; sect_n != 0; sect_n = sect_n->next, sect_idx += 1) {\n      COFF_ObjSection *sect = &sect_n->v;\n      sect->section_number = sect_idx+1;\n      obj_sections[sect_idx] = sect;\n      \n    }\n  }\n  AssertAlways(obj_sections_count <= max_U16);\n  \n  //\n  // serialize symbol table\n  //\n  String8List symbol_table = {0};\n  {\n    {\n      U64 symbol_idx = 0;\n      for (COFF_ObjSymbolNode *symbol_n = obj_writer->symbol_first; symbol_n != 0; symbol_n = symbol_n->next) {\n        COFF_ObjSymbol *s = &symbol_n->v;\n        \n        // assign symbol index\n        s->idx = symbol_idx++;\n        symbol_idx += s->aux_symbols.node_count;\n      }\n    }\n    \n    U64 symbol_idx = 0;\n    for (COFF_ObjSymbolNode *symbol_n = obj_writer->symbol_first; symbol_n != 0; symbol_n = symbol_n->next) {\n      COFF_ObjSymbol *s = &symbol_n->v;\n      \n      COFF_Symbol16 *d = push_array(scratch.arena, COFF_Symbol16, 1);\n      str8_list_push(scratch.arena, &symbol_table, str8_struct(d));\n      \n      COFF_SymbolName name = {0};\n      // long name\n      if (s->name.size > sizeof(name.short_name)) {\n        U64 string_table_offset = string_table.total_size;\n        str8_list_push(scratch.arena, &string_table, s->name);\n        str8_list_push(scratch.arena, &string_table, str8_lit(\"\\0\"));\n        \n        name.long_name.zeroes = 0;\n        name.long_name.string_table_offset = safe_cast_u32(string_table_offset);\n      }\n      // short name\n      else {\n        MemoryCopyStr8(name.short_name, s->name);\n        MemoryZeroTyped(name.short_name + s->name.size, sizeof(name.short_name) - s->name.size);\n      }\n      \n      // symbol header\n      AssertAlways(s->aux_symbols.node_count <= max_U8);\n      d->name             = name;\n      d->value            = s->value;\n      switch (s->loc.type) {\n        case COFF_SymbolLocation_Null: break;\n        case COFF_SymbolLocation_Section: d->section_number = safe_cast_u16(s->loc.u.section->section_number); break;\n        case COFF_SymbolLocation_Abs:     d->section_number = COFF_Symbol_AbsSection16;         break;\n        case COFF_SymbolLocation_Undef:   d->section_number = COFF_Symbol_UndefinedSection;     break;\n        case COFF_SymbolLocation_Common:  d->section_number = COFF_Symbol_UndefinedSection;     break;\n      }\n      d->type             = s->type;\n      d->storage_class    = s->storage_class;\n      d->aux_symbol_count = 0;\n      \n      U64 start_symbol_idx = symbol_idx;\n      if (s->storage_class == COFF_SymStorageClass_WeakExternal) {\n        if (s->aux_symbols.node_count > 0) {\n          COFF_ObjSymbolWeak *s_weak = (COFF_ObjSymbolWeak *)s->aux_symbols.first->string.str;\n          COFF_SymbolWeakExt *d_weak = push_array(scratch.arena, COFF_SymbolWeakExt, 1);\n          d_weak->tag_index       = s_weak->tag ? s_weak->tag->idx : max_U32;\n          d_weak->characteristics = s_weak->characteristics;\n          \n          str8_list_push(scratch.arena, &symbol_table, str8_struct(d_weak));\n          symbol_idx += 1;\n        }\n      } else if (s->storage_class == COFF_SymStorageClass_Static) {\n        if (s->aux_symbols.node_count > 0) {\n          Assert(s->loc.type == COFF_SymbolLocation_Section);\n          COFF_ObjSection *sect = s->loc.u.section;\n          \n          COFF_ObjSymbolSecDef *s_sd = (COFF_ObjSymbolSecDef *)s->aux_symbols.first->string.str;\n          COFF_SymbolSecDef    *d_sd = push_array(scratch.arena, COFF_SymbolSecDef, 1);\n          \n          d_sd->length                = safe_cast_u32(sect->data.total_size);\n          d_sd->number_of_relocations = (U16)sect->reloc_count;\n          d_sd->check_sum             = 0;\n          d_sd->number_lo             = s_sd->selection == COFF_ComdatSelect_Associative ? safe_cast_u16(s_sd->associate->section_number) : 0;\n          d_sd->selection             = s_sd->selection;\n          \n          str8_list_push(scratch.arena, &symbol_table, str8_struct(d_sd));\n          symbol_idx += 1;\n        }\n      }\n      \n      U8 processed_aux_symbol_count = (U8)(symbol_idx - start_symbol_idx);\n      \n      for (U64 aux_idx = processed_aux_symbol_count; aux_idx < s->aux_symbols.node_count; aux_idx += 1) {\n        COFF_Symbol16 *a = push_array(scratch.arena, COFF_Symbol16, 1);\n        str8_list_push(scratch.arena, &symbol_table, str8_struct(a));\n      }\n      \n      d->aux_symbol_count = (U8)s->aux_symbols.node_count;\n    }\n  }\n  \n  //\n  // file header\n  //\n  COFF_FileHeader *file_header      = push_array(scratch.arena, COFF_FileHeader, 1);\n  file_header->machine              = obj_writer->machine;\n  file_header->section_count        = obj_sections_count;\n  file_header->time_stamp           = obj_writer->time_stamp;\n  file_header->symbol_table_foff    = 0;\n  file_header->symbol_count         = safe_cast_u32(symbol_table.node_count);\n  file_header->optional_header_size = 0;\n  file_header->flags                = 0;\n  str8_list_push(scratch.arena, &srl, str8_struct(file_header));\n  \n  //\n  // section table\n  //\n  \n  COFF_SectionHeader *sectab = push_array(scratch.arena, COFF_SectionHeader, obj_sections_count);\n  str8_list_push(scratch.arena, &srl, str8_array(sectab, obj_sections_count));\n  {\n    for (U64 sect_idx = 0; sect_idx < obj_sections_count; sect_idx += 1) {\n      COFF_ObjSection    *s = obj_sections[sect_idx];\n      COFF_SectionHeader *d = &sectab[sect_idx];\n      \n      // section name\n      String8 sect_name = s->name;\n      if (sect_name.size > sizeof(d->name)) {\n        U64 sect_name_off = string_table.total_size;\n        str8_list_push(scratch.arena, &string_table, push_cstr(scratch.arena, sect_name));\n        \n        sect_name = push_str8f(scratch.arena, \"/%u\", sect_name_off);\n        AssertAlways(sect_name.size <= sizeof(d->name));\n      }\n      \n      // alloc zero nodes \n      for (String8Node *data_n = s->data.first; data_n != 0; data_n = data_n->next) {\n        if (data_n->string.str == 0 && data_n->string.size > 0) {\n          data_n->string = str8(push_array(scratch.arena, U8, data_n->string.size), data_n->string.size);\n        }\n      }\n      \n      // section data\n      U64 data_foff = 0;\n      U64 data_size = 0;\n      if (s->data.total_size > 0) {\n        data_foff = srl.total_size;\n        data_size = s->data.total_size;\n        str8_list_concat_in_place(&srl, &s->data);\n      }\n      \n      // section relocs\n      U64 relocs_foff = 0;\n      if (s->reloc_count) {\n        AssertAlways(s->reloc_count <= max_U16);\n        COFF_Reloc *relocs    = push_array(scratch.arena, COFF_Reloc, s->reloc_count);\n        U64         reloc_idx = 0;\n        for (COFF_ObjRelocNode *reloc_n = s->reloc_first; reloc_n != 0; reloc_n = reloc_n->next, reloc_idx += 1) {\n          COFF_ObjReloc *rs = &reloc_n->v;\n          COFF_Reloc    *rd = &relocs[reloc_idx];\n          rd->apply_off = rs->apply_off;\n          rd->isymbol   = rs->symbol->idx;\n          rd->type      = rs->type;\n        }\n        relocs_foff = srl.total_size;\n        str8_list_push(scratch.arena, &srl, str8_array(relocs, s->reloc_count));\n      }\n      \n      // section header\n      MemoryCopyStr8(d->name, sect_name);\n      MemoryZeroTyped(d->name + sect_name.size, sizeof(d->name) - sect_name.size);\n      d->vsize       = 0;\n      d->voff        = 0;\n      d->fsize       = data_size;\n      d->foff        = data_foff;\n      d->relocs_foff = relocs_foff;\n      d->lines_foff  = 0;\n      d->reloc_count = safe_cast_u32(s->reloc_count);\n      d->line_count  = 0;\n      d->flags       = s->flags;\n    }\n  }\n  \n  //\n  // symbol table\n  //\n  if (symbol_table.total_size || string_table.total_size > sizeof(*string_table_size)) {\n    file_header->symbol_table_foff = srl.total_size;\n    str8_list_concat_in_place(&srl, &symbol_table);\n  }\n  \n  //\n  // string table\n  //\n  if (string_table.total_size) {\n    *string_table_size = safe_cast_u32(string_table.total_size);\n    str8_list_concat_in_place(&srl, &string_table);\n  }\n  \n  //\n  // join\n  //\n  String8 obj = str8_list_join(arena, &srl, 0);\n  \n  scratch_end(scratch);\n  return obj;\n}\n\ninternal COFF_ObjSection *\ncoff_obj_writer_push_section(COFF_ObjWriter *obj_writer, String8 name, COFF_SectionFlags flags, String8 data)\n{\n  COFF_ObjSectionNode *sect_n = push_array(obj_writer->arena, COFF_ObjSectionNode, 1);\n  SLLQueuePush(obj_writer->sect_first, obj_writer->sect_last, sect_n);\n  obj_writer->sect_count += 1;\n  \n  COFF_ObjSection *sect = &sect_n->v;\n  sect->name            = name;\n  sect->flags           = flags;\n  \n  if (data.size) {\n    str8_list_push(obj_writer->arena, &sect->data, data);\n  }\n  \n  return sect;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymbolLocation loc, COFF_SymbolType type, COFF_SymStorageClass storage_class)\n{\n  COFF_ObjSymbolNode *n = push_array(obj_writer->arena, COFF_ObjSymbolNode, 1);\n  SLLQueuePush(obj_writer->symbol_first, obj_writer->symbol_last, n);\n  obj_writer->symbol_count += 1;\n  \n  COFF_ObjSymbol *s = &n->v;\n  s->name           = name;\n  s->value          = value;\n  s->loc            = loc;\n  s->type           = type;\n  s->storage_class  = storage_class;\n  \n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_extern(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section)\n{\n  COFF_SymbolLocation loc = {0};\n  loc.type                = COFF_SymbolLocation_Section;\n  loc.u.section           = section;\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, value, loc, (COFF_SymbolType){0}, COFF_SymStorageClass_External);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_extern_func(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section)\n{\n  COFF_SymbolType      type = { .u.msb = COFF_SymDType_Func };\n  COFF_SymbolLocation  loc  = { .type = COFF_SymbolLocation_Section, .u.section = section };\n  COFF_ObjSymbol      *s    = coff_obj_writer_push_symbol(obj_writer, name, value, loc, type, COFF_SymStorageClass_External);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_static(COFF_ObjWriter *obj_writer, String8 name, U32 off, COFF_ObjSection *section)\n{\n  COFF_SymbolLocation loc = {0};\n  loc.type                = COFF_SymbolLocation_Section;\n  loc.u.section           = section;\n  \n  COFF_SymbolType symtype = {0};\n  \n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, off, loc, symtype, COFF_SymStorageClass_Static);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_secdef(COFF_ObjWriter *obj_writer, COFF_ObjSection *section, COFF_ComdatSelectType selection)\n{\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol_static(obj_writer, section->name, 0, section);\n  COFF_ObjSymbolSecDef *sd = push_array(obj_writer->arena, COFF_ObjSymbolSecDef, 1);\n  sd->selection = selection;\n  str8_list_push(obj_writer->arena, &s->aux_symbols, str8_struct(sd));\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_associative(COFF_ObjWriter *obj_writer, COFF_ObjSection *head, COFF_ObjSection *associate)\n{\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol_static(obj_writer, head->name, 0, head);\n  COFF_ObjSymbolSecDef *sd = push_array(obj_writer->arena, COFF_ObjSymbolSecDef, 1);\n  sd->selection = COFF_ComdatSelect_Associative;\n  sd->associate = associate;\n  str8_list_push(obj_writer->arena, &s->aux_symbols, str8_struct(sd));\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_weak(COFF_ObjWriter *obj_writer, String8 name, COFF_WeakExtType characteristics, COFF_ObjSymbol *tag)\n{\n  COFF_SymbolLocation loc     = {0};\n  COFF_SymbolType     symtype = {0};\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, COFF_Symbol_UndefinedSection, loc, symtype, COFF_SymStorageClass_WeakExternal);\n  \n  COFF_ObjSymbolWeak *weak_ext = push_array(obj_writer->arena, COFF_ObjSymbolWeak, 1);\n  weak_ext->tag                = tag;\n  weak_ext->characteristics    = characteristics;\n  \n  str8_list_push(obj_writer->arena, &s->aux_symbols, str8_struct(weak_ext));\n  \n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_abs(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymStorageClass storage_class)\n{\n  COFF_SymbolLocation loc = {0};\n  loc.type = COFF_SymbolLocation_Abs;\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, value, loc, (COFF_SymbolType){0}, storage_class);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_undef(COFF_ObjWriter *obj_writer, String8 name)\n{\n  COFF_SymbolType type = {0};\n  COFF_SymbolLocation loc = {0};\n  loc.type = COFF_SymbolLocation_Undef;\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, 0, loc, type, COFF_SymStorageClass_External);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_undef_func(COFF_ObjWriter *obj_writer, String8 name)\n{\n  COFF_SymbolType type = {0};\n  type.u.msb = COFF_SymDType_Func;\n  COFF_SymbolLocation loc = {0};\n  loc.type = COFF_SymbolLocation_Undef;\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, 0, loc, type, COFF_SymStorageClass_External);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_undef_sect(COFF_ObjWriter *obj_writer, String8 name, U32 value)\n{\n  COFF_SymbolType type = {0};\n  COFF_SymbolLocation loc = {0};\n  loc.type = COFF_SymbolLocation_Undef;\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, value, loc, type, COFF_SymStorageClass_Section);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_sect(COFF_ObjWriter *obj_writer, String8 name, COFF_ObjSection *sect)\n{\n  COFF_SymbolType type = {0};\n  COFF_SymbolLocation loc = {0};\n  loc.type      = COFF_SymbolLocation_Section;\n  loc.u.section = sect;\n  \n  // strip align flags\n  COFF_SectionFlags expected_flags = sect->flags & ~(COFF_SectionFlag_AlignMask << COFF_SectionFlag_AlignShift); \n  \n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, expected_flags, loc, type, COFF_SymStorageClass_Section);\n  return s;\n}\n\ninternal COFF_ObjSymbol *\ncoff_obj_writer_push_symbol_common(COFF_ObjWriter *obj_writer, String8 name, U32 size)\n{\n  COFF_SymbolType type = {0};\n  COFF_SymbolLocation loc = {0};\n  loc.type = COFF_SymbolLocation_Common;\n  COFF_ObjSymbol *s = coff_obj_writer_push_symbol(obj_writer, name, size, loc, type, COFF_SymStorageClass_External);\n  return s;\n}\n\ninternal void\ncoff_obj_writer_set_default_symbol(COFF_ObjSymbol *weak_symbol, COFF_ObjSymbol *default_symbol)\n{\n  AssertAlways(weak_symbol->storage_class == COFF_SymStorageClass_WeakExternal);\n  COFF_ObjSymbolWeak *w = (COFF_ObjSymbolWeak *)weak_symbol->aux_symbols.first->string.str;\n  w->tag = default_symbol;\n}\n\ninternal COFF_ObjReloc*\ncoff_obj_writer_section_push_reloc(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol, COFF_RelocType type)\n{\n  COFF_ObjRelocNode *reloc_n = push_array(obj_writer->arena, COFF_ObjRelocNode, 1);\n  SLLQueuePush(sect->reloc_first, sect->reloc_last, reloc_n);\n  sect->reloc_count += 1;\n  \n  COFF_ObjReloc *reloc = &reloc_n->v;\n  reloc->apply_off     = apply_off;\n  reloc->symbol        = symbol;\n  reloc->type          = type;\n  \n  return reloc;\n}\n\ninternal COFF_ObjReloc *\ncoff_obj_writer_section_push_reloc_addr32(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol)\n{\n  COFF_RelocType reloc_type = 0;\n  switch (obj_writer->machine) {\n    case COFF_MachineType_Unknown: break;\n    case COFF_MachineType_X64: reloc_type = COFF_Reloc_X64_Addr32; break;\n    default: { NotImplemented; } break;\n  }\n  return coff_obj_writer_section_push_reloc(obj_writer, sect, apply_off, symbol, reloc_type);\n}\n\ninternal COFF_ObjReloc *\ncoff_obj_writer_section_push_reloc_addr(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol)\n{\n  COFF_RelocType reloc_type = 0;\n  switch (obj_writer->machine) {\n    case COFF_MachineType_Unknown: break;\n    case COFF_MachineType_X64: reloc_type = COFF_Reloc_X64_Addr64; break;\n    default: { NotImplemented; } break;\n  }\n  return coff_obj_writer_section_push_reloc(obj_writer, sect, apply_off, symbol, reloc_type);\n}\n\ninternal COFF_ObjReloc *\ncoff_obj_writer_section_push_reloc_voff(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol)\n{\n  COFF_RelocType reloc_type = 0;\n  switch (obj_writer->machine) {\n    case COFF_MachineType_Unknown: break;\n    case COFF_MachineType_X64: reloc_type = COFF_Reloc_X64_Addr32Nb; break;\n    default: { NotImplemented; } break;\n  }\n  return coff_obj_writer_section_push_reloc(obj_writer, sect, apply_off, symbol, reloc_type);\n}\n\ninternal void\ncoff_obj_writer_push_directive(COFF_ObjWriter *obj_writer, String8 directive)\n{\n  if (obj_writer->drectve_sect == 0) {\n    local_persist const U8 bom_sig[]  = { ' ', ' ', ' ' };\n    obj_writer->drectve_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".drectve\"), COFF_SectionFlag_LnkInfo|COFF_SectionFlag_LnkRemove|COFF_SectionFlag_Align1Bytes, str8_array_fixed(bom_sig));\n  }\n  String8List *data = &obj_writer->drectve_sect->data;\n  str8_list_push(obj_writer->arena, data, directive);\n  str8_list_pushf(obj_writer->arena, data, \" \");\n}\n\ninternal int\ncoff_obj_section_is_before(void *raw_a, void *raw_b)\n{\n  COFF_ObjSection **a = raw_a;\n  COFF_ObjSection **b = raw_b;\n  return (*a)->section_number < (*b)->section_number;\n}\n\n\n\n"
  },
  {
    "path": "src/coff/coff_obj_writer.h",
    "content": "#ifndef COFF_OBJ_WRITER_H\n#define COFF_OBJ_WRITER_H\n\ntypedef enum\n{\n  COFF_SymbolLocation_Null,\n  COFF_SymbolLocation_Section,\n  COFF_SymbolLocation_Abs,\n  COFF_SymbolLocation_Undef,\n  COFF_SymbolLocation_Common,\n} COFF_SymbolLocationType;\n\ntypedef struct COFF_SymbolLocation\n{\n  COFF_SymbolLocationType type;\n  union {\n    struct COFF_ObjSection *section;\n  } u;\n} COFF_SymbolLocation;\n\ntypedef struct COFF_ObjSymbolWeak\n{\n  struct COFF_ObjSymbol *tag;\n  COFF_WeakExtType       characteristics;\n} COFF_ObjSymbolWeak;\n\ntypedef struct COFF_ObjSymbolSecDef\n{\n  COFF_ComdatSelectType selection;\n  struct COFF_ObjSection *associate;\n} COFF_ObjSymbolSecDef;\n\ntypedef struct COFF_ObjSymbol\n{\n  String8                 name;\n  U32                     value;\n  COFF_SymbolLocation     loc;\n  COFF_SymbolType         type;\n  COFF_SymStorageClass    storage_class;\n  String8List             aux_symbols;\n  U32                     idx;\n} COFF_ObjSymbol;\n\ntypedef struct COFF_ObjSymbolNode\n{\n  struct COFF_ObjSymbolNode *next;\n  COFF_ObjSymbol             v;\n} COFF_ObjSymbolNode;\n\ntypedef struct COFF_ObjReloc\n{\n  U32             apply_off;\n  COFF_ObjSymbol *symbol;\n  COFF_RelocType  type;\n} COFF_ObjReloc;\n\ntypedef struct COFF_ObjRelocNode\n{\n  struct COFF_ObjRelocNode *next;\n  COFF_ObjReloc             v;\n} COFF_ObjRelocNode;\n\ntypedef struct COFF_ObjSection\n{\n  String8           name;\n  String8List       data;\n  COFF_SectionFlags flags;\n\n  U64                reloc_count;\n  COFF_ObjRelocNode *reloc_first;\n  COFF_ObjRelocNode *reloc_last;\n\n  U32 section_number;\n} COFF_ObjSection;\n\ntypedef struct COFF_ObjSectionNode\n{\n  struct COFF_ObjSectionNode *next;\n  COFF_ObjSection             v;\n} COFF_ObjSectionNode;\n\ntypedef struct COFF_ObjWriter\n{\n  Arena               *arena;\n  COFF_TimeStamp       time_stamp;\n  COFF_MachineType     machine;\n  U64                  symbol_count;\n  COFF_ObjSymbolNode  *symbol_first;\n  COFF_ObjSymbolNode  *symbol_last;\n  U64                  sect_count;\n  COFF_ObjSectionNode *sect_first;\n  COFF_ObjSectionNode *sect_last;\n  COFF_ObjSection     *drectve_sect;\n} COFF_ObjWriter;\n\n////////////////////////////////\n\ninternal COFF_ObjWriter * coff_obj_writer_alloc(COFF_TimeStamp time_stamp, COFF_MachineType machine);\ninternal void             coff_obj_writer_release(COFF_ObjWriter **obj_writer);\ninternal String8          coff_obj_writer_serialize(Arena *arena, COFF_ObjWriter *obj_writer);\n\ninternal COFF_ObjSection * coff_obj_writer_push_section(COFF_ObjWriter *obj_writer, String8 name, COFF_SectionFlags flags, String8 data);\n\ninternal COFF_ObjSymbol*  coff_obj_writer_push_symbol(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymbolLocation loc, COFF_SymbolType type, COFF_SymStorageClass storage_class);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_extern_func(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_extern(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_ObjSection *section);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_static(COFF_ObjWriter *obj_writer, String8 name, U32 off, COFF_ObjSection *section);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_secdef(COFF_ObjWriter *obj_writer, COFF_ObjSection *section, COFF_ComdatSelectType selection);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_associative(COFF_ObjWriter *obj_writer, COFF_ObjSection *head, COFF_ObjSection *associate);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_weak(COFF_ObjWriter *obj_writer, String8 name, COFF_WeakExtType characteristics, COFF_ObjSymbol *tag);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_abs(COFF_ObjWriter *obj_writer, String8 name, U32 value, COFF_SymStorageClass storage_class);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef(COFF_ObjWriter *obj_writer, String8 name);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef_func(COFF_ObjWriter *obj_writer, String8 name);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_undef_sect(COFF_ObjWriter *obj_writer, String8 name, U32 value);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_sect(COFF_ObjWriter *obj_writer, String8 name, COFF_ObjSection *sect);\ninternal COFF_ObjSymbol * coff_obj_writer_push_symbol_common(COFF_ObjWriter *obj_writer, String8 name, U32 size);\n\ninternal void coff_obj_writer_set_default_symbol(COFF_ObjSymbol *weak_symbol, COFF_ObjSymbol *default_symbol);\n\ninternal COFF_ObjReloc * coff_obj_writer_section_push_reloc(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol, COFF_RelocType reloc_type);\ninternal COFF_ObjReloc * coff_obj_writer_section_push_reloc_addr32(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol);\ninternal COFF_ObjReloc * coff_obj_writer_section_push_reloc_addr(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol);\ninternal COFF_ObjReloc * coff_obj_writer_section_push_reloc_voff(COFF_ObjWriter *obj_writer, COFF_ObjSection *sect, U32 apply_off, COFF_ObjSymbol *symbol);\n\ninternal void coff_obj_writer_push_directive(COFF_ObjWriter *obj_writer, String8 directive);\n\n#endif // COFF_OBJ_WRITER_H\n\n"
  },
  {
    "path": "src/coff/coff_parse.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal B32\r\ncoff_is_big_obj(String8 raw_coff)\r\n{\r\n  B32 is_big_obj = 0;\r\n  if (raw_coff.size >= sizeof(COFF_BigObjHeader)) {\r\n    COFF_BigObjHeader *file_header32 = (COFF_BigObjHeader*)(raw_coff.str);\r\n    is_big_obj = file_header32->sig1 == COFF_MachineType_Unknown && \r\n      file_header32->sig2 == max_U16 &&\r\n      file_header32->version >= 2 &&\r\n      MemoryCompare(file_header32->magic, g_coff_big_header_magic, sizeof(file_header32->magic)) == 0;\r\n  }\r\n  return is_big_obj;\r\n}\r\n\r\ninternal B32\r\ncoff_is_obj(String8 raw_coff)\r\n{\r\n  B32 is_obj = 0;\r\n  \r\n  if (raw_coff.size >= sizeof(COFF_FileHeader)) {\r\n    COFF_FileHeader *header = (COFF_FileHeader*)(raw_coff.str);\r\n    \r\n    // validate machine\r\n    B32 is_machine_type_valid = 0;\r\n    switch (header->machine) {\r\n      case COFF_MachineType_Unknown:\r\n      case COFF_MachineType_X86:    case COFF_MachineType_X64:\r\n      case COFF_MachineType_Am33:   case COFF_MachineType_Arm:\r\n      case COFF_MachineType_Arm64:  case COFF_MachineType_ArmNt:\r\n      case COFF_MachineType_Ebc:    case COFF_MachineType_Ia64:\r\n      case COFF_MachineType_M32R:   case COFF_MachineType_Mips16:\r\n      case COFF_MachineType_MipsFpu:case COFF_MachineType_MipsFpu16:\r\n      case COFF_MachineType_PowerPc:case COFF_MachineType_PowerPcFp:\r\n      case COFF_MachineType_R4000:  case COFF_MachineType_RiscV32:\r\n      case COFF_MachineType_RiscV64:case COFF_MachineType_RiscV128:\r\n      case COFF_MachineType_Sh3:    case COFF_MachineType_Sh3Dsp:\r\n      case COFF_MachineType_Sh4:    case COFF_MachineType_Sh5:\r\n      case COFF_MachineType_Thumb:  case COFF_MachineType_WceMipsV2:\r\n      {\r\n        is_machine_type_valid = 1;\r\n      }break;\r\n    }\r\n    \r\n    if (is_machine_type_valid) {\r\n      // validate section count\r\n      U64 section_count = header->section_count;\r\n      U64 section_hdr_opl_off = sizeof(*header) + section_count*sizeof(COFF_SectionHeader);\r\n      if (raw_coff.size >= section_hdr_opl_off) {\r\n        \r\n        COFF_SectionHeader *section_hdrs = (COFF_SectionHeader*)(raw_coff.str + sizeof(*header));\r\n        COFF_SectionHeader *section_hdr_opl = section_hdrs + section_count;\r\n        \r\n        // validate section ranges\r\n        B32 is_sect_range_valid = 1;\r\n        for (COFF_SectionHeader *sec_hdr = section_hdrs;\r\n             sec_hdr < section_hdr_opl;\r\n             sec_hdr += 1) {\r\n          if (!(sec_hdr->flags & COFF_SectionFlag_CntUninitializedData)) {\r\n            U64 min = sec_hdr->foff;\r\n            U64 max = min + sec_hdr->fsize;\r\n            if (sec_hdr->fsize > 0 && !(section_hdr_opl_off <= min && min <= max && max <= raw_coff.size)) {\r\n              is_sect_range_valid = 0;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        if (is_sect_range_valid) {\r\n          // validate symbol table\r\n          U64 symbol_table_off = header->symbol_table_foff;\r\n          U64 symbol_table_size = sizeof(COFF_Symbol16)*header->symbol_count;\r\n          U64 symbol_table_opl_off = symbol_table_off + symbol_table_size;\r\n          \r\n          // don't validate symbol table when there is none\r\n          if (symbol_table_off == 0 && symbol_table_size == 0) {\r\n            symbol_table_off = section_hdr_opl_off;\r\n            symbol_table_opl_off = section_hdr_opl_off;\r\n          }\r\n          \r\n          is_obj = (section_hdr_opl_off <= symbol_table_off &&\r\n                    symbol_table_off <= symbol_table_opl_off &&\r\n                    symbol_table_opl_off <= raw_coff.size);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return is_obj;\r\n}\r\n\r\ninternal COFF_FileHeaderInfo\r\ncoff_file_header_info_from_data(String8 raw_coff)\r\n{\r\n  COFF_FileHeaderInfo info = {0};\r\n  if (coff_is_big_obj(raw_coff)) {\r\n    COFF_BigObjHeader *header32 = (COFF_BigObjHeader*)raw_coff.str;\r\n    info.is_big_obj             = 1;\r\n    info.machine                = header32->machine;\r\n    info.section_count_no_null  = header32->section_count;\r\n    info.symbol_count           = header32->symbol_count;\r\n    info.symbol_size            = sizeof(COFF_Symbol32);\r\n    info.header_range           = rng_1u64(0, sizeof(COFF_BigObjHeader));\r\n    info.section_table_range    = rng_1u64(info.header_range.max, info.header_range.max + sizeof(COFF_SectionHeader) * header32->section_count);\r\n    info.symbol_table_range     = rng_1u64(header32->symbol_table_foff, header32->symbol_table_foff + sizeof(COFF_Symbol32) * header32->symbol_count);\r\n    info.string_table_range     = rng_1u64(info.symbol_table_range.max, raw_coff.size);\r\n  } else if (coff_is_obj(raw_coff)) {\r\n    COFF_FileHeader *header16  = (COFF_FileHeader*)raw_coff.str;\r\n    info.is_big_obj            = 0;\r\n    info.machine               = header16->machine;\r\n    info.section_count_no_null = header16->section_count;\r\n    info.symbol_count          = header16->symbol_count;\r\n    info.symbol_size           = sizeof(COFF_Symbol16);\r\n    info.header_range          = rng_1u64(0, sizeof(COFF_FileHeader));\r\n    info.section_table_range   = rng_1u64(info.header_range.max, info.header_range.max + sizeof(COFF_SectionHeader) * header16->section_count);\r\n    info.symbol_table_range    = rng_1u64(header16->symbol_table_foff, header16->symbol_table_foff + sizeof(COFF_Symbol16) * header16->symbol_count);\r\n    info.string_table_range    = rng_1u64(info.symbol_table_range.max, raw_coff.size);\r\n  }\r\n  return info;\r\n}\r\n\r\ninternal COFF_SectionHeader **\r\ncoff_section_table_from_data(Arena *arena, String8 data, Rng1U64 section_table_range)\r\n{\r\n  U64                  section_count = dim_1u64(section_table_range) / sizeof(COFF_SectionHeader);\r\n  COFF_SectionHeader **section_table = push_array_no_zero(arena, COFF_SectionHeader *, section_count+1);\r\n  section_table[0] = push_array(arena, COFF_SectionHeader, 1);\r\n  for (U64 i = 0; i < section_count; ++i) {\r\n    section_table[i+1] = str8_deserial_get_raw_ptr(data, section_table_range.min + i*sizeof(COFF_SectionHeader), sizeof(COFF_SectionHeader));\r\n  }\r\n  return section_table;\r\n}\r\n\r\ninternal COFF_ParsedSymbol\r\ncoff_parse_symbol32(String8 string_table, COFF_Symbol32 *sym32)\r\n{\r\n  COFF_ParsedSymbol result = {0};\r\n  result.name              = coff_read_symbol_name(string_table, &sym32->name);\r\n  result.value             = sym32->value;\r\n  result.section_number    = sym32->section_number;\r\n  result.type              = sym32->type;\r\n  result.storage_class     = sym32->storage_class;\r\n  result.aux_symbol_count  = sym32->aux_symbol_count;\r\n  result.raw_symbol        = sym32;\r\n  return result;\r\n}\r\n\r\ninternal COFF_ParsedSymbol\r\ncoff_parse_symbol16(String8 string_table, COFF_Symbol16 *sym16)\r\n{\r\n  COFF_ParsedSymbol result = {0};\r\n  result.name              = coff_read_symbol_name(string_table, &sym16->name);\r\n  result.value             = sym16->value;\r\n  if (sym16->section_number == COFF_Symbol_DebugSection16) {\r\n    result.section_number = COFF_Symbol_DebugSection32;\r\n  } else if (sym16->section_number == COFF_Symbol_AbsSection16) {\r\n    result.section_number = COFF_Symbol_AbsSection32;\r\n  } else {\r\n    result.section_number = (U32)sym16->section_number;\r\n  }\r\n  result.type             = sym16->type;\r\n  result.storage_class    = sym16->storage_class;\r\n  result.aux_symbol_count = sym16->aux_symbol_count;\r\n  result.raw_symbol       = sym16;\r\n  return result;\r\n}\r\n\r\ninternal COFF_ParsedSymbol\r\ncoff_parse_symbol(COFF_FileHeaderInfo header, String8 string_table, String8 symbol_table, U32 symbol_idx)\r\n{\r\n  COFF_ParsedSymbol symbol;\r\n  if (header.is_big_obj) {\r\n    symbol = coff_parse_symbol32(string_table, (COFF_Symbol32 *)symbol_table.str + symbol_idx);\r\n  } else {\r\n    symbol = coff_parse_symbol16(string_table, (COFF_Symbol16 *)symbol_table.str + symbol_idx);\r\n  }\r\n  return symbol;\r\n}\r\n\r\ninternal COFF_Symbol32Array\r\ncoff_symbol_array_from_data_16(Arena *arena, String8 raw_coff, U64 symbol_array_off, U64 symbol_count)\r\n{\r\n  COFF_Symbol32Array result = {0};\r\n  result.count              = symbol_count;\r\n  result.v                  = push_array_no_zero_aligned(arena, COFF_Symbol32, result.count, 8);\r\n  \r\n  Rng1U64        sym16_arr_range = rng_1u64(symbol_array_off, symbol_array_off + sizeof(COFF_Symbol16) * symbol_count);\r\n  String8        raw_sym16_arr   = str8_substr(raw_coff, sym16_arr_range);\r\n  COFF_Symbol16 *sym16_arr       = (COFF_Symbol16 *)raw_sym16_arr.str;\r\n  \r\n  for (U64 isymbol = 0, count = raw_sym16_arr.size / sizeof(COFF_Symbol16); isymbol < count; isymbol += 1) {\r\n    COFF_Symbol16 *sym16 = &sym16_arr[isymbol];\r\n    COFF_Symbol32 *sym32 = &result.v[isymbol];\r\n    \r\n    sym32->name             = sym16->name;\r\n    sym32->value            = sym16->value;\r\n    if (sym16->section_number == COFF_Symbol_DebugSection16) {\r\n      sym32->section_number = COFF_Symbol_DebugSection32;\r\n    } else if (sym16->section_number == COFF_Symbol_AbsSection16) {\r\n      sym32->section_number = COFF_Symbol_AbsSection32;\r\n    } else {\r\n      sym32->section_number = (U32)sym16->section_number;\r\n    }\r\n    sym32->type.v           = sym16->type.v;\r\n    sym32->storage_class    = sym16->storage_class;\r\n    sym32->aux_symbol_count = sym16->aux_symbol_count;\r\n    \r\n    // copy aux symbols\r\n    for (U64 iaux = isymbol+1, iaux_hi = Min(count, iaux+sym16->aux_symbol_count); iaux < iaux_hi; iaux += 1) {\r\n      COFF_Symbol16 *aux16 = sym16_arr + iaux;\r\n      COFF_Symbol32 *aux32 = result.v  + iaux;\r\n      \r\n      // 32bit COFF uses 16bit aux symbols\r\n      MemoryCopy(aux32, aux16, sizeof(COFF_Symbol16));\r\n      MemoryZero((U8 *)aux32 + sizeof(COFF_Symbol16), sizeof(COFF_Symbol32)-sizeof(COFF_Symbol16));\r\n    }\r\n    \r\n    // take into account aux symbols\r\n    isymbol += sym32->aux_symbol_count;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal COFF_Symbol32Array\r\ncoff_symbol_array_from_data_32(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count)\r\n{\r\n  COFF_Symbol32Array result;\r\n  result.count = symbol_count;\r\n  result.v     = (COFF_Symbol32 *)(data.str + symbol_array_off);\r\n  return result;\r\n}\r\n\r\ninternal COFF_Symbol32Array\r\ncoff_symbol_array_from_data(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count, U64 symbol_size)\r\n{\r\n  COFF_Symbol32Array result = {0};\r\n  switch (symbol_size) {\r\n    case sizeof(COFF_Symbol16): result = coff_symbol_array_from_data_16(arena, data, symbol_array_off, symbol_count); break;\r\n    case sizeof(COFF_Symbol32): result = coff_symbol_array_from_data_32(arena, data, symbol_array_off, symbol_count); break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal COFF_Symbol16Node *\r\ncoff_symbol16_list_push(Arena *arena, COFF_Symbol16List *list, COFF_Symbol16 symbol)\r\n{\r\n  COFF_Symbol16Node *node = push_array(arena, COFF_Symbol16Node, 1);\r\n  node->next = 0;\r\n  node->data = symbol;\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->count += 1;\r\n  return node;\r\n}\r\n\r\ninternal COFF_SymbolValueInterpType\r\ncoff_interp_symbol(U32 section_number, U32 value, COFF_SymStorageClass storage_class)\r\n{\r\n  if (storage_class == COFF_SymStorageClass_Section && section_number == COFF_Symbol_UndefinedSection) {\r\n    return COFF_SymbolValueInterp_Undefined;\r\n  }\r\n  if (storage_class == COFF_SymStorageClass_External && value == 0 && section_number == COFF_Symbol_UndefinedSection) {\r\n    return COFF_SymbolValueInterp_Undefined;\r\n  }\r\n  if (storage_class == COFF_SymStorageClass_External && value != 0 && section_number == COFF_Symbol_UndefinedSection) {\r\n    return COFF_SymbolValueInterp_Common;\r\n  }\r\n  if (section_number == COFF_Symbol_AbsSection32) {\r\n    return COFF_SymbolValueInterp_Abs;\r\n  }\r\n  if (section_number == COFF_Symbol_DebugSection32) {\r\n    return COFF_SymbolValueInterp_Debug;\r\n  }\r\n  if (storage_class == COFF_SymStorageClass_WeakExternal) {\r\n    return COFF_SymbolValueInterp_Weak;\r\n  }\r\n  return COFF_SymbolValueInterp_Regular;\r\n}\r\n\r\ninternal COFF_SymbolValueInterpType\r\ncoff_interp_from_parsed_symbol(COFF_ParsedSymbol symbol)\r\n{\r\n  return coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\r\n}\r\n\r\ninternal B32\r\ncoff_is_undefined_data_symbol(COFF_ParsedSymbol symbol)\r\n{\r\n  COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol);\r\n  return interp == COFF_SymbolValueInterp_Undefined && symbol.storage_class == COFF_SymStorageClass_External;\r\n}\r\n\r\ninternal void\r\ncoff_parse_secdef(COFF_ParsedSymbol symbol, B32 is_big_obj, COFF_ComdatSelectType *selection_out, U32 *number_out, U32 *length_out, U32 *check_sum_out)\r\n{\r\n  Assert(coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class) == COFF_SymbolValueInterp_Regular);\r\n  Assert(symbol.aux_symbol_count > 0);\r\n\r\n  if (is_big_obj) {\r\n    COFF_SymbolSecDef *sd = (COFF_SymbolSecDef *)((COFF_Symbol32 *)symbol.raw_symbol + 1);\r\n    if (selection_out) *selection_out = sd->selection;\r\n    if (length_out)    *length_out    = sd->length;\r\n    if (check_sum_out) *check_sum_out = sd->check_sum;\r\n    if (number_out)    *number_out    = Compose32Bit(sd->number_hi, sd->number_lo);\r\n  } else {\r\n    COFF_SymbolSecDef *sd = (COFF_SymbolSecDef *)((COFF_Symbol16 *)symbol.raw_symbol + 1);\r\n    if (selection_out) *selection_out = sd->selection;\r\n    if (length_out)    *length_out    = sd->length;\r\n    if (check_sum_out) *check_sum_out = sd->check_sum;\r\n    if (number_out)    *number_out    = sd->number_lo;\r\n  }\r\n}\r\n\r\ninternal COFF_SymbolWeakExt *\r\ncoff_parse_weak_tag(COFF_ParsedSymbol symbol, B32 is_big_obj)\r\n{\r\n  Assert(coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class) == COFF_SymbolValueInterp_Weak);\r\n  Assert(symbol.aux_symbol_count > 0);\r\n\r\n  void *tag;\r\n  if (is_big_obj) {\r\n    tag = (COFF_SymbolWeakExt *)((COFF_Symbol32 *)symbol.raw_symbol + 1);\r\n  } else {\r\n    tag = (COFF_SymbolWeakExt *)((COFF_Symbol16 *)symbol.raw_symbol + 1);\r\n  }\r\n\r\n  return tag;\r\n}\r\n\r\ninternal COFF_RelocNode *\r\ncoff_reloc_list_push(Arena *arena, COFF_RelocList *list, COFF_Reloc reloc)\r\n{\r\n  COFF_RelocNode *node = push_array(arena, COFF_RelocNode, 1);\r\n  node->data = reloc;\r\n  SLLQueuePush(list->first, list->last, node);\r\n  ++list->count;\r\n  return node;\r\n}\r\n\r\ninternal COFF_RelocInfo\r\ncoff_reloc_info_from_section_header(String8 data, COFF_SectionHeader *header)\r\n{\r\n  COFF_RelocInfo result = {0};\r\n  if (header->flags & COFF_SectionFlag_LnkNRelocOvfl && header->reloc_count == max_U16) {\r\n    COFF_Reloc counter;\r\n    U64 read_size = str8_deserial_read_struct(data, header->relocs_foff, &counter);\r\n    if (read_size == sizeof(counter) && counter.apply_off > 0) {\r\n      result.array_off = header->relocs_foff + sizeof(COFF_Reloc);\r\n      result.count     = counter.apply_off - 1; // exclude counter entry\r\n    }\r\n  } else {\r\n    result.array_off = header->relocs_foff;\r\n    result.count     = header->reloc_count;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_resource_string_from_str16(Arena *arena, String16 string)\r\n{\r\n  AssertAlways(string.size <= max_U16);\r\n  U16 size16 = (U16)string.size;\r\n  \r\n  U16 *buffer = push_array_no_zero(arena, U16, size16 + 1);\r\n  MemoryCopy(buffer + 0, &size16,    sizeof(size16));\r\n  MemoryCopy(buffer + 1, string.str, size16 * sizeof(string.str[0]));\r\n  \r\n  return str8_array(buffer, size16 + 1);\r\n}\r\n\r\ninternal String8\r\ncoff_resource_string_from_str8(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String16 string16 = str16_from_8(scratch.arena, string);\r\n  String8  result   = coff_resource_string_from_str16(arena, string16);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_resource_number_from_u16(Arena *arena, U16 number)\r\n{\r\n  U16 *buffer = push_array_no_zero(arena, U16, 2);\r\n  buffer[0] = max_U16;\r\n  buffer[1] = number;\r\n  return str8_array(buffer, 2);\r\n}\r\n\r\ninternal COFF_ResourceID\r\ncoff_utf8_resource_id_from_utf16(Arena *arena, COFF_ResourceID16 *id_16)\r\n{\r\n  COFF_ResourceID id = {0};\r\n  id.type = id_16->type;\r\n  switch (id_16->type) {\r\n    case COFF_ResourceIDType_Null: break;\r\n    case COFF_ResourceIDType_Number: {\r\n      id.u.number = id_16->u.number;\r\n    } break;\r\n    case COFF_ResourceIDType_String: {\r\n      id.u.string = str8_from_16(arena, id_16->u.string);\r\n    } break;\r\n    default: InvalidPath;\r\n  }\r\n  return id;\r\n}\r\n\r\ninternal U64\r\ncoff_read_resource_id_utf16(String8 raw_res, U64 off, COFF_ResourceID16 *id_out)\r\n{\r\n  U64 cursor = off;\r\n  \r\n  U16 flag = 0;\r\n  str8_deserial_read_struct(raw_res, cursor, &flag);\r\n  \r\n  if (flag == max_U16) {\r\n    id_out->type = COFF_ResourceIDType_Number;\r\n    cursor += sizeof(flag);\r\n    cursor += str8_deserial_read_struct(raw_res, cursor, &id_out->u.number);\r\n  } else {\r\n    id_out->type = COFF_ResourceIDType_String;\r\n    cursor += str8_deserial_read_windows_utf16_string16(raw_res, cursor, &id_out->u.string);\r\n  }\r\n  \r\n  U64 read_size = cursor - off;\r\n  read_size     = AlignPow2(read_size, COFF_ResourceAlign);\r\n  return read_size;\r\n}\r\n\r\ninternal U64\r\ncoff_read_resource(Arena *arena, String8 raw_res, U64 off, COFF_ParsedResource *res_out)\r\n{\r\n  String8 raw_header    = str8_skip(raw_res, off);\r\n  U64     header_cursor = 0;\r\n  \r\n  // prefix\r\n  COFF_ResourceHeaderPrefix prefix = {0};\r\n  header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &prefix);\r\n  \r\n  Assert(prefix.header_size >= sizeof(COFF_ResourceHeaderPrefix));\r\n  raw_header = str8_prefix(raw_header, prefix.header_size);\r\n  \r\n  // header\r\n  COFF_ResourceID16 type_16 = {0};\r\n  COFF_ResourceID16 name_16 = {0};\r\n  header_cursor += coff_read_resource_id_utf16(raw_header, header_cursor, &type_16);\r\n  header_cursor += coff_read_resource_id_utf16(raw_header, header_cursor, &name_16);\r\n  header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->data_version);\r\n  header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->memory_flags);\r\n  header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->language_id);\r\n  header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->version);\r\n  header_cursor += str8_deserial_read_struct(raw_header, header_cursor, &res_out->characteristics);\r\n  Assert(prefix.header_size == header_cursor);\r\n  \r\n  // convert utf-16 resource ids to utf-8\r\n  res_out->type = coff_utf8_resource_id_from_utf16(arena, &type_16);\r\n  res_out->name = coff_utf8_resource_id_from_utf16(arena, &name_16);\r\n  \r\n  // read data\r\n  U64 data_read_size = str8_deserial_read_block(raw_res, off + prefix.header_size, prefix.data_size, &res_out->data);\r\n  Assert(prefix.data_size == data_read_size);\r\n  \r\n  // compute read size\r\n  U64 read_size = Max(prefix.header_size, sizeof(prefix)) + AlignPow2(prefix.data_size, COFF_ResourceAlign);\r\n  return read_size;\r\n}\r\n\r\ninternal COFF_ParsedResourceList\r\ncoff_resource_list_from_data(Arena *arena, String8 data)\r\n{\r\n  COFF_ParsedResourceList list = {0};\r\n  U64 cursor;\r\n  for (cursor = 0 ; cursor < data.size; ) {\r\n    COFF_ParsedResourceNode *node = push_array(arena, COFF_ParsedResourceNode, 1);\r\n    cursor += coff_read_resource(arena, data, cursor, &node->data);\r\n    SLLQueuePush(list.first, list.last, node);\r\n    ++list.count;\r\n  }\r\n  Assert(cursor == data.size);\r\n  return list;\r\n}\r\n\r\ninternal String8\r\ncoff_write_resource_id(Arena *arena, COFF_ResourceID id)\r\n{\r\n  String8 result = str8_zero();\r\n  switch (id.type) {\r\n    case COFF_ResourceIDType_Null: break;\r\n    case COFF_ResourceIDType_Number: {\r\n      result = coff_resource_number_from_u16(arena, id.u.number);\r\n    } break;\r\n    case COFF_ResourceIDType_String: {\r\n      result = coff_resource_string_from_str8(arena, id.u.string);\r\n    } break;\r\n    default: InvalidPath;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_write_resource(Arena          *arena,\r\n                    COFF_ResourceID type,\r\n                    COFF_ResourceID name,\r\n                    U32             data_version,\r\n                    COFF_ResourceMemoryFlags memory_flags,\r\n                    U16             language_id,\r\n                    U32             version,\r\n                    U32             characteristics,\r\n                    String8         data)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  String8List list = {0};\r\n  \r\n  COFF_ResourceHeaderPrefix *prefix      = push_array(scratch.arena, COFF_ResourceHeaderPrefix, 1);\r\n  String8                    packed_type = coff_write_resource_id(scratch.arena, type);\r\n  String8                    packed_name = coff_write_resource_id(scratch.arena, name);\r\n  \r\n  // prefix + header\r\n  str8_list_push(scratch.arena, &list, str8_struct(prefix));\r\n  str8_list_push(scratch.arena, &list, packed_type);\r\n  str8_list_push(scratch.arena, &list, packed_name);\r\n  str8_list_push(scratch.arena, &list, str8_struct(&data_version));\r\n  str8_list_push(scratch.arena, &list, str8_struct(&memory_flags));\r\n  str8_list_push(scratch.arena, &list, str8_struct(&language_id));\r\n  str8_list_push(scratch.arena, &list, str8_struct(&version));\r\n  str8_list_push(scratch.arena, &list, str8_struct(&characteristics));\r\n  \r\n  prefix->data_size   = safe_cast_u32(data.size);\r\n  prefix->header_size = safe_cast_u32(list.total_size);\r\n  \r\n  // data\r\n  str8_list_push(scratch.arena, &list, data);\r\n  \r\n  // magic\r\n  str8_list_push_front(scratch.arena, &list, str8_array_fixed(g_coff_res_magic));\r\n  \r\n  // align\r\n  U64 align_size = AlignPow2(list.total_size, COFF_ResourceAlign) - list.total_size;\r\n  U8 *align      = push_array(scratch.arena, U8, align_size);\r\n  str8_list_push(scratch.arena, &list, str8(align, align_size));\r\n  \r\n  // join\r\n  String8 res = str8_list_join(arena, &list, 0);\r\n  \r\n  scratch_end(scratch);\r\n  return res;\r\n}\r\n\r\ninternal int\r\ncoff_resource_id_compar(void *raw_a, void *raw_b)\r\n{\r\n  int cmp;\r\n  COFF_ResourceID *a = raw_a;\r\n  COFF_ResourceID *b = raw_b;\r\n  if (a->type == b->type) {\r\n    switch (a->type) {\r\n      default:\r\n      case COFF_ResourceIDType_Null:   cmp = 0; break;\r\n      case COFF_ResourceIDType_Number: cmp = MemoryCompare(&a->u.number, &b->u.number, sizeof(a->u.number)); break;\r\n      case COFF_ResourceIDType_String: cmp = strncmp((char *)a->u.string.str, (char *)b->u.string.str, Min(a->u.string.size, b->u.string.size)); break;\r\n    }\r\n  } else {\r\n    cmp = a->type < b->type ? -1 : a->type > b->type ? +1 : 0;\r\n  }\r\n  return cmp;\r\n}\r\n\r\ninternal B32\r\ncoff_is_import(String8 raw_archive_member)\r\n{\r\n  B32 is_import = 0;\r\n  if (raw_archive_member.size >= sizeof(U16)*2) {\r\n    U16 *sig1 = (U16*)raw_archive_member.str;\r\n    U16 *sig2 = sig1 + 1;\r\n    is_import = *sig1 == COFF_MachineType_Unknown && *sig2 == 0xffff;\r\n  }\r\n  return is_import;\r\n}\r\n\r\ninternal COFF_DataType\r\ncoff_data_type_from_data(String8 raw_archive_member)\r\n{\r\n  B32 is_big_obj = coff_is_big_obj(raw_archive_member);\r\n  if (is_big_obj) {\r\n    return COFF_DataType_BigObj;\r\n  }\r\n  B32 is_import = coff_is_import(raw_archive_member);\r\n  if (is_import) {\r\n    return COFF_DataType_Import;\r\n  }\r\n  return COFF_DataType_Obj;\r\n}\r\n\r\ninternal B32\r\ncoff_is_regular_archive(String8 raw_archive)\r\n{\r\n  B32 is_archive = 0;\r\n  U8 sig[sizeof(g_coff_archive_sig)];\r\n  if (str8_deserial_read_struct(raw_archive, 0, &sig) == sizeof(sig)) {\r\n    is_archive = MemoryCompare(&sig[0], &g_coff_archive_sig[0], sizeof(g_coff_archive_sig)) == 0;\r\n  }\r\n  return is_archive;\r\n}\r\n\r\ninternal B32\r\ncoff_is_thin_archive(String8 raw_archive)\r\n{\r\n  B32 is_archive = 0;\r\n  U8 sig[sizeof(g_coff_thin_archive_sig)];\r\n  if (str8_deserial_read_struct(raw_archive, 0, &sig) == sizeof(sig)) {\r\n    is_archive = MemoryCompare(&sig[0], &g_coff_thin_archive_sig[0], sizeof(g_coff_thin_archive_sig)) == 0;\r\n  }\r\n  return is_archive;\r\n}\r\n\r\ninternal COFF_ArchiveType\r\ncoff_archive_type_from_data(String8 raw_archive)\r\n{\r\n  if (coff_is_regular_archive(raw_archive)) {\r\n    return COFF_Archive_Regular;\r\n  } else if (coff_is_thin_archive(raw_archive)) {\r\n    return COFF_Archive_Thin;\r\n  }\r\n  return COFF_Archive_Null;\r\n}\r\n\r\ninternal U64\r\ncoff_parse_archive_member_header(String8 raw_archive, U64 offset, COFF_ParsedArchiveMemberHeader *header_out)\r\n{\r\n  COFF_ArchiveMemberHeader *header = str8_deserial_get_raw_ptr(raw_archive, offset, sizeof(*header));\r\n  if (header) {\r\n    String8 name     = str8_skip_chop_whitespace(str8_cstring_capped(header->name,     header->name     + sizeof(header->name)    ));\r\n    String8 date     = str8_skip_chop_whitespace(str8_cstring_capped(header->date,     header->date     + sizeof(header->date)    ));\r\n    String8 user_id  = str8_skip_chop_whitespace(str8_cstring_capped(header->user_id,  header->user_id  + sizeof(header->user_id) ));\r\n    String8 group_id = str8_skip_chop_whitespace(str8_cstring_capped(header->group_id, header->group_id + sizeof(header->group_id)));\r\n    String8 mode     = str8_skip_chop_whitespace(str8_cstring_capped(header->mode,     header->mode     + sizeof(header->mode)    ));\r\n    String8 size     = str8_skip_chop_whitespace(str8_cstring_capped(header->size,     header->size     + sizeof(header->size)    ));\r\n    String8 end      = str8_cstring_capped(header->end, header->end + sizeof(header->end));\r\n    \r\n    U32 data_size = u32_from_str8(size, 10);\r\n    U64 data_off  = offset + sizeof(COFF_ArchiveMemberHeader);\r\n    \r\n    header_out->name           = name;\r\n    header_out->time_stamp     = u32_from_str8(date, 10);\r\n    header_out->user_id        = u32_from_str8(user_id, 10);\r\n    header_out->group_id       = u32_from_str8(group_id, 10);\r\n    header_out->mode           = mode;\r\n    header_out->is_end_correct = str8_match_lit(\"`\\n\", end, 0);\r\n    header_out->data_range     = rng_1u64(data_off, data_off + data_size);\r\n    \r\n    return sizeof(*header);\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal COFF_ArchiveFirstMember\r\ncoff_parse_first_archive_member(COFF_ArchiveMember *member)\r\n{\r\n  Assert(str8_match_lit(\"/\", member->header.name, 0));\r\n  \r\n  U64 cursor = 0;\r\n  \r\n  U32 symbol_count = 0;\r\n  cursor += str8_deserial_read_struct(member->data, cursor, &symbol_count);\r\n  \r\n  symbol_count = from_be_u32(symbol_count);\r\n  \r\n  Rng1U64 member_offsets_range = rng_1u64(cursor, cursor + symbol_count * sizeof(U32));\r\n  cursor += dim_1u64(member_offsets_range);\r\n  \r\n  Rng1U64 string_table_range = rng_1u64(cursor, member->data.size);\r\n  cursor += dim_1u64(string_table_range);\r\n  \r\n  String8  raw_member_offsets  = str8_substr(member->data, member_offsets_range);\r\n  U32     *member_offsets      = (U32 *)raw_member_offsets.str;\r\n  U64      member_offset_count = raw_member_offsets.size / sizeof(member_offsets[0]);\r\n  \r\n  COFF_ArchiveFirstMember result = {0};\r\n  result.symbol_count            = symbol_count;\r\n  result.member_offset_count     = member_offset_count;\r\n  result.member_offsets          = member_offsets;\r\n  result.string_table            = str8_substr(member->data, string_table_range);\r\n  \r\n  return result;\r\n}\r\n\r\ninternal COFF_ArchiveSecondMember\r\ncoff_parse_second_archive_member(COFF_ArchiveMember *member)\r\n{\r\n  COFF_ArchiveSecondMember result = {0};\r\n  \r\n  if (str8_match_lit(\"/\", member->header.name, 0)) {\r\n    U64 cursor = 0;\r\n    \r\n    U32 member_count = 0;\r\n    cursor += str8_deserial_read_struct(member->data, cursor, &member_count);\r\n    \r\n    Rng1U64 member_offsets_range = rng_1u64(cursor, cursor + member_count * sizeof(U32));\r\n    cursor += dim_1u64(member_offsets_range);\r\n    \r\n    U32 symbol_count = 0;\r\n    cursor += str8_deserial_read_struct(member->data, cursor, &symbol_count);\r\n    \r\n    Rng1U64 symbol_indices_range = rng_1u64(cursor, cursor + symbol_count * sizeof(U16));\r\n    cursor += dim_1u64(symbol_indices_range);\r\n    \r\n    Rng1U64 string_table_range = rng_1u64(cursor, member->data.size);\r\n    \r\n    String8 raw_member_offsets = str8_substr(member->data, member_offsets_range);\r\n    String8 raw_indices        = str8_substr(member->data, symbol_indices_range);\r\n    \r\n    U32 *member_offsets      = (U32 *)raw_member_offsets.str;\r\n    U64  member_offset_count = raw_member_offsets.size / sizeof(member_offsets[0]);\r\n    \r\n    U16 *symbol_indices     = (U16 *)raw_indices.str;\r\n    U64  symbol_index_count = raw_indices.size / sizeof(symbol_indices[0]);\r\n    \r\n    result.member_count        = member_count;\r\n    result.symbol_count        = symbol_count;\r\n    result.member_offsets      = member_offsets;\r\n    result.member_offset_count = member_offset_count;\r\n    result.symbol_indices      = symbol_indices;\r\n    result.symbol_index_count  = symbol_index_count;\r\n    result.string_table        = str8_substr(member->data, string_table_range);\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_decode_raw_member_name(String8 long_names, String8 name)\r\n{\r\n  String8 result = name;\r\n  if (name.size > 0 && name.str[0] == '/') {\r\n    String8 offset_str = str8(name.str + 1, name.size - 1);\r\n    U64 offset = u64_from_str8(offset_str, 10);\r\n    if (offset < long_names.size) {\r\n      U8 *ptr = long_names.str + offset;\r\n      U8 *opl = long_names.str + long_names.size;\r\n      for (; ptr < opl; ++ptr) {\r\n        if (*ptr == '\\0' || *ptr == '\\n') {\r\n          break;\r\n        }\r\n      }\r\n      result = str8_range(long_names.str + offset, ptr);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ncoff_decode_member_name(String8 long_names, String8 name)\r\n{\r\n  String8 member_name = coff_decode_raw_member_name(long_names, name);\r\n  String8 slash = str8_lit(\"/\");\r\n  if (str8_ends_with(member_name, slash, 0)) {\r\n    member_name = str8_chop(member_name, slash.size);\r\n  }\r\n  return member_name;\r\n}\r\n\r\ninternal U64\r\ncoff_parse_import(String8 raw_archive_member, U64 offset, COFF_ParsedArchiveImportHeader *header_out)\r\n{\r\n  COFF_ImportHeader *header = str8_deserial_get_raw_ptr(raw_archive_member, offset, sizeof(*header));\r\n  if (header) {\r\n    Rng1U64 data_range  = rng_1u64(offset + sizeof(*header), offset + sizeof(*header) + header->data_size);\r\n    String8 raw_data    = str8_substr(raw_archive_member, data_range);\r\n    U64     data_cursor = 0;\r\n    \r\n    header_out->version         = header->version;\r\n    header_out->machine         = header->machine;\r\n    header_out->time_stamp      = header->time_stamp;\r\n    header_out->data_size       = header->data_size;\r\n    header_out->hint_or_ordinal = header->hint_or_ordinal;\r\n    header_out->type            = COFF_ImportHeader_ExtractType(header->flags);\r\n    header_out->import_by       = COFF_ImportHeader_ExtractImportBy(header->flags);\r\n    data_cursor += str8_deserial_read_cstr(raw_data, data_cursor, &header_out->func_name);\r\n    data_cursor += str8_deserial_read_cstr(raw_data, data_cursor, &header_out->dll_name);\r\n    \r\n    Assert(header_out->func_name.size + header_out->dll_name.size + /* nulls */ 2 == header_out->data_size);\r\n    U64 read_size = sizeof(*header) + header->data_size;\r\n    return read_size;\r\n  }\r\n  return 0;  \r\n}\r\n\r\ninternal COFF_ArchiveMember\r\ncoff_archive_member_from_offset(String8 raw_archive, U64 offset)\r\n{\r\n  COFF_ArchiveMember member = {0};\r\n  coff_regular_archive_member_iter_next(raw_archive, &offset, &member);\r\n  return member;\r\n}\r\n\r\ninternal COFF_ArchiveMember\r\ncoff_archive_member_from_data(String8 raw_archive_member)\r\n{\r\n  return coff_archive_member_from_offset(raw_archive_member, 0);\r\n}\r\n\r\ninternal COFF_ParsedArchiveImportHeader\r\ncoff_archive_import_from_data(String8 raw_archive_member)\r\n{\r\n  COFF_ParsedArchiveImportHeader header = {0};\r\n  coff_parse_import(raw_archive_member, 0, &header);\r\n  return header;\r\n}\r\n\r\ninternal U64\r\ncoff_regular_archive_member_iter_init(String8 raw_archive)\r\n{\r\n  U64 cursor = raw_archive.size;\r\n  if (coff_is_regular_archive(raw_archive)) {\r\n    cursor = sizeof(g_coff_archive_sig);\r\n  }\r\n  return cursor;\r\n}\r\n\r\ninternal B32\r\ncoff_regular_archive_member_iter_next(String8 raw_archive, U64 *offset, COFF_ArchiveMember *member_out)\r\n{\r\n  B32 is_parsed = 0;\r\n  \r\n  member_out->header.is_end_correct = 0;\r\n  U64 header_size = coff_parse_archive_member_header(raw_archive, *offset, &member_out->header);\r\n  \r\n  if (member_out->header.is_end_correct) {\r\n    member_out->offset = *offset;\r\n    member_out->data   = str8_substr(raw_archive, member_out->header.data_range);\r\n    \r\n    U64 read_size = AlignPow2(header_size + dim_1u64(member_out->header.data_range), COFF_Archive_MemberAlign);\r\n    *offset += read_size;\r\n    \r\n    is_parsed = 1;\r\n  }\r\n  \r\n  return is_parsed;\r\n}\r\n\r\ninternal U64\r\ncoff_thin_archive_member_iter_init(String8 raw_archive)\r\n{\r\n  U64 cursor = raw_archive.size;\r\n  if (coff_is_thin_archive(raw_archive)) {\r\n    cursor = sizeof(g_coff_thin_archive_sig);\r\n  }\r\n  return cursor;\r\n}\r\n\r\ninternal B32\r\ncoff_thin_archive_member_iter_next(String8 raw_archive, U64 *offset, COFF_ArchiveMember *member_out)\r\n{\r\n  B32 is_parsed = 0;\r\n  \r\n  member_out->header.is_end_correct = 0;\r\n  U64 header_size = coff_parse_archive_member_header(raw_archive, *offset, &member_out->header);\r\n  \r\n  if (member_out->header.is_end_correct) {\r\n    Rng1U64 data_in_archive_range = {0};\r\n    if (str8_match_lit(\"/\", member_out->header.name, 0) || str8_match_lit(\"//\", member_out->header.name, 0)) {\r\n      data_in_archive_range = member_out->header.data_range;\r\n    }\r\n    \r\n    member_out->offset = *offset;\r\n    member_out->data   = str8_substr(raw_archive, data_in_archive_range);\r\n    \r\n    U64 read_size = AlignPow2(header_size + dim_1u64(data_in_archive_range), COFF_Archive_MemberAlign);\r\n    *offset += read_size;\r\n    \r\n    is_parsed = 1;\r\n  }\r\n  \r\n  return is_parsed;\r\n}\r\n\r\ninternal void\r\ncoff_archive_member_list_push_node(COFF_ArchiveMemberList *list, COFF_ArchiveMemberNode *node)\r\n{\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->count += 1;\r\n}\r\n\r\ninternal COFF_ArchiveParse\r\ncoff_archive_parse_from_member_list(COFF_ArchiveMemberList member_list)\r\n{\r\n  String8            error             = str8_zero();\r\n  B32                has_second_header = 0;\r\n  B32                has_long_names    = 0;\r\n  COFF_ArchiveMember first_header      = {0};\r\n  COFF_ArchiveMember second_header     = {0};\r\n  COFF_ArchiveMember long_names_member = {0};\r\n  \r\n  COFF_ArchiveMemberNode *ptr = member_list.first;\r\n  \r\n  if (ptr) {\r\n    if (str8_match_lit(\"/\", ptr->data.header.name, 0)) {\r\n      if (ptr->data.header.is_end_correct) {\r\n        first_header = ptr->data;\r\n        ptr = ptr->next;\r\n      } else {\r\n        error = str8_lit(\"first header doesn't have correct end\");\r\n      }\r\n    }\r\n  } else {\r\n    error = str8_lit(\"missing first header\");\r\n  }\r\n  \r\n  if (!error.size && ptr) {\r\n    if (str8_match_lit(\"/\", ptr->data.header.name, 0)) {\r\n      if (ptr->data.header.is_end_correct) {\r\n        second_header = ptr->data;\r\n        ptr = ptr->next;\r\n        has_second_header = 1;\r\n      } else {\r\n        error = str8_lit(\"second header doesn't have correct end\");\r\n      }\r\n    }\r\n  }\r\n  \r\n  if (!error.size && ptr) {\r\n    if (str8_match_lit(\"//\", ptr->data.header.name, 0)) {\r\n      if (ptr->data.header.is_end_correct) {\r\n        long_names_member = ptr->data;\r\n        ptr = ptr->next;\r\n        has_long_names;\r\n      } else {\r\n        error = str8_lit(\"long names header doesn't have correct end\");\r\n      }\r\n    }\r\n  }\r\n  \r\n  COFF_ArchiveParse parse = {0};\r\n  parse.has_second_header = has_second_header;\r\n  parse.has_long_names    = has_long_names;\r\n  parse.first_member      = coff_parse_first_archive_member(&first_header);\r\n  parse.second_member     = coff_parse_second_archive_member(&second_header);\r\n  parse.long_names        = long_names_member.data;\r\n  parse.error             = error;\r\n  \r\n  return parse;\r\n}\r\n\r\ninternal COFF_ArchiveParse\r\ncoff_regular_archive_parse_from_data(String8 raw_archive)\r\n{\r\n  COFF_ArchiveMemberList list = {0};\r\n  COFF_ArchiveMemberNode node_arr[3] = {0};\r\n  U64 cursor = coff_regular_archive_member_iter_init(raw_archive);\r\n  for (U64 i = 0; i < ArrayCount(node_arr); ++i) {\r\n    COFF_ArchiveMemberNode *node = &node_arr[i];\r\n    if (!coff_regular_archive_member_iter_next(raw_archive, &cursor, &node->data)) {\r\n      break;\r\n    }\r\n    coff_archive_member_list_push_node(&list, node);\r\n  }\r\n  return coff_archive_parse_from_member_list(list);\r\n}\r\n\r\ninternal COFF_ArchiveParse\r\ncoff_thin_archive_parse_from_data(String8 raw_archive)\r\n{\r\n  COFF_ArchiveMemberList list = {0};\r\n  COFF_ArchiveMemberNode node_arr[3] = {0};\r\n  U64 cursor = coff_thin_archive_member_iter_init(raw_archive);\r\n  for (U64 i = 0; i < ArrayCount(node_arr); i += 1) {\r\n    COFF_ArchiveMemberNode *node = &node_arr[i];\r\n    if (!coff_thin_archive_member_iter_next(raw_archive, &cursor, &node->data)) {\r\n      break;\r\n    }\r\n    coff_archive_member_list_push_node(&list, node);\r\n  }\r\n  return coff_archive_parse_from_member_list(list);\r\n}\r\n\r\ninternal COFF_ArchiveParse\r\ncoff_archive_parse_from_data(String8 raw_archive)\r\n{\r\n  COFF_ArchiveType type = coff_archive_type_from_data(raw_archive);\r\n  switch (type) {\r\n    case COFF_Archive_Null:    break;\r\n    case COFF_Archive_Regular: return coff_regular_archive_parse_from_data(raw_archive);\r\n    case COFF_Archive_Thin:    return coff_thin_archive_parse_from_data(raw_archive);\r\n  }\r\n  COFF_ArchiveParse null_parse = {0};\r\n  return null_parse;\r\n}\r\n\r\n"
  },
  {
    "path": "src/coff/coff_parse.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef COFF_PARSE_H\r\n#define COFF_PARSE_H\r\n\r\ntypedef struct COFF_FileHeaderInfo\r\n{\r\n  B32              is_big_obj;\r\n  COFF_MachineType machine;\r\n  U64              header_size;\r\n  U64              section_count_no_null;\r\n  U64              symbol_size;\r\n  U64              symbol_count;\r\n  Rng1U64          header_range;\r\n  Rng1U64          section_table_range;\r\n  Rng1U64          symbol_table_range;\r\n  Rng1U64          string_table_range;\r\n} COFF_FileHeaderInfo;\r\n\r\n////////////////////////////////\r\n\r\ntypedef struct COFF_SectionHeaderArray\r\n{\r\n  U64                 count;\r\n  COFF_SectionHeader *v;\r\n} COFF_SectionHeaderArray;\r\n\r\n////////////////////////////////\r\n\r\ntypedef struct COFF_Symbol16Node\r\n{\r\n  struct COFF_Symbol16Node *next;\r\n  COFF_Symbol16             data;\r\n} COFF_Symbol16Node;\r\n\r\ntypedef struct COFF_Symbol16List\r\n{\r\n  U64                count;\r\n  COFF_Symbol16Node *first;\r\n  COFF_Symbol16Node *last;\r\n} COFF_Symbol16List;\r\n\r\ntypedef struct COFF_Symbol32Array\r\n{\r\n  U64            count;\r\n  COFF_Symbol32 *v;\r\n} COFF_Symbol32Array;\r\n\r\ntypedef struct COFF_ParsedSymbol\r\n{\r\n  String8               name;\r\n  U64                   value;\r\n  U32                   section_number;\r\n  COFF_SymbolType       type;\r\n  COFF_SymStorageClass  storage_class;\r\n  U8                    aux_symbol_count;\r\n  void                 *raw_symbol;\r\n} COFF_ParsedSymbol;\r\n\r\ntypedef U32 COFF_SymbolValueInterpType;\r\nenum\r\n{\r\n  COFF_SymbolValueInterp_Regular,   // symbol has section and offset.\r\n  COFF_SymbolValueInterp_Weak,      // symbol is overridable.\r\n  COFF_SymbolValueInterp_Undefined, // symbol doesn't have a reference section.\r\n  COFF_SymbolValueInterp_Common,    // symbol has no section but still has size.\r\n  COFF_SymbolValueInterp_Abs,       // symbol has an absolute (non-relocatable) value and is not an address.\r\n  COFF_SymbolValueInterp_Debug      // symbol is used to provide general type of debugging information.\r\n};\r\n\r\n////////////////////////////////\r\n\r\ntypedef struct COFF_RelocNode\r\n{\r\n  struct COFF_RelocNode *next;\r\n  COFF_Reloc             data;\r\n} COFF_RelocNode;\r\n\r\ntypedef struct COFF_RelocList\r\n{\r\n  U64             count;\r\n  COFF_RelocNode *first;\r\n  COFF_RelocNode *last;\r\n} COFF_RelocList;\r\n\r\ntypedef struct COFF_RelocArray\r\n{\r\n  U64         count;\r\n  COFF_Reloc *v;\r\n} COFF_RelocArray;\r\n\r\ntypedef struct COFF_RelocInfo\r\n{\r\n  U64 array_off;\r\n  U64 count;\r\n} COFF_RelocInfo;\r\n\r\n////////////////////////////////\r\n\r\ntypedef U32 COFF_ResourceIDType;\r\nenum  COFF_ResourceIDTypeEnum\r\n{\r\n  COFF_ResourceIDType_Null,\r\n  COFF_ResourceIDType_Number,\r\n  COFF_ResourceIDType_String,\r\n  COFF_ResourceIDType_Count\r\n};\r\n\r\ntypedef struct COFF_ResourceID16\r\n{\r\n  COFF_ResourceIDType type;\r\n  union {\r\n    U16      number;\r\n    String16 string;\r\n  } u;\r\n} COFF_ResourceID16;\r\n\r\ntypedef struct COFF_ResourceID\r\n{\r\n  COFF_ResourceIDType type;\r\n  union {\r\n    U16     number;\r\n    String8 string;\r\n  } u;\r\n} COFF_ResourceID;\r\n\r\ntypedef struct COFF_ParsedResource\r\n{\r\n  COFF_ResourceID          type;\r\n  COFF_ResourceID          name;\r\n  U32                      data_version;\r\n  COFF_ResourceMemoryFlags memory_flags;\r\n  U16                      language_id;\r\n  U32                      version;\r\n  U32                      characteristics;\r\n  String8                  data;\r\n} COFF_ParsedResource;\r\n\r\ntypedef struct COFF_ParsedResourceNode\r\n{\r\n  struct COFF_ParsedResourceNode *next;\r\n  COFF_ParsedResource             data;\r\n} COFF_ParsedResourceNode;\r\n\r\ntypedef struct COFF_ParsedResourceList\r\n{\r\n  U64                      count;\r\n  COFF_ParsedResourceNode *first;\r\n  COFF_ParsedResourceNode *last;\r\n} COFF_ParsedResourceList;\r\n\r\n////////////////////////////////\r\n\r\ntypedef enum\r\n{\r\n  COFF_DataType_Null,\r\n  COFF_DataType_Obj,\r\n  COFF_DataType_BigObj,\r\n  COFF_DataType_Import\r\n} COFF_DataType;\r\n\r\ntypedef enum\r\n{\r\n  COFF_Archive_Null,\r\n  COFF_Archive_Regular,\r\n  COFF_Archive_Thin\r\n} COFF_ArchiveType;\r\n\r\ntypedef struct COFF_ParsedArchiveMemberHeader\r\n{\r\n  String8        name;           // padded to 16 bytes with spaces\r\n  COFF_TimeStamp time_stamp;\r\n  U32            user_id;        // unix artifact that does not have meaning on windows\r\n  U32            group_id;       // unix artifact that does not have meaning on windows\r\n  String8        mode;           // octal representation the members file mode\r\n  B32            is_end_correct; // set to true if found correct signature after header\r\n  Rng1U64        data_range;\r\n} COFF_ParsedArchiveMemberHeader;\r\n\r\ntypedef struct COFF_ParsedArchiveImportHeader\r\n{\r\n  B32               is_sig_correct;\r\n  U16               version;\r\n  COFF_MachineType  machine;\r\n  COFF_TimeStamp    time_stamp;\r\n  U32               data_size;\r\n  U16               hint_or_ordinal;\r\n  COFF_ImportType   type;\r\n  COFF_ImportByType import_by;\r\n  String8           func_name;\r\n  String8           dll_name;\r\n} COFF_ParsedArchiveImportHeader;\r\n\r\ntypedef struct COFF_ArchiveMember\r\n{\r\n  COFF_ParsedArchiveMemberHeader header;\r\n  U64                            offset;\r\n  String8                        data;\r\n} COFF_ArchiveMember;\r\n\r\ntypedef struct COFF_ArchiveFirstMember\r\n{\r\n  U32      symbol_count;\r\n  U64      member_offset_count;\r\n  U32     *member_offsets;\r\n  String8  string_table;\r\n} COFF_ArchiveFirstMember;\r\n\r\ntypedef struct COFF_ArchiveSecondMember\r\n{\r\n  U32      member_count;\r\n  U32      symbol_count;\r\n  U64      member_offset_count;\r\n  U32     *member_offsets;\r\n  U64      symbol_index_count;\r\n  U16     *symbol_indices;\r\n  String8  string_table;\r\n} COFF_ArchiveSecondMember;\r\n\r\ntypedef struct COFF_ArchiveMemberNode\r\n{\r\n  struct COFF_ArchiveMemberNode *next;\r\n  COFF_ArchiveMember             data;\r\n} COFF_ArchiveMemberNode;\r\n\r\ntypedef struct COFF_ArchiveMemberList\r\n{\r\n  U64                     count;\r\n  COFF_ArchiveMemberNode *first;\r\n  COFF_ArchiveMemberNode *last;\r\n} COFF_ArchiveMemberList;\r\n\r\ntypedef struct COFF_ArchiveParse\r\n{\r\n  B32                      has_second_header;\r\n  B32                      has_long_names;\r\n  COFF_ArchiveFirstMember  first_member;\r\n  COFF_ArchiveSecondMember second_member;\r\n  String8                  long_names;\r\n  String8                  error;\r\n} COFF_ArchiveParse;\r\n\r\n////////////////////////////////\r\n// Obj Header\r\n\r\ninternal B32 coff_is_big_obj(String8 raw_coff);\r\ninternal B32 coff_is_obj    (String8 raw_coff);\r\ninternal COFF_FileHeaderInfo coff_file_header_info_from_data(String8 raw_coff);\r\n\r\n////////////////////////////////\r\n// Section\r\n\r\ninternal COFF_SectionHeader ** coff_section_table_from_data(Arena *arena, String8 data, Rng1U64 section_table_range);\r\n\r\n////////////////////////////////\r\n// Symbol\r\n\r\ninternal COFF_ParsedSymbol coff_parse_symbol32(String8 string_table, COFF_Symbol32 *sym32);\r\ninternal COFF_ParsedSymbol coff_parse_symbol16(String8 string_table, COFF_Symbol16 *sym16);\r\ninternal COFF_ParsedSymbol coff_parse_symbol(COFF_FileHeaderInfo header, String8 string_table, String8 symbol_table, U32 symbol_idx);\r\n\r\ninternal COFF_Symbol32Array coff_symbol_array_from_data_16(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count);\r\ninternal COFF_Symbol32Array coff_symbol_array_from_data_32(Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count);\r\ninternal COFF_Symbol32Array coff_symbol_array_from_data   (Arena *arena, String8 data, U64 symbol_array_off, U64 symbol_count, U64 symbol_size);\r\n\r\ninternal COFF_Symbol16Node *coff_symbol16_list_push(Arena *arena, COFF_Symbol16List *list, COFF_Symbol16 symbol);\r\n\r\ninternal COFF_SymbolValueInterpType coff_interp_symbol(U32 section_number, U32 value, COFF_SymStorageClass storage_class);\r\ninternal COFF_SymbolValueInterpType coff_interp_from_parsed_symbol(COFF_ParsedSymbol symbol);\r\ninternal B32 coff_is_undefined_data_symbol(COFF_ParsedSymbol symbol);\r\n\r\ninternal void coff_parse_secdef(COFF_ParsedSymbol symbol, B32 is_big_obj, COFF_ComdatSelectType *selection_out, U32 *number_out, U32 *length_out, U32 *check_sum_out);\r\ninternal COFF_SymbolWeakExt * coff_parse_weak_tag(COFF_ParsedSymbol symbol, B32 is_big_obj);\r\n\r\n////////////////////////////////\r\n// Reloc\r\n\r\ninternal COFF_RelocInfo coff_reloc_info_from_section_header(String8 data, COFF_SectionHeader *header);\r\n\r\n////////////////////////////////\r\n// Resource\r\n\r\ninternal String8         coff_resource_string_from_str16 (Arena *arena, String16 string);\r\ninternal String8         coff_resource_string_from_str8  (Arena *arena, String8 string);\r\ninternal String8         coff_resource_number_from_u16   (Arena *arena, U16 number);\r\ninternal COFF_ResourceID coff_utf8_resource_id_from_utf16(Arena *arena, COFF_ResourceID16 *id_16);\r\n\r\ninternal U64                     coff_read_resource_id_utf16 (String8 raw_res, U64 off, COFF_ResourceID16 *id_out);\r\ninternal U64                     coff_read_resource          (Arena *arena, String8 raw_res, U64 off, COFF_ParsedResource *res_out);\r\ninternal COFF_ParsedResourceList coff_resource_list_from_data(Arena *arena, String8 data);\r\n\r\ninternal String8 coff_write_resource_id(Arena *arena, COFF_ResourceID id);\r\ninternal String8 coff_write_resource   (Arena *arena, COFF_ResourceID type, COFF_ResourceID name, U32 data_version, COFF_ResourceMemoryFlags memory_flags, U16 language_id, U32 version, U32 characteristics, String8 data);\r\n\r\ninternal int coff_resource_id_compar(void *raw_a, void *raw_b); // COFF_ResourceID\r\n\r\n////////////////////////////////\r\n// Archive\r\n\r\ninternal B32              coff_is_import             (String8 raw_archive_member);\r\ninternal COFF_DataType    coff_data_type_from_data   (String8 raw_archive_member);\r\ninternal B32              coff_is_regular_archive    (String8 raw_archive);\r\ninternal B32              coff_is_thin_archive       (String8 raw_archive);\r\ninternal COFF_ArchiveType coff_archive_type_from_data(String8 raw_archive);\r\n\r\ninternal U64                      coff_parse_archive_member_header(String8 raw_archive, U64 offset, COFF_ParsedArchiveMemberHeader *header_out);\r\ninternal COFF_ArchiveFirstMember  coff_parse_first_archive_member (COFF_ArchiveMember *member);\r\ninternal COFF_ArchiveSecondMember coff_parse_second_archive_member(COFF_ArchiveMember *member);\r\ninternal String8                  coff_decode_raw_member_name     (String8 long_names, String8 name);\r\ninternal String8                  coff_decode_member_name         (String8 long_names, String8 name);\r\ninternal U64                      coff_parse_import               (String8 raw_archive_member, U64 offset, COFF_ParsedArchiveImportHeader *header_out);\r\n\r\ninternal COFF_ArchiveMember             coff_archive_member_from_offset(String8 raw_archive, U64 offset);\r\ninternal COFF_ArchiveMember             coff_archive_member_from_data  (String8 raw_archive_member);\r\ninternal COFF_ParsedArchiveImportHeader coff_archive_import_from_data  (String8 raw_archive_member);\r\n\r\ninternal U64 coff_regular_archive_member_iter_init(String8 raw_archive);\r\ninternal B32 coff_regular_archive_member_iter_next(String8 raw_archive, U64 *offset, COFF_ArchiveMember *member_out);\r\n\r\ninternal U64 coff_thin_archive_member_iter_init(String8 raw_archive);\r\ninternal B32 coff_thin_archive_member_iter_next(String8 raw_archive, U64 *offset, COFF_ArchiveMember *member_out);\r\n\r\ninternal COFF_ArchiveParse coff_regular_archive_parse_from_member_list(COFF_ArchiveMemberList list);\r\ninternal COFF_ArchiveParse coff_thin_archive_parse_from_data          (String8 raw_archive);\r\ninternal COFF_ArchiveParse coff_regular_archive_parse_from_data       (String8 raw_archive);\r\ninternal COFF_ArchiveParse coff_archive_parse_from_data               (String8 raw_archive);\r\n\r\n#endif // COFF_PARSE_H\r\n"
  },
  {
    "path": "src/config/config_bindings.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal CFG_KeyMap *\r\ncfg_key_map_from_cfg(Arena *arena)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  CFG_KeyMap *key_map = push_array(arena, CFG_KeyMap, 1);\r\n  {\r\n    key_map->name_slots_count = 4096;\r\n    key_map->name_slots = push_array(arena, CFG_KeyMapSlot, key_map->name_slots_count);\r\n    key_map->binding_slots_count = 4096;\r\n    key_map->binding_slots = push_array(arena, CFG_KeyMapSlot, key_map->binding_slots_count);\r\n    \r\n    //- rjf: gather & parse all explicitly stored keybinding sets\r\n    CFG_NodePtrList keybindings_cfg_list = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"keybindings\"));\r\n    for(CFG_NodePtrNode *n = keybindings_cfg_list.first; n != 0; n = n->next)\r\n    {\r\n      CFG_Node *keybindings_root = n->v;\r\n      for(CFG_Node *keybinding = keybindings_root->first; keybinding != &cfg_nil_node; keybinding = keybinding->next)\r\n      {\r\n        String8 name = {0};\r\n        CFG_Binding binding = {0};\r\n        for(CFG_Node *child = keybinding->first; child != &cfg_nil_node; child = child->next)\r\n        {\r\n          if(0){}\r\n          else if(str8_match(child->string, str8_lit(\"ctrl\"), 0))   { binding.modifiers |= OS_Modifier_Ctrl; }\r\n          else if(str8_match(child->string, str8_lit(\"alt\"), 0))    { binding.modifiers |= OS_Modifier_Alt; }\r\n          else if(str8_match(child->string, str8_lit(\"shift\"), 0))  { binding.modifiers |= OS_Modifier_Shift; }\r\n          else\r\n          {\r\n            OS_Key key = OS_Key_Null;\r\n            for EachEnumVal(OS_Key, k)\r\n            {\r\n              if(str8_match(child->string, os_g_key_cfg_string_table[k], StringMatchFlag_CaseInsensitive))\r\n              {\r\n                key = k;\r\n                break;\r\n              }\r\n            }\r\n            if(key != OS_Key_Null)\r\n            {\r\n              binding.key = key;\r\n            }\r\n            else\r\n            {\r\n              name = child->string;\r\n            }\r\n          }\r\n        }\r\n        if(name.size != 0)\r\n        {\r\n          U64 name_hash = d_hash_from_string(name);\r\n          U64 binding_hash = d_hash_from_string(str8_struct(&binding));\r\n          U64 name_slot_idx = name_hash%key_map->name_slots_count;\r\n          U64 binding_slot_idx = binding_hash%key_map->binding_slots_count;\r\n          CFG_KeyMapNode *n = push_array(arena, CFG_KeyMapNode, 1);\r\n          n->cfg_id = keybinding->id;\r\n          n->name = push_str8_copy(arena, name);\r\n          n->binding = binding;\r\n          SLLQueuePush_N(key_map->name_slots[name_slot_idx].first, key_map->name_slots[name_slot_idx].last, n, name_hash_next);\r\n          SLLQueuePush_N(key_map->binding_slots[binding_slot_idx].first, key_map->binding_slots[binding_slot_idx].last, n, binding_hash_next);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return key_map;\r\n}\r\n\r\ninternal CFG_KeyMapNodePtrList\r\ncfg_key_map_node_ptr_list_from_name(Arena *arena, CFG_KeyMap *key_map, String8 string)\r\n{\r\n  CFG_KeyMapNodePtrList list = {0};\r\n  {\r\n    U64 hash = d_hash_from_string(string);\r\n    U64 slot_idx = hash%key_map->name_slots_count;\r\n    for(CFG_KeyMapNode *n = key_map->name_slots[slot_idx].first; n != 0; n = n->name_hash_next)\r\n    {\r\n      if(str8_match(n->name, string, 0))\r\n      {\r\n        CFG_KeyMapNodePtr *ptr = push_array(arena, CFG_KeyMapNodePtr, 1);\r\n        ptr->v = n;\r\n        SLLQueuePush(list.first, list.last, ptr);\r\n        list.count += 1;\r\n      }\r\n    }\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal CFG_KeyMapNodePtrList\r\ncfg_key_map_node_ptr_list_from_binding(Arena *arena, CFG_KeyMap *key_map, CFG_Binding binding)\r\n{\r\n  CFG_KeyMapNodePtrList list = {0};\r\n  {\r\n    U64 hash = d_hash_from_string(str8_struct(&binding));\r\n    U64 slot_idx = hash%key_map->binding_slots_count;\r\n    for(CFG_KeyMapNode *n = key_map->binding_slots[slot_idx].first; n != 0; n = n->binding_hash_next)\r\n    {\r\n      if(MemoryMatchStruct(&binding, &n->binding))\r\n      {\r\n        CFG_KeyMapNodePtr *ptr = push_array(arena, CFG_KeyMapNodePtr, 1);\r\n        ptr->v = n;\r\n        SLLQueuePush(list.first, list.last, ptr);\r\n        list.count += 1;\r\n      }\r\n    }\r\n  }\r\n  return list;\r\n}\r\n"
  },
  {
    "path": "src/config/config_bindings.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CONFIG_BINDINGS_H\r\n#define CONFIG_BINDINGS_H\r\n\r\ntypedef struct CFG_Binding CFG_Binding;\r\nstruct CFG_Binding\r\n{\r\n  OS_Key key;\r\n  OS_Modifiers modifiers;\r\n};\r\n\r\ntypedef struct CFG_KeyMapNode CFG_KeyMapNode;\r\nstruct CFG_KeyMapNode\r\n{\r\n  CFG_KeyMapNode *name_hash_next;\r\n  CFG_KeyMapNode *binding_hash_next;\r\n  CFG_ID cfg_id;\r\n  String8 name;\r\n  CFG_Binding binding;\r\n};\r\n\r\ntypedef struct CFG_KeyMapNodePtr CFG_KeyMapNodePtr;\r\nstruct CFG_KeyMapNodePtr\r\n{\r\n  CFG_KeyMapNodePtr *next;\r\n  CFG_KeyMapNode *v;\r\n};\r\n\r\ntypedef struct CFG_KeyMapNodePtrList CFG_KeyMapNodePtrList;\r\nstruct CFG_KeyMapNodePtrList\r\n{\r\n  CFG_KeyMapNodePtr *first;\r\n  CFG_KeyMapNodePtr *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CFG_KeyMapSlot CFG_KeyMapSlot;\r\nstruct CFG_KeyMapSlot\r\n{\r\n  CFG_KeyMapNode *first;\r\n  CFG_KeyMapNode *last;\r\n};\r\n\r\ntypedef struct CFG_KeyMap CFG_KeyMap;\r\nstruct CFG_KeyMap\r\n{\r\n  U64 name_slots_count;\r\n  CFG_KeyMapSlot *name_slots;\r\n  U64 binding_slots_count;\r\n  CFG_KeyMapSlot *binding_slots;\r\n};\r\n\r\ninternal CFG_KeyMap *cfg_key_map_from_cfg(Arena *arena);\r\ninternal CFG_KeyMapNodePtrList cfg_key_map_node_ptr_list_from_name(Arena *arena, CFG_KeyMap *key_map, String8 string);\r\ninternal CFG_KeyMapNodePtrList cfg_key_map_node_ptr_list_from_binding(Arena *arena, CFG_KeyMap *key_map, CFG_Binding binding);\r\n\r\n#endif // CONFIG_BINDINGS_H\r\n"
  },
  {
    "path": "src/config/config_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: ID Functions\r\n\r\ninternal void\r\ncfg_id_list_push(Arena *arena, CFG_IDList *list, CFG_ID id)\r\n{\r\n  CFG_IDNode *n = push_array(arena, CFG_IDNode, 1);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  n->v = id;\r\n}\r\n\r\ninternal CFG_IDList\r\ncfg_id_list_copy(Arena *arena, CFG_IDList *src)\r\n{\r\n  CFG_IDList dst = {0};\r\n  for EachNode(n, CFG_IDNode, src->first)\r\n  {\r\n    cfg_id_list_push(arena, &dst, n->v);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Pointer Data Structure Functions\r\n\r\ninternal void\r\ncfg_node_ptr_list_push(Arena *arena, CFG_NodePtrList *list, CFG_Node *node)\r\n{\r\n  CFG_NodePtrNode *n = push_array(arena, CFG_NodePtrNode, 1);\r\n  DLLPushBack(list->first, list->last, n);\r\n  list->count += 1;\r\n  n->v = node;\r\n}\r\n\r\ninternal void\r\ncfg_node_ptr_list_push_front(Arena *arena, CFG_NodePtrList *list, CFG_Node *node)\r\n{\r\n  CFG_NodePtrNode *n = push_array(arena, CFG_NodePtrNode, 1);\r\n  DLLPushFront(list->first, list->last, n);\r\n  list->count += 1;\r\n  n->v = node;\r\n}\r\n\r\ninternal CFG_NodePtrArray\r\ncfg_node_ptr_array_from_list(Arena *arena, CFG_NodePtrList *list)\r\n{\r\n  CFG_NodePtrArray array = {0};\r\n  array.count = list->count;\r\n  array.v = push_array_no_zero(arena, CFG_Node *, array.count);\r\n  {\r\n    U64 idx = 0;\r\n    for EachNode(n, CFG_NodePtrNode, list->first)\r\n    {\r\n      array.v[idx] = n->v;\r\n      idx += 1;\r\n    }\r\n  }\r\n  return array;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Schema Data Structure Functions\r\n\r\ninternal void\r\ncfg_schema_table_insert(Arena *arena, CFG_SchemaTable *table, String8 name, MD_Node *schema)\r\n{\r\n  U64 hash = u64_hash_from_str8(name);\r\n  U64 slot_idx = hash%table->slots_count;\r\n  CFG_SchemaNode *node = 0;\r\n  for(CFG_SchemaNode *n = table->slots[slot_idx]; n != 0; n = n->next)\r\n  {\r\n    if(str8_match(n->name, name, 0))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node == 0)\r\n  {\r\n    node = push_array(arena, CFG_SchemaNode, 1);\r\n    node->name = str8_copy(arena, name);\r\n    node->schema = schema;\r\n    SLLStackPush(table->slots[slot_idx], node);\r\n  }\r\n}\r\n\r\ninternal MD_Node *\r\ncfg_schema_from_name(CFG_SchemaTable *table, String8 name)\r\n{\r\n  MD_Node *result = &md_nil_node;\r\n  {\r\n    U64 hash = u64_hash_from_str8(name);\r\n    U64 slot_idx = hash%table->slots_count;\r\n    CFG_SchemaNode *node = 0;\r\n    for(CFG_SchemaNode *n = table->slots[slot_idx]; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->name, name, 0))\r\n      {\r\n        result = n->schema;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MD_NodePtrList\r\ncfg_schemas_from_name(Arena *arena, CFG_SchemaTable *table, String8 name)\r\n{\r\n  MD_NodePtrList result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8List tasks = {0};\r\n    String8Node seed_task = {0, name};\r\n    str8_list_push_node(&tasks, &seed_task);\r\n    for EachNode(task, String8Node, tasks.first)\r\n    {\r\n      MD_Node *schema = cfg_schema_from_name(table, task->string);\r\n      if(!md_node_is_nil(schema))\r\n      {\r\n        md_node_ptr_list_push_front(arena, &result, schema);\r\n        for MD_EachNode(tag, schema->first_tag)\r\n        {\r\n          if(str8_match(tag->string, str8_lit(\"inherit\"), 0))\r\n          {\r\n            str8_list_push(scratch.arena, &tasks, tag->first->string);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Config Reading Functions\r\n\r\n//- rjf: context selection\r\n\r\ninternal void\r\ncfg_ctx_select(CFG_Ctx *ctx)\r\n{\r\n  cfg_ctx = ctx;\r\n}\r\n\r\n//- rjf: tree navigations\r\n\r\ninternal U64\r\ncfg_change_gen(void)\r\n{\r\n  U64 result = 0;\r\n  if(cfg_ctx != 0)\r\n  {\r\n    result = cfg_ctx->change_gen;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_root(void)\r\n{\r\n  CFG_Node *result = &cfg_nil_node;\r\n  if(cfg_ctx != 0)\r\n  {\r\n    result = cfg_ctx->root;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_from_id(CFG_ID id)\r\n{\r\n  CFG_Node *result = &cfg_nil_node;\r\n  if(id != 0 &&\r\n     id == cfg_ctx->last_accessed_id &&\r\n     id == cfg_ctx->last_accessed->id)\r\n  {\r\n    result = cfg_ctx->last_accessed;\r\n  }\r\n  else\r\n  {\r\n    U64 hash = u64_hash_from_str8(str8_struct(&id));\r\n    U64 slot_idx = hash%cfg_ctx->id_slots_count;\r\n    for(CFG_NodePtrNode *n = cfg_ctx->id_slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      if(n->v->id == id)\r\n      {\r\n        result = n->v;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  cfg_ctx->last_accessed_id = id;\r\n  cfg_ctx->last_accessed = result;\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_child_from_string(CFG_Node *parent, String8 string)\r\n{\r\n  CFG_Node *child = &cfg_nil_node;\r\n  if(string.size != 0)\r\n  {\r\n    for(CFG_Node *c = parent->first; c != &cfg_nil_node; c = c->next)\r\n    {\r\n      if(str8_match(c->string, string, 0))\r\n      {\r\n        child = c;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return child;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_child_from_string_or_parent(CFG_Node *parent, String8 string)\r\n{\r\n  CFG_Node *result = cfg_node_child_from_string(parent, string);\r\n  if(result == &cfg_nil_node)\r\n  {\r\n    result = parent;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_NodePtrList\r\ncfg_node_child_list_from_string(Arena *arena, CFG_Node *parent, String8 string)\r\n{\r\n  CFG_NodePtrList result = {0};\r\n  for(CFG_Node *child = parent->first; child != &cfg_nil_node; child = child->next)\r\n  {\r\n    if(str8_match(child->string, string, 0))\r\n    {\r\n      cfg_node_ptr_list_push(arena, &result, child);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_NodePtrList\r\ncfg_node_top_level_list_from_string(Arena *arena, String8 string)\r\n{\r\n  CFG_NodePtrList result = {0};\r\n  for(CFG_Node *bucket = cfg_ctx->root->first; bucket != &cfg_nil_node; bucket = bucket->next)\r\n  {\r\n    for(CFG_Node *tln = bucket->first; tln != &cfg_nil_node; tln = tln->next)\r\n    {\r\n      if(str8_match(tln->string, string, 0))\r\n      {\r\n        cfg_node_ptr_list_push(arena, &result, tln);\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_NodeRec\r\ncfg_node_rec__depth_first(CFG_Node *root, CFG_Node *node)\r\n{\r\n  CFG_NodeRec rec = {&cfg_nil_node};\r\n  if(node->first != &cfg_nil_node)\r\n  {\r\n    rec.next = node->first;\r\n    rec.push_count = 1;\r\n  }\r\n  else for(CFG_Node *p = node; p != root; p = p->parent, rec.pop_count += 1)\r\n  {\r\n    if(p->next != &cfg_nil_node)\r\n    {\r\n      rec.next = p->next;\r\n      break;\r\n    }\r\n  }\r\n  return rec;\r\n}\r\n\r\n//- rjf: serialization\r\n\r\ninternal String8\r\ncfg_string_from_tree(Arena *arena, CFG_SchemaTable *schema_table, String8 root_path, CFG_Node *root)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strings = {0};\r\n  {\r\n    typedef struct NestTask NestTask;\r\n    struct NestTask\r\n    {\r\n      NestTask *next;\r\n      CFG_Node *cfg;\r\n      MD_Node *schema;\r\n      B32 is_simple;\r\n    };\r\n    NestTask *top_nest_task = 0;\r\n    CFG_NodeRec rec = {0};\r\n    for(CFG_Node *c = root; c != &cfg_nil_node; c = rec.next)\r\n    {\r\n      // rjf: look up parent's schemas\r\n      MD_NodePtrList schemas = {0};\r\n      if(top_nest_task != 0)\r\n      {\r\n        CFG_Node *parent = top_nest_task->cfg;\r\n        schemas = cfg_schemas_from_name(scratch.arena, schema_table, parent->string);\r\n      }\r\n      \r\n      // rjf: look up child schema\r\n      MD_Node *c_schema = &md_nil_node;\r\n      for(MD_NodePtrNode *n = schemas.first; n != 0 && c_schema == &md_nil_node; n = n->next)\r\n      {\r\n        c_schema = md_child_from_string(n->v, c->string, 0);\r\n      }\r\n      \r\n      // rjf: push name of this node\r\n      if(c->string.size != 0 || c->first == &cfg_nil_node)\r\n      {\r\n        // rjf: extract the textualized form for this string (we may need to escape / relativize)\r\n        String8 c_serialized_string = c->string;\r\n        {\r\n          MD_Node *c_schema = &md_nil_node;\r\n          if(top_nest_task != 0)\r\n          {\r\n            c_schema = top_nest_task->schema;\r\n          }\r\n          \r\n          // rjf: paths -> relativize\r\n          if(!md_node_has_tag(c_schema->first, str8_lit(\"no_relativize\"), 0))\r\n          {\r\n            if(str8_match(c_schema->first->string, str8_lit(\"path\"), 0))\r\n            {\r\n              String8 path_absolute = c->string;\r\n              String8 path_relative = path_relative_dst_from_absolute_dst_src(arena, path_absolute, root_path);\r\n              c_serialized_string = path_relative;\r\n            }\r\n            else if(str8_match(c_schema->first->string, str8_lit(\"path_pt\"), 0))\r\n            {\r\n              String8 value = c->string;\r\n              String8TxtPtPair parts = str8_txt_pt_pair_from_string(value);\r\n              String8 path_relative = path_relative_dst_from_absolute_dst_src(scratch.arena, parts.string, root_path);\r\n              c_serialized_string = push_str8f(arena, \"%S:%I64d:%I64d\", path_relative, parts.pt.line, parts.pt.column);\r\n            }\r\n          }\r\n          \r\n          // rjf: all strings -> escape\r\n          c_serialized_string = escaped_from_raw_str8(arena, c_serialized_string);\r\n        }\r\n        \r\n        // rjf: generate all strings for this node's string\r\n        String8List c_name_strings = {0};\r\n        {\r\n          B32 name_can_be_pushed_standalone = 0;\r\n          {\r\n            Temp temp = temp_begin(scratch.arena);\r\n            MD_TokenizeResult c_name_tokenize = md_tokenize_from_text(temp.arena, c_serialized_string);\r\n            name_can_be_pushed_standalone = (c_name_tokenize.tokens.count == 1 && c_name_tokenize.tokens.v[0].flags & (MD_TokenFlag_Identifier|\r\n                                                                                                                       MD_TokenFlag_Numeric|\r\n                                                                                                                       MD_TokenFlag_StringLiteral|\r\n                                                                                                                       MD_TokenFlag_Symbol));\r\n            temp_end(temp);\r\n          }\r\n          if(name_can_be_pushed_standalone)\r\n          {\r\n            str8_list_push(scratch.arena, &c_name_strings, c_serialized_string);\r\n          }\r\n          else\r\n          {\r\n            str8_list_push(scratch.arena, &c_name_strings, str8_lit(\"\\\"\"));\r\n            str8_list_push(scratch.arena, &c_name_strings, c_serialized_string);\r\n            str8_list_push(scratch.arena, &c_name_strings, str8_lit(\"\\\"\"));\r\n          }\r\n        }\r\n        \r\n        // rjf: if we're in a simple nesting task, then just break children by space\r\n        if(top_nest_task != 0 && top_nest_task->is_simple)\r\n        {\r\n          str8_list_push(scratch.arena, &strings, str8_lit(\" \"));\r\n        }\r\n        \r\n        // rjf: join c's strings with main string list\r\n        str8_list_concat_in_place(&strings, &c_name_strings);\r\n      }\r\n      \r\n      // rjf: grab next recursion\r\n      rec = cfg_node_rec__depth_first(root, c);\r\n      \r\n      // rjf: push a new nesting task before descending to children\r\n      if(c->first != &cfg_nil_node)\r\n      {\r\n        B32 is_simple_children_list = 1;\r\n        for(CFG_Node *child = c->first; child != &cfg_nil_node; child = child->next)\r\n        {\r\n          if(child->first != &cfg_nil_node && child != c->last)\r\n          {\r\n            is_simple_children_list = 0;\r\n            break;\r\n          }\r\n        }\r\n        NestTask *task = push_array(scratch.arena, NestTask, 1);\r\n        task->cfg = c;\r\n        task->schema = c_schema;\r\n        task->is_simple = is_simple_children_list;\r\n        SLLStackPush(top_nest_task, task);\r\n      }\r\n      \r\n      // rjf: tree navigations -> encode hierarchy\r\n      if(rec.push_count > 0)\r\n      {\r\n        if(top_nest_task->is_simple && c->string.size != 0)\r\n        {\r\n          str8_list_push(scratch.arena, &strings, str8_lit(\":\"));\r\n        }\r\n        else\r\n        {\r\n          if(c->string.size != 0)\r\n          {\r\n            str8_list_push(scratch.arena, &strings, str8_lit(\":\\n\"));\r\n          }\r\n          str8_list_push(scratch.arena, &strings, str8_lit(\"{\"));\r\n        }\r\n      }\r\n      else\r\n      {\r\n        for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1, SLLStackPop(top_nest_task))\r\n        {\r\n          if(top_nest_task->is_simple)\r\n          {\r\n            if(top_nest_task->cfg->string.size == 0)\r\n            {\r\n              str8_list_push(scratch.arena, &strings, str8_lit(\" }\"));\r\n            }\r\n          }\r\n          else\r\n          {\r\n            str8_list_push(scratch.arena, &strings, str8_lit(\"\\n}\"));\r\n          }\r\n        }\r\n      }\r\n      if(!top_nest_task || top_nest_task->is_simple == 0)\r\n      {\r\n        str8_list_push(scratch.arena, &strings, str8_lit(\"\\n\"));\r\n      }\r\n    }\r\n  }\r\n  String8 result_unindented = str8_list_join(scratch.arena, &strings, 0);\r\n  String8 result = indented_from_string(arena, result_unindented);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Config Writing Functions\r\n\r\n//- rjf: state creation / destroying\r\n\r\ninternal CFG_State *\r\ncfg_state_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  CFG_State *state = push_array(arena, CFG_State, 1);\r\n  state->arena = arena;\r\n  state->ctx.id_slots_count = 4096;\r\n  state->ctx.id_slots = push_array(arena, CFG_NodePtrSlot, state->ctx.id_slots_count);\r\n  state->ctx.root = cfg_node_alloc(state);\r\n  return state;\r\n}\r\n\r\ninternal void\r\ncfg_state_release(CFG_State *state)\r\n{\r\n  arena_release(state->arena);\r\n}\r\n\r\n//- rjf: state -> ctx\r\n\r\ninternal CFG_Ctx *\r\ncfg_state_ctx(CFG_State *state)\r\n{\r\n  CFG_Ctx *ctx = &state->ctx;\r\n  return ctx;\r\n}\r\n\r\n//- rjf: string allocations\r\n\r\ninternal U64\r\ncfg_string_bucket_num_from_size(U64 size)\r\n{\r\n  U64 bucket_num = 0;\r\n  if(size > 0)\r\n  {\r\n    for EachElement(idx, cfg_string_bucket_chunk_sizes)\r\n    {\r\n      if(size <= cfg_string_bucket_chunk_sizes[idx])\r\n      {\r\n        bucket_num = idx+1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return bucket_num;\r\n}\r\n\r\ninternal String8\r\ncfg_string_alloc(CFG_State *state, String8 string)\r\n{\r\n  //- rjf: allocate node\r\n  CFG_StringChunkNode *node = 0;\r\n  {\r\n    U64 bucket_num = cfg_string_bucket_num_from_size(string.size);\r\n    if(bucket_num == ArrayCount(cfg_string_bucket_chunk_sizes))\r\n    {\r\n      CFG_StringChunkNode *best_node = 0;\r\n      CFG_StringChunkNode *best_node_prev = 0;\r\n      U64 best_node_size = max_U64;\r\n      {\r\n        for(CFG_StringChunkNode *n = state->free_string_chunks[bucket_num-1], *prev = 0; n != 0; (prev = n, n = n->next))\r\n        {\r\n          if(n->size >= string.size && n->size < best_node_size)\r\n          {\r\n            best_node = n;\r\n            best_node_prev = prev;\r\n            best_node_size = n->size;\r\n          }\r\n        }\r\n      }\r\n      if(best_node != 0)\r\n      {\r\n        node = best_node;\r\n        if(best_node_prev)\r\n        {\r\n          best_node_prev->next = best_node->next;\r\n        }\r\n        else\r\n        {\r\n          state->free_string_chunks[bucket_num-1] = best_node->next;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        U64 chunk_size = u64_up_to_pow2(string.size);\r\n        node = (CFG_StringChunkNode *)push_array(state->arena, U8, chunk_size);\r\n      }\r\n    }\r\n    else if(bucket_num != 0)\r\n    {\r\n      node = state->free_string_chunks[bucket_num-1];\r\n      if(node != 0)\r\n      {\r\n        SLLStackPop(state->free_string_chunks[bucket_num-1]);\r\n      }\r\n      else\r\n      {\r\n        node = (CFG_StringChunkNode *)push_array(state->arena, U8, cfg_string_bucket_chunk_sizes[bucket_num-1]);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill node\r\n  String8 result = {0};\r\n  if(node != 0)\r\n  {\r\n    result.str = (U8 *)node;\r\n    result.size = string.size;\r\n    MemoryCopy(result.str, string.str, result.size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ncfg_string_release(CFG_State *state, String8 string)\r\n{\r\n  U64 bucket_num = cfg_string_bucket_num_from_size(string.size);\r\n  if(1 <= bucket_num && bucket_num <= ArrayCount(cfg_string_bucket_chunk_sizes))\r\n  {\r\n    U64 bucket_idx = bucket_num-1;\r\n    CFG_StringChunkNode *node = (CFG_StringChunkNode *)string.str;\r\n    SLLStackPush(state->free_string_chunks[bucket_idx], node);\r\n    node->size = u64_up_to_pow2(string.size);\r\n  }\r\n}\r\n\r\n//- rjf: tree building\r\n\r\ninternal CFG_Node *\r\ncfg_node_alloc(CFG_State *state)\r\n{\r\n  state->ctx.change_gen += 1;\r\n  \r\n  // rjf: allocate\r\n  CFG_Node *result = state->free;\r\n  {\r\n    if(result)\r\n    {\r\n      SLLStackPop(state->free);\r\n    }\r\n    else\r\n    {\r\n      result = push_array_no_zero(state->arena, CFG_Node, 1);\r\n    }\r\n  }\r\n  \r\n  // rjf: generate ID & fill\r\n  state->id_gen += 1;\r\n  MemoryZeroStruct(result);\r\n  result->first = result->last = result->next = result->prev = result->parent = &cfg_nil_node;\r\n  result->id = state->id_gen;\r\n  \r\n  // rjf: store to ID -> cfg map\r\n  {\r\n    CFG_NodePtrNode *cfg_id_node = state->free_id_node;\r\n    if(cfg_id_node != 0)\r\n    {\r\n      SLLStackPop(state->free_id_node);\r\n    }\r\n    else\r\n    {\r\n      cfg_id_node = push_array(state->arena, CFG_NodePtrNode, 1);\r\n    }\r\n    U64 hash = u64_hash_from_str8(str8_struct(&result->id));\r\n    U64 slot_idx = hash%state->ctx.id_slots_count;\r\n    DLLPushBack(state->ctx.id_slots[slot_idx].first, state->ctx.id_slots[slot_idx].last, cfg_id_node);\r\n    cfg_id_node->v = result;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal void\r\ncfg_node_release(CFG_State *state, CFG_Node *node)\r\n{\r\n  state->ctx.change_gen += 1;\r\n  \r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  // rjf: unhook from context\r\n  cfg_node_unhook(state, node->parent, node);\r\n  \r\n  // rjf: gather root & all descendants\r\n  CFG_NodePtrList nodes = {0};\r\n  for(CFG_Node *c = node; c != &cfg_nil_node; c = cfg_node_rec__depth_first(node, c).next)\r\n  {\r\n    cfg_node_ptr_list_push(scratch.arena, &nodes, c);\r\n  }\r\n  \r\n  // rjf: release all nodes\r\n  for(CFG_NodePtrNode *n = nodes.first; n != 0; n = n->next)\r\n  {\r\n    CFG_Node *c = n->v;\r\n    cfg_string_release(state, c->string);\r\n    SLLStackPush(state->free, c);\r\n    c->first = c->last = c->prev = c->parent = 0;\r\n    c->id = 0;\r\n    c->string = str8_zero();\r\n    U64 hash = u64_hash_from_str8(str8_struct(&c->id));\r\n    U64 slot_idx = hash%state->ctx.id_slots_count;\r\n    for(CFG_NodePtrNode *n = state->ctx.id_slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      if(n->v == c)\r\n      {\r\n        DLLRemove(state->ctx.id_slots[slot_idx].first, state->ctx.id_slots[slot_idx].last, n);\r\n        SLLStackPush(state->free_id_node, n);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\ncfg_node_release_all_children(CFG_State *state, CFG_Node *node)\r\n{\r\n  for(CFG_Node *child = node->first, *next = &cfg_nil_node; child != &cfg_nil_node; child = next)\r\n  {\r\n    next = child->next;\r\n    cfg_node_release(state, child);\r\n  }\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_new(CFG_State *state, CFG_Node *parent, String8 string)\r\n{\r\n  CFG_Node *node = cfg_node_alloc(state);\r\n  cfg_node_insert_child(state, parent, parent->last, node);\r\n  cfg_node_equip_string(state, node, string);\r\n  return node;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_newf(CFG_State *state, CFG_Node *parent, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  CFG_Node *result = cfg_node_new(state, parent, string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_new_replace(CFG_State *state, CFG_Node *parent, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  string = push_str8_copy(scratch.arena, string);\r\n  for(CFG_Node *child = parent->first->next, *next = &cfg_nil_node; child != &cfg_nil_node; child = next)\r\n  {\r\n    next = child->next;\r\n    cfg_node_release(state, child);\r\n  }\r\n  if(parent->first == &cfg_nil_node)\r\n  {\r\n    cfg_node_new(state, parent, str8_zero());\r\n  }\r\n  CFG_Node *child = parent->first;\r\n  cfg_node_equip_string(state, child, string);\r\n  scratch_end(scratch);\r\n  return child;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_new_replacef(CFG_State *state, CFG_Node *parent, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  CFG_Node *result = cfg_node_new_replace(state, parent, string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_deep_copy(CFG_State *state, CFG_Node *src_root)\r\n{\r\n  CFG_NodeRec rec = {0};\r\n  CFG_Node *dst_root = &cfg_nil_node;\r\n  CFG_Node *dst_parent = &cfg_nil_node;\r\n  for(CFG_Node *src = src_root; src != &cfg_nil_node; src = rec.next)\r\n  {\r\n    CFG_Node *dst = cfg_node_new(state, dst_parent, src->string);\r\n    if(dst_root == &cfg_nil_node)\r\n    {\r\n      dst_root = dst;\r\n    }\r\n    rec = cfg_node_rec__depth_first(src_root, src);\r\n    if(rec.push_count > 0)\r\n    {\r\n      dst_parent = dst;\r\n    }\r\n    else for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1)\r\n    {\r\n      dst_parent = dst_parent->parent;\r\n    }\r\n  }\r\n  return dst_root;\r\n}\r\n\r\ninternal void\r\ncfg_node_equip_string(CFG_State *state, CFG_Node *node, String8 string)\r\n{\r\n  cfg_string_release(state, node->string);\r\n  node->string = cfg_string_alloc(state, string);\r\n  state->ctx.change_gen += 1;\r\n}\r\n\r\ninternal void\r\ncfg_node_equip_stringf(CFG_State *state, CFG_Node *node, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  cfg_node_equip_string(state, node, string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\ncfg_node_insert_child(CFG_State *state, CFG_Node *parent, CFG_Node *prev_child, CFG_Node *new_child)\r\n{\r\n  if(parent != &cfg_nil_node)\r\n  {\r\n    if(new_child->parent != &cfg_nil_node)\r\n    {\r\n      cfg_node_unhook(state, new_child->parent, new_child);\r\n    }\r\n    DLLInsert_NPZ(&cfg_nil_node, parent->first, parent->last, prev_child, new_child, next, prev);\r\n    new_child->parent = parent;\r\n  }\r\n}\r\n\r\ninternal void\r\ncfg_node_unhook(CFG_State *state, CFG_Node *parent, CFG_Node *child)\r\n{\r\n  if(child != &cfg_nil_node && parent == child->parent && parent != &cfg_nil_node)\r\n  {\r\n    DLLRemove_NPZ(&cfg_nil_node, parent->first, parent->last, child, next, prev);\r\n    child->parent = &cfg_nil_node;\r\n  }\r\n}\r\n\r\ninternal CFG_Node *\r\ncfg_node_child_from_string_or_alloc(CFG_State *state, CFG_Node *parent, String8 string)\r\n{\r\n  CFG_Node *node = cfg_node_child_from_string(parent, string);\r\n  if(node == &cfg_nil_node)\r\n  {\r\n    node = cfg_node_new(state, parent, string);\r\n  }\r\n  return node;\r\n}\r\n\r\n//- rjf: deserialization\r\n\r\ninternal CFG_NodePtrList\r\ncfg_node_ptr_list_from_string(Arena *arena, CFG_State *state, CFG_SchemaTable *schema_table, String8 root_path, String8 string)\r\n{\r\n  CFG_NodePtrList result = {0};\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: parse the string as metadesk\r\n  MD_Node *root = md_tree_from_string(scratch.arena, string);\r\n  \r\n  //- rjf: iterate the top-level metadesk trees, generate new cfg trees for each\r\n  for MD_EachNode(tln, root->first)\r\n  {\r\n    CFG_Node *dst_root_n = &cfg_nil_node;\r\n    CFG_Node *dst_active_parent_n = &cfg_nil_node;\r\n    MD_NodeRec rec = {0};\r\n    for(MD_Node *src_n = tln; !md_node_is_nil(src_n); src_n = rec.next)\r\n    {\r\n      // rjf: lookup schema for this string\r\n      MD_Node *schema = &md_nil_node;\r\n      {\r\n        MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, schema_table, dst_active_parent_n->parent->string);\r\n        for(MD_NodePtrNode *n = schemas.first; n != 0 && schema == &md_nil_node; n = n->next)\r\n        {\r\n          schema = md_child_from_string(n->v, dst_active_parent_n->string, 0);\r\n        }\r\n      }\r\n      \r\n      // rjf: extract & transform metadesk node's string (it is raw textual data, so we need to\r\n      // go escaped -> raw, and derelativize paths)\r\n      String8 dst_n_string = {0};\r\n      {\r\n        String8 src_n_string = src_n->string;\r\n        String8 src_n_string__raw = raw_from_escaped_str8(scratch.arena, src_n_string);\r\n        if(!md_node_has_tag(schema->first, str8_lit(\"no_relativize\"), 0))\r\n        {\r\n          if(str8_match(schema->first->string, str8_lit(\"path\"), 0))\r\n          {\r\n            src_n_string__raw = path_absolute_dst_from_relative_dst_src(scratch.arena, src_n_string__raw, root_path);\r\n          }\r\n          else if(str8_match(schema->first->string, str8_lit(\"path_pt\"), 0))\r\n          {\r\n            String8TxtPtPair parts = str8_txt_pt_pair_from_string(src_n_string__raw);\r\n            src_n_string__raw = push_str8f(scratch.arena, \"%S:%I64d:%I64d\", path_absolute_dst_from_relative_dst_src(scratch.arena, parts.string, root_path), parts.pt.line, parts.pt.column);\r\n          }\r\n        }\r\n        dst_n_string = src_n_string__raw;\r\n      }\r\n      \r\n      // rjf: allocate, fill, & insert new cfg for this metadesk node\r\n      CFG_Node *dst_n = cfg_node_alloc(state);\r\n      cfg_node_equip_string(state, dst_n, dst_n_string);\r\n      if(dst_active_parent_n != &cfg_nil_node)\r\n      {\r\n        cfg_node_insert_child(state, dst_active_parent_n, dst_active_parent_n->last, dst_n);\r\n      }\r\n      \r\n      // rjf: recurse\r\n      rec = md_node_rec_depth_first_pre(src_n, tln);\r\n      if(dst_active_parent_n == &cfg_nil_node)\r\n      {\r\n        dst_root_n = dst_n;\r\n      }\r\n      if(rec.push_count > 0)\r\n      {\r\n        dst_active_parent_n = dst_n;\r\n      }\r\n      else for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1)\r\n      {\r\n        dst_active_parent_n = dst_active_parent_n->parent;\r\n      }\r\n    }\r\n    cfg_node_ptr_list_push(arena, &result, dst_root_n);\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/config/config_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CONFIG_CORE_H\r\n#define CONFIG_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: IDs\r\n\r\ntypedef U64 CFG_ID;\r\n\r\ntypedef struct CFG_IDNode CFG_IDNode;\r\nstruct CFG_IDNode\r\n{\r\n  CFG_IDNode *next;\r\n  CFG_ID v;\r\n};\r\n\r\ntypedef struct CFG_IDList CFG_IDList;\r\nstruct CFG_IDList\r\n{\r\n  CFG_IDNode *first;\r\n  CFG_IDNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Tree Types\r\n\r\ntypedef struct CFG_Node CFG_Node;\r\nstruct CFG_Node\r\n{\r\n  CFG_Node *first;\r\n  CFG_Node *last;\r\n  CFG_Node *next;\r\n  CFG_Node *prev;\r\n  CFG_Node *parent;\r\n  CFG_ID id;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct CFG_NodePtrNode CFG_NodePtrNode;\r\nstruct CFG_NodePtrNode\r\n{\r\n  CFG_NodePtrNode *next;\r\n  CFG_NodePtrNode *prev;\r\n  CFG_Node *v;\r\n};\r\n\r\ntypedef struct CFG_NodePtrSlot CFG_NodePtrSlot;\r\nstruct CFG_NodePtrSlot\r\n{\r\n  CFG_NodePtrNode *first;\r\n  CFG_NodePtrNode *last;\r\n};\r\n\r\ntypedef struct CFG_NodePtrList CFG_NodePtrList;\r\nstruct CFG_NodePtrList\r\n{\r\n  CFG_NodePtrNode *first;\r\n  CFG_NodePtrNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CFG_NodePtrArray CFG_NodePtrArray;\r\nstruct CFG_NodePtrArray\r\n{\r\n  CFG_Node **v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CFG_NodeRec CFG_NodeRec;\r\nstruct CFG_NodeRec\r\n{\r\n  CFG_Node *next;\r\n  S32 push_count;\r\n  S32 pop_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Allocator\r\n\r\nread_only global U64 cfg_string_bucket_chunk_sizes[] =\r\n{\r\n  16,\r\n  64,\r\n  256,\r\n  1024,\r\n  4096,\r\n  16384,\r\n  65536,\r\n  0xffffffffffffffffull,\r\n};\r\n\r\ntypedef struct CFG_StringChunkNode CFG_StringChunkNode;\r\nstruct CFG_StringChunkNode\r\n{\r\n  CFG_StringChunkNode *next;\r\n  U64 size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Config State Bundles\r\n\r\ntypedef struct CFG_Ctx CFG_Ctx;\r\nstruct CFG_Ctx\r\n{\r\n  CFG_Node *root;\r\n  U64 id_slots_count;\r\n  CFG_NodePtrSlot *id_slots;\r\n  U64 change_gen;\r\n  CFG_ID last_accessed_id;\r\n  CFG_Node *last_accessed;\r\n};\r\n\r\ntypedef struct CFG_State CFG_State;\r\nstruct CFG_State\r\n{\r\n  Arena *arena;\r\n  CFG_Node *free;\r\n  CFG_NodePtrNode *free_id_node;\r\n  CFG_StringChunkNode *free_string_chunks[ArrayCount(cfg_string_bucket_chunk_sizes)];\r\n  U64 id_gen;\r\n  CFG_Ctx ctx;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Schema Table\r\n\r\ntypedef struct CFG_SchemaNode CFG_SchemaNode;\r\nstruct CFG_SchemaNode\r\n{\r\n  CFG_SchemaNode *next;\r\n  String8 name;\r\n  MD_Node *schema;\r\n};\r\n\r\ntypedef struct CFG_SchemaTable CFG_SchemaTable;\r\nstruct CFG_SchemaTable\r\n{\r\n  CFG_SchemaNode **slots;\r\n  U64 slots_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nread_only global CFG_Node cfg_nil_node =\r\n{\r\n  &cfg_nil_node,\r\n  &cfg_nil_node,\r\n  &cfg_nil_node,\r\n  &cfg_nil_node,\r\n  &cfg_nil_node,\r\n};\r\n\r\nthread_static CFG_Ctx *cfg_ctx = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: ID Functions\r\n\r\ninternal void cfg_id_list_push(Arena *arena, CFG_IDList *list, CFG_ID id);\r\ninternal CFG_IDList cfg_id_list_copy(Arena *arena, CFG_IDList *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Pointer Data Structure Functions\r\n\r\ninternal void cfg_node_ptr_list_push(Arena *arena, CFG_NodePtrList *list, CFG_Node *node);\r\ninternal void cfg_node_ptr_list_push_front(Arena *arena, CFG_NodePtrList *list, CFG_Node *node);\r\n#define cfg_node_ptr_list_first(list) ((list)->count ? (list)->first->v : &cfg_nil_node)\r\n#define cfg_node_ptr_list_last(list)  ((list)->count ? (list)->last->v  : &cfg_nil_node)\r\ninternal CFG_NodePtrArray cfg_node_ptr_array_from_list(Arena *arena, CFG_NodePtrList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Schema Data Structure Functions\r\n\r\ninternal void cfg_schema_table_insert(Arena *arena, CFG_SchemaTable *table, String8 name, MD_Node *schema);\r\ninternal MD_Node *cfg_schema_from_name(CFG_SchemaTable *table, String8 name);\r\ninternal MD_NodePtrList cfg_schemas_from_name(Arena *arena, CFG_SchemaTable *table, String8 name);\r\n\r\n////////////////////////////////\r\n//~ rjf: Config Reading Functions\r\n\r\n//- rjf: context selection\r\ninternal void cfg_ctx_select(CFG_Ctx *ctx);\r\n\r\n//- rjf: tree navigations\r\ninternal U64 cfg_change_gen(void);\r\ninternal CFG_Node *cfg_node_root(void);\r\ninternal CFG_Node *cfg_node_from_id(CFG_ID id);\r\ninternal CFG_Node *cfg_node_child_from_string(CFG_Node *parent, String8 string);\r\ninternal CFG_Node *cfg_node_child_from_string_or_parent(CFG_Node *parent, String8 string);\r\ninternal CFG_NodePtrList cfg_node_child_list_from_string(Arena *arena, CFG_Node *parent, String8 string);\r\ninternal CFG_NodePtrList cfg_node_top_level_list_from_string(Arena *arena, String8 string);\r\ninternal CFG_NodeRec cfg_node_rec__depth_first(CFG_Node *root, CFG_Node *node);\r\n\r\n//- rjf: serialization\r\ninternal String8 cfg_string_from_tree(Arena *arena, CFG_SchemaTable *schema_table, String8 root_path, CFG_Node *root);\r\n\r\n////////////////////////////////\r\n//~ rjf: Config Writing Functions\r\n\r\n//- rjf: state creation / destroying\r\ninternal CFG_State *cfg_state_alloc(void);\r\ninternal void cfg_state_release(CFG_State *state);\r\n\r\n//- rjf: state -> ctx\r\ninternal CFG_Ctx *cfg_state_ctx(CFG_State *state);\r\n\r\n//- rjf: string allocations\r\ninternal U64 cfg_string_bucket_num_from_size(U64 size);\r\ninternal String8 cfg_string_alloc(CFG_State *state, String8 string);\r\ninternal void cfg_string_release(CFG_State *state, String8 string);\r\n\r\n//- rjf: tree building\r\ninternal CFG_Node *cfg_node_alloc(CFG_State *state);\r\ninternal void cfg_node_release(CFG_State *state, CFG_Node *node);\r\ninternal void cfg_node_release_all_children(CFG_State *state, CFG_Node *node);\r\ninternal CFG_Node *cfg_node_new(CFG_State *state, CFG_Node *parent, String8 string);\r\ninternal CFG_Node *cfg_node_newf(CFG_State *state, CFG_Node *parent, char *fmt, ...);\r\ninternal CFG_Node *cfg_node_new_replace(CFG_State *state, CFG_Node *parent, String8 string);\r\ninternal CFG_Node *cfg_node_new_replacef(CFG_State *state, CFG_Node *parent, char *fmt, ...);\r\ninternal CFG_Node *cfg_node_deep_copy(CFG_State *state, CFG_Node *src_root);\r\ninternal void cfg_node_equip_string(CFG_State *state, CFG_Node *node, String8 string);\r\ninternal void cfg_node_equip_stringf(CFG_State *state, CFG_Node *node, char *fmt, ...);\r\ninternal void cfg_node_insert_child(CFG_State *state, CFG_Node *parent, CFG_Node *prev_child, CFG_Node *new_child);\r\ninternal void cfg_node_unhook(CFG_State *state, CFG_Node *parent, CFG_Node *child);\r\ninternal CFG_Node *cfg_node_child_from_string_or_alloc(CFG_State *state, CFG_Node *parent, String8 string);\r\n\r\n//- rjf: deserialization\r\ninternal CFG_NodePtrList cfg_node_ptr_list_from_string(Arena *arena, CFG_State *state, CFG_SchemaTable *schema_table, String8 root_path, String8 string);\r\n\r\n#endif // CONFIG_CORE_H\r\n"
  },
  {
    "path": "src/config/config_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"config_core.c\"\r\n#include \"config_panels.c\"\r\n#if defined(OS_GFX_H)\r\n# include \"config_bindings.c\"\r\n#endif\r\n"
  },
  {
    "path": "src/config/config_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CONFIG_INC_H\r\n#define CONFIG_INC_H\r\n\r\n#include \"config_core.h\"\r\n#include \"config_panels.h\"\r\n#if defined(OS_GFX_H)\r\n# include \"config_bindings.h\"\r\n#endif\r\n\r\n#endif // CONFIG_INC_H\r\n"
  },
  {
    "path": "src/config/config_panels.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal CFG_Node *\r\ncfg_window_from_cfg(CFG_Node *cfg)\r\n{\r\n  CFG_Node *result = &cfg_nil_node;\r\n  for(CFG_Node *c = cfg; c != &cfg_nil_node; c = c->parent)\r\n  {\r\n    if(c->parent->parent == cfg_node_root() && str8_match(c->string, str8_lit(\"window\"), 0))\r\n    {\r\n      result = c;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_PanelTree\r\ncfg_panel_tree_from_cfg(Arena *arena, CFG_Node *cfg_root)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  CFG_Node *wcfg = cfg_window_from_cfg(cfg_root);\r\n  CFG_Node *src_root = cfg_node_child_from_string(wcfg, str8_lit(\"panels\"));\r\n  CFG_PanelNode *dst_root = &cfg_nil_panel_node;\r\n  CFG_PanelNode *dst_focused = &cfg_nil_panel_node;\r\n  {\r\n    Axis2 active_split_axis = cfg_node_child_from_string(wcfg, str8_lit(\"split_x\")) != &cfg_nil_node ? Axis2_X : Axis2_Y;\r\n    CFG_NodeRec rec = {0};\r\n    CFG_PanelNode *dst_active_parent = &cfg_nil_panel_node;\r\n    for(CFG_Node *src = src_root; src != &cfg_nil_node; src = rec.next)\r\n    {\r\n      // rjf: build a panel node\r\n      CFG_PanelNode *dst = push_array(arena, CFG_PanelNode, 1);\r\n      MemoryCopyStruct(dst, &cfg_nil_panel_node);\r\n      dst->parent = dst_active_parent;\r\n      if(dst_active_parent != &cfg_nil_panel_node)\r\n      {\r\n        DLLPushBack_NPZ(&cfg_nil_panel_node, dst_active_parent->first, dst_active_parent->last, dst, next, prev);\r\n        dst_active_parent->child_count += 1;\r\n      }\r\n      if(dst_root == &cfg_nil_panel_node)\r\n      {\r\n        dst_root = dst;\r\n      }\r\n      \r\n      // rjf: extract cfg info\r\n      B32 panel_has_children = 0;\r\n      dst->cfg = src;\r\n      dst->pct_of_parent = (src == src_root ? 1.f : (F32)f64_from_str8(src->string));\r\n      dst->tab_side = (cfg_node_child_from_string(src, str8_lit(\"tabs_on_bottom\")) != &cfg_nil_node ? Side_Max : Side_Min);\r\n      dst->split_axis = active_split_axis;\r\n      for(CFG_Node *src_child = src->first; src_child != &cfg_nil_node; src_child = src_child->next)\r\n      {\r\n        MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, src_child->string);\r\n        if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Numeric)\r\n        {\r\n          panel_has_children = 1;\r\n        }\r\n        else if(str8_match(src_child->string, str8_lit(\"tabs_on_bottom\"), 0))\r\n        {\r\n          // NOTE(rjf): skip - this is a panel option.\r\n        }\r\n        else if(str8_match(src_child->string, str8_lit(\"selected\"), 0))\r\n        {\r\n          dst_focused = dst;\r\n        }\r\n        else if(tokenize.tokens.count == 1 && tokenize.tokens.v[0].flags & MD_TokenFlag_Identifier)\r\n        {\r\n          cfg_node_ptr_list_push(arena, &dst->tabs, src_child);\r\n          if(cfg_node_child_from_string(src_child, str8_lit(\"selected\")) != &cfg_nil_node)\r\n          {\r\n            dst->selected_tab = src_child;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: recurse\r\n      rec = cfg_node_rec__depth_first(src_root, src);\r\n      if(!panel_has_children)\r\n      {\r\n        MemoryZeroStruct(&rec);\r\n        rec.next = &cfg_nil_node;\r\n        for(CFG_Node *p = src; p != src_root && p != &cfg_nil_node; p = p->parent, rec.pop_count += 1)\r\n        {\r\n          if(p->next != &cfg_nil_node)\r\n          {\r\n            rec.next = p->next;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      if(rec.push_count > 0)\r\n      {\r\n        dst_active_parent = dst;\r\n        active_split_axis = axis2_flip(active_split_axis);\r\n      }\r\n      else for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1)\r\n      {\r\n        dst_active_parent = dst_active_parent->parent;\r\n        active_split_axis = axis2_flip(active_split_axis);\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  CFG_PanelTree tree = {dst_root, dst_focused};\r\n  return tree;\r\n}\r\n\r\ninternal CFG_PanelNodeRec\r\ncfg_panel_node_rec__depth_first(CFG_PanelNode *root, CFG_PanelNode *panel, U64 sib_off, U64 child_off)\r\n{\r\n  CFG_PanelNodeRec rec = {&cfg_nil_panel_node};\r\n  if(*MemberFromOffset(CFG_PanelNode **, panel, child_off) != &cfg_nil_panel_node)\r\n  {\r\n    rec.next = *MemberFromOffset(CFG_PanelNode **, panel, child_off);\r\n    rec.push_count += 1;\r\n  }\r\n  else for(CFG_PanelNode *p = panel; p != &cfg_nil_panel_node && p != root; p = p->parent, rec.pop_count += 1)\r\n  {\r\n    if(*MemberFromOffset(CFG_PanelNode **, p, sib_off) != &cfg_nil_panel_node)\r\n    {\r\n      rec.next = *MemberFromOffset(CFG_PanelNode **, p, sib_off);\r\n      break;\r\n    }\r\n  }\r\n  return rec;\r\n}\r\n\r\ninternal CFG_PanelNode *\r\ncfg_panel_node_from_tree_cfg(CFG_PanelNode *root, CFG_Node *cfg)\r\n{\r\n  CFG_PanelNode *result = &cfg_nil_panel_node;\r\n  for(CFG_PanelNode *p = root;\r\n      p != &cfg_nil_panel_node;\r\n      p = cfg_panel_node_rec__depth_first_pre(root, p).next)\r\n  {\r\n    if(p->cfg == cfg)\r\n    {\r\n      result = p;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Rng2F32\r\ncfg_target_rect_from_panel_node_child(Rng2F32 parent_rect, CFG_PanelNode *parent, CFG_PanelNode *panel)\r\n{\r\n  Rng2F32 rect = parent_rect;\r\n  if(parent != &cfg_nil_panel_node)\r\n  {\r\n    Vec2F32 parent_rect_size = dim_2f32(parent_rect);\r\n    Axis2 axis = parent->split_axis;\r\n    rect.p1.v[axis] = rect.p0.v[axis];\r\n    for(CFG_PanelNode *child = parent->first; child != &cfg_nil_panel_node; child = child->next)\r\n    {\r\n      rect.p1.v[axis] += parent_rect_size.v[axis] * child->pct_of_parent;\r\n      if(child == panel)\r\n      {\r\n        break;\r\n      }\r\n      rect.p0.v[axis] = rect.p1.v[axis];\r\n    }\r\n    //rect.p0.v[axis] += parent_rect_size.v[axis] * panel->off_pct_of_parent.v[axis];\r\n    //rect.p0.v[axis2_flip(axis)] += parent_rect_size.v[axis2_flip(axis)] * panel->off_pct_of_parent.v[axis2_flip(axis)];\r\n  }\r\n  rect.x0 = round_f32(rect.x0);\r\n  rect.x1 = round_f32(rect.x1);\r\n  rect.y0 = round_f32(rect.y0);\r\n  rect.y1 = round_f32(rect.y1);\r\n  return rect;\r\n}\r\n\r\ninternal Rng2F32\r\ncfg_target_rect_from_panel_node(Rng2F32 root_rect, CFG_PanelNode *root, CFG_PanelNode *panel)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  // rjf: count ancestors\r\n  U64 ancestor_count = 0;\r\n  for(CFG_PanelNode *p = panel->parent; p != &cfg_nil_panel_node; p = p->parent)\r\n  {\r\n    ancestor_count += 1;\r\n  }\r\n  \r\n  // rjf: gather ancestors\r\n  CFG_PanelNode **ancestors = push_array(scratch.arena, CFG_PanelNode *, ancestor_count);\r\n  {\r\n    U64 ancestor_idx = 0;\r\n    for(CFG_PanelNode *p = panel->parent; p != &cfg_nil_panel_node; p = p->parent)\r\n    {\r\n      ancestors[ancestor_idx] = p;\r\n      ancestor_idx += 1;\r\n    }\r\n  }\r\n  \r\n  // rjf: go from highest ancestor => panel and calculate rect\r\n  Rng2F32 parent_rect = root_rect;\r\n  for(S64 ancestor_idx = (S64)ancestor_count-1;\r\n      0 <= ancestor_idx && ancestor_idx < ancestor_count;\r\n      ancestor_idx -= 1)\r\n  {\r\n    CFG_PanelNode *ancestor = ancestors[ancestor_idx];\r\n    CFG_PanelNode *parent = ancestor->parent;\r\n    if(parent != &cfg_nil_panel_node)\r\n    {\r\n      parent_rect = cfg_target_rect_from_panel_node_child(parent_rect, parent, ancestor);\r\n    }\r\n  }\r\n  \r\n  // rjf: calculate final rect\r\n  Rng2F32 rect = cfg_target_rect_from_panel_node_child(parent_rect, panel->parent, panel);\r\n  \r\n  scratch_end(scratch);\r\n  return rect;\r\n}\r\n"
  },
  {
    "path": "src/config/config_panels.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CONFIG_PANELS_H\r\n#define CONFIG_PANELS_H\r\n\r\ntypedef struct CFG_PanelNode CFG_PanelNode;\r\nstruct CFG_PanelNode\r\n{\r\n  // rjf: links data\r\n  CFG_PanelNode *first;\r\n  CFG_PanelNode *last;\r\n  CFG_PanelNode *next;\r\n  CFG_PanelNode *prev;\r\n  CFG_PanelNode *parent;\r\n  U64 child_count;\r\n  CFG_Node *cfg;\r\n  \r\n  // rjf: split data\r\n  Axis2 split_axis;\r\n  F32 pct_of_parent;\r\n  \r\n  // rjf: tab params\r\n  Side tab_side;\r\n  \r\n  // rjf: which tabs are attached\r\n  CFG_NodePtrList tabs;\r\n  CFG_Node *selected_tab;\r\n};\r\n\r\ntypedef struct CFG_PanelTree CFG_PanelTree;\r\nstruct CFG_PanelTree\r\n{\r\n  CFG_PanelNode *root;\r\n  CFG_PanelNode *focused;\r\n};\r\n\r\ntypedef struct CFG_PanelNodeRec CFG_PanelNodeRec;\r\nstruct CFG_PanelNodeRec\r\n{\r\n  CFG_PanelNode *next;\r\n  S32 push_count;\r\n  S32 pop_count;\r\n};\r\n\r\nread_only global CFG_PanelNode cfg_nil_panel_node =\r\n{\r\n  &cfg_nil_panel_node,\r\n  &cfg_nil_panel_node,\r\n  &cfg_nil_panel_node,\r\n  &cfg_nil_panel_node,\r\n  &cfg_nil_panel_node,\r\n  0,\r\n  &cfg_nil_node,\r\n  .selected_tab = &cfg_nil_node,\r\n};\r\n\r\ninternal CFG_Node *cfg_window_from_cfg(CFG_Node *cfg);\r\ninternal CFG_PanelTree cfg_panel_tree_from_cfg(Arena *arena, CFG_Node *cfg_root);\r\ninternal CFG_PanelNodeRec cfg_panel_node_rec__depth_first(CFG_PanelNode *root, CFG_PanelNode *panel, U64 sib_off, U64 child_off);\r\n#define cfg_panel_node_rec__depth_first_pre(root, p)     cfg_panel_node_rec__depth_first((root), (p), OffsetOf(CFG_PanelNode, next), OffsetOf(CFG_PanelNode, first))\r\n#define cfg_panel_node_rec__depth_first_pre_rev(root, p) cfg_panel_node_rec__depth_first((root), (p), OffsetOf(CFG_PanelNode, prev), OffsetOf(CFG_PanelNode, last))\r\ninternal CFG_PanelNode *cfg_panel_node_from_tree_cfg(CFG_PanelNode *root, CFG_Node *cfg);\r\ninternal Rng2F32 cfg_target_rect_from_panel_node_child(Rng2F32 parent_rect, CFG_PanelNode *parent, CFG_PanelNode *panel);\r\ninternal Rng2F32 cfg_target_rect_from_panel_node(Rng2F32 root_rect, CFG_PanelNode *root, CFG_PanelNode *panel);\r\n\r\n#endif // CONFIG_PANELS_H\r\n"
  },
  {
    "path": "src/content/content.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0x684123ff\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal C_ID\r\nc_id_make(U64 u64_0, U64 u64_1)\r\n{\r\n  C_ID id;\r\n  id.u128[0].u64[0] = u64_0;\r\n  id.u128[0].u64[1] = u64_1;\r\n  return id;\r\n}\r\n\r\ninternal B32\r\nc_id_match(C_ID a, C_ID b)\r\n{\r\n  B32 result = MemoryMatchStruct(&a, &b);\r\n  return result;\r\n}\r\n\r\ninternal C_Key\r\nc_key_make(C_Root root, C_ID id)\r\n{\r\n  C_Key key = {root, 0, id};\r\n  return key;\r\n}\r\n\r\ninternal B32\r\nc_key_match(C_Key a, C_Key b)\r\n{\r\n  return (MemoryMatchStruct(&a.root, &b.root) && c_id_match(a.id, b.id));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void\r\nc_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  c_shared = push_array(arena, C_Shared, 1);\r\n  c_shared->arena = arena;\r\n  c_shared->blob_slots_count = 16384;\r\n  c_shared->blob_stripes_count = Min(c_shared->blob_slots_count, os_get_system_info()->logical_processor_count);\r\n  c_shared->blob_slots = push_array(arena, C_BlobSlot, c_shared->blob_slots_count);\r\n  c_shared->blob_stripes = push_array(arena, C_Stripe, c_shared->blob_stripes_count);\r\n  c_shared->blob_stripes_free_nodes = push_array(arena, C_BlobNode *, c_shared->blob_stripes_count);\r\n  for(U64 idx = 0; idx < c_shared->blob_stripes_count; idx += 1)\r\n  {\r\n    C_Stripe *stripe = &c_shared->blob_stripes[idx];\r\n    stripe->arena = arena_alloc();\r\n    stripe->rw_mutex = rw_mutex_alloc();\r\n    stripe->cv = cond_var_alloc();\r\n  }\r\n  c_shared->key_slots_count = 4096;\r\n  c_shared->key_stripes_count = Min(c_shared->key_slots_count, os_get_system_info()->logical_processor_count);\r\n  c_shared->key_slots = push_array(arena, C_KeySlot, c_shared->key_slots_count);\r\n  c_shared->key_stripes = push_array(arena, C_Stripe, c_shared->key_stripes_count);\r\n  c_shared->key_stripes_free_nodes = push_array(arena, C_KeyNode *, c_shared->key_stripes_count);\r\n  for(U64 idx = 0; idx < c_shared->key_stripes_count; idx += 1)\r\n  {\r\n    C_Stripe *stripe = &c_shared->key_stripes[idx];\r\n    stripe->arena = arena_alloc();\r\n    stripe->rw_mutex = rw_mutex_alloc();\r\n    stripe->cv = cond_var_alloc();\r\n  }\r\n  c_shared->root_slots_count = 4096;\r\n  c_shared->root_stripes_count = Min(c_shared->root_slots_count, os_get_system_info()->logical_processor_count);\r\n  c_shared->root_slots = push_array(arena, C_RootSlot, c_shared->root_slots_count);\r\n  c_shared->root_stripes = push_array(arena, C_Stripe, c_shared->root_stripes_count);\r\n  c_shared->root_stripes_free_nodes = push_array(arena, C_RootNode *, c_shared->root_stripes_count);\r\n  for(U64 idx = 0; idx < c_shared->root_stripes_count; idx += 1)\r\n  {\r\n    C_Stripe *stripe = &c_shared->root_stripes[idx];\r\n    stripe->arena = arena_alloc();\r\n    stripe->rw_mutex = rw_mutex_alloc();\r\n    stripe->cv = cond_var_alloc();\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Root Allocation/Deallocation\r\n\r\ninternal C_Root\r\nc_root_alloc(void)\r\n{\r\n  C_Root root = {0};\r\n  root.u64[0] = ins_atomic_u64_inc_eval(&c_shared->root_id_gen);\r\n  U64 slot_idx = root.u64[0]%c_shared->root_slots_count;\r\n  U64 stripe_idx = slot_idx%c_shared->root_stripes_count;\r\n  C_RootSlot *slot = &c_shared->root_slots[slot_idx];\r\n  C_Stripe *stripe = &c_shared->root_stripes[stripe_idx];\r\n  MutexScopeW(stripe->rw_mutex)\r\n  {\r\n    C_RootNode *node = c_shared->root_stripes_free_nodes[stripe_idx];\r\n    if(node != 0)\r\n    {\r\n      SLLStackPop(c_shared->root_stripes_free_nodes[stripe_idx]);\r\n    }\r\n    else\r\n    {\r\n      node = push_array(stripe->arena, C_RootNode, 1);\r\n    }\r\n    DLLPushBack(slot->first, slot->last, node);\r\n    node->root = root;\r\n    node->arena = arena_alloc();\r\n  }\r\n  return root;\r\n}\r\n\r\ninternal void\r\nc_root_release(C_Root root)\r\n{\r\n  //- rjf: unpack root\r\n  U64 slot_idx = root.u64[0]%c_shared->root_slots_count;\r\n  U64 stripe_idx = slot_idx%c_shared->root_stripes_count;\r\n  C_RootSlot *slot = &c_shared->root_slots[slot_idx];\r\n  C_Stripe *stripe = &c_shared->root_stripes[stripe_idx];\r\n  \r\n  //- rjf: release root node, grab its arena / ID list\r\n  Arena *root_arena = 0;\r\n  C_RootIDChunkList root_ids = {0};\r\n  MutexScopeW(stripe->rw_mutex)\r\n  {\r\n    for(C_RootNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(MemoryMatchStruct(&root, &n->root))\r\n      {\r\n        DLLRemove(slot->first, slot->last, n);\r\n        root_arena = n->arena;\r\n        root_ids = n->ids;\r\n        SLLStackPush(c_shared->root_stripes_free_nodes[stripe_idx], n);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: release all IDs\r\n  for(C_RootIDChunkNode *id_chunk_n = root_ids.first; id_chunk_n != 0; id_chunk_n = id_chunk_n->next)\r\n  {\r\n    for EachIndex(chunk_idx, id_chunk_n->count)\r\n    {\r\n      C_ID id = id_chunk_n->v[chunk_idx];\r\n      C_Key key = c_key_make(root, id);\r\n      c_close_key(key);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Submission\r\n\r\ninternal U128\r\nc_submit_data(C_Key key, Arena **data_arena, String8 data)\r\n{\r\n  //- rjf: unpack key\r\n  U64 key_hash = u64_hash_from_str8(str8_struct(&key));\r\n  U64 key_slot_idx = key_hash%c_shared->key_slots_count;\r\n  U64 key_stripe_idx = key_slot_idx%c_shared->key_stripes_count;\r\n  C_KeySlot *key_slot = &c_shared->key_slots[key_slot_idx];\r\n  C_Stripe *key_stripe = &c_shared->key_stripes[key_stripe_idx];\r\n  \r\n  //- rjf: hash data, unpack hash\r\n  U128 hash = u128_hash_from_str8(data);\r\n  U64 slot_idx = hash.u64[1]%c_shared->blob_slots_count;\r\n  U64 stripe_idx = slot_idx%c_shared->blob_stripes_count;\r\n  C_BlobSlot *slot = &c_shared->blob_slots[slot_idx];\r\n  C_Stripe *stripe = &c_shared->blob_stripes[stripe_idx];\r\n  \r\n  //- rjf: commit to (hash -> data) cache\r\n  ProfScope(\"commit to (hash -> data) cache\") RWMutexScope(stripe->rw_mutex, 1)\r\n  {\r\n    // rjf: find existing node\r\n    C_BlobNode *node = 0;\r\n    for(C_BlobNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(u128_match(n->hash, hash))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: release duplicate data if node already exists\r\n    if(node != 0 && data_arena != 0 && *data_arena != 0)\r\n    {\r\n      arena_release(*data_arena);\r\n    }\r\n    \r\n    // rjf: allocate node if needed\r\n    if(node == 0)\r\n    {\r\n      node = c_shared->blob_stripes_free_nodes[stripe_idx];\r\n      if(node)\r\n      {\r\n        SLLStackPop(c_shared->blob_stripes_free_nodes[stripe_idx]);\r\n      }\r\n      else\r\n      {\r\n        node = push_array_no_zero(stripe->arena, C_BlobNode, 1);\r\n      }\r\n      MemoryZeroStruct(node);\r\n      node->hash = hash;\r\n      if(data_arena != 0)\r\n      {\r\n        node->arena = *data_arena;\r\n      }\r\n      node->data = data;\r\n      DLLPushBack(slot->first, slot->last, node);\r\n    }\r\n    \r\n    // rjf: bump key ref count\r\n    node->key_ref_count += 1;\r\n    \r\n    // rjf \"steal\" arena from caller\r\n    if(data_arena != 0)\r\n    {\r\n      *data_arena = 0;\r\n    }\r\n  }\r\n  \r\n  //- rjf: commit to (key -> list(hash)) cache\r\n  U128 key_expired_hash = {0};\r\n  ProfScope(\"commit to (key -> list(hash)) cache\") RWMutexScope(key_stripe->rw_mutex, 1)\r\n  {\r\n    // rjf: find existing key\r\n    C_KeyNode *key_node = 0;\r\n    for(C_KeyNode *n = key_slot->first; n != 0; n = n->next)\r\n    {\r\n      if(c_key_match(n->key, key))\r\n      {\r\n        key_node = n;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: create key node if it doesn't exist\r\n    B32 key_is_new = 0;\r\n    if(!key_node)\r\n    {\r\n      key_is_new = 1;\r\n      key_node = c_shared->key_stripes_free_nodes[key_stripe_idx];\r\n      if(key_node)\r\n      {\r\n        SLLStackPop(c_shared->key_stripes_free_nodes[key_stripe_idx]);\r\n      }\r\n      else\r\n      {\r\n        key_node = push_array_no_zero(key_stripe->arena, C_KeyNode, 1);\r\n      }\r\n      MemoryZeroStruct(key_node);\r\n      key_node->key = key;\r\n      DLLPushBack(key_slot->first, key_slot->last, key_node);\r\n    }\r\n    \r\n    // rjf: push hash into key's history\r\n    if(key_node)\r\n    {\r\n      if(key_node->hash_history_gen >= C_KEY_HASH_HISTORY_STRONG_REF_COUNT)\r\n      {\r\n        key_expired_hash = key_node->hash_history[(key_node->hash_history_gen-C_KEY_HASH_HISTORY_STRONG_REF_COUNT)%ArrayCount(key_node->hash_history)];\r\n      }\r\n      key_node->hash_history[key_node->hash_history_gen%ArrayCount(key_node->hash_history)] = hash;\r\n      key_node->hash_history_gen += 1;\r\n    }\r\n    \r\n    // rjf: key is new -> add this key to the associated root\r\n    if(key_is_new)\r\n    {\r\n      U64 root_hash = u64_hash_from_str8(str8_struct(&key.root));\r\n      U64 root_slot_idx = root_hash%c_shared->root_slots_count;\r\n      U64 root_stripe_idx = root_slot_idx%c_shared->root_stripes_count;\r\n      C_RootSlot *root_slot = &c_shared->root_slots[root_slot_idx];\r\n      C_Stripe *root_stripe = &c_shared->root_stripes[root_stripe_idx];\r\n      RWMutexScope(root_stripe->rw_mutex, 1)\r\n      {\r\n        for(C_RootNode *n = root_slot->first; n != 0; n = n->next)\r\n        {\r\n          if(MemoryMatchStruct(&n->root, &key.root))\r\n          {\r\n            C_RootIDChunkNode *chunk = n->ids.last;\r\n            if(chunk == 0 || chunk->count >= chunk->cap)\r\n            {\r\n              chunk = push_array(n->arena, C_RootIDChunkNode, 1);\r\n              SLLQueuePush(n->ids.first, n->ids.last, chunk);\r\n              n->ids.chunk_count += 1;\r\n              chunk->cap = 1024;\r\n              chunk->v = push_array_no_zero(n->arena, C_ID, chunk->cap);\r\n            }\r\n            chunk->v[chunk->count] = key.id;\r\n            chunk->count += 1;\r\n            n->ids.total_count += 1;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: decrement key ref count of expired hash\r\n  if(!u128_match(key_expired_hash, u128_zero())) ProfScope(\"decrement key ref count of expired hash\")\r\n  {\r\n    U64 old_hash_slot_idx = key_expired_hash.u64[1]%c_shared->blob_slots_count;\r\n    U64 old_hash_stripe_idx = old_hash_slot_idx%c_shared->blob_stripes_count;\r\n    C_BlobSlot *old_hash_slot = &c_shared->blob_slots[old_hash_slot_idx];\r\n    C_Stripe *old_hash_stripe = &c_shared->blob_stripes[old_hash_stripe_idx];\r\n    RWMutexScope(old_hash_stripe->rw_mutex, 0)\r\n    {\r\n      for(C_BlobNode *n = old_hash_slot->first; n != 0; n = n->next)\r\n      {\r\n        if(u128_match(n->hash, key_expired_hash))\r\n        {\r\n          ins_atomic_u64_dec_eval(&n->key_ref_count);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return hash;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Closing\r\n\r\ninternal void\r\nc_close_key(C_Key key)\r\n{\r\n  U64 key_hash = u64_hash_from_str8(str8_struct(&key));\r\n  U64 key_slot_idx = key_hash%c_shared->key_slots_count;\r\n  U64 key_stripe_idx = key_slot_idx%c_shared->key_stripes_count;\r\n  C_KeySlot *key_slot = &c_shared->key_slots[key_slot_idx];\r\n  C_Stripe *key_stripe = &c_shared->key_stripes[key_stripe_idx];\r\n  RWMutexScope(key_stripe->rw_mutex, 1)\r\n  {\r\n    for(C_KeyNode *n = key_slot->first; n != 0; n = n->next)\r\n    {\r\n      if(c_key_match(n->key, key))\r\n      {\r\n        for(U64 history_idx = 0;\r\n            history_idx < C_KEY_HASH_HISTORY_STRONG_REF_COUNT && history_idx < n->hash_history_gen;\r\n            history_idx += 1)\r\n        {\r\n          U128 hash = n->hash_history[(n->hash_history_gen-1-history_idx) % ArrayCount(n->hash_history)];\r\n          U64 hash_slot_idx = hash.u64[1]%c_shared->blob_slots_count;\r\n          U64 hash_stripe_idx = hash_slot_idx%c_shared->blob_stripes_count;\r\n          C_BlobSlot *hash_slot = &c_shared->blob_slots[hash_slot_idx];\r\n          C_Stripe *hash_stripe = &c_shared->blob_stripes[hash_stripe_idx];\r\n          MutexScopeR(hash_stripe->rw_mutex)\r\n          {\r\n            for(C_BlobNode *n = hash_slot->first; n != 0; n = n->next)\r\n            {\r\n              if(u128_match(n->hash, hash))\r\n              {\r\n                ins_atomic_u64_dec_eval(&n->key_ref_count);\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        DLLRemove(key_slot->first, key_slot->last, n);\r\n        SLLStackPush(c_shared->key_stripes_free_nodes[key_stripe_idx], n);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Downstream Accesses\r\n\r\ninternal void\r\nc_hash_downstream_inc(U128 hash)\r\n{\r\n  U64 slot_idx = hash.u64[1]%c_shared->blob_slots_count;\r\n  U64 stripe_idx = slot_idx%c_shared->blob_stripes_count;\r\n  C_BlobSlot *slot = &c_shared->blob_slots[slot_idx];\r\n  C_Stripe *stripe = &c_shared->blob_stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex)\r\n  {\r\n    for(C_BlobNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(u128_match(hash, n->hash))\r\n      {\r\n        ins_atomic_u64_inc_eval(&n->downstream_ref_count);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nc_hash_downstream_dec(U128 hash)\r\n{\r\n  U64 slot_idx = hash.u64[1]%c_shared->blob_slots_count;\r\n  U64 stripe_idx = slot_idx%c_shared->blob_stripes_count;\r\n  C_BlobSlot *slot = &c_shared->blob_slots[slot_idx];\r\n  C_Stripe *stripe = &c_shared->blob_stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex)\r\n  {\r\n    for(C_BlobNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(u128_match(hash, n->hash))\r\n      {\r\n        ins_atomic_u64_dec_eval(&n->downstream_ref_count);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Lookup\r\n\r\ninternal U128\r\nc_hash_from_key(C_Key key, U64 rewind_count)\r\n{\r\n  U128 result = {0};\r\n  U64 key_hash = u64_hash_from_str8(str8_struct(&key));\r\n  U64 key_slot_idx = key_hash%c_shared->key_slots_count;\r\n  U64 key_stripe_idx = key_slot_idx%c_shared->key_stripes_count;\r\n  C_KeySlot *key_slot = &c_shared->key_slots[key_slot_idx];\r\n  C_Stripe *key_stripe = &c_shared->key_stripes[key_stripe_idx];\r\n  RWMutexScope(key_stripe->rw_mutex, 0)\r\n  {\r\n    for(C_KeyNode *n = key_slot->first; n != 0; n = n->next)\r\n    {\r\n      if(c_key_match(n->key, key) && n->hash_history_gen > 0 && n->hash_history_gen-1 >= rewind_count)\r\n      {\r\n        result = n->hash_history[(n->hash_history_gen-1-rewind_count)%ArrayCount(n->hash_history)];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nc_data_from_hash(Access *access, U128 hash)\r\n{\r\n  ProfBeginFunction();\r\n  String8 result = {0};\r\n  U64 slot_idx = hash.u64[1]%c_shared->blob_slots_count;\r\n  U64 stripe_idx = slot_idx%c_shared->blob_stripes_count;\r\n  C_BlobSlot *slot = &c_shared->blob_slots[slot_idx];\r\n  C_Stripe *stripe = &c_shared->blob_stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex)\r\n  {\r\n    for(C_BlobNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(u128_match(n->hash, hash))\r\n      {\r\n        result = n->data;\r\n        access_touch(access, &n->access_pt, stripe->cv);\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void\r\nc_async_tick(void)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: garbage collect blobs\r\n  {\r\n    Rng1U64 range = lane_range(c_shared->blob_slots_count);\r\n    for EachInRange(slot_idx, range)\r\n    {\r\n      U64 stripe_idx = slot_idx%c_shared->blob_stripes_count;\r\n      C_BlobSlot *slot = &c_shared->blob_slots[slot_idx];\r\n      C_Stripe *stripe = &c_shared->blob_stripes[stripe_idx];\r\n      for(B32 write_mode = 0; write_mode <= 1; write_mode += 1)\r\n      {\r\n        B32 slot_has_work = 0;\r\n        RWMutexScope(stripe->rw_mutex, write_mode)\r\n        {\r\n          for(C_BlobNode *n = slot->first, *next = 0; n != 0; n = next)\r\n          {\r\n            next = n->next;\r\n            U64 key_ref_count = ins_atomic_u64_eval(&n->key_ref_count);\r\n            U64 downstream_ref_count = ins_atomic_u64_eval(&n->downstream_ref_count);\r\n            if(access_pt_is_expired(&n->access_pt, .time = 5000000) && key_ref_count == 0 && downstream_ref_count == 0)\r\n            {\r\n              slot_has_work = 1;\r\n              if(!write_mode)\r\n              {\r\n                break;\r\n              }\r\n              else\r\n              {\r\n                DLLRemove(slot->first, slot->last, n);\r\n                SLLStackPush(c_shared->blob_stripes_free_nodes[stripe_idx], n);\r\n                if(n->arena != 0)\r\n                {\r\n                  arena_release(n->arena);\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n        if(!slot_has_work)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  ProfEnd();\r\n}\r\n"
  },
  {
    "path": "src/content/content.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CONTENT_H\r\n#define CONTENT_H\r\n\r\n////////////////////////////////\r\n//~ NOTE(rjf): Hash Store Notes (2025/05/18)\r\n//\r\n// The hash store is a general-purpose data cache. It offers three layers of\r\n// caching: (a) content (hash of data), (b) key (unique identity correllated\r\n// with history of hashes), and (c) root (bucket for many keys, manually\r\n// allocated / deallocated).\r\n//\r\n//  (a) The \"content\" level of cache access is a simply hash(data) -> data\r\n//      mapping. This bypasses all identity/key/root mechanisms and provides a\r\n//      way to just talk about unique (and deduplicated) blobs of data.\r\n//\r\n//  (b) The \"key\" level of cache access is used to encode a history of hashes\r\n//      for some unique \"identity\", where the \"identity\" is a concept managed\r\n//      by the user. One example of an identity would be a particular address\r\n//      range inside of some process to which the debugger is attached. Another\r\n//      might be a range inside of some file.\r\n//\r\n//  (c) The \"root\" level is to provide a top-level allocation/deallocation\r\n//      mechanism for a large set of keys. It also provides an extra level of\r\n//      key uniqueness. For instance, each process to which the debugger is\r\n//      attached might have its own root, and each key might correspond to a\r\n//      particular address range within that process. This way, when the\r\n//      process ends, all of its keys can be easily destroyed using a single\r\n//      deallocation of the root.\r\n//\r\n// The way this might be generally used inside of the debugger would be that\r\n// some evaluation - let's say it's some variable `x` - is mapped (via debug\r\n// info) to some address range. If `x` is a `char[4096]`, then it might map\r\n// to some address range [&x, &x + 4096). This, together with the process\r\n// within which `x` is evaluated, forms both a `root` (for the process) and\r\n// a `key` (for the address range). Some asynchronous memory streaming system\r\n// can then, together with the root and key, read memory for that range, then\r\n// submit that data to the hash store, correllating with the root and key\r\n// combo.\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Types\r\n\r\ntypedef struct C_Root C_Root;\r\nstruct C_Root\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct C_ID C_ID;\r\nstruct C_ID\r\n{\r\n  U128 u128[1];\r\n};\r\n\r\ntypedef struct C_Key C_Key;\r\nstruct C_Key\r\n{\r\n  C_Root root;\r\n  U64 _padding_;\r\n  C_ID id;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Stripe Type\r\n\r\ntypedef struct C_Stripe C_Stripe;\r\nstruct C_Stripe\r\n{\r\n  Arena *arena;\r\n  RWMutex rw_mutex;\r\n  CondVar cv;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Root Cache Types\r\n\r\ntypedef struct C_RootIDChunkNode C_RootIDChunkNode;\r\nstruct C_RootIDChunkNode\r\n{\r\n  C_RootIDChunkNode *next;\r\n  C_ID *v;\r\n  U64 count;\r\n  U64 cap;\r\n};\r\n\r\ntypedef struct C_RootIDChunkList C_RootIDChunkList;\r\nstruct C_RootIDChunkList\r\n{\r\n  C_RootIDChunkNode *first;\r\n  C_RootIDChunkNode *last;\r\n  U64 chunk_count;\r\n  U64 total_count;\r\n};\r\n\r\ntypedef struct C_RootNode C_RootNode;\r\nstruct C_RootNode\r\n{\r\n  C_RootNode *next;\r\n  C_RootNode *prev;\r\n  Arena *arena;\r\n  C_Root root;\r\n  C_RootIDChunkList ids;\r\n};\r\n\r\ntypedef struct C_RootSlot C_RootSlot;\r\nstruct C_RootSlot\r\n{\r\n  C_RootNode *first;\r\n  C_RootNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Cache Types\r\n\r\n#define C_KEY_HASH_HISTORY_COUNT 64\r\n#define C_KEY_HASH_HISTORY_STRONG_REF_COUNT 2\r\n\r\ntypedef struct C_KeyNode C_KeyNode;\r\nstruct C_KeyNode\r\n{\r\n  C_KeyNode *next;\r\n  C_KeyNode *prev;\r\n  C_Key key;\r\n  U128 hash_history[C_KEY_HASH_HISTORY_COUNT];\r\n  U64 hash_history_gen;\r\n};\r\n\r\ntypedef struct C_KeySlot C_KeySlot;\r\nstruct C_KeySlot\r\n{\r\n  C_KeyNode *first;\r\n  C_KeyNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Content Blob Cache Types\r\n\r\ntypedef struct C_BlobNode C_BlobNode;\r\nstruct C_BlobNode\r\n{\r\n  C_BlobNode *next;\r\n  C_BlobNode *prev;\r\n  U128 hash;\r\n  Arena *arena;\r\n  String8 data;\r\n  AccessPt access_pt;\r\n  U64 key_ref_count;\r\n  U64 downstream_ref_count;\r\n};\r\n\r\ntypedef struct C_BlobSlot C_BlobSlot;\r\nstruct C_BlobSlot\r\n{\r\n  C_BlobNode *first;\r\n  C_BlobNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared State\r\n\r\ntypedef struct C_Shared C_Shared;\r\nstruct C_Shared\r\n{\r\n  Arena *arena;\r\n  \r\n  // rjf: main data blob cache\r\n  U64 blob_slots_count;\r\n  U64 blob_stripes_count;\r\n  C_BlobSlot *blob_slots;\r\n  C_Stripe *blob_stripes;\r\n  C_BlobNode **blob_stripes_free_nodes;\r\n  \r\n  // rjf: key cache\r\n  U64 key_slots_count;\r\n  U64 key_stripes_count;\r\n  C_KeySlot *key_slots;\r\n  C_Stripe *key_stripes;\r\n  C_KeyNode **key_stripes_free_nodes;\r\n  \r\n  // rjf: root cache\r\n  U64 root_slots_count;\r\n  U64 root_stripes_count;\r\n  C_RootSlot *root_slots;\r\n  C_Stripe *root_stripes;\r\n  C_RootNode **root_stripes_free_nodes;\r\n  U64 root_id_gen;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal C_Shared *c_shared = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal C_ID c_id_make(U64 u64_0, U64 u64_1);\r\ninternal B32 c_id_match(C_ID a, C_ID b);\r\ninternal C_Key c_key_make(C_Root root, C_ID id);\r\ninternal B32 c_key_match(C_Key a, C_Key b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void c_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Root Allocation/Deallocation\r\n\r\ninternal C_Root c_root_alloc(void);\r\ninternal void c_root_release(C_Root root);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Submission\r\n\r\ninternal U128 c_submit_data(C_Key key, Arena **data_arena, String8 data);\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Closing\r\n\r\ninternal void c_close_key(C_Key key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Downstream Accesses\r\n\r\ninternal void c_hash_downstream_inc(U128 hash);\r\ninternal void c_hash_downstream_dec(U128 hash);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Lookups\r\n\r\ninternal U128 c_hash_from_key(C_Key key, U64 rewind_count);\r\ninternal String8 c_data_from_hash(Access *access, U128 hash);\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void c_async_tick(void);\r\n\r\n#endif // CONTENT_H\r\n"
  },
  {
    "path": "src/ctrl/ctrl.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Kinds\r\n\r\n@table(name  code_name  display_string)\r\nCTRL_EntityKindTable:\r\n{\r\n  {Root                      root                      \"Root\"                      }\r\n  {Machine                   machine                   \"Machine\"                   }\r\n  {Process                   process                   \"Process\"                   }\r\n  {Thread                    thread                    \"Thread\"                    }\r\n  {Module                    module                    \"Module\"                    }\r\n  {EntryPoint                entry_point               \"Entry Point\"               }\r\n  {DebugInfoPath             debug_info_path           \"Debug Info Path\"           }\r\n  {PendingThreadName         pending_thread_name       \"Pending Thread Name\"       }\r\n  {PendingThreadColor        pending_thread_color      \"Pending Thread Color\"      }\r\n  {Breakpoint                breakpoint                \"Breakpoint\"                }\r\n  {AddressRangeAnnotation    address_range_annotation  \"Address Range Annotation\"  }\r\n}\r\n\r\n@enum CTRL_EntityKind:\r\n{\r\n  Null,\r\n  @expand(CTRL_EntityKindTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@data(String8) ctrl_entity_kind_code_name_table:\r\n{\r\n  `{0}`,\r\n  @expand(CTRL_EntityKindTable a) `str8_lit_comp(\"$(a.code_name)\")`\r\n}\r\n\r\n@data(String8) ctrl_entity_kind_display_string_table:\r\n{\r\n  `{0}`,\r\n  @expand(CTRL_EntityKindTable a) `str8_lit_comp(\"$(a.display_name)\")`\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Exception Codes\r\n\r\n@table(name lower_name code default display_string)\r\nCTRL_ExceptionCodeKindTable:\r\n{\r\n  {Win32CtrlC                          win32_ctrl_c                                0x40010005  1  \"(Win32) Control-C\"                                              }\r\n  {Win32CtrlBreak                      win32_ctrl_break                            0x40010008  1  \"(Win32) Control-Break\"                                          }\r\n  {Win32WinRTOriginateError            win32_win_rt_originate_error                0x40080201  0  \"(Win32) WinRT Originate Error\"                                  }\r\n  {Win32WinRTTransformError            win32_win_rt_transform_error                0x40080202  0  \"(Win32) WinRT Transform Error\"                                  }\r\n  {Win32RPCCallCancelled               win32_rpc_call_cancelled                    0x0000071a  0  \"(Win32) RPC Call Cancelled\"                                     }\r\n  {Win32DatatypeMisalignment           win32_datatype_misalignment                 0x80000002  0  \"(Win32) Data Type Misalignment\"                                 }\r\n  {Win32AccessViolation                win32_access_violation                      0xc0000005  1  \"(Win32) Access Violation\"                                       }\r\n  {Win32InPageError                    win32_in_page_error                         0xc0000006  0  \"(Win32) In Page Error\"                                          }\r\n  {Win32InvalidHandle                  win32_invalid_handle                        0xc0000008  1  \"(Win32) Invalid Handle Specified\"                               }\r\n  {Win32NotEnoughQuota                 win32_not_enough_quota                      0xc0000017  0  \"(Win32) Not Enough Quota\"                                       }\r\n  {Win32IllegalInstruction             win32_illegal_instruction                   0xc000001d  0  \"(Win32) Illegal Instruction\"                                    }\r\n  {Win32CannotContinueException        win32_cannot_continue_exception             0xc0000025  0  \"(Win32) Cannot Continue From Exception\"                         }\r\n  {Win32InvalidExceptionDisposition    win32_invalid_exception_disposition         0xc0000026  0  \"(Win32) Invalid Exception Disposition Returned By Handler\"      }\r\n  {Win32ArrayBoundsExceeded            win32_array_bounds_exceeded                 0xc000008c  0  \"(Win32) Array Bounds Exceeded\"                                  }\r\n  {Win32FloatingPointDenormalOperand   win32_floating_point_denormal_operand       0xc000008d  0  \"(Win32) Floating-Point Denormal Operand\"                        }\r\n  {Win32FloatingPointDivisionByZero    win32_floating_point_division_by_zero       0xc000008e  0  \"(Win32) Floating-Point Division By Zero\"                        }\r\n  {Win32FloatingPointInexactResult     win32_floating_point_inexact_result         0xc000008f  0  \"(Win32) Floating-Point Inexact Result\"                          }\r\n  {Win32FloatingPointInvalidOperation  win32_floating_point_invalid_operation      0xc0000090  0  \"(Win32) Floating-Point Invalid Operation\"                       }\r\n  {Win32FloatingPointOverflow          win32_floating_point_overflow               0xc0000091  0  \"(Win32) Floating-Point Overflow\"                                }\r\n  {Win32FloatingPointStackCheck        win32_floating_point_stack_check            0xc0000092  0  \"(Win32) Floating-Point Stack Check\"                             }\r\n  {Win32FloatingPointUnderflow         win32_floating_point_underflow              0xc0000093  0  \"(Win32) Floating-Point Underflow\"                               }\r\n  {Win32IntegerDivisionByZero          win32_integer_division_by_zero              0xc0000094  0  \"(Win32) Integer Division By Zero\"                               }\r\n  {Win32IntegerOverflow                win32_integer_overflow                      0xc0000095  0  \"(Win32) Integer Overflow\"                                       }\r\n  {Win32PrivilegedInstruction          win32_privileged_instruction                0xc0000096  0  \"(Win32) Privileged Instruction\"                                 }\r\n  {Win32StackOverflow                  win32_stack_overflow                        0xc00000fd  0  \"(Win32) Stack Overflow\"                                         }\r\n  {Win32UnableToLocateDLL              win32_unable_to_locate_dll                  0xc0000135  0  \"(Win32) Unable To Locate DLL\"                                   }\r\n  {Win32OrdinalNotFound                win32_ordinal_not_found                     0xc0000138  0  \"(Win32) Ordinal Not Found\"                                      }\r\n  {Win32EntryPointNotFound             win32_entry_point_not_found                 0xc0000139  0  \"(Win32) Entry Point Not Found\"                                  }\r\n  {Win32DLLInitializationFailed        win32_dll_initialization_failed             0xc0000142  0  \"(Win32) DLL Initialization Failed\"                              }\r\n  {Win32FloatingPointSSEMultipleFaults win32_floating_point_sse_multiple_faults    0xc00002b4  0  \"(Win32) Floating Point SSE Multiple Faults\"                     }\r\n  {Win32FloatingPointSSEMultipleTraps  win32_floating_point_sse_multiple_traps     0xc00002b5  0  \"(Win32) Floating Point SSE Multiple Traps\"                      }\r\n  {Win32AssertionFailed                win32_assertion_failed                      0xc0000420  1  \"(Win32) Assertion Failed\"                                       }\r\n  {Win32ModuleNotFound                 win32_module_not_found                      0xc06d007e  0  \"(Win32) Module Not Found\"                                       }\r\n  {Win32ProcedureNotFound              win32_procedure_not_found                   0xc06d007f  0  \"(Win32) Procedure Not Found\"                                    }\r\n  {Win32SanitizerErrorDetected         win32_sanitizer_error_detected              0xe073616e  1  \"(Win32) Sanitizer Error Detected\"                               }\r\n  {Win32SanitizerRawAccessViolation    win32_sanitizer_raw_access_violation        0xe0736171  0  \"(Win32) Sanitizer Raw Access Violation\"                         }\r\n  {Win32DirectXDebugLayer              win32_directx_debug_layer                   0x0000087a  1  \"(Win32) DirectX Debug Layer\"                                    }\r\n}\r\n\r\n@enum CTRL_ExceptionCodeKind:\r\n{\r\n  Null,\r\n  @expand(CTRL_ExceptionCodeKindTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@data(U32) ctrl_exception_code_kind_code_table:\r\n{\r\n  `0`;\r\n  @expand(CTRL_ExceptionCodeKindTable a) `$(a.code)`;\r\n}\r\n\r\n@data(String8) ctrl_exception_code_kind_display_string_table:\r\n{\r\n  `{0}`;\r\n  @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp(\"$(a.display_string)\")`;\r\n}\r\n\r\n@data(String8) ctrl_exception_code_kind_lowercase_code_string_table:\r\n{\r\n  `{0}`;\r\n  @expand(CTRL_ExceptionCodeKindTable a) `str8_lit_comp(\"$(a.lower_name)\")`;\r\n}\r\n\r\n@data(B8) ctrl_exception_code_kind_default_enable_table:\r\n{\r\n  `0`;\r\n  @expand(CTRL_ExceptionCodeKindTable a) `$(a.default)`;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Exception Sub-Codes\r\n\r\n@table(name, value)\r\nCTRL_ExceptionSubCodeKindTable:\r\n{\r\n  { W32_FAST_FAIL_LEGACY_GS_VIOLATION               0 }\r\n  { W32_FAST_FAIL_VTGUARD_CHECK_FAILURE             1 }\r\n  { W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE        2 }\r\n  { W32_FAST_FAIL_CORRUPT_LIST_ENTRY                3 }\r\n  { W32_FAST_FAIL_INCORRECT_STACK                   4 }\r\n  { W32_FAST_FAIL_INVALID_ARG                       5 }\r\n  { W32_FAST_FAIL_GS_COOKIE_INIT                    6 }\r\n  { W32_FAST_FAIL_FATAL_APP_EXIT                    7 }\r\n  { W32_FAST_FAIL_RANGE_CHECK_FAILURE               8 }\r\n  { W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS            9 }\r\n  { W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE         10 }\r\n  { W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE         11 }\r\n  { W32_FAST_FAIL_INVALID_FIBER_SWITCH              12 }\r\n  { W32_FAST_FAIL_INVALID_SET_OF_CONTEXT            13 }\r\n  { W32_FAST_FAIL_INVALID_REFERENCE_COUNT           14 }\r\n  { W32_FAST_FAIL_INVALID_JUMP_BUFFER               18 }\r\n  { W32_FAST_FAIL_MRDATA_MODIFIED                   19 }\r\n  { W32_FAST_FAIL_CERTIFICATION_FAILURE             20 }\r\n  { W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN           21 }\r\n  { W32_FAST_FAIL_CRYPTO_LIBRARY                    22 }\r\n  { W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT       23 }\r\n  { W32_FAST_FAIL_INVALID_IMAGE_BASE                24 }\r\n  { W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE          25 }\r\n  { W32_FAST_FAIL_UNSAFE_EXTENSION_CALL             26 }\r\n  { W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED        27 }\r\n  { W32_FAST_FAIL_INVALID_BUFFER_ACCESS             28 }\r\n  { W32_FAST_FAIL_INVALID_BALANCED_TREE             29 }\r\n  { W32_FAST_FAIL_INVALID_NEXT_THREAD               30 }\r\n  { W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED      31 }\r\n  { W32_FAST_FAIL_APCS_DISABLED                     32 }\r\n  { W32_FAST_FAIL_INVALID_IDLE_STATE                33 }\r\n  { W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE         34 }\r\n  { W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION         35 }\r\n  { W32_FAST_FAIL_INVALID_LOCK_STATE                36 }\r\n  { W32_FAST_FAIL_GUARD_JUMPTABLE                   37 }\r\n  { W32_FAST_FAIL_INVALID_LONGJUMP_TARGET           38 }\r\n  { W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT          39 }\r\n  { W32_FAST_FAIL_INVALID_THREAD                    40 }\r\n  { W32_FAST_FAIL_INVALID_SYSCALL_NUMBER            41 }\r\n  { W32_FAST_FAIL_INVALID_FILE_OPERATION            42 }\r\n  { W32_FAST_FAIL_LPAC_ACCESS_DENIED                43 }\r\n  { W32_FAST_FAIL_GUARD_SS_FAILURE                  44 }\r\n  { W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE         45 }\r\n  { W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE  46 }\r\n  { W32_FAST_FAIL_INVALID_CONTROL_STACK             47 }\r\n  { W32_FAST_FAIL_SET_CONTEXT_DENIED                48 }\r\n  { W32_FAST_FAIL_INVALID_IAT                       49 }\r\n  { W32_FAST_FAIL_HEAP_METADATA_CORRUPTION          50 }\r\n  { W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION     51 }\r\n  { W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED           52 }\r\n  { W32_FAST_FAIL_ENCLAVE_CALL_FAILURE              53 }\r\n  { W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON            54 }\r\n  { W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED           55 }\r\n  { W32_FAST_FAIL_UNEXPECTED_CALL                   56 }\r\n  { W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS    57 }\r\n  { W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR          58 }\r\n  { W32_FAST_FAIL_FLAGS_CORRUPTION                  59 }\r\n  { W32_FAST_FAIL_VEH_CORRUPTION                    60 }\r\n  { W32_FAST_FAIL_ETW_CORRUPTION                    61 }\r\n  { W32_FAST_FAIL_RIO_ABORT                         62 }\r\n  { W32_FAST_FAIL_INVALID_PFN                       63 }\r\n  { W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG     64 }\r\n  { W32_FAST_FAIL_CAST_GUARD                        65 }\r\n  { W32_FAST_FAIL_HOST_VISIBILITY_CHANGE            66 }\r\n  { W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST    67 }\r\n  { W32_FAST_FAIL_PATCH_CALLBACK_FAILED             68 }\r\n  { W32_FAST_FAIL_NTDLL_PATCH_FAILED                69 }\r\n  { W32_FAST_FAIL_INVALID_FLS_DATA                  70 }\r\n}\r\n"
  },
  {
    "path": "src/ctrl/ctrl_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/ctrl.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal U64\r\nctrl_hash_from_string(String8 string)\r\n{\r\n  U64 result = XXH3_64bits_withSeed(string.str, string.size, 5381);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_hash_from_handle(CTRL_Handle handle)\r\n{\r\n  U64 buf[] = {handle.machine_id, handle.dmn_handle.u64[0]};\r\n  U64 hash = ctrl_hash_from_string(str8((U8 *)buf, sizeof(buf)));\r\n  return hash;\r\n}\r\n\r\ninternal CTRL_EventCause\r\nctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind)\r\n{\r\n  CTRL_EventCause cause = CTRL_EventCause_Null;\r\n  switch(event_kind)\r\n  {\r\n    default:{}break;\r\n    case DMN_EventKind_Error:    {cause = CTRL_EventCause_Error;}break;\r\n    case DMN_EventKind_Exception:{cause = CTRL_EventCause_InterruptedByException;}break;\r\n    case DMN_EventKind_Trap:     {cause = CTRL_EventCause_InterruptedByTrap;}break;\r\n    case DMN_EventKind_Halt:     {cause = CTRL_EventCause_InterruptedByHalt;}break;\r\n  }\r\n  return cause;\r\n}\r\n\r\ninternal CTRL_ExceptionKind\r\nctrl_exception_kind_from_dmn(DMN_ExceptionKind kind)\r\n{\r\n  CTRL_ExceptionKind result = CTRL_ExceptionKind_Null;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case DMN_ExceptionKind_MemoryRead:    {result = CTRL_ExceptionKind_MemoryRead;}break;\r\n    case DMN_ExceptionKind_MemoryWrite:   {result = CTRL_ExceptionKind_MemoryWrite;}break;\r\n    case DMN_ExceptionKind_MemoryExecute: {result = CTRL_ExceptionKind_MemoryExecute;}break;\r\n    case DMN_ExceptionKind_CppThrow:      {result = CTRL_ExceptionKind_CppThrow;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nctrl_string_from_event_kind(CTRL_EventKind kind)\r\n{\r\n  String8 result = {0};\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case CTRL_EventKind_Null:                              { result = str8_lit(\"Null\");}break;\r\n    case CTRL_EventKind_Error:                             { result = str8_lit(\"Error\");}break;\r\n    case CTRL_EventKind_Started:                           { result = str8_lit(\"Started\");}break;\r\n    case CTRL_EventKind_Stopped:                           { result = str8_lit(\"Stopped\");}break;\r\n    case CTRL_EventKind_NewProc:                           { result = str8_lit(\"NewProc\");}break;\r\n    case CTRL_EventKind_NewThread:                         { result = str8_lit(\"NewThread\");}break;\r\n    case CTRL_EventKind_NewModule:                         { result = str8_lit(\"NewModule\");}break;\r\n    case CTRL_EventKind_EndProc:                           { result = str8_lit(\"EndProc\");}break;\r\n    case CTRL_EventKind_EndThread:                         { result = str8_lit(\"EndThread\");}break;\r\n    case CTRL_EventKind_EndModule:                         { result = str8_lit(\"EndModule\");}break;\r\n    case CTRL_EventKind_ModuleDebugInfoPathChange:         { result = str8_lit(\"ModuleDebugInfoPathChange\");}break;\r\n    case CTRL_EventKind_DebugString:                       { result = str8_lit(\"DebugString\");}break;\r\n    case CTRL_EventKind_ThreadName:                        { result = str8_lit(\"ThreadName\");}break;\r\n    case CTRL_EventKind_MemReserve:                        { result = str8_lit(\"MemReserve\");}break;\r\n    case CTRL_EventKind_MemCommit:                         { result = str8_lit(\"MemCommit\");}break;\r\n    case CTRL_EventKind_MemDecommit:                       { result = str8_lit(\"MemDecommit\");}break;\r\n    case CTRL_EventKind_MemRelease:                        { result = str8_lit(\"MemRelease\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nctrl_string_from_msg_kind(CTRL_MsgKind kind)\r\n{\r\n  String8 result = {0};\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case CTRL_MsgKind_Launch:                    {result = str8_lit(\"Launch\");}break;\r\n    case CTRL_MsgKind_Attach:                    {result = str8_lit(\"Attach\");}break;\r\n    case CTRL_MsgKind_Kill:                      {result = str8_lit(\"Kill\");}break;\r\n    case CTRL_MsgKind_KillAll:                   {result = str8_lit(\"KillAll\");}break;\r\n    case CTRL_MsgKind_Detach:                    {result = str8_lit(\"Detach\");}break;\r\n    case CTRL_MsgKind_Run:                       {result = str8_lit(\"Run\");}break;\r\n    case CTRL_MsgKind_SingleStep:                {result = str8_lit(\"SingleStep\");}break;\r\n    case CTRL_MsgKind_SetUserEntryPoints:        {result = str8_lit(\"SetUserEntryPoints\");}break;\r\n    case CTRL_MsgKind_SetModuleDebugInfoPath:    {result = str8_lit(\"SetModuleDebugInfoPath\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CTRL_EntityKind\r\nctrl_entity_kind_from_string(String8 string)\r\n{\r\n  CTRL_EntityKind result = CTRL_EntityKind_Null;\r\n  for EachNonZeroEnumVal(CTRL_EntityKind, k)\r\n  {\r\n    if(str8_match(ctrl_entity_kind_code_name_table[k], string, 0))\r\n    {\r\n      result = k;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DMN_TrapFlags\r\nctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags)\r\n{\r\n  DMN_TrapFlags result = 0;\r\n  if(flags & CTRL_UserBreakpointFlag_BreakOnWrite)    { result |= DMN_TrapFlag_BreakOnWrite; }\r\n  if(flags & CTRL_UserBreakpointFlag_BreakOnRead)     { result |= DMN_TrapFlag_BreakOnRead; }\r\n  if(flags & CTRL_UserBreakpointFlag_BreakOnExecute)  { result |= DMN_TrapFlag_BreakOnExecute; }\r\n  return result;\r\n}\r\n\r\ninternal CTRL_UserBreakpointFlags\r\nctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags)\r\n{\r\n  CTRL_UserBreakpointFlags result = 0;\r\n  if(flags & DMN_TrapFlag_BreakOnWrite)    { result |= CTRL_UserBreakpointFlag_BreakOnWrite; }\r\n  if(flags & DMN_TrapFlag_BreakOnRead)     { result |= CTRL_UserBreakpointFlag_BreakOnRead; }\r\n  if(flags & DMN_TrapFlag_BreakOnExecute)  { result |= CTRL_UserBreakpointFlag_BreakOnExecute; }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Machine/Handle Pair Type Functions\r\n\r\ninternal CTRL_Handle\r\nctrl_handle_zero(void)\r\n{\r\n  CTRL_Handle handle = {0};\r\n  return handle;\r\n}\r\n\r\ninternal CTRL_Handle\r\nctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle)\r\n{\r\n  CTRL_Handle handle = {machine_id, dmn_handle};\r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nctrl_handle_match(CTRL_Handle a, CTRL_Handle b)\r\n{\r\n  B32 result = (a.machine_id == b.machine_id &&\r\n                dmn_handle_match(a.dmn_handle, b.dmn_handle));\r\n  return result;\r\n}\r\n\r\ninternal void\r\nctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair)\r\n{\r\n  CTRL_HandleNode *n = push_array(arena, CTRL_HandleNode, 1);\r\n  MemoryCopyStruct(&n->v, pair);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal CTRL_HandleList\r\nctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src)\r\n{\r\n  CTRL_HandleList dst = {0};\r\n  for(CTRL_HandleNode *n = src->first; n != 0; n = n->next)\r\n  {\r\n    ctrl_handle_list_push(arena, &dst, &n->v);\r\n  }\r\n  return dst;\r\n}\r\n\r\ninternal CTRL_HandleArray\r\nctrl_handle_array_from_list(Arena  *arena, CTRL_HandleList *src)\r\n{\r\n  CTRL_HandleArray array = {0};\r\n  array.count = src->count;\r\n  array.v = push_array_no_zero(arena, CTRL_Handle, array.count);\r\n  {\r\n    U64 idx = 0;\r\n    for(CTRL_HandleNode *n = src->first; n != 0; n = n->next, idx += 1)\r\n    {\r\n      array.v[idx] = n->v;\r\n    }\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal String8\r\nctrl_string_from_handle(Arena *arena, CTRL_Handle handle)\r\n{\r\n  String8 result = push_str8f(arena, \"$%I64x$%I64x\", handle.machine_id, handle.dmn_handle.u64[0]);\r\n  return result;\r\n}\r\n\r\ninternal CTRL_Handle\r\nctrl_handle_from_string(String8 string)\r\n{\r\n  CTRL_Handle handle = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    U8 split = '$';\r\n    String8List parts = str8_split(scratch.arena, string, &split, 1, 0);\r\n    if(parts.first && parts.first->next)\r\n    {\r\n      CTRL_MachineID machine_id = u64_from_str8(parts.first->string, 16);\r\n      DMN_Handle dmn_handle = {0};\r\n      dmn_handle.u64[0] = u64_from_str8(parts.first->next->string, 16);\r\n      handle.machine_id = machine_id;\r\n      handle.dmn_handle = dmn_handle;\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return handle;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Trap Type Functions\r\n\r\ninternal void\r\nctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap)\r\n{\r\n  CTRL_TrapNode *node = push_array(arena, CTRL_TrapNode, 1);\r\n  MemoryCopyStruct(&node->v, trap);\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->count += 1;\r\n}\r\n\r\ninternal CTRL_TrapList\r\nctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src)\r\n{\r\n  CTRL_TrapList dst = {0};\r\n  for(CTRL_TrapNode *src_n = src->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    ctrl_trap_list_push(arena, &dst, &src_n->v);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: User Breakpoint Type Functions\r\n\r\ninternal void\r\nctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp)\r\n{\r\n  CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1);\r\n  MemoryCopyStruct(&n->v, bp);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal CTRL_UserBreakpointList\r\nctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src)\r\n{\r\n  CTRL_UserBreakpointList dst = {0};\r\n  for(CTRL_UserBreakpointNode *src_n = src->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    CTRL_UserBreakpoint dst_bp = zero_struct;\r\n    MemoryCopyStruct(&dst_bp, &src_n->v);\r\n    dst_bp.string = push_str8_copy(arena, src_n->v.string);\r\n    dst_bp.condition = push_str8_copy(arena, src_n->v.condition);\r\n    ctrl_user_breakpoint_list_push(arena, &dst, &dst_bp);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Type Functions\r\n\r\n//- rjf: deep copying\r\n\r\ninternal void\r\nctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src)\r\n{\r\n  MemoryCopyStruct(dst, src);\r\n  dst->path                 = push_str8_copy(arena, src->path);\r\n  dst->entry_points         = str8_list_copy(arena, &src->entry_points);\r\n  dst->cmd_line_string_list = str8_list_copy(arena, &src->cmd_line_string_list);\r\n  dst->env_string_list      = str8_list_copy(arena, &src->env_string_list);\r\n  dst->traps                = ctrl_trap_list_copy(arena, &src->traps);\r\n  dst->user_bps             = ctrl_user_breakpoint_list_copy(arena, &src->user_bps);\r\n}\r\n\r\n//- rjf: list building\r\n\r\ninternal CTRL_Msg *\r\nctrl_msg_list_push(Arena *arena, CTRL_MsgList *list)\r\n{\r\n  CTRL_MsgNode *n = push_array(arena, CTRL_MsgNode, 1);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  CTRL_Msg *msg = &n->v;\r\n  return msg;\r\n}\r\n\r\ninternal CTRL_MsgList\r\nctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src)\r\n{\r\n  CTRL_MsgList dst = {0};\r\n  for(CTRL_MsgNode *n = src->first; n != 0; n = n->next)\r\n  {\r\n    CTRL_Msg *src_msg = &n->v;\r\n    CTRL_Msg *dst_msg = ctrl_msg_list_push(arena, &dst);\r\n    ctrl_msg_deep_copy(arena, dst_msg, src_msg);\r\n  }\r\n  return dst;\r\n}\r\n\r\ninternal void\r\nctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src)\r\n{\r\n  if(dst->last && src->first)\r\n  {\r\n    dst->last->next = src->first;\r\n    dst->last = src->last;\r\n    dst->count += src->count;\r\n  }\r\n  else if(src->first)\r\n  {\r\n    MemoryCopyStruct(dst, src);\r\n  }\r\n  MemoryZeroStruct(src);\r\n}\r\n\r\n//- rjf: serialization\r\n\r\ninternal String8\r\nctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List msgs_srlzed = {0};\r\n  str8_serial_begin(scratch.arena, &msgs_srlzed);\r\n  {\r\n    // rjf: write message count\r\n    str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msgs->count);\r\n    \r\n    // rjf: write all message data\r\n    for(CTRL_MsgNode *msg_n = msgs->first; msg_n != 0; msg_n = msg_n->next)\r\n    {\r\n      CTRL_Msg *msg = &msg_n->v;\r\n      \r\n      // rjf: write flat parts\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->kind);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->run_flags);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->msg_id);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->parent);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entity_id);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->exit_code);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_inherit);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->debug_subprocesses);\r\n      str8_serial_push_array (scratch.arena, &msgs_srlzed, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters));\r\n      \r\n      // rjf: write path string\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->path.size);\r\n      str8_serial_push_data(scratch.arena, &msgs_srlzed, msg->path.str, msg->path.size);\r\n      \r\n      // rjf: write entry point string list\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->entry_points.node_count);\r\n      for(String8Node *n = msg->entry_points.first; n != 0; n = n->next)\r\n      {\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size);\r\n        str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size);\r\n      }\r\n      \r\n      // rjf: write command line string list\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->cmd_line_string_list.node_count);\r\n      for(String8Node *n = msg->cmd_line_string_list.first; n != 0; n = n->next)\r\n      {\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size);\r\n        str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size);\r\n      }\r\n      \r\n      // rjf: write environment string list\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->env_string_list.node_count);\r\n      for(String8Node *n = msg->env_string_list.first; n != 0; n = n->next)\r\n      {\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &n->string.size);\r\n        str8_serial_push_data(scratch.arena, &msgs_srlzed, n->string.str, n->string.size);\r\n      }\r\n      \r\n      // rjf: write stdout/stderr/stdin paths\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdout_path.size);\r\n      str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdout_path);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stderr_path.size);\r\n      str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stderr_path);\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->stdin_path.size);\r\n      str8_serial_push_string(scratch.arena, &msgs_srlzed, msg->stdin_path);\r\n      \r\n      // rjf: write trap list\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->traps.count);\r\n      for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next)\r\n      {\r\n        CTRL_Trap *trap = &n->v;\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->flags);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &trap->vaddr);\r\n      }\r\n      \r\n      // rjf: write user breakpoint list\r\n      str8_serial_push_struct(scratch.arena, &msgs_srlzed, &msg->user_bps.count);\r\n      for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next)\r\n      {\r\n        CTRL_UserBreakpoint *bp = &n->v;\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->kind);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->flags);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->id);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->string.size);\r\n        str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->string.str, bp->string.size);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->pt);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->size);\r\n        str8_serial_push_struct(scratch.arena, &msgs_srlzed, &bp->condition.size);\r\n        str8_serial_push_data(scratch.arena, &msgs_srlzed, bp->condition.str, bp->condition.size);\r\n      }\r\n    }\r\n  }\r\n  String8 string = str8_serial_end(arena, &msgs_srlzed);\r\n  scratch_end(scratch);\r\n  return string;\r\n}\r\n\r\ninternal CTRL_MsgList\r\nctrl_msg_list_from_serialized_string(Arena *arena, String8 string)\r\n{\r\n  CTRL_MsgList msgs = {0};\r\n  {\r\n    U64 read_off = 0;\r\n    \r\n    // rjf: read message count\r\n    U64 msg_count = 0;\r\n    read_off += str8_deserial_read_struct(string, read_off, &msg_count);\r\n    \r\n    // rjf: read data for all messages\r\n    for(U64 msg_idx = 0; msg_idx < msg_count; msg_idx += 1)\r\n    {\r\n      // rjf: construct message\r\n      CTRL_MsgNode *msg_node = push_array(arena, CTRL_MsgNode, 1);\r\n      SLLQueuePush(msgs.first, msgs.last, msg_node);\r\n      msgs.count += 1;\r\n      CTRL_Msg *msg = &msg_node->v;\r\n      \r\n      // rjf: read flat data\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->kind);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->run_flags);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->msg_id);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->entity);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->parent);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->entity_id);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->exit_code);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->env_inherit);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->debug_subprocesses);\r\n      read_off += str8_deserial_read_array (string, read_off, &msg->exception_code_filters[0], ArrayCount(msg->exception_code_filters));\r\n      \r\n      // rjf: read path string\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->path.size);\r\n      msg->path.str = push_array_no_zero(arena, U8, msg->path.size);\r\n      read_off += str8_deserial_read(string, read_off, msg->path.str, msg->path.size, 1);\r\n      \r\n      // rjf: read entry point string list\r\n      U64 entry_point_list_string_count = 0;\r\n      read_off += str8_deserial_read_struct(string, read_off, &entry_point_list_string_count);\r\n      for(U64 idx = 0; idx < entry_point_list_string_count; idx += 1)\r\n      {\r\n        String8 str = {0};\r\n        read_off += str8_deserial_read_struct(string, read_off, &str.size);\r\n        str.str = push_array_no_zero(arena, U8, str.size);\r\n        read_off += str8_deserial_read(string, read_off, str.str, str.size, 1);\r\n        str8_list_push(arena, &msg->entry_points, str);\r\n      }\r\n      \r\n      // rjf: read command line string list\r\n      U64 cmd_line_string_count = 0;\r\n      read_off += str8_deserial_read_struct(string, read_off, &cmd_line_string_count);\r\n      for(U64 idx = 0; idx < cmd_line_string_count; idx += 1)\r\n      {\r\n        String8 cmd_line_str = {0};\r\n        read_off += str8_deserial_read_struct(string, read_off, &cmd_line_str.size);\r\n        cmd_line_str.str = push_array_no_zero(arena, U8, cmd_line_str.size);\r\n        read_off += str8_deserial_read(string, read_off, cmd_line_str.str, cmd_line_str.size, 1);\r\n        str8_list_push(arena, &msg->cmd_line_string_list, cmd_line_str);\r\n      }\r\n      \r\n      // rjf: read environment string list\r\n      U64 env_string_count = 0;\r\n      read_off += str8_deserial_read_struct(string, read_off, &env_string_count);\r\n      for(U64 idx = 0; idx < env_string_count; idx += 1)\r\n      {\r\n        String8 env_str = {0};\r\n        read_off += str8_deserial_read_struct(string, read_off, &env_str.size);\r\n        env_str.str = push_array_no_zero(arena, U8, env_str.size);\r\n        read_off += str8_deserial_read(string, read_off, env_str.str, env_str.size, 1);\r\n        str8_list_push(arena, &msg->env_string_list, env_str);\r\n      }\r\n      \r\n      // rjf: read stdout/stderr/stdin paths\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->stdout_path.size);\r\n      msg->stdout_path.str = push_array(arena, U8, msg->stdout_path.size);\r\n      read_off += str8_deserial_read(string, read_off, msg->stdout_path.str, msg->stdout_path.size, 1);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->stderr_path.size);\r\n      msg->stderr_path.str = push_array(arena, U8, msg->stderr_path.size);\r\n      read_off += str8_deserial_read(string, read_off, msg->stderr_path.str, msg->stderr_path.size, 1);\r\n      read_off += str8_deserial_read_struct(string, read_off, &msg->stdin_path.size);\r\n      msg->stdin_path.str = push_array(arena, U8, msg->stdin_path.size);\r\n      read_off += str8_deserial_read(string, read_off, msg->stdin_path.str, msg->stdin_path.size, 1);\r\n      \r\n      // rjf: read trap list\r\n      U64 trap_count = 0;\r\n      read_off += str8_deserial_read_struct(string, read_off, &trap_count);\r\n      for(U64 idx = 0; idx < trap_count; idx += 1)\r\n      {\r\n        CTRL_TrapNode *n = push_array(arena, CTRL_TrapNode, 1);\r\n        SLLQueuePush(msg->traps.first, msg->traps.last, n);\r\n        msg->traps.count += 1;\r\n        CTRL_Trap *trap = &n->v;\r\n        read_off += str8_deserial_read_struct(string, read_off, &trap->flags);\r\n        read_off += str8_deserial_read_struct(string, read_off, &trap->vaddr);\r\n      }\r\n      \r\n      // rjf: read user breakpoint list\r\n      U64 user_bp_count = 0;\r\n      read_off += str8_deserial_read_struct(string, read_off, &user_bp_count);\r\n      for(U64 idx = 0; idx < user_bp_count; idx += 1)\r\n      {\r\n        CTRL_UserBreakpointNode *n = push_array(arena, CTRL_UserBreakpointNode, 1);\r\n        SLLQueuePush(msg->user_bps.first, msg->user_bps.last, n);\r\n        msg->user_bps.count += 1;\r\n        CTRL_UserBreakpoint *bp = &n->v;\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->kind);\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->flags);\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->id);\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->string.size);\r\n        bp->string.str = push_array_no_zero(arena, U8, bp->string.size);\r\n        read_off += str8_deserial_read(string, read_off, bp->string.str, bp->string.size, 1);\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->pt);\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->size);\r\n        read_off += str8_deserial_read_struct(string, read_off, &bp->condition.size);\r\n        bp->condition.str = push_array_no_zero(arena, U8, bp->condition.size);\r\n        read_off += str8_deserial_read(string, read_off, bp->condition.str, bp->condition.size, 1);\r\n      }\r\n    }\r\n  }\r\n  return msgs;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Type Functions\r\n\r\n//- rjf: list building\r\n\r\ninternal CTRL_Event *\r\nctrl_event_list_push(Arena *arena, CTRL_EventList *list)\r\n{\r\n  CTRL_EventNode *n = push_array(arena, CTRL_EventNode, 1);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  CTRL_Event *event = &n->v;\r\n  return event;\r\n}\r\n\r\ninternal void\r\nctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push)\r\n{\r\n  if(dst->last == 0)\r\n  {\r\n    MemoryCopyStruct(dst, to_push);\r\n  }\r\n  else if(to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->count += to_push->count;\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\n//- rjf: serialization\r\n\r\ninternal String8\r\nctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List srl = {0};\r\n  str8_serial_begin(scratch.arena, &srl);\r\n  {\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->kind);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->cause);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->exception_kind);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->msg_id);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->entity);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->parent);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->arch);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->u64_code);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->entity_id);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->vaddr_rng);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->rip_vaddr);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->stack_base);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->tls_root);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->timestamp);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->exception_code);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->rgba);\r\n    str8_serial_push_struct(scratch.arena, &srl, &event->bp_flags);\r\n    String8 string = event->string;\r\n    string.size = Min(string.size, max-srl.total_size);\r\n    str8_serial_push_struct(scratch.arena, &srl, &string.size);\r\n    str8_serial_push_data(scratch.arena, &srl, string.str, string.size);\r\n  }\r\n  String8 string = str8_serial_end(arena, &srl);\r\n  scratch_end(scratch);\r\n  return string;\r\n}\r\n\r\ninternal CTRL_Event\r\nctrl_event_from_serialized_string(Arena *arena, String8 string)\r\n{\r\n  CTRL_Event event = zero_struct;\r\n  {\r\n    U64 read_off = 0;\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.kind);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.cause);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.exception_kind);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.msg_id);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.entity);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.parent);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.arch);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.u64_code);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.entity_id);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.vaddr_rng);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.rip_vaddr);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.stack_base);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.tls_root);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.timestamp);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.exception_code);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.rgba);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.bp_flags);\r\n    read_off += str8_deserial_read_struct(string, read_off, &event.string.size);\r\n    event.string.str = push_array_no_zero(arena, U8, event.string.size);\r\n    read_off += str8_deserial_read(string, read_off, event.string.str, event.string.size, 1);\r\n  }\r\n  return event;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Type Functions\r\n\r\n//- rjf: entity list data structures\r\n\r\ninternal void\r\nctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity)\r\n{\r\n  CTRL_EntityNode *n = push_array(arena, CTRL_EntityNode, 1);\r\n  n->v = entity;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal CTRL_EntityList\r\nctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list)\r\n{\r\n  CTRL_EntityList result = {0};\r\n  for(CTRL_HandleNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    CTRL_Entity *entity = ctrl_entity_from_handle(ctx, n->v);\r\n    ctrl_entity_list_push(arena, &result, entity);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: entity array data structure\r\n\r\ninternal CTRL_EntityArray\r\nctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list)\r\n{\r\n  CTRL_EntityArray result = {0};\r\n  result.count = list->count;\r\n  result.v = push_array_no_zero(arena, CTRL_Entity *, result.count);\r\n  U64 idx = 0;\r\n  for(CTRL_EntityNode *n = list->first; n != 0; n = n->next, idx += 1)\r\n  {\r\n    result.v[idx] = n->v;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: entity context (entity group read-only) functions\r\n\r\ninternal CTRL_Entity *\r\nctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle)\r\n{\r\n  CTRL_Entity *entity = &ctrl_entity_nil;\r\n  if(!ctrl_handle_match(handle, ctrl_handle_zero()))\r\n  {\r\n    U64 hash = ctrl_hash_from_handle(handle);\r\n    U64 slot_idx = hash%ctx->hash_slots_count;\r\n    CTRL_EntityHashSlot *slot = &ctx->hash_slots[slot_idx];\r\n    CTRL_EntityHashNode *node = 0;\r\n    for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(ctrl_handle_match(n->entity->handle, handle))\r\n      {\r\n        entity = n->entity;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return entity;\r\n}\r\n\r\ninternal CTRL_Entity *\r\nctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind)\r\n{\r\n  CTRL_Entity *result = &ctrl_entity_nil;\r\n  for(CTRL_Entity *child = parent->first;\r\n      child != &ctrl_entity_nil;\r\n      child = child->next)\r\n  {\r\n    if(child->kind == kind)\r\n    {\r\n      result = child;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CTRL_Entity *\r\nctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind)\r\n{\r\n  CTRL_Entity *result = &ctrl_entity_nil;\r\n  for(CTRL_Entity *p = entity->parent; p != &ctrl_entity_nil; p = p->parent)\r\n  {\r\n    if(p->kind == kind)\r\n    {\r\n      result = p;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CTRL_Entity *\r\nctrl_process_from_entity(CTRL_Entity *entity)\r\n{\r\n  CTRL_Entity *result = &ctrl_entity_nil;\r\n  if(entity->kind == CTRL_EntityKind_Process)\r\n  {\r\n    result = entity;\r\n  }\r\n  else\r\n  {\r\n    result = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CTRL_Entity *\r\nctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr)\r\n{\r\n  CTRL_Entity *result = &ctrl_entity_nil;\r\n  for(CTRL_Entity *child = process->first;\r\n      child != &ctrl_entity_nil;\r\n      child = child->next)\r\n  {\r\n    if(child->kind == CTRL_EntityKind_Module && contains_1u64(child->vaddr_range, vaddr))\r\n    {\r\n      result = child;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DI_Key\r\nctrl_dbgi_key_from_module(CTRL_Entity *module)\r\n{\r\n  CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath);\r\n  DI_Key dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp);\r\n  return dbgi_key;\r\n}\r\n\r\ninternal CTRL_Entity *\r\nctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates)\r\n{\r\n  CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n  U64 thread_rip_vaddr = ctrl_rip_from_thread(ctx, thread->handle);\r\n  CTRL_Entity *src_module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr);\r\n  CTRL_Entity *module = &ctrl_entity_nil;\r\n  for(CTRL_EntityNode *n = candidates->first; n != 0; n = n->next)\r\n  {\r\n    CTRL_Entity *candidate_module = n->v;\r\n    CTRL_Entity *candidate_process = ctrl_entity_ancestor_from_kind(candidate_module, CTRL_EntityKind_Process);\r\n    if(candidate_process == process)\r\n    {\r\n      module = candidate_module;\r\n    }\r\n    if(candidate_module == src_module)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return module;\r\n}\r\n\r\ninternal U64\r\nctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff)\r\n{\r\n  U64 result = voff + module->vaddr_range.min;\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr)\r\n{\r\n  U64 result = vaddr - module->vaddr_range.min;\r\n  return result;\r\n}\r\n\r\ninternal Rng1U64\r\nctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range)\r\n{\r\n  U64 dim = dim_1u64(voff_range);\r\n  U64 min = ctrl_vaddr_from_voff(module, voff_range.min);\r\n  Rng1U64 result = {min, min+dim};\r\n  return result;\r\n}\r\n\r\ninternal Rng1U64\r\nctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range)\r\n{\r\n  U64 dim = dim_1u64(vaddr_range);\r\n  U64 min = ctrl_voff_from_vaddr(module, vaddr_range.min);\r\n  Rng1U64 result = {min, min+dim};\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nctrl_entity_tree_is_frozen(CTRL_Entity *root)\r\n{\r\n  B32 is_frozen = 1;\r\n  for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next)\r\n  {\r\n    if(e->kind == CTRL_EntityKind_Thread && !e->is_frozen)\r\n    {\r\n      is_frozen = 0;\r\n      break;\r\n    }\r\n  }\r\n  return is_frozen;\r\n}\r\n\r\n//- rjf: entity ctx r/w store state functions\r\n\r\ninternal CTRL_EntityCtxRWStore *\r\nctrl_entity_ctx_rw_store_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  CTRL_EntityCtxRWStore *store = push_array(arena, CTRL_EntityCtxRWStore, 1);\r\n  store->arena = arena;\r\n  store->ctx.hash_slots_count = 1024;\r\n  store->ctx.hash_slots = push_array(arena, CTRL_EntityHashSlot, store->ctx.hash_slots_count);\r\n  CTRL_Entity *root = store->ctx.root = ctrl_entity_alloc(store, &ctrl_entity_nil, CTRL_EntityKind_Root, Arch_Null, ctrl_handle_zero(), 0);\r\n  CTRL_Entity *local_machine = ctrl_entity_alloc(store, root, CTRL_EntityKind_Machine, Arch_CURRENT, ctrl_handle_make(CTRL_MachineID_Local, dmn_handle_zero()), 0);\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 local_machine_name = push_str8f(scratch.arena, \"This PC (%S)\", os_get_system_info()->machine_name);\r\n  ctrl_entity_equip_string(store, local_machine, local_machine_name);\r\n  scratch_end(scratch);\r\n  return store;\r\n}\r\n\r\ninternal void\r\nctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store)\r\n{\r\n  arena_release(store->arena);\r\n}\r\n\r\n//- rjf: string allocation/deletion\r\n\r\ninternal U64\r\nctrl_name_bucket_num_from_string_size(U64 size)\r\n{\r\n  U64 bucket_num = 0;\r\n  if(size > 0)\r\n  {\r\n    for EachElement(idx, ctrl_entity_string_bucket_chunk_sizes)\r\n    {\r\n      if(size <= ctrl_entity_string_bucket_chunk_sizes[idx])\r\n      {\r\n        bucket_num = idx+1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return bucket_num;\r\n}\r\n\r\ninternal String8\r\nctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string)\r\n{\r\n  //- rjf: allocate node\r\n  CTRL_EntityStringChunkNode *node = 0;\r\n  {\r\n    U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size);\r\n    if(bucket_num == ArrayCount(ctrl_entity_string_bucket_chunk_sizes))\r\n    {\r\n      CTRL_EntityStringChunkNode *best_node = 0;\r\n      CTRL_EntityStringChunkNode *best_node_prev = 0;\r\n      U64 best_node_size = max_U64;\r\n      {\r\n        for(CTRL_EntityStringChunkNode *n = store->free_string_chunks[bucket_num-1], *prev = 0; n != 0; (prev = n, n = n->next))\r\n        {\r\n          if(n->size >= string.size && n->size < best_node_size)\r\n          {\r\n            best_node = n;\r\n            best_node_prev = prev;\r\n            best_node_size = n->size;\r\n          }\r\n        }\r\n      }\r\n      if(best_node != 0)\r\n      {\r\n        node = best_node;\r\n        if(best_node_prev)\r\n        {\r\n          best_node_prev->next = best_node->next;\r\n        }\r\n        else\r\n        {\r\n          store->free_string_chunks[bucket_num-1] = best_node->next;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        U64 chunk_size = u64_up_to_pow2(string.size);\r\n        node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, chunk_size);\r\n      }\r\n    }\r\n    else if(bucket_num != 0)\r\n    {\r\n      node = store->free_string_chunks[bucket_num-1];\r\n      if(node != 0)\r\n      {\r\n        SLLStackPop(store->free_string_chunks[bucket_num-1]);\r\n      }\r\n      else\r\n      {\r\n        node = (CTRL_EntityStringChunkNode *)push_array(store->arena, U8, ctrl_entity_string_bucket_chunk_sizes[bucket_num-1]);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill node\r\n  String8 result = {0};\r\n  if(node != 0)\r\n  {\r\n    result.str = (U8 *)node;\r\n    result.size = string.size;\r\n    MemoryCopy(result.str, string.str, result.size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string)\r\n{\r\n  U64 bucket_num = ctrl_name_bucket_num_from_string_size(string.size);\r\n  if(1 <= bucket_num && bucket_num <= ArrayCount(ctrl_entity_string_bucket_chunk_sizes))\r\n  {\r\n    U64 bucket_idx = bucket_num-1;\r\n    CTRL_EntityStringChunkNode *node = (CTRL_EntityStringChunkNode *)string.str;\r\n    SLLStackPush(store->free_string_chunks[bucket_idx], node);\r\n    node->size = u64_up_to_pow2(string.size);\r\n  }\r\n}\r\n\r\n//- rjf: entity construction/deletion\r\n\r\ninternal CTRL_Entity *\r\nctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id)\r\n{\r\n  CTRL_Entity *entity = &ctrl_entity_nil;\r\n  {\r\n    // rjf: allocate\r\n    entity = store->free;\r\n    {\r\n      if(entity != 0)\r\n      {\r\n        SLLStackPop(store->free);\r\n      }\r\n      else\r\n      {\r\n        entity = push_array_no_zero(store->arena, CTRL_Entity, 1);\r\n      }\r\n      MemoryZeroStruct(entity);\r\n    }\r\n    \r\n    // rjf: fill\r\n    {\r\n      entity->kind        = kind;\r\n      entity->arch        = arch;\r\n      entity->handle      = handle;\r\n      entity->id          = id;\r\n      entity->parent      = parent;\r\n      entity->next = entity->prev = entity->first = entity->last = &ctrl_entity_nil;\r\n      if(parent != &ctrl_entity_nil)\r\n      {\r\n        DLLPushBack_NPZ(&ctrl_entity_nil, parent->first, parent->last, entity, next, prev);\r\n      }\r\n    }\r\n    \r\n    // rjf: insert into hash map\r\n    {\r\n      U64 hash = ctrl_hash_from_handle(handle);\r\n      U64 slot_idx = hash%store->ctx.hash_slots_count;\r\n      CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx];\r\n      CTRL_EntityHashNode *node = 0;\r\n      for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(ctrl_handle_match(n->entity->handle, handle))\r\n        {\r\n          node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(node == 0)\r\n      {\r\n        node = store->hash_node_free;\r\n        if(node != 0)\r\n        {\r\n          SLLStackPop(store->hash_node_free);\r\n        }\r\n        else\r\n        {\r\n          node = push_array_no_zero(store->arena, CTRL_EntityHashNode, 1);\r\n        }\r\n        MemoryZeroStruct(node);\r\n        DLLPushBack(slot->first, slot->last, node);\r\n        node->entity = entity;\r\n      }\r\n    }\r\n    \r\n    // rjf: bump counters\r\n    store->ctx.entity_kind_counts[kind] += 1;\r\n    store->ctx.entity_kind_alloc_gens[kind] += 1;\r\n  }\r\n  return entity;\r\n}\r\n\r\ninternal void\r\nctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity)\r\n{\r\n  // rjf: unhook root\r\n  if(entity->parent != &ctrl_entity_nil)\r\n  {\r\n    DLLRemove_NPZ(&ctrl_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev);\r\n  }\r\n  \r\n  // rjf: walk every entity in this tree, free each\r\n  if(entity != &ctrl_entity_nil)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      CTRL_Entity *e;\r\n    };\r\n    Task start_task = {0, entity};\r\n    Task *first_task = &start_task;\r\n    Task *last_task = &start_task;\r\n    for(Task *t = first_task; t != 0; t = t->next)\r\n    {\r\n      for(CTRL_Entity *child = t->e->first; child != &ctrl_entity_nil; child = child->next)\r\n      {\r\n        Task *t = push_array(scratch.arena, Task, 1);\r\n        t->e = child;\r\n        SLLQueuePush(first_task, last_task, t);\r\n      }\r\n      \r\n      // rjf: free entity\r\n      SLLStackPush(store->free, t->e);\r\n      \r\n      // rjf: remove from hash map\r\n      {\r\n        U64 hash = ctrl_hash_from_handle(t->e->handle);\r\n        U64 slot_idx = hash%store->ctx.hash_slots_count;\r\n        CTRL_EntityHashSlot *slot = &store->ctx.hash_slots[slot_idx];\r\n        CTRL_EntityHashNode *node = 0;\r\n        for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next)\r\n        {\r\n          if(ctrl_handle_match(n->entity->handle, t->e->handle))\r\n          {\r\n            DLLRemove(slot->first, slot->last, n);\r\n            SLLStackPush(store->hash_node_free, n);\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: dec counter\r\n      store->ctx.entity_kind_counts[t->e->kind] -= 1;\r\n      store->ctx.entity_kind_alloc_gens[t->e->kind] += 1;\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\n//- rjf: entity equipment\r\n\r\ninternal void\r\nctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string)\r\n{\r\n  if(entity->string.size != 0)\r\n  {\r\n    ctrl_entity_string_release(store, entity->string);\r\n  }\r\n  entity->string = ctrl_entity_string_alloc(store, string);\r\n}\r\n\r\n//- rjf: accelerated entity context lookups\r\n\r\ninternal CTRL_EntityCtxLookupAccel *\r\nctrl_thread_entity_ctx_lookup_accel(void)\r\n{\r\n  if(ctrl_entity_ctx_lookup_accel == 0)\r\n  {\r\n    Arena *arena = arena_alloc();\r\n    ctrl_entity_ctx_lookup_accel = push_array(arena, CTRL_EntityCtxLookupAccel, 1);\r\n    ctrl_entity_ctx_lookup_accel->arena = arena;\r\n    for EachEnumVal(CTRL_EntityKind, k)\r\n    {\r\n      ctrl_entity_ctx_lookup_accel->entity_kind_arrays_arenas[k] = arena_alloc();\r\n    }\r\n  }\r\n  return ctrl_entity_ctx_lookup_accel;\r\n}\r\n\r\ninternal CTRL_EntityArray\r\nctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind)\r\n{\r\n  CTRL_EntityCtxLookupAccel *accel = ctrl_thread_entity_ctx_lookup_accel();\r\n  if(accel->entity_kind_arrays_gens[kind] != ctx->entity_kind_alloc_gens[kind])\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    CTRL_EntityList entities = {0};\r\n    for(CTRL_Entity *e = ctx->root;\r\n        e != &ctrl_entity_nil;\r\n        e = ctrl_entity_rec_depth_first_pre(e, ctx->root).next)\r\n    {\r\n      if(e->kind == kind)\r\n      {\r\n        ctrl_entity_list_push(scratch.arena, &entities, e);\r\n      }\r\n    }\r\n    accel->entity_kind_arrays_gens[kind] = ctx->entity_kind_alloc_gens[kind];\r\n    arena_clear(accel->entity_kind_arrays_arenas[kind]);\r\n    accel->entity_kind_arrays[kind] = ctrl_entity_array_from_list(accel->entity_kind_arrays_arenas[kind], &entities);\r\n    scratch_end(scratch);\r\n  }\r\n  return accel->entity_kind_arrays[kind];\r\n}\r\n\r\ninternal CTRL_EntityList\r\nctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key)\r\n{\r\n  CTRL_EntityList list = {0};\r\n  CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Module);\r\n  for EachIndex(idx, all_modules.count)\r\n  {\r\n    CTRL_Entity *module = all_modules.v[idx];\r\n    DI_Key module_dbgi_key = ctrl_dbgi_key_from_module(module);\r\n    if(di_key_match(module_dbgi_key, dbgi_key))\r\n    {\r\n      ctrl_entity_list_push(arena, &list, module);\r\n    }\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal CTRL_Entity *\r\nctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id)\r\n{\r\n  CTRL_Entity *thread = &ctrl_entity_nil;\r\n  CTRL_EntityArray threads = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread);\r\n  for EachIndex(idx, threads.count)\r\n  {\r\n    if(threads.v[idx]->id == id)\r\n    {\r\n      thread = threads.v[idx];\r\n    }\r\n  }\r\n  return thread;\r\n}\r\n\r\n//- rjf: entity tree iteration\r\n\r\ninternal CTRL_EntityRec\r\nctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off)\r\n{\r\n  CTRL_EntityRec result = {0};\r\n  result.next = &ctrl_entity_nil;\r\n  if((*MemberFromOffset(CTRL_Entity **, entity, child_off)) != &ctrl_entity_nil)\r\n  {\r\n    result.next = *MemberFromOffset(CTRL_Entity **, entity, child_off);\r\n    result.push_count = 1;\r\n  }\r\n  else for(CTRL_Entity *parent = entity; parent != subtree_root && parent != &ctrl_entity_nil; parent = parent->parent)\r\n  {\r\n    if(parent != subtree_root && (*MemberFromOffset(CTRL_Entity **, parent, sib_off)) != &ctrl_entity_nil)\r\n    {\r\n      result.next = *MemberFromOffset(CTRL_Entity **, parent, sib_off);\r\n      break;\r\n    }\r\n    result.pop_count += 1;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: applying events to entity caches\r\n\r\ninternal void\r\nctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list)\r\n{\r\n  //- rjf: scan events & construct entities\r\n  for(CTRL_EventNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    CTRL_Event *event = &n->v;\r\n    switch(event->kind)\r\n    {\r\n      default:{}break;\r\n      \r\n      //- rjf: processes\r\n      case CTRL_EventKind_NewProc:\r\n      {\r\n        CTRL_Entity *machine = ctrl_entity_from_handle(&store->ctx, ctrl_handle_make(event->entity.machine_id, dmn_handle_zero()));\r\n        CTRL_Entity *process = ctrl_entity_alloc(store, machine, CTRL_EntityKind_Process, event->arch, event->entity, (U64)event->entity_id);\r\n      }break;\r\n      case CTRL_EventKind_EndProc:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        ctrl_entity_release(store, process);\r\n        for(CTRL_Entity *entry = store->ctx.root->first, *next = &ctrl_entity_nil;\r\n            entry != &ctrl_entity_nil;\r\n            entry = next)\r\n        {\r\n          next = entry->next;\r\n          if(entry->kind == CTRL_EntityKind_EntryPoint && entry->id == process->id)\r\n          {\r\n            ctrl_entity_release(store, entry);\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: threads\r\n      case CTRL_EventKind_NewThread:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        CTRL_Entity *thread = ctrl_entity_alloc(store, process, CTRL_EntityKind_Thread, event->arch, event->entity, (U64)event->entity_id);\r\n        CTRL_Entity *first_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread);\r\n        if(first_thread == thread)\r\n        {\r\n          ctrl_entity_equip_string(store, thread, str8_lit(\"main_thread\"));\r\n        }\r\n        CTRL_EntityArray pending_thread_names = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadName);\r\n        for EachIndex(idx, pending_thread_names.count)\r\n        {\r\n          CTRL_Entity *entity = pending_thread_names.v[idx];\r\n          if(entity->id == event->entity_id)\r\n          {\r\n            ctrl_entity_equip_string(store, thread, entity->string);\r\n            ctrl_entity_release(store, entity);\r\n            break;\r\n          }\r\n        }\r\n        CTRL_EntityArray pending_thread_colors = ctrl_entity_array_from_kind(&store->ctx, CTRL_EntityKind_PendingThreadColor);\r\n        for EachIndex(idx, pending_thread_colors.count)\r\n        {\r\n          CTRL_Entity *entity = pending_thread_colors.v[idx];\r\n          if(entity->id == event->entity_id)\r\n          {\r\n            thread->rgba = entity->rgba;\r\n            ctrl_entity_release(store, entity);\r\n            break;\r\n          }\r\n        }\r\n        thread->stack_base = event->stack_base;\r\n        ctrl_rip_from_thread(&store->ctx, event->entity);\r\n      }break;\r\n      case CTRL_EventKind_EndThread:\r\n      {\r\n        CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        ctrl_entity_release(store, thread);\r\n      }break;\r\n      case CTRL_EventKind_ThreadName:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        CTRL_Entity *thread = &ctrl_entity_nil;\r\n        if(event->entity_id == 0)\r\n        {\r\n          thread = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        }\r\n        else\r\n        {\r\n          thread = ctrl_thread_from_id(&store->ctx, event->entity_id);\r\n        }\r\n        if(thread != &ctrl_entity_nil)\r\n        {\r\n          ctrl_entity_equip_string(store, thread, event->string);\r\n        }\r\n        else\r\n        {\r\n          CTRL_Entity *pending_name = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadName, Arch_Null, ctrl_handle_zero(), event->entity_id);\r\n          ctrl_entity_equip_string(store, pending_name, event->string);\r\n        }\r\n      }break;\r\n      case CTRL_EventKind_ThreadColor:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        CTRL_Entity *thread = &ctrl_entity_nil;\r\n        if(event->entity_id == 0)\r\n        {\r\n          thread = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        }\r\n        else\r\n        {\r\n          thread = ctrl_thread_from_id(&store->ctx, event->entity_id);\r\n        }\r\n        if(thread != &ctrl_entity_nil)\r\n        {\r\n          thread->rgba = event->rgba;\r\n        }\r\n        else\r\n        {\r\n          CTRL_Entity *pending = ctrl_entity_alloc(store, process, CTRL_EntityKind_PendingThreadColor, Arch_Null, ctrl_handle_zero(), event->entity_id);\r\n          pending->rgba = event->rgba;\r\n        }\r\n      }break;\r\n      case CTRL_EventKind_ThreadFrozen:\r\n      {\r\n        CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        thread->is_frozen = 1;\r\n      }break;\r\n      case CTRL_EventKind_ThreadThawed:\r\n      {\r\n        CTRL_Entity *thread = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        thread->is_frozen = 0;\r\n      }break;\r\n      \r\n      //- rjf: modules\r\n      case CTRL_EventKind_NewModule:\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        CTRL_Entity *module = ctrl_entity_alloc(store, process, CTRL_EntityKind_Module, event->arch, event->entity, event->vaddr_rng.min);\r\n        ctrl_entity_equip_string(store, module, event->string);\r\n        module->timestamp = event->timestamp;\r\n        module->vaddr_range = event->vaddr_rng;\r\n        CTRL_Entity *first_module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module);\r\n        if(first_module == module)\r\n        {\r\n          ctrl_entity_equip_string(store, process, str8_skip_last_slash(event->string));\r\n        }\r\n        scratch_end(scratch);\r\n      }break;\r\n      case CTRL_EventKind_EndModule:\r\n      {\r\n        CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        ctrl_entity_release(store, module);\r\n      }break;\r\n      case CTRL_EventKind_ModuleDebugInfoPathChange:\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        CTRL_Entity *module = ctrl_entity_from_handle(&store->ctx, event->entity);\r\n        CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath);\r\n        if(debug_info_path == &ctrl_entity_nil)\r\n        {\r\n          debug_info_path = ctrl_entity_alloc(store, module, CTRL_EntityKind_DebugInfoPath, Arch_Null, ctrl_handle_zero(), 0);\r\n        }\r\n        ctrl_entity_equip_string(store, debug_info_path, path_normalized_from_string(scratch.arena, event->string));\r\n        debug_info_path->timestamp = event->timestamp;\r\n        scratch_end(scratch);\r\n      }break;\r\n      \r\n      //- rjf: dynamic, program-created breakpoints\r\n      case CTRL_EventKind_SetBreakpoint:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        CTRL_Entity *bp = ctrl_entity_alloc(store, process, CTRL_EntityKind_Breakpoint, Arch_Null, ctrl_handle_zero(), 0);\r\n        bp->vaddr_range = event->vaddr_rng;\r\n        bp->bp_flags = event->bp_flags;\r\n      }break;\r\n      case CTRL_EventKind_UnsetBreakpoint:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next)\r\n        {\r\n          if(child->kind == CTRL_EntityKind_Breakpoint &&\r\n             child->vaddr_range.min == event->vaddr_rng.min &&\r\n             child->vaddr_range.max == event->vaddr_rng.max &&\r\n             child->bp_flags == event->bp_flags)\r\n          {\r\n            ctrl_entity_release(store, child);\r\n            break;\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: address range annotations\r\n      case CTRL_EventKind_SetVAddrRangeNote:\r\n      {\r\n        CTRL_Entity *process = ctrl_entity_from_handle(&store->ctx, event->parent);\r\n        CTRL_Entity *annotation = ctrl_entity_alloc(store, process, CTRL_EntityKind_AddressRangeAnnotation, Arch_Null, ctrl_handle_zero(), 0);\r\n        annotation->vaddr_range = event->vaddr_rng;\r\n        ctrl_entity_equip_string(store, annotation, event->string);\r\n      }break;\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void\r\nctrl_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  ctrl_state = push_array(arena, CTRL_State, 1);\r\n  ctrl_state->arena = arena;\r\n  for(Arch arch = (Arch)0; arch < Arch_COUNT; arch = (Arch)(arch+1))\r\n  {\r\n    String8 *reg_names = regs_reg_code_string_table_from_arch(arch);\r\n    U64 reg_count = regs_reg_code_count_from_arch(arch);\r\n    String8 *alias_names = regs_alias_code_string_table_from_arch(arch);\r\n    U64 alias_count = regs_alias_code_count_from_arch(arch);\r\n    ctrl_state->arch_string2reg_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256);\r\n    ctrl_state->arch_string2alias_tables[arch] = e_string2num_map_make(ctrl_state->arena, 256);\r\n    for(U64 idx = 1; idx < reg_count; idx += 1)\r\n    {\r\n      e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2reg_tables[arch], reg_names[idx], idx);\r\n    }\r\n    for(U64 idx = 1; idx < alias_count; idx += 1)\r\n    {\r\n      e_string2num_map_insert(ctrl_state->arena, &ctrl_state->arch_string2alias_tables[arch], alias_names[idx], idx);\r\n    }\r\n  }\r\n  ctrl_state->thread_reg_cache.slots_count = 1024;\r\n  ctrl_state->thread_reg_cache.slots = push_array(arena, CTRL_ThreadRegCacheSlot, ctrl_state->thread_reg_cache.slots_count);\r\n  ctrl_state->thread_reg_cache.stripes_count = os_get_system_info()->logical_processor_count;\r\n  ctrl_state->thread_reg_cache.stripes = push_array(arena, CTRL_ThreadRegCacheStripe, ctrl_state->thread_reg_cache.stripes_count);\r\n  for(U64 idx = 0; idx < ctrl_state->thread_reg_cache.stripes_count; idx += 1)\r\n  {\r\n    ctrl_state->thread_reg_cache.stripes[idx].arena = arena_alloc();\r\n    ctrl_state->thread_reg_cache.stripes[idx].rw_mutex = rw_mutex_alloc();\r\n  }\r\n  ctrl_state->module_image_info_cache.slots_count = 1024;\r\n  ctrl_state->module_image_info_cache.slots = push_array(arena, CTRL_ModuleImageInfoCacheSlot, ctrl_state->module_image_info_cache.slots_count);\r\n  ctrl_state->module_image_info_cache.stripes_count = os_get_system_info()->logical_processor_count;\r\n  ctrl_state->module_image_info_cache.stripes = push_array(arena, CTRL_ModuleImageInfoCacheStripe, ctrl_state->module_image_info_cache.stripes_count);\r\n  for(U64 idx = 0; idx < ctrl_state->module_image_info_cache.stripes_count; idx += 1)\r\n  {\r\n    ctrl_state->module_image_info_cache.stripes[idx].arena = arena_alloc();\r\n    ctrl_state->module_image_info_cache.stripes[idx].rw_mutex = rw_mutex_alloc();\r\n  }\r\n  ctrl_state->u2c_ring_size = KB(64);\r\n  ctrl_state->u2c_ring_base = push_array_no_zero(arena, U8, ctrl_state->u2c_ring_size);\r\n  ctrl_state->u2c_ring_mutex = mutex_alloc();\r\n  ctrl_state->u2c_ring_cv = cond_var_alloc();\r\n  ctrl_state->c2u_ring_size = KB(64);\r\n  ctrl_state->c2u_ring_max_string_size = ctrl_state->c2u_ring_size/2;\r\n  ctrl_state->c2u_ring_base = push_array_no_zero(arena, U8, ctrl_state->c2u_ring_size);\r\n  ctrl_state->c2u_ring_mutex = mutex_alloc();\r\n  ctrl_state->c2u_ring_cv = cond_var_alloc();\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 user_program_data_path = os_get_process_info()->user_program_data_path;\r\n    String8 user_data_folder = push_str8f(scratch.arena, \"%S/raddbg/logs\", user_program_data_path);\r\n    os_make_directory(user_data_folder);\r\n    ctrl_state->ctrl_thread_log_path = push_str8f(ctrl_state->arena, \"%S/ctrl_thread.raddbg_log\", user_data_folder);\r\n    os_write_data_to_file_path(ctrl_state->ctrl_thread_log_path, str8_zero());\r\n    scratch_end(scratch);\r\n  }\r\n  ctrl_state->ctrl_thread_entity_ctx_rw_mutex = rw_mutex_alloc();\r\n  ctrl_state->ctrl_thread_entity_store = ctrl_entity_ctx_rw_store_alloc();\r\n  ctrl_state->ctrl_thread_eval_cache = e_cache_alloc();\r\n  ctrl_state->ctrl_thread_msg_process_arena = arena_alloc();\r\n  ctrl_state->dmn_event_arena = arena_alloc();\r\n  ctrl_state->user_entry_point_arena = arena_alloc();\r\n  ctrl_state->dbg_dir_arena = arena_alloc();\r\n  for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1))\r\n  {\r\n    if(ctrl_exception_code_kind_default_enable_table[k])\r\n    {\r\n      ctrl_state->exception_code_filters[k/64] |= 1ull<<(k%64);\r\n    }\r\n  }\r\n  ctrl_state->ctrl_thread_log = log_alloc();\r\n  ctrl_state->ctrl_thread = thread_launch(ctrl_thread__entry_point, 0);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Wakeup Callback Registration\r\n\r\ninternal void\r\nctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook)\r\n{\r\n  ctrl_state->wakeup_hook = wakeup_hook;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Register Functions\r\n\r\n//- rjf: thread register cache reading\r\n\r\ninternal void *\r\nctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle)\r\n{\r\n  CTRL_ThreadRegCache *cache = &ctrl_state->thread_reg_cache;\r\n  CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle);\r\n  Arch arch = thread_entity->arch;\r\n  U64 reg_block_size = regs_block_size_from_arch(arch);\r\n  U64 hash = ctrl_hash_from_handle(handle);\r\n  U64 slot_idx = hash%cache->slots_count;\r\n  U64 stripe_idx = slot_idx%cache->stripes_count;\r\n  CTRL_ThreadRegCacheSlot *slot = &cache->slots[slot_idx];\r\n  CTRL_ThreadRegCacheStripe *stripe = &cache->stripes[stripe_idx];\r\n  void *result = push_array(arena, U8, reg_block_size);\r\n  MutexScopeW(stripe->rw_mutex)\r\n  {\r\n    // rjf: find existing node\r\n    CTRL_ThreadRegCacheNode *node = 0;\r\n    for(CTRL_ThreadRegCacheNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(ctrl_handle_match(n->handle, handle))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: allocate existing node\r\n    if(!node)\r\n    {\r\n      node = push_array(stripe->arena, CTRL_ThreadRegCacheNode, 1);\r\n      DLLPushBack(slot->first, slot->last, node);\r\n      node->handle     = handle;\r\n      node->block_size = reg_block_size;\r\n      node->block      = push_array(stripe->arena, U8, reg_block_size);\r\n    }\r\n    \r\n    // rjf: copy from node\r\n    if(node)\r\n    {\r\n      U64 current_reg_gen = ctrl_reg_gen();\r\n      B32 need_stale = 1;\r\n      if(node->reg_gen != current_reg_gen && \r\n          dmn_thread_read_reg_block(handle.dmn_handle, result))\r\n      {\r\n        if(node != 0)\r\n        {\r\n          need_stale = 0;\r\n          node->reg_gen = current_reg_gen;\r\n          MemoryCopy(node->block, result, reg_block_size);\r\n        }\r\n      }\r\n      if(need_stale)\r\n      {\r\n        MemoryCopy(result, node->block, reg_block_size);\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle)\r\n{\r\n  U64 result = dmn_tls_root_vaddr_from_thread(handle.dmn_handle);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle);\r\n  Arch arch = thread_entity->arch;\r\n  void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle);\r\n  U64 result = regs_rip_from_arch_block(arch, block);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, handle);\r\n  Arch arch = thread_entity->arch;\r\n  void *block = ctrl_reg_block_from_thread(scratch.arena, ctx, handle);\r\n  U64 result = regs_rsp_from_arch_block(arch, block);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: thread register writing\r\n\r\ninternal B32\r\nctrl_thread_write_reg_block(CTRL_Handle thread, void *block)\r\n{\r\n  // TODO(rjf): @callstacks immediately reflect this in the call stack cache\r\n  B32 good = dmn_thread_write_reg_block(thread.dmn_handle, block);\r\n  if(good)\r\n  {\r\n    ins_atomic_u64_inc_eval(&ctrl_state->reg_gen);\r\n  }\r\n  return good;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Module Image Info Functions\r\n\r\n//- rjf: cache lookups\r\n\r\ninternal PE_IntelPdata *\r\nctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff)\r\n{\r\n  PE_IntelPdata *first_pdata = 0;\r\n  {\r\n    U64 hash = ctrl_hash_from_handle(module_handle);\r\n    U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count;\r\n    U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n    CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n    CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n    MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(ctrl_handle_match(n->module, module_handle))\r\n      {\r\n        PE_IntelPdata *pdatas = n->pdatas;\r\n        U64 pdatas_count = n->pdatas_count;\r\n        if(n->pdatas_count != 0 && voff >= n->pdatas[0].voff_first)\r\n        {\r\n          // NOTE(rjf):\r\n          //\r\n          // binary search:\r\n          //  find max index s.t. pdata_array[index].voff_first <= voff\r\n          //  we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first)\r\n          U64 index = pdatas_count;\r\n          U64 min = 0;\r\n          U64 opl = pdatas_count;\r\n          for(;;)\r\n          {\r\n            U64 mid = (min + opl)/2;\r\n            PE_IntelPdata *pdata = pdatas + mid;\r\n            if(voff < pdata->voff_first)\r\n            {\r\n              opl = mid;\r\n            }\r\n            else if(pdata->voff_first < voff)\r\n            {\r\n              min = mid;\r\n            }\r\n            else\r\n            {\r\n              index = mid;\r\n              break;\r\n            }\r\n            if(min + 1 >= opl)\r\n            {\r\n              index = min;\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: if we are in range fill result\r\n          {\r\n            PE_IntelPdata *pdata = pdatas + index;\r\n            if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last)\r\n            {\r\n              first_pdata = push_array(arena, PE_IntelPdata, 1);\r\n              MemoryCopyStruct(first_pdata, pdata);\r\n            }\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return first_pdata;\r\n}\r\n\r\ninternal U64\r\nctrl_entry_point_voff_from_module(CTRL_Handle module_handle)\r\n{\r\n  U64 result = 0;\r\n  U64 hash = ctrl_hash_from_handle(module_handle);\r\n  U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count;\r\n  U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n  CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n  CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(ctrl_handle_match(n->module, module_handle))\r\n    {\r\n      result = n->entry_point_voff;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Rng1U64\r\nctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle)\r\n{\r\n  Rng1U64 result = {0};\r\n  U64 hash = ctrl_hash_from_handle(module_handle);\r\n  U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count;\r\n  U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n  CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n  CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(ctrl_handle_match(n->module, module_handle))\r\n    {\r\n      result = n->tls_vaddr_range;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle)\r\n{\r\n  String8 result = {0};\r\n  U64 hash = ctrl_hash_from_handle(module_handle);\r\n  U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count;\r\n  U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n  CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n  CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(ctrl_handle_match(n->module, module_handle))\r\n    {\r\n      result = push_str8_copy(arena, n->initial_debug_info_path);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle)\r\n{\r\n  String8 result = {0};\r\n  U64 hash = ctrl_hash_from_handle(module_handle);\r\n  U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count;\r\n  U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n  CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n  CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n  MutexScopeR(stripe->rw_mutex) for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(ctrl_handle_match(n->module, module_handle))\r\n    {\r\n      result = push_str8_copy(arena, n->raddbg_data);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ Process Info Functions\r\n\r\ninternal Arch\r\nctrl_arch_from_process_handle(CTRL_Handle process_handle)\r\n{\r\n  CTRL_EntityCtx *entity_ctx     = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n  CTRL_Entity    *process_entity = ctrl_entity_from_handle(entity_ctx, process_handle);\r\n  return process_entity->arch;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Unwinding Functions\r\n\r\n//- rjf: unwind deep copier\r\n\r\ninternal CTRL_Unwind\r\nctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src)\r\n{\r\n  CTRL_Unwind dst = {0};\r\n  {\r\n    dst.flags = src->flags;\r\n    dst.frames.count = src->frames.count;\r\n    dst.frames.v = push_array(arena, CTRL_UnwindFrame, dst.frames.count);\r\n    MemoryCopy(dst.frames.v, src->frames.v, sizeof(dst.frames.v[0])*dst.frames.count);\r\n    U64 block_size = regs_block_size_from_arch(arch);\r\n    for(U64 idx = 0; idx < dst.frames.count; idx += 1)\r\n    {\r\n      dst.frames.v[idx].regs = push_array_no_zero(arena, U8, block_size);\r\n      MemoryCopy(dst.frames.v[idx].regs, src->frames.v[idx].regs, block_size);\r\n    }\r\n  }\r\n  return dst;\r\n}\r\n\r\n//- DWARF\r\n\r\ntypedef struct\r\n{\r\n  CTRL_Handle process_handle;\r\n  U64         endt_us;\r\n} CTRL_MemoryReadContextDwarfX64;\r\n\r\ninternal\r\nDW_MEM_READ(ctrl_unwind_mem_read_dwarf_x64)\r\n{\r\n  CTRL_MemoryReadContextDwarfX64 *ctx = ud;\r\n\r\n  B32 is_stale = 0;\r\n  B32 is_read  = ctrl_process_memory_read(ctx->process_handle, r1u64(addr, addr + size), &is_stale, buffer, ctx->endt_us);\r\n\r\n  DW_UnwindStatus status = DW_UnwindStatus_Fail;\r\n  if(is_stale && is_read)\r\n  {\r\n    status = DW_UnwindStatus_Maybe;\r\n  }\r\n  else if(is_read)\r\n  {\r\n    status = DW_UnwindStatus_Ok;\r\n  }\r\n\r\n  return status;\r\n}\r\n\r\ninternal\r\nDW_REG_READ(ctrl_unwind_reg_read_dwarf_x64)\r\n{\r\n  // map DWARF register to -> the internal register\r\n  REGS_RegBlockX64 *regs = ud;\r\n  U64 reg_size = 0; void *reg_bytes = 0;\r\n  switch(reg_id)\r\n  {\r\n#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = &regs->_MAP_N; } break;\r\n    DW_Regs_X64_XList(X)\r\n#undef X\r\n  default: { InvalidPath; } break;\r\n  }\r\n\r\n  // copy out register value\r\n  DW_UnwindStatus status = DW_UnwindStatus_Fail;\r\n  if(reg_size > 0)\r\n  {\r\n    AssertAlways(reg_size == buffer_max);\r\n    MemoryCopy(buffer, reg_bytes, reg_size);\r\n    status = DW_UnwindStatus_Ok;\r\n  }\r\n\r\n  return status;\r\n}\r\n\r\ninternal\r\nDW_REG_WRITE(ctrl_unwind_reg_write_dwarf_x64)\r\n{\r\n  // map DWARF register to -> the internal register\r\n  REGS_RegBlockX64 *regs = ud;\r\n  U64 reg_size = 0; void *reg_bytes = 0;\r\n  switch(reg_id)\r\n  {\r\n#define X(_N, _ID, _MAP_N, ...) case _ID: { reg_size = sizeof(regs->_MAP_N); reg_bytes = &regs->_MAP_N; } break;\r\n    DW_Regs_X64_XList(X)\r\n#undef X\r\n  default: { InvalidPath; } break;\r\n  }\r\n\r\n  // write value to the register\r\n  DW_UnwindStatus status = DW_UnwindStatus_Fail;\r\n  if(reg_size > 0)\r\n  {\r\n    AssertAlways(value_size <= reg_size);\r\n    MemoryCopy(reg_bytes, value, value_size);\r\n    status = DW_UnwindStatus_Ok;\r\n  }\r\n\r\n  return status;\r\n}\r\n\r\ninternal CTRL_UnwindStepResult\r\nctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n\r\n  CTRL_UnwindStepResult result = { .flags = CTRL_UnwindFlag_Error };\r\n\r\n  // gather context for virtual stack unwinder\r\n  U64         cfi_rebase   = 0;\r\n  B32         is_unwind_eh = 0;\r\n  String8     unwind_data  = {0};\r\n  EH_FrameHdr eh_frame_hdr = {0};\r\n  EH_PtrCtx   eh_ptr_ctx   = {0};\r\n  {\r\n    U64                              hash       = ctrl_hash_from_handle(module_handle);\r\n    U64                              slot_idx   = hash % ctrl_state->module_image_info_cache.slots_count;\r\n    U64                              stripe_idx = slot_idx % ctrl_state->module_image_info_cache.stripes_count;\r\n    CTRL_ModuleImageInfoCacheSlot   *slot       = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n    CTRL_ModuleImageInfoCacheStripe *stripe     = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n    MutexScopeR(stripe->rw_mutex) for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first)\r\n    {\r\n      if(ctrl_handle_match(n->module, module_handle))\r\n      {\r\n        cfi_rebase   = n->cfi_rebase;\r\n        is_unwind_eh = n->is_unwind_eh;\r\n        unwind_data  = n->dwarf_unwind_data;\r\n        eh_frame_hdr = n->eh_frame_hdr;\r\n        eh_ptr_ctx   = n->eh_ptr_ctx;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n\r\n  // grab IP\r\n  U64 ip = regs_rip_from_arch_block(arch, regs);\r\n\r\n  // use .eh_frame_hdr to quickly locate nearest FDE\r\n  U64 fde_addr = eh_find_nearest_fde(eh_frame_hdr, &eh_ptr_ctx, ip);\r\n\r\n  if(fde_addr != max_U64)\r\n  {\r\n    // parse call frame info\r\n    DW_CIE cie = {0};\r\n    DW_FDE fde = {0};\r\n    B32 is_cfi_parsed = 0;\r\n    if(is_unwind_eh)\r\n    {\r\n      B32 is_stale = 0;\r\n\r\n      // extract FDE info\r\n      Rng1U64   fde_vrange = {0};\r\n      DW_Format fde_format = DW_Format_Null;\r\n      String8   fde_data   = {0};\r\n      U64       cie_addr   = 0;\r\n      {\r\n        // parse FDE length\r\n        U32 first_four_bytes = 0;\r\n        if(!ctrl_process_memory_read_struct(process_handle, fde_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; }\r\n        if(first_four_bytes == max_U32)\r\n        {\r\n          U64 length = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, fde_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; }\r\n          fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + length);\r\n          fde_format = DW_Format_64Bit;\r\n        }\r\n        else\r\n        {\r\n          fde_vrange = r1u64(fde_addr, fde_addr + sizeof(first_four_bytes) + first_four_bytes);\r\n          fde_format = DW_Format_32Bit;\r\n        }\r\n\r\n        // read out whole FDE\r\n        void *fde_raw = push_array(scratch.arena, U8, dim_1u64(fde_vrange));\r\n        if(!ctrl_process_memory_read(process_handle, fde_vrange, &is_stale, fde_raw, endt_us)) { goto eh_parse_exit; }\r\n        fde_data = str8(fde_raw, dim_1u64(fde_vrange));\r\n\r\n        // compute CIE address\r\n        U64 cie_delta_off  = fde_format == DW_Format_32Bit ? 4 : 12;\r\n        U64 cie_delta      = 0;\r\n        U64 cie_delta_size = str8_deserial_read_dwarf_uint(fde_data, cie_delta_off, fde_format, &cie_delta);\r\n        if (cie_delta_size == 0) { goto eh_parse_exit; }\r\n        cie_addr = (fde_addr + cie_delta_off) - cie_delta;\r\n      }\r\n      \r\n      // extract CIE info\r\n      Rng1U64   cie_vrange = {0};\r\n      DW_Format cie_format = DW_Format_Null;\r\n      String8   cie_data   = {0};\r\n      {\r\n        // parse CIE length\r\n        U32 first_four_bytes = 0;\r\n        if(!ctrl_process_memory_read_struct(process_handle, cie_addr, &is_stale, &first_four_bytes, endt_us)) { goto eh_parse_exit; }\r\n        if(first_four_bytes == max_U32)\r\n        {\r\n          U64 length = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, cie_addr + sizeof(first_four_bytes), &is_stale, &length, endt_us)) { goto eh_parse_exit; }\r\n          cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + length);\r\n          cie_format = DW_Format_64Bit;\r\n        }\r\n        else\r\n        {\r\n          cie_vrange = r1u64(cie_addr, cie_addr + sizeof(first_four_bytes) + first_four_bytes);\r\n          cie_format = DW_Format_32Bit;\r\n        }\r\n\r\n        // read out whole CIE\r\n        void *cie_raw = push_array(scratch.arena, U8, dim_1u64(cie_vrange));\r\n        if(!ctrl_process_memory_read(process_handle, cie_vrange, &is_stale, cie_raw, endt_us)) { goto eh_parse_exit; }\r\n        cie_data = str8(cie_raw, dim_1u64(cie_vrange));\r\n      }\r\n\r\n      // parse CIE and FDE\r\n      if(eh_parse_cie(cie_data, cie_format, arch, cie_vrange.min, &eh_ptr_ctx, &cie))\r\n      {\r\n        is_cfi_parsed = eh_parse_fde(fde_data, fde_format, fde_vrange.min, &cie, &eh_ptr_ctx, &fde);\r\n      }\r\n\r\n      eh_parse_exit:;\r\n      if(is_stale)\r\n      {\r\n        result.flags = CTRL_UnwindFlag_Stale;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      is_cfi_parsed = dw_parse_cfi(unwind_data, fde_addr, arch, &cie, &fde);\r\n    }\r\n\r\n    if(is_cfi_parsed && contains_1u64(fde.pc_range, ip))\r\n    {\r\n      // setup pointer decoder ops\r\n      DW_DecodePtr *decode_ptr_func = 0;\r\n      void         *decode_ptr_ctx  = 0;\r\n      if(is_unwind_eh)\r\n      {\r\n        EH_DecodePtrCtx *decode_ptr_ctx_eh = push_array(scratch.arena, EH_DecodePtrCtx, 1);\r\n        decode_ptr_ctx_eh->ptr_ctx  = &eh_ptr_ctx;\r\n        decode_ptr_ctx_eh->addr_enc = cie.ext[EH_CIE_Ext_AddrEnc];\r\n\r\n        decode_ptr_func = eh_decode_ptr;\r\n        decode_ptr_ctx  = decode_ptr_ctx_eh;\r\n      }\r\n      else\r\n      {\r\n        decode_ptr_func = dw_decode_ptr_debug_frame;\r\n        decode_ptr_ctx  = &cie;\r\n      }\r\n\r\n      // find register rules for IP\r\n      DW_CFI_Row *cfi_row = dw_cfi_row_from_pc(scratch.arena, arch, &cie, &fde, decode_ptr_func, decode_ptr_ctx, ip);\r\n      if(cfi_row)\r\n      {\r\n        // setup machine ops\r\n        void *mem_read_ctx  = 0;\r\n        void *reg_read_ctx  = 0;\r\n        void *reg_write_ctx = 0;\r\n        DW_MemRead  *mem_read_func  = 0;\r\n        DW_RegRead  *reg_read_func  = 0;\r\n        DW_RegWrite *reg_write_func = 0;\r\n        switch(arch)\r\n        {\r\n        case Arch_Null: break;\r\n        case Arch_x64:\r\n        {\r\n          CTRL_MemoryReadContextDwarfX64 *mem_read_ctx_x64 = push_array(scratch.arena, CTRL_MemoryReadContextDwarfX64, 1);\r\n          mem_read_ctx_x64->process_handle = process_handle;\r\n          mem_read_ctx_x64->endt_us        = endt_us;\r\n\r\n          mem_read_ctx   = mem_read_ctx_x64;\r\n          reg_read_ctx   = regs;\r\n          reg_write_ctx  = regs;\r\n\r\n          mem_read_func  = ctrl_unwind_mem_read_dwarf_x64;\r\n          reg_read_func  = ctrl_unwind_reg_read_dwarf_x64;\r\n          reg_write_func = ctrl_unwind_reg_write_dwarf_x64;\r\n        }break;\r\n        case Arch_x86:\r\n        case Arch_arm64:\r\n        case Arch_arm32:\r\n        {\r\n          NotImplemented;\r\n        }break;\r\n        default: { InvalidPath; } break;\r\n        }\r\n        \r\n        // apply register rules to the context\r\n        DW_UnwindStatus cfi_uw_status = dw_cfi_apply_register_rules(arch,\r\n                                                                    &cie,\r\n                                                                    cfi_row,\r\n                                                                    mem_read_func,\r\n                                                                    mem_read_ctx,\r\n                                                                    reg_read_func,\r\n                                                                    reg_read_ctx,\r\n                                                                    reg_write_func,\r\n                                                                    reg_write_ctx);\r\n\r\n        // last frame typically has undefined rule for IP\r\n        if(cfi_row->regs[cie.ret_addr_reg].rule == DW_CFI_RegisterRule_Undefined)\r\n        {\r\n          regs_arch_block_write_rip(arch, regs, 0);\r\n        }\r\n\r\n        // translate unwind status code to control layer's result flags\r\n        switch(cfi_uw_status)\r\n        {\r\n        case DW_UnwindStatus_Ok:\r\n        {\r\n          result.flags &= ~(CTRL_UnwindFlag_Error|CTRL_UnwindFlag_Stale);\r\n        }break;\r\n        case DW_UnwindStatus_Fail:\r\n        {\r\n          result.flags |= CTRL_UnwindFlag_Error;\r\n        }break;\r\n        case DW_UnwindStatus_Maybe:\r\n        {\r\n          result.flags &= ~CTRL_UnwindFlag_Error;\r\n          result.flags |= CTRL_UnwindFlag_Stale;\r\n        }break;\r\n        default: { InvalidPath; } break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  else\r\n  {\r\n    // TODO: if IP does not have FDE, does this mean function is a leaf?\r\n  }\r\n\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: [x64]\r\n\r\ninternal REGS_Reg64 *\r\nctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg)\r\n{\r\n  local_persist REGS_Reg64 dummy = {0};\r\n  REGS_Reg64 *result = &dummy;\r\n  switch(gpr_reg)\r\n  {\r\n    case PE_UnwindGprRegX64_RAX:{result = &regs->rax;}break;\r\n    case PE_UnwindGprRegX64_RCX:{result = &regs->rcx;}break;\r\n    case PE_UnwindGprRegX64_RDX:{result = &regs->rdx;}break;\r\n    case PE_UnwindGprRegX64_RBX:{result = &regs->rbx;}break;\r\n    case PE_UnwindGprRegX64_RSP:{result = &regs->rsp;}break;\r\n    case PE_UnwindGprRegX64_RBP:{result = &regs->rbp;}break;\r\n    case PE_UnwindGprRegX64_RSI:{result = &regs->rsi;}break;\r\n    case PE_UnwindGprRegX64_RDI:{result = &regs->rdi;}break;\r\n    case PE_UnwindGprRegX64_R8 :{result = &regs->r8 ;}break;\r\n    case PE_UnwindGprRegX64_R9 :{result = &regs->r9 ;}break;\r\n    case PE_UnwindGprRegX64_R10:{result = &regs->r10;}break;\r\n    case PE_UnwindGprRegX64_R11:{result = &regs->r11;}break;\r\n    case PE_UnwindGprRegX64_R12:{result = &regs->r12;}break;\r\n    case PE_UnwindGprRegX64_R13:{result = &regs->r13;}break;\r\n    case PE_UnwindGprRegX64_R14:{result = &regs->r14;}break;\r\n    case PE_UnwindGprRegX64_R15:{result = &regs->r15;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CTRL_UnwindStepResult\r\nctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us)\r\n{\r\n  B32 is_stale = 0;\r\n  B32 is_good = 1;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack parameters\r\n  //\r\n  U64 rip_voff = regs->rip.u64 - module_base_vaddr;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: rip_voff -> first pdata\r\n  //\r\n  PE_IntelPdata *first_pdata = ctrl_intel_pdata_from_module_voff(scratch.arena, module_handle, rip_voff);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: pdata -> detect if in epilog\r\n  //\r\n  B32 has_pdata_and_in_epilog = 0;\r\n  if(first_pdata) ProfScope(\"pdata -> detect if in epilog\")\r\n  {\r\n    // NOTE(allen): There are restrictions placed on how an epilog is allowed\r\n    // to be formed (https://docs.microsoft.com/en-us/cpp/build/prolog-and-epilog?view=msvc-160)\r\n    // Here we interpret machine code directly according to the rules\r\n    // given there to determine if the code we're looking at looks like an epilog.\r\n    \r\n    //- rjf: set up parsing state\r\n    B32 is_epilog = 0;\r\n    B32 keep_parsing = 1;\r\n    U64 read_vaddr = regs->rip.u64;\r\n    U64 read_vaddr_opl = read_vaddr + 256;\r\n    \r\n    //- rjf: check first instruction\r\n    {\r\n      B32 inst_good = 0;\r\n      U8 inst[4] = {0};\r\n      if(read_vaddr + sizeof(inst) <= read_vaddr_opl)\r\n      {\r\n        inst_good = ctrl_process_memory_read(process_handle, r1u64(read_vaddr, read_vaddr+sizeof(inst)), &is_stale, inst, endt_us);\r\n        inst_good = inst_good && !is_stale;\r\n      }\r\n      if(!inst_good)\r\n      {\r\n        keep_parsing = 0;\r\n      }\r\n      else if((inst[0] & 0xF8) == 0x48)\r\n      {\r\n        switch(inst[1])\r\n        {\r\n          // rjf: add $nnnn,%rsp\r\n          case 0x81:\r\n          {\r\n            if(inst[0] == 0x48 && inst[2] == 0xC4)\r\n            {\r\n              read_vaddr += 7;\r\n            }\r\n            else\r\n            {\r\n              keep_parsing = 0;\r\n            }\r\n          }break;\r\n          \r\n          // rjf: add $n,%rsp\r\n          case 0x83:\r\n          {\r\n            if(inst[0] == 0x48 && inst[2] == 0xC4)\r\n            {\r\n              read_vaddr += 4;\r\n            }\r\n            else\r\n            {\r\n              keep_parsing = 0;\r\n            }\r\n          }break;\r\n          \r\n          // rjf: lea n(reg),%rsp\r\n          case 0x8D:\r\n          {\r\n            if((inst[0] & 0x06) == 0 &&\r\n               ((inst[2] >> 3) & 0x07) == 0x04 &&\r\n               (inst[2] & 0x07) != 0x04)\r\n            {\r\n              U8 imm_size = (inst[2] >> 6);\r\n              \r\n              // rjf: 1-byte immediate\r\n              if(imm_size == 1)\r\n              {\r\n                read_vaddr += 4;\r\n              }\r\n              \r\n              // rjf: 4-byte immediate\r\n              else if(imm_size == 2)\r\n              {\r\n                read_vaddr += 7;\r\n              }\r\n              \r\n              // rjf: other case\r\n              else\r\n              {\r\n                keep_parsing = 0;\r\n              }\r\n            }\r\n            else\r\n            {\r\n              keep_parsing = 0;\r\n            }\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: continue parsing instructions\r\n    for(;keep_parsing;)\r\n    {\r\n      // rjf: read next instruction byte\r\n      B32 inst_byte_good = 0;\r\n      U8 inst_byte = 0;\r\n      if(read_vaddr + sizeof(inst_byte) <= read_vaddr_opl)\r\n      {\r\n        inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us);\r\n      }\r\n      if(!inst_byte_good || is_stale)\r\n      {\r\n        keep_parsing = 0;\r\n      }\r\n      \r\n      // rjf: when (... I don't know ...) rely on the next byte\r\n      B32 check_inst_byte_good = inst_byte_good;\r\n      U64 check_vaddr = read_vaddr;\r\n      U8 check_inst_byte = inst_byte;\r\n      if(inst_byte_good && (inst_byte & 0xF0) == 0x40)\r\n      {\r\n        check_vaddr = read_vaddr + 1;\r\n        if(read_vaddr + sizeof(check_inst_byte) <= read_vaddr_opl)\r\n        {\r\n          check_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &check_inst_byte, endt_us);\r\n        }\r\n        if(!check_inst_byte_good || is_stale)\r\n        {\r\n          keep_parsing = 0;\r\n        }\r\n      }\r\n      \r\n      // rjf: check instruction byte\r\n      if(check_inst_byte_good)\r\n      {\r\n        switch(check_inst_byte)\r\n        {\r\n          // rjf: pop\r\n          case 0x58:case 0x59:case 0x5A:case 0x5B:\r\n          case 0x5C:case 0x5D:case 0x5E:case 0x5F:\r\n          {\r\n            read_vaddr = check_vaddr + 1;\r\n          }break;\r\n          \r\n          // rjf: ret\r\n          case 0xC2:\r\n          case 0xC3:\r\n          { \r\n            is_epilog = 1;\r\n            keep_parsing = 0;\r\n          }break;\r\n          \r\n          // rjf: jmp nnnn\r\n          case 0xE9:\r\n          {\r\n            U64 imm_vaddr = check_vaddr + 1;\r\n            S32 imm = 0;\r\n            B32 imm_good = 0;\r\n            if(read_vaddr + sizeof(imm) <= read_vaddr_opl)\r\n            {\r\n              imm_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us);\r\n            }\r\n            if(!imm_good || is_stale)\r\n            {\r\n              keep_parsing = 0;\r\n            }\r\n            if(imm_good)\r\n            {\r\n              U64 next_vaddr = (U64)(imm_vaddr + sizeof(imm) + imm);\r\n              U64 next_voff = next_vaddr - module_base_vaddr; // TODO(rjf): verify that this offset is from module base vaddr, not section\r\n              if(!(first_pdata->voff_first <= next_voff && next_voff < first_pdata->voff_one_past_last))\r\n              {\r\n                keep_parsing = 0;\r\n              }\r\n              else\r\n              {\r\n                read_vaddr = next_vaddr;\r\n              }\r\n            }\r\n            // TODO(allen): why isn't this just the end of the epilog?\r\n          }break;\r\n          \r\n          // rjf: rep; ret (for amd64 prediction bug)\r\n          case 0xF3:\r\n          {\r\n            U8 next_inst_byte = 0;\r\n            B32 next_inst_byte_good = 0;\r\n            if(read_vaddr + sizeof(next_inst_byte) <= read_vaddr_opl)\r\n            {\r\n              next_inst_byte_good = ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &next_inst_byte, endt_us);\r\n            }\r\n            if(next_inst_byte_good)\r\n            {\r\n              is_epilog = (next_inst_byte == 0xC3);\r\n            }\r\n            keep_parsing = 0;\r\n          }break;\r\n          \r\n          default:{keep_parsing = 0;}break;\r\n        }\r\n      }\r\n    }\r\n    has_pdata_and_in_epilog = is_epilog;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: pdata & in epilog -> epilog unwind\r\n  //\r\n  if(first_pdata && has_pdata_and_in_epilog) ProfScope(\"pdata & in epilog -> epilog unwind\")\r\n  {\r\n    U64 read_vaddr = regs->rip.u64;\r\n    for(B32 keep_parsing = 1;keep_parsing != 0;)\r\n    {\r\n      //- rjf: assume no more parsing after this instruction\r\n      keep_parsing = 0;\r\n      \r\n      //- rjf: read next instruction byte\r\n      U8 inst_byte = 0;\r\n      is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us);\r\n      is_good = is_good && !is_stale;\r\n      read_vaddr += 1;\r\n      \r\n      //- rjf: extract rex from instruction byte\r\n      U8 rex = 0;\r\n      if((inst_byte & 0xF0) == 0x40)\r\n      {\r\n        rex = inst_byte & 0xF; // rex prefix\r\n        is_good = is_good && ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &inst_byte, endt_us);\r\n        is_good = is_good && !is_stale;\r\n        read_vaddr += 1;\r\n      }\r\n      \r\n      //- rjf: parse remainder of instruction\r\n      switch(inst_byte)\r\n      {\r\n        // rjf: pop\r\n        case 0x58:\r\n        case 0x59:\r\n        case 0x5A:\r\n        case 0x5B:\r\n        case 0x5C:\r\n        case 0x5D:\r\n        case 0x5E:\r\n        case 0x5F:\r\n        {\r\n          // rjf: read value at rsp\r\n          U64 sp = regs->rsp.u64;\r\n          U64 value = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &value, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          \r\n          // rjf: modify registers\r\n          PE_UnwindGprRegX64 gpr_reg = (inst_byte - 0x58) + (rex & 1)*8;\r\n          REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg);\r\n          reg->u64 = value;\r\n          regs->rsp.u64 = sp + 8;\r\n          \r\n          // rjf: not a final instruction, so keep mparsing\r\n          keep_parsing = 1;\r\n        }break;\r\n        \r\n        // rjf: add $nnnn,%rsp \r\n        case 0x81:\r\n        {\r\n          // rjf: skip one byte (we already know what it is in this scenario)\r\n          read_vaddr += 1;\r\n          \r\n          // rjf: read the 4-byte immediate\r\n          S32 imm = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          read_vaddr += 4;\r\n          \r\n          // rjf: update stack pointer\r\n          regs->rsp.u64 = (U64)(regs->rsp.u64 + imm);\r\n          \r\n          // rjf: not a final instruction; keep parsing\r\n          keep_parsing = 1;\r\n        }break;\r\n        \r\n        // rjf: add $n,%rsp\r\n        case 0x83:\r\n        {\r\n          // rjf: skip one byte (we already know what it is in this scenario)\r\n          read_vaddr += 1;\r\n          \r\n          // rjf: read the 4-byte immediate\r\n          S8 imm = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          read_vaddr += 1;\r\n          \r\n          // rjf: update stack pointer\r\n          regs->rsp.u64 = (U64)(regs->rsp.u64 + imm);\r\n          \r\n          // rjf: not a final instruction; keep parsing\r\n          keep_parsing = 1;\r\n        }break;\r\n        \r\n        // rjf: lea imm8/imm32,$rsp\r\n        case 0x8D:\r\n        {\r\n          // rjf: read source register\r\n          U8 modrm = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &modrm, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          read_vaddr += 1;\r\n          PE_UnwindGprRegX64 gpr_reg = (modrm & 7) + (rex & 1)*8;\r\n          REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, gpr_reg);\r\n          U64 reg_value = reg->u64;\r\n          \r\n          // rjf: read immediate\r\n          S32 imm = 0;\r\n          {\r\n            // rjf: read 1-byte immediate\r\n            if((modrm >> 6) == 1)\r\n            {\r\n              S8 imm8 = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm8, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              read_vaddr += 1;\r\n              imm = (S32)imm8;\r\n            }\r\n            \r\n            // rjf: read 4-byte immediate\r\n            else\r\n            {\r\n              if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              read_vaddr += 4;\r\n            }\r\n          }\r\n          \r\n          // rjf: update stack pointer\r\n          regs->rsp.u64 = (U64)(reg_value + imm);\r\n          \r\n          // rjf: not a final instruction; keep parsing\r\n          keep_parsing = 1;\r\n        }break;\r\n        \r\n        // rjf: ret $nn\r\n        case 0xC2:\r\n        {\r\n          // rjf: read new ip\r\n          U64 sp = regs->rsp.u64;\r\n          U64 new_ip = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          \r\n          // rjf: read 2-byte immediate & advance stack pointer\r\n          U16 imm = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, read_vaddr, &is_stale, &imm, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          U64 new_sp = sp + 8 + imm;\r\n          \r\n          // rjf: commit registers\r\n          regs->rip.u64 = new_ip;\r\n          regs->rsp.u64 = new_sp;\r\n        }break;\r\n        \r\n        // rjf: ret / rep; ret\r\n        case 0xF3:\r\n        {\r\n          // Assert(!\"Hit me!\");\r\n        }break;\r\n        case 0xC3:\r\n        {\r\n          // rjf: read new ip\r\n          U64 sp = regs->rsp.u64;\r\n          U64 new_ip = 0;\r\n          if(!ctrl_process_memory_read_struct(process_handle, sp, &is_stale, &new_ip, endt_us) ||\r\n             is_stale)\r\n          {\r\n            is_good = 0;\r\n            break;\r\n          }\r\n          \r\n          // rjf: advance stack pointer\r\n          U64 new_sp = sp + 8;\r\n          \r\n          // rjf: commit registers\r\n          regs->rip.u64 = new_ip;\r\n          regs->rsp.u64 = new_sp;\r\n        }break;\r\n        \r\n        // rjf: jmp nnnn\r\n        case 0xE9:\r\n        {\r\n          // Assert(!\"Hit Me\");\r\n          // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done\r\n          // we don't have any cases to exercise this right now. no guess implementation!\r\n        }break;\r\n        \r\n        // rjf: Sjmp n\r\n        case 0xEB:\r\n        {\r\n          // Assert(!\"Hit Me\");\r\n          // TODO(allen): general idea: read the immediate, move the ip, leave the sp, done\r\n          // we don't have any cases to exercise this right now. no guess implementation!\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: pdata & not in epilog -> xdata unwind\r\n  //\r\n  B32 xdata_unwind_did_machframe = 0;\r\n  if(first_pdata && !has_pdata_and_in_epilog) ProfScope(\"pdata & not in epilog -> xdata unwind\")\r\n  {\r\n    //- rjf: get frame reg\r\n    B32 bad_frame_reg_info = 0;\r\n    REGS_Reg64 *frame_reg = 0;\r\n    U64 frame_off = 0;\r\n    {\r\n      U64 unwind_info_off = first_pdata->voff_unwind_info;\r\n      PE_UnwindInfo unwind_info = {0};\r\n      if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us) ||\r\n         is_stale)\r\n      {\r\n        is_good = 0;\r\n      }\r\n      U32 frame_reg_id = PE_UNWIND_INFO_REG_FROM_FRAME(unwind_info.frame);\r\n      U64 frame_off_val = PE_UNWIND_INFO_OFF_FROM_FRAME(unwind_info.frame);\r\n      if(frame_reg_id != 0)\r\n      {\r\n        frame_reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, frame_reg_id);\r\n        bad_frame_reg_info = (frame_reg == 0); // NOTE(rjf): frame_reg should never be 0 at this point, in valid exe\r\n      }\r\n      frame_off = frame_off_val;\r\n    }\r\n    \r\n    //- rjf: iterate pdatas, apply opcodes\r\n    PE_IntelPdata *last_pdata = 0;\r\n    PE_IntelPdata *pdata = first_pdata;\r\n    if(!bad_frame_reg_info) for(B32 keep_parsing = 1; keep_parsing && pdata != last_pdata;)\r\n    {\r\n      //- rjf: unpack unwind info & codes\r\n      B32 good_unwind_info = 1;\r\n      U64 unwind_info_off = pdata->voff_unwind_info;\r\n      PE_UnwindInfo unwind_info = {0};\r\n      good_unwind_info = good_unwind_info && ctrl_process_memory_read_struct(process_handle, module_base_vaddr+unwind_info_off, &is_stale, &unwind_info, endt_us);\r\n      PE_UnwindCode *unwind_codes = push_array(scratch.arena, PE_UnwindCode, unwind_info.codes_num);\r\n      good_unwind_info = good_unwind_info && ctrl_process_memory_read(process_handle, r1u64(module_base_vaddr+unwind_info_off+sizeof(unwind_info),\r\n                                                                                            module_base_vaddr+unwind_info_off+sizeof(unwind_info)+sizeof(PE_UnwindCode)*unwind_info.codes_num),\r\n                                                                      &is_stale, unwind_codes, endt_us);\r\n      good_unwind_info = good_unwind_info && !is_stale;\r\n      \r\n      //- rjf: bad unwind info -> abort\r\n      if(!good_unwind_info)\r\n      {\r\n        is_good = 0;\r\n        break;\r\n      }\r\n      \r\n      //- rjf: unpack frame base\r\n      U64 frame_base = regs->rsp.u64;\r\n      if(frame_reg != 0)\r\n      {\r\n        U64 raw_frame_base = frame_reg->u64;\r\n        U64 adjusted_frame_base = raw_frame_base - frame_off*16;\r\n        frame_base = adjusted_frame_base;\r\n      }\r\n      \r\n      //- rjf: apply opcodes\r\n      PE_UnwindCode *code_ptr = unwind_codes;\r\n      PE_UnwindCode *code_opl = unwind_codes + unwind_info.codes_num;\r\n      for(PE_UnwindCode *next_code_ptr = 0; code_ptr < code_opl; code_ptr = next_code_ptr)\r\n      {\r\n        // rjf: unpack opcode info\r\n        U32 op_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr->flags);\r\n        U32 op_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr->flags);\r\n        U32 slot_count = pe_slot_count_from_unwind_op_code(op_code);\r\n        if(op_code == PE_UnwindOpCode_ALLOC_LARGE && op_info == 1)\r\n        {\r\n          slot_count += 1;\r\n        }\r\n        \r\n        // rjf: detect bad slot counts\r\n        if(slot_count == 0 || code_ptr+slot_count > code_opl)\r\n        {\r\n          keep_parsing = 0;\r\n          is_good = 0;\r\n          break;\r\n        }\r\n        \r\n        // rjf: set next op code pointer\r\n        next_code_ptr = code_ptr + slot_count;\r\n        \r\n        // rjf: interpret this op code\r\n        U64 code_voff = pdata->voff_first + code_ptr->off_in_prolog;\r\n        if(code_voff <= rip_voff)\r\n        {\r\n          switch(op_code)\r\n          {\r\n            case PE_UnwindOpCode_PUSH_NONVOL:\r\n            {\r\n              // rjf: read value from stack pointer\r\n              U64 rsp = regs->rsp.u64;\r\n              U64 value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: advance stack ptr\r\n              U64 new_rsp = rsp + 8;\r\n              \r\n              // rjf: commit registers\r\n              REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info);\r\n              reg->u64 = value;\r\n              regs->rsp.u64 = new_rsp;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_ALLOC_LARGE:\r\n            {\r\n              // rjf: read alloc size\r\n              U64 size = 0;\r\n              if(op_info == 0)\r\n              {\r\n                size = code_ptr[1].u16*8;\r\n              }\r\n              else if(op_info == 1)\r\n              {\r\n                size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16);\r\n              }\r\n              else\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: advance stack pointer\r\n              U64 rsp = regs->rsp.u64;\r\n              U64 new_rsp = rsp + size;\r\n              \r\n              // rjf: advance stack pointer\r\n              regs->rsp.u64 = new_rsp;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_ALLOC_SMALL:\r\n            {\r\n              // rjf: advance stack pointer\r\n              regs->rsp.u64 += op_info*8 + 8;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_SET_FPREG:\r\n            {\r\n              // rjf: put stack pointer back to the frame base\r\n              regs->rsp.u64 = frame_base;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_SAVE_NONVOL:\r\n            {\r\n              // rjf: read value from frame base\r\n              U64 off = code_ptr[1].u16*8;\r\n              U64 addr = frame_base + off;\r\n              U64 value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: commit to register\r\n              REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info);\r\n              reg->u64 = value;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_SAVE_NONVOL_FAR:\r\n            {\r\n              // rjf: read value from frame base\r\n              U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16);\r\n              U64 addr = frame_base + off;\r\n              U64 value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, addr, &is_stale, &value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: commit to register\r\n              REGS_Reg64 *reg = ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(regs, op_info);\r\n              reg->u64 = value;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_EPILOG:\r\n            {\r\n              keep_parsing = 1;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_SPARE_CODE:\r\n            {\r\n              // TODO(rjf): ???\r\n              keep_parsing = 0;\r\n              is_good = 0;\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_SAVE_XMM128:\r\n            {\r\n              // rjf: read new register values\r\n              U8 buf[16];\r\n              U64 off = code_ptr[1].u16*16;\r\n              U64 addr = frame_base + off;\r\n              if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+sizeof(buf)), &is_stale, buf, endt_us))\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: commit to register\r\n              void *xmm_reg = (&regs->zmm0) + op_info;\r\n              MemoryCopy(xmm_reg, buf, sizeof(buf));\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_SAVE_XMM128_FAR:\r\n            {\r\n              // rjf: read new register values\r\n              U8 buf[16];\r\n              U64 off = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16);\r\n              U64 addr = frame_base + off;\r\n              if(!ctrl_process_memory_read(process_handle, r1u64(addr, addr+16), &is_stale, buf, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: commit to register\r\n              void *xmm_reg = (&regs->zmm0) + op_info;\r\n              MemoryCopy(xmm_reg, buf, sizeof(buf));\r\n            }break;\r\n            \r\n            case PE_UnwindOpCode_PUSH_MACHFRAME:\r\n            {\r\n              // NOTE(rjf): this was found by stepping through kernel code after an exception was\r\n              // thrown, encountered in the exception_stepping_tests (after the throw) in mule_main\r\n              if(op_info > 1)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: read values\r\n              U64 sp_og = regs->rsp.u64;\r\n              U64 sp_adj = sp_og;\r\n              if(op_info == 1)\r\n              {\r\n                sp_adj += 8;\r\n              }\r\n              U64 ip_value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, sp_adj, &is_stale, &ip_value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              U64 sp_after_ip = sp_adj + 8;\r\n              U16 ss_value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, sp_after_ip, &is_stale, &ss_value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              U64 sp_after_ss = sp_after_ip + 8;\r\n              U64 rflags_value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, sp_after_ss, &is_stale, &rflags_value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              U64 sp_after_rflags = sp_after_ss + 8;\r\n              U64 sp_value = 0;\r\n              if(!ctrl_process_memory_read_struct(process_handle, sp_after_rflags, &is_stale, &sp_value, endt_us) ||\r\n                 is_stale)\r\n              {\r\n                keep_parsing = 0;\r\n                is_good = 0;\r\n                break;\r\n              }\r\n              \r\n              // rjf: commit registers\r\n              regs->rip.u64 = ip_value;\r\n              regs->ss.u16 = ss_value;\r\n              regs->rflags.u64 = rflags_value;\r\n              regs->rsp.u64 = sp_value;\r\n              \r\n              // rjf: mark machine frame\r\n              xdata_unwind_did_machframe = 1;\r\n            }break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: iterate to next pdata\r\n      if(keep_parsing)\r\n      {\r\n        U32 flags = PE_UNWIND_INFO_FLAGS_FROM_HDR(unwind_info.header);\r\n        if(!(flags & PE_UnwindInfoFlag_CHAINED))\r\n        {\r\n          break;\r\n        }\r\n        U64 code_count_rounded = AlignPow2(unwind_info.codes_num, sizeof(PE_UnwindCode));\r\n        U64 code_size = code_count_rounded*sizeof(PE_UnwindCode);\r\n        U64 chained_pdata_off = unwind_info_off + sizeof(PE_UnwindInfo) + code_size;\r\n        last_pdata = pdata;\r\n        pdata = push_array(scratch.arena, PE_IntelPdata, 1);\r\n        if(!ctrl_process_memory_read_struct(process_handle, module_base_vaddr+chained_pdata_off, &is_stale, pdata, endt_us) ||\r\n           is_stale)\r\n        {\r\n          is_good = 0;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer\r\n  //\r\n  if(!first_pdata || (!has_pdata_and_in_epilog && !xdata_unwind_did_machframe)) ProfScope(\"no pdata, or didn't do machframe in xdata unwind -> unwind by reading stack pointer\")\r\n  {\r\n    // rjf: read rip from stack pointer\r\n    U64 rsp = regs->rsp.u64;\r\n    U64 new_rip = 0;\r\n    if(!ctrl_process_memory_read_struct(process_handle, rsp, &is_stale, &new_rip, endt_us) ||\r\n       is_stale)\r\n    {\r\n      is_good = 0;\r\n    }\r\n    \r\n    // rjf: commit registers\r\n    if(is_good)\r\n    {\r\n      U64 new_rsp = rsp + 8;\r\n      regs->rip.u64 = new_rip;\r\n      regs->rsp.u64 = new_rsp;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: fill & return\r\n  //\r\n  scratch_end(scratch);\r\n  CTRL_UnwindStepResult result = {0};\r\n  if(!is_good) {result.flags |= CTRL_UnwindFlag_Error;}\r\n  if(is_stale) {result.flags |= CTRL_UnwindFlag_Stale;}\r\n  return result;\r\n}\r\n\r\n//- rjf: abstracted unwind step\r\n\r\ninternal CTRL_UnwindStepResult\r\nctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, U64 endt_us)\r\n{\r\n  CTRL_UnwindStepResult result = {0};\r\n\r\n  result = ctrl_unwind_step__dwarf(process, module, arch, reg_block, endt_us);\r\n\r\n  if(result.flags == CTRL_UnwindFlag_Error && ~result.flags & CTRL_UnwindFlag_Stale)\r\n  {\r\n    switch(arch)\r\n    {\r\n      default:{}break;\r\n      case Arch_x64:\r\n      {\r\n          result = ctrl_unwind_step__pe_x64(process, module, module_base_vaddr, (REGS_RegBlockX64 *)reg_block, endt_us);\r\n      }break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: abstracted full unwind\r\n\r\ninternal CTRL_Unwind\r\nctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  CTRL_Unwind unwind = {0};\r\n  unwind.flags |= CTRL_UnwindFlag_Error;\r\n  \r\n  //- rjf: unpack args\r\n  CTRL_Entity *thread_entity = ctrl_entity_from_handle(ctx, thread);\r\n  CTRL_Entity *process_entity = thread_entity->parent;\r\n  Arch arch = thread_entity->arch;\r\n  U64 arch_reg_block_size = regs_block_size_from_arch(arch);\r\n  \r\n  //- rjf: grab initial register block\r\n  void *regs_block = ctrl_reg_block_from_thread(scratch.arena, ctx, thread);\r\n  B32 regs_block_good = (arch != Arch_Null && regs_block != 0);\r\n  \r\n  //- rjf: loop & unwind\r\n  CTRL_UnwindFrameNode *first_frame_node = 0;\r\n  CTRL_UnwindFrameNode *last_frame_node = 0;\r\n  U64 frame_node_count = 0;\r\n  if(regs_block_good)\r\n  {\r\n    unwind.flags = 0;\r\n    for(;;)\r\n    {\r\n      // rjf: regs -> rip*module\r\n      U64 rip = regs_rip_from_arch_block(arch, regs_block);\r\n      U64 rsp = regs_rsp_from_arch_block(arch, regs_block);\r\n      CTRL_Entity *module = &ctrl_entity_nil;\r\n      for(CTRL_Entity *m = process_entity->first; m != &ctrl_entity_nil; m = m->next)\r\n      {\r\n        if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, rip))\r\n        {\r\n          module = m;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: cancel on 0 rip/rsp\r\n      if(rsp == 0 && rip == 0)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      // rjf: valid step -> push frame\r\n      CTRL_UnwindFrameNode *frame_node = push_array(scratch.arena, CTRL_UnwindFrameNode, 1);\r\n      CTRL_UnwindFrame *frame = &frame_node->v;\r\n      frame->regs = push_array_no_zero(arena, U8, arch_reg_block_size);\r\n      MemoryCopy(frame->regs, regs_block, arch_reg_block_size);\r\n      DLLPushBack(first_frame_node, last_frame_node, frame_node);\r\n      frame_node_count += 1;\r\n      \r\n      // rjf: unwind one step\r\n      CTRL_UnwindStepResult step = ctrl_unwind_step(process_entity->handle, module->handle, module->vaddr_range.min, arch, regs_block, endt_us);\r\n      unwind.flags |= step.flags;\r\n      if(step.flags & CTRL_UnwindFlag_Error ||\r\n         regs_rsp_from_arch_block(arch, regs_block) == 0 ||\r\n         regs_rip_from_arch_block(arch, regs_block) == 0 ||\r\n         (regs_rsp_from_arch_block(arch, regs_block) == rsp &&\r\n          regs_rip_from_arch_block(arch, regs_block) == rip))\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: bake frames list into result array\r\n  {\r\n    unwind.frames.count = frame_node_count;\r\n    unwind.frames.v = push_array(arena, CTRL_UnwindFrame, unwind.frames.count);\r\n    U64 idx = 0;\r\n    for(CTRL_UnwindFrameNode *n = first_frame_node; n != 0; n = n->next, idx += 1)\r\n    {\r\n      unwind.frames.v[idx] = n->v;\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return unwind;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Building Functions\r\n\r\ninternal CTRL_CallStack\r\nctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  Access *access = access_open();\r\n  Arch arch = process->arch;\r\n  CTRL_CallStack result = {0};\r\n  {\r\n    typedef struct FrameNode FrameNode;\r\n    struct FrameNode\r\n    {\r\n      FrameNode *next;\r\n      CTRL_CallStackFrame v;\r\n    };\r\n    \r\n    //- rjf: gather all frames\r\n    FrameNode *first_frame = 0;\r\n    FrameNode *last_frame = 0;\r\n    U64 frame_count = 0;\r\n    for(U64 base_frame_idx = 0; base_frame_idx < base_unwind->frames.count; base_frame_idx += 1)\r\n    {\r\n      // rjf: unpack\r\n      CTRL_UnwindFrame *src = &base_unwind->frames.v[base_frame_idx];\r\n      U64 rip_vaddr = regs_rip_from_arch_block(arch, src->regs);\r\n      CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);\r\n      U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr);\r\n      DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n      RDI_Scope *scope = rdi_scope_from_voff(rdi, rip_voff);\r\n      \r\n      // rjf: build inline frames (minus parent & inline depth)\r\n      FrameNode *first_inline_frame = 0;\r\n      FrameNode *last_inline_frame = 0;\r\n      U64 inline_frame_count = 0;\r\n      for(RDI_Scope *s = scope;\r\n          s->inline_site_idx != 0;\r\n          s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx))\r\n      {\r\n        FrameNode *dst_inline = push_array(scratch.arena, FrameNode, 1);\r\n        if(first_inline_frame == 0)\r\n        {\r\n          first_inline_frame = dst_inline;\r\n        }\r\n        last_inline_frame = dst_inline;\r\n        SLLQueuePush(first_frame, last_frame, dst_inline);\r\n        dst_inline->v.unwind_count = base_frame_idx;\r\n        dst_inline->v.regs         = src->regs;\r\n        frame_count += 1;\r\n        inline_frame_count += 1;\r\n      }\r\n      \r\n      // rjf: build concrete frame\r\n      FrameNode *dst_base = push_array(scratch.arena, FrameNode, 1);\r\n      SLLQueuePush(first_frame, last_frame, dst_base);\r\n      dst_base->v.unwind_count = base_frame_idx;\r\n      dst_base->v.regs         = src->regs;\r\n      frame_count += 1;\r\n      \r\n      // rjf: hook up inline frames to point to concrete frame, and to account for inline depth\r\n      U64 inline_frame_idx = 0;\r\n      for(FrameNode *inline_frame = first_inline_frame; inline_frame != 0; inline_frame = inline_frame->next, inline_frame_idx += 1)\r\n      {\r\n        inline_frame->v.inline_depth = inline_frame_count - inline_frame_idx;\r\n        if(inline_frame == last_inline_frame)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: package\r\n    result.frames_count = frame_count; \r\n    result.frames = push_array(arena, CTRL_CallStackFrame, result.frames_count);\r\n    result.concrete_frames_count = base_unwind->frames.count;\r\n    result.concrete_frames = push_array(arena, CTRL_CallStackFrame *, result.concrete_frames_count);\r\n    {\r\n      U64 idx = 0;\r\n      U64 concrete_idx = 0;\r\n      for(FrameNode *n = first_frame; n != 0; n = n->next, idx += 1)\r\n      {\r\n        MemoryCopyStruct(&result.frames[idx], &n->v);\r\n        if(n->v.inline_depth == 0 && concrete_idx < result.concrete_frames_count)\r\n        {\r\n          result.concrete_frames[concrete_idx] = &result.frames[idx];\r\n          concrete_idx += 1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  access_close(access);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal CTRL_CallStackFrame *\r\nctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth)\r\n{\r\n  CTRL_CallStackFrame *f = 0;\r\n  {\r\n    U64 base_frame_idx = 0;\r\n    for(U64 idx = 0; idx < call_stack->frames_count; idx += 1)\r\n    {\r\n      if(call_stack->frames[idx].inline_depth == 0)\r\n      {\r\n        if(base_frame_idx == unwind_count)\r\n        {\r\n          f = &call_stack->frames[idx];\r\n          break;\r\n        }\r\n        base_frame_idx += 1;\r\n      }\r\n    }\r\n    if(f != 0 && call_stack->frames + inline_depth < f)\r\n    {\r\n      f -= inline_depth;\r\n    }\r\n  }\r\n  return f;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Halting All Attached Processes\r\n\r\ninternal void\r\nctrl_halt(void)\r\n{\r\n  dmn_halt(0, 0);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared Accessor Functions\r\n\r\n//- rjf: generation counters\r\n\r\ninternal U64\r\nctrl_run_gen(void)\r\n{\r\n  U64 result = ins_atomic_u64_eval(&ctrl_state->run_gen);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_mem_gen(void)\r\n{\r\n  U64 result = ins_atomic_u64_eval(&ctrl_state->mem_gen);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nctrl_reg_gen(void)\r\n{\r\n  U64 result = ins_atomic_u64_eval(&ctrl_state->reg_gen);\r\n  return result;\r\n}\r\n\r\n//- rjf: name -> register/alias hash tables, for eval\r\n\r\ninternal E_String2NumMap *\r\nctrl_string2reg_from_arch(Arch arch)\r\n{\r\n  return &ctrl_state->arch_string2reg_tables[arch];\r\n}\r\n\r\ninternal E_String2NumMap *\r\nctrl_string2alias_from_arch(Arch arch)\r\n{\r\n  return &ctrl_state->arch_string2alias_tables[arch];\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Control-Thread Functions\r\n\r\n//- rjf: user -> control thread communication\r\n\r\ninternal B32\r\nctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 msgs_srlzed_baked = ctrl_serialized_string_from_msg_list(scratch.arena, msgs);\r\n  B32 good = 0;\r\n  MutexScope(ctrl_state->u2c_ring_mutex) for(;;)\r\n  {\r\n    U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos);\r\n    U64 available_size = ctrl_state->u2c_ring_size-unconsumed_size;\r\n    U64 needed_size = sizeof(msgs_srlzed_baked.size) + msgs_srlzed_baked.size;\r\n    if(available_size >= needed_size)\r\n    {\r\n      ctrl_state->u2c_ring_write_pos += ring_write_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, &msgs_srlzed_baked.size);\r\n      ctrl_state->u2c_ring_write_pos += ring_write(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_write_pos, msgs_srlzed_baked.str, msgs_srlzed_baked.size);\r\n      good = 1;\r\n      break;\r\n    }\r\n    if(os_now_microseconds() >= endt_us)\r\n    {\r\n      break;\r\n    }\r\n    cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, endt_us);\r\n  }\r\n  if(good)\r\n  {\r\n    cond_var_broadcast(ctrl_state->u2c_ring_cv);\r\n  }\r\n  scratch_end(scratch);\r\n  return good;\r\n}\r\n\r\ninternal CTRL_MsgList\r\nctrl_u2c_pop_msgs(Arena *arena)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 msgs_srlzed_baked = {0};\r\n  MutexScope(ctrl_state->u2c_ring_mutex) for(;;)\r\n  {\r\n    U64 unconsumed_size = (ctrl_state->u2c_ring_write_pos-ctrl_state->u2c_ring_read_pos);\r\n    if(unconsumed_size >= sizeof(U64))\r\n    {\r\n      U64 size_to_decode = 0;\r\n      ctrl_state->u2c_ring_read_pos += ring_read_struct(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, &size_to_decode);\r\n      msgs_srlzed_baked.size = size_to_decode;\r\n      msgs_srlzed_baked.str = push_array_no_zero(scratch.arena, U8, msgs_srlzed_baked.size);\r\n      ctrl_state->u2c_ring_read_pos += ring_read(ctrl_state->u2c_ring_base, ctrl_state->u2c_ring_size, ctrl_state->u2c_ring_read_pos, msgs_srlzed_baked.str, size_to_decode);\r\n      break;\r\n    }\r\n    cond_var_wait(ctrl_state->u2c_ring_cv, ctrl_state->u2c_ring_mutex, max_U64);\r\n  }\r\n  cond_var_broadcast(ctrl_state->u2c_ring_cv);\r\n  CTRL_MsgList msgs = ctrl_msg_list_from_serialized_string(arena, msgs_srlzed_baked);\r\n  scratch_end(scratch);\r\n  return msgs;\r\n}\r\n\r\n//- rjf: control -> user thread communication\r\n\r\ninternal void\r\nctrl_c2u_push_events(CTRL_EventList *events)\r\n{\r\n  if(events->count != 0) ProfScope(\"ctrl_c2u_push_events\")\r\n  {\r\n    MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex)\r\n    {\r\n      ctrl_entity_store_apply_events(ctrl_state->ctrl_thread_entity_store, events);\r\n    }\r\n    for(CTRL_EventNode *n = events->first; n != 0; n = n ->next)\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      String8 event_srlzed = ctrl_serialized_string_from_event(scratch.arena, &n->v, ctrl_state->c2u_ring_size-sizeof(U64));\r\n      MutexScope(ctrl_state->c2u_ring_mutex) for(;;)\r\n      {\r\n        U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos);\r\n        U64 available_size = ctrl_state->c2u_ring_size-unconsumed_size;\r\n        U64 needed_size = sizeof(event_srlzed.size) + event_srlzed.size;\r\n        if(available_size >= needed_size)\r\n        {\r\n          ctrl_state->c2u_ring_write_pos += ring_write_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, &event_srlzed.size);\r\n          ctrl_state->c2u_ring_write_pos += ring_write(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_write_pos, event_srlzed.str, event_srlzed.size);\r\n          break;\r\n        }\r\n        cond_var_wait(ctrl_state->c2u_ring_cv, ctrl_state->c2u_ring_mutex, os_now_microseconds()+100);\r\n      }\r\n      cond_var_broadcast(ctrl_state->c2u_ring_cv);\r\n      if(ctrl_state->wakeup_hook != 0)\r\n      {\r\n        ctrl_state->wakeup_hook();\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n}\r\n\r\ninternal CTRL_EventList\r\nctrl_c2u_pop_events(Arena *arena)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  CTRL_EventList events = {0};\r\n  MutexScope(ctrl_state->c2u_ring_mutex) for(;;)\r\n  {\r\n    U64 unconsumed_size = (ctrl_state->c2u_ring_write_pos-ctrl_state->c2u_ring_read_pos);\r\n    if(unconsumed_size >= sizeof(U64))\r\n    {\r\n      U64 size_to_decode = 0;\r\n      ctrl_state->c2u_ring_read_pos += ring_read_struct(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, &size_to_decode);\r\n      String8 event_srlzed = {0};\r\n      event_srlzed.size = size_to_decode;\r\n      event_srlzed.str = push_array_no_zero(scratch.arena, U8, event_srlzed.size);\r\n      ctrl_state->c2u_ring_read_pos += ring_read(ctrl_state->c2u_ring_base, ctrl_state->c2u_ring_size, ctrl_state->c2u_ring_read_pos, event_srlzed.str, event_srlzed.size);\r\n      CTRL_Event *new_event = ctrl_event_list_push(arena, &events);\r\n      *new_event = ctrl_event_from_serialized_string(arena, event_srlzed);\r\n    }\r\n    else\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  cond_var_broadcast(ctrl_state->c2u_ring_cv);\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return events;\r\n}\r\n\r\n//- rjf: entry point\r\n\r\ninternal void\r\nctrl_thread__entry_point(void *p)\r\n{\r\n  ThreadNameF(\"ctrl_thread\");\r\n  ProfBeginFunction();\r\n  DMN_CtrlCtx *ctrl_ctx = dmn_ctrl_begin();\r\n  log_select(ctrl_state->ctrl_thread_log);\r\n  \r\n  //- rjf: loop\r\n  Temp scratch = scratch_begin(0, 0);\r\n  for(;;)\r\n  {\r\n    temp_end(scratch);\r\n    log_scope_begin();\r\n    \r\n    //- rjf: get next messages\r\n    CTRL_MsgList msgs = ctrl_u2c_pop_msgs(scratch.arena);\r\n    \r\n    //- rjf: process messages\r\n    DMN_CtrlExclusiveAccessScope\r\n    {\r\n      ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 1);\r\n      for(CTRL_MsgNode *msg_n = msgs.first; msg_n != 0; msg_n = msg_n->next)\r\n      {\r\n        CTRL_Msg *msg = &msg_n->v;\r\n        {\r\n          log_infof(\"user2ctrl_msg:{kind:\\\"%S\\\"}\\n\", ctrl_string_from_msg_kind(msg->kind));\r\n        }\r\n        \r\n        //- rjf: reset per-message state\r\n        ProfScope(\"reset per-message state\")\r\n        {\r\n          arena_clear(ctrl_state->ctrl_thread_msg_process_arena);\r\n          ctrl_state->module_req_cache_slots_count = 4096;\r\n          ctrl_state->module_req_cache_slots = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode *, ctrl_state->module_req_cache_slots_count);\r\n          MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_files);\r\n          MemoryZeroStruct(&ctrl_state->msg_user_bp_touched_symbols);\r\n          MemoryCopyArray(ctrl_state->exception_code_filters, msg->exception_code_filters);\r\n        }\r\n        \r\n        //- rjf: gather all touched symbols by user breakpoints\r\n        {\r\n          Temp scratch = scratch_begin(0, 0);\r\n          for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next)\r\n          {\r\n            if(n->v.kind != CTRL_UserBreakpointKind_Expression)\r\n            {\r\n              continue;\r\n            }\r\n            E_Parse addr_parse = e_push_parse_from_string(scratch.arena, n->v.string);\r\n            E_Parse cnd_parse = e_push_parse_from_string(scratch.arena, n->v.condition);\r\n            E_Expr *exprs[] = {addr_parse.expr, cnd_parse.expr};\r\n            for EachElement(idx, exprs)\r\n            {\r\n              typedef struct ExprWalkTask ExprWalkTask;\r\n              struct ExprWalkTask\r\n              {\r\n                ExprWalkTask *next;\r\n                E_Expr *expr;\r\n              };\r\n              ExprWalkTask start_task = {0, exprs[idx]};\r\n              ExprWalkTask *first_task = &start_task;\r\n              for(ExprWalkTask *t = first_task; t != 0; t = t->next)\r\n              {\r\n                E_Expr *expr = t->expr;\r\n                if(expr->ref != &e_expr_nil)\r\n                {\r\n                  expr = expr->ref;\r\n                }\r\n                if(expr->kind == E_ExprKind_LeafIdentifier)\r\n                {\r\n                  str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_symbols, expr->string);\r\n                }\r\n                if(expr->next != &e_expr_nil)\r\n                {\r\n                  ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);\r\n                  task->expr = expr->next;\r\n                  task->next = t->next;\r\n                  t->next = task;\r\n                }\r\n                if(expr->first != &e_expr_nil)\r\n                {\r\n                  ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);\r\n                  task->expr = expr->first;\r\n                  task->next = t->next;\r\n                  t->next = task;\r\n                }\r\n              }\r\n            }\r\n          }\r\n          scratch_end(scratch);\r\n        }\r\n        \r\n       \r\n\r\n\r\n\r\n             //- rjf: gather all touched files by user breakpoints\r\n        for(CTRL_UserBreakpointNode *n = msg->user_bps.first; n != 0; n = n->next)\r\n        {\r\n          if(n->v.kind != CTRL_UserBreakpointKind_FileNameAndLineColNumber)\r\n          {\r\n            continue;\r\n          }\r\n          str8_list_push(ctrl_state->ctrl_thread_msg_process_arena, &ctrl_state->msg_user_bp_touched_files, n->v.string);\r\n        }\r\n        \r\n        //- rjf: process message\r\n        switch(msg->kind)\r\n        {\r\n          case CTRL_MsgKind_Null:\r\n          case CTRL_MsgKind_COUNT:{}break;\r\n          \r\n          //- rjf: target operations\r\n          case CTRL_MsgKind_Launch:            {ctrl_thread__launch              (ctrl_ctx, msg);}break;\r\n          case CTRL_MsgKind_Attach:            {ctrl_thread__attach              (ctrl_ctx, msg);}break;\r\n          case CTRL_MsgKind_Kill:              {ctrl_thread__kill                (ctrl_ctx, msg);}break;\r\n          case CTRL_MsgKind_KillAll:           {ctrl_thread__kill_all            (ctrl_ctx, msg);}break;\r\n          case CTRL_MsgKind_Detach:            {ctrl_thread__detach              (ctrl_ctx, msg);}break;\r\n          case CTRL_MsgKind_Run:               {ctrl_thread__run                 (ctrl_ctx, msg);}break;\r\n          case CTRL_MsgKind_SingleStep:        {ctrl_thread__single_step         (ctrl_ctx, msg);}break;\r\n          \r\n          //- rjf: configuration\r\n          case CTRL_MsgKind_SetUserEntryPoints:\r\n          {\r\n            arena_clear(ctrl_state->user_entry_point_arena);\r\n            MemoryZeroStruct(&ctrl_state->user_entry_points);\r\n            for(String8Node *n = msg->entry_points.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_push(ctrl_state->user_entry_point_arena, &ctrl_state->user_entry_points, n->string);\r\n            }\r\n          }break;\r\n          case CTRL_MsgKind_SetModuleDebugInfoPath:\r\n          {\r\n            CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n            String8 path = msg->path;\r\n            CTRL_Entity *module = ctrl_entity_from_handle(entity_ctx, msg->entity);\r\n            CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath);\r\n            DI_Key old_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, debug_info_path->timestamp);\r\n            di_close(old_dbgi_key, 0);\r\n            MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex)\r\n            {\r\n              ctrl_entity_equip_string(ctrl_state->ctrl_thread_entity_store, debug_info_path, path_normalized_from_string(scratch.arena, path));\r\n            }\r\n            U64 new_dbgi_timestamp = os_properties_from_file_path(path).modified;\r\n            debug_info_path->timestamp = new_dbgi_timestamp;\r\n            DI_Key new_dbgi_key = di_key_from_path_timestamp(debug_info_path->string, new_dbgi_timestamp);\r\n            di_open(new_dbgi_key);\r\n            CTRL_EventList evts = {0};\r\n            CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts);\r\n            evt->kind       = CTRL_EventKind_ModuleDebugInfoPathChange;\r\n            evt->entity     = msg->entity;\r\n            evt->string     = path;\r\n            evt->timestamp  = new_dbgi_timestamp;\r\n            ctrl_c2u_push_events(&evts);\r\n          }break;\r\n          case CTRL_MsgKind_FreezeThread:\r\n          {\r\n            CTRL_EventList evts = {0};\r\n            CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts);\r\n            evt->kind       = CTRL_EventKind_ThreadFrozen;\r\n            evt->entity     = msg->entity;\r\n            ctrl_c2u_push_events(&evts);\r\n          }break;\r\n          case CTRL_MsgKind_ThawThread:\r\n          {\r\n            CTRL_EventList evts = {0};\r\n            CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts);\r\n            evt->kind       = CTRL_EventKind_ThreadThawed;\r\n            evt->entity     = msg->entity;\r\n            ctrl_c2u_push_events(&evts);\r\n          }break;\r\n        }\r\n      }\r\n      ins_atomic_u64_eval_assign(&ctrl_state->ctrl_thread_run_state, 0);\r\n    }\r\n    ins_atomic_u64_inc_eval(&ctrl_state->run_gen);\r\n    ins_atomic_u64_inc_eval(&ctrl_state->mem_gen);\r\n    ins_atomic_u64_inc_eval(&ctrl_state->reg_gen);\r\n    \r\n    //- rjf: update thread register cache\r\n    ProfScope(\"update thread register cache\")\r\n    {\r\n      CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n      CTRL_EntityArray threads = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Thread);\r\n      REGS_RegBlockX64 *blocks = push_array(scratch.arena, REGS_RegBlockX64, threads.count);\r\n      {\r\n        for EachIndex(idx, threads.count)\r\n        {\r\n          Temp scratch = scratch_begin(0, 0);\r\n          ctrl_reg_block_from_thread(scratch.arena, entity_ctx, threads.v[idx]->handle);\r\n          scratch_end(scratch);\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: gather & output logs\r\n    ctrl_thread__end_and_flush_log();\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: breakpoint resolution\r\n\r\ninternal void\r\nctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out)\r\n{\r\n  if(user_bps->first == 0) { return; }\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  Access *access = eval_scope->access;\r\n  CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n  CTRL_Entity *module_entity = ctrl_entity_from_handle(entity_ctx, module);\r\n  CTRL_Entity *debug_info_path_entity = ctrl_entity_child_from_kind(module_entity, CTRL_EntityKind_DebugInfoPath);\r\n  DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_entity);\r\n  RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n  U64 base_vaddr = module_entity->vaddr_range.min;\r\n  for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next)\r\n  {\r\n    CTRL_UserBreakpoint *bp = &n->v;\r\n    switch(bp->kind)\r\n    {\r\n      default:{}break;\r\n      \r\n      //- rjf: file:line-based breakpoints\r\n      case CTRL_UserBreakpointKind_FileNameAndLineColNumber:\r\n      {\r\n        // rjf: unpack & normalize\r\n        TxtPt pt = bp->pt;\r\n        String8 filename = bp->string;\r\n        String8 filename_normalized = push_str8_copy(scratch.arena, filename);\r\n        for(U64 idx = 0; idx < filename_normalized.size; idx += 1)\r\n        {\r\n          filename_normalized.str[idx] = lower_from_char(filename_normalized.str[idx]);\r\n          filename_normalized.str[idx] = correct_slash_from_char(filename_normalized.str[idx]);\r\n        }\r\n        \r\n        // rjf: filename -> src_id\r\n        U32 src_id = 0;\r\n        {\r\n          RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths);\r\n          if(mapptr != 0)\r\n          {\r\n            RDI_ParsedNameMap map = {0};\r\n            rdi_parsed_from_name_map(rdi, mapptr, &map);\r\n            RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, filename_normalized.str, filename_normalized.size);\r\n            if(node != 0)\r\n            {\r\n              U32 id_count = 0;\r\n              U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n              if(id_count > 0)\r\n              {\r\n                src_id = ids[0];\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: src_id * pt -> push\r\n        if(src_id != 0)\r\n        {\r\n          RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id);\r\n          RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx);\r\n          RDI_ParsedSourceLineMap line_map = {0};\r\n          rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map);\r\n          U32 voff_count = 0;\r\n          U64 *voffs = rdi_line_voffs_from_num(&line_map, pt.line, &voff_count);\r\n          for(U32 i = 0; i < voff_count; i += 1)\r\n          {\r\n            U64 vaddr = voffs[i] + base_vaddr;\r\n            DMN_Trap trap = {process.dmn_handle, vaddr, (U64)bp};\r\n            dmn_trap_chunk_list_push(arena, traps_out, 256, &trap);\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: expression-based breakpoints\r\n      case CTRL_UserBreakpointKind_Expression:\r\n      {\r\n        String8 expr = bp->string;\r\n        E_Value value = e_value_from_string(expr);\r\n        if(value.u64 != 0 || bp->flags != 0)\r\n        {\r\n          DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp};\r\n          trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags);\r\n          trap.size = bp->size;\r\n          dmn_trap_chunk_list_push(arena, traps_out, 256, &trap);\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out)\r\n{\r\n  for(CTRL_UserBreakpointNode *n = user_bps->first; n != 0; n = n->next)\r\n  {\r\n    CTRL_UserBreakpoint *bp = &n->v;\r\n    if(bp->kind == CTRL_UserBreakpointKind_Expression)\r\n    {\r\n      String8 expr = bp->string;\r\n      E_Value value = e_value_from_string(expr);\r\n      if(value.u64 != 0 || bp->flags != 0)\r\n      {\r\n        DMN_Trap trap = {process.dmn_handle, value.u64, (U64)bp};\r\n        trap.flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->flags);\r\n        trap.size = bp->size;\r\n        dmn_trap_chunk_list_push(arena, traps_out, 256, &trap);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out)\r\n{\r\n  CTRL_Entity *process = bp->parent;\r\n  DMN_Trap trap =\r\n  {\r\n    .process = process->handle.dmn_handle,\r\n    .vaddr = bp->vaddr_range.min,\r\n    .id = ((U64)bp|bit64),\r\n    .flags = ctrl_dmn_trap_flags_from_user_breakpoint_flags(bp->bp_flags),\r\n    .size = (U32)dim_1u64(bp->vaddr_range),\r\n  };\r\n  dmn_trap_chunk_list_push(arena, traps_out, 256, &trap);\r\n}\r\n\r\n//- rjf: module lifetime open/close work\r\n\r\ninternal\r\nDW_MEM_READ(ctrl_dmn_mem_read)\r\n{\r\n  U64 read = dmn_process_read(((CTRL_Handle *)ud)->dmn_handle, r1u64(addr, addr + size), buffer);\r\n  return read == size ? DW_UnwindStatus_Ok : DW_UnwindStatus_Fail;\r\n}\r\n\r\ninternal void\r\nctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n\r\n  Arena   *arena                                 = arena_alloc();\r\n  U64      entry_point_voff                      = 0;\r\n  Rng1U64  tls_vaddr_range                       = {0};\r\n  U32      rdi_dbg_time                          = 0;\r\n  Guid     rdi_dbg_guid                          = {0};\r\n  String8  exe_dbg_path                          = {0};\r\n  String8  rdi_dbg_path                          = {0};\r\n  String8  raddbg_data                           = {0};\r\n  Rng1U64  raddbg_section_voff_range             = r1u64(0, 0);\r\n  Rng1U64  raddbg_is_attached_section_voff_range = r1u64(0, 0);\r\n\r\n  PE_IntelPdata *pdatas       = 0;\r\n  U64            pdatas_count = 0;\r\n  U32            pdb_dbg_time = 0;\r\n  U32            pdb_dbg_age  = 0;\r\n  Guid           pdb_dbg_guid = {0};\r\n  String8        pdb_dbg_path = {0};\r\n\r\n  U64         cfi_rebase   = 0;\r\n  B32         is_unwind_eh = 0;\r\n  EH_FrameHdr eh_frame_hdr = {0};\r\n  EH_PtrCtx   eh_ptr_ctx   = { .pc_vaddr = max_U64, .text_vaddr = max_U64, .data_vaddr = max_U64, .func_vaddr = max_U64, .ptr_align = 0 };\r\n\r\n  // read module's signature bytes\r\n  U64  module_sig_size  = Max(elf_magic_string.size, sizeof(PE_DosMagic));\r\n  U8  *module_sig_bytes = push_array(scratch.arena, U8, module_sig_size);\r\n  dmn_process_read(process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + module_sig_size), module_sig_bytes);\r\n\r\n  //////////////////////////////\r\n  //- parse PE module\r\n  //\r\n  PE_DosMagic dos_magic = *(PE_DosMagic *)module_sig_bytes;\r\n  if(dos_magic == PE_DOS_MAGIC)\r\n  {\r\n    ProfScope(\"unpack relevant PE info\")\r\n    {\r\n      B32 is_valid = 1;\r\n      \r\n      //- rjf: read DOS header\r\n      PE_DosHeader dos_header = {0};\r\n      if(is_valid)\r\n      {\r\n        if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min, &dos_header) ||\r\n           dos_header.magic != PE_DOS_MAGIC)\r\n        {\r\n          is_valid = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: read PE magic\r\n      U32 pe_magic = 0;\r\n      if(is_valid)\r\n      {\r\n        if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dos_header.coff_file_offset, &pe_magic) ||\r\n           pe_magic != PE_MAGIC)\r\n        {\r\n          is_valid = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: read COFF header\r\n      U64 file_header_off = dos_header.coff_file_offset + sizeof(pe_magic);\r\n      COFF_FileHeader file_header = {0};\r\n      if(is_valid)\r\n      {\r\n        if(!dmn_process_read_struct(process.dmn_handle, vaddr_range.min + file_header_off, &file_header))\r\n        {\r\n          is_valid = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: unpack range of optional extension header\r\n      U32 opt_ext_size = file_header.optional_header_size;\r\n      Rng1U64 opt_ext_off_range = r1u64(file_header_off + sizeof(COFF_FileHeader),\r\n                                        file_header_off + sizeof(COFF_FileHeader) + opt_ext_size);\r\n      \r\n      //- rjf: read optional header\r\n      U64 entry_point = 0;\r\n      U32 data_dir_count = 0;\r\n      if(opt_ext_size > 0)\r\n      {\r\n        // rjf: read magic number\r\n        U16 opt_ext_magic = 0;\r\n        dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &opt_ext_magic);\r\n        \r\n        // rjf: read info\r\n        U32 reported_data_dir_offset = 0;\r\n        U32 reported_data_dir_count = 0;\r\n        switch(opt_ext_magic)\r\n        {\r\n          case PE_PE32_MAGIC:\r\n          {\r\n            PE_OptionalHeader32 pe_optional = {0};\r\n            dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional);\r\n            entry_point = pe_optional.entry_point_va;\r\n            reported_data_dir_offset = sizeof(pe_optional);\r\n            reported_data_dir_count = pe_optional.data_dir_count;\r\n          }break;\r\n          case PE_PE32PLUS_MAGIC:\r\n          {\r\n            PE_OptionalHeader32Plus pe_optional = {0};\r\n            dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min, &pe_optional);\r\n            entry_point = pe_optional.entry_point_va;\r\n            reported_data_dir_offset = sizeof(pe_optional);\r\n            reported_data_dir_count = pe_optional.data_dir_count;\r\n          }break;\r\n        }\r\n        \r\n        // rjf: find number of data directories\r\n        U32 data_dir_max = (opt_ext_size - reported_data_dir_offset) / sizeof(PE_DataDirectory);\r\n        data_dir_count = ClampTop(reported_data_dir_count, data_dir_max);\r\n        \r\n        // rjf: grab pdatas from exceptions section\r\n        if(data_dir_count > PE_DataDirectoryIndex_EXCEPTIONS)\r\n        {\r\n          PE_DataDirectory dir = {0};\r\n          dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_EXCEPTIONS, &dir);\r\n          Rng1U64 pdatas_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size);\r\n          pdatas_count = dim_1u64(pdatas_voff_range)/sizeof(PE_IntelPdata);\r\n          pdatas = push_array(arena, PE_IntelPdata, pdatas_count);\r\n          dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + pdatas_voff_range.min, vaddr_range.min + pdatas_voff_range.max), pdatas);\r\n        }\r\n        \r\n        // rjf: extract tls header\r\n        PE_TLSHeader64 tls_header = {0};\r\n        if(data_dir_count > PE_DataDirectoryIndex_TLS)\r\n        {\r\n          PE_DataDirectory dir = {0};\r\n          dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_TLS, &dir);\r\n          Rng1U64 tls_voff_range = r1u64((U64)dir.virt_off, (U64)dir.virt_off + (U64)dir.virt_size);\r\n          switch(file_header.machine)\r\n          {\r\n            default:{}break;\r\n            case COFF_MachineType_X86:\r\n            {\r\n              PE_TLSHeader32 tls_header32 = {0};\r\n              dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header32);\r\n              tls_header.raw_data_start    = (U64)tls_header32.raw_data_start;\r\n              tls_header.raw_data_end      = (U64)tls_header32.raw_data_end;\r\n              tls_header.index_address     = (U64)tls_header32.index_address;\r\n              tls_header.callbacks_address = (U64)tls_header32.callbacks_address;\r\n              tls_header.zero_fill_size    = (U64)tls_header32.zero_fill_size;\r\n              tls_header.characteristics   = (U64)tls_header32.characteristics;\r\n            }break;\r\n            case COFF_MachineType_X64:\r\n            {\r\n              dmn_process_read_struct(process.dmn_handle, vaddr_range.min + tls_voff_range.min, &tls_header);\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        // rjf: extract sections\r\n        U64 sec_array_off = opt_ext_off_range.max;\r\n        U64 sec_count = file_header.section_count;\r\n        COFF_SectionHeader *sec = push_array(scratch.arena, COFF_SectionHeader, sec_count);\r\n        dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + sec_array_off, vaddr_range.min + sec_array_off + sec_count*sizeof(COFF_SectionHeader)), sec);\r\n        \r\n        // rjf: grab entry point vaddr\r\n        entry_point_voff = entry_point;\r\n        \r\n        // rjf: calculate TLS vaddr range\r\n        tls_vaddr_range = r1u64(tls_header.index_address, tls_header.index_address+sizeof(U32));\r\n        \r\n        // rjf: grab data about debug info\r\n        if(data_dir_count > PE_DataDirectoryIndex_DEBUG)\r\n        {\r\n          // rjf: read data dir\r\n          PE_DataDirectory dir = {0};\r\n          dmn_process_read_struct(process.dmn_handle, vaddr_range.min + opt_ext_off_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*PE_DataDirectoryIndex_DEBUG, &dir);\r\n          \r\n          U64 dbg_dir_count = dir.virt_size / sizeof(PE_DebugDirectory);\r\n          for(U64 dbg_dir_idx = 0; dbg_dir_idx < dbg_dir_count; dbg_dir_idx += 1)\r\n          {\r\n            // rjf: read debug directory\r\n            U64 dir_addr = vaddr_range.min + dir.virt_off + dbg_dir_idx * sizeof(PE_DebugDirectory);\r\n            PE_DebugDirectory dbg_data = {0};\r\n            dmn_process_read_struct(process.dmn_handle, dir_addr, &dbg_data);\r\n            \r\n            // rjf: extract external file info from codeview header\r\n            if(dbg_data.type == PE_DebugDirectoryType_CODEVIEW)\r\n            {\r\n              U32 cv_magic = 0;\r\n              dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv_magic);\r\n              switch(cv_magic)\r\n              {\r\n                default:break;\r\n                case PE_CODEVIEW_PDB20_MAGIC:\r\n                {\r\n                  PE_CvHeaderPDB20 cv;\r\n                  U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min+dbg_data.voff, &cv);\r\n                  if(read_size == sizeof(cv))\r\n                  {\r\n                    pdb_dbg_time = cv.time_stamp;\r\n                    pdb_dbg_age = cv.age;\r\n                    pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv));\r\n                  }\r\n                }break;\r\n                case PE_CODEVIEW_PDB70_MAGIC:\r\n                {\r\n                  PE_CvHeaderPDB70 cv;\r\n                  U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv);\r\n                  if(read_size == sizeof(cv))\r\n                  {\r\n                    pdb_dbg_guid = cv.guid;\r\n                    pdb_dbg_age = cv.age;\r\n                    pdb_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv));\r\n                  }\r\n                }break;\r\n                case PE_CODEVIEW_RDI_MAGIC:\r\n                {\r\n                  PE_CvHeaderRDI cv;\r\n                  U64 read_size = dmn_process_read_struct(process.dmn_handle, vaddr_range.min + dbg_data.voff, &cv);\r\n                  if(read_size == sizeof(cv))\r\n                  {\r\n                    rdi_dbg_guid = cv.guid;\r\n                    rdi_dbg_path = dmn_process_read_cstring(arena, process.dmn_handle, vaddr_range.min + dbg_data.voff + sizeof(cv));\r\n                  }\r\n                }break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: look for DWARF debug info\r\n        {\r\n          U64 symbol_array_off = file_header.symbol_table_foff;\r\n          U64 symbol_count = file_header.symbol_count;\r\n          if(symbol_array_off != 0)\r\n          {\r\n            exe_dbg_path = path;\r\n          }\r\n        }\r\n        \r\n        // rjf: extract copy of module's raddbg data\r\n        {\r\n          for EachIndex(idx, sec_count)\r\n          {\r\n            String8 section_name = str8_cstring((char *)sec[idx].name);\r\n            if(str8_match(section_name, str8_lit(\".raddbg\"), 0))\r\n            {\r\n              raddbg_section_voff_range.min = sec[idx].voff;\r\n              raddbg_section_voff_range.max = sec[idx].voff + sec[idx].vsize;\r\n            }\r\n            else if(str8_match(section_name, str8_lit(\".rdbgia\"), 0))\r\n            {\r\n              raddbg_is_attached_section_voff_range.min = sec[idx].voff;\r\n              raddbg_is_attached_section_voff_range.max = sec[idx].voff + sec[idx].vsize;\r\n            }\r\n          }\r\n          raddbg_data.size = dim_1u64(raddbg_section_voff_range);\r\n          raddbg_data.str = push_array(arena, U8, raddbg_data.size);\r\n          dmn_process_read(process.dmn_handle, r1u64(vaddr_range.min + raddbg_section_voff_range.min,\r\n                                                     vaddr_range.min + raddbg_section_voff_range.max), raddbg_data.str);\r\n        }\r\n        \r\n        // rjf: if we have a \"raddbg is attached\" section, mark the first byte as 1, to signify attachment\r\n        if(raddbg_is_attached_section_voff_range.max != raddbg_is_attached_section_voff_range.min)\r\n        {\r\n          U8 new_value = 1;\r\n          dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_is_attached_section_voff_range.min, &new_value);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  //////////////////////////////\r\n  //- parse ELF module\r\n  //\r\n  else if(str8_match(str8(module_sig_bytes, elf_magic_string.size), elf_magic_string, 0))\r\n  {\r\n    U64      e_entry = 0;\r\n    ELF_Type e_type  = ELF_Type_None;\r\n    {\r\n      U8 *elf_sig = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(elf_sig[0]) * ELF_Identifier_Max));\r\n      if(elf_sig == 0) { goto elf_exit; }\r\n      switch(elf_sig[ELF_Identifier_Class])\r\n      {\r\n      default:\r\n      case ELF_Class_None:{}break;\r\n      case ELF_Class_32:\r\n      {\r\n        NotImplemented;\r\n      }break;\r\n      case ELF_Class_64:\r\n      {\r\n        ELF_Hdr64 *ehdr = dmn_process_read_raw(scratch.arena, process.dmn_handle, rng_1u64(vaddr_range.min, vaddr_range.min + sizeof(*ehdr)));\r\n        if(ehdr == 0) { goto elf_exit; }\r\n        e_entry = ehdr->e_entry;\r\n        e_type  = ehdr->e_type;\r\n      }break;\r\n      }\r\n    }\r\n\r\n    if(e_type == ELF_Type_Dyn)\r\n    {\r\n      cfi_rebase = vaddr_range.min;\r\n    }\r\n\r\n    // find and parse .eh_frame_hdr\r\n    Rng1U64 eh_frame_hdr_vrange = {0};\r\n    String8 eh_frame_hdr_data   = {0};\r\n    {\r\n      void *phdrs_raw = dmn_process_read_raw(scratch.arena, process.dmn_handle, elf_phdr_vrange);\r\n      if(phdrs_raw == 0) { goto elf_exit; }\r\n\r\n      if(elf_phdr_entsize == sizeof(ELF_Phdr32))\r\n      {\r\n        NotImplemented;\r\n      }\r\n      else if(elf_phdr_entsize == sizeof(ELF_Phdr64))\r\n      {\r\n        U64         elf_phcount = dim_1u64(elf_phdr_vrange) / elf_phdr_entsize;\r\n        ELF_Phdr64 *phdrs64     = phdrs_raw;\r\n        for EachIndex(phdr_idx, elf_phcount)\r\n        {\r\n          ELF_Phdr64 *phdr = phdrs64 + phdr_idx;\r\n          if(phdr->p_type == ELF_PType_GnuEHFrame)\r\n          {\r\n            eh_frame_hdr_vrange = r1u64(cfi_rebase + phdr->p_vaddr, cfi_rebase + phdr->p_vaddr + phdr->p_memsz);\r\n            eh_frame_hdr_data   = dmn_process_read_block(arena, process.dmn_handle, eh_frame_hdr_vrange);\r\n            is_unwind_eh        = 1;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n\r\n    // parse .eh_frame_hdr\r\n    Arch arch = ctrl_arch_from_process_handle(process);\r\n    eh_ptr_ctx.pc_vaddr   = eh_frame_hdr_vrange.min;\r\n    eh_ptr_ctx.data_vaddr = eh_frame_hdr_vrange.min;\r\n    eh_frame_hdr          = eh_parse_frame_hdr(eh_frame_hdr_data, byte_size_from_arch(arch), &eh_ptr_ctx);\r\n\r\n    // set entry point\r\n    if (e_entry != 0)\r\n    {\r\n      entry_point_voff = e_entry - vaddr_range.min;\r\n    }\r\n\r\n    // TODO: is there a way to detect DWARF in runtime ELF?\r\n    if(1)\r\n    {\r\n      exe_dbg_path = path;\r\n    }\r\n    elf_exit:;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: pick default initial debug info path\r\n  //\r\n  String8 initial_debug_info_path = str8_zero();\r\n  {\r\n    String8 exe_folder = str8_chop_last_slash(path);\r\n    String8List dbg_path_candidates = {0};\r\n    //\r\n    //~ TODO(rjf): @linux_port PLEASE READ RYAN vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv\r\n    //\r\n    // TODO(rjf): trying \"exe_folder/embedded_path\" as the first option is only a valid\r\n    // heuristic on Windows, because we know that two absolute paths concatted together\r\n    // are necessarily invalid. however, on Linux, this is not the case - you could stitch\r\n    // two paths together and get a third path that is completely valid. so, in that case,\r\n    // we will need to infer if the path is relative, and then use either the embedded\r\n    // path as-is, or the exe-relative-path accordingly, depending on that.\r\n    //\r\n    if(rdi_dbg_path.size != 0)\r\n    {\r\n      str8_list_pushf(scratch.arena, &dbg_path_candidates, \"%S/%S\", exe_folder, rdi_dbg_path);\r\n      str8_list_push(scratch.arena,  &dbg_path_candidates, rdi_dbg_path);\r\n    }\r\n    if(exe_dbg_path.size != 0)\r\n    {\r\n      str8_list_push(scratch.arena, &dbg_path_candidates, path);\r\n    }\r\n    if(pdb_dbg_path.size != 0)\r\n    {\r\n      str8_list_pushf(scratch.arena, &dbg_path_candidates, \"%S/%S\", exe_folder, pdb_dbg_path);\r\n      str8_list_push(scratch.arena,  &dbg_path_candidates, pdb_dbg_path);\r\n    }\r\n    str8_list_pushf(scratch.arena, &dbg_path_candidates, \"%S.pdb\", str8_chop_last_dot(path));\r\n    str8_list_pushf(scratch.arena, &dbg_path_candidates, \"%S.pdb\", path);\r\n    str8_list_pushf(scratch.arena, &dbg_path_candidates, \"%S.rdi\", str8_chop_last_dot(path));\r\n    str8_list_pushf(scratch.arena, &dbg_path_candidates, \"%S.rdi\", path);\r\n    for(String8Node *n = dbg_path_candidates.first; n != 0; n = n->next)\r\n    {\r\n      String8 candidate_path = n->string;\r\n      FileProperties props = os_properties_from_file_path(candidate_path);\r\n      if(props.modified != 0 && props.size != 0)\r\n      {\r\n        initial_debug_info_path = push_str8_copy(arena, path_normalized_from_string(scratch.arena, candidate_path));\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: insert info into cache\r\n  //\r\n  {\r\n    U64                              hash       = ctrl_hash_from_handle(module);\r\n    U64                              slot_idx   = hash%ctrl_state->module_image_info_cache.slots_count;\r\n    U64                              stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n    CTRL_ModuleImageInfoCacheSlot   *slot       = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n    CTRL_ModuleImageInfoCacheStripe *stripe     = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n    MutexScopeW(stripe->rw_mutex)\r\n    {\r\n      CTRL_ModuleImageInfoCacheNode *node = 0;\r\n      for EachNode(n, CTRL_ModuleImageInfoCacheNode, slot->first)\r\n      {\r\n        if(ctrl_handle_match(n->module, module))\r\n        {\r\n          node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(!node)\r\n      {\r\n        node = push_array(arena, CTRL_ModuleImageInfoCacheNode, 1);\r\n        DLLPushBack(slot->first, slot->last, node);\r\n        node->module                  = module;\r\n        node->arena                   = arena;\r\n        node->pdatas                  = pdatas;\r\n        node->pdatas_count            = pdatas_count;\r\n        node->cfi_rebase              = cfi_rebase;\r\n        node->is_unwind_eh            = is_unwind_eh;\r\n        node->eh_frame_hdr            = eh_frame_hdr;\r\n        node->eh_ptr_ctx              = eh_ptr_ctx;\r\n        node->entry_point_voff        = entry_point_voff;\r\n        node->initial_debug_info_path = initial_debug_info_path;\r\n      }\r\n    }\r\n  }\r\n\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range)\r\n{\r\n  //////////////////////////////\r\n  //- rjf: evict module image info from cache\r\n  //\r\n  Rng1U64 raddbg_section_voff_range = {0};\r\n  {\r\n    U64 hash = ctrl_hash_from_handle(module);\r\n    U64 slot_idx = hash%ctrl_state->module_image_info_cache.slots_count;\r\n    U64 stripe_idx = slot_idx%ctrl_state->module_image_info_cache.stripes_count;\r\n    CTRL_ModuleImageInfoCacheSlot *slot = &ctrl_state->module_image_info_cache.slots[slot_idx];\r\n    CTRL_ModuleImageInfoCacheStripe *stripe = &ctrl_state->module_image_info_cache.stripes[stripe_idx];\r\n    MutexScopeW(stripe->rw_mutex)\r\n    {\r\n      CTRL_ModuleImageInfoCacheNode *node = 0;\r\n      for(CTRL_ModuleImageInfoCacheNode *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(ctrl_handle_match(n->module, module))\r\n        {\r\n          node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(node)\r\n      {\r\n        raddbg_section_voff_range = node->raddbg_section_voff_range;\r\n        DLLRemove(slot->first, slot->last, node);\r\n        arena_release(node->arena);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: write 0 into first byte of raddbg data section, to signify detachment\r\n  //\r\n  if(raddbg_section_voff_range.max != raddbg_section_voff_range.min)\r\n  {\r\n    U8 new_value = 0;\r\n    dmn_process_write_struct(process.dmn_handle, vaddr_range.min + raddbg_section_voff_range.min, &new_value);\r\n  }\r\n}\r\n\r\n//- rjf: attached process running/event gathering\r\n\r\ninternal DMN_Event *\r\nctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof)\r\n{\r\n  ProfBeginFunction();\r\n  DMN_Event *event = push_array(arena, DMN_Event, 1);\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n  \r\n  //- rjf: loop -> try to get event, run, repeat\r\n  U64 spoof_old_ip_value = 0;\r\n  ProfScope(\"loop -> try to get event, run, repeat\") for(B32 got_event = 0; got_event == 0;)\r\n  {\r\n    //- rjf: get next event\r\n    ProfScope(\"get next event\")\r\n    {\r\n      // rjf: grab first event\r\n      DMN_EventNode *next_event_node = ctrl_state->first_dmn_event_node;\r\n      \r\n      // rjf: log event\r\n      if(next_event_node != 0)\r\n      {\r\n        DMN_Event *ev = &next_event_node->v;\r\n        LogInfoNamedBlockF(\"dmn_event\")\r\n        {\r\n          log_infof(\"kind:           %S\\n\",       dmn_event_kind_string_table[ev->kind]);\r\n          log_infof(\"exception_kind: %S\\n\",       dmn_exception_kind_string_table[ev->exception_kind]);\r\n          log_infof(\"process:        [%I64u]\\n\",  ev->process.u64[0]);\r\n          log_infof(\"thread:         [%I64u]\\n\",  ev->thread.u64[0]);\r\n          log_infof(\"module:         [%I64u]\\n\",  ev->module.u64[0]);\r\n          log_infof(\"arch:           %S\\n\",       string_from_arch(ev->arch));\r\n          log_infof(\"address:        0x%I64x\\n\",  ev->address);\r\n          log_infof(\"string:         \\\"%S\\\"\\n\",   ev->string);\r\n          log_infof(\"ip_vaddr:       0x%I64x\\n\",  ev->instruction_pointer);\r\n        }\r\n      }\r\n      \r\n      // rjf: determine if we should filter\r\n      B32 should_filter_event = 0;\r\n      if(next_event_node != 0)\r\n      {\r\n        DMN_Event *ev = &next_event_node->v;\r\n        switch(ev->kind)\r\n        {\r\n          default:{}break;\r\n          case DMN_EventKind_Exception:\r\n          {\r\n            // NOTE(rjf): first chance exceptions -> try ignoring\r\n            should_filter_event = (ev->exception_repeated == 0 && (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value));\r\n            \r\n            // rjf: exception code -> kind\r\n            CTRL_ExceptionCodeKind code_kind = CTRL_ExceptionCodeKind_Null;\r\n            if(should_filter_event)\r\n            {\r\n              for(CTRL_ExceptionCodeKind k = (CTRL_ExceptionCodeKind)0; k < CTRL_ExceptionCodeKind_COUNT; k = (CTRL_ExceptionCodeKind)(k+1))\r\n              {\r\n                if(ctrl_exception_code_kind_code_table[k] == ev->code)\r\n                {\r\n                  code_kind = k;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: exception code kind -> shouldn't stop? if so, do not filter\r\n            if(should_filter_event)\r\n            {\r\n              B32 shouldnt_filter = !!(ctrl_state->exception_code_filters[code_kind/64] & (1ull<<(code_kind%64)));\r\n              if(should_filter_event && shouldnt_filter)\r\n              {\r\n                should_filter_event = 0;\r\n              }\r\n            }\r\n            \r\n            // rjf: special case: be gracious with ASan modules or symbols if\r\n            // they do their cute little 0xc0000005 exception trick...\r\n            if(!should_filter_event && ev->code == 0xc0000005 &&\r\n               (spoof == 0 || ev->instruction_pointer != spoof->new_ip_value))\r\n            {\r\n              Access *access = access_open();\r\n              CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, ev->process));\r\n              CTRL_Entity *module = &ctrl_entity_nil;\r\n              for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next)\r\n              {\r\n                if(child->kind == CTRL_EntityKind_Module)\r\n                {\r\n                  module = child;\r\n                  break;\r\n                }\r\n              }\r\n              if(module != &ctrl_entity_nil)\r\n              {\r\n                // rjf: determine base address of asan shadow space\r\n                U64 asan_shadow_base_vaddr = 0;\r\n                B32 asan_shadow_variable_exists_but_is_zero = 0;\r\n                DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n                RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64);\r\n                RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_GlobalVariables);\r\n                {\r\n                  RDI_ParsedNameMap map = {0};\r\n                  rdi_parsed_from_name_map(rdi, unparsed_map, &map);\r\n                  String8 name = str8_lit(\"__asan_shadow_memory_dynamic_address\");\r\n                  RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n                  if(node != 0)\r\n                  {\r\n                    U32 id_count = 0;\r\n                    U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n                    if(id_count > 0)\r\n                    {\r\n                      RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, ids[0]);\r\n                      U64 global_var_voff = global_var->voff;\r\n                      U64 global_var_vaddr = global_var->voff + module->vaddr_range.min;\r\n                      Arch arch = process->arch;\r\n                      U64 addr_size = bit_size_from_arch(arch)/8;\r\n                      dmn_process_read(ev->process, r1u64(global_var_vaddr, global_var_vaddr+addr_size), &asan_shadow_base_vaddr);\r\n                      asan_shadow_variable_exists_but_is_zero = (asan_shadow_base_vaddr == 0);\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: determine if this was a read/write to the shadow space\r\n                B32 violation_in_shadow_space = 0;\r\n                if(asan_shadow_base_vaddr != 0)\r\n                {\r\n                  U64 asan_shadow_space_size = TB(128)/8;\r\n                  if(asan_shadow_base_vaddr <= ev->address && ev->address < asan_shadow_base_vaddr+asan_shadow_space_size)\r\n                  {\r\n                    violation_in_shadow_space = 1;\r\n                  }\r\n                }\r\n                \r\n                // rjf: filter event if this violation occurred in asan's shadow space\r\n                if(violation_in_shadow_space || asan_shadow_variable_exists_but_is_zero)\r\n                {\r\n                  should_filter_event = 1;\r\n                }\r\n              }\r\n              \r\n              access_close(access);\r\n            }\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: good event & unfiltered? -> pop from queue & grab as result\r\n      if(next_event_node != 0 && !should_filter_event)\r\n      {\r\n        got_event = 1;\r\n        SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node);\r\n        MemoryCopyStruct(event, &next_event_node->v);\r\n        event->string = push_str8_copy(arena, event->string);\r\n        run_ctrls->ignore_previous_exception = 1;\r\n      }\r\n      \r\n      // rjf: good event but filtered? pop from queue\r\n      if(next_event_node != 0 && should_filter_event)\r\n      {\r\n        SLLQueuePop(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node);\r\n        run_ctrls->ignore_previous_exception = 0;\r\n      }\r\n    }\r\n    \r\n    //- rjf: no event -> dmn_ctrl_run for a new one\r\n    if(got_event == 0) ProfScope(\"no event -> dmn_ctrl_run for a new one\")\r\n    {\r\n      // rjf: prep spoof\r\n      B32 do_spoof = (spoof != 0 && dmn_handle_match(run_ctrls->single_step_thread, dmn_handle_zero()));\r\n      U64 size_of_spoof = 0;\r\n      if(do_spoof) ProfScope(\"prep spoof\")\r\n      {\r\n        CTRL_Entity *spoof_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->process));\r\n        Arch arch = spoof_process->arch;\r\n        size_of_spoof = bit_size_from_arch(arch)/8;\r\n        dmn_process_read(spoof_process->handle.dmn_handle, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value);\r\n      }\r\n      \r\n      // rjf: set spoof\r\n      if(do_spoof) ProfScope(\"set spoof\")\r\n      {\r\n        dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof->new_ip_value);\r\n      }\r\n      \r\n      // rjf: run for new events\r\n      ProfScope(\"run for new events\")\r\n      {\r\n        LogInfoNamedBlockF(\"dmn_ctrl_run\")\r\n        {\r\n          log_infof(\"single_step_thread:         [0x%I64x]\\n\", run_ctrls->single_step_thread);\r\n          log_infof(\"ignore_previous_exception:  %i\\n\", !!run_ctrls->ignore_previous_exception);\r\n          log_infof(\"run_entities_are_unfrozen:  %i\\n\", !!run_ctrls->run_entities_are_unfrozen);\r\n          log_infof(\"run_entities_are_processes: %i\\n\", !!run_ctrls->run_entities_are_processes);\r\n          log_infof(\"run_entity_count:           %I64u\\n\", run_ctrls->run_entity_count);\r\n          LogInfoNamedBlockF(\"run_entities\") for(U64 idx = 0; idx < run_ctrls->run_entity_count; idx += 1)\r\n          {\r\n            log_infof(\"[0x%I64x]\\n\", run_ctrls->run_entities[idx]);\r\n          }\r\n          log_infof(\"trap_count:                 %I64u\\n\", run_ctrls->traps.trap_count);\r\n          LogInfoNamedBlockF(\"traps\") for(DMN_TrapChunkNode *n = run_ctrls->traps.first; n != 0; n = n->next)\r\n          {\r\n            for(U64 idx = 0; idx < n->count; idx += 1)\r\n            {\r\n              log_infof(\"{process:[0x%I64x], vaddr:0x%I64x, id:0x%I64x}\\n\", n->v[idx].process.u64[0], n->v[idx].vaddr, n->v[idx].id);\r\n            }\r\n          }\r\n        }\r\n        DMN_EventList events = dmn_ctrl_run(scratch.arena, ctrl_ctx, run_ctrls);\r\n        ins_atomic_u64_inc_eval(&ctrl_state->mem_gen);\r\n        ins_atomic_u64_inc_eval(&ctrl_state->reg_gen);\r\n        ins_atomic_u64_inc_eval(&ctrl_state->run_gen);\r\n        for(DMN_EventNode *src_n = events.first; src_n != 0; src_n = src_n->next)\r\n        {\r\n          DMN_EventNode *dst_n = ctrl_state->free_dmn_event_node;\r\n          if(dst_n != 0)\r\n          {\r\n            SLLStackPop(ctrl_state->free_dmn_event_node);\r\n          }\r\n          else\r\n          {\r\n            dst_n = push_array(ctrl_state->dmn_event_arena, DMN_EventNode, 1);\r\n          }\r\n          MemoryCopyStruct(&dst_n->v, &src_n->v);\r\n          dst_n->v.string = push_str8_copy(ctrl_state->dmn_event_arena, dst_n->v.string);\r\n          SLLQueuePush(ctrl_state->first_dmn_event_node, ctrl_state->last_dmn_event_node, dst_n);\r\n        }\r\n      }\r\n      \r\n      // rjf: unset spoof\r\n      if(do_spoof) ProfScope(\"unset spoof\")\r\n      {\r\n        dmn_process_write(spoof->process, r1u64(spoof->vaddr, spoof->vaddr+size_of_spoof), &spoof_old_ip_value);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: irrespective of what event came back, we should ALWAYS check the\r\n  // spoof's thread and see if it hit the spoof address, because we may have\r\n  // simply been sent other debug events first\r\n  if(spoof != 0)\r\n  {\r\n    CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, spoof->thread));\r\n    Arch arch = thread->arch;\r\n    void *regs_block = push_array(scratch.arena, U8, regs_block_size_from_arch(arch));\r\n    dmn_thread_read_reg_block(spoof->thread, regs_block);\r\n    U64 spoof_thread_rip = regs_rip_from_arch_block(arch, regs_block);\r\n    if(spoof_thread_rip == spoof->new_ip_value)\r\n    {\r\n      regs_arch_block_write_rip(arch, regs_block, spoof_old_ip_value);\r\n      ctrl_thread_write_reg_block(ctrl_handle_make(CTRL_MachineID_Local, spoof->thread), regs_block);\r\n    }\r\n  }\r\n  \r\n  //- rjf: push ctrl events associated with this demon event\r\n  CTRL_EventList evts = {0};\r\n  ProfScope(\"push ctrl events associated with this demon event\") switch(event->kind)\r\n  {\r\n    default:{}break;\r\n    case DMN_EventKind_CreateProcess:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_NewProc;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->arch       = event->arch;\r\n      out_evt->entity_id  = event->code;\r\n      ctrl_state->process_counter += 1;\r\n    }break;\r\n    case DMN_EventKind_CreateThread:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_NewThread;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n      out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->arch       = event->arch;\r\n      out_evt->entity_id  = event->code;\r\n      out_evt->stack_base = dmn_stack_base_vaddr_from_thread(event->thread);\r\n      out_evt->tls_root   = dmn_tls_root_vaddr_from_thread(event->thread);\r\n      out_evt->rip_vaddr  = event->instruction_pointer;\r\n      out_evt->string     = event->string;\r\n    }break;\r\n    case DMN_EventKind_LoadModule:\r\n    {\r\n      CTRL_Handle process_handle = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module);\r\n      CTRL_Event *out_evt1 = ctrl_event_list_push(scratch.arena, &evts);\r\n      String8 module_path = path_normalized_from_string(scratch.arena, event->string);\r\n      U64 exe_timestamp = os_properties_from_file_path(module_path).modified;\r\n      ctrl_thread__module_open(process_handle, module_handle, r1u64(event->address, event->address+event->size), module_path, event->elf_phdr_vrange, event->elf_phdr_entsize);\r\n      out_evt1->kind       = CTRL_EventKind_NewModule;\r\n      out_evt1->msg_id     = msg->msg_id;\r\n      out_evt1->entity     = module_handle;\r\n      out_evt1->parent     = process_handle;\r\n      out_evt1->arch       = event->arch;\r\n      out_evt1->entity_id  = event->code;\r\n      out_evt1->vaddr_rng  = r1u64(event->address, event->address+event->size);\r\n      out_evt1->rip_vaddr  = event->address;\r\n      out_evt1->timestamp  = exe_timestamp;\r\n      out_evt1->string     = module_path;\r\n      CTRL_Event *out_evt2 = ctrl_event_list_push(scratch.arena, &evts);\r\n      String8 initial_debug_info_path = ctrl_initial_debug_info_path_from_module(scratch.arena, module_handle);\r\n      U64 debug_info_timestamp = os_properties_from_file_path(initial_debug_info_path).modified;\r\n      out_evt2->kind       = CTRL_EventKind_ModuleDebugInfoPathChange;\r\n      out_evt2->msg_id     = msg->msg_id;\r\n      out_evt2->entity     = module_handle;\r\n      out_evt2->parent     = process_handle;\r\n      out_evt2->timestamp  = debug_info_timestamp;\r\n      out_evt2->string     = initial_debug_info_path;\r\n      DI_Key initial_dbgi_key = di_key_from_path_timestamp(initial_debug_info_path, debug_info_timestamp);\r\n      di_open(initial_dbgi_key);\r\n    }break;\r\n    case DMN_EventKind_ExitProcess:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_EndProc;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->u64_code   = event->code;\r\n      ctrl_state->process_counter -= 1;\r\n    }break;\r\n    case DMN_EventKind_ExitThread:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_EndThread;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n      out_evt->entity_id  = event->code;\r\n    }break;\r\n    case DMN_EventKind_UnloadModule:\r\n    ProfScope(\"unload module %.*s\", str8_varg(event->string))\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      CTRL_Handle module_handle = ctrl_handle_make(CTRL_MachineID_Local, event->module);\r\n      CTRL_Entity *module_ent = ctrl_entity_from_handle(entity_ctx, module_handle);\r\n      CTRL_Entity *process_ent = ctrl_process_from_entity(module_ent);\r\n      String8 module_path = event->string;\r\n      ctrl_thread__module_close(process_ent->handle, module_handle, module_ent->vaddr_range);\r\n      out_evt->kind       = CTRL_EventKind_EndModule;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = module_handle;\r\n      out_evt->string     = module_path;\r\n      DI_Key dbgi_key = ctrl_dbgi_key_from_module(module_ent);\r\n      di_close(dbgi_key, 0);\r\n    }break;\r\n    case DMN_EventKind_DebugString:\r\n    {\r\n      U64 num_strings = (event->string.size + ctrl_state->c2u_ring_max_string_size-1) / ctrl_state->c2u_ring_max_string_size;\r\n      for(U64 string_idx = 0; string_idx < num_strings; string_idx += 1)\r\n      {\r\n        CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n        out_evt->kind       = CTRL_EventKind_DebugString;\r\n        out_evt->msg_id     = msg->msg_id;\r\n        out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n        out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n        out_evt->string     = str8_substr(event->string, r1u64(string_idx*ctrl_state->c2u_ring_max_string_size, (string_idx+1)*ctrl_state->c2u_ring_max_string_size));\r\n      }\r\n    }break;\r\n    case DMN_EventKind_SetThreadName:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_ThreadName;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n      out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->string     = event->string;\r\n      out_evt->entity_id  = event->code;\r\n    }break;\r\n    case DMN_EventKind_SetThreadColor:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_ThreadColor;\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n      out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->entity_id  = event->code;\r\n      out_evt->rgba       = event->user_data;\r\n    }break;\r\n    case DMN_EventKind_SetVAddrRangeNote:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_SetVAddrRangeNote;\r\n      out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->msg_id     = msg->msg_id;\r\n      out_evt->vaddr_rng  = r1u64(event->address, event->address + event->size);\r\n      out_evt->string     = event->string;\r\n    }break;\r\n    case DMN_EventKind_SetBreakpoint:\r\n    {\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_SetBreakpoint;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n      out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->vaddr_rng  = r1u64(event->address, event->address+event->size);\r\n      out_evt->bp_flags   = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags);\r\n    }break;\r\n    case DMN_EventKind_UnsetBreakpoint:\r\n    {\r\n      // TODO(rjf): this needs to be reflected in the resolved trap list too!!!!!!!!\r\n      CTRL_Event *out_evt = ctrl_event_list_push(scratch.arena, &evts);\r\n      out_evt->kind       = CTRL_EventKind_UnsetBreakpoint;\r\n      out_evt->entity     = ctrl_handle_make(CTRL_MachineID_Local, event->thread);\r\n      out_evt->parent     = ctrl_handle_make(CTRL_MachineID_Local, event->process);\r\n      out_evt->vaddr_rng  = r1u64(event->address, event->address+event->size);\r\n      out_evt->bp_flags   = ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags);\r\n    }break;\r\n  }\r\n  ctrl_c2u_push_events(&evts);\r\n  \r\n  //- rjf: if this is the first process in a session, clear the debug directory\r\n  // cache state\r\n  if(ctrl_state->process_counter == 1 && event->kind == DMN_EventKind_CreateProcess)\r\n  {\r\n    arena_clear(ctrl_state->dbg_dir_arena);\r\n    ctrl_state->dbg_dir_root = push_array(ctrl_state->dbg_dir_arena, CTRL_DbgDirNode, 1);\r\n  }\r\n  \r\n  //- rjf: out of queued up demon events -> clear event arena\r\n  if(ctrl_state->first_dmn_event_node == 0)\r\n  {\r\n    ctrl_state->free_dmn_event_node = 0;\r\n    arena_clear(ctrl_state->dmn_event_arena);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return(event);\r\n}\r\n\r\n//- rjf: eval helpers\r\n\r\ninternal U64\r\nctrl_eval_space_gen(E_Space space)\r\n{\r\n  U64 result = 0;\r\n  switch(space.kind)\r\n  {\r\n    default:{}break;\r\n    case CTRL_EvalSpaceKind_Entity:\r\n    {\r\n      result = ctrl_mem_gen();\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nctrl_eval_space_read(E_Space space, void *out, Rng1U64 range)\r\n{\r\n  B32 result = 0;\r\n  switch(space.kind)\r\n  {\r\n    default:{}break;\r\n    \r\n    //- rjf: intra-entity reads (process memory or thread registers)\r\n    case CTRL_EvalSpaceKind_Entity:\r\n    {\r\n      CTRL_Entity *entity = (CTRL_Entity *)space.u64_0;\r\n      switch(entity->kind)\r\n      {\r\n        default:{}break;\r\n        case CTRL_EntityKind_Process:\r\n        {\r\n          U64 read_size = dmn_process_read(entity->handle.dmn_handle, range, out);\r\n          result = (read_size == dim_1u64(range));\r\n        }break;\r\n        case CTRL_EntityKind_Thread:\r\n        {\r\n          Temp scratch = scratch_begin(0, 0);\r\n          CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n          U64 regs_size = regs_block_size_from_arch(entity->arch);\r\n          void *regs = ctrl_reg_block_from_thread(scratch.arena, entity_ctx, entity->handle);\r\n          Rng1U64 legal_range = r1u64(0, regs_size);\r\n          Rng1U64 read_range = intersect_1u64(legal_range, range);\r\n          U64 read_size = dim_1u64(read_range);\r\n          MemoryCopy(out, (U8 *)regs + read_range.min, read_size);\r\n          result = (read_size == dim_1u64(range));\r\n          scratch_end(scratch);\r\n        }break;\r\n      }\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: control thread eval scopes\r\n\r\ninternal CTRL_EvalScope *\r\nctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread)\r\n{\r\n  ProfBeginFunction();\r\n  CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n  CTRL_EvalScope *scope = push_array(arena, CTRL_EvalScope, 1);\r\n  scope->access = access_open();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack thread\r\n  //\r\n  Arch arch = thread->arch;\r\n  U64 thread_rip_vaddr = dmn_rip_from_thread(thread->handle.dmn_handle);\r\n  CTRL_Entity *process = ctrl_process_from_entity(thread);\r\n  CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr);\r\n  U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather evaluation debug infos & modules\r\n  //\r\n  U64 eval_modules_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]);\r\n  E_Module *eval_modules = push_array(arena, E_Module, eval_modules_count);\r\n  E_Module *eval_modules_primary = &eval_modules[0];\r\n  eval_modules_primary->vaddr_range = r1u64(0, max_U64);\r\n  U64 eval_dbg_infos_count = Max(1, entity_ctx->entity_kind_counts[CTRL_EntityKind_Module]);\r\n  E_DbgInfo *eval_dbg_infos = push_array(arena, E_DbgInfo, eval_dbg_infos_count);\r\n  E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0];\r\n  MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil);\r\n  {\r\n    U64 eval_module_idx = 0;\r\n    U64 eval_dbg_info_idx = 0;\r\n    for(CTRL_Entity *machine = entity_ctx->root->first;\r\n        machine != &ctrl_entity_nil;\r\n        machine = machine->next)\r\n    {\r\n      if(machine->kind != CTRL_EntityKind_Machine) { continue; }\r\n      for(CTRL_Entity *process = machine->first;\r\n          process != &ctrl_entity_nil;\r\n          process = process->next)\r\n      {\r\n        if(process->kind != CTRL_EntityKind_Process) { continue; }\r\n        for(CTRL_Entity *mod = process->first;\r\n            mod != &ctrl_entity_nil;\r\n            mod = mod->next)\r\n        {\r\n          if(mod->kind != CTRL_EntityKind_Module) { continue; }\r\n          DI_Key dbgi_key = ctrl_dbgi_key_from_module(mod);\r\n          \r\n          //- rjf: try to obtain this module's RDI\r\n          RDI_Parsed *rdi = di_rdi_from_key(scope->access, dbgi_key, 0, 0);\r\n          \r\n          //- rjf: if this RDI is not yet ready => determine if we need to wait for it\r\n          //\r\n          // (we *always* wait for the initial module)\r\n          //\r\n          B32 rdi_is_necessary = 1;\r\n          if(user_bps->count == 0)\r\n          {\r\n            rdi_is_necessary = 0;\r\n          }\r\n          else if(rdi == &rdi_parsed_nil) ProfScope(\"determine if RDI is necessary\")\r\n          {\r\n            // rjf: find cached result\r\n            U64 hash = ctrl_hash_from_handle(mod->handle);\r\n            U64 slot_idx = hash%ctrl_state->module_req_cache_slots_count;\r\n            CTRL_ModuleReqCacheNode *slot = ctrl_state->module_req_cache_slots[slot_idx];\r\n            CTRL_ModuleReqCacheNode *node = 0;\r\n            for(CTRL_ModuleReqCacheNode *n = slot; n != 0; n = n->next)\r\n            {\r\n              if(ctrl_handle_match(n->module, mod->handle))\r\n              {\r\n                node = n;\r\n                break;\r\n              }\r\n            }\r\n            \r\n            // rjf: cached? -> take cached result\r\n            if(node != 0)\r\n            {\r\n              rdi_is_necessary = node->required;\r\n            }\r\n            \r\n            // rjf: not cached -> compute & store\r\n            else ProfScope(\"cache miss\")\r\n            {\r\n              CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(mod, CTRL_EntityKind_DebugInfoPath);\r\n              OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, debug_info_path->string);\r\n              ProfScope(\"determine if %.*s is necessary\", str8_varg(debug_info_path->string))\r\n              {\r\n                //- rjf: determine if file is PDB\r\n                B32 file_is_pdb = 0;\r\n                if(!file_is_pdb)\r\n                {\r\n                  U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0};\r\n                  os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe);\r\n                  if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe)))\r\n                  {\r\n                    file_is_pdb = 1;\r\n                  }\r\n                }\r\n                if(!file_is_pdb)\r\n                {\r\n                  U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0};\r\n                  os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe);\r\n                  if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe)))\r\n                  {\r\n                    file_is_pdb = 1;\r\n                  }\r\n                }\r\n                \r\n                //- rjf: file is PDB -> do thin parse & lookup of all breakpoint files/symbols.\r\n                // if any are found in the PDB, then this RDI is necessary.\r\n                if(file_is_pdb)\r\n                {\r\n                  FileProperties props = os_properties_from_file(file);\r\n                  OS_Handle map = os_file_map_open(OS_AccessFlag_Read, file);\r\n                  void *file_base = os_file_map_view_open(map, OS_AccessFlag_Read, r1u64(0, props.size));\r\n                  String8 file_data = str8(file_base, props.size);\r\n                  {\r\n                    rdi_is_necessary = pdb_has_symbol_or_file_ref(file_data, ctrl_state->msg_user_bp_touched_symbols, ctrl_state->msg_user_bp_touched_files);\r\n                  }\r\n                  os_file_map_view_close(map, file_base, r1u64(0, props.size));\r\n                  os_file_map_close(map);\r\n                }\r\n              }\r\n              os_file_close(file);\r\n              node = push_array(ctrl_state->ctrl_thread_msg_process_arena, CTRL_ModuleReqCacheNode, 1);\r\n              node->next = slot;\r\n              ctrl_state->module_req_cache_slots[slot_idx] = node;\r\n              node->module = mod->handle;\r\n              node->required = rdi_is_necessary;\r\n            }\r\n          }\r\n          \r\n          //- rjf: if this RDI is necessary, but we do not have it => wait for it forever\r\n          if(rdi == &rdi_parsed_nil && rdi_is_necessary) ProfScope(\"RDI is necessary -> wait\")\r\n          {\r\n            rdi = di_rdi_from_key(scope->access, dbgi_key, 1, max_U64);\r\n          }\r\n          \r\n          //- rjf: fill debug info\r\n          eval_dbg_infos[eval_dbg_info_idx].dbgi_key = dbgi_key;\r\n          eval_dbg_infos[eval_dbg_info_idx].rdi      = rdi;\r\n          if(mod == module)\r\n          {\r\n            eval_dbg_infos_primary = &eval_dbg_infos[eval_dbg_info_idx];\r\n          }\r\n          eval_dbg_info_idx += 1;\r\n          \r\n          //- rjf: fill evaluation module info\r\n          eval_modules[eval_module_idx].arch        = arch;\r\n          eval_modules[eval_module_idx].dbg_info_num= (U32)eval_dbg_info_idx;\r\n          eval_modules[eval_module_idx].vaddr_range = mod->vaddr_range;\r\n          eval_modules[eval_module_idx].space       = e_space_make(CTRL_EvalSpaceKind_Entity);\r\n          eval_modules[eval_module_idx].space.u64_0 = (U64)process;\r\n          if(mod == module)\r\n          {\r\n            eval_modules_primary = &eval_modules[eval_module_idx];\r\n          }\r\n          eval_module_idx += 1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: select evaluation cache\r\n  //\r\n  e_select_cache(ctrl_state->ctrl_thread_eval_cache);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build base evaluation context\r\n  //\r\n  {\r\n    E_BaseCtx *ctx = &scope->base_ctx;\r\n    \r\n    //- rjf: fill instruction pointer info\r\n    ctx->thread_ip_vaddr     = thread_rip_vaddr;\r\n    ctx->thread_ip_voff      = thread_rip_voff;\r\n    ctx->thread_arch         = thread->arch;\r\n    ctx->thread_reg_space = e_space_make(CTRL_EvalSpaceKind_Entity);\r\n    ctx->thread_reg_space.u64_0 = (U64)thread;\r\n    \r\n    //- rjf: fill debug infos\r\n    ctx->dbg_infos        = eval_dbg_infos;\r\n    ctx->dbg_infos_count  = eval_dbg_infos_count;\r\n    ctx->primary_dbg_info = eval_dbg_infos_primary;\r\n    \r\n    //- rjf: fill modules\r\n    ctx->modules        = eval_modules;\r\n    ctx->modules_count  = eval_modules_count;\r\n    ctx->primary_module = eval_modules_primary;\r\n    \r\n    //- rjf: fill space hooks\r\n    ctx->space_gen   = ctrl_eval_space_gen;\r\n    ctx->space_read  = ctrl_eval_space_read;\r\n  }\r\n  e_select_base_ctx(&scope->base_ctx);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build IR evaluation context\r\n  //\r\n  {\r\n    E_IRCtx *ctx = &scope->ir_ctx;\r\n    ctx->regs_map      = ctrl_string2reg_from_arch(arch);\r\n    ctx->reg_alias_map = ctrl_string2alias_from_arch(arch);\r\n    ctx->locals_map    = e_push_locals_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff);\r\n    ctx->member_map    = e_push_member_map_from_rdi_voff(arena, eval_dbg_infos_primary->rdi, thread_rip_voff);\r\n    ctx->macro_map     = push_array(arena, E_String2ExprMap, 1);\r\n    ctx->macro_map[0]  = e_string2expr_map_make(arena, 512);\r\n    ctx->auto_hook_map = push_array(arena, E_AutoHookMap, 1);\r\n    ctx->auto_hook_map[0] = e_auto_hook_map_make(arena, 512);\r\n  }\r\n  e_select_ir_ctx(&scope->ir_ctx);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build eval interpretation context\r\n  //\r\n  {\r\n    E_InterpretCtx *ctx = &scope->interpret_ctx;\r\n    ctx->primary_space = eval_modules_primary->space;\r\n    ctx->reg_arch      = eval_modules_primary->arch;\r\n    ctx->reg_space     = e_space_make(CTRL_EvalSpaceKind_Entity);\r\n    ctx->reg_space.u64_0 = (U64)thread;\r\n    ctx->module_base   = push_array(arena, U64, 1);\r\n    ctx->module_base[0]= module->vaddr_range.min;\r\n    ctx->frame_base    = push_array(arena, U64, 1);\r\n    // TODO(rjf): need to compute this out here somehow... ctx->frame_base[0] = ;\r\n    ctx->tls_base      = push_array(arena, U64, 1);\r\n  }\r\n  e_select_interpret_ctx(&scope->interpret_ctx, eval_dbg_infos_primary->rdi, thread_rip_voff);\r\n  \r\n  ProfEnd();\r\n  return scope;\r\n}\r\n\r\ninternal void\r\nctrl_thread__eval_scope_end(CTRL_EvalScope *scope)\r\n{\r\n  access_close(scope->access);\r\n}\r\n\r\n//- rjf: log flusher\r\n\r\ninternal void\r\nctrl_thread__end_and_flush_log(void)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  LogScopeResult log = log_scope_end(scratch.arena);\r\n  os_append_data_to_file_path(ctrl_state->ctrl_thread_log_path, log.strings[LogMsgKind_Info]);\r\n  if(log.strings[LogMsgKind_UserError].size != 0)\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *evt = ctrl_event_list_push(scratch.arena, &evts);\r\n    evt->kind       = CTRL_EventKind_Error;\r\n    evt->string     = log.strings[LogMsgKind_UserError];\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\n//- rjf: msg kind implementations\r\n\r\ninternal void\r\nctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: produce full stdout/stderr/stdin paths\r\n  String8 stdout_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stdout_path, msg->path);\r\n  String8 stdin_path  = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stdin_path, msg->path);\r\n  String8 stderr_path = path_absolute_dst_from_relative_dst_src(scratch.arena, msg->stderr_path, msg->path);\r\n  \r\n  //- rjf: obtain stdout/stderr/stdin handles\r\n  OS_Handle stdout_handle = {0};\r\n  OS_Handle stderr_handle = {0};\r\n  OS_Handle stdin_handle  = {0};\r\n  if(stdout_path.size != 0)\r\n  {\r\n    OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path);\r\n    os_file_close(f);\r\n    stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stdout_path);\r\n  }\r\n  if(stderr_path.size != 0)\r\n  {\r\n    OS_Handle f = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stderr_path);\r\n    os_file_close(f);\r\n    stderr_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, msg->stderr_path);\r\n  }\r\n  if(stdin_path.size != 0)\r\n  {\r\n    stdin_handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdin_path);\r\n  }\r\n  \r\n  //- rjf: launch\r\n  OS_ProcessLaunchParams params = {0};\r\n  {\r\n    params.cmd_line           = msg->cmd_line_string_list;\r\n    params.path               = msg->path;\r\n    params.env                = msg->env_string_list;\r\n    params.inherit_env        = msg->env_inherit;\r\n    params.debug_subprocesses = msg->debug_subprocesses;\r\n    params.stdout_file        = stdout_handle;\r\n    params.stderr_file        = stderr_handle;\r\n    params.stdin_file         = stdin_handle;\r\n  }\r\n  U32 id = dmn_ctrl_launch(ctrl_ctx, &params);\r\n  \r\n  //- rjf: close stdout/stderr/stdin files\r\n  os_file_close(stdout_handle);\r\n  os_file_close(stderr_handle);\r\n  os_file_close(stdin_handle);\r\n  \r\n  //- rjf: record (id -> entry points), so that we know custom entry points for this PID\r\n  CTRL_EntityCtxRWStore *entity_ctx_rw_store = ctrl_state->ctrl_thread_entity_store;\r\n  MutexScopeW(ctrl_state->ctrl_thread_entity_ctx_rw_mutex)\r\n  {\r\n    for(String8Node *n = msg->entry_points.first; n != 0; n = n->next)\r\n    {\r\n      String8 string = n->string;\r\n      CTRL_Entity *entry = ctrl_entity_alloc(entity_ctx_rw_store, entity_ctx_rw_store->ctx.root, CTRL_EntityKind_EntryPoint, Arch_Null, ctrl_handle_zero(), (U64)id);\r\n      ctrl_entity_equip_string(entity_ctx_rw_store, entry, string);\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: attach\r\n  B32 attach_successful = dmn_ctrl_attach(ctrl_ctx, msg->entity_id);\r\n  \r\n  //- rjf: run to handshake\r\n  if(attach_successful)\r\n  {\r\n    DMN_Handle unfrozen_process = {0};\r\n    DMN_RunCtrls run_ctrls = {0};\r\n    run_ctrls.run_entities_are_unfrozen = 1;\r\n    run_ctrls.run_entities_are_processes = 1;\r\n    for(B32 done = 0; done == 0;)\r\n    {\r\n      DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0);\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        case DMN_EventKind_CreateProcess:\r\n        {\r\n          unfrozen_process = event->process;\r\n          run_ctrls.run_entities = &unfrozen_process;\r\n          run_ctrls.run_entity_count = 1;\r\n        }break;\r\n        case DMN_EventKind_Halt:\r\n        case DMN_EventKind_Exception:\r\n        case DMN_EventKind_Error:\r\n        case DMN_EventKind_HandshakeComplete:\r\n        {\r\n          done = 1;\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: record stop\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind       = CTRL_EventKind_Stopped;\r\n    event->cause      = CTRL_EventCause_Finished;\r\n    event->msg_id     = msg->msg_id;\r\n    event->entity_id = !!attach_successful * msg->entity_id;\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DMN_Handle process = msg->entity.dmn_handle;\r\n  U32 exit_code = msg->exit_code;\r\n  \r\n  //- rjf: send kill\r\n  B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, process, exit_code);\r\n  \r\n  //- rjf: wait for process to be dead\r\n  CTRL_EventCause cause = CTRL_EventCause_Finished;\r\n  if(kill_worked)\r\n  {\r\n    DMN_RunCtrls run_ctrls = {0};\r\n    run_ctrls.run_entities_are_unfrozen = 1;\r\n    run_ctrls.run_entities_are_processes = 1;\r\n    run_ctrls.run_entities = &process;\r\n    run_ctrls.run_entity_count = 1;\r\n    for(B32 done = 0; done == 0;)\r\n    {\r\n      DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0);\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        case DMN_EventKind_ExitProcess:\r\n        if(dmn_handle_match(event->process, process))\r\n        {\r\n          done = 1;\r\n        }break;\r\n        case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break;\r\n        case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: record stop\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind       = CTRL_EventKind_Stopped;\r\n    event->cause      = cause;\r\n    event->msg_id     = msg->msg_id;\r\n    if(kill_worked)\r\n    {\r\n      event->entity = msg->entity;\r\n    }\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U32 exit_code = msg->exit_code;\r\n  CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n  \r\n  //- rjf: gather all currently existing processes\r\n  CTRL_EntityArray initial_processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process);\r\n  typedef struct Task Task;\r\n  struct Task\r\n  {\r\n    Task *next;\r\n    Task *prev;\r\n    CTRL_Entity *process;\r\n  };\r\n  Task *first_task = 0;\r\n  Task *last_task = 0;\r\n  for EachIndex(idx, initial_processes.count)\r\n  {\r\n    CTRL_Entity *entity = initial_processes.v[idx];\r\n    Task *t = push_array(scratch.arena, Task, 1);\r\n    t->process = entity;\r\n    DLLPushBack(first_task, last_task, t);\r\n  }\r\n  \r\n  //- rjf: kill processes as needed, wait for all processes to be dead\r\n  CTRL_EventCause cause = CTRL_EventCause_Finished;\r\n  if(first_task != 0)\r\n  {\r\n    DMN_RunCtrls run_ctrls = {0};\r\n    for(B32 done = 0; !done;)\r\n    {\r\n      // rjf: kill remaining processes\r\n      for(Task *t = first_task, *next = 0; t != 0; t = next)\r\n      {\r\n        next = t->next;\r\n        B32 kill_worked = dmn_ctrl_kill(ctrl_ctx, t->process->handle.dmn_handle, exit_code);\r\n        if(kill_worked)\r\n        {\r\n          DLLRemove(first_task, last_task, t);\r\n        }\r\n      }\r\n      \r\n      // rjf: get next event\r\n      DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0);\r\n      \r\n      // rjf: process event\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        case DMN_EventKind_CreateProcess:\r\n        {\r\n          CTRL_Entity *new_process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process));\r\n          Task *t = push_array(scratch.arena, Task, 1);\r\n          t->process = new_process;\r\n          DLLPushBack(first_task, last_task, t);\r\n        }break;\r\n        case DMN_EventKind_Error:{done = 1; cause = CTRL_EventCause_Error;}break;\r\n        case DMN_EventKind_Halt: {done = 1; cause = CTRL_EventCause_InterruptedByHalt;}break;\r\n      }\r\n      \r\n      // rjf: end if all processes are gone\r\n      CTRL_EntityArray processes = ctrl_entity_array_from_kind(entity_ctx, CTRL_EntityKind_Process);\r\n      if(processes.count == 0)\r\n      {\r\n        done = 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: record stop\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind       = CTRL_EventKind_Stopped;\r\n    event->cause      = cause;\r\n    event->msg_id     = msg->msg_id;\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DMN_Handle process = msg->entity.dmn_handle;\r\n  \r\n  //- rjf: detach\r\n  B32 detach_worked = dmn_ctrl_detach(ctrl_ctx, process);\r\n  \r\n  //- rjf: wait for process to be dead\r\n  if(detach_worked)\r\n  {\r\n    DMN_RunCtrls run_ctrls = {0};\r\n    run_ctrls.run_entities_are_unfrozen = 1;\r\n    run_ctrls.run_entities_are_processes = 1;\r\n    run_ctrls.run_entities = &process;\r\n    run_ctrls.run_entity_count = 1;\r\n    for(B32 done = 0; done == 0;)\r\n    {\r\n      DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0);\r\n      if(event->kind == DMN_EventKind_ExitProcess && dmn_handle_match(event->process, process))\r\n      {\r\n        done = 1;\r\n      }\r\n      if(event->kind == DMN_EventKind_Halt)\r\n      {\r\n        done = 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: record stop\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind       = CTRL_EventKind_Stopped;\r\n    event->cause      = CTRL_EventCause_Finished;\r\n    event->msg_id     = msg->msg_id;\r\n    if(detach_worked)\r\n    {\r\n      event->entity = msg->entity;\r\n    }\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DMN_Event *stop_event = 0;\r\n  CTRL_EventCause stop_cause = CTRL_EventCause_Null;\r\n  CTRL_EntityCtx *entity_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n  CTRL_Handle target_thread = msg->entity;\r\n  CTRL_Handle target_process = msg->parent;\r\n  CTRL_Entity *target_process_entity = ctrl_entity_from_handle(entity_ctx, target_process);\r\n  U64 spoof_ip_vaddr = 911;\r\n  log_infof(\"ctrl_thread__run:\\n{\\n\");\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather all initial breakpoints\r\n  //\r\n  DMN_TrapChunkList user_traps = {0};\r\n  {\r\n    CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, target_thread);\r\n    CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread);\r\n    for(CTRL_Entity *machine = entity_ctx->root->first;\r\n        machine != &ctrl_entity_nil;\r\n        machine = machine->next)\r\n    {\r\n      if(machine->kind != CTRL_EntityKind_Machine) { continue; }\r\n      for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next)\r\n      {\r\n        if(process->kind != CTRL_EntityKind_Process) { continue; }\r\n        \r\n        // rjf: resolve module-dependent user bps\r\n        for(CTRL_Entity *module = process->first; module != &ctrl_entity_nil; module = module->next)\r\n        {\r\n          if(module->kind != CTRL_EntityKind_Module) { continue; }\r\n          ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, process->handle, module->handle, &msg->user_bps, &user_traps);\r\n        }\r\n        \r\n        // rjf: push process-declared breakpoins\r\n        for(CTRL_Entity *bp = process->first; bp != &ctrl_entity_nil; bp = bp->next)\r\n        {\r\n          if(bp->kind != CTRL_EntityKind_Breakpoint) { continue; }\r\n          ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &user_traps);\r\n        }\r\n        \r\n        // rjf: push virtual-address user breakpoints per-process\r\n        ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, process->handle, &msg->user_bps, &user_traps);\r\n      }\r\n    }\r\n    ctrl_thread__eval_scope_end(eval_scope);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: read initial stack-pointer-check value\r\n  //\r\n  // This MUST happen before any threads move, including single-stepping stuck\r\n  // threads, because otherwise, their stack pointer may change, if single-stepping\r\n  // causes e.g. entrance into a function via a call instruction.\r\n  //\r\n  U64 sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle);\r\n  log_infof(\"sp_check_value := 0x%I64x\\n\", sp_check_value);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: single step \"stuck threads\"\r\n  //\r\n  // \"Stuck threads\" are threads that are already on a User BP and would hit\r\n  // it immediately if resumed with all User BPs enabled. To get them \"unstuck\"\r\n  // we just need to single step them to get them off their current instruction.\r\n  //\r\n  // This only applies to threads OTHER THAN the target thread. If the target\r\n  // thread is on a user breakpoint, then we need to let trap net logic run,\r\n  // which may include features put on a trap net trap at the same address as\r\n  // the user breakpoint.\r\n  //\r\n  B32 target_thread_is_on_user_bp_and_trap_net_trap = 0;\r\n  if(stop_event == 0)\r\n  {\r\n    // rjf: gather stuck threads\r\n    DMN_HandleList stuck_threads = {0};\r\n    for(CTRL_Entity *machine = entity_ctx->root->first;\r\n        machine != &ctrl_entity_nil;\r\n        machine = machine->next)\r\n    {\r\n      if(machine->kind != CTRL_EntityKind_Machine) { continue; }\r\n      for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next)\r\n      {\r\n        if(process->kind != CTRL_EntityKind_Process) { continue; }\r\n        for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next)\r\n        {\r\n          if(thread->kind != CTRL_EntityKind_Thread) { continue; }\r\n          U64 rip = dmn_rip_from_thread(thread->handle.dmn_handle);\r\n          \r\n          // rjf: determine if thread is frozen\r\n          B32 thread_is_frozen = thread->is_frozen;\r\n          \r\n          // rjf: not frozen? -> check if stuck & gather if so\r\n          if(!thread_is_frozen)\r\n          {\r\n            for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next)\r\n            {\r\n              B32 is_on_user_bp = 0;\r\n              for(DMN_Trap *trap_ptr = n->v; trap_ptr < n->v+n->count; trap_ptr += 1)\r\n              {\r\n                if(dmn_handle_match(trap_ptr->process, process->handle.dmn_handle) && trap_ptr->vaddr == rip)\r\n                {\r\n                  is_on_user_bp = 1;\r\n                }\r\n              }\r\n              \r\n              B32 is_on_net_trap = 0;\r\n              for(CTRL_TrapNode *n = msg->traps.first; n != 0; n = n->next)\r\n              {\r\n                if(n->v.vaddr == rip)\r\n                {\r\n                  is_on_net_trap = 1;\r\n                }\r\n              }\r\n              \r\n              if(is_on_user_bp && (!is_on_net_trap || !dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle)))\r\n              {\r\n                dmn_handle_list_push(scratch.arena, &stuck_threads, thread->handle.dmn_handle);\r\n              }\r\n              \r\n              if(is_on_user_bp && is_on_net_trap && dmn_handle_match(thread->handle.dmn_handle, target_thread.dmn_handle))\r\n              {\r\n                target_thread_is_on_user_bp_and_trap_net_trap = 1;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: actually step stuck threads\r\n    for(DMN_HandleNode *node = stuck_threads.first;\r\n        node != 0;\r\n        node = node->next)\r\n    {\r\n      DMN_Handle thread = node->v;\r\n      U64 thread_pre_rip = dmn_rip_from_thread(thread);\r\n      U64 thread_post_rip = thread_pre_rip;\r\n      for(B32 done = 0; !done;)\r\n      {\r\n        log_infof(\"single_step_stuck_thread([0x%I64x])\\n\", thread.u64[0]);\r\n        DMN_RunCtrls run_ctrls = {0};\r\n        run_ctrls.run_entities_are_unfrozen = 1;\r\n        run_ctrls.run_entities = &thread;\r\n        run_ctrls.run_entity_count = 1;\r\n        if(thread_post_rip == thread_pre_rip)\r\n        {\r\n          run_ctrls.single_step_thread = thread;\r\n        }\r\n        DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0);\r\n        thread_post_rip = dmn_rip_from_thread(thread);\r\n        switch(event->kind)\r\n        {\r\n          default:{}break;\r\n          case DMN_EventKind_ExitThread:\r\n          if(dmn_handle_match(event->thread, thread))\r\n          {\r\n            stop_cause = CTRL_EventCause_Error;\r\n            goto stop;\r\n          }break;\r\n          case DMN_EventKind_Error:      stop_cause = CTRL_EventCause_Error; goto stop;\r\n          case DMN_EventKind_Exception:  stop_cause = CTRL_EventCause_InterruptedByException; goto stop;\r\n          case DMN_EventKind_Trap:       stop_cause = CTRL_EventCause_InterruptedByTrap; goto stop;\r\n          case DMN_EventKind_Halt:       stop_cause = CTRL_EventCause_InterruptedByHalt; goto stop;\r\n          stop:;\r\n          {\r\n            stop_event = event;\r\n            done = 1;\r\n          }break;\r\n          case DMN_EventKind_SingleStep:\r\n          {\r\n            done = dmn_handle_match(node->v, event->thread);\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather frozen threads\r\n  //\r\n  CTRL_EntityList frozen_threads = {0};\r\n  for(CTRL_Entity *machine = entity_ctx->root->first;\r\n      machine != &ctrl_entity_nil;\r\n      machine = machine->next)\r\n  {\r\n    if(machine->kind != CTRL_EntityKind_Machine) { continue; }\r\n    for(CTRL_Entity *process = machine->first; process != &ctrl_entity_nil; process = process->next)\r\n    {\r\n      if(process->kind != CTRL_EntityKind_Process) { continue; }\r\n      for(CTRL_Entity *thread = process->first; thread != &ctrl_entity_nil; thread = thread->next)\r\n      {\r\n        if(thread->is_frozen)\r\n        {\r\n          ctrl_entity_list_push(scratch.arena, &frozen_threads, thread);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: resolve trap net\r\n  //\r\n  DMN_TrapChunkList trap_net_traps = {0};\r\n  for(CTRL_TrapNode *node = msg->traps.first;\r\n      node != 0;\r\n      node = node->next)\r\n  {\r\n    DMN_Trap trap = {target_process.dmn_handle, node->v.vaddr};\r\n    dmn_trap_chunk_list_push(scratch.arena, &trap_net_traps, 256, &trap);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: join user breakpoints and trap net traps\r\n  //\r\n  DMN_TrapChunkList joined_traps = {0};\r\n  {\r\n    dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &user_traps);\r\n    dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &trap_net_traps);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: record start\r\n  //\r\n  if(stop_event == 0)\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind = CTRL_EventKind_Started;\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: run loop\r\n  //\r\n  if(stop_event == 0)\r\n  {\r\n    B32 spoof_mode = 0;\r\n    CTRL_Spoof spoof = {0};\r\n    DMN_TrapChunkList entry_traps = {0};\r\n    for(U64 run_loop_idx = 0;; run_loop_idx += 1)\r\n    {\r\n      //////////////////////////\r\n      //- rjf: choose low level traps\r\n      //\r\n      DMN_TrapChunkList *trap_list = &joined_traps;\r\n      if(spoof_mode)\r\n      {\r\n        trap_list = &user_traps;\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: choose spoof\r\n      //\r\n      CTRL_Spoof *run_spoof = 0;\r\n      if(spoof_mode)\r\n      {\r\n        run_spoof = &spoof;\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: setup run controls\r\n      //\r\n      DMN_RunCtrls run_ctrls = {0};\r\n      if(run_loop_idx == 0)\r\n      {\r\n        run_ctrls.priority_thread = target_thread.dmn_handle;\r\n      }\r\n      run_ctrls.ignore_previous_exception = 1;\r\n      run_ctrls.run_entity_count = frozen_threads.count;\r\n      run_ctrls.run_entities     = push_array(scratch.arena, DMN_Handle, run_ctrls.run_entity_count);\r\n      run_ctrls.run_entities_are_unfrozen = 0;\r\n      {\r\n        U64 idx = 0;\r\n        for(CTRL_EntityNode *n = frozen_threads.first; n != 0; n = n->next)\r\n        {\r\n          run_ctrls.run_entities[idx] = n->v->handle.dmn_handle;\r\n          idx += 1;\r\n        }\r\n      }\r\n      run_ctrls.traps = *trap_list;\r\n      \r\n      //////////////////////////\r\n      //- rjf: get next run-related event\r\n      //\r\n      log_infof(\"get_next_event:\\n{\\n\");\r\n      DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, run_spoof);\r\n      log_infof(\"}\\n\\n\");\r\n      \r\n      //////////////////////////\r\n      //- rjf: determine event handling\r\n      //\r\n      B32 launch_done_first_module = 0;\r\n      B32 hard_stop = 0;\r\n      CTRL_EventCause hard_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n      B32 use_stepping_logic = 0;\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        case DMN_EventKind_Error:\r\n        case DMN_EventKind_Halt:\r\n        case DMN_EventKind_SingleStep:\r\n        case DMN_EventKind_Trap:\r\n        {\r\n          hard_stop = 1;\r\n          log_infof(\"step_rule: unexpected -> hard_stop\\n\");\r\n        }break;\r\n        case DMN_EventKind_Exception:\r\n        case DMN_EventKind_Breakpoint:\r\n        {\r\n          use_stepping_logic = 1;\r\n          log_infof(\"step_rule: exception/breakpoint -> stepping_logic\\n\");\r\n        }break;\r\n        case DMN_EventKind_CreateProcess:\r\n        {\r\n          CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, &ctrl_entity_nil);\r\n          {\r\n            DMN_TrapChunkList new_traps = {0};\r\n            ctrl_thread__append_resolved_process_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), &msg->user_bps, &new_traps);\r\n            log_infof(\"step_rule: create_process -> resolve traps\\n\");\r\n            log_infof(\"new_traps:\\n{\\n\");\r\n            for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next)\r\n            {\r\n              for(U64 idx = 0; idx < n->count; idx += 1)\r\n              {\r\n                DMN_Trap *trap = &n->v[idx];\r\n                log_infof(\"{process:[0x%I64x], vaddr:0x%I64x}\\n\", trap->process.u64[0], trap->vaddr);\r\n              }\r\n            }\r\n            log_infof(\"}\\n\\n\");\r\n            dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps);\r\n            dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps);\r\n          }\r\n          ctrl_thread__eval_scope_end(eval_scope);\r\n        }break;\r\n        case DMN_EventKind_LoadModule:\r\n        {\r\n          CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread));\r\n          CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(scratch.arena, &msg->user_bps, thread);\r\n          {\r\n            DMN_TrapChunkList new_traps = {0};\r\n            ctrl_thread__append_resolved_module_user_bp_traps(scratch.arena, eval_scope, ctrl_handle_make(CTRL_MachineID_Local, event->process), ctrl_handle_make(CTRL_MachineID_Local, event->module), &msg->user_bps, &new_traps);\r\n            log_infof(\"step_rule: load_module -> resolve traps\\n\");\r\n            log_infof(\"new_traps:\\n{\\n\");\r\n            for(DMN_TrapChunkNode *n = new_traps.first; n != 0; n = n->next)\r\n            {\r\n              for(U64 idx = 0; idx < n->count; idx += 1)\r\n              {\r\n                DMN_Trap *trap = &n->v[idx];\r\n                log_infof(\"{process:[0x%I64x], vaddr:0x%I64x}\\n\", trap->process.u64[0], trap->vaddr);\r\n              }\r\n            }\r\n            log_infof(\"}\\n\\n\");\r\n            dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps);\r\n            dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps);\r\n          }\r\n          ctrl_thread__eval_scope_end(eval_scope);\r\n        }break;\r\n        case DMN_EventKind_SetBreakpoint:\r\n        {\r\n          CTRL_Entity *bp = &ctrl_entity_nil;\r\n          {\r\n            CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process));\r\n            for(CTRL_Entity *child = process->first; child != &ctrl_entity_nil; child = child->next)\r\n            {\r\n              if(child->kind == CTRL_EntityKind_Breakpoint &&\r\n                 child->vaddr_range.min == event->address &&\r\n                 child->vaddr_range.max == event->address + event->size &&\r\n                 child->bp_flags == ctrl_user_breakpoint_flags_from_dmn_trap_flags(event->flags))\r\n              {\r\n                bp = child;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          if(bp != &ctrl_entity_nil)\r\n          {\r\n            DMN_TrapChunkList new_traps = {0};\r\n            ctrl_thread__append_program_defined_bp_traps(scratch.arena, bp, &new_traps);\r\n            dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &new_traps);\r\n            dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &user_traps, &new_traps);\r\n          }\r\n        }break;\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: on launches, detect entry points, place traps\r\n      //\r\n      if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && !launch_done_first_module && event->kind == DMN_EventKind_HandshakeComplete)\r\n      {\r\n        launch_done_first_module = 1;\r\n        Access *access = access_open();\r\n        \r\n        //- rjf: unpack process/module info\r\n        CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process));\r\n        CTRL_Entity *module = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Module);\r\n        U64 module_base_vaddr = module->vaddr_range.min;\r\n        DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n        RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, max_U64);\r\n        RDI_NameMap *unparsed_map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures);\r\n        RDI_ParsedNameMap map = {0};\r\n        rdi_parsed_from_name_map(rdi, unparsed_map, &map);\r\n        \r\n        //- rjf: add traps for user-specified entry points on this message, if specified\r\n        B32 entries_found = 0;\r\n        if(!entries_found)\r\n        {\r\n          for(String8Node *n = msg->entry_points.first; n != 0; n = n->next)\r\n          {\r\n            U32 procedure_id = 0;\r\n            {\r\n              String8 name = n->string;\r\n              RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n              U32 id_count = 0;\r\n              U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n              if(id_count > 0)\r\n              {\r\n                procedure_id = ids[0];\r\n              }\r\n            }\r\n            RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id);\r\n            U64 voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n            if(voff != 0)\r\n            {\r\n              entries_found = 1;\r\n              DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n              dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: add traps for module-baked entry points, if specified\r\n        if(!entries_found)\r\n        {\r\n          String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle);\r\n          U8 split_char = 0;\r\n          String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0);\r\n          for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next)\r\n          {\r\n            String8 text = text_n->string;\r\n            MD_Node *root = md_tree_from_string(scratch.arena, text);\r\n            if(str8_match(root->first->string, str8_lit(\"entry_point\"), 0))\r\n            {\r\n              String8 name = root->first->first->string;\r\n              U32 procedure_id = 0;\r\n              {\r\n                RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n                U32 id_count = 0;\r\n                U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n                if(id_count > 0)\r\n                {\r\n                  procedure_id = ids[0];\r\n                }\r\n              }\r\n              RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id);\r\n              U64 voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n              if(voff != 0)\r\n              {\r\n                entries_found = 1;\r\n                DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n                dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: add traps for PID-correllated entry points\r\n        if(!entries_found)\r\n        {\r\n          for(CTRL_Entity *e = entity_ctx->root->first; e != &ctrl_entity_nil; e = e->next)\r\n          {\r\n            if(e->id == process->id)\r\n            {\r\n              U32 procedure_id = 0;\r\n              {\r\n                String8 name = e->string;\r\n                RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n                U32 id_count = 0;\r\n                U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n                if(id_count > 0)\r\n                {\r\n                  procedure_id = ids[0];\r\n                }\r\n              }\r\n              RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id);\r\n              U64 voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n              if(voff != 0)\r\n              {\r\n                entries_found = 1;\r\n                DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n                dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: add traps for all custom user entry points\r\n        if(!entries_found)\r\n        {\r\n          for(String8Node *n = ctrl_state->user_entry_points.first; n != 0; n = n->next)\r\n          {\r\n            U32 procedure_id = 0;\r\n            {\r\n              String8 name = n->string;\r\n              RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n              U32 id_count = 0;\r\n              U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n              if(id_count > 0)\r\n              {\r\n                procedure_id = ids[0];\r\n              }\r\n            }\r\n            RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id);\r\n            U64 voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n            if(voff != 0)\r\n            {\r\n              DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n              dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: add traps for all high-level entry points\r\n        if(!entries_found)\r\n        {\r\n          String8 hi_entry_points[] =\r\n          {\r\n            str8_lit(\"WinMain\"),\r\n            str8_lit(\"wWinMain\"),\r\n            str8_lit(\"main\"),\r\n            str8_lit(\"wmain\"),\r\n          };\r\n          for(U64 idx = 0; idx < ArrayCount(hi_entry_points); idx += 1)\r\n          {\r\n            U32 procedure_id = 0;\r\n            {\r\n              String8 name = hi_entry_points[idx];\r\n              RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n              U32 id_count = 0;\r\n              U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n              if(id_count > 0)\r\n              {\r\n                procedure_id = ids[0];\r\n              }\r\n            }\r\n            RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id);\r\n            U64 voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n            if(voff != 0)\r\n            {\r\n              entries_found = 1;\r\n              DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n              dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: add trap for PE header entry\r\n        if(!entries_found)\r\n        {\r\n          U64 voff = ctrl_entry_point_voff_from_module(module->handle);\r\n          if(voff != 0)\r\n          {\r\n            DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n            dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n          }\r\n        }\r\n        \r\n        //- rjf: add traps for all low-level entry points\r\n        if(!entries_found)\r\n        {\r\n          String8 lo_entry_points[] =\r\n          {\r\n            str8_lit(\"WinMainCRTStartup\"),\r\n            str8_lit(\"wWinMainCRTStartup\"),\r\n            str8_lit(\"mainCRTStartup\"),\r\n            str8_lit(\"wmainCRTStartup\"),\r\n          };\r\n          for(U64 idx = 0; idx < ArrayCount(lo_entry_points); idx += 1)\r\n          {\r\n            U32 procedure_id = 0;\r\n            {\r\n              String8 name = lo_entry_points[idx];\r\n              RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, name.str, name.size);\r\n              U32 id_count = 0;\r\n              U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n              if(id_count > 0)\r\n              {\r\n                procedure_id = ids[0];\r\n              }\r\n            }\r\n            RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_id);\r\n            U64 voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n            if(voff != 0)\r\n            {\r\n              entries_found = 1;\r\n              DMN_Trap trap = {process->handle.dmn_handle, module_base_vaddr + voff};\r\n              dmn_trap_chunk_list_push(scratch.arena, &entry_traps, 256, &trap);\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: no entry point found -> done\r\n        if(entry_traps.trap_count == 0)\r\n        {\r\n          hard_stop = 1;\r\n        }\r\n        \r\n        //- rjf: found entry points -> add to joined traps\r\n        dmn_trap_chunk_list_concat_shallow_copy(scratch.arena, &joined_traps, &entry_traps);\r\n        \r\n        access_close(access);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: unpack info about thread attached to event\r\n      //\r\n      CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->thread));\r\n      CTRL_Entity *process = ctrl_entity_from_handle(entity_ctx, ctrl_handle_make(CTRL_MachineID_Local, event->process));\r\n      Arch arch = thread->arch;\r\n      U64 thread_rip_vaddr = dmn_rip_from_thread(event->thread);\r\n      CTRL_Entity *module = &ctrl_entity_nil;\r\n      {\r\n        for(CTRL_Entity *m = process->first; m != &ctrl_entity_nil; m = m->next)\r\n        {\r\n          if(m->kind == CTRL_EntityKind_Module && contains_1u64(m->vaddr_range, thread_rip_vaddr))\r\n          {\r\n            module = m;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: extract module-dependent info\r\n      //\r\n      U64 thread_rip_voff = thread_rip_vaddr - module->vaddr_range.min;\r\n      \r\n      //////////////////////////\r\n      //- rjf: stepping logic\r\n      //\r\n      //{\r\n      \r\n      //////////////////////////\r\n      //- rjf: handle if hitting a spoof\r\n      //\r\n      B32 exception_stop = 0;\r\n      B32 hit_spoof = 0;\r\n      if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Exception)\r\n      {\r\n        if(spoof_mode &&\r\n           dmn_handle_match(target_process.dmn_handle, event->process) &&\r\n           dmn_handle_match(target_thread.dmn_handle, event->thread) &&\r\n           spoof.new_ip_value == event->address)\r\n        {\r\n          hit_spoof = 1;\r\n          log_infof(\"hit_spoof\\n\");\r\n        }\r\n        else\r\n        {\r\n          exception_stop = 1;\r\n          use_stepping_logic = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: handle spoof hit\r\n      if(hit_spoof)\r\n      {\r\n        log_infof(\"exit_spoof_mode\\n\");\r\n        \r\n        // rjf: clear spoof mode\r\n        spoof_mode = 0;\r\n        MemoryZeroStruct(&spoof);\r\n        \r\n        // rjf: skip remainder of handling\r\n        use_stepping_logic = 0;\r\n      }\r\n      \r\n      //- rjf: for breakpoint events, gather bp info\r\n      B32 hit_entry = 0;\r\n      B32 hit_user_bp = 0;\r\n      B32 hit_trap_net_bp = 0;\r\n      B32 hit_conditional_bp_but_filtered = 0;\r\n      CTRL_TrapFlags hit_trap_flags = 0;\r\n      if(!hard_stop && use_stepping_logic && event->kind == DMN_EventKind_Breakpoint)\r\n        ProfScope(\"for breakpoint events, gather bp info\")\r\n      {\r\n        Temp temp = temp_begin(scratch.arena);\r\n        String8List conditions = {0};\r\n        \r\n        // rjf: entry breakpoints\r\n        for(DMN_TrapChunkNode *n = entry_traps.first; n != 0; n = n->next)\r\n        {\r\n          DMN_Trap *trap = n->v;\r\n          DMN_Trap *opl = n->v + n->count;\r\n          for(;trap < opl; trap += 1)\r\n          {\r\n            if(dmn_handle_match(trap->process, event->process) && trap->vaddr == event->instruction_pointer)\r\n            {\r\n              hit_entry = 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: user breakpoints\r\n        {\r\n          if(event->user_data != 0)\r\n          {\r\n            hit_user_bp = 1;\r\n          }\r\n          for(DMN_TrapChunkNode *n = user_traps.first; n != 0; n = n->next)\r\n          {\r\n            DMN_Trap *trap = n->v;\r\n            DMN_Trap *opl = n->v + n->count;\r\n            for(;trap < opl; trap += 1)\r\n            {\r\n              if(dmn_handle_match(trap->process, event->process) &&\r\n                 trap->vaddr == event->instruction_pointer &&\r\n                 (!dmn_handle_match(event->thread, target_thread.dmn_handle) || !target_thread_is_on_user_bp_and_trap_net_trap))\r\n              {\r\n                CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)trap->id;\r\n                hit_user_bp = 1;\r\n                if(user_bp != 0 && !(trap->id & bit64) && user_bp->condition.size != 0)\r\n                {\r\n                  str8_list_push(temp.arena, &conditions, user_bp->condition);\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: programmatic user breakpoints (we do not have state for it,\r\n        // but the target program(s) did something breakpoint-like, and we\r\n        // want to treat it as if we did)\r\n        if(event->address != 0)\r\n        {\r\n          hit_user_bp = 1;\r\n        }\r\n        \r\n        // rjf: evaluate hit stop conditions\r\n        if(conditions.node_count != 0) ProfScope(\"evaluate hit stop conditions\")\r\n        {\r\n          CTRL_EvalScope *eval_scope = ctrl_thread__eval_scope_begin(temp.arena, &msg->user_bps, thread);\r\n          for(String8Node *condition_n = conditions.first; condition_n != 0; condition_n = condition_n->next)\r\n          {\r\n            // rjf: evaluate\r\n            E_Eval eval = zero_struct;\r\n            ProfScope(\"evaluate expression\")\r\n            {\r\n              eval = e_eval_from_string(condition_n->string);\r\n            }\r\n            \r\n            // rjf: interpret evaluation\r\n            if(eval.code == E_InterpretationCode_Good && eval.value.u64 == 0)\r\n            {\r\n              hit_user_bp = 0;\r\n              hit_conditional_bp_but_filtered = 1;\r\n              log_infof(\"conditional_breakpoint_hit: 'condition eval'd to 0, and so filtered'\\n\");\r\n            }\r\n            else\r\n            {\r\n              hit_user_bp = 1;\r\n              hit_conditional_bp_but_filtered = 0;\r\n              log_infof(\"conditional_breakpoint_hit: 'conditional eval'd to nonzero, hit'\\n\");\r\n              break;\r\n            }\r\n          }\r\n          ctrl_thread__eval_scope_end(eval_scope);\r\n        }\r\n        \r\n        // rjf: gather trap net hits\r\n        ProfScope(\"gather trap net hits\")\r\n        {\r\n          if(!hit_user_bp && dmn_handle_match(event->process, target_process.dmn_handle))\r\n          {\r\n            for(CTRL_TrapNode *node = msg->traps.first;\r\n                node != 0;\r\n                node = node->next)\r\n            {\r\n              if(node->v.vaddr == event->instruction_pointer)\r\n              {\r\n                hit_trap_net_bp = 1;\r\n                hit_trap_flags |= node->v.flags;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        log_infof(\"user_breakpoint_hit: %i\\n\", hit_user_bp);\r\n        log_infof(\"entry_point_hit: %i\\n\", hit_entry);\r\n        temp_end(temp);\r\n      }\r\n      \r\n      //- rjf: hit conditional user bp but filtered -> single step\r\n      B32 cond_bp_single_step_stop = 0;\r\n      CTRL_EventCause cond_bp_single_step_stop_cause = CTRL_EventCause_Null;\r\n      if(hit_conditional_bp_but_filtered) LogInfoNamedBlockF(\"conditional_bp_hit_single_step\")\r\n      {\r\n        DMN_Handle thread = event->thread;\r\n        U64 thread_pre_rip = dmn_rip_from_thread(thread);\r\n        U64 thread_post_rip = thread_pre_rip;\r\n        for(B32 single_step_done = 0; !single_step_done;)\r\n        {\r\n          DMN_RunCtrls single_step_ctrls = {0};\r\n          single_step_ctrls.run_entities_are_unfrozen = 1;\r\n          single_step_ctrls.run_entities = &thread;\r\n          single_step_ctrls.run_entity_count = 1;\r\n          if(thread_post_rip == thread_pre_rip)\r\n          {\r\n            single_step_ctrls.single_step_thread = thread;\r\n          }\r\n          DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0);\r\n          thread_post_rip = dmn_rip_from_thread(thread);\r\n          switch(event->kind)\r\n          {\r\n            default:{}break;\r\n            case DMN_EventKind_Error:\r\n            case DMN_EventKind_Exception:\r\n            case DMN_EventKind_Halt:\r\n            case DMN_EventKind_Trap:\r\n            {\r\n              cond_bp_single_step_stop = 1;\r\n              single_step_done = 1;\r\n              use_stepping_logic = 0;\r\n              cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n            }break;\r\n            case DMN_EventKind_SingleStep:\r\n            {\r\n              single_step_done = dmn_handle_match(event->thread, thread);\r\n              cond_bp_single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n            }break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: hit entry points on *any thread* cause a stop, if this msg says as such\r\n      B32 entry_stop = 0;\r\n      if(msg->run_flags & CTRL_RunFlag_StopOnEntryPoint && hit_entry)\r\n      {\r\n        entry_stop = 1;\r\n        use_stepping_logic = 0;\r\n      }\r\n      \r\n      //- rjf: user breakpoints on *any thread* cause a stop\r\n      B32 user_bp_stop = 0;\r\n      if(!hard_stop && use_stepping_logic && hit_user_bp)\r\n      {\r\n        user_bp_stop = 1;\r\n        use_stepping_logic = 0;\r\n      }\r\n      \r\n      //- rjf: trap net on off-target threads are ignored\r\n      B32 step_past_trap_net = 0;\r\n      if(!hard_stop && use_stepping_logic && hit_trap_net_bp)\r\n      {\r\n        if(!dmn_handle_match(event->thread, target_thread.dmn_handle))\r\n        {\r\n          step_past_trap_net = 1;\r\n          use_stepping_logic = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: trap net on on-target threads trigger trap net logic\r\n      B32 use_trap_net_logic = 0;\r\n      if(!hard_stop && use_stepping_logic && hit_trap_net_bp)\r\n      {\r\n        if(dmn_handle_match(event->thread, target_thread.dmn_handle))\r\n        {\r\n          use_trap_net_logic = 1;\r\n        }\r\n      }\r\n      \r\n      //- rjf: trap net logic: stack pointer check\r\n      B32 stack_pointer_matches = 0;\r\n      if(use_trap_net_logic)\r\n      {\r\n        U64 sp = dmn_rsp_from_thread(target_thread.dmn_handle);\r\n        stack_pointer_matches = (sp == sp_check_value);\r\n      }\r\n      \r\n      //- rjf: trap net logic: single step after hit\r\n      B32 single_step_stop = 0;\r\n      CTRL_EventCause single_step_stop_cause = CTRL_EventCause_Null;\r\n      if(!hard_stop && use_trap_net_logic)\r\n      {\r\n        if(hit_trap_flags & CTRL_TrapFlag_SingleStepAfterHit) LogInfoNamedBlockF(\"trap_net__single_step_after_hit\")\r\n        {\r\n          U64 thread_pre_rip = dmn_rip_from_thread(target_thread.dmn_handle);\r\n          U64 thread_post_rip = thread_pre_rip;\r\n          for(B32 single_step_done = 0; single_step_done == 0;)\r\n          {\r\n            DMN_RunCtrls single_step_ctrls = {0};\r\n            single_step_ctrls.run_entities_are_unfrozen = 1;\r\n            single_step_ctrls.run_entities = &target_thread.dmn_handle;\r\n            single_step_ctrls.run_entity_count = 1;\r\n            if(thread_post_rip == thread_pre_rip)\r\n            {\r\n              single_step_ctrls.single_step_thread = target_thread.dmn_handle;\r\n            }\r\n            DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0);\r\n            thread_post_rip = dmn_rip_from_thread(target_thread.dmn_handle);\r\n            switch(event->kind)\r\n            {\r\n              default:{}break;\r\n              case DMN_EventKind_Error:\r\n              case DMN_EventKind_Exception:\r\n              case DMN_EventKind_Halt:\r\n              case DMN_EventKind_Trap:\r\n              {\r\n                single_step_stop = 1;\r\n                single_step_done = 1;\r\n                use_stepping_logic = 0;\r\n                use_trap_net_logic = 0;\r\n                single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n              }break;\r\n              case DMN_EventKind_SingleStep:\r\n              {\r\n                single_step_done = dmn_handle_match(event->thread, target_thread.dmn_handle);\r\n                single_step_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n              }break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: trap net logic: begin spoof mode\r\n      B32 begin_spoof_mode = 0;\r\n      if(!hard_stop && use_trap_net_logic)\r\n      {\r\n        if(hit_trap_flags & CTRL_TrapFlag_BeginSpoofMode) LogInfoNamedBlockF(\"trap_net__begin_spoof_mode\")\r\n        {\r\n          // rjf: setup spoof mode\r\n          begin_spoof_mode = 1;\r\n          U64 spoof_sp = dmn_rsp_from_thread(target_thread.dmn_handle);\r\n          spoof_mode = 1;\r\n          spoof.process = target_process.dmn_handle;\r\n          spoof.thread  = target_thread.dmn_handle;\r\n          spoof.vaddr   = spoof_sp;\r\n          spoof.new_ip_value = spoof_ip_vaddr;\r\n          log_infof(\"spoof:{process:[0x%I64x], thread:[0x%I64x], vaddr:0x%I64x, new_ip_value:0x%I64x}\\n\", spoof.process.u64[0], spoof.thread.u64[0], spoof.vaddr, spoof.new_ip_value);\r\n        }\r\n      }\r\n      \r\n      //- rjf: trap net logic: save stack pointer\r\n      B32 save_stack_pointer = 0;\r\n      if(!hard_stop && use_trap_net_logic)\r\n      {\r\n        if(hit_trap_flags & CTRL_TrapFlag_SaveStackPointer)\r\n        {\r\n          if(stack_pointer_matches) LogInfoNamedBlockF(\"trap_net__save_sp\")\r\n          {\r\n            save_stack_pointer = 1;\r\n            sp_check_value = dmn_rsp_from_thread(target_thread.dmn_handle);\r\n            log_infof(\"sp_check_value = 0x%I64x\\n\", sp_check_value);\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: trap net logic: end stepping\r\n      B32 trap_net_stop = 0;\r\n      if(!hard_stop && use_trap_net_logic)\r\n      {\r\n        if(hit_trap_flags & CTRL_TrapFlag_EndStepping) LogInfoNamedBlockF(\"trap_net__end_step\")\r\n        {\r\n          if((hit_trap_flags & CTRL_TrapFlag_IgnoreStackPointerCheck) ||\r\n             stack_pointer_matches)\r\n          {\r\n            trap_net_stop = 1;\r\n            use_trap_net_logic = 0;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //}\r\n      //\r\n      //- rjf: stepping logic\r\n      ////////////////////////////////\r\n      \r\n      //- rjf: handle step past trap net\r\n      B32 step_past_trap_net_stop = 0;\r\n      CTRL_EventCause step_past_trap_net_stop_cause = CTRL_EventCause_Null;\r\n      if(step_past_trap_net) LogInfoNamedBlockF(\"trap_net__single_step_past_trap_net\")\r\n      {\r\n        DMN_Handle thread = event->thread;\r\n        U64 thread_pre_rip = dmn_rip_from_thread(thread);\r\n        U64 thread_post_rip = thread_pre_rip;\r\n        for(B32 single_step_done = 0; single_step_done == 0;)\r\n        {\r\n          DMN_RunCtrls single_step_ctrls = {0};\r\n          single_step_ctrls.run_entities_are_unfrozen = 1;\r\n          single_step_ctrls.run_entities = &thread;\r\n          single_step_ctrls.run_entity_count = 1;\r\n          if(thread_post_rip == thread_pre_rip)\r\n          {\r\n            single_step_ctrls.single_step_thread = thread;\r\n          }\r\n          DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &single_step_ctrls, 0);\r\n          thread_post_rip = dmn_rip_from_thread(thread);\r\n          switch(event->kind)\r\n          {\r\n            default:{}break;\r\n            case DMN_EventKind_Error:\r\n            case DMN_EventKind_Exception:\r\n            case DMN_EventKind_Halt:\r\n            case DMN_EventKind_Trap:\r\n            {\r\n              step_past_trap_net_stop = 1;\r\n              single_step_done = 1;\r\n              step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n            }break;\r\n            case DMN_EventKind_SingleStep:\r\n            {\r\n              single_step_done = dmn_handle_match(event->thread, thread);\r\n              step_past_trap_net_stop_cause = ctrl_event_cause_from_dmn_event_kind(event->kind);\r\n            }break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: loop exit condition\r\n      CTRL_EventCause stage_stop_cause = CTRL_EventCause_Null;\r\n      if(hard_stop)\r\n      {\r\n        stage_stop_cause = hard_stop_cause;\r\n      }\r\n      else if(cond_bp_single_step_stop)\r\n      {\r\n        stage_stop_cause = cond_bp_single_step_stop_cause;\r\n      }\r\n      else if(single_step_stop)\r\n      {\r\n        stage_stop_cause = single_step_stop_cause;\r\n      }\r\n      else if(step_past_trap_net_stop)\r\n      {\r\n        stage_stop_cause = step_past_trap_net_stop_cause;\r\n      }\r\n      else if(exception_stop)\r\n      {\r\n        stage_stop_cause = CTRL_EventCause_InterruptedByException;\r\n      }\r\n      else if(user_bp_stop)\r\n      {\r\n        stage_stop_cause = CTRL_EventCause_UserBreakpoint;\r\n      }\r\n      else if(entry_stop)\r\n      {\r\n        stage_stop_cause = CTRL_EventCause_EntryPoint;\r\n      }\r\n      else if(trap_net_stop)\r\n      {\r\n        stage_stop_cause = CTRL_EventCause_Finished;\r\n      }\r\n      log_infof(\"stop_cause: %i\\n\", stage_stop_cause);\r\n      if(stage_stop_cause != CTRL_EventCause_Null)\r\n      {\r\n        stop_event = event;\r\n        stop_cause = stage_stop_cause;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: record stop\r\n  //\r\n  if(stop_event != 0)\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind = CTRL_EventKind_Stopped;\r\n    event->cause = stop_cause;\r\n    event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread);\r\n    event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process);\r\n    event->exception_code = stop_event->code;\r\n    event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind);\r\n    event->vaddr_rng = r1u64(stop_event->address, stop_event->address);\r\n    event->rip_vaddr = stop_event->instruction_pointer;\r\n    if(stop_cause == CTRL_EventCause_UserBreakpoint && stop_event->user_data != 0)\r\n    {\r\n      if(!(stop_event->user_data & bit64))\r\n      {\r\n        CTRL_UserBreakpoint *user_bp = (CTRL_UserBreakpoint *)stop_event->user_data;\r\n        event->u64_code = user_bp->id;\r\n      }\r\n    }\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  log_infof(\"}\\n\\n\");\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: record start\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind = CTRL_EventKind_Started;\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  //- rjf: single step\r\n  DMN_Handle thread = msg->entity.dmn_handle;\r\n  B32 thread_is_valid = !dmn_handle_match(thread, dmn_handle_zero());\r\n  DMN_Event *stop_event = 0;\r\n  CTRL_EventCause stop_cause = CTRL_EventCause_Null;\r\n  if(thread_is_valid)\r\n  {\r\n    U64 thread_pre_rip = dmn_rip_from_thread(thread);\r\n    U64 thread_post_rip = thread_pre_rip;\r\n    for(B32 done = 0; done == 0;)\r\n    {\r\n      DMN_RunCtrls run_ctrls = {0};\r\n      run_ctrls.run_entities_are_unfrozen = 1;\r\n      run_ctrls.run_entities = &thread;\r\n      run_ctrls.run_entity_count = 1;\r\n      if(thread_post_rip == thread_pre_rip)\r\n      {\r\n        run_ctrls.single_step_thread = msg->entity.dmn_handle;\r\n      }\r\n      DMN_Event *event = ctrl_thread__next_dmn_event(scratch.arena, ctrl_ctx, msg, &run_ctrls, 0);\r\n      thread_post_rip = dmn_rip_from_thread(msg->entity.dmn_handle);\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        case DMN_EventKind_Error:      {stop_cause = CTRL_EventCause_Error;}goto end_single_step;\r\n        case DMN_EventKind_Exception:  {stop_cause = CTRL_EventCause_InterruptedByException;}goto end_single_step;\r\n        case DMN_EventKind_Halt:       {stop_cause = CTRL_EventCause_InterruptedByHalt;}goto end_single_step;\r\n        case DMN_EventKind_Trap:       {stop_cause = CTRL_EventCause_InterruptedByTrap;}goto end_single_step;\r\n        case DMN_EventKind_Breakpoint: {stop_cause = CTRL_EventCause_UserBreakpoint;}goto end_single_step;\r\n        case DMN_EventKind_SingleStep: {stop_cause = CTRL_EventCause_Finished;}goto end_single_step;\r\n        end_single_step:\r\n        {\r\n          stop_event = event;\r\n          done = 1;\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: record stop\r\n  {\r\n    CTRL_EventList evts = {0};\r\n    CTRL_Event *event = ctrl_event_list_push(scratch.arena, &evts);\r\n    event->kind = CTRL_EventKind_Stopped;\r\n    event->cause = stop_cause;\r\n    if(stop_event != 0)\r\n    {\r\n      event->entity = ctrl_handle_make(CTRL_MachineID_Local, stop_event->thread);\r\n      event->parent = ctrl_handle_make(CTRL_MachineID_Local, stop_event->process);\r\n      event->exception_code = stop_event->code;\r\n      event->exception_kind = ctrl_exception_kind_from_dmn(stop_event->exception_kind);\r\n      event->vaddr_rng = r1u64(stop_event->address, stop_event->address);\r\n      event->rip_vaddr = stop_event->instruction_pointer;\r\n    }\r\n    ctrl_c2u_push_events(&evts);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Memory Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact\r\nctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  AC_Artifact artifact = {0};\r\n  {\r\n    //- rjf: unpack key\r\n    CTRL_Handle process = {0};\r\n    Rng1U64 vaddr_range = {0};\r\n    B32 zero_terminated = 0;\r\n    {\r\n      U64 key_read_off = 0;\r\n      key_read_off += str8_deserial_read_struct(key, key_read_off, &process);\r\n      key_read_off += str8_deserial_read_struct(key, key_read_off, &vaddr_range);\r\n      key_read_off += str8_deserial_read_struct(key, key_read_off, &zero_terminated);\r\n    }\r\n    \r\n    //- rjf: clamp vaddr range\r\n    Rng1U64 vaddr_range_clamped = vaddr_range;\r\n    {\r\n      vaddr_range_clamped.max = Max(vaddr_range_clamped.max, vaddr_range_clamped.min);\r\n      U64 max_size_cap = Min(max_U64-vaddr_range_clamped.min, GB(1));\r\n      vaddr_range_clamped.max = Min(vaddr_range_clamped.max, vaddr_range_clamped.min+max_size_cap);\r\n    }\r\n    \r\n    //- rjf: do read\r\n    U64 range_size = dim_1u64(vaddr_range_clamped);\r\n    Arena *range_arena = 0;\r\n    void *range_base = 0;\r\n    U64 zero_terminated_size = 0;\r\n    U64 pre_read_mem_gen = ctrl_mem_gen();\r\n    B32 pre_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state);\r\n    if(range_size != 0)\r\n    {\r\n      // rjf: set up arena\r\n      U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process\r\n      U64 arena_size = AlignPow2(range_size + ARENA_HEADER_SIZE, page_size);\r\n      range_arena = arena_alloc(.reserve_size = range_size+ARENA_HEADER_SIZE, .commit_size = range_size+ARENA_HEADER_SIZE);\r\n      \r\n      // rjf: if we got an arena -> push buffer & read\r\n      if(range_arena != 0)\r\n      {\r\n        // rjf: read as much as possible\r\n        range_base = push_array_no_zero(range_arena, U8, range_size);\r\n        U64 bytes_read = 0;\r\n        U64 retry_count = 0;\r\n        U64 retry_limit = range_size > page_size ? 64 : 0;\r\n        for(Rng1U64 vaddr_range_clamped_retry = vaddr_range_clamped;\r\n            retry_count <= retry_limit;\r\n            retry_count += 1)\r\n        {\r\n          bytes_read = dmn_process_read(process.dmn_handle, vaddr_range_clamped_retry, range_base);\r\n          if(bytes_read == 0 && vaddr_range_clamped_retry.max > vaddr_range_clamped_retry.min)\r\n          {\r\n            U64 diff = (vaddr_range_clamped_retry.max-vaddr_range_clamped_retry.min)/2;\r\n            vaddr_range_clamped_retry.max -= diff;\r\n            vaddr_range_clamped_retry.max = AlignDownPow2(vaddr_range_clamped_retry.max, page_size);\r\n            if(diff == 0)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n          else\r\n          {\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: if we read nothing, release arena\r\n        if(bytes_read == 0)\r\n        {\r\n          arena_release(range_arena);\r\n          range_base = 0;\r\n          range_arena = 0;\r\n        }\r\n        \r\n        // rjf: if we only got a partial read, zero the rest\r\n        else if(bytes_read < range_size)\r\n        {\r\n          MemoryZero((U8 *)range_base + bytes_read, range_size-bytes_read);\r\n        }\r\n        \r\n        // rjf: determine final size; zero terminate if needed; pop any unneeded bytes if zero-terminating\r\n        zero_terminated_size = bytes_read;\r\n        if(zero_terminated && range_base != 0)\r\n        {\r\n          for(U64 idx = 0; idx < bytes_read; idx += 1)\r\n          {\r\n            if(((U8 *)range_base)[idx] == 0)\r\n            {\r\n              zero_terminated_size = idx;\r\n              break;\r\n            }\r\n          }\r\n          U64 bytes_overkill = (bytes_read - zero_terminated_size);\r\n          arena_pop(range_arena, bytes_overkill);\r\n        }\r\n      }\r\n    }\r\n    U64 post_read_mem_gen = ctrl_mem_gen();\r\n    B32 post_run_state = ins_atomic_u64_eval(&ctrl_state->ctrl_thread_run_state);\r\n    \r\n    //- rjf: form content key\r\n    C_Key content_key = {0};\r\n    {\r\n      content_key.id.u128[0] = u128_hash_from_str8(key);\r\n    }\r\n    \r\n    //- rjf: determine if we have any history for this key\r\n    B32 key_has_history = 0;\r\n    {\r\n      U128 last_hash = c_hash_from_key(content_key, 0);\r\n      if(!u128_match(last_hash, u128_zero()))\r\n      {\r\n        key_has_history = 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: read successful, OR we have no history -> submit to hash store\r\n    U128 hash = {0};\r\n    if((zero_terminated_size > 0 || !key_has_history) && range_base != 0 && range_size != 0 && pre_read_mem_gen == post_read_mem_gen)\r\n    {\r\n      hash = c_submit_data(content_key, &range_arena, str8((U8 *)range_base, zero_terminated_size));\r\n      gen_out[0] = pre_read_mem_gen;\r\n    }\r\n    \r\n    //- rjf: wakeup on new submissions\r\n    if(!u128_match(u128_zero(), hash))\r\n    {\r\n      if(ctrl_state->wakeup_hook != 0)\r\n      {\r\n        ctrl_state->wakeup_hook();\r\n      }\r\n    }\r\n    \r\n    //- rjf: always release leftover arenas\r\n    if(range_arena != 0)\r\n    {\r\n      arena_release(range_arena);\r\n    }\r\n    \r\n    //- rjf: retry on mem gen \"tearing\", and if the range is non-empty\r\n    if(pre_read_mem_gen != post_read_mem_gen && range_size != 0)\r\n    {\r\n      retry_out[0] = 1;\r\n    }\r\n    \r\n    //- rjf: bundle content key as artifact\r\n    StaticAssert(sizeof(content_key) == sizeof(artifact), artifact_key_size_check);\r\n    MemoryCopyStruct(&artifact, &content_key);\r\n  }\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\nctrl_memory_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  C_Key key = {0};\r\n  MemoryCopyStruct(&key, &artifact);\r\n  c_close_key(key);\r\n}\r\n\r\ninternal C_Key\r\nctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale)\r\n{\r\n  ProfBeginFunction();\r\n#pragma pack(push, 1)\r\n  struct\r\n  {\r\n    CTRL_Handle process;\r\n    Rng1U64 vaddr_range;\r\n    B32 zero_terminated;\r\n  } key_data = {process, vaddr_range, zero_terminated};\r\n#pragma pack(pop)\r\n  String8 key = str8_struct(&key_data);\r\n  Access *access = access_open();\r\n  AC_Artifact artifact = ac_artifact_from_key(access, key, ctrl_memory_artifact_create, ctrl_memory_artifact_destroy, endt_us,\r\n                                              .flags = AC_Flag_HighPriority | (wait_for_fresh ? AC_Flag_WaitForFresh : 0),\r\n                                              .gen = ctrl_mem_gen(),\r\n                                              .slots_count = 2048,\r\n                                              .stale_out = out_is_stale,\r\n                                              .evict_threshold_us = 10000000);\r\n  C_Key content_key = {0};\r\n  MemoryCopyStruct(&content_key, &artifact);\r\n  access_close(access);\r\n  ProfEnd();\r\n  return content_key;\r\n}\r\n\r\n//- rjf: process memory reading helpers\r\n\r\ninternal CTRL_ProcessMemorySlice\r\nctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us)\r\n{\r\n  ProfBeginFunction();\r\n  CTRL_ProcessMemorySlice result = {0};\r\n  if(range.max > range.min &&\r\n     dim_1u64(range) <= MB(256) &&\r\n     range.min <= 0x000FFFFFFFFFFFFFull &&\r\n     range.max <= 0x000FFFFFFFFFFFFFull)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    Access *access = access_open();\r\n    \r\n    //- rjf: unpack address range, prepare per-touched-page info\r\n    U64 page_size = KB(4);\r\n    Rng1U64 page_range = r1u64(AlignDownPow2(range.min, page_size), AlignPow2(range.max, page_size));\r\n    U64 page_count = dim_1u64(page_range)/page_size;\r\n    U128 *page_hashes = push_array(scratch.arena, U128, page_count);\r\n    U128 *page_last_hashes = push_array(scratch.arena, U128, page_count);\r\n    \r\n    //- rjf: gather hashes & last-hashes for each page\r\n    ProfScope(\"gather hashes & last-hashes for each page\")\r\n    {\r\n      for(U64 page_idx = 0; page_idx < page_count; page_idx += 1)\r\n      {\r\n        U64 page_base_vaddr = page_range.min + page_idx*page_size;\r\n        B32 page_is_stale = 0;\r\n        C_Key page_key = ctrl_key_from_process_vaddr_range(process, r1u64(page_base_vaddr, page_base_vaddr+page_size), 0, wait_for_fresh, endt_us, &page_is_stale);\r\n        U128 page_hash = c_hash_from_key(page_key, 0);\r\n        U128 page_last_hash = c_hash_from_key(page_key, 1);\r\n        result.stale = (result.stale || page_is_stale);\r\n        page_hashes[page_idx] = page_hash;\r\n        page_last_hashes[page_idx] = page_last_hash;\r\n      }\r\n    }\r\n    \r\n    //- rjf: setup output buffers\r\n    void *read_out = push_array(arena, U8, dim_1u64(range));\r\n    U64 *byte_bad_flags = push_array(arena, U64, (dim_1u64(range)+63)/64);\r\n    U64 *byte_changed_flags = push_array(arena, U64, (dim_1u64(range)+63)/64);\r\n    \r\n    //- rjf: iterate pages, fill output\r\n    ProfScope(\"iterate pages, fill output\")\r\n    {\r\n      U64 write_off = 0;\r\n      for(U64 page_idx = 0; page_idx < page_count; page_idx += 1)\r\n      {\r\n        // rjf: read data for this page\r\n        String8 data = c_data_from_hash(access, page_hashes[page_idx]);\r\n        Rng1U64 data_vaddr_range = r1u64(page_range.min + page_idx*page_size, page_range.min + page_idx*page_size+data.size);\r\n        \r\n        // rjf: skip/chop bytes which are irrelevant for the actual requested read\r\n        String8 in_range_data = data;\r\n        if(page_idx == page_count-1 && data_vaddr_range.max > range.max)\r\n        {\r\n          in_range_data = str8_chop(in_range_data, data_vaddr_range.max-range.max);\r\n        }\r\n        if(page_idx == 0 && range.min > data_vaddr_range.min)\r\n        {\r\n          in_range_data = str8_skip(in_range_data, range.min-data_vaddr_range.min);\r\n        }\r\n        \r\n        // rjf: write this chunk\r\n        MemoryCopy((U8*)read_out+write_off, in_range_data.str, in_range_data.size);\r\n        \r\n        // rjf; if this page's data doesn't fill the entire range, mark\r\n        // missing bytes as bad\r\n        if(data.size < page_size) ProfScope(\"mark missing bytes as bad\")\r\n        {\r\n          Rng1U64 invalid_range = r1u64(data_vaddr_range.min+data.size, data_vaddr_range.min + page_size);\r\n          Rng1U64 in_range_invalid_range = intersect_1u64(invalid_range, range);\r\n          for(U64 invalid_vaddr = in_range_invalid_range.min;\r\n              invalid_vaddr < in_range_invalid_range.max;\r\n              invalid_vaddr += 1)\r\n          {\r\n            U64 idx_in_range = invalid_vaddr - range.min;\r\n            byte_bad_flags[idx_in_range/64] |= (1ull<<(idx_in_range%64));\r\n          }\r\n        }\r\n        \r\n        // rjf: if this page's hash & last_hash don't match, diff each byte &\r\n        // fill out changed flags\r\n        if(!u128_match(page_hashes[page_idx], page_last_hashes[page_idx])) ProfScope(\"hashes don't match; diff each byte\")\r\n        {\r\n          String8 last_data = c_data_from_hash(access, page_last_hashes[page_idx]);\r\n          String8 in_range_last_data = last_data;\r\n          if(page_idx == page_count-1 && data_vaddr_range.max > range.max)\r\n          {\r\n            in_range_last_data = str8_chop(in_range_last_data, data_vaddr_range.max-range.max);\r\n          }\r\n          if(page_idx == 0 && range.min > data_vaddr_range.min)\r\n          {\r\n            in_range_last_data = str8_skip(in_range_last_data, range.min-data_vaddr_range.min);\r\n          }\r\n          for(U64 idx = 0; idx < in_range_data.size; idx += 1)\r\n          {\r\n            U8 last_byte = idx < in_range_last_data.size ? in_range_last_data.str[idx] : 0;\r\n            U8 now_byte  = idx < in_range_data.size ? in_range_data.str[idx] : 0;\r\n            if(last_byte != now_byte)\r\n            {\r\n              U64 idx_in_read_out = write_off+idx;\r\n              byte_changed_flags[idx_in_read_out/64] |= (1ull<<(idx_in_read_out%64));\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: increment past this chunk\r\n        U64 bytes_to_skip = page_size;\r\n        if(page_idx == 0 && range.min > data_vaddr_range.min)\r\n        {\r\n          bytes_to_skip -= (range.min-data_vaddr_range.min);\r\n        }\r\n        write_off += bytes_to_skip;\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill result\r\n    result.data.str = (U8*)read_out;\r\n    result.data.size = dim_1u64(range);\r\n    result.byte_bad_flags = byte_bad_flags;\r\n    result.byte_changed_flags = byte_changed_flags;\r\n    if(byte_bad_flags != 0)\r\n    {\r\n      for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1)\r\n      {\r\n        result.any_byte_bad = result.any_byte_bad || !!result.byte_bad_flags[idx];\r\n      }\r\n    }\r\n    if(byte_changed_flags != 0)\r\n    {\r\n      for(U64 idx = 0; idx < (dim_1u64(range)+63)/64; idx += 1)\r\n      {\r\n        result.any_byte_changed = result.any_byte_changed || !!result.byte_changed_flags[idx];\r\n      }\r\n    }\r\n    \r\n    access_close(access);\r\n    scratch_end(scratch);\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U64 needed_size = dim_1u64(range);\r\n  CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, range, 0, endt_us);\r\n  B32 good = (slice.data.size >= needed_size && !slice.any_byte_bad);\r\n  if(good)\r\n  {\r\n    MemoryCopy(out, slice.data.str, needed_size);\r\n  }\r\n  if(slice.stale && is_stale_out)\r\n  {\r\n    *is_stale_out = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return good;\r\n}\r\n\r\n//- rjf: process memory writing\r\n\r\ninternal B32\r\nctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src)\r\n{\r\n  ProfBeginFunction();\r\n  B32 result = dmn_process_write(process.dmn_handle, range, src);\r\n  \r\n  //- rjf: success -> bump generation\r\n  if(result)\r\n  {\r\n    ins_atomic_u64_inc_eval(&ctrl_state->mem_gen);\r\n  }\r\n  \r\n  //- rjf: success -> wait for cache updates, for small regions - prefer relatively seamless\r\n  // writes within calling frame's \"view\" of the memory, at the expense of a small amount of\r\n  // time.\r\n  if(result)\r\n  {\r\n    U64 endt_us = os_now_microseconds()+10000;\r\n    U64 page_size = os_get_system_info()->page_size; // TODO(rjf): @page_size_from_process\r\n    Rng1U64 page_range = r1u64(range.min/page_size, (range.max+page_size-1)/page_size);\r\n    for EachInRange(page_idx, page_range)\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process, r1u64(page_idx*page_size, (page_idx+1)*page_size), 1, endt_us);\r\n      scratch_end(scratch);\r\n      if(!slice.stale || os_now_microseconds() >= endt_us)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact\r\nctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  AC_Artifact artifact = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    //- rjf: unpack key\r\n    CTRL_Handle thread_handle = {0};\r\n    str8_deserial_read_struct(key, 0, &thread_handle);\r\n    \r\n    //- rjf: produce mini entity context for just this call stack build\r\n    CTRL_EntityCtx *entity_ctx = push_array(scratch.arena, CTRL_EntityCtx, 1);\r\n    MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex)\r\n    {\r\n      CTRL_EntityCtx *src_ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n      CTRL_EntityCtx *dst_ctx = entity_ctx;\r\n      {\r\n        dst_ctx->root = &ctrl_entity_nil;\r\n        dst_ctx->hash_slots_count = 1024;\r\n        dst_ctx->hash_slots = push_array(scratch.arena, CTRL_EntityHashSlot, dst_ctx->hash_slots_count);\r\n        MemoryCopyArray(dst_ctx->entity_kind_counts, src_ctx->entity_kind_counts);\r\n        MemoryCopyArray(dst_ctx->entity_kind_alloc_gens, src_ctx->entity_kind_alloc_gens);\r\n      }\r\n      CTRL_Entity *src_thread = ctrl_entity_from_handle(src_ctx, thread_handle);\r\n      CTRL_Entity *src_process = ctrl_process_from_entity(src_thread);\r\n      {\r\n        CTRL_EntityRec rec = {0};\r\n        CTRL_Entity *dst_parent = &ctrl_entity_nil;\r\n        for(CTRL_Entity *src_e = src_process; src_e != &ctrl_entity_nil; src_e = rec.next)\r\n        {\r\n          rec = ctrl_entity_rec_depth_first_pre(src_e, src_process);\r\n          \r\n          // rjf: determine if we need this entity\r\n          B32 need_this_entity = (ctrl_handle_match(thread_handle, src_e->handle) || src_e->kind == CTRL_EntityKind_Module || src_e->kind == CTRL_EntityKind_Process);\r\n          \r\n          // rjf: copy this entity\r\n          CTRL_Entity *dst_e = &ctrl_entity_nil;\r\n          if(need_this_entity)\r\n          {\r\n            dst_e = push_array(scratch.arena, CTRL_Entity, 1);\r\n            {\r\n              dst_e->first = dst_e->last = dst_e->next = dst_e->prev = &ctrl_entity_nil;\r\n              dst_e->parent           = dst_parent;\r\n              dst_e->kind             = src_e->kind;\r\n              dst_e->arch             = src_e->arch;\r\n              dst_e->is_frozen        = src_e->is_frozen;\r\n              dst_e->is_soloed        = src_e->is_soloed;\r\n              dst_e->rgba             = src_e->rgba;\r\n              dst_e->handle           = src_e->handle;\r\n              dst_e->id               = src_e->id;\r\n              dst_e->vaddr_range      = src_e->vaddr_range;\r\n              dst_e->stack_base       = src_e->stack_base;\r\n              dst_e->timestamp        = src_e->timestamp;\r\n              dst_e->bp_flags         = src_e->bp_flags;\r\n              dst_e->string           = push_str8_copy(scratch.arena, src_e->string);\r\n            }\r\n            if(dst_parent == &ctrl_entity_nil)\r\n            {\r\n              dst_ctx->root = dst_e;\r\n            }\r\n            else\r\n            {\r\n              DLLPushBack_NPZ(&ctrl_entity_nil, dst_parent->first, dst_parent->last, dst_e, next, prev);\r\n            }\r\n          }\r\n          \r\n          // rjf: insert into hash map\r\n          if(dst_e != &ctrl_entity_nil)\r\n          {\r\n            U64 hash = ctrl_hash_from_handle(dst_e->handle);\r\n            U64 slot_idx = hash%dst_ctx->hash_slots_count;\r\n            CTRL_EntityHashSlot *slot = &dst_ctx->hash_slots[slot_idx];\r\n            CTRL_EntityHashNode *node = 0;\r\n            for(CTRL_EntityHashNode *n = slot->first; n != 0; n = n->next)\r\n            {\r\n              if(ctrl_handle_match(n->entity->handle, dst_e->handle))\r\n              {\r\n                node = n;\r\n                break;\r\n              }\r\n            }\r\n            if(node == 0)\r\n            {\r\n              node = push_array(scratch.arena, CTRL_EntityHashNode, 1);\r\n              MemoryZeroStruct(node);\r\n              DLLPushBack(slot->first, slot->last, node);\r\n              node->entity = dst_e;\r\n            }\r\n          }\r\n          \r\n          // rjf: push/pop\r\n          if(rec.push_count)\r\n          {\r\n            dst_parent = dst_e;\r\n          }\r\n          else for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1)\r\n          {\r\n            dst_parent = dst_parent->parent;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: compute call stack\r\n    CTRL_Entity *thread = ctrl_entity_from_handle(entity_ctx, thread_handle);\r\n    B32 good = 1;\r\n    B32 retry = 0;\r\n    Arena *arena = 0;\r\n    CTRL_CallStack *call_stack = 0;\r\n    if(thread != &ctrl_entity_nil)\r\n    {\r\n      good = 0;\r\n      arena = arena_alloc();\r\n      call_stack = push_array(arena, CTRL_CallStack, 1);\r\n      CTRL_Entity *process = ctrl_process_from_entity(thread);\r\n      U64 pre_reg_gen = 0;\r\n      U64 post_reg_gen = 0;\r\n      U64 pre_mem_gen = 0;\r\n      U64 post_mem_gen = 0;\r\n      CTRL_Unwind unwind = {0};\r\n      {\r\n        pre_reg_gen = ctrl_reg_gen();\r\n        pre_mem_gen = ctrl_mem_gen();\r\n        unwind = ctrl_unwind_from_thread(arena, entity_ctx, thread_handle, os_now_microseconds()+5000);\r\n        if(unwind.flags == 0)\r\n        {\r\n          good = 1;\r\n          call_stack[0] = ctrl_call_stack_from_unwind(arena, process, &unwind);\r\n        }\r\n        if(unwind.flags & CTRL_UnwindFlag_Stale)\r\n        {\r\n          retry = 1;\r\n        }\r\n        post_reg_gen = ctrl_reg_gen();\r\n        post_mem_gen = ctrl_mem_gen();\r\n      }\r\n      if(pre_reg_gen != post_reg_gen || pre_mem_gen != post_mem_gen)\r\n      {\r\n        good = 0;\r\n        retry = 1;\r\n      }\r\n      if(!good)\r\n      {\r\n        arena_release(arena);\r\n      }\r\n    }\r\n    \r\n    //- rjf: broadcast update\r\n    if(good && ctrl_state->wakeup_hook != 0)\r\n    {\r\n      ctrl_state->wakeup_hook();\r\n    }\r\n    \r\n    //- rjf: bundle call stack as artifact\r\n    if(good)\r\n    {\r\n      artifact.u64[0] = (U64)arena;\r\n      artifact.u64[1] = (U64)call_stack;\r\n    }\r\n    \r\n    //- rjf: mark retry\r\n    retry_out[0] = retry;\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\nctrl_call_stack_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  Arena *arena = (Arena *)artifact.u64[0];\r\n  if(arena != 0)\r\n  {\r\n    arena_release(arena);\r\n  }\r\n}\r\n\r\ninternal CTRL_CallStack\r\nctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us)\r\n{\r\n  CTRL_CallStack result = {0};\r\n  {\r\n    AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&thread_handle), ctrl_call_stack_artifact_create, ctrl_call_stack_artifact_destroy, endt_us,\r\n                                                .gen = ctrl_mem_gen() + ctrl_reg_gen(),\r\n                                                .evict_threshold_us = 10000000,\r\n                                                .flags = high_priority ? AC_Flag_HighPriority : 0);\r\n    if(artifact.u64[1] != 0)\r\n    {\r\n      MemoryCopyStruct(&result, (CTRL_CallStack *)artifact.u64[1]);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact\r\nctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  \r\n  //- rjf: gather list of all thread handles\r\n  U64 threads_count = 0;\r\n  CTRL_Handle *threads = 0;\r\n  CTRL_Handle *threads_processes = 0;\r\n  Arch *threads_arches = 0;\r\n  MutexScopeR(ctrl_state->ctrl_thread_entity_ctx_rw_mutex)\r\n  {\r\n    CTRL_EntityCtx *ctx = &ctrl_state->ctrl_thread_entity_store->ctx;\r\n    CTRL_EntityArray thread_entities = ctrl_entity_array_from_kind(ctx, CTRL_EntityKind_Thread);\r\n    threads_count = thread_entities.count;\r\n    threads = push_array(scratch.arena, CTRL_Handle, threads_count);\r\n    threads_processes = push_array(scratch.arena, CTRL_Handle, threads_count);\r\n    threads_arches = push_array(scratch.arena, Arch, threads_count);\r\n    for EachIndex(idx, threads_count)\r\n    {\r\n      threads[idx] = thread_entities.v[idx]->handle;\r\n      threads_processes[idx] = thread_entities.v[idx]->parent->handle;\r\n      threads_arches[idx] = thread_entities.v[idx]->arch;\r\n    }\r\n  }\r\n  \r\n  //- rjf: gather all callstacks\r\n  B32 stale = 0;\r\n  U64 pre_mem_gen = ctrl_mem_gen();\r\n  U64 pre_reg_gen = ctrl_reg_gen();\r\n  CTRL_CallStack *call_stacks = push_array(scratch.arena, CTRL_CallStack, threads_count);\r\n  {\r\n    for EachIndex(idx, threads_count)\r\n    {\r\n      call_stacks[idx] = ctrl_call_stack_from_thread(access, threads[idx], 0, 0);\r\n      if(call_stacks[idx].concrete_frames_count == 0)\r\n      {\r\n        stale = 1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  U64 post_mem_gen = ctrl_mem_gen();\r\n  U64 post_reg_gen = ctrl_reg_gen();\r\n  stale = (stale || pre_mem_gen != post_mem_gen || pre_reg_gen != post_reg_gen);\r\n  \r\n  //- rjf: build call stack tree\r\n  Arena *arena = 0;\r\n  CTRL_CallStackTree *tree = 0;\r\n  if(!stale)\r\n  {\r\n    U64 id_gen = 0;\r\n    arena = arena_alloc();\r\n    tree = push_array(arena, CTRL_CallStackTree, 1);\r\n    tree->root = push_array(arena, CTRL_CallStackTreeNode, 1);\r\n    MemoryCopyStruct(tree->root, &ctrl_call_stack_tree_node_nil);\r\n    tree->root->id = id_gen;\r\n    tree->slots_count = Max(1, threads_count);\r\n    tree->slots = push_array(arena, CTRL_CallStackTreeNode *, tree->slots_count);\r\n    id_gen += 1;\r\n    for EachIndex(thread_idx, threads_count)\r\n    {\r\n      CTRL_Handle thread = threads[thread_idx];\r\n      CTRL_Handle process = threads_processes[thread_idx];\r\n      Arch arch = threads_arches[thread_idx];\r\n      CTRL_CallStack call_stack = call_stacks[thread_idx];\r\n      CTRL_CallStackTreeNode *thread_node = tree->root;\r\n      for EachIndex(frame_idx, call_stack.frames_count)\r\n      {\r\n        U64 vaddr = regs_rip_from_arch_block(arch, call_stack.frames[frame_idx].regs);\r\n        U64 depth = call_stack.frames[frame_idx].inline_depth;\r\n        CTRL_CallStackTreeNode *next_node = &ctrl_call_stack_tree_node_nil;\r\n        for(CTRL_CallStackTreeNode *child = thread_node->first; child != &ctrl_call_stack_tree_node_nil; child = child->next)\r\n        {\r\n          if(ctrl_handle_match(child->process, process) && child->vaddr == vaddr && child->depth == depth)\r\n          {\r\n            next_node = child;\r\n            break;\r\n          }\r\n        }\r\n        if(next_node == &ctrl_call_stack_tree_node_nil)\r\n        {\r\n          next_node = push_array(arena, CTRL_CallStackTreeNode, 1);\r\n          MemoryCopyStruct(next_node, &ctrl_call_stack_tree_node_nil);\r\n          next_node->id = id_gen;\r\n          SLLStackPush_N(tree->slots[next_node->id%tree->slots_count], next_node, hash_next);\r\n          id_gen += 1;\r\n          SLLQueuePush_NZ(&ctrl_call_stack_tree_node_nil, thread_node->first, thread_node->last, next_node, next);\r\n          next_node->parent = thread_node;\r\n          thread_node->child_count += 1;\r\n        }\r\n        thread_node = next_node;\r\n      }\r\n      ctrl_handle_list_push(arena, &thread_node->threads, &thread);\r\n      for(CTRL_CallStackTreeNode *n = thread_node; n != &ctrl_call_stack_tree_node_nil; n = n->parent)\r\n      {\r\n        n->all_descendant_threads_count += 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: produce artifact\r\n  AC_Artifact artifact = {0};\r\n  {\r\n    artifact.u64[0] = (U64)arena;\r\n    artifact.u64[1] = (U64)tree;\r\n  }\r\n  \r\n  //- rjf: retry on stale\r\n  if(stale)\r\n  {\r\n    retry_out[0] = 1;\r\n  }\r\n  \r\n  access_close(access);\r\n  scratch_end(scratch);\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\nctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  Arena *arena = (Arena *)artifact.u64[0];\r\n  if(arena != 0)\r\n  {\r\n    arena_release(arena);\r\n  }\r\n}\r\n\r\ninternal CTRL_CallStackTree\r\nctrl_call_stack_tree(Access *access, U64 endt_us)\r\n{\r\n  CTRL_CallStackTree result = {&ctrl_call_stack_tree_node_nil};\r\n  {\r\n    AC_Artifact artifact = ac_artifact_from_key(access, str8_zero(), ctrl_call_stack_tree_artifact_create, ctrl_call_stack_tree_artifact_destroy, endt_us);\r\n    if(artifact.u64[1] != 0)\r\n    {\r\n      MemoryCopyStruct(&result, (CTRL_CallStackTree *)artifact.u64[1]);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/ctrl/ctrl_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CTRL_CORE_H\r\n#define CTRL_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: ID Types\r\n\r\ntypedef U64 CTRL_MsgID;\r\ntypedef U64 CTRL_MachineID;\r\n\r\n#define CTRL_MachineID_Local (1)\r\n\r\n////////////////////////////////\r\n//~ rjf: User Breakpoint Types\r\n\r\ntypedef U32 CTRL_UserBreakpointFlags;\r\nenum\r\n{\r\n  CTRL_UserBreakpointFlag_BreakOnWrite   = (1<<0),\r\n  CTRL_UserBreakpointFlag_BreakOnRead    = (1<<1),\r\n  CTRL_UserBreakpointFlag_BreakOnExecute = (1<<2),\r\n};\r\n\r\ntypedef enum CTRL_UserBreakpointKind\r\n{\r\n  CTRL_UserBreakpointKind_Null,\r\n  CTRL_UserBreakpointKind_FileNameAndLineColNumber,\r\n  CTRL_UserBreakpointKind_Expression,\r\n  CTRL_UserBreakpointKind_COUNT\r\n}\r\nCTRL_UserBreakpointKind;\r\n\r\ntypedef struct CTRL_UserBreakpoint CTRL_UserBreakpoint;\r\nstruct CTRL_UserBreakpoint\r\n{\r\n  CTRL_UserBreakpointKind kind;\r\n  CTRL_UserBreakpointFlags flags;\r\n  U64 id;\r\n  String8 string;\r\n  TxtPt pt;\r\n  U64 size;\r\n  String8 condition;\r\n};\r\n\r\ntypedef struct CTRL_UserBreakpointNode CTRL_UserBreakpointNode;\r\nstruct CTRL_UserBreakpointNode\r\n{\r\n  CTRL_UserBreakpointNode *next;\r\n  CTRL_UserBreakpoint v;\r\n};\r\n\r\ntypedef struct CTRL_UserBreakpointList CTRL_UserBreakpointList;\r\nstruct CTRL_UserBreakpointList\r\n{\r\n  CTRL_UserBreakpointNode *first;\r\n  CTRL_UserBreakpointNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Handle Types\r\n\r\ntypedef struct CTRL_Handle CTRL_Handle;\r\nstruct CTRL_Handle\r\n{\r\n  CTRL_MachineID machine_id;\r\n  DMN_Handle dmn_handle;\r\n};\r\n\r\ntypedef struct CTRL_HandleNode CTRL_HandleNode;\r\nstruct CTRL_HandleNode\r\n{\r\n  CTRL_HandleNode *next;\r\n  CTRL_Handle v;\r\n};\r\n\r\ntypedef struct CTRL_HandleList CTRL_HandleList;\r\nstruct CTRL_HandleList\r\n{\r\n  CTRL_HandleNode *first;\r\n  CTRL_HandleNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CTRL_HandleArray CTRL_HandleArray;\r\nstruct CTRL_HandleArray\r\n{\r\n  CTRL_Handle *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/ctrl.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Types\r\n\r\ntypedef struct CTRL_Entity CTRL_Entity;\r\nstruct CTRL_Entity\r\n{\r\n  CTRL_Entity *first;\r\n  CTRL_Entity *last;\r\n  CTRL_Entity *next;\r\n  CTRL_Entity *prev;\r\n  CTRL_Entity *parent;\r\n  CTRL_EntityKind kind;\r\n  Arch arch;\r\n  B32 is_frozen;\r\n  B32 is_soloed;\r\n  U32 rgba;\r\n  CTRL_Handle handle;\r\n  U64 id;\r\n  Rng1U64 vaddr_range;\r\n  U64 stack_base;\r\n  U64 timestamp;\r\n  CTRL_UserBreakpointFlags bp_flags;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct CTRL_EntityNode CTRL_EntityNode;\r\nstruct CTRL_EntityNode\r\n{\r\n  CTRL_EntityNode *next;\r\n  CTRL_Entity *v;\r\n};\r\n\r\ntypedef struct CTRL_EntityList CTRL_EntityList;\r\nstruct CTRL_EntityList\r\n{\r\n  CTRL_EntityNode *first;\r\n  CTRL_EntityNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CTRL_EntityArray CTRL_EntityArray;\r\nstruct CTRL_EntityArray\r\n{\r\n  CTRL_Entity **v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CTRL_EntityRec CTRL_EntityRec;\r\nstruct CTRL_EntityRec\r\n{\r\n  CTRL_Entity *next;\r\n  S32 push_count;\r\n  S64 pop_count;\r\n};\r\n\r\ntypedef struct CTRL_EntityHashNode CTRL_EntityHashNode;\r\nstruct CTRL_EntityHashNode\r\n{\r\n  CTRL_EntityHashNode *next;\r\n  CTRL_EntityHashNode *prev;\r\n  CTRL_Entity *entity;\r\n};\r\n\r\ntypedef struct CTRL_EntityHashSlot CTRL_EntityHashSlot;\r\nstruct CTRL_EntityHashSlot\r\n{\r\n  CTRL_EntityHashNode *first;\r\n  CTRL_EntityHashNode *last;\r\n};\r\n\r\ntypedef struct CTRL_EntityStringChunkNode CTRL_EntityStringChunkNode;\r\nstruct CTRL_EntityStringChunkNode\r\n{\r\n  CTRL_EntityStringChunkNode *next;\r\n  U64 size;\r\n};\r\n\r\nread_only global U64 ctrl_entity_string_bucket_chunk_sizes[] =\r\n{\r\n  16,\r\n  64,\r\n  256,\r\n  1024,\r\n  4096,\r\n  16384,\r\n  65536,\r\n  0xffffffffffffffffull,\r\n};\r\n\r\ntypedef struct CTRL_EntityCtx CTRL_EntityCtx;\r\nstruct CTRL_EntityCtx\r\n{\r\n  CTRL_Entity *root;\r\n  U64 hash_slots_count;\r\n  CTRL_EntityHashSlot *hash_slots;\r\n  U64 entity_kind_counts[CTRL_EntityKind_COUNT];\r\n  U64 entity_kind_alloc_gens[CTRL_EntityKind_COUNT];\r\n};\r\n\r\ntypedef struct CTRL_EntityCtxRWStore CTRL_EntityCtxRWStore;\r\nstruct CTRL_EntityCtxRWStore\r\n{\r\n  Arena *arena;\r\n  CTRL_EntityCtx ctx;\r\n  CTRL_Entity *free;\r\n  CTRL_EntityHashNode *hash_node_free;\r\n  CTRL_EntityStringChunkNode *free_string_chunks[ArrayCount(ctrl_entity_string_bucket_chunk_sizes)];\r\n};\r\n\r\ntypedef struct CTRL_EntityCtxLookupAccel CTRL_EntityCtxLookupAccel;\r\nstruct CTRL_EntityCtxLookupAccel\r\n{\r\n  Arena *arena;\r\n  Arena *entity_kind_arrays_arenas[CTRL_EntityKind_COUNT];\r\n  CTRL_EntityArray entity_kind_arrays[CTRL_EntityKind_COUNT];\r\n  U64 entity_kind_arrays_gens[CTRL_EntityKind_COUNT];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Unwind Types\r\n\r\ntypedef U32 CTRL_UnwindFlags;\r\nenum\r\n{\r\n  CTRL_UnwindFlag_Error = (1<<0),\r\n  CTRL_UnwindFlag_Stale = (1<<1),\r\n};\r\n\r\ntypedef struct CTRL_UnwindStepResult CTRL_UnwindStepResult;\r\nstruct CTRL_UnwindStepResult\r\n{\r\n  CTRL_UnwindFlags flags;\r\n};\r\n\r\ntypedef struct CTRL_UnwindFrame CTRL_UnwindFrame;\r\nstruct CTRL_UnwindFrame\r\n{\r\n  void *regs;\r\n};\r\n\r\ntypedef struct CTRL_UnwindFrameNode CTRL_UnwindFrameNode;\r\nstruct CTRL_UnwindFrameNode\r\n{\r\n  CTRL_UnwindFrameNode *next;\r\n  CTRL_UnwindFrameNode *prev;\r\n  CTRL_UnwindFrame v;\r\n};\r\n\r\ntypedef struct CTRL_UnwindFrameArray CTRL_UnwindFrameArray;\r\nstruct CTRL_UnwindFrameArray\r\n{\r\n  CTRL_UnwindFrame *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CTRL_Unwind CTRL_Unwind;\r\nstruct CTRL_Unwind\r\n{\r\n  CTRL_UnwindFrameArray frames;\r\n  CTRL_UnwindFlags flags;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Types\r\n\r\ntypedef struct CTRL_CallStackFrame CTRL_CallStackFrame;\r\nstruct CTRL_CallStackFrame\r\n{\r\n  U64 unwind_count;\r\n  U64 inline_depth;\r\n  void *regs;\r\n};\r\n\r\ntypedef struct CTRL_CallStack CTRL_CallStack;\r\nstruct CTRL_CallStack\r\n{\r\n  CTRL_CallStackFrame *frames;\r\n  U64 frames_count;\r\n  CTRL_CallStackFrame **concrete_frames;\r\n  U64 concrete_frames_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Tree Types\r\n\r\ntypedef struct CTRL_CallStackTreeNode CTRL_CallStackTreeNode;\r\nstruct CTRL_CallStackTreeNode\r\n{\r\n  CTRL_CallStackTreeNode *hash_next;\r\n  CTRL_CallStackTreeNode *first;\r\n  CTRL_CallStackTreeNode *last;\r\n  CTRL_CallStackTreeNode *next;\r\n  CTRL_CallStackTreeNode *parent;\r\n  U64 child_count;\r\n  U64 id;\r\n  CTRL_Handle process;\r\n  U64 vaddr;\r\n  U64 depth;\r\n  CTRL_HandleList threads;\r\n  U64 all_descendant_threads_count;\r\n};\r\n\r\ntypedef struct CTRL_CallStackTree CTRL_CallStackTree;\r\nstruct CTRL_CallStackTree\r\n{\r\n  CTRL_CallStackTreeNode *root;\r\n  U64 slots_count;\r\n  CTRL_CallStackTreeNode **slots;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Trap Types\r\n\r\ntypedef U32 CTRL_TrapFlags;\r\nenum\r\n{\r\n  CTRL_TrapFlag_IgnoreStackPointerCheck = (1<<0),\r\n  CTRL_TrapFlag_SingleStepAfterHit      = (1<<1),\r\n  CTRL_TrapFlag_SaveStackPointer        = (1<<2),\r\n  CTRL_TrapFlag_BeginSpoofMode          = (1<<3),\r\n  CTRL_TrapFlag_EndStepping             = (1<<4),\r\n};\r\n\r\ntypedef struct CTRL_Trap CTRL_Trap;\r\nstruct CTRL_Trap\r\n{\r\n  CTRL_TrapFlags flags;\r\n  U64 vaddr;\r\n};\r\n\r\ntypedef struct CTRL_TrapNode CTRL_TrapNode;\r\nstruct CTRL_TrapNode\r\n{\r\n  CTRL_TrapNode *next;\r\n  CTRL_Trap v;\r\n};\r\n\r\ntypedef struct CTRL_TrapList CTRL_TrapList;\r\nstruct CTRL_TrapList\r\n{\r\n  CTRL_TrapNode *first;\r\n  CTRL_TrapNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct CTRL_Spoof CTRL_Spoof;\r\nstruct CTRL_Spoof\r\n{\r\n  DMN_Handle process;\r\n  DMN_Handle thread;\r\n  U64 vaddr;\r\n  U64 new_ip_value;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Spaces\r\n\r\ntypedef U64 CTRL_EvalSpaceKind;\r\nenum\r\n{\r\n  CTRL_EvalSpaceKind_Entity = E_SpaceKind_FirstUserDefined,\r\n  CTRL_EvalSpaceKind_FirstUserDefined,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Types\r\n\r\ntypedef enum CTRL_MsgKind\r\n{\r\n  CTRL_MsgKind_Null,\r\n  CTRL_MsgKind_Launch,\r\n  CTRL_MsgKind_Attach,\r\n  CTRL_MsgKind_Kill,\r\n  CTRL_MsgKind_KillAll,\r\n  CTRL_MsgKind_Detach,\r\n  CTRL_MsgKind_Run,\r\n  CTRL_MsgKind_SingleStep,\r\n  CTRL_MsgKind_SetUserEntryPoints,\r\n  CTRL_MsgKind_SetModuleDebugInfoPath,\r\n  CTRL_MsgKind_FreezeThread,\r\n  CTRL_MsgKind_ThawThread,\r\n  CTRL_MsgKind_COUNT,\r\n}\r\nCTRL_MsgKind;\r\n\r\ntypedef U32 CTRL_RunFlags;\r\nenum\r\n{\r\n  CTRL_RunFlag_StopOnEntryPoint = (1<<0),\r\n};\r\n\r\ntypedef struct CTRL_Msg CTRL_Msg;\r\nstruct CTRL_Msg\r\n{\r\n  CTRL_MsgKind kind;\r\n  CTRL_RunFlags run_flags;\r\n  CTRL_MsgID msg_id;\r\n  CTRL_Handle entity;\r\n  CTRL_Handle parent;\r\n  U32 entity_id;\r\n  U32 exit_code;\r\n  B32 env_inherit;\r\n  B32 debug_subprocesses;\r\n  U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64];\r\n  String8 path;\r\n  String8List entry_points;\r\n  String8List cmd_line_string_list;\r\n  String8List env_string_list;\r\n  String8 stdout_path;\r\n  String8 stderr_path;\r\n  String8 stdin_path;\r\n  CTRL_TrapList traps;\r\n  CTRL_UserBreakpointList user_bps;\r\n};\r\n\r\ntypedef struct CTRL_MsgNode CTRL_MsgNode;\r\nstruct CTRL_MsgNode\r\n{\r\n  CTRL_MsgNode *next;\r\n  CTRL_Msg v;\r\n};\r\n\r\ntypedef struct CTRL_MsgList CTRL_MsgList;\r\nstruct CTRL_MsgList\r\n{\r\n  CTRL_MsgNode *first;\r\n  CTRL_MsgNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Types\r\n\r\ntypedef enum CTRL_EventKind\r\n{\r\n  CTRL_EventKind_Null,\r\n  CTRL_EventKind_Error,\r\n  \r\n  //- rjf: starts/stops\r\n  CTRL_EventKind_Started,\r\n  CTRL_EventKind_Stopped,\r\n  \r\n  //- rjf: entity creation/deletion\r\n  CTRL_EventKind_NewProc,\r\n  CTRL_EventKind_NewThread,\r\n  CTRL_EventKind_NewModule,\r\n  CTRL_EventKind_EndProc,\r\n  CTRL_EventKind_EndThread,\r\n  CTRL_EventKind_EndModule,\r\n  \r\n  //- rjf: thread freeze state changes\r\n  CTRL_EventKind_ThreadFrozen,\r\n  CTRL_EventKind_ThreadThawed,\r\n  \r\n  //- rjf: debug info changes\r\n  CTRL_EventKind_ModuleDebugInfoPathChange,\r\n  \r\n  //- rjf: debug strings / decorations / markup\r\n  CTRL_EventKind_DebugString,\r\n  CTRL_EventKind_ThreadName,\r\n  CTRL_EventKind_ThreadColor,\r\n  CTRL_EventKind_SetBreakpoint,\r\n  CTRL_EventKind_UnsetBreakpoint,\r\n  CTRL_EventKind_SetVAddrRangeNote,\r\n  \r\n  //- rjf: memory\r\n  CTRL_EventKind_MemReserve,\r\n  CTRL_EventKind_MemCommit,\r\n  CTRL_EventKind_MemDecommit,\r\n  CTRL_EventKind_MemRelease,\r\n  \r\n  CTRL_EventKind_COUNT\r\n}\r\nCTRL_EventKind;\r\n\r\ntypedef enum CTRL_EventCause\r\n{\r\n  CTRL_EventCause_Null,\r\n  CTRL_EventCause_Error,\r\n  CTRL_EventCause_Finished,\r\n  CTRL_EventCause_EntryPoint,\r\n  CTRL_EventCause_UserBreakpoint,\r\n  CTRL_EventCause_InterruptedByTrap,\r\n  CTRL_EventCause_InterruptedByException,\r\n  CTRL_EventCause_InterruptedByHalt,\r\n  CTRL_EventCause_COUNT\r\n}\r\nCTRL_EventCause;\r\n\r\ntypedef enum CTRL_ExceptionKind\r\n{\r\n  CTRL_ExceptionKind_Null,\r\n  CTRL_ExceptionKind_MemoryRead,\r\n  CTRL_ExceptionKind_MemoryWrite,\r\n  CTRL_ExceptionKind_MemoryExecute,\r\n  CTRL_ExceptionKind_CppThrow,\r\n  CTRL_ExceptionKind_COUNT\r\n}\r\nCTRL_ExceptionKind;\r\n\r\ntypedef struct CTRL_Event CTRL_Event;\r\nstruct CTRL_Event\r\n{\r\n  CTRL_EventKind kind;\r\n  CTRL_EventCause cause;\r\n  CTRL_ExceptionKind exception_kind;\r\n  CTRL_MsgID msg_id;\r\n  CTRL_Handle entity;\r\n  CTRL_Handle parent;\r\n  Arch arch;\r\n  U64 u64_code;\r\n  U32 entity_id;\r\n  Rng1U64 vaddr_rng;\r\n  U64 rip_vaddr;\r\n  U64 stack_base;\r\n  U64 tls_root;\r\n  U64 timestamp;\r\n  U32 exception_code;\r\n  U32 rgba;\r\n  CTRL_UserBreakpointFlags bp_flags;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct CTRL_EventNode CTRL_EventNode;\r\nstruct CTRL_EventNode\r\n{\r\n  CTRL_EventNode *next;\r\n  CTRL_Event v;\r\n};\r\n\r\ntypedef struct CTRL_EventList CTRL_EventList;\r\nstruct CTRL_EventList\r\n{\r\n  CTRL_EventNode *first;\r\n  CTRL_EventNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Memory Types\r\n\r\ntypedef struct CTRL_ProcessMemorySlice CTRL_ProcessMemorySlice;\r\nstruct CTRL_ProcessMemorySlice\r\n{\r\n  String8 data;\r\n  U64 *byte_bad_flags;\r\n  U64 *byte_changed_flags;\r\n  B32 stale;\r\n  B32 any_byte_bad;\r\n  B32 any_byte_changed;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Register Cache Types\r\n\r\ntypedef struct CTRL_ThreadRegCacheNode CTRL_ThreadRegCacheNode;\r\nstruct CTRL_ThreadRegCacheNode\r\n{\r\n  CTRL_ThreadRegCacheNode *next;\r\n  CTRL_ThreadRegCacheNode *prev;\r\n  CTRL_Handle handle;\r\n  U64 block_size;\r\n  void *block;\r\n  U64 reg_gen;\r\n};\r\n\r\ntypedef struct CTRL_ThreadRegCacheSlot CTRL_ThreadRegCacheSlot;\r\nstruct CTRL_ThreadRegCacheSlot\r\n{\r\n  CTRL_ThreadRegCacheNode *first;\r\n  CTRL_ThreadRegCacheNode *last;\r\n};\r\n\r\ntypedef struct CTRL_ThreadRegCacheStripe CTRL_ThreadRegCacheStripe;\r\nstruct CTRL_ThreadRegCacheStripe\r\n{\r\n  Arena *arena;\r\n  RWMutex rw_mutex;\r\n};\r\n\r\ntypedef struct CTRL_ThreadRegCache CTRL_ThreadRegCache;\r\nstruct CTRL_ThreadRegCache\r\n{\r\n  U64 slots_count;\r\n  CTRL_ThreadRegCacheSlot *slots;\r\n  U64 stripes_count;\r\n  CTRL_ThreadRegCacheStripe *stripes;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Module Image Info Cache Types\r\n\r\ntypedef struct CTRL_ModuleImageInfoCacheNode CTRL_ModuleImageInfoCacheNode;\r\nstruct CTRL_ModuleImageInfoCacheNode\r\n{\r\n  CTRL_ModuleImageInfoCacheNode *next;\r\n  CTRL_ModuleImageInfoCacheNode *prev;\r\n  CTRL_Handle module;\r\n  Arena *arena;\r\n  PE_IntelPdata *pdatas;\r\n  U64 pdatas_count;\r\n  U64 cfi_rebase;\r\n  B32 is_unwind_eh;\r\n  String8 dwarf_unwind_data;\r\n  EH_FrameHdr eh_frame_hdr;\r\n  EH_PtrCtx eh_ptr_ctx;\r\n  U64 entry_point_voff;\r\n  Rng1U64 tls_vaddr_range;\r\n  String8 initial_debug_info_path;\r\n  Rng1U64 raddbg_section_voff_range;\r\n  String8 raddbg_data;\r\n};\r\n\r\ntypedef struct CTRL_ModuleImageInfoCacheSlot CTRL_ModuleImageInfoCacheSlot;\r\nstruct CTRL_ModuleImageInfoCacheSlot\r\n{\r\n  CTRL_ModuleImageInfoCacheNode *first;\r\n  CTRL_ModuleImageInfoCacheNode *last;\r\n};\r\n\r\ntypedef struct CTRL_ModuleImageInfoCacheStripe CTRL_ModuleImageInfoCacheStripe;\r\nstruct CTRL_ModuleImageInfoCacheStripe\r\n{\r\n  Arena *arena;\r\n  RWMutex rw_mutex;\r\n};\r\n\r\ntypedef struct CTRL_ModuleImageInfoCache CTRL_ModuleImageInfoCache;\r\nstruct CTRL_ModuleImageInfoCache\r\n{\r\n  U64 slots_count;\r\n  CTRL_ModuleImageInfoCacheSlot *slots;\r\n  U64 stripes_count;\r\n  CTRL_ModuleImageInfoCacheStripe *stripes;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Touched Debug Info Directory Cache\r\n\r\ntypedef struct CTRL_DbgDirNode CTRL_DbgDirNode;\r\nstruct CTRL_DbgDirNode\r\n{\r\n  CTRL_DbgDirNode *first;\r\n  CTRL_DbgDirNode *last;\r\n  CTRL_DbgDirNode *next;\r\n  CTRL_DbgDirNode *prev;\r\n  CTRL_DbgDirNode *parent;\r\n  String8 name;\r\n  U64 search_count;\r\n  U64 child_count;\r\n  U64 module_direct_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Control Thread Evaluation Scopes\r\n\r\ntypedef struct CTRL_EvalScope CTRL_EvalScope;\r\nstruct CTRL_EvalScope\r\n{\r\n  Access *access;\r\n  E_BaseCtx base_ctx;\r\n  E_IRCtx ir_ctx;\r\n  E_InterpretCtx interpret_ctx;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Module Requirement Cache Types\r\n\r\ntypedef struct CTRL_ModuleReqCacheNode CTRL_ModuleReqCacheNode;\r\nstruct CTRL_ModuleReqCacheNode\r\n{\r\n  CTRL_ModuleReqCacheNode *next;\r\n  CTRL_Handle module;\r\n  B32 required;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Wakeup Hook Function Types\r\n\r\n#define CTRL_WAKEUP_FUNCTION_DEF(name) void name(void)\r\ntypedef CTRL_WAKEUP_FUNCTION_DEF(CTRL_WakeupFunctionType);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Types\r\n\r\ntypedef struct CTRL_State CTRL_State;\r\nstruct CTRL_State\r\n{\r\n  Arena *arena;\r\n  CTRL_WakeupFunctionType *wakeup_hook;\r\n  \r\n  // rjf: name -> register/alias hash tables for eval\r\n  E_String2NumMap arch_string2reg_tables[Arch_COUNT];\r\n  E_String2NumMap arch_string2alias_tables[Arch_COUNT];\r\n  \r\n  // rjf: caches\r\n  CTRL_ThreadRegCache thread_reg_cache;\r\n  CTRL_ModuleImageInfoCache module_image_info_cache;\r\n  \r\n  // rjf: generations\r\n  U64 run_gen;\r\n  U64 mem_gen;\r\n  U64 reg_gen;\r\n  \r\n  // rjf: user -> ctrl msg ring buffer\r\n  U64 u2c_ring_size;\r\n  U8 *u2c_ring_base;\r\n  U64 u2c_ring_write_pos;\r\n  U64 u2c_ring_read_pos;\r\n  Mutex u2c_ring_mutex;\r\n  CondVar u2c_ring_cv;\r\n  \r\n  // rjf: ctrl -> user event ring buffer\r\n  U64 c2u_ring_size;\r\n  U64 c2u_ring_max_string_size;\r\n  U8 *c2u_ring_base;\r\n  U64 c2u_ring_write_pos;\r\n  U64 c2u_ring_read_pos;\r\n  Mutex c2u_ring_mutex;\r\n  CondVar c2u_ring_cv;\r\n  \r\n  // rjf: ctrl thread state\r\n  U64 ctrl_thread_run_state;\r\n  String8 ctrl_thread_log_path;\r\n  Thread ctrl_thread;\r\n  Log *ctrl_thread_log;\r\n  RWMutex ctrl_thread_entity_ctx_rw_mutex;\r\n  CTRL_EntityCtxRWStore *ctrl_thread_entity_store;\r\n  E_Cache *ctrl_thread_eval_cache;\r\n  Arena *ctrl_thread_msg_process_arena;\r\n  Arena *dmn_event_arena;\r\n  DMN_EventNode *first_dmn_event_node;\r\n  DMN_EventNode *last_dmn_event_node;\r\n  DMN_EventNode *free_dmn_event_node;\r\n  Arena *user_entry_point_arena;\r\n  String8List user_entry_points;\r\n  U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64];\r\n  U64 process_counter;\r\n  Arena *dbg_dir_arena;\r\n  CTRL_DbgDirNode *dbg_dir_root;\r\n  U64 module_req_cache_slots_count;\r\n  CTRL_ModuleReqCacheNode **module_req_cache_slots;\r\n  String8List msg_user_bp_touched_files;\r\n  String8List msg_user_bp_touched_symbols;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal CTRL_State *ctrl_state = 0;\r\nread_only global CTRL_Entity ctrl_entity_nil =\r\n{\r\n  &ctrl_entity_nil,\r\n  &ctrl_entity_nil,\r\n  &ctrl_entity_nil,\r\n  &ctrl_entity_nil,\r\n  &ctrl_entity_nil,\r\n};\r\nread_only global CTRL_CallStackTreeNode ctrl_call_stack_tree_node_nil =\r\n{\r\n  0,\r\n  &ctrl_call_stack_tree_node_nil,\r\n  &ctrl_call_stack_tree_node_nil,\r\n  &ctrl_call_stack_tree_node_nil,\r\n  &ctrl_call_stack_tree_node_nil,\r\n};\r\nthread_static CTRL_EntityCtxLookupAccel *ctrl_entity_ctx_lookup_accel = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Logging Markup\r\n\r\n#define CTRL_CtrlThreadLogScope DeferLoop(log_scope_begin(), ctrl_thread__end_and_flush_log())\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\ninternal U64 ctrl_hash_from_string(String8 string);\r\ninternal U64 ctrl_hash_from_handle(CTRL_Handle handle);\r\ninternal CTRL_EventCause ctrl_event_cause_from_dmn_event_kind(DMN_EventKind event_kind);\r\ninternal CTRL_ExceptionKind ctrl_exception_kind_from_dmn(DMN_ExceptionKind kind);\r\ninternal String8 ctrl_string_from_event_kind(CTRL_EventKind kind);\r\ninternal String8 ctrl_string_from_msg_kind(CTRL_MsgKind kind);\r\ninternal CTRL_EntityKind ctrl_entity_kind_from_string(String8 string);\r\ninternal DMN_TrapFlags ctrl_dmn_trap_flags_from_user_breakpoint_flags(CTRL_UserBreakpointFlags flags);\r\ninternal CTRL_UserBreakpointFlags ctrl_user_breakpoint_flags_from_dmn_trap_flags(DMN_TrapFlags flags);\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type Functions\r\n\r\ninternal CTRL_Handle ctrl_handle_zero(void);\r\ninternal CTRL_Handle ctrl_handle_make(CTRL_MachineID machine_id, DMN_Handle dmn_handle);\r\ninternal B32 ctrl_handle_match(CTRL_Handle a, CTRL_Handle b);\r\ninternal void ctrl_handle_list_push(Arena *arena, CTRL_HandleList *list, CTRL_Handle *pair);\r\ninternal CTRL_HandleList ctrl_handle_list_copy(Arena *arena, CTRL_HandleList *src);\r\ninternal CTRL_HandleArray ctrl_handle_array_from_list(Arena  *arena, CTRL_HandleList *src);\r\ninternal String8 ctrl_string_from_handle(Arena *arena, CTRL_Handle handle);\r\ninternal CTRL_Handle ctrl_handle_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Trap Type Functions\r\n\r\ninternal void ctrl_trap_list_push(Arena *arena, CTRL_TrapList *list, CTRL_Trap *trap);\r\ninternal CTRL_TrapList ctrl_trap_list_copy(Arena *arena, CTRL_TrapList *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: User Breakpoint Type Functions\r\n\r\ninternal void ctrl_user_breakpoint_list_push(Arena *arena, CTRL_UserBreakpointList *list, CTRL_UserBreakpoint *bp);\r\ninternal CTRL_UserBreakpointList ctrl_user_breakpoint_list_copy(Arena *arena, CTRL_UserBreakpointList *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Type Functions\r\n\r\n//- rjf: deep copying\r\ninternal void ctrl_msg_deep_copy(Arena *arena, CTRL_Msg *dst, CTRL_Msg *src);\r\n\r\n//- rjf: list building\r\ninternal CTRL_Msg *ctrl_msg_list_push(Arena *arena, CTRL_MsgList *list);\r\ninternal CTRL_MsgList ctrl_msg_list_deep_copy(Arena *arena, CTRL_MsgList *src);\r\ninternal void ctrl_msg_list_concat_in_place(CTRL_MsgList *dst, CTRL_MsgList *src);\r\n\r\n//- rjf: serialization\r\ninternal String8 ctrl_serialized_string_from_msg_list(Arena *arena, CTRL_MsgList *msgs);\r\ninternal CTRL_MsgList ctrl_msg_list_from_serialized_string(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Type Functions\r\n\r\n//- rjf: list building\r\ninternal CTRL_Event *ctrl_event_list_push(Arena *arena, CTRL_EventList *list);\r\ninternal void ctrl_event_list_concat_in_place(CTRL_EventList *dst, CTRL_EventList *to_push);\r\n\r\n//- rjf: serialization\r\ninternal String8 ctrl_serialized_string_from_event(Arena *arena, CTRL_Event *event, U64 max);\r\ninternal CTRL_Event ctrl_event_from_serialized_string(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Type Functions\r\n\r\n//- rjf: entity list data structures\r\ninternal void ctrl_entity_list_push(Arena *arena, CTRL_EntityList *list, CTRL_Entity *entity);\r\ninternal CTRL_EntityList ctrl_entity_list_from_handle_list(Arena *arena, CTRL_EntityCtx *ctx, CTRL_HandleList *list);\r\n#define ctrl_entity_list_first(list) ((list)->first ? (list)->first->v : &ctrl_entity_nil)\r\n\r\n//- rjf: entity array data structure\r\ninternal CTRL_EntityArray ctrl_entity_array_from_list(Arena *arena, CTRL_EntityList *list);\r\n#define ctrl_entity_array_first(array) ((array)->count != 0 ? (array)->v[0] : &ctrl_entity_nil)\r\n\r\n//- rjf: entity context (entity group read-only) functions\r\ninternal CTRL_Entity *ctrl_entity_from_handle(CTRL_EntityCtx *ctx, CTRL_Handle handle);\r\ninternal CTRL_Entity *ctrl_entity_child_from_kind(CTRL_Entity *parent, CTRL_EntityKind kind);\r\ninternal CTRL_Entity *ctrl_entity_ancestor_from_kind(CTRL_Entity *entity, CTRL_EntityKind kind);\r\ninternal CTRL_Entity *ctrl_process_from_entity(CTRL_Entity *entity);\r\ninternal CTRL_Entity *ctrl_module_from_process_vaddr(CTRL_Entity *process, U64 vaddr);\r\ninternal DI_Key ctrl_dbgi_key_from_module(CTRL_Entity *module);\r\ninternal CTRL_Entity *ctrl_module_from_thread_candidates(CTRL_EntityCtx *ctx, CTRL_Entity *thread, CTRL_EntityList *candidates);\r\ninternal U64 ctrl_vaddr_from_voff(CTRL_Entity *module, U64 voff);\r\ninternal U64 ctrl_voff_from_vaddr(CTRL_Entity *module, U64 vaddr);\r\ninternal Rng1U64 ctrl_vaddr_range_from_voff_range(CTRL_Entity *module, Rng1U64 voff_range);\r\ninternal Rng1U64 ctrl_voff_range_from_vaddr_range(CTRL_Entity *module, Rng1U64 vaddr_range);\r\ninternal B32 ctrl_entity_tree_is_frozen(CTRL_Entity *root);\r\n\r\n//- rjf: entity tree iteration\r\ninternal CTRL_EntityRec ctrl_entity_rec_depth_first(CTRL_Entity *entity, CTRL_Entity *subtree_root, U64 sib_off, U64 child_off);\r\n#define ctrl_entity_rec_depth_first_pre(entity, subtree_root)  ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, next), OffsetOf(CTRL_Entity, first))\r\n#define ctrl_entity_rec_depth_first_post(entity, subtree_root) ctrl_entity_rec_depth_first((entity), (subtree_root), OffsetOf(CTRL_Entity, prev), OffsetOf(CTRL_Entity, last))\r\n\r\n//- rjf: entity ctx r/w store state functions\r\ninternal CTRL_EntityCtxRWStore *ctrl_entity_ctx_rw_store_alloc(void);\r\ninternal void ctrl_entity_ctx_rw_store_release(CTRL_EntityCtxRWStore *store);\r\n\r\n//- rjf: string allocation/deletion\r\ninternal U64 ctrl_name_bucket_num_from_string_size(U64 size);\r\ninternal String8 ctrl_entity_string_alloc(CTRL_EntityCtxRWStore *store, String8 string);\r\ninternal void ctrl_entity_string_release(CTRL_EntityCtxRWStore *store, String8 string);\r\n\r\n//- rjf: entity construction/deletion\r\ninternal CTRL_Entity *ctrl_entity_alloc(CTRL_EntityCtxRWStore *store, CTRL_Entity *parent, CTRL_EntityKind kind, Arch arch, CTRL_Handle handle, U64 id);\r\ninternal void ctrl_entity_release(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity);\r\n\r\n//- rjf: entity equipment\r\ninternal void ctrl_entity_equip_string(CTRL_EntityCtxRWStore *store, CTRL_Entity *entity, String8 string);\r\n\r\n//- rjf: accelerated entity context lookups\r\ninternal CTRL_EntityCtxLookupAccel *ctrl_thread_entity_ctx_lookup_accel(void);\r\ninternal CTRL_EntityArray ctrl_entity_array_from_kind(CTRL_EntityCtx *ctx, CTRL_EntityKind kind);\r\ninternal CTRL_EntityList ctrl_modules_from_dbgi_key(Arena *arena, CTRL_EntityCtx *ctx, DI_Key dbgi_key);\r\ninternal CTRL_Entity *ctrl_thread_from_id(CTRL_EntityCtx *ctx, U64 id);\r\n\r\n//- rjf: applying events to entity caches\r\ninternal void ctrl_entity_store_apply_events(CTRL_EntityCtxRWStore *store, CTRL_EventList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void ctrl_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Wakeup Callback Registration\r\n\r\ninternal void ctrl_set_wakeup_hook(CTRL_WakeupFunctionType *wakeup_hook);\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Register Functions\r\n\r\n//- rjf: thread register cache reading\r\ninternal void *ctrl_reg_block_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle handle);\r\ninternal U64 ctrl_tls_root_vaddr_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle);\r\ninternal U64 ctrl_rip_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle);\r\ninternal U64 ctrl_rsp_from_thread(CTRL_EntityCtx *ctx, CTRL_Handle handle);\r\n\r\n//- rjf: thread register writing\r\ninternal B32 ctrl_thread_write_reg_block(CTRL_Handle thread, void *block);\r\n\r\n////////////////////////////////\r\n//~ rjf: Module Image Info Functions\r\n\r\n//- rjf: cache lookups\r\ninternal PE_IntelPdata *ctrl_intel_pdata_from_module_voff(Arena *arena, CTRL_Handle module_handle, U64 voff);\r\ninternal U64 ctrl_entry_point_voff_from_module(CTRL_Handle module_handle);\r\ninternal Rng1U64 ctrl_tls_vaddr_range_from_module(CTRL_Handle module_handle);\r\ninternal String8 ctrl_initial_debug_info_path_from_module(Arena *arena, CTRL_Handle module_handle);\r\ninternal String8 ctrl_raddbg_data_from_module(Arena *arena, CTRL_Handle module_handle);\r\n\r\n////////////////////////////////\r\n//~ Process Info Functions\r\n\r\ninternal Arch ctrl_arch_from_process_handle(CTRL_Handle process_handle);\r\n\r\n////////////////////////////////\r\n//~ rjf: Unwinding Functions\r\n\r\n//- rjf: unwind deep copier\r\ninternal CTRL_Unwind ctrl_unwind_deep_copy(Arena *arena, Arch arch, CTRL_Unwind *src);\r\n\r\n//- DWARF\r\ninternal CTRL_UnwindStepResult ctrl_unwind_step__dwarf(CTRL_Handle process_handle, CTRL_Handle module_handle, Arch arch, void *regs, U64 endt_us);\r\n\r\n//- rjf: [x64]\r\ninternal REGS_Reg64 *ctrl_unwind_reg_from_pe_gpr_reg__pe_x64(REGS_RegBlockX64 *regs, PE_UnwindGprRegX64 gpr_reg);\r\ninternal CTRL_UnwindStepResult ctrl_unwind_step__pe_x64(CTRL_Handle process_handle, CTRL_Handle module_handle, U64 module_base_vaddr, REGS_RegBlockX64 *regs, U64 endt_us);\r\n\r\n//- rjf: abstracted unwind step\r\ninternal CTRL_UnwindStepResult ctrl_unwind_step(CTRL_Handle process, CTRL_Handle module, U64 module_base_vaddr, Arch arch, void *reg_block, U64 endt_us);\r\n\r\n//- rjf: abstracted full unwind\r\ninternal CTRL_Unwind ctrl_unwind_from_thread(Arena *arena, CTRL_EntityCtx *ctx, CTRL_Handle thread, U64 endt_us);\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Building Functions\r\n\r\ninternal CTRL_CallStack ctrl_call_stack_from_unwind(Arena *arena, CTRL_Entity *process, CTRL_Unwind *base_unwind);\r\ninternal CTRL_CallStackFrame *ctrl_call_stack_frame_from_unwind_and_inline_depth(CTRL_CallStack *call_stack, U64 unwind_count, U64 inline_depth);\r\n\r\n////////////////////////////////\r\n//~ rjf: Halting All Attached Processes\r\n\r\ninternal void ctrl_halt(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared Accessor Functions\r\n\r\n//- rjf: generation counters\r\ninternal U64 ctrl_run_gen(void);\r\ninternal U64 ctrl_mem_gen(void);\r\ninternal U64 ctrl_reg_gen(void);\r\n\r\n//- rjf: name -> register/alias hash tables, for eval\r\ninternal E_String2NumMap *ctrl_string2reg_from_arch(Arch arch);\r\ninternal E_String2NumMap *ctrl_string2alias_from_arch(Arch arch);\r\n\r\n////////////////////////////////\r\n//~ rjf: Control-Thread Functions\r\n\r\n//- rjf: user -> control thread communication\r\ninternal B32 ctrl_u2c_push_msgs(CTRL_MsgList *msgs, U64 endt_us);\r\ninternal CTRL_MsgList ctrl_u2c_pop_msgs(Arena *arena);\r\n\r\n//- rjf: control -> user thread communication\r\ninternal void ctrl_c2u_push_events(CTRL_EventList *events);\r\ninternal CTRL_EventList ctrl_c2u_pop_events(Arena *arena);\r\n\r\n//- rjf: entry point\r\ninternal void ctrl_thread__entry_point(void *p);\r\n\r\n//- rjf: breakpoint resolution\r\ninternal void ctrl_thread__append_resolved_module_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_Handle module, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out);\r\ninternal void ctrl_thread__append_resolved_process_user_bp_traps(Arena *arena, CTRL_EvalScope *eval_scope, CTRL_Handle process, CTRL_UserBreakpointList *user_bps, DMN_TrapChunkList *traps_out);\r\ninternal void ctrl_thread__append_program_defined_bp_traps(Arena *arena, CTRL_Entity *bp, DMN_TrapChunkList *traps_out);\r\n\r\n//- rjf: module lifetime open/close work\r\ninternal void ctrl_thread__module_open(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range, String8 path, Rng1U64 elf_phdr_vrange, U64 elf_phdr_entsize);\r\ninternal void ctrl_thread__module_close(CTRL_Handle process, CTRL_Handle module, Rng1U64 vaddr_range);\r\n\r\n//- rjf: attached process running/event gathering\r\ninternal DMN_Event *ctrl_thread__next_dmn_event(Arena *arena, DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg, DMN_RunCtrls *run_ctrls, CTRL_Spoof *spoof);\r\n\r\n//- rjf: eval helpers\ninternal U64 ctrl_eval_space_gen(E_Space space);\r\ninternal B32 ctrl_eval_space_read(E_Space space, void *out, Rng1U64 vaddr_range);\r\n\r\n//- rjf: control thread eval scopes\r\ninternal CTRL_EvalScope *ctrl_thread__eval_scope_begin(Arena *arena, CTRL_UserBreakpointList *user_bps, CTRL_Entity *thread);\r\ninternal void ctrl_thread__eval_scope_end(CTRL_EvalScope *scope);\r\n\r\n//- rjf: log flusher\r\ninternal void ctrl_thread__end_and_flush_log(void);\r\n\r\n//- rjf: msg kind implementations\r\ninternal void ctrl_thread__launch(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\ninternal void ctrl_thread__attach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\ninternal void ctrl_thread__kill(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\ninternal void ctrl_thread__kill_all(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\ninternal void ctrl_thread__detach(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\ninternal void ctrl_thread__run(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\ninternal void ctrl_thread__single_step(DMN_CtrlCtx *ctrl_ctx, CTRL_Msg *msg);\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Memory Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact ctrl_memory_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void ctrl_memory_artifact_destroy(AC_Artifact artifact);\r\ninternal C_Key ctrl_key_from_process_vaddr_range(CTRL_Handle process, Rng1U64 vaddr_range, B32 zero_terminated, B32 wait_for_fresh, U64 endt_us, B32 *out_is_stale);\r\n\r\n//- rjf: process memory reading helpers\r\ninternal CTRL_ProcessMemorySlice ctrl_process_memory_slice_from_vaddr_range(Arena *arena, CTRL_Handle process, Rng1U64 range, B32 wait_for_fresh, U64 endt_us);\r\ninternal B32 ctrl_process_memory_read(CTRL_Handle process, Rng1U64 range, B32 *is_stale_out, void *out, U64 endt_us);\r\n#define ctrl_process_memory_read_struct(process, vaddr, is_stale_out, ptr, endt_us) ctrl_process_memory_read((process), r1u64((vaddr), (vaddr)+(sizeof(*(ptr)))), (is_stale_out), (ptr), (endt_us))\r\n\r\n//- rjf: process memory writing\r\ninternal B32 ctrl_process_write(CTRL_Handle process, Rng1U64 range, void *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact ctrl_call_stack_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void ctrl_call_stack_artifact_destroy(AC_Artifact artifact);\r\ninternal CTRL_CallStack ctrl_call_stack_from_thread(Access *access, CTRL_Handle thread_handle, B32 high_priority, U64 endt_us);\r\n\r\n////////////////////////////////\r\n//~ rjf: Call Stack Tree Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact ctrl_call_stack_tree_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void ctrl_call_stack_tree_artifact_destroy(AC_Artifact artifact);\r\ninternal CTRL_CallStackTree ctrl_call_stack_tree(Access *access, U64 endt_us);\r\n\r\n#endif // CTRL_CORE_H\r\n"
  },
  {
    "path": "src/ctrl/ctrl_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0x969696ff\r\n\r\n#include \"ctrl_core.c\"\r\n"
  },
  {
    "path": "src/ctrl/ctrl_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef CTRL_INC_H\r\n#define CTRL_INC_H\r\n\r\n////////////////////////////////\r\n//~ NOTE(rjf): Control Layer Overview (2023/8/29)\r\n//\r\n// This layer's purpose is to provide access to the asynchronously-running, low\r\n// level parts of a debugger, running on the debugger client. This primarily\r\n// consists of process control, using the Demon layer (the lower level\r\n// abstraction layer for process control, across multiple OSes), but including\r\n// higher-level concepts, like stepping, breakpoint resolution, conditional\r\n// breakpoint evaluation, and so on. Right now, this just includes process\r\n// control *local to the debugger client machine*. But in the future, this can\r\n// also include communication to multiple target machines, all running their\r\n// own process controller, using the Demon layer.\r\n//\r\n// This part of a debugger must run asynchronously to prevent blocking the UI -\r\n// ideally our debugger is designed such that, if targets are running, the\r\n// debugger frontend is still usable for a variety of purposes. So, in short,\r\n// the asynchronously-running \"control thread\", implemented by this layer, is\r\n// tasked with communicating with a separately executing \"user thread\". This\r\n// communication happens in two directions - `user -> ctrl`, and the reverse,\r\n// `ctrl -> user`.\r\n//\r\n// In the case of `user -> ctrl` communication, this is done with a ring buffer\r\n// of \"messages\" (`CTRL_Msg`), pushed via `ctrl_u2c_push_msgs`. These messages\r\n// include commands like: launching targets, attaching to targets, killing\r\n// targets, detaching from targets, stepping/running, or single stepping.\r\n//\r\n// In the case of `ctrl -> user` communication, this is done with a ring buffer\r\n// of \"events\" (`CTRL_Event`), popped via `ctrl_c2u_pop_events`. These events\r\n// include information about what happened during the execution of targets -\r\n// including: process/module/thread creation, process/module/thread deletion,\r\n// debug strings, thread name events, memory allocation events, and stop events\r\n// (where stops can be caused by: user breakpoints, traps set for stepping,\r\n// exceptions, halts, or errors).\r\n//\r\n// The various stepping algorithms are implemented with two concepts: (a) the\r\n// \"trap net\", and (b) \"spoofs\".\r\n//\r\n// A \"trap net\" is a term which refers to a set of addresses paired with a set\r\n// of behavioral flags. Before targets run, trap instructions are written to\r\n// these addresses. After targets stop, these addresses are reset to their\r\n// original bytes. These trap instructions cause the debugger's targets to\r\n// stop executing, and based on which behavioral flags are associated with\r\n// the instruction causing the stop, the control thread may adjust parameters\r\n// used for running, then continue execution, or it will not resume target\r\n// execution, and will report stopped events. These behavioral flags can\r\n// include: single-stepping the stopped thread to execute the instruction at\r\n// the trap location, saving a stack pointer \"check value\" (where this check\r\n// value is compared against when making decisions about whether to continue\r\n// running or not), and so on. It's complicated to unpack why exactly these\r\n// behaviors are useful, but the TL;DR of it is that they are used for a\r\n// variety of stepping behaviors. For example, when doing a \"step into\" step,\r\n// a `call` instruction can have a trap set at it, and will be marked with\r\n// a \"single-step-after\" trap flag, as well as the \"end stepping\" trap flag,\r\n// such that the step operation will complete after the `call` has executed.\r\n//\r\n// A \"spoof\" is a feature the control layer uses to detect when some thread\r\n// returns from a particular sub-callstack. This is useful when implementing\r\n// \"step over\" in functions that may be recursive. In short, unlike a trap,\r\n// which writes a trap instruction (like `int3`) into an instruction stream,\r\n// a spoof overwrites a *return address* on some thread's *stack*. This return\r\n// address is not a valid address for executing code -- it is simply a value\r\n// that the debugger can recognize, such that it is notified when the thread\r\n// returns from some level in a callstack. When the thread exits some function,\r\n// it will return to the \"spoofed\" address, and it will immediately hit an\r\n// exception, because the spoofed address will not be a valid address for\r\n// code execution. At that point, the debugger can move the thread back to\r\n// the pre-spoof return address, and resume execution.\r\n\r\n#include \"ctrl_core.h\"\r\n\r\n#endif // CTRL_INC_H\r\n"
  },
  {
    "path": "src/ctrl/generated/ctrl.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 ctrl_entity_kind_code_name_table[12] =\r\n{\r\n{0},\r\nstr8_lit_comp(\"root\"),\r\nstr8_lit_comp(\"machine\"),\r\nstr8_lit_comp(\"process\"),\r\nstr8_lit_comp(\"thread\"),\r\nstr8_lit_comp(\"module\"),\r\nstr8_lit_comp(\"entry_point\"),\r\nstr8_lit_comp(\"debug_info_path\"),\r\nstr8_lit_comp(\"pending_thread_name\"),\r\nstr8_lit_comp(\"pending_thread_color\"),\r\nstr8_lit_comp(\"breakpoint\"),\r\nstr8_lit_comp(\"address_range_annotation\"),\r\n};\r\n\r\nString8 ctrl_entity_kind_display_string_table[12] =\r\n{\r\n{0},\r\nstr8_lit_comp(\"Root\"),\r\nstr8_lit_comp(\"Machine\"),\r\nstr8_lit_comp(\"Process\"),\r\nstr8_lit_comp(\"Thread\"),\r\nstr8_lit_comp(\"Module\"),\r\nstr8_lit_comp(\"EntryPoint\"),\r\nstr8_lit_comp(\"DebugInfoPath\"),\r\nstr8_lit_comp(\"PendingThreadName\"),\r\nstr8_lit_comp(\"PendingThreadColor\"),\r\nstr8_lit_comp(\"Breakpoint\"),\r\nstr8_lit_comp(\"AddressRangeAnnotation\"),\r\n};\r\n\r\nU32 ctrl_exception_code_kind_code_table[38] =\r\n{\r\n0,\r\n0x40010005,\r\n0x40010008,\r\n0x40080201,\r\n0x40080202,\r\n0x0000071a,\r\n0x80000002,\r\n0xc0000005,\r\n0xc0000006,\r\n0xc0000008,\r\n0xc0000017,\r\n0xc000001d,\r\n0xc0000025,\r\n0xc0000026,\r\n0xc000008c,\r\n0xc000008d,\r\n0xc000008e,\r\n0xc000008f,\r\n0xc0000090,\r\n0xc0000091,\r\n0xc0000092,\r\n0xc0000093,\r\n0xc0000094,\r\n0xc0000095,\r\n0xc0000096,\r\n0xc00000fd,\r\n0xc0000135,\r\n0xc0000138,\r\n0xc0000139,\r\n0xc0000142,\r\n0xc00002b4,\r\n0xc00002b5,\r\n0xc0000420,\r\n0xc06d007e,\r\n0xc06d007f,\r\n0xe073616e,\r\n0xe0736171,\r\n0x0000087a,\r\n};\r\n\r\nString8 ctrl_exception_code_kind_display_string_table[38] =\r\n{\r\n{0},\r\nstr8_lit_comp(\"(Win32) Control-C\"),\r\nstr8_lit_comp(\"(Win32) Control-Break\"),\r\nstr8_lit_comp(\"(Win32) WinRT Originate Error\"),\r\nstr8_lit_comp(\"(Win32) WinRT Transform Error\"),\r\nstr8_lit_comp(\"(Win32) RPC Call Cancelled\"),\r\nstr8_lit_comp(\"(Win32) Data Type Misalignment\"),\r\nstr8_lit_comp(\"(Win32) Access Violation\"),\r\nstr8_lit_comp(\"(Win32) In Page Error\"),\r\nstr8_lit_comp(\"(Win32) Invalid Handle Specified\"),\r\nstr8_lit_comp(\"(Win32) Not Enough Quota\"),\r\nstr8_lit_comp(\"(Win32) Illegal Instruction\"),\r\nstr8_lit_comp(\"(Win32) Cannot Continue From Exception\"),\r\nstr8_lit_comp(\"(Win32) Invalid Exception Disposition Returned By Handler\"),\r\nstr8_lit_comp(\"(Win32) Array Bounds Exceeded\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Denormal Operand\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Division By Zero\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Inexact Result\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Invalid Operation\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Overflow\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Stack Check\"),\r\nstr8_lit_comp(\"(Win32) Floating-Point Underflow\"),\r\nstr8_lit_comp(\"(Win32) Integer Division By Zero\"),\r\nstr8_lit_comp(\"(Win32) Integer Overflow\"),\r\nstr8_lit_comp(\"(Win32) Privileged Instruction\"),\r\nstr8_lit_comp(\"(Win32) Stack Overflow\"),\r\nstr8_lit_comp(\"(Win32) Unable To Locate DLL\"),\r\nstr8_lit_comp(\"(Win32) Ordinal Not Found\"),\r\nstr8_lit_comp(\"(Win32) Entry Point Not Found\"),\r\nstr8_lit_comp(\"(Win32) DLL Initialization Failed\"),\r\nstr8_lit_comp(\"(Win32) Floating Point SSE Multiple Faults\"),\r\nstr8_lit_comp(\"(Win32) Floating Point SSE Multiple Traps\"),\r\nstr8_lit_comp(\"(Win32) Assertion Failed\"),\r\nstr8_lit_comp(\"(Win32) Module Not Found\"),\r\nstr8_lit_comp(\"(Win32) Procedure Not Found\"),\r\nstr8_lit_comp(\"(Win32) Sanitizer Error Detected\"),\r\nstr8_lit_comp(\"(Win32) Sanitizer Raw Access Violation\"),\r\nstr8_lit_comp(\"(Win32) DirectX Debug Layer\"),\r\n};\r\n\r\nString8 ctrl_exception_code_kind_lowercase_code_string_table[38] =\r\n{\r\n{0},\r\nstr8_lit_comp(\"win32_ctrl_c\"),\r\nstr8_lit_comp(\"win32_ctrl_break\"),\r\nstr8_lit_comp(\"win32_win_rt_originate_error\"),\r\nstr8_lit_comp(\"win32_win_rt_transform_error\"),\r\nstr8_lit_comp(\"win32_rpc_call_cancelled\"),\r\nstr8_lit_comp(\"win32_datatype_misalignment\"),\r\nstr8_lit_comp(\"win32_access_violation\"),\r\nstr8_lit_comp(\"win32_in_page_error\"),\r\nstr8_lit_comp(\"win32_invalid_handle\"),\r\nstr8_lit_comp(\"win32_not_enough_quota\"),\r\nstr8_lit_comp(\"win32_illegal_instruction\"),\r\nstr8_lit_comp(\"win32_cannot_continue_exception\"),\r\nstr8_lit_comp(\"win32_invalid_exception_disposition\"),\r\nstr8_lit_comp(\"win32_array_bounds_exceeded\"),\r\nstr8_lit_comp(\"win32_floating_point_denormal_operand\"),\r\nstr8_lit_comp(\"win32_floating_point_division_by_zero\"),\r\nstr8_lit_comp(\"win32_floating_point_inexact_result\"),\r\nstr8_lit_comp(\"win32_floating_point_invalid_operation\"),\r\nstr8_lit_comp(\"win32_floating_point_overflow\"),\r\nstr8_lit_comp(\"win32_floating_point_stack_check\"),\r\nstr8_lit_comp(\"win32_floating_point_underflow\"),\r\nstr8_lit_comp(\"win32_integer_division_by_zero\"),\r\nstr8_lit_comp(\"win32_integer_overflow\"),\r\nstr8_lit_comp(\"win32_privileged_instruction\"),\r\nstr8_lit_comp(\"win32_stack_overflow\"),\r\nstr8_lit_comp(\"win32_unable_to_locate_dll\"),\r\nstr8_lit_comp(\"win32_ordinal_not_found\"),\r\nstr8_lit_comp(\"win32_entry_point_not_found\"),\r\nstr8_lit_comp(\"win32_dll_initialization_failed\"),\r\nstr8_lit_comp(\"win32_floating_point_sse_multiple_faults\"),\r\nstr8_lit_comp(\"win32_floating_point_sse_multiple_traps\"),\r\nstr8_lit_comp(\"win32_assertion_failed\"),\r\nstr8_lit_comp(\"win32_module_not_found\"),\r\nstr8_lit_comp(\"win32_procedure_not_found\"),\r\nstr8_lit_comp(\"win32_sanitizer_error_detected\"),\r\nstr8_lit_comp(\"win32_sanitizer_raw_access_violation\"),\r\nstr8_lit_comp(\"win32_directx_debug_layer\"),\r\n};\r\n\r\nB8 ctrl_exception_code_kind_default_enable_table[38] =\r\n{\r\n0,\r\n1,\r\n1,\r\n0,\r\n0,\r\n0,\r\n0,\r\n1,\r\n0,\r\n1,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n1,\r\n0,\r\n0,\r\n1,\r\n0,\r\n1,\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/ctrl/generated/ctrl.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef CTRL_META_H\r\n#define CTRL_META_H\r\n\r\ntypedef enum CTRL_EntityKind\r\n{\r\nCTRL_EntityKind_Null,\r\nCTRL_EntityKind_Root,\r\nCTRL_EntityKind_Machine,\r\nCTRL_EntityKind_Process,\r\nCTRL_EntityKind_Thread,\r\nCTRL_EntityKind_Module,\r\nCTRL_EntityKind_EntryPoint,\r\nCTRL_EntityKind_DebugInfoPath,\r\nCTRL_EntityKind_PendingThreadName,\r\nCTRL_EntityKind_PendingThreadColor,\r\nCTRL_EntityKind_Breakpoint,\r\nCTRL_EntityKind_AddressRangeAnnotation,\r\nCTRL_EntityKind_COUNT,\r\n} CTRL_EntityKind;\r\n\r\ntypedef enum CTRL_ExceptionCodeKind\r\n{\r\nCTRL_ExceptionCodeKind_Null,\r\nCTRL_ExceptionCodeKind_Win32CtrlC,\r\nCTRL_ExceptionCodeKind_Win32CtrlBreak,\r\nCTRL_ExceptionCodeKind_Win32WinRTOriginateError,\r\nCTRL_ExceptionCodeKind_Win32WinRTTransformError,\r\nCTRL_ExceptionCodeKind_Win32RPCCallCancelled,\r\nCTRL_ExceptionCodeKind_Win32DatatypeMisalignment,\r\nCTRL_ExceptionCodeKind_Win32AccessViolation,\r\nCTRL_ExceptionCodeKind_Win32InPageError,\r\nCTRL_ExceptionCodeKind_Win32InvalidHandle,\r\nCTRL_ExceptionCodeKind_Win32NotEnoughQuota,\r\nCTRL_ExceptionCodeKind_Win32IllegalInstruction,\r\nCTRL_ExceptionCodeKind_Win32CannotContinueException,\r\nCTRL_ExceptionCodeKind_Win32InvalidExceptionDisposition,\r\nCTRL_ExceptionCodeKind_Win32ArrayBoundsExceeded,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointDenormalOperand,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointDivisionByZero,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointInexactResult,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointInvalidOperation,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointOverflow,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointStackCheck,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointUnderflow,\r\nCTRL_ExceptionCodeKind_Win32IntegerDivisionByZero,\r\nCTRL_ExceptionCodeKind_Win32IntegerOverflow,\r\nCTRL_ExceptionCodeKind_Win32PrivilegedInstruction,\r\nCTRL_ExceptionCodeKind_Win32StackOverflow,\r\nCTRL_ExceptionCodeKind_Win32UnableToLocateDLL,\r\nCTRL_ExceptionCodeKind_Win32OrdinalNotFound,\r\nCTRL_ExceptionCodeKind_Win32EntryPointNotFound,\r\nCTRL_ExceptionCodeKind_Win32DLLInitializationFailed,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleFaults,\r\nCTRL_ExceptionCodeKind_Win32FloatingPointSSEMultipleTraps,\r\nCTRL_ExceptionCodeKind_Win32AssertionFailed,\r\nCTRL_ExceptionCodeKind_Win32ModuleNotFound,\r\nCTRL_ExceptionCodeKind_Win32ProcedureNotFound,\r\nCTRL_ExceptionCodeKind_Win32SanitizerErrorDetected,\r\nCTRL_ExceptionCodeKind_Win32SanitizerRawAccessViolation,\r\nCTRL_ExceptionCodeKind_Win32DirectXDebugLayer,\r\nCTRL_ExceptionCodeKind_COUNT,\r\n} CTRL_ExceptionCodeKind;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 ctrl_entity_kind_code_name_table[12];\r\nextern String8 ctrl_entity_kind_display_string_table[12];\r\nextern U32 ctrl_exception_code_kind_code_table[38];\r\nextern String8 ctrl_exception_code_kind_display_string_table[38];\r\nextern String8 ctrl_exception_code_kind_lowercase_code_string_table[38];\r\nextern B8 ctrl_exception_code_kind_default_enable_table[38];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // CTRL_META_H\r\n"
  },
  {
    "path": "src/dbg_engine/dbg_engine.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Built-In Command Tables\r\n\r\n@table(name                      ui_vis   ipc_docs_vis   text_pt_vis      text_rng_vis     q_expr                       q_slot       q_view  q_ent_kind  q_ctrl_ent_kind  q_allow_files q_allow_folders  q_keep_oi   q_select_oi  q_is_code  q_floating  q_required                        canonical_icon        string                        display_name                                  desc                                                                                                               search_tags                      ctx_filter)\r\n//    /                          |        |              |                |                |                            |             \\___                                                                                       _________________________________/                        |                     |                             |                                             |                                                                                                                  |                                |\r\n//   /                           |        |              |                |                |                            |                 \\                                                                                     /                                                          |                     |                             |                                             |                                                                                                                  |                                |\r\nD_CmdTable:     //               |        |              |                |                |                            |                  |                                                                                   |                                                           |                     |                             |                                             |                                                                                                                  |                                |\r\n{\r\n  //- rjf: low-level target control operations\r\n  {LaunchAndRun                   1        1              0                0                \"query:targets\"              Cfg                null              Target         Null                    0  0  0  0  0  1  1                                                           Play                  \"launch_and_run\"              \"Launch and Run\"                              \"Starts debugging a new instance of a target, then runs.\"                                                          \"launch,start,run,target\"        \"\"                                                                                            }\r\n  {LaunchAndStepInto              1        1              0                0                \"query:targets\"              Cfg                null              Target         Null                    0  0  0  0  0  1  1                                                           PlayStepForward       \"launch_and_step_into\"        \"Launch and Step Into\"                        \"Starts debugging a new instance of a target, then stops at the program's entry point.\"                            \"launch,start,entry,point\"       \"\"                                                                                            }\r\n  {Kill                           1        1              0                0                \"query:processes\"            Process            null              Nil            Process                 0  0  0  0  0  1  1                                                           X                     \"kill\"                        \"Kill\"                                        \"Kills the specified existing attached process(es).\"                                                               \"stop,kill\"                      \"\"                                                                                            }\r\n  {KillAll                        1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Stop                  \"kill_all\"                    \"Kill All\"                                    \"Kills all attached processes.\"                                                                                    \"stop,kill,all\"                  \"\"                                                                                            }\r\n  {Detach                         1        1              0                0                \"query:processes\"            Process            null              Nil            Process                 0  0  0  0  0  1  1                                                           Null                  \"detach\"                      \"Detach\"                                      \"Detaches the specified attached process(es).\"                                                                     \"detach\"                         \"\"                                                                                            }\r\n  {Continue                       1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Play                  \"continue\"                    \"Continue\"                                    \"Continues executing all attached processes.\"                                                                      \"\"                               \"\"                                                                                            }\r\n  {StepIntoInst                   1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepInto              \"step_into_inst\"              \"Step Into (Assembly)\"                        \"Performs a step that goes into calls, at the instruction level.\"                                                  \"single,step,thread\"             \"\"                                                                                            }\r\n  {StepOverInst                   1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepOver              \"step_over_inst\"              \"Step Over (Assembly)\"                        \"Performs a step that skips calls, at the instruction level.\"                                                      \"single,step,thread\"             \"\"                                                                                            }\r\n  {StepIntoLine                   1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepInto              \"step_into_line\"              \"Step Into (Line)\"                            \"Performs a step that goes into calls, at the source code line level.\"                                             \"step,thread\"                    \"\"                                                                                            }\r\n  {StepOverLine                   1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepOver              \"step_over_line\"              \"Step Over (Line)\"                            \"Performs a step that skips calls, at the source code line level.\"                                                 \"step,thread\"                    \"\"                                                                                            }\r\n  {StepOut                        1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepOut               \"step_out\"                    \"Step Out\"                                    \"Runs to the end of the current function and exits it.\"                                                            \"\"                               \"\"                                                                                            }\r\n  {Halt                           1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Pause                 \"halt\"                        \"Halt\"                                        \"Halts all attached processes.\"                                                                                    \"pause\"                          \"\"                                                                                            }\r\n  {SoftHaltRefresh                0        0              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Refresh               \"soft_halt_refresh\"           \"Soft Halt Refresh\"                           \"Interrupts all attached processes to collect data, and then resumes them.\"                                        \"\"                               \"\"                                                                                            }\r\n  {SetThreadIP                    0        1              0                0                \"\"                           Vaddr              null              Nil            Null                    0  0  0  0  1  1  1                                                           Null                  \"set_thread_ip\"               \"Set Thread IP\"                               \"Sets the specified thread's instruction pointer at the specified address.\"                                        \"\"                               \"\"                                                                                            }\r\n  \r\n  //- rjf: high-level composite target control operations\r\n  {RunToLine                      1        1              1                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Play                  \"run_to_line\"                 \"Run To Line\"                                 \"Runs until a particular source line is hit.\"                                                                      \"\"                               \"$text_pt,\"                                                                                   }\r\n  {Run                            1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Play                  \"run\"                         \"Run\"                                         \"Runs all targets after starting them if they have not been started yet.\"                                          \"play\"                           \"\"                                                                                            }\r\n  {Restart                        1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Redo                  \"restart\"                     \"Restart\"                                     \"Kills all attached processes, then launches all active targets.\"                                                  \"restart,retry\"                  \"\"                                                                                            }\r\n  {StepInto                       1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepInto              \"step_into\"                   \"Step Into\"                                   \"Steps once, possibly into function calls, for either source lines or instructions (whichever is selected).\"       \"\"                               \"\"                                                                                            }\r\n  {StepOver                       1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           StepOver              \"step_over\"                   \"Step Over\"                                   \"Steps once, always over function calls, for either source lines or instructions.\"                                 \"\"                               \"\"                                                                                            }\r\n  \r\n  //- rjf: debug control context management operations\r\n  {FreezeThread                   1        1              0                0                \"query:threads\"              Thread             null              Nil            Thread                  0  0  0  0  0  1  1                                                           Locked                \"freeze_thread\"               \"Freeze Thread\"                               \"Freezes the passed thread.\"                                                                                       \"callstack,unwind\"               \"\"                                                                                            }\r\n  {ThawThread                     1        1              0                0                \"query:threads\"              Thread             null              Nil            Thread                  0  0  0  0  0  1  1                                                           Unlocked              \"thaw_thread\"                 \"Thaw Thread\"                                 \"Thaws the passed thread.\"                                                                                         \"\"                               \"\"                                                                                            }\r\n  {FreezeProcess                  1        1              0                0                \"query:processes\"            Process            null              Nil            Process                 0  0  0  0  0  1  1                                                           Locked                \"freeze_process\"              \"Freeze Process\"                              \"Freezes the passed process.\"                                                                                      \"\"                               \"\"                                                                                            }\r\n  {ThawProcess                    1        1              0                0                \"query:processes\"            Process            null              Nil            Process                 0  0  0  0  0  1  1                                                           Unlocked              \"thaw_process\"                \"Thaw Process\"                                \"Thaws the passed process.\"                                                                                        \"\"                               \"\"                                                                                            }\r\n  {FreezeMachine                  0        1              0                0                \"query:machines\"             Machine            null              Nil            Machine                 0  0  0  0  0  1  1                                                           Locked                \"freeze_machine\"              \"Freeze Machine\"                              \"Freezes the passed machine.\"                                                                                      \"\"                               \"\"                                                                                            }\r\n  {ThawMachine                    0        1              0                0                \"query:machines\"             Machine            null              Nil            Machine                 0  0  0  0  0  1  1                                                           Unlocked              \"thaw_machine\"                \"Thaw Machine\"                                \"Thaws the passed machine.\"                                                                                        \"\"                               \"\"                                                                                            }\r\n  {FreezeLocalMachine             1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Machine               \"freeze_local_machine\"        \"Freeze Local Machine\"                        \"Freezes the local machine.\"                                                                                       \"\"                               \"\"                                                                                            }\r\n  {ThawLocalMachine               1        1              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Machine               \"thaw_local_machine\"          \"Thaw Local Machine\"                          \"Thaws the local machine.\"                                                                                         \"\"                               \"\"                                                                                            }\r\n  {FreezeEntity                   0        0              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Unlocked              \"freeze_entity\"               \"Freeze Entity\"                               \"Freezes an entity.\"                                                                                               \"\"                               \"\"                                                                                            }\r\n  {ThawEntity                     0        0              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Locked                \"thaw_entity\"                 \"Thaw Entity\"                                 \"Thaws an entity.\"                                                                                                 \"\"                               \"\"                                                                                            }\r\n  \r\n  //- rjf: entity decoration\r\n  {SetEntityColor                 0        0              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Null                  \"set_entity_color\"            \"Set Entity Color\"                            \"Sets the passed entity's color.\"                                                                                  \"\"                               \"\"                                                                                            }\r\n  {SetEntityName                  0        0              0                0                \"\"                           Null               null              Nil            Null                    0  0  0  0  0  0  0                                                           Null                  \"set_entity_name\"             \"Set Entity Name\"                             \"Sets the passed entity's name.\"                                                                                   \"\"                               \"\"                                                                                            }\r\n  \r\n  //- rjf: attaching\r\n  {Attach                         1        1              0                0                \"query:unattached_processes\" PID                null              Nil            Null                    0  0  0  0  0  1  1                                                           Null                  \"attach\"                      \"Attach\"                                      \"Attaches to a process that is already running on the local machine.\"                                              \"\"                               \"\"                                                                                            }\r\n}\r\n\r\n@enum D_CmdKind:\r\n{\r\n  Null,\r\n  @expand(D_CmdTable, a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Developer Toggles\r\n\r\n@table(name)\r\nD_DevToggleTable:\r\n{\r\n  {always_refresh}\r\n  {simulate_lag}\r\n  {draw_ui_text_pos}\r\n  {draw_ui_focus_debug}\r\n  {draw_ui_box_heatmap}\r\n  {eval_compiler_tooltips}\r\n  {eval_watch_key_tooltips}\r\n  {cmd_context_tooltips}\r\n  {updating_indicator}\r\n}\r\n\r\n@gen\r\n{\r\n  @expand(D_DevToggleTable a) `global B32 DEV_$(a.name) = 0;`\r\n}\r\n\r\n@gen\r\n{\r\n  `struct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =`;\r\n  `{`;\r\n    @expand(D_DevToggleTable a) `{&DEV_$(a.name), str8_lit_comp(\"$(a.name)\")},`\r\n      `};`;\r\n}\r\n"
  },
  {
    "path": "src/dbg_engine/dbg_engine_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0x4d9ae3ff\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"dbg_engine/generated/dbg_engine.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal U64\r\nd_hash_from_seed_string(U64 seed, String8 string)\r\n{\r\n  U64 result = XXH3_64bits_withSeed(string.str, string.size, seed);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nd_hash_from_string(String8 string)\r\n{\r\n  return d_hash_from_seed_string(5381, string);\r\n}\r\n\r\ninternal U64\r\nd_hash_from_seed_string__case_insensitive(U64 seed, String8 string)\r\n{\r\n  U64 result = seed;\r\n  for(U64 i = 0; i < string.size; i += 1)\r\n  {\r\n    result = ((result << 5) + result) + lower_from_char(string.str[i]);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nd_hash_from_string__case_insensitive(String8 string)\r\n{\r\n  return d_hash_from_seed_string__case_insensitive(5381, string);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Breakpoints\r\n\r\ninternal D_BreakpointArray\r\nd_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src)\r\n{\r\n  D_BreakpointArray dst = {0};\r\n  dst.count = src->count;\r\n  dst.v = push_array(arena, D_Breakpoint, dst.count);\r\n  MemoryCopy(dst.v, src->v, sizeof(dst.v[0])*dst.count);\r\n  for(U64 idx = 0; idx < dst.count; idx += 1)\r\n  {\r\n    dst.v[idx].file_path   = push_str8_copy(arena, dst.v[idx].file_path);\r\n    dst.v[idx].vaddr_expr  = push_str8_copy(arena, dst.v[idx].vaddr_expr);\r\n    dst.v[idx].condition   = push_str8_copy(arena, dst.v[idx].condition);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Path Map Application\r\n\r\ninternal String8List\r\nd_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path)\r\n{\r\n  // NOTE(rjf): This path, given some target file path, scans all file path map\r\n  // overrides, and collects the set of file paths which could've redirected\r\n  // to the target file path given the set of file path maps.\r\n  //\r\n  // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I\r\n  // feed in C:/devel/foo/bar.txt, then this path will construct\r\n  // D:/devel/foo/bar.txt, as a possible option.\r\n  //\r\n  // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that\r\n  // overrideless files still work through this path, and both redirected\r\n  // files and non-redirected files can go through the same path.\r\n  //\r\n  String8List result = {0};\r\n  str8_list_push(arena, &result, file_path);\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  PathStyle pth_style = PathStyle_Relative;\r\n  String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style);\r\n  {\r\n    for(U64 idx = 0; idx < path_maps->count; idx += 1)\r\n    {\r\n      //- rjf: unpack link\r\n      D_PathMap *map = &path_maps->v[idx];\r\n      PathStyle src_style = PathStyle_Relative;\r\n      PathStyle dst_style = PathStyle_Relative;\r\n      String8List src_parts = path_normalized_list_from_string(scratch.arena, map->src, &src_style);\r\n      String8List dst_parts = path_normalized_list_from_string(scratch.arena, map->dst, &dst_style);\r\n      \r\n      //- rjf: determine if this link can possibly redirect to the target file path\r\n      B32 dst_redirects_to_pth = 0;\r\n      String8Node *non_redirected_pth_first = 0;\r\n      if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0)\r\n      {\r\n        dst_redirects_to_pth = 1;\r\n        String8Node *dst_n = dst_parts.first;\r\n        String8Node *pth_n = pth_parts.first;\r\n        for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next)\r\n        {\r\n          if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive))\r\n          {\r\n            dst_redirects_to_pth = 0;\r\n            break;\r\n          }\r\n          non_redirected_pth_first = pth_n->next;\r\n        }\r\n      }\r\n      \r\n      //- rjf: if this link can redirect to this path via `src` -> `dst`, compute\r\n      // possible full source path, by taking `src` and appending non-redirected\r\n      // suffix (which did not show up in `dst`)\r\n      if(dst_redirects_to_pth)\r\n      {\r\n        String8List candidate_parts = src_parts;\r\n        for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next)\r\n        {\r\n          str8_list_push(scratch.arena, &candidate_parts, p->string);\r\n        }\r\n        StringJoin join = {0};\r\n        join.sep = str8_lit(\"/\");\r\n        String8 candidate_path = str8_list_join(arena, &candidate_parts, &join);\r\n        str8_list_push(arena, &result, candidate_path);\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Extraction Type Pure Functions\r\n\r\ninternal D_LineList\r\nd_line_list_copy(Arena *arena, D_LineList *list)\r\n{\r\n  D_LineList dst = {0};\r\n  for(D_LineNode *src_n = list->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    D_LineNode *dst_n = push_array(arena, D_LineNode, 1);\r\n    MemoryCopyStruct(dst_n, src_n);\r\n    dst_n->v.file_path = push_str8_copy(arena, dst_n->v.file_path);\r\n    SLLQueuePush(dst.first, dst.last, dst_n);\r\n    dst.count += 1;\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Type Functions\r\n\r\n//- rjf: command parameters\r\n\r\ninternal D_CmdParams\r\nd_cmd_params_copy(Arena *arena, D_CmdParams *src)\r\n{\r\n  D_CmdParams dst = {0};\r\n  MemoryCopyStruct(&dst, src);\r\n  dst.file_path = push_str8_copy(arena, dst.file_path);\r\n  dst.targets.v = push_array(arena, D_Target, dst.targets.count);\r\n  MemoryCopy(dst.targets.v, src->targets.v, sizeof(D_Target)*dst.targets.count);\r\n  for(U64 idx = 0; idx < dst.targets.count; idx += 1)\r\n  {\r\n    D_Target *target = &dst.targets.v[idx];\r\n    target->exe = push_str8_copy(arena, target->exe);\r\n    target->args = push_str8_copy(arena, target->args);\r\n    target->working_directory = push_str8_copy(arena, target->working_directory);\r\n    target->custom_entry_point_name = push_str8_copy(arena, target->custom_entry_point_name);\r\n    target->env = str8_list_copy(arena, &target->env);\r\n  }\r\n  return dst;\r\n}\r\n\r\n//- rjf: command lists\r\n\r\ninternal void\r\nd_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params)\r\n{\r\n  D_CmdNode *n = push_array(arena, D_CmdNode, 1);\r\n  n->cmd.kind = kind;\r\n  n->cmd.params = d_cmd_params_copy(arena, params);\r\n  DLLPushBack(cmds->first, cmds->last, n);\r\n  cmds->count += 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Stepping \"Trap Net\" Builders\r\n\r\n// NOTE(rjf): Stepping Algorithm Overview (2024/01/17)\r\n//\r\n// The basic idea behind all stepping algorithms in the debugger are setting up\r\n// a \"trap net\". A \"trap net\" is just a collection of high-level traps that are\r\n// meant to \"catch\" a thread after letting it run. This trap net is submitted\r\n// when the debugger frontend sends a \"run\" command (it is just empty if doing\r\n// an actual 'run' or 'continue'). The debugger control thread then uses this\r\n// trap net to program a state machine, to appropriately respond to a variety\r\n// of debug events which it is passed from the OS.\r\n//\r\n// These are \"high-level traps\" because they can have specific behavioral info\r\n// attached to them. These are encoded via the `CTRL_TrapFlags` type, which\r\n// allow expression of the following behaviors:\r\n//\r\n//  - end-stepping: when this trap is hit, it will end the stepping operation,\r\n//      and the target will not continue.\r\n//  - ignore-stack-pointer-check: when a trap in the trap net is hit, it will\r\n//      by-default be ignored if the thread's stack pointer has changed. this\r\n//      flag disables that behavior, for when the stack pointer is expected to\r\n//      change (e.g. step-out).\r\n//  - single-step-after-hit: when a trap with this flag is hit, the debugger\r\n//      will immediately single-step the thread which hit it.\r\n//  - save-stack-pointer: when a trap with this flag is hit, it will rewrite\r\n//      the stack pointer which is used to compare against, when deciding\r\n//      whether or not to filter a trap (based on stack pointer changes).\r\n//  - begin-spoof-mode: this enables \"spoof mode\". \"spoof mode\" is a special\r\n//      mode that disables the trap net entirely, and lets the thread run\r\n//      freely - but it catches the thread not with a trap, but a false return\r\n//      address. the debugger will overwrite a specific return address on the\r\n//      stack. this address will be overwritten with an address which does NOT\r\n//      point to a valid page, such that when the thread returns out of a\r\n//      particular call frame, the debugger will receive a debug event, at\r\n//      which point it can move the thread back to the correct return address,\r\n//      and resume with the trap net enabled. this is used in \"step over\"\r\n//      operations, because it avoids target <-> debugger \"roundtrips\" (e.g.\r\n//      target being stopped, debugger being called with debug events, then\r\n//      target resumes when debugger's control thread is done running) for\r\n//      recursions. (it doesn't make a difference with non-recursive calls,\r\n//      but the debugger can't detect the difference).\r\n//\r\n// Each stepping command prepares its trap net differently.\r\n//\r\n// --- Instruction Step Into --------------------------------------------------\r\n// In this case, no trap net is prepared, and only a low-level single-step is\r\n// performed.\r\n//\r\n// --- Instruction Step Over --------------------------------------------------\r\n// To build a trap net for an instruction-level step-over, the next instruction\r\n// at the thread's current instruction pointer is decoded. If it is a call\r\n// instruction, or if it is a repeating instruction, then a trap with the\r\n// 'end-stepping' behavior is placed at the instruction immediately following\r\n// the 'call' instruction.\r\n//\r\n// --- Line Step Into ---------------------------------------------------------\r\n// For a source-line step-into, the thread's instruction pointer is first used\r\n// to look up into the debug info's line info, to find the machine code in the\r\n// thread's current source line. Every instruction in this range is decoded.\r\n// Traps are then built in the following way:\r\n//\r\n// - 'call' instruction -> if can decode call destination address, place\r\n//     \"end-stepping | ignore-stack-pointer-check\" trap at destination. if\r\n//     can't, \"end-stepping | single-step-after | ignore-stack-pointer-check\"\r\n//     trap at call.\r\n// - 'jmp' (both unconditional & conditional) -> if can decode jump destination\r\n//     address, AND if jump leaves the line, place \"end-stepping | ignore-\r\n//     stack-pointer-check\" trap at destination. if can't, \"end-stepping |\r\n//     single-step-after | ignore-stack-pointer-check\" trap at jmp. if jump\r\n//     stays within the line, do nothing.\r\n// - 'return' -> place \"end-stepping | single-step-after\" trap at return inst.\r\n// - \"end-stepping\" trap is placed at the first address after the line, to\r\n//     catch all steps which simply proceed linearly through the instruction\r\n//     stream.\r\n//\r\n// --- Line Step Over ---------------------------------------------------------\r\n// For a source-line step-over, the thread's instruction pointer is first used\r\n// to look up into the debug info's line info, to find the machine code in the\r\n// thread's current source line. Every instruction in this range is decoded.\r\n// Traps are then built in the following way:\r\n//\r\n// - 'call' instruction -> place \"single-step-after | begin-spoof-mode\" trap at\r\n//     call instruction.\r\n// - 'jmp' (both unconditional & conditional) -> if can decode jump destination\r\n//     address, AND if jump leaves the line, place \"end-stepping\" trap at\r\n//     destination. if can't, \"end-stepping | single-step-after\" trap at jmp.\r\n//     if jump stays within the line, do nothing.\r\n// - 'return' -> place \"end-stepping | single-step-after\" trap at return inst.\r\n// - \"end-stepping\" trap is placed at the first address after the line, to\r\n//     catch all steps which simply proceed linearly through the instruction\r\n//     stream.\r\n// - for any instructions which may change the stack pointer, traps are placed\r\n//     at them with the \"save-stack-pointer | single-step-after\" behaviors.\r\n\r\ninternal D_TrapNet\r\nd_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  D_TrapNet result = {0};\r\n  \r\n  // rjf: thread => unpacked info\r\n  CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n  Arch arch = thread->arch;\r\n  U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle);\r\n  \r\n  // rjf: ip => machine code\r\n  String8 machine_code = {0};\r\n  {\r\n    Rng1U64 rng = r1u64(ip_vaddr, ip_vaddr+max_instruction_size_from_arch(arch));\r\n    CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, rng, 0, os_now_microseconds()+5000);\r\n    machine_code = machine_code_slice.data;\r\n  }\r\n  \r\n  // rjf: build traps if machine code was read successfully\r\n  if(machine_code.size != 0)\r\n  {\r\n    result.good_read = 1;\r\n    \r\n    // rjf: decode instruction\r\n    DASM_Inst inst = dasm_inst_from_code(scratch.arena, arch, ip_vaddr, machine_code, DASM_Syntax_Intel);\r\n    \r\n    // rjf: call => run until call returns\r\n    if(inst.flags & DASM_InstFlag_Call || inst.flags & DASM_InstFlag_Repeats)\r\n    {\r\n      CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, ip_vaddr+inst.size};\r\n      ctrl_trap_list_push(arena, &result.traps, &trap);\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal D_TrapNet\r\nd_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  log_infof(\"step_over_line:\\n{\\n\");\r\n  D_TrapNet result = {0};\r\n  \r\n  // rjf: thread => info\r\n  Arch arch = thread->arch;\r\n  U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle);\r\n  CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n  CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr);\r\n  DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n  log_infof(\"ip_vaddr: 0x%I64x\\n\", ip_vaddr);\r\n  log_infof(\"dbgi_key: {0x%I64x, 0x%I64x}\\n\", dbgi_key.u64[0], dbgi_key.u64[1]);\r\n  \r\n  // rjf: ip => line vaddr range\r\n  Rng1U64 line_vaddr_rng = {0};\r\n  {\r\n    U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr);\r\n    D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff);\r\n    Rng1U64 line_voff_rng = {0};\r\n    if(lines.first != 0)\r\n    {\r\n      line_voff_rng = lines.first->v.voff_range;\r\n      line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng);\r\n      log_infof(\"line: {%S:%I64i}\\n\", lines.first->v.file_path, lines.first->v.pt.line);\r\n    }\r\n    log_infof(\"voff_range: {0x%I64x, 0x%I64x}\\n\", line_voff_rng.min, line_voff_rng.max);\r\n    log_infof(\"vaddr_range: {0x%I64x, 0x%I64x}\\n\", line_vaddr_rng.min, line_vaddr_rng.max);\r\n  }\r\n  \r\n  // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range\r\n  //\r\n  // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging\r\n  // is enabled. This is enabled by default normally.\r\n  {\r\n    U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max);\r\n    D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng);\r\n    if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee))\r\n    {\r\n      line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max);\r\n    }\r\n  }\r\n  \r\n  // rjf: line vaddr range => did we find anything successfully?\r\n  B32 good_line_info = (line_vaddr_rng.max != 0);\r\n  \r\n  // rjf: line vaddr range => line's machine code\r\n  String8 machine_code = {0};\r\n  B32 good_machine_code = 0;\r\n  if(good_line_info)\r\n  {\r\n    CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+50000);\r\n    machine_code = machine_code_slice.data;\r\n    good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad);\r\n    LogInfoNamedBlockF(\"machine_code_slice\")\r\n    {\r\n      log_infof(\"stale: %i\\n\", machine_code_slice.stale);\r\n      log_infof(\"any_byte_bad: %i\\n\", machine_code_slice.any_byte_bad);\r\n      log_infof(\"any_byte_changed: %i\\n\", machine_code_slice.any_byte_changed);\r\n      log_infof(\"bytes:\\n[\\n\");\r\n      for(U64 idx = 0; idx < machine_code_slice.data.size; idx += 1)\r\n      {\r\n        log_infof(\"0x%x,\", machine_code_slice.data.str[idx]);\r\n        if(idx%16 == 15 || idx+1 == machine_code_slice.data.size)\r\n        {\r\n          log_infof(\"\\n\");\r\n        }\r\n      }\r\n      log_infof(\"]\\n\");\r\n    }\r\n  }\r\n  \r\n  // rjf: machine code => ctrl flow analysis\r\n  DASM_CtrlFlowInfo ctrl_flow_info = {0};\r\n  if(good_machine_code)\r\n  {\r\n    ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena,\r\n                                                              DASM_InstFlag_Call|\r\n                                                              DASM_InstFlag_Branch|\r\n                                                              DASM_InstFlag_UnconditionalJump|\r\n                                                              DASM_InstFlag_ChangesStackPointer|\r\n                                                              DASM_InstFlag_Return,\r\n                                                              arch,\r\n                                                              line_vaddr_rng.min,\r\n                                                              machine_code);\r\n    LogInfoNamedBlockF(\"ctrl_flow_info\")\r\n    {\r\n      LogInfoNamedBlockF(\"exit_points\") for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next)\r\n      {\r\n        log_infof(\"{vaddr:0x%I64x, jump_dest_vaddr:0x%I64x, inst_flags:%x}\\n\", n->v.vaddr, n->v.jump_dest_vaddr, n->v.inst_flags);\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: push traps for all exit points\r\n  if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next)\r\n  {\r\n    DASM_CtrlFlowPoint *point = &n->v;\r\n    CTRL_TrapFlags flags = 0;\r\n    B32 add = 1;\r\n    U64 trap_addr = point->vaddr;\r\n    \r\n    // rjf: branches/jumps/returns => single-step & end, OR trap @ destination.\r\n    if(point->inst_flags & (DASM_InstFlag_Branch|\r\n                            DASM_InstFlag_UnconditionalJump|\r\n                            DASM_InstFlag_Return))\r\n    {\r\n      flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping);\r\n      \r\n      // rjf: omit if this jump stays inside of this line\r\n      if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr))\r\n      {\r\n        add = 0;\r\n      }\r\n      \r\n      // rjf: trap @ destination, if we can - we can avoid a single-step this way.\r\n      if(point->jump_dest_vaddr != 0)\r\n      {\r\n        trap_addr = point->jump_dest_vaddr;\r\n        flags &= ~CTRL_TrapFlag_SingleStepAfterHit;\r\n      }\r\n      \r\n    }\r\n    \r\n    // rjf: call => place spoof at return spot in stack, single-step after hitting\r\n    else if(point->inst_flags & DASM_InstFlag_Call)\r\n    {\r\n      flags |= (CTRL_TrapFlag_BeginSpoofMode|CTRL_TrapFlag_SingleStepAfterHit);\r\n    }\r\n    \r\n    // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping\r\n    else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer)\r\n    {\r\n      flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer);\r\n    }\r\n    \r\n    // rjf: add if appropriate\r\n    if(add)\r\n    {\r\n      CTRL_Trap trap = {flags, trap_addr};\r\n      ctrl_trap_list_push(arena, &result.traps, &trap);\r\n    }\r\n  }\r\n  \r\n  // rjf: push trap for natural linear flow\r\n  if(good_line_info && good_machine_code)\r\n  {\r\n    CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max};\r\n    ctrl_trap_list_push(arena, &result.traps, &trap);\r\n  }\r\n  \r\n  // rjf: store goodness\r\n  if(good_machine_code)\r\n  {\r\n    result.good_line_info = good_line_info;\r\n    result.good_read = good_machine_code;\r\n  }\r\n  \r\n  // rjf: log\r\n  LogInfoNamedBlockF(\"traps\") for(CTRL_TrapNode *n = result.traps.first; n != 0; n = n->next)\r\n  {\r\n    log_infof(\"{flags:0x%x, vaddr:0x%I64x}\\n\", n->v.flags, n->v.vaddr);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  log_infof(\"}\\n\\n\");\r\n  return result;\r\n}\r\n\r\ninternal D_TrapNet\r\nd_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  D_TrapNet result = {0};\r\n  \r\n  // rjf: thread => info\r\n  Arch arch = thread->arch;\r\n  U64 ip_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle);\r\n  CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n  CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ip_vaddr);\r\n  DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n  \r\n  // rjf: ip => line vaddr range\r\n  Rng1U64 line_vaddr_rng = {0};\r\n  {\r\n    U64 ip_voff = ctrl_voff_from_vaddr(module, ip_vaddr);\r\n    D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, ip_voff);\r\n    Rng1U64 line_voff_rng = {0};\r\n    if(lines.first != 0)\r\n    {\r\n      line_voff_rng = lines.first->v.voff_range;\r\n      line_vaddr_rng = ctrl_vaddr_range_from_voff_range(module, line_voff_rng);\r\n    }\r\n  }\r\n  \r\n  // rjf: opl line_vaddr_rng -> 0xf00f00 or 0xfeefee? => include in line vaddr range\r\n  //\r\n  // MSVC exports line info at these line numbers when /JMC (Just My Code) debugging\r\n  // is enabled. This is enabled by default normally.\r\n  {\r\n    U64 opl_line_voff_rng = ctrl_voff_from_vaddr(module, line_vaddr_rng.max);\r\n    D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, opl_line_voff_rng);\r\n    if(lines.first != 0 && (lines.first->v.pt.line == 0xf00f00 || lines.first->v.pt.line == 0xfeefee))\r\n    {\r\n      line_vaddr_rng.max = ctrl_vaddr_from_voff(module, lines.first->v.voff_range.max);\r\n    }\r\n  }\r\n  \r\n  // rjf: line vaddr range => did we find anything successfully?\r\n  B32 good_line_info = (line_vaddr_rng.max != 0);\r\n  \r\n  // rjf: line vaddr range => line's machine code\r\n  String8 machine_code = {0};\r\n  B32 good_machine_code = 0;\r\n  if(good_line_info)\r\n  {\r\n    CTRL_ProcessMemorySlice machine_code_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, line_vaddr_rng, 0, os_now_microseconds()+5000);\r\n    machine_code = machine_code_slice.data;\r\n    good_machine_code = (machine_code.size >= dim_1u64(line_vaddr_rng) && !machine_code_slice.any_byte_bad);\r\n  }\r\n  \r\n  // rjf: machine code => ctrl flow analysis\r\n  DASM_CtrlFlowInfo ctrl_flow_info = {0};\r\n  if(good_machine_code)\r\n  {\r\n    ctrl_flow_info = dasm_ctrl_flow_info_from_arch_vaddr_code(scratch.arena,\r\n                                                              DASM_InstFlag_Call|\r\n                                                              DASM_InstFlag_Branch|\r\n                                                              DASM_InstFlag_UnconditionalJump|\r\n                                                              DASM_InstFlag_ChangesStackPointer|\r\n                                                              DASM_InstFlag_Return,\r\n                                                              arch,\r\n                                                              line_vaddr_rng.min,\r\n                                                              machine_code);\r\n  }\r\n  \r\n  // rjf: determine last \r\n  DASM_CtrlFlowPoint *last_call_point = 0;\r\n  if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next)\r\n  {\r\n    if(n->v.inst_flags & DASM_InstFlag_Call)\r\n    {\r\n      last_call_point = &n->v;\r\n    }\r\n  }\r\n  \r\n  // rjf: push traps for all exit points\r\n  if(good_machine_code) for(DASM_CtrlFlowPointNode *n = ctrl_flow_info.exit_points.first; n != 0; n = n->next)\r\n  {\r\n    DASM_CtrlFlowPoint *point = &n->v;\r\n    CTRL_TrapFlags flags = 0;\r\n    B32 add = 1;\r\n    U64 trap_addr = point->vaddr;\r\n    \r\n    // rjf: if this is not the last call instruction in the control flow,\r\n    // and if we have no line info for this address, then do not add.\r\n    if(point != last_call_point &&\r\n       point->inst_flags & DASM_InstFlag_Call &&\r\n       point->jump_dest_vaddr != 0)\r\n    {\r\n      U64 jump_dest_vaddr = point->jump_dest_vaddr;\r\n      CTRL_Entity *jump_dest_module = ctrl_module_from_process_vaddr(process, jump_dest_vaddr);\r\n      U64 jump_dest_voff = ctrl_voff_from_vaddr(jump_dest_module, jump_dest_vaddr);\r\n      DI_Key jump_dest_dbgi_key = ctrl_dbgi_key_from_module(jump_dest_module);\r\n      D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, jump_dest_dbgi_key, jump_dest_voff);\r\n      if(lines.count == 0)\r\n      {\r\n        add = 0;\r\n      }\r\n    }\r\n    \r\n    // rjf: branches/jumps/returns => single-step & end, OR trap @ destination.\r\n    if(point->inst_flags & (DASM_InstFlag_Call|\r\n                            DASM_InstFlag_Branch|\r\n                            DASM_InstFlag_UnconditionalJump|\r\n                            DASM_InstFlag_Return))\r\n    {\r\n      flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck);\r\n      \r\n      // rjf: omit if this jump stays inside of this line\r\n      if(contains_1u64(line_vaddr_rng, point->jump_dest_vaddr))\r\n      {\r\n        add = 0;\r\n      }\r\n      \r\n      // rjf: trap @ destination, if we can - we can avoid a single-step this way.\r\n      if(point->jump_dest_vaddr != 0)\r\n      {\r\n        trap_addr = point->jump_dest_vaddr;\r\n        flags &= ~CTRL_TrapFlag_SingleStepAfterHit;\r\n      }\r\n    }\r\n    \r\n    // rjf: instruction changes stack pointer => save off the stack pointer, single-step over, keep stepping\r\n    else if(point->inst_flags & DASM_InstFlag_ChangesStackPointer)\r\n    {\r\n      flags |= (CTRL_TrapFlag_SingleStepAfterHit|CTRL_TrapFlag_SaveStackPointer);\r\n    }\r\n    \r\n    // rjf: add if appropriate\r\n    if(add)\r\n    {\r\n      CTRL_Trap trap = {flags, trap_addr};\r\n      ctrl_trap_list_push(arena, &result.traps, &trap);\r\n    }\r\n  }\r\n  \r\n  // rjf: push trap for natural linear flow\r\n  if(good_line_info && good_machine_code)\r\n  {\r\n    CTRL_Trap trap = {CTRL_TrapFlag_EndStepping, line_vaddr_rng.max};\r\n    ctrl_trap_list_push(arena, &result.traps, &trap);\r\n  }\r\n  \r\n  // rjf: store goodness\r\n  {\r\n    result.good_line_info = good_line_info;\r\n    result.good_read = good_machine_code;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Lookups\r\n\r\n//- rjf: voff -> line info\r\n\r\ninternal D_LineList\r\nd_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  Access *access = access_open();\r\n  RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0);\r\n  D_LineList result = {0};\r\n  {\r\n    //- rjf: gather line tables\r\n    typedef struct LineTableNode LineTableNode;\r\n    struct LineTableNode\r\n    {\r\n      LineTableNode *next;\r\n      RDI_ParsedLineTable parsed_line_table;\r\n    };\r\n    LineTableNode start_line_table = {0};\r\n    RDI_Unit *unit = rdi_unit_from_voff(rdi, voff);\r\n    RDI_LineTable *unit_line_table = rdi_line_table_from_unit(rdi, unit);\r\n    rdi_parsed_from_line_table(rdi, unit_line_table, &start_line_table.parsed_line_table);\r\n    LineTableNode *top_line_table = 0;\r\n    RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);\r\n    {\r\n      for(RDI_Scope *s = scope;\r\n          s->inline_site_idx != 0;\r\n          s = rdi_element_from_name_idx(rdi, Scopes, s->parent_scope_idx))\r\n      {\r\n        RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx);\r\n        if(inline_site->line_table_idx != 0)\r\n        {\r\n          LineTableNode *n = push_array(scratch.arena, LineTableNode, 1);\r\n          SLLStackPush(top_line_table, n);\r\n          RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, inline_site->line_table_idx);\r\n          rdi_parsed_from_line_table(rdi, line_table, &n->parsed_line_table);\r\n        }\r\n      }\r\n    }\r\n    SLLStackPush(top_line_table, &start_line_table);\r\n    \r\n    //- rjf: gather lines in each line table\r\n    Rng1U64 shallowest_voff_range = {0};\r\n    for(LineTableNode *line_table_n = top_line_table; line_table_n != 0; line_table_n = line_table_n->next)\r\n    {\r\n      RDI_ParsedLineTable parsed_line_table = line_table_n->parsed_line_table;\r\n      U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed_line_table, voff);\r\n      if(line_info_idx < parsed_line_table.count)\r\n      {\r\n        RDI_Line *line = &parsed_line_table.lines[line_info_idx];\r\n        RDI_Column *column = (line_info_idx < parsed_line_table.col_count) ? &parsed_line_table.cols[line_info_idx] : 0;\r\n        RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx);\r\n        String8List path_parts = {0};\r\n        for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file->file_path_node_idx);\r\n            fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0);\r\n            fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node))\r\n        {\r\n          String8 path_part = {0};\r\n          path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size);\r\n          str8_list_push_front(scratch.arena, &path_parts, path_part);\r\n        }\r\n        StringJoin join = {0};\r\n        join.sep = str8_lit(\"/\");\r\n        String8 file_normalized_full_path = str8_list_join(arena, &path_parts, &join);\r\n        D_LineNode *n = push_array(arena, D_LineNode, 1);\r\n        SLLQueuePush(result.first, result.last, n);\r\n        result.count += 1;\r\n        if(line->file_idx != 0 && file_normalized_full_path.size != 0)\r\n        {\r\n          n->v.file_path = file_normalized_full_path;\r\n        }\r\n        n->v.pt = txt_pt(line->line_num, column ? column->col_first : 1);\r\n        n->v.voff_range = r1u64(parsed_line_table.voffs[line_info_idx], parsed_line_table.voffs[line_info_idx+1]);\r\n        n->v.dbgi_key = dbgi_key;\r\n        if(line_table_n == top_line_table)\r\n        {\r\n          shallowest_voff_range = n->v.voff_range;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: clamp all lines from all tables by shallowest (most unwound) range\r\n    for(D_LineNode *n = result.first; n != 0; n = n->next)\r\n    {\r\n      n->v.voff_range = intersect_1u64(n->v.voff_range, shallowest_voff_range);\r\n    }\r\n  }\r\n  access_close(access);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: file:line -> line info\r\n\r\n// TODO(rjf): this depends on file path maps, needs to move\r\n\r\ninternal D_LineListArray\r\nd_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range)\r\n{\r\n  D_LineListArray array = {0};\r\n  {\r\n    array.count = dim_1s64(line_num_range)+1;\r\n    array.v = push_array(arena, D_LineList, array.count);\r\n    di_key_list_push(arena, &array.dbgi_keys, dbgi_key);\r\n  }\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count);\r\n  Access *access = access_open();\r\n  String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path);\r\n  for(String8Node *override_n = overrides.first;\r\n      override_n != 0;\r\n      override_n = override_n->next)\r\n  {\r\n    String8 file_path = override_n->string;\r\n    String8 file_path_normalized = lower_from_str8(scratch.arena, path_normalized_from_string(scratch.arena, file_path));\r\n    \r\n    // rjf: binary -> rdi\r\n    RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n    \r\n    // rjf: file_path_normalized * rdi -> src_id\r\n    B32 good_src_id = 0;\r\n    U32 src_id = 0;\r\n    if(rdi != &rdi_parsed_nil) ProfScope(\"file_path_normalized * rdi -> src_id\")\r\n    {\r\n      RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths);\r\n      RDI_ParsedNameMap map = {0};\r\n      rdi_parsed_from_name_map(rdi, mapptr, &map);\r\n      RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);\r\n      if(node != 0)\r\n      {\r\n        U32 id_count = 0;\r\n        U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n        if(id_count > 0)\r\n        {\r\n          good_src_id = 1;\r\n          src_id = ids[0];\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: good src-id -> look up line info for visible range\r\n    if(good_src_id) ProfScope(\"good src-id -> look up line info for visible range\")\r\n    {\r\n      RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id);\r\n      RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx);\r\n      RDI_ParsedSourceLineMap line_map = {0};\r\n      rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map);\r\n      U64 line_idx = 0;\r\n      for(S64 line_num = line_num_range.min;\r\n          line_num <= line_num_range.max;\r\n          line_num += 1, line_idx += 1)\r\n      {\r\n        D_LineList *list = &array.v[line_idx];\r\n        U32 voff_count = 0;\r\n        U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count);\r\n        if(lines_num_voffs[line_idx] < 8) ProfScope(\"iterate voffs (%i)\", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1)\r\n        {\r\n          U64 base_voff = voffs[idx];\r\n          U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff);\r\n          RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx);\r\n          RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx);\r\n          RDI_ParsedLineTable unit_line_info = {0};\r\n          rdi_parsed_from_line_table(rdi, line_table, &unit_line_info);\r\n          U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff);\r\n          if(unit_line_info.voffs != 0)\r\n          {\r\n            Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]);\r\n            S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num;\r\n            D_LineNode *n = push_array(arena, D_LineNode, 1);\r\n            n->v.voff_range = range;\r\n            n->v.pt.line = (S64)actual_line;\r\n            n->v.pt.column = 1;\r\n            n->v.dbgi_key = dbgi_key;\r\n            SLLQueuePush(list->first, list->last, n);\r\n            list->count += 1;\r\n            lines_num_voffs[line_idx] += 1;\r\n            if(lines_num_voffs[line_idx] >= 8)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  access_close(access);\r\n  scratch_end(scratch);\r\n  return array;\r\n}\r\n\r\ninternal D_LineListArray\r\nd_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range)\r\n{\r\n  D_LineListArray array = {0};\r\n  {\r\n    array.count = dim_1s64(line_num_range)+1;\r\n    array.v = push_array(arena, D_LineList, array.count);\r\n  }\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  U64 *lines_num_voffs = push_array(scratch.arena, U64, array.count);\r\n  DI_KeyArray dbgi_keys = di_push_all_loaded_keys(scratch.arena);\r\n  String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path);\r\n  for(String8Node *override_n = overrides.first;\r\n      override_n != 0;\r\n      override_n = override_n->next)\r\n  {\r\n    String8 file_path = override_n->string;\r\n    String8 file_path_normalized = lower_from_str8(scratch.arena, file_path);\r\n    for EachIndex(idx, dbgi_keys.count)\r\n    {\r\n      Access *access = access_open();\r\n      \r\n      // rjf: binary -> rdi\r\n      DI_Key key = dbgi_keys.v[idx];\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, key, 1, 0);\r\n      \r\n      // rjf: file_path_normalized * rdi -> src_id\r\n      B32 good_src_id = 0;\r\n      U32 src_id = 0;\r\n      if(rdi != &rdi_parsed_nil) ProfScope(\"file_path_normalized * rdi -> src_id\")\r\n      {\r\n        RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths);\r\n        RDI_ParsedNameMap map = {0};\r\n        rdi_parsed_from_name_map(rdi, mapptr, &map);\r\n        RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);\r\n        if(node != 0)\r\n        {\r\n          U32 id_count = 0;\r\n          U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n          if(id_count > 0)\r\n          {\r\n            good_src_id = 1;\r\n            src_id = ids[0];\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: good src-id -> look up line info for visible range\r\n      if(good_src_id) ProfScope(\"good src-id -> look up line info for visible range\")\r\n      {\r\n        RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id);\r\n        RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx);\r\n        RDI_ParsedSourceLineMap line_map = {0};\r\n        rdi_parsed_from_source_line_map(rdi, src_line_map, &line_map);\r\n        U64 line_idx = 0;\r\n        for(S64 line_num = line_num_range.min;\r\n            line_num <= line_num_range.max;\r\n            line_num += 1, line_idx += 1)\r\n        {\r\n          D_LineList *list = &array.v[line_idx];\r\n          U32 voff_count = 0;\r\n          U64 *voffs = rdi_line_voffs_from_num(&line_map, u32_from_u64_saturate((U64)line_num), &voff_count);\r\n          if(lines_num_voffs[line_idx] < 8) ProfScope(\"iterate voffs (%i)\", voff_count) for(U64 idx = 0; idx < voff_count; idx += 1)\r\n          {\r\n            U64 base_voff = voffs[idx];\r\n            U64 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, base_voff);\r\n            RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx);\r\n            RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx);\r\n            RDI_ParsedLineTable unit_line_info = {0};\r\n            rdi_parsed_from_line_table(rdi, line_table, &unit_line_info);\r\n            U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, base_voff);\r\n            if(unit_line_info.voffs != 0)\r\n            {\r\n              Rng1U64 range = r1u64(base_voff, unit_line_info.voffs[line_info_idx+1]);\r\n              S64 actual_line = (S64)unit_line_info.lines[line_info_idx].line_num;\r\n              D_LineNode *n = push_array(arena, D_LineNode, 1);\r\n              n->v.voff_range = range;\r\n              n->v.pt.line = (S64)actual_line;\r\n              n->v.pt.column = 1;\r\n              n->v.dbgi_key = key;\r\n              SLLQueuePush(list->first, list->last, n);\r\n              list->count += 1;\r\n              lines_num_voffs[line_idx] += 1;\r\n              if(lines_num_voffs[line_idx] >= 8)\r\n              {\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: good src id -> push to relevant dbgi keys\r\n      if(good_src_id)\r\n      {\r\n        di_key_list_push(arena, &array.dbgi_keys, key);\r\n      }\r\n      \r\n      access_close(access);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return array;\r\n}\r\n\r\ninternal D_LineList\r\nd_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num)\r\n{\r\n  D_LineListArray array = d_lines_array_from_dbgi_key_file_path_line_range(arena, dbgi_key, file_path, r1s64(line_num, line_num+1));\r\n  D_LineList list = {0};\r\n  if(array.count != 0)\r\n  {\r\n    list = array.v[0];\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal D_LineList\r\nd_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num)\r\n{\r\n  D_LineListArray array = d_lines_array_from_file_path_line_range(arena, file_path, r1s64(line_num, line_num+1));\r\n  D_LineList list = {0};\r\n  if(array.count != 0)\r\n  {\r\n    list = array.v[0];\r\n  }\r\n  return list;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Process/Thread/Module Info Lookups\r\n\r\ninternal U64\r\nd_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr)\r\n{\r\n  ProfBeginFunction();\r\n  U64 base_vaddr = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  if(!d_ctrl_targets_running())\r\n  {\r\n    //- rjf: unpack module info\r\n    CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);\r\n    Rng1U64 tls_vaddr_range = ctrl_tls_vaddr_range_from_module(module->handle);\r\n    U64 addr_size = bit_size_from_arch(process->arch)/8;\r\n    \r\n    //- rjf: read module's TLS index\r\n    U64 tls_index = 0;\r\n    if(addr_size != 0)\r\n    {\r\n      CTRL_ProcessMemorySlice tls_index_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, tls_vaddr_range, 0, 0);\r\n      if(tls_index_slice.data.size >= addr_size)\r\n      {\r\n        tls_index = *(U64 *)tls_index_slice.data.str;\r\n      }\r\n    }\r\n    \r\n    //- rjf: PE path\r\n    if(addr_size != 0)\r\n    {\r\n      U64 thread_info_addr = root_vaddr;\r\n      U64 tls_addr_off = tls_index*addr_size;\r\n      U64 tls_addr_array = 0;\r\n      CTRL_ProcessMemorySlice tls_addr_array_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(thread_info_addr, thread_info_addr+addr_size), 0, 0);\r\n      String8 tls_addr_array_data = tls_addr_array_slice.data;\r\n      if(tls_addr_array_data.size >= 8)\r\n      {\r\n        MemoryCopy(&tls_addr_array, tls_addr_array_data.str, sizeof(U64));\r\n      }\r\n      CTRL_ProcessMemorySlice result_slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, process->handle, r1u64(tls_addr_array + tls_addr_off, tls_addr_array + tls_addr_off + addr_size), 0, 0);\r\n      String8 result_data = result_slice.data;\r\n      if(result_data.size >= 8)\r\n      {\r\n        MemoryCopy(&base_vaddr, result_data.str, sizeof(U64));\r\n      }\r\n    }\r\n    \r\n    //- rjf: non-PE path (not implemented)\r\n#if 0\r\n    if(!bin_is_pe)\r\n    {\r\n      // TODO(rjf): not supported. old code from the prototype that Nick had sketched out:\r\n      // TODO(nick): This code works only if the linked c runtime library is glibc.\r\n      // Implement CRT detection here.\r\n      \r\n      U64 dtv_addr = UINT64_MAX;\r\n      demon_read_memory(process->demon_handle, &dtv_addr, thread_info_addr, addr_size);\r\n      \r\n      /*\r\n        union delta_thread_vector\r\n        {\r\n          size_t counter;\r\n          struct\r\n          {\r\n            void *value;\r\n            void *to_free;\r\n          } pointer;\r\n        };\r\n      */\r\n      \r\n      U64 dtv_size = 16;\r\n      U64 dtv_count = 0;\r\n      demon_read_memory(process->demon_handle, &dtv_count, dtv_addr - dtv_size, addr_size);\r\n      \r\n      if (tls_index > 0 && tls_index < dtv_count)\r\n      {\r\n        demon_read_memory(process->demon_handle, &result, dtv_addr + dtv_size*tls_index, addr_size);\r\n      }\r\n    }\r\n#endif\r\n  }\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return base_vaddr;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Target Controls\r\n\r\n//- rjf: stopped info from the control thread\r\n\r\ninternal CTRL_Event\r\nd_ctrl_last_stop_event(void)\r\n{\r\n  return d_state->ctrl_last_stop_event;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Accessors/Mutators\r\n\r\n//- rjf: frame data\r\n\r\ninternal U64\r\nd_frame_index(void)\r\n{\r\n  return d_state->frame_index;\r\n}\r\n\r\n//- rjf: control state\r\n\r\ninternal D_RunKind\r\nd_ctrl_last_run_kind(void)\r\n{\r\n  return d_state->ctrl_last_run_kind;\r\n}\r\n\r\ninternal U64\r\nd_ctrl_last_run_frame_idx(void)\r\n{\r\n  return d_state->ctrl_last_run_frame_idx;\r\n}\r\n\r\ninternal B32\r\nd_ctrl_targets_running(void)\r\n{\r\n  return d_state->ctrl_is_running;\r\n}\r\n\r\n//- rjf: active entity based queries\r\n\r\ninternal DI_KeyList\r\nd_push_active_dbgi_key_list(Arena *arena)\r\n{\r\n  DI_KeyList dbgis = {0};\r\n  CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module);\r\n  for EachIndex(idx, modules.count)\r\n  {\r\n    CTRL_Entity *module = modules.v[idx];\r\n    DI_Key key = ctrl_dbgi_key_from_module(module);\r\n    di_key_list_push(arena, &dbgis, key);\r\n  }\r\n  return dbgis;\r\n}\r\n\r\n//- rjf: per-run caches\r\n\r\ninternal U64\r\nd_query_cached_rip_from_thread(CTRL_Entity *thread)\r\n{\r\n  U64 result = d_query_cached_rip_from_thread_unwind(thread, 0);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nd_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count)\r\n{\r\n  U64 result = 0;\r\n  if(unwind_count == 0)\r\n  {\r\n    result = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle);\r\n  }\r\n  else\r\n  {\r\n    Access *access = access_open();\r\n    CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, 0);\r\n    if(callstack.concrete_frames_count != 0)\r\n    {\r\n      result = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[unwind_count%callstack.concrete_frames_count]->regs);\r\n    }\r\n    access_close(access);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nd_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr)\r\n{\r\n  U64 result = 0;\r\n  for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->tls_base_caches); cache_idx += 1)\r\n  {\r\n    D_RunTLSBaseCache *cache = &d_state->tls_base_caches[(d_state->tls_base_cache_gen+cache_idx)%ArrayCount(d_state->tls_base_caches)];\r\n    if(cache_idx == 0 && cache->slots_count == 0)\r\n    {\r\n      cache->slots_count = 256;\r\n      cache->slots = push_array(cache->arena, D_RunTLSBaseCacheSlot, cache->slots_count);\r\n    }\r\n    else if(cache->slots_count == 0)\r\n    {\r\n      break;\r\n    }\r\n    CTRL_Handle handle = process->handle;\r\n    U64 hash = d_hash_from_seed_string(d_hash_from_string(str8_struct(&handle)), str8_struct(&rip_vaddr));\r\n    U64 slot_idx = hash%cache->slots_count;\r\n    D_RunTLSBaseCacheSlot *slot = &cache->slots[slot_idx];\r\n    D_RunTLSBaseCacheNode *node = 0;\r\n    for(D_RunTLSBaseCacheNode *n = slot->first; n != 0; n = n->hash_next)\r\n    {\r\n      if(ctrl_handle_match(n->process, handle) && n->root_vaddr == root_vaddr && n->rip_vaddr == rip_vaddr)\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      U64 tls_base_vaddr = d_tls_base_vaddr_from_process_root_rip(process, root_vaddr, rip_vaddr);\r\n      if(tls_base_vaddr != 0)\r\n      {\r\n        node = push_array(cache->arena, D_RunTLSBaseCacheNode, 1);\r\n        SLLQueuePush_N(slot->first, slot->last, node, hash_next);\r\n        node->process = handle;\r\n        node->root_vaddr = root_vaddr;\r\n        node->rip_vaddr = rip_vaddr;\r\n        node->tls_base_vaddr = tls_base_vaddr;\r\n      }\r\n    }\r\n    if(node != 0 && node->tls_base_vaddr != 0)\r\n    {\r\n      result = node->tls_base_vaddr;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_String2NumMap *\r\nd_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff)\r\n{\r\n  ProfBeginFunction();\r\n  E_String2NumMap *map = &e_string2num_map_nil;\r\n  for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->locals_caches); cache_idx += 1)\r\n  {\r\n    D_RunLocalsCache *cache = &d_state->locals_caches[(d_state->locals_cache_gen+cache_idx)%ArrayCount(d_state->locals_caches)];\r\n    if(cache_idx == 0 && cache->table_size == 0)\r\n    {\r\n      cache->table_size = 256;\r\n      cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size);\r\n    }\r\n    else if(cache->table_size == 0)\r\n    {\r\n      break;\r\n    }\r\n    U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key));\r\n    U64 slot_idx = hash % cache->table_size;\r\n    D_RunLocalsCacheSlot *slot = &cache->table[slot_idx];\r\n    D_RunLocalsCacheNode *node = 0;\r\n    for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next)\r\n    {\r\n      if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff)\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      Access *access = access_open();\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0);\r\n      E_String2NumMap *map = e_push_locals_map_from_rdi_voff(cache->arena, rdi, voff);\r\n      if(map->slots_count != 0)\r\n      {\r\n        node = push_array(cache->arena, D_RunLocalsCacheNode, 1);\r\n        node->dbgi_key = dbgi_key;\r\n        node->voff = voff;\r\n        node->locals_map = map;\r\n        SLLQueuePush_N(slot->first, slot->last, node, hash_next);\r\n      }\r\n      access_close(access);\r\n    }\r\n    if(node != 0 && node->locals_map->slots_count != 0)\r\n    {\r\n      map = node->locals_map;\r\n      break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return map;\r\n}\r\n\r\ninternal E_String2NumMap *\r\nd_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff)\r\n{\r\n  ProfBeginFunction();\r\n  E_String2NumMap *map = &e_string2num_map_nil;\r\n  for(U64 cache_idx = 0; cache_idx < ArrayCount(d_state->member_caches); cache_idx += 1)\r\n  {\r\n    D_RunLocalsCache *cache = &d_state->member_caches[(d_state->member_cache_gen+cache_idx)%ArrayCount(d_state->member_caches)];\r\n    if(cache_idx == 0 && cache->table_size == 0)\r\n    {\r\n      cache->table_size = 256;\r\n      cache->table = push_array(cache->arena, D_RunLocalsCacheSlot, cache->table_size);\r\n    }\r\n    else if(cache->table_size == 0)\r\n    {\r\n      break;\r\n    }\r\n    U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key));\r\n    U64 slot_idx = hash % cache->table_size;\r\n    D_RunLocalsCacheSlot *slot = &cache->table[slot_idx];\r\n    D_RunLocalsCacheNode *node = 0;\r\n    for(D_RunLocalsCacheNode *n = slot->first; n != 0; n = n->hash_next)\r\n    {\r\n      if(di_key_match(n->dbgi_key, dbgi_key) && n->voff == voff)\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      Access *access = access_open();\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0);\r\n      E_String2NumMap *map = e_push_member_map_from_rdi_voff(cache->arena, rdi, voff);\r\n      if(map->slots_count != 0)\r\n      {\r\n        node = push_array(cache->arena, D_RunLocalsCacheNode, 1);\r\n        node->dbgi_key = dbgi_key;\r\n        node->voff = voff;\r\n        node->locals_map = map;\r\n        SLLQueuePush_N(slot->first, slot->last, node, hash_next);\r\n      }\r\n      access_close(access);\r\n    }\r\n    if(node != 0 && node->locals_map->slots_count != 0)\r\n    {\r\n      map = node->locals_map;\r\n      break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return map;\r\n}\r\n\r\n//- rjf: top-level command dispatch\r\n\r\ninternal void\r\nd_push_cmd(D_CmdKind kind, D_CmdParams *params)\r\n{\r\n  d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, kind, params);\r\n}\r\n\r\n//- rjf: command iteration\r\n\r\ninternal B32\r\nd_next_cmd(D_Cmd **cmd)\r\n{\r\n  D_CmdNode *start_node = d_state->cmds.first;\r\n  if(cmd[0] != 0)\r\n  {\r\n    start_node = CastFromMember(D_CmdNode, cmd, cmd[0]);\r\n    start_node = start_node->next;\r\n  }\r\n  cmd[0] = 0;\r\n  if(start_node != 0)\r\n  {\r\n    cmd[0] = &start_node->cmd;\r\n  }\r\n  return !!cmd[0];\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Top-Level Calls\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal void\r\nd_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  d_state = push_array(arena, D_State, 1);\r\n  d_state->arena = arena;\r\n  d_state->cmds_arena = arena_alloc();\r\n  d_state->output_log_key = c_key_make(c_root_alloc(), c_id_make(0, 0));\r\n  c_submit_data(d_state->output_log_key, 0, str8_zero());\r\n  d_state->ctrl_entity_store = ctrl_entity_ctx_rw_store_alloc();\r\n  d_state->ctrl_stop_arena = arena_alloc();\r\n  d_state->ctrl_msg_arena = arena_alloc();\r\n  \r\n  // rjf: set up caches\r\n  for(U64 idx = 0; idx < ArrayCount(d_state->tls_base_caches); idx += 1)\r\n  {\r\n    d_state->tls_base_caches[idx].arena = arena_alloc();\r\n  }\r\n  for(U64 idx = 0; idx < ArrayCount(d_state->locals_caches); idx += 1)\r\n  {\r\n    d_state->locals_caches[idx].arena = arena_alloc();\r\n  }\r\n  for(U64 idx = 0; idx < ArrayCount(d_state->member_caches); idx += 1)\r\n  {\r\n    d_state->member_caches[idx].arena = arena_alloc();\r\n  }\r\n  \r\n  // rjf: set up run state\r\n  d_state->ctrl_last_run_arena = arena_alloc();\r\n}\r\n\r\ninternal D_EventList\r\nd_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64])\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  D_EventList result = {0};\r\n  d_state->frame_index += 1;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: sync with ctrl thread\r\n  //\r\n  ProfScope(\"sync with ctrl thread\")\r\n  {\r\n    //- rjf: grab next reggen/memgen\r\n    U64 new_mem_gen = ctrl_mem_gen();\r\n    U64 new_reg_gen = ctrl_reg_gen();\r\n    \r\n    //- rjf: consume & process events\r\n    CTRL_EventList events = ctrl_c2u_pop_events(scratch.arena);\r\n    ctrl_entity_store_apply_events(d_state->ctrl_entity_store, &events);\r\n    for(CTRL_EventNode *event_n = events.first;\r\n        event_n != 0;\r\n        event_n = event_n->next)\r\n    {\r\n      CTRL_Event *event = &event_n->v;\r\n      log_infof(\"ctrl_event:\\n{\\n\");\r\n      log_infof(\"kind: \\\"%S\\\"\\n\", ctrl_string_from_event_kind(event->kind));\r\n      log_infof(\"entity_id: %u\\n\", event->entity_id);\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        \r\n        //- rjf: errors\r\n        \r\n        case CTRL_EventKind_Error:\r\n        {\r\n          log_user_error(event->string);\r\n        }break;\r\n        \r\n        //- rjf: starts/stops\r\n        \r\n        case CTRL_EventKind_Started:\r\n        {\r\n          d_state->ctrl_is_running = 1;\r\n          d_state->ctrl_thread_run_state = 1;\r\n        }break;\r\n        \r\n        case CTRL_EventKind_Stopped:\r\n        {\r\n          B32 should_snap = !(d_state->ctrl_soft_halt_issued);\r\n          d_state->ctrl_is_running = 0;\r\n          d_state->ctrl_thread_run_state = 0;\r\n          d_state->ctrl_soft_halt_issued = 0;\r\n          \r\n          // rjf: exception or unexpected trap -> push error\r\n          if(event->cause == CTRL_EventCause_InterruptedByException ||\r\n             event->cause == CTRL_EventCause_InterruptedByTrap)\r\n          {\r\n            log_user_error(str8_zero());\r\n          }\r\n          \r\n          // rjf: gather stop info\r\n          {\r\n            arena_clear(d_state->ctrl_stop_arena);\r\n            MemoryCopyStruct(&d_state->ctrl_last_stop_event, event);\r\n            d_state->ctrl_last_stop_event.string = push_str8_copy(d_state->ctrl_stop_arena, d_state->ctrl_last_stop_event.string);\r\n          }\r\n          \r\n          // rjf: push stop event to caller, if this is not a soft-halt\r\n          if(should_snap)\r\n          {\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, event->entity);\r\n            D_EventCause cause = D_EventCause_Null;\r\n            switch(event->cause)\r\n            {\r\n              default:{}break;\r\n              case CTRL_EventCause_InterruptedByHalt:\r\n              {\r\n                if(should_snap)\r\n                {\r\n                  cause = D_EventCause_Halt;\r\n                }\r\n                else\r\n                {\r\n                  cause = D_EventCause_SoftHalt;\r\n                }\r\n              }break;\r\n              case CTRL_EventCause_UserBreakpoint:    {cause = D_EventCause_UserBreakpoint;}break;\r\n            }\r\n            D_EventNode *n = push_array(arena, D_EventNode, 1);\r\n            SLLQueuePush(result.first, result.last, n);\r\n            result.count += 1;\r\n            D_Event *evt = &n->v;\r\n            evt->kind = D_EventKind_Stop;\r\n            evt->cause  = cause;\r\n            evt->thread = thread->kind == CTRL_EntityKind_Thread ? thread->handle : ctrl_handle_zero();\r\n            evt->vaddr  = event->rip_vaddr;\r\n            evt->id     = event->u64_code;\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: entity creation/deletion\r\n        \r\n        case CTRL_EventKind_NewProc:\r\n        {\r\n          // rjf: the first process? -> clear session output\r\n          CTRL_EntityArray existing_processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n          if(existing_processes.count == 1)\r\n          {\r\n            MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit(\"[new session]\\n\")};\r\n            mtx_push_op(d_state->output_log_key, op);\r\n          }\r\n        }break;\r\n        \r\n        case CTRL_EventKind_EndProc:\r\n        {\r\n          D_EventNode *n = push_array(arena, D_EventNode, 1);\r\n          SLLQueuePush(result.first, result.last, n);\r\n          result.count += 1;\r\n          D_Event *evt = &n->v;\r\n          evt->kind = D_EventKind_ProcessEnd;\r\n          evt->code = event->u64_code;\r\n        }break;\r\n        \r\n        case CTRL_EventKind_NewModule:\r\n        {\r\n          D_EventNode *n = push_array(arena, D_EventNode, 1);\r\n          SLLQueuePush(result.first, result.last, n);\r\n          result.count += 1;\r\n          D_Event *evt = &n->v;\r\n          evt->kind = D_EventKind_ModuleLoad;\r\n          evt->module = event->entity;\r\n        }break;\r\n        \r\n        //- rjf: debug strings\r\n        \r\n        case CTRL_EventKind_DebugString:\r\n        {\r\n          MTX_Op op = {r1u64(max_U64, max_U64), event->string};\r\n          mtx_push_op(d_state->output_log_key, op);\r\n        }break;\r\n        \r\n        //- rjf: memory\r\n        \r\n        case CTRL_EventKind_MemReserve:{}break;\r\n        case CTRL_EventKind_MemCommit:{}break;\r\n        case CTRL_EventKind_MemDecommit:{}break;\r\n        case CTRL_EventKind_MemRelease:{}break;\r\n      }\r\n      log_infof(\"}\\n\\n\");\r\n    }\r\n    \r\n    //- rjf: clear tls base cache\r\n    if((d_state->tls_base_cache_reggen_idx != new_reg_gen ||\r\n        d_state->tls_base_cache_memgen_idx != new_mem_gen) &&\r\n       !d_ctrl_targets_running())\r\n    {\r\n      d_state->tls_base_cache_gen += 1;\r\n      D_RunTLSBaseCache *cache = &d_state->tls_base_caches[d_state->tls_base_cache_gen%ArrayCount(d_state->tls_base_caches)];\r\n      arena_clear(cache->arena);\r\n      cache->slots_count = 0;\r\n      cache->slots = 0;\r\n      d_state->tls_base_cache_reggen_idx = new_reg_gen;\r\n      d_state->tls_base_cache_memgen_idx = new_mem_gen;\r\n    }\r\n    \r\n    //- rjf: clear locals cache\r\n    if(d_state->locals_cache_reggen_idx != new_reg_gen &&\r\n       !d_ctrl_targets_running())\r\n    {\r\n      d_state->locals_cache_gen += 1;\r\n      D_RunLocalsCache *cache = &d_state->locals_caches[d_state->locals_cache_gen%ArrayCount(d_state->locals_caches)];\r\n      arena_clear(cache->arena);\r\n      cache->table_size = 0;\r\n      cache->table = 0;\r\n      d_state->locals_cache_reggen_idx = new_reg_gen;\r\n    }\r\n    \r\n    //- rjf: clear members cache\r\n    if(d_state->member_cache_reggen_idx != new_reg_gen &&\r\n       !d_ctrl_targets_running())\r\n    {\r\n      d_state->member_cache_gen += 1;\r\n      D_RunLocalsCache *cache = &d_state->member_caches[d_state->member_cache_gen%ArrayCount(d_state->member_caches)];\r\n      arena_clear(cache->arena);\r\n      cache->table_size = 0;\r\n      cache->table = 0;\r\n      d_state->member_cache_reggen_idx = new_reg_gen;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: hash ctrl parameterization state\r\n  //\r\n  U128 ctrl_param_state_hash = {0};\r\n  {\r\n    // rjf: build data strings of all param data\r\n    String8List strings = {0};\r\n    {\r\n      CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread);\r\n      for EachIndex(idx, threads.count)\r\n      {\r\n        CTRL_Entity *thread = threads.v[idx];\r\n        if(thread->is_frozen)\r\n        {\r\n          str8_list_push(scratch.arena, &strings, str8_struct(&thread->id));\r\n          str8_list_push(scratch.arena, &strings, str8_struct(&thread->is_frozen));\r\n        }\r\n      }\r\n      for(U64 idx = 0; idx < breakpoints->count; idx += 1)\r\n      {\r\n        D_Breakpoint *bp = &breakpoints->v[idx];\r\n        str8_list_push(scratch.arena, &strings, bp->file_path);\r\n        str8_list_push(scratch.arena, &strings, str8_struct(&bp->pt));\r\n        str8_list_push(scratch.arena, &strings, bp->vaddr_expr);\r\n        str8_list_push(scratch.arena, &strings, bp->condition);\r\n      }\r\n    }\r\n    \r\n    // rjf: join & hash to produce result\r\n    String8 string = str8_list_join(scratch.arena, &strings, 0);\r\n    XXH128_hash_t hash = XXH3_128bits(string.str, string.size);\r\n    MemoryCopy(&ctrl_param_state_hash, &hash, sizeof(ctrl_param_state_hash));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if ctrl thread is running, and our ctrl parameterization\r\n  // state hash has changed since the last run, we should soft-\r\n  // halt-refresh to inform the ctrl thread about the updated\r\n  // state\r\n  //\r\n  if(d_ctrl_targets_running() && !u128_match(ctrl_param_state_hash, d_state->ctrl_last_run_param_state_hash))\r\n  {\r\n    d_cmd(D_CmdKind_SoftHaltRefresh);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: process top-level commands\r\n  //\r\n  D_CmdList deferred_cmds = {0};\r\n  CTRL_MsgList ctrl_msgs = {0};\r\n  ProfScope(\"process top-level commands\")\r\n  {\r\n    D_BreakpointArray run_extra_bps = {0};\r\n    for(D_Cmd *cmd = 0; d_next_cmd(&cmd);)\r\n    {\r\n      // rjf: unpack command\r\n      D_CmdParams *params = &cmd->params;\r\n      \r\n      // rjf: prep ctrl running arguments\r\n      B32 need_run = 0;\r\n      D_RunKind run_kind = D_RunKind_Run;\r\n      CTRL_Entity *run_thread = &ctrl_entity_nil;\r\n      CTRL_RunFlags run_flags = 0;\r\n      CTRL_TrapList run_traps = {0};\r\n      \r\n      // rjf: process command\r\n      switch(cmd->kind)\r\n      {\r\n        default:{}break;\r\n        \r\n        //- rjf: low-level target control operations\r\n        case D_CmdKind_LaunchAndRun:\r\n        case D_CmdKind_LaunchAndStepInto:\r\n        {\r\n          // rjf: get list of targets to launch\r\n          D_TargetArray *targets_to_launch = &params->targets;\r\n          \r\n          // rjf: no targets => assume all active targets\r\n          if(targets_to_launch->count == 0)\r\n          {\r\n            targets_to_launch = targets;\r\n          }\r\n          \r\n          // rjf: launch\r\n          if(targets_to_launch->count != 0)\r\n          {\r\n            for(U64 idx = 0; idx < targets_to_launch->count; idx += 1)\r\n            {\r\n              // rjf: unpack target\r\n              D_Target *target = &targets_to_launch->v[idx];\r\n              String8 exe                     = str8_skip_chop_whitespace(target->exe);\r\n              String8 args                    = str8_skip_chop_whitespace(target->args);\r\n              String8 working_directory       = str8_skip_chop_whitespace(target->working_directory);\r\n              String8 custom_entry_point_name = str8_skip_chop_whitespace(target->custom_entry_point_name);\r\n              String8 stdout_path             = str8_skip_chop_whitespace(target->stdout_path);\r\n              String8 stderr_path             = str8_skip_chop_whitespace(target->stderr_path);\r\n              String8 stdin_path              = str8_skip_chop_whitespace(target->stdin_path);\r\n              String8List env                 = target->env;\r\n              if(working_directory.size == 0)\r\n              {\r\n                working_directory = os_get_current_path(scratch.arena);\r\n              }\r\n              \r\n              // rjf: build launch options\r\n              String8List cmdln_strings = {0};\r\n              {\r\n                str8_list_push(scratch.arena, &cmdln_strings, exe);\r\n                {\r\n                  U64 start_split_idx = 0;\r\n                  B32 quoted = 0;\r\n                  for(U64 idx = 0; idx <= args.size; idx += 1)\r\n                  {\r\n                    U8 byte = idx < args.size ? args.str[idx] : 0;\r\n                    if(byte == '\"')\r\n                    {\r\n                      quoted ^= 1;\r\n                    }\r\n                    B32 splitter_found = (!quoted && (byte == 0 || char_is_space(byte)));\r\n                    if(splitter_found)\r\n                    {\r\n                      String8 string = str8_substr(args, r1u64(start_split_idx, idx));\r\n                      if(string.size > 0)\r\n                      {\r\n                        str8_list_push(scratch.arena, &cmdln_strings, string);\r\n                      }\r\n                      start_split_idx = idx+1;\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: push message to launch\r\n              {\r\n                CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n                msg->kind = CTRL_MsgKind_Launch;\r\n                msg->path = working_directory;\r\n                msg->cmd_line_string_list = cmdln_strings;\r\n                msg->stdout_path = stdout_path;\r\n                msg->stderr_path = stderr_path;\r\n                msg->stdin_path  = stdin_path;\r\n                msg->debug_subprocesses = target->debug_subprocesses;\r\n                msg->env_inherit = 1;\r\n                MemoryCopyArray(msg->exception_code_filters, exception_code_filters);\r\n                str8_list_push(scratch.arena, &msg->entry_points, custom_entry_point_name);\r\n                msg->env_string_list = env;\r\n              }\r\n            }\r\n            \r\n            // rjf: run\r\n            need_run = 1;\r\n            run_kind = D_RunKind_Run;\r\n            run_thread = &ctrl_entity_nil;\r\n            run_flags = (cmd->kind == D_CmdKind_LaunchAndStepInto) ? CTRL_RunFlag_StopOnEntryPoint : 0;\r\n          }\r\n          \r\n          // rjf: no targets -> error\r\n          if(targets_to_launch->count == 0)\r\n          {\r\n            log_user_error(str8_lit(\"No active targets exist; cannot launch. You must select a target first.\"));\r\n          }\r\n        }break;\r\n        case D_CmdKind_Kill:\r\n        {\r\n          CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process);\r\n          if(process == &ctrl_entity_nil)\r\n          {\r\n            log_user_error(str8_lit(\"Cannot kill; no process was specified.\"));\r\n          }\r\n          else\r\n          {\r\n            CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n            msg->kind = CTRL_MsgKind_Kill;\r\n            msg->exit_code = 1;\r\n            msg->entity = process->handle;\r\n            MemoryCopyArray(msg->exception_code_filters, exception_code_filters);\r\n          }\r\n        }break;\r\n        case D_CmdKind_KillAll:\r\n        {\r\n          CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n          msg->kind = CTRL_MsgKind_KillAll;\r\n          msg->exit_code = 1;\r\n          MemoryCopyArray(msg->exception_code_filters, exception_code_filters);\r\n        }break;\r\n        case D_CmdKind_Detach:\r\n        {\r\n          CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->process);\r\n          if(process == &ctrl_entity_nil)\r\n          {\r\n            log_user_error(str8_lit(\"Cannot detach; no process specified.\"));\r\n          }\r\n          else\r\n          {\r\n            CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n            msg->kind   = CTRL_MsgKind_Detach;\r\n            msg->entity = process->handle;\r\n            MemoryCopyArray(msg->exception_code_filters, exception_code_filters);\r\n          }\r\n        }break;\r\n        case D_CmdKind_Continue:\r\n        {\r\n          B32 good_to_run = 0;\r\n          CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread);\r\n          if(threads.count > 0)\r\n          {\r\n            for EachIndex(idx, threads.count)\r\n            {\r\n              CTRL_Entity *thread = threads.v[idx];\r\n              if(!thread->is_frozen)\r\n              {\r\n                good_to_run = 1;\r\n                break;\r\n              }\r\n            }\r\n            if(good_to_run)\r\n            {\r\n              need_run = 1;\r\n              run_kind = D_RunKind_Run;\r\n              run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread);\r\n            }\r\n            else\r\n            {\r\n              log_user_error(str8_lit(\"Cannot run with all threads frozen.\"));\r\n            }\r\n          }\r\n        }break;\r\n        case D_CmdKind_StepIntoInst:\r\n        case D_CmdKind_StepOverInst:\r\n        case D_CmdKind_StepIntoLine:\r\n        case D_CmdKind_StepOverLine:\r\n        case D_CmdKind_StepOut:\r\n        {\r\n          CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread);\r\n          if(thread == &ctrl_entity_nil)\r\n          {\r\n            log_user_error(str8_lit(\"Must have a selected thread to step.\"));\r\n          }\r\n          else if(d_ctrl_targets_running())\r\n          {\r\n            if(d_ctrl_last_run_kind() == D_RunKind_Run)\r\n            {\r\n              log_user_error(str8_lit(\"Must halt before stepping.\"));\r\n            }\r\n          }\r\n          else if(thread->is_frozen)\r\n          {\r\n            log_user_error(str8_lit(\"Must thaw selected thread before stepping.\"));\r\n          }\r\n          else\r\n          {\r\n            D_TrapNet trap_net = {0};\r\n            switch(cmd->kind)\r\n            {\r\n              default: break;\r\n              case D_CmdKind_StepIntoInst: {trap_net.good_read = 1;}break;\r\n              case D_CmdKind_StepOverInst: {trap_net = d_trap_net_from_thread__step_over_inst(scratch.arena, thread);}break;\r\n              case D_CmdKind_StepIntoLine: {trap_net = d_trap_net_from_thread__step_into_line(scratch.arena, thread);}break;\r\n              case D_CmdKind_StepOverLine: {trap_net = d_trap_net_from_thread__step_over_line(scratch.arena, thread);}break;\r\n              case D_CmdKind_StepOut:\r\n              {\r\n                Access *access = access_open();\r\n                \r\n                // rjf: thread => call stack\r\n                CTRL_CallStack callstack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000);\r\n                \r\n                // rjf: use first unwind frame to generate trap\r\n                if(callstack.concrete_frames_count > 1)\r\n                {\r\n                  U64 vaddr = regs_rip_from_arch_block(thread->arch, callstack.concrete_frames[1]->regs);\r\n                  CTRL_Trap trap = {CTRL_TrapFlag_EndStepping|CTRL_TrapFlag_IgnoreStackPointerCheck, vaddr};\r\n                  ctrl_trap_list_push(scratch.arena, &trap_net.traps, &trap);\r\n                  trap_net.good_read = 1;\r\n                }\r\n                else\r\n                {\r\n                  log_user_error(str8_lit(\"Could not find the return address of the current callstack frame successfully.\"));\r\n                }\r\n                \r\n                access_close(access);\r\n              }break;\r\n            }\r\n            B32 good_trap_net = (trap_net.good_read || !trap_net.good_line_info);\r\n            if(good_trap_net && trap_net.traps.count != 0)\r\n            {\r\n              need_run   = 1;\r\n              run_kind   = D_RunKind_Step;\r\n              run_thread = thread;\r\n              run_flags  = 0;\r\n              run_traps  = trap_net.traps;\r\n            }\r\n            else if(good_trap_net && trap_net.traps.count == 0)\r\n            {\r\n              need_run   = 1;\r\n              run_kind   = D_RunKind_SingleStep;\r\n              run_thread = thread;\r\n              run_flags  = 0;\r\n              run_traps  = trap_net.traps;\r\n            }\r\n            else if(!good_trap_net && params->retry_idx < 100)\r\n            {\r\n              D_CmdParams params_copy = *params;\r\n              params_copy.retry_idx += 1;\r\n              d_cmd_list_push_new(scratch.arena, &deferred_cmds, cmd->kind, &params_copy);\r\n            }\r\n            else if(!good_trap_net)\r\n            {\r\n              log_user_error(str8_lit(\"Could not successfully step.\"));\r\n            }\r\n          }\r\n        }break;\r\n        case D_CmdKind_Halt:\r\n        if(d_ctrl_targets_running())\r\n        {\r\n          ctrl_halt();\r\n        }break;\r\n        case D_CmdKind_SoftHaltRefresh:\r\n        if(d_ctrl_targets_running())\r\n        {\r\n          need_run   = 1;\r\n          run_kind   = d_state->ctrl_last_run_kind;\r\n          run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle);\r\n          run_flags  = d_state->ctrl_last_run_flags;\r\n          run_traps  = d_state->ctrl_last_run_traps;\r\n        }break;\r\n        case D_CmdKind_SetThreadIP:\r\n        {\r\n          CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->thread);\r\n          U64 vaddr = params->vaddr;\r\n          void *block = ctrl_reg_block_from_thread(scratch.arena, &d_state->ctrl_entity_store->ctx, thread->handle);\r\n          regs_arch_block_write_rip(thread->arch, block, vaddr);\r\n          B32 result = ctrl_thread_write_reg_block(thread->handle, block);\r\n          (void)result;\r\n        }break;\r\n        \r\n        //- rjf: high-level composite target control operations\r\n        case D_CmdKind_RunToLine:\r\n        {\r\n          run_extra_bps.count = 1;\r\n          run_extra_bps.v = push_array(scratch.arena, D_Breakpoint, 1);\r\n          if(params->file_path.size != 0)\r\n          {\r\n            run_extra_bps.v[0].file_path = params->file_path;\r\n            run_extra_bps.v[0].pt        = params->cursor;\r\n          }\r\n          else if(params->vaddr != 0)\r\n          {\r\n            run_extra_bps.v[0].vaddr_expr = push_str8f(scratch.arena, \"0x%I64x\", params->vaddr);\r\n          }\r\n          d_cmd(D_CmdKind_Run);\r\n        }break;\r\n        case D_CmdKind_Run:\r\n        {\r\n          CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n          if(processes.count != 0)\r\n          {\r\n            d_cmd(D_CmdKind_Continue, .machine = params->machine, .process = params->process, .thread = params->thread);\r\n          }\r\n          else if(!d_ctrl_targets_running())\r\n          {\r\n            d_cmd(D_CmdKind_LaunchAndRun);\r\n          }\r\n        }break;\r\n        case D_CmdKind_Restart:\r\n        {\r\n          CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n          if(processes.count != 0)\r\n          {\r\n            d_cmd(D_CmdKind_KillAll);\r\n          }\r\n          d_cmd(D_CmdKind_LaunchAndRun);\r\n        }break;\r\n        case D_CmdKind_StepInto:\r\n        case D_CmdKind_StepOver:\r\n        {\r\n          CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n          if(processes.count != 0)\r\n          {\r\n            D_CmdKind step_cmd_kind = (cmd->kind == D_CmdKind_StepInto\r\n                                       ? D_CmdKind_StepIntoLine\r\n                                       : D_CmdKind_StepOverLine);\r\n            B32 prefer_disasm = params->prefer_disasm;\r\n            if(prefer_disasm)\r\n            {\r\n              step_cmd_kind = (cmd->kind == D_CmdKind_StepInto\r\n                               ? D_CmdKind_StepIntoInst\r\n                               : D_CmdKind_StepOverInst);\r\n            }\r\n            d_cmd(step_cmd_kind, .thread = params->thread);\r\n          }\r\n          else if(!d_ctrl_targets_running())\r\n          {\r\n            d_cmd(D_CmdKind_LaunchAndStepInto, .targets = *targets);\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: debug control context management operations\r\n        case D_CmdKind_FreezeThread:\r\n        case D_CmdKind_ThawThread:\r\n        case D_CmdKind_FreezeProcess:\r\n        case D_CmdKind_ThawProcess:\r\n        case D_CmdKind_FreezeMachine:\r\n        case D_CmdKind_ThawMachine:\r\n        {\r\n          D_CmdKind disptch_kind = ((cmd->kind == D_CmdKind_FreezeThread ||\r\n                                     cmd->kind == D_CmdKind_FreezeProcess ||\r\n                                     cmd->kind == D_CmdKind_FreezeMachine)\r\n                                    ? D_CmdKind_FreezeEntity\r\n                                    : D_CmdKind_ThawEntity);\r\n          d_push_cmd(disptch_kind, params);\r\n        }break;\r\n        case D_CmdKind_FreezeLocalMachine:\r\n        {\r\n          CTRL_MachineID machine_id = CTRL_MachineID_Local;\r\n          d_cmd(D_CmdKind_FreezeMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero()));\r\n        }break;\r\n        case D_CmdKind_ThawLocalMachine:\r\n        {\r\n          CTRL_MachineID machine_id = CTRL_MachineID_Local;\r\n          d_cmd(D_CmdKind_ThawMachine, .entity = ctrl_handle_make(machine_id, dmn_handle_zero()));\r\n        }break;\r\n        case D_CmdKind_FreezeEntity:\r\n        case D_CmdKind_ThawEntity:\r\n        {\r\n          B32 should_freeze = (cmd->kind == D_CmdKind_FreezeEntity);\r\n          CTRL_Entity *root = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity);\r\n          for(CTRL_Entity *e = root; e != &ctrl_entity_nil; e = ctrl_entity_rec_depth_first_pre(e, root).next)\r\n          {\r\n            if(e->kind == CTRL_EntityKind_Thread)\r\n            {\r\n              e->is_frozen = should_freeze;\r\n              CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n              msg->kind   = (should_freeze ? CTRL_MsgKind_FreezeThread : CTRL_MsgKind_ThawThread);\r\n              msg->entity = e->handle;\r\n            }\r\n          }\r\n          if(d_ctrl_targets_running())\r\n          {\r\n            need_run   = 1;\r\n            run_kind   = d_state->ctrl_last_run_kind;\r\n            run_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, d_state->ctrl_last_run_thread_handle);\r\n            run_flags  = d_state->ctrl_last_run_flags;\r\n            run_traps  = d_state->ctrl_last_run_traps;\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: entity decoration\r\n        case D_CmdKind_SetEntityColor:\r\n        {\r\n          CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity);\r\n          entity->rgba = params->rgba;\r\n        }break;\r\n        case D_CmdKind_SetEntityName:\r\n        {\r\n          CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, params->entity);\r\n          ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, params->string);\r\n        }break;\r\n        \r\n        //- rjf: attaching\r\n        case D_CmdKind_Attach:\r\n        {\r\n          U32 pid = params->pid;\r\n          if(pid != 0)\r\n          {\r\n            CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n            msg->kind      = CTRL_MsgKind_Attach;\r\n            msg->entity_id = pid;\r\n            MemoryCopyArray(msg->exception_code_filters, exception_code_filters);\r\n          }\r\n        }break;\r\n      }\r\n      \r\n      // rjf: do run if needed\r\n      if(need_run)\r\n      {\r\n        // rjf: compute hash of all run-parameterization entities, store\r\n        {\r\n          d_state->ctrl_last_run_param_state_hash = ctrl_param_state_hash;\r\n        }\r\n        \r\n        // rjf: push & fill run message\r\n        CTRL_Msg *msg = ctrl_msg_list_push(scratch.arena, &ctrl_msgs);\r\n        {\r\n          CTRL_Entity *process = ctrl_entity_ancestor_from_kind(run_thread, CTRL_EntityKind_Process);\r\n          msg->kind = (run_kind == D_RunKind_Run || run_kind == D_RunKind_Step) ? CTRL_MsgKind_Run : CTRL_MsgKind_SingleStep;\r\n          msg->run_flags  = run_flags;\r\n          msg->entity     = run_thread->handle;\r\n          msg->parent     = process->handle;\r\n          MemoryCopyArray(msg->exception_code_filters, exception_code_filters);\r\n          MemoryCopyStruct(&msg->traps, &run_traps);\r\n          D_BreakpointArray *bp_batches[] =\r\n          {\r\n            breakpoints,\r\n            &run_extra_bps,\r\n          };\r\n          for(U64 batch_idx = 0; batch_idx < ArrayCount(bp_batches); batch_idx += 1)\r\n          {\r\n            D_BreakpointArray *batch_breakpoints = bp_batches[batch_idx];\r\n            for(U64 idx = 0; idx < batch_breakpoints->count; idx += 1)\r\n            {\r\n              // rjf: unpack user breakpoint entity\r\n              D_Breakpoint *bp = &batch_breakpoints->v[idx];\r\n              \r\n              // rjf: d -> ctrl flags\r\n              CTRL_UserBreakpointFlags ctrl_bp_flags = 0;\r\n              if(bp->flags & D_BreakpointFlag_BreakOnWrite)    { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnWrite; }\r\n              if(bp->flags & D_BreakpointFlag_BreakOnRead)     { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnRead; }\r\n              if(bp->flags & D_BreakpointFlag_BreakOnExecute)  { ctrl_bp_flags |= CTRL_UserBreakpointFlag_BreakOnExecute; }\r\n              \r\n              // rjf: textual location -> add breakpoints for all possible override locations\r\n              if(bp->file_path.size != 0 && bp->pt.line != 0)\r\n              {\r\n                String8List overrides = d_possible_path_overrides_from_maps_path(scratch.arena, path_maps, bp->file_path);\r\n                for(String8Node *n = overrides.first; n != 0; n = n->next)\r\n                {\r\n                  CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_FileNameAndLineColNumber};\r\n                  ctrl_user_bp.flags     = ctrl_bp_flags;\r\n                  ctrl_user_bp.id        = bp->id;\r\n                  ctrl_user_bp.string    = n->string;\r\n                  ctrl_user_bp.pt        = bp->pt;\r\n                  ctrl_user_bp.condition = bp->condition;\r\n                  ctrl_user_bp.size      = bp->size;\r\n                  ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp);\r\n                }\r\n              }\r\n              \r\n              // rjf: virtual address expression -> add expression breakpoint\r\n              else if(bp->vaddr_expr.size != 0)\r\n              {\r\n                CTRL_UserBreakpoint ctrl_user_bp = {CTRL_UserBreakpointKind_Expression};\r\n                ctrl_user_bp.flags     = ctrl_bp_flags;\r\n                ctrl_user_bp.id        = bp->id;\r\n                ctrl_user_bp.string    = bp->vaddr_expr;\r\n                ctrl_user_bp.condition = bp->condition;\r\n                ctrl_user_bp.size      = bp->size;\r\n                ctrl_user_breakpoint_list_push(scratch.arena, &msg->user_bps, &ctrl_user_bp);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: copy run traps to scratch (needed, if run_traps can be `d_state->ctrl_last_run_traps`)\r\n        CTRL_TrapList run_traps_copy = ctrl_trap_list_copy(scratch.arena, &run_traps);\r\n        D_BreakpointArray run_extra_bps_copy = d_breakpoint_array_copy(scratch.arena, &run_extra_bps);\r\n        \r\n        // rjf: store last run info\r\n        arena_clear(d_state->ctrl_last_run_arena);\r\n        d_state->ctrl_last_run_kind              = run_kind;\r\n        d_state->ctrl_last_run_frame_idx         = d_frame_index();\r\n        d_state->ctrl_last_run_thread_handle     = run_thread->handle;\r\n        d_state->ctrl_last_run_flags             = run_flags;\r\n        d_state->ctrl_last_run_traps             = ctrl_trap_list_copy(d_state->ctrl_last_run_arena, &run_traps_copy);\r\n        d_state->ctrl_last_run_extra_bps         = d_breakpoint_array_copy(d_state->ctrl_last_run_arena, &run_extra_bps_copy);\r\n        d_state->ctrl_is_running                 = 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: clear command batch\r\n  //\r\n  {\r\n    arena_clear(d_state->cmds_arena);\r\n    MemoryZeroStruct(&d_state->cmds);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: push deferred commands\r\n  //\r\n  for EachNode(n, D_CmdNode, deferred_cmds.first)\r\n  {\r\n    d_cmd_list_push_new(d_state->cmds_arena, &d_state->cmds, n->cmd.kind, &n->cmd.params);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: push new control messages to queue - try to send queue to control,\r\n  // clear queue if successful (if not, we'll just keep them around until\r\n  // the next tick)\r\n  //\r\n  {\r\n    CTRL_MsgList msgs_copy = ctrl_msg_list_deep_copy(d_state->ctrl_msg_arena, &ctrl_msgs);\r\n    ctrl_msg_list_concat_in_place(&d_state->ctrl_msgs, &msgs_copy);\r\n    if(d_state->ctrl_msgs.count != 0)\r\n    {\r\n      if(!d_state->ctrl_soft_halt_issued && d_state->ctrl_thread_run_state)\r\n      {\r\n        d_state->ctrl_soft_halt_issued = 1;\r\n        ctrl_halt();\r\n      }\r\n      if(ctrl_u2c_push_msgs(&d_state->ctrl_msgs, os_now_microseconds()+100))\r\n      {\r\n        MemoryZeroStruct(&d_state->ctrl_msgs);\r\n        arena_clear(d_state->ctrl_msg_arena);\r\n      }\r\n    }\r\n  }\r\n  \r\n  ProfEnd();\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/dbg_engine/dbg_engine_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DBG_ENGINE_CORE_H\r\n#define DBG_ENGINE_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Tick Input Types\r\n\r\ntypedef struct D_Target D_Target;\r\nstruct D_Target\r\n{\r\n  String8 exe;\r\n  String8 args;\r\n  String8 working_directory;\r\n  String8 custom_entry_point_name;\r\n  String8 stdout_path;\r\n  String8 stderr_path;\r\n  String8 stdin_path;\r\n  B32 debug_subprocesses;\r\n  String8List env;\r\n};\r\n\r\ntypedef struct D_TargetArray D_TargetArray;\r\nstruct D_TargetArray\r\n{\r\n  D_Target *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef U32 D_BreakpointFlags;\r\nenum\r\n{\r\n  D_BreakpointFlag_BreakOnWrite   = (1<<0),\r\n  D_BreakpointFlag_BreakOnRead    = (1<<1),\r\n  D_BreakpointFlag_BreakOnExecute = (1<<2),\r\n};\r\n\r\ntypedef struct D_Breakpoint D_Breakpoint;\r\nstruct D_Breakpoint\r\n{\r\n  D_BreakpointFlags flags;\r\n  U64 id;\r\n  String8 file_path;\r\n  TxtPt pt;\r\n  String8 vaddr_expr;\r\n  String8 condition;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct D_BreakpointArray D_BreakpointArray;\r\nstruct D_BreakpointArray\r\n{\r\n  D_Breakpoint *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct D_PathMap D_PathMap;\r\nstruct D_PathMap\r\n{\r\n  String8 src;\r\n  String8 dst;\r\n};\r\n\r\ntypedef struct D_PathMapArray D_PathMapArray;\r\nstruct D_PathMapArray\r\n{\r\n  D_PathMap *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Trap Nets\r\n\r\ntypedef struct D_TrapNet D_TrapNet;\r\nstruct D_TrapNet\r\n{\r\n  CTRL_TrapList traps;\r\n  B32 good_line_info;\r\n  B32 good_read;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Tick Output Types\r\n\r\ntypedef enum D_EventKind\r\n{\r\n  D_EventKind_Null,\r\n  D_EventKind_ModuleLoad,\r\n  D_EventKind_ProcessEnd,\r\n  D_EventKind_Stop,\r\n  D_EventKind_COUNT\r\n}\r\nD_EventKind;\r\n\r\ntypedef enum D_EventCause\r\n{\r\n  D_EventCause_Null,\r\n  D_EventCause_UserBreakpoint,\r\n  D_EventCause_Halt,\r\n  D_EventCause_SoftHalt,\r\n  D_EventCause_COUNT\r\n}\r\nD_EventCause;\r\n\r\ntypedef struct D_Event D_Event;\r\nstruct D_Event\r\n{\r\n  D_EventKind kind;\r\n  D_EventCause cause;\r\n  CTRL_Handle module;\r\n  CTRL_Handle thread;\r\n  U64 vaddr;\r\n  U64 code;\r\n  U64 id;\r\n};\r\n\r\ntypedef struct D_EventNode D_EventNode;\r\nstruct D_EventNode\r\n{\r\n  D_EventNode *next;\r\n  D_Event v;\r\n};\r\n\r\ntypedef struct D_EventList D_EventList;\r\nstruct D_EventList\r\n{\r\n  D_EventNode *first;\r\n  D_EventNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Line Info Types\r\n\r\ntypedef struct D_Line D_Line;\r\nstruct D_Line\r\n{\r\n  String8 file_path;\r\n  TxtPt pt;\r\n  Rng1U64 voff_range;\r\n  DI_Key dbgi_key;\r\n};\r\n\r\ntypedef struct D_LineNode D_LineNode;\r\nstruct D_LineNode\r\n{\r\n  D_LineNode *next;\r\n  D_Line v;\r\n};\r\n\r\ntypedef struct D_LineList D_LineList;\r\nstruct D_LineList\r\n{\r\n  D_LineNode *first;\r\n  D_LineNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct D_LineListArray D_LineListArray;\r\nstruct D_LineListArray\r\n{\r\n  D_LineList *v;\r\n  U64 count;\r\n  DI_KeyList dbgi_keys;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Engine Control Communication Types\r\n\r\ntypedef enum D_RunKind\r\n{\r\n  D_RunKind_Run,\r\n  D_RunKind_SingleStep,\r\n  D_RunKind_Step,\r\n  D_RunKind_COUNT\r\n}\r\nD_RunKind;\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"dbg_engine/generated/dbg_engine.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Types\r\n\r\ntypedef struct D_CmdParams D_CmdParams;\r\nstruct D_CmdParams\r\n{\r\n  CTRL_Handle machine;\r\n  CTRL_Handle process;\r\n  CTRL_Handle thread;\r\n  CTRL_Handle entity;\r\n  String8 string;\r\n  String8 file_path;\r\n  TxtPt cursor;\r\n  U64 vaddr;\r\n  B32 prefer_disasm;\r\n  U32 pid;\r\n  U32 rgba;\r\n  D_TargetArray targets;\r\n  U64 retry_idx;\r\n};\r\n\r\ntypedef struct D_Cmd D_Cmd;\r\nstruct D_Cmd\r\n{\r\n  D_CmdKind kind;\r\n  D_CmdParams params;\r\n};\r\n\r\ntypedef struct D_CmdNode D_CmdNode;\r\nstruct D_CmdNode\r\n{\r\n  D_CmdNode *next;\r\n  D_CmdNode *prev;\r\n  D_Cmd cmd;\r\n};\r\n\r\ntypedef struct D_CmdList D_CmdList;\r\nstruct D_CmdList\r\n{\r\n  D_CmdNode *first;\r\n  D_CmdNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Caches\r\n\r\n//- rjf: per-run tls-base-vaddr cache\r\n\r\ntypedef struct D_RunTLSBaseCacheNode D_RunTLSBaseCacheNode;\r\nstruct D_RunTLSBaseCacheNode\r\n{\r\n  D_RunTLSBaseCacheNode *hash_next;\r\n  CTRL_Handle process;\r\n  U64 root_vaddr;\r\n  U64 rip_vaddr;\r\n  U64 tls_base_vaddr;\r\n};\r\n\r\ntypedef struct D_RunTLSBaseCacheSlot D_RunTLSBaseCacheSlot;\r\nstruct D_RunTLSBaseCacheSlot\r\n{\r\n  D_RunTLSBaseCacheNode *first;\r\n  D_RunTLSBaseCacheNode *last;\r\n};\r\n\r\ntypedef struct D_RunTLSBaseCache D_RunTLSBaseCache;\r\nstruct D_RunTLSBaseCache\r\n{\r\n  Arena *arena;\r\n  U64 slots_count;\r\n  D_RunTLSBaseCacheSlot *slots;\r\n};\r\n\r\n//- rjf: per-run locals cache\r\n\r\ntypedef struct D_RunLocalsCacheNode D_RunLocalsCacheNode;\r\nstruct D_RunLocalsCacheNode\r\n{\r\n  D_RunLocalsCacheNode *hash_next;\r\n  DI_Key dbgi_key;\r\n  U64 voff;\r\n  E_String2NumMap *locals_map;\r\n};\r\n\r\ntypedef struct D_RunLocalsCacheSlot D_RunLocalsCacheSlot;\r\nstruct D_RunLocalsCacheSlot\r\n{\r\n  D_RunLocalsCacheNode *first;\r\n  D_RunLocalsCacheNode *last;\r\n};\r\n\r\ntypedef struct D_RunLocalsCache D_RunLocalsCache;\r\nstruct D_RunLocalsCache\r\n{\r\n  Arena *arena;\r\n  U64 table_size;\r\n  D_RunLocalsCacheSlot *table;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Types\r\n\r\ntypedef struct D_State D_State;\r\nstruct D_State\r\n{\r\n  // rjf: top-level state\r\n  Arena *arena;\r\n  U64 frame_index;\r\n  \r\n  // rjf: commands\r\n  Arena *cmds_arena;\r\n  D_CmdList cmds;\r\n  \r\n  // rjf: output log key\r\n  C_Key output_log_key;\r\n  \r\n  // rjf: per-run caches\r\n  U64 tls_base_cache_reggen_idx;\r\n  U64 tls_base_cache_memgen_idx;\r\n  D_RunTLSBaseCache tls_base_caches[2];\r\n  U64 tls_base_cache_gen;\r\n  U64 locals_cache_reggen_idx;\r\n  D_RunLocalsCache locals_caches[2];\r\n  U64 locals_cache_gen;\r\n  U64 member_cache_reggen_idx;\r\n  D_RunLocalsCache member_caches[2];\r\n  U64 member_cache_gen;\r\n  \r\n  // rjf: user -> ctrl driving state\r\n  Arena *ctrl_last_run_arena;\r\n  D_RunKind ctrl_last_run_kind;\r\n  U64 ctrl_last_run_frame_idx;\r\n  CTRL_Handle ctrl_last_run_thread_handle;\r\n  CTRL_RunFlags ctrl_last_run_flags;\r\n  CTRL_TrapList ctrl_last_run_traps;\r\n  D_BreakpointArray ctrl_last_run_extra_bps;\r\n  U128 ctrl_last_run_param_state_hash;\r\n  B32 ctrl_is_running;\r\n  B32 ctrl_thread_run_state;\r\n  B32 ctrl_soft_halt_issued;\r\n  Arena *ctrl_msg_arena;\r\n  CTRL_MsgList ctrl_msgs;\r\n  \r\n  // rjf: ctrl -> user reading state\r\n  CTRL_EntityCtxRWStore *ctrl_entity_store;\r\n  Arena *ctrl_stop_arena;\r\n  CTRL_Event ctrl_last_stop_event;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal D_State *d_state = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64 d_hash_from_seed_string(U64 seed, String8 string);\r\ninternal U64 d_hash_from_string(String8 string);\r\ninternal U64 d_hash_from_seed_string__case_insensitive(U64 seed, String8 string);\r\ninternal U64 d_hash_from_string__case_insensitive(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Breakpoints\r\n\r\ninternal D_BreakpointArray d_breakpoint_array_copy(Arena *arena, D_BreakpointArray *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Path Map Application\r\n\r\ninternal String8List d_possible_path_overrides_from_maps_path(Arena *arena, D_PathMapArray *path_maps, String8 file_path);\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Extraction Type Pure Functions\r\n\r\ninternal D_LineList d_line_list_copy(Arena *arena, D_LineList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Type Functions\r\n\r\n//- rjf: command parameters\r\ninternal D_CmdParams d_cmd_params_copy(Arena *arena, D_CmdParams *src);\r\n\r\n//- rjf: command lists\r\ninternal void d_cmd_list_push_new(Arena *arena, D_CmdList *cmds, D_CmdKind kind, D_CmdParams *params);\r\n\r\n////////////////////////////////\r\n//~ rjf: Stepping \"Trap Net\" Builders\r\n\r\ninternal D_TrapNet d_trap_net_from_thread__step_over_inst(Arena *arena, CTRL_Entity *thread);\r\ninternal D_TrapNet d_trap_net_from_thread__step_over_line(Arena *arena, CTRL_Entity *thread);\r\ninternal D_TrapNet d_trap_net_from_thread__step_into_line(Arena *arena, CTRL_Entity *thread);\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Lookups\r\n\r\n//- rjf: voff -> line info\r\ninternal D_LineList d_lines_from_dbgi_key_voff(Arena *arena, DI_Key dbgi_key, U64 voff);\r\n\r\n//- rjf: file:line -> line info\r\n// TODO(rjf): this depends on file path maps, needs to move\r\n// TODO(rjf): need to clean this up & dedup\r\ninternal D_LineListArray d_lines_array_from_dbgi_key_file_path_line_range(Arena *arena, DI_Key dbgi_key, String8 file_path, Rng1S64 line_num_range);\r\ninternal D_LineListArray d_lines_array_from_file_path_line_range(Arena *arena, String8 file_path, Rng1S64 line_num_range);\r\ninternal D_LineList d_lines_from_dbgi_key_file_path_line_num(Arena *arena, DI_Key dbgi_key, String8 file_path, S64 line_num);\r\ninternal D_LineList d_lines_from_file_path_line_num(Arena *arena, String8 file_path, S64 line_num);\r\n\r\n////////////////////////////////\r\n//~ rjf: Process/Thread/Module Info Lookups\r\n\r\ninternal U64 d_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr);\r\n\r\n////////////////////////////////\r\n//~ rjf: Target Controls\r\n\r\n//- rjf: stopped info from the control thread\r\ninternal CTRL_Event d_ctrl_last_stop_event(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Accessors/Mutators\r\n\r\n//- rjf: frame data\r\ninternal U64 d_frame_index(void);\r\n\r\n//- rjf: control state\r\ninternal D_RunKind d_ctrl_last_run_kind(void);\r\ninternal U64 d_ctrl_last_run_frame_idx(void);\r\ninternal B32 d_ctrl_targets_running(void);\r\n\r\n//- rjf: active entity based queries\r\ninternal DI_KeyList d_push_active_dbgi_key_list(Arena *arena);\r\n\r\n//- rjf: per-run caches\r\ninternal U64 d_query_cached_rip_from_thread(CTRL_Entity *thread);\r\ninternal U64 d_query_cached_rip_from_thread_unwind(CTRL_Entity *thread, U64 unwind_count);\r\ninternal U64 d_query_cached_tls_base_vaddr_from_process_root_rip(CTRL_Entity *process, U64 root_vaddr, U64 rip_vaddr);\r\ninternal E_String2NumMap *d_query_cached_locals_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff);\r\ninternal E_String2NumMap *d_query_cached_member_map_from_dbgi_key_voff(DI_Key dbgi_key, U64 voff);\r\n\r\n//- rjf: top-level command dispatch\r\ninternal void d_push_cmd(D_CmdKind kind, D_CmdParams *params);\r\n#define d_cmd(kind, ...) d_push_cmd((kind), &(D_CmdParams){.thread = {0}, __VA_ARGS__})\r\n\r\n//- rjf: command iteration\r\ninternal B32 d_next_cmd(D_Cmd **cmd);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Top-Level Calls\r\n\r\ninternal void d_init(void);\r\ninternal D_EventList d_tick(Arena *arena, D_TargetArray *targets, D_BreakpointArray *breakpoints, D_PathMapArray *path_maps, U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64]);\r\n\r\n#endif // DBG_ENGINE_CORE_H\r\n"
  },
  {
    "path": "src/dbg_engine/dbg_engine_inc.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#include \"dbg_engine_core.c\"\n"
  },
  {
    "path": "src/dbg_engine/dbg_engine_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DBG_ENGINE_INC_H\r\n#define DBG_ENGINE_INC_H\r\n\r\n#include \"dbg_engine_core.h\"\r\n\r\n#endif // DBG_ENGINE_INC_H\r\n"
  },
  {
    "path": "src/dbg_engine/generated/dbg_engine.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n"
  },
  {
    "path": "src/dbg_engine/generated/dbg_engine.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef DBG_ENGINE_META_H\r\n#define DBG_ENGINE_META_H\r\n\r\ntypedef enum D_CmdKind\r\n{\r\nD_CmdKind_Null,\r\nD_CmdKind_LaunchAndRun,\r\nD_CmdKind_LaunchAndStepInto,\r\nD_CmdKind_Kill,\r\nD_CmdKind_KillAll,\r\nD_CmdKind_Detach,\r\nD_CmdKind_Continue,\r\nD_CmdKind_StepIntoInst,\r\nD_CmdKind_StepOverInst,\r\nD_CmdKind_StepIntoLine,\r\nD_CmdKind_StepOverLine,\r\nD_CmdKind_StepOut,\r\nD_CmdKind_Halt,\r\nD_CmdKind_SoftHaltRefresh,\r\nD_CmdKind_SetThreadIP,\r\nD_CmdKind_RunToLine,\r\nD_CmdKind_Run,\r\nD_CmdKind_Restart,\r\nD_CmdKind_StepInto,\r\nD_CmdKind_StepOver,\r\nD_CmdKind_FreezeThread,\r\nD_CmdKind_ThawThread,\r\nD_CmdKind_FreezeProcess,\r\nD_CmdKind_ThawProcess,\r\nD_CmdKind_FreezeMachine,\r\nD_CmdKind_ThawMachine,\r\nD_CmdKind_FreezeLocalMachine,\r\nD_CmdKind_ThawLocalMachine,\r\nD_CmdKind_FreezeEntity,\r\nD_CmdKind_ThawEntity,\r\nD_CmdKind_SetEntityColor,\r\nD_CmdKind_SetEntityName,\r\nD_CmdKind_Attach,\r\nD_CmdKind_COUNT,\r\n} D_CmdKind;\r\n\r\nglobal B32 DEV_always_refresh = 0;\r\nglobal B32 DEV_simulate_lag = 0;\r\nglobal B32 DEV_draw_ui_text_pos = 0;\r\nglobal B32 DEV_draw_ui_focus_debug = 0;\r\nglobal B32 DEV_draw_ui_box_heatmap = 0;\r\nglobal B32 DEV_eval_compiler_tooltips = 0;\r\nglobal B32 DEV_eval_watch_key_tooltips = 0;\r\nglobal B32 DEV_cmd_context_tooltips = 0;\r\nglobal B32 DEV_updating_indicator = 0;\r\nstruct {B32 *value_ptr; String8 name;} DEV_toggle_table[] =\r\n{\r\n{&DEV_always_refresh, str8_lit_comp(\"always_refresh\")},\r\n{&DEV_simulate_lag, str8_lit_comp(\"simulate_lag\")},\r\n{&DEV_draw_ui_text_pos, str8_lit_comp(\"draw_ui_text_pos\")},\r\n{&DEV_draw_ui_focus_debug, str8_lit_comp(\"draw_ui_focus_debug\")},\r\n{&DEV_draw_ui_box_heatmap, str8_lit_comp(\"draw_ui_box_heatmap\")},\r\n{&DEV_eval_compiler_tooltips, str8_lit_comp(\"eval_compiler_tooltips\")},\r\n{&DEV_eval_watch_key_tooltips, str8_lit_comp(\"eval_watch_key_tooltips\")},\r\n{&DEV_cmd_context_tooltips, str8_lit_comp(\"cmd_context_tooltips\")},\r\n{&DEV_updating_indicator, str8_lit_comp(\"updating_indicator\")},\r\n};\r\n#endif // DBG_ENGINE_META_H\r\n"
  },
  {
    "path": "src/dbg_info/dbg_info.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DI_Key\r\ndi_key_zero(void)\r\n{\r\n  DI_Key key = {0};\r\n  return key;\r\n}\r\n\r\ninternal B32\r\ndi_key_match(DI_Key a, DI_Key b)\r\n{\r\n  B32 result = MemoryMatchStruct(&a, &b);\r\n  return result;\r\n}\r\n\r\ninternal void\r\ndi_key_list_push(Arena *arena, DI_KeyList *list, DI_Key key)\r\n{\r\n  DI_KeyNode *n = push_array(arena, DI_KeyNode, 1);\r\n  n->v = key;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal DI_KeyArray\r\ndi_key_array_from_list(Arena *arena, DI_KeyList *list)\r\n{\r\n  DI_KeyArray array = {0};\r\n  array.count = list->count;\r\n  array.v = push_array(arena, DI_Key, array.count);\r\n  U64 idx = 0;\r\n  for EachNode(n, DI_KeyNode, list->first)\r\n  {\r\n    array.v[idx] = n->v;\r\n    idx += 1;\r\n  }\r\n  return array;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void\r\ndi_init(CmdLine *cmdline)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  di_shared = push_array(arena, DI_Shared, 1);\r\n  di_shared->arena = arena;\r\n  di_shared->key2path_slots_count = 4096;\r\n  di_shared->key2path_slots = push_array(arena, DI_KeySlot, di_shared->key2path_slots_count);\r\n  di_shared->key2path_stripes = stripe_array_alloc(arena);\r\n  di_shared->path2key_slots_count = 4096;\r\n  di_shared->path2key_slots = push_array(arena, DI_KeySlot, di_shared->path2key_slots_count);\r\n  di_shared->path2key_stripes = stripe_array_alloc(arena);\r\n  di_shared->slots_count = 4096;\r\n  di_shared->slots = push_array(arena, DI_Slot, di_shared->slots_count);\r\n  di_shared->stripes = stripe_array_alloc(arena);\r\n  for EachElement(idx, di_shared->req_batches)\r\n  {\r\n    di_shared->req_batches[idx].mutex = mutex_alloc();\r\n    di_shared->req_batches[idx].arena = arena_alloc();\r\n  }\r\n  U64 signal_pid = 0;\r\n  String8 signal_pid_string = cmd_line_string(cmdline, str8_lit(\"signal_pid\"));\r\n  B32 has_parent = 1;\r\n  if(!try_u64_from_str8_c_rules(signal_pid_string, &signal_pid))\r\n  {\r\n    has_parent = 0;\r\n    signal_pid = os_get_process_info()->pid;\r\n  }\r\n  U64 signal_code = 0;\r\n  String8 signal_code_string = cmd_line_string(cmdline, str8_lit(\"signal_code\"));\r\n  try_u64_from_str8_c_rules(signal_code_string, &signal_code);\r\n  di_shared->conversion_completion_code = signal_code;\r\n  di_shared->conversion_completion_lock_semaphore_name = str8f(arena, \"conversion_completion_lock_pid_%I64u\", signal_pid);\r\n  di_shared->conversion_completion_signal_semaphore_name = str8f(arena, \"conversion_completion_signal_pid_%I64u\", signal_pid);\r\n  di_shared->conversion_completion_shared_memory_name = str8f(arena, \"conversion_completion_shared_memory_pid_%I64u\", signal_pid);\r\n  if(has_parent)\r\n  {\r\n    di_shared->conversion_completion_lock_semaphore = semaphore_open(di_shared->conversion_completion_lock_semaphore_name);\r\n    di_shared->conversion_completion_signal_semaphore = semaphore_open(di_shared->conversion_completion_signal_semaphore_name);\r\n    di_shared->conversion_completion_shared_memory = os_shared_memory_open(di_shared->conversion_completion_shared_memory_name);\r\n  }\r\n  else\r\n  {\r\n    di_shared->conversion_completion_lock_semaphore = semaphore_alloc(1, 1, di_shared->conversion_completion_lock_semaphore_name);\r\n    di_shared->conversion_completion_signal_semaphore = semaphore_alloc(0, 65536, di_shared->conversion_completion_signal_semaphore_name);\r\n    di_shared->conversion_completion_shared_memory = os_shared_memory_alloc(KB(4), di_shared->conversion_completion_shared_memory_name);\r\n    di_shared->conversion_completion_signal_receiver_thread = thread_launch(di_conversion_completion_signal_receiver_thread_entry_point, 0);\r\n  }\r\n  di_shared->conversion_completion_shared_memory_base = (U64 *)os_shared_memory_view_open(di_shared->conversion_completion_shared_memory, r1u64(0, KB(4)));\r\n  di_shared->completion_mutex = mutex_alloc();\r\n  di_shared->completion_arena = arena_alloc();\r\n  di_shared->event_mutex = mutex_alloc();\r\n  di_shared->event_arena = arena_alloc();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Path * Timestamp Cache Submission & Lookup\r\n\r\ninternal DI_Key\r\ndi_key_from_path_timestamp(String8 path, U64 min_timestamp)\r\n{\r\n  //- rjf: unpack key\r\n  U64 hash = u64_hash_from_str8(path);\r\n  U64 slot_idx = hash%di_shared->path2key_slots_count;\r\n  DI_KeySlot *slot = &di_shared->path2key_slots[slot_idx];\r\n  Stripe *stripe = stripe_from_slot_idx(&di_shared->path2key_stripes, slot_idx);\r\n  \r\n  //- rjf: look up key, create if needed\r\n  DI_Key key = {0};\r\n  for(B32 write_mode = 0; write_mode <= 1; write_mode += 1)\r\n  {\r\n    // rjf: look up node, with this write mode, to find existing key computation\r\n    B32 found = 0;\r\n    RWMutexScope(stripe->rw_mutex, write_mode)\r\n    {\r\n      DI_KeyPathNode *node = 0;\r\n      for(DI_KeyPathNode *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(str8_match(n->path, path, 0) && min_timestamp <= n->min_timestamp)\r\n        {\r\n          found = 1;\r\n          node = n;\r\n          key = node->key;\r\n          break;\r\n        }\r\n      }\r\n      if(!found && write_mode)\r\n      {\r\n        node = stripe->free;\r\n        if(node)\r\n        {\r\n          stripe->free = node->next;\r\n        }\r\n        else\r\n        {\r\n          node = push_array(stripe->arena, DI_KeyPathNode, 1);\r\n        }\r\n        node->path = str8_copy(stripe->arena, path);\r\n        node->min_timestamp = min_timestamp;\r\n        node->key = key;\r\n        DLLPushBack(slot->first, slot->last, node);\r\n      }\r\n    }\r\n    \r\n    // rjf: found the key? abort\r\n    if(found)\r\n    {\r\n      break;\r\n    }\r\n    \r\n    // rjf: didn't find the key on our read lookup? compute the key before entering\r\n    // write mode\r\n    if(!found && !write_mode)\r\n    {\r\n      B32 made_key = 0;\r\n      \r\n      //- rjf: try to make key from file's contents\r\n      if(!made_key)\r\n      {\r\n        OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);\r\n        FileProperties props = os_properties_from_file(file);\r\n        if(min_timestamp <= props.modified)\r\n        {\r\n          //- rjf: PDB magic => use GUID for key\r\n          if(!made_key)\r\n          {\r\n            B32 is_pdb = 0;\r\n            if(!is_pdb)\r\n            {\r\n              read_only local_persist char msf_msf20_magic[] = \"Microsoft C/C++ program database 2.00\\r\\n\\x1aJG\\0\\0\";\r\n              U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0};\r\n              os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe);\r\n              if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe)))\r\n              {\r\n                is_pdb = 1;\r\n              }\r\n            }\r\n            if(!is_pdb)\r\n            {\r\n              read_only local_persist char msf_msf70_magic[] = \"Microsoft C/C++ MSF 7.00\\r\\n\\032DS\\0\\0\";\r\n              U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0};\r\n              os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe);\r\n              if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe)))\r\n              {\r\n                is_pdb = 1;\r\n              }\r\n            }\r\n            if(is_pdb)\r\n            {\r\n              // TODO(rjf)\r\n            }\r\n          }\r\n        }\r\n        os_file_close(file);\r\n      }\r\n      \r\n      //- rjf: fallback: hash from path/timestamp\r\n      if(!made_key)\r\n      {\r\n        made_key = 1;\r\n        U128 hash = u128_hash_from_seed_str8(min_timestamp, path);\r\n        MemoryCopy(&key, &hash, Min(sizeof(hash), sizeof(key)));\r\n      }\r\n      \r\n      //- rjf: made key -> store in (key -> path/timestamp) table\r\n      if(made_key)\r\n      {\r\n        U64 key_hash = u64_hash_from_str8(str8_struct(&key));\r\n        U64 key_slot_idx = key_hash%di_shared->key2path_slots_count;\r\n        DI_KeySlot *key_slot = &di_shared->key2path_slots[key_slot_idx];\r\n        Stripe *key_stripe = stripe_from_slot_idx(&di_shared->key2path_stripes, key_slot_idx);\r\n        RWMutexScope(key_stripe->rw_mutex, 1)\r\n        {\r\n          DI_KeyPathNode *node = 0;\r\n          for EachNode(n, DI_KeyPathNode, key_slot->first)\r\n          {\r\n            if(di_key_match(n->key, key))\r\n            {\r\n              node = n;\r\n              break;\r\n            }\r\n          }\r\n          if(node == 0)\r\n          {\r\n            node = key_stripe->free;\r\n            if(node != 0)\r\n            {\r\n              key_stripe->free = node->next;\r\n            }\r\n            else\r\n            {\r\n              node = push_array(key_stripe->arena, DI_KeyPathNode, 1);\r\n            }\r\n            DLLPushBack(key_slot->first, key_slot->last, node);\r\n            node->path = str8_copy(key_stripe->arena, path);\r\n            node->min_timestamp = min_timestamp;\r\n            node->key = key;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return key;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Opening / Closing\r\n\r\ninternal void\r\ndi_open(DI_Key key)\r\n{\r\n  //- rjf: unpack key\r\n  U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n  U64 slot_idx = hash%di_shared->slots_count;\r\n  DI_Slot *slot = &di_shared->slots[slot_idx];\r\n  Stripe *stripe = stripe_from_slot_idx(&di_shared->stripes, slot_idx);\r\n  \r\n  //- rjf: bump this key's node's refcount; create if needed\r\n  B32 node_is_new = 0;\r\n  RWMutexScope(stripe->rw_mutex, 1)\r\n  {\r\n    DI_Node *node = 0;\r\n    for(DI_Node *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(di_key_match(n->key, key))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      node_is_new = 1;\r\n      node = stripe->free;\r\n      if(node)\r\n      {\r\n        stripe->free = node->next;\r\n      }\r\n      else\r\n      {\r\n        node = push_array_no_zero(stripe->arena, DI_Node, 1);\r\n      }\r\n      MemoryZeroStruct(node);\r\n      DLLPushBack(slot->first, slot->last, node);\r\n      node->key = key;\r\n      node->batch_request_counts[1] = 1;\r\n    }\r\n    node->refcount += 1;\r\n  }\r\n  \r\n  //- rjf: if new, submit low-priority request to load this key\r\n  if(node_is_new)\r\n  {\r\n    DI_RequestBatch *batch = &di_shared->req_batches[1];\r\n    MutexScope(batch->mutex)\r\n    {\r\n      DI_RequestNode *n = push_array(batch->arena, DI_RequestNode, 1);\r\n      SLLQueuePush(batch->first, batch->last, n);\r\n      n->v.key = key;\r\n      batch->count += 1;\r\n    }\r\n    cond_var_broadcast(async_tick_start_cond_var);\r\n    ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n  }\r\n}\r\n\r\ninternal void\r\ndi_close(DI_Key key, B32 force_closed)\r\n{\n  //- rjf: unpack key\r\n  U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n  U64 slot_idx = hash%di_shared->slots_count;\r\n  DI_Slot *slot = &di_shared->slots[slot_idx];\r\n  Stripe *stripe = stripe_from_slot_idx(&di_shared->stripes, slot_idx);\r\n  \r\n  //- rjf: decrement this key's node's refcount; remove if needed\r\n  B32 node_released = 0;\r\n  OS_Handle file = {0};\r\n  OS_Handle file_map = {0};\r\n  FileProperties file_props = {0};\r\n  void *file_base = 0;\r\n  Arena *arena = 0;\r\n  RWMutexScope(stripe->rw_mutex, 1)\r\n  {\r\n    DI_Node *node = 0;\r\n    for(DI_Node *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(di_key_match(n->key, key) && ins_atomic_u64_eval(&n->completion_count) > 0)\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node)\r\n    {\n      if(force_closed)\n      {\n        node->refcount = 0;\n      }\n      else\n      {\n        node->refcount -= 1;\n      }\n      if(node->refcount == 0)\r\n      {\r\n        for(;;)\r\n        {\r\n          if(access_pt_is_expired(&node->access_pt, .time = 0, .update_idxs = 0))\r\n          {\r\n            node_released = 1;\r\n            DLLRemove(slot->first, slot->last, node);\r\n            node->next = stripe->free;\r\n            stripe->free = node;\r\n            file = node->file;\r\n            file_map = node->file_map;\r\n            file_props = node->file_props;\r\n            file_base = node->file_base;\r\n            arena = node->arena;\r\n            break;\r\n          }\r\n          cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 1, max_U64);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: release node's resources if needed\r\n  if(node_released)\r\n  {\n    ins_atomic_u64_dec_eval(&di_shared->load_count);\n    ins_atomic_u64_inc_eval(&di_shared->load_gen);\n    os_file_map_view_close(file_map, file_base, r1u64(0, file_props.size));\r\n    os_file_map_close(file_map);\r\n    os_file_close(file);\r\n    if(arena != 0)\r\n    {\r\n      arena_release(arena);\r\n    }\r\n  }\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Lookups\r\n\r\ninternal U64\r\ndi_load_gen(void)\r\n{\r\n  U64 result = ins_atomic_u64_eval(&di_shared->load_gen);\r\n  return result;\r\n}\r\n\ninternal U64\ndi_load_count(void)\n{\n  U64 result = ins_atomic_u64_eval(&di_shared->load_count);\r\n  return result;\n}\n\r\ninternal DI_KeyArray\r\ndi_push_all_loaded_keys(Arena *arena)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DI_KeyList list = {0};\r\n  {\r\n    for EachIndex(slot_idx, di_shared->key2path_slots_count)\r\n    {\r\n      DI_KeySlot *slot = &di_shared->key2path_slots[slot_idx];\r\n      Stripe *stripe = stripe_from_slot_idx(&di_shared->key2path_stripes, slot_idx);\r\n      RWMutexScope(stripe->rw_mutex, 0)\r\n      {\r\n        for(DI_KeyPathNode *n = slot->first; n != 0; n = n->next)\r\n        {\r\n          DI_KeyNode *dst_n = push_array(scratch.arena, DI_KeyNode, 1);\r\n          SLLQueuePush(list.first, list.last, dst_n);\r\n          list.count += 1;\r\n          dst_n->v = n->key;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  DI_KeyArray array = {0};\r\n  array.count = list.count;\r\n  array.v = push_array(arena, DI_Key, array.count);\r\n  {\r\n    U64 idx = 0;\r\n    for EachNode(n, DI_KeyNode, list.first)\r\n    {\r\n      array.v[idx] = n->v;\r\n      idx += 1;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return array;\r\n}\r\n\r\ninternal RDI_Parsed *\r\ndi_rdi_from_key(Access *access, DI_Key key, B32 high_priority, U64 endt_us)\r\n{\r\n  RDI_Parsed *rdi = &rdi_parsed_nil;\r\n  {\r\n    U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n    U64 slot_idx = hash%di_shared->slots_count;\r\n    DI_Slot *slot = &di_shared->slots[slot_idx];\r\n    Stripe *stripe = stripe_from_slot_idx(&di_shared->stripes, slot_idx);\r\n    RWMutexScope(stripe->rw_mutex, 0) for(;;)\r\n    {\r\n      // rjf: try to grab current results\r\n      B32 found = 0;\r\n      B32 need_hi_request = 0;\r\n      B32 grabbed = 0;\r\n      for(DI_Node *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(di_key_match(n->key, key) && ins_atomic_u64_eval(&n->refcount) > 0)\r\n        {\r\n          found = 1;\r\n          if(high_priority && ins_atomic_u64_eval_cond_assign(&n->batch_request_counts[0], 1, 0) == 0)\r\n          {\r\n            need_hi_request = 1;\r\n          }\r\n          if(ins_atomic_u64_eval(&n->completion_count) > 0)\r\n          {\r\n            grabbed = 1;\r\n            rdi = &n->rdi;\r\n            access_touch(access, &n->access_pt, stripe->cv);\r\n          }\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: push high-priority request if needed\r\n      if(need_hi_request)\r\n      {\r\n        DI_RequestBatch *batch = &di_shared->req_batches[0];\r\n        MutexScope(batch->mutex)\r\n        {\r\n          DI_RequestNode *n = push_array(batch->arena, DI_RequestNode, 1);\r\n          SLLQueuePush(batch->first, batch->last, n);\r\n          n->v.key = key;\r\n          batch->count += 1;\r\n        }\r\n        cond_var_broadcast(async_tick_start_cond_var);\r\n        ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n        ins_atomic_u32_eval_assign(&async_loop_again_high_priority, 1);\r\n      }\r\n      \r\n      // rjf: found current results, or out-of-time? abort\r\n      if(grabbed || os_now_microseconds() >= endt_us)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      // rjf: wait on stripe change\r\n      cond_var_wait_rw(stripe->cv, stripe->rw_mutex, 0, endt_us);\r\n    }\r\n  }\r\n  return rdi;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Events\r\n\r\ninternal DI_EventList\r\ndi_get_events(Arena *arena)\r\n{\r\n  DI_EventList dst = {0};\r\n  MutexScope(di_shared->event_mutex)\r\n  {\r\n    for EachNode(src_n, DI_EventNode, di_shared->events.first)\r\n    {\r\n      DI_EventNode *dst_n = push_array(arena, DI_EventNode, 1);\r\n      MemoryCopyStruct(&dst_n->v, &src_n->v);\r\n      dst_n->v.string = str8_copy(arena, dst_n->v.string);\r\n      SLLQueuePush(dst.first, dst.last, dst_n);\r\n      dst.count += 1;\r\n    }\r\n    MemoryZeroStruct(&di_shared->events);\r\n    arena_clear(di_shared->event_arena);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void\r\ndi_async_tick(void)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do single-lane update: pop requests, update tasks, gather RDI paths to parse wide\r\n  //\r\n  typedef struct ParseTask ParseTask;\r\n  struct ParseTask\r\n  {\r\n    DI_Key key;\r\n    String8 rdi_path;\r\n  };\r\n  ParseTask *parse_tasks = 0;\r\n  U64 parse_tasks_count = 0;\r\n  if(lane_idx() == 0)\r\n  {\r\n    typedef struct ParseTaskNode ParseTaskNode;\r\n    struct ParseTaskNode\r\n    {\r\n      ParseTaskNode *next;\r\n      ParseTask v;\r\n    };\r\n    ParseTaskNode *first_parse_task = 0;\r\n    ParseTaskNode *last_parse_task = 0;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: pop all requests, high priority first\r\n    //\r\n    DI_RequestNode *first_req[2] = {0};\r\n    DI_RequestNode *last_req[2] = {0};\r\n    for EachElement(idx, di_shared->req_batches)\r\n    {\r\n      DI_RequestBatch *b = &di_shared->req_batches[idx];\r\n      MutexScope(b->mutex)\r\n      {\r\n        for EachNode(n, DI_RequestNode, b->first)\r\n        {\r\n          DI_RequestNode *n_copy = push_array(scratch.arena, DI_RequestNode, 1);\r\n          MemoryCopyStruct(&n_copy->v, &n->v);\r\n          SLLQueuePush(first_req[idx], last_req[idx], n_copy);\r\n        }\r\n        arena_clear(b->arena);\r\n        b->first = b->last = 0;\r\n        b->count = 0;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather all completions\r\n    //\r\n    DI_LoadCompletion *first_completion = 0;\r\n    DI_LoadCompletion *last_completion = 0;\r\n    MutexScope(di_shared->completion_mutex)\r\n    {\r\n      for EachNode(c, DI_LoadCompletion, di_shared->first_completion)\r\n      {\r\n        DI_LoadCompletion *dst_c = push_array(scratch.arena, DI_LoadCompletion, 1);\r\n        SLLQueuePush(first_completion, last_completion, dst_c);\r\n        dst_c->code = c->code;\r\n      }\r\n      arena_clear(di_shared->completion_arena);\r\n      di_shared->first_completion = di_shared->last_completion = 0;\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: generate load tasks for all unique requests\r\n    //\n    for EachElement(priority_idx, first_req)\n    {\n      for EachNode(n, DI_RequestNode, first_req[priority_idx])\r\n      {\r\n        // rjf: unpack request\r\n        DI_Key key = n->v.key;\r\n        \n        // rjf: determine if this request is a duplicate\r\n        B32 request_is_duplicate = 1;\r\n        {\r\n          U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n          U64 slot_idx = hash%di_shared->slots_count;\r\n          DI_Slot *slot = &di_shared->slots[slot_idx];\r\n          Stripe *stripe = stripe_from_slot_idx(&di_shared->stripes, slot_idx);\r\n          RWMutexScope(stripe->rw_mutex, 0)\r\n          {\r\n            for(DI_Node *n = slot->first; n != 0; n = n->next)\r\n            {\r\n              if(di_key_match(n->key, key) && ins_atomic_u64_eval(&n->completion_count) == 0)\r\n              {\r\n                request_is_duplicate = (ins_atomic_u64_eval_cond_assign(&n->working_count, 1, 0) != 0);\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \n        // rjf: if not a duplicate, create new task\r\n        if(!request_is_duplicate)\r\n        {\r\n          DI_LoadTask *t = di_shared->free_load_task;\r\n          if(t)\r\n          {\r\n            SLLStackPop(di_shared->free_load_task);\r\n          }\r\n          else\r\n          {\r\n            t = push_array_no_zero(di_shared->arena, DI_LoadTask, 1);\r\n          }\r\n          MemoryZeroStruct(t);\r\n          DLLPushBack(di_shared->first_load_task[priority_idx], di_shared->last_load_task[priority_idx], t);\r\n          t->key = key;\r\n        }\r\n      }\n    }\n    \r\n    ////////////////////////////\r\n    //- rjf: update tasks: configure, launch if we can, & retire if we can\r\n    //\n    for EachElement(priority_idx, di_shared->first_load_task)\n    {\n      for(DI_LoadTask *t = di_shared->first_load_task[priority_idx], *next = 0; t != 0; t = next)\r\n      {\r\n        next = t->next;\r\n        \n        //- rjf: unpack key\r\n        DI_Key key = t->key;\r\n        U64 key_hash = u64_hash_from_str8(str8_struct(&key));\r\n        U64 key_slot_idx = key_hash%di_shared->key2path_slots_count;\r\n        DI_KeySlot *key_slot = &di_shared->key2path_slots[key_slot_idx];\r\n        Stripe *key_stripe = stripe_from_slot_idx(&di_shared->key2path_stripes, key_slot_idx);\r\n        \n        //- rjf: get key's O.G. path\r\n        String8 og_path = {0};\r\n        U64 og_min_timestamp = 0;\r\n        RWMutexScope(key_stripe->rw_mutex, 0)\r\n        {\r\n          for(DI_KeyPathNode *n = key_slot->first; n != 0; n = n->next)\r\n          {\r\n            if(di_key_match(n->key, key))\r\n            {\r\n              og_path = str8_copy(scratch.arena, n->path);\r\n              og_min_timestamp = n->min_timestamp;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \n        //- rjf: analyze O.G. debug info\n        if(!t->og_analyzed)\r\n        {\r\n          t->og_analyzed = 1;\r\n          OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, og_path);\r\n          FileProperties props = os_properties_from_file(file);\n          t->og_size = props.size;\r\n          U64 rdi_magic_maybe = 0;\r\n          if(os_file_read_struct(file, 0, &rdi_magic_maybe) == 8 &&\r\n             rdi_magic_maybe == RDI_MAGIC_CONSTANT)\r\n          {\r\n            t->og_is_rdi = 1;\r\n          }\r\n          os_file_close(file);\r\n        }\r\n        U64 og_size = t->og_size;\n        B32 og_is_rdi = t->og_is_rdi;\r\n        B32 og_is_good = (og_size > 0);\n        \n        //- rjf: compute key's RDI path\r\n        String8 rdi_path = {0};\n        {\r\n          if(og_is_rdi)\r\n          {\r\n            rdi_path = og_path;\r\n          }\r\n          else\r\n          {\r\n            rdi_path = str8f(scratch.arena, \"%S.rdi\", str8_chop_last_dot(og_path));\r\n          }\r\n        }\r\n        \n        //- rjf: determine if RDI is stale\r\n        if(!t->rdi_analyzed)\r\n        {\r\n          t->rdi_analyzed = 1;\r\n          OS_Handle file = os_file_open(OS_AccessFlag_ShareRead|OS_AccessFlag_Read, rdi_path);\r\n          FileProperties props = os_properties_from_file(file);\r\n          if(props.modified < og_min_timestamp)\r\n          {\r\n            t->rdi_is_stale = 1;\r\n          }\r\n          else\r\n          {\r\n            t->rdi_is_stale = 1;\r\n            RDI_Header header = {0};\r\n            if(os_file_read_struct(file, 0, &header) == sizeof(header))\r\n            {\r\n              t->rdi_is_stale = (header.encoding_version != RDI_ENCODING_VERSION);\r\n            }\r\n          }\r\n          os_file_close(file);\r\n        }\r\n        B32 rdi_is_stale = t->rdi_is_stale;\r\n        \n        //- rjf: calculate thread counts for conversion processes\r\n        if(!og_is_rdi && rdi_is_stale && t->thread_count == 0)\r\n        {\r\n          U64 thread_count = 1;\r\n          U64 max_thread_count = os_get_system_info()->logical_processor_count/2;\n          if(priority_idx > 0)\n          {\n            max_thread_count = Max(1, max_thread_count/2);\n          }\n          {\r\n            if(0){}\r\n            else if(og_size <= MB(4))   {thread_count = 1;}\r\n            else if(og_size <= MB(256)) {thread_count = max_thread_count/4;}\r\n            else if(og_size <= MB(512)) {thread_count = max_thread_count/3;}\r\n            else if(og_size <= GB(1)) {thread_count = max_thread_count/2;}\r\n            else {thread_count = max_thread_count;}\r\n          }\r\n          thread_count = Max(1, thread_count);\r\n          t->thread_count = thread_count;\r\n        }\r\n        \n        //- rjf: determine if there are threads available\r\n        B32 threads_available = 0;\r\n        {\r\n          U64 max_threads = os_get_system_info()->logical_processor_count/2;\r\n          U64 current_threads = di_shared->conversion_thread_count;\r\n          U64 needed_threads = (current_threads + t->thread_count);\r\n          threads_available = (max_threads >= needed_threads);\r\n        }\r\n        \n        //- rjf: if this conversion will overwrite an RDI we already have in cache,\n        // then we need to evict the old one from the cache.\n        B32 ready_to_launch_conversion = (threads_available && !og_is_rdi && rdi_is_stale && t->thread_count != 0 && t->status != DI_LoadTaskStatus_Active);\n        if(ready_to_launch_conversion)\n        {\n          U64 path2key_hash = u64_hash_from_str8(og_path);\r\n          U64 path2key_slot_idx = path2key_hash%di_shared->path2key_slots_count;\r\n          DI_KeySlot *path2key_slot = &di_shared->path2key_slots[path2key_slot_idx];\r\n          Stripe *path2key_stripe = stripe_from_slot_idx(&di_shared->path2key_stripes, path2key_slot_idx);\n          RWMutexScope(path2key_stripe->rw_mutex, 0)\n          {\n            // NOTE(rjf): we need to iterate from last -> first, since we want to evict the\n            // most recent key.\n            for(DI_KeyPathNode *n = path2key_slot->last; n != 0; n = n->prev)\n            {\n              if(str8_match(n->path, og_path, 0) && !di_key_match(key, n->key))\n              {\n                di_close(n->key, 1);\n              }\n            }\n          }\n        }\n        \n        //- rjf: launch conversion processes\r\n        if(og_is_good && ready_to_launch_conversion)\r\n        {\r\n          B32 should_compress = 0;\r\n          OS_ProcessLaunchParams params = {0};\r\n          params.path = os_get_process_info()->binary_path;\r\n          params.inherit_env = 1;\r\n          params.consoleless = 1;\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"raddbg\");\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--bin\");\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--quiet\");\r\n          if(should_compress)\r\n          {\r\n            str8_list_pushf(scratch.arena, &params.cmd_line, \"--compress\");\r\n          }\r\n          // str8_list_pushf(scratch.arena, &params.cmd_line, \"--capture\");\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--rdi\");\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--out:%S\", rdi_path);\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--thread_count:%I64u\", t->thread_count);\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--signal_pid:%I64u\", (U64)os_get_process_info()->pid);\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"--signal_code:%I64u\", (U64)t);\r\n          str8_list_pushf(scratch.arena, &params.cmd_line, \"%S\", og_path);\r\n          ProfMsg(\"launch creation for %.*s\", str8_varg(rdi_path));\r\n          t->process = os_process_launch(&params);\r\n          t->status = DI_LoadTaskStatus_Active;\r\n          di_shared->conversion_process_count += 1;\r\n          di_shared->conversion_thread_count += t->thread_count;\r\n          \n          // rjf: send event\r\n          MutexScope(di_shared->event_mutex)\r\n          {\r\n            DI_EventNode *n = push_array(di_shared->event_arena, DI_EventNode, 1);\r\n            SLLQueuePush(di_shared->events.first, di_shared->events.last, n);\r\n            di_shared->events.count += 1;\r\n            n->v.kind = DI_EventKind_ConversionStarted;\r\n            n->v.string = str8_copy(di_shared->event_arena, rdi_path);\r\n          }\r\n        }\r\n        \n        //- rjf: if active & process has completed, mark as done\r\n        {\r\n          U64 exit_code = 0;\r\n          if(t->status == DI_LoadTaskStatus_Active)\r\n          {\r\n            B32 task_is_done = 0;\r\n            for(DI_LoadCompletion *c = first_completion; c != 0; c = c->next)\r\n            {\r\n              if(c->code == (U64)t)\r\n              {\r\n                task_is_done = 1;\r\n                break;\r\n              }\r\n            }\r\n            if(!task_is_done)\r\n            {\r\n              task_is_done = os_process_join(t->process, 0, 0);\r\n            }\r\n            if(task_is_done)\r\n            {\r\n              t->status = DI_LoadTaskStatus_Done;\r\n              di_shared->conversion_process_count -= 1;\r\n              di_shared->conversion_thread_count -= t->thread_count;\r\n            }\r\n          }\r\n        }\n        \n        //- rjf: ready to launch, but bad O.G. file -> just immediately mark as done\n        if(!og_is_good && ready_to_launch_conversion)\n        {\n          t->status = DI_LoadTaskStatus_Done;\n        }\n        \n        //- rjf: if the RDI for this task is not stale, then we're already done - mark this\r\n        // task as done & prepped for storing into the cache\r\n        if(!rdi_is_stale)\r\n        {\r\n          t->status = DI_LoadTaskStatus_Done;\r\n        }\r\n        \n        //- rjf: if the RDI for this task *is* stale, but the O.G. path is actually RDI,\r\n        // then we can't actually re-convert to produce a non-stale RDI. in this case, just\r\n        // mark as done.\r\n        if(rdi_is_stale && og_is_rdi)\r\n        {\r\n          t->status = DI_LoadTaskStatus_Done;\r\n        }\r\n        \n        //- rjf: if task is done, retire & recycle task; gather path to load\r\n        if(t->status == DI_LoadTaskStatus_Done)\r\n        {\r\n          if(!os_handle_match(t->process, os_handle_zero())) MutexScope(di_shared->event_mutex)\r\n          {\r\n            DI_EventNode *n = push_array(di_shared->event_arena, DI_EventNode, 1);\r\n            SLLQueuePush(di_shared->events.first, di_shared->events.last, n);\r\n            di_shared->events.count += 1;\r\n            n->v.kind = DI_EventKind_ConversionEnded;\r\n            n->v.string = str8_copy(di_shared->event_arena, rdi_path);\r\n          }\r\n          DLLRemove(di_shared->first_load_task[priority_idx], di_shared->last_load_task[priority_idx], t);\r\n          SLLStackPush(di_shared->free_load_task, t);\r\n          ParseTaskNode *n = push_array(scratch.arena, ParseTaskNode, 1);\r\n          n->v.key = key;\r\n          n->v.rdi_path = rdi_path;\r\n          SLLQueuePush(first_parse_task, last_parse_task, n);\r\n          parse_tasks_count += 1;\r\n        }\r\n      }\n    }\n    \r\n    ////////////////////////////\r\n    //- rjf: join all parse tasks\r\n    //\r\n    parse_tasks = push_array(scratch.arena, ParseTask, parse_tasks_count);\r\n    {\r\n      U64 idx = 0;\r\n      for EachNode(n, ParseTaskNode, first_parse_task)\r\n      {\r\n        parse_tasks[idx] = n->v;\r\n        idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync_u64(&parse_tasks, 0);\r\n  lane_sync_u64(&parse_tasks_count, 0);\r\n  lane_sync();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do wide load of all prepped RDIs\r\n  //\r\n  U64 parse_task_take_counter = 0;\r\n  U64 *parse_task_take_counter_ptr = 0;\r\n  if(lane_idx() == 0)\r\n  {\r\n    parse_task_take_counter_ptr = &parse_task_take_counter;\r\n  }\r\n  lane_sync_u64(&parse_task_take_counter_ptr, 0);\r\n  {\r\n    for(;;)\r\n    {\r\n      //- rjf: take next task\r\n      U64 parse_task_idx = ins_atomic_u64_inc_eval(parse_task_take_counter_ptr) - 1;\r\n      if(parse_task_idx >= parse_tasks_count)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      //- rjf: unpack task\r\n      DI_Key key = parse_tasks[parse_task_idx].key;\r\n      String8 rdi_path = parse_tasks[parse_task_idx].rdi_path;\r\n      ProfBegin(\"parse %.*s\", str8_varg(rdi_path));\r\n      \r\n      //- rjf: open file\r\n      OS_Handle file = {0};\r\n      OS_Handle file_map = {0};\r\n      FileProperties file_props = {0};\r\n      void *file_base = 0;\r\n      {\r\n        file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, rdi_path);\r\n        file_map = os_file_map_open(OS_AccessFlag_Read, file);\r\n        file_props = os_properties_from_file(file);\r\n        file_base = os_file_map_view_open(file_map, OS_AccessFlag_Read, r1u64(0, file_props.size));\r\n      }\r\n      \r\n      //- rjf: do initial parse of rdi\r\n      RDI_Parsed rdi_parsed_maybe_compressed = rdi_parsed_nil;\r\n      {\r\n        RDI_ParseStatus parse_status = rdi_parse((U8 *)file_base, file_props.size, &rdi_parsed_maybe_compressed);\r\n        (void)parse_status;\r\n      }\r\n      \r\n      //- rjf: decompress & re-parse, if necessary\r\n      Arena *rdi_parsed_arena = 0;\r\n      RDI_Parsed rdi_parsed = rdi_parsed_maybe_compressed;\r\n      {\r\n        U64 decompressed_size = rdi_decompressed_size_from_parsed(&rdi_parsed_maybe_compressed);\r\n        if(decompressed_size > file_props.size)\r\n        {\r\n          rdi_parsed_arena = arena_alloc();\r\n          U8 *decompressed_data = push_array_no_zero(rdi_parsed_arena, U8, decompressed_size);\r\n          rdi_decompress_parsed(decompressed_data, decompressed_size, &rdi_parsed_maybe_compressed);\r\n          RDI_ParseStatus parse_status = rdi_parse(decompressed_data, decompressed_size, &rdi_parsed);\r\n          (void)parse_status;\r\n        }\r\n      }\r\n      \r\n      //- rjf: commit parsed info to cache\r\n      {\r\n        ProfMsg(\"commit %.*s\", str8_varg(rdi_path));\r\n        U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n        U64 slot_idx = hash%di_shared->slots_count;\r\n        DI_Slot *slot = &di_shared->slots[slot_idx];\r\n        Stripe *stripe = stripe_from_slot_idx(&di_shared->stripes, slot_idx);\r\n        RWMutexScope(stripe->rw_mutex, 1)\r\n        {\r\n          DI_Node *node = 0;\r\n          for(DI_Node *n = slot->first; n != 0; n = n->next)\r\n          {\r\n            if(di_key_match(n->key, key))\r\n            {\r\n              node = n;\r\n              break;\r\n            }\r\n          }\r\n          if(node)\r\n          {\r\n            node->file = file;\r\n            node->file_map = file_map;\r\n            node->file_props = file_props;\r\n            node->file_base = file_base;\r\n            node->arena = rdi_parsed_arena;\r\n            MemoryCopyStruct(&node->rdi, &rdi_parsed);\r\n            node->completion_count += 1;\r\n            node->working_count -= 1;\n            if(node->rdi.raw_data_size != 0)\n            {\n              ins_atomic_u64_inc_eval(&di_shared->load_gen);\n            }\n            ins_atomic_u64_inc_eval(&di_shared->load_count);\n          }\r\n          else\r\n          {\r\n            if(rdi_parsed_arena != 0)\r\n            {\r\n              arena_release(rdi_parsed_arena);\r\n            }\r\n            os_file_map_view_close(file_map, file_base, r1u64(0, file_props.size));\r\n            os_file_map_close(file_map);\r\n            os_file_close(file);\r\n          }\r\n        }\r\n        cond_var_broadcast(stripe->cv);\r\n      }\r\n      \r\n      ProfEnd();\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Conversion Completion Signal Receiver Thread\r\n\r\ninternal void\r\ndi_signal_completion(void)\r\n{\r\n  semaphore_take(di_shared->conversion_completion_lock_semaphore, max_U64);\r\n  di_shared->conversion_completion_shared_memory_base[0] = di_shared->conversion_completion_code;\r\n  semaphore_drop(di_shared->conversion_completion_lock_semaphore);\r\n  semaphore_drop(di_shared->conversion_completion_signal_semaphore);\r\n}\r\n\r\ninternal void\r\ndi_conversion_completion_signal_receiver_thread_entry_point(void *p)\r\n{\r\n  ThreadNameF(\"di_conversion_completion_signal_receiver_thread\");\r\n  for(;;)\r\n  {\r\n    if(semaphore_take(di_shared->conversion_completion_signal_semaphore, max_U64))\r\n    {\r\n      // rjf: get the next retired code\r\n      U64 retired_code = 0;\r\n      semaphore_take(di_shared->conversion_completion_lock_semaphore, max_U64);\r\n      retired_code = di_shared->conversion_completion_shared_memory_base[0];\r\n      semaphore_drop(di_shared->conversion_completion_lock_semaphore);\r\n      \r\n      // rjf: push completion record\r\n      MutexScope(di_shared->completion_mutex)\r\n      {\r\n        DI_LoadCompletion *c = push_array(di_shared->completion_arena, DI_LoadCompletion, 1);\r\n        SLLQueuePush(di_shared->first_completion, di_shared->last_completion, c);\r\n        c->code = retired_code;\r\n      }\r\n      \r\n      // rjf: signal async system to resume\r\n      ProfMsg(\"signal conversion completion\");\r\n      ins_atomic_u32_eval_assign(&async_loop_again, 1);\r\n      ins_atomic_u32_eval_assign(&async_loop_again_high_priority, 1);\r\n      cond_var_broadcast(async_tick_start_cond_var);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Search Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact\r\ndi_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  ProfBeginFunction();\r\n  Access *access = access_open();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  AC_Artifact artifact = {0};\r\n  {\r\n    //- rjf: unpack key\r\n    RDI_SectionKind section_kind = RDI_SectionKind_NULL;\r\n    String8 query = {0};\r\n    {\r\n      U64 key_read_off = 0;\r\n      key_read_off += str8_deserial_read_struct(key, key_read_off, &section_kind);\r\n      key_read_off += str8_deserial_read_struct(key, key_read_off, &query.size);\r\n      query.str = push_array(scratch.arena, U8, query.size);\r\n      key_read_off += str8_deserial_read(key, key_read_off, query.str, query.size, 1);\r\n    }\r\n    \r\n    //- rjf: gather all debug info keys we'll search on\r\n    DI_KeyArray keys = {0};\r\n    ProfScope(\"gather all debug info keys we'll search on\")\r\n    {\r\n      if(lane_idx() == 0)\r\n      {\r\n        keys = di_push_all_loaded_keys(scratch.arena);\r\n      }\r\n      lane_sync_u64(&keys.v, 0);\r\n      lane_sync_u64(&keys.count, 0);\r\n    }\r\n    \r\n    //- rjf: map all debug info keys -> RDIs\r\n    RDI_Parsed **rdis = 0;\r\n    ProfScope(\"map all debug info keys -> RDIs\")\r\n    {\r\n      if(lane_idx() == 0)\r\n      {\r\n        rdis = push_array(scratch.arena, RDI_Parsed *, keys.count);\r\n      }\r\n      lane_sync_u64(&rdis, 0);\r\n      {\r\n        Rng1U64 range = lane_range(keys.count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          rdis[idx] = di_rdi_from_key(access, keys.v[idx], 0, 0);\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: do wide search on all lanes\n    Arena *arena = arena_alloc();\n    Arena **arenas = 0;\n    U64 arenas_count = lane_count();\n    if(lane_idx() == 0)\n    {\n      arenas = push_array(arena, Arena *, arenas_count);\n    }\n    lane_sync_u64(&arenas, 0);\n    arenas[lane_idx()] = arena;\n    DI_SearchItemChunkList *lanes_items = 0;\r\n    ProfScope(\"do wide search on all lanes\")\r\n    {\r\n      if(lane_idx() == 0)\r\n      {\r\n        lanes_items = push_array(scratch.arena, DI_SearchItemChunkList, lane_count());\r\n      }\r\n      lane_sync_u64(&lanes_items, 0);\r\n      {\r\n        DI_SearchItemChunkList *lane_items = &lanes_items[lane_idx()];\r\n        for EachIndex(rdi_idx, keys.count)\r\n        {\r\n          DI_Key key = keys.v[rdi_idx];\r\n          RDI_Parsed *rdi = rdis[rdi_idx];\r\n          \r\n          // rjf: unpack table info\r\n          U64 element_count = 0;\r\n          void *table_base = rdi_section_raw_table_from_kind(rdi, section_kind, &element_count);\r\n          U64 element_size = rdi_section_element_size_table[section_kind];\r\n          \r\n          // rjf: determine name string index offset, depending on table kind\r\n          U64 element_name_idx_off = 0;\r\n          switch(section_kind)\r\n          {\r\n            default:{}break;\r\n            case RDI_SectionKind_Procedures:\r\n            {\r\n              element_name_idx_off = OffsetOf(RDI_Procedure, name_string_idx);\r\n            }break;\r\n            case RDI_SectionKind_GlobalVariables:\r\n            {\r\n              element_name_idx_off = OffsetOf(RDI_GlobalVariable, name_string_idx);\r\n            }break;\r\n            case RDI_SectionKind_ThreadVariables:\r\n            {\r\n              element_name_idx_off = OffsetOf(RDI_ThreadVariable, name_string_idx);\r\n            }break;\r\n            case RDI_SectionKind_UDTs:\r\n            {\r\n              // NOTE(rjf): name must be determined from self_type_idx\r\n            }break;\r\n            case RDI_SectionKind_SourceFiles:\r\n            {\r\n              // NOTE(rjf): name must be determined from file path node chain\r\n            }break;\r\n          }\r\n          \r\n          Rng1U64 range = lane_range(element_count);\r\n          for EachInRange(idx, range)\r\n          {\r\n            //- rjf: every so often, check if we need to cancel, and cancel\n            if(idx%10000 == 0 && !!ins_atomic_u32_eval(cancel_signal))\n            {\r\n              break;\n            }\r\n            \r\n            //- rjf: get element, map to string; if empty, continue to next element\r\n            void *element = (U8 *)table_base + element_size*idx;\r\n            String8 name = {0};\r\n            switch(section_kind)\r\n            {\r\n              case RDI_SectionKind_UDTs:\r\n              {\r\n                RDI_UDT *udt = (RDI_UDT *)element;\r\n                RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);\r\n                name.str = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name.size);\r\n                name = str8_copy(arena, name);\r\n              }break;\r\n              case RDI_SectionKind_SourceFiles:\r\n              {\r\n                Temp scratch = scratch_begin(&arena, 1);\r\n                RDI_SourceFile *file = (RDI_SourceFile *)element;\r\n                String8List path_parts = {0};\r\n                for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file->file_path_node_idx);\r\n                    fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0);\r\n                    fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node))\r\n                {\r\n                  String8 path_part = {0};\r\n                  path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size);\r\n                  str8_list_push_front(scratch.arena, &path_parts, path_part);\r\n                }\r\n                StringJoin join = {0};\r\n                join.sep = str8_lit(\"/\");\r\n                name = str8_list_join(arena, &path_parts, &join);\r\n                scratch_end(scratch);\r\n              }break;\r\n              default:\r\n              {\r\n                U32 name_idx = *(U32 *)((U8 *)element + element_name_idx_off);\r\n                U64 name_size = 0;\r\n                U8 *name_base = rdi_string_from_idx(rdi, name_idx, &name_size);\r\n                name = str8(name_base, name_size);\r\n              }break;\r\n            }\r\n            if(name.size == 0) { continue; }\r\n            \r\n            //- rjf: fuzzy match against query\r\n            FuzzyMatchRangeList matches = fuzzy_match_find(arena, query, name);\r\n            \r\n            //- rjf: collect\r\n            if(matches.count == matches.needle_part_count)\r\n            {\r\n              DI_SearchItemChunk *chunk = lane_items->last;\r\n              if(chunk == 0 || chunk->count >= chunk->cap)\r\n              {\r\n                chunk = push_array(scratch.arena, DI_SearchItemChunk, 1);\r\n                chunk->base_idx = lane_items->total_count;\r\n                chunk->cap = 1024;\r\n                chunk->count = 0;\r\n                chunk->v = push_array_no_zero(scratch.arena, DI_SearchItem, chunk->cap);\r\n                SLLQueuePush(lane_items->first, lane_items->last, chunk);\r\n                lane_items->chunk_count += 1;\r\n              }\r\n              chunk->v[chunk->count].idx          = idx;\r\n              chunk->v[chunk->count].key          = key;\r\n              chunk->v[chunk->count].match_ranges = matches;\r\n              chunk->v[chunk->count].missed_size  = (name.size > matches.total_dim) ? (name.size-matches.total_dim) : 0;\r\n              chunk->count += 1;\r\n              lane_items->total_count += 1;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: join all lane chunk lists\r\n    DI_SearchItemChunkList *all_items = &lanes_items[0];\r\n    if(lane_idx() == 0) ProfScope(\"join all lane chunk lists\")\r\n    {\r\n      for(U64 lidx = 1; lidx < lane_count(); lidx += 1)\r\n      {\r\n        DI_SearchItemChunkList *dst = all_items;\r\n        DI_SearchItemChunkList *to_push = &lanes_items[lidx];\r\n        for EachNode(n, DI_SearchItemChunk, to_push->first)\r\n        {\r\n          n->base_idx += dst->total_count;\r\n        }\r\n        if(dst->first && to_push->first)\r\n        {\r\n          dst->last->next = to_push->first;\r\n          dst->last = to_push->last;\r\n          dst->chunk_count += to_push->chunk_count;\r\n          dst->total_count += to_push->total_count;\r\n        }\r\n        else if(dst->first == 0)\r\n        {\r\n          MemoryCopyStruct(dst, to_push);\r\n        }\r\n        MemoryZeroStruct(to_push);\r\n      }\r\n    }\r\n    lane_sync();\r\n    \n    //- rjf: decide if we cancelled\n    B32 cancelled = 0;\n    if(lane_idx() == 0 && !!ins_atomic_u32_eval(cancel_signal))\n    {\n      cancelled = 1;\n    }\n    lane_sync_u64(&cancelled, 0);\n    \n    //- rjf: produce sort records\r\n    typedef struct SortRecord SortRecord;\r\n    struct SortRecord\r\n    {\r\n      U64 key;\r\n      DI_SearchItem *item;\r\n    };\r\n    U64 sort_records_count = all_items->total_count;\r\n    SortRecord *sort_records = 0;\r\n    SortRecord *sort_records__swap = 0;\r\n    if(!cancelled) ProfScope(\"produce sort records\")\r\n    {\r\n      if(lane_idx() == 0)\r\n      {\r\n        sort_records = push_array_no_zero(scratch.arena, SortRecord, sort_records_count);\r\n      }\r\n      if(lane_idx() == lane_from_task_idx(1))\r\n      {\r\n        sort_records__swap = push_array_no_zero(scratch.arena, SortRecord, sort_records_count);\r\n      }\r\n      lane_sync_u64(&sort_records, 0);\r\n      lane_sync_u64(&sort_records__swap, lane_from_task_idx(1));\r\n      for EachNode(n, DI_SearchItemChunk, all_items->first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        U64 dst_idx = n->base_idx + range.min;\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          DI_SearchItem *item = &n->v[n_idx];\r\n          sort_records[dst_idx].item = item;\r\n          sort_records[dst_idx].key = (((item->missed_size & 0xffffffffull) << 32) | (u64_hash_from_seed_str8(item->idx, str8_struct(&key)) & 0xffffffffull));\r\n          dst_idx += 1;\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: sort records\r\n    if(!cancelled) ProfScope(\"sort records\")\r\n    {\r\n      //- rjf: set up common data\r\n      U64 bits_per_digit = 8;\r\n      U64 digits_count = 64 / bits_per_digit;\r\n      U64 num_possible_values_per_digit = 1 << bits_per_digit;\r\n      U32 **lanes_digit_counts = 0;\r\n      U32 **lanes_digit_offsets = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lanes_digit_counts = push_array(scratch.arena, U32 *, lane_count());\r\n        lanes_digit_offsets = push_array(scratch.arena, U32 *, lane_count());\r\n      }\r\n      lane_sync_u64(&lanes_digit_counts, 0);\r\n      lane_sync_u64(&lanes_digit_offsets, 0);\r\n      \r\n      //- rjf: set up this lane\r\n      lanes_digit_counts[lane_idx()] = push_array(scratch.arena, U32, num_possible_values_per_digit);\r\n      lanes_digit_offsets[lane_idx()] = push_array(scratch.arena, U32, num_possible_values_per_digit);\r\n      SortRecord *src = sort_records;\r\n      SortRecord *dst = sort_records__swap;\r\n      U64 count = sort_records_count;\r\n      \r\n      //- rjf: do all per-digit sorts\r\n      for EachIndex(digit_idx, digits_count)\r\n      {\r\n        // rjf: count digit value occurrences per-lane\r\n        {\r\n          U32 *digit_counts = lanes_digit_counts[lane_idx()];\r\n          MemoryZero(digit_counts, sizeof(digit_counts[0])*num_possible_values_per_digit);\r\n          Rng1U64 range = lane_range(count);\r\n          for EachInRange(idx, range)\r\n          {\r\n            SortRecord *r = &src[idx];\r\n            U16 digit_value = (U16)(U8)(r->key >> (digit_idx*bits_per_digit));\r\n            digit_counts[digit_value] += 1;\r\n          }\r\n        }\r\n        lane_sync();\r\n        \r\n        // rjf: compute thread * digit value *relative* offset table\r\n        {\r\n          Rng1U64 range = lane_range(num_possible_values_per_digit);\r\n          for EachInRange(value_idx, range)\r\n          {\r\n            U64 layout_off = 0;\r\n            for EachIndex(lane_idx, lane_count())\r\n            {\r\n              lanes_digit_offsets[lane_idx][value_idx] = layout_off;\r\n              layout_off += lanes_digit_counts[lane_idx][value_idx];\r\n            }\r\n          }\r\n        }\r\n        lane_sync();\r\n        \r\n        // rjf: convert relative offsets -> absolute offsets\r\n        if(lane_idx() == 0)\r\n        {\r\n          U64 last_off = 0;\r\n          U64 num_of_nonzero_digit = 0;\r\n          for EachIndex(value_idx, num_possible_values_per_digit)\r\n          {\r\n            for EachIndex(lane_idx, lane_count())\r\n            {\r\n              lanes_digit_offsets[lane_idx][value_idx] += last_off;\r\n            }\r\n            last_off = lanes_digit_offsets[lane_count()-1][value_idx] + lanes_digit_counts[lane_count()-1][value_idx];\r\n          }\r\n          // NOTE(rjf): required that: (last_off == element_count)\r\n        }\r\n        lane_sync();\r\n        \r\n        // rjf: move\r\n        {\r\n          U32 *lane_digit_offsets = lanes_digit_offsets[lane_idx()];\r\n          Rng1U64 range = lane_range(count);\r\n          for EachInRange(idx, range)\r\n          {\r\n            SortRecord *src_r = &src[idx];\r\n            U16 digit_value = (U16)(U8)(src_r->key >> (digit_idx*bits_per_digit));\r\n            U64 dst_off = lane_digit_offsets[digit_value];\r\n            lane_digit_offsets[digit_value] += 1;\r\n            MemoryCopyStruct(&dst[dst_off], src_r);\r\n          }\r\n        }\r\n        lane_sync();\r\n        \r\n        // rjf: swap\r\n        {\r\n          SortRecord *swap = src;\r\n          src = dst;\r\n          dst = swap;\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: produce final array\r\n    DI_SearchItemArray items = {0};\r\n    if(!cancelled) ProfScope(\"produce final array\")\r\n    {\r\n      if(lane_idx() == 0)\r\n      {\r\n        items.count = all_items->total_count;\r\n        items.v = push_array_no_zero(arena, DI_SearchItem, items.count);\r\n      }\r\n      lane_sync_u64(&items.count, 0);\r\n      lane_sync_u64(&items.v, 0);\r\n      Rng1U64 range = lane_range(sort_records_count);\r\n      for EachInRange(idx, range)\r\n      {\r\n        SortRecord *record = &sort_records[idx];\r\n        DI_SearchItem *dst_item = &items.v[idx];\r\n        MemoryCopyStruct(dst_item, record->item);\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: bundle as artifact\n    if(!cancelled) \n    {\n      artifact.u64[0] = (U64)arenas;\n      artifact.u64[1] = arenas_count;\n      artifact.u64[2] = (U64)items.v;\r\n      artifact.u64[3] = items.count;\n    }\n    \n    //- rjf: release results on cancel\n    else\n    {\n      arena_release(arena);\n    }\n  }\r\n  scratch_end(scratch);\r\n  access_close(access);\r\n  ProfEnd();\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\ndi_search_artifact_destroy(AC_Artifact artifact)\r\n{\n  Temp scratch = scratch_begin(0, 0);\n  Arena **arenas = (Arena **)artifact.u64[0];\n  U64 arenas_count = artifact.u64[1];\n  Arena **arenas_copy = push_array(scratch.arena, Arena *, arenas_count);\n  MemoryCopy(arenas_copy, arenas, sizeof(Arena *) * arenas_count);\n  for EachIndex(idx, arenas_count)\n  {\n    if(arenas_copy[idx])\n    {\n      arena_release(arenas_copy[idx]);\n    }\n  }\n  scratch_end(scratch);\n}\r\n\r\ninternal DI_SearchItemArray\r\ndi_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out)\r\n{\r\n  DI_SearchItemArray result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    // rjf: form key\r\n    String8List key_parts = {0};\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&target));\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&query.size));\r\n    str8_list_push(scratch.arena, &key_parts, query);\r\n    String8 key = str8_list_join(scratch.arena, &key_parts, 0);\r\n    \r\n    // rjf: get artifact\r\n    AC_Artifact artifact = ac_artifact_from_key(access, key, di_search_artifact_create, di_search_artifact_destroy, endt_us, .gen = di_load_gen(), .flags = AC_Flag_Wide, .evict_threshold_us = 100000, .stale_out = stale_out);\r\n    \r\n    // rjf: unpack artifact\r\n    result.v = (DI_SearchItem *)artifact.u64[2];\r\n    result.count = artifact.u64[3];\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Match Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact\r\ndi_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: unpack key\r\n  U64 index = 0;\r\n  String8 name = {0};\n  DI_Key preferred_key = {0};\n  {\r\n    U64 key_read_off = 0;\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &index);\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &preferred_key);\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &name.size);\n    name.str = push_array_no_zero(scratch.arena, U8, name.size);\r\n    key_read_off += str8_deserial_read(key, key_read_off, name.str, name.size, 1);\r\n  }\r\n  \r\n  //- rjf: get all loaded keys\r\n  DI_KeyArray dbgi_keys = di_push_all_loaded_keys(scratch.arena);\r\n  \n  //- rjf: take cancellation signal\n  B32 cancelled = 0;\n  if(lane_idx() == 0)\n  {\n    cancelled = ins_atomic_u32_eval(cancel_signal);\n  }\n  lane_sync_u64(&cancelled, 0);\n  \n  //- rjf: wide search across all debug infos\r\n  DI_Match *lane_matches = 0;\n  if(!cancelled)\n  {\n    if(lane_idx() == 0)\r\n    {\r\n      lane_matches = push_array(scratch.arena, DI_Match, lane_count());\r\n    }\r\n    lane_sync_u64(&lane_matches, 0);\r\n    {\r\n      read_only local_persist RDI_NameMapKind name_map_kinds[] =\r\n      {\r\n        RDI_NameMapKind_GlobalVariables,\r\n        RDI_NameMapKind_ThreadVariables,\r\n        RDI_NameMapKind_Constants,\r\n        RDI_NameMapKind_Procedures,\r\n        RDI_NameMapKind_Types,\r\n      };\r\n      read_only local_persist RDI_SectionKind name_map_section_kinds[] =\r\n      {\r\n        RDI_SectionKind_GlobalVariables,\r\n        RDI_SectionKind_ThreadVariables,\r\n        RDI_SectionKind_Constants,\r\n        RDI_SectionKind_Procedures,\r\n        RDI_SectionKind_TypeNodes,\r\n      };\r\n      Rng1U64 range = lane_range(dbgi_keys.count);\r\n      for EachInRange(dbgi_idx, range)\r\n      {\r\n        Access *access = access_open();\r\n        {\r\n          DI_Key dbgi_key = dbgi_keys.v[dbgi_idx];\r\n          RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n          for EachElement(name_map_kind_idx, name_map_kinds)\r\n          {\r\n            RDI_NameMap *name_map = rdi_element_from_name_idx(rdi, NameMaps, name_map_kinds[name_map_kind_idx]);\r\n            RDI_ParsedNameMap parsed_name_map = {0};\r\n            rdi_parsed_from_name_map(rdi, name_map, &parsed_name_map);\r\n            RDI_NameMapNode *map_node = rdi_name_map_lookup(rdi, &parsed_name_map, name.str, name.size);\r\n            U32 num = 0;\r\n            U32 *run = rdi_matches_from_map_node(rdi, map_node, &num);\r\n            if(num != 0)\r\n            {\r\n              lane_matches[lane_idx()].key          = dbgi_key;\r\n              lane_matches[lane_idx()].section_kind = name_map_section_kinds[name_map_kind_idx];\r\n              lane_matches[lane_idx()].idx          = run[num-1];\r\n            }\r\n          }\r\n        }\r\n        access_close(access);\r\n      }\r\n    }\n  }\n  lane_sync();\n  \n  //- rjf: pick match\r\n  DI_Match match = {0};\n  if(lane_matches != 0)\n  {\n    for EachIndex(idx, lane_count())\r\n    {\r\n      if(lane_matches[idx].idx != 0)\r\n      {\r\n        match = lane_matches[idx];\n        if(di_key_match(di_key_zero(), preferred_key) || di_key_match(match.key, preferred_key))\n        {\n          break;\n        }\n      }\r\n    }\r\n  }\n  \n  //- rjf: package as artifact\r\n  AC_Artifact artifact = {0};\r\n  {\r\n    StaticAssert(ArrayCount(artifact.u64) >= 4, artifact_size_check);\r\n    artifact.u64[0] = match.key.u64[0];\r\n    artifact.u64[1] = match.key.u64[1];\r\n    artifact.u64[2] = match.section_kind;\r\n    artifact.u64[3] = match.idx;\r\n  }\r\n  \r\n  lane_sync();\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return artifact;\r\n}\r\n\r\ninternal DI_Match\r\ndi_match_from_string(String8 string, U64 index, DI_Key preferred_dbgi_key, U64 endt_us)\r\n{\r\n  DI_Match result = {0};\r\n  Access *access = access_open();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  {\r\n    String8List key_parts = {0};\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&index));\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&preferred_dbgi_key));\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&string.size));\n    str8_list_push(scratch.arena, &key_parts, string);\r\n    String8 key = str8_list_join(scratch.arena, &key_parts, 0);\n    U64 dbgi_count = di_load_count();\n    B32 wide = (dbgi_count > 256);\n    AC_Artifact artifact = ac_artifact_from_key(access, key, di_match_artifact_create, 0, endt_us, .flags = wide ? AC_Flag_Wide : 0, .gen = di_load_gen(), .evict_threshold_us = wide ? 20000000 : 10000000);\r\n    result.key.u64[0]   = artifact.u64[0];\r\n    result.key.u64[1]   = artifact.u64[1];\r\n    result.section_kind = artifact.u64[2];\r\n    result.idx          = artifact.u64[3];\r\n  }\r\n  scratch_end(scratch);\r\n  access_close(access);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/dbg_info/dbg_info.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DBG_INFO_H\r\n#define DBG_INFO_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Unique Debug Info Key\r\n\r\ntypedef struct DI_Key DI_Key;\r\nstruct DI_Key\r\n{\r\n  U64 u64[2];\r\n};\r\n\r\ntypedef struct DI_KeyNode DI_KeyNode;\r\nstruct DI_KeyNode\r\n{\r\n  DI_KeyNode *next;\r\n  DI_Key v;\r\n};\r\n\r\ntypedef struct DI_KeyList DI_KeyList;\r\nstruct DI_KeyList\r\n{\r\n  DI_KeyNode *first;\r\n  DI_KeyNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct DI_KeyArray DI_KeyArray;\r\nstruct DI_KeyArray\r\n{\r\n  DI_Key *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Path / Timestamp => Key Cache Types\r\n\r\ntypedef struct DI_KeyPathNode DI_KeyPathNode;\r\nstruct DI_KeyPathNode\r\n{\r\n  DI_KeyPathNode *next;\r\n  DI_KeyPathNode *prev;\r\n  String8 path;\r\n  U64 min_timestamp;\r\n  DI_Key key;\r\n};\r\n\r\ntypedef struct DI_KeySlot DI_KeySlot;\r\nstruct DI_KeySlot\r\n{\r\n  DI_KeyPathNode *first;\r\n  DI_KeyPathNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Cache Types\r\n\r\ntypedef struct DI_Node DI_Node;\r\nstruct DI_Node\r\n{\r\n  // rjf: links\r\n  DI_Node *next;\r\n  DI_Node *prev;\r\n  \r\n  // rjf: key\r\n  DI_Key key;\r\n  \r\n  // rjf: value\r\n  OS_Handle file;\r\n  OS_Handle file_map;\r\n  void *file_base;\r\n  FileProperties file_props;\r\n  Arena *arena;\r\n  RDI_Parsed rdi;\r\n  \r\n  // rjf: metadata\r\n  AccessPt access_pt;\r\n  U64 refcount;\r\n  U64 batch_request_counts[2];\r\n  U64 working_count;\r\n  U64 completion_count;\r\n};\r\n\r\ntypedef struct DI_Slot DI_Slot;\r\nstruct DI_Slot\r\n{\r\n  DI_Node *first;\r\n  DI_Node *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Requests\r\n\r\ntypedef struct DI_Request DI_Request;\r\nstruct DI_Request\r\n{\r\n  DI_Key key;\r\n};\r\n\r\ntypedef struct DI_RequestNode DI_RequestNode;\r\nstruct DI_RequestNode\r\n{\r\n  DI_RequestNode *next;\r\n  DI_Request v;\r\n};\r\n\r\ntypedef struct DI_RequestBatch DI_RequestBatch;\r\nstruct DI_RequestBatch\r\n{\r\n  Mutex mutex;\r\n  Arena *arena;\r\n  DI_RequestNode *first;\r\n  DI_RequestNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Load Tasks\r\n\r\ntypedef enum DI_LoadTaskStatus\r\n{\r\n  DI_LoadTaskStatus_Null,\r\n  DI_LoadTaskStatus_Active,\r\n  DI_LoadTaskStatus_Done,\r\n}\r\nDI_LoadTaskStatus;\r\n\r\ntypedef struct DI_LoadTask DI_LoadTask;\r\nstruct DI_LoadTask\r\n{\r\n  DI_LoadTask *next;\r\n  DI_LoadTask *prev;\r\n  \r\n  DI_Key key;\r\n  DI_LoadTaskStatus status;\r\n  \r\n  B32 og_analyzed;\r\n  B32 og_is_rdi;\r\n  U64 og_size;\r\n  \r\n  B32 rdi_analyzed;\r\n  B32 rdi_is_stale;\r\n  \r\n  U64 thread_count;\r\n  OS_Handle process;\r\n};\r\n\r\ntypedef struct DI_LoadCompletion DI_LoadCompletion;\r\nstruct DI_LoadCompletion\r\n{\r\n  DI_LoadCompletion *next;\r\n  U64 code;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Search Types\r\n\r\ntypedef struct DI_SearchItem DI_SearchItem;\r\nstruct DI_SearchItem\r\n{\r\n  U64 idx;\r\n  DI_Key key;\r\n  U64 missed_size;\r\n  FuzzyMatchRangeList match_ranges;\r\n};\r\n\r\ntypedef struct DI_SearchItemChunk DI_SearchItemChunk;\r\nstruct DI_SearchItemChunk\r\n{\r\n  DI_SearchItemChunk *next;\r\n  U64 base_idx;\r\n  DI_SearchItem *v;\r\n  U64 count;\r\n  U64 cap;\r\n};\r\n\r\ntypedef struct DI_SearchItemChunkList DI_SearchItemChunkList;\r\nstruct DI_SearchItemChunkList\r\n{\r\n  DI_SearchItemChunk *first;\r\n  DI_SearchItemChunk *last;\r\n  U64 chunk_count;\r\n  U64 total_count;\r\n};\r\n\r\ntypedef struct DI_SearchItemArray DI_SearchItemArray;\r\nstruct DI_SearchItemArray\r\n{\r\n  DI_SearchItem *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Match Types\r\n\r\ntypedef struct DI_Match DI_Match;\r\nstruct DI_Match\r\n{\r\n  DI_Key key;\r\n  RDI_SectionKind section_kind;\r\n  U32 idx;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Events\r\n\r\ntypedef enum DI_EventKind\r\n{\r\n  DI_EventKind_Null,\r\n  DI_EventKind_ConversionStarted,\r\n  DI_EventKind_ConversionEnded,\r\n  DI_EventKind_COUNT\r\n}\r\nDI_EventKind;\r\n\r\ntypedef struct DI_Event DI_Event;\r\nstruct DI_Event\r\n{\r\n  DI_EventKind kind;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct DI_EventNode DI_EventNode;\r\nstruct DI_EventNode\r\n{\r\n  DI_EventNode *next;\r\n  DI_Event v;\r\n};\r\n\r\ntypedef struct DI_EventList DI_EventList;\r\nstruct DI_EventList\r\n{\r\n  DI_EventNode *first;\r\n  DI_EventNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared State\r\n\r\ntypedef struct DI_Shared DI_Shared;\r\nstruct DI_Shared\r\n{\r\n  Arena *arena;\r\n  U64 load_gen;\r\n  U64 load_count;\r\n  \r\n  // rjf: key -> path cache\r\n  U64 key2path_slots_count;\r\n  DI_KeySlot *key2path_slots;\r\n  StripeArray key2path_stripes;\r\n  \r\n  // rjf: path -> key cache\r\n  U64 path2key_slots_count;\r\n  DI_KeySlot *path2key_slots;\r\n  StripeArray path2key_stripes;\r\n  \r\n  // rjf: debug info cache\r\n  U64 slots_count;\r\n  DI_Slot *slots;\r\n  StripeArray stripes;\r\n  \r\n  // rjf: requests\r\n  DI_RequestBatch req_batches[2]; // [0] -> high priority, [1] -> low priority\r\n  \r\n  // rjf: conversion tasks\r\n  DI_LoadTask *first_load_task[2];\r\n  DI_LoadTask *last_load_task[2];\r\n  DI_LoadTask *free_load_task;\r\n  U64 conversion_process_count;\r\n  U64 conversion_thread_count;\r\n  \r\n  // rjf: conversion completion receiving thread\r\n  U64 conversion_completion_code;\r\n  String8 conversion_completion_lock_semaphore_name;\r\n  String8 conversion_completion_signal_semaphore_name;\r\n  String8 conversion_completion_shared_memory_name;\r\n  Semaphore conversion_completion_lock_semaphore;\r\n  Semaphore conversion_completion_signal_semaphore;\r\n  OS_Handle conversion_completion_shared_memory;\r\n  U64 *conversion_completion_shared_memory_base;\r\n  Thread conversion_completion_signal_receiver_thread;\r\n  \r\n  // rjf: completion batch\r\n  Mutex completion_mutex;\r\n  Arena *completion_arena;\r\n  DI_LoadCompletion *first_completion;\r\n  DI_LoadCompletion *last_completion;\r\n  \r\n  // rjf: events\r\n  Mutex event_mutex;\r\n  Arena *event_arena;\r\n  DI_EventList events;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal DI_Shared *di_shared = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DI_Key di_key_zero(void);\r\ninternal B32 di_key_match(DI_Key a, DI_Key b);\r\ninternal void di_key_list_push(Arena *arena, DI_KeyList *list, DI_Key key);\r\ninternal DI_KeyArray di_key_array_from_list(Arena *arena, DI_KeyList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void di_init(CmdLine *cmdline);\r\n\r\n////////////////////////////////\r\n//~ rjf: Path * Timestamp Cache Submission & Lookup\r\n\r\ninternal DI_Key di_key_from_path_timestamp(String8 path, U64 min_timestamp);\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Opening / Closing\r\n\r\ninternal void di_open(DI_Key key);\r\ninternal void di_close(DI_Key key, B32 force_closed);\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info Lookups\r\n\r\ninternal U64 di_load_gen(void);\r\ninternal U64 di_load_count(void);\r\ninternal DI_KeyArray di_push_all_loaded_keys(Arena *arena);\r\ninternal RDI_Parsed *di_rdi_from_key(Access *access, DI_Key key, B32 high_priority, U64 endt_us);\r\n\r\n////////////////////////////////\r\n//~ rjf: Events\r\n\r\ninternal DI_EventList di_get_events(Arena *arena);\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void di_async_tick(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Conversion Completion Signal Receiver Thread\r\n\r\ninternal void di_signal_completion(void);\r\ninternal void di_conversion_completion_signal_receiver_thread_entry_point(void *p);\r\n\r\n////////////////////////////////\r\n//~ rjf: Search Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact di_search_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void di_search_artifact_destroy(AC_Artifact artifact);\r\ninternal DI_SearchItemArray di_search_item_array_from_target_query(Access *access, RDI_SectionKind target, String8 query, U64 endt_us, B32 *stale_out);\r\n\r\n////////////////////////////////\r\n//~ rjf: Match Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact di_match_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal DI_Match di_match_from_string(String8 string, U64 index, DI_Key preferred_dbgi_key, U64 endt_us);\r\n\r\n#endif // DBG_INFO_H\r\n"
  },
  {
    "path": "src/demon/demon_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/demon.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions (Helpers, Implemented Once)\r\n\r\n//- rjf: handles\r\n\r\ninternal DMN_Handle\r\ndmn_handle_zero(void)\r\n{\r\n  DMN_Handle h = {0};\r\n  return h;\r\n}\r\n\r\ninternal B32\r\ndmn_handle_match(DMN_Handle a, DMN_Handle b)\r\n{\r\n  return a.u32[0] == b.u32[0] && a.u32[1] == b.u32[1];\r\n}\r\n\r\n//- rjf: trap chunk lists\r\n\r\ninternal void\r\ndmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap)\r\n{\r\n  DMN_TrapChunkNode *node = list->last;\r\n  if(node == 0 || node->count >= node->cap)\r\n  {\r\n    node = push_array(arena, DMN_TrapChunkNode, 1);\r\n    node->cap = cap;\r\n    node->v = push_array_no_zero(arena, DMN_Trap, node->cap);\r\n    SLLQueuePush(list->first, list->last, node);\r\n    list->node_count += 1;\r\n  }\r\n  MemoryCopyStruct(&node->v[node->count], trap);\r\n  node->count += 1;\r\n  list->trap_count += 1;\r\n}\r\n\r\ninternal void\r\ndmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push)\r\n{\r\n  if(dst->last == 0)\r\n  {\r\n    MemoryCopyStruct(dst, to_push);\r\n  }\r\n  else if(to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->node_count += to_push->node_count;\r\n    dst->trap_count += to_push->trap_count;\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\ninternal void\r\ndmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push)\r\n{\r\n  for(DMN_TrapChunkNode *src_n = to_push->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    DMN_TrapChunkNode *dst_n = push_array(arena, DMN_TrapChunkNode, 1);\r\n    dst_n->v     = src_n->v;\r\n    dst_n->cap   = src_n->cap;\r\n    dst_n->count = src_n->count;\r\n    SLLQueuePush(dst->first, dst->last, dst_n);\r\n    dst->node_count += 1;\r\n    dst->trap_count += dst_n->count;\r\n  }\r\n}\r\n\r\n//- rjf: handle lists\r\n\r\ninternal void\r\ndmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle)\r\n{\r\n  DMN_HandleNode *node = push_array(arena, DMN_HandleNode, 1);\r\n  SLLQueuePush(list->first, list->last, node);\r\n  node->v = handle;\r\n  list->count += 1;\r\n}\r\n\r\ninternal DMN_HandleArray\r\ndmn_handle_array_from_list(Arena *arena, DMN_HandleList *list)\r\n{\r\n  DMN_HandleArray array = {0};\r\n  array.count = list->count;\r\n  array.handles = push_array_no_zero(arena, DMN_Handle, array.count);\r\n  U64 idx = 0;\r\n  for(DMN_HandleNode *n = list->first; n != 0; n = n->next, idx += 1)\r\n  {\r\n    array.handles[idx] = n->v;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal DMN_HandleArray\r\ndmn_handle_array_copy(Arena *arena, DMN_HandleArray *src)\r\n{\r\n  DMN_HandleArray dst = {0};\r\n  dst.count = src->count;\r\n  dst.handles = push_array_no_zero(arena, DMN_Handle, dst.count);\r\n  MemoryCopy(dst.handles, src->handles, sizeof(DMN_Handle)*dst.count);\r\n  return dst;\r\n}\r\n\r\n//- rjf: event list building\r\n\r\ninternal DMN_Event *\r\ndmn_event_list_push(Arena *arena, DMN_EventList *list)\r\n{\r\n  DMN_EventNode *n = push_array(arena, DMN_EventNode, 1);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  DMN_Event *result = &n->v;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once)\r\n\r\ninternal U64\r\ndmn_rip_from_thread(DMN_Handle thread)\r\n{\r\n  U64 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  {\r\n    Arch arch = dmn_arch_from_thread(thread);\r\n    U64 reg_block_size = regs_block_size_from_arch(arch);\r\n    void *reg_block = push_array(scratch.arena, U8, reg_block_size);\r\n    dmn_thread_read_reg_block(thread, reg_block);\r\n    result = regs_rip_from_arch_block(arch, reg_block);\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ndmn_rsp_from_thread(DMN_Handle thread)\r\n{\r\n  U64 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  {\r\n    Arch arch = dmn_arch_from_thread(thread);\r\n    U64 reg_block_size = regs_block_size_from_arch(arch);\r\n    void *reg_block = push_array(scratch.arena, U8, reg_block_size);\r\n    dmn_thread_read_reg_block(thread, reg_block);\r\n    result = regs_rsp_from_arch_block(arch, reg_block);\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Reading Helper Functions (Helpers, Implemented Once)\r\n\r\ninternal String8\r\ndmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List block_list = {0};\r\n  for(U64 cursor = addr, stride = 256; ; cursor += stride)\r\n  {\r\n    U8      *raw_block = push_array_no_zero(scratch.arena, U8, stride);\r\n    U64      read_size = dmn_process_read(process, r1u64(cursor, cursor + stride), raw_block);\r\n    String8  block     = str8_cstring_capped(raw_block, raw_block + read_size);\r\n    str8_list_push(scratch.arena, &block_list, block);\r\n    if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0))\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &block_list, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange)\r\n{\r\n  String8 block = {0};\r\n  void *raw = dmn_process_read_raw(arena, process, vrange);\r\n  if(raw)\r\n  {\r\n    block = str8(raw, dim_1u64(vrange));\r\n  }\r\n  return block;\r\n}\r\n\r\ninternal void *\r\ndmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange)\r\n{\r\n  Temp temp = temp_begin(arena);\r\n  void *buffer    = push_array(arena, U8, dim_1u64(vrange));\r\n  U64   read_size = dmn_process_read(process, vrange, buffer);\r\n  if(read_size != dim_1u64(vrange))\r\n  {\r\n    buffer = 0;\r\n    temp_end(temp);\r\n  }\r\n  return buffer;\r\n}\r\n"
  },
  {
    "path": "src/demon/demon_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DEMON_CORE_H\r\n#define DEMON_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Control-Thread-Only Context\r\n//\r\n// An instance of this struct must ONLY be returned by dmn_ctrl_begin, and only\r\n// used by the thread which called it. All APIs which can ONLY run on the\r\n// control thread, which blocks to control & receive events, will take this\r\n// parameter. All other APIs can be called from any thread.\r\n\r\ntypedef struct DMN_CtrlCtx DMN_CtrlCtx;\r\nstruct DMN_CtrlCtx\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Types\r\n\r\ntypedef union DMN_Handle DMN_Handle;\r\nunion DMN_Handle\r\n{\r\n  U32 u32[2];\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct DMN_HandleNode DMN_HandleNode;\r\nstruct DMN_HandleNode\r\n{\r\n  DMN_HandleNode *next;\r\n  DMN_Handle v;\r\n};\r\n\r\ntypedef struct DMN_HandleList DMN_HandleList;\r\nstruct DMN_HandleList\r\n{\r\n  DMN_HandleNode *first;\r\n  DMN_HandleNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct DMN_HandleArray DMN_HandleArray;\r\nstruct DMN_HandleArray\r\n{\r\n  DMN_Handle *handles;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/demon.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Types\r\n\r\ntypedef struct DMN_Event DMN_Event;\r\nstruct DMN_Event\r\n{\r\n  DMN_EventKind kind;\r\n  DMN_ErrorKind error_kind;\r\n  DMN_MemoryEventKind memory_kind;\r\n  DMN_ExceptionKind exception_kind;\r\n  DMN_Handle process;\r\n  DMN_Handle thread;\r\n  DMN_Handle module;\r\n  Arch arch;\r\n  U64 address;\r\n  U64 size;\r\n  String8 string;\r\n  U32 code; // code gives pid & tid on CreateProcess and CreateThread (respectfully)\r\n  U32 flags; // DMN_TrapFlags, if `DMN_EventKind_SetBreakpoint`\r\n  S32 signo;\r\n  S32 sigcode;\r\n  Rng1U64 elf_phdr_vrange;\r\n  U64 elf_phdr_entsize;\r\n  U64 instruction_pointer;\r\n  U64 stack_pointer;\r\n  U64 user_data;\r\n  B32 exception_repeated;\r\n};\r\n\r\ntypedef struct DMN_EventNode DMN_EventNode;\r\nstruct DMN_EventNode\r\n{\r\n  DMN_EventNode *next;\r\n  DMN_Event v;\r\n};\r\n\r\ntypedef struct DMN_EventList DMN_EventList;\r\nstruct DMN_EventList\r\n{\r\n  DMN_EventNode *first;\r\n  DMN_EventNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Run Control Types\r\n\r\ntypedef U32 DMN_TrapFlags;\r\nenum\r\n{\r\n  DMN_TrapFlag_BreakOnWrite   = (1<<0),\r\n  DMN_TrapFlag_BreakOnRead    = (1<<1),\r\n  DMN_TrapFlag_BreakOnExecute = (1<<2),\r\n};\r\n\r\ntypedef struct DMN_Trap DMN_Trap;\r\nstruct DMN_Trap\r\n{\r\n  DMN_Handle process;\r\n  U64 vaddr;\r\n  U64 id;\r\n  DMN_TrapFlags flags;\r\n  U32 size;\r\n};\r\n\r\ntypedef struct DMN_TrapChunkNode DMN_TrapChunkNode;\r\nstruct DMN_TrapChunkNode\r\n{\r\n  DMN_TrapChunkNode *next;\r\n  DMN_Trap *v;\r\n  U64 cap;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct DMN_TrapChunkList DMN_TrapChunkList;\r\nstruct DMN_TrapChunkList\r\n{\r\n  DMN_TrapChunkNode *first;\r\n  DMN_TrapChunkNode *last;\r\n  U64 node_count;\r\n  U64 trap_count;\r\n};\r\n\r\ntypedef struct DMN_ActiveTrap DMN_ActiveTrap;\r\nstruct DMN_ActiveTrap\r\n{\r\n  DMN_Trap *trap;\r\n  U8 swap_byte;\r\n  DMN_ActiveTrap *next;\r\n};\r\n\r\ntypedef struct DMN_RunCtrls DMN_RunCtrls;\r\nstruct DMN_RunCtrls\r\n{\r\n  DMN_Handle priority_thread;\r\n  DMN_Handle single_step_thread;\r\n  B8 ignore_previous_exception;\r\n  B8 run_entities_are_unfrozen;\r\n  B8 run_entities_are_processes;\r\n  DMN_Handle *run_entities;\r\n  U64 run_entity_count;\r\n  DMN_TrapChunkList traps;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: System Process Listing Types\r\n\r\ntypedef struct DMN_ProcessIter DMN_ProcessIter;\r\nstruct DMN_ProcessIter\r\n{\r\n  U64 v[2];\r\n};\r\n\r\ntypedef struct DMN_ProcessInfo DMN_ProcessInfo;\r\nstruct DMN_ProcessInfo\r\n{\r\n  String8 name;\r\n  U32 pid;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions (Helpers, Implemented Once)\r\n\r\n//- rjf: handles\r\ninternal DMN_Handle dmn_handle_zero(void);\r\ninternal B32 dmn_handle_match(DMN_Handle a, DMN_Handle b);\r\n\r\n//- rjf: trap chunk lists\r\ninternal void dmn_trap_chunk_list_push(Arena *arena, DMN_TrapChunkList *list, U64 cap, DMN_Trap *trap);\r\ninternal void dmn_trap_chunk_list_concat_in_place(DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push);\r\ninternal void dmn_trap_chunk_list_concat_shallow_copy(Arena *arena, DMN_TrapChunkList *dst, DMN_TrapChunkList *to_push);\r\n\r\n//- rjf: handle lists\r\ninternal void dmn_handle_list_push(Arena *arena, DMN_HandleList *list, DMN_Handle handle);\r\ninternal DMN_HandleArray dmn_handle_array_from_list(Arena *arena, DMN_HandleList *list);\r\ninternal DMN_HandleArray dmn_handle_array_copy(Arena *arena, DMN_HandleArray *src);\r\n\r\n//- rjf: event list building\r\ninternal DMN_Event *dmn_event_list_push(Arena *arena, DMN_EventList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Reading Helper Functions (Helpers, Implemented Once)\r\n\r\ninternal U64 dmn_rip_from_thread(DMN_Handle thread);\r\ninternal U64 dmn_rsp_from_thread(DMN_Handle thread);\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Reading Helper Functions (Helpers, Implemented Once)\r\n\r\ninternal String8 dmn_process_read_cstring(Arena *arena, DMN_Handle process, U64 addr);\r\ninternal String8 dmn_process_read_block(Arena *arena, DMN_Handle process, Rng1U64 vrange);\r\ninternal void *  dmn_process_read_raw(Arena *arena, DMN_Handle process, Rng1U64 vrange);\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS)\r\n\r\ninternal void dmn_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS)\r\n\r\ninternal DMN_CtrlCtx *dmn_ctrl_begin(void);\r\ninternal void dmn_ctrl_exclusive_access_begin(void);\r\ninternal void dmn_ctrl_exclusive_access_end(void);\r\n#define DMN_CtrlExclusiveAccessScope DeferLoop(dmn_ctrl_exclusive_access_begin(), dmn_ctrl_exclusive_access_end())\r\ninternal U32 dmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params);\r\ninternal B32 dmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid);\r\ninternal B32 dmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code);\r\ninternal B32 dmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process);\r\ninternal DMN_EventList dmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls);\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS)\r\n\r\ninternal void dmn_halt(U64 code, U64 user_data);\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS)\r\n\r\n//- rjf: non-blocking-control-thread access barriers\r\ninternal B32 dmn_access_open(void);\r\ninternal void dmn_access_close(void);\r\n#define DMN_AccessScope DeferLoopChecked(dmn_access_open(), dmn_access_close())\r\n\r\n//- rjf: processes\r\ninternal U64 dmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size);\r\ninternal void dmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size);\r\ninternal void dmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size);\r\ninternal void dmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size);\r\ninternal void dmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags);\r\ninternal U64 dmn_process_read(DMN_Handle process, Rng1U64 range, void *dst);\r\ninternal B32 dmn_process_write(DMN_Handle process, Rng1U64 range, void *src);\r\n#define dmn_process_read_struct(process, vaddr, ptr) dmn_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)\r\n#define dmn_process_write_struct(process, vaddr, ptr) dmn_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)\r\n\r\n//- rjf: threads\r\ninternal Arch dmn_arch_from_thread(DMN_Handle handle);\r\ninternal U64 dmn_stack_base_vaddr_from_thread(DMN_Handle handle);\r\ninternal U64 dmn_tls_root_vaddr_from_thread(DMN_Handle handle);\r\ninternal B32 dmn_thread_read_reg_block(DMN_Handle handle, void *reg_block);\r\ninternal B32 dmn_thread_write_reg_block(DMN_Handle handle, void *reg_block);\r\n\r\n//- rjf: system process listing\r\ninternal void dmn_process_iter_begin(DMN_ProcessIter *iter);\r\ninternal B32  dmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out);\r\ninternal void dmn_process_iter_end(DMN_ProcessIter *iter);\r\n\r\n#endif // DEMON_CORE_H\r\n"
  },
  {
    "path": "src/demon/demon_core.mdesk",
    "content": "////////////////////////////////\r\n//~ rjf: Event Kind Tables\r\n\r\n@table(name)\r\nDMN_EventKindTable:\r\n{\r\n  {Null}\r\n  {Error}\r\n  {HandshakeComplete}\r\n  {CreateProcess}\r\n  {ExitProcess}\r\n  {CreateThread}\r\n  {ExitThread}\r\n  {LoadModule}\r\n  {UnloadModule}\r\n  {Breakpoint}\r\n  {Trap}\r\n  {SingleStep}\r\n  {Exception}\r\n  {Halt}\r\n  {Memory}\r\n  {DebugString}\r\n  {SetThreadName}\r\n  {SetThreadColor}\r\n  {SetBreakpoint}\r\n  {UnsetBreakpoint}\r\n  {SetVAddrRangeNote}\r\n}\r\n\r\n@table(name)\r\nDMN_ErrorKindTable:\r\n{\r\n  {Null}\r\n  {NotAttached}\r\n  {UnexpectedFailure}\r\n  {InvalidHandle}\r\n}\r\n\r\n@table(name)\r\nDMN_MemoryEventKindTable:\r\n{\r\n  {Null}\r\n  {Commit}\r\n  {Reserve}\r\n  {Decommit}\r\n  {Release}\r\n}\r\n\r\n@table(name)\r\nDMN_ExceptionKindTable:\r\n{\r\n  {Null}\r\n  {MemoryRead}\r\n  {MemoryWrite}\r\n  {MemoryExecute}\r\n  {CppThrow}\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Generators\r\n\r\n@enum DMN_EventKind:\r\n{\r\n  @expand(DMN_EventKindTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@data(String8) dmn_event_kind_string_table:\r\n{\r\n  @expand(DMN_EventKindTable a) `str8_lit_comp(\"$(a.name)\")`\r\n}\r\n\r\n@enum DMN_ErrorKind:\r\n{\r\n  @expand(DMN_ErrorKindTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@enum DMN_MemoryEventKind:\r\n{\r\n  @expand(DMN_MemoryEventKindTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@enum DMN_ExceptionKind:\r\n{\r\n  @expand(DMN_ExceptionKindTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@data(String8) dmn_exception_kind_string_table:\r\n{\r\n  @expand(DMN_ExceptionKindTable a) `str8_lit_comp(\"$(a.name)\")`\r\n}\r\n"
  },
  {
    "path": "src/demon/demon_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"demon/demon_core.c\"\r\n\r\n#if OS_WINDOWS\r\n# include \"demon/win32/demon_core_win32.c\"\r\n#elif OS_LINUX\r\n# include \"demon/linux/demon_core_linux.c\"\r\n#else\r\n# error Demon layer backend not defined for this operating system.\r\n#endif\r\n"
  },
  {
    "path": "src/demon/demon_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DEMON_INC_H\r\n#define DEMON_INC_H\r\n\r\n#include \"demon/demon_core.h\"\r\n\r\n#if OS_WINDOWS\r\n# include \"demon/win32/demon_core_win32.h\"\r\n#elif OS_LINUX\r\n# include \"demon/linux/demon_core_linux.h\"\r\n#else\r\n# error Demon layer backend not defined for this operating system.\r\n#endif\r\n\r\n#endif // DEMON_INC_H\r\n"
  },
  {
    "path": "src/demon/generated/demon.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 dmn_event_kind_string_table[21] =\r\n{\r\nstr8_lit_comp(\"Null\"),\r\nstr8_lit_comp(\"Error\"),\r\nstr8_lit_comp(\"HandshakeComplete\"),\r\nstr8_lit_comp(\"CreateProcess\"),\r\nstr8_lit_comp(\"ExitProcess\"),\r\nstr8_lit_comp(\"CreateThread\"),\r\nstr8_lit_comp(\"ExitThread\"),\r\nstr8_lit_comp(\"LoadModule\"),\r\nstr8_lit_comp(\"UnloadModule\"),\r\nstr8_lit_comp(\"Breakpoint\"),\r\nstr8_lit_comp(\"Trap\"),\r\nstr8_lit_comp(\"SingleStep\"),\r\nstr8_lit_comp(\"Exception\"),\r\nstr8_lit_comp(\"Halt\"),\r\nstr8_lit_comp(\"Memory\"),\r\nstr8_lit_comp(\"DebugString\"),\r\nstr8_lit_comp(\"SetThreadName\"),\r\nstr8_lit_comp(\"SetThreadColor\"),\r\nstr8_lit_comp(\"SetBreakpoint\"),\r\nstr8_lit_comp(\"UnsetBreakpoint\"),\r\nstr8_lit_comp(\"SetVAddrRangeNote\"),\r\n};\r\n\r\nString8 dmn_exception_kind_string_table[5] =\r\n{\r\nstr8_lit_comp(\"Null\"),\r\nstr8_lit_comp(\"MemoryRead\"),\r\nstr8_lit_comp(\"MemoryWrite\"),\r\nstr8_lit_comp(\"MemoryExecute\"),\r\nstr8_lit_comp(\"CppThrow\"),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/demon/generated/demon.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef DEMON_META_H\r\n#define DEMON_META_H\r\n\r\ntypedef enum DMN_EventKind\r\n{\r\nDMN_EventKind_Null,\r\nDMN_EventKind_Error,\r\nDMN_EventKind_HandshakeComplete,\r\nDMN_EventKind_CreateProcess,\r\nDMN_EventKind_ExitProcess,\r\nDMN_EventKind_CreateThread,\r\nDMN_EventKind_ExitThread,\r\nDMN_EventKind_LoadModule,\r\nDMN_EventKind_UnloadModule,\r\nDMN_EventKind_Breakpoint,\r\nDMN_EventKind_Trap,\r\nDMN_EventKind_SingleStep,\r\nDMN_EventKind_Exception,\r\nDMN_EventKind_Halt,\r\nDMN_EventKind_Memory,\r\nDMN_EventKind_DebugString,\r\nDMN_EventKind_SetThreadName,\r\nDMN_EventKind_SetThreadColor,\r\nDMN_EventKind_SetBreakpoint,\r\nDMN_EventKind_UnsetBreakpoint,\r\nDMN_EventKind_SetVAddrRangeNote,\r\nDMN_EventKind_COUNT,\r\n} DMN_EventKind;\r\n\r\ntypedef enum DMN_ErrorKind\r\n{\r\nDMN_ErrorKind_Null,\r\nDMN_ErrorKind_NotAttached,\r\nDMN_ErrorKind_UnexpectedFailure,\r\nDMN_ErrorKind_InvalidHandle,\r\nDMN_ErrorKind_COUNT,\r\n} DMN_ErrorKind;\r\n\r\ntypedef enum DMN_MemoryEventKind\r\n{\r\nDMN_MemoryEventKind_Null,\r\nDMN_MemoryEventKind_Commit,\r\nDMN_MemoryEventKind_Reserve,\r\nDMN_MemoryEventKind_Decommit,\r\nDMN_MemoryEventKind_Release,\r\nDMN_MemoryEventKind_COUNT,\r\n} DMN_MemoryEventKind;\r\n\r\ntypedef enum DMN_ExceptionKind\r\n{\r\nDMN_ExceptionKind_Null,\r\nDMN_ExceptionKind_MemoryRead,\r\nDMN_ExceptionKind_MemoryWrite,\r\nDMN_ExceptionKind_MemoryExecute,\r\nDMN_ExceptionKind_CppThrow,\r\nDMN_ExceptionKind_COUNT,\r\n} DMN_ExceptionKind;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 dmn_event_kind_string_table[21];\r\nextern String8 dmn_exception_kind_string_table[5];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // DEMON_META_H\r\n"
  },
  {
    "path": "src/demon/linux/demon_core_linux.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DMN_LNX_EntityNode *\r\ndmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v)\r\n{\r\n  DMN_LNX_EntityNode *n = push_array(arena, DMN_LNX_EntityNode, 1);\r\n  n->v = v;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  return n;\r\n}\r\n\r\n//- rjf: file descriptor memory reading/writing helpers\r\n\r\ninternal U64\r\ndmn_lnx_size_from_fd(int memory_fd, U64 cap)\r\n{\r\n  U8 temp[4096];\r\n  size_t cursor = 0;\r\n  while(cursor < cap)\r\n  {\r\n    ssize_t actual_read = pread(memory_fd, temp, sizeof(temp), cursor);\r\n    if(actual_read < 0)\r\n    {\r\n      if(errno == EINTR) { continue; }\r\n      break;\r\n    }\r\n    if(actual_read == 0) { break; }\r\n    cursor += (U64)actual_read;\r\n  }\r\n  return (U64)cursor;\r\n}\r\n\r\ninternal U64\r\ndmn_lnx_read(int memory_fd, Rng1U64 range, void *dst)\r\n{\r\n  size_t cursor = 0, size = dim_1u64(range);\r\n  while(cursor < size)\r\n  {\r\n    size_t  to_read     = size - cursor;\r\n    ssize_t actual_read = pread(memory_fd, (U8 *)dst + cursor, to_read, range.min + cursor);\r\n    if(actual_read < 0)\r\n    {\r\n      if(errno == EINTR) { continue; }\r\n      break;\r\n    }\r\n    if(actual_read == 0) { break; }\r\n    cursor += actual_read;\r\n  }\r\n  return (U64)cursor;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_write(int memory_fd, Rng1U64 range, void *src)\r\n{\r\n  B32 result = 1;\r\n  U8 *ptr = (U8 *)src;\r\n  U8 *opl = ptr + dim_1u64(range);\r\n  U64 cursor = range.min;\r\n  for(;ptr < opl;)\r\n  {\r\n    size_t to_write = (size_t)(opl - ptr);\r\n    ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor);\r\n    if(actual_write == -1)\r\n    {\r\n      result = 0;\r\n      break;\r\n    }\r\n    ptr += actual_write;\r\n    cursor += actual_write;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size)\r\n{\r\n  String8 result = {0};\r\n  U64 string_size = 0;\r\n  for(U64 vaddr = base_vaddr; string_size < cap_size; vaddr += 1, string_size += 1)\r\n  {\r\n    char byte = 0;\r\n    if(pread(memory_fd, &byte, sizeof(byte), vaddr) == 0)\r\n    {\r\n      break;\r\n    }\r\n    if(byte == '\\0' || byte == '\\n')\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  if(string_size != 0)\r\n  {\r\n    char *buf = push_array_no_zero(arena, char, string_size+1);\r\n    pread(memory_fd, buf, string_size, base_vaddr);\r\n    buf[string_size] = '\\0';\r\n    result = str8((U8 *)buf, string_size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndmn_lnx_read_string(Arena *arena, int memory_fd, U64 vaddr)\r\n{\r\n  return dmn_lnx_read_string_capped(arena, memory_fd, vaddr, 4096);\r\n}\r\n\r\n////////////////////////////////\r\n//~ Runtime Struct Helpers\r\n\r\ninternal B32\r\ndmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out)\r\n{\r\n  B32 is_read = 0;\r\n  U8 e_ident[ELF_Identifier_Max] = {0};\r\n  U64 e_ident_size = dmn_lnx_read(memory_fd, r1u64(addr, addr + sizeof(e_ident)), &e_ident);\r\n  if(e_ident_size == sizeof(e_ident))\r\n  {\r\n    if(str8_match(str8_prefix(str8_array_fixed(e_ident), elf_magic_string.size), elf_magic_string, 0))\r\n    {\r\n      switch(e_ident[ELF_Identifier_Class])\r\n      {\r\n        default:{InvalidPath;}break;\r\n        case ELF_Class_None: {}break;\r\n        case ELF_Class_32:\r\n        {\r\n          ELF_Hdr32 ehdr32 = {0};\r\n          if(dmn_lnx_read_struct(memory_fd, addr, &ehdr32))\r\n          {\r\n            *ehdr_out = elf_hdr64_from_hdr32(ehdr32);\r\n            is_read = 1;\r\n          }\r\n        }break;\r\n        case ELF_Class_64:\r\n        {\r\n          is_read = dmn_lnx_read_struct(memory_fd, addr, ehdr_out);\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  return is_read;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out)\r\n{\r\n  B32 is_read = 0;\r\n  switch (elf_class)\r\n  {\r\n    case ELF_Class_None: break;\r\n    case ELF_Class_32: \r\n    {\r\n      ELF_Phdr32 phdr32 = {0};\r\n      if(dmn_lnx_read_struct(memory_fd, addr, &phdr32))\r\n      {\r\n        *phdr_out = elf_phdr64_from_phdr32(phdr32);\r\n        is_read = 1;\r\n      }\r\n    }break;\r\n    case ELF_Class_64:\r\n    {\r\n      is_read = dmn_lnx_read_struct(memory_fd, addr, phdr_out);\r\n    }break;\r\n    default:{NotImplemented;}break;\r\n  }\r\n  return is_read;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out)\r\n{ \r\n  B32 is_read = 0;\r\n  switch (elf_class)\r\n  {\r\n    case ELF_Class_None: break;\r\n    case ELF_Class_32: \r\n    {\r\n      ELF_Shdr32 shdr32 = {0};\r\n      if(dmn_lnx_read_struct(memory_fd, addr, &shdr32))\r\n      {\r\n        *shdr_out = elf_shdr64_from_shdr32(shdr32);\r\n        is_read = 1;\r\n      }\r\n    }break;\r\n    case ELF_Class_64:\r\n    {\r\n      is_read = dmn_lnx_read_struct(memory_fd, addr, shdr_out);\r\n    }break;\r\n    default:{NotImplemented;}break;\r\n  }\r\n  return is_read;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 *linkmap_out)\r\n{\r\n  B32 is_read = 0;\r\n  switch(elf_class) \r\n  {\r\n    case ELF_Class_None: {}break;\r\n    case ELF_Class_32:\r\n    {\r\n      // TODO(rjf): endianness\r\n      GNU_LinkMap32 linkmap32 = {0};\r\n      if(dmn_lnx_read_struct(memory_fd, addr, &linkmap32))\r\n      {\r\n        *linkmap_out = gnu_linkmap64_from_linkmap32(linkmap32);\r\n        is_read = 1;\r\n      }\r\n    }break;\r\n    case ELF_Class_64:\r\n    {\r\n      is_read = dmn_lnx_read_struct(memory_fd, addr, linkmap_out);\r\n    }break;\r\n    default:{NotImplemented;}break;\r\n  }\r\n  return is_read;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out)\r\n{\r\n  B32 is_read = 0;\r\n  switch(elf_class)\r\n  {\r\n    case ELF_Class_None:{}break;\r\n    case ELF_Class_32:\r\n    {\r\n      ELF_Dyn32 dyn32 = {0};\r\n      if(dmn_lnx_read_struct(memory_fd, addr, &dyn32))\r\n      {\r\n        *dyn_out = elf_dyn64_from_dyn32(dyn32);\r\n        is_read = 1;\r\n      }\r\n    }break;\r\n    case ELF_Class_64:\r\n    {\r\n      is_read = dmn_lnx_read_struct(memory_fd, addr, dyn_out);\r\n    }break;\r\n    default:{NotImplemented;}break;\r\n  }\r\n  return is_read;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out)\r\n{\r\n  B32 is_read = 0;\r\n  switch(elf_class)\r\n  {\r\n    case ELF_Class_None:{}break;\r\n    case ELF_Class_32:\r\n    {\r\n      ELF_Sym32 symbol32 = {0};\r\n      if(dmn_lnx_read_struct(memory_fd, addr, &symbol32))\r\n      {\r\n        *symbol_out = elf_sym64_from_sym32(symbol32);\r\n        is_read = 1;\r\n      }\r\n    }break;\r\n    case ELF_Class_64:\r\n    {\r\n      is_read = dmn_lnx_read_struct(memory_fd, addr, symbol_out);\r\n    }break;\r\n    default:{NotImplemented;}break;\r\n  }\r\n  return is_read;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out)\r\n{\r\n  B32 is_read = 0;\r\n  switch(gnu_rdebug_info_size_from_arch(arch))\r\n  {\r\n    case 0: {} break;\r\n    case sizeof(GNU_RDebugInfo32): {\r\n      GNU_RDebugInfo32 rdebug32 = {0};\r\n      if(dmn_lnx_read_struct(memory_fd, addr, &rdebug32))\r\n      {\r\n        *rdebug_out = gnu_rdebug_info64_from_rdebug_info32(rdebug32);\r\n        is_read = 1;\r\n      }\r\n    }break;\r\n    case sizeof(GNU_RDebugInfo64):\r\n    {\r\n      is_read = dmn_lnx_read_struct(memory_fd, addr, rdebug_out);\r\n    }break;\r\n    default:{InvalidPath;}break;\r\n  }\r\n  Assert(is_read);\r\n  return is_read;\r\n}\r\n\r\n//- rjf: pid => info extraction\r\n\r\ninternal String8\r\ndmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  String8     exe_link_path   = str8f(scratch.arena, \"/proc/%d/exe\", pid);\r\n  String8List parts           = {0};\r\n  int         readlink_result = 0;\r\n  for(S64 r = 0, cap = PATH_MAX; r < 4; cap *= 2, r += 1)\r\n  {\r\n    U8 *buffer = push_array(arena, U8, cap);\r\n    readlink_result = readlink((char *)exe_link_path.str, (char *)buffer, cap);\r\n    \r\n    if(readlink_result < 0)\r\n    {\r\n      break;\r\n    }\r\n    \r\n    str8_list_push(scratch.arena, &parts, str8(buffer, readlink_result));\r\n    \r\n    if(readlink_result < cap)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  \r\n  String8 result = str8_list_join(arena, &parts, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal ELF_Hdr64\r\ndmn_lnx_ehdr_from_pid(pid_t pid)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32       is_read  = 0;\r\n  ELF_Hdr64 exe      = {0};\r\n  String8   exe_path = dmn_lnx_exe_path_from_pid(scratch.arena, pid);\r\n  if(exe_path.size != 0)\r\n  {\r\n    int exe_fd = open((char *)exe_path.str, O_RDONLY|O_CLOEXEC);\r\n    if(exe_fd != -1)\r\n    {\r\n      is_read = dmn_lnx_read_ehdr(exe_fd, 0, &exe);\r\n      close(exe_fd);\r\n    }   \r\n  }\r\n  Assert(is_read);\r\n  scratch_end(scratch);\r\n  return exe;\r\n}\r\n\r\ninternal DMN_LNX_ProcessAuxv\r\ndmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DMN_LNX_ProcessAuxv result = {0};\r\n  \r\n  // rjf: open aux data\r\n  String8 auxv_path = push_str8f(scratch.arena, \"/proc/%d/auxv\", pid);\r\n  int     auxv_fd   = open((char*)auxv_path.str, O_RDONLY|O_CLOEXEC);\r\n  \r\n  // rjf: scan aux data\r\n  if(auxv_fd >= 0)\r\n  {\r\n    for(;;)\r\n    {\r\n      // rjf: read next aux\r\n      ELF_Auxv64 auxv = {0};\r\n      switch(elf_class)\r\n      {\r\n        case ELF_Class_None:{}break;\r\n        case ELF_Class_32:\r\n        {\r\n          ELF_Auxv32 auxv32 = {0};\r\n          if(read(auxv_fd, &auxv32, sizeof(auxv32)) != sizeof(auxv32))\r\n          {\r\n            goto brkloop;\r\n          }\r\n          auxv = elf_auxv64_from_auxv32(auxv32);\r\n        }break;\r\n        case ELF_Class_64:\r\n        {\r\n          if(read(auxv_fd, &auxv, sizeof(auxv)) != sizeof(auxv))\r\n          {\r\n            goto brkloop;\r\n          }\r\n        }break;\r\n        default:{NotImplemented;}break;\r\n      }\r\n      \r\n      // rjf: fill result\r\n      switch(auxv.a_type)\r\n      {\r\n        default:{}break;\r\n        case ELF_AuxType_Null:         goto brkloop; break;\r\n        case ELF_AuxType_Base:         result.base   = auxv.a_val; break;\r\n        case ELF_AuxType_Phnum:        result.phnum  = auxv.a_val; break;\r\n        case ELF_AuxType_Phent:        result.phent  = auxv.a_val; break;\r\n        case ELF_AuxType_Phdr:         result.phdr   = auxv.a_val; break;\r\n        case ELF_AuxType_ExecFn:       result.execfn = auxv.a_val; break;\r\n        case ELF_AuxType_Pagesz:       result.pagesz = auxv.a_val; break;\r\n      }\r\n    }\r\n    brkloop:;\r\n    close(auxv_fd);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal DMN_LNX_PhdrInfo\r\ndmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum)\r\n{\r\n  DMN_LNX_PhdrInfo result = { .range.min = max_U64 };\r\n  \r\n  // rjf: scan table\r\n  for(U64 ph_cursor = e_phaddr, ph_opl = (e_phaddr + e_phentsize * e_phnum);\r\n      ph_cursor < ph_opl;\r\n      ph_cursor += e_phentsize)\r\n  {\r\n    ELF_Phdr64 phdr = {0};\r\n    if(!dmn_lnx_read_phdr(memory_fd, ph_cursor, elf_class, &phdr))\r\n    {\r\n      Assert(0 && \"unable to read a program header\");\r\n    }\r\n    \r\n    // rjf: save\r\n    switch(phdr.p_type)\r\n    {\r\n      default:{}break;\r\n      case ELF_PType_Dynamic:\r\n      {\r\n        result.dynamic = rebase + phdr.p_vaddr;\r\n      }break;\r\n      case ELF_PType_Load:\r\n      {\r\n        U64 min = rebase + phdr.p_vaddr;\r\n        U64 max = rebase + phdr.p_vaddr + phdr.p_memsz;\r\n        result.range.min = Min(result.range.min, min);\r\n        result.range.max = Max(result.range.max, max);\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal DMN_LNX_DynamicInfo\r\ndmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 dynamic_vaddr)\r\n{\r\n  DMN_LNX_DynamicInfo dynamic_info = {0};\r\n  for(U64 dynamic_cursor = dynamic_vaddr; ; dynamic_cursor += elf_dyn_size_from_class(elf_class))\r\n  {\r\n    // rjf: read next dyn entry\r\n    ELF_Dyn64 dyn = {0};\r\n    if(!dmn_lnx_read_dynamic(memory_fd, dynamic_cursor, elf_class, &dyn)) { Assert(0 && \"unable to read dynamic\"); }\r\n    \r\n    // rjf: break on zero\r\n    if(dyn.tag == ELF_DynTag_Null) { break; }\r\n    \r\n    // extract reuiqred values out of dynamic section\r\n    if(dyn.tag == ELF_DynTag_Strtab)\r\n    {\r\n      dynamic_info.strtab_vaddr = rebase + dyn.val;\r\n    }\r\n    else if(dyn.tag == ELF_DynTag_Strsz)\r\n    {\r\n      dynamic_info.strtab_size = dyn.val;\r\n    }\r\n    else if(dyn.tag == ELF_DynTag_Symtab)\r\n    {\r\n      dynamic_info.symtab_vaddr = rebase + dyn.val;\r\n    }\r\n    else if(dyn.tag == ELF_DynTag_Syment)\r\n    {\r\n      dynamic_info.symtab_entry_size = dyn.val;\r\n    }\r\n    else if(dyn.tag == ELF_DynTag_Hash)\r\n    {\r\n      dynamic_info.hash_vaddr = rebase + dyn.val;\r\n    }\r\n    else if(dyn.tag == ELF_DynTag_GNU_Hash)\r\n    {\r\n      dynamic_info.gnu_hash_vaddr = rebase + dyn.val;\r\n    }\r\n  }\r\n  return dynamic_info;\r\n}\r\n\r\ninternal U64\r\ndmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vbase)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  U64 rdebug_vaddr = 0;\r\n  \r\n  // load DL's header\r\n  ELF_Hdr64 ehdr = {0};\r\n  if(!dmn_lnx_read_ehdr(memory_fd, loader_vbase, &ehdr)) { Assert(0 && \"failed to read interp's header\"); goto exit; }\r\n  \r\n  U64       rebase    = ehdr.e_type == ELF_Type_Dyn ? loader_vbase : 0;\r\n  ELF_Class elf_class = ehdr.e_ident[ELF_Identifier_Class];\r\n  \r\n  // find dynamic program header\r\n  U64 dynamic_vaddr = max_U64;\r\n  for EachIndex(phdr_idx, ehdr.e_phnum)\r\n  {\r\n    U64 phdr_vaddr = loader_vbase + ehdr.e_phoff + phdr_idx * ehdr.e_phentsize;\r\n    \r\n    ELF_Phdr64 phdr = {0};\r\n    if(!dmn_lnx_read_phdr(memory_fd, phdr_vaddr, elf_class, &phdr)) { Assert(0 && \"failed to read program header\"); goto exit; }\r\n    \r\n    if(phdr.p_type == ELF_PType_Dynamic)\r\n    {\r\n      dynamic_vaddr = rebase + phdr.p_offset;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // extract necessary info out of dynamic program header\r\n  DMN_LNX_DynamicInfo dynamic_info = dmn_lnx_dynamic_info_from_memory(memory_fd, elf_class, rebase, dynamic_vaddr);\r\n  \r\n  // extract symbol table count from available options\r\n  U64 symbol_count = 0;\r\n  if(dynamic_info.hash_vaddr)\r\n  {\r\n    U64 hash_entry_size = 4;\r\n    if(elf_class == ELF_Class_64 && (ehdr.e_machine == ELF_MachineKind_ALPHA || ehdr.e_machine == ELF_MachineKind_S390 || ehdr.e_machine == ELF_MachineKind_S390_OLD))\r\n    {\r\n      hash_entry_size = 8;\r\n    }\r\n    \r\n    U64 chain_count = 0;\r\n    if(dmn_lnx_read(memory_fd, r1u64(dynamic_info.hash_vaddr, dynamic_info.hash_vaddr + hash_entry_size), &chain_count) == hash_entry_size)\r\n    {\r\n      symbol_count = chain_count;\r\n    }\r\n    else\r\n    {\r\n      Assert(0 && \"failed to read hash table's chain count out of HASH\");\r\n    }\r\n  }\r\n  else\r\n  {\r\n    // TODO: extract count from GNU_HASH\r\n    NotImplemented;\r\n  }\r\n  \r\n  // scan symbol table for the rendezvous symbol\r\n  if(dynamic_info.symtab_vaddr && dynamic_info.symtab_entry_size && symbol_count)\r\n  {\r\n    for EachIndex(symbol_idx, symbol_count)\r\n    {\r\n      ELF_Sym64 symbol = {0};\r\n      if(!dmn_lnx_read_symbol(memory_fd, dynamic_info.symtab_vaddr + symbol_idx * dynamic_info.symtab_entry_size, elf_class, &symbol))\r\n      {\r\n        Assert(0 && \"failed to read symbol table\");\r\n        break;\r\n      }\r\n      \r\n      Temp temp = temp_begin(scratch.arena);\r\n      \r\n      String8 symbol_name = {0};\r\n      if(symbol.st_name < dynamic_info.strtab_size)\r\n      {\r\n        U64 cap = dynamic_info.strtab_size - symbol.st_name;\r\n        symbol_name = dmn_lnx_read_string_capped(temp.arena, memory_fd, dynamic_info.strtab_vaddr + symbol.st_name, cap);\r\n      }\r\n      \r\n      if(str8_match(symbol_name, str8_lit(\"_r_debug\"), 0))\r\n      {\r\n        ELF_SymType symbol_type = ELF_ST_TYPE(symbol.st_info);\r\n        if(symbol_type == ELF_SymType_Object && symbol.st_size > 0)\r\n        {\r\n          rdebug_vaddr = rebase + symbol.st_value;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      temp_end(temp);\r\n    }\r\n  }\r\n  \r\n  exit:;\r\n  scratch_end(scratch);\r\n  return rdebug_vaddr;\r\n}\r\n\r\n////////////////////////////////\r\n//~ SDT Probes\r\n\r\ninternal DMN_LNX_ProbeList\r\ndmn_lnx_read_probes(Arena *arena, int fd, U64 offset, U64 image_base)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  DMN_LNX_ProbeList probes = {0};\r\n  \r\n  ELF_Hdr64 ehdr = {0};\r\n  if(!dmn_lnx_read_ehdr(fd, offset, &ehdr)) { goto exit; }\r\n  \r\n  U64        strtab_shdr_offset = offset + ehdr.e_shoff + ehdr.e_shstrndx * ehdr.e_shentsize;\r\n  ELF_Shdr64 strtab_shdr        = {0};\r\n  if(!dmn_lnx_read_shdr(fd, strtab_shdr_offset, ehdr.e_ident[ELF_Identifier_Class], &strtab_shdr)) { goto exit; }\r\n  \r\n  B32 found_probes      = 0;\r\n  B32 found_probes_base = 0;\r\n  ELF_Shdr64 text_shdr         = {0};\r\n  ELF_Shdr64 stapsdt_base_shdr = {0};\r\n  ELF_Shdr64 stapsdt_shdr      = {0};\r\n  for(U64 shdr_off = offset + ehdr.e_shoff, shdr_opl = shdr_off + ehdr.e_shentsize * ehdr.e_shnum;\r\n      shdr_off < shdr_opl;\r\n      shdr_off += ehdr.e_shentsize) {\r\n    ELF_Shdr64 shdr = {0};\r\n    if(!dmn_lnx_read_shdr(fd, shdr_off, ehdr.e_ident[ELF_Identifier_Class], &shdr)) { goto exit; }\r\n    \r\n    if(shdr.sh_type == ELF_ShType_Note)\r\n    {\r\n      U64     name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name;\r\n      U64     name_cap    = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size;\r\n      String8 name        = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap);\r\n      \r\n      if(str8_match(name, str8_lit(\".note.stapsdt\"), 0))\r\n      {\r\n        stapsdt_shdr = shdr;\r\n        found_probes = 1;\r\n      }\r\n    }\r\n    else if(shdr.sh_type == ELF_ShType_ProgBits)\r\n    {\r\n      U64     name_offset = offset + strtab_shdr.sh_offset + shdr.sh_name;\r\n      U64     name_cap    = offset + strtab_shdr.sh_offset + strtab_shdr.sh_size;\r\n      String8 name        = dmn_lnx_read_string_capped(scratch.arena, fd, name_offset, name_cap);\r\n      \r\n      if(str8_match(name, str8_lit(\".stapsdt.base\"), 0))\r\n      {\r\n        stapsdt_base_shdr = shdr;\r\n        found_probes_base = 1;\r\n      } else if(str8_match(name, str8_lit(\".text\"), 0))\r\n      {\r\n        text_shdr = shdr;\r\n      }\r\n    }\r\n    \r\n    if(found_probes && found_probes_base) { break; }\r\n  }\r\n  \r\n  if(!found_probes || !found_probes_base) { goto exit; }\r\n  \r\n  U64 probes_base = stapsdt_base_shdr.sh_addr;\r\n  \r\n  Rng1U64  note_range     = shift_1u64(r1u64(stapsdt_shdr.sh_offset, stapsdt_shdr.sh_offset + stapsdt_shdr.sh_size), offset);\r\n  void    *raw_note       = push_array(arena, U8, stapsdt_shdr.sh_size);\r\n  U64      note_read_size = dmn_lnx_read(fd, note_range, raw_note);\r\n  if(note_read_size != dim_1u64(note_range)) { goto exit; }\r\n  \r\n  Arch         arch = arch_from_elf_machine(ehdr.e_machine);\r\n  ELF_NoteList note = elf_parse_note(scratch.arena, str8(raw_note, dim_1u64(note_range)), ehdr.e_ident[ELF_Identifier_Class], ehdr.e_machine);\r\n  \r\n  for EachNode(n, ELF_NoteNode, note.first)\r\n  {\r\n    ELF_Note *note = &n->v;\r\n    if(!str8_match(note->owner, str8_lit(\"stapsdt\"), 0)) { continue; }\r\n    if(note->type != ELF_NoteType_STapSdt)               { continue; }\r\n    \r\n    DMN_LNX_Probe probe = {0};\r\n    {\r\n      U64 cursor    = 0;\r\n      U64 addr_size = ehdr.e_ident[ELF_Identifier_Class] == ELF_Class_64 ? 8 : 4;\r\n      \r\n      U64 pc = 0;\r\n      U64 pc_size = str8_deserial_read(note->desc, cursor, &pc, addr_size, addr_size);\r\n      if (pc_size == 0) { goto exit; }\r\n      cursor += pc_size;\r\n      \r\n      U64 base_addr = 0;\r\n      U64 base_addr_size = str8_deserial_read(note->desc, cursor, &base_addr, addr_size, addr_size);\r\n      if (base_addr_size == 0) { goto exit; }\r\n      cursor += base_addr_size;\r\n      \r\n      U64 semaphore = 0;\r\n      U64 semaphore_size = str8_deserial_read(note->desc, cursor, &semaphore, addr_size, addr_size);\r\n      if (semaphore_size == 0) { goto exit; }\r\n      cursor += semaphore_size;\r\n      \r\n      String8 provider = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size);\r\n      cursor += provider.size + 1;\r\n      if (cursor > note->desc.size) { goto exit; }\r\n      \r\n      String8 name = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size);\r\n      cursor += name.size + 1;\r\n      if (cursor > note->desc.size) { goto exit; }\r\n      \r\n      String8 args = str8_cstring_capped(note->desc.str + cursor, note->desc.str + note->desc.size);\r\n      cursor += args.size + 1;\r\n      if (cursor > note->desc.size) { goto exit; }\r\n      \r\n      U64 probe_rebase = image_base + (base_addr - probes_base);\r\n      \r\n      probe.provider  = provider;\r\n      probe.name      = name;\r\n      probe.args      = stap_arg_array_from_string(arena, arch, args);\r\n      probe.pc        = pc + probe_rebase;\r\n      probe.semaphore = semaphore ? semaphore + probe_rebase : 0;\r\n    }\r\n    \r\n    DMN_LNX_ProbeNode *n = push_array(arena, DMN_LNX_ProbeNode, 1);\r\n    n->v = probe;\r\n    SLLQueuePush(probes.first, probes.last, n);\r\n    probes.count += 1;\r\n  }\r\n  \r\n  exit:;\r\n  scratch_end(scratch);\r\n  return probes;\r\n}\r\n\r\n////////////////////////////////\r\n//~ STAP\r\n\r\ninternal\r\nSTAP_MEMORY_READ(dmn_lnx_stap_memory_read)\r\n{\r\n  DMN_LNX_Entity *process = raw_ctx;\r\n  U64 bytes_read = dmn_lnx_read(process->fd, r1u64(addr, addr + read_size), buffer);\r\n  return bytes_read == read_size;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Functions\r\n\r\ninternal DMN_LNX_Entity *\r\ndmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind)\r\n{\r\n  DMN_LNX_Entity *entity = dmn_lnx_state->free_entity;\r\n  if(entity != 0)\r\n  {\r\n    SLLStackPop(dmn_lnx_state->free_entity);\r\n  }\r\n  else\r\n  {\r\n    entity = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 1);\r\n    dmn_lnx_state->entities_count += 1;\r\n  }\r\n  U32 gen = entity->gen;\r\n  MemoryCopyStruct(entity, &dmn_lnx_nil_entity);\r\n  entity->gen += 1;\r\n  if(parent != &dmn_lnx_nil_entity)\r\n  {\r\n    DLLPushBack_NPZ(&dmn_lnx_nil_entity, parent->first, parent->last, entity, next, prev);\r\n    entity->parent = parent;\r\n  }\r\n  entity->kind = kind;\r\n  return entity;\r\n}\r\n\r\ninternal void\r\ndmn_lnx_entity_release(DMN_LNX_Entity *entity)\r\n{\r\n  if(entity->parent != &dmn_lnx_nil_entity)\r\n  {\r\n    DLLRemove_NPZ(&dmn_lnx_nil_entity, entity->parent->first, entity->parent->last, entity, next, prev);\r\n    entity->parent = &dmn_lnx_nil_entity;\r\n  }\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    DMN_LNX_EntityNode start_task = {0, entity};\r\n    DMN_LNX_EntityNode *first_task = &start_task;\r\n    for(DMN_LNX_EntityNode *t = first_task; t != 0; t = t->next)\r\n    {\r\n      SLLStackPush(dmn_lnx_state->free_entity, t->v);\r\n      for(DMN_LNX_Entity *child = t->v->first; child != &dmn_lnx_nil_entity; child = child->next)\r\n      {\r\n        DMN_LNX_EntityNode *task = push_array(scratch.arena, DMN_LNX_EntityNode, 1);\r\n        task->next = t->next;\r\n        t->next = task;\r\n        task->v = child;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\ninternal DMN_Handle\r\ndmn_lnx_handle_from_entity(DMN_LNX_Entity *entity)\r\n{\r\n  DMN_Handle handle = {0};\r\n  U64 index = (U64)(entity - dmn_lnx_state->entities_base);\r\n  if(index <= 0xffffffffu)\r\n  {\r\n    handle.u32[0] = index;\r\n    handle.u32[1] = entity->gen;\r\n  }\r\n  return handle;\r\n}\r\n\r\ninternal DMN_LNX_Entity *\r\ndmn_lnx_entity_from_handle(DMN_Handle handle)\r\n{\r\n  DMN_LNX_Entity *result = &dmn_lnx_nil_entity;\r\n  U64 index = (U64)handle.u32[0];\r\n  if(index < dmn_lnx_state->entities_count &&\r\n     dmn_lnx_state->entities_base[index].gen == handle.u32[1])\r\n  {\r\n    result = &dmn_lnx_state->entities_base[index];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DMN_LNX_Entity *\r\ndmn_lnx_thread_from_pid(pid_t pid)\r\n{\r\n  DMN_LNX_Entity *result = &dmn_lnx_nil_entity;\r\n  if(pid != 0)\r\n  {\r\n    for EachIndex(idx, dmn_lnx_state->entities_count)\r\n    {\r\n      if(dmn_lnx_state->entities_base[idx].kind == DMN_LNX_EntityKind_Thread && (pid_t)dmn_lnx_state->entities_base[idx].id == pid)\r\n      {\r\n        result = &dmn_lnx_state->entities_base[idx];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ndmn_lnx_thread_read_ip(DMN_LNX_Entity *thread)\r\n{\r\n  U64 ip = 0;\r\n  if(thread->reg_block)\r\n  {\r\n    ip = regs_rip_from_arch_block(thread->arch, thread->reg_block);\r\n  }\r\n  Assert(ip);\r\n  return ip;\r\n}\r\n\r\ninternal U64\r\ndmn_lnx_thread_read_sp(DMN_LNX_Entity *thread)\r\n{\r\n  U64 sp = 0;\r\n  if(thread->reg_block)\r\n  {\r\n    sp = regs_rsp_from_arch_block(thread->arch, thread->reg_block);\r\n  }\r\n  Assert(sp);\r\n  return sp;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip)\r\n{\r\n  B32 is_ip_written = 0;\r\n  if(thread->reg_block)\r\n  {\r\n    REGS_RegBlockX64 *reg_block = thread->reg_block;\r\n    regs_arch_block_write_rip(thread->arch, reg_block, ip);\r\n    is_ip_written = dmn_lnx_thread_write_reg_block(thread, reg_block);\r\n  }\r\n  Assert(is_ip_written);\r\n  return is_ip_written;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp)\r\n{\r\n  B32 is_sp_written = 0;\r\n  if(thread->reg_block)\r\n  {\r\n    REGS_RegBlockX64 *reg_block = thread->reg_block;\r\n    regs_arch_block_write_rsp(thread->arch, reg_block, sp);\r\n    is_sp_written = dmn_lnx_thread_write_reg_block(thread, reg_block);\r\n  }\r\n  Assert(is_sp_written);\r\n  return is_sp_written;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block)\r\n{\r\n  AssertAlways(gettid() == thread->parent->tracer_tid);\r\n  \r\n  B32 result = 0;\r\n  switch(thread->arch)\r\n  {\r\n    case Arch_Null:\r\n    case Arch_COUNT:{}break;\r\n    case Arch_x86:\r\n    case Arch_arm64:\r\n    case Arch_arm32:\r\n    {NotImplemented;}break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: [x64]\r\n    //\r\n    case Arch_x64:\r\n    {\r\n      DMN_LNX_Entity   *process = thread->parent;\r\n      pid_t             tid     = (pid_t)thread->id;\r\n      REGS_RegBlockX64 *dst     = reg_block;\r\n      \r\n      //- rjf: read GPR\r\n      B32 got_gpr = 0;\r\n      {\r\n        DMN_LNX_UserX64 ctx = {0};\r\n        int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_len = sizeof(ctx), .iov_base = &ctx });\r\n        if(ptrace_result != -1)\r\n        {\r\n          got_gpr = 1;\r\n          DMN_LNX_UserX64 *src = &ctx;\r\n          dst->rax.u64    = src->regs.rax;\r\n          dst->rcx.u64    = src->regs.rcx;\r\n          dst->rdx.u64    = src->regs.rdx;\r\n          dst->rbx.u64    = src->regs.rbx;\r\n          dst->rsp.u64    = src->regs.rsp;\r\n          dst->rbp.u64    = src->regs.rbp;\r\n          dst->rsi.u64    = src->regs.rsi;\r\n          dst->rdi.u64    = src->regs.rdi;\r\n          dst->r8.u64     = src->regs.r8;\r\n          dst->r9.u64     = src->regs.r9;\r\n          dst->r10.u64    = src->regs.r10;\r\n          dst->r11.u64    = src->regs.r11;\r\n          dst->r12.u64    = src->regs.r12;\r\n          dst->r13.u64    = src->regs.r13;\r\n          dst->r14.u64    = src->regs.r14;\r\n          dst->r15.u64    = src->regs.r15;\r\n          dst->cs.u16     = src->regs.cs;\r\n          dst->ds.u16     = src->regs.ds;\r\n          dst->es.u16     = src->regs.es;\r\n          dst->fs.u16     = src->regs.fs;\r\n          dst->gs.u16     = src->regs.gs;\r\n          dst->ss.u16     = src->regs.ss;\r\n          dst->fsbase.u64 = src->regs.fsbase;\r\n          dst->gsbase.u64 = src->regs.gsbase;\r\n          dst->rip.u64    = src->regs.rip;\r\n          dst->rflags.u64 = src->regs.rflags;\r\n        }\r\n        else { Assert(0 && \"failed to get gprs\"); }\r\n      }\r\n      \r\n      //- rjf: read FPR\r\n      B32 got_fpr = 0;\r\n      if(got_gpr)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        \r\n        X64_XSave  *xsave  = 0;\r\n        X64_FXSave *fxsave = 0;\r\n        \r\n        // get xsave\r\n        if(x64_is_xsave_supported())\r\n        {\r\n          void *xsave_raw     = push_array(scratch.arena, U8, process->xsave_size);\r\n          int   ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_len = process->xsave_size, .iov_base = xsave_raw });\r\n          if(ptrace_result != -1)\r\n          {\r\n            xsave  = xsave_raw;\r\n            fxsave = &xsave->fxsave;\r\n          }\r\n          else { Assert(0 && \"failed to get xsave\"); }\r\n        }\r\n        \r\n        // get fxsave\r\n        if (fxsave == 0)\r\n        {\r\n          fxsave = push_array(scratch.arena, X64_FXSave, 1);\r\n          int ptrace_result = ptrace(PTRACE_GETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_len = sizeof(*fxsave), .iov_base = fxsave });\r\n          if(ptrace_result != -1)\r\n          {\r\n            fxsave = 0;\r\n          }\r\n          else { Assert(0 && \"failed to get fxsave\"); }\r\n        }\r\n        \r\n        // copy fxsave registers\r\n        if(fxsave)\r\n        {\r\n          X64_FXSave *src = fxsave;\r\n          \r\n          // copy x87 registers\r\n          dst->fcw.u16        = src->fcw;\r\n          dst->fsw.u16        = src->fsw;\r\n          dst->ftw.u16        = x64_xsave_tag_word_from_real_tag_word(src->ftw);\r\n          dst->fop.u16        = src->fop;\r\n          dst->fip.u64        = src->b64.fip;\r\n          dst->fdp.u64        = src->b64.fdp;\r\n          dst->mxcsr.u32      = src->mxcsr;\r\n          dst->mxcsr_mask.u32 = src->mxcsr_mask;\r\n          for EachIndex(i, 8)\r\n          {\r\n            MemoryCopy(&dst->st0 + i, src->st_space + i, sizeof(REGS_Reg80));\r\n          }\r\n          \r\n          // SSE registers are always available in x64\r\n          {\r\n            U128        *xmm_d = fxsave->xmm_space;\r\n            REGS_Reg512 *zmm_s = &dst->zmm0;\r\n            for EachIndex(i, 16)\r\n            {\r\n              MemoryCopy(&zmm_s[i], &xmm_d[i], sizeof(*xmm_d));\r\n            }\r\n          }\r\n        }\r\n        \r\n        // copy xsave registers\r\n        if(xsave)\r\n        {\r\n          if(xsave->header.xstate_bv & X64_XStateComponentFlag_AVX)\r\n          {\r\n            AssertAlways(process->xsave_layout.avx_offset + 16*sizeof(REGS_Reg128) <= process->xsave_size);\r\n            REGS_Reg128 *avx_s = (REGS_Reg128 *)((U8 *)xsave + process->xsave_layout.avx_offset);\r\n            REGS_Reg512 *zmm_d = &dst->zmm0;\r\n            for EachIndex(n, 16)\r\n            {\r\n              MemoryCopy(&zmm_d[n].v[16], &avx_s[n], sizeof(REGS_Reg128));\r\n            }\r\n          }\r\n          \r\n          if(xsave->header.xstate_bv & X64_XStateComponentFlag_OPMASK)\r\n          {\r\n            AssertAlways(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size);\r\n            REGS_Reg64 *kmask_s = (REGS_Reg64 *)((U8 *)xsave + process->xsave_layout.opmask_offset);\r\n            REGS_Reg64 *kmask_d = &dst->k0;\r\n            for EachIndex(n, 8)\r\n            {\r\n              MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64));\r\n            }\r\n          }\r\n          \r\n          if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM_H)\r\n          {\r\n            AssertAlways(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size);\r\n            REGS_Reg256 *avx512h_s = (REGS_Reg256 *)((U8 *)xsave + process->xsave_layout.zmm_h_offset);\r\n            REGS_Reg512 *zmmh_d    = &dst->zmm0;\r\n            for EachIndex(n, 16)\r\n            {\r\n              MemoryCopy(&zmmh_d[n].v[32], &avx512h_s[n], sizeof(REGS_Reg256));\r\n            }\r\n          }\r\n          \r\n          if(xsave->header.xstate_bv & X64_XStateComponentFlag_ZMM)\r\n          {\r\n            AssertAlways(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size);\r\n            REGS_Reg512 *avx512_s = (REGS_Reg512 *)((U8 *)xsave + process->xsave_layout.zmm_offset);\r\n            REGS_Reg512 *zmm_d    = &dst->zmm16;\r\n            for EachIndex(n, 16)\r\n            {\r\n              MemoryCopy(&zmm_d[n], &avx512_s[n], sizeof(REGS_Reg512));\r\n            }\r\n          }\r\n          \r\n          if(xsave->header.xstate_bv & X64_XStateComponentFlag_CETU)\r\n          {\r\n            AssertAlways(process->xsave_layout.cet_u_offset + sizeof(U64)*2 <= process->xsave_size);\r\n            U64 *cet_u = (U64 *)((U8 *)xsave + process->xsave_layout.cet_u_offset);\r\n            dst->cetmsr.u64 = cet_u[0];\r\n            dst->cetssp.u64 = cet_u[1];\r\n          }\r\n        }\r\n        \r\n        got_fpr = (xsave || fxsave);\r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //- rjf: read debug registers\r\n      B32 got_debug = 0;\r\n      if(got_fpr)\r\n      {\r\n        got_debug = 1;\r\n        REGS_Reg64 *dr_d = &dst->dr0;\r\n        for EachIndex(n, 8)\r\n        {\r\n          if(n != 4 && n != 5)\r\n          {\r\n            U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]);\r\n            errno = 0;\r\n            long peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0);\r\n            if(errno == 0)\r\n            {\r\n              dr_d[n].u64 = (U64)peek_result;\r\n            }\r\n            else\r\n            {\r\n              got_debug = 0;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      result = got_debug;\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block)\r\n{\r\n  AssertAlways(gettid() == thread->parent->tracer_tid);\r\n  \r\n  B32 result = 0;\r\n  switch(thread->arch)\r\n  {\r\n    case Arch_Null:\r\n    case Arch_COUNT:{}break;\r\n    case Arch_arm64:\r\n    case Arch_arm32:\r\n    case Arch_x86:\r\n    {NotImplemented;}break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: [x64]\r\n    //\r\n    case Arch_x64:\r\n    {\r\n      DMN_LNX_Entity   *process = thread->parent;\r\n      pid_t             tid     = (pid_t)thread->id;\r\n      REGS_RegBlockX64 *src     = reg_block;\r\n      \r\n      //- rjf: write GPR\r\n      B32 did_gpr = 0;\r\n      {\r\n        DMN_LNX_UserX64 dst = {0};\r\n        dst.regs.rax    = src->rax.u64;\r\n        dst.regs.rcx    = src->rcx.u64;\r\n        dst.regs.rdx    = src->rdx.u64;\r\n        dst.regs.rbx    = src->rbx.u64;\r\n        dst.regs.rsp    = src->rsp.u64;\r\n        dst.regs.rbp    = src->rbp.u64;\r\n        dst.regs.rsi    = src->rsi.u64;\r\n        dst.regs.rdi    = src->rdi.u64;\r\n        dst.regs.r8     = src->r8.u64;\r\n        dst.regs.r9     = src->r9.u64;\r\n        dst.regs.r10    = src->r10.u64;\r\n        dst.regs.r11    = src->r11.u64;\r\n        dst.regs.r12    = src->r12.u64;\r\n        dst.regs.r13    = src->r13.u64;\r\n        dst.regs.r14    = src->r14.u64;\r\n        dst.regs.r15    = src->r15.u64;\r\n        dst.regs.cs     = src->cs.u16;\r\n        dst.regs.ds     = src->ds.u16;\r\n        dst.regs.es     = src->es.u16;\r\n        dst.regs.fs     = src->fs.u16;\r\n        dst.regs.gs     = src->gs.u16;\r\n        dst.regs.ss     = src->ss.u16;\r\n        dst.regs.fsbase = src->fsbase.u64;\r\n        dst.regs.gsbase = src->gsbase.u64;\r\n        dst.regs.rip    = src->rip.u64;\r\n        dst.regs.rflags = src->rflags.u64;\r\n        did_gpr = ptrace(PTRACE_SETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = &dst, .iov_len = sizeof(dst) }) >= 0;\r\n      }\r\n      \r\n      B32 did_fpr = 0;\r\n      if(did_gpr)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        \r\n        int xsave_result  = -1;\r\n        int fxsave_result = -1;\r\n        \r\n        X64_FXSave dst_fxsave = {0};\r\n        {\r\n          dst_fxsave.fcw          = src->fcw.u16;\r\n          dst_fxsave.fsw          = src->fsw.u16;\r\n          dst_fxsave.ftw          = src->ftw.u16;\r\n          dst_fxsave.fop          = src->fop.u16;\r\n          dst_fxsave.b64.fip      = src->fip.u64;\r\n          dst_fxsave.b64.fdp      = src->fdp.u64;\r\n          dst_fxsave.mxcsr        = src->mxcsr.u32;\r\n          dst_fxsave.mxcsr_mask   = src->mxcsr_mask.u32;\r\n          \r\n          REGS_Reg128 *st_d = (REGS_Reg128 *)dst_fxsave.st_space;\r\n          REGS_Reg80  *st_s = &src->st0;\r\n          for EachIndex(n, 8)\r\n          {\r\n            MemoryCopy(&st_d[n], &st_s[n], sizeof(REGS_Reg80));\r\n          }\r\n          \r\n          REGS_Reg128 *xmm_d = (REGS_Reg128 *)dst_fxsave.xmm_space;\r\n          REGS_Reg512 *xmm_s = &src->zmm0;\r\n          for EachIndex(n, 16)\r\n          {\r\n            MemoryCopy(&xmm_d[n], &xmm_s[n], sizeof(REGS_Reg128));\r\n          }\r\n        }\r\n        \r\n        if(x64_is_xsave_supported())\r\n        {\r\n          U8  *xsave_raw = push_array(scratch.arena, U8, process->xsave_size);\r\n          int  xsave_get = ptrace(PTRACE_GETREGSET, tid, (void *)NT_PRSTATUS, &(struct iovec){ .iov_base = xsave_raw, .iov_len = process->xsave_size });\r\n          AssertAlways(xsave_get >= 0);\r\n          \r\n          X64_XSave *dst = (X64_XSave *)xsave_raw;\r\n          dst->fxsave = dst_fxsave;\r\n          \r\n          if(process->xsave_layout.avx_offset)\r\n          {\r\n            if(process->xsave_layout.avx_offset + sizeof(REGS_Reg128) * 16 <= process->xsave_size)\r\n            {\r\n              REGS_Reg128 *avx_d = (REGS_Reg128 *)(xsave_raw + process->xsave_layout.avx_offset);\r\n              REGS_Reg512 *zmm_s = &src->zmm0;\r\n              for EachIndex(n, 16)\r\n              {\r\n                MemoryCopy(&avx_d[n], &zmm_s[n].v[16], sizeof(REGS_Reg128));\r\n              }\r\n            }\r\n          }\r\n          \r\n          if(process->xsave_layout.opmask_offset)\r\n          {\r\n            if(process->xsave_layout.opmask_offset + sizeof(REGS_Reg64) * 8 <= process->xsave_size)\r\n            {\r\n              REGS_Reg64 *kmask_d = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.opmask_offset);\r\n              REGS_Reg64 *kmask_s = &src->k0;\r\n              for EachIndex(n, 8)\r\n              {\r\n                MemoryCopy(&kmask_d[n], &kmask_s[n], sizeof(REGS_Reg64));\r\n              }\r\n            }\r\n            else { Assert(0 && \"invalid xsave size\"); }\r\n          }\r\n          \r\n          if(process->xsave_layout.zmm_h_offset)\r\n          {\r\n            if(process->xsave_layout.zmm_h_offset + sizeof(REGS_Reg256) * 16 <= process->xsave_size)\r\n            {\r\n              REGS_Reg256 *avx512h_d = (REGS_Reg256 *)(xsave_raw + process->xsave_layout.zmm_h_offset);\r\n              REGS_Reg512 *zmmh_s    = &src->zmm0;\r\n              for EachIndex(n, 16)\r\n              {\r\n                MemoryCopy(&avx512h_d[n], &zmmh_s[n].v[32], sizeof(REGS_Reg256));\r\n              }\r\n            }\r\n            else { Assert(0 && \"invalid xsave size\"); }\r\n          }\r\n          \r\n          if(process->xsave_layout.zmm_offset)\r\n          {\r\n            if(process->xsave_layout.zmm_offset + sizeof(REGS_Reg512) * 16 <= process->xsave_size)\r\n            {\r\n              REGS_Reg512 *avx512_d = (REGS_Reg512 *)(xsave_raw + process->xsave_layout.zmm_offset);\r\n              REGS_Reg512 *zmm_s    = &src->zmm16;\r\n              for EachIndex(n, 16)\r\n              {\r\n                MemoryCopy(&avx512_d[n], &zmm_s[n], sizeof(REGS_Reg512));\r\n              }\r\n            }\r\n            else { Assert(0 && \"invalid xsave size\"); }\r\n          }\r\n          \r\n          if(process->xsave_layout.cet_u_offset)\r\n          {\r\n            if(process->xsave_layout.cet_u_offset + sizeof(REGS_Reg64) * 2 <= process->xsave_size)\r\n            {\r\n              REGS_Reg64 *cet_u = (REGS_Reg64 *)(xsave_raw + process->xsave_layout.cet_u_offset);\r\n              cet_u[0] = src->cetmsr;\r\n              cet_u[1] = src->cetssp;\r\n            }\r\n            else { Assert(0 && \"invalid xsave size\"); }\r\n          }\r\n          \r\n          // xsave\r\n          xsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_X86_XSTATE, &(struct iovec){ .iov_base = dst, .iov_len = process->xsave_size });\r\n          Assert(xsave_result >= 0);\r\n        }\r\n        \r\n        // fallback to fxsave\r\n        if(xsave_result < 0)\r\n        {\r\n          fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void *)NT_FPREGSET, &(struct iovec){ .iov_base = &dst_fxsave, sizeof(dst_fxsave) });\r\n          Assert(fxsave_result >= 0);\r\n        }\r\n        \r\n        // rjf: good finish requires xsave or fxsave\r\n        did_fpr = (xsave_result >= 0 || fxsave_result >= 0);\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //- rjf: write debug registers\r\n      B32 did_dbg = 0;\r\n      if(did_fpr)\r\n      {\r\n        did_dbg = 1;\r\n        \r\n        src->dr7.u64 |= (1 << 10);\r\n        \r\n        REGS_Reg64 *dr_s = &src->dr0;\r\n        for EachIndex(n, 8)\r\n        {\r\n          if(n != 4 && n != 5)\r\n          {\r\n            U64 offset = OffsetOf(DMN_LNX_UserX64, u_debugreg[n]);\r\n            int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s[n].u64);\r\n            if(poke_result < 0)\r\n            {\r\n              did_dbg = 0;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      result = (did_dbg);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on)\r\n{\r\n  B32 is_flag_set = 0;\r\n  switch(thread->arch)\r\n  {\r\n    case Arch_COUNT:\r\n    case Arch_Null: {} break;\r\n    case Arch_x64:\r\n    {\r\n      REGS_RegBlockX64 *reg_block = thread->reg_block;\r\n      if(is_on)\r\n      {\r\n        reg_block->rflags.u64 |= X64_RFlag_Trap;\r\n      }\r\n      else\r\n      {\r\n        reg_block->rflags.u64 &= ~X64_RFlag_Trap;\r\n      }\r\n      is_flag_set = dmn_lnx_thread_write_reg_block(thread, thread->reg_block);\r\n    }break;\r\n    case Arch_x86:\r\n    case Arch_arm32:\r\n    case Arch_arm64:\r\n    {\r\n      NotImplemented;\r\n    }break;\r\n  }\r\n  Assert(is_flag_set);\r\n  return is_flag_set;\r\n}\r\n\r\ninternal void\r\ndmn_lnx_process_loaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 new_link_map_vaddr)\r\n{\r\n  GNU_LinkMap64 map = {0};\r\n  for(U64 map_vaddr = new_link_map_vaddr; map_vaddr != 0; map_vaddr = map.next_vaddr)\r\n  {\r\n    // read out new link map item\r\n    if(!dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map)) { goto exit; }\r\n    \r\n    // was module with this base already registered?\r\n    DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr);\r\n    if(module) { continue; }\r\n    \r\n    // parse out module's ELF header\r\n    ELF_Hdr64 module_ehdr = {0};\r\n    if(!dmn_lnx_read_ehdr(process->fd, map.addr_vaddr, &module_ehdr)) { goto exit; }\r\n    \r\n    // gather info about module\r\n    U64              module_rebase     = module_ehdr.e_type == ELF_Type_Dyn ? map.addr_vaddr : 0;\r\n    U64              module_phdr_vaddr = module_rebase + module_ehdr.e_phoff;\r\n    DMN_LNX_PhdrInfo module_phdr_info  = dmn_lnx_phdr_info_from_memory(process->fd, module_ehdr.e_ident[ELF_Identifier_Class], module_rebase, module_phdr_vaddr, module_ehdr.e_phentsize, module_ehdr.e_phnum);\r\n    String8          module_name       = dmn_lnx_read_string(process->arena, process->fd, map.name_vaddr);\r\n    \r\n    // fill out module\r\n    module             = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module);\r\n    module->id         = map.name_vaddr;\r\n    module->base_vaddr = map.addr_vaddr;\r\n    \r\n    // push load event\r\n    if(!str8_match(module_name, str8_lit(\"linux-vdso.so.1\"), 0))\r\n    {\r\n      DMN_Event *e = dmn_event_list_push(arena, events);\r\n      e->kind             = DMN_EventKind_LoadModule;\r\n      e->process          = dmn_lnx_handle_from_entity(process);\r\n      e->module           = dmn_lnx_handle_from_entity(module);\r\n      e->arch             = arch_from_elf_machine(module_ehdr.e_machine);\r\n      e->address          = map.addr_vaddr;\r\n      e->size             = dim_1u64(module_phdr_info.range);\r\n      e->string           = module_name;\r\n      e->elf_phdr_vrange  = r1u64(module_phdr_vaddr, module_phdr_vaddr + module_ehdr.e_phentsize * module_ehdr.e_phnum);\r\n      e->elf_phdr_entsize = module_ehdr.e_phentsize;\r\n    }\r\n    \r\n    // create mapping for base -> module\r\n    hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, map.addr_vaddr, module);\r\n  }\r\n  \r\n  exit:;\r\n}\r\n\r\ninternal void\r\ndmn_lnx_process_unloaded_modules(Arena *arena, DMN_EventList *events, DMN_LNX_Entity *process, U64 name_space_id, U64 rdebug_vaddr)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  B32 is_unmap_complete_finished = 0;\r\n  \r\n  GNU_RDebugInfo64 rdebug = {0};\r\n  if(!dmn_lnx_read_r_debug(process->fd, rdebug_vaddr, process->arch, &rdebug)) { goto exit; }\r\n  if(rdebug.r_version != 1) { goto exit; }\r\n  \r\n  // flag every module as inactive\r\n  for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next)\r\n  {\r\n    if(module->kind != DMN_LNX_EntityKind_Module) {continue;}\r\n    module->is_live = 0;\r\n  }\r\n  \r\n  // loop over modules in the link map and mark live modules\r\n  GNU_LinkMap64 map = {0};\r\n  for(U64 map_vaddr = rdebug.r_map; map_vaddr != 0; map_vaddr = map.next_vaddr)\r\n  {\r\n    if(dmn_lnx_read_linkmap(process->fd, map_vaddr, process->dl_class, &map))\r\n    {\r\n      DMN_LNX_Entity *module = hash_table_search_u64_raw(process->loaded_modules_ht, map.addr_vaddr);\r\n      if(module)\r\n      {\r\n        module->is_live = 1;\r\n      }\r\n      else { Assert(0 && \"unknown module is being unloaded\"); }\r\n    }\r\n    else { Assert(0 && \"unable to read Link Map\"); }\r\n  }\r\n  \r\n  // unload inactive modules\r\n  DMN_HandleList to_release = {0};\r\n  for(DMN_LNX_Entity *module = process->first; module != &dmn_lnx_nil_entity; module = module->next)\r\n  {\r\n    if(module->kind != DMN_LNX_EntityKind_Module) {continue;}\r\n    if(module->is_live)                           {continue;}\r\n    dmn_handle_list_push(scratch.arena, &to_release, dmn_lnx_handle_from_entity(module));\r\n  }\r\n  \r\n  // push events and clean up internal structures\r\n  for EachNode(n, DMN_HandleNode, to_release.first)\r\n  {\r\n    DMN_LNX_Entity *module = dmn_lnx_entity_from_handle(n->v);\r\n    \r\n    DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);\r\n    e->kind    = DMN_EventKind_UnloadModule;\r\n    e->process = dmn_lnx_handle_from_entity(process);\r\n    e->module  = dmn_lnx_handle_from_entity(module);\r\n    e->string  = dmn_lnx_read_string(arena, process->fd, module->id);\r\n    \r\n    hash_table_purge_u64(process->loaded_modules_ht, module->base_vaddr);\r\n    \r\n    dmn_lnx_entity_release(module);\r\n  }\r\n  \r\n  is_unmap_complete_finished = 1;\r\n  exit:;\r\n  Assert(is_unmap_complete_finished);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS)\r\n\r\ninternal void\r\ndmn_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  dmn_lnx_state = push_array(arena, DMN_LNX_State, 1);\r\n  dmn_lnx_state->arena = arena;\r\n  dmn_lnx_state->deferred_events_arena = arena_alloc();\r\n  dmn_lnx_state->entities_arena = arena_alloc(.reserve_size = GB(32), .commit_size = KB(64), .flags = ArenaFlag_NoChain);\r\n  dmn_lnx_state->entities_base = push_array(dmn_lnx_state->entities_arena, DMN_LNX_Entity, 0);\r\n  dmn_lnx_entity_alloc(&dmn_lnx_nil_entity, DMN_LNX_EntityKind_Root);\r\n  dmn_lnx_state->access_mutex = mutex_alloc();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS)\r\n\r\ninternal DMN_CtrlCtx *\r\ndmn_ctrl_begin(void)\r\n{\r\n  DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1;\r\n  dmn_lnx_ctrl_thread = 1;\r\n  return ctx;\r\n}\r\n\r\ninternal void\r\ndmn_ctrl_exclusive_access_begin(void)\r\n{\r\n  MutexScope(dmn_lnx_state->access_mutex)\r\n  {\r\n    dmn_lnx_state->access_run_state = 1;\r\n  }\r\n}\r\n\r\ninternal void\r\ndmn_ctrl_exclusive_access_end(void)\r\n{\r\n  MutexScope(dmn_lnx_state->access_mutex)\r\n  {\r\n    dmn_lnx_state->access_run_state = 0;\r\n  }\r\n}\r\n\r\ninternal U32\r\ndmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: unpack command line\r\n  char **argv = 0;\r\n  int argc = 0;\r\n  {\r\n    argc = (int)(params->cmd_line.node_count);\r\n    argv = push_array(scratch.arena, char *, argc+1);\r\n    {\r\n      U64 idx = 0;\r\n      for(String8Node *n = params->cmd_line.first; n != 0; n = n->next, idx += 1)\r\n      {\r\n        argv[idx] = (char *)push_str8_copy(scratch.arena, n->string).str;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: unpack path\r\n  char *path = (char *)push_str8_copy(scratch.arena, params->path).str;\r\n  \r\n  //- rjf: unpack environment\r\n  char **env = 0;\r\n  {\r\n    env = push_array(scratch.arena, char *, params->env.node_count+1);\r\n    {\r\n      U64 idx = 0;\r\n      for(String8Node *n = params->env.first; n != 0; n = n->next, idx += 1)\r\n      {\r\n        env[idx] = (char *)push_str8_copy(scratch.arena, n->string).str;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: create & set up new process\r\n  if(argv != 0 && argv[0] != 0)\r\n  {\r\n    pid_t pid                    = 0;\r\n    int   ptrace_result          = 0;\r\n    int   chdir_result           = 0;\r\n    B32   error__need_child_kill = 0;\r\n    \r\n    // open temp pipes to communicate with child process\r\n    int pipe_fds[2] = {0};\r\n    if (pipe(&pipe_fds[0]) < 0) { InvalidPath; }\r\n    \r\n    //- rjf: fork\r\n    pid = fork();\r\n    if(pid == -1) { goto error; }\r\n    \r\n    //- rjf: child process -> execute actual target\r\n    if(pid == 0)\r\n    {\r\n      // wait for parent seize\r\n      char b;\r\n      read(pipe_fds[0], &b, sizeof(b));\r\n      \r\n      // set current working directory to tracee\r\n      chdir_result = chdir(path);\r\n      if(chdir_result == -1) { goto error; }\r\n      \r\n      // replace process with target\r\n      execve(argv[0], argv, env);\r\n      \r\n      // execve failed -- exit\r\n      abort();\r\n    }\r\n    \r\n    //- rjf: parent process\r\n    if(pid != 0)\r\n    {\r\n      enum LaunchStatus\r\n      {\r\n        LaunchStatus_Null,\r\n        LaunchStatus_FailBeforePtrace,\r\n        LaunchStatus_FailAfterPtrace,\r\n        LaunchStatus_Success,\r\n      };\r\n      enum LaunchStatus launch_status = LaunchStatus_FailBeforePtrace;\r\n      {\r\n        int s = 0;\r\n        \r\n        // seize process\r\n        if (ptrace(PTRACE_SEIZE, pid, 0, 0) < 0) { Assert(0 && \"seize failed\"); goto launch_error; }\r\n        \r\n        // interrupt process\r\n        launch_status = LaunchStatus_FailAfterPtrace;\r\n        if (ptrace(PTRACE_INTERRUPT, pid, 0, 0) < 0) { Assert(0 && \"interrupt failed\");       goto launch_error; }\r\n        if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && \"interrupt wait failed\"); goto launch_error; }\r\n        \r\n        //  entry read\r\n        if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)    { Assert(0 && \"syscall failed\"); goto launch_error; }\r\n        \r\n        // resume child\r\n        char b = 1;\r\n        if (write(pipe_fds[1], &b, sizeof(b)) < 0) { Assert(0 && \"resume child failed\"); goto launch_error; }\r\n        \r\n        // exit read\r\n        if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && \"wait failed\");    goto launch_error; }\r\n        if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)    { Assert(0 && \"syscall failed\"); goto launch_error; }\r\n        \r\n        // entry chdir\r\n        if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && \"wait failed\");    goto launch_error; }\r\n        if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)    { Assert(0 && \"syscall failed\"); goto launch_error; }\r\n        \r\n        // exit chdir\r\n        if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && \"wait failed\");    goto launch_error; }\r\n        if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)    { Assert(0 && \"syscall failed\"); goto launch_error; }\r\n        \r\n        // entry execv\r\n        if (waitpid(pid, &s, __WALL|__WNOTHREAD) < 0) { Assert(0 && \"wait failed\");    goto launch_error; }\r\n        if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)    { Assert(0 && \"syscall failed\"); goto launch_error; }\r\n        \r\n        // exit execve\r\n        if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && \"wait failed\");    goto launch_error; }\r\n        if (ptrace(PTRACE_SYSCALL, pid, 0, 0) < 0)      { Assert(0 && \"syscall failed\"); goto launch_error; }\r\n        if (waitpid(pid, &s, __WALL | __WNOTHREAD) < 0) { Assert(0 && \"wait failed\");    goto launch_error; }\r\n        \r\n        uintptr_t trace_options = PTRACE_O_TRACEEXIT | PTRACE_O_EXITKILL | PTRACE_O_TRACEFORK | PTRACE_O_TRACEVFORK | PTRACE_O_TRACECLONE | PTRACE_O_TRACEVFORKDONE;\r\n        int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(trace_options));\r\n        if (setoptions_result == -1) { Assert(0 && \"failed to set options\");  error__need_child_kill = 1; goto launch_error; }\r\n        \r\n        launch_status = LaunchStatus_Success;\r\n        launch_error:;\r\n      }\r\n      \r\n      //- rjf: respond to launch status appropriately\r\n      switch(launch_status)\r\n      {\r\n        //- rjf: no understood handling path\r\n        default:{}break;\r\n        \r\n        //- rjf: failure, after ptrace => we need to explicitly obtain the\r\n        // result code & exit the process, otherwise it will become a zombie,\r\n        // since it is ptrace'd.\r\n        case LaunchStatus_FailAfterPtrace:\r\n        {\r\n          B32 cleanup_good = 0;\r\n          int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT);\r\n          if(detach_result != -1)\r\n          {\r\n            int status_cleanup = 0;\r\n            pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL);\r\n            if(wait_id_cleanup == pid)\r\n            {\r\n              cleanup_good = 1;\r\n            }\r\n          }\r\n          if(cleanup_good)\r\n          {\r\n            // TODO(rjf): child initialization failed, but we at least cleaned it up.\r\n          }\r\n          else\r\n          {\r\n            // TODO(rjf): child initialization failed, *and* we couldn't clean it up, so we've created\r\n            // yet-another zombie.\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: successful launch\r\n        case LaunchStatus_Success:\r\n        {\r\n          ELF_Hdr64           exe_ehdr         = dmn_lnx_ehdr_from_pid(pid);\r\n          int                 memory_fd        = open((char*)str8f(scratch.arena, \"/proc/%d/mem\", pid).str, O_RDWR|O_CLOEXEC);\r\n          DMN_LNX_ProcessAuxv auxv             = dmn_lnx_auxv_from_pid(pid, exe_ehdr.e_ident[ELF_Identifier_Class]);\r\n          Arch                arch             = arch_from_elf_machine(exe_ehdr.e_machine);\r\n          U64                 rdebug_vaddr     = dmn_lnx_rdebug_vaddr_from_memory(memory_fd, auxv.base);\r\n          U64                 rdebug_brk_vaddr = rdebug_vaddr + gnu_r_brk_offset_from_arch(arch);\r\n          \r\n          ELF_Class dl_class;\r\n          {\r\n            ELF_Hdr64 ehdr = {0};\r\n            if(!dmn_lnx_read_ehdr(memory_fd, auxv.base, &ehdr)) { Assert(0 && \"failed to read interp's header\"); }\r\n            dl_class = ehdr.e_ident[ELF_Identifier_Class];\r\n          }\r\n          \r\n          U64             xcr0         = 0;\r\n          U64             xsave_size   = 0;\r\n          X64_XSaveLayout xsave_layout = {0};\r\n          if(arch == Arch_x64)\r\n          {\r\n            X64_XSave xsave = {0};\r\n            if(ptrace(PTRACE_GETREGSET, pid, (void*)NT_X86_XSTATE, &(struct iovec){.iov_base = &xsave, .iov_len = sizeof(xsave) }) >= 0)\r\n            {\r\n              // Linux stores xcr0 bits in fxstate padding,\r\n              // see https://github.com/torvalds/linux/blob/6548d364a3e850326831799d7e3ea2d7bb97ba08/arch/x86/include/asm/user.h#L25\r\n              xcr0         = *(U64 *)((U8 *)&xsave + 464);\r\n              xsave_size   = x64_get_xsave_size();\r\n              xsave_layout = x64_get_xsave_layout(xcr0);\r\n            }\r\n            else\r\n            {\r\n              Assert(0 && \"failed to get xstate\");\r\n            }\r\n          }\r\n          \r\n          String8 dl_path = {0};\r\n          {\r\n            int maps_fd = open((char *)str8f(scratch.arena, \"/proc/%d/maps\", pid).str, O_RDONLY|O_CLOEXEC);\r\n            if(maps_fd != -1)\r\n            {\r\n              struct stat st = {0};\r\n              if(fstat(maps_fd, &st) != -1)\r\n              {\r\n                U64  maps_size = dmn_lnx_size_from_fd(maps_fd, MB(1));\r\n                U8  *maps_ptr  = push_array(scratch.arena, U8, maps_size);\r\n                U64  read_size = dmn_lnx_read(maps_fd, r1u64(0, maps_size), maps_ptr);\r\n                if(read_size == maps_size)\r\n                {\r\n                  String8 maps = str8(maps_ptr, maps_size);\r\n                  \r\n                  String8List parts = {0};\r\n                  {\r\n                    for(U64 cursor = 0, part_off = 0; cursor < maps.size; cursor += 1)\r\n                    {\r\n                      if(maps.str[cursor] == '\\\\')\r\n                      {\r\n                        cursor += 1;\r\n                        continue;\r\n                      }\r\n                      if(maps.str[cursor] == ' ' || maps.str[cursor] == '\\n' || cursor + 1 >= maps.size)\r\n                      {\r\n                        String8 p = str8_substr(maps, r1u64(part_off, cursor));\r\n                        if(p.size > 0)\r\n                        {\r\n                          str8_list_push(scratch.arena, &parts, p);\r\n                        }\r\n                        part_off = cursor + 1;\r\n                      }\r\n                    }\r\n                  }\r\n                  \r\n                  for(String8Node *n = parts.first; n != 0; )\r\n                  {\r\n                    String8 vrange_str = n->string;\r\n                    n = n->next;\r\n                    if(n == 0) { break; }\r\n                    \r\n                    String8 perms_str = n->string;\r\n                    n = n->next;\r\n                    if(n == 0) { break; }\r\n                    \r\n                    String8 offset_str = n->string;\r\n                    n = n->next;\r\n                    if(n == 0) { break; }\r\n                    \r\n                    String8 dev_str = n->string;\r\n                    n = n->next;\r\n                    if(n == 0) { break; }\r\n                    \r\n                    String8 inode_str = n->string;\r\n                    n = n->next;\r\n                    if(n == 0) { break; }\r\n                    \r\n                    String8 path = n->string;\r\n                    n = n->next;\r\n                    if(n == 0) { break; }\r\n                    \r\n                    String8List vaddr_list = str8_split_by_string_chars(scratch.arena, vrange_str, str8_lit(\"-\"), 0);\r\n                    if(vaddr_list.node_count != 2) { break; }\r\n                    \r\n                    U64 lo_vaddr = u64_from_str8(vaddr_list.first->string, 16);\r\n                    if(lo_vaddr == auxv.base)\r\n                    {\r\n                      dl_path = push_str8_copy(scratch.arena, path);\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              close(maps_fd);\r\n            }\r\n          }\r\n          AssertAlways(dl_path.size);\r\n          \r\n          // alloc arena for the process\r\n          Arena *process_arena = arena_alloc();\r\n          \r\n          DMN_LNX_Probe **known_probes = push_array(process_arena, DMN_LNX_Probe *, DMN_LNX_ProbeType_Count);\r\n          {\r\n            DMN_LNX_ProbeList probes = {0};\r\n            int dl_fd = open((char *)dl_path.str, O_RDONLY|O_CLOEXEC);\r\n            if(dl_fd >= 0)\r\n            {\r\n              probes = dmn_lnx_read_probes(process_arena, dl_fd, 0, auxv.base);\r\n              close(dl_fd);\r\n            }\r\n            \r\n            for EachNode(n, DMN_LNX_ProbeNode, probes.first)\r\n            {\r\n              DMN_LNX_Probe *p = &n->v;\r\n              if(str8_match(p->provider, str8_lit(\"rtld\"), 0))\r\n              {\r\n#define X(_N,_A,_S) if(str8_match(p->name, str8_lit(_S), 0)) { AssertAlways(p->args.count == _A); known_probes[DMN_LNX_ProbeType_##_N] = p; continue ; }\r\n                DMN_LNX_Probe_XList\r\n#undef X\r\n              }\r\n            }\r\n          }\r\n          \r\n          // install DL probes\r\n          U64 probe_vaddrs[DMN_LNX_ProbeType_Count] = {0};\r\n          for EachIndex(i, DMN_LNX_ProbeType_Count)\r\n          {\r\n            if(known_probes[i] == 0) { continue; }\r\n            \r\n            U8 og_byte = 0;\r\n            if(!dmn_lnx_read_struct(memory_fd, known_probes[i]->pc, &og_byte)) { Assert(0 && \"failed to read original byte\"); }\r\n            Assert(og_byte == 0x90);\r\n            \r\n            U8 trap = 0xcc;\r\n            if(!dmn_lnx_write_struct(memory_fd, known_probes[i]->pc, &trap)) { Assert(0 && \"failed to install probe\"); }\r\n            \r\n            probe_vaddrs[i] = known_probes[i]->pc;\r\n          }\r\n          \r\n          // make process entity & push create event\r\n          DMN_LNX_Entity *process = &dmn_lnx_nil_entity;\r\n          {\r\n            process = dmn_lnx_entity_alloc(dmn_lnx_state->entities_base, DMN_LNX_EntityKind_Process);\r\n            process->arch                          = arch;\r\n            process->id                            = pid;\r\n            process->fd                            = memory_fd;\r\n            process->tracer_tid                    = gettid();\r\n            process->rdebug_vaddr                  = rdebug_vaddr;\r\n            process->rdebug_brk_vaddr              = rdebug_brk_vaddr;\r\n            process->expect_rdebug_data_breakpoint = rdebug_vaddr != 0;\r\n            process->dl_class                      = dl_class;\r\n            process->arena                         = process_arena;\r\n            process->loaded_modules_ht             = hash_table_init(process_arena, 0x1000);\r\n            process->probes                        = known_probes;\r\n            process->xcr0                          = xcr0;\r\n            process->xsave_size                    = Max(xsave_size, sizeof(X64_XSave));\r\n            process->xsave_layout                  = xsave_layout;\r\n            MemoryCopyTyped(&process->probe_vaddrs[0], &probe_vaddrs[0], DMN_LNX_ProbeType_Count);\r\n            {\r\n              DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);\r\n              e->kind    = DMN_EventKind_CreateProcess;\r\n              e->process = dmn_lnx_handle_from_entity(process);\r\n              e->arch    = process->arch;\r\n              e->code    = pid;\r\n            }\r\n          }\r\n          \r\n          // make thread entity & push create event\r\n          DMN_LNX_Entity *main_thread = &dmn_lnx_nil_entity;\r\n          {\r\n            main_thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread);\r\n            main_thread->id        = pid;\r\n            main_thread->arch      = process->arch;\r\n            main_thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch));\r\n            dmn_lnx_thread_read_reg_block(main_thread, main_thread->reg_block);\r\n            {\r\n              DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);\r\n              e->kind    = DMN_EventKind_CreateThread;\r\n              e->process = dmn_lnx_handle_from_entity(process);\r\n              e->thread  = dmn_lnx_handle_from_entity(main_thread);\r\n              e->arch    = main_thread->arch;\r\n              e->code    = main_thread->id;\r\n            }\r\n          }\r\n          \r\n          // make main module & push load module event\r\n          {\r\n            U64              base_vaddr = (auxv.phdr & ~(auxv.pagesz-1));\r\n            U64              rebase     = exe_ehdr.e_type == ELF_Type_Dyn ? base_vaddr : 0;\r\n            DMN_LNX_PhdrInfo phdr_info  = dmn_lnx_phdr_info_from_memory(memory_fd, exe_ehdr.e_ident[ELF_Identifier_Class], rebase, auxv.phdr, auxv.phent, auxv.phnum);\r\n            \r\n            DMN_LNX_Entity *module = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Module);\r\n            module->id         = auxv.execfn;\r\n            module->base_vaddr = base_vaddr;\r\n            \r\n            DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);\r\n            e->kind             = DMN_EventKind_LoadModule;\r\n            e->process          = dmn_lnx_handle_from_entity(process);\r\n            e->thread           = dmn_lnx_handle_from_entity(main_thread);\r\n            e->module           = dmn_lnx_handle_from_entity(module);\r\n            e->arch             = process->arch;\r\n            e->address          = base_vaddr;\r\n            e->size             = dim_1u64(phdr_info.range);\r\n            e->string           = dmn_lnx_read_string(dmn_lnx_state->deferred_events_arena, process->fd, auxv.execfn);\r\n            e->elf_phdr_vrange  = r1u64(auxv.phdr, auxv.phdr + auxv.phent * auxv.phnum);\r\n            e->elf_phdr_entsize = auxv.phent;\r\n            \r\n            hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, 0, module);\r\n            hash_table_push_u64_raw(process->arena, process->loaded_modules_ht, base_vaddr, module);\r\n          }\r\n          \r\n          // rjf: handshake event\r\n          {\r\n            DMN_Event *e = dmn_event_list_push(dmn_lnx_state->deferred_events_arena, &dmn_lnx_state->deferred_events);\r\n            e->kind    = DMN_EventKind_HandshakeComplete;\r\n            e->process = dmn_lnx_handle_from_entity(process);\r\n            e->thread  = dmn_lnx_handle_from_entity(main_thread);\r\n            e->arch    = process->arch;\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n    \r\n    //- rjf: error case\r\n    goto success;\r\n    error:;\r\n    {\r\n      if(error__need_child_kill)\r\n      {\r\n        // TODO(rjf)\r\n      }\r\n    }\r\n    \r\n    //- rjf: success\r\n    success:;\r\n    \r\n    // clean up pipes\r\n    close(pipe_fds[0]);\r\n    close(pipe_fds[1]);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\ndmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\ndmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code)\r\n{\r\n  B32 result = 0;\r\n  DMN_LNX_Entity *process_entity = dmn_lnx_entity_from_handle(process);\r\n  if(process_entity != &dmn_lnx_nil_entity &&\r\n     kill(process_entity->id, SIGKILL) != -1)\r\n  {\r\n    result = 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process)\r\n{\r\n  B32 result = 0;\r\n  DMN_LNX_Entity *process_entity = dmn_lnx_entity_from_handle(process);\r\n  if(process_entity != &dmn_lnx_nil_entity &&\r\n     ptrace(PTRACE_DETACH, process_entity->id, 0, 0) != -1)\r\n  {\r\n    result = 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ndmn_lnx_wait_for_events(Arena *arena, DMN_EventList *evts, pid_t tid, B32 wait_for_group_stop, DMN_ActiveTrap *active_traps)\r\n{\r\n  for(B32 done = 0; !done;)\r\n  {\r\n    //- rjf: wait for next event\r\n    int   status  = 0;\r\n    pid_t wait_id = waitpid(tid, &status, __WALL|__WNOTHREAD);\r\n    if(status == -1 && errno == EINTR) {continue;} // wait interrupted, try again\r\n    if(status == -1) {InvalidPath;} // TODO: graceful exit\r\n    \r\n    //- rjf: unpack event\r\n    int             wifexited              = WIFEXITED(status);\r\n    int             wifsignaled            = WIFSIGNALED(status);\r\n    int             wifstopped             = WIFSTOPPED(status);\r\n    int             wstopsig               = WSTOPSIG(status);\r\n    int             ptrace_event_code      = (status>>16);\r\n    DMN_LNX_Entity *thread                 = dmn_lnx_thread_from_pid(wait_id);\r\n    DMN_LNX_Entity *process                = thread->parent;\r\n    \r\n    //printf(\"waitpid - pid %d wifexited %d, wifsignaled %d, wifstopped %d, wstopsig %d\\n\", wait_id, wifexited, wifsignaled, wifstopped, wstopsig);\r\n    \r\n    // update thread registers\r\n    if(thread != &dmn_lnx_nil_entity)\r\n    {\r\n      if (!dmn_lnx_thread_read_reg_block(thread, thread->reg_block)) { Assert(0 && \"failed to update thread's registers\"); }\r\n    }\r\n    \r\n    DMN_EventKind  e_kind        = DMN_EventKind_Null;\r\n    U64            exit_code     = max_U64;\r\n    U64            address       = 0;\r\n    DMN_Trap      *hit_user_trap = 0;\r\n    pid_t          new_pid       = 0;\r\n    B32            is_group_stop = 0;\r\n    \r\n    //- rjf: WIFEXITED(status) -> thread exit\r\n    if(wifexited)\r\n    {\r\n      e_kind = DMN_EventKind_ExitThread;\r\n    }\r\n    \r\n    //- rjf: WIFEXITED(status) -> thread exit w/ exit code\r\n    else if(wifsignaled)\r\n    {\r\n      e_kind    = DMN_EventKind_ExitThread;\r\n      exit_code = WTERMSIG(status);\r\n    }\r\n    \r\n    //- rjf: SIGTRAP:PTRACE_EVENT_EXIT\r\n    else if(wifstopped && wstopsig == SIGTRAP && ptrace_event_code == PTRACE_EVENT_EXIT)\r\n    {\r\n      // TODO(rjf): verify\r\n      e_kind = DMN_EventKind_ExitThread;\r\n    }\r\n    \r\n    //- rjf: SIGTRAP:PTRACE_EVENT_CLONE\r\n    else if(wifstopped && (status >> 8) == (SIGTRAP | PTRACE_EVENT_CLONE << 8))\r\n    {\r\n      if(ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid) >= 0)\r\n      {\r\n        e_kind = DMN_EventKind_CreateThread;\r\n      }\r\n      else { Assert(0 && \"failed to get new tid\"); }\r\n    }\r\n    \r\n    //- rjf: SIGTRAP:PTRACE_EVENT_FORK, or SIGTRAP:PTRACE_EVENT_VFORK\r\n    else if(wifstopped && wstopsig == SIGTRAP &&\r\n            (ptrace_event_code == PTRACE_EVENT_FORK ||\r\n             ptrace_event_code == PTRACE_EVENT_VFORK))\r\n    {\r\n    }\r\n    \r\n    // group stop\r\n    else if(wifstopped && wstopsig == SIGTRAP && status >> 16 == PTRACE_EVENT_STOP)\r\n    {\r\n      is_group_stop = 1;\r\n    }\r\n    \r\n    //- rjf: SIGTRAP\r\n    else if(wifstopped && wstopsig == SIGTRAP)\r\n    {\r\n      // translate signal code to DEMON event kind\r\n      siginfo_t siginfo = {0};\r\n      if(ptrace(PTRACE_GETSIGINFO, wait_id, 0, &siginfo) < 0) { Assert(0 && \"failed to get signal info\"); }\r\n      \r\n      switch(siginfo.si_code)\r\n      {\r\n        case DMN_LNX_SigTrapCode_Brkpt:\r\n        {\r\n          e_kind = DMN_EventKind_Breakpoint;\r\n        }break;\r\n        case DMN_LNX_SigTrapCode_Trace:\r\n        {\r\n          e_kind = DMN_EventKind_SingleStep;\r\n        }break;\r\n        case DMN_LNX_SigTrapCode_HwBkpt:\r\n        {\r\n          if(thread->arch == Arch_Null) { } \r\n          else if(thread->arch == Arch_x64)\r\n          {\r\n            REGS_RegBlockX64 *regs_x64 = thread->reg_block;\r\n            if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B0)\r\n            {\r\n              address = regs_x64->dr0.u64;\r\n              e_kind = DMN_EventKind_Breakpoint;\r\n            }\r\n            else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B1)\r\n            {\r\n              address = regs_x64->dr1.u64;\r\n              e_kind = DMN_EventKind_Breakpoint;\r\n            }\r\n            else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B2)\r\n            {\r\n              address = regs_x64->dr2.u64;\r\n              e_kind = DMN_EventKind_Breakpoint;\r\n            }\r\n            else if(regs_x64->dr6.u64 & X64_DebugStatusFlag_B3)\r\n            {\r\n              address = regs_x64->dr3.u64;\r\n              e_kind = DMN_EventKind_Breakpoint;\r\n            }\r\n          }\r\n          else\r\n          {\r\n            NotImplemented;\r\n          }\r\n        }break;\r\n        case SI_KERNEL:\r\n        {\r\n          e_kind = DMN_EventKind_Breakpoint;\r\n        }break;\r\n        case DMN_LNX_SigTrapCode_Unk:  {NotImplemented;}break;\r\n        case DMN_LNX_SigTrapCode_Perf: {NotImplemented;}break;\r\n        default: {InvalidPath;} break;\r\n      }\r\n    }\r\n    \r\n    //- rjf: WSTOPSIG(status) is SIGSTOP\r\n    else if(wifstopped && wstopsig == SIGSTOP)\r\n    {\r\n      //\r\n      // TODO(rjf): how do we tell the following apart?:\r\n      // - SIGSTOP All-Stop\r\n      // - SIGSTOP Halt\r\n      // - SIGSTOP \"User\"\r\n      //\r\n      // we are currently just assuming that, if we've queried a SIGSTOP to halt, then\r\n      // the first one that comes back is our \"dummy\" sigstop. this is likely not\r\n      // necessarily true.\r\n      //\r\n      if(thread->expecting_dummy_sigstop)\r\n      {\r\n        thread->expecting_dummy_sigstop = 0;\r\n        done = 0;\r\n      }\r\n      else if(dmn_lnx_state->has_halt_injection)\r\n      {\r\n        e_kind = DMN_EventKind_Halt;\r\n      }\r\n      else\r\n      {\r\n        // TODO(rjf): study this case; old notes:\r\n        //\r\n        // a signal we don't want to mess with (except to record that it\r\n        // happened maybe) we should \"hand it back\"\r\n      }\r\n    }\r\n    \r\n    //- rjf: WSTOPSIG(status) is an unrecoverable exception (unless user does something to fix state first)\r\n    else if(wifstopped)\r\n    {\r\n      e_kind = DMN_EventKind_Exception;\r\n    }\r\n    else\r\n    {\r\n      Assert(0 && \"unexpected stop code\");\r\n    }\r\n    \r\n    dmn_lnx_state->last_event_kind = e_kind;\r\n    dmn_lnx_state->last_stop_pid   = wait_id;\r\n    dmn_lnx_state->last_sig_code   = wstopsig;\r\n    \r\n    if(wait_for_group_stop)\r\n    {\r\n      if(is_group_stop)\r\n      {\r\n        done = 1;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      done = 1;\r\n    }\r\n    \r\n    if(e_kind == DMN_EventKind_Breakpoint)\r\n    {\r\n      U64 ip = dmn_lnx_thread_read_ip(thread);\r\n      for EachNode(active_trap, DMN_ActiveTrap, active_traps)\r\n      {\r\n        if(active_trap->trap->vaddr == ip-1)\r\n        {\r\n          hit_user_trap = active_trap->trap;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // is this a probe trap?\r\n    if(e_kind == DMN_EventKind_Breakpoint)\r\n    {\r\n      // find which probe was triggered\r\n      U64 ip = dmn_lnx_thread_read_ip(thread);\r\n      DMN_LNX_ProbeType probe_type = DMN_LNX_ProbeType_Null;\r\n      for EachIndex(i, ArrayCount(process->probe_vaddrs))\r\n      {\r\n        if(process->probe_vaddrs[i] == ip-1)\r\n        {\r\n          probe_type = i;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      if(probe_type == DMN_LNX_ProbeType_InitComplete)\r\n      {\r\n        U64 name_space_id = 0, rdebug_addr = 0;\r\n        DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_InitComplete];\r\n        if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id))\r\n        {\r\n          if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_addr))\r\n          {\r\n            GNU_RDebugInfo64 rdebug = {0};\r\n            if(dmn_lnx_read_r_debug(process->fd, rdebug_addr, process->arch, &rdebug))\r\n            {\r\n              if(rdebug.r_version == 1)\r\n              {\r\n                dmn_lnx_process_loaded_modules(arena, evts, process, name_space_id, rdebug.r_map);\r\n              }\r\n              else { Assert(0 && \"unexpected version number\"); }\r\n            }\r\n            else { Assert(0 && \"failed to read rdebug\"); }\r\n          }\r\n          else { Assert(0 && \"failed to parse second argument\"); }\r\n        }\r\n        else { Assert(0 && \"failed to parse first argument\"); }\r\n      }\r\n      else if(probe_type == DMN_LNX_ProbeType_RelocComplete)\r\n      {\r\n        U64 name_space_id = 0, new_link_map_addr = 0;\r\n        DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_RelocComplete];\r\n        if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id))\r\n        {\r\n          if(stap_read_arg_u(probe->args.v[2], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &new_link_map_addr))\r\n          {\r\n            dmn_lnx_process_loaded_modules(arena, evts, process, name_space_id, new_link_map_addr);\r\n          }\r\n          else { Assert(0 && \"failed to parse third argument\"); }\r\n        }\r\n        else { Assert(0 && \"failed to parse first argument\"); }\r\n      }\r\n      else if(probe_type == DMN_LNX_ProbeType_UnmapComplete)\r\n      {\r\n        // read probe's arguments\r\n        U64 name_space_id = 0, rdebug_vaddr = 0;\r\n        DMN_LNX_Probe *probe = process->probes[DMN_LNX_ProbeType_UnmapComplete];\r\n        if(stap_read_arg_u(probe->args.v[0], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &name_space_id))\r\n        {\r\n          if(stap_read_arg_u(probe->args.v[1], process->arch, thread->reg_block, dmn_lnx_stap_memory_read, process, &rdebug_vaddr))\r\n          {\r\n            dmn_lnx_process_unloaded_modules(arena, evts, process, name_space_id, rdebug_vaddr);\r\n          }\r\n          else { Assert(0 && \"failed to read second argument\"); }\r\n        }\r\n        else { Assert(0 && \"failed to read first argument\"); }\r\n      }\r\n      \r\n      if(probe_type != DMN_LNX_ProbeType_Null) {break;}\r\n    }\r\n    \r\n    // rollback IP on user traps\r\n    if(hit_user_trap)\r\n    {\r\n      U64 ip = dmn_lnx_thread_read_ip(thread);\r\n      dmn_lnx_thread_write_ip(thread, ip - 1);\r\n    }\r\n    \r\n    switch(e_kind)\r\n    {\r\n      case DMN_EventKind_COUNT:\r\n      case DMN_EventKind_Null: break;\r\n      case DMN_EventKind_Error:\r\n      case DMN_EventKind_HandshakeComplete:\r\n      case DMN_EventKind_LoadModule:\r\n      case DMN_EventKind_UnloadModule:\r\n      {InvalidPath;}break;\r\n      case DMN_EventKind_Trap:\r\n      case DMN_EventKind_Memory:\r\n      case DMN_EventKind_SetThreadName:\r\n      case DMN_EventKind_SetThreadColor:\r\n      case DMN_EventKind_SetBreakpoint:\r\n      case DMN_EventKind_UnsetBreakpoint:\r\n      case DMN_EventKind_SetVAddrRangeNote:\r\n      case DMN_EventKind_DebugString:\r\n      {\r\n        NotImplemented;\r\n      }break;\r\n      case DMN_EventKind_SingleStep:\r\n      {\r\n        // clear single step flag\r\n        dmn_lnx_set_single_step_flag(thread, 0);\r\n        \r\n        DMN_Event *e = dmn_event_list_push(arena, evts);\r\n        e->kind                = e_kind;\r\n        e->process             = dmn_lnx_handle_from_entity(process);\r\n        e->thread              = dmn_lnx_handle_from_entity(thread);\r\n        e->instruction_pointer = dmn_lnx_thread_read_ip(thread);\r\n      }break;\r\n      case DMN_EventKind_Breakpoint:\r\n      {\r\n        DMN_Event *e = dmn_event_list_push(arena, evts);\r\n        e->kind                = e_kind;\r\n        e->process             = dmn_lnx_handle_from_entity(process);\r\n        e->thread              = dmn_lnx_handle_from_entity(thread);\r\n        e->instruction_pointer = dmn_lnx_thread_read_ip(thread);\r\n      }break;\r\n      case DMN_EventKind_Halt:\r\n      {\r\n        DMN_Event *e = dmn_event_list_push(arena, evts);\r\n        e->kind    = DMN_EventKind_Halt;\r\n        e->process = dmn_lnx_handle_from_entity(process);\r\n        e->thread  = dmn_lnx_handle_from_entity(thread);\r\n      }break;\r\n      case DMN_EventKind_Exception:\r\n      {\r\n        // TODO(rjf): possible cases:\r\n        // SIGABRT\r\n        // SIGFPE\r\n        // SIGSEGV\r\n        // SIGILL\r\n        DMN_Event *e = dmn_event_list_push(arena, evts);\r\n        e->kind                = DMN_EventKind_Exception;\r\n        e->process             = dmn_lnx_handle_from_entity(process);\r\n        e->thread              = dmn_lnx_handle_from_entity(thread);\r\n        e->instruction_pointer = dmn_lnx_thread_read_ip(thread);\r\n        e->signo               = wstopsig;\r\n      }break;\r\n      case DMN_EventKind_CreateProcess:\r\n      {\r\n        NotImplemented;\r\n      }break;\r\n      case DMN_EventKind_ExitProcess:\r\n      {\r\n        // rjf: generate exit-thread / unload-module events\r\n        for(DMN_LNX_Entity *child = process->first; child != &dmn_lnx_nil_entity; child = child->next)\r\n        {\r\n          switch(child->kind)\r\n          {\r\n            default:{}break;\r\n            case DMN_LNX_EntityKind_Thread:\r\n            {\r\n              DMN_Event *e = dmn_event_list_push(arena, evts);\r\n              e->kind    = DMN_EventKind_ExitThread;\r\n              e->process = dmn_lnx_handle_from_entity(process);\r\n              e->thread  = dmn_lnx_handle_from_entity(child);\r\n            }break;\r\n            case DMN_LNX_EntityKind_Module:\r\n            {\r\n              DMN_Event *e = dmn_event_list_push(arena, evts);\r\n              e->kind    = DMN_EventKind_UnloadModule;\r\n              e->process = dmn_lnx_handle_from_entity(process);\r\n              e->module  = dmn_lnx_handle_from_entity(child);\r\n              // TODO(rjf): e->string = ...;\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        // rjf: generate exit process event\r\n        {\r\n          DMN_Event *e = dmn_event_list_push(arena, evts);\r\n          e->kind    = DMN_EventKind_ExitProcess;\r\n          e->process = dmn_lnx_handle_from_entity(process);\r\n          e->code    = exit_code;\r\n        }\r\n        \r\n        // rjf: eliminate entity tree\r\n        dmn_lnx_entity_release(process);\r\n      }break;\r\n      case DMN_EventKind_CreateThread:\r\n      {\r\n        DMN_LNX_Entity *thread = dmn_lnx_entity_alloc(process, DMN_LNX_EntityKind_Thread);\r\n        thread->id        = new_pid;\r\n        thread->arch      = process->arch;\r\n        thread->reg_block = push_array(process->arena, U8, regs_block_size_from_arch(process->arch));\r\n        dmn_lnx_thread_read_reg_block(thread, thread->reg_block);\r\n        \r\n        DMN_Event *e = dmn_event_list_push(arena, evts);\r\n        e->kind    = DMN_EventKind_CreateThread;\r\n        e->process = dmn_lnx_handle_from_entity(process);\r\n        e->thread  = dmn_lnx_handle_from_entity(thread);\r\n        e->arch    = thread->arch;\r\n        e->code    = thread->id;\r\n      }break;\r\n      case DMN_EventKind_ExitThread:\r\n      {\r\n        DMN_Event *e = dmn_event_list_push(arena, evts);\r\n        e->kind    = DMN_EventKind_ExitThread;\r\n        e->process = dmn_lnx_handle_from_entity(process);\r\n        e->thread  = dmn_lnx_handle_from_entity(thread);\r\n        dmn_lnx_entity_release(thread);\r\n      }break;\r\n    }\r\n  }\r\n}\r\n\r\ninternal DMN_EventList\r\ndmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DMN_EventList evts = {0};\r\n  \r\n  ////////////////////////////\r\n  //- rjf: push any deferred events\r\n  //\r\n  {\r\n    for EachNode(n, DMN_EventNode, dmn_lnx_state->deferred_events.first)\r\n    {\r\n      DMN_Event *e_src = &n->v;\r\n      DMN_Event *e_dst = dmn_event_list_push(arena, &evts);\r\n      MemoryCopyStruct(e_dst, e_src);\r\n      e_dst->string = str8_copy(arena, e_dst->string);\r\n    }\r\n    MemoryZeroStruct(&dmn_lnx_state->deferred_events);\r\n    arena_clear(dmn_lnx_state->deferred_events_arena);\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: no processes, no output events -> not attached\r\n  //\r\n  if(evts.count == 0 && dmn_lnx_state->entities_base->first == &dmn_lnx_nil_entity)\r\n  {\r\n    DMN_Event *e = dmn_event_list_push(arena, &evts);\r\n    e->kind       = DMN_EventKind_Error;\r\n    e->error_kind = DMN_ErrorKind_NotAttached;\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: determine if we need to wait for new events\r\n  //\r\n  B32 need_wait_on_events = (evts.count == 0);\r\n  \r\n  ////////////////////////////\r\n  //- rjf: write all traps into memory\r\n  //\r\n  DMN_ActiveTrap *active_trap_first = 0, *active_trap_last = 0;\r\n  ProfScope(\"write all traps into memory\")\r\n  {\r\n    HashTable *ht = hash_table_init(scratch.arena, ctrls->traps.trap_count);\r\n    for EachNode(n, DMN_TrapChunkNode, ctrls->traps.first)\r\n    {\r\n      for EachIndex(n_idx, n->count)\r\n      {\r\n        DMN_Trap *trap = n->v+n_idx;\r\n        \r\n        if(trap->flags == 0)\r\n        {\r\n          DMN_ActiveTrap *is_set = hash_table_search_u64_raw(ht, trap->vaddr);\r\n          if(is_set) { continue; }\r\n          \r\n          U8 swap_byte = 0;\r\n          if(dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &swap_byte) > 0)\r\n          {\r\n            U8 int3 = 0xCC;\r\n            if(dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3))\r\n            {\r\n              DMN_ActiveTrap *active_trap = push_array(scratch.arena, DMN_ActiveTrap, 1);\r\n              active_trap->trap      = trap;\r\n              active_trap->swap_byte = swap_byte;\r\n              SLLQueuePush(active_trap_first, active_trap_last, active_trap);\r\n              \r\n              hash_table_push_u64_raw(scratch.arena, ht, trap->vaddr, active_trap);\r\n            } else { Assert(0 && \"failed to write trap\"); }\r\n          } else { Assert(0 && \"failed to read original byte\"); }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- enable single stepping\r\n  if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero()))\r\n  {\r\n    DMN_LNX_Entity *single_step_thread = dmn_lnx_entity_from_handle(ctrls->single_step_thread);\r\n    dmn_lnx_set_single_step_flag(single_step_thread, 1);\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: gather all threads which we should run\r\n  //\r\n  DMN_LNX_EntityList run_threads = {0};\r\n  if(need_wait_on_events) ProfScope(\"gather all threads which we should run\")\r\n  {\r\n    //- rjf: scan all processes\r\n    for(DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first; process != &dmn_lnx_nil_entity; process = process->next)\r\n    {\r\n      if(process->kind != DMN_LNX_EntityKind_Process) { continue; }\r\n      \r\n      //- rjf: determine if this process is frozen\r\n      B32 process_is_frozen = 0;\r\n      if(ctrls->run_entities_are_processes)\r\n      {\r\n        for EachIndex(idx, ctrls->run_entity_count)\r\n        {\r\n          if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(process)))\r\n          {\r\n            process_is_frozen = 1;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: scan all threads in this process\r\n      for(DMN_LNX_Entity *thread = process->first; thread != &dmn_lnx_nil_entity; thread = thread->next)\r\n      {\r\n        if(thread->kind != DMN_LNX_EntityKind_Thread) { continue; }\r\n        \r\n        //- rjf: determine if this thread is frozen\r\n        B32 is_frozen = 0;\r\n        {\r\n          // rjf: single-step? freeze if not the single-step thread.\r\n          if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread))\r\n          {\r\n            is_frozen = !dmn_handle_match(dmn_lnx_handle_from_entity(thread), ctrls->single_step_thread);\r\n          }\r\n          \r\n          // rjf: not single-stepping? determine based on run controls freezing info\r\n          else\r\n          {\r\n            if(ctrls->run_entities_are_processes)\r\n            {\r\n              is_frozen = process_is_frozen;\r\n            }\r\n            else \r\n            {\r\n              for EachIndex(idx, ctrls->run_entity_count)\r\n              {\r\n                if(dmn_handle_match(ctrls->run_entities[idx], dmn_lnx_handle_from_entity(thread)))\r\n                {\r\n                  is_frozen = 1;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            if(ctrls->run_entities_are_unfrozen)\r\n            {\r\n              is_frozen ^= 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: add to list\r\n        if(!is_frozen)\r\n        {\r\n          dmn_lnx_entity_list_push(scratch.arena, &run_threads, thread);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: resume all threads we need to run\r\n  //\r\n  DMN_LNX_EntityList ran_threads = {0};\r\n  for EachNode(n, DMN_LNX_EntityNode, run_threads.first)\r\n  {\r\n    DMN_LNX_Entity *thread = n->v;\r\n    \r\n    // update registers\r\n    if(!dmn_lnx_thread_write_reg_block(thread, thread->reg_block)) { Assert(0 && \"failed to write thread's registers\"); }\r\n    \r\n    // pass signal to the child process\r\n    void *sig_code = 0;\r\n    if(dmn_lnx_state->last_event_kind == DMN_EventKind_Exception && dmn_lnx_state->last_stop_pid == thread->id)\r\n    {\r\n      sig_code = (void *)(uintptr_t)dmn_lnx_state->last_sig_code;\r\n    }\r\n    \r\n    // resume thread\r\n    if (ptrace(PTRACE_CONT, (pid_t)thread->id, 0, (void *)sig_code) < 0) { Assert(0 && \"failed to resume a thread\"); }\r\n    \r\n    dmn_lnx_entity_list_push(scratch.arena, &ran_threads, thread);\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: loop: wait for next stop, produce debug events\r\n  //\r\n  if(need_wait_on_events)\r\n  {\r\n    dmn_lnx_wait_for_events(arena, &evts, -1, 0, active_trap_first);\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: stop all threads\r\n  //\r\n  {\r\n    B32 was_interrupt_issued = 0;\r\n    for EachNode(n, DMN_LNX_EntityNode, ran_threads.first)\r\n    {\r\n      if(n->v->id != dmn_lnx_state->last_stop_pid)\r\n      {\r\n        if(ptrace(PTRACE_INTERRUPT, n->v->id, 0, 0) >= 0)\r\n        {\r\n          was_interrupt_issued = 1;\r\n        }\r\n        else { Assert(0 && \"failed to interrupt thread\"); }\r\n      }\r\n    }\r\n    if(was_interrupt_issued)\r\n    {\r\n      dmn_lnx_wait_for_events(arena, &evts, -1, 1, active_trap_first);\r\n    }\r\n  }\r\n  \r\n  // update registers\r\n  for EachNode(n, DMN_LNX_EntityNode, ran_threads.first)\r\n  {\r\n    dmn_lnx_thread_read_reg_block(n->v, n->v->reg_block);\r\n  }\r\n  \r\n  //////////////////////////\r\n  //- rjf: restore original memory at trap locations\r\n  //\r\n  ProfScope(\"restore original memory at trap locations\")\r\n  {\r\n    for EachNode(active_trap, DMN_ActiveTrap, active_trap_first)\r\n    {\r\n      if(!dmn_process_write_struct(active_trap->trap->process, active_trap->trap->vaddr, &active_trap->swap_byte))\r\n      {\r\n        Assert(0 && \"failed to restore original memory\");\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return evts;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS)\r\n\r\ninternal void\r\ndmn_halt(U64 code, U64 user_data)\r\n{\r\n  if(!dmn_lnx_state->has_halt_injection)\r\n  {\r\n    DMN_LNX_Entity *process = dmn_lnx_state->entities_base->first;\r\n    if(process != &dmn_lnx_nil_entity)\r\n    {\r\n      union sigval sv = {0};\r\n      if(sigqueue(process->id, SIGSTOP, sv) != -1)\r\n      {\r\n        dmn_lnx_state->has_halt_injection = 1;\r\n        dmn_lnx_state->halt_code          = code;\r\n        dmn_lnx_state->halt_user_data     = user_data;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS)\r\n\r\n//- rjf: non-blocking-control-thread access barriers\r\n\r\ninternal B32\r\ndmn_access_open(void)\r\n{\r\n  B32 result = 0;\r\n  if(dmn_lnx_ctrl_thread)\r\n  {\r\n    result = 1;\r\n  }\r\n  else\r\n  {\r\n    mutex_take(dmn_lnx_state->access_mutex);\r\n    result = !dmn_lnx_state->access_run_state;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ndmn_access_close(void)\r\n{\r\n  if(!dmn_lnx_ctrl_thread)\r\n  {\r\n    mutex_drop(dmn_lnx_state->access_mutex);\r\n  }\r\n}\r\n\r\n//- rjf: processes\r\n\r\ninternal U64\r\ndmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags)\r\n{\r\n}\r\n\r\ninternal U64\r\ndmn_process_read(DMN_Handle process, Rng1U64 range, void *dst)\r\n{\r\n  DMN_LNX_Entity *entity = dmn_lnx_entity_from_handle(process);\r\n  U64 result = dmn_lnx_read(entity->fd, range, dst);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_process_write(DMN_Handle process, Rng1U64 range, void *src)\r\n{\r\n  DMN_LNX_Entity *entity = dmn_lnx_entity_from_handle(process);\r\n  B32 result = dmn_lnx_write(entity->fd, range, src);\r\n  return result;\r\n}\r\n\r\n//- rjf: threads\r\n\r\ninternal Arch\r\ndmn_arch_from_thread(DMN_Handle handle)\r\n{\r\n  DMN_LNX_Entity *thread = dmn_lnx_entity_from_handle(handle);\r\n  return thread->arch;\r\n}\r\n\r\ninternal U64\r\ndmn_stack_base_vaddr_from_thread(DMN_Handle handle)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\ndmn_tls_root_vaddr_from_thread(DMN_Handle handle)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\ndmn_thread_read_reg_block(DMN_Handle handle, void *reg_block)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_LNX_Entity *thread         = dmn_lnx_entity_from_handle(handle);\r\n    U64             reg_block_size = regs_block_size_from_arch(thread->arch);\r\n    if(thread == &dmn_lnx_nil_entity)\r\n    {\r\n      MemoryZero(reg_block, reg_block_size);\r\n    }\r\n    else\r\n    {\r\n      MemoryCopy(reg_block, thread->reg_block, reg_block_size);\r\n    }\r\n    result = 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_thread_write_reg_block(DMN_Handle handle, void *reg_block)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_LNX_Entity *thread         = dmn_lnx_entity_from_handle(handle);\r\n    U64             reg_block_size = regs_block_size_from_arch(thread->arch);\r\n    if(thread == &dmn_lnx_nil_entity)\r\n    {\r\n      MemoryZero(reg_block, reg_block_size);\r\n    }\r\n    else\r\n    {\r\n      MemoryCopy(thread->reg_block, reg_block, reg_block_size);\r\n    }\r\n    result = 1;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: system process listing\r\n\r\ninternal void\r\ndmn_process_iter_begin(DMN_ProcessIter *iter)\r\n{\r\n  DIR *dir = opendir(\"/proc\");\r\n  MemoryZeroStruct(iter);\r\n  iter->v[0] = IntFromPtr(dir);\r\n}\r\n\r\ninternal B32\r\ndmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out)\r\n{\r\n  // rjf: scan for the next process ID in the directory\r\n  B32 got_pid = 0;\r\n  String8 pid_string = {0};\r\n  {\r\n    DIR *dir = (DIR*)PtrFromInt(iter->v[0]);\r\n    if(dir != 0 && iter->v[1] == 0)\r\n    {\r\n      for(;;)\r\n      {\r\n        // rjf: get next entry\r\n        struct dirent *d = readdir(dir);\r\n        if(d == 0)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: check file name is integer\r\n        String8 file_name = str8_cstring((char*)d->d_name);\r\n        B32 is_integer = str8_is_integer(file_name, 10);\r\n        \r\n        // rjf: break on integers (which represent processes)\r\n        if(is_integer)\r\n        {\r\n          got_pid = 1;\r\n          pid_string = file_name;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: if we found a process id, map id => info\r\n  B32 result = 0;\r\n  if(got_pid)\r\n  {\r\n    pid_t pid = u64_from_str8(pid_string, 10);\r\n    String8 name = dmn_lnx_exe_path_from_pid(arena, pid);\r\n    if(name.size == 0)\r\n    {\r\n      name = str8_lit(\"(unknown process)\");\r\n    }\r\n    info_out->name = name;\r\n    info_out->pid = pid;\r\n    result = 1;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal void\r\ndmn_process_iter_end(DMN_ProcessIter *iter)\r\n{\r\n  DIR *dir = (DIR*)PtrFromInt(iter->v[0]);\r\n  if(dir != 0)\r\n  {\r\n    closedir(dir);\r\n  }\r\n  MemoryZeroStruct(iter);\r\n}\r\n"
  },
  {
    "path": "src/demon/linux/demon_core_linux.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DEMON_CORE_LINUX_H\r\n#define DEMON_CORE_LINUX_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n#include <sys/ptrace.h>\r\n#include <sys/uio.h>\r\n#include <elf.h>\r\n\r\n////////////////////////////////\r\n//~ SIGTRAP codes\r\n\r\nenum\r\n{\r\n  DMN_LNX_SigTrapCode_Brkpt  = 1,\r\n  DMN_LNX_SigTrapCode_Trace  = 2,\r\n  DMN_LNX_SigTrapCode_Branch = 3,\r\n  DMN_LNX_SigTrapCode_HwBkpt = 4,\r\n  DMN_LNX_SigTrapCode_Unk    = 5,\r\n  DMN_LNX_SigTrapCode_Perf   = 6\r\n} DMN_LNX_SigTrapCode;\r\n\r\n////////////////////////////////\r\n//~ rjf: Register Layouts\r\n//\r\n// These are defined in <sys/user.h>, but only for one architecture at a time\r\n\r\ntypedef struct DMN_LNX_UserX64 DMN_LNX_UserX64;\r\nstruct DMN_LNX_UserX64\r\n{\r\n  struct\r\n  {\r\n    U64 r15;\r\n    U64 r14;\r\n    U64 r13;\r\n    U64 r12;\r\n    U64 rbp;\r\n    U64 rbx;\r\n    U64 r11;\r\n    U64 r10;\r\n    U64 r9;\r\n    U64 r8;\r\n    U64 rax;\r\n    U64 rcx;\r\n    U64 rdx;\r\n    U64 rsi;\r\n    U64 rdi;\r\n    U64 orig_rax;\r\n    U64 rip;\r\n    U64 cs;\r\n    U64 rflags;\r\n    U64 rsp;\r\n    U64 ss;\r\n    U64 fsbase;\r\n    U64 gsbase;\r\n    U64 ds;\r\n    U64 es;\r\n    U64 fs;\r\n    U64 gs;\r\n  } regs;\r\n  S32 u_fpvalid, _pad0;\r\n  X64_FXSave i387;\r\n  U64 u_tsize, u_dsize, u_ssize, start_code, start_stack;\r\n  U64 signal;\r\n  S32 reserved, _pad1;\r\n  U64 u_ar0, u_fpstate;\r\n  U64 magic;\r\n  U8  u_comm[32];\r\n  U64 u_debugreg[8];\r\n};\r\nStaticAssert(sizeof(DMN_LNX_UserX64) == 912, g_dmn_lnx_user_x64_size_check);\r\n\r\n////////////////////////////////\r\n//~ SDT Probes\r\n\r\ntypedef struct DMN_LNX_Probe DMN_LNX_Probe;\r\nstruct DMN_LNX_Probe\r\n{\r\n  String8       provider;\r\n  String8       name;\r\n  String8       args_string;\r\n  STAP_ArgArray args;\r\n  U64           pc;\r\n  U64           semaphore;\r\n};\r\n\r\ntypedef struct DMN_LNX_ProbeNode DMN_LNX_ProbeNode;\r\nstruct DMN_LNX_ProbeNode\r\n{\r\n  DMN_LNX_Probe v;\r\n  DMN_LNX_ProbeNode *next;\r\n};\r\n\r\ntypedef struct DMN_LNX_ProbeList DMN_LNX_ProbeList;\r\nstruct DMN_LNX_ProbeList\r\n{\r\n  U64                count;\r\n  DMN_LNX_ProbeNode *first;\r\n  DMN_LNX_ProbeNode *last;\r\n};\r\n\r\n#define DMN_LNX_Probe_XList             \\\r\n  X(InitStart,     2, \"init_start\")     \\\r\n  X(InitComplete,  2, \"init_complete\")  \\\r\n  X(RelocStart,    2, \"reloc_start\")    \\\r\n  X(RelocComplete, 3, \"reloc_complete\") \\\r\n  X(MapStart,      2, \"map_start\")      \\\r\n  X(MapComplete,   3, \"map_complete\")   \\\r\n  X(UnmapStart,    2, \"unmap_start\")    \\\r\n  X(UnmapComplete, 2, \"unmap_complete\") \\\r\n  X(LongJmp,       3, \"longjmp\")        \\\r\n  X(LongJmpTarget, 3, \"longjmp_target\") \\\r\n  X(SetJmp,        3, \"setjmp\")\r\n\r\ntypedef enum\r\n{\r\n  DMN_LNX_ProbeType_Null,\r\n#define X(_N,...) DMN_LNX_ProbeType_##_N,\r\n  DMN_LNX_Probe_XList\r\n#undef X\r\n  DMN_LNX_ProbeType_Count,\r\n} DMN_LNX_ProbeType;\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Info Extraction Types\r\n\r\ntypedef struct DMN_LNX_ProcessAuxv DMN_LNX_ProcessAuxv;\r\nstruct DMN_LNX_ProcessAuxv\r\n{\r\n  U64 base;\r\n  U64 phnum;\r\n  U64 phent;\r\n  U64 phdr;\r\n  U64 execfn;\r\n  U64 pagesz;\r\n};\r\n\r\ntypedef struct DMN_LNX_PhdrInfo DMN_LNX_PhdrInfo;\r\nstruct DMN_LNX_PhdrInfo\r\n{\r\n  Rng1U64 range;\r\n  U64 dynamic;\r\n};\r\n\r\ntypedef struct DMN_LNX_DynamicInfo DMN_LNX_DynamicInfo;\r\nstruct DMN_LNX_DynamicInfo\r\n{\r\n  U64 hash_vaddr;\r\n  U64 gnu_hash_vaddr;\r\n  U64 strtab_vaddr;\r\n  U64 strtab_size;\r\n  U64 symtab_vaddr;\r\n  U64 symtab_entry_size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Types\r\n\r\ntypedef enum DMN_LNX_EntityKind\r\n{\r\n  DMN_LNX_EntityKind_Null,\r\n  DMN_LNX_EntityKind_Root,\r\n  DMN_LNX_EntityKind_Process,\r\n  DMN_LNX_EntityKind_Thread,\r\n  DMN_LNX_EntityKind_Module,\r\n  DMN_LNX_EntityKind_COUNT\r\n}\r\nDMN_LNX_EntityKind;\r\n\r\ntypedef struct DMN_LNX_Entity DMN_LNX_Entity;\r\nstruct DMN_LNX_Entity\r\n{\r\n  DMN_LNX_Entity *first;\r\n  DMN_LNX_Entity *last;\r\n  DMN_LNX_Entity *next;\r\n  DMN_LNX_Entity *prev;\r\n  DMN_LNX_Entity *parent;\r\n  DMN_LNX_EntityKind kind;\r\n  U32 gen;\r\n  Arch arch;\r\n  U64 id;\r\n\r\n  // process\r\n  Arena *arena;\r\n  int fd;\r\n  pid_t tracer_tid;\r\n  B32 expect_rdebug_data_breakpoint;\r\n  U64 rdebug_vaddr;\r\n  U64 rdebug_brk_vaddr;\r\n  ELF_Class dl_class;\r\n  HashTable *loaded_modules_ht;\r\n  DMN_LNX_Probe **probes;\r\n  U64 probe_vaddrs[DMN_LNX_ProbeType_Count];\r\n\r\n  // process x64\r\n  U64 xcr0;\r\n  U64 xsave_size;\r\n  X64_XSaveLayout xsave_layout;\r\n\r\n  // thread\r\n  B32 expecting_dummy_sigstop;\r\n  void *reg_block;\r\n\r\n  // module\r\n  U64 base_vaddr;\r\n  U64 phvaddr;\r\n  U64 phentsize;\r\n  U64 phcount;\r\n  B8  is_live;\r\n};\r\n\r\ntypedef struct DMN_LNX_EntityNode DMN_LNX_EntityNode;\r\nstruct DMN_LNX_EntityNode\r\n{\r\n  DMN_LNX_EntityNode *next;\r\n  DMN_LNX_Entity *v;\r\n};\r\n\r\ntypedef struct DMN_LNX_EntityList DMN_LNX_EntityList;\r\nstruct DMN_LNX_EntityList\r\n{\r\n  U64 count;\r\n  DMN_LNX_EntityNode *first;\r\n  DMN_LNX_EntityNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Bundle\r\n\r\ntypedef struct DMN_LNX_State DMN_LNX_State;\r\nstruct DMN_LNX_State\r\n{\r\n  Arena *arena;\r\n  \r\n  // rjf: access locking mechanism\r\n  Mutex access_mutex;\r\n  B32 access_run_state;\r\n  \r\n  // rjf: deferred events\r\n  Arena *deferred_events_arena;\r\n  DMN_EventList deferred_events;\r\n  \r\n  // rjf: entity storage\r\n  Arena *entities_arena;\r\n  DMN_LNX_Entity *entities_base;\r\n  U64 entities_count;\r\n  DMN_LNX_Entity *free_entity;\r\n  \r\n  // rjf: halting mechanism\r\n  B32 has_halt_injection;\r\n  U64 halt_code;\r\n  U64 halt_user_data;\r\n\r\n  DMN_EventKind last_event_kind;\r\n  pid_t last_stop_pid;\r\n  int last_sig_code;\r\n};\r\n\r\nread_only global DMN_LNX_Entity dmn_lnx_nil_entity = {&dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity, &dmn_lnx_nil_entity};\r\nglobal DMN_LNX_State *dmn_lnx_state = 0;\r\nthread_static B32 dmn_lnx_ctrl_thread = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DMN_LNX_EntityNode * dmn_lnx_entity_list_push(Arena *arena, DMN_LNX_EntityList *list, DMN_LNX_Entity *v);\r\n\r\n//- rjf: file descriptor memory reading/writing helpers\r\ninternal U64 dmn_lnx_read(int memory_fd, Rng1U64 range, void *dst);\r\ninternal B32 dmn_lnx_write(int memory_fd, Rng1U64 range, void *src);\r\n#define dmn_lnx_read_struct(fd, vaddr, ptr) dmn_lnx_read((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))\r\n#define dmn_lnx_write_struct(fd, vaddr, ptr) dmn_lnx_write((fd), r1u64((vaddr), (vaddr)+sizeof(*(ptr))), (ptr))\r\ninternal String8 dmn_lnx_read_string_capped(Arena *arena, int memory_fd, U64 base_vaddr, U64 cap_size);\r\ninternal String8 dmn_lnx_read_string(Arena *arena, int memory_fd, U64 base_vaddr);\r\n\r\n////////////////////////////////\r\n//~ Runtime Struct Helpers\r\n\r\ninternal B32 dmn_lnx_read_ehdr(int memory_fd, U64 addr, ELF_Hdr64 *ehdr_out);\r\ninternal B32 dmn_lnx_read_phdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Phdr64 *phdr_out);\r\ninternal B32 dmn_lnx_read_shdr(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Shdr64 *shdr_out);\r\ninternal B32 dmn_lnx_read_linkmap(int memory_fd, U64 addr, ELF_Class elf_class, GNU_LinkMap64 *link_map_out);\r\ninternal B32 dmn_lnx_read_dynamic(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Dyn64 *dyn_out);\r\ninternal B32 dmn_lnx_read_symbol(int memory_fd, U64 addr, ELF_Class elf_class, ELF_Sym64 *symbol_out);\r\ninternal B32 dmn_lnx_read_r_debug(int memory_fd, U64 addr, Arch arch, GNU_RDebugInfo64 *rdebug_out);\r\n\r\n//- rjf: pid => info extraction\r\ninternal String8             dmn_lnx_exe_path_from_pid(Arena *arena, pid_t pid);\r\ninternal ELF_Hdr64           dmn_lnx_ehdr_from_pid(pid_t pid);\r\ninternal DMN_LNX_ProcessAuxv dmn_lnx_auxv_from_pid(pid_t pid, ELF_Class elf_class);\r\n\r\n//- ELF/GNU info from memory\r\ninternal DMN_LNX_PhdrInfo       dmn_lnx_phdr_info_from_memory(int memory_fd, ELF_Class elf_class, U64 rebase, U64 e_phaddr, U64 e_phentsize, U64 e_phnum);\r\ninternal DMN_LNX_DynamicInfo    dmn_lnx_dynamic_info_from_memory(int memory_fd, ELF_Class elf_Class, U64 rebase, U64 dynamic_vaddr);\r\ninternal U64                    dmn_lnx_rdebug_vaddr_from_memory(int memory_fd, U64 loader_vaddr);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Functions\r\n\r\ninternal DMN_LNX_Entity *dmn_lnx_entity_alloc(DMN_LNX_Entity *parent, DMN_LNX_EntityKind kind);\r\ninternal void            dmn_lnx_entity_release(DMN_LNX_Entity *entity);\r\ninternal DMN_Handle      dmn_lnx_handle_from_entity(DMN_LNX_Entity *entity);\r\ninternal DMN_LNX_Entity *dmn_lnx_entity_from_handle(DMN_Handle handle);\r\ninternal DMN_LNX_Entity *dmn_lnx_thread_from_pid(pid_t pid);\r\n\r\ninternal U64 dmn_lnx_thread_read_ip(DMN_LNX_Entity *thread);\r\ninternal U64 dmn_lnx_thread_read_sp(DMN_LNX_Entity *thread);\r\ninternal B32 dmn_lnx_thread_write_ip(DMN_LNX_Entity *thread, U64 ip);\r\ninternal B32 dmn_lnx_thread_write_sp(DMN_LNX_Entity *thread, U64 sp);\r\ninternal B32 dmn_lnx_thread_read_reg_block(DMN_LNX_Entity *thread, void *reg_block);\r\ninternal B32 dmn_lnx_thread_write_reg_block(DMN_LNX_Entity *thread, void *reg_block);\r\n\r\n////////////////////////////////\r\n\r\ninternal B32 dmn_lnx_set_single_step_flag(DMN_LNX_Entity *thread, B32 is_on);\r\n\r\n#endif // DEMON_CORE_LINUX_H\r\n"
  },
  {
    "path": "src/demon/linux/demon_os_linux.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n// TODO(allen): run controls: ignore_previous_exception\r\n\r\n////////////////////////////////\r\n//~ allen: Elf Parsing Code\r\n\r\n#include \"syms/syms_elf_inc.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal B32 demon_lnx_already_has_halt_injection = false;\r\nglobal U64 demon_lnx_halt_code = 0;\r\nglobal U64 demon_lnx_halt_user_data = 0;\r\n\r\nglobal B32 demon_lnx_new_process_pending = false;\r\n\r\nglobal Arena *demon_lnx_event_arena = 0;\r\nglobal DEMON_EventList demon_lnx_queued_events = {0};\r\n\r\nglobal U32 demon_lnx_ptrace_options = (PTRACE_O_TRACEEXIT|\r\n                                       PTRACE_O_EXITKILL|\r\n                                       PTRACE_O_TRACEFORK|\r\n                                       PTRACE_O_TRACEVFORK|\r\n                                       PTRACE_O_TRACECLONE);\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DEMON_LNX_ThreadExt*\r\ndemon_lnx_thread_ext(DEMON_Entity *entity){\r\n  DEMON_LNX_ThreadExt *result = (DEMON_LNX_ThreadExt*)&entity->ext;\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node){\r\n  B32 result = false;\r\n  \r\n  int attach_result = ptrace(PTRACE_ATTACH, pid, 0, 0);\r\n  if (attach_result == -1){\r\n    // TODO(allen): attach denied\r\n  }\r\n  else{\r\n    // return a new attachment node as soon as the ptrace exists. we use these nodes\r\n    // for cleanup on failure *and* for initializing on success. either way we need\r\n    // to see all new attachments whether or not they fully initialized correctly.\r\n    DEMON_LNX_AttachNode *proc_attachment = push_array_no_zero(arena, DEMON_LNX_AttachNode, 1);\r\n    proc_attachment->next = 0;\r\n    proc_attachment->pid = pid;\r\n    *new_node = proc_attachment;\r\n    \r\n    int status = 0;\r\n    pid_t wait_id = waitpid(pid, &status, __WALL);\r\n    // NOTE(allen): if wait_id != pid we don't know what that means; study that case before\r\n    // deciding how error handling around it works.\r\n    if (wait_id == pid){\r\n      int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options));\r\n      if (setoptions_result == -1){\r\n        // TODO(allen): setup failed\r\n      }\r\n      else{\r\n        result = true;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal String8\r\ndemon_lnx_executable_path_from_pid(Arena *arena, pid_t pid){\r\n  // get symbolic path\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 exe_symbol_path = push_str8f(scratch.arena, \"/proc/%d/exe\", pid);\r\n  \r\n  // try to read the link for a bit\r\n  Temp restore_point = temp_begin(arena);\r\n  B32 got_final_result = false;\r\n  U8 *buffer = 0;\r\n  int size = 0;\r\n  S64 cap = PATH_MAX;\r\n  for (S64 r = 0; r < 4; cap *= 2, r += 1){\r\n    temp_end(restore_point);\r\n    buffer = push_array_no_zero(arena, U8, cap);\r\n    size = readlink((char*)exe_symbol_path.str, (char*)buffer, cap);\r\n    if (size < cap){\r\n      got_final_result = true;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // finalize result\r\n  String8 result = {0};\r\n  if (!got_final_result || size == -1){\r\n    temp_end(restore_point);\r\n  }\r\n  else{\r\n    arena_pop(arena, (cap - size - 1));\r\n    result = str8(buffer, size + 1);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal int\r\ndemon_lnx_open_memory_fd_for_pid(pid_t pid){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 memory_path = push_str8f(scratch.arena, \"/proc/%i/mem\", pid);\r\n  int result = open((char*)memory_path.str, O_RDWR|O_CLOEXEC);\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal Arch\r\ndemon_lnx_arch_from_pid(pid_t pid){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Arch result = Arch_Null;\r\n  \r\n  // exe path\r\n  String8 exe_path = demon_lnx_executable_path_from_pid(scratch.arena, pid);\r\n  \r\n  // handle to exe\r\n  int exe_fd = -1;\r\n  if (exe_path.size != 0){\r\n    exe_fd = open((char*)exe_path.str, O_RDONLY|O_CLOEXEC);\r\n  }\r\n  \r\n  // elf identification\r\n  B32 is_elf = false;\r\n  U8 e_ident[SYMS_ElfIdentifier_NIDENT] = {0};\r\n  if (exe_fd >= 0){\r\n    if (pread(exe_fd, e_ident, sizeof(e_ident), 0) == sizeof(e_ident)){\r\n      is_elf = (e_ident[SYMS_ElfIdentifier_MAG0] == 0x7f && \r\n                e_ident[SYMS_ElfIdentifier_MAG1] == 'E'  &&\r\n                e_ident[SYMS_ElfIdentifier_MAG2] == 'L'  && \r\n                e_ident[SYMS_ElfIdentifier_MAG3] == 'F');\r\n    }\r\n  }\r\n  \r\n  // elf class\r\n  U8 elf_class = 0;\r\n  if (is_elf){\r\n    elf_class = e_ident[SYMS_ElfIdentifier_CLASS];\r\n  }\r\n  \r\n  // exe header data\r\n  SYMS_ElfEhdr64 ehdr = {0};\r\n  switch (elf_class){\r\n    case 1:\r\n    {\r\n      SYMS_ElfEhdr32 ehdr32 = {0};\r\n      if (pread(exe_fd, &ehdr32, sizeof(ehdr32), 0) == sizeof(ehdr32)){\r\n        ehdr = syms_elf_ehdr64_from_ehdr32(ehdr32);\r\n      }\r\n    }break;\r\n    \r\n    case 2:\r\n    {\r\n      pread(exe_fd, &ehdr, sizeof(ehdr), 0);\r\n    }break;\r\n  }\r\n  \r\n  // determine machine type\r\n  switch (ehdr.e_machine){\r\n    case SYMS_ElfMachineKind_386:\r\n    {\r\n      result = Arch_x86;\r\n    }break;\r\n    \r\n    case SYMS_ElfMachineKind_ARM:\r\n    {\r\n      result = Arch_arm32;\r\n    }break;\r\n    \r\n    case SYMS_ElfMachineKind_X86_64:\r\n    {\r\n      result = Arch_x64;\r\n    }break;\r\n    \r\n    case SYMS_ElfMachineKind_AARCH64:\r\n    {\r\n      result = Arch_arm64;\r\n    }break;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal DEMON_LNX_ProcessAux\r\ndemon_lnx_aux_from_pid(pid_t pid, Arch arch){\r\n  DEMON_LNX_ProcessAux result = {0};\r\n  B32 addr_32bit = (arch == Arch_x86 || arch == Arch_arm32);\r\n  \r\n  // open aux data\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 auxv_symbol_path = push_str8f(scratch.arena, \"/proc/%d/auxv\", pid);\r\n  int aux_fd = open((char*)auxv_symbol_path.str, O_RDONLY|O_CLOEXEC);\r\n  \r\n  // scan aux data\r\n  if (aux_fd >= 0){\r\n    for (;;){\r\n      result.filled = true;\r\n      \r\n      // read next aux\r\n      U64 type = 0;\r\n      U64 val = 0;\r\n      if (addr_32bit){\r\n        SYMS_ElfAuxv32 aux;\r\n        if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){\r\n          goto brkloop;\r\n        }\r\n        type = aux.a_type;\r\n        val = aux.a_val;\r\n      }\r\n      else{\r\n        SYMS_ElfAuxv64 aux;\r\n        if (read(aux_fd, &aux, sizeof(aux)) != sizeof(aux)){\r\n          goto brkloop;\r\n        }\r\n        type = aux.a_type;\r\n        val = aux.a_val;\r\n      }\r\n      \r\n      // place value in result\r\n      switch (type){\r\n        default:break;\r\n        case SYMS_ElfAuxType_NULL:         goto brkloop; break;\r\n        case SYMS_ElfAuxType_PHNUM:        result.phnum  = val; break;\r\n        case SYMS_ElfAuxType_PHENT:        result.phent  = val; break;\r\n        case SYMS_ElfAuxType_PHDR:         result.phdr   = val; break;\r\n        case SYMS_ElfAuxType_EXECFN:       result.execfn = val; break;\r\n      }\r\n    }\r\n    brkloop:;\r\n    \r\n    close(aux_fd);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal DEMON_LNX_PhdrInfo\r\ndemon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit, U64 phvaddr, U64 phentsize, U64 phcount){\r\n  DEMON_LNX_PhdrInfo result = {0};\r\n  result.range.min = max_U64;\r\n  \r\n  // how much phdr will we read?\r\n  U64 phdr_size_expected = (is_32bit?sizeof(SYMS_ElfPhdr32):sizeof(SYMS_ElfPhdr64));\r\n  U64 phdr_stride = (phentsize?phentsize:phdr_size_expected);\r\n  U64 phdr_read_size = ClampTop(phdr_stride, phdr_size_expected);\r\n  \r\n  // scan table\r\n  U64 va = phvaddr;\r\n  for (U64 i = 0; i < phcount; i += 1, va += phdr_stride){\r\n    \r\n    // get type and range\r\n    SYMS_ElfPKind p_type = 0;\r\n    U64 p_vaddr = 0;\r\n    U64 p_memsz = 0;\r\n    \r\n    if (is_32bit){\r\n      SYMS_ElfPhdr32 phdr32 = {0};\r\n      demon_lnx_read_memory(memory_fd, &phdr32, va, phdr_read_size);\r\n      p_type = phdr32.p_type;\r\n      p_vaddr = phdr32.p_vaddr;\r\n      p_memsz = phdr32.p_memsz;\r\n    }\r\n    else{\r\n      SYMS_ElfPhdr64 phdr64 = {0};\r\n      demon_lnx_read_memory(memory_fd, &phdr64, va, phdr_read_size);\r\n      p_type = phdr64.p_type;\r\n      p_vaddr = phdr64.p_vaddr;\r\n      p_memsz = phdr64.p_memsz;\r\n    }\r\n    \r\n    // save useful info\r\n    switch (p_type){\r\n      case SYMS_ElfPKind_Dynamic:\r\n      {\r\n        result.dynamic = p_vaddr;\r\n      }break;\r\n      case SYMS_ElfPKind_Load:\r\n      {\r\n        U64 min = p_vaddr;\r\n        U64 max = p_vaddr + p_memsz;\r\n        result.range.min = Min(result.range.min, min);\r\n        result.range.max = Max(result.range.max, max);\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal DEMON_LNX_ModuleNode*\r\ndemon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process){\r\n  Arch arch = (Arch)process->arch;\r\n  B32 is_32bit = (arch == Arch_x86 || arch == Arch_arm32);\r\n  int memory_fd = (int)process->ext_u64;\r\n  \r\n  // aux from pid\r\n  DEMON_LNX_ProcessAux aux = demon_lnx_aux_from_pid((pid_t)process->id, arch);\r\n  \r\n  // extract info from program headers\r\n  DEMON_LNX_PhdrInfo phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit,\r\n                                                                 aux.phdr, aux.phent, aux.phnum);\r\n  \r\n  // linkmap first from memory space & dyn address\r\n  U64 first_linkmap_va = 0;\r\n  if (phdr_info.dynamic != 0){\r\n    U64 off = phdr_info.dynamic;\r\n    for (;;){\r\n      SYMS_ElfDyn64 dyn = {0};\r\n      if (is_32bit){\r\n        SYMS_ElfDyn32 dyn32 = {0};\r\n        demon_lnx_read_memory(memory_fd, &dyn32, off, sizeof(dyn32));\r\n        dyn.tag = dyn32.tag;\r\n        dyn.val = dyn32.val;\r\n        off += sizeof(dyn32);\r\n      }\r\n      else{\r\n        demon_lnx_read_memory(memory_fd, &dyn, off, sizeof(dyn));\r\n        off += sizeof(dyn);\r\n      }\r\n      \r\n      if (dyn.tag == SYMS_ElfDynTag_NULL){\r\n        break;\r\n      }\r\n      \r\n      if (dyn.tag == SYMS_ElfDynTag_PLTGOT){\r\n        // True for x86 and x64\r\n        //  vas[0] virtual address of .dynamic\r\n        //  vas[2] callback for resolving function address of relocation and if successful jumps to it.\r\n        // \r\n        // Code that sets up PLTGOT is in glibc/sysdeps/x86_64/dl_machine.h -> elf_machine_runtime_setup\r\n        U64 vas_off = dyn.val;\r\n        U64 vas[3] = {0};\r\n        demon_lnx_read_memory(memory_fd, vas, vas_off, sizeof(vas));\r\n        first_linkmap_va = vas[1];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // setup output list\r\n  DEMON_LNX_ModuleNode *first = 0;\r\n  DEMON_LNX_ModuleNode *last = 0;\r\n  \r\n  // main module\r\n  {\r\n    DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1);\r\n    SLLQueuePush(first, last, node);\r\n    node->vaddr = phdr_info.range.min;\r\n    node->size = phdr_info.range.max - phdr_info.range.min;\r\n    node->name = aux.execfn;\r\n  }\r\n  \r\n  // iterate link maps\r\n  if (first_linkmap_va != 0){\r\n    U64 linkmap_va = first_linkmap_va;\r\n    \r\n    for (;;){\r\n      SYMS_ElfLinkMap64 linkmap = {0};\r\n      if (is_32bit){\r\n        // TOOD(nick): endian awarness\r\n        SYMS_ElfLinkMap32 linkmap32 = {0};\r\n        demon_lnx_read_memory(memory_fd, &linkmap32, linkmap_va, sizeof(linkmap32));\r\n        linkmap.base = linkmap32.base;\r\n        linkmap.name = linkmap32.name;\r\n        linkmap.ld   = linkmap32.ld;\r\n        linkmap.next = linkmap32.next;\r\n      }\r\n      else{\r\n        demon_lnx_read_memory(memory_fd, &linkmap, linkmap_va, sizeof(linkmap));\r\n      }\r\n      \r\n      if (linkmap.base != 0){\r\n        // find phdrs for this module\r\n        SYMS_U64 phvaddr = 0;\r\n        SYMS_U64 phentsize = 0;\r\n        SYMS_U64 phcount = 0;\r\n        \r\n        if (is_32bit){\r\n          SYMS_ElfEhdr32 ehdr = {0};\r\n          demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr));\r\n          phvaddr = ehdr.e_phoff + linkmap.base;\r\n          phentsize = ehdr.e_phentsize;\r\n          phcount = ehdr.e_phnum;\r\n        }\r\n        else{\r\n          SYMS_ElfEhdr64 ehdr = {0};\r\n          demon_lnx_read_memory(memory_fd, &ehdr, linkmap.base, sizeof(ehdr));\r\n          phvaddr = ehdr.e_phoff + linkmap.base;\r\n          phentsize = ehdr.e_phentsize;\r\n          phcount = ehdr.e_phnum;\r\n        }\r\n        \r\n        // extract info from phdrs\r\n        DEMON_LNX_PhdrInfo module_phdr_info = demon_lnx_phdr_info_from_memory(memory_fd, is_32bit,\r\n                                                                              phvaddr, phentsize, phcount);\r\n        \r\n        // save module node\r\n        DEMON_LNX_ModuleNode *node = push_array(arena, DEMON_LNX_ModuleNode, 1);\r\n        SLLQueuePush(first, last, node);\r\n        node->vaddr = linkmap.base;\r\n        node->size = module_phdr_info.range.max - module_phdr_info.range.min;\r\n        node->name = linkmap.name;\r\n      }\r\n      \r\n      linkmap_va = linkmap.next;\r\n      if (linkmap_va == 0){\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return(first);\r\n}\r\n\r\ninternal U64\r\ndemon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size){\r\n  U64 bytes_read = 0;\r\n  U8 *ptr = (U8*)dst;\r\n  U8 *opl = ptr + size;\r\n  U64 cursor = src;\r\n  for (;ptr < opl;){\r\n    size_t to_read = (size_t)(opl - ptr);\r\n    ssize_t actual_read = pread(memory_fd, ptr, to_read, cursor);\r\n    if (actual_read == -1){\r\n      break;\r\n    }\r\n    ptr += actual_read;\r\n    cursor += actual_read;\r\n    bytes_read += actual_read;\r\n  }\r\n  return(bytes_read);\r\n}\r\n\r\ninternal B32\r\ndemon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size){\r\n  B32 result = true;\r\n  U8 *ptr = (U8*)src;\r\n  U8 *opl = ptr + size;\r\n  U64 cursor = dst;\r\n  for (;ptr < opl;){\r\n    size_t to_write = (size_t)(opl - ptr);\r\n    ssize_t actual_write = pwrite(memory_fd, ptr, to_write, cursor);\r\n    if (actual_write == -1){\r\n      result = false;\r\n      break;\r\n    }\r\n    ptr += actual_write;\r\n    cursor += actual_write;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\ndemon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address){\r\n  // TODO(allen): this could be done better with a demon_lnx_read_memory\r\n  // that returns a read amount instead of a success/fail.\r\n  \r\n  // scan piece by piece\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  \r\n  U64 max_cap = 256;\r\n  U64 cap = max_cap;\r\n  U64 read_p = address;\r\n  for (;;){\r\n    U8 *block = push_array(scratch.arena, U8, cap);\r\n    for (;cap > 0;){\r\n      if (demon_lnx_read_memory(memory_fd, block, read_p, cap)){\r\n        break;\r\n      }\r\n      cap /= 2;\r\n    }\r\n    read_p += cap;\r\n    \r\n    U64 block_opl = 0;\r\n    for (;block_opl < cap; block_opl += 1){\r\n      if (block[block_opl] == 0){\r\n        break;\r\n      }\r\n    }\r\n    \r\n    if (block_opl > 0){\r\n      str8_list_push(scratch.arena, &list, str8(block, block_opl));\r\n    }\r\n    \r\n    if (block_opl < cap || cap == 0){\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // assemble results\r\n  String8 result = str8_list_join(arena, &list, 0);\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal void\r\ndemon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src){\r\n  dst->rax.u64 = src->rax;\r\n  dst->rcx.u64 = src->rcx;\r\n  dst->rdx.u64 = src->rdx;\r\n  dst->rbx.u64 = src->rbx;\r\n  dst->rsp.u64 = src->rsp;\r\n  dst->rbp.u64 = src->rbp;\r\n  dst->rsi.u64 = src->rsi;\r\n  dst->rdi.u64 = src->rdi;\r\n  dst->r8.u64  = src->r8;\r\n  dst->r9.u64  = src->r9;\r\n  dst->r10.u64 = src->r10;\r\n  dst->r11.u64 = src->r11;\r\n  dst->r12.u64 = src->r12;\r\n  dst->r13.u64 = src->r13;\r\n  dst->r14.u64 = src->r14;\r\n  dst->r15.u64 = src->r15;\r\n  dst->cs.u16  = src->cs;\r\n  dst->ds.u16  = src->ds;\r\n  dst->es.u16  = src->es;\r\n  dst->fs.u16  = src->fs;\r\n  dst->gs.u16  = src->gs;\r\n  dst->ss.u16  = src->ss;\r\n  dst->fsbase.u64 = src->fsbase;\r\n  dst->gsbase.u64 = src->gsbase;\r\n  dst->rip.u64    = src->rip;\r\n  dst->rflags.u64 = src->rflags;\r\n}\r\n\r\ninternal void\r\ndemon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src){\r\n  dst->rax = src->rax.u64;\r\n  dst->rcx = src->rcx.u64;\r\n  dst->rdx = src->rdx.u64;\r\n  dst->rbx = src->rbx.u64;\r\n  dst->rsp = src->rsp.u64;\r\n  dst->rbp = src->rbp.u64;\r\n  dst->rsi = src->rsi.u64;\r\n  dst->rdi = src->rdi.u64;\r\n  dst->r8  = src->r8.u64;\r\n  dst->r9  = src->r9.u64;\r\n  dst->r10 = src->r10.u64;\r\n  dst->r11 = src->r11.u64;\r\n  dst->r12 = src->r12.u64;\r\n  dst->r13 = src->r13.u64;\r\n  dst->r14 = src->r14.u64;\r\n  dst->r15 = src->r15.u64;\r\n  dst->cs  = src->cs.u16;\r\n  dst->ds  = src->ds.u16;\r\n  dst->es  = src->es.u16;\r\n  dst->fs  = src->fs.u16;\r\n  dst->gs  = src->gs.u16;\r\n  dst->ss  = src->ss.u16;\r\n  dst->fsbase = src->fsbase.u64;\r\n  dst->gsbase = src->gsbase.u64;\r\n  dst->rip    = src->rip.u64;\r\n  dst->rflags = src->rflags.u64;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal String8\r\ndemon_lnx_read_int_string(Arena *arena, int fd, int radix){\r\n  String8 integer = str8(0,0);\r\n  \r\n  int to_read = 0;\r\n  int to_seek = 0;\r\n  for (;;){\r\n    char b = 0;\r\n    if (read(fd, &b, sizeof(b)) == 0){\r\n      break;\r\n    }\r\n    to_seek += 1;\r\n    if ( ! char_is_digit(b, radix)){\r\n      break;\r\n    }\r\n    to_read += 1;\r\n  }\r\n  \r\n  if (lseek(fd, -to_seek, SEEK_CUR) != -1) {\r\n    char *buf = push_array_no_zero(arena, char, to_read + 1);\r\n    read(fd, buf, to_read);\r\n    buf[to_read] = '\\0';\r\n    integer = str8((U8*)buf, (U64)to_read);\r\n  }\r\n  \r\n  return(integer);\r\n}\r\n\r\ninternal U64\r\ndemon_lnx_read_u64(int fd, int radix){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix);\r\n  U64 result = u64_from_str8(integer, radix);\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal S64\r\ndemon_lnx_read_s64(int fd, int radix){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 integer = demon_lnx_read_int_string(scratch.arena, fd, radix);\r\n  S64 result = s64_from_str8(integer, radix);\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_lnx_read_expect(int fd, char expect){\r\n  char got = 0;\r\n  read(fd, &got, sizeof(got));\r\n  B32 result = (got == expect);\r\n  if (!result){\r\n    lseek(fd, -1, SEEK_CUR);\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal int\r\ndemon_lnx_read_whitespace(int fd){\r\n  int whitespace_size = 0;\r\n  for (;;){\r\n    if (!demon_lnx_read_expect(fd, ' ')){\r\n      if (!demon_lnx_read_expect(fd, '\\t')){\r\n        break;\r\n      }\r\n    }\r\n    whitespace_size += 1;\r\n  }\r\n  return whitespace_size;\r\n}\r\n\r\ninternal String8\r\ndemon_lnx_read_string(Arena *arena, int fd){\r\n  String8 result = str8(0,0);\r\n  \r\n  int to_read = 0;\r\n  int to_seek = 0;\r\n  for (;;){\r\n    char b = 0;\r\n    if (read(fd, &b, sizeof(b)) == 0) {\r\n      break;\r\n    }\r\n    to_seek += 1;\r\n    if (b == '\\0' || b == '\\n'){\r\n      break;\r\n    }\r\n    to_read += 1;\r\n  }\r\n  \r\n  if (to_seek > 0 && lseek(fd, -to_seek, SEEK_CUR) != -1){\r\n    char *buf = push_array_no_zero(arena, char, to_read + 1);\r\n    read(fd, buf, to_read);\r\n    buf[to_read] = '\\0';\r\n    result = str8((U8*)buf, to_read);\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal int\r\ndemon_lnx_open_maps(pid_t pid){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path = push_str8f(scratch.arena, \"/proc/%d/maps\", pid);\r\n  int maps = open((char*)path.str, O_RDONLY|O_CLOEXEC);\r\n  scratch_end(scratch);\r\n  return(maps);\r\n}\r\n\r\ninternal B32\r\ndemon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out){\r\n  B32 is_parsed = false;\r\n  MemoryZeroStruct(entry_out);\r\n  do{\r\n    U64 address_lo = 0;\r\n    U64 address_hi = 0;\r\n    DEMON_LNX_PermFlags perms = 0;\r\n    U64 offset = 0;\r\n    U64 dev_major = 0;\r\n    U64 dev_minor = 0;\r\n    U64 inode = 0;\r\n    String8 pathname = str8(0,0);\r\n    \r\n    // address range\r\n    address_lo = demon_lnx_read_u64(maps, 16);\r\n    if (!demon_lnx_read_expect(maps, '-')){\r\n      break;\r\n    }\r\n    address_hi = demon_lnx_read_u64(maps, 16);\r\n    if (demon_lnx_read_whitespace(maps) == 0){\r\n      break;\r\n    }\r\n    \r\n    // permission flags\r\n    char b;\r\n    if (read(maps, &b, sizeof(b)) == 0){\r\n      break;\r\n    }\r\n    if (b=='r'){\r\n      perms |= DEMON_LNX_PermFlags_Read; \r\n    }\r\n    if (read(maps, &b, sizeof(b)) == 0){\r\n      break;\r\n    }\r\n    if (b=='w'){\r\n      perms |= DEMON_LNX_PermFlags_Write;\r\n    }\r\n    if (read(maps, &b, sizeof(b)) == 0){\r\n      break;\r\n    }\r\n    if (b=='x'){\r\n      perms |= DEMON_LNX_PermFlags_Exec;\r\n    }\r\n    if (read(maps, &b, sizeof(b)) == 0){\r\n      break;\r\n    }\r\n    if (b == 'p'){\r\n      perms |= DEMON_LNX_PermFlags_Private;\r\n    }\r\n    if (demon_lnx_read_whitespace(maps) == 0){\r\n      break;\r\n    }\r\n    \r\n    // offset\r\n    offset = demon_lnx_read_u64(maps, 16);\r\n    if (demon_lnx_read_whitespace(maps) == 0){\r\n      break;\r\n    }\r\n    \r\n    // dev\r\n    dev_major = demon_lnx_read_u64(maps, 10);\r\n    if (!demon_lnx_read_expect(maps, ':')){\r\n      break;\r\n    }\r\n    dev_minor = demon_lnx_read_u64(maps, 10);\r\n    if (demon_lnx_read_whitespace(maps) == 0){\r\n      break;\r\n    }\r\n    \r\n    // inode\r\n    inode = demon_lnx_read_u64(maps, 10);\r\n    if (demon_lnx_read_whitespace(maps) == 10){\r\n      break;\r\n    }\r\n    \r\n    // pathname\r\n    pathname = demon_lnx_read_string(arena, maps);\r\n    \r\n    // emit entry if en\r\n    b = 0;\r\n    read(maps, &b, sizeof(b));\r\n    if (b != '\\n' && b != '\\0') {\r\n      break;\r\n    }\r\n    \r\n    // fill result\r\n    entry_out->address_lo = address_lo;\r\n    entry_out->address_hi = address_hi;\r\n    entry_out->perms      = perms;\r\n    entry_out->offset     = offset;\r\n    entry_out->dev_major  = (U32)dev_major;\r\n    entry_out->dev_minor  = (U32)dev_minor;\r\n    entry_out->inode      = inode;\r\n    entry_out->pathname   = pathname;\r\n    entry_out->type       = DEMON_LNX_MapsEntryType_Null;\r\n    entry_out->stack_tid  = 0;\r\n    \r\n    if (str8_match(pathname, str8_lit(\"/\"), StringMatchFlag_RightSideSloppy)){\r\n      entry_out->type = DEMON_LNX_MapsEntryType_Path;\r\n    } else if (str8_match(pathname, str8_lit(\"[heap]\"), 0)){\r\n      entry_out->type = DEMON_LNX_MapsEntryType_Heap;\r\n    } else if (str8_match(pathname, str8_lit(\"[stack]\"), 0)){\r\n      entry_out->type = DEMON_LNX_MapsEntryType_Stack;\r\n    } else if (str8_match(pathname, str8_lit(\"[stack:\"), StringMatchFlag_RightSideSloppy)){\r\n      entry_out->type = DEMON_LNX_MapsEntryType_Stack;\r\n      String8 tid = str8_substr(pathname, r1u64(7, pathname.size - 8));\r\n      entry_out->stack_tid = (pid_t)u64_from_str8(tid, 10);\r\n    }\r\n    \r\n    is_parsed = true;\r\n  }while(0);\r\n  return(is_parsed);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @demon_os_hooks Main Layer Initialization\r\n\r\ninternal void\r\ndemon_os_init(void){\r\n  demon_lnx_event_arena = arena_alloc();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @demon_os_hooks Running/Halting\r\n\r\ninternal DEMON_EventList\r\ndemon_os_run(Arena *arena, DEMON_OS_RunCtrls *controls){\r\n  DEMON_EventList result = {0};\r\n  \r\n  if (demon_ent_root == 0){\r\n    demon_push_event(arena, &result, DEMON_EventKind_NotInitialized);\r\n  }\r\n  else if (demon_ent_root->first == 0 && !demon_lnx_new_process_pending){\r\n    demon_push_event(arena, &result, DEMON_EventKind_NotAttached);\r\n  }\r\n  else{\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    // use queued events if there are any\r\n    if (demon_lnx_queued_events.first != 0){\r\n      // copy event queue\r\n      for (DEMON_Event *node = demon_lnx_queued_events.first;\r\n           node != 0;\r\n           node = node->next){\r\n        DEMON_Event *copy = push_array_no_zero(arena, DEMON_Event, 1);\r\n        MemoryCopyStruct(copy, node);\r\n        SLLQueuePush(result.first, result.last, copy);\r\n      }\r\n      result.count = demon_lnx_queued_events.count;\r\n      \r\n      // zero stored queue\r\n      MemoryZeroStruct(&demon_lnx_queued_events);\r\n      arena_clear(demon_lnx_event_arena);\r\n    }\r\n    \r\n    // get the single step thread (if any)\r\n    DEMON_Entity *single_step_thread = controls->single_step_thread;\r\n    \r\n    // do setup\r\n    B32 did_setup = false;\r\n    U8 *trap_swap_bytes = 0;\r\n    \r\n    if (result.first == 0){\r\n      // TODO(allen): per-Arch implementation of single steps\r\n      // set single step bit\r\n      if (single_step_thread != 0){\r\n        switch (single_step_thread->arch){\r\n          case Arch_x86:\r\n          {\r\n            // TODO(allen): possibly buggy\r\n            SYMS_RegX86 regs = {0};\r\n            demon_os_read_regs_x86(single_step_thread, &regs);\r\n            regs.eflags.u32 |= 0x100;\r\n            demon_os_write_regs_x86(single_step_thread, &regs);\r\n          }break;\r\n          \r\n          case Arch_x64:\r\n          {\r\n            // TODO(allen): possibly buggy\r\n            SYMS_RegX64 regs = {0};\r\n            demon_os_read_regs_x64(single_step_thread, &regs);\r\n            regs.rflags.u64 |= 0x100;\r\n            demon_os_write_regs_x64(single_step_thread, &regs);\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // TODO(allen): per-Arch implementation of traps\r\n      trap_swap_bytes = push_array_no_zero(scratch.arena, U8, controls->trap_count);\r\n      \r\n      {\r\n        DEMON_OS_Trap *trap = controls->traps;\r\n        for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){\r\n          if (demon_os_read_memory(trap->process, trap_swap_bytes + i, trap->address, 1)){\r\n            U8 int3 = 0xCC;\r\n            demon_os_write_memory(trap->process, trap->address, &int3, 1);\r\n          }\r\n          else{\r\n            trap_swap_bytes[i] = 0xCC;\r\n          }\r\n        }\r\n      }\r\n      \r\n      did_setup = true;\r\n    }\r\n    \r\n    // do run\r\n    B32 did_run = false;\r\n    if (did_setup){\r\n      // continue non-frozen threads\r\n      DEMON_LNX_EntityNode *resume_threads = 0;\r\n      for (DEMON_Entity *process = demon_ent_root->first;\r\n           process != 0;\r\n           process = process->next){\r\n        if (process->kind == DEMON_EntityKind_Process){\r\n          \r\n          // determine if this process is frozen\r\n          B32 process_is_frozen = false;\r\n          if (controls->run_entities_are_processes){\r\n            for (U64 i = 0; i < controls->run_entity_count; i += 1){\r\n              if (controls->run_entities[i] == process){\r\n                process_is_frozen = true;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          for (DEMON_Entity *thread = process->first;\r\n               thread != 0;\r\n               thread = thread->next){\r\n            if (thread->kind == DEMON_EntityKind_Thread){\r\n              // determine if this thread is frozen\r\n              B32 is_frozen = false;\r\n              \r\n              if (controls->single_step_thread != 0 &&\r\n                  controls->single_step_thread != thread){\r\n                is_frozen = true;\r\n              }\r\n              else{\r\n                \r\n                if (controls->run_entities_are_processes){\r\n                  is_frozen = process_is_frozen;\r\n                }\r\n                else{\r\n                  for (U64 i = 0; i < controls->run_entity_count; i += 1){\r\n                    if (controls->run_entities[i] == thread){\r\n                      is_frozen = true;\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                if (controls->run_entities_are_unfrozen){\r\n                  is_frozen = !is_frozen;\r\n                }\r\n              }\r\n              \r\n              // continue if not frozen\r\n              if (!is_frozen){\r\n                errno = 0;\r\n                ptrace(PTRACE_CONT, (pid_t)thread->id, 0, 0);\r\n                DEMON_LNX_EntityNode *thread_node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1);\r\n                SLLStackPush(resume_threads, thread_node);\r\n                thread_node->entity = thread;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      // get next stop\r\n      wait_for_stop:\r\n      B32 did_dummy_stop = false;\r\n      int status = 0;\r\n      pid_t wait_id = waitpid(-1, &status, __WALL);\r\n      \r\n      // increment demon time\r\n      demon_time += 1;\r\n      \r\n      // handle devent\r\n      DEMON_Entity *thread = demon_ent_map_entity_from_id(DEMON_EntityKind_Thread, wait_id);\r\n      if (thread == 0){\r\n        if (wait_id >= 0){\r\n          // TODO(allen): this isn't a great situation! From what I can tell there's no\r\n          // options that I am super happy with for going from unknown tid -> pid.\r\n          // We can parse it out of /proc/<tid>/status; but I don't want to do that until\r\n          // I'm forced to, because it seems like this shouldn't happen if the ptrace\r\n          // API works correctly and we don't have any bugs in our demon entity system.\r\n        }\r\n      }\r\n      else{\r\n        B32 thread_exit = false;\r\n        U64 exit_code = 0;\r\n        \r\n        DEMON_Entity *process = thread->parent;\r\n        // NOTE(allen): hitting this assert should never ever be possible, if our entities\r\n        // are wired up correctly. it doesn't matter what ptrace or waitpid are doing.\r\n        Assert(process != 0);\r\n        \r\n        // read register info\r\n        U64 instruction_pointer = 0;\r\n        union{ SYMS_RegX86 x86; SYMS_RegX64 x64; } regs = {0};\r\n        \r\n        switch (thread->arch){\r\n          case Arch_x86:\r\n          {\r\n            demon_os_read_regs_x86(thread, &regs.x86);\r\n            instruction_pointer = regs.x86.eip.u32;\r\n          }break;\r\n          \r\n          case Arch_x64:\r\n          {\r\n            demon_os_read_regs_x64(thread, &regs.x64);\r\n            instruction_pointer = regs.x64.rip.u64;\r\n          }break;\r\n        }\r\n        \r\n        // check stop status\r\n        if (WIFEXITED(status)){\r\n          thread_exit = true;\r\n        }\r\n        if (WIFSIGNALED(status)){\r\n          exit_code = WTERMSIG(status);\r\n          thread_exit = true;\r\n        }\r\n        \r\n        // extra event list\r\n        DEMON_EventList stop_events = {0};\r\n        \r\n        if (WIFSTOPPED(status)){\r\n          switch (WSTOPSIG(status)){\r\n            case SIGTRAP:\r\n            {\r\n              switch (status >> 8){\r\n                case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):\r\n                {\r\n                  // TODO(allen): (not sure actually, study this part)\r\n                  thread_exit = true;\r\n                }break;\r\n                \r\n                case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):\r\n                {\r\n                  // new thread coming\r\n                  unsigned long new_tid = 0;\r\n                  int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_tid);\r\n                  if (get_message_result == -1){\r\n                    // TODO(allen): this isn't right, time to give up on getting this process.\r\n                    // this will likely lead to getting unrecognized wait_id s later. So we need\r\n                    // this stuff in the log to make sense of it still.\r\n                  }\r\n                  else{\r\n                    // thread entity\r\n                    DEMON_Entity *new_thread = demon_ent_new(process, DEMON_EntityKind_Thread, new_tid);\r\n                    demon_thread_count += 1;\r\n                    DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread);\r\n                    thread_ext->expecting_dummy_sigstop = true;\r\n                    \r\n                    // thread event\r\n                    DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread);\r\n                    e->process = demon_ent_handle_from_ptr(process);\r\n                    e->thread = demon_ent_handle_from_ptr(new_thread);\r\n                  }\r\n                }break;\r\n                \r\n                case (SIGTRAP | (PTRACE_EVENT_FORK << 8)):\r\n                case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)):\r\n                {\r\n                  // new process coming\r\n                  unsigned long new_pid = 0;\r\n                  int get_message_result = ptrace(PTRACE_GETEVENTMSG, wait_id, 0, &new_pid);\r\n                  if (get_message_result == -1){\r\n                    // TODO(allen): this isn't right, time to give up on getting this process.\r\n                    // this will likely lead to getting unrecognized wait_id s later. So we need\r\n                    // this stuff in the log to make sense of it still.\r\n                  }\r\n                  else{\r\n                    Arch arch = demon_lnx_arch_from_pid(new_pid);\r\n                    \r\n                    // process entity\r\n                    DEMON_Entity *new_process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, new_pid);\r\n                    new_process->arch = arch;\r\n                    new_process->ext_u64 = demon_lnx_open_memory_fd_for_pid(new_pid);\r\n                    \r\n                    demon_lnx_new_process_pending = false;\r\n                    \r\n                    // thread entity\r\n                    DEMON_Entity *new_thread = demon_ent_new(new_process, DEMON_EntityKind_Thread, new_pid);\r\n                    demon_thread_count += 1;\r\n                    DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(new_thread);\r\n                    thread_ext->expecting_dummy_sigstop = true;\r\n                    \r\n                    // process event\r\n                    {\r\n                      DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateProcess);\r\n                      e->process = demon_ent_handle_from_ptr(new_process);\r\n                    }\r\n                    \r\n                    // thread event\r\n                    {\r\n                      DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_CreateThread);\r\n                      e->process = demon_ent_handle_from_ptr(new_process);\r\n                      e->thread = demon_ent_handle_from_ptr(new_thread);\r\n                    }\r\n                  }\r\n                }break;\r\n                \r\n                default:\r\n                {\r\n                  // check single step\r\n                  DEMON_EventKind e_kind = DEMON_EventKind_Trap;\r\n                  if (thread == single_step_thread){\r\n                    e_kind = DEMON_EventKind_SingleStep;\r\n                  }\r\n                  \r\n                  // check bp\r\n                  if (e_kind == DEMON_EventKind_Trap){\r\n                    DEMON_OS_Trap *trap = controls->traps;\r\n                    for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){\r\n                      if (trap->process == process && trap->address == instruction_pointer - 1){\r\n                        e_kind = DEMON_EventKind_Breakpoint;\r\n                        break;\r\n                      }\r\n                    }\r\n                  }\r\n                  \r\n                  // adjust ip after breakpoint\r\n                  if (e_kind == DEMON_EventKind_Breakpoint){\r\n                    // TODO(allen): possibly buggy\r\n                    switch (thread->arch){\r\n                      case Arch_x86:\r\n                      {\r\n                        instruction_pointer -= 1;\r\n                        regs.x86.eip.u32 = instruction_pointer;\r\n                        demon_os_write_regs_x86(thread, &regs.x86);\r\n                      }break;\r\n                      \r\n                      case Arch_x64:\r\n                      {\r\n                        instruction_pointer -= 1;\r\n                        regs.x64.rip.u64 = instruction_pointer;\r\n                        demon_os_write_regs_x64(thread, &regs.x64);\r\n                      }break;\r\n                    }\r\n                  }\r\n                  \r\n                  // event\r\n                  DEMON_Event *e = demon_push_event(arena, &stop_events, e_kind);\r\n                  e->process = demon_ent_handle_from_ptr(process);\r\n                  e->thread = demon_ent_handle_from_ptr(thread);\r\n                  e->instruction_pointer = instruction_pointer;\r\n                }break;\r\n              }\r\n            }break;\r\n            \r\n            case SIGSTOP:\r\n            {\r\n              // TODO(allen): we need to figure out how we want to tell apart:\r\n              //  SIGSTOP All-Stop, SIGSTOP Halt, SIGSTOP \"User\"\r\n              // what we're doing right now == big-time race conditions\r\n              \r\n              DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread);\r\n              \r\n              if (thread_ext->expecting_dummy_sigstop){\r\n                thread_ext->expecting_dummy_sigstop = false;\r\n                did_dummy_stop = true;\r\n              }\r\n              else if (demon_lnx_already_has_halt_injection){\r\n                DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Halt);\r\n                e->process = demon_ent_handle_from_ptr(process);\r\n                e->thread = demon_ent_handle_from_ptr(thread);\r\n                e->instruction_pointer = instruction_pointer;\r\n              }\r\n              else{\r\n                // TODO(allen): a signal we don't want to mess with (except to record that it happened maybe)\r\n                // we should \"hand it back\"\r\n              }\r\n            }break;\r\n            \r\n            default:\r\n            {\r\n#if 0\r\n              // these are a little special. the program cannot continue after these\r\n              // unless the user first does something to change the state (move the IP, change a variable, w/e)\r\n              case SIGABRT:case SIGFPE:case SIGSEGV:\r\n#endif\r\n              \r\n              // event\r\n              DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_Exception);\r\n              e->process = demon_ent_handle_from_ptr(process);\r\n              e->thread = demon_ent_handle_from_ptr(thread);\r\n              e->instruction_pointer = instruction_pointer;\r\n              e->signo = WSTOPSIG(status);\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        // entity cleanup\r\n        if (thread_exit){\r\n          if (thread->id == process->id){\r\n            // generate events for threads & modules\r\n            for (DEMON_Entity *entity = process->first;\r\n                 entity != 0;\r\n                 entity = entity->next){\r\n              if (entity->kind == DEMON_EntityKind_Thread){\r\n                DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_ExitThread);\r\n                e->process = demon_ent_handle_from_ptr(process);\r\n                e->thread = demon_ent_handle_from_ptr(entity);\r\n              }\r\n              else{\r\n                DEMON_Event *e = demon_push_event(arena, &result, DEMON_EventKind_UnloadModule);\r\n                e->process = demon_ent_handle_from_ptr(process);\r\n                e->module = demon_ent_handle_from_ptr(entity);\r\n              }\r\n            }\r\n            \r\n            // exit event\r\n            DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitProcess);\r\n            e->process = demon_ent_handle_from_ptr(process);\r\n            e->code = exit_code;\r\n            \r\n            // free entity\r\n            demon_ent_release_root_and_children(process);\r\n          }\r\n          else{\r\n            // exit event\r\n            DEMON_Event *e = demon_push_event(arena, &stop_events, DEMON_EventKind_ExitThread);\r\n            e->process = demon_ent_handle_from_ptr(process);\r\n            e->thread = demon_ent_handle_from_ptr(thread);\r\n            e->code = exit_code;\r\n            \r\n            // free entity\r\n            demon_ent_release_root_and_children(thread);\r\n          }\r\n        }\r\n        \r\n        // update all module lists (for each process ...)\r\n        DEMON_EventList module_change_events = {0};\r\n        \r\n        for (DEMON_Entity *proc_node = demon_ent_root->first;\r\n             proc_node != 0;\r\n             proc_node = proc_node->next){\r\n          DEMON_LNX_ModuleNode *first_module = demon_lnx_module_list_from_process(scratch.arena, proc_node);\r\n          \r\n          DEMON_LNX_EntityNode *first_unloaded = 0;\r\n          DEMON_LNX_EntityNode *last_unloaded = 0;\r\n          \r\n          // compute the delta (mark known modules, save list of unloaded modules)\r\n          for (DEMON_Entity *entity = proc_node->first;\r\n               entity != 0;\r\n               entity = entity->next){\r\n            if (entity->kind == DEMON_EntityKind_Module){\r\n              U64 base = entity->id;\r\n              U64 name = entity->ext_u64;\r\n              B32 still_exists = false;\r\n              for (DEMON_LNX_ModuleNode *module_node = first_module;\r\n                   module_node != 0;\r\n                   module_node = module_node->next){\r\n                if (module_node->vaddr == base && module_node->name == name){\r\n                  module_node->already_known = true;\r\n                  still_exists = true;\r\n                  break;\r\n                }\r\n              }\r\n              if (!still_exists){\r\n                DEMON_LNX_EntityNode *node = push_array_no_zero(scratch.arena, DEMON_LNX_EntityNode, 1);\r\n                SLLQueuePush(first_unloaded, last_unloaded, node);\r\n                node->entity = entity;\r\n              }\r\n            }\r\n          }\r\n          \r\n          // handle unloads\r\n          for (DEMON_LNX_EntityNode *unloaded_node = first_unloaded;\r\n               unloaded_node != 0;\r\n               unloaded_node = unloaded_node->next){\r\n            DEMON_Entity *module = unloaded_node->entity;\r\n            \r\n            // event\r\n            {\r\n              DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_UnloadModule);\r\n              e->process = demon_ent_handle_from_ptr(proc_node);\r\n              e->module = demon_ent_handle_from_ptr(module);\r\n            }\r\n            \r\n            // free entity\r\n            demon_ent_release_root_and_children(module);\r\n          }\r\n          \r\n          // handle loads\r\n          for (DEMON_LNX_ModuleNode *module_node = first_module;\r\n               module_node != 0;\r\n               module_node = module_node->next){\r\n            if (!module_node->already_known){\r\n              // entity\r\n              DEMON_Entity *module = demon_ent_new(proc_node, DEMON_EntityKind_Module, module_node->vaddr);\r\n              demon_module_count += 1;\r\n              module->ext_u64 = module_node->name;\r\n              \r\n              // event\r\n              {\r\n                DEMON_Event *e = demon_push_event(arena, &module_change_events, DEMON_EventKind_LoadModule);\r\n                e->process = demon_ent_handle_from_ptr(proc_node);\r\n                e->module = demon_ent_handle_from_ptr(module);\r\n                e->address = module_node->vaddr;\r\n                e->size = module_node->size;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // concat the events list (with module changes first)\r\n        result.count = module_change_events.count + stop_events.count;\r\n        result.first = module_change_events.first;\r\n        result.last = module_change_events.last;\r\n        if (stop_events.first != 0){\r\n          if (result.first != 0){\r\n            result.last->next = stop_events.first;\r\n            result.last = stop_events.last;\r\n          }\r\n          else{\r\n            result.first = stop_events.first;\r\n            result.last = stop_events.last;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // do we have a reason to keep going?\r\n      B32 skip_this_stop = false;\r\n      if (did_dummy_stop && result.count == 0){\r\n        skip_this_stop = true;\r\n      }\r\n      \r\n      // ignore this stop, resume and wait again\r\n      if (skip_this_stop){\r\n        if (wait_id != 0){\r\n          ptrace(PTRACE_CONT, (pid_t)wait_id, 0, 0);\r\n        }\r\n        goto wait_for_stop;\r\n      }\r\n      \r\n      // stop all running threads\r\n      for (DEMON_LNX_EntityNode *node = resume_threads;\r\n           node != 0;\r\n           node = node->next){\r\n        DEMON_Entity *thread = node->entity;\r\n        pid_t thread_id = (pid_t)thread->id;\r\n        if (thread_id != wait_id){\r\n          union sigval sv = {0};\r\n          sigqueue(thread_id, SIGSTOP, sv);\r\n          \r\n          DEMON_LNX_ThreadExt *thread_ext = demon_lnx_thread_ext(thread);\r\n          thread_ext->expecting_dummy_sigstop = true;\r\n        }\r\n      }\r\n      \r\n      did_run = true;\r\n    }\r\n    \r\n    // cleanup\r\n    if (did_run){\r\n      // TODO(allen): per-Arch\r\n      // unset traps\r\n      {\r\n        DEMON_OS_Trap *trap = controls->traps;\r\n        for (U64 i = 0; i < controls->trap_count; i += 1, trap += 1){\r\n          U8 og_byte = trap_swap_bytes[i];\r\n          if (og_byte != 0xCC){\r\n            demon_os_write_memory(trap->process, trap->address, &og_byte, 1);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // TODO(allen): per-Arch\r\n      // unset single step bit\r\n      //  the single step bit is automatically unset whenever we single step\r\n      //  but if *something else* happened, it will still be there ready to\r\n      //  confound us later; so here we're just being sure it's taken out.\r\n      if (single_step_thread != 0){\r\n        // TODO(allen): possibly buggy\r\n        switch (single_step_thread->arch){\r\n          case Arch_x86:\r\n          {\r\n            SYMS_RegX86 regs = {0};\r\n            demon_os_read_regs_x86(single_step_thread, &regs);\r\n            regs.eflags.u32 &= ~0x100;\r\n            demon_os_write_regs_x86(single_step_thread, &regs);\r\n          }break;\r\n          \r\n          case Arch_x64:\r\n          {\r\n            SYMS_RegX64 regs = {0};\r\n            demon_os_read_regs_x64(single_step_thread, &regs);\r\n            regs.rflags.u64 &= ~0x100;\r\n            demon_os_write_regs_x64(single_step_thread, &regs);\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal void\r\ndemon_os_halt(U64 code, U64 user_data){\r\n  if (demon_ent_root != 0 && !demon_lnx_already_has_halt_injection){\r\n    DEMON_Entity *process = demon_ent_root->first;\r\n    if (process != 0){\r\n      demon_lnx_already_has_halt_injection = true;\r\n      demon_lnx_halt_code = code;\r\n      demon_lnx_halt_user_data = user_data;\r\n      union sigval sv = {0};\r\n      if (sigqueue(process->id, SIGSTOP, sv) == -1){\r\n        demon_lnx_already_has_halt_injection = false;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n// NOTE(allen): siginfo hint from old code:\r\n#if 0\r\n{\r\n  switch (siginfo.si_code){\r\n    // SI_KERNEL (hit int3; 0xCC)\r\n    case 0x80:\r\n    {\r\n      // TODO(allen): breakpoint event\r\n    }break;\r\n    \r\n    // TRAP_UNK, TRAP_HWBKPT, TRAP_BRKPT, TRAP_TRACE\r\n    case 0x5: case 0x4: case 0x1: case 0x2:\r\n    {\r\n      // TODO(allen): breakpoint event (?)\r\n    }break;\r\n    \r\n    case 0x3: case 0x0:\r\n    {\r\n      // TODO(allen): do nothing I guess?\r\n    }break;\r\n  }\r\n}\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: @demon_os_hooks Target Process Launching/Attaching/Killing/Detaching/Halting\r\n\r\ninternal U32\r\ndemon_os_launch_process(OS_LaunchOptions *options){\r\n  U32 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  // arrange options\r\n  char *binary = 0;\r\n  char **args = 0;\r\n  if (options->cmd_line.node_count > 0){\r\n    args = push_array_no_zero(scratch.arena, char*, options->cmd_line.node_count + 1);\r\n    char **arg_ptr = args;\r\n    for (String8Node *node = options->cmd_line.first;\r\n         node != 0;\r\n         node = node->next, arg_ptr += 1){\r\n      String8 string = push_str8_copy(scratch.arena, node->string);\r\n      *arg_ptr = (char*)string.str;\r\n    }\r\n    *arg_ptr = 0;\r\n    binary = args[0];\r\n  }\r\n  \r\n  char *path = 0;\r\n  {\r\n    String8 string = push_str8_copy(scratch.arena, options->path);\r\n    path = (char*)string.str;\r\n  }\r\n  \r\n  char **env = 0;\r\n  if (options->env.node_count > 0){\r\n    env = push_array_no_zero(scratch.arena, char*, options->env.node_count + 1);\r\n    char **env_ptr = env;\r\n    for (String8Node *node = options->env.first;\r\n         node != 0;\r\n         node = node->next, env_ptr += 1){\r\n      String8 string = push_str8_copy(scratch.arena, node->string);\r\n      *env_ptr = (char*)string.str;\r\n    }\r\n    *env_ptr = 0;\r\n  }\r\n  \r\n  // fork\r\n  if (binary != 0){\r\n    pid_t pid = fork();\r\n    if (pid == -1){\r\n      // TODO(allen): fork error\r\n    }\r\n    else if (pid == 0){\r\n      // NOTE(allen): child process\r\n      int ptrace_result = ptrace(PTRACE_TRACEME, 0, 0, 0);\r\n      if (ptrace_result != -1){\r\n        int chdir_result = chdir(path);\r\n        if (chdir_result != -1){\r\n          execve(binary, args, env);\r\n        }\r\n      }\r\n      // failed to init fully; abort so the parent can clean up the child\r\n      abort();\r\n    }\r\n    else{\r\n      // NOTE(allen): parent process\r\n      \r\n      // wait for child\r\n      int status = 0;\r\n      pid_t wait_id = waitpid(pid, &status, __WALL);\r\n      \r\n      // determine child launch status\r\n      enum{\r\n        LaunchCode_Null,\r\n        LaunchCode_FailBeforePtrace,\r\n        LaunchCode_FailAfterPtrace,\r\n        LaunchCode_Success,\r\n      };\r\n      U32 launch_result = LaunchCode_Null;\r\n      // NOTE(allen): if wait_id != pid we don't know what that means; study that case before\r\n      // deciding how error handling around it works.\r\n      if (wait_id == pid){\r\n        if (WIFSTOPPED(status)){\r\n          if (WSTOPSIG(status) == SIGTRAP){\r\n            launch_result = LaunchCode_Success;\r\n          }\r\n          else{\r\n            launch_result = LaunchCode_FailAfterPtrace;\r\n          }\r\n        }\r\n        else{\r\n          launch_result = LaunchCode_FailBeforePtrace;\r\n        }\r\n      }\r\n      \r\n      // handle launch result\r\n      switch (launch_result){\r\n        default:\r\n        {\r\n          // TODO(allen): error that we do not understand\r\n        }break;\r\n        \r\n        case LaunchCode_FailBeforePtrace:\r\n        {\r\n          // TODO(allen): child ptrace init failed\r\n        }break;\r\n        \r\n        case LaunchCode_FailAfterPtrace:\r\n        {\r\n          // need to specifically pull the exit status out of the child\r\n          // or it will sit around as a zombie forever since it is ptraced.\r\n          B32 cleanup_good = false;\r\n          int detach_result = ptrace(PTRACE_DETACH, pid, 0, (void*)SIGCONT);\r\n          if (detach_result != -1){\r\n            int status_cleanup = 0;\r\n            pid_t wait_id_cleanup = waitpid(pid, &status_cleanup, __WALL);\r\n            if (wait_id_cleanup == pid){\r\n              cleanup_good = true;\r\n            }\r\n          }\r\n          if (cleanup_good){\r\n            // TODO(allen): child init failed\r\n          }\r\n          else{\r\n            // TODO(allen): child init failed; something went wrong and a process may have leaked\r\n          }\r\n        }break;\r\n        \r\n        case LaunchCode_Success:\r\n        {\r\n          int setoptions_result = ptrace(PTRACE_SETOPTIONS, pid, 0, PtrFromInt(demon_lnx_ptrace_options));\r\n          if (setoptions_result == -1){\r\n            // TODO(allen): ptrace setup failed; need to kill the child and clean it up\r\n          }\r\n          else{\r\n            result = pid;\r\n            \r\n            Arch arch = demon_lnx_arch_from_pid(pid);\r\n            \r\n            // process entity\r\n            DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, pid);\r\n            demon_proc_count += 1;\r\n            process->arch = arch;\r\n            process->ext_u64 = demon_lnx_open_memory_fd_for_pid(pid);\r\n            \r\n            // thread entity\r\n            DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, pid);\r\n            demon_thread_count += 1;\r\n            \r\n            // process event\r\n            {\r\n              DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events,\r\n                                                DEMON_EventKind_CreateProcess);\r\n              e->process = demon_ent_handle_from_ptr(process);\r\n            }\r\n            \r\n            // thread event\r\n            {\r\n              DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events,\r\n                                                DEMON_EventKind_CreateThread);\r\n              e->process = demon_ent_handle_from_ptr(process);\r\n              e->thread = demon_ent_handle_from_ptr(thread);\r\n            }\r\n            \r\n            // get module list\r\n            DEMON_LNX_ModuleNode *module_list = demon_lnx_module_list_from_process(scratch.arena, process);\r\n            \r\n            // for each module ...\r\n            for (DEMON_LNX_ModuleNode *node = module_list;\r\n                 node != 0;\r\n                 node = node->next){\r\n              // module entity\r\n              DEMON_Entity *module = demon_ent_new(process, DEMON_EntityKind_Module, node->vaddr);\r\n              demon_module_count += 1;\r\n              module->ext_u64 = node->name;\r\n              \r\n              // event\r\n              {\r\n                DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events,\r\n                                                  DEMON_EventKind_LoadModule);\r\n                e->process = demon_ent_handle_from_ptr(process);\r\n                e->module = demon_ent_handle_from_ptr(module);\r\n                e->address = node->vaddr;\r\n                e->size = node->size;\r\n              }\r\n            }\r\n            \r\n            // handshake event\r\n            {\r\n              DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events,\r\n                                                DEMON_EventKind_HandshakeComplete);\r\n              e->process = demon_ent_handle_from_ptr(process);\r\n              e->thread = demon_ent_handle_from_ptr(thread);\r\n            }\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_attach_process(U32 pid){\r\n  B32 result = false;\r\n  \r\n  Temp scratch = scratch_begin(0, 0);\r\n  DEMON_LNX_AttachNode *attachments = 0;\r\n  DEMON_LNX_AttachNode *the_process = 0;\r\n  \r\n  // TODO(allen): double check that this logic only lets us\r\n  // \"attach\" when pid is the id of the main thread of a process.\r\n  \r\n  // attach this process\r\n  B32 attached_proc = false;\r\n  if (kill(pid, 0) == -1){\r\n    // TODO(allen): process does not exist\r\n  }\r\n  else{\r\n    attached_proc = demon_lnx_attach_pid(scratch.arena, pid, &the_process);\r\n    if (the_process != 0){\r\n      SLLStackPush(attachments, the_process);\r\n    }\r\n  }\r\n  \r\n  // open thread list\r\n  if (attached_proc){\r\n    String8 threads_path = push_str8f(scratch.arena, \"/proc/%d/task\", pid);\r\n    DIR *proc_dir = opendir((char*)threads_path.str);\r\n    if (proc_dir == 0){\r\n      // TODO(allen): could not read proc threads somehow; no good!\r\n    }\r\n    else{\r\n      \r\n      // attach all threads\r\n      B32 attached_all_threads = true;\r\n      for (;;){\r\n        struct dirent *entry = readdir(proc_dir);\r\n        if (entry == 0){\r\n          break;\r\n        }\r\n        \r\n        String8 name = str8_cstring(entry->d_name);\r\n        if (str8_is_integer(name, 10)){\r\n          pid_t tid = u64_from_str8(name, 10);\r\n          if (tid != pid){\r\n            DEMON_LNX_AttachNode *new_attachment = 0;\r\n            B32 attached_this_thread = demon_lnx_attach_pid(scratch.arena, tid, &new_attachment);\r\n            if (new_attachment != 0){\r\n              SLLStackPush(attachments, new_attachment);\r\n            }\r\n            if (!attached_this_thread){\r\n              attached_all_threads = false;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      closedir(proc_dir);\r\n      \r\n      if (attached_all_threads){\r\n        result = true;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // initialize new entities on success\r\n  if (result){\r\n    Arch arch = demon_lnx_arch_from_pid(the_process->pid);\r\n    \r\n    // process entity\r\n    DEMON_Entity *process = demon_ent_new(demon_ent_root, DEMON_EntityKind_Process, the_process->pid);\r\n    demon_proc_count += 1;\r\n    process->arch = arch;\r\n    process->ext_u64 = demon_lnx_open_memory_fd_for_pid(the_process->pid);\r\n    \r\n    // process event\r\n    {\r\n      DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events,\r\n                                        DEMON_EventKind_CreateProcess);\r\n      e->process = demon_ent_handle_from_ptr(process);\r\n    }\r\n    \r\n    // TODO(allen): happens on windows here?\r\n    \r\n    for (DEMON_LNX_AttachNode *node = attachments;\r\n         node != 0;\r\n         node = node->next){\r\n      DEMON_Entity *thread = demon_ent_new(process, DEMON_EntityKind_Thread, node->pid);\r\n      demon_thread_count += 1;\r\n      \r\n      // thread event\r\n      {\r\n        DEMON_Event *e = demon_push_event(demon_lnx_event_arena, &demon_lnx_queued_events,\r\n                                          DEMON_EventKind_CreateThread);\r\n        e->process = demon_ent_handle_from_ptr(process);\r\n        e->thread = demon_ent_handle_from_ptr(thread);\r\n      }\r\n    }\r\n    \r\n    // TODO(allen): sync modules in process\r\n  }\r\n  \r\n  // cleanup on failure\r\n  else{\r\n    for (DEMON_LNX_AttachNode *node = attachments;\r\n         node != 0;\r\n         node = node->next){\r\n      ptrace(PTRACE_DETACH, node->pid, 0, (void*)SIGCONT);\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_kill_process(DEMON_Entity *process, U32 exit_code){\r\n  B32 result = false;\r\n  if (process != 0){\r\n    if (kill(process->id, SIGKILL) != -1){\r\n      result = true;\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_detach_process(DEMON_Entity *process){\r\n  B32 result = false;\r\n  if (process != 0){\r\n    int detach_result = ptrace(PTRACE_DETACH, process->id, 0, 0);\r\n    result = (detach_result != -1);\r\n  }\r\n  return(0);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @demon_os_hooks Entity Functions\r\n\r\n//- rjf: cleanup\r\n\r\ninternal void\r\ndemon_os_entity_cleanup(DEMON_Entity *entity)\r\n{\r\n  // NOTE(rjf): no-op\r\n}\r\n\r\n//- rjf: introspection\r\n\r\ninternal String8\r\ndemon_os_full_path_from_module(Arena *arena, DEMON_Entity *module){\r\n  DEMON_Entity *process = module->parent;\r\n  int memory_fd = (int)process->ext_u64;\r\n  U64 name_va = module->ext_u64;\r\n  String8 result = demon_lnx_read_memory_str(arena, memory_fd, name_va);\r\n  return(result);\r\n}\r\n\r\ninternal U64\r\ndemon_os_stack_base_vaddr_from_thread(DEMON_Entity *thread){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  U64 stack_base = 0;\r\n  \r\n  DEMON_Entity *process = thread->parent;\r\n  \r\n  // id for main thread is zero\r\n  B32 is_main_thread = (thread->id == process->id);\r\n  pid_t match_tid = is_main_thread ? 0 : thread->id;\r\n  \r\n  // open /proc/$pid/maps\r\n  int maps = demon_lnx_open_maps(process->id);\r\n  \r\n  // look for entry with stack markings and matching thread id\r\n  for (;;){\r\n    DEMON_LNX_MapsEntry e;\r\n    Temp temp = temp_begin(scratch.arena);\r\n    if (!demon_lnx_next_map(temp.arena, maps, &e)){\r\n      break;\r\n    }\r\n    if (e.type == DEMON_LNX_MapsEntryType_Stack && e.stack_tid == match_tid){\r\n      stack_base = e.address_lo;\r\n      break;\r\n    }\r\n    temp_end(temp);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return(stack_base);\r\n}\r\n\r\ninternal U64\r\ndemon_os_tls_root_vaddr_from_thread(DEMON_Entity *thread){\r\n  U64 result = 0;\r\n  switch (thread->arch){\r\n    case Arch_x64:\r\n    case Arch_x86:\r\n    {\r\n      U32 fsbase = 0;\r\n      pid_t tid = (pid_t)thread->id;\r\n      if (ptrace(PT_GETFSBASE, tid, (void*)&fsbase, 0) != -1){\r\n        result = (U64)fsbase;\r\n      }\r\n      if (thread->arch == Arch_x64){\r\n        result += 8;\r\n      }\r\n      else{\r\n        result += 4;\r\n      }\r\n    }break;\r\n  }\r\n  return(result);\r\n}\r\n\r\n//- rjf: target process memory allocation/protection\r\n\r\ninternal U64\r\ndemon_os_reserve_memory(DEMON_Entity *process, U64 size){\r\n  U64 result = 0;\r\n  NotImplemented;\r\n  return(result);\r\n}\r\n\r\ninternal void\r\ndemon_os_set_memory_protect_flags(DEMON_Entity *process, U64 page_vaddr, U64 size, DEMON_MemoryProtectFlags flags){\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\ndemon_os_release_memory(DEMON_Entity *process, U64 vaddr, U64 size){\r\n  NotImplemented;\r\n}\r\n\r\n//- rjf: target process memory reading/writing\r\n\r\ninternal U64\r\ndemon_os_read_memory(DEMON_Entity *process, void *dst, U64 src_address, U64 size){\r\n  int memory_fd = (int)process->ext_u64;\r\n  U64 result = demon_lnx_read_memory(memory_fd, dst, src_address, size);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_write_memory(DEMON_Entity *process, U64 dst_address, void *src, U64 size){\r\n  int memory_fd = (int)process->ext_u64;\r\n  B32 result = demon_lnx_write_memory(memory_fd, dst_address, src, size);\r\n  return(result);\r\n}\r\n\r\n//- rjf: thread registers reading/writing\r\n\r\ninternal B32\r\ndemon_os_read_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *dst){\r\n  B32 result = false;\r\n  NotImplemented;\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_write_regs_x86(DEMON_Entity *thread, SYMS_RegX86 *src){\r\n  B32 result = false;\r\n  NotImplemented;\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_read_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *dst){\r\n  pid_t tid = (pid_t)thread->id;\r\n  \r\n  // gpr\r\n  B32 got_gpr = false;\r\n  DEMON_LNX_UserX64 ctx = {0};\r\n  struct iovec iov_gpr = {0};\r\n  iov_gpr.iov_len = sizeof(ctx);\r\n  iov_gpr.iov_base = &ctx;\r\n  if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr) != -1){\r\n    demon_lnx_regs_x64_from_usr_regs_x64(dst, &ctx.regs);\r\n    got_gpr = true;\r\n  }\r\n  \r\n  // fpr\r\n  B32 got_fpr = false;\r\n  if (got_gpr){\r\n    B32 got_xsave = false;\r\n    {\r\n      U8 xsave_buffer[KB(4)];\r\n      struct iovec iov_xsave = {0};\r\n      iov_xsave.iov_len = sizeof(xsave_buffer);\r\n      iov_xsave.iov_base = xsave_buffer;\r\n      if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave) != -1){\r\n        SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer;\r\n        syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &xsave->legacy);\r\n        \r\n        // TODO(allen): this is a lie; ymm can technically move around\r\n        // we need some more low-level-assembly-fu to do this hardcore.\r\n        B32 has_ymm_registers = ((xsave->header.xstate_bv & 4) != 0);\r\n        if (has_ymm_registers){\r\n          syms_x64_regs__set_full_regs_from_xsave_avx_extension(dst, xsave->ymmh);\r\n        }\r\n        \r\n        got_xsave = true;\r\n      }\r\n    }\r\n    \r\n    B32 got_fxsave = false;\r\n    if (!got_xsave){\r\n      SYMS_XSaveLegacy fxsave = {0};\r\n      struct iovec iov_fxsave = {0};\r\n      iov_fxsave.iov_len = sizeof(fxsave);\r\n      iov_fxsave.iov_base = &fxsave;\r\n      if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave) != -1){\r\n        syms_x64_regs__set_full_regs_from_xsave_legacy(dst, &fxsave);\r\n        got_fxsave = true;\r\n      }\r\n    }\r\n    \r\n    if (got_xsave || got_fxsave){\r\n      got_fpr = true;\r\n    }\r\n  }\r\n  \r\n  // debug\r\n  B32 got_debug = false;\r\n  if (got_fpr){\r\n    got_debug = true;\r\n    SYMS_Reg32 *dr_d = &dst->dr0;\r\n    for (U32 i = 0; i < 8; i += 1, dr_d += 1){\r\n      if (i != 4 && i != 5){\r\n        U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]);\r\n        errno = 0;\r\n        int peek_result = ptrace(PTRACE_PEEKUSER, tid, PtrFromInt(offset), 0);\r\n        if (errno == 0){\r\n          dr_d->u32 = (U32)peek_result;\r\n        }\r\n        else{\r\n          got_debug = false;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  // got everything\r\n  B32 result = got_debug;\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\ndemon_os_write_regs_x64(DEMON_Entity *thread, SYMS_RegX64 *src){\r\n  pid_t tid = (pid_t)thread->id;\r\n  \r\n  // gpr\r\n  DEMON_LNX_UserX64 ctx = {0};\r\n  demon_lnx_usr_regs_x64_from_regs_x64(&ctx.regs, src);\r\n  \r\n  struct iovec iov_gpr = {0};\r\n  iov_gpr.iov_base = &ctx;\r\n  iov_gpr.iov_len = sizeof(ctx);\r\n  int gpr_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_PRSTATUS, &iov_gpr);\r\n  B32 gpr_success = (gpr_result != -1);\r\n  \r\n  // fpr\r\n  int xsave_result = 0;\r\n  int fxsave_result = 0;\r\n  \r\n  {\r\n    U8 xsave_buffer[KB(4)] = {0};\r\n    SYMS_XSave *xsave = (SYMS_XSave*)xsave_buffer;\r\n    syms_x64_regs__set_xsave_legacy_from_full_regs(&xsave->legacy, src);\r\n    \r\n    xsave->header.xstate_bv = 7;\r\n    \r\n    // TODO(allen): this is a lie; ymm can technically move around\r\n    // we need some more low-level-assembly-fu to do this hardcore.\r\n    syms_x64_regs__set_xsave_avx_extension_from_full_regs(xsave->ymmh, src);\r\n    \r\n    {\r\n      struct iovec iov_xsave = {0};\r\n      iov_xsave.iov_base = &xsave;\r\n      iov_xsave.iov_len = sizeof(xsave);\r\n      xsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_X86_XSTATE, &iov_xsave);\r\n    }\r\n    \r\n    if (xsave_result == -1){\r\n      struct iovec iov_fxsave = {0};\r\n      iov_fxsave.iov_base = &xsave->legacy;\r\n      iov_fxsave.iov_len = sizeof(xsave->legacy);\r\n      fxsave_result = ptrace(PTRACE_SETREGSET, tid, (void*)NT_FPREGSET, &iov_fxsave);\r\n    }\r\n  }\r\n  \r\n  B32 fpr_success = (xsave_result != -1 || fxsave_result != -1);\r\n  \r\n  // debug\r\n  B32 dr_success = true;\r\n  {\r\n    SYMS_Reg32 *dr_s = &src->dr0;\r\n    for (U32 i = 0; i < 8; i += 1, dr_s += 1){\r\n      if (i != 4 && i != 5){\r\n        U64 offset = OffsetOf(DEMON_LNX_UserX64, u_debugreg[i]);\r\n        errno = 0;\r\n        int poke_result = ptrace(PTRACE_POKEUSER, tid, PtrFromInt(offset), dr_s->u32);\r\n        if (poke_result == -1){\r\n          dr_success = false;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  // assemble result\r\n  B32 result = (gpr_success && fpr_success && dr_success);\r\n  \r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @demon_os_hooks Process Listing\r\n\r\ninternal void\r\ndemon_os_proc_iter_begin(DEMON_ProcessIter *iter){\r\n  DIR *dir = opendir(\"/proc\");\r\n  MemoryZeroStruct(iter);\r\n  iter->v[0] = IntFromPtr(dir);\r\n}\r\n\r\ninternal B32\r\ndemon_os_proc_iter_next(Arena *arena, DEMON_ProcessIter *iter, DEMON_ProcessInfo *info_out){\r\n  // scan for a process id\r\n  B32 got_pid = false;\r\n  String8 pid_string = {0};\r\n  \r\n  DIR *dir = (DIR*)PtrFromInt(iter->v[0]);\r\n  if (dir != 0 && iter->v[1] == 0){\r\n    for (;;){\r\n      struct dirent *d = readdir(dir);\r\n      if (d == 0){\r\n        break;\r\n      }\r\n      \r\n      // check file name is integer\r\n      String8 file_name = str8_cstring((char*)d->d_name);\r\n      B32 is_integer = str8_is_integer(file_name, 10);\r\n      \r\n      // break on integers (which represent processes)\r\n      if (is_integer){\r\n        got_pid = true;\r\n        pid_string = file_name;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // mark iterator dead if nothing found\r\n  if (!got_pid){\r\n    iter->v[1] = 1;\r\n  }\r\n  \r\n  // if got process id convert pid -> process info\r\n  B32 result = false;\r\n  if (got_pid){\r\n    // determine the name we will report\r\n    pid_t pid = u64_from_str8(pid_string, 10);\r\n    String8 name = demon_lnx_executable_path_from_pid(arena, pid);\r\n    if (name.size == 0){\r\n      name = str8_lit(\"<name-not-resolved>\");\r\n    }\r\n    \r\n    // finish conversion\r\n    info_out->name = name;\r\n    info_out->pid = pid;\r\n    result = true;\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal void\r\ndemon_os_proc_iter_end(DEMON_ProcessIter *iter){\r\n  DIR *dir = (DIR*)PtrFromInt(iter->v[0]);\r\n  if (dir != 0){\r\n    closedir(dir);\r\n  }\r\n  MemoryZeroStruct(iter);\r\n}\r\n"
  },
  {
    "path": "src/demon/linux/demon_os_linux.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DEMON_OS_LINUX_H\r\n#define DEMON_OS_LINUX_H\r\n\r\n// TODO(allen): Potential Upgrades:\r\n//\r\n// memory fd upgrade - Right now for each process we hold open a file\r\n//  descriptor for the process's memory (/proc/%d/mem) for the entire lifetime\r\n//  of the process; it could be opened and closed with some kind of LRU cache\r\n//  to put a finite cap on the number of handles the demon holds\r\n//\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Get The Linux Includes\r\n\r\n#include <sys/ptrace.h>\r\n#include <sys/types.h>\r\n#include <sys/wait.h>\r\n#include <unistd.h>\r\n#include <elf.h>\r\n#include <dirent.h>\r\n#include <errno.h>\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Linux Demon Types\r\n\r\n//- entities\r\n\r\n// Demon Linux Entity Extensions\r\n//  Process: ext_u64 set to memory file descriptor\r\n//  Thread : ext_u64 cast to DEMON_LNX_ThreadExt\r\n//  Module : ext_u64 set to U64 (address of name)\r\n\r\nstruct DEMON_LNX_ThreadExt{\r\n  B32 expecting_dummy_sigstop;\r\n};\r\nStaticAssert(sizeof(DEMON_LNX_ThreadExt) <= sizeof(Member(DEMON_Entity, ext_u64)), check_demon_lnx_thread_ext);\r\n\r\n//- helpers\r\n\r\nstruct DEMON_LNX_AttachNode{\r\n  DEMON_LNX_AttachNode *next;\r\n  pid_t pid;\r\n};\r\n\r\nstruct DEMON_LNX_ProcessAux{\r\n  B32 filled;\r\n  U64 phnum;\r\n  U64 phent;\r\n  U64 phdr;\r\n  U64 execfn;\r\n};\r\n\r\nstruct DEMON_LNX_PhdrInfo{\r\n  Rng1U64 range;\r\n  U64 dynamic;\r\n};\r\n\r\nstruct DEMON_LNX_ModuleNode{\r\n  DEMON_LNX_ModuleNode *next;\r\n  U64 vaddr;\r\n  U64 size;\r\n  U64 name;\r\n  U64 already_known;\r\n};\r\n\r\nstruct DEMON_LNX_EntityNode{\r\n  DEMON_LNX_EntityNode *next;\r\n  DEMON_Entity *entity;\r\n};\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Linux Demon Register Layouts\r\n\r\n// these are defined in <sys/user.h> but only for one architecture at a time\r\n//  (and we can't really trick it into giving us both in any obvious way)\r\n// we define them here so that we have them all \"at once\"\r\n\r\nstruct DEMON_LNX_UserRegsX64{\r\n  U64 r15;\r\n\tU64 r14;\r\n\tU64 r13;\r\n\tU64 r12;\r\n\tU64 rbp;\r\n\tU64 rbx;\r\n\tU64 r11;\r\n\tU64 r10;\r\n\tU64 r9;\r\n\tU64 r8;\r\n\tU64 rax;\r\n\tU64 rcx;\r\n\tU64 rdx;\r\n\tU64 rsi;\r\n\tU64 rdi;\r\n\tU64 orig_rax;\r\n\tU64 rip;\r\n\tU64 cs;\r\n\tU64 rflags;\r\n\tU64 rsp;\r\n\tU64 ss;\r\n\tU64 fsbase;\r\n\tU64 gsbase;\r\n\tU64 ds;\r\n\tU64 es;\r\n\tU64 fs;\r\n\tU64 gs;\r\n};\r\n\r\nstruct DEMON_LNX_UserX64{\r\n  DEMON_LNX_UserRegsX64 regs;\r\n  S32 u_fpvalid, _pad0;\r\n  SYMS_XSaveLegacy i387;\r\n  U64 u_tsize, u_dsize, u_ssize, start_code, start_stack;\r\n  U64 signal;\r\n  S32 reserved, _pad1;\r\n  U64 u_ar0, u_fpstate;\r\n  U64 magic;\r\n  U8  u_comm[32];\r\n  U64 u_debugreg[8];\r\n};\r\n\r\nstruct DEMON_LNX_UserRegsX86{\r\n  U32 ebx;\r\n\tU32 ecx;\r\n\tU32 edx;\r\n\tU32 esi;\r\n\tU32 edi;\r\n\tU32 ebp;\r\n\tU32 eax;\r\n\tU32 ds;\r\n\tU32 es;\r\n\tU32 fs;\r\n\tU32 gs;\r\n\tU32 orig_eax;\r\n\tU32 eip;\r\n\tU32 cs;\r\n\tU32 eflags;\r\n\tU32 sp;\r\n\tU32 ss;\r\n};\r\n\r\nstruct DEMON_LNX_UserX86{\r\n  DEMON_LNX_UserRegsX86 regs;\r\n  S32 u_fpvalid;\r\n  SYMS_FSave i387;\r\n  U32 u_tsize, u_dsize, u_ssize, start_code, start_stack;\r\n  S32 signal, reserved;\r\n  U32 u_ar0, u_fpstate;\r\n  U32 magic;\r\n  U8  u_comm[32];\r\n  U32 u_debugreg[8];\r\n};\r\n\r\n////////////////////////////////\r\n\r\nenum\r\n{\r\n  DEMON_LNX_PermFlags_Read    = (1 << 0),\r\n  DEMON_LNX_PermFlags_Write   = (1 << 1),\r\n  DEMON_LNX_PermFlags_Exec    = (1 << 2),\r\n  DEMON_LNX_PermFlags_Private = (1 << 3)\r\n};\r\ntypedef int DEMON_LNX_PermFlags;\r\n\r\nenum\r\n{\r\n  DEMON_LNX_MapsEntryType_Null,\r\n  DEMON_LNX_MapsEntryType_Path,\r\n  DEMON_LNX_MapsEntryType_Heap,\r\n  DEMON_LNX_MapsEntryType_Stack,\r\n  DEMON_LNX_MapsEntryType_VDSO,\r\n};\r\ntypedef int DEMON_LNX_MapsEntryType;\r\n\r\nstruct DEMON_LNX_MapsEntry\r\n{\r\n  U64 address_lo;\r\n  U64 address_hi;\r\n  DEMON_LNX_PermFlags perms;\r\n  U64 offset;\r\n  U32 dev_major;\r\n  U32 dev_minor;\r\n  U64 inode;\r\n  String8 pathname;\r\n  DEMON_LNX_MapsEntryType type;\r\n  pid_t stack_tid;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DEMON_LNX_ThreadExt*  demon_lnx_thread_ext(DEMON_Entity *entity);\r\n\r\ninternal B32                   demon_lnx_attach_pid(Arena *arena, pid_t pid, DEMON_LNX_AttachNode **new_node);\r\n\r\ninternal String8               demon_lnx_executable_path_from_pid(Arena *arena, pid_t pid);\r\ninternal int                   demon_lnx_open_memory_fd_for_pid(pid_t pid);\r\n\r\ninternal Arch          demon_lnx_arch_from_pid(pid_t pid);\r\ninternal DEMON_LNX_ProcessAux  demon_lnx_aux_from_pid(pid_t pid, Arch arch);\r\ninternal DEMON_LNX_PhdrInfo    demon_lnx_phdr_info_from_memory(int memory_fd, B32 is_32bit,\r\n                                                               U64 phvaddr, U64 phstride, U64 phcount);\r\ninternal DEMON_LNX_ModuleNode* demon_lnx_module_list_from_process(Arena *arena, DEMON_Entity *process);\r\n\r\ninternal U64     demon_lnx_read_memory(int memory_fd, void *dst, U64 src, U64 size);\r\ninternal B32     demon_lnx_write_memory(int memory_fd, U64 dst, void *src, U64 size);\r\ninternal String8 demon_lnx_read_memory_str(Arena *arena, int memory_fd, U64 address);\r\n\r\ninternal void demon_lnx_regs_x64_from_usr_regs_x64(SYMS_RegX64 *dst, DEMON_LNX_UserRegsX64 *src);\r\ninternal void demon_lnx_usr_regs_x64_from_regs_x64(DEMON_LNX_UserRegsX64 *dst, SYMS_RegX64 *src);\r\n\r\ninternal String8 demon_lnx_read_int_string(int fd);\r\ninternal B32     demon_lnx_read_expect(int fd, char expect);\r\ninternal int     demon_lnx_read_whitespace(int fd);\r\ninternal String8 demon_lnx_read_string(Arena *arena, int fd);\r\n\r\ninternal int demon_lnx_open_maps(pid_t pid);\r\ninternal B32 demon_lnx_next_map(Arena *arena, int maps, DEMON_LNX_MapsEntry *entry_out);\r\n\r\n#endif //DEMON_OS_LINUX_H\r\n"
  },
  {
    "path": "src/demon/win32/demon_core_win32.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64\r\ndmn_w32_hash_from_string(String8 string)\r\n{\r\n  U64 result = 5381;\r\n  for(U64 i = 0; i < string.size; i += 1)\r\n  {\r\n    result = ((result << 5) + result) + string.str[i];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ndmn_w32_hash_from_id(U64 id)\r\n{\r\n  return dmn_w32_hash_from_string(str8_struct(&id));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Helpers\r\n\r\n//- rjf: entity <-> handle\r\n\r\ninternal DMN_Handle\r\ndmn_w32_handle_from_entity(DMN_W32_Entity *entity)\r\n{\r\n  U32 idx = (U32)(entity - dmn_w32_shared->entities_base);\r\n  U32 gen = entity->gen;\r\n  DMN_Handle handle = {idx, gen};\r\n  return handle;\r\n}\r\n\r\ninternal DMN_W32_Entity *\r\ndmn_w32_entity_from_handle(DMN_Handle handle)\r\n{\r\n  U32 idx = handle.u32[0];\r\n  U32 gen = handle.u32[1];\r\n  DMN_W32_Entity *entity = dmn_w32_shared->entities_base + idx;\r\n  if(entity->gen != gen)\r\n  {\r\n    entity = &dmn_w32_entity_nil;\r\n  }\r\n  return entity;\r\n}\r\n\r\n//- rjf: entity allocation/deallocation\r\n\r\ninternal DMN_W32_Entity *\r\ndmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id)\r\n{\r\n  // rjf: allocate\r\n  DMN_W32_Entity *e = dmn_w32_shared->entities_first_free;\r\n  {\r\n    U32 gen = 0;\r\n    if(e != 0)\r\n    {\r\n      SLLStackPop(dmn_w32_shared->entities_first_free);\r\n      gen = e->gen;\r\n    }\r\n    else\r\n    {\r\n      e = push_array_no_zero(dmn_w32_shared->entities_arena, DMN_W32_Entity, 1);\r\n      dmn_w32_shared->entities_count += 1;\r\n    }\r\n    MemoryZeroStruct(e);\r\n    e->gen = gen+1;\r\n  }\r\n  \r\n  // rjf: fill\r\n  {\r\n    e->kind = kind;\r\n    e->id = id;\r\n    e->parent = parent;\r\n    e->next = e->prev = e->first = e->last = &dmn_w32_entity_nil;\r\n    if(parent != &dmn_w32_entity_nil)\r\n    {\r\n      DLLPushBack_NPZ(&dmn_w32_entity_nil, parent->first, parent->last, e, next, prev);\r\n    }\r\n  }\r\n  \r\n  // rjf: insert into id -> entity map\r\n  if(id != 0)\r\n  {\r\n    U64 hash = dmn_w32_hash_from_id(id);\r\n    U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count;\r\n    DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx];\r\n    DMN_W32_EntityIDHashNode *node = 0;\r\n    for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(n->id == id)\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      node = dmn_w32_shared->entities_id_hash_node_free;\r\n      if(node != 0)\r\n      {\r\n        SLLStackPop(dmn_w32_shared->entities_id_hash_node_free);\r\n      }\r\n      else\r\n      {\r\n        node = push_array(dmn_w32_shared->arena, DMN_W32_EntityIDHashNode, 1);\r\n      }\r\n      DLLPushBack(slot->first, slot->last, node);\r\n    }\r\n    node->id = id;\r\n    node->entity = e;\r\n  }\r\n  \r\n  return e;\r\n}\r\n\r\ninternal void\r\ndmn_w32_entity_release(DMN_W32_Entity *entity)\r\n{\r\n  // rjf: unhook root\r\n  if(entity->parent != &dmn_w32_entity_nil)\r\n  {\r\n    DLLRemove_NPZ(&dmn_w32_entity_nil, entity->parent->first, entity->parent->last, entity, next, prev);\r\n  }\r\n  \r\n  // rjf: walk every entity in this tree, free each\r\n  if(entity != &dmn_w32_entity_nil)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      DMN_W32_Entity *e;\r\n    };\r\n    Task start_task = {0, entity};\r\n    Task *first_task = &start_task;\r\n    Task *last_task = &start_task;\r\n    for(Task *t = first_task; t != 0; t = t->next)\r\n    {\r\n      for(DMN_W32_Entity *child = t->e->first; child != &dmn_w32_entity_nil; child = child->next)\r\n      {\r\n        Task *t = push_array(scratch.arena, Task, 1);\r\n        t->e = child;\r\n        SLLQueuePush(first_task, last_task, t);\r\n      }\r\n      \r\n      // rjf: free entity\r\n      SLLStackPush(dmn_w32_shared->entities_first_free, t->e);\r\n      t->e->gen += 1;\r\n      if(t->e->kind == DMN_W32_EntityKind_Module)\r\n      {\r\n        CloseHandle(t->e->handle);\r\n      }\r\n      t->e->kind = DMN_W32_EntityKind_Null;\r\n      \r\n      // rjf: remove from id -> entity map\r\n      if(t->e->id != 0)\r\n      {\r\n        U64 hash = dmn_w32_hash_from_id(t->e->id);\r\n        U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count;\r\n        DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx];\r\n        DMN_W32_EntityIDHashNode *node = 0;\r\n        for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next)\r\n        {\r\n          if(n->id == t->e->id && n->entity == t->e)\r\n          {\r\n            DLLRemove(slot->first, slot->last, n);\r\n            SLLStackPush(dmn_w32_shared->entities_id_hash_node_free, n);\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\n//- rjf: kind*id -> entity\r\n\r\ninternal DMN_W32_Entity *\r\ndmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id)\r\n{\r\n  DMN_W32_Entity *result = &dmn_w32_entity_nil;\r\n  U64 hash = dmn_w32_hash_from_id(id);\r\n  U64 slot_idx = hash%dmn_w32_shared->entities_id_hash_slots_count;\r\n  DMN_W32_EntityIDHashSlot *slot = &dmn_w32_shared->entities_id_hash_slots[slot_idx];\r\n  DMN_W32_EntityIDHashNode *node = 0;\r\n  for(DMN_W32_EntityIDHashNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(n->entity->kind == kind && n->id == id)\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node != 0)\r\n  {\r\n    result = node->entity;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Module Info Extraction\r\n\r\ninternal String8\r\ndmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: extract path from module\r\n  String16 path16 = {0};\r\n  String8 path8 = {0};\r\n  {\r\n    // rjf: handle -> full path\r\n    if(module->handle != 0)\r\n    {\r\n      DWORD cap16 = GetFinalPathNameByHandleW(module->handle, 0, 0, VOLUME_NAME_DOS);\r\n      U16 *buffer16 = push_array_no_zero(scratch.arena, U16, cap16);\r\n      DWORD size16 = GetFinalPathNameByHandleW(module->handle, (WCHAR*)buffer16, cap16, VOLUME_NAME_DOS);\r\n      path16 = str16(buffer16, size16);\r\n    }\r\n    \r\n    // rjf: fallback (main module only): process -> full path\r\n    if(path16.size == 0 && module->module.is_main)\r\n    {\r\n      DMN_W32_Entity *process = module->parent;\r\n      DWORD size = KB(4);\r\n      U16 *buf = push_array_no_zero(scratch.arena, U16, size);\r\n      if(QueryFullProcessImageNameW(process->handle, 0, (WCHAR*)buf, &size))\r\n      {\r\n        path16 = str16(buf, size);\r\n      }\r\n    }\r\n    \r\n    // rjf: fallback (any module - no guarantee): address_of_name -> full path\r\n    if(path16.size == 0 && module->module.address_of_name_pointer != 0)\r\n    {\r\n      DMN_W32_Entity *process = module->parent;\r\n      U64 ptr_size = bit_size_from_arch(process->arch)/8;\r\n      U64 name_pointer = 0;\r\n      if(dmn_w32_process_read(process->handle, r1u64(module->module.address_of_name_pointer, module->module.address_of_name_pointer+ptr_size), &name_pointer))\r\n      {\r\n        if(name_pointer != 0)\r\n        {\r\n          if(module->module.name_is_unicode)\r\n          {\r\n            path16 = dmn_w32_read_memory_str16(scratch.arena, process->handle, name_pointer);\r\n          }\r\n          else\r\n          {\r\n            path8 = dmn_w32_read_memory_str(scratch.arena, process->handle, name_pointer);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: produce finalized result\r\n  String8 result = {0};\r\n  {\r\n    if(path16.size > 0)\r\n    {\r\n      // rjf: skip the extended path thing if necessary\r\n      if(path16.size >= 4 &&\r\n         path16.str[0] == L'\\\\' &&\r\n         path16.str[1] == L'\\\\' &&\r\n         path16.str[2] == L'?' &&\r\n         path16.str[3] == L'\\\\')\r\n      {\r\n        path16.size -= 4;\r\n        path16.str += 4;\r\n      }\r\n      \r\n      // rjf: convert to UTF-8\r\n      result = str8_from_16(arena, path16);\r\n    }\r\n    else\r\n    {\r\n      // rjf: skip the extended path thing if necessary\r\n      if (path8.size >= 4 &&\r\n          path8.str[0] == L'\\\\' &&\r\n          path8.str[1] == L'\\\\' &&\r\n          path8.str[2] == L'?' &&\r\n          path8.str[3] == L'\\\\')\r\n      {\r\n        path8.size -= 4;\r\n        path8.str += 4;\r\n      }\r\n      \r\n      // rjf: copy to output arena\r\n      result = push_str8_copy(arena, path8);\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Win32-Level Process/Thread Reads/Writes\r\n\r\n//- rjf: processes\r\n\r\ninternal U64\r\ndmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst)\r\n{\r\n  U64 bytes_read = 0;\r\n  U8 *ptr = (U8*)dst;\r\n  U8 *opl = ptr + dim_1u64(range);\r\n  U64 cursor = range.min;\r\n  for(;ptr < opl;)\r\n  {\r\n    SIZE_T to_read = (SIZE_T)(opl - ptr);\r\n    SIZE_T actual_read = 0;\r\n    if(!ReadProcessMemory(process, (LPCVOID)cursor, ptr, to_read, &actual_read))\r\n    {\r\n      DWORD error = GetLastError();\r\n      log_infof(\"'Win32 ReadProcessMemory failure': { [0x%I64x, 0x%I64x), code: %i }\\n\", range.min, range.max, error);\r\n      // NOTE(rjf): I have discovered that `actual_read` is *NOT* guaranteed to have\r\n      // a usable value if `ReadProcessMemory` fails!\r\n      // bytes_read += actual_read;\r\n      (void)error;\r\n      break;\r\n    }\r\n    ptr += actual_read;\r\n    cursor += actual_read;\r\n    bytes_read += actual_read;\r\n  }\r\n  return bytes_read;\r\n}\r\n\r\ninternal B32\r\ndmn_w32_process_write(HANDLE process, Rng1U64 range, void *src)\r\n{\r\n  B32 result = 1;\r\n  U8 *ptr = (U8*)src;\r\n  U8 *opl = ptr + dim_1u64(range);\r\n  U64 cursor = range.min;\r\n  for(;ptr < opl;)\r\n  {\r\n    SIZE_T to_write = (SIZE_T)(opl - ptr);\r\n    SIZE_T actual_write = 0;\r\n    if(!WriteProcessMemory(process, (LPVOID)cursor, ptr, to_write, &actual_write))\r\n    {\r\n      result = 0;\r\n      break;\r\n    }\r\n    ptr += actual_write;\r\n    cursor += actual_write;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address)\r\n{\r\n  // TODO(rjf): @rewrite\r\n  //\r\n  // OLD: this could be done better with a demon_w32_read_memory\r\n  // that returns a read amount instead of a success/fail.\r\n  //\r\n  // (dmn_w32_process_read now does this, so we can switch to it)\r\n  \r\n  // scan piece by piece\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  \r\n  U64 max_cap = 256;\r\n  U64 cap = max_cap;\r\n  U64 read_p = address;\r\n  for (;;){\r\n    U8 *block = push_array(scratch.arena, U8, cap);\r\n    for (;cap > 0;){\r\n      if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){\r\n        break;\r\n      }\r\n      cap /= 2;\r\n    }\r\n    read_p += cap;\r\n    \r\n    U64 block_opl = 0;\r\n    for (;block_opl < cap; block_opl += 1){\r\n      if (block[block_opl] == 0){\r\n        break;\r\n      }\r\n    }\r\n    \r\n    if (block_opl > 0){\r\n      str8_list_push(scratch.arena, &list, str8(block, block_opl));\r\n    }\r\n    \r\n    if (block_opl < cap || cap == 0){\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // assemble results\r\n  String8 result = str8_list_join(arena, &list, 0);\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal String16\r\ndmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address)\r\n{\r\n  // TODO(rjf): @rewrite\r\n  //\r\n  // OLD: this could be done better with a demon_w32_read_memory\r\n  // that returns a read amount instead of a success/fail.\r\n  //\r\n  // (dmn_w32_process_read now does this, so we can switch to it)\r\n  \r\n  // scan piece by piece\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  \r\n  U64 max_cap = 256;\r\n  U64 cap = max_cap;\r\n  U64 read_p = address;\r\n  for (;;){\r\n    U8 *block = push_array(scratch.arena, U8, cap);\r\n    for (;cap > 1;){\r\n      if (dmn_w32_process_read(process_handle, r1u64(read_p, read_p+cap), block)){\r\n        break;\r\n      }\r\n      cap /= 2;\r\n    }\r\n    read_p += cap;\r\n    \r\n    U16 *block16 = (U16*)block;\r\n    (void)block16;\r\n    U64 block_opl = 0;\r\n    for (;block_opl < cap; block_opl += 2){\r\n      if (*(U16*)(block + block_opl) == 0){\r\n        break;\r\n      }\r\n    }\r\n    \r\n    if (block_opl > 0){\r\n      str8_list_push(scratch.arena, &list, str8(block, block_opl));\r\n    }\r\n    \r\n    if (block_opl < cap || cap == 0){\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // assemble results\r\n  String8 joined = str8_list_join(arena, &list, 0);\r\n  String16 result = {(U16*)joined.str, joined.size/2};\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal DMN_W32_ImageInfo\r\ndmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr)\r\n{\r\n  // rjf: find PE offset\r\n  U32 pe_offset = 0;\r\n  {\r\n    U64 dos_magic_off = base_vaddr;\r\n    U16 dos_magic = 0;\r\n    dmn_w32_process_read_struct(process, dos_magic_off, &dos_magic);\r\n    if(dos_magic == PE_DOS_MAGIC)\r\n    {\r\n      U64 pe_offset_off = base_vaddr + OffsetOf(PE_DosHeader, coff_file_offset);\r\n      dmn_w32_process_read_struct(process, pe_offset_off, &pe_offset);\r\n    }\r\n  }\r\n  \r\n  // rjf: get COFF header\r\n  B32 got_coff_header = 0;\r\n  U64 coff_header_off = 0;\r\n  COFF_FileHeader coff_header = {0};\r\n  if(pe_offset > 0)\r\n  {\r\n    U64 pe_magic_off = base_vaddr + pe_offset;\r\n    U32 pe_magic = 0;\r\n    dmn_w32_process_read_struct(process, pe_magic_off, &pe_magic);\r\n    if(pe_magic == PE_MAGIC)\r\n    {\r\n      coff_header_off = pe_magic_off + sizeof(pe_magic);\r\n      if(dmn_w32_process_read_struct(process, coff_header_off, &coff_header))\r\n      {\r\n        got_coff_header = 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: get arch and size\r\n  DMN_W32_ImageInfo result = zero_struct;\r\n  if(got_coff_header)\r\n  {\r\n    U64 optional_size_off = 0;\r\n    Arch arch = Arch_Null;\r\n    switch(coff_header.machine)\r\n    {\r\n      case COFF_MachineType_X86:\r\n      {\r\n        arch = Arch_x86;\r\n        optional_size_off = OffsetOf(PE_OptionalHeader32, sizeof_image);\r\n      }break;\r\n      case COFF_MachineType_X64:\r\n      {\r\n        arch = Arch_x64;\r\n        optional_size_off = OffsetOf(PE_OptionalHeader32Plus, sizeof_image);\r\n      }break;\r\n      default:\r\n      {}break;\r\n    }\r\n    if(arch != Arch_Null)\r\n    {\r\n      U64 optional_off = coff_header_off + sizeof(coff_header);\r\n      U32 size = 0;\r\n      if(dmn_w32_process_read_struct(process, optional_off+optional_size_off, &size) >= sizeof(size))\r\n      {\r\n        result.arch = arch;\r\n        result.size = size;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\n//- rjf: threads\r\n\r\ninternal U16\r\ndmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave)\r\n{\r\n  U16 result = 0;\r\n  U32 top = (fxsave->StatusWord >> 11) & 7;\r\n  for(U32 fpr = 0; fpr < 8; fpr += 1)\r\n  {\r\n    U32 tag = 3;\r\n    if(fxsave->TagWord & (1 << fpr))\r\n    {\r\n      U32 st = (fpr - top)&7;\r\n      \r\n      REGS_Reg80 *fp = (REGS_Reg80*)&fxsave->FloatRegisters[st*16];\r\n      U16 exponent = fp->sign1_exp15 & bitmask15;\r\n      U64 integer_part  = fp->int1_frac63 >> 63;\r\n      U64 fraction_part = fp->int1_frac63 & bitmask63;\r\n      \r\n      // tag: 0 - normal; 1 - zero; 2 - special\r\n      tag = 2;\r\n      if(exponent == 0)\r\n      {\r\n        if(integer_part == 0 && fraction_part == 0)\r\n        {\r\n          tag = 1;\r\n        }\r\n      }\r\n      else if(exponent != bitmask15 && integer_part != 0)\r\n      {\r\n        tag = 0;\r\n      }\r\n    }\r\n    result |= tag << (2 * fpr);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U16\r\ndmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw)\r\n{\r\n  U16 compact = 0;\r\n  for(U32 fpr = 0; fpr < 8; fpr++)\r\n  {\r\n    U32 tag = (ftw >> (fpr * 2)) & 3;\r\n    if(tag != 3)\r\n    {\r\n      compact |= (1 << fpr);\r\n    }\r\n  }\r\n  return compact;\r\n}\r\n\r\ninternal B32\r\ndmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block)\r\n{\r\n  B32 result = 0;\r\n  ProfBeginFunction();\r\n  switch(arch)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: unimplemented win32/arch combos\r\n    //\r\n    case Arch_Null:\r\n    case Arch_COUNT:\r\n    {}break;\r\n    case Arch_arm64:\r\n    case Arch_arm32:\r\n    {NotImplemented;}break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: x86\r\n    //\r\n    case Arch_x86:\r\n    {\r\n      REGS_RegBlockX86 *dst = (REGS_RegBlockX86 *)reg_block;\r\n      \r\n      //- rjf: get thread context\r\n      WOW64_CONTEXT ctx = {0};\r\n      ctx.ContextFlags = DMN_W32_CTX_X86_ALL;\r\n      if(!Wow64GetThreadContext(thread, (WOW64_CONTEXT *)&ctx))\r\n      {\r\n        break;\r\n      }\r\n      result = 1;\r\n      \r\n      //- rjf: convert WOW64_CONTEXT -> REGS_RegBlockX86\r\n      XSAVE_FORMAT *fxsave = (XSAVE_FORMAT *)ctx.ExtendedRegisters;\r\n      dst->eax.u32 = ctx.Eax;\r\n      dst->ebx.u32 = ctx.Ebx;\r\n      dst->ecx.u32 = ctx.Ecx;\r\n      dst->edx.u32 = ctx.Edx;\r\n      dst->esi.u32 = ctx.Esi;\r\n      dst->edi.u32 = ctx.Edi;\r\n      dst->esp.u32 = ctx.Esp;\r\n      dst->ebp.u32 = ctx.Ebp;\r\n      dst->eip.u32 = ctx.Eip;\r\n      dst->cs.u16 = ctx.SegCs;\r\n      dst->ds.u16 = ctx.SegDs;\r\n      dst->es.u16 = ctx.SegEs;\r\n      dst->fs.u16 = ctx.SegFs;\r\n      dst->gs.u16 = ctx.SegGs;\r\n      dst->ss.u16 = ctx.SegSs;\r\n      dst->dr0.u32 = ctx.Dr0;\r\n      dst->dr1.u32 = ctx.Dr1;\r\n      dst->dr2.u32 = ctx.Dr2;\r\n      dst->dr3.u32 = ctx.Dr3;\r\n      dst->dr6.u32 = ctx.Dr6;\r\n      dst->dr7.u32 = ctx.Dr7;\r\n      // NOTE(rjf): this bit is \"supposed to always be 1\", according to old info.\r\n      // may need to be investigated.\r\n      dst->eflags.u32 = ctx.EFlags | 0x2;\r\n      dst->fcw.u16 = fxsave->ControlWord;\r\n      dst->fsw.u16 = fxsave->StatusWord;\r\n      dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(fxsave);\r\n      dst->fop.u16 = fxsave->ErrorOpcode;\r\n      dst->fip.u32 = fxsave->ErrorOffset;\r\n      dst->fcs.u16 = fxsave->ErrorSelector;\r\n      dst->fdp.u32 = fxsave->DataOffset;\r\n      dst->fds.u16 = fxsave->DataSelector;\r\n      dst->mxcsr.u32 = fxsave->MxCsr;\r\n      dst->mxcsr_mask.u32 = fxsave->MxCsr_Mask;\r\n      {\r\n        M128A *float_s = fxsave->FloatRegisters;\r\n        REGS_Reg80 *float_d = &dst->fpr0;\r\n        for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)\r\n        {\r\n          MemoryCopy(float_d, float_s, sizeof(*float_d));\r\n        }\r\n      }\r\n      {\r\n        M128A *xmm_s = fxsave->XmmRegisters;\r\n        REGS_Reg256 *xmm_d = &dst->ymm0;\r\n        for(U32 n = 0; n < 8; n += 1, xmm_s += 1, xmm_d += 1)\r\n        {\r\n          MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_s));\r\n        }\r\n      }\r\n      \r\n      //- rjf: read FS/GS base\r\n      WOW64_LDT_ENTRY ldt = {0};\r\n      if(Wow64GetThreadSelectorEntry(thread, ctx.SegFs, &ldt))\r\n      {\r\n        U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24);\r\n        dst->fsbase.u32 = base;\r\n      }\r\n      if(Wow64GetThreadSelectorEntry(thread, ctx.SegGs, &ldt))\r\n      {\r\n        U32 base = (ldt.BaseLow) | (ldt.HighWord.Bytes.BaseMid << 16) | (ldt.HighWord.Bytes.BaseHi << 24);\r\n        dst->gsbase.u32 = base;\r\n      }\r\n    }break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: x64\r\n    //\r\n    case Arch_x64:\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      REGS_RegBlockX64 *dst = (REGS_RegBlockX64 *)reg_block;\r\n      \r\n      //- rjf: unpack info about available features\r\n      U32 feature_mask = GetEnabledXStateFeatures();\r\n      B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U)) != 0;\r\n      \r\n      //- rjf: set up context\r\n      CONTEXT *ctx = 0;\r\n      U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0);\r\n      DWORD size = 0;\r\n      InitializeContext(0, ctx_flags, 0, &size);\r\n      if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r\n      {\r\n        void *ctx_memory = push_array(scratch.arena, U8, size);\r\n        if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size))\r\n        {\r\n          ctx = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: unpack features available on this context\r\n      if (xstate_enabled)\r\n      {\r\n        SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512 | XSTATE_MASK_CET_U);\r\n      }\r\n      \r\n      //- rjf: get thread context\r\n      if(!GetThreadContext(thread, ctx))\r\n      {\r\n        ctx = 0;\r\n      }\r\n      \r\n      //- rjf: bad context -> abort\r\n      if(ctx == 0)\r\n      {\r\n        break;\r\n      }\r\n      result = 1;\r\n      \r\n      DWORD64 xstate_mask = 0;\r\n      GetXStateFeaturesMask(ctx, &xstate_mask);\r\n      \r\n      //- rjf: convert context -> REGS_RegBlockX64\r\n      XSAVE_FORMAT *xsave = &ctx->FltSave;\r\n      dst->rax.u64 = ctx->Rax;\r\n      dst->rcx.u64 = ctx->Rcx;\r\n      dst->rdx.u64 = ctx->Rdx;\r\n      dst->rbx.u64 = ctx->Rbx;\r\n      dst->rsp.u64 = ctx->Rsp;\r\n      dst->rbp.u64 = ctx->Rbp;\r\n      dst->rsi.u64 = ctx->Rsi;\r\n      dst->rdi.u64 = ctx->Rdi;\r\n      dst->r8.u64  = ctx->R8;\r\n      dst->r9.u64  = ctx->R9;\r\n      dst->r10.u64 = ctx->R10;\r\n      dst->r11.u64 = ctx->R11;\r\n      dst->r12.u64 = ctx->R12;\r\n      dst->r13.u64 = ctx->R13;\r\n      dst->r14.u64 = ctx->R14;\r\n      dst->r15.u64 = ctx->R15;\r\n      dst->rip.u64 = ctx->Rip;\r\n      dst->cs.u16  = ctx->SegCs;\r\n      dst->ds.u16  = ctx->SegDs;\r\n      dst->es.u16  = ctx->SegEs;\r\n      dst->fs.u16  = ctx->SegFs;\r\n      dst->gs.u16  = ctx->SegGs;\r\n      dst->ss.u16  = ctx->SegSs;\r\n      dst->dr0.u64 = ctx->Dr0;\r\n      dst->dr1.u64 = ctx->Dr1;\r\n      dst->dr2.u64 = ctx->Dr2;\r\n      dst->dr3.u64 = ctx->Dr3;\r\n      dst->dr6.u64 = ctx->Dr6;\r\n      dst->dr7.u64 = ctx->Dr7;\r\n      // NOTE(rjf): this bit is \"supposed to always be 1\", according to old info.\r\n      // may need to be investigated.\r\n      dst->rflags.u64 = ctx->EFlags | 0x2;\r\n      dst->fcw.u16 = xsave->ControlWord;\r\n      dst->fsw.u16 = xsave->StatusWord;\r\n      dst->ftw.u16 = dmn_w32_real_tag_word_from_xsave(xsave);\r\n      dst->fop.u16 = xsave->ErrorOpcode;\r\n      dst->fcs.u16 = xsave->ErrorSelector;\r\n      dst->fds.u16 = xsave->DataSelector;\r\n      dst->fip.u64 = xsave->ErrorOffset;\r\n      dst->fdp.u64 = xsave->DataOffset;\r\n      dst->mxcsr.u32 = xsave->MxCsr;\r\n      dst->mxcsr_mask.u32 = xsave->MxCsr_Mask;\r\n      {\r\n        M128A *float_s = xsave->FloatRegisters;\r\n        REGS_Reg80 *float_d = &dst->fpr0;\r\n        for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)\r\n        {\r\n          MemoryCopy(float_d, float_s, sizeof(*float_d));\r\n        }\r\n      }\r\n      \r\n      // SSE registers are always available in x64\r\n      {\r\n        M128A *xmm_s = xsave->XmmRegisters;\r\n        REGS_Reg512 *zmm_d = &dst->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, xmm_s += 1, zmm_d += 1)\r\n        {\r\n          MemoryCopy(zmm_d, xmm_s, sizeof(*xmm_s));\r\n        }\r\n      }\r\n      \r\n      // AVX\r\n      if(xstate_mask & XSTATE_MASK_AVX)\r\n      {\r\n        DWORD avx_length = 0;\r\n        U8* avx_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length);\r\n        Assert(avx_length == 16 * sizeof(REGS_Reg128));\r\n        \r\n        REGS_Reg512 *zmm_d = &dst->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, avx_s += sizeof(REGS_Reg128), zmm_d += 1)\r\n        {\r\n          MemoryCopy(&zmm_d->v[16], avx_s, sizeof(REGS_Reg128));\r\n        }\r\n      }\r\n      else\r\n      {\r\n        REGS_Reg512 *zmm_d = &dst->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, zmm_d += 1)\r\n        {\r\n          MemoryZero(&zmm_d->v[16], sizeof(REGS_Reg128));\r\n        }\r\n      }\r\n      \r\n      // AVX-512\r\n      if(xstate_mask & XSTATE_MASK_AVX512)\r\n      {\r\n        DWORD kmask_length = 0;\r\n        U64* kmask_s = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length);\r\n        Assert(kmask_length == 8 * sizeof(U64));\r\n        \r\n        REGS_Reg64 *kmask_d = &dst->k0;\r\n        for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1)\r\n        {\r\n          MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_s));\r\n        }\r\n        \r\n        DWORD avx512h_length = 0;\r\n        U8* avx512h_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length);\r\n        Assert(avx512h_length == 16 * sizeof(REGS_Reg256));\r\n        \r\n        REGS_Reg512 *zmmh_d = &dst->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, avx512h_s += sizeof(REGS_Reg256), zmmh_d += 1)\r\n        {\r\n          MemoryCopy(&zmmh_d->v[32], avx512h_s, sizeof(REGS_Reg256));\r\n        }\r\n        \r\n        DWORD avx512_length = 0;\r\n        U8* avx512_s = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length);\r\n        Assert(avx512_length == 16 * sizeof(REGS_Reg512));\r\n        \r\n        REGS_Reg512 *zmm_d = &dst->zmm16;\r\n        for(U32 n = 0; n < 16; n += 1, avx512_s += sizeof(REGS_Reg512), zmm_d += 1)\r\n        {\r\n          MemoryCopy(zmm_d, avx512_s, sizeof(REGS_Reg512));\r\n        }\r\n      }\r\n      else\r\n      {\r\n        REGS_Reg64 *kmask_d = &dst->k0;\r\n        for(U32 n = 0; n < 8; n += 1, kmask_d += 1)\r\n        {\r\n          MemoryZero(kmask_d, sizeof(*kmask_d));\r\n        }\r\n        \r\n        REGS_Reg512 *zmmh_d = &dst->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, zmmh_d += 1)\r\n        {\r\n          MemoryZero(&zmmh_d->v[32], sizeof(REGS_Reg256));\r\n        }\r\n        \r\n        REGS_Reg512 *zmm_d = &dst->zmm16;\r\n        for(U32 n = 0; n < 16; n += 1, zmm_d += 1)\r\n        {\r\n          MemoryZero(zmm_d, sizeof(*zmm_d));\r\n        }\r\n      }\r\n      \r\n      // CET / Shadow Stack\r\n      if(xstate_mask & XSTATE_MASK_CET_U)\r\n      {\r\n        DWORD cet_length = 0;\r\n        XSAVE_CET_U_FORMAT *cet = LocateXStateFeature(ctx, XSTATE_CET_U, &cet_length);\r\n        if (cet_length == sizeof(*cet))\r\n        {\r\n          dst->cetmsr.u64 = cet->Ia32CetUMsr;\r\n          dst->cetssp.u64 = cet->Ia32Pl3SspMsr;\r\n        }\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }break;\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block)\r\n{\r\n  B32 result = 0;\r\n  ProfBeginFunction();\r\n  switch(arch)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: unimplemented win32/arch combos\r\n    //\r\n    case Arch_Null:\r\n    case Arch_COUNT:\r\n    {}break;\r\n    case Arch_arm64:\r\n    case Arch_arm32:\r\n    {NotImplemented;}break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: x86\r\n    //\r\n    case Arch_x86:\r\n    {\r\n      REGS_RegBlockX86 *src = (REGS_RegBlockX86 *)reg_block;\r\n      \r\n      //- rjf: convert REGS_RegBlockX86 -> WOW64_CONTEXT\r\n      WOW64_CONTEXT ctx = {0};\r\n      XSAVE_FORMAT *fxsave = (XSAVE_FORMAT*)ctx.ExtendedRegisters;\r\n      ctx.ContextFlags = DMN_W32_CTX_X86_ALL;\r\n      ctx.Eax = src->eax.u32;\r\n      ctx.Ebx = src->ebx.u32;\r\n      ctx.Ecx = src->ecx.u32;\r\n      ctx.Edx = src->edx.u32;\r\n      ctx.Esi = src->esi.u32;\r\n      ctx.Edi = src->edi.u32;\r\n      ctx.Esp = src->esp.u32;\r\n      ctx.Ebp = src->ebp.u32;\r\n      ctx.Eip = src->eip.u32;\r\n      ctx.SegCs = src->cs.u16;\r\n      ctx.SegDs = src->ds.u16;\r\n      ctx.SegEs = src->es.u16;\r\n      ctx.SegFs = src->fs.u16;\r\n      ctx.SegGs = src->gs.u16;\r\n      ctx.SegSs = src->ss.u16;\r\n      ctx.Dr0 = src->dr0.u32;\r\n      ctx.Dr1 = src->dr1.u32;\r\n      ctx.Dr2 = src->dr2.u32;\r\n      ctx.Dr3 = src->dr3.u32;\r\n      ctx.Dr6 = src->dr6.u32;\r\n      ctx.Dr7 = src->dr7.u32;\r\n      ctx.EFlags = src->eflags.u32;\r\n      fxsave->ControlWord = src->fcw.u16;\r\n      fxsave->StatusWord = src->fsw.u16;\r\n      fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16);\r\n      fxsave->ErrorOpcode = src->fop.u16;\r\n      fxsave->ErrorSelector = src->fcs.u16;\r\n      fxsave->DataSelector = src->fds.u16;\r\n      fxsave->ErrorOffset = src->fip.u32;\r\n      fxsave->DataOffset = src->fdp.u32;\r\n      fxsave->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32;\r\n      fxsave->MxCsr_Mask = src->mxcsr_mask.u32;\r\n      {\r\n        M128A *float_d = fxsave->FloatRegisters;\r\n        REGS_Reg80 *float_s = &src->fpr0;\r\n        for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)\r\n        {\r\n          MemoryCopy(float_d, float_s, 10);\r\n        }\r\n      }\r\n      {\r\n        M128A *xmm_d = fxsave->XmmRegisters;\r\n        REGS_Reg256 *xmm_s = &src->ymm0;\r\n        for(U32 n = 0; n < 8; n += 1, xmm_d += 1, xmm_s += 1)\r\n        {\r\n          MemoryCopy(xmm_d, xmm_s, sizeof(*xmm_d));\r\n        }\r\n      }\r\n      \r\n      //- rjf: set thread context\r\n      B32 result = 0;\r\n      if(Wow64SetThreadContext(thread, &ctx))\r\n      {\r\n        result = 1;\r\n      }\r\n    }break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: x64\r\n    //\r\n    case Arch_x64:\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      REGS_RegBlockX64 *src = (REGS_RegBlockX64 *)reg_block;\r\n      \r\n      //- rjf: unpack info about available features\r\n      U32 feature_mask = GetEnabledXStateFeatures();\r\n      B32 xstate_enabled = (feature_mask & (XSTATE_MASK_AVX | XSTATE_MASK_AVX512)) != 0;\r\n      \r\n      //- rjf: set up context\r\n      CONTEXT *ctx = 0;\r\n      U32 ctx_flags = DMN_W32_CTX_X64_ALL | (xstate_enabled ? DMN_W32_CTX_INTEL_XSTATE : 0);\r\n      DWORD size = 0;\r\n      InitializeContext(0, ctx_flags, 0, &size);\r\n      if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r\n      {\r\n        void *ctx_memory = push_array(scratch.arena, U8, size);\r\n        if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size))\r\n        {\r\n          ctx = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: unpack features available on this context\r\n      if (xstate_enabled)\r\n      {\r\n        SetXStateFeaturesMask(ctx, XSTATE_MASK_AVX | XSTATE_MASK_AVX512);\r\n      }\r\n      \r\n      //- rjf: bad context -> abort\r\n      if(ctx == 0)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      //- rjf: convert REGS_RegBlockX64 -> CONTEXT\r\n      XSAVE_FORMAT *fxsave = &ctx->FltSave;\r\n      ctx->ContextFlags = ctx_flags;\r\n      ctx->MxCsr = src->mxcsr.u32 & src->mxcsr_mask.u32;\r\n      ctx->Rax = src->rax.u64;\r\n      ctx->Rcx = src->rcx.u64;\r\n      ctx->Rdx = src->rdx.u64;\r\n      ctx->Rbx = src->rbx.u64;\r\n      ctx->Rsp = src->rsp.u64;\r\n      ctx->Rbp = src->rbp.u64;\r\n      ctx->Rsi = src->rsi.u64;\r\n      ctx->Rdi = src->rdi.u64;\r\n      ctx->R8  = src->r8.u64;\r\n      ctx->R9  = src->r9.u64;\r\n      ctx->R10 = src->r10.u64;\r\n      ctx->R11 = src->r11.u64;\r\n      ctx->R12 = src->r12.u64;\r\n      ctx->R13 = src->r13.u64;\r\n      ctx->R14 = src->r14.u64;\r\n      ctx->R15 = src->r15.u64;\r\n      ctx->Rip = src->rip.u64;\r\n      ctx->SegCs = src->cs.u16;\r\n      ctx->SegDs = src->ds.u16;\r\n      ctx->SegEs = src->es.u16;\r\n      ctx->SegFs = src->fs.u16;\r\n      ctx->SegGs = src->gs.u16;\r\n      ctx->SegSs = src->ss.u16;\r\n      ctx->Dr0 = src->dr0.u64;\r\n      ctx->Dr1 = src->dr1.u64;\r\n      ctx->Dr2 = src->dr2.u64;\r\n      ctx->Dr3 = src->dr3.u64;\r\n      ctx->Dr6 = src->dr6.u64;\r\n      ctx->Dr7 = src->dr7.u64;\r\n      ctx->EFlags = src->rflags.u64;\r\n      fxsave->ControlWord = src->fcw.u16;\r\n      fxsave->StatusWord = src->fsw.u16;\r\n      fxsave->TagWord = dmn_w32_xsave_tag_word_from_real_tag_word(src->ftw.u16);\r\n      fxsave->ErrorOpcode = src->fop.u16;\r\n      fxsave->ErrorSelector = src->fcs.u16;\r\n      fxsave->DataSelector = src->fds.u16;\r\n      fxsave->ErrorOffset = src->fip.u64;\r\n      fxsave->DataOffset = src->fdp.u64;\r\n      {\r\n        M128A *float_d = fxsave->FloatRegisters;\r\n        REGS_Reg80 *float_s = &src->fpr0;\r\n        for(U32 n = 0; n < 8; n += 1, float_s += 1, float_d += 1)\r\n        {\r\n          MemoryCopy(float_d, float_s, 10);\r\n        }\r\n      }\r\n      \r\n      // SSE registers are always available in x64\r\n      {\r\n        M128A *xmm_d = fxsave->XmmRegisters;\r\n        REGS_Reg512 *zmm_s = &src->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, xmm_d += 1, zmm_s += 1)\r\n        {\r\n          MemoryCopy(xmm_d, zmm_s, sizeof(*xmm_d));\r\n        }\r\n      }\r\n      \r\n      // AVX\r\n      if(feature_mask & XSTATE_MASK_AVX)\r\n      {\r\n        DWORD avx_length = 0;\r\n        U8* avx_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX, &avx_length);\r\n        Assert(avx_length == 16 * sizeof(REGS_Reg128));\r\n        \r\n        REGS_Reg512 *zmm_s = &src->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, avx_d += sizeof(REGS_Reg128), zmm_s += 1)\r\n        {\r\n          MemoryCopy(avx_d, &zmm_s->v[16], sizeof(REGS_Reg128));\r\n        }\r\n      }\r\n      \r\n      // AVX-512\r\n      if(feature_mask & XSTATE_MASK_AVX512)\r\n      {\r\n        DWORD kmask_length = 0;\r\n        U64* kmask_d = (U64*)LocateXStateFeature(ctx, XSTATE_AVX512_KMASK, &kmask_length);\r\n        Assert(kmask_length == 8 * sizeof(*kmask_d));\r\n        \r\n        REGS_Reg64 *kmask_s = &src->k0;\r\n        for(U32 n = 0; n < 8; n += 1, kmask_s += 1, kmask_d += 1)\r\n        {\r\n          MemoryCopy(kmask_d, kmask_s, sizeof(*kmask_d));\r\n        }\r\n        \r\n        DWORD avx512h_length = 0;\r\n        U8* avx512h_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM_H, &avx512h_length);\r\n        Assert(avx512h_length == 16 * sizeof(REGS_Reg256));\r\n        \r\n        REGS_Reg512 *zmmh_s = &src->zmm0;\r\n        for(U32 n = 0; n < 16; n += 1, avx512h_d += sizeof(REGS_Reg256), zmmh_s += 1)\r\n        {\r\n          MemoryCopy(avx512h_d, &zmmh_s->v[32], sizeof(REGS_Reg256));\r\n        }\r\n        \r\n        DWORD avx512_length = 0;\r\n        U8* avx512_d = (U8*)LocateXStateFeature(ctx, XSTATE_AVX512_ZMM, &avx512_length);\r\n        Assert(avx512_length == 16 * sizeof(REGS_Reg512));\r\n        \r\n        REGS_Reg512 *zmm_s = &src->zmm16;\r\n        for(U32 n = 0; n < 16; n += 1, avx512_d += sizeof(REGS_Reg512), zmm_s += 1)\r\n        {\r\n          MemoryCopy(avx512_d, zmm_s, sizeof(REGS_Reg512));\r\n        }\r\n      }\r\n      \r\n      //- rjf: set thread context\r\n      if(SetThreadContext(thread, ctx))\r\n      {\r\n        result = 1;\r\n      }\r\n      scratch_end(scratch);\r\n    }break;\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n//- rjf: remote thread injection\r\n\r\ninternal DWORD\r\ndmn_w32_inject_thread(HANDLE process, U64 start_address)\r\n{\r\n  LPTHREAD_START_ROUTINE start = (LPTHREAD_START_ROUTINE)start_address;\r\n  DWORD thread_id = 0;\r\n  HANDLE thread = CreateRemoteThread(process, 0, 0, start, 0, 0, &thread_id);\r\n  if(thread != 0)\r\n  {\r\n    CloseHandle(thread);\r\n  }\r\n  return thread_id;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Main Layer Initialization (Implemented Per-OS)\r\n\r\ninternal void\r\ndmn_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  dmn_w32_shared = push_array(arena, DMN_W32_Shared, 1);\r\n  dmn_w32_shared->arena = arena;\r\n  dmn_w32_shared->access_mutex = mutex_alloc();\r\n  dmn_w32_shared->detach_arena = arena_alloc();\r\n  dmn_w32_shared->entities_arena = arena_alloc(.reserve_size = GB(8), .commit_size = KB(64));\r\n  dmn_w32_shared->entities_base = dmn_w32_entity_alloc(&dmn_w32_entity_nil, DMN_W32_EntityKind_Root, 0);\r\n  dmn_w32_shared->entities_id_hash_slots_count = 4096;\r\n  dmn_w32_shared->entities_id_hash_slots = push_array(arena, DMN_W32_EntityIDHashSlot, dmn_w32_shared->entities_id_hash_slots_count);\r\n  \r\n  // rjf: load Windows 10+ GetThreadDescription API\r\n  {\r\n    dmn_w32_GetThreadDescription = (DMN_W32_GetThreadDescriptionFunctionType *)GetProcAddress(GetModuleHandleA(\"Kernel32.dll\"), \"GetThreadDescription\");\r\n  }\r\n  \r\n  // rjf: setup environment variables\r\n  {\r\n    WCHAR *this_proc_env = GetEnvironmentStringsW();\r\n    U64 start_idx = 0;\r\n    for(U64 idx = 0;; idx += 1)\r\n    {\r\n      if(this_proc_env[idx] == 0)\r\n      {\r\n        if(start_idx == idx)\r\n        {\r\n          break;\r\n        }\r\n        else\r\n        {\r\n          String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx);\r\n          String8 string = str8_from_16(dmn_w32_shared->arena, string16);\r\n          str8_list_push(dmn_w32_shared->arena, &dmn_w32_shared->env_strings, string);\r\n          start_idx = idx+1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Blocking Control Thread Operations (Implemented Per-OS)\r\n\r\ninternal DMN_CtrlCtx *\r\ndmn_ctrl_begin(void)\r\n{\r\n  DMN_CtrlCtx *ctx = (DMN_CtrlCtx *)1;\r\n  dmn_w32_ctrl_thread = 1;\r\n  return ctx;\r\n}\r\n\r\ninternal void\r\ndmn_ctrl_exclusive_access_begin(void)\r\n{\r\n  MutexScope(dmn_w32_shared->access_mutex)\r\n  {\r\n    dmn_w32_shared->access_run_state = 1;\r\n  }\r\n}\r\n\r\ninternal void\r\ndmn_ctrl_exclusive_access_end(void)\r\n{\r\n  MutexScope(dmn_w32_shared->access_mutex)\r\n  {\r\n    dmn_w32_shared->access_run_state = 0;\r\n  }\r\n}\r\n\r\ninternal U32\r\ndmn_ctrl_launch(DMN_CtrlCtx *ctx, OS_ProcessLaunchParams *params)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    //- rjf: produce exe / arguments string\r\n    String8 cmd = {0};\r\n    if(params->cmd_line.first != 0)\r\n    {\r\n      String8List args = {0};\r\n      String8 exe_path = params->cmd_line.first->string;\r\n      String8List exe_path_parts = str8_split_path(scratch.arena, exe_path);\r\n      exe_path = str8_list_join(scratch.arena, &exe_path_parts, &(StringJoin){.sep = str8_lit(\"\\\\\")});\r\n      str8_list_pushf(scratch.arena, &args, \"\\\"%S\\\"\", exe_path);\r\n      for(String8Node *n = params->cmd_line.first->next; n != 0; n = n->next)\r\n      {\r\n        str8_list_push(scratch.arena, &args, n->string);\r\n      }\r\n      StringJoin join_params = {0};\r\n      join_params.sep = str8_lit(\" \");\r\n      cmd = str8_list_join(scratch.arena, &args, &join_params);\r\n    }\r\n    \r\n    //- rjf: produce environment strings\r\n    String8 env = {0};\r\n    {\r\n      String8List all_opts = params->env;\r\n      if(params->inherit_env != 0)\r\n      {\r\n        MemoryZeroStruct(&all_opts);\r\n        str8_list_push(scratch.arena, &all_opts, str8_lit(\"_NO_DEBUG_HEAP=1\"));\r\n        for(String8Node *n = params->env.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(scratch.arena, &all_opts, n->string);\r\n        }\r\n        for(String8Node *n = dmn_w32_shared->env_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(scratch.arena, &all_opts, n->string);\r\n        }\r\n      }\r\n      StringJoin join_params2 = {0};\r\n      join_params2.sep = str8_lit(\"\\0\");\r\n      join_params2.post = str8_lit(\"\\0\");\r\n      env = str8_list_join(scratch.arena, &all_opts, &join_params2);\r\n    }\r\n    \r\n    //- rjf: produce utf-16 strings\r\n    String16 cmd16 = str16_from_8(scratch.arena, cmd);\r\n    String16 dir16 = str16_from_8(scratch.arena, params->path);\r\n    String16 env16 = str16_from_8(scratch.arena, env);\r\n    \r\n    //- rjf: launch\r\n    DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT;\r\n    if(params->debug_subprocesses)\r\n    {\r\n      creation_flags |= DEBUG_PROCESS;\r\n    }\r\n    else\r\n    {\r\n      creation_flags |= DEBUG_ONLY_THIS_PROCESS;\r\n    }\r\n    BOOL inherit_handles = 0;\r\n    STARTUPINFOW startup_info = {sizeof(startup_info)};\r\n    if(!os_handle_match(params->stdout_file, os_handle_zero()))\r\n    {\r\n      HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0];\r\n      startup_info.hStdOutput = stdout_handle;\r\n      startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n      inherit_handles = 1;\r\n    }\r\n    if(!os_handle_match(params->stderr_file, os_handle_zero()))\r\n    {\r\n      HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0];\r\n      startup_info.hStdError = stderr_handle;\r\n      startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n      inherit_handles = 1;\r\n    }\r\n    if(!os_handle_match(params->stdin_file, os_handle_zero()))\r\n    {\r\n      HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0];\r\n      startup_info.hStdInput = stdin_handle;\r\n      startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n      inherit_handles = 1;\r\n    }\r\n    PROCESS_INFORMATION process_info = {0};\r\n    if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, 1, creation_flags, (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info))\r\n    {\r\n      // check if we are 32-bit app, and just close it immediately\r\n      BOOL is_wow = 0;\r\n      IsWow64Process(process_info.hProcess, &is_wow);\r\n      if(is_wow)\r\n      {\r\n        log_user_errorf(\"Only 64-bit applications can be debugged currently.\");\r\n        DebugActiveProcessStop(process_info.dwProcessId);\r\n        TerminateProcess(process_info.hProcess,0xffffffff);\r\n      }\r\n      else\r\n      {\r\n        result = process_info.dwProcessId;\r\n        dmn_w32_shared->new_process_pending = 1;\r\n      }\r\n      CloseHandle(process_info.hProcess);\r\n      CloseHandle(process_info.hThread);\r\n    }\r\n    else\r\n    {\r\n      DWORD error = GetLastError();\r\n      LPWSTR message = 0;\r\n      FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, 0, error, MAKELANGID(LANG_NEUTRAL,SUBLANG_NEUTRAL), (LPWSTR)&message, 0, 0);\r\n      String8 message8 = message ? str8_from_16(scratch.arena, str16_cstring(message)) : str8_lit(\"unknown error\");\r\n      LocalFree(message);\r\n      \r\n      log_user_errorf(\"There was an error starting %S: %S\", params->cmd_line.first->string, message8);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_ctrl_attach(DMN_CtrlCtx *ctx, U32 pid)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope if(DebugActiveProcess((DWORD)pid))\r\n  {\r\n    result = 1;\r\n    dmn_w32_shared->new_process_pending = 1;\r\n    \r\n#if 0\r\n    // TODO(rjf): JIT debugging info\r\n    {\r\n      typedef struct JIT_DEBUG_INFO JIT_DEBUG_INFO;\r\n      struct JIT_DEBUG_INFO\r\n      {\r\n        DWORD dwSize;\r\n        DWORD dwProcessorArchitecture;\r\n        DWORD dwThreadID;\r\n        DWORD dwReserved0;\r\n        ULONG64 lpExceptionAddress;\r\n        ULONG64 lpExceptionRecord;\r\n        ULONG64 lpContextRecord;\r\n      };\r\n    }\r\n#endif\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_ctrl_kill(DMN_CtrlCtx *ctx, DMN_Handle process, U32 exit_code)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    if(TerminateProcess(process_entity->handle, exit_code))\r\n    {\r\n      result = 1;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_ctrl_detach(DMN_CtrlCtx *ctx, DMN_Handle process)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    \r\n    // rjf: resume threads\r\n    for(DMN_W32_Entity *child = process_entity->first;\r\n        child != &dmn_w32_entity_nil;\r\n        child = child->next)\r\n    {\r\n      if(child->kind == DMN_W32_EntityKind_Thread)\r\n      {\r\n        DWORD resume_result = ResumeThread(child->handle);\r\n        (void)resume_result;\r\n      }\r\n    }\r\n    \r\n    // rjf: detach\r\n    {\r\n      DWORD pid = (DWORD)process_entity->id;\r\n      if(DebugActiveProcessStop(pid))\r\n      {\r\n        result = 1;\r\n      }\r\n    }\r\n    \r\n    // rjf: push into list of processes to generate events for later\r\n    if(result != 0)\r\n    {\r\n      dmn_handle_list_push(dmn_w32_shared->detach_arena, &dmn_w32_shared->detach_processes, process);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DMN_EventList\r\ndmn_ctrl_run(Arena *arena, DMN_CtrlCtx *ctx, DMN_RunCtrls *ctrls)\r\n{\r\n  DMN_EventList events = {0};\r\n  dmn_access_open();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine event generation path\r\n  //\r\n  typedef enum DMN_W32_EventGenPath\r\n  {\r\n    DMN_W32_EventGenPath_NotAttached,\r\n    DMN_W32_EventGenPath_Run,\r\n    DMN_W32_EventGenPath_DetachProcesses,\r\n  }\r\n  DMN_W32_EventGenPath;\r\n  DMN_W32_EventGenPath event_gen_path = DMN_W32_EventGenPath_Run;\r\n  if(dmn_w32_shared->detach_processes.first != 0)\r\n  {\r\n    event_gen_path = DMN_W32_EventGenPath_DetachProcesses;\r\n  }\r\n  else\r\n  {\r\n    B32 any_processes_live = dmn_w32_shared->new_process_pending;\r\n    if(!any_processes_live)\r\n    {\r\n      for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first;\r\n          process != &dmn_w32_entity_nil;\r\n          process = process->next)\r\n      {\r\n        if(process->kind == DMN_W32_EntityKind_Process)\r\n        {\r\n          any_processes_live = 1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    if(!any_processes_live)\r\n    {\r\n      event_gen_path = DMN_W32_EventGenPath_NotAttached;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: produce debug events\r\n  //\r\n  switch(event_gen_path)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: produce not-attached error events\r\n    //\r\n    case DMN_W32_EventGenPath_NotAttached:\r\n    {\r\n      DMN_Event *e = dmn_event_list_push(arena, &events);\r\n      e->kind       = DMN_EventKind_Error;\r\n      e->error_kind = DMN_ErrorKind_NotAttached;\r\n    }break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: produce debug events from regular running\r\n    //\r\n    case DMN_W32_EventGenPath_Run:\r\n    {\r\n      Temp scratch = scratch_begin(&arena, 1);\r\n      \r\n      //////////////////////////\r\n      //- rjf: get single step thread's context (x64 single-step-set fast path)\r\n      //\r\n      CONTEXT *single_step_thread_ctx = 0;\r\n      if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero()))\r\n      {\r\n        DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);\r\n        Arch arch = thread->arch;\r\n        switch(arch)\r\n        {\r\n          default:{}break;\r\n          case Arch_x64:\r\n          {\r\n            U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL;\r\n            DWORD size = 0;\r\n            InitializeContext(0, ctx_flags, 0, &size);\r\n            if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r\n            {\r\n              void *ctx_memory = push_array(scratch.arena, U8, size);\r\n              if(!InitializeContext(ctx_memory, ctx_flags, &single_step_thread_ctx, &size))\r\n              {\r\n                single_step_thread_ctx = 0;\r\n              }\r\n            }\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: set single step bit\r\n      //\r\n      if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope(\"set single step bit\")\r\n      {\r\n        DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);\r\n        Arch arch = thread->arch;\r\n        switch(arch)\r\n        {\r\n          //- rjf: unimplemented win32/arch combos\r\n          case Arch_Null:\r\n          case Arch_COUNT:\r\n          {}break;\r\n          case Arch_arm64:\r\n          case Arch_arm32:\r\n          {NotImplemented;}break;\r\n          \r\n          //- rjf: x86\r\n          case Arch_x86:\r\n          {\r\n            REGS_RegBlockX86 regs = {0};\r\n            dmn_thread_read_reg_block(ctrls->single_step_thread, &regs);\r\n            regs.eflags.u32 |= 0x100;\r\n            dmn_thread_write_reg_block(ctrls->single_step_thread, &regs);\r\n          }break;\r\n          \r\n          //- rjf: x64\r\n          case Arch_x64:\r\n          {\r\n            if(!GetThreadContext(thread->handle, single_step_thread_ctx))\r\n            {\r\n              single_step_thread_ctx = 0;\r\n            }\r\n            if(single_step_thread_ctx != 0)\r\n            {\r\n              U64 rflags = single_step_thread_ctx->EFlags|0x2;\r\n              U64 new_rflags = rflags | 0x100;\r\n              single_step_thread_ctx->EFlags = new_rflags;\r\n              SetThreadContext(thread->handle, single_step_thread_ctx);\r\n            }\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: write all traps into memory\r\n      //\r\n      U8 *trap_swap_bytes = push_array_no_zero(scratch.arena, U8, ctrls->traps.trap_count);\r\n      ProfScope(\"write all traps into memory\")\r\n      {\r\n        U64 trap_idx = 0;\r\n        for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next)\r\n        {\r\n          for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1)\r\n          {\r\n            DMN_Trap *trap = n->v+n_idx;\r\n            if(trap->flags == 0)\r\n            {\r\n              trap_swap_bytes[trap_idx] = 0xCC;\r\n              dmn_process_read(trap->process, r1u64(trap->vaddr, trap->vaddr+1), trap_swap_bytes+trap_idx);\r\n              U8 int3 = 0xCC;\r\n              dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &int3);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: gather all flagged traps, bucketed by process\r\n      //\r\n      typedef struct DMN_FlaggedTrapTask DMN_FlaggedTrapTask;\r\n      struct DMN_FlaggedTrapTask\r\n      {\r\n        DMN_FlaggedTrapTask *next;\r\n        DMN_Handle process;\r\n        DMN_TrapChunkList traps;\r\n      };\r\n      DMN_FlaggedTrapTask *first_flagged_trap_task = 0;\r\n      DMN_FlaggedTrapTask *last_flagged_trap_task= 0;\r\n      for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next)\r\n      {\r\n        for(U64 n_idx = 0; n_idx < n->count; n_idx += 1)\r\n        {\r\n          DMN_Trap *trap = n->v+n_idx;\r\n          if(trap->flags != 0)\r\n          {\r\n            DMN_FlaggedTrapTask *task = 0;\r\n            for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next)\r\n            {\r\n              if(dmn_handle_match(t->process, trap->process))\r\n              {\r\n                task = t;\r\n                break;\r\n              }\r\n            }\r\n            if(task == 0)\r\n            {\r\n              task = push_array(scratch.arena, DMN_FlaggedTrapTask, 1);\r\n              SLLQueuePush(first_flagged_trap_task, last_flagged_trap_task, task);\r\n              task->process = trap->process;\r\n            }\r\n            B32 already_in_task = 0;\r\n            for(DMN_TrapChunkNode *n = task->traps.first; n != 0; n = n->next)\r\n            {\r\n              for(U64 n_idx = 0; n_idx < n->count; n_idx += 1)\r\n              {\r\n                if(n->v[n_idx].id == trap->id)\r\n                {\r\n                  already_in_task = 1;\r\n                  goto end_look_for_existing_trap_in_task;\r\n                }\r\n              }\r\n            }\r\n            end_look_for_existing_trap_in_task:;\r\n            if(!already_in_task)\r\n            {\r\n              dmn_trap_chunk_list_push(scratch.arena, &task->traps, 8, trap);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: write all debug register states, for flagged-traps\r\n      //\r\n      ProfScope(\"write all debug register states, for flagged-traps\")\r\n      {\r\n        //- rjf: for each flagged trap task, iterate all threads in the\r\n        // associated process, and prepare debug registers accordingly\r\n        for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next)\r\n        {\r\n          DMN_Handle process = t->process;\r\n          DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n          for(DMN_W32_Entity *child = process_entity->first;\r\n              child != &dmn_w32_entity_nil;\r\n              child = child->next)\r\n          {\r\n            if(child->kind == DMN_W32_EntityKind_Thread)\r\n            {\r\n              switch(child->arch)\r\n              {\r\n                default:{}break;\r\n                \r\n                //- rjf: x64\r\n                case Arch_x64:\r\n                {\r\n                  REGS_RegBlockX64 regs = {0};\r\n                  dmn_w32_thread_read_reg_block(child->arch, child->handle, &regs);\r\n                  {\r\n                    U64 trap_idx = 0;\r\n                    for(DMN_TrapChunkNode *n = t->traps.first; n != 0; n = n->next)\r\n                    {\r\n                      for(U64 n_idx = 0; n_idx < n->count && trap_idx < 4; n_idx += 1, trap_idx += 1)\r\n                      {\r\n                        DMN_Trap *trap = &n->v[n_idx];\r\n                        REGS_Reg64 *addr_reg = &regs.dr0;\r\n                        switch(trap_idx)\r\n                        {\r\n                          default:{}break;\r\n                          case 0:{addr_reg = &regs.dr0;}break;\r\n                          case 1:{addr_reg = &regs.dr1;}break;\r\n                          case 2:{addr_reg = &regs.dr2;}break;\r\n                          case 3:{addr_reg = &regs.dr3;}break;\r\n                        }\r\n                        addr_reg->u64 = trap->vaddr;\r\n                        regs.dr7.u64 |= bit9|bit10|bit11;\r\n                        regs.dr7.u64 |= (1ull << (trap_idx*2));\r\n                        // NOTE(rjf): global-enable regs.dr7.u64 |= (1ull << (trap_idx*2+1));\r\n                        regs.dr7.u64 &= ~((U64)(bit17|bit18|bit19|bit20) << (trap_idx*4));\r\n                        regs.dr7.u64 &= ~((U64)(bit15|bit16));\r\n                        switch(trap->flags)\r\n                        {\r\n                          case DMN_TrapFlag_BreakOnExecute:\r\n                          default:{}break;\r\n                          case DMN_TrapFlag_BreakOnWrite:\r\n                          case DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute:\r\n                          {\r\n                            regs.dr7.u64 |= ((U64)bit17) << (trap_idx*4);\r\n                          }break;\r\n                          case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite|DMN_TrapFlag_BreakOnExecute:\r\n                          case DMN_TrapFlag_BreakOnRead|DMN_TrapFlag_BreakOnWrite:\r\n                          case DMN_TrapFlag_BreakOnRead:\r\n                          {\r\n                            regs.dr7.u64 |= (((U64)bit17) << (trap_idx*4));\r\n                            regs.dr7.u64 |= (((U64)bit18) << (trap_idx*4));\r\n                          }break;\r\n                        }\r\n                        switch(trap->size)\r\n                        {\r\n                          case 1:\r\n                          default:{}break;\r\n                          case 2:\r\n                          {\r\n                            regs.dr7.u64 |= (((U64)bit19) << (trap_idx*4));\r\n                          }break;\r\n                          case 4:\r\n                          {\r\n                            regs.dr7.u64 |= (((U64)bit19) << (trap_idx*4));\r\n                            regs.dr7.u64 |= (((U64)bit20) << (trap_idx*4));\r\n                          }break;\r\n                          case 8:\r\n                          {\r\n                            regs.dr7.u64 |= (((U64)bit20) << (trap_idx*4));\r\n                          }break;\r\n                        }\r\n                      }\r\n                    }\r\n                  }\r\n                  dmn_w32_thread_write_reg_block(child->arch, child->handle, &regs);\r\n                }break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: produce list of threads which will run\r\n      //\r\n      DMN_W32_EntityNode *first_run_thread = 0;\r\n      DMN_W32_EntityNode *last_run_thread = 0;\r\n      ProfScope(\"produce list of threads which will run\")\r\n      {\r\n        //- rjf: scan all processes\r\n        for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first;\r\n            process != &dmn_w32_entity_nil;\r\n            process = process->next)\r\n        {\r\n          if(process->kind != DMN_W32_EntityKind_Process) {continue;}\r\n          \r\n          //- rjf: determine if this process is frozen\r\n          B32 process_is_frozen = 0;\r\n          if(ctrls->run_entities_are_processes)\r\n          {\r\n            for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1)\r\n            {\r\n              if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(process)))\r\n              {\r\n                process_is_frozen = 1;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          //- rjf: scan all threads in this process\r\n          for(DMN_W32_Entity *thread = process->first;\r\n              thread != &dmn_w32_entity_nil;\r\n              thread = thread->next)\r\n          {\r\n            if(thread->kind != DMN_W32_EntityKind_Thread) {continue;}\r\n            \r\n            //- rjf: determine if this thread is frozen\r\n            B32 is_frozen = 0;\r\n            {\r\n              // rjf: single-step? freeze if not the single-step thread.\r\n              if(!dmn_handle_match(dmn_handle_zero(), ctrls->single_step_thread))\r\n              {\r\n                is_frozen = !dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->single_step_thread);\r\n              }\r\n              \r\n              // rjf: not single-stepping? determine based on run controls freezing info\r\n              else\r\n              {\r\n                if(ctrls->run_entities_are_processes)\r\n                {\r\n                  is_frozen = process_is_frozen;\r\n                }\r\n                else for(U64 idx = 0; idx < ctrls->run_entity_count; idx += 1)\r\n                {\r\n                  if(dmn_handle_match(ctrls->run_entities[idx], dmn_w32_handle_from_entity(thread)))\r\n                  {\r\n                    is_frozen = 1;\r\n                    break;\r\n                  }\r\n                }\r\n                if(ctrls->run_entities_are_unfrozen)\r\n                {\r\n                  is_frozen ^= 1;\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: disregard all other rules if this is the halter thread\r\n            if(dmn_w32_shared->halter_tid == thread->id)\r\n            {\r\n              is_frozen = 0;\r\n            }\r\n            \r\n            //- rjf: add to list\r\n            if(!is_frozen)\r\n            {\r\n              DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1);\r\n              n->v = thread;\r\n              SLLQueuePush(first_run_thread, last_run_thread, n);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: loop, consume win32 debug events until we produce the relevant demon events\r\n      //\r\n      B32 priority_mode = !dmn_handle_match(dmn_handle_zero(), ctrls->priority_thread);\r\n      B32 did_priority_mode = priority_mode;\r\n      B32 do_threads_resume = 1;\r\n      DMN_W32_EntityNode *first_ran_thread = 0;\r\n      DMN_W32_EntityNode *last_ran_thread = 0;\r\n      U64 begin_time = os_now_microseconds();\r\n      String8List debug_strings = {0};\r\n      DMN_Event *debug_strings_event = 0;\r\n      for(B32 keep_going = 1; keep_going;)\r\n      {\r\n        keep_going = 0;\r\n        \r\n        ////////////////////////\r\n        //- rjf: resume threads that we want to run\r\n        //\r\n        // if priority mode? => first, just resume priority thread\r\n        // if not? => resume all non-priority threads\r\n        //\r\n        if(do_threads_resume) ProfScope(\"resume threads that we want to run\")\r\n        {\r\n          do_threads_resume = 0;\r\n          for(DMN_W32_EntityNode *n = first_run_thread; n != 0; n = n->next)\r\n          {\r\n            DMN_W32_Entity *thread = n->v;\r\n            B32 thread_is_priority = dmn_handle_match(dmn_w32_handle_from_entity(thread), ctrls->priority_thread);\r\n            if((priority_mode && !thread_is_priority) ||\r\n               (!priority_mode && did_priority_mode && thread_is_priority))\r\n            {\r\n              continue;\r\n            }\r\n            DWORD resume_result = ResumeThread(thread->handle);\r\n            DMN_W32_EntityNode *n = push_array(scratch.arena, DMN_W32_EntityNode, 1);\r\n            SLLQueuePush(first_ran_thread, last_ran_thread, n);\r\n            n->v = thread;\r\n            switch(resume_result)\r\n            {\r\n              case 0xffffffffu:\r\n              {\r\n                // TODO(rjf): error - unknown cause. need to do GetLastError, FormatMessage\r\n              }break;\r\n              default:\r\n              {\r\n                DWORD desired_counter = 0;\r\n                DWORD current_counter = resume_result - 1;\r\n                if(current_counter != desired_counter)\r\n                {\r\n                  // NOTE(rjf): Warning. The user has manually suspended this thread,\r\n                  // so even though from Demon's perspective it thinks this thread\r\n                  // should run, it will not, because the user has manually called\r\n                  // SuspendThread or used CREATE_SUSPENDED or whatever.\r\n                }\r\n              }break;\r\n            }\r\n            if(priority_mode && thread_is_priority)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: choose win32 resume code\r\n        //\r\n        DWORD resume_code = DBG_CONTINUE;\r\n        {\r\n          if(dmn_w32_shared->exception_not_handled && !ctrls->ignore_previous_exception)\r\n          {\r\n            log_infof(\"using DBG_EXCEPTION_NOT_HANDLED\\n\");\r\n            resume_code = DBG_EXCEPTION_NOT_HANDLED;\r\n          }\r\n          else\r\n          {\r\n            log_infof(\"using DBG_CONTINUE\\n\");\r\n          }\r\n          dmn_w32_shared->exception_not_handled = 0;\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: inform windows that we're resuming, run, & obtain next debug event\r\n        //\r\n        DEBUG_EVENT evt = {0};\r\n        B32 evt_good = 0;\r\n        ProfScope(\"inform windows that we're resuming, run, & obtain next debug event\")\r\n        {\r\n          B32 resume_good = 1;\r\n          if(dmn_w32_shared->resume_needed)\r\n          {\r\n            dmn_w32_shared->resume_needed = 0;\r\n            resume_good = !!ContinueDebugEvent(dmn_w32_shared->resume_pid, dmn_w32_shared->resume_tid, resume_code);\r\n            DWORD error = GetLastError();\r\n            dmn_w32_shared->resume_needed = 0;\r\n            dmn_w32_shared->resume_tid = 0;\r\n            dmn_w32_shared->resume_pid = 0;\r\n          }\r\n          if(resume_good)\r\n          {\r\n            DWORD wait_ms = 100;\r\n            if(priority_mode)\r\n            {\r\n              wait_ms = 30;\r\n            }\r\n            evt_good = !!WaitForDebugEvent(&evt, wait_ms);\r\n            if(evt_good)\r\n            {\r\n              dmn_w32_shared->resume_needed = 1;\r\n              dmn_w32_shared->resume_pid = evt.dwProcessId;\r\n              dmn_w32_shared->resume_tid = evt.dwThreadId;\r\n            }\r\n            else\r\n            {\r\n              DWORD err = GetLastError();\r\n              (void)err;\r\n              keep_going = 1;\r\n            }\r\n            if(priority_mode)\r\n            {\r\n              priority_mode = 0;\r\n              do_threads_resume = 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: process the new event\r\n        //\r\n        if(evt_good) ProfScope(\"process the new event\")\r\n        {\r\n          switch(evt.dwDebugEventCode)\r\n          {\r\n            //////////////////////\r\n            //- rjf: process was created\r\n            //\r\n            case CREATE_PROCESS_DEBUG_EVENT:\r\n            {\r\n              // rjf: zero out \"process pending\" state\r\n              dmn_w32_shared->new_process_pending = 0;\r\n              \r\n              // rjf: unpack event\r\n              HANDLE process_handle = evt.u.CreateProcessInfo.hProcess;\r\n              HANDLE thread_handle = evt.u.CreateProcessInfo.hThread;\r\n              HANDLE module_handle = evt.u.CreateProcessInfo.hFile;\r\n              U64 tls_base = (U64)evt.u.CreateProcessInfo.lpThreadLocalBase;\r\n              U64 module_base = (U64)evt.u.CreateProcessInfo.lpBaseOfImage;\r\n              U64 module_name_vaddr = (U64)evt.u.CreateProcessInfo.lpImageName;\r\n              B32 module_name_is_unicode = (evt.u.CreateProcessInfo.fUnicode != 0);\r\n              DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process_handle, module_base);\r\n              \r\n              // rjf: create entities (thread/module are implied for initial - they are not reported by win32)\r\n              DMN_W32_Entity *process = dmn_w32_entity_alloc(dmn_w32_shared->entities_base, DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n              DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId);\r\n              DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base);\r\n              {\r\n                process->handle = process_handle;\r\n                process->arch   = image_info.arch;\r\n                thread->handle                   = thread_handle;\r\n                thread->arch                     = image_info.arch;\r\n                thread->thread.thread_local_base = tls_base;\r\n                module->handle                         = module_handle;\r\n                module->module.vaddr_range             = r1u64(module_base, image_info.size);\r\n                module->module.is_main                 = 1;\r\n                module->module.address_of_name_pointer = module_name_vaddr;\r\n                module->module.name_is_unicode         = module_name_is_unicode;\r\n              }\r\n              \r\n              // rjf: put thread into suspended state, so it matches expected initial state\r\n              SuspendThread(thread_handle);\r\n              \r\n              // rjf: set up per-process injected code (to run halter threads on &\r\n              // generate debug events)\r\n              {\r\n                U8 injection_code[DMN_W32_INJECTED_CODE_SIZE];\r\n                MemorySet(injection_code, 0xCC, DMN_W32_INJECTED_CODE_SIZE);\r\n                injection_code[0] = 0xC3;\r\n                U64 injection_size = DMN_W32_INJECTED_CODE_SIZE + sizeof(DMN_W32_InjectedBreak);\r\n                U64 injection_address = (U64)VirtualAllocEx(process_handle, 0, injection_size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE);\r\n                dmn_w32_process_write(process_handle, r1u64(injection_address, injection_address+sizeof(injection_code)), injection_code);\r\n                process->proc.injection_address = injection_address;\r\n              }\r\n              \r\n              // rjf: generate events\r\n              {\r\n                // rjf: create process\r\n                {\r\n                  DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                  e->kind    = DMN_EventKind_CreateProcess;\r\n                  e->process = dmn_w32_handle_from_entity(process);\r\n                  e->arch    = image_info.arch;\r\n                  e->code    = evt.dwProcessId;\r\n                }\r\n                \r\n                // rjf: create thread\r\n                {\r\n                  DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                  e->kind    = DMN_EventKind_CreateThread;\r\n                  e->process = dmn_w32_handle_from_entity(process);\r\n                  e->thread  = dmn_w32_handle_from_entity(thread);\r\n                  e->arch    = image_info.arch;\r\n                  e->code    = evt.dwThreadId;\r\n                }\r\n                \r\n                // rjf: load module\r\n                {\r\n                  DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                  e->kind    = DMN_EventKind_LoadModule;\r\n                  e->process = dmn_w32_handle_from_entity(process);\r\n                  e->module  = dmn_w32_handle_from_entity(module);\r\n                  e->arch    = image_info.arch;\r\n                  e->address = module_base;\r\n                  e->size    = image_info.size;\r\n                  e->string  = dmn_w32_full_path_from_module(arena, module);\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: process exited\r\n            //\r\n            case EXIT_PROCESS_DEBUG_EVENT:\r\n            {\r\n              DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n              \r\n              // rjf: if this was the process we were going to resume, then we will\r\n              // just not resume, and wait for another debug event\r\n              if(evt.dwProcessId == dmn_w32_shared->resume_pid)\r\n              {\r\n                dmn_w32_shared->resume_needed = 0;\r\n                dmn_w32_shared->resume_tid = 0;\r\n                dmn_w32_shared->resume_pid = 0;\r\n              }\r\n              \r\n              // rjf: generate events for children\r\n              for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next)\r\n              {\r\n                switch(child->kind)\r\n                {\r\n                  default:{}break;\r\n                  case DMN_W32_EntityKind_Thread:\r\n                  {\r\n                    DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                    e->kind = DMN_EventKind_ExitThread;\r\n                    e->process = dmn_w32_handle_from_entity(process);\r\n                    e->thread = dmn_w32_handle_from_entity(child);\r\n                  }break;\r\n                  case DMN_W32_EntityKind_Module:\r\n                  {\r\n                    DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                    e->kind = DMN_EventKind_UnloadModule;\r\n                    e->process = dmn_w32_handle_from_entity(process);\r\n                    e->module = dmn_w32_handle_from_entity(child);\r\n                    e->string = dmn_w32_full_path_from_module(arena, child);\r\n                  }break;\r\n                }\r\n              }\r\n              \r\n              // rjf: generate event for process\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind = DMN_EventKind_ExitProcess;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->code = evt.u.ExitProcess.dwExitCode;\r\n              }\r\n              \r\n              // rjf: release entity storage\r\n              dmn_w32_entity_release(process);\r\n              \r\n              // rjf: detach\r\n              DebugActiveProcessStop(evt.dwProcessId);\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: thread was created\r\n            //\r\n            case CREATE_THREAD_DEBUG_EVENT:\r\n            {\r\n              DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n              \r\n              // rjf: create thread entity\r\n              DMN_W32_Entity *thread = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Thread, evt.dwThreadId);\r\n              {\r\n                thread->handle                   = evt.u.CreateThread.hThread;\r\n                thread->arch                     = process->arch;\r\n                thread->thread.thread_local_base = (U64)evt.u.CreateThread.lpThreadLocalBase;\r\n              }\r\n              \r\n              // rjf: suspend thread immediately upon creation, to match with expected suspension state\r\n              DWORD sus_result = SuspendThread(thread->handle);\r\n              (void)sus_result;\r\n              \r\n              // rjf: unpack thread name\r\n              String8 thread_name = {0};\r\n              if(dmn_w32_GetThreadDescription != 0)\r\n              {\r\n                WCHAR *thread_name_w = 0;\r\n                HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w);\r\n                if(SUCCEEDED(hr))\r\n                {\r\n                  thread_name = str8_from_16(arena, str16_cstring((U16 *)thread_name_w));\r\n                  LocalFree(thread_name_w);\r\n                }\r\n              }\r\n              \r\n              // rjf: determine if this is a \"halter thread\" - the threads we spawn to halt processes\r\n              B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid);\r\n              \r\n              // rjf: generate events for non-halter threads\r\n              if(!is_halter)\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind = DMN_EventKind_CreateThread;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->thread  = dmn_w32_handle_from_entity(thread);\r\n                e->arch    = thread->arch;\r\n                e->code    = evt.dwThreadId;\r\n                e->string  = thread_name;\r\n              }\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: thread exited\r\n            //\r\n            case EXIT_THREAD_DEBUG_EVENT:\r\n            {\r\n              DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId);\r\n              DMN_W32_Entity *process = thread->parent;\r\n              \r\n              // rjf: determine if this is the halter thread\r\n              B32 is_halter = (evt.dwThreadId == dmn_w32_shared->halter_tid);\r\n              \r\n              // rjf: generate a halt event if this thread is the halter\r\n              if(is_halter)\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind = DMN_EventKind_Halt;\r\n                dmn_w32_shared->halter_process = dmn_handle_zero();\r\n                dmn_w32_shared->halter_tid = 0;\r\n                keep_going = 0;\r\n              }\r\n              \r\n              // rjf: if this thread is *not* the halter, then generate a regular exit-thread event\r\n              if(!is_halter)\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind    = DMN_EventKind_ExitThread;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->thread  = dmn_w32_handle_from_entity(thread);\r\n                e->code    = evt.u.ExitThread.dwExitCode;\r\n              }\r\n              \r\n              // rjf: release entity storage\r\n              dmn_w32_entity_release(thread);\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: DLL was loaded\r\n            //\r\n            case LOAD_DLL_DEBUG_EVENT:\r\n            {\r\n              DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n              \r\n              // rjf: extract image info\r\n              U64 module_base = (U64)evt.u.LoadDll.lpBaseOfDll;\r\n              DMN_W32_ImageInfo image_info = dmn_w32_image_info_from_process_base_vaddr(process->handle, module_base);\r\n              \r\n              // rjf: create module entity\r\n              DMN_W32_Entity *module = dmn_w32_entity_alloc(process, DMN_W32_EntityKind_Module, module_base);\r\n              {\r\n                module->handle                         = evt.u.LoadDll.hFile;\r\n                module->arch                           = image_info.arch;\r\n                module->module.vaddr_range             = r1u64(module_base, module_base+image_info.size);\r\n                module->module.address_of_name_pointer = (U64)evt.u.LoadDll.lpImageName;\r\n                module->module.name_is_unicode         = (evt.u.LoadDll.fUnicode != 0);\r\n              }\r\n              \r\n              // rjf: generate event\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind = DMN_EventKind_LoadModule;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->module  = dmn_w32_handle_from_entity(module);\r\n                e->arch    = module->arch;\r\n                e->address = module_base;\r\n                e->size    = image_info.size;\r\n                e->string  = dmn_w32_full_path_from_module(arena, module);\r\n              }\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: DLL was unloaded\r\n            //\r\n            case UNLOAD_DLL_DEBUG_EVENT:\r\n            {\r\n              U64 module_base = (U64)evt.u.UnloadDll.lpBaseOfDll;\r\n              DMN_W32_Entity *module = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Module, module_base);\r\n              DMN_W32_Entity *process = module->parent;\r\n              \r\n              // rjf: generate event\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind = DMN_EventKind_UnloadModule;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->module  = dmn_w32_handle_from_entity(module);\r\n                e->string  = dmn_w32_full_path_from_module(arena, module);\r\n              }\r\n              \r\n              // rjf: release entity storage\r\n              dmn_w32_entity_release(module);\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: exception was hit\r\n            //\r\n            case EXCEPTION_DEBUG_EVENT:\r\n            {\r\n              //- NOTE(rjf): Notes on multithreaded breakpoint events\r\n              // (2021/11/1):\r\n              //\r\n              // When many threads are simultaneously running, multiple threads\r\n              // may hit a trap \"at the same time\". When this happens there will be\r\n              // multiple events in an internal queue that we cannot see. If there\r\n              // is another event in the queue we will not see it until we call\r\n              // ContinueDebugEvent again, in a subsequent call to demon_os_run.\r\n              //\r\n              // When we get a trap event, the instruction pointer stored\r\n              // in the event will have the address of the int 3 instruction that\r\n              // was hit. Our RIP register, however, will be one byte past that.\r\n              // So, to get the behavior we want, we need to set the RIP register\r\n              // back to the address of the int 3.\r\n              //\r\n              // To deal with the fact that we may get breakpoint events later that\r\n              // were actually from this run what we do is:\r\n              //\r\n              // #1. If we get a trap event, and it corresponds to a user submitted\r\n              //     trap, then we treat it is a breakpoint event.\r\n              // #2. If we get a trap event, and it does NOT correspond to a user\r\n              //     trap in this call:\r\n              //   #A. If the actual unmodified instruction byte is NOT an int 3,\r\n              //       then this is a queued event from a previous run that is no\r\n              //       longer applicable and we skip it.\r\n              //   #B. If the actual unmodified instruction is an int 3, then this\r\n              //       becomes a trap event and we do not reset RIP.\r\n              \r\n              //- NOTE(rjf): Further notes on MULTITHREADED STEPPING ACCESS VIOLATION\r\n              // EVENTS! @rjf @rjf @rjf\r\n              // (2024/05/29):\r\n              //\r\n              // Just adding another comment here to document that the above long\r\n              // comment went completely unnoticed by me during a pass over demon,\r\n              // and I had removed the proper rollback stuff here without reading\r\n              // the above comment. So this comment just serves to make that\r\n              // original comment even heftier.\r\n              \r\n              //- NOTE(rjf): The exception record struct has a 32-bit version and a\r\n              // 64-bit version. We only currently handle the 64-bit version.\r\n              \r\n              //- rjf: unpack\r\n              DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId);\r\n              DMN_W32_Entity *process = thread->parent;\r\n              EXCEPTION_DEBUG_INFO *edi = &evt.u.Exception;\r\n              EXCEPTION_RECORD *exception = &edi->ExceptionRecord;\r\n              U64 instruction_pointer = (U64)exception->ExceptionAddress;\r\n              \r\n              //- rjf: determine if this is the first breakpoint in a process\r\n              // (breakpoint notifying us that the debugger is attached)\r\n              B32 first_bp = 0;\r\n              if(!process->proc.did_first_bp && exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT)\r\n              {\r\n                process->proc.did_first_bp = 1;\r\n                first_bp = 1;\r\n              }\r\n              \r\n              //- rjf: determine if this exception is a trap\r\n              B32 is_trap = (!first_bp &&\r\n                             (exception->ExceptionCode == DMN_W32_EXCEPTION_BREAKPOINT ||\r\n                              exception->ExceptionCode == DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN));\r\n              \r\n              //- rjf: check if this trap is a usage-code-specified trap or something else\r\n              B32 hit_user_trap = 0;\r\n              U64 user_trap_id = 0;\r\n              if(is_trap)\r\n              {\r\n                for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next)\r\n                {\r\n                  for(U64 idx = 0; idx < n->count; idx += 1)\r\n                  {\r\n                    if(dmn_handle_match(n->v[idx].process, dmn_w32_handle_from_entity(process)) && n->v[idx].vaddr == instruction_pointer)\r\n                    {\r\n                      hit_user_trap = 1;\r\n                      user_trap_id = n->v[idx].id;\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              \r\n              //- rjf: check if trap is explicit in the actual code memory\r\n              B32 hit_explicit_trap = 0;\r\n              if(is_trap && !hit_user_trap)\r\n              {\r\n                U8 instruction_byte = 0;\r\n                if(dmn_w32_process_read_struct(process->handle, instruction_pointer, &instruction_byte))\r\n                {\r\n                  hit_explicit_trap = (instruction_byte == 0xCC || instruction_byte == 0xCD);\r\n                }\r\n              }\r\n              \r\n              //- rjf: determine whether to roll back instruction pointer\r\n              B32 should_do_rollback = (hit_user_trap || (is_trap && !hit_explicit_trap));\r\n              \r\n              //- rjf: roll back thread's instruction pointer\r\n              if(should_do_rollback) ProfScope(\"roll back thread's instruction pointer\")\r\n              {\r\n                switch(thread->arch)\r\n                {\r\n                  //- rjf: default, general path\r\n                  default:\r\n                  {\r\n                    Temp temp = temp_begin(scratch.arena);\r\n                    U64 regs_block_size = regs_block_size_from_arch(thread->arch);\r\n                    void *regs_block = push_array(scratch.arena, U8, regs_block_size);\r\n                    if(dmn_w32_thread_read_reg_block(thread->arch, thread->handle, regs_block))\r\n                    {\r\n                      regs_arch_block_write_rip(thread->arch, regs_block, instruction_pointer);\r\n                      dmn_w32_thread_write_reg_block(thread->arch, thread->handle, regs_block);\r\n                    }\r\n                    temp_end(temp);\r\n                  }break;\r\n                  \r\n                  //- rjf: x64 (fastpath)\r\n                  case Arch_x64:\r\n                  {\r\n                    CONTEXT *ctx = 0;\r\n                    U32 ctx_flags = DMN_W32_CTX_X64|DMN_W32_CTX_INTEL_CONTROL;\r\n                    DWORD size = 0;\r\n                    InitializeContext(0, ctx_flags, 0, &size);\r\n                    if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)\r\n                    {\r\n                      void *ctx_memory = push_array(scratch.arena, U8, size);\r\n                      if(!InitializeContext(ctx_memory, ctx_flags, &ctx, &size))\r\n                      {\r\n                        ctx = 0;\r\n                      }\r\n                    }\r\n                    if(!GetThreadContext(thread->handle, ctx))\r\n                    {\r\n                      ctx = 0;\r\n                    }\r\n                    if(ctx != 0)\r\n                    {\r\n                      U64 rip = ctx->Rip;\r\n                      U64 new_rip = instruction_pointer;\r\n                      ctx->Rip = new_rip;\r\n                      SetThreadContext(thread->handle, ctx);\r\n                    }\r\n                  }break;\r\n                }\r\n              }\r\n              \r\n              //- rjf: not a user trap, not an explicit trap, then it's a trap that\r\n              // this thread hit previously but has since skipped\r\n              B32 hit_previous_trap = (is_trap && !hit_user_trap && !hit_explicit_trap);\r\n              \r\n              //- rjf: determine whether to skip this event\r\n              B32 skip_event = (hit_previous_trap);\r\n              \r\n              //- rjf: generate event\r\n              if(!skip_event)\r\n              {\r\n                // rjf: fill top-level info\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind    = DMN_EventKind_Exception;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->thread  = dmn_w32_handle_from_entity(thread);\r\n                e->code    = exception->ExceptionCode;\r\n                e->flags   = exception->ExceptionFlags;\r\n                e->instruction_pointer = (U64)exception->ExceptionAddress;\r\n                e->user_data = user_trap_id;\r\n                \r\n                //- rjf: fill according to exception code\r\n                switch(exception->ExceptionCode)\r\n                {\r\n                  //- rjf: fill breakpoint event info\r\n                  case DMN_W32_EXCEPTION_BREAKPOINT:\r\n                  {\r\n                    DMN_EventKind report_event_kind = DMN_EventKind_Trap;\r\n                    if(first_bp)\r\n                    {\r\n                      report_event_kind = DMN_EventKind_HandshakeComplete;\r\n                    }\r\n                    else if(hit_user_trap)\r\n                    {\r\n                      report_event_kind = DMN_EventKind_Breakpoint;\r\n                    }\r\n                    e->kind = report_event_kind;\r\n                  }break;\r\n                  \r\n                  //- rjf: fill stack buffer overrun event info\r\n                  case DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN:\r\n                  {\r\n                    e->kind = DMN_EventKind_Trap;\r\n                    if(exception->ExceptionInformation[0] == DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS)\r\n                    {\r\n                      // TODO(rjf): this is a shadow stack violation - this can imply that the spoof was hit.\r\n                      // need to handle this correctly in the ctrl layer when stepping w/ a spoof set.\r\n                      //\r\n                      // @shadow_stack_step\r\n                    }\r\n                  }break;\r\n                  \r\n                  //- rjf: fill single-step event info\r\n                  case DMN_W32_EXCEPTION_SINGLE_STEP:\r\n                  {\r\n                    e->kind = DMN_EventKind_SingleStep;\r\n                    \r\n                    // NOTE(rjf): data breakpoints are reported via single-steps\r\n                    // over the instructions which caused the breakpoint to be\r\n                    // hit - so if we have data breakpoints set, we need to\r\n                    // check this thread's debug registers, to determine if this\r\n                    // is a regular single-step or a data breakpoint hit.\r\n                    {\r\n                      // rjf: first determine the flagged trap index\r\n                      U64 flagged_trap_idx = 0;\r\n                      switch(thread->arch)\r\n                      {\r\n                        default:{NotImplemented;}break;\r\n                        case Arch_x64:\r\n                        {\r\n                          REGS_RegBlockX64 regs = {0};\r\n                          dmn_w32_thread_read_reg_block(thread->arch, thread->handle, &regs);\r\n                          if(regs.dr6.u64 & 0xF)\r\n                          {\r\n                            e->kind = DMN_EventKind_Breakpoint;\r\n                            if(0){}\r\n                            else if(regs.dr7.u64 & (1ull<<0) && regs.dr6.u64 & (1ull<<0)) { flagged_trap_idx = 0; e->address = regs.dr0.u64; }\r\n                            else if(regs.dr7.u64 & (1ull<<2) && regs.dr6.u64 & (1ull<<1)) { flagged_trap_idx = 1; e->address = regs.dr1.u64; }\r\n                            else if(regs.dr7.u64 & (1ull<<4) && regs.dr6.u64 & (1ull<<2)) { flagged_trap_idx = 2; e->address = regs.dr2.u64; }\r\n                            else if(regs.dr7.u64 & (1ull<<8) && regs.dr6.u64 & (1ull<<3)) { flagged_trap_idx = 3; e->address = regs.dr3.u64; }\r\n                          }\r\n                        }break;\r\n                      }\r\n                      \r\n                      // rjf: find the flagged trap task for this thread's process\r\n                      DMN_W32_Entity *process = thread->parent;\r\n                      DMN_FlaggedTrapTask *task = 0;\r\n                      for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next)\r\n                      {\r\n                        if(dmn_handle_match(t->process, dmn_w32_handle_from_entity(process)))\r\n                        {\r\n                          task = t;\r\n                          break;\r\n                        }\r\n                      }\r\n                      \r\n                      // rjf: find the trap\r\n                      DMN_Trap *trap = 0;\r\n                      if(task != 0)\r\n                      {\r\n                        U64 trap_idx = 0;\r\n                        for(DMN_TrapChunkNode *n = task->traps.first; n != 0; n = n->next)\r\n                        {\r\n                          for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1)\r\n                          {\r\n                            if(trap_idx == flagged_trap_idx)\r\n                            {\r\n                              trap = &n->v[n_idx];\r\n                              goto break_search_for_flagged_trap;\r\n                            }\r\n                          }\r\n                        }\r\n                        break_search_for_flagged_trap:;\r\n                      }\r\n                      \r\n                      // rjf: fill event based on trap\r\n                      if(trap != 0)\r\n                      {\r\n                        e->user_data = trap->id;\r\n                      }\r\n                    }\r\n                  }break;\r\n                  \r\n                  //- rjf: fill throw info\r\n                  case DMN_W32_EXCEPTION_THROW:\r\n                  {\r\n                    U64 exception_sp = 0;\r\n                    U64 exception_ip = 0;\r\n                    if(exception->NumberParameters >= 3)\r\n                    {\r\n                      exception_sp = (U64)exception->ExceptionInformation[1];\r\n                      exception_ip = (U64)exception->ExceptionInformation[2];\r\n                    }\r\n                    e->stack_pointer = exception_sp;\r\n                    e->exception_kind = DMN_ExceptionKind_CppThrow;\r\n                    e->exception_repeated = (edi->dwFirstChance == 0);\r\n                    dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0);\r\n                  }break;\r\n                  \r\n                  //- rjf: fill access violation info\r\n                  case DMN_W32_EXCEPTION_ACCESS_VIOLATION:\r\n                  case DMN_W32_EXCEPTION_IN_PAGE_ERROR:\r\n                  {\r\n                    U64 exception_address = 0;\r\n                    DMN_ExceptionKind exception_kind = DMN_ExceptionKind_Null;\r\n                    if(exception->NumberParameters >= 2)\r\n                    {\r\n                      switch(exception->ExceptionInformation[0])\r\n                      {\r\n                        case 0: exception_kind = DMN_ExceptionKind_MemoryRead;    break;\r\n                        case 1: exception_kind = DMN_ExceptionKind_MemoryWrite;   break;\r\n                        case 8: exception_kind = DMN_ExceptionKind_MemoryExecute; break;\r\n                      }\r\n                      exception_address = exception->ExceptionInformation[1];\r\n                    }\r\n                    e->address = exception_address;\r\n                    e->exception_kind = exception_kind;\r\n                    e->exception_repeated = (edi->dwFirstChance == 0);\r\n                    dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0);\r\n                  }break;\r\n                  \r\n                  //- rjf: fill set-thread-name info\r\n                  case DMN_W32_EXCEPTION_SET_THREAD_NAME:\r\n                  if(exception->NumberParameters >= 2)\r\n                  {\r\n                    U64 thread_name_address = exception->ExceptionInformation[1];\r\n                    DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n                    String8List thread_name_strings = {0};\r\n                    {\r\n                      U64 read_addr = thread_name_address;\r\n                      U64 total_string_size = 0;\r\n                      for(;total_string_size < KB(4);)\r\n                      {\r\n                        U8 *buffer = push_array(scratch.arena, U8, 256);\r\n                        B32 good_read = dmn_w32_process_read(process->handle, r1u64(read_addr, read_addr+256), buffer);\r\n                        if(good_read)\r\n                        {\r\n                          U64 size = 256;\r\n                          for(U64 idx = 0; idx < 256; idx += 1)\r\n                          {\r\n                            if(buffer[idx] == 0)\r\n                            {\r\n                              size = idx;\r\n                              break;\r\n                            }\r\n                          }\r\n                          String8 string_part = str8(buffer, size);\r\n                          str8_list_push(scratch.arena, &thread_name_strings, string_part);\r\n                          total_string_size += size;\r\n                          read_addr += size;\r\n                          if(size < 256)\r\n                          {\r\n                            break;\r\n                          }\r\n                        }\r\n                        else\r\n                        {\r\n                          break;\r\n                        }\r\n                      }\r\n                    }\r\n                    e->kind = DMN_EventKind_SetThreadName;\r\n                    e->string = str8_list_join(arena, &thread_name_strings, 0);\r\n                    if(exception->NumberParameters > 2)\r\n                    {\r\n                      e->code = exception->ExceptionInformation[2];\r\n                    }\r\n                  }break;\r\n                  \r\n                  //- rjf: fill set-thread-color info\r\n                  case DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR:\r\n                  {\r\n                    e->kind = DMN_EventKind_SetThreadColor;\r\n                    e->code = exception->ExceptionInformation[0];\r\n                    e->user_data = exception->ExceptionInformation[1];\r\n                  }break;\r\n                  \r\n                  //- rjf: fill set-data-breakpoint info\r\n                  case DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT:\r\n                  {\r\n                    U64 vaddr = exception->ExceptionInformation[0];\r\n                    U64 size  = exception->ExceptionInformation[1];\r\n                    U64 read  = exception->ExceptionInformation[2];\r\n                    U64 write = exception->ExceptionInformation[3];\r\n                    U64 exec  = exception->ExceptionInformation[4];\r\n                    U64 set   = exception->ExceptionInformation[5];\r\n                    e->kind = set ? DMN_EventKind_SetBreakpoint : DMN_EventKind_UnsetBreakpoint;\r\n                    e->address = vaddr;\r\n                    e->size    = size;\r\n                    if(read)  { e->flags |= DMN_TrapFlag_BreakOnRead; }\r\n                    if(write) { e->flags |= DMN_TrapFlag_BreakOnWrite; }\r\n                    if(exec)  { e->flags |= DMN_TrapFlag_BreakOnExecute; }\r\n                  }break;\r\n                  \r\n                  //- rjf: fill set-vaddr-range-note info\r\n                  case DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE:\r\n                  {\r\n                    U64 vaddr      = exception->ExceptionInformation[0];\r\n                    U64 size       = exception->ExceptionInformation[1];\r\n                    U64 name_vaddr = exception->ExceptionInformation[2];\r\n                    U64 name_size  = exception->ExceptionInformation[3];\r\n                    U8 *name_buffer = push_array(arena, U8, name_size);\r\n                    dmn_w32_process_read(process->handle, r1u64(name_vaddr, name_vaddr+name_size), name_buffer), \r\n                    e->kind = DMN_EventKind_SetVAddrRangeNote;\r\n                    e->address = vaddr;\r\n                    e->size    = size;\r\n                    e->string  = str8(name_buffer, name_size);\r\n                  }break;\r\n                  \r\n                  //- rjf: unhandled exception case\r\n                  default:\r\n                  {\r\n                    e->exception_repeated = (edi->dwFirstChance == 0);\r\n                    dmn_w32_shared->exception_not_handled = (edi->dwFirstChance != 0);\r\n                  }break;\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: output debug string was gathered\r\n            //\r\n            case OUTPUT_DEBUG_STRING_EVENT:\r\n            {\r\n              // rjf: unpack event\r\n              DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n              DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId);\r\n              U64 string_address = (U64)evt.u.DebugString.lpDebugStringData;\r\n              U64 string_size = (U64)evt.u.DebugString.nDebugStringLength;\r\n              \r\n              // rjf: read memory\r\n              U8 *buffer = push_array_no_zero(scratch.arena, U8, string_size + 1);\r\n              dmn_w32_process_read(process->handle, r1u64(string_address, string_address+string_size), buffer);\r\n              buffer[string_size] = 0;\r\n              \r\n              // rjf: extract into string\r\n              String8 debug_string = str8(buffer, string_size);\r\n              if(debug_string.size != 0 && buffer[string_size-1] == 0)\r\n              {\r\n                debug_string.size -= 1;\r\n              }\r\n              \r\n              // rjf: make debug string event\r\n              debug_strings_event = dmn_event_list_push(arena, &events);\r\n              debug_strings_event->kind = DMN_EventKind_DebugString;\r\n              \r\n              // rjf: push into debug strings\r\n              str8_list_push(scratch.arena, &debug_strings, debug_string);\r\n              keep_going = 1;\r\n              \r\n              // rjf: exit loop, given sufficient amount of text\r\n              if(debug_strings.total_size >= KB(4))\r\n              {\r\n                keep_going = 0;\r\n              }\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: a \"rip event\" - a \"system debugging error\".\r\n            //\r\n            case RIP_EVENT:\r\n            {\r\n              DMN_W32_Entity *process = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Process, evt.dwProcessId);\r\n              DMN_W32_Entity *thread = dmn_w32_entity_from_kind_id(DMN_W32_EntityKind_Thread, evt.dwThreadId);\r\n              DMN_Event *e = dmn_event_list_push(arena, &events);\r\n              e->kind    = DMN_EventKind_Exception;\r\n              e->process = dmn_w32_handle_from_entity(process);\r\n              e->thread  = dmn_w32_handle_from_entity(thread);\r\n            }break;\r\n            \r\n            //////////////////////\r\n            //- rjf: default case - some kind of debugging event that we don't currently consume.\r\n            //\r\n            default:\r\n            {\r\n              NoOp;\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: exit loop after a little while, so we keep pumping e.g. debug strings\r\n        //\r\n        if(os_now_microseconds() >= begin_time+100000 && debug_strings.total_size != 0)\r\n        {\r\n          keep_going = 0;\r\n        }\r\n      }\r\n      \r\n      ////////////////////////\r\n      //- rjf: send out event for any remaining debug strings\r\n      //\r\n      if(debug_strings.total_size != 0 && debug_strings_event != 0)\r\n      {\r\n        String8 debug_strings_joined = str8_list_join(arena, &debug_strings, 0);\r\n        debug_strings_event->string = debug_strings_joined;\r\n      }\r\n      \r\n      ////////////////////////\r\n      //- rjf: suspend threads which ran\r\n      //\r\n      ProfScope(\"suspend threads which ran\")\r\n      {\r\n        for(DMN_W32_EntityNode *n = first_ran_thread; n != 0; n = n->next)\r\n        {\r\n          DMN_W32_Entity *thread = n->v;\r\n          if(thread->kind != DMN_W32_EntityKind_Thread)\r\n          {\r\n            continue;\r\n          }\r\n          DWORD suspend_result = SuspendThread(thread->handle);\r\n          switch(suspend_result)\r\n          {\r\n            case 0xffffffffu:\r\n            {\r\n              // TODO(rjf): error - unknown cause. need to do do GetLastError, FormatMessage\r\n              //\r\n              // NOTE(rjf): this can happen when the event is EXIT_THREAD_DEBUG_EVENT\r\n              // or EXIT_PROCESS_DEBUG_EVENT. after such an event, SuspendThread\r\n              // gives error code 5 (access denied). this has no adverse effects, but\r\n              // if we want to start reporting errors we should take care to avoid\r\n              // calling SuspendThread in that case.\r\n            }break;\r\n            default:\r\n            {\r\n              DWORD desired_counter = 1;\r\n              DWORD current_counter = suspend_result + 1;\r\n              if(current_counter != desired_counter)\r\n              {\r\n                // NOTE(rjf): Warning. We've suspended to something higher than 1.\r\n                // In this case, it means the user probably created the thread in\r\n                // a suspended state, or they called SuspendThread.\r\n              }\r\n            }break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      ////////////////////////\r\n      //- rjf: gather new thread-names\r\n      //\r\n      ProfScope(\"gather new thread names\") if(dmn_w32_GetThreadDescription != 0)\r\n      {\r\n        for(DMN_W32_Entity *process = dmn_w32_shared->entities_base->first;\r\n            process != &dmn_w32_entity_nil;\r\n            process = process->next)\r\n        {\r\n          if(process->kind != DMN_W32_EntityKind_Process) { continue; }\r\n          for(DMN_W32_Entity *thread = process->first;\r\n              thread != &dmn_w32_entity_nil;\r\n              thread = thread->next)\r\n          {\r\n            if(thread->kind != DMN_W32_EntityKind_Thread) { continue; }\r\n            if(thread->thread.last_name_hash == 0 ||\r\n               thread->thread.name_gather_time_us+1000000 <= os_now_microseconds())\r\n            {\r\n              String8 name = {0};\r\n              {\r\n                WCHAR *thread_name_w = 0;\r\n                HRESULT hr = dmn_w32_GetThreadDescription(thread->handle, &thread_name_w);\r\n                if(SUCCEEDED(hr))\r\n                {\r\n                  name = str8_from_16(scratch.arena, str16_cstring((U16 *)thread_name_w));\r\n                  LocalFree(thread_name_w);\r\n                }\r\n              }\r\n              U64 name_hash = dmn_w32_hash_from_string(name);\r\n              if(name.size != 0 && name_hash != thread->thread.last_name_hash)\r\n              {\r\n                DMN_Event *e = dmn_event_list_push(arena, &events);\r\n                e->kind    = DMN_EventKind_SetThreadName;\r\n                e->process = dmn_w32_handle_from_entity(process);\r\n                e->thread  = dmn_w32_handle_from_entity(thread);\r\n                e->string  = push_str8_copy(arena, name);\r\n              }\r\n              thread->thread.name_gather_time_us = os_now_microseconds();\r\n              thread->thread.last_name_hash = name_hash;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: restore original memory at trap locations\r\n      //\r\n      ProfScope(\"restore original memory at trap locations\")\r\n      {\r\n        U64 trap_idx = 0;\r\n        for(DMN_TrapChunkNode *n = ctrls->traps.first; n != 0; n = n->next)\r\n        {\r\n          for(U64 n_idx = 0; n_idx < n->count; n_idx += 1, trap_idx += 1)\r\n          {\r\n            DMN_Trap *trap = n->v+n_idx;\r\n            if(trap->flags == 0)\r\n            {\r\n              U8 og_byte = trap_swap_bytes[trap_idx];\r\n              if(og_byte != 0xCC)\r\n              {\r\n                dmn_process_write(trap->process, r1u64(trap->vaddr, trap->vaddr+1), &og_byte);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: clear all debug register states, for flagged-traps\r\n      //\r\n      ProfScope(\"clear all debug register states, for flagged-traps\")\r\n      {\r\n        for(DMN_FlaggedTrapTask *t = first_flagged_trap_task; t != 0; t = t->next)\r\n        {\r\n          DMN_Handle process = t->process;\r\n          DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n          for(DMN_W32_Entity *child = process_entity->first;\r\n              child != &dmn_w32_entity_nil;\r\n              child = child->next)\r\n          {\r\n            if(child->kind == DMN_W32_EntityKind_Thread)\r\n            {\r\n              switch(child->arch)\r\n              {\r\n                default:{}break;\r\n                \r\n                //- rjf: x64\r\n                case Arch_x64:\r\n                {\r\n                  REGS_RegBlockX64 regs = {0};\r\n                  dmn_w32_thread_read_reg_block(child->arch, child->handle, &regs);\r\n                  regs.dr7.u64 = 0;\r\n                  dmn_w32_thread_write_reg_block(child->arch, child->handle, &regs);\r\n                }break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: unset single step bit\r\n      //\r\n      if(!dmn_handle_match(ctrls->single_step_thread, dmn_handle_zero())) ProfScope(\"unset single step bit\")\r\n      {\r\n        DMN_W32_Entity *thread = dmn_w32_entity_from_handle(ctrls->single_step_thread);\r\n        Arch arch = thread->arch;\r\n        switch(arch)\r\n        {\r\n          //- rjf: unimplemented win32/arch combos\r\n          case Arch_Null:\r\n          case Arch_COUNT:\r\n          {}break;\r\n          case Arch_arm64:\r\n          case Arch_arm32:\r\n          {NotImplemented;}break;\r\n          \r\n          //- rjf: x86/64\r\n          case Arch_x86:\r\n          {\r\n            REGS_RegBlockX86 regs = {0};\r\n            dmn_thread_read_reg_block(ctrls->single_step_thread, &regs);\r\n            regs.eflags.u32 &= ~0x100;\r\n            dmn_thread_write_reg_block(ctrls->single_step_thread, &regs);\r\n          }break;\r\n          case Arch_x64:\r\n          {\r\n            if(!GetThreadContext(thread->handle, single_step_thread_ctx))\r\n            {\r\n              single_step_thread_ctx = 0;\r\n            }\r\n            if(single_step_thread_ctx != 0)\r\n            {\r\n              U64 rflags = single_step_thread_ctx->EFlags|0x2;\r\n              U64 new_rflags = rflags & ~0x100;\r\n              single_step_thread_ctx->EFlags = new_rflags;\r\n              SetThreadContext(thread->handle, single_step_thread_ctx);\r\n            }\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: produce debug events from queued up detached processes\r\n    //\r\n    case DMN_W32_EventGenPath_DetachProcesses:\r\n    {\r\n      for(DMN_HandleNode *n = dmn_w32_shared->detach_processes.first; n != 0; n = n->next)\r\n      {\r\n        DMN_W32_Entity *process = dmn_w32_entity_from_handle(n->v);\r\n        \r\n        // rjf: push exit thread events\r\n        for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next)\r\n        {\r\n          if(child->kind == DMN_W32_EntityKind_Thread)\r\n          {\r\n            DMN_Event *e = dmn_event_list_push(arena, &events);\r\n            e->kind    = DMN_EventKind_ExitThread;\r\n            e->process = dmn_w32_handle_from_entity(process);\r\n            e->thread  = dmn_w32_handle_from_entity(child);\r\n          }\r\n        }\r\n        \r\n        // rjf: push unload module events\r\n        for(DMN_W32_Entity *child = process->first; child != &dmn_w32_entity_nil; child = child->next)\r\n        {\r\n          if(child->kind == DMN_W32_EntityKind_Module)\r\n          {\r\n            DMN_Event *e = dmn_event_list_push(arena, &events);\r\n            e->kind    = DMN_EventKind_UnloadModule;\r\n            e->process = dmn_w32_handle_from_entity(process);\r\n            e->module  = dmn_w32_handle_from_entity(child);\r\n            e->string  = dmn_w32_full_path_from_module(arena, child);\r\n          }\r\n        }\r\n        \r\n        // rjf: push exit process event\r\n        {\r\n          DMN_Event *e = dmn_event_list_push(arena, &events);\r\n          e->kind    = DMN_EventKind_ExitProcess;\r\n          e->process = dmn_w32_handle_from_entity(process);\r\n        }\r\n        \r\n        // rjf: free process\r\n        dmn_w32_entity_release(process);\r\n      }\r\n      \r\n      // rjf: reset queued up detached processes\r\n      MemoryZeroStruct(&dmn_w32_shared->detach_processes);\r\n      arena_clear(dmn_w32_shared->detach_arena);\r\n    }break;\r\n  }\r\n  \r\n  dmn_access_close();\r\n  return events;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Halting (Implemented Per-OS)\r\n\r\ninternal void\r\ndmn_halt(U64 code, U64 user_data)\r\n{\r\n  if(dmn_handle_match(dmn_handle_zero(), dmn_w32_shared->halter_process))\r\n  {\r\n    DMN_W32_Entity *process = &dmn_w32_entity_nil;\r\n    for(DMN_W32_Entity *entity = dmn_w32_shared->entities_base->first;\r\n        entity != &dmn_w32_entity_nil;\r\n        entity = entity->next)\r\n    {\r\n      if(entity->kind == DMN_W32_EntityKind_Process)\r\n      {\r\n        process = entity;\r\n        break;\r\n      }\r\n    }\r\n    if(process != &dmn_w32_entity_nil)\r\n    {\r\n      dmn_w32_shared->halter_process = dmn_w32_handle_from_entity(process);\r\n      DMN_W32_InjectedBreak injection = {code, user_data};\r\n      U64 data_injection_address = process->proc.injection_address + DMN_W32_INJECTED_CODE_SIZE;\r\n      dmn_w32_process_write_struct(process->handle, data_injection_address, &injection);\r\n      dmn_w32_shared->halter_tid = dmn_w32_inject_thread(process->handle, process->proc.injection_address);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @dmn_os_hooks Introspection Functions (Implemented Per-OS)\r\n\r\n//- rjf: non-blocking-control-thread access barriers\r\n\r\ninternal B32\r\ndmn_access_open(void)\r\n{\r\n  B32 result = 0;\r\n  if(dmn_w32_ctrl_thread)\r\n  {\r\n    result = 1;\r\n  }\r\n  else\r\n  {\r\n    mutex_take(dmn_w32_shared->access_mutex);\r\n    result = !dmn_w32_shared->access_run_state;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ndmn_access_close(void)\r\n{\r\n  if(!dmn_w32_ctrl_thread)\r\n  {\r\n    mutex_drop(dmn_w32_shared->access_mutex);\r\n  }\r\n}\r\n\r\n//- rjf: processes\r\n\r\ninternal U64\r\ndmn_process_memory_reserve(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n  U64 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    result = (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_RESERVE, PAGE_READWRITE);\r\n    if(result == 0)\r\n    {\r\n      result = (U64)VirtualAllocEx(process_entity->handle, 0, size, MEM_RESERVE, PAGE_READWRITE);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_commit(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    (U64)VirtualAllocEx(process_entity->handle, (void *)vaddr, size, MEM_COMMIT, PAGE_READWRITE);\r\n  }\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_decommit(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    VirtualFreeEx(process_entity->handle, (void *)vaddr, size, MEM_DECOMMIT);\r\n  }\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_release(DMN_Handle process, U64 vaddr, U64 size)\r\n{\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    VirtualFreeEx(process_entity->handle, (void *)vaddr, 0, MEM_RELEASE);\r\n  }\r\n}\r\n\r\ninternal void\r\ndmn_process_memory_protect(DMN_Handle process, U64 vaddr, U64 size, OS_AccessFlags flags)\r\n{\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *process_entity = dmn_w32_entity_from_handle(process);\r\n    DWORD old_flags = 0;\r\n    DWORD new_flags = PAGE_NOACCESS;\r\n    switch(flags)\r\n    {\r\n      default:{}break;\r\n      case OS_AccessFlag_Execute:{new_flags = PAGE_EXECUTE;}break;\r\n      case OS_AccessFlag_Execute|OS_AccessFlag_Read:{new_flags = PAGE_EXECUTE_READ;}break;\r\n      case OS_AccessFlag_Execute|OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_EXECUTE_READWRITE;}break;\r\n      case OS_AccessFlag_Read:{new_flags = PAGE_READONLY;}break;\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Write:{new_flags = PAGE_READWRITE;}break;\r\n    }\r\n    VirtualProtectEx(process_entity->handle, (void *)vaddr, size, new_flags, &old_flags);\r\n  }\r\n}\r\n\r\ninternal U64\r\ndmn_process_read(DMN_Handle process, Rng1U64 range, void *dst)\r\n{\r\n  U64 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process);\r\n    result = dmn_w32_process_read(entity->handle, range, dst);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_process_write(DMN_Handle process, Rng1U64 range, void *src)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *entity = dmn_w32_entity_from_handle(process);\r\n    result = dmn_w32_process_write(entity->handle, range, src);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: threads\r\n\r\ninternal Arch\r\ndmn_arch_from_thread(DMN_Handle handle)\r\n{\r\n  Arch arch = Arch_Null;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle);\r\n    arch = entity->arch;\r\n  }\r\n  return arch;\r\n}\r\n\r\ninternal U64\r\ndmn_stack_base_vaddr_from_thread(DMN_Handle handle)\r\n{\r\n  U64 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle);\r\n    if(thread->kind == DMN_W32_EntityKind_Thread)\r\n    {\r\n      DMN_W32_Entity *process = thread->parent;\r\n      U64 tlb = thread->thread.thread_local_base;\r\n      switch(thread->arch)\r\n      {\r\n        case Arch_Null:\r\n        case Arch_COUNT:\r\n        {}break;\r\n        case Arch_arm64:\r\n        case Arch_arm32:\r\n        {NotImplemented;}break;\r\n        case Arch_x64:\r\n        {\r\n          U64 stack_base_addr = tlb + 0x8;\r\n          dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+8), &result);\r\n        }break;\r\n        case Arch_x86:\r\n        {\r\n          U64 stack_base_addr = tlb + 0x4;\r\n          dmn_w32_process_read(process->handle, r1u64(stack_base_addr, stack_base_addr+4), &result);\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ndmn_tls_root_vaddr_from_thread(DMN_Handle handle)\r\n{\r\n  U64 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *entity = dmn_w32_entity_from_handle(handle);\r\n    if(entity->kind == DMN_W32_EntityKind_Thread)\r\n    {\r\n      result = entity->thread.thread_local_base;\r\n      switch(entity->arch)\r\n      {\r\n        case Arch_Null:\r\n        case Arch_COUNT:\r\n        {}break;\r\n        case Arch_arm64:\r\n        case Arch_arm32:\r\n        {NotImplemented;}break;\r\n        case Arch_x64:\r\n        {\r\n          result += 88;\r\n        }break;\r\n        case Arch_x86:\r\n        {\r\n          result += 44;\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_thread_read_reg_block(DMN_Handle handle, void *reg_block)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle);\r\n    result = dmn_w32_thread_read_reg_block(thread->arch, thread->handle, reg_block);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ndmn_thread_write_reg_block(DMN_Handle handle, void *reg_block)\r\n{\r\n  B32 result = 0;\r\n  DMN_AccessScope\r\n  {\r\n    DMN_W32_Entity *thread = dmn_w32_entity_from_handle(handle);\r\n    result = dmn_w32_thread_write_reg_block(thread->arch, thread->handle, reg_block);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: system process listing\r\n\r\ninternal void\r\ndmn_process_iter_begin(DMN_ProcessIter *iter)\r\n{\r\n  MemoryZeroStruct(iter);\r\n  iter->v[0] = (U64)CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);\r\n}\r\n\r\ninternal B32\r\ndmn_process_iter_next(Arena *arena, DMN_ProcessIter *iter, DMN_ProcessInfo *info_out)\r\n{\r\n  B32 result = 0;\r\n  \r\n  //- rjf: get the next process entry\r\n  PROCESSENTRY32W process_entry = {sizeof(process_entry)};\r\n  HANDLE snapshot = (HANDLE)iter->v[0];\r\n  if(iter->v[1] == 0)\r\n  {\r\n    if(Process32FirstW(snapshot, &process_entry))\r\n    {\r\n      result = 1;\r\n    }\r\n  }\r\n  else\r\n  {\r\n    if(Process32NextW(snapshot, &process_entry))\r\n    {\r\n      result = 1;\r\n    }\r\n  }\r\n  \r\n  //- rjf: increment counter\r\n  iter->v[1] += 1;\r\n  \r\n  //- rjf: convert to process info\r\n  if(result)\r\n  {\r\n    info_out->name = str8_from_16(arena, str16_cstring((U16*)process_entry.szExeFile));\r\n    info_out->pid = (U32)process_entry.th32ProcessID;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal void\r\ndmn_process_iter_end(DMN_ProcessIter *iter)\r\n{\r\n  CloseHandle((HANDLE)iter->v[0]);\r\n  MemoryZeroStruct(iter);\r\n}\r\n"
  },
  {
    "path": "src/demon/win32/demon_core_win32.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DEMON_CORE_WIN32_H\r\n#define DEMON_CORE_WIN32_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Windows Includes\r\n\r\n#define WIN32_LEAN_AND_MEAN\r\n#include <windows.h>\r\n#include <psapi.h>\r\n#include <tlhelp32.h>\r\n\r\n////////////////////////////////\r\n//~ rjf: Win32 Exception Codes\r\n\r\n#define DMN_W32_EXCEPTION_BREAKPOINT                     0x80000003u\r\n#define DMN_W32_EXCEPTION_SINGLE_STEP                    0x80000004u\r\n#define DMN_W32_EXCEPTION_LONG_JUMP                      0x80000026u\r\n#define DMN_W32_EXCEPTION_ACCESS_VIOLATION               0xC0000005u\r\n#define DMN_W32_EXCEPTION_ARRAY_BOUNDS_EXCEEDED          0xC000008Cu\r\n#define DMN_W32_EXCEPTION_DATA_TYPE_MISALIGNMENT         0x80000002u\r\n#define DMN_W32_EXCEPTION_GUARD_PAGE_VIOLATION           0x80000001u\r\n#define DMN_W32_EXCEPTION_FLT_DENORMAL_OPERAND           0xC000008Du\r\n#define DMN_W32_EXCEPTION_FLT_DEVIDE_BY_ZERO             0xC000008Eu\r\n#define DMN_W32_EXCEPTION_FLT_INEXACT_RESULT             0xC000008Fu\r\n#define DMN_W32_EXCEPTION_FLT_INVALID_OPERATION          0xC0000090u\r\n#define DMN_W32_EXCEPTION_FLT_OVERFLOW                   0xC0000091u\r\n#define DMN_W32_EXCEPTION_FLT_STACK_CHECK                0xC0000092u\r\n#define DMN_W32_EXCEPTION_FLT_UNDERFLOW                  0xC0000093u\r\n#define DMN_W32_EXCEPTION_INT_DIVIDE_BY_ZERO             0xC0000094u\r\n#define DMN_W32_EXCEPTION_INT_OVERFLOW                   0xC0000095u\r\n#define DMN_W32_EXCEPTION_PRIVILEGED_INSTRUCTION         0xC0000096u\r\n#define DMN_W32_EXCEPTION_ILLEGAL_INSTRUCTION            0xC000001Du\r\n#define DMN_W32_EXCEPTION_IN_PAGE_ERROR                  0xC0000006u\r\n#define DMN_W32_EXCEPTION_INVALID_DISPOSITION            0xC0000026u\r\n#define DMN_W32_EXCEPTION_NONCONTINUABLE                 0xC0000025u\r\n#define DMN_W32_EXCEPTION_STACK_OVERFLOW                 0xC00000FDu\r\n#define DMN_W32_EXCEPTION_INVALID_HANDLE                 0xC0000008u\r\n#define DMN_W32_EXCEPTION_UNWIND_CONSOLIDATE             0x80000029u\r\n#define DMN_W32_EXCEPTION_DLL_NOT_FOUND                  0xC0000135u\r\n#define DMN_W32_EXCEPTION_ORDINAL_NOT_FOUND              0xC0000138u\r\n#define DMN_W32_EXCEPTION_ENTRY_POINT_NOT_FOUND          0xC0000139u\r\n#define DMN_W32_EXCEPTION_DLL_INIT_FAILED                0xC0000142u\r\n#define DMN_W32_EXCEPTION_CONTROL_C_EXIT                 0xC000013Au\r\n#define DMN_W32_EXCEPTION_FLT_MULTIPLE_FAULTS            0xC00002B4u\r\n#define DMN_W32_EXCEPTION_FLT_MULTIPLE_TRAPS             0xC00002B5u\r\n#define DMN_W32_EXCEPTION_NAT_CONSUMPTION                0xC00002C9u\r\n#define DMN_W32_EXCEPTION_HEAP_CORRUPTION                0xC0000374u\r\n#define DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN           0xC0000409u\r\n#define DMN_W32_EXCEPTION_INVALID_CRUNTIME_PARAM         0xC0000417u\r\n#define DMN_W32_EXCEPTION_ASSERT_FAILURE                 0xC0000420u\r\n#define DMN_W32_EXCEPTION_NO_MEMORY                      0xC0000017u\r\n#define DMN_W32_EXCEPTION_THROW                          0xE06D7363u\r\n#define DMN_W32_EXCEPTION_SET_THREAD_NAME                0x406d1388u\r\n#define DMN_w32_EXCEPTION_CLRDBG_NOTIFICATION            0x04242420u\r\n#define DMN_w32_EXCEPTION_CLR                            0xE0434352u\r\n#define DMN_W32_EXCEPTION_RADDBG_SET_THREAD_COLOR        0x00524144u\r\n#define DMN_W32_EXCEPTION_RADDBG_SET_BREAKPOINT          0x00524145u\r\n#define DMN_W32_EXCEPTION_RADDBG_SET_VADDR_RANGE_NOTE    0x00524156u\r\n\r\n////////////////////////////////\r\n//~ rjf: Win32 Exception ExceptionInformation Codes\r\n//\r\n// used as a subcode, apparently in all cases, for DMN_W32_EXCEPTION_STACK_BUFFER_OVERRUN.\r\n// need to somehow pipe this through & interpret it correctly in outer layers... @fastfail\r\n\r\n#define DMN_W32_FAST_FAIL_LEGACY_GS_VIOLATION               0\r\n#define DMN_W32_FAST_FAIL_VTGUARD_CHECK_FAILURE             1\r\n#define DMN_W32_FAST_FAIL_STACK_COOKIE_CHECK_FAILURE        2\r\n#define DMN_W32_FAST_FAIL_CORRUPT_LIST_ENTRY                3\r\n#define DMN_W32_FAST_FAIL_INCORRECT_STACK                   4\r\n#define DMN_W32_FAST_FAIL_INVALID_ARG                       5\r\n#define DMN_W32_FAST_FAIL_GS_COOKIE_INIT                    6\r\n#define DMN_W32_FAST_FAIL_FATAL_APP_EXIT                    7\r\n#define DMN_W32_FAST_FAIL_RANGE_CHECK_FAILURE               8\r\n#define DMN_W32_FAST_FAIL_UNSAFE_REGISTRY_ACCESS            9\r\n#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE         10\r\n#define DMN_W32_FAST_FAIL_GUARD_WRITE_CHECK_FAILURE         11\r\n#define DMN_W32_FAST_FAIL_INVALID_FIBER_SWITCH              12\r\n#define DMN_W32_FAST_FAIL_INVALID_SET_OF_CONTEXT            13\r\n#define DMN_W32_FAST_FAIL_INVALID_REFERENCE_COUNT           14\r\n#define DMN_W32_FAST_FAIL_INVALID_JUMP_BUFFER               18\r\n#define DMN_W32_FAST_FAIL_MRDATA_MODIFIED                   19\r\n#define DMN_W32_FAST_FAIL_CERTIFICATION_FAILURE             20\r\n#define DMN_W32_FAST_FAIL_INVALID_EXCEPTION_CHAIN           21\r\n#define DMN_W32_FAST_FAIL_CRYPTO_LIBRARY                    22\r\n#define DMN_W32_FAST_FAIL_INVALID_CALL_IN_DLL_CALLOUT       23\r\n#define DMN_W32_FAST_FAIL_INVALID_IMAGE_BASE                24\r\n#define DMN_W32_FAST_FAIL_DLOAD_PROTECTION_FAILURE          25\r\n#define DMN_W32_FAST_FAIL_UNSAFE_EXTENSION_CALL             26\r\n#define DMN_W32_FAST_FAIL_DEPRECATED_SERVICE_INVOKED        27\r\n#define DMN_W32_FAST_FAIL_INVALID_BUFFER_ACCESS             28\r\n#define DMN_W32_FAST_FAIL_INVALID_BALANCED_TREE             29\r\n#define DMN_W32_FAST_FAIL_INVALID_NEXT_THREAD               30\r\n#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_SUPPRESSED      31         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_APCS_DISABLED                     32\r\n#define DMN_W32_FAST_FAIL_INVALID_IDLE_STATE                33\r\n#define DMN_W32_FAST_FAIL_MRDATA_PROTECTION_FAILURE         34\r\n#define DMN_W32_FAST_FAIL_UNEXPECTED_HEAP_EXCEPTION         35\r\n#define DMN_W32_FAST_FAIL_INVALID_LOCK_STATE                36\r\n#define DMN_W32_FAST_FAIL_GUARD_JUMPTABLE                   37         // Known to compiler, must retain value 37\r\n#define DMN_W32_FAST_FAIL_INVALID_LONGJUMP_TARGET           38\r\n#define DMN_W32_FAST_FAIL_INVALID_DISPATCH_CONTEXT          39\r\n#define DMN_W32_FAST_FAIL_INVALID_THREAD                    40\r\n#define DMN_W32_FAST_FAIL_INVALID_SYSCALL_NUMBER            41         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_INVALID_FILE_OPERATION            42         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_LPAC_ACCESS_DENIED                43         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_GUARD_SS_FAILURE                  44\r\n#define DMN_W32_FAST_FAIL_LOADER_CONTINUITY_FAILURE         45         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_GUARD_EXPORT_SUPPRESSION_FAILURE  46\r\n#define DMN_W32_FAST_FAIL_INVALID_CONTROL_STACK             47\r\n#define DMN_W32_FAST_FAIL_SET_CONTEXT_DENIED                48\r\n#define DMN_W32_FAST_FAIL_INVALID_IAT                       49\r\n#define DMN_W32_FAST_FAIL_HEAP_METADATA_CORRUPTION          50\r\n#define DMN_W32_FAST_FAIL_PAYLOAD_RESTRICTION_VIOLATION     51\r\n#define DMN_W32_FAST_FAIL_LOW_LABEL_ACCESS_DENIED           52         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_ENCLAVE_CALL_FAILURE              53\r\n#define DMN_W32_FAST_FAIL_UNHANDLED_LSS_EXCEPTON            54\r\n#define DMN_W32_FAST_FAIL_ADMINLESS_ACCESS_DENIED           55         // Telemetry, nonfatal\r\n#define DMN_W32_FAST_FAIL_UNEXPECTED_CALL                   56\r\n#define DMN_W32_FAST_FAIL_CONTROL_INVALID_RETURN_ADDRESS    57\r\n#define DMN_W32_FAST_FAIL_UNEXPECTED_HOST_BEHAVIOR          58\r\n#define DMN_W32_FAST_FAIL_FLAGS_CORRUPTION                  59\r\n#define DMN_W32_FAST_FAIL_VEH_CORRUPTION                    60\r\n#define DMN_W32_FAST_FAIL_ETW_CORRUPTION                    61\r\n#define DMN_W32_FAST_FAIL_RIO_ABORT                         62\r\n#define DMN_W32_FAST_FAIL_INVALID_PFN                       63\r\n#define DMN_W32_FAST_FAIL_GUARD_ICALL_CHECK_FAILURE_XFG     64\r\n#define DMN_W32_FAST_FAIL_CAST_GUARD                        65         // Known to compiler, must retain value 65\r\n#define DMN_W32_FAST_FAIL_HOST_VISIBILITY_CHANGE            66\r\n#define DMN_W32_FAST_FAIL_KERNEL_CET_SHADOW_STACK_ASSIST    67\r\n#define DMN_W32_FAST_FAIL_PATCH_CALLBACK_FAILED             68\r\n#define DMN_W32_FAST_FAIL_NTDLL_PATCH_FAILED                69\r\n#define DMN_W32_FAST_FAIL_INVALID_FLS_DATA                  70\r\n#define DMN_W32_FAST_FAIL_INVALID_FAST_FAIL_CODE            0xFFFFFFFF\r\n\r\n////////////////////////////////\r\n//~ rjf: Win32 Register Codes\r\n\r\n#define DMN_W32_CTX_X86       0x00010000\r\n#define DMN_W32_CTX_X64       0x00100000\r\n\r\n#define DMN_W32_CTX_INTEL_CONTROL       0x0001    // segss, rsp, segcs, rip, and rflags\r\n#define DMN_W32_CTX_INTEL_INTEGER       0x0002    // rax, rcx, rdx, rbx, rbp, rsi, rdi, and r8-r15\r\n#define DMN_W32_CTX_INTEL_SEGMENTS      0x0004    // segds, seges, segfs, and seggs\r\n#define DMN_W32_CTX_INTEL_FLOATS        0x0008    // xmm0-xmm15\r\n#define DMN_W32_CTX_INTEL_DEBUG         0x0010    // dr0-dr3 and dr6-dr7\r\n#define DMN_W32_CTX_INTEL_EXTENDED      0x0020\r\n#define DMN_W32_CTX_INTEL_XSTATE        0x0040\r\n\r\n#define DMN_W32_CTX_X86_ALL (DMN_W32_CTX_X86 | \\\r\nDMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \\\r\nDMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_DEBUG | \\\r\nDMN_W32_CTX_INTEL_EXTENDED)\r\n#define DMN_W32_CTX_X64_ALL (DMN_W32_CTX_X64 | \\\r\nDMN_W32_CTX_INTEL_CONTROL | DMN_W32_CTX_INTEL_INTEGER | \\\r\nDMN_W32_CTX_INTEL_SEGMENTS | DMN_W32_CTX_INTEL_FLOATS | \\\r\nDMN_W32_CTX_INTEL_DEBUG)\r\n\r\n////////////////////////////////\r\n//~ rjf: Per-Entity State\r\n\r\ntypedef enum DMN_W32_EntityKind\r\n{\r\n  DMN_W32_EntityKind_Null,\r\n  DMN_W32_EntityKind_Root,\r\n  DMN_W32_EntityKind_Process,\r\n  DMN_W32_EntityKind_Thread,\r\n  DMN_W32_EntityKind_Module,\r\n  DMN_W32_EntityKind_COUNT\r\n}\r\nDMN_W32_EntityKind;\r\n\r\ntypedef struct DMN_W32_Entity DMN_W32_Entity;\r\nstruct DMN_W32_Entity\r\n{\r\n  DMN_W32_Entity *first;\r\n  DMN_W32_Entity *last;\r\n  DMN_W32_Entity *next;\r\n  DMN_W32_Entity *prev;\r\n  DMN_W32_Entity *parent;\r\n  DMN_W32_EntityKind kind;\r\n  U32 gen;\r\n  U64 id;\r\n  HANDLE handle;\r\n  Arch arch;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      U64 injection_address;\r\n      B32 did_first_bp;\r\n    }\r\n    proc;\r\n    struct\r\n    {\r\n      U64 thread_local_base;\r\n      U64 last_name_hash;\r\n      U64 name_gather_time_us;\r\n    }\r\n    thread;\r\n    struct\r\n    {\r\n      Rng1U64 vaddr_range;\r\n      U64 address_of_name_pointer;\r\n      B32 is_main;\r\n      B32 name_is_unicode;\r\n    }\r\n    module;\r\n  };\r\n};\r\n\r\ntypedef struct DMN_W32_EntityNode DMN_W32_EntityNode;\r\nstruct DMN_W32_EntityNode\r\n{\r\n  DMN_W32_EntityNode *next;\r\n  DMN_W32_Entity *v;\r\n};\r\n\r\ntypedef struct DMN_W32_EntityIDHashNode DMN_W32_EntityIDHashNode;\r\nstruct DMN_W32_EntityIDHashNode\r\n{\r\n  DMN_W32_EntityIDHashNode *next;\r\n  DMN_W32_EntityIDHashNode *prev;\r\n  U64 id;\r\n  DMN_W32_Entity *entity;\r\n};\r\n\r\ntypedef struct DMN_W32_EntityIDHashSlot DMN_W32_EntityIDHashSlot;\r\nstruct DMN_W32_EntityIDHashSlot\r\n{\r\n  DMN_W32_EntityIDHashNode *first;\r\n  DMN_W32_EntityIDHashNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Injection Types\r\n\r\ntypedef struct DMN_W32_InjectedBreak DMN_W32_InjectedBreak;\r\nstruct DMN_W32_InjectedBreak\r\n{\r\n  U64 code;\r\n  U64 user_data;\r\n};\r\n\r\n#define DMN_W32_INJECTED_CODE_SIZE 32\r\n\r\n////////////////////////////////\r\n//~ rjf: Image Info Types\r\n\r\ntypedef struct DMN_W32_ImageInfo DMN_W32_ImageInfo;\r\nstruct DMN_W32_ImageInfo\r\n{\r\n  Arch arch;\r\n  U32 size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Dynamically-Loaded Win32 Function Types\r\n\r\ntypedef HRESULT DMN_W32_GetThreadDescriptionFunctionType(HANDLE hThread, WCHAR **ppszThreadDescription);\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared State Bundle\r\n\r\ntypedef struct DMN_W32_Shared DMN_W32_Shared;\r\nstruct DMN_W32_Shared\r\n{\r\n  // rjf: top-level info\r\n  Arena *arena;\r\n  String8List env_strings;\r\n  \r\n  // rjf: access locking mechanism\r\n  Mutex access_mutex;\r\n  B32 access_run_state;\r\n  \r\n  // rjf: detaching info\r\n  Arena *detach_arena;\r\n  DMN_HandleList detach_processes;\r\n  \r\n  // rjf: entity state\r\n  Arena *entities_arena;\r\n  DMN_W32_Entity *entities_base;\r\n  DMN_W32_Entity *entities_first_free;\r\n  U64 entities_count;\r\n  DMN_W32_EntityIDHashSlot *entities_id_hash_slots;\r\n  U64 entities_id_hash_slots_count;\r\n  DMN_W32_EntityIDHashNode *entities_id_hash_node_free;\r\n  \r\n  // rjf: launch state\r\n  B32 new_process_pending;\r\n  \r\n  // rjf: run results\r\n  B32 resume_needed;\r\n  U32 resume_pid;\r\n  U32 resume_tid;\r\n  B32 exception_not_handled;\r\n  \r\n  // rjf: halting info\r\n  DMN_Handle halter_process;\r\n  U32 halter_tid;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal DMN_W32_Shared *dmn_w32_shared = 0;\r\nglobal DMN_W32_Entity dmn_w32_entity_nil = {&dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil, &dmn_w32_entity_nil};\r\nglobal DMN_W32_GetThreadDescriptionFunctionType *dmn_w32_GetThreadDescription = 0;\r\nthread_static B32 dmn_w32_ctrl_thread = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64 dmn_w32_hash_from_string(String8 string);\r\ninternal U64 dmn_w32_hash_from_id(U64 id);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Helpers\r\n\r\n//- rjf: entity <-> handle\r\ninternal DMN_Handle dmn_w32_handle_from_entity(DMN_W32_Entity *entity);\r\ninternal DMN_W32_Entity *dmn_w32_entity_from_handle(DMN_Handle handle);\r\n\r\n//- rjf: entity allocation/deallocation\r\ninternal DMN_W32_Entity *dmn_w32_entity_alloc(DMN_W32_Entity *parent, DMN_W32_EntityKind kind, U64 id);\r\ninternal void dmn_w32_entity_release(DMN_W32_Entity *entity);\r\n\r\n//- rjf: kind*id -> entity\r\ninternal DMN_W32_Entity *dmn_w32_entity_from_kind_id(DMN_W32_EntityKind kind, U64 id);\r\n\r\n////////////////////////////////\r\n//~ rjf: Module Info Extraction\r\n\r\ninternal String8 dmn_w32_full_path_from_module(Arena *arena, DMN_W32_Entity *module);\r\n\r\n////////////////////////////////\r\n//~ rjf: Win32-Level Process/Thread Reads/Writes\r\n\r\n//- rjf: processes\r\ninternal U64 dmn_w32_process_read(HANDLE process, Rng1U64 range, void *dst);\r\ninternal B32 dmn_w32_process_write(HANDLE process, Rng1U64 range, void *src);\r\ninternal String8 dmn_w32_read_memory_str(Arena *arena, HANDLE process_handle, U64 address);\r\ninternal String16 dmn_w32_read_memory_str16(Arena *arena, HANDLE process_handle, U64 address);\r\n#define dmn_w32_process_read_struct(process, vaddr, ptr) dmn_w32_process_read((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)\r\n#define dmn_w32_process_write_struct(process, vaddr, ptr) dmn_w32_process_write((process), r1u64((vaddr), (vaddr)+(sizeof(*ptr))), ptr)\r\ninternal DMN_W32_ImageInfo dmn_w32_image_info_from_process_base_vaddr(HANDLE process, U64 base_vaddr);\r\n\r\n//- rjf: threads\r\ninternal U16 dmn_w32_real_tag_word_from_xsave(XSAVE_FORMAT *fxsave);\r\ninternal U16 dmn_w32_xsave_tag_word_from_real_tag_word(U16 ftw);\r\ninternal B32 dmn_w32_thread_read_reg_block(Arch arch, HANDLE thread, void *reg_block);\r\ninternal B32 dmn_w32_thread_write_reg_block(Arch arch, HANDLE thread, void *reg_block);\r\n\r\n//- rjf: remote thread injection\r\ninternal DWORD dmn_w32_inject_thread(HANDLE process, U64 start_address);\r\n\r\n#endif // DEMON_CORE_WIN32_H\r\n"
  },
  {
    "path": "src/disasm/disasm.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xe34cd4ff\r\n\r\n////////////////////////////////\r\n//~ rjf: Instruction Decoding/Disassembling Type Functions\r\n\r\n#if !defined(ZYDIS_H)\r\n#include \"third_party/zydis/zydis.h\"\r\n#include \"third_party/zydis/zydis.c\"\r\n#endif\r\n\r\ninternal DASM_Inst\r\ndasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax)\r\n{\r\n  DASM_Inst inst = {0};\r\n  switch(arch)\r\n  {\r\n    default:{}break;\r\n    \r\n    //- rjf: x86/x64 disassembly\r\n    case Arch_x86:\r\n    case Arch_x64:\r\n    {\r\n      // rjf: determine zydis formatter style\r\n      ZydisFormatterStyle style = ZYDIS_FORMATTER_STYLE_INTEL;\r\n      switch(syntax)\r\n      {\r\n        default:{}break;\r\n        case DASM_Syntax_Intel:{style = ZYDIS_FORMATTER_STYLE_INTEL;}break;\r\n        case DASM_Syntax_ATT:  {style = ZYDIS_FORMATTER_STYLE_ATT;}break;\r\n      }\r\n      \r\n      // rjf: disassemble one instruction\r\n      ZydisDisassembledInstruction zinst = {0};\r\n      ZyanStatus status = ZydisDisassemble(ZYDIS_MACHINE_MODE_LONG_64, vaddr, code.str, code.size, &zinst, style);\r\n      \r\n      // rjf: analyze\r\n      DASM_InstFlags flags = 0;\r\n      U64 jump_dest_vaddr = 0;\r\n      {\r\n        ZydisDecodedOperand *first_visible_op = (zinst.info.operand_count_visible > 0 ? &zinst.operands[0] : 0);\r\n        ZydisDecodedOperand *first_op = (zinst.info.operand_count > 0 ? &zinst.operands[0] : 0);\r\n        ZydisDecodedOperand *second_op = (zinst.info.operand_count > 1 ? &zinst.operands[1] : 0);\r\n        if(first_visible_op != 0 && \r\n           (first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM8 ||\r\n            first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16 ||\r\n            first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32 ||\r\n            first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM64 ||\r\n            first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_64 ||\r\n            first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM32_32_64 ||\r\n            first_visible_op->encoding == ZYDIS_OPERAND_ENCODING_JIMM16_32_32))\r\n        {\r\n          ZydisCalcAbsoluteAddress(&zinst.info, first_visible_op, vaddr, &jump_dest_vaddr);\r\n        }\r\n        if(first_op != 0 && second_op != 0 && first_op->type == ZYDIS_OPERAND_TYPE_REGISTER &&\r\n           (first_op->reg.value == ZYDIS_REGISTER_RSP ||\r\n            first_op->reg.value == ZYDIS_REGISTER_ESP ||\r\n            first_op->reg.value == ZYDIS_REGISTER_SP))\r\n        {\r\n          flags |= DASM_InstFlag_ChangesStackPointer;\r\n          if(second_op->type != ZYDIS_OPERAND_TYPE_IMMEDIATE)\r\n          {\r\n            flags |= DASM_InstFlag_ChangesStackPointerVariably;\r\n          }\r\n        }\r\n        if(zinst.info.attributes & (ZYDIS_ATTRIB_HAS_REP|\r\n                                    ZYDIS_ATTRIB_HAS_REPE|\r\n                                    ZYDIS_ATTRIB_HAS_REPZ|\r\n                                    ZYDIS_ATTRIB_HAS_REPNZ|\r\n                                    ZYDIS_ATTRIB_HAS_REPNE))\r\n        {\r\n          flags |= DASM_InstFlag_Repeats;\r\n        }\r\n        switch(zinst.info.mnemonic)\r\n        {\r\n          case ZYDIS_MNEMONIC_CALL:\r\n          {\r\n            flags |= DASM_InstFlag_Call;\r\n          }break;\r\n          \r\n          case ZYDIS_MNEMONIC_JB:\r\n          case ZYDIS_MNEMONIC_JBE:\r\n          case ZYDIS_MNEMONIC_JCXZ:\r\n          case ZYDIS_MNEMONIC_JECXZ:\r\n          case ZYDIS_MNEMONIC_JKNZD:\r\n          case ZYDIS_MNEMONIC_JKZD:\r\n          case ZYDIS_MNEMONIC_JL:\r\n          case ZYDIS_MNEMONIC_JLE:\r\n          case ZYDIS_MNEMONIC_JNB:\r\n          case ZYDIS_MNEMONIC_JNBE:\r\n          case ZYDIS_MNEMONIC_JNL:\r\n          case ZYDIS_MNEMONIC_JNLE:\r\n          case ZYDIS_MNEMONIC_JNO:\r\n          case ZYDIS_MNEMONIC_JNP:\r\n          case ZYDIS_MNEMONIC_JNS:\r\n          case ZYDIS_MNEMONIC_JNZ:\r\n          case ZYDIS_MNEMONIC_JO:\r\n          case ZYDIS_MNEMONIC_JP:\r\n          case ZYDIS_MNEMONIC_JRCXZ:\r\n          case ZYDIS_MNEMONIC_JS:\r\n          case ZYDIS_MNEMONIC_JZ:\r\n          case ZYDIS_MNEMONIC_LOOP:\r\n          case ZYDIS_MNEMONIC_LOOPE:\r\n          case ZYDIS_MNEMONIC_LOOPNE:\r\n          {\r\n            flags |= DASM_InstFlag_Branch;\r\n          }break;\r\n          \r\n          case ZYDIS_MNEMONIC_JMP:\r\n          {\r\n            flags |= DASM_InstFlag_UnconditionalJump;\r\n          }break;\r\n          \r\n          case ZYDIS_MNEMONIC_RET:\r\n          {\r\n            flags |= DASM_InstFlag_Return;\r\n          }break;\r\n          \r\n          case ZYDIS_MNEMONIC_PUSH:\r\n          case ZYDIS_MNEMONIC_POP:\r\n          {\r\n            flags |= DASM_InstFlag_ChangesStackPointer;\r\n          }break;\r\n          \r\n          default:\r\n          {\r\n            flags |= DASM_InstFlag_NonFlow;\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: convert\r\n      {\r\n        inst.flags           = flags;\r\n        inst.size            = zinst.info.length;\r\n        inst.string          = push_str8_copy(arena, str8_cstring(zinst.text));\r\n        inst.jump_dest_vaddr = jump_dest_vaddr;\r\n      }\r\n    }break;\r\n  }\r\n  return inst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Control Flow Analysis\r\n\r\ninternal DASM_CtrlFlowInfo\r\ndasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DASM_CtrlFlowInfo info = {0};\r\n  for(U64 offset = 0; offset < code.size;)\r\n  {\r\n    DASM_Inst inst = dasm_inst_from_code(scratch.arena, arch, vaddr+offset, str8_skip(code, offset), DASM_Syntax_Intel);\r\n    U64 inst_vaddr = vaddr+offset;\r\n    offset += inst.size;\r\n    info.total_size += inst.size;\r\n    if(inst.flags & exit_points_mask)\r\n    {\r\n      DASM_CtrlFlowPoint point = {0};\r\n      point.inst_flags = inst.flags;\r\n      point.vaddr = inst_vaddr;\r\n      point.jump_dest_vaddr = inst.jump_dest_vaddr;\r\n      DASM_CtrlFlowPointNode *node = push_array(arena, DASM_CtrlFlowPointNode, 1);\r\n      node->v = point;\r\n      SLLQueuePush(info.exit_points.first, info.exit_points.last, node);\r\n      info.exit_points.count += 1;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return info;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Parameter Type Functions\r\n\r\ninternal B32\r\ndasm_params_match(DASM_Params *a, DASM_Params *b)\r\n{\r\n  B32 result = (a->vaddr == b->vaddr &&\r\n                a->arch == b->arch &&\r\n                a->style_flags == b->style_flags &&\r\n                a->syntax == b->syntax &&\r\n                a->base_vaddr == b->base_vaddr &&\r\n                di_key_match(a->dbgi_key, b->dbgi_key));\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Line Type Functions\r\n\r\ninternal void\r\ndasm_line_chunk_list_push(Arena *arena, DASM_LineChunkList *list, U64 cap, DASM_Line *inst)\r\n{\r\n  DASM_LineChunkNode *node = list->last;\r\n  if(node == 0 || node->count >= node->cap)\r\n  {\r\n    node = push_array(arena, DASM_LineChunkNode, 1);\r\n    node->v = push_array_no_zero(arena, DASM_Line, cap);\r\n    node->cap = cap;\r\n    SLLQueuePush(list->first, list->last, node);\r\n    list->node_count += 1;\r\n  }\r\n  MemoryCopyStruct(&node->v[node->count], inst);\r\n  node->count += 1;\r\n  list->line_count += 1;\r\n}\r\n\r\ninternal DASM_LineArray\r\ndasm_line_array_from_chunk_list(Arena *arena, DASM_LineChunkList *list)\r\n{\r\n  DASM_LineArray array = {0};\r\n  array.count = list->line_count;\r\n  array.v = push_array_no_zero(arena, DASM_Line, array.count);\r\n  U64 idx = 0;\r\n  for(DASM_LineChunkNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    MemoryCopy(array.v+idx, n->v, sizeof(DASM_Line)*n->count);\r\n    idx += n->count;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal U64\r\ndasm_line_array_idx_from_code_off__linear_scan(DASM_LineArray *array, U64 off)\r\n{\r\n  U64 result = 0;\r\n  for(U64 idx = 0; idx < array->count; idx += 1)\r\n  {\r\n    U64 next_off = (idx+1 < array->count ? array->v[idx+1].code_off : max_U64);\r\n    if(array->v[idx].code_off <= off && off < next_off)\r\n    {\r\n      result = idx;\r\n      if(!(array->v[idx].flags & DASM_LineFlag_Decorative))\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\ndasm_line_array_code_off_from_idx(DASM_LineArray *array, U64 idx)\r\n{\r\n  U64 off = 0;\r\n  if(idx < array->count)\r\n  {\r\n    off = array->v[idx].code_off;\r\n  }\r\n  return off;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Cache Hooks / Lookups\r\n\r\ntypedef struct DASM_Artifact DASM_Artifact;\r\nstruct DASM_Artifact\r\n{\r\n  Arena *arena;\r\n  DASM_Info info;\r\n  U128 data_hash;\r\n};\r\n\r\ninternal AC_Artifact\r\ndasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  DASM_Artifact *artifact = 0;\r\n  if(lane_idx() == 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    Access *access = access_open();\r\n    \r\n    //- rjf: unpack key\r\n    U128 hash = {0};\r\n    DASM_Params params = {0};\r\n    U64 key_read_off = 0;\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &hash);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &params);\r\n    String8 data = c_data_from_hash(access, hash);\r\n    \r\n    //- rjf: get dbg info\r\n    B32 stale = 0;\r\n    RDI_Parsed *rdi = &rdi_parsed_nil;\r\n    if(!di_key_match(params.dbgi_key, di_key_zero()))\r\n    {\r\n      rdi = di_rdi_from_key(access, params.dbgi_key, 0, 0);\r\n      stale = (stale || (rdi == &rdi_parsed_nil));\r\n    }\r\n    \r\n    //- rjf: data * arch * addr * dbg -> decode artifacts\r\n    DASM_LineChunkList line_list = {0};\r\n    String8List inst_strings = {0};\r\n    switch(params.arch)\r\n    {\r\n      default:{}break;\r\n      \r\n      //- rjf: x86/x64 decoding\r\n      case Arch_x64:\r\n      case Arch_x86:\r\n      {\r\n        // rjf: disassemble\r\n        RDI_SourceFile *last_file = &rdi_nil_element_union.source_file;\r\n        RDI_Line *last_line = 0;\r\n        for(U64 off = 0; off < data.size;)\r\n        {\r\n          // rjf: disassemble one instruction\r\n          DASM_Inst inst = dasm_inst_from_code(scratch.arena, params.arch, params.vaddr+off, str8_skip(data, off), params.syntax);\r\n          if(inst.size == 0)\r\n          {\r\n            break;\r\n          }\r\n          \r\n          // rjf: push strings derived from voff -> line info\r\n          if(params.style_flags & (DASM_StyleFlag_SourceFilesNames|DASM_StyleFlag_SourceLines) &&\r\n             rdi != &rdi_parsed_nil)\r\n          {\r\n            U64 voff = (params.vaddr+off) - params.base_vaddr;\r\n            U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff);\r\n            RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx);\r\n            RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx);\r\n            RDI_ParsedLineTable unit_line_info = {0};\r\n            rdi_parsed_from_line_table(rdi, line_table, &unit_line_info);\r\n            U64 line_info_idx = rdi_line_info_idx_from_voff(&unit_line_info, voff);\r\n            if(line_info_idx < unit_line_info.count)\r\n            {\r\n              RDI_Line *line = &unit_line_info.lines[line_info_idx];\r\n              RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx);\r\n              String8 file_normalized_full_path = {0};\r\n              file_normalized_full_path.str = rdi_string_from_idx(rdi, file->normal_full_path_string_idx, &file_normalized_full_path.size);\r\n              if(file != last_file)\r\n              {\r\n                if(params.style_flags & DASM_StyleFlag_SourceFilesNames &&\r\n                   file->normal_full_path_string_idx != 0 && file_normalized_full_path.size != 0)\r\n                {\r\n                  String8 inst_string = push_str8f(scratch.arena, \"> %S\", file_normalized_full_path);\r\n                  DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count,\r\n                                                                                                   inst_strings.total_size + inst_strings.node_count + inst_string.size)};\r\n                  dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst);\r\n                  str8_list_push(scratch.arena, &inst_strings, inst_string);\r\n                }\r\n                if(params.style_flags & DASM_StyleFlag_SourceFilesNames && file->normal_full_path_string_idx == 0)\r\n                {\r\n                  String8 inst_string = str8_lit(\">\");\r\n                  DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count,\r\n                                                                                                   inst_strings.total_size + inst_strings.node_count + inst_string.size)};\r\n                  dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst);\r\n                  str8_list_push(scratch.arena, &inst_strings, inst_string);\r\n                }\r\n                last_file = file;\r\n              }\r\n              if(line && line != last_line && file->normal_full_path_string_idx != 0 &&\r\n                 params.style_flags & DASM_StyleFlag_SourceLines &&\r\n                 file_normalized_full_path.size != 0)\r\n              {\r\n                FileProperties props = os_properties_from_file_path(file_normalized_full_path);\r\n                if(props.modified != 0)\r\n                {\r\n                  // TODO(rjf): need redirection path - this may map to a different path on the local machine,\r\n                  // need frontend to communicate path remapping info to this layer\r\n                  C_Key key = fs_key_from_path_range(file_normalized_full_path, r1u64(0, max_U64), 0);\r\n                  TXT_LangKind lang_kind = txt_lang_kind_from_extension(file_normalized_full_path);\r\n                  U64 endt_us = max_U64;\r\n                  U128 hash = {0};\r\n                  TXT_TextInfo text_info = txt_text_info_from_key_lang(access, key, lang_kind, &hash);\r\n                  stale = (stale || u128_match(hash, u128_zero()));\r\n                  if(0 < line->line_num && line->line_num < text_info.lines_count)\r\n                  {\r\n                    String8 data = c_data_from_hash(access, hash);\r\n                    String8 line_text = str8_skip_chop_whitespace(str8_substr(data, text_info.lines_ranges[line->line_num-1]));\r\n                    if(line_text.size != 0)\r\n                    {\r\n                      String8 inst_string = push_str8f(scratch.arena, \"> %S\", line_text);\r\n                      DASM_Line inst = {u32_from_u64_saturate(off), DASM_LineFlag_Decorative, 0, r1u64(inst_strings.total_size + inst_strings.node_count,\r\n                                                                                                       inst_strings.total_size + inst_strings.node_count + inst_string.size)};\r\n                      dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &inst);\r\n                      str8_list_push(scratch.arena, &inst_strings, inst_string);\r\n                    }\r\n                  }\r\n                }\r\n                last_line = line;\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: push line\r\n          String8 addr_part = {0};\r\n          if(params.style_flags & DASM_StyleFlag_Addresses)\r\n          {\r\n            addr_part = push_str8f(scratch.arena, \"%s0x%016I64x  \", rdi != &rdi_parsed_nil ? \"  \" : \"\", params.vaddr+off);\r\n          }\r\n          String8 code_bytes_part = {0};\r\n          if(params.style_flags & DASM_StyleFlag_CodeBytes)\r\n          {\r\n            String8List code_bytes_strings = {0};\r\n            str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(\"{\"));\r\n            for(U64 byte_idx = 0; byte_idx < inst.size || byte_idx < 16; byte_idx += 1)\r\n            {\r\n              if(byte_idx < inst.size)\r\n              {\r\n                str8_list_pushf(scratch.arena, &code_bytes_strings, \"%02x%s \", (U32)data.str[off+byte_idx], byte_idx == inst.size-1 ? \"}\" : \"\");\r\n              }\r\n              else if(byte_idx < 8)\r\n              {\r\n                str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(\"   \"));\r\n              }\r\n            }\r\n            str8_list_push(scratch.arena, &code_bytes_strings, str8_lit(\" \"));\r\n            code_bytes_part = str8_list_join(scratch.arena, &code_bytes_strings, 0);\r\n          }\r\n          String8 symbol_part = {0};\r\n          if(inst.jump_dest_vaddr != 0 && rdi != &rdi_parsed_nil && params.style_flags & DASM_StyleFlag_SymbolNames)\r\n          {\r\n            RDI_U32 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, inst.jump_dest_vaddr-params.base_vaddr);\r\n            if(scope_idx != 0)\r\n            {\r\n              RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);\r\n              RDI_U32 procedure_idx = scope->proc_idx;\r\n              RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx);\r\n              String8 procedure_name = {0};\r\n              procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size);\r\n              if(procedure_name.size != 0)\r\n              {\r\n                symbol_part = push_str8f(scratch.arena, \" (%S)\", procedure_name);\r\n              }\r\n            }\r\n          }\r\n          String8 inst_string = push_str8f(scratch.arena, \"%S%S%S%S\", addr_part, code_bytes_part, inst.string, symbol_part);\r\n          DASM_Line line = {u32_from_u64_saturate(off), 0, inst.jump_dest_vaddr, r1u64(inst_strings.total_size + inst_strings.node_count,\r\n                                                                                       inst_strings.total_size + inst_strings.node_count + inst_string.size)};\r\n          dasm_line_chunk_list_push(scratch.arena, &line_list, 1024, &line);\r\n          str8_list_push(scratch.arena, &inst_strings, inst_string);\r\n          \r\n          // rjf: increment\r\n          off += inst.size;\r\n        }\r\n      }break;\r\n    }\r\n    \r\n    //- rjf: artifacts -> value bundle\r\n    Arena *info_arena = 0;\r\n    DASM_Info info = {0};\r\n    if(!stale)\r\n    {\r\n      //- rjf: produce joined text\r\n      Arena *text_arena = arena_alloc();\r\n      StringJoin text_join = {0};\r\n      text_join.sep = str8_lit(\"\\n\");\r\n      String8 text = str8_list_join(text_arena, &inst_strings, &text_join);\r\n      \r\n      //- rjf: produce unique key for this disassembly's text\r\n      C_Key text_key = c_key_make(c_root_alloc(), c_id_make(0, 0));\r\n      \r\n      //- rjf: submit text data to hash store\r\n      U128 text_hash = c_submit_data(text_key, &text_arena, text);\r\n      \r\n      //- rjf: produce value bundle\r\n      info_arena = arena_alloc();\r\n      info.text_key = text_key;\r\n      info.lines = dasm_line_array_from_chunk_list(info_arena, &line_list);\r\n    }\r\n    \r\n    //- rjf: if stale, retry\r\n    if(stale)\r\n    {\r\n      retry_out[0] = 1;\r\n    }\r\n    \r\n    //- rjf: mark dependency on data hash\r\n    c_hash_downstream_inc(hash);\r\n    \r\n    //- rjf: fill result\r\n    if(info_arena != 0)\r\n    {\r\n      artifact = push_array(info_arena, DASM_Artifact, 1);\r\n      artifact->arena = info_arena;\r\n      artifact->info = info;\r\n      artifact->data_hash = hash;\r\n    }\r\n    \r\n    access_close(access);\r\n    scratch_end(scratch);\r\n  }\r\n  lane_sync_u64(&artifact, 0);\r\n  AC_Artifact result = {0};\r\n  result.u64[0] = (U64)artifact;\r\n  return result;\r\n}\r\n\r\ninternal void\r\ndasm_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  DASM_Artifact *dasm_artifact = (DASM_Artifact *)artifact.u64[0];\r\n  if(dasm_artifact == 0) { return; }\r\n  c_close_key(dasm_artifact->info.text_key);\r\n  c_hash_downstream_dec(dasm_artifact->data_hash);\r\n  arena_release(dasm_artifact->arena);\r\n}\r\n\r\ninternal DASM_Info\r\ndasm_info_from_hash_params(Access *access, U128 hash, DASM_Params *params)\r\n{\r\n  DASM_Info info = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    // rjf: form key\r\n    String8List key_parts = {0};\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&hash));\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(params));\r\n    String8 key = str8_list_join(scratch.arena, &key_parts, 0);\r\n    \r\n    // rjf: get info\r\n    AC_Artifact artifact = ac_artifact_from_key(access, key, dasm_artifact_create, dasm_artifact_destroy, 0, .gen = fs_change_gen(), .flags = AC_Flag_Wide);\r\n    DASM_Artifact *dasm_artifact = (DASM_Artifact *)artifact.u64[0];\r\n    if(dasm_artifact)\r\n    {\r\n      info = dasm_artifact->info;\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return info;\r\n}\r\n\r\ninternal DASM_Info\r\ndasm_info_from_key_params(Access *access, C_Key key, DASM_Params *params, U128 *hash_out)\r\n{\r\n  DASM_Info result = {0};\r\n  for(U64 rewind_idx = 0; rewind_idx < C_KEY_HASH_HISTORY_COUNT; rewind_idx += 1)\r\n  {\r\n    U128 hash = c_hash_from_key(key, rewind_idx);\r\n    result = dasm_info_from_hash_params(access, hash, params);\r\n    if(result.lines.count != 0)\r\n    {\r\n      if(hash_out)\r\n      {\r\n        *hash_out = hash;\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/disasm/disasm.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DISASM_H\r\n#define DISASM_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Disassembly Syntax Types\r\n\r\ntypedef enum DASM_Syntax\r\n{\r\n  DASM_Syntax_Intel,\r\n  DASM_Syntax_ATT,\r\n  DASM_Syntax_COUNT\r\n}\r\nDASM_Syntax;\r\n\r\n////////////////////////////////\r\n//~ rjf: Disassembly Instruction Info Types\r\n\r\ntypedef U32 DASM_InstFlags;\r\nenum\r\n{\r\n  DASM_InstFlag_Call                        = (1<<0),\r\n  DASM_InstFlag_Branch                      = (1<<1),\r\n  DASM_InstFlag_UnconditionalJump           = (1<<2),\r\n  DASM_InstFlag_Return                      = (1<<3),\r\n  DASM_InstFlag_NonFlow                     = (1<<4),\r\n  DASM_InstFlag_Repeats                     = (1<<5),\r\n  DASM_InstFlag_ChangesStackPointer         = (1<<6),\r\n  DASM_InstFlag_ChangesStackPointerVariably = (1<<7),\r\n};\r\n\r\ntypedef struct DASM_Inst DASM_Inst;\r\nstruct DASM_Inst\r\n{\r\n  DASM_InstFlags flags;\r\n  U32 size;\r\n  String8 string;\r\n  U64 jump_dest_vaddr;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Control Flow Analysis Types\r\n\r\ntypedef struct DASM_CtrlFlowPoint DASM_CtrlFlowPoint;\r\nstruct DASM_CtrlFlowPoint\r\n{\r\n  U64 vaddr;\r\n  U64 jump_dest_vaddr;\r\n  DASM_InstFlags inst_flags;\r\n};\r\n\r\ntypedef struct DASM_CtrlFlowPointNode DASM_CtrlFlowPointNode;\r\nstruct DASM_CtrlFlowPointNode\r\n{\r\n  DASM_CtrlFlowPointNode *next;\r\n  DASM_CtrlFlowPoint v;\r\n};\r\n\r\ntypedef struct DASM_CtrlFlowPointList DASM_CtrlFlowPointList;\r\nstruct DASM_CtrlFlowPointList\r\n{\r\n  DASM_CtrlFlowPointNode *first;\r\n  DASM_CtrlFlowPointNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct DASM_CtrlFlowInfo DASM_CtrlFlowInfo;\r\nstruct DASM_CtrlFlowInfo\r\n{\r\n  DASM_CtrlFlowPointList exit_points;\r\n  U64 total_size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Disassembly Text Decoration Types\r\n\r\ntypedef U32 DASM_StyleFlags;\r\nenum\r\n{\r\n  DASM_StyleFlag_Addresses        = (1<<0),\r\n  DASM_StyleFlag_CodeBytes        = (1<<1),\r\n  DASM_StyleFlag_SourceFilesNames = (1<<2),\r\n  DASM_StyleFlag_SourceLines      = (1<<3),\r\n  DASM_StyleFlag_SymbolNames      = (1<<4),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Disassembling Parameters Bundle\r\n\r\ntypedef struct DASM_Params DASM_Params;\r\nstruct DASM_Params\r\n{\r\n  U64 vaddr;\r\n  Arch arch;\r\n  DASM_StyleFlags style_flags;\r\n  DASM_Syntax syntax;\r\n  U64 base_vaddr;\r\n  DI_Key dbgi_key;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Disassembly Request Bundle\r\n\r\ntypedef struct DASM_Request DASM_Request;\r\nstruct DASM_Request\r\n{\r\n  C_Root root;\r\n  U128 hash;\r\n  DASM_Params params;\r\n};\r\n\r\ntypedef struct DASM_RequestNode DASM_RequestNode;\r\nstruct DASM_RequestNode\r\n{\r\n  DASM_RequestNode *next;\r\n  DASM_Request v;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Disassembly Text Line Types\r\n\r\ntypedef U32 DASM_LineFlags;\r\nenum\r\n{\r\n  DASM_LineFlag_Decorative = (1<<0),\r\n};\r\n\r\ntypedef struct DASM_Line DASM_Line;\r\nstruct DASM_Line\r\n{\r\n  U32 code_off;\r\n  DASM_LineFlags flags;\r\n  U64 addr;\r\n  Rng1U64 text_range;\r\n};\r\n\r\ntypedef struct DASM_LineChunkNode DASM_LineChunkNode;\r\nstruct DASM_LineChunkNode\r\n{\r\n  DASM_LineChunkNode *next;\r\n  DASM_Line *v;\r\n  U64 cap;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct DASM_LineChunkList DASM_LineChunkList;\r\nstruct DASM_LineChunkList\r\n{\r\n  DASM_LineChunkNode *first;\r\n  DASM_LineChunkNode *last;\r\n  U64 node_count;\r\n  U64 line_count;\r\n};\r\n\r\ntypedef struct DASM_LineArray DASM_LineArray;\r\nstruct DASM_LineArray\r\n{\r\n  DASM_Line *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Value Bundle Type\r\n\r\ntypedef struct DASM_Info DASM_Info;\r\nstruct DASM_Info\r\n{\r\n  C_Key text_key;\r\n  DASM_LineArray lines;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Instruction Decoding/Disassembling Type Functions\r\n\r\ninternal DASM_Inst dasm_inst_from_code(Arena *arena, Arch arch, U64 vaddr, String8 code, DASM_Syntax syntax);\r\n\r\n////////////////////////////////\r\n//~ rjf: Control Flow Analysis\r\n\r\ninternal DASM_CtrlFlowInfo dasm_ctrl_flow_info_from_arch_vaddr_code(Arena *arena, DASM_InstFlags exit_points_mask, Arch arch, U64 vaddr, String8 code);\r\n\r\n////////////////////////////////\r\n//~ rjf: Parameter Type Functions\r\n\r\ninternal B32 dasm_params_match(DASM_Params *a, DASM_Params *b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Line Type Functions\r\n\r\ninternal void dasm_line_chunk_list_push(Arena *arena, DASM_LineChunkList *list, U64 cap, DASM_Line *line);\r\ninternal DASM_LineArray dasm_line_array_from_chunk_list(Arena *arena, DASM_LineChunkList *list);\r\ninternal U64 dasm_line_array_idx_from_code_off__linear_scan(DASM_LineArray *array, U64 off);\r\ninternal U64 dasm_line_array_code_off_from_idx(DASM_LineArray *array, U64 idx);\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact dasm_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void dasm_artifact_destroy(AC_Artifact artifact);\r\ninternal DASM_Info dasm_info_from_hash_params(Access *access, U128 hash, DASM_Params *params);\r\ninternal DASM_Info dasm_info_from_key_params(Access *access, C_Key key, DASM_Params *params, U128 *hash_out);\r\n\r\n#endif // DISASM_H\r\n"
  },
  {
    "path": "src/draw/draw.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#define DR_StackPushImpl(name_upper, name_lower, type, val) \\\r\nDR_Bucket *bucket = dr_top_bucket();\\\r\ntype old_val = bucket->top_##name_lower->v;\\\r\nDR_##name_upper##Node *node = push_array(dr_thread_ctx->arena, DR_##name_upper##Node, 1);\\\r\nnode->v = (val);\\\r\nSLLStackPush(bucket->top_##name_lower, node);\\\r\nbucket->stack_gen += 1;\\\r\nreturn old_val\r\n\r\n#define DR_StackPopImpl(name_upper, name_lower, type) \\\r\nDR_Bucket *bucket = dr_top_bucket();\\\r\ntype popped_val = bucket->top_##name_lower->v;\\\r\nSLLStackPop(bucket->top_##name_lower);\\\r\nbucket->stack_gen += 1;\\\r\nreturn popped_val\r\n\r\n#define DR_StackTopImpl(name_upper, name_lower, type) \\\r\nDR_Bucket *bucket = dr_top_bucket();\\\r\ntype top_val = bucket->top_##name_lower->v;\\\r\nreturn top_val\r\n\r\n#include \"generated/draw.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64\r\ndr_hash_from_string(String8 string)\r\n{\r\n  U64 result = 5381;\r\n  for(U64 i = 0; i < string.size; i += 1)\r\n  {\r\n    result = ((result << 5) + result) + string.str[i];\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Fancy String Type Functions\r\n\r\ninternal void\r\ndr_fstrs_push(Arena *arena, DR_FStrList *list, DR_FStr *str)\r\n{\r\n  DR_FStrNode *n = push_array_no_zero(arena, DR_FStrNode, 1);\r\n  MemoryCopyStruct(&n->v, str);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->node_count += 1;\r\n  list->total_size += str->string.size;\r\n}\r\n\r\ninternal void\r\ndr_fstrs_push_new_(Arena *arena, DR_FStrList *list, DR_FStrParams *params, DR_FStrParams *overrides, String8 string)\r\n{\r\n  DR_FStr fstr = {string, *params};\r\n  if(!fnt_tag_match(fnt_tag_zero(), overrides->font))\r\n  {\r\n    fstr.params.font = overrides->font;\r\n  }\r\n  if(overrides->raster_flags != 0)\r\n  {\r\n    fstr.params.raster_flags = overrides->raster_flags;\r\n  }\r\n  if(overrides->color.x != 0 || overrides->color.y != 0 || overrides->color.z != 0 || overrides->color.w != 0)\r\n  {\r\n    fstr.params.color = overrides->color;\r\n  }\r\n  if(overrides->size != 0)\r\n  {\r\n    fstr.params.size = overrides->size;\r\n  }\r\n  if(overrides->underline_thickness != 0)\r\n  {\r\n    fstr.params.underline_thickness = overrides->underline_thickness;\r\n  }\r\n  if(overrides->strikethrough_thickness != 0)\r\n  {\r\n    fstr.params.strikethrough_thickness = overrides->strikethrough_thickness;\r\n  }\r\n  dr_fstrs_push(arena, list, &fstr);\r\n}\r\n\r\ninternal void\r\ndr_fstrs_concat_in_place(DR_FStrList *dst, DR_FStrList *to_push)\r\n{\r\n  if(dst->last != 0 && to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->node_count += to_push->node_count;\r\n    dst->total_size += to_push->total_size;\r\n  }\r\n  else if(to_push->first != 0)\r\n  {\r\n    MemoryCopyStruct(dst, to_push);\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\ninternal DR_FStrList\r\ndr_fstrs_copy(Arena *arena, DR_FStrList *src)\r\n{\r\n  DR_FStrList dst = {0};\r\n  for(DR_FStrNode *src_n = src->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    DR_FStr fstr = src_n->v;\r\n    fstr.string = push_str8_copy(arena, fstr.string);\r\n    dr_fstrs_push(arena, &dst, &fstr);\r\n  }\r\n  return dst;\r\n}\r\n\r\ninternal String8\r\ndr_string_from_fstrs(Arena *arena, DR_FStrList *list)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8List parts = {0};\r\n    for(DR_FStrNode *n = list->first; n != 0; n = n->next)\r\n    {\r\n      if(!fnt_tag_match(n->v.params.font, dr_thread_ctx->icon_font))\r\n      {\r\n        str8_list_push(scratch.arena, &parts, n->v.string);\r\n      }\r\n    }\r\n    result = str8_list_join(arena, &parts, 0);\r\n    result = str8_skip_chop_whitespace(result);\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal FuzzyMatchRangeList\r\ndr_fuzzy_match_find_from_fstrs(Arena *arena, DR_FStrList *fstrs, String8 needle)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 fstrs_string = {0};\r\n  fstrs_string.size = fstrs->total_size;\r\n  fstrs_string.str = push_array(arena, U8, fstrs_string.size);\r\n  {\r\n    // TODO(rjf): the fact that we only increment on non-icon portions is super weird?\r\n    // we are only doing that because of the rendering of the fuzzy matches, so maybe\r\n    // once that is straightened out, we can fix the code here too...\r\n    U64 off = 0;\r\n    for(DR_FStrNode *n = fstrs->first; n != 0; n = n->next)\r\n    {\r\n      if(!fnt_tag_match(n->v.params.font, dr_thread_ctx->icon_font))\r\n      {\r\n        MemoryCopy(fstrs_string.str + off, n->v.string.str, n->v.string.size);\r\n        off += n->v.string.size;\r\n      }\r\n    }\r\n  }\r\n  FuzzyMatchRangeList ranges = fuzzy_match_find(arena, needle, fstrs_string);\r\n  scratch_end(scratch);\r\n  return ranges;\r\n}\r\n\r\ninternal DR_FRunList\r\ndr_fruns_from_fstrs(Arena *arena, F32 tab_size_px, DR_FStrList *strs)\r\n{\r\n  DR_FRunList run_list = {0};\r\n  F32 base_align_px = 0;\r\n  for(DR_FStrNode *n = strs->first; n != 0; n = n->next)\r\n  {\r\n    DR_FRunNode *dst_n = push_array(arena, DR_FRunNode, 1);\r\n    dst_n->v.run = fnt_run_from_string(n->v.params.font, n->v.params.size, base_align_px, tab_size_px, n->v.params.raster_flags, n->v.string);\r\n    dst_n->v.color = n->v.params.color;\r\n    dst_n->v.underline_thickness = n->v.params.underline_thickness;\r\n    dst_n->v.strikethrough_thickness = n->v.params.strikethrough_thickness;\r\n    dst_n->v.icon = (fnt_tag_match(n->v.params.font, dr_thread_ctx->icon_font));\r\n    SLLQueuePush(run_list.first, run_list.last, dst_n);\r\n    run_list.node_count += 1;\r\n    run_list.dim.x += dst_n->v.run.dim.x;\r\n    run_list.dim.y = Max(run_list.dim.y, dst_n->v.run.dim.y);\r\n    base_align_px += dst_n->v.run.dim.x;\r\n  }\r\n  return run_list;\r\n}\r\n\r\ninternal Vec2F32\r\ndr_dim_from_fstrs(F32 tab_size_px, DR_FStrList *fstrs)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DR_FRunList fruns = dr_fruns_from_fstrs(scratch.arena, tab_size_px, fstrs);\r\n  Vec2F32 dim = fruns.dim;\r\n  scratch_end(scratch);\r\n  return dim;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level API\r\n//\r\n// (Frame boundaries)\r\n\r\ninternal void\r\ndr_begin_frame(FNT_Tag icon_font)\r\n{\r\n  if(dr_thread_ctx == 0)\r\n  {\r\n    Arena *arena = arena_alloc(.reserve_size = GB(64), .commit_size = MB(8));\r\n    dr_thread_ctx = push_array(arena, DR_ThreadCtx, 1);\r\n    dr_thread_ctx->arena = arena;\r\n    dr_thread_ctx->arena_frame_start_pos = arena_pos(arena);\r\n  }\r\n  arena_pop_to(dr_thread_ctx->arena, dr_thread_ctx->arena_frame_start_pos);\r\n  dr_thread_ctx->free_bucket_selection = 0;\r\n  dr_thread_ctx->top_bucket = 0;\r\n  dr_thread_ctx->icon_font = icon_font;\r\n}\r\n\r\ninternal void\r\ndr_submit_bucket(OS_Handle os_window, R_Handle r_window, DR_Bucket *bucket)\r\n{\r\n  r_window_submit(os_window, r_window, &bucket->passes);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Bucket Construction & Selection API\r\n//\r\n// (Bucket: Handle to sequence of many render passes, constructed by this layer)\r\n\r\ninternal DR_Bucket *\r\ndr_bucket_make(void)\r\n{\r\n  DR_Bucket *bucket = push_array(dr_thread_ctx->arena, DR_Bucket, 1);\r\n  DR_BucketStackInits(bucket);\r\n  return bucket;\r\n}\r\n\r\ninternal void\r\ndr_push_bucket(DR_Bucket *bucket)\r\n{\r\n  DR_BucketSelectionNode *node = dr_thread_ctx->free_bucket_selection;\r\n  if(node)\r\n  {\r\n    SLLStackPop(dr_thread_ctx->free_bucket_selection);\r\n  }\r\n  else\r\n  {\r\n    node = push_array(dr_thread_ctx->arena, DR_BucketSelectionNode, 1);\r\n  }\r\n  SLLStackPush(dr_thread_ctx->top_bucket, node);\r\n  node->bucket = bucket;\r\n}\r\n\r\ninternal void\r\ndr_pop_bucket(void)\r\n{\r\n  DR_BucketSelectionNode *node = dr_thread_ctx->top_bucket;\r\n  SLLStackPop(dr_thread_ctx->top_bucket);\r\n  SLLStackPush(dr_thread_ctx->free_bucket_selection, node);\r\n}\r\n\r\ninternal DR_Bucket *\r\ndr_top_bucket(void)\r\n{\r\n  DR_Bucket *bucket = 0;\r\n  if(dr_thread_ctx->top_bucket != 0)\r\n  {\r\n    bucket = dr_thread_ctx->top_bucket->bucket;\r\n  }\r\n  return bucket;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Bucket Stacks\r\n//\r\n// (Pushing/popping implicit draw parameters)\r\n\r\n// NOTE(rjf): (The implementation of the push/pop/top functions is auto-generated)\r\n\r\n////////////////////////////////\r\n//~ rjf: Draw Calls\r\n//\r\n// (Apply to the calling thread's currently selected bucket)\r\n\r\n//- rjf: rectangles\r\n\r\ninternal inline R_Rect2DInst *\r\ndr_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness)\r\n{\r\n  Arena *arena = dr_thread_ctx->arena;\r\n  DR_Bucket *bucket = dr_top_bucket();\r\n  R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_UI);\r\n  R_PassParams_UI *params = pass->params_ui;\r\n  R_BatchGroup2DList *rects = &params->rects;\r\n  R_BatchGroup2DNode *node = rects->last;\r\n  if(node == 0 || bucket->stack_gen != bucket->last_cmd_stack_gen)\r\n  {\r\n    node = push_array(arena, R_BatchGroup2DNode, 1);\r\n    SLLQueuePush(rects->first, rects->last, node);\r\n    rects->count += 1;\r\n    node->batches = r_batch_list_make(sizeof(R_Rect2DInst));\r\n    node->params.tex = r_handle_zero();\r\n    node->params.tex_sample_kind = bucket->top_tex2d_sample_kind->v;\r\n    node->params.xform           = bucket->top_xform2d->v;\r\n    node->params.clip            = bucket->top_clip->v;\r\n    node->params.transparency    = bucket->top_transparency->v;\r\n  }\r\n  R_Rect2DInst *inst = (R_Rect2DInst *)r_batch_list_push_inst(arena, &node->batches, 256);\r\n  inst->dst = dst;\r\n  inst->src = r2f32p(0, 0, 0, 0);\r\n  inst->colors[Corner_00] = color;\r\n  inst->colors[Corner_01] = color;\r\n  inst->colors[Corner_10] = color;\r\n  inst->colors[Corner_11] = color;\r\n  inst->corner_radii[Corner_00] = corner_radius;\r\n  inst->corner_radii[Corner_01] = corner_radius;\r\n  inst->corner_radii[Corner_10] = corner_radius;\r\n  inst->corner_radii[Corner_11] = corner_radius;\r\n  inst->border_thickness = border_thickness;\r\n  inst->edge_softness = edge_softness;\r\n  inst->white_texture_override = 1.f;\r\n  inst->shear = 0.f;\r\n  bucket->last_cmd_stack_gen = bucket->stack_gen;\r\n  return inst;\r\n}\r\n\r\n//- rjf: images\r\n\r\ninternal inline R_Rect2DInst *\r\ndr_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness)\r\n{\r\n  Arena *arena = dr_thread_ctx->arena;\r\n  DR_Bucket *bucket = dr_top_bucket();\r\n  R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_UI);\r\n  R_PassParams_UI *params = pass->params_ui;\r\n  R_BatchGroup2DList *rects = &params->rects;\r\n  R_BatchGroup2DNode *node = rects->last;\r\n  if(node != 0 && bucket->stack_gen == bucket->last_cmd_stack_gen && r_handle_match(node->params.tex, r_handle_zero()))\r\n  {\r\n    node->params.tex = texture;\r\n  }\r\n  else if(node == 0 || bucket->stack_gen != bucket->last_cmd_stack_gen || !r_handle_match(texture, node->params.tex))\r\n  {\r\n    node = push_array(arena, R_BatchGroup2DNode, 1);\r\n    SLLQueuePush(rects->first, rects->last, node);\r\n    rects->count += 1;\r\n    node->batches = r_batch_list_make(sizeof(R_Rect2DInst));\r\n    node->params.tex             = texture;\r\n    node->params.tex_sample_kind = bucket->top_tex2d_sample_kind->v;\r\n    node->params.xform           = bucket->top_xform2d->v;\r\n    node->params.clip            = bucket->top_clip->v;\r\n    node->params.transparency    = bucket->top_transparency->v;\r\n  }\r\n  R_Rect2DInst *inst = (R_Rect2DInst *)r_batch_list_push_inst(arena, &node->batches, 256);\r\n  inst->dst = dst;\r\n  inst->src = src;\r\n  inst->colors[Corner_00] = color;\r\n  inst->colors[Corner_01] = color;\r\n  inst->colors[Corner_10] = color;\r\n  inst->colors[Corner_11] = color;\r\n  inst->corner_radii[Corner_00] = corner_radius;\r\n  inst->corner_radii[Corner_01] = corner_radius;\r\n  inst->corner_radii[Corner_10] = corner_radius;\r\n  inst->corner_radii[Corner_11] = corner_radius;\r\n  inst->border_thickness = border_thickness;\r\n  inst->edge_softness = edge_softness;\r\n  inst->white_texture_override = 0.f;\r\n  inst->shear = 0.f;\r\n  bucket->last_cmd_stack_gen = bucket->stack_gen;\r\n  return inst;\r\n}\r\n\r\n//- rjf: blurs\r\n\r\ninternal R_PassParams_Blur *\r\ndr_blur(Rng2F32 rect, F32 blur_size, F32 corner_radius)\r\n{\r\n  Arena *arena = dr_thread_ctx->arena;\r\n  DR_Bucket *bucket = dr_top_bucket();\r\n  R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Blur);\r\n  R_PassParams_Blur *params = pass->params_blur;\r\n  params->rect = rect;\r\n  params->clip = dr_top_clip();\r\n  params->blur_size = blur_size;\r\n  params->corner_radii[Corner_00] = corner_radius;\r\n  params->corner_radii[Corner_01] = corner_radius;\r\n  params->corner_radii[Corner_10] = corner_radius;\r\n  params->corner_radii[Corner_11] = corner_radius;\r\n  return params;\r\n}\r\n\r\n//- rjf: 3d rendering pass params\r\n\r\ninternal R_PassParams_Geo3D *\r\ndr_geo3d_begin(Rng2F32 viewport, Mat4x4F32 view, Mat4x4F32 projection)\r\n{\r\n  Arena *arena = dr_thread_ctx->arena;\r\n  DR_Bucket *bucket = dr_top_bucket();\r\n  R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Geo3D);\r\n  R_PassParams_Geo3D *params = pass->params_geo3d;\r\n  params->viewport = viewport;\r\n  params->view = view;\r\n  params->projection = projection;\r\n  return params;\r\n}\r\n\r\n//- rjf: meshes\r\n\r\ninternal R_Mesh3DInst *\r\ndr_mesh(R_Handle mesh_vertices, R_Handle mesh_indices, R_GeoTopologyKind mesh_geo_topology, R_GeoVertexFlags mesh_geo_vertex_flags, R_Handle albedo_tex, Mat4x4F32 inst_xform)\r\n{\r\n  Arena *arena = dr_thread_ctx->arena;\r\n  DR_Bucket *bucket = dr_top_bucket();\r\n  R_Pass *pass = r_pass_from_kind(arena, &bucket->passes, R_PassKind_Geo3D);\r\n  R_PassParams_Geo3D *params = pass->params_geo3d;\r\n  \r\n  // rjf: mesh batch map not made yet -> make\r\n  if(params->mesh_batches.slots_count == 0)\r\n  {\r\n    params->mesh_batches.slots_count = 64;\r\n    params->mesh_batches.slots = push_array(arena, R_BatchGroup3DMapNode *, params->mesh_batches.slots_count);\r\n  }\r\n  \r\n  // rjf: hash batch group 3d params\r\n  U64 hash = 0;\r\n  U64 slot_idx = 0;\r\n  {\r\n    U64 buffer[] =\r\n    {\r\n      mesh_vertices.u64[0],\r\n      mesh_vertices.u64[1],\r\n      mesh_indices.u64[0],\r\n      mesh_indices.u64[1],\r\n      (U64)mesh_geo_topology,\r\n      (U64)mesh_geo_vertex_flags,\r\n      albedo_tex.u64[0],\r\n      albedo_tex.u64[1],\r\n      (U64)dr_top_tex2d_sample_kind(),\r\n    };\r\n    hash = dr_hash_from_string(str8((U8 *)buffer, sizeof(buffer)));\r\n    slot_idx = hash%params->mesh_batches.slots_count;\r\n  }\r\n  \r\n  // rjf: map hash -> existing batch group node\r\n  R_BatchGroup3DMapNode *node = 0;\r\n  {\r\n    for(R_BatchGroup3DMapNode *n = params->mesh_batches.slots[slot_idx]; n != 0; n = n->next)\r\n    {\r\n      if(n->hash == hash)\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: no batch group node? -> make one\r\n  if(node == 0)\r\n  {\r\n    node = push_array(arena, R_BatchGroup3DMapNode, 1);\r\n    SLLStackPush(params->mesh_batches.slots[slot_idx], node);\r\n    node->hash = hash;\r\n    node->batches = r_batch_list_make(sizeof(R_Mesh3DInst));\r\n    node->params.mesh_vertices = mesh_vertices;\r\n    node->params.mesh_indices = mesh_indices;\r\n    node->params.mesh_geo_topology = mesh_geo_topology;\r\n    node->params.mesh_geo_vertex_flags = mesh_geo_vertex_flags;\r\n    node->params.albedo_tex = albedo_tex;\r\n    node->params.albedo_tex_sample_kind = dr_top_tex2d_sample_kind();\r\n    node->params.xform = mat_4x4f32(1.f);\r\n  }\r\n  \r\n  // rjf: push new instance to batch group\r\n  R_Mesh3DInst *inst = (R_Mesh3DInst *)r_batch_list_push_inst(arena, &node->batches, 256);\r\n  inst->xform = inst_xform;\r\n  return inst;\r\n}\r\n\r\n//- rjf: collating one pre-prepped bucket into parent bucket\r\n\r\ninternal void\r\ndr_sub_bucket(DR_Bucket *bucket)\r\n{\r\n  Arena *arena = dr_thread_ctx->arena;\r\n  DR_Bucket *src = bucket;\r\n  DR_Bucket *dst = dr_top_bucket();\r\n  Rng2F32 dst_clip = dr_top_clip();\r\n  B32 dst_clip_is_set = !(dst_clip.x0 == 0 && dst_clip.x1 == 0 &&\r\n                          dst_clip.y0 == 0 && dst_clip.y1 == 0);\r\n  for(R_PassNode *n = src->passes.first; n != 0; n = n->next)\r\n  {\r\n    R_Pass *src_pass = &n->v;\r\n    R_Pass *dst_pass = r_pass_from_kind(arena, &dst->passes, src_pass->kind);\r\n    switch(dst_pass->kind)\r\n    {\r\n      default:{dst_pass->params = src_pass->params;}break;\r\n      case R_PassKind_UI:\r\n      {\r\n        R_PassParams_UI *src_ui = src_pass->params_ui;\r\n        R_PassParams_UI *dst_ui = dst_pass->params_ui;\r\n        for(R_BatchGroup2DNode *src_group_n = src_ui->rects.first;\r\n            src_group_n != 0;\r\n            src_group_n = src_group_n->next)\r\n        {\r\n          R_BatchGroup2DNode *dst_group_n = push_array(arena, R_BatchGroup2DNode, 1);\r\n          SLLQueuePush(dst_ui->rects.first, dst_ui->rects.last, dst_group_n);\r\n          dst_ui->rects.count += 1;\r\n          MemoryCopyStruct(&dst_group_n->params, &src_group_n->params);\r\n          dst_group_n->batches = src_group_n->batches;\r\n          dst_group_n->params.xform = dr_top_xform2d();\r\n          B32 clip_is_set = !(dst_group_n->params.clip.x0 == 0 &&\r\n                              dst_group_n->params.clip.y0 == 0 &&\r\n                              dst_group_n->params.clip.x1 == 0 &&\r\n                              dst_group_n->params.clip.y1 == 0);\r\n          if(clip_is_set)\r\n          {\r\n            Rng2F32 og_clip = dst_group_n->params.clip;\r\n            Mat3x3F32 xform = dst_group_n->params.xform;\r\n            dst_group_n->params.clip = r2f32(xform_3f32(v3f32(og_clip.x0, og_clip.y0, 1), xform).xy,\r\n                                             xform_3f32(v3f32(og_clip.x1, og_clip.y1, 1), xform).xy);\r\n          }\r\n          if(dst_clip_is_set)\r\n          {\r\n            dst_group_n->params.clip = clip_is_set ? intersect_2f32(dst_clip, dst_group_n->params.clip) : dst_clip;\r\n          }\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Draw Call Helpers\r\n\r\n//- rjf: text\r\n\r\ninternal void\r\ndr_truncated_fancy_run_list(Vec2F32 p, DR_FRunList *list, F32 max_x, FNT_Run trailer_run)\r\n{\r\n  //- rjf: total advance > max? -> enable trailer\r\n  B32 trailer_enabled = (list->dim.x > max_x && trailer_run.dim.x < max_x);\r\n  \r\n  //- rjf: draw runs\r\n  F32 advance = 0;\r\n  B32 trailer_found = 0;\r\n  Vec4F32 last_color = {0};\r\n  U64 byte_off = 0;\r\n  for(DR_FRunNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    DR_FRun *fr = &n->v;\r\n    Rng1F32 pixel_range = {0};\r\n    {\r\n      pixel_range.min = 100000;\r\n      pixel_range.max = 0;\r\n    }\r\n    FNT_Piece *piece_first = fr->run.pieces.v;\r\n    FNT_Piece *piece_opl = piece_first + fr->run.pieces.count;\r\n    F32 pre_advance = advance;\r\n    last_color = fr->color;\r\n    for(FNT_Piece *piece = piece_first;\r\n        piece < piece_opl;\r\n        piece += 1)\r\n    {\r\n      if(trailer_enabled && advance + piece->advance > (max_x - trailer_run.dim.x))\r\n      {\r\n        trailer_found = 1;\r\n        break;\r\n      }\r\n      if(!trailer_enabled && advance + piece->advance > max_x)\r\n      {\r\n        goto end_draw;\r\n      }\r\n      R_Handle texture = piece->texture;\r\n      Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1);\r\n      Vec2F32 size = dim_2f32(src);\r\n      Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance,\r\n                           p.y + piece->offset.y,\r\n                           p.x + piece->offset.x + advance + size.x,\r\n                           p.y + piece->offset.y + size.y);\r\n      if(!r_handle_match(texture, r_handle_zero()))\r\n      {\r\n        dr_img(dst, src, texture, fr->color, 0, 0, 0);\r\n        // dr_rect(dst, v4f32(0, 1, 0, 0.5f), 0, 1.f, 0.f);\r\n      }\r\n      advance += piece->advance;\r\n      pixel_range.min = Min(pre_advance, pixel_range.min);\r\n      pixel_range.max = Max(advance, pixel_range.max);\r\n    }\r\n    if(fr->underline_thickness > 0)\r\n    {\r\n      dr_rect(r2f32p(p.x + pixel_range.min,\r\n                     p.y+fr->run.descent+fr->run.descent/8,\r\n                     p.x + pixel_range.max,\r\n                     p.y+fr->run.descent+fr->run.descent/8+fr->underline_thickness),\r\n              fr->color, 0, 0, 0.8f);\r\n    }\r\n    if(fr->strikethrough_thickness > 0)\r\n    {\r\n      dr_rect(r2f32p(p.x+pre_advance, p.y+fr->run.descent - fr->run.ascent/2, p.x+advance, p.y+fr->run.descent - fr->run.ascent/2 + fr->strikethrough_thickness), fr->color, 0, 0, 1.f);\r\n    }\r\n    if(trailer_found)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  end_draw:;\r\n  \r\n  //- rjf: draw trailer\r\n  if(trailer_found)\r\n  {\r\n    FNT_Piece *piece_first = trailer_run.pieces.v;\r\n    FNT_Piece *piece_opl = piece_first + trailer_run.pieces.count;\r\n    F32 pre_advance = advance;\r\n    Vec4F32 trailer_piece_color = last_color;\r\n    for(FNT_Piece *piece = piece_first;\r\n        piece < piece_opl;\r\n        piece += 1)\r\n    {\r\n      R_Handle texture = piece->texture;\r\n      Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1);\r\n      Vec2F32 size = dim_2f32(src);\r\n      Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance,\r\n                           p.y + piece->offset.y,\r\n                           p.x + piece->offset.x + advance + size.x,\r\n                           p.y + piece->offset.y + size.y);\r\n      if(!r_handle_match(texture, r_handle_zero()))\r\n      {\r\n        dr_img(dst, src, texture, trailer_piece_color, 0, 0, 0);\r\n        trailer_piece_color.w *= 0.5f;\r\n      }\r\n      advance += piece->advance;\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\ndr_truncated_fancy_run_fuzzy_matches(Vec2F32 p, DR_FRunList *list, F32 max_x, FuzzyMatchRangeList *ranges, Vec4F32 color)\r\n{\r\n  for(FuzzyMatchRangeNode *match_n = ranges->first; match_n != 0; match_n = match_n->next)\r\n  {\r\n    Rng1U64 byte_range = match_n->range;\r\n    Rng1F32 pixel_range = {0};\r\n    {\r\n      pixel_range.min = 100000;\r\n      pixel_range.max = 0;\r\n    }\r\n    F32 last_piece_end_pad = 0;\r\n    U64 byte_off = 0;\r\n    F32 advance = 0;\r\n    F32 ascent = 0;\r\n    F32 descent = 0;\r\n    for(DR_FRunNode *fr_n = list->first; fr_n != 0; fr_n = fr_n->next)\r\n    {\r\n      DR_FRun *fr = &fr_n->v;\r\n      FNT_Run *run = &fr->run;\r\n      ascent = run->ascent;\r\n      descent = run->descent;\r\n      for(U64 piece_idx = 0; piece_idx < run->pieces.count; piece_idx += 1)\r\n      {\r\n        FNT_Piece *piece = &run->pieces.v[piece_idx];\r\n        if(contains_1u64(byte_range, byte_off))\r\n        {\r\n          F32 pre_advance  = advance + piece->offset.x;\r\n          F32 post_advance = advance + piece->advance;\r\n          pixel_range.min = Min(pre_advance,  pixel_range.min);\r\n          pixel_range.max = Max(post_advance, pixel_range.max);\r\n        }\r\n        if(!fr->icon)\r\n        {\r\n          byte_off += piece->decode_size;\r\n        }\r\n        advance += piece->advance;\r\n      }\r\n    }\r\n    if(pixel_range.min < pixel_range.max)\r\n    {\r\n      Rng2F32 rect = r2f32p(p.x + pixel_range.min - ascent/4.f,\r\n                            p.y - descent - ascent - ascent/8.f,\r\n                            p.x + pixel_range.max + ascent/4.f,\r\n                            p.y - descent - ascent + ascent/8.f + list->dim.y);\r\n      rect.x0 = Min(rect.x0, p.x+max_x);\r\n      rect.x1 = Min(rect.x1, p.x+max_x);\r\n      dr_rect(rect, color, (descent+ascent)/4.f, 0, 1.f);\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\ndr_text_run(Vec2F32 p, Vec4F32 color, FNT_Run run)\r\n{\r\n  F32 advance = 0;\r\n  FNT_Piece *piece_first = run.pieces.v;\r\n  FNT_Piece *piece_opl = piece_first + run.pieces.count;\r\n  for(FNT_Piece *piece = piece_first;\r\n      piece < piece_opl;\r\n      piece += 1)\r\n  {\r\n    R_Handle texture = piece->texture;\r\n    Rng2F32 src = r2f32p((F32)piece->subrect.x0, (F32)piece->subrect.y0, (F32)piece->subrect.x1, (F32)piece->subrect.y1);\r\n    Vec2F32 size = dim_2f32(src);\r\n    Rng2F32 dst = r2f32p(p.x + piece->offset.x + advance,\r\n                         p.y + piece->offset.y,\r\n                         p.x + piece->offset.x + advance + size.x,\r\n                         p.y + piece->offset.y + size.y);\r\n    if(size.x != 0 && size.y != 0 && !r_handle_match(texture, r_handle_zero()))\r\n    {\r\n      dr_img(dst, src, texture, color, 0, 0, 0);\r\n    }\r\n    advance += piece->advance;\r\n  }\r\n}\r\n\r\ninternal void\r\ndr_text(FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, Vec2F32 p, Vec4F32 color, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  FNT_Run run = fnt_run_from_string(font, size, base_align_px, tab_size_px, flags, string);\r\n  dr_text_run(p, color, run);\r\n  scratch_end(scratch);\r\n}\r\n"
  },
  {
    "path": "src/draw/draw.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef DRAW_H\r\n#define DRAW_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Fancy String Types\r\n\r\ntypedef struct DR_FStrParams DR_FStrParams;\r\nstruct DR_FStrParams\r\n{\r\n  FNT_Tag font;\r\n  FNT_RasterFlags raster_flags;\r\n  Vec4F32 color;\r\n  F32 size;\r\n  F32 underline_thickness;\r\n  F32 strikethrough_thickness;\r\n};\r\n\r\ntypedef struct DR_FStr DR_FStr;\r\nstruct DR_FStr\r\n{\r\n  String8 string;\r\n  DR_FStrParams params;\r\n};\r\n\r\ntypedef struct DR_FStrNode DR_FStrNode;\r\nstruct DR_FStrNode\r\n{\r\n  DR_FStrNode *next;\r\n  DR_FStr v;\r\n};\r\n\r\ntypedef struct DR_FStrList DR_FStrList;\r\nstruct DR_FStrList\r\n{\r\n  DR_FStrNode *first;\r\n  DR_FStrNode *last;\r\n  U64 node_count;\r\n  U64 total_size;\r\n};\r\n\r\ntypedef struct DR_FRun DR_FRun;\r\nstruct DR_FRun\r\n{\r\n  FNT_Run run;\r\n  Vec4F32 color;\r\n  F32 underline_thickness;\r\n  F32 strikethrough_thickness;\r\n  B32 icon;\r\n};\r\n\r\ntypedef struct DR_FRunNode DR_FRunNode;\r\nstruct DR_FRunNode\r\n{\r\n  DR_FRunNode *next;\r\n  DR_FRun v;\r\n};\r\n\r\ntypedef struct DR_FRunList DR_FRunList;\r\nstruct DR_FRunList\r\n{\r\n  DR_FRunNode *first;\r\n  DR_FRunNode *last;\r\n  U64 node_count;\r\n  Vec2F32 dim;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/draw.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Draw Bucket Types\r\n\r\ntypedef struct DR_Bucket DR_Bucket;\r\nstruct DR_Bucket\r\n{\r\n  R_PassList passes;\r\n  U64 stack_gen;\r\n  U64 last_cmd_stack_gen;\r\n  DR_BucketStackDecls;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Context\r\n\r\ntypedef struct DR_BucketSelectionNode DR_BucketSelectionNode;\r\nstruct DR_BucketSelectionNode\r\n{\r\n  DR_BucketSelectionNode *next;\r\n  DR_Bucket *bucket;\r\n};\r\n\r\ntypedef struct DR_ThreadCtx DR_ThreadCtx;\r\nstruct DR_ThreadCtx\r\n{\r\n  Arena *arena;\r\n  U64 arena_frame_start_pos;\r\n  FNT_Tag icon_font;\r\n  DR_BucketSelectionNode *top_bucket;\r\n  DR_BucketSelectionNode *free_bucket_selection;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nthread_static DR_ThreadCtx *dr_thread_ctx = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64 dr_hash_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Fancy String Type Functions\r\n\r\ninternal void dr_fstrs_push(Arena *arena, DR_FStrList *list, DR_FStr *str);\r\ninternal void dr_fstrs_push_new_(Arena *arena, DR_FStrList *list, DR_FStrParams *params, DR_FStrParams *overrides, String8 string);\r\n#define dr_fstrs_push_new(arena, list, params, string, ...) dr_fstrs_push_new_((arena), (list), (params), &(DR_FStrParams){.size = 0, __VA_ARGS__}, (string))\r\ninternal void dr_fstrs_concat_in_place(DR_FStrList *dst, DR_FStrList *to_push);\r\ninternal DR_FStrList dr_fstrs_copy(Arena *arena, DR_FStrList *src);\r\ninternal String8 dr_string_from_fstrs(Arena *arena, DR_FStrList *list);\r\ninternal FuzzyMatchRangeList dr_fuzzy_match_find_from_fstrs(Arena *arena, DR_FStrList *fstrs, String8 needle);\r\ninternal DR_FRunList dr_fruns_from_fstrs(Arena *arena, F32 tab_size_px, DR_FStrList *strs);\r\ninternal Vec2F32 dr_dim_from_fstrs(F32 tab_size_px, DR_FStrList *fstrs);\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level API\r\n//\r\n// (Frame boundaries & bucket submission)\r\n\r\ninternal void dr_begin_frame(FNT_Tag icon_font);\r\ninternal void dr_submit_bucket(OS_Handle os_window, R_Handle r_window, DR_Bucket *bucket);\r\n\r\n////////////////////////////////\r\n//~ rjf: Bucket Construction & Selection API\r\n//\r\n// (Bucket: Handle to sequence of many render passes, constructed by this layer)\r\n\r\ninternal DR_Bucket *dr_bucket_make(void);\r\ninternal void dr_push_bucket(DR_Bucket *bucket);\r\ninternal void dr_pop_bucket(void);\r\ninternal DR_Bucket *dr_top_bucket(void);\r\n#define DR_BucketScope(b) DeferLoop(dr_push_bucket(b), dr_pop_bucket())\r\n\r\n////////////////////////////////\r\n//~ rjf: Bucket Stacks\r\n//\r\n// (Pushing/popping implicit draw parameters)\r\n\r\ninternal R_Tex2DSampleKind          dr_push_tex2d_sample_kind(R_Tex2DSampleKind v);\r\ninternal Mat3x3F32                  dr_push_xform2d(Mat3x3F32 v);\r\ninternal Rng2F32                    dr_push_clip(Rng2F32 v);\r\ninternal F32                        dr_push_transparency(F32 v);\r\ninternal R_Tex2DSampleKind          dr_pop_tex2d_sample_kind(void);\r\ninternal Mat3x3F32                  dr_pop_xform2d(void);\r\ninternal Rng2F32                    dr_pop_clip(void);\r\ninternal F32                        dr_pop_transparency(void);\r\ninternal R_Tex2DSampleKind          dr_top_tex2d_sample_kind(void);\r\ninternal Mat3x3F32                  dr_top_xform2d(void);\r\ninternal Rng2F32                    dr_top_clip(void);\r\ninternal F32                        dr_top_transparency(void);\r\n\r\n#define DR_Tex2DSampleKindScope(v)   DeferLoop(dr_push_tex2d_sample_kind(v), dr_pop_tex2d_sample_kind())\r\n#define DR_XForm2DScope(v)           DeferLoop(dr_push_xform2d(v), dr_pop_xform2d())\r\n#define DR_ClipScope(v)              DeferLoop(dr_push_clip(v), dr_pop_clip())\r\n#define DR_TransparencyScope(v)      DeferLoop(dr_push_transparency(v), dr_pop_transparency())\r\n\r\n////////////////////////////////\r\n//~ rjf: Core Draw Calls\r\n//\r\n// (Apply to the calling thread's currently selected bucket)\r\n\r\n//- rjf: rectangles\r\ninternal inline R_Rect2DInst *dr_rect(Rng2F32 dst, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness);\r\n\r\n//- rjf: images\r\ninternal inline R_Rect2DInst *dr_img(Rng2F32 dst, Rng2F32 src, R_Handle texture, Vec4F32 color, F32 corner_radius, F32 border_thickness, F32 edge_softness);\r\n\r\n//- rjf: blurs\r\ninternal R_PassParams_Blur *dr_blur(Rng2F32 rect, F32 blur_size, F32 corner_radius);\r\n\r\n//- rjf: 3d rendering pass params\r\ninternal R_PassParams_Geo3D *dr_geo3d_begin(Rng2F32 viewport, Mat4x4F32 view, Mat4x4F32 projection);\r\n\r\n//- rjf: meshes\r\ninternal R_Mesh3DInst *dr_mesh(R_Handle mesh_vertices, R_Handle mesh_indices, R_GeoTopologyKind mesh_geo_topology, R_GeoVertexFlags mesh_geo_vertex_flags, R_Handle albedo_tex, Mat4x4F32 inst_xform);\r\n\r\n//- rjf: collating one pre-prepped bucket into parent bucket\r\ninternal void dr_sub_bucket(DR_Bucket *bucket);\r\n\r\n////////////////////////////////\r\n//~ rjf: Draw Call Helpers\r\n\r\n//- rjf: text\r\ninternal void dr_truncated_fancy_run_list(Vec2F32 p, DR_FRunList *list, F32 max_x, FNT_Run trailer_run);\r\ninternal void dr_truncated_fancy_run_fuzzy_matches(Vec2F32 p, DR_FRunList *list, F32 max_x, FuzzyMatchRangeList *ranges, Vec4F32 color);\r\ninternal void dr_text_run(Vec2F32 p, Vec4F32 color, FNT_Run run);\r\ninternal void dr_text(FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, Vec2F32 p, Vec4F32 color, String8 string);\r\n\r\n#endif // DRAW_H\r\n"
  },
  {
    "path": "src/draw/draw.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n@table(name, name_lower, type, default_init)\r\nDR_StackTable:\r\n{\r\n  {Tex2DSampleKind        tex2d_sample_kind      R_Tex2DSampleKind   `R_Tex2DSampleKind_Nearest`                   }\r\n  {XForm2D                xform2d                Mat3x3F32           `{1, 0, 0, 0, 1, 0, 0, 0, 1}`                 }\r\n  {Clip                   clip                   Rng2F32             `{0}`                                         }\r\n  {Transparency           transparency           F32                 `0`                                           }\r\n}\r\n\r\n@gen\r\n{\r\n  @expand(DR_StackTable a) `typedef struct DR_$(a.name)Node DR_$(a.name)Node; struct DR_$(a.name)Node {DR_$(a.name)Node *next; $(a.type) v;};`;\r\n}\r\n\r\n@gen\r\n{\r\n  `#define DR_BucketStackDecls struct{\\\\`;\r\n  @expand(DR_StackTable a) `DR_$(a.name)Node *top_$(a.name_lower);\\\\`;\r\n  `}`;\r\n}\r\n\r\n@gen\r\n{\r\n  @expand(DR_StackTable a) `read_only global DR_$(a.name)Node dr_nil_$(a.name_lower) = {0, $(a.default_init)};`;\r\n}\r\n\r\n@gen\r\n{\r\n  `#define DR_BucketStackInits(b) do{\\\\`;\r\n  @expand(DR_StackTable a) `(b)->top_$(a.name_lower) = &dr_nil_$(a.name_lower);\\\\`;\r\n  `}while(0)`;\r\n}\r\n\r\n@gen\r\n{\r\n  `#if 0`;\r\n  @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_push_$(a.name_lower)($(a.type) v);`;\r\n  @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_pop_$(a.name_lower)(void);`;\r\n  @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_top_$(a.name_lower)(void);`;\r\n  `#endif`;\r\n}\r\n\r\n@gen @c_file\r\n{\r\n  @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_push_$(a.name_lower)($(a.type) v) {DR_StackPushImpl($(a.name), $(a.name_lower), $(a.type), v);}`;\r\n  @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_pop_$(a.name_lower)(void) {DR_StackPopImpl($(a.name), $(a.name_lower), $(a.type));}`;\r\n  @expand(DR_StackTable a) `internal $(a.type) $(=>35) dr_top_$(a.name_lower)(void) {DR_StackTopImpl($(a.name), $(a.name_lower), $(a.type));}`;\r\n}\r\n\r\n@gen\r\n{\r\n  `#if 0`;\r\n  @expand(DR_StackTable a) `#define DR_$(a.name)Scope(v) $(=>35) DeferLoop(dr_push_$(a.name_lower)(v), dr_pop_$(a.name_lower)())`;\r\n  `#endif`;\r\n}\r\n"
  },
  {
    "path": "src/draw/generated/draw.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\ninternal R_Tex2DSampleKind          dr_push_tex2d_sample_kind(R_Tex2DSampleKind v) {DR_StackPushImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind, v);}\r\ninternal Mat3x3F32                  dr_push_xform2d(Mat3x3F32 v) {DR_StackPushImpl(XForm2D, xform2d, Mat3x3F32, v);}\r\ninternal Rng2F32                    dr_push_clip(Rng2F32 v) {DR_StackPushImpl(Clip, clip, Rng2F32, v);}\r\ninternal F32                        dr_push_transparency(F32 v) {DR_StackPushImpl(Transparency, transparency, F32, v);}\r\ninternal R_Tex2DSampleKind          dr_pop_tex2d_sample_kind(void) {DR_StackPopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);}\r\ninternal Mat3x3F32                  dr_pop_xform2d(void) {DR_StackPopImpl(XForm2D, xform2d, Mat3x3F32);}\r\ninternal Rng2F32                    dr_pop_clip(void) {DR_StackPopImpl(Clip, clip, Rng2F32);}\r\ninternal F32                        dr_pop_transparency(void) {DR_StackPopImpl(Transparency, transparency, F32);}\r\ninternal R_Tex2DSampleKind          dr_top_tex2d_sample_kind(void) {DR_StackTopImpl(Tex2DSampleKind, tex2d_sample_kind, R_Tex2DSampleKind);}\r\ninternal Mat3x3F32                  dr_top_xform2d(void) {DR_StackTopImpl(XForm2D, xform2d, Mat3x3F32);}\r\ninternal Rng2F32                    dr_top_clip(void) {DR_StackTopImpl(Clip, clip, Rng2F32);}\r\ninternal F32                        dr_top_transparency(void) {DR_StackTopImpl(Transparency, transparency, F32);}\r\n"
  },
  {
    "path": "src/draw/generated/draw.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef DRAW_META_H\r\n#define DRAW_META_H\r\n\r\ntypedef struct DR_Tex2DSampleKindNode DR_Tex2DSampleKindNode; struct DR_Tex2DSampleKindNode {DR_Tex2DSampleKindNode *next; R_Tex2DSampleKind v;};\r\ntypedef struct DR_XForm2DNode DR_XForm2DNode; struct DR_XForm2DNode {DR_XForm2DNode *next; Mat3x3F32 v;};\r\ntypedef struct DR_ClipNode DR_ClipNode; struct DR_ClipNode {DR_ClipNode *next; Rng2F32 v;};\r\ntypedef struct DR_TransparencyNode DR_TransparencyNode; struct DR_TransparencyNode {DR_TransparencyNode *next; F32 v;};\r\n#define DR_BucketStackDecls struct{\\\r\nDR_Tex2DSampleKindNode *top_tex2d_sample_kind;\\\r\nDR_XForm2DNode *top_xform2d;\\\r\nDR_ClipNode *top_clip;\\\r\nDR_TransparencyNode *top_transparency;\\\r\n}\r\nread_only global DR_Tex2DSampleKindNode dr_nil_tex2d_sample_kind = {0, R_Tex2DSampleKind_Nearest};\r\nread_only global DR_XForm2DNode dr_nil_xform2d = {0, {1, 0, 0, 0, 1, 0, 0, 0, 1}};\r\nread_only global DR_ClipNode dr_nil_clip = {0, {0}};\r\nread_only global DR_TransparencyNode dr_nil_transparency = {0, 0};\r\n#define DR_BucketStackInits(b) do{\\\r\n(b)->top_tex2d_sample_kind = &dr_nil_tex2d_sample_kind;\\\r\n(b)->top_xform2d = &dr_nil_xform2d;\\\r\n(b)->top_clip = &dr_nil_clip;\\\r\n(b)->top_transparency = &dr_nil_transparency;\\\r\n}while(0)\r\n#if 0\r\ninternal R_Tex2DSampleKind          dr_push_tex2d_sample_kind(R_Tex2DSampleKind v);\r\ninternal Mat3x3F32                  dr_push_xform2d(Mat3x3F32 v);\r\ninternal Rng2F32                    dr_push_clip(Rng2F32 v);\r\ninternal F32                        dr_push_transparency(F32 v);\r\ninternal R_Tex2DSampleKind          dr_pop_tex2d_sample_kind(void);\r\ninternal Mat3x3F32                  dr_pop_xform2d(void);\r\ninternal Rng2F32                    dr_pop_clip(void);\r\ninternal F32                        dr_pop_transparency(void);\r\ninternal R_Tex2DSampleKind          dr_top_tex2d_sample_kind(void);\r\ninternal Mat3x3F32                  dr_top_xform2d(void);\r\ninternal Rng2F32                    dr_top_clip(void);\r\ninternal F32                        dr_top_transparency(void);\r\n#endif\r\n#if 0\r\n#define DR_Tex2DSampleKindScope(v)  DeferLoop(dr_push_tex2d_sample_kind(v), dr_pop_tex2d_sample_kind())\r\n#define DR_XForm2DScope(v)          DeferLoop(dr_push_xform2d(v), dr_pop_xform2d())\r\n#define DR_ClipScope(v)             DeferLoop(dr_push_clip(v), dr_pop_clip())\r\n#define DR_TransparencyScope(v)     DeferLoop(dr_push_transparency(v), dr_pop_transparency())\r\n#endif\r\n#endif // DRAW_META_H\r\n"
  },
  {
    "path": "src/dwarf/dwarf.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64\ndw_reg_size_from_code_x86(DW_Reg reg_code)\n{\n  switch (reg_code) {\n#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX86_##reg_name_dw: return reg_size;\n    DW_Regs_X86_XList(X)\n#undef X\n  }\n  return 0;\n}\n\ninternal U64\ndw_reg_pos_from_code_x86(DW_Reg reg_code)\n{\n  switch (reg_code) {\n#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX86_##reg_name_dw: return reg_pos;\n    DW_Regs_X86_XList(X)\n#undef X\n  }\n  return max_U64;\n}\n\ninternal U64\ndw_reg_size_from_code_x64(DW_Reg reg_code)\n{\n  switch (reg_code) {\n#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_size;\n    DW_Regs_X64_XList(X)\n#undef X\n  }\n  return 0;\n}\n\ninternal U64\ndw_reg_pos_from_code_x64(DW_Reg reg_code)\n{\n  switch (reg_code) {\n#define X(reg_name_dw, reg_code_dw, reg_name_rdi, reg_pos, reg_size) case DW_RegX64_##reg_name_dw: return reg_pos;\n    DW_Regs_X64_XList(X)\n#undef X\n  }\n  return max_U64;\n}\n\ninternal U64\ndw_reg_size_from_code(Arch arch, DW_Reg reg_code)\n{\n  switch (arch) {\n    case Arch_Null: break;\n    case Arch_x86: return dw_reg_size_from_code_x86(reg_code);\n    case Arch_x64: return dw_reg_size_from_code_x64(reg_code);\n    default: NotImplemented; break;\n  }\n  return 0;\n}\n\ninternal U64\ndw_reg_pos_from_code(Arch arch, DW_Reg reg_code)\n{\n  switch (arch) {\n    case Arch_Null: break;\n    case Arch_x86: return dw_reg_pos_from_code_x86(reg_code);\n    case Arch_x64: return dw_reg_pos_from_code_x64(reg_code);\n    default: NotImplemented; break;\n  }\n  return max_U64;\n}\n\ninternal U64\ndw_reg_count_from_arch(Arch arch)\n{\n  switch (arch) {\n    default: { NotImplemented; } // fall-through\n    case Arch_Null: return 0;\n    case Arch_x86: return DW_RegX86_Last;\n    case Arch_x64: return DW_RegX64_Last;\n  }\n}\n\ninternal U64\ndw_reg_max_size_from_arch(Arch arch)\n{\n  local_persist U64 max_size = 0;\n  if (max_size == 0) {\n    U64 max_idx  = dw_reg_count_from_arch(arch);\n    for EachIndex(reg_idx, max_idx) {\n      U64 reg_size = dw_reg_size_from_code(arch, reg_idx);\n      max_size = Max(max_size, reg_size);\n    }\n  }\n  return max_size;\n}\n\ninternal U64\ndw_sp_from_arch(Arch arch)\n{\n  switch (arch) {\n    default: NotImplemented;\n    case Arch_Null: return 0;\n    case Arch_x86:  return DW_RegX86_Esp;\n    case Arch_x64:  return DW_RegX64_Rsp;\n  }\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_v2(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_V2_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_v3(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_V3_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_v4(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_V4_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_v5(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_V5_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_gnu(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_GNU_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_llvm(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_LLVM_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_apple(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_APPLE_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib_mips(DW_AttribKind k)\n{\n  switch (k) {\n#define X(_N,_C) case DW_AttribKind_##_N: return _C;\n    DW_AttribKind_ClassFlags_MIPS_XList(X)\n#undef X\n  }\n  return DW_AttribClass_Null;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind k)\n{\n  DW_AttribClass result = DW_AttribClass_Null;\n  \n  while (ext) {\n    U64 z = 64-clz64(ext);\n    if (z == 0) {\n      break;\n    }\n    U64 flag = 1 << (z-1);\n    ext &= ~flag;\n    \n    switch (flag) {\n      case DW_Ext_Null: break;\n      case DW_Ext_GNU:   result = dw_attrib_class_from_attrib_gnu(k);   break;\n      case DW_Ext_LLVM:  result = dw_attrib_class_from_attrib_llvm(k);  break;\n      case DW_Ext_APPLE: result = dw_attrib_class_from_attrib_apple(k); break;\n      case DW_Ext_MIPS:  result = dw_attrib_class_from_attrib_mips(k);  break;\n      default: InvalidPath; break;\n    }\n    \n    if (result != DW_AttribClass_Null) {\n      break;\n    }\n  }\n  \n  if (result == DW_AttribClass_Null) {\n    switch (ver) {\n      case DW_Version_Null: break;\n      case DW_Version_1:    AssertAlways(!\"DWARF V1 is not supported\");      break;\n      case DW_Version_2:    result = dw_attrib_class_from_attrib_v2(k); break;\n      case DW_Version_3:    result = dw_attrib_class_from_attrib_v3(k); break;\n      case DW_Version_4:    result = dw_attrib_class_from_attrib_v4(k); break;\n      case DW_Version_5:    result = dw_attrib_class_from_attrib_v5(k); break;\n      default: InvalidPath; break;\n    }\n  }\n  \n  return result;\n}\n\ninternal DW_AttribClass\ndw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k)\n{\n#define X(_N,_C) case DW_Form_##_N: return _C;\n  \n  switch (k) {\n    DW_Form_AttribClass_GNU_XList(X)\n  }\n  \n  switch (ver) {\n    case DW_Version_5: {\n      switch (k) {\n        DW_Form_AttribClass_V5_XList(X)\n      }\n    } break;\n    case DW_Version_4: {\n      switch (k) {\n        DW_Form_AttribClass_V4_XList(X)\n      }\n    } break;\n    case DW_Version_3: {\n      switch (k) {\n        DW_Form_AttribClass_V2_XList(X)\n      }\n    } break;\n    case DW_Version_2: {\n      switch (k) {\n        DW_Form_AttribClass_V2_XList(X)\n      }\n    } break;\n    case DW_Version_1: {\n    } break;\n    case DW_Version_Null: break;\n  }\n#undef X\n  \n  return DW_AttribClass_Null;\n}\n\ninternal B32\ndw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind)\n{\n  DW_AttribClass compat_flags = dw_attrib_class_from_form_kind(ver, form_kind);\n  B32 are_compat = (attrib_class & compat_flags) != 0;\n  return are_compat;\n}\n\ninternal String8\ndw_name_string_from_section_kind(DW_SectionKind k)\n{\n  String8 result = {0};\n  switch(k)\n  {\n#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_L);}break;\n    DW_SectionKind_XList(X)\n#undef X\n  }\n  return result;\n}\n\ninternal String8\ndw_mach_name_string_from_section_kind(DW_SectionKind k)\n{\n  String8 result = {0};\n  switch(k)\n  {\n#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_M);}break;\n    DW_SectionKind_XList(X)\n#undef X\n  }\n  return result;\n}\n\ninternal String8\ndw_dwo_name_string_from_section_kind(DW_SectionKind k)\n{\n  String8 result = {0};\n  switch(k)\n  {\n#define X(_N,_L,_M,_D) case DW_Section_##_N:{result = str8_lit(_D);}break;\n    DW_SectionKind_XList(X)\n#undef X\n  }\n  return result;\n}\n\ninternal U64\ndw_size_from_format(DW_Format format)\n{\n  U64 result = 0;\n  switch(format)\n  {\n    default:{}break;\n    case DW_Format_32Bit: result = 4; break;\n    case DW_Format_64Bit: result = 8; break;\n  }\n  return result;\n}\n\ninternal DW_AttribClass\ndw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib_kind, DW_FormKind form_kind)\n{\n  // NOTE(rjf): DWARF's spec specifies two mappings:\n  // (DW_AttribKind) => List(DW_AttribClass)\n  // (DW_FormKind)   => List(DW_AttribClass)\n  //\n  // This function's purpose is to find the overlapping class between an\n  // DW_AttribKind and DW_FormKind.\n  \n  DW_AttribClass attrib_class = dw_attrib_class_from_attrib(ver, ext, attrib_kind);\n  DW_AttribClass form_class   = dw_attrib_class_from_form_kind(ver, form_kind);\n  if(attrib_class == DW_AttribClass_Null || form_class == DW_AttribClass_Null)\n  {\n    attrib_class = dw_attrib_class_from_attrib(DW_Version_Last, ext, attrib_kind);\n    form_class   = dw_attrib_class_from_form_kind(DW_Version_Last, form_kind);\n  }\n  \n  DW_AttribClass result = DW_AttribClass_Null;\n  if(attrib_class != DW_AttribClass_Null && form_class != DW_AttribClass_Null)\n  {\n    result = DW_AttribClass_Undefined;\n    \n    for(U32 i = 0; i < 32; ++i)\n    {\n      U32 n = 1u << i;\n      if((attrib_class & n) != 0 && (form_class & n) != 0)\n      {\n        result = ((DW_AttribClass) n);\n        break;\n      }\n    }\n  }\n  \n  return result;\n}\n\ninternal U64\ndw_pick_default_lower_bound(DW_Language lang)\n{\n  U64 lower_bound = max_U64;\n  switch (lang) {\n    case DW_Language_Null: break;\n    case DW_Language_C89:\n    case DW_Language_C:\n    case DW_Language_CPlusPlus:\n    case DW_Language_C99:\n    case DW_Language_CPlusPlus03:\n    case DW_Language_CPlusPlus11:\n    case DW_Language_C11:\n    case DW_Language_CPlusPlus14:\n    case DW_Language_Java:\n    case DW_Language_ObjC:\n    case DW_Language_ObjCPlusPlus:\n    case DW_Language_UPC:\n    case DW_Language_D:\n    case DW_Language_Python:\n    case DW_Language_OpenCL:\n    case DW_Language_Go:\n    case DW_Language_Haskell:\n    case DW_Language_OCaml:\n    case DW_Language_Rust:\n    case DW_Language_Swift:\n    case DW_Language_Dylan:\n    case DW_Language_RenderScript:\n    case DW_Language_BLISS:\n    lower_bound = 0;\n    break;\n    case DW_Language_Ada83:\n    case DW_Language_Cobol74:\n    case DW_Language_Cobol85:\n    case DW_Language_Fortran77:\n    case DW_Language_Fortran90:\n    case DW_Language_Pascal83:\n    case DW_Language_Modula2:\n    case DW_Language_Ada95:\n    case DW_Language_Fortran95:\n    case DW_Language_PLI:\n    case DW_Language_Modula3:\n    case DW_Language_Julia:\n    case DW_Language_Fortran03:\n    case DW_Language_Fortran08:\n    lower_bound = 1;\n    default:\n    NotImplemented;\n    break;\n  }\n  return lower_bound;\n}\n\ninternal U64\ndw_operand_count_from_expr_op(DW_ExprOp op)\n{\n  switch (op) {\n#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _OPER_COUNT;\n    DW_Expr_V3_XList(X)\n      DW_Expr_V4_XList(X)\n      DW_Expr_V5_XList(X)\n      DW_Expr_GNU_XList(X)\n#undef X\n    default: { NotImplemented; } break;\n  }\n  return 0;\n}\n\ninternal U64\ndw_pop_count_from_expr_op(DW_ExprOp op)\n{\n  switch (op) {\n#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _POP_COUNT;\n    DW_Expr_V3_XList(X)\n      DW_Expr_V4_XList(X)\n      DW_Expr_V5_XList(X)\n      DW_Expr_GNU_XList(X)\n#undef X\n    default: { NotImplemented; } break;\n  }\n  return 0;\n}\n\ninternal U64\ndw_push_count_from_expr_op(DW_ExprOp op) \n{\n  switch (op) {\n#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) case _ID: return _PUSH_COUNT;\n    DW_Expr_V3_XList(X)\n      DW_Expr_V4_XList(X)\n      DW_Expr_V5_XList(X)\n      DW_Expr_GNU_XList(X)\n#undef X\n    default: { NotImplemented; } break;\n  }\n  return 0;\n}\n\ninternal U64\ndw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode)\n{\n  switch (opcode) {\n#define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return ArrayCount(t)-1; }\n    DW_CFA_Kind_XList(X)\n#undef X\n    default: { NotImplemented; } break;\n  }\n  return 0;\n}\n\ninternal B32\ndw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode)\n{\n  B32 is_invalid = 0;\n  switch (opcode) {\n    case DW_ExprOp_Addrx:\n    case DW_ExprOp_Call2:\n    case DW_ExprOp_Call4:\n    case DW_ExprOp_CallRef:\n    case DW_ExprOp_ConstType:\n    case DW_ExprOp_Constx:\n    case DW_ExprOp_Convert:\n    case DW_ExprOp_DerefType:\n    case DW_ExprOp_RegvalType:\n    case DW_ExprOp_Reinterpret:\n    case DW_ExprOp_PushObjectAddress:\n    case DW_ExprOp_CallFrameCfa: {\n      is_invalid = 1;\n    } break;\n    default: break;\n  }\n  return is_invalid;\n}\n\ninternal B32\ndw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode)\n{\n  B32 is_new_row_op = 0;\n  switch (opcode) {\n    case DW_CFA_SetLoc:\n    case DW_CFA_AdvanceLoc:\n    case DW_CFA_AdvanceLoc1:\n    case DW_CFA_AdvanceLoc2:\n    case DW_CFA_AdvanceLoc4: {\n      is_new_row_op = 1;\n    } break;\n    default: break;\n  }\n  return is_new_row_op;\n}\n\ninternal DW_CFA_OperandType *\ndw_operand_types_from_cfa_op(DW_CFA_Opcode opcode)\n{\n  switch (opcode) {\n#define X(_N, _ID, ...) case _ID: { local_persist DW_CFA_OperandType t[] = { DW_CFA_OperandType_Null, __VA_ARGS__ }; return &t[0] + 1; }\n    DW_CFA_Kind_XList(X)\n#undef X\n    default: { NotImplemented; } break;\n  }\n  return 0;\n}\n\n////////////////////////////////\n//~ rjf: String <=> Enum\n\ninternal String8\ndw_string_from_format(DW_Format format)\n{\n  switch (format) {\n    case DW_Format_Null:  return str8_zero();\n    case DW_Format_32Bit: return str8_lit(\"DWARF32\");\n    case DW_Format_64Bit: return str8_lit(\"DWARF64\");\n  }\n  return str8_zero();\n}\n\ninternal String8\ndw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op)\n{\n  String8 result = {0};\n  \n#define X(_N,...) case DW_ExprOp_##_N: result = str8_lit(Stringify(_N)); goto exit;\n  if (ext & DW_Ext_GNU) {\n    switch (op) {\n      DW_Expr_GNU_XList(X); \n    }\n  }\n  \n  switch (ver) {\n    case DW_Version_5: {\n      switch (op) {\n        DW_Expr_V5_XList(X)\n      }\n    } // fall-through\n    case DW_Version_4: {\n      switch (op) {\n        DW_Expr_V4_XList(X)\n      }\n    } // fall-through\n    case DW_Version_3:\n    case DW_Version_2:\n    case DW_Version_1: {\n      switch (op) {\n        DW_Expr_V3_XList(X)\n      }\n    } // fall-through\n    case DW_Version_Null:\n    break;\n  }\n#undef X\n  \n  result = push_str8f(arena, \"%x\", op);\n  \n  exit:;\n  return result;\n}\n\ninternal String8\ndw_string_from_tag_kind(Arena *arena, DW_TagKind kind)\n{\n  switch (kind) {\n    case DW_TagKind_Null: return str8_lit(\"Null\");\n#define X(_N,_ID) case DW_TagKind_##_N: return str8_lit(Stringify(_N));\n    DW_TagKind_V3_XList(X)\n      DW_TagKind_V5_XList(X)\n      DW_TagKind_GNU_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%llx\", kind);\n}\n\ninternal String8\ndw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKind kind)\n{\n#define X(_N,...) case DW_AttribKind_##_N:{result = str8_lit(Stringify(_N));}break;\n  String8 result = {0};\n  \n  //- rjf: try extensions\n  if(result.size != 0)\n  {\n    while(ext)\n    {\n      U64 z = 64-clz64(ext);\n      if(z == 0)\n      {\n        break;\n      }\n      U64 flag = 1 << (z-1);\n      ext &= ~flag;\n      switch(flag)\n      {\n        default:{}break;\n        case DW_Ext_Null:  break;\n        case DW_Ext_GNU:   switch (kind) { DW_AttribKind_GNU_XList(X)   } break;\n        case DW_Ext_LLVM:  switch (kind) { DW_AttribKind_LLVM_XList(X)  } break;\n        case DW_Ext_APPLE: switch (kind) { DW_AttribKind_APPLE_XList(X) } break;\n        case DW_Ext_MIPS:  switch (kind) { DW_AttribKind_MIPS_XList(X)  } break;\n      }\n    }\n  }\n  \n  //- rjf: try version\n  if(result.size == 0)\n  {\n    for(U64 retry = 0; retry < 2; retry += 1)\n    {\n      DW_Version version = retry ? DW_Version_5 : ver;\n      switch(version)\n      {\n        case DW_Version_5: { switch(kind) { DW_AttribKind_V5_XList(X) } } // fall-through\n        case DW_Version_4: { switch(kind) { DW_AttribKind_V4_XList(X) } } // fall-through\n        case DW_Version_3: { switch(kind) { DW_AttribKind_V3_XList(X) } } // fall-through\n        case DW_Version_2: { switch(kind) { DW_AttribKind_V2_XList(X) } } // fall-through\n        case DW_Version_1: {}break;\n        case DW_Version_Null:{}break;\n        default:{}break;\n      }\n    }\n  }\n  \n  //- rjf: fallback\n  if(result.size == 0)\n  {\n    result = push_str8f(arena, \"#%u\", kind);\n  }\n  \n#undef X\n  return result;\n}\n\ninternal String8\ndw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind)\n{\n#define X(_N,...) case DW_Form_##_N: return str8_lit(Stringify(_N));\n  switch (ver) {\n    case DW_Version_5: {\n      switch (kind) {\n        DW_Form_V5_XList(X)\n      }\n    } // fall-through\n    case DW_Version_4: {\n      switch (kind) {\n        DW_Form_V4_XList(X)\n      }\n    } // fall-through\n    case DW_Version_3: \n    case DW_Version_2: {\n      switch (kind) {\n        DW_Form_V2_XList(X)\n      }\n    } // fall-through\n    case DW_Version_Null: break;\n  }\n#undef X\n  String8 result = push_str8f(arena, \"%x\", kind);\n  return result;\n}\n\ninternal String8\ndw_string_from_language(Arena *arena, DW_Language kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case DW_Language_##_N: return str8_lit(Stringify(_N));\n    DW_Language_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%x\", kind);\n}\n\ninternal String8\ndw_string_from_inl(Arena *arena, DW_InlKind kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N));\n    DW_Inl_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%x\", kind);\n}\n\ninternal String8\ndw_string_from_access_kind(Arena *arena, DW_AccessKind kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N));\n    DW_AccessKind_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%llx\", kind);\n}\n\ninternal String8\ndw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N));\n    DW_CallingConventionKind_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%llx\", kind);\n}\n\ninternal String8\ndw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case _ID: return str8_lit(Stringify(_N));\n    DW_ATE_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%llx\", kind);\n}\n\ninternal String8\ndw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case DW_StdOpcode_##_N: return str8_lit(Stringify(_N));\n    DW_StdOpcode_XList(X)\n#undef X\n  }\n  return push_str8f(arena, \"%x\", kind);\n}\n\ninternal String8\ndw_string_from_ext_opcode(Arena *arena, DW_ExtOpcode kind)\n{\n  switch (kind) {\n#define X(_N,_ID) case DW_ExtOpcode_##_N: return str8_lit(Stringify(_N));\n    DW_ExtOpcode_XList(X)\n#undef X\n    default: InvalidPath; break;\n  }\n  return push_str8f(arena, \"%x\", kind);\n}\n\ninternal String8\ndw_string_from_loc_list_entry_kind(Arena *arena, DW_LLE kind)\n{\n  NotImplemented;\n  return str8_zero();\n}\n\ninternal String8\ndw_string_from_section_kind(Arena *arena, DW_SectionKind kind)\n{\n  NotImplemented;\n  return str8_zero();\n}\n\ninternal String8\ndw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind)\n{\n  NotImplemented;\n  return str8_zero();\n}\n\ninternal String8\ndw_string_from_register(Arena *arena, Arch arch, U64 reg_id)\n{\n  String8 reg_str = str8_zero();\n  switch (arch) {\n    case Arch_Null: break;\n    case Arch_x86: {\n      switch (reg_id) {\n#define X(_N, _ID, ...) case DW_RegX86_##_N: reg_str = str8_lit(Stringify(_N)); break;\n        DW_Regs_X86_XList(X)\n#undef X\n      }\n    } break;\n    case Arch_x64: {\n      switch (reg_id) {\n#define X(_N, _ID, ...) case DW_RegX64_##_N: reg_str = str8_lit(Stringify(_N)); break;\n        DW_Regs_X64_XList(X)\n#undef X\n      }\n    } break;\n    case Arch_arm32: NotImplemented; break;\n    case Arch_arm64: NotImplemented; break;\n    default: InvalidPath; break;\n  }\n  if (reg_str.size == 0) {\n    reg_str = push_str8f(arena, \"%#llx\", reg_id);\n  }\n  return reg_str;\n}\n\ninternal String8\ndw_string_from_cfa_opcode(DW_CFA_Opcode opcode)\n{\n  switch (opcode) {\n#define X(_NAME, _ID, ...) case _ID: return str8_lit(Stringify(_NAME));\n    DW_CFA_Kind_XList(X)\n#undef X\n    default: InvalidPath; break;\n  }\n  return str8_zero();\n}\n"
  },
  {
    "path": "src/dwarf/dwarf.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_H\n#define DWARF_H\n\ntypedef U16 DW_Version;\ntypedef enum DW_VersionEnum\n{\n  DW_Version_Null,\n  DW_Version_1,\n  DW_Version_2,\n  DW_Version_3,\n  DW_Version_4,\n  DW_Version_5,\n  DW_Version_Last = DW_Version_5\n} DW_VersionEnum;\n\ntypedef U64 DW_Ext;\ntypedef enum DW_ExtEnum\n{\n  DW_Ext_Null,\n  \n  DW_Ext_GNU   = (1 << 0),\n  DW_Ext_LLVM  = (1 << 1),\n  DW_Ext_APPLE = (1 << 2),\n  DW_Ext_MIPS  = (1 << 3),\n  \n  DW_Ext_All   = DW_Ext_GNU|DW_Ext_LLVM|DW_Ext_APPLE|DW_Ext_MIPS,\n} DW_ExtEnum;\n\n#define DW_FormatFromSize(size) ((size) >= max_U32 ? DW_Format_64Bit : DW_Format_32Bit)\ntypedef enum DW_Format\n{\n  DW_Format_Null,\n  DW_Format_32Bit,\n  DW_Format_64Bit\n} DW_Format;\n\n#define DW_SentinelFromSize(address_size) ((address_size) == 4 ? max_U32 : (address_size) == 8 ? max_U64 : 0)\n\n#define DW_SectionKind_XList(X                                                       )\\\nX(Null,       \"\",                   \"\",                    \"\"                      )\\\nX(Abbrev,     \".debug_abbrev\",      \"__debug_abbrev\",      \".debug_abbrev.dwo\"     )\\\nX(ARanges,    \".debug_aranges\",     \"__debug_aranges\",     \".debug_aranges.dwo\"    )\\\nX(Frame,      \".debug_frame\",       \"__debug_frame\",       \".debug_frame.dwo\"      )\\\nX(Info,       \".debug_info\",        \"__debug_info\",        \".debug_info.dwo\"       )\\\nX(Line,       \".debug_line\",        \"__debug_line\",        \".debug_line.dwo\"       )\\\nX(Loc,        \".debug_loc\",         \"__debug_loc\",         \".debug_loc.dwo\"        )\\\nX(MacInfo,    \".debug_macinfo\",     \"__debug_macinfo\",     \".debug_macinfo.dwo\"    )\\\nX(PubNames,   \".debug_pubnames\",    \"__debug_pubnames\",    \".debug_pubnames.dwo\"   )\\\nX(PubTypes,   \".debug_pubtypes\",    \"__debug_pubtypes\",    \".debug_pubtypes.dwo\"   )\\\nX(Ranges,     \".debug_ranges\",      \"__debug_ranges\",      \".debug_ranges.dwo\"     )\\\nX(Str,        \".debug_str\",         \"__debug_str\",         \".debug_str.dwo\"        )\\\nX(Addr,       \".debug_addr\",        \"__debug_addr\",        \".debug_addr.dwo\"       )\\\nX(LocLists,   \".debug_loclists\",    \"__debug_loclists\",    \".debug_loclists.dwo\"   )\\\nX(RngLists,   \".debug_rnglists\",    \"__debug_rnglists\",    \".debug_rnglists.dwo\"   )\\\nX(StrOffsets, \".debug_str_offsets\", \"__debug_str_offsets\", \".debug_str_offsets.dwo\")\\\nX(LineStr,    \".debug_line_str\",    \"__debug_line_str\",    \".debug_line_str.dwo\"   )\\\nX(Names,      \".debug_names\",       \"__debug_names\",       \".debug_names.dwo\"      )\n\ntypedef U64 DW_SectionKind;\ntypedef enum DW_SectionKindEnum\n{\n#define X(_N,...) DW_Section_##_N,\n  DW_SectionKind_XList(X)\n#undef X\n  DW_Section_Count\n} DW_SectionKindEnum;\n\n#define DW_Language_XList(X)     \\\nX(Null,                0x00)   \\\nX(C89,                 0x01)   \\\nX(C,                   0x02)   \\\nX(Ada83,               0x03)   \\\nX(CPlusPlus,           0x04)   \\\nX(Cobol74,             0x05)   \\\nX(Cobol85,             0x06)   \\\nX(Fortran77,           0x07)   \\\nX(Fortran90,           0x08)   \\\nX(Pascal83,            0x09)   \\\nX(Modula2,             0x0A)   \\\nX(Java,                0x0B)   \\\nX(C99,                 0x0C)   \\\nX(Ada95,               0x0D)   \\\nX(Fortran95,           0x0E)   \\\nX(PLI,                 0x0F)   \\\nX(ObjC,                0x10)   \\\nX(ObjCPlusPlus,        0x11)   \\\nX(UPC,                 0x12)   \\\nX(D,                   0x13)   \\\nX(Python,              0x14)   \\\nX(OpenCL,              0x15)   \\\nX(Go,                  0x16)   \\\nX(Modula3,             0x17)   \\\nX(Haskell,             0x18)   \\\nX(CPlusPlus03,         0x19)   \\\nX(CPlusPlus11,         0x1a)   \\\nX(OCaml,               0x1b)   \\\nX(Rust,                0x1c)   \\\nX(C11,                 0x1d)   \\\nX(Swift,               0x1e)   \\\nX(Julia,               0x1f)   \\\nX(Dylan,               0x20)   \\\nX(CPlusPlus14,         0x21)   \\\nX(Fortran03,           0x22)   \\\nX(Fortran08,           0x23)   \\\nX(RenderScript,        0x24)   \\\nX(BLISS,               0x25)   \\\nX(MipsAssembler,       0x8001) \\\nX(GoogleRenderScript,  0x8E57) \\\nX(SunAssembler,        0x9001) \\\nX(BorlandDelphi,       0xB000)\n\ntypedef U32 DW_Language;\ntypedef enum DW_LanguageEnum\n{\n#define X(_N, _ID) DW_Language_##_N = _ID,\n  DW_Language_XList(X)\n#undef X\n  DW_Language_UserLo = 0x8000,\n  DW_Language_UserHi = 0xffff,\n} DW_LanguageEnum;\n\n#define DW_Inl_XList(X)    \\\nX(NotInlined,         0) \\\nX(Inlined,            1) \\\nX(DeclaredNotInlined, 2) \\\nX(DeclaredInlined,    3)\n\ntypedef U32 DW_InlKind;\ntypedef enum DW_InlKindEnum\n{\n#define X(_N,_ID) DW_Inl_##_N = _ID,\n  DW_Inl_XList(X)\n#undef X\n} DW_InlKindEnum;\n\n#define DW_StdOpcode_XList(X) \\\nX(ExtendedOpcode,   0x00)   \\\nX(Copy,             0x01)   \\\nX(AdvancePc,        0x02)   \\\nX(AdvanceLine,      0x03)   \\\nX(SetFile,          0x04)   \\\nX(SetColumn,        0x05)   \\\nX(NegateStmt,       0x06)   \\\nX(SetBasicBlock,    0x07)   \\\nX(ConstAddPc,       0x08)   \\\nX(FixedAdvancePc,   0x09)   \\\nX(SetPrologueEnd,   0x0A)   \\\nX(SetEpilogueBegin, 0x0B)   \\\nX(SetIsa,           0x0C)   \\\n\ntypedef enum DW_StdOpcode\n{\n#define X(_N,_ID) DW_StdOpcode_##_N = _ID,\n  DW_StdOpcode_XList(X)\n#undef X\n} DW_StdOpcode;\n\n#define DW_ExtOpcode_XList(X) \\\nX(Undefined,        0x00)   \\\nX(EndSequence,      0x01)   \\\nX(SetAddress,       0x02)   \\\nX(DefineFile,       0x03)   \\\nX(SetDiscriminator, 0x04)   \\\nX(UserLo,           0x80)   \\\nX(UserHi,           0xff)\n\ntypedef enum DW_ExtOpcode\n{\n#define X(_N,_ID) DW_ExtOpcode_##_N = _ID,\n  DW_ExtOpcode_XList(X)\n#undef X\n} DW_ExtOpcode;\n\n#define DW_IDCaseKind_XList(X) \\\nX(CaseSensitive,   0x00)     \\\nX(UpCase,          0x01)     \\\nX(DownCase,        0x02)     \\\nX(CaseInsensitive, 0x03)\n\ntypedef U64 DW_IDCaseKind;\ntypedef enum DW_IDCaseKindEnum\n{\n#define X(_N,_ID) DW_IDCase_##_N = _ID,\n  DW_IDCaseKind_XList(X)\n#undef X\n} DW_IDCaseKindEnum;\n\n#define DW_TagKind_V3_XList(X)        \\\nX(ArrayType,              0x01) \\\nX(ClassType,              0x02) \\\nX(EntryPoint,             0x03) \\\nX(EnumerationType,        0x04) \\\nX(FormalParameter,        0x05) \\\nX(ImportedDeclaration,    0x08) \\\nX(Label,                  0x0a) \\\nX(LexicalBlock,           0x0b) \\\nX(Member,                 0x0d) \\\nX(PointerType,            0x0f) \\\nX(ReferenceType,          0x10) \\\nX(CompileUnit,            0x11) \\\nX(StringType,             0x12) \\\nX(StructureType,          0x13) \\\nX(SubroutineType,         0x15) \\\nX(Typedef,                0x16) \\\nX(UnionType,              0x17) \\\nX(UnspecifiedParameters,  0x18) \\\nX(Variant,                0x19) \\\nX(CommonBlock,            0x1a) \\\nX(CommonInclusion,        0x1b) \\\nX(Inheritance,            0x1c) \\\nX(InlinedSubroutine,      0x1d) \\\nX(Module,                 0x1e) \\\nX(PtrToMemberType,        0x1f) \\\nX(SetType,                0x20) \\\nX(SubrangeType,           0x21) \\\nX(WithStmt,               0x22) \\\nX(AccessDeclaration,      0x23) \\\nX(BaseType,               0x24) \\\nX(CatchBlock,             0x25) \\\nX(ConstType,              0x26) \\\nX(Constant,               0x27) \\\nX(Enumerator,             0x28) \\\nX(FileType,               0x29) \\\nX(Friend,                 0x2a) \\\nX(NameList,               0x2b) \\\nX(NameListItem,           0x2c) \\\nX(PackedType,             0x2d) \\\nX(SubProgram,             0x2e) \\\nX(TemplateTypeParameter,  0x2f) \\\nX(TemplateValueParameter, 0x30) \\\nX(ThrownType,             0x31) \\\nX(TryBlock,               0x32) \\\nX(VariantPart,            0x33) \\\nX(Variable,               0x34) \\\nX(VolatileType,           0x35) \\\nX(DwarfProcedure,         0x36) \\\nX(RestrictType,           0x37) \\\nX(InterfaceType,          0x38) \\\nX(Namespace,              0x39) \\\nX(ImportedModule,         0x3a) \\\nX(UnspecifiedType,        0x3b) \\\nX(PartialUnit,            0x3c) \\\nX(ImportedUnit,           0x3d) \\\nX(Condition,              0x3f) \\\nX(SharedType,             0x40)\n\n#define DW_TagKind_V5_XList(X)     \\\nX(TypeUnit,            0x41) \\\nX(RValueReferenceType, 0x42) \\\nX(TemplateAlias,       0x43) \\\nX(CoarrayType,         0x44) \\\nX(GenericSubrange,     0x45) \\\nX(DynamicType,         0x46) \\\nX(AtomicType,          0x47) \\\nX(CallSite,            0x48) \\\nX(CallSiteParameter,   0x49) \\\nX(SkeletonUnit,        0x4A) \\\nX(ImmutableType,       0x4B)\n\n#define DW_TagKind_GNU_XList(X)        \\\nX(GNU_CallSite,          0x4109) \\\nX(GNU_CallSiteParameter, 0x410a)\n\ntypedef U64 DW_TagKind;\ntypedef enum DW_TagKindEnum\n{\n  DW_TagKind_Null,\n#define X(_N,_ID) DW_TagKind_##_N = _ID,\n  DW_TagKind_V3_XList(X)\n    DW_TagKind_V5_XList(X)\n    DW_TagKind_GNU_XList(X)\n#undef X\n  DW_TagKind_UserLo = 0x4080,\n  DW_TagKind_UserHi = 0xffff\n} DW_TagKindEnum;\n\n//- Attrib Class Encodings\n\n#define DW_AttribClass_V3_XList(X) \\\nX(Null,         0)               \\\nX(Undefined,    1)               \\\nX(Address,      2)               \\\nX(Block,        3)               \\\nX(Const,        4)               \\\nX(ExprLoc,      5)               \\\nX(Flag,         6)               \\\nX(LinePtr,      7)               \\\nX(LocListPtr,   8)               \\\nX(MacPtr,       9)               \\\nX(RngListPtr,   10)              \\\nX(Reference,    11)              \\\nX(String,       12)\n\n#define DW_AttribClass_V4_XList(X) \\\nX(LocList, 13)                   \\\nX(RngList, 14)\n\n#define DW_AttribClass_V5_XList(X) \\\nX(StrOffsetsPtr, 15)             \\\nX(AddrPtr,       16)\n\ntypedef U32 DW_AttribClass;\ntypedef enum DW_AttribClassEnum\n{\n#define X(_N,_ID) DW_AttribClass_##_N = (1 << _ID),\n  DW_AttribClass_V3_XList(X)\n    DW_AttribClass_V4_XList(X)\n    DW_AttribClass_V5_XList(X)\n#undef X\n} DW_AttribClassEnum;\n\n//- Form Encodings\n\n#define DW_Form_V2_XList(X) \\\nX(Addr,     0x1)          \\\nX(Block2,   0x3)          \\\nX(Block4,   0x4)          \\\nX(Data2,    0x5)          \\\nX(Data4,    0x6)          \\\nX(Data8,    0x7)          \\\nX(String,   0x8)          \\\nX(Block,    0x9)          \\\nX(Block1,   0xa)          \\\nX(Data1,    0xb)          \\\nX(Flag,     0xc)          \\\nX(SData,    0xd)          \\\nX(Strp,     0xe)          \\\nX(UData,    0xf)          \\\nX(RefAddr,  0x10)         \\\nX(Ref1,     0x11)         \\\nX(Ref2,     0x12)         \\\nX(Ref4,     0x13)         \\\nX(Ref8,     0x14)         \\\nX(RefUData, 0x15)         \\\nX(Indirect, 0x16)\n\n#define DW_Form_AttribClass_V2_XList(X)  \\\nX(Addr,     DW_AttribClass_Address)    \\\nX(Block2,   DW_AttribClass_Block)      \\\nX(Block4,   DW_AttribClass_Block)      \\\nX(Data2,    DW_AttribClass_Const)      \\\nX(Data4,    DW_AttribClass_Const)      \\\nX(Data8,    DW_AttribClass_Const)      \\\nX(String,   DW_AttribClass_String)     \\\nX(Block,    DW_AttribClass_Block)      \\\nX(Block1,   DW_AttribClass_Block)      \\\nX(Data1,    DW_AttribClass_Const)      \\\nX(Flag,     DW_AttribClass_Flag)       \\\nX(SData,    DW_AttribClass_Const)      \\\nX(Strp,     DW_AttribClass_String)     \\\nX(UData,    DW_AttribClass_Const)      \\\nX(RefAddr,  DW_AttribClass_Reference)  \\\nX(Ref1,     DW_AttribClass_Reference)  \\\nX(Ref2,     DW_AttribClass_Reference)  \\\nX(Ref4,     DW_AttribClass_Reference)  \\\nX(Ref8,     DW_AttribClass_Reference)  \\\nX(RefUData, DW_AttribClass_Reference)  \\\nX(Indirect, DW_AttribClass_Null)\n\n#define DW_Form_V4_XList(X) \\\nX(SecOffset,   0x17)      \\\nX(ExprLoc,     0x18)      \\\nX(FlagPresent, 0x19)      \\\nX(RefSig8,     0x20)\n\n#define DW_Form_AttribClass_V4_XList(X)     \\\nX(Addr,        DW_AttribClass_Address)    \\\nX(Block2,      DW_AttribClass_Block)      \\\nX(Block4,      DW_AttribClass_Block)      \\\nX(Data2,       DW_AttribClass_Const)      \\\nX(Data4,       DW_AttribClass_Const)      \\\nX(Data8,       DW_AttribClass_Const)      \\\nX(String,      DW_AttribClass_String)     \\\nX(Block,       DW_AttribClass_Block)      \\\nX(Block1,      DW_AttribClass_Block)      \\\nX(Data1,       DW_AttribClass_Const)      \\\nX(Flag,        DW_AttribClass_Flag)       \\\nX(SData,       DW_AttribClass_Const)      \\\nX(Strp,        DW_AttribClass_String)     \\\nX(UData,       DW_AttribClass_Const)      \\\nX(RefAddr,     DW_AttribClass_Reference)  \\\nX(Ref1,        DW_AttribClass_Reference)  \\\nX(Ref2,        DW_AttribClass_Reference)  \\\nX(Ref4,        DW_AttribClass_Reference)  \\\nX(Ref8,        DW_AttribClass_Reference)  \\\nX(RefUData,    DW_AttribClass_Reference)  \\\nX(Indirect,    DW_AttribClass_Null)       \\\nX(SecOffset,   DW_AttribClass_LinePtr|DW_AttribClass_LocListPtr|DW_AttribClass_MacPtr|DW_AttribClass_RngListPtr) \\\nX(ExprLoc,     DW_AttribClass_ExprLoc)    \\\nX(FlagPresent, DW_AttribClass_Flag)       \\\nX(RefSig8,     DW_AttribClass_Reference)\n\n#define DW_Form_V5_XList(X) \\\nX(Strx,          0x1a)    \\\nX(Addrx,         0x1b)    \\\nX(RefSup4,       0x1c)    \\\nX(StrpSup,       0x1d)    \\\nX(Data16,        0x1e)    \\\nX(LineStrp,      0x1f)    \\\nX(ImplicitConst, 0x21)    \\\nX(LocListx,      0x22)    \\\nX(RngListx,      0x23)    \\\nX(RefSup8,       0x24)    \\\nX(Strx1,         0x25)    \\\nX(Strx2,         0x26)    \\\nX(Strx3,         0x27)    \\\nX(Strx4,         0x28)    \\\nX(Addrx1,        0x29)    \\\nX(Addrx2,        0x2a)    \\\nX(Addrx3,        0x2b)    \\\nX(Addrx4,        0x2c)\n\n#define DW_Form_AttribClass_V5_XList(X)          \\\nX(Addr,          DW_AttribClass_Address)       \\\nX(Block2,        DW_AttribClass_Block)         \\\nX(Block4,        DW_AttribClass_Block)         \\\nX(Data2,         DW_AttribClass_Const)         \\\nX(Data4,         DW_AttribClass_Const)         \\\nX(Data8,         DW_AttribClass_Const)         \\\nX(String,        DW_AttribClass_String)        \\\nX(Block,         DW_AttribClass_Block)         \\\nX(Block1,        DW_AttribClass_Block)         \\\nX(Data1,         DW_AttribClass_Const)         \\\nX(Flag,          DW_AttribClass_Flag)          \\\nX(SData,         DW_AttribClass_Const)         \\\nX(Strp,          DW_AttribClass_String)        \\\nX(UData,         DW_AttribClass_Const)         \\\nX(RefAddr,       DW_AttribClass_Reference)     \\\nX(Ref1,          DW_AttribClass_Reference)     \\\nX(Ref2,          DW_AttribClass_Reference)     \\\nX(Ref4,          DW_AttribClass_Reference)     \\\nX(Ref8,          DW_AttribClass_Reference)     \\\nX(RefUData,      DW_AttribClass_Reference)     \\\nX(Indirect,      DW_AttribClass_Null)          \\\nX(SecOffset,     DW_AttribClass_AddrPtr|       \\\nDW_AttribClass_LinePtr|       \\\nDW_AttribClass_LocList|       \\\nDW_AttribClass_LocListPtr|    \\\nDW_AttribClass_MacPtr|        \\\nDW_AttribClass_RngList|       \\\nDW_AttribClass_RngListPtr|    \\\nDW_AttribClass_StrOffsetsPtr) \\\nX(ExprLoc,       DW_AttribClass_ExprLoc)       \\\nX(FlagPresent,   DW_AttribClass_Flag)          \\\nX(RefSig8,       DW_AttribClass_Reference)     \\\nX(Strx,          DW_AttribClass_String)        \\\nX(Addrx,         DW_AttribClass_Address)       \\\nX(RefSup4,       DW_AttribClass_Reference)     \\\nX(StrpSup,       DW_AttribClass_String)        \\\nX(Data16,        DW_AttribClass_Const)         \\\nX(LineStrp,      DW_AttribClass_String)        \\\nX(ImplicitConst, DW_AttribClass_Const)         \\\nX(LocListx,      DW_AttribClass_LocListPtr)    \\\nX(RngListx,      DW_AttribClass_RngList)    \\\nX(RefSup8,       DW_AttribClass_Reference)     \\\nX(Strx1,         DW_AttribClass_String)        \\\nX(Strx2,         DW_AttribClass_String)        \\\nX(Strx3,         DW_AttribClass_String)        \\\nX(Strx4,         DW_AttribClass_String)        \\\nX(Addrx1,        DW_AttribClass_Address)       \\\nX(Addrx2,        DW_AttribClass_Address)       \\\nX(Addrx3,        DW_AttribClass_Address)       \\\nX(Addrx4,        DW_AttribClass_Address)\n\n#define DW_Form_GNU_XList(X) \\\nX(GNU_AddrIndex, 0x1f01)   \\\nX(GNU_StrIndex,  0x1f02)   \\\nX(GNU_RefAlt,    0x1f20)   \\\nX(GNU_StrpAlt,   0x1f21)\n\n#define DW_Form_AttribClass_GNU_XList(X)     \\\nX(GNU_AddrIndex, DW_AttribClass_Undefined) \\\nX(GNU_StrIndex,  DW_AttribClass_Undefined) \\\nX(GNU_RefAlt,    DW_AttribClass_Undefined) \\\nX(GNU_StrpAlt,   DW_AttribClass_String)\n\ntypedef U64 DW_FormKind;\ntypedef enum DW_FormEnum\n{\n  DW_Form_Null,\n#define X(_N, _ID) DW_Form_##_N = _ID,\n  DW_Form_V2_XList(X)\n    DW_Form_V4_XList(X)\n    DW_Form_V5_XList(X)\n    DW_Form_GNU_XList(X)\n#undef X\n} DW_FormEnum;\n\n//- Attributes DWARF2\n\n#define DW_AttribKind_V2_XList(X) \\\nX(Sibling,            0x1)      \\\nX(Location,           0x2)      \\\nX(Name,               0x3)      \\\nX(Ordering,           0x9)      \\\nX(ByteSize,           0xB)      \\\nX(BitOffset,          0xC)      \\\nX(BitSize,            0xD)      \\\nX(StmtList,           0x10)     \\\nX(LowPc,              0x11)     \\\nX(HighPc,             0x12)     \\\nX(Language,           0x13)     \\\nX(Discr,              0x15)     \\\nX(DiscrValue,         0x16)     \\\nX(Visibility,         0x17)     \\\nX(Import,             0x18)     \\\nX(StringLength,       0x19)     \\\nX(CommonReference,    0x1a)     \\\nX(CompDir,            0x1b)     \\\nX(ConstValue,         0x1c)     \\\nX(ContainingType,     0x1d)     \\\nX(DefaultValue,       0x1e)     \\\nX(Inline,             0x20)     \\\nX(IsOptional,         0x21)     \\\nX(LowerBound,         0x22)     \\\nX(Producer,           0x25)     \\\nX(Prototyped,         0x27)     \\\nX(ReturnAddr,         0x2a)     \\\nX(StartScope,         0x2c)     \\\nX(BitStride,          0x2e)     \\\nX(UpperBound,         0x2f)     \\\nX(AbstractOrigin,     0x31)     \\\nX(Accessibility,      0x32)     \\\nX(AddressClass,       0x33)     \\\nX(Artificial,         0x34)     \\\nX(BaseTypes,          0x35)     \\\nX(CallingConvention,  0x36)     \\\nX(Count,              0x37)     \\\nX(DataMemberLocation, 0x38)     \\\nX(DeclColumn,         0x39)     \\\nX(DeclFile,           0x3a)     \\\nX(DeclLine,           0x3b)     \\\nX(Declaration,        0x3c)     \\\nX(DiscrList,          0x3d)     \\\nX(Encoding,           0x3e)     \\\nX(External,           0x3f)     \\\nX(FrameBase,          0x40)     \\\nX(Friend,             0x41)     \\\nX(IdentifierCase,     0x42)     \\\nX(MacroInfo,          0x43)     \\\nX(NameListItem,       0x44)     \\\nX(Priority,           0x45)     \\\nX(Segment,            0x46)     \\\nX(Specification,      0x47)     \\\nX(StaticLink,         0x48)     \\\nX(Type,               0x49)     \\\nX(UseLocation,        0x4a)     \\\nX(VariableParameter,  0x4b)     \\\nX(Virtuality,         0x4c)     \\\nX(VTableElemLocation, 0x4d)\n\n#define DW_AttribKind_ClassFlags_V2_XList(X)                                             \\\nX(Sibling,            DW_AttribClass_Reference)                                        \\\nX(Location,           DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                \\\nX(Name,               DW_AttribClass_String)                                           \\\nX(Ordering,           DW_AttribClass_Const)                                            \\\nX(ByteSize,           DW_AttribClass_Const)                                            \\\nX(BitOffset,          DW_AttribClass_Const)                                            \\\nX(BitSize,            DW_AttribClass_Const)                                            \\\nX(StmtList,           DW_AttribClass_Const)                                            \\\nX(LowPc,              DW_AttribClass_Address)                                          \\\nX(HighPc,             DW_AttribClass_Address)                                          \\\nX(Language,           DW_AttribClass_Const)                                            \\\nX(Discr,              DW_AttribClass_Reference)                                        \\\nX(DiscrValue,         DW_AttribClass_Const)                                            \\\nX(Visibility,         DW_AttribClass_Const)                                            \\\nX(Import,             DW_AttribClass_Reference)                                        \\\nX(StringLength,       DW_AttribClass_Block|DW_AttribClass_Const)                       \\\nX(CommonReference,    DW_AttribClass_Reference)                                        \\\nX(CompDir,            DW_AttribClass_String)                                           \\\nX(ConstValue,         DW_AttribClass_String|DW_AttribClass_Const|DW_AttribClass_Block) \\\nX(ContainingType,     DW_AttribClass_Reference)                                        \\\nX(DefaultValue,       DW_AttribClass_Reference)                                        \\\nX(Inline,             DW_AttribClass_Const)                                            \\\nX(IsOptional,         DW_AttribClass_Flag)                                             \\\nX(LowerBound,         DW_AttribClass_Const|DW_AttribClass_Reference)                   \\\nX(Producer,           DW_AttribClass_String)                                           \\\nX(Prototyped,         DW_AttribClass_Flag)                                             \\\nX(ReturnAddr,         DW_AttribClass_Block|DW_AttribClass_Const)                       \\\nX(StartScope,         DW_AttribClass_Const)                                            \\\nX(BitStride,          DW_AttribClass_Const) /* dwarf-v1 DW_AttribKind_stride_size*/        \\\nX(UpperBound,         DW_AttribClass_Const|DW_AttribClass_Reference)                   \\\nX(AbstractOrigin,     DW_AttribClass_Reference)                                        \\\nX(Accessibility,      DW_AttribClass_Const)                                            \\\nX(AddressClass,       DW_AttribClass_Const)                                            \\\nX(Artificial,         DW_AttribClass_Flag)                                             \\\nX(BaseTypes,          DW_AttribClass_Reference)                                        \\\nX(CallingConvention,  DW_AttribClass_Const)                                            \\\nX(Count,              DW_AttribClass_Const|DW_AttribClass_Reference)                   \\\nX(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Reference)                   \\\nX(DeclColumn,         DW_AttribClass_Const)                                            \\\nX(DeclFile,           DW_AttribClass_Const)                                            \\\nX(DeclLine,           DW_AttribClass_Const)                                            \\\nX(Declaration,        DW_AttribClass_Flag)                                             \\\nX(DiscrList,          DW_AttribClass_Block)                                            \\\nX(Encoding,           DW_AttribClass_Const)                                            \\\nX(External,           DW_AttribClass_Flag)                                             \\\nX(FrameBase,          DW_AttribClass_Block|DW_AttribClass_Const)                       \\\nX(Friend,             DW_AttribClass_Reference)                                        \\\nX(IdentifierCase,     DW_AttribClass_Const)                                            \\\nX(MacroInfo,          DW_AttribClass_Const)                                            \\\nX(NameListItem,       DW_AttribClass_Block)                                            \\\nX(Priority,           DW_AttribClass_Reference)                                        \\\nX(Segment,            DW_AttribClass_Block|DW_AttribClass_Const)                       \\\nX(Specification,      DW_AttribClass_Reference)                                        \\\nX(StaticLink,         DW_AttribClass_Block|DW_AttribClass_Const)                       \\\nX(Type,               DW_AttribClass_Reference)                                        \\\nX(UseLocation,        DW_AttribClass_Block|DW_AttribClass_Const)                       \\\nX(VariableParameter,  DW_AttribClass_Flag)                                             \\\nX(Virtuality,         DW_AttribClass_Const)                                            \\\nX(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_Reference)\n\n//- Attributes DWARF3\n\n#define DW_AttribKind_V3_XList(X) \\\nX(Allocated,          0x4e)     \\\nX(Associated,         0x4f)     \\\nX(DataLocation,       0x50)     \\\nX(ByteStride,         0x51)     \\\nX(EntryPc,            0x52)     \\\nX(UseUtf8,            0x53)     \\\nX(Extension,          0x54)     \\\nX(Ranges,             0x55)     \\\nX(Trampoline,         0x56)     \\\nX(CallColumn,         0x57)     \\\nX(CallFile,           0x58)     \\\nX(CallLine,           0x59)     \\\nX(Description,        0x5a)     \\\nX(BinaryScale,        0x5b)     \\\nX(DecimalScale,       0x5c)     \\\nX(Small,              0x5d)     \\\nX(DecimalSign,        0x5e)     \\\nX(DigitCount,         0x5f)     \\\nX(PictureString,      0x60)     \\\nX(Mutable,            0x61)     \\\nX(ThreadsScaled,      0x62)     \\\nX(Explicit,           0x63)     \\\nX(ObjectPointer,      0x64)     \\\nX(Endianity,          0x65)     \\\nX(Elemental,          0x66)     \\\nX(Pure,               0x67)     \\\nX(Recursive,          0x68)\n\n#define DW_AttribKind_ClassFlags_V3_XList(X)                                                                       \\\nX(Sibling,            DW_AttribClass_Reference)                                                                  \\\nX(Location,           DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(Name,               DW_AttribClass_String)                                                                     \\\nX(Ordering,           DW_AttribClass_Const)                                                                      \\\nX(ByteSize,           DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(BitOffset,          DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(BitSize,            DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(StmtList,           DW_AttribClass_LinePtr)                                                                    \\\nX(LowPc,              DW_AttribClass_Address)                                                                    \\\nX(HighPc,             DW_AttribClass_Address)                                                                    \\\nX(Language,           DW_AttribClass_Const)                                                                      \\\nX(Discr,              DW_AttribClass_Reference)                                                                  \\\nX(DiscrValue,         DW_AttribClass_Const)                                                                      \\\nX(Visibility,         DW_AttribClass_Const)                                                                      \\\nX(Import,             DW_AttribClass_Reference)                                                                  \\\nX(StringLength,       DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(CommonReference,    DW_AttribClass_Reference)                                                                  \\\nX(CompDir,            DW_AttribClass_String)                                                                     \\\nX(ConstValue,         DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String)                           \\\nX(ContainingType,     DW_AttribClass_Reference)                                                                  \\\nX(DefaultValue,       DW_AttribClass_Reference)                                                                  \\\nX(Inline,             DW_AttribClass_Const)                                                                      \\\nX(IsOptional,         DW_AttribClass_Flag)                                                                       \\\nX(LowerBound,         DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(Producer,           DW_AttribClass_String)                                                                     \\\nX(Prototyped,         DW_AttribClass_Flag)                                                                       \\\nX(ReturnAddr,         DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(StartScope,         DW_AttribClass_Const)                                                                      \\\nX(BitStride,          DW_AttribClass_Const)                                                                      \\\nX(UpperBound,         DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(AbstractOrigin,     DW_AttribClass_Reference)                                                                  \\\nX(Accessibility,      DW_AttribClass_Const)                                                                      \\\nX(AddressClass,       DW_AttribClass_Const)                                                                      \\\nX(Artificial,         DW_AttribClass_Flag)                                                                       \\\nX(BaseTypes,          DW_AttribClass_Reference)                                                                  \\\nX(CallingConvention,  DW_AttribClass_Const)                                                                      \\\nX(Count,              DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(DataMemberLocation, DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_LocListPtr)                       \\\nX(DeclColumn,         DW_AttribClass_Const)                                                                      \\\nX(DeclFile,           DW_AttribClass_Const)                                                                      \\\nX(DeclLine,           DW_AttribClass_Const)                                                                      \\\nX(Declaration,        DW_AttribClass_Flag)                                                                       \\\nX(DiscrList,          DW_AttribClass_Block)                                                                      \\\nX(Encoding,           DW_AttribClass_Const)                                                                      \\\nX(External,           DW_AttribClass_Flag)                                                                       \\\nX(FrameBase,          DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(Friend,             DW_AttribClass_Reference)                                                                  \\\nX(IdentifierCase,     DW_AttribClass_Const)                                                                      \\\nX(MacroInfo,          DW_AttribClass_MacPtr)                                                                     \\\nX(NameListItem,       DW_AttribClass_Block)                                                                      \\\nX(Priority,           DW_AttribClass_Reference)                                                                  \\\nX(Segment,            DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(Specification,      DW_AttribClass_Reference)                                                                  \\\nX(StaticLink,         DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(Type,               DW_AttribClass_Reference)                                                                  \\\nX(UseLocation,        DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(VariableParameter,  DW_AttribClass_Flag)                                                                       \\\nX(Virtuality,         DW_AttribClass_Const)                                                                      \\\nX(VTableElemLocation, DW_AttribClass_Block|DW_AttribClass_LocListPtr)                                            \\\nX(Allocated,          DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(Associated,         DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(DataLocation,       DW_AttribClass_Block)                                                                      \\\nX(ByteStride,         DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_Reference)                        \\\nX(EntryPc,            DW_AttribClass_Address)                                                                    \\\nX(UseUtf8,            DW_AttribClass_Flag)                                                                       \\\nX(Extension,          DW_AttribClass_Reference)                                                                  \\\nX(Ranges,             DW_AttribClass_RngListPtr)                                                                 \\\nX(Trampoline,         DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \\\nX(CallColumn,         DW_AttribClass_Const)                                                                      \\\nX(CallFile,           DW_AttribClass_Const)                                                                      \\\nX(CallLine,           DW_AttribClass_Const)                                                                      \\\nX(Description,        DW_AttribClass_String)                                                                     \\\nX(BinaryScale,        DW_AttribClass_Const)                                                                      \\\nX(DecimalScale,       DW_AttribClass_Const)                                                                      \\\nX(Small,              DW_AttribClass_Reference)                                                                  \\\nX(DecimalSign,        DW_AttribClass_Const)                                                                      \\\nX(DigitCount,         DW_AttribClass_Const)                                                                      \\\nX(PictureString,      DW_AttribClass_String)                                                                     \\\nX(Mutable,            DW_AttribClass_Flag)                                                                       \\\nX(ThreadsScaled,      DW_AttribClass_Flag)                                                                       \\\nX(Explicit,           DW_AttribClass_Flag)                                                                       \\\nX(ObjectPointer,      DW_AttribClass_Reference)                                                                  \\\nX(Endianity,          DW_AttribClass_Const)                                                                      \\\nX(Elemental,          DW_AttribClass_Flag)                                                                       \\\nX(Pure,               DW_AttribClass_Flag)                                                                       \\\nX(Recursive,          DW_AttribClass_Flag)\n\n//- Attributes DWARF4\n\n#define DW_AttribKind_V4_XList(X) \\\nX(Signature,      0x69)         \\\nX(MainSubProgram, 0x6a)         \\\nX(DataBitOffset,  0x6b)         \\\nX(ConstExpr,      0x6c)         \\\nX(EnumClass,      0x6d)         \\\nX(LinkageName,    0x6e)\n\n#define DW_AttribKind_ClassFlags_V4_XList(X)                                                                       \\\nX(Sibling,            DW_AttribClass_Reference)                                                                  \\\nX(Location,           DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(Name,               DW_AttribClass_String)                                                                     \\\nX(Ordering,           DW_AttribClass_Const)                                                                      \\\nX(ByteSize,           DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(BitOffset,          DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(BitSize,            DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(StmtList,           DW_AttribClass_LinePtr)                                                                    \\\nX(LowPc,              DW_AttribClass_Address)                                                                    \\\nX(HighPc,             DW_AttribClass_Address|DW_AttribClass_Const)                                               \\\nX(Language,           DW_AttribClass_Const)                                                                      \\\nX(Discr,              DW_AttribClass_Reference)                                                                  \\\nX(DiscrValue,         DW_AttribClass_Const)                                                                      \\\nX(Visibility,         DW_AttribClass_Const)                                                                      \\\nX(Import,             DW_AttribClass_Reference)                                                                  \\\nX(StringLength,       DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(CommonReference,    DW_AttribClass_Reference)                                                                  \\\nX(CompDir,            DW_AttribClass_String)                                                                     \\\nX(ConstValue,         DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String)                           \\\nX(ContainingType,     DW_AttribClass_Reference)                                                                  \\\nX(DefaultValue,       DW_AttribClass_Reference)                                                                  \\\nX(Inline,             DW_AttribClass_Const)                                                                      \\\nX(IsOptional,         DW_AttribClass_Flag)                                                                       \\\nX(LowerBound,         DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(Producer,           DW_AttribClass_String)                                                                     \\\nX(Prototyped,         DW_AttribClass_Flag)                                                                       \\\nX(ReturnAddr,         DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(StartScope,         DW_AttribClass_Const|DW_AttribClass_RngListPtr)                                            \\\nX(BitStride,          DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(UpperBound,         DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(AbstractOrigin,     DW_AttribClass_Reference)                                                                  \\\nX(Accessibility,      DW_AttribClass_Const)                                                                      \\\nX(AddressClass,       DW_AttribClass_Const)                                                                      \\\nX(Artificial,         DW_AttribClass_Flag)                                                                       \\\nX(BaseTypes,          DW_AttribClass_Reference)                                                                  \\\nX(CallingConvention,  DW_AttribClass_Const)                                                                      \\\nX(Count,              DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(DataMemberLocation, DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                     \\\nX(DeclColumn,         DW_AttribClass_Const)                                                                      \\\nX(DeclFile,           DW_AttribClass_Const)                                                                      \\\nX(DeclLine,           DW_AttribClass_Const)                                                                      \\\nX(Declaration,        DW_AttribClass_Flag)                                                                       \\\nX(DiscrList,          DW_AttribClass_Block)                                                                      \\\nX(Encoding,           DW_AttribClass_Const)                                                                      \\\nX(External,           DW_AttribClass_Flag)                                                                       \\\nX(FrameBase,          DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(Friend,             DW_AttribClass_Reference)                                                                  \\\nX(IdentifierCase,     DW_AttribClass_Const)                                                                      \\\nX(MacroInfo,          DW_AttribClass_MacPtr)                                                                     \\\nX(NameListItem,       DW_AttribClass_Reference)                                                                  \\\nX(Priority,           DW_AttribClass_Reference)                                                                  \\\nX(Segment,            DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(Specification,      DW_AttribClass_Reference)                                                                  \\\nX(StaticLink,         DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(Type,               DW_AttribClass_Reference)                                                                  \\\nX(UseLocation,        DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(VariableParameter,  DW_AttribClass_Flag)                                                                       \\\nX(Virtuality,         DW_AttribClass_Const)                                                                      \\\nX(VTableElemLocation, DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(Allocated,          DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(Associated,         DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(DataLocation,       DW_AttribClass_ExprLoc)                                                                    \\\nX(ByteStride,         DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(EntryPc,            DW_AttribClass_Address)                                                                    \\\nX(UseUtf8,            DW_AttribClass_Flag)                                                                       \\\nX(Extension,          DW_AttribClass_Reference)                                                                  \\\nX(Ranges,             DW_AttribClass_RngListPtr)                                                                 \\\nX(Trampoline,         DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \\\nX(CallColumn,         DW_AttribClass_Const)                                                                      \\\nX(CallFile,           DW_AttribClass_Const)                                                                      \\\nX(CallLine,           DW_AttribClass_Const)                                                                      \\\nX(Description,        DW_AttribClass_String)                                                                     \\\nX(BinaryScale,        DW_AttribClass_Const)                                                                      \\\nX(DecimalScale,       DW_AttribClass_Const)                                                                      \\\nX(Small,              DW_AttribClass_Reference)                                                                  \\\nX(DecimalSign,        DW_AttribClass_Const)                                                                      \\\nX(DigitCount,         DW_AttribClass_Const)                                                                      \\\nX(PictureString,      DW_AttribClass_String)                                                                     \\\nX(Mutable,            DW_AttribClass_Flag)                                                                       \\\nX(ThreadsScaled,      DW_AttribClass_Flag)                                                                       \\\nX(Explicit,           DW_AttribClass_Flag)                                                                       \\\nX(ObjectPointer,      DW_AttribClass_Reference)                                                                  \\\nX(Endianity,          DW_AttribClass_Const)                                                                      \\\nX(Elemental,          DW_AttribClass_Flag)                                                                       \\\nX(Pure,               DW_AttribClass_Flag)                                                                       \\\nX(Recursive,          DW_AttribClass_Flag)                                                                       \\\nX(Signature,          DW_AttribClass_Reference)                                                                  \\\nX(MainSubProgram,     DW_AttribClass_Flag)                                                                       \\\nX(DataBitOffset,      DW_AttribClass_Const)                                                                      \\\nX(ConstExpr,          DW_AttribClass_Flag)                                                                       \\\nX(EnumClass,          DW_AttribClass_Flag)                                                                       \\\nX(LinkageName,        DW_AttribClass_String)\n\n//- Attributes DWARF5\n\n#define DW_AttribKind_V5_XList(X) \\\nX(StringLengthBitSize,  0x6f)   \\\nX(StringLengthByteSize, 0x70)   \\\nX(Rank,                 0x71)   \\\nX(StrOffsetsBase,       0x72)   \\\nX(AddrBase,             0x73)   \\\nX(RngListsBase,         0x74)   \\\nX(DwoName,              0x76)   \\\nX(Reference,            0x77)   \\\nX(RValueReference,      0x78)   \\\nX(Macros,               0x79)   \\\nX(CallAllCalls,         0x7a)   \\\nX(CallAllSourceCalls,   0x7b)   \\\nX(CallAllTailCalls,     0x7c)   \\\nX(CallReturnPc,         0x7d)   \\\nX(CallValue,            0x7e)   \\\nX(CallOrigin,           0x7f)   \\\nX(CallParameter,        0x80)   \\\nX(CallPc,               0x81)   \\\nX(CallTailCall,         0x82)   \\\nX(CallTarget,           0x83)   \\\nX(CallTargetClobbered,  0x84)   \\\nX(CallDataLocation,     0x85)   \\\nX(CallDataValue,        0x86)   \\\nX(NoReturn,             0x87)   \\\nX(Alignment,            0x88)   \\\nX(ExportSymbols,        0x89)   \\\nX(Deleted,              0x8a)   \\\nX(Defaulted,            0x8b)   \\\nX(LocListsBase,         0x8c)\n\n#define DW_AttribKind_ClassFlags_V5_XList(X)                                                                         \\\nX(Sibling,              DW_AttribClass_Reference)                                                                  \\\nX(Location,             DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(Name,                 DW_AttribClass_String)                                                                     \\\nX(Ordering,             DW_AttribClass_Const)                                                                      \\\nX(ByteSize,             DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(BitOffset,            DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(BitSize,              DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(StmtList,             DW_AttribClass_LinePtr)                                                                    \\\nX(LowPc,                DW_AttribClass_Address)                                                                    \\\nX(HighPc,               DW_AttribClass_Address|DW_AttribClass_Const)                                               \\\nX(Language,             DW_AttribClass_Const)                                                                      \\\nX(Discr,                DW_AttribClass_Reference)                                                                  \\\nX(DiscrValue,           DW_AttribClass_Const)                                                                      \\\nX(Visibility,           DW_AttribClass_Const)                                                                      \\\nX(Import,               DW_AttribClass_Reference)                                                                  \\\nX(StringLength,         DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(CommonReference,      DW_AttribClass_Reference)                                                                  \\\nX(CompDir,              DW_AttribClass_String)                                                                     \\\nX(ConstValue,           DW_AttribClass_Block|DW_AttribClass_Const|DW_AttribClass_String)                           \\\nX(ContainingType,       DW_AttribClass_Reference)                                                                  \\\nX(DefaultValue,         DW_AttribClass_Reference)                                                                  \\\nX(Inline,               DW_AttribClass_Const)                                                                      \\\nX(IsOptional,           DW_AttribClass_Flag)                                                                       \\\nX(LowerBound,           DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(Producer,             DW_AttribClass_String)                                                                     \\\nX(Prototyped,           DW_AttribClass_Flag)                                                                       \\\nX(ReturnAddr,           DW_AttribClass_ExprLoc|DW_AttribClass_LocListPtr)                                          \\\nX(StartScope,           DW_AttribClass_Const|DW_AttribClass_RngListPtr)                                            \\\nX(BitStride,            DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(UpperBound,           DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(AbstractOrigin,       DW_AttribClass_Reference)                                                                  \\\nX(Accessibility,        DW_AttribClass_Const)                                                                      \\\nX(AddressClass,         DW_AttribClass_Const)                                                                      \\\nX(Artificial,           DW_AttribClass_Flag)                                                                       \\\nX(BaseTypes,            DW_AttribClass_Reference)                                                                  \\\nX(CallingConvention,    DW_AttribClass_Const)                                                                      \\\nX(Count,                DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(DataMemberLocation,   DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_LocList)                        \\\nX(DeclColumn,           DW_AttribClass_Const)                                                                      \\\nX(DeclFile,             DW_AttribClass_Const)                                                                      \\\nX(DeclLine,             DW_AttribClass_Const)                                                                      \\\nX(Declaration,          DW_AttribClass_Flag)                                                                       \\\nX(DiscrList,            DW_AttribClass_Block)                                                                      \\\nX(Encoding,             DW_AttribClass_Const)                                                                      \\\nX(External,             DW_AttribClass_Flag)                                                                       \\\nX(FrameBase,            DW_AttribClass_ExprLoc|DW_AttribClass_LocList)                                             \\\nX(Friend,               DW_AttribClass_Reference)                                                                  \\\nX(IdentifierCase,       DW_AttribClass_Const)                                                                      \\\nX(MacroInfo,            DW_AttribClass_MacPtr)                                                                     \\\nX(NameListItem,         DW_AttribClass_Reference)                                                                  \\\nX(Priority,             DW_AttribClass_Reference)                                                                  \\\nX(Segment,              DW_AttribClass_ExprLoc|DW_AttribClass_LocList)                                             \\\nX(Specification,        DW_AttribClass_Reference)                                                                  \\\nX(StaticLink,           DW_AttribClass_ExprLoc|DW_AttribClass_LocList)                                             \\\nX(Type,                 DW_AttribClass_Reference)                                                                  \\\nX(UseLocation,          DW_AttribClass_ExprLoc|DW_AttribClass_LocList)                                             \\\nX(VariableParameter,    DW_AttribClass_Flag)                                                                       \\\nX(Virtuality,           DW_AttribClass_Const)                                                                      \\\nX(VTableElemLocation,   DW_AttribClass_ExprLoc|DW_AttribClass_LocList)                                             \\\nX(Allocated,            DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(Associated,           DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(DataLocation,         DW_AttribClass_ExprLoc)                                                                    \\\nX(ByteStride,           DW_AttribClass_Const|DW_AttribClass_ExprLoc|DW_AttribClass_Reference)                      \\\nX(EntryPc,              DW_AttribClass_Address|DW_AttribClass_Const)                                               \\\nX(UseUtf8,              DW_AttribClass_Flag)                                                                       \\\nX(Extension,            DW_AttribClass_Reference)                                                                  \\\nX(Ranges,               DW_AttribClass_RngList)                                                                    \\\nX(Trampoline,           DW_AttribClass_Address|DW_AttribClass_Flag|DW_AttribClass_Reference|DW_AttribClass_String) \\\nX(CallColumn,           DW_AttribClass_Const)                                                                      \\\nX(CallFile,             DW_AttribClass_Const)                                                                      \\\nX(CallLine,             DW_AttribClass_Const)                                                                      \\\nX(Description,          DW_AttribClass_String)                                                                     \\\nX(BinaryScale,          DW_AttribClass_Const)                                                                      \\\nX(DecimalScale,         DW_AttribClass_Const)                                                                      \\\nX(Small,                DW_AttribClass_Reference)                                                                  \\\nX(DecimalSign,          DW_AttribClass_Const)                                                                      \\\nX(DigitCount,           DW_AttribClass_Const)                                                                      \\\nX(PictureString,        DW_AttribClass_String)                                                                     \\\nX(Mutable,              DW_AttribClass_Flag)                                                                       \\\nX(ThreadsScaled,        DW_AttribClass_Flag)                                                                       \\\nX(Explicit,             DW_AttribClass_Flag)                                                                       \\\nX(ObjectPointer,        DW_AttribClass_Reference)                                                                  \\\nX(Endianity,            DW_AttribClass_Const)                                                                      \\\nX(Elemental,            DW_AttribClass_Flag)                                                                       \\\nX(Pure,                 DW_AttribClass_Flag)                                                                       \\\nX(Recursive,            DW_AttribClass_Flag)                                                                       \\\nX(Signature,            DW_AttribClass_Reference)                                                                  \\\nX(MainSubProgram,       DW_AttribClass_Flag)                                                                       \\\nX(DataBitOffset,        DW_AttribClass_Const)                                                                      \\\nX(ConstExpr,            DW_AttribClass_Flag)                                                                       \\\nX(EnumClass,            DW_AttribClass_Flag)                                                                       \\\nX(LinkageName,          DW_AttribClass_String)                                                                     \\\nX(StringLengthBitSize,  DW_AttribClass_Const)                                                                      \\\nX(StringLengthByteSize, DW_AttribClass_Const)                                                                      \\\nX(Rank,                 DW_AttribClass_Const|DW_AttribClass_ExprLoc)                                               \\\nX(StrOffsetsBase,       DW_AttribClass_StrOffsetsPtr)                                                              \\\nX(AddrBase,             DW_AttribClass_AddrPtr)                                                                    \\\nX(RngListsBase,         DW_AttribClass_RngListPtr)                                                                 \\\nX(DwoName,              DW_AttribClass_String)                                                                     \\\nX(Reference,            DW_AttribClass_Flag)                                                                       \\\nX(RValueReference,      DW_AttribClass_Flag)                                                                       \\\nX(Macros,               DW_AttribClass_MacPtr)                                                                     \\\nX(CallAllCalls,         DW_AttribClass_Flag)                                                                       \\\nX(CallAllSourceCalls,   DW_AttribClass_Flag)                                                                       \\\nX(CallAllTailCalls,     DW_AttribClass_Flag)                                                                       \\\nX(CallReturnPc,         DW_AttribClass_Address)                                                                    \\\nX(CallValue,            DW_AttribClass_ExprLoc)                                                                    \\\nX(CallOrigin,           DW_AttribClass_ExprLoc)                                                                    \\\nX(CallParameter,        DW_AttribClass_Reference)                                                                  \\\nX(CallPc,               DW_AttribClass_Address)                                                                    \\\nX(CallTailCall,         DW_AttribClass_Flag)                                                                       \\\nX(CallTarget,           DW_AttribClass_ExprLoc)                                                                    \\\nX(CallTargetClobbered,  DW_AttribClass_ExprLoc)                                                                    \\\nX(CallDataLocation,     DW_AttribClass_ExprLoc)                                                                    \\\nX(CallDataValue,        DW_AttribClass_ExprLoc)                                                                    \\\nX(NoReturn,             DW_AttribClass_Flag)                                                                       \\\nX(Alignment,            DW_AttribClass_Const)                                                                      \\\nX(ExportSymbols,        DW_AttribClass_Flag)                                                                       \\\nX(Deleted,              DW_AttribClass_Flag)                                                                       \\\nX(Defaulted,            DW_AttribClass_Const)                                                                      \\\nX(LocListsBase,         DW_AttribClass_LocListPtr)\n\n//- Attributes GNU\n\n#define DW_AttribKind_GNU_XList(X)       \\\nX(GNU_Vector,                  0x2107) \\\nX(GNU_GuardedBy,               0x2108) \\\nX(GNU_PtGuardedBy,             0x2109) \\\nX(GNU_Guarded,                 0x210a) \\\nX(GNU_PtGuarded,               0x210b) \\\nX(GNU_LocksExcluded,           0x210c) \\\nX(GNU_ExclusiveLocksRequired,  0x210d) \\\nX(GNU_SharedLocksRequired,     0x210e) \\\nX(GNU_OdrSignature,            0x210f) \\\nX(GNU_TemplateName,            0x2110) \\\nX(GNU_CallSiteValue,           0x2111) \\\nX(GNU_CallSiteDataValue,       0x2112) \\\nX(GNU_CallSiteTarget,          0x2113) \\\nX(GNU_CallSiteTargetClobbered, 0x2114) \\\nX(GNU_TailCall,                0x2115) \\\nX(GNU_AllTailCallsSites,       0x2116) \\\nX(GNU_AllCallSites,            0x2117) \\\nX(GNU_AllSourceCallSites,      0x2118) \\\nX(GNU_Macros,                  0x2119) \\\nX(GNU_Deleted,                 0x211a) \\\nX(GNU_DwoName,                 0x2130) \\\nX(GNU_DwoId,                   0x2131) \\\nX(GNU_RangesBase,              0x2132) \\\nX(GNU_AddrBase,                0x2133) \\\nX(GNU_PubNames,                0x2134) \\\nX(GNU_PubTypes,                0x2135) \\\nX(GNU_Discriminator,           0x2136) \\\nX(GNU_LocViews,                0x2137) \\\nX(GNU_EntryView,               0x2138) \\\nX(GNU_DescriptiveType,         0x2302) \\\nX(GNU_Numerator,               0x2303) \\\nX(GNU_Denominator,             0x2304) \\\nX(GNU_Bias,                    0x2305)\n\n#define DW_AttribKind_ClassFlags_GNU_XList(X)              \\\nX(GNU_Vector,                  DW_AttribClass_Flag)      \\\nX(GNU_GuardedBy,               DW_AttribClass_Undefined) \\\nX(GNU_PtGuardedBy,             DW_AttribClass_Undefined) \\\nX(GNU_Guarded,                 DW_AttribClass_Undefined) \\\nX(GNU_PtGuarded,               DW_AttribClass_Undefined) \\\nX(GNU_LocksExcluded,           DW_AttribClass_Undefined) \\\nX(GNU_ExclusiveLocksRequired,  DW_AttribClass_Undefined) \\\nX(GNU_SharedLocksRequired,     DW_AttribClass_Undefined) \\\nX(GNU_OdrSignature,            DW_AttribClass_Undefined) \\\nX(GNU_TemplateName,            DW_AttribClass_Undefined) \\\nX(GNU_CallSiteValue,           DW_AttribClass_ExprLoc)   \\\nX(GNU_CallSiteDataValue,       DW_AttribClass_ExprLoc)   \\\nX(GNU_CallSiteTarget,          DW_AttribClass_ExprLoc)   \\\nX(GNU_CallSiteTargetClobbered, DW_AttribClass_ExprLoc)   \\\nX(GNU_TailCall,                DW_AttribClass_Flag)      \\\nX(GNU_AllTailCallsSites,       DW_AttribClass_Flag)      \\\nX(GNU_AllCallSites,            DW_AttribClass_Flag)      \\\nX(GNU_AllSourceCallSites,      DW_AttribClass_Flag)      \\\nX(GNU_Macros,                  DW_AttribClass_Flag)      \\\nX(GNU_Deleted,                 DW_AttribClass_Undefined) \\\nX(GNU_DwoName,                 DW_AttribClass_String)    \\\nX(GNU_DwoId,                   DW_AttribClass_Const)     \\\nX(GNU_RangesBase,              DW_AttribClass_Undefined) \\\nX(GNU_AddrBase,                DW_AttribClass_AddrPtr)   \\\nX(GNU_PubNames,                DW_AttribClass_Flag)      \\\nX(GNU_PubTypes,                DW_AttribClass_Undefined) \\\nX(GNU_Discriminator,           DW_AttribClass_Const)     \\\nX(GNU_LocViews,                DW_AttribClass_Undefined) \\\nX(GNU_EntryView,               DW_AttribClass_Undefined) \\\nX(GNU_DescriptiveType,         DW_AttribClass_Undefined) \\\nX(GNU_Numerator,               DW_AttribClass_Undefined) \\\nX(GNU_Denominator,             DW_AttribClass_Undefined) \\\nX(GNU_Bias,                    DW_AttribClass_Undefined)\n\n//- Attributes LLVM\n\n#define DW_AttribKind_LLVM_XList(X) \\\nX(LLVM_IncludePath,  0x3e00)      \\\nX(LLVM_ConfigMacros, 0x3e01)      \\\nX(LLVM_SysRoot,      0x3e02)      \\\nX(LLVM_TagOffset,    0x3e03)      \\\nX(LLVM_ApiNotes,     0x3e07)\n\n#define DW_AttribKind_ClassFlags_LLVM_XList(X)   \\\nX(LLVM_IncludePath,  DW_AttribClass_String)    \\\nX(LLVM_ConfigMacros, DW_AttribClass_String)    \\\nX(LLVM_SysRoot,      DW_AttribClass_String)    \\\nX(LLVM_TagOffset,    DW_AttribClass_Undefined) \\\nX(LLVM_ApiNotes,     DW_AttribClass_String)\n\n//- Attributes Apple\n\n#define DW_AttribKind_APPLE_XList(X) \\\nX(APPLE_Optimized,         0x3fe1) \\\nX(APPLE_Flags,             0x3fe2) \\\nX(APPLE_Isa,               0x3fe3) \\\nX(APPLE_Block,             0x3fe4) \\\nX(APPLE_MajorRuntimeVers,  0x3fe5) \\\nX(APPLE_RuntimeClass,      0x3fe6) \\\nX(APPLE_OmitFramePtr,      0x3fe7) \\\nX(APPLE_PropertyName,      0x3fe8) \\\nX(APPLE_PropertyGetter,    0x3fe9) \\\nX(APPLE_PropertySetter,    0x3fea) \\\nX(APPLE_PropertyAttribute, 0x3feb) \\\nX(APPLE_ObjcCompleteType,  0x3fec) \\\nX(APPLE_Property,          0x3fed) \\\nX(APPLE_ObjDirect,         0x3fee) \\\nX(APPLE_Sdk,               0x3fef)\n\n#define DW_AttribKind_ClassFlags_APPLE_XList(X)        \\\nX(APPLE_Optimized,         DW_AttribClass_Flag)      \\\nX(APPLE_Flags,             DW_AttribClass_Flag)      \\\nX(APPLE_Isa,               DW_AttribClass_Flag)      \\\nX(APPLE_Block,             DW_AttribClass_Undefined) \\\nX(APPLE_MajorRuntimeVers,  DW_AttribClass_Undefined) \\\nX(APPLE_RuntimeClass,      DW_AttribClass_Undefined) \\\nX(APPLE_OmitFramePtr,      DW_AttribClass_Flag)      \\\nX(APPLE_PropertyName,      DW_AttribClass_Undefined) \\\nX(APPLE_PropertyGetter,    DW_AttribClass_Undefined) \\\nX(APPLE_PropertySetter,    DW_AttribClass_Undefined) \\\nX(APPLE_PropertyAttribute, DW_AttribClass_Undefined) \\\nX(APPLE_ObjcCompleteType,  DW_AttribClass_Undefined) \\\nX(APPLE_Property,          DW_AttribClass_Undefined) \\\nX(APPLE_ObjDirect,         DW_AttribClass_Undefined) \\\nX(APPLE_Sdk,               DW_AttribClass_String)\n\n//- Attributes MIPS\n\n#define DW_AttribKind_MIPS_XList(X)     \\\nX(MIPS_Fde,                   0x2001) \\\nX(MIPS_LoopBegin,             0x2002) \\\nX(MIPS_TailLoopBegin,         0x2003) \\\nX(MIPS_EpilogBegin,           0x2004) \\\nX(MIPS_LoopUnrollFactor,      0x2005) \\\nX(MIPS_SoftwarePipelineDepth, 0x2006) \\\nX(MIPS_LinkageName,           0x2007) \\\nX(MIPS_Stride,                0x2008) \\\nX(MIPS_AbstractName,          0x2009) \\\nX(MIPS_CloneOrigin,           0x200a) \\\nX(MIPS_HasInlines,            0x200b) \\\nX(MIPS_StrideByte,            0x200c) \\\nX(MIPS_StrideElem,            0x200d) \\\nX(MIPS_PtrDopeType,           0x200e) \\\nX(MIPS_AllocatableDopeType,   0x200f) \\\nX(MIPS_AssumedShapeDopeType,  0x2010) \\\nX(MIPS_AssumedSize,           0x2011)\n\n#define DW_AttribKind_ClassFlags_MIPS_XList(X)            \\\nX(MIPS_Fde,                   DW_AttribClass_Block)     \\\nX(MIPS_LoopBegin,             DW_AttribClass_Block)     \\\nX(MIPS_TailLoopBegin,         DW_AttribClass_Block)     \\\nX(MIPS_EpilogBegin,           DW_AttribClass_Block)     \\\nX(MIPS_LoopUnrollFactor,      DW_AttribClass_Block)     \\\nX(MIPS_SoftwarePipelineDepth, DW_AttribClass_Block)     \\\nX(MIPS_LinkageName,           DW_AttribClass_String)    \\\nX(MIPS_Stride,                DW_AttribClass_Block)     \\\nX(MIPS_AbstractName,          DW_AttribClass_String)    \\\nX(MIPS_CloneOrigin,           DW_AttribClass_String)    \\\nX(MIPS_HasInlines,            DW_AttribClass_Reference) \\\nX(MIPS_StrideByte,            DW_AttribClass_Reference) \\\nX(MIPS_StrideElem,            DW_AttribClass_Reference) \\\nX(MIPS_PtrDopeType,           DW_AttribClass_Reference) \\\nX(MIPS_AllocatableDopeType,   DW_AttribClass_Reference) \\\nX(MIPS_AssumedShapeDopeType,  DW_AttribClass_Reference) \\\nX(MIPS_AssumedSize,           DW_AttribClass_Reference)\n\ntypedef U32 DW_AttribKind;\ntypedef enum DW_AttribKindEnum\n{\n  DW_AttribKind_Null,\n#define X(_N,_ID,...) DW_AttribKind_##_N = _ID,\n  DW_AttribKind_V2_XList(X)\n    DW_AttribKind_V3_XList(X)\n    DW_AttribKind_V4_XList(X)\n    DW_AttribKind_V5_XList(X)\n    DW_AttribKind_GNU_XList(X)\n    DW_AttribKind_LLVM_XList(X)\n    DW_AttribKind_APPLE_XList(X)\n    DW_AttribKind_MIPS_XList(X)\n#undef X\n  DW_AttribKind_UserLo = 0x2000,\n  DW_AttribKind_UserHi = 0x3fff\n} DW_AttribKindEnum;\n\n#define DW_ATE_XList(X)   \\\nX(Null,           0x00) \\\nX(Address,        0x01) \\\nX(Boolean,        0x02) \\\nX(ComplexFloat,   0x03) \\\nX(Float,          0x04) \\\nX(Signed,         0x05) \\\nX(SignedChar,     0x06) \\\nX(Unsigned,       0x07) \\\nX(UnsignedChar,   0x08) \\\nX(ImaginaryFloat, 0x09) \\\nX(PackedDecimal,  0x0A) \\\nX(NumericString,  0x0B) \\\nX(Edited,         0x0C) \\\nX(SignedFixed,    0x0D) \\\nX(UnsignedFixed,  0x0E) \\\nX(DecimalFloat,   0x0F) \\\nX(Utf,            0x10) \\\nX(Ucs,            0x11) \\\nX(Ascii,          0x12)\n\ntypedef U64 DW_ATE;\ntypedef enum DW_ATEEnum\n{\n#define X(_N,_ID) DW_ATE_##_N = _ID,\n  DW_ATE_XList(X)\n#undef X\n} DW_ATEnum;\n\n#define DW_CallingConventionKind_XList(X) \\\nX(Normal,          0x0)                 \\\nX(Program,         0x1)                 \\\nX(NoCall,          0x3)                 \\\nX(PassByValue,     0x4)                 \\\nX(PassByReference, 0x5)\n\ntypedef U64 DW_CallingConventionKind;\ntypedef enum DW_CallingConventionKindEnum\n{\n#define X(_N,_ID) DW_CallingConventionKind_##_N = _ID,\n  DW_CallingConventionKind_XList(X)\n#undef X\n} DW_CallingConventionKindEnum;\n\n#define DW_AccessKind_XList(X) \\\nX(Public,    0x00) \\\nX(Private,   0x01) \\\nX(Protected, 0x02)\n\ntypedef U64 DW_AccessKind;\ntypedef enum DW_AccessKindEnum\n{\n#define X(_N,_ID) DW_AccessKind_##_N = _ID,\n  DW_AccessKind_XList(X)\n#undef X\n} DW_AccessKindEnum;\n\n#define DW_VirtualityKind_XList(X) \\\nX(None,        0x00)             \\\nX(Virtual,     0x01)             \\\nX(PureVirtual, 0x02)\n\ntypedef U64 DW_VirtualityKind;\ntypedef enum DW_VirtualityEnum\n{\n#define X(_N,_ID) DW_VirtualityKind_##_N = _ID,\n  DW_VirtualityKind_XList(X)\n#undef X\n} DW_VirtualityEnum;\n\n#define DW_RngListEntryKind(X) \\\nX(EndOfList,    0x00)        \\\nX(BaseAddressx, 0x01)        \\\nX(StartxEndx,   0x02)        \\\nX(StartxLength, 0x03)        \\\nX(OffsetPair,   0x04)        \\\nX(BaseAddress,  0x05)        \\\nX(StartEnd,     0x06)        \\\nX(StartLength,  0x07)\n\ntypedef U8 DW_RLE;\ntypedef enum DW_RLE_Enum\n{\n#define X(_N,_ID) DW_RLE_##_N = _ID,\n  DW_RngListEntryKind(X)\n#undef X\n} DW_RLE_Enum;\n\n#define DW_LocListEntry_XList(X) \\\nX(EndOfList,       0x00)       \\\nX(BaseAddressx,    0x01)       \\\nX(StartxEndx,      0x02)       \\\nX(StartxLength,    0x03)       \\\nX(OffsetPair,      0x04)       \\\nX(DefaultLocation, 0x05)       \\\nX(BaseAddress,     0x06)       \\\nX(StartEnd,        0x07)       \\\nX(StartLength,     0x08)\n\n#define DW_LocListEntry_GNU_XList(X) \\\nX(GNU_ViewPair, 0x9)\n\ntypedef U8 DW_LLE;\ntypedef enum DW_LLE_Enum\n{\n#define X(_N,_ID) DW_LLE_##_N = _ID,\n  DW_LocListEntry_XList(X)\n#undef X\n} DW_LLEEnum;\n\n#define DW_AddrClass_XList(X) \\\nX(None,   0)                \\\nX(Near16, 1)                \\\nX(Far16,  2)                \\\nX(Huge16, 3)                \\\nX(Near32, 4)                \\\nX(Far32,  5)\n\ntypedef U64 DW_AddrClass;\ntypedef enum DW_AddrClassEnum\n{\n#define X(_N, _ID) DW_AddrClassKind_##_N = _ID,\n  DW_AddrClass_XList(X)\n#undef X\n} DW_AddrClassEnum;\n\n#define DW_CompUnitKind_XList(X) \\\nX(Reserved,     0)             \\\nX(Compile,      1)             \\\nX(Type,         2)             \\\nX(Partial,      3)             \\\nX(Skeleton,     4)             \\\nX(SplitCompile, 5)             \\\nX(SplitType,    6)\n\ntypedef U8 DW_CompUnitKind;\ntypedef enum DW_CompUnitKindEnum\n{\n#define X(_N, _ID) DW_CompUnitKind_##_N = _ID,\n  DW_CompUnitKind_XList(X)\n#undef X\n  DW_CompUnitKind_UserLo = 0x80,\n  DW_CompUnitKind_UserHi = 0xff\n} DW_CompUnitKindEnum;\n\n#define DW_LNCT_XList(X) \\\nX(Path,           0x1)       \\\nX(DirectoryIndex, 0x2)       \\\nX(TimeStamp,      0x3)       \\\nX(Size,           0x4)       \\\nX(MD5,            0x5)       \\\nX(LLVM_Source,    0x2001)\n\ntypedef U64 DW_LNCT;\ntypedef enum DW_LNCTEnum\n{\n#define X(_N, _ID) DW_LNCT_##_N = _ID,\n  DW_LNCT_XList(X)\n#undef X\n  DW_LNCT_UserLo = 0x2000,\n  DW_LNCT_UserHi = 0x3fff\n} DW_LNCTEnum;\n\n////////////////////////////////\n// CFA\n\ntypedef enum\n{\n  DW_CFA_OperandType_Null,\n  DW_CFA_OperandType_Value,\n  DW_CFA_OperandType_Register,\n  DW_CFA_OperandType_Expression,\n} DW_CFA_OperandType;\n\n// (opcode name, opcode id, operand count, operand types)\n#define DW_CFA_Kind_XList(X)                                                        \\\nX(Nop,            0x0)                                                              \\\nX(SetLoc,         0x1,  DW_CFA_OperandType_Value)                                   \\\nX(AdvanceLoc1,    0x2,  DW_CFA_OperandType_Value)                                   \\\nX(AdvanceLoc2,    0x3,  DW_CFA_OperandType_Value)                                   \\\nX(AdvanceLoc4,    0x4,  DW_CFA_OperandType_Value)                                   \\\nX(OffsetExt,      0x5,  DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(RestoreExt,     0x6)                                                              \\\nX(Undefined,      0x7,  DW_CFA_OperandType_Register)                                \\\nX(SameValue,      0x8,  DW_CFA_OperandType_Register)                                \\\nX(Register,       0x9,  DW_CFA_OperandType_Register)                                \\\nX(RememberState,  0xa)                                                              \\\nX(RestoreState,   0xb)                                                              \\\nX(DefCfa,         0xc,  DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(DefCfaRegister, 0xd,  DW_CFA_OperandType_Register)                                \\\nX(DefCfaOffset,   0xe,  DW_CFA_OperandType_Value)                                   \\\nX(DefCfaExpr,     0xf,  DW_CFA_OperandType_Expression)                              \\\nX(Expr,           0x10, DW_CFA_OperandType_Expression)                              \\\nX(OffsetExtSf,    0x11, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(DefCfaSf,       0x12, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(DefCfaOffsetSf, 0x13, DW_CFA_OperandType_Value)                                   \\\nX(ValOffset,      0x14, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(ValOffsetSf,    0x15, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(ValExpr,        0x16, DW_CFA_OperandType_Register, DW_CFA_OperandType_Expression) \\\nX(AdvanceLoc,     0x40, DW_CFA_OperandType_Value)                                   \\\nX(Offset,         0x80, DW_CFA_OperandType_Register, DW_CFA_OperandType_Value)      \\\nX(Restore,        0xc0, DW_CFA_OperandType_Register)\n\n#define DW_CFA_OperandMax 2\n#define DW_CFA_Mask_OpcodeHi 0xc0\n#define DW_CFA_Mask_Operand  0x3f\n\ntypedef U8 DW_CFA_Opcode;\ntypedef enum DW_CFA_Enum\n{\n#define X(_N, _ID, ...) DW_CFA_##_N = _ID,\n  DW_CFA_Kind_XList(X)\n#undef X\n} DW_CFA_Enum;\n\n////////////////////////////////\n// Expression Opcodes\n\n// (opcode name, opcode id, operand count, pop count, push count)\n#define DW_Expr_V3_XList(X)         \\\nX(Null,              0x00, 0, 0, 0) \\\nX(Addr,              0x03, 1, 0, 1) \\\nX(Deref,             0x06, 0, 1, 1) \\\nX(Const1U,           0x08, 1, 0, 1) \\\nX(Const1S,           0x09, 1, 0, 1) \\\nX(Const2U,           0x0a, 1, 0, 1) \\\nX(Const2S,           0x0b, 1, 0, 1) \\\nX(Const4U,           0x0c, 1, 0, 1) \\\nX(Const4S,           0x0d, 1, 0, 1) \\\nX(Const8U,           0x0e, 1, 0, 1) \\\nX(Const8S,           0x0f, 1, 0, 1) \\\nX(ConstU,            0x10, 1, 0, 1) \\\nX(ConstS,            0x11, 1, 0, 1) \\\nX(Dup,               0x12, 0, 0, 1) \\\nX(Drop,              0x13, 0, 1, 0) \\\nX(Over,              0x14, 0, 0, 1) \\\nX(Pick,              0x15, 1, 0, 1) \\\nX(Swap,              0x16, 0, 0, 0) \\\nX(Rot,               0x17, 0, 0, 0) \\\nX(XDeref,            0x18, 0, 2, 1) \\\nX(Abs,               0x19, 0, 1, 1) \\\nX(And,               0x1a, 0, 2, 1) \\\nX(Div,               0x1b, 0, 2, 1) \\\nX(Minus,             0x1c, 0, 2, 1) \\\nX(Mod,               0x1d, 0, 2, 1) \\\nX(Mul,               0x1e, 0, 2, 1) \\\nX(Neg,               0x1f, 0, 1, 1) \\\nX(Not,               0x20, 0, 1, 1) \\\nX(Or,                0x21, 0, 2, 1) \\\nX(Plus,              0x22, 0, 2, 1) \\\nX(PlusUConst,        0x23, 1, 1, 1) \\\nX(Shl,               0x24, 0, 2, 1) \\\nX(Shr,               0x25, 0, 2, 1) \\\nX(Shra,              0x26, 0, 2, 1) \\\nX(Xor,               0x27, 0, 2, 1) \\\nX(Bra,               0x28, 1, 1, 0) \\\nX(Eq,                0x29, 0, 2, 1) \\\nX(Ge,                0x2a, 0, 2, 1) \\\nX(Gt,                0x2b, 0, 2, 1) \\\nX(Le,                0x2c, 0, 2, 1) \\\nX(Lt,                0x2d, 0, 2, 1) \\\nX(Ne,                0x2e, 0, 2, 1) \\\nX(Skip,              0x2f, 1, 0, 0) \\\nX(Lit0,              0x30, 0, 0, 0) \\\nX(Lit1,              0x31, 0, 0, 0) \\\nX(Lit2,              0x32, 0, 0, 0) \\\nX(Lit3,              0x33, 0, 0, 0) \\\nX(Lit4,              0x34, 0, 0, 0) \\\nX(Lit5,              0x35, 0, 0, 0) \\\nX(Lit6,              0x36, 0, 0, 0) \\\nX(Lit7,              0x37, 0, 0, 0) \\\nX(Lit8,              0x38, 0, 0, 0) \\\nX(Lit9,              0x39, 0, 0, 0) \\\nX(Lit10,             0x3a, 0, 0, 0) \\\nX(Lit11,             0x3b, 0, 0, 0) \\\nX(Lit12,             0x3c, 0, 0, 0) \\\nX(Lit13,             0x3d, 0, 0, 0) \\\nX(Lit14,             0x3e, 0, 0, 0) \\\nX(Lit15,             0x3f, 0, 0, 0) \\\nX(Lit16,             0x40, 0, 0, 0) \\\nX(Lit17,             0x41, 0, 0, 0) \\\nX(Lit18,             0x42, 0, 0, 0) \\\nX(Lit19,             0x43, 0, 0, 0) \\\nX(Lit20,             0x44, 0, 0, 0) \\\nX(Lit21,             0x45, 0, 0, 0) \\\nX(Lit22,             0x46, 0, 0, 0) \\\nX(Lit23,             0x47, 0, 0, 0) \\\nX(Lit24,             0x48, 0, 0, 0) \\\nX(Lit25,             0x49, 0, 0, 0) \\\nX(Lit26,             0x4a, 0, 0, 0) \\\nX(Lit27,             0x4b, 0, 0, 0) \\\nX(Lit28,             0x4c, 0, 0, 0) \\\nX(Lit29,             0x4d, 0, 0, 0) \\\nX(Lit30,             0x4e, 0, 0, 0) \\\nX(Lit31,             0x4f, 0, 0, 0) \\\nX(Reg0,              0x50, 0, 0, 1) \\\nX(Reg1,              0x51, 0, 0, 1) \\\nX(Reg2,              0x52, 0, 0, 1) \\\nX(Reg3,              0x53, 0, 0, 1) \\\nX(Reg4,              0x54, 0, 0, 1) \\\nX(Reg5,              0x55, 0, 0, 1) \\\nX(Reg6,              0x56, 0, 0, 1) \\\nX(Reg7,              0x57, 0, 0, 1) \\\nX(Reg8,              0x58, 0, 0, 1) \\\nX(Reg9,              0x59, 0, 0, 1) \\\nX(Reg10,             0x5a, 0, 0, 1) \\\nX(Reg11,             0x5b, 0, 0, 1) \\\nX(Reg12,             0x5c, 0, 0, 1) \\\nX(Reg13,             0x5d, 0, 0, 1) \\\nX(Reg14,             0x5e, 0, 0, 1) \\\nX(Reg15,             0x5f, 0, 0, 1) \\\nX(Reg16,             0x60, 0, 0, 1) \\\nX(Reg17,             0x61, 0, 0, 1) \\\nX(Reg18,             0x62, 0, 0, 1) \\\nX(Reg19,             0x63, 0, 0, 1) \\\nX(Reg20,             0x64, 0, 0, 1) \\\nX(Reg21,             0x65, 0, 0, 1) \\\nX(Reg22,             0x66, 0, 0, 1) \\\nX(Reg23,             0x67, 0, 0, 1) \\\nX(Reg24,             0x68, 0, 0, 1) \\\nX(Reg25,             0x69, 0, 0, 1) \\\nX(Reg26,             0x6a, 0, 0, 1) \\\nX(Reg27,             0x6b, 0, 0, 1) \\\nX(Reg28,             0x6c, 0, 0, 1) \\\nX(Reg29,             0x6d, 0, 0, 1) \\\nX(Reg30,             0x6e, 0, 0, 1) \\\nX(Reg31,             0x6f, 0, 0, 1) \\\nX(BReg0,             0x70, 1, 0, 1) \\\nX(BReg1,             0x71, 1, 0, 1) \\\nX(BReg2,             0x72, 1, 0, 1) \\\nX(BReg3,             0x73, 1, 0, 1) \\\nX(BReg4,             0x74, 1, 0, 1) \\\nX(BReg5,             0x75, 1, 0, 1) \\\nX(BReg6,             0x76, 1, 0, 1) \\\nX(BReg7,             0x77, 1, 0, 1) \\\nX(BReg8,             0x78, 1, 0, 1) \\\nX(BReg9,             0x79, 1, 0, 1) \\\nX(BReg10,            0x7a, 1, 0, 1) \\\nX(BReg11,            0x7b, 1, 0, 1) \\\nX(BReg12,            0x7c, 1, 0, 1) \\\nX(BReg13,            0x7d, 1, 0, 1) \\\nX(BReg14,            0x7e, 1, 0, 1) \\\nX(BReg15,            0x7f, 1, 0, 1) \\\nX(BReg16,            0x80, 1, 0, 1) \\\nX(BReg17,            0x81, 1, 0, 1) \\\nX(BReg18,            0x82, 1, 0, 1) \\\nX(BReg19,            0x83, 1, 0, 1) \\\nX(BReg20,            0x84, 1, 0, 1) \\\nX(BReg21,            0x85, 1, 0, 1) \\\nX(BReg22,            0x86, 1, 0, 1) \\\nX(BReg23,            0x87, 1, 0, 1) \\\nX(BReg24,            0x88, 1, 0, 1) \\\nX(BReg25,            0x89, 1, 0, 1) \\\nX(BReg26,            0x8a, 1, 0, 1) \\\nX(BReg27,            0x8b, 1, 0, 1) \\\nX(BReg28,            0x8c, 1, 0, 1) \\\nX(BReg29,            0x8d, 1, 0, 1) \\\nX(BReg30,            0x8e, 1, 0, 1) \\\nX(BReg31,            0x8f, 1, 0, 1) \\\nX(RegX,              0x90, 1, 0, 1) \\\nX(FBReg,             0x91, 1, 0, 1) \\\nX(BRegX,             0x92, 2, 0, 1) \\\nX(Piece,             0x93, 1, 0, 0) \\\nX(DerefSize,         0x94, 1, 1, 1) \\\nX(XDerefSize,        0x95, 1, 2, 1) \\\nX(Nop,               0x96, 0, 0, 0) \\\nX(PushObjectAddress, 0x97, 0, 0, 1) \\\nX(Call2,             0x98, 1, 0, 0) \\\nX(Call4,             0x99, 1, 0, 0) \\\nX(CallRef,           0x9a, 1, 0, 0) \\\nX(FormTlsAddress,    0x9b, 0, 0, 1) \\\nX(CallFrameCfa,      0x9c, 0, 0, 1) \\\nX(BitPiece,          0x9d, 2, 0, 0)\n\n#define DW_Expr_V4_XList(X)     \\\nX(ImplicitValue, 0x9e, 2, 0, 1) \\\nX(StackValue,    0x9f, 0, 0, 0)\n\n#define DW_Expr_V5_XList(X)             \\\nX(ImplicitPointer, 0xa0, 2, 0, 1)       \\\nX(Addrx,           0xa1, 1, 0, 1)       \\\nX(Constx,          0xa2, 1, 0, 1)       \\\nX(EntryValue,      0xa3, 2, 0, 0)       \\\nX(ConstType,       0xa4, 3, 0, 1)       \\\nX(RegvalType,      0xa5, 2, 0, 1)       \\\nX(DerefType,       0xa6, 2, 1, 1) \\\nX(XDerefType,      0xa7, 2, 2, 1)       \\\nX(Convert,         0xa8, 1, 1, 1)       \\\nX(Reinterpret,     0xa9, 1, 1, 1)\n\n#define DW_Expr_GNU_XList(X)          \\\nX(GNU_PushTlsAddress,  0xe0, 0, 0, 1) \\\nX(GNU_UnInit,          0xf0, 0, 0, 0) \\\nX(GNU_ImplicitPointer, 0xf2, 2, 0, 1) \\\nX(GNU_EntryValue,      0xf3, 2, 0, 0) \\\nX(GNU_ConstType,       0xf4, 3, 0, 1) \\\nX(GNU_RegvalType,      0xf5, 2, 0, 1) \\\nX(GNU_DerefType,       0xf6, 2, 1, 1) \\\nX(GNU_Convert,         0xf7, 1, 1, 1) \\\nX(GNU_ParameterRef,    0xfa, 1, 0, 0) \\\nX(GNU_AddrIndex,       0xfb, 0, 0, 1) \\\nX(GNU_ConstIndex,      0xfc, 1, 0, 1)\n\ntypedef U8 DW_ExprOp;\ntypedef enum DW_ExprOpEnum\n{\n#define X(_N, _ID, _OPER_COUNT, _POP_COUNT, _PUSH_COUNT) DW_ExprOp_##_N = _ID,\n  DW_Expr_V3_XList(X)\n    DW_Expr_V4_XList(X)\n    DW_Expr_V5_XList(X) \n    DW_Expr_GNU_XList(X)\n#undef X\n} DW_ExprOpEnum;\n\n//- Regs\n\n#define DW_Regs_X86_XList(X) \\\nX(Eax,    0,  eax,    0, 4)  \\\nX(Ecx,    1,  ecx,    0, 4)  \\\nX(Edx,    2,  edx,    0, 4)  \\\nX(Ebx,    3,  ebx,    0, 4)  \\\nX(Esp,    4,  esp,    0, 4)  \\\nX(Ebp,    5,  ebp,    0, 4)  \\\nX(Esi,    6,  esi,    0, 4)  \\\nX(Edi,    7,  edi,    0, 4)  \\\nX(Eip,    8,  eip,    0, 4)  \\\nX(Eflags, 9,  eflags, 0, 4)  \\\nX(Trapno, 10, nil,    0, 0)  \\\nX(St0,    11, st0,    0, 10) \\\nX(St1,    12, st1,    0, 10) \\\nX(St2,    13, st2,    0, 10) \\\nX(St3,    14, st3,    0, 10) \\\nX(St4,    15, st4,    0, 10) \\\nX(St5,    16, st5,    0, 10) \\\nX(St6,    17, st6,    0, 10) \\\nX(St7,    18, st7,    0, 10) \\\nX(Xmm0,   21, ymm0,   0, 16) \\\nX(Xmm1,   22, ymm1,   0, 16) \\\nX(Xmm2,   23, ymm2,   0, 16) \\\nX(Xmm3,   24, ymm3,   0, 16) \\\nX(Xmm4,   25, ymm4,   0, 16) \\\nX(Xmm5,   26, ymm5,   0, 16) \\\nX(Xmm6,   27, ymm6,   0, 16) \\\nX(Xmm7,   28, ymm7,   0, 16) \\\nX(Mm0,    29, fpr0,   0, 8)  \\\nX(Mm1,    30, fpr1,   0, 8)  \\\nX(Mm2,    31, fpr2,   0, 8)  \\\nX(Mm3,    32, fpr3,   0, 8)  \\\nX(Mm4,    33, fpr4,   0, 8)  \\\nX(Mm5,    34, fpr5,   0, 8)  \\\nX(Mm6,    35, fpr6,   0, 8)  \\\nX(Mm7,    36, fpr7,   0, 8)  \\\nX(Fcw,    37, fcw,    0, 2)  \\\nX(Fsw,    38, fsw,    0, 2)  \\\nX(Mxcsr,  39, mxcsr,  0, 4)  \\\nX(Es,     40, es,     0, 2)  \\\nX(Cs,     41, cs,     0, 2)  \\\nX(Ss,     42, ss,     0, 2)  \\\nX(Ds,     43, ds,     0, 2)  \\\nX(Fs,     44, fs,     0, 2)  \\\nX(Gs,     45, gs,     0, 2)  \\\nX(Tr,     48, tr,    0, 0)  \\\nX(Ldtr,   49, ldtr,    0, 0)\n\n#define DW_Regs_X64_XList(X)  \\\nX(Rax,     0,  rax,    0, 8)  \\\nX(Rdx,     1,  rdx,    0, 8)  \\\nX(Rcx,     2,  rcx,    0, 8)  \\\nX(Rbx,     3,  rbx,    0, 8)  \\\nX(Rsi,     4,  rsi,    0, 8)  \\\nX(Rdi,     5,  rdi,    0, 8)  \\\nX(Rbp,     6,  rbp,    0, 8)  \\\nX(Rsp,     7,  rsp,    0, 8)  \\\nX(R8,      8,  r8,     0, 8)  \\\nX(R9,      9,  r9,     0, 8)  \\\nX(R10,     10, r10,    0, 8)  \\\nX(R11,     11, r11,    0, 8)  \\\nX(R12,     12, r12,    0, 8)  \\\nX(R13,     13, r13,    0, 8)  \\\nX(R14,     14, r14,    0, 8)  \\\nX(R15,     15, r15,    0, 8)  \\\nX(Rip,     16, rip,    0, 8)  \\\nX(Xmm0,    17, zmm0,   0, 16) \\\nX(Xmm1,    18, zmm1,   0, 16) \\\nX(Xmm2,    19, zmm2,   0, 16) \\\nX(Xmm3,    20, zmm3,   0, 16) \\\nX(Xmm4,    21, zmm4,   0, 16) \\\nX(Xmm5,    22, zmm5,   0, 16) \\\nX(Xmm6,    23, zmm6,   0, 16) \\\nX(Xmm7,    24, zmm7,   0, 16) \\\nX(Xmm8,    25, zmm8,   0, 16) \\\nX(Xmm9,    26, zmm9,   0, 16) \\\nX(Xmm10,   27, zmm10,  0, 16) \\\nX(Xmm11,   28, zmm11,  0, 16) \\\nX(Xmm12,   29, zmm12,  0, 16) \\\nX(Xmm13,   30, zmm13,  0, 16) \\\nX(Xmm14,   31, zmm14,  0, 16) \\\nX(Xmm15,   32, zmm15,  0, 16) \\\nX(Xmm16,   67, zmm16,  0, 16) \\\nX(Xmm17,   68, zmm17,  0, 16) \\\nX(Xmm18,   69, zmm18,  0, 16) \\\nX(Xmm19,   70, zmm19,  0, 16) \\\nX(Xmm20,   71, zmm20,  0, 16) \\\nX(Xmm21,   72, zmm21,  0, 16) \\\nX(Xmm22,   73, zmm22,  0, 16) \\\nX(Xmm23,   74, zmm23,  0, 16) \\\nX(Xmm24,   75, zmm24,  0, 16) \\\nX(Xmm25,   76, zmm25,  0, 16) \\\nX(Xmm26,   77, zmm26,  0, 16) \\\nX(Xmm27,   78, zmm27,  0, 16) \\\nX(Xmm28,   79, zmm28,  0, 16) \\\nX(Xmm29,   80, zmm29,  0, 16) \\\nX(Xmm30,   81, zmm30,  0, 16) \\\nX(Xmm31,   82, zmm31,  0, 16) \\\nX(St0,     33, st0,    0, 10) \\\nX(St1,     34, st1,    0, 10) \\\nX(St2,     35, st2,    0, 10) \\\nX(St3,     36, st3,    0, 10) \\\nX(St4,     37, st4,    0, 10) \\\nX(St5,     38, st5,    0, 10) \\\nX(St6,     39, st6,    0, 10) \\\nX(St7,     40, st7,    0, 10) \\\nX(Mm0,     41, fpr0,   0, 8)  \\\nX(Mm1,     42, fpr1,   0, 8)  \\\nX(Mm2,     43, fpr2,   0, 8)  \\\nX(Mm3,     44, fpr3,   0, 8)  \\\nX(Mm4,     45, fpr4,   0, 8)  \\\nX(Mm5,     46, fpr5,   0, 8)  \\\nX(Mm6,     47, fpr6,   0, 8)  \\\nX(Mm7,     48, fpr7,   0, 8)  \\\nX(Rflags,  49, rflags, 0, 4)  \\\nX(Es,      50, es,     0, 2)  \\\nX(Cs,      51, cs,     0, 2)  \\\nX(Ss,      52, ss,     0, 2)  \\\nX(Ds,      53, ds,     0, 2)  \\\nX(Fs,      54, fs,     0, 2)  \\\nX(Gs,      55, gs,     0, 2)  \\\nX(FsBase,  58, fsbase, 0, 0)  \\\nX(GsBase,  59, gsbase, 0, 0)  \\\nX(Tr,      62, tr,     0, 0)  \\\nX(Ldtr,    63, ldtr,   0, 0)\n\ntypedef U32 DW_Reg;\n\ntypedef DW_Reg DW_RegX86;\ntypedef enum DW_RegX86Enum\n{\n#define X(_N,_ID,...) DW_RegX86_##_N = _ID,\n  DW_Regs_X86_XList(X)\n#undef X\n  DW_RegX86_Last\n} DW_RegX86Enum;\n\ntypedef DW_Reg DW_RegX64;\ntypedef enum DW_RegX64Enum\n{\n#define X(_N,_ID,...) DW_RegX64_##_N = _ID,\n  DW_Regs_X64_XList(X)\n#undef X\n  DW_RegX64_Last\n} DW_RegX64Enum;\n\n////////////////////////////////\n\ninternal U64 dw_reg_size_from_code_x86(DW_Reg reg_code);\ninternal U64 dw_reg_pos_from_code_x86(DW_Reg reg_code);\ninternal U64 dw_reg_size_from_code_x64(DW_Reg reg_code);\ninternal U64 dw_reg_pos_from_code_x64(DW_Reg reg_code);\ninternal U64 dw_reg_size_from_code(Arch arch, DW_Reg reg_code);\ninternal U64 dw_reg_pos_from_code(Arch arch, DW_Reg reg_code);\ninternal U64 dw_reg_count_from_arch(Arch arch);\ninternal U64 dw_reg_max_size_from_arch(Arch arch);\ninternal U64 dw_sp_from_arch(Arch arch);\n\n//- Attrib Class Encodings\n\n// Speced Encodings\ninternal DW_AttribClass dw_attrib_class_from_attrib_v2(DW_AttribKind k);\ninternal DW_AttribClass dw_attrib_class_from_attrib_v3(DW_AttribKind k);\ninternal DW_AttribClass dw_attrib_class_from_attrib_v4(DW_AttribKind k);\ninternal DW_AttribClass dw_attrib_class_from_attrib_v5(DW_AttribKind k);\n\n// Extensions\ninternal DW_AttribClass dw_attrib_class_from_attrib_gnu  (DW_AttribKind k);\ninternal DW_AttribClass dw_attrib_class_from_attrib_llvm (DW_AttribKind k);\ninternal DW_AttribClass dw_attrib_class_from_attrib_apple(DW_AttribKind k);\ninternal DW_AttribClass dw_attrib_class_from_attrib_mips (DW_AttribKind k);\n\ninternal DW_AttribClass dw_attrib_class_from_attrib(DW_Version ver, DW_Ext ext, DW_AttribKind v);\n\n//- Form Class Encodings\n\ninternal DW_AttribClass dw_attrib_class_from_form_kind(DW_Version ver, DW_FormKind k);\n\ninternal B32 dw_are_attrib_class_and_form_kind_compatible(DW_Version ver, DW_AttribClass attrib_class, DW_FormKind form_kind);\n\n//- Section Names\n\ninternal String8 dw_name_string_from_section_kind     (DW_SectionKind k);\ninternal String8 dw_mach_name_string_from_section_kind(DW_SectionKind k);\ninternal String8 dw_dwo_name_string_from_section_kind (DW_SectionKind k);\n\n////////////////////////////////\n\ninternal U64 dw_size_from_format(DW_Format format);\n\n////////////////////////////////\n\ninternal DW_AttribClass dw_pick_attrib_value_class(DW_Version ver, DW_Ext ext, DW_AttribKind attrib, DW_FormKind form_kind);\n\ninternal U64 dw_pick_default_lower_bound(DW_Language lang);\n\ninternal U64 dw_operand_count_from_expr_op(DW_ExprOp op);\ninternal U64 dw_pop_count_from_expr_op(DW_ExprOp op);\ninternal U64 dw_push_count_from_expr_op(DW_ExprOp op);\n\n////////////////////////////////\n//~ CFA\n\ninternal U64 dw_operand_count_from_cfa_opcode(DW_CFA_Opcode opcode);\ninternal B32 dw_is_cfa_expr_opcode_invalid(DW_ExprOp opcode);\ninternal B32 dw_is_new_row_cfa_opcode(DW_CFA_Opcode opcode);\ninternal DW_CFA_OperandType * dw_operand_types_from_cfa_op(DW_CFA_Opcode opcode);\n\n////////////////////////////////\n//~ rjf: String <=> Enum\n\ninternal String8 dw_string_from_format(DW_Format format); \ninternal String8 dw_string_from_expr_op(Arena *arena, DW_Version ver, DW_Ext ext, DW_ExprOp op);\ninternal String8 dw_string_from_tag_kind(Arena *arena, DW_TagKind kind);\ninternal String8 dw_string_from_attrib_kind(Arena *arena, DW_Version ver, DW_Ext ext, DW_AttribKind kind);\ninternal String8 dw_string_from_form_kind(Arena *arena, DW_Version ver, DW_FormKind kind);\ninternal String8 dw_string_from_language(Arena *arena, DW_Language kind);\ninternal String8 dw_string_from_inl(Arena *arena, DW_InlKind kind);\ninternal String8 dw_string_from_access_kind(Arena *arena, DW_AccessKind kind);\ninternal String8 dw_string_from_calling_convetion(Arena *arena, DW_CallingConventionKind kind);\ninternal String8 dw_string_from_attrib_type_encoding(Arena *arena, DW_ATE kind);\ninternal String8 dw_string_from_std_opcode(Arena *arena, DW_StdOpcode kind);\ninternal String8 dw_string_from_ext_opcode(Arena *arena, DW_ExtOpcode kind);\ninternal String8 dw_string_from_loc_list_entry_kind(Arena *arena, DW_LLE kind);\ninternal String8 dw_string_from_section_kind(Arena *arena, DW_SectionKind kind);\ninternal String8 dw_string_from_rng_list_entry_kind(Arena *arena, DW_RLE kind);\ninternal String8 dw_string_from_register(Arena *arena, Arch arch, U64 reg_id);\ninternal String8 dw_string_from_cfa_opcode(DW_CFA_Opcode opcode);\n\n#endif // DWARF_H\n"
  },
  {
    "path": "src/dwarf/dwarf_coff.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal B32\ndw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table)\n{\n  B32 is_dwarf_present = 0;\n  for EachIndex(idx, section_count)\n  {\n    COFF_SectionHeader *header = &section_table[idx];\n    String8 name = coff_name_from_section_header(string_table, header);\n    DW_SectionKind s = dw_section_kind_from_string(name);\n    if(s == DW_Section_Null)\n    {\n      s = dw_section_dwo_kind_from_string(name);\n    }\n    is_dwarf_present = s != DW_Section_Null;\n    if(is_dwarf_present)\n    {\n      break;\n    }\n  }\n  return is_dwarf_present;\n}\n\ninternal DW_Input\ndw_input_from_coff_section_table(Arena              *arena,\n                                 String8             raw_image,\n                                 String8             string_table,\n                                 U64                 section_count,\n                                 COFF_SectionHeader *section_table)\n{\n  DW_Input input                              = {0};\n  B32      sect_status[ArrayCount(input.sec)] = {0};\n  \n  for (U64 i = 0; i < section_count; ++i) {\n    COFF_SectionHeader *header         = &section_table[i];\n    Rng1U64             raw_data_range = rng_1u64(header->foff, header->foff + header->fsize);\n    String8             name           = coff_name_from_section_header(string_table, header);\n    \n    DW_SectionKind s      = dw_section_kind_from_string(name);\n    B32            is_dwo = 0;\n    if (s == DW_Section_Null) {\n      s      = dw_section_dwo_kind_from_string(name);\n      is_dwo = 1;\n    }\n    \n    if (s != DW_Section_Null) {\n      if (sect_status[s]) {\n        Assert(!\"too many debug sections with identical name, picking first\");\n      } else {\n        sect_status[s] = 1;\n        DW_Section *d = &input.sec[s];\n        d->name       = push_str8_copy(arena, name);\n        d->data       = str8_substr(raw_image, raw_data_range);\n        d->is_dwo     = is_dwo;\n      }\n    }\n  }\n  \n  return input;\n}\n"
  },
  {
    "path": "src/dwarf/dwarf_coff.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_COFF_H\n#define DWARF_COFF_H\n\ninternal B32 dw_is_dwarf_present_coff_section_table(String8 string_table, U64 section_count, COFF_SectionHeader *section_table);\ninternal DW_Input dw_input_from_coff_section_table(Arena *arena, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *section_table);\n\n#endif // DWARF_COFF_H\n\n"
  },
  {
    "path": "src/dwarf/dwarf_dump.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: Stringification Helpers\n\ninternal String8\ndw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 reg_str = dw_string_from_register(scratch.arena, arch, reg_idx);\n  String8 result;\n  if (reg_off != 0) {\n    result = push_str8f(arena, \"%S%+lld\", reg_str, reg_off);\n  } else {\n    result = reg_str;\n  }\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\ndw_string_from_reg(Arena *arena, Arch arch, DW_Reg reg_idx)\n{\n  return dw_string_from_reg_off(arena, arch, reg_idx, 0);\n}\n\ninternal String8List\ndw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List result = {0};\n  for (U64 cursor = 0; cursor < raw_data.size; ) {\n    U8 op = 0;\n    cursor += str8_deserial_read_struct(raw_data, cursor, &op);\n    \n    String8 op_value   = str8_zero();\n    U64     size_param = 0;\n    B32     is_signed  = 0;\n    switch (op) {\n      case DW_ExprOp_Lit0:  case DW_ExprOp_Lit1:  case DW_ExprOp_Lit2:\n      case DW_ExprOp_Lit3:  case DW_ExprOp_Lit4:  case DW_ExprOp_Lit5:\n      case DW_ExprOp_Lit6:  case DW_ExprOp_Lit7:  case DW_ExprOp_Lit8:\n      case DW_ExprOp_Lit9:  case DW_ExprOp_Lit10: case DW_ExprOp_Lit11:\n      case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14:\n      case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17:\n      case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20:\n      case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23:\n      case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26:\n      case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29:\n      case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: {\n        U64 x = op - DW_ExprOp_Lit0;\n        op_value = push_str8f(scratch.arena, \"%llu\", x);\n      } break;\n      \n      case DW_ExprOp_Const1U:size_param = 1;                goto const_n;\n      case DW_ExprOp_Const2U:size_param = 2;                goto const_n;\n      case DW_ExprOp_Const4U:size_param = 4;                goto const_n;\n      case DW_ExprOp_Const8U:size_param = 8;                goto const_n;\n      case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n;\n      case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n;\n      case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n;\n      case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n;\n      const_n:\n      {\n        if (is_signed) {\n          S64 x = 0;\n          cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1);\n          x = extend_sign64(x, size_param);\n          op_value = push_str8f(scratch.arena, \"%lld\", x);\n        } else {\n          U64 x = 0;\n          cursor += str8_deserial_read(raw_data, cursor, &x, size_param, 1);\n          op_value = push_str8f(scratch.arena, \"%llu\", x);\n        }\n      } break;\n      \n      case DW_ExprOp_Addr: {\n        U64 addr = 0;\n        cursor += str8_deserial_read(raw_data, cursor, &addr, addr_size, 1);\n        op_value = push_str8f(scratch.arena, \"%#llx\", addr);\n      } break;\n      \n      case DW_ExprOp_ConstU: {\n        U64 x = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &x);\n        op_value = push_str8f(scratch.arena, \"%llu\", x);\n      } break;\n      \n      case DW_ExprOp_ConstS: {\n        S64 x = 0;\n        cursor += str8_deserial_read_sleb128(raw_data, cursor, &x);\n        op_value = push_str8f(scratch.arena, \"%lld\", x);\n      } break;\n      \n      case DW_ExprOp_Reg0:  case DW_ExprOp_Reg1:  case DW_ExprOp_Reg2:\n      case DW_ExprOp_Reg3:  case DW_ExprOp_Reg4:  case DW_ExprOp_Reg5:\n      case DW_ExprOp_Reg6:  case DW_ExprOp_Reg7:  case DW_ExprOp_Reg8:\n      case DW_ExprOp_Reg9:  case DW_ExprOp_Reg10: case DW_ExprOp_Reg11:\n      case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14:\n      case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17:\n      case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20:\n      case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23:\n      case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26:\n      case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29:\n      case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: {\n        U64 reg_idx = op - DW_ExprOp_Reg0;\n        op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, 0);\n      } break;\n      \n      case DW_ExprOp_RegX: {\n        U64 reg_idx = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &reg_idx);\n        op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, 0);\n      } break;\n      \n      case DW_ExprOp_ImplicitValue: {\n        U64 value_size = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &value_size);\n        Rng1U64 value_range = rng_1u64(cursor, cursor + value_size);\n        String8 value_data  = str8_substr(raw_data, value_range);\n        cursor += value_size;\n        String8List value_strings = numeric_str8_list_from_data(scratch.arena, 16, value_data, 1);\n        op_value = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.pre = str8_lit(\"{ \"), .sep = str8_lit(\", \"), .post = str8_lit(\" }\")});\n      } break;\n      \n      case DW_ExprOp_Piece: {\n        U64 size = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &size);\n        op_value = push_str8f(scratch.arena, \"%u\", size);\n      } break;\n      \n      case DW_ExprOp_BitPiece: {\n        U64 bit_size = 0, bit_off = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_size);\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &bit_off);\n        op_value = push_str8f(scratch.arena, \"bit size %llu, bit offset %llu\", bit_size, bit_off);\n      } break;\n      \n      case DW_ExprOp_Pick: {\n        U8 stack_idx = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &stack_idx);\n        op_value = push_str8f(scratch.arena, \"stack index %u\", stack_idx);\n      } break;\n      \n      case DW_ExprOp_PlusUConst: {\n        U64 addend = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &addend);\n        op_value = push_str8f(arena, \"addend %llu\", addend);\n      } break;\n      \n      case DW_ExprOp_Skip: {\n        S16 x = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &x);\n        op_value = push_str8f(scratch.arena, \"%+d bytes\", x);\n      } break;\n      \n      case DW_ExprOp_Bra: {\n        S16 x = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &x);\n        op_value = push_str8f(scratch.arena, \"%+d\", x);\n      } break;\n      \n      case DW_ExprOp_BReg0:  case DW_ExprOp_BReg1:  case DW_ExprOp_BReg2: \n      case DW_ExprOp_BReg3:  case DW_ExprOp_BReg4:  case DW_ExprOp_BReg5: \n      case DW_ExprOp_BReg6:  case DW_ExprOp_BReg7:  case DW_ExprOp_BReg8:  \n      case DW_ExprOp_BReg9:  case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: \n      case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: \n      case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: \n      case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: \n      case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: \n      case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: \n      case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: \n      case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: {\n        U64 reg_idx = op - DW_ExprOp_BReg0;\n        S64 reg_off = 0;\n        cursor += str8_deserial_read_sleb128(raw_data, cursor, &reg_off);\n        op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, reg_off);\n      } break;\n      \n      case DW_ExprOp_FBReg: {\n        S64 reg_off = 0;\n        cursor += str8_deserial_read_sleb128(raw_data, cursor, &reg_off);\n        op_value = push_str8f(scratch.arena, \"offset %lld\", reg_off);\n      } break;\n      \n      case DW_ExprOp_BRegX: {\n        U64 reg_idx = 0;\n        S64 reg_off = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &reg_idx);\n        cursor += str8_deserial_read_sleb128(raw_data, cursor, &reg_off);\n        op_value = dw_string_from_reg_off(scratch.arena, arch, reg_idx, reg_off);\n      } break;\n      \n      case DW_ExprOp_XDerefSize:\n      case DW_ExprOp_DerefSize: {\n        U8 x = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &x);\n        op_value = push_str8f(scratch.arena, \"%u\", x);\n      } break;\n      \n      case DW_ExprOp_Call2: {\n        U16 x = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &x);\n        op_value = push_str8f(scratch.arena, \"%u\", x);\n      } break;\n      case DW_ExprOp_Call4: {\n        U32 x = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &x);\n        op_value = push_str8f(arena, \"%u\", x);\n      } break;\n      case DW_ExprOp_CallRef: {\n        U64 x = 0;\n        cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &x);\n        op_value = push_str8f(scratch.arena, \"%llu\", x);\n      } break;\n      case DW_ExprOp_ImplicitPointer:\n      case DW_ExprOp_GNU_ImplicitPointer: {\n        U64 info_off = 0;\n        cursor += str8_deserial_read_dwarf_uint(raw_data, cursor, format, &info_off);\n        S64 ptr = 0;\n        cursor += str8_deserial_read_sleb128(raw_data, cursor, &ptr);\n        \n        op_value = push_str8f(scratch.arena, \".debug_info+%#llx, ptr %llx\", info_off, ptr);\n      } break;\n      case DW_ExprOp_Convert:\n      case DW_ExprOp_GNU_Convert: {\n        U64 type_cu_off = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off);\n        op_value = push_str8f(scratch.arena, \"TypeCuOff %#llx\", cu_base + type_cu_off);\n      } break;\n      case DW_ExprOp_GNU_ParameterRef: {\n        // TODO: always 4 bytes?\n        U32 cu_off = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &cu_off);\n        op_value = push_str8f(scratch.arena, \"CuOff %#x\", cu_base + cu_off);\n      } break;\n      case DW_ExprOp_DerefType:\n      case DW_ExprOp_GNU_DerefType: {\n        U8  deref_size  = 0;\n        U64 type_cu_off = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &deref_size);\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off);\n        op_value = push_str8f(scratch.arena, \"%#x, TypeCuOff %#llx\", deref_size, cu_base + type_cu_off);\n      } break;\n      case DW_ExprOp_ConstType:\n      case DW_ExprOp_GNU_ConstType: {\n        U64 type_cu_off      = 0;\n        U8  const_value_size = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off);\n        cursor += str8_deserial_read_struct(raw_data, cursor, &const_value_size);\n        Rng1U64 const_value_range = rng_1u64(cursor, cursor + const_value_size);\n        String8 const_value_data  = str8_substr(raw_data, const_value_range);\n        String8List const_value_strings = numeric_str8_list_from_data(scratch.arena, 16, const_value_data, 1);\n        String8 const_value_str = str8_list_join(scratch.arena, &const_value_strings, &(StringJoin){.sep = str8_lit(\", \")});\n        op_value = push_str8f(scratch.arena, \"TypeCuOff %#llx, Const Value { %S }\", cu_base + type_cu_off, const_value_str);\n        cursor += const_value_size;\n      } break;\n      case DW_ExprOp_RegvalType:\n      case DW_ExprOp_GNU_RegvalType: {\n        U64 reg_idx = 0, type_cu_off = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &reg_idx);\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &type_cu_off);\n        op_value = push_str8f(scratch.arena, \"%S, TypeCuOff %#llx\", dw_string_from_register(scratch.arena, arch, reg_idx), cu_base + type_cu_off);\n      } break;\n      case DW_ExprOp_EntryValue:\n      case DW_ExprOp_GNU_EntryValue: {\n        U64 block_size = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &block_size);\n        Rng1U64     block_range = rng_1u64(cursor, cursor + block_size);\n        String8     block_data  = str8_substr(raw_data, block_range);\n        String8List block_expr  = dw_string_list_from_expression(scratch.arena, block_data, cu_base, addr_size, arch, ver, ext, format);\n        op_value = str8_list_join(scratch.arena, &block_expr, &(StringJoin){.pre = str8_lit(\"{ \"), .sep = str8_lit(\",\"), .post = str8_lit(\" }\")});\n        cursor += block_size;\n      } break;\n      case DW_ExprOp_Addrx: {\n        U64 addr = 0;\n        cursor += str8_deserial_read_uleb128(raw_data, cursor, &addr);\n        op_value = push_str8f(scratch.arena, \"%#llx\", addr);\n      } break;\n      \n      case DW_ExprOp_CallFrameCfa:\n      case DW_ExprOp_FormTlsAddress:\n      case DW_ExprOp_PushObjectAddress:\n      case DW_ExprOp_Nop:\n      case DW_ExprOp_Eq:\n      case DW_ExprOp_Ge:\n      case DW_ExprOp_Gt:\n      case DW_ExprOp_Le:\n      case DW_ExprOp_Lt:\n      case DW_ExprOp_Ne:\n      case DW_ExprOp_Shl:\n      case DW_ExprOp_Shr:\n      case DW_ExprOp_Shra:\n      case DW_ExprOp_Xor:\n      case DW_ExprOp_XDeref:\n      case DW_ExprOp_Abs:\n      case DW_ExprOp_And:\n      case DW_ExprOp_Div:\n      case DW_ExprOp_Minus:\n      case DW_ExprOp_Mod:\n      case DW_ExprOp_Mul:\n      case DW_ExprOp_Neg:\n      case DW_ExprOp_Not:\n      case DW_ExprOp_Or:\n      case DW_ExprOp_Plus:\n      case DW_ExprOp_Rot:\n      case DW_ExprOp_Swap:\n      case DW_ExprOp_Deref:\n      case DW_ExprOp_Dup:\n      case DW_ExprOp_Drop:\n      case DW_ExprOp_Over:\n      case DW_ExprOp_StackValue: {\n        // no operands\n      } break;\n    }\n    \n    String8 opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, op);\n    if (op_value.size == 0) {\n      str8_list_pushf(arena, &result, \"DW_OP_%S\", opcode_str);\n    } else {\n      str8_list_pushf(arena, &result, \"DW_OP_%S = %S\", opcode_str, op_value);\n    }\n  }\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\ndw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = dw_string_list_from_expression(scratch.arena, expr, cu_base, addr_size, arch, ver, ext, format);\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\n  return result;\n}\n\ninternal String8List\ndw_string_list_from_cfi_program(Arena              *arena,\n                                U64                 cu_base,\n                                Arch                arch,\n                                DW_Version          ver,\n                                DW_Ext              ext,\n                                DW_Format           format,\n                                U64                 pc_begin,\n                                DW_CIE             *cie,\n                                DW_DecodePtr       *decode_ptr_func,\n                                void               *deocde_ptr_ud,\n                                String8             program)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n  \n  U64 reg_max = dw_reg_count_from_arch(arch);\n  U64 pc = pc_begin;\n  for (U64 cursor = 0, inst_size; cursor < program.size; cursor += inst_size) {\n    // unpack instruction\n    DW_CFA_Inst            inst       = {0};\n    DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(program, cursor), cie->code_align_factor, cie->data_align_factor, 0, 0, &inst_size, &inst);\n    if (error_code == DW_CFA_ParseErrorCode_End) { break; }\n    if (error_code != DW_CFA_ParseErrorCode_NewInst) {\n      str8_list_pushf(arena, &list, \"ERROR: failed to unpack CFA instruction @ 0x%I64\", cursor);\n      break;\n    }\n    \n    // error check operands\n    DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst.opcode);\n    U64                operand_count = dw_operand_count_from_cfa_opcode(inst.opcode);\n    for EachIndex(operand_idx, operand_count) {\n      switch (operand_types[operand_idx]) {\n        case DW_CFA_OperandType_Null:  break;\n        case DW_CFA_OperandType_Value: break;\n        case DW_CFA_OperandType_Register: {\n          if (inst.operands[operand_idx].u64 >= reg_max) {\n            str8_list_pushf(arena, &list, \"ERROR: DW_CFA_%S @ 0x%I64x has an invalid register\",\n                            dw_string_from_cfa_opcode(inst.opcode),\n                            cursor);\n          }\n        } break;\n        case DW_CFA_OperandType_Expression: {\n          DW_Expr expr = dw_expr_from_data(scratch.arena, format, cie->address_size, inst.operands[operand_idx].block);\n          for EachNode(inst, DW_ExprInst, expr.first) {\n            if (dw_is_cfa_expr_opcode_invalid(inst->opcode)) {\n              String8 expr_opcode_str = dw_string_from_expr_op(scratch.arena, ver, ext, inst->opcode);\n              str8_list_pushf(arena, &list, \"ERROR: Exrepssion in DW_CFA_%S @ 0x%I64x has an invalid opcode DW_ExprOp_%S\", expr_opcode_str);\n            }\n          }\n        } break;\n        default: { InvalidPath; } break;\n      }\n    }\n    \n    // format operands\n    String8 operand_str = str8_lit(\"???\");\n    switch (inst.opcode) {\n      case DW_CFA_Nop: { operand_str = str8_zero(); } break;\n      case DW_CFA_SetLoc: {\n        operand_str = str8f(arena, \"0x%X\", inst.operands[0].u64);\n        pc = inst.operands[0].u64;\n      } break;\n      case DW_CFA_AdvanceLoc1: {\n        U64 delta = inst.operands[0].u64;\n        pc += delta;\n        operand_str = str8f(arena, \"%+u `PC 0x%I64x`\", delta, pc);\n      } break;\n      case DW_CFA_AdvanceLoc2: {\n        U64 delta = inst.operands[0].u64;\n        pc += delta;\n        operand_str = str8f(arena, \"%+u `PC 0x%I64x`\", delta, pc);\n      } break;\n      case DW_CFA_AdvanceLoc4: {\n        U64 delta = inst.operands[0].u64;\n        pc += delta;\n        operand_str = str8f(arena, \"%+u `PC 0x%I64x`\", delta, pc);\n      } break;\n      case DW_CFA_OffsetExt: {\n        U64 reg    = inst.operands[0].u64;\n        S64 offset = (S64)inst.operands[1].u64;\n        operand_str = dw_string_from_reg_off(arena, arch, reg, offset);\n      } break;\n      case DW_CFA_RestoreExt: { operand_str = str8_zero(); } break;\n      case DW_CFA_Undefined: {\n        operand_str = str8f(arena, \"%I64u\", inst.operands[0].u64);\n      } break;\n      case DW_CFA_SameValue: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0);\n      } break;\n      case DW_CFA_Register: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64);\n      } break;\n      case DW_CFA_RememberState: { operand_str = str8_zero(); } break;\n      case DW_CFA_RestoreState:  { operand_str = str8_zero(); } break;\n      case DW_CFA_DefCfa: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].u64);\n      } break;\n      case DW_CFA_DefCfaRegister: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0);\n      } break;\n      case DW_CFA_DefCfaOffset: {\n        operand_str = str8f(arena, \"+%I64u\", inst.operands[0].u64);\n      } break;\n      case DW_CFA_DefCfaExpr: {\n        operand_str = dw_string_from_expression(arena, inst.operands[0].block, cu_base, cie->address_size, arch, ver, ext, format);\n      } break;\n      case DW_CFA_Expr: {\n        String8 reg_str  = dw_string_from_reg_off(scratch.arena, arch, inst.operands[0].u64, 0);\n        String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format);\n        operand_str = str8f(arena, \"%S expression %S\", reg_str, expr_str);\n      } break;\n      case DW_CFA_OffsetExtSf: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64);\n      } break;\n      case DW_CFA_DefCfaSf: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, inst.operands[1].s64);\n      } break;\n      case DW_CFA_DefCfaOffsetSf: { operand_str = str8_zero(); } break;\n      case DW_CFA_ValOffset: {\n        operand_str = str8f(arena, \"value 0x%llx, offset %+I64d\", inst.operands[0].u64, inst.operands[1].u64);\n      } break;\n      case DW_CFA_ValOffsetSf: {\n        operand_str = str8f(arena, \"value %llu, offset %+I64d\", inst.operands[0].u64, inst.operands[1].s64);\n      } break;\n      case DW_CFA_ValExpr: {\n        String8 expr_str = dw_string_from_expression(scratch.arena, inst.operands[1].block, cu_base, cie->address_size, arch, ver, ext, format);\n        operand_str = str8f(arena, \"value +%I64u, expression %S\", inst.operands[0].u64, expr_str);\n      } break;\n      case DW_CFA_AdvanceLoc: {\n        U64 delta = inst.operands[0].u64;\n        pc += delta;\n        operand_str = str8f(arena, \"+%I64u `PC 0x%I64x`\", delta, pc);\n      } break;\n      case DW_CFA_Offset: {\n        U64 reg    = inst.operands[0].u64;\n        S64 offset = (S64)inst.operands[1].u64;\n        operand_str = dw_string_from_reg_off(arena, arch, reg, offset);\n      } break;\n      case DW_CFA_Restore: {\n        operand_str = dw_string_from_reg_off(arena, arch, inst.operands[0].u64, 0);\n      } break;\n      default: {\n        str8_list_pushf(arena, &list, \"ERROR: unknown CFA opcode 0x%I64u\", inst.opcode);\n      } goto exit;\n    }\n    \n    if (operand_str.size) {\n      str8_list_pushf(arena, &list, \"DW_CFA_%S: %S\", dw_string_from_cfa_opcode(inst.opcode), operand_str);\n    } else {\n      str8_list_pushf(arena, &list, \"DW_CFA_%S\", dw_string_from_cfa_opcode(inst.opcode));\n    }\n  }\n  \n  exit:;\n  scratch_end(scratch);\n  return list;\n}\n\ninternal String8\ndw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa)\n{\n  String8 cfa_str = str8_lit(\"???\");\n  switch (cfa.rule) {\n    case DW_CFA_Rule_Null: {} break;\n    case DW_CFA_Rule_RegOff:     { cfa_str = dw_string_from_reg_off(arena, arch, cfa.reg, cfa.off); } break;\n    case DW_CFA_Rule_Expression: { cfa_str = dw_string_from_expression(arena, cfa.expr, max_U64, address_size, arch, version, ext, format); } break;\n    default: { InvalidPath; } break;\n  }\n  return cfa_str;\n}\n\ninternal String8\ndw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List cfi_regs_list = {0};\n  U64 reg_count = dw_reg_count_from_arch(arch);\n  for EachIndex(reg_idx, reg_count) {\n    DW_CFI_Register *cfi_reg = &row->regs[reg_idx];\n    String8 rule_str = str8_lit(\"???\");\n    switch (cfi_reg->rule) {\n      case DW_CFI_RegisterRule_Undefined: {\n        rule_str = str8f(scratch.arena, \"Undefined(%S)\", dw_string_from_reg(scratch.arena, arch, cfi_reg->n));\n      } break;\n      case DW_CFI_RegisterRule_SameValue: {\n        rule_str = str8_zero();\n      } break;\n      case DW_CFI_RegisterRule_Offset: {\n        rule_str = str8f(scratch.arena, \"[CFA%+I64d]\", cfi_reg->n);\n      } break;\n      case DW_CFI_RegisterRule_ValOffset: {\n        rule_str = str8f(scratch.arena, \"Val(CFA%+I64d)\", cfi_reg->n);\n      } break;\n      case DW_CFI_RegisterRule_Register: {\n        rule_str = str8f(scratch.arena, \"Register(%S)\", dw_string_from_reg(scratch.arena, arch, cfi_reg->n));\n      } break;\n      case DW_CFI_RegisterRule_Expression: {\n        rule_str = str8f(scratch.arena, \"Expression(%S)\", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format));\n      } break;\n      case DW_CFI_RegisterRule_ValExpression: {\n        rule_str = str8f(scratch.arena, \"ValExpression(%S)\", dw_string_from_expression(scratch.arena, cfi_reg->expr, max_U64, address_size, arch, version, ext, format));\n      } break;\n      case DW_CFI_RegisterRule_Architectural: {\n        rule_str = str8_lit(\"???\");\n      } break;\n      default: { InvalidPath; } break;\n    }\n    \n    if (rule_str.size) {\n      str8_list_pushf(scratch.arena, &cfi_regs_list, \"%S: %S\", dw_string_from_reg(scratch.arena, arch, reg_idx), rule_str);\n    }\n  }\n  \n  String8 string = str8_list_join(arena, &cfi_regs_list, &(StringJoin){.sep=str8_lit(\", \")});\n  \n  scratch_end(scratch);\n  return string;\n}\n\ninternal String8\ndw_single_line_string_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 address_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format)\n{\n  Temp        scratch    = scratch_begin(&arena, 1);\n  String8List list       = dw_string_list_from_expression(scratch.arena, raw_data, cu_base, address_size, arch, ver, ext, format);\n  String8     expression = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\n  scratch_end(scratch);\n  return expression;\n}\n\n#if 0\n\ninternal String8\nw_string_from_eh_ptr_enc(Arena *arena, EH_PtrEnc enc)\n{\n  U8 type = enc & EH_PtrEnc_TypeMask;\n  String8 type_str = str8_lit(\"NULL\");\n  switch (type) {\n    case EH_PtrEnc_Ptr:     type_str = str8_lit(\"PTR\");      break;\n    case EH_PtrEnc_ULEB128: type_str = str8_lit(\"ULEB128\");  break;\n    case EH_PtrEnc_UData2:  type_str = str8_lit(\"UDATA2\");   break;\n    case EH_PtrEnc_UData4:  type_str = str8_lit(\"UDATA4\");   break;\n    case EH_PtrEnc_UData8:  type_str = str8_lit(\"UDATA8\");   break;\n    case EH_PtrEnc_Signed:  type_str = str8_lit(\"SIGNED\");   break;\n    case EH_PtrEnc_SLEB128: type_str = str8_lit(\"SLEB128\");  break;\n    case EH_PtrEnc_SData2:  type_str = str8_lit(\"SDATA2\");   break;\n    case EH_PtrEnc_SData4:  type_str = str8_lit(\"SDATA4\");   break;\n    case EH_PtrEnc_SData8:  type_str = str8_lit(\"SDATA8\");   break;\n  }\n  U8 modifier = enc & EH_PtrEnc_ModifyMask;\n  String8 modifier_str = str8_lit(\"NULL\");\n  switch (modifier) {\n    case EH_PtrEnc_PcRel:   modifier_str = str8_lit(\"PCREL\");   break;\n    case EH_PtrEnc_TextRel: modifier_str = str8_lit(\"TEXTREL\"); break;\n    case EH_PtrEnc_DataRel: modifier_str = str8_lit(\"DATAREL\"); break;\n    case EH_PtrEnc_FuncRel: modifier_str = str8_lit(\"FUNCREL\"); break;\n  }\n  String8 indir_str = str8_lit(\"\");\n  if (enc & EH_PtrEnc_Indirect) {\n    indir_str = str8_lit(\"(INDIRECT)\");\n  }\n  return push_str8f(arena, \"Type: %S, Modifier: %S %S\", type_str, modifier_str, indir_str);\n}\n\ninternal void\ndw_print_eh_frame(Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  DW_CIE cie = {0};\n  \n  for (U64 cursor = 0; cursor < raw_eh_frame.size; ) {\n    U64 header_offset = cursor;\n    \n    U64 length = 0; // doesn't include bytes for size\n    cursor += dw_based_range_read_length(raw_eh_frame.str, rng_1u64(0,raw_eh_frame.size), cursor, &length);\n    \n    if (length == 0) {\n      break; // encountered exit marker\n    }\n    \n    U64 entry_start = cursor;\n    U64 entry_end   = cursor + length;\n    \n    U32 entry_id = 0; // always 4-bytes, even when length is encoded as 64-bit integer\n    cursor += str8_deserial_read_struct(raw_eh_frame, cursor, &entry_id);\n    \n    // TODO: fix the freaking EH_PtrEnc_PCREL encoding.\n    // it assumes \"frame_base\" points to the first byte of .eh_frame\n    // but here base is start of ELF and we use range to select .eh_frame\n    // bytes to read, which breaks parsing.\n    String8 raw_frame = str8_substr(raw_eh_frame, rng_1u64(cursor, cursor + length - sizeof(entry_id)));\n    Rng1U64 cfi_range = rng_1u64(0,0);\n    \n    // CIE\n    if (entry_id == 0) {\n      dw_unwind_parse_cie_x64(raw_frame.str, rng_1u64(0,raw_frame.size), ptr_ctx, 0, &cie);\n      cfi_range = cie.cfi_range;\n      \n      rd_printf(\"CIE @ 0x%X, Length %u\", header_offset, length);\n      rd_indent();\n      rd_printf(\"LSDA Encoding:           %S\",    dw_string_from_eh_ptr_enc(scratch.arena, cie.lsda_encoding));\n      rd_printf(\"Address Encoding:        %S\",    dw_string_from_eh_ptr_enc(scratch.arena, cie.addr_encoding));\n      rd_printf(\"Augmentation:            %S\",    cie.augmentation);\n      rd_printf(\"Code Align Factor:       %llu\",  cie.code_align_factor);\n      rd_printf(\"Data Align Factor:       %lld\",  cie.data_align_factor);\n      rd_printf(\"Return Address Register: %u\",    cie.ret_addr_reg);\n      rd_printf(\"Handler IP:              %#llx\", cie.handler_ip);\n      rd_unindent();\n    }\n    // FDE\n    else {\n      DW_FDE fde = {0};\n      dw_unwind_parse_fde_x64(raw_eh_frame.str, rng_1u64(0,raw_eh_frame.size), ptr_ctx, &cie, 0, &fde);\n      cfi_range = fde.cfi_range;\n      \n      // calc parent CIE offset\n      AssertAlways(entry_start >= entry_id);\n      U64 cie_offset = entry_start - entry_id; NotImplemented; // TODO: syms_safe_sub_u64(range.min + entry_start, entry_id);\n      \n      rd_printf(\"FDE @ %#llx, Length %u, Parent CIE @ %#llx\", header_offset, length, cie_offset);\n      rd_indent();\n      rd_printf(\"IP Range: %#llx-%#llx\", fde.ip_voff_range.min, fde.ip_voff_range.max);\n      rd_printf(\"LSDA IP:  %#llx\",       fde.lsda_ip);\n      rd_unindent();\n    }\n    \n    // print CFI program\n    rd_printf(\"CFI Program:\");\n    rd_indent();\n    \n    DW_Format format  = DW_FormatFromSize(length);\n    String8   raw_cfi = str8_substr(raw_eh_frame, cfi_range);\n    dw_string_from_cfi_program(scratch.arena, out, indent, raw_cfi, &cie, ptr_ctx, arch, ver, ext, format);\n    \n    rd_unindent();\n    rd_newline();\n    \n    // advance to next entry\n    cursor = entry_end;\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ndw_print_debug_loc(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed)\n{\n#if 0\n  DW_Section info = input->sec[DW_Section_Info];\n  DW_Section loc  = input->sec[DW_Section_Loc];\n  \n  if (loc.data.size == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", input->sec[DW_Section_Loc].name);\n  rd_indent();\n  \n  // TODO: warn about overlaps in ranges\n  \n  Rng1U64List cu_range_list = dw_comp_unit_ranges_from_info(scratch.arena, info);\n  \n  // parse debug_info for attributes with LOCLIST and store .debug_loc offsets \n  U64List    *loc_lists     = push_array(scratch.arena, U64List,    cu_range_list.count);\n  U64        *address_sizes = push_array(scratch.arena, U64,        cu_range_list.count);\n  U64        *address_bases = push_array(scratch.arena, U64,        cu_range_list.count);\n  U64        *cu_bases      = push_array(scratch.arena, U64,        cu_range_list.count);\n  DW_Version *ver_arr       = push_array(scratch.arena, DW_Version, cu_range_list.count);\n  DW_Ext     *ext_arr       = push_array(scratch.arena, DW_Ext,     cu_range_list.count);\n  \n  U64 comp_idx = 0;\n  for (Rng1U64Node *cu_range_n = cu_range_list.first; cu_range_n != 0; cu_range_n = cu_range_n->next, ++comp_idx) {\n    Temp comp_temp = temp_begin(arena);\n    \n    Rng1U64     cu_range = cu_range_n->v;\n    DW_CompUnit cu       = dw_comp_unit_from_info_off(comp_temp.arena, input, cu_range.min, relaxed);\n    \n    // store info about comp unit\n    address_sizes[comp_idx] = cu.address_size;\n    address_bases[comp_idx] = cu.base_addr;\n    ver_arr[comp_idx]       = cu.version;\n    cu_bases[comp_idx]      = cu_range_n->v.min;\n    \n    // parse tags\n    for (U64 info_off = cu.tags_range.min; info_off < cu.tags_range.max; /* empty */) {\n      Temp tag_temp = temp_begin(scratch.arena);\n      \n      DW_Tag tag = dw_tag_from_info_offset_cu(tag_temp.arena, input, &cu, ext_arr[comp_idx], info_off);\n      \n      // parse attribs\n      for (DW_AttribNode *attrib_node = tag.attribs.first; attrib_node != 0; attrib_node = attrib_node->next) {\n        DW_Attrib *attrib         = &attrib_node->v;\n        B32        is_sect_offset = attrib->value_class == DW_AttribClass_LocListPtr || (attrib->value_class == DW_AttribClass_LocList && attrib->form_kind == DW_Form_SecOffset);\n        B32        is_sect_index  = attrib->value_class == DW_AttribClass_LocList && attrib->form_kind == DW_Form_LocListx;\n        if (is_sect_offset) {\n          u64_list_push(scratch.arena, &loc_lists[comp_idx], attrib->value.v[0]);\n        } else if (is_sect_index) {\n          // TODO: support for section indexing\n        }\n      }\n      \n      // advance to next tag\n      info_off = tag.next_info_off;\n      \n      temp_end(tag_temp);\n    }\n    \n    temp_end(comp_temp);\n  }\n  \n  void    *base  = dw_base_from_sec(input, DW_Section_Loc);\n  Rng1U64  range = dw_range_from_sec(input, DW_Section_Loc);\n  \n  rd_printf(\".debug_loc\");\n  rd_indent();\n  rd_printf(\"%-8s %-8s %-8s %s\", \"Offset\", \"Min\", \"Max\", \"Expression\");\n  for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) {\n    Temp locs_temp = temp_begin(scratch.arena);\n    \n    DW_Version ver = ver_arr[comp_idx];\n    DW_Ext     ext = ext_arr[comp_idx];\n    \n    U64Array locs = u64_array_from_list(locs_temp.arena, &loc_lists[comp_idx]);\n    u64_array_sort(locs.count, locs.v);\n    \n    U64Array locs_set      = remove_duplicates_u64_array(locs_temp.arena, locs);\n    U64      address_size  = address_sizes[comp_idx];\n    U64      base_selector = (address_size == 8) ? max_U64 : max_U32;\n    \n    for (U64 loc_idx = 0; loc_idx < locs_set.count; ++loc_idx) {\n      U64 base_address = address_bases[comp_idx];\n      for (U64 cursor = locs_set.v[loc_idx]; cursor < dim_1u64(range); /* empty */) {\n        Temp range_temp = temp_begin(arena);\n        \n        String8List list = {0};\n        \n        // offset\n        str8_list_pushf(range_temp.arena, &list, \"%08llx\", cursor);\n        \n        // parse entry\n        U64 v0 = 0, v1 = 0;\n        cursor += dw_based_range_read(base, range, cursor, address_size, &v0);\n        cursor += dw_based_range_read(base, range, cursor, address_size, &v1);\n        \n        B32 is_list_end = v0 == 0 && v1 == 0;\n        if (is_list_end) {\n          str8_list_pushf(range_temp.arena, &list, \"<LIST END>\");\n        } else if (v0 == base_selector) {\n          base_address = v1;\n        } else {\n          U16 expr_size = 0;\n          cursor += dw_based_range_read_struct(base, range, cursor, &expr_size);\n          Rng1U64 expr_range = rng_1u64(range.min+cursor, range.min+cursor+expr_size);\n          cursor += expr_size;\n          \n          // format dwarf expression\n          B32     is_dwarf64 = (address_size == 8);\n          String8 raw_expr   = str8((U8*)base+expr_range.min, dim_1u64(expr_range));\n          String8 expression = dw_single_line_string_from_expression(range_temp.arena, raw_expr, cu_bases[comp_idx], address_size, arch, ver, ext, input->sec[DW_Section_Loc].mode);\n          \n          // push entry\n          U64 min = base_address + v0;\n          U64 max = base_address + v1;\n          str8_list_pushf(range_temp.arena, &list, \"%08llx %08llx %S\", min, max, expression);\n        }\n        \n        // print entry\n        String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(\" \")});\n        rd_printf(\"%S\", print);\n        \n        // cleanup temp\n        temp_end(range_temp);\n        \n        // exit check\n        if (is_list_end) {\n          break;\n        }\n      }\n    }\n    \n    temp_end(locs_temp);\n  }\n  rd_unindent();\n  \n  rd_unindent();\n  scratch_end(scratch);\n#endif\n}\n\ninternal void\ndw_print_debug_ranges(Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed)\n{\n  NotImplemented;\n#if 0\n  DW_Section  ranges = input->sec[DW_Section_Ranges];\n  void       *base   = dw_base_from_sec(input, DW_Section_Ranges);\n  Rng1U64     range  = dw_range_from_sec(input, DW_Section_Ranges);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  Rng1U64List  cu_range_list = dw_comp_unit_ranges_from_info(scratch.arena, sections->v[DW_Section_Info]);\n  \n  // parse debug_info for attributes with LOCLIST and store .debug_loc offsets \n  U64List *loc_lists     = push_array(scratch.arena, U64List, cu_range_list.count);\n  U64     *address_sizes = push_array(scratch.arena, U64,     cu_range_list.count);\n  U64     *address_bases = push_array(scratch.arena, U64,     cu_range_list.count);\n  \n  {\n    U64 comp_idx = 0;\n    for (Rng1U64Node *cu_range_n = cu_range_list.first; cu_range_n != 0; cu_range_n = cu_range_n->next, ++comp_idx) {\n      Rng1U64     cu_range = cu_range_n->v;\n      DW_CompUnit cu       = dw_comp_unit_from_info_offset(scratch.arena, sections, cu_range.min, relaxed);\n      \n      // store info about comp unit\n      address_sizes[comp_idx] = cu.address_size;\n      address_bases[comp_idx] = cu.base_addr;\n      \n      // parse tags\n      for (U64 info_off = cu.tags_range.min; info_off < cu.tags_range.max; /* empty */) {\n        DW_Tag tag = dw_tag_from_info_offset_cu(scratch.arena, sections, &cu, info_off);\n        \n        // parse attribs\n        for (DW_AttribNode *attrib_node = tag.attribs.first; attrib_node != 0; attrib_node = attrib_node->next) {\n          DW_Attrib *attrib         = &attrib_node->v;\n          B32        is_sect_offset = attrib->value_class == DW_AttribClass_RngListPtr || (attrib->value_class == DW_AttribClass_RngList && attrib->form_kind == DW_Form_SecOffset);\n          B32        is_sect_index  = attrib->value_class == DW_AttribClass_RngList && attrib->form_kind == DW_Form_RngListx;\n          if (is_sect_offset) {\n            u64_list_push(scratch.arena, &loc_lists[comp_idx], attrib->value.v[0]);\n          } else if (is_sect_index) {\n            // TODO: support for section indexing\n          }\n        }\n        \n        info_off = tag.next_info_off;\n      }\n    }\n  }\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_Ranges].name);\n  rd_indent();\n  rd_printf(\"%-8s %-8s %-8s\", \"Offset\", \"Min\", \"Max\");\n  for (U32 comp_idx = 0; comp_idx < cu_range_list.count; ++comp_idx) {\n    U64Array locs = u64_array_from_list(scratch.arena, &loc_lists[comp_idx]);\n    u64_array_sort(locs.count, locs.v);\n    U64Array locs_set      = remove_duplicates_u64_array(scratch.arena, locs);\n    U64      address_size  = address_sizes[comp_idx];\n    U64      base_selector = (address_size == 8) ? max_U64 : max_U32;\n    \n    for (U64 loc_idx = 0; loc_idx < locs_set.count; ++loc_idx) {\n      U64 base_address = address_bases[comp_idx];\n      for (U64 cursor = locs_set.v[loc_idx]; cursor < dim_1u64(range); /* empty */) {\n        Temp range_temp = temp_begin(scratch.arena);\n        \n        String8List list = {0};\n        \n        // offset\n        str8_list_pushf(range_temp.arena, &list, \"%08llx\", cursor);\n        \n        // parse entry\n        U64 v0 = 0, v1 = 0;\n        cursor += dw_based_range_read(base, range, cursor, address_size, &v0);\n        cursor += dw_based_range_read(base, range, cursor, address_size, &v1);\n        \n        B32 is_list_end = v0 == 0 && v1 == 0;\n        if (is_list_end) {\n          str8_list_pushf(range_temp.arena, &list, \"<LIST END>\");\n        } else if (v0 == base_selector) {\n          base_address = v1;\n        } else {\n          // push entry\n          U64 min = base_address + v0;\n          U64 max = base_address + v1;\n          str8_list_pushf(range_temp.arena, &list, \"%08llx %08llx\", min, max);\n        }\n        \n        // print entry\n        String8 print = str8_list_join(range_temp.arena, &list, &(StringJoin){.sep=str8_lit(\" \")});\n        rd_printf(\"%S\", print);\n        \n        temp_end(range_temp);\n        \n        // exit check\n        if (is_list_end) {\n          break;\n        }\n      }\n    }\n  }\n#endif\n}\n\ninternal void\ndw_print_debug_aranges(Arena *arena, String8List *out, String8 indent, DW_Input *input)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, DW_Section_ARanges);\n  Rng1U64  range = dw_range_from_sec(sections, DW_Section_ARanges);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_ARanges].name);\n  rd_indent();\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64        unit_length           = 0;\n    DW_Version version               = 0;\n    U64        debug_info_offset     = 0;\n    U8         address_size          = 0;\n    U8         segment_selector_size = 0;\n    \n    cursor += dw_based_range_read_length(base, range, cursor, &unit_length);\n    U64 unit_opl = cursor + unit_length;\n    cursor += dw_based_range_read_struct(base, range, cursor, &version);\n    \n    B32 is_dwarf64 = unit_length >= max_U32;\n    U64 int_size   = is_dwarf64 ? sizeof(U64) : sizeof(U32);\n    cursor += dw_based_range_read(base, range, cursor, int_size, &debug_info_offset);\n    \n    cursor += dw_based_range_read_struct(base, range, cursor, &address_size);\n    cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size);\n    \n    U64 tuple_size                  = address_size * 2 + segment_selector_size;\n    U64 bytes_too_far_past_boundary = cursor % tuple_size;\n    if (bytes_too_far_past_boundary > 0) {\n      cursor += tuple_size - bytes_too_far_past_boundary;\n    }\n    \n    rd_printf(\"Unit length:           %llu\",  unit_length);\n    rd_printf(\"Version:               %u\",    version);\n    rd_printf(\"Debug info offset:     %#llx\", debug_info_offset);\n    rd_printf(\"Address size:          %u\",    address_size);\n    rd_printf(\"Segment selector size: %u\",    segment_selector_size);\n    \n    if (version != DW_Version_2) {\n      rd_warningf(\"Version value must be 2 (DWARF5 sepc, Feb 13, 2017)\");\n    }\n    \n    rd_indent();\n    rd_printf(\"%-8s %-8s\", \"Offset\", \"Range\");\n    for (; cursor < unit_opl; ) {\n      Temp temp = temp_begin(arena);\n      \n      String8List list = {0};\n      \n      str8_list_pushf(temp.arena, &list, \"%08llx\", cursor);\n      \n      U64 segment_selector = 0;\n      U64 address          = 0;\n      U64 length           = 0;\n      cursor += dw_based_range_read(base, range, cursor, segment_selector_size, &segment_selector);\n      cursor += dw_based_range_read(base, range, cursor, address_size, &address);\n      cursor += dw_based_range_read(base, range, cursor, address_size, &length);\n      \n      if (segment_selector == 0 && address == 0 && length == 0) {\n        str8_list_pushf(temp.arena, &list, \"<LIST END>\");\n      } else {\n        if (segment_selector != 0) {\n          str8_list_pushf(temp.arena, &list, \"%02llu:\", segment_selector);\n        }\n        str8_list_pushf(temp.arena, &list, \"%llx-%llx\", address, address+length);\n      }\n      \n      String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(\" \") });\n      rd_printf(\"%S\", print);\n      \n      temp_end(temp);\n    }\n    rd_unindent();\n    rd_newline();\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\ninternal void\ndw_print_debug_addr(Arena *arena, String8List *out, String8 indent, DW_Input *input)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, DW_Section_Addr);\n  Rng1U64  range = dw_range_from_sec(sections, DW_Section_Addr);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_Addr].name);\n  rd_indent();\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64        unit_length           = 0;\n    DW_Version version               = 0;\n    U8         address_size          = 0;\n    U8         segment_selector_size = 0;\n    \n    U64 unit_offset = cursor;\n    cursor += dw_based_range_read_length(base, range, cursor, &unit_length);\n    \n    U64 unit_opl = cursor + unit_length;\n    cursor += dw_based_range_read_struct(base, range, cursor, &version);\n    cursor += dw_based_range_read_struct(base, range, cursor, &address_size);\n    cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size);\n    \n    U64 tuple_size                  = address_size * 2 + segment_selector_size;\n    U64 bytes_too_far_past_boundary = cursor % tuple_size;\n    if (bytes_too_far_past_boundary > 0) {\n      cursor += tuple_size - bytes_too_far_past_boundary;\n    }\n    \n    rd_printf(\"Unit @ %#llx, length %llu\", unit_offset, unit_length);\n    rd_printf(\"Version:               %u\", version);\n    rd_printf(\"Address size:          %u\", address_size);\n    rd_printf(\"Segment selector size: %u\", segment_selector_size);\n    \n    if (version != DW_Version_2) {\n      rd_warningf(\"Version value must be 5 (DWARF5 sepc, Feb 13, 2017)\");\n    }\n    \n    rd_indent();\n    rd_printf(\"%-8s %-8s\", \"Offset\", \"Address\");\n    for (; cursor < unit_opl; ) {\n      Temp temp = temp_begin(arena);\n      \n      String8List list = {0};\n      \n      str8_list_pushf(temp.arena, &list, \"%08X\", cursor);\n      \n      U64 segment_selector = 0;\n      U64 address          = 0;\n      cursor += dw_based_range_read(base, range, cursor, segment_selector_size, &segment_selector);\n      cursor += dw_based_range_read(base, range, cursor, address_size, &address);\n      \n      if (segment_selector == 0 && address == 0) {\n        str8_list_pushf(temp.arena, &list, \"<LIST END>\");\n      } else {\n        if (segment_selector != 0) {\n          str8_list_pushf(temp.arena, &list, \"%02u:\", segment_selector);\n        }\n        str8_list_pushf(temp.arena, &list, \"%llx\", address);\n      }\n      \n      String8 print = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\" \")});\n      rd_printf(\"%S\", print);\n      \n      temp_end(temp);\n    }\n    rd_unindent();\n    rd_newline();\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\ninternal U64\ndw_based_range_read_address(void *base, Rng1U64 range, U64 offset, Rng1U64Array segment_ranges, U8 segment_selector_size, U8 address_size, U64 *address_out)\n{\n  U64 read_offset = offset;\n  \n  // read segment\n  U64 segment_selector = 0;\n  read_offset += dw_based_range_read(base, range, read_offset, segment_selector_size, &segment_selector);\n  \n  // read address\n  U64 address = 0;\n  read_offset += dw_based_range_read(base, range, read_offset, address_size, &address);\n  \n  // apply segment offset\n  B32 is_address_segment_relative = segment_selector_size > 0;\n  if (is_address_segment_relative) {\n    if (segment_selector < segment_ranges.count) {\n      address += segment_ranges.v[segment_selector].min;\n    } else {\n      Assert(!\"invalid segment selector\");\n    }\n  }\n  \n  U64 read_size = (read_offset - offset);\n  return read_size;\n}\n\ninternal void\ndw_print_debug_loclists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_virtual_ranges, Arch arch)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, DW_Section_LocLists);\n  Rng1U64  range = dw_range_from_sec(sections, DW_Section_LocLists);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_LocLists].name);\n  rd_indent();\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64 unit_offset = cursor;\n    U64 unit_length = 0;\n    cursor += dw_based_range_read_length(base, range, cursor, &unit_length);\n    \n    U64        unit_opl              = cursor + unit_length;\n    DW_Version version               = 0;\n    U8         address_size          = 0;\n    U8         segment_selector_size = 0;\n    U32        offset_entry_count    = 0;\n    cursor += dw_based_range_read_struct(base, range, cursor, &version);\n    cursor += dw_based_range_read_struct(base, range, cursor, &address_size);\n    cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size);\n    cursor += dw_based_range_read_struct(base, range, cursor, &offset_entry_count);\n    \n    U64 past_header_offset = cursor;\n    B32 is_dwarf64         = unit_length > max_U32;\n    U64 offset_size        = is_dwarf64 ? sizeof(U64) : sizeof(U32);\n    \n    rd_printf(\"Unit @ %#llx, length %llu\", unit_offset, unit_length);\n    rd_printf(\"Version:               %u\", version);\n    rd_printf(\"Address size:          %u\", address_size);\n    rd_printf(\"Segment selector size: %u\", segment_selector_size);\n    rd_printf(\"Offset entry count:    %u\", offset_entry_count);\n    if (version != DW_Version_5) {\n      rd_warningf(\"Version value must be 5 (DWARF5 sepc, Feb 13, 2017)\");\n    }\n    \n    if (offset_entry_count > 0) {\n      rd_printf(\"Offsets:\");\n      rd_indent();\n      rd_printf(\"%-8s %-8s\", \"Index\", \"Offset\");\n      for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) {\n        U64 offset = 0;\n        cursor += dw_based_range_read(base, range, cursor, offset_size, &offset);\n        rd_printf(\"%-8llu %llx\", offset_idx, offset+past_header_offset);\n      }\n      rd_unindent();\n    }\n    \n    rd_printf(\"Locations:\");\n    rd_indent();\n    rd_printf(\"%-8s %-8s\", \"Offset\", \"Location\");\n    for (; cursor < unit_opl; ) {\n      Temp temp = temp_begin(arena);\n      \n      String8List list = {0};\n      \n      str8_list_pushf(temp.arena, &list, \"%08llx\", cursor);\n      \n      U8 kind = 0;\n      cursor += dw_based_range_read_struct(base, range, cursor, &kind);\n      str8_list_pushf(temp.arena, &list, \"DW_LLE_%S\", dw_string_from_loc_list_entry_kind(temp.arena, kind));\n      \n      B32 has_loc_desc = 0;\n      switch (kind) {\n        case DW_LocListEntryKind_EndOfList:\n        break;\n        case DW_LocListEntryKind_DefaultLocation: {\n          has_loc_desc = 1;\n        } break;\n        case DW_LocListEntryKind_BaseAddress: {\n          U64 base_address = 0;\n          cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &base_address);\n          str8_list_pushf(temp.arena, &list, \"%llx\", base_address);\n        } break;\n        case DW_LocListEntryKind_StartLength: {\n          U64 start  = 0;\n          U64 length = 0;\n          cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &length);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", start, length);\n        } break;\n        case DW_LocListEntryKind_StartEnd: {\n          U64 start = 0;\n          U64 end   = 0;\n          cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &start);\n          cursor += dw_based_range_read_address(base, range, cursor, segment_virtual_ranges, segment_selector_size, address_size, &end);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", start, end);\n        } break;\n        case DW_LocListEntryKind_BaseAddressX: {\n          U64 base_addressx = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx);\n          str8_list_pushf(temp.arena, &list, \"%llx\", base_addressx);\n        } break;\n        case DW_LocListEntryKind_StartXEndX: {\n          U64 startx = 0;\n          U64 endx   = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &startx);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &endx);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", startx, endx);\n        } break;\n        case DW_LocListEntryKind_OffsetPair: {\n          U64 a = 0;\n          U64 b = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &a);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &b);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", a, b);\n          \n          U8 expr_length = 0;\n          cursor += dw_based_range_read_struct(base, range, cursor, &expr_length); \n          \n          String8 raw_expr = str8((U8*)base+cursor, expr_length);\n          cursor += expr_length;\n          \n          // TODO: we need actual cu base to format expression correctly\n          NotImplemented;\n          String8 expression = dw_single_line_string_from_expression(temp.arena, raw_expr, 0, address_size, arch, version, DW_Ext_Null, is_dwarf64);\n          str8_list_pushf(temp.arena, &list, \"(%S)\", expression);\n        } break;\n        case DW_LocListEntryKind_StartXLength: {\n          U64 startx = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &startx);\n          U64 length = 0;\n          if (version < DW_Version_5) {\n            // pre-standard length\n            cursor += dw_based_range_read(base, range, cursor, sizeof(U32), &length);\n          } else {\n            cursor += dw_based_range_read_uleb128(base, range, cursor, &length);\n          }\n        } break;\n      }\n      \n      String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(\" \")});\n      rd_printf(\"%S\", print);\n      \n      temp_end(temp);\n    }\n    rd_unindent();\n    rd_newline();\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\ninternal void\ndw_print_debug_rnglists(Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_ranges)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, DW_Section_RngLists);\n  Rng1U64  range = dw_range_from_sec(sections, DW_Section_RngLists);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_RngLists].name);\n  rd_indent();\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64 unit_offset = cursor;\n    U64 unit_length = 0;\n    cursor += dw_based_range_read_length(base, range, cursor, &unit_length);\n    U64        unit_opl              = cursor + unit_length;\n    DW_Version version               = 0;\n    U8         address_size          = 0;\n    U8         segment_selector_size = 0;\n    U32        offset_entry_count    = 0;\n    cursor += dw_based_range_read_struct(base, range, cursor, &version);\n    cursor += dw_based_range_read_struct(base, range, cursor, &address_size);\n    cursor += dw_based_range_read_struct(base, range, cursor, &segment_selector_size);\n    cursor += dw_based_range_read_struct(base, range, cursor, &offset_entry_count);\n    \n    U64 past_header_offset = cursor;\n    B32 is_dwarf64         = unit_length > max_U32;\n    U64 offset_size        = is_dwarf64 ? sizeof(U64) : sizeof(U32);\n    \n    rd_printf(\"Unit @ %#llx, length %llu\", unit_offset, unit_length);\n    rd_printf(\"Version:               %u\", version);\n    rd_printf(\"Address size:          %u\", address_size);\n    rd_printf(\"Segment selector size: %u\", segment_selector_size);\n    rd_printf(\"Offset entry count:    %u\", offset_entry_count);\n    \n    if (version != DW_Version_5) {\n      rd_warningf(\"Version value must be 5 (DWARF5 sepc, Feb 13, 2017)\");\n    }\n    \n    if (offset_entry_count > 0) {\n      rd_printf(\"Offsets:\");\n      rd_indent();\n      rd_printf(\"%-8s %-8s\", \"Index\", \"Offset\");\n      for (U64 offset_idx = 0; offset_idx < offset_entry_count; ++offset_idx) {\n        U64 offset = 0;\n        cursor += dw_based_range_read(base, range, cursor, offset_size, &offset);\n        rd_printf(\"%-8llu %llx\", offset_idx, offset+past_header_offset);\n      }\n      rd_unindent();\n    }\n    \n    rd_printf(\"Ranges:\");\n    rd_indent();\n    rd_printf(\"%-8s %-8s\", \"Offset\", \"Range\");\n    for (; cursor < unit_opl; ) {\n      Temp temp = temp_begin(scratch.arena);\n      \n      String8List list = {0};\n      \n      // offset\n      str8_list_pushf(temp.arena, &list, \"%08llx\", cursor);\n      \n      // opcode mnemonic\n      U8 kind = 0;\n      cursor += dw_based_range_read_struct(base, range, cursor, &kind);\n      str8_list_pushf(temp.arena, &list, \"DW_RLE_%S\", dw_string_from_rng_list_entry_kind(temp.arena, kind));\n      \n      // operand\n      switch (kind) {\n        case DW_RngListEntryKind_EndOfList: {\n          // empty\n        } break;\n        case DW_RngListEntryKind_BaseAddressX:  {\n          U64 base_addressx = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &base_addressx);\n          str8_list_pushf(temp.arena, &list, \"%llx\", base_addressx);\n        } break;\n        case DW_RngListEntryKind_BaseAddress: {\n          U64 base_address = 0;\n          cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &base_address);\n          str8_list_pushf(temp.arena, &list, \"%llx\", base_address);\n        } break;\n        case DW_RngListEntryKind_OffsetPair: {\n          U64 min = 0;\n          U64 max = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &min);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &max);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", min, max);\n        } break;\n        case DW_RngListEntryKind_StartxLength: {\n          U64 startx = 0;\n          U64 length = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &startx);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &length);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", startx, length);\n        } break;\n        case DW_RngListEntryKind_StartxEndx: {\n          U64 startx = 0;\n          U64 endx   = 0;\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &startx);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &endx);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", startx, endx);\n        } break;\n        case DW_RngListEntryKind_StartEnd: {\n          U64 start = 0;\n          U64 end = 0;\n          cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start);\n          cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &end);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", start, end);\n        } break;\n        case DW_RngListEntryKind_StartLength: {\n          U64 start = 0;\n          U64 length = 0;\n          cursor += dw_based_range_read_address(base, range, cursor, segment_ranges, segment_selector_size, address_size, &start);\n          cursor += dw_based_range_read_uleb128(base, range, cursor, &length);\n          str8_list_pushf(temp.arena, &list, \"%llx, %llx\", start, length);\n        } break;\n      }\n      \n      // output row\n      String8 print = str8_list_join(temp.arena, &list, &(StringJoin){.sep=str8_lit(\" \")});\n      rd_printf(\"%S\", print);\n      \n      temp_end(temp);\n    }\n    rd_unindent();\n    rd_newline();\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\ninternal void\ndw_format_string_table(Arena *arena, String8List *out, String8 indent, DW_Input *input, DW_SectionKind sec)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, sec);\n  Rng1U64  range = dw_range_from_sec(sections, sec);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[sec].name);\n  rd_indent();\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64 unit_offset = cursor;\n    \n    U64 unit_length = 0;\n    cursor += dw_based_range_read_length(base, range, cursor, &unit_length);\n    U64 unit_opl = cursor + unit_length;\n    \n    DW_Version version = 0;\n    cursor += dw_based_range_read_struct(base, range, cursor, &version);\n    \n    if (version != DW_Version_2) {\n      rd_warningf(\"Version value must be 2\");\n    }\n    \n    B32 is_dwarf64      = unit_length > max_U32;\n    U32 sec_offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32);\n    \n    U64 debug_info_offset = 0, debug_info_length = 0;\n    cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_offset);\n    cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &debug_info_length);\n    \n    rd_printf(\"Unit @ %#llx, length %llu\", unit_offset, unit_length);\n    rd_printf(\"Version:           %u\",            version);\n    rd_printf(\"Debug info offset: %#llx\",         debug_info_offset);\n    rd_printf(\"Debug info length: %#llx\",         debug_info_length);\n    \n    rd_printf(\"Entries:\");\n    rd_indent();\n    rd_printf(\"%-8s %-8s\", \"Offset\", \"String\");\n    for (; cursor < unit_opl; ) {\n      U64 info_offset = 0;\n      cursor += dw_based_range_read(base, range, cursor, sec_offset_size, &info_offset);\n      String8 string = dw_based_range_read_string(base, range, cursor);\n      cursor += (string.size + 1);\n      \n      rd_printf(\"%08llx %S\", info_offset, string);\n    }\n    rd_unindent();\n    rd_newline();\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\ninternal void\ndw_print_debug_pubnames(Arena *arena, String8List *out, String8 indent, DW_Input *input)\n{\n  dw_format_string_table(arena, out, indent, input, DW_Section_PubNames);\n}\n\ninternal void\ndw_print_debug_pubtypes(Arena *arena, String8List *out, String8 indent, DW_Input *input)\n{\n  dw_format_string_table(arena, out, indent, input, DW_Section_PubTypes);\n}\n\ninternal void\ndw_print_debug_line_str(Arena *arena, String8List *out, String8 indent, DW_Input *input)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, DW_Section_LineStr);\n  Rng1U64  range = dw_range_from_sec(sections, DW_Section_LineStr);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_LineStr].name);\n  rd_indent();\n  \n  rd_printf(\"%-8s %-8s\", \"Offset\", \"String\");\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64 offset = cursor;\n    String8 string = dw_based_range_read_string(base, range, cursor);\n    cursor += (string.size + 1);\n    rd_printf(\"%08llX %S\", offset, string);\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\ninternal void\ndw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input)\n{\n  NotImplemented;\n#if 0\n  void    *base  = dw_base_from_sec(sections, DW_Section_StrOffsets);\n  Rng1U64  range = dw_range_from_sec(sections, DW_Section_StrOffsets);\n  \n  void    *debug_str_base  = dw_base_from_sec(sections, DW_Section_Str);\n  Rng1U64  debug_str_range = dw_range_from_sec(sections, DW_Section_Str);\n  \n  if (dim_1u64(range) == 0) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# %S\", sections->v[DW_Section_StrOffsets].name);\n  rd_indent();\n  for (U64 cursor = 0; cursor < dim_1u64(range); ) {\n    U64 unit_offset = cursor;\n    \n    U64 unit_length = 0;\n    cursor += dw_based_range_read_length(base, range, cursor, &unit_length);\n    U64 unit_opl = cursor + unit_length;\n    \n    DW_Version version = 0;\n    cursor += dw_based_range_read_struct(base, range, cursor, &version);\n    if (version != DW_Version_5) {\n      rd_warningf(\"Version value must be 5 (DWARF5 sepc, Feb 13, 2017)\");\n    }\n    \n    U16 padding = 0;\n    cursor += dw_based_range_read_struct(base, range, cursor, &padding);\n    if (padding != 0) {\n      rd_warningf(\"unexpected padding byte\");\n    }\n    \n    B32 is_dwarf64  = unit_length > max_U32;\n    U32 offset_size = is_dwarf64 ? sizeof(U64) : sizeof(U32);\n    \n    rd_printf(\"Unit @ %#llX, length %lld\", unit_offset, unit_length);\n    rd_printf(\"Version: %d\", version);\n    rd_printf(\"Padding: %d\", padding);\n    rd_indent();\n    rd_printf(\"%-8s %-8s\", \"@\", \"Offset\");\n    for (; cursor < unit_opl; ) {\n      U64 read_at = cursor;\n      U64 offset  = 0;\n      cursor += dw_based_range_read(base, range, cursor, offset_size, &offset);\n      rd_printf(\"%08llx %08llx\", read_at, offset);\n      if (dim_1u64(debug_str_range) > 0) {\n        String8 string = dw_based_range_read_string(debug_str_base, debug_str_range, offset);\n        rd_printf(\" %S\", string);\n      }\n      rd_newline();\n    }\n    rd_unindent();\n    rd_newline();\n  }\n  rd_unindent();\n  \n  scratch_end(scratch);\n#endif\n}\n\n#endif\n\n////////////////////////////////\n//~ rjf: Dump Entry Point\n\ninternal String8\ndw_string_from_attrib_value(Arena *arena, DW_Input *input, Arch arch, DW_CompUnit *unit, DW_LineVMHeader *line_vm, DW_Attrib *attrib)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8List attrib_fmt = {0};\n  \n  // rjf: log attrib's value based on vlass\n  DW_AttribClass value_class = dw_value_class_from_attrib(unit, attrib);\n  switch(value_class)\n  {\n    default:                       {str8_list_pushf(scratch.arena, &attrib_fmt, \"`unknown value class`\");}break;\n    case DW_AttribClass_Undefined: {str8_list_pushf(scratch.arena, &attrib_fmt, \"`undefined value class`\");}break;\n    case DW_AttribClass_Address:   {str8_list_pushf(scratch.arena, &attrib_fmt, \"0x%I64x\", dw_address_from_attrib(input, unit, attrib));}break;\n    case DW_AttribClass_Const:     {str8_list_pushf(scratch.arena, &attrib_fmt, \"0x%I64x\", dw_const_u64_from_attrib(input, unit, attrib));}break;\n    case DW_AttribClass_Block:\n    {\n      String8 block = dw_block_from_attrib(input, unit, attrib);\n      String8List block_strs = numeric_str8_list_from_data(scratch.arena, 16, block, 1);\n      String8 block_str = str8_list_join(scratch.arena, &block_strs, &(StringJoin){.sep = str8_lit(\", \")});\n      str8_list_pushf(scratch.arena, &attrib_fmt, \"{ %S }\", block_str);\n    }break;\n    case DW_AttribClass_ExprLoc:\n    {\n      String8 exprloc = dw_exprloc_from_attrib(input, unit, attrib);\n      String8 exprloc_str = dw_single_line_string_from_expression(scratch.arena, exprloc, unit->info_range.min, unit->address_size, arch, unit->version, unit->ext, unit->format);\n      str8_list_pushf(scratch.arena, &attrib_fmt, \"{ %S }\", exprloc_str);\n    }break;\n    case DW_AttribClass_Flag:\n    {\n      B32 flag = dw_flag_from_attrib(input, unit, attrib);\n      str8_list_pushf(scratch.arena, &attrib_fmt, \"%llu (%s)\", flag, flag == 0 ? \"false\" : \"true\");\n    }break;\n    case DW_AttribClass_LinePtr:\n    case DW_AttribClass_LocListPtr:\n    case DW_AttribClass_MacPtr:\n    case DW_AttribClass_RngListPtr:\n    case DW_AttribClass_RngList:\n    case DW_AttribClass_StrOffsetsPtr:\n    case DW_AttribClass_AddrPtr:\n    {\n      if(attrib->form_kind == DW_Form_SecOffset)\n      {\n        str8_list_pushf(scratch.arena, &attrib_fmt, \"0x%I64x\", attrib->form.sec_offset);\n      }\n      else\n      {\n        str8_list_pushf(scratch.arena, &attrib_fmt, \"`unexpected form kind %S`\", dw_string_from_form_kind(scratch.arena, unit->version, attrib->form_kind));\n      }\n    }break;\n    case DW_AttribClass_Reference:\n    {\n      if(attrib->form_kind == DW_Form_Ref1 ||\n         attrib->form_kind == DW_Form_Ref2 ||\n         attrib->form_kind == DW_Form_Ref4 ||\n         attrib->form_kind == DW_Form_Ref8 ||\n         attrib->form_kind == DW_Form_RefUData)\n      {\n        U64 info_off = unit->info_range.min + attrib->form.ref;\n        str8_list_pushf(scratch.arena, &attrib_fmt, \"0x%I64x\", info_off);\n        if(!contains_1u64(unit->info_range, info_off))\n        {\n          str8_list_pushf(scratch.arena, &attrib_fmt, \": `(out of this unit's bounds)`\");\n        }\n      }\n      else\n      {\n        str8_list_pushf(scratch.arena, &attrib_fmt, \"0x%I64x\", attrib->form.ref);\n      }\n    }break;\n    case DW_AttribClass_String:\n    {\n      if(attrib->form_kind == DW_Form_Strp || attrib->form_kind == DW_Form_LineStrp || attrib->form_kind == DW_Form_StrpSup)\n      {\n        str8_list_pushf(scratch.arena, &attrib_fmt, \"0x%I64x \", attrib->form.sec_offset);\n      }\n      String8 string = dw_string_from_attrib(input, unit, attrib);\n      str8_list_pushf(scratch.arena, &attrib_fmt, \"\\\"%S\\\"\", string);\n    }break;\n  }\n  \n  // rjf: extend attrib's value with enum info\n  {\n    String8 enum_info = {0};\n    switch(attrib->attrib_kind)\n    {\n      case DW_AttribKind_Language:\n      {\n        DW_Language lang = dw_const_u64_from_attrib(input, unit, attrib);\n        enum_info = dw_string_from_language(scratch.arena, lang);\n      }break;\n      case DW_AttribKind_DeclFile:\n      {\n        U64          file_idx = dw_const_u64_from_attrib(input, unit, attrib);\n        DW_LineFile *file     = dw_file_from_attrib(unit, line_vm, attrib);\n        if(file != 0)\n        {\n          enum_info = dw_path_from_file(scratch.arena, line_vm, file);\n        }\n      }break;\n      case DW_AttribKind_DeclLine:\n      {\n        enum_info = str8f(scratch.arena, \"%I64u\", dw_const_u64_from_attrib(input, unit, attrib));\n      }break;\n      case DW_AttribKind_Inline:\n      {\n        DW_InlKind inl = dw_const_u64_from_attrib(input, unit, attrib);\n        enum_info = dw_string_from_inl(scratch.arena, inl);\n      }break;\n      case DW_AttribKind_Accessibility:\n      {\n        DW_AccessKind access = dw_const_u64_from_attrib(input, unit, attrib);\n        enum_info = dw_string_from_access_kind(scratch.arena, access);\n      }break;\n      case DW_AttribKind_CallingConvention:\n      {\n        DW_CallingConventionKind calling_convetion = dw_const_u64_from_attrib(input, unit, attrib);\n        enum_info = dw_string_from_calling_convetion(scratch.arena, calling_convetion);\n      }break;\n      case DW_AttribKind_Encoding:\n      {\n        DW_ATE encoding = dw_const_u64_from_attrib(input, unit, attrib);\n        enum_info = dw_string_from_attrib_type_encoding(scratch.arena, encoding);\n      }break;\n    }\n    \n    if(enum_info.size)\n    {\n      str8_list_pushf(scratch.arena, &attrib_fmt, \" `%S`\", enum_info);\n    }\n  }\n  \n  String8 result = str8_list_join(arena, &attrib_fmt, 0);\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8List\ndw_dump_list_from_sections(Arena              *arena,\n                           DW_Input           *input,\n                           Arch                arch,\n                           DW_DumpSubsetFlags  subset_flags)\n{\n  String8List strings = {0};\n  String8 indent = str8_lit(\"                                                                                                                                \");\n#define dump(str)  str8_list_push(arena, &strings, (str))\n#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__)\n#define DumpSubset(name) if(subset_flags & DW_DumpSubsetFlag_##name) DeferLoop(dumpf(\"// %S\\n\\n\", dw_name_title_from_dump_subset_table[DW_DumpSubset_##name]), dump(str8_lit(\"\\n\")))\n  Temp scratch = scratch_begin(&arena, 1);\n  Rng1U64Array segment_vranges = {0};\n  DW_ListUnitInput lu_input = dw_list_unit_input_from_input(scratch.arena, input);\n  B32 relaxed  = 1;\n  \n  DW_CompUnit *cu_arr;\n  {\n    DW_ListUnitInput  lu_input      = dw_list_unit_input_from_input(scratch.arena, input);\n    Rng1U64List       cu_range_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data);\n    Rng1U64Array      cu_ranges     = rng1u64_array_from_list(scratch.arena, &cu_range_list);\n    cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count);\n    for EachIndex(cu_idx, cu_ranges.count)\n    {\n      cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, input, lu_input, cu_ranges.v[cu_idx].min, relaxed);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_info\n  //\n  DumpSubset(DebugInfo)\n  {\n    Rng1U64List  unit_ranges_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Info].data);\n    Rng1U64Array unit_ranges = rng1u64_array_from_list(scratch.arena, &unit_ranges_list);\n    for EachIndex(unit_idx, unit_ranges.count)\n    {\n      Temp unit_temp = temp_begin(scratch.arena);\n      \n      //- rjf: unpack unit\n      Rng1U64 unit_range = unit_ranges.v[unit_idx];\n      DW_CompUnit *unit  = &cu_arr[unit_idx];\n      String8 unit_dir  = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_CompDir );\n      String8 unit_name = dw_string_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_Name    );\n      String8 stmt_list = dw_line_ptr_from_tag_attrib_kind(input, unit, unit->tag, DW_AttribKind_StmtList);\n      DW_LineVMHeader line_vm = {0};\n      dw_read_line_vm_header(unit_temp.arena, stmt_list, 0, input, unit_dir, unit_name, unit->address_size, unit->str_offsets_lu, &line_vm);\n      \n      //- rjf: log top-level unit info\n      dumpf(\"unit: // compile_unit[%I64u]\\n{\\n\", unit_idx);\n      dumpf(\"  version:         %u\\n\",        unit->version);\n      dumpf(\"  address_size:    %I64u\\n\",     unit->address_size);\n      dumpf(\"  abbrev_off:      0x%I64x\\n\",   unit->abbrev_off);\n      dumpf(\"  info_range:      [0x%I64x, 0x%I64x) // (%M)\\n\", unit->info_range.min, unit->info_range.max, dim_1u64(unit->info_range));\n      \n      //- rjf: log tags\n      S64 tag_depth = 0;\n      U64 tag_idx = 0;\n      for(U64 info_off = unit->first_tag_info_off; info_off < unit->info_range.max; tag_idx += 1)\n      {\n        Temp tag_temp = temp_begin(scratch.arena);\n        \n        // rjf: unpack tag\n        String8 tag_indent = str8_prefix(indent, (tag_depth+1)*2);\n        U64 tag_info_off = info_off;\n        DW_Tag tag = {0};\n        info_off += dw_read_tag_cu(tag_temp.arena, input, unit, tag_info_off, &tag);\n        \n        // rjf: log top-level tag info\n        dumpf(\"%Stag: // info_off: 0x%I64x, abbrev_id: %I64u, compile_unit[%I64u].tag[%I64u]\\n%S{\\n\", tag_indent, tag_info_off, tag.abbrev_id, unit_idx, tag_idx, tag_indent);\n        dumpf(\"%S  kind: %S\\n\", tag_indent, dw_string_from_tag_kind(tag_temp.arena, tag.kind));\n        \n        // log attribs\n        {\n          // compute columns' max widths\n          U64 attrib_name_max_size = 0, form_kind_max_size = 0, value_max_size = 0;\n          for EachNode(attrib_n, DW_AttribNode, tag.attribs.first)\n          {\n            Temp attrib_temp = temp_begin(tag_temp.arena);\n            attrib_name_max_size = Max(attrib_name_max_size, dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib_n->v.attrib_kind).size);\n            form_kind_max_size   = Max(form_kind_max_size, dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib_n->v.form_kind).size);\n            value_max_size       = Max(value_max_size, dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_vm, &attrib_n->v).size);\n            temp_end(attrib_temp);\n          }\n          value_max_size = Min(120, value_max_size);\n          \n          // log\n          for EachNode(attrib_n, DW_AttribNode, tag.attribs.first)\n          {\n            DW_Attrib *attrib = &attrib_n->v;\n            \n            Temp attrib_temp = temp_begin(tag_temp.arena);\n            \n            String8 attrib_kind_str = dw_string_from_attrib_kind(attrib_temp.arena, unit->version, unit->ext, attrib->attrib_kind);\n            String8 form_kind_str   = dw_string_from_form_kind(attrib_temp.arena, unit->version, attrib->form_kind);\n            String8 value_str       = dw_string_from_attrib_value(attrib_temp.arena, input, arch, unit, &line_vm, attrib);\n            \n            dumpf(\"%S  attrib: { kind: %S, %.*sform_kind: %S, %.*svalue: %S, %.*s} // info_off: 0x%I64x\\n\",\n                  tag_indent,\n                  attrib_kind_str, attrib_name_max_size - attrib_kind_str.size, indent.str,\n                  form_kind_str,   form_kind_max_size - form_kind_str.size, indent.str,\n                  value_str,       value_str.size < value_max_size ? value_max_size - value_str.size: 0, indent.str,\n                  attrib->info_off, unit_idx, tag_idx);\n            \n            temp_end(attrib_temp);\n          }\n        }\n        \n        // rjf: log tag closes\n        if(!tag.has_children || tag.abbrev_id == 0)\n        {\n          dumpf(\"%S}\\n\", tag_indent);\n        }\n        \n        // rjf: indent/unindent\n        if(tag.has_children)\n        {\n          tag_depth += 1;\n        }\n        if(!tag.abbrev_id)\n        {\n          tag_depth -= 1;\n        }\n        \n        temp_end(tag_temp);\n      }\n      temp_end(unit_temp);\n      dumpf(\"} // compile_unit[/%u]\\n\\n\", unit_idx);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_abbrev\n  //\n  DumpSubset(DebugAbbrev)\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    DW_Section abbrev = input->sec[DW_Section_Abbrev];\n    S64 depth = 0;\n    U64 idx = 0;\n    for(U64 cursor = 0; cursor < abbrev.data.size; idx += 1)\n    {\n      // rjf: read id & advance\n      U64 id_off = cursor;\n      U64 id = 0;\n      cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &id);\n      if(id == 0) { continue; }\n      \n      // rjf: unpack abbrev\n      U64 tag = 0;\n      U8 has_children = 0;\n      cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &tag);\n      cursor += str8_deserial_read_struct(abbrev.data, cursor, &has_children);\n      \n      // rjf: log abbrev\n      Temp temp = temp_begin(scratch.arena);\n      dumpf(\"abbrev: // abbrev[%I64u]\\n{\\n\", idx);\n      dumpf(\"  offset:       0x%I64x\\n\", id_off);\n      dumpf(\"  id:           %I64u\\n\", id);\n      dumpf(\"  tag_kind:     %S\\n\", dw_string_from_tag_kind(temp.arena, tag));\n      dumpf(\"  has_children: %s\\n\", has_children ? \"true\" : \"false\");\n      for(;;)\n      {\n        U64 attrib_off = cursor;\n        U64 attrib_id = 0, form_id = 0;\n        cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &attrib_id);\n        cursor += str8_deserial_read_uleb128(abbrev.data, cursor, &form_id);\n        if(attrib_id == 0) { break; }\n        String8 attrib_str = dw_string_from_attrib_kind(temp.arena, DW_Version_Last, DW_Ext_All, attrib_id);\n        String8 form_str   = dw_string_from_form_kind(temp.arena, DW_Version_Last, form_id);\n        dumpf(\"  attrib: { offset: 0x%I64x, kind: %S, form_kind: %S }\\n\", attrib_off, attrib_str, form_str);\n      }\n      dumpf(\"}\\n\");\n      temp_end(temp);\n    }\n    scratch_end(scratch);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_line\n  //\n  DumpSubset(DebugLine)\n  {\n    Rng1U64List  unit_ranges_list = dw_unit_ranges_from_data(scratch.arena, input->sec[DW_Section_Line].data);\n    Rng1U64Array unit_ranges = rng1u64_array_from_list(scratch.arena, &unit_ranges_list);\n    for EachIndex(unit_idx, unit_ranges.count)\n    {\n      Temp unit_temp = temp_begin(scratch.arena);\n      \n      // rjf: unpack unit\n      String8      raw_lines    = str8_substr(input->sec[DW_Section_Line].data, unit_ranges.v[unit_idx]);\n      DW_CompUnit *cu           = &cu_arr[unit_idx];\n      String8      cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_StmtList);\n      String8      cu_dir       = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_CompDir);\n      String8      cu_name      = dw_string_from_tag_attrib_kind(input, cu, cu->tag, DW_AttribKind_Name);\n      DW_LineVMHeader line_vm        = {0};\n      U64             line_vm_size   = dw_read_line_vm_header(unit_temp.arena, raw_lines, 0, input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu, &line_vm);\n      if(line_vm_size == 0)\n      {\n        continue;\n      }\n      \n      // rjf: begin logging line table\n      dumpf(\"line_table: // line_table[%I64u]\\n{\\n\", unit_idx);\n      \n      // rjf: log line table header\n      DeferLoop(dumpf(\"  header:\\n  {\\n\"), dumpf(\"  }\\n\\n\"))\n      {\n        String8List opcode_length_strings = numeric_str8_list_from_data(unit_temp.arena, 16, str8(line_vm.opcode_lens, line_vm.num_opcode_lens), 1);\n        String8 opcode_lengths_string = str8_list_join(arena, &opcode_length_strings, &(StringJoin){.sep = str8_lit(\", \")});\n        dumpf(\"    version:                 %u\\n\",        line_vm.version              );\n        dumpf(\"    line_table_off:          0x%I64x\\n\",   line_vm.unit_range.min       );\n        dumpf(\"    line_table_size:         %I64u\\n\",     dim_1u64(line_vm.unit_range) );\n        dumpf(\"    address_size:            %u\\n\",        line_vm.address_size         );\n        dumpf(\"    segment_selector_size:   %u\\n\",        line_vm.segment_selector_size);\n        dumpf(\"    header_length:           %I64u\\n\",     line_vm.header_length        );\n        dumpf(\"    min_instruction_length:  %u\\n\",        line_vm.min_inst_len         );\n        dumpf(\"    max_ops_for_instruction: %u\\n\",        line_vm.max_ops_for_inst     );\n        dumpf(\"    default_is_stmt:         %u\\n\",        line_vm.default_is_stmt      );\n        dumpf(\"    line_base:               %d\\n\",        line_vm.line_base            );\n        dumpf(\"    line_range:              %u\\n\",        line_vm.line_range           );\n        dumpf(\"    opcode_base:             %u\\n\",        line_vm.opcode_base          );\n        dumpf(\"    opcode_lengths:          %S\\n\",        opcode_lengths_string        );\n      }\n      \n      // rjf: log directory table\n      DeferLoop(dumpf(\"  directory_table:\\n  {\\n\"), dumpf(\"  }\\n\\n\"))\n      {\n        dumpf(\"    // %-4s %-8s\\n\", \"no.\", \"name\");\n        for EachIndex(dir_idx, line_vm.dir_table.count)\n        {\n          dumpf(\"    {  %-4llu %S  }\\n\", dir_idx, line_vm.dir_table.v[dir_idx]);\n        }\n      }\n      \n      // rjf: log file table\n      DeferLoop(dumpf(\"  file_table:\\n  {\\n\"), dumpf(\"  }\\n\\n\"))\n      {\n        dumpf(\"  // %-4s %-8s %-8s %-33s %-8s %-8s\\n\", \"no.\", \"dir_idx\", \"time\", \"md5\", \"size\", \"name\");\n        for EachIndex(file_idx, line_vm.file_table.count)\n        {\n          DW_LineFile *file = &line_vm.file_table.v[file_idx];\n          dumpf(\"  {  %-4llu %-8llu %-8llu %016llx-%016llx %-8llu %S  }\\n\",\n                file_idx,\n                file->dir_idx,\n                file->modify_time,\n                file->md5_digest.u64[1],\n                file->md5_digest.u64[0],\n                file->file_size,\n                file->file_name);\n        }\n      }\n      \n      // rjf: log opcodes\n      DeferLoop(dumpf(\"  opcodes:\\n  {\\n\"), dumpf(\"  }\\n\\n\"))\n      {\n        String8        opcodes    = str8_skip(raw_lines, line_vm_size);\n        B32            end_of_seq = 0;\n        DW_LineVMState vm_state   = {0};\n        dw_line_vm_reset(&vm_state, line_vm.default_is_stmt);\n        for(U64 cursor = 0; cursor < opcodes.size;)\n        {\n          Temp opcode_temp = temp_begin(unit_temp.arena);\n          String8List opcode_fmt = {0};\n          \n          // opcode offset\n          str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"[%08llx]\", cursor);\n          \n          // parse opcode\n          U8 opcode = 0;\n          cursor += str8_deserial_read_struct(opcodes, cursor, &opcode);\n          \n          // push opcode id\n          String8 opcode_str = dw_string_from_std_opcode(opcode_temp.arena, opcode);\n          str8_list_push(arena, &opcode_fmt, opcode_str);\n          \n          // format operands\n          switch(opcode)\n          {\n            default:\n            {\n              if(opcode >= line_vm.opcode_base)\n              {\n                U32 adjusted_opcode = 0;\n                U32 op_advance      = 0;\n                S32 line_advance    = 0;\n                U64 addr_advance    = 0;\n                if(line_vm.line_range > 0 && line_vm.max_ops_for_inst > 0)\n                {\n                  adjusted_opcode = (U32)(opcode - line_vm.opcode_base);\n                  op_advance      = adjusted_opcode / line_vm.line_range;\n                  line_advance    = (S32)line_vm.line_base + ((S32)adjusted_opcode) % (S32)line_vm.line_range;\n                  addr_advance    = line_vm.min_inst_len * ((vm_state.op_index+op_advance) / line_vm.max_ops_for_inst);\n                }\n                vm_state.address        += addr_advance;\n                vm_state.op_index        = (vm_state.op_index + op_advance) % line_vm.max_ops_for_inst;\n                vm_state.line            = (U32)((S32)vm_state.line + line_advance);\n                vm_state.basic_block     = 0;\n                vm_state.prologue_end    = 0;\n                vm_state.epilogue_begin  = 0;\n                vm_state.discriminator   = 0;\n                end_of_seq = 0;\n                str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"advance line by %d, advance address by %lld\", line_advance, addr_advance);\n              }\n              else\n              {\n                if(opcode > 0 && opcode <= line_vm.num_opcode_lens)\n                {\n                  str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"skip operands:\");\n                  U64 num_operands = line_vm.opcode_lens[opcode - 1];\n                  for(U8 i = 0; i < num_operands; i += 1)\n                  {\n                    U64 operand = 0;\n                    cursor += str8_deserial_read_uleb128(opcodes, cursor, &operand);\n                    str8_list_pushf(opcode_temp.arena, &opcode_fmt, \" %llx\", operand);\n                  }\n                }\n              }\n            }break;\n            case DW_StdOpcode_Copy:\n            {\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"Line = %u, Column = %u, Address = %#llx\", vm_state.line, vm_state.column, vm_state.address);\n              end_of_seq = 0;\n              vm_state.discriminator   = 0;\n              vm_state.basic_block     = 0;\n              vm_state.prologue_end    = 0;\n              vm_state.epilogue_begin  = 0;\n            }break;\n            case DW_StdOpcode_AdvancePc:\n            {\n              U64 advance = 0;\n              cursor += str8_deserial_read_uleb128(opcodes, cursor, &advance);\n              dw_line_vm_advance(&vm_state, advance, line_vm.min_inst_len, line_vm.max_ops_for_inst);\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"advance %#llx ; current address %#llx\", advance, vm_state.address);\n            }break;\n            case DW_StdOpcode_AdvanceLine:\n            {\n              S64 advance = 0;\n              cursor += str8_deserial_read_sleb128(opcodes, cursor, &advance);\n              vm_state.line += advance;\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"advance %lld ; current line %u\", advance, vm_state.line);\n            }break;\n            case DW_StdOpcode_SetFile:\n            {\n              U64 file_idx = 0;\n              cursor += str8_deserial_read_uleb128(opcodes, cursor, &file_idx);\n              vm_state.file_index = file_idx;\n              String8 path = dw_path_from_file_idx(opcode_temp.arena, &line_vm, file_idx);\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%llu \\\"%S\\\"\", file_idx, path);\n            }break;\n            case DW_StdOpcode_SetColumn:\n            {\n              U64 column = 0;\n              cursor += str8_deserial_read_uleb128(opcodes, cursor, &column);\n              vm_state.column = column;\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%llu\", column);\n            }break;\n            case DW_StdOpcode_NegateStmt:\n            {\n              vm_state.is_stmt = !vm_state.is_stmt;\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"is_stmt = %u\", vm_state.is_stmt);\n            }break;\n            case DW_StdOpcode_SetBasicBlock:\n            {\n              vm_state.basic_block = 1;\n            }break;\n            case DW_StdOpcode_ConstAddPc:\n            {\n              U64 advance = (0xffu - line_vm.opcode_base)/line_vm.line_range;\n              dw_line_vm_advance(&vm_state, advance, line_vm.min_inst_len, line_vm.max_ops_for_inst);\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%lld ; address %#llx\", advance, vm_state.address);\n            }break;\n            case DW_StdOpcode_FixedAdvancePc:\n            {\n              U64 operand = 0;\n              cursor += str8_deserial_read_struct(opcodes, cursor, &operand);\n              vm_state.address += operand;\n              vm_state.op_index = 0;\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%llu\", operand);\n            }break;\n            case DW_StdOpcode_SetPrologueEnd:\n            {\n              vm_state.prologue_end = 1;\n            }break;\n            case DW_StdOpcode_SetEpilogueBegin:\n            {\n              vm_state.epilogue_begin = 1;\n            }break;\n            case DW_StdOpcode_SetIsa:\n            {\n              U64 v = 0;\n              cursor += str8_deserial_read_uleb128(opcodes, cursor, &v);\n              vm_state.isa = v;\n              str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%llu\", v);\n            }break;\n            case DW_StdOpcode_ExtendedOpcode:\n            {\n              U64 length = 0;\n              U8 ext_opcode = 0;\n              cursor += str8_deserial_read_uleb128(opcodes, cursor, &length);\n              U64 opcode_end = cursor + length;\n              cursor += str8_deserial_read_struct(opcodes, cursor, &ext_opcode);\n              String8 ext_opcode_str = dw_string_from_ext_opcode(opcode_temp.arena, ext_opcode);\n              //str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"length: %u\", length);\n              str8_list_push(opcode_temp.arena, &opcode_fmt, ext_opcode_str);\n              switch(ext_opcode)\n              {\n                case DW_ExtOpcode_EndSequence:\n                {\n                  vm_state.end_sequence = 1;\n                  dw_line_vm_reset(&vm_state, line_vm.default_is_stmt);\n                  end_of_seq = 1;\n                }break;\n                case DW_ExtOpcode_SetAddress:\n                {\n                  U64 address = 0;\n                  cursor += str8_deserial_read(opcodes, cursor, &address, line_vm.address_size, line_vm.address_size);\n                  vm_state.address    = address;\n                  vm_state.op_index   = 0;\n                  str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%#llx\", address);\n                }break;\n                case DW_ExtOpcode_DefineFile:\n                {\n                  String8 file_name = {0};\n                  cursor += str8_deserial_read_cstr(opcodes, cursor, &file_name);\n                  U64 dir_idx = 0, modify_time = 0, file_size = 0;\n                  cursor += str8_deserial_read_uleb128(opcodes, cursor, &dir_idx);\n                  cursor += str8_deserial_read_uleb128(opcodes, cursor, &modify_time);\n                  cursor += str8_deserial_read_uleb128(opcodes, cursor, &file_size);\n                  str8_list_pushf(opcode_temp.arena, &opcode_fmt, \"%S Dir: %llu, Time: %llu, Size: %llu\", file_name, dir_idx, modify_time, file_size);\n                }break;\n                case DW_ExtOpcode_SetDiscriminator:\n                {\n                  U64 v = 0;\n                  cursor += str8_deserial_read_uleb128(opcodes, cursor, &v);\n                  vm_state.discriminator = v;\n                  str8_list_pushf(arena, &opcode_fmt, \"%llu\", v);\n                }break;\n              }\n              cursor = opcode_end;\n            }break;\n          }\n          String8 string = str8_list_join(opcode_temp.arena, &opcode_fmt, &(StringJoin){.sep=str8_lit(\" \")});\n          dumpf(\"%S\\n\", string);\n          temp_end(opcode_temp);\n        }\n      }\n      temp_end(unit_temp);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_str\n  //\n  DumpSubset(DebugStr) DeferLoop(dumpf(\"strings:\\n{\\n\"), dumpf(\"}\\n\\n\"))\n  {\n    String8 data = input->sec[DW_Section_Str].data;\n    for(U64 cursor = 0, read_size = 0; cursor < data.size; cursor += read_size)\n    {\n      String8 string = {0};\n      read_size = str8_deserial_read_cstr(data, cursor, &string);\n      dumpf(\"  { 0x%08I64x  %llu  \\\"%S\\\" }\\n\", cursor, string.size, string);\n    }\n  }\n  \n  //////////////////////////////\n  //~ dump .debug_frame\n  DumpSubset(DebugFrame)\n  {\n    HashTable *cie_ht = hash_table_init(scratch.arena, 0x2000);\n    String8   debug_frame = input->sec[DW_Section_Frame].data;\n    U64       addr_size   = byte_size_from_arch(arch);\n    \n    // make offset -> CIE hash table\n    for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) {\n      DW_DescriptorEntry desc = {0};\n      desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc);\n      if (desc.type == DW_DescriptorEntryType_CIE) {\n        String8         raw_cie     = str8_substr(debug_frame, desc.entry_range);\n        U64             restore_pos = arena_pos(scratch.arena);\n        DW_CIE *cie         = push_array(scratch.arena, DW_CIE, 1);\n        if (dw_parse_cie(raw_cie, desc.format, arch, cie)) {\n          hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, cie);\n        } else {\n          arena_pop_to(scratch.arena, restore_pos);\n        }\n      }\n    }\n    \n    for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) {\n      DW_DescriptorEntry desc = {0};\n      desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc);\n      String8 raw_desc  = str8_substr(debug_frame, desc.entry_range);\n      switch (desc.type) {\n        case DW_DescriptorEntryType_Null: {} break;\n        case DW_DescriptorEntryType_CIE: {\n          DW_CIE cie = {0};\n          if (dw_parse_cie(raw_desc, desc.format, arch, &cie)) {\n            String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, DW_Ext_All, cie.format, 0, &cie, dw_decode_ptr_debug_frame, &cie, cie.insts);\n            \n            dumpf(\"CIE: // entry range: %r\\n\", desc.entry_range);\n            dumpf(\"{\\n\");\n            dumpf(\"  Format:          %S\\n\",     dw_string_from_format(desc.format));\n            dumpf(\"  Version:         %u\\n\",     cie.version);\n            dumpf(\"  Aug string:      \\\"%S\\\"\\n\", cie.aug_string);\n            dumpf(\"  Code align:      %I64u\\n\",  cie.code_align_factor);\n            dumpf(\"  Data align:      %I64d\\n\",  cie.data_align_factor);\n            dumpf(\"  Return addr reg: %u\\n\",     cie.ret_addr_reg);\n            if (cie.version > DW_Version_3) {\n              dumpf(\"  Address size:          %u\\n\", cie.address_size);\n              dumpf(\"  Segment selector size: %u\\n\", cie.segment_selector_size);\n            }\n            dumpf(\"  Initial Insturction:\\n\");\n            dumpf(\"  {\\n\");\n            for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(\"    %S\\n\", n->string); }\n            dumpf(\"  }\\n\");\n            dumpf(\"}\\n\");\n          } else {\n            dumpf(\"ERROR: unable to parse CIE @ %I64x\\n\", desc.entry_range.min);\n          }\n        } break;\n        case DW_DescriptorEntryType_FDE: {\n          DW_DescriptorEntry cie_desc      = {0};\n          U64                cie_desc_size = dw_parse_descriptor_entry_header(debug_frame, desc.cie_pointer, &cie_desc);\n          String8            cie_data      = str8_substr(debug_frame, cie_desc.entry_range);\n          DW_CIE             cie           = {0};\n          dw_parse_cie(cie_data, cie_desc.format, arch, &cie);\n          \n          DW_FDE fde = {0};\n          if (dw_parse_fde(raw_desc, desc.format, &cie, &fde)) {\n            DW_Version  version = DW_Version_5;\n            DW_Ext      ext     = DW_Ext_All;\n            String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, version, ext, fde.format, fde.pc_range.min, &cie, dw_decode_ptr_debug_frame, &cie, fde.insts);\n            dumpf(\"FDE: // entry range: %r\\n\", desc.entry_range);\n            dumpf(\"{\\n\");\n            {\n              dumpf(\"  Format:      %S\\n\",      dw_string_from_format(fde.format));\n              dumpf(\"  CIE pointer: 0x%I64x\\n\", fde.cie_pointer);\n              dumpf(\"  PC range:    %r\\n\",      fde.pc_range);\n              dumpf(\"  Instructions:\\n\");\n              dumpf(\"  {\\n\");\n              for EachNode(n, String8Node, insts_str_list.first) { dumpf(\"    %S\\n\", n->string); }\n              dumpf(\"  }\\n\");\n            }\n            dumpf(\"  Unwind:\\n\");\n            dumpf(\"  {\\n\");\n            DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, dw_decode_ptr_debug_frame, &cie);\n            do {\n              String8 cfa_str      = dw_string_from_cfa(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row->cfa);\n              String8 cfi_regs_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, version, ext, fde.format, cfi_unwind->row);\n              dumpf(\"    { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\\n\", cfi_unwind->pc, cfa_str, cfi_regs_str);\n            } while (dw_cfi_next_row(scratch.arena, cfi_unwind));\n            dumpf(\"  }\\n\");\n            \n            dumpf(\"}\\n\");\n          } else {\n            dumpf(\"ERROR: unable to parse FDE @ %I64x\\n\", desc.entry_range.min);\n          }\n        } break;\n      }\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_loc\n  //\n  DumpSubset(DebugLoc)\n  {\n    // dw_print_debug_loc(arena, out, indent, input, arch, image_type, relaxed);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_ranges\n  //\n  DumpSubset(DebugRanges)\n  {\n    // dw_print_debug_ranges(arena, out, indent, input, arch, image_type, relaxed);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_aranges\n  //\n  DumpSubset(DebugARanges)\n  {\n    // dw_print_debug_aranges(arena, out, indent, input);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_addr\n  //\n  DumpSubset(DebugAddr)\n  {\n    // dw_print_debug_addr(arena, out, indent, input);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_loclists\n  //\n  DumpSubset(DebugLocLists)\n  {\n    // dw_print_debug_loclists(arena, out, indent, input, segment_vranges, arch);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_rnglists\n  //\n  DumpSubset(DebugRngLists)\n  {\n    // dw_print_debug_rnglists(arena, out, indent, input, segment_vranges);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_pubnames\n  //\n  DumpSubset(DebugPubNames)\n  {\n    // dw_print_debug_pubnames(arena, out, indent, input);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_pubtypes\n  //\n  DumpSubset(DebugPubTypes)\n  {\n    // dw_print_debug_pubtypes(arena, out, indent, input);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_linestr\n  //\n  DumpSubset(DebugLineStr)\n  {\n    // dw_print_debug_line_str(arena, out, indent, input);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump .debug_stroffs\n  //\n  DumpSubset(DebugStrOffsets)\n  {\n    // dw_print_debug_str_offsets(arena, out, indent, input);\n  }\n  \n  scratch_end(scratch);\n#undef DumpSubset\n#undef dumpf\n#undef dump\n  return strings;\n}\n"
  },
  {
    "path": "src/dwarf/dwarf_dump.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_DUMP_H\n#define DWARF_DUMP_H\n\n////////////////////////////////\n//~ rjf: Dump Subset Types\n\n#define DW_DumpSubset_XList                                   \\\nX(DebugInfo,           debug_info,          \"DEBUG INFO\")     \\\nX(DebugAbbrev,         debug_abbrev,        \"DEBUG ABBREV\")   \\\nX(DebugLine,           debug_line,          \"DEBUG LINE\")     \\\nX(DebugStr,            debug_str,           \"DEBUG STR\")      \\\nX(DebugLoc,            debug_loc,           \"DEBUG LOC\")      \\\nX(DebugRanges,         debug_ranges,        \"DEBUG RANGES\")   \\\nX(DebugARanges,        debug_aranges,       \"DEBUG ARANGES\")  \\\nX(DebugAddr,           debug_addr,          \"DEBUG ADDR\")     \\\nX(DebugLocLists,       debug_loclists,      \"DEBUG LOCLISTS\") \\\nX(DebugRngLists,       debug_rnglists,      \"DEBUG RNGLISTS\") \\\nX(DebugPubNames,       debug_pubnames,      \"DEBUG PUBNAMES\") \\\nX(DebugPubTypes,       debug_pubtypes,      \"DEBUG PUBTYPES\") \\\nX(DebugLineStr,        debug_linestr,       \"DEBUG LINESTR\")  \\\nX(DebugStrOffsets,     debug_stroff,        \"DEBUG STROFF\")   \\\nX(DebugFrame,          debug_frame,         \"DEBUG FRAME\")    \\\n\ntypedef enum DW_DumpSubset\n{\n#define X(name, name_lower, title) DW_DumpSubset_##name,\n  DW_DumpSubset_XList\n#undef X\n}\nDW_DumpSubset;\n\ntypedef U32 DW_DumpSubsetFlags;\nenum\n{\n#define X(name, name_lower, title) DW_DumpSubsetFlag_##name = (1<<DW_DumpSubset_##name),\n  DW_DumpSubset_XList\n#undef X\n  DW_DumpSubsetFlag_All = 0xffffffffu,\n};\n\nread_only global String8 dw_name_lowercase_from_dump_subset_table[] =\n{\n#define X(name, name_lower, title) str8_lit_comp(#name_lower),\n  DW_DumpSubset_XList\n#undef X\n};\n\nread_only global String8 dw_name_title_from_dump_subset_table[] =\n{\n#define X(name, name_lower, title) str8_lit_comp(title),\n  DW_DumpSubset_XList\n#undef X\n};\n\n////////////////////////////////\n//~ rjf: Stringification Helpers\n\ninternal String8 dw_string_from_reg_off(Arena *arena, Arch arch, DW_Reg reg_idx, S64 reg_off);\ninternal String8 dw_string_from_reg(Arena *arena, Arch arch, DW_Reg reg_idx);\ninternal String8List dw_string_list_from_expression(Arena *arena, String8 raw_data, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format);\ninternal String8 dw_string_from_expression(Arena *arena, String8 expr, U64 cu_base, U64 addr_size, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format);\n\ninternal String8List dw_string_list_from_cfi_program(Arena *arena, U64 cu_base, Arch arch, DW_Version ver, DW_Ext ext, DW_Format format, U64 pc_begin, DW_CIE *cie, DW_DecodePtr *decode_ptr_func, void *deocde_ptr_ud, String8 program);\n\ninternal String8 dw_string_from_cfa(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFA cfa);\ninternal String8 dw_string_from_cfi_row(Arena *arena, Arch arch, U64 address_size, DW_Version version, DW_Ext ext, DW_Format format, DW_CFI_Row *row);\n\n#if 0\ninternal void dw_print_eh_frame         (Arena *arena, String8List *out, String8 indent, String8 raw_eh_frame, Arch arch, DW_Version ver, DW_Ext ext, EH_PtrCtx *ptr_ctx);\ninternal void dw_print_debug_loc        (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed);\ninternal void dw_print_debug_ranges     (Arena *arena, String8List *out, String8 indent, DW_Input *input, Arch arch, ExecutableImageKind image_type, B32 relaxed);\ninternal void dw_print_debug_aranges    (Arena *arena, String8List *out, String8 indent, DW_Input *input);\ninternal void dw_print_debug_addr       (Arena *arena, String8List *out, String8 indent, DW_Input *input);\ninternal void dw_print_debug_loclists   (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges, Arch arch);\ninternal void dw_print_debug_rnglists   (Arena *arena, String8List *out, String8 indent, DW_Input *input, Rng1U64Array segment_vranges);\ninternal void dw_print_debug_pubnames   (Arena *arena, String8List *out, String8 indent, DW_Input *input);\ninternal void dw_print_debug_pubtypes   (Arena *arena, String8List *out, String8 indent, DW_Input *input);\ninternal void dw_print_debug_line_str   (Arena *arena, String8List *out, String8 indent, DW_Input *input);\ninternal void dw_print_debug_str_offsets(Arena *arena, String8List *out, String8 indent, DW_Input *input);\n#endif\n\n////////////////////////////////\n//~ rjf: Dump Entry Point\n\ninternal String8List dw_dump_list_from_sections(Arena *arena, DW_Input *input, Arch arch, DW_DumpSubsetFlags subset_flags);\n\n#endif // DWARF_DUMP_H\n"
  },
  {
    "path": "src/dwarf/dwarf_elf.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal B32\ndw_is_dwarf_present_from_elf_bin(String8 data, ELF_Bin *bin)\n{\n  B32 is_dwarf_present = 0;\n  for EachIndex(idx, bin->shdrs.count)\n  {\n    ELF_Shdr64 *shdr = &bin->shdrs.v[idx];\n    if(shdr->sh_type != ELF_ShType_ProgBits) { continue; }\n    String8 name = elf_name_from_shdr64(data, bin, shdr);\n    DW_SectionKind s = dw_section_kind_from_string(name);\n    if(s == DW_Section_Null)\n    {\n      s = dw_section_dwo_kind_from_string(name);\n    }\n    is_dwarf_present = (s != DW_Section_Null);\n    if(is_dwarf_present)\n    {\n      break;\n    }\n  }\n  return is_dwarf_present;\n}\n\n#define SINFL_IMPLEMENTATION\n#include \"third_party/sinfl/sinfl.h\"\n\ninternal DW_Input\ndw_input_from_elf_bin(Arena *arena, String8 data, ELF_Bin *bin)\n{\n  DW_Input result = {0};\n  B32 is_section_present[ArrayCount(result.sec)] = {0};\n  for(U64 section_idx = 1; section_idx < bin->shdrs.count; section_idx += 1)\n  {\n    ELF_Shdr64 *shdr = &bin->shdrs.v[section_idx];\n    if(shdr->sh_type != ELF_ShType_ProgBits) { continue; } // skip BSS sections\n    \n    //- rjf: unpack section\n    String8 section_name = elf_name_from_shdr64(data, bin, shdr);\n    DW_SectionKind section_kind = dw_section_kind_from_string(section_name);\n    String8 section_data__maybe_compressed = str8_substr(data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size));\n    B32 is_dwo = 0;\n    if(section_kind == DW_Section_Null)\n    {\n      section_kind = dw_section_dwo_kind_from_string(section_name);\n      is_dwo = (section_kind != DW_Section_Null);\n    }\n    \n    if(section_kind == DW_Section_Null)  { continue; } // skip unknown sections\n    if(is_section_present[section_kind]) { continue; } // skip duplicate sections\n    \n    //- rjf: decompress section data if needed\n    String8 section_data__uncompressed = {0};\n    if(!(shdr->sh_flags & ELF_Shf_Compressed))\n    {\n      section_data__uncompressed = section_data__maybe_compressed;\n    }\n    else\n    {\n      // rjf: read compressed-section header\n      ELF_Chdr64 chdr64 = {0};\n      U64 chdr_size = 0;\n      if(ELF_HdrIs64Bit(bin->hdr.e_ident))\n      {\n        chdr_size = str8_deserial_read_struct(section_data__maybe_compressed, 0, &chdr64);\n      }\n      else if(ELF_HdrIs32Bit(bin->hdr.e_ident))\n      {\n        ELF_Chdr32 chdr32 = {0};\n        chdr_size = str8_deserial_read_struct(section_data__maybe_compressed, 0, &chdr32);\n        if(chdr_size == sizeof(chdr32))\n        {\n          chdr64 = elf_chdr64_from_chdr32(chdr32);\n        }\n      }\n      \n      // rjf: decompress\n      {\n        String8 section_data__compressed_contents = str8_skip(section_data__maybe_compressed, chdr_size);\n        switch(chdr64.ch_type)\n        {\n          case ELF_CompressType_None:\n          {\n            section_data__uncompressed = section_data__compressed_contents;\n          }break;\n          case ELF_CompressType_ZLib:\n          {\n            U8 *section_data_uncompressed_buffer = push_array_no_zero_aligned(arena, U8, chdr64.ch_size, chdr64.ch_addr_align);\n            U64 section_data_uncompressed_size = zsinflate(section_data_uncompressed_buffer, chdr64.ch_size, section_data__compressed_contents.str, section_data__compressed_contents.size);\n            section_data__uncompressed = str8(section_data_uncompressed_buffer, section_data_uncompressed_size);\n          }break;\n          case ELF_CompressType_ZStd:\n          {\n            NotImplemented;\n          }break;\n          default:\n          {\n            NotImplemented;\n          }break;\n        }\n      }\n    }\n    \n    //- rjf: store\n    is_section_present[section_kind] = 1;\n    DW_Section *d = &result.sec[section_kind];\n    d->name   = push_str8_copy(arena, section_name);\n    d->data   = section_data__uncompressed;\n    d->is_dwo = is_dwo;\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/dwarf/dwarf_elf.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_ELF_H\n#define DWARF_ELF_H\n\ninternal B32 dw_is_dwarf_present_from_elf_bin(String8 raw_image, ELF_Bin *bin);\ninternal DW_Input dw_input_from_elf_bin(Arena *arena, String8 raw_image, ELF_Bin *bin);\n\n#endif // DWARF_ELF_H\n"
  },
  {
    "path": "src/dwarf/dwarf_expr.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n//- analyzers\n\n#if 0\ninternal DW_SimpleLoc\ndw_expr__analyze_fast(void *base, Rng1U64 range, U64 text_section_base)\n{\n  DW_SimpleLoc result = {DW_SimpleLocKind_Empty};\n  \n  String8 expr_data = str8((U8*)data+range.min, (U8*)data+range.max);\n  \n  U8 op = 0;\n  if (str8_deserial_read_struct(expr_data, 0, &op)) {\n    // step params\n    U64 size_param = 0;\n    B32 is_signed  = 0;\n    \n    // step\n    U64 step_cursor = 1;\n    switch (op) {\n      \n      //// literal encodings ////\n      \n      case DW_ExprOp_Lit0:  case DW_ExprOp_Lit1:  case DW_ExprOp_Lit2:\n      case DW_ExprOp_Lit3:  case DW_ExprOp_Lit4:  case DW_ExprOp_Lit5:\n      case DW_ExprOp_Lit6:  case DW_ExprOp_Lit7:  case DW_ExprOp_Lit8:\n      case DW_ExprOp_Lit9:  case DW_ExprOp_Lit10: case DW_ExprOp_Lit11:\n      case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14:\n      case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17:\n      case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20:\n      case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23:\n      case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26:\n      case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29:\n      case DW_ExprOp_Lit30: case DW_ExprOp_Lit31:\n      {\n        U64 x = op - DW_ExprOp_Lit0;\n        result.kind = DW_SimpleLocKind_Address;\n        result.addr = x;\n      } break;\n      \n      case DW_ExprOp_Const1U:size_param = 1; goto const_n;\n      case DW_ExprOp_Const2U:size_param = 2; goto const_n;\n      case DW_ExprOp_Const4U:size_param = 4; goto const_n;\n      case DW_ExprOp_Const8U:size_param = 8; goto const_n;\n      case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n;\n      case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n;\n      case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n;\n      case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n;\n      const_n:\n      {\n        U64 x = 0;\n        step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &x);\n        \n        if (is_signed) {\n          x = extend_sign64(x, size_param);\n        }\n        \n        result.kind = DW_SimpleLocKind_Address;\n        result.addr = x;\n      } break;\n      \n      case DW_ExprOp_Addr:\n      {\n        U64 offset = 0;\n        step_cursor += dw_based_range_read(base, range, step_cursor, 8, &offset);\n        U64 x = text_section_base + offset;\n        result.kind = DW_SimpleLocKind_Address;\n        result.addr = x;\n      } break;\n      \n      case DW_ExprOp_ConstU:\n      {\n        U64 x = 0;\n        step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &x);\n        result.kind = DW_SimpleLocKind_Address;\n        result.addr = x;\n      } break;\n      \n      case DW_ExprOp_ConstS:\n      {\n        U64 x = 0;\n        step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, (S64*)&x);\n        result.kind = DW_SimpleLocKind_Address;\n        result.addr = x;\n      } break;\n      \n      \n      //// register location descriptions ////\n      \n      case DW_ExprOp_Reg0:  case DW_ExprOp_Reg1:  case DW_ExprOp_Reg2:\n      case DW_ExprOp_Reg3:  case DW_ExprOp_Reg4:  case DW_ExprOp_Reg5:\n      case DW_ExprOp_Reg6:  case DW_ExprOp_Reg7:  case DW_ExprOp_Reg8:\n      case DW_ExprOp_Reg9:  case DW_ExprOp_Reg10: case DW_ExprOp_Reg11:\n      case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14:\n      case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17:\n      case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20:\n      case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23:\n      case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26:\n      case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29:\n      case DW_ExprOp_Reg30: case DW_ExprOp_Reg31:\n      {\n        U64 reg_idx = op - DW_ExprOp_Reg0;\n        result.kind    = DW_SimpleLocKind_Register;\n        result.reg_idx = reg_idx;\n      } break;\n      \n      case DW_ExprOp_RegX:\n      {\n        U64 reg_idx = 0;\n        step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &reg_idx);\n        result.kind    = DW_SimpleLocKind_Register;\n        result.reg_idx = reg_idx;\n      } break;\n      \n      \n      //// implicit location descriptions ////\n      \n      case DW_ExprOp_ImplicitValue:\n      {\n        U64 size = 0;\n        step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &size);\n        if (step_cursor + size <= range.max) {\n          result.kind          = DW_SimpleLocKind_ValueLong;\n          result.val_long.str  = (U8*)base + range.min + step_cursor;\n          result.val_long.size = size;\n        }\n        step_cursor += size;\n      } break;\n      \n      case DW_ExprOp_StackValue:\n      {\n        // this op pops from the value stack, so if it comes first the dwarf expression is bad.\n        result.kind      = DW_SimpleLocKind_Fail;\n        result.fail_kind = DW_LocFailKind_BadData;\n      } break;\n      \n      \n      //// composite location descriptions ////\n      \n      // if the first and only op is a piece, the expression is empty\n      \n      case DW_ExprOp_Piece:\n      {\n        U64 size = 0;\n        step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &size);\n        result.kind = DW_SimpleLocKind_Empty;\n      } break;\n      \n      case DW_ExprOp_BitPiece:\n      {\n        U64 bit_size = 0, bit_off = 0;\n        step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_size);\n        step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_off);\n        result.kind = DW_SimpleLocKind_Empty;\n      } break;\n      \n      \n      //// final fallback ////\n      \n      default:\n      {\n        result.kind      = DW_SimpleLocKind_Fail;\n        result.fail_kind = DW_LocFailKind_TooComplicated;\n      } break;\n    }\n    \n    // check this was the whole expression\n    if (range.min + step_cursor < range.max) {\n      result.kind      = DW_SimpleLocKind_Fail;\n      result.fail_kind = DW_LocFailKind_TooComplicated;\n    }\n  }\n  \n  return result;\n}\n\ninternal DW_ExprAnalysis\ndw_expr__analyze_details(void *in_base, Rng1U64 in_range, DW_ExprMachineCallConfig *call_config)\n{\n  Temp scratch = scratch_begin(0, 0);\n  \n  DW_ExprAnalysis result = {0};\n  \n  // are we resolving calls?\n  B32 has_call_func = (call_config != 0 && call_config->func != 0);\n  \n  // tasks\n  DW_ExprAnalysisTask *unfinished_tasks = 0;\n  DW_ExprAnalysisTask *finished_tasks   = 0;\n  \n  // convert range input to string\n  String8 in_data = str8((U8*)in_base + in_range.min, in_range.max - in_range.min);\n  \n  // put input task onto the list\n  {\n    DW_ExprAnalysisTask *new_task = push_array(scratch.arena, DW_ExprAnalysisTask, 1);\n    new_task->p                   = max_U64;\n    new_task->data                = in_data;\n    SLLStackPush(unfinished_tasks, new_task);\n  }\n  \n  // state for checking implicit locations\n  B32 last_was_implicit_loc = 0;\n  \n  // task loop\n  for (;;) {\n    // get next task to handle\n    DW_ExprAnalysisTask *task = unfinished_tasks;\n    if (task == 0) {\n      break;\n    }\n    \n    String8  task_data  = task->data;\n    U8      *task_base  = task_data.str;\n    Rng1U64  task_range = rng_1u64(0, task_data.size);\n    \n    // move the task to finished now\n    SLLStackPop(unfinished_tasks);\n    SLLStackPush(finished_tasks, task);\n    \n    // analysis loop\n    for (U64 cursor = 0;;) {\n      // decode op\n      U64 op_offset = cursor;\n      U8  op        = 0;\n      if (dw_based_range_read(task_base, task_range, op_offset, 1, &op)) {\n        U64 after_op_off = cursor + 1;\n        \n        // require piece op after 'implicit' location descriptions\n        if (last_was_implicit_loc) {\n          if (op != DW_ExprOp_Piece && op != DW_ExprOp_BitPiece) {\n            result.flags |= DW_ExprFlag_BadData;\n            goto finish;\n          }\n        }\n        \n        // step params\n        U64 size_param = 0;\n        B32 is_signed  = 0;\n        \n        // step\n        U64 step_cursor = after_op_off;\n        switch (op) {\n          \n          //// literal encodings ////\n          \n          case DW_ExprOp_Lit0:  case DW_ExprOp_Lit1:  case DW_ExprOp_Lit2:\n          case DW_ExprOp_Lit3:  case DW_ExprOp_Lit4:  case DW_ExprOp_Lit5:\n          case DW_ExprOp_Lit6:  case DW_ExprOp_Lit7:  case DW_ExprOp_Lit8:\n          case DW_ExprOp_Lit9:  case DW_ExprOp_Lit10: case DW_ExprOp_Lit11:\n          case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14:\n          case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17:\n          case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20:\n          case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23:\n          case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26:\n          case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29:\n          case DW_ExprOp_Lit30: case DW_ExprOp_Lit31:\n          break;\n          \n          case DW_ExprOp_Const1U:size_param = 1; goto const_n;\n          case DW_ExprOp_Const2U:size_param = 2; goto const_n;\n          case DW_ExprOp_Const4U:size_param = 4; goto const_n;\n          case DW_ExprOp_Const8U:size_param = 8; goto const_n;\n          case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n;\n          case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n;\n          case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n;\n          case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n;\n          const_n:\n          {\n            U64 x = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &x);\n          } break;\n          \n          case DW_ExprOp_Addr:\n          {\n            U64 offset = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 8, &offset);\n            result.flags |= DW_ExprFlag_UsesTextBase;\n          } break;\n          \n          case DW_ExprOp_ConstU:\n          {\n            U64 x = 0;\n            step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &x);\n          } break;\n          \n          case DW_ExprOp_ConstS:\n          {\n            U64 x = 0;\n            step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, (S64*)&x);\n          } break;\n          \n          \n          //// register based addressing ////\n          \n          case DW_ExprOp_FBReg:\n          {\n            S64 offset = 0;\n            step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, &offset);\n            result.flags |= DW_ExprFlag_UsesFrameBase;\n          } break;\n          \n          case DW_ExprOp_BReg0:  case DW_ExprOp_BReg1:  case DW_ExprOp_BReg2:\n          case DW_ExprOp_BReg3:  case DW_ExprOp_BReg4:  case DW_ExprOp_BReg5:\n          case DW_ExprOp_BReg6:  case DW_ExprOp_BReg7:  case DW_ExprOp_BReg8:\n          case DW_ExprOp_BReg9:  case DW_ExprOp_BReg10: case DW_ExprOp_BReg11:\n          case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14:\n          case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17:\n          case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20:\n          case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23:\n          case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26:\n          case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29:\n          case DW_ExprOp_BReg30: case DW_ExprOp_BReg31:\n          {\n            S64 offset = 0;\n            step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, &offset);\n            result.flags |= DW_ExprFlag_UsesRegisters;\n          } break;\n          \n          case DW_ExprOp_BRegX:\n          {\n            U64 reg_idx = 0; S64 offset = 0;\n            step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &reg_idx);\n            step_cursor += dw_based_range_read_sleb128(task_base, task_range, step_cursor, &offset);\n            result.flags |= DW_ExprFlag_UsesRegisters;\n          } break;\n          \n          \n          //// stack operations ////\n          \n          case DW_ExprOp_Dup:\n          case DW_ExprOp_Drop:\n          break;\n          \n          case DW_ExprOp_Pick:\n          {\n            U64 idx = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 1, &idx);\n          } break;\n          \n          case DW_ExprOp_Over:\n          case DW_ExprOp_Swap:\n          case DW_ExprOp_Rot:\n          break;\n          \n          case DW_ExprOp_Deref:\n          {\n            result.flags |= DW_ExprFlag_UsesMemory;\n          } break;\n          \n          case DW_ExprOp_DerefSize:\n          {\n            U64 size = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 1, &size);\n            result.flags |= DW_ExprFlag_UsesMemory;\n          } break;\n          \n          case DW_ExprOp_XDeref:\n          case DW_ExprOp_XDerefSize:\n          {\n            result.flags |= DW_ExprFlag_NotSupported;\n          } goto finish;\n          \n          case DW_ExprOp_PushObjectAddress:\n          {\n            result.flags |= DW_ExprFlag_UsesObjectAddress;\n          } break;\n          \n          case DW_ExprOp_GNU_PushTlsAddress:\n          case DW_ExprOp_FormTlsAddress:\n          {\n            result.flags |= DW_ExprFlag_UsesTLSAddress;\n          } break;\n          \n          case DW_ExprOp_CallFrameCfa:\n          {\n            result.flags |= DW_ExprFlag_UsesCFA;\n          } break;\n          \n          \n          //// arithmetic and logical operations ////\n          \n          case DW_ExprOp_Abs:\n          case DW_ExprOp_And:\n          case DW_ExprOp_Div:\n          case DW_ExprOp_Minus:\n          case DW_ExprOp_Mod:\n          case DW_ExprOp_Mul:\n          case DW_ExprOp_Neg:\n          case DW_ExprOp_Not:\n          case DW_ExprOp_Or:\n          case DW_ExprOp_Plus:\n          break;\n          \n          case DW_ExprOp_PlusUConst:\n          {\n            U64 y = 0;\n            step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &y);\n          } break;\n          \n          case DW_ExprOp_Shl:\n          case DW_ExprOp_Shr:\n          case DW_ExprOp_Shra:\n          case DW_ExprOp_Xor:\n          break;\n          \n          \n          //// control flow operations ////\n          \n          case DW_ExprOp_Le:\n          case DW_ExprOp_Ge:\n          case DW_ExprOp_Eq:\n          case DW_ExprOp_Lt:\n          case DW_ExprOp_Gt:\n          case DW_ExprOp_Ne:\n          break;\n          \n          case DW_ExprOp_Skip:\n          case DW_ExprOp_Bra:\n          {\n            S16 d = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, 2, &d);\n            result.flags |= DW_ExprFlag_NonLinearFlow;\n          } break;\n          \n          case DW_ExprOp_Call2:size_param = 2; goto callN;\n          case DW_ExprOp_Call4:size_param = 4; goto callN;\n          callN:\n          {\n            U64 p = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &p);\n            result.flags |= DW_ExprFlag_UsesCallResolution|DW_ExprFlag_NonLinearFlow;\n            \n            // add to task list\n            if (has_call_func) {\n              DW_ExprAnalysisTask *existing = dw_expr__analysis_task_from_p(unfinished_tasks, p);\n              if (existing == 0) {\n                existing = dw_expr__analysis_task_from_p(finished_tasks, p);;\n              }\n              if (existing == 0) {\n                DW_ExprAnalysisTask *new_task = push_array(scratch.arena, DW_ExprAnalysisTask, 1);\n                new_task->p                   = p;\n                new_task->data                = call_config->func(call_config->user_ptr, p);\n                SLLStackPush(unfinished_tasks, new_task);\n              }\n            }\n          } break;\n          \n          case DW_ExprOp_CallRef:\n          {\n            result.flags |= DW_ExprFlag_NotSupported;\n          } goto finish;\n          \n          \n          //// special operations ////\n          \n          case DW_ExprOp_Nop:break;\n          \n          \n          //// register location descriptions ////\n          \n          case DW_ExprOp_Reg0:  case DW_ExprOp_Reg1:  case DW_ExprOp_Reg2:\n          case DW_ExprOp_Reg3:  case DW_ExprOp_Reg4:  case DW_ExprOp_Reg5:\n          case DW_ExprOp_Reg6:  case DW_ExprOp_Reg7:  case DW_ExprOp_Reg8:\n          case DW_ExprOp_Reg9:  case DW_ExprOp_Reg10: case DW_ExprOp_Reg11:\n          case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14:\n          case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17:\n          case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20:\n          case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23:\n          case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26:\n          case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29:\n          case DW_ExprOp_Reg30: case DW_ExprOp_Reg31:\n          {\n            last_was_implicit_loc = 1;\n          } break;\n          \n          case DW_ExprOp_RegX:\n          {\n            U64 reg_idx = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &reg_idx);\n            last_was_implicit_loc = 1;\n          } break;\n          \n          \n          //// implicit location descriptions ////\n          \n          case DW_ExprOp_ImplicitValue:\n          {\n            U64 size = 0;\n            step_cursor += dw_based_range_read(task_base, task_range, step_cursor, size_param, &size);\n            if (step_cursor + size > task_range.max) {\n              result.flags |= DW_ExprFlag_BadData;\n              goto finish;\n            }\n            step_cursor += size;\n            last_was_implicit_loc = 1;\n          } break;\n          \n          case DW_ExprOp_StackValue:\n          {\n            last_was_implicit_loc = 1;\n          } break;\n          \n          \n          //// composite location descriptions ////\n          \n          case DW_ExprOp_Piece:\n          {\n            U64 size = 0;\n            step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &size);\n            result.flags |= DW_ExprFlag_UsesComposite;\n            \n            last_was_implicit_loc = 0;\n          } break;\n          \n          case DW_ExprOp_BitPiece:\n          {\n            U64 bit_size = 0; U64 bit_off = 0;\n            step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &bit_size);\n            step_cursor += dw_based_range_read_uleb128(task_base, task_range, step_cursor, &bit_off);\n            result.flags |= DW_ExprFlag_UsesComposite;\n            \n            last_was_implicit_loc = 0;\n          } break;\n          \n          \n          //// final fallback ////\n          \n          default:\n          {\n            result.flags |= DW_ExprFlag_NotSupported;\n          } goto finish;\n        }\n        \n        // increment cursor\n        cursor = step_cursor;\n      }\n      \n      // check for end of task\n      if (cursor < task_data.size) {\n        goto finish_task;\n      }\n    }\n    \n    finish_task:;\n  }\n  finish:;\n  \n  scratch_end(scratch);\n  return result;\n}\n#endif\n\n//- full eval\n\ninternal DW_Location\ndw_expr__eval(Arena *arena_optional, void *expr_base, Rng1U64 expr_range, DW_ExprMachineConfig *config)\n{\n#if 0\n  Temp scratch = scratch_begin(&arena_optional, 1);\n  \n  DW_Location result = {0};\n  \n  // setup stack\n  DW_ExprStack stack = dw_expr__stack_make(scratch.arena);\n  \n  // adjust expr range\n  void *expr_ptr  = (U8*)expr_base + expr_range.min;\n  U64   expr_size = expr_range.max - expr_range.min;\n  \n  // setup call stack\n  DW_ExprCallStack call_stack = {0};\n  dw_expr__call_push(scratch.arena, &call_stack, expr_ptr, expr_size);\n  \n  // state variables\n  DW_SimpleLoc stashed_loc = {DW_SimpleLocKind_Address};\n  \n  // run loop\n  U64 max_step_count = config->max_step_count;\n  U64 step_counter   = 0;\n  for (;;) {\n    // check top of stack\n    DW_ExprCall *call = dw_expr__call_top(&call_stack);\n    if (call == 0) {\n      goto finish;\n    }\n    \n    // grab top of stack details\n    void    *base   = call->ptr;\n    Rng1U64  range  = rng_1u64(0, call->size);\n    U64      cursor = call->cursor;\n    \n    // decode op\n    U64 op_offset = cursor;\n    U8  op        = 0;\n    if (dw_based_range_read(base, range, op_offset, 1, &op)) {\n      U64 after_op_off = cursor + 1;\n      \n      // require piece op after 'implicit' location descriptions\n      if (stashed_loc.kind != DW_SimpleLocKind_Address) {\n        if (op != DW_ExprOp_Piece && op != DW_ExprOp_BitPiece) {\n          stashed_loc.kind      = DW_SimpleLocKind_Fail;\n          stashed_loc.fail_kind = DW_LocFailKind_BadData;\n          goto finish;\n        }\n      }\n      \n      // step params\n      U64 size_param = 0;\n      B32 is_signed  = 0;\n      \n      // step\n      U64 step_cursor = after_op_off;\n      switch (op) {\n        \n        //// literal encodings ////\n        \n        case DW_ExprOp_Lit0:  case DW_ExprOp_Lit1:  case DW_ExprOp_Lit2:\n        case DW_ExprOp_Lit3:  case DW_ExprOp_Lit4:  case DW_ExprOp_Lit5:\n        case DW_ExprOp_Lit6:  case DW_ExprOp_Lit7:  case DW_ExprOp_Lit8:\n        case DW_ExprOp_Lit9:  case DW_ExprOp_Lit10: case DW_ExprOp_Lit11:\n        case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14:\n        case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17:\n        case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20:\n        case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23:\n        case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26:\n        case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29:\n        case DW_ExprOp_Lit30: case DW_ExprOp_Lit31:\n        {\n          U64 x = op - DW_ExprOp_Lit0;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Const1U:size_param = 1; goto const_n;\n        case DW_ExprOp_Const2U:size_param = 2; goto const_n;\n        case DW_ExprOp_Const4U:size_param = 4; goto const_n;\n        case DW_ExprOp_Const8U:size_param = 8; goto const_n;\n        case DW_ExprOp_Const1S:size_param = 1; is_signed = 1; goto const_n;\n        case DW_ExprOp_Const2S:size_param = 2; is_signed = 1; goto const_n;\n        case DW_ExprOp_Const4S:size_param = 4; is_signed = 1; goto const_n;\n        case DW_ExprOp_Const8S:size_param = 8; is_signed = 1; goto const_n;\n        const_n:\n        {\n          U64 x = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &x);\n          if (is_signed) {\n            x = extend_sign64(x, size_param);\n          }\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Addr:\n        {\n          U64 offset = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 8, &offset);\n          \n          // earlier versions of GCC emit TLS offset with DW_ExprOp_Addr.\n          B32 is_text_relative;\n          {\n            U8 next_op = 0;\n            dw_based_range_read_struct(base, range, step_cursor, &next_op);\n            is_text_relative = (next_op != DW_ExprOp_GNU_PushTlsAddress);\n          }\n          \n          U64 addr = offset;\n          \n          if (is_text_relative) {\n            if (config->text_section_base != 0) {\n              addr += *config->text_section_base;\n            } else {\n              stashed_loc.kind = DW_SimpleLocKind_Fail;\n              stashed_loc.fail_kind = DW_LocFailKind_MissingTextBase;\n              goto finish;\n            }\n          }\n          \n          dw_expr__stack_push(scratch.arena, &stack, addr);\n        } break;\n        \n        case DW_ExprOp_ConstU:\n        {\n          U64 x = 0;\n          step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &x);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_ConstS:\n        {\n          U64 x = 0;\n          step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, (S64*)&x);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        \n        //// register based addressing ////\n        \n        case DW_ExprOp_FBReg:\n        {\n          S64 offset = 0;\n          step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, &offset);\n          if (config->frame_base != 0) {\n            U64 x = *config->frame_base + offset;\n            dw_expr__stack_push(scratch.arena, &stack, x);\n          } else {\n            stashed_loc.kind = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingFrameBase;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_BReg0:  case DW_ExprOp_BReg1:  case DW_ExprOp_BReg2:\n        case DW_ExprOp_BReg3:  case DW_ExprOp_BReg4:  case DW_ExprOp_BReg5:\n        case DW_ExprOp_BReg6:  case DW_ExprOp_BReg7:  case DW_ExprOp_BReg8:\n        case DW_ExprOp_BReg9:  case DW_ExprOp_BReg10: case DW_ExprOp_BReg11:\n        case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14:\n        case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17:\n        case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20:\n        case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23:\n        case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26:\n        case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29:\n        case DW_ExprOp_BReg30: case DW_ExprOp_BReg31:\n        {\n          S64 offset = 0;\n          step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, &offset);\n          U64         reg_idx = op - DW_ExprOp_BReg0;\n          DW_RegsX64 *regs    = config->regs;\n          if (regs != 0) {\n            if (reg_idx < ArrayCount(regs->r)) {\n              U64 x = regs->r[reg_idx] + offset;\n              dw_expr__stack_push(scratch.arena, &stack, x);\n            } else {\n              stashed_loc.kind      = DW_SimpleLocKind_Fail;\n              stashed_loc.fail_kind = DW_LocFailKind_BadData;\n              stashed_loc.fail_data = op_offset;\n              goto finish;\n            }\n          } else {\n            stashed_loc.kind      = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingRegisters;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_BRegX:\n        {\n          U64 reg_idx = 0; S64 offset = 0;\n          step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &reg_idx);\n          step_cursor += dw_based_range_read_sleb128(base, range, step_cursor, &offset);\n          \n          DW_RegsX64 *regs = config->regs;\n          if (regs != 0) {\n            if (reg_idx < ArrayCount(regs->r)) {\n              U64 x = regs->r[reg_idx] + offset;\n              dw_expr__stack_push(scratch.arena, &stack, x);\n            } else {\n              stashed_loc.kind      = DW_SimpleLocKind_Fail;\n              stashed_loc.fail_kind = DW_LocFailKind_BadData;\n              stashed_loc.fail_data = op_offset;\n              goto finish;\n            }\n          } else {\n            stashed_loc.kind      = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingRegisters;\n            goto finish;\n          }\n        } break;\n        \n        \n        //// stack operations ////\n        \n        case DW_ExprOp_Dup:\n        {\n          U64 x = dw_expr__stack_pick(&stack, 0);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Drop:\n        {\n          dw_expr__stack_pop(&stack);\n        } break;\n        \n        case DW_ExprOp_Pick:\n        {\n          U64 idx = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 1, &idx);\n          U64 x = dw_expr__stack_pick(&stack, idx);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Over:\n        {\n          U64 x = dw_expr__stack_pick(&stack, 1);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Swap:\n        {\n          U64 a = dw_expr__stack_pop(&stack);\n          U64 b = dw_expr__stack_pop(&stack);\n          dw_expr__stack_push(scratch.arena, &stack, b);\n          dw_expr__stack_push(scratch.arena, &stack, a);\n        } break;\n        \n        case DW_ExprOp_Rot:\n        {\n          U64 a = dw_expr__stack_pop(&stack);\n          U64 b = dw_expr__stack_pop(&stack);\n          U64 c = dw_expr__stack_pop(&stack);\n          dw_expr__stack_push(scratch.arena, &stack, a);\n          dw_expr__stack_push(scratch.arena, &stack, c);\n          dw_expr__stack_push(scratch.arena, &stack, b);\n        } break;\n        \n        case DW_ExprOp_Deref:\n        {\n          U64 addr = dw_expr__stack_pop(&stack);\n          \n          B32 read_success = 0;\n          if (config->read_memory) {\n            U64 x = 0;\n            if (config->read_memory(addr, sizeof(x), &x, config->read_memory_ud) == sizeof(x)) {\n              dw_expr__stack_push(scratch.arena, &stack, x);\n              read_success = 1;\n            }\n          }\n          \n          if (!read_success) {\n            stashed_loc.kind      = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingMemory;\n            stashed_loc.fail_data = addr;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_DerefSize:\n        {\n          U64 raw_size = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 1, &raw_size);\n          \n          U64 size = ClampTop(raw_size, 8);\n          U64 addr = dw_expr__stack_pop(&stack);\n          \n          B32 read_success = 0;\n          if (config->read_memory) {\n            U64 x = 0;\n            if (config->read_memory(addr, size, &x, config->read_memory_ud) == sizeof(x)) {\n              dw_expr__stack_push(scratch.arena, &stack, x);\n              read_success = 1;\n            }\n          }\n          if (!read_success) {\n            stashed_loc.kind      = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingMemory;\n            stashed_loc.fail_data = addr;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_XDeref:\n        case DW_ExprOp_XDerefSize:\n        {\n          stashed_loc.kind      = DW_SimpleLocKind_Fail;\n          stashed_loc.fail_kind = DW_LocFailKind_NotSupported;\n          goto finish;\n        } break;\n        \n        case DW_ExprOp_PushObjectAddress:\n        {\n          if (config->object_address != 0) {\n            U64 x = *config->object_address;\n            dw_expr__stack_push(scratch.arena, &stack, x);\n          } else {\n            stashed_loc.kind      = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingObjectAddress;\n            goto finish;\n          }\n        } break;\n        \n        // NOTE: pop offset from stack, convert it to TLS address, then push it back.\n        case DW_ExprOp_GNU_PushTlsAddress:\n        case DW_ExprOp_FormTlsAddress:\n        {\n          S64 s = (S64)dw_expr__stack_pop(&stack);\n          \n          if (config->tls_address != 0) {\n            U64 x = *config->tls_address + s;\n            dw_expr__stack_push(scratch.arena, &stack, x);\n          } else {\n            stashed_loc.kind = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingTLSAddress;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_CallFrameCfa:\n        {\n          if (config->cfa != 0) {\n            U64 x = *config->cfa;\n            dw_expr__stack_push(scratch.arena, &stack, x);\n          } else {\n            stashed_loc.kind      = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingCFA;\n            goto finish;\n          }\n        } break;\n        \n        \n        //// arithmetic and logical operations ////\n        \n        case DW_ExprOp_Abs:\n        {\n          S64 s = (S64)dw_expr__stack_pop(&stack);\n          S64 x = abs_s64(s);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_And:\n        {\n          U64 x = dw_expr__stack_pop(&stack);\n          U64 y = dw_expr__stack_pop(&stack);\n          dw_expr__stack_push(scratch.arena, &stack, x&y);\n        } break;\n        \n        case DW_ExprOp_Div:\n        {\n          S64 d = (S64)dw_expr__stack_pop(&stack);\n          S64 n = (S64)dw_expr__stack_pop(&stack);\n          S64 x = (d == 0)?0:n/d;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Minus:\n        {\n          U64 b = dw_expr__stack_pop(&stack);\n          U64 a = dw_expr__stack_pop(&stack);\n          U64 x = a - b;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Mod:\n        {\n          S64 d = (S64)dw_expr__stack_pop(&stack);\n          S64 n = (S64)dw_expr__stack_pop(&stack);\n          S64 x = (d == 0)?0:n%d;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Mul:\n        {\n          U64 b = dw_expr__stack_pop(&stack);\n          U64 a = dw_expr__stack_pop(&stack);\n          U64 x = a*b;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Neg:\n        {\n          S64 s = (S64)dw_expr__stack_pop(&stack);\n          S64 x = -s;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Not:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 x = ~y;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Or:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = y | z;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Plus:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = y + z;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_PlusUConst:\n        {\n          U64 y = 0;\n          step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &y);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = y + z;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Shl:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = 0;\n          if (y < 64) {\n            x = z << y;\n          }\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Shr:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = 0;\n          if (y < 64) {\n            x = z >> y;\n          }\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Shra:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = 0;\n          if (y < 64) {\n            x = z >> y;\n            // sign extensions\n            if (y > 0 && (z & (1ull << 63))) {\n              x |= ~((1 << (64 - y)) - 1);\n            }\n          }\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Xor:\n        {\n          U64 y = dw_expr__stack_pop(&stack);\n          U64 z = dw_expr__stack_pop(&stack);\n          U64 x = y ^ z;\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        \n        //// control flow operations ////\n        \n        case DW_ExprOp_Le:\n        {\n          S64 b = (S64)dw_expr__stack_pop(&stack);\n          S64 a = (S64)dw_expr__stack_pop(&stack);\n          U64 x = (a <= b);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Ge:\n        {\n          S64 b = (S64)dw_expr__stack_pop(&stack);\n          S64 a = (S64)dw_expr__stack_pop(&stack);\n          U64 x = (a >= b);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Eq:\n        {\n          S64 b = (S64)dw_expr__stack_pop(&stack);\n          S64 a = (S64)dw_expr__stack_pop(&stack);\n          U64 x = (a == b);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Lt:\n        {\n          S64 b = (S64)dw_expr__stack_pop(&stack);\n          S64 a = (S64)dw_expr__stack_pop(&stack);\n          U64 x = (a < b);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Gt:\n        {\n          S64 b = (S64)dw_expr__stack_pop(&stack);\n          S64 a = (S64)dw_expr__stack_pop(&stack);\n          U64 x = (a > b);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Ne:\n        {\n          S64 b = (S64)dw_expr__stack_pop(&stack);\n          S64 a = (S64)dw_expr__stack_pop(&stack);\n          U64 x = (a != b);\n          dw_expr__stack_push(scratch.arena, &stack, x);\n        } break;\n        \n        case DW_ExprOp_Skip:\n        {\n          S16 d = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 2, &d);\n          step_cursor = step_cursor + d;\n        } break;\n        \n        case DW_ExprOp_Bra:\n        {\n          S16 d = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 2, &d);\n          U64 b = dw_expr__stack_pop(&stack);\n          if (b != 0) {\n            step_cursor = step_cursor + d;\n          }\n        } break;\n        \n        case DW_ExprOp_Call2:\n        {\n          U16 p = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 2, &p);\n          if (config->call.func != 0) {\n            String8 sub_data = config->call.func(config->call.user_ptr, p);\n            dw_expr__call_push(scratch.arena, &call_stack, sub_data.str, sub_data.size);\n          } else {\n            stashed_loc.kind = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingCallResolution;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_Call4:\n        {\n          U32 p = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, 4, &p);\n          if (config->call.func != 0) {\n            String8 sub_data = config->call.func(config->call.user_ptr, p);\n            dw_expr__call_push(scratch.arena, &call_stack, sub_data.str, sub_data.size);\n          } else {\n            stashed_loc.kind = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingCallResolution;\n            goto finish;\n          }\n        } break;\n        \n        case DW_ExprOp_CallRef:\n        {\n          stashed_loc.kind = DW_SimpleLocKind_Fail;\n          stashed_loc.fail_kind = DW_LocFailKind_NotSupported;\n          goto finish;\n        } break;\n        \n        \n        //// special operations ////\n        \n        case DW_ExprOp_Nop:break;\n        \n        \n        //// register location descriptions ////\n        \n        case DW_ExprOp_Reg0:  case DW_ExprOp_Reg1:  case DW_ExprOp_Reg2:\n        case DW_ExprOp_Reg3:  case DW_ExprOp_Reg4:  case DW_ExprOp_Reg5:\n        case DW_ExprOp_Reg6:  case DW_ExprOp_Reg7:  case DW_ExprOp_Reg8:\n        case DW_ExprOp_Reg9:  case DW_ExprOp_Reg10: case DW_ExprOp_Reg11:\n        case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14:\n        case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17:\n        case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20:\n        case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23:\n        case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26:\n        case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29:\n        case DW_ExprOp_Reg30: case DW_ExprOp_Reg31:\n        {\n          U64 reg_idx = op - DW_ExprOp_Reg0;\n          stashed_loc.kind = DW_SimpleLocKind_Register;\n          stashed_loc.reg_idx = reg_idx;\n        } break;\n        \n        case DW_ExprOp_RegX:\n        {\n          U64 reg_idx = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &reg_idx);\n          stashed_loc.kind = DW_SimpleLocKind_Register;\n          stashed_loc.reg_idx = reg_idx;\n        } break;\n        \n        \n        //// implicit location descriptions ////\n        \n        case DW_ExprOp_ImplicitValue:\n        {\n          U64 size = 0;\n          step_cursor += dw_based_range_read(base, range, step_cursor, size_param, &size);\n          if (step_cursor + size <= range.max) {\n            void *data = (U8*)base + range.min + step_cursor;\n            stashed_loc.kind = DW_SimpleLocKind_ValueLong;\n            stashed_loc.val_long.str  = (U8*)data;\n            stashed_loc.val_long.size = size;\n          } else {\n            stashed_loc.kind = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_BadData;\n            goto finish;\n          }\n          step_cursor += size;\n        } break;\n        \n        case DW_ExprOp_StackValue:\n        {\n          U64 x = dw_expr__stack_pop(&stack);\n          stashed_loc.kind = DW_SimpleLocKind_Value;\n          stashed_loc.val = x;\n        } break;\n        \n        \n        //// composite location descriptions ////\n        \n        case DW_ExprOp_Piece:\n        case DW_ExprOp_BitPiece:\n        {\n          if (arena_optional == 0) {\n            stashed_loc.kind = DW_SimpleLocKind_Fail;\n            stashed_loc.fail_kind = DW_LocFailKind_MissingArenaForComposite;\n            goto finish;\n          } else {\n            // determine this piece's size & offset\n            U64 bit_size = 0;\n            U64 bit_off = 0;\n            B32 is_bit_loc = 0;\n            switch (op) {\n              case DW_ExprOp_Piece:\n              {\n                U64 size = 0;\n                step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &size);\n                bit_size = size*8;\n              } break;\n              case DW_ExprOp_BitPiece:\n              {\n                step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_size);\n                step_cursor += dw_based_range_read_uleb128(base, range, step_cursor, &bit_off);\n                is_bit_loc = 1;\n              } break;\n            }\n            \n            // determine this piece's location information\n            DW_SimpleLoc piece_loc = stashed_loc;\n            if (piece_loc.kind == DW_SimpleLocKind_Address) {\n              if (dw_expr__stack_is_empty(&stack)) {\n                piece_loc.kind = DW_SimpleLocKind_Empty;\n              } else {\n                U64 x = dw_expr__stack_pop(&stack);\n                piece_loc.addr = x;\n              }\n            }\n            \n            // push the piece\n            DW_Piece *piece = push_array(arena_optional, DW_Piece, 1);\n            SLLQueuePush(result.first_piece, result.last_piece, piece);\n            piece->loc = piece_loc;\n            piece->bit_size = bit_size;\n            piece->bit_off  = bit_off;\n            piece->is_bit_loc = is_bit_loc;\n            \n            // zero the stached loc\n            MemoryZeroStruct(&stashed_loc);\n          }\n        } break;\n        \n        \n        //// final fallback ////\n        \n        default:\n        {\n          stashed_loc.kind = DW_SimpleLocKind_Fail;\n          stashed_loc.fail_kind = DW_LocFailKind_NotSupported;\n          goto finish;\n        } break;\n      }\n      \n      // increment cursor\n      cursor = step_cursor;\n    }\n    \n    // advance cursor or finish call\n    if (cursor < call->size) {\n      call->cursor = cursor;\n    } else {\n      dw_expr__call_pop(&call_stack);\n    }\n    \n    // advance step counter\n    step_counter += 1;\n    if (step_counter == max_step_count) {\n      stashed_loc.kind = DW_SimpleLocKind_Fail;\n      stashed_loc.fail_kind = DW_LocFailKind_TimeOut;\n      goto finish;\n    }\n  }\n  \n  finish:;\n  \n  // non-piece location\n  {\n    DW_SimpleLoc loc = stashed_loc;\n    if (result.first_piece == 0) {\n      \n      // normal location resolution\n      loc = stashed_loc;\n      if (loc.kind == DW_SimpleLocKind_Address) {\n        if (dw_expr__stack_is_empty(&stack)) {\n          loc.kind = DW_SimpleLocKind_Empty;\n        } else {\n          U64 x = dw_expr__stack_pop(&stack);\n          loc.addr = x;\n        }\n      }\n    }\n    // non-piece location resolution after composite\n    else {\n      \n      // change the default kind to empty\n      if (loc.kind == DW_SimpleLocKind_Address) {\n        loc.kind = DW_SimpleLocKind_Empty;\n      }\n      \n      // the non-piece should either be empty or fail\n      if (loc.kind != DW_SimpleLocKind_Empty &&\n          loc.kind != DW_SimpleLocKind_Fail) {\n        loc.kind = DW_SimpleLocKind_Fail;\n        loc.fail_kind = DW_LocFailKind_BadData;\n      }\n    }\n    \n    result.non_piece_loc = loc;\n  }\n  \n  // clear stack\n  scratch_end(scratch);\n  return result;\n#endif\n  DW_Location result = {0};\n  return result;\n}\n\n\n//- dw expr val stack\n\ninternal DW_ExprStack\ndw_expr__stack_make(Arena *arena)\n{\n  DW_ExprStack result = {0};\n  return result;\n}\n\ninternal void\ndw_expr__stack_push(Arena *arena, DW_ExprStack *stack, U64 x)\n{\n  DW_ExprStackNode *node = stack->free_nodes;\n  if (node == 0) {\n    SLLStackPop(stack->free_nodes);\n  } else {\n    node = push_array(arena, DW_ExprStackNode, 1);\n  }\n  SLLStackPush(stack->stack, node);\n  node->val = x;\n  stack->count += 1;\n}\n\ninternal U64\ndw_expr__stack_pop(DW_ExprStack *stack)\n{\n  U64               result = 0;\n  DW_ExprStackNode *node   = stack->stack;\n  if (node != 0) {\n    SLLStackPop(stack->stack);\n    stack->count -= 1;\n    result = node->val;\n  }\n  return result;\n}\n\ninternal U64\ndw_expr__stack_pick(DW_ExprStack *stack, U64 idx)\n{\n  U64 result = 0;\n  if (idx < stack->count) {\n    U64               counter = idx;\n    DW_ExprStackNode *node    = stack->stack;\n    for (;node != 0 && counter > 0; node = node->next, counter -= 1);\n    if (counter == 0 && node != 0) {\n      result = node->val;\n    }\n  }\n  return result;\n}\n\ninternal B32\ndw_expr__stack_is_empty(DW_ExprStack *stack)\n{\n  B32 result = (stack->count == 0);\n  return result;\n}\n\n//- dw expr call stack\n\ninternal DW_ExprCall*\ndw_expr__call_top(DW_ExprCallStack *stack)\n{\n  DW_ExprCall *call = stack->stack;\n  return call;\n}\n\ninternal void\ndw_expr__call_push(Arena *arena, DW_ExprCallStack *stack, void *ptr, U64 size)\n{\n  DW_ExprCall *call = 0;\n  if (call != 0) {\n    SLLStackPop(stack->free_calls);\n  } else {\n    call = push_array(arena, DW_ExprCall, 1);\n  }\n  MemoryZeroStruct(call);\n  SLLStackPush(stack->stack, call);\n  stack->depth += 1;\n}\n\ninternal void\ndw_expr__call_pop(DW_ExprCallStack *stack)\n{\n  DW_ExprCall *top = stack->stack;\n  if (top != 0)\n  {\n    SLLStackPop(stack->stack);\n    SLLStackPush(stack->free_calls, top);\n  }\n}\n\n//- analysis tasks\n\ninternal DW_ExprAnalysisTask*\ndw_expr__analysis_task_from_p(DW_ExprAnalysisTask *first, U64 p)\n{\n  DW_ExprAnalysisTask *result = 0;\n  for (DW_ExprAnalysisTask *task = first; task != 0; task = task->next) {\n    if (task->p == p) {\n      result = task;\n      break;\n    }\n  }\n  return result;\n}\n\n"
  },
  {
    "path": "src/dwarf/dwarf_expr.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_EXPR_H\n#define DWARF_EXPR_H\n\n////////////////////////////////\n//~ Dwarf Register Layout\n\ntypedef struct DW_RegsX64\n{\n  union {\n    struct {\n      U64 rax;\n      U64 rdx;\n      U64 rcx;\n      U64 rbx;\n      U64 rsi;\n      U64 rdi;\n      U64 rbp;\n      U64 rsp;\n      U64 r8;\n      U64 r9;\n      U64 r10;\n      U64 r11;\n      U64 r12;\n      U64 r13;\n      U64 r14;\n      U64 r15;\n      U64 rip;\n    };\n    U64 r[17];\n  };\n} DW_RegsX64;\n\n////////////////////////////////\n//~ Dwarf Expression Eval Types\n\n#define DW_READ_MEMORY_SIG(name) U64 name(U64 addr, U64 size, void *out, void *ud)\ntypedef DW_READ_MEMORY_SIG(DW_ReadMemorySig);\n\n//- machine configuration types\ntypedef String8 DW_ExprResolveCallFunc(void *call_user_ptr, U64 p);\n\ntypedef struct DW_ExprMachineCallConfig\n{\n  void                   *user_ptr;\n  DW_ExprResolveCallFunc *func;\n} DW_ExprMachineCallConfig;\n\ntypedef struct DW_ExprMachineConfig\n{\n  U64                       max_step_count; // (read only in the eval functions)\n  DW_ReadMemorySig         *read_memory;\n  void                     *read_memory_ud;\n  DW_RegsX64               *regs;\n  U64                      *text_section_base;\n  U64                      *frame_base;\n  U64                      *object_address;\n  U64                      *tls_address;\n  U64                      *cfa;\n  DW_ExprMachineCallConfig  call;\n} DW_ExprMachineConfig;\n\n\n//- detail analysis types\ntypedef U32 DW_ExprFlags;\nenum\n{\n  DW_ExprFlag_UsesTextBase       = (1 << 0),\n  DW_ExprFlag_UsesMemory         = (1 << 1),\n  DW_ExprFlag_UsesRegisters      = (1 << 2),\n  DW_ExprFlag_UsesFrameBase      = (1 << 3),\n  DW_ExprFlag_UsesObjectAddress  = (1 << 4),\n  DW_ExprFlag_UsesTLSAddress     = (1 << 5),\n  DW_ExprFlag_UsesCFA            = (1 << 6),\n  DW_ExprFlag_UsesCallResolution = (1 << 7),\n  DW_ExprFlag_UsesComposite      = (1 << 8),\n  \n  DW_ExprFlag_NotSupported  = (1 << 16),\n  DW_ExprFlag_BadData       = (1 << 17),\n  DW_ExprFlag_NonLinearFlow = (1 << 18)\n};\n\ntypedef struct DW_ExprAnalysis\n{\n  DW_ExprFlags flags;\n} DW_ExprAnalysis;\n\ntypedef struct DW_ExprAnalysisTask\n{\n  struct DW_ExprAnalysisTask *next;\n  U64                         p;\n  String8                     data;\n} DW_ExprAnalysisTask;\n\n\n//- location types\ntypedef enum DW_SimpleLocKind\n{\n  DW_SimpleLocKind_Address,\n  DW_SimpleLocKind_Register,\n  DW_SimpleLocKind_Value,\n  DW_SimpleLocKind_ValueLong,\n  DW_SimpleLocKind_Empty,\n  DW_SimpleLocKind_Fail,\n} DW_SimpleLocKind;\n\ntypedef enum DW_LocFailKind\n{\n  // Interpreting Fail Kinds\n  //\n  // BadData:        the evaluator detected that the dwarf expression operation is incorrectly formed\n  // NotSupported:   the evaluator does not support a dwarf feature that was found in the dwarf expression\n  // TimeOut:        the evaluator hit the maximum step count\n  // TooComplicated: used by analyzer when it the expression uses features outside of the analyzer's scope\n  // Missing*:       the dwarf machine config was missing necessary information to finish the evaluation\n  \n  DW_LocFailKind_BadData,\n  DW_LocFailKind_NotSupported,\n  DW_LocFailKind_TimeOut,\n  DW_LocFailKind_TooComplicated,\n  DW_LocFailKind_MissingTextBase,\n  DW_LocFailKind_MissingMemory,\n  DW_LocFailKind_MissingRegisters,\n  DW_LocFailKind_MissingFrameBase,\n  DW_LocFailKind_MissingObjectAddress,\n  DW_LocFailKind_MissingTLSAddress,\n  DW_LocFailKind_MissingCFA,\n  DW_LocFailKind_MissingCallResolution,\n  DW_LocFailKind_MissingArenaForComposite,\n} DW_LocFailKind;\n\ntypedef struct DW_SimpleLoc\n{\n  DW_SimpleLocKind kind;\n  union {\n    U64     addr;\n    U64     reg_idx;\n    U64     val;\n    String8 val_long;\n    struct {\n      DW_LocFailKind fail_kind;\n      U64 fail_data;\n    };\n  };\n} DW_SimpleLoc;\n\ntypedef struct DW_Piece\n{\n  // Hint for Interpreting Pieces\n  //\n  // src = decode(loc, is_bit_loc, bit_size);\n  //  dst |= (src >> bit_off) << bit_cursor;\n  // bit_cursor += bit_size;\n  \n  struct DW_Piece *next;\n  DW_SimpleLoc     loc;\n  U64              bit_size;\n  U64              bit_off;\n  B32              is_bit_loc;\n} DW_Piece;\n\ntypedef struct DW_Location\n{\n  // Interpreting a Dwarf Location\n  //\n  // CASE (any number of pieces, fail in the non-piece):\n  //   this is how errors are reported, error information is in the non-piece\n  //   the 'fail' location kind should never show up in a piece\n  //   if there are any pieces they can be treated as correct information that\n  //   was successfully decoded before the error was encountered\n  //\n  // CASE (no pieces, empty non-piece):\n  //   the data is completely optimized out and unrecoverable\n  //\n  // CASE (no pieces, non-empty non-piece):\n  //   the size of the data is not known by the location, but something in the\n  //   surrounding context of the location (eg type info) should know the size\n  //\n  // CASE (one-or-more pieces, empty non-piece):\n  //   the data is described by the pieces\n  //\n  // CASE (one-or-more pieces, non-empty non-fail non-piece):\n  //   this is supposed to be impossible; the non-piece either carries an error\n  //   or *all* of the location information about the data, there should never\n  //   be a mix of piece-based location and non-piece-based location data.\n  \n  DW_Piece *first_piece;\n  DW_Piece *last_piece;\n  U64       count;\n  \n  DW_SimpleLoc non_piece_loc;\n} DW_Location;\n\n\n//- full evaluator state types\ntypedef struct DW_ExprStackNode\n{\n  struct DW_ExprStackNode *next;\n  U64                      val;\n} DW_ExprStackNode;\n\ntypedef struct DW_ExprStack\n{\n  DW_ExprStackNode *stack;\n  DW_ExprStackNode *free_nodes;\n  U64               count;\n} DW_ExprStack;\n\ntypedef struct DW_ExprCall\n{\n  struct DW_ExprCall *next;\n  void               *ptr;\n  U64                 size;\n  U64                 cursor;\n} DW_ExprCall;\n\ntypedef struct DW_ExprCallStack\n{\n  DW_ExprCall *stack;\n  DW_ExprCall *free_calls;\n  U64          depth;\n} DW_ExprCallStack;\n\n////////////////////////////////\n//~ Dwarf Expression Analysis & Eval Functions\n\n//- analyzers\n\n// This analyzer provides the most simplified dwarf expression\n// decoding. If the expression consists of a single op that can be interpreted\n// as a valid dwarf expression, then it represents that expression as a simple\n// location.\n//\n// If there is a single 'piece' op that is represeted here as an empty simple\n// location, losing whatever additional size information from the piece.\n//\n// If there is an op that requires the machine configuration data the analyzer\n// fails with \"too complicated\" - unless the required configuration data is the\n// text section base which this analyzer treats as a non-optional parameter and\n// always decodes successfully.\n//\n// If the expression contains more than one op than the analyzer fails with\n// \"too complicated\".\n\ninternal DW_SimpleLoc dw_expr__analyze_fast(void *base, Rng1U64 range, U64 text_section_base);\n\n// This analyzer does a one-pass scan through the expression to\n// help a caller determine what to expect before doing a full evaluation which\n// has to maintain value stacks, perform more checks, and execute any loops\n// that may appear in the expression, etc.\n//\n// For each piece of data that can be equipped to a machine config there is a\n// 'Uses' flag in the analysis. A user can use these flags to determine what to\n// prepare and equip before a full eval. This can be a lot more efficient than\n// always preparing everything, or iteratively equipping and retrying after\n// each failure.\n//\n// The analysis can also catch some cases of bad data and unsupported features.\n// These flags are useful for short circuit style optimizations, but they are\n// not definitive, some bad data can only be caught by the full evaluator.\n// Sometimes the full evaluator might miss bad data that this analyzer will see\n// if control flow in the evaluator completely skips the bad data. A forgiving\n// interpretation of dwarf expression data would only rely on the results of\n// the full evaluator. A more strict interpretation would consider it an error\n// if either this analyzer or the evaluator finds bad data.\n//\n// The analyzer also determines if there is any possibility for non-linear\n// flow. Jumps, branches, and call ops all create non-linear flow. An\n// expression that doesn't have non-linear flow is trivially gauranteed to\n// terminate and therefore a good candidate for conversion to a human readable\n// expression.\n//\n// The call config is optional (may be null). If is provided the analysis\n// includes features seen in all of the expressions that might be reached by\n// call ops from the initial expression.\n\ninternal DW_ExprAnalysis dw_expr__analyze_details(void *base, Rng1U64 range, DW_ExprMachineCallConfig *call_config);\n\n//- full eval\ninternal DW_Location dw_expr__eval(Arena *arena_optional, void *base, Rng1U64 range, DW_ExprMachineConfig *config);\n\n//- dw expr val stack\ninternal DW_ExprStack dw_expr__stack_make(Arena *arena);\ninternal void         dw_expr__stack_push(Arena *arena, DW_ExprStack *stack, U64 x);\ninternal U64          dw_expr__stack_pop(DW_ExprStack *stack);\ninternal U64          dw_expr__stack_pick(DW_ExprStack *stack, U64 idx);\ninternal B32          dw_expr__stack_is_empty(DW_ExprStack *stack);\n\n//- dw expr call stack\ninternal DW_ExprCall* dw_expr__call_top(DW_ExprCallStack *stack);\ninternal void         dw_expr__call_push(Arena *arena, DW_ExprCallStack *stack, void *ptr, U64 size);\ninternal void         dw_expr__call_pop(DW_ExprCallStack *stack);\n\n\n//- analysis tasks\ninternal DW_ExprAnalysisTask* dw_expr__analysis_task_from_p(DW_ExprAnalysisTask *first, U64 p);\n\n#endif //DWARF_EXPR_H\n\n"
  },
  {
    "path": "src/dwarf/dwarf_help.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal DW_CallFrameInfo\ndw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  // count CIE and FDE entries\n  U64 cie_count = 0, fde_count = 0;\n  for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) {\n    DW_DescriptorEntry desc = {0};\n    desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc);\n    if (desc_size == 0) { break; }\n    if (desc.type == DW_DescriptorEntryType_CIE) {\n      cie_count += 1;\n    } else if (desc.type == DW_DescriptorEntryType_FDE) {\n      fde_count += 1;\n    }\n  }\n\n  // parse CIEs and build (offset -> CIE) hash table\n  HashTable *cie_ht = hash_table_init(scratch.arena, (U64)(cie_count * 1.3));\n  DW_CIE *cie = push_array(arena, DW_CIE, cie_count);\n  U64 parse_cie_count = 0;\n  for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) {\n    DW_DescriptorEntry desc = {0};\n    desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc);\n    if (desc_size == 0) { break; }\n    if (desc.type == DW_DescriptorEntryType_CIE) {\n      if (dw_parse_cie(str8_skip(debug_frame, cursor), desc.format, arch, &cie[parse_cie_count])) {\n        hash_table_push_u64_raw(scratch.arena, cie_ht, cursor, &cie[parse_cie_count]);\n        parse_cie_count += 1;\n      }\n    }\n  }\n\n  // parse FDEs\n  DW_FDE *fde = push_array(arena, DW_FDE, fde_count);\n  U64 parse_fde_count = 0;\n  for (U64 cursor = 0, desc_size; cursor < debug_frame.size; cursor += desc_size) {\n    DW_DescriptorEntry desc = {0};\n    desc_size = dw_parse_descriptor_entry_header(debug_frame, cursor, &desc);\n    if (desc_size == 0) { break; }\n    if (desc.type == DW_DescriptorEntryType_FDE) {\n      DW_CIE *cie = hash_table_search_u64_raw(cie_ht, desc.cie_pointer);\n      if (dw_parse_fde(str8_skip(debug_frame, cursor), desc.format, cie, &fde[parse_fde_count])) {\n        fde[parse_fde_count].pc_range.min += rebase;\n        fde[parse_fde_count].pc_range.max += rebase;\n        parse_fde_count += 1;\n      }\n    }\n  }\n\n  // fill out result\n  DW_CallFrameInfo cfi = {0};\n  cfi.cie_count = parse_cie_count;\n  cfi.fde_count = parse_fde_count;\n  cfi.cie       = cie;\n  cfi.fde       = fde;\n\n  scratch_end(scratch);\n  return cfi;\n}\n\n\n"
  },
  {
    "path": "src/dwarf/dwarf_help.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_HELP_H\n#define DWARF_HELP_H\n\ntypedef struct DW_CallFrameInfo\n{\n  U64 cie_count;\n  U64 fde_count;\n  DW_CIE *cie;\n  DW_FDE *fde;\n} DW_CallFrameInfo;\n\ninternal DW_CallFrameInfo dw_call_frame_info_from_data(Arena *arena, Arch arch, U64 rebase, String8 debug_frame);\n\n#endif // DWARF_HELP_H\n\n"
  },
  {
    "path": "src/dwarf/dwarf_inc.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#include \"dwarf/dwarf.c\"\n#include \"dwarf/dwarf_expr.c\"\n#include \"dwarf/dwarf_parse.c\"\n#include \"dwarf/dwarf_coff.c\"\n#include \"dwarf/dwarf_elf.c\"\n#include \"dwarf/dwarf_unwind.c\"\n#include \"dwarf/dwarf_dump.c\"\n#include \"dwarf/dwarf_help.c\"\n#include \"dwarf/eh_frame.c\"\n#include \"dwarf/eh_dump.c\"\n"
  },
  {
    "path": "src/dwarf/dwarf_inc.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_INC_H\n#define DWARF_INC_H\n\n#include \"dwarf/dwarf.h\"\n#include \"dwarf/dwarf_expr.h\"\n#include \"dwarf/dwarf_parse.h\"\n#include \"dwarf/dwarf_coff.h\"\n#include \"dwarf/dwarf_elf.h\"\n#include \"dwarf/dwarf_unwind.h\"\n#include \"dwarf/dwarf_dump.h\"\n#include \"dwarf/dwarf_help.h\"\n#include \"dwarf/eh_frame.h\"\n#include \"dwarf/eh_dump.h\"\n\n#endif // DWARF_INC_H\n"
  },
  {
    "path": "src/dwarf/dwarf_notes.txt",
    "content": "--- DWARF NOTES ---------------------------------------------------------------\n\nDWARF V4 Spec: http://www.dwarfstd.org/doc/DWARF4.pdf\nDWARF V5 Spec: http://www.dwarfstd.org/doc/DWARF5.pdf\n\n-------------------------------------------------------------------------------\n\n$ (2021/04/30) On .debug_pubtypes, .debug_pubnames, and .debug_names:\n\n.debug_pubtypes and .debug_pubnames are tables that map from a string (the name\nof a type or function respectively) to an offset into .debug_info, which is the\noffset of the Debug Information Entry (DIE, in DWARF terminology) of the info\nassociated with the string. THESE TWO SECTIONS ARE OPTIONAL. They don't show up\nin every DWARF-holding file, and so they cannot be relied upon as acceleration\nstructures. But we're going to support parsing them, to make things a bit nicer\nin cases where they are present. DWARF doesn't have much in the way of acceler-\nation structures built in, so our rationale is that we should take anything we\ncan get to make the format a bit more in some subset of the possible cases.\n\n.debug_names is a DWARF V5 section that is intended to replace .debug_pubtypes\nand .debug_pubnames. However, even in cases when DWARF V5 is produced at the\ntime of writing this, we have not found .debug_names sections being produced.\nWe did not exhaustively test all compilers and configurations, but it seems\nthat it is not well-supported at all by major compilers, and there's a very low\nprobability that a user will have that section, so our current thinking is\nthat there's no point in supporting it right now.\n\n-------------------------------------------------------------------------------\n\n$ (2021/04/30) On producing DWARF V5 with Clang:\n\nhttps://lists.llvm.org/pipermail/llvm-dev/2018-August/125068.html\n\nBy default it looks like (at the time of writing this) that Clang, by default,\nwill produce DWARF V4. To produce DWARF V5, however, you can use the -gdwarf-5\noption. Even when that option is used, it seems that some features of V5 are\nnot used (for example, .debug_names).\n\nThe above link also says that this will produce .debug_names, but it doesn't as\nof Clang 10.\n\n-------------------------------------------------------------------------------\n"
  },
  {
    "path": "src/dwarf/dwarf_parse.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64\nstr8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out)\n{\n  U64 bytes_read = 0;\n  if(str8_deserial_read(string, off, size_out, sizeof(U32), sizeof(U32)))\n  {\n    if(*size_out == max_U32)\n    {\n      if(str8_deserial_read_struct(string, off+sizeof(U32), size_out))\n      {\n        bytes_read = sizeof(U32) + sizeof(U64);\n      }\n    }\n    else\n    {\n      *size_out &= (U64)max_U32;\n      bytes_read = sizeof(U32);\n    }\n  }\n  return bytes_read;\n}\n\ninternal U64\nstr8_deserial_read_dwarf_uint(String8 string, U64 off, DW_Format format, U64 *uint_out)\n{\n  U64 bytes_read = 0;\n  switch(format)\n  {\n    case DW_Format_Null: break;\n    case DW_Format_32Bit:\n    {\n      *uint_out &= (U64)max_U32;\n      bytes_read = str8_deserial_read(string, off, uint_out, sizeof(U32), sizeof(U32));\n    }break;\n    case DW_Format_64Bit:\n    {\n      bytes_read = str8_deserial_read_struct(string, off, uint_out);\n    }break;\n  }\n  return bytes_read;\n}\n\ninternal U64\nstr8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out)\n{\n  U64 value  = 0;\n  U64 shift  = 0;\n  U64 cursor = off;\n  for(;;)\n  {\n    U8 byte = 0;\n    U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);\n    if(bytes_read != sizeof(byte))\n    {\n      break;\n    }\n    U8 val = byte & 0x7fu;\n    value |= ((U64)val) << shift;\n    cursor += bytes_read;\n    shift += 7u;\n    if((byte & 0x80u) == 0)\n    {\n      break;\n    }\n  }\n  if(value_out != 0)\n  {\n    *value_out = value;\n  }\n  U64 bytes_read = cursor - off;\n  return bytes_read;\n}\n\ninternal U64\nstr8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out)\n{\n  U64 value  = 0;\n  U64 shift  = 0;\n  U64 cursor = off;\n  for(;;)\n  {\n    U8 byte = 0;\n    U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);\n    if(bytes_read != sizeof(byte))\n    {\n      break;\n    }\n    U8 val = byte & 0x7fu;\n    value |= ((U64)val) << shift;\n    cursor += bytes_read;\n    shift += 7u;\n    if((byte & 0x80u) == 0)\n    {\n      if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0)\n      {\n        value |= -(S64)(1ull << shift);\n      }\n      break;\n    }\n  }\n  if(value_out != 0)\n  {\n    *value_out = value;\n  }\n  U64 bytes_read = cursor - off;\n  return bytes_read;\n}\n\ninternal U64\nstr8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out)\n{\n  Temp temp = temp_begin(arena);\n  \n  U64 *arr = push_array(arena, U64, count);\n  U64 i, cursor;\n  for (i = 0, cursor = off; i < count; ++i) {\n    U64 read_size = str8_deserial_read_uleb128(string, cursor, &arr[i]);\n    if (read_size == 0) {\n      break;\n    }\n    cursor += read_size;\n  }\n  \n  U64 bytes_read = 0;\n  if (i == count) {\n    *arr_out = arr;\n    bytes_read = cursor - off;\n  } else {\n    temp_end(temp);\n    *arr_out = 0;\n  }\n  \n  return bytes_read;\n}\n\ninternal U64\nstr8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out)\n{\n  Temp temp = temp_begin(arena);\n  \n  S64 *arr = push_array(arena, S64, count);\n  U64 i, cursor;\n  for (i = 0, cursor = off; i < count; ++i) {\n    U64 read_size = str8_deserial_read_sleb128(string, cursor, &arr[i]);\n    if (read_size == 0) {\n      break;\n    }\n    cursor += read_size;\n  }\n  \n  U64 bytes_read = 0;\n  if (i == count) {\n    *arr_out = arr;\n    bytes_read = cursor - off;\n  } else {\n    temp_end(temp);\n    *arr_out = 0;\n  }\n  \n  return bytes_read;\n}\n\ninternal DW_SectionKind\ndw_section_kind_from_string(String8 string)\n{\n  DW_SectionKind s = DW_Section_Null;\n#define X(_K,_L,_M,_W)                                        \\\nif (str8_match_lit(_L, string, 0)) { s = DW_Section_##_K; } \\\nif (str8_match_lit(_M, string, 0)) { s = DW_Section_##_K; }\n  DW_SectionKind_XList(X)\n#undef X\n  return s;\n}\n\ninternal DW_SectionKind\ndw_section_dwo_kind_from_string(String8 string)\n{\n  DW_SectionKind s = DW_Section_Null;\n#define X(_K,_L,_M,_W)                                        \\\nif (str8_match_lit(_W, string, 0)) { s = DW_Section_##_K; }\n  DW_SectionKind_XList(X)\n#undef X\n  return s;\n}\n\ninternal Rng1U64List\ndw_unit_ranges_from_data(Arena *arena, String8 data)\n{\n  Rng1U64List result = {0};\n  for(U64 cursor = 0; cursor < data.size;)\n  {\n    // rjf: read CU size; bad read -> terminate\n    U64 cu_size = 0;\n    U64 cu_size_size = str8_deserial_read_dwarf_packed_size(data, cursor, &cu_size);\n    if(cu_size_size == 0)\n    {\n      break;\n    }\n    \n    // rjf: push\n    if(cu_size > 0)\n    {\n      rng1u64_list_push(arena, &result, rng_1u64(cursor, cursor+cu_size+cu_size_size));\n    }\n    \n    // rjf: advance\n    cursor += cu_size_size;\n    cursor += cu_size;\n  }\n  return result;\n}\n\ninternal U64\ndw_read_list_unit_header_addr(String8 unit_data, DW_ListUnit *lu_out)\n{\n  U64 header_size = 0;\n  \n  U64 unit_length      = 0;\n  U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length);\n  \n  if (unit_length_size) {\n    DW_Version version      = DW_Version_Null;\n    U64        version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version);\n    \n    if (version_size) {\n      if (version >= DW_Version_5) {\n        U8  address_size      = 0;\n        U64 address_size_size = str8_deserial_read_struct(unit_data,\n                                                          unit_length_size + version_size,\n                                                          &address_size);\n        \n        if (address_size_size && address_size) {\n          U8  segment_selector_size      = 0;\n          U64 segment_selector_size_size = str8_deserial_read_struct(unit_data,\n                                                                     unit_length_size + version_size + address_size_size,\n                                                                     &segment_selector_size);\n          if (segment_selector_size_size) {\n            header_size = unit_length_size + version_size + address_size_size + segment_selector_size_size;\n            \n            lu_out->version               = version;\n            lu_out->segment_selector_size = segment_selector_size;\n            lu_out->address_size          = address_size;\n            lu_out->entry_size            = segment_selector_size + address_size;\n            lu_out->entries               = str8_skip(unit_data, header_size);\n          }\n        }\n      }\n    }\n  }\n  \n  return header_size;\n}\n\ninternal U64\ndw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out)\n{\n  U64 header_size = 0;\n  \n  U64 unit_length      = 0;\n  U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length);\n  \n  if (unit_length_size) {\n    DW_Version version      = DW_Version_Null;\n    U64        version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version);\n    \n    if (version >= DW_Version_5) {\n      U16 padding = 0;\n      U64 padding_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size, &padding);\n      \n      if (padding_size && padding == 0) {\n        header_size = unit_length_size + version_size + padding_size;\n        \n        lu_out->version               = version;\n        lu_out->address_size          = 0;\n        lu_out->segment_selector_size = 0;\n        lu_out->entry_size            = dw_size_from_format(DW_FormatFromSize(unit_length));\n        lu_out->entries               = str8_skip(unit_data, header_size);\n      }\n    }\n  }\n  \n  return header_size;\n}\n\ninternal U64\ndw_read_list_unit_header_list(String8 unit_data, DW_ListUnit *lu_out)\n{\n  U64 header_size = 0;\n  \n  U64 unit_length      = 0;\n  U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, 0, &unit_length);\n  \n  if (unit_length_size) {\n    DW_Version version      = DW_Version_Null;\n    U64        version_size = str8_deserial_read_struct(unit_data, unit_length_size, &version);\n    \n    if (version >= DW_Version_5) {\n      U8  address_size      = 0;\n      U64 address_size_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size, &address_size);\n      \n      if (address_size_size && address_size > 0) {\n        U8  segment_selector_size      = 0;\n        U64 segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size + address_size_size, &segment_selector_size);\n        \n        if (segment_selector_size_size) {\n          U32 offset_entry_count = 0;\n          U64 offset_entry_count_size = str8_deserial_read_struct(unit_data, unit_length_size + version_size + address_size_size + segment_selector_size, &offset_entry_count);\n          \n          if (offset_entry_count_size) {\n            header_size = unit_length_size + version_size + address_size_size + segment_selector_size_size + offset_entry_count_size;\n            \n            lu_out->version               = version;\n            lu_out->address_size          = address_size;\n            lu_out->segment_selector_size = segment_selector_size;\n            lu_out->entry_size            = dw_size_from_format(DW_FormatFromSize(unit_length));\n            lu_out->entries               = str8_skip(unit_data, header_size);\n          }\n        }\n      }\n    }\n  }\n  \n  return header_size;\n}\n\ninternal DW_ListUnitInput\ndw_list_unit_input_from_input(Arena *arena, DW_Input *input)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  DW_ListUnitInput result = {0};\n  \n  DW_Section debug_addr = input->sec[DW_Section_Addr];\n  {\n    String8     data        = debug_addr.data;\n    Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data);\n    \n    result.addr_ranges = rng1u64_array_from_list(arena, &unit_ranges);\n    result.addr_count  = unit_ranges.count;\n    result.addrs       = push_array(arena, DW_ListUnit, unit_ranges.count);\n    \n    for (U64 unit_idx = 0; unit_idx < result.addr_ranges.count; ++unit_idx) {\n      String8 unit_data = str8_substr(debug_addr.data, result.addr_ranges.v[unit_idx]);\n      dw_read_list_unit_header_addr(unit_data, &result.addrs[unit_idx]);\n    }\n  }\n  \n  DW_Section debug_str_offsets = input->sec[DW_Section_StrOffsets];\n  {\n    String8     data        = debug_str_offsets.data;\n    Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data);\n    \n    result.str_offset_ranges = rng1u64_array_from_list(arena, &unit_ranges);\n    result.str_offset_count  = unit_ranges.count;\n    result.str_offsets       = push_array(arena, DW_ListUnit, unit_ranges.count);\n    \n    for (U64 unit_idx = 0; unit_idx < result.str_offset_ranges.count; ++unit_idx) {\n      String8 unit_data = str8_substr(data, result.str_offset_ranges.v[unit_idx]);\n      dw_read_list_unit_header_str_offsets(unit_data, &result.str_offsets[unit_idx]);\n    }\n  }\n  \n  DW_Section debug_rnglists = input->sec[DW_Section_RngLists];\n  {\n    String8     data        = debug_rnglists.data;\n    Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data);\n    \n    result.rnglist_ranges = rng1u64_array_from_list(arena, &unit_ranges);\n    result.rnglist_count  = unit_ranges.count;\n    result.rnglists       = push_array(arena, DW_ListUnit, unit_ranges.count);\n    \n    for (U64 unit_idx = 0; unit_idx < result.rnglist_ranges.count; ++unit_idx) {\n      String8 unit_data = str8_substr(data, result.rnglist_ranges.v[unit_idx]);\n      dw_read_list_unit_header_list(unit_data, &result.rnglists[unit_idx]);\n    }\n  }\n  \n  DW_Section debug_loclists = input->sec[DW_Section_LocLists];\n  {\n    String8     data        = debug_loclists.data;\n    Rng1U64List unit_ranges = dw_unit_ranges_from_data(scratch.arena, data);\n    \n    result.loclist_ranges = rng1u64_array_from_list(arena, &unit_ranges);\n    result.loclist_count  = unit_ranges.count;\n    result.loclists       = push_array(arena, DW_ListUnit, unit_ranges.count);\n    \n    for (U64 unit_idx = 0; unit_idx < result.loclist_ranges.count; ++unit_idx) {\n      String8 unit_data = str8_substr(data, result.loclist_ranges.v[unit_idx]);\n      dw_read_list_unit_header_list(unit_data, &result.loclists[unit_idx]);\n    }\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal U64\ndw_offset_from_list_unit(DW_ListUnit *lu, U64 index)\n{\n  U64 offset;\n  U64 entry_off = index * lu->entry_size; \n  if (entry_off + lu->entry_size <= lu->entries.size) {\n    offset = 0;\n    MemoryCopy(&offset, lu->entries.str + entry_off, lu->entry_size);\n  } else {\n    offset = max_U64;\n  }\n  return offset;\n}\n\ninternal U64\ndw_addr_from_list_unit(DW_ListUnit *lu, U64 index)\n{\n  U64 seg  = 0;\n  U64 addr = max_U64;\n  U64 entry_count = lu->entries.size / lu->entry_size;\n  if (index < entry_count) {\n    U64 seg_off  = lu->entry_size * index;\n    U64 addr_off = seg_off + lu->segment_selector_size;\n    MemoryCopy(&seg,  lu->entries.str + seg_off, lu->segment_selector_size);\n    MemoryCopy(&addr, lu->entries.str + addr_off, lu->address_size);\n    // TODO: segment-based addressing\n    AssertAlways(seg == 0);\n  } else {\n    Assert(!\"out of bounds index\");\n  }\n  return addr;\n}\n\ninternal U64\ndw_read_abbrev_tag(String8 data, U64 offset, DW_Abbrev *out_abbrev)\n{\n  U64 total_bytes_read = 0;\n  \n  //- rjf: parse ID\n  U64 id_off       = offset;\n  U64 sub_kind_off = id_off;\n  U64 id           = 0;\n  {\n    U64 bytes_read = str8_deserial_read_uleb128(data, id_off, &id);\n    sub_kind_off += bytes_read;\n    total_bytes_read += bytes_read;\n  }\n  \n  //- rjf: parse sub-kind\n  U64 sub_kind = 0;\n  U64 next_off = sub_kind_off;\n  if(id != 0)\n  {\n    U64 bytes_read = str8_deserial_read_uleb128(data, sub_kind_off, &sub_kind);\n    next_off         += bytes_read;\n    total_bytes_read += bytes_read;\n  }\n  \n  //- rjf: parse whether this tag has children\n  U8 has_children = 0;\n  if(id != 0)\n  {\n    total_bytes_read += str8_deserial_read_struct(data, next_off, &has_children);\n  }\n  \n  //- rjf: fill abbrev\n  if(out_abbrev != 0)\n  {\n    DW_Abbrev abbrev = {0};\n    abbrev.kind      = DW_Abbrev_Tag;\n    abbrev.sub_kind  = sub_kind;\n    abbrev.id        = id;\n    if(has_children)\n    {\n      abbrev.flags |= DW_AbbrevFlag_HasChildren;\n    }\n    *out_abbrev = abbrev;\n  }\n  \n  return total_bytes_read;\n}\n\ninternal U64\ndw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev)\n{\n  U64 total_bytes_read = 0;\n  \n  //- rjf: parse ID\n  U64 id_off       = offset;\n  U64 sub_kind_off = id_off;\n  U64 id           = 0;\n  {\n    U64 bytes_read = str8_deserial_read_uleb128(data, id_off, &id);\n    sub_kind_off     += bytes_read;\n    total_bytes_read += bytes_read;\n  }\n  \n  //- rjf: parse sub-kind (form-kind)\n  U64 sub_kind = 0;\n  U64 next_off = sub_kind_off;\n  {\n    U64 bytes_read = str8_deserial_read_uleb128(data, sub_kind_off, &sub_kind);\n    next_off         += bytes_read;\n    total_bytes_read += bytes_read;\n  }\n  \n  //- rjf: parse implicit const\n  U64 implicit_const = 0;\n  if(sub_kind == DW_Form_ImplicitConst)\n  {\n    U64 bytes_read = str8_deserial_read_uleb128(data, next_off, &implicit_const);\n    total_bytes_read += bytes_read;\n  }\n  \n  //- rjf: fill abbrev\n  if(out_abbrev != 0)\n  {\n    DW_Abbrev abbrev    = {0};\n    abbrev.kind         = DW_Abbrev_Attrib;\n    abbrev.sub_kind     = sub_kind;\n    abbrev.id           = id;\n    if(sub_kind == DW_Form_ImplicitConst)\n    {\n      abbrev.flags       |= DW_AbbrevFlag_HasImplicitConst;\n      abbrev.const_value  = implicit_const;\n    }\n    *out_abbrev = abbrev;\n  }\n  \n  return total_bytes_read;\n}\n\ninternal DW_AbbrevTable\ndw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 abbrev_offset)\n{\n  //- rjf: count the tags we have\n  U64 tag_count = 0;\n  for(U64 abbrev_read_off = abbrev_offset;;)\n  {\n    DW_Abbrev tag;\n    {\n      U64 bytes_read = dw_read_abbrev_tag(abbrev_data, abbrev_read_off, &tag);\n      abbrev_read_off += bytes_read;\n      if(bytes_read == 0 || tag.id == 0)\n      {\n        break;\n      }\n    }\n    for(;;)\n    {\n      DW_Abbrev attrib     = {0};\n      U64       bytes_read = dw_read_abbrev_attrib(abbrev_data, abbrev_read_off, &attrib);\n      abbrev_read_off += bytes_read;\n      if(bytes_read == 0 || attrib.id == 0)\n      {\n        break;\n      }\n    }\n    tag_count += 1;\n  }\n  \n  //- rjf: build table\n  DW_AbbrevTable table = {0};\n  table.count          = tag_count;\n  table.entries        = push_array(arena, DW_AbbrevTableEntry, table.count);\n  MemorySet(table.entries, 0, sizeof(DW_AbbrevTableEntry)*table.count);\n  \n  U64 tag_idx = 0;\n  for(U64 abbrev_read_off = abbrev_offset;;)\n  {\n    U64 tag_abbrev_off = abbrev_read_off;\n    \n    DW_Abbrev tag;\n    {\n      U64 bytes_read = dw_read_abbrev_tag(abbrev_data, abbrev_read_off, &tag);\n      abbrev_read_off += bytes_read;\n      if(bytes_read == 0 || tag.id == 0)\n      {\n        break;\n      }\n    }\n    \n    // rjf: insert this tag into the table\n    {\n      table.entries[tag_idx].id  = tag.id;\n      table.entries[tag_idx].off = tag_abbrev_off;\n      tag_idx += 1;\n    }\n    \n    for(;;)\n    {\n      DW_Abbrev attrib = {0};\n      U64 bytes_read = dw_read_abbrev_attrib(abbrev_data, abbrev_read_off, &attrib);\n      abbrev_read_off += bytes_read;\n      if(bytes_read == 0 || attrib.id == 0)\n      {\n        break;\n      }\n    }\n    tag_count += 1;\n  }\n  \n  return table;\n}\n\ninternal U64\ndw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id)\n{\n  U64 abbrev_offset = max_U64;\n  if (table.count > 0) {\n    for (S64 l = 0, r = (S64)table.count - 1; l <= r; ) {\n      S64 m = l + (r - l) / 2;\n      if (abbrev_id > table.entries[m].id) {\n        l = m + 1;\n      } else if (abbrev_id < table.entries[m].id) {\n        r = m - 1;\n      } else {\n        abbrev_offset = table.entries[m].off;\n        break;\n      }\n    }\n  }\n  return abbrev_offset;\n}\n\ninternal U64\ndw_read_form(String8      data,\n             U64          off,\n             DW_Version   version,\n             DW_Format    unit_format,\n             U64          address_size,\n             DW_FormKind  form_kind,\n             U64          implicit_const,\n             DW_Form     *form_out)\n{\n  U64     bytes_read   = 0;\n  DW_Form form = {0};\n  \n  switch (form_kind) {\n    case DW_Form_Null: break;\n    \n    case DW_Form_Addr: {\n      bytes_read = str8_deserial_read_block(data, off, address_size, &form.addr);\n    } break;\n    case DW_Form_Block2: {\n      U16 size = 0;\n      U64 size_size = str8_deserial_read_struct(data, off, &size);\n      if (size_size) {\n        U64 block_size = str8_deserial_read_block(data, off + size_size, size, &form.block);\n        if (block_size) {\n          bytes_read = size_size + block_size;\n        }\n      }\n    } break;\n    case DW_Form_Block4: {\n      U32 size = 0;\n      U64 size_size = str8_deserial_read_struct(data, off, &size);\n      if (size_size) {\n        U64 block_size = str8_deserial_read_block(data, off + size_size, size, &form.block);\n        if (block_size) {\n          bytes_read = size_size + block_size;\n        }\n      }\n    } break;\n    case DW_Form_Data2: {\n      bytes_read = str8_deserial_read_block(data, off, sizeof(U16), &form.data);\n    } break;\n    case DW_Form_Data4: {\n      bytes_read = str8_deserial_read_block(data, off, sizeof(U32), &form.data);\n    } break;\n    case DW_Form_Data8: {\n      bytes_read = str8_deserial_read_block(data, off, sizeof(U64), &form.data);\n    } break;\n    case DW_Form_String: {\n      bytes_read = str8_deserial_read_cstr(data, off, &form.string);\n    } break;\n    case DW_Form_Block: {\n      U64 size = 0;\n      U64 size_size = str8_deserial_read_uleb128(data, off, &size);\n      if (size_size) {\n        U64 block_size = str8_deserial_read_block(data, off + size_size, size, &form.block);\n        if (block_size) {\n          bytes_read = size_size + block_size;\n        }\n      }\n    } break;\n    case DW_Form_Block1: {\n      U8  size      = 0;\n      U64 size_size = str8_deserial_read_struct(data, off, &size);\n      if (size_size) {\n        U64 block_size = str8_deserial_read_block(data, off, size, &form.block);\n        if (block_size == size) {\n          bytes_read = size_size + block_size;\n        }\n      }\n    } break;\n    case DW_Form_Data1: {\n      bytes_read = str8_deserial_read_block(data, off, sizeof(U8), &form.data);\n    } break;\n    case DW_Form_Flag: {\n      bytes_read = str8_deserial_read_struct(data, off, &form.flag);\n    } break;\n    case DW_Form_SData: {\n      bytes_read = str8_deserial_read_sleb128(data, off, &form.sdata);\n    } break;\n    case DW_Form_UData: {\n      bytes_read = str8_deserial_read_uleb128(data, off, &form.udata);\n    } break;\n    case DW_Form_RefAddr: {\n      if (version < DW_Version_3) {\n        bytes_read = str8_deserial_read(data, off, &form.ref, address_size, address_size);\n      } else {\n        bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref);\n      }\n    } break;\n    case DW_Form_GNU_RefAlt: {\n      bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.ref);\n    } break;\n    case DW_Form_Ref1: {\n      bytes_read = str8_deserial_read(data, off, &form.ref, 1, 1);\n    } break;\n    case DW_Form_Ref2: {\n      bytes_read = str8_deserial_read(data, off, &form.ref, 2, 2);\n    } break;\n    case DW_Form_Ref4: {\n      bytes_read = str8_deserial_read(data, off, &form.ref, 4, 4);\n    } break;\n    case DW_Form_Ref8: {\n      bytes_read = str8_deserial_read(data, off, &form.ref, 8, 8);\n    } break;\n    case DW_Form_RefUData: {\n      bytes_read = str8_deserial_read_uleb128(data, off, &form.ref);\n    } break;\n    case DW_Form_SecOffset:\n    case DW_Form_LineStrp:\n    case DW_Form_GNU_StrpAlt:\n    case DW_Form_Strp: {\n      bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.sec_offset);\n    } break;\n    case DW_Form_ExprLoc: {\n      U64 expr_size      = 0;\n      U64 expr_size_size = str8_deserial_read_uleb128(data, off, &expr_size);\n      if (expr_size_size) {\n        if (str8_deserial_read_block(data, off + expr_size_size, expr_size, &form.exprloc)) {\n          bytes_read = expr_size_size + expr_size;\n        }\n      }\n    } break;\n    case DW_Form_FlagPresent: {\n      form.flag = 1;\n    } break;\n    case DW_Form_RefSig8: {\n      //U64 ref = 0;\n      //bytes_read = str8_deserial_read_struct(data, off, &ref);\n      NotImplemented;\n    } break;\n    case DW_Form_Addrx:\n    case DW_Form_RngListx:\n    case DW_Form_Strx: {\n      bytes_read = str8_deserial_read_uleb128(data, off, &form.xval);\n    } break;\n    case DW_Form_RefSup4: {\n      //U32 ref_sup4 = 0;\n      //bytes_read = str8_deserial_read_struct(data, off, &ref_sup4);\n      NotImplemented;\n    } break;\n    case DW_Form_StrpSup: {\n      bytes_read = str8_deserial_read_dwarf_uint(data, off, unit_format, &form.strp_sup);\n    } break;\n    case DW_Form_Data16: {\n      bytes_read = str8_deserial_read_block(data, off, 16, &form.data);\n    } break;\n    case DW_Form_ImplicitConst: {\n      // Special case.\n      // Unlike other forms that have their values stored in the .debug_info section,\n      // This one defines it's value in the .debug_abbrev section.\n      form.implicit_const = implicit_const;\n    } break;\n    case DW_Form_LocListx: {\n      bytes_read = str8_deserial_read_uleb128(data, off, &form.xval);\n    } break;\n    case DW_Form_RefSup8: {\n      NotImplemented;\n    } break;\n    case DW_Form_Strx1: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 1, 1);\n    } break;\n    case DW_Form_Strx2: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 2, 2);\n    } break;\n    case DW_Form_Strx3: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 3, 3);\n    } break;\n    case DW_Form_Strx4: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 4, 4);\n    } break;\n    case DW_Form_Addrx1: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 1, 1);\n    } break;\n    case DW_Form_Addrx2: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 2, 2);\n    } break;\n    case DW_Form_Addrx3: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 3, 3);\n    } break;\n    case DW_Form_Addrx4: {\n      bytes_read = str8_deserial_read(data, off, &form.xval, 4, 4);\n    } break;\n    default: InvalidPath; break;\n  }\n  \n  if (form_out) {\n    *form_out = form;\n  }\n  \n  return bytes_read;\n}\n\ninternal U64\ndw_read_tag(Arena          *arena,\n            String8         tag_data,\n            U64             tag_off,\n            U64             tag_base,\n            DW_AbbrevTable  abbrev_table,\n            String8         abbrev_data,\n            DW_Version      version,\n            DW_Format       unit_format,\n            U64             address_size,\n            DW_Tag         *tag_out)\n{\n  U64 tag_cursor = tag_off;\n  \n  // read tag abbrev id\n  U64 tag_abbrev_id    = 0;\n  U64 tag_abbrev_id_size = str8_deserial_read_uleb128(tag_data, tag_cursor, &tag_abbrev_id);\n  Assert(tag_abbrev_id_size);\n  tag_cursor += tag_abbrev_id_size;\n  \n  // read tag abbrev\n  U64       abbrev_cursor   = dw_abbrev_offset_from_abbrev_id(abbrev_table, tag_abbrev_id);\n  DW_Abbrev tag_abbrev      = {0};\n  U64       tag_abbrev_size = dw_read_abbrev_tag(abbrev_data, abbrev_cursor, &tag_abbrev);\n  \n  // read attribs\n  DW_AttribList attribs = {0};\n  if (tag_abbrev_size > 0) {\n    abbrev_cursor += tag_abbrev_size;\n    \n    for (; tag_cursor < tag_data.size && abbrev_cursor < abbrev_data.size; ) {\n      U64 attrib_tag_cursor = tag_cursor;\n      U64 attrib_abbrev_off = abbrev_cursor;\n      \n      // read attrib abbrev\n      DW_Abbrev attrib_abbrev = {0};\n      abbrev_cursor += dw_read_abbrev_attrib(abbrev_data, abbrev_cursor, &attrib_abbrev);\n      if (attrib_abbrev.id == 0) {\n        break;\n      }\n      \n      DW_AttribKind attrib_kind = (DW_AttribKind)attrib_abbrev.id;\n      DW_FormKind   form_kind   = (DW_FormKind)attrib_abbrev.sub_kind;\n      \n      // special case, allows producer to embed form in .debug_info\n      if (form_kind == DW_Form_Indirect) {\n        U64 form_kind_size = str8_deserial_read_uleb128(tag_data, tag_cursor, &form_kind);\n        \n        if (form_kind_size == 0) {\n          Assert(!\"unable to read indirect form kind\");\n          break;\n        }\n        \n        tag_cursor += form_kind_size;\n      }\n      \n      // read form value\n      DW_Form form = {0};\n      tag_cursor += dw_read_form(tag_data, tag_cursor, version, unit_format, address_size, form_kind, attrib_abbrev.const_value, &form);\n      \n      // fill out node\n      DW_AttribNode *attrib_n  = push_array(arena, DW_AttribNode, 1);\n      attrib_n->v.info_off     = tag_base + attrib_tag_cursor;\n      attrib_n->v.abbrev_off   = attrib_abbrev_off;\n      attrib_n->v.abbrev_id    = attrib_abbrev.id;\n      attrib_n->v.attrib_kind  = attrib_kind;\n      attrib_n->v.form_kind    = form_kind;\n      attrib_n->v.form         = form;\n      \n      // push node to list\n      SLLQueuePush(attribs.first, attribs.last, attrib_n);\n      ++attribs.count;\n    }\n  }\n  \n  // fill out tag\n  tag_out->abbrev_id    = tag_abbrev_id;\n  tag_out->has_children = !!(tag_abbrev.flags & DW_AbbrevFlag_HasChildren);\n  tag_out->kind         = (DW_TagKind)tag_abbrev.sub_kind;\n  tag_out->attribs      = attribs;\n  tag_out->info_off     = tag_base + tag_off;\n  \n  U64 bytes_read = tag_cursor - tag_off;\n  return bytes_read;\n}\n\ninternal U64\ndw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out)\n{\n  String8 tag_data = str8_substr(input->sec[DW_Section_Info].data, cu->info_range);\n  U64     tag_off  = info_off - cu->info_range.min;\n  return dw_read_tag(arena, tag_data, tag_off, cu->info_range.min, cu->abbrev_table, cu->abbrev_data, cu->version, cu->format, cu->address_size, tag_out);\n}\n\ninternal B32\ndw_try_u64_from_const_value(U64 type_byte_size, DW_ATE type_encoding, String8 const_value, U64 *value_out)\n{\n  B32 is_parsed = 0;\n  if (const_value.size <= type_byte_size) {\n    U64 value_size = Min(type_byte_size, const_value.size);\n    if (value_size <= sizeof(*value_out)) {\n      MemoryZeroStruct(value_out);\n      MemoryCopy(value_out, const_value.str, value_size);\n      if (type_encoding == DW_ATE_Signed || type_encoding == DW_ATE_SignedChar) {\n        *value_out = extend_sign64(*value_out, value_size);\n      }\n      is_parsed = 1;\n    } else {\n      Assert(!\"out value overflow\");\n    }\n  }\n  return is_parsed;\n}\n\ninternal U64\ndw_u64_from_const_value(String8 const_value)\n{\n  U64 result       = 0;\n  B32 is_converted = dw_try_u64_from_const_value(sizeof(U64), DW_ATE_Unsigned, const_value, &result);\n  Assert(is_converted); // TODO: error handling\n  return result;\n}\n\ninternal U64\ndw_interp_sec_offset(DW_FormKind form_kind, DW_Form form)\n{\n  U64 sec_offset = 0;\n  if (form_kind == DW_Form_SecOffset) {\n    sec_offset = form.sec_offset;\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return sec_offset;\n}\n\ninternal String8\ndw_interp_exprloc(DW_FormKind form_kind, DW_Form form)\n{\n  String8 expr = {0};\n  if (form_kind == DW_Form_ExprLoc) {\n    expr = form.exprloc;\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return expr;\n}\n\ninternal U128\ndw_interp_const_u128(DW_FormKind form_kind, DW_Form form)\n{\n  AssertAlways(form.data.size <= sizeof(U128));\n  U128 result = {0};\n  MemoryCopy(&result.u64[0], form.data.str, form.data.size);\n  return result;\n}\n\ninternal U64\ndw_interp_const64(U64 type_byte_size, DW_ATE type_encoding, DW_FormKind form_kind, DW_Form form)\n{\n  U64 result = max_U64;\n  if (form_kind == DW_Form_Data1 || form_kind == DW_Form_Data2 || form_kind == DW_Form_Data4 || form_kind == DW_Form_Data8 || form_kind == DW_Form_Data16) {\n    if (form.data.size <= sizeof(result)) {\n      if (!dw_try_u64_from_const_value(type_byte_size, type_encoding, form.data, &result)) {\n        Assert(!\"unable to decode data\");\n      }\n    } else {\n      Assert(!\"unable to cast U128 to U64\");\n    }\n  } else if (form_kind == DW_Form_UData) {\n    result = form.udata;\n  } else if (form_kind == DW_Form_SData) {\n    result = form.sdata;\n  } else if (form_kind == DW_Form_ImplicitConst) {\n    result = form.implicit_const;\n  } else if (form_kind == DW_Form_Null) {\n    // skip \n  } else {\n    AssertAlways(!\"unexpected form\");\n  }\n  return result;\n}\n\ninternal U64\ndw_interp_const_u64(DW_FormKind form_kind, DW_Form form)\n{\n  return dw_interp_const64(sizeof(U64), DW_ATE_Unsigned, form_kind, form);\n}\n\ninternal U32\ndw_interp_const_u32(DW_FormKind form_kind, DW_Form form)\n{\n  U64 const64 = dw_interp_const_u64(form_kind, form);\n  U32 const32 = safe_cast_u32(const64);\n  return const32;\n}\n\ninternal S64\ndw_interp_const_s64(DW_FormKind form_kind, DW_Form form)\n{\n  U64 const_u64 = dw_interp_const_u64(form_kind, form);\n  S64 const_s64 = (S64)const_u64;\n  return const_s64;\n}\n\ninternal S32\ndw_interp_const_s32(DW_FormKind form_kind, DW_Form form)\n{\n  U32 const_u32 = dw_interp_const_u32(form_kind, form);\n  S32 const_s32 = (S32)const_u32;\n  return const_s32;\n}\n\ninternal U64\ndw_interp_address(U64 address_size, U64 base_addr, DW_ListUnit *addr_lu, DW_FormKind form_kind, DW_Form form)\n{\n  U64 address = 0;\n  if (form_kind == DW_Form_Addr) {\n    if (!dw_try_u64_from_const_value(address_size, DW_ATE_Address, form.addr, &address)) {\n      AssertAlways(!\"unable to decode address\");\n    }\n  } else if (form_kind == DW_Form_Addrx || form_kind == DW_Form_Addrx1 || form_kind == DW_Form_Addrx2 ||\n             form_kind == DW_Form_Addrx3 || form_kind == DW_Form_Addrx4) {\n    address = dw_addr_from_list_unit(addr_lu, form.xval);\n  } else if (form_kind == DW_Form_SecOffset) {\n    if (addr_lu->segment_selector_size > 0) {\n      AssertAlways(!\"TODO: support for segmented address space\");\n    }\n    if (form.sec_offset + addr_lu->segment_selector_size + addr_lu->address_size <= addr_lu->entries.size) {\n      MemoryCopy(&address, addr_lu->entries.str + form.sec_offset, addr_lu->address_size);\n    } else {\n      Assert(!\"out of bounds .debug_addr offset\");\n    }\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return address;\n}\n\ninternal String8\ndw_interp_block(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form)\n{\n  NotImplemented;\n  return str8_zero();\n}\n\ninternal String8\ndw_interp_string(DW_Input    *input,\n                 DW_Format    unit_format,\n                 DW_ListUnit *str_offsets,\n                 DW_FormKind  form_kind,\n                 DW_Form      form)\n{\n  String8 string = {0};\n  if (form_kind == DW_Form_String) {\n    string = form.string;\n  } else if (form_kind == DW_Form_Strp) {\n    U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.sec_offset, &string);\n    Assert(bytes_read > 0);\n  } else if (form_kind == DW_Form_LineStrp) {\n    U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_LineStr].data, form.sec_offset, &string);\n    Assert(bytes_read > 0);\n  } else if (form_kind == DW_Form_StrpSup) {\n    U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, form.strp_sup, &string);\n    Assert(bytes_read > 0);\n  } else if (form_kind == DW_Form_Strx || form_kind == DW_Form_Strx1 ||\n             form_kind == DW_Form_Strx2 || form_kind == DW_Form_Strx3 ||\n             form_kind == DW_Form_Strx4) {\n    U64 sec_offset = dw_offset_from_list_unit(str_offsets, form.xval);\n    if (sec_offset < input->sec[DW_Section_Str].data.size) {\n      U64 bytes_read = str8_deserial_read_cstr(input->sec[DW_Section_Str].data, sec_offset, &string);\n      Assert(bytes_read > 0);\n    } else {\n      AssertAlways(!\"unable to translate index to offset\");\n    }\n  } else if (form_kind == DW_Form_GNU_StrpAlt) {\n    NotImplemented;\n  } else if (form_kind == DW_Form_GNU_StrIndex) {\n    NotImplemented;\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return string;\n}\n\ninternal String8\ndw_interp_line_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form)\n{\n  String8 result = {0};\n  if (form_kind == DW_Form_SecOffset) {\n    result = str8_skip(input->sec[DW_Section_Line].data, form.sec_offset);\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return result;\n}\n\ninternal DW_LineFile *\ndw_interp_file(DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form)\n{\n  DW_LineFile *result = 0;\n  U64 file_idx = dw_interp_const_u64(form_kind, form);\n  if (file_idx < line_vm->file_table.count) {\n    result = &line_vm->file_table.v[file_idx];\n  } else {\n    Assert(!\"out of bounds file index\");\n  }\n  return result;\n}\n\ninternal DW_Reference\ndw_interp_ref(DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form)\n{\n  DW_Reference ref = {0};\n  if (form_kind == DW_Form_Ref1 || form_kind == DW_Form_Ref2 ||\n      form_kind == DW_Form_Ref4 || form_kind == DW_Form_Ref8 ||\n      form_kind == DW_Form_RefUData) {\n    ref.cu = cu;\n    ref.info_off = form.ref;\n  } else if (form_kind == DW_Form_RefAddr) {\n    NotImplemented;\n  } else if (form_kind == DW_Form_RefSig8) {\n    NotImplemented;\n  } else if (form_kind == DW_Form_RefSup4 || form_kind == DW_Form_RefSup8) {\n    NotImplemented;\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return ref;\n}\n\ninternal DW_LocList\ndw_interp_loclist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form)\n{\n  DW_LocList loclist = {0};\n  \n  if (cu->version < DW_Version_5) {\n    if (form_kind == DW_Form_SecOffset) {\n      U64 sec_offset = max_U64;\n      if (form_kind == DW_Form_SecOffset) {\n        sec_offset = form.sec_offset;\n      } else if (form_kind == DW_Form_Data8 || form_kind == DW_Form_Data4 ||\n                 form_kind == DW_Form_Data2 || form_kind == DW_Form_Data1) {\n        if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) {\n          Assert(!\"unable to extract section offset\");\n        }\n      } else if (form_kind == DW_Form_Null) {\n        Assert(!\"unexpected form\");\n      }\n      \n      String8 sec       = str8_skip(input->sec[DW_Section_Loc].data, sec_offset);\n      U64     base_addr = cu->low_pc;\n      U64     base_sel  = DW_SentinelFromSize(cu->address_size);\n      for (U64 cursor = 0; cursor < sec.size; ) {\n        U64 range_min      = 0;\n        U64 range_min_off  = cursor;\n        U64 range_min_size = str8_deserial_read(sec, range_min_off, &range_min, cu->address_size, cu->address_size);\n        if (range_min_size == 0) {\n          break;\n        }\n        U64 range_max      = 0;\n        U64 range_max_off  = cursor + cu->address_size;\n        U64 range_max_size = str8_deserial_read(sec, range_max_off, &range_max, cu->address_size, cu->address_size);\n        if (range_max_size == 0) {\n          break;\n        }\n        cursor += cu->address_size * 2;\n        \n        // series terminator\n        if (range_min == 0 && range_max == 0) {\n          break;\n        }\n        // set new base address\n        else if (range_min == base_sel) {\n          base_addr = range_max;\n        }\n        // location\n        else {\n          U16 expr_size      = 0;\n          U64 expr_size_size = str8_deserial_read_struct(sec, cursor, &expr_size);\n          if (expr_size_size == 0) {\n            Assert(!\"unable to read expression size\");\n            break;\n          }\n          cursor += expr_size_size;\n          \n          Assert(cursor + expr_size <= sec.size);\n          Rng1U64 expr_range = rng_1u64(cursor, ClampTop(cursor + expr_size, sec.size));\n          \n          DW_LocNode *loc_n = push_array(arena, DW_LocNode, 1);\n          loc_n->v.range    = rng_1u64(base_addr + range_min, base_addr + range_max);\n          loc_n->v.expr     = str8_substr(sec, expr_range);\n          \n          SLLQueuePush(loclist.first, loclist.last, loc_n);\n          ++loclist.count;\n          \n          // advance past expression\n          cursor += expr_size;\n        }\n      }\n    } else if (form_kind != DW_Form_Null) {\n      AssertAlways(!\"unexpected form\");\n    }\n  } else {\n    DW_Version version = DW_Version_Null;\n    String8    raw_lle = {0};\n    if (form_kind == DW_Form_SecOffset) {\n      // offset is from beginning of the section\n      U64 sec_offset = form.sec_offset;\n      raw_lle = str8_skip(input->sec[DW_Section_LocLists].data, sec_offset);\n    } else if (form_kind == DW_Form_LocListx) {\n      // offset is from beginning of the entries\n      U64 entries_off = dw_offset_from_list_unit(cu->loclists_lu, form.xval);\n      raw_lle         = str8_skip(cu->loclists_lu->entries, entries_off);\n      version         = cu->loclists_lu->version;\n    } else if (form_kind != DW_Form_Null) {\n      AssertAlways(!\"unexpected form\");\n    }\n    \n    for (U64 cursor = 0, keep_parsing = 1, base_addr = cu->low_pc;\n         cursor < raw_lle.size && keep_parsing; ) {\n      DW_LLE kind = DW_LLE_EndOfList;\n      cursor += str8_deserial_read_struct(raw_lle, cursor, &kind);\n      \n      Rng1U64 range = {0};\n      switch (kind) {\n        default:\n        Assert(!\"unknown kind\");\n        case DW_LLE_EndOfList: {\n          keep_parsing = 0;\n        } break;\n        case DW_LLE_BaseAddressx: {\n          if (!cu->addr_lu) {\n            keep_parsing = 0;\n            break;\n          }\n          \n          U64 addrx = 0;\n          U64 addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &addrx);\n          if (addrx_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          \n          U64 base_addr_new = dw_addr_from_list_unit(cu->addr_lu, addrx);\n          if (base_addr_new == max_U64) {\n            InvalidPath;\n            break;\n          }\n          \n          base_addr = base_addr_new;\n          cursor += addrx_size;\n        } break;\n        case DW_LLE_StartxEndx: {\n          U64 start_addrx      = 0;\n          U64 start_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &start_addrx);\n          if (start_addrx_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 end_addrx      = 0;\n          U64 end_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor + start_addrx_size, &end_addrx);\n          if (end_addrx_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_addrx_size;\n          cursor += end_addrx_size;\n          \n          U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx);\n          U64 end   = dw_addr_from_list_unit(cu->addr_lu, end_addrx);\n          Assert(start != max_U64);\n          Assert(end   != max_U64);\n          \n          range = rng_1u64(start, end);\n        } break;\n        case DW_LLE_StartxLength: {\n          U64 start_addrx      = 0;\n          U64 start_addrx_size = str8_deserial_read_uleb128(raw_lle, cursor, &start_addrx);\n          if (start_addrx_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          \n          // parse pre-standard & standard length\n          U64 length_off = cursor + start_addrx_size;\n          U64 length     = 0;\n          U64 length_size = str8_deserial_read_uleb128(raw_lle, length_off, &length);\n          if (length_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          \n          cursor += start_addrx_size;\n          cursor += length_size;\n          \n          if (cu->addr_lu) {\n            U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx);\n            Assert(start < max_U64);\n            \n            range = rng_1u64(start, start + length);\n          } else {\n            Assert(!\".debug_addr section is missing -- unable to interpret address index\");\n          }\n        } break;\n        case DW_LLE_OffsetPair: {\n          U64 start      = 0;\n          U64 start_size = str8_deserial_read_uleb128(raw_lle, cursor, &start);\n          if (start_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 end      = 0;\n          U64 end_size = str8_deserial_read_uleb128(raw_lle, cursor + start_size, &end);\n          if (end_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_size;\n          cursor += end_size;\n          \n          range = rng_1u64(base_addr + start, base_addr + end);\n        } break;\n        case DW_LLE_DefaultLocation: {\n          // no range\n          int x = 0;\n        } break;\n        case DW_LLE_BaseAddress: {\n          U64 base_addr_size = str8_deserial_read(raw_lle, cursor, &base_addr, cu->address_size, cu->address_size);\n          if (base_addr_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += base_addr_size;\n        } break;\n        case DW_LLE_StartEnd: {\n          U64 start      = 0;\n          U64 start_size = str8_deserial_read(raw_lle, cursor, &start, cu->address_size, cu->address_size);\n          if (start_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          \n          U64 end      = 0;\n          U64 end_size = str8_deserial_read(raw_lle, cursor + start_size, &end, cu->address_size, cu->address_size);\n          if (end_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_size;\n          cursor += end_size;\n          \n          range = rng_1u64(start, end);\n        } break;\n        case DW_LLE_StartLength: {\n          U64 start      = 0;\n          U64 start_size = str8_deserial_read(raw_lle, cursor, &start, cu->address_size, cu->address_size);\n          if (start_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 length      = 0;\n          U64 length_size = str8_deserial_read_uleb128(raw_lle, cursor + start_size, &length);\n          if (length_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_size;\n          cursor += length_size;\n          \n          range = rng_1u64(start, start + length);\n        } break;\n      }\n      \n      B32 has_expr = keep_parsing && kind != DW_LLE_BaseAddressx && kind != DW_LLE_BaseAddress;\n      if (has_expr) {\n        U64 expr_size      = 0;\n        U64 expr_size_size = str8_deserial_read_uleb128(raw_lle, cursor, &expr_size);\n        if (expr_size_size == 0) {\n          keep_parsing = 0;\n          break;\n        }\n        \n        String8 expr           = {0};\n        U64     expr_read_size = str8_deserial_read_block(raw_lle, cursor + expr_size_size, expr_size, &expr);\n        if (expr_read_size != expr_size) {\n          keep_parsing = 0;\n          break;\n        }\n        \n        cursor += expr_size_size;\n        cursor += expr_size;\n        \n        DW_LocNode *loc_n = push_array(arena, DW_LocNode, 1);\n        loc_n->v.range    = range;\n        loc_n->v.expr     = expr;\n        \n        SLLQueuePush(loclist.first, loclist.last, loc_n);\n        ++loclist.count;\n      }\n    }\n  }\n  \n  return loclist;\n}\n\ninternal B32\ndw_interp_flag(DW_FormKind form_kind, DW_Form form)\n{\n  B32 flag = 0;\n  if (form_kind == DW_Form_Flag || form_kind == DW_Form_FlagPresent) {\n    flag = form.flag;\n  } else if (form_kind != DW_Form_Null) {\n    AssertAlways(!\"unexpected form\");\n  }\n  return flag;\n}\n\ninternal Rng1U64List\ndw_interp_rnglist(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form)\n{\n  Rng1U64List rnglist = {0};\n  \n  if (cu->version < DW_Version_5) {\n    // decode section offset\n    U64 sec_offset = max_U64;\n    if (form_kind == DW_Form_SecOffset) {\n      sec_offset = form.sec_offset;\n    } else if (form_kind == DW_Form_Data8 || form_kind == DW_Form_Data4 ||\n               form_kind == DW_Form_Data2 || form_kind == DW_Form_Data1) {\n      if (!dw_try_u64_from_const_value(form.data.size, DW_ATE_Unsigned, form.data, &sec_offset)) {\n        Assert(!\"unable to extract section offset\");\n      }\n    } else if (form_kind != DW_Form_Null) {\n      Assert(!\"unexpected form\");\n    }\n    \n    String8 sec       = str8_skip(input->sec[DW_Section_Ranges].data, sec_offset);\n    U64     base_addr = cu->low_pc;\n    U64     base_sel  = DW_SentinelFromSize(cu->address_size);\n    for (U64 cursor = 0; cursor < sec.size; ) {\n      U64 range_min      = 0;\n      U64 range_min_off  = cursor;\n      U64 range_min_size = str8_deserial_read(sec, range_min_off, &range_min, cu->address_size, cu->address_size);\n      if (range_min_size == 0) {\n        break;\n      }\n      U64 range_max      = 0;\n      U64 range_max_off  = cursor + cu->address_size;\n      U64 range_max_size = str8_deserial_read(sec, range_max_off, &range_max, cu->address_size, cu->address_size);\n      if (range_max_size == 0) {\n        break;\n      }\n      cursor += cu->address_size * 2;\n      \n      // series terminator\n      if (range_min == 0 && range_max == 0) {\n        break;\n      }\n      // set new base address\n      else if (range_min == base_sel) {\n        base_addr = range_max;\n      }\n      // range\n      else {\n        Rng1U64 range = rng_1u64(base_addr + range_min, base_addr + range_max);\n        rng1u64_list_push(arena, &rnglist, range);\n      }\n    }\n  } else {\n    String8 raw_rle = {0};\n    if (form_kind == DW_Form_SecOffset) {\n      // offset is from beginning of the section\n      U64 sec_offset = form.sec_offset;\n      raw_rle = str8_skip(input->sec[DW_Section_RngLists].data, sec_offset);\n    } else if (form_kind == DW_Form_RngListx) {\n      // offset is from beginning of the entries\n      U64 sec_offset = dw_offset_from_list_unit(cu->rnglists_lu, form.xval);\n      raw_rle        = str8_skip(cu->rnglists_lu->entries, sec_offset);\n    } else if (form_kind != DW_Form_Null) {\n      AssertAlways(!\"unexpected form\");\n    }\n    \n    U64 rle_invalid_value = DW_SentinelFromSize(cu->address_size);\n    U64 base_addr         = cu->low_pc;\n    for (U64 cursor = 0, keep_parsing = 1; cursor < raw_rle.size && keep_parsing; ) {\n      DW_RLE kind = DW_RLE_EndOfList;\n      cursor += str8_deserial_read_struct(raw_rle, cursor, &kind);\n      \n      Rng1U64 range = rng_1u64(rle_invalid_value, rle_invalid_value);\n      switch (kind) {\n        default:\n        case DW_RLE_EndOfList: {\n          keep_parsing = 0;\n        } break;\n        case DW_RLE_BaseAddressx: {\n          U64 addrx      = 0;\n          U64 addrx_size = str8_deserial_read_uleb128(raw_rle, cursor, &addrx);\n          if (addrx_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          if (cu->addr_lu == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 base_addr_new = dw_addr_from_list_unit(cu->addr_lu, addrx);\n          if (base_addr_new < max_U64) {\n            base_addr = base_addr_new;\n            cursor += addrx_size;\n          } else {\n            keep_parsing = 0;\n            Assert(!\"invalid addrx\");\n          }\n        } break;\n        case DW_RLE_StartxLength: {\n          U64 start_addrx      = 0;\n          U64 start_addrx_size = str8_deserial_read_uleb128(raw_rle, cursor, &start_addrx);\n          if (start_addrx_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 length      = 0;\n          U64 length_size = str8_deserial_read_uleb128(raw_rle, cursor + start_addrx_size, &length);\n          if (length_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_addrx_size;\n          cursor += length_size;\n          \n          if (cu->addr_lu) {\n            U64 start = dw_addr_from_list_unit(cu->addr_lu, start_addrx);\n            AssertAlways(start < max_U64);\n            range = rng_1u64(start, start + length);\n          }\n        } break;\n        case DW_RLE_OffsetPair: {\n          U64 offset_start, offset_end = 0;\n          U64 offset_start_size = str8_deserial_read_uleb128(raw_rle, cursor, &offset_start);\n          if (offset_start_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 offset_end_size = str8_deserial_read_uleb128(raw_rle, cursor + offset_start_size, &offset_end);\n          if (offset_end_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += offset_start_size;\n          cursor += offset_end_size;\n          \n          range = rng_1u64(base_addr + offset_start, base_addr + offset_end);\n        } break;\n        case DW_RLE_BaseAddress: {\n          U64 base_addr_size = str8_deserial_read(raw_rle, cursor, &base_addr, cu->address_size, cu->address_size);\n          if (base_addr_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += base_addr_size;\n        } break;\n        case DW_RLE_StartEnd: {\n          U64 start = 0, end = 0;\n          \n          U64 start_size = str8_deserial_read(raw_rle, cursor, &start, cu->address_size, cu->address_size);\n          if (start_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 end_size = str8_deserial_read(raw_rle, cursor + start_size, &end, cu->address_size, cu->address_size);\n          if (end_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_size;\n          cursor += end_size;\n          \n          range = rng_1u64(start, end);\n        } break;\n        case DW_RLE_StartLength: {\n          U64 start = 0, length = 0;\n          \n          U64 start_size = str8_deserial_read(raw_rle, cursor, &start, cu->address_size, cu->address_size);\n          if (start_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          U64 length_size = str8_deserial_read_uleb128(raw_rle, cursor + start_size, &length);\n          if (length_size == 0) {\n            keep_parsing = 0;\n            break;\n          }\n          cursor += start_size;\n          cursor += length_size;\n          \n          range = rng_1u64(start, start + length);\n        } break;\n      }\n      \n      if (range.min != rle_invalid_value) {\n        rng1u64_list_push(arena, &rnglist, range);\n      }\n    }\n  }\n  \n  return rnglist;\n}\n\ninternal String8\ndw_interp_secptr(DW_Input *input, DW_SectionKind section, DW_FormKind form_kind, DW_Form form)\n{\n  String8 secptr = {0};\n  if (form_kind == DW_Form_SecOffset) {\n    String8 sect  = input->sec[section].data;\n    Rng1U64 range = rng_1u64(form.sec_offset, sect.size);\n    secptr = str8_substr(sect, range);\n  } else if (form_kind != DW_Form_Null) {\n    Assert(!\"unexpected form\");\n  }\n  return secptr;\n}\n\ninternal String8\ndw_interp_addrptr(DW_Input *input, DW_FormKind form_kind, DW_Form form)\n{\n  return dw_interp_secptr(input, DW_Section_Addr, form_kind, form);\n}\n\ninternal String8\ndw_interp_str_offsets_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form)\n{\n  return dw_interp_secptr(input, DW_Section_StrOffsets, form_kind, form);\n}\n\ninternal String8\ndw_interp_rnglists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form)\n{\n  return dw_interp_secptr(input, DW_Section_RngLists, form_kind, form);\n}\n\ninternal String8\ndw_interp_loclists_ptr(DW_Input *input, DW_FormKind form_kind, DW_Form form)\n{\n  return dw_interp_secptr(input, DW_Section_LocLists, form_kind, form);\n}\n\ninternal DW_AttribClass\ndw_value_class_from_attrib(DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  return dw_pick_attrib_value_class(cu->version, cu->ext, attrib->attrib_kind, attrib->form_kind);\n}\n\ninternal String8\ndw_exprloc_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_ExprLoc || value_class == DW_AttribClass_Block);\n  return dw_interp_exprloc(attrib->form_kind, attrib->form);\n}\n\ninternal U128\ndw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const);\n  return dw_interp_const_u128(attrib->form_kind, attrib->form);\n}\n\ninternal U64\ndw_const_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const);\n  return dw_interp_const_u64(attrib->form_kind, attrib->form);\n}\n\ninternal U32\ndw_const_u32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const);\n  return dw_interp_const_u32(attrib->form_kind, attrib->form);\n}\n\ninternal S64\ndw_const_s64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const);\n  return dw_interp_const_s64(attrib->form_kind, attrib->form);\n}\n\ninternal S32\ndw_const_s32_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const);\n  return dw_interp_const_s32(attrib->form_kind, attrib->form);\n}\n\ninternal B32\ndw_flag_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Flag);\n  return dw_interp_flag(attrib->form_kind, attrib->form);\n}\n\ninternal U64\ndw_address_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null ||\n               value_class == DW_AttribClass_Address ||\n               value_class == DW_AttribClass_AddrPtr);\n  DW_FormKind form_kind = attrib->form_kind;\n  DW_Form     form      = attrib->form;\n  if (value_class == DW_AttribClass_AddrPtr) {\n    \n    if (attrib->form_kind == DW_Form_SecOffset) {\n      \n      \n    } else {\n      AssertAlways(!\"unexpected form\");\n    }\n    \n    \n    form_kind = DW_Form_Addr;\n    form.addr = dw_interp_addrptr(input, attrib->form_kind, attrib->form);\n  }\n  return dw_interp_address(cu->address_size, cu->low_pc, cu->addr_lu, form_kind, form);\n}\n\ninternal String8\ndw_block_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Block);\n  return dw_interp_block(input, cu, attrib->form_kind, attrib->form);\n}\n\ninternal String8\ndw_string_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_String || value_class == DW_AttribClass_StrOffsetsPtr);\n  return dw_interp_string(input, cu->format, cu->str_offsets_lu, attrib->form_kind, attrib->form);\n}\n\ninternal String8\ndw_line_ptr_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_LinePtr);\n  return dw_interp_line_ptr(input, attrib->form_kind, attrib->form);\n}\n\ninternal DW_LineFile *\ndw_file_from_attrib(DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Const);\n  return dw_interp_file(line_vm, attrib->form_kind, attrib->form);\n}\n\ninternal DW_Reference\ndw_ref_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null || value_class == DW_AttribClass_Reference);\n  return dw_interp_ref(input, cu, attrib->form_kind, attrib->form);\n}\n\ninternal DW_LocList\ndw_loclist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  AssertAlways(value_class == DW_AttribClass_Null ||\n               value_class == DW_AttribClass_LocList ||\n               value_class == DW_AttribClass_LocListPtr);\n  return dw_interp_loclist(arena, input, cu, attrib->form_kind, attrib->form);\n}\n\ninternal Rng1U64List\ndw_rnglist_from_attrib(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib)\n{\n  Rng1U64List rnglist = {0};\n  DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\n  if (value_class == DW_AttribClass_RngListPtr || value_class == DW_AttribClass_RngList) {\n    rnglist = dw_interp_rnglist(arena, input, cu, attrib->form_kind, attrib->form);\n  } else if (value_class != DW_AttribClass_Null) {\n    Assert(!\"unexpected value class\");\n  }\n  return rnglist;\n}\n\ninternal DW_Attrib *\ndw_attrib_from_tag_(DW_Tag tag, DW_AttribKind kind)\n{\n  local_persist read_only DW_Attrib null_attrib;\n  DW_Attrib *attrib = &null_attrib;\n  for (DW_AttribNode *attrib_n = tag.attribs.first; attrib_n != 0; attrib_n = attrib_n->next) {\n    if (attrib_n->v.attrib_kind == kind) {\n      attrib = &attrib_n->v;\n      break;\n    }\n  }\n  return attrib;\n}\n\ninternal DW_Attrib *\ndw_attrib_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  DW_Attrib *attrib = dw_attrib_from_tag_(tag, kind);\n  \n  if (attrib->attrib_kind == DW_AttribKind_Null) {\n    if (cu && cu->tag_ht) {\n      DW_Attrib *ao_attrib = dw_attrib_from_tag_(tag, DW_AttribKind_AbstractOrigin);\n      if (ao_attrib->attrib_kind == DW_AttribKind_AbstractOrigin) {\n        DW_Reference  ref     = dw_interp_ref(input, cu, ao_attrib->form_kind, ao_attrib->form);\n        DW_TagNode   *ref_tag = dw_tag_node_from_info_off(ref.cu, ref.info_off);\n        attrib = dw_attrib_from_tag_(ref_tag->tag, kind);\n      }\n    }\n  }\n  \n  return attrib;\n}\n\ninternal B32\ndw_tag_has_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind);\n  B32 has_attrib = attrib->attrib_kind != DW_AttribKind_Null;\n  return has_attrib;\n}\n\ninternal String8\ndw_exprloc_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_exprloc_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal String8\ndw_block_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_block_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal U128\ndw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_const_u128_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal U64\ndw_const_u64_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_const_u64_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal U32\ndw_const_u32_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_const_u32_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal U64\ndw_address_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_address_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal String8\ndw_string_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_string_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal String8\ndw_line_ptr_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_line_ptr_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal DW_Reference\ndw_ref_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_ref_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal DW_LocList\ndw_loclist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_loclist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal Rng1U64List\ndw_rnglist_from_tag_attrib_kind(Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_rnglist_from_attrib(arena, input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal B32\ndw_flag_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_flag_from_attrib(input, cu, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal DW_LineFile *\ndw_file_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind)\n{\n  return dw_file_from_attrib(cu, line_vm, dw_attrib_from_tag(input, cu, tag, kind));\n}\n\ninternal B32\ndw_try_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, U64 *byte_size_out)\n{\n  B32 has_byte_size = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ByteSize);\n  B32 has_bit_size  = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_BitSize );\n  \n  if (has_byte_size && has_bit_size) {\n    Assert(!\"ill formated byte size\");\n  }\n  \n  if (has_byte_size) {\n    *byte_size_out = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize); \n    return 1;\n  } else if (has_bit_size) {\n    U64 bit_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_BitSize);\n    *byte_size_out = bit_size / 8;\n    return 1;\n  }\n  \n  return 0;\n}\n\ninternal U64\ndw_byte_size_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag)\n{\n  U64 byte_size = max_U64;\n  dw_try_byte_size_from_tag(input, cu, tag, &byte_size);\n  return byte_size;\n}\n\ninternal U32\ndw_byte_size_32_from_tag(DW_Input *input, DW_CompUnit *cu, DW_Tag tag)\n{\n  U32 byte_size32 = 0;\n  U64 byte_size64;\n  if (dw_try_byte_size_from_tag(input, cu, tag, &byte_size64)) {\n    byte_size32 = safe_cast_u32(byte_size64);\n  }\n  return byte_size32;\n}\n\ninternal U64\ndw_u64_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\n{\n  U64             result       = 0;\n  DW_Attrib      *attrib       = dw_attrib_from_tag(input, cu, tag, kind);\n  DW_AttribClass  attrib_class = dw_value_class_from_attrib(cu, attrib);\n  if (attrib_class == DW_AttribClass_Const || attrib_class == DW_AttribClass_Block) {\n    if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Type)) {\n      Temp scratch = scratch_begin(0,0);\n      DW_Reference type_ref       = dw_ref_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Type);\n      DW_Tag type_tag = {0};\n      dw_read_tag_cu(scratch.arena, input, type_ref.cu, type_ref.info_off, &type_tag);\n      U64          type_byte_size = dw_byte_size_from_tag(input, cu, type_tag);\n      DW_ATE       type_encoding  = dw_const_u64_from_tag_attrib_kind(input, type_ref.cu, type_tag, DW_AttribKind_Encoding);\n      if (type_encoding == DW_ATE_Unsigned || type_encoding == DW_ATE_UnsignedChar) {\n        result = dw_interp_const64(type_byte_size, type_encoding, attrib->form_kind, attrib->form);\n      }\n      scratch_end(scratch);\n    } else {\n      result = dw_interp_const_u64(attrib->form_kind, attrib->form);\n    }\n  } else if (attrib_class == DW_AttribClass_Address) {\n    result = dw_address_from_attrib(input, cu, attrib);\n  } else if (attrib_class == DW_AttribClass_Reference) {\n    NotImplemented;\n  } else if (attrib_class != DW_AttribClass_Null) {\n    AssertAlways(!\"unexpected attrib class\");\n  }\n  return result;\n}\n\ninternal DW_CompUnit\ndw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed)\n{\n  DW_CompUnit cu = {0};\n  \n  String8 info_data = input->sec[DW_Section_Info].data;\n  \n  // read unit size in bytes\n  U64 length      = 0;\n  U64 length_size = str8_deserial_read_dwarf_packed_size(info_data, offset, &length);\n  \n  if (length_size) {\n    // compute unit range\n    Rng1U64 range  = rng_1u64(offset, offset + length_size + length);\n    String8 data   = str8_substr(info_data, range);\n    U64     cursor = length_size;\n    \n    // read version\n    DW_Version version = 0;\n    U64 version_size = str8_deserial_read_struct(data, cursor, &version);\n    cursor += version_size;\n    \n    if (version_size) {\n      DW_Format       format       = DW_FormatFromSize(length);\n      B32             is_header_ok = 0;\n      U64             abbrev_base  = max_U64;\n      U8              address_size = 0;\n      DW_CompUnitKind unit_kind    = DW_CompUnitKind_Reserved;\n      U64             spec_dwo_id  = max_U64;\n      \n      switch (version) {\n        default:\n        case DW_Version_Null:\n        case DW_Version_1:\n        break;\n        case DW_Version_2: {\n          U32 abbrev_base32    = 0;\n          U64 abbrev_base_off  = cursor;\n          U64 abbrev_base_size = str8_deserial_read_struct(data, abbrev_base_off, &abbrev_base32);\n          if (!abbrev_base_size) {\n            break;\n          }\n          \n          U64 address_size_off  = abbrev_base_off + abbrev_base_size;\n          U64 address_size_size = str8_deserial_read_struct(data, address_size_off, &address_size);\n          if (!address_size_size) {\n            break;\n          }\n          \n          abbrev_base  = abbrev_base32;\n          cursor       = address_size_off + address_size_size;\n          is_header_ok = 1;\n        } break;\n        case DW_Version_3:\n        case DW_Version_4: {\n          U64 abbrev_base_off  = cursor;\n          U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base);\n          if (!abbrev_base_size) {\n            break;\n          }\n          \n          U64 address_size_off  = abbrev_base_off + abbrev_base_size;\n          U64 address_size_size = str8_deserial_read_struct(data, address_size_off, &address_size);\n          if (!address_size_size) {\n            break;\n          }\n          \n          cursor       = address_size_off + address_size_size;\n          is_header_ok = 1;\n        } break;\n        case DW_Version_5: {\n          U64 unit_kind_off  = cursor;\n          U64 unit_kind_size = str8_deserial_read_struct(data, unit_kind_off, &unit_kind);\n          if (unit_kind_size == 0) {\n            break;\n          }\n          \n          U64 address_size_off  = unit_kind_off + unit_kind_size;\n          U64 address_size_size = str8_deserial_read_struct(data, address_size_off, &address_size);\n          if (!address_size_size) {\n            break;\n          }\n          \n          U64 abbrev_base_off  = address_size_off + address_size_size;\n          U64 abbrev_base_size = str8_deserial_read_dwarf_uint(data, abbrev_base_off, format, &abbrev_base);\n          if (!abbrev_base_size) {\n            break;\n          }\n          \n          U64 spec_dwo_id_off  = abbrev_base_off + abbrev_base_size;\n          U64 spec_dwo_id_size = 0;\n          if (unit_kind == DW_CompUnitKind_Skeleton || input->sec[DW_Section_Info].is_dwo) {\n            spec_dwo_id_size = str8_deserial_read_struct(data, spec_dwo_id_off, &spec_dwo_id);\n            if (!spec_dwo_id_size) {\n              break;\n            }\n          }\n          \n          cursor       = spec_dwo_id_off + spec_dwo_id_size;\n          is_header_ok = 1;\n        } break;\n      }\n      \n      if (is_header_ok) {\n        Temp temp = temp_begin(arena);\n        \n        // TODO: cache abbrev tables with identical offsets\n        String8        abbrev_data  = input->sec[DW_Section_Abbrev].data;\n        DW_AbbrevTable abbrev_table = dw_make_abbrev_table(arena, abbrev_data, abbrev_base);\n        \n        DW_Tag cu_tag = {0};\n        dw_read_tag(arena, data, cursor, range.min, abbrev_table, abbrev_data, version, format, address_size, &cu_tag);\n        \n        // TODO: handle these unit types\n        Assert(cu_tag.kind != DW_TagKind_SkeletonUnit);\n        Assert(cu_tag.kind != DW_TagKind_TypeUnit);\n        \n        if (cu_tag.kind == DW_TagKind_CompileUnit || cu_tag.kind == DW_TagKind_PartialUnit) {\n          // fetch attribs for list sections\n          DW_Attrib *addr_base_attrib        = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_AddrBase      );\n          DW_Attrib *str_offsets_base_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_StrOffsetsBase);\n          DW_Attrib *rnglists_base_attrib    = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_RngListsBase  );\n          DW_Attrib *loclists_base_attrib    = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LocListsBase  );\n          \n          // interp attribs as section offsets\n          U64 addr_sec_off        = dw_interp_sec_offset(addr_base_attrib->form_kind,        addr_base_attrib->form       );\n          U64 str_offsets_sec_off = dw_interp_sec_offset(str_offsets_base_attrib->form_kind, str_offsets_base_attrib->form);\n          U64 rnglists_sec_off    = dw_interp_sec_offset(rnglists_base_attrib->form_kind,    rnglists_base_attrib->form   );\n          U64 loclists_sec_off    = dw_interp_sec_offset(loclists_base_attrib->form_kind,    loclists_base_attrib->form   );\n          \n          // map section offset to unit index\n          U64 addr_lu_idx        = rng_1u64_array_bsearch(lu_input.addr_ranges,       addr_sec_off       );\n          U64 str_offsets_lu_idx = rng_1u64_array_bsearch(lu_input.str_offset_ranges, str_offsets_sec_off);\n          U64 rnglists_lu_idx    = rng_1u64_array_bsearch(lu_input.rnglist_ranges,    rnglists_sec_off   );\n          U64 loclists_lu_idx    = rng_1u64_array_bsearch(lu_input.loclist_ranges,    loclists_sec_off   );\n          \n          // map index to unit\n          DW_ListUnit *addr_lu        = addr_lu_idx        < lu_input.addr_count       ? &lu_input.addrs[addr_lu_idx]              : 0;\n          DW_ListUnit *str_offsets_lu = str_offsets_lu_idx < lu_input.str_offset_count ? &lu_input.str_offsets[str_offsets_lu_idx] : 0;\n          DW_ListUnit *rnglists_lu    = rnglists_lu_idx    < lu_input.rnglist_count    ? &lu_input.rnglists[rnglists_lu_idx]       : 0;\n          DW_ListUnit *loclists_lu    = loclists_lu_idx    < lu_input.loclist_count    ? &lu_input.loclists[loclists_lu_idx]       : 0;\n          \n          // find compile unit base address\n          DW_Attrib *low_pc_attrib = dw_attrib_from_tag(0, 0, cu_tag, DW_AttribKind_LowPc);\n          U64        low_pc        = dw_interp_address(address_size, max_U64, addr_lu, low_pc_attrib->form_kind, low_pc_attrib->form);\n          \n          // fill out compile unit\n          cu.ext                = DW_Ext_All;\n          cu.kind               = unit_kind;\n          cu.version            = version;\n          cu.format             = format;\n          cu.address_size       = address_size;\n          cu.abbrev_off         = abbrev_base;\n          cu.info_range         = range;\n          cu.first_tag_info_off = range.min + cursor;\n          cu.abbrev_table       = abbrev_table;\n          cu.abbrev_data        = abbrev_data;\n          cu.addr_lu            = addr_lu;\n          cu.str_offsets_lu     = str_offsets_lu;\n          cu.rnglists_lu        = rnglists_lu;\n          cu.loclists_lu        = loclists_lu;\n          cu.low_pc             = low_pc;\n          cu.tag                = cu_tag;\n        } else { \n          // unexpected tag, release memory and exit\n          temp_end(temp);\n        }\n      }\n    }\n  }\n  \n  return cu;\n}\n\ninternal void\ndw_tag_tree_from_data(Arena *arena, String8 info_data, String8 abbrev_data, DW_CompUnit *cu, DW_TagNode *parent, U64 *cursor, U64 *tag_count)\n{\n  while (*cursor < info_data.size) {\n    // read tag\n    DW_Tag tag = {0};\n    U64 tag_size = dw_read_tag(arena, info_data, *cursor, cu->info_range.min, cu->abbrev_table, abbrev_data, cu->version, cu->format, cu->address_size, &tag);\n    if (tag_size == 0) {\n      break;\n    }\n    *cursor += tag_size;\n    \n    // is this sentinel tag?\n    if (tag.kind == DW_TagKind_Null) {\n      break;\n    }\n    \n    // normal tag\n    DW_TagNode *tag_n = push_array(arena, DW_TagNode, 1);\n    tag_n->tag        = tag;\n    \n    SLLQueuePush_N(parent->first_child, parent->last_child, tag_n, sibling);\n    \n    // update tag count\n    *tag_count += 1;\n    \n    if (tag.has_children) {\n      dw_tag_tree_from_data(arena, info_data, abbrev_data, cu, tag_n, cursor, tag_count);\n    }\n  }\n}\n\ninternal DW_TagTree\ndw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu)\n{\n  String8    abbrev_data = input->sec[DW_Section_Abbrev].data;\n  String8    info_data   = str8_substr(input->sec[DW_Section_Info].data, cu->info_range);\n  DW_TagNode root        = {0};\n  U64        cursor      = cu->first_tag_info_off;\n  U64        tag_count   = 0;\n  dw_tag_tree_from_data(arena, info_data, abbrev_data, cu, &root, &cursor, &tag_count);\n  \n  DW_TagTree result = {0};\n  result.root       = root.first_child;\n  result.tag_count  = tag_count;\n  \n  return result;\n}\n\ninternal HashTable *\ndw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  struct Frame {\n    struct Frame *next;\n    DW_TagNode  *node;\n  };\n  \n  struct Frame *free_frames = 0;\n  struct Frame *stack       = push_array(scratch.arena, struct Frame, 1);\n  stack->node               = tag_tree.root;\n  \n  HashTable *ht = hash_table_init(arena, (U64)((F64)tag_tree.tag_count * 1.3));\n  \n  while (stack) {\n    while (stack->node) {\n      hash_table_push_u64_raw(arena, ht, stack->node->tag.info_off, stack->node);\n      \n      if (stack->node->first_child) {\n        struct Frame *frame = free_frames;\n        if (frame) {\n          SLLStackPop(free_frames);\n          MemoryZeroStruct(frame);\n        } else {\n          frame = push_array(scratch.arena, struct Frame, 1);\n        }\n        frame->node = stack->node->first_child;\n        SLLStackPush(stack, frame);\n      } else {\n        stack->node = stack->node->sibling;\n      }\n    }\n    \n    // recycle free frame\n    struct Frame *frame = stack;\n    SLLStackPop(stack);\n    SLLStackPush(free_frames, frame);\n    \n    if (stack) {\n      stack->node = stack->node->sibling;\n    }\n  }\n  \n  scratch_end(scratch);\n  return ht;\n}\n\ninternal DW_TagNode *\ndw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off)\n{\n  DW_TagNode *tag_node = hash_table_search_u64_raw(cu->tag_ht, info_off);\n  return tag_node;\n}\n\ninternal DW_LineVMFileArray\ndw_line_vm_file_array_from_list(Arena *arena, DW_LineVMFileList list)\n{\n  DW_LineVMFileArray result = {0};\n  result.count              = 0;\n  result.v                  = push_array(arena, DW_LineFile, list.node_count);\n  \n  for (DW_LineVMFileNode *src = list.first; src != 0; src = src->next) {\n    DW_LineFile *dst = &result.v[result.count++];\n    dst->file_name   = push_str8_copy(arena, src->file.file_name);\n    dst->dir_idx     = src->file.dir_idx;\n    dst->modify_time = src->file.modify_time;\n    dst->file_size   = src->file.file_size;\n  }\n  \n  return result;\n}\n\ninternal U64\ndw_read_line_file(String8       data,\n                  U64           off,\n                  DW_Input     *input,\n                  DW_Version    version,\n                  DW_Format     format,\n                  DW_Ext        ext,\n                  U64           address_size,\n                  DW_ListUnit  *str_offsets,\n                  U64           enc_count,\n                  U64          *enc_arr,\n                  DW_LineFile  *line_file_out)\n{\n  MemoryZeroStruct(line_file_out);\n  U64 cursor = off;\n  for (U64 enc_idx = 0; enc_idx < enc_count; ++enc_idx) {\n    DW_LNCT     lnct      = enc_arr[enc_idx*2 + 0];\n    DW_FormKind form_kind = enc_arr[enc_idx*2 + 1];\n    DW_Form     form      = {0};\n    U64         bytes_read = 0;\n    switch (lnct) {\n      case DW_LNCT_Path: {\n        bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n        line_file_out->file_name = dw_interp_string(input, format, str_offsets, form_kind, form);\n      } break;\n      case DW_LNCT_DirectoryIndex: {\n        bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n        line_file_out->dir_idx = dw_interp_const_u64(form_kind, form);\n      } break;\n      case DW_LNCT_TimeStamp: {\n        bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n        line_file_out->modify_time = dw_interp_const_u64(form_kind, form);\n      } break;\n      case DW_LNCT_Size: {\n        bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n        line_file_out->file_size = dw_interp_const_u64(form_kind, form);\n      } break;\n      case DW_LNCT_MD5: {\n        bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n        line_file_out->md5_digest = dw_interp_const_u128(form_kind, form);\n      } break;\n      case DW_LNCT_LLVM_Source: {\n        if (ext & DW_Ext_LLVM) {\n          bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n          line_file_out->source = dw_interp_string(input, format, str_offsets, form_kind, form);\n        } else {\n          Assert(!\"extension not supported\");\n        }\n      } break;\n      default: {\n        bytes_read = dw_read_form(data, cursor, version, format, address_size, form_kind, max_U64, &form);\n        Assert(!\"unexpected LNTC encoding\");\n      } break;\n    }\n    Assert(bytes_read);\n    cursor += bytes_read;\n  }\n  U64 bytes_read = cursor - off;\n  return bytes_read;\n}\n\ninternal U64\ndw_read_line_file_array(Arena              *arena,\n                        String8             data,\n                        U64                 off,\n                        DW_Input           *input,\n                        DW_Version          version,\n                        DW_Format           format,\n                        DW_Ext              ext,\n                        U64                 address_size,\n                        DW_ListUnit        *str_offsets,\n                        U64                 enc_count,\n                        U64                *enc_arr,\n                        U64                 table_count,\n                        DW_LineVMFileArray *table_out)\n{\n  Temp temp = temp_begin(arena);\n  \n  table_out->count = table_count;\n  table_out->v     = push_array(arena, DW_LineFile, table_count);\n  \n  U64 i, cursor;\n  for (i = 0, cursor = off; i < table_count; ++i) {\n    U64 bytes_read = dw_read_line_file(data,\n                                       cursor,\n                                       input,\n                                       version,\n                                       format,\n                                       ext,\n                                       address_size,\n                                       str_offsets,\n                                       enc_count,\n                                       enc_arr,\n                                       &table_out->v[i]);\n    if (bytes_read == 0) {\n      break;\n    }\n    cursor += bytes_read;\n  }\n  \n  U64 bytes_read = 0;\n  if (i == table_count) {\n    bytes_read = cursor - off;\n  } else {\n    temp_end(temp);\n    table_out->count = 0;\n    table_out->v     = 0;\n  }\n  \n  return bytes_read;\n}\n\ninternal U64\ndw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size,  DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64 bytes_read = 0;\n  \n  // read unit length\n  U64 unit_length      = 0;\n  U64 unit_length_size = str8_deserial_read_dwarf_packed_size(line_data, line_off, &unit_length);\n  \n  U64       unit_opl    = line_off + unit_length_size + unit_length;\n  Rng1U64   unit_range  = rng_1u64(line_off, unit_opl);\n  DW_Format format      = DW_FormatFromSize(unit_length);\n  U64       unit_cursor = unit_length_size;\n  String8   unit_data   = str8_substr(line_data, unit_range);\n  \n  // read unit version\n  DW_Version version = DW_Version_Null;\n  U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version);\n  if (version_size == 0) {\n    goto exit;\n  }\n  unit_cursor += version_size;\n  \n  // read DWARF5 address & segment selector\n  U8 address_size = 0;\n  U8 segsel_size  = 0;\n  if (version == DW_Version_5) {\n    U64 address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &address_size);\n    if (address_size_size == 0) {\n      goto exit;\n    }\n    unit_cursor += address_size_size;\n    \n    U64 segsel_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &segsel_size);\n    if (segsel_size_size == 0) {\n      goto exit;\n    }\n    unit_cursor += segsel_size_size;\n  } else {\n    address_size = cu_address_size;\n  }\n  \n  // read header length\n  U64 header_length = 0;\n  U64 header_length_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, format, &header_length);\n  if (header_length_size == 0) {\n    goto exit;\n  }\n  unit_cursor += header_length_size;\n  \n  // read min instruction length\n  U8  min_inst_len      = 0;\n  U64 min_inst_len_size = str8_deserial_read_struct(unit_data, unit_cursor, &min_inst_len);\n  if (min_inst_len_size == 0) {\n    goto exit;\n  }\n  unit_cursor += min_inst_len_size;\n  \n  // read max operands for instruction\n  U8 max_ops_for_inst = 1;\n  if (version > DW_Version_3) {\n    U64 max_ops_for_inst_size = str8_deserial_read_struct(unit_data, unit_cursor, &max_ops_for_inst);\n    if (max_ops_for_inst_size == 0) {\n      goto exit;\n    }\n    unit_cursor += max_ops_for_inst_size;\n  }\n  Assert(max_ops_for_inst > 0);\n  \n  U8  default_is_stmt      = 0;\n  U64 default_is_stmt_size = str8_deserial_read_struct(unit_data, unit_cursor, &default_is_stmt);\n  if (default_is_stmt_size == 0) {\n    goto exit;\n  }\n  unit_cursor += default_is_stmt_size;\n  \n  S8  line_base      = 0;\n  U64 line_base_size = str8_deserial_read_struct(unit_data, unit_cursor, &line_base);\n  if (line_base_size == 0) {\n    goto exit;\n  }\n  unit_cursor += line_base_size;\n  \n  U8  line_range      = 0;\n  U64 line_range_size = str8_deserial_read_struct(unit_data, unit_cursor, &line_range);\n  if (line_range_size == 0) {\n    goto exit;\n  }\n  unit_cursor += line_range_size;\n  \n  U8  opcode_base      = 0;\n  U64 opcode_base_size = str8_deserial_read_struct(unit_data, unit_cursor, &opcode_base);\n  if (opcode_base_size == 0) {\n    goto exit;\n  }\n  unit_cursor += opcode_base_size;\n  \n  U64 num_opcode_lens = opcode_base > 0 ? opcode_base - 1 : 0;\n  U8 *opcode_lens     = str8_deserial_get_raw_ptr(unit_data, unit_cursor, num_opcode_lens * sizeof(opcode_lens[0]));\n  if (opcode_lens == 0) {\n    goto exit;\n  }\n  unit_cursor += num_opcode_lens * sizeof(opcode_lens[0]);\n  \n  DW_LineVMFileArray dir_table  = {0};\n  DW_LineVMFileArray file_table = {0};\n  if (version < DW_Version_5) {\n    // read directory table\n    DW_LineVMFileList dir_list = {0};\n    {\n      // compile directory is always first in the table\n      DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1);\n      node->file.file_name    = cu_dir;\n      SLLQueuePush(dir_list.first, dir_list.last, node);\n      ++dir_list.node_count;\n    }\n    \n    // parse additional directories\n    for (; unit_cursor < unit_data.size; ) {\n      String8 dir = {0};\n      unit_cursor += str8_deserial_read_cstr(unit_data, unit_cursor, &dir);\n      if (dir.size == 0) {\n        break;\n      }\n      \n      DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1);\n      node->file.file_name    = dir;\n      SLLQueuePush(dir_list.first, dir_list.last, node);\n      ++dir_list.node_count;\n    }\n    \n    DW_LineVMFileList file_list = {0};\n    {\n      // compile unit name is always first in the file table\n      {\n        DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1);\n        node->file.file_name    = cu_name;\n        SLLQueuePush(file_list.first, file_list.last, node);\n        ++file_list.node_count;\n      }\n      \n      // read file table\n      for (; unit_cursor < unit_data.size; ) {\n        String8 file_name = {0};\n        unit_cursor += str8_deserial_read_cstr(unit_data, unit_cursor, &file_name);\n        if (file_name.size == 0) {\n          break;\n        }\n        \n        U64 dir_index      = 0;\n        U64 dir_index_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index);\n        if (dir_index_size == 0) {\n          goto exit;\n        }\n        unit_cursor += dir_index_size;\n        \n        U64 modify_time      = 0;\n        U64 modify_time_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time);\n        if (modify_time_size == 0) {\n          goto exit;\n        }\n        unit_cursor += modify_time_size;\n        \n        U64 file_size      = 0;\n        U64 file_size_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size);\n        if (file_size_size == 0) {\n          goto exit;\n        }\n        unit_cursor += file_size_size;\n        \n        DW_LineVMFileNode *node = push_array(scratch.arena, DW_LineVMFileNode, 1);\n        node->file.file_name    = file_name;\n        node->file.dir_idx      = dir_index;\n        node->file.modify_time  = modify_time;\n        node->file.file_size    = file_size;\n        \n        SLLQueuePush(file_list.first, file_list.last, node);\n        ++file_list.node_count;\n      }\n    }\n    \n    // list -> array\n    dir_table  = dw_line_vm_file_array_from_list(arena, dir_list);\n    file_table = dw_line_vm_file_array_from_list(arena, file_list);\n  }\n  // DWARF5\n  else {\n    // directory table\n    {\n      // read table entry encoding count\n      U8  enc_count      = 0;\n      U64 enc_count_size = str8_deserial_read_struct(unit_data, unit_cursor, &enc_count);\n      if (enc_count_size == 0) {\n        goto exit;\n      }\n      unit_cursor += enc_count_size;\n      \n      // read table entry encodings\n      U64 *enc_arr      = 0;\n      U64  enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr);\n      if (enc_arr_size == 0) {\n        goto exit;\n      }\n      unit_cursor += enc_arr_size;\n      \n      // read table count\n      U64 table_count      = 0;\n      U64 table_count_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count);\n      if (table_count_size == 0) {\n        goto exit;\n      }\n      unit_cursor += table_count_size;\n      \n      // read table\n      U64 table_size = dw_read_line_file_array(arena,\n                                               unit_data,\n                                               unit_cursor,\n                                               input,\n                                               version,\n                                               format,\n                                               DW_Ext_All,\n                                               address_size,\n                                               cu_str_offsets,\n                                               enc_count,\n                                               enc_arr,\n                                               table_count,\n                                               &dir_table);\n      if (table_size == 0) {\n        goto exit;\n      }\n      unit_cursor += table_size;\n    }\n    \n    // file table\n    {\n      // read table entry encoding count\n      U8  enc_count      = 0;\n      U64 enc_count_size = str8_deserial_read_struct(unit_data, unit_cursor, &enc_count);\n      if (enc_count == 0) {\n        goto exit;\n      }\n      unit_cursor += enc_count_size;\n      \n      // read table entry encodings\n      U64 *enc_arr = 0;\n      U64  enc_arr_size = str8_deserial_read_uleb128_array(scratch.arena, unit_data, unit_cursor, enc_count*2, &enc_arr);\n      if (enc_arr_size == 0) {\n        goto exit;\n      }\n      unit_cursor += enc_arr_size;\n      \n      // read table count\n      U64 table_count      = 0;\n      U64 table_count_size = str8_deserial_read_uleb128(unit_data, unit_cursor, &table_count);\n      if (table_count_size == 0) {\n        goto exit;\n      }\n      unit_cursor += table_count_size;\n      \n      // read table\n      U64 file_table_size = dw_read_line_file_array(arena,\n                                                    unit_data,\n                                                    unit_cursor,\n                                                    input,\n                                                    version,\n                                                    format,\n                                                    DW_Ext_All,\n                                                    address_size,\n                                                    cu_str_offsets,\n                                                    enc_count,\n                                                    enc_arr,\n                                                    table_count,\n                                                    &file_table);\n      if (file_table_size == 0) {\n        goto exit;\n      }\n      unit_cursor += file_table_size;\n    }\n  }\n  \n  if (header_out) {\n    header_out->unit_range            = unit_range;\n    header_out->version               = version;\n    header_out->address_size          = address_size;\n    header_out->segment_selector_size = segsel_size;\n    header_out->header_length         = header_length;\n    header_out->min_inst_len          = min_inst_len;\n    header_out->max_ops_for_inst      = max_ops_for_inst;\n    header_out->default_is_stmt       = default_is_stmt;\n    header_out->line_base             = line_base;\n    header_out->line_range            = line_range;\n    header_out->opcode_base           = opcode_base;\n    header_out->num_opcode_lens       = num_opcode_lens;\n    header_out->opcode_lens           = opcode_lens;\n    header_out->dir_table             = dir_table;\n    header_out->file_table            = file_table;\n  }\n  \n  bytes_read = unit_cursor;\n  \n  exit:;\n  scratch_end(scratch);\n  return bytes_read;\n}\n\ninternal void\ndw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt)\n{\n  state->address         = 0;\n  state->op_index        = 0;\n  state->file_index      = 1;\n  state->line            = 1;\n  state->column          = 0;\n  state->is_stmt         = default_is_stmt;\n  state->basic_block     = 0;\n  state->prologue_end    = 0;\n  state->epilogue_begin  = 0;\n  state->isa             = 0;\n  state->discriminator   = 0;\n}\n\ninternal void\ndw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst)\n{\n  U64 op_index = state->op_index + advance;\n  state->address += min_inst_len*(op_index/max_ops_for_inst);\n  state->op_index = op_index % max_ops_for_inst;\n}\n\ninternal DW_LineSeqNode *\ndw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl)\n{\n  DW_LineSeqNode *new_seq = push_array(arena, DW_LineSeqNode, 1);\n  SLLQueuePush(parsed_tbl->first_seq, parsed_tbl->last_seq, new_seq);\n  parsed_tbl->seq_count += 1;\n  return new_seq;\n}\n\ninternal DW_LineNode *\ndw_push_line(Arena *arena, DW_LineTableParseResult *tbl, DW_LineVMState *vm_state, B32 start_of_sequence)\n{\n  DW_LineSeqNode *seq = tbl->last_seq;\n  if(seq == 0 || start_of_sequence)\n  {\n    seq = dw_push_line_seq(arena, tbl);\n  }\n  \n  DW_LineNode *n  = push_array(arena, DW_LineNode, 1);\n  n->v.file_index = vm_state->file_index;\n  n->v.line       = vm_state->line;\n  n->v.column     = vm_state->column;\n  n->v.address    = vm_state->address;\n  \n  SLLQueuePush(seq->first, seq->last, n);\n  seq->count += 1;\n  return n;\n}\n\ninternal String8\ndw_path_from_file(Arena *arena, DW_LineVMHeader *vm, DW_LineFile *file)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8      dir   = vm->dir_table.v[file->dir_idx].file_name;\n  PathStyle    style = path_style_from_str8(dir);\n  if (style == PathStyle_Null || style == PathStyle_Relative) {\n    style = path_style_from_str8(file->file_name);\n  }\n  \n  String8List path_list = {0};\n  \n  if (str8_match_lit(\"..\", dir, StringMatchFlag_RightSideSloppy)) {\n    String8List comp_dir_list = str8_split_path(scratch.arena, vm->dir_table.v[0].file_name);\n    str8_list_concat_in_place(&path_list, &comp_dir_list);\n  }\n  \n  String8List dir_list = str8_split_path(scratch.arena, dir);\n  str8_list_concat_in_place(&path_list, &dir_list);\n  \n  str8_list_push(scratch.arena, &path_list, file->file_name);\n  \n  str8_path_list_resolve_dots_in_place(&path_list, style);\n  \n  String8 path = str8_path_list_join_by_style(arena, &path_list, style);\n  \n  scratch_end(scratch);\n  return path;\n}\n\ninternal String8\ndw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx)\n{\n  return dw_path_from_file(arena, vm, &vm->file_table.v[file_idx]);\n}\n\ninternal DW_LineTableParseResult\ndw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets)\n{\n  DW_LineVMHeader vm_header = {0};\n  U64 vm_header_size = dw_read_line_vm_header(arena, unit_data, 0, input, cu_dir, cu_name, cu_address_size, cu_str_offsets, &vm_header);\n  U64 unit_cursor = vm_header_size;\n  U64 unit_cursor_opl = Min(unit_data.size, vm_header.unit_range.max);\n  \n  //- rjf: prep state for VM\n  DW_LineVMState vm_state = {0};\n  dw_line_vm_reset(&vm_state, vm_header.default_is_stmt);\n  \n  //- rjf: VM loop; build output list\n  DW_LineTableParseResult result = {.vm_header = vm_header};\n  B32 end_of_seq = 0;\n  B32 error      = 0;\n  for(;!error && unit_cursor < unit_cursor_opl;)\n  {\n    //- rjf: parse opcode\n    U8 opcode = 0;\n    unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &opcode);\n    \n    //- rjf: do opcode action\n    switch(opcode)\n    {\n      //- rjf: special opcode cases\n      default:\n      {\n        if(opcode >= vm_header.opcode_base)\n        {\n          U32 adjusted_opcode = (U32)(opcode - vm_header.opcode_base);\n          U32 op_advance      = adjusted_opcode / vm_header.line_range;\n          S32 line_inc        = (S32)vm_header.line_base + ((S32)adjusted_opcode) % (S32)vm_header.line_range;\n          // TODO: can we just call dw_advance_line_vm_state_pc\n          U64 addr_inc        = vm_header.min_inst_len * ((vm_state.op_index+op_advance) / vm_header.max_ops_for_inst);\n          \n          vm_state.address        += addr_inc;\n          vm_state.op_index        = (vm_state.op_index + op_advance) % vm_header.max_ops_for_inst;\n          vm_state.line            = (U32)((S32)vm_state.line + line_inc);\n          vm_state.basic_block     = 0;\n          vm_state.prologue_end    = 0;\n          vm_state.epilogue_begin  = 0;\n          vm_state.discriminator   = 0;\n          \n          if(vm_state.is_stmt)\n          {\n            dw_push_line(arena, &result, &vm_state, end_of_seq);\n          }\n          end_of_seq = 0;\n          \n#if 0\n          // NOTE(rjf): DWARF has dummy lines at the end of groups of line ranges, where we'd like\n          // to break line info into sequences.\n          if(vm_state.line == 0)\n          {\n            end_of_seq = 1;\n          }\n#endif\n        }\n        \n        // Skipping unknown opcode. This is a valid case and\n        // it works because compiler stores operand lengths.\n        else\n        {\n          if(0 < opcode && opcode <= vm_header.num_opcode_lens)\n          {\n            U8 num_operands = vm_header.opcode_lens[opcode - 1];\n            for(U8 i = 0; i < num_operands; i += 1)\n            {\n              U64 operand = 0;\n              unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &operand);\n            }\n          }\n          else\n          {\n            error = 1;\n            goto exit;\n          }\n        }\n      }break;\n      \n      //- standard opcodes\n      case DW_StdOpcode_Copy:\n      {\n        if(vm_state.is_stmt)\n        {\n          dw_push_line(arena, &result, &vm_state, end_of_seq);\n        }\n        end_of_seq = 0;\n        vm_state.discriminator   = 0;\n        vm_state.basic_block     = 0;\n        vm_state.prologue_end    = 0;\n        vm_state.epilogue_begin  = 0;\n      }break;\n      case DW_StdOpcode_AdvancePc:\n      {\n        U64 advance = 0;\n        unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &advance);\n        dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst);\n      }break;\n      case DW_StdOpcode_AdvanceLine:\n      {\n        S64 s = 0;\n        unit_cursor += str8_deserial_read_sleb128(unit_data, unit_cursor, &s);\n        vm_state.line += s;\n      }break;\n      case DW_StdOpcode_SetFile:\n      {\n        U64 file_index = 0;\n        unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &file_index);\n        vm_state.file_index = file_index;\n      }break;\n      case DW_StdOpcode_SetColumn:\n      {\n        U64 column = 0;\n        unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &column);\n        vm_state.column = column;\n      }break;\n      case DW_StdOpcode_NegateStmt:\n      {\n        vm_state.is_stmt = !vm_state.is_stmt;\n      }break;\n      case DW_StdOpcode_SetBasicBlock:\n      {\n        vm_state.basic_block = 1;\n      }break;\n      case DW_StdOpcode_ConstAddPc:\n      {\n        U64 advance = (0xffu - vm_header.opcode_base) / vm_header.line_range;\n        dw_line_vm_advance(&vm_state, advance, vm_header.min_inst_len, vm_header.max_ops_for_inst);\n      }break;\n      case DW_StdOpcode_FixedAdvancePc:\n      {\n        U16 operand = 0;\n        unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &operand);\n        vm_state.address += operand;\n        vm_state.op_index = 0;\n      }break;\n      case DW_StdOpcode_SetPrologueEnd:\n      {\n        vm_state.prologue_end = 1;\n      }break;\n      case DW_StdOpcode_SetEpilogueBegin:\n      {\n        vm_state.epilogue_begin = 1;\n      }break;\n      case DW_StdOpcode_SetIsa:\n      {\n        U64 v = 0;\n        unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v);\n        vm_state.isa = v;\n      }break;\n      \n      //- extended opcodes\n      case DW_StdOpcode_ExtendedOpcode:\n      {\n        U64 length = 0;\n        unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &length);\n        \n        U64 extended_opl    = unit_cursor + length;\n        U8  extended_opcode = 0;\n        unit_cursor += str8_deserial_read_struct(unit_data, unit_cursor, &extended_opcode);\n        \n        switch(extended_opcode)\n        {\n          default:{}break;\n          \n          case DW_ExtOpcode_EndSequence:\n          {\n            vm_state.end_sequence = 1;\n            if(vm_state.is_stmt)\n            {\n              dw_push_line(arena, &result, &vm_state, 0);\n            }\n            dw_line_vm_reset(&vm_state, vm_header.default_is_stmt);\n            end_of_seq = 1;\n          }break;\n          \n          case DW_ExtOpcode_SetAddress:\n          {\n            U64 address = 0;\n            unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, vm_header.address_size, vm_header.address_size);\n            vm_state.address    = address;\n            vm_state.op_index   = 0;\n          }break;\n          \n          case DW_ExtOpcode_DefineFile:\n          {\n            String8 file_name   = {0};\n            U64     dir_index   = 0;\n            U64     modify_time = 0;\n            U64     file_size   = 0;\n            \n            unit_cursor += str8_deserial_read_cstr(unit_data, unit_cursor, &file_name);\n            unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &dir_index);\n            unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &modify_time);\n            unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &file_size);\n            \n            // TODO(rjf): Not fully implemented. By the DWARF V4 spec, the above is\n            // all that needs to be parsed, but the rest of the work that needs to\n            // happen here---allowing this file to be used by further opcodes---is\n            // not implemented.\n            //\n            // See the DWARF V4 spec (June 10, 2010), page 122.\n            error = 1;\n          }break;\n          \n          case DW_ExtOpcode_SetDiscriminator:\n          {\n            U64 v = 0;\n            unit_cursor += str8_deserial_read_uleb128(unit_data, unit_cursor, &v);\n            vm_state.discriminator = v;\n          }break;\n        }\n        \n        unit_cursor = extended_opl;\n      }break;\n    }\n  }\n  exit:;\n  return result;\n}\n\ninternal DW_PubStringsTable\ndw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  DW_PubStringsTable names_table = {0};\n  names_table.size               = 16384;\n  names_table.buckets            = push_array(arena, DW_PubStringsBucket*, names_table.size);\n  \n  String8 section_data = input->sec[section_kind].data;\n  for(U64 cursor = 0; cursor < section_data.size; ) {\n    \n    U64 unit_length      = 0;\n    U64 unit_length_size = str8_deserial_read_dwarf_packed_size(section_data, cursor, &unit_length);\n    if (unit_length_size == 0) {\n      break;\n    }\n    cursor += unit_length_size;\n    \n    U64 cursor_opl = Min(cursor + unit_length, section_data.size);\n    if (cursor >= cursor_opl) {\n      break;\n    }\n    \n    DW_Version unit_version = 0;\n    cursor += str8_deserial_read_struct(section_data, cursor, &unit_version);\n    if (cursor >= cursor_opl) {\n      break;\n    }\n    \n    DW_Format format = DW_FormatFromSize(unit_length);\n    \n    U64 debug_info_off = 0;\n    cursor += str8_deserial_read_dwarf_uint(section_data, cursor, format, &debug_info_off);\n    if (cursor >= cursor_opl) {\n      break;\n    }\n    \n    U64 debug_info_length = 0;\n    cursor += str8_deserial_read_dwarf_packed_size(section_data, cursor, &debug_info_length);\n    if (cursor >= cursor_opl) {\n      break;\n    }\n    \n    U64 off_size = dw_size_from_format(format);\n    for (; (cursor + off_size) <= cursor_opl;) {\n      U64 info_off      = 0;\n      U64 info_off_size = str8_deserial_read_dwarf_uint(section_data, cursor, format, &info_off);\n      cursor += info_off_size;\n      \n      if (info_off_size == 0 || info_off == 0) {\n        break;\n      }\n      \n      String8 string = {0};\n      cursor += str8_deserial_read_cstr(section_data, cursor, &string);\n      \n      U64 hash = u64_hash_from_str8(string);\n      U64 bucket_idx = hash % names_table.size;\n      \n      DW_PubStringsBucket *bucket = push_array(arena, DW_PubStringsBucket, 1);\n      bucket->next                = names_table.buckets[bucket_idx];\n      bucket->string              = string;\n      bucket->info_off            = info_off;\n      bucket->cu_info_off         = debug_info_off;\n      names_table.buckets[bucket_idx] = bucket;\n    }\n  }\n  \n  scratch_end(scratch);\n  return names_table;\n}\n\ninternal DW_Expr\ndw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data)\n{\n  DW_Expr expr = {0};\n  for (U64 cursor = 0; cursor < data.size; ) {\n    U64 inst_start = cursor;\n    \n    DW_ExprOp opcode = 0;\n    cursor += str8_deserial_read_struct(data, cursor, &opcode);\n    \n    DW_ExprOperand operands[4] = {0};\n    switch (opcode) {\n      case DW_ExprOp_Lit0:  case DW_ExprOp_Lit1:  case DW_ExprOp_Lit2:\n      case DW_ExprOp_Lit3:  case DW_ExprOp_Lit4:  case DW_ExprOp_Lit5:\n      case DW_ExprOp_Lit6:  case DW_ExprOp_Lit7:  case DW_ExprOp_Lit8:\n      case DW_ExprOp_Lit9:  case DW_ExprOp_Lit10: case DW_ExprOp_Lit11:\n      case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14:\n      case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17:\n      case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20:\n      case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23:\n      case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26:\n      case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29:\n      case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: {\n        // implicit operands\n      } break;\n      case DW_ExprOp_Const1U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8);   } break;\n      case DW_ExprOp_Const2U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16);  } break;\n      case DW_ExprOp_Const4U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32);  } break;\n      case DW_ExprOp_Const8U: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].u64);  } break;\n      case DW_ExprOp_Const1S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s8);   } break;\n      case DW_ExprOp_Const2S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16);  } break;\n      case DW_ExprOp_Const4S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s32);  } break;\n      case DW_ExprOp_Const8S: { cursor += str8_deserial_read_struct(data, cursor, &operands[0].s64);  } break;\n      case DW_ExprOp_ConstU:  { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break;\n      case DW_ExprOp_ConstS:  { cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64); } break;\n      case DW_ExprOp_Addr:    { cursor += str8_deserial_read(data, cursor, &operands[0].u64, addr_size, addr_size); } break;\n      case DW_ExprOp_Reg0:  case DW_ExprOp_Reg1:  case DW_ExprOp_Reg2:\n      case DW_ExprOp_Reg3:  case DW_ExprOp_Reg4:  case DW_ExprOp_Reg5:\n      case DW_ExprOp_Reg6:  case DW_ExprOp_Reg7:  case DW_ExprOp_Reg8:\n      case DW_ExprOp_Reg9:  case DW_ExprOp_Reg10: case DW_ExprOp_Reg11:\n      case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14:\n      case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17:\n      case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20:\n      case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23:\n      case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26:\n      case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29:\n      case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: {\n        // implicit operands\n      } break;\n      case DW_ExprOp_RegX: { cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64); } break;\n      case DW_ExprOp_ImplicitValue: {\n        U64 value_size = 0; String8 value = {0};\n        cursor += str8_deserial_read_uleb128(data, cursor, &value_size);\n        cursor += str8_deserial_read_block(data, cursor, value_size, &operands[0].block);\n      } break;\n      case DW_ExprOp_Piece: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      case DW_ExprOp_BitPiece: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64);\n      } break;\n      case DW_ExprOp_Pick: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8);\n      } break;\n      case DW_ExprOp_PlusUConst: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      case DW_ExprOp_Skip: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16);\n      } break;\n      case DW_ExprOp_Bra: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].s16);\n      } break;\n      case DW_ExprOp_BReg0:  case DW_ExprOp_BReg1:  case DW_ExprOp_BReg2: \n      case DW_ExprOp_BReg3:  case DW_ExprOp_BReg4:  case DW_ExprOp_BReg5: \n      case DW_ExprOp_BReg6:  case DW_ExprOp_BReg7:  case DW_ExprOp_BReg8:  \n      case DW_ExprOp_BReg9:  case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: \n      case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: \n      case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: \n      case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: \n      case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: \n      case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: \n      case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: \n      case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: {\n        cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64);\n      } break;\n      case DW_ExprOp_BRegX: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n        cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64);\n      } break;\n      case DW_ExprOp_FBReg: {\n        cursor += str8_deserial_read_sleb128(data, cursor, &operands[0].s64);\n      } break;\n      case DW_ExprOp_Deref: {\n        // no operands\n      } break;\n      case DW_ExprOp_DerefSize: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8);\n      } break;\n      case DW_ExprOp_XDerefSize: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8);\n      } break;\n      case DW_ExprOp_Call2: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u16);\n      } break;\n      case DW_ExprOp_Call4: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32);\n      } break;\n      case DW_ExprOp_CallRef: {\n        cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64);\n      } break;\n      case DW_ExprOp_ImplicitPointer:\n      case DW_ExprOp_GNU_ImplicitPointer: {\n        cursor += str8_deserial_read_dwarf_uint(data, cursor, format, &operands[0].u64);\n        cursor += str8_deserial_read_sleb128(data, cursor, &operands[1].s64);\n      } break;\n      case DW_ExprOp_Convert:\n      case DW_ExprOp_GNU_Convert: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      case DW_ExprOp_GNU_ParameterRef: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u32);\n      } break;\n      case DW_ExprOp_DerefType:\n      case DW_ExprOp_GNU_DerefType: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8);\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64);\n      } break;\n      case DW_ExprOp_XDerefType: {\n        cursor += str8_deserial_read_struct(data, cursor, &operands[0].u8);\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64);\n      } break;\n      case DW_ExprOp_ConstType: \n      case DW_ExprOp_GNU_ConstType: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n        cursor += str8_deserial_read_struct(data, cursor, &operands[1].u8);\n        cursor += str8_deserial_read_block(data, cursor, operands[1].u8, &operands[2].block);\n      } break;\n      case DW_ExprOp_RegvalType: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[1].u64);\n      } break;\n      case DW_ExprOp_EntryValue:\n      case DW_ExprOp_GNU_EntryValue: {\n        U64 entry_value_expr_size = 0;\n        cursor += str8_deserial_read_uleb128(data, cursor, &entry_value_expr_size);\n        cursor += str8_deserial_read_block(data, cursor, entry_value_expr_size, &operands[0].block);\n      } break;\n      case DW_ExprOp_Addrx: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      case DW_ExprOp_Constx: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      case DW_ExprOp_CallFrameCfa:\n      case DW_ExprOp_FormTlsAddress:\n      case DW_ExprOp_PushObjectAddress:\n      case DW_ExprOp_Nop:\n      case DW_ExprOp_Eq:\n      case DW_ExprOp_Ge:\n      case DW_ExprOp_Gt:\n      case DW_ExprOp_Le:\n      case DW_ExprOp_Lt:\n      case DW_ExprOp_Ne:\n      case DW_ExprOp_Shl:\n      case DW_ExprOp_Shr:\n      case DW_ExprOp_Shra:\n      case DW_ExprOp_Xor:\n      case DW_ExprOp_XDeref:\n      case DW_ExprOp_Abs:\n      case DW_ExprOp_And:\n      case DW_ExprOp_Div:\n      case DW_ExprOp_Minus:\n      case DW_ExprOp_Mod:\n      case DW_ExprOp_Mul:\n      case DW_ExprOp_Neg:\n      case DW_ExprOp_Not:\n      case DW_ExprOp_Or:\n      case DW_ExprOp_Plus:\n      case DW_ExprOp_Rot:\n      case DW_ExprOp_Swap:\n      case DW_ExprOp_Dup:\n      case DW_ExprOp_Drop:\n      case DW_ExprOp_Over:\n      case DW_ExprOp_StackValue:\n      case DW_ExprOp_GNU_PushTlsAddress: {\n        // no operands\n      } break;\n      case DW_ExprOp_GNU_AddrIndex: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      case DW_ExprOp_GNU_ConstIndex: {\n        cursor += str8_deserial_read_uleb128(data, cursor, &operands[0].u64);\n      } break;\n      default: { InvalidPath; } break;\n    }\n    \n    U64 operand_count = dw_operand_count_from_expr_op(opcode);\n    DW_ExprInst *inst = push_array(arena, DW_ExprInst, 1);\n    inst->opcode   = opcode;\n    inst->size     = cursor - inst_start;\n    inst->operands = push_array(arena, DW_ExprOperand, operand_count);\n    MemoryCopy(inst->operands, operands, operand_count * sizeof(DW_ExprOperand));\n    \n    DLLPushBack(expr.first, expr.last, inst);\n    expr.count += 1;\n  }\n  return expr;\n}\n\ninternal void\ndw_cfa_inst_list_push_node(DW_CFA_InstList *list, DW_CFA_InstNode *n)\n{\n  SLLQueuePush(list->first, list->last, n);\n  list->count += 1;\n}\n\ninternal DW_CFA_InstNode *\ndw_cfa_inst_list_push(Arena *arena, DW_CFA_InstList *list, DW_CFA_Inst v)\n{\n  DW_CFA_InstNode *n = push_array(arena, DW_CFA_InstNode, 1);\n  n->v = v;\n  dw_cfa_inst_list_push_node(list, n);\n  return n;\n}\n\ninternal U64\ndw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out)\n{\n  U64 read_size = 0;\n  if (cie->segment_selector_size) {\n    NotImplemented;\n  } else {\n    read_size = str8_deserial_read(data, 0, ptr_out, cie->address_size, cie->address_size);\n  }\n  return read_size;\n}\n\ninternal U64\ndw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out)\n{\n  U32 first_four_bytes = 0;\n  str8_deserial_read_struct(data, off, &first_four_bytes);\n  DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit;\n  \n  U64 length      = 0;\n  U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length);\n  if (length_size == 0) { goto exit; }\n  \n  Rng1U64 entry_range = rng_1u64(off, off + length_size + length);\n  String8 entry_data  = str8_substr(data, entry_range);\n  U64 id = 0;\n  U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id);\n  if (id_size == 0) { goto exit; }\n  \n  U64 id_type = format == DW_Format_32Bit ? max_U32 : max_U64;\n  desc_out->format          = format;\n  desc_out->type            = (id == id_type) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE;\n  desc_out->entry_range     = entry_range;\n  desc_out->cie_pointer     = id;\n  desc_out->cie_pointer_off = length_size;\n  \n  exit:;\n  return length + length_size;\n}\n\ninternal B32\ndw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out)\n{\n  B32 is_parsed = 0;\n  U64 cursor    = format == DW_Format_32Bit ? 4 : 12;\n  \n  U64 cie_id      = 0;\n  U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id);\n  if (cie_id_size == 0) { goto exit; }\n  cursor += cie_id_size;\n  \n  U8  version      = 0;\n  U64 version_size = str8_deserial_read_struct(data, cursor, &version);\n  if (version_size == 0) { goto exit; }\n  cursor += version_size;\n  \n  String8 aug_string      = {0};\n  U64     aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string);\n  if (aug_string_size == 0) { goto exit; }\n  cursor += aug_string_size;\n  \n  U8 address_size          = 0;\n  U8 segment_selector_size = 0;\n  if (version >= DW_Version_4) {\n    U64 address_size_size = str8_deserial_read_struct(data, cursor, &address_size);\n    if (address_size_size == 0) { goto exit; }\n    cursor += address_size_size;\n    \n    U64 segment_selector_size_size = str8_deserial_read_struct(data, cursor, &segment_selector_size);\n    if (segment_selector_size_size == 0) { goto exit; }\n    cursor += segment_selector_size;\n  } else {\n    address_size = byte_size_from_arch(arch);\n  }\n  \n  U64 code_align_factor = 0;\n  U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor);\n  if (code_align_factor_size == 0) { goto exit; }\n  cursor += code_align_factor_size;\n  \n  S64 data_align_factor = 0;\n  U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor);\n  if (data_align_factor_size == 0) { goto exit; }\n  cursor += data_align_factor_size;\n  \n  U64 ret_addr_reg = 0;\n  U64 ret_addr_reg_size = 0;\n  if (version == DW_Version_1) { ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8)); }\n  else                         { ret_addr_reg_size = str8_deserial_read_uleb128(data, cursor, &ret_addr_reg);                 }\n  if (ret_addr_reg_size == 0) { goto exit; }\n  cursor += ret_addr_reg_size;\n  \n  if (aug_string.size > 0) { goto exit; }\n  \n  cie_out->insts                 = str8_skip(data, cursor);\n  cie_out->aug_string            = aug_string;\n  cie_out->code_align_factor     = code_align_factor;\n  cie_out->data_align_factor     = data_align_factor;\n  cie_out->ret_addr_reg          = ret_addr_reg;\n  cie_out->format                = format;\n  cie_out->version               = version;\n  cie_out->address_size          = address_size;\n  cie_out->segment_selector_size = segment_selector_size;\n  \n  is_parsed = 1;\n  exit:;\n  return is_parsed;\n}\n\ninternal B32\ndw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out)\n{\n  B32 is_parsed = 0;\n  U64 cursor    = format == DW_Format_32Bit ? 4 : 12;\n  \n  // extract CIE pointer\n  U64 cie_pointer      = 0;\n  U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_pointer);\n  if (cie_pointer_size == 0) { goto exit; }\n  cursor += cie_pointer_size;\n  \n  // extract address of first instruction\n  U64 pc_begin = 0;\n  U64 pc_begin_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_begin);\n  if (pc_begin_size == 0) { goto exit; }\n  cursor += pc_begin_size;\n  \n  // extract instruction range size\n  U64 pc_range      = 0;\n  U64 pc_range_size = dw_read_debug_frame_ptr(str8_skip(data, cursor), cie, &pc_range);\n  if (pc_range_size == 0) { goto exit; }\n  cursor += pc_range_size;\n  \n  // parse augmentation data\n  String8 aug_data = str8_substr(data, rng_1u64(cursor, cursor + cie->aug_data.size));\n  cursor += cie->aug_data.size;\n  \n  // commit values to out\n  fde_out->format      = format;\n  fde_out->cie_pointer = cie_pointer;\n  fde_out->pc_range    = rng_1u64(pc_begin, pc_begin + pc_range);\n  fde_out->insts       = str8_skip(data, cursor);\n  \n  is_parsed = 1;\n  exit:;\n  return is_parsed;\n}\n\ninternal B32\ndw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out)\n{\n  B32 is_parsed = 0;\n  DW_DescriptorEntry fde_desc = {0};\n  dw_parse_descriptor_entry_header(data, fde_offset, &fde_desc);\n  if (fde_desc.type == DW_DescriptorEntryType_FDE) {\n    U64 cie_pointer_off  = fde_desc.format == DW_Format_32Bit ? 4 : 12;\n    U64 cie_pointer      = 0;\n    U64 cie_pointer_size = str8_deserial_read_dwarf_uint(data, fde_offset + cie_pointer_off, fde_desc.format, &cie_pointer);\n    if (cie_pointer_size) {\n      DW_DescriptorEntry cie_desc = {0};\n      dw_parse_descriptor_entry_header(data, cie_pointer, &cie_desc);\n      if (cie_desc.type == DW_DescriptorEntryType_CIE) {\n        if (dw_parse_cie(str8_substr(data, cie_desc.entry_range), cie_desc.format, arch, cie_out)) {\n          if (dw_parse_fde(str8_substr(data, fde_desc.entry_range), fde_desc.format, cie_out, fde_out)) {\n            is_parsed = 1;\n          }\n        }\n      }\n    }\n  }\n  \n  return is_parsed;\n}\n\ninternal DW_CFA_ParseErrorCode\ndw_parse_cfa_inst(String8        data,\n                  U64           code_align_factor,\n                  S64           data_align_factor,\n                  DW_DecodePtr *decode_ptr_func,\n                  void         *decode_ptr_ud,\n                  U64          *bytes_read_out,\n                  DW_CFA_Inst   *inst_out)\n{\n  *bytes_read_out = 0;\n  \n  DW_CFA_ParseErrorCode error_code = DW_CFA_ParseErrorCode_End;\n  U64                   cursor     = 0;\n  \n  // read opcode\n  DW_CFA_Opcode raw_opcode      = 0;\n  U64           raw_opcode_size = str8_deserial_read_struct(data, cursor, &raw_opcode);\n  if (raw_opcode_size == 0) { goto exit; }\n  cursor += raw_opcode_size;\n  \n  // decode opcode implicit operand\n  U64 opcode           = raw_opcode & ~DW_CFA_Mask_OpcodeHi;\n  U64 implicit_operand = 0;\n  if ((raw_opcode & DW_CFA_Mask_OpcodeHi) != 0) {\n    opcode           = raw_opcode & DW_CFA_Mask_OpcodeHi;\n    implicit_operand = raw_opcode & DW_CFA_Mask_Operand;\n  }\n  \n  // decode operands\n  DW_CFA_Operand operands[DW_CFA_OperandMax] = {0};\n  switch (opcode) {\n    case DW_CFA_SetLoc: {\n      U64 address_size = decode_ptr_func(str8_skip(data, cursor), decode_ptr_ud, &operands[0].u64);\n      if (address_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += address_size;\n    } break;\n    case DW_CFA_AdvanceLoc: {\n      operands[0].u64 = implicit_operand * code_align_factor;\n    } break;\n    case DW_CFA_AdvanceLoc1: {\n      U8 delta = 0;\n      U64 delta_size = str8_deserial_read_struct(data, cursor, &delta);\n      if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += delta_size;\n      operands[0].u64 = delta * code_align_factor;\n    } break;\n    case DW_CFA_AdvanceLoc2: {\n      U16 delta = 0;\n      U64 delta_size = str8_deserial_read_struct(data, cursor, &delta);\n      if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += delta_size;\n      operands[0].u64 = delta * code_align_factor;\n    } break;\n    case DW_CFA_AdvanceLoc4: {\n      U32 delta = 0;\n      U64 delta_size = str8_deserial_read_struct(data, cursor, &delta);\n      if (delta_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      operands[0].u64 = delta * code_align_factor;\n    } break;\n    case DW_CFA_DefCfa: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      U64 offset = 0;\n      U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = reg;\n      operands[1].u64 = offset;\n    } break;\n    case DW_CFA_DefCfaSf: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      S64 offset = 0;\n      U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = reg;\n      operands[1].s64 = offset * data_align_factor;\n    } break;\n    case DW_CFA_DefCfaRegister: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      operands[0].u64 = reg;\n    } break;\n    case DW_CFA_DefCfaOffset: {\n      U64 offset = 0;\n      U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = offset;\n    } break;\n    case DW_CFA_DefCfaOffsetSf: {\n      U64 offset = 0;\n      U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = offset * data_align_factor;\n    } break;\n    case DW_CFA_DefCfaExpr: {\n      U64 expr_size = 0;\n      U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size);\n      if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += expr_size_size;\n      \n      if (cursor + expr_size > data.size) { goto exit; }\n      String8 expr = str8_prefix(str8_skip(data, cursor), expr_size);\n      \n      operands[0].block = expr;\n      cursor += expr_size;\n    } break;\n    case DW_CFA_Undefined: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      operands[0].u64 = reg;\n    } break;\n    case DW_CFA_SameValue: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      operands[0].u64 = reg;\n    } break;\n    case DW_CFA_Offset: {\n      U64 offset = 0;\n      U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = implicit_operand;\n      operands[1].s64 = (S64)offset * data_align_factor;\n    } break;\n    case DW_CFA_OffsetExt: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      U64 offset = 0;\n      U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = reg;\n      operands[1].u64 = offset * data_align_factor;\n    } break;\n    case DW_CFA_OffsetExtSf: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      S64 offset = 0;\n      U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = reg;\n      operands[1].s64 = offset * data_align_factor;\n    } break;\n    case DW_CFA_ValOffset: {\n      U64 val = 0;\n      U64 val_size = str8_deserial_read_uleb128(data, cursor, &val);\n      if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += val_size;\n      \n      U64 offset = 0;\n      U64 offset_size = str8_deserial_read_uleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = val;\n      operands[1].u64 = offset * data_align_factor;\n    } break;\n    case DW_CFA_ValOffsetSf: {\n      U64 val = 0;\n      U64 val_size = str8_deserial_read_uleb128(data, cursor, &val);\n      if (val_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += val_size;\n      \n      S64 offset = 0;\n      U64 offset_size = str8_deserial_read_sleb128(data, cursor, &offset);\n      if (offset_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += offset_size;\n      \n      operands[0].u64 = val;\n      operands[1].s64 = offset;\n    } break;\n    case DW_CFA_Register: {\n      U64 dst_reg = 0;\n      U64 dst_reg_size = str8_deserial_read_uleb128(data, cursor, &dst_reg);\n      if (dst_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += dst_reg_size;\n      \n      U64 src_reg = 0;\n      U64 src_reg_size = str8_deserial_read_uleb128(data, cursor, &src_reg);\n      if (src_reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += src_reg_size;\n      \n      operands[0].u64 = dst_reg;\n      operands[1].u64 = src_reg;\n    } break;\n    case DW_CFA_Expr: {\n      U64 reg = 0;\n      U64 reg_size = str8_deserial_read_uleb128(data, cursor, &reg);\n      if (reg_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += reg_size;\n      \n      U64 expr_size = 0;\n      U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size);\n      if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += expr_size_size;\n      \n      if (cursor + expr_size > data.size) { goto exit; }\n      String8 expr = str8_prefix(str8_skip(data, cursor), expr_size);\n      cursor += expr_size;\n      \n      operands[0].u64   = reg;\n      operands[1].block = expr;\n    } break;\n    case DW_CFA_ValExpr: {\n      U64 val = 0;\n      U64 val_size = str8_deserial_read_uleb128(data, cursor, &val);\n      if (val_size == 0) { goto exit; }\n      cursor += val_size;\n      \n      U64 expr_size = 0;\n      U64 expr_size_size = str8_deserial_read_uleb128(data, cursor, &expr_size);\n      if (expr_size_size == 0) { error_code = DW_CFA_ParseErrorCode_OutOfData; goto exit; }\n      cursor += expr_size_size;\n      \n      if (cursor + expr_size > data.size) { goto exit; }\n      String8 expr = str8_prefix(str8_skip(data, cursor), expr_size);\n      cursor += expr_size;\n      \n      operands[0].u64 = val;\n      operands[1].block = expr;\n    } break;\n    case DW_CFA_Restore: {\n      operands[0].u64 = implicit_operand;\n    } break;\n    case DW_CFA_RestoreExt: {} break;\n    case DW_CFA_RememberState: {} break;\n    case DW_CFA_RestoreState: {} break;\n    case DW_CFA_Nop: {} break;\n    default: { NotImplemented; goto exit; } break;\n  }\n  \n  // fill out output\n  inst_out->opcode = opcode;\n  MemoryCopyTyped(&inst_out->operands[0], &operands[0], DW_CFA_OperandMax);\n  \n  *bytes_read_out = cursor;\n  \n  error_code = DW_CFA_ParseErrorCode_NewInst;\n  \n  exit:;\n  return error_code;\n}\n\ninternal DW_CFA_InstList\ndw_parse_cfa_inst_list(Arena          *arena,\n                       String8        data,\n                       U64            code_align_factor,\n                       S64            data_align_factor,\n                       DW_DecodePtr  *decode_ptr_func,\n                       void          *decode_ptr_ud)\n{\n  U64 pos = arena_pos(arena);\n  DW_CFA_InstList list = {0};\n  for (U64 cursor = 0, inst_size;; cursor += inst_size) {\n    DW_CFA_Inst           inst       = {0};\n    DW_CFA_ParseErrorCode error_code = dw_parse_cfa_inst(str8_skip(data, cursor), code_align_factor, data_align_factor, decode_ptr_func, decode_ptr_ud, &inst_size, &inst);\n    if (error_code == DW_CFA_ParseErrorCode_End) { break; }\n    if (error_code != DW_CFA_ParseErrorCode_NewInst) {\n      MemoryZeroStruct(&list);\n      arena_pop_to(arena, pos);\n      break;\n    }\n    dw_cfa_inst_list_push(arena, &list, inst);\n  }\n  return list;\n}\n\ninternal\nDW_DECODE_PTR(dw_decode_ptr_debug_frame)\n{\n  return dw_read_debug_frame_ptr(data, ud, ptr_out);\n}\n\n"
  },
  {
    "path": "src/dwarf/dwarf_parse.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_PARSE_H\n#define DWARF_PARSE_H\n\ntypedef struct DW_Section DW_Section;\nstruct DW_Section\n{\n  String8 name;\n  String8 data;\n  B32     is_dwo;\n};\n\ntypedef struct DW_Input DW_Input;\nstruct DW_Input\n{\n  DW_Section sec[DW_Section_Count];\n  DW_Section sup[DW_Section_Count];\n};\n\ntypedef struct DW_ListUnit DW_ListUnit;\nstruct DW_ListUnit\n{\n  DW_Version version;\n  U64 address_size;\n  U64 segment_selector_size;\n  U64 entry_size;\n  String8 entries;\n};\n\ntypedef struct DW_ListUnitInput DW_ListUnitInput;\nstruct DW_ListUnitInput\n{\n  U64 addr_count;\n  U64 str_offset_count;\n  U64 rnglist_count;\n  U64 loclist_count;\n  Rng1U64Array addr_ranges;\n  Rng1U64Array str_offset_ranges;\n  Rng1U64Array rnglist_ranges;\n  Rng1U64Array loclist_ranges;\n  DW_ListUnit *addrs;\n  DW_ListUnit *str_offsets;\n  DW_ListUnit *rnglists;\n  DW_ListUnit *loclists;\n};\n\ntypedef struct DW_AbbrevTableEntry DW_AbbrevTableEntry;\nstruct DW_AbbrevTableEntry\n{\n  U64 id;\n  U64 off;\n};\n\ntypedef struct DW_AbbrevTable DW_AbbrevTable;\nstruct DW_AbbrevTable\n{\n  U64 count;\n  DW_AbbrevTableEntry *entries;\n};\n\ntypedef enum DW_AbbrevKind\n{\n  DW_Abbrev_Null,\n  DW_Abbrev_Tag,\n  DW_Abbrev_Attrib,\n  DW_Abbrev_AttribSequenceEnd,\n  DW_Abbrev_DIEBegin,\n  DW_Abbrev_DIEEnd,\n}\nDW_AbbrevKind;\n\ntypedef U32 DW_AbbrevFlags;\nenum\n{\n  DW_AbbrevFlag_HasImplicitConst = (1 << 0),\n  DW_AbbrevFlag_HasChildren      = (1 << 1),\n};\n\ntypedef struct DW_Abbrev DW_Abbrev;\nstruct DW_Abbrev\n{\n  DW_AbbrevKind kind;\n  U64 sub_kind;\n  U64 id;\n  U64 const_value;\n  DW_AbbrevFlags flags;\n};\n\ntypedef union DW_Form\n{\n  String8 addr;\n  String8 block;\n  String8 data;\n  String8 string;\n  String8 exprloc;\n  B8      flag;\n  S64     sdata;\n  U64     udata;\n  U64     sec_offset;\n  U64     ref;\n  U64     strp_sup;\n  U64     xval;\n  U64     addrx;\n  U64     strx;\n  U64     rnglistx;\n  U64     ptr;\n  U64     implicit_const;\n}\nDW_Form;\n\ntypedef struct DW_Attrib DW_Attrib;\nstruct DW_Attrib\n{\n  U64 info_off;\n  U64 abbrev_off;\n  U64 abbrev_id;\n  DW_AttribKind attrib_kind;\n  DW_FormKind form_kind;\n  DW_Form form;\n};\n\ntypedef struct DW_AttribNode DW_AttribNode;\nstruct DW_AttribNode\n{\n  DW_AttribNode *next;\n  DW_Attrib v;\n};\n\ntypedef struct DW_AttribList DW_AttribList;\nstruct DW_AttribList\n{\n  DW_AttribNode *first;\n  DW_AttribNode *last;\n  U64 count;\n};\n\ntypedef struct DW_Tag DW_Tag;\nstruct DW_Tag\n{\n  B32 has_children;\n  U64 abbrev_id;\n  DW_TagKind kind;\n  DW_AttribList attribs;\n  U64 info_off;\n  U8 v[1];\n};\n\ntypedef struct DW_TagNode DW_TagNode;\nstruct DW_TagNode\n{\n  DW_Tag tag;\n  DW_TagNode *sibling;\n  DW_TagNode *first_child;\n  DW_TagNode *last_child;\n};\n\ntypedef struct DW_Loc DW_Loc;\nstruct DW_Loc\n{\n  Rng1U64 range;\n  String8 expr;\n};\n\ntypedef struct DW_LocNode DW_LocNode;\nstruct DW_LocNode\n{\n  DW_LocNode *next;\n  DW_Loc v;\n};\n\ntypedef struct DW_LocList DW_LocList;\nstruct DW_LocList\n{\n  DW_LocNode *first;\n  DW_LocNode *last;\n  U64 count;\n};\n\ntypedef struct DW_CompUnit DW_CompUnit;\nstruct DW_CompUnit\n{\n  DW_Ext          ext;\n  DW_CompUnitKind kind;\n  DW_Version      version;\n  DW_Format       format;\n  U64             address_size;\n  U64             abbrev_off;\n  Rng1U64         info_range;\n  U64             first_tag_info_off;\n  DW_AbbrevTable  abbrev_table;\n  String8         abbrev_data;\n  DW_ListUnit    *addr_lu;\n  DW_ListUnit    *str_offsets_lu;\n  DW_ListUnit    *rnglists_lu;\n  DW_ListUnit    *loclists_lu;\n  U64             low_pc;\n  U64             dwo_id;\n  DW_Tag          tag;\n  HashTable      *tag_ht;\n};\n\ntypedef struct DW_TagTree\n{\n  DW_TagNode *root;\n  U64         tag_count;\n} DW_TagTree;\n\ntypedef struct DW_LineFile\n{\n  String8 file_name;\n  U64     dir_idx;\n  U64     modify_time;\n  U64     file_size;\n  U128    md5_digest;\n  String8 source;\n} DW_LineFile;\n\ntypedef struct DW_LineVMFileNode\n{\n  struct DW_LineVMFileNode *next;\n  DW_LineFile               file;\n} DW_LineVMFileNode;\n\ntypedef struct DW_LineVMFileList\n{\n  U64                node_count;\n  DW_LineVMFileNode *first;\n  DW_LineVMFileNode *last;\n} DW_LineVMFileList;\n\ntypedef struct DW_LineVMFileArray\n{\n  U64          count;\n  DW_LineFile *v;\n} DW_LineVMFileArray;\n\ntypedef struct DW_LineVMHeader\n{\n  Rng1U64             unit_range;\n  DW_Version          version;\n  U8                  address_size; // Duplicates size from the compilation unit but is needed to support stripped exe that just have .debug_line and .debug_line_str.\n  U8                  segment_selector_size;\n  U64                 header_length;\n  U8                  min_inst_len;\n  U8                  max_ops_for_inst;\n  U8                  default_is_stmt;\n  S8                  line_base;\n  U8                  line_range;\n  U8                  opcode_base;\n  U64                 num_opcode_lens;\n  U8                 *opcode_lens;\n  DW_LineVMFileArray  dir_table;\n  DW_LineVMFileArray  file_table;\n} DW_LineVMHeader;\n\ntypedef struct DW_LineVMState\n{\n  U64 address;  // Address of a machine instruction.\n  U32 op_index; // This is used by the VLIW instructions to indicate index of operation inside the instruction.\n  \n  // Line table doesn't contain full path to a file, instead\n  // DWARF encodes path as two indices. First index will point into a directory\n  // table,  and second points into a file name table.\n  U32 file_index;\n  \n  U32 line;\n  U32 column;\n  \n  B32 is_stmt;      // Indicates that \"address\" points to place suitable for a breakpoint.\n  B32 basic_block;  // Indicates that the \"address\" is inside a basic block.\n  \n  // Indicates that \"address\" points to place where function starts.\n  // Usually prologue is the place where compiler emits instructions to \n  // prepare stack for a function.\n  B32 prologue_end;\n  \n  B32 epilogue_begin;  // Indicates that \"address\" points to section where function exits and unwinds stack.\n  U64 isa;             // Instruction set that is used.\n  U64 discriminator;   // Arbitrary id that indicates to which block these instructions belong.\n  B32 end_sequence;    // Indicates that \"address\" points to the first instruction in the instruction block that follows.\n} DW_LineVMState;\n\ntypedef struct DW_Line\n{\n  U64 file_index;\n  U32 line;\n  U32 column;\n  U64 address;\n} DW_Line;\n\ntypedef struct DW_LineNode\n{\n  struct DW_LineNode *next;\n  DW_Line             v;\n} DW_LineNode;\n\ntypedef struct DW_LineSeqNode\n{\n  struct DW_LineSeqNode *next;\n  U64                    count;\n  DW_LineNode           *first;\n  DW_LineNode           *last;\n} DW_LineSeqNode;\n\ntypedef struct DW_LineTableParseResult\n{\n  DW_LineVMHeader vm_header;\n  U64             seq_count;\n  DW_LineSeqNode *first_seq;\n  DW_LineSeqNode *last_seq;\n} DW_LineTableParseResult;\n\n////////////////////////////////\n// .debug_pubnames and .debug_pubtypes\n\ntypedef struct DW_PubStringsBucket\n{\n  struct DW_PubStringsBucket *next;\n  String8                     string;\n  U64                         info_off;\n  U64                         cu_info_off;\n} DW_PubStringsBucket;\n\ntypedef struct DW_PubStringsTable\n{\n  U64                   size;\n  DW_PubStringsBucket **buckets;\n} DW_PubStringsTable;\n\ntypedef struct DW_Reference\n{\n  DW_CompUnit *cu;\n  U64          info_off;\n} DW_Reference;\n\n////////////////////////////////\n//~ Expression\n\ntypedef union DW_ExprOperand\n{\n  U8  u8;\n  U16 u16;\n  U32 u32;\n  U64 u64;\n  \n  S8  s8;\n  S16 s16;\n  S32 s32;\n  S64 s64;\n  \n  String8 block;\n} DW_ExprOperand;\n\ntypedef struct DW_ExprInst\n{\n  DW_ExprOp       opcode;\n  DW_ExprOperand *operands;\n  U64             size;\n  struct DW_ExprInst *next;\n  struct DW_ExprInst *prev;\n} DW_ExprInst;\n\ntypedef struct DW_Expr\n{\n  U64          count;\n  DW_ExprInst *first;\n  DW_ExprInst *last;\n} DW_Expr;\n\n////////////////////////////////\n// .debug_frame\n\ntypedef enum\n{\n  DW_DescriptorEntryType_Null,\n  DW_DescriptorEntryType_CIE,\n  DW_DescriptorEntryType_FDE\n} DW_DescriptorEntryType;\n\ntypedef struct DW_DescriptorEntry\n{\n  DW_DescriptorEntryType type;\n  DW_Format              format;\n  Rng1U64                entry_range;\n  U64                    cie_pointer_off;\n  U64                    cie_pointer;\n} DW_DescriptorEntry;\n\ntypedef struct DW_CIE\n{\n  String8   insts;\n  String8   aug_string;\n  String8   aug_data;\n  U64       code_align_factor;\n  S64       data_align_factor;\n  U64       ret_addr_reg;\n  U64       ext[4];\n  DW_Format format;\n  U8        version;\n  U8        address_size;\n  U8        segment_selector_size;\n} DW_CIE;\n\ntypedef struct DW_FDE\n{\n  DW_Format format;\n  U64       cie_pointer;\n  Rng1U64   pc_range;\n  String8   insts;\n} DW_FDE;\n\ntypedef union DW_CFA_Operand\n{\n  U64     u64;\n  S64     s64;\n  String8 block;\n} DW_CFA_Operand;\n\ntypedef enum\n{\n  DW_CFA_ParseErrorCode_NewInst,\n  DW_CFA_ParseErrorCode_End,\n  DW_CFA_ParseErrorCode_OutOfData\n} DW_CFA_ParseErrorCode;\n\ntypedef struct DW_CFA_Inst\n{\n  DW_CFA_Opcode  opcode;\n  DW_CFA_Operand operands[DW_CFA_OperandMax];\n} DW_CFA_Inst;\n\ntypedef struct DW_CFA_InstNode\n{\n  DW_CFA_Inst v;\n  struct DW_CFA_InstNode *next;\n} DW_CFA_InstNode;\n\ntypedef struct DW_CFA_InstList\n{\n  U64              count;\n  DW_CFA_InstNode *first;\n  DW_CFA_InstNode *last;\n} DW_CFA_InstList;\n\n#define DW_DECODE_PTR(name) U64 name(String8 data, void *ud, U64 *ptr_out)\ntypedef DW_DECODE_PTR(DW_DecodePtr);\n\n// deserial helpers\n\ninternal U64 str8_deserial_read_dwarf_packed_size(String8 string, U64 off, U64 *size_out);\ninternal U64 str8_deserial_read_dwarf_uint       (String8 string, U64 off, DW_Format format, U64 *uint_out);\ninternal U64 str8_deserial_read_uleb128          (String8 string, U64 off, U64 *value_out);\ninternal U64 str8_deserial_read_sleb128          (String8 string, U64 off, S64 *value_out);\ninternal U64 str8_deserial_read_uleb128_array(Arena *arena, String8 string, U64 off, U64 count, U64 **arr_out);\ninternal U64 str8_deserial_read_sleb128_array(Arena *arena, String8 string, U64 off, U64 count, S64 **arr_out);\n\ninternal Rng1U64List dw_unit_ranges_from_data(Arena *arena, String8 data);\n\n// list units\n\ninternal U64 dw_read_list_unit_header_addr       (String8 unit_data, DW_ListUnit *lu_out);\ninternal U64 dw_read_list_unit_header_str_offsets(String8 unit_data, DW_ListUnit *lu_out);\ninternal U64 dw_read_list_unit_header_list       (String8 unit_data, DW_ListUnit *lu_out);\n\ninternal DW_ListUnitInput dw_list_unit_input_from_input(Arena *arena, DW_Input *input);\n\ninternal U64 dw_offset_from_list_unit(DW_ListUnit *lu, U64 index);\ninternal U64 dw_addr_from_list_unit  (DW_ListUnit *lu, U64 index);\n\n// abbrev table\n\ninternal U64            dw_read_abbrev_tag   (String8 data, U64 offset, DW_Abbrev *out_abbrev);\ninternal U64            dw_read_abbrev_attrib(String8 data, U64 offset, DW_Abbrev *out_abbrev);\ninternal DW_AbbrevTable dw_make_abbrev_table(Arena *arena, String8 abbrev_data, U64 start_abbrev_off);\ninternal U64            dw_abbrev_offset_from_abbrev_id(DW_AbbrevTable table, U64 abbrev_id);\n\n// form and tag\n\ninternal U64 dw_read_form(String8 data, U64 off, DW_Version version, DW_Format unit_format, U64 address_size, DW_FormKind form_kind, U64 implicit_const, DW_Form *form_out);\ninternal U64 dw_read_tag   (Arena *arena, String8 tag_data, U64 tag_off, U64 tag_base, DW_AbbrevTable abbrev_table, String8 abbrev_data, DW_Version version, DW_Format unit_format, U64 address_size, DW_Tag *tag_out);\ninternal U64 dw_read_tag_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 info_off, DW_Tag *tag_out);\n\n// attrib interp\n\ninternal U64           dw_interp_sec_offset(DW_FormKind form_kind, DW_Form form);\ninternal String8       dw_interp_exprloc   (DW_FormKind form_kind, DW_Form form);\ninternal U128          dw_interp_const_u128(DW_FormKind form_kind, DW_Form form);\ninternal U64           dw_interp_const_u64 (DW_FormKind form_kind, DW_Form form);\ninternal U32           dw_interp_const_u32 (DW_FormKind form_kind, DW_Form form);\ninternal S64           dw_interp_const_s64 (DW_FormKind form_kind, DW_Form form);\ninternal S32           dw_interp_const_s32 (DW_FormKind form_kind, DW_Form form);\ninternal B32           dw_interp_flag      (DW_FormKind form_kind, DW_Form form);\ninternal U64           dw_interp_address   (U64 address_size, U64 base_addr, DW_ListUnit *addr_xlist, DW_FormKind form_kind, DW_Form form);\ninternal String8       dw_interp_block     (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form);\ninternal String8       dw_interp_string    (DW_Input *input, DW_Format unit_format, DW_ListUnit *str_offsets, DW_FormKind form_kind, DW_Form form);\ninternal String8       dw_interp_line_ptr  (DW_Input *input, DW_FormKind form_kind, DW_Form form);\ninternal DW_LineFile * dw_interp_file      (DW_LineVMHeader *line_vm, DW_FormKind form_kind, DW_Form form);\ninternal DW_Reference  dw_interp_ref       (DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form);\ninternal DW_LocList    dw_interp_loclist   (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form);\ninternal Rng1U64List   dw_interp_rnglist   (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_FormKind form_kind, DW_Form form);\n\ninternal String8       dw_exprloc_from_attrib   (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal U128          dw_const_u128_from_attrib(DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal U64           dw_const_u64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal U32           dw_const_u32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal S64           dw_const_s64_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal S32           dw_const_s32_from_attrib (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal B32           dw_flag_from_attrib      (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal U64           dw_address_from_attrib   (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal String8       dw_block_from_attrib     (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal String8       dw_string_from_attrib    (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal String8       dw_line_ptr_from_attrib  (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal DW_LineFile * dw_file_from_attrib      (DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Attrib *attrib);\ninternal DW_Reference  dw_ref_from_attrib       (DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal DW_LocList    dw_loclist_from_attrib   (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\ninternal Rng1U64List   dw_rnglist_from_attrib   (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Attrib *attrib);\n\ninternal String8       dw_exprloc_from_tag_attrib_kind   (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal U128          dw_const_u128_from_tag_attrib_kind(DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal U64           dw_const_u64_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal U32           dw_const_u32_from_tag_attrib_kind (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal B32           dw_flag_from_tag_attrib_kind      (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal U64           dw_address_from_tag_attrib_kind   (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal String8       dw_block_from_tag_attrib_kind     (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal String8       dw_string_from_tag_attrib_kind    (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal String8       dw_line_ptr_from_tag_attrib_kind  (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal String8       dw_line_ptr_from_tag_attrib_kind  (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal DW_LineFile * dw_file_from_tag_attrib_kind      (DW_Input *input, DW_CompUnit *cu, DW_LineVMHeader *line_vm, DW_Tag tag, DW_AttribKind kind);\ninternal DW_Reference  dw_ref_from_tag_attrib_kind       (DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal DW_LocList    dw_loclist_from_tag_attrib_kind   (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\ninternal Rng1U64List   dw_rnglist_from_tag_attrib_kind   (Arena *arena, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\n\n// compile unit\n\ninternal DW_CompUnit  dw_cu_from_info_off(Arena *arena, DW_Input *input, DW_ListUnitInput lu_input, U64 offset, B32 relaxed);\ninternal DW_TagTree   dw_tag_tree_from_cu(Arena *arena, DW_Input *input, DW_CompUnit *cu);\ninternal HashTable *  dw_make_tag_hash_table(Arena *arena, DW_TagTree tag_tree);\ninternal DW_TagNode * dw_tag_node_from_info_off(DW_CompUnit *cu, U64 info_off);\n\n// line info\n\ninternal U64              dw_read_line_file(String8 line_data, U64 line_off, DW_Input *input, DW_Version unit_version, DW_Format unit_format, DW_Ext ext, U64 address_size, DW_ListUnit *str_offsets, U64 enc_count, U64 *enc_arr, DW_LineFile *line_file_out);\ninternal U64              dw_read_line_vm_header(Arena *arena, String8 line_data, U64 line_off, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets, DW_LineVMHeader *header_out);\ninternal void             dw_line_vm_reset(DW_LineVMState *state, B32 default_is_stmt);\ninternal void             dw_line_vm_advance(DW_LineVMState *state, U64 advance, U64 min_inst_len, U64 max_ops_for_inst);\ninternal DW_LineSeqNode * dw_push_line_seq(Arena* arena, DW_LineTableParseResult *parsed_tbl);\ninternal DW_LineNode *    dw_push_line(Arena *arena, DW_LineTableParseResult *tbl, DW_LineVMState *vm_state, B32 start_of_sequence);\ninternal String8          dw_path_from_file(Arena *arena, DW_LineVMHeader *vm, DW_LineFile *file);\ninternal String8          dw_path_from_file_idx(Arena *arena, DW_LineVMHeader *vm, U64 file_idx);\n\ninternal DW_LineTableParseResult dw_parsed_line_table_from_data(Arena *arena, String8 unit_data, DW_Input *input, String8 cu_dir, String8 cu_name, U8 cu_address_size, DW_ListUnit *cu_str_offsets);\n\n// helper for .debug_pubtypes and .debug_pubnames \n\ninternal DW_PubStringsTable dw_v4_pub_strings_table_from_section_kind(Arena *arena, DW_Input *input, DW_SectionKind section_kind);\n\n// expression\n\ninternal DW_Expr dw_expr_from_data(Arena *arena, DW_Format format, U64 addr_size, String8 data);\n\n// debug frame\n\ninternal void              dw_cfa_inst_list_push_node(DW_CFA_InstList *list, DW_CFA_InstNode *n);\ninternal DW_CFA_InstNode * dw_cfa_inst_list_push(Arena *arena, DW_CFA_InstList *list, DW_CFA_Inst v);\n\ninternal U64 dw_read_debug_frame_ptr(String8 data, DW_CIE *cie, U64 *ptr_out);\n\ninternal U64 dw_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out);\ninternal B32 dw_parse_cie(String8 data, DW_Format format, Arch arch, DW_CIE *cie_out);\ninternal B32 dw_parse_fde(String8 data, DW_Format format, DW_CIE *cie, DW_FDE *fde_out);\ninternal B32 dw_parse_cfi(String8 data, U64 fde_offset, Arch arch, DW_CIE *cie_out, DW_FDE *fde_out);\n\ninternal DW_CFA_ParseErrorCode dw_parse_cfa_inst(String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud, U64 *bytes_read_out, DW_CFA_Inst *inst_out);\ninternal DW_CFA_InstList       dw_parse_cfa_inst_list(Arena *arena, String8 data, U64 code_align_factor, S64 data_align_factor, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud);\n\n#endif // DWARF_PARSE_H\n"
  },
  {
    "path": "src/dwarf/dwarf_unwind.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal DW_CFI_Row *\ndw_make_cfi_row(Arena *arena, U64 reg_count)\n{\n  DW_CFI_Row *row = push_array(arena, DW_CFI_Row, 1);\n  row->regs = push_array(arena, DW_CFI_Register, reg_count);\n  for EachIndex(reg_idx, reg_count) {\n    row->regs[reg_idx].rule = DW_CFI_RegisterRule_SameValue;\n  }\n  return row;\n}\n\ninternal void\ndw_memcpy_cfi_row(DW_CFI_Row *dst, DW_CFI_Row *src, U64 reg_count)\n{\n  dst->cfa = src->cfa;\n  MemoryCopyTyped(dst->regs, src->regs, reg_count);\n}\n\ninternal DW_CFI_Row *\ndw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count)\n{\n  DW_CFI_Row *new_row = dw_make_cfi_row(arena, reg_count);\n  dw_memcpy_cfi_row(new_row, row, reg_count);\n  return new_row;\n}\n\ninternal DW_CFI_Unwind *\ndw_cfi_unwind_init(Arena        *arena,\n                   Arch          arch,\n                   DW_CIE       *cie,\n                   DW_FDE       *fde,\n                   DW_DecodePtr *decode_ptr_func,\n                   void         *decode_ptr_ud)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  DW_CFI_Unwind *uw = push_array(arena, DW_CFI_Unwind, 1);\n  uw->insts     = dw_parse_cfa_inst_list(arena, fde->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud);\n  uw->cie       = cie;\n  uw->fde       = fde;\n  uw->pc        = fde->pc_range.min;\n  uw->arch      = arch;\n  uw->reg_count = dw_reg_count_from_arch(arch);\n\n  // setup initial register rules\n  DW_CFA_InstList initial_insts = dw_parse_cfa_inst_list(scratch.arena, cie->insts, cie->code_align_factor, cie->data_align_factor, decode_ptr_func, decode_ptr_ud);\n  uw->row       = dw_make_cfi_row(arena, uw->reg_count);\n  uw->curr_inst = initial_insts.first;\n  if (!dw_cfi_next_row(arena, uw)) {\n    AssertAlways(0 && \"unable to interpret initial row instructions\");\n  }\n\n  // make first row from initial rules\n  uw->initial_row = uw->row;\n  uw->row         = dw_copy_cfi_row(arena, uw->initial_row, uw->reg_count);\n  uw->curr_inst   = uw->insts.first;\n\n  scratch_end(scratch);\n  return uw;\n}\n\ninternal B32\ndw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw)\n{\n  B32              is_row_valid = 0;\n  DW_CFA_InstNode *row_inst     = uw->curr_inst;\n\n  // skip leading nops\n  while (uw->curr_inst) {\n    if (uw->curr_inst->v.opcode != DW_CFA_Nop) {\n      break;\n    }\n    uw->curr_inst = uw->curr_inst->next;\n  }\n\n  while (uw->curr_inst) {\n    DW_CFA_Inst *inst = &uw->curr_inst->v;\n\n    // validate register operands\n    DW_CFA_OperandType *operand_types = dw_operand_types_from_cfa_op(inst->opcode);\n    U64                 operand_count = dw_operand_count_from_cfa_opcode(inst->opcode);\n    for EachIndex(operand_idx, operand_count) {\n      if (operand_types[operand_idx] == DW_CFA_OperandType_Register) {\n        if (inst->operands[operand_idx].u64 >= uw->reg_count) {\n          goto exit;\n        }\n      }\n    }\n\n    switch (inst->opcode) {\n    // Row Creation Instructions\n    case DW_CFA_SetLoc: {\n      uw->pc = inst->operands[0].u64;\n    } break;\n    case DW_CFA_AdvanceLoc:\n    case DW_CFA_AdvanceLoc1:\n    case DW_CFA_AdvanceLoc2:\n    case DW_CFA_AdvanceLoc4: {\n      uw->pc += inst->operands[0].u64;\n    } break;\n\n    // CFA Definition Instructions\n    case DW_CFA_DefCfa:\n    case DW_CFA_DefCfaSf: {\n      U64 reg = inst->operands[0].u64;\n      S64 off = inst->operands[1].s64;\n      uw->row->cfa.rule = DW_CFA_Rule_RegOff;\n      uw->row->cfa.reg  = reg;\n      uw->row->cfa.off  = off;\n    } break;\n    case DW_CFA_DefCfaRegister: {\n      // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset\n      if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; }\n      U64 reg = inst->operands[0].u64;\n      uw->row->cfa.reg = reg;\n    } break;\n    case DW_CFA_DefCfaOffset:\n    case DW_CFA_DefCfaOffsetSf: {\n      // TODO: report error: this operation is valid only if the current CFA rule is defined to register+offset\n      if (uw->row->cfa.rule != DW_CFA_Rule_RegOff) { goto exit; }\n      uw->row->cfa.off = inst->operands[0].s64;\n    } break;\n    case DW_CFA_DefCfaExpr: {\n      uw->row->cfa.rule = DW_CFA_Rule_Expression;\n      uw->row->cfa.expr = inst->operands[0].block;\n    } break;\n\n    // Register Rule Instructions\n    case DW_CFA_Undefined: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_Undefined;\n    } break;\n    case DW_CFA_SameValue: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_SameValue;\n    } break;\n    case DW_CFA_Offset:\n    case DW_CFA_OffsetExt:\n    case DW_CFA_OffsetExtSf: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_Offset;\n      uw->row->regs[reg].n    = inst->operands[1].s64;\n    } break;\n    case DW_CFA_ValOffset:\n    case DW_CFA_ValOffsetSf: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValOffset;\n      uw->row->regs[reg].n    = inst->operands[1].s64;\n    } break;\n    case DW_CFA_Register: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_Register;\n      uw->row->regs[reg].n    = inst->operands[1].s64;\n    } break;\n    case DW_CFA_Expr: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_Expression;\n      uw->row->regs[reg].expr = inst->operands[1].block;\n    } break;\n    case DW_CFA_ValExpr: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg].rule = DW_CFI_RegisterRule_ValExpression;\n      uw->row->regs[reg].expr = inst->operands[1].block;\n    } break;\n    case DW_CFA_Restore:\n    case DW_CFA_RestoreExt: {\n      U64 reg = inst->operands[0].u64;\n      uw->row->regs[reg] = uw->initial_row->regs[reg];\n    } break;\n      \n    // Row State Instructions\n    case DW_CFA_RememberState: {\n      DW_CFI_Row *new_row = dw_copy_cfi_row(arena, uw->row, uw->reg_count);\n      SLLStackPush(uw->row, new_row);\n    } break;\n    case DW_CFA_RestoreState: {\n      if (uw->row == 0) { goto exit; } // TODO: report error: unbalanced number of pushes and pops\n      DW_CFI_Row *free_row = uw->row;\n      SLLStackPop(uw->row);\n      SLLStackPush(uw->free_rows, free_row);\n    } break;\n\n    case DW_CFA_Nop: {} break;\n\n    default: { NotImplemented; } break; // TODO: report error: unknown CFA opcode\n    }\n\n    uw->curr_inst = uw->curr_inst->next;\n    if (uw->curr_inst) {\n      if (dw_is_new_row_cfa_opcode(uw->curr_inst->v.opcode)) { break; }\n    }\n  }\n\n  is_row_valid = row_inst != 0;\nexit:;\n  return is_row_valid;\n}\n\ninternal DW_CFI_Row *\ndw_cfi_row_from_pc(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  B32            is_row_found = 0;\n  U64            reg_count    = dw_reg_count_from_arch(arch);\n  DW_CFI_Unwind *uw           = dw_cfi_unwind_init(scratch.arena, arch, cie, fde, decode_ptr_func, decode_ptr_ctx);\n  DW_CFI_Row    *row          = dw_copy_cfi_row(scratch.arena, uw->row, uw->reg_count);\n  U64            prev_pc      = uw->pc;\n  while (dw_cfi_next_row(scratch.arena, uw)) {\n    if (prev_pc <= pc && pc < uw->pc) {\n      is_row_found = 1;\n      break;\n    }\n    dw_memcpy_cfi_row(row, uw->row, uw->reg_count);\n    prev_pc = uw->pc;\n  }\n\n  // handle last row\n  if (!is_row_found) {\n    if (contains_1u64(fde->pc_range, pc)) {\n      row = uw->row;\n      is_row_found = 1;\n    }\n  }\n\n  // copy out final row\n  DW_CFI_Row *result = 0;\n  if (is_row_found) {\n    result = dw_copy_cfi_row(arena, row, reg_count);\n  }\n\n  scratch_end(scratch);\n  return result;\n}\n\ninternal DW_UnwindStatus\ndw_cfi_apply_register_rules(Arch         arch,\n                            DW_CIE      *cie,\n                            DW_CFI_Row  *row,\n                            DW_MemRead  *mem_read_func,  void *mem_read_ud,\n                            DW_RegRead  *reg_read_func,  void *reg_read_ud,\n                            DW_RegWrite *reg_write_func, void *reg_write_ud)\n{\n  Temp scratch = scratch_begin(0,0);\n  DW_UnwindStatus unwind_status = DW_UnwindStatus_Ok;\n\n  // establish CFA\n  U64 cfa = 0;\n  switch (row->cfa.rule) {\n  case DW_CFA_Rule_Null: break;\n  case DW_CFA_Rule_RegOff: {\n    // TODO: report error (invalid register read)\n    U64 cfa_reg_value = 0;\n    U64 reg_size = dw_reg_size_from_code(arch, row->cfa.reg);\n    AssertAlways(reg_size <= sizeof(cfa_reg_value));\n    unwind_status = reg_read_func(row->cfa.reg, &cfa_reg_value, reg_size, reg_read_ud);\n    if (unwind_status != DW_UnwindStatus_Ok) { goto exit; }\n    cfa = cfa_reg_value + row->cfa.off;\n  } break;\n  case DW_CFA_Rule_Expression: {\n    // TODO: evaluate expression\n  } break;\n  }\n\n  U64   max_reg_size = dw_reg_max_size_from_arch(arch);\n  void *reg_buffer   = push_array(scratch.arena, U8, max_reg_size);\n\n  U64 reg_count = dw_reg_count_from_arch(arch);\n  for EachIndex(reg_idx, reg_count) {\n    DW_CFI_Register *reg = &row->regs[reg_idx];\n    switch (reg->rule) {\n    case DW_CFI_RegisterRule_Undefined: {} break;\n    case DW_CFI_RegisterRule_SameValue: {} break;\n    case DW_CFI_RegisterRule_Offset: {\n      // read register value from memory\n      U64 addr     = cfa + reg->n;\n      U64 reg_size = dw_reg_size_from_code(arch, reg_idx);\n      unwind_status = mem_read_func(addr, reg_size, reg_buffer, mem_read_ud);\n      if (unwind_status != DW_UnwindStatus_Ok) { goto exit; }\n\n      // write register value to the thread context\n      unwind_status = reg_write_func(reg_idx, reg_buffer, reg_size, reg_write_ud);\n      if (unwind_status != DW_UnwindStatus_Ok) { goto exit; }\n    } break;\n    case DW_CFI_RegisterRule_ValOffset: {\n      // compute register value\n      U64 reg_value = cfa + reg->n;\n\n      // write register value to the thread context\n      U64 reg_size = dw_reg_size_from_code(arch, reg_idx);\n      unwind_status = reg_write_func(reg_idx, &reg_value, reg_size, reg_write_ud);\n      if (unwind_status != DW_UnwindStatus_Ok) { goto exit; }\n    } break;\n    case DW_CFI_RegisterRule_Register: {\n      // read register value from another register\n      U64 reg_size = dw_reg_size_from_code(arch, reg_idx);\n      unwind_status = reg_read_func(reg->n, reg_buffer, reg_size, reg_read_ud);\n      if (unwind_status != DW_UnwindStatus_Ok) { goto exit; }\n\n      // write register value to the thread context\n      unwind_status = reg_write_func(reg_idx, reg_buffer, reg_size, reg_write_ud);\n      if (unwind_status != DW_UnwindStatus_Ok) { goto exit; }\n    } break;\n    case DW_CFI_RegisterRule_Expression: {\n      // TODO: evaluate expression\n      NotImplemented;\n    } break;\n    case DW_CFI_RegisterRule_ValExpression: {\n      // TODO: evaluate expression\n      NotImplemented;\n    } break;\n    case DW_CFI_RegisterRule_Architectural: {\n      NotImplemented;\n    } break;\n    default: { InvalidPath; } break;\n    }\n  }\n\n  // update stack pointer\n  U64 sp = dw_sp_from_arch(arch);\n  reg_write_func(sp, &cfa, sizeof(cfa), reg_write_ud);\n\nexit:;\n  scratch_end(scratch);\n  return unwind_status;\n}\n\n"
  },
  {
    "path": "src/dwarf/dwarf_unwind.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef DWARF_UNWIND_H\n#define DWARF_UNWIND_H\n\ntypedef enum DW_CFI_RegisterRule\n{\n  DW_CFI_RegisterRule_Undefined,\n  DW_CFI_RegisterRule_SameValue,\n  DW_CFI_RegisterRule_Offset,\n  DW_CFI_RegisterRule_ValOffset,\n  DW_CFI_RegisterRule_Register,\n  DW_CFI_RegisterRule_Expression,\n  DW_CFI_RegisterRule_ValExpression,\n  DW_CFI_RegisterRule_Architectural\n} DW_CFI_RegisterRule;\n\ntypedef enum DW_CFA_Rule\n{\n  DW_CFA_Rule_Null,\n  DW_CFA_Rule_RegOff,\n  DW_CFA_Rule_Expression\n} DW_CFA_Rule;\n\ntypedef struct DW_CFA\n{\n  DW_CFA_Rule rule;\n  union {\n    struct {\n      DW_Reg reg;\n      S64    off;\n    };\n    String8 expr;\n  };\n} DW_CFA;\n\ntypedef struct DW_CFI_Register\n{\n  DW_CFI_RegisterRule rule;\n  union {\n    S64     n;\n    String8 expr;\n  };\n} DW_CFI_Register;\n\ntypedef struct DW_CFI_Row\n{\n  DW_CFA           cfa;\n  DW_CFI_Register *regs;\n  struct DW_CFI_Row *next;\n} DW_CFI_Row;\n\ntypedef struct DW_CFI_Unwind\n{\n  DW_CFA_InstList  insts;\n  DW_CIE          *cie;\n  DW_FDE          *fde;\n  DW_CFI_Row      *initial_row;\n  DW_CFI_Row      *row;\n  DW_CFA_InstNode *curr_inst;\n  DW_CFI_Row      *free_rows;\n  U64              pc;\n  Arch             arch;\n  U64              reg_count;\n} DW_CFI_Unwind;\n\ntypedef enum {\n  DW_UnwindStatus_Ok,\n  DW_UnwindStatus_Fail,\n  DW_UnwindStatus_Maybe\n} DW_UnwindStatus;\n\n#define DW_REG_READ(name) DW_UnwindStatus name(DW_Reg reg_id, void *buffer, U64 buffer_max, void *ud)\ntypedef DW_REG_READ(DW_RegRead);\n\n#define DW_REG_WRITE(name) DW_UnwindStatus name(DW_Reg reg_id, void *value, U64 value_size, void *ud)\ntypedef DW_REG_WRITE(DW_RegWrite);\n\n#define DW_MEM_READ(name) DW_UnwindStatus name(U64 addr, U64 size, void *buffer, void *ud)\ntypedef DW_MEM_READ(DW_MemRead);\n\n////////////////////////////////\n\ninternal DW_CFI_Row * dw_make_cfi_row(Arena *arena, U64 reg_count);\ninternal DW_CFI_Row * dw_copy_cfi_row(Arena *arena, DW_CFI_Row *row, U64 reg_count);\n\ninternal DW_CFI_Unwind * dw_cfi_unwind_init(Arena *arena, Arch arch, DW_CIE *cie, DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ud);\ninternal B32             dw_cfi_next_row(Arena *arena, DW_CFI_Unwind *uw);\n\ninternal DW_CFI_Row *    dw_cfi_row_from_pc(Arena *arena, Arch arch, struct DW_CIE *cie, struct DW_FDE *fde, DW_DecodePtr *decode_ptr_func, void *decode_ptr_ctx, U64 pc);\ninternal DW_UnwindStatus dw_cfi_apply_register_rules(Arch arch, DW_CIE *cie, DW_CFI_Row *row, DW_MemRead *mem_read_func, void *mem_read_ud, DW_RegRead *reg_read_func,  void *reg_read_ud, DW_RegWrite *reg_write_func, void *reg_write_ud);\n\n#endif // DWARF_UNWIND_H\n\n"
  },
  {
    "path": "src/dwarf/eh_dump.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8List\neh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List strings = {0};\n#define dumpf(...) str8_list_pushf(arena, &strings, __VA_ARGS__)\n\n  EH_PtrCtx   ptr_ctx = { .data_vaddr = eh_frame_hdr_vaddr };\n  EH_FrameHdr hdr     = eh_parse_frame_hdr(eh_frame_hdr, byte_size_from_arch(arch), &ptr_ctx);\n  DW_Ext      ext     = DW_Ext_All;\n\n  if (subset_flags & EH_DumpSubsetFlag_EhFrameHdr) {\n    dumpf(\"eh_frame_hdr:\\n\");\n    dumpf(\"{\\n\");\n    dumpf(\"  version:          %u\\n\",   hdr.version);\n    dumpf(\"  eh_frame_ptr_enc: %S\\n\",   eh_string_from_ptr_enc(scratch.arena, hdr.eh_frame_ptr_enc));\n    dumpf(\"  table_enc:        %S\\n\",   eh_string_from_ptr_enc(scratch.arena, hdr.table_enc));\n    dumpf(\"  fde_count:        %llu\\n\", hdr.fde_count);\n    if (hdr.eh_frame_ptr_enc != EH_PtrEnc_Omit) {\n      dumpf(\"  eh_frame_ptr:     0x%I64x\\n\", hdr.eh_frame_ptr);\n    }\n\n    dumpf(\"  Entries:\\n\");\n    dumpf(\"  {\\n\");\n    for (U64 cursor = 0; cursor < hdr.table.size; ) {\n      U64 entry_off = cursor;\n\n      U64 pc      = 0;\n      U64 pc_size = eh_parse_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &pc);\n      if (pc_size == 0) { break; }\n      cursor += pc_size;\n\n      U64 fde_addr      = 0;\n      U64 fde_addr_size = eh_parse_ptr(hdr.table, cursor, cursor, &ptr_ctx, hdr.table_enc, &fde_addr);\n      if (fde_addr_size == 0) { break; }\n      cursor += fde_addr_size;\n\n      U64 fde_offset = fde_addr - eh_frame_vaddr;\n      dumpf(\"    { off=0x%04I64x, pc=0x%I64x, fde=0x%I64x }\\n\", entry_off, pc, fde_offset);\n    }\n    dumpf(\"  }\\n\");\n\n    dumpf(\"}\\n\");\n\n  }\n\n  if (subset_flags & EH_DumpSubsetFlag_EhFrame) {\n    dumpf(\".eh_frame:\\n\");\n    dumpf(\"{\\n\");\n    for (U64 cursor = 0; cursor < eh_frame.size; ) {\n      DW_DescriptorEntry desc = {0};\n      U64 desc_size = eh_parse_descriptor_entry_header(eh_frame, cursor, &desc);\n      if (desc_size == 0) { break; }\n      \n      switch (desc.type) {\n      case DW_DescriptorEntryType_Null: break;\n      case DW_DescriptorEntryType_CIE: {\n        String8 cie_data = str8_substr(eh_frame, desc.entry_range);\n        DW_CIE cie = {0};\n        if (eh_parse_cie(cie_data, desc.format, arch, eh_frame_vaddr + cursor, &ptr_ctx, &cie)) {\n          String8List init_insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, DW_Version_5, ext, cie.format, 0, &cie, eh_decode_ptr, &ptr_ctx, cie.insts);\n          dumpf(\"  CIE: // entry range: %r\\n\", desc.entry_range);\n          dumpf(\"  {\\n\");\n          dumpf(\"    Format:          %S\\n\",     dw_string_from_format(desc.format));\n          dumpf(\"    Version:         %u\\n\",     cie.version);\n          dumpf(\"    Aug string:      \\\"%S\\\"\\n\", cie.aug_string);\n          dumpf(\"    Code align:      %I64u\\n\",  cie.code_align_factor);\n          dumpf(\"    Data align:      %I64d\\n\",  cie.data_align_factor);\n          dumpf(\"    Return addr reg: %u\\n\",     cie.ret_addr_reg);\n          if (cie.version > DW_Version_3) {\n            dumpf(\"    Address size:          %u\\n\", cie.address_size);\n            dumpf(\"    Segment selector size: %u\\n\", cie.segment_selector_size);\n          }\n          dumpf(\"    Initial Insturction:\\n\");\n          dumpf(\"    {\\n\");\n          for EachNode(n, String8Node, init_insts_str_list.first) { dumpf(\"      %S\\n\", n->string); }\n          dumpf(\"    }\\n\");\n          dumpf(\"  }\\n\");\n        } else {\n          dumpf(\"ERROR: unable to parse CIE @ %I64x\\n\", desc.entry_range.min);\n        }\n      } break;\n      case DW_DescriptorEntryType_FDE: {\n        U64 cie_offset = desc.cie_pointer_off - desc.cie_pointer;\n\n        DW_CIE cie = {0};\n        {\n          DW_DescriptorEntry cie_desc = {0};\n          eh_parse_descriptor_entry_header(eh_frame, cie_offset, &cie_desc);\n          if (cie_desc.type == DW_DescriptorEntryType_CIE) {\n            String8 cie_data = str8_substr(eh_frame, cie_desc.entry_range);\n            eh_parse_cie(cie_data, cie_desc.format, arch, eh_frame_vaddr + cie_offset, &ptr_ctx, &cie);\n          }\n        }\n\n        String8 fde_raw = str8_substr(eh_frame, desc.entry_range);\n        DW_FDE  fde     = {0};\n        if (eh_parse_fde(fde_raw, desc.format, eh_frame_vaddr + cursor, &cie, &ptr_ctx, &fde)) {\n          String8List insts_str_list = dw_string_list_from_cfi_program(scratch.arena, 0, arch, hdr.version, ext, fde.format, 0, &cie, eh_decode_ptr, &ptr_ctx, fde.insts);\n\n          dumpf(\"  FDE: // entry range: %r\\n\", desc.entry_range);\n          dumpf(\"  {\\n\");\n          {\n            dumpf(\"    Format:      %S\\n\",      dw_string_from_format(fde.format));\n            dumpf(\"    CIE:         0x%I64x\\n\", cie_offset);\n            dumpf(\"    PC range:    %r\\n\",      fde.pc_range);\n            dumpf(\"    Instructions:\\n\");\n            dumpf(\"    {\\n\");\n            for EachNode(n, String8Node, insts_str_list.first) { dumpf(\"      %S\\n\", n->string); }\n            dumpf(\"    }\\n\");\n\n            dumpf(\"    Unwind:\\n\");\n            dumpf(\"    {\\n\");\n            DW_CFI_Unwind *cfi_unwind = dw_cfi_unwind_init(scratch.arena, arch, &cie, &fde, eh_decode_ptr, &ptr_ctx);\n            do {\n              String8 cfa_str     = dw_string_from_cfa(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row->cfa);\n              String8 cfi_row_str = dw_string_from_cfi_row(scratch.arena, arch, cie.address_size, hdr.version, ext, fde.format, cfi_unwind->row);\n              dumpf(\"      { PC: 0x%I64x, CFA: %-7S, Rules: { %S }\\n\", cfi_unwind->pc, cfa_str, cfi_row_str);\n            } while (dw_cfi_next_row(scratch.arena, cfi_unwind));\n          dumpf(\"    }\\n\");\n          }\n        } else {\n          dumpf(\"ERROR: unable to parse FDE @ %I64x\\n\", desc.entry_range.min);\n        }\n        dumpf(\"  }\\n\");\n      } break;\n      }\n\n      cursor += desc_size;\n    }\n    dumpf(\"}\\n\");\n  }\n\n#undef dumpf\n  scratch_end(scratch);\n  return strings;\n}\n\n"
  },
  {
    "path": "src/dwarf/eh_dump.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef EH_FRAME_DUMP_H\n#define EH_FRAME_DUMP_H\n\n////////////////////////////////\n//~ Dump Subset Types\n\n#define EH_DumpSubset_XList                    \\\n  X(EhFrameHdr, eh_frame_hdr, \".eh_frame_hdr\") \\\n  X(EhFrame,    eh_frame,     \".eh_frame\")\n\ntypedef enum EH_DumpSubset {\n#define X(name, name_lower, title) EH_DumpSubset_##name,\n  EH_DumpSubset_XList\n#undef X\n} EH_DumpSubset;\n\ntypedef U32 EH_DumpSubsetFlags;\nenum {\n#define X(name, name_lower, title) EH_DumpSubsetFlag_##name = (1<<EH_DumpSubset_##name),\n  EH_DumpSubset_XList\n#undef X\n  EH_DumpSubsetFlag_All = 0xffffffff,\n};\n\nread_only global String8 eh_name_lowercase_from_dump_subset_table[] =\n{\n#define X(name, name_lower, title) str8_lit_comp(#name_lower),\n  EH_DumpSubset_XList\n#undef X\n};\n\nread_only global String8 eh_name_title_from_dump_subset_table[] =\n{\n#define X(name, name_lower, title) str8_lit_comp(title),\n  EH_DumpSubset_XList\n#undef X\n};\n\n////////////////////////////////\n//~ Dump Entry Point\n\ninternal String8List eh_dump_list_from_data(Arena *arena, Arch arch, U64 eh_frame_hdr_vaddr, U64 eh_frame_vaddr, String8 eh_frame_hdr, String8 eh_frame, EH_DumpSubsetFlags subset_flags);\n\n#endif // EH_FRAME_DUMP_H\n\n"
  },
  {
    "path": "src/dwarf/eh_frame.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64\neh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out)\n{\n  U64 ptr_off = off;\n\n  if (encoding == EH_PtrEnc_Omit) {\n    return 0;\n  }\n\n  // align read offset as needed\n  if (encoding == EH_PtrEnc_Aligned) {\n    ptr_off  = AlignPow2(ptr_off, ptr_ctx->ptr_align);\n    encoding = EH_PtrEnc_Ptr;\n  }\n\n  // decode pointer value\n  U64 decode_size  = 0;\n  U64 raw_ptr_size = 0;\n  U64 raw_ptr      = 0;\n  switch (encoding & EH_PtrEnc_TypeMask) {\n  default: { InvalidPath; } break;\n  \n  case EH_PtrEnc_Ptr   : { raw_ptr_size = 8; } goto ufixed;\n  case EH_PtrEnc_UData2: { raw_ptr_size = 2; } goto ufixed;\n  case EH_PtrEnc_UData4: { raw_ptr_size = 4; } goto ufixed;\n  case EH_PtrEnc_UData8: { raw_ptr_size = 8; } goto ufixed;\n  ufixed: {\n    decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size);\n  } break;\n  \n  // TODO: Signed is actually just a flag that indicates this int is negavite.\n  // There shouldn't be a read for Signed.\n  // For instance, (EH_PtrEnc_UData2 | EH_PtrEnc_Signed) == EH_PtrEnc_SData etc.\n  case EH_PtrEnc_Signed: { raw_ptr_size = 8; } goto sfixed; \n  \n  case EH_PtrEnc_SData2: { raw_ptr_size = 2; } goto sfixed;\n  case EH_PtrEnc_SData4: { raw_ptr_size = 4; } goto sfixed;\n  case EH_PtrEnc_SData8: { raw_ptr_size = 8; } goto sfixed;\n  sfixed: {\n    decode_size += str8_deserial_read(frame_base, ptr_off, &raw_ptr, raw_ptr_size, raw_ptr_size);\n    raw_ptr = extend_sign64(raw_ptr, raw_ptr_size);\n  } break;\n  \n  case EH_PtrEnc_ULEB128: { decode_size += str8_deserial_read_uleb128(frame_base, ptr_off, &raw_ptr);       } break;\n  case EH_PtrEnc_SLEB128: { decode_size += str8_deserial_read_sleb128(frame_base, ptr_off, (S64*)&raw_ptr); } break;\n  }\n\n  // apply relative bases\n  if (decode_size > 0) {\n    U64 ptr = raw_ptr;\n    switch (encoding & EH_PtrEnc_ModifierMask) {\n    case 0: break;\n    case EH_PtrEnc_PcRel:   { ptr = pc + raw_ptr;                  } break;\n    case EH_PtrEnc_TextRel: { ptr = ptr_ctx->text_vaddr + raw_ptr; } break;\n    case EH_PtrEnc_DataRel: { ptr = ptr_ctx->data_vaddr + raw_ptr; } break;\n    case EH_PtrEnc_FuncRel: {\n      Assert(!\"TODO: need a sample to verify implementation\");\n      ptr = ptr_ctx->func_vaddr + raw_ptr;\n    } break;\n    default: { InvalidPath; } break;\n    }\n\n    if (ptr_out) {\n      *ptr_out = ptr;\n    }\n  }\n\n  return decode_size;\n}\n\ninternal EH_FrameHdr\neh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx)\n{\n  EH_FrameHdr header = {0};\n  U64 cursor = 0;\n\n  U64 version_size = str8_deserial_read_struct(data, cursor, &header.version);\n  if (version_size == 0) { goto exit; }\n  cursor += version_size;\n\n  if (header.version == 1) {\n    U64 eh_frame_ptr_enc_size = str8_deserial_read_struct(data, cursor, &header.eh_frame_ptr_enc);\n    if (eh_frame_ptr_enc_size == 0) { goto exit; }\n    cursor += eh_frame_ptr_enc_size;\n\n    U64 fde_count_enc_size = str8_deserial_read_struct(data, cursor, &header.fde_count_enc);\n    if (fde_count_enc_size == 0) { goto exit; }\n    cursor += fde_count_enc_size;\n\n    U64 table_enc_size = str8_deserial_read_struct(data, cursor, &header.table_enc);\n    if (table_enc_size == 0) { goto exit; }\n    cursor += table_enc_size;\n\n    cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.eh_frame_ptr_enc, &header.eh_frame_ptr);\n    cursor += eh_parse_ptr(data, cursor, cursor, ptr_ctx, header.fde_count_enc, &header.fde_count);\n\n    switch (header.table_enc & EH_PtrEnc_TypeMask) {\n    case EH_PtrEnc_Ptr:     { header.field_byte_size = address_size; } break;\n    case EH_PtrEnc_ULEB128: { InvalidPath;                           } break; // TODO: when loading module convert these to UData8\n    case EH_PtrEnc_UData2:  { header.field_byte_size = 2;            } break;\n    case EH_PtrEnc_UData4:  { header.field_byte_size = 4;            } break;\n    case EH_PtrEnc_UData8:  { header.field_byte_size = 8;            } break;\n    case EH_PtrEnc_Signed:  { header.field_byte_size = address_size; } break;\n    case EH_PtrEnc_SLEB128: { InvalidPath;                           } break; // TODO: when loading module convert these to UData8\n    case EH_PtrEnc_SData2:  { header.field_byte_size = 2;            } break;\n    case EH_PtrEnc_SData4:  { header.field_byte_size = 4;            } break;\n    case EH_PtrEnc_SData8:  { header.field_byte_size = 8;            } break;\n    default: { InvalidPath; } break;\n    }\n    header.entry_byte_size = header.field_byte_size * 2;\n\n    header.table = str8_skip(data, cursor);\n    AssertAlways(header.table.size == header.entry_byte_size * header.fde_count);\n  } else {\n    Assert(0 && \"unknown version\");\n  }\n\nexit:;\n  return header;\n}\n\ninternal U64\neh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out)\n{\n  // TODO: \n  // Handle \"eh\" param, it indicates presence of EH Data field.\n  // On 32bit arch it is a 4-byte and on 64-bit 8-byte value.\n  // Reference: https://refspecs.linuxfoundation.org/LSB_3.0.0/LSB-PDA/LSB-PDA/ehframechpt.html\n  // Reference doc doesn't clarify structure for EH Data though\n\n  U64 cursor = 0;\n\n  U64         aug_data_size    = 0;\n  EH_AugFlags aug_flags        = 0;\n  EH_PtrEnc   lsda_encoding    = EH_PtrEnc_Omit;\n  EH_PtrEnc   addr_encoding    = EH_PtrEnc_UData8;\n  EH_PtrEnc   handler_encoding = EH_PtrEnc_Omit;\n  U64         handler_ip       = 0;\n  if (str8_match(str8_prefix(aug_string, 1), str8_lit(\"z\"), 0)) {\n    cursor = str8_deserial_read_uleb128(aug_data, cursor, &aug_data_size);\n\n    for (U8 *ptr = aug_string.str+1; ptr < (aug_string.str+aug_string.size); ptr += 1) {\n      switch (*ptr) {\n      case 'L': {\n        cursor += str8_deserial_read_struct(aug_data, cursor, &lsda_encoding);\n        aug_flags |= EH_AugFlag_HasLSDA;\n      } break;\n      case 'P': {\n        cursor += str8_deserial_read_struct(aug_data, cursor, &handler_encoding);\n        cursor += eh_parse_ptr(aug_data, cursor, pc + cursor, ptr_ctx, handler_encoding, &handler_ip);\n        aug_flags |= EH_AugFlag_HasHandler;\n      } break;\n      case 'R': {\n        cursor += str8_deserial_read_struct(aug_data, cursor, &addr_encoding);\n        aug_flags |= EH_AugFlag_HasAddrEnc;\n      } break;\n      case 'S': {\n        aug_flags |= EH_AugFlag_SignalFrame;\n      } break;\n      default: { Assert(!\"failed to parse augmentation string\"); goto exit; } break;\n      }\n    }\n  }\n\n  if (aug_out) {\n    aug_out->handler_ip       = handler_ip;\n    aug_out->handler_encoding = handler_encoding;\n    aug_out->lsda_encoding    = handler_encoding;\n    aug_out->addr_encoding    = addr_encoding;\n    aug_out->flags            = aug_flags;\n    aug_out->size             = aug_data_size;\n  }\n\nexit:;\n  U64 parse_size = cursor; \n  return parse_size;\n}\n\ninternal U64\neh_parse_descriptor_entry_header(String8 data, U64 off, DW_DescriptorEntry *desc_out)\n{\n  U32 first_four_bytes = 0;\n  str8_deserial_read_struct(data, off, &first_four_bytes);\n  DW_Format format = first_four_bytes == max_U32 ? DW_Format_64Bit : DW_Format_32Bit;\n\n  U64 length      = 0;\n  U64 length_size = str8_deserial_read_dwarf_packed_size(data, off, &length);\n  if (length_size == 0) { goto exit; }\n\n  Rng1U64 entry_range = rng_1u64(off, off + length_size + length);\n  String8 entry_data  = str8_substr(data, entry_range);\n  U64 id = 0;\n  U64 id_size = str8_deserial_read_dwarf_uint(entry_data, length_size, format, &id);\n  if (id_size == 0) { goto exit; }\n\n  desc_out->format          = format;\n  desc_out->type            = (id == 0) ? DW_DescriptorEntryType_CIE : DW_DescriptorEntryType_FDE;\n  desc_out->entry_range     = entry_range;\n  desc_out->cie_pointer     = id;\n  desc_out->cie_pointer_off = off + length_size;\n\nexit:;\n  return length + length_size;\n}\n\ninternal B32\neh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out)\n{\n  B32 is_parsed = 0;\n  U64 cursor    = format == DW_Format_32Bit ? 4 : 12;\n\n  U64 cie_id      = 0;\n  U64 cie_id_size = str8_deserial_read_dwarf_uint(data, cursor, format, &cie_id);\n  if (cie_id_size == 0) { goto exit; }\n  cursor += cie_id_size;\n\n  U8  version      = 0;\n  U64 version_size = str8_deserial_read_struct(data, cursor, &version);\n  if (version_size == 0) { goto exit; }\n  cursor += version_size;\n\n  String8         aug_string        = {0};\n  String8         aug_data          = {0};\n  EH_Augmentation aug               = {0};\n  U64             code_align_factor = 0;\n  S64             data_align_factor = 0;\n  U64             ret_addr_reg      = max_U64;\n  if (version == 1) {\n    U64 aug_string_size = str8_deserial_read_cstr(data, cursor, &aug_string);\n    if (aug_string_size == 0) { goto exit; }\n    cursor += aug_string_size;\n\n    U64 eh_data = 0;\n    if (str8_match(aug_string, str8_lit(\"eh\"), 0)) {\n      U64 arch_byte_size = byte_size_from_arch(arch);\n      cursor += str8_deserial_read(data, cursor, &eh_data, arch_byte_size, arch_byte_size);\n    }\n\n    U64 code_align_factor_size = str8_deserial_read_uleb128(data, cursor, &code_align_factor);\n    if (code_align_factor_size == 0) { goto exit; }\n    cursor += code_align_factor_size;\n\n    U64 data_align_factor_size = str8_deserial_read_sleb128(data, cursor, &data_align_factor);\n    if (data_align_factor_size == 0) { goto exit; }\n    cursor += data_align_factor_size;\n\n    ret_addr_reg = 0;\n    U64 ret_addr_reg_size = str8_deserial_read(data, cursor, &ret_addr_reg, sizeof(U8), sizeof(U8));\n    if (ret_addr_reg_size == 0) { goto exit; }\n    cursor += ret_addr_reg_size;\n\n    U64 aug_data_size = eh_parse_aug_data(aug_string, str8_skip(data, cursor), pc + cursor, ptr_ctx, &aug);\n    aug_data = str8_substr(data, r1u64(cursor, cursor + aug.size));\n    cursor += aug_data_size;\n  } else {\n    Assert(0 && \"unexpected version\");\n  }\n\n  cie_out->insts                 = str8_skip(data, cursor);\n  cie_out->aug_string            = aug_string;\n  cie_out->aug_data              = aug_data;\n  cie_out->code_align_factor     = code_align_factor;\n  cie_out->data_align_factor     = data_align_factor;\n  cie_out->ret_addr_reg          = ret_addr_reg;\n  cie_out->format                = format;\n  cie_out->version               = version;\n  cie_out->address_size          = byte_size_from_arch(arch);\n  cie_out->segment_selector_size = 0;\n\n  cie_out->ext[EH_CIE_Ext_LSDAEnc]    = EH_PtrEnc_Omit;\n  cie_out->ext[EH_CIE_Ext_AddrEnc]    = EH_PtrEnc_Omit;\n  cie_out->ext[EH_CIE_Ext_HandlerEnc] = EH_PtrEnc_Omit;\n\n  if (aug.flags & EH_AugFlag_HasLSDA) {\n    cie_out->ext[EH_CIE_Ext_LSDAEnc] = aug.lsda_encoding;\n  }\n  if (aug.flags & EH_AugFlag_HasAddrEnc) {\n    cie_out->ext[EH_CIE_Ext_AddrEnc] = aug.addr_encoding;\n  }\n  if (aug.flags & EH_AugFlag_HasHandler) {\n    cie_out->ext[EH_CIE_Ext_HandlerEnc] = aug.handler_encoding;\n    cie_out->ext[EH_CIE_Ext_HandlerIp ] = aug.handler_ip;\n  }\n\n  is_parsed = 1;\nexit:;\n  return is_parsed;\n}\n\ninternal B32\neh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out)\n{\n  B32 is_parsed = 0;\n  U64 cursor    = format == DW_Format_32Bit ? 8 : 20;\n\n  U64       pc_begin = 0;\n  U64       pc_delta = 0;\n  EH_PtrEnc addr_enc = cie->ext[EH_CIE_Ext_AddrEnc];\n  if (addr_enc != EH_PtrEnc_Omit) {\n    U64 pc_begin_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc, &pc_begin);\n    if (pc_begin_size == 0) { goto exit; }\n    cursor += pc_begin_size;\n\n    U64 pc_delta_size = eh_parse_ptr(data, cursor, pc + cursor, ptr_ctx, addr_enc & EH_PtrEnc_TypeMask, &pc_delta);\n    if (pc_delta_size == 0) { goto exit; }\n    cursor += pc_delta_size;\n  }\n\n  if (cursor + cie->aug_data.size > data.size) { goto exit; }\n  cursor += cie->aug_data.size;\n\n  fde_out->format   = format;\n  fde_out->pc_range = rng_1u64(pc_begin, pc_begin + pc_delta);\n  fde_out->insts    = str8_skip(data, cursor);\n\n  is_parsed = 1;\nexit:;\n  return is_parsed;\n}\n\ninternal U64\neh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc)\n{\n  U64 fde_addr = max_U64;\n  U64 fde_idx  = max_U64;\n\n  if (header.version == 1) {\n    if (header.fde_count > 0) {\n      U64 first = 0;\n      U64 first_size = eh_parse_ptr(header.table, 0, ptr_ctx->pc_vaddr, ptr_ctx, header.table_enc, &first);\n      AssertAlways(first_size);\n      if (first == pc) {\n        fde_idx = 0;\n        goto exit;\n      }\n      if (first > pc) {\n        goto exit;\n      }\n\n      U64 last_off  = header.table.size - header.entry_byte_size;\n      U64 last      = 0;\n      U64 last_size = eh_parse_ptr(header.table, last_off, ptr_ctx->pc_vaddr + last_off, ptr_ctx, header.table_enc, &last);\n      AssertAlways(last_size);\n      if (last <= pc) {\n        fde_idx = header.fde_count - 1;\n        goto exit;\n      }\n\n      U64 l = 0;\n      U64 r = header.fde_count - 1;\n      while (l <= r) {\n        U64 m         = l + (r - l) / 2;\n        U64 m_pc_off  = m * header.entry_byte_size;\n        U64 m_pc      = 0;\n        U64 m_pc_size = eh_parse_ptr(header.table, m_pc_off, ptr_ctx->pc_vaddr + m_pc_off, ptr_ctx, header.table_enc, &m_pc);\n        Assert(m_pc_size);\n        if (m_pc > pc) {\n          r = m - 1;\n        } else if (m_pc < pc) {\n          l = m + 1;\n        } else {\n          fde_idx = m;\n          goto exit;\n        }\n      }\n\n      fde_idx = l > 0 ? l-1 : 0;\n    }\n  }\n\nexit:;\n  if (fde_idx < header.fde_count) {\n    U64 fde_addr_off  = (fde_idx * header.entry_byte_size) + header.field_byte_size;\n    U64 fde_addr_size = eh_parse_ptr(header.table, fde_addr_off, ptr_ctx->pc_vaddr + fde_addr_off, ptr_ctx, header.table_enc, &fde_addr);\n    Assert(fde_addr_size);\n  }\n  return fde_addr;\n}\n\ninternal int\neh_frame_hdr_entry_sort(void *raw_a, void *raw_b)\n{\n  return ((EH_FrameHdrEntry *)raw_a)->addr < ((EH_FrameHdrEntry *)raw_b)->addr;\n}\n\ninternal String8\neh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, DW_FDE *fde)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  // make .eh_frame_hdr\n  String8List srl = {0};\n  str8_serial_begin(scratch.arena, &srl);\n  str8_serial_push_u8(scratch.arena, &srl, 1);                // version\n  str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_Omit);   // omit eh_frame_ptr field\n  str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // fde_count encoding\n  str8_serial_push_u8(scratch.arena, &srl, EH_PtrEnc_UData8); // table encoding\n  str8_serial_push_u64(scratch.arena, &srl, fde_count);   // fde_count\n  String8 header = str8_serial_end(scratch.arena, &srl);\n\n  // alloc buffer for output\n  U64 buffer_size = header.size + sizeof(EH_FrameHdrEntry) * fde_count;\n  U8 *buffer      = push_array(arena, U8, buffer_size);\n\n  // copy header\n  MemoryCopyStr8(buffer, header);\n\n  // write the table\n  EH_FrameHdrEntry *table = (EH_FrameHdrEntry *)(buffer + header.size);\n  for EachIndex(fde_idx, fde_count) {\n    table[fde_idx].addr       = fde[fde_idx].pc_range.min;\n    table[fde_idx].fde_offset = fde_offsets[fde_idx];\n  }\n  radsort(table, fde_count, eh_frame_hdr_entry_sort);\n\n  String8 eh_frame_hdr = str8(buffer, buffer_size);\n  scratch_end(scratch);\n  return eh_frame_hdr;\n}\n\ninternal\nDW_DECODE_PTR(eh_decode_ptr)\n{\n  EH_DecodePtrCtx *ctx = ud;\n  return eh_parse_ptr(data, 0, ctx->ptr_ctx->pc_vaddr, ctx->ptr_ctx, ctx->addr_enc, ptr_out);\n}\n\ninternal String8\neh_string_from_ptr_enc_type(EH_PtrEnc type)\n{\n  switch (type) {\n  case EH_PtrEnc_Ptr:     return str8_lit(\"Ptr\");\n  case EH_PtrEnc_ULEB128: return str8_lit(\"ULEB128\");\n  case EH_PtrEnc_UData2:  return str8_lit(\"UData2\");\n  case EH_PtrEnc_UData4:  return str8_lit(\"UData4\");\n  case EH_PtrEnc_UData8:  return str8_lit(\"UData8\");\n  case EH_PtrEnc_Signed:  return str8_lit(\"Signed\");\n  case EH_PtrEnc_SLEB128: return str8_lit(\"SLEB128\");\n  case EH_PtrEnc_SData2:  return str8_lit(\"SData2\");\n  case EH_PtrEnc_SData4:  return str8_lit(\"SData4\");\n  case EH_PtrEnc_SData8:  return str8_lit(\"SData8\");\n  }\n  return str8_zero();\n}\n\ninternal String8\neh_string_from_ptr_enc_modifier(EH_PtrEnc modifier)\n{\n  switch (modifier) {\n  case EH_PtrEnc_PcRel:   return str8_lit(\"PcRel\");\n  case EH_PtrEnc_TextRel: return str8_lit(\"TextRel\");\n  case EH_PtrEnc_DataRel: return str8_lit(\"DataRel\");\n  case EH_PtrEnc_FuncRel: return str8_lit(\"FuncRel\");\n  case EH_PtrEnc_Aligned: return str8_lit(\"Aligned\");\n  }\n  return str8_zero();\n}\n\ninternal String8\neh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc)\n{\n  String8 type_str    = eh_string_from_ptr_enc_type(enc & EH_PtrEnc_TypeMask);\n  String8 modifer_str = eh_string_from_ptr_enc_modifier(enc & EH_PtrEnc_ModifierMask);\n  String8 indir_str   = enc & EH_PtrEnc_Indirect ? str8_lit(\"Indirect\") : str8_zero();\n  String8 result      = str8f(arena, \"Type: %S, Modifier %S (%S)\", type_str, modifer_str, indir_str);\n  return result;\n}\n"
  },
  {
    "path": "src/dwarf/eh_frame.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef EH_FRAME_H\n#define EH_FRAME_H\n\n////////////////////////////////\n//~ Format\n\ntypedef U8 EH_PtrEnc;\nenum\n{\n  EH_PtrEnc_Ptr     = 0x00, // Pointer sized unsigned value\n  EH_PtrEnc_ULEB128 = 0x01, // Unsigned LE base-128 value\n  EH_PtrEnc_UData2  = 0x02, // Unsigned 16-bit value\n  EH_PtrEnc_UData4  = 0x03, // Unsigned 32-bit value\n  EH_PtrEnc_UData8  = 0x04, // Unsigned 64-bit value\n  EH_PtrEnc_Signed  = 0x08, // Signed pointer\n  EH_PtrEnc_SLEB128 = 0x09, // Signed LE base-128 value\n  EH_PtrEnc_SData2  = 0x0A, // Signed 16-bit value\n  EH_PtrEnc_SData4  = 0x0B, // Signed 32-bit value\n  EH_PtrEnc_SData8  = 0x0C, // Signed 64-bit value\n \n  EH_PtrEnc_TypeMask = 0x0F,\n};\n\nenum\n{\n  EH_PtrEnc_PcRel   = 0x10, // Value is relative to the current program counter.\n  EH_PtrEnc_TextRel = 0x20, // Value is relative to the .text section.\n  EH_PtrEnc_DataRel = 0x30, // Value is relative to the .got or .eh_frame_hdr section.\n  EH_PtrEnc_FuncRel = 0x40, // Value is relative to the function.\n  EH_PtrEnc_Aligned = 0x50, // Value is aligned to an address unit sized boundary.\n                                 \n  EH_PtrEnc_ModifierMask = 0x70,\n};\n\nenum\n{\n  EH_PtrEnc_Indirect = 0x80, // Value is stored in virtual memory.\n  EH_PtrEnc_Omit     = 0xFF,\n};\n\ntypedef struct EH_PtrCtx\n{\n  U64 pc_vaddr;   // address where pointer is being read\n  U64 text_vaddr; // base address of section with instructions (used for encoding pointer on SH and IA64)\n  U64 data_vaddr; // base address of data section (used for encoding pointer on x86-64)\n  U64 func_vaddr; // base address of function where IP is located\n  U64 ptr_align;\n} EH_PtrCtx;\n\ntypedef U8 EH_AugFlags;\nenum\n{\n  EH_AugFlag_HasLSDA     = (1 << 0),\n  EH_AugFlag_HasHandler  = (1 << 1),\n  EH_AugFlag_HasAddrEnc  = (1 << 2),\n  EH_AugFlag_SignalFrame = (1 << 3),\n};\n\ntypedef struct EH_Augmentation\n{\n  EH_AugFlags flags;\n  U64         handler_ip;\n  EH_PtrEnc   handler_encoding;\n  EH_PtrEnc   lsda_encoding;\n  EH_PtrEnc   addr_encoding;\n  U64         size;\n} EH_Augmentation;\n\n////////////////////////////////\n//~ Parser\n\nenum\n{\n  EH_CIE_Ext_AddrEnc,\n  EH_CIE_Ext_LSDAEnc,\n  EH_CIE_Ext_HandlerEnc,\n  EH_CIE_Ext_HandlerIp,\n} EH_CIE_Ext;\n\ntypedef struct EH_FrameHdrEntry\n{\n  U64 addr;\n  U64 fde_offset;\n} EH_FrameHdrEntry;\n\ntypedef struct EH_FrameHdr\n{\n  U8        version;\n  EH_PtrEnc eh_frame_ptr_enc;\n  EH_PtrEnc fde_count_enc;\n  EH_PtrEnc table_enc;\n  U64       field_byte_size;\n  U64       entry_byte_size;\n  U64       fde_count;\n  U64       eh_frame_ptr;\n  String8   table;\n} EH_FrameHdr;\n\ntypedef struct EH_DecodePtrCtx\n{\n  EH_PtrEnc  addr_enc;\n  EH_PtrCtx *ptr_ctx;\n} EH_DecodePtrCtx;\n   \n////////////////////////////////\n\ninternal U64         eh_parse_ptr(String8 frame_base, U64 off, U64 pc, EH_PtrCtx *ptr_ctx, EH_PtrEnc encoding, U64 *ptr_out);\ninternal EH_FrameHdr eh_parse_frame_hdr(String8 data, U64 address_size, EH_PtrCtx *ptr_ctx);\ninternal U64         eh_parse_aug_data(String8 aug_string, String8 aug_data, U64 pc, EH_PtrCtx *ptr_ctx, EH_Augmentation *aug_out);\ninternal B32         eh_parse_cie(String8 data, DW_Format format, Arch arch, U64 pc, EH_PtrCtx *ptr_ctx, DW_CIE *cie_out);\ninternal B32         eh_parse_fde(String8 data, DW_Format format, U64 pc, DW_CIE *cie, EH_PtrCtx *ptr_ctx, DW_FDE *fde_out);\ninternal U64         eh_find_nearest_fde(EH_FrameHdr header, EH_PtrCtx *ptr_ctx, U64 pc);\ninternal String8     eh_frame_hdr_from_call_frame_info(Arena *arena, U64 fde_count, U64 *fde_offsets, struct DW_FDE *fde);\n\n////////////////////////////////\n//~ Enum -> String\n\ninternal String8 eh_string_from_ptr_enc_type(EH_PtrEnc type);\ninternal String8 eh_string_from_ptr_enc_modifier(EH_PtrEnc modifier);\ninternal String8 eh_string_from_ptr_enc(Arena *arena, EH_PtrEnc enc);\n\n#endif // EH_FRAME_H\n\n"
  },
  {
    "path": "src/elf/elf.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: 32 => 64 bit conversions\n\ninternal ELF_Hdr64\nelf_hdr64_from_hdr32(ELF_Hdr32 h32)\n{\n  ELF_Hdr64 h64  = {0};\n  MemoryCopy(h64.e_ident, h32.e_ident, sizeof(h64.e_ident));\n  h64.e_type      = h32.e_type;\n  h64.e_machine   = h32.e_machine;\n  h64.e_version   = h32.e_version;\n  h64.e_entry     = (U64)h32.e_entry;\n  h64.e_phoff     = (U64)h32.e_phoff;\n  h64.e_shoff     = (U64)h32.e_shoff;\n  h64.e_flags     = h32.e_flags;\n  h64.e_ehsize    = h32.e_ehsize;\n  h64.e_phentsize = h32.e_phentsize;\n  h64.e_phnum     = h32.e_phnum;\n  h64.e_shentsize = h32.e_shentsize;\n  h64.e_shnum     = h32.e_shnum;\n  h64.e_shstrndx  = h32.e_shstrndx;\n  return h64;\n}\n\ninternal ELF_Shdr64\nelf_shdr64_from_shdr32(ELF_Shdr32 h32)\n{\n  ELF_Shdr64 h64   = {0};\n  h64.sh_name      = h32.sh_name;\n  h64.sh_type      = h32.sh_type;\n  h64.sh_flags     = (U64)h32.sh_flags;\n  h64.sh_addr      = (U64)h32.sh_addr;\n  h64.sh_offset    = (U64)h32.sh_offset;\n  h64.sh_size      = (U64)h32.sh_size;\n  h64.sh_link      = h32.sh_link;\n  h64.sh_info      = h32.sh_info;\n  h64.sh_addralign = (U64)h32.sh_addralign;\n  h64.sh_entsize   = (U64)h32.sh_entsize;\n  return h64;\n}\n\ninternal ELF_Phdr64\nelf_phdr64_from_phdr32(ELF_Phdr32 h32)\n{\n  ELF_Phdr64 h64 = {0};\n  h64.p_type     = h32.p_type;\n  h64.p_flags    = h32.p_flags;\n  h64.p_offset   = (U64)h32.p_offset;\n  h64.p_vaddr    = (U64)h32.p_vaddr;\n  h64.p_paddr    = (U64)h32.p_paddr;\n  h64.p_filesz   = (U64)h32.p_filesz;\n  h64.p_memsz    = (U64)h32.p_memsz;\n  h64.p_align    = (U64)h32.p_align;\n  return h64;\n}\n\ninternal ELF_Dyn64\nelf_dyn64_from_dyn32(ELF_Dyn32 h32)\n{\n  ELF_Dyn64 h64 = {0};\n  h64.tag       = (U64)h32.tag;\n  h64.val       = (U64)h32.val;\n  return h64;\n}\n\ninternal ELF_Sym64\nelf_sym64_from_sym32(ELF_Sym32 sym32)\n{\n  ELF_Sym64 sym64 = {0};\n  sym64.st_name   = sym32.st_name;\n  sym64.st_value  = sym32.st_value;\n  sym64.st_size   = sym32.st_size;\n  sym64.st_info   = sym32.st_info;\n  sym64.st_other  = sym32.st_other;\n  sym64.st_shndx  = sym32.st_shndx;\n  return sym64;\n}\n\ninternal ELF_Rel64\nelf_rel64_from_rel32(ELF_Rel32 rel32)\n{\n  U32 sym  = ELF32_R_SYM(rel32.r_info);\n  U32 type = ELF32_R_TYPE(rel32.r_info);\n  ELF_Rel64 rel64 = {0};\n  rel64.r_info    = ELF64_R_INFO(sym, type);\n  rel64.r_offset  = rel32.r_offset;\n  return rel64;\n}\n\ninternal ELF_Rela64\nelf_rela64_from_rela32(ELF_Rela32 rela32)\n{\n  U32 sym  = ELF32_R_SYM(rela32.r_info);\n  U32 type = ELF32_R_TYPE(rela32.r_info);\n  ELF_Rela64 rela64 = {0};\n  rela64.r_offset   = rela32.r_info;\n  rela64.r_info     = ELF64_R_INFO(sym, type);\n  rela64.r_addend   = rela32.r_addend;\n  return rela64;\n}\n\ninternal ELF_Chdr64\nelf_chdr64_from_chdr32(ELF_Chdr32 chdr32)\n{\n  ELF_Chdr64 chdr64    = {0};\n  chdr64.ch_type       = chdr32.ch_type;\n  chdr64.ch_size       = chdr32.ch_size;\n  chdr64.ch_addr_align = chdr32.ch_addr_align;\n  return chdr64;\n}\n\ninternal ELF_Auxv64\nelf_auxv64_from_auxv32(ELF_Auxv32 auxv32)\n{\n  ELF_Auxv64 auxv64 = {0};\n  auxv64.a_type = auxv32.a_type;\n  auxv64.a_val  = auxv32.a_val;\n  return auxv64;\n}\n\n////////////////////////////////\n\ninternal String8\nelf_string_from_class(Arena *arena, ELF_Class v)\n{\n  switch (v) {\n  case ELF_Class_None: return str8_lit(\"None\");\n  case ELF_Class_32:   return str8_lit(\"32Bit\");\n  case ELF_Class_64:   return str8_lit(\"64Bit\");\n  }\n  return push_str8f(arena, \"%#x\", v);\n}\n\n////////////////////////////////\n\ninternal Arch\narch_from_elf_machine(ELF_MachineKind e_machine)\n{\n  Arch arch = Arch_Null;\n  switch (e_machine) {\n  case ELF_MachineKind_None:    arch = Arch_Null;  break;\n  case ELF_MachineKind_AARCH64: arch = Arch_arm32; break;\n  case ELF_MachineKind_ARM:     arch = Arch_arm32; break;\n  case ELF_MachineKind_386:     arch = Arch_x86;   break;\n  case ELF_MachineKind_X86_64:  arch = Arch_x64;   break;\n  default: NotImplemented; break;\n  }\n  return arch;\n}\n\n////////////////////////////////\n\ninternal U64\nelf_phdr_size_from_class(ELF_Class elf_class)\n{\n  U64 result = 0;\n  switch (elf_class) {\n  case ELF_Class_None: break;\n  case ELF_Class_32: { result = sizeof(ELF_Phdr32); } break;\n  case ELF_Class_64: { result = sizeof(ELF_Phdr64); } break;\n  default: { NotImplemented; } break;\n  }\n  return result;\n}\n\ninternal U64\nelf_dyn_size_from_class(ELF_Class elf_class)\n{\n  U64 result = 0;\n  switch (elf_class) {\n  case ELF_Class_None: break;\n  case ELF_Class_32: { result = sizeof(ELF_Dyn32); } break;\n  case ELF_Class_64: { result = sizeof(ELF_Dyn64); } break;\n  default: { NotImplemented; } break;\n  }\n  return result;\n}\n\n"
  },
  {
    "path": "src/elf/elf.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef ELF_H\n#define ELF_H\n\ntypedef U8 ELF_Class;\nenum\n{\n  ELF_Class_None  = 0,\n  ELF_Class_32    = 1,\n  ELF_Class_64    = 2,\n  ELF_Class_Count = 3\n};\n\ntypedef U8 ELF_OsAbi;\nenum\n{\n  ELF_OsAbi_None,\n  ELF_OsAbi_SYSV,\n  ELF_OsAbi_HPUX,\n  ELF_OsAbi_NETBSD,\n  ELF_OsAbi_GNU,\n  ELF_OsAbi_LINUX,\n  ELF_OsAbi_SOLARIS,\n  ELF_OsAbi_IRIX,\n  ELF_OsAbi_FREEBSD,\n  ELF_OsAbi_TRU64,\n  ELF_OsAbi_ARM = 97,\n  ELF_OsAbi_STANDALONE = 255,\n};\n\ntypedef U8 ELF_Version;\nenum\n{\n  ELF_Version_None,\n  ELF_Version_Current,\n};\n\ntypedef U16 ELF_MachineKind;\nenum\n{\n  ELF_MachineKind_None        = 0,\n  ELF_MachineKind_M32         = 1,\n  ELF_MachineKind_SPARC       = 2,\n  ELF_MachineKind_386         = 3,\n  ELF_MachineKind_68K         = 4,\n  ELF_MachineKind_88K         = 5,\n  ELF_MachineKind_IAMCU       = 6,\n  ELF_MachineKind_860         = 7,\n  ELF_MachineKind_MIPS        = 8,\n  ELF_MachineKind_S370        = 9,\n  ELF_MachineKind_MIPS_RS3_LE = 10,\n  //  11-14 reserved\n  ELF_MachineKind_PARISC      = 15,\n  //  16 reserved\n  ELF_MachineKind_VPP500      = 17,\n  ELF_MachineKind_SPARC32PLUS = 18,\n  //  nick: Sun's \"v8plus\"\n  ELF_MachineKind_INTEL960    = 19,\n  ELF_MachineKind_PPC         = 20,\n  ELF_MachineKind_PPC64       = 21,\n  ELF_MachineKind_S390        = 22,\n  ELF_MachineKind_SPU         = 23,\n  //  24-35 reserved\n  ELF_MachineKind_V800        = 36,\n  ELF_MachineKind_FR20        = 37,\n  ELF_MachineKind_RH32        = 38,\n  ELF_MachineKind_MCORE       = 39,\n  ELF_MachineKind_ARM         = 40,\n  ELF_MachineKind_SH          = 42,\n  ELF_MachineKind_ALPHA       = 41,\n  ELF_MachineKind_SPARCV9     = 43,\n  ELF_MachineKind_TRICORE     = 44,\n  ELF_MachineKind_ARC         = 45,\n  ELF_MachineKind_H8_300      = 46,\n  ELF_MachineKind_H8_300H     = 47,\n  ELF_MachineKind_H8S         = 48,\n  ELF_MachineKind_H8_500      = 49,\n  ELF_MachineKind_IA_64       = 50,\n  ELF_MachineKind_MIPS_X      = 51,\n  ELF_MachineKind_COLDFILE    = 52,\n  ELF_MachineKind_68HC12      = 53,\n  ELF_MachineKind_MMA         = 54,\n  ELF_MachineKind_PCP         = 55,\n  ELF_MachineKind_NCPU        = 56,\n  ELF_MachineKind_NDR1        = 57,\n  ELF_MachineKind_STARCORE    = 58,\n  ELF_MachineKind_ME16        = 59,\n  ELF_MachineKind_ST100       = 60,\n  ELF_MachineKind_TINYJ       = 61,\n  ELF_MachineKind_X86_64      = 62,\n  ELF_MachineKind_AARCH64     = 183,\n  ELF_MachineKind_TI_C6000    = 140,\n  ELF_MachineKind_L1OM        = 180,\n  ELF_MachineKind_K1OM        = 181,\n  ELF_MachineKind_RISCV       = 243,\n  ELF_MachineKind_S390_OLD    = 0xA390,\n};\n\ntypedef U8 ELF_Data;\nenum\n{\n  ELF_Data_None = 0,\n  ELF_Data_2LSB = 1,\n  ELF_Data_2MSB = 2,\n};\n\ntypedef U16 ELF_Type;\nenum\n{\n  ELF_Type_None   = 0,\n  ELF_Type_Rel    = 1,\n  ELF_Type_Exec   = 2,\n  ELF_Type_Dyn    = 3,\n  ELF_Type_Core   = 4,\n  ELF_Type_LoOs   = 0xfe00,\n  ELF_Type_HiOs   = 0xff00,\n  ELF_Type_LoProc = 0xff00,\n  ELF_Type_HiProc = 0xffff\n};\n\ntypedef U32 ELF_PType;\nenum\n{\n  ELF_PType_Null        = 0,\n  ELF_PType_Load        = 1,\n  ELF_PType_Dynamic     = 2,\n  ELF_PType_Interp      = 3,\n  ELF_PType_Note        = 4,\n  ELF_PType_ShLib       = 5,\n  ELF_PType_PHdr        = 6,\n  ELF_PType_Tls         = 7,\n  ELF_PType_LoOs        = 0x60000000,\n  ELF_PType_HiOs        = 0x6fffffff,\n  \n  ELF_PType_LowProc     = 0x70000000,\n  ELF_PType_HighProc    = 0x7fffffff,\n  \n  ELF_PType_GnuEHFrame  = ELF_PType_LoOs + 0x474E550, // segment with .eh_frame_hdr\n  ELF_PType_GnuStack    = ELF_PType_LoOs + 0x474e551, // frame unwind information\n  ELF_PType_GnuRelro    = ELF_PType_LoOs + 0x474e552, // stack flags\n  ELF_PType_GnuProperty = ELF_PType_LoOs + 0x474e553, // read-only after relocations\n};\n\ntypedef U32 ELF_PFlag;\nenum\n{\n  ELF_PFlag_Exec  = (1 << 0),\n  ELF_PFlag_Write = (1 << 1),\n  ELF_PFlag_Read  = (1 << 2),\n};\n\ntypedef U32 ELF_ShType;\nenum\n{\n  ELF_ShType_Null                   = 0,\n  ELF_ShType_ProgBits               = 1,\n  ELF_ShType_Symtab                 = 2,\n  ELF_ShType_Strtab                 = 3,\n  ELF_ShType_Rela                   = 4,\n  ELF_ShType_Hash                   = 5,\n  ELF_ShType_Dynamic                = 6,\n  ELF_ShType_Note                   = 7,\n  ELF_ShType_NoBits                 = 8,\n  ELF_ShType_Rel                    = 9,\n  ELF_ShType_Shlib                  = 10,\n  ELF_ShType_Dynsym                 = 11,\n  ELF_ShType_InitArray              = 14,\n  ELF_ShType_FiniArray              = 15,         // Array of ptrs to init functions\n  ELF_ShType_PreinitArray           = 16,         // Array of ptrs to finish functions\n  ELF_ShType_Group                  = 17,         // Array of ptrs to pre-init funcs\n  ELF_ShType_SymtabShndx            = 18,         // Section contains a section group\n  \n  ELF_ShType_GNU_IncrementalInputs  = 0x6fff4700, // Indices for SHN_XINDEX entries\n  ELF_ShType_GNU_Attributes         = 0x6ffffff5, // Incremental build data\n  ELF_ShType_GNU_Hash               = 0x6ffffff6, // Object attributes\n  ELF_ShType_GNU_LibList            = 0x6ffffff7, // GNU style symbol hash table\n  \n  ELF_ShType_SUNW_verdef            = 0x6ffffffd,\n  ELF_ShType_SUNW_verneed           = 0x6ffffffe, // Versions defined by file\n  ELF_ShType_SUNW_versym            = 0x6fffffff, // Versions needed by file\n  \n  // Symbol versions\n  ELF_ShType_GNU_verdef             = ELF_ShType_SUNW_verdef,\n  ELF_ShType_GNU_verneed            = ELF_ShType_SUNW_verneed,\n  ELF_ShType_GNU_versym             = ELF_ShType_SUNW_versym,\n  ELF_ShType_Proc,\n  ELF_ShType_User,\n};\n\ntypedef U32 ELF_SectionIndex;\nenum\n{\n  \n  ELF_SectionIndex_Undef             = 0,      // Symbol with section index is undefined and must be resolved by the link editor\n  ELF_SectionIndex_Abs               = 0xfff1, // Symbol has absolute value and wont change after relocations\n  ELF_SectionIndex_Common            = 0xfff2, // This symbol indicates to linker to allocate the storage at address multiple of st_value\n  \n  ELF_SectionIndex_LoReserve         = 0xff00,\n  ELF_SectionIndex_HiReserve         = 0xffff,\n  \n  // Processor specific\n  ELF_SectionIndex_LoProc            = ELF_SectionIndex_LoReserve,\n  ELF_SectionIndex_HiProc            = 0xff1f,\n  \n  //  Reserved for OS\n  ELF_SectionIndex_LoOs              = 0xff20,\n  ELF_SectionIndex_HiOs              = 0xff3f,\n  \n  ELF_SectionIndex_IA64_ASNI_Common  = ELF_SectionIndex_LoProc,\n  ELF_SectionIndex_X8664_LCommon     = 0xff02,\n  ELF_SectionIndex_MIPS_SCommon      = 0xff03,\n  \n  ELF_SectionIndex_TIC6X_Common      = ELF_SectionIndex_LoReserve,\n  ELF_SectionIndex_MIPS_SUndefined   = 0xff04,\n};\n\ntypedef U32 ELF_SectionFlags;\nenum\n{\n  ELF_Shf_Write            = (1 << 0),\n  ELF_Shf_Alloc            = (1 << 1),\n  ELF_Shf_ExecInstr        = (1 << 2),\n  ELF_Shf_Merge            = (1 << 4),\n  ELF_Shf_Strings          = (1 << 5),\n  ELF_Shf_InfoLink         = (1 << 6),\n  ELF_Shf_LinkOrder        = (1 << 7),\n  ELF_Shf_OsNonConforming  = (1 << 8),\n  ELF_Shf_Group            = (1 << 9),\n  ELF_Shf_Tls              = (1 << 10),\n  ELF_Shf_Compressed       = (1 << 11),\n  ELF_Shf_MaskOs_Shift     = 16, ELF_Shf_MaskOs_Mask = 0xff,\n  ELF_Shf_AMD64Large       = (1 << 28),\n  ELF_Shf_Ordered          = (1 << 30),\n  ELF_Shf_Exclude          = (1 << 31),\n  ELF_Shf_MaskProc_Shift   = 28, ELF_Shf_MaskProc_Mask = 0xf,\n};\n\n#define ELF_SectionFlag_Extract_MaskOs(f)   (U8)(((f) >> ELF_SectionFlag_MaskOs_Shift)   & ELF_SectionFlag_MaskOs_Mask)\n#define ELF_SectionFlag_Extract_MaskProc(f) (U8)(((f) >> ELF_SectionFlag_MaskProc_shift) & ELF_SectionFlag_MaskProc_Mask)\ntypedef U32 ELF_AuxType;\nenum\n{\n  ELF_AuxType_Null              = 0,\n  ELF_AuxType_Phdr              = 3, // program headers\n  ELF_AuxType_Phent             = 4, // size of a program header\n  ELF_AuxType_Phnum             = 5, // number of program headers\n  ELF_AuxType_Pagesz            = 6, // system page size\n  ELF_AuxType_Base              = 7, // interpreter base address\n  ELF_AuxType_Flags             = 8,\n  ELF_AuxType_Entry             = 9, // program entry point\n  ELF_AuxType_Uid               = 11,\n  ELF_AuxType_Euid              = 12,\n  ELF_AuxType_Gid               = 13,\n  ELF_AuxType_Egid              = 14,\n  ELF_AuxType_Platform          = 15,\n  ELF_AuxType_Hwcap             = 16,\n  ELF_AuxType_Clktck            = 17,\n  ELF_AuxType_DCacheBSize       = 19,\n  ELF_AuxType_ICacheBSize       = 20,\n  ELF_AuxType_UCacheBSize       = 21,\n  ELF_AuxType_IgnorePPC         = 22,\n  ELF_AuxType_Secure            = 23,\n  ELF_AuxType_BasePlatform      = 24,\n  ELF_AuxType_Random            = 25,\n  ELF_AuxType_Hwcap2            = 26, // addres to 16 random bytes\n  ELF_AuxType_ExecFn            = 31, \n  ELF_AuxType_SysInfo           = 32, // file name of executable\n  ELF_AuxType_SysInfoEhdr       = 33,\n  ELF_AuxType_L1I_CacheSize     = 40,\n  ELF_AuxType_L1I_CacheGeometry = 41,\n  ELF_AuxType_L1D_CacheSize     = 42,\n  ELF_AuxType_L1D_CacheGeometry = 43,\n  ELF_AuxType_L2_CacheSize      = 44,\n  ELF_AuxType_L2_CacheGeometry  = 45,\n  ELF_AuxType_L3_CacheSize      = 46,\n  ELF_AuxType_L3_CacheGeometry  = 47,\n};\n\ntypedef U32 ELF_DynTag;\nenum\n{\n  ELF_DynTag_Null            = 0,\n  \n  ELF_DynTag_Needed          = 1,\n  ELF_DynTag_PltRelsz        = 2,\n  ELF_DynTag_PltGot          = 3,\n  ELF_DynTag_Hash            = 4,\n  ELF_DynTag_Strtab          = 5,\n  ELF_DynTag_Symtab          = 6,\n  ELF_DynTag_Rela            = 7,\n  ELF_DynTag_Relasz          = 8,\n  ELF_DynTag_Relaent         = 9,\n  ELF_DynTag_Strsz           = 10,\n  ELF_DynTag_Syment          = 11,\n  ELF_DynTag_Init            = 12,\n  ELF_DynTag_Fini            = 13,\n  ELF_DynTag_SoName          = 14,\n  ELF_DynTag_RPath           = 15,\n  ELF_DynTag_Symbolic        = 16,\n  ELF_DynTag_Rel             = 17,\n  ELF_DynTag_Relsz           = 18,\n  ELF_DynTag_Relent          = 19,\n  ELF_DynTag_Pltrel          = 20,\n  ELF_DynTag_Debug           = 21,\n  ELF_DynTag_TextRel         = 22,\n  ELF_DynTag_JmpRel          = 23,\n  ELF_DynTag_BindNow         = 24,\n  ELF_DynTag_InitArray       = 25,\n  ELF_DynTag_FiniArray       = 26,\n  ELF_DynTag_InitArraysz     = 27,\n  ELF_DynTag_FIniArraysz     = 28,\n  ELF_DynTag_RunPath         = 29,\n  ELF_DynTag_Flags           = 30,\n  ELF_DynTag_PreInitArray    = 32,\n  ELF_DynTag_PreInitArraysz  = 33,\n  ELF_DynTag_SymtabShndx     = 34,\n  \n  ELF_DynTag_LoOs            = 0x6000000D,\n  ELF_DynTag_HiOs            = 0x6ffff000,\n  \n  ELF_DynTag_ValRngLo        = 0x6ffffd00,\n  ELF_DynTag_GNU_PreLinked   = 0x6ffffdf5,\n  ELF_DynTag_GNU_Conflictsz  = 0x6ffffdf6,\n  ELF_DynTag_GNU_LibListsz   = 0x6ffffdf7,\n  ELF_DynTag_Checksum        = 0x6ffffdf8,\n  ELF_DynTag_Pltpadsz        = 0x6ffffdf9,\n  ELF_DynTag_Moveent         = 0x6ffffdfa,\n  ELF_DynTag_Movesz          = 0x6ffffdfb,\n  ELF_DynTag_Feature         = 0x6ffffdfc,\n  ELF_DynTag_PosFlag_1       = 0x6ffffdfd,\n  ELF_DynTag_SymInSz         = 0x6ffffdfe,\n  ELF_DynTag_SymInEnt        = 0x6ffffdff,\n  ELF_DynTag_ValRngHi        = ELF_DynTag_SymInEnt,\n  \n  ELF_DynTag_AddrRngLo       = 0x6ffffe00,\n  ELF_DynTag_GNU_Hash        = 0x6ffffef5,\n  ELF_DynTag_TlsDescPlt      = 0x6ffffef6,\n  ELF_DynTag_TlsDescGot      = 0x6ffffef7,\n  ELF_DynTag_GNU_Conflict    = 0x6ffffef8,\n  ELF_DynTag_GNU_LibList     = 0x6ffffef9,\n  ELF_DynTag_Config          = 0x6ffffefa,\n  ELF_DynTag_DepAudit        = 0x6ffffefb,\n  ELF_DynTag_Audit           = 0x6ffffefc,\n  ELF_DynTag_PltPad          = 0x6ffffefd,\n  ELF_DynTag_MoveTab         = 0x6ffffefe,\n  ELF_DynTag_SymInfo         = 0x6ffffeff,\n  ELF_DynTag_AddrRngHi       = ELF_DynTag_SymInfo,\n  \n  ELF_DynTag_RelaCount       = 0x6ffffff9,\n  ELF_DynTag_RelCount        = 0x6ffffffa,\n  ELF_DynTag_Flags_1         = 0x6ffffffb,\n  ELF_DynTag_VerDef          = 0x6ffffffc,\n  ELF_DynTag_VerDefNum       = 0x6ffffffd,\n  ELF_DynTag_VerNeed         = 0x6ffffffe,\n  ELF_DynTag_VerNeedNum      = 0x6fffffff,\n  ELF_DynTag_VerSym          = 0x6ffffff0,\n  ELF_DynTag_LoProc          = 0x70000000,\n  ELF_DynTag_HiProc          = 0x7fffffff,\n};\n\ntypedef U32 ELF_DynFlag;\nenum\n{\n  ELF_DynFlag_Origin    = (1 << 0),\n  ELF_DynFlag_Symbolic  = (1 << 1),\n  ELF_DynFlag_TextTel   = (1 << 2),\n  ELF_DynFlag_BindNow   = (1 << 3),\n  ELF_DynFlag_StaticTls = (1 << 4),\n};\n\ntypedef U32 ELF_DynFeatureFlag;\nenum\n{\n  ELF_DynFeatureFlag_ParInit = (1 << 0),\n  ELF_DynFeatureFlag_ConfExp = (1 << 1),\n};\n\ntypedef U8 ELF_SymBind;\nenum\n{\n  //  the same name may exists in multiple files without interfering with each other. \n  ELF_SymBind_Local  = 0,\n  //  Visible to all objects that are linked together. \n  ELF_SymBind_Global = 1,\n  //  If there is a global symbol with identical name linker doesn't issue an error.\n  ELF_SymBind_Weak   = 2,\n  ELF_SymBind_LoProc = 13,\n  ELF_SymBind_HiProc = 15,\n};\n\ntypedef U8 ELF_SymType;\nenum\n{\n  ELF_SymType_NoType  = 0,\n  //  Type is not specified.\n  ELF_SymType_Object  = 1,\n  //  Symbol is associated with data object, such as a variable, an array, etc.\n  ELF_SymType_Func    = 2,\n  //  Symbol is associated with a function.\n  ELF_SymType_Section = 3,\n  //  Symbol is used to relocate sections and normally have LOCAL binding.\n  ELF_SymType_File    = 4,\n  //  Gives name of the source file associated with object.\n  ELF_SymType_Common  = 5,\n  ELF_SymType_Tls     = 6,\n  ELF_SymType_LoProc  = 13,\n  ELF_SymType_HiProc  = 15,\n};\n\ntypedef U8 ELF_SymVisibility;\nenum\n{\n  ELF_SymVisibility_Default   = 0,\n  ELF_SymVisibility_Internal  = 1,\n  ELF_SymVisibility_Hidden    = 2,\n  ELF_SymVisibility_Protected = 3,\n};\n\ntypedef U32 ELF_RelocI386;\nenum\n{\n  ELF_RelocI386_None           = 0,\n  ELF_RelocI386_32             = 1,\n  ELF_RelocI386_PC32           = 2,\n  ELF_RelocI386_GOT32          = 3,\n  ELF_RelocI386_PLT32          = 4,\n  ELF_RelocI386_Copy           = 5,\n  ELF_RelocI386_GlobDat        = 6,\n  ELF_RelocI386_JumpSlot       = 7,\n  ELF_RelocI386_Relative       = 8,\n  ELF_RelocI386_GotOff         = 9,\n  ELF_RelocI386_GotPc          = 10,\n  ELF_RelocI386_32Plt          = 11,\n  ELF_RelocI386_Tls_tpoff      = 14,\n  ELF_RelocI386_Tls_ie         = 15,\n  ELF_RelocI386_Tls_gotie      = 16,\n  ELF_RelocI386_Tls_le         = 17,\n  ELF_RelocI386_Tls_gd         = 18,\n  ELF_RelocI386_Tls_ldm        = 19,\n  ELF_RelocI386_16             = 20,\n  ELF_RelocI386_PC16           = 21,\n  ELF_RelocI386_8              = 22,\n  ELF_RelocI386_Pc8            = 23,\n  ELF_RelocI386_TlsGd32        = 24,\n  ELF_RelocI386_TlsGdPush      = 25,\n  ELF_RelocI386_TlsGdCall      = 26,\n  ELF_RelocI386_TlsGdPop       = 27,\n  ELF_RelocI386_TlsLdm32       = 28,\n  ELF_RelocI386_TlsLdmPush     = 29,\n  ELF_RelocI386_TlsLdmCall     = 30,\n  ELF_RelocI386_TlsLdmPop      = 31,\n  ELF_RelocI386_TlsLdo32       = 32,\n  ELF_RelocI386_TlsIe32        = 33,\n  ELF_RelocI386_TlsLe32        = 34,\n  ELF_RelocI386_TlsDtpmod32    = 35,\n  ELF_RelocI386_TlsDtpoff32    = 36,\n  ELF_RelocI386_TlsTpoff32     = 37,\n  //  38 is not taken\n  ELF_RelocI386_TlsGotDesc     = 39,\n  ELF_RelocI386_TlsDescCall    = 40,\n  ELF_RelocI386_TlsDesc        = 41,\n  ELF_RelocI386_IRelative      = 42,\n  ELF_RelocI386_Gotx32x        = 43,\n  ELF_RelocI386_UsedByIntel200 = 200,\n  ELF_RelocI386_GNU_VTInherit  = 250,\n  ELF_RelocI386_GNU_VTEntry    = 251,\n};\n\ntypedef U32 ELF_RelocX8664;\nenum\n{\n  ELF_RelocX8664_None           = 0,\n  ELF_RelocX8664_64             = 1,\n  ELF_RelocX8664_Pc32           = 2,\n  ELF_RelocX8664_Got32          = 3,\n  ELF_RelocX8664_Plt32          = 4,\n  ELF_RelocX8664_Copy           = 5,\n  ELF_RelocX8664_GlobDat        = 6,\n  ELF_RelocX8664_JumpSlot       = 7,\n  ELF_RelocX8664_Relative       = 8,\n  ELF_RelocX8664_GotPcRel       = 9,\n  ELF_RelocX8664_32             = 10,\n  ELF_RelocX8664_32S            = 11,\n  ELF_RelocX8664_16             = 12,\n  ELF_RelocX8664_Pc16           = 13,\n  ELF_RelocX8664_8              = 14,\n  ELF_RelocX8664_Pc8            = 15,\n  ELF_RelocX8664_DtpMod64       = 16,\n  ELF_RelocX8664_DtpOff64       = 17,\n  ELF_RelocX8664_TpOff64        = 18,\n  ELF_RelocX8664_TlsGd          = 19,\n  ELF_RelocX8664_TlsLd          = 20,\n  ELF_RelocX8664_DtpOff32       = 21,\n  ELF_RelocX8664_GotTpOff       = 22,\n  ELF_RelocX8664_TpOff32        = 23,\n  ELF_RelocX8664_Pc64           = 24,\n  ELF_RelocX8664_GotOff64       = 25,\n  ELF_RelocX8664_GotPc32        = 26,\n  ELF_RelocX8664_Got64          = 27,\n  ELF_RelocX8664_GotPcRel64     = 28,\n  ELF_RelocX8664_GotPc64        = 29,\n  ELF_RelocX8664_GotPlt64       = 30,\n  ELF_RelocX8664_PltOff64       = 31,\n  ELF_RelocX8664_Size32         = 32,\n  ELF_RelocX8664_Size64         = 33,\n  ELF_RelocX8664_GotPc32TlsDesc = 34,\n  ELF_RelocX8664_TlsDescCall    = 35,\n  ELF_RelocX8664_TlsDesc        = 36,\n  ELF_RelocX8664_IRelative      = 37,\n  ELF_RelocX8664_Relative64     = 38,\n  ELF_RelocX8664_Pc32Bnd        = 39,\n  ELF_RelocX8664_Plt32Bnd       = 40,\n  ELF_RelocX8664_GotPcRelx      = 41,\n  ELF_RelocX8664_RexGotPcRelx   = 42,\n  ELF_RelocX8664_GNU_VTInherit  = 250,\n  ELF_RelocX8664_GNU_VTEntry    = 251,\n};\n\ntypedef U32 ELF_ExternalVerFlag;\nenum\n{\n  ELF_ExternalVerFlag_Base = (1 << 0),\n  ELF_ExternalVerFlag_Weak = (1 << 1),\n  ELF_ExternalVerFlag_Info = (1 << 2),\n};\n\ntypedef U32 ELF_NoteType;\nenum\n{\n  ELF_NoteType_STapSdt = 3, // System Tap probes\n};\n\n#define ELF_HdrIs64Bit(e_ident) (e_ident[ELF_Identifier_Class] == ELF_Class_64)\n#define ELF_HdrIs32Bit(e_ident) (e_ident[ELF_Identifier_Class] == ELF_Class_32)\n\ntypedef enum ELF_Identifier\n{\n  ELF_Identifier_Mag0       = 0,\n  ELF_Identifier_Mag1       = 1,\n  ELF_Identifier_Mag2       = 2,\n  ELF_Identifier_Mag3       = 3,\n  ELF_Identifier_Class      = 4,\n  ELF_Identifier_Data       = 5,\n  ELF_Identifier_Version    = 6,\n  ELF_Identifier_OsAbi      = 7,\n  ELF_Identfiier_AbiBersion = 8,\n  ELF_Identifier_Max        = 16,\n} ELF_Identifier;\n\nread_only global U8 elf_magic[] = {0x7f, 'E', 'L', 'F'};\nread_only global String8 elf_magic_string = {elf_magic, sizeof(elf_magic)};\n\ntypedef struct ELF_Hdr64\n{\n  U8              e_ident[ELF_Identifier_Max];\n  ELF_Type        e_type;\n  ELF_MachineKind e_machine;\n  U32             e_version;\n  U64             e_entry;\n  U64             e_phoff;\n  U64             e_shoff;\n  U32             e_flags;\n  U16             e_ehsize;\n  U16             e_phentsize;\n  U16             e_phnum;\n  U16             e_shentsize;\n  U16             e_shnum;\n  U16             e_shstrndx;\n} ELF_Hdr64;\n\ntypedef struct ELF_Hdr32\n{\n  U8              e_ident[ELF_Identifier_Max];\n  ELF_Type        e_type;\n  ELF_MachineKind e_machine;\n  U32             e_version;\n  U32             e_entry;\n  U32             e_phoff;\n  U32             e_shoff;\n  U32             e_flags;\n  U16             e_ehsize;\n  U16             e_phentsize;\n  U16             e_phnum;\n  U16             e_shentsize;\n  U16             e_shnum;\n  U16             e_shstrndx;\n} ELF_Hdr32;\n\ntypedef struct ELF_Shdr64\n{\n  U32        sh_name;\n  ELF_ShType sh_type;\n  U64        sh_flags;\n  U64        sh_addr;\n  U64        sh_offset;\n  U64        sh_size;\n  U32        sh_link;\n  U32        sh_info;\n  U64        sh_addralign;\n  U64        sh_entsize;\n} ELF_Shdr64;\n\ntypedef struct ELF_Shdr32\n{\n  U32        sh_name;\n  ELF_ShType sh_type;\n  U32        sh_flags;\n  U32        sh_addr;\n  U32        sh_offset;\n  U32        sh_size;\n  U32        sh_link;\n  U32        sh_info;\n  U32        sh_addralign;\n  U32        sh_entsize;\n} ELF_Shdr32;\n\ntypedef struct ELF_Phdr64\n{\n  U32 p_type;\n  U32 p_flags;\n  U64 p_offset;\n  U64 p_vaddr;\n  U64 p_paddr;\n  U64 p_filesz;\n  U64 p_memsz;\n  U64 p_align;\n} ELF_Phdr64;\n\ntypedef struct ELF_Phdr32\n{\n  U32 p_type;\n  U32 p_offset;\n  U32 p_vaddr;\n  U32 p_paddr;\n  U32 p_filesz;\n  U32 p_memsz;\n  U32 p_flags;\n  U32 p_align;\n} ELF_Phdr32;\n\n////////////////////////////////\n// Auxiliary Vectors\n\n// these appear in /proc/<pid>/auxv of a process, they are not in elf files\n\ntypedef struct ELF_Auxv32\n{\n  U32 a_type;\n  U32 a_val;\n} ELF_Auxv32;\n\ntypedef struct ELF_Auxv64\n{\n  U64 a_type;\n  U64 a_val;\n} ELF_Auxv64;\n\n////////////////////////////////\n// Dynamic Structures\n\n// these appear in the virtual address space of a process, they are not in elf files\n\ntypedef struct ELF_Dyn32\n{\n  U32 tag;\n  U32 val;\n} ELF_Dyn32;\n\ntypedef struct ELF_Dyn64\n{\n  U64 tag;\n  U64 val;\n} ELF_Dyn64;\n\n////////////////////////////////\n// Imports and Exports\n\ntypedef struct \n{\n  U32 st_name;  // Holds index into files string table.\n  U32 st_value; // Depending on the context, this may be address, size, etc.\n  U32 st_size;  // Data size in bytes. Zero when size is unknown.\n  U8  st_info;  // Contains symbols type and binding.\n  U8  st_other; // Reserved for future use, currenly zero.\n  U16 st_shndx; // Section index to which symbol is relevant.\n} ELF_Sym32;\n\ntypedef struct \n{\n  U32 st_name;\n  U8  st_info;\n  U8  st_other;\n  U16 st_shndx;\n  U64 st_value;\n  U64 st_size;\n} ELF_Sym64;\n\n#define ELF_ST_INFO(b,t)     (((b) << 4) + ((t) & 0xF))\n#define ELF_ST_BIND(x)       ((x) >> 4)\n#define ELF_ST_TYPE(x)       ((x) & 0xF)\n#define ELF_ST_VISIBILITY(v) ((v) & 0x3)\n\ntypedef struct\n{\n  U32 r_offset;\n  U32 r_info;\n} ELF_Rel32;\n\ntypedef struct\n{\n  U32 r_offset;\n  U32 r_info;\n  S32 r_addend;\n} ELF_Rela32;\n\ntypedef struct\n{\n  U64 r_offset;\n  U64 r_info;\n} ELF_Rel64;\n\ntypedef struct\n{\n  U64 r_offset;\n  U64 r_info;\n  S64 r_addend;\n} ELF_Rela64;\n\n#define ELF32_R_SYM(x)  ((x) >> 8)\n#define ELF32_R_TYPE(x) ((x) & 0xFF)\n\n#define ELF64_R_INFO(s,t) (((U64)(s) << 32) | (U64)t)\n#define ELF64_R_SYM(x)    ((x) >> 32)\n#define ELF64_R_TYPE(x)   ((x) & 0xffffffff)\n\n// This flag is set to indicate that symbol is not available outside shared object\n#define ELF_EXTERNAL_VERSYM_HIDDEN 0x8000\n#define ELF_EXTERNAL_VERSYM_MASK   0x7FFF\n\n// Appears in .gnu.verdef (SHT_GNU_verdef)\ntypedef struct\n{\n  U16 vd_version;\n  U16 vd_flags;\n  U16 vd_ndx;\n  U16 vd_cnt;\n  U32 vd_hash;\n  U32 vd_aux;\n  U32 vd_next;\n} ELF_ExternalVerdef;\n\n// Appears in .gnu.verdef (SHT_GNU_verdef)\ntypedef struct\n{\n  U32 vda_name;\n  U32 vda_next;\n} ELF_ExternalVerdaux;\n\n// Appears in .gnu.verneed (SHT_GNU_verneed)\ntypedef struct\n{\n  U16 vn_version;\n  U16 vn_cnt;\n  U32 vn_file;\n  U32 vn_aux;\n  U32 vn_next;\n} ELF_ExternalVerneed;\n\n// Appears in .gnu.verneed (SHT_GNU_verneed)\ntypedef struct\n{\n  U32 vna_hash;\n  U16 vna_flags;\n  U16 vna_other;\n  U32 vna_name;\n  U32 vna_next;\n} ELF_ExternalVernaux;\n\n// Appears in .gnu.version (SHT_GNU_versym)\ntypedef struct\n{\n  U16 vs_vers;\n} ELF_ExternalVersym;\n\n////////////////////////////////\n// Extensions\n\ntypedef U8 ELF_CompressType;\nenum ELF_CompressTypeEnum\n{\n  ELF_CompressType_None = 0,\n  ELF_CompressType_ZLib = 1,\n  ELF_CompressType_ZStd = 2,\n  \n  ELF_CompressType_LoOs = 0x60000000,\n  ELF_CompressType_HiOs = 0x6fffffff,\n  \n  ELF_CompressType_LoProc = 0x70000000,\n  ELF_CompressType_HiProc = 0x7fffffff,\n};\n\ntypedef struct ELF_Chdr32\n{\n  U32 ch_type;\n  U32 ch_size;\n  U32 ch_addr_align;\n} ELF_Chdr32;\n\ntypedef struct ELF_Chdr64\n{\n  U32 ch_type;\n  U32 ch_reserved;\n  U64 ch_size;\n  U64 ch_addr_align;\n} ELF_Chdr64;\n\n////////////////////////////////\n\ninternal ELF_Hdr64  elf_hdr64_from_hdr32(ELF_Hdr32 h32);\ninternal ELF_Shdr64 elf_shdr64_from_shdr32(ELF_Shdr32 h32);\ninternal ELF_Phdr64 elf_phdr64_from_phdr32(ELF_Phdr32 h32);\ninternal ELF_Dyn64  elf_dyn64_from_dyn32  (ELF_Dyn32 h32);\ninternal ELF_Sym64  elf_sym64_from_sym32  (ELF_Sym32 sym32);\ninternal ELF_Rel64  elf_rel64_from_rel32  (ELF_Rel32 rel32);\ninternal ELF_Rela64 elf_rela64_from_rela32(ELF_Rela32 rela32);\ninternal ELF_Chdr64 elf_chdr64_from_chdr32(ELF_Chdr32 chdr32);\ninternal ELF_Auxv64 elf_auxv64_from_auxv32(ELF_Auxv32 auxv32);\n\n////////////////////////////////\n\ninternal String8 elf_string_from_class(Arena *arena, ELF_Class v);\n\n////////////////////////////////\n\ninternal Arch arch_from_elf_machine(ELF_MachineKind machine);\n\n////////////////////////////////\n\ninternal U64 elf_phdr_size_from_class(ELF_Class elf_class);\ninternal U64 elf_dyn_size_from_class(ELF_Class elf_class);\n\n#endif // ELF_H\n"
  },
  {
    "path": "src/elf/elf_dump.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal String8List\r\nelf_dump_note(Arena *arena, String8 raw_notes, ELF_Class elf_class, ELF_MachineKind e_machine)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n\r\n  B32         is_bad_parse = 1;\r\n  String8List strings      = {0};\r\n  U64         cursor       = 0;\r\n\r\n  for (;cursor < raw_notes.size;) {\r\n    U32 owner_size;\r\n    U64 owner_size_size = str8_deserial_read_struct(raw_notes, cursor, &owner_size);\r\n    if (owner_size_size == 0) { goto exit; }\r\n    cursor += owner_size_size;\r\n\r\n    U32 desc_size;\r\n    U64 desc_size_size = str8_deserial_read_struct(raw_notes, cursor, &desc_size);\r\n    if (desc_size_size == 0) { goto exit; }\r\n    cursor += desc_size_size;\r\n\r\n    ELF_NoteType note_type;\r\n    U64 type_size = str8_deserial_read_struct(raw_notes, cursor, &note_type);\r\n    if (type_size == 0) { goto exit; }\r\n    cursor += type_size;\r\n\r\n    if (cursor + owner_size > raw_notes.size) { goto exit; }\r\n    String8 owner = str8_cstring_capped(raw_notes.str + cursor, raw_notes.str + cursor + owner_size);\r\n    cursor += owner_size;\r\n\r\n    if (cursor + desc_size > raw_notes.size) { goto exit; }\r\n    String8 raw_desc = str8_substr(raw_notes, r1u64(cursor, cursor + desc_size));\r\n    cursor += desc_size;\r\n    cursor = AlignPow2(cursor, 4);\r\n\r\n    String8List desc_fmt      = {0};\r\n    String8     note_type_str = {0};\r\n    if (str8_match(owner, str8_lit(\"GNU\"), StringMatchFlag_CaseInsensitive)) {\r\n      // format description\r\n      switch (note_type) {\r\n      case GNU_NoteType_Abi: {\r\n        U64 desc_cursor = 0;\r\n\r\n        GNU_AbiTag os = 0;\r\n        U64 os_size = str8_deserial_read_struct(raw_desc, desc_cursor, &os);\r\n        if (os_size == 0) { goto exit; }\r\n        cursor += os_size;\r\n\r\n        U32 major = 0;\r\n        U64 major_size = str8_deserial_read_struct(raw_desc, desc_cursor, &major);\r\n        if (major_size == 0) { goto exit; }\r\n        cursor += major_size;\r\n\r\n        U32 minor = 0;\r\n        U64 minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &minor);\r\n        if (minor_size == 0) { goto exit; }\r\n        cursor += minor_size;\r\n\r\n        U32 sub_minor = 0;\r\n        U64 sub_minor_size = str8_deserial_read_struct(raw_desc, desc_cursor, &sub_minor);\r\n        if (sub_minor_size == 0) { goto exit; }\r\n        cursor += sub_minor_size;\r\n\r\n        String8 os_str = gnu_string_from_abi_tag(os);\r\n        if (os_str.size == 0) os_str = str8f(scratch.arena, \"0x%x\", os);\r\n\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"OS: %S, ABI: %u.%u.%u\", os_str, major, minor, sub_minor);\r\n      } break;\r\n      case GNU_NoteType_BuildId: {\r\n        String8List build_id = {0};\r\n        for EachIndex(desc_cursor, desc_size) {\r\n          U8  v      = 0;\r\n          U64 v_size = str8_deserial_read_struct(raw_desc, desc_cursor, &v);\r\n          if (v_size == 0) { goto exit; }\r\n          desc_cursor += v_size;\r\n          str8_list_pushf(scratch.arena, &build_id, \"%02x\", v);\r\n        }\r\n        String8 build_id_str = str8_list_join(scratch.arena, &build_id, 0);\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"Build ID: %S\", build_id_str);\r\n      } break;\r\n      case GNU_NoteType_PropertyType0: {\r\n        U64 align = elf_class == ELF_Class_64 ? 8 : 4;\r\n        for (U64 desc_cursor = 0; desc_cursor < raw_desc.size; ) {\r\n          GNU_Property type = 0;\r\n          U64 type_size = str8_deserial_read_struct(raw_desc, desc_cursor, &type);\r\n          if (type_size == 0) { goto exit; }\r\n          desc_cursor += type_size;\r\n\r\n          U32 size = 0;\r\n          U64 size_size = str8_deserial_read_struct(raw_desc, desc_cursor, &size);\r\n          if (size_size == 0) { goto exit; }\r\n          desc_cursor += size_size;\r\n\r\n          U32 flags = 0;\r\n          if (size == 4) {\r\n            U64 flags_size = str8_deserial_read_struct(raw_desc, desc_cursor, &flags);\r\n            if (flags_size == 0) { goto exit; }\r\n            desc_cursor += flags_size;\r\n          }\r\n\r\n          switch (e_machine) {\r\n          case ELF_MachineKind_None: break;\r\n          case ELF_MachineKind_X86_64: {\r\n            String8 features = gnu_string_from_property_flags_x86(scratch.arena, type, flags);\r\n            str8_list_pushf(scratch.arena, &desc_fmt, \"x86 features: %S\", features);\r\n          } break;\r\n          default: NotImplemented; break;\r\n          }\r\n\r\n          desc_cursor = AlignPow2(desc_cursor, align);\r\n        }\r\n      } break;\r\n      default: NotImplemented; break;\r\n      }\r\n\r\n      note_type_str = gnu_string_from_note_type(note_type);\r\n    } else if (str8_match(owner, str8_lit(\"stapsdt\"), StringMatchFlag_CaseInsensitive)) {\r\n      if (note_type == ELF_NoteType_STapSdt) {\r\n        U64 desc_cursor = 0;\r\n        U64 addr_size   = elf_class == ELF_Class_64 ? 8 : 4;\r\n\r\n        U64 pc = 0;\r\n        U64 pc_size = str8_deserial_read(raw_desc, desc_cursor, &pc, addr_size, addr_size);\r\n        if (pc_size == 0) { goto exit; }\r\n        desc_cursor += pc_size;\r\n\r\n        U64 base_addr = 0;\r\n        U64 base_addr_size = str8_deserial_read(raw_desc, desc_cursor, &base_addr, addr_size, addr_size);\r\n        if (base_addr_size == 0) { goto exit; }\r\n        desc_cursor += base_addr_size;\r\n\r\n        U64 semaphore = 0;\r\n        U64 semaphore_size = str8_deserial_read(raw_desc, desc_cursor, &semaphore, addr_size, addr_size);\r\n        if (semaphore_size == 0) { goto exit; }\r\n        desc_cursor += semaphore_size;\r\n\r\n        String8 provider = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size);\r\n        desc_cursor += provider.size + 1;\r\n        if (desc_cursor > raw_desc.size) { goto exit; }\r\n\r\n        String8 probe = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size);\r\n        desc_cursor += probe.size + 1;\r\n        if (desc_cursor > raw_desc.size) { goto exit; }\r\n\r\n        String8 args = str8_cstring_capped(raw_desc.str + desc_cursor, raw_desc.str + raw_desc.size);\r\n        desc_cursor += args.size + 1;\r\n        if (desc_cursor > raw_desc.size) { goto exit; }\r\n\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"Provider:  %S\",      provider);\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"Probe:     %S\",      probe);\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"PC:        0x%I64x\", pc);\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"Base:      0x%I64x\", base_addr);\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"Semaphore: 0x%I64x\", semaphore);\r\n        str8_list_pushf(scratch.arena, &desc_fmt, \"Arguments: %S\",      args);\r\n\r\n        note_type_str = str8_lit(\"NT_STAPSDT\");\r\n      }\r\n    }\r\n\r\n    if (note_type_str.size == 0) note_type_str = str8f(scratch.arena, \"0x%x\", note_type);\r\n\r\n    str8_list_pushf(arena, &strings, \"{\");\r\n    str8_list_pushf(arena, &strings, \"  Owner:     %S\",   owner);\r\n    str8_list_pushf(arena, &strings, \"  Data Size: 0x%x\", desc_size);\r\n    str8_list_pushf(arena, &strings, \"  Type:      %S\",   note_type_str);\r\n    if (desc_fmt.node_count) {\r\n      str8_list_pushf(arena, &strings, \"  Description:\");\r\n      str8_list_pushf(arena, &strings, \"  {\");\r\n      for EachNode(n, String8Node, desc_fmt.first) { str8_list_pushf(arena, &strings, \"    %S\", n->string); }\r\n      str8_list_pushf(arena, &strings, \"  }\");\r\n    }\r\n    str8_list_pushf(arena, &strings, \"}\");\r\n  }\r\n\r\n  is_bad_parse = 0;\r\nexit:;\r\n  if (is_bad_parse) {\r\n    str8_list_pushf(arena, &strings, \"ERROR: unable to parse data @ 0x%Ix64\", cursor);\r\n  }\r\n  scratch_end(scratch);\r\n  return strings;\r\n}\r\n\r\ninternal String8List\r\nelf_dump(Arena *arena, String8 raw_elf, ELF_DumpSubsetFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n\r\n  String8List strings = {0};\r\n  ELF_Bin elf = elf_bin_from_data(scratch.arena, raw_elf);\r\n\r\n  if (flags & ELF_DumpSubsetFlag_Note) {\r\n    for EachIndex(sect_idx, elf.shdrs.count) {\r\n      ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx];\r\n      if (shdr->sh_type == ELF_ShType_Note) {\r\n        String8 raw_notes = str8_substr(raw_elf, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size));\r\n        String8 shdr_name = elf_name_from_shdr64(raw_elf, &elf, shdr);\r\n        str8_list_pushf(scratch.arena, &strings, \"//\");\r\n        str8_list_pushf(scratch.arena, &strings, \"// %S\", shdr_name);\r\n        str8_list_pushf(scratch.arena, &strings, \"//\");\r\n        String8List note_strings = elf_dump_note(scratch.arena, raw_notes, elf.hdr.e_ident[ELF_Identifier_Class], elf.hdr.e_machine);\r\n        str8_list_concat_in_place(&strings, &note_strings);\r\n      }\r\n    }\r\n  }\r\n\r\n  String8 out = str8_list_join(arena, &strings, &(StringJoin){.sep=str8_lit(\"\\n\"), .post=str8_lit(\"\\n\")});\r\n  String8List result = {0};\r\n  str8_list_push(arena, &result, out);\r\n\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/elf/elf_dump.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef ELF_DUMP_H\r\n#define ELF_DUMP_H\r\n\r\n#define ELF_DumpSubset_XList \\\r\n  X(Note, note, \"NOTE\")\r\n\r\ntypedef U32 ELF_DumpSubset;\r\nenum\r\n{\r\n#define X(name, name_lower, title) ELF_DumpSubset_##name,\r\n  ELF_DumpSubset_XList\r\n#undef X\r\n};\r\n\r\ntypedef U32 ELF_DumpSubsetFlags;\r\nenum\r\n{\r\n#define X(name, name_lower, title) ELF_DumpSubsetFlag_##name = (1 << ELF_DumpSubset_##name),\r\n  ELF_DumpSubset_XList\r\n#undef X\r\n  ELF_DumpSubsetFlag_All = ~0,\r\n};\r\n\r\ninternal String8List elf_dump(Arena *arena, String8 raw_elf, ELF_DumpSubsetFlags flags);\r\n\r\n#endif // ELF_DUMP_H\r\n\r\n"
  },
  {
    "path": "src/elf/elf_parse.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n//- rjf: top-level binary parsing\n\ninternal ELF_Bin\nelf_bin_from_data(Arena *arena, String8 data)\n{\n  ELF_Bin bin = {0};\n  if(str8_match(str8_prefix(data, elf_magic_string.size), elf_magic_string, 0) &&\n     data.size >= ELF_Identifier_Max)\n  {\n    //- rjf: parse sig/header\n    U8 sig[ELF_Identifier_Max] = {0};\n    str8_deserial_read(data, 0, &sig[0], sizeof(sig), 1);\n    switch(sig[ELF_Identifier_Class])\n    {\n      default:\n      case ELF_Class_None:{}break;\n      case ELF_Class_32:\n      {\n        ELF_Hdr32 hdr32 = {0};\n        U64 hdr_size = str8_deserial_read_struct(data, 0, &hdr32);\n        if(hdr_size == sizeof(hdr32))\n        {\n          bin.hdr = elf_hdr64_from_hdr32(hdr32);\n          U64 shstr_off = hdr32.e_shoff + hdr32.e_shentsize*hdr32.e_shstrndx;\n          ELF_Shdr32 shdr = {0};\n          U64 shdr_size = str8_deserial_read_struct(data, shstr_off, &shdr);\n          if(shdr_size == sizeof(shdr))\n          {\n            bin.sh_name_range = rng_1u64(shdr.sh_offset, shdr.sh_offset + shdr.sh_size);\n          }\n        }\n      }break;\n      case ELF_Class_64:\n      {\n        ELF_Hdr64 hdr64 = {0};\n        U64 hdr_size = str8_deserial_read_struct(data, 0, &hdr64);\n        if(hdr_size == sizeof(hdr64))\n        {\n          bin.hdr = hdr64;\n          U64 shstr_off = hdr64.e_shoff + hdr64.e_shentsize*hdr64.e_shstrndx;\n          ELF_Shdr64 shdr = {0};\n          U64 shdr_size = str8_deserial_read_struct(data, shstr_off, &shdr);\n          if(shdr_size == sizeof(shdr))\n          {\n            bin.sh_name_range = rng_1u64(shdr.sh_offset, shdr.sh_offset + shdr.sh_size);\n          }\n        }\n      }break;\n    }\n    \n    //- rjf: gather all shdrs\n    {\n      ELF_Hdr64 *hdr = &bin.hdr;\n      bin.shdrs.count = hdr->e_shnum;\n      bin.shdrs.v = push_array(arena, ELF_Shdr64, hdr->e_shnum);\n      Rng1U64 shdr_range = rng_1u64(hdr->e_shoff, hdr->e_shoff + hdr->e_shentsize*hdr->e_shnum);\n      String8 shdr_data = str8_substr(data, shdr_range);\n      for EachIndex(shdr_idx, hdr->e_shnum)\n      {\n        switch(hdr->e_ident[ELF_Identifier_Class])\n        {\n          default:\n          case ELF_Class_None:\n          {}break;\n          case ELF_Class_32:\n          {\n            ELF_Shdr32 shdr32 = {0};\n            str8_deserial_read_struct(shdr_data, shdr_idx * sizeof(ELF_Shdr32), &shdr32);\n            bin.shdrs.v[shdr_idx] = elf_shdr64_from_shdr32(shdr32);\n          }break;\n          case ELF_Class_64:\n          {\n            str8_deserial_read_struct(shdr_data, shdr_idx * sizeof(ELF_Shdr64), &bin.shdrs.v[shdr_idx]);\n          }break;\n        }\n      }\n    }\n    \n    //- rjf: gather all phdrs\n    {\n      ELF_Hdr64 *hdr = &bin.hdr;\n      bin.phdrs.count = hdr->e_phnum;\n      bin.phdrs.v = push_array(arena, ELF_Phdr64, hdr->e_phnum);\n      Rng1U64 phdr_range = rng_1u64(hdr->e_phoff, hdr->e_phoff + hdr->e_phentsize*hdr->e_phnum);\n      String8 phdr_data = str8_substr(data, phdr_range);\n      for EachIndex(phdr_idx, hdr->e_phnum)\n      {\n        switch(hdr->e_ident[ELF_Identifier_Class])\n        {\n          default:\n          case ELF_Class_None:\n          {}break;\n          case ELF_Class_32:\n          {\n            ELF_Phdr32 phdr32 = {0};\n            str8_deserial_read_struct(phdr_data, phdr_idx * sizeof(ELF_Phdr32), &phdr32);\n            bin.phdrs.v[phdr_idx] = elf_phdr64_from_phdr32(phdr32);\n          }break;\n          case ELF_Class_64:\n          {\n            str8_deserial_read_struct(phdr_data, phdr_idx * sizeof(ELF_Phdr64), &bin.phdrs.v[phdr_idx]);\n          }break;\n        }\n      }\n    }\n  }\n  return bin;\n}\n\n//- rjf: extra bin info extraction\n\ninternal String8\nelf_name_from_shdr64(String8 data, ELF_Bin *bin, ELF_Shdr64 *shdr)\n{\n  String8 sh_names = str8_substr(data, bin->sh_name_range);\n  String8 name = {0};\n  str8_deserial_read_cstr(sh_names, shdr->sh_name, &name);\n  return name;\n}\n\ninternal U64\nelf_base_addr_from_bin(ELF_Bin *bin)\n{\n  U64 base_vaddr = 0;\n  for EachIndex(phdr_idx, bin->phdrs.count)\n  {\n    ELF_Phdr64 *phdr = &bin->phdrs.v[phdr_idx];\n    if(phdr->p_type == ELF_PType_Load &&\n       (base_vaddr == 0 || phdr->p_vaddr < base_vaddr))\n    {\n      base_vaddr = phdr->p_vaddr;\n    }\n  }\n  return base_vaddr;\n}\n\ninternal ELF_GnuDebugLink\nelf_gnu_debug_link_from_bin(String8 raw_data, ELF_Bin *bin)\n{\n  ELF_GnuDebugLink result = {0};\n  for EachIndex(idx, bin->shdrs.count)\n  {\n    ELF_Shdr64 *shdr = &bin->shdrs.v[idx];\n    String8 name = elf_name_from_shdr64(raw_data, bin, shdr);\n    if(str8_match(name, str8_lit(\".gnu_debuglink\"), 0))\n    {\n      Rng1U64 raw_data_range = rng_1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size);\n      String8 data = str8_substr(raw_data, raw_data_range);\n      String8 path = {0};\n      U32 checksum = 0;\n      {\n        U64 cursor = 0;\n        cursor += str8_deserial_read_cstr(data, cursor, &path);\n        cursor = AlignPow2(cursor, 4);\n        cursor += str8_deserial_read_struct(data, cursor, &checksum);\n      }\n      result.path = path;\n      result.checksum = checksum;\n      break;\n    }\n  }\n  return result;\n}\n\ninternal ELF_NoteList\nelf_parse_note(Arena *arena, String8 raw_note, ELF_Class elf_class, ELF_MachineKind e_machine)\n{\n  ELF_NoteList result = {0};\n\n  for (U64 cursor = 0; cursor < raw_note.size; ) {\n    U32 owner_size;\n    U64 owner_size_size = str8_deserial_read_struct(raw_note, cursor, &owner_size);\n    if (owner_size_size == 0) { goto exit; }\n    cursor += owner_size_size;\n\n    U32 desc_size;\n    U64 desc_size_size = str8_deserial_read_struct(raw_note, cursor, &desc_size);\n    if (desc_size_size == 0) { goto exit; }\n    cursor += desc_size_size;\n\n    ELF_NoteType type;\n    U64 type_size = str8_deserial_read_struct(raw_note, cursor, &type);\n    if (type_size == 0) { goto exit; }\n    cursor += type_size;\n\n    if (cursor + owner_size > raw_note.size) { goto exit; }\n    String8 owner = str8_cstring_capped(raw_note.str + cursor, raw_note.str + cursor + owner_size);\n    cursor += owner_size;\n\n    if (cursor + desc_size > raw_note.size) { goto exit; }\n    String8 desc = str8_substr(raw_note, r1u64(cursor, cursor + desc_size));\n    cursor += desc_size;\n    cursor = AlignPow2(cursor, 4);\n\n    ELF_NoteNode *n = push_array(arena, ELF_NoteNode, 1);\n    n->v.owner = owner;\n    n->v.desc  = desc;\n    n->v.type  = type;\n\n    SLLQueuePush(result.first, result.last, n);\n    result.count += 1;\n  }\n\nexit:;\n  return result;\n}\n\n\n"
  },
  {
    "path": "src/elf/elf_parse.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef ELF_PARSE_H\n#define ELF_PARSE_H\n\n////////////////////////////////\n//~ rjf: Parsed Structure Types\n\ntypedef struct ELF_Shdr64Array ELF_Shdr64Array;\nstruct ELF_Shdr64Array\n{\n  U64         count;\n  ELF_Shdr64 *v;\n};\n\ntypedef struct ELF_Phdr64Array ELF_Phdr64Array;\nstruct ELF_Phdr64Array\n{\n  U64         count;\n  ELF_Phdr64 *v;\n};\n\ntypedef struct ELF_Bin ELF_Bin;\nstruct ELF_Bin\n{\n  ELF_Hdr64       hdr;\n  Rng1U64         sh_name_range;\n  ELF_Shdr64Array shdrs;\n  ELF_Phdr64Array phdrs;\n};\n\ntypedef struct ELF_GnuDebugLink ELF_GnuDebugLink;\nstruct ELF_GnuDebugLink\n{\n  String8 path;\n  U32     checksum;\n};\n\ntypedef struct ELF_Note ELF_Note;\nstruct ELF_Note\n{\n  String8      owner;\n  ELF_NoteType type;\n  String8      desc;\n};\n\ntypedef struct ELF_NoteNode ELF_NoteNode;\nstruct ELF_NoteNode\n{\n  ELF_Note      v;\n  ELF_NoteNode *next;\n};\n\ntypedef struct ELF_NoteList ELF_NoteList;\nstruct ELF_NoteList\n{\n  U64           count;\n  ELF_NoteNode *first;\n  ELF_NoteNode *last;\n};\n\n////////////////////////////////\n//~ rjf: Parsing Functions\n\n//- rjf: top-level binary parsing\ninternal ELF_Bin elf_bin_from_data(Arena *arena, String8 data);\n\n//- rjf: extra bin info extraction\ninternal B32 elf_is_dwarf_present_from_bin(String8 data, ELF_Bin *bin);\ninternal String8 elf_name_from_shdr64(String8 raw_data, ELF_Bin *bin, ELF_Shdr64 *shdr);\ninternal U64 elf_base_addr_from_bin(ELF_Bin *bin);\ninternal ELF_GnuDebugLink elf_gnu_debug_link_from_bin(String8 raw_data, ELF_Bin *bin);\n\ninternal ELF_NoteList elf_parse_note(Arena *arena, String8 raw_note, ELF_Class elf_class, ELF_MachineKind e_machine);\n\n#endif // ELF_PARSE_H\n"
  },
  {
    "path": "src/eval/eval.mdesk",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n@table(name)\nE_TokenKindTable:\n{\n  {Null}\n  {Identifier}\n  {Numeric}\n  {StringLiteral}\n  {CharLiteral}\n  {Symbol}\n}\n\n@table(name                 basic_string          basic_byte_size)\n// NOTE(rjf): basic_byte_size == 0xFF? => address sized\nE_TypeKindTable:\n{\n  {Null                      \"\"                    0    }\n  {Void                      \"void\"                0    }\n  {Handle                    \"HANDLE\"              0xFF }\n  {HResult                   \"HRESULT\"             4    }\n  {Char8                     \"char8\"               1    }\n  {Char16                    \"char16\"              2    }\n  {Char32                    \"char32\"              4    }\n  {UChar8                    \"uchar8\"              1    }\n  {UChar16                   \"uchar16\"             2    }\n  {UChar32                   \"uchar32\"             4    }\n  {U8                        \"uint8\"               1    }\n  {U16                       \"uint16\"              2    }\n  {U32                       \"uint32\"              4    }\n  {U64                       \"uint64\"              8    }\n  {U128                      \"uint128\"             16   }\n  {U256                      \"uint256\"             32   }\n  {U512                      \"uint512\"             64   }\n  {S8                        \"int8\"                1    }\n  {S16                       \"int16\"               2    }\n  {S32                       \"int32\"               4    }\n  {S64                       \"int64\"               8    }\n  {S128                      \"int128\"              16   }\n  {S256                      \"int256\"              32   }\n  {S512                      \"int512\"              64   }\n  {Bool                      \"bool\"                1    }\n  {F16                       \"float16\"             2    }\n  {F32                       \"float32\"             4    }\n  {F32PP                     \"float32PP\"           4    }\n  {F48                       \"float48\"             6    }\n  {F64                       \"float64\"             8    }\n  {F80                       \"float80\"             10   }\n  {F128                      \"float128\"            16   }\n  {ComplexF32                \"complex_float32\"     8    }\n  {ComplexF64                \"complex_float64\"     16   }\n  {ComplexF80                \"complex_float80\"     20   }\n  {ComplexF128               \"complex_float128\"    32   }\n  {Modifier                  \"modifier\"            0    }\n  {Ptr                       \"ptr\"                 0    }\n  {LRef                      \"lref\"                0    }\n  {RRef                      \"rref\"                0    }\n  {Array                     \"array\"               0    }\n  {Function                  \"function\"            0    }\n  {Method                    \"method\"              0    }\n  {MemberPtr                 \"member_ptr\"          0    }\n  {Struct                    \"struct\"              0    }\n  {Class                     \"class\"               0    }\n  {Union                     \"union\"               0    }\n  {Enum                      \"enum\"                0    }\n  {Alias                     \"typedef\"             0    }\n  {IncompleteStruct          \"struct\"              0    }\n  {IncompleteUnion           \"union\"               0    }\n  {IncompleteClass           \"class\"               0    }\n  {IncompleteEnum            \"enum\"                0    }\n  {Bitfield                  \"bitfield\"            0    }\n  {Variadic                  \"variadic\"            0    }\n  {Set                       \"set\"                 0    }\n  {Lens                      \"lens\"                0    }\n  {LensSpec                  \"lens_spec\"           0    }\n  {MetaExpr                  \"meta_expr\"           0    }\n  {MetaDisplayName           \"meta_display_name\"   0    }\n  {MetaDescription           \"meta_description\"    0    }\n}\n\n@table(name  op_kind  precedence  op_pre  op_sep  op_pos  op_chain)\nE_ExprKindTable:\n{\n  { Nil                  Null                0        \"\"                \"\"        \"\"        \"\" }\n  { Ref                  Null                0        \"\"                \"\"        \"\"        \"\" }\n  \n  { ArrayIndex           Null                0        \"\"                \"[\"       \"]\"       \"\" }\n  { MemberAccess         Null                0        \"\"                \".\"       \"\"        \"\" }\n  { Deref                UnaryPrefix         2        \"*\"               \"\"        \"\"        \"\" }\n  { Address              UnaryPrefix         2        \"&\"               \"\"        \"\"        \"\" }\n  \n  { Cast                 Null                1        \"cast(\"           \")\"       \"\"        \"\" }\n  { Sizeof               UnaryPrefix         1        \"sizeof \"         \"\"        \"\"        \"\" }\n  { Typeof               UnaryPrefix         1        \"typeof \"         \"\"        \"\"        \"\" }\n  { Symbolof             UnaryPrefix         1        \"symbolof \"       \"\"        \"\"        \"\" }\n  { ByteSwap             UnaryPrefix         1        \"bswap \"          \"\"        \"\"        \"\" }\n  \n  { Pos                  UnaryPrefix         2        \"+\"               \"\"        \"\"        \"\" }\n  { Neg                  UnaryPrefix         2        \"-\"               \"\"        \"\"        \"\" }\n  { LogNot               UnaryPrefix         2        \"!\"               \"\"        \"\"        \"\" }\n  { BitNot               UnaryPrefix         2        \"~\"               \"\"        \"\"        \"\" }\n  { Mul                  Binary              3        \"\"                \" * \"     \"\"        \"\" }\n  { Div                  Binary              3        \"\"                \" / \"     \"\"        \"\" }\n  { Mod                  Binary              3        \"\"                \" % \"     \"\"        \"\" }\n  { Add                  Binary              4        \"\"                \" + \"     \"\"        \"\" }\n  { Sub                  Binary              4        \"\"                \" - \"     \"\"        \"\" }\n  { LShift               Binary              5        \"\"                \" << \"    \"\"        \"\" }\n  { RShift               Binary              5        \"\"                \" >> \"    \"\"        \"\" }\n  { Less                 Binary              6        \"\"                \" < \"     \"\"        \"\" }\n  { LsEq                 Binary              6        \"\"                \" <= \"    \"\"        \"\" }\n  { Grtr                 Binary              6        \"\"                \" > \"     \"\"        \"\" }\n  { GrEq                 Binary              6        \"\"                \" >= \"    \"\"        \"\" }\n  { EqEq                 Binary              7        \"\"                \" == \"    \"\"        \"\" }\n  { NtEq                 Binary              7        \"\"                \" != \"    \"\"        \"\" }\n  \n  { BitAnd               Binary              8        \"\"                \" & \"     \"\"        \"\" }\n  { BitXor               Binary              9        \"\"                \" ^ \"     \"\"        \"\" }\n  { BitOr                Binary              10       \"\"                \" | \"     \"\"        \"\" }\n  { LogAnd               Binary              11       \"\"                \" && \"    \"\"        \"\" }\n  { LogOr                Binary              12       \"\"                \" || \"    \"\"        \"\" }\n  \n  { Ternary              Null                0        \"\"                \" ? \"     \"\"        \" : \"}\n  \n  { Call                 Null                15       \"\"                \"(\"       \")\"      \", \"}\n  \n  { LeafBytecode         Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafStringLiteral    Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafU64              Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafF64              Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafF32              Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafIdentifier       Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafOffset           Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafValue            Null                0        \"\"                \"\"        \"\"        \"\" }\n  { LeafFilePath         Null                0        \"\"                \"\"        \"\"        \"\" }\n  \n  { TypeIdent            Null                0        \"\"                \"\"        \"\"        \"\" }\n  { Ptr                  Null                0        \"\"                \"\"        \"\"        \"\" }\n  { Array                Null                0        \"\"                \"\"        \"\"        \"\" }\n  { Func                 Null                0        \"\"                \"\"        \"\"        \"\" }\n  { Unsigned             Null                0        \"unsigned \"       \"\"        \"\"        \"\" }\n  \n  { Define               Binary              13       \"\"                \" = \"     \"\"        \"\" }\n}\n\n@table(name display_string)\nE_InterpretationCodeTable:\n{\n  { Good                    \"\" }\n  { DivideByZero            \"Cannot divide by zero.\" }\n  { BadOp                   \"Invalid operation.\" }\n  { BadOpTypes              \"Invalid operation types.\" }\n  { BadMemRead              \"Failed memory read.\" }\n  { BadRegRead              \"Failed register read.\" }\n  { BadFrameBase            \"Invalid frame base address.\" }\n  { BadModuleBase           \"Invalid module base address.\" }\n  { BadTLSBase              \"Invalid thread-local storage base address.\" }\n  { InsufficientStackSpace  \"Insufficient evaluation machine stack space.\" }\n  { MalformedBytecode       \"Malformed bytecode.\" }\n}\n\n@enum E_TokenKind:\n{\n  @expand(E_TokenKindTable a) `$(a.name)`,\n  COUNT,\n}\n\n@data(String8)\ne_token_kind_strings:\n{\n  @expand(E_TokenKindTable a) `str8_lit_comp(\"$(a.name)\")`\n}\n\n@enum E_TypeKind:\n{\n  @expand(E_TypeKindTable a) `$(a.name)`,\n  COUNT,\n  `FirstBasic      = E_TypeKind_Void`,\n  `LastBasic       = E_TypeKind_ComplexF128`,\n  `FirstInteger    = E_TypeKind_Char8`,\n  `LastInteger     = E_TypeKind_S512`,\n  `FirstSigned1    = E_TypeKind_Char8`,\n  `LastSigned1     = E_TypeKind_Char32`,\n  `FirstSigned2    = E_TypeKind_S8`,\n  `LastSigned2     = E_TypeKind_S512`,\n  `FirstIncomplete = E_TypeKind_IncompleteStruct`,\n  `LastIncomplete  = E_TypeKind_IncompleteEnum`,\n  `FirstMeta       = E_TypeKind_MetaExpr`,\n  `LastMeta        = E_TypeKind_MetaDescription`,\n}\n\n@data(String8) e_type_kind_basic_string_table:\n{\n  @expand(E_TypeKindTable a) `str8_lit_comp(\"$(a.basic_string)\")`;\n}\n\n@data(U8) e_type_kind_basic_byte_size_table:\n{\n  @expand(E_TypeKindTable a) `$(a.basic_byte_size)`;\n}\n\n@enum(U32) E_ExprKind:\n{\n  @expand(E_ExprKindTable a) `$(a.name)`,\n  COUNT,\n}\n\n@data(String8)\ne_expr_kind_strings:\n{\n  @expand(E_ExprKindTable a) `str8_lit_comp(\"$(a.name)\")`\n}\n\n@data(E_OpInfo) e_expr_kind_op_info_table:\n{\n  @expand(E_ExprKindTable a) `{ E_OpKind_$(a.op_kind), $(a.precedence), str8_lit_comp(\"$(a.op_pre)\"), str8_lit_comp(\"$(a.op_sep)\"), str8_lit_comp(\"$(a.op_pos)\"), str8_lit_comp(\"$(a.op_chain)\") }`\n}\n\n@enum E_InterpretationCode:\n{\n  @expand(E_InterpretationCodeTable a) `$(a.name)`,\n  COUNT,\n}\n\n@data(String8) e_interpretation_code_display_strings:\n{\n  @expand(E_InterpretationCodeTable a) `str8_lit_comp(\"$(a.display_string)\")`\n}\n"
  },
  {
    "path": "src/eval/eval_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"eval/generated/eval.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal U64\r\ne_hash_from_string(U64 seed, String8 string)\r\n{\r\n  U64 result = XXH3_64bits_withSeed(string.str, string.size, seed);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Expr Kind Enum Functions\r\n\r\ninternal RDI_EvalOp\r\ne_opcode_from_expr_kind(E_ExprKind kind)\r\n{\r\n  RDI_EvalOp result = RDI_EvalOp_Stop;\r\n  switch(kind)\r\n  {\r\n    case E_ExprKind_Neg:    result = RDI_EvalOp_Neg;    break;\r\n    case E_ExprKind_LogNot: result = RDI_EvalOp_LogNot; break;\r\n    case E_ExprKind_BitNot: result = RDI_EvalOp_BitNot; break;\r\n    case E_ExprKind_Mul:    result = RDI_EvalOp_Mul;    break;\r\n    case E_ExprKind_Div:    result = RDI_EvalOp_Div;    break;\r\n    case E_ExprKind_Mod:    result = RDI_EvalOp_Mod;    break;\r\n    case E_ExprKind_Add:    result = RDI_EvalOp_Add;    break;\r\n    case E_ExprKind_Sub:    result = RDI_EvalOp_Sub;    break;\r\n    case E_ExprKind_LShift: result = RDI_EvalOp_LShift; break;\r\n    case E_ExprKind_RShift: result = RDI_EvalOp_RShift; break;\r\n    case E_ExprKind_Less:   result = RDI_EvalOp_Less;   break;\r\n    case E_ExprKind_LsEq:   result = RDI_EvalOp_LsEq;   break;\r\n    case E_ExprKind_Grtr:   result = RDI_EvalOp_Grtr;   break;\r\n    case E_ExprKind_GrEq:   result = RDI_EvalOp_GrEq;   break;\r\n    case E_ExprKind_EqEq:   result = RDI_EvalOp_EqEq;   break;\r\n    case E_ExprKind_NtEq:   result = RDI_EvalOp_NtEq;   break;\r\n    case E_ExprKind_BitAnd: result = RDI_EvalOp_BitAnd; break;\r\n    case E_ExprKind_BitXor: result = RDI_EvalOp_BitXor; break;\r\n    case E_ExprKind_BitOr:  result = RDI_EvalOp_BitOr;  break;\r\n    case E_ExprKind_LogAnd: result = RDI_EvalOp_LogAnd; break;\r\n    case E_ExprKind_LogOr:  result = RDI_EvalOp_LogOr;  break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_expr_kind_is_comparison(E_ExprKind kind)\r\n{\r\n  B32 result = 0;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case E_ExprKind_EqEq:\r\n    case E_ExprKind_NtEq:\r\n    case E_ExprKind_Less:\r\n    case E_ExprKind_Grtr:\r\n    case E_ExprKind_LsEq:\r\n    case E_ExprKind_GrEq:\r\n    {\r\n      result = 1;\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Type Functions\r\n\r\ninternal B32\r\ne_key_match(E_Key a, E_Key b)\r\n{\r\n  B32 result = (a.u64 == b.u64);\r\n  return result;\r\n}\r\n\r\ninternal E_Key\r\ne_key_zero(void)\r\n{\r\n  E_Key key = {0};\r\n  return key;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Key Type Functions\r\n\r\ninternal void\r\ne_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key)\r\n{\r\n  E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);\r\n  n->v = key;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal void\r\ne_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key)\r\n{\r\n  E_TypeKeyNode *n = push_array(arena, E_TypeKeyNode, 1);\r\n  n->v = key;\r\n  SLLQueuePushFront(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal E_TypeKeyList\r\ne_type_key_list_copy(Arena *arena, E_TypeKeyList *src)\r\n{\r\n  E_TypeKeyList dst = {0};\r\n  for(E_TypeKeyNode *n = src->first; n != 0; n = n->next)\r\n  {\r\n    e_type_key_list_push(arena, &dst, n->v);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Functions\r\n\r\ninternal void\r\ne_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, String8 text)\r\n{\r\n  E_Msg *msg = push_array(arena, E_Msg, 1);\r\n  SLLQueuePush(msgs->first, msgs->last, msg);\r\n  msgs->count += 1;\r\n  msgs->max_kind = Max(kind, msgs->max_kind);\r\n  msg->kind = kind;\r\n  msg->range = range;\r\n  msg->text = text;\r\n}\r\n\r\ninternal void\r\ne_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, char *fmt, ...)\r\n{\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 text = push_str8fv(arena, fmt, args);\r\n  va_end(args);\r\n  e_msg(arena, msgs, kind, range, text);\r\n}\r\n\r\ninternal void\r\ne_msg_list_concat_in_place(E_MsgList *dst, E_MsgList *to_push)\r\n{\r\n  if(dst->last != 0 && to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->count += to_push->count;\r\n    dst->max_kind = Max(dst->max_kind, to_push->max_kind);\r\n  }\r\n  else if(to_push->first != 0)\r\n  {\r\n    MemoryCopyStruct(dst, to_push);\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\ninternal E_MsgList\r\ne_msg_list_copy(Arena *arena, E_MsgList *src)\r\n{\r\n  E_MsgList dst = {0};\r\n  for(E_Msg *msg = src->first; msg != 0; msg = msg->next)\r\n  {\r\n    e_msg(arena, &dst, msg->kind, msg->range, msg->text);\r\n  }\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Space Functions\r\n\r\ninternal E_Space\r\ne_space_make(E_SpaceKind kind)\r\n{\r\n  E_Space space = {0};\r\n  space.kind = kind;\r\n  return space;\r\n}\r\n\r\ninternal B32\r\ne_space_match(E_Space a, E_Space b)\r\n{\r\n  B32 result = MemoryMatchStruct(&a, &b);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Map Functions\r\n\r\n//- rjf: string -> num\r\n\r\ninternal E_String2NumMap\r\ne_string2num_map_make(Arena *arena, U64 slot_count)\r\n{\r\n  E_String2NumMap map = {0};\r\n  map.slots_count = slot_count;\r\n  map.slots = push_array(arena, E_String2NumMapSlot, map.slots_count);\r\n  return map;\r\n}\r\n\r\ninternal void\r\ne_string2num_map_insert(Arena *arena, E_String2NumMap *map, String8 string, U64 num)\r\n{\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  E_String2NumMapNode *existing_node = 0;\r\n  for(E_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next)\r\n  {\r\n    if(str8_match(node->string, string, 0) && node->num == num)\r\n    {\r\n      existing_node = node;\r\n      break;\r\n    }\r\n  }\r\n  if(existing_node == 0)\r\n  {\r\n    E_String2NumMapNode *node = push_array(arena, E_String2NumMapNode, 1);\r\n    SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next);\r\n    SLLQueuePush_N(map->first, map->last, node, order_next);\r\n    node->string = push_str8_copy(arena, string);\r\n    node->num = num;\r\n    map->node_count += 1;\r\n  }\r\n}\r\n\r\ninternal U64\r\ne_num_from_string(E_String2NumMap *map, String8 string)\r\n{\r\n  U64 num = 0;\r\n  if(map->slots_count != 0)\r\n  {\r\n    U64 hash = e_hash_from_string(5381, string);\r\n    U64 slot_idx = hash%map->slots_count;\r\n    E_String2NumMapNode *existing_node = 0;\r\n    for(E_String2NumMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next)\r\n    {\r\n      if(str8_match(node->string, string, 0))\r\n      {\r\n        existing_node = node;\r\n        break;\r\n      }\r\n    }\r\n    if(existing_node != 0)\r\n    {\r\n      num = existing_node->num;\r\n    }\r\n  }\r\n  return num;\r\n}\r\n\r\ninternal E_String2NumMapNodeArray\r\ne_string2num_map_node_array_from_map(Arena *arena, E_String2NumMap *map)\r\n{\r\n  E_String2NumMapNodeArray result = {0};\r\n  result.count = map->node_count;\r\n  result.v = push_array(arena, E_String2NumMapNode *, result.count);\r\n  U64 idx = 0;\r\n  for(E_String2NumMapNode *n = map->first; n != 0; n = n->order_next, idx += 1)\r\n  {\r\n    result.v[idx] = n;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal int\r\ne_string2num_map_node_qsort_compare__num_ascending(E_String2NumMapNode **a, E_String2NumMapNode **b)\r\n{\r\n  int result = 0;\r\n  if(a[0]->num < b[0]->num)\r\n  {\r\n    result = -1;\r\n  }\r\n  else if(a[0]->num > b[0]->num)\r\n  {\r\n    result = +1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ne_string2num_map_node_array_sort__in_place(E_String2NumMapNodeArray *array)\r\n{\r\n  quick_sort(array->v, array->count, sizeof(array->v[0]), e_string2num_map_node_qsort_compare__num_ascending);\r\n}\r\n\r\n//- rjf: string -> expr\r\n\r\ninternal E_String2ExprMap\r\ne_string2expr_map_make(Arena *arena, U64 slot_count)\r\n{\r\n  E_String2ExprMap map = {0};\r\n  map.slots_count = slot_count;\r\n  map.slots = push_array(arena, E_String2ExprMapSlot, map.slots_count);\r\n  return map;\r\n}\r\n\r\ninternal void\r\ne_string2expr_map_insert(Arena *arena, E_String2ExprMap *map, String8 string, E_Expr *expr)\r\n{\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  E_String2ExprMapNode *existing_node = 0;\r\n  for(E_String2ExprMapNode *node = map->slots[slot_idx].first;\r\n      node != 0;\r\n      node = node->hash_next)\r\n  {\r\n    if(str8_match(node->string, string, 0))\r\n    {\r\n      existing_node = node;\r\n      break;\r\n    }\r\n  }\r\n  if(existing_node == 0)\r\n  {\r\n    E_String2ExprMapNode *node = push_array(arena, E_String2ExprMapNode, 1);\r\n    SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next);\r\n    node->string = push_str8_copy(arena, string);\r\n    existing_node = node;\r\n    existing_node->expr = expr;\r\n  }\r\n}\r\n\r\ninternal void\r\ne_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string)\r\n{\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  for(E_String2ExprMapNode *node = map->slots[slot_idx].first;\r\n      node != 0;\r\n      node = node->hash_next)\r\n  {\r\n    if(str8_match(node->string, string, 0))\r\n    {\r\n      node->poison_count += 1;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\ne_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string)\r\n{\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  for(E_String2ExprMapNode *node = map->slots[slot_idx].first;\r\n      node != 0;\r\n      node = node->hash_next)\r\n  {\r\n    if(str8_match(node->string, string, 0) && node->poison_count > 0)\r\n    {\r\n      node->poison_count -= 1;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\ninternal E_Expr *\r\ne_string2expr_map_lookup(E_String2ExprMap *map, String8 string)\r\n{\r\n  E_Expr *expr = &e_expr_nil;\r\n  if(map->slots_count != 0)\r\n  {\r\n    U64 hash = e_hash_from_string(5381, string);\r\n    U64 slot_idx = hash%map->slots_count;\r\n    E_String2ExprMapNode *existing_node = 0;\r\n    for(E_String2ExprMapNode *node = map->slots[slot_idx].first; node != 0; node = node->hash_next)\r\n    {\r\n      if(str8_match(node->string, string, 0) && node->poison_count == 0)\r\n      {\r\n        existing_node = node;\r\n        break;\r\n      }\r\n    }\r\n    if(existing_node != 0)\r\n    {\r\n      expr = existing_node->expr;\r\n    }\r\n  }\r\n  return expr;\r\n}\r\n\r\n//- rjf: string -> type-key\r\n\r\ninternal E_String2TypeKeyMap\r\ne_string2typekey_map_make(Arena *arena, U64 slots_count)\r\n{\r\n  E_String2TypeKeyMap map = {0};\r\n  map.slots_count = slots_count;\r\n  map.slots = push_array(arena, E_String2TypeKeySlot, map.slots_count);\r\n  return map;\r\n}\r\n\r\ninternal void\r\ne_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key)\r\n{\r\n  E_String2TypeKeyNode *n = push_array(arena, E_String2TypeKeyNode, 1);\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n);\r\n  n->string = push_str8_copy(arena, string);\r\n  n->key = key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string)\r\n{\r\n  E_TypeKey key = zero_struct;\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  for(E_String2TypeKeyNode *n = map->slots[slot_idx].first; n != 0; n = n->next)\r\n  {\r\n    if(str8_match(n->string, string, 0))\r\n    {\r\n      key = n->key;\r\n      break;\r\n    }\r\n  }\r\n  return key;\r\n}\r\n\r\n//- rjf: auto hooks\r\n\r\ninternal E_AutoHookMap\r\ne_auto_hook_map_make(Arena *arena, U64 slots_count)\r\n{\r\n  E_AutoHookMap map = {0};\r\n  map.slots_count = slots_count;\r\n  map.slots = push_array(arena, E_AutoHookSlot, map.slots_count);\r\n  return map;\r\n}\r\n\r\ninternal void\r\ne_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params)\r\n{\r\n  // rjf: get type key\r\n  E_TypeKey type_key = params->type_key;\r\n  if(params->type_pattern.size != 0)\r\n  {\r\n    E_Parse parse = e_push_parse_from_string(arena, params->type_pattern);\r\n    type_key = e_type_key_from_expr(parse.expr);\r\n  }\r\n  \r\n  // rjf: extract type pattern\r\n  E_Pattern pattern = {0};\r\n  if(e_type_key_match(e_type_key_zero(), type_key))\r\n  {\r\n    U64 start_string_off = 0;\r\n    for(U64 off = 0; off <= params->type_pattern.size; off += 1)\r\n    {\r\n      U8 byte = (off < params->type_pattern.size ? params->type_pattern.str[off] : 0);\r\n      if(byte == 0 || byte == '?')\r\n      {\r\n        String8 new_part = str8_substr(params->type_pattern, r1u64(start_string_off, off));\r\n        if(new_part.size != 0)\r\n        {\r\n          E_PatternPart *p = push_array(arena, E_PatternPart, 1);\r\n          SLLQueuePush(pattern.first_part, pattern.last_part, p);\r\n          p->string = new_part;\r\n          pattern.count += 1;\r\n        }\r\n      }\r\n      if(byte == '?')\r\n      {\r\n        E_PatternPart *p = push_array(arena, E_PatternPart, 1);\r\n        SLLQueuePush(pattern.first_part, pattern.last_part, p);\r\n        pattern.count += 1;\r\n        if(off+1 < params->type_pattern.size && params->type_pattern.str[off+1] == '{')\r\n        {\r\n          off += 2;\r\n          String8 wildcard_inst_names_string = str8_skip(params->type_pattern, off);\r\n          wildcard_inst_names_string = str8_prefix(wildcard_inst_names_string, str8_find_needle(wildcard_inst_names_string, 0, str8_lit(\"}\"), 0));\r\n          if(wildcard_inst_names_string.size != 0)\r\n          {\r\n            Temp scratch = scratch_begin(&arena, 1);\r\n            U8 wildcard_inst_name_split_char = ',';\r\n            String8List wildcard_inst_names = str8_split(scratch.arena, wildcard_inst_names_string, &wildcard_inst_name_split_char, 1, 0);\r\n            for(String8Node *n = wildcard_inst_names.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_push(arena, &p->wildcard_inst_names, str8_skip_chop_whitespace(n->string));\r\n            }\r\n            scratch_end(scratch);\r\n            off += wildcard_inst_names_string.size;\r\n          }\r\n        }\r\n        start_string_off = off+1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: if the type key is nonzero, *or* we have type patterns, then insert\r\n  // into map accordingly\r\n  if(!e_type_key_match(e_type_key_zero(), type_key) ||\r\n     pattern.count != 0)\r\n  {\r\n    E_AutoHookNode *node = push_array(arena, E_AutoHookNode, 1);\r\n    node->type_string = str8_skip_chop_whitespace(e_type_string_from_key(arena, type_key));\r\n    node->type_pattern = pattern;\r\n    node->expr_string = push_str8_copy(arena, params->tag_expr_string);\r\n    if(!e_type_key_match(e_type_key_zero(), type_key))\r\n    {\r\n      U64 hash = e_hash_from_string(5381, node->type_string);\r\n      U64 slot_idx = hash%map->slots_count;\r\n      SLLQueuePush_N(map->slots[slot_idx].first, map->slots[slot_idx].last, node, hash_next);\r\n    }\r\n    else\r\n    {\r\n      SLLQueuePush_N(map->first_pattern, map->last_pattern, node, pattern_order_next);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug-Info-Driven Map Building Functions\r\n\r\ninternal E_String2NumMap *\r\ne_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: gather scopes to walk\r\n  typedef struct Task Task;\r\n  struct Task\r\n  {\r\n    Task *next;\r\n    RDI_Scope *scope;\r\n  };\r\n  Task *first_task = 0;\r\n  Task *last_task = 0;\r\n  \r\n  //- rjf: voff -> tightest scope\r\n  RDI_Scope *tightest_scope = 0;\r\n  {\r\n    U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff);\r\n    RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);\r\n    Task *task = push_array(scratch.arena, Task, 1);\r\n    task->scope = scope;\r\n    SLLQueuePush(first_task, last_task, task);\r\n    tightest_scope = scope;\r\n  }\r\n  \r\n  //- rjf: voff-1 -> scope\r\n  if(voff > 0)\r\n  {\r\n    U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff-1);\r\n    RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);\r\n    if(scope != tightest_scope)\r\n    {\r\n      Task *task = push_array(scratch.arena, Task, 1);\r\n      task->scope = scope;\r\n      SLLQueuePush(first_task, last_task, task);\r\n    }\r\n  }\r\n  \r\n  //- rjf: tightest scope -> walk up the tree & build tasks for each parent scope\r\n  if(tightest_scope != 0)\r\n  {\r\n    RDI_Scope *nil_scope = rdi_element_from_name_idx(rdi, Scopes, 0);\r\n    for(RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, tightest_scope->parent_scope_idx);\r\n        scope != 0 && scope != nil_scope;\r\n        scope = rdi_element_from_name_idx(rdi, Scopes, scope->parent_scope_idx))\r\n    {\r\n      Task *task = push_array(scratch.arena, Task, 1);\r\n      task->scope = scope;\r\n      SLLQueuePush(first_task, last_task, task);\r\n    }\r\n  }\r\n  \r\n  //- rjf: build blank map\r\n  E_String2NumMap *map = push_array(arena, E_String2NumMap, 1);\r\n  *map = e_string2num_map_make(arena, 1024);\r\n  \r\n  //- rjf: accumulate locals for all tasks\r\n  for(Task *task = first_task; task != 0; task = task->next)\r\n  {\r\n    RDI_Scope *scope = task->scope;\r\n    if(scope != 0)\r\n    {\r\n      U32 local_opl_idx = scope->local_first + scope->local_count;\r\n      for(U32 local_idx = scope->local_first; local_idx < local_opl_idx; local_idx += 1)\r\n      {\r\n        RDI_Local *local_var = rdi_element_from_name_idx(rdi, Locals, local_idx);\r\n        U64 local_name_size = 0;\r\n        U8 *local_name_str = rdi_string_from_idx(rdi, local_var->name_string_idx, &local_name_size);\r\n        String8 name = push_str8_copy(arena, str8(local_name_str, local_name_size));\r\n        e_string2num_map_insert(arena, map, name, (U64)local_idx+1);\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return map;\r\n}\r\n\r\ninternal E_String2NumMap *\r\ne_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff)\r\n{\r\n  //- rjf: voff -> tightest scope\r\n  U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff);\r\n  RDI_Scope *tightest_scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);\r\n  \r\n  //- rjf: tightest scope -> procedure\r\n  U32 proc_idx = tightest_scope->proc_idx;\r\n  RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx);\r\n  \r\n  //- rjf: procedure -> udt\r\n  U32 udt_idx = procedure->container_idx;\r\n  RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx);\r\n  \r\n  //- rjf: build blank map\r\n  E_String2NumMap *map = push_array(arena, E_String2NumMap, 1);\r\n  *map = e_string2num_map_make(arena, 64);\r\n  \r\n  //- rjf: udt -> fill member map\r\n  if(!(udt->flags & RDI_UDTFlag_EnumMembers))\r\n  {\r\n    U64 data_member_num = 1;\r\n    for(U32 member_idx = udt->member_first;\r\n        member_idx < udt->member_first+udt->member_count;\r\n        member_idx += 1)\r\n    {\r\n      RDI_Member *m = rdi_element_from_name_idx(rdi, Members, member_idx);\r\n      if(m->kind == RDI_MemberKind_DataField)\r\n      {\r\n        String8 name = {0};\r\n        name.str = rdi_string_from_idx(rdi, m->name_string_idx, &name.size);\r\n        e_string2num_map_insert(arena, map, name, data_member_num);\r\n        data_member_num += 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return map;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Creation & Selection\r\n\r\ninternal E_Cache *\r\ne_cache_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  E_Cache *cache = push_array(arena, E_Cache, 1);\r\n  cache->arena = arena;\r\n  cache->arena_eval_start_pos = arena_pos(arena);\r\n  return cache;\r\n}\r\n\r\ninternal void\r\ne_cache_release(E_Cache *cache)\r\n{\r\n  arena_release(cache->arena);\r\n}\r\n\r\ninternal void\r\ne_select_cache(E_Cache *cache)\r\n{\r\n  e_cache = cache;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Phase Markers\r\n\r\ninternal void\r\ne_select_base_ctx(E_BaseCtx *ctx)\r\n{\r\n  //- rjf: select base context\r\n  if(ctx->modules == 0)          { ctx->modules = &e_module_nil; }\r\n  if(ctx->primary_module == 0)   { ctx->primary_module = &e_module_nil; }\r\n  if(ctx->dbg_infos == 0)        { ctx->dbg_infos = &e_dbg_info_nil; }\r\n  if(ctx->primary_dbg_info == 0) { ctx->primary_dbg_info = &e_dbg_info_nil; }\r\n  e_base_ctx = ctx;\r\n  \r\n  //- rjf: reset the evaluation cache\r\n  arena_pop_to(e_cache->arena, e_cache->arena_eval_start_pos);\r\n  e_cache->key_id_gen = 0;\r\n  e_cache->key_slots_count = 4096;\r\n  e_cache->key_slots = push_array(e_cache->arena, E_CacheSlot, e_cache->key_slots_count);\r\n  e_cache->string_slots_count = 4096;\r\n  e_cache->string_slots = push_array(e_cache->arena, E_CacheSlot, e_cache->string_slots_count);\r\n  e_cache->free_parent_node = 0;\r\n  e_cache->top_parent_node = 0;\r\n  e_cache->cons_id_gen = 0;\r\n  e_cache->cons_content_slots_count = 256;\r\n  e_cache->cons_key_slots_count = 256;\r\n  e_cache->cons_content_slots = push_array(e_cache->arena, E_ConsTypeSlot, e_cache->cons_content_slots_count);\r\n  e_cache->cons_key_slots = push_array(e_cache->arena, E_ConsTypeSlot, e_cache->cons_key_slots_count);\r\n  e_cache->member_cache_slots_count = 256;\r\n  e_cache->member_cache_slots = push_array(e_cache->arena, E_MemberCacheSlot, e_cache->member_cache_slots_count);\r\n  e_cache->enum_val_cache_slots_count = 256;\r\n  e_cache->enum_val_cache_slots = push_array(e_cache->arena, E_EnumValCacheSlot, e_cache->enum_val_cache_slots_count);\r\n  e_cache->type_cache_slots_count = 1024;\r\n  e_cache->type_cache_slots = push_array(e_cache->arena, E_TypeCacheSlot, e_cache->type_cache_slots_count);\r\n  e_cache->file_type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                           .name = str8_lit(\"file\"),\r\n                                           .irext  = E_TYPE_IREXT_FUNCTION_NAME(file),\r\n                                           .access = E_TYPE_ACCESS_FUNCTION_NAME(file),\r\n                                           .expand =\r\n                                           {\r\n                                             .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(file),\r\n                                             .range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(file),\r\n                                           });\r\n  e_cache->folder_type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                             .name = str8_lit(\"folder\"),\r\n                                             .expand =\r\n                                             {\r\n                                               .info        = E_TYPE_EXPAND_INFO_FUNCTION_NAME(folder),\r\n                                               .range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(folder),\r\n                                               .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(folder),\r\n                                               .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(folder),\r\n                                             });\r\n  e_cache->thread_ip_procedure = rdi_procedure_from_voff(e_base_ctx->primary_dbg_info->rdi, e_base_ctx->thread_ip_voff);\r\n  e_cache->used_expr_map = push_array(e_cache->arena, E_UsedExprMap, 1);\r\n  e_cache->used_expr_map->slots_count = 64;\r\n  e_cache->used_expr_map->slots = push_array(e_cache->arena, E_UsedExprSlot, e_cache->used_expr_map->slots_count);\r\n  e_cache->type_auto_hook_cache_map = push_array(e_cache->arena, E_TypeAutoHookCacheMap, 1);\r\n  e_cache->type_auto_hook_cache_map->slots_count = 256;\r\n  e_cache->type_auto_hook_cache_map->slots = push_array(e_cache->arena, E_TypeAutoHookCacheSlot, e_cache->type_auto_hook_cache_map->slots_count);\r\n  e_cache->string_id_gen = 0;\r\n  e_cache->string_id_map = push_array(e_cache->arena, E_StringIDMap, 1);\r\n  e_cache->string_id_map->id_slots_count = 1024;\r\n  e_cache->string_id_map->id_slots = push_array(e_cache->arena, E_StringIDSlot, e_cache->string_id_map->id_slots_count);\r\n  e_cache->string_id_map->hash_slots_count = 1024;\r\n  e_cache->string_id_map->hash_slots = push_array(e_cache->arena, E_StringIDSlot, e_cache->string_id_map->hash_slots_count);\r\n}\r\n\r\ninternal void\r\ne_select_ir_ctx(E_IRCtx *ctx)\r\n{\r\n  if(ctx->regs_map == 0)       { ctx->regs_map = &e_string2num_map_nil; }\r\n  if(ctx->reg_alias_map == 0)  { ctx->reg_alias_map = &e_string2num_map_nil; }\r\n  if(ctx->locals_map == 0)     { ctx->locals_map = &e_string2num_map_nil; }\r\n  if(ctx->member_map == 0)     { ctx->member_map = &e_string2num_map_nil; }\r\n  if(ctx->macro_map == 0)      { ctx->macro_map = push_array(e_cache->arena, E_String2ExprMap, 1); ctx->macro_map[0] = e_string2expr_map_make(e_cache->arena, 512); }\r\n  e_ir_ctx = ctx;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Context Accessors\r\n\r\ninternal E_DbgInfo *\r\ne_dbg_info_from_module(E_Module *module)\r\n{\r\n  E_DbgInfo *result = &e_dbg_info_nil;\r\n  if(0 < module->dbg_info_num && module->dbg_info_num <= e_base_ctx->dbg_infos_count)\r\n  {\r\n    result = &e_base_ctx->dbg_infos[module->dbg_info_num-1];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_DbgInfo *\r\ne_dbg_info_from_type_key(E_TypeKey type_key)\r\n{\r\n  E_DbgInfo *result = &e_dbg_info_nil;\r\n  if(type_key.kind == E_TypeKeyKind_Ext &&\r\n     0 < type_key.u32[2] && type_key.u32[2] <= e_base_ctx->dbg_infos_count)\r\n  {\r\n    result = &e_base_ctx->dbg_infos[type_key.u32[2]-1];\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Accessing Functions\r\n\r\n//- rjf: parent key stack\r\n\r\ninternal E_Key\r\ne_parent_key_push(E_Key key)\r\n{\r\n  E_Key top = {0};\r\n  if(e_cache->top_parent_node != 0)\r\n  {\r\n    top = e_cache->top_parent_node->key;\r\n  }\r\n  E_CacheParentNode *n = e_cache->free_parent_node;\r\n  if(n != 0)\r\n  {\r\n    SLLStackPop(e_cache->free_parent_node);\r\n  }\r\n  else\r\n  {\r\n    n = push_array(e_cache->arena, E_CacheParentNode, 1);\r\n  }\r\n  SLLStackPush(e_cache->top_parent_node, n);\r\n  n->key = key;\r\n  return top;\r\n}\r\n\r\ninternal E_Key\r\ne_parent_key_pop(void)\r\n{\r\n  E_CacheParentNode *n = e_cache->top_parent_node;\r\n  SLLStackPop(e_cache->top_parent_node);\r\n  SLLStackPush(e_cache->free_parent_node, n);\r\n  E_Key popped = n->key;\r\n  return popped;\r\n}\r\n\r\n//- rjf: key construction\r\n\r\ninternal E_Key\r\ne_key_from_string(String8 string)\r\n{\r\n  E_Key parent_key = {0};\r\n  if(e_cache->top_parent_node)\r\n  {\r\n    parent_key = e_cache->top_parent_node->key;\r\n  }\r\n  U64 hash = e_hash_from_string(parent_key.u64, string);\r\n  U64 slot_idx = hash%e_cache->string_slots_count;\r\n  E_CacheSlot *slot = &e_cache->string_slots[slot_idx];\r\n  E_CacheNode *node = 0;\r\n  for(E_CacheNode *n = slot->first; n != 0; n = n->string_next)\r\n  {\r\n    if(e_key_match(parent_key, n->bundle.parent_key) &&\r\n       str8_match(n->bundle.string, string, 0) &&\r\n       (n->bundle.interpretation.space.kind == E_SpaceKind_Null ||\r\n        e_space_gen(n->bundle.interpretation.space) == n->bundle.space_gen))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node == 0)\r\n  {\r\n    e_cache->key_id_gen += 1;\r\n    E_Key key = {e_cache->key_id_gen};\r\n    U64 key_hash = e_hash_from_string(5381, str8_struct(&key));\r\n    U64 key_slot_idx = key_hash%e_cache->key_slots_count;\r\n    E_CacheSlot *key_slot = &e_cache->key_slots[key_slot_idx];\r\n    node = push_array(e_cache->arena, E_CacheNode, 1);\r\n    SLLQueuePush_N(slot->first, slot->last, node, string_next);\r\n    SLLQueuePush_N(key_slot->first, key_slot->last, node, key_next);\r\n    node->bundle.key = key;\r\n    node->bundle.parent_key = parent_key;\r\n    node->bundle.string = push_str8_copy(e_cache->arena, string);\r\n  }\r\n  return node->bundle.key;\r\n}\r\n\r\ninternal E_Key\r\ne_key_from_stringf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  E_Key result = e_key_from_string(string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal E_Key\r\ne_key_from_expr(E_Expr *expr)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 string = e_string_from_expr(scratch.arena, expr, str8_zero());\r\n  E_Key key = e_key_from_string(string);\r\n  scratch_end(scratch);\r\n  return key;\r\n}\r\n\r\n//- rjf: base key -> node helper\r\n\r\ninternal E_CacheBundle *\r\ne_cache_bundle_from_key(E_Key key)\r\n{\r\n  U64 hash = e_hash_from_string(5381, str8_struct(&key));\r\n  U64 slot_idx = hash%e_cache->key_slots_count;\r\n  E_CacheSlot *slot = &e_cache->key_slots[slot_idx];\r\n  E_CacheNode *node = 0;\r\n  for(E_CacheNode *n = slot->first; n != 0; n = n->key_next)\r\n  {\r\n    if(e_key_match(n->bundle.key, key))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  E_CacheBundle *bundle = &e_cache_bundle_nil;\r\n  if(node != 0)\r\n  {\r\n    bundle = &node->bundle;\r\n  }\r\n  return bundle;\r\n}\r\n\r\n//- rjf: bundle -> pipeline stage outputs\r\n\r\ninternal E_Parse\r\ne_parse_from_bundle(E_CacheBundle *bundle)\r\n{\r\n  if(bundle != &e_cache_bundle_nil && !(bundle->flags & E_CacheBundleFlag_Parse))\r\n  {\r\n    bundle->flags |= E_CacheBundleFlag_Parse;\r\n    bundle->parse = e_push_parse_from_string(e_cache->arena, bundle->string);\r\n    E_MsgList msgs_copy = e_msg_list_copy(e_cache->arena, &bundle->parse.msgs);\r\n    e_msg_list_concat_in_place(&bundle->msgs, &msgs_copy);\r\n  }\r\n  E_Parse parse = bundle->parse;\r\n  return parse;\r\n}\r\n\r\ninternal E_IRTreeAndType\r\ne_irtree_from_bundle(E_CacheBundle *bundle)\r\n{\r\n  if(bundle != &e_cache_bundle_nil && !(bundle->flags & E_CacheBundleFlag_IRTree))\r\n  {\r\n    bundle->flags |= E_CacheBundleFlag_IRTree;\r\n    E_IRTreeAndType parent = e_irtree_from_key(bundle->parent_key);\r\n    E_Parse parse = e_parse_from_bundle(bundle);\r\n    ProfScope(\"irtree generation for '%.*s'\", str8_varg(bundle->string))\r\n    {\r\n      bundle->irtree = e_push_irtree_and_type_from_expr(e_cache->arena, &parent, &e_default_identifier_resolution_rule, 0, 0, parse.expr);\r\n    }\r\n    E_MsgList msgs_copy = e_msg_list_copy(e_cache->arena, &bundle->irtree.msgs);\r\n    e_msg_list_concat_in_place(&bundle->msgs, &msgs_copy);\r\n  }\r\n  E_IRTreeAndType result = bundle->irtree;\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ne_bytecode_from_bundle(E_CacheBundle *bundle)\r\n{\r\n  if(bundle != &e_cache_bundle_nil && !(bundle->flags & E_CacheBundleFlag_Bytecode))\r\n  {\r\n    bundle->flags |= E_CacheBundleFlag_Bytecode;\r\n    Temp scratch = scratch_begin(0, 0);\r\n    E_IRTreeAndType irtree = e_irtree_from_bundle(bundle);\r\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree.root);\r\n    bundle->bytecode = e_bytecode_from_oplist(e_cache->arena, &oplist);\r\n    scratch_end(scratch);\r\n  }\r\n  String8 result = bundle->bytecode;\r\n  return result;\r\n}\r\n\r\ninternal E_Interpretation\r\ne_interpretation_from_bundle(E_CacheBundle *bundle)\r\n{\r\n  if(bundle != &e_cache_bundle_nil && !(bundle->flags & E_CacheBundleFlag_Interpret))\r\n  {\r\n    bundle->flags |= E_CacheBundleFlag_Interpret;\r\n    String8 bytecode = e_bytecode_from_bundle(bundle);\r\n    E_Interpretation interpret = e_interpret(bytecode);\r\n    if(E_InterpretationCode_Good < interpret.code && interpret.code < E_InterpretationCode_COUNT)\r\n    {\r\n      e_msg(e_cache->arena, &bundle->msgs, E_MsgKind_InterpretationError, r1u64(0, 0), e_interpretation_code_display_strings[interpret.code]);\r\n    }\r\n    bundle->interpretation = interpret;\r\n    bundle->space_gen = e_space_gen(interpret.space);\r\n  }\r\n  E_Interpretation interpret = bundle->interpretation;\r\n  return interpret;\r\n}\r\n\r\n//- rjf: key -> full expression string\r\n\r\ninternal String8\r\ne_full_expr_string_from_key(Arena *arena, E_Key key)\r\n{\r\n  E_CacheBundle *bundle = e_cache_bundle_from_key(key);\r\n  String8 result = push_str8_copy(arena, bundle->string);\r\n  if(!e_key_match(bundle->parent_key, e_key_zero()))\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- NOTE(rjf): any individual eval does not contain all information for\r\n    // reconstructing an entire \"flattened\" expression string. this is because\r\n    // one evaluation may be e.g. `$.x`, in the context of `foobar`, and so\r\n    // the full thing is evaluated as equivalent to `foobar.x`. In that case,\r\n    // `foobar` is referred to via the \"parent key\" of the evaluation for\r\n    // `$.x`.\r\n    //\r\n    // because parents may themselves have parents, e.g. `$.x` in the context\r\n    // of `$` in the context of `foobar`, we need to apply the parent\r\n    // expression strings to each parent.\r\n    //\r\n    // we do this in order, from oldest ancestor to the passed-in evaluation\r\n    // key, so we gather the fully-resolved string at the end of the chain.\r\n    \r\n    //- rjf: gather the entire chain of parents (in order of deepest ancestor -> shallowest)\r\n    typedef struct ParentResolveTask ParentResolveTask;\r\n    struct ParentResolveTask\r\n    {\r\n      ParentResolveTask *next;\r\n      E_CacheBundle *bundle;\r\n    };\r\n    ParentResolveTask start_task = {0, bundle};\r\n    ParentResolveTask *first_task = &start_task;\r\n    ParentResolveTask *last_task = first_task;\r\n    for(ParentResolveTask *t = first_task, *next = 0; t != 0; (t = next, next = 0))\r\n    {\r\n      if(!e_key_match(t->bundle->parent_key, e_key_zero()))\r\n      {\r\n        ParentResolveTask *task = push_array(scratch.arena, ParentResolveTask, 1);\r\n        SLLQueuePushFront(first_task, last_task, task);\r\n        task->bundle = e_cache_bundle_from_key(t->bundle->parent_key);\r\n        next = task;\r\n      }\r\n    }\r\n    \r\n    //- rjf: walk the chain of tasks, from deepest -> shallowest, producing a\r\n    // more fully resolved string at each step\r\n    String8 parent_string = {0};\r\n    for(ParentResolveTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      E_Parse parse = e_parse_from_bundle(t->bundle);\r\n      parent_string = e_string_from_expr(scratch.arena, parse.expr, parent_string);\r\n    }\r\n    \r\n    //- rjf: take final string as result\r\n    result = push_str8_copy(arena, parent_string);\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: comprehensive bundle\r\n\r\ninternal E_Eval\r\ne_eval_from_bundle(E_CacheBundle *bundle)\r\n{\r\n  E_Eval eval =\r\n  {\r\n    .key       = bundle->key,\r\n    .parent_key= bundle->parent_key,\r\n    .string    = bundle->string,\r\n    .expr      = e_parse_from_bundle(bundle).expr,\r\n    .irtree    = e_irtree_from_bundle(bundle),\r\n    .bytecode  = e_bytecode_from_bundle(bundle),\r\n    .msgs      = bundle->msgs,\r\n  };\r\n  E_Interpretation interpretation = e_interpretation_from_bundle(bundle);\r\n  eval.code = interpretation.code;\r\n  eval.value = interpretation.value;\r\n  eval.space = interpretation.space;\r\n  return eval;\r\n}\r\n\r\ninternal E_Eval\r\ne_value_eval_from_eval(E_Eval eval)\r\n{\r\n  ProfBeginFunction();\r\n  if(eval.irtree.mode == E_Mode_Offset)\r\n  {\r\n    E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n    E_TypeKind type_kind = e_type_kind_from_key(type_key);\r\n    if(type_kind == E_TypeKind_Array)\r\n    {\r\n      eval.irtree.mode = E_Mode_Value;\r\n    }\r\n    else\r\n    {\r\n      U64 type_byte_size = e_type_byte_size_from_key(type_key);\r\n      Rng1U64 value_vaddr_range = r1u64(eval.value.u64, eval.value.u64 + type_byte_size);\r\n      MemoryZeroStruct(&eval.value);\r\n      if(!e_type_key_match(type_key, e_type_key_zero()) &&\r\n         type_byte_size <= sizeof(E_Value) &&\r\n         e_space_read(eval.space, &eval.value, value_vaddr_range))\r\n      {\r\n        eval.irtree.mode = E_Mode_Value;\r\n        \r\n        // rjf: mask&shift, for bitfields\r\n        if(type_kind == E_TypeKind_Bitfield && type_byte_size <= sizeof(U64))\r\n        {\r\n          E_Type *type = e_type_from_key(type_key);\r\n          U64 valid_bits_mask = 0;\r\n          for(U64 idx = 0; idx < type->count; idx += 1)\r\n          {\r\n            valid_bits_mask |= (1ull<<idx);\r\n          }\r\n          eval.value.u64 = eval.value.u64 >> type->off;\r\n          eval.value.u64 = eval.value.u64 & valid_bits_mask;\r\n          eval.irtree.type_key = type->direct_type_key;\r\n        }\r\n        \r\n        // rjf: manually sign-extend\r\n        switch(type_kind)\r\n        {\r\n          default: break;\r\n          case E_TypeKind_Char8:\r\n          case E_TypeKind_S8:  {eval.value.s64 = (S64)*((S8 *)&eval.value.u64);}break;\r\n          case E_TypeKind_Char16:\r\n          case E_TypeKind_S16: {eval.value.s64 = (S64)*((S16 *)&eval.value.u64);}break;\r\n          case E_TypeKind_Char32:\r\n          case E_TypeKind_S32: {eval.value.s64 = (S64)*((S32 *)&eval.value.u64);}break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return eval;\r\n}\r\n\r\n//- rjf: type key -> auto hooks\r\n\r\ninternal E_AutoHookMatchList\r\ne_push_auto_hook_matches_from_type_key(Arena *arena, E_TypeKey type_key)\r\n{\r\n  ProfBeginFunction();\r\n  E_AutoHookMatchList matches = {0};\r\n  if(e_ir_ctx != 0)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    E_AutoHookMap *map = e_ir_ctx->auto_hook_map;\r\n    String8 type_string = str8_skip_chop_whitespace(e_type_string_from_key(scratch.arena, type_key));\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather exact-type-key-matches from the map\r\n    //\r\n    if(map != 0 && map->slots_count != 0)\r\n    {\r\n      U64 hash = e_hash_from_string(5381, type_string);\r\n      U64 slot_idx = hash%map->slots_count;\r\n      for(E_AutoHookNode *n = map->slots[slot_idx].first; n != 0; n = n->hash_next)\r\n      {\r\n        if(str8_match(n->type_string, type_string, 0))\r\n        {\r\n          E_AutoHookMatch *match = push_array(arena, E_AutoHookMatch, 1);\r\n          SLLQueuePush(matches.first, matches.last, match);\r\n          match->expr = e_parse_from_string(n->expr_string).expr;\r\n          matches.count += 1;\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather fuzzy matches from all patterns in the map\r\n    //\r\n    if(map != 0 && map->first_pattern != 0)\r\n    {\r\n      for(E_AutoHookNode *auto_hook_node = map->first_pattern;\r\n          auto_hook_node != 0;\r\n          auto_hook_node = auto_hook_node->pattern_order_next)\r\n      {\r\n        ////////////////////////\r\n        //- rjf: determine if this pattern fits this type's string; gather wildcard instances\r\n        //\r\n        E_AutoHookWildcardInst *first_wildcard_inst = 0;\r\n        E_AutoHookWildcardInst *last_wildcard_inst = 0;\r\n        B32 fits_this_type_string = 1;\r\n        {\r\n          U64 scan_pos = 0;\r\n          for(E_PatternPart *part = auto_hook_node->type_pattern.first_part; part != 0 && fits_this_type_string; part = part->next)\r\n          {\r\n            String8 pattern_string = part->string;\r\n            \r\n            //- rjf: skip whitespace\r\n            for(;scan_pos < type_string.size;)\r\n            {\r\n              if(char_is_space(type_string.str[scan_pos]))\r\n              {\r\n                scan_pos += 1;\r\n              }\r\n              else\r\n              {\r\n                break;\r\n              }\r\n            }\r\n            \r\n            //- rjf: no pattern string -> wildcard. skip wildcard portion\r\n            if(pattern_string.size == 0)\r\n            {\r\n              String8 terminator_pattern_string = part->next ? part->next->string : str8_zero();\r\n              U64 brace_nest_depth = 0;\r\n              U64 paren_nest_depth = 0;\r\n              U64 angle_nest_depth = 0;\r\n              U64 brack_nest_depth = 0;\r\n              U64 start_inst_off = scan_pos;\r\n              String8Node *wildcard_inst_name_node = part->wildcard_inst_names.first;\r\n              for(B32 done = 0; !done && scan_pos < type_string.size; scan_pos += 1)\r\n              {\r\n                if(0){}\r\n                else if(type_string.str[scan_pos] == '{') { brace_nest_depth += 1; }\r\n                else if(type_string.str[scan_pos] == '(') { paren_nest_depth += 1; }\r\n                else if(type_string.str[scan_pos] == '<') { angle_nest_depth += 1; }\r\n                else if(type_string.str[scan_pos] == '[') { brack_nest_depth += 1; }\r\n                else if(type_string.str[scan_pos] == '}' && brace_nest_depth > 0) { brace_nest_depth -= 1; }\r\n                else if(type_string.str[scan_pos] == ')' && paren_nest_depth > 0) { paren_nest_depth -= 1; }\r\n                else if(type_string.str[scan_pos] == '>' && angle_nest_depth > 0) { angle_nest_depth -= 1; }\r\n                else if(type_string.str[scan_pos] == ']' && brack_nest_depth > 0) { brack_nest_depth -= 1; }\r\n                else if(part->next == 0)\r\n                {\r\n                  done = 1;\r\n                  scan_pos = type_string.size;\r\n                }\r\n                else if(str8_match(terminator_pattern_string, str8_skip(type_string, scan_pos), StringMatchFlag_RightSideSloppy))\r\n                {\r\n                  done = 1;\r\n                }\r\n                if((type_string.str[scan_pos] == ',' || done) &&\r\n                   brace_nest_depth == 0 &&\r\n                   paren_nest_depth == 0 &&\r\n                   angle_nest_depth == 0 &&\r\n                   brack_nest_depth == 0)\r\n                {\r\n                  String8 wildcard_inst_string = str8_skip_chop_whitespace(str8_substr(type_string, r1u64(start_inst_off, scan_pos)));\r\n                  start_inst_off = scan_pos+1;\r\n                  E_AutoHookWildcardInst *inst = push_array(arena, E_AutoHookWildcardInst, 1);\r\n                  SLLQueuePush(first_wildcard_inst, last_wildcard_inst, inst);\r\n                  inst->name = wildcard_inst_name_node ? wildcard_inst_name_node->string : str8_zero();\r\n                  inst->inst_expr = e_parse_from_string(wildcard_inst_string).expr;\r\n                  if(wildcard_inst_name_node)\r\n                  {\r\n                    wildcard_inst_name_node = wildcard_inst_name_node->next;\r\n                  }\r\n                }\r\n                if(done)\r\n                {\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: pattern string -> find next occurrence.\r\n            else if(pattern_string.size != 0)\r\n            {\r\n              if(!str8_match(str8_substr(type_string, r1u64(scan_pos, scan_pos+pattern_string.size)), pattern_string, 0))\r\n              {\r\n                fits_this_type_string = 0;\r\n              }\r\n              else\r\n              {\r\n                scan_pos += pattern_string.size;\r\n              }\r\n            }\r\n          }\r\n          if(fits_this_type_string && scan_pos < type_string.size)\r\n          {\r\n            fits_this_type_string = 0;\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: push match if this type fits\r\n        //\r\n        if(fits_this_type_string)\r\n        {\r\n          E_AutoHookMatch *match = push_array(arena, E_AutoHookMatch, 1);\r\n          SLLQueuePush(matches.first, matches.last, match);\r\n          match->expr = e_parse_from_string(auto_hook_node->expr_string).expr;\r\n          match->first_wildcard_inst = first_wildcard_inst;\r\n          match->last_wildcard_inst = last_wildcard_inst;\r\n          matches.count += 1;\r\n        }\r\n      }\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  ProfEnd();\r\n  return matches;\r\n}\r\n\r\ninternal E_AutoHookMatchList\r\ne_auto_hook_matches_from_type_key(E_TypeKey type_key)\r\n{\r\n  E_AutoHookMatchList matches = {0};\r\n  {\r\n    U64 hash = e_hash_from_string(5381, str8_struct(&type_key));\r\n    U64 slot_idx = hash%e_cache->type_auto_hook_cache_map->slots_count;\r\n    E_TypeAutoHookCacheNode *node = 0;\r\n    for(E_TypeAutoHookCacheNode *n = e_cache->type_auto_hook_cache_map->slots[slot_idx].first;\r\n        n != 0;\r\n        n = n->next)\r\n    {\r\n      if(e_type_key_match(n->key, type_key))\r\n      {\r\n        node = n;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      node = push_array(e_cache->arena, E_TypeAutoHookCacheNode, 1);\r\n      SLLQueuePush(e_cache->type_auto_hook_cache_map->slots[slot_idx].first, e_cache->type_auto_hook_cache_map->slots[slot_idx].last, node);\r\n      node->key = type_key;\r\n      node->matches = e_push_auto_hook_matches_from_type_key(e_cache->arena, type_key);\r\n    }\r\n    matches = node->matches;\r\n  }\r\n  return matches;\r\n}\r\n\r\n//- rjf: string IDs\r\n\r\ninternal U64\r\ne_id_from_string(String8 string)\r\n{\r\n  U64 hash = e_hash_from_string(5381, string);\r\n  U64 hash_slot_idx = hash%e_cache->string_id_map->hash_slots_count;\r\n  E_StringIDNode *node = 0;\r\n  for(E_StringIDNode *n = e_cache->string_id_map->hash_slots[hash_slot_idx].first; n != 0; n = n->hash_next)\r\n  {\r\n    if(str8_match(n->string, string, 0))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node == 0)\r\n  {\r\n    e_cache->string_id_gen += 1;\r\n    U64 id = e_cache->string_id_gen;\r\n    U64 id_slot_idx = id%e_cache->string_id_map->id_slots_count;\r\n    node = push_array(e_cache->arena, E_StringIDNode, 1);\r\n    SLLQueuePush_N(e_cache->string_id_map->hash_slots[hash_slot_idx].first, e_cache->string_id_map->hash_slots[hash_slot_idx].last, node, hash_next);\r\n    SLLQueuePush_N(e_cache->string_id_map->id_slots[id_slot_idx].first, e_cache->string_id_map->hash_slots[id_slot_idx].last, node, id_next);\r\n    node->id = id;\r\n    node->string = push_str8_copy(e_cache->arena, string);\r\n  }\r\n  U64 result = node->id;\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ne_string_from_id(U64 id)\r\n{\r\n  U64 id_slot_idx = id%e_cache->string_id_map->id_slots_count;\r\n  E_StringIDNode *node = 0;\r\n  for(E_StringIDNode *n = e_cache->string_id_map->id_slots[id_slot_idx].first; n != 0; n = n->id_next)\r\n  {\r\n    if(n->id == id)\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  String8 result = {0};\r\n  if(node != 0)\r\n  {\r\n    result = node->string;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Extension Functions\r\n\r\ninternal E_Key\r\ne_key_wrap(E_Key key, String8 string)\r\n{\r\n  e_parent_key_push(key);\r\n  E_Key result = e_key_from_string(string);\r\n  e_parent_key_pop();\r\n  return result;\r\n}\r\n\r\ninternal E_Key\r\ne_key_wrapf(E_Key key, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  E_Key result = e_key_wrap(key, string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Eval Info Extraction\r\n\r\ninternal Rng1U64\r\ne_range_from_eval(E_Eval eval)\r\n{\r\n  // rjf: choose base offset\r\n  U64 base_offset = 0;\r\n  {\r\n    E_Eval base_off_eval = eval;\r\n    if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_key_unwrap(base_off_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative))))\r\n    {\r\n      base_off_eval = e_value_eval_from_eval(base_off_eval);\r\n    }\r\n    base_offset = base_off_eval.value.u64;\r\n  }\r\n  \r\n  // rjf: choose size\r\n  U64 size = KB(16);\r\n  {\r\n    E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n    E_TypeKind type_kind = e_type_kind_from_key(type_key);\r\n    if(type_kind == E_TypeKind_Ptr)\r\n    {\r\n      E_Eval ptee_eval = e_eval_wrapf(eval, \"*$\");\r\n      U64 ptee_size = e_type_byte_size_from_key(ptee_eval.irtree.type_key);\r\n      if(ptee_size > 8)\r\n      {\r\n        size = ptee_size;\r\n      }\r\n    }\r\n    else if(eval.irtree.mode == E_Mode_Offset)\r\n    {\r\n      size = e_type_byte_size_from_key(type_key);\r\n    }\r\n  }\r\n  \r\n  Rng1U64 result = r1u64(base_offset, base_offset+size);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Functions\r\n\r\ninternal String8\r\ne_debug_log_from_expr_string(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  char *indent_spaces = \"                                                                                                                                \";\r\n  String8List strings = {0};\r\n  \r\n  //- rjf: begin expression\r\n  String8 expr_text = string;\r\n  str8_list_pushf(scratch.arena, &strings, \"`%S`\\n\", expr_text);\r\n  \r\n  //- rjf: parse\r\n  E_Parse parse = e_push_parse_from_string(scratch.arena, expr_text);\r\n  {\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      E_Expr *expr;\r\n      S32 indent;\r\n    };\r\n    E_TokenArray tokens = parse.tokens;\r\n    str8_list_pushf(scratch.arena, &strings, \"    tokens:\\n\");\r\n    for EachIndex(idx, tokens.count)\r\n    {\r\n      E_Token token = tokens.v[idx];\r\n      String8 token_string = str8_substr(expr_text, token.range);\r\n      str8_list_pushf(scratch.arena, &strings, \"        %S: `%S`\\n\", e_token_kind_strings[token.kind], token_string);\r\n    }\r\n    str8_list_pushf(scratch.arena, &strings, \"    expr:\\n\");\r\n    Task start_task = {0, parse.expr, 2};\r\n    Task *first_task = &start_task;\r\n    for(Task *t = first_task; t != 0; t = t->next)\r\n    {\r\n      E_Expr *expr = t->expr;\r\n      str8_list_pushf(scratch.arena, &strings, \"%.*s%S\", (int)t->indent*4, indent_spaces, e_expr_kind_strings[expr->kind]);\r\n      switch(expr->kind)\r\n      {\r\n        default:{}break;\r\n        case E_ExprKind_LeafU64:\r\n        {\r\n          str8_list_pushf(scratch.arena, &strings, \" (%I64u)\", expr->value.u64);\r\n        }break;\r\n        case E_ExprKind_LeafIdentifier:\r\n        {\r\n          str8_list_pushf(scratch.arena, &strings, \" (`%S`)\", expr->string);\r\n        }break;\r\n      }\r\n      str8_list_pushf(scratch.arena, &strings, \"\\n\");\r\n      Task *last_task = t;\r\n      for(E_Expr *child = expr->first; child != &e_expr_nil; child = child->next)\r\n      {\r\n        Task *task = push_array(scratch.arena, Task, 1);\r\n        task->next = last_task->next;\r\n        last_task->next = task;\r\n        task->expr = child;\r\n        task->indent = t->indent+1;\r\n        last_task = task;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: type\r\n  E_IRTreeAndType irtree = e_push_irtree_and_type_from_expr(scratch.arena, 0, &e_default_identifier_resolution_rule, 0, 0, parse.expr);\r\n  {\r\n    str8_list_pushf(scratch.arena, &strings, \"    type:\\n\");\r\n    S32 indent = 2;\r\n    for(E_TypeKey type_key = irtree.type_key;\r\n        !e_type_key_match(e_type_key_zero(), type_key);\r\n        type_key = e_type_key_direct(type_key),\r\n        indent += 1)\r\n    {\r\n      E_Type *type = e_push_type_from_key(scratch.arena, type_key);\r\n      str8_list_pushf(scratch.arena, &strings, \"%.*s%S\\n\", (int)indent*4, indent_spaces, e_type_kind_basic_string_table[type->kind]);\r\n    }\r\n  }\r\n  \r\n  //- rjf: irtree\r\n  {\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      E_IRNode *irnode;\r\n      S32 indent;\r\n    };\r\n    str8_list_pushf(scratch.arena, &strings, \"    ir_tree:\\n\");\r\n    Task start_task = {0, irtree.root, 2};\r\n    Task *first_task = &start_task;\r\n    for(Task *t = first_task; t != 0; t = t->next)\r\n    {\r\n      E_IRNode *irnode = t->irnode;\r\n      str8_list_pushf(scratch.arena, &strings, \"%.*s\", (int)t->indent*4, indent_spaces);\r\n      switch(irnode->op)\r\n      {\r\n        default:{}break;\r\n#define X(name) case RDI_EvalOp_##name:{str8_list_pushf(scratch.arena, &strings, #name);}break;\r\n        RDI_EvalOp_XList\r\n#undef X\r\n      }\r\n      if(irnode->value.u64 != 0)\r\n      {\r\n        str8_list_pushf(scratch.arena, &strings, \" (%I64u)\", irnode->value.u64);\r\n      }\r\n      str8_list_pushf(scratch.arena, &strings, \"\\n\");\r\n      Task *last_task = t;\r\n      for(E_IRNode *child = irnode->first; child != &e_irnode_nil; child = child->next)\r\n      {\r\n        Task *task = push_array(scratch.arena, Task, 1);\r\n        task->next = last_task->next;\r\n        last_task->next = task;\r\n        task->irnode = child;\r\n        task->indent = t->indent+1;\r\n        last_task = task;\r\n      }\r\n    }\r\n  }\r\n  \r\n  str8_list_pushf(scratch.arena, &strings, \"\\n\");\r\n  \r\n  String8 result = str8_list_join(arena, &strings, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/eval/eval_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_CORE_H\r\n#define EVAL_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Key Type\r\n\r\ntypedef struct E_Key E_Key;\r\nstruct E_Key\r\n{\r\n  U64 u64;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Messages\r\n\r\ntypedef enum E_MsgKind\r\n{\r\n  E_MsgKind_Null,\r\n  E_MsgKind_MalformedInput,\r\n  E_MsgKind_MissingInfo,\r\n  E_MsgKind_ResolutionFailure,\r\n  E_MsgKind_InterpretationError,\r\n  E_MsgKind_COUNT\r\n}\r\nE_MsgKind;\r\n\r\ntypedef struct E_Msg E_Msg;\r\nstruct E_Msg\r\n{\r\n  E_Msg *next;\r\n  E_MsgKind kind;\r\n  Rng1U64 range;\r\n  String8 text;\r\n};\r\n\r\ntypedef struct E_MsgList E_MsgList;\r\nstruct E_MsgList\r\n{\r\n  E_Msg *first;\r\n  E_Msg *last;\r\n  E_MsgKind max_kind;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Register-Sized Value Type\r\n\r\ntypedef union E_Value E_Value;\r\nunion E_Value\r\n{\r\n  U512 u512;\r\n  U256 u256;\r\n  U128 u128;\r\n  U64 u64;\r\n  U32 u32;\r\n  U16 u16;\r\n  U8 u8;\r\n  S64 s64;\r\n  S32 s32;\r\n  S16 s16;\r\n  S8 s8;\r\n  F64 f64;\r\n  F32 f32;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Bytecode Operation Types\r\n\r\nenum\r\n{\r\n  E_IRExtKind_Bytecode = RDI_EvalOp_COUNT,\r\n  E_IRExtKind_SetSpace,\r\n  E_IRExtKind_COUNT\r\n};\r\n\r\ntypedef struct E_Op E_Op;\r\nstruct E_Op\r\n{\r\n  E_Op *next;\r\n  RDI_EvalOp opcode;\r\n  E_Value value;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct E_OpList E_OpList;\r\nstruct E_OpList\r\n{\r\n  E_Op *first;\r\n  E_Op *last;\r\n  U64 op_count;\r\n  U64 encoded_size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Operator Info\r\n\r\ntypedef enum E_OpKind\r\n{\r\n  E_OpKind_Null,\r\n  E_OpKind_UnaryPrefix,\r\n  E_OpKind_Binary,\r\n}\r\nE_OpKind;\r\n\r\ntypedef struct E_OpInfo E_OpInfo;\r\nstruct E_OpInfo\r\n{\r\n  E_OpKind kind;\r\n  S64 precedence;\r\n  String8 pre;\r\n  String8 sep;\r\n  String8 post;\r\n  String8 chain;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Spaces\r\n//\r\n// NOTE(rjf): Evaluations occur within the context of a \"space\". Each \"space\"\r\n// refers to a different offset/address-space, but it's a bit looser of a\r\n// concept than just address space, since it can also refer to offsets into\r\n// a register block, and it is also used to refer to spaces of unique IDs for\r\n// key-value stores, e.g. for information in the debugger.\r\n//\r\n// Effectively, when considering the result of an evaluation, you use the\r\n// value for understanding a key *into* a space, e.g. 1+2 -> 3, in a null\r\n// space, or &foo, in the space of PID: 1234.\r\n\r\ntypedef U64 E_SpaceKind;\r\nenum\r\n{\r\n  E_SpaceKind_Null,\r\n  E_SpaceKind_File,\r\n  E_SpaceKind_FileSystem,\r\n  E_SpaceKind_HashStoreKey,\r\n  E_SpaceKind_FirstUserDefined,\r\n};\r\n\r\ntypedef struct E_Space E_Space;\r\nstruct E_Space\r\n{\r\n  E_SpaceKind kind;\r\n  union\r\n  {\r\n    U64 u64s[3];\r\n    struct\r\n    {\r\n      U64 u64_0;\r\n      U128 u128;\r\n    };\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Implicit Type Graph Key Types\r\n\r\ntypedef enum E_TypeKeyKind\r\n{\r\n  E_TypeKeyKind_Null,\r\n  E_TypeKeyKind_Basic,\r\n  E_TypeKeyKind_Ext,\r\n  E_TypeKeyKind_Cons,\r\n  E_TypeKeyKind_Reg,\r\n  E_TypeKeyKind_RegAlias,\r\n}\r\nE_TypeKeyKind;\r\n\r\ntypedef struct E_TypeKey E_TypeKey;\r\nstruct E_TypeKey\r\n{\r\n  E_TypeKeyKind kind;\r\n  U32 u32[3];\r\n  // [0] -> E_TypeKind (Basic, Cons, Ext); Arch (Reg, RegAlias)\r\n  // [1] -> Type Index In Debug Info (Ext); Code (Reg, RegAlias); Type Index In Constructed (Cons)\r\n  // [2] -> Debug Info Number (Ext)\r\n};\r\n\r\ntypedef struct E_TypeKeyNode E_TypeKeyNode;\r\nstruct E_TypeKeyNode\r\n{\r\n  E_TypeKeyNode *next;\r\n  E_TypeKey v;\r\n};\r\n\r\ntypedef struct E_TypeKeyList E_TypeKeyList;\r\nstruct E_TypeKeyList\r\n{\r\n  E_TypeKeyNode *first;\r\n  E_TypeKeyNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/eval.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Token Types\r\n\r\ntypedef struct E_Token E_Token;\r\nstruct E_Token\r\n{\r\n  E_TokenKind kind;\r\n  Rng1U64 range;\r\n};\r\n\r\ntypedef struct E_TokenChunkNode E_TokenChunkNode;\r\nstruct E_TokenChunkNode\r\n{\r\n  E_TokenChunkNode *next;\r\n  E_Token *v;\r\n  U64 count;\r\n  U64 cap;\r\n};\r\n\r\ntypedef struct E_TokenChunkList E_TokenChunkList;\r\nstruct E_TokenChunkList\r\n{\r\n  E_TokenChunkNode *first;\r\n  E_TokenChunkNode *last;\r\n  U64 node_count;\r\n  U64 total_count;\r\n};\r\n\r\ntypedef struct E_TokenArray E_TokenArray;\r\nstruct E_TokenArray\r\n{\r\n  E_Token *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Modes\r\n\r\ntypedef enum E_Mode\r\n{\r\n  E_Mode_Null,\r\n  E_Mode_Value,\r\n  E_Mode_Offset,\r\n}\r\nE_Mode;\r\n\r\n////////////////////////////////\r\n//~ rjf: Expression Tree Types\r\n\r\ntypedef struct E_Expr E_Expr;\r\nstruct E_Expr\r\n{\r\n  E_Expr *first;\r\n  E_Expr *last;\r\n  E_Expr *next;\r\n  E_Expr *prev;\r\n  E_Expr *ref;\r\n  Rng1U64 range;\r\n  E_ExprKind kind;\r\n  E_Mode mode;\r\n  E_Space space;\r\n  E_TypeKey type_key;\r\n  E_Value value;\r\n  String8 string;\r\n  String8 qualifier;\r\n  String8 bytecode;\r\n};\r\n\r\ntypedef struct E_ExprChain E_ExprChain;\r\nstruct E_ExprChain\r\n{\r\n  E_Expr *first;\r\n  E_Expr *last;\r\n};\r\n\r\ntypedef struct E_ExprNode E_ExprNode;\r\nstruct E_ExprNode\r\n{\r\n  E_ExprNode *next;\r\n  E_Expr *v;\r\n};\r\n\r\ntypedef struct E_ExprList E_ExprList;\r\nstruct E_ExprList\r\n{\r\n  E_ExprNode *first;\r\n  E_ExprNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_Parse E_Parse;\r\nstruct E_Parse\r\n{\r\n  E_TokenArray tokens;\r\n  E_Token *last_token;\r\n  E_Expr *expr;\r\n  E_Expr *last_expr;\r\n  E_MsgList msgs;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: IR Tree Types\r\n\r\ntypedef struct E_IRNode E_IRNode;\r\nstruct E_IRNode\r\n{\r\n  E_IRNode *first;\r\n  E_IRNode *last;\r\n  E_IRNode *next;\r\n  RDI_EvalOp op;\r\n  E_Space space;\r\n  String8 string;\r\n  E_Value value;\r\n};\r\n\r\ntypedef struct E_IRTreeAndType E_IRTreeAndType;\r\nstruct E_IRTreeAndType\r\n{\r\n  E_IRNode *root;\r\n  E_TypeKey type_key;\r\n  void *user_data;\r\n  E_Mode mode;\r\n  B32 auto_hook;\r\n  E_MsgList msgs;\r\n  E_IRTreeAndType *prev;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Bytecode Interpretation Types\r\n\r\ntypedef struct E_Interpretation E_Interpretation;\r\nstruct E_Interpretation\r\n{\r\n  E_Value value;\r\n  E_Space space;\r\n  E_InterpretationCode code;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Artifact Bundle\r\n\r\ntypedef struct E_Eval E_Eval;\r\nstruct E_Eval\r\n{\r\n  E_Key key;\r\n  E_Key parent_key;\r\n  String8 string;\r\n  E_Expr *expr;\r\n  E_IRTreeAndType irtree;\r\n  String8 bytecode;\r\n  E_InterpretationCode code;\r\n  E_Value value;\r\n  E_Space space;\r\n  E_MsgList msgs;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Full Extracted Type Information Types\r\n\r\ntypedef enum E_MemberKind\r\n{\r\n  E_MemberKind_Null,\r\n  E_MemberKind_DataField,\r\n  E_MemberKind_StaticData,\r\n  E_MemberKind_Method,\r\n  E_MemberKind_StaticMethod,\r\n  E_MemberKind_VirtualMethod,\r\n  E_MemberKind_VTablePtr,\r\n  E_MemberKind_Base,\r\n  E_MemberKind_VirtualBase,\r\n  E_MemberKind_NestedType,\r\n  E_MemberKind_Padding,\r\n  E_MemberKind_COUNT\r\n}\r\nE_MemberKind;\r\n\r\ntypedef U32 E_TypeFlags;\r\nenum\r\n{\r\n  E_TypeFlag_Const                   = (1<<0),\r\n  E_TypeFlag_Volatile                = (1<<1),\r\n  E_TypeFlag_Restrict                = (1<<2),\r\n  E_TypeFlag_IsPlainText             = (1<<3),\r\n  E_TypeFlag_IsCodeText              = (1<<4),\r\n  E_TypeFlag_IsPathText              = (1<<5),\r\n  E_TypeFlag_IsNotText               = (1<<6),\r\n  E_TypeFlag_IsNotEditable           = (1<<7),\r\n  E_TypeFlag_EditableChildren        = (1<<8),\r\n  E_TypeFlag_InheritedByMembers      = (1<<9),\r\n  E_TypeFlag_InheritedByElements     = (1<<10),\r\n  E_TypeFlag_ArrayLikeExpansion      = (1<<11),\r\n  E_TypeFlag_StubSingleLineExpansion = (1<<12),\r\n};\r\n\r\ntypedef struct E_Member E_Member;\r\nstruct E_Member\r\n{\r\n  E_MemberKind kind;\r\n  E_TypeKey type_key;\r\n  String8 name;\r\n  U64 off;\r\n  E_TypeKeyList inheritance_key_chain;\r\n};\r\n\r\ntypedef struct E_MemberNode E_MemberNode;\r\nstruct E_MemberNode\r\n{\r\n  E_MemberNode *next;\r\n  E_Member v;\r\n};\r\n\r\ntypedef struct E_MemberList E_MemberList;\r\nstruct E_MemberList\r\n{\r\n  E_MemberNode *first;\r\n  E_MemberNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_MemberArray E_MemberArray;\r\nstruct E_MemberArray\r\n{\r\n  E_Member *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_EnumVal E_EnumVal;\r\nstruct E_EnumVal\r\n{\r\n  String8 name;\r\n  U64 val;\r\n};\r\n\r\ntypedef struct E_EnumValNode E_EnumValNode;\r\nstruct E_EnumValNode\r\n{\r\n  E_EnumValNode *next;\r\n  E_EnumVal v;\r\n};\r\n\r\ntypedef struct E_EnumValList E_EnumValList;\r\nstruct E_EnumValList\r\n{\r\n  E_EnumValNode *first;\r\n  E_EnumValNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_EnumValArray E_EnumValArray;\r\nstruct E_EnumValArray\r\n{\r\n  E_EnumVal *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_IRExt E_IRExt;\r\nstruct E_IRExt\r\n{\r\n  void *user_data;\r\n};\r\n\r\ntypedef struct E_TypeExpandInfo E_TypeExpandInfo;\r\nstruct E_TypeExpandInfo\r\n{\r\n  void *user_data;\r\n  U64 expr_count;\r\n};\r\n\r\n#define E_TYPE_IREXT_FUNCTION_SIG(name) E_IRExt name(Arena *arena, E_Expr *expr, E_IRTreeAndType *irtree)\r\n#define E_TYPE_IREXT_FUNCTION_NAME(name) e_type_irext__##name\r\n#define E_TYPE_IREXT_FUNCTION_DEF(name) internal E_TYPE_IREXT_FUNCTION_SIG(E_TYPE_IREXT_FUNCTION_NAME(name))\r\ntypedef E_TYPE_IREXT_FUNCTION_SIG(E_TypeIRExtFunctionType);\r\n\r\n#define E_TYPE_ACCESS_FUNCTION_SIG(name) E_IRTreeAndType name(Arena *arena, E_IRTreeAndType *overridden, E_Expr *expr, E_IRTreeAndType *lhs_irtree)\r\n#define E_TYPE_ACCESS_FUNCTION_NAME(name) e_type_access__##name\r\n#define E_TYPE_ACCESS_FUNCTION_DEF(name) internal E_TYPE_ACCESS_FUNCTION_SIG(E_TYPE_ACCESS_FUNCTION_NAME(name))\r\ntypedef E_TYPE_ACCESS_FUNCTION_SIG(E_TypeAccessFunctionType);\r\n\r\n#define E_TYPE_EXPAND_INFO_FUNCTION_SIG(name) E_TypeExpandInfo name(Arena *arena, E_Eval eval, String8 filter)\r\n#define E_TYPE_EXPAND_INFO_FUNCTION_NAME(name) e_type_expand_info__##name\r\n#define E_TYPE_EXPAND_INFO_FUNCTION_DEF(name) internal E_TYPE_EXPAND_INFO_FUNCTION_SIG(E_TYPE_EXPAND_INFO_FUNCTION_NAME(name))\r\ntypedef E_TYPE_EXPAND_INFO_FUNCTION_SIG(E_TypeExpandInfoFunctionType);\r\n\r\n#define E_TYPE_EXPAND_RANGE_FUNCTION_SIG(name) void name(Arena *arena, void *user_data, E_Eval eval, String8 filter, Rng1U64 idx_range, E_Eval *evals_out)\r\n#define E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name) e_type_expand_range__##name\r\n#define E_TYPE_EXPAND_RANGE_FUNCTION_DEF(name) internal E_TYPE_EXPAND_RANGE_FUNCTION_SIG(E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name))\r\ntypedef E_TYPE_EXPAND_RANGE_FUNCTION_SIG(E_TypeExpandRangeFunctionType);\r\n\r\n#define E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_SIG(name) U64 name(void *user_data, U64 num)\r\n#define E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name) e_type_expand_id_from_num__##name\r\n#define E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(name) internal E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_SIG(E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(name))\r\ntypedef E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_SIG(E_TypeExpandIDFromNumFunctionType);\r\n\r\n#define E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_SIG(name) U64 name(void *user_data, U64 id)\r\n#define E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name) e_type_expand_num_from_id__##name\r\n#define E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(name) internal E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_SIG(E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(name))\r\ntypedef E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_SIG(E_TypeExpandNumFromIDFunctionType);\r\n\r\ntypedef struct E_TypeExpandRule E_TypeExpandRule;\r\nstruct E_TypeExpandRule\r\n{\r\n  E_TypeExpandInfoFunctionType *info;\r\n  E_TypeExpandRangeFunctionType *range;\r\n  E_TypeExpandIDFromNumFunctionType *id_from_num;\r\n  E_TypeExpandNumFromIDFunctionType *num_from_id;\r\n};\r\n\r\ntypedef struct E_Type E_Type;\r\nstruct E_Type\r\n{\r\n  E_TypeKind kind;\r\n  E_TypeFlags flags;\r\n  String8 name;\r\n  U64 byte_size;\r\n  U64 count;\r\n  U64 depth;\r\n  U32 off;\r\n  Arch arch;\r\n  E_TypeKey direct_type_key;\r\n  E_TypeKey owner_type_key;\r\n  E_TypeKey *param_type_keys;\r\n  E_Member *members;\r\n  E_EnumVal *enum_vals;\r\n  E_Expr **args;\r\n  E_TypeIRExtFunctionType *irext;\r\n  E_TypeAccessFunctionType *access;\r\n  E_TypeExpandRule expand;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Constructed Type Types\r\n\r\ntypedef struct E_ConsTypeParams E_ConsTypeParams;\r\nstruct E_ConsTypeParams\r\n{\r\n  Arch arch;\r\n  E_TypeKind kind;\r\n  E_TypeFlags flags;\r\n  String8 name;\r\n  E_TypeKey direct_key;\r\n  U64 count;\r\n  U64 depth;\r\n  E_Member *members;\r\n  E_EnumVal *enum_vals;\r\n  E_Expr **args;\r\n  E_TypeIRExtFunctionType *irext;\r\n  E_TypeAccessFunctionType *access;\r\n  E_TypeExpandRule expand;\r\n};\r\n\r\ntypedef struct E_ConsTypeNode E_ConsTypeNode;\r\nstruct E_ConsTypeNode\r\n{\r\n  E_ConsTypeNode *key_next;\r\n  E_ConsTypeNode *content_next;\r\n  E_TypeKey key;\r\n  E_ConsTypeParams params;\r\n  U64 byte_size;\r\n};\r\n\r\ntypedef struct E_ConsTypeSlot E_ConsTypeSlot;\r\nstruct E_ConsTypeSlot\r\n{\r\n  E_ConsTypeNode *first;\r\n  E_ConsTypeNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Info\r\n\r\ntypedef struct E_DbgInfo E_DbgInfo;\r\nstruct E_DbgInfo\r\n{\r\n  DI_Key dbgi_key;\r\n  RDI_Parsed *rdi;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Modules\r\n\r\ntypedef struct E_Module E_Module;\r\nstruct E_Module\r\n{\r\n  Rng1U64 vaddr_range;\r\n  U32 dbg_info_num;\r\n  Arch arch;\r\n  E_Space space;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String -> Num\r\n\r\ntypedef struct E_String2NumMapNode E_String2NumMapNode;\r\nstruct E_String2NumMapNode\r\n{\r\n  E_String2NumMapNode *order_next;\r\n  E_String2NumMapNode *hash_next;\r\n  String8 string;\r\n  U64 num;\r\n};\r\n\r\ntypedef struct E_String2NumMapNodeArray E_String2NumMapNodeArray;\r\nstruct E_String2NumMapNodeArray\r\n{\r\n  E_String2NumMapNode **v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_String2NumMapSlot E_String2NumMapSlot;\r\nstruct E_String2NumMapSlot\r\n{\r\n  E_String2NumMapNode *first;\r\n  E_String2NumMapNode *last;\r\n};\r\n\r\ntypedef struct E_String2NumMap E_String2NumMap;\r\nstruct E_String2NumMap\r\n{\r\n  U64 slots_count;\r\n  U64 node_count;\r\n  E_String2NumMapSlot *slots;\r\n  E_String2NumMapNode *first;\r\n  E_String2NumMapNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String -> Expr\r\n\r\ntypedef struct E_String2ExprMapNode E_String2ExprMapNode;\r\nstruct E_String2ExprMapNode\r\n{\r\n  E_String2ExprMapNode *hash_next;\r\n  String8 string;\r\n  E_Expr *expr;\r\n  U64 poison_count;\r\n};\r\n\r\ntypedef struct E_String2ExprMapSlot E_String2ExprMapSlot;\r\nstruct E_String2ExprMapSlot\r\n{\r\n  E_String2ExprMapNode *first;\r\n  E_String2ExprMapNode *last;\r\n};\r\n\r\ntypedef struct E_String2ExprMap E_String2ExprMap;\r\nstruct E_String2ExprMap\r\n{\r\n  U64 slots_count;\r\n  E_String2ExprMapSlot *slots;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String -> Type Key Map Data Structure\r\n\r\ntypedef struct E_String2TypeKeyNode E_String2TypeKeyNode;\r\nstruct E_String2TypeKeyNode\r\n{\r\n  E_String2TypeKeyNode *next;\r\n  String8 string;\r\n  E_TypeKey key;\r\n};\r\n\r\ntypedef struct E_String2TypeKeySlot E_String2TypeKeySlot;\r\nstruct E_String2TypeKeySlot\r\n{\r\n  E_String2TypeKeyNode *first;\r\n  E_String2TypeKeyNode *last;\r\n};\r\n\r\ntypedef struct E_String2TypeKeyMap E_String2TypeKeyMap;\r\nstruct E_String2TypeKeyMap\r\n{\r\n  U64 slots_count;\r\n  E_String2TypeKeySlot *slots;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Pattern -> Hook Key Data Structure (Type Views)\r\n\r\ntypedef struct E_PatternPart E_PatternPart;\r\nstruct E_PatternPart\r\n{\r\n  E_PatternPart *next;\r\n  String8 string;\r\n  String8List wildcard_inst_names;\r\n};\r\n\r\ntypedef struct E_Pattern E_Pattern;\r\nstruct E_Pattern\r\n{\r\n  E_PatternPart *first_part;\r\n  E_PatternPart *last_part;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_AutoHookWildcardInst E_AutoHookWildcardInst;\r\nstruct E_AutoHookWildcardInst\r\n{\r\n  E_AutoHookWildcardInst *next;\r\n  String8 name;\r\n  E_Expr *inst_expr;\r\n};\r\n\r\ntypedef struct E_AutoHookMatch E_AutoHookMatch;\r\nstruct E_AutoHookMatch\r\n{\r\n  E_AutoHookMatch *next;\r\n  E_Expr *expr;\r\n  E_AutoHookWildcardInst *first_wildcard_inst;\r\n  E_AutoHookWildcardInst *last_wildcard_inst;\r\n};\r\n\r\ntypedef struct E_AutoHookMatchList E_AutoHookMatchList;\r\nstruct E_AutoHookMatchList\r\n{\r\n  E_AutoHookMatch *first;\r\n  E_AutoHookMatch *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct E_AutoHookNode E_AutoHookNode;\r\nstruct E_AutoHookNode\r\n{\r\n  E_AutoHookNode *hash_next;\r\n  E_AutoHookNode *pattern_order_next;\r\n  String8 type_string;\r\n  E_Pattern type_pattern;\r\n  String8 expr_string;\r\n};\r\n\r\ntypedef struct E_AutoHookSlot E_AutoHookSlot;\r\nstruct E_AutoHookSlot\r\n{\r\n  E_AutoHookNode *first;\r\n  E_AutoHookNode *last;\r\n};\r\n\r\ntypedef struct E_AutoHookMap E_AutoHookMap;\r\nstruct E_AutoHookMap\r\n{\r\n  U64 slots_count;\r\n  E_AutoHookSlot *slots;\r\n  E_AutoHookNode *first_pattern;\r\n  E_AutoHookNode *last_pattern;\r\n};\r\n\r\ntypedef struct E_AutoHookParams E_AutoHookParams;\r\nstruct E_AutoHookParams\r\n{\r\n  E_TypeKey type_key;\r\n  String8 type_pattern;\r\n  String8 tag_expr_string;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Context\r\n\r\ntypedef U64 E_SpaceGenFunction(E_Space space);\r\ntypedef B32 E_SpaceRWFunction(E_Space space, void *out, Rng1U64 offset_range);\r\n\r\n//- rjf: base context\r\n\r\ntypedef struct E_BaseCtx E_BaseCtx;\r\nstruct E_BaseCtx\r\n{\r\n  // rjf: instruction pointer info\r\n  U64 thread_ip_vaddr;\r\n  U64 thread_ip_voff;\r\n  E_Space thread_reg_space;\r\n  Arch thread_arch;\r\n  U64 thread_unwind_count;\r\n  \r\n  // rjf: debug infos\r\n  E_DbgInfo *dbg_infos;\r\n  U64 dbg_infos_count;\r\n  E_DbgInfo *primary_dbg_info;\r\n  \r\n  // rjf: modules\r\n  E_Module *modules;\r\n  U64 modules_count;\r\n  E_Module *primary_module;\r\n  \r\n  // rjf: space hooks\r\n  E_SpaceGenFunction *space_gen;\r\n  E_SpaceRWFunction *space_read;\r\n  E_SpaceRWFunction *space_write;\r\n};\r\n\r\n//- rjf: ir generation context\r\n\r\ntypedef struct E_IRCtx E_IRCtx;\r\nstruct E_IRCtx\r\n{\r\n  E_String2NumMap *regs_map;\r\n  E_String2NumMap *reg_alias_map;\r\n  E_String2NumMap *locals_map; // (within `primary_module`)\r\n  E_String2NumMap *member_map; // (within `primary_module`)\r\n  E_String2ExprMap *macro_map;\r\n  E_AutoHookMap *auto_hook_map;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Core Evaluation Cache Types\r\n\r\n//- rjf: unpacked type cache\r\n\r\ntypedef struct E_TypeCacheNode E_TypeCacheNode;\r\nstruct E_TypeCacheNode\r\n{\r\n  E_TypeCacheNode *next;\r\n  E_TypeKey key;\r\n  E_Type *type;\r\n};\r\n\r\ntypedef struct E_TypeCacheSlot E_TypeCacheSlot;\r\nstruct E_TypeCacheSlot\r\n{\r\n  E_TypeCacheNode *first;\r\n  E_TypeCacheNode *last;\r\n};\r\n\r\n//- rjf: member lookup cache types\r\n\r\ntypedef struct E_MemberHashNode E_MemberHashNode;\r\nstruct E_MemberHashNode\r\n{\r\n  E_MemberHashNode *next;\r\n  U64 member_idx;\r\n};\r\n\r\ntypedef struct E_MemberHashSlot E_MemberHashSlot;\r\nstruct E_MemberHashSlot\r\n{\r\n  E_MemberHashNode *first;\r\n  E_MemberHashNode *last;\r\n};\r\n\r\ntypedef struct E_MemberFilterNode E_MemberFilterNode;\r\nstruct E_MemberFilterNode\r\n{\r\n  E_MemberFilterNode *next;\r\n  String8 filter;\r\n  E_MemberArray members_filtered;\r\n};\r\n\r\ntypedef struct E_MemberFilterSlot E_MemberFilterSlot;\r\nstruct E_MemberFilterSlot\r\n{\r\n  E_MemberFilterNode *first;\r\n  E_MemberFilterNode *last;\r\n};\r\n\r\ntypedef struct E_MemberCacheNode E_MemberCacheNode;\r\nstruct E_MemberCacheNode\r\n{\r\n  E_MemberCacheNode *next;\r\n  E_TypeKey key;\r\n  E_MemberArray members;\r\n  U64 member_hash_slots_count;\r\n  E_MemberHashSlot *member_hash_slots;\r\n  U64 member_filter_slots_count;\r\n  E_MemberFilterSlot *member_filter_slots;\r\n};\r\n\r\ntypedef struct E_MemberCacheSlot E_MemberCacheSlot;\r\nstruct E_MemberCacheSlot\r\n{\r\n  E_MemberCacheNode *first;\r\n  E_MemberCacheNode *last;\r\n};\r\n\r\n//- rjf: enum val lookup cache types\r\n\r\ntypedef struct E_EnumValHashNode E_EnumValHashNode;\r\nstruct E_EnumValHashNode\r\n{\r\n  E_EnumValHashNode *next;\r\n  U64 val_idx;\r\n};\r\n\r\ntypedef struct E_EnumValHashSlot E_EnumValHashSlot;\r\nstruct E_EnumValHashSlot\r\n{\r\n  E_EnumValHashNode *first;\r\n  E_EnumValHashNode *last;\r\n};\r\n\r\ntypedef struct E_EnumValFilterNode E_EnumValFilterNode;\r\nstruct E_EnumValFilterNode\r\n{\r\n  E_EnumValFilterNode *next;\r\n  String8 filter;\r\n  E_EnumValArray vals_filtered;\r\n};\r\n\r\ntypedef struct E_EnumValFilterSlot E_EnumValFilterSlot;\r\nstruct E_EnumValFilterSlot\r\n{\r\n  E_EnumValFilterNode *first;\r\n  E_EnumValFilterNode *last;\r\n};\r\n\r\ntypedef struct E_EnumValCacheNode E_EnumValCacheNode;\r\nstruct E_EnumValCacheNode\r\n{\r\n  E_EnumValCacheNode *next;\r\n  E_TypeKey key;\r\n  U64 val_hash_slots_count;\r\n  E_EnumValHashSlot *val_hash_slots;\r\n  U64 val_filter_slots_count;\r\n  E_EnumValFilterSlot *val_filter_slots;\r\n};\r\n\r\ntypedef struct E_EnumValCacheSlot E_EnumValCacheSlot;\r\nstruct E_EnumValCacheSlot\r\n{\r\n  E_EnumValCacheNode *first;\r\n  E_EnumValCacheNode *last;\r\n};\r\n\r\n//- rjf: used expression map\r\n\r\ntypedef struct E_UsedExprNode E_UsedExprNode;\r\nstruct E_UsedExprNode\r\n{\r\n  E_UsedExprNode *next;\r\n  E_UsedExprNode *prev;\r\n  E_Expr *expr;\r\n};\r\n\r\ntypedef struct E_UsedExprSlot E_UsedExprSlot;\r\nstruct E_UsedExprSlot\r\n{\r\n  E_UsedExprNode *first;\r\n  E_UsedExprNode *last;\r\n};\r\n\r\ntypedef struct E_UsedExprMap E_UsedExprMap;\r\nstruct E_UsedExprMap\r\n{\r\n  U64 slots_count;\r\n  E_UsedExprSlot *slots;\r\n};\r\n\r\n//- rjf: type key -> auto hook expression list cache\r\n\r\ntypedef struct E_TypeAutoHookCacheNode E_TypeAutoHookCacheNode;\r\nstruct E_TypeAutoHookCacheNode\r\n{\r\n  E_TypeAutoHookCacheNode *next;\r\n  E_TypeKey key;\r\n  E_AutoHookMatchList matches;\r\n};\r\n\r\ntypedef struct E_TypeAutoHookCacheSlot E_TypeAutoHookCacheSlot;\r\nstruct E_TypeAutoHookCacheSlot\r\n{\r\n  E_TypeAutoHookCacheNode *first;\r\n  E_TypeAutoHookCacheNode *last;\r\n};\r\n\r\ntypedef struct E_TypeAutoHookCacheMap E_TypeAutoHookCacheMap;\r\nstruct E_TypeAutoHookCacheMap\r\n{\r\n  U64 slots_count;\r\n  E_TypeAutoHookCacheSlot *slots;\r\n};\r\n\r\n//- rjf: string ID cache\r\n\r\ntypedef struct E_StringIDNode E_StringIDNode;\r\nstruct E_StringIDNode\r\n{\r\n  E_StringIDNode *hash_next;\r\n  E_StringIDNode *id_next;\r\n  U64 id;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct E_StringIDSlot E_StringIDSlot;\r\nstruct E_StringIDSlot\r\n{\r\n  E_StringIDNode *first;\r\n  E_StringIDNode *last;\r\n};\r\n\r\ntypedef struct E_StringIDMap E_StringIDMap;\r\nstruct E_StringIDMap\r\n{\r\n  U64 id_slots_count;\r\n  E_StringIDSlot *id_slots;\r\n  U64 hash_slots_count;\r\n  E_StringIDSlot *hash_slots;\r\n};\r\n\r\n//- rjf: cache evaluation bundles\r\n\r\ntypedef U32 E_CacheBundleFlags;\r\nenum\r\n{\r\n  E_CacheBundleFlag_Parse     = (1<<0),\r\n  E_CacheBundleFlag_IRTree    = (1<<1),\r\n  E_CacheBundleFlag_Bytecode  = (1<<2),\r\n  E_CacheBundleFlag_Interpret = (1<<3),\r\n};\r\n\r\ntypedef struct E_CacheBundle E_CacheBundle;\r\nstruct E_CacheBundle\r\n{\r\n  E_CacheBundleFlags flags;\r\n  E_Key key;\r\n  E_Key parent_key;\r\n  String8 string;\r\n  E_Parse parse;\r\n  E_IRTreeAndType irtree;\r\n  String8 bytecode;\r\n  E_Interpretation interpretation;\r\n  U64 space_gen;\r\n  E_MsgList msgs;\r\n};\r\n\r\ntypedef struct E_CacheNode E_CacheNode;\r\nstruct E_CacheNode\r\n{\r\n  E_CacheNode *string_next;\r\n  E_CacheNode *key_next;\r\n  E_CacheBundle bundle;\r\n};\r\n\r\ntypedef struct E_CacheLookup E_CacheLookup;\r\nstruct E_CacheLookup\r\n{\r\n  E_CacheNode *node;\r\n  U64 hash;\r\n};\r\n\r\ntypedef struct E_CacheSlot E_CacheSlot;\r\nstruct E_CacheSlot\r\n{\r\n  E_CacheNode *first;\r\n  E_CacheNode *last;\r\n};\r\n\r\n//- rjf: parent stack\r\n\r\ntypedef struct E_CacheParentNode E_CacheParentNode;\r\nstruct E_CacheParentNode\r\n{\r\n  E_CacheParentNode *next;\r\n  E_Key key;\r\n};\r\n\r\n//- rjf: main cache state type\r\n\r\ntypedef struct E_Cache E_Cache;\r\nstruct E_Cache\r\n{\r\n  //- rjf: root arena\r\n  Arena *arena;\r\n  U64 arena_eval_start_pos;\r\n  \r\n  //- rjf: key ID generation counter\r\n  U64 key_id_gen;\r\n  \r\n  //- rjf: key -> bundle, string -> bundle tables\r\n  U64 key_slots_count;\r\n  E_CacheSlot *key_slots;\r\n  U64 string_slots_count;\r\n  E_CacheSlot *string_slots;\r\n  \r\n  //- rjf: parent stack\r\n  E_CacheParentNode *top_parent_node;\r\n  E_CacheParentNode *free_parent_node;\r\n  \r\n  //- rjf: unpacked context\r\n  RDI_Procedure *thread_ip_procedure;\r\n  \r\n  //- rjf: [types] JIT-constructed types tables\r\n  U64 cons_id_gen;\r\n  U64 cons_content_slots_count;\r\n  U64 cons_key_slots_count;\r\n  E_ConsTypeSlot *cons_content_slots;\r\n  E_ConsTypeSlot *cons_key_slots;\r\n  \r\n  //- rjf: [types] build-in constructed type keys\r\n  E_TypeKey file_type_key;\r\n  E_TypeKey folder_type_key;\r\n  \r\n  //- rjf: [types] member cache table\r\n  U64 member_cache_slots_count;\r\n  E_MemberCacheSlot *member_cache_slots;\r\n  \r\n  //- rjf: [types] enum val cache table\r\n  U64 enum_val_cache_slots_count;\r\n  E_EnumValCacheSlot *enum_val_cache_slots;\r\n  \r\n  //- rjf: [types] unpacked type cache\r\n  U64 type_cache_slots_count;\r\n  E_TypeCacheSlot *type_cache_slots;\r\n  \r\n  //- rjf: [ir] ir gen options\r\n  B32 disallow_autohooks;\r\n  B32 disallow_chained_fastpaths;\r\n  E_AutoHookWildcardInst *first_wildcard_inst;\r\n  E_AutoHookWildcardInst *last_wildcard_inst;\r\n  \r\n  //- rjf: [ir] ir caches\r\n  E_UsedExprMap *used_expr_map;\r\n  E_TypeAutoHookCacheMap *type_auto_hook_cache_map;\r\n  \r\n  //- rjf: [ir] string ID cache\r\n  U64 string_id_gen;\r\n  E_StringIDMap *string_id_map;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"eval/generated/eval.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nread_only global E_String2NumMap e_string2num_map_nil = {0};\r\nread_only global E_String2ExprMap e_string2expr_map_nil = {0};\r\nread_only global E_Expr e_expr_nil = {&e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil, &e_expr_nil};\r\nread_only global E_IRNode e_irnode_nil = {&e_irnode_nil, &e_irnode_nil, &e_irnode_nil};\r\nread_only global E_Eval e_eval_nil = {{0}, {0}, {0}, &e_expr_nil, {&e_irnode_nil}};\r\nread_only global E_DbgInfo e_dbg_info_nil = {{0}, &rdi_parsed_nil};\r\nread_only global E_Module e_module_nil = {0};\r\nread_only global E_CacheBundle e_cache_bundle_nil = {0, {0}, {0}, {0}, {{0}, 0, &e_expr_nil, &e_expr_nil}, {&e_irnode_nil}};\r\nthread_static E_BaseCtx *e_base_ctx = 0;\r\nthread_static E_IRCtx *e_ir_ctx = 0;\r\nthread_static E_Cache *e_cache = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64 e_hash_from_string(U64 seed, String8 string);\r\n#define e_value_u64(v) (E_Value){.u64 = (v)}\r\n\r\n////////////////////////////////\r\n//~ rjf: Expr Kind Enum Functions\r\n\r\ninternal RDI_EvalOp e_opcode_from_expr_kind(E_ExprKind kind);\r\ninternal B32        e_expr_kind_is_comparison(E_ExprKind kind);\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Type Functions\r\n\r\ninternal B32 e_key_match(E_Key a, E_Key b);\r\ninternal E_Key e_key_zero(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Key Type Functions\r\n\r\ninternal void e_type_key_list_push(Arena *arena, E_TypeKeyList *list, E_TypeKey key);\r\ninternal void e_type_key_list_push_front(Arena *arena, E_TypeKeyList *list, E_TypeKey key);\r\ninternal E_TypeKeyList e_type_key_list_copy(Arena *arena, E_TypeKeyList *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Functions\r\n\r\ninternal void e_msg(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, String8 text);\r\ninternal void e_msgf(Arena *arena, E_MsgList *msgs, E_MsgKind kind, Rng1U64 range, char *fmt, ...);\r\ninternal void e_msg_list_concat_in_place(E_MsgList *dst, E_MsgList *to_push);\r\ninternal E_MsgList e_msg_list_copy(Arena *arena, E_MsgList *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Space Functions\r\n\r\ninternal E_Space e_space_make(E_SpaceKind kind);\r\ninternal B32 e_space_match(E_Space a, E_Space b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Map Functions\r\n\r\n//- rjf: string -> num\r\ninternal E_String2NumMap e_string2num_map_make(Arena *arena, U64 slot_count);\r\ninternal void e_string2num_map_insert(Arena *arena, E_String2NumMap *map, String8 string, U64 num);\r\ninternal U64 e_num_from_string(E_String2NumMap *map, String8 string);\r\ninternal E_String2NumMapNodeArray e_string2num_map_node_array_from_map(Arena *arena, E_String2NumMap *map);\r\ninternal int e_string2num_map_node_qsort_compare__num_ascending(E_String2NumMapNode **a, E_String2NumMapNode **b);\r\ninternal void e_string2num_map_node_array_sort__in_place(E_String2NumMapNodeArray *array);\r\n\r\n//- rjf: string -> expr\r\ninternal E_String2ExprMap e_string2expr_map_make(Arena *arena, U64 slot_count);\r\ninternal void e_string2expr_map_insert(Arena *arena, E_String2ExprMap *map, String8 string, E_Expr *expr);\r\ninternal void e_string2expr_map_inc_poison(E_String2ExprMap *map, String8 string);\r\ninternal void e_string2expr_map_dec_poison(E_String2ExprMap *map, String8 string);\r\ninternal E_Expr *e_string2expr_map_lookup(E_String2ExprMap *map, String8 string);\r\n\r\n//- rjf: string -> type-key\r\ninternal E_String2TypeKeyMap e_string2typekey_map_make(Arena *arena, U64 slots_count);\r\ninternal void e_string2typekey_map_insert(Arena *arena, E_String2TypeKeyMap *map, String8 string, E_TypeKey key);\r\ninternal E_TypeKey e_string2typekey_map_lookup(E_String2TypeKeyMap *map, String8 string);\r\n\r\n//- rjf: auto hooks\r\ninternal E_AutoHookMap e_auto_hook_map_make(Arena *arena, U64 slots_count);\r\ninternal void e_auto_hook_map_insert_new_(Arena *arena, E_AutoHookMap *map, E_AutoHookParams *params);\r\n#define e_auto_hook_map_insert_new(arena, map, ...) e_auto_hook_map_insert_new_((arena), (map), &(E_AutoHookParams){.type_key = zero_struct, __VA_ARGS__})\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug-Info-Driven Map Building Functions\r\n\r\ninternal E_String2NumMap *e_push_locals_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff);\r\ninternal E_String2NumMap *e_push_member_map_from_rdi_voff(Arena *arena, RDI_Parsed *rdi, U64 voff);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Creation & Selection\r\n\r\ninternal E_Cache *e_cache_alloc(void);\r\ninternal void e_cache_release(E_Cache *cache);\r\ninternal void e_select_cache(E_Cache *cache);\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Phase Markers\r\n\r\ninternal void e_select_base_ctx(E_BaseCtx *ctx);\r\ninternal void e_select_ir_ctx(E_IRCtx *ctx);\r\n\r\n////////////////////////////////\r\n//~ rjf: Context Accessors\r\n\r\ninternal E_DbgInfo *e_dbg_info_from_module(E_Module *module);\r\ninternal E_DbgInfo *e_dbg_info_from_type_key(E_TypeKey type_key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Cache Accessing Functions\r\n//\r\n// The cache uses a unique keying mechanism to refer to some evaluation at\r\n// many layers of analysis.\r\n//\r\n//                                  key\r\n//         ________________________________________________\r\n//        /            /             |                     \\\r\n//     text ->   expression   ->  ir tree and type  ->  interpretation result\r\n//\r\n// Each one of these calls refers to one stage in this pipeline. The cache will\r\n// only compute what is needed on-demand. If you ask for the full evaluation,\r\n// which is a bundle of artifacts at all layers of analysis, then all stages\r\n// will be computed.\r\n//\r\n// One wrinkle here is that the IR tree generation stage is implicitly\r\n// parameterized by the \"overridden\" IR tree - this is to enable \"parent\r\n// expressions\", e.g. `$.x`, or simply `x` assuming `foo` has such a member,\r\n// in the context of some struct `foo` evaluates to the same thing as `foo.x`.\r\n// So even though the primary API shape is based around singular keys, the\r\n// \"parent key stack\" also implicitly parameterizes all of these (partly\r\n// because it is not relevant in 99% of cases).\r\n\r\n//- rjf: parent key stack\r\ninternal E_Key e_parent_key_push(E_Key key);\r\ninternal E_Key e_parent_key_pop(void);\r\n#define E_ParentKey(key) DeferLoop(e_parent_key_push(key), e_parent_key_pop())\r\n\r\n//- rjf: key construction\r\ninternal E_Key e_key_from_string(String8 string);\r\ninternal E_Key e_key_from_stringf(char *fmt, ...);\r\ninternal E_Key e_key_from_expr(E_Expr *expr);\r\n\r\n//- rjf: base key -> bundle helper\r\ninternal E_CacheBundle *e_cache_bundle_from_key(E_Key key);\r\n\r\n//- rjf: bundle -> pipeline stage outputs\r\ninternal E_Parse e_parse_from_bundle(E_CacheBundle *bundle);\r\ninternal E_IRTreeAndType e_irtree_from_bundle(E_CacheBundle *bundle);\r\ninternal String8 e_bytecode_from_bundle(E_CacheBundle *bundle);\r\ninternal E_Interpretation e_interpretation_from_bundle(E_CacheBundle *bundle);\r\n#define e_parse_from_key(key) e_parse_from_bundle(e_cache_bundle_from_key(key))\r\n#define e_irtree_from_key(key) e_irtree_from_bundle(e_cache_bundle_from_key(key))\r\n#define e_bytecode_from_key(key) e_bytecode_from_bundle(e_cache_bundle_from_key(key))\r\n#define e_interpretation_from_key(key) e_interpretation_from_bundle(e_cache_bundle_from_key(key))\r\n\r\n//- rjf: key -> full expression string\r\ninternal String8 e_full_expr_string_from_key(Arena *arena, E_Key key);\r\n\r\n//- rjf: comprehensive bundle\r\ninternal E_Eval e_eval_from_bundle(E_CacheBundle *bundle);\r\ninternal E_Eval e_value_eval_from_eval(E_Eval eval);\r\n#define e_eval_from_key(key) e_eval_from_bundle(e_cache_bundle_from_key(key))\r\n#define e_value_from_key(key) (e_value_eval_from_eval(e_eval_from_key(key)).value)\r\n\r\n//- rjf: string-based helpers\r\n#define e_parse_from_string(string) e_parse_from_bundle(e_cache_bundle_from_key(e_key_from_string(string)))\r\n#define e_irtree_from_string(string) e_irtree_from_bundle(e_cache_bundle_from_key(e_key_from_string(string)))\r\n#define e_bytecode_from_string(string) e_bytecode_from_bundle(e_cache_bundle_from_key(e_key_from_string(string)))\r\n#define e_interpretation_from_string(string) e_interpretation_from_bundle(e_cache_bundle_from_key(e_key_from_string(string)))\r\n#define e_eval_from_string(string) e_eval_from_key(e_key_from_string(string))\r\n#define e_eval_from_stringf(...) e_eval_from_key(e_key_from_stringf(__VA_ARGS__))\r\n#define e_value_from_string(string) e_value_eval_from_eval(e_eval_from_string(string)).value\r\n#define e_value_from_stringf(...) e_value_eval_from_eval(e_eval_from_stringf(__VA_ARGS__)).value\r\n\r\n//- rjf: expr-based helpers\r\n#define e_eval_from_expr(expr) e_eval_from_key(e_key_from_expr(expr))\r\n#define e_value_from_expr(expr) e_value_eval_from_eval(e_eval_from_expr(expr)).value\r\n\r\n//- rjf: type key -> auto hooks\r\ninternal E_AutoHookMatchList e_push_auto_hook_matches_from_type_key(Arena *arena, E_TypeKey type_key);\r\ninternal E_AutoHookMatchList e_auto_hook_matches_from_type_key(E_TypeKey type_key);\r\n\r\n//- rjf: string IDs\r\ninternal U64 e_id_from_string(String8 string);\r\ninternal String8 e_string_from_id(U64 id);\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Extension Functions\r\n\r\ninternal E_Key e_key_wrap(E_Key key, String8 string);\r\ninternal E_Key e_key_wrapf(E_Key key, char *fmt, ...);\r\n\r\n//- rjf: eval-based helpers\r\n#define e_eval_wrap(eval, string) e_eval_from_key(e_key_wrap((eval).key, (string)))\r\n#define e_eval_wrapf(eval, ...) e_eval_from_key(e_key_wrapf((eval).key, __VA_ARGS__))\r\n\r\n////////////////////////////////\r\n//~ rjf: Eval Info Extraction\r\n\r\ninternal Rng1U64 e_range_from_eval(E_Eval eval);\r\n\r\n////////////////////////////////\r\n//~ rjf: Debug Functions\r\n\r\ninternal String8 e_debug_log_from_expr_string(Arena *arena, String8 string);\r\n\r\n#endif // EVAL_CORE_H\r\n"
  },
  {
    "path": "src/eval/eval_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"eval/eval_core.c\"\r\n#include \"eval/eval_types.c\"\r\n#include \"eval/eval_parse.c\"\r\n#include \"eval/eval_ir.c\"\r\n#include \"eval/eval_interpret.c\"\r\n"
  },
  {
    "path": "src/eval/eval_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_INC_H\r\n#define EVAL_INC_H\r\n\r\n#include \"eval/eval_core.h\"\r\n#include \"eval/eval_types.h\"\r\n#include \"eval/eval_parse.h\"\r\n#include \"eval/eval_ir.h\"\r\n#include \"eval/eval_interpret.h\"\r\n\r\n#endif // EVAL_INC_H\r\n"
  },
  {
    "path": "src/eval/eval_interpret.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)\r\n\r\ninternal void\r\ne_select_interpret_ctx(E_InterpretCtx *ctx, RDI_Parsed *primary_rdi, U64 ip_voff)\r\n{\r\n  e_interpret_ctx = ctx;\r\n  \r\n  // compute and apply frame base\r\n  if(primary_rdi != 0)\r\n  {\r\n    E_Interpretation frame_base = { .code = ~0 };\r\n    \r\n    RDI_Procedure *proc = rdi_procedure_from_voff(primary_rdi, ip_voff);\r\n    for(U64 loc_block_idx = proc->frame_base_location_first; loc_block_idx < proc->frame_base_location_opl; loc_block_idx += 1)\r\n    {\r\n      RDI_LocationBlock *block = rdi_element_from_name_idx(primary_rdi, LocationBlocks, loc_block_idx);\r\n      if (block->scope_off_first <= ip_voff && ip_voff < block->scope_off_opl) {\r\n        U64  all_location_data_size = 0;\r\n        U8  *all_location_data      = rdi_table_from_name(primary_rdi, LocationData, &all_location_data_size);\r\n        if(block->location_data_off + sizeof(RDI_LocationKind) <= all_location_data_size)\r\n        {\r\n          RDI_LocationKind loc_kind = *(RDI_LocationKind *)(all_location_data + block->location_data_off);\r\n          if(loc_kind == RDI_LocationKind_ValBytecodeStream || loc_kind == RDI_LocationKind_AddrBytecodeStream)\r\n          {\r\n            U8      *bytecode_ptr  = all_location_data + block->location_data_off + sizeof(RDI_LocationKind);\r\n            U8      *bytecode_opl  = all_location_data + all_location_data_size;\r\n            U64      bytecode_size = rdi_size_from_bytecode_stream(bytecode_ptr, bytecode_opl);\r\n            String8  bytecode      = str8(bytecode_ptr, bytecode_size);\r\n            frame_base = e_interpret(bytecode);\r\n          }\r\n          else if(loc_kind != RDI_LocationKind_NULL)\r\n          {\r\n            NotImplemented;\r\n          }\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    \r\n    if(frame_base.code == E_InterpretationCode_Good)\r\n    {\r\n      *ctx->frame_base = frame_base.value.u64;\r\n    }\r\n    else\r\n    {\r\n      ctx->frame_base = 0;\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Space Reading Helpers\r\n\r\ninternal U64\r\ne_space_gen(E_Space space)\r\n{\r\n  U64 result = 0;\r\n  if(e_base_ctx->space_gen != 0)\r\n  {\r\n    result = e_base_ctx->space_gen(space);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_space_read(E_Space space, void *out, Rng1U64 range)\r\n{\r\n  ProfBeginFunction();\r\n  B32 result = 0;\r\n  {\r\n    switch(space.kind)\r\n    {\r\n      //- rjf: reads from hash store key\r\n      case E_SpaceKind_HashStoreKey:\r\n      {\r\n        C_Root root = {space.u64_0};\r\n        C_ID id = {space.u128};\r\n        C_Key key = c_key_make(root, id);\r\n        U128 hash = c_hash_from_key(key, 0);\r\n        Access *access = access_open();\r\n        {\r\n          String8 data = c_data_from_hash(access, hash);\r\n          Rng1U64 legal_range = r1u64(0, data.size);\r\n          Rng1U64 read_range = intersect_1u64(range, legal_range);\r\n          if(read_range.min < read_range.max)\r\n          {\r\n            result = 1;\r\n            MemoryCopy(out, data.str + read_range.min, dim_1u64(read_range));\r\n          }\r\n        }\r\n        access_close(access);\r\n      }break;\r\n      \r\n      //- rjf: file reads\r\n      case E_SpaceKind_File:\r\n      {\r\n        // rjf: unpack space/path\r\n        U64 file_path_string_id = space.u64_0;\r\n        String8 file_path = e_string_from_id(file_path_string_id);\r\n        \r\n        // rjf: find containing chunk range\r\n        U64 chunk_size = KB(4);\r\n        Rng1U64 containing_range = range;\r\n        containing_range.min -= containing_range.min%chunk_size;\r\n        containing_range.max += chunk_size-1;\r\n        containing_range.max -= containing_range.max%chunk_size;\r\n        \r\n        // rjf: map to hash\r\n        C_Key key = fs_key_from_path_range(file_path, containing_range, 0);\r\n        U128 hash = c_hash_from_key(key, 0);\r\n        \r\n        // rjf: look up from hash store\r\n        Access *access = access_open();\r\n        {\r\n          String8 data = c_data_from_hash(access, hash);\r\n          Rng1U64 legal_range = r1u64(containing_range.min, containing_range.min + data.size);\r\n          Rng1U64 read_range = intersect_1u64(range, legal_range);\r\n          if(read_range.min < read_range.max)\r\n          {\r\n            result = 1;\r\n            MemoryCopy(out, data.str + read_range.min - containing_range.min, dim_1u64(read_range));\r\n          }\r\n        }\r\n        access_close(access);\r\n      }break;\r\n      \r\n      //- rjf: default -> use hooks\r\n      default:\r\n      if(e_base_ctx->space_read != 0)\r\n      {\r\n        result = e_base_ctx->space_read(space, out, range);\r\n      }break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_space_write(E_Space space, void *in, Rng1U64 range)\r\n{\r\n  ProfBeginFunction();\r\n  B32 result = 0;\r\n  if(e_base_ctx->space_write != 0)\r\n  {\r\n    switch(space.kind)\r\n    {\r\n      default:\r\n      {\r\n        result = e_base_ctx->space_write(space, in, range);\r\n      }break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Interpretation Functions\r\n\r\ninternal E_Interpretation\r\ne_interpret(String8 bytecode)\r\n{\r\n  E_Interpretation result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: allocate stack & \"registers\"\r\n  U64 stack_cap = 128; // TODO(rjf): scan bytecode; determine maximum stack depth\r\n  E_Value *stack = push_array_no_zero(scratch.arena, E_Value, stack_cap);\r\n  U64 stack_count = 0;\r\n  E_Space selected_space = {0};\r\n  if(bytecode.size != 0)\r\n  {\r\n    selected_space = e_interpret_ctx->primary_space;\r\n  }\r\n  \r\n  //- rjf: iterate bytecode & perform ops\r\n  U8 *ptr = bytecode.str;\r\n  U8 *opl = bytecode.str + bytecode.size;\r\n  for(;ptr < opl;)\r\n  {\r\n    // rjf: consume next opcode\r\n    RDI_EvalOp op = (RDI_EvalOp)*ptr;\r\n    U16 ctrlbits = 0;\r\n    if(op < RDI_EvalOp_COUNT)\r\n    {\r\n      ctrlbits = rdi_eval_op_ctrlbits_table[op];\r\n    }\r\n    else switch(op)\r\n    {\r\n      case E_IRExtKind_SetSpace:{ctrlbits = RDI_EVAL_CTRLBITS(32, 0, 0);}break;\r\n      default:\r\n      {\r\n        result.code = E_InterpretationCode_BadOp;\r\n        goto done;\r\n      }break;\r\n    }\r\n    ptr += 1;\r\n    \r\n    // rjf: decode\r\n    E_Value imm = {0};\r\n    {\r\n      U32 decode_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\r\n      U8 *next_ptr = ptr + decode_size;\r\n      if(next_ptr > opl)\r\n      {\r\n        result.code = E_InterpretationCode_BadOp;\r\n        goto done;\r\n      }\r\n      // TODO(rjf): guarantee 8 bytes padding after the end of serialized\r\n      // bytecode; read 8 bytes and mask\r\n      MemoryCopy(&imm, ptr, decode_size);\r\n      ptr = next_ptr;\r\n    }\r\n    \r\n    // rjf: unpack imm -> type group & arithmetic width\r\n    RDI_EvalTypeGroup type_group = (RDI_EvalTypeGroup)imm.u512.u8[0];\r\n    U64 op_arithmetic_size = (U64)imm.u512.u8[1];\r\n    \r\n    // rjf: pop\r\n    E_Value *svals = 0;\r\n    {\r\n      U32 pop_count = RDI_POPN_FROM_CTRLBITS(ctrlbits);\r\n      if(pop_count > stack_count)\r\n      {\r\n        result.code = E_InterpretationCode_BadOp;\r\n        goto done;\r\n      }\r\n      if(pop_count <= stack_count)\r\n      {\r\n        stack_count -= pop_count;\r\n        svals = stack + stack_count;\r\n      }\r\n    }\r\n    \r\n    // rjf: interpret op, given decodes/pops\r\n    E_Value nval = {0};\r\n    switch(op)\r\n    {\r\n      case E_IRExtKind_SetSpace:\r\n      {\r\n        MemoryCopy(&selected_space, &imm, sizeof(selected_space));\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Stop:\r\n      {\r\n        goto done;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Noop:\r\n      {\r\n        // do nothing\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Cond:\r\n      if(svals[0].u64)\r\n      {\r\n        ptr += imm.u64;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Skip:\r\n      {\r\n        ptr += imm.u64;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_MemRead:\r\n      {\r\n        U64 addr = svals[0].u64;\r\n        U64 size = imm.u64;\r\n        B32 good_read = e_space_read(selected_space, &nval, r1u64(addr, addr+size));\r\n        if(!good_read)\r\n        {\r\n          result.code = E_InterpretationCode_BadMemRead;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_RegRead:\r\n      {\r\n        U8 rdi_reg_code     = (imm.u64&0x0000FF)>>0;\r\n        U8 byte_size        = (imm.u64&0x00FF00)>>8;\r\n        U8 byte_off         = (imm.u64&0xFF0000)>>16;\r\n        REGS_RegCode base_reg_code = regs_reg_code_from_arch_rdi_code(e_interpret_ctx->reg_arch, rdi_reg_code);\r\n        REGS_Rng rng = regs_reg_code_rng_table_from_arch(e_interpret_ctx->reg_arch)[base_reg_code];\r\n        U64 off = (U64)rng.byte_off + byte_off;\r\n        U64 size = (U64)byte_size;\r\n        B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size));\r\n        if(!good_read)\r\n        {\r\n          result.code = E_InterpretationCode_BadRegRead;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_RegReadDyn:\r\n      {\r\n        U64 off  = svals[0].u64;\r\n        U64 size = bit_size_from_arch(e_interpret_ctx->reg_arch)/8;\r\n        B32 good_read = e_space_read(e_interpret_ctx->reg_space, &nval, r1u64(off, off+size));\r\n        if(!good_read)\r\n        {\r\n          result.code = E_InterpretationCode_BadRegRead;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_FrameOff:\r\n      {\r\n        if(e_interpret_ctx->frame_base != 0)\r\n        {\r\n          nval.u64 = *e_interpret_ctx->frame_base + imm.u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadFrameBase;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_ModuleOff:\r\n      {\r\n        if(e_interpret_ctx->module_base != 0)\r\n        {\r\n          nval.u64 = *e_interpret_ctx->module_base + imm.u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadModuleBase;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_TLSOff:\r\n      {\r\n        if(e_interpret_ctx->tls_base != 0)\r\n        {\r\n          nval.u64 = *e_interpret_ctx->tls_base + imm.u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadTLSBase;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_ConstU8:\r\n      case RDI_EvalOp_ConstU16:\r\n      case RDI_EvalOp_ConstU32:\r\n      case RDI_EvalOp_ConstU64:\r\n      case RDI_EvalOp_ConstU128:\r\n      {\r\n        nval = imm;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_ConstString:\r\n      {\r\n        MemoryCopy(&nval, ptr, imm.u64);\r\n        ptr += imm.u64;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Abs:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.f32 = svals[0].f32;\r\n          if(svals[0].f32 < 0)\r\n          {\r\n            nval.f32 = -svals[0].f32;\r\n          }\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.f64 = svals[0].f64;\r\n          if(svals[0].f64 < 0)\r\n          {\r\n            nval.f64 = -svals[0].f64;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          nval.s64 = svals[0].s64;\r\n          if(svals[0].s64 < 0)\r\n          {\r\n            nval.s64 = -svals[0].s64;\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Neg:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.f32 = -svals[0].f32;\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.f64 = -svals[0].f64;\r\n        }\r\n        else\r\n        {\r\n          nval.u64 = (~svals[0].u64) + 1;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Add:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.f32 = svals[0].f32 + svals[1].f32;\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.f64 = svals[0].f64 + svals[1].f64;\r\n        }\r\n        else\r\n        {\r\n          nval.u64 = svals[0].u64 + svals[1].u64;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Sub:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.f32 = svals[0].f32 - svals[1].f32;\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.f64 = svals[0].f64 - svals[1].f64;\r\n        }\r\n        else\r\n        {\r\n          nval.u64 = svals[0].u64 - svals[1].u64;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Mul:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.f32 = svals[0].f32*svals[1].f32;\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.f64 = svals[0].f64*svals[1].f64;\r\n        }\r\n        else\r\n        {\r\n          nval.u64 = svals[0].u64*svals[1].u64;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Div:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          if(svals[1].f32 != 0.f)\r\n          {\r\n            nval.f32 = svals[0].f32/svals[1].f32;\r\n          }\r\n          else\r\n          {\r\n            result.code = E_InterpretationCode_DivideByZero;\r\n            goto done;\r\n          }\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          if(svals[1].f64 != 0.)\r\n          {\r\n            nval.f64 = svals[0].f64/svals[1].f64;\r\n          }\r\n          else\r\n          {\r\n            result.code = E_InterpretationCode_DivideByZero;\r\n            goto done;\r\n          }\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_U ||\r\n                type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          if(svals[1].u64 != 0)\r\n          {\r\n            nval.u64 = svals[0].u64/svals[1].u64;\r\n          }\r\n          else\r\n          {\r\n            result.code = E_InterpretationCode_DivideByZero;\r\n            goto done;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Mod:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          if(svals[1].u64 != 0)\r\n          {\r\n            nval.u64 = svals[0].u64%svals[1].u64;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_LShift:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U)\r\n        {\r\n          switch(op_arithmetic_size)\r\n          {\r\n            default:{}break;\r\n            case 1:{nval.u8  = svals[0].u8 << svals[1].u8;}break;\r\n            case 2:{nval.u16 = svals[0].u16 << svals[1].u16;}break;\r\n            case 4:{nval.u32 = svals[0].u32 << svals[1].u32;}break;\r\n            case 8:{nval.u64 = svals[0].u64 << svals[1].u64;}break;\r\n          }\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          switch(op_arithmetic_size)\r\n          {\r\n            default:{}break;\r\n            case 1:{nval.s8  = svals[0].s8 << svals[1].s8;}break;\r\n            case 2:{nval.s16 = svals[0].s16 << svals[1].s16;}break;\r\n            case 4:{nval.s32 = svals[0].s32 << svals[1].s32;}break;\r\n            case 8:{nval.s64 = svals[0].s64 << svals[1].s64;}break;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_RShift:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U)\r\n        {\r\n          switch(op_arithmetic_size)\r\n          {\r\n            default:{}break;\r\n            case 1:{nval.u8  = svals[0].u8 >> svals[1].u8;}break;\r\n            case 2:{nval.u16 = svals[0].u16 >> svals[1].u16;}break;\r\n            case 4:{nval.u32 = svals[0].u32 >> svals[1].u32;}break;\r\n            case 8:{nval.u64 = svals[0].u64 >> svals[1].u64;}break;\r\n          }\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          switch(op_arithmetic_size)\r\n          {\r\n            default:{}break;\r\n            case 1:{nval.s8  = svals[0].s8 >> svals[1].s8;}break;\r\n            case 2:{nval.s16 = svals[0].s16 >> svals[1].s16;}break;\r\n            case 4:{nval.s32 = svals[0].s32 >> svals[1].s32;}break;\r\n            case 8:{nval.s64 = svals[0].s64 >> svals[1].s64;}break;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_BitAnd:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = svals[0].u64&svals[1].u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_BitOr:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = svals[0].u64|svals[1].u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_BitXor:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = svals[0].u64^svals[1].u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_BitNot:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = ~svals[0].u64;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_LogAnd:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (svals[0].u64 && svals[1].u64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_LogOr:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (svals[0].u64 || svals[1].u64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_LogNot:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_U ||\r\n           type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (!svals[0].u64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_EqEq:\r\n      {\r\n        B32 result = MemoryMatchArray(svals[0].u512.u64, svals[1].u512.u64);\r\n        nval.u64 = !!result;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_NtEq:\r\n      {\r\n        B32 result = MemoryMatchArray(svals[0].u512.u64, svals[1].u512.u64);\r\n        nval.u64 = !result;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_LsEq:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.u64 = (svals[0].f32 <= svals[1].f32);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.u64 = (svals[0].f64 <= svals[1].f64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_U)\r\n        {\r\n          nval.u64 = (svals[0].u64 <= svals[1].u64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (svals[0].s64 <= svals[1].s64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_GrEq:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.u64 = (svals[0].f32 >= svals[1].f32);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.u64 = (svals[0].f64 >= svals[1].f64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_U)\r\n        {\r\n          nval.u64 = (svals[0].u64 >= svals[1].u64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (svals[0].s64 >= svals[1].s64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Less:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.u64 = (svals[0].f32 < svals[1].f32);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.u64 = (svals[0].f64 < svals[1].f64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_U)\r\n        {\r\n          nval.u64 = (svals[0].u64 < svals[1].u64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (svals[0].s64 < svals[1].s64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Grtr:\r\n      {\r\n        if(type_group == RDI_EvalTypeGroup_F32)\r\n        {\r\n          nval.u64 = (svals[0].f32 > svals[1].f32);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_F64)\r\n        {\r\n          nval.u64 = (svals[0].f64 > svals[1].f64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_U)\r\n        {\r\n          nval.u64 = (svals[0].u64 > svals[1].u64);\r\n        }\r\n        else if(type_group == RDI_EvalTypeGroup_S)\r\n        {\r\n          nval.u64 = (svals[0].s64 > svals[1].s64);\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOpTypes;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Trunc:\r\n      {\r\n        if(0 < imm.u64)\r\n        {\r\n          U64 mask = 0;\r\n          if(imm.u64 < 64)\r\n          {\r\n            mask = max_U64 >> (64 - imm.u64);\r\n          }\r\n          nval.u64 = svals[0].u64&mask;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_TruncSigned:\r\n      {\r\n        if(0 < imm.u64)\r\n        {\r\n          U64 mask = 0;\r\n          if(imm.u64 < 64)\r\n          {\r\n            mask = max_U64 >> (64 - imm.u64);\r\n          }\r\n          U64 high = 0;\r\n          if(svals[0].u64 & (1 << (imm.u64 - 1)))\r\n          {\r\n            high = ~mask;\r\n          }\r\n          nval.u64 = high|(svals[0].u64&mask);\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Convert:\r\n      {\r\n        U32 in = imm.u64&0xFF;\r\n        U32 out = (imm.u64 >> 8)&0xFF;\r\n        if(in != out)\r\n        {\r\n          switch(in + out*RDI_EvalTypeGroup_COUNT)\r\n          {\r\n            case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.u64 = (U64)svals[0].f32;\r\n            }break;\r\n            case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.u64 = (U64)svals[0].f64;\r\n            }break;\r\n            \r\n            case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.s64 = (S64)svals[0].f32;\r\n            }break;\r\n            case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.s64 = (S64)svals[0].f64;\r\n            }break;\r\n            \r\n            case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.f32 = (F32)svals[0].u64;\r\n            }break;\r\n            case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.f32 = (F32)svals[0].s64;\r\n            }break;\r\n            case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.f32 = (F32)svals[0].f64;\r\n            }break;\r\n            \r\n            case RDI_EvalTypeGroup_U + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.f64 = (F64)svals[0].u64;\r\n            }break;\r\n            case RDI_EvalTypeGroup_S + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.f64 = (F64)svals[0].s64;\r\n            }break;\r\n            case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT:\r\n            {\r\n              nval.f64 = (F64)svals[0].f32;\r\n            }break;\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Pick:\r\n      {\r\n        if(stack_count > imm.u64)\r\n        {\r\n          nval = stack[stack_count - imm.u64 - 1];\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOp;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Pop:\r\n      {\r\n        // do nothing - the pop is handled by the control bits\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Insert:\r\n      {\r\n        if(stack_count > imm.u64)\r\n        {\r\n          if(imm.u64 > 0)\r\n          {\r\n            E_Value tval = stack[stack_count - 1];\r\n            E_Value *dst = stack + stack_count - 1 - imm.u64;\r\n            E_Value *shift = dst + 1;\r\n            MemoryCopy(shift, dst, imm.u64*sizeof(E_Value));\r\n            *dst = tval;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_BadOp;\r\n          goto done;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_ValueRead:\r\n      {\r\n        U64 bytes_to_read = imm.u64;\r\n        U64 offset = svals[0].u64;\r\n        if(offset + bytes_to_read <= sizeof(E_Value))\r\n        {\r\n          E_Value src_val = svals[1];\r\n          MemoryCopy(&nval.u512.u64[0], (U8 *)(&src_val.u512.u64[0]) + offset, bytes_to_read);\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_ByteSwap:\r\n      {\r\n        U64 byte_size = imm.u64;\r\n        switch(byte_size)\r\n        {\r\n          default:\r\n          {\r\n            result.code = E_InterpretationCode_BadOp;\r\n            goto done;\r\n          }break;\r\n          case 2:{nval.u16 = bswap_u16(svals[0].u16);}break;\r\n          case 4:{nval.u32 = bswap_u32(svals[0].u32);}break;\r\n          case 8:{nval.u64 = bswap_u64(svals[0].u64);}break;\r\n        }\r\n      }break;\r\n      \r\n      case RDI_EvalOp_CallSiteValue:\r\n      {\r\n        NotImplemented;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_PartialValue:\r\n      {\r\n        NotImplemented;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_PartialValueBit:\r\n      {\r\n        NotImplemented;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_Swap:\r\n      {\r\n        // TODO: add support for pushing multiple values onto the stack\r\n        NotImplemented;\r\n      }break;\r\n    }\r\n    \r\n    // rjf: push\r\n    {\r\n      U64 push_count = RDI_PUSHN_FROM_CTRLBITS(ctrlbits);\r\n      if(push_count == 1)\r\n      {\r\n        if(stack_count < stack_cap)\r\n        {\r\n          stack[stack_count] = nval;\r\n          stack_count += 1;\r\n        }\r\n        else\r\n        {\r\n          result.code = E_InterpretationCode_InsufficientStackSpace;\r\n          goto done;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  done:;\r\n  \r\n  if(stack_count >= 1)\r\n  {\r\n    result.value = stack[0];\r\n  }\r\n  result.space = selected_space;\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/eval/eval_interpret.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_INTERPRET_H\r\n#define EVAL_INTERPRET_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Interpretation Context\r\n\r\ntypedef struct E_InterpretCtx E_InterpretCtx;\r\nstruct E_InterpretCtx\r\n{\r\n  E_Space primary_space;\r\n  Arch reg_arch;\r\n  E_Space reg_space;\r\n  U64 reg_unwind_count;\r\n  U64 *module_base;\r\n  U64 *frame_base;\r\n  U64 *tls_base;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nthread_static E_InterpretCtx *e_interpret_ctx = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Context Selection Functions (Selection Required For All Subsequent APIs)\r\n\r\ninternal void e_select_interpret_ctx(E_InterpretCtx *ctx, RDI_Parsed *primary_rdi, U64 ip_voff);\r\n\r\n////////////////////////////////\r\n//~ rjf: Space Reading Helpers\r\n\r\ninternal U64 e_space_gen(E_Space space);\r\ninternal B32 e_space_read(E_Space space, void *out, Rng1U64 range);\r\ninternal B32 e_space_write(E_Space space, void *in, Rng1U64 range);\r\n\r\n////////////////////////////////\r\n//~ rjf: Interpretation Functions\r\n\r\ninternal E_Interpretation e_interpret(String8 bytecode);\r\n\r\n#endif // EVAL_INTERPRET_H\r\n"
  },
  {
    "path": "src/eval/eval_ir.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: IR-ization Functions\r\n\r\n//- rjf: op list functions\r\n\r\ninternal void\r\ne_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, E_Value value)\r\n{\r\n  U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];\r\n  U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\r\n  E_Op *node = push_array_no_zero(arena, E_Op, 1);\r\n  node->opcode = opcode;\r\n  node->value = value;\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->op_count += 1;\r\n  list->encoded_size += 1 + p_size;\r\n}\r\n\r\ninternal void\r\ne_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x)\r\n{\r\n  if(0){}\r\n  else if(x <= 0xFF)       { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8,  e_value_u64(x)); }\r\n  else if(x <= 0xFFFF)     { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, e_value_u64(x)); }\r\n  else if(x <= 0xFFFFFFFF) { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, e_value_u64(x)); }\r\n  else                     { e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, e_value_u64(x)); }\r\n}\r\n\r\ninternal void\r\ne_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x)\r\n{\r\n  if(-0x80 <= x && x <= 0x7F)\r\n  {\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_ConstU8, e_value_u64((U64)x));\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(8));\r\n  }\r\n  else if(-0x8000 <= x && x <= 0x7FFF)\r\n  {\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_ConstU16, e_value_u64((U64)x));\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(16));\r\n  }\r\n  else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll)\r\n  {\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_ConstU32, e_value_u64((U64)x));\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_TruncSigned, e_value_u64(32));\r\n  }\r\n  else\r\n  {\r\n    e_oplist_push_op(arena, list, RDI_EvalOp_ConstU64, e_value_u64((U64)x));\r\n  }\r\n}\r\n\r\ninternal void\r\ne_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode)\r\n{\r\n  E_Op *node = push_array_no_zero(arena, E_Op, 1);\r\n  node->opcode = E_IRExtKind_Bytecode;\r\n  node->string = bytecode;\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->op_count += 1;\r\n  list->encoded_size += bytecode.size;\r\n}\r\n\r\ninternal void\r\ne_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space)\r\n{\r\n  E_Op *node = push_array_no_zero(arena, E_Op, 1);\r\n  node->opcode = E_IRExtKind_SetSpace;\r\n  StaticAssert(sizeof(E_Space) <= sizeof(E_Value), space_size_check);\r\n  MemoryCopy(&node->value, &space, sizeof(space));\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->op_count += 1;\r\n  list->encoded_size += 1 + sizeof(space);\r\n}\r\n\r\ninternal void\r\ne_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string)\r\n{\r\n  RDI_EvalOp opcode = RDI_EvalOp_ConstString;\r\n  U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];\r\n  U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\r\n  E_Op *node = push_array_no_zero(arena, E_Op, 1);\r\n  node->opcode = opcode;\r\n  node->string = string;\r\n  node->value.u64 = Min(string.size, 64);\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->op_count += 1;\r\n  list->encoded_size += 1 + p_size + node->value.u64;\r\n}\r\n\r\ninternal void\r\ne_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push)\r\n{\r\n  if(to_push->first && dst->first)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->op_count += to_push->op_count;\r\n    dst->encoded_size += to_push->encoded_size;\r\n  }\r\n  else if(!dst->first)\r\n  {\r\n    MemoryCopyStruct(dst, to_push);\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\n//- rjf: ir tree core building helpers\r\n\r\ninternal E_IRNode *\r\ne_push_irnode(Arena *arena, RDI_EvalOp op)\r\n{\r\n  E_IRNode *n = push_array(arena, E_IRNode, 1);\r\n  n->first = n->last = n->next = &e_irnode_nil;\r\n  n->op = op;\r\n  return n;\r\n}\r\n\r\ninternal void\r\ne_irnode_push_child(E_IRNode *parent, E_IRNode *child)\r\n{\r\n  if(parent != &e_irnode_nil && child != &e_irnode_nil)\r\n  {\r\n    SLLQueuePush_NZ(&e_irnode_nil, parent->first, parent->last, child, next);\r\n  }\r\n}\r\n\r\n//- rjf: ir subtree building helpers\r\n\r\ninternal E_IRNode *\r\ne_irtree_const_u(Arena *arena, U64 v)\r\n{\r\n  // rjf: choose op\r\n  RDI_EvalOp op = RDI_EvalOp_ConstU64;\r\n  if     (v < 0x100)       { op = RDI_EvalOp_ConstU8; }\r\n  else if(v < 0x10000)     { op = RDI_EvalOp_ConstU16; }\r\n  else if(v < 0x100000000) { op = RDI_EvalOp_ConstU32; }\r\n  \r\n  // rjf: build\r\n  E_IRNode *n = e_push_irnode(arena, op);\r\n  n->value.u64 = v;\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_leaf_u128(Arena *arena, U128 u128)\r\n{\r\n  E_IRNode *n = e_push_irnode(arena, RDI_EvalOp_ConstU128);\r\n  n->value.u128 = u128;\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *c)\r\n{\r\n  E_IRNode *n = e_push_irnode(arena, op);\r\n  n->value.u64 = group;\r\n  e_irnode_push_child(n, c);\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, U64 operand_size, E_IRNode *l, E_IRNode *r)\r\n{\r\n  E_IRNode *n = e_push_irnode(arena, op);\r\n  n->value.u512.u8[0] = (U8)group;\r\n  n->value.u512.u8[1] = (U8)operand_size;\r\n  e_irnode_push_child(n, l);\r\n  e_irnode_push_child(n, r);\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, U64 operand_size, E_IRNode *l, E_IRNode *r)\r\n{\r\n  E_IRNode *n = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_U, operand_size, l, r);\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l, E_IRNode *r)\r\n{\r\n  E_IRNode *n = e_push_irnode(arena, RDI_EvalOp_Cond);\r\n  e_irnode_push_child(n, c);\r\n  e_irnode_push_child(n, l);\r\n  e_irnode_push_child(n, r);\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_bytecode_no_copy(Arena *arena, String8 bytecode)\r\n{\r\n  E_IRNode *n = e_push_irnode(arena, E_IRExtKind_Bytecode);\r\n  n->string = bytecode;\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_string_literal(Arena *arena, String8 string)\r\n{\r\n  E_IRNode *root = e_push_irnode(arena, RDI_EvalOp_ConstString);\r\n  root->string = string;\r\n  return root;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c)\r\n{\r\n  E_IRNode *root = e_push_irnode(arena, E_IRExtKind_SetSpace);\r\n  StaticAssert(sizeof(E_Space) <= sizeof(E_Value), space_size_check);\r\n  MemoryCopy(&root->value, &space, sizeof(space));\r\n  e_irnode_push_child(root, c);\r\n  return root;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key)\r\n{\r\n  E_IRNode *result = &e_irnode_nil;\r\n  U64 byte_size = e_type_byte_size_from_key(type_key);\r\n  byte_size = Min(64, byte_size);\r\n  \r\n  // rjf: build the read node\r\n  E_IRNode *read_node = e_push_irnode(arena, RDI_EvalOp_MemRead);\r\n  read_node->value.u64 = byte_size;\r\n  e_irnode_push_child(read_node, c);\r\n  \r\n  // rjf: build a signed trunc node if needed\r\n  U64 bit_size = byte_size << 3;\r\n  E_IRNode *with_trunc = read_node;\r\n  E_TypeKind kind = e_type_kind_from_key(type_key);\r\n  if(bit_size < 64 && e_type_kind_is_signed(kind))\r\n  {\r\n    with_trunc = e_push_irnode(arena, RDI_EvalOp_TruncSigned);\r\n    with_trunc->value.u64 = bit_size;\r\n    e_irnode_push_child(with_trunc, read_node);\r\n  }\r\n  \r\n  // rjf: fill\r\n  result = with_trunc;\r\n  \r\n  return result;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in)\r\n{\r\n  E_IRNode *n = e_push_irnode(arena, RDI_EvalOp_Convert);\r\n  n->value.u64 = in | (out << 8);\r\n  e_irnode_push_child(n, c);\r\n  return n;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key)\r\n{\r\n  E_IRNode *result = c;\r\n  U64 byte_size = e_type_byte_size_from_key(type_key);\r\n  if(byte_size < 64)\r\n  {\r\n    RDI_EvalOp op = RDI_EvalOp_Trunc;\r\n    E_TypeKind kind = e_type_kind_from_key(type_key);\r\n    if(e_type_kind_is_signed(kind))\r\n    {\r\n      op = RDI_EvalOp_TruncSigned;\r\n    }\r\n    U64 bit_size = byte_size << 3;\r\n    result = e_push_irnode(arena, op);\r\n    result->value.u64 = bit_size;\r\n    e_irnode_push_child(result, c);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in)\r\n{\r\n  E_IRNode *result = c;\r\n  E_TypeKind in_kind = e_type_kind_from_key(in);\r\n  E_TypeKind out_kind = e_type_kind_from_key(out);\r\n  U8 in_group  = e_type_group_from_kind(in_kind);\r\n  U8 out_group = e_type_group_from_kind(out_kind);\r\n  U32 conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);\r\n  if(conversion_rule == RDI_EvalConversionKind_Legal)\r\n  {\r\n    result = e_irtree_convert_lo(arena, result, out_group, in_group);\r\n  }\r\n  U64 in_byte_size = e_type_byte_size_from_key(in);\r\n  U64 out_byte_size = e_type_byte_size_from_key(out);\r\n  if(out_byte_size < in_byte_size && e_type_kind_is_integer(out_kind))\r\n  {\r\n    result = e_irtree_trunc(arena, result, out);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_IRNode *\r\ne_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key)\r\n{\r\n  E_IRNode *result = tree;\r\n  if(from_mode == E_Mode_Offset)\r\n  {\r\n    result = e_irtree_mem_read_type(arena, tree, type_key);\r\n  }\r\n  if(e_type_kind_from_key(type_key) == E_TypeKind_Bitfield)\r\n  {\r\n    E_Type *type = e_type_from_key(type_key);\r\n    if(type->byte_size <= sizeof(U64))\r\n    {\r\n      U64 valid_bits_mask = 0;\r\n      for(U64 idx = 0; idx < type->count; idx += 1)\r\n      {\r\n        valid_bits_mask |= (1ull<<idx);\r\n      }\r\n      result = e_irtree_binary_op_u(arena, RDI_EvalOp_RShift, type->byte_size, result, e_irtree_const_u(arena, type->off));\r\n      result = e_irtree_binary_op_u(arena, RDI_EvalOp_BitAnd, type->byte_size, result, e_irtree_const_u(arena, valid_bits_mask));\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: rule tag poison checking\r\n\r\ninternal B32\r\ne_expr_is_poisoned(E_Expr *expr)\r\n{\r\n  B32 tag_is_poisoned = 0;\r\n  U64 hash = e_hash_from_string(5381, str8_struct(&expr));\r\n  U64 slot_idx = hash%e_cache->used_expr_map->slots_count;\r\n  for(E_UsedExprNode *n = e_cache->used_expr_map->slots[slot_idx].first; n != 0; n = n->next)\r\n  {\r\n    if(n->expr == expr)\r\n    {\r\n      tag_is_poisoned = 1;\r\n      break;\r\n    }\r\n  }\r\n  return tag_is_poisoned;\r\n}\r\n\r\ninternal void\r\ne_expr_poison(E_Expr *expr)\r\n{\r\n  U64 hash = e_hash_from_string(5381, str8_struct(&expr));\r\n  U64 slot_idx = hash%e_cache->used_expr_map->slots_count;\r\n  E_UsedExprNode *n = push_array(e_cache->arena, E_UsedExprNode, 1);\r\n  n->expr = expr;\r\n  DLLPushBack(e_cache->used_expr_map->slots[slot_idx].first, e_cache->used_expr_map->slots[slot_idx].last, n);\r\n}\r\n\r\ninternal void\r\ne_expr_unpoison(E_Expr *expr)\r\n{\r\n  U64 hash = e_hash_from_string(5381, str8_struct(&expr));\r\n  U64 slot_idx = hash%e_cache->used_expr_map->slots_count;\r\n  for(E_UsedExprNode *n = e_cache->used_expr_map->slots[slot_idx].first; n != 0; n = n->next)\r\n  {\r\n    if(n->expr == expr)\r\n    {\r\n      DLLRemove(e_cache->used_expr_map->slots[slot_idx].first, e_cache->used_expr_map->slots[slot_idx].last, n);\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\n//- rjf: top-level irtree/type extraction\r\n\r\nE_TYPE_ACCESS_FUNCTION_DEF(default)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  E_IRTreeAndType result = {&e_irnode_nil};\r\n  switch(expr->kind)\r\n  {\r\n    default:{}break;\r\n    \r\n    //- rjf: member accessing (. operator)\r\n    case E_ExprKind_MemberAccess:\r\n    {\r\n      // rjf: unpack left/right expressions\r\n      E_Expr *exprl = expr->first;\r\n      E_Expr *exprr = exprl->next;\r\n      E_IRTreeAndType l = *lhs_irtree;\r\n      E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums);\r\n      E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype);\r\n      E_TypeKey check_type_key = l_restype;\r\n      E_TypeKind check_type_kind = l_restype_kind;\r\n      if(l_restype_kind == E_TypeKind_Ptr ||\r\n         l_restype_kind == E_TypeKind_LRef ||\r\n         l_restype_kind == E_TypeKind_RRef ||\r\n         l_restype_kind == E_TypeKind_Array)\r\n      {\r\n        check_type_key = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_All);\r\n        check_type_kind = e_type_kind_from_key(check_type_key);\r\n      }\r\n      e_msg_list_concat_in_place(&result.msgs, &l.msgs);\r\n      \r\n      // rjf: look up member\r\n      E_Member member = zero_struct;\r\n      B32 r_found = 0;\r\n      E_TypeKey r_type = zero_struct;\r\n      U64 r_value = 0;\r\n      String8 r_query_name = {0};\r\n      B32 r_is_constant_value = 0;\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        E_Member match = e_type_member_from_key_name__cached(check_type_key, exprr->string);\r\n        member = match;\r\n        if(match.kind != E_MemberKind_Null)\r\n        {\r\n          r_found = 1;\r\n          r_type = match.type_key;\r\n          r_value = match.off;\r\n        }\r\n        if(match.kind == E_MemberKind_Null)\r\n        {\r\n          E_Type *type = e_type_from_key(check_type_key);\r\n          String8 lookup_string = exprr->string;\r\n          String8 lookup_string_append_1 = push_str8f(scratch.arena, \"%S_%S\", type->name, lookup_string);\r\n          String8 lookup_string_append_2 = push_str8f(scratch.arena, \"%S%S\", type->name, lookup_string);\r\n          E_EnumVal enum_val = {0};\r\n          if(enum_val.name.size == 0) { enum_val = e_type_enum_val_from_key_name__cached(check_type_key, lookup_string); }\r\n          if(enum_val.name.size == 0) { enum_val = e_type_enum_val_from_key_name__cached(check_type_key, lookup_string_append_1); }\r\n          if(enum_val.name.size == 0) { enum_val = e_type_enum_val_from_key_name__cached(check_type_key, lookup_string_append_2); }\r\n          if(enum_val.name.size != 0)\r\n          {\r\n            r_found = 1;\r\n            r_type = check_type_key;\r\n            r_value = enum_val.val;\r\n            r_is_constant_value = 1;\r\n          }\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      // rjf: bad conditions? -> error if applicable, exit\r\n      if(exprr->kind != E_ExprKind_LeafIdentifier)\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->range, \"Expected member name.\");\r\n        break;\r\n      }\r\n      else if(!r_found)\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, \"Could not find a member named `%S`.\", exprr->string);\r\n        break;\r\n      }\r\n      else if(l.root == &e_irnode_nil ||\r\n              e_type_key_match(e_type_key_zero(), check_type_key))\r\n      {\r\n        break;\r\n      }\r\n      else if(check_type_kind != E_TypeKind_Struct &&\r\n              check_type_kind != E_TypeKind_Class &&\r\n              check_type_kind != E_TypeKind_Union &&\r\n              check_type_kind != E_TypeKind_Enum)\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->range, \"Cannot perform member access on this type.\");\r\n        break;\r\n      }\r\n      \r\n      // rjf: generate\r\n      {\r\n        // rjf: build tree\r\n        E_IRNode *new_tree = l.root;\r\n        E_TypeKey new_tree_type = r_type;\r\n        E_Mode mode = l.mode;\r\n        if(e_type_kind_is_pointer_or_ref(l_restype_kind))\r\n        {\r\n          new_tree = e_irtree_resolve_to_value(arena, l.mode, new_tree, l_restype);\r\n          if(l.mode != E_Mode_Null)\r\n          {\r\n            mode = E_Mode_Offset;\r\n          }\r\n        }\r\n        if(r_value != 0 && !r_is_constant_value)\r\n        {\r\n          E_IRNode *const_tree = e_irtree_const_u(arena, r_value);\r\n          new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, e_type_byte_size_from_key(new_tree_type), new_tree, const_tree);\r\n        }\r\n        else if(r_is_constant_value)\r\n        {\r\n          new_tree = e_irtree_const_u(arena, r_value);\r\n          mode = E_Mode_Value;\r\n        }\r\n        \r\n        // rjf: fill\r\n        result.root     = new_tree;\r\n        result.type_key = r_type;\r\n        result.mode     = mode;\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: indexing ([] operator)\r\n    case E_ExprKind_ArrayIndex:\r\n    {\r\n      // rjf: unpack left/right expressions\r\n      E_Expr *exprl = expr->first;\r\n      E_Expr *exprr = exprl->next;\r\n      E_IRTreeAndType l = *lhs_irtree;\r\n      E_IRTreeAndType r = e_push_irtree_and_type_from_expr(arena, overridden, &e_default_identifier_resolution_rule, 0, 1, exprr);\r\n      e_msg_list_concat_in_place(&result.msgs, &r.msgs);\r\n      E_TypeKey l_restype = e_type_key_unwrap(l.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n      E_TypeKey r_restype = e_type_key_unwrap(r.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n      E_TypeKind l_restype_kind = e_type_kind_from_key(l_restype);\r\n      E_TypeKind r_restype_kind = e_type_kind_from_key(r_restype);\r\n      E_TypeKey direct_type = e_type_key_unwrap(l_restype, E_TypeUnwrapFlag_All & ~(E_TypeUnwrapFlag_Enums|E_TypeUnwrapFlag_Aliases));\r\n      U64 direct_type_size = e_type_byte_size_from_key(direct_type);\r\n      \r\n      // rjf: bad conditions? -> error if applicable, exit\r\n      if(r.root->op == 0)\r\n      {\r\n        break;\r\n      }\r\n      else if(l_restype_kind != E_TypeKind_Ptr && l_restype_kind != E_TypeKind_Array && l_restype_kind != E_TypeKind_LRef && l_restype_kind != E_TypeKind_RRef)\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprl->range, \"Cannot index into this type.\");\r\n        break;\r\n      }\r\n      else if(!e_type_kind_is_integer(r_restype_kind))\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, \"Cannot index with this type.\");\r\n        break;\r\n      }\r\n      else if(l_restype_kind == E_TypeKind_Ptr && direct_type_size == 0)\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, \"Cannot index into pointers of zero-sized types.\");\r\n        break;\r\n      }\r\n      else if(l_restype_kind == E_TypeKind_Array && direct_type_size == 0)\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, exprr->range, \"Cannot index into arrays of zero-sized types.\");\r\n        break;\r\n      }\r\n      \r\n      // rjf: generate\r\n      E_IRNode *new_tree = &e_irnode_nil;\r\n      E_Mode mode = l.mode;\r\n      {\r\n        // rjf: reading from an array value -> read from stack value\r\n        if(l.mode == E_Mode_Value && l_restype_kind == E_TypeKind_Array)\r\n        {\r\n          // rjf: ops to compute the offset\r\n          E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype);\r\n          if(direct_type_size > 1)\r\n          {\r\n            E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size);\r\n            offset_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, 8, offset_tree, const_tree);\r\n          }\r\n          \r\n          // rjf: ops to push stack value, push offset, + read from stack value\r\n          new_tree = e_push_irnode(arena, RDI_EvalOp_ValueRead);\r\n          new_tree->value.u64 = direct_type_size;\r\n          e_irnode_push_child(new_tree, offset_tree);\r\n          e_irnode_push_child(new_tree, l.root);\r\n        }\r\n        \r\n        // rjf: all other cases -> read from base offset\r\n        else\r\n        {\r\n          // rjf: ops to compute the offset\r\n          E_IRNode *offset_tree = e_irtree_resolve_to_value(arena, r.mode, r.root, r_restype);\r\n          if(direct_type_size > 1)\r\n          {\r\n            E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size);\r\n            offset_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, 8, offset_tree, const_tree);\r\n          }\r\n          \r\n          // rjf: ops to compute the base offset (resolve to value if addr-of-pointer)\r\n          E_IRNode *base_tree = l.root;\r\n          if(e_type_kind_is_pointer_or_ref(l_restype_kind) && l.mode != E_Mode_Value)\r\n          {\r\n            base_tree = e_irtree_resolve_to_value(arena, l.mode, base_tree, l_restype);\r\n          }\r\n          \r\n          // rjf: ops to compute the final address\r\n          new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, 8, offset_tree, base_tree);\r\n          if(mode != E_Mode_Null)\r\n          {\r\n            mode = E_Mode_Offset;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: fill\r\n      result.root     = new_tree;\r\n      result.type_key = direct_type;\r\n      result.mode     = mode;\r\n    }break;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal E_IRTreeAndType\r\ne_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_IdentifierResolutionRule *identifier_resolution_rule, B32 disallow_autohooks, B32 disallow_chained_fastpaths, E_Expr *root_expr)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  E_TypeKeyList inherited_lenses = {0};\r\n  E_IRTreeAndType result = {&e_irnode_nil};\r\n  \r\n  //////////////////////////////\r\n  //- rjf: apply all ir-generation steps\r\n  //\r\n  typedef struct Task Task;\r\n  struct Task\r\n  {\r\n    Task *next;\r\n    E_Expr *expr;\r\n    E_AutoHookWildcardInst *first_wildcard_inst;\r\n    E_AutoHookWildcardInst *last_wildcard_inst;\r\n    E_IRTreeAndType *overridden;\r\n  };\r\n  Task start_task = {0, root_expr, 0};\r\n  Task *first_task = &start_task;\r\n  Task *last_task = first_task;\r\n  for(Task *t = first_task; t != 0; t = t->next)\r\n  {\r\n    E_Expr *expr = t->expr;\r\n    E_IRTreeAndType *parent = t->overridden ? t->overridden : root_parent;\r\n    \r\n    //- rjf: poison the expression we are about to use, so we don't recursively use it\r\n    e_expr_poison(expr);\r\n    \r\n    //- rjf: push stack elements\r\n    E_AutoHookWildcardInst *first_wildcard_inst_restore = e_cache->first_wildcard_inst;\r\n    E_AutoHookWildcardInst *last_wildcard_inst_restore = e_cache->last_wildcard_inst;\r\n    if(t->first_wildcard_inst) { e_cache->first_wildcard_inst = t->first_wildcard_inst; }\r\n    if(t->last_wildcard_inst) { e_cache->last_wildcard_inst = t->last_wildcard_inst; }\r\n    \r\n    //- rjf: do expr -> irtree generation for this expression\r\n    if(expr->kind == E_ExprKind_Ref)\r\n    {\r\n      expr = expr->ref;\r\n    }\r\n    E_ExprKind kind = expr->kind;\r\n    switch(kind)\r\n    {\r\n      default:{}break;\r\n      \r\n      //- rjf: member accesses & array indexing expressions\r\n      case E_ExprKind_MemberAccess:\r\n      case E_ExprKind_ArrayIndex:\r\n      {\r\n        // rjf: unpack left-hand-side\r\n        E_Expr *lhs = expr->first;\r\n        \r\n        // rjf: try left-hand-side, first *without* autohooks, then *with* autohooks.\r\n        for(B32 autohooks_enabled = 0; autohooks_enabled < 2; autohooks_enabled += 1)\r\n        {\r\n          E_IRTreeAndType lhs_irtree_try = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, !autohooks_enabled, 1, lhs);\r\n          for(E_IRTreeAndType *lhs_irtree_try_chain = &lhs_irtree_try; lhs_irtree_try_chain != 0; lhs_irtree_try_chain = lhs_irtree_try_chain->prev)\r\n          {\r\n            // rjf: pick access hook based on type\r\n            E_Type *lhs_type = e_type_from_key(lhs_irtree_try_chain->type_key);\r\n            E_TypeAccessFunctionType *lhs_access = lhs_type->access;\r\n            for(E_Type *lens_type = lhs_type;\r\n                lens_type->kind == E_TypeKind_Lens || lens_type->kind == E_TypeKind_Set;\r\n                lens_type = e_type_from_key(lens_type->direct_type_key))\r\n            {\r\n              if(lens_type->access != 0)\r\n              {\r\n                lhs_access = lens_type->access;\r\n                break;\r\n              }\r\n            }\r\n            if(lhs_access == 0)\r\n            {\r\n              lhs_access = E_TYPE_ACCESS_FUNCTION_NAME(default);\r\n            }\r\n            \r\n            // rjf: call into hook to do access\r\n            E_IRTreeAndType new_result_maybe = lhs_access(arena, parent, expr, lhs_irtree_try_chain);\r\n            \r\n            // rjf: if we got a valid result -> gather info from this irtree\r\n            if(new_result_maybe.root != &e_irnode_nil)\r\n            {\r\n              E_TypeKey k = lhs_irtree_try_chain->type_key;\r\n              E_TypeKind kind = e_type_kind_from_key(k);\r\n              for(;kind == E_TypeKind_Lens;)\r\n              {\r\n                E_Type *lens_type = e_type_from_key(k);\r\n                if((lens_type->flags & E_TypeFlag_InheritedByMembers && expr->kind == E_ExprKind_MemberAccess) ||\r\n                   (lens_type->flags & E_TypeFlag_InheritedByElements && expr->kind == E_ExprKind_ArrayIndex))\r\n                {\r\n                  e_type_key_list_push_front(scratch.arena, &inherited_lenses, k);\r\n                }\r\n                k = e_type_key_direct(k);\r\n                kind = e_type_kind_from_key(k);\r\n              }\r\n              e_msg_list_concat_in_place(&result.msgs, &lhs_irtree_try_chain->msgs);\r\n            }\r\n            \r\n            // rjf: if we got a valid result -> we're done\r\n            if(new_result_maybe.root != &e_irnode_nil)\r\n            {\r\n              result = new_result_maybe;\r\n              break;\r\n            }\r\n            else if(new_result_maybe.msgs.count != 0 && result.msgs.count == 0)\r\n            {\r\n              result = new_result_maybe;\r\n            }\r\n          }\r\n          if(result.root != &e_irnode_nil)\r\n          {\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: invalid generation, chain of member accesses all stemming from\r\n        // a single leaf identifier -> try to join as single string & resolve it\r\n        // that way\r\n        if(result.root == &e_irnode_nil)\r\n        {\r\n          B32 is_ident_chain = 1;\r\n          for(E_Expr *l = lhs; l != &e_expr_nil; l = l->first)\r\n          {\r\n            if(l->kind != E_ExprKind_MemberAccess && l->kind != E_ExprKind_LeafIdentifier)\r\n            {\r\n              is_ident_chain = 0;\r\n              break;\r\n            }\r\n          }\r\n          if(is_ident_chain)\r\n          {\r\n            String8List parts = {0};\r\n            str8_list_push_front(scratch.arena, &parts, lhs->next->string);\r\n            for(E_Expr *l = lhs; l != &e_expr_nil; l = l->first)\r\n            {\r\n              if(l->kind == E_ExprKind_LeafIdentifier)\r\n              {\r\n                str8_list_push_front(scratch.arena, &parts, l->string);\r\n              }\r\n              else if(l->kind == E_ExprKind_MemberAccess)\r\n              {\r\n                str8_list_push_front(scratch.arena, &parts, l->first->next->string);\r\n              }\r\n            }\r\n            String8 full_qualified_name = str8_list_join(scratch.arena, &parts, &(StringJoin){.sep = str8_lit(\".\")});\r\n            E_Expr *leaf_expr_name = e_push_expr(scratch.arena, E_ExprKind_LeafIdentifier, r1u64(0, 0));\r\n            leaf_expr_name->string = full_qualified_name;\r\n            E_IRTreeAndType new_result_maybe = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, disallow_autohooks, leaf_expr_name);\r\n            if(new_result_maybe.root != &e_irnode_nil)\r\n            {\r\n              result = new_result_maybe;\r\n            }\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: dereference\r\n      case E_ExprKind_Deref:\r\n      {\r\n        // rjf: unpack operand\r\n        E_Expr *r_expr = expr->first;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums);\r\n        E_TypeKind r_type_kind = e_type_kind_from_key(r_type);\r\n        E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All & ~E_TypeUnwrapFlag_Enums);\r\n        U64 r_type_direct_size = e_type_byte_size_from_key(r_type_direct);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(r_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(r_type_direct_size == 0 &&\r\n                (r_type_kind == E_TypeKind_Ptr ||\r\n                 r_type_kind == E_TypeKind_LRef ||\r\n                 r_type_kind == E_TypeKind_RRef))\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->range, \"Cannot dereference pointers of zero-sized types.\");\r\n          break;\r\n        }\r\n        else if(r_type_direct_size == 0 && r_type_kind == E_TypeKind_Array)\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->range, \"Cannot dereference arrays of zero-sized types.\");\r\n          break;\r\n        }\r\n        else if(r_type_kind != E_TypeKind_Array &&\r\n                r_type_kind != E_TypeKind_Ptr &&\r\n                r_type_kind != E_TypeKind_LRef &&\r\n                r_type_kind != E_TypeKind_RRef)\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, r_expr->range, \"Cannot dereference this type.\");\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        {\r\n          E_IRNode *new_tree = r_tree.root;\r\n          if(r_tree.mode != E_Mode_Value &&\r\n             (r_type_kind == E_TypeKind_Ptr ||\r\n              r_type_kind == E_TypeKind_LRef ||\r\n              r_type_kind == E_TypeKind_RRef))\r\n          {\r\n            new_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);\r\n          }\r\n          result.root     = new_tree;\r\n          result.type_key = r_type_direct;\r\n          result.mode     = E_Mode_Null;\r\n          if(r_tree.mode != E_Mode_Null)\r\n          {\r\n            result.mode = E_Mode_Offset;\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: address-of\r\n      case E_ExprKind_Address:\r\n      {\r\n        // rjf: unpack operand\r\n        E_Expr *r_expr = expr->first;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey r_type = r_tree.type_key;\r\n        E_TypeKey r_type_unwrapped = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_AllDecorative & (~E_TypeUnwrapFlag_Enums));\r\n        E_TypeKind r_type_unwrapped_kind = e_type_kind_from_key(r_type_unwrapped);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(r_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(e_type_key_match(e_type_key_zero(), r_type_unwrapped))\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        result.root     = r_tree.root;\r\n        result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, r_type_unwrapped, 1, 0);\r\n        result.mode     = E_Mode_Value;\r\n      }break;\r\n      \r\n      //- rjf: cast\r\n      case E_ExprKind_Cast:\r\n      {\r\n        // rjf: unpack operands\r\n        E_Expr *cast_type_expr = expr->first;\r\n        E_Expr *casted_expr = cast_type_expr->next;\r\n        E_IRTreeAndType cast_irtree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, cast_type_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &cast_irtree.msgs);\r\n        E_TypeKey cast_type = cast_irtree.type_key;\r\n        E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);\r\n        E_TypeKey cast_type_unwrapped = e_type_key_unwrap(cast_irtree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind cast_type_unwrapped_kind = e_type_kind_from_key(cast_type_unwrapped);\r\n        U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);\r\n        E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, casted_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs);\r\n        E_TypeKey casted_type = e_type_key_unwrap(casted_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind casted_type_kind = e_type_kind_from_key(casted_type);\r\n        E_TypeKey casted_type_unwrapped = e_type_key_unwrap(casted_type, E_TypeUnwrapFlag_Bitfields|E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind casted_type_unwrapped_kind = e_type_kind_from_key(casted_type_unwrapped);\r\n        U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type);\r\n        U8 in_group  = e_type_group_from_kind(casted_type_unwrapped_kind);\r\n        U8 out_group = e_type_group_from_kind(cast_type_unwrapped_kind);\r\n        RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(casted_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(cast_type_kind == E_TypeKind_Null)\r\n        {\r\n          break;\r\n        }\r\n        else if(conversion_rule != RDI_EvalConversionKind_Noop &&\r\n                conversion_rule != RDI_EvalConversionKind_Legal)\r\n        {\r\n          String8 text = str8_lit(\"Unknown cast conversion rule.\");\r\n          if(conversion_rule < RDI_EvalConversionKind_COUNT)\r\n          {\r\n            text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size);\r\n          }\r\n          e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, text);\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        {\r\n          E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type);\r\n          E_IRNode *new_tree = in_tree;\r\n          if(conversion_rule == RDI_EvalConversionKind_Legal)\r\n          {\r\n            new_tree = e_irtree_convert_lo(arena, in_tree, out_group, in_group);\r\n          }\r\n          if(cast_type_byte_size < casted_type_byte_size && e_type_kind_is_integer(cast_type_unwrapped_kind))\r\n          {\r\n            new_tree = e_irtree_trunc(arena, in_tree, cast_type);\r\n          }\r\n          if(e_type_kind_is_signed(cast_type_unwrapped_kind) && e_type_kind_is_integer(casted_type_unwrapped_kind) && !e_type_kind_is_signed(casted_type_unwrapped_kind))\r\n          {\r\n            new_tree = e_irtree_trunc(arena, in_tree, cast_type);\r\n          }\r\n          result.root     = new_tree;\r\n          result.type_key = cast_type;\r\n          result.mode     = E_Mode_Value;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: sizeof\r\n      case E_ExprKind_Sizeof:\r\n      {\r\n        // rjf: unpack operand\r\n        E_Expr *r_expr = expr->first;\r\n        E_TypeKey r_type = zero_struct;\r\n        E_Space space = r_expr->space;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, 1, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        r_type = r_tree.type_key;\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(e_type_key_match(r_type, e_type_key_zero()))\r\n        {\r\n          break;\r\n        }\r\n        else if(e_type_kind_from_key(r_type) == E_TypeKind_Null)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        {\r\n          U64 r_type_byte_size = e_type_byte_size_from_key(r_type);\r\n          result.root     = e_irtree_const_u(arena, r_type_byte_size);\r\n          result.type_key = e_type_key_basic(E_TypeKind_U64);\r\n          result.mode     = E_Mode_Value;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: typeof\r\n      case E_ExprKind_Typeof:\r\n      {\r\n        // rjf: evaluate operand tree\r\n        E_Expr *r_expr = expr->first;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, 1, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        \r\n        // rjf: find the first non-autohook result\r\n        E_TypeKey type_key = r_tree.type_key;\r\n        for(E_IRTreeAndType *t = &r_tree; t != 0; t = t->prev)\r\n        {\r\n          type_key = t->type_key;\r\n          if(t->auto_hook == 0)\r\n          {\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: fill output\r\n        result.root     = e_irtree_const_u(arena, 0);\r\n        result.type_key = type_key;\r\n        result.mode     = E_Mode_Null;\r\n      }break;\r\n      \r\n      //- rjf: symbolof\r\n      case E_ExprKind_Symbolof:\r\n      {\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, expr->first);\r\n        E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_tree.type_key);\r\n        E_OpList oplist = e_oplist_from_irtree(scratch.arena, r_value_tree);\r\n        String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\r\n        E_Interpretation interpretation = e_interpret(bytecode);\r\n        E_Module *module = &e_module_nil;\r\n        for EachIndex(idx, e_base_ctx->modules_count)\r\n        {\r\n          E_Module *m = &e_base_ctx->modules[idx];\r\n          if(e_space_match(interpretation.space, m->space) && contains_1u64(m->vaddr_range, interpretation.value.u64))\r\n          {\r\n            module = m;\r\n            break;\r\n          }\r\n        }\r\n        if(module != &e_module_nil)\r\n        {\r\n          E_DbgInfo *dbg_info = e_dbg_info_from_module(module);\r\n          U64 voff = interpretation.value.u64 - module->vaddr_range.min;\r\n          U64 new_vaddr = 0;\r\n          RDI_Procedure *p = rdi_procedure_from_voff(dbg_info->rdi, voff);\r\n          RDI_GlobalVariable *g = rdi_global_variable_from_voff(dbg_info->rdi, voff);\r\n          U32 type_idx = 0;\r\n          if(p->name_string_idx != 0)\r\n          {\r\n            type_idx = p->type_idx;\r\n            new_vaddr = module->vaddr_range.min + rdi_first_voff_from_procedure(dbg_info->rdi, p);\r\n          }\r\n          else if(g->name_string_idx != 0)\r\n          {\r\n            type_idx = g->type_idx;\r\n            new_vaddr = module->vaddr_range.min + g->voff;\r\n          }\r\n          if(type_idx != 0)\r\n          {\r\n            RDI_TypeNode *t = rdi_element_from_name_idx(dbg_info->rdi, TypeNodes, type_idx);\r\n            result.root = e_irtree_const_u(arena, new_vaddr);\r\n            result.mode = E_Mode_Value;\r\n            result.type_key = e_type_key_ext(e_type_kind_from_rdi(t->kind), type_idx, module->dbg_info_num);\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: byteswap\r\n      case E_ExprKind_ByteSwap:\r\n      {\r\n        // rjf: unpack operand\r\n        E_Expr *r_expr = expr->first;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind r_type_kind = e_type_kind_from_key(r_type);\r\n        U64 r_type_size = e_type_byte_size_from_key(r_type);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(!e_type_kind_is_integer(r_type_kind) || (r_type_size != 8 && r_type_size != 4 && r_type_size != 2))\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Byteswapping this type is not supported.\");\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        {\r\n          E_IRNode *node = e_push_irnode(arena, RDI_EvalOp_ByteSwap);\r\n          E_IRNode *rhs = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);\r\n          e_irnode_push_child(node, rhs);\r\n          node->value.u64 = r_type_size;\r\n          result.root = node;\r\n          result.mode = E_Mode_Value;\r\n          result.type_key = r_type;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: unary operations\r\n      case E_ExprKind_Pos:\r\n      {\r\n        result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, expr->first);\r\n      }break;\r\n      case E_ExprKind_Neg:\r\n      case E_ExprKind_BitNot:\r\n      {\r\n        // rjf: unpack operand\r\n        E_Expr *r_expr = expr->first;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind r_type_kind = e_type_kind_from_key(r_type);\r\n        RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);\r\n        E_TypeKey r_type_promoted = e_type_key_promote(r_type);\r\n        RDI_EvalOp op = e_opcode_from_expr_kind(kind);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(r_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(!rdi_eval_op_typegroup_are_compatible(op, r_type_group))\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Cannot use this operator on this type.\");\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        {\r\n          E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);\r\n          in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type);\r\n          E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree);\r\n          result.root     = new_tree;\r\n          result.type_key = r_type_promoted;\r\n          result.mode     = E_Mode_Value;\r\n        }\r\n      }break;\r\n      case E_ExprKind_LogNot:\r\n      {\r\n        // rjf: unpack operand\r\n        E_Expr *r_expr = expr->first;\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind r_type_kind = e_type_kind_from_key(r_type);\r\n        RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);\r\n        E_TypeKey r_type_promoted = e_type_key_basic(E_TypeKind_Bool);\r\n        RDI_EvalOp op = e_opcode_from_expr_kind(kind);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(r_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(!rdi_eval_op_typegroup_are_compatible(op, r_type_group))\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Cannot use this operator on this type.\");\r\n          break;\r\n        }\r\n        \r\n        // rjf: generate\r\n        {\r\n          E_IRNode *in_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);\r\n          in_tree = e_irtree_convert_hi(arena, in_tree, r_type_promoted, r_type);\r\n          E_IRNode *new_tree = e_irtree_unary_op(arena, op, r_type_group, in_tree);\r\n          result.root     = new_tree;\r\n          result.type_key = r_type_promoted;\r\n          result.mode     = E_Mode_Value;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: binary operations\r\n      case E_ExprKind_Mul:\r\n      case E_ExprKind_Div:\r\n      case E_ExprKind_Mod:\r\n      case E_ExprKind_Add:\r\n      case E_ExprKind_Sub:\r\n      case E_ExprKind_LShift:\r\n      case E_ExprKind_RShift:\r\n      case E_ExprKind_Less:\r\n      case E_ExprKind_LsEq:\r\n      case E_ExprKind_Grtr:\r\n      case E_ExprKind_GrEq:\r\n      case E_ExprKind_EqEq:\r\n      case E_ExprKind_NtEq:\r\n      case E_ExprKind_BitAnd:\r\n      case E_ExprKind_BitXor:\r\n      case E_ExprKind_BitOr:\r\n      case E_ExprKind_LogAnd:\r\n      case E_ExprKind_LogOr:\r\n      {\r\n        // rjf: unpack operands\r\n        RDI_EvalOp op = e_opcode_from_expr_kind(kind);\r\n        B32 is_comparison = e_expr_kind_is_comparison(kind);\r\n        E_Expr *l_expr = expr->first;\r\n        E_Expr *r_expr = l_expr->next;\r\n        E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, l_expr);\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind l_type_kind = e_type_kind_from_key(l_type);\r\n        E_TypeKind r_type_kind = e_type_kind_from_key(r_type);\r\n        U64 l_type_size = e_type_byte_size_from_key(l_type);\r\n        U64 r_type_size = e_type_byte_size_from_key(r_type);\r\n        U64 op_operand_size = Max(l_type_size, r_type_size);\r\n        \r\n        // rjf: resolve complex types to simple arithmetic tyeps\r\n        if(l_type_kind == E_TypeKind_Bitfield)\r\n        {\r\n          l_tree.root = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_tree.type_key);\r\n          l_type = e_type_key_unwrap(e_type_key_direct(l_tree.type_key), E_TypeUnwrapFlag_AllDecorative);\r\n          l_type_kind = e_type_kind_from_key(r_type);\r\n          l_tree.mode = E_Mode_Value;\r\n        }\r\n        if(r_type_kind == E_TypeKind_Bitfield)\r\n        {\r\n          r_tree.root = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_tree.type_key);\r\n          r_type = e_type_key_unwrap(e_type_key_direct(r_tree.type_key), E_TypeUnwrapFlag_AllDecorative);\r\n          r_type_kind = e_type_kind_from_key(r_type);\r\n          r_tree.mode = E_Mode_Value;\r\n        }\r\n        if(l_type.kind == E_TypeKeyKind_Reg)\r\n        {\r\n          l_type_kind = E_TypeKind_U64;\r\n          l_type = e_type_key_basic(l_type_kind);\r\n        }\r\n        if(r_type.kind == E_TypeKeyKind_Reg)\r\n        {\r\n          r_type_kind = E_TypeKind_U64;\r\n          r_type = e_type_key_basic(r_type_kind);\r\n        }\r\n        \r\n        // rjf: unpack info about resolved types\r\n        B32 l_is_pointer      = (l_type_kind == E_TypeKind_Ptr);\r\n        B32 l_is_decay        = (l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Offset);\r\n        B32 l_is_pointer_like = (l_is_pointer || l_is_decay);\r\n        B32 r_is_pointer      = (r_type_kind == E_TypeKind_Ptr);\r\n        B32 r_is_decay        = (r_type_kind == E_TypeKind_Array && r_tree.mode == E_Mode_Offset);\r\n        B32 r_is_pointer_like = (r_is_pointer || r_is_decay);\r\n        RDI_EvalTypeGroup l_type_group = e_type_group_from_kind(l_type_kind);\r\n        RDI_EvalTypeGroup r_type_group = e_type_group_from_kind(r_type_kind);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(l_tree.root->op == 0 || r_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: determine arithmetic path\r\n#define E_ArithPath_Normal          0\r\n#define E_ArithPath_PtrAdd          1\r\n#define E_ArithPath_PtrSub          2\r\n#define E_ArithPath_PtrArrayCompare 3\r\n#define E_ArithPath_TypeCompare     4\r\n        B32 ptr_arithmetic_mul_rptr = 0;\r\n        U32 arith_path = E_ArithPath_Normal;\r\n        if(kind == E_ExprKind_Add)\r\n        {\r\n          if(l_is_pointer_like && e_type_kind_is_integer(r_type_kind))\r\n          {\r\n            arith_path = E_ArithPath_PtrAdd;\r\n          }\r\n          if(l_is_pointer_like && e_type_kind_is_integer(l_type_kind))\r\n          {\r\n            arith_path = E_ArithPath_PtrAdd;\r\n            ptr_arithmetic_mul_rptr = 1;\r\n          }\r\n        }\r\n        else if(kind == E_ExprKind_Sub)\r\n        {\r\n          if(l_is_pointer_like && e_type_kind_is_integer(r_type_kind))\r\n          {\r\n            arith_path = E_ArithPath_PtrAdd;\r\n          }\r\n          if(l_is_pointer_like && r_is_pointer_like)\r\n          {\r\n            E_TypeKey l_type_direct = e_type_key_unwrap(l_type, E_TypeUnwrapFlag_All);\r\n            E_TypeKey r_type_direct = e_type_key_unwrap(r_type, E_TypeUnwrapFlag_All);\r\n            U64 l_type_direct_byte_size = e_type_byte_size_from_key(l_type_direct);\r\n            U64 r_type_direct_byte_size = e_type_byte_size_from_key(r_type_direct);\r\n            if(l_type_direct_byte_size == r_type_direct_byte_size)\r\n            {\r\n              arith_path = E_ArithPath_PtrSub;\r\n            }\r\n          }\r\n        }\r\n        else if(kind == E_ExprKind_EqEq || kind == E_ExprKind_NtEq)\r\n        {\r\n          if(l_type_kind == E_TypeKind_Array && (r_type_kind == E_TypeKind_Ptr || r_is_decay))\r\n          {\r\n            arith_path = E_ArithPath_PtrArrayCompare;\r\n          }\r\n          if(r_type_kind == E_TypeKind_Array && (l_type_kind == E_TypeKind_Ptr || l_is_decay))\r\n          {\r\n            arith_path = E_ArithPath_PtrArrayCompare;\r\n          }\r\n          if(l_tree.mode == E_Mode_Null && r_tree.mode == E_Mode_Null)\r\n          {\r\n            arith_path = E_ArithPath_TypeCompare;\r\n          }\r\n        }\r\n        \r\n        // rjf: generate according to arithmetic path\r\n        switch(arith_path)\r\n        {\r\n          //- rjf: normal arithmetic\r\n          case E_ArithPath_Normal:\r\n          {\r\n            // rjf: bad conditions? -> error if applicable, exit\r\n            if(!rdi_eval_op_typegroup_are_compatible(op, l_type_group) ||\r\n               !rdi_eval_op_typegroup_are_compatible(op, r_type_group))\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Cannot use this operator on this type.\");\r\n              break;\r\n            }\r\n            \r\n            // rjf: generate\r\n            {\r\n              E_TypeKey final_type_key = is_comparison ? e_type_key_basic(E_TypeKind_Bool) : l_type;\r\n              E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type);\r\n              E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);\r\n              l_value_tree = e_irtree_convert_hi(arena, l_value_tree, l_type, l_type);\r\n              r_value_tree = e_irtree_convert_hi(arena, r_value_tree, l_type, r_type);\r\n              E_IRNode *new_tree = e_irtree_binary_op(arena, op, l_type_group, op_operand_size, l_value_tree, r_value_tree);\r\n              result.root     = new_tree;\r\n              result.type_key = final_type_key;\r\n              result.mode     = E_Mode_Value;\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: pointer addition\r\n          case E_ArithPath_PtrAdd:\r\n          {\r\n            // rjf: map l/r to ptr/int\r\n            E_IRTreeAndType *ptr_tree = &l_tree;\r\n            E_IRTreeAndType *int_tree = &r_tree;\r\n            U64 ptr_size = l_type_size;\r\n            B32 ptr_is_decay = l_is_decay;\r\n            if(ptr_arithmetic_mul_rptr)\r\n            {\r\n              ptr_tree = &r_tree;\r\n              ptr_size = r_type_size;\r\n              int_tree = &l_tree;\r\n              ptr_is_decay = r_is_decay;\r\n            }\r\n            \r\n            // rjf: unpack type\r\n            E_TypeKey direct_type = e_type_key_unwrap(ptr_tree->type_key, E_TypeUnwrapFlag_All);\r\n            U64 direct_type_size = e_type_byte_size_from_key(direct_type);\r\n            \r\n            // rjf: generate\r\n            {\r\n              E_IRNode *ptr_root = ptr_tree->root;\r\n              if(!ptr_is_decay)\r\n              {\r\n                ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_root, ptr_tree->type_key);\r\n              }\r\n              E_IRNode *int_root = int_tree->root;\r\n              int_root = e_irtree_resolve_to_value(arena, int_tree->mode, int_root, int_tree->type_key);\r\n              if(direct_type_size > 1)\r\n              {\r\n                E_IRNode *const_root = e_irtree_const_u(arena, direct_type_size);\r\n                int_root = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, ptr_size, int_root, const_root);\r\n              }\r\n              E_TypeKey ptr_type = ptr_tree->type_key;\r\n              if(ptr_is_decay)\r\n              {\r\n                ptr_type = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type, 1, 0);\r\n              }\r\n              E_IRNode *new_root = e_irtree_binary_op_u(arena, op, ptr_size, ptr_root, int_root);\r\n              result.root     = new_root;\r\n              result.type_key = ptr_type;\r\n              result.mode     = E_Mode_Value;\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: pointer subtraction\r\n          case E_ArithPath_PtrSub:\r\n          {\r\n            // rjf: unpack type\r\n            E_TypeKey direct_type = e_type_key_unwrap(l_type, E_TypeUnwrapFlag_All);\r\n            U64 direct_type_size = e_type_byte_size_from_key(direct_type);\r\n            \r\n            // rjf: generate\r\n            E_IRNode *l_root = l_tree.root;\r\n            E_IRNode *r_root = r_tree.root;\r\n            if(!l_is_decay)\r\n            {\r\n              l_root = e_irtree_resolve_to_value(arena, l_tree.mode, l_root, l_type);\r\n            }\r\n            if(!r_is_decay)\r\n            {\r\n              r_root = e_irtree_resolve_to_value(arena, r_tree.mode, r_root, r_type);\r\n            }\r\n            E_IRNode *op_tree = e_irtree_binary_op_u(arena, op, l_type_size, l_root, r_root);\r\n            E_IRNode *new_tree = op_tree;\r\n            if(direct_type_size > 1)\r\n            {\r\n              E_IRNode *const_tree = e_irtree_const_u(arena, direct_type_size);\r\n              new_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Div, l_type_size, new_tree, const_tree);\r\n            }\r\n            result.root     = new_tree;\r\n            result.type_key = e_type_key_basic(E_TypeKind_U64);\r\n            result.mode     = E_Mode_Value;\r\n          }break;\r\n          \r\n          //- rjf: pointer array comparison\r\n          case E_ArithPath_PtrArrayCompare:\r\n          {\r\n            // rjf: map l/r to pointer/array\r\n            B32 ptr_is_decay = l_is_decay;\r\n            E_IRTreeAndType *ptr_tree = &l_tree;\r\n            E_IRTreeAndType *arr_tree = &r_tree;\r\n            U64 ptr_size = l_type_size;\r\n            if(l_type_kind == E_TypeKind_Array && l_tree.mode == E_Mode_Value)\r\n            {\r\n              ptr_is_decay = r_is_decay;\r\n              ptr_tree = &r_tree;\r\n              arr_tree = &l_tree;\r\n              ptr_size = r_type_size;\r\n            }\r\n            \r\n            // rjf: resolve pointer to value, sized same as array\r\n            E_IRNode *ptr_root = ptr_tree->root;\r\n            E_IRNode *arr_root = arr_tree->root;\r\n            if(!ptr_is_decay)\r\n            {\r\n              ptr_root = e_irtree_resolve_to_value(arena, ptr_tree->mode, ptr_tree->root, ptr_tree->type_key);\r\n            }\r\n            \r\n            // rjf: read from pointer into value, to compare with array\r\n            E_IRNode *mem_root = e_irtree_mem_read_type(arena, ptr_root, arr_tree->type_key);\r\n            \r\n            // rjf: generate\r\n            result.root     = e_irtree_binary_op(arena, op, RDI_EvalTypeGroup_Other, ptr_size, mem_root, arr_root);\r\n            result.type_key = e_type_key_basic(E_TypeKind_Bool);\r\n            result.mode     = E_Mode_Value;\r\n          }break;\r\n          \r\n          //- rjf: type comparison\r\n          case E_ArithPath_TypeCompare:\r\n          {\r\n            result.root     = e_irtree_const_u(arena, !!e_type_match(l_type, r_type));\r\n            result.type_key = e_type_key_basic(E_TypeKind_Bool);\r\n            result.mode     = E_Mode_Value;\r\n          }break;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: ternary operators\r\n      case E_ExprKind_Ternary:\r\n      {\r\n        // rjf: unpack operands\r\n        E_Expr *c_expr = expr->first;\r\n        E_Expr *l_expr = c_expr->next;\r\n        E_Expr *r_expr = l_expr->next;\r\n        E_IRTreeAndType c_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, c_expr);\r\n        E_IRTreeAndType l_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, l_expr);\r\n        E_IRTreeAndType r_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, r_expr);\r\n        e_msg_list_concat_in_place(&result.msgs, &c_tree.msgs);\r\n        e_msg_list_concat_in_place(&result.msgs, &l_tree.msgs);\r\n        e_msg_list_concat_in_place(&result.msgs, &r_tree.msgs);\r\n        E_TypeKey c_type = e_type_key_unwrap(c_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKey l_type = e_type_key_unwrap(l_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKey r_type = e_type_key_unwrap(r_tree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind c_type_kind = e_type_kind_from_key(c_type);\r\n        E_TypeKind l_type_kind = e_type_kind_from_key(l_type);\r\n        E_TypeKind r_type_kind = e_type_kind_from_key(r_type);\r\n        \r\n        // rjf: bad conditions? -> error if applicable, exit\r\n        if(c_tree.root->op == 0 || l_tree.root->op == 0 || r_tree.root->op == 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(!e_type_kind_is_integer(c_type_kind) && c_type_kind != E_TypeKind_Bool)\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Conditional term must be an integer or boolean type.\");\r\n        }\r\n        \r\n        // rjf: determine the resultant type - if the left/right types match, then we\r\n        // can just pick the left type, and defer 100% of our interpretation. however,\r\n        // if the types do *not* match, then we need to pre-emptively evaluate the\r\n        // condition, and pick the result based on that.\r\n        B32 ternary_is_dynamic = 0;\r\n        E_TypeKey result_type = l_type;\r\n        if(!e_type_match(l_type, r_type))\r\n        {\r\n          ternary_is_dynamic = 1;\r\n        }\r\n        \r\n        // rjf: generate dynamic ternary\r\n        if(ternary_is_dynamic)\r\n        {\r\n          E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.mode, c_tree.root, c_type);\r\n          E_OpList oplist = e_oplist_from_irtree(scratch.arena, c_value_tree);\r\n          String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\r\n          E_Interpretation interpretation = e_interpret(bytecode);\r\n          if(interpretation.value.u64 != 0)\r\n          {\r\n            result = l_tree;\r\n          }\r\n          else\r\n          {\r\n            result = r_tree;\r\n          }\r\n        }\r\n        \r\n        // rjf: generate static ternary\r\n        else\r\n        {\r\n          E_IRNode *c_value_tree = e_irtree_resolve_to_value(arena, c_tree.mode, c_tree.root, c_type);\r\n          E_IRNode *l_value_tree = e_irtree_resolve_to_value(arena, l_tree.mode, l_tree.root, l_type);\r\n          E_IRNode *r_value_tree = e_irtree_resolve_to_value(arena, r_tree.mode, r_tree.root, r_type);\r\n          l_value_tree = e_irtree_convert_hi(arena, l_value_tree, result_type, l_type);\r\n          r_value_tree = e_irtree_convert_hi(arena, r_value_tree, result_type, r_type);\r\n          E_IRNode *new_tree = e_irtree_conditional(arena, c_value_tree, l_value_tree, r_value_tree);\r\n          result.root     = new_tree;\r\n          result.type_key = result_type;\r\n          result.mode     = E_Mode_Value;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: call\r\n      case E_ExprKind_Call:\r\n      {\r\n        B32 strip_lenses = 0;\r\n        E_Expr *lhs = expr->first;\r\n        E_IRTreeAndType lhs_irtree = e_push_irtree_and_type_from_expr(arena, parent, &e_callable_identifier_resolution_rule, disallow_autohooks, 1, lhs);\r\n        e_msg_list_concat_in_place(&result.msgs, &lhs_irtree.msgs);\r\n        E_TypeKey lhs_type_key = lhs_irtree.type_key;\r\n        E_Type *lhs_type = e_type_from_key(lhs_type_key);\r\n        \r\n        // rjf: calling a type? -> treat as a cast of that type\r\n        if(lhs_irtree.mode == E_Mode_Null && lhs_type != &e_type_nil && lhs_type->kind != E_TypeKind_Lens && lhs_type->kind != E_TypeKind_LensSpec)\r\n        {\r\n          E_IRTreeAndType casted_tree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, expr->first->next);\r\n          e_msg_list_concat_in_place(&result.msgs, &casted_tree.msgs);\r\n          E_TypeKey cast_type = lhs_irtree.type_key;\r\n          E_TypeKind cast_type_kind = e_type_kind_from_key(cast_type);\r\n          E_TypeKey cast_type_unwrapped = e_type_key_unwrap(lhs_irtree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n          E_TypeKind cast_type_unwrapped_kind = e_type_kind_from_key(cast_type_unwrapped);\r\n          U64 cast_type_byte_size = e_type_byte_size_from_key(cast_type);\r\n          E_TypeKey casted_type = casted_tree.type_key;\r\n          E_TypeKey casted_type_unwrapped = e_type_key_unwrap(casted_type, E_TypeUnwrapFlag_Bitfields|E_TypeUnwrapFlag_AllDecorative);\r\n          E_TypeKind casted_type_unwrapped_kind = e_type_kind_from_key(casted_type_unwrapped);\r\n          U64 casted_type_byte_size = e_type_byte_size_from_key(casted_type);\r\n          U8 in_group  = e_type_group_from_kind(casted_type_unwrapped_kind);\r\n          U8 out_group = e_type_group_from_kind(cast_type_unwrapped_kind);\r\n          RDI_EvalConversionKind conversion_rule = rdi_eval_conversion_kind_from_typegroups(in_group, out_group);\r\n          \r\n          // rjf: bad conditions? -> error if applicable, exit\r\n          if(casted_tree.root->op == 0)\r\n          {\r\n            break;\r\n          }\r\n          else if(cast_type_kind == E_TypeKind_Null)\r\n          {\r\n            break;\r\n          }\r\n          else if(conversion_rule != RDI_EvalConversionKind_Noop &&\r\n                  conversion_rule != RDI_EvalConversionKind_Legal)\r\n          {\r\n            String8 text = str8_lit(\"Unknown cast conversion rule.\");\r\n            if(conversion_rule < RDI_EvalConversionKind_COUNT)\r\n            {\r\n              text.str = rdi_explanation_string_from_eval_conversion_kind(conversion_rule, &text.size);\r\n            }\r\n            e_msg(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, text);\r\n            break;\r\n          }\r\n          \r\n          // rjf: generate\r\n          {\r\n            E_IRNode *in_tree = e_irtree_resolve_to_value(arena, casted_tree.mode, casted_tree.root, casted_type);\r\n            E_IRNode *new_tree = in_tree;\r\n            if(conversion_rule == RDI_EvalConversionKind_Legal)\r\n            {\r\n              new_tree = e_irtree_convert_lo(arena, in_tree, out_group, in_group);\r\n            }\r\n            if(cast_type_byte_size < casted_type_byte_size && e_type_kind_is_integer(cast_type_unwrapped_kind))\r\n            {\r\n              new_tree = e_irtree_trunc(arena, in_tree, cast_type);\r\n            }\r\n            if(e_type_kind_is_signed(cast_type_unwrapped_kind) && e_type_kind_is_integer(casted_type_unwrapped_kind) && !e_type_kind_is_signed(casted_type_unwrapped_kind))\r\n            {\r\n              new_tree = e_irtree_trunc(arena, in_tree, cast_type);\r\n            }\r\n            result.root     = new_tree;\r\n            result.type_key = cast_type;\r\n            result.mode     = E_Mode_Value;\r\n          }\r\n        }\r\n        \r\n        // rjf: calling an unresolved leaf-identifier member access, and we can determine\r\n        // that that identifer maps to a type? -> generate a call expression with the\r\n        // left-hand-side of the dot operator as the first argument. this is a fast path\r\n        // which prevents paren nesting in simple cases, to easily chain multiple\r\n        // calls - for example, bin(2).digits(4)\r\n        else if(lhs->kind == E_ExprKind_MemberAccess && lhs->first->next != &e_expr_nil)\r\n        {\r\n          E_Expr *callee = e_expr_ref(arena, lhs->first->next);\r\n          E_Expr *first_arg = e_expr_ref(arena, lhs->first);\r\n          E_Expr *call = e_push_expr(arena, E_ExprKind_Call, r1u64(0, 0));\r\n          e_expr_push_child(call, callee);\r\n          e_expr_push_child(call, first_arg);\r\n          for(E_Expr *arg = lhs->next; arg != &e_expr_nil; arg = arg->next)\r\n          {\r\n            e_expr_push_child(call, e_expr_copy(arena, arg));\r\n          }\r\n          if(str8_match(callee->ref->string, str8_lit(\"raw\"), 0))\r\n          {\r\n            strip_lenses = 1;\r\n            disallow_autohooks = 1;\r\n          }\r\n          result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, call);\r\n          // NOTE(rjf): we do not want to accumulate messages from the original left-hand-side evaluation in this case, because\r\n          // this path only occurs if the member access fails specifically.\r\n        }\r\n        \r\n        // rjf: calling a lens? -> generate IR for the first argument; if enabled, wrap\r\n        // the type in a lens type, which preserves the name & arguments of the lens call\r\n        // expression\r\n        else if(lhs_type->kind == E_TypeKind_LensSpec)\r\n        {\r\n          // rjf: is \"raw\"? -> disable hooks\r\n          if(str8_match(lhs_type->name, str8_lit(\"raw\"), 0))\r\n          {\r\n            strip_lenses = 1;\r\n            disallow_autohooks = 1;\r\n          }\r\n          \r\n          // rjf: generate result via first argument to lens\r\n          result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, lhs->next);\r\n          \r\n          // rjf: if not raw, wrap resultant type with lens type\r\n          if(!strip_lenses)\r\n          {\r\n            Temp scratch = scratch_begin(&arena, 1);\r\n            \r\n            // rjf: count extra arguments\r\n            U64 arg_count = 0;\r\n            for(E_Expr *arg = lhs->next->next; arg != &e_expr_nil; arg = arg->next)\r\n            {\r\n              arg_count += 1;\r\n            }\r\n            \r\n            // rjf: flatten extra arguments\r\n            E_Expr **args = push_array(scratch.arena, E_Expr *, arg_count);\r\n            {\r\n              U64 idx = 0;\r\n              for(E_Expr *arg = lhs->next->next; arg != &e_expr_nil; arg = arg->next, idx += 1)\r\n              {\r\n                args[idx] = arg;\r\n              }\r\n            }\r\n            \r\n            // rjf: patch resultant type with a lens w/ args, pointing to the original type\r\n            {\r\n              result.type_key = e_type_key_cons(.kind       = E_TypeKind_Lens,\r\n                                                .flags      = lhs_type->flags,\r\n                                                .count      = arg_count,\r\n                                                .args       = args,\r\n                                                .direct_key = result.type_key,\r\n                                                .name       = lhs_type->name,\r\n                                                .irext      = lhs_type->irext,\r\n                                                .access     = lhs_type->access,\r\n                                                .expand     = lhs_type->expand);\r\n            }\r\n            scratch_end(scratch);\r\n          }\r\n        }\r\n        \r\n        // rjf: calling any other type? -> not valid\r\n        else\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_InterpretationError, expr->range, \"Calling this type is not supported.\");\r\n        }\r\n        \r\n        // rjf: strip overrides and lenses if needed\r\n        if(strip_lenses)\r\n        {\r\n          if(t->overridden)\r\n          {\r\n            E_MsgList existing_msgs = result.msgs;\r\n            for(E_IRTreeAndType *prev = t->overridden; prev != 0; prev = prev->prev)\r\n            {\r\n              result = *prev;\r\n            }\r\n            E_MsgList overridden_msgs = e_msg_list_copy(arena, &result.msgs);\r\n            result.msgs = existing_msgs;\r\n            e_msg_list_concat_in_place(&result.msgs, &overridden_msgs);\r\n          }\r\n          result.type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Lenses|E_TypeUnwrapFlag_Meta);\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: leaf bytecode\r\n      case E_ExprKind_LeafBytecode:\r\n      {\r\n        E_IRNode *new_tree = e_irtree_bytecode_no_copy(arena, expr->bytecode);\r\n        new_tree->space = expr->space;\r\n        E_TypeKey final_type_key = expr->type_key;\r\n        result.root     = new_tree;\r\n        result.type_key = final_type_key;\r\n        result.mode     = expr->mode;\r\n      }break;\r\n      \r\n      //- rjf: leaf string literal\r\n      case E_ExprKind_LeafStringLiteral:\r\n      {\r\n        String8 string = expr->string;\r\n        E_TypeKey type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_UChar8), string.size, 0);\r\n        E_IRNode *new_tree = e_irtree_string_literal(arena, string);\r\n        result.root     = new_tree;\r\n        result.type_key = type_key;\r\n        result.mode     = E_Mode_Value;\r\n      }break;\r\n      \r\n      //- rjf: leaf U64s\r\n      case E_ExprKind_LeafU64:\r\n      {\r\n        U64 val = expr->value.u64;\r\n        E_IRNode *new_tree = e_irtree_const_u(arena, val);\r\n        E_TypeKey type_key = zero_struct;\r\n        if(0){}\r\n        else if(val <= max_S32){type_key = e_type_key_basic(E_TypeKind_S32);}\r\n        else if(val <= max_S64){type_key = e_type_key_basic(E_TypeKind_S64);}\r\n        else                   {type_key = e_type_key_basic(E_TypeKind_U64);}\r\n        result.root     = new_tree;\r\n        result.type_key = type_key;\r\n        result.mode     = E_Mode_Value;\r\n      }break;\r\n      \r\n      //- rjf: leaf F64s\r\n      case E_ExprKind_LeafF64:\r\n      {\r\n        U64 val = expr->value.u64;\r\n        E_IRNode *new_tree = e_irtree_const_u(arena, val);\r\n        result.root     = new_tree;\r\n        result.type_key = e_type_key_basic(E_TypeKind_F64);\r\n        result.mode     = E_Mode_Value;\r\n      }break;\r\n      \r\n      //- rjf: leaf F32s\r\n      case E_ExprKind_LeafF32:\r\n      {\r\n        U32 val = expr->value.u32;\r\n        E_IRNode *new_tree = e_irtree_const_u(arena, val);\r\n        result.root     = new_tree;\r\n        result.type_key = e_type_key_basic(E_TypeKind_F32);\r\n        result.mode     = E_Mode_Value;\r\n      }break;\r\n      \r\n      //- rjf: leaf identifiers\r\n      case E_ExprKind_LeafIdentifier:\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        String8 qualifier = expr->qualifier;\r\n        String8 string = expr->string;\r\n        String8 string__redirected = string;\r\n        B32 string_mapped = 0;\r\n        B32 string_is_implicit_member_name = 0;\r\n        E_TypeKey mapped_type_key = zero_struct;\r\n        E_Module *mapped_location_block_module = &e_module_nil;\r\n        RDI_LocationBlock *mapped_location_block = 0;\r\n        E_Mode mapped_bytecode_mode = E_Mode_Offset;\r\n        E_Space mapped_bytecode_space = zero_struct;\r\n        String8 mapped_bytecode = {0};\r\n        void *mapped_user_data = 0;\r\n        B32 generated = 0;\r\n        \r\n        //- rjf: iterate identifier resolution rule paths, try to resolve\r\n        // identifier in that order.\r\n        for(U64 path_idx = 0; !generated && path_idx < identifier_resolution_rule->count; path_idx += 1)\r\n        {\r\n          //- rjf: try to map identifier via this path\r\n          E_IdentifierResolutionPath path = identifier_resolution_rule->paths[path_idx];\r\n          ProfScope(\"identifier resolution %i\", path) switch(path)\r\n          {\r\n            default:{}break;\r\n            \r\n            //- rjf: try to map name as a wildcard instance\r\n            case E_IdentifierResolutionPath_WildcardInst:\r\n            if(!generated && qualifier.size == 0 && !string_mapped && e_cache->first_wildcard_inst != 0)\r\n            {\r\n              for(E_AutoHookWildcardInst *inst = e_cache->first_wildcard_inst; inst != 0; inst = inst->next)\r\n              {\r\n                if(str8_match(inst->name, string, 0))\r\n                {\r\n                  generated = 1;\r\n                  result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, inst->inst_expr);\r\n                  break;\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: try to map name as parent expression signifier ('$')\r\n            case E_IdentifierResolutionPath_ParentExpr:\r\n            if(qualifier.size == 0 && !string_mapped && str8_match(string, str8_lit(\"$\"), 0) && parent != 0 && (parent->root != &e_irnode_nil || parent->msgs.first != 0))\r\n            {\r\n              E_IRTreeAndType *parent_irtree = parent;\r\n              {\r\n                for(E_IRTreeAndType *prev = parent_irtree; prev != 0; prev = prev->prev)\r\n                {\r\n                  parent_irtree = prev;\r\n                  if(prev->root != &e_irnode_nil)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              string_mapped = 1;\r\n              generated = 1;\r\n              disallow_autohooks = 1;\r\n              E_OpList oplist = e_oplist_from_irtree(scratch.arena, parent_irtree->root);\r\n              String8 bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n              result.root = e_irtree_bytecode_no_copy(arena, bytecode);\r\n              result.type_key = parent_irtree->type_key;\r\n              result.mode = parent_irtree->mode;\r\n              result.auto_hook = parent_irtree->auto_hook;\r\n              E_MsgList msgs = e_msg_list_copy(arena, &parent_irtree->msgs);\r\n              e_msg_list_concat_in_place(&result.msgs, &msgs);\r\n              result.prev = parent_irtree->prev;\r\n            }\r\n            break;\r\n            \r\n            //- rjf: try to map name as implicit access of overridden expression ('$.member_name', where the $. prefix is omitted)\r\n            case E_IdentifierResolutionPath_ParentExprMember:\r\n            if(qualifier.size == 0 && !string_mapped && parent != 0 && parent->root != &e_irnode_nil)\r\n            {\r\n              for(E_IRTreeAndType *prev = parent; prev != 0; prev = prev->prev)\r\n              {\r\n                E_Expr *access = e_expr_irext_member_access(scratch.arena, &e_expr_nil, prev, string);\r\n                E_IRTreeAndType access_parent = {&e_irnode_nil};\r\n                E_IRTreeAndType access_irtree = e_push_irtree_and_type_from_expr(scratch.arena, prev->prev ? prev->prev : &access_parent, &e_default_identifier_resolution_rule, 1, 1, access);\r\n                if(access_irtree.root != &e_irnode_nil)\r\n                {\r\n                  string_mapped = 1;\r\n                  E_OpList oplist = e_oplist_from_irtree(scratch.arena, access_irtree.root);\r\n                  mapped_type_key = access_irtree.type_key;\r\n                  mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                  mapped_bytecode_mode = access_irtree.mode;\r\n                  e_msg_list_concat_in_place(&result.msgs, &access_irtree.msgs);\r\n                  if(!prev->auto_hook)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: try to map name as member of `this` - if found, string__redirected := \"this\", and turn\r\n            // on later implicit-member-lookup generation\r\n            case E_IdentifierResolutionPath_ImplicitThisMember:\r\n            if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit(\"member\"), 0)))\r\n            {\r\n              E_Module *module = e_base_ctx->primary_module;\r\n              E_DbgInfo *dbg_info = e_dbg_info_from_module(module);\r\n              RDI_Parsed *rdi = dbg_info->rdi;\r\n              RDI_Procedure *procedure = e_cache->thread_ip_procedure;\r\n              RDI_UDT *udt = rdi_container_udt_from_procedure(rdi, procedure);\r\n              RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);\r\n              E_TypeKey container_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), udt->self_type_idx, module->dbg_info_num);\r\n              E_Member member = e_type_member_from_key_name__cached(container_type_key, string);\r\n              if(member.kind != E_MemberKind_Null)\r\n              {\r\n                string_is_implicit_member_name = 1;\r\n                string__redirected = str8_lit(\"this\");\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: try locals\r\n            case E_IdentifierResolutionPath_Local:\r\n            if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit(\"local\"), 0)))\r\n            {\r\n              E_Module *module = e_base_ctx->primary_module;\r\n              E_DbgInfo *dbg_info = e_dbg_info_from_module(module);\r\n              RDI_Parsed *rdi = dbg_info->rdi;\r\n              U64 local_num = e_num_from_string(e_ir_ctx->locals_map, string__redirected);\r\n              if(local_num != 0)\r\n              {\r\n                RDI_Local *local = rdi_element_from_name_idx(rdi, Locals, local_num-1);\r\n                \r\n                // rjf: extract local's type key\r\n                RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, local->type_idx);\r\n                mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), local->type_idx, module->dbg_info_num);\r\n                \r\n                // rjf: extract local's location block\r\n                B32 got_location_block = 0;\r\n                U64 ip_voff = e_base_ctx->thread_ip_voff;\r\n                for(U32 loc_block_idx = local->location_first;\r\n                    loc_block_idx < local->location_opl;\r\n                    loc_block_idx += 1)\r\n                {\r\n                  RDI_LocationBlock *block = rdi_element_from_name_idx(rdi, LocationBlocks, loc_block_idx);\r\n                  if(block->scope_off_first <= ip_voff && ip_voff < block->scope_off_opl)\r\n                  {\r\n                    mapped_location_block_module = module;\r\n                    mapped_location_block = block;\r\n                    got_location_block = 1;\r\n                  }\r\n                }\r\n                \r\n                // rjf: no location block -> error\r\n                if(!got_location_block)\r\n                {\r\n                  e_msgf(arena, &result.msgs, E_MsgKind_MissingInfo, expr->range, \"Could not find location info for `%S`.\", string__redirected);\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: built-in constants\r\n            case E_IdentifierResolutionPath_BuiltInConstants:\r\n            {\r\n              // rjf: \"true\"\r\n              if(!string_mapped && str8_match(string, str8_lit(\"true\"), 0))\r\n              {\r\n                string_mapped = 1;\r\n                E_OpList oplist = {0};\r\n                e_oplist_push_uconst(arena, &oplist, 1);\r\n                mapped_type_key = e_type_key_basic(E_TypeKind_Bool);\r\n                mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                mapped_bytecode_mode = E_Mode_Value;\r\n              }\r\n              \r\n              // rjf: \"false\"\r\n              if(!string_mapped && str8_match(string, str8_lit(\"false\"), 0))\r\n              {\r\n                string_mapped = 1;\r\n                E_OpList oplist = {0};\r\n                e_oplist_push_uconst(arena, &oplist, 0);\r\n                mapped_type_key = e_type_key_basic(E_TypeKind_Bool);\r\n                mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                mapped_bytecode_mode = E_Mode_Value;\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: built-in types\r\n            case E_IdentifierResolutionPath_BuiltInTypes:\r\n            {\r\n              mapped_type_key = e_leaf_builtin_type_key_from_name(string);\r\n              string_mapped = !e_type_key_match(mapped_type_key, e_type_key_zero());\r\n            }break;\r\n            \r\n            //- rjf: debug info matches\r\n            case E_IdentifierResolutionPath_DebugInfoMatch:\r\n            {\r\n              if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit(\"symbol\"), 0)))\r\n              {\r\n                Access *access = access_open();\r\n                \r\n                // rjf: find match\r\n                DI_Match match = di_match_from_string(string, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0);\r\n                if(match.idx == 0)\r\n                {\r\n                  String8List namespaceified_strings = {0};\r\n                  {\r\n                    E_Module *module = e_base_ctx->primary_module;\r\n                    E_DbgInfo *dbg_info = e_dbg_info_from_module(module);\r\n                    RDI_Parsed *rdi = dbg_info->rdi;\r\n                    RDI_Procedure *procedure = e_cache->thread_ip_procedure;\r\n                    U64 name_size = 0;\r\n                    U8 *name_ptr = rdi_string_from_idx(rdi, procedure->name_string_idx, &name_size);\r\n                    String8 containing_procedure_name = str8(name_ptr, name_size);\r\n                    U64 last_past_scope_resolution_pos = 0;\r\n                    for(;;)\r\n                    {\r\n                      U64 past_next_dbl_colon_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit(\"::\"), 0)+2;\r\n                      U64 past_next_dot_pos = str8_find_needle(containing_procedure_name, last_past_scope_resolution_pos, str8_lit(\".\"), 0)+1;\r\n                      U64 past_next_scope_resolution_pos = Min(past_next_dbl_colon_pos, past_next_dot_pos);\r\n                      if(past_next_scope_resolution_pos >= containing_procedure_name.size)\r\n                      {\r\n                        break;\r\n                      }\r\n                      String8 new_namespace_prefix_possibility = str8_prefix(containing_procedure_name, past_next_scope_resolution_pos);\r\n                      String8 namespaceified_string = push_str8f(scratch.arena, \"%S%S\", new_namespace_prefix_possibility, string);\r\n                      str8_list_push_front(scratch.arena, &namespaceified_strings, namespaceified_string);\r\n                      last_past_scope_resolution_pos = past_next_scope_resolution_pos;\r\n                    }\r\n                  }\r\n                  for(String8Node *n = namespaceified_strings.first; n != 0; n = n->next)\r\n                  {\r\n                    match = di_match_from_string(n->string, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0);\r\n                    if(match.idx != 0)\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: match -> RDI\r\n                RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0);\r\n                \r\n                // rjf: find dbg info from rdi\r\n                E_DbgInfo *dbg_info = &e_dbg_info_nil;\r\n                U32 dbg_info_num = 0;\r\n                for EachIndex(idx, e_base_ctx->dbg_infos_count)\r\n                {\r\n                  if(e_base_ctx->dbg_infos[idx].rdi == rdi)\r\n                  {\r\n                    dbg_info = &e_base_ctx->dbg_infos[idx];\r\n                    dbg_info_num = idx+1;\r\n                    break;\r\n                  }\r\n                }\r\n                \r\n                // rjf: find module from dbgi key\r\n                E_Module *module = &e_module_nil;\r\n                for EachIndex(idx, e_base_ctx->modules_count)\r\n                {\r\n                  if(e_base_ctx->modules[idx].dbg_info_num == dbg_info_num)\r\n                  {\r\n                    module = &e_base_ctx->modules[idx];\r\n                    if(module == e_base_ctx->primary_module || e_space_match(module->space, e_base_ctx->primary_module->space))\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: form result\r\n                if(match.idx != 0 && dbg_info != &e_dbg_info_nil)\r\n                {\r\n                  switch(match.section_kind)\r\n                  {\r\n                    default:{}break;\r\n                    case RDI_SectionKind_GlobalVariables:\r\n                    {\r\n                      RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, match.idx);\r\n                      U32 type_idx = global_var->type_idx;\r\n                      RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);\r\n                      E_OpList oplist = {0};\r\n                      e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + global_var->voff));\r\n                      string_mapped = 1;\r\n                      mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);\r\n                      mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                      mapped_bytecode_mode = E_Mode_Offset;\r\n                      mapped_bytecode_space = module->space;\r\n                    }break;\r\n                    case RDI_SectionKind_ThreadVariables:\r\n                    {\r\n                      RDI_ThreadVariable *thread_var = rdi_element_from_name_idx(rdi, ThreadVariables, match.idx);\r\n                      U32 type_idx = thread_var->type_idx;\r\n                      RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);\r\n                      E_OpList oplist = {0};\r\n                      e_oplist_push_op(arena, &oplist, RDI_EvalOp_TLSOff, e_value_u64(thread_var->tls_off));\r\n                      string_mapped = 1;\r\n                      mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);\r\n                      mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                      mapped_bytecode_mode = E_Mode_Offset;\r\n                      mapped_bytecode_space = module->space;\r\n                    }break;\r\n                    case RDI_SectionKind_Constants:\r\n                    {\r\n                      RDI_Constant *constant = rdi_element_from_name_idx(rdi, Constants, match.idx);\r\n                      U32 type_idx = constant->type_idx;\r\n                      RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);\r\n                      RDI_U32 constant_value_off = *rdi_element_from_name_idx(rdi, ConstantValueTable, constant->constant_value_idx);\r\n                      RDI_U32 constant_value_size = *rdi_element_from_name_idx(rdi, ConstantValueTable, constant->constant_value_idx+1) - constant_value_off;\r\n                      if(constant_value_size <= 8)\r\n                      {\r\n                        RDI_U64 constant_value_data_size = 0;\r\n                        RDI_U8 *constant_value_data = rdi_table_from_name(rdi, ConstantValueData, &constant_value_data_size);\r\n                        if(0 <= constant_value_off && constant_value_off + constant_value_size <= constant_value_data_size)\r\n                        {\r\n                          RDI_U64 value = 0;\r\n                          MemoryCopy(&value, constant_value_data+constant_value_off, constant_value_size);\r\n                          E_OpList oplist = {0};\r\n                          e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(value));\r\n                          string_mapped = 1;\r\n                          mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);\r\n                          mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                          mapped_bytecode_mode = E_Mode_Value;\r\n                          mapped_bytecode_space = module->space;\r\n                          break;\r\n                        }\r\n                      }\r\n                    }break;\r\n                    case RDI_SectionKind_Procedures:\r\n                    {\r\n                      RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, match.idx);\r\n                      RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx);\r\n                      U64 voff = *rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first);\r\n                      U32 type_idx = procedure->type_idx;\r\n                      RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);\r\n                      E_OpList oplist = {0};\r\n                      e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU64, e_value_u64(module->vaddr_range.min + voff));\r\n                      string_mapped = 1;\r\n                      mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);\r\n                      mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                      mapped_bytecode_mode = E_Mode_Value;\r\n                      mapped_bytecode_space = module->space;\r\n                    }break;\r\n                    case RDI_SectionKind_TypeNodes:\r\n                    {\r\n                      U32 type_idx = match.idx;\r\n                      RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);\r\n                      mapped_type_key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, dbg_info_num);\r\n                      string_mapped = 1;\r\n                    }break;\r\n                  }\r\n                }\r\n                access_close(access);\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: try registers\r\n            case E_IdentifierResolutionPath_Registers:\r\n            if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit(\"reg\"), 0)))\r\n            {\r\n              U64 reg_num = e_num_from_string(e_ir_ctx->regs_map, string);\r\n              if(reg_num != 0)\r\n              {\r\n                string_mapped = 1;\r\n                REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[reg_num];\r\n                E_OpList oplist = {0};\r\n                e_oplist_push_uconst(arena, &oplist, reg_rng.byte_off);\r\n                mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                mapped_bytecode_mode = E_Mode_Offset;\r\n                mapped_bytecode_space = e_base_ctx->thread_reg_space;\r\n                REGS_UsageKind reg_usage_kind = regs_reg_code_usage_kind_table_from_arch(e_base_ctx->primary_module->arch)[reg_num];\r\n                if(0){}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 1) {mapped_type_key = e_type_key_basic(E_TypeKind_U8);}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 2) {mapped_type_key = e_type_key_basic(E_TypeKind_U16);}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 4) {mapped_type_key = e_type_key_basic(E_TypeKind_U32);}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && reg_rng.byte_size == 8) {mapped_type_key = e_type_key_basic(E_TypeKind_U64);}\r\n                else\r\n                {\r\n                  mapped_type_key = e_type_key_reg(e_base_ctx->primary_module->arch, reg_num);\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: try register aliases\r\n            case E_IdentifierResolutionPath_RegisterAliases:\r\n            if(!string_mapped && (qualifier.size == 0 || str8_match(qualifier, str8_lit(\"reg\"), 0)))\r\n            {\r\n              U64 alias_num = e_num_from_string(e_ir_ctx->reg_alias_map, string);\r\n              if(alias_num != 0)\r\n              {\r\n                string_mapped = 1;\r\n                REGS_Slice alias_slice = regs_alias_code_slice_table_from_arch(e_base_ctx->primary_module->arch)[alias_num];\r\n                REGS_Rng alias_reg_rng = regs_reg_code_rng_table_from_arch(e_base_ctx->primary_module->arch)[alias_slice.code];\r\n                E_OpList oplist = {0};\r\n                e_oplist_push_uconst(arena, &oplist, alias_reg_rng.byte_off + alias_slice.byte_off);\r\n                mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                mapped_bytecode_mode = E_Mode_Offset;\r\n                mapped_bytecode_space = e_base_ctx->thread_reg_space;\r\n                REGS_UsageKind reg_usage_kind = regs_alias_code_usage_kind_table_from_arch(e_base_ctx->primary_module->arch)[alias_num];\r\n                if(0){}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 1) {mapped_type_key = e_type_key_basic(E_TypeKind_U8);}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 2) {mapped_type_key = e_type_key_basic(E_TypeKind_U16);}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 4) {mapped_type_key = e_type_key_basic(E_TypeKind_U32);}\r\n                else if(reg_usage_kind == REGS_UsageKind_Normal && alias_slice.byte_size == 8) {mapped_type_key = e_type_key_basic(E_TypeKind_U64);}\r\n                else\r\n                {\r\n                  mapped_type_key = e_type_key_reg_alias(e_base_ctx->primary_module->arch, alias_num);\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: try macros\r\n            case E_IdentifierResolutionPath_Macros:\r\n            {\r\n              if(!generated)\r\n              {\r\n                E_Expr *macro_expr = e_string2expr_map_lookup(e_ir_ctx->macro_map, string);\r\n                if(macro_expr != &e_expr_nil)\r\n                {\r\n                  generated = 1;\r\n                  e_string2expr_map_inc_poison(e_ir_ctx->macro_map, string);\r\n                  result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, macro_expr);\r\n                  e_string2expr_map_dec_poison(e_ir_ctx->macro_map, string);\r\n                }\r\n              }\r\n            }break;\r\n          }\r\n          \r\n          //- rjf: mapped to location block -> extract or produce bytecode for this mapping\r\n          if(!generated && mapped_location_block != 0)\r\n          {\r\n            E_Module *module = mapped_location_block_module;\r\n            E_DbgInfo *dbg_info = e_dbg_info_from_module(module);\r\n            E_Space space = module->space;\r\n            Arch arch = module->arch;\r\n            RDI_Parsed *rdi = dbg_info->rdi;\r\n            RDI_LocationBlock *block = mapped_location_block;\r\n            U64 all_location_data_size = 0;\r\n            U8 *all_location_data = rdi_table_from_name(rdi, LocationData, &all_location_data_size);\r\n            if(block->location_data_off + sizeof(RDI_LocationKind) <= all_location_data_size)\r\n            {\r\n              RDI_LocationKind loc_kind = *((RDI_LocationKind *)(all_location_data + block->location_data_off));\r\n              switch(loc_kind)\r\n              {\r\n                default:{}break;\r\n                case RDI_LocationKind_ValBytecodeStream: {mapped_bytecode_mode = E_Mode_Value;}goto bytecode_stream;\r\n                case RDI_LocationKind_AddrBytecodeStream:{mapped_bytecode_mode = E_Mode_Offset;}goto bytecode_stream;\r\n                bytecode_stream:;\r\n                {\r\n                  string_mapped = 1;\r\n                  U64 bytecode_size = 0;\r\n                  U64 off_first = block->location_data_off + sizeof(RDI_LocationKind);\r\n                  U64 off_opl = all_location_data_size;\r\n                  for(U64 off = off_first, next_off = off_opl;\r\n                      off < all_location_data_size;\r\n                      off = next_off)\r\n                  {\r\n                    next_off = off_opl;\r\n                    U8 op = all_location_data[off];\r\n                    if(op == 0)\r\n                    {\r\n                      break;\r\n                    }\r\n                    U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];\r\n                    U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\r\n                    bytecode_size += (1 + p_size);\r\n                    next_off = (off + 1 + p_size);\r\n                  }\r\n                  mapped_bytecode = str8(all_location_data + off_first, bytecode_size);\r\n                }break;\r\n                case RDI_LocationKind_AddrRegPlusU16:\r\n                if(block->location_data_off + sizeof(RDI_LocationRegPlusU16) <= all_location_data_size)\r\n                {\r\n                  string_mapped = 1;\r\n                  RDI_LocationRegPlusU16 loc = *(RDI_LocationRegPlusU16 *)(all_location_data + block->location_data_off);\r\n                  E_OpList oplist = {0};\r\n                  U64 byte_size = bit_size_from_arch(arch)/8;\r\n                  U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, 0);\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc.offset));\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));\r\n                  mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                  mapped_bytecode_mode = E_Mode_Offset;\r\n                  mapped_bytecode_space = space;\r\n                }break;\r\n                case RDI_LocationKind_AddrAddrRegPlusU16:\r\n                {\r\n                  string_mapped = 1;\r\n                  RDI_LocationRegPlusU16 loc = *(RDI_LocationRegPlusU16 *)(all_location_data + block->location_data_off);\r\n                  E_OpList oplist = {0};\r\n                  U64 byte_size = bit_size_from_arch(arch)/8;\r\n                  U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, 0);\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_ConstU16, e_value_u64(loc.offset));\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_Add, e_value_u64(0));\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_MemRead, e_value_u64(bit_size_from_arch(arch)/8));\r\n                  mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                  mapped_bytecode_mode = E_Mode_Offset;\r\n                  mapped_bytecode_space = space;\r\n                }break;\r\n                case RDI_LocationKind_ValReg:\r\n                if(block->location_data_off + sizeof(RDI_LocationReg) <= all_location_data_size)\r\n                {\r\n                  string_mapped = 1;\r\n                  RDI_LocationReg loc = *(RDI_LocationReg *)(all_location_data + block->location_data_off);\r\n                  REGS_RegCode regs_reg_code = regs_reg_code_from_arch_rdi_code(arch, loc.reg_code);\r\n                  REGS_Rng reg_rng = regs_reg_code_rng_table_from_arch(arch)[regs_reg_code];\r\n                  E_OpList oplist = {0};\r\n                  U64 byte_size = (U64)reg_rng.byte_size;\r\n                  U64 byte_pos = 0;\r\n                  U64 regread_param = RDI_EncodeRegReadParam(loc.reg_code, byte_size, byte_pos);\r\n                  e_oplist_push_op(arena, &oplist, RDI_EvalOp_RegRead, e_value_u64(regread_param));\r\n                  mapped_bytecode = e_bytecode_from_oplist(arena, &oplist);\r\n                  mapped_bytecode_mode = E_Mode_Value;\r\n                  mapped_bytecode_space = space;\r\n                }break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          //- rjf: generate IR trees for bytecode\r\n          if(!generated && mapped_bytecode.size != 0)\r\n          {\r\n            generated = 1;\r\n            E_IRNode *root = e_irtree_bytecode_no_copy(arena, mapped_bytecode);\r\n            root->space = mapped_bytecode_space;\r\n            result.root = root;\r\n            result.type_key = mapped_type_key;\r\n            result.mode = mapped_bytecode_mode;\r\n          }\r\n          \r\n          //- rjf: generate nil-IR trees w/ type for types\r\n          if(!generated && !e_type_key_match(e_type_key_zero(), mapped_type_key))\r\n          {\r\n            generated = 1;\r\n            result.root = e_irtree_const_u(arena, 0);\r\n            result.type_key = mapped_type_key;\r\n            result.mode = E_Mode_Null;\r\n          }\r\n        }\r\n        \r\n        //- rjf: extend generated result, if result was generated by an implicit member access\r\n        if(generated && string_is_implicit_member_name)\r\n        {\r\n          E_Expr *access = e_expr_irext_member_access(arena, &e_expr_nil, &result, string);\r\n          result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, access); \r\n        }\r\n        \r\n        //- rjf: error on failure-to-generate\r\n        if(!generated && !str8_match(string, str8_lit(\"$\"), 0))\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_ResolutionFailure, expr->range, \"`%S` could not be found.\", string);\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }break;\r\n      \r\n      //- rjf: leaf offsets\r\n      case E_ExprKind_LeafOffset:\r\n      {\r\n        E_IRNode *new_tree = e_push_irnode(arena, RDI_EvalOp_ConstU64);\r\n        new_tree->value = expr->value;\r\n        new_tree->space = expr->space;\r\n        result.root     = new_tree;\r\n        result.type_key = expr->type_key;\r\n        result.mode     = E_Mode_Offset;\r\n      }break;\r\n      \r\n      //- rjf: leaf values\r\n      case E_ExprKind_LeafValue:\r\n      {\r\n        E_IRNode *new_tree = e_push_irnode(arena, RDI_EvalOp_ConstU128);\r\n        new_tree->value = expr->value;\r\n        new_tree->space = expr->space;\r\n        result.root     = new_tree;\r\n        result.type_key = expr->type_key;\r\n        result.mode     = E_Mode_Value;\r\n      }break;\r\n      \r\n      //- rjf: leaf file paths\r\n      case E_ExprKind_LeafFilePath:\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        String8 file_path = expr->string;\r\n        FileProperties props = os_properties_from_file_path(file_path);\r\n        if(!str8_match(expr->qualifier, str8_lit(\"folder\"), 0) && !(props.flags & FilePropertyFlag_IsFolder) && file_path.size != 0)\r\n        {\r\n          E_Space space = e_space_make(E_SpaceKind_FileSystem);\r\n          result.root     = e_irtree_set_space(arena, space, e_irtree_const_u(arena, e_id_from_string(file_path)));\r\n          result.type_key = e_cache->file_type_key;\r\n          result.mode     = E_Mode_Value;\r\n        }\r\n        else\r\n        {\r\n          String8 folder_path = str8_chop_last_slash(file_path);\r\n          props = os_properties_from_file_path(folder_path);\r\n          if(props.flags & FilePropertyFlag_IsFolder || folder_path.size == 0 || str8_match(folder_path, str8_lit(\"/\"), StringMatchFlag_SlashInsensitive))\r\n          {\r\n            E_Space space = e_space_make(E_SpaceKind_FileSystem);\r\n            result.root     = e_irtree_set_space(arena, space, e_irtree_const_u(arena, e_id_from_string(folder_path)));\r\n            result.type_key = e_cache->folder_type_key;\r\n            result.mode     = E_Mode_Value;\r\n          }\r\n        }\r\n        scratch_end(scratch);\r\n      }break;\r\n      \r\n      //- rjf: types\r\n      case E_ExprKind_TypeIdent:\r\n      {\r\n        result.root = e_irtree_const_u(arena, 0);\r\n        result.root->space = expr->space;\r\n        result.type_key = expr->type_key;\r\n        result.mode = E_Mode_Null;\r\n      }break;\r\n      case E_ExprKind_Unsigned:\r\n      {\r\n        E_IRTreeAndType direct_irtree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, expr->first);\r\n        result = direct_irtree;\r\n        E_TypeKey direct_type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);\r\n        if(e_type_kind_is_signed(direct_type_kind))\r\n        {\r\n          E_TypeKind new_kind = direct_type_kind;\r\n          switch(direct_type_kind)\r\n          {\r\n            default:{}break;\r\n            case E_TypeKind_Char8: {new_kind = E_TypeKind_UChar8;}break;\r\n            case E_TypeKind_Char16:{new_kind = E_TypeKind_UChar16;}break;\r\n            case E_TypeKind_Char32:{new_kind = E_TypeKind_UChar32;}break;\r\n            case E_TypeKind_S8:{new_kind = E_TypeKind_U8;}break;\r\n            case E_TypeKind_S16:{new_kind = E_TypeKind_U16;}break;\r\n            case E_TypeKind_S32:{new_kind = E_TypeKind_U32;}break;\r\n            case E_TypeKind_S64:{new_kind = E_TypeKind_U64;}break;\r\n            case E_TypeKind_S128:{new_kind = E_TypeKind_U128;}break;\r\n            case E_TypeKind_S256:{new_kind = E_TypeKind_U256;}break;\r\n            case E_TypeKind_S512:{new_kind = E_TypeKind_U512;}break;\r\n          }\r\n          result.type_key = e_type_key_basic(new_kind);\r\n        }\r\n        else\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->first->range, \"Cannot apply an `unsigned` modifier to this type.\");\r\n        }\r\n      }break;\r\n      case E_ExprKind_Ptr:\r\n      {\r\n        E_IRTreeAndType ptee_irtree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, expr->first);\r\n        result = ptee_irtree;\r\n        result.type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, result.type_key, 1, 0);\r\n      }break;\r\n      case E_ExprKind_Array:\r\n      {\r\n        E_IRTreeAndType element_irtree = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, expr->first);\r\n        result = element_irtree;\r\n        result.type_key = e_type_key_cons_array(result.type_key, expr->value.u64, 0);\r\n      }break;\r\n      case E_ExprKind_Func:\r\n      {\r\n        e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Function type expressions are currently not supported.\");\r\n      }break;\r\n      \r\n      //- rjf: definitions\r\n      case E_ExprKind_Define:\r\n      {\r\n        E_Expr *lhs = expr->first;\r\n        E_Expr *rhs = lhs->next;\r\n        result = e_push_irtree_and_type_from_expr(arena, parent, &e_default_identifier_resolution_rule, disallow_autohooks, 1, rhs);\r\n        if(lhs->kind != E_ExprKind_LeafIdentifier)\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, expr->range, \"Left side of assignment must be an unused identifier.\");\r\n        }\r\n      }break;\r\n    }\r\n    \r\n    //- rjf: check chained expressions for simple wrappers\r\n    if(!disallow_chained_fastpaths)\r\n    {\r\n      local_persist struct\r\n      {\r\n        String8 shorthand;\r\n        String8 full_name;\r\n      }\r\n      shorthand_lens_pair_table[] =\r\n      {\r\n        {str8_lit_comp(\"x\"), str8_lit_comp(\"hex\")},\r\n        {str8_lit_comp(\"b\"), str8_lit_comp(\"bin\")},\r\n        {str8_lit_comp(\"o\"), str8_lit_comp(\"oct\")},\r\n        {str8_lit_comp(\"d\"), str8_lit_comp(\"dec\")},\r\n      };\r\n      E_Expr *first_chained = expr->next;\r\n      for(E_Expr *chained_expr = first_chained;\r\n          chained_expr != &e_expr_nil;\r\n          chained_expr = chained_expr->next)\r\n      {\r\n        B32 matches_shorthand = 0;\r\n        if(chained_expr->kind == E_ExprKind_LeafIdentifier)\r\n        {\r\n          for EachElement(shorthand_idx, shorthand_lens_pair_table)\r\n          {\r\n            if(str8_match(chained_expr->string, shorthand_lens_pair_table[shorthand_idx].shorthand, 0))\r\n            {\r\n              String8 full_name = shorthand_lens_pair_table[shorthand_idx].full_name;\r\n              result.type_key = e_type_key_cons(.kind       = E_TypeKind_Lens,\r\n                                                .direct_key = result.type_key,\r\n                                                .name       = full_name);\r\n              matches_shorthand = 1;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        if(!matches_shorthand)\r\n        {\r\n          E_TypeKind type_kind = e_type_kind_from_key(e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_AllDecorative));\r\n          if(e_type_kind_is_pointer_or_ref(type_kind) ||\r\n             type_kind == E_TypeKind_Array)\r\n          {\r\n            E_Expr *lens_spec_expr = e_string2expr_map_lookup(e_ir_ctx->macro_map, str8_lit(\"array\"));\r\n            E_TypeKey lens_spec_type_key = lens_spec_expr->type_key;\r\n            E_Type *lens_spec_type = e_type_from_key(lens_spec_type_key);\r\n            result.type_key = e_type_key_cons(.kind       = E_TypeKind_Lens,\r\n                                              .flags      = lens_spec_type->flags,\r\n                                              .count      = 1,\r\n                                              .args       = &chained_expr,\r\n                                              .direct_key = result.type_key,\r\n                                              .name       = lens_spec_type->name,\r\n                                              .irext      = lens_spec_type->irext,\r\n                                              .access     = lens_spec_type->access,\r\n                                              .expand     = lens_spec_type->expand);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: if the evaluated type has a hook for an extra layer of ir extension,\r\n    // call into it\r\n    E_Type *type = e_type_from_key(result.type_key);\r\n    {\r\n      E_TypeIRExtFunctionType *irext = type->irext;\r\n      for(E_Type *t = type; t->kind == E_TypeKind_Lens || t->kind == E_TypeKind_Set; t = e_type_from_key(t->direct_type_key))\r\n      {\r\n        if(t->irext != 0)\r\n        {\r\n          irext = t->irext;\r\n          break;\r\n        }\r\n      }\r\n      if(irext != 0 && result.user_data == 0)\r\n      {\r\n        E_IRExt ext = irext(arena, expr, &result);\r\n        result.user_data = ext.user_data;\r\n      }\r\n    }\r\n    \r\n    //- rjf: if the evaluated type has a virtual table pointer, then we must\r\n    // pre-emptively evaluate this ir tree, and determine a more resolved type.\r\n    if(!disallow_autohooks && result.mode != E_Mode_Null)\r\n    {\r\n      E_TypeKey type_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_Modifiers);\r\n      if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(type_key)))\r\n      {\r\n        E_TypeKey ptee_key = e_type_key_unwrap(result.type_key, E_TypeUnwrapFlag_All);\r\n        E_TypeKind ptee_kind = e_type_kind_from_key(ptee_key);\r\n        if(ptee_kind == E_TypeKind_Struct || \r\n           ptee_kind == E_TypeKind_Class)\r\n        {\r\n          E_Type *ptee_type = e_type_from_key(ptee_key);\r\n          B32 has_vtable = 0;\r\n          for(U64 idx = 0; idx < ptee_type->count; idx += 1)\r\n          {\r\n            if(ptee_type->members[idx].kind == E_MemberKind_VirtualMethod)\r\n            {\r\n              has_vtable = 1;\r\n              break;\r\n            }\r\n          }\r\n          if(has_vtable)\r\n          {\r\n            E_IRNode *class_base_value_tree = e_irtree_resolve_to_value(scratch.arena, result.mode, result.root, result.type_key);\r\n            E_OpList oplist = e_oplist_from_irtree(scratch.arena, class_base_value_tree);\r\n            String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\r\n            E_Interpretation interpret = e_interpret(bytecode);\r\n            U64 class_base_vaddr = interpret.value.u64;\r\n            U64 vtable_vaddr = 0;\r\n            U64 addr_size = e_type_byte_size_from_key(type_key);\r\n            if(e_space_read(interpret.space, &vtable_vaddr, r1u64(class_base_vaddr, class_base_vaddr+addr_size)))\r\n            {\r\n              Arch arch = e_base_ctx->primary_module->arch;\r\n              U32 dbg_info_num = 0;\r\n              RDI_Parsed *rdi = 0;\r\n              U64 module_base = 0;\r\n              for(U64 idx = 0; idx < e_base_ctx->modules_count; idx += 1)\r\n              {\r\n                if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vtable_vaddr))\r\n                {\r\n                  E_DbgInfo *dbg_info = e_dbg_info_from_module(&e_base_ctx->modules[idx]);\r\n                  arch = e_base_ctx->modules[idx].arch;\r\n                  module_base = e_base_ctx->modules[idx].vaddr_range.min;\r\n                  dbg_info_num = e_base_ctx->modules[idx].dbg_info_num;\r\n                  rdi = dbg_info->rdi;\r\n                  break;\r\n                }\r\n              }\r\n              if(rdi != 0)\r\n              {\r\n                U64 vtable_voff = vtable_vaddr - module_base;\r\n                U64 global_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, vtable_voff);\r\n                RDI_GlobalVariable *global_var = rdi_element_from_name_idx(rdi, GlobalVariables, global_idx);\r\n                if(global_var->link_flags & RDI_LinkFlag_TypeScoped)\r\n                {\r\n                  RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, global_var->container_idx);\r\n                  RDI_TypeNode *type = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);\r\n                  E_TypeKey derived_type_key = e_type_key_ext(e_type_kind_from_rdi(type->kind), udt->self_type_idx, dbg_info_num);\r\n                  E_TypeKey ptr_to_derived_type_key = e_type_key_cons_ptr(arch, derived_type_key, 1, 0);\r\n                  result.type_key = ptr_to_derived_type_key;\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: equip previous task's irtree\r\n    if(parent != 0 && parent->root != &e_irnode_nil)\r\n    {\r\n      E_IRTreeAndType *new_chain = push_array(arena, E_IRTreeAndType, 1);\r\n      MemoryCopyStruct(new_chain, parent);\r\n      E_IRTreeAndType *first_chain = 0;\r\n      E_IRTreeAndType *last_chain = 0;\r\n      if(result.prev)\r\n      {\r\n        for(E_IRTreeAndType *p = result.prev; p != 0; p = p->prev)\r\n        {\r\n          E_IRTreeAndType *p_copy = push_array(arena, E_IRTreeAndType, 1);\r\n          MemoryCopyStruct(p_copy, p);\r\n          SLLQueuePush_N(first_chain, last_chain, p_copy, prev);\r\n        }\r\n        SLLQueuePushFront_N(first_chain, last_chain, new_chain, prev);\r\n        result.prev = first_chain;\r\n      }\r\n      else\r\n      {\r\n        result.prev = new_chain;\r\n      }\r\n    }\r\n    \r\n    //- rjf: mark this result as an auto-hook, if we have an override\r\n    if(t->overridden)\r\n    {\r\n      result.auto_hook = 1;\r\n    }\r\n    \r\n    //- rjf: restore stack elements\r\n    e_cache->first_wildcard_inst = first_wildcard_inst_restore;\r\n    e_cache->last_wildcard_inst = last_wildcard_inst_restore;\r\n    \r\n    //- rjf: find any auto hooks according to this generation's type\r\n    if(!disallow_autohooks && result.mode != E_Mode_Null)\r\n    {\r\n      E_AutoHookMatchList matches = e_auto_hook_matches_from_type_key(result.type_key);\r\n      for(E_AutoHookMatch *match = matches.first; match != 0; match = match->next)\r\n      {\r\n        B32 e_is_poisoned = e_expr_is_poisoned(match->expr);\r\n        if(!e_is_poisoned)\r\n        {\r\n          Task *task = push_array(scratch.arena, Task, 1);\r\n          SLLQueuePush(first_task, last_task, task);\r\n          task->expr = match->expr;\r\n          task->first_wildcard_inst = match->first_wildcard_inst;\r\n          task->last_wildcard_inst  = match->last_wildcard_inst;\r\n          task->overridden = push_array(scratch.arena, E_IRTreeAndType, 1);\r\n          task->overridden[0] = result;\r\n          goto end_autohook_find;\r\n        }\r\n      }\r\n      end_autohook_find:;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpoison the tags we used\r\n  //\r\n  for(Task *t = first_task; t != 0; t = t->next)\r\n  {\r\n    e_expr_unpoison(t->expr);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: apply inherited lenses to the resultant type\r\n  //\r\n  if(inherited_lenses.count != 0)\r\n  {\r\n    E_Type *result_type = e_type_from_key(result.type_key);\r\n    for(E_TypeKeyNode *n = inherited_lenses.first; n != 0; n = n->next)\r\n    {\r\n      E_Type *src_type = e_type_from_key(n->v);\r\n      E_TypeKey dst_type_key = e_type_key_cons(.kind   = src_type->kind,\r\n                                               .flags  = src_type->flags,\r\n                                               .name   = src_type->name,\r\n                                               .count  = src_type->count,\r\n                                               .args   = src_type->args,\r\n                                               .irext  = src_type->irext,\r\n                                               .access = src_type->access,\r\n                                               .expand = src_type->expand,\r\n                                               .direct_key = result.type_key);\r\n      result.type_key = dst_type_key;\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n//- rjf: irtree -> linear ops/bytecode\r\n\r\ninternal void\r\ne_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out)\r\n{\r\n  U32 op = root->op;\r\n  {\r\n    E_Space zero_space = zero_struct;\r\n    if(!e_space_match(root->space, zero_space) &&\r\n       !e_space_match(root->space, *current_space))\r\n    {\r\n      *current_space = root->space;\r\n      e_oplist_push_set_space(arena, out, root->space);\r\n    }\r\n  }\r\n  switch(op)\r\n  {\r\n    case RDI_EvalOp_Stop:\r\n    case RDI_EvalOp_Skip:\r\n    {\r\n      // TODO: error - invalid ir-tree op\r\n    }break;\r\n    \r\n    case E_IRExtKind_Bytecode:\r\n    {\r\n      e_oplist_push_bytecode(arena, out, root->string);\r\n    }break;\r\n    \r\n    case E_IRExtKind_SetSpace:\r\n    {\r\n      E_Space space = {0};\r\n      MemoryCopy(&space, &root->value, sizeof(space));\r\n      e_oplist_push_set_space(arena, out, space);\r\n      for(E_IRNode *child = root->first;\r\n          child != &e_irnode_nil;\r\n          child = child->next)\r\n      {\r\n        e_append_oplist_from_irtree(arena, child, current_space, out);\r\n      }\r\n    }break;\r\n    \r\n    case RDI_EvalOp_Cond:\r\n    {\r\n      // rjf: generate oplists for each child\r\n      E_OpList prt_cond = e_oplist_from_irtree(arena, root->first);\r\n      E_OpList prt_left = e_oplist_from_irtree(arena, root->first->next);\r\n      E_OpList prt_right = e_oplist_from_irtree(arena, root->first->next->next);\r\n      \r\n      // rjf: put together like so:\r\n      //  1. <prt_cond> , Op_Cond (sizeof(2))\r\n      //  2. <prt_right>, Op_Skip (sizeof(3))\r\n      //  3. <ptr_left>\r\n      \r\n      // rjf: modify prt_right in place to create step 2\r\n      e_oplist_push_op(arena, &prt_right, RDI_EvalOp_Skip, e_value_u64(prt_left.encoded_size));\r\n      \r\n      // rjf: merge 1 into out\r\n      e_oplist_concat_in_place(out, &prt_cond);\r\n      e_oplist_push_op(arena, out, RDI_EvalOp_Cond, e_value_u64(prt_right.encoded_size));\r\n      \r\n      // rjf: merge 2 into out\r\n      e_oplist_concat_in_place(out, &prt_right);\r\n      \r\n      // rjf: merge 3 into out\r\n      e_oplist_concat_in_place(out, &prt_left);\r\n    }break;\r\n    \r\n    case RDI_EvalOp_ConstString:\r\n    {\r\n      e_oplist_push_string_literal(arena, out, root->string);\r\n    }break;\r\n    \r\n    default:\r\n    {\r\n      if(op >= RDI_EvalOp_COUNT)\r\n      {\r\n        // TODO: error - invalid ir-tree op\r\n      }\r\n      else\r\n      {\r\n        // rjf: append ops for all children\r\n        U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];\r\n        U64 child_count = RDI_POPN_FROM_CTRLBITS(ctrlbits);\r\n        U64 idx = 0;\r\n        for(E_IRNode *child = root->first;\r\n            child != &e_irnode_nil && idx < child_count;\r\n            child = child->next, idx += 1)\r\n        {\r\n          e_append_oplist_from_irtree(arena, child, current_space, out);\r\n        }\r\n        \r\n        // rjf: emit op to compute this node\r\n        e_oplist_push_op(arena, out, (RDI_EvalOp)root->op, root->value);\r\n      }\r\n    }break;\r\n  }\r\n}\r\n\r\ninternal E_OpList\r\ne_oplist_from_irtree(Arena *arena, E_IRNode *root)\r\n{\r\n  E_OpList ops = {0};\r\n  E_Space space = e_interpret_ctx->primary_space;\r\n  e_append_oplist_from_irtree(arena, root, &space, &ops);\r\n  return ops;\r\n}\r\n\r\ninternal String8\r\ne_bytecode_from_oplist(Arena *arena, E_OpList *oplist)\r\n{\r\n  // rjf: allocate buffer\r\n  U64 size = oplist->encoded_size;\r\n  U8 *str = push_array_no_zero(arena, U8, size);\r\n  \r\n  // rjf: iterate loose op nodes; fill buffer\r\n  U8 *ptr = str;\r\n  U8 *opl = str + size;\r\n  for(E_Op *op = oplist->first;\r\n      op != 0;\r\n      op = op->next)\r\n  {\r\n    U32 opcode = op->opcode;\r\n    switch(opcode)\r\n    {\r\n      default:\r\n      {\r\n        // rjf: compute bytecode advance\r\n        U16 ctrlbits = rdi_eval_op_ctrlbits_table[opcode];\r\n        U64 extra_byte_count = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\r\n        U8 *next_ptr = ptr + 1 + extra_byte_count;\r\n        Assert(next_ptr <= opl);\r\n        \r\n        // rjf: fill bytecode\r\n        ptr[0] = opcode;\r\n        MemoryCopy(ptr + 1, &op->value.u512.u8[0], extra_byte_count);\r\n        \r\n        // rjf: advance\r\n        ptr = next_ptr;\r\n      }break;\r\n      \r\n      case RDI_EvalOp_ConstString:\r\n      {\r\n        // rjf: compute bytecode advance\r\n        U8 *next_ptr = ptr + 2 + op->value.u64;\r\n        Assert(next_ptr <= opl);\r\n        \r\n        // rjf: fill\r\n        ptr[0] = opcode;\r\n        ptr[1] = (U8)op->value.u64;\r\n        MemoryCopy(ptr+2, op->string.str, op->value.u64);\r\n        \r\n        // rjf: advance\r\n        ptr = next_ptr;\r\n      }break;\r\n      \r\n      case E_IRExtKind_Bytecode:\r\n      {\r\n        // rjf: compute bytecode advance\r\n        U64 size = op->string.size;\r\n        U8 *next_ptr = ptr + size;\r\n        Assert(next_ptr <= opl);\r\n        \r\n        // rjf: fill bytecode\r\n        MemoryCopy(ptr, op->string.str, size);\r\n        \r\n        // rjf: advance\r\n        ptr = next_ptr;\r\n      }break;\r\n      \r\n      case E_IRExtKind_SetSpace:\r\n      {\r\n        // rjf: compute bytecode advance\r\n        U64 extra_byte_count = sizeof(E_Space);\r\n        U8 *next_ptr = ptr + 1 + extra_byte_count;\r\n        Assert(next_ptr <= opl);\r\n        \r\n        // rjf: fill bytecode\r\n        ptr[0] = opcode;\r\n        MemoryCopy(ptr + 1, &op->value.u128, extra_byte_count);\r\n        \r\n        // rjf: advance\r\n        ptr = next_ptr;\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  // rjf: fill result\r\n  String8 result = {0};\r\n  result.size = size;\r\n  result.str = str;\r\n  return result;\r\n}\r\n\r\n//- rjf: leaf-bytecode expression extensions\r\n\r\ninternal E_Expr *\r\ne_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name)\r\n{\r\n  E_Expr *root = e_push_expr(arena, E_ExprKind_MemberAccess, r1u64(0, 0));\r\n  E_Expr *lhs_bytecode = e_push_expr(arena, E_ExprKind_LeafBytecode, lhs->range);\r\n  E_OpList lhs_oplist = e_oplist_from_irtree(arena, lhs_irtree->root);\r\n  lhs_bytecode->string = e_string_from_expr(arena, lhs, str8_zero());\r\n  lhs_bytecode->qualifier = lhs->qualifier;\r\n  lhs_bytecode->space = lhs->space;\r\n  lhs_bytecode->mode = lhs_irtree->mode;\r\n  lhs_bytecode->type_key = lhs_irtree->type_key;\r\n  lhs_bytecode->bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);\r\n  E_Expr *rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, r1u64(0, 0));\r\n  rhs->string = push_str8_copy(arena, member_name);\r\n  e_expr_push_child(root, lhs_bytecode);\r\n  e_expr_push_child(root, rhs);\r\n  return root;\r\n}\r\n"
  },
  {
    "path": "src/eval/eval_ir.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_IR_H\r\n#define EVAL_IR_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Identifier Resolution Rule Types\r\n\r\ntypedef enum E_IdentifierResolutionPath\r\n{\r\n  E_IdentifierResolutionPath_WildcardInst,\r\n  E_IdentifierResolutionPath_ParentExpr,\r\n  E_IdentifierResolutionPath_ParentExprMember,\r\n  E_IdentifierResolutionPath_ImplicitThisMember,\r\n  E_IdentifierResolutionPath_Local,\r\n  E_IdentifierResolutionPath_DebugInfoMatch,\r\n  E_IdentifierResolutionPath_BuiltInConstants,\r\n  E_IdentifierResolutionPath_BuiltInTypes,\r\n  E_IdentifierResolutionPath_Registers,\r\n  E_IdentifierResolutionPath_RegisterAliases,\r\n  E_IdentifierResolutionPath_Macros,\r\n}\r\nE_IdentifierResolutionPath;\r\n\r\ntypedef struct E_IdentifierResolutionRule E_IdentifierResolutionRule;\r\nstruct E_IdentifierResolutionRule\r\n{\r\n  E_IdentifierResolutionPath *paths;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: IR State\r\n\r\ntypedef struct E_IRCacheNode E_IRCacheNode;\r\nstruct E_IRCacheNode\r\n{\r\n  E_IRCacheNode *next;\r\n  E_Expr *expr;\r\n  E_IRNode *overridden_node;\r\n  E_IRTreeAndType irtree;\r\n};\r\n\r\ntypedef struct E_IRCacheSlot E_IRCacheSlot;\r\nstruct E_IRCacheSlot\r\n{\r\n  E_IRCacheNode *first;\r\n  E_IRCacheNode *last;\r\n};\r\n\r\ntypedef struct E_IRState E_IRState;\r\nstruct E_IRState\r\n{\r\n  Arena *arena;\r\n  U64 arena_eval_start_pos;\r\n  \r\n  // rjf: ir context\r\n  E_IRCtx *ctx;\r\n  \r\n  // rjf: unpacked ctx\r\n  RDI_Procedure *thread_ip_procedure;\r\n  \r\n  // rjf: overridden irtree\r\n  E_IRTreeAndType *overridden_irtree;\r\n  B32 disallow_autohooks;\r\n  B32 disallow_chained_fastpaths;\r\n  \r\n  // rjf: caches\r\n  E_UsedExprMap *used_expr_map;\r\n  E_TypeAutoHookCacheMap *type_auto_hook_cache_map;\r\n  U64 string_id_gen;\r\n  E_StringIDMap *string_id_map;\r\n  U64 ir_cache_slots_count;\r\n  E_IRCacheSlot *ir_cache_slots;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nE_IdentifierResolutionPath e_default_identifier_resolution_paths[] =\r\n{\r\n  E_IdentifierResolutionPath_WildcardInst,\r\n  E_IdentifierResolutionPath_ParentExpr,\r\n  E_IdentifierResolutionPath_ParentExprMember,\r\n  E_IdentifierResolutionPath_ImplicitThisMember,\r\n  E_IdentifierResolutionPath_Local,\r\n  E_IdentifierResolutionPath_BuiltInConstants,\r\n  E_IdentifierResolutionPath_BuiltInTypes,\r\n  E_IdentifierResolutionPath_DebugInfoMatch,\r\n  E_IdentifierResolutionPath_Registers,\r\n  E_IdentifierResolutionPath_RegisterAliases,\r\n  E_IdentifierResolutionPath_Macros,\r\n};\r\nE_IdentifierResolutionRule e_default_identifier_resolution_rule =\r\n{\r\n  e_default_identifier_resolution_paths,\r\n  ArrayCount(e_default_identifier_resolution_paths),\r\n};\r\n\r\nE_IdentifierResolutionPath e_callable_identifier_resolution_paths[] =\r\n{\r\n  E_IdentifierResolutionPath_Macros,\r\n  E_IdentifierResolutionPath_WildcardInst,\r\n  E_IdentifierResolutionPath_ParentExpr,\r\n  E_IdentifierResolutionPath_ParentExprMember,\r\n  E_IdentifierResolutionPath_ImplicitThisMember,\r\n  E_IdentifierResolutionPath_Local,\r\n  E_IdentifierResolutionPath_BuiltInConstants,\r\n  E_IdentifierResolutionPath_BuiltInTypes,\r\n  E_IdentifierResolutionPath_DebugInfoMatch,\r\n  E_IdentifierResolutionPath_Registers,\r\n  E_IdentifierResolutionPath_RegisterAliases,\r\n};\r\nE_IdentifierResolutionRule e_callable_identifier_resolution_rule =\r\n{\r\n  e_callable_identifier_resolution_paths,\r\n  ArrayCount(e_callable_identifier_resolution_paths),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: IR-ization Functions\r\n\r\n//- rjf: op list functions\r\ninternal void e_oplist_push_op(Arena *arena, E_OpList *list, RDI_EvalOp opcode, E_Value value);\r\ninternal void e_oplist_push_uconst(Arena *arena, E_OpList *list, U64 x);\r\ninternal void e_oplist_push_sconst(Arena *arena, E_OpList *list, S64 x);\r\ninternal void e_oplist_push_bytecode(Arena *arena, E_OpList *list, String8 bytecode);\r\ninternal void e_oplist_push_set_space(Arena *arena, E_OpList *list, E_Space space);\r\ninternal void e_oplist_push_string_literal(Arena *arena, E_OpList *list, String8 string);\r\ninternal void e_oplist_concat_in_place(E_OpList *dst, E_OpList *to_push);\r\n\r\n//- rjf: ir tree core building helpers\r\ninternal E_IRNode *e_push_irnode(Arena *arena, RDI_EvalOp op);\r\ninternal void e_irnode_push_child(E_IRNode *parent, E_IRNode *child);\r\n\r\n//- rjf: ir subtree building helpers\r\ninternal E_IRNode *e_irtree_const_u(Arena *arena, U64 v);\r\ninternal E_IRNode *e_irtree_leaf_u128(Arena *arena, U128 u128);\r\ninternal E_IRNode *e_irtree_unary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, E_IRNode *c);\r\ninternal E_IRNode *e_irtree_binary_op(Arena *arena, RDI_EvalOp op, RDI_EvalTypeGroup group, U64 operand_size, E_IRNode *l, E_IRNode *r);\r\ninternal E_IRNode *e_irtree_binary_op_u(Arena *arena, RDI_EvalOp op, U64 operand_size, E_IRNode *l, E_IRNode *r);\r\ninternal E_IRNode *e_irtree_conditional(Arena *arena, E_IRNode *c, E_IRNode *l, E_IRNode *r);\r\ninternal E_IRNode *e_irtree_bytecode_no_copy(Arena *arena, String8 bytecode);\r\ninternal E_IRNode *e_irtree_string_literal(Arena *arena, String8 string);\r\ninternal E_IRNode *e_irtree_set_space(Arena *arena, E_Space space, E_IRNode *c);\r\ninternal E_IRNode *e_irtree_mem_read_type(Arena *arena, E_IRNode *c, E_TypeKey type_key);\r\ninternal E_IRNode *e_irtree_convert_lo(Arena *arena, E_IRNode *c, RDI_EvalTypeGroup out, RDI_EvalTypeGroup in);\r\ninternal E_IRNode *e_irtree_trunc(Arena *arena, E_IRNode *c, E_TypeKey type_key);\r\ninternal E_IRNode *e_irtree_convert_hi(Arena *arena, E_IRNode *c, E_TypeKey out, E_TypeKey in);\r\ninternal E_IRNode *e_irtree_resolve_to_value(Arena *arena, E_Mode from_mode, E_IRNode *tree, E_TypeKey type_key);\r\n\r\n//- rjf: expression poison checking\r\ninternal B32 e_expr_is_poisoned(E_Expr *expr);\r\ninternal void e_expr_poison(E_Expr *expr);\r\ninternal void e_expr_unpoison(E_Expr *expr);\r\n\r\n//- rjf: top-level irtree/type extraction\r\nE_TYPE_ACCESS_FUNCTION_DEF(default);\r\ninternal E_IRTreeAndType e_push_irtree_and_type_from_expr(Arena *arena, E_IRTreeAndType *root_parent, E_IdentifierResolutionRule *identifier_resolution_rule, B32 disallow_autohooks, B32 disallow_chained_fastpaths, E_Expr *root_expr);\r\n\r\n//- rjf: irtree -> linear ops/bytecode\r\ninternal void e_append_oplist_from_irtree(Arena *arena, E_IRNode *root, E_Space *current_space, E_OpList *out);\r\ninternal E_OpList e_oplist_from_irtree(Arena *arena, E_IRNode *root);\r\ninternal String8 e_bytecode_from_oplist(Arena *arena, E_OpList *oplist);\r\n\r\n//- rjf: leaf-bytecode expression extensions\r\ninternal E_Expr *e_expr_irext_member_access(Arena *arena, E_Expr *lhs, E_IRTreeAndType *lhs_irtree, String8 member_name);\r\n\r\n#endif // EVAL_IR_H\r\n"
  },
  {
    "path": "src/eval/eval_parse.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Lexing/Parsing Data Tables\r\n\r\nglobal read_only String8 e_multichar_symbol_strings[] =\r\n{\r\n  str8_lit_comp(\"<<\"),\r\n  str8_lit_comp(\">>\"),\r\n  str8_lit_comp(\"->\"),\r\n  str8_lit_comp(\"<=\"),\r\n  str8_lit_comp(\">=\"),\r\n  str8_lit_comp(\"==\"),\r\n  str8_lit_comp(\"!=\"),\r\n  str8_lit_comp(\"&&\"),\r\n  str8_lit_comp(\"||\"),\r\n  str8_lit_comp(\"=>\"),\r\n};\r\n\r\nglobal read_only S64 e_max_precedence = 15;\r\n\r\n////////////////////////////////\r\n//~ rjf: Tokenization Functions\r\n\r\ninternal E_Token\r\ne_token_zero(void)\r\n{\r\n  E_Token t = zero_struct;\r\n  return t;\r\n}\r\n\r\ninternal void\r\ne_token_chunk_list_push(Arena *arena, E_TokenChunkList *list, U64 chunk_size, E_Token *token)\r\n{\r\n  E_TokenChunkNode *node = list->last;\r\n  if(node == 0 || node->count >= node->cap)\r\n  {\r\n    node = push_array(arena, E_TokenChunkNode, 1);\r\n    SLLQueuePush(list->first, list->last, node);\r\n    node->cap = chunk_size;\r\n    node->v = push_array_no_zero(arena, E_Token, node->cap);\r\n    list->node_count += 1;\r\n  }\r\n  MemoryCopyStruct(&node->v[node->count], token);\r\n  node->count += 1;\r\n  list->total_count += 1;\r\n}\r\n\r\ninternal E_TokenArray\r\ne_token_array_from_chunk_list(Arena *arena, E_TokenChunkList *list)\r\n{\r\n  E_TokenArray array = {0};\r\n  array.count = list->total_count;\r\n  array.v = push_array_no_zero(arena, E_Token, array.count);\r\n  U64 idx = 0;\r\n  for(E_TokenChunkNode *node = list->first; node != 0; node = node->next)\r\n  {\r\n    MemoryCopy(array.v+idx, node->v, sizeof(E_Token)*node->count);\r\n    idx += node->count;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal E_TokenArray\r\ne_token_array_from_text(Arena *arena, String8 text)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: lex loop\r\n  E_TokenChunkList tokens = {0};\r\n  U64 active_token_start_idx = 0;\r\n  E_TokenKind active_token_kind = E_TokenKind_Null;\r\n  B32 active_token_kind_started_with_tick = 0;\r\n  B32 escaped = 0;\r\n  B32 exp = 0;\r\n  for(U64 idx = 0, advance = 0; idx <= text.size; idx += advance)\r\n  {\r\n    U8 byte      = (idx+0 < text.size) ? text.str[idx+0] : 0;\r\n    U8 byte_next = (idx+1 < text.size) ? text.str[idx+1] : 0;\r\n    U8 byte_next2= (idx+2 < text.size) ? text.str[idx+2] : 0;\r\n    advance = 1;\r\n    B32 token_formed = 0;\r\n    U64 token_end_idx_pad = 0;\r\n    switch(active_token_kind)\r\n    {\r\n      //- rjf: no active token -> seek token starter\r\n      default:\r\n      {\r\n        if(char_is_alpha(byte) || byte == '_' || byte == '`' || byte == '$')\r\n        {\r\n          active_token_kind = E_TokenKind_Identifier;\r\n          active_token_start_idx = idx;\r\n          active_token_kind_started_with_tick = (byte == '`');\r\n        }\r\n        else if(char_is_digit(byte, 10) || (byte == '.' && char_is_digit(byte_next, 10)))\r\n        {\r\n          active_token_kind = E_TokenKind_Numeric;\r\n          active_token_start_idx = idx;\r\n        }\r\n        else if(byte == '\"')\r\n        {\r\n          active_token_kind = E_TokenKind_StringLiteral;\r\n          active_token_start_idx = idx;\r\n        }\r\n        else if(byte == '\\'')\r\n        {\r\n          active_token_kind = E_TokenKind_CharLiteral;\r\n          active_token_start_idx = idx;\r\n        }\r\n        else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' ||\r\n                byte == '&' || byte == '*' || byte == '(' || byte == ')' ||\r\n                byte == '-' || byte == '=' || byte == '+' || byte == '[' ||\r\n                byte == ']' || byte == '{' || byte == '}' || byte == ':' ||\r\n                byte == ';' || byte == ',' || byte == '.' || byte == '<' ||\r\n                byte == '>' || byte == '/' || byte == '?' || byte == '|')\r\n        {\r\n          active_token_kind = E_TokenKind_Symbol;\r\n          active_token_start_idx = idx;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: active tokens -> seek enders\r\n      case E_TokenKind_Identifier:\r\n      {\r\n        if(byte == ':' && byte_next == ':' && (char_is_alpha(byte_next2) || byte_next2 == '_' || byte_next2 == '<'))\r\n        {\r\n          // NOTE(rjf): encountering C++-style namespaces - skip over scope resolution symbol\r\n          // & keep going.\r\n          advance = 2;\r\n        }\r\n        else if((byte == '\\'' || byte == '`') && active_token_kind_started_with_tick)\r\n        {\r\n          // NOTE(rjf): encountering ` -> ' or ` -> ` style identifier escapes\r\n          active_token_kind_started_with_tick = 0;\r\n          advance = 1;\r\n        }\r\n        else if(byte == '<')\r\n        {\r\n          // NOTE(rjf): encountering C++-style templates - try to find ender. if no ender found,\r\n          // assume this is an operator & just consume the identifier part.\r\n          S64 nest = 1;\r\n          for(U64 idx2 = idx+1; idx2 <= text.size; idx2 += 1)\r\n          {\r\n            if(idx2 < text.size && text.str[idx2] == '<')\r\n            {\r\n              nest += 1;\r\n            }\r\n            else if(idx2 < text.size && text.str[idx2] == '>')\r\n            {\r\n              nest -= 1;\r\n              if(nest == 0)\r\n              {\r\n                advance = (idx2+1-idx);\r\n                break;\r\n              }\r\n            }\r\n            else if(idx2 == text.size && nest != 0)\r\n            {\r\n              token_formed = 1;\r\n              advance = 0;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        else if(!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && !active_token_kind_started_with_tick && byte != '@' && byte != '$')\r\n        {\r\n          advance = 0;\r\n          token_formed = 1;\r\n        }\r\n      }break;\r\n      case E_TokenKind_Numeric:\r\n      {\r\n        if(exp && (byte == '+' || byte == '-')){}\r\n        else if(!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '.' && byte != ':')\r\n        {\r\n          advance = 0;\r\n          token_formed = 1;\r\n        }\r\n        else\r\n        {\r\n          exp = 0;\r\n          exp = (byte == 'e');\r\n        }\r\n      }break;\r\n      case E_TokenKind_StringLiteral:\r\n      {\r\n        if(escaped == 0 && byte == '\\\\')\r\n        {\r\n          escaped = 1;\r\n        }\r\n        else if(escaped)\r\n        {\r\n          escaped = 0;\r\n        }\r\n        else if(escaped == 0 && byte == '\"')\r\n        {\r\n          advance = 1;\r\n          token_formed = 1;\r\n          token_end_idx_pad = 1;\r\n        }\r\n      }break;\r\n      case E_TokenKind_CharLiteral:\r\n      {\r\n        if(escaped == 0 && byte == '\\\\')\r\n        {\r\n          escaped = 1;\r\n        }\r\n        else if(escaped)\r\n        {\r\n          escaped = 0;\r\n        }\r\n        else if(escaped == 0 && byte == '\\'')\r\n        {\r\n          advance = 1;\r\n          token_formed = 1;\r\n          token_end_idx_pad = 1;\r\n        }\r\n      }break;\r\n      case E_TokenKind_Symbol:\r\n      {\r\n        if(byte != '~' && byte != '!' && byte != '%' && byte != '^' &&\r\n           byte != '&' && byte != '*' && byte != '(' && byte != ')' &&\r\n           byte != '-' && byte != '=' && byte != '+' && byte != '[' &&\r\n           byte != ']' && byte != '{' && byte != '}' && byte != ':' &&\r\n           byte != ';' && byte != ',' && byte != '.' && byte != '<' &&\r\n           byte != '>' && byte != '/' && byte != '?' && byte != '|')\r\n        {\r\n          advance = 0;\r\n          token_formed = 1;\r\n        }\r\n      }break;\r\n    }\r\n    \r\n    //- rjf: token formed -> push new formed token(s)\r\n    if(token_formed)\r\n    {\r\n      // rjf: non-symbols *or* symbols of only 1-length can be immediately\r\n      // pushed as a token\r\n      if(active_token_kind != E_TokenKind_Symbol || idx==active_token_start_idx+1)\r\n      {\r\n        E_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+token_end_idx_pad)};\r\n        e_token_chunk_list_push(scratch.arena, &tokens, 256, &token);\r\n      }\r\n      \r\n      // rjf: symbolic strings matching `--` mean the remainder of the string\r\n      // is reserved for external usage. the rest of the stream should not\r\n      // be tokenized.\r\n      else if(idx == active_token_start_idx+2 && text.str[active_token_start_idx] == '-' && text.str[active_token_start_idx+1] == '-')\r\n      {\r\n        break;\r\n      }\r\n      \r\n      // rjf: if we got a symbol string of N>1 characters, then we need to\r\n      // apply the maximum-munch rule, and produce M<=N tokens, where each\r\n      // formed token is the maximum size possible, given the legal\r\n      // >1-length symbol strings.\r\n      else\r\n      {\r\n        U64 advance2 = 0;\r\n        for(U64 idx2 = active_token_start_idx; idx2 < idx; idx2 += advance2)\r\n        {\r\n          advance2 = 1;\r\n          for(U64 multichar_symbol_idx = 0;\r\n              multichar_symbol_idx < ArrayCount(e_multichar_symbol_strings);\r\n              multichar_symbol_idx += 1)\r\n          {\r\n            String8 multichar_symbol_string = e_multichar_symbol_strings[multichar_symbol_idx];\r\n            String8 part_of_token = str8_substr(text, r1u64(idx2, idx2+multichar_symbol_string.size));\r\n            if(str8_match(part_of_token, multichar_symbol_string, 0))\r\n            {\r\n              advance2 = multichar_symbol_string.size;\r\n              break;\r\n            }\r\n          }\r\n          E_Token token = {active_token_kind, r1u64(idx2, idx2+advance2)};\r\n          e_token_chunk_list_push(scratch.arena, &tokens, 256, &token);\r\n        }\r\n      }\r\n      \r\n      // rjf: reset for subsequent tokens.\r\n      active_token_kind = E_TokenKind_Null;\r\n    }\r\n  }\r\n  \r\n  //- rjf: chunk list -> array & return\r\n  E_TokenArray array = e_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  return array;\r\n}\r\n\r\ninternal E_TokenArray\r\ne_token_array_make_first_opl(E_Token *first, E_Token *opl)\r\n{\r\n  E_TokenArray array = {first, (U64)(opl-first)};\r\n  return array;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Expression Tree Building Functions\r\n\r\ninternal E_Expr *\r\ne_push_expr(Arena *arena, E_ExprKind kind, Rng1U64 range)\r\n{\r\n  E_Expr *e = push_array(arena, E_Expr, 1);\r\n  e->first = e->last = e->next = e->prev = e->ref = &e_expr_nil;\r\n  e->range = range;\r\n  e->kind = kind;\r\n  return e;\r\n}\r\n\r\ninternal void\r\ne_expr_insert_child(E_Expr *parent, E_Expr *prev, E_Expr *child)\r\n{\r\n  DLLInsert_NPZ(&e_expr_nil, parent->first, parent->last, prev, child, next, prev);\r\n}\r\n\r\ninternal void\r\ne_expr_push_child(E_Expr *parent, E_Expr *child)\r\n{\r\n  DLLPushBack_NPZ(&e_expr_nil, parent->first, parent->last, child, next, prev);\r\n}\r\n\r\ninternal void\r\ne_expr_remove_child(E_Expr *parent, E_Expr *child)\r\n{\r\n  DLLRemove_NPZ(&e_expr_nil, parent->first, parent->last, child, next, prev);\r\n}\r\n\r\ninternal E_Expr *\r\ne_expr_ref(Arena *arena, E_Expr *ref)\r\n{\r\n  E_Expr *expr = e_push_expr(arena, E_ExprKind_Ref, ref->range);\r\n  expr->ref = ref;\r\n  return expr;\r\n}\r\n\r\ninternal E_Expr *\r\ne_expr_copy(Arena *arena, E_Expr *src)\r\n{\r\n  E_Expr *result = &e_expr_nil;\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  if(src != &e_expr_nil)\r\n  {\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      E_Expr *dst_parent;\r\n      E_Expr *src;\r\n      B32 is_ref;\r\n      B32 is_sib;\r\n    };\r\n    Task start_task = {0, &e_expr_nil, src};\r\n    Task *first_task = &start_task;\r\n    Task *last_task = first_task;\r\n    for(Task *t = first_task; t != 0; t = t->next)\r\n    {\r\n      E_Expr *dst = e_push_expr(arena, t->src->kind, t->src->range);\r\n      dst->mode      = t->src->mode;\r\n      dst->space     = t->src->space;\r\n      dst->type_key  = t->src->type_key;\r\n      dst->value     = t->src->value;\r\n      dst->string    = push_str8_copy(arena, t->src->string);\r\n      dst->bytecode  = push_str8_copy(arena, t->src->bytecode);\r\n      dst->qualifier = push_str8_copy(arena, t->src->qualifier);\r\n      if(t->dst_parent == &e_expr_nil)\r\n      {\r\n        result = dst;\r\n      }\r\n      else if(t->is_ref)\r\n      {\r\n        t->dst_parent->ref = dst;\r\n      }\r\n      else if(t->is_sib)\r\n      {\r\n        t->dst_parent->next = dst;\r\n        dst->prev = t->dst_parent;\r\n      }\r\n      else\r\n      {\r\n        e_expr_push_child(t->dst_parent, dst);\r\n      }\r\n      if(t->src->next != &e_expr_nil)\r\n      {\r\n        Task *task = push_array(scratch.arena, Task, 1);\r\n        task->dst_parent = dst;\r\n        task->src = t->src->next;\r\n        task->is_sib = 1;\r\n        SLLQueuePush(first_task, last_task, task);\r\n      }\r\n      if(t->src->ref != &e_expr_nil)\r\n      {\r\n        Task *task = push_array(scratch.arena, Task, 1);\r\n        task->dst_parent = dst;\r\n        task->src = t->src->ref;\r\n        task->is_ref = 1;\r\n        SLLQueuePush(first_task, last_task, task);\r\n      }\r\n      for(E_Expr *src_child = t->src->first; src_child != &e_expr_nil; src_child = src_child->next)\r\n      {\r\n        Task *task = push_array(scratch.arena, Task, 1);\r\n        task->dst_parent = dst;\r\n        task->src = src_child;\r\n        SLLQueuePush(first_task, last_task, task);\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\ne_expr_list_push(Arena *arena, E_ExprList *list, E_Expr *expr)\r\n{\r\n  E_ExprNode *n = push_array(arena, E_ExprNode, 1);\r\n  n->v = expr;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count +=1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Expression Tree -> String Conversions\r\n\r\ninternal void\r\ne_append_strings_from_expr(Arena *arena, E_Expr *expr, String8 parent_expr_string, String8List *out)\r\n{\r\n  switch(expr->kind)\r\n  {\r\n    default:\r\n    {\r\n      E_OpInfo *op_info = &e_expr_kind_op_info_table[expr->kind];\r\n      String8 seps[] =\r\n      {\r\n        op_info->pre,\r\n        op_info->sep,\r\n        op_info->post,\r\n      };\r\n      U64 sep_idx = 0;\r\n      for(E_Expr *child = expr->first;; child = child->next)\r\n      {\r\n        if(sep_idx == ArrayCount(seps)-1 && child != &e_expr_nil)\r\n        {\r\n          str8_list_push(arena, out, op_info->chain);\r\n        }\r\n        else\r\n        {\r\n          str8_list_push(arena, out, seps[sep_idx]);\r\n          sep_idx += 1;\r\n        }\r\n        if(child == &e_expr_nil)\r\n        {\r\n          break;\r\n        }\r\n        E_OpInfo *child_op_info = &e_expr_kind_op_info_table[child->kind];\r\n        B32 need_parens = (child_op_info->precedence > op_info->precedence);\r\n        if(need_parens)\r\n        {\r\n          str8_list_pushf(arena, out, \"(\");\r\n        }\r\n        e_append_strings_from_expr(arena, child, parent_expr_string, out);\r\n        if(need_parens)\r\n        {\r\n          str8_list_pushf(arena, out, \")\");\r\n        }\r\n      }\r\n    }break;\r\n    case E_ExprKind_LeafBytecode:\r\n    case E_ExprKind_LeafIdentifier:\r\n    {\r\n      if(str8_match(expr->string, str8_lit(\"$\"), 0) && parent_expr_string.size != 0)\r\n      {\r\n        str8_list_push(arena, out, parent_expr_string);\r\n      }\r\n      else\r\n      {\r\n        str8_list_push(arena, out, expr->string);\r\n      }\r\n    }break;\r\n    case E_ExprKind_LeafStringLiteral:\r\n    {\r\n      str8_list_pushf(arena, out, \"\\\"%S\\\"\", expr->string);\r\n    }break;\r\n    case E_ExprKind_LeafU64:\r\n    {\r\n      str8_list_pushf(arena, out, \"%I64u\", expr->value.u64);\r\n    }break;\r\n    case E_ExprKind_LeafOffset:\r\n    {\r\n      str8_list_pushf(arena, out, \"0x%I64x\", expr->value.u64);\r\n    }break;\r\n    case E_ExprKind_LeafFilePath:\r\n    {\r\n      str8_list_pushf(arena, out, \"file:\\\"%S\\\"\", escaped_from_raw_str8(arena, expr->string));\r\n    }break;\r\n    case E_ExprKind_LeafF64:\r\n    {\r\n      str8_list_pushf(arena, out, \"%f\", expr->value.f64);\r\n    }break;\r\n    case E_ExprKind_LeafF32:\r\n    {\r\n      str8_list_pushf(arena, out, \"%f\", expr->value.f32);\r\n    }break;\r\n    case E_ExprKind_TypeIdent:\r\n    {\r\n      String8 type_string = e_type_string_from_key(arena, expr->type_key);\r\n      str8_list_push(arena, out, type_string);\r\n    }break;\r\n    case E_ExprKind_Ref:\r\n    {\r\n      e_append_strings_from_expr(arena, expr->ref, parent_expr_string, out);\r\n    }break;\r\n  }\r\n}\r\n\r\ninternal String8\r\ne_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_expr_string)\r\n{\r\n  String8List strings = {0};\r\n  e_append_strings_from_expr(arena, expr, parent_expr_string, &strings);\r\n  String8 result = str8_list_join(arena, &strings, 0);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Parsing Functions\r\n\r\ninternal E_TypeKey\r\ne_leaf_builtin_type_key_from_name(String8 name)\r\n{\r\n  E_TypeKey result = {0};\r\n  if(0){}\r\n#define BuiltInType_XList \\\r\nBasicCase(\"uint8\", U8)\\\r\nBasicCase(\"uint8_t\", U8)\\\r\nBasicCase(\"uchar\", UChar8)\\\r\nBasicCase(\"uchar8\", UChar8)\\\r\nBasicCase(\"uint16\", U16)\\\r\nBasicCase(\"uint16_t\", U16)\\\r\nBasicCase(\"uchar16\", UChar16)\\\r\nBasicCase(\"uint32\", U32)\\\r\nBasicCase(\"uint32_t\", U32)\\\r\nBasicCase(\"uchar32\", UChar32)\\\r\nBasicCase(\"uint64\", U64)\\\r\nBasicCase(\"uint64_t\", U64)\\\r\nBasicCase(\"uint128\", U128)\\\r\nBasicCase(\"uint128_t\", U128)\\\r\nBasicCase(\"uint256\", U256)\\\r\nBasicCase(\"uint256_t\", U256)\\\r\nBasicCase(\"uint512\", U512)\\\r\nBasicCase(\"uint512_t\", U512)\\\r\nBasicCase(\"int8\", S8)\\\r\nBasicCase(\"int8_t\", S8)\\\r\nBasicCase(\"char\", Char8)\\\r\nBasicCase(\"char8\", Char8)\\\r\nBasicCase(\"int16\", S16)\\\r\nBasicCase(\"int16_t\", S16)\\\r\nBasicCase(\"char16\", Char16)\\\r\nBasicCase(\"int32\", S32)\\\r\nBasicCase(\"int32_t\", S32)\\\r\nBasicCase(\"char32\", Char32)\\\r\nBasicCase(\"int64\", S64)\\\r\nBasicCase(\"int64_t\", S64)\\\r\nBasicCase(\"int128\", S128)\\\r\nBasicCase(\"int128_t\", S128)\\\r\nBasicCase(\"int256\", S256)\\\r\nBasicCase(\"int256_t\", S256)\\\r\nBasicCase(\"int512\", S512)\\\r\nBasicCase(\"int512_t\", S512)\\\r\nBasicCase(\"void\", Void)\\\r\nBasicCase(\"bool\", Bool)\\\r\nBasicCase(\"float\", F32)\\\r\nBasicCase(\"float32\", F32)\\\r\nBasicCase(\"double\", F64)\\\r\nBasicCase(\"float64\", F64)\r\n#define BasicCase(str, kind) else if(str8_match(name, str8_lit(str), 0)) {result = e_type_key_basic(E_TypeKind_##kind);}\r\n  BuiltInType_XList\r\n#undef BasicCase\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_leaf_type_key_from_name(String8 name)\r\n{\r\n  E_TypeKey key = e_leaf_builtin_type_key_from_name(name);\r\n  if(!e_type_key_match(e_type_key_zero(), key))\r\n  {\r\n    DI_Match match = di_match_from_string(name, 0, e_base_ctx->primary_dbg_info->dbgi_key, 0);\r\n    if(match.section_kind == RDI_SectionKind_TypeNodes)\r\n    {\r\n      Access *access = access_open();\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0);\r\n      for EachIndex(idx, e_base_ctx->dbg_infos_count)\r\n      {\r\n        E_DbgInfo *dbg_info = &e_base_ctx->dbg_infos[idx];\r\n        if(dbg_info->rdi == rdi)\r\n        {\r\n          U32 type_idx = match.idx;\r\n          RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, type_idx);\r\n          key = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), type_idx, (U32)idx+1);\r\n          break;\r\n        }\r\n      }\r\n      access_close(access);\r\n    }\r\n  }\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_from_expr(E_Expr *expr)\r\n{\r\n  E_TypeKey result = zero_struct;\r\n  E_ExprKind kind = expr->kind;\r\n  switch(kind)\r\n  {\r\n    // TODO(rjf): do we support E_ExprKind_Func here?\r\n    default:{}break;\r\n    case E_ExprKind_LeafIdentifier:\r\n    {\r\n      result = e_leaf_type_key_from_name(expr->string);\r\n    }break;\r\n    case E_ExprKind_TypeIdent:\r\n    {\r\n      result = expr->type_key;\r\n    }break;\r\n    case E_ExprKind_Ptr:\r\n    {\r\n      E_TypeKey direct_type_key = e_type_key_from_expr(expr->first);\r\n      result = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, direct_type_key, 1, 0);\r\n    }break;\r\n    case E_ExprKind_Array:\r\n    {\r\n      E_Expr *child_expr = expr->first;\r\n      E_TypeKey direct_type_key = e_type_key_from_expr(child_expr);\r\n      result = e_type_key_cons_array(direct_type_key, expr->value.u64, 0);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_Parse\r\ne_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens)\r\n{\r\n  E_Parse parse = {tokens, 0, &e_expr_nil, &e_expr_nil};\r\n  E_Token *token_it = tokens.v;\r\n  \r\n  //- rjf: parse unsigned marker\r\n  B32 unsigned_marker = 0;\r\n  {\r\n    E_Token token = e_token_at_it(token_it, &tokens);\r\n    if(token.kind == E_TokenKind_Identifier)\r\n    {\r\n      String8 token_string = str8_substr(text, token.range);\r\n      if(str8_match(token_string, str8_lit(\"unsigned\"), 0))\r\n      {\r\n        token_it += 1;\r\n        unsigned_marker = 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: parse base type\r\n  {\r\n    E_Token token = e_token_at_it(token_it, &tokens);\r\n    if(token.kind == E_TokenKind_Identifier)\r\n    {\r\n      String8 token_string = str8_substr(text, token.range);\r\n      if(token_string.size >= 2 &&\r\n         token_string.str[0] == '`' &&\r\n         token_string.str[token_string.size-1] == '`')\r\n      {\r\n        token_string = str8_substr(token_string, r1u64(1, token_string.size-1));\r\n      }\r\n      E_TypeKey type_key = e_leaf_type_key_from_name(token_string);\r\n      if(!e_type_key_match(e_type_key_zero(), type_key))\r\n      {\r\n        token_it += 1;\r\n        \r\n        // rjf: apply unsigned marker to base type\r\n        if(unsigned_marker) switch(e_type_kind_from_key(type_key))\r\n        {\r\n          default:{}break;\r\n          case E_TypeKind_Char8: {type_key = e_type_key_basic(E_TypeKind_UChar8);}break;\r\n          case E_TypeKind_Char16:{type_key = e_type_key_basic(E_TypeKind_UChar16);}break;\r\n          case E_TypeKind_Char32:{type_key = e_type_key_basic(E_TypeKind_UChar32);}break;\r\n          case E_TypeKind_S8:  {type_key = e_type_key_basic(E_TypeKind_U8);}break;\r\n          case E_TypeKind_S16: {type_key = e_type_key_basic(E_TypeKind_U16);}break;\r\n          case E_TypeKind_S32: {type_key = e_type_key_basic(E_TypeKind_U32);}break;\r\n          case E_TypeKind_S64: {type_key = e_type_key_basic(E_TypeKind_U64);}break;\r\n          case E_TypeKind_S128:{type_key = e_type_key_basic(E_TypeKind_U128);}break;\r\n          case E_TypeKind_S256:{type_key = e_type_key_basic(E_TypeKind_U256);}break;\r\n          case E_TypeKind_S512:{type_key = e_type_key_basic(E_TypeKind_U512);}break;\r\n        }\r\n        \r\n        // rjf: construct leaf type\r\n        parse.expr = e_push_expr(arena, E_ExprKind_TypeIdent, token.range);\r\n        parse.expr->type_key = type_key;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: parse extensions\r\n  if(parse.expr != &e_expr_nil)\r\n  {\r\n    for(;;)\r\n    {\r\n      E_Token token = e_token_at_it(token_it, &tokens);\r\n      if(token.kind != E_TokenKind_Symbol)\r\n      {\r\n        break;\r\n      }\r\n      String8 token_string = str8_substr(text, token.range);\r\n      if(str8_match(token_string, str8_lit(\"*\"), 0))\r\n      {\r\n        token_it += 1;\r\n        E_Expr *ptee = parse.expr;\r\n        parse.expr = e_push_expr(arena, E_ExprKind_Ptr, token.range);\r\n        e_expr_push_child(parse.expr, ptee);\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill parse & end\r\n  parse.last_token = token_it;\r\n  return parse;\r\n}\r\n\r\ninternal E_Parse\r\ne_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  E_Token *it = tokens.v;\r\n  E_Token *it_opl = tokens.v + tokens.count;\r\n  E_Parse result = {tokens, 0, &e_expr_nil, &e_expr_nil};\r\n  \r\n  //////////////////////////////\r\n  //- rjf: parse chain of expressions\r\n  //\r\n  for(U64 chain_count = 0; it < it_opl && chain_count < max_chain_count;)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: exit on symbols callers may be waiting on\r\n    //\r\n    {\r\n      E_Token token = e_token_at_it(it, &tokens);\r\n      String8 token_string = str8_substr(text, token.range);\r\n      if(token.kind == E_TokenKind_Symbol &&\r\n         (str8_match(token_string, str8_lit(\")\"), 0) ||\r\n          str8_match(token_string, str8_lit(\"]\"), 0) ||\r\n          str8_match(token_string, str8_lit(\":\"), 0) ||\r\n          str8_match(token_string, str8_lit(\"?\"), 0)))\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: skip commas, semicolons, etc.\r\n    //\r\n    for(;it < it_opl;)\r\n    {\r\n      E_Token token = e_token_at_it(it, &tokens);\r\n      String8 token_string = str8_substr(text, token.range);\r\n      if(token.kind == E_TokenKind_Symbol &&\r\n         (str8_match(token_string, str8_lit(\",\"), 0) ||\r\n          str8_match(token_string, str8_lit(\";\"), 0)))\r\n      {\r\n        it += 1;\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse atom, gather prefix unary tasks\r\n    //\r\n    typedef struct PrefixUnaryTask PrefixUnaryTask;\r\n    struct PrefixUnaryTask\r\n    {\r\n      PrefixUnaryTask *next;\r\n      E_ExprKind kind;\r\n      Rng1U64 range;\r\n      E_Expr *cast_type_expr;\r\n    };\r\n    PrefixUnaryTask *first_prefix_unary = 0;\r\n    PrefixUnaryTask *last_prefix_unary = 0;\r\n    E_Expr *atom = &e_expr_nil;\r\n    B32 atom_is_maybe_cast = 0;\r\n    for(B32 done = 0; !done && it < it_opl;)\r\n    {\r\n      //////////////////////////\r\n      //- rjf: prefix unary operators\r\n      //\r\n      {\r\n        E_Token token = e_token_at_it(it, &tokens);\r\n        String8 token_string = str8_substr(text, token.range);\r\n        S64 prefix_unary_precedence = 0;\r\n        E_ExprKind prefix_unary_kind = 0;\r\n        E_Expr *prefix_unary_cast_expr = &e_expr_nil;\r\n        \r\n        // rjf: try op table\r\n        for EachNonZeroEnumVal(E_ExprKind, k)\r\n        {\r\n          E_OpInfo *op_info = &e_expr_kind_op_info_table[k];\r\n          if(op_info->kind == E_OpKind_UnaryPrefix && str8_match(str8_skip_chop_whitespace(op_info->pre), token_string, 0))\r\n          {\r\n            prefix_unary_precedence = op_info->precedence;\r\n            prefix_unary_kind = k;\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: if we found a symbolic prefix unary operator, but we are\r\n        // looking for a casted expression, then we need to abort this\r\n        // path. C-style casts are only legal in very simple and unambiguous\r\n        // cases, e.g. (x)123, but they cannot be made legal in more\r\n        // complex cases like (x) * y, because this is fundamentally ambiguous\r\n        // (the meaning / tree shape / etc. is entirely different depending on\r\n        // the type / mode of `x`).\r\n        //\r\n        // because of things like hover-evaluation we do actually want to\r\n        // support basic C-style casts. but past a certain point of complexity,\r\n        // we will simply require usage of the explicit `cast` operator.\r\n        //\r\n        if(prefix_unary_precedence != 0 && atom_is_maybe_cast)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: try 'unsigned' marker\r\n        if(str8_match(token_string, str8_lit(\"unsigned\"), 0))\r\n        {\r\n          prefix_unary_kind = E_ExprKind_Unsigned;\r\n          prefix_unary_precedence = 2;\r\n        }\r\n        \r\n        // rjf: try explicit cast\r\n        if(str8_match(token_string, str8_lit(\"cast\"), 0))\r\n        {\r\n          // rjf: consume cast & open paren\r\n          E_Token open_paren_maybe = e_token_at_it(it+1, &tokens);\r\n          String8 open_paren_maybe_string = str8_substr(text, open_paren_maybe.range);\r\n          if(!str8_match(open_paren_maybe_string, str8_lit(\"(\"), 0))\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Expected `(` following `cast`.\");\r\n            goto end_cast_parse;\r\n          }\r\n          it += 2;\r\n          \r\n          // rjf: parse type expression\r\n          E_Parse type_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n          e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);\r\n          it = type_parse.last_token;\r\n          \r\n          // rjf: expect )\r\n          E_Token close_paren_maybe = e_token_at_it(it, &tokens);\r\n          String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range);\r\n          if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(\")\"), 0))\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Missing `)`.\");\r\n          }\r\n          \r\n          // rjf: require type\r\n          if(type_parse.expr == &e_expr_nil)\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Expected type in `cast(...)`.\");\r\n          }\r\n          \r\n          // rjf: fill prefix unary info\r\n          else\r\n          {\r\n            prefix_unary_kind = E_ExprKind_Cast;\r\n            prefix_unary_precedence = 2;\r\n            prefix_unary_cast_expr = type_parse.expr;\r\n          }\r\n          end_cast_parse:;\r\n        }\r\n        \r\n        // rjf: push prefix unary if we got one\r\n        if(prefix_unary_precedence != 0)\r\n        {\r\n          PrefixUnaryTask *prefix_unary_task = push_array(scratch.arena, PrefixUnaryTask, 1);\r\n          prefix_unary_task->kind = prefix_unary_kind;\r\n          prefix_unary_task->range = token.range;\r\n          prefix_unary_task->cast_type_expr = prefix_unary_cast_expr;\r\n          SLLQueuePush(first_prefix_unary, last_prefix_unary, prefix_unary_task);\r\n          it += 1;\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: try to parse an atom\r\n      //\r\n      if(atom == &e_expr_nil || atom_is_maybe_cast)\r\n      {\r\n        B32 got_new_atom = 0;\r\n        E_Expr *maybe_cast = atom_is_maybe_cast ? atom : &e_expr_nil;\r\n        atom_is_maybe_cast = 0;\r\n        \r\n        ////////////////////////\r\n        //- rjf: consume resolution qualifiers\r\n        //\r\n        String8 resolution_qualifier = {0};\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_Identifier)\r\n          {\r\n            E_Token next_token = e_token_at_it(it+1, &tokens);\r\n            String8 next_token_string = str8_substr(text, next_token.range);\r\n            if(next_token.range.min == token.range.max && next_token.kind == E_TokenKind_Symbol && str8_match(next_token_string, str8_lit(\":\"), 0))\r\n            {\r\n              it += 2;\r\n              resolution_qualifier = token_string;\r\n            }\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: descent to nested expression (...)\r\n        //\r\n        if(!got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit(\"(\"), 0))\r\n          {\r\n            // rjf: skip (\r\n            it += 1;\r\n            \r\n            // rjf: parse () contents\r\n            E_Parse nested_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n            e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);\r\n            atom = nested_parse.expr;\r\n            it = nested_parse.last_token;\r\n            atom_is_maybe_cast = 1;\r\n            got_new_atom = 1;\r\n            \r\n            // rjf: expect )\r\n            E_Token close_paren_maybe = e_token_at_it(it, &tokens);\r\n            String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range);\r\n            if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(\")\"), 0))\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Missing `)`.\");\r\n            }\r\n            \r\n            // rjf: consume )\r\n            else\r\n            {\r\n              it += 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: descent to assembly-style dereference sub-expression [...]\r\n        //\r\n        if(atom == &e_expr_nil && !got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit(\"[\"), 0))\r\n          {\r\n            // rjf: skip [\r\n            it += 1;\r\n            \r\n            // rjf: parse [] contents\r\n            E_Parse nested_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n            e_msg_list_concat_in_place(&result.msgs, &nested_parse.msgs);\r\n            atom = nested_parse.expr;\r\n            it = nested_parse.last_token;\r\n            got_new_atom = 1;\r\n            \r\n            // rjf: build cast-to-U64*, and dereference operators\r\n            if(nested_parse.expr == &e_expr_nil)\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Expected expression following `[`.\");\r\n            }\r\n            else\r\n            {\r\n              E_Expr *type = e_push_expr(arena, E_ExprKind_TypeIdent, token.range);\r\n              type->type_key = e_type_key_cons_ptr(e_base_ctx->primary_module->arch, e_type_key_basic(E_TypeKind_U64), 1, 0);\r\n              E_Expr *casted = atom;\r\n              E_Expr *cast = e_push_expr(arena, E_ExprKind_Cast, token.range);\r\n              e_expr_push_child(cast, type);\r\n              e_expr_push_child(cast, casted);\r\n              atom = e_push_expr(arena, E_ExprKind_Deref, token.range);\r\n              e_expr_push_child(atom, cast);\r\n            }\r\n            \r\n            // rjf: expect ]\r\n            E_Token close_paren_maybe = e_token_at_it(it, &tokens);\r\n            String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range);\r\n            if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(\"]\"), 0))\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Missing `]`.\");\r\n            }\r\n            \r\n            // rjf: consume )\r\n            else\r\n            {\r\n              it += 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: leaf identifier\r\n        //\r\n        if(!got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          \r\n          // rjf: skip no-op prefix keywords\r\n          if(token.kind == E_TokenKind_Identifier &&\r\n             (str8_match(token_string, str8_lit(\"struct\"), 0) ||\r\n              str8_match(token_string, str8_lit(\"union\"), 0) ||\r\n              str8_match(token_string, str8_lit(\"enum\"), 0) ||\r\n              str8_match(token_string, str8_lit(\"class\"), 0) ||\r\n              str8_match(token_string, str8_lit(\"typename\"), 0)))\r\n          {\r\n            it += 1;\r\n            token = e_token_at_it(it, &tokens);\r\n            token_string = str8_substr(text, token.range);\r\n          }\r\n          \r\n          // rjf: build identifier atom\r\n          if(token.kind == E_TokenKind_Identifier)\r\n          {\r\n            String8 identifier_string = token_string;\r\n            if(identifier_string.size >= 2 && identifier_string.str[0] == '`' && identifier_string.str[identifier_string.size-1] == '`')\r\n            {\r\n              identifier_string = str8_skip(str8_chop(identifier_string, 1), 1);\r\n            }\r\n            atom = e_push_expr(arena, E_ExprKind_LeafIdentifier, token.range);\r\n            atom->string = identifier_string;\r\n            it += 1;\r\n            got_new_atom = 1;\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: leaf numeric\r\n        //\r\n        if(!got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_Numeric)\r\n          {\r\n            U64 dot_pos = str8_find_needle(token_string, 0, str8_lit(\".\"), 0);\r\n            it += 1;\r\n            \r\n            // rjf: no . => integral\r\n            if(dot_pos == token_string.size)\r\n            {\r\n              U64 val = 0;\r\n              try_u64_from_str8_c_rules(token_string, &val);\r\n              atom = e_push_expr(arena, E_ExprKind_LeafU64, token.range);\r\n              atom->value.u64 = val;\r\n            }\r\n            \r\n            // rjf: presence of . => double or float\r\n            if(dot_pos < token_string.size)\r\n            {\r\n              F64 val = f64_from_str8(token_string);\r\n              U64 f_pos = str8_find_needle(token_string, 0, str8_lit(\"f\"), StringMatchFlag_CaseInsensitive);\r\n              \r\n              // rjf: presence of f after . => f32\r\n              if(f_pos < token_string.size)\r\n              {\r\n                atom = e_push_expr(arena, E_ExprKind_LeafF32, token.range);\r\n                atom->value.f32 = val;\r\n              }\r\n              \r\n              // rjf: no f => f64\r\n              else\r\n              {\r\n                atom = e_push_expr(arena, E_ExprKind_LeafF64, token.range);\r\n                atom->value.f64 = val;\r\n              }\r\n            }\r\n            \r\n            got_new_atom = 1;\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: leaf char literal\r\n        //\r\n        if(!got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_CharLiteral)\r\n          {\r\n            it += 1;\r\n            if(token_string.size > 1 && token_string.str[0] == '\\'' && token_string.str[1] != '\\'')\r\n            {\r\n              String8 char_literal_escaped = str8_skip(str8_chop(token_string, 1), 1);\r\n              String8 char_literal_raw = raw_from_escaped_str8(scratch.arena, char_literal_escaped);\r\n              U8 char_val = char_literal_raw.size > 0 ? char_literal_raw.str[0] : 0;\r\n              atom = e_push_expr(arena, E_ExprKind_LeafU64, token.range);\r\n              atom->value.u64 = (U64)char_val;\r\n              got_new_atom = 1;\r\n            }\r\n            else\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Malformed character literal.\");\r\n            }\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: filesystem-qualified leaf string literal\r\n        //\r\n        if(!got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_StringLiteral &&\r\n             (str8_match(resolution_qualifier, str8_lit(\"file\"), 0) ||\r\n              str8_match(resolution_qualifier, str8_lit(\"folder\"), 0)))\r\n          {\r\n            String8 string_value_escaped = str8_chop(str8_skip(token_string, 1), 1);\r\n            String8 string_value_raw = raw_from_escaped_str8(arena, string_value_escaped);\r\n            atom = e_push_expr(arena, E_ExprKind_LeafFilePath, token.range);\r\n            atom->string = string_value_raw;\r\n            it += 1;\r\n            got_new_atom = 1;\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: leaf string literal\r\n        //\r\n        if(!got_new_atom)\r\n        {\r\n          E_Token token = e_token_at_it(it, &tokens);\r\n          String8 token_string = str8_substr(text, token.range);\r\n          if(token.kind == E_TokenKind_StringLiteral)\r\n          {\r\n            String8 string_value_escaped = str8_chop(str8_skip(token_string, 1), 1);\r\n            String8 string_value_raw = raw_from_escaped_str8(arena, string_value_escaped);\r\n            atom = e_push_expr(arena, E_ExprKind_LeafStringLiteral, token.range);\r\n            atom->string = string_value_raw;\r\n            it += 1;\r\n            got_new_atom = 1;\r\n          }\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: upgrade atom w/ qualifier\r\n        //\r\n        if(atom != &e_expr_nil && resolution_qualifier.size != 0)\r\n        {\r\n          atom->qualifier = resolution_qualifier;\r\n        }\r\n        \r\n        ////////////////////////\r\n        //- rjf: got new atom, but we had a potential cast atom? -> gather cast operator\r\n        //\r\n        if(got_new_atom && maybe_cast != &e_expr_nil)\r\n        {\r\n          PrefixUnaryTask *prefix_unary_task = push_array(scratch.arena, PrefixUnaryTask, 1);\r\n          prefix_unary_task->kind = E_ExprKind_Cast;\r\n          prefix_unary_task->range = maybe_cast->range;\r\n          prefix_unary_task->cast_type_expr = maybe_cast;\r\n          SLLQueuePush(first_prefix_unary, last_prefix_unary, prefix_unary_task);\r\n        }\r\n      }\r\n      \r\n      ////////////////////////\r\n      //- rjf: if our atom is not potentially a cast, *or* if we simply did not get an atom, \r\n      // then we need to stop parsing at this stage.\r\n      //\r\n      done = (!atom_is_maybe_cast || atom == &e_expr_nil);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: upgrade atom w/ postfix unaries\r\n    //\r\n    if(atom != &e_expr_nil) for(;it < it_opl;)\r\n    {\r\n      E_Token token = e_token_at_it(it, &tokens);\r\n      String8 token_string = str8_substr(text, token.range);\r\n      B32 is_postfix_unary = 0;\r\n      \r\n      // rjf: dot/arrow operator\r\n      if(max_precedence >= 1 &&\r\n         token.kind == E_TokenKind_Symbol &&\r\n         (str8_match(token_string, str8_lit(\".\"), 0) ||\r\n          str8_match(token_string, str8_lit(\"->\"), 0)))\r\n      {\r\n        is_postfix_unary = 1;\r\n        \r\n        // rjf: advance past operator\r\n        it += 1;\r\n        \r\n        // rjf: look for member name\r\n        E_Token member_name_maybe = e_token_at_it(it, &tokens);\r\n        String8 member_name_maybe_string = str8_substr(text, member_name_maybe.range);\r\n        B32 member_name_is_good = (member_name_maybe.kind == E_TokenKind_Identifier);\r\n        \r\n        // rjf: build dot-operator tree\r\n        E_Expr *lhs = atom;\r\n        E_Expr *rhs = &e_expr_nil;\r\n        if(member_name_is_good)\r\n        {\r\n          rhs = e_push_expr(arena, E_ExprKind_LeafIdentifier, member_name_maybe.range);\r\n          rhs->string = member_name_maybe_string;\r\n        }\r\n        atom = e_push_expr(arena, E_ExprKind_MemberAccess, token.range);\r\n        e_expr_push_child(atom, lhs);\r\n        if(member_name_is_good)\r\n        {\r\n          e_expr_push_child(atom, rhs);\r\n        }\r\n        \r\n        // rjf: no identifier after `.`? -> error\r\n        if(member_name_is_good)\r\n        {\r\n          it += 1;\r\n        }\r\n        else\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Missing member name after `%S`.\", token_string);\r\n        }\r\n      }\r\n      \r\n      // rjf: array index\r\n      if(token.kind == E_TokenKind_Symbol &&\r\n         str8_match(token_string, str8_lit(\"[\"), 0))\r\n      {\r\n        is_postfix_unary = 1;\r\n        \r\n        // rjf: advance past [\r\n        it += 1;\r\n        \r\n        // rjf: parse indexing expression\r\n        E_Parse idx_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n        e_msg_list_concat_in_place(&result.msgs, &idx_expr_parse.msgs);\r\n        it = idx_expr_parse.last_token;\r\n        \r\n        // rjf: valid indexing expression => produce index expr\r\n        if(idx_expr_parse.expr != &e_expr_nil)\r\n        {\r\n          E_Expr *array_expr = atom;\r\n          E_Expr *index_expr = idx_expr_parse.expr;\r\n          atom = e_push_expr(arena, E_ExprKind_ArrayIndex, token.range);\r\n          e_expr_push_child(atom, array_expr);\r\n          e_expr_push_child(atom, index_expr);\r\n        }\r\n        \r\n        // rjf: expect ]\r\n        {\r\n          E_Token close_brace_maybe = e_token_at_it(it, &tokens);\r\n          String8 close_brace_maybe_string = str8_substr(text, close_brace_maybe.range);\r\n          if(close_brace_maybe.kind != E_TokenKind_Symbol || !str8_match(close_brace_maybe_string, str8_lit(\"]\"), 0))\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Unclosed `[`.\");\r\n          }\r\n          else\r\n          {\r\n            it += 1;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: calls\r\n      if(token.kind == E_TokenKind_Symbol &&\r\n         str8_match(token_string, str8_lit(\"(\"), 0))\r\n      {\r\n        is_postfix_unary = 1;\r\n        \r\n        // rjf: skip (\r\n        it += 1;\r\n        \r\n        // rjf: parse all argument expressions\r\n        E_Expr *callee_expr = atom;\r\n        E_Expr *call_expr = e_push_expr(arena, E_ExprKind_Call, token.range);\r\n        call_expr->string = callee_expr->string;\r\n        e_expr_push_child(call_expr, callee_expr);\r\n        E_Parse args_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, max_U64);\r\n        e_msg_list_concat_in_place(&result.msgs, &args_parse.msgs);\r\n        it = args_parse.last_token;\r\n        if(args_parse.expr != &e_expr_nil)\r\n        {\r\n          call_expr->last->next = args_parse.expr;\r\n          args_parse.expr->prev = call_expr->last;\r\n          for(E_Expr *arg = args_parse.expr; arg != &e_expr_nil; arg = arg->next)\r\n          {\r\n            call_expr->last = arg;\r\n          }\r\n        }\r\n        atom = call_expr;\r\n        \r\n        // rjf: expect )\r\n        {\r\n          E_Token close_paren_maybe = e_token_at_it(it, &tokens);\r\n          String8 close_paren_maybe_string = str8_substr(text, close_paren_maybe.range);\r\n          if(close_paren_maybe.kind != E_TokenKind_Symbol || !str8_match(close_paren_maybe_string, str8_lit(\")\"), 0))\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Unclosed `(`.\");\r\n            call_expr->range.max = text.size;\r\n          }\r\n          else\r\n          {\r\n            call_expr->range = union_1u64(call_expr->range, close_paren_maybe.range);\r\n            it += 1;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: \"as\" style casts\r\n      if(token.kind == E_TokenKind_Identifier &&\r\n         str8_match(token_string, str8_lit(\"as\"), 0))\r\n      {\r\n        it += 1;\r\n        \r\n        // rjf: parse type expression\r\n        E_Parse type_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n        e_msg_list_concat_in_place(&result.msgs, &type_parse.msgs);\r\n        it = type_parse.last_token;\r\n        \r\n        // rjf: require type\r\n        if(type_parse.expr == &e_expr_nil)\r\n        {\r\n          e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Expected type following `as`.\");\r\n        }\r\n        \r\n        // rjf: build cast expr\r\n        else\r\n        {\r\n          E_Expr *rhs = atom;\r\n          atom = e_push_expr(arena, E_ExprKind_Cast, token.range);\r\n          e_expr_push_child(atom, type_parse.expr);\r\n          e_expr_push_child(atom, rhs);\r\n        }\r\n      }\r\n      \r\n      // rjf: quit if this doesn't look like any patterns of postfix unary we know\r\n      if(!is_postfix_unary)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: no atom, just single `unsigned` prefix unary? -> unsigned int type expr\r\n    //\r\n    if(atom == &e_expr_nil &&\r\n       first_prefix_unary != 0 &&\r\n       first_prefix_unary->kind == E_ExprKind_Unsigned)\r\n    {\r\n      atom = e_push_expr(arena, E_ExprKind_LeafIdentifier, first_prefix_unary->cast_type_expr->range);\r\n      atom->string = str8_lit(\"int\");\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: upgrade `atom` w/ previously parsed prefix unaries\r\n    //\r\n    if(atom != &e_expr_nil)\r\n    {\r\n      for(PrefixUnaryTask *prefix_unary = first_prefix_unary;\r\n          prefix_unary != 0;\r\n          prefix_unary = prefix_unary->next)\r\n      {\r\n        if(prefix_unary->kind == E_ExprKind_Cast)\r\n        {\r\n          E_Expr *rhs = atom;\r\n          atom = e_push_expr(arena, prefix_unary->kind, prefix_unary->range);\r\n          e_expr_push_child(atom, prefix_unary->cast_type_expr);\r\n          e_expr_push_child(atom, rhs);\r\n        }\r\n        else\r\n        {\r\n          E_Expr *rhs = atom;\r\n          atom = e_push_expr(arena, prefix_unary->kind, prefix_unary->range);\r\n          e_expr_push_child(atom, rhs);\r\n        }\r\n      }\r\n    }\r\n    else if(first_prefix_unary != 0)\r\n    {\r\n      e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, last_prefix_unary->range, \"Missing expression.\");\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse complex operators to further extend `atom`\r\n    //\r\n    if(atom != &e_expr_nil) for(;it < it_opl;)\r\n    {\r\n      E_Token *start_it = it;\r\n      E_Token token = e_token_at_it(it, &tokens);\r\n      String8 token_string = str8_substr(text, token.range);\r\n      \r\n      //- rjf: parse binaries\r\n      {\r\n        // rjf: first try to find a matching binary operator\r\n        S64 binary_precedence = 0;\r\n        E_ExprKind binary_kind = 0;\r\n        for EachNonZeroEnumVal(E_ExprKind, k)\r\n        {\r\n          E_OpInfo *op_info = &e_expr_kind_op_info_table[k];\r\n          if(op_info->kind == E_OpKind_Binary && str8_match(str8_skip_chop_whitespace(op_info->sep), token_string, 0))\r\n          {\r\n            binary_precedence = op_info->precedence;\r\n            binary_kind = k;\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: if we got a valid binary precedence, and it's not to be handled by\r\n        // a caller, then we need to parse the right-hand-side with a tighter\r\n        // precedence\r\n        if(binary_precedence != 0 && binary_precedence <= max_precedence)\r\n        {\r\n          E_Parse rhs_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it+1, it_opl), binary_precedence-1, 1);\r\n          e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);\r\n          E_Expr *rhs = rhs_expr_parse.expr;\r\n          it = rhs_expr_parse.last_token;\r\n          if(rhs == &e_expr_nil && binary_kind == E_ExprKind_Mul)\r\n          {\r\n            // NOTE(rjf): C-style pointer syntax is shared with multiplication.\r\n            // carving out a special case here to allow \"unfinished *s\" to be\r\n            // treated as pointers instead.\r\n            E_Expr *ptee = atom;\r\n            atom = e_push_expr(arena, E_ExprKind_Ptr, token.range);\r\n            e_expr_push_child(atom, ptee);\r\n          }\r\n          else if(rhs == &e_expr_nil)\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Missing right-hand-side of `%S`.\", token_string);\r\n          }\r\n          else\r\n          {\r\n            E_Expr *lhs = atom;\r\n            atom = e_push_expr(arena, binary_kind, token.range);\r\n            e_expr_push_child(atom, lhs);\r\n            e_expr_push_child(atom, rhs);\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: parse ternaries\r\n      {\r\n        if(token.kind == E_TokenKind_Symbol && str8_match(token_string, str8_lit(\"?\"), 0) && 13 <= max_precedence)\r\n        {\r\n          it += 1;\r\n          \r\n          // rjf: parse middle expression\r\n          E_Parse middle_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n          it = middle_expr_parse.last_token;\r\n          E_Expr *middle_expr = middle_expr_parse.expr;\r\n          e_msg_list_concat_in_place(&result.msgs, &middle_expr_parse.msgs);\r\n          if(middle_expr_parse.expr == &e_expr_nil)\r\n          {\r\n            e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Expected expression after `?`.\");\r\n          }\r\n          \r\n          // rjf: expect :\r\n          B32 got_colon = 0;\r\n          E_Token colon_token = zero_struct;\r\n          String8 colon_token_string = {0};\r\n          {\r\n            E_Token colon_token_maybe = e_token_at_it(it, &tokens);\r\n            String8 colon_token_maybe_string = str8_substr(text, colon_token_maybe.range);\r\n            if(colon_token_maybe.kind != E_TokenKind_Symbol || !str8_match(colon_token_maybe_string, str8_lit(\":\"), 0))\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, token.range, \"Expected `:` after `?`.\");\r\n            }\r\n            else\r\n            {\r\n              got_colon = 1;\r\n              colon_token = colon_token_maybe;\r\n              colon_token_string = colon_token_maybe_string;\r\n              it += 1;\r\n            }\r\n          }\r\n          \r\n          // rjf: parse rhs\r\n          E_Parse rhs_expr_parse = e_push_parse_from_string_tokens__prec(arena, text, e_token_array_make_first_opl(it, it_opl), e_max_precedence, 1);\r\n          if(got_colon)\r\n          {\r\n            it = rhs_expr_parse.last_token;\r\n            e_msg_list_concat_in_place(&result.msgs, &rhs_expr_parse.msgs);\r\n            if(rhs_expr_parse.expr == &e_expr_nil)\r\n            {\r\n              e_msgf(arena, &result.msgs, E_MsgKind_MalformedInput, colon_token.range, \"Expected expression after `:`.\");\r\n            }\r\n          }\r\n          \r\n          // rjf: build ternary\r\n          if(atom != &e_expr_nil &&\r\n             middle_expr_parse.expr != &e_expr_nil &&\r\n             rhs_expr_parse.expr != &e_expr_nil)\r\n          {\r\n            E_Expr *lhs = atom;\r\n            E_Expr *mhs = middle_expr_parse.expr;\r\n            E_Expr *rhs = rhs_expr_parse.expr;\r\n            atom = e_push_expr(arena, E_ExprKind_Ternary, token.range);\r\n            e_expr_push_child(atom, lhs);\r\n            e_expr_push_child(atom, mhs);\r\n            e_expr_push_child(atom, rhs);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: if we parsed nothing successfully, we're done\r\n      if(it == start_it)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    \r\n    //- rjf: store parsed atom to expression chain - if we didn't get an expression, break\r\n    if(atom != &e_expr_nil)\r\n    {\r\n      DLLPushBack_NPZ(&e_expr_nil, result.expr, result.last_expr, atom, next, prev);\r\n      chain_count += 1;\r\n    }\r\n    else\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill result & return\r\n  result.last_token = it;\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal E_Parse\r\ne_push_parse_from_string(Arena *arena, String8 text)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  E_TokenArray tokens = e_token_array_from_text(scratch.arena, text);\r\n  E_Parse parse = e_push_parse_from_string_tokens__prec(arena, text, tokens, e_max_precedence, max_U64);\r\n  scratch_end(scratch);\r\n  return parse;\r\n}\r\n"
  },
  {
    "path": "src/eval/eval_parse.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_PARSE_H\r\n#define EVAL_PARSE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Tokenization Functions\r\n\r\n#define e_token_at_it(it, arr) (((arr)->v <= (it) && (it) < (arr)->v+(arr)->count) ? (*(it)) : e_token_zero())\r\ninternal E_Token e_token_zero(void);\r\ninternal void e_token_chunk_list_push(Arena *arena, E_TokenChunkList *list, U64 chunk_size, E_Token *token);\r\ninternal E_TokenArray e_token_array_from_chunk_list(Arena *arena, E_TokenChunkList *list);\r\ninternal E_TokenArray e_token_array_from_text(Arena *arena, String8 text);\r\ninternal E_TokenArray e_token_array_make_first_opl(E_Token *first, E_Token *opl);\r\n\r\n////////////////////////////////\r\n//~ rjf: Expression Tree Building Functions\r\n\r\ninternal E_Expr *e_push_expr(Arena *arena, E_ExprKind kind, Rng1U64 range);\r\ninternal void e_expr_insert_child(E_Expr *parent, E_Expr *prev, E_Expr *child);\r\ninternal void e_expr_push_child(E_Expr *parent, E_Expr *child);\r\ninternal void e_expr_remove_child(E_Expr *parent, E_Expr *child);\r\ninternal E_Expr *e_expr_ref(Arena *arena, E_Expr *ref);\r\ninternal E_Expr *e_expr_copy(Arena *arena, E_Expr *src);\r\ninternal void e_expr_list_push(Arena *arena, E_ExprList *list, E_Expr *expr);\r\n\r\n////////////////////////////////\r\n//~ rjf: Expression Tree -> String Conversions\r\n\r\ninternal void e_append_strings_from_expr(Arena *arena, E_Expr *expr, String8 parent_expr_string, String8List *out);\r\ninternal String8 e_string_from_expr(Arena *arena, E_Expr *expr, String8 parent_expr_string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Parsing Functions\r\n\r\ninternal E_TypeKey e_leaf_builtin_type_key_from_name(String8 name);\r\ninternal E_TypeKey e_leaf_type_key_from_name(String8 name);\r\ninternal E_TypeKey e_type_key_from_expr(E_Expr *expr);\r\ninternal E_Parse e_push_type_parse_from_text_tokens(Arena *arena, String8 text, E_TokenArray tokens);\r\ninternal E_Parse e_push_parse_from_string_tokens__prec(Arena *arena, String8 text, E_TokenArray tokens, S64 max_precedence, U64 max_chain_count);\r\ninternal E_Parse e_push_parse_from_string(Arena *arena, String8 text);\r\n\r\n#endif // EVAL_PARSE_H\r\n"
  },
  {
    "path": "src/eval/eval_types.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Kind Enum Functions\r\n\r\ninternal E_TypeKind\r\ne_type_kind_from_base(TypeKind kind)\r\n{\r\n  E_TypeKind result = E_TypeKind_Null;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case TypeKind_Void:  {result = E_TypeKind_Void;}break;\r\n    case TypeKind_U8:    {result = E_TypeKind_U8;}break;\r\n    case TypeKind_U16:   {result = E_TypeKind_U16;}break;\r\n    case TypeKind_U32:   {result = E_TypeKind_U32;}break;\r\n    case TypeKind_U64:   {result = E_TypeKind_U64;}break;\r\n    case TypeKind_S8:    {result = E_TypeKind_S8;}break;\r\n    case TypeKind_S16:   {result = E_TypeKind_S16;}break;\r\n    case TypeKind_S32:   {result = E_TypeKind_S32;}break;\r\n    case TypeKind_S64:   {result = E_TypeKind_S64;}break;\r\n    case TypeKind_B8:    {result = E_TypeKind_S8;}break;\r\n    case TypeKind_B16:   {result = E_TypeKind_S16;}break;\r\n    case TypeKind_B32:   {result = E_TypeKind_S32;}break;\r\n    case TypeKind_B64:   {result = E_TypeKind_S64;}break;\r\n    case TypeKind_F32:   {result = E_TypeKind_F32;}break;\r\n    case TypeKind_F64:   {result = E_TypeKind_F64;}break;\r\n    case TypeKind_Ptr:   {result = E_TypeKind_Ptr;}break;\r\n    case TypeKind_Array: {result = E_TypeKind_Array;}break;\r\n    case TypeKind_Struct:{result = E_TypeKind_Struct;}break;\r\n    case TypeKind_Union: {result = E_TypeKind_Union;}break;\r\n    case TypeKind_Enum:  {result = E_TypeKind_Enum;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKind\r\ne_type_kind_from_rdi(RDI_TypeKind kind)\r\n{\r\n  E_TypeKind result = E_TypeKind_Null;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case RDI_TypeKind_Void:                   {result = E_TypeKind_Void;}break;\r\n    case RDI_TypeKind_Handle:                 {result = E_TypeKind_Handle;}break;\r\n    case RDI_TypeKind_HResult:                {result = E_TypeKind_HResult;}break;\r\n    case RDI_TypeKind_Char8:                  {result = E_TypeKind_Char8;}break;\r\n    case RDI_TypeKind_Char16:                 {result = E_TypeKind_Char16;}break;\r\n    case RDI_TypeKind_Char32:                 {result = E_TypeKind_Char32;}break;\r\n    case RDI_TypeKind_UChar8:                 {result = E_TypeKind_UChar8;}break;\r\n    case RDI_TypeKind_UChar16:                {result = E_TypeKind_UChar16;}break;\r\n    case RDI_TypeKind_UChar32:                {result = E_TypeKind_UChar32;}break;\r\n    case RDI_TypeKind_U8:                     {result = E_TypeKind_U8;}break;\r\n    case RDI_TypeKind_U16:                    {result = E_TypeKind_U16;}break;\r\n    case RDI_TypeKind_U32:                    {result = E_TypeKind_U32;}break;\r\n    case RDI_TypeKind_U64:                    {result = E_TypeKind_U64;}break;\r\n    case RDI_TypeKind_U128:                   {result = E_TypeKind_U128;}break;\r\n    case RDI_TypeKind_U256:                   {result = E_TypeKind_U256;}break;\r\n    case RDI_TypeKind_U512:                   {result = E_TypeKind_U512;}break;\r\n    case RDI_TypeKind_S8:                     {result = E_TypeKind_S8;}break;\r\n    case RDI_TypeKind_S16:                    {result = E_TypeKind_S16;}break;\r\n    case RDI_TypeKind_S32:                    {result = E_TypeKind_S32;}break;\r\n    case RDI_TypeKind_S64:                    {result = E_TypeKind_S64;}break;\r\n    case RDI_TypeKind_S128:                   {result = E_TypeKind_S128;}break;\r\n    case RDI_TypeKind_S256:                   {result = E_TypeKind_S256;}break;\r\n    case RDI_TypeKind_S512:                   {result = E_TypeKind_S512;}break;\r\n    case RDI_TypeKind_Bool:                   {result = E_TypeKind_Bool;}break;\r\n    case RDI_TypeKind_F16:                    {result = E_TypeKind_F16;}break;\r\n    case RDI_TypeKind_F32:                    {result = E_TypeKind_F32;}break;\r\n    case RDI_TypeKind_F32PP:                  {result = E_TypeKind_F32PP;}break;\r\n    case RDI_TypeKind_F48:                    {result = E_TypeKind_F48;}break;\r\n    case RDI_TypeKind_F64:                    {result = E_TypeKind_F64;}break;\r\n    case RDI_TypeKind_F80:                    {result = E_TypeKind_F80;}break;\r\n    case RDI_TypeKind_F128:                   {result = E_TypeKind_F128;}break;\r\n    case RDI_TypeKind_ComplexF32:             {result = E_TypeKind_ComplexF32;}break;\r\n    case RDI_TypeKind_ComplexF64:             {result = E_TypeKind_ComplexF64;}break;\r\n    case RDI_TypeKind_ComplexF80:             {result = E_TypeKind_ComplexF80;}break;\r\n    case RDI_TypeKind_ComplexF128:            {result = E_TypeKind_ComplexF128;}break;\r\n    case RDI_TypeKind_Modifier:               {result = E_TypeKind_Modifier;}break;\r\n    case RDI_TypeKind_Ptr:                    {result = E_TypeKind_Ptr;}break;\r\n    case RDI_TypeKind_LRef:                   {result = E_TypeKind_LRef;}break;\r\n    case RDI_TypeKind_RRef:                   {result = E_TypeKind_RRef;}break;\r\n    case RDI_TypeKind_Array:                  {result = E_TypeKind_Array;}break;\r\n    case RDI_TypeKind_Function:               {result = E_TypeKind_Function;}break;\r\n    case RDI_TypeKind_Method:                 {result = E_TypeKind_Method;}break;\r\n    case RDI_TypeKind_MemberPtr:              {result = E_TypeKind_MemberPtr;}break;\r\n    case RDI_TypeKind_Struct:                 {result = E_TypeKind_Struct;}break;\r\n    case RDI_TypeKind_Class:                  {result = E_TypeKind_Class;}break;\r\n    case RDI_TypeKind_Union:                  {result = E_TypeKind_Union;}break;\r\n    case RDI_TypeKind_Enum:                   {result = E_TypeKind_Enum;}break;\r\n    case RDI_TypeKind_Alias:                  {result = E_TypeKind_Alias;}break;\r\n    case RDI_TypeKind_IncompleteStruct:       {result = E_TypeKind_IncompleteStruct;}break;\r\n    case RDI_TypeKind_IncompleteUnion:        {result = E_TypeKind_IncompleteUnion;}break;\r\n    case RDI_TypeKind_IncompleteClass:        {result = E_TypeKind_IncompleteClass;}break;\r\n    case RDI_TypeKind_IncompleteEnum:         {result = E_TypeKind_IncompleteEnum;}break;\r\n    case RDI_TypeKind_Bitfield:               {result = E_TypeKind_Bitfield;}break;\r\n    case RDI_TypeKind_Variadic:               {result = E_TypeKind_Variadic;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_MemberKind\r\ne_member_kind_from_rdi(RDI_MemberKind kind)\r\n{\r\n  E_MemberKind result = E_MemberKind_Null;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case RDI_MemberKind_DataField:            {result = E_MemberKind_DataField;}break;\r\n    case RDI_MemberKind_StaticData:           {result = E_MemberKind_StaticData;}break;\r\n    case RDI_MemberKind_Method:               {result = E_MemberKind_Method;}break;\r\n    case RDI_MemberKind_StaticMethod:         {result = E_MemberKind_StaticMethod;}break;\r\n    case RDI_MemberKind_VirtualMethod:        {result = E_MemberKind_VirtualMethod;}break;\r\n    case RDI_MemberKind_VTablePtr:            {result = E_MemberKind_VTablePtr;}break;\r\n    case RDI_MemberKind_Base:                 {result = E_MemberKind_Base;}break;\r\n    case RDI_MemberKind_VirtualBase:          {result = E_MemberKind_VirtualBase;}break;\r\n    case RDI_MemberKind_NestedType:           {result = E_MemberKind_NestedType;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RDI_EvalTypeGroup\r\ne_type_group_from_kind(E_TypeKind kind)\r\n{\r\n  RDI_EvalTypeGroup result = 0;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    \r\n    case E_TypeKind_Null: case E_TypeKind_Void:\r\n    case E_TypeKind_F16:  case E_TypeKind_F32PP: case E_TypeKind_F48:\r\n    case E_TypeKind_F80:  case E_TypeKind_F128:\r\n    case E_TypeKind_ComplexF32: case E_TypeKind_ComplexF64:\r\n    case E_TypeKind_ComplexF80: case E_TypeKind_ComplexF128:\r\n    case E_TypeKind_Modifier:   case E_TypeKind_Array:\r\n    case E_TypeKind_Struct:     case E_TypeKind_Class: case E_TypeKind_Union:\r\n    case E_TypeKind_Enum:       case E_TypeKind_Alias:\r\n    case E_TypeKind_IncompleteStruct: case E_TypeKind_IncompleteClass:\r\n    case E_TypeKind_IncompleteUnion:  case E_TypeKind_IncompleteEnum:\r\n    case E_TypeKind_Bitfield:\r\n    case E_TypeKind_Variadic:\r\n    {result = RDI_EvalTypeGroup_Other;}break;\r\n    \r\n    case E_TypeKind_Handle:\r\n    case E_TypeKind_UChar8: case E_TypeKind_UChar16: case E_TypeKind_UChar32:\r\n    case E_TypeKind_U8:     case E_TypeKind_U16:     case E_TypeKind_U32:\r\n    case E_TypeKind_U64:    case E_TypeKind_U128:    case E_TypeKind_U256:\r\n    case E_TypeKind_U512:\r\n    case E_TypeKind_Ptr: case E_TypeKind_LRef: case E_TypeKind_RRef:\r\n    case E_TypeKind_Function: case E_TypeKind_Method: case E_TypeKind_MemberPtr:\r\n    {result = RDI_EvalTypeGroup_U;}break;\r\n    \r\n    case E_TypeKind_Char8: case E_TypeKind_Char16: case E_TypeKind_Char32:\r\n    case E_TypeKind_S8:    case E_TypeKind_S16:    case E_TypeKind_S32:\r\n    case E_TypeKind_S64:   case E_TypeKind_S128:   case E_TypeKind_S256:\r\n    case E_TypeKind_S512:\r\n    case E_TypeKind_Bool:\r\n    {result = RDI_EvalTypeGroup_S;}break;\r\n    \r\n    case E_TypeKind_F32:{result = RDI_EvalTypeGroup_F32;}break;\r\n    case E_TypeKind_F64:{result = RDI_EvalTypeGroup_F64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_type_kind_is_integer(E_TypeKind kind)\r\n{\r\n  B32 result = (E_TypeKind_FirstInteger <= kind && kind <= E_TypeKind_LastInteger);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_type_kind_is_signed(E_TypeKind kind)\r\n{\r\n  B32 result = ((E_TypeKind_FirstSigned1 <= kind && kind <= E_TypeKind_LastSigned1) ||\r\n                (E_TypeKind_FirstSigned2 <= kind && kind <= E_TypeKind_LastSigned2));\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_type_kind_is_basic_or_enum(E_TypeKind kind)\r\n{\r\n  B32 result = ((E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) ||\r\n                kind == E_TypeKind_Enum);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ne_type_kind_is_pointer_or_ref(E_TypeKind kind)\r\n{\r\n  B32 result = (kind == E_TypeKind_Ptr || kind == E_TypeKind_LRef || kind == E_TypeKind_RRef);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Member Functions\r\n\r\ninternal void\r\ne_member_list_push(Arena *arena, E_MemberList *list, E_Member *member)\r\n{\r\n  E_MemberNode *n = push_array(arena, E_MemberNode, 1);\r\n  MemoryCopyStruct(&n->v, member);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal E_MemberArray\r\ne_member_array_from_list(Arena *arena, E_MemberList *list)\r\n{\r\n  E_MemberArray array = {0};\r\n  array.count = list->count;\r\n  array.v = push_array(arena, E_Member, array.count);\r\n  {\r\n    U64 idx = 0;\r\n    for(E_MemberNode *n = list->first; n != 0; n = n->next, idx += 1)\r\n    {\r\n      MemoryCopyStruct(&array.v[idx], &n->v);\r\n    }\r\n  }\r\n  return array;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum Value Functions\r\n\r\ninternal void\r\ne_enum_val_list_push(Arena *arena, E_EnumValList *list, E_EnumVal *enum_val)\r\n{\r\n  E_EnumValNode *n = push_array(arena, E_EnumValNode, 1);\r\n  MemoryCopyStruct(&n->v, enum_val);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal E_EnumValArray\r\ne_enum_val_array_from_list(Arena *arena, E_EnumValList *list)\r\n{\r\n  E_EnumValArray array = {0};\r\n  array.count = list->count;\r\n  array.v = push_array(arena, E_EnumVal, array.count);\r\n  {\r\n    U64 idx = 0;\r\n    for(E_EnumValNode *n = list->first; n != 0; n = n->next, idx += 1)\r\n    {\r\n      MemoryCopyStruct(&array.v[idx], &n->v);\r\n    }\r\n  }\r\n  return array;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Operation Functions\r\n\r\n//- rjf: key constructors\r\n\r\ninternal E_TypeKey\r\ne_type_key_zero(void)\r\n{\r\n  E_TypeKey k = zero_struct;\r\n  return k;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_basic(E_TypeKind kind)\r\n{\r\n  E_TypeKey key = {E_TypeKeyKind_Basic};\r\n  key.u32[0] = (U32)kind;\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_num)\r\n{\r\n  E_TypeKey key = {E_TypeKeyKind_Ext};\r\n  key.u32[0] = (U32)kind;\r\n  if(E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic)\r\n  {\r\n    key.kind = E_TypeKeyKind_Basic;\r\n  }\r\n  else\r\n  {\r\n    key.u32[1] = type_idx;\r\n    key.u32[2] = rdi_num;\r\n  }\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_reg(Arch arch, REGS_RegCode code)\r\n{\r\n  E_TypeKey key = {E_TypeKeyKind_Reg};\r\n  key.u32[0] = (U32)arch;\r\n  key.u32[1] = (U32)code;\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_reg_alias(Arch arch, REGS_AliasCode code)\r\n{\r\n  E_TypeKey key = {E_TypeKeyKind_RegAlias};\r\n  key.u32[0] = (U32)arch;\r\n  key.u32[1] = (U32)code;\r\n  return key;\r\n}\r\n\r\n//- rjf: constructed type construction\r\n\r\ninternal U64\r\ne_hash_from_cons_type_params(E_ConsTypeParams *params)\r\n{\r\n  U32 buffer[] =\r\n  {\r\n    (U32)params->kind,\r\n    (U32)params->direct_key.kind,\r\n    params->direct_key.u32[0],\r\n    params->direct_key.u32[1],\r\n    params->direct_key.u32[2],\r\n    (U32)((params->count & 0x00000000ffffffffull)>> 0),\r\n    (U32)((params->count & 0xffffffff00000000ull)>> 32),\r\n    (U32)((params->depth & 0x00000000ffffffffull)>> 0),\r\n    (U32)((params->depth & 0xffffffff00000000ull)>> 32),\r\n  };\r\n  U64 hash = e_hash_from_string(5381, str8((U8 *)buffer, sizeof(buffer)));\r\n  hash = e_hash_from_string(hash, params->name);\r\n  return hash;\r\n}\r\n\r\ninternal B32\r\ne_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r)\r\n{\r\n  B32 result = (l->kind != E_TypeKind_Lens &&\r\n                l->kind == r->kind &&\r\n                l->flags == r->flags &&\r\n                str8_match(l->name, r->name, 0) &&\r\n                e_type_key_match(l->direct_key, r->direct_key) &&\r\n                l->count == r->count &&\r\n                l->depth == r->depth);\r\n  if(result && l->members != 0 && r->members != 0)\r\n  {\r\n    for(U64 idx = 0; idx < l->count; idx += 1)\r\n    {\r\n      if(l->members[idx].kind != r->members[idx].kind ||\r\n         !e_type_key_match(l->members[idx].type_key, r->members[idx].type_key) ||\r\n         !str8_match(l->members[idx].name, r->members[idx].name, 0) ||\r\n         l->members[idx].off != r->members[idx].off)\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  if(result && l->enum_vals != 0 && r->enum_vals != 0)\r\n  {\r\n    for(U64 idx = 0; idx < l->count; idx += 1)\r\n    {\r\n      if(l->enum_vals[idx].val != r->enum_vals[idx].val ||\r\n         !str8_match(l->enum_vals[idx].name, r->enum_vals[idx].name, 0))\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_(E_ConsTypeParams *params)\r\n{\r\n  U64 content_hash = e_hash_from_cons_type_params(params);\r\n  U64 content_slot_idx = content_hash%e_cache->cons_content_slots_count;\r\n  E_ConsTypeSlot *content_slot = &e_cache->cons_content_slots[content_slot_idx];\r\n  E_ConsTypeNode *node = 0;\r\n  for(E_ConsTypeNode *n = content_slot->first; n != 0; n = n->content_next)\r\n  {\r\n    if(e_cons_type_params_match(params, &n->params))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  E_TypeKey result = zero_struct;\r\n  if(node == 0)\r\n  {\r\n    E_TypeKey key = {E_TypeKeyKind_Cons};\r\n    key.u32[0] = (U32)params->kind;\r\n    key.u32[1] = (U32)e_cache->cons_id_gen;\r\n    e_cache->cons_id_gen += 1;\r\n    U64 key_hash = e_hash_from_string(5381, str8_struct(&key));\r\n    U64 key_slot_idx = key_hash%e_cache->cons_key_slots_count;\r\n    E_ConsTypeSlot *key_slot = &e_cache->cons_key_slots[key_slot_idx];\r\n    E_ConsTypeNode *node = push_array(e_cache->arena, E_ConsTypeNode, 1);\r\n    SLLQueuePush_N(content_slot->first, content_slot->last, node, content_next);\r\n    SLLQueuePush_N(key_slot->first, key_slot->last, node, key_next);\r\n    node->key = key;\r\n    MemoryCopyStruct(&node->params, params);\r\n    node->params.name = push_str8_copy(e_cache->arena, params->name);\r\n    if(node->params.expand.info != 0)\r\n    {\r\n      if(node->params.expand.range == 0)       {node->params.expand.range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(default);}\r\n      if(node->params.expand.id_from_num == 0) {node->params.expand.id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity);}\r\n      if(node->params.expand.num_from_id == 0) {node->params.expand.num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity);}\r\n    }\r\n    if(params->members != 0)\r\n    {\r\n      node->params.members = push_array(e_cache->arena, E_Member, params->count);\r\n      MemoryCopy(node->params.members, params->members, sizeof(E_Member)*params->count);\r\n      for(U64 idx = 0; idx < node->params.count; idx += 1)\r\n      {\r\n        node->params.members[idx].name = push_str8_copy(e_cache->arena, node->params.members[idx].name);\r\n        node->params.members[idx].inheritance_key_chain = e_type_key_list_copy(e_cache->arena, &node->params.members[idx].inheritance_key_chain);\r\n        U64 opl_off = (node->params.members[idx].off + e_type_byte_size_from_key(node->params.members[idx].type_key));\r\n        node->byte_size = Max(node->byte_size, opl_off);\r\n      }\r\n    }\r\n    else if(params->enum_vals != 0)\r\n    {\r\n      node->params.enum_vals = push_array(e_cache->arena, E_EnumVal, params->count);\r\n      MemoryCopy(node->params.enum_vals, params->enum_vals, sizeof(E_EnumVal)*params->count);\r\n      for(U64 idx = 0; idx < node->params.count; idx += 1)\r\n      {\r\n        node->params.enum_vals[idx].name = push_str8_copy(e_cache->arena, node->params.enum_vals[idx].name);\r\n      }\r\n      node->byte_size = e_type_byte_size_from_key(node->params.direct_key);\r\n    }\r\n    else if(params->args != 0)\r\n    {\r\n      node->params.args = push_array(e_cache->arena, E_Expr *, params->count);\r\n      for EachIndex(idx, params->count)\r\n      {\r\n        node->params.args[idx] = e_expr_copy(e_cache->arena, params->args[idx]);\r\n      }\r\n    }\r\n    else switch(params->kind)\r\n    {\r\n      default:\r\n      {\r\n        node->byte_size = e_type_byte_size_from_key(node->params.direct_key);\r\n      }break;\r\n      case E_TypeKind_Ptr:\r\n      {\r\n        node->byte_size = bit_size_from_arch(node->params.arch)/8;\r\n      }break;\r\n      case E_TypeKind_Array:\r\n      {\r\n        U64 ptee_size = e_type_byte_size_from_key(node->params.direct_key);\r\n        node->byte_size = ptee_size * node->params.count;\r\n      }break;\r\n    }\r\n    result = key;\r\n  }\r\n  else\r\n  {\r\n    result = node->key;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: constructed type helpers\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags)\r\n{\r\n  E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_Array, .direct_key = element_type_key, .count = count, .flags = flags);\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags)\r\n{\r\n  E_TypeKey key = e_type_key_cons(.arch = arch, .kind = E_TypeKind_Ptr, .flags = flags, .direct_key = element_type_key, .count = count);\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_meta_expr(E_TypeKey type_key, String8 expr)\r\n{\r\n  E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_MetaExpr, .direct_key = type_key, .name = expr);\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_meta_display_name(E_TypeKey type_key, String8 name)\r\n{\r\n  E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_MetaDisplayName, .direct_key = type_key, .name = name);\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_meta_description(E_TypeKey type_key, String8 desc)\r\n{\r\n  E_TypeKey key = e_type_key_cons(.kind = E_TypeKind_MetaDescription, .direct_key = type_key, .name = desc);\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_cons_base(Type *type)\r\n{\r\n  E_TypeKey result = e_type_key_zero();\r\n  switch(type->kind)\r\n  {\r\n    default:\r\n    if(TypeKind_FirstLeaf <= type->kind && type->kind <= TypeKind_LastLeaf)\r\n    {\r\n      E_TypeKind kind = e_type_kind_from_base(type->kind);\r\n      result = e_type_key_basic(kind);\r\n    }break;\r\n    case TypeKind_Ptr:\r\n    {\r\n      E_TypeKey direct_type = e_type_key_cons_base(type->direct);\r\n      E_TypeFlags flags = 0;\r\n      if(type->flags & TypeFlag_IsPlainText){ flags |= E_TypeFlag_IsPlainText; }\r\n      if(type->flags & TypeFlag_IsCodeText) { flags |= E_TypeFlag_IsCodeText; }\r\n      if(type->flags & TypeFlag_IsPathText) { flags |= E_TypeFlag_IsPathText; }\r\n      result = e_type_key_cons_ptr(Arch_CURRENT, direct_type, 1, flags);\r\n    }break;\r\n    case TypeKind_Array:\r\n    {\r\n      E_TypeKey direct_type = e_type_key_cons_base(type->direct);\r\n      result = e_type_key_cons_array(direct_type, type->count, 0);\r\n    }break;\r\n    case TypeKind_Struct:\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      E_MemberList members = {0};\r\n      for(U64 idx = 0; idx < type->count; idx += 1)\r\n      {\r\n        E_TypeKey member_type_key = e_type_key_cons_base(type->members[idx].type);\r\n        e_member_list_push_new(scratch.arena, &members, .name = type->members[idx].name, .off = type->members[idx].value, .type_key = member_type_key);\r\n      }\r\n      E_MemberArray members_array = e_member_array_from_list(scratch.arena, &members);\r\n      result = e_type_key_cons(.arch    = Arch_CURRENT,\r\n                               .kind    = E_TypeKind_Struct,\r\n                               .name    = type->name,\r\n                               .members = members_array.v,\r\n                               .count   = members_array.count);\r\n      scratch_end(scratch);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_file(void)\r\n{\r\n  E_TypeKey key = e_cache->file_type_key;\r\n  return key;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_folder(void)\r\n{\r\n  E_TypeKey key = e_cache->folder_type_key;\r\n  return key;\r\n}\r\n\r\n//- rjf: basic type key functions\r\n\r\ninternal B32\r\ne_type_key_match(E_TypeKey l, E_TypeKey r)\r\n{\r\n  B32 result = MemoryMatchStruct(&l, &r);\r\n  return result;\r\n}\r\n\r\n//- rjf: type key -> info extraction\r\n\r\ninternal U64\r\ne_hash_from_type(E_Type *type)\r\n{\r\n  U64 hash = 0;\r\n  if(type != &e_type_nil)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8List strings = {0};\r\n    str8_serial_begin(scratch.arena, &strings);\r\n    str8_serial_push_struct(scratch.arena, &strings, &type->kind);\r\n    str8_serial_push_struct(scratch.arena, &strings, &type->flags);\r\n    str8_serial_push_string(scratch.arena, &strings, type->name);\r\n    str8_serial_push_struct(scratch.arena, &strings, &type->byte_size);\r\n    str8_serial_push_struct(scratch.arena, &strings, &type->count);\r\n    str8_serial_push_struct(scratch.arena, &strings, &type->off);\r\n    String8 direct_type_string = e_type_string_from_key(scratch.arena, type->direct_type_key);\r\n    String8 owner_type_string = e_type_string_from_key(scratch.arena, type->owner_type_key);\r\n    U64 direct_hash = e_hash_from_string(5381, direct_type_string);\r\n    U64 owner_hash = e_hash_from_string(5381, owner_type_string);\r\n    str8_serial_push_struct(scratch.arena, &strings, &direct_hash);\r\n    str8_serial_push_struct(scratch.arena, &strings, &owner_hash);\r\n    if(type->param_type_keys != 0)\r\n    {\r\n      for EachIndex(idx, type->count)\r\n      {\r\n        String8 param_type_string = e_type_string_from_key(scratch.arena, type->param_type_keys[idx]);\r\n        U64 param_type_hash = e_hash_from_string(5381, param_type_string);\r\n        str8_serial_push_struct(scratch.arena, &strings, &param_type_hash);\r\n      }\r\n    }\r\n    else if(type->members != 0)\r\n    {\r\n      for EachIndex(idx, type->count)\r\n      {\r\n        String8 member_type_string = e_type_string_from_key(scratch.arena, type->members[idx].type_key);\r\n        U64 member_type_hash = e_hash_from_string(5381, member_type_string);\r\n        str8_serial_push_struct(scratch.arena, &strings, &type->members[idx].off);\r\n        str8_serial_push_struct(scratch.arena, &strings, &member_type_hash);\r\n      }\r\n    }\r\n    String8 string = str8_serial_end(scratch.arena, &strings);\r\n    hash = e_hash_from_string(5381, string);\r\n    scratch_end(scratch);\r\n  }\r\n  return hash;\r\n}\r\n\r\ninternal E_TypeKind\r\ne_type_kind_from_key(E_TypeKey key)\r\n{\r\n  E_TypeKind kind = E_TypeKind_Null;\r\n  switch(key.kind)\r\n  {\r\n    default:{}break;\r\n    case E_TypeKeyKind_Basic:   {kind = (E_TypeKind)key.u32[0];}break;\r\n    case E_TypeKeyKind_Ext:     {kind = (E_TypeKind)key.u32[0];}break;\r\n    case E_TypeKeyKind_Cons:    {kind = (E_TypeKind)key.u32[0];}break;\r\n    case E_TypeKeyKind_Reg:     {kind = E_TypeKind_Union;}break;\r\n    case E_TypeKeyKind_RegAlias:{kind = E_TypeKind_Union;}break;\r\n  }\r\n  return kind;\r\n}\r\n\r\ninternal U64\r\ne_type_byte_size_from_key(E_TypeKey key)\r\n{\r\n  ProfBeginFunction();\r\n  U64 result = 0;\r\n  switch(key.kind)\r\n  {\r\n    default:{}break;\r\n    case E_TypeKeyKind_Basic:\r\n    {\r\n      E_TypeKind kind = (E_TypeKind)key.u32[0];\r\n      result = e_type_kind_basic_byte_size_table[kind];\r\n    }break;\r\n    case E_TypeKeyKind_Ext:\r\n    {\r\n      U64 type_node_idx = key.u32[1];\r\n      U32 rdi_num = key.u32[2];\r\n      if(0 < rdi_num && rdi_num <= e_base_ctx->dbg_infos_count)\r\n      {\r\n        RDI_Parsed *rdi = e_base_ctx->dbg_infos[rdi_num-1].rdi;\r\n        RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);\r\n        result = rdi_type->byte_size;\r\n      }\r\n    }break;\r\n    case E_TypeKeyKind_Cons:\r\n    {\r\n      U64 key_hash = e_hash_from_string(5381, str8_struct(&key));\r\n      U64 key_slot_idx = key_hash%e_cache->cons_key_slots_count;\r\n      E_ConsTypeSlot *key_slot = &e_cache->cons_key_slots[key_slot_idx];\r\n      for(E_ConsTypeNode *node = key_slot->first;\r\n          node != 0;\r\n          node = node->key_next)\r\n      {\r\n        if(e_type_key_match(node->key, key))\r\n        {\r\n          result = node->byte_size;\r\n          break;\r\n        }\r\n      }\r\n    }break;\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal E_Type *\r\ne_push_type_from_key(Arena *arena, E_TypeKey key)\r\n{\r\n  ProfBeginFunction();\r\n  E_Type *type = &e_type_nil;\r\n  U64 reg_byte_count = 0;\r\n  {\r\n    switch(key.kind)\r\n    {\r\n      default:{}break;\r\n      \r\n      //- rjf: basic type keys\r\n      case E_TypeKeyKind_Basic:\r\n      {\r\n        E_TypeKind kind = (E_TypeKind)key.u32[0];\r\n        if(E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic)\r\n        {\r\n          type = push_array(arena, E_Type, 1);\r\n          type->kind       = kind;\r\n          type->name       = e_type_kind_basic_string_table[kind];\r\n          type->byte_size  = e_type_kind_basic_byte_size_table[kind];\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: constructed type keys\r\n      case E_TypeKeyKind_Cons:\r\n      {\r\n        U64 key_hash = e_hash_from_string(5381, str8_struct(&key));\r\n        U64 key_slot_idx = key_hash%e_cache->cons_key_slots_count;\r\n        E_ConsTypeSlot *key_slot = &e_cache->cons_key_slots[key_slot_idx];\r\n        for(E_ConsTypeNode *node = key_slot->first;\r\n            node != 0;\r\n            node = node->key_next)\r\n        {\r\n          if(e_type_key_match(node->key, key))\r\n          {\r\n            type = push_array(arena, E_Type, 1);\r\n            type->kind               = e_type_kind_from_key(node->key);\r\n            type->flags              = node->params.flags;\r\n            type->name               = push_str8_copy(arena, node->params.name);\r\n            type->direct_type_key    = node->params.direct_key;\r\n            type->count              = node->params.count;\r\n            type->depth              = node->params.depth;\r\n            type->arch               = node->params.arch;\r\n            type->irext              = node->params.irext;\r\n            type->access             = node->params.access;\r\n            type->expand             = node->params.expand;\r\n            type->byte_size          = node->byte_size;\r\n            switch(type->kind)\r\n            {\r\n              default:{}break;\r\n              case E_TypeKind_Lens:\r\n              {\r\n                type->args = push_array(arena, E_Expr *, type->count);\r\n                MemoryCopy(type->args, node->params.args, sizeof(E_Expr *)*type->count);\r\n                for EachIndex(idx, type->count)\r\n                {\r\n                  type->args[idx] = e_expr_copy(arena, type->args[idx]);\r\n                }\r\n              }break;\r\n              case E_TypeKind_Struct:\r\n              case E_TypeKind_Union:\r\n              case E_TypeKind_Class:\r\n              {\r\n                type->members = push_array(arena, E_Member, type->count);\r\n                MemoryCopy(type->members, node->params.members, sizeof(E_Member)*type->count);\r\n                for(U64 idx = 0; idx < type->count; idx += 1)\r\n                {\r\n                  U64 opl_byte = type->members[idx].off + e_type_byte_size_from_key(type->members[idx].type_key);\r\n                  type->byte_size = Max(type->byte_size, opl_byte);\r\n                }\r\n              }break;\r\n              case E_TypeKind_Enum:\r\n              {\r\n                type->enum_vals = push_array(arena, E_EnumVal, type->count);\r\n                MemoryCopy(type->enum_vals, node->params.enum_vals, sizeof(E_EnumVal)*type->count);\r\n              }break;\r\n            }\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: external (rdi) type keys\r\n      case E_TypeKeyKind_Ext:\r\n      {\r\n        U64 type_node_idx = key.u32[1];\r\n        U32 rdi_num = key.u32[2];\r\n        if(0 < rdi_num && rdi_num <= e_base_ctx->dbg_infos_count)\r\n        {\r\n          RDI_Parsed *rdi = e_base_ctx->dbg_infos[rdi_num-1].rdi;\r\n          RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);\r\n          Arch arch = arch_from_rdi_arch(tli->arch);\r\n          RDI_TypeNode *rdi_type = rdi_element_from_name_idx(rdi, TypeNodes, type_node_idx);\r\n          if(rdi_type->kind != RDI_TypeKind_NULL)\r\n          {\r\n            E_TypeKind kind = e_type_kind_from_rdi(rdi_type->kind);\r\n            \r\n            //- rjf: record types => unpack name * members & produce\r\n            if(RDI_TypeKind_FirstRecord <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastRecord)\r\n            {\r\n              // rjf: unpack name\r\n              String8 name = {0};\r\n              name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);\r\n              \r\n              // rjf: unpack UDT info\r\n              RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, rdi_type->user_defined.udt_idx);\r\n              \r\n              // rjf: unpack members\r\n              E_Member *members = 0;\r\n              U32 members_count = 0;\r\n              {\r\n                members_count = udt->member_count;\r\n                members = push_array(arena, E_Member, members_count);\r\n                if(members_count != 0)\r\n                {\r\n                  for(U32 member_idx = udt->member_first;\r\n                      member_idx < udt->member_first+udt->member_count;\r\n                      member_idx += 1)\r\n                  {\r\n                    RDI_Member *src = rdi_element_from_name_idx(rdi, Members, member_idx);\r\n                    E_TypeKind member_type_kind = E_TypeKind_Null;\r\n                    RDI_TypeNode *member_type = rdi_element_from_name_idx(rdi, TypeNodes, src->type_idx);\r\n                    member_type_kind = e_type_kind_from_rdi(member_type->kind);\r\n                    E_Member *dst = &members[member_idx-udt->member_first];\r\n                    dst->kind     = e_member_kind_from_rdi(src->kind);\r\n                    dst->type_key = e_type_key_ext(member_type_kind, src->type_idx, rdi_num);\r\n                    dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);\r\n                    dst->off      = (U64)src->off;\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: produce\r\n              type = push_array(arena, E_Type, 1);\r\n              type->kind       = kind;\r\n              type->name       = push_str8_copy(arena, name);\r\n              type->byte_size  = (U64)rdi_type->byte_size;\r\n              type->count      = members_count;\r\n              type->arch       = arch;\r\n              type->members    = members;\r\n            }\r\n            \r\n            //- rjf: enum types => unpack name * values & produce\r\n            else if(rdi_type->kind == RDI_TypeKind_Enum)\r\n            {\r\n              // rjf: unpack name\r\n              String8 name = {0};\r\n              name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);\r\n              \r\n              // rjf: unpack direct type\r\n              E_TypeKey direct_type_key = zero_struct;\r\n              if(rdi_type->user_defined.direct_type_idx < type_node_idx)\r\n              {\r\n                RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx);\r\n                E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);\r\n                direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_num);\r\n              }\r\n              \r\n              // rjf: unpack members\r\n              E_EnumVal *enum_vals = 0;\r\n              U32 enum_vals_count = 0;\r\n              {\r\n                U32 udt_idx = rdi_type->user_defined.udt_idx;\r\n                RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, udt_idx);\r\n                enum_vals_count = udt->member_count;\r\n                enum_vals = push_array(arena, E_EnumVal, enum_vals_count);\r\n                for(U32 member_idx = udt->member_first;\r\n                    member_idx < udt->member_first+udt->member_count;\r\n                    member_idx += 1)\r\n                {\r\n                  RDI_EnumMember *src = rdi_element_from_name_idx(rdi, EnumMembers, member_idx);\r\n                  E_EnumVal *dst = &enum_vals[member_idx-udt->member_first];\r\n                  dst->name.str = rdi_string_from_idx(rdi, src->name_string_idx, &dst->name.size);\r\n                  dst->val      = src->val;\r\n                }\r\n              }\r\n              \r\n              // rjf: produce\r\n              type = push_array(arena, E_Type, 1);\r\n              type->kind            = kind;\r\n              type->name            = push_str8_copy(arena, name);\r\n              type->byte_size       = (U64)rdi_type->byte_size;\r\n              type->count           = enum_vals_count;\r\n              type->arch            = arch;\r\n              type->enum_vals       = enum_vals;\r\n              type->direct_type_key = direct_type_key;\r\n            }\r\n            \r\n            //- rjf: constructed types\r\n            else if(RDI_TypeKind_FirstConstructed <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastConstructed)\r\n            {\r\n              // rjf: unpack direct type\r\n              B32 direct_type_is_good = 0;\r\n              E_TypeKey direct_type_key = zero_struct;\r\n              U64 direct_type_byte_size = 0;\r\n              if(rdi_type->constructed.direct_type_idx < type_node_idx)\r\n              {\r\n                RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.direct_type_idx);\r\n                E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);\r\n                direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->constructed.direct_type_idx, rdi_num);\r\n                direct_type_is_good = 1;\r\n                direct_type_byte_size = (U64)direct_type_node->byte_size;\r\n              }\r\n              \r\n              // rjf: construct based on kind\r\n              switch(rdi_type->kind)\r\n              {\r\n                case RDI_TypeKind_Modifier:\r\n                {\r\n                  E_TypeFlags flags = 0;\r\n                  if(rdi_type->flags & RDI_TypeModifierFlag_Const)\r\n                  {\r\n                    flags |= E_TypeFlag_Const;\r\n                  }\r\n                  if(rdi_type->flags & RDI_TypeModifierFlag_Volatile)\r\n                  {\r\n                    flags |= E_TypeFlag_Volatile;\r\n                  }\r\n                  if(rdi_type->flags & RDI_TypeModifierFlag_Restrict)\r\n                  {\r\n                    flags |= E_TypeFlag_Restrict;\r\n                  }\r\n                  type = push_array(arena, E_Type, 1);\r\n                  type->kind            = kind;\r\n                  type->direct_type_key = direct_type_key;\r\n                  type->byte_size       = direct_type_byte_size;\r\n                  type->flags           = flags;\r\n                  type->arch            = arch;\r\n                }break;\r\n                case RDI_TypeKind_Ptr:\r\n                case RDI_TypeKind_LRef:\r\n                case RDI_TypeKind_RRef:\r\n                {\r\n                  type = push_array(arena, E_Type, 1);\r\n                  type->kind            = kind;\r\n                  type->direct_type_key = direct_type_key;\r\n                  type->byte_size       = bit_size_from_arch(arch)/8;\r\n                  type->count           = 1;\r\n                  type->arch            = arch;\r\n                }break;\r\n                \r\n                case RDI_TypeKind_Array:\r\n                {\r\n                  type = push_array(arena, E_Type, 1);\r\n                  type->kind            = kind;\r\n                  type->direct_type_key = direct_type_key;\r\n                  type->count           = rdi_type->constructed.count;\r\n                  type->byte_size       = direct_type_byte_size * type->count;\r\n                  type->arch            = arch;\r\n                }break;\r\n                case RDI_TypeKind_Function:\r\n                {\r\n                  U32 count = rdi_type->constructed.count;\r\n                  U32 idx_run_first = rdi_type->constructed.param_idx_run_first;\r\n                  U32 check_count = 0;\r\n                  U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);\r\n                  if(check_count == count)\r\n                  {\r\n                    type = push_array(arena, E_Type, 1);\r\n                    type->kind            = kind;\r\n                    type->byte_size       = bit_size_from_arch(arch)/8;\r\n                    type->direct_type_key = direct_type_key;\r\n                    type->count           = count;\r\n                    type->param_type_keys = push_array(arena, E_TypeKey, type->count);\r\n                    type->arch            = arch;\r\n                    for(U32 idx = 0; idx < type->count; idx += 1)\r\n                    {\r\n                      U32 param_type_idx = idx_run[idx];\r\n                      if(param_type_idx < type_node_idx)\r\n                      {\r\n                        RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx);\r\n                        E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind);\r\n                        type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_num);\r\n                      }\r\n                      else\r\n                      {\r\n                        break;\r\n                      }\r\n                    }\r\n                  }\r\n                }break;\r\n                case RDI_TypeKind_Method:\r\n                {\r\n                  // NOTE(rjf): for methods, the `direct` type points at the owner type.\r\n                  // the return type, instead of being encoded via the `direct` type, is\r\n                  // encoded via the first parameter.\r\n                  U32 count = rdi_type->constructed.count;\r\n                  U32 idx_run_first = rdi_type->constructed.param_idx_run_first;\r\n                  U32 check_count = 0;\r\n                  U32 *idx_run = rdi_idx_run_from_first_count(rdi, idx_run_first, count, &check_count);\r\n                  if(check_count == count)\r\n                  {\r\n                    type = push_array(arena, E_Type, 1);\r\n                    type->kind            = kind;\r\n                    type->byte_size       = bit_size_from_arch(arch)/8;\r\n                    type->owner_type_key  = direct_type_key;\r\n                    type->count           = count;\r\n                    type->param_type_keys = push_array_no_zero(arena, E_TypeKey, type->count);\r\n                    type->arch            = arch;\r\n                    for(U32 idx = 0; idx < type->count; idx += 1)\r\n                    {\r\n                      U32 param_type_idx = idx_run[idx];\r\n                      if(param_type_idx < type_node_idx)\r\n                      {\r\n                        RDI_TypeNode *param_type_node = rdi_element_from_name_idx(rdi, TypeNodes, param_type_idx);\r\n                        E_TypeKind param_kind = e_type_kind_from_rdi(param_type_node->kind);\r\n                        type->param_type_keys[idx] = e_type_key_ext(param_kind, param_type_idx, rdi_num);\r\n                      }\r\n                      else\r\n                      {\r\n                        break;\r\n                      }\r\n                    }\r\n                    if(type->count > 0)\r\n                    {\r\n                      type->direct_type_key = type->param_type_keys[0];\r\n                      type->count -= 1;\r\n                      type->param_type_keys += 1;\r\n                    }\r\n                  }\r\n                }break;\r\n                case RDI_TypeKind_MemberPtr:\r\n                {\r\n                  // rjf: unpack owner type\r\n                  E_TypeKey owner_type_key = zero_struct;\r\n                  if(rdi_type->constructed.owner_type_idx < type_node_idx)\r\n                  {\r\n                    RDI_TypeNode *owner_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->constructed.owner_type_idx);\r\n                    E_TypeKind owner_type_kind = e_type_kind_from_rdi(owner_type_node->kind);\r\n                    owner_type_key = e_type_key_ext(owner_type_kind, rdi_type->constructed.owner_type_idx, rdi_num);\r\n                  }\r\n                  type = push_array(arena, E_Type, 1);\r\n                  type->kind            = kind;\r\n                  type->byte_size       = bit_size_from_arch(arch)/8;\r\n                  type->owner_type_key  = owner_type_key;\r\n                  type->direct_type_key = direct_type_key;\r\n                  type->arch            = arch;\r\n                }break;\r\n              }\r\n            }\r\n            \r\n            //- rjf: alias types\r\n            else if(rdi_type->kind == RDI_TypeKind_Alias)\r\n            {\r\n              // rjf: unpack name\r\n              String8 name = {0};\r\n              name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);\r\n              \r\n              // rjf: unpack direct type\r\n              E_TypeKey direct_type_key = zero_struct;\r\n              U64 direct_type_byte_size = 0;\r\n              if(rdi_type->user_defined.direct_type_idx < type_node_idx)\r\n              {\r\n                RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->user_defined.direct_type_idx);\r\n                E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);\r\n                direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->user_defined.direct_type_idx, rdi_num);\r\n                direct_type_byte_size = direct_type_node->byte_size;\r\n              }\r\n              \r\n              // rjf: produce\r\n              type = push_array(arena, E_Type, 1);\r\n              type->kind            = kind;\r\n              type->name            = push_str8_copy(arena, name);\r\n              type->byte_size       = direct_type_byte_size;\r\n              type->direct_type_key = direct_type_key;\r\n              type->arch            = arch;\r\n            }\r\n            \r\n            //- rjf: bitfields\r\n            else if(RDI_TypeKind_Bitfield == rdi_type->kind)\r\n            {\r\n              // rjf: unpack direct type\r\n              E_TypeKey direct_type_key = zero_struct;\r\n              U64 direct_type_byte_size = 0;\r\n              if(rdi_type->bitfield.direct_type_idx < type_node_idx)\r\n              {\r\n                RDI_TypeNode *direct_type_node = rdi_element_from_name_idx(rdi, TypeNodes, rdi_type->bitfield.direct_type_idx);\r\n                E_TypeKind direct_type_kind = e_type_kind_from_rdi(direct_type_node->kind);\r\n                direct_type_key = e_type_key_ext(direct_type_kind, rdi_type->bitfield.direct_type_idx, rdi_num);\r\n                direct_type_byte_size = direct_type_node->byte_size;\r\n              }\r\n              \r\n              // rjf: produce\r\n              type = push_array(arena, E_Type, 1);\r\n              type->kind            = kind;\r\n              type->byte_size       = direct_type_byte_size;\r\n              type->direct_type_key = direct_type_key;\r\n              type->off             = (U32)rdi_type->bitfield.off;\r\n              type->count           = (U64)rdi_type->bitfield.size;\r\n              type->arch            = arch;\r\n            }\r\n            \r\n            //- rjf: incomplete types\r\n            else if(RDI_TypeKind_FirstIncomplete <= rdi_type->kind && rdi_type->kind <= RDI_TypeKind_LastIncomplete)\r\n            {\r\n              // rjf: unpack name\r\n              String8 name = {0};\r\n              name.str = rdi_string_from_idx(rdi, rdi_type->user_defined.name_string_idx, &name.size);\r\n              \r\n              // rjf: produce\r\n              type = push_array(arena, E_Type, 1);\r\n              type->kind            = kind;\r\n              type->name            = push_str8_copy(arena, name);\r\n              type->arch            = arch;\r\n            }\r\n            \r\n          }\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: reg type keys\r\n      case E_TypeKeyKind_Reg:\r\n      {\r\n        Arch arch = (Arch)key.u32[0];\r\n        REGS_RegCode code = (REGS_RegCode)key.u32[1];\r\n        REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[code];\r\n        reg_byte_count = (U64)rng.byte_size;\r\n      }goto build_reg_type;\r\n      case E_TypeKeyKind_RegAlias:\r\n      {\r\n        Arch arch = (Arch)key.u32[0];\r\n        REGS_AliasCode code = (REGS_AliasCode)key.u32[1];\r\n        REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[code];\r\n        reg_byte_count = (U64)slice.byte_size;\r\n      }goto build_reg_type;\r\n      build_reg_type:\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        type = push_array(arena, E_Type, 1);\r\n        type->kind       = E_TypeKind_Union;\r\n        type->name       = push_str8f(arena, \"reg_%I64u_bit\", reg_byte_count*8);\r\n        type->byte_size  = (U64)reg_byte_count;\r\n        type->arch       = (Arch)key.u32[0];\r\n        \r\n        // rjf: build register type members\r\n        E_MemberList members = {0};\r\n        {\r\n          // rjf: build exact-sized members\r\n          {\r\n            if(type->byte_size == 16)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u128\");\r\n              mem->type_key = e_type_key_basic(E_TypeKind_U128);\r\n            }\r\n            if(type->byte_size == 8)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u64\");\r\n              mem->type_key = e_type_key_basic(E_TypeKind_U64);\r\n            }\r\n            if(type->byte_size == 4)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u32\");\r\n              mem->type_key = e_type_key_basic(E_TypeKind_U32);\r\n            }\r\n            if(type->byte_size == 2)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u16\");\r\n              mem->type_key = e_type_key_basic(E_TypeKind_U16);\r\n            }\r\n            if(type->byte_size == 1)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u8\");\r\n              mem->type_key = e_type_key_basic(E_TypeKind_U8);\r\n            }\r\n          }\r\n          \r\n          // rjf: build arrays for subdivisions\r\n          {\r\n            if(type->byte_size > 16 && type->byte_size%16 == 0)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u128s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U128), reg_byte_count/16, 0);\r\n            }\r\n            if(type->byte_size > 8 && type->byte_size%8 == 0)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u64s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U64), reg_byte_count/8, 0);\r\n            }\r\n            if(type->byte_size > 4 && type->byte_size%4 == 0)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u32s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U32), reg_byte_count/4, 0);\r\n            }\r\n            if(type->byte_size > 2 && type->byte_size%2 == 0)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u16s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U16), reg_byte_count/2, 0);\r\n            }\r\n            if(type->byte_size > 1)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"u8s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), reg_byte_count, E_TypeFlag_IsNotText);\r\n            }\r\n            if(type->byte_size > 4 && type->byte_size%4 == 0)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"f32s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F32), reg_byte_count/4, 0);\r\n            }\r\n            if(type->byte_size > 8 && type->byte_size%8 == 0)\r\n            {\r\n              E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n              SLLQueuePush(members.first, members.last, n);\r\n              members.count += 1;\r\n              E_Member *mem = &n->v;\r\n              mem->kind = E_MemberKind_DataField;\r\n              mem->name = str8_lit(\"f64s\");\r\n              mem->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_F64), reg_byte_count/8, 0);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: commit members\r\n        type->count = members.count;\r\n        type->members = push_array_no_zero(arena, E_Member, members.count);\r\n        U64 idx = 0;\r\n        for(E_MemberNode *n = members.first; n != 0; n = n->next, idx += 1)\r\n        {\r\n          MemoryCopyStruct(&type->members[idx], &n->v);\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return type;\r\n}\r\n\r\ninternal int\r\ne_type_qsort_compare_members_offset(E_Member *a, E_Member *b)\r\n{\r\n  int result = 0;\r\n  if(a->kind < b->kind)\r\n  {\r\n    result = -1;\r\n  }\r\n  else if(a->kind > b->kind)\r\n  {\r\n    result = +1;\r\n  }\r\n  else if(a->off < b->off)\r\n  {\r\n    result = -1;\r\n  }\r\n  else if(a->off > b->off)\r\n  {\r\n    result = +1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_MemberArray\r\ne_type_data_members_from_key(Arena *arena, E_TypeKey key)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  E_TypeKind root_type_kind = e_type_kind_from_key(key);\r\n  \r\n  //- rjf: walk type tree; gather members list\r\n  E_MemberList members_list = {0};\r\n  B32 members_need_offset_sort = 0;\r\n  {\r\n    E_Type *root_type = e_type_from_key(key);\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      U64 base_off;\r\n      E_TypeKeyList inheritance_chain;\r\n      E_TypeKey type_key;\r\n      E_Type *type;\r\n    };\r\n    Task start_task = {0, 0, {0}, key, root_type};\r\n    Task *first_task = &start_task;\r\n    Task *last_task = &start_task;\r\n    for(Task *task = first_task; task != 0; task = task->next)\r\n    {\r\n      E_Type *type = task->type;\r\n      if(type->members != 0)\r\n      {\r\n        U64 last_member_off = 0;\r\n        for(U64 member_idx = 0; member_idx < type->count; member_idx += 1)\r\n        {\r\n          if(type->members[member_idx].name.size != 0 && type->members[member_idx].kind == E_MemberKind_DataField)\r\n          {\r\n            E_MemberNode *n = push_array(scratch.arena, E_MemberNode, 1);\r\n            MemoryCopyStruct(&n->v, &type->members[member_idx]);\r\n            n->v.off += task->base_off;\r\n            n->v.inheritance_key_chain = task->inheritance_chain;\r\n            SLLQueuePush(members_list.first, members_list.last, n);\r\n            members_list.count += 1;\r\n            members_need_offset_sort = members_need_offset_sort || (type->members[member_idx].kind == E_MemberKind_DataField && n->v.off < last_member_off);\r\n            members_need_offset_sort = members_need_offset_sort || (type->members[member_idx].kind != E_MemberKind_DataField);\r\n            last_member_off = n->v.off;\r\n          }\r\n          else if(type->members[member_idx].kind == E_MemberKind_Base)\r\n          {\r\n            Task *t = push_array(scratch.arena, Task, 1);\r\n            t->base_off = type->members[member_idx].off + task->base_off;\r\n            t->inheritance_chain = e_type_key_list_copy(scratch.arena, &task->inheritance_chain);\r\n            e_type_key_list_push(scratch.arena, &t->inheritance_chain, type->members[member_idx].type_key);\r\n            t->type_key = type->members[member_idx].type_key;\r\n            t->type = e_type_from_key(type->members[member_idx].type_key);\r\n            SLLQueuePush(first_task, last_task, t);\r\n            members_need_offset_sort = 1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: convert to array\r\n  E_MemberArray members = {0};\r\n  {\r\n    members.count = members_list.count;\r\n    members.v = push_array(arena, E_Member, members.count);\r\n    U64 idx = 0;\r\n    for(E_MemberNode *n = members_list.first; n != 0; n = n->next)\r\n    {\r\n      MemoryCopyStruct(&members.v[idx], &n->v);\r\n      members.v[idx].name = push_str8_copy(arena, members.v[idx].name);\r\n      members.v[idx].inheritance_key_chain = e_type_key_list_copy(arena, &members.v[idx].inheritance_key_chain);\r\n      idx += 1;\r\n    }\r\n  }\r\n  \r\n  //- rjf: sort array by offset if needed\r\n  if(members_need_offset_sort && (root_type_kind == E_TypeKind_Struct || root_type_kind == E_TypeKind_Class) && key.kind != E_TypeKeyKind_Cons)\r\n  {\r\n    quick_sort(members.v, members.count, sizeof(E_Member), e_type_qsort_compare_members_offset);\r\n  }\r\n  \r\n  //- rjf: find all padding instances\r\n  typedef struct PaddingNode PaddingNode;\r\n  struct PaddingNode\r\n  {\r\n    PaddingNode *next;\r\n    U64 off;\r\n    U64 size;\r\n    U64 prev_member_idx;\r\n  };\r\n  PaddingNode *first_padding = 0;\r\n  PaddingNode *last_padding = 0;\r\n  U64 padding_count = 0;\r\n  if((root_type_kind == E_TypeKind_Struct || root_type_kind == E_TypeKind_Class) && key.kind != E_TypeKeyKind_Cons)\r\n  {\r\n    for(U64 idx = 0; idx < members.count; idx += 1)\r\n    {\r\n      E_Member *member = &members.v[idx];\r\n      if(idx+1 < members.count)\r\n      {\r\n        U64 member_byte_size = e_type_byte_size_from_key(member->type_key);\r\n        Rng1U64 member_byte_range = r1u64(member->off, member->off + member_byte_size);\r\n        if(member[1].off > member_byte_range.max)\r\n        {\r\n          PaddingNode *n = push_array(scratch.arena, PaddingNode, 1);\r\n          SLLQueuePush(first_padding, last_padding, n);\r\n          n->off = member_byte_range.max;\r\n          n->size = member[1].off - member_byte_range.max;\r\n          n->prev_member_idx = idx;\r\n          padding_count += 1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: produce new members array, if we have any padding\r\n  if(padding_count != 0)\r\n  {\r\n    E_MemberArray new_members = {0};\r\n    new_members.count = members.count + padding_count;\r\n    new_members.v = push_array(arena, E_Member, new_members.count);\r\n    MemoryCopy(new_members.v, members.v, sizeof(E_Member)*members.count);\r\n    U64 padding_idx = 0;\r\n    for(PaddingNode *n = first_padding; n != 0; n = n->next)\r\n    {\r\n      if(members.count+padding_idx > n->prev_member_idx+1)\r\n      {\r\n        MemoryCopy(new_members.v + n->prev_member_idx + padding_idx + 2,\r\n                   new_members.v + n->prev_member_idx + padding_idx + 1,\r\n                   sizeof(E_Member) * (members.count + padding_idx - (n->prev_member_idx + padding_idx + 1)));\r\n      }\r\n      E_Member *padding_member = &new_members.v[n->prev_member_idx+padding_idx+1];\r\n      MemoryZeroStruct(padding_member);\r\n      padding_member->kind = E_MemberKind_Padding;\r\n      padding_member->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), n->size, E_TypeFlag_IsNotText);\r\n      padding_member->off = n->off;\r\n      padding_member->name = push_str8f(arena, \"$padding_%I64u\", padding_idx);\r\n      padding_idx += 1;\r\n    }\r\n    members = new_members;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return members;\r\n}\r\n\r\ninternal E_TypeExpandRule *\r\ne_expand_rule_from_type_key(E_TypeKey key)\r\n{\r\n  E_TypeExpandRule *rule = &e_type_expand_rule__default;\r\n  {\r\n    E_Type *type = e_type_from_key(e_type_key_unwrap(key, E_TypeUnwrapFlag_Meta));\r\n    if(type->expand.info != 0)\r\n    {\r\n      rule = &type->expand;\r\n    }\r\n    for(E_Type *lens_type = type;\r\n        lens_type->kind == E_TypeKind_Lens || lens_type->kind == E_TypeKind_Set;\r\n        lens_type = e_type_from_key(e_type_key_unwrap(lens_type->direct_type_key, E_TypeUnwrapFlag_Meta)))\r\n    {\r\n      if(lens_type->expand.info != 0)\r\n      {\r\n        rule = &lens_type->expand;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return rule;\r\n}\r\n\r\n//- rjf: type key traversal\r\n\r\ninternal E_TypeKey\r\ne_type_key_direct(E_TypeKey key)\r\n{\r\n  E_TypeKey result = zero_struct;\r\n  switch(key.kind)\r\n  {\r\n    default:{}break;\r\n    case E_TypeKeyKind_Ext:\r\n    case E_TypeKeyKind_Cons:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      result = type->direct_type_key;\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_owner(E_TypeKey key)\r\n{\r\n  E_TypeKey result = zero_struct;\r\n  switch(key.kind)\r\n  {\r\n    default:{}break;\r\n    case E_TypeKeyKind_Ext:\r\n    case E_TypeKeyKind_Cons:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      result = type->owner_type_key;\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_promote(E_TypeKey key)\r\n{\r\n  E_TypeKey result = key;\r\n  E_TypeKind kind = e_type_kind_from_key(key);\r\n  if(kind == E_TypeKind_Bool ||\r\n     kind == E_TypeKind_S8 ||\r\n     kind == E_TypeKind_S16 ||\r\n     kind == E_TypeKind_U8 ||\r\n     kind == E_TypeKind_U16)\r\n  {\r\n    result = e_type_key_basic(E_TypeKind_S32);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_type_key_unwrap(E_TypeKey key, E_TypeUnwrapFlags flags)\r\n{\r\n  E_TypeKey result = key;\r\n  E_TypeKind kind = e_type_kind_from_key(result);\r\n  B32 did_ptr = 0;\r\n  for(;;)\r\n  {\r\n    B32 done = 0;\r\n    switch(kind)\r\n    {\r\n      default:{done = 1;}break;\r\n      case E_TypeKind_Modifier:  {done = !(flags & E_TypeUnwrapFlag_Modifiers);}break;\r\n      case E_TypeKind_Lens:      {done = !(flags & E_TypeUnwrapFlag_Lenses);}break;\r\n      case E_TypeKind_MetaDisplayName:\r\n      case E_TypeKind_MetaDescription:\r\n      case E_TypeKind_MetaExpr:  {done = !(flags & E_TypeUnwrapFlag_Meta);}break;\r\n      case E_TypeKind_Enum:      {done = !(flags & E_TypeUnwrapFlag_Enums);}break;\r\n      case E_TypeKind_Alias:     {done = !(flags & E_TypeUnwrapFlag_Aliases);}break;\r\n      case E_TypeKind_Bitfield:  {done = !(flags & E_TypeUnwrapFlag_Bitfields);}break;\r\n      case E_TypeKind_Array:\r\n      case E_TypeKind_Ptr:\r\n      case E_TypeKind_RRef:\r\n      case E_TypeKind_LRef:\r\n      case E_TypeKind_MemberPtr:\r\n      {\r\n        done = (did_ptr || !(flags & E_TypeUnwrapFlag_Pointers));\r\n        did_ptr = 1;\r\n      }break;\r\n    }\r\n    if(done)\r\n    {\r\n      break;\r\n    }\r\n    result = e_type_key_direct(result);\r\n    kind = e_type_kind_from_key(result);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: type comparisons\r\n\r\ninternal B32\r\ne_type_match(E_TypeKey l, E_TypeKey r)\r\n{\r\n  // rjf: unpack parameters\r\n  E_TypeKey lu = e_type_key_unwrap(l, E_TypeUnwrapFlag_AllDecorative);\r\n  E_TypeKey ru = e_type_key_unwrap(r, E_TypeUnwrapFlag_AllDecorative);\r\n  \r\n  // rjf: exact key matches -> match\r\n  B32 result = e_type_key_match(lu, ru);\r\n  \r\n  // rjf: if keys don't match, type *contents* could still match,\r\n  // so we need to unpack the type info & compare\r\n  if(!result)\r\n  {\r\n    E_TypeKind luk = e_type_kind_from_key(lu);\r\n    E_TypeKind ruk = e_type_kind_from_key(ru);\r\n    if(luk == ruk)\r\n    {\r\n      switch(luk)\r\n      {\r\n        default:\r\n        {\r\n          if(e_type_kind_is_basic_or_enum(luk))\r\n          {\r\n            result = 1;\r\n          }\r\n          else\r\n          {\r\n            result = 0;\r\n          }\r\n        }break;\r\n        \r\n        case E_TypeKind_Ptr:\r\n        case E_TypeKind_LRef:\r\n        case E_TypeKind_RRef:\r\n        {\r\n          E_TypeKey lud = e_type_key_direct(lu);\r\n          E_TypeKey rud = e_type_key_direct(ru);\r\n          result = e_type_match(lud, rud);\r\n        }break;\r\n        \r\n        case E_TypeKind_MemberPtr:\r\n        {\r\n          E_TypeKey lud = e_type_key_direct(lu);\r\n          E_TypeKey rud = e_type_key_direct(ru);\r\n          E_TypeKey luo = e_type_key_owner(lu);\r\n          E_TypeKey ruo = e_type_key_owner(ru);\r\n          result = (e_type_match(lud, rud) && e_type_match(luo, ruo));\r\n        }break;\r\n        \r\n        case E_TypeKind_Array:\r\n        {\r\n          E_Type *lt = e_type_from_key(l);\r\n          E_Type *rt = e_type_from_key(r);\r\n          if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key))\r\n          {\r\n            result = 1;\r\n          }\r\n        }break;\r\n        \r\n        case E_TypeKind_Function:\r\n        {\r\n          E_Type *lt = e_type_from_key(l);\r\n          E_Type *rt = e_type_from_key(r);\r\n          if(lt->count == rt->count && e_type_match(lt->direct_type_key, rt->direct_type_key))\r\n          {\r\n            B32 params_match = 1;\r\n            E_TypeKey *lp = lt->param_type_keys;\r\n            E_TypeKey *rp = rt->param_type_keys;\r\n            U64 count = lt->count;\r\n            for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)\r\n            {\r\n              if(!e_type_match(*lp, *rp))\r\n              {\r\n                params_match = 0;\r\n                break;\r\n              }\r\n            }\r\n            result = params_match;\r\n          }\r\n        }break;\r\n        \r\n        case E_TypeKind_Method:\r\n        {\r\n          E_Type *lt = e_type_from_key(l);\r\n          E_Type *rt = e_type_from_key(r);\r\n          if(lt->count == rt->count &&\r\n             e_type_match(lt->direct_type_key, rt->direct_type_key) &&\r\n             e_type_match(lt->owner_type_key, rt->owner_type_key))\r\n          {\r\n            B32 params_match = 1;\r\n            E_TypeKey *lp = lt->param_type_keys;\r\n            E_TypeKey *rp = rt->param_type_keys;\r\n            U64 count = lt->count;\r\n            for(U64 i = 0; i < count; i += 1, lp += 1, rp += 1)\r\n            {\r\n              if(!e_type_match(*lp, *rp))\r\n              {\r\n                params_match = 0;\r\n                break;\r\n              }\r\n            }\r\n            result = params_match;\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\n//- rjf: key -> string\r\n\r\ninternal void\r\ne_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return)\r\n{\r\n  String8 keyword = {0};\r\n  E_TypeKind kind = e_type_kind_from_key(key);\r\n  switch(kind)\r\n  {\r\n    default:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      str8_list_pushf(arena, out, \"%S \", type->name);\r\n    }break;\r\n    \r\n    case E_TypeKind_Bitfield:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      e_type_lhs_string_from_key(arena, type->direct_type_key, out, prec, skip_return);\r\n      str8_list_pushf(arena, out, \": %I64u\", type->count);\r\n    }break;\r\n    \r\n    case E_TypeKind_Modifier:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      E_TypeKey direct = type->direct_type_key;\r\n      e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);\r\n      if(type->flags & E_TypeFlag_Const)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"const \"));\r\n      }\r\n      if(type->flags & E_TypeFlag_Volatile)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"volatile \"));\r\n      }\r\n      if(type->flags & E_TypeFlag_Restrict)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"restrict \"));\r\n      }\r\n    }break;\r\n    \r\n    case E_TypeKind_Variadic:\r\n    {\r\n      str8_list_push(arena, out, str8_lit(\"...\"));\r\n    }break;\r\n    \r\n    case E_TypeKind_Struct:\r\n    case E_TypeKind_Union:\r\n    case E_TypeKind_Enum:\r\n    case E_TypeKind_Class:\r\n    case E_TypeKind_Alias:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      str8_list_pushf(arena, out, \"%S \", type->name);\r\n    }break;\r\n    \r\n    case E_TypeKind_IncompleteStruct: keyword = str8_lit(\"struct\"); goto fwd_udt;\r\n    case E_TypeKind_IncompleteUnion:  keyword = str8_lit(\"union\"); goto fwd_udt;\r\n    case E_TypeKind_IncompleteEnum:   keyword = str8_lit(\"enum\"); goto fwd_udt;\r\n    case E_TypeKind_IncompleteClass:  keyword = str8_lit(\"class\"); goto fwd_udt;\r\n    fwd_udt:;\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      str8_list_push(arena, out, keyword);\r\n      str8_list_push(arena, out, str8_lit(\" \"));\r\n      str8_list_pushf(arena, out, \"%S \", type->name);\r\n    }break;\r\n    \r\n    case E_TypeKind_Array:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_lhs_string_from_key(arena, direct, out, 2, skip_return);\r\n      if(prec == 1)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"(\"));\r\n      }\r\n    }break;\r\n    \r\n    case E_TypeKind_Function:\r\n    {\r\n      if(!skip_return)\r\n      {\r\n        E_TypeKey direct = e_type_key_direct(key);\r\n        e_type_lhs_string_from_key(arena, direct, out, 2, 0);\r\n      }\r\n      if(prec == 1)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"(\"));\r\n      }\r\n    }break;\r\n    \r\n    case E_TypeKind_Lens:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      str8_list_pushf(arena, out, \"%S(\", type->name);\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      String8 direct_string = e_type_string_from_key(arena, direct);\r\n      str8_list_push(arena, out, direct_string);\r\n      for EachIndex(idx, type->count)\r\n      {\r\n        String8 string = e_string_from_expr(arena, type->args[idx], str8_zero());\r\n        str8_list_pushf(arena, out, \", \");\r\n        str8_list_push(arena, out, string);\r\n      }\r\n      str8_list_pushf(arena, out, \")\");\r\n    }break;\r\n    \r\n    case E_TypeKind_Ptr:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);\r\n      str8_list_push(arena, out, str8_lit(\"*\"));\r\n      E_Type *type = e_type_from_key(key);\r\n      if(type->count != 1)\r\n      {\r\n        str8_list_pushf(arena, out, \".%I64u\", type->count);\r\n      }\r\n    }break;\r\n    \r\n    case E_TypeKind_LRef:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);\r\n      str8_list_push(arena, out, str8_lit(\"&\"));\r\n    }break;\r\n    \r\n    case E_TypeKind_RRef:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);\r\n      str8_list_push(arena, out, str8_lit(\"&&\"));\r\n    }break;\r\n    \r\n    case E_TypeKind_MemberPtr:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      E_TypeKey direct = type->direct_type_key;\r\n      e_type_lhs_string_from_key(arena, direct, out, 1, skip_return);\r\n      E_Type *container = e_type_from_key(type->owner_type_key);\r\n      if(container->kind != E_TypeKind_Null)\r\n      {\r\n        str8_list_push(arena, out, push_str8_copy(arena, container->name));\r\n      }\r\n      else\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"<unknown-class>\"));\r\n      }\r\n      str8_list_push(arena, out, str8_lit(\"::*\"));\r\n    }break;\r\n    \r\n    case E_TypeKind_MetaExpr:\r\n    case E_TypeKind_MetaDisplayName:\r\n    case E_TypeKind_MetaDescription:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_lhs_string_from_key(arena, direct, out, prec, skip_return);\r\n    }break;\r\n  }\r\n}\r\n\r\ninternal void\r\ne_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec)\r\n{\r\n  E_TypeKind kind = e_type_kind_from_key(key);\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    \r\n    case E_TypeKind_Bitfield:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_rhs_string_from_key(arena, direct, out, prec);\r\n    }break;\r\n    \r\n    case E_TypeKind_Modifier:\r\n    case E_TypeKind_Ptr:\r\n    case E_TypeKind_LRef:\r\n    case E_TypeKind_RRef:\r\n    case E_TypeKind_MemberPtr:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_rhs_string_from_key(arena, direct, out, 1);\r\n    }break;\r\n    \r\n    case E_TypeKind_Array:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      if(prec == 1)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\")\"));\r\n      }\r\n      String8 count_str = str8_from_u64(arena, type->count, 10, 0, 0);\r\n      str8_list_push(arena, out, str8_lit(\"[\"));\r\n      str8_list_push(arena, out, count_str);\r\n      str8_list_push(arena, out, str8_lit(\"]\"));\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_rhs_string_from_key(arena, direct, out, 2);\r\n    }break;\r\n    \r\n    case E_TypeKind_Function:\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      if(prec == 1)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\")\"));\r\n      }\r\n      if(type->count == 0)\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"(void)\"));\r\n      }\r\n      else\r\n      {\r\n        str8_list_push(arena, out, str8_lit(\"(\"));\r\n        U64 param_count = type->count;\r\n        E_TypeKey *param_type_keys = type->param_type_keys;\r\n        for(U64 param_idx = 0; param_idx < param_count; param_idx += 1)\r\n        {\r\n          E_TypeKey param_type_key = param_type_keys[param_idx];\r\n          String8 param_str = e_type_string_from_key(arena, param_type_key);\r\n          String8 param_str_trimmed = str8_skip_chop_whitespace(param_str);\r\n          str8_list_push(arena, out, param_str_trimmed);\r\n          if(param_idx+1 < param_count)\r\n          {\r\n            str8_list_push(arena, out, str8_lit(\", \"));\r\n          }\r\n        }\r\n        str8_list_push(arena, out, str8_lit(\")\"));\r\n      }\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_rhs_string_from_key(arena, direct, out, 2);\r\n    }break;\r\n    \r\n    case E_TypeKind_MetaExpr:\r\n    {\r\n      E_TypeKey direct = e_type_key_direct(key);\r\n      e_type_rhs_string_from_key(arena, direct, out, prec);\r\n    }break;\r\n  }\r\n}\r\n\r\ninternal String8\r\ne_type_string_from_key(Arena *arena, E_TypeKey key)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  e_type_lhs_string_from_key(scratch.arena, key, &list, 0, 0);\r\n  e_type_rhs_string_from_key(scratch.arena, key, &list, 0);\r\n  String8 result = str8_list_join(arena, &list, 0);\r\n  result = str8_skip_chop_whitespace(result);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal E_TypeKey\r\ne_default_expansion_type_from_key(E_TypeKey root_key)\r\n{\r\n  E_TypeKey type_key = zero_struct;\r\n  B32 hit_1ptr = 0;\r\n  for(E_TypeKey key = root_key;\r\n      !e_type_key_match(e_type_key_zero(), key);\r\n      key = e_type_key_direct(key))\r\n  {\r\n    B32 done = 1;\r\n    E_TypeKind kind = e_type_kind_from_key(key);\r\n    \r\n    //- rjf: if we have pointers which point to a single thing (count = 1),\r\n    // or we have a lens, or we have a modifier node, then we will defer to\r\n    // the next type in the chain.\r\n    //\r\n    // if this pointer points to N things (count > 1), then we can use it for\r\n    // array-like expansion.\r\n    //\r\n    if(e_type_kind_is_pointer_or_ref(kind))\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      if(!e_type_key_match(e_type_key_basic(E_TypeKind_Void), type->direct_type_key))\r\n      {\r\n        if(type->count == 1 && hit_1ptr)\r\n        {\r\n          type_key = key;\r\n        }\r\n        else if(type->count == 1 && !hit_1ptr)\r\n        {\r\n          hit_1ptr = 1;\r\n          done = 0;\r\n        }\r\n        else if(type->count > 1)\r\n        {\r\n          type_key = key;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: if we have lenses or modifiers in the type chain, then we will\r\n    // defer to the next type in the chain.\r\n    //\r\n    // NOTE(rjf): while it may seem like a lens type needs to do something\r\n    // different, because lenses sometimes want to define their own expansion\r\n    // rules, they would've redirected to an entirely different expansion\r\n    // hook. if we are in the default expansion hook, then the lenses do not\r\n    // impact the expansion at all (e.g. they are for other cosmetic things,\r\n    // like visualizers or integer radix changes), and so in that case we\r\n    // want to ignore them.\r\n    //\r\n    else if(kind == E_TypeKind_Lens ||\r\n            kind == E_TypeKind_Modifier ||\r\n            kind == E_TypeKind_Alias)\r\n    {\r\n      done = 0;\r\n    }\r\n    \r\n    //- rjf: if we have meta-expression tags in the type chain, defer\r\n    // to the next type in the chain.\r\n    else if(E_TypeKind_FirstMeta <= kind && kind <= E_TypeKind_LastMeta)\r\n    {\r\n      done = 0;\r\n    }\r\n    \r\n    //- rjf: if we've reached a struct-like, then we can use that for\r\n    // struct-like expansion.\r\n    else if(kind == E_TypeKind_Struct ||\r\n            kind == E_TypeKind_Union ||\r\n            kind == E_TypeKind_Class ||\r\n            kind == E_TypeKind_Set)\r\n    {\r\n      type_key = key;\r\n    }\r\n    \r\n    //- rjf: if we've reached an enum-like, then we can use that for\r\n    // enum-like expansion.\r\n    else if(kind == E_TypeKind_Enum)\r\n    {\r\n      type_key = key;\r\n    }\r\n    \r\n    //- rjf: if we've reached an array, then we can use that for array-like\r\n    // expansion.\r\n    else if(kind == E_TypeKind_Array)\r\n    {\r\n      type_key = key;\r\n    }\r\n    \r\n    //- rjf: if we're done, then just break.\r\n    if(done)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  \r\n  return type_key;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Lookups\r\n\r\ninternal E_Type *\r\ne_type_from_key(E_TypeKey key)\r\n{\r\n  E_Type *type = &e_type_nil;\r\n  {\r\n    U64 hash = e_hash_from_string(5381, str8_struct(&key));\r\n    U64 slot_idx = hash%e_cache->type_cache_slots_count;\r\n    E_TypeCacheNode *node = 0;\r\n    for(E_TypeCacheNode *n = e_cache->type_cache_slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      if(e_type_key_match(key, n->key))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      node = push_array(e_cache->arena, E_TypeCacheNode, 1);\r\n      node->key = key;\r\n      node->type = e_push_type_from_key(e_cache->arena, key);\r\n      SLLQueuePush(e_cache->type_cache_slots[slot_idx].first, e_cache->type_cache_slots[slot_idx].last, node);\r\n    }\r\n    type = node->type;\r\n  }\r\n  return type;\r\n}\r\n\r\n//- rjf: member lookups\r\n\r\ninternal E_MemberCacheNode *\r\ne_member_cache_node_from_type_key(E_TypeKey key)\r\n{\r\n  U64 hash = e_hash_from_string(5381, str8_struct(&key));\r\n  U64 slot_idx = hash%e_cache->member_cache_slots_count;\r\n  E_MemberCacheSlot *slot = &e_cache->member_cache_slots[slot_idx];\r\n  E_MemberCacheNode *node = 0;\r\n  for(E_MemberCacheNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(e_type_key_match(n->key, key))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node == 0)\r\n  {\r\n    node = push_array(e_cache->arena, E_MemberCacheNode, 1);\r\n    SLLQueuePush(slot->first, slot->last, node);\r\n    node->key = key;\r\n    node->members = e_type_data_members_from_key(e_cache->arena, key);\r\n    node->member_hash_slots_count = node->members.count;\r\n    node->member_hash_slots = push_array(e_cache->arena, E_MemberHashSlot, node->member_hash_slots_count);\r\n    node->member_filter_slots_count = 16;\r\n    node->member_filter_slots = push_array(e_cache->arena, E_MemberFilterSlot, node->member_filter_slots_count);\r\n    for EachIndex(idx, node->members.count)\r\n    {\r\n      U64 hash = e_hash_from_string(5381, node->members.v[idx].name);\r\n      U64 slot_idx = hash%node->member_hash_slots_count;\r\n      E_MemberHashNode *n = push_array(e_cache->arena, E_MemberHashNode, 1);\r\n      SLLQueuePush(node->member_hash_slots[slot_idx].first, node->member_hash_slots[slot_idx].last, n);\r\n      n->member_idx = idx;\r\n    }\r\n  }\r\n  return node;\r\n}\r\n\r\ninternal E_MemberArray\r\ne_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter)\r\n{\r\n  E_MemberArray members = {0};\r\n  E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);\r\n  if(node != 0)\r\n  {\r\n    if(filter.size == 0)\r\n    {\r\n      members = node->members;\r\n    }\r\n    else\r\n    {\r\n      U64 hash = e_hash_from_string(5381, filter);\r\n      U64 slot_idx = hash%node->member_filter_slots_count;\r\n      E_MemberFilterSlot *slot = &node->member_filter_slots[slot_idx];\r\n      E_MemberFilterNode *filter_node = 0;\r\n      for(E_MemberFilterNode *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(str8_match(n->filter, filter, 0))\r\n        {\r\n          filter_node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(filter_node == 0)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        filter_node = push_array(e_cache->arena, E_MemberFilterNode, 1);\r\n        filter_node->filter = push_str8_copy(e_cache->arena, filter);\r\n        E_MemberList member_list__filtered = {0};\r\n        for EachIndex(idx, node->members.count)\r\n        {\r\n          E_Member *member = &node->members.v[idx];\r\n          FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, member->name);\r\n          if(matches.count == matches.needle_part_count)\r\n          {\r\n            e_member_list_push(scratch.arena, &member_list__filtered, member);\r\n          }\r\n        }\r\n        filter_node->members_filtered = e_member_array_from_list(e_cache->arena, &member_list__filtered);\r\n        scratch_end(scratch);\r\n      }\r\n      members = filter_node->members_filtered;\r\n    }\r\n  }\r\n  return members;\r\n}\r\n\r\ninternal E_MemberArray\r\ne_type_data_members_from_key__cached(E_TypeKey key)\r\n{\r\n  E_MemberArray members = {0};\r\n  E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);\r\n  if(node != 0)\r\n  {\r\n    members = node->members;\r\n  }\r\n  return members;\r\n}\r\n\r\ninternal E_Member\r\ne_type_member_from_key_name__cached(E_TypeKey key, String8 name)\r\n{\r\n  E_Member result = {0};\r\n  E_MemberCacheNode *node = e_member_cache_node_from_type_key(key);\r\n  if(node != 0 && node->member_hash_slots_count != 0)\r\n  {\r\n    U64 hash = e_hash_from_string(5381, name);\r\n    U64 slot_idx = hash%node->member_hash_slots_count;\r\n    for(E_MemberHashNode *n = node->member_hash_slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(node->members.v[n->member_idx].name, name, 0))\r\n      {\r\n        result = node->members.v[n->member_idx];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: enum val lookups\r\n\r\ninternal E_EnumValCacheNode *\r\ne_enum_val_cache_node_from_type_key(E_TypeKey key)\r\n{\r\n  U64 hash = e_hash_from_string(5381, str8_struct(&key));\r\n  U64 slot_idx = hash%e_cache->enum_val_cache_slots_count;\r\n  E_EnumValCacheSlot *slot = &e_cache->enum_val_cache_slots[slot_idx];\r\n  E_EnumValCacheNode *node = 0;\r\n  for(E_EnumValCacheNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(e_type_key_match(n->key, key))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node == 0)\r\n  {\r\n    node = push_array(e_cache->arena, E_EnumValCacheNode, 1);\r\n    SLLQueuePush(slot->first, slot->last, node);\r\n    node->key = key;\r\n    E_Type *type = e_type_from_key(key);\r\n    if(type->kind == E_TypeKind_Enum)\r\n    {\r\n      node->val_hash_slots_count = type->count;\r\n      node->val_hash_slots = push_array(e_cache->arena, E_EnumValHashSlot, node->val_hash_slots_count);\r\n      node->val_filter_slots_count = 16;\r\n      node->val_filter_slots = push_array(e_cache->arena, E_EnumValFilterSlot, node->val_filter_slots_count);\r\n      for EachIndex(idx, type->count)\r\n      {\r\n        U64 hash = e_hash_from_string(5381, type->enum_vals[idx].name);\r\n        U64 slot_idx = hash%node->val_hash_slots_count;\r\n        E_EnumValHashNode *n = push_array(e_cache->arena, E_EnumValHashNode, 1);\r\n        SLLQueuePush(node->val_hash_slots[slot_idx].first, node->val_hash_slots[slot_idx].last, n);\r\n        n->val_idx = idx;\r\n      }\r\n    }\r\n  }\r\n  return node;\r\n}\r\n\r\ninternal E_EnumValArray\r\ne_type_enum_vals_from_key_filter__cached(E_TypeKey key, String8 filter)\r\n{\r\n  E_EnumValArray enum_vals = {0};\r\n  E_EnumValCacheNode *node = e_enum_val_cache_node_from_type_key(key);\r\n  if(node != 0)\r\n  {\r\n    if(filter.size == 0)\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      if(type->kind == E_TypeKind_Enum)\r\n      {\r\n        enum_vals.v = type->enum_vals;\r\n        enum_vals.count = type->count;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      U64 hash = e_hash_from_string(5381, filter);\r\n      U64 slot_idx = hash%node->val_filter_slots_count;\r\n      E_EnumValFilterSlot *slot = &node->val_filter_slots[slot_idx];\r\n      E_EnumValFilterNode *filter_node = 0;\r\n      for(E_EnumValFilterNode *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(str8_match(n->filter, filter, 0))\r\n        {\r\n          filter_node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(filter_node == 0)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        filter_node = push_array(e_cache->arena, E_EnumValFilterNode, 1);\r\n        filter_node->filter = push_str8_copy(e_cache->arena, filter);\r\n        E_Type *type = e_type_from_key(key);\r\n        E_EnumValList enum_val_list__filtered = {0};\r\n        if(type->kind == E_TypeKind_Enum)\r\n        {\r\n          for EachIndex(idx, type->count)\r\n          {\r\n            E_EnumVal *enum_val = &type->enum_vals[idx];\r\n            FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, enum_val->name);\r\n            if(matches.count == matches.needle_part_count)\r\n            {\r\n              e_enum_val_list_push(scratch.arena, &enum_val_list__filtered, enum_val);\r\n            }\r\n          }\r\n        }\r\n        filter_node->vals_filtered = e_enum_val_array_from_list(e_cache->arena, &enum_val_list__filtered);\r\n        scratch_end(scratch);\r\n      }\r\n      enum_vals = filter_node->vals_filtered;\r\n    }\r\n  }\r\n  return enum_vals;\r\n}\r\n\r\ninternal E_EnumValArray\r\ne_type_enum_vals_from_key__cached(E_TypeKey key)\r\n{\r\n  E_EnumValArray enum_vals = e_type_enum_vals_from_key_filter__cached(key, str8_zero());\r\n  return enum_vals;\r\n}\r\n\r\ninternal E_EnumVal\r\ne_type_enum_val_from_key_name__cached(E_TypeKey key, String8 name)\r\n{\r\n  E_EnumVal result = {0};\r\n  E_EnumValCacheNode *node = e_enum_val_cache_node_from_type_key(key);\r\n  if(node != 0 && node->val_hash_slots_count != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    E_Type *type = e_type_from_key(key);\r\n    String8 name_qualified_0 = push_str8f(scratch.arena, \"%S%S\", type->name, name);\r\n    String8 name_qualified_1 = push_str8f(scratch.arena, \"%S_%S\", type->name, name);\r\n    U64 hash = e_hash_from_string(5381, name);\r\n    U64 slot_idx = hash%node->val_hash_slots_count;\r\n    for(E_EnumValHashNode *n = node->val_hash_slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(type->enum_vals[n->val_idx].name, name, 0) ||\r\n         str8_match(type->enum_vals[n->val_idx].name, name_qualified_0, 0) ||\r\n         str8_match(type->enum_vals[n->val_idx].name, name_qualified_1, 0))\r\n      {\r\n        result = type->enum_vals[n->val_idx];\r\n        break;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) Default Hooks\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(default)\r\n{\r\n  E_TypeExpandInfo result = {0};\r\n  {\r\n    //- rjf: try to extract a struct-like type key, enum-like, or array-like\r\n    // type key, for expansion\r\n    E_TypeKey expand_type_key = e_default_expansion_type_from_key(eval.irtree.type_key);\r\n    \r\n    //- rjf: struct type? -> use the struct type for expansion\r\n    B32 did_expansion = 0;\r\n    if(!did_expansion)\r\n    {\r\n      E_TypeKind struct_type_kind = e_type_kind_from_key(expand_type_key);\r\n      if(struct_type_kind == E_TypeKind_Struct ||\r\n         struct_type_kind == E_TypeKind_Class ||\r\n         struct_type_kind == E_TypeKind_Union)\r\n      {\r\n        E_MemberArray data_members = e_type_data_members_from_key_filter__cached(expand_type_key, filter);\r\n        result.expr_count = data_members.count;\r\n        did_expansion = 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: array-like type? -> use the array-like for expansion\r\n    if(!did_expansion)\r\n    {\r\n      E_TypeKind array_type_kind = e_type_kind_from_key(expand_type_key);\r\n      if(array_type_kind == E_TypeKind_Array ||\r\n         array_type_kind == E_TypeKind_Ptr ||\r\n         array_type_kind == E_TypeKind_RRef ||\r\n         array_type_kind == E_TypeKind_LRef)\r\n      {\r\n        E_Type *array_type = e_type_from_key(expand_type_key);\r\n        result.expr_count = array_type->count;\r\n        did_expansion = 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: enum-like type? -> use the enum-like for expansion\r\n    if(!did_expansion)\r\n    {\r\n      E_TypeKind enum_type_kind = e_type_kind_from_key(expand_type_key);\r\n      if(enum_type_kind == E_TypeKind_Enum)\r\n      {\r\n        E_EnumValArray enum_vals = e_type_enum_vals_from_key_filter__cached(expand_type_key, filter);\r\n        result.expr_count = enum_vals.count;\r\n        did_expansion = 1;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(default)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  {\r\n    //- rjf: try to extract a struct-like type key, enum-like, or array-like\r\n    // type key, for expansion\r\n    E_TypeKey expand_type_key = e_default_expansion_type_from_key(eval.irtree.type_key);\r\n    E_TypeKind expand_type_kind = e_type_kind_from_key(expand_type_key);\r\n    \r\n    //- rjf: struct case -> the lookup-range will return a range of members\r\n    if(expand_type_kind == E_TypeKind_Struct ||\r\n       expand_type_kind == E_TypeKind_Class ||\r\n       expand_type_kind == E_TypeKind_Union)\r\n    {\r\n      E_MemberArray data_members = e_type_data_members_from_key_filter__cached(expand_type_key, filter);\r\n      Rng1U64 legal_idx_range = r1u64(0, data_members.count);\r\n      Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);\r\n      U64 read_range_count = dim_1u64(read_range);\r\n      for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n      {\r\n        U64 member_idx = idx + read_range.min;\r\n        String8 member_name = data_members.v[member_idx].name;\r\n        evals_out[idx] = e_eval_wrapf(eval, \"$.%S\", member_name);\r\n      }\r\n    }\r\n    \r\n    //- rjf: enum case -> the lookup-range will return a range of enum constants\r\n    else if(expand_type_kind == E_TypeKind_Enum)\r\n    {\r\n      E_Type *type = e_type_from_key(expand_type_key);\r\n      E_EnumValArray enum_vals = e_type_enum_vals_from_key_filter__cached(expand_type_key, filter);\r\n      Rng1U64 legal_idx_range = r1u64(0, enum_vals.count);\r\n      Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);\r\n      U64 read_range_count = dim_1u64(read_range);\r\n      for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n      {\r\n        U64 val_idx = idx + read_range.min;\r\n        String8 member_name = enum_vals.v[val_idx].name;\r\n        String8 sufficient_suffix = member_name;\r\n        if(str8_match(sufficient_suffix, type->name, StringMatchFlag_RightSideSloppy))\r\n        {\r\n          sufficient_suffix = str8_skip(sufficient_suffix, type->name.size);\r\n          if(str8_match(sufficient_suffix, str8_lit(\"_\"), StringMatchFlag_RightSideSloppy))\r\n          {\r\n            sufficient_suffix = str8_skip(sufficient_suffix, 1);\r\n          }\r\n        }\r\n        evals_out[idx] = e_eval_wrapf(eval, \"$.%S\", sufficient_suffix);\r\n      }\r\n    }\r\n    \r\n    //- rjf: ptr case -> the lookup-range will return a range of dereferences\r\n    else if(expand_type_kind == E_TypeKind_Ptr ||\r\n            expand_type_kind == E_TypeKind_LRef ||\r\n            expand_type_kind == E_TypeKind_RRef ||\r\n            expand_type_kind == E_TypeKind_Array ||\r\n            expand_type_kind == E_TypeKind_Set)\r\n    {\r\n      U64 read_range_count = dim_1u64(idx_range);\r\n      for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n      {\r\n        evals_out[idx] = e_eval_wrapf(eval, \"$[%I64u]\", idx_range.min + idx);\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity)\r\n{\r\n  return num;\r\n}\r\n\r\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity)\r\n{\r\n  return id;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `rows` lens\r\n\r\ntypedef struct E_RowsAccel E_RowsAccel;\r\nstruct E_RowsAccel\r\n{\r\n  E_Eval *root_evals;\r\n  Rng1U64 *root_evals_ranges;\r\n};\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(rows)\r\n{\r\n  E_Type *type = e_type_from_key(eval.irtree.type_key);\r\n  E_RowsAccel *accel = push_array(arena, E_RowsAccel, 1);\r\n  accel->root_evals = push_array(arena, E_Eval, type->count);\r\n  accel->root_evals_ranges = push_array(arena, Rng1U64, type->count);\r\n  E_ParentKey(eval.key)\r\n  {\r\n    for EachIndex(idx, type->count)\r\n    {\r\n      accel->root_evals[idx] = e_eval_from_expr(type->args[idx]);\r\n      accel->root_evals_ranges[idx] = r1u64(idx, idx+1);\r\n    }\r\n  }\r\n  E_TypeExpandInfo info = {accel, type->count};\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(rows)\r\n{\r\n  E_RowsAccel *accel = (E_RowsAccel *)user_data;\r\n  U64 out_idx = 0;\r\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\r\n  {\r\n    evals_out[out_idx] = accel->root_evals[idx];\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `omit` lens\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(omit)\r\n{\r\n  E_Type *type = e_type_from_key(eval.irtree.type_key);\r\n  String8Array allowed_children_array = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8List allowed_children = {0};\r\n    {\r\n      E_Eval eval_stripped = e_eval_wrapf(eval, \"q:raw($)\");\r\n      E_TypeExpandRule *expand_rule = e_expand_rule_from_type_key(eval_stripped.irtree.type_key);\r\n      E_TypeExpandInfo expand_info = expand_rule->info(scratch.arena, eval_stripped, filter);\r\n      if(expand_info.expr_count < 4096)\r\n      {\r\n        E_Eval *evals = push_array(scratch.arena, E_Eval, expand_info.expr_count);\r\n        for EachIndex(idx, expand_info.expr_count)\r\n        {\r\n          evals[idx] = e_eval_nil;\r\n        }\r\n        expand_rule->range(scratch.arena, expand_info.user_data, eval_stripped, filter, r1u64(0, expand_info.expr_count), evals);\r\n        for EachIndex(idx, expand_info.expr_count)\r\n        {\r\n          if(evals[idx].expr->kind == E_ExprKind_MemberAccess)\r\n          {\r\n            String8 name = evals[idx].expr->first->next->string;\r\n            B32 name_is_allowed = 1;\r\n            for EachIndex(arg_idx, type->count)\r\n            {\r\n              if(str8_match(type->args[arg_idx]->string, name, 0))\r\n              {\r\n                name_is_allowed = 0;\r\n                break;\r\n              }\r\n            }\r\n            if(name_is_allowed)\r\n            {\r\n              str8_list_push(scratch.arena, &allowed_children, push_str8_copy(arena, name));\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    allowed_children_array = str8_array_from_list(arena, &allowed_children);\r\n    scratch_end(scratch);\r\n  }\r\n  String8Array *ext = push_array(arena, String8Array, 1);\r\n  *ext = allowed_children_array;\r\n  E_TypeExpandInfo info = {ext, ext->count};\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(omit)\r\n{\r\n  String8Array *ext = (String8Array *)user_data;\r\n  U64 out_idx = 0;\r\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\r\n  {\r\n    String8 name = ext->v[idx];\r\n    if(name.size != 0)\r\n    {\r\n      evals_out[out_idx] = e_eval_wrapf(eval, \"$.%S\", name);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `sequence` lens\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(sequence)\r\n{\r\n  E_TypeExpandInfo info = {0, e_value_eval_from_eval(eval).value.u64};\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(sequence)\r\n{\r\n  U64 read_range_count = dim_1u64(idx_range);\r\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n  {\r\n    evals_out[idx] = e_eval_from_stringf(\"%I64u\", idx_range.min + idx);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `array` lens\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(array)\r\n{\r\n  E_Type *type = e_type_from_key(eval.irtree.type_key);\r\n  U64 count = 1;\r\n  if(type->args != 0 && type->count > 0) E_ParentKey(eval.key)\r\n  {\r\n    E_Key count_key = e_key_from_expr(type->args[0]);\r\n    E_Value count_value = e_value_from_key(count_key);\r\n    count = count_value.u64;\r\n  }\r\n  E_TypeExpandInfo info = {0, count};\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(array)\r\n{\r\n  U64 read_range_count = dim_1u64(idx_range);\r\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n  {\r\n    evals_out[idx] = e_eval_wrapf(eval, \"$[%I64u]\", idx_range.min + idx);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `list` lens\r\n\r\ninternal AC_Artifact\r\ne_list_gather_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: unpack key\r\n  // TODO(rjf): this needs to take any `E_Space`, once eval has been upgraded.\r\n  CTRL_Handle process = {0};\r\n  U64 base_off = 0;\r\n  U64 member_element_off = 0;\r\n  U64 member_size = 0;\r\n  E_SpaceRWFunction *space_read = 0;\r\n  {\r\n    U64 key_read_off = 0;\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &process);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &base_off);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &member_element_off);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &member_size);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &space_read);\r\n  }\r\n  \r\n  //- rjf: gather chain\r\n  typedef struct HitOffsetNode HitOffsetNode;\r\n  struct HitOffsetNode\r\n  {\r\n    HitOffsetNode *next;\r\n    U64 off;\r\n  };\r\n  typedef struct OffsetChunk OffsetChunk;\r\n  struct OffsetChunk\r\n  {\r\n    OffsetChunk *next;\r\n    U64 *v;\r\n    U64 count;\r\n    U64 cap;\r\n  };\r\n  OffsetChunk *first_chunk = 0;\r\n  OffsetChunk *last_chunk = 0;\r\n  U64 total_count = 0;\r\n  B32 retry = 0;\r\n  {\r\n    U64 hit_slots_count = 4096;\r\n    HitOffsetNode **hit_slots = push_array(scratch.arena, HitOffsetNode *, hit_slots_count);\r\n    for(U64 off = base_off, next_off = 0;; off = next_off)\r\n    {\r\n      //- rjf: see if we've cycled\r\n      B32 hit_cycle = 0;\r\n      {\r\n        U64 hash = u64_hash_from_str8(str8_struct(&off));\r\n        U64 slot_idx = hash%hit_slots_count;\r\n        for(HitOffsetNode *n = hit_slots[slot_idx]; n != 0; n = n->next)\r\n        {\r\n          if(n->off == off)\r\n          {\r\n            hit_cycle = 1;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: terminate loop\r\n      B32 terminated = (hit_cycle || off == 0);\r\n      if(terminated)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      //- rjf: another node -> push offset to chunk list\r\n      OffsetChunk *chunk = last_chunk;\r\n      if(chunk == 0 || chunk->count >= chunk->cap)\r\n      {\r\n        chunk = push_array(scratch.arena, OffsetChunk, 1);\r\n        SLLQueuePush(first_chunk, last_chunk, chunk);\r\n        chunk->cap = 1024;\r\n        chunk->v = push_array_no_zero(scratch.arena, U64, chunk->cap);\r\n      }\r\n      chunk->v[chunk->count] = off;\r\n      chunk->count += 1;\r\n      total_count += 1;\r\n      \r\n      //- rjf: record this offset in our hit-offset table\r\n      {\r\n        U64 hash = u64_hash_from_str8(str8_struct(&off));\r\n        U64 slot_idx = hash%hit_slots_count;\r\n        HitOffsetNode *n = push_array(scratch.arena, HitOffsetNode, 1);\r\n        n->off = off;\r\n        SLLStackPush(hit_slots[slot_idx], n);\r\n      }\r\n      \r\n      //- rjf: read next offset, advance\r\n      B32 read_stale = 0;\r\n      B32 read_good = ctrl_process_memory_read(process, r1u64(off + member_element_off, off + member_element_off + member_size), &read_stale, &next_off, 0);\r\n      if(read_stale)\r\n      {\r\n        retry = 1;\r\n      }\r\n      if(!read_good)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: retry\r\n  if(retry)\r\n  {\r\n    retry_out[0] = 1;\r\n  }\r\n  \r\n  //- rjf: flatten\r\n  Arena *arena = 0;\r\n  U64 node_offs_count = 0;\r\n  U64 *node_offs = 0;\r\n  if(!retry && total_count != 0)\r\n  {\r\n    arena = arena_alloc();\r\n    node_offs_count = total_count;\r\n    node_offs = push_array_no_zero(arena, U64, node_offs_count);\r\n    {\r\n      U64 idx = 0;\r\n      for EachNode(n, OffsetChunk, first_chunk)\r\n      {\r\n        MemoryCopy(node_offs + idx, n->v, n->count * sizeof(n->v[0]));\r\n        idx += n->count;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: package\r\n  AC_Artifact artifact = {0};\r\n  {\r\n    artifact.u64[0] = (U64)arena;\r\n    artifact.u64[1] = (U64)node_offs;\r\n    artifact.u64[2] = node_offs_count;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\ne_list_gather_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  Arena *arena = (Arena *)artifact.u64[0];\r\n  if(arena != 0)\r\n  {\r\n    arena_release(arena);\r\n  }\r\n}\r\n\r\ntypedef struct E_ListIRExt E_ListIRExt;\r\nstruct E_ListIRExt\r\n{\r\n  U64 *offs;\r\n  U64 offs_count;\r\n};\r\n\r\nE_TYPE_IREXT_FUNCTION_DEF(list)\r\n{\r\n  E_IRExt result = {0};\r\n  E_Type *type = e_type_from_key(irtree->type_key);\r\n  \r\n  //- rjf: get member encoding the link to the next node\r\n  E_Member next_link_member = {0};\r\n  {\r\n    E_TypeKey node_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);\r\n    \r\n    // rjf: try explicitly-passed name\r\n    if(next_link_member.kind == E_MemberKind_Null && type->args != 0 && type->count > 0 && type->args[0]->kind == E_ExprKind_LeafIdentifier)\r\n    {\r\n      String8 name = type->args[0]->string;\r\n      next_link_member = e_type_member_from_key_name__cached(node_type_key, name);\r\n    }\r\n    \r\n    // rjf: try `next`\r\n    if(next_link_member.kind == E_MemberKind_Null)\r\n    {\r\n      next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit(\"next\"));\r\n    }\r\n    \r\n    // rjf: try `prev`\r\n    if(next_link_member.kind == E_MemberKind_Null)\r\n    {\r\n      next_link_member = e_type_member_from_key_name__cached(node_type_key, str8_lit(\"prev\"));\r\n    }\r\n    \r\n    // rjf: try any pointer to the same type\r\n    if(next_link_member.kind == E_MemberKind_Null)\r\n    {\r\n      E_Type *node_type = e_type_from_key(node_type_key);\r\n      if(node_type->members != 0)\r\n      {\r\n        for EachIndex(idx, node_type->count)\r\n        {\r\n          if(node_type->members[idx].kind != E_MemberKind_DataField)\r\n          {\r\n            continue;\r\n          }\r\n          E_TypeKey member_type_key = node_type->members[idx].type_key;\r\n          E_TypeKey member_type_key_undecorated = e_type_key_unwrap(member_type_key, E_TypeUnwrapFlag_AllDecorative);\r\n          E_TypeKey member_ptee_type_key = e_type_key_unwrap(member_type_key_undecorated, E_TypeUnwrapFlag_All);\r\n          if(e_type_kind_from_key(member_type_key_undecorated) == E_TypeKind_Ptr &&\r\n             e_type_key_match(member_ptee_type_key, node_type_key))\r\n          {\r\n            next_link_member = node_type->members[idx];\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: generate expansion info\r\n  E_TypeExpandInfo info = {0, 0};\r\n  if(next_link_member.kind != E_MemberKind_DataField)\r\n  {\r\n    // TODO(rjf): error reporting\r\n  }\r\n  else\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    Access *access = access_open();\r\n    \r\n    // rjf: evaluate first offset\r\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root);\r\n    String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\r\n    E_Interpretation base_off_interpret = e_interpret(bytecode);\r\n    \r\n    // rjf: get artifact\r\n#pragma pack(push, 1)\r\n    struct\r\n    {\r\n      CTRL_Handle process;\r\n      U64 base_off;\r\n      U64 member_element_off;\r\n      U64 member_size;\r\n      E_SpaceRWFunction *space_read;\r\n    }\r\n    key_data =\r\n    {\r\n      // TODO(rjf): we cannot use `rd_` here - only doing this because the base eval layer does not\r\n      // support what we need yet...\r\n      rd_ctrl_entity_from_eval_space(base_off_interpret.space)->handle,\r\n      base_off_interpret.value.u64,\r\n      next_link_member.off,\r\n      e_type_byte_size_from_key(next_link_member.type_key),\r\n      e_base_ctx->space_read,\r\n    };\r\n#pragma pack(pop)\r\n    AC_Artifact gather_artifact = ac_artifact_from_key(access, str8_struct(&key_data), e_list_gather_artifact_create, e_list_gather_artifact_destroy, 0, .gen = e_space_gen(base_off_interpret.space));\r\n    U64 *offs = (U64 *)gather_artifact.u64[1];\r\n    U64 offs_count = gather_artifact.u64[2];\r\n    \r\n    // rjf: fill info from artifact\r\n    E_ListIRExt *ext = push_array(arena, E_ListIRExt, 1);\r\n    ext->offs = offs;\r\n    ext->offs_count = offs_count;\r\n    result.user_data = ext;\r\n    \r\n    access_close(access);\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(list)\r\n{\r\n  E_ListIRExt *ext = (E_ListIRExt *)eval.irtree.user_data;\r\n  U64 count = 0;\r\n  if(ext != 0)\r\n  {\r\n    count = ext->offs_count;\r\n  }\r\n  E_TypeExpandInfo info = {0, count};\r\n  return info;\r\n}\r\n\r\nE_TYPE_ACCESS_FUNCTION_DEF(list)\r\n{\r\n  E_IRTreeAndType result = {&e_irnode_nil};\r\n  E_ListIRExt *ext = (E_ListIRExt *)lhs_irtree->user_data;\r\n  if(ext != 0 && expr->kind == E_ExprKind_ArrayIndex)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    // rjf: compute index\r\n    E_Expr *rhs_expr = expr->last;\r\n    E_IRTreeAndType rhs_irtree = e_push_irtree_and_type_from_expr(scratch.arena, overridden, &e_default_identifier_resolution_rule, 0, 0, rhs_expr);\r\n    E_OpList rhs_oplist = e_oplist_from_irtree(scratch.arena, rhs_irtree.root);\r\n    String8 rhs_bytecode = e_bytecode_from_oplist(scratch.arena, &rhs_oplist);\r\n    E_Interpretation rhs_interpret = e_interpret(rhs_bytecode);\r\n    U64 idx = rhs_interpret.value.u64;\r\n    \r\n    // rjf: get offset\r\n    U64 off = 0;\r\n    if(idx < ext->offs_count)\r\n    {\r\n      off = ext->offs[idx];\r\n    }\r\n    \r\n    // rjf: generate IR tree to compute this offset w/ the node type\r\n    result.root = e_irtree_const_u(arena, off);\r\n    result.type_key = e_type_key_unwrap(lhs_irtree->type_key, E_TypeUnwrapFlag_AllDecorative);\r\n    result.mode = E_Mode_Offset;\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(list)\r\n{\r\n  U64 read_range_count = dim_1u64(idx_range);\r\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n  {\r\n    evals_out[idx] = e_eval_wrapf(eval, \"$[%I64u]\", idx_range.min + idx);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `slice` lens\r\n\r\ntypedef struct E_SliceIRExt E_SliceIRExt;\r\nstruct E_SliceIRExt\r\n{\r\n  E_Member *base_ptr_member;\r\n  E_Member *opl_ptr_member;\r\n  E_Member *count_member;\r\n};\r\n\r\ntypedef struct E_SliceAccel E_SliceAccel;\r\nstruct E_SliceAccel\r\n{\r\n  Arch arch;\r\n  U64 count;\r\n  U64 base_ptr_vaddr;\r\n  E_TypeKey element_type_key;\r\n};\r\n\r\nE_TYPE_IREXT_FUNCTION_DEF(slice)\r\n{\r\n  E_SliceIRExt *ext = push_array(arena, E_SliceIRExt, 1);\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    // rjf: build info from struct type\r\n    E_TypeKey struct_type_key = e_type_key_unwrap(irtree->type_key, E_TypeUnwrapFlag_All);\r\n    E_TypeKind type_kind = e_type_kind_from_key(struct_type_key);\r\n    if(type_kind == E_TypeKind_Struct || type_kind == E_TypeKind_Class)\r\n    {\r\n      // rjf: unpack members\r\n      E_MemberArray members = e_type_data_members_from_key__cached(struct_type_key);\r\n      \r\n      // rjf: choose base pointer & count members\r\n      E_Member *base_ptr_member = 0;\r\n      E_Member *opl_ptr_member = 0;\r\n      E_Member *count_member = 0;\r\n      for(U64 idx = 0; idx < members.count; idx += 1)\r\n      {\r\n        E_Member *member = &members.v[idx];\r\n        E_TypeKey member_type = e_type_key_unwrap(member->type_key, E_TypeUnwrapFlag_AllDecorative);\r\n        E_TypeKind member_type_kind = e_type_kind_from_key(member_type);\r\n        if(count_member == 0 && e_type_kind_is_integer(member_type_kind))\r\n        {\r\n          count_member = member;\r\n        }\r\n        if(base_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind))\r\n        {\r\n          base_ptr_member = &members.v[idx];\r\n        }\r\n        else if(base_ptr_member != 0 && opl_ptr_member == 0 && e_type_kind_is_pointer_or_ref(member_type_kind))\r\n        {\r\n          opl_ptr_member = &members.v[idx];\r\n        }\r\n        if(count_member != 0 && base_ptr_member != 0)\r\n        {\r\n          break;\r\n        }\r\n        else if(base_ptr_member != 0 && opl_ptr_member != 0)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: fill extension\r\n      ext->base_ptr_member = base_ptr_member;\r\n      ext->opl_ptr_member = opl_ptr_member;\r\n      ext->count_member = count_member;\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  E_IRExt result = {ext};\r\n  return result;\r\n}\r\n\r\nE_TYPE_ACCESS_FUNCTION_DEF(slice)\r\n{\r\n  E_IRTreeAndType result = {&e_irnode_nil};\r\n  E_SliceIRExt *ext = (E_SliceIRExt *)lhs_irtree->user_data;\r\n  switch(expr->kind)\r\n  {\r\n    default:\r\n    case E_ExprKind_MemberAccess:\r\n    {\r\n      result = E_TYPE_ACCESS_FUNCTION_NAME(default)(arena, overridden, expr, lhs_irtree);\r\n    }break;\r\n    case E_ExprKind_ArrayIndex:\r\n    if(ext->base_ptr_member != 0)\r\n    {\r\n      Temp scratch = scratch_begin(&arena, 1);\r\n      U64 addr_size = e_type_byte_size_from_key(ext->base_ptr_member->type_key);\r\n      \r\n      // rjf: compute ir tree for struct base\r\n      E_IRNode *struct_base_tree = &e_irnode_nil;\r\n      {\r\n        E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, lhs_irtree->root);\r\n        String8 lhs_bytecode = e_bytecode_from_oplist(arena, &lhs_oplist);\r\n        struct_base_tree = e_irtree_bytecode_no_copy(arena, lhs_bytecode);\r\n        if(e_type_kind_is_pointer_or_ref(e_type_kind_from_key(e_type_key_unwrap(lhs_irtree->type_key, E_TypeUnwrapFlag_AllDecorative))))\r\n        {\r\n          struct_base_tree = e_irtree_resolve_to_value(arena, lhs_irtree->mode, lhs_irtree->root, lhs_irtree->type_key);\r\n        }\r\n      }\r\n      \r\n      // rjf: compute ir tree for base pointer value calculation\r\n      E_IRNode *base_ptr_tree = &e_irnode_nil;\r\n      if(struct_base_tree != &e_irnode_nil)\r\n      {\r\n        base_ptr_tree = struct_base_tree;\r\n        if(ext->base_ptr_member->off != 0)\r\n        {\r\n          base_ptr_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, addr_size, struct_base_tree, e_irtree_const_u(arena, ext->base_ptr_member->off));\r\n        }\r\n        base_ptr_tree = e_irtree_mem_read_type(arena, base_ptr_tree, ext->base_ptr_member->type_key);\r\n      }\r\n      \r\n      // rjf: compute ir tree for adding to the base ptr member\r\n      E_IRNode *idxed_base_tree = &e_irnode_nil;\r\n      if(base_ptr_tree != &e_irnode_nil)\r\n      {\r\n        E_IRTreeAndType idx_irtree = e_push_irtree_and_type_from_expr(arena, 0, &e_default_identifier_resolution_rule, 0, 1, expr->first->next);\r\n        E_IRNode *idx_root = e_irtree_resolve_to_value(arena, idx_irtree.mode, idx_irtree.root, idx_irtree.type_key);\r\n        E_IRNode *off_root = e_irtree_binary_op_u(arena, RDI_EvalOp_Mul, addr_size, idx_root, e_irtree_const_u(arena, e_type_byte_size_from_key(e_type_key_unwrap(ext->base_ptr_member->type_key, E_TypeUnwrapFlag_All))));\r\n        idxed_base_tree = e_irtree_binary_op_u(arena, RDI_EvalOp_Add, addr_size, base_ptr_tree, off_root);\r\n      }\r\n      \r\n      // rjf: form final result\r\n      result.root = idxed_base_tree;\r\n      result.type_key = e_type_key_unwrap(ext->base_ptr_member->type_key, E_TypeUnwrapFlag_All);\r\n      result.mode = E_Mode_Offset;\r\n      \r\n      scratch_end(scratch);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(slice)\r\n{\r\n  E_SliceIRExt *accel = (E_SliceIRExt *)eval.irtree.user_data;\r\n  U64 count = 0;\r\n  {\r\n    if(accel->count_member != 0)\r\n    {\r\n      count = e_value_eval_from_eval(e_eval_wrapf(eval, \"$.%S\", accel->count_member->name)).value.u64;\r\n    }\r\n    else if(accel->opl_ptr_member != 0 && accel->base_ptr_member != 0)\r\n    {\r\n      count = e_value_eval_from_eval(e_eval_wrapf(eval, \"raw($.%S) - raw($.%S)\", accel->opl_ptr_member->name, accel->base_ptr_member->name)).value.u64;\r\n    }\r\n  }\r\n  E_TypeExpandInfo info = {0, count};\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(slice)\r\n{\r\n  U64 read_range_count = dim_1u64(idx_range);\r\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\r\n  {\r\n    evals_out[idx] = e_eval_wrapf(eval, \"$[%I64u]\", idx_range.min + idx);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `folder` type\r\n\r\ntypedef struct E_FolderAccel E_FolderAccel;\r\nstruct E_FolderAccel\r\n{\r\n  String8 folder_path;\r\n  String8Array folders;\r\n  String8Array files;\r\n};\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(folder)\r\n{\r\n  E_TypeExpandInfo info = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: evaluate lhs file path ID\r\n    U64 lhs_string_id = eval.value.u64;\r\n    String8 folder_path = e_string_from_id(lhs_string_id);\r\n    \r\n    //- rjf: compute filter - omit common prefixes (common parent paths)\r\n    String8 local_filter = filter;\r\n    {\r\n      U64 folder_pos_in_filter = str8_find_needle(filter, 0, folder_path, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive);\r\n      if(folder_pos_in_filter < filter.size)\r\n      {\r\n        local_filter = str8_skip(local_filter, folder_pos_in_filter+folder_path.size);\r\n        local_filter = str8_skip_chop_slashes(local_filter);\r\n      }\r\n      else\r\n      {\r\n        MemoryZeroStruct(&local_filter);\r\n      }\r\n    }\r\n    \r\n    //- rjf: gather & filter files in this folder\r\n    String8List folder_paths = {0};\r\n    String8List file_paths = {0};\r\n    {\r\n      OS_FileIter *iter = os_file_iter_begin(scratch.arena, folder_path, 0);\r\n      for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, iter, &info);)\r\n      {\r\n        FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, local_filter, info.name);\r\n        if(matches.count == matches.needle_part_count)\r\n        {\r\n          if(info.props.flags & FilePropertyFlag_IsFolder)\r\n          {\r\n            str8_list_push(scratch.arena, &folder_paths, push_str8_copy(arena, info.name));\r\n          }\r\n          else\r\n          {\r\n            str8_list_push(scratch.arena, &file_paths, push_str8_copy(arena, info.name));\r\n          }\r\n        }\r\n      }\r\n      os_file_iter_end(iter);\r\n    }\r\n    \r\n    //- rjf: build accelerator\r\n    E_FolderAccel *accel = push_array(arena, E_FolderAccel, 1);\r\n    accel->folder_path = push_str8_copy(arena, folder_path);\r\n    accel->folders = str8_array_from_list(arena, &folder_paths);\r\n    accel->files = str8_array_from_list(arena, &file_paths);\r\n    info.user_data = accel;\r\n    info.expr_count = accel->folders.count + accel->files.count;\r\n    scratch_end(scratch);\r\n  }\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(folder)\r\n{\r\n  E_FolderAccel *accel = (E_FolderAccel *)user_data;\r\n  U64 out_idx = 0;\r\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8 path_expr_string = {0};\r\n    if(0 <= idx && idx < accel->folders.count)\r\n    {\r\n      String8 folder_name = accel->folders.v[idx - 0];\r\n      String8 folder_path = push_str8f(scratch.arena, \"%S%s%S\", accel->folder_path, accel->folder_path.size != 0 ? \"/\" : \"\", folder_name);\r\n      path_expr_string = push_str8f(arena, \"folder:\\\"%S/\\\"\", escaped_from_raw_str8(scratch.arena, folder_path));\r\n    }\r\n    else if(accel->folders.count <= idx && idx < accel->folders.count + accel->files.count)\r\n    {\r\n      String8 file_name = accel->files.v[idx - accel->folders.count];\r\n      String8 file_path = push_str8f(scratch.arena, \"%S%s%S\", accel->folder_path, accel->folder_path.size != 0 ? \"/\" : \"\", file_name);\r\n      path_expr_string = push_str8f(arena, \"file:\\\"%S\\\"\", escaped_from_raw_str8(scratch.arena, file_path));\r\n    }\r\n    evals_out[out_idx] = e_eval_from_string(path_expr_string);\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(folder)\r\n{\r\n  U64 id = 0;\r\n  E_FolderAccel *accel = (E_FolderAccel *)user_data;\r\n  String8 name = {0};\r\n  if(0 < num && num <= accel->folders.count)\r\n  {\r\n    name = accel->folders.v[num-1];\r\n  }\r\n  else if(accel->folders.count < num && num <= accel->folders.count+accel->files.count)\r\n  {\r\n    name = accel->files.v[num-accel->folders.count-1];\r\n  }\r\n  id = e_hash_from_string(5381, name);\r\n  return id;\r\n}\r\n\r\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(folder)\r\n{\r\n  U64 num = 0;\r\n  E_FolderAccel *accel = (E_FolderAccel *)user_data;\r\n  for(U64 idx = 0; idx < accel->folders.count+accel->files.count; idx += 1)\r\n  {\r\n    String8 name = {0};\r\n    if(0 <= idx && idx < accel->folders.count)\r\n    {\r\n      name = accel->folders.v[idx];\r\n    }\r\n    else if(accel->folders.count <= idx && idx < accel->folders.count+accel->files.count)\r\n    {\r\n      name = accel->files.v[idx-accel->folders.count];\r\n    }\r\n    U64 hash = e_hash_from_string(5381, name);\r\n    if(hash == id)\r\n    {\r\n      num = idx+1;\r\n      break;\r\n    }\r\n  }\r\n  return num;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `file` type\r\n\r\ntypedef struct E_FileAccel E_FileAccel;\r\nstruct E_FileAccel\r\n{\r\n  String8 file_path;\r\n  FileProperties props;\r\n  String8Array fields;\r\n};\r\n\r\nE_TYPE_IREXT_FUNCTION_DEF(file)\r\n{\r\n  E_IRTreeAndType result = *irtree;\r\n  E_FileAccel *accel = push_array(arena, E_FileAccel, 1);\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: evaluate lhs file path ID\r\n    E_OpList lhs_oplist = e_oplist_from_irtree(scratch.arena, irtree->root);\r\n    String8 lhs_bytecode = e_bytecode_from_oplist(scratch.arena, &lhs_oplist);\r\n    E_Interpretation lhs_interp = e_interpret(lhs_bytecode);\r\n    E_Value lhs_value = lhs_interp.value;\r\n    U64 lhs_string_id = lhs_value.u64;\r\n    \r\n    //- rjf: get file path\r\n    String8 file_path = e_string_from_id(lhs_string_id);\r\n    \r\n    //- rjf: build field list\r\n    String8List fields = {0};\r\n    str8_list_pushf(arena, &fields, \"size\");\r\n    str8_list_pushf(arena, &fields, \"last_modified_time\");\r\n    str8_list_pushf(arena, &fields, \"creation_time\");\r\n    str8_list_pushf(arena, &fields, \"data\");\r\n    \r\n    //- rjf: fill accel\r\n    accel->file_path = push_str8_copy(arena, file_path);\r\n    accel->props = os_properties_from_file_path(file_path);\r\n    accel->fields = str8_array_from_list(arena, &fields);\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  E_IRExt ext = {accel};\r\n  return ext;\r\n}\r\n\r\nE_TYPE_ACCESS_FUNCTION_DEF(file)\r\n{\r\n  E_IRTreeAndType result = {&e_irnode_nil}; \r\n  E_FileAccel *accel = (E_FileAccel *)lhs_irtree->user_data;\r\n  if(expr->kind == E_ExprKind_MemberAccess)\r\n  {\r\n    E_Expr *rhs = expr->first->next;\r\n    String8 member_name = rhs->string;\r\n    if(str8_match(member_name, str8_lit(\"size\"), 0))\r\n    {\r\n      E_Space space = e_space_make(E_SpaceKind_FileSystem);\r\n      space.u64_0 = e_id_from_string(accel->file_path);\r\n      result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, accel->props.size));\r\n      result.type_key = e_type_key_basic(E_TypeKind_U64);\r\n      result.mode = E_Mode_Value;\r\n    }\r\n    else if(str8_match(member_name, str8_lit(\"last_modified_time\"), 0))\r\n    {\r\n      E_Space space = e_space_make(E_SpaceKind_FileSystem);\r\n      space.u64_0 = e_id_from_string(accel->file_path);\r\n      result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, accel->props.modified));\r\n      result.type_key = e_type_key_basic(E_TypeKind_U64);\r\n      result.mode = E_Mode_Value;\r\n    }\r\n    else if(str8_match(member_name, str8_lit(\"creation_time\"), 0))\r\n    {\r\n      E_Space space = e_space_make(E_SpaceKind_FileSystem);\r\n      space.u64_0 = e_id_from_string(accel->file_path);\r\n      result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, accel->props.created));\r\n      result.type_key = e_type_key_basic(E_TypeKind_U64);\r\n      result.mode = E_Mode_Value;\r\n    }\r\n    else if(str8_match(member_name, str8_lit(\"data\"), 0))\r\n    {\r\n      E_Space space = e_space_make(E_SpaceKind_File);\r\n      space.u64_0 = e_id_from_string(accel->file_path);\r\n      result.root     = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0));\r\n      result.type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), accel->props.size, 0);\r\n      result.mode = E_Mode_Offset;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(file)\r\n{\r\n  E_FileAccel *accel = (E_FileAccel *)eval.irtree.user_data;\r\n  E_TypeExpandInfo info = {accel, accel->fields.count};\r\n  return info;\r\n}\r\n\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(file)\r\n{\r\n  E_FileAccel *accel = (E_FileAccel *)user_data;\r\n  U64 out_idx = 0;\r\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\r\n  {\r\n    E_Expr *expr = &e_expr_nil;\r\n    String8 string = {0};\r\n    if(0 <= idx && idx < accel->fields.count)\r\n    {\r\n      String8 name = accel->fields.v[idx];\r\n      evals_out[out_idx] = e_eval_wrapf(eval, \"$.%S\", name);\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/eval/eval_types.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_TYPES_H\r\n#define EVAL_TYPES_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Unwrapping\r\n\r\ntypedef U32 E_TypeUnwrapFlags;\r\nenum\r\n{\r\n  E_TypeUnwrapFlag_Modifiers     = (1<<0),\r\n  E_TypeUnwrapFlag_Pointers      = (1<<1),\r\n  E_TypeUnwrapFlag_Lenses        = (1<<2),\r\n  E_TypeUnwrapFlag_Meta          = (1<<3),\r\n  E_TypeUnwrapFlag_Enums         = (1<<4),\r\n  E_TypeUnwrapFlag_Aliases       = (1<<5),\r\n  E_TypeUnwrapFlag_Bitfields     = (1<<6),\r\n  E_TypeUnwrapFlag_All           = 0xffffffff,\r\n  E_TypeUnwrapFlag_AllDecorative = (E_TypeUnwrapFlag_All & ~(E_TypeUnwrapFlag_Pointers|E_TypeUnwrapFlag_Bitfields))\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal read_only E_Member e_member_nil = {E_MemberKind_Null};\r\nglobal read_only E_Type e_type_nil = {E_TypeKind_Null};\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(default);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(default);\r\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);\r\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity);\r\nglobal read_only E_TypeExpandRule e_type_expand_rule__default =\r\n{\r\n  E_TYPE_EXPAND_INFO_FUNCTION_NAME(default),\r\n  E_TYPE_EXPAND_RANGE_FUNCTION_NAME(default),\r\n  E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(identity),\r\n  E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(identity),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Kind Enum Functions\r\n\r\ninternal E_TypeKind e_type_kind_from_base(TypeKind kind);\r\ninternal E_TypeKind e_type_kind_from_rdi(RDI_TypeKind kind);\r\ninternal E_MemberKind e_member_kind_from_rdi(RDI_MemberKind kind);\r\ninternal RDI_EvalTypeGroup e_type_group_from_kind(E_TypeKind kind);\r\ninternal B32 e_type_kind_is_integer(E_TypeKind kind);\r\ninternal B32 e_type_kind_is_signed(E_TypeKind kind);\r\ninternal B32 e_type_kind_is_basic_or_enum(E_TypeKind kind);\r\ninternal B32 e_type_kind_is_pointer_or_ref(E_TypeKind kind);\r\n\r\n////////////////////////////////\r\n//~ rjf: Member Functions\r\n\r\ninternal void e_member_list_push(Arena *arena, E_MemberList *list, E_Member *member);\r\n#define e_member_list_push_new(arena, list, ...) e_member_list_push((arena), (list), &(E_Member){.kind = E_MemberKind_DataField, __VA_ARGS__})\r\ninternal E_MemberArray e_member_array_from_list(Arena *arena, E_MemberList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum Value Functions\r\n\r\ninternal void e_enum_val_list_push(Arena *arena, E_EnumValList *list, E_EnumVal *enum_val);\r\n#define e_enum_val_list_push_new(arena, list, ...) e_enum_val_list_push((arena), (list), &(E_EnumVal){.val = 0, __VA_ARGS__})\r\ninternal E_EnumValArray e_enum_val_array_from_list(Arena *arena, E_EnumValList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Operation Functions\r\n\r\n//- rjf: basic key constructors\r\ninternal E_TypeKey e_type_key_zero(void);\r\ninternal E_TypeKey e_type_key_basic(E_TypeKind kind);\r\ninternal E_TypeKey e_type_key_ext(E_TypeKind kind, U32 type_idx, U32 rdi_num);\r\ninternal E_TypeKey e_type_key_reg(Arch arch, REGS_RegCode code);\r\ninternal E_TypeKey e_type_key_reg_alias(Arch arch, REGS_AliasCode code);\r\n\r\n//- rjf: constructed type construction\r\ninternal U64 e_hash_from_cons_type_params(E_ConsTypeParams *params);\r\ninternal B32 e_cons_type_params_match(E_ConsTypeParams *l, E_ConsTypeParams *r);\r\ninternal E_TypeKey e_type_key_cons_(E_ConsTypeParams *params);\r\n#define e_type_key_cons(...) e_type_key_cons_(&(E_ConsTypeParams){.kind = E_TypeKind_Null, __VA_ARGS__})\r\n\r\n//- rjf: constructed type construction helpers\r\ninternal E_TypeKey e_type_key_cons_array(E_TypeKey element_type_key, U64 count, E_TypeFlags flags);\r\ninternal E_TypeKey e_type_key_cons_ptr(Arch arch, E_TypeKey element_type_key, U64 count, E_TypeFlags flags);\r\ninternal E_TypeKey e_type_key_cons_meta_expr(E_TypeKey type_key, String8 expr);\r\ninternal E_TypeKey e_type_key_cons_meta_display_name(E_TypeKey type_key, String8 name);\r\ninternal E_TypeKey e_type_key_cons_meta_description(E_TypeKey type_key, String8 desc);\r\ninternal E_TypeKey e_type_key_cons_base(Type *type);\r\ninternal E_TypeKey e_type_key_file(void);\r\ninternal E_TypeKey e_type_key_folder(void);\r\n\r\n//- rjf: basic type key functions\r\ninternal B32 e_type_key_match(E_TypeKey l, E_TypeKey r);\r\n\r\n//- rjf: type key -> info extraction\r\ninternal U64 e_hash_from_type(E_Type *type);\r\ninternal E_TypeKind e_type_kind_from_key(E_TypeKey key);\r\ninternal U64 e_type_byte_size_from_key(E_TypeKey key);\r\ninternal E_Type *e_push_type_from_key(Arena *arena, E_TypeKey key);\r\ninternal int e_type_qsort_compare_members_offset(E_Member *a, E_Member *b);\r\ninternal E_MemberArray e_type_data_members_from_key(Arena *arena, E_TypeKey key);\r\ninternal E_TypeExpandRule *e_expand_rule_from_type_key(E_TypeKey key);\r\n\r\n//- rjf: type key traversal\r\ninternal E_TypeKey e_type_key_direct(E_TypeKey key);\r\ninternal E_TypeKey e_type_key_owner(E_TypeKey key);\r\ninternal E_TypeKey e_type_key_promote(E_TypeKey key);\r\ninternal E_TypeKey e_type_key_unwrap(E_TypeKey key, E_TypeUnwrapFlags flags);\r\n\r\n//- rjf: type comparisons\r\ninternal B32 e_type_match(E_TypeKey l, E_TypeKey r);\r\n\r\n//- rjf: type key -> string\r\ninternal void e_type_lhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec, B32 skip_return);\r\ninternal void e_type_rhs_string_from_key(Arena *arena, E_TypeKey key, String8List *out, U32 prec);\r\ninternal String8 e_type_string_from_key(Arena *arena, E_TypeKey key);\r\ninternal E_TypeKey e_default_expansion_type_from_key(E_TypeKey key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Lookups\r\n\r\ninternal E_Type *e_type_from_key(E_TypeKey key);\r\n\r\n//- rjf: member lookups\r\ninternal E_MemberCacheNode *e_member_cache_node_from_type_key(E_TypeKey key);\r\ninternal E_MemberArray e_type_data_members_from_key_filter__cached(E_TypeKey key, String8 filter);\r\ninternal E_MemberArray e_type_data_members_from_key__cached(E_TypeKey key);\r\ninternal E_Member e_type_member_from_key_name__cached(E_TypeKey key, String8 name);\r\n\r\n//- rjf: enum val lookups\r\ninternal E_EnumValCacheNode *e_enum_val_cache_node_from_type_key(E_TypeKey key);\r\ninternal E_EnumValArray e_type_enum_vals_from_key_filter__cached(E_TypeKey key, String8 filter);\r\ninternal E_EnumValArray e_type_enum_vals_from_key__cached(E_TypeKey key);\r\ninternal E_EnumVal e_type_enum_val_from_key_name__cached(E_TypeKey key, String8 name);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) Default Hooks\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(default);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(default);\r\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(identity);\r\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(identity);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `rows` lens\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(rows);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(rows);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `sequence` lens\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(sequence);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(sequence);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `array` lens\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(array);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(array);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `slice` lens\r\n\r\nE_TYPE_IREXT_FUNCTION_DEF(slice);\r\nE_TYPE_ACCESS_FUNCTION_DEF(slice);\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(slice);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(slice);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `only`, `omit` lenses\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(only_and_omit);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(only_and_omit);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `folder` type\r\n\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(folder);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(folder);\r\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(folder);\r\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(folder);\r\n\r\n////////////////////////////////\r\n//~ rjf: (Built-In Type Hooks) `file` type\r\n\r\nE_TYPE_IREXT_FUNCTION_DEF(file);\r\nE_TYPE_ACCESS_FUNCTION_DEF(file);\r\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(file);\r\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(file);\r\n\r\n#endif // EVAL_TYPES_H\r\n"
  },
  {
    "path": "src/eval/generated/eval.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 e_token_kind_strings[6] =\r\n{\r\nstr8_lit_comp(\"Null\"),\r\nstr8_lit_comp(\"Identifier\"),\r\nstr8_lit_comp(\"Numeric\"),\r\nstr8_lit_comp(\"StringLiteral\"),\r\nstr8_lit_comp(\"CharLiteral\"),\r\nstr8_lit_comp(\"Symbol\"),\r\n};\r\n\r\nString8 e_type_kind_basic_string_table[61] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"void\"),\r\nstr8_lit_comp(\"HANDLE\"),\r\nstr8_lit_comp(\"HRESULT\"),\r\nstr8_lit_comp(\"char8\"),\r\nstr8_lit_comp(\"char16\"),\r\nstr8_lit_comp(\"char32\"),\r\nstr8_lit_comp(\"uchar8\"),\r\nstr8_lit_comp(\"uchar16\"),\r\nstr8_lit_comp(\"uchar32\"),\r\nstr8_lit_comp(\"uint8\"),\r\nstr8_lit_comp(\"uint16\"),\r\nstr8_lit_comp(\"uint32\"),\r\nstr8_lit_comp(\"uint64\"),\r\nstr8_lit_comp(\"uint128\"),\r\nstr8_lit_comp(\"uint256\"),\r\nstr8_lit_comp(\"uint512\"),\r\nstr8_lit_comp(\"int8\"),\r\nstr8_lit_comp(\"int16\"),\r\nstr8_lit_comp(\"int32\"),\r\nstr8_lit_comp(\"int64\"),\r\nstr8_lit_comp(\"int128\"),\r\nstr8_lit_comp(\"int256\"),\r\nstr8_lit_comp(\"int512\"),\r\nstr8_lit_comp(\"bool\"),\r\nstr8_lit_comp(\"float16\"),\r\nstr8_lit_comp(\"float32\"),\r\nstr8_lit_comp(\"float32PP\"),\r\nstr8_lit_comp(\"float48\"),\r\nstr8_lit_comp(\"float64\"),\r\nstr8_lit_comp(\"float80\"),\r\nstr8_lit_comp(\"float128\"),\r\nstr8_lit_comp(\"complex_float32\"),\r\nstr8_lit_comp(\"complex_float64\"),\r\nstr8_lit_comp(\"complex_float80\"),\r\nstr8_lit_comp(\"complex_float128\"),\r\nstr8_lit_comp(\"modifier\"),\r\nstr8_lit_comp(\"ptr\"),\r\nstr8_lit_comp(\"lref\"),\r\nstr8_lit_comp(\"rref\"),\r\nstr8_lit_comp(\"array\"),\r\nstr8_lit_comp(\"function\"),\r\nstr8_lit_comp(\"method\"),\r\nstr8_lit_comp(\"member_ptr\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"class\"),\r\nstr8_lit_comp(\"union\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"typedef\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"union\"),\r\nstr8_lit_comp(\"class\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"bitfield\"),\r\nstr8_lit_comp(\"variadic\"),\r\nstr8_lit_comp(\"set\"),\r\nstr8_lit_comp(\"lens\"),\r\nstr8_lit_comp(\"lens_spec\"),\r\nstr8_lit_comp(\"meta_expr\"),\r\nstr8_lit_comp(\"meta_display_name\"),\r\nstr8_lit_comp(\"meta_description\"),\r\n};\r\n\r\nU8 e_type_kind_basic_byte_size_table[61] =\r\n{\r\n0,\r\n0,\r\n0xFF,\r\n4,\r\n1,\r\n2,\r\n4,\r\n1,\r\n2,\r\n4,\r\n1,\r\n2,\r\n4,\r\n8,\r\n16,\r\n32,\r\n64,\r\n1,\r\n2,\r\n4,\r\n8,\r\n16,\r\n32,\r\n64,\r\n1,\r\n2,\r\n4,\r\n4,\r\n6,\r\n8,\r\n10,\r\n16,\r\n8,\r\n16,\r\n20,\r\n32,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n0,\r\n};\r\n\r\nString8 e_expr_kind_strings[50] =\r\n{\r\nstr8_lit_comp(\"Nil\"),\r\nstr8_lit_comp(\"Ref\"),\r\nstr8_lit_comp(\"ArrayIndex\"),\r\nstr8_lit_comp(\"MemberAccess\"),\r\nstr8_lit_comp(\"Deref\"),\r\nstr8_lit_comp(\"Address\"),\r\nstr8_lit_comp(\"Cast\"),\r\nstr8_lit_comp(\"Sizeof\"),\r\nstr8_lit_comp(\"Typeof\"),\r\nstr8_lit_comp(\"Symbolof\"),\r\nstr8_lit_comp(\"ByteSwap\"),\r\nstr8_lit_comp(\"Pos\"),\r\nstr8_lit_comp(\"Neg\"),\r\nstr8_lit_comp(\"LogNot\"),\r\nstr8_lit_comp(\"BitNot\"),\r\nstr8_lit_comp(\"Mul\"),\r\nstr8_lit_comp(\"Div\"),\r\nstr8_lit_comp(\"Mod\"),\r\nstr8_lit_comp(\"Add\"),\r\nstr8_lit_comp(\"Sub\"),\r\nstr8_lit_comp(\"LShift\"),\r\nstr8_lit_comp(\"RShift\"),\r\nstr8_lit_comp(\"Less\"),\r\nstr8_lit_comp(\"LsEq\"),\r\nstr8_lit_comp(\"Grtr\"),\r\nstr8_lit_comp(\"GrEq\"),\r\nstr8_lit_comp(\"EqEq\"),\r\nstr8_lit_comp(\"NtEq\"),\r\nstr8_lit_comp(\"BitAnd\"),\r\nstr8_lit_comp(\"BitXor\"),\r\nstr8_lit_comp(\"BitOr\"),\r\nstr8_lit_comp(\"LogAnd\"),\r\nstr8_lit_comp(\"LogOr\"),\r\nstr8_lit_comp(\"Ternary\"),\r\nstr8_lit_comp(\"Call\"),\r\nstr8_lit_comp(\"LeafBytecode\"),\r\nstr8_lit_comp(\"LeafStringLiteral\"),\r\nstr8_lit_comp(\"LeafU64\"),\r\nstr8_lit_comp(\"LeafF64\"),\r\nstr8_lit_comp(\"LeafF32\"),\r\nstr8_lit_comp(\"LeafIdentifier\"),\r\nstr8_lit_comp(\"LeafOffset\"),\r\nstr8_lit_comp(\"LeafValue\"),\r\nstr8_lit_comp(\"LeafFilePath\"),\r\nstr8_lit_comp(\"TypeIdent\"),\r\nstr8_lit_comp(\"Ptr\"),\r\nstr8_lit_comp(\"Array\"),\r\nstr8_lit_comp(\"Func\"),\r\nstr8_lit_comp(\"Unsigned\"),\r\nstr8_lit_comp(\"Define\"),\r\n};\r\n\r\nE_OpInfo e_expr_kind_op_info_table[50] =\r\n{\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"[\"), str8_lit_comp(\"]\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\".\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 2, str8_lit_comp(\"*\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 2, str8_lit_comp(\"&\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 1, str8_lit_comp(\"cast(\"), str8_lit_comp(\")\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 1, str8_lit_comp(\"sizeof \"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 1, str8_lit_comp(\"typeof \"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 1, str8_lit_comp(\"symbolof \"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 1, str8_lit_comp(\"bswap \"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 2, str8_lit_comp(\"+\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 2, str8_lit_comp(\"-\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 2, str8_lit_comp(\"!\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_UnaryPrefix, 2, str8_lit_comp(\"~\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 3, str8_lit_comp(\"\"), str8_lit_comp(\" * \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 3, str8_lit_comp(\"\"), str8_lit_comp(\" / \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 3, str8_lit_comp(\"\"), str8_lit_comp(\" % \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 4, str8_lit_comp(\"\"), str8_lit_comp(\" + \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 4, str8_lit_comp(\"\"), str8_lit_comp(\" - \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 5, str8_lit_comp(\"\"), str8_lit_comp(\" << \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 5, str8_lit_comp(\"\"), str8_lit_comp(\" >> \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 6, str8_lit_comp(\"\"), str8_lit_comp(\" < \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 6, str8_lit_comp(\"\"), str8_lit_comp(\" <= \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 6, str8_lit_comp(\"\"), str8_lit_comp(\" > \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 6, str8_lit_comp(\"\"), str8_lit_comp(\" >= \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 7, str8_lit_comp(\"\"), str8_lit_comp(\" == \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 7, str8_lit_comp(\"\"), str8_lit_comp(\" != \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 8, str8_lit_comp(\"\"), str8_lit_comp(\" & \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 9, str8_lit_comp(\"\"), str8_lit_comp(\" ^ \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 10, str8_lit_comp(\"\"), str8_lit_comp(\" | \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 11, str8_lit_comp(\"\"), str8_lit_comp(\" && \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 12, str8_lit_comp(\"\"), str8_lit_comp(\" || \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\" ? \"), str8_lit_comp(\"\"), str8_lit_comp(\" : \") },\r\n{ E_OpKind_Null, 15, str8_lit_comp(\"\"), str8_lit_comp(\"(\"), str8_lit_comp(\")\"), str8_lit_comp(\", \") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Null, 0, str8_lit_comp(\"unsigned \"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n{ E_OpKind_Binary, 13, str8_lit_comp(\"\"), str8_lit_comp(\" = \"), str8_lit_comp(\"\"), str8_lit_comp(\"\") },\r\n};\r\n\r\nString8 e_interpretation_code_display_strings[11] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"Cannot divide by zero.\"),\r\nstr8_lit_comp(\"Invalid operation.\"),\r\nstr8_lit_comp(\"Invalid operation types.\"),\r\nstr8_lit_comp(\"Failed memory read.\"),\r\nstr8_lit_comp(\"Failed register read.\"),\r\nstr8_lit_comp(\"Invalid frame base address.\"),\r\nstr8_lit_comp(\"Invalid module base address.\"),\r\nstr8_lit_comp(\"Invalid thread-local storage base address.\"),\r\nstr8_lit_comp(\"Insufficient evaluation machine stack space.\"),\r\nstr8_lit_comp(\"Malformed bytecode.\"),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/eval/generated/eval.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef EVAL_META_H\r\n#define EVAL_META_H\r\n\r\ntypedef enum E_TokenKind\r\n{\r\nE_TokenKind_Null,\r\nE_TokenKind_Identifier,\r\nE_TokenKind_Numeric,\r\nE_TokenKind_StringLiteral,\r\nE_TokenKind_CharLiteral,\r\nE_TokenKind_Symbol,\r\nE_TokenKind_COUNT,\r\n} E_TokenKind;\r\n\r\ntypedef enum E_TypeKind\r\n{\r\nE_TypeKind_Null,\r\nE_TypeKind_Void,\r\nE_TypeKind_Handle,\r\nE_TypeKind_HResult,\r\nE_TypeKind_Char8,\r\nE_TypeKind_Char16,\r\nE_TypeKind_Char32,\r\nE_TypeKind_UChar8,\r\nE_TypeKind_UChar16,\r\nE_TypeKind_UChar32,\r\nE_TypeKind_U8,\r\nE_TypeKind_U16,\r\nE_TypeKind_U32,\r\nE_TypeKind_U64,\r\nE_TypeKind_U128,\r\nE_TypeKind_U256,\r\nE_TypeKind_U512,\r\nE_TypeKind_S8,\r\nE_TypeKind_S16,\r\nE_TypeKind_S32,\r\nE_TypeKind_S64,\r\nE_TypeKind_S128,\r\nE_TypeKind_S256,\r\nE_TypeKind_S512,\r\nE_TypeKind_Bool,\r\nE_TypeKind_F16,\r\nE_TypeKind_F32,\r\nE_TypeKind_F32PP,\r\nE_TypeKind_F48,\r\nE_TypeKind_F64,\r\nE_TypeKind_F80,\r\nE_TypeKind_F128,\r\nE_TypeKind_ComplexF32,\r\nE_TypeKind_ComplexF64,\r\nE_TypeKind_ComplexF80,\r\nE_TypeKind_ComplexF128,\r\nE_TypeKind_Modifier,\r\nE_TypeKind_Ptr,\r\nE_TypeKind_LRef,\r\nE_TypeKind_RRef,\r\nE_TypeKind_Array,\r\nE_TypeKind_Function,\r\nE_TypeKind_Method,\r\nE_TypeKind_MemberPtr,\r\nE_TypeKind_Struct,\r\nE_TypeKind_Class,\r\nE_TypeKind_Union,\r\nE_TypeKind_Enum,\r\nE_TypeKind_Alias,\r\nE_TypeKind_IncompleteStruct,\r\nE_TypeKind_IncompleteUnion,\r\nE_TypeKind_IncompleteClass,\r\nE_TypeKind_IncompleteEnum,\r\nE_TypeKind_Bitfield,\r\nE_TypeKind_Variadic,\r\nE_TypeKind_Set,\r\nE_TypeKind_Lens,\r\nE_TypeKind_LensSpec,\r\nE_TypeKind_MetaExpr,\r\nE_TypeKind_MetaDisplayName,\r\nE_TypeKind_MetaDescription,\r\nE_TypeKind_COUNT,\r\nE_TypeKind_FirstBasic      = E_TypeKind_Void,\r\nE_TypeKind_LastBasic       = E_TypeKind_ComplexF128,\r\nE_TypeKind_FirstInteger    = E_TypeKind_Char8,\r\nE_TypeKind_LastInteger     = E_TypeKind_S512,\r\nE_TypeKind_FirstSigned1    = E_TypeKind_Char8,\r\nE_TypeKind_LastSigned1     = E_TypeKind_Char32,\r\nE_TypeKind_FirstSigned2    = E_TypeKind_S8,\r\nE_TypeKind_LastSigned2     = E_TypeKind_S512,\r\nE_TypeKind_FirstIncomplete = E_TypeKind_IncompleteStruct,\r\nE_TypeKind_LastIncomplete  = E_TypeKind_IncompleteEnum,\r\nE_TypeKind_FirstMeta       = E_TypeKind_MetaExpr,\r\nE_TypeKind_LastMeta        = E_TypeKind_MetaDescription,\r\n} E_TypeKind;\r\n\r\ntypedef U32 E_ExprKind;\r\ntypedef enum E_ExprKindEnum\r\n{\r\nE_ExprKind_Nil,\r\nE_ExprKind_Ref,\r\nE_ExprKind_ArrayIndex,\r\nE_ExprKind_MemberAccess,\r\nE_ExprKind_Deref,\r\nE_ExprKind_Address,\r\nE_ExprKind_Cast,\r\nE_ExprKind_Sizeof,\r\nE_ExprKind_Typeof,\r\nE_ExprKind_Symbolof,\r\nE_ExprKind_ByteSwap,\r\nE_ExprKind_Pos,\r\nE_ExprKind_Neg,\r\nE_ExprKind_LogNot,\r\nE_ExprKind_BitNot,\r\nE_ExprKind_Mul,\r\nE_ExprKind_Div,\r\nE_ExprKind_Mod,\r\nE_ExprKind_Add,\r\nE_ExprKind_Sub,\r\nE_ExprKind_LShift,\r\nE_ExprKind_RShift,\r\nE_ExprKind_Less,\r\nE_ExprKind_LsEq,\r\nE_ExprKind_Grtr,\r\nE_ExprKind_GrEq,\r\nE_ExprKind_EqEq,\r\nE_ExprKind_NtEq,\r\nE_ExprKind_BitAnd,\r\nE_ExprKind_BitXor,\r\nE_ExprKind_BitOr,\r\nE_ExprKind_LogAnd,\r\nE_ExprKind_LogOr,\r\nE_ExprKind_Ternary,\r\nE_ExprKind_Call,\r\nE_ExprKind_LeafBytecode,\r\nE_ExprKind_LeafStringLiteral,\r\nE_ExprKind_LeafU64,\r\nE_ExprKind_LeafF64,\r\nE_ExprKind_LeafF32,\r\nE_ExprKind_LeafIdentifier,\r\nE_ExprKind_LeafOffset,\r\nE_ExprKind_LeafValue,\r\nE_ExprKind_LeafFilePath,\r\nE_ExprKind_TypeIdent,\r\nE_ExprKind_Ptr,\r\nE_ExprKind_Array,\r\nE_ExprKind_Func,\r\nE_ExprKind_Unsigned,\r\nE_ExprKind_Define,\r\nE_ExprKind_COUNT,\r\n} E_ExprKindEnum;\r\n\r\ntypedef enum E_InterpretationCode\r\n{\r\nE_InterpretationCode_Good,\r\nE_InterpretationCode_DivideByZero,\r\nE_InterpretationCode_BadOp,\r\nE_InterpretationCode_BadOpTypes,\r\nE_InterpretationCode_BadMemRead,\r\nE_InterpretationCode_BadRegRead,\r\nE_InterpretationCode_BadFrameBase,\r\nE_InterpretationCode_BadModuleBase,\r\nE_InterpretationCode_BadTLSBase,\r\nE_InterpretationCode_InsufficientStackSpace,\r\nE_InterpretationCode_MalformedBytecode,\r\nE_InterpretationCode_COUNT,\r\n} E_InterpretationCode;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 e_token_kind_strings[6];\r\nextern String8 e_type_kind_basic_string_table[61];\r\nextern U8 e_type_kind_basic_byte_size_table[61];\r\nextern String8 e_expr_kind_strings[50];\r\nextern E_OpInfo e_expr_kind_op_info_table[50];\r\nextern String8 e_interpretation_code_display_strings[11];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // EVAL_META_H\r\n"
  },
  {
    "path": "src/eval_visualization/eval_visualization_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Nil/Identity View Rule Hooks\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(nil)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  return info;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Functions\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal EV_Key\r\nev_key_make(U64 parent_hash, U64 child_id)\r\n{\r\n  EV_Key key;\r\n  {\r\n    key.parent_hash = parent_hash;\r\n    key.child_id = child_id;\r\n  }\r\n  return key;\r\n}\r\n\r\ninternal EV_Key\r\nev_key_zero(void)\r\n{\r\n  EV_Key key = {0};\r\n  return key;\r\n}\r\n\r\ninternal EV_Key\r\nev_key_root(void)\r\n{\r\n  EV_Key key = ev_key_make(5381, 1);\r\n  return key;\r\n}\r\n\r\ninternal B32\r\nev_key_match(EV_Key a, EV_Key b)\r\n{\r\n  B32 result = MemoryMatchStruct(&a, &b);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nev_hash_from_seed_string(U64 seed, String8 string)\r\n{\r\n  U64 result = XXH3_64bits_withSeed(string.str, string.size, seed);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nev_hash_from_key(EV_Key key)\r\n{\r\n  U64 data[] =\r\n  {\r\n    key.child_id,\r\n  };\r\n  U64 hash = ev_hash_from_seed_string(key.parent_hash, str8((U8 *)data, sizeof(data)));\r\n  return hash;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Helpers\r\n\r\n//- rjf: type info -> expandability/editablity\r\n\r\ninternal E_TypeKey\r\nev_expansion_type_from_key(E_TypeKey type_key)\r\n{\r\n  E_TypeKey result = zero_struct;\r\n  for(E_TypeKey key = type_key;\r\n      !e_type_key_match(key, e_type_key_zero());\r\n      key = e_type_key_direct(key))\r\n  {\r\n    B32 done = 1;\r\n    E_TypeKind kind = e_type_kind_from_key(key);\r\n    \r\n    //- rjf: lenses -> try to see if this lens has special expansion rules. if\r\n    // so, choose the current eval\r\n    if(kind == E_TypeKind_Lens)\r\n    {\r\n      E_Type *type = e_type_from_key(key);\r\n      if(type->expand.info != 0 ||\r\n         ev_expand_rule_from_string(type->name) != &ev_nil_expand_rule)\r\n      {\r\n        done = 1;\r\n        result = key;\r\n      }\r\n      else\r\n      {\r\n        done = 0;\r\n      }\r\n    }\r\n    \r\n    //- rjf: if we have meta-expression tags in the type chain, defer\r\n    // to the next type in the chain.\r\n    else if(E_TypeKind_FirstMeta <= kind && kind <= E_TypeKind_LastMeta)\r\n    {\r\n      done = 0;\r\n    }\r\n    \r\n    //- rjf: break if done\r\n    if(done)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode)\r\n{\r\n  B32 result = 0;\r\n  E_TypeKey ev_expansion_type_key = ev_expansion_type_from_key(type_key);\r\n  if(!e_type_key_match(ev_expansion_type_key, e_type_key_zero()))\r\n  {\r\n    result = 1;\r\n  }\r\n  else\r\n  {\r\n    E_TypeKey default_expansion_type_key = e_default_expansion_type_from_key(type_key);\r\n    E_TypeKind kind = e_type_kind_from_key(default_expansion_type_key);\r\n    if(kind == E_TypeKind_Enum)\r\n    {\r\n      result = (mode == E_Mode_Null);\r\n    }\r\n    else if(kind != E_TypeKind_Null)\r\n    {\r\n      result = 1;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nev_type_key_is_editable(E_TypeKey type_key)\r\n{\r\n  B32 result = 0;\r\n  B32 done = 0;\r\n  for(E_TypeKey t = type_key; !result && !done; t = e_type_key_direct(t))\r\n  {\r\n    E_Type *type = e_type_from_key(t);\r\n    E_TypeKind kind = type->kind;\r\n    if(type->flags & E_TypeFlag_IsNotEditable)\r\n    {\r\n      result = 0;\r\n      done = 1;\r\n    }\r\n    else switch(kind)\r\n    {\r\n      case E_TypeKind_Null:\r\n      case E_TypeKind_Function:\r\n      {\r\n        result = 0;\r\n        done = 1;\r\n      }break;\r\n      default:\r\n      if((E_TypeKind_FirstBasic <= kind && kind <= E_TypeKind_LastBasic) || e_type_kind_is_pointer_or_ref(kind))\r\n      {\r\n        result = 1;\r\n        done = 1;\r\n      }break;\r\n      case E_TypeKind_Array:\r\n      {\r\n        if(type->flags & E_TypeFlag_IsNotText)\r\n        {\r\n          result = 0;\r\n          done = 1;\r\n        }\r\n        else\r\n        {\r\n          E_TypeKind element_kind = e_type_kind_from_key(e_type_key_unwrap(t, E_TypeUnwrapFlag_All));\r\n          result = (element_kind == E_TypeKind_U8 ||\r\n                    element_kind == E_TypeKind_U16 ||\r\n                    element_kind == E_TypeKind_U32 ||\r\n                    element_kind == E_TypeKind_S8 ||\r\n                    element_kind == E_TypeKind_S16 ||\r\n                    element_kind == E_TypeKind_S32 ||\r\n                    element_kind == E_TypeKind_UChar8 ||\r\n                    element_kind == E_TypeKind_UChar16 ||\r\n                    element_kind == E_TypeKind_UChar32 ||\r\n                    element_kind == E_TypeKind_Char8 ||\r\n                    element_kind == E_TypeKind_Char16 ||\r\n                    element_kind == E_TypeKind_Char32);\r\n          done = 1;\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: View Functions\r\n\r\n//- rjf: creation / deletion\r\n\r\ninternal EV_View *\r\nev_view_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  EV_View *view = push_array(arena, EV_View, 1);\r\n  view->arena = arena;\r\n  view->expand_slots_count = 256;\r\n  view->expand_slots = push_array(arena, EV_ExpandSlot, view->expand_slots_count);\r\n  view->key_view_rule_slots_count = 256;\r\n  view->key_view_rule_slots = push_array(arena, EV_KeyViewRuleSlot, view->key_view_rule_slots_count);\r\n  return view;\r\n}\r\n\r\ninternal void\r\nev_view_release(EV_View *view)\r\n{\r\n  arena_release(view->arena);\r\n}\r\n\r\n//- rjf: lookups / mutations\r\n\r\ninternal EV_ExpandNode *\r\nev_expand_node_from_key(EV_View *view, EV_Key key)\r\n{\r\n  U64 hash = ev_hash_from_key(key);\r\n  U64 slot_idx = hash%view->expand_slots_count;\r\n  EV_ExpandSlot *slot = &view->expand_slots[slot_idx];\r\n  EV_ExpandNode *node = 0;\r\n  for(EV_ExpandNode *n = slot->first; n != 0; n = n->hash_next)\r\n  {\r\n    if(ev_key_match(n->key, key))\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  return node;\r\n}\r\n\r\ninternal B32\r\nev_expansion_from_key(EV_View *view, EV_Key key)\r\n{\r\n  EV_ExpandNode *node = ev_expand_node_from_key(view, key);\r\n  return (node != 0 && node->expanded);\r\n}\r\n\r\ninternal String8\r\nev_view_rule_from_key(EV_View *view, EV_Key key)\r\n{\r\n  String8 result = {0};\r\n  \r\n  //- rjf: key -> hash * slot idx * slot\r\n  U64 hash = ev_hash_from_key(key);\r\n  U64 slot_idx = hash%view->key_view_rule_slots_count;\r\n  EV_KeyViewRuleSlot *slot = &view->key_view_rule_slots[slot_idx];\r\n  \r\n  //- rjf: slot -> existing node\r\n  EV_KeyViewRuleNode *existing_node = 0;\r\n  for(EV_KeyViewRuleNode *n = slot->first; n != 0; n = n->hash_next)\r\n  {\r\n    if(ev_key_match(n->key, key))\r\n    {\r\n      existing_node = n;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //- rjf: node -> result\r\n  if(existing_node != 0)\r\n  {\r\n    result = str8(existing_node->buffer, existing_node->buffer_string_size);\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal void\r\nev_key_set_expansion(EV_View *view, EV_Key parent_key, EV_Key key, B32 expanded)\r\n{\r\n  // rjf: map keys => nodes\r\n  EV_ExpandNode *parent_node = ev_expand_node_from_key(view, parent_key);\r\n  EV_ExpandNode *node = ev_expand_node_from_key(view, key);\r\n  \r\n  // rjf: make node if we don't have one, and we need one\r\n  if(node == 0 && expanded)\r\n  {\r\n    node = view->free_expand_node;\r\n    if(node != 0)\r\n    {\r\n      SLLStackPop(view->free_expand_node);\r\n      MemoryZeroStruct(node);\r\n    }\r\n    else\r\n    {\r\n      node = push_array(view->arena, EV_ExpandNode, 1);\r\n    }\r\n    \r\n    // rjf: link into table\r\n    U64 hash = ev_hash_from_key(key);\r\n    U64 slot = hash % view->expand_slots_count;\r\n    DLLPushBack_NP(view->expand_slots[slot].first, view->expand_slots[slot].last, node, hash_next, hash_prev);\r\n    \r\n    // rjf: link into parent\r\n    if(parent_node != 0)\r\n    {\r\n      EV_ExpandNode *prev = 0;\r\n      for(EV_ExpandNode *n = parent_node->first; n != 0; n = n->next)\r\n      {\r\n        if(n->key.child_id < key.child_id)\r\n        {\r\n          prev = n;\r\n        }\r\n        else\r\n        {\r\n          break;\r\n        }\r\n      }\r\n      DLLInsert_NP(parent_node->first, parent_node->last, prev, node, next, prev);\r\n      node->parent = parent_node;\r\n    }\r\n  }\r\n  \r\n  // rjf: fill\r\n  if(node != 0)\r\n  {\r\n    node->key = key;\r\n    node->expanded = expanded;\r\n  }\r\n  \r\n  // rjf: unlink node & free if we don't need it anymore\r\n  if(expanded == 0 && node != 0 && node->first == 0)\r\n  {\r\n    // rjf: unlink from table\r\n    U64 hash = ev_hash_from_key(key);\r\n    U64 slot = hash % view->expand_slots_count;\r\n    DLLRemove_NP(view->expand_slots[slot].first, view->expand_slots[slot].last, node, hash_next, hash_prev);\r\n    \r\n    // rjf: unlink from tree\r\n    if(parent_node != 0)\r\n    {\r\n      DLLRemove_NP(parent_node->first, parent_node->last, node, next, prev);\r\n    }\r\n    \r\n    // rjf: free\r\n    SLLStackPush(view->free_expand_node, node);\r\n  }\r\n}\r\n\r\ninternal void\r\nev_key_set_view_rule(EV_View *view, EV_Key key, String8 view_rule_string)\r\n{\r\n  //- rjf: key -> hash * slot idx * slot\r\n  U64 hash = ev_hash_from_key(key);\r\n  U64 slot_idx = hash%view->key_view_rule_slots_count;\r\n  EV_KeyViewRuleSlot *slot = &view->key_view_rule_slots[slot_idx];\r\n  \r\n  //- rjf: slot -> existing node\r\n  EV_KeyViewRuleNode *existing_node = 0;\r\n  for(EV_KeyViewRuleNode *n = slot->first; n != 0; n = n->hash_next)\r\n  {\r\n    if(ev_key_match(n->key, key))\r\n    {\r\n      existing_node = n;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //- rjf: existing node * new node -> node\r\n  EV_KeyViewRuleNode *node = existing_node;\r\n  if(node == 0)\r\n  {\r\n    node = push_array(view->arena, EV_KeyViewRuleNode, 1);\r\n    DLLPushBack_NP(slot->first, slot->last, node, hash_next, hash_prev);\r\n    node->key = key;\r\n    node->buffer_cap = 512;\r\n    node->buffer = push_array(view->arena, U8, node->buffer_cap);\r\n  }\r\n  \r\n  //- rjf: mutate node\r\n  if(node != 0)\r\n  {\r\n    node->buffer_string_size = ClampTop(view_rule_string.size, node->buffer_cap);\r\n    MemoryCopy(node->buffer, view_rule_string.str, node->buffer_string_size);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: View Rule Info Table Building / Selection / Lookups\r\n\r\ninternal void\r\nev_expand_rule_table_push(Arena *arena, EV_ExpandRuleTable *table, EV_ExpandRule *info)\r\n{\r\n  if(table->slots_count == 0)\r\n  {\r\n    table->slots_count = 512;\r\n    table->slots = push_array(arena, EV_ExpandRuleSlot, table->slots_count);\r\n  }\r\n  U64 hash = ev_hash_from_seed_string(5381, info->string);\r\n  U64 slot_idx = hash%table->slots_count;\r\n  EV_ExpandRuleSlot *slot = &table->slots[slot_idx];\r\n  EV_ExpandRuleNode *n = push_array(arena, EV_ExpandRuleNode, 1);\r\n  SLLQueuePush(slot->first, slot->last, n);\r\n  MemoryCopyStruct(&n->v, info);\r\n  n->v.string = push_str8_copy(arena, n->v.string);\r\n}\r\n\r\ninternal void\r\nev_select_expand_rule_table(EV_ExpandRuleTable *table)\r\n{\r\n  ev_view_rule_info_table = table;\r\n}\r\n\r\ninternal EV_ExpandRule *\r\nev_expand_rule_from_string(String8 string)\r\n{\r\n  EV_ExpandRule *info = &ev_nil_expand_rule;\r\n  if(ev_view_rule_info_table != 0 && ev_view_rule_info_table->slots_count != 0)\r\n  {\r\n    U64 hash = ev_hash_from_seed_string(5381, string);\r\n    U64 slot_idx = hash%ev_view_rule_info_table->slots_count;\r\n    EV_ExpandRuleSlot *slot = &ev_view_rule_info_table->slots[slot_idx];\r\n    EV_ExpandRuleNode *node = 0;\r\n    for(EV_ExpandRuleNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->v.string, string, 0))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node != 0)\r\n    {\r\n      info = &node->v;\r\n    }\r\n  }\r\n  return info;\r\n}\r\n\r\ninternal EV_ExpandRule *\r\nev_expand_rule_from_type_key(E_TypeKey type_key)\r\n{\r\n  EV_ExpandRule *rule = &ev_nil_expand_rule;\r\n  {\r\n    E_TypeKey k = e_type_key_unwrap(type_key, E_TypeUnwrapFlag_Meta);\r\n    E_TypeKind kind = e_type_kind_from_key(k);\r\n    for(;kind == E_TypeKind_Lens; k = e_type_key_direct(e_type_key_unwrap(k, E_TypeUnwrapFlag_Meta)), kind = e_type_kind_from_key(k))\r\n    {\r\n      E_Type *type = e_type_from_key(k);\r\n      EV_ExpandRule *candidate = ev_expand_rule_from_string(type->name);\r\n      if(candidate != &ev_nil_expand_rule)\r\n      {\r\n        rule = candidate;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return rule;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Block Building\r\n\r\ninternal EV_BlockTree\r\nev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root_eval)\r\n{\r\n  ProfBeginFunction();\r\n  EV_BlockTree tree = {&ev_nil_block};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: generate root expression\r\n    EV_Key root_key = ev_key_root();\r\n    EV_Key root_row_key = ev_key_make(ev_hash_from_key(root_key), 1);\r\n    \r\n    //- rjf: generate root block\r\n    tree.root = push_array(arena, EV_Block, 1);\r\n    MemoryCopyStruct(tree.root, &ev_nil_block);\r\n    tree.root->key              = root_key;\r\n    tree.root->string           = str8_zero();\r\n    tree.root->eval             = root_eval;\r\n    tree.root->type_expand_rule = &e_type_expand_rule__default;\r\n    tree.root->viz_expand_rule  = &ev_nil_expand_rule;\r\n    tree.root->row_count  = 1;\r\n    tree.total_row_count += 1;\r\n    tree.total_item_count += 1;\r\n    \r\n    //- rjf: generate initial task, for root's evaluation\r\n    typedef struct BlockTreeBuildTask BlockTreeBuildTask;\r\n    struct BlockTreeBuildTask\r\n    {\r\n      BlockTreeBuildTask *next;\r\n      EV_Block *parent_block;\r\n      E_Eval eval;\r\n      E_Expr *next_expr;\r\n      U64 child_id;\r\n      U64 split_relative_idx;\r\n      B32 default_expanded;\r\n      B32 force_expanded;\r\n      S32 depth;\r\n    };\r\n    BlockTreeBuildTask start_task = {0, tree.root, tree.root->eval, tree.root->eval.expr->next, 1, 0};\r\n    BlockTreeBuildTask *first_task = &start_task;\r\n    BlockTreeBuildTask *last_task = first_task;\r\n    \r\n    //- rjf: iterate all expansions & generate blocks for each\r\n    for(BlockTreeBuildTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      // rjf: get task key\r\n      EV_Key key = ev_key_make(ev_hash_from_key(t->parent_block->key), t->child_id);\r\n      \r\n      // rjf: obtain expansion node & expansion state\r\n      EV_ExpandNode *expand_node = ev_expand_node_from_key(view, key);\r\n      B32 is_expanded = (expand_node != 0 && expand_node->expanded);\r\n      if(t->default_expanded || t->force_expanded)\r\n      {\r\n        is_expanded ^= 1;\r\n      }\r\n      \r\n      // rjf: skip if not expanded\r\n      if(!is_expanded)\r\n      {\r\n        continue;\r\n      }\r\n      \r\n      // rjf: unpack eval\r\n      E_Mode mode = t->eval.irtree.mode;\r\n      E_Eval eval = t->eval;\r\n      \r\n      // rjf: pointers/reference evaluations -> dereference for expansion\r\n      {\r\n        E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_Modifiers|E_TypeUnwrapFlag_Meta);\r\n        E_TypeKind type_kind = e_type_kind_from_key(type_key);\r\n        if(e_type_kind_is_pointer_or_ref(type_kind))\r\n        {\r\n          eval = e_eval_wrapf(eval, \"*($)\");\r\n        }\r\n      }\r\n      \r\n      // rjf: unpack type key we'll use for expanding this eval\r\n      E_TypeKey expansion_type_key = ev_expansion_type_from_key(eval.irtree.type_key);\r\n      if(!e_type_key_match(expansion_type_key, e_type_key_zero()))\r\n      {\r\n        eval.irtree.type_key = expansion_type_key;\r\n      }\r\n      \r\n      // rjf: get expansion rules from type\r\n      E_TypeExpandRule *type_expand_rule = e_expand_rule_from_type_key(eval.irtree.type_key);\r\n      EV_ExpandRule *viz_expand_rule = ev_expand_rule_from_type_key(eval.irtree.type_key);\r\n      \r\n      // rjf: skip if no expansion rule, & type info disallows expansion\r\n      if(viz_expand_rule == &ev_nil_expand_rule && !ev_type_key_and_mode_is_expandable(eval.irtree.type_key, mode))\r\n      {\r\n        continue;\r\n      }\r\n      \r\n      // rjf: get filter for this task\r\n      String8 task_filter = t->depth == 0 ? filter : str8_zero();\r\n      \r\n      // rjf: get top-level lookup/expansion info\r\n      E_TypeExpandInfo type_expand_info = type_expand_rule->info(arena, eval, task_filter);\r\n      EV_ExpandInfo viz_expand_info = viz_expand_rule->info(arena, view, task_filter, eval.expr);\r\n      \r\n      // rjf: determine expansion info\r\n      U64 expansion_row_count = type_expand_info.expr_count;\r\n      if(viz_expand_rule != &ev_nil_expand_rule)\r\n      {\r\n        expansion_row_count = viz_expand_info.row_count;\r\n      }\r\n      expansion_row_count = Min(0x0fffffffffffffffull, expansion_row_count);\r\n      \r\n      // rjf: determine if this expansion supports child expansions\r\n      B32 allow_child_expansions = 1;\r\n      if(viz_expand_info.single_item)\r\n      {\r\n        // NOTE(rjf): for now, just plugging in the heuristic of \"is this a single row (a.k.a. visualizer)?\"\r\n        allow_child_expansions = 0;\r\n      }\r\n      \r\n      // rjf: generate block for expansion\r\n      EV_Block *expansion_block = &ev_nil_block;\r\n      if(expansion_row_count != 0)\r\n      {\r\n        expansion_block = push_array(arena, EV_Block, 1);\r\n        MemoryCopyStruct(expansion_block, &ev_nil_block);\r\n        DLLPushBack_NPZ(&ev_nil_block, t->parent_block->first, t->parent_block->last, expansion_block, next, prev);\r\n        expansion_block->parent                   = t->parent_block;\r\n        expansion_block->key                      = key;\r\n        expansion_block->split_relative_idx       = t->split_relative_idx;\r\n        expansion_block->eval                     = eval;\r\n        expansion_block->filter                   = task_filter;\r\n        expansion_block->type_expand_info         = type_expand_info;\r\n        expansion_block->type_expand_rule         = type_expand_rule;\r\n        expansion_block->viz_expand_info          = viz_expand_info;\r\n        expansion_block->viz_expand_rule          = viz_expand_rule;\r\n        expansion_block->row_count                = expansion_row_count;\r\n        tree.total_row_count += expansion_row_count;\r\n        tree.total_item_count += viz_expand_info.single_item ? 1 : expansion_row_count;\r\n      }\r\n      \r\n      // rjf: gather children expansions from expansion state\r\n      U64 child_count = 0;\r\n      EV_Key *child_keys = 0;\r\n      U64 *child_nums = 0;\r\n      if(allow_child_expansions && !child_count && !viz_expand_info.rows_default_expanded && expand_node != 0 && expansion_row_count != 0)\r\n      {\r\n        // rjf: count children\r\n        for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, child_count += 1){}\r\n        \r\n        // rjf: gather children keys & numbers\r\n        B32 needs_sort = 0;\r\n        child_keys = push_array(scratch.arena, EV_Key, child_count);\r\n        child_nums = push_array(scratch.arena, U64, child_count);\r\n        {\r\n          U64 idx = 0;\r\n          for(EV_ExpandNode *child = expand_node->first; child != 0; child = child->next, idx += 1)\r\n          {\r\n            child_keys[idx] = child->key;\r\n            child_nums[idx] = type_expand_rule->num_from_id(type_expand_info.user_data, child->key.child_id);\r\n            if(child_nums[idx] != child_keys[idx].child_id)\r\n            {\r\n              needs_sort = 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: sort children by number, if needed\r\n        if(needs_sort)\r\n        {\r\n          for(U64 idx1 = 0; idx1 < child_count; idx1 += 1)\r\n          {\r\n            U64 min_idx2 = 0;\r\n            U64 min_num = child_nums[idx1];\r\n            for(U64 idx2 = idx1+1; idx2 < child_count; idx2 += 1)\r\n            {\r\n              if(child_nums[idx2] < min_num)\r\n              {\r\n                min_idx2 = idx2;\r\n                min_num = child_nums[idx2];\r\n              }\r\n            }\r\n            if(min_idx2 != 0)\r\n            {\r\n              Swap(EV_Key, child_keys[idx1], child_keys[min_idx2]);\r\n              Swap(U64, child_nums[idx1], child_nums[min_idx2]);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: gather children expansions from inverse of expansion state\r\n      if(allow_child_expansions && !child_count && (viz_expand_info.rows_default_expanded || (expand_node == 0 && !viz_expand_info.rows_default_expanded)))\r\n      {\r\n        child_count = viz_expand_info.row_count;\r\n        child_keys  = push_array(scratch.arena, EV_Key, child_count);\r\n        child_nums  = push_array(scratch.arena, U64,    child_count);\r\n        for(U64 idx = 0; idx < child_count; idx += 1)\r\n        {\r\n          U64 child_id = type_expand_rule->id_from_num(type_expand_info.user_data, idx+1);\r\n          child_keys[idx] = ev_key_make(ev_hash_from_key(key), child_id);\r\n          child_nums[idx] = idx+1;\r\n        }\r\n      }\r\n      \r\n      // rjf: iterate children expansions & generate recursion tasks\r\n      for(U64 idx = 0; idx < child_count; idx += 1)\r\n      {\r\n        U64 split_num = child_nums[idx];\r\n        U64 split_relative_idx = split_num - 1;\r\n        if(split_relative_idx >= expansion_row_count)\r\n        {\r\n          continue;\r\n        }\r\n        if(viz_expand_info.rows_default_expanded || ev_expansion_from_key(view, child_keys[idx]))\r\n        {\r\n          Rng1U64 child_range = r1u64(split_relative_idx, split_relative_idx+1);\r\n          E_Eval child_eval = {0};\r\n          type_expand_rule->range(arena, type_expand_info.user_data, eval, task_filter, r1u64(split_relative_idx, split_relative_idx+1), &child_eval);\r\n          EV_Key child_key = child_keys[idx];\r\n          BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1);\r\n          SLLQueuePush(first_task, last_task, task);\r\n          task->parent_block       = expansion_block;\r\n          task->eval               = child_eval;\r\n          task->next_expr          = &e_expr_nil;\r\n          task->child_id           = child_key.child_id;\r\n          task->split_relative_idx = split_relative_idx;\r\n          task->default_expanded   = viz_expand_info.rows_default_expanded;\r\n          task->depth              = t->depth+1;\r\n        }\r\n      }\r\n      \r\n      // rjf: if this expr has a sibling, push another task to continue the chain\r\n      if(t->next_expr != &e_expr_nil)\r\n      {\r\n        BlockTreeBuildTask *task = push_array(scratch.arena, BlockTreeBuildTask, 1);\r\n        task->next = t->next;\r\n        t->next = task;\r\n        task->parent_block       = t->parent_block;\r\n        task->eval               = e_eval_from_expr(t->next_expr);\r\n        task->next_expr          = t->next_expr->next;\r\n        task->child_id           = t->child_id + 1;\r\n        task->split_relative_idx = 0;\r\n        task->default_expanded   = t->default_expanded;\r\n        task->force_expanded     = 1;\r\n        task->depth              = t->depth;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  ProfEnd();\r\n  return tree;\r\n}\r\n\r\ninternal U64\r\nev_depth_from_block(EV_Block *block)\r\n{\r\n  U64 depth = 0;\r\n  for(EV_Block *b = block->parent; b != &ev_nil_block; b = b->parent)\r\n  {\r\n    depth += 1;\r\n  }\r\n  return depth;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Block Coordinate Spaces\r\n\r\ninternal U64\r\nev_block_id_from_num(EV_Block *block, U64 num)\r\n{\r\n  U64 result = block->type_expand_rule->id_from_num(block->type_expand_info.user_data, num);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nev_block_num_from_id(EV_Block *block, U64 id)\r\n{\r\n  U64 result = block->type_expand_rule->num_from_id(block->type_expand_info.user_data, id);\r\n  return result;\r\n}\r\n\r\ninternal EV_BlockRangeList\r\nev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree)\r\n{\r\n  EV_BlockRangeList list = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    typedef struct BlockTask BlockTask;\r\n    struct BlockTask\r\n    {\r\n      BlockTask *next;\r\n      EV_Block *block;\r\n      EV_Block *next_child;\r\n      Rng1U64 block_relative_range;\r\n    };\r\n    BlockTask start_task = {0, block_tree->root, block_tree->root->first, r1u64(0, block_tree->root->row_count)};\r\n    for(BlockTask *t = &start_task; t != 0; t = t->next)\r\n    {\r\n      // rjf: get block-relative range, truncated by split position of next child\r\n      Rng1U64 block_relative_range = t->block_relative_range;\r\n      if(t->next_child != &ev_nil_block)\r\n      {\r\n        block_relative_range.max = t->next_child->split_relative_idx+1;\r\n      }\r\n      U64 block_num_visual_rows = dim_1u64(block_relative_range);\r\n      \r\n      // rjf: generate range node \r\n      if(block_num_visual_rows != 0)\r\n      {\r\n        EV_BlockRangeNode *n = push_array(arena, EV_BlockRangeNode, 1);\r\n        n->v.block = t->block;\r\n        n->v.range = block_relative_range;\r\n        SLLQueuePush(list.first, list.last, n);\r\n        list.count += 1;\r\n      }\r\n      \r\n      // rjf: generate task for child, + for post-child parts of this block\r\n      if(t->next_child != &ev_nil_block)\r\n      {\r\n        // rjf: generate task for child - do *before* remainder (descend block tree depth first)\r\n        BlockTask *child_task = push_array(scratch.arena, BlockTask, 1);\r\n        child_task->next = t->next;\r\n        t->next = child_task;\r\n        child_task->block = t->next_child;\r\n        child_task->next_child = t->next_child->first;\r\n        child_task->block_relative_range = r1u64(0, t->next_child->row_count);\r\n        \r\n        // rjf: generate task for post-child rows, if any, after children\r\n        Rng1U64 remainder_range = r1u64(t->next_child->split_relative_idx+1, t->block_relative_range.max);\r\n        if(remainder_range.max >= remainder_range.min)\r\n        {\r\n          BlockTask *remainder_task = push_array(scratch.arena, BlockTask, 1);\r\n          remainder_task->next = child_task->next;\r\n          child_task->next = remainder_task;\r\n          remainder_task->block = t->block;\r\n          remainder_task->next_child = t->next_child->next;\r\n          remainder_task->block_relative_range = remainder_range;\r\n        }\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal EV_BlockRange\r\nev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num)\r\n{\r\n  EV_BlockRange result = {&ev_nil_block};\r\n  U64 base_num = 1;\r\n  for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)\r\n  {\r\n    U64 range_size = n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);\r\n    Rng1U64 global_range = r1u64(base_num, base_num + range_size);\r\n    if(contains_1u64(global_range, num))\r\n    {\r\n      result = n->v;\r\n      break;\r\n    }\r\n    base_num += range_size;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal EV_Key\r\nev_key_from_num(EV_BlockRangeList *block_ranges, U64 num)\r\n{\r\n  EV_Key key = {0};\r\n  if(block_ranges->first)\r\n  {\r\n    key = ev_key_make(ev_hash_from_key(ev_key_root()), 1);\r\n  }\r\n  U64 base_num = 1;\r\n  for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)\r\n  {\r\n    U64 range_size = n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);\r\n    Rng1U64 global_range = r1u64(base_num, base_num + range_size);\r\n    if(contains_1u64(global_range, num))\r\n    {\r\n      U64 relative_num = (num - base_num) + n->v.range.min + 1;\r\n      U64 child_id = ev_block_id_from_num(n->v.block, relative_num);\r\n      EV_Key block_key = n->v.block->key;\r\n      key = ev_key_make(ev_hash_from_key(block_key), child_id);\r\n      break;\r\n    }\r\n    base_num += range_size;\r\n  }\r\n  return key;\r\n}\r\n\r\ninternal U64\r\nev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key)\r\n{\r\n  U64 result = 0;\r\n  U64 base_num = 1;\r\n  for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)\r\n  {\r\n    U64 hash = ev_hash_from_key(n->v.block->key);\r\n    if(hash == key.parent_hash)\r\n    {\r\n      U64 relative_num = ev_block_num_from_id(n->v.block, key.child_id);\r\n      Rng1U64 num_range = r1u64(n->v.range.min, n->v.block->viz_expand_info.single_item ? (n->v.range.min+1) : n->v.range.max);\r\n      if(contains_1u64(num_range, relative_num-1))\r\n      {\r\n        result = base_num + (relative_num - 1 - n->v.range.min);\r\n        break;\r\n      }\r\n    }\r\n    base_num += n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nev_vnum_from_num(EV_BlockRangeList *block_ranges, U64 num)\r\n{\r\n  U64 vnum = 0;\r\n  {\r\n    U64 base_vnum = 1;\r\n    U64 base_num = 1;\r\n    for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)\r\n    {\r\n      U64 next_base_num = base_num + (n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range));\r\n      if(base_num <= num && num < next_base_num)\r\n      {\r\n        U64 relative_vnum = (n->v.block->viz_expand_info.single_item ? 0 : (num - base_num));\r\n        vnum = base_vnum + relative_vnum;\r\n        break;\r\n      }\r\n      base_num = next_base_num;\r\n      base_vnum += dim_1u64(n->v.range);\r\n    }\r\n    if(vnum == 0)\r\n    {\r\n      vnum = base_vnum;\r\n    }\r\n  }\r\n  return vnum;\r\n}\r\n\r\ninternal U64\r\nev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vnum)\r\n{\r\n  U64 num = 0;\r\n  {\r\n    U64 base_vnum = 1;\r\n    U64 base_num = 1;\r\n    for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)\r\n    {\r\n      U64 next_base_vnum = base_vnum + dim_1u64(n->v.range);\r\n      if(base_vnum <= vnum && vnum < next_base_vnum)\r\n      {\r\n        U64 relative_num = (n->v.block->viz_expand_info.single_item ? 0 : (vnum - base_vnum));\r\n        num = base_num + relative_num;\r\n        break;\r\n      }\r\n      base_vnum = next_base_vnum;\r\n      base_num += (n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range));\r\n    }\r\n  }\r\n  return num;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Row Building\r\n\r\ninternal EV_WindowedRowList\r\nev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range)\r\n{\r\n  EV_WindowedRowList rows = {0};\r\n  {\r\n    U64 base_vnum = 1;\r\n    for(EV_BlockRangeNode *n = block_ranges->first; n != 0; n = n->next)\r\n    {\r\n      // rjf: unpack this block/range pair\r\n      Rng1U64 block_relative_range = n->v.range;\r\n      U64 block_num_visual_rows = dim_1u64(block_relative_range);\r\n      Rng1U64 block_global_range = r1u64(base_vnum, base_vnum + block_num_visual_rows);\r\n      String8 block_filter = n->v.block->filter;\r\n      \r\n      // rjf: get skip/chop of global range\r\n      U64 num_skipped = 0;\r\n      U64 num_chopped = 0;\r\n      {\r\n        if(vnum_range.min > block_global_range.min)\r\n        {\r\n          num_skipped = (vnum_range.min - block_global_range.min);\r\n          num_skipped = Min(num_skipped, block_num_visual_rows);\r\n        }\r\n        if(vnum_range.max < block_global_range.max)\r\n        {\r\n          num_chopped = (block_global_range.max - vnum_range.max);\r\n          num_chopped = Min(num_chopped, block_num_visual_rows);\r\n        }\r\n      }\r\n      \r\n      // rjf: get block-relative *windowed* range\r\n      Rng1U64 block_relative_range__windowed = r1u64(block_relative_range.min + num_skipped,\r\n                                                     block_relative_range.max - num_chopped);\r\n      \r\n      // rjf: sum & advance\r\n      base_vnum += block_num_visual_rows;\r\n      rows.count_before_visual += num_skipped;\r\n      if(block_num_visual_rows != 0 && num_skipped != 0)\r\n      {\r\n        if(n->v.block->viz_expand_info.single_item)\r\n        {\r\n          if(num_skipped >= block_num_visual_rows)\r\n          {\r\n            rows.count_before_semantic += 1;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          rows.count_before_semantic += num_skipped;\r\n        }\r\n      }\r\n      \r\n      // rjf: generate rows before next splitting child\r\n      if(block_relative_range__windowed.max > block_relative_range__windowed.min)\r\n      {\r\n        // rjf: get info about expansion range\r\n        B32 is_standalone_row = 0;\r\n        U64 range_exprs_count = dim_1u64(block_relative_range__windowed);\r\n        E_Eval *range_evals = push_array(arena, E_Eval, range_exprs_count);\r\n        for EachIndex(idx, range_exprs_count)\r\n        {\r\n          range_evals[idx] = e_eval_nil;\r\n        }\r\n        if(n->v.block->viz_expand_info.single_item || n->v.block->parent == &ev_nil_block)\r\n        {\r\n          is_standalone_row = 1;\r\n        }\r\n        else\r\n        {\r\n          n->v.block->type_expand_rule->range(arena, n->v.block->type_expand_info.user_data, n->v.block->eval, block_filter, block_relative_range__windowed, range_evals);\r\n        }\r\n        \r\n        // rjf: no expansion operator applied -> push row for block expression; pass through block info\r\n        if(is_standalone_row)\r\n        {\r\n          EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);\r\n          SLLQueuePush(rows.first, rows.last, row_node);\r\n          rows.count += 1;\r\n          row_node->visual_size_skipped = num_skipped;\r\n          row_node->visual_size_chopped = num_chopped;\r\n          EV_Row *row = &row_node->row;\r\n          row->block         = n->v.block;\r\n          row->key           = ev_key_make(ev_hash_from_key(row->block->key), 1);\r\n          row->visual_size   = n->v.block->viz_expand_info.single_item ? (n->v.block->row_count - (num_skipped + num_chopped)) : 1;\r\n          row->edit_string   = n->v.block->string;\r\n          row->eval          = n->v.block->eval;\r\n        }\r\n        \r\n        // rjf: expansion operator applied -> call, and add rows for all expressions in the viewable range\r\n        else for EachIndex(idx, range_exprs_count)\r\n        {\r\n          U64 child_num = block_relative_range.min + num_skipped + idx + 1;\r\n          U64 child_id = ev_block_id_from_num(n->v.block, child_num);\r\n          EV_Key row_key = ev_key_make(ev_hash_from_key(n->v.block->key), child_id);\r\n          E_Eval row_eval = range_evals[idx];\r\n          EV_WindowedRowNode *row_node = push_array(arena, EV_WindowedRowNode, 1);\r\n          SLLQueuePush(rows.first, rows.last, row_node);\r\n          rows.count += 1;\r\n          EV_Row *row = &row_node->row;\r\n          row->block                = n->v.block;\r\n          row->key                  = row_key;\r\n          row->visual_size          = 1;\r\n          row->edit_string          = row_eval.string;\r\n          row->eval                 = row_eval;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return rows;\r\n}\r\n\r\ninternal EV_Row *\r\nev_row_from_num(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, U64 num)\r\n{\r\n  U64 vidx = ev_vnum_from_num(block_ranges, num);\r\n  EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, block_ranges, r1u64(vidx, vidx+1));\r\n  EV_Row *result = 0;\r\n  if(rows.first != 0)\r\n  {\r\n    result = &rows.first->row;\r\n  }\r\n  else\r\n  {\r\n    result = push_array(arena, EV_Row, 1);\r\n    result->block = &ev_nil_block;\r\n    result->eval = e_eval_nil;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal EV_WindowedRowList\r\nev_rows_from_num_range(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 num_range)\r\n{\r\n  Rng1U64 vnum_range = r1u64(ev_vnum_from_num(block_ranges, num_range.min), ev_vnum_from_num(block_ranges, num_range.max)+1);\r\n  EV_WindowedRowList rows = ev_windowed_row_list_from_block_range_list(arena, view, block_ranges, vnum_range);\r\n  return rows;\r\n}\r\n\r\ninternal B32\r\nev_eval_is_expandable(E_Eval eval)\r\n{\r\n  B32 result = 0;\r\n  E_IRTreeAndType irtree = eval.irtree;\r\n  \r\n  // rjf: determine if lenses force expandability\r\n  if(!result)\r\n  {\r\n    EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(irtree.type_key);\r\n    if(expand_rule != &ev_nil_expand_rule)\r\n    {\r\n      result = 1;\r\n    }\r\n  }\r\n  \r\n  // rjf: determine if type info force expandability\r\n  if(!result)\r\n  {\r\n    result = ev_type_key_and_mode_is_expandable(irtree.type_key, irtree.mode);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nev_row_is_expandable(EV_Row *row)\r\n{\r\n  B32 result = 0;\r\n  if(!ev_key_match(ev_key_root(), row->block->key))\r\n  {\r\n    result = ev_eval_is_expandable(row->eval);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nev_row_is_editable(EV_Row *row)\r\n{\r\n  B32 result = 0;\r\n  E_IRTreeAndType irtree = row->eval.irtree;\r\n  result = ev_type_key_is_editable(irtree.type_key);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Stringification\r\n\r\n//- rjf: leaf stringification\r\n\r\ninternal String8\r\nev_string_from_ascii_value(Arena *arena, U8 val)\r\n{\r\n  String8 result = {0};\r\n  switch(val)\r\n  {\r\n    case 0x00:{result = str8_lit(\"\\\\0\");}break;\r\n    case 0x07:{result = str8_lit(\"\\\\a\");}break;\r\n    case 0x08:{result = str8_lit(\"\\\\b\");}break;\r\n    case 0x0c:{result = str8_lit(\"\\\\f\");}break;\r\n    case 0x0a:{result = str8_lit(\"\\\\n\");}break;\r\n    case 0x0d:{result = str8_lit(\"\\\\r\");}break;\r\n    case 0x09:{result = str8_lit(\"\\\\t\");}break;\r\n    case 0x0b:{result = str8_lit(\"\\\\v\");}break;\r\n    case 0x3f:{result = str8_lit(\"\\\\?\");}break;\r\n    case '\"': {result = str8_lit(\"\\\\\\\"\");}break;\r\n    case '\\'':{result = str8_lit(\"\\\\'\");}break;\r\n    case '\\\\':{result = str8_lit(\"\\\\\\\\\");}break;\r\n    default:\r\n    if(32 <= val && val < 255)\r\n    {\r\n      result = push_str8f(arena, \"%c\", val);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nev_string_from_hresult_facility_code(U32 code)\r\n{\r\n  String8 result = {0};\r\n  switch(code)\r\n  {\r\n    default:{}break;\r\n    case 0x1:{result = str8_lit(\"RPC\");}break;\r\n    case 0x2:{result = str8_lit(\"DISPATCH\");}break;\r\n    case 0x3:{result = str8_lit(\"STORAGE\");}break;\r\n    case 0x4:{result = str8_lit(\"ITF\");}break;\r\n    case 0x7:{result = str8_lit(\"WIN32\");}break;\r\n    case 0x8:{result = str8_lit(\"WINDOWS\");}break;\r\n    case 0x9:{result = str8_lit(\"SECURITY|SSPI\");}break;\r\n    case 0xA:{result = str8_lit(\"CONTROL\");}break;\r\n    case 0xB:{result = str8_lit(\"CERT\");}break;\r\n    case 0xC:{result = str8_lit(\"INTERNET\");}break;\r\n    case 0xD:{result = str8_lit(\"MEDIASERVER\");}break;\r\n    case 0xE:{result = str8_lit(\"MSMQ\");}break;\r\n    case 0xF:{result = str8_lit(\"SETUPAPI\");}break;\r\n    case 0x10:{result = str8_lit(\"SCARD\");}break;\r\n    case 0x11:{result = str8_lit(\"COMPLUS\");}break;\r\n    case 0x12:{result = str8_lit(\"AAF\");}break;\r\n    case 0x13:{result = str8_lit(\"URT\");}break;\r\n    case 0x14:{result = str8_lit(\"ACS\");}break;\r\n    case 0x15:{result = str8_lit(\"DPLAY\");}break;\r\n    case 0x16:{result = str8_lit(\"UMI\");}break;\r\n    case 0x17:{result = str8_lit(\"SXS\");}break;\r\n    case 0x18:{result = str8_lit(\"WINDOWS_CE\");}break;\r\n    case 0x19:{result = str8_lit(\"HTTP\");}break;\r\n    case 0x1A:{result = str8_lit(\"USERMODE_COMMONLOG\");}break;\r\n    case 0x1B:{result = str8_lit(\"WER\");}break;\r\n    case 0x1F:{result = str8_lit(\"USERMODE_FILTER_MANAGER\");}break;\r\n    case 0x20:{result = str8_lit(\"BACKGROUNDCOPY\");}break;\r\n    case 0x21:{result = str8_lit(\"CONFIGURATION|WIA\");}break;\r\n    case 0x22:{result = str8_lit(\"STATE_MANAGEMENT\");}break;\r\n    case 0x23:{result = str8_lit(\"METADIRECTORY\");}break;\r\n    case 0x24:{result = str8_lit(\"WINDOWSUPDATE\");}break;\r\n    case 0x25:{result = str8_lit(\"DIRECTORYSERVICE\");}break;\r\n    case 0x26:{result = str8_lit(\"GRAPHICS\");}break;\r\n    case 0x27:{result = str8_lit(\"SHELL|NAP\");}break;\r\n    case 0x28:{result = str8_lit(\"TPM_SERVICES\");}break;\r\n    case 0x29:{result = str8_lit(\"TPM_SOFTWARE\");}break;\r\n    case 0x2A:{result = str8_lit(\"UI\");}break;\r\n    case 0x2B:{result = str8_lit(\"XAML\");}break;\r\n    case 0x2C:{result = str8_lit(\"ACTION_QUEUE\");}break;\r\n    case 0x30:{result = str8_lit(\"WINDOWS_SETUP|PLA\");}break;\r\n    case 0x31:{result = str8_lit(\"FVE\");}break;\r\n    case 0x32:{result = str8_lit(\"FWP\");}break;\r\n    case 0x33:{result = str8_lit(\"WINRM\");}break;\r\n    case 0x34:{result = str8_lit(\"NDIS\");}break;\r\n    case 0x35:{result = str8_lit(\"USERMODE_HYPERVISOR\");}break;\r\n    case 0x36:{result = str8_lit(\"CMI\");}break;\r\n    case 0x37:{result = str8_lit(\"USERMODE_VIRTUALIZATION\");}break;\r\n    case 0x38:{result = str8_lit(\"USERMODE_VOLMGR\");}break;\r\n    case 0x39:{result = str8_lit(\"BCD\");}break;\r\n    case 0x3A:{result = str8_lit(\"USERMODE_VHD\");}break;\r\n    case 0x3C:{result = str8_lit(\"SDIAG\");}break;\r\n    case 0x3D:{result = str8_lit(\"WINPE|WEBSERVICES\");}break;\r\n    case 0x3E:{result = str8_lit(\"WPN\");}break;\r\n    case 0x3F:{result = str8_lit(\"WINDOWS_STORE\");}break;\r\n    case 0x40:{result = str8_lit(\"INPUT\");}break;\r\n    case 0x42:{result = str8_lit(\"EAP\");}break;\r\n    case 0x50:{result = str8_lit(\"WINDOWS_DEFENDER\");}break;\r\n    case 0x51:{result = str8_lit(\"OPC\");}break;\r\n    case 0x52:{result = str8_lit(\"XPS\");}break;\r\n    case 0x53:{result = str8_lit(\"RAS\");}break;\r\n    case 0x54:{result = str8_lit(\"POWERSHELL|MBN\");}break;\r\n    case 0x55:{result = str8_lit(\"EAS\");}break;\r\n    case 0x62:{result = str8_lit(\"P2P_INT\");}break;\r\n    case 0x63:{result = str8_lit(\"P2P\");}break;\r\n    case 0x64:{result = str8_lit(\"DAF\");}break;\r\n    case 0x65:{result = str8_lit(\"BLUETOOTH_ATT\");}break;\r\n    case 0x66:{result = str8_lit(\"AUDIO\");}break;\r\n    case 0x6D:{result = str8_lit(\"VISUALCPP\");}break;\r\n    case 0x70:{result = str8_lit(\"SCRIPT\");}break;\r\n    case 0x71:{result = str8_lit(\"PARSE\");}break;\r\n    case 0x78:{result = str8_lit(\"BLB\");}break;\r\n    case 0x79:{result = str8_lit(\"BLB_CLI\");}break;\r\n    case 0x7A:{result = str8_lit(\"WSBAPP\");}break;\r\n    case 0x80:{result = str8_lit(\"BLBUI\");}break;\r\n    case 0x81:{result = str8_lit(\"USN\");}break;\r\n    case 0x82:{result = str8_lit(\"USERMODE_VOLSNAP\");}break;\r\n    case 0x83:{result = str8_lit(\"TIERING\");}break;\r\n    case 0x85:{result = str8_lit(\"WSB_ONLINE\");}break;\r\n    case 0x86:{result = str8_lit(\"ONLINE_ID\");}break;\r\n    case 0x99:{result = str8_lit(\"DLS\");}break;\r\n    case 0xA0:{result = str8_lit(\"SOS\");}break;\r\n    case 0xB0:{result = str8_lit(\"DEBUGGERS\");}break;\r\n    case 0xE7:{result = str8_lit(\"USERMODE_SPACES\");}break;\r\n    case 0x100:{result = str8_lit(\"DMSERVER|RESTORE|SPP\");}break;\r\n    case 0x101:{result = str8_lit(\"DEPLOYMENT_SERVICES_SERVER\");}break;\r\n    case 0x102:{result = str8_lit(\"DEPLOYMENT_SERVICES_IMAGING\");}break;\r\n    case 0x103:{result = str8_lit(\"DEPLOYMENT_SERVICES_MANAGEMENT\");}break;\r\n    case 0x104:{result = str8_lit(\"DEPLOYMENT_SERVICES_UTIL\");}break;\r\n    case 0x105:{result = str8_lit(\"DEPLOYMENT_SERVICES_BINLSVC\");}break;\r\n    case 0x107:{result = str8_lit(\"DEPLOYMENT_SERVICES_PXE\");}break;\r\n    case 0x108:{result = str8_lit(\"DEPLOYMENT_SERVICES_TFTP\");}break;\r\n    case 0x110:{result = str8_lit(\"DEPLOYMENT_SERVICES_TRANSPORT_MANAGEMENT\");}break;\r\n    case 0x116:{result = str8_lit(\"DEPLOYMENT_SERVICES_DRIVER_PROVISIONING\");}break;\r\n    case 0x121:{result = str8_lit(\"DEPLOYMENT_SERVICES_MULTICAST_SERVER\");}break;\r\n    case 0x122:{result = str8_lit(\"DEPLOYMENT_SERVICES_MULTICAST_CLIENT\");}break;\r\n    case 0x125:{result = str8_lit(\"DEPLOYMENT_SERVICES_CONTENT_PROVIDER\");}break;\r\n    case 0x131:{result = str8_lit(\"LINGUISTIC_SERVICES\");}break;\r\n    case 0x375:{result = str8_lit(\"WEB\");}break;\r\n    case 0x376:{result = str8_lit(\"WEB_SOCKET\");}break;\r\n    case 0x446:{result = str8_lit(\"AUDIOSTREAMING\");}break;\r\n    case 0x600:{result = str8_lit(\"ACCELERATOR\");}break;\r\n    case 0x701:{result = str8_lit(\"MOBILE\");}break;\r\n    case 0x7CC:{result = str8_lit(\"WMAAECMA\");}break;\r\n    case 0x801:{result = str8_lit(\"WEP\");}break;\r\n    case 0x802:{result = str8_lit(\"SYNCENGINE\");}break;\r\n    case 0x878:{result = str8_lit(\"DIRECTMUSIC\");}break;\r\n    case 0x879:{result = str8_lit(\"DIRECT3D10\");}break;\r\n    case 0x87A:{result = str8_lit(\"DXGI\");}break;\r\n    case 0x87B:{result = str8_lit(\"DXGI_DDI\");}break;\r\n    case 0x87C:{result = str8_lit(\"DIRECT3D11\");}break;\r\n    case 0x888:{result = str8_lit(\"LEAP\");}break;\r\n    case 0x889:{result = str8_lit(\"AUDCLNT\");}break;\r\n    case 0x898:{result = str8_lit(\"WINCODEC_DWRITE_DWM\");}break;\r\n    case 0x899:{result = str8_lit(\"DIRECT2D\");}break;\r\n    case 0x900:{result = str8_lit(\"DEFRAG\");}break;\r\n    case 0x901:{result = str8_lit(\"USERMODE_SDBUS\");}break;\r\n    case 0x902:{result = str8_lit(\"JSCRIPT\");}break;\r\n    case 0xA01:{result = str8_lit(\"PIDGENX\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nev_string_from_hresult_code(U32 code)\r\n{\r\n  String8 result = {0};\r\n  switch(code)\r\n  {\r\n    default:{}break;\r\n    case 0x00000000: {result = str8_lit(\"S_OK: Operation successful\");}break;\r\n    case 0x00000001: {result = str8_lit(\"S_FALSE: Operation successful but returned no results\");}break;\r\n    case 0x80004004: {result = str8_lit(\"E_ABORT: Operation aborted\");}break;\r\n    case 0x80004005: {result = str8_lit(\"E_FAIL: Unspecified failure\");}break;\r\n    case 0x80004002: {result = str8_lit(\"E_NOINTERFACE: No such interface supported\");}break;\r\n    case 0x80004001: {result = str8_lit(\"E_NOTIMPL: Not implemented\");}break;\r\n    case 0x80004003: {result = str8_lit(\"E_POINTER: Pointer that is not valid\");}break;\r\n    case 0x8000FFFF: {result = str8_lit(\"E_UNEXPECTED: Unexpected failure\");}break;\r\n    case 0x80070005: {result = str8_lit(\"E_ACCESSDENIED: General access denied error\");}break;\r\n    case 0x80070006: {result = str8_lit(\"E_HANDLE: Handle that is not valid\");}break;\r\n    case 0x80070057: {result = str8_lit(\"E_INVALIDARG: One or more arguments are not valid\");}break;\r\n    case 0x8007000E: {result = str8_lit(\"E_OUTOFMEMORY: Failed to allocate necessary memory\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval)\r\n{\r\n  String8 result = {0};\r\n  E_TypeKey type_key = e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums);\r\n  E_TypeKind type_kind = e_type_kind_from_key(type_key);\r\n  U64 type_byte_size = e_type_byte_size_from_key(type_key);\r\n  U8 digit_group_separator = 0;\r\n  if(!(params->flags & EV_StringFlag_ReadOnlyDisplayRules))\r\n  {\r\n    digit_group_separator = 0;\r\n  }\r\n  S64 s64 = 0;\r\n  U64 u64 = 0;\r\n  F64 f64 = 0;\r\n  switch(type_kind)\r\n  {\r\n    default:{}break;\r\n    \r\n    case E_TypeKind_Handle:\r\n    {\r\n      result = str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator);\r\n    }break;\r\n    \r\n    case E_TypeKind_HResult:\r\n    {\r\n      if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        U32 hresult_value = (U32)eval.value.u64;\r\n        U32 is_error   = !!(hresult_value & (1ull<<31));\r\n        U32 error_code = (hresult_value);\r\n        U32 facility   = (hresult_value & 0x7ff0000) >> 16;\r\n        String8 value_string = str8_from_s64(scratch.arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);\r\n        String8 facility_string = ev_string_from_hresult_facility_code(facility);\r\n        String8 error_string = ev_string_from_hresult_code(error_code);\r\n        result = push_str8f(arena, \"%S%s%s%S%s%s%S%s\",\r\n                            error_string,\r\n                            error_string.size != 0 ? \" \" : \"\",\r\n                            facility_string.size != 0 ? \"[\" : \"\",\r\n                            facility_string,\r\n                            facility_string.size != 0 ? \"] \": \"\",\r\n                            error_string.size != 0 ? \"(\" : \"\",\r\n                            value_string,\r\n                            error_string.size != 0 ? \")\" : \"\");\r\n        scratch_end(scratch);\r\n      }\r\n      else\r\n      {\r\n        result = str8_from_s64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator);\r\n      }\r\n    }break;\r\n    \r\n    case E_TypeKind_Char8:\r\n    case E_TypeKind_Char16:\r\n    case E_TypeKind_Char32:\r\n    case E_TypeKind_UChar8:\r\n    case E_TypeKind_UChar16:\r\n    case E_TypeKind_UChar32:\r\n    {\r\n      B32 type_is_unsigned = (E_TypeKind_UChar8 <= type_kind && type_kind <= E_TypeKind_UChar32);\r\n      String8 char_str = {0};\r\n      if(!(params->flags & EV_StringFlag_DisableChars))\r\n      {\r\n        char_str = ev_string_from_ascii_value(arena, eval.value.s64);\r\n      }\r\n      if(char_str.size != 0)\r\n      {\r\n        if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)\r\n        {\r\n          String8 imm_string = (type_is_unsigned\r\n                                ? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator)\r\n                                : str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator));\r\n          result = push_str8f(arena, \"'%S' (%S)\", char_str, imm_string);\r\n        }\r\n        else\r\n        {\r\n          result = push_str8f(arena, \"'%S'\", char_str);\r\n        }\r\n      }\r\n      else\r\n      {\r\n        result = (type_is_unsigned\r\n                  ? str8_from_u64(arena, eval.value.u64, params->radix, params->min_digits, digit_group_separator)\r\n                  : str8_from_s64(arena, eval.value.s64, params->radix, params->min_digits, digit_group_separator));\r\n      }\r\n    }break;\r\n    \r\n    case E_TypeKind_S8:  s64 = (S64)eval.value.s8; goto sint_path;\r\n    case E_TypeKind_S16: s64 = (S64)eval.value.s16; goto sint_path;\r\n    case E_TypeKind_S32: s64 = (S64)eval.value.s32; goto sint_path;\r\n    case E_TypeKind_S64: s64 = (S64)eval.value.s64; goto sint_path;\r\n    sint_path:;\r\n    {\r\n      result = str8_from_s64(arena, s64, params->radix, params->min_digits, digit_group_separator);\r\n    }break;\r\n    \r\n    case E_TypeKind_U8:  u64 = (U64)eval.value.u8; goto uint_path;\r\n    case E_TypeKind_U16: u64 = (U64)eval.value.u16; goto uint_path;\r\n    case E_TypeKind_U32: u64 = (U64)eval.value.u32; goto uint_path;\r\n    case E_TypeKind_U64: u64 = (U64)eval.value.u64; goto uint_path;\r\n    uint_path:;\r\n    {\r\n      result = str8_from_u64(arena, u64, params->radix, params->min_digits, digit_group_separator);\r\n    }break;\r\n    \r\n    case E_TypeKind_U128:\r\n    {\r\n      Temp scratch = scratch_begin(&arena, 1);\r\n      String8 upper64 = str8_from_u64(scratch.arena, eval.value.u128.u64[0], params->radix, params->min_digits, digit_group_separator);\r\n      String8 lower64 = str8_from_u64(scratch.arena, eval.value.u128.u64[1], params->radix, params->min_digits, digit_group_separator);\r\n      result = push_str8f(arena, \"%S:%S\", upper64, lower64);\r\n      scratch_end(scratch);\r\n    }break;\r\n    \r\n    case E_TypeKind_F32:{f64 = (F64)eval.value.f32;}goto f64_path;\r\n    case E_TypeKind_F64:{f64 = eval.value.f64;}goto f64_path;\r\n    f64_path:;\r\n    {\r\n      result = push_str8f(arena, \"%.*f\", params->min_digits ? params->min_digits : 16, f64);\r\n      U64 num_to_chop = 0;\r\n      for(U64 num_trimmed = 0; num_trimmed < result.size; num_trimmed += 1)\r\n      {\r\n        if(result.str[result.size - 1 - num_trimmed] != '0')\r\n        {\r\n          if(result.str[result.size - 1 - num_trimmed] == '.' && num_to_chop > 0)\r\n          {\r\n            num_to_chop -= 1;\r\n          }\r\n          break;\r\n        }\r\n        num_to_chop += 1;\r\n      }\r\n      result = str8_chop(result, num_to_chop);\r\n    }break;\r\n    case E_TypeKind_Bool:{result = push_str8f(arena, \"%s\", eval.value.u64 ? \"true\" : \"false\");}break;\r\n    case E_TypeKind_Ptr: {result = push_str8f(arena, \"0x%I64x\", eval.value.u64);}break;\r\n    case E_TypeKind_LRef:{result = push_str8f(arena, \"0x%I64x\", eval.value.u64);}break;\r\n    case E_TypeKind_RRef:{result = push_str8f(arena, \"0x%I64x\", eval.value.u64);}break;\r\n    case E_TypeKind_Function:{result = push_str8f(arena, \"0x%I64x\", eval.value.u64);}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nev_escaped_from_raw_string(Arena *arena, String8 raw)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List parts = {0};\r\n  U64 start_split_idx = 0;\r\n  for(U64 idx = 0; idx <= raw.size; idx += 1)\r\n  {\r\n    U8 byte = (idx < raw.size) ? raw.str[idx] : 0;\r\n    B32 split = 1;\r\n    String8 separator_replace = {0};\r\n    switch(byte)\r\n    {\r\n      default:{split = 0;}break;\r\n      case 0:    {}break;\r\n      case '\\a': {separator_replace = str8_lit(\"\\\\a\");}break;\r\n      case '\\b': {separator_replace = str8_lit(\"\\\\b\");}break;\r\n      case '\\f': {separator_replace = str8_lit(\"\\\\f\");}break;\r\n      case '\\n': {separator_replace = str8_lit(\"\\\\n\");}break;\r\n      case '\\r': {separator_replace = str8_lit(\"\\\\r\");}break;\r\n      case '\\t': {separator_replace = str8_lit(\"\\\\t\");}break;\r\n      case '\\v': {separator_replace = str8_lit(\"\\\\v\");}break;\r\n      case '\\\\': {separator_replace = str8_lit(\"\\\\\\\\\");}break;\r\n      case '\"':  {separator_replace = str8_lit(\"\\\\\\\"\");}break;\r\n    }\r\n    if(split)\r\n    {\r\n      String8 substr = str8_substr(raw, r1u64(start_split_idx, idx));\r\n      start_split_idx = idx+1;\r\n      str8_list_push(scratch.arena, &parts, substr);\r\n      if(separator_replace.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &parts, separator_replace);\r\n      }\r\n    }\r\n  }\r\n  StringJoin join = {0};\r\n  String8 result = str8_list_join(arena, &parts, &join);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: tree stringification iterator\r\n\r\ninternal EV_StringIter *\r\nev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params)\r\n{\r\n  EV_StringIter *it = push_array(arena, EV_StringIter, 1);\r\n  it->top_task = push_array(arena, EV_StringIterTask, 1);\r\n  it->top_task->eval = eval;\r\n  MemoryCopyStruct(&it->top_task->params, params);\r\n  return it;\r\n}\r\n\r\ninternal B32\r\nev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string)\r\n{\r\n  B32 result = 0;\r\n  \r\n  //- rjf: make progress on top task\r\n  MemoryZeroStruct(out_string);\r\n  B32 need_pop = 1;\r\n  B32 need_new_task = 0;\r\n  EV_StringIterTask new_task = {0};\r\n  S32 top_task_depth = 0;\r\n  if(it->top_task != 0)\r\n  {\r\n    result = 1;\r\n    \r\n    //- rjf: unpack task\r\n    U64 task_idx = it->top_task->idx;\r\n    S32 depth = top_task_depth = it->top_task->depth;\r\n    EV_StringParams *params = &it->top_task->params;\r\n    E_Eval eval = it->top_task->eval;\r\n    E_TypeKey type_key = eval.irtree.type_key;\r\n    E_TypeKind type_kind = e_type_kind_from_key(type_key);\r\n    String8 expansion_opener_symbol = str8_lit(\"{\");\r\n    String8 expansion_closer_symbol = str8_lit(\"}\");\r\n    \r\n    //- rjf: type evaluations -> display type string\r\n    if(eval.irtree.mode == E_Mode_Null && !e_type_key_match(e_type_key_zero(), eval.irtree.type_key))\r\n    {\r\n      *out_string = e_type_string_from_key(arena, type_key);\r\n    }\r\n    \r\n    //- rjf: non-type evaluations\r\n    else switch(type_kind)\r\n    {\r\n      //////////////////////////\r\n      //- rjf: default - leaf cases\r\n      //\r\n      default:\r\n      {\r\n        E_Eval value_eval = e_value_eval_from_eval(eval);\r\n        *out_string = ev_string_from_simple_typed_eval(arena, params, value_eval);\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: enums\r\n      //\r\n      case E_TypeKind_Enum:\r\n      {\r\n        switch(task_idx)\r\n        {\r\n          default:{}break;\r\n          case 0:\r\n          {\r\n            E_Type *type = e_type_from_key(type_key);\r\n            E_Eval value_eval = e_value_eval_from_eval(eval);\r\n            String8 constant_name = {0};\r\n            for(U64 val_idx = 0; val_idx < type->count; val_idx += 1)\r\n            {\r\n              if(value_eval.value.u64 == type->enum_vals[val_idx].val)\r\n              {\r\n                constant_name = type->enum_vals[val_idx].name;\r\n                break;\r\n              }\r\n            }\r\n            String8 sufficient_suffix = constant_name;\r\n            if(str8_match(sufficient_suffix, type->name, StringMatchFlag_RightSideSloppy))\r\n            {\r\n              sufficient_suffix = str8_skip(sufficient_suffix, type->name.size);\r\n              if(str8_match(sufficient_suffix, str8_lit(\"_\"), StringMatchFlag_RightSideSloppy))\r\n              {\r\n                sufficient_suffix = str8_skip(sufficient_suffix, 1);\r\n              }\r\n            }\r\n            if(sufficient_suffix.size != 0)\r\n            {\r\n              *out_string = push_str8f(arena, \"%S.%S\", type->name, sufficient_suffix);\r\n              if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)\r\n              {\r\n                need_pop = 0;\r\n              }\r\n            }\r\n            else\r\n            {\r\n              need_pop = 1;\r\n              need_new_task = 1;\r\n              new_task.params = *params;\r\n              new_task.eval = e_value_eval_from_eval(eval);\r\n              new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n            }\r\n          }break;\r\n          case 1:\r\n          {\r\n            *out_string = str8_lit(\" (\");\r\n            need_pop = 0;\r\n            need_new_task = 1;\r\n            new_task.params = *params;\r\n            new_task.eval = e_value_eval_from_eval(eval);\r\n            new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n          }break;\r\n          case 2:\r\n          {\r\n            *out_string = str8_lit(\")\");\r\n          }break;\r\n        }\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: lenses\r\n      //\r\n      case E_TypeKind_Lens:\r\n      {\r\n        if(it->top_task->redirect_to_sets_and_structs)\r\n        {\r\n          E_Type *type = e_type_from_key(type_key);\r\n          if(type->flags & E_TypeFlag_ArrayLikeExpansion)\r\n          {\r\n            expansion_opener_symbol = str8_lit(\"[\");\r\n            expansion_closer_symbol = str8_lit(\"]\");\r\n          }\r\n          goto arrays_and_sets_and_structs;\r\n        }\r\n        E_Type *type = e_type_from_key(type_key);\r\n        E_TypeKind element_type_kind = e_type_kind_from_key(e_type_key_unwrap(type->direct_type_key, E_TypeUnwrapFlag_All));\r\n        B32 lens_applied = 1;\r\n        EV_StringParams lens_params = *params;\r\n        if(0){}\r\n        else if(str8_match(type->name, str8_lit(\"bin\"), 0)) { lens_params.radix = 2; }\r\n        else if(str8_match(type->name, str8_lit(\"oct\"), 0)) { lens_params.radix = 8; }\r\n        else if(str8_match(type->name, str8_lit(\"dec\"), 0)) { lens_params.radix = 10; }\r\n        else if(str8_match(type->name, str8_lit(\"hex\"), 0)) { lens_params.radix = 16; }\r\n        else if(str8_match(type->name, str8_lit(\"digits\"), 0) && type->count >= 1)\r\n        {\r\n          E_ParentKey(eval.key)\r\n          {\r\n            E_Value value = e_value_from_expr(type->args[0]);\r\n            lens_params.min_digits = value.u64;\r\n          }\r\n        }\r\n        else if(str8_match(type->name, str8_lit(\"no_string\"), 0))\r\n        {\r\n          lens_params.flags |= EV_StringFlag_DisableStrings;\r\n        }\r\n        else if(str8_match(type->name, str8_lit(\"no_char\"), 0))\r\n        {\r\n          lens_params.flags |= EV_StringFlag_DisableChars;\r\n        }\r\n        else if(str8_match(type->name, str8_lit(\"no_addr\"), 0))\r\n        {\r\n          lens_params.flags |= EV_StringFlag_DisableAddresses;\r\n        }\r\n        else if(str8_match(type->name, str8_lit(\"array\"), 0) &&\r\n                type->count >= 1 &&\r\n                (((E_TypeKind_Char8 <= element_type_kind && element_type_kind <= E_TypeKind_UChar32) ||\r\n                  element_type_kind == E_TypeKind_S8 ||\r\n                  element_type_kind == E_TypeKind_U8)))\r\n        {\r\n          E_ParentKey(eval.key)\r\n          {\r\n            lens_params.limit_strings = 1;\r\n            lens_params.limit_strings_size = e_value_from_expr(type->args[0]).u64;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          lens_applied = 0;\r\n        }\r\n        if(lens_applied)\r\n        {\r\n          need_new_task = 1;\r\n          need_pop = 1;\r\n          new_task.params = lens_params;\r\n          new_task.eval = eval;\r\n          new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n        }\r\n        else if(type->kind != E_TypeKind_Lens || type->expand.info != 0)\r\n        {\r\n          need_new_task = 1;\r\n          need_pop = 1;\r\n          new_task.params = *params;\r\n          new_task.eval = eval;\r\n          new_task.redirect_to_sets_and_structs = 1;\r\n        }\r\n        else\r\n        {\r\n          need_new_task = 1;\r\n          need_pop = 1;\r\n          new_task.params = lens_params;\r\n          new_task.eval = eval;\r\n          new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n#if 0 // NOTE(rjf): will explicitly visualize lenses in value strings. does not seem useful for now?\r\n          switch(task_idx)\r\n          {\r\n            default:{}break;\r\n            \r\n            // rjf: step 0 -> generate lens description, then descend to same evaluation w/ direct type\r\n            case 0:\r\n            {\r\n              Temp scratch = scratch_begin(&arena, 1);\r\n              String8List strings = {0};\r\n              {\r\n                str8_list_pushf(scratch.arena, &strings, \"%S(\", type->name);\r\n                for EachIndex(idx, type->count)\r\n                {\r\n                  String8 string = e_string_from_expr(scratch.arena, type->args[idx]);\r\n                  str8_list_push(scratch.arena, &strings, string);\r\n                  if(idx+1 < type->count)\r\n                  {\r\n                    str8_list_pushf(scratch.arena, &strings, \", \");\r\n                  }\r\n                }\r\n                str8_list_pushf(scratch.arena, &strings, \") <- (\");\r\n              }\r\n              *out_string = str8_list_join(arena, &strings, 0);\r\n              need_new_task = 1;\r\n              need_pop = 0;\r\n              new_task.params = *params;\r\n              new_task.eval = eval;\r\n              new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n              scratch_end(scratch);\r\n            }break;\r\n            \r\n            // rjf: step 1 -> close\r\n            case 1:\r\n            {\r\n              *out_string = str8_lit(\")\");\r\n            }break;\r\n          }\r\n#endif\r\n        }\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: meta-expression tags\r\n      //\r\n      case E_TypeKind_MetaExpr:\r\n      {\r\n        if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)\r\n        {\r\n          switch(task_idx)\r\n          {\r\n            default:{}break;\r\n            case 0:\r\n            {\r\n              E_Type *type = e_type_from_key(type_key);\r\n              *out_string = push_str8f(arena, \"%S (\", type->name);\r\n              need_pop = 0;\r\n              need_new_task = 1;\r\n              new_task.params = *params;\r\n              new_task.eval = eval;\r\n              new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n            }break;\r\n            case 1:\r\n            {\r\n              *out_string = str8_lit(\")\");\r\n            }break;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          E_Type *type = e_type_from_key(type_key);\r\n          *out_string = type->name;\r\n        }\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: modifiers / no-ops\r\n      //\r\n      case E_TypeKind_Alias:\r\n      case E_TypeKind_Modifier:\r\n      case E_TypeKind_MetaDescription:\r\n      case E_TypeKind_MetaDisplayName:\r\n      {\r\n        need_pop = 1;\r\n        need_new_task = 1;\r\n        new_task.params = *params;\r\n        new_task.eval = eval;\r\n        new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: bitfields\r\n      //\r\n      case E_TypeKind_Bitfield:\r\n      {\r\n        need_pop = 1;\r\n        need_new_task = 1;\r\n        new_task.params = *params;\r\n        new_task.eval = e_value_eval_from_eval(eval);\r\n        new_task.eval.irtree.type_key = e_type_key_direct(eval.irtree.type_key);\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: pointers\r\n      //\r\n      case E_TypeKind_Function:\r\n      case E_TypeKind_Ptr:\r\n      case E_TypeKind_LRef:\r\n      case E_TypeKind_RRef:\r\n      case E_TypeKind_Array:\r\n      {\r\n        if(type_kind == E_TypeKind_Array && it->top_task->redirect_to_sets_and_structs)\r\n        {\r\n          expansion_opener_symbol = str8_lit(\"[\");\r\n          expansion_closer_symbol = str8_lit(\"]\");\r\n          goto arrays_and_sets_and_structs;\r\n        } \r\n        typedef struct EV_StringPtrData EV_StringPtrData;\r\n        struct EV_StringPtrData\r\n        {\r\n          E_Eval value_eval;\r\n          E_Type *type;\r\n          E_Type *direct_type;\r\n          B32 ptee_has_content;\r\n          B32 ptee_has_string;\r\n          B32 did_prefix_content;\r\n          B32 did_prefix_string;\r\n          B32 did_redirect;\r\n        };\r\n        EV_StringPtrData *ptr_data = it->top_task->user_data;\r\n        if(ptr_data == 0)\r\n        {\r\n          ptr_data = it->top_task->user_data = push_array(arena, EV_StringPtrData, 1);\r\n          ptr_data->value_eval = e_value_eval_from_eval(eval);\r\n          ptr_data->type = e_type_from_key(type_key);\r\n          ptr_data->direct_type = e_type_from_key(e_type_key_unwrap(type_key, E_TypeUnwrapFlag_All));\r\n          ptr_data->ptee_has_content = (ptr_data->value_eval.value.u64 != 0 && ptr_data->direct_type->kind != E_TypeKind_Null && ptr_data->direct_type->kind != E_TypeKind_Void);\r\n          ptr_data->ptee_has_string  = ((E_TypeKind_Char8 <= ptr_data->direct_type->kind && ptr_data->direct_type->kind <= E_TypeKind_UChar32) ||\r\n                                        ptr_data->direct_type->kind == E_TypeKind_S8 ||\r\n                                        ptr_data->direct_type->kind == E_TypeKind_U8);\r\n        }\r\n        if(ptr_data->did_redirect)\r\n        {\r\n          need_pop = 1;\r\n        }\r\n        else switch(task_idx)\r\n        {\r\n          default:{}break;\r\n          \r\n          //- rjf: step 0 -> try \"prefix content\", which we want to print before the pointer value,\r\n          // like strings or symbol names\r\n          case 0:\r\n          {\r\n            // rjf: try strings\r\n            if(!(ptr_data->type->flags & E_TypeFlag_IsNotText) &&\r\n               !ptr_data->did_prefix_content && ptr_data->ptee_has_string &&\r\n               !(params->flags & EV_StringFlag_DisableStrings) &&\r\n               (type_kind == E_TypeKind_Array ||\r\n                params->flags & EV_StringFlag_ReadOnlyDisplayRules))\r\n            {\r\n              Temp scratch = scratch_begin(&arena, 1);\r\n              \r\n              // rjf: read string data\r\n#define EV_STRING_ITER_STRING_BUFFER_CAPACITY 4096\r\n              U64 string_buffer_size = EV_STRING_ITER_STRING_BUFFER_CAPACITY;\r\n              U8 *string_buffer = push_array(scratch.arena, U8, string_buffer_size);\r\n              if(type_kind == E_TypeKind_Array && eval.irtree.mode == E_Mode_Value)\r\n              {\r\n                StaticAssert(sizeof(eval.value.u512.u8) <= EV_STRING_ITER_STRING_BUFFER_CAPACITY, ev_string_iter_value_string_buffer_size_check);\r\n                MemoryCopy(string_buffer, eval.value.u512.u8, sizeof(eval.value.u512.u8));\r\n              }\r\n              else\r\n              {\r\n                U64 string_memory_addr = ptr_data->value_eval.value.u64;\r\n                for(U64 try_size = string_buffer_size; try_size >= 16; try_size /= 2)\r\n                {\r\n                  B32 read_good = e_space_read(eval.space, string_buffer, r1u64(string_memory_addr, string_memory_addr+try_size));\r\n                  if(read_good)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n                string_buffer[string_buffer_size-1] = 0;\r\n              }\r\n              \r\n              // rjf: check element size - if non-U8, assume UTF-16 or UTF-32 based on type, and convert\r\n              U64 element_size = ptr_data->direct_type->byte_size;\r\n              String8 string = {0};\r\n              switch(element_size)\r\n              {\r\n                default:{string = str8_cstring((char *)string_buffer);}break;\r\n                case 2: {string = str8_from_16(scratch.arena, str16_cstring((U16 *)string_buffer));}break;\r\n                case 4: {string = str8_from_32(scratch.arena, str32_cstring((U32 *)string_buffer));}break;\r\n              }\r\n              \r\n              // rjf: apply string size limitation\r\n              if(params->limit_strings)\r\n              {\r\n                string = str8_prefix(string, params->limit_strings_size);\r\n              }\r\n              else if(type_kind == E_TypeKind_Array && ptr_data->type->count != 0)\r\n              {\r\n                string = str8_prefix(string, ptr_data->type->count);\r\n              }\r\n              \r\n              // rjf: escape and quote\r\n              B32 string__is_escaped_and_quoted = (!(params->flags & EV_StringFlag_DisableStringQuotes) || depth > 0);\r\n              String8 string__escaped_and_quoted = string;\r\n              if(string__is_escaped_and_quoted)\r\n              {\r\n                String8 string_escaped = ev_escaped_from_raw_string(scratch.arena, string);\r\n                string__escaped_and_quoted = push_str8f(scratch.arena, \"\\\"%S\\\"\", string_escaped);\r\n              }\r\n              \r\n              // rjf: report\r\n              *out_string = push_str8_copy(arena, string__escaped_and_quoted);\r\n              ptr_data->did_prefix_content = 1;\r\n              ptr_data->did_prefix_string = 1;\r\n              \r\n              scratch_end(scratch);\r\n            }\r\n            \r\n            // rjf: try symbols\r\n            if(!ptr_data->did_prefix_content)\r\n            {\r\n              U64 vaddr = ptr_data->value_eval.value.u64;\r\n              E_Module *module = &e_module_nil;\r\n              for EachIndex(idx, e_base_ctx->modules_count)\r\n              {\r\n                if(contains_1u64(e_base_ctx->modules[idx].vaddr_range, vaddr))\r\n                {\r\n                  module = &e_base_ctx->modules[idx];\r\n                  break;\r\n                }\r\n              }\r\n              E_DbgInfo *dbg_info = e_dbg_info_from_module(module);\r\n              if(dbg_info == &e_dbg_info_nil)\r\n              {\r\n                dbg_info = e_dbg_info_from_type_key(type_key);\r\n              }\r\n              U32 dbg_info_num = 0;\r\n              if(dbg_info != &e_dbg_info_nil)\r\n              {\r\n                dbg_info_num = (U32)(dbg_info - e_base_ctx->dbg_infos) + 1;\r\n              }\r\n              RDI_Parsed *rdi = dbg_info->rdi;\r\n              U64 voff = vaddr - module->vaddr_range.min;\r\n              B32 good_symbol_match = 0;\r\n              \r\n              // NOTE(rjf): read-only -> generate non-parseable things, like type-info / inlines\r\n              if(params->flags & EV_StringFlag_ReadOnlyDisplayRules)\r\n              {\r\n                // rjf: voff -> scope\r\n                U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff);\r\n                \r\n                // rjf: scope -> # of max possible inline depth\r\n                U64 inline_site_count = 0;\r\n                for(U64 s_idx = scope_idx, s_idx_next = 0; s_idx != 0; s_idx = s_idx_next)\r\n                {\r\n                  RDI_Scope *s = rdi_element_from_name_idx(rdi, Scopes, s_idx);\r\n                  s_idx_next = s->parent_scope_idx;\r\n                  if(s->inline_site_idx != 0)\r\n                  {\r\n                    inline_site_count += 1;\r\n                  }\r\n                  else\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n                \r\n                // rjf: depth in [1, max]? -> form name from inline site\r\n                if(0 < ptr_data->type->depth && ptr_data->type->depth <= inline_site_count)\r\n                {\r\n                  RDI_InlineSite *inline_site = 0;\r\n                  U64 s_inline_depth = inline_site_count;\r\n                  for(U64 s_idx = scope_idx, s_idx_next = 0; s_idx != 0; s_idx = s_idx_next)\r\n                  {\r\n                    RDI_Scope *s = rdi_element_from_name_idx(rdi, Scopes, s_idx);\r\n                    s_idx_next = s->parent_scope_idx;\r\n                    if(s_inline_depth == ptr_data->type->depth)\r\n                    {\r\n                      inline_site = rdi_element_from_name_idx(rdi, InlineSites, s->inline_site_idx);\r\n                      break;\r\n                    }\r\n                    s_inline_depth -= 1;\r\n                    if(s_inline_depth == 0)\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                  if(inline_site != 0)\r\n                  {\r\n                    RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, inline_site->type_idx);\r\n                    E_TypeKey type = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), inline_site->type_idx, dbg_info_num);\r\n                    String8 name = {0};\r\n                    name.str = rdi_string_from_idx(rdi, inline_site->name_string_idx, &name.size);\r\n                    if(inline_site->type_idx != 0)\r\n                    {\r\n                      Temp scratch = scratch_begin(&arena, 1);\r\n                      String8List list = {0};\r\n                      str8_list_pushf(scratch.arena, &list, \"[inlined] \");\r\n                      e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);\r\n                      str8_list_push(scratch.arena, &list, name);\r\n                      e_type_rhs_string_from_key(scratch.arena, type, &list, 0);\r\n                      *out_string = str8_list_join(arena, &list, 0);\r\n                      scratch_end(scratch);\r\n                    }\r\n                    else\r\n                    {\r\n                      *out_string = push_str8_copy(arena, name);\r\n                    }\r\n                    good_symbol_match = (name.size != 0);\r\n                  }\r\n                }\r\n                \r\n                // rjf: depth == 0 or depth >= max? -> form name from scope procedure\r\n                else\r\n                {\r\n                  Temp scratch = scratch_begin(&arena, 1);\r\n                  RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, scope_idx);\r\n                  U64 proc_idx = scope->proc_idx;\r\n                  RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, proc_idx);\r\n                  RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, procedure->type_idx);\r\n                  E_TypeKey type = e_type_key_ext(e_type_kind_from_rdi(type_node->kind), procedure->type_idx, dbg_info_num);\r\n                  String8 name = {0};\r\n                  name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size);\r\n                  if(procedure->type_idx != 0)\r\n                  {\r\n                    String8List list = {0};\r\n                    e_type_lhs_string_from_key(scratch.arena, type, &list, 0, 0);\r\n                    str8_list_push(scratch.arena, &list, name);\r\n                    e_type_rhs_string_from_key(scratch.arena, type, &list, 0);\r\n                    *out_string = str8_list_join(arena, &list, 0);\r\n                  }\r\n                  else\r\n                  {\r\n                    *out_string = push_str8_copy(arena, name);\r\n                  }\r\n                  \r\n                  good_symbol_match = (out_string->size != 0);\r\n                  scratch_end(scratch);\r\n                }\r\n                \r\n                // rjf: if we have a function type, but we did not generate any name, then just put a ???\r\n                if(out_string->size == 0 && e_type_kind_from_key(ptr_data->type->direct_type_key) == E_TypeKind_Function)\r\n                {\r\n                  *out_string = str8_lit(\"???\");\r\n                  good_symbol_match = 1;\r\n                }\r\n              }\r\n              \r\n              // NOTE(rjf): non-read-only -> only generate thing which can be parsed, so just procedure name\r\n              else\r\n              {\r\n                // rjf: voff -> scope\r\n                U64 scope_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff);\r\n                RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);\r\n                \r\n                // rjf: scope -> procedure / string\r\n                RDI_Procedure *procedure = rdi_procedure_from_scope(rdi, scope);\r\n                String8 procedure_name = {0};\r\n                procedure_name.str = rdi_name_from_procedure(rdi, procedure, &procedure_name.size);\r\n                \r\n                *out_string = procedure_name;\r\n                good_symbol_match = (procedure_name.size != 0);\r\n              }\r\n              \r\n              ptr_data->did_prefix_content = good_symbol_match;\r\n            }\r\n            \r\n            // rjf: if this is an array, and we do not have a prefix, then we need to\r\n            // generate a new task which redirects array types -> sets and structs.\r\n            if(type_kind == E_TypeKind_Array && !ptr_data->did_prefix_content)\r\n            {\r\n              need_new_task = 1;\r\n              need_pop = 0;\r\n              new_task.params = *params;\r\n              new_task.eval = eval;\r\n              new_task.redirect_to_sets_and_structs = 1;\r\n              ptr_data->did_redirect = 1;\r\n            }\r\n            \r\n            // rjf: if this is an array, and we *did* prefix content, then we are\r\n            // just done.\r\n            else if(type_kind == E_TypeKind_Array && ptr_data->did_prefix_content)\r\n            {\r\n              // NOTE(rjf): no-op, task is done.\r\n            }\r\n            \r\n            // rjf: otherwise, keep going on this task\r\n            else\r\n            {\r\n              need_pop = 0;\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: step 1 -> do pointer value + descend if needed\r\n          case 1:\r\n          {\r\n            Temp scratch = scratch_begin(&arena, 1);\r\n            String8 ptr_value_string = str8_from_u64(scratch.arena, ptr_data->value_eval.value.u64, 16, 0, 0);\r\n            //\r\n            // NOTE(rjf): currently, we are not using the string-generation radix parameter when\r\n            // generating a pointer value - it is weird to want to change pointer value visualization\r\n            // to anything other than hex, so it is just not supported right now...\r\n            //\r\n            \r\n            // rjf: [read only] if we did prefix content, do a parenthesized pointer value\r\n            if(!(params->flags & EV_StringFlag_DisableAddresses) && params->flags & EV_StringFlag_ReadOnlyDisplayRules &&\r\n               ptr_data->did_prefix_content)\r\n            {\r\n              *out_string = push_str8f(arena, \" (%S)\", ptr_value_string);\r\n            }\r\n            \r\n            // rjf: [read only] if we did *not* do any prefix content, but we have content,\r\n            // do \"<pointer value> -> \" then descend\r\n            else if(params->flags & EV_StringFlag_ReadOnlyDisplayRules && !ptr_data->did_prefix_content && ptr_data->ptee_has_content)\r\n            {\r\n              if(!(params->flags & EV_StringFlag_DisableAddresses))\r\n              {\r\n                *out_string = push_str8f(arena, \"%S -> \", ptr_value_string);\r\n              }\r\n              \r\n              // rjf: single-length pointers -> just gen new task for deref'd expr\r\n              if(ptr_data->type->count == 1)\r\n              {\r\n                E_Eval deref_eval = e_eval_wrapf(eval, \"*$\");\r\n                need_new_task = 1;\r\n                need_pop = 0;\r\n                new_task.params = *params;\r\n                new_task.eval = deref_eval;\r\n              }\r\n              \r\n              // rjf: multi-length pointers -> expand like an array (try to dedup with array case)\r\n              else\r\n              {\r\n                // TODO(rjf)\r\n              }\r\n            }\r\n            \r\n            // rjf: [writeable, catchall] if we did *not* do any prefix content, do \"<pointer value>\"\r\n            else if(!ptr_data->did_prefix_content)\r\n            {\r\n              *out_string = push_str8_copy(arena, ptr_value_string);\r\n            }\r\n            \r\n            scratch_end(scratch);\r\n          }break;\r\n        }\r\n      }break;\r\n      \r\n      //////////////////////////\r\n      //- rjf: non-string-arrays/structs, sets\r\n      //\r\n      case E_TypeKind_Struct:\r\n      case E_TypeKind_Union:\r\n      case E_TypeKind_Class:\r\n      case E_TypeKind_IncompleteStruct:\r\n      case E_TypeKind_IncompleteUnion:\r\n      case E_TypeKind_IncompleteClass:\r\n      case E_TypeKind_Set:\r\n      arrays_and_sets_and_structs:\r\n      {\r\n        typedef struct EV_ExpandedTypeData EV_ExpandedTypeData;\r\n        struct EV_ExpandedTypeData\r\n        {\r\n          E_Type *type;\r\n          E_TypeExpandRule *expand_rule;\r\n          E_TypeExpandInfo expand_info;\r\n        };\r\n        EV_ExpandedTypeData *expand_data = (EV_ExpandedTypeData *)it->top_task->user_data;\r\n        if(expand_data == 0)\r\n        {\r\n          expand_data = it->top_task->user_data = push_array(arena, EV_ExpandedTypeData, 1);\r\n          expand_data->type = e_type_from_key(type_key);\r\n        }\r\n        switch(task_idx)\r\n        {\r\n          //- rjf: step 0 -> generate opener symbol\r\n          case 0:\r\n          {\r\n            if(expand_data->type->flags & E_TypeFlag_StubSingleLineExpansion)\r\n            {\r\n              *out_string = push_str8f(arena, \"%S...%S\", expansion_opener_symbol, expansion_closer_symbol);\r\n            }\r\n            else\r\n            {\r\n              need_pop = 0;\r\n              expand_data->expand_rule = e_expand_rule_from_type_key(type_key);\r\n              expand_data->expand_info = expand_data->expand_rule->info(arena, eval, params->filter);\r\n              *out_string = expansion_opener_symbol;\r\n            }\r\n          }break;\r\n          \r\n          default:\r\n          //- rjf: last step -> generate closer symbol\r\n          if(task_idx == expand_data->expand_info.expr_count+1)\r\n          {\r\n            *out_string = expansion_closer_symbol;\r\n          }\r\n          \r\n          //- rjf: middle step -> generate new task for next thing in expansion\r\n          else\r\n          {\r\n            E_Eval next_eval = e_eval_nil;\r\n            expand_data->expand_rule->range(arena, expand_data->expand_info.user_data, eval, params->filter, r1u64(task_idx-1, task_idx), &next_eval);\r\n            if(next_eval.expr != &e_expr_nil)\r\n            {\r\n              need_new_task = 1;\r\n              need_pop = 0;\r\n              new_task.params = *params;\r\n              new_task.eval = next_eval;\r\n              if(task_idx > 1)\r\n              {\r\n                *out_string = str8_lit(\", \");\r\n              }\r\n            }\r\n            else\r\n            {\r\n              need_pop = 0;\r\n            }\r\n          }break;\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  //- rjf: bump task counter\r\n  if(it->top_task != 0)\r\n  {\r\n    it->top_task->idx += 1;\r\n  }\r\n  \r\n  //- rjf: if result is good, and we want to pop? -> pop\r\n  if(result && need_pop)\r\n  {\r\n    EV_StringIterTask *task = it->top_task;\r\n    SLLStackPop(it->top_task);\r\n    SLLStackPush(it->free_task, task);\r\n  }\r\n  \r\n  //- rjf: if result is good, and we have a new task? -> push\r\n  if(result && need_new_task)\r\n  {\r\n    EV_StringIterTask *new_t = it->free_task;\r\n    if(new_t != 0)\r\n    {\r\n      SLLStackPop(it->free_task);\r\n    }\r\n    else\r\n    {\r\n      new_t = push_array(arena, EV_StringIterTask, 1);\r\n    }\r\n    MemoryCopyStruct(new_t, &new_task);\r\n    new_t->depth = top_task_depth + 1*(!need_pop);\r\n    SLLStackPush(it->top_task, new_t);\r\n    new_t->idx = 0;\r\n  }\r\n  \r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/eval_visualization/eval_visualization_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_VISUALIZATION_CORE_H\r\n#define EVAL_VISUALIZATION_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Type (Uniquely Refers To One Tree Node)\r\n\r\ntypedef struct EV_Key EV_Key;\r\nstruct EV_Key\r\n{\r\n  U64 parent_hash;\r\n  U64 child_id;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Visualization State Type\r\n\r\n//- rjf: expand hash table & tree\r\n\r\ntypedef struct EV_ExpandNode EV_ExpandNode;\r\nstruct EV_ExpandNode\r\n{\r\n  EV_ExpandNode *hash_next;\r\n  EV_ExpandNode *hash_prev;\r\n  EV_ExpandNode *first;\r\n  EV_ExpandNode *last;\r\n  EV_ExpandNode *next;\r\n  EV_ExpandNode *prev;\r\n  EV_ExpandNode *parent;\r\n  EV_Key key;\r\n  B32 expanded;\r\n};\r\n\r\ntypedef struct EV_ExpandSlot EV_ExpandSlot;\r\nstruct EV_ExpandSlot\r\n{\r\n  EV_ExpandNode *first;\r\n  EV_ExpandNode *last;\r\n};\r\n\r\n//- rjf: hash table for view rules\r\n\r\ntypedef struct EV_KeyViewRuleNode EV_KeyViewRuleNode;\r\nstruct EV_KeyViewRuleNode\r\n{\r\n  EV_KeyViewRuleNode *hash_next;\r\n  EV_KeyViewRuleNode *hash_prev;\r\n  EV_Key key;\r\n  U8 *buffer;\r\n  U64 buffer_cap;\r\n  U64 buffer_string_size;\r\n};\r\n\r\ntypedef struct EV_KeyViewRuleSlot EV_KeyViewRuleSlot;\r\nstruct EV_KeyViewRuleSlot\r\n{\r\n  EV_KeyViewRuleNode *first;\r\n  EV_KeyViewRuleNode *last;\r\n};\r\n\r\n//- rjf: view state bundle\r\n\r\ntypedef struct EV_View EV_View;\r\nstruct EV_View\r\n{\r\n  Arena *arena;\r\n  EV_ExpandSlot *expand_slots;\r\n  U64 expand_slots_count;\r\n  EV_ExpandNode *free_expand_node;\r\n  EV_KeyViewRuleSlot *key_view_rule_slots;\r\n  U64 key_view_rule_slots_count;\r\n  EV_KeyViewRuleNode *free_key_view_rule_node;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Expansion Rule Types\r\n\r\ntypedef struct EV_ExpandInfo EV_ExpandInfo;\r\nstruct EV_ExpandInfo\r\n{\r\n  void *user_data;\r\n  U64 row_count;\r\n  B32 single_item; // all rows form a single \"item\" - a singular, but large, row\r\n  B32 add_new_row; // also supports an 'add new row', as the final row, within `row_count`\r\n  B32 rows_default_expanded;\r\n};\r\n\r\n#define EV_EXPAND_RULE_INFO_FUNCTION_SIG(name) EV_ExpandInfo name(Arena *arena, EV_View *view, String8 filter, E_Expr *expr)\r\n#define EV_EXPAND_RULE_INFO_FUNCTION_NAME(name) ev_expand_rule_info__##name\r\n#define EV_EXPAND_RULE_INFO_FUNCTION_DEF(name) internal EV_EXPAND_RULE_INFO_FUNCTION_SIG(EV_EXPAND_RULE_INFO_FUNCTION_NAME(name))\r\ntypedef EV_EXPAND_RULE_INFO_FUNCTION_SIG(EV_ExpandRuleInfoHookFunctionType);\r\n\r\ntypedef struct EV_ExpandRule EV_ExpandRule;\r\nstruct EV_ExpandRule\r\n{\r\n  String8 string;\r\n  EV_ExpandRuleInfoHookFunctionType *info;\r\n};\r\n\r\ntypedef struct EV_ExpandRuleNode EV_ExpandRuleNode;\r\nstruct EV_ExpandRuleNode\r\n{\r\n  EV_ExpandRuleNode *next;\r\n  EV_ExpandRule v;\r\n};\r\n\r\ntypedef struct EV_ExpandRuleSlot EV_ExpandRuleSlot;\r\nstruct EV_ExpandRuleSlot\r\n{\r\n  EV_ExpandRuleNode *first;\r\n  EV_ExpandRuleNode *last;\r\n};\r\n\r\ntypedef struct EV_ExpandRuleTable EV_ExpandRuleTable;\r\nstruct EV_ExpandRuleTable\r\n{\r\n  EV_ExpandRuleSlot *slots;\r\n  U64 slots_count;\r\n};\r\n\r\ntypedef struct EV_ExpandRuleTagPair EV_ExpandRuleTagPair;\r\nstruct EV_ExpandRuleTagPair\r\n{\r\n  EV_ExpandRule *rule;\r\n  E_Expr *tag;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Blocks\r\n\r\ntypedef struct EV_Block EV_Block;\r\nstruct EV_Block\r\n{\r\n  // rjf: links\r\n  EV_Block *first;\r\n  EV_Block *last;\r\n  EV_Block *next;\r\n  EV_Block *prev;\r\n  EV_Block *parent;\r\n  \r\n  // rjf: key\r\n  EV_Key key;\r\n  \r\n  // rjf: split index, relative to parent's space\r\n  U64 split_relative_idx;\r\n  \r\n  // rjf: evaluation info\r\n  String8 string;\r\n  E_Eval eval;\r\n  String8 filter;\r\n  E_TypeExpandInfo type_expand_info;\r\n  E_TypeExpandRule *type_expand_rule;\r\n  EV_ExpandInfo viz_expand_info;\r\n  EV_ExpandRule *viz_expand_rule;\r\n  \r\n  // rjf: expansion info\r\n  U64 row_count;\r\n};\r\n\r\ntypedef struct EV_BlockTree EV_BlockTree;\r\nstruct EV_BlockTree\r\n{\r\n  EV_Block *root;\r\n  U64 total_row_count;\r\n  U64 total_item_count;\r\n};\r\n\r\ntypedef struct EV_BlockRange EV_BlockRange;\r\nstruct EV_BlockRange\r\n{\r\n  EV_Block *block;\r\n  Rng1U64 range;\r\n};\r\n\r\ntypedef struct EV_BlockRangeNode EV_BlockRangeNode;\r\nstruct EV_BlockRangeNode\r\n{\r\n  EV_BlockRangeNode *next;\r\n  EV_BlockRange v;\r\n};\r\n\r\ntypedef struct EV_BlockRangeList EV_BlockRangeList;\r\nstruct EV_BlockRangeList\r\n{\r\n  EV_BlockRangeNode *first;\r\n  EV_BlockRangeNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Rows\r\n\r\ntypedef struct EV_Row EV_Row;\r\nstruct EV_Row\r\n{\r\n  EV_Block *block;\r\n  EV_Key key;\r\n  U64 visual_size;\r\n  String8 edit_string;\r\n  E_Eval eval;\r\n};\r\n\r\ntypedef struct EV_WindowedRowNode EV_WindowedRowNode;\r\nstruct EV_WindowedRowNode\r\n{\r\n  EV_WindowedRowNode *next;\r\n  U64 visual_size_skipped;\r\n  U64 visual_size_chopped;\r\n  EV_Row row;\r\n};\r\n\r\ntypedef struct EV_WindowedRowList EV_WindowedRowList;\r\nstruct EV_WindowedRowList\r\n{\r\n  EV_WindowedRowNode *first;\r\n  EV_WindowedRowNode *last;\r\n  U64 count;\r\n  U64 count_before_visual;\r\n  U64 count_before_semantic;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Generation Types\r\n\r\ntypedef U32 EV_StringFlags;\r\nenum\r\n{\r\n  EV_StringFlag_ReadOnlyDisplayRules = (1<<0),\r\n  EV_StringFlag_PrettyNames          = (1<<1),\r\n  EV_StringFlag_DisableAddresses     = (1<<2),\r\n  EV_StringFlag_DisableStrings       = (1<<3),\r\n  EV_StringFlag_DisableChars         = (1<<4),\r\n  EV_StringFlag_DisableStringQuotes  = (1<<5),\r\n};\r\n\r\ntypedef struct EV_StringParams EV_StringParams;\r\nstruct EV_StringParams\r\n{\r\n  EV_StringFlags flags;\r\n  U32 radix;\r\n  U32 min_digits;\r\n  U8 digit_group_separator;\r\n  String8 filter;\r\n  B32 limit_strings;\r\n  U64 limit_strings_size;\r\n};\r\n\r\ntypedef struct EV_StringIterTask EV_StringIterTask;\r\nstruct EV_StringIterTask\r\n{\r\n  EV_StringIterTask *next;\r\n  EV_StringParams params;\r\n  E_Eval eval;\r\n  U64 idx;\r\n  S32 depth;\r\n  B32 redirect_to_sets_and_structs;\r\n  void *user_data;\r\n};\r\n\r\ntypedef struct EV_StringIter EV_StringIter;\r\nstruct EV_StringIter\r\n{\r\n  EV_StringIterTask *top_task;\r\n  EV_StringIterTask *free_task;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Nil/Identity View Rule Hooks\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(nil);\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal read_only EV_ExpandRule ev_nil_expand_rule =\r\n{\r\n  {0},\r\n  EV_EXPAND_RULE_INFO_FUNCTION_NAME(nil),\r\n};\r\nthread_static EV_ExpandRuleTable *ev_view_rule_info_table = 0;\r\nglobal read_only EV_Block ev_nil_block =\r\n{\r\n  &ev_nil_block,\r\n  &ev_nil_block,\r\n  &ev_nil_block,\r\n  &ev_nil_block,\r\n  &ev_nil_block,\r\n  {0},\r\n  0,\r\n  {0},\r\n  {{0}, {0}, {0}, &e_expr_nil, &e_irnode_nil},\r\n  {0},\r\n  {0},\r\n  &e_type_expand_rule__default,\r\n  {0},\r\n  &ev_nil_expand_rule,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Key Functions\r\n\r\ninternal EV_Key ev_key_make(U64 parent_hash, U64 child_id);\r\ninternal EV_Key ev_key_zero(void);\r\ninternal EV_Key ev_key_root(void);\r\ninternal B32 ev_key_match(EV_Key a, EV_Key b);\r\ninternal U64 ev_hash_from_seed_string(U64 seed, String8 string);\r\ninternal U64 ev_hash_from_key(EV_Key key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Helpers\r\n\r\n//- rjf: type info -> expandability/editablity\r\ninternal E_TypeKey ev_expansion_type_from_key(E_TypeKey type_key);\r\ninternal B32 ev_type_key_and_mode_is_expandable(E_TypeKey type_key, E_Mode mode);\r\ninternal B32 ev_type_key_is_editable(E_TypeKey type_key);\r\n\r\n////////////////////////////////\r\n//~ rjf: View Functions\r\n\r\n//- rjf: creation / deletion\r\ninternal EV_View *ev_view_alloc(void);\r\ninternal void ev_view_release(EV_View *view);\r\n\r\n//- rjf: lookups / mutations\r\ninternal EV_ExpandNode *ev_expand_node_from_key(EV_View *view, EV_Key key);\r\ninternal B32 ev_expansion_from_key(EV_View *view, EV_Key key);\r\ninternal String8 ev_view_rule_from_key(EV_View *view, EV_Key key);\r\ninternal void ev_key_set_expansion(EV_View *view, EV_Key parent_key, EV_Key key, B32 expanded);\r\ninternal void ev_key_set_view_rule(EV_View *view, EV_Key key, String8 view_rule_string);\r\n\r\n////////////////////////////////\r\n//~ rjf: View Rule Info Table Building / Selection / Lookups\r\n\r\ninternal void ev_expand_rule_table_push(Arena *arena, EV_ExpandRuleTable *table, EV_ExpandRule *info);\r\n#define ev_expand_rule_table_push_new(arena, table, ...) ev_expand_rule_table_push((arena), (table), &(EV_ExpandRule){__VA_ARGS__})\r\ninternal void ev_select_expand_rule_table(EV_ExpandRuleTable *table);\r\ninternal EV_ExpandRule *ev_expand_rule_from_string(String8 string);\r\ninternal EV_ExpandRule *ev_expand_rule_from_type_key(E_TypeKey type_key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Block Building\r\n\r\ninternal EV_BlockTree ev_block_tree_from_eval(Arena *arena, EV_View *view, String8 filter, E_Eval root_eval);\r\ninternal U64 ev_depth_from_block(EV_Block *block);\r\n\r\n////////////////////////////////\r\n//~ rjf: Block Coordinate Spaces\r\n\r\ninternal U64 ev_block_id_from_num(EV_Block *block, U64 num);\r\ninternal U64 ev_block_num_from_id(EV_Block *block, U64 id);\r\ninternal EV_BlockRangeList ev_block_range_list_from_tree(Arena *arena, EV_BlockTree *block_tree);\r\ninternal EV_BlockRange ev_block_range_from_num(EV_BlockRangeList *block_ranges, U64 num);\r\ninternal EV_Key ev_key_from_num(EV_BlockRangeList *block_ranges, U64 num);\r\ninternal U64    ev_num_from_key(EV_BlockRangeList *block_ranges, EV_Key key);\r\ninternal U64    ev_vnum_from_num(EV_BlockRangeList *block_ranges, U64 num);\r\ninternal U64    ev_num_from_vnum(EV_BlockRangeList *block_ranges, U64 vidx);\r\n\r\n////////////////////////////////\r\n//~ rjf: Row Building\r\n\r\ninternal EV_WindowedRowList ev_windowed_row_list_from_block_range_list(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 vnum_range);\r\ninternal EV_Row *ev_row_from_num(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, U64 num);\r\ninternal EV_WindowedRowList ev_rows_from_num_range(Arena *arena, EV_View *view, EV_BlockRangeList *block_ranges, Rng1U64 num_range);\r\ninternal B32 ev_eval_is_expandable(E_Eval eval);\r\ninternal B32 ev_row_is_expandable(EV_Row *row);\r\ninternal B32 ev_row_is_editable(EV_Row *row);\r\n\r\n////////////////////////////////\r\n//~ rjf: Stringification\r\n\r\n//- rjf: leaf stringification\r\ninternal String8 ev_string_from_ascii_value(Arena *arena, U8 val);\r\ninternal String8 ev_string_from_hresult_facility_code(U32 code);\r\ninternal String8 ev_string_from_hresult_code(U32 code);\r\ninternal String8 ev_string_from_simple_typed_eval(Arena *arena, EV_StringParams *params, E_Eval eval);\r\ninternal String8 ev_escaped_from_raw_string(Arena *arena, String8 raw);\r\n\r\n//- rjf: tree stringification iterator\r\ninternal EV_StringIter *ev_string_iter_begin(Arena *arena, E_Eval eval, EV_StringParams *params);\r\ninternal B32 ev_string_iter_next(Arena *arena, EV_StringIter *it, String8 *out_string);\r\n\r\n#endif // EVAL_VISUALIZATION_CORE_H\r\n"
  },
  {
    "path": "src/eval_visualization/eval_visualization_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"eval_visualization_core.c\"\r\n"
  },
  {
    "path": "src/eval_visualization/eval_visualization_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef EVAL_VISUALIZATION_INC_H\r\n#define EVAL_VISUALIZATION_INC_H\r\n\r\n#include \"eval_visualization_core.h\"\r\n\r\n#endif // EVAL_VISUALIZATION_INC_H\r\n"
  },
  {
    "path": "src/file_stream/file_stream.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xfffa00ff\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level API\r\n\r\ninternal void\r\nfs_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  fs_shared = push_array(arena, FS_Shared, 1);\r\n  fs_shared->arena = arena;\r\n  fs_shared->change_gen = 1;\r\n  fs_shared->slots_count = 1024;\r\n  fs_shared->slots = push_array(arena, FS_Slot, fs_shared->slots_count);\r\n  fs_shared->stripes = stripe_array_alloc(arena);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Change Generation\r\n\r\ninternal U64\r\nfs_change_gen(void)\r\n{\r\n  return ins_atomic_u64_eval(&fs_shared->change_gen);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Interaction\r\n\r\ninternal AC_Artifact\r\nfs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: unpack key\r\n  String8 path = {0};\r\n  Rng1U64 range = {0};\r\n  {\r\n    U64 key_read_off = 0;\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &path.size);\r\n    path.str = push_array(scratch.arena, U8, path.size);\r\n    key_read_off += str8_deserial_read(key, key_read_off, path.str, path.size, 1);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &range);\r\n  }\r\n  \r\n  //- rjf: measure file properties *before* read\r\n  B32 file_is_good = 0;\r\n  FileProperties pre_props = {0};\r\n  if(lane_idx() == 0)\r\n  {\r\n    pre_props = os_properties_from_file_path(path);\r\n    file_is_good = (pre_props.modified != 0);\r\n  }\r\n  lane_sync_u64(&file_is_good, 0);\r\n  \r\n  //- rjf: setup output data\r\n  Arena *data_arena = 0;\r\n  U64 data_buffer_size = 0;\r\n  U8 *data_buffer = 0;\r\n  if(file_is_good)\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 range_size = dim_1u64(range);\r\n      U64 read_size = Min(pre_props.size - range.min, range_size);\r\n      U64 data_arena_size = read_size+ARENA_HEADER_SIZE;\r\n      data_arena_size += KB(4)-1;\r\n      data_arena_size -= data_arena_size%KB(4);\r\n      data_arena = arena_alloc(.reserve_size = data_arena_size, .commit_size = data_arena_size);\r\n      data_buffer_size = read_size;\r\n      data_buffer = push_array_no_zero(data_arena, U8, data_buffer_size);\r\n    }\r\n    lane_sync_u64(&data_buffer, 0);\r\n    lane_sync_u64(&data_buffer_size, 0);\r\n  }\r\n  \r\n  //- rjf: open file\r\n  OS_Handle file = {0};\r\n  if(file_is_good)\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite, path);\r\n    }\r\n    lane_sync_u64(&file, 0);\r\n  }\r\n  B32 file_handle_is_valid = !os_handle_match(os_handle_zero(), file);\r\n  \r\n  //- rjf: do read\r\n  U64 total_bytes_read = 0;\r\n  if(file_handle_is_valid)\r\n  {\r\n    U64 *total_bytes_read_ptr = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      total_bytes_read_ptr = &total_bytes_read;\r\n    }\r\n    lane_sync_u64(&total_bytes_read_ptr, 0);\r\n    ProfScope(\"read \\\"%.*s\\\" [0x%I64x, 0x%I64x)\", str8_varg(path), range.min, range.max)\r\n    {\r\n      Rng1U64 lane_read_range = lane_range(data_buffer_size);\r\n      U64 bytes_read = os_file_read(file, shift_1u64(lane_read_range, range.min), data_buffer + lane_read_range.min);\r\n      ins_atomic_u64_add_eval(total_bytes_read_ptr, bytes_read);\r\n    }\r\n    lane_sync();\r\n    lane_sync_u64(&total_bytes_read, 0);\r\n  }\r\n  \r\n  //- rjf: close file\r\n  if(file_handle_is_valid)\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      os_file_close(file);\r\n    }\r\n  }\r\n  \r\n  //- rjf: measure file properties *after* read\r\n  FileProperties post_props = {0};\r\n  if(lane_idx() == 0)\r\n  {\r\n    post_props = os_properties_from_file_path(path);\r\n  }\r\n  \r\n  //- rjf: form content key\r\n  C_Key content_key = {0};\r\n  {\r\n    content_key.id.u128[0] = u128_hash_from_str8(key);\r\n  }\r\n  \r\n  //- rjf: abort if modification timestamps or sizes differ - we did not successfully read the file;\r\n  //       otherwise submit data\r\n  B32 read_good = 0;\r\n  if(file_is_good)\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      read_good = (pre_props.modified == post_props.modified &&\r\n                   pre_props.size == post_props.size &&\r\n                   data_buffer_size == total_bytes_read &&\r\n                   (file_handle_is_valid || pre_props.flags & FilePropertyFlag_IsFolder));\r\n      if(!read_good)\r\n      {\r\n        retry_out[0] = 1;\r\n        ProfScope(\"abort\")\r\n        {\r\n          arena_release(data_arena);\r\n          MemoryZeroStruct(&content_key);\r\n        }\r\n      }\r\n      else\r\n      {\r\n        ProfScope(\"submit\")\r\n        {\r\n          c_submit_data(content_key, &data_arena, str8(data_buffer, data_buffer_size));\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n  }\r\n  \r\n  //- rjf: if the read was good, record this path's timestamp in this layer's path info cache\r\n  U64 path_hash = u64_hash_from_str8(path);\r\n  if(lane_idx() == 0 && read_good)\r\n  {\r\n    U64 slot_idx = path_hash%fs_shared->slots_count;\r\n    FS_Slot *slot = &fs_shared->slots[slot_idx];\r\n    Stripe *stripe = stripe_from_slot_idx(&fs_shared->stripes, slot_idx);\r\n    RWMutexScope(stripe->rw_mutex, 1)\r\n    {\r\n      FS_Node *node = 0;\r\n      for(FS_Node *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        if(str8_match(n->path, path, 0))\r\n        {\r\n          node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(node == 0)\r\n      {\r\n        node = stripe->free;\r\n        if(node)\r\n        {\r\n          stripe->free = node->next;\r\n        }\r\n        else\r\n        {\r\n          node = push_array_no_zero(stripe->arena, FS_Node, 1);\r\n        }\r\n        MemoryZeroStruct(node);\r\n        node->path = str8_copy(stripe->arena, path);\r\n        SLLQueuePush(slot->first, slot->last, node);\r\n      }\r\n      node->last_modified_timestamp = pre_props.modified;\r\n      node->size = pre_props.size;\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //- rjf: bundle content key as artifact\r\n  AC_Artifact artifact = {0};\r\n  StaticAssert(sizeof(content_key) == sizeof(artifact), artifact_key_size_check);\r\n  MemoryCopyStruct(&artifact, &content_key);\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\nfs_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  C_Key key = {0};\r\n  MemoryCopyStruct(&key, &artifact);\r\n  c_close_key(key);\r\n}\r\n\r\ninternal C_Key\r\nfs_key_from_path_range(String8 path, Rng1U64 range, U64 endt_us)\r\n{\r\n  C_Key result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  {\r\n    String8List key_parts = {0};\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&path.size));\r\n    str8_list_push(scratch.arena, &key_parts, path);\r\n    str8_list_push(scratch.arena, &key_parts, str8_struct(&range));\r\n    String8 key = str8_list_join(scratch.arena, &key_parts, 0);\r\n    \r\n    //- rjf: find generation number for this key\r\n    U64 gen = 0;\r\n    {\r\n      U64 hash = u64_hash_from_str8(path);\r\n      U64 slot_idx = hash%fs_shared->slots_count;\r\n      FS_Slot *slot = &fs_shared->slots[slot_idx];\r\n      Stripe *stripe = stripe_from_slot_idx(&fs_shared->stripes, slot_idx);\r\n      RWMutexScope(stripe->rw_mutex, 0)\r\n      {\r\n        for(FS_Node *n = slot->first; n != 0; n = n->next)\r\n        {\r\n          if(str8_match(path, n->path, 0))\r\n          {\r\n            gen = n->gen;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: map to artifact\r\n    AC_Artifact artifact = ac_artifact_from_key(access, key, fs_artifact_create, fs_artifact_destroy, endt_us, .gen = gen, .flags = AC_Flag_Wide);\r\n    MemoryCopyStruct(&result, &artifact);\r\n  }\r\n  access_close(access);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal U128\r\nfs_hash_from_path_range(String8 path, Rng1U64 range, U64 endt_us)\r\n{\r\n  U128 hash = {0};\r\n  {\r\n    C_Key key = fs_key_from_path_range(path, range, endt_us);\r\n    for EachIndex(rewind_idx, C_KEY_HASH_HISTORY_COUNT)\r\n    {\r\n      hash = c_hash_from_key(key, rewind_idx);\r\n      if(!u128_match(hash, u128_zero()))\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return hash;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void\r\nfs_async_tick(void)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: detect changed timestamps for active paths\r\n  {\r\n    Rng1U64 range = lane_range(fs_shared->slots_count);\r\n    for EachInRange(slot_idx, range)\r\n    {\r\n      FS_Slot *slot = &fs_shared->slots[slot_idx];\r\n      Stripe *stripe = stripe_from_slot_idx(&fs_shared->stripes, slot_idx);\r\n      for(B32 write_mode = 0; write_mode <= 1; write_mode += 1)\r\n      {\r\n        B32 found_work = 0;\r\n        RWMutexScope(stripe->rw_mutex, write_mode)\r\n        {\r\n          for(FS_Node *n = slot->first; n != 0; n = n->next)\r\n          {\r\n            FileProperties props = os_properties_from_file_path(n->path);\r\n            if(props.modified != n->last_modified_timestamp)\r\n            {\r\n              found_work = 1;\r\n              if(write_mode)\r\n              {\r\n                n->gen += 1;\r\n                ins_atomic_u64_inc_eval(&fs_shared->change_gen);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        if(!found_work)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  ProfEnd();\r\n}\r\n"
  },
  {
    "path": "src/file_stream/file_stream.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef FILE_STREAM_H\r\n#define FILE_STREAM_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Path Cache\r\n\r\ntypedef struct FS_Node FS_Node;\r\nstruct FS_Node\r\n{\r\n  FS_Node *next;\r\n  String8 path;\r\n  U64 gen;\r\n  U64 last_modified_timestamp;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct FS_Slot FS_Slot;\r\nstruct FS_Slot\r\n{\r\n  FS_Node *first;\r\n  FS_Node *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared State Bundle\r\n\r\ntypedef struct FS_Shared FS_Shared;\r\nstruct FS_Shared\r\n{\r\n  Arena *arena;\r\n  U64 change_gen;\r\n  U64 slots_count;\r\n  FS_Slot *slots;\r\n  StripeArray stripes;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal FS_Shared *fs_shared = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level API\r\n\r\ninternal void fs_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Change Generation\r\n\r\ninternal U64 fs_change_gen(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Cache Hooks / Accessing API\r\n\r\ninternal AC_Artifact fs_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void fs_artifact_destroy(AC_Artifact artifact);\r\n\r\ninternal C_Key fs_key_from_path_range(String8 path, Rng1U64 range, U64 endt_us);\r\ninternal U128 fs_hash_from_path_range(String8 path, Rng1U64 range, U64 endt_us);\r\n#define fs_key_from_path(path, endt_us) fs_key_from_path_range((path), r1u64(0, max_U64), (endt_us))\r\n#define fs_hash_from_path(path, endt_us) fs_hash_from_path_range((path), r1u64(0, max_U64), (endt_us))\r\n\r\n////////////////////////////////\r\n//~ rjf: Asynchronous Tick\r\n\r\ninternal void fs_async_tick(void);\r\n\r\n#endif // FILE_STREAM_H\r\n"
  },
  {
    "path": "src/font_cache/font_cache.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Functions\r\n\r\n#if !defined(XXH_IMPLEMENTATION)\r\n# define XXH_IMPLEMENTATION\r\n# define XXH_STATIC_LINKING_ONLY\r\n# include \"third_party/xxHash/xxhash.h\"\r\n#endif\r\n\r\ninternal U128\r\nfnt_hash_from_string(String8 string)\r\n{\r\n  union\r\n  {\r\n    XXH128_hash_t xxhash;\r\n    U128 u128;\r\n  }\r\n  hash;\r\n  hash.xxhash = XXH3_128bits(string.str, string.size);\r\n  return hash.u128;\r\n}\r\n\r\ninternal U64\r\nfnt_little_hash_from_string(U64 seed, String8 string)\r\n{\r\n  U64 result = XXH3_64bits_withSeed(string.str, string.size, seed);\r\n  return result;\r\n}\r\n\r\ninternal Vec2S32\r\nfnt_vertex_from_corner(Corner corner)\r\n{\r\n  Vec2S32 result = {0};\r\n  switch(corner)\r\n  {\r\n    default: break;\r\n    case Corner_00:{result = v2s32(0, 0);}break;\r\n    case Corner_01:{result = v2s32(0, 1);}break;\r\n    case Corner_10:{result = v2s32(1, 0);}break;\r\n    case Corner_11:{result = v2s32(1, 1);}break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Font Tags\r\n\r\ninternal FNT_Tag\r\nfnt_tag_zero(void)\r\n{\r\n  FNT_Tag result = {0};\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nfnt_tag_match(FNT_Tag a, FNT_Tag b)\r\n{\r\n  return a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1];\r\n}\r\n\r\ninternal FP_Handle\r\nfnt_handle_from_tag(FNT_Tag tag)\r\n{\r\n  ProfBeginFunction();\r\n  U64 slot_idx = tag.u64[1] % fnt_state->font_hash_table_size;\r\n  FNT_FontHashNode *existing_node = 0;\r\n  {\r\n    for(FNT_FontHashNode *n = fnt_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next)\r\n    {\r\n      if(MemoryMatchStruct(&tag, &n->tag))\r\n      {\r\n        existing_node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  FP_Handle result = {0};\r\n  if(existing_node != 0)\r\n  {\r\n    result = existing_node->handle;\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal FP_Metrics\r\nfnt_fp_metrics_from_tag(FNT_Tag tag)\r\n{\r\n  ProfBeginFunction();\r\n  U64 slot_idx = tag.u64[1] % fnt_state->font_hash_table_size;\r\n  FNT_FontHashNode *existing_node = 0;\r\n  {\r\n    for(FNT_FontHashNode *n = fnt_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next)\r\n    {\r\n      if(MemoryMatchStruct(&tag, &n->tag))\r\n      {\r\n        existing_node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  FP_Metrics result = {0};\r\n  if(existing_node != 0)\r\n  {\r\n    result = existing_node->metrics;\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal FNT_Tag\r\nfnt_tag_from_path(String8 path)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: produce tag from hash of path\r\n  FNT_Tag result = {0};\r\n  {\r\n    U128 hash = fnt_hash_from_string(path);\r\n    MemoryCopy(&result, &hash, sizeof(result));\r\n    result.u64[1] |= bit64;\r\n  }\r\n  \r\n  //- rjf: tag -> slot index\r\n  U64 slot_idx = result.u64[1] % fnt_state->font_hash_table_size;\r\n  \r\n  //- rjf: slot * tag -> existing node\r\n  FNT_FontHashNode *existing_node = 0;\r\n  {\r\n    for(FNT_FontHashNode *n = fnt_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next)\r\n    {\r\n      if(MemoryMatchStruct(&result, &n->tag))\r\n      {\r\n        existing_node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: allocate & push new node if we don't have an existing one\r\n  if(existing_node == 0)\r\n  {\r\n    FP_Handle handle = fp_font_open(path);\r\n    FNT_FontHashSlot *slot = &fnt_state->font_hash_table[slot_idx];\r\n    existing_node = push_array(fnt_state->permanent_arena, FNT_FontHashNode, 1);\r\n    existing_node->tag = result;\r\n    existing_node->handle = handle;\r\n    existing_node->metrics = fp_metrics_from_font(existing_node->handle);\r\n    existing_node->path = push_str8_copy(fnt_state->permanent_arena, path);\r\n    SLLQueuePush_N(slot->first, slot->last, existing_node, hash_next);\r\n  }\r\n  \r\n  //- rjf: tag result must be zero if this is not a valid font\r\n  if(fp_handle_match(existing_node->handle, fp_handle_zero()))\r\n  {\r\n    MemoryZeroStruct(&result);\r\n  }\r\n  \r\n  //- rjf: return\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal FNT_Tag\r\nfnt_tag_from_static_data_string(String8 *data_ptr)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: produce tag hash of ptr\r\n  FNT_Tag result = {0};\r\n  {\r\n    U128 hash = fnt_hash_from_string(str8((U8 *)&data_ptr, sizeof(String8 *)));\r\n    MemoryCopy(&result, &hash, sizeof(result));\r\n    result.u64[1] &= ~bit64;\r\n  }\r\n  \r\n  //- rjf: tag -> slot index\r\n  U64 slot_idx = result.u64[1] % fnt_state->font_hash_table_size;\r\n  \r\n  //- rjf: slot * tag -> existing node\r\n  FNT_FontHashNode *existing_node = 0;\r\n  {\r\n    for(FNT_FontHashNode *n = fnt_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next)\r\n    {\r\n      if(MemoryMatchStruct(&result, &n->tag))\r\n      {\r\n        existing_node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: allocate & push new node if we don't have an existing one\r\n  FNT_FontHashNode *new_node = 0;\r\n  if(existing_node == 0)\r\n  {\r\n    FNT_FontHashSlot *slot = &fnt_state->font_hash_table[slot_idx];\r\n    new_node = push_array(fnt_state->permanent_arena, FNT_FontHashNode, 1);\r\n    new_node->tag = result;\r\n    new_node->handle = fp_font_open_from_static_data_string(data_ptr);\r\n    new_node->metrics = fp_metrics_from_font(new_node->handle);\r\n    new_node->path = str8_lit(\"\");\r\n    SLLQueuePush_N(slot->first, slot->last, new_node, hash_next);\r\n  }\r\n  \r\n  //- rjf: return\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nfnt_path_from_tag(FNT_Tag tag)\r\n{\r\n  //- rjf: tag -> slot index\r\n  U64 slot_idx = tag.u64[1] % fnt_state->font_hash_table_size;\r\n  \r\n  //- rjf: slot * tag -> existing node\r\n  FNT_FontHashNode *existing_node = 0;\r\n  {\r\n    for(FNT_FontHashNode *n = fnt_state->font_hash_table[slot_idx].first; n != 0 ; n = n->hash_next)\r\n    {\r\n      if(MemoryMatchStruct(&tag, &n->tag))\r\n      {\r\n        existing_node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: existing node -> path\r\n  String8 result = {0};\r\n  if(existing_node != 0)\r\n  {\r\n    result = existing_node->path;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Atlas\r\n\r\ninternal Rng2S16\r\nfnt_atlas_region_alloc(Arena *arena, FNT_Atlas *atlas, Vec2S16 needed_size)\r\n{\r\n  //- rjf: find node with best-fit size\r\n  Vec2S16 region_p0 = {0};\r\n  Vec2S16 region_sz = {0};\r\n  Corner node_corner = Corner_Invalid;\r\n  FNT_AtlasRegionNode *node = 0;\r\n  {\r\n    Vec2S16 n_supported_size = atlas->root_dim;\r\n    for(FNT_AtlasRegionNode *n = atlas->root, *next = 0; n != 0; n = next, next = 0)\r\n    {\r\n      // rjf: we've traversed to a taken node.\r\n      if(n->flags & FNT_AtlasRegionNodeFlag_Taken)\r\n      {\r\n        break;\r\n      }\r\n      \r\n      // rjf: calculate if this node can be allocated (all children are non-allocated)\r\n      B32 n_can_be_allocated = (n->num_allocated_descendants == 0);\r\n      \r\n      // rjf: fill size\r\n      if(n_can_be_allocated)\r\n      {\r\n        region_sz = n_supported_size;\r\n      }\r\n      \r\n      // rjf: calculate size of this node's children\r\n      Vec2S16 child_size = v2s16(n_supported_size.x/2, n_supported_size.y/2);\r\n      \r\n      // rjf: find best next child\r\n      FNT_AtlasRegionNode *best_child = 0;\r\n      if(child_size.x >= needed_size.x && child_size.y >= needed_size.y)\r\n      {\r\n        for(Corner corner = (Corner)0; corner < Corner_COUNT; corner = (Corner)(corner+1))\r\n        {\r\n          if(n->children[corner] == 0)\r\n          {\r\n            n->children[corner] = push_array(arena, FNT_AtlasRegionNode, 1);\r\n            n->children[corner]->parent = n;\r\n            n->children[corner]->max_free_size[Corner_00] = \r\n              n->children[corner]->max_free_size[Corner_01] = \r\n              n->children[corner]->max_free_size[Corner_10] = \r\n              n->children[corner]->max_free_size[Corner_11] = v2s16(child_size.x/2, child_size.y/2);\r\n          }\r\n          if(n->max_free_size[corner].x >= needed_size.x && \r\n             n->max_free_size[corner].y >= needed_size.y)\r\n          {\r\n            best_child = n->children[corner];\r\n            node_corner = corner;\r\n            Vec2S32 side_vertex = fnt_vertex_from_corner(corner);\r\n            region_p0.x += side_vertex.x*child_size.x;\r\n            region_p0.y += side_vertex.y*child_size.y;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: resolve node to this node if it can be allocated and children\r\n      // don't fit, or keep going to the next best child\r\n      if(n_can_be_allocated && best_child == 0)\r\n      {\r\n        node = n;\r\n      }\r\n      else\r\n      {\r\n        next = best_child;\r\n        n_supported_size = child_size;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: we're taking the subtree rooted by `node`. mark up all parents\r\n  if(node != 0 && node_corner != Corner_Invalid)\r\n  {\r\n    node->flags |= FNT_AtlasRegionNodeFlag_Taken;\r\n    if(node->parent != 0)\r\n    {\r\n      MemoryZeroStruct(&node->parent->max_free_size[node_corner]);\r\n    }\r\n    for(FNT_AtlasRegionNode *p = node->parent; p != 0; p = p->parent)\r\n    {\r\n      p->num_allocated_descendants += 1;\r\n      FNT_AtlasRegionNode *parent = p->parent;\r\n      if(parent != 0)\r\n      {\r\n        Corner p_corner = (p == parent->children[Corner_00] ? Corner_00 :\r\n                           p == parent->children[Corner_01] ? Corner_01 :\r\n                           p == parent->children[Corner_10] ? Corner_10 :\r\n                           p == parent->children[Corner_11] ? Corner_11 :\r\n                           Corner_Invalid);\r\n        if(p_corner == Corner_Invalid)\r\n        {\r\n          InvalidPath;\r\n        }\r\n        parent->max_free_size[p_corner].x = Max(Max(p->max_free_size[Corner_00].x,\r\n                                                    p->max_free_size[Corner_01].x),\r\n                                                Max(p->max_free_size[Corner_10].x,\r\n                                                    p->max_free_size[Corner_11].x));\r\n        parent->max_free_size[p_corner].y = Max(Max(p->max_free_size[Corner_00].y,\r\n                                                    p->max_free_size[Corner_01].y),\r\n                                                Max(p->max_free_size[Corner_10].y,\r\n                                                    p->max_free_size[Corner_11].y));\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill rectangular region & return\r\n  Rng2S16 result = {0};\r\n  result.p0 = region_p0;\r\n  result.p1 = add_2s16(region_p0, region_sz);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nfnt_atlas_region_release(FNT_Atlas *atlas, Rng2S16 region)\r\n{\r\n  //- rjf: extract region size\r\n  Vec2S16 region_size = v2s16(region.x1 - region.x0, region.y1 - region.y0);\r\n  \r\n  //- rjf: map region to associated node\r\n  Vec2S16 calc_region_size = {0};\r\n  FNT_AtlasRegionNode *node = 0;\r\n  Corner node_corner = Corner_Invalid;\r\n  {\r\n    Vec2S16 n_p0 = v2s16(0, 0);\r\n    Vec2S16 n_sz = atlas->root_dim;\r\n    for(FNT_AtlasRegionNode *n = atlas->root, *next = 0; n != 0; n = next)\r\n    {\r\n      // rjf: is the region within this node's boundaries? (either this node, or a descendant)\r\n      if(n_p0.x <= region.p0.x && region.p0.x < n_p0.x+n_sz.x &&\r\n         n_p0.y <= region.p0.y && region.p0.y < n_p0.y+n_sz.y)\r\n      {\r\n        // rjf: check the region against this node\r\n        if(region.p0.x == n_p0.x && region.p0.y == n_p0.y && \r\n           region_size.x == n_sz.x && region_size.y == n_sz.y)\r\n        {\r\n          node = n;\r\n          calc_region_size = n_sz;\r\n          break;\r\n        }\r\n        // rjf: check the region against children & iterate\r\n        else\r\n        {\r\n          Vec2S16 r_midpoint = v2s16(region.p0.x + region_size.x/2,\r\n                                     region.p0.y + region_size.y/2);\r\n          Vec2S16 n_midpoint = v2s16(n_p0.x + n_sz.x/2,\r\n                                     n_p0.y + n_sz.y/2);\r\n          Corner next_corner = Corner_Invalid;\r\n          if(r_midpoint.x <= n_midpoint.x && r_midpoint.y <= n_midpoint.y)\r\n          {\r\n            next_corner = Corner_00;\r\n          }\r\n          else if(r_midpoint.x <= n_midpoint.x && n_midpoint.y <= r_midpoint.y)\r\n          {\r\n            next_corner = Corner_01;\r\n          }\r\n          else if(n_midpoint.x <= r_midpoint.x && r_midpoint.y <= n_midpoint.y)\r\n          {\r\n            next_corner = Corner_10;\r\n          }\r\n          else if(n_midpoint.x <= r_midpoint.x && n_midpoint.y <= r_midpoint.y)\r\n          {\r\n            next_corner = Corner_11;\r\n          }\r\n          next = n->children[next_corner];\r\n          node_corner = next_corner;\r\n          n_sz.x /= 2;\r\n          n_sz.y /= 2;\r\n          Vec2S32 side_vertex = fnt_vertex_from_corner(node_corner);\r\n          n_p0.x += side_vertex.x*n_sz.x;\r\n          n_p0.y += side_vertex.y*n_sz.y;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        break; \r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: free node\r\n  if(node != 0 && node_corner != Corner_Invalid)\r\n  {\r\n    node->flags &= ~FNT_AtlasRegionNodeFlag_Taken;\r\n    if(node->parent != 0)\r\n    {\r\n      node->parent->max_free_size[node_corner] = calc_region_size;\r\n    }\r\n    for(FNT_AtlasRegionNode *p = node->parent; p != 0; p = p->parent)\r\n    {\r\n      p->num_allocated_descendants -= 1;\r\n      FNT_AtlasRegionNode *parent = p->parent;\r\n      if(parent != 0)\r\n      {\r\n        Corner p_corner = (p == parent->children[Corner_00] ? Corner_00 :\r\n                           p == parent->children[Corner_01] ? Corner_01 :\r\n                           p == parent->children[Corner_10] ? Corner_10 :\r\n                           p == parent->children[Corner_11] ? Corner_11 :\r\n                           Corner_Invalid);\r\n        if(p_corner == Corner_Invalid)\r\n        {\r\n          InvalidPath;\r\n        }\r\n        parent->max_free_size[p_corner].x = Max(Max(p->max_free_size[Corner_00].x,\r\n                                                    p->max_free_size[Corner_01].x),\r\n                                                Max(p->max_free_size[Corner_10].x,\r\n                                                    p->max_free_size[Corner_11].x));\r\n        parent->max_free_size[p_corner].y = Max(Max(p->max_free_size[Corner_00].y,\r\n                                                    p->max_free_size[Corner_01].y),\r\n                                                Max(p->max_free_size[Corner_10].y,\r\n                                                    p->max_free_size[Corner_11].y));\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Piece Type Functions\r\n\r\ninternal FNT_Piece *\r\nfnt_piece_chunk_list_push_new(Arena *arena, FNT_PieceChunkList *list, U64 cap)\r\n{\r\n  FNT_PieceChunkNode *node = list->last;\r\n  if(node == 0 || node->count >= node->cap)\r\n  {\r\n    node = push_array(arena, FNT_PieceChunkNode, 1);\r\n    node->v = push_array_no_zero(arena, FNT_Piece, cap);\r\n    node->cap = cap;\r\n    SLLQueuePush(list->first, list->last, node);\r\n    list->node_count += 1;\r\n  }\r\n  FNT_Piece *result = node->v + node->count;\r\n  node->count += 1;\r\n  list->total_piece_count += 1;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nfnt_piece_chunk_list_push(Arena *arena, FNT_PieceChunkList *list, U64 cap, FNT_Piece *piece)\r\n{\r\n  FNT_Piece *new_piece = fnt_piece_chunk_list_push_new(arena, list, cap);\r\n  MemoryCopyStruct(new_piece, piece);\r\n}\r\n\r\ninternal FNT_PieceArray\r\nfnt_piece_array_from_chunk_list(Arena *arena, FNT_PieceChunkList *list)\r\n{\r\n  FNT_PieceArray array = {0};\r\n  array.count = list->total_piece_count;\r\n  array.v = push_array_no_zero(arena, FNT_Piece, array.count);\r\n  U64 write_idx = 0;\r\n  for(FNT_PieceChunkNode *node = list->first; node != 0; node = node->next)\r\n  {\r\n    MemoryCopy(array.v + write_idx, node->v, node->count * sizeof(FNT_Piece));\r\n    write_idx += node->count;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal FNT_PieceArray\r\nfnt_piece_array_copy(Arena *arena, FNT_PieceArray *src)\r\n{\r\n  FNT_PieceArray dst = {0};\r\n  dst.count = src->count;\r\n  dst.v = push_array_no_zero(arena, FNT_Piece, dst.count);\r\n  MemoryCopy(dst.v, src->v, sizeof(FNT_Piece)*dst.count);\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Usage\r\n\r\ninternal FNT_Hash2StyleRasterCacheNode *\r\nfnt_hash2style_from_tag_size_flags(FNT_Tag tag, F32 size, FNT_RasterFlags flags)\r\n{\r\n  //- rjf: tag * size -> style hash\r\n  U64 style_hash = {0};\r\n  {\r\n    F64 size_f64 = size;\r\n    U64 buffer[] =\r\n    {\r\n      tag.u64[0],\r\n      tag.u64[1],\r\n      *(U64 *)(&size_f64),\r\n      (U64)flags,\r\n    };\r\n    style_hash = fnt_little_hash_from_string(5381, str8((U8 *)buffer, sizeof(buffer)));\r\n  }\r\n  \r\n  //- rjf: style hash -> style node\r\n  FNT_Hash2StyleRasterCacheNode *hash2style_node = 0;\r\n  {\r\n    U64 slot_idx = style_hash%fnt_state->hash2style_slots_count;\r\n    FNT_Hash2StyleRasterCacheSlot *slot = &fnt_state->hash2style_slots[slot_idx];\r\n    for(FNT_Hash2StyleRasterCacheNode *n = slot->first;\r\n        n != 0;\r\n        n = n->hash_next)\r\n    {\r\n      if(n->style_hash == style_hash)\r\n      {\r\n        hash2style_node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(Unlikely(hash2style_node == 0))\r\n    {\r\n      FNT_Metrics metrics = fnt_metrics_from_tag_size(tag, size);\r\n      hash2style_node = push_array(fnt_state->raster_arena, FNT_Hash2StyleRasterCacheNode, 1);\r\n      DLLPushBack_NP(slot->first, slot->last, hash2style_node, hash_next, hash_prev);\r\n      hash2style_node->style_hash = style_hash;\r\n      hash2style_node->ascent   = metrics.ascent;\r\n      hash2style_node->descent  = metrics.descent;\r\n      hash2style_node->utf8_class1_direct_map = push_array_no_zero(fnt_state->raster_arena, FNT_RasterCacheInfo, 256);\r\n      hash2style_node->hash2info_slots_count = 1024;\r\n      hash2style_node->hash2info_slots = push_array(fnt_state->raster_arena, FNT_Hash2InfoRasterCacheSlot, hash2style_node->hash2info_slots_count);\r\n    }\r\n  }\r\n  \r\n  return hash2style_node;\r\n}\r\n\r\ninternal FNT_Run\r\nfnt_run_from_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, String8 string)\r\n{\r\n  //- rjf: map tag/size to style node\r\n  FNT_Hash2StyleRasterCacheNode *hash2style_node = fnt_hash2style_from_tag_size_flags(tag, size, flags);\r\n  \r\n  //- rjf: set up this style's run cache if needed\r\n  if(hash2style_node->run_slots_frame_index != fnt_state->frame_index)\r\n  {\r\n    hash2style_node->run_slots_count = 1024;\r\n    hash2style_node->run_slots = push_array(fnt_state->frame_arena, FNT_RunCacheSlot, hash2style_node->run_slots_count);\r\n    hash2style_node->run_slots_frame_index = fnt_state->frame_index;\r\n  }\r\n  \r\n  //- rjf: unpack run params\r\n  U64 run_hash = fnt_little_hash_from_string(5381, string);\r\n  U64 run_slot_idx = run_hash%hash2style_node->run_slots_count;\r\n  FNT_RunCacheSlot *run_slot = &hash2style_node->run_slots[run_slot_idx];\r\n  \r\n  //- rjf: find existing run node for this string\r\n  FNT_RunCacheNode *run_node = 0;\r\n  {\r\n    for(FNT_RunCacheNode *n = run_slot->first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->string, string, 0))\r\n      {\r\n        run_node = n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: no run node? -> cache miss - compute & build & fill node if possible\r\n  B32 run_is_cacheable = 1;\r\n  FNT_Run run = {0};\r\n  if(run_node)\r\n  {\r\n    run = run_node->run;\r\n  }\r\n  else\r\n  {\r\n    //- rjf: decode string & produce run pieces\r\n    FNT_PieceChunkList piece_chunks = {0};\r\n    Vec2F32 dim = {0};\r\n    B32 font_handle_mapped_on_miss = 0;\r\n    FP_Handle font_handle = {0};\r\n    U64 piece_substring_start_idx = 0;\r\n    U64 piece_substring_end_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      //- rjf: decode next codepoint & get piece substring, or continuation rule\r\n      U8 byte = (idx < string.size ? string.str[idx] : 0);\r\n      B32 need_another_codepoint = 0;\r\n      if(byte == 0)\r\n      {\r\n        idx += 1;\r\n      }\r\n      else switch(utf8_class[byte>>3])\r\n      {\r\n        case 1:\r\n        {\r\n          idx += 1;\r\n          piece_substring_end_idx += 1;\r\n          need_another_codepoint = 0;\r\n        }break;\r\n        default:\r\n        {\r\n          UnicodeDecode decode = utf8_decode(string.str+idx, string.size-idx);\r\n          idx += decode.inc;\r\n          piece_substring_end_idx += decode.inc;\r\n          need_another_codepoint = 0;\r\n        }break;\r\n      }\r\n      \r\n      //- rjf: need another codepoint, or have no substring? -> continue\r\n      if(need_another_codepoint || piece_substring_end_idx == piece_substring_start_idx)\r\n      {\r\n        continue;\r\n      }\r\n      \r\n      //- rjf: do not need another codepoint? -> grab substring, bump piece start idx\r\n      String8 piece_substring = str8_substr(string, r1u64(piece_substring_start_idx, piece_substring_end_idx));\r\n      piece_substring_start_idx = idx;\r\n      piece_substring_end_idx = idx;\r\n      \r\n      //- rjf: determine if this piece is a tab - if so, use space info to draw\r\n      B32 is_tab = (piece_substring.size == 1 && piece_substring.str[0] == '\\t');\r\n      if(is_tab)\r\n      {\r\n        run_is_cacheable = 0;\r\n        piece_substring = str8_lit(\" \");\r\n      }\r\n      \r\n      //- rjf: piece substring -> raster cache info\r\n      FNT_RasterCacheInfo *info = 0;\r\n      U64 piece_hash = 0;\r\n      {\r\n        // rjf: fast path for utf8 class 1 -> direct map\r\n        if(piece_substring.size == 1 && hash2style_node->utf8_class1_direct_map_mask[piece_substring.str[0]/64] & (1ull<<(piece_substring.str[0]%64)))\r\n        {\r\n          info = &hash2style_node->utf8_class1_direct_map[piece_substring.str[0]];\r\n        }\r\n        \r\n        // rjf: more general, slower path for other glyphs\r\n        if(piece_substring.size > 1)\r\n        {\r\n          piece_hash = fnt_little_hash_from_string(5381, piece_substring);\r\n          U64 slot_idx = piece_hash%hash2style_node->hash2info_slots_count;\r\n          FNT_Hash2InfoRasterCacheSlot *slot = &hash2style_node->hash2info_slots[slot_idx];\r\n          for(FNT_Hash2InfoRasterCacheNode *node = slot->first; node != 0; node = node->hash_next)\r\n          {\r\n            if(node->hash == piece_hash)\r\n            {\r\n              info = &node->info;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: no info found -> miss... fill this hash in the cache\r\n      if(info == 0)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        \r\n        // rjf: grab font handle for this tag if we don't have one already\r\n        if(font_handle_mapped_on_miss == 0)\r\n        {\r\n          font_handle_mapped_on_miss = 1;\r\n          \r\n          // rjf: tag -> font slot index\r\n          U64 font_slot_idx = tag.u64[1] % fnt_state->font_hash_table_size;\r\n          \r\n          // rjf: tag * slot -> existing node\r\n          FNT_FontHashNode *existing_node = 0;\r\n          {\r\n            for(FNT_FontHashNode *n = fnt_state->font_hash_table[font_slot_idx].first; n != 0 ; n = n->hash_next)\r\n            {\r\n              if(MemoryMatchStruct(&n->tag, &tag))\r\n              {\r\n                existing_node = n;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: existing node -> font handle\r\n          if(existing_node != 0)\r\n          {\r\n            font_handle = existing_node->handle;\r\n          }\r\n        }\r\n        \r\n        // rjf: call into font provider to rasterize this substring\r\n        FP_RasterResult raster = {0};\r\n        if(size > 0)\r\n        {\r\n          FP_RasterFlags fp_flags = 0;\r\n          if(flags & FNT_RasterFlag_Smooth) { fp_flags |= FP_RasterFlag_Smooth; }\r\n          if(flags & FNT_RasterFlag_Hinted) { fp_flags |= FP_RasterFlag_Hinted; }\r\n          raster = fp_raster(scratch.arena, font_handle, floor_f32(size), flags, piece_substring);\r\n        }\r\n        \r\n        // rjf: allocate portion of an atlas to upload the rasterization\r\n        S16 chosen_atlas_num = 0;\r\n        FNT_Atlas *chosen_atlas = 0;\r\n        Rng2S16 chosen_atlas_region = {0};\r\n        if(raster.atlas_dim.x != 0 && raster.atlas_dim.y != 0)\r\n        {\r\n          U64 num_atlases = 0;\r\n          for(FNT_Atlas *atlas = fnt_state->first_atlas;; atlas = atlas->next, num_atlases += 1)\r\n          {\r\n            // rjf: create atlas if needed\r\n            if(atlas == 0 && num_atlases < 64)\r\n            {\r\n              atlas = push_array(fnt_state->raster_arena, FNT_Atlas, 1);\r\n              DLLPushBack(fnt_state->first_atlas, fnt_state->last_atlas, atlas);\r\n              atlas->root_dim = v2s16(1024, 1024);\r\n              atlas->root = push_array(fnt_state->raster_arena, FNT_AtlasRegionNode, 1);\r\n              atlas->root->max_free_size[Corner_00] =\r\n                atlas->root->max_free_size[Corner_01] =\r\n                atlas->root->max_free_size[Corner_10] =\r\n                atlas->root->max_free_size[Corner_11] = v2s16(atlas->root_dim.x/2, atlas->root_dim.y/2);\r\n              atlas->texture = r_tex2d_alloc(R_ResourceKind_Dynamic, v2s32((S32)atlas->root_dim.x, (S32)atlas->root_dim.y), R_Tex2DFormat_RGBA8, 0);\r\n            }\r\n            \r\n            // rjf: allocate from atlas\r\n            if(atlas != 0)\r\n            {\r\n              Vec2S16 needed_dimensions = v2s16(raster.atlas_dim.x + 2, raster.atlas_dim.y + 2);\r\n              chosen_atlas_region = fnt_atlas_region_alloc(fnt_state->raster_arena, atlas, needed_dimensions);\r\n              if(chosen_atlas_region.x1 != chosen_atlas_region.x0)\r\n              {\r\n                chosen_atlas = atlas;\r\n                chosen_atlas_num = (S32)num_atlases;\r\n                break;\r\n              }\r\n            }\r\n            else\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: upload rasterization to allocated region of atlas texture memory\r\n        if(chosen_atlas != 0)\r\n        {\r\n          Rng2S32 subregion =\r\n          {\r\n            chosen_atlas_region.x0,\r\n            chosen_atlas_region.y0,\r\n            chosen_atlas_region.x0 + raster.atlas_dim.x,\r\n            chosen_atlas_region.y0 + raster.atlas_dim.y\r\n          };\r\n          r_fill_tex2d_region(chosen_atlas->texture, subregion, raster.atlas);\r\n        }\r\n        \r\n        // rjf: allocate & fill & push node\r\n        {\r\n          if(piece_substring.size == 1)\r\n          {\r\n            info = &hash2style_node->utf8_class1_direct_map[piece_substring.str[0]];\r\n            hash2style_node->utf8_class1_direct_map_mask[piece_substring.str[0]/64] |= (1ull<<(piece_substring.str[0]%64));\r\n          }\r\n          else\r\n          {\r\n            U64 slot_idx = piece_hash%hash2style_node->hash2info_slots_count;\r\n            FNT_Hash2InfoRasterCacheSlot *slot = &hash2style_node->hash2info_slots[slot_idx];\r\n            FNT_Hash2InfoRasterCacheNode *node = push_array_no_zero(fnt_state->raster_arena, FNT_Hash2InfoRasterCacheNode, 1);\r\n            DLLPushBack_NP(slot->first, slot->last, node, hash_next, hash_prev);\r\n            node->hash = piece_hash;\r\n            info = &node->info;\r\n          }\r\n          if(info != 0)\r\n          {\r\n            info->subrect    = chosen_atlas_region;\r\n            info->atlas_num  = chosen_atlas_num;\r\n            info->raster_dim = raster.atlas_dim;\r\n            info->advance    = raster.advance;\r\n          }\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //- rjf: push piece for this raster portion\r\n      if(info != 0)\r\n      {\r\n        // rjf: find atlas\r\n        FNT_Atlas *atlas = 0;\r\n        {\r\n          if(info->subrect.x1 != 0 && info->subrect.y1 != 0)\r\n          {\r\n            S32 num = 0;\r\n            for(FNT_Atlas *a = fnt_state->first_atlas; a != 0; a = a->next, num += 1)\r\n            {\r\n              if(info->atlas_num == num)\r\n              {\r\n                atlas = a;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: on tabs -> expand advance\r\n        F32 advance = info->advance;\r\n        if(is_tab)\r\n        {\r\n          advance = floor_f32(tab_size_px) - mod_f32(floor_f32(base_align_px), floor_f32(tab_size_px));\r\n        }\r\n        \r\n        // rjf: push piece\r\n        {\r\n          FNT_Piece *piece = fnt_piece_chunk_list_push_new(fnt_state->frame_arena, &piece_chunks, string.size);\r\n          {\r\n            piece->texture = atlas ? atlas->texture : r_handle_zero();\r\n            piece->subrect = r2s16p(info->subrect.x0,\r\n                                    info->subrect.y0,\r\n                                    info->subrect.x0 + info->raster_dim.x,\r\n                                    info->subrect.y0 + info->raster_dim.y);\r\n            piece->advance = advance;\r\n            piece->decode_size = piece_substring.size;\r\n            piece->offset = v2s16(0, -(hash2style_node->ascent + hash2style_node->descent));\r\n          }\r\n          base_align_px += advance;\r\n          dim.x += piece->advance;\r\n          dim.y = Max(dim.y, info->raster_dim.y);\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: tighten & fill\r\n    {\r\n      if(piece_chunks.node_count == 1)\r\n      {\r\n        run.pieces.v = piece_chunks.first->v;\r\n        run.pieces.count = piece_chunks.first->count;\r\n      }\r\n      else\r\n      {\r\n        run.pieces = fnt_piece_array_from_chunk_list(fnt_state->frame_arena, &piece_chunks);\r\n      }\r\n      run.dim = dim;\r\n      run.ascent  = hash2style_node->ascent;\r\n      run.descent = hash2style_node->descent;\r\n    }\r\n  }\r\n  \r\n  //- rjf: build node for cacheable runs\r\n  if(run_is_cacheable)\r\n  {\r\n    run_node = push_array(fnt_state->frame_arena, FNT_RunCacheNode, 1);\r\n    SLLQueuePush(run_slot->first, run_slot->last, run_node);\r\n    run_node->string = push_str8_copy(fnt_state->frame_arena, string);\r\n    run_node->run = run;\r\n  }\r\n  \r\n  return run;\r\n}\r\n\r\ninternal String8List\r\nfnt_wrapped_string_lines_from_font_size_string_max(Arena *arena, FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max)\r\n{\r\n  String8List list = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    FNT_Run run = fnt_run_from_string(font, size, base_align_px, tab_size_px, 0, string);\r\n    F32 off_px = 0;\r\n    U64 off_bytes = 0;\r\n    U64 line_start_off_bytes = 0;\r\n    U64 line_end_off_bytes = 0;\r\n    B32 seeking_word_end = 0;\r\n    F32 word_start_off_px = 0;\r\n    FNT_Piece *last_word_start_piece = 0;\r\n    U64 last_word_start_off_bytes = 0;\r\n    FNT_Piece *pieces_first = run.pieces.v;\r\n    FNT_Piece *pieces_opl = run.pieces.v + run.pieces.count;\r\n    for(FNT_Piece *piece = pieces_first, *next = 0; piece != 0 && piece <= pieces_opl; piece = next)\r\n    {\r\n      if(piece != 0) {next = piece+1;}\r\n      \r\n      // rjf: gather info\r\n      U8 byte         = off_bytes < string.size ? string.str[off_bytes] : 0;\r\n      F32 advance     = (piece != 0) ? piece->advance : 0;\r\n      U64 decode_size = (piece != 0) ? piece->decode_size : 0;\r\n      \r\n      // rjf: find start/end of words\r\n      B32 is_first_byte_of_word = 0;\r\n      B32 is_first_space_after_word = 0;\r\n      if(!seeking_word_end && !char_is_space(byte))\r\n      {\r\n        seeking_word_end = 1;\r\n        is_first_byte_of_word = 1;\r\n        last_word_start_off_bytes = off_bytes;\r\n        last_word_start_piece = piece;\r\n        word_start_off_px = off_px;\r\n      }\r\n      else if(seeking_word_end && char_is_space(byte))\r\n      {\r\n        seeking_word_end = 0;\r\n        is_first_space_after_word = 1;\r\n      }\r\n      else if(seeking_word_end && byte == 0)\r\n      {\r\n        is_first_space_after_word = 1;\r\n      }\r\n      \r\n      // rjf: determine properties of this advance\r\n      B32 is_illegal = (off_px >= max);\r\n      B32 is_next_illegal = (off_px + advance >= max);\r\n      B32 is_end = (byte == 0);\r\n      \r\n      // rjf: legal word end -> extend line\r\n      if(is_first_space_after_word && !is_illegal)\r\n      {\r\n        line_end_off_bytes = off_bytes;\r\n      }\r\n      \r\n      // rjf: illegal mid-word split -> wrap mid-word\r\n      if(is_next_illegal && word_start_off_px == 0)\r\n      {\r\n        String8 line = str8(string.str + line_start_off_bytes, off_bytes - line_start_off_bytes);\r\n        line = str8_skip_chop_whitespace(line);\r\n        if(line.size != 0)\r\n        {\r\n          str8_list_push(arena, &list, line);\r\n        }\r\n        off_px = advance;\r\n        line_start_off_bytes = off_bytes;\r\n        line_end_off_bytes = off_bytes;\r\n        word_start_off_px = 0;\r\n        last_word_start_piece = piece;\r\n        last_word_start_off_bytes = off_bytes;\r\n        off_bytes += decode_size;\r\n      }\r\n      \r\n      // rjf: illegal word end -> wrap line\r\n      else if(is_first_space_after_word && (is_illegal || is_end))\r\n      {\r\n        String8 line = str8(string.str + line_start_off_bytes, line_end_off_bytes - line_start_off_bytes);\r\n        line = str8_skip_chop_whitespace(line);\r\n        if(line.size != 0)\r\n        {\r\n          str8_list_push(arena, &list, line);\r\n        }\r\n        line_start_off_bytes = line_end_off_bytes;\r\n        if(is_illegal)\r\n        {\r\n          off_px = 0;\r\n          word_start_off_px = 0;\r\n          off_bytes = last_word_start_off_bytes;\r\n          next = last_word_start_piece;\r\n        }\r\n      }\r\n      \r\n      // rjf: advance offsets otherwise\r\n      else\r\n      {\r\n        off_px += advance;\r\n        off_bytes += decode_size;\r\n      }\r\n      \r\n      // rjf: 0 piece and 0 next -> done\r\n      if(piece == 0 && next == 0)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal Vec2F32\r\nfnt_dim_from_tag_size_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Vec2F32 result = {0};\r\n  FNT_Run run = fnt_run_from_string(tag, size, base_align_px, tab_size_px, 0, string);\r\n  result = run.dim;\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal Vec2F32\r\nfnt_dim_from_tag_size_string_list(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list)\r\n{\r\n  Vec2F32 sum = {0};\r\n  for(String8Node *n = list.first; n != 0; n = n->next)\r\n  {\r\n    Vec2F32 str_dim = fnt_dim_from_tag_size_string(tag, size, base_align_px, tab_size_px, n->string);\r\n    sum.x += str_dim.x;\r\n    sum.y = Max(sum.y, str_dim.y);\r\n  }\r\n  return sum;\r\n}\r\n\r\ninternal F32\r\nfnt_column_size_from_tag_size(FNT_Tag tag, F32 size)\r\n{\r\n  F32 result = fnt_dim_from_tag_size_string(tag, size, 0, 0, str8_lit(\"H\")).x;\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nfnt_char_pos_from_tag_size_string_p(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U64 best_offset_bytes = 0;\r\n  F32 best_offset_px = inf32();\r\n  U64 offset_bytes = 0;\r\n  F32 offset_px = 0.f;\r\n  FNT_Run run = fnt_run_from_string(tag, size, base_align_px, tab_size_px, 0, string);\r\n  for(U64 idx = 0; idx <= run.pieces.count; idx += 1)\r\n  {\r\n    F32 this_piece_offset_px = abs_f32(offset_px - p);\r\n    if(this_piece_offset_px < best_offset_px)\r\n    {\r\n      best_offset_bytes = offset_bytes;\r\n      best_offset_px = this_piece_offset_px;\r\n    }\r\n    if(idx < run.pieces.count)\r\n    {\r\n      FNT_Piece *piece = &run.pieces.v[idx];\r\n      offset_px += piece->advance;\r\n      offset_bytes += piece->decode_size;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return best_offset_bytes;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Metrics\r\n\r\ninternal FNT_Metrics\r\nfnt_metrics_from_tag_size(FNT_Tag tag, F32 size)\r\n{\r\n  FP_Metrics metrics = fnt_fp_metrics_from_tag(tag);\r\n  FNT_Metrics result = {0};\r\n  {\r\n    result.ascent   = floor_f32(size) * metrics.ascent / metrics.design_units_per_em;\r\n    result.descent  = floor_f32(size) * metrics.descent / metrics.design_units_per_em;\r\n    result.line_gap = floor_f32(size) * metrics.line_gap / metrics.design_units_per_em;\r\n    result.capital_height = floor_f32(size) * metrics.capital_height / metrics.design_units_per_em;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal F32\r\nfnt_line_height_from_metrics(FNT_Metrics *metrics)\r\n{\r\n  return metrics->ascent + metrics->descent + metrics->line_gap;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Calls\r\n\r\ninternal void\r\nfnt_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  fnt_state = push_array(arena, FNT_State, 1);\r\n  fnt_state->permanent_arena = arena;\r\n  fnt_state->raster_arena = arena_alloc();\r\n  fnt_state->frame_arena = arena_alloc();\r\n  fnt_state->font_hash_table_size = 64;\r\n  fnt_state->font_hash_table = push_array(fnt_state->permanent_arena, FNT_FontHashSlot, fnt_state->font_hash_table_size);\r\n  fnt_reset();\r\n}\r\n\r\ninternal void\r\nfnt_reset(void)\r\n{\r\n  for(FNT_Atlas *a = fnt_state->first_atlas; a != 0; a = a->next)\r\n  {\r\n    r_tex2d_release(a->texture);\r\n  }\r\n  fnt_state->first_atlas = fnt_state->last_atlas = 0;\r\n  arena_clear(fnt_state->raster_arena);\r\n  fnt_state->hash2style_slots_count = 1024;\r\n  fnt_state->hash2style_slots = push_array(fnt_state->raster_arena, FNT_Hash2StyleRasterCacheSlot, fnt_state->hash2style_slots_count);\r\n}\r\n\r\ninternal void\r\nfnt_frame(void)\r\n{\r\n  fnt_state->frame_index += 1;\r\n  arena_clear(fnt_state->frame_arena);\r\n}\r\n"
  },
  {
    "path": "src/font_cache/font_cache.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef FONT_CACHE_H\r\n#define FONT_CACHE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Rasterization Flags\r\n\r\ntypedef U32 FNT_RasterFlags;\r\nenum\r\n{\r\n  FNT_RasterFlag_Smooth = (1<<0),\r\n  FNT_RasterFlag_Hinted = (1<<1),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Handles & Tags\r\n\r\ntypedef struct FNT_Tag FNT_Tag;\r\nstruct FNT_Tag\r\n{\r\n  U64 u64[2];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Draw Package Types (For Cache Queries)\r\n\r\ntypedef struct FNT_Piece FNT_Piece;\r\nstruct FNT_Piece\r\n{\r\n  R_Handle texture;\r\n  Rng2S16 subrect;\r\n  Vec2S16 offset;\r\n  F32 advance;\r\n  U16 decode_size;\r\n};\r\n\r\ntypedef struct FNT_PieceChunkNode FNT_PieceChunkNode;\r\nstruct FNT_PieceChunkNode\r\n{\r\n  FNT_PieceChunkNode *next;\r\n  FNT_Piece *v;\r\n  U64 count;\r\n  U64 cap;\r\n};\r\n\r\ntypedef struct FNT_PieceChunkList FNT_PieceChunkList;\r\nstruct FNT_PieceChunkList\r\n{\r\n  FNT_PieceChunkNode *first;\r\n  FNT_PieceChunkNode *last;\r\n  U64 node_count;\r\n  U64 total_piece_count;\r\n};\r\n\r\ntypedef struct FNT_PieceArray FNT_PieceArray;\r\nstruct FNT_PieceArray\r\n{\r\n  FNT_Piece *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct FNT_Run FNT_Run;\r\nstruct FNT_Run\r\n{\r\n  FNT_PieceArray pieces;\r\n  Vec2F32 dim;\r\n  F32 ascent;\r\n  F32 descent;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Font Path -> Handle * Metrics * Path Cache Types\r\n\r\ntypedef struct FNT_FontHashNode FNT_FontHashNode;\r\nstruct FNT_FontHashNode\r\n{\r\n  FNT_FontHashNode *hash_next;\r\n  FNT_Tag tag;\r\n  FP_Handle handle;\r\n  FP_Metrics metrics;\r\n  String8 path;\r\n};\r\n\r\ntypedef struct FNT_FontHashSlot FNT_FontHashSlot;\r\nstruct FNT_FontHashSlot\r\n{\r\n  FNT_FontHashNode *first;\r\n  FNT_FontHashNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Rasterization Cache Types\r\n\r\n//- rjf: base glyph rasterization / dimensions cache \r\n\r\ntypedef struct FNT_RasterCacheInfo FNT_RasterCacheInfo;\r\nstruct FNT_RasterCacheInfo\r\n{\r\n  Rng2S16 subrect;\r\n  Vec2S16 raster_dim;\r\n  S16 atlas_num;\r\n  F32 advance;\r\n};\r\n\r\ntypedef struct FNT_Hash2InfoRasterCacheNode FNT_Hash2InfoRasterCacheNode;\r\nstruct FNT_Hash2InfoRasterCacheNode\r\n{\r\n  FNT_Hash2InfoRasterCacheNode *hash_next;\r\n  FNT_Hash2InfoRasterCacheNode *hash_prev;\r\n  U64 hash;\r\n  FNT_RasterCacheInfo info;\r\n};\r\n\r\ntypedef struct FNT_Hash2InfoRasterCacheSlot FNT_Hash2InfoRasterCacheSlot;\r\nstruct FNT_Hash2InfoRasterCacheSlot\r\n{\r\n  FNT_Hash2InfoRasterCacheNode *first;\r\n  FNT_Hash2InfoRasterCacheNode *last;\r\n};\r\n\r\n//- rjf: run cache (arrangements of many glyphs to represent a full string)\r\n\r\ntypedef struct FNT_RunCacheNode FNT_RunCacheNode;\r\nstruct FNT_RunCacheNode\r\n{\r\n  FNT_RunCacheNode *next;\r\n  String8 string;\r\n  FNT_Run run;\r\n};\r\n\r\ntypedef struct FNT_RunCacheSlot FNT_RunCacheSlot;\r\nstruct FNT_RunCacheSlot\r\n{\r\n  FNT_RunCacheNode *first;\r\n  FNT_RunCacheNode *last;\r\n};\r\n\r\n//- rjf: style hash -> artifacts/metrics cache\r\n\r\ntypedef struct FNT_Hash2StyleRasterCacheNode FNT_Hash2StyleRasterCacheNode;\r\nstruct FNT_Hash2StyleRasterCacheNode\r\n{\r\n  FNT_Hash2StyleRasterCacheNode *hash_next;\r\n  FNT_Hash2StyleRasterCacheNode *hash_prev;\r\n  U64 style_hash;\r\n  F32 ascent;\r\n  F32 descent;\r\n  F32 column_width;\r\n  FNT_RasterCacheInfo *utf8_class1_direct_map;\r\n  U64 utf8_class1_direct_map_mask[4];\r\n  U64 hash2info_slots_count;\r\n  FNT_Hash2InfoRasterCacheSlot *hash2info_slots;\r\n  U64 run_slots_count;\r\n  FNT_RunCacheSlot *run_slots;\r\n  U64 run_slots_frame_index;\r\n};\r\n\r\ntypedef struct FNT_Hash2StyleRasterCacheSlot FNT_Hash2StyleRasterCacheSlot;\r\nstruct FNT_Hash2StyleRasterCacheSlot\r\n{\r\n  FNT_Hash2StyleRasterCacheNode *first;\r\n  FNT_Hash2StyleRasterCacheNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Atlas Types\r\n\r\ntypedef U32 FNT_AtlasRegionNodeFlags;\r\nenum\r\n{\r\n  FNT_AtlasRegionNodeFlag_Taken = (1<<0),\r\n};\r\n\r\ntypedef struct FNT_AtlasRegionNode FNT_AtlasRegionNode;\r\nstruct FNT_AtlasRegionNode\r\n{\r\n  FNT_AtlasRegionNode *parent;\r\n  FNT_AtlasRegionNode *children[Corner_COUNT];\r\n  Vec2S16 max_free_size[Corner_COUNT];\r\n  FNT_AtlasRegionNodeFlags flags;\r\n  U64 num_allocated_descendants;\r\n};\r\n\r\ntypedef struct FNT_Atlas FNT_Atlas;\r\nstruct FNT_Atlas\r\n{\r\n  FNT_Atlas *next;\r\n  FNT_Atlas *prev;\r\n  R_Handle texture;\r\n  Vec2S16 root_dim;\r\n  FNT_AtlasRegionNode *root;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Metrics\r\n\r\ntypedef struct FNT_Metrics FNT_Metrics;\r\nstruct FNT_Metrics\r\n{\r\n  F32 ascent;\r\n  F32 descent;\r\n  F32 line_gap;\r\n  F32 capital_height;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Type\r\n\r\ntypedef struct FNT_State FNT_State;\r\nstruct FNT_State\r\n{\r\n  Arena *permanent_arena;\r\n  Arena *raster_arena;\r\n  Arena *frame_arena;\r\n  U64 frame_index;\r\n  \r\n  // rjf: font table\r\n  U64 font_hash_table_size;\r\n  FNT_FontHashSlot *font_hash_table;\r\n  \r\n  // rjf: hash -> raster cache table\r\n  U64 hash2style_slots_count;\r\n  FNT_Hash2StyleRasterCacheSlot *hash2style_slots;\r\n  \r\n  // rjf: atlas list\r\n  FNT_Atlas *first_atlas;\r\n  FNT_Atlas *last_atlas;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal FNT_State *fnt_state = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Functions\r\n\r\ninternal U128 fnt_hash_from_string(String8 string);\r\ninternal U64 fnt_little_hash_from_string(U64 seed, String8 string);\r\ninternal Vec2S32 fnt_vertex_from_corner(Corner corner);\r\n\r\n////////////////////////////////\r\n//~ rjf: Font Tags\r\n\r\ninternal FNT_Tag fnt_tag_zero(void);\r\ninternal B32 fnt_tag_match(FNT_Tag a, FNT_Tag b);\r\ninternal FP_Handle fnt_handle_from_tag(FNT_Tag tag);\r\ninternal FP_Metrics fnt_fp_metrics_from_tag(FNT_Tag tag);\r\ninternal FNT_Tag fnt_tag_from_path(String8 path);\r\ninternal FNT_Tag fnt_tag_from_static_data_string(String8 *data_ptr);\r\ninternal String8 fnt_path_from_tag(FNT_Tag tag);\r\n\r\n////////////////////////////////\r\n//~ rjf: Atlas\r\n\r\ninternal Rng2S16 fnt_atlas_region_alloc(Arena *arena, FNT_Atlas *atlas, Vec2S16 needed_size);\r\ninternal void fnt_atlas_region_release(FNT_Atlas *atlas, Rng2S16 region);\r\n\r\n////////////////////////////////\r\n//~ rjf: Piece Type Functions\r\n\r\ninternal FNT_Piece *fnt_piece_chunk_list_push_new(Arena *arena, FNT_PieceChunkList *list, U64 cap);\r\ninternal void fnt_piece_chunk_list_push(Arena *arena, FNT_PieceChunkList *list, U64 cap, FNT_Piece *piece);\r\ninternal FNT_PieceArray fnt_piece_array_from_chunk_list(Arena *arena, FNT_PieceChunkList *list);\r\ninternal FNT_PieceArray fnt_piece_array_copy(Arena *arena, FNT_PieceArray *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Usage\r\n\r\n//- rjf: base cache lookups\r\ninternal FNT_Hash2StyleRasterCacheNode *fnt_hash2style_from_tag_size_flags(FNT_Tag tag, F32 size, FNT_RasterFlags flags);\r\ninternal FNT_Run fnt_run_from_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, FNT_RasterFlags flags, String8 string);\r\n\r\n//- rjf: helpers\r\ninternal String8List fnt_wrapped_string_lines_from_font_size_string_max(Arena *arena, FNT_Tag font, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 max);\r\ninternal Vec2F32 fnt_dim_from_tag_size_string(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string);\r\ninternal Vec2F32 fnt_dim_from_tag_size_string_list(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8List list);\r\ninternal F32 fnt_column_size_from_tag_size(FNT_Tag tag, F32 size);\r\ninternal U64 fnt_char_pos_from_tag_size_string_p(FNT_Tag tag, F32 size, F32 base_align_px, F32 tab_size_px, String8 string, F32 p);\r\n\r\n////////////////////////////////\r\n//~ rjf: Metrics\r\n\r\ninternal FNT_Metrics fnt_metrics_from_tag_size(FNT_Tag tag, F32 size);\r\ninternal F32 fnt_line_height_from_metrics(FNT_Metrics *metrics);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Calls\r\n\r\ninternal void fnt_init(void);\r\ninternal void fnt_reset(void);\r\ninternal void fnt_frame(void);\r\n\r\n#endif // FONT_CACHE_H\r\n"
  },
  {
    "path": "src/font_provider/dwrite/font_provider_dwrite.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal FP_DWrite_State *fp_dwrite_state = 0;\r\nglobal FP_DWrite_FontFileLoaderVTable fp_dwrite_static_data_font_file_loader__vtable =\r\n{\r\n  fp_dwrite_iunknown_noop__query_interface,\r\n  fp_dwrite_iunknown_noop__add_ref,\r\n  fp_dwrite_iunknown_noop__release,\r\n  fp_dwrite_static_font_file_loader__stream_from_key,\r\n};\r\nglobal FP_DWrite_FontFileLoader fp_dwrite_static_data_font_file_loader = {&fp_dwrite_static_data_font_file_loader__vtable};\r\nglobal FP_DWrite_FontFileStreamVTable fp_dwrite_static_data_font_file_stream__vtable =\r\n{\r\n  fp_dwrite_iunknown_noop__query_interface,\r\n  fp_dwrite_iunknown_noop__add_ref,\r\n  fp_dwrite_iunknown_noop__release,\r\n  fp_dwrite_static_font_file_stream__read_file_fragment,\r\n  fp_dwrite_static_font_file_stream__release_file_fragment,\r\n  fp_dwrite_static_font_file_stream__get_file_size,\r\n  fp_dwrite_static_font_file_stream__get_last_write_time,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\n//- rjf: handle conversion functions\r\n\r\ninternal FP_DWrite_Font\r\nfp_dwrite_font_from_handle(FP_Handle handle)\r\n{\r\n  FP_DWrite_Font result = {0};\r\n  result.file = (IDWriteFontFile *)handle.u64[0];\r\n  result.face = (IDWriteFontFace *)handle.u64[1];\r\n  return result;\r\n}\r\n\r\ninternal FP_Handle\r\nfp_dwrite_handle_from_font(FP_DWrite_Font font)\r\n{\r\n  FP_Handle result = {0};\r\n  result.u64[0] = (U64)font.file;\r\n  result.u64[1] = (U64)font.face;\r\n  return result;\r\n}\r\n\r\n//- rjf: file stream allocator\r\n\r\ninternal FP_DWrite_FontFileStreamNode *\r\nfp_dwrite_font_file_stream_node_alloc(String8 *data_ptr)\r\n{\r\n  FP_DWrite_FontFileStreamNode *node = 0;\r\n  for(FP_DWrite_FontFileStreamNode *n = fp_dwrite_state->first_stream_node; n != 0; n = n->next)\r\n  {\r\n    if(n->stream.data == data_ptr)\r\n    {\r\n      node = n;\r\n      break;\r\n    }\r\n  }\r\n  if(node == 0)\r\n  {\r\n    node = fp_dwrite_state->free_stream_node;\r\n    if(node != 0)\r\n    {\r\n      SLLStackPop(fp_dwrite_state->free_stream_node);\r\n    }\r\n    else\r\n    {\r\n      node = push_array_no_zero(fp_dwrite_state->arena, FP_DWrite_FontFileStreamNode, 1);\r\n    }\r\n    MemoryZeroStruct(node);\r\n    node->stream.lpVtbl = &fp_dwrite_static_data_font_file_stream__vtable;\r\n    node->stream.data = data_ptr;\r\n    DLLPushBack(fp_dwrite_state->first_stream_node, fp_dwrite_state->last_stream_node, node);\r\n  }\r\n  return node;\r\n}\r\n\r\ninternal void\r\nfp_dwrite_font_file_stream_node_release(FP_DWrite_FontFileStreamNode *node)\r\n{\r\n  DLLPushBack(fp_dwrite_state->first_stream_node, fp_dwrite_state->last_stream_node, node);\r\n  SLLStackPush(fp_dwrite_state->free_stream_node, node);\r\n}\r\n\r\n//- rjf: iunknown no-op helpers\r\n\r\ninternal HRESULT\r\nfp_dwrite_iunknown_noop__query_interface(void *obj, REFIID riid, void *ptr_to_object)\r\n{\r\n  return E_NOINTERFACE;\r\n}\r\n\r\ninternal ULONG\r\nfp_dwrite_iunknown_noop__add_ref(void *obj)\r\n{\r\n  ULONG result = 1;\r\n  return result;\r\n}\r\n\r\ninternal ULONG\r\nfp_dwrite_iunknown_noop__release(void *obj)\r\n{\r\n  ULONG result = 1;\r\n  return result;\r\n}\r\n\r\n//- rjf: font file loader interface function implementations\r\n\r\ninternal HRESULT\r\nfp_dwrite_static_font_file_loader__stream_from_key(FP_DWrite_FontFileLoader *obj, void const *font_file_ref_key, UINT32 font_file_ref_key_size, IDWriteFontFileStream **stream_out)\r\n{\r\n  HRESULT result = S_OK;\r\n  String8 *key = *(String8 **)font_file_ref_key;\r\n  FP_DWrite_FontFileStreamNode *node = fp_dwrite_font_file_stream_node_alloc(key);\r\n  *stream_out = (IDWriteFontFileStream *)&node->stream;\r\n  return result;\r\n}\r\n\r\n//- rjf: font file stream  interface function implementations\r\n\r\ninternal HRESULT\r\nfp_dwrite_static_font_file_stream__read_file_fragment(FP_DWrite_FontFileStream *obj, void const **fragment_start, UINT64 file_offset, UINT64 fragment_size, void **fragment_context)\r\n{\r\n  HRESULT result = S_OK;\r\n  *fragment_start = obj->data->str + file_offset;\r\n  *fragment_context = 0;\r\n  return result;\r\n}\r\n\r\ninternal HRESULT\r\nfp_dwrite_static_font_file_stream__release_file_fragment(FP_DWrite_FontFileStream *obj, void *fragment_context)\r\n{\r\n  HRESULT result = S_OK;\r\n  return result;\r\n}\r\n\r\ninternal HRESULT\r\nfp_dwrite_static_font_file_stream__get_file_size(FP_DWrite_FontFileStream *obj, UINT64 *size_out)\r\n{\r\n  HRESULT result = S_OK;\r\n  *size_out = obj->data->size;\r\n  return result;\r\n}\r\n\r\ninternal HRESULT\r\nfp_dwrite_static_font_file_stream__get_last_write_time(FP_DWrite_FontFileStream *obj, UINT64 *time_out)\r\n{\r\n  HRESULT result = S_OK;\r\n  *time_out = 0;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Implementations\r\n\r\nfp_hook void\r\nfp_init(void)\r\n{\r\n  ProfBeginFunction();\r\n  HRESULT error = 0;\r\n  \r\n  //- rjf: initialize main state\r\n  {\r\n    Arena *arena = arena_alloc();\r\n    fp_dwrite_state = push_array(arena, FP_DWrite_State, 1);\r\n    fp_dwrite_state->arena = arena;\r\n  }\r\n  \r\n  //- rjf: make dwrite factory\r\n  error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory2, (void **)&fp_dwrite_state->factory);\r\n  if(error == S_OK)\r\n  {\r\n    fp_dwrite_state->dwrite2_is_supported = 1;\r\n  }\r\n  else\r\n  {\r\n    error = DWriteCreateFactory(DWRITE_FACTORY_TYPE_SHARED, &IID_IDWriteFactory, (void **)&fp_dwrite_state->factory);\r\n  }\r\n  \r\n  //- rjf: register static data font \"loader\" interface\r\n  error = IDWriteFactory_RegisterFontFileLoader(fp_dwrite_state->factory, (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader);\r\n  \r\n  //- rjf: make base rendering params\r\n  error = IDWriteFactory_CreateRenderingParams(fp_dwrite_state->factory, &fp_dwrite_state->base_rendering_params);\r\n  \r\n  //- rjf: make sharp-hinted rendering params\r\n  {\r\n    FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params);\r\n    gamma = 1.f;\r\n    FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params);\r\n    if(fp_dwrite_state->dwrite2_is_supported)\r\n    {\r\n      error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory,\r\n                                                           gamma,\r\n                                                           enhanced_contrast,\r\n                                                           enhanced_contrast,\r\n                                                           0.f,\r\n                                                           DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                           DWRITE_RENDERING_MODE_GDI_NATURAL,\r\n                                                           DWRITE_GRID_FIT_MODE_ENABLED,\r\n                                                           (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_sharp_hinted);\r\n    }\r\n    else\r\n    {\r\n      error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory,\r\n                                                         gamma,\r\n                                                         enhanced_contrast,\r\n                                                         0.f,\r\n                                                         DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                         DWRITE_RENDERING_MODE_GDI_NATURAL,\r\n                                                         &fp_dwrite_state->rendering_params_sharp_hinted);\r\n    }\r\n  }\r\n  \r\n  //- rjf: make sharp-unhinted rendering params\r\n  {\r\n    FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params);\r\n    gamma = 1.f;\r\n    FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params);\r\n    if(fp_dwrite_state->dwrite2_is_supported)\r\n    {\r\n      error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory,\r\n                                                           gamma,\r\n                                                           enhanced_contrast,\r\n                                                           enhanced_contrast,\r\n                                                           0.f,\r\n                                                           DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                           DWRITE_RENDERING_MODE_GDI_NATURAL,\r\n                                                           DWRITE_GRID_FIT_MODE_DISABLED,\r\n                                                           (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_sharp_unhinted);\r\n    }\r\n    else\r\n    {\r\n      error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory,\r\n                                                         gamma,\r\n                                                         enhanced_contrast,\r\n                                                         0.f,\r\n                                                         DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                         DWRITE_RENDERING_MODE_GDI_NATURAL,\r\n                                                         &fp_dwrite_state->rendering_params_sharp_unhinted);\r\n    }\r\n  }\r\n  \r\n  //- rjf: make smooth-hinted rendering params\r\n  {\r\n    FLOAT gamma = IDWriteRenderingParams_GetGamma(fp_dwrite_state->base_rendering_params);\r\n    gamma = 1.f;\r\n    FLOAT enhanced_contrast = IDWriteRenderingParams_GetEnhancedContrast(fp_dwrite_state->base_rendering_params);\r\n    if(fp_dwrite_state->dwrite2_is_supported)\r\n    {\r\n      error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory,\r\n                                                           gamma,\r\n                                                           enhanced_contrast,\r\n                                                           enhanced_contrast,\r\n                                                           0.f,\r\n                                                           DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                           DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,\r\n                                                           DWRITE_GRID_FIT_MODE_ENABLED,\r\n                                                           (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_smooth_hinted);\r\n    }\r\n    else\r\n    {\r\n      error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory,\r\n                                                         gamma,\r\n                                                         enhanced_contrast,\r\n                                                         0.f,\r\n                                                         DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                         DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,\r\n                                                         &fp_dwrite_state->rendering_params_smooth_hinted);\r\n    }\r\n  }\r\n  \r\n  //- rjf: make smooth rendering params\r\n  {\r\n    FLOAT gamma = 1.f;\r\n    FLOAT enhanced_contrast = 0.f;\r\n    if(fp_dwrite_state->dwrite2_is_supported)\r\n    {\r\n      error = IDWriteFactory2_CreateCustomRenderingParams2((IDWriteFactory2 *)fp_dwrite_state->factory,\r\n                                                           gamma,\r\n                                                           enhanced_contrast,\r\n                                                           enhanced_contrast,\r\n                                                           0.f,\r\n                                                           DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                           DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,\r\n                                                           DWRITE_GRID_FIT_MODE_DISABLED,\r\n                                                           (IDWriteRenderingParams2 **)&fp_dwrite_state->rendering_params_smooth_unhinted);\r\n    }\r\n    else\r\n    {\r\n      error = IDWriteFactory_CreateCustomRenderingParams(fp_dwrite_state->factory,\r\n                                                         gamma,\r\n                                                         enhanced_contrast,\r\n                                                         0.f,\r\n                                                         DWRITE_PIXEL_GEOMETRY_FLAT,\r\n                                                         DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,\r\n                                                         &fp_dwrite_state->rendering_params_smooth_unhinted);\r\n    }\r\n  }\r\n  \r\n  //- rjf: make dwrite gdi interop\r\n  error = IDWriteFactory_GetGdiInterop(fp_dwrite_state->factory, &fp_dwrite_state->gdi_interop);\r\n  \r\n  //- rjf: build render target for rasterization\r\n  fp_dwrite_state->bitmap_render_target_dim = v2s32(2048, 256);\r\n  error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, fp_dwrite_state->bitmap_render_target_dim.x, fp_dwrite_state->bitmap_render_target_dim.y, &fp_dwrite_state->bitmap_render_target);\r\n  IDWriteBitmapRenderTarget_SetPixelsPerDip(fp_dwrite_state->bitmap_render_target, 1.0);\r\n  ProfEnd();\r\n}\r\n\r\nfp_hook FP_Handle\r\nfp_font_open(String8 path)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  FP_DWrite_Font font = {0};\r\n  HRESULT error = 0;\r\n  \r\n  //- rjf: build initial path task\r\n  typedef struct PathTask PathTask;\r\n  struct PathTask\r\n  {\r\n    PathTask *next;\r\n    String8 path;\r\n  };\r\n  PathTask start_task = {0, path};\r\n  PathTask *first_task = &start_task;\r\n  PathTask *last_task = first_task;\r\n  \r\n  //- rjf: try to open font\r\n  for(PathTask *t = first_task; t != 0 && font.file == 0; t = t->next)\r\n  {\r\n    B32 file_exists = (os_properties_from_file_path(t->path).created != 0);\r\n    String16 path16 = str16_from_8(scratch.arena, t->path);\r\n    if(file_exists)\r\n    {\r\n      error = IDWriteFactory_CreateFontFileReference(fp_dwrite_state->factory, (WCHAR *)path16.str, 0, &font.file);\r\n    }\r\n    if(font.file != 0)\r\n    {\r\n      error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face);\r\n    }\r\n    \r\n    // rjf: failure trying just the normal path? -> generate new tasks that search in system folders\r\n    if(t == first_task && font.file == 0 && t->path.size != 0)\r\n    {\r\n      // rjf: generate task for user-installed fonts\r\n      {\r\n        HKEY reg_key = 0;\r\n        LSTATUS status = 0;\r\n        char name[256] = {0};\r\n        char data[256] = {0};\r\n        DWORD name_size = sizeof(name);\r\n        DWORD data_size = sizeof(data);\r\n        DWORD type = 0;\r\n        status = RegOpenKeyExW(HKEY_CURRENT_USER, L\"Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\Explorer\\\\Shell Folders\\\\Fonts\", 0, KEY_QUERY_VALUE, &reg_key);\r\n        status = RegEnumValueA(reg_key, 0, name, &name_size, 0, &type, (unsigned char *)data, &data_size);\r\n        String8 user_fonts_path = str8_cstring(data);\r\n        PathTask *task = push_array(scratch.arena, PathTask, 1);\r\n        task->path = push_str8f(scratch.arena, \"%s/%S\", user_fonts_path, path);\r\n        SLLQueuePush(first_task, last_task, task);\r\n      }\r\n      \r\n      // rjf: generate task for windows directory (C:/Windows/Fonts, generally)\r\n      {\r\n        char windows_path[256] = {0};\r\n        GetWindowsDirectoryA(windows_path, sizeof(windows_path));\r\n        PathTask *task = push_array(scratch.arena, PathTask, 1);\r\n        task->path = push_str8f(scratch.arena, \"%s/Fonts/%S\", windows_path, path);\r\n        SLLQueuePush(first_task, last_task, task);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: handlify & return\r\n  FP_Handle handle = {0};\r\n  if(font.file != 0)\r\n  {\r\n    handle = fp_dwrite_handle_from_font(font);\r\n  }\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return handle;\r\n}\r\n\r\nfp_hook FP_Handle\r\nfp_font_open_from_static_data_string(String8 *data_ptr)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  FP_DWrite_Font font = {0};\r\n  HRESULT error = 0;\r\n  \r\n  //- rjf: open font file reference\r\n  error = IDWriteFactory_CreateCustomFontFileReference(fp_dwrite_state->factory, &data_ptr, sizeof(String8 *), (IDWriteFontFileLoader *)&fp_dwrite_static_data_font_file_loader, &font.file);\r\n  \r\n  //- rjf: open font face\r\n  error = IDWriteFactory_CreateFontFace(fp_dwrite_state->factory, DWRITE_FONT_FACE_TYPE_TRUETYPE, 1, &font.file, 0, DWRITE_FONT_SIMULATIONS_NONE, &font.face);\r\n  \r\n  //- rjf: handlify & return\r\n  FP_Handle handle = fp_dwrite_handle_from_font(font);\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return handle;\r\n}\r\n\r\nfp_hook void\r\nfp_font_close(FP_Handle handle)\r\n{\r\n  ProfBeginFunction();\r\n  FP_DWrite_Font font = fp_dwrite_font_from_handle(handle);\r\n  if(font.face != 0)\r\n  {\r\n    IDWriteFontFace_Release(font.face);\r\n  }\r\n  if(font.file != 0)\r\n  {\r\n    IDWriteFontFile_Release(font.file);\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\nfp_hook FP_Metrics\r\nfp_metrics_from_font(FP_Handle handle)\r\n{\r\n  ProfBeginFunction();\r\n  FP_DWrite_Font font = fp_dwrite_font_from_handle(handle);\r\n  DWRITE_FONT_METRICS metrics = {0};\r\n  if(font.face != 0)\r\n  {\r\n    IDWriteFontFace_GetMetrics(font.face, &metrics);\r\n  }\r\n  FP_Metrics result = {0};\r\n  {\r\n    result.design_units_per_em = (F32)metrics.designUnitsPerEm;\r\n    result.ascent  = (F32)metrics.ascent;\r\n    result.descent = (F32)metrics.descent;\r\n    result.line_gap = (F32)metrics.lineGap;\r\n    result.capital_height = (F32)metrics.capHeight;\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\nfp_hook NO_ASAN FP_RasterResult\r\nfp_raster(Arena *arena, FP_Handle font_handle, F32 size, FP_RasterFlags flags, String8 string)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  HRESULT error = 0;\r\n  String32 string32 = str32_from_8(scratch.arena, string);\r\n  FP_DWrite_Font font = fp_dwrite_font_from_handle(font_handle);\r\n  COLORREF bg_color = RGB(0,   0,   0);\r\n  COLORREF fg_color = RGB(255, 255, 255);\r\n  \r\n  //- rjf: get font metrics\r\n  DWRITE_FONT_METRICS font_metrics = {0};\r\n  if(font.face != 0)\r\n  {\r\n    IDWriteFontFace_GetMetrics(font.face, &font_metrics);\r\n  }\r\n  F32 design_units_per_em = (F32)font_metrics.designUnitsPerEm;\r\n  \r\n  //- rjf: get glyph indices\r\n  U16 *glyph_indices = push_array_no_zero(scratch.arena, U16, string32.size);\r\n  if(font.face != 0)\r\n  {\r\n    error = IDWriteFontFace_GetGlyphIndices(font.face, string32.str, string32.size, glyph_indices);\r\n  }\r\n  \r\n  //- rjf: get metrics info\r\n  U64 glyphs_count = string32.size;\r\n  DWRITE_GLYPH_METRICS *glyphs_metrics = push_array_no_zero(scratch.arena, DWRITE_GLYPH_METRICS, glyphs_count);\r\n  if(font.face != 0)\r\n  {\r\n    error = IDWriteFontFace_GetGdiCompatibleGlyphMetrics(font.face, (96.f/72.f)*size, 1.f, 0, 1, glyph_indices, glyphs_count, glyphs_metrics, 0);\r\n  }\r\n  \r\n  //- rjf: derive info from metrics\r\n  F32 advance = 0;\r\n  Vec2S16 atlas_dim = {0};\r\n  F32 left_side_bearing = 0;\r\n  F32 right_side_bearing = 0;\r\n  if(font.face != 0)\r\n  {\r\n    atlas_dim.y = (S16)round_f32((96.f/72.f) * size * (font_metrics.ascent + font_metrics.descent + font_metrics.lineGap) / design_units_per_em) + 1;\r\n    for(U64 idx = 0; idx < glyphs_count; idx += 1)\r\n    {\r\n      DWRITE_GLYPH_METRICS *glyph_metrics = glyphs_metrics + idx;\r\n      F32 glyph_advance_width         = (96.f/72.f) * size * glyph_metrics->advanceWidth       / design_units_per_em;\r\n      advance += glyph_advance_width;\r\n      atlas_dim.x = Max(atlas_dim.x, (S16)(advance+1));\r\n      if(idx == 0)\r\n      {\r\n        left_side_bearing = (96.f/72.f) * size * glyph_metrics->leftSideBearing    / design_units_per_em;\r\n      }\r\n      if(idx+1 == glyphs_count)\r\n      {\r\n        right_side_bearing = (96.f/72.f) * size * glyph_metrics->rightSideBearing   / design_units_per_em;\r\n      }\r\n    }\r\n    atlas_dim.x -= right_side_bearing;\r\n    atlas_dim.x += 2;\r\n    atlas_dim.x += 7;\r\n    atlas_dim.x -= atlas_dim.x%8;\r\n  }\r\n  \r\n  //- rjf: make dwrite bitmap for rendering\r\n  IDWriteBitmapRenderTarget *render_target = 0;\r\n  if(font.face != 0)\r\n  {\r\n    error = IDWriteGdiInterop_CreateBitmapRenderTarget(fp_dwrite_state->gdi_interop, 0, atlas_dim.x, atlas_dim.y, &render_target);\r\n    IDWriteBitmapRenderTarget_SetPixelsPerDip(render_target, 1.f);\r\n  }\r\n  \r\n  //- rjf: get bitmap & clear\r\n  HDC dc = 0;\r\n  if(font.face != 0)\r\n  {\r\n    dc = IDWriteBitmapRenderTarget_GetMemoryDC(render_target);\r\n    HGDIOBJ original = SelectObject(dc, GetStockObject(DC_PEN));\r\n    SetDCPenColor(dc, bg_color);\r\n    SelectObject(dc, GetStockObject(DC_BRUSH));\r\n    SetDCBrushColor(dc, bg_color);\r\n    Rectangle(dc, 0, 0, atlas_dim.x, atlas_dim.y);\r\n    SelectObject(dc, original);\r\n  }\r\n  \r\n  //- rjf: draw glyph run\r\n  Vec2F32 draw_p = {0, (F32)atlas_dim.y};\r\n  if(font.face != 0)\r\n  {\r\n    F32 descent = round_f32((96.f/72.f)*size * font_metrics.descent / design_units_per_em);\r\n    F32 line_gap = round_f32((96.f/72.f)*size * font_metrics.lineGap / design_units_per_em);\r\n    draw_p.y -= descent;\r\n    draw_p.y -= line_gap;\r\n  }\r\n  DWRITE_GLYPH_RUN glyph_run = {0};\r\n  if(font.face != 0)\r\n  {\r\n    glyph_run.fontFace = font.face;\r\n    glyph_run.fontEmSize = size * 96.f/72.f;\r\n    glyph_run.glyphCount = string32.size;\r\n    glyph_run.glyphIndices = glyph_indices;\r\n  }\r\n  RECT bounding_box = {0};\r\n  if(font.face != 0)\r\n  {\r\n    IDWriteRenderingParams *rendering_params = fp_dwrite_state->rendering_params_sharp_hinted;\r\n    switch(flags)\r\n    {\r\n      default:{}break;\r\n      case 0:{rendering_params = fp_dwrite_state->rendering_params_sharp_unhinted;}break;\r\n      case FP_RasterFlag_Hinted:{rendering_params = fp_dwrite_state->rendering_params_sharp_hinted;}break;\r\n      case FP_RasterFlag_Smooth:{rendering_params = fp_dwrite_state->rendering_params_smooth_unhinted;}break;\r\n      case FP_RasterFlag_Smooth|FP_RasterFlag_Hinted:{rendering_params = fp_dwrite_state->rendering_params_smooth_hinted;}break;\r\n    }\r\n    error = IDWriteBitmapRenderTarget_DrawGlyphRun(render_target, draw_p.x, draw_p.y,\r\n                                                   DWRITE_MEASURING_MODE_NATURAL,\r\n                                                   &glyph_run,\r\n                                                   rendering_params,\r\n                                                   fg_color,\r\n                                                   &bounding_box);\r\n  }\r\n  \r\n  //- rjf: get bitmap\r\n  DIBSECTION dib = {0};\r\n  if(font.face != 0)\r\n  {\r\n    HBITMAP bitmap = (HBITMAP)GetCurrentObject(dc, OBJ_BITMAP);\r\n    GetObject(bitmap, sizeof(dib), &dib);\r\n  }\r\n  \r\n  //- rjf: fill & return\r\n  FP_RasterResult result = {0};\r\n  if(font.face != 0)\r\n  {\r\n    // rjf: fill basics\r\n    result.atlas_dim    = atlas_dim;\r\n    result.atlas        = push_array_no_zero(arena, U8, atlas_dim.x*atlas_dim.y*4);\r\n    result.advance      = floor_f32(advance);\r\n    \r\n    // rjf: fill atlas\r\n    {\r\n      U8 *in_data   = (U8 *)dib.dsBm.bmBits;\r\n      U64 in_pitch  = (U64)dib.dsBm.bmWidthBytes;\r\n      U8 *out_data  = (U8 *)result.atlas;\r\n      U64 out_pitch = atlas_dim.x * 4;\r\n      U64 color_sum = 0;\r\n      U8 *in_line = (U8 *)in_data;\r\n      U8 *out_line = out_data;\r\n      for(U64 y = 0; y < atlas_dim.y; y += 1)\r\n      {\r\n        U8 *in_pixel = in_line;\r\n        U8 *out_pixel = out_line;\r\n        for(U64 x = 0; x < atlas_dim.x; x += 1)\r\n        {\r\n          U8 in_pixel_byte = in_pixel[0];\r\n          out_pixel[0] = 255;\r\n          out_pixel[1] = 255;\r\n          out_pixel[2] = 255;\r\n          out_pixel[3] = in_pixel_byte;\r\n          color_sum += in_pixel_byte;\r\n          in_pixel += 4;\r\n          out_pixel += 4;\r\n        }\r\n        in_line += in_pitch;\r\n        out_line += out_pitch;\r\n      }\r\n      if(color_sum == 0)\r\n      {\r\n        result.atlas_dim = v2s16(0, 0);\r\n      }\r\n    }\r\n    IDWriteBitmapRenderTarget_Release(render_target);\r\n  }\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/font_provider/dwrite/font_provider_dwrite.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef FONT_PROVIDER_DWRITE_H\n#define FONT_PROVIDER_DWRITE_H\n\n#pragma comment(lib, \"gdi32.lib\")\n#pragma comment(lib, \"dwrite.lib\")\n\n// #include <dwrite.h>\n\n////////////////////////////////\n//~ rjf: (C) DirectWrite Definitions\n//\n// (courtesy of mmozeiko, Martins Mozeiko, https://github.com/mmozeiko/c_d2d_dwrite)\n//\n// This is free and unencumbered software released into the public domain.\n//\n// Anyone is free to copy, modify, publish, use, compile, sell, or\n// distribute this software, either in source code form or as a compiled\n// binary, for any purpose, commercial or non-commercial, and by any\n// means.\n//\n// In jurisdictions that recognize copyright laws, the author or authors\n// of this software dedicate any and all copyright interest in the\n// software to the public domain. We make this dedication for the benefit\n// of the public at large and to the detriment of our heirs and\n// successors. We intend this dedication to be an overt act of\n// relinquishment in perpetuity of all present and future rights to this\n// software under copyright law.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\n// IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n// OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n// ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n// OTHER DEALINGS IN THE SOFTWARE.\n//\n// For more information, please refer to <https://unlicense.org>\n\n#include <combaseapi.h>\n#include <dcommon.h>\n#include <initguid.h>\n\n//- rjf: enums\n\ntypedef enum DWRITE_FACTORY_TYPE {\n  DWRITE_FACTORY_TYPE_SHARED   = 0,\n  DWRITE_FACTORY_TYPE_ISOLATED = 1,\n} DWRITE_FACTORY_TYPE;\n\ntypedef enum DWRITE_PIXEL_GEOMETRY {\n  DWRITE_PIXEL_GEOMETRY_FLAT = 0,\n  DWRITE_PIXEL_GEOMETRY_RGB  = 1,\n  DWRITE_PIXEL_GEOMETRY_BGR  = 2,\n} DWRITE_PIXEL_GEOMETRY;\n\ntypedef enum DWRITE_RENDERING_MODE {\n  DWRITE_RENDERING_MODE_DEFAULT                     = 0,\n  DWRITE_RENDERING_MODE_ALIASED                     = 1,\n  DWRITE_RENDERING_MODE_GDI_CLASSIC                 = 2,\n  DWRITE_RENDERING_MODE_GDI_NATURAL                 = 3,\n  DWRITE_RENDERING_MODE_NATURAL                     = 4,\n  DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC           = 5,\n  DWRITE_RENDERING_MODE_OUTLINE                     = 6,\n  DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC       = 2,\n  DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL       = 3,\n  DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL           = 4,\n  DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC = 5,\n} DWRITE_RENDERING_MODE;\n\ntypedef enum DWRITE_FONT_SIMULATIONS {\n  DWRITE_FONT_SIMULATIONS_NONE    = 0,\n  DWRITE_FONT_SIMULATIONS_BOLD    = 1,\n  DWRITE_FONT_SIMULATIONS_OBLIQUE = 2,\n} DWRITE_FONT_SIMULATIONS;\n\ntypedef enum DWRITE_FONT_FACE_TYPE {\n  DWRITE_FONT_FACE_TYPE_CFF                 = 0,\n  DWRITE_FONT_FACE_TYPE_TRUETYPE            = 1,\n  DWRITE_FONT_FACE_TYPE_OPENTYPE_COLLECTION = 2,\n  DWRITE_FONT_FACE_TYPE_TYPE1               = 3,\n  DWRITE_FONT_FACE_TYPE_VECTOR              = 4,\n  DWRITE_FONT_FACE_TYPE_BITMAP              = 5,\n  DWRITE_FONT_FACE_TYPE_UNKNOWN             = 6,\n  DWRITE_FONT_FACE_TYPE_RAW_CFF             = 7,\n  DWRITE_FONT_FACE_TYPE_TRUETYPE_COLLECTION = 2,\n} DWRITE_FONT_FACE_TYPE;\n\ntypedef enum DWRITE_GRID_FIT_MODE {\n  DWRITE_GRID_FIT_MODE_DEFAULT  = 0,\n  DWRITE_GRID_FIT_MODE_DISABLED = 1,\n  DWRITE_GRID_FIT_MODE_ENABLED  = 2,\n} DWRITE_GRID_FIT_MODE;\n\n//- rjf: interfaces\n\ntypedef struct IDWriteFactory                  { struct { void* tbl[]; }* v; } IDWriteFactory;\ntypedef struct IDWriteFactory1                 { struct { void* tbl[]; }* v; } IDWriteFactory1;\ntypedef struct IDWriteFactory2                 { struct { void* tbl[]; }* v; } IDWriteFactory2;\ntypedef struct IDWriteRenderingParams          { struct { void* tbl[]; }* v; } IDWriteRenderingParams;\ntypedef struct IDWriteRenderingParams1         { struct { void* tbl[]; }* v; } IDWriteRenderingParams1;\ntypedef struct IDWriteRenderingParams2         { struct { void* tbl[]; }* v; } IDWriteRenderingParams2;\ntypedef struct IDWriteFontFileLoader           { struct { void* tbl[]; }* v; } IDWriteFontFileLoader;\ntypedef struct IDWriteFontFileStream           { struct { void* tbl[]; }* v; } IDWriteFontFileStream;\ntypedef struct IDWriteFontFile                 { struct { void* tbl[]; }* v; } IDWriteFontFile;\ntypedef struct IDWriteFontFace                 { struct { void* tbl[]; }* v; } IDWriteFontFace;\ntypedef struct IDWriteFontFace1                { struct { void* tbl[]; }* v; } IDWriteFontFace1;\ntypedef struct IDWriteFontFace2                { struct { void* tbl[]; }* v; } IDWriteFontFace2;\ntypedef struct IDWriteGdiInterop               { struct { void* tbl[]; }* v; } IDWriteGdiInterop;\ntypedef struct IDWriteBitmapRenderTarget       { struct { void* tbl[]; }* v; } IDWriteBitmapRenderTarget;\ntypedef struct IDWriteBitmapRenderTarget1      { struct { void* tbl[]; }* v; } IDWriteBitmapRenderTarget1;\n\n//- rjf: structs\n\ntypedef struct DWRITE_GLYPH_METRICS {\n  INT32  leftSideBearing;\n  UINT32 advanceWidth;\n  INT32  rightSideBearing;\n  INT32  topSideBearing;\n  UINT32 advanceHeight;\n  INT32  bottomSideBearing;\n  INT32  verticalOriginY;\n} DWRITE_GLYPH_METRICS;\n\ntypedef struct DWRITE_GLYPH_OFFSET {\n  FLOAT advanceOffset;\n  FLOAT ascenderOffset;\n} DWRITE_GLYPH_OFFSET;\n\ntypedef struct DWRITE_GLYPH_RUN {\n  IDWriteFontFace*     fontFace;\n  FLOAT                fontEmSize;\n  UINT32               glyphCount;\n  UINT16*              glyphIndices;\n  FLOAT*               glyphAdvances;\n  DWRITE_GLYPH_OFFSET* glyphOffsets;\n  BOOL                 isSideways;\n  UINT32               bidiLevel;\n} DWRITE_GLYPH_RUN;\n\ntypedef struct DWRITE_FONT_METRICS {\n  UINT16 designUnitsPerEm;\n  UINT16 ascent;\n  UINT16 descent;\n  INT16  lineGap;\n  UINT16 capHeight;\n  UINT16 xHeight;\n  INT16  underlinePosition;\n  UINT16 underlineThickness;\n  INT16  strikethroughPosition;\n  UINT16 strikethroughThickness;\n} DWRITE_FONT_METRICS;\n\ntypedef struct DWRITE_MATRIX {\n  FLOAT m11;\n  FLOAT m12;\n  FLOAT m21;\n  FLOAT m22;\n  FLOAT dx;\n  FLOAT dy;\n} DWRITE_MATRIX;\n\n//- rjf: GUIDs\n\nDEFINE_GUID(IID_IDWriteFactory,                  0xb859ee5a, 0xd838, 0x4b5b, 0xa2, 0xe8, 0x1a, 0xdc, 0x7d, 0x93, 0xdb, 0x48);\nDEFINE_GUID(IID_IDWriteFactory1,                 0x30572f99, 0xdac6, 0x41db, 0xa1, 0x6e, 0x04, 0x86, 0x30, 0x7e, 0x60, 0x6a);\nDEFINE_GUID(IID_IDWriteFactory2,                 0x0439fc60, 0xca44, 0x4994, 0x8d, 0xee, 0x3a, 0x9a, 0xf7, 0xb7, 0x32, 0xec);\n\n//- rjf: functions\n\nEXTERN_C HRESULT DECLSPEC_IMPORT WINAPI DWriteCreateFactory (DWRITE_FACTORY_TYPE factoryType, const GUID* iid, void** factory);\n\n//- rjf: methods\n\nstatic inline HRESULT                           IDWriteFactory_RegisterFontFileLoader                        (IDWriteFactory* this_, IDWriteFontFileLoader* fontFileLoader) { return ((HRESULT (WINAPI*)(IDWriteFactory*, IDWriteFontFileLoader*))this_->v->tbl[13])(this_, fontFileLoader); }\nstatic inline HRESULT                           IDWriteFactory_CreateRenderingParams                         (IDWriteFactory* this_, IDWriteRenderingParams** renderingParams) { return ((HRESULT (WINAPI*)(IDWriteFactory*, IDWriteRenderingParams**))this_->v->tbl[10])(this_, renderingParams); }\nstatic inline HRESULT                           IDWriteFactory_CreateCustomRenderingParams                   (IDWriteFactory* this_, FLOAT gamma, FLOAT enhancedContrast, FLOAT clearTypeLevel, DWRITE_PIXEL_GEOMETRY pixelGeometry, DWRITE_RENDERING_MODE renderingMode, IDWriteRenderingParams** renderingParams) { return ((HRESULT (WINAPI*)(IDWriteFactory*, FLOAT, FLOAT, FLOAT, DWRITE_PIXEL_GEOMETRY, DWRITE_RENDERING_MODE, IDWriteRenderingParams**))this_->v->tbl[12])(this_, gamma, enhancedContrast, clearTypeLevel, pixelGeometry, renderingMode, renderingParams); }\nstatic inline HRESULT                           IDWriteFactory_GetGdiInterop                                 (IDWriteFactory* this_, IDWriteGdiInterop** gdiInterop) { return ((HRESULT (WINAPI*)(IDWriteFactory*, IDWriteGdiInterop**))this_->v->tbl[17])(this_, gdiInterop); }\nstatic inline HRESULT                           IDWriteFactory_CreateCustomFontFileReference                 (IDWriteFactory* this_, const void* fontFileReferenceKey, UINT32 fontFileReferenceKeySize, IDWriteFontFileLoader* fontFileLoader, IDWriteFontFile** fontFile) { return ((HRESULT (WINAPI*)(IDWriteFactory*, const void*, UINT32, IDWriteFontFileLoader*, IDWriteFontFile**))this_->v->tbl[8])(this_, fontFileReferenceKey, fontFileReferenceKeySize, fontFileLoader, fontFile); }\nstatic inline HRESULT                           IDWriteFactory_CreateFontFileReference                       (IDWriteFactory* this_, const WCHAR* filePath, const FILETIME* lastWriteTime, IDWriteFontFile** fontFile) { return ((HRESULT (WINAPI*)(IDWriteFactory*, const WCHAR*, const FILETIME*, IDWriteFontFile**))this_->v->tbl[7])(this_, filePath, lastWriteTime, fontFile); }\nstatic inline HRESULT                           IDWriteFactory_CreateFontFace                                (IDWriteFactory* this_, DWRITE_FONT_FACE_TYPE fontFaceType, UINT32 numberOfFiles, IDWriteFontFile** fontFiles, UINT32 faceIndex, DWRITE_FONT_SIMULATIONS fontFaceSimulationFlags, IDWriteFontFace** fontFace) { return ((HRESULT (WINAPI*)(IDWriteFactory*, DWRITE_FONT_FACE_TYPE, UINT32, IDWriteFontFile**, UINT32, DWRITE_FONT_SIMULATIONS, IDWriteFontFace**))this_->v->tbl[9])(this_, fontFaceType, numberOfFiles, fontFiles, faceIndex, fontFaceSimulationFlags, fontFace); }\nstatic inline HRESULT                           IDWriteFactory2_CreateCustomRenderingParams2                 (IDWriteFactory2* this, FLOAT gamma, FLOAT enhancedContrast, FLOAT grayscaleEnhancedContrast, FLOAT clearTypeLevel, DWRITE_PIXEL_GEOMETRY pixelGeometry, DWRITE_RENDERING_MODE renderingMode, DWRITE_GRID_FIT_MODE gridFitMode, IDWriteRenderingParams2** renderingParams) { return ((HRESULT (WINAPI*)(IDWriteFactory2*, FLOAT, FLOAT, FLOAT, FLOAT, DWRITE_PIXEL_GEOMETRY, DWRITE_RENDERING_MODE, DWRITE_GRID_FIT_MODE, IDWriteRenderingParams2**))this->v->tbl[29])(this, gamma, enhancedContrast, grayscaleEnhancedContrast, clearTypeLevel, pixelGeometry, renderingMode, gridFitMode, renderingParams); }\nstatic inline FLOAT                             IDWriteRenderingParams_GetEnhancedContrast                   (IDWriteRenderingParams* this_) { return ((FLOAT (WINAPI*)(IDWriteRenderingParams*))this_->v->tbl[4])(this_); }\nstatic inline FLOAT                             IDWriteRenderingParams_GetGamma                              (IDWriteRenderingParams* this_) { return ((FLOAT (WINAPI*)(IDWriteRenderingParams*))this_->v->tbl[3])(this_); }\nstatic inline HRESULT                           IDWriteGdiInterop_CreateBitmapRenderTarget                   (IDWriteGdiInterop* this_, HDC hdc, UINT32 width, UINT32 height, IDWriteBitmapRenderTarget** renderTarget) { return ((HRESULT (WINAPI*)(IDWriteGdiInterop*, HDC, UINT32, UINT32, IDWriteBitmapRenderTarget**))this_->v->tbl[7])(this_, hdc, width, height, renderTarget); }\nstatic inline HRESULT                           IDWriteBitmapRenderTarget_SetPixelsPerDip                    (IDWriteBitmapRenderTarget* this_, FLOAT pixelsPerDip) { return ((HRESULT (WINAPI*)(IDWriteBitmapRenderTarget*, FLOAT))this_->v->tbl[6])(this_, pixelsPerDip); }\nstatic inline HDC                               IDWriteBitmapRenderTarget_GetMemoryDC                        (IDWriteBitmapRenderTarget* this_) { return ((HDC (WINAPI*)(IDWriteBitmapRenderTarget*))this_->v->tbl[4])(this_); }\nstatic inline HRESULT                           IDWriteBitmapRenderTarget_DrawGlyphRun                       (IDWriteBitmapRenderTarget* this_, FLOAT baselineOriginX, FLOAT baselineOriginY, DWRITE_MEASURING_MODE measuringMode, const DWRITE_GLYPH_RUN* glyphRun, IDWriteRenderingParams* renderingParams, COLORREF textColor, RECT* blackBoxRect) { return ((HRESULT (WINAPI*)(IDWriteBitmapRenderTarget*, FLOAT, FLOAT, DWRITE_MEASURING_MODE, const DWRITE_GLYPH_RUN*, IDWriteRenderingParams*, COLORREF, RECT*))this_->v->tbl[3])(this_, baselineOriginX, baselineOriginY, measuringMode, glyphRun, renderingParams, textColor, blackBoxRect); }\nstatic inline UINT32                            IDWriteFontFace_Release                                      (IDWriteFontFace* this_) { return ((UINT32 (WINAPI*)(IDWriteFontFace*))this_->v->tbl[2])(this_); }\nstatic inline void                              IDWriteFontFace_GetMetrics                                   (IDWriteFontFace* this_, DWRITE_FONT_METRICS* fontFaceMetrics) { ((void (WINAPI*)(IDWriteFontFace*, DWRITE_FONT_METRICS*))this_->v->tbl[8])(this_, fontFaceMetrics); }\nstatic inline UINT32                            IDWriteFontFile_Release                                      (IDWriteFontFile* this_) { return ((UINT32 (WINAPI*)(IDWriteFontFile*))this_->v->tbl[2])(this_); }\nstatic inline HRESULT                           IDWriteFontFace_GetGlyphIndices                              (IDWriteFontFace* this_, const UINT32* codePoints, UINT32 codePointCount, UINT16* glyphIndices) { return ((HRESULT (WINAPI*)(IDWriteFontFace*, const UINT32*, UINT32, UINT16*))this_->v->tbl[11])(this_, codePoints, codePointCount, glyphIndices); }\nstatic inline HRESULT                           IDWriteFontFace_GetGdiCompatibleGlyphMetrics                 (IDWriteFontFace* this_, FLOAT emSize, FLOAT pixelsPerDip, const DWRITE_MATRIX* transform, BOOL useGdiNatural, const UINT16* glyphIndices, UINT32 glyphCount, DWRITE_GLYPH_METRICS* glyphMetrics, BOOL isSideways) { return ((HRESULT (WINAPI*)(IDWriteFontFace*, FLOAT, FLOAT, const DWRITE_MATRIX*, BOOL, const UINT16*, UINT32, DWRITE_GLYPH_METRICS*, BOOL))this_->v->tbl[17])(this_, emSize, pixelsPerDip, transform, useGdiNatural, glyphIndices, glyphCount, glyphMetrics, isSideways); }\nstatic inline UINT32                            IDWriteBitmapRenderTarget_Release                            (IDWriteBitmapRenderTarget* this_) { return ((UINT32 (WINAPI*)(IDWriteBitmapRenderTarget*))this_->v->tbl[2])(this_); }\n\n////////////////////////////////\n//~ rjf: Font Provider Implementation Types\n\n//- rjf: font file loader interface types\n\ntypedef struct FP_DWrite_FontFileLoader FP_DWrite_FontFileLoader;\ntypedef struct FP_DWrite_FontFileLoaderVTable FP_DWrite_FontFileLoaderVTable;\n\nstruct FP_DWrite_FontFileLoaderVTable\n{\n  HRESULT (*QueryInterface)(void *obj, REFIID riid, void *ptr_to_object);\n  ULONG (*AddRef)(void *obj);\n  ULONG (*Release)(void *obj);\n  HRESULT (*CreateStreamFromKey)(FP_DWrite_FontFileLoader *loader, void const *font_file_ref_key, UINT32 font_file_ref_key_size, IDWriteFontFileStream **stream_out);\n};\n\nstruct FP_DWrite_FontFileLoader\n{\n  FP_DWrite_FontFileLoaderVTable *lpVtbl;\n};\n\n//- rjf: font file stream interface types\n\ntypedef struct FP_DWrite_FontFileStream FP_DWrite_FontFileStream;\ntypedef struct FP_DWrite_FontFileStreamVTable FP_DWrite_FontFileStreamVTable;\ntypedef struct FP_DWrite_FontFileStreamNode FP_DWrite_FontFileStreamNode;\n\nstruct FP_DWrite_FontFileStreamVTable\n{\n  HRESULT (*QueryInterface)(void *obj, REFIID riid, void *ptr_to_object);\n  ULONG (*AddRef)(void *obj);\n  ULONG (*Release)(void *obj);\n  HRESULT (*ReadFileFragment)(FP_DWrite_FontFileStream *obj, void const **fragment_start, UINT64 file_offset, UINT64 fragment_size, void **fragment_context);\n  HRESULT (*ReleaseFileFragment)(FP_DWrite_FontFileStream *obj, void *fragment_context);\n  HRESULT (*GetFileSize)(FP_DWrite_FontFileStream *obj, UINT64 *size_out);\n  HRESULT (*GetLastWriteTime)(FP_DWrite_FontFileStream *obj, UINT64 *time_out);\n};\n\nstruct FP_DWrite_FontFileStream\n{\n  FP_DWrite_FontFileStreamVTable *lpVtbl;\n  String8 *data;\n};\n\nstruct FP_DWrite_FontFileStreamNode\n{\n  FP_DWrite_FontFileStreamNode *next;\n  FP_DWrite_FontFileStreamNode *prev;\n  FP_DWrite_FontFileStream stream;\n};\n\n//- rjf: state & underlying handle types\n\ntypedef struct FP_DWrite_State FP_DWrite_State;\nstruct FP_DWrite_State\n{\n  Arena *arena;\n  B32 dwrite2_is_supported;\n  IDWriteFactory *factory;\n  IDWriteRenderingParams *base_rendering_params;\n  IDWriteRenderingParams *rendering_params_sharp_hinted;\n  IDWriteRenderingParams *rendering_params_sharp_unhinted;\n  IDWriteRenderingParams *rendering_params_smooth_hinted;\n  IDWriteRenderingParams *rendering_params_smooth_unhinted;\n  IDWriteGdiInterop *gdi_interop;\n  Vec2S32 bitmap_render_target_dim;\n  IDWriteBitmapRenderTarget *bitmap_render_target;\n  FP_DWrite_FontFileStreamNode *first_stream_node;\n  FP_DWrite_FontFileStreamNode *last_stream_node;\n  FP_DWrite_FontFileStreamNode *free_stream_node;\n};\n\ntypedef struct FP_DWrite_Font FP_DWrite_Font;\nstruct FP_DWrite_Font\n{\n  IDWriteFontFile *file;\n  IDWriteFontFace *face;\n};\n\n////////////////////////////////\n//~ rjf: Helpers\n\n//- rjf: handle conversion functions\ninternal FP_DWrite_Font fp_dwrite_font_from_handle(FP_Handle handle);\ninternal FP_Handle fp_dwrite_handle_from_font(FP_DWrite_Font font);\n\n//- rjf: file stream allocator\ninternal FP_DWrite_FontFileStreamNode *fp_dwrite_font_file_stream_node_alloc(String8 *data_ptr);\ninternal void fp_dwrite_font_file_stream_node_release(FP_DWrite_FontFileStreamNode *node);\n\n//- rjf: iunknown no-op helpers\ninternal HRESULT fp_dwrite_iunknown_noop__query_interface(void *obj, REFIID riid, void *ptr_to_object);\ninternal ULONG fp_dwrite_iunknown_noop__add_ref(void *obj);\ninternal ULONG fp_dwrite_iunknown_noop__release(void *obj);\n\n//- rjf: font file loader interface function implementations\ninternal HRESULT fp_dwrite_static_font_file_loader__stream_from_key(FP_DWrite_FontFileLoader *obj, void const *font_file_ref_key, UINT32 font_file_ref_key_size, IDWriteFontFileStream **stream_out);\n\n//- rjf: font file stream  interface function implementations\ninternal HRESULT fp_dwrite_static_font_file_stream__read_file_fragment(FP_DWrite_FontFileStream *obj, void const **fragment_start, UINT64 file_offset, UINT64 fragment_size, void **fragment_context);\ninternal HRESULT fp_dwrite_static_font_file_stream__release_file_fragment(FP_DWrite_FontFileStream *obj, void *fragment_context);\ninternal HRESULT fp_dwrite_static_font_file_stream__get_file_size(FP_DWrite_FontFileStream *obj, UINT64 *size_out);\ninternal HRESULT fp_dwrite_static_font_file_stream__get_last_write_time(FP_DWrite_FontFileStream *obj, UINT64 *time_out);\n\n#endif // FONT_PROVIDER_DWRITE_H\n"
  },
  {
    "path": "src/font_provider/font_provider.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\ninternal FP_Handle\r\nfp_handle_zero(void)\r\n{\r\n  FP_Handle result = {0};\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nfp_handle_match(FP_Handle a, FP_Handle b)\r\n{\r\n  return (a.u64[0] == b.u64[0] && a.u64[1] == b.u64[1]);\r\n}\r\n"
  },
  {
    "path": "src/font_provider/font_provider.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef FONT_PROVIDER_H\r\n#define FONT_PROVIDER_H\r\n\r\n#define fp_hook C_LINKAGE\r\n\r\n////////////////////////////////\r\n//~ rjf: Types\r\n\r\ntypedef U32 FP_RasterFlags;\r\nenum\r\n{\r\n  FP_RasterFlag_Smooth = (1<<0),\r\n  FP_RasterFlag_Hinted = (1<<1),\r\n};\r\n\r\ntypedef struct FP_Handle FP_Handle;\r\nstruct FP_Handle\r\n{\r\n  U64 u64[2];\r\n};\r\n\r\ntypedef struct FP_Metrics FP_Metrics;\r\nstruct FP_Metrics\r\n{\r\n  F32 design_units_per_em;\r\n  F32 ascent;\r\n  F32 descent;\r\n  F32 line_gap;\r\n  F32 capital_height;\r\n};\r\n\r\ntypedef struct FP_RasterResult FP_RasterResult;\r\nstruct FP_RasterResult\r\n{\r\n  Vec2S16 atlas_dim;\r\n  void *atlas;\r\n  F32 advance;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\ninternal FP_Handle fp_handle_zero(void);\r\ninternal B32 fp_handle_match(FP_Handle a, FP_Handle b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Hooks\r\n\r\nfp_hook void fp_init(void);\r\nfp_hook FP_Handle fp_font_open(String8 path);\r\nfp_hook FP_Handle fp_font_open_from_static_data_string(String8 *data_ptr);\r\nfp_hook void fp_font_close(FP_Handle handle);\r\nfp_hook FP_Metrics fp_metrics_from_font(FP_Handle font);\r\nfp_hook NO_ASAN FP_RasterResult fp_raster(Arena *arena, FP_Handle font, F32 size, FP_RasterFlags flags, String8 string);\r\n\r\n#endif // FONT_PROVIDER_H\r\n"
  },
  {
    "path": "src/font_provider/font_provider_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"font_provider.c\"\r\n\r\n#if FP_BACKEND == FP_BACKEND_DWRITE\r\n# include \"dwrite/font_provider_dwrite.c\"\r\n#elif FP_BACKEND == FP_BACKEND_FREETYPE\r\n# include \"freetype/font_provider_freetype.c\"\r\n#else\r\n# error Font provider backend not specified.\r\n#endif\r\n"
  },
  {
    "path": "src/font_provider/font_provider_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef FONT_PROVIDER_INC_H\r\n#define FONT_PROVIDER_INC_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Constants\r\n\r\n#define FP_BACKEND_DWRITE 1\r\n#define FP_BACKEND_FREETYPE 2\r\n\r\n////////////////////////////////\r\n//~ rjf: Decide On Backend\r\n\r\n#if !defined(FP_BACKEND)\r\n# if OS_WINDOWS\r\n#  define FP_BACKEND FP_BACKEND_DWRITE\r\n# elif OS_LINUX\r\n#  define FP_BACKEND FP_BACKEND_FREETYPE\r\n# endif\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Includes\r\n\r\n#include \"font_provider.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Includes\r\n\r\n#if FP_BACKEND == FP_BACKEND_DWRITE\r\n# include \"dwrite/font_provider_dwrite.h\"\r\n#elif FP_BACKEND == FP_BACKEND_FREETYPE\r\n# include \"freetype/font_provider_freetype.h\"\r\n#else\r\n# error Font provider backend not specified.\r\n#endif\r\n\r\n#endif // FONT_PROVIDER_INC_H\r\n"
  },
  {
    "path": "src/font_provider/freetype/font_provider_freetype.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal FP_FT_Font\r\nfp_ft_font_from_handle(FP_Handle handle)\r\n{\r\n  FP_FT_Font result = {(FT_Face)handle.u64[0]};\r\n  return result;\r\n}\r\n\r\ninternal FP_Handle\r\nfp_ft_handle_from_font(FP_FT_Font font)\r\n{\r\n  FP_Handle result = {(U64)font.face};\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Implementations\r\n\r\nfp_hook void\r\nfp_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  fp_ft_state = push_array(arena, FP_FT_State, 1);\r\n  fp_ft_state->arena = arena;\r\n  FT_Init_FreeType(&fp_ft_state->library);\r\n}\r\n\r\nfp_hook FP_Handle\r\nfp_font_open(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  FP_FT_Font font = {0};\r\n  FT_New_Face(fp_ft_state->library, (char *)path_copy.str, 0, &font.face);\r\n  FP_Handle handle = fp_ft_handle_from_font(font);\r\n  scratch_end(scratch);\r\n  return handle;\r\n}\r\n\r\nfp_hook FP_Handle\r\nfp_font_open_from_static_data_string(String8 *data_ptr)\r\n{\r\n  FP_FT_Font font = {0};\r\n  FT_New_Memory_Face(fp_ft_state->library, data_ptr->str, (FT_Long)data_ptr->size, 0, &font.face);\r\n  FP_Handle handle = fp_ft_handle_from_font(font);\r\n  return handle;\r\n}\r\n\r\nfp_hook void\r\nfp_font_close(FP_Handle handle)\r\n{\r\n  FP_FT_Font font = fp_ft_font_from_handle(handle);\r\n  if(font.face != 0)\r\n  {\r\n    FT_Done_Face(font.face);\r\n  }\r\n}\r\n\r\nfp_hook FP_Metrics\r\nfp_metrics_from_font(FP_Handle handle)\r\n{\r\n  FP_FT_Font font = fp_ft_font_from_handle(handle);\r\n  FP_Metrics result = {0};\r\n  if(font.face != 0)\r\n  {\r\n    result.design_units_per_em = (F32)(font.face->units_per_EM);\r\n    result.ascent              = (F32)font.face->ascender;\r\n    result.descent             = -(F32)font.face->descender;\r\n    result.line_gap            = (F32)(font.face->height - font.face->ascender + font.face->descender);\r\n    result.capital_height      = (F32)(font.face->ascender);\r\n  }\r\n  return result;\r\n}\r\n\r\nfp_hook FP_RasterResult\r\nfp_raster(Arena *arena, FP_Handle handle, F32 size, FP_RasterFlags flags, String8 string)\r\n{\r\n  ProfBeginFunction();\r\n  FP_FT_Font font = fp_ft_font_from_handle(handle);\r\n  FP_RasterResult result = {0};\r\n  if(font.face != 0)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: unpack font\r\n    FT_Face face = font.face;\r\n    FT_Set_Pixel_Sizes(face, 0, (FT_UInt)((96.f/72.f) * size));\r\n    S64 ascent  = face->size->metrics.ascender >> 6;\r\n    S64 descent = abs_s64(face->size->metrics.descender >> 6);\r\n    S64 height  = face->size->metrics.height >> 6;\r\n    \r\n    //- rjf: unpack string\r\n    String32 string32 = str32_from_8(scratch.arena, string);\r\n    \r\n    //- rjf: measure\r\n    S32 total_width = 0;\r\n    for EachIndex(idx, string32.size)\r\n    {\r\n      FT_Load_Char(face, string32.str[idx], FT_LOAD_RENDER);\r\n      total_width += (face->glyph->advance.x >> 6);\r\n    }\r\n    \r\n    //- rjf: allocate & fill atlas w/ rasterization\r\n    Vec2S16 dim = {(S16)total_width+1, height+1};\r\n    U64 atlas_size = dim.x * dim.y * 4;\r\n    U8 *atlas = push_array(arena, U8, atlas_size);\r\n    S32 baseline = ascent;\r\n    S32 atlas_write_x = 0;\r\n    for EachIndex(idx, string32.size)\r\n    {\r\n      FT_Load_Char(face, string32.str[idx], FT_LOAD_RENDER);\r\n      FT_Bitmap *bmp = &face->glyph->bitmap;\r\n      S32 top = face->glyph->bitmap_top;\r\n      S32 left = face->glyph->bitmap_left;\r\n      for(S32 row = 0; row < (S32)bmp->rows; row += 1)\r\n      {\r\n        S32 y = baseline - top + row;\r\n        for(S32 col = 0; col < (S32)bmp->width; col += 1)\r\n        {\r\n          S32 x = atlas_write_x + left + col;\r\n          U64 off = (y*dim.x + x)*4;\r\n          if(off+4 <= atlas_size)\r\n          {\r\n            atlas[off+0] = 255;\r\n            atlas[off+1] = 255;\r\n            atlas[off+2] = 255;\r\n            atlas[off+3] = bmp->buffer[row*bmp->pitch + col];\r\n          }\r\n        }\r\n      }\r\n      atlas_write_x += (face->glyph->advance.x >> 6);\r\n    }\r\n    \r\n    //- rjf: fill result\r\n    result.atlas_dim = dim;\r\n    result.advance   = (F32)total_width;\r\n    result.atlas     = atlas;\r\n    scratch_end(scratch);\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/font_provider/freetype/font_provider_freetype.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef FONT_PROVIDER_FREETYPE_H\r\n#define FONT_PROVIDER_FREETYPE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Freetype Includes\r\n\r\n#undef internal\r\n#include <ft2build.h>\r\n#include FT_FREETYPE_H\r\n#include FT_GLYPH_H\r\n#define internal static\r\n\r\n////////////////////////////////\r\n//~ rjf: State Types\r\n\r\ntypedef struct FP_FT_Font FP_FT_Font;\r\nstruct FP_FT_Font\r\n{\r\n  FT_Face face;\r\n};\r\n\r\ntypedef struct FP_FT_State FP_FT_State;\r\nstruct FP_FT_State\r\n{\r\n  Arena *arena;\r\n  FT_Library library;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal FP_FT_State *fp_ft_state = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal FP_FT_Font fp_ft_font_from_handle(FP_Handle handle);\r\ninternal FP_Handle fp_ft_handle_from_font(FP_FT_Font font);\r\n\r\n#endif // FONT_PROVIDER_FREETYPE_H\r\n"
  },
  {
    "path": "src/gnu/gnu.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal GNU_LinkMap64\r\ngnu_linkmap64_from_linkmap32(GNU_LinkMap32 linkmap32)\r\n{\r\n  GNU_LinkMap64 linkmap64 = {0};\r\n  linkmap64.addr_vaddr = linkmap32.addr_vaddr;\r\n  linkmap64.name_vaddr = linkmap32.name_vaddr;\r\n  linkmap64.ld_vaddr   = linkmap32.ld_vaddr;\r\n  linkmap64.next_vaddr = linkmap32.next_vaddr;\r\n  linkmap64.prev_vaddr = linkmap32.prev_vaddr;\r\n  return linkmap64;\r\n}\r\n\r\ninternal U64\r\ngnu_rdebug_info_size_from_arch(Arch arch)\r\n{\r\n  U64 size = 0;\r\n  switch (byte_size_from_arch(arch)) {\r\n  case 0: break;\r\n  case 4: size = sizeof(GNU_RDebugInfo32); break;\r\n  case 8: size = sizeof(GNU_RDebugInfo64); break;\r\n  default: InvalidPath; break;\r\n  }\r\n  return size;\r\n}\r\n\r\ninternal U64\r\ngnu_r_brk_offset_from_arch(Arch arch)\r\n{\r\n  U64 offset = 0;\r\n  switch (gnu_rdebug_info_size_from_arch(arch)) {\r\n  case 0: offset = 0; break;\r\n  case sizeof(GNU_RDebugInfo32): offset = OffsetOf(GNU_RDebugInfo32, r_brk); break;\r\n  case sizeof(GNU_RDebugInfo64): offset = OffsetOf(GNU_RDebugInfo64, r_brk); break;\r\n  default: InvalidPath; break;\r\n  }\r\n  return offset;\r\n}\r\n\r\ninternal GNU_RDebugInfo64\r\ngnu_rdebug_info64_from_rdebug_info32(GNU_RDebugInfo32 rdebug32)\r\n{\r\n  GNU_RDebugInfo64 result = {0};\r\n  result.r_version = rdebug32.r_version;\r\n  result.r_map     = rdebug32.r_map;\r\n  result.r_brk     = rdebug32.r_brk;\r\n  result.r_state   = rdebug32.r_state;\r\n  result.r_ldbase  = rdebug32.r_ldbase;\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ngnu_string_from_abi_tag(GNU_AbiTag abi_tag)\r\n{\r\n  switch (abi_tag) {\r\n  case GNU_AbiTag_Linux:    return str8_lit(\"Linux\");\r\n  case GNU_AbiTag_Hurd:     return str8_lit(\"Hurd\");\r\n  case GNU_AbiTag_Solaris:  return str8_lit(\"Solaris\");\r\n  case GNU_AbiTag_FreeBsd:  return str8_lit(\"FreeBsd\");\r\n  case GNU_AbiTag_NetBsd:   return str8_lit(\"NetBsd\");\r\n  case GNU_AbiTag_Syllable: return str8_lit(\"Syllable\");\r\n  case GNU_AbiTag_Nacl:     return str8_lit(\"Nacl\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ngnu_string_from_note_type(GNU_NoteType note_type)\r\n{\r\n  switch (note_type) {\r\n  case GNU_NoteType_Abi:           return str8_lit(\"GNU_Abi\");\r\n  case GNU_NoteType_HwCap:         return str8_lit(\"GNU_HwCap\");\r\n  case GNU_NoteType_BuildId:       return str8_lit(\"GNU_BuildId\");\r\n  case GNU_NoteType_GoldVersion:   return str8_lit(\"GNU_GoldVersion\");\r\n  case GNU_NoteType_PropertyType0: return str8_lit(\"GNU_PropertyType0\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ngnu_string_from_property_x86(GNU_PropertyX86 prop)\r\n{\r\n  switch (prop) {\r\n  case GNU_PropertyX86_Feature1And:         return str8_lit(\"Feature1And\");\r\n  case GNU_PropertyX86_Feature2Used:        return str8_lit(\"Feature2Used\");\r\n  case GNU_PropertyX86_Isa1needed:          return str8_lit(\"Isa1needed\");\r\n  case GNU_PropertyX86_Isa2Needed:          return str8_lit(\"Isa2Needed\");\r\n  case GNU_PropertyX86_Isa1Used:            return str8_lit(\"Isa1Used\");\r\n  case GNU_PropertyX86_Compat_isa_1_used:   return str8_lit(\"Compat_isa_1_used\");\r\n  case GNU_PropertyX86_Compat_isa_1_needed: return str8_lit(\"Compat_isa_1_needed\");\r\n  case GNU_PropertyX86_UInt32AndHi:         return str8_lit(\"UInt32AndHi\");\r\n  case GNU_PropertyX86_UInt32OrLo:          return str8_lit(\"UInt32OrLo\");\r\n  case GNU_PropertyX86_UInt32OrHi:          return str8_lit(\"UInt32OrHi\");\r\n  case GNU_PropertyX86_UInt32OrAndLo:       return str8_lit(\"UInt32OrAndLo\");\r\n  case GNU_PropertyX86_UInt32OrAndHi:       return str8_lit(\"UInt32OrAndHi\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\ngnu_string_from_property_flags_x86(Arena *arena, GNU_PropertyX86 prop, U32 flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List fmt = {0};\r\n  if (flags == 0) {\r\n    str8_list_pushf(scratch.arena, &fmt, \"None\");\r\n  }\r\n  switch (prop) {\r\n  case GNU_PropertyX86_Isa1needed:\r\n  case GNU_PropertyX86_Isa1Used: {\r\n    if (flags & GNU_PropertyX86Isa1_BaseLine) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"BaseLine\");\r\n      flags &= ~GNU_PropertyX86Isa1_BaseLine;\r\n    }\r\n    if (flags & GNU_PropertyX86Isa1_V2) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"V2\");\r\n      flags &= ~GNU_PropertyX86Isa1_V2;\r\n    }\r\n    if (flags & GNU_PropertyX86Isa1_V3) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"V3\");\r\n      flags &= ~GNU_PropertyX86Isa1_V3;\r\n    }\r\n    if (flags & GNU_PropertyX86Isa1_V4) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"V4\");\r\n      flags &= ~GNU_PropertyX86Isa1_V4;\r\n    }\r\n  } break;\r\n  case GNU_PropertyX86_Feature1And: {\r\n    if (flags & GNU_PropertyX86Feature1_Ibt) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"Ibt\");\r\n      flags &= ~GNU_PropertyX86Feature1_Ibt;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature1_Shstk) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"Shstk\");\r\n      flags &= ~GNU_PropertyX86Feature1_Shstk;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature1_LamU48) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"LamU48\");\r\n      flags &= ~GNU_PropertyX86Feature1_LamU48;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature1_LamU57) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"LamU57\");\r\n      flags &= ~GNU_PropertyX86Feature1_LamU57;\r\n    }\r\n  } break;\r\n  case GNU_PropertyX86_Feature2Used: {\r\n    if (flags & GNU_PropertyX86Feature2_X86) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"X86\");\r\n      flags &= ~GNU_PropertyX86Feature2_X86;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_X87) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"X87\");\r\n      flags &= ~GNU_PropertyX86Feature2_X87;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_MMX) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"MMX\");\r\n      flags &= ~GNU_PropertyX86Feature2_MMX;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_XMM) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"XMM\");\r\n      flags &= ~GNU_PropertyX86Feature2_XMM;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_YMM) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"YMM\");\r\n      flags &= ~GNU_PropertyX86Feature2_YMM;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_ZMM) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"ZMM\");\r\n      flags &= ~GNU_PropertyX86Feature2_ZMM;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_FXSR) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"FXSR\");\r\n      flags &= ~GNU_PropertyX86Feature2_FXSR;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_XSAVE) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"XSAVE\");\r\n      flags &= ~GNU_PropertyX86Feature2_XSAVE;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_XSAVEOPT) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"XSAVEOPT\");\r\n      flags &= ~GNU_PropertyX86Feature2_XSAVEOPT;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_XSAVEC) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"XSAVEC\");\r\n      flags &= ~GNU_PropertyX86Feature2_XSAVEC;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_TMM) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"TMM\");\r\n      flags &= ~GNU_PropertyX86Feature2_TMM;\r\n    }\r\n    if (flags & GNU_PropertyX86Feature2_MASK) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"MASK\");\r\n      flags &= ~GNU_PropertyX86Feature2_MASK;\r\n    }\r\n  } break;\r\n  case GNU_PropertyX86_Compat_isa_1_used:\r\n  case GNU_PropertyX86_Compat_isa_1_needed: {\r\n    if (flags & GNU_PropertyX86Compat1Isa1_486) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"486\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_486;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_586) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"586\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_586;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_686) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"686\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_686;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_SSE) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"SSE\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_SSE;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_SSE2) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"SSE2\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_SSE2;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_SSE3) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"SSE3\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_SSE3;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_SSSE3) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"SSSE3\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_SSSE3;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_SSE4_1) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"SSE4_1\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_SSE4_1;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_SSE4_2) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"SSE4_2\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_SSE4_2;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX2) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX2\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX2;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX512F) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX512F\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX512F;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX512ER) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX512ER\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX512ER;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX512PF) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX512PF\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX512PF;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX512VL) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX512VL\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX512VL;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX512DQ) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX512DQ\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX512DQ;\r\n    }\r\n    if (flags & GNU_PropertyX86Compat1Isa1_AVX512BW) {\r\n      str8_list_pushf(scratch.arena, &fmt, \"AVX512BW\");\r\n      flags &= ~GNU_PropertyX86Compat1Isa1_AVX512BW;\r\n    }\r\n  } break;\r\n  }\r\n  if (flags) {\r\n    str8_list_pushf(scratch.arena, &fmt, \"Unknown: 0x%x\", flags);\r\n  }\r\n\r\n  String8 result = str8_list_join(arena, &fmt, &(StringJoin){.sep = str8_lit(\", \")}); \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n"
  },
  {
    "path": "src/gnu/gnu.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef GNU_H\r\n#define GNU_H\r\n\r\ntypedef ELF_NoteType GNU_NoteType;\r\nenum\r\n{\r\n  GNU_NoteType_Abi           = 1,\r\n  GNU_NoteType_HwCap         = 2,\r\n  GNU_NoteType_BuildId       = 3,\r\n  GNU_NoteType_GoldVersion   = 4,\r\n  GNU_NoteType_PropertyType0 = 5,\r\n};\r\n\r\ntypedef U32 GNU_Property;\r\nenum\r\n{\r\n  GNU_Property_LoProc            = 0xc0000000,\r\n  //  processor-specific range\r\n  GNU_Property_HiProc            = 0xdfffffff,\r\n  GNU_Property_LoUser            = 0xe0000000,\r\n  //  application-specific range\r\n  GNU_Property_HiUser            = 0xffffffff,\r\n  GNU_Property_StackSize         = 1,\r\n  GNU_Property_NoCopyOnProtected = 2,\r\n};\r\n\r\ntypedef U32 GNU_PropertyX86Isa1;\r\nenum\r\n{\r\n  GNU_PropertyX86Isa1_BaseLine = (1 << 0),\r\n  GNU_PropertyX86Isa1_V2       = (1 << 1),\r\n  GNU_PropertyX86Isa1_V3       = (1 << 2),\r\n  GNU_PropertyX86Isa1_V4       = (1 << 3),\r\n};\r\n\r\ntypedef U32 GNU_PropertyX86Compat1Isa1;\r\nenum\r\n{\r\n  GNU_PropertyX86Compat1Isa1_486      = (1 << 0),\r\n  GNU_PropertyX86Compat1Isa1_586      = (1 << 1),\r\n  GNU_PropertyX86Compat1Isa1_686      = (1 << 2),\r\n  GNU_PropertyX86Compat1Isa1_SSE      = (1 << 3),\r\n  GNU_PropertyX86Compat1Isa1_SSE2     = (1 << 4),\r\n  GNU_PropertyX86Compat1Isa1_SSE3     = (1 << 5),\r\n  GNU_PropertyX86Compat1Isa1_SSSE3    = (1 << 6),\r\n  GNU_PropertyX86Compat1Isa1_SSE4_1   = (1 << 7),\r\n  GNU_PropertyX86Compat1Isa1_SSE4_2   = (1 << 8),\r\n  GNU_PropertyX86Compat1Isa1_AVX      = (1 << 9),\r\n  GNU_PropertyX86Compat1Isa1_AVX2     = (1 << 10),\r\n  GNU_PropertyX86Compat1Isa1_AVX512F  = (1 << 11),\r\n  GNU_PropertyX86Compat1Isa1_AVX512ER = (1 << 12),\r\n  GNU_PropertyX86Compat1Isa1_AVX512PF = (1 << 13),\r\n  GNU_PropertyX86Compat1Isa1_AVX512VL = (1 << 14),\r\n  GNU_PropertyX86Compat1Isa1_AVX512DQ = (1 << 15),\r\n  GNU_PropertyX86Compat1Isa1_AVX512BW = (1 << 16),\r\n};\r\n\r\ntypedef U32 GNU_PropertyX86Compat2Isa1;\r\nenum\r\n{\r\n  GNU_PropertyX86Compat2Isa1_CMOVE         = (1 << 0),\r\n  GNU_PropertyX86Compat2Isa1_SSE           = (1 << 1),\r\n  GNU_PropertyX86Compat2Isa1_SSE2          = (1 << 2),\r\n  GNU_PropertyX86Compat2Isa1_SSE3          = (1 << 3),\r\n  GNU_PropertyX86Compat2Isa1_SSE4_1        = (1 << 4),\r\n  GNU_PropertyX86Compat2Isa1_SSE4_2        = (1 << 5),\r\n  GNU_PropertyX86Compat2Isa1_AVX           = (1 << 6),\r\n  GNU_PropertyX86Compat2Isa1_AVX2          = (1 << 7),\r\n  GNU_PropertyX86Compat2Isa1_FMA           = (1 << 8),\r\n  GNU_PropertyX86Compat2Isa1_AVX512F       = (1 << 9),\r\n  GNU_PropertyX86Compat2Isa1_AVX512CD      = (1 << 10),\r\n  GNU_PropertyX86Compat2Isa1_AVX512ER      = (1 << 11),\r\n  GNU_PropertyX86Compat2Isa1_AVX512PF      = (1 << 12),\r\n  GNU_PropertyX86Compat2Isa1_AVX512VL      = (1 << 13),\r\n  GNU_PropertyX86Compat2Isa1_AVX512DQ      = (1 << 14),\r\n  GNU_PropertyX86Compat2Isa1_AVX512BW      = (1 << 15),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_4FMAPS = (1 << 16),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_4VNNIW = (1 << 17),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_BITALG = (1 << 18),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_IFMA   = (1 << 19),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_VBMI   = (1 << 20),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_VBMI2  = (1 << 21),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_VNNI   = (1 << 22),\r\n  GNU_PropertyX86Compat2Isa1_AVX512_BF16   = (1 << 23),\r\n};\r\n\r\ntypedef GNU_Property GNU_PropertyX86;\r\nenum\r\n{\r\n  GNU_PropertyX86_Feature1And         = 0xc0000002,\r\n  GNU_PropertyX86_Feature2Used        = 0xc0010001,\r\n  GNU_PropertyX86_Isa1needed          = 0xc0008002,\r\n  GNU_PropertyX86_Isa2Needed          = 0xc0008001,\r\n  GNU_PropertyX86_Isa1Used            = 0xc0010002,\r\n  GNU_PropertyX86_Compat_isa_1_used   = 0xc0000000,\r\n  GNU_PropertyX86_Compat_isa_1_needed = 0xc0000001,\r\n  GNU_PropertyX86_UInt32AndLo         = GNU_PropertyX86_Feature1And,\r\n  GNU_PropertyX86_UInt32AndHi         = 0xc0007fff,\r\n  GNU_PropertyX86_UInt32OrLo          = 0xc0008000,\r\n  GNU_PropertyX86_UInt32OrHi          = 0xc000ffff,\r\n  GNU_PropertyX86_UInt32OrAndLo       = 0xc0010000,\r\n  GNU_PropertyX86_UInt32OrAndHi       = 0xc0017fff,\r\n};\r\n\r\ntypedef U32 GNU_PropertyX86Feature1;\r\nenum\r\n{\r\n  GNU_PropertyX86Feature1_Ibt    = (1 << 0),\r\n  GNU_PropertyX86Feature1_Shstk  = (1 << 1),\r\n  GNU_PropertyX86Feature1_LamU48 = (1 << 2),\r\n  GNU_PropertyX86Feature1_LamU57 = (1 << 3),\r\n};\r\n\r\ntypedef U32 GNU_PropertyX86Feature2;\r\nenum\r\n{\r\n  GNU_PropertyX86Feature2_X86      = (1 << 0),\r\n  GNU_PropertyX86Feature2_X87      = (1 << 1),\r\n  GNU_PropertyX86Feature2_MMX      = (1 << 2),\r\n  GNU_PropertyX86Feature2_XMM      = (1 << 3),\r\n  GNU_PropertyX86Feature2_YMM      = (1 << 4),\r\n  GNU_PropertyX86Feature2_ZMM      = (1 << 5),\r\n  GNU_PropertyX86Feature2_FXSR     = (1 << 6),\r\n  GNU_PropertyX86Feature2_XSAVE    = (1 << 7),\r\n  GNU_PropertyX86Feature2_XSAVEOPT = (1 << 8),\r\n  GNU_PropertyX86Feature2_XSAVEC   = (1 << 9),\r\n  GNU_PropertyX86Feature2_TMM      = (1 << 10),\r\n  GNU_PropertyX86Feature2_MASK     = (1 << 11),\r\n};\r\n\r\ntypedef U32 GNU_AbiTag;\r\nenum\r\n{\r\n  GNU_AbiTag_Linux    = 0,\r\n  GNU_AbiTag_Hurd     = 1,\r\n  GNU_AbiTag_Solaris  = 2,\r\n  GNU_AbiTag_FreeBsd  = 3,\r\n  GNU_AbiTag_NetBsd   = 4,\r\n  GNU_AbiTag_Syllable = 5,\r\n  GNU_AbiTag_Nacl     = 6,\r\n};\r\n\r\ntypedef struct GNU_LinkMap64\r\n{\r\n  U64 addr_vaddr;\r\n  U64 name_vaddr;\r\n  U64 ld_vaddr;   // address of the dynamic section\r\n  U64 next_vaddr;\r\n  U64 prev_vaddr;\r\n} GNU_LinkMap64;\r\n\r\ntypedef struct GNU_LinkMap32\r\n{\r\n  U32 addr_vaddr;\r\n  U32 name_vaddr;\r\n  U32 ld_vaddr;\r\n  U32 next_vaddr;\r\n  U32 prev_vaddr;\r\n} GNU_LinkMap32;\r\n\r\ntypedef U32 GNU_RT;\r\nenum\r\n{\r\n  GNU_RT_Consistent = 0,\r\n  GNU_RT_Add        = 1,\r\n  GNU_RT_Delete     = 2,\r\n};\r\n\r\n// struct reflects r_debug from /usr/include/link.h\r\ntypedef struct GNU_RDebugInfo64\r\n{\r\n  S32    r_version; // must be greater than 0\r\n  U64    r_map;     // address of first loaded object\r\n  U64    r_brk;     // when module is loared/unloaded DL calls this function\r\n  GNU_RT r_state;\r\n  U64    r_ldbase;  // base addres of dynamic linker\r\n} GNU_RDebugInfo64;\r\n\r\ntypedef struct GNU_RDebugInfo32\r\n{\r\n  S32    r_version;\r\n  U32    r_map;\r\n  U32    r_brk;\r\n  GNU_RT r_state;\r\n  U32    r_ldbase;\r\n} GNU_RDebugInfo32;\r\n\r\n////////////////////////////////\r\n\r\ninternal GNU_LinkMap64 elf_linkmap64_from_linkmap32(GNU_LinkMap32 linkmap32);\r\ninternal U64 gnu_rdebug_info_size_from_arch(Arch arch);\r\ninternal U64 gnu_r_brk_offset_from_arch(Arch arch);\r\n\r\n////////////////////////////////\r\n//~ enum\r\n\r\ninternal String8 gnu_string_from_abi_tag(GNU_AbiTag abi_tag);\r\ninternal String8 gnu_string_from_note_type(GNU_NoteType note_type);\r\ninternal String8 gnu_string_from_property_x86(GNU_PropertyX86 prop);\r\n\r\n#endif // GNU_H\r\n"
  },
  {
    "path": "src/lib_raddbg_markup/raddbg_markup.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RADDBG_MARKUP_H\r\n#define RADDBG_MARKUP_H\r\n\r\n////////////////////////////////\r\n//~ Implementation Overrides\r\n\r\n#if !defined(RADDBG_MARKUP_VSNPRINTF)\r\n# define RADDBG_MARKUP_DEFAULT_VSNPRINTF 1\r\n# define RADDBG_MARKUP_VSNPRINTF vsnprintf\r\n#endif\r\n\r\n#if !defined(RADDBG_MARKUP_STL_TYPE_VIEWS)\r\n# define RADDBG_MARKUP_STL_TYPE_VIEWS 1\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ Usage Macros\r\n\r\n#if !defined(RADDBG_MARKUP_STUBS)\r\n# define raddbg_is_attached(...)                      raddbg_is_attached__impl()\r\n# define raddbg_thread_id(...)                        raddbg_thread_id__impl()\r\n# define raddbg_thread_name(fmt, ...)                 raddbg_thread_name__impl(raddbg_thread_id(), (fmt), __VA_ARGS__)\r\n# define raddbg_thread_id_name(id, fmt, ...)          raddbg_thread_name__impl((id), (fmt), __VA_ARGS__)\r\n# define raddbg_thread_color_u32(u32)                 raddbg_thread_color__impl(raddbg_thread_id(), (u32))\r\n# define raddbg_thread_color_rgba(r, g, b, a)         raddbg_thread_color__impl(raddbg_thread_id(), ((unsigned int)((r)*255) << 24) | ((unsigned int)((g)*255) << 16) | ((unsigned int)((b)*255) << 8) | ((unsigned int)(a)*255))\r\n# define raddbg_thread_id_color_u32(id, u32)          raddbg_thread_color__impl((id), (u32))\r\n# define raddbg_thread_id_color_rgba(id, r, g, b, a)  raddbg_thread_color__impl((id), ((unsigned int)((r)*255) << 24) | ((unsigned int)((g)*255) << 16) | ((unsigned int)((b)*255) << 8) | ((unsigned int)(a)*255))\r\n# define raddbg_break(...)                            raddbg_break__impl()\r\n# define raddbg_break_if(expr, ...)                   ((expr) ? raddbg_break__impl() : (void)0)\r\n# define raddbg_watch(fmt, ...)                       raddbg_watch__impl((fmt), __VA_ARGS__)\r\n# define raddbg_pin(expr, ...)                        /* NOTE(rjf): inspected by debugger ui - does not change program execution */\r\n# define raddbg_log(fmt, ...)                         raddbg_log__impl((fmt), __VA_ARGS__)\r\n# define raddbg_entry_point(...)                      raddbg_exe_data char raddbg_gen_data_id()[] = (\"entry_point: \\\"\" #__VA_ARGS__ \"\\\"\")\r\n# define raddbg_type_view(type, ...)                  raddbg_exe_data char raddbg_gen_data_id()[] = (\"type_view: {type: ```\" #type \"```, expr: ```\" #__VA_ARGS__ \"```}\")\r\n# define raddbg_add_breakpoint(ptr, size, r, w, x)    raddbg_add_or_remove_breakpoint__impl((ptr), (1), (size), (r), (w), (x))\r\n# define raddbg_remove_breakpoint(ptr, size, r, w, x) raddbg_add_or_remove_breakpoint__impl((ptr), (0), (size), (r), (w), (x))\r\n# define raddbg_annotate_vaddr_range(ptr, size, ...)  raddbg_annotate_vaddr_range__impl((ptr), (size), __VA_ARGS__)\r\n#else\r\n# define raddbg_is_attached(...)                      (0)\r\n# define raddbg_thread_id(...)                        ((void)0)\r\n# define raddbg_thread_name(fmt, ...)                 ((void)0)\r\n# define raddbg_thread_id_name(id, fmt, ...)          ((void)0)\r\n# define raddbg_thread_color_u32(u32)                 ((void)0)\r\n# define raddbg_thread_color_rgba(r, g, b, a)         ((void)0)\r\n# define raddbg_thread_id_color_u32(id, u32)          ((void)0)\r\n# define raddbg_thread_id_color_rgba(id, r, g, b, a)  ((void)0)\r\n# define raddbg_break(...)                            ((void)0)\r\n# define raddbg_break_if(expr, ...)                   ((void)expr)\r\n# define raddbg_watch(fmt, ...)                       ((void)0)\r\n# define raddbg_pin(expr, ...)\r\n# define raddbg_log(fmt, ...)                         ((void)0)\r\n# define raddbg_entry_point(...)                      struct raddbg_gen_data_id(){int __unused__;}\r\n# define raddbg_type_view(type, ...)                  struct raddbg_gen_data_id(){int __unused__;}\r\n# define raddbg_add_breakpoint(ptr, size, r, w, x)    ((void)0)\r\n# define raddbg_remove_breakpoint(ptr, size, r, w, x) ((void)0)\r\n# define raddbg_annotate_vaddr_range(ptr, size, ...)  ((void)0)\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ Helpers\r\n\r\n#define raddbg_glue_(a, b) a##b\r\n#define raddbg_glue(a, b) raddbg_glue_(a, b)\r\n#define raddbg_gen_data_id() raddbg_glue(raddbg_data__, __COUNTER__)\r\n\r\n////////////////////////////////\r\n//~ Global Symbols\r\n\r\n#if !defined(RADDBG_MARKUP_STUBS)\r\nextern unsigned char raddbg_is_attached_byte_marker[1];\r\nint raddbg_is_attached__impl(void);\r\nint raddbg_thread_id__impl(void);\r\nvoid raddbg_thread_name__impl(int id, char *fmt, ...);\r\nvoid raddbg_thread_color__impl(int id, unsigned int hexcode);\r\nvoid raddbg_watch__impl(char *fmt, ...);\r\nvoid raddbg_log__impl(char *fmt, ...);\r\nvoid raddbg_add_or_remove_breakpoint__impl(void *ptr, int set, int size, int r, int w, int x);\r\nvoid raddbg_annotate_vaddr_range__impl(void *ptr, unsigned __int64 size, char *fmt, ...);\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ Win32 Implementations\r\n\r\n#if defined(_WIN32) && !defined(RADDBG_MARKUP_STUBS)\r\n\r\n//- section allocating\r\n#pragma section(\".raddbg\", read, write)\r\n#define raddbg_exe_data __declspec(allocate(\".raddbg\"))\r\n\r\n//- one-time implementations\r\n#if defined(RADDBG_MARKUP_IMPLEMENTATION)\r\n\r\n//- default includes\r\n#if RADDBG_MARKUP_DEFAULT_VSNPRINTF\r\n#include <stdio.h>\r\n#endif\r\n\r\n//- special section gets \"is attached\" byte\r\n#pragma section(\".rdbgia\", read, write)\r\n__declspec(allocate(\".rdbgia\")) unsigned char raddbg_is_attached_byte_marker[1] = {0};\r\n\r\n//- types\r\n\r\ntypedef int BOOL;\r\ntypedef long LONG;\r\ntypedef unsigned long ULONG;\r\ntypedef unsigned __int64 ULONG_PTR, *PULONG_PTR;\r\ntypedef unsigned long DWORD;\r\ntypedef wchar_t WCHAR;\r\ntypedef char const *LPCSTR;\r\ntypedef const WCHAR *LPCWSTR, *PCWSTR;\r\ntypedef LONG HRESULT;\r\ntypedef void *HANDLE;\r\nstruct HINSTANCE__;\r\ntypedef struct HINSTANCE__ *HMODULE;\r\ntypedef __int64 INT_PTR;\r\ntypedef INT_PTR (*FARPROC)();\r\n\r\n//- prototypes\r\n\r\n#include <stdarg.h>\r\n\r\n#if defined(__cplusplus)\r\nextern \"C\"\r\n{\r\n#endif\r\n  __declspec(dllimport) HMODULE LoadLibraryA(LPCSTR name);\r\n  __declspec(dllimport) FARPROC GetProcAddress(HMODULE module, LPCSTR name);\r\n  __declspec(dllimport) BOOL FreeLibrary(HMODULE mod);\r\n  __declspec(dllimport) HANDLE GetCurrentThread(void);\r\n  __declspec(dllimport) DWORD GetCurrentThreadId(void);\r\n  __declspec(dllimport) void RaiseException(DWORD dwExceptionCode, DWORD dwExceptionFlags, DWORD nNumberOfArguments, const ULONG_PTR *lpArguments);\r\n  __declspec(dllimport) void OutputDebugStringA(LPCSTR buffer);\r\n  long long _InterlockedCompareExchange64(long long volatile*, long long, long long);\r\n  long long _InterlockedExchangeAdd64(long long volatile*, long long);\r\n#pragma intrinsic(_InterlockedCompareExchange64)\r\n#pragma intrinsic(_InterlockedExchangeAdd64)\r\n#if RADDBG_MARKUP_DEFAULT_VSNPRINTF\r\n  int RADDBG_MARKUP_VSNPRINTF(char * const, unsigned long long const, const char * const, va_list);\r\n#endif\r\n#if defined(__cplusplus)\r\n}\r\n#endif\r\n\r\n//- helpers\r\n\r\ntypedef struct RADDBG_MARKUP_UnicodeDecode RADDBG_MARKUP_UnicodeDecode;\r\nstruct RADDBG_MARKUP_UnicodeDecode\r\n{\r\n  unsigned __int32 inc;\r\n  unsigned __int32 codepoint;\r\n};\r\nstatic __int8 raddbg_utf8_class[32] = {1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5};\r\n\r\nstatic RADDBG_MARKUP_UnicodeDecode\r\nraddbg_decode_utf8(char *str, unsigned __int64 max)\r\n{\r\n  RADDBG_MARKUP_UnicodeDecode result = {1, 0xffffffff};\r\n  unsigned __int8 byte = str[0];\r\n  unsigned __int8 byte_class = raddbg_utf8_class[byte >> 3];\r\n  switch(byte_class)\r\n  {\r\n    case 1:\r\n    {\r\n      result.codepoint = byte;\r\n    }break;\r\n    case 2:\r\n    if(2 < max)\r\n    {\r\n      unsigned char cont_byte = str[1];\r\n      if(raddbg_utf8_class[cont_byte >> 3] == 0)\r\n      {\r\n        result.codepoint = (byte & 0x0000001f) << 6;\r\n        result.codepoint |= (cont_byte & 0x0000003f);\r\n        result.inc = 2;\r\n      }\r\n    }break;\r\n    case 3:\r\n    if(2 < max)\r\n    {\r\n      unsigned char cont_byte[2] = {(unsigned char)str[1], (unsigned char)str[2]};\r\n      if(raddbg_utf8_class[cont_byte[0] >> 3] == 0 &&\r\n         raddbg_utf8_class[cont_byte[1] >> 3] == 0)\r\n      {\r\n        result.codepoint = (byte & 0x0000000f) << 12;\r\n        result.codepoint |= ((cont_byte[0] & 0x0000003f) << 6);\r\n        result.codepoint |=  (cont_byte[1] & 0x0000003f);\r\n        result.inc = 3;\r\n      }\r\n    }break;\r\n    case 4:\r\n    if(3 < max)\r\n    {\r\n      unsigned char cont_byte[3] = {(unsigned char)str[1], (unsigned char)str[2], (unsigned char)str[3]};\r\n      if(raddbg_utf8_class[cont_byte[0] >> 3] == 0 &&\r\n         raddbg_utf8_class[cont_byte[1] >> 3] == 0 &&\r\n         raddbg_utf8_class[cont_byte[2] >> 3] == 0)\r\n      {\r\n        result.codepoint = (byte & 0x00000007) << 18;\r\n        result.codepoint |= ((cont_byte[0] & 0x0000003f) << 12);\r\n        result.codepoint |= ((cont_byte[1] & 0x0000003f) <<  6);\r\n        result.codepoint |=  (cont_byte[2] & 0x0000003f);\r\n        result.inc = 4;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\nstatic unsigned __int32\r\nraddbg_encode_utf16(wchar_t *str, unsigned __int32 codepoint)\r\n{\r\n  unsigned __int32 inc = 1;\r\n  if(codepoint == 0xffffffff)\r\n  {\r\n    str[0] = (wchar_t)'?';\r\n  }\r\n  else if(codepoint < 0x10000)\r\n  {\r\n    str[0] = (wchar_t)codepoint;\r\n  }\r\n  else\r\n  {\r\n    unsigned __int32 v = codepoint - 0x10000;\r\n    str[0] = (wchar_t)(0xD800 + (v >> 10));\r\n    str[1] = (wchar_t)(0xDC00 + (v & 0x000003ff));\r\n    inc = 2;\r\n  }\r\n  return inc;\r\n}\r\n\r\n//- implementations\r\n\r\nint\r\nraddbg_is_attached__impl(void)\r\n{\r\n  return !!raddbg_is_attached_byte_marker[0];\r\n}\r\n\r\nint\r\nraddbg_thread_id__impl(void)\r\n{\r\n  DWORD result = GetCurrentThreadId();\r\n  return result;\r\n}\r\n\r\nvoid\r\nraddbg_thread_name__impl(int id, char *fmt, ...)\r\n{\r\n  // rjf: resolve variadic arguments\r\n  char buffer[512] = {0};\r\n  char *name = buffer;\r\n  {\r\n    va_list args;\r\n    va_start(args, fmt);\r\n    RADDBG_MARKUP_VSNPRINTF(buffer, sizeof(buffer), fmt, args);\r\n    va_end(args);\r\n  }\r\n  \r\n  // rjf: get windows 10 style procedure\r\n  HRESULT (*SetThreadDescription_function)(HANDLE hThread, PCWSTR lpThreadDescription) = 0;\r\n  {\r\n    static HRESULT (*global_SetThreadDescription_function)(HANDLE hThread, PCWSTR lpThreadDescription);\r\n    static volatile __int64 global_SetThreadDescription_init_started;\r\n    static volatile __int64 global_SetThreadDescription_init_done;\r\n    __int64 do_init = !_InterlockedCompareExchange64(&global_SetThreadDescription_init_started, 1, 0);\r\n    if(do_init)\r\n    {\r\n      HMODULE module = LoadLibraryA(\"kernel32.dll\");\r\n      global_SetThreadDescription_function = (HRESULT (*)(HANDLE, PCWSTR))GetProcAddress(module, \"SetThreadDescription\");\r\n      FreeLibrary(module);\r\n      _InterlockedExchangeAdd64(&global_SetThreadDescription_init_done, 1);\r\n    }\r\n    for(;_InterlockedExchangeAdd64(&global_SetThreadDescription_init_done, 0) == 0;)\r\n    {\r\n      // NOTE(rjf): busy-loop, until init is done\r\n    }\r\n    SetThreadDescription_function = global_SetThreadDescription_function;\r\n  }\r\n  \r\n  // rjf: set thread name, windows 10 style\r\n  if(SetThreadDescription_function && id == GetCurrentThreadId())\r\n  {\r\n    WCHAR buffer16[1024] = {0};\r\n    int name_length = 0;\r\n    for(;name[name_length]; name_length += 1);\r\n    int write_offset = 0;\r\n    for(int idx = 0; idx < name_length;)\r\n    {\r\n      RADDBG_MARKUP_UnicodeDecode decode = raddbg_decode_utf8(name+idx, name_length-idx);\r\n      write_offset += raddbg_encode_utf16(buffer16 + write_offset, decode.codepoint);\r\n      idx += decode.inc;\r\n    }\r\n    SetThreadDescription_function(GetCurrentThread(), buffer16);\r\n  }\r\n  \r\n  // rjf: set thread name, raise-exception style\r\n  {\r\n#pragma pack(push, 8)\r\n    typedef struct THREADNAME_INFO THREADNAME_INFO;\r\n    struct THREADNAME_INFO\r\n    {\r\n      DWORD dwType;\r\n      LPCSTR szName;\r\n      DWORD dwThreadID;\r\n      DWORD dwFlags;\r\n    };\r\n#pragma pack(pop)\r\n    THREADNAME_INFO info;\r\n    info.dwType = 0x1000;\r\n    info.szName = name;\r\n    info.dwThreadID = id;\r\n    info.dwFlags = 0;\r\n#pragma warning(push)\r\n#pragma warning(disable: 6320 6322)\r\n    __try\r\n    {\r\n      RaiseException(0x406D1388u, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info);\r\n    }\r\n    __except(1)\r\n    {\r\n    }\r\n#pragma warning(pop)\r\n  }\r\n}\r\n\r\nvoid\r\nraddbg_thread_color__impl(int id, unsigned int hexcode)\r\n{\r\n  if(raddbg_is_attached())\r\n  {\r\n#pragma pack(push, 8)\r\n    typedef struct RADDBG_ThreadColorInfo RADDBG_ThreadColorInfo;\r\n    struct RADDBG_ThreadColorInfo\r\n    {\r\n      DWORD dwThreadID;\r\n      DWORD _pad_0;\r\n      DWORD rgba;\r\n      DWORD _pad_1;\r\n    };\r\n#pragma pack(pop)\r\n    RADDBG_ThreadColorInfo info;\r\n    info.dwThreadID = id;\r\n    info.rgba = hexcode;\r\n#pragma warning(push)\r\n#pragma warning(disable: 6320 6322)\r\n    __try\r\n    {\r\n      RaiseException(0x00524144u, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info);\r\n    }\r\n    __except(1)\r\n    {\r\n    }\r\n#pragma warning(pop)\r\n  }\r\n}\r\n\r\n#define raddbg_break__impl() (__debugbreak())\r\n\r\nvoid\r\nraddbg_watch__impl(char *fmt, ...)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\nvoid\r\nraddbg_log__impl(char *fmt, ...)\r\n{\r\n  // rjf: resolve variadic arguments\r\n  char buffer[4096];\r\n  {\r\n    va_list args;\r\n    va_start(args, fmt);\r\n    RADDBG_MARKUP_VSNPRINTF(buffer, sizeof(buffer), fmt, args);\r\n    va_end(args);\r\n  }\r\n  \r\n  // rjf: output debug string\r\n  OutputDebugStringA(buffer);\r\n}\r\n\r\nvoid\r\nraddbg_add_or_remove_breakpoint__impl(void *ptr, int set, int size, int r, int w, int x)\r\n{\r\n  if(raddbg_is_attached())\r\n  {\r\n#pragma pack(push, 8)\r\n    typedef struct RADDBG_AddBreakpointInfo RADDBG_AddBreakpointInfo;\r\n    struct RADDBG_AddBreakpointInfo\r\n    {\r\n      unsigned __int64 vaddr;\r\n      unsigned __int64 size;\r\n      unsigned __int64 r;\r\n      unsigned __int64 w;\r\n      unsigned __int64 x;\r\n      unsigned __int64 add;\r\n    };\r\n#pragma pack(pop)\r\n    RADDBG_AddBreakpointInfo info;\r\n    info.vaddr = (unsigned __int64)ptr;\r\n    info.size  = size;\r\n    info.r     = r;\r\n    info.w     = w;\r\n    info.x     = x;\r\n    info.add   = set;\r\n#pragma warning(push)\r\n#pragma warning(disable: 6320 6322)\r\n    __try\r\n    {\r\n      RaiseException(0x00524145u, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info);\r\n    }\r\n    __except(1)\r\n    {\r\n    }\r\n#pragma warning(pop)\r\n  }\r\n}\r\n\r\nvoid\r\nraddbg_annotate_vaddr_range__impl(void *ptr, unsigned __int64 size, char *fmt, ...)\r\n{\r\n  if(raddbg_is_attached())\r\n  {\r\n    // rjf: resolve variadic arguments\r\n    char buffer[4096];\r\n    int buffer_size = 0;\r\n    {\r\n      va_list args;\r\n      va_start(args, fmt);\r\n      buffer_size = RADDBG_MARKUP_VSNPRINTF(buffer, sizeof(buffer), fmt, args);\r\n      buffer_size = ((buffer_size < 0) ? 0 :\r\n                     (buffer_size > sizeof(buffer)) ? sizeof(buffer) :\r\n                     buffer_size);\r\n      va_end(args);\r\n    }\r\n    \r\n    // rjf: send annotation info via exception\r\n#pragma pack(push, 8)\r\n    typedef struct RADDBG_VaddrRangeAnnotationInfo RADDBG_VaddrRangeAnnotationInfo;\r\n    struct RADDBG_VaddrRangeAnnotationInfo\r\n    {\r\n      unsigned __int64 vaddr;\r\n      unsigned __int64 size;\r\n      void *name;\r\n      unsigned __int64 name_size;\r\n    };\r\n#pragma pack(pop)\r\n    RADDBG_VaddrRangeAnnotationInfo info;\r\n    info.vaddr     = (unsigned __int64)ptr;\r\n    info.size      = size;\r\n    info.name      = buffer;\r\n    info.name_size = buffer_size;\r\n#pragma warning(push)\r\n#pragma warning(disable: 6320 6322)\r\n    __try\r\n    {\r\n      RaiseException(0x00524156u, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info);\r\n    }\r\n    __except(1)\r\n    {\r\n    }\r\n#pragma warning(pop)\r\n  }\r\n}\r\n\r\n#endif // defined(RADDBG_MARKUP_IMPLEMENTATION)\r\n#endif // defined(_WIN32) && !defined(RADDBG_MARKUP_STUBS)\r\n\r\n////////////////////////////////\r\n//~ Win32 STL Type Views\r\n\r\n#if defined(_WIN32) && defined(RADDBG_MARKUP_IMPLEMENTATION) && RADDBG_MARKUP_STL_TYPE_VIEWS\r\n# if defined(_VECTOR_)\r\nraddbg_type_view(std::vector<?>, slice(_Mypair._Myval2));\r\n# endif\r\n# if defined(_MEMORY_)\r\nraddbg_type_view(std::unique_ptr<?>, _Mypair._Myval2);\r\n# endif\r\n# if defined(_STRING_)\r\nraddbg_type_view(std::basic_string<?>, _Mypair._Myval2._Myres <= 15 ? _Mypair._Myval2._Bx._Buf : array(_Mypair._Myval2._Bx._Ptr, _Mypair._Myval2._Mysize));\r\n# endif\r\n# if defined(_STRING_VIEW_)\r\nraddbg_type_view(std::basic_string_view<?>, array(_Mydata, _Mysize));\r\n# endif\r\n#endif // defined(_WIN32) && defined(RADDBG_MARKUP_IMPLEMENTATION) && RADDBG_MARKUP_STL_TYPE_VIEWS\r\n\r\n#endif // RADDBG_MARKUP_H\r\n"
  },
  {
    "path": "src/lib_rdi/rdi.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ (R)AD (D)ebug (I)nfo Format Library\r\n//\r\n// Defines standard RDI debug information format types and\r\n// functions.\r\n\r\n#ifndef RDI_C\r\n#define RDI_C\r\n\r\nRDI_U16 rdi_section_element_size_table[44] =\r\n{\r\nsizeof(RDI_U8),\r\nsizeof(RDI_TopLevelInfo),\r\nsizeof(RDI_U8),\r\nsizeof(RDI_U32),\r\nsizeof(RDI_U32),\r\nsizeof(RDI_BinarySection),\r\nsizeof(RDI_FilePathNode),\r\nsizeof(RDI_SourceFile),\r\nsizeof(RDI_LineTable),\r\nsizeof(RDI_U64),\r\nsizeof(RDI_Line),\r\nsizeof(RDI_Column),\r\nsizeof(RDI_SourceLineMap),\r\nsizeof(RDI_U32),\r\nsizeof(RDI_U32),\r\nsizeof(RDI_U64),\r\nsizeof(RDI_Unit),\r\nsizeof(RDI_VMapEntry),\r\nsizeof(RDI_TypeNode),\r\nsizeof(RDI_UDT),\r\nsizeof(RDI_Member),\r\nsizeof(RDI_EnumMember),\r\nsizeof(RDI_GlobalVariable),\r\nsizeof(RDI_VMapEntry),\r\nsizeof(RDI_ThreadVariable),\r\nsizeof(RDI_Constant),\r\nsizeof(RDI_Procedure),\r\nsizeof(RDI_Scope),\r\nsizeof(RDI_U64),\r\nsizeof(RDI_VMapEntry),\r\nsizeof(RDI_InlineSite),\r\nsizeof(RDI_Local),\r\nsizeof(RDI_LocationBlock),\r\nsizeof(RDI_U8),\r\nsizeof(RDI_U8),\r\nsizeof(RDI_U32),\r\nsizeof(RDI_MD5),\r\nsizeof(RDI_SHA1),\r\nsizeof(RDI_SHA256),\r\nsizeof(RDI_U64),\r\nsizeof(RDI_NameMap),\r\nsizeof(RDI_NameMapBucket),\r\nsizeof(RDI_NameMapNode),\r\nsizeof(RDI_U8),\r\n};\r\n\r\nRDI_U16 rdi_eval_op_ctrlbits_table[53] =\r\n{\r\nRDI_EVAL_CTRLBITS(0, 0, 0),\r\nRDI_EVAL_CTRLBITS(0, 0, 0),\r\nRDI_EVAL_CTRLBITS(1, 1, 0),\r\nRDI_EVAL_CTRLBITS(2, 0, 0),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(4, 0, 1),\r\nRDI_EVAL_CTRLBITS(0, 1, 1),\r\nRDI_EVAL_CTRLBITS(8, 0, 1),\r\nRDI_EVAL_CTRLBITS(4, 0, 1),\r\nRDI_EVAL_CTRLBITS(4, 0, 1),\r\nRDI_EVAL_CTRLBITS(0, 0, 0),\r\nRDI_EVAL_CTRLBITS(0, 0, 0),\r\nRDI_EVAL_CTRLBITS(1, 0, 1),\r\nRDI_EVAL_CTRLBITS(2, 0, 1),\r\nRDI_EVAL_CTRLBITS(4, 0, 1),\r\nRDI_EVAL_CTRLBITS(8, 0, 1),\r\nRDI_EVAL_CTRLBITS(16, 0, 1),\r\nRDI_EVAL_CTRLBITS(1, 0, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(2, 2, 1),\r\nRDI_EVAL_CTRLBITS(2, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(2, 1, 1),\r\nRDI_EVAL_CTRLBITS(1, 0, 1),\r\nRDI_EVAL_CTRLBITS(0, 1, 0),\r\nRDI_EVAL_CTRLBITS(1, 0, 0),\r\nRDI_EVAL_CTRLBITS(1, 2, 1),\r\nRDI_EVAL_CTRLBITS(1, 1, 1),\r\nRDI_EVAL_CTRLBITS(4, 0, 0),\r\nRDI_EVAL_CTRLBITS(4, 0, 0),\r\nRDI_EVAL_CTRLBITS(8, 0, 0),\r\nRDI_EVAL_CTRLBITS(0, 2, 2),\r\nRDI_EVAL_CTRLBITS(0, 0, 0),\r\n};\r\n\r\nstruct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];} rdi_eval_typegroup_conversion_kind_matrix[6] =\r\n{\r\n{{RDI_EvalConversionKind_OtherToOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther, RDI_EvalConversionKind_FromOther}},\r\n{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}},\r\n{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal}},\r\n{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Legal}},\r\n{{RDI_EvalConversionKind_ToOther, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Legal, RDI_EvalConversionKind_Noop}},\r\n{{RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop, RDI_EvalConversionKind_Noop}},\r\n};\r\n\r\nstruct {RDI_U8 *str; RDI_U64 size;} rdi_eval_conversion_kind_message_string_table[6] =\r\n{\r\n{(RDI_U8 *)\"\", sizeof(\"\")},\r\n{(RDI_U8 *)\"\", sizeof(\"\")},\r\n{(RDI_U8 *)\"Cannot convert between these types.\", sizeof(\"Cannot convert between these types.\")},\r\n{(RDI_U8 *)\"Cannot convert to this type.\", sizeof(\"Cannot convert to this type.\")},\r\n{(RDI_U8 *)\"Cannot convert this type.\", sizeof(\"Cannot convert this type.\")},\r\n{(RDI_U8 *)\"\", sizeof(\"\")},\r\n};\r\n\r\nRDI_PROC RDI_U64\r\nrdi_hash(RDI_U8 *ptr, RDI_U64 size)\r\n{\r\n  RDI_U64 result = 0;\r\n  if(size != 0)\r\n  {\r\n    result = 5381;\r\n    RDI_U8 *opl = ptr + size;\r\n    for(;ptr < opl; ptr += 1)\r\n    {\r\n      result = ((result << 5) + result) + *ptr;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U8 *\r\nrdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out)\r\n{\r\nRDI_U8 *result = 0;\r\n*size_out = 0;\r\nswitch (kind)\r\n{\r\ndefault:{}break;\r\ncase RDI_TypeKind_NULL: {result = (RDI_U8*)\"NULL\"; *size_out = sizeof(\"NULL\")-1;}break;\r\ncase RDI_TypeKind_Void: {result = (RDI_U8*)\"Void\"; *size_out = sizeof(\"Void\")-1;}break;\r\ncase RDI_TypeKind_Handle: {result = (RDI_U8*)\"Handle\"; *size_out = sizeof(\"Handle\")-1;}break;\r\ncase RDI_TypeKind_HResult: {result = (RDI_U8*)\"HResult\"; *size_out = sizeof(\"HResult\")-1;}break;\r\ncase RDI_TypeKind_Char8: {result = (RDI_U8*)\"Char8\"; *size_out = sizeof(\"Char8\")-1;}break;\r\ncase RDI_TypeKind_Char16: {result = (RDI_U8*)\"Char16\"; *size_out = sizeof(\"Char16\")-1;}break;\r\ncase RDI_TypeKind_Char32: {result = (RDI_U8*)\"Char32\"; *size_out = sizeof(\"Char32\")-1;}break;\r\ncase RDI_TypeKind_UChar8: {result = (RDI_U8*)\"UChar8\"; *size_out = sizeof(\"UChar8\")-1;}break;\r\ncase RDI_TypeKind_UChar16: {result = (RDI_U8*)\"UChar16\"; *size_out = sizeof(\"UChar16\")-1;}break;\r\ncase RDI_TypeKind_UChar32: {result = (RDI_U8*)\"UChar32\"; *size_out = sizeof(\"UChar32\")-1;}break;\r\ncase RDI_TypeKind_U8: {result = (RDI_U8*)\"U8\"; *size_out = sizeof(\"U8\")-1;}break;\r\ncase RDI_TypeKind_U16: {result = (RDI_U8*)\"U16\"; *size_out = sizeof(\"U16\")-1;}break;\r\ncase RDI_TypeKind_U32: {result = (RDI_U8*)\"U32\"; *size_out = sizeof(\"U32\")-1;}break;\r\ncase RDI_TypeKind_U64: {result = (RDI_U8*)\"U64\"; *size_out = sizeof(\"U64\")-1;}break;\r\ncase RDI_TypeKind_U128: {result = (RDI_U8*)\"U128\"; *size_out = sizeof(\"U128\")-1;}break;\r\ncase RDI_TypeKind_U256: {result = (RDI_U8*)\"U256\"; *size_out = sizeof(\"U256\")-1;}break;\r\ncase RDI_TypeKind_U512: {result = (RDI_U8*)\"U512\"; *size_out = sizeof(\"U512\")-1;}break;\r\ncase RDI_TypeKind_S8: {result = (RDI_U8*)\"S8\"; *size_out = sizeof(\"S8\")-1;}break;\r\ncase RDI_TypeKind_S16: {result = (RDI_U8*)\"S16\"; *size_out = sizeof(\"S16\")-1;}break;\r\ncase RDI_TypeKind_S32: {result = (RDI_U8*)\"S32\"; *size_out = sizeof(\"S32\")-1;}break;\r\ncase RDI_TypeKind_S64: {result = (RDI_U8*)\"S64\"; *size_out = sizeof(\"S64\")-1;}break;\r\ncase RDI_TypeKind_S128: {result = (RDI_U8*)\"S128\"; *size_out = sizeof(\"S128\")-1;}break;\r\ncase RDI_TypeKind_S256: {result = (RDI_U8*)\"S256\"; *size_out = sizeof(\"S256\")-1;}break;\r\ncase RDI_TypeKind_S512: {result = (RDI_U8*)\"S512\"; *size_out = sizeof(\"S512\")-1;}break;\r\ncase RDI_TypeKind_Bool: {result = (RDI_U8*)\"Bool\"; *size_out = sizeof(\"Bool\")-1;}break;\r\ncase RDI_TypeKind_F16: {result = (RDI_U8*)\"F16\"; *size_out = sizeof(\"F16\")-1;}break;\r\ncase RDI_TypeKind_F32: {result = (RDI_U8*)\"F32\"; *size_out = sizeof(\"F32\")-1;}break;\r\ncase RDI_TypeKind_F32PP: {result = (RDI_U8*)\"F32PP\"; *size_out = sizeof(\"F32PP\")-1;}break;\r\ncase RDI_TypeKind_F48: {result = (RDI_U8*)\"F48\"; *size_out = sizeof(\"F48\")-1;}break;\r\ncase RDI_TypeKind_F64: {result = (RDI_U8*)\"F64\"; *size_out = sizeof(\"F64\")-1;}break;\r\ncase RDI_TypeKind_F80: {result = (RDI_U8*)\"F80\"; *size_out = sizeof(\"F80\")-1;}break;\r\ncase RDI_TypeKind_F128: {result = (RDI_U8*)\"F128\"; *size_out = sizeof(\"F128\")-1;}break;\r\ncase RDI_TypeKind_ComplexF32: {result = (RDI_U8*)\"ComplexF32\"; *size_out = sizeof(\"ComplexF32\")-1;}break;\r\ncase RDI_TypeKind_ComplexF64: {result = (RDI_U8*)\"ComplexF64\"; *size_out = sizeof(\"ComplexF64\")-1;}break;\r\ncase RDI_TypeKind_ComplexF80: {result = (RDI_U8*)\"ComplexF80\"; *size_out = sizeof(\"ComplexF80\")-1;}break;\r\ncase RDI_TypeKind_ComplexF128: {result = (RDI_U8*)\"ComplexF128\"; *size_out = sizeof(\"ComplexF128\")-1;}break;\r\ncase RDI_TypeKind_Modifier: {result = (RDI_U8*)\"Modifier\"; *size_out = sizeof(\"Modifier\")-1;}break;\r\ncase RDI_TypeKind_Ptr: {result = (RDI_U8*)\"Ptr\"; *size_out = sizeof(\"Ptr\")-1;}break;\r\ncase RDI_TypeKind_LRef: {result = (RDI_U8*)\"LRef\"; *size_out = sizeof(\"LRef\")-1;}break;\r\ncase RDI_TypeKind_RRef: {result = (RDI_U8*)\"RRef\"; *size_out = sizeof(\"RRef\")-1;}break;\r\ncase RDI_TypeKind_Array: {result = (RDI_U8*)\"Array\"; *size_out = sizeof(\"Array\")-1;}break;\r\ncase RDI_TypeKind_Function: {result = (RDI_U8*)\"Function\"; *size_out = sizeof(\"Function\")-1;}break;\r\ncase RDI_TypeKind_Method: {result = (RDI_U8*)\"Method\"; *size_out = sizeof(\"Method\")-1;}break;\r\ncase RDI_TypeKind_MemberPtr: {result = (RDI_U8*)\"MemberPtr\"; *size_out = sizeof(\"MemberPtr\")-1;}break;\r\ncase RDI_TypeKind_Struct: {result = (RDI_U8*)\"Struct\"; *size_out = sizeof(\"Struct\")-1;}break;\r\ncase RDI_TypeKind_Class: {result = (RDI_U8*)\"Class\"; *size_out = sizeof(\"Class\")-1;}break;\r\ncase RDI_TypeKind_Union: {result = (RDI_U8*)\"Union\"; *size_out = sizeof(\"Union\")-1;}break;\r\ncase RDI_TypeKind_Enum: {result = (RDI_U8*)\"Enum\"; *size_out = sizeof(\"Enum\")-1;}break;\r\ncase RDI_TypeKind_Alias: {result = (RDI_U8*)\"Alias\"; *size_out = sizeof(\"Alias\")-1;}break;\r\ncase RDI_TypeKind_IncompleteStruct: {result = (RDI_U8*)\"IncompleteStruct\"; *size_out = sizeof(\"IncompleteStruct\")-1;}break;\r\ncase RDI_TypeKind_IncompleteUnion: {result = (RDI_U8*)\"IncompleteUnion\"; *size_out = sizeof(\"IncompleteUnion\")-1;}break;\r\ncase RDI_TypeKind_IncompleteClass: {result = (RDI_U8*)\"IncompleteClass\"; *size_out = sizeof(\"IncompleteClass\")-1;}break;\r\ncase RDI_TypeKind_IncompleteEnum: {result = (RDI_U8*)\"IncompleteEnum\"; *size_out = sizeof(\"IncompleteEnum\")-1;}break;\r\ncase RDI_TypeKind_Bitfield: {result = (RDI_U8*)\"Bitfield\"; *size_out = sizeof(\"Bitfield\")-1;}break;\r\ncase RDI_TypeKind_Variadic: {result = (RDI_U8*)\"Variadic\"; *size_out = sizeof(\"Variadic\")-1;}break;\r\ncase RDI_TypeKind_Count: {result = (RDI_U8*)\"Count\"; *size_out = sizeof(\"Count\")-1;}break;\r\n}\r\nreturn result;\r\n}\r\n\r\nRDI_PROC RDI_U32\r\nrdi_size_from_basic_type_kind(RDI_TypeKind kind)\r\n{\r\nRDI_U32 result = 0;\r\nswitch(kind)\r\n{\r\ndefault:{}break;\r\ncase RDI_TypeKind_Handle:{result = 0xFFFFFFFF;}break;\r\ncase RDI_TypeKind_HResult:{result = 4;}break;\r\ncase RDI_TypeKind_Char8:{result = 1;}break;\r\ncase RDI_TypeKind_Char16:{result = 2;}break;\r\ncase RDI_TypeKind_Char32:{result = 4;}break;\r\ncase RDI_TypeKind_UChar8:{result = 1;}break;\r\ncase RDI_TypeKind_UChar16:{result = 2;}break;\r\ncase RDI_TypeKind_UChar32:{result = 4;}break;\r\ncase RDI_TypeKind_U8:{result = 1;}break;\r\ncase RDI_TypeKind_U16:{result = 2;}break;\r\ncase RDI_TypeKind_U32:{result = 4;}break;\r\ncase RDI_TypeKind_U64:{result = 8;}break;\r\ncase RDI_TypeKind_U128:{result = 16;}break;\r\ncase RDI_TypeKind_U256:{result = 32;}break;\r\ncase RDI_TypeKind_U512:{result = 64;}break;\r\ncase RDI_TypeKind_S8:{result = 1;}break;\r\ncase RDI_TypeKind_S16:{result = 2;}break;\r\ncase RDI_TypeKind_S32:{result = 4;}break;\r\ncase RDI_TypeKind_S64:{result = 8;}break;\r\ncase RDI_TypeKind_S128:{result = 16;}break;\r\ncase RDI_TypeKind_S256:{result = 32;}break;\r\ncase RDI_TypeKind_S512:{result = 64;}break;\r\ncase RDI_TypeKind_Bool:{result = 1;}break;\r\ncase RDI_TypeKind_F16:{result = 2;}break;\r\ncase RDI_TypeKind_F32:{result = 4;}break;\r\ncase RDI_TypeKind_F32PP:{result = 4;}break;\r\ncase RDI_TypeKind_F48:{result = 6;}break;\r\ncase RDI_TypeKind_F64:{result = 8;}break;\r\ncase RDI_TypeKind_F80:{result = 10;}break;\r\ncase RDI_TypeKind_F128:{result = 16;}break;\r\ncase RDI_TypeKind_ComplexF32:{result = 8;}break;\r\ncase RDI_TypeKind_ComplexF64:{result = 16;}break;\r\ncase RDI_TypeKind_ComplexF80:{result = 20;}break;\r\ncase RDI_TypeKind_ComplexF128:{result = 32;}break;\r\n}\r\nreturn result;\r\n}\r\n\r\nRDI_PROC RDI_U32\r\nrdi_addr_size_from_arch(RDI_Arch arch)\r\n{\r\nRDI_U32 result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase RDI_Arch_X86:{result = 4;}break;\r\ncase RDI_Arch_X64:{result = 8;}break;\r\n}\r\nreturn result;\r\n}\r\n\r\nRDI_PROC RDI_EvalConversionKind\r\nrdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out)\r\n{\r\n  RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out];\r\n  return k;\r\n}\r\n\r\nRDI_PROC RDI_S32\r\nrdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group)\r\n{\r\n  RDI_S32 result = 0;\r\n  switch(op)\r\n  {\r\n    case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub:\r\n    case RDI_EvalOp_Mul: case RDI_EvalOp_Div:\r\n    case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq:\r\n    case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq:\r\n    case RDI_EvalOp_Less:case RDI_EvalOp_Grtr:\r\n    {\r\n      if(group != RDI_EvalTypeGroup_Other)\r\n      {\r\n        result = 1;\r\n      }\r\n    }break;\r\n    case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift:\r\n    case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor:\r\n    case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd:\r\n    case RDI_EvalOp_LogOr: \r\n    {\r\n      if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U)\r\n      {\r\n        result = 1;\r\n      }\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U8 *\r\nrdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out)\r\n{\r\n  *size_out = rdi_eval_conversion_kind_message_string_table[kind].size;\r\n  return rdi_eval_conversion_kind_message_string_table[kind].str;\r\n}\r\n\r\nRDI_PROC RDI_SectionKind\r\nrdi_section_kind_from_checksum_kind(RDI_ChecksumKind kind)\r\n{\r\nRDI_SectionKind result = 0;\r\nswitch(kind)\r\n{\r\ndefault:{}break;\r\ncase RDI_ChecksumKind_NULL:{result = RDI_SectionKind_NULL;}break;\r\ncase RDI_ChecksumKind_MD5:{result = RDI_SectionKind_MD5Checksums;}break;\r\ncase RDI_ChecksumKind_SHA1:{result = RDI_SectionKind_SHA1Checksums;}break;\r\ncase RDI_ChecksumKind_SHA256:{result = RDI_SectionKind_SHA256Checksums;}break;\r\ncase RDI_ChecksumKind_Timestamp:{result = RDI_SectionKind_Timestamps;}break;\r\ncase RDI_ChecksumKind_COUNT:{result = RDI_SectionKind_NULL;}break;\r\n}\r\nreturn result;\r\n}\r\n\r\n#endif // RDI_C\r\n"
  },
  {
    "path": "src/lib_rdi/rdi.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ (R)AD (D)ebug (I)nfo Format Library\r\n//\r\n// Defines standard RDI debug information format types and\r\n// functions.\r\n\r\n#ifndef RDI_H\r\n#define RDI_H\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ Overridable Procedure Decoration\r\n\r\n#if !defined(RDI_PROC)\r\n# define RDI_PROC static\r\n#endif\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ Overridable Basic Integer Types\r\n\r\n#if !defined(RDI_U8)\r\n# define RDI_U8 RDI_U8\r\n# define RDI_U16 RDI_U16\r\n# define RDI_U32 RDI_U32\r\n# define RDI_U64 RDI_U64\r\n# define RDI_S8 RDI_S8\r\n# define RDI_S16 RDI_S16\r\n# define RDI_S32 RDI_S32\r\n# define RDI_S64 RDI_S64\r\n#include <stdint.h>\r\ntypedef uint8_t  RDI_U8;\r\ntypedef uint16_t RDI_U16;\r\ntypedef uint32_t RDI_U32;\r\ntypedef uint64_t RDI_U64;\r\ntypedef int8_t   RDI_S8;\r\ntypedef int16_t  RDI_S16;\r\ntypedef int32_t  RDI_S32;\r\ntypedef int64_t  RDI_S64;\r\n#endif\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ Checksum Types\r\n\r\ntypedef union RDI_MD5 RDI_MD5;\r\nunion RDI_MD5 {RDI_U8 u8[16]; RDI_U64 u64[2];};\r\n\r\ntypedef union RDI_SHA1 RDI_SHA1;\r\nunion RDI_SHA1 {RDI_U8 u8[20];};\r\n\r\ntypedef union RDI_SHA256 RDI_SHA256;\r\nunion RDI_SHA256 {RDI_U8 u8[32]; RDI_U64 u64[4];};\r\n\r\ntypedef union RDI_GUID RDI_GUID;\r\nunion RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];};\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ Overridable Enabling/Disabling Of Table Index Typechecking\r\n\r\n#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING)\r\n# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0\r\n#endif\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ Format Constants\r\n\r\n// \"raddbg\\0\\0\"\r\n#define RDI_MAGIC_CONSTANT   0x0000676264646172\r\n#define RDI_ENCODING_VERSION 17\r\n\r\n////////////////////////////////////////////////////////////////\r\n//~ Format Types & Functions\r\n\r\ntypedef RDI_U32 RDI_SectionKind;\r\ntypedef enum RDI_SectionKindEnum\r\n{\r\nRDI_SectionKind_NULL                 = 0x0000,\r\nRDI_SectionKind_TopLevelInfo         = 0x0001,\r\nRDI_SectionKind_StringData           = 0x0002,\r\nRDI_SectionKind_StringTable          = 0x0003,\r\nRDI_SectionKind_IndexRuns            = 0x0004,\r\nRDI_SectionKind_BinarySections       = 0x0005,\r\nRDI_SectionKind_FilePathNodes        = 0x0006,\r\nRDI_SectionKind_SourceFiles          = 0x0007,\r\nRDI_SectionKind_LineTables           = 0x0008,\r\nRDI_SectionKind_LineInfoVOffs        = 0x0009,\r\nRDI_SectionKind_LineInfoLines        = 0x000A,\r\nRDI_SectionKind_LineInfoColumns      = 0x000B,\r\nRDI_SectionKind_SourceLineMaps       = 0x000C,\r\nRDI_SectionKind_SourceLineMapNumbers = 0x000D,\r\nRDI_SectionKind_SourceLineMapRanges  = 0x000E,\r\nRDI_SectionKind_SourceLineMapVOffs   = 0x000F,\r\nRDI_SectionKind_Units                = 0x0010,\r\nRDI_SectionKind_UnitVMap             = 0x0011,\r\nRDI_SectionKind_TypeNodes            = 0x0012,\r\nRDI_SectionKind_UDTs                 = 0x0013,\r\nRDI_SectionKind_Members              = 0x0014,\r\nRDI_SectionKind_EnumMembers          = 0x0015,\r\nRDI_SectionKind_GlobalVariables      = 0x0016,\r\nRDI_SectionKind_GlobalVMap           = 0x0017,\r\nRDI_SectionKind_ThreadVariables      = 0x0018,\r\nRDI_SectionKind_Constants            = 0x0019,\r\nRDI_SectionKind_Procedures           = 0x001A,\r\nRDI_SectionKind_Scopes               = 0x001B,\r\nRDI_SectionKind_ScopeVOffData        = 0x001C,\r\nRDI_SectionKind_ScopeVMap            = 0x001D,\r\nRDI_SectionKind_InlineSites          = 0x001E,\r\nRDI_SectionKind_Locals               = 0x001F,\r\nRDI_SectionKind_LocationBlocks       = 0x0020,\r\nRDI_SectionKind_LocationData         = 0x0021,\r\nRDI_SectionKind_ConstantValueData    = 0x0022,\r\nRDI_SectionKind_ConstantValueTable   = 0x0023,\r\nRDI_SectionKind_MD5Checksums         = 0x0024,\r\nRDI_SectionKind_SHA1Checksums        = 0x0025,\r\nRDI_SectionKind_SHA256Checksums      = 0x0026,\r\nRDI_SectionKind_Timestamps           = 0x0027,\r\nRDI_SectionKind_NameMaps             = 0x0028,\r\nRDI_SectionKind_NameMapBuckets       = 0x0029,\r\nRDI_SectionKind_NameMapNodes         = 0x002A,\r\nRDI_SectionKind_COUNT                = 0x002B,\r\n} RDI_SectionKindEnum;\r\n\r\ntypedef RDI_U32 RDI_SectionEncoding;\r\ntypedef enum RDI_SectionEncodingEnum\r\n{\r\nRDI_SectionEncoding_Unpacked   = 0,\r\nRDI_SectionEncoding_LZB        = 1,\r\n} RDI_SectionEncodingEnum;\r\n\r\ntypedef RDI_U32 RDI_Arch;\r\ntypedef enum RDI_ArchEnum\r\n{\r\nRDI_Arch_NULL       = 0,\r\nRDI_Arch_X86        = 1,\r\nRDI_Arch_X64        = 2,\r\n} RDI_ArchEnum;\r\n\r\ntypedef RDI_U8 RDI_RegCode;\r\ntypedef enum RDI_RegCodeEnum\r\n{\r\nRDI_RegCode_nil,\r\n} RDI_RegCodeEnum;\r\n\r\ntypedef RDI_U8 RDI_RegCodeX86;\r\ntypedef enum RDI_RegCodeX86Enum\r\n{\r\nRDI_RegCodeX86_nil        = 0,\r\nRDI_RegCodeX86_eax        = 1,\r\nRDI_RegCodeX86_ecx        = 2,\r\nRDI_RegCodeX86_edx        = 3,\r\nRDI_RegCodeX86_ebx        = 4,\r\nRDI_RegCodeX86_esp        = 5,\r\nRDI_RegCodeX86_ebp        = 6,\r\nRDI_RegCodeX86_esi        = 7,\r\nRDI_RegCodeX86_edi        = 8,\r\nRDI_RegCodeX86_fsbase     = 9,\r\nRDI_RegCodeX86_gsbase     = 10,\r\nRDI_RegCodeX86_eflags     = 11,\r\nRDI_RegCodeX86_eip        = 12,\r\nRDI_RegCodeX86_dr0        = 13,\r\nRDI_RegCodeX86_dr1        = 14,\r\nRDI_RegCodeX86_dr2        = 15,\r\nRDI_RegCodeX86_dr3        = 16,\r\nRDI_RegCodeX86_dr4        = 17,\r\nRDI_RegCodeX86_dr5        = 18,\r\nRDI_RegCodeX86_dr6        = 19,\r\nRDI_RegCodeX86_dr7        = 20,\r\nRDI_RegCodeX86_fpr0       = 21,\r\nRDI_RegCodeX86_fpr1       = 22,\r\nRDI_RegCodeX86_fpr2       = 23,\r\nRDI_RegCodeX86_fpr3       = 24,\r\nRDI_RegCodeX86_fpr4       = 25,\r\nRDI_RegCodeX86_fpr5       = 26,\r\nRDI_RegCodeX86_fpr6       = 27,\r\nRDI_RegCodeX86_fpr7       = 28,\r\nRDI_RegCodeX86_st0        = 29,\r\nRDI_RegCodeX86_st1        = 30,\r\nRDI_RegCodeX86_st2        = 31,\r\nRDI_RegCodeX86_st3        = 32,\r\nRDI_RegCodeX86_st4        = 33,\r\nRDI_RegCodeX86_st5        = 34,\r\nRDI_RegCodeX86_st6        = 35,\r\nRDI_RegCodeX86_st7        = 36,\r\nRDI_RegCodeX86_fcw        = 37,\r\nRDI_RegCodeX86_fsw        = 38,\r\nRDI_RegCodeX86_ftw        = 39,\r\nRDI_RegCodeX86_fop        = 40,\r\nRDI_RegCodeX86_fcs        = 41,\r\nRDI_RegCodeX86_fds        = 42,\r\nRDI_RegCodeX86_fip        = 43,\r\nRDI_RegCodeX86_fdp        = 44,\r\nRDI_RegCodeX86_mxcsr      = 45,\r\nRDI_RegCodeX86_mxcsr_mask = 46,\r\nRDI_RegCodeX86_ss         = 47,\r\nRDI_RegCodeX86_cs         = 48,\r\nRDI_RegCodeX86_ds         = 49,\r\nRDI_RegCodeX86_es         = 50,\r\nRDI_RegCodeX86_fs         = 51,\r\nRDI_RegCodeX86_gs         = 52,\r\nRDI_RegCodeX86_ymm0       = 53,\r\nRDI_RegCodeX86_ymm1       = 54,\r\nRDI_RegCodeX86_ymm2       = 55,\r\nRDI_RegCodeX86_ymm3       = 56,\r\nRDI_RegCodeX86_ymm4       = 57,\r\nRDI_RegCodeX86_ymm5       = 58,\r\nRDI_RegCodeX86_ymm6       = 59,\r\nRDI_RegCodeX86_ymm7       = 60,\r\nRDI_RegCodeX86_tr         = 61,\r\nRDI_RegCodeX86_ldtr       = 62,\r\n} RDI_RegCodeX86Enum;\r\n\r\ntypedef RDI_U8 RDI_RegCodeX64;\r\ntypedef enum RDI_RegCodeX64Enum\r\n{\r\nRDI_RegCodeX64_nil        = 0,\r\nRDI_RegCodeX64_rax        = 1,\r\nRDI_RegCodeX64_rcx        = 2,\r\nRDI_RegCodeX64_rdx        = 3,\r\nRDI_RegCodeX64_rbx        = 4,\r\nRDI_RegCodeX64_rsp        = 5,\r\nRDI_RegCodeX64_rbp        = 6,\r\nRDI_RegCodeX64_rsi        = 7,\r\nRDI_RegCodeX64_rdi        = 8,\r\nRDI_RegCodeX64_r8         = 9,\r\nRDI_RegCodeX64_r9         = 10,\r\nRDI_RegCodeX64_r10        = 11,\r\nRDI_RegCodeX64_r11        = 12,\r\nRDI_RegCodeX64_r12        = 13,\r\nRDI_RegCodeX64_r13        = 14,\r\nRDI_RegCodeX64_r14        = 15,\r\nRDI_RegCodeX64_r15        = 16,\r\nRDI_RegCodeX64_es         = 17,\r\nRDI_RegCodeX64_cs         = 18,\r\nRDI_RegCodeX64_ss         = 19,\r\nRDI_RegCodeX64_ds         = 20,\r\nRDI_RegCodeX64_fs         = 21,\r\nRDI_RegCodeX64_gs         = 22,\r\nRDI_RegCodeX64_rip        = 23,\r\nRDI_RegCodeX64_rflags     = 24,\r\nRDI_RegCodeX64_dr0        = 25,\r\nRDI_RegCodeX64_dr1        = 26,\r\nRDI_RegCodeX64_dr2        = 27,\r\nRDI_RegCodeX64_dr3        = 28,\r\nRDI_RegCodeX64_dr4        = 29,\r\nRDI_RegCodeX64_dr5        = 30,\r\nRDI_RegCodeX64_dr6        = 31,\r\nRDI_RegCodeX64_dr7        = 32,\r\nRDI_RegCodeX64_st0        = 33,\r\nRDI_RegCodeX64_st1        = 34,\r\nRDI_RegCodeX64_st2        = 35,\r\nRDI_RegCodeX64_st3        = 36,\r\nRDI_RegCodeX64_st4        = 37,\r\nRDI_RegCodeX64_st5        = 38,\r\nRDI_RegCodeX64_st6        = 39,\r\nRDI_RegCodeX64_st7        = 40,\r\nRDI_RegCodeX64_fpr0       = 41,\r\nRDI_RegCodeX64_fpr1       = 42,\r\nRDI_RegCodeX64_fpr2       = 43,\r\nRDI_RegCodeX64_fpr3       = 44,\r\nRDI_RegCodeX64_fpr4       = 45,\r\nRDI_RegCodeX64_fpr5       = 46,\r\nRDI_RegCodeX64_fpr6       = 47,\r\nRDI_RegCodeX64_fpr7       = 48,\r\nRDI_RegCodeX64_zmm0       = 49,\r\nRDI_RegCodeX64_zmm1       = 50,\r\nRDI_RegCodeX64_zmm2       = 51,\r\nRDI_RegCodeX64_zmm3       = 52,\r\nRDI_RegCodeX64_zmm4       = 53,\r\nRDI_RegCodeX64_zmm5       = 54,\r\nRDI_RegCodeX64_zmm6       = 55,\r\nRDI_RegCodeX64_zmm7       = 56,\r\nRDI_RegCodeX64_zmm8       = 57,\r\nRDI_RegCodeX64_zmm9       = 58,\r\nRDI_RegCodeX64_zmm10      = 59,\r\nRDI_RegCodeX64_zmm11      = 60,\r\nRDI_RegCodeX64_zmm12      = 61,\r\nRDI_RegCodeX64_zmm13      = 62,\r\nRDI_RegCodeX64_zmm14      = 63,\r\nRDI_RegCodeX64_zmm15      = 64,\r\nRDI_RegCodeX64_zmm16      = 65,\r\nRDI_RegCodeX64_zmm17      = 66,\r\nRDI_RegCodeX64_zmm18      = 67,\r\nRDI_RegCodeX64_zmm19      = 68,\r\nRDI_RegCodeX64_zmm20      = 69,\r\nRDI_RegCodeX64_zmm21      = 70,\r\nRDI_RegCodeX64_zmm22      = 71,\r\nRDI_RegCodeX64_zmm23      = 72,\r\nRDI_RegCodeX64_zmm24      = 73,\r\nRDI_RegCodeX64_zmm25      = 74,\r\nRDI_RegCodeX64_zmm26      = 75,\r\nRDI_RegCodeX64_zmm27      = 76,\r\nRDI_RegCodeX64_zmm28      = 77,\r\nRDI_RegCodeX64_zmm29      = 78,\r\nRDI_RegCodeX64_zmm30      = 79,\r\nRDI_RegCodeX64_zmm31      = 80,\r\nRDI_RegCodeX64_k0         = 81,\r\nRDI_RegCodeX64_k1         = 82,\r\nRDI_RegCodeX64_k2         = 83,\r\nRDI_RegCodeX64_k3         = 84,\r\nRDI_RegCodeX64_k4         = 85,\r\nRDI_RegCodeX64_k5         = 86,\r\nRDI_RegCodeX64_k6         = 87,\r\nRDI_RegCodeX64_k7         = 88,\r\nRDI_RegCodeX64_mxcsr      = 89,\r\nRDI_RegCodeX64_fsbase     = 90,\r\nRDI_RegCodeX64_gsbase     = 91,\r\nRDI_RegCodeX64_fcw        = 92,\r\nRDI_RegCodeX64_fsw        = 93,\r\nRDI_RegCodeX64_ftw        = 94,\r\nRDI_RegCodeX64_fop        = 95,\r\nRDI_RegCodeX64_fcs        = 96,\r\nRDI_RegCodeX64_fds        = 97,\r\nRDI_RegCodeX64_fip        = 98,\r\nRDI_RegCodeX64_fdp        = 99,\r\nRDI_RegCodeX64_mxcsr_mask = 100,\r\nRDI_RegCodeX64_cetmsr     = 101,\r\nRDI_RegCodeX64_cetssp     = 102,\r\nRDI_RegCodeX64_tr         = 103,\r\nRDI_RegCodeX64_ldtr       = 104,\r\n} RDI_RegCodeX64Enum;\r\n\r\ntypedef RDI_U32 RDI_BinarySectionFlags;\r\ntypedef enum RDI_BinarySectionFlagsEnum\r\n{\r\nRDI_BinarySectionFlag_Read       = 1<<0,\r\nRDI_BinarySectionFlag_Write      = 1<<1,\r\nRDI_BinarySectionFlag_Execute    = 1<<2,\r\n} RDI_BinarySectionFlagsEnum;\r\n\r\ntypedef RDI_U32 RDI_ChecksumKind;\r\ntypedef enum RDI_ChecksumKindEnum\r\n{\r\nRDI_ChecksumKind_NULL       = 0,\r\nRDI_ChecksumKind_MD5        = 1,\r\nRDI_ChecksumKind_SHA1       = 2,\r\nRDI_ChecksumKind_SHA256     = 3,\r\nRDI_ChecksumKind_Timestamp  = 4,\r\nRDI_ChecksumKind_COUNT      = 5,\r\n} RDI_ChecksumKindEnum;\r\n\r\ntypedef RDI_U32 RDI_Language;\r\ntypedef enum RDI_LanguageEnum\r\n{\r\nRDI_Language_NULL       = 0,\r\nRDI_Language_C          = 1,\r\nRDI_Language_CPlusPlus  = 2,\r\nRDI_Language_Masm       = 3,\r\nRDI_Language_COUNT      = 4,\r\n} RDI_LanguageEnum;\r\n\r\ntypedef RDI_U16 RDI_TypeKind;\r\ntypedef enum RDI_TypeKindEnum\r\n{\r\nRDI_TypeKind_NULL                 = 0x0000,\r\nRDI_TypeKind_Void                 = 0x0001,\r\nRDI_TypeKind_Handle               = 0x0002,\r\nRDI_TypeKind_HResult              = 0x0003,\r\nRDI_TypeKind_Char8                = 0x0004,\r\nRDI_TypeKind_Char16               = 0x0005,\r\nRDI_TypeKind_Char32               = 0x0006,\r\nRDI_TypeKind_UChar8               = 0x0007,\r\nRDI_TypeKind_UChar16              = 0x0008,\r\nRDI_TypeKind_UChar32              = 0x0009,\r\nRDI_TypeKind_U8                   = 0x000A,\r\nRDI_TypeKind_U16                  = 0x000B,\r\nRDI_TypeKind_U32                  = 0x000C,\r\nRDI_TypeKind_U64                  = 0x000D,\r\nRDI_TypeKind_U128                 = 0x000E,\r\nRDI_TypeKind_U256                 = 0x000F,\r\nRDI_TypeKind_U512                 = 0x0010,\r\nRDI_TypeKind_S8                   = 0x0011,\r\nRDI_TypeKind_S16                  = 0x0012,\r\nRDI_TypeKind_S32                  = 0x0013,\r\nRDI_TypeKind_S64                  = 0x0014,\r\nRDI_TypeKind_S128                 = 0x0015,\r\nRDI_TypeKind_S256                 = 0x0016,\r\nRDI_TypeKind_S512                 = 0x0017,\r\nRDI_TypeKind_Bool                 = 0x0018,\r\nRDI_TypeKind_F16                  = 0x0019,\r\nRDI_TypeKind_F32                  = 0x001A,\r\nRDI_TypeKind_F32PP                = 0x001B,\r\nRDI_TypeKind_F48                  = 0x001C,\r\nRDI_TypeKind_F64                  = 0x001D,\r\nRDI_TypeKind_F80                  = 0x001E,\r\nRDI_TypeKind_F128                 = 0x001F,\r\nRDI_TypeKind_ComplexF32           = 0x0020,\r\nRDI_TypeKind_ComplexF64           = 0x0021,\r\nRDI_TypeKind_ComplexF80           = 0x0022,\r\nRDI_TypeKind_ComplexF128          = 0x0023,\r\nRDI_TypeKind_Modifier             = 0x1000,\r\nRDI_TypeKind_Ptr                  = 0x1001,\r\nRDI_TypeKind_LRef                 = 0x1002,\r\nRDI_TypeKind_RRef                 = 0x1003,\r\nRDI_TypeKind_Array                = 0x1004,\r\nRDI_TypeKind_Function             = 0x1005,\r\nRDI_TypeKind_Method               = 0x1006,\r\nRDI_TypeKind_MemberPtr            = 0x1007,\r\nRDI_TypeKind_Struct               = 0x2000,\r\nRDI_TypeKind_Class                = 0x2001,\r\nRDI_TypeKind_Union                = 0x2002,\r\nRDI_TypeKind_Enum                 = 0x2003,\r\nRDI_TypeKind_Alias                = 0x2004,\r\nRDI_TypeKind_IncompleteStruct     = 0x2005,\r\nRDI_TypeKind_IncompleteUnion      = 0x2006,\r\nRDI_TypeKind_IncompleteClass      = 0x2007,\r\nRDI_TypeKind_IncompleteEnum       = 0x2008,\r\nRDI_TypeKind_Bitfield             = 0xF000,\r\nRDI_TypeKind_Variadic             = 0xF001,\r\nRDI_TypeKind_Count                = 0xF002,\r\nRDI_TypeKind_FirstBuiltIn         = RDI_TypeKind_Void,\r\nRDI_TypeKind_LastBuiltIn          = RDI_TypeKind_ComplexF128,\r\nRDI_TypeKind_FirstConstructed     = RDI_TypeKind_Modifier,\r\nRDI_TypeKind_LastConstructed      = RDI_TypeKind_MemberPtr,\r\nRDI_TypeKind_FirstUserDefined     = RDI_TypeKind_Struct,\r\nRDI_TypeKind_LastRecord           = RDI_TypeKind_Union,\r\nRDI_TypeKind_FirstIncomplete      = RDI_TypeKind_IncompleteStruct,\r\nRDI_TypeKind_LastIncomplete       = RDI_TypeKind_IncompleteEnum,\r\nRDI_TypeKind_FirstRecord          = RDI_TypeKind_Struct,\r\nRDI_TypeKind_LastUserDefined      = RDI_TypeKind_IncompleteEnum,\r\n} RDI_TypeKindEnum;\r\n\r\ntypedef RDI_U16 RDI_TypeModifierFlags;\r\ntypedef enum RDI_TypeModifierFlagsEnum\r\n{\r\nRDI_TypeModifierFlag_Const                = 1<<0,\r\nRDI_TypeModifierFlag_Volatile             = 1<<1,\r\nRDI_TypeModifierFlag_Restrict             = 1<<2,\r\n} RDI_TypeModifierFlagsEnum;\r\n\r\ntypedef RDI_U32 RDI_UDTFlags;\r\ntypedef enum RDI_UDTFlagsEnum\r\n{\r\nRDI_UDTFlag_EnumMembers          = 1<<0,\r\n} RDI_UDTFlagsEnum;\r\n\r\ntypedef RDI_U16 RDI_MemberKind;\r\ntypedef enum RDI_MemberKindEnum\r\n{\r\nRDI_MemberKind_NULL                      = 0x0000,\r\nRDI_MemberKind_DataField                 = 0x0001,\r\nRDI_MemberKind_StaticData                = 0x0002,\r\nRDI_MemberKind_Method                    = 0x0100,\r\nRDI_MemberKind_StaticMethod              = 0x0101,\r\nRDI_MemberKind_VirtualMethod             = 0x0102,\r\nRDI_MemberKind_VTablePtr                 = 0x0200,\r\nRDI_MemberKind_Base                      = 0x0201,\r\nRDI_MemberKind_VirtualBase               = 0x0202,\r\nRDI_MemberKind_NestedType                = 0x0300,\r\n} RDI_MemberKindEnum;\r\n\r\ntypedef RDI_U32 RDI_LinkFlags;\r\ntypedef enum RDI_LinkFlagsEnum\r\n{\r\nRDI_LinkFlag_External             = 1<<0,\r\nRDI_LinkFlag_TypeScoped           = 1<<1,\r\nRDI_LinkFlag_ProcScoped           = 1<<2,\r\n} RDI_LinkFlagsEnum;\r\n\r\ntypedef RDI_U32 RDI_LocalKind;\r\ntypedef enum RDI_LocalKindEnum\r\n{\r\nRDI_LocalKind_NULL                 = 0x0,\r\nRDI_LocalKind_Parameter            = 0x1,\r\nRDI_LocalKind_Variable             = 0x2,\r\n} RDI_LocalKindEnum;\r\n\r\ntypedef RDI_U8 RDI_LocationKind;\r\ntypedef enum RDI_LocationKindEnum\r\n{\r\nRDI_LocationKind_NULL                 = 0x0,\r\nRDI_LocationKind_AddrBytecodeStream   = 0x1,\r\nRDI_LocationKind_ValBytecodeStream    = 0x2,\r\nRDI_LocationKind_AddrRegPlusU16       = 0x3,\r\nRDI_LocationKind_AddrAddrRegPlusU16   = 0x4,\r\nRDI_LocationKind_ValReg               = 0x5,\r\n} RDI_LocationKindEnum;\r\n\r\ntypedef RDI_U8 RDI_EvalOp;\r\ntypedef enum RDI_EvalOpEnum\r\n{\r\nRDI_EvalOp_Stop                 = 0,\r\nRDI_EvalOp_Noop                 = 1,\r\nRDI_EvalOp_Cond                 = 2,\r\nRDI_EvalOp_Skip                 = 3,\r\nRDI_EvalOp_MemRead              = 4,\r\nRDI_EvalOp_RegRead              = 5,\r\nRDI_EvalOp_RegReadDyn           = 6,\r\nRDI_EvalOp_FrameOff             = 7,\r\nRDI_EvalOp_ModuleOff            = 8,\r\nRDI_EvalOp_TLSOff               = 9,\r\nRDI_EvalOp_ObjectOff            = 10,\r\nRDI_EvalOp_CFA                  = 11,\r\nRDI_EvalOp_ConstU8              = 12,\r\nRDI_EvalOp_ConstU16             = 13,\r\nRDI_EvalOp_ConstU32             = 14,\r\nRDI_EvalOp_ConstU64             = 15,\r\nRDI_EvalOp_ConstU128            = 16,\r\nRDI_EvalOp_ConstString          = 17,\r\nRDI_EvalOp_Abs                  = 18,\r\nRDI_EvalOp_Neg                  = 19,\r\nRDI_EvalOp_Add                  = 20,\r\nRDI_EvalOp_Sub                  = 21,\r\nRDI_EvalOp_Mul                  = 22,\r\nRDI_EvalOp_Div                  = 23,\r\nRDI_EvalOp_Mod                  = 24,\r\nRDI_EvalOp_LShift               = 25,\r\nRDI_EvalOp_RShift               = 26,\r\nRDI_EvalOp_BitAnd               = 27,\r\nRDI_EvalOp_BitOr                = 28,\r\nRDI_EvalOp_BitXor               = 29,\r\nRDI_EvalOp_BitNot               = 30,\r\nRDI_EvalOp_LogAnd               = 31,\r\nRDI_EvalOp_LogOr                = 32,\r\nRDI_EvalOp_LogNot               = 33,\r\nRDI_EvalOp_EqEq                 = 34,\r\nRDI_EvalOp_NtEq                 = 35,\r\nRDI_EvalOp_LsEq                 = 36,\r\nRDI_EvalOp_GrEq                 = 37,\r\nRDI_EvalOp_Less                 = 38,\r\nRDI_EvalOp_Grtr                 = 39,\r\nRDI_EvalOp_Trunc                = 40,\r\nRDI_EvalOp_TruncSigned          = 41,\r\nRDI_EvalOp_Convert              = 42,\r\nRDI_EvalOp_Pick                 = 43,\r\nRDI_EvalOp_Pop                  = 44,\r\nRDI_EvalOp_Insert               = 45,\r\nRDI_EvalOp_ValueRead            = 46,\r\nRDI_EvalOp_ByteSwap             = 47,\r\nRDI_EvalOp_CallSiteValue        = 48,\r\nRDI_EvalOp_PartialValue         = 49,\r\nRDI_EvalOp_PartialValueBit      = 50,\r\nRDI_EvalOp_Swap                 = 51,\r\nRDI_EvalOp_COUNT                = 52,\r\n} RDI_EvalOpEnum;\r\n\r\ntypedef RDI_U8 RDI_EvalTypeGroup;\r\ntypedef enum RDI_EvalTypeGroupEnum\r\n{\r\nRDI_EvalTypeGroup_Other                = 0,\r\nRDI_EvalTypeGroup_U                    = 1,\r\nRDI_EvalTypeGroup_S                    = 2,\r\nRDI_EvalTypeGroup_F32                  = 3,\r\nRDI_EvalTypeGroup_F64                  = 4,\r\nRDI_EvalTypeGroup_COUNT                = 5,\r\n} RDI_EvalTypeGroupEnum;\r\n\r\ntypedef RDI_U8 RDI_EvalConversionKind;\r\ntypedef enum RDI_EvalConversionKindEnum\r\n{\r\nRDI_EvalConversionKind_Noop                 = 0,\r\nRDI_EvalConversionKind_Legal                = 1,\r\nRDI_EvalConversionKind_OtherToOther         = 2,\r\nRDI_EvalConversionKind_ToOther              = 3,\r\nRDI_EvalConversionKind_FromOther            = 4,\r\nRDI_EvalConversionKind_COUNT                = 5,\r\n} RDI_EvalConversionKindEnum;\r\n\r\ntypedef RDI_U32 RDI_NameMapKind;\r\ntypedef enum RDI_NameMapKindEnum\r\n{\r\nRDI_NameMapKind_NULL                 = 0,\r\nRDI_NameMapKind_GlobalVariables      = 1,\r\nRDI_NameMapKind_ThreadVariables      = 2,\r\nRDI_NameMapKind_Constants            = 3,\r\nRDI_NameMapKind_Procedures           = 4,\r\nRDI_NameMapKind_Types                = 5,\r\nRDI_NameMapKind_LinkNameProcedures   = 6,\r\nRDI_NameMapKind_NormalSourcePaths    = 7,\r\nRDI_NameMapKind_COUNT                = 8,\r\n} RDI_NameMapKindEnum;\r\n\r\n#define RDI_Header_XList \\\r\nX(RDI_U64, magic)\\\r\nX(RDI_U32, encoding_version)\\\r\nX(RDI_U32, data_section_off)\\\r\nX(RDI_U32, data_section_count)\\\r\n\r\n#define RDI_SectionKind_XList \\\r\nX(NULL, null, RDI_U8)\\\r\nX(TopLevelInfo, top_level_info, RDI_TopLevelInfo)\\\r\nX(StringData, string_data, RDI_U8)\\\r\nX(StringTable, string_table, RDI_U32)\\\r\nX(IndexRuns, index_runs, RDI_U32)\\\r\nX(BinarySections, binary_sections, RDI_BinarySection)\\\r\nX(FilePathNodes, file_path_nodes, RDI_FilePathNode)\\\r\nX(SourceFiles, source_files, RDI_SourceFile)\\\r\nX(LineTables, line_tables, RDI_LineTable)\\\r\nX(LineInfoVOffs, line_info_voffs, RDI_U64)\\\r\nX(LineInfoLines, line_info_lines, RDI_Line)\\\r\nX(LineInfoColumns, line_info_columns, RDI_Column)\\\r\nX(SourceLineMaps, source_line_maps, RDI_SourceLineMap)\\\r\nX(SourceLineMapNumbers, source_line_map_numbers, RDI_U32)\\\r\nX(SourceLineMapRanges, source_line_map_ranges, RDI_U32)\\\r\nX(SourceLineMapVOffs, source_line_map_voffs, RDI_U64)\\\r\nX(Units, units, RDI_Unit)\\\r\nX(UnitVMap, unit_vmap, RDI_VMapEntry)\\\r\nX(TypeNodes, type_nodes, RDI_TypeNode)\\\r\nX(UDTs, udts, RDI_UDT)\\\r\nX(Members, members, RDI_Member)\\\r\nX(EnumMembers, enum_members, RDI_EnumMember)\\\r\nX(GlobalVariables, global_variables, RDI_GlobalVariable)\\\r\nX(GlobalVMap, global_vmap, RDI_VMapEntry)\\\r\nX(ThreadVariables, thread_variables, RDI_ThreadVariable)\\\r\nX(Constants, constants, RDI_Constant)\\\r\nX(Procedures, procedures, RDI_Procedure)\\\r\nX(Scopes, scopes, RDI_Scope)\\\r\nX(ScopeVOffData, scope_voff_data, RDI_U64)\\\r\nX(ScopeVMap, scope_vmap, RDI_VMapEntry)\\\r\nX(InlineSites, inline_sites, RDI_InlineSite)\\\r\nX(Locals, locals, RDI_Local)\\\r\nX(LocationBlocks, location_blocks, RDI_LocationBlock)\\\r\nX(LocationData, location_data, RDI_U8)\\\r\nX(ConstantValueData, constant_value_data, RDI_U8)\\\r\nX(ConstantValueTable, constant_value_table, RDI_U32)\\\r\nX(MD5Checksums, md5_checksums, RDI_MD5)\\\r\nX(SHA1Checksums, sha1_checksums, RDI_SHA1)\\\r\nX(SHA256Checksums, sha256_checksums, RDI_SHA256)\\\r\nX(Timestamps, timestamps, RDI_U64)\\\r\nX(NameMaps, name_maps, RDI_NameMap)\\\r\nX(NameMapBuckets, name_map_buckets, RDI_NameMapBucket)\\\r\nX(NameMapNodes, name_map_nodes, RDI_NameMapNode)\\\r\n\r\n#define RDI_SectionEncoding_XList \\\r\nX(Unpacked)\\\r\nX(LZB)\\\r\n\r\n#define RDI_Section_XList \\\r\nX(RDI_SectionEncoding, encoding)\\\r\nX(RDI_U32, pad)\\\r\nX(RDI_U64, off)\\\r\nX(RDI_U64, encoded_size)\\\r\nX(RDI_U64, unpacked_size)\\\r\n\r\n#define RDI_VMapEntry_XList \\\r\nX(RDI_U64, voff)\\\r\nX(RDI_U64, idx)\\\r\n\r\n#define RDI_Arch_XList \\\r\nX(NULL)\\\r\nX(X86)\\\r\nX(X64)\\\r\n\r\n#define RDI_RegCodeX86_XList \\\r\nX(nil, 0)\\\r\nX(eax, 1)\\\r\nX(ecx, 2)\\\r\nX(edx, 3)\\\r\nX(ebx, 4)\\\r\nX(esp, 5)\\\r\nX(ebp, 6)\\\r\nX(esi, 7)\\\r\nX(edi, 8)\\\r\nX(fsbase, 9)\\\r\nX(gsbase, 10)\\\r\nX(eflags, 11)\\\r\nX(eip, 12)\\\r\nX(dr0, 13)\\\r\nX(dr1, 14)\\\r\nX(dr2, 15)\\\r\nX(dr3, 16)\\\r\nX(dr4, 17)\\\r\nX(dr5, 18)\\\r\nX(dr6, 19)\\\r\nX(dr7, 20)\\\r\nX(fpr0, 21)\\\r\nX(fpr1, 22)\\\r\nX(fpr2, 23)\\\r\nX(fpr3, 24)\\\r\nX(fpr4, 25)\\\r\nX(fpr5, 26)\\\r\nX(fpr6, 27)\\\r\nX(fpr7, 28)\\\r\nX(st0, 29)\\\r\nX(st1, 30)\\\r\nX(st2, 31)\\\r\nX(st3, 32)\\\r\nX(st4, 33)\\\r\nX(st5, 34)\\\r\nX(st6, 35)\\\r\nX(st7, 36)\\\r\nX(fcw, 37)\\\r\nX(fsw, 38)\\\r\nX(ftw, 39)\\\r\nX(fop, 40)\\\r\nX(fcs, 41)\\\r\nX(fds, 42)\\\r\nX(fip, 43)\\\r\nX(fdp, 44)\\\r\nX(mxcsr, 45)\\\r\nX(mxcsr_mask, 46)\\\r\nX(ss, 47)\\\r\nX(cs, 48)\\\r\nX(ds, 49)\\\r\nX(es, 50)\\\r\nX(fs, 51)\\\r\nX(gs, 52)\\\r\nX(ymm0, 53)\\\r\nX(ymm1, 54)\\\r\nX(ymm2, 55)\\\r\nX(ymm3, 56)\\\r\nX(ymm4, 57)\\\r\nX(ymm5, 58)\\\r\nX(ymm6, 59)\\\r\nX(ymm7, 60)\\\r\nX(tr, 61)\\\r\nX(ldtr, 62)\\\r\n\r\n#define RDI_RegCodeX64_XList \\\r\nX(nil, 0)\\\r\nX(rax, 1)\\\r\nX(rcx, 2)\\\r\nX(rdx, 3)\\\r\nX(rbx, 4)\\\r\nX(rsp, 5)\\\r\nX(rbp, 6)\\\r\nX(rsi, 7)\\\r\nX(rdi, 8)\\\r\nX(r8, 9)\\\r\nX(r9, 10)\\\r\nX(r10, 11)\\\r\nX(r11, 12)\\\r\nX(r12, 13)\\\r\nX(r13, 14)\\\r\nX(r14, 15)\\\r\nX(r15, 16)\\\r\nX(es, 17)\\\r\nX(cs, 18)\\\r\nX(ss, 19)\\\r\nX(ds, 20)\\\r\nX(fs, 21)\\\r\nX(gs, 22)\\\r\nX(rip, 23)\\\r\nX(rflags, 24)\\\r\nX(dr0, 25)\\\r\nX(dr1, 26)\\\r\nX(dr2, 27)\\\r\nX(dr3, 28)\\\r\nX(dr4, 29)\\\r\nX(dr5, 30)\\\r\nX(dr6, 31)\\\r\nX(dr7, 32)\\\r\nX(st0, 33)\\\r\nX(st1, 34)\\\r\nX(st2, 35)\\\r\nX(st3, 36)\\\r\nX(st4, 37)\\\r\nX(st5, 38)\\\r\nX(st6, 39)\\\r\nX(st7, 40)\\\r\nX(fpr0, 41)\\\r\nX(fpr1, 42)\\\r\nX(fpr2, 43)\\\r\nX(fpr3, 44)\\\r\nX(fpr4, 45)\\\r\nX(fpr5, 46)\\\r\nX(fpr6, 47)\\\r\nX(fpr7, 48)\\\r\nX(zmm0, 49)\\\r\nX(zmm1, 50)\\\r\nX(zmm2, 51)\\\r\nX(zmm3, 52)\\\r\nX(zmm4, 53)\\\r\nX(zmm5, 54)\\\r\nX(zmm6, 55)\\\r\nX(zmm7, 56)\\\r\nX(zmm8, 57)\\\r\nX(zmm9, 58)\\\r\nX(zmm10, 59)\\\r\nX(zmm11, 60)\\\r\nX(zmm12, 61)\\\r\nX(zmm13, 62)\\\r\nX(zmm14, 63)\\\r\nX(zmm15, 64)\\\r\nX(zmm16, 65)\\\r\nX(zmm17, 66)\\\r\nX(zmm18, 67)\\\r\nX(zmm19, 68)\\\r\nX(zmm20, 69)\\\r\nX(zmm21, 70)\\\r\nX(zmm22, 71)\\\r\nX(zmm23, 72)\\\r\nX(zmm24, 73)\\\r\nX(zmm25, 74)\\\r\nX(zmm26, 75)\\\r\nX(zmm27, 76)\\\r\nX(zmm28, 77)\\\r\nX(zmm29, 78)\\\r\nX(zmm30, 79)\\\r\nX(zmm31, 80)\\\r\nX(k0, 81)\\\r\nX(k1, 82)\\\r\nX(k2, 83)\\\r\nX(k3, 84)\\\r\nX(k4, 85)\\\r\nX(k5, 86)\\\r\nX(k6, 87)\\\r\nX(k7, 88)\\\r\nX(mxcsr, 89)\\\r\nX(fsbase, 90)\\\r\nX(gsbase, 91)\\\r\nX(fcw, 92)\\\r\nX(fsw, 93)\\\r\nX(ftw, 94)\\\r\nX(fop, 95)\\\r\nX(fcs, 96)\\\r\nX(fds, 97)\\\r\nX(fip, 98)\\\r\nX(fdp, 99)\\\r\nX(mxcsr_mask, 100)\\\r\nX(cetmsr, 101)\\\r\nX(cetssp, 102)\\\r\nX(tr, 103)\\\r\nX(ldtr, 104)\\\r\n\r\n#define RDI_TopLevelInfo_XList \\\r\nX(RDI_Arch, arch)\\\r\nX(RDI_U32, exe_name_string_idx)\\\r\nX(RDI_U64, exe_hash)\\\r\nX(RDI_U64, voff_max)\\\r\nX(RDI_GUID, guid)\\\r\nX(RDI_U32, producer_name_string_idx)\\\r\n\r\n#define RDI_BinarySectionFlags_XList \\\r\nX(Read)\\\r\nX(Write)\\\r\nX(Execute)\\\r\n\r\n#define RDI_BinarySection_XList \\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_BinarySectionFlags, flags)\\\r\nX(RDI_U64, voff_first)\\\r\nX(RDI_U64, voff_opl)\\\r\nX(RDI_U64, foff_first)\\\r\nX(RDI_U64, foff_opl)\\\r\n\r\n#define RDI_ChecksumKind_XList \\\r\nX(NULL, NULL)\\\r\nX(MD5, MD5Checksums)\\\r\nX(SHA1, SHA1Checksums)\\\r\nX(SHA256, SHA256Checksums)\\\r\nX(Timestamp, Timestamps)\\\r\nX(COUNT, NULL)\\\r\n\r\n#define RDI_FilePathNode_XList \\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_U32, parent_path_node)\\\r\nX(RDI_U32, first_child)\\\r\nX(RDI_U32, next_sibling)\\\r\nX(RDI_U32, source_file_idx)\\\r\n\r\n#define RDI_SourceFile_XList \\\r\nX(RDI_U32, file_path_node_idx)\\\r\nX(RDI_U32, normal_full_path_string_idx)\\\r\nX(RDI_U32, source_line_map_idx)\\\r\nX(RDI_ChecksumKind, checksum_kind)\\\r\nX(RDI_U32, checksum_idx)\\\r\n\r\n#define RDI_Unit_XList \\\r\nX(RDI_U32, unit_name_string_idx)\\\r\nX(RDI_U32, compiler_name_string_idx)\\\r\nX(RDI_U32, source_file_path_node)\\\r\nX(RDI_U32, object_file_path_node)\\\r\nX(RDI_U32, archive_file_path_node)\\\r\nX(RDI_U32, build_path_node)\\\r\nX(RDI_Language, language)\\\r\nX(RDI_U32, line_table_idx)\\\r\n\r\n#define RDI_LineTable_XList \\\r\nX(RDI_U32, voffs_base_idx)\\\r\nX(RDI_U32, lines_base_idx)\\\r\nX(RDI_U32, cols_base_idx)\\\r\nX(RDI_U32, lines_count)\\\r\nX(RDI_U32, cols_count)\\\r\n\r\n#define RDI_Line_XList \\\r\nX(RDI_U32, file_idx)\\\r\nX(RDI_U32, line_num)\\\r\n\r\n#define RDI_Column_XList \\\r\nX(RDI_U16, col_first)\\\r\nX(RDI_U16, col_opl)\\\r\n\r\n#define RDI_SourceLineMapMemberTable \\\r\nX(RDI_U32, line_count)\\\r\nX(RDI_U32, voff_count)\\\r\nX(RDI_U32, line_map_nums_base_idx)\\\r\nX(RDI_U32, line_map_range_base_idx)\\\r\nX(RDI_U32, line_map_voff_base_idx)\\\r\n\r\n#define RDI_Language_XList \\\r\nX(NULL)\\\r\nX(C)\\\r\nX(CPlusPlus)\\\r\nX(Masm)\\\r\nX(COUNT)\\\r\n\r\n#define RDI_TypeKind_XList \\\r\nX(NULL)\\\r\nX(Void)\\\r\nX(Handle)\\\r\nX(HResult)\\\r\nX(Char8)\\\r\nX(Char16)\\\r\nX(Char32)\\\r\nX(UChar8)\\\r\nX(UChar16)\\\r\nX(UChar32)\\\r\nX(U8)\\\r\nX(U16)\\\r\nX(U32)\\\r\nX(U64)\\\r\nX(U128)\\\r\nX(U256)\\\r\nX(U512)\\\r\nX(S8)\\\r\nX(S16)\\\r\nX(S32)\\\r\nX(S64)\\\r\nX(S128)\\\r\nX(S256)\\\r\nX(S512)\\\r\nX(Bool)\\\r\nX(F16)\\\r\nX(F32)\\\r\nX(F32PP)\\\r\nX(F48)\\\r\nX(F64)\\\r\nX(F80)\\\r\nX(F128)\\\r\nX(ComplexF32)\\\r\nX(ComplexF64)\\\r\nX(ComplexF80)\\\r\nX(ComplexF128)\\\r\nX(Modifier)\\\r\nX(Ptr)\\\r\nX(LRef)\\\r\nX(RRef)\\\r\nX(Array)\\\r\nX(Function)\\\r\nX(Method)\\\r\nX(MemberPtr)\\\r\nX(Struct)\\\r\nX(Class)\\\r\nX(Union)\\\r\nX(Enum)\\\r\nX(Alias)\\\r\nX(IncompleteStruct)\\\r\nX(IncompleteUnion)\\\r\nX(IncompleteClass)\\\r\nX(IncompleteEnum)\\\r\nX(Bitfield)\\\r\nX(Variadic)\\\r\nX(Count)\\\r\n\r\n#define RDI_TypeModifierFlags_XList \\\r\nX(Const)\\\r\nX(Volatile)\\\r\nX(Restrict)\\\r\n\r\n#define RDI_TypeNode_XList \\\r\nX(RDI_TypeKind, kind)\\\r\nX(RDI_U16, flags)\\\r\nX(RDI_U32, byte_size)\\\r\n\r\n#define RDI_UDTFlags_XList \\\r\nX(EnumMembers)\\\r\n\r\n#define RDI_UDT_XList \\\r\nX(RDI_U32, self_type_idx)\\\r\nX(RDI_UDTFlags, flags)\\\r\nX(RDI_U32, member_first)\\\r\nX(RDI_U32, member_count)\\\r\nX(RDI_U32, file_idx)\\\r\nX(RDI_U32, line)\\\r\nX(RDI_U32, col)\\\r\n\r\n#define RDI_MemberKind_XList \\\r\nX(NULL)\\\r\nX(DataField)\\\r\nX(StaticData)\\\r\nX(Method)\\\r\nX(StaticMethod)\\\r\nX(VirtualMethod)\\\r\nX(VTablePtr)\\\r\nX(Base)\\\r\nX(VirtualBase)\\\r\nX(NestedType)\\\r\n\r\n#define RDI_Member_XList \\\r\nX(RDI_MemberKind, kind)\\\r\nX(RDI_U16, pad)\\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_U32, type_idx)\\\r\nX(RDI_U32, off)\\\r\n\r\n#define RDI_EnumMember_XList \\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_U32, pad)\\\r\nX(RDI_U64, val)\\\r\n\r\n#define RDI_LinkFlags_XList \\\r\nX(External)\\\r\nX(TypeScoped)\\\r\nX(ProcScoped)\\\r\n\r\n#define RDI_LocalKind_XList \\\r\nX(NULL)\\\r\nX(Parameter)\\\r\nX(Variable)\\\r\n\r\n#define RDI_LocationKind_XList \\\r\nX(NULL)\\\r\nX(AddrBytecodeStream)\\\r\nX(ValBytecodeStream)\\\r\nX(AddrRegPlusU16)\\\r\nX(AddrAddrRegPlusU16)\\\r\nX(ValReg)\\\r\n\r\n#define RDI_GlobalVariable_XList \\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_LinkFlags, link_flags)\\\r\nX(RDI_U64, voff)\\\r\nX(RDI_U32, type_idx)\\\r\nX(RDI_U32, container_idx)\\\r\n\r\n#define RDI_ThreadVariable_XList \\\r\nX(type, name_string_idx)\\\r\nX(type, link_flags)\\\r\nX(type, tls_off)\\\r\nX(type, type_idx)\\\r\nX(type, container_idx)\\\r\n\r\n#define RDI_Procedure_XList \\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_U32, link_name_string_idx)\\\r\nX(RDI_LinkFlags, link_flags)\\\r\nX(RDI_U32, type_idx)\\\r\nX(RDI_U32, root_scope_idx)\\\r\nX(RDI_U32, container_idx)\\\r\nX(RDI_U32, frame_base_location_first)\\\r\nX(RDI_U32, frame_base_location_opl)\\\r\n\r\n#define RDI_Scope_XList \\\r\nX(RDI_U32, proc_idx)\\\r\nX(RDI_U32, parent_scope_idx)\\\r\nX(RDI_U32, first_child_scope_idx)\\\r\nX(RDI_U32, next_sibling_scope_idx)\\\r\nX(RDI_U32, voff_range_first)\\\r\nX(RDI_U32, voff_range_opl)\\\r\nX(RDI_U32, local_first)\\\r\nX(RDI_U32, local_count)\\\r\nX(RDI_U32, inline_site_idx)\\\r\n\r\n#define RDI_InlineSite_XList \\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_U32, type_idx)\\\r\nX(RDI_U32, owner_type_idx)\\\r\nX(RDI_U32, line_table_idx)\\\r\n\r\n#define RDI_Local_XList \\\r\nX(RDI_LocalKind, kind)\\\r\nX(RDI_U32, name_string_idx)\\\r\nX(RDI_U32, type_idx)\\\r\nX(RDI_U32, pad)\\\r\nX(RDI_U32, location_first)\\\r\nX(RDI_U32, location_opl)\\\r\n\r\n#define RDI_LocationBlock_XList \\\r\nX(RDI_U32, scope_off_first)\\\r\nX(RDI_U32, scope_off_opl)\\\r\nX(RDI_U32, location_data_off)\\\r\n\r\n#define RDI_LocationBytecodeStream_XList \\\r\nX(RDI_LocationKind, kind)\\\r\n\r\n#define RDI_LocationRegPlusU16_XList \\\r\nX(RDI_LocationKind, kind)\\\r\nX(RDI_RegCode, reg_code)\\\r\nX(RDI_U16, offset)\\\r\n\r\n#define RDI_LocationReg_XList \\\r\nX(RDI_LocationKind, kind)\\\r\nX(RDI_RegCode, reg_code)\\\r\n\r\n#define RDI_EvalOp_XList \\\r\nX(Stop)\\\r\nX(Noop)\\\r\nX(Cond)\\\r\nX(Skip)\\\r\nX(MemRead)\\\r\nX(RegRead)\\\r\nX(RegReadDyn)\\\r\nX(FrameOff)\\\r\nX(ModuleOff)\\\r\nX(TLSOff)\\\r\nX(ObjectOff)\\\r\nX(CFA)\\\r\nX(ConstU8)\\\r\nX(ConstU16)\\\r\nX(ConstU32)\\\r\nX(ConstU64)\\\r\nX(ConstU128)\\\r\nX(ConstString)\\\r\nX(Abs)\\\r\nX(Neg)\\\r\nX(Add)\\\r\nX(Sub)\\\r\nX(Mul)\\\r\nX(Div)\\\r\nX(Mod)\\\r\nX(LShift)\\\r\nX(RShift)\\\r\nX(BitAnd)\\\r\nX(BitOr)\\\r\nX(BitXor)\\\r\nX(BitNot)\\\r\nX(LogAnd)\\\r\nX(LogOr)\\\r\nX(LogNot)\\\r\nX(EqEq)\\\r\nX(NtEq)\\\r\nX(LsEq)\\\r\nX(GrEq)\\\r\nX(Less)\\\r\nX(Grtr)\\\r\nX(Trunc)\\\r\nX(TruncSigned)\\\r\nX(Convert)\\\r\nX(Pick)\\\r\nX(Pop)\\\r\nX(Insert)\\\r\nX(ValueRead)\\\r\nX(ByteSwap)\\\r\nX(CallSiteValue)\\\r\nX(PartialValue)\\\r\nX(PartialValueBit)\\\r\nX(Swap)\\\r\n\r\n#define RDI_EvalTypeGroup_XList \\\r\nX(Other)\\\r\nX(U)\\\r\nX(S)\\\r\nX(F32)\\\r\nX(F64)\\\r\n\r\n#define RDI_EvalConversionKind_XList \\\r\nX(Noop)\\\r\nX(Legal)\\\r\nX(OtherToOther)\\\r\nX(ToOther)\\\r\nX(FromOther)\\\r\n\r\n#define RDI_NameMapKind_XList \\\r\nX(NULL)\\\r\nX(GlobalVariables)\\\r\nX(ThreadVariables)\\\r\nX(Constants)\\\r\nX(Procedures)\\\r\nX(Types)\\\r\nX(LinkNameProcedures)\\\r\nX(NormalSourcePaths)\\\r\n\r\n#define RDI_NameMap_XList \\\r\nX(RDI_U32, bucket_base_idx)\\\r\nX(RDI_U32, node_base_idx)\\\r\nX(RDI_U32, bucket_count)\\\r\nX(RDI_U32, node_count)\\\r\n\r\n#define RDI_NameMapBucket_XList \\\r\nX(RDI_U32, first_node)\\\r\nX(RDI_U32, node_count)\\\r\n\r\n#define RDI_NameMapNode_XList \\\r\nX(RDI_U32, string_idx)\\\r\nX(RDI_U32, match_count)\\\r\nX(RDI_U32, match_idx_or_idx_run_first)\\\r\n\r\n#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING\r\ntypedef struct RDI_U32_StringTable                 { RDI_U32 v; } RDI_U32_StringTable;\r\ntypedef struct RDI_U32_IndexRuns                   { RDI_U32 v; } RDI_U32_IndexRuns;\r\ntypedef struct RDI_U32_BinarySections              { RDI_U32 v; } RDI_U32_BinarySections;\r\ntypedef struct RDI_U32_FilePathNodes               { RDI_U32 v; } RDI_U32_FilePathNodes;\r\ntypedef struct RDI_U32_SourceFiles                 { RDI_U32 v; } RDI_U32_SourceFiles;\r\ntypedef struct RDI_U32_LineTables                  { RDI_U32 v; } RDI_U32_LineTables;\r\ntypedef struct RDI_U32_LineInfoVOffs               { RDI_U32 v; } RDI_U32_LineInfoVOffs;\r\ntypedef struct RDI_U32_LineInfoLines               { RDI_U32 v; } RDI_U32_LineInfoLines;\r\ntypedef struct RDI_U32_LineInfoColumns             { RDI_U32 v; } RDI_U32_LineInfoColumns;\r\ntypedef struct RDI_U32_SourceLineMaps              { RDI_U32 v; } RDI_U32_SourceLineMaps;\r\ntypedef struct RDI_U32_SourceLineMapNumbers        { RDI_U32 v; } RDI_U32_SourceLineMapNumbers;\r\ntypedef struct RDI_U32_SourceLineMapRanges         { RDI_U32 v; } RDI_U32_SourceLineMapRanges;\r\ntypedef struct RDI_U32_SourceLineMapVOffs          { RDI_U32 v; } RDI_U32_SourceLineMapVOffs;\r\ntypedef struct RDI_U32_Units                       { RDI_U32 v; } RDI_U32_Units;\r\ntypedef struct RDI_U32_TypeNodes                   { RDI_U32 v; } RDI_U32_TypeNodes;\r\ntypedef struct RDI_U32_UDTs                        { RDI_U32 v; } RDI_U32_UDTs;\r\ntypedef struct RDI_U32_Members                     { RDI_U32 v; } RDI_U32_Members;\r\ntypedef struct RDI_U32_EnumMembers                 { RDI_U32 v; } RDI_U32_EnumMembers;\r\ntypedef struct RDI_U32_GlobalVariables             { RDI_U32 v; } RDI_U32_GlobalVariables;\r\ntypedef struct RDI_U32_ThreadVariables             { RDI_U32 v; } RDI_U32_ThreadVariables;\r\ntypedef struct RDI_U32_Constants                   { RDI_U32 v; } RDI_U32_Constants;\r\ntypedef struct RDI_U32_Procedures                  { RDI_U32 v; } RDI_U32_Procedures;\r\ntypedef struct RDI_U32_Scopes                      { RDI_U32 v; } RDI_U32_Scopes;\r\ntypedef struct RDI_U32_ScopeVOffData               { RDI_U32 v; } RDI_U32_ScopeVOffData;\r\ntypedef struct RDI_U32_InlineSites                 { RDI_U32 v; } RDI_U32_InlineSites;\r\ntypedef struct RDI_U32_Locals                      { RDI_U32 v; } RDI_U32_Locals;\r\ntypedef struct RDI_U32_LocationBlocks              { RDI_U32 v; } RDI_U32_LocationBlocks;\r\ntypedef struct RDI_U32_LocationData                { RDI_U32 v; } RDI_U32_LocationData;\r\ntypedef struct RDI_U32_ConstantValueData           { RDI_U32 v; } RDI_U32_ConstantValueData;\r\ntypedef struct RDI_U32_ConstantValueTable          { RDI_U32 v; } RDI_U32_ConstantValueTable;\r\ntypedef struct RDI_U32_MD5Checksums                { RDI_U32 v; } RDI_U32_MD5Checksums;\r\ntypedef struct RDI_U32_SHA1Checksums               { RDI_U32 v; } RDI_U32_SHA1Checksums;\r\ntypedef struct RDI_U32_SHA256Checksums             { RDI_U32 v; } RDI_U32_SHA256Checksums;\r\ntypedef struct RDI_U32_Timestamps                  { RDI_U32 v; } RDI_U32_Timestamps;\r\ntypedef struct RDI_U32_NameMaps                    { RDI_U32 v; } RDI_U32_NameMaps;\r\ntypedef struct RDI_U32_NameMapBuckets              { RDI_U32 v; } RDI_U32_NameMapBuckets;\r\ntypedef struct RDI_U32_NameMapNodes                { RDI_U32 v; } RDI_U32_NameMapNodes;\r\n#else\r\ntypedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table;\r\ntypedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table;\r\ntypedef RDI_U32_Table RDI_U32_StringTable;\r\ntypedef RDI_U32_Table RDI_U32_IndexRuns;\r\ntypedef RDI_U32_Table RDI_U32_BinarySections;\r\ntypedef RDI_U32_Table RDI_U32_FilePathNodes;\r\ntypedef RDI_U32_Table RDI_U32_SourceFiles;\r\ntypedef RDI_U32_Table RDI_U32_LineTables;\r\ntypedef RDI_U32_Table RDI_U32_LineInfoVOffs;\r\ntypedef RDI_U32_Table RDI_U32_LineInfoLines;\r\ntypedef RDI_U32_Table RDI_U32_LineInfoColumns;\r\ntypedef RDI_U32_Table RDI_U32_SourceLineMaps;\r\ntypedef RDI_U32_Table RDI_U32_SourceLineMapNumbers;\r\ntypedef RDI_U32_Table RDI_U32_SourceLineMapRanges;\r\ntypedef RDI_U32_Table RDI_U32_SourceLineMapVOffs;\r\ntypedef RDI_U32_Table RDI_U32_Units;\r\ntypedef RDI_U32_Table RDI_U32_TypeNodes;\r\ntypedef RDI_U32_Table RDI_U32_UDTs;\r\ntypedef RDI_U32_Table RDI_U32_Members;\r\ntypedef RDI_U32_Table RDI_U32_EnumMembers;\r\ntypedef RDI_U32_Table RDI_U32_GlobalVariables;\r\ntypedef RDI_U32_Table RDI_U32_ThreadVariables;\r\ntypedef RDI_U32_Table RDI_U32_Constants;\r\ntypedef RDI_U32_Table RDI_U32_Procedures;\r\ntypedef RDI_U32_Table RDI_U32_Scopes;\r\ntypedef RDI_U32_Table RDI_U32_ScopeVOffData;\r\ntypedef RDI_U32_Table RDI_U32_InlineSites;\r\ntypedef RDI_U32_Table RDI_U32_Locals;\r\ntypedef RDI_U32_Table RDI_U32_LocationBlocks;\r\ntypedef RDI_U32_Table RDI_U32_LocationData;\r\ntypedef RDI_U32_Table RDI_U32_ConstantValueData;\r\ntypedef RDI_U32_Table RDI_U32_ConstantValueTable;\r\ntypedef RDI_U32_Table RDI_U32_MD5Checksums;\r\ntypedef RDI_U32_Table RDI_U32_SHA1Checksums;\r\ntypedef RDI_U32_Table RDI_U32_SHA256Checksums;\r\ntypedef RDI_U32_Table RDI_U32_Timestamps;\r\ntypedef RDI_U32_Table RDI_U32_NameMaps;\r\ntypedef RDI_U32_Table RDI_U32_NameMapBuckets;\r\ntypedef RDI_U32_Table RDI_U32_NameMapNodes;\r\n#endif\r\n\r\n#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0))\r\n#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits)   (((ctrlbits) >> 8) & 0xff)\r\n#define RDI_POPN_FROM_CTRLBITS(ctrlbits)      (((ctrlbits) >> 4) & 0xf)\r\n#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits)     (((ctrlbits) >> 0) & 0xf)\r\n#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16))\r\n\r\ntypedef struct RDI_Header RDI_Header;\r\nstruct RDI_Header\r\n{\r\nRDI_U64 magic;\r\nRDI_U32 encoding_version;\r\nRDI_U32 data_section_off;\r\nRDI_U32 data_section_count;\r\n};\r\n\r\ntypedef struct RDI_Section RDI_Section;\r\nstruct RDI_Section\r\n{\r\nRDI_SectionEncoding encoding;\r\nRDI_U32 pad;\r\nRDI_U64 off;\r\nRDI_U64 encoded_size;\r\nRDI_U64 unpacked_size;\r\n};\r\n\r\ntypedef struct RDI_VMapEntry RDI_VMapEntry;\r\nstruct RDI_VMapEntry\r\n{\r\nRDI_U64 voff;\r\nRDI_U64 idx;\r\n};\r\n\r\ntypedef struct RDI_TopLevelInfo RDI_TopLevelInfo;\r\nstruct RDI_TopLevelInfo\r\n{\r\nRDI_Arch arch;\r\nRDI_U32 exe_name_string_idx;\r\nRDI_U64 exe_hash;\r\nRDI_U64 voff_max;\r\nRDI_GUID guid;\r\nRDI_U32 producer_name_string_idx;\r\n};\r\n\r\ntypedef struct RDI_BinarySection RDI_BinarySection;\r\nstruct RDI_BinarySection\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_BinarySectionFlags flags;\r\nRDI_U64 voff_first;\r\nRDI_U64 voff_opl;\r\nRDI_U64 foff_first;\r\nRDI_U64 foff_opl;\r\n};\r\n\r\ntypedef struct RDI_FilePathNode RDI_FilePathNode;\r\nstruct RDI_FilePathNode\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_U32 parent_path_node;\r\nRDI_U32 first_child;\r\nRDI_U32 next_sibling;\r\nRDI_U32 source_file_idx;\r\n};\r\n\r\ntypedef struct RDI_SourceFile RDI_SourceFile;\r\nstruct RDI_SourceFile\r\n{\r\nRDI_U32 file_path_node_idx;\r\nRDI_U32 normal_full_path_string_idx;\r\nRDI_U32 source_line_map_idx;\r\nRDI_ChecksumKind checksum_kind;\r\nRDI_U32 checksum_idx;\r\n};\r\n\r\ntypedef struct RDI_Unit RDI_Unit;\r\nstruct RDI_Unit\r\n{\r\nRDI_U32 unit_name_string_idx;\r\nRDI_U32 compiler_name_string_idx;\r\nRDI_U32 source_file_path_node;\r\nRDI_U32 object_file_path_node;\r\nRDI_U32 archive_file_path_node;\r\nRDI_U32 build_path_node;\r\nRDI_Language language;\r\nRDI_U32 line_table_idx;\r\n};\r\n\r\ntypedef struct RDI_LineTable RDI_LineTable;\r\nstruct RDI_LineTable\r\n{\r\nRDI_U32 voffs_base_idx;\r\nRDI_U32 lines_base_idx;\r\nRDI_U32 cols_base_idx;\r\nRDI_U32 lines_count;\r\nRDI_U32 cols_count;\r\n};\r\n\r\ntypedef struct RDI_Line RDI_Line;\r\nstruct RDI_Line\r\n{\r\nRDI_U32 file_idx;\r\nRDI_U32 line_num;\r\n};\r\n\r\ntypedef struct RDI_Column RDI_Column;\r\nstruct RDI_Column\r\n{\r\nRDI_U16 col_first;\r\nRDI_U16 col_opl;\r\n};\r\n\r\ntypedef struct RDI_SourceLineMap RDI_SourceLineMap;\r\nstruct RDI_SourceLineMap\r\n{\r\nRDI_U32 line_count;\r\nRDI_U32 voff_count;\r\nRDI_U32 line_map_nums_base_idx;\r\nRDI_U32 line_map_range_base_idx;\r\nRDI_U32 line_map_voff_base_idx;\r\n};\r\n\r\ntypedef struct RDI_TypeNode RDI_TypeNode;\r\nstruct RDI_TypeNode\r\n{\r\nRDI_TypeKind kind;\r\nRDI_U16 flags;\r\nRDI_U32 byte_size;\r\n\r\n    union\r\n  {\r\n    // kind is 'built-in'\r\n    struct\r\n    {\r\n      RDI_U32 name_string_idx;\r\n    } built_in;\r\n    \r\n    // kind is 'constructed'\r\n    struct\r\n    {\r\n      RDI_U32 direct_type_idx;\r\n      RDI_U32 count;\r\n      union\r\n      {\r\n        // when kind is 'Function' or 'Method'\r\n        RDI_U32 param_idx_run_first;\r\n        // when kind is 'MemberPtr'\r\n        RDI_U32 owner_type_idx;\r\n      };\r\n    }\r\n    constructed;\r\n    \r\n    // kind is 'user defined'\r\n    struct\r\n    {\r\n      RDI_U32 name_string_idx;\r\n      RDI_U32 direct_type_idx;\r\n      RDI_U32 udt_idx;\r\n    }\r\n    user_defined;\r\n    \r\n    // (kind = Bitfield)\r\n    struct\r\n    {\r\n      RDI_U32 direct_type_idx;\r\n      RDI_U32 off;\r\n      RDI_U32 size;\r\n    }\r\n    bitfield;\r\n  }\r\n  ;\r\n};\r\n\r\ntypedef struct RDI_UDT RDI_UDT;\r\nstruct RDI_UDT\r\n{\r\nRDI_U32 self_type_idx;\r\nRDI_UDTFlags flags;\r\nRDI_U32 member_first;\r\nRDI_U32 member_count;\r\nRDI_U32 file_idx;\r\nRDI_U32 line;\r\nRDI_U32 col;\r\n};\r\n\r\ntypedef struct RDI_Member RDI_Member;\r\nstruct RDI_Member\r\n{\r\nRDI_MemberKind kind;\r\nRDI_U16 pad;\r\nRDI_U32 name_string_idx;\r\nRDI_U32 type_idx;\r\nRDI_U32 off;\r\n};\r\n\r\ntypedef struct RDI_EnumMember RDI_EnumMember;\r\nstruct RDI_EnumMember\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_U32 pad;\r\nRDI_U64 val;\r\n};\r\n\r\ntypedef struct RDI_GlobalVariable RDI_GlobalVariable;\r\nstruct RDI_GlobalVariable\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_LinkFlags link_flags;\r\nRDI_U64 voff;\r\nRDI_U32 type_idx;\r\nRDI_U32 container_idx;\r\n};\r\n\r\ntypedef struct RDI_ThreadVariable RDI_ThreadVariable;\r\nstruct RDI_ThreadVariable\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_LinkFlags link_flags;\r\nRDI_U32 tls_off;\r\nRDI_U32 type_idx;\r\nRDI_U32 container_idx;\r\n};\r\n\r\ntypedef struct RDI_Constant RDI_Constant;\r\nstruct RDI_Constant\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_U32 type_idx;\r\nRDI_U32 constant_value_idx;\r\n};\r\n\r\ntypedef struct RDI_Procedure RDI_Procedure;\r\nstruct RDI_Procedure\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_U32 link_name_string_idx;\r\nRDI_LinkFlags link_flags;\r\nRDI_U32 type_idx;\r\nRDI_U32 root_scope_idx;\r\nRDI_U32 container_idx;\r\nRDI_U32 frame_base_location_first;\r\nRDI_U32 frame_base_location_opl;\r\n};\r\n\r\ntypedef struct RDI_Scope RDI_Scope;\r\nstruct RDI_Scope\r\n{\r\nRDI_U32 proc_idx;\r\nRDI_U32 parent_scope_idx;\r\nRDI_U32 first_child_scope_idx;\r\nRDI_U32 next_sibling_scope_idx;\r\nRDI_U32 voff_range_first;\r\nRDI_U32 voff_range_opl;\r\nRDI_U32 local_first;\r\nRDI_U32 local_count;\r\nRDI_U32 inline_site_idx;\r\n};\r\n\r\ntypedef struct RDI_InlineSite RDI_InlineSite;\r\nstruct RDI_InlineSite\r\n{\r\nRDI_U32 name_string_idx;\r\nRDI_U32 type_idx;\r\nRDI_U32 owner_type_idx;\r\nRDI_U32 line_table_idx;\r\n};\r\n\r\ntypedef struct RDI_Local RDI_Local;\r\nstruct RDI_Local\r\n{\r\nRDI_LocalKind kind;\r\nRDI_U32 name_string_idx;\r\nRDI_U32 type_idx;\r\nRDI_U32 pad;\r\nRDI_U32 location_first;\r\nRDI_U32 location_opl;\r\n};\r\n\r\ntypedef struct RDI_LocationBlock RDI_LocationBlock;\r\nstruct RDI_LocationBlock\r\n{\r\nRDI_U32 scope_off_first;\r\nRDI_U32 scope_off_opl;\r\nRDI_U32 location_data_off;\r\n};\r\n\r\ntypedef struct RDI_LocationBytecodeStream RDI_LocationBytecodeStream;\r\nstruct RDI_LocationBytecodeStream\r\n{\r\nRDI_LocationKind kind;\r\n};\r\n\r\ntypedef struct RDI_LocationRegPlusU16 RDI_LocationRegPlusU16;\r\nstruct RDI_LocationRegPlusU16\r\n{\r\nRDI_LocationKind kind;\r\nRDI_RegCode reg_code;\r\nRDI_U16 offset;\r\n};\r\n\r\ntypedef struct RDI_LocationReg RDI_LocationReg;\r\nstruct RDI_LocationReg\r\n{\r\nRDI_LocationKind kind;\r\nRDI_RegCode reg_code;\r\n};\r\n\r\ntypedef struct RDI_NameMap RDI_NameMap;\r\nstruct RDI_NameMap\r\n{\r\nRDI_U32 bucket_base_idx;\r\nRDI_U32 node_base_idx;\r\nRDI_U32 bucket_count;\r\nRDI_U32 node_count;\r\n};\r\n\r\ntypedef struct RDI_NameMapBucket RDI_NameMapBucket;\r\nstruct RDI_NameMapBucket\r\n{\r\nRDI_U32 first_node;\r\nRDI_U32 node_count;\r\n};\r\n\r\ntypedef struct RDI_NameMapNode RDI_NameMapNode;\r\nstruct RDI_NameMapNode\r\n{\r\nRDI_U32 string_idx;\r\nRDI_U32 match_count;\r\nRDI_U32 match_idx_or_idx_run_first;\r\n};\r\n\r\ntypedef RDI_TopLevelInfo                 RDI_SectionElementType_TopLevelInfo;\r\ntypedef RDI_U8                           RDI_SectionElementType_StringData;\r\ntypedef RDI_U32                          RDI_SectionElementType_StringTable;\r\ntypedef RDI_U32                          RDI_SectionElementType_IndexRuns;\r\ntypedef RDI_BinarySection                RDI_SectionElementType_BinarySections;\r\ntypedef RDI_FilePathNode                 RDI_SectionElementType_FilePathNodes;\r\ntypedef RDI_SourceFile                   RDI_SectionElementType_SourceFiles;\r\ntypedef RDI_LineTable                    RDI_SectionElementType_LineTables;\r\ntypedef RDI_U64                          RDI_SectionElementType_LineInfoVOffs;\r\ntypedef RDI_Line                         RDI_SectionElementType_LineInfoLines;\r\ntypedef RDI_Column                       RDI_SectionElementType_LineInfoColumns;\r\ntypedef RDI_SourceLineMap                RDI_SectionElementType_SourceLineMaps;\r\ntypedef RDI_U32                          RDI_SectionElementType_SourceLineMapNumbers;\r\ntypedef RDI_U32                          RDI_SectionElementType_SourceLineMapRanges;\r\ntypedef RDI_U64                          RDI_SectionElementType_SourceLineMapVOffs;\r\ntypedef RDI_Unit                         RDI_SectionElementType_Units;\r\ntypedef RDI_VMapEntry                    RDI_SectionElementType_UnitVMap;\r\ntypedef RDI_TypeNode                     RDI_SectionElementType_TypeNodes;\r\ntypedef RDI_UDT                          RDI_SectionElementType_UDTs;\r\ntypedef RDI_Member                       RDI_SectionElementType_Members;\r\ntypedef RDI_EnumMember                   RDI_SectionElementType_EnumMembers;\r\ntypedef RDI_GlobalVariable               RDI_SectionElementType_GlobalVariables;\r\ntypedef RDI_VMapEntry                    RDI_SectionElementType_GlobalVMap;\r\ntypedef RDI_ThreadVariable               RDI_SectionElementType_ThreadVariables;\r\ntypedef RDI_Constant                     RDI_SectionElementType_Constants;\r\ntypedef RDI_Procedure                    RDI_SectionElementType_Procedures;\r\ntypedef RDI_Scope                        RDI_SectionElementType_Scopes;\r\ntypedef RDI_U64                          RDI_SectionElementType_ScopeVOffData;\r\ntypedef RDI_VMapEntry                    RDI_SectionElementType_ScopeVMap;\r\ntypedef RDI_InlineSite                   RDI_SectionElementType_InlineSites;\r\ntypedef RDI_Local                        RDI_SectionElementType_Locals;\r\ntypedef RDI_LocationBlock                RDI_SectionElementType_LocationBlocks;\r\ntypedef RDI_U8                           RDI_SectionElementType_LocationData;\r\ntypedef RDI_U8                           RDI_SectionElementType_ConstantValueData;\r\ntypedef RDI_U32                          RDI_SectionElementType_ConstantValueTable;\r\ntypedef RDI_MD5                          RDI_SectionElementType_MD5Checksums;\r\ntypedef RDI_SHA1                         RDI_SectionElementType_SHA1Checksums;\r\ntypedef RDI_SHA256                       RDI_SectionElementType_SHA256Checksums;\r\ntypedef RDI_U64                          RDI_SectionElementType_Timestamps;\r\ntypedef RDI_NameMap                      RDI_SectionElementType_NameMaps;\r\ntypedef RDI_NameMapBucket                RDI_SectionElementType_NameMapBuckets;\r\ntypedef RDI_NameMapNode                  RDI_SectionElementType_NameMapNodes;\r\n\r\nRDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size);\r\nRDI_PROC RDI_U8 *rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out);\r\nRDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind);\r\nRDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch);\r\nRDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out);\r\nRDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group);\r\nRDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out);\r\n\r\nextern RDI_U16 rdi_section_element_size_table[44];\r\nextern RDI_U16 rdi_eval_op_ctrlbits_table[53];\r\n\r\n#endif // RDI_H\r\n"
  },
  {
    "path": "src/lib_rdi/rdi_parse.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ Compression/Decompression Forward-Declares\n\n#ifndef _RAD_LZB_SIMPLE_H_\n#define _RAD_LZB_SIMPLE_H_\n\n/*======================================================\n\nTo encode :\n\n\tSet up an rr_lzb_simple_context\n\t\n\tfill out m_tableSizeBits (14-16 is typical)\n\t\n\tallocate m_hashTable\n\n\trr_lzb_simple_context c;\n\tc.m_tableSizeBits = 14;\n\tc.m_hashTable = OODLE_MALLOC_ARRAY(U16,RR_ONE_SA<<c.m_tableSizeBits);\n\t\n\tthen call _encode\n\nNOTE :\n\tcompressed & raw size are not included in the encoded bytes.  You must send\n\tthem separately.\n\t\nNOTE :\n\tlzb will never expand.  comp_len is <= raw_len strictly.\n\tif comp_len = raw_len it indicates that the compressed bytes are just a memcpy\n\tof the raw bytes.  In that case you do not need to decode.\n\t\nTo decode :\n\n\tif comp_len is == raw_len, then the compressed bytes are just a copy of the \n\traw bytes and you could use them directly without calling decode.\n\t\n\tif you call rr_lzb_simple_decode in that case, then the compressed buffer will\n\tbe memcpy'd to the raw buffer\n\n===============================================================*/\n\n//~ TODO(rjf): temporary glue for building this without the shared rad code:\n\n#define __RAD64REGS__\n\n#include <stdint.h>\ntypedef uint8_t  U8;\ntypedef uint16_t U16;\ntypedef uint32_t U32;\ntypedef uint64_t U64;\ntypedef int8_t   S8;\ntypedef int16_t  S16;\ntypedef int32_t  S32;\ntypedef int64_t  S64;\n\ntypedef S64 SINTa;\ntypedef U64 RAD_U64;\ntypedef S64 RAD_S64;\ntypedef U32 RAD_U32;\ntypedef S32 RAD_S32;\n\n#define RADINLINE __inline\n\n#if defined(_MSC_VER)\n# define RADFORCEINLINE __forceinline\n#elif defined(__clang__) || defined(__GNUC__)\n# define RADFORCEINLINE __attribute__((always_inline))\n#else\n# error need force inline for this compiler\n#endif\n\n#if _MSC_VER\n# define RADLZB_TRAP() __debugbreak()\n#elif __clang__ || __GNUC__\n# define RADLZB_TRAP() __builtin_trap()\n#else\n# error Unknown trap intrinsic for this compiler.\n#endif\n\n#define RR_STRING_JOIN(arg1, arg2)              RR_STRING_JOIN_DELAY(arg1, arg2)\n#define RR_STRING_JOIN_DELAY(arg1, arg2)        RR_STRING_JOIN_IMMEDIATE(arg1, arg2)\n#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2)    arg1 ## arg2\n\n#ifdef _MSC_VER\n#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__)\n#else\n#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__)\n#endif\n\n#define RR_COMPILER_ASSERT(exp)   typedef char RR_NUMBERNAME(_dummy_array) [ (exp) ? 1 : -1 ]\n\n#if defined(__clang__)\n# define Expect(expr, val) __builtin_expect((expr), (val))\n#else\n# define Expect(expr, val) (expr)\n#endif\n\n#define RAD_LIKELY(expr)            Expect(expr,1)\n#define RAD_UNLIKELY(expr)          Expect(expr,0)\n\n#define __RADLITTLEENDIAN__ 1\n#define RAD_PTRBYTES 8\n#define RR_MIN(a,b)    ( (a) < (b) ? (a) : (b) )\n#define RR_MAX(a,b)    ( (a) > (b) ? (a) : (b) )\n#define RR_ASSERT_ALWAYS(c) do{if(!(c)) {RADLZB_TRAP();}}while(0)\n#define RR_ASSERT(c) RR_ASSERT_ALWAYS(c)\n\n#define RR_PUT16_LE(ptr,val)       *((U16 *)(ptr)) = (U16)(val)\n#define RR_GET16_LE_UNALIGNED(ptr) *((const U16 *)(ptr))\n\nstatic RADINLINE U32\nrrCtzBytes32(U32 val)\n{\n  // Don't get fancy here. Assumes val != 0.\n  if (val & 0x000000ffu) return 0;\n  if (val & 0x0000ff00u) return 1;\n  if (val & 0x00ff0000u) return 2;\n  return 3;\n}\n\nstatic RADINLINE U32\nrrCtzBytes64(U64 val)\n{\n  U32 lo = (U32) val;\n  return lo ? rrCtzBytes32(lo) : 4 + rrCtzBytes32((U32) (val >> 32));\n}\n\n//~\n\n//---------------------\n\ntypedef struct rr_lzb_simple_context rr_lzb_simple_context;\nstruct rr_lzb_simple_context\n{\n\tU16\t*\tm_hashTable;\t// must be allocated to sizeof(U16)*(1<<m_tableSizeBits)\n\tS32\t\tm_tableSizeBits;\n};\n\nSINTa rr_lzb_simple_encode_fast(rr_lzb_simple_context * ctx,\n                                const void * raw, SINTa rawLen, void * comp);\n\nSINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * ctx,\n                                    const void * raw, SINTa rawLen, void * comp);\n\n//---------------------\n\n// rr_lzb_simple_decode returns the number of compressed bytes consumed ( == compLen)\nSINTa rr_lzb_simple_decode(const void * comp, SINTa compLen, void * raw, SINTa rawLen);\n\n//---------------------\n\n#endif // _RAD_LZB_SIMPLE_H_\n\n////////////////////////////////\n//~ Top-Level Parsing API\n\nRDI_PROC RDI_ParseStatus\nrdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out)\n{\n  RDI_ParseStatus result = RDI_ParseStatus_Good;\n  \n  //////////////////////////////\n  //- rjf: extract header\n  //\n  RDI_Header *hdr = 0;\n  if(result == RDI_ParseStatus_Good)\n  {\n    if(sizeof(*hdr) <= size)\n    {\n      hdr = (RDI_Header*)data;\n    }\n    if(hdr == 0 || hdr->magic != RDI_MAGIC_CONSTANT)\n    {\n      hdr = 0;\n      result = RDI_ParseStatus_HeaderDoesNotMatch;\n    }\n    if(hdr != 0 && hdr->encoding_version != RDI_ENCODING_VERSION)\n    {\n      hdr = 0;\n      result = RDI_ParseStatus_UnsupportedVersionNumber;\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: extract data sections\n  //\n  RDI_Section *dsecs = 0;\n  RDI_U32 dsec_count = 0;\n  if(result == RDI_ParseStatus_Good)\n  {\n    RDI_U64 opl = (RDI_U64)hdr->data_section_off + (RDI_U64)hdr->data_section_count*sizeof(*dsecs);\n    if(opl <= size)\n    {\n      dsecs = (RDI_Section*)(data + hdr->data_section_off);\n      dsec_count = hdr->data_section_count;\n    }\n    if(dsecs == 0)\n    {\n      result = RDI_ParseStatus_InvalidDataSecionLayout;\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: fill result\n  //\n  if(result == RDI_ParseStatus_Good)\n  {\n    out->raw_data = data;\n    out->raw_data_size = size;\n    out->sections = dsecs;\n    out->sections_count = dsec_count;\n  }\n  \n  return result;\n}\n\n////////////////////////////////\n//~ Base Parsed Info Extraction Helpers\n\n//- section table/element raw data extraction\n\nRDI_PROC void *\nrdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out)\n{\n  void *result = 0;\n#if !defined(RDI_DISABLE_NILS)\n  result = &rdi_nil_element_union;\n  *size_out = rdi_section_element_size_table[kind];\n#endif\n  if(0 <= kind && kind < rdi->sections_count &&\n     rdi->sections[kind].off < rdi->raw_data_size)\n  {\n    result = rdi->raw_data+rdi->sections[kind].off;\n    *size_out = rdi->sections[kind].encoded_size;\n    *encoding_out = rdi->sections[kind].encoding;\n  }\n  return result;\n}\n\nRDI_PROC void *\nrdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out)\n{\n  void *result = 0;\n  RDI_U64 all_elements_size = 0;\n  RDI_SectionEncoding all_elements_encoding = 0;\n  void *all_elements = rdi_section_raw_data_from_kind(rdi, kind, &all_elements_encoding, &all_elements_size);\n  if(all_elements_encoding == RDI_SectionEncoding_Unpacked)\n  {\n    RDI_U64 element_size = (RDI_U64)rdi_section_element_size_table[kind];\n    RDI_U64 all_elements_count = all_elements_size/element_size;\n    result = all_elements;\n    *count_out = all_elements_count;\n  }\n  return result;\n}\n\nRDI_PROC void *\nrdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx)\n{\n  RDI_U64 count = 0;\n  void *table = rdi_section_raw_table_from_kind(rdi, kind, &count);\n  void *result = table;\n  if(idx < count)\n  {\n    RDI_U64 element_size = (RDI_U64)rdi_section_element_size_table[kind];\n    result = (RDI_U8 *)table + element_size*idx;\n  }\n  return result;\n}\n\n//- info about whole parse\n\nRDI_PROC RDI_U64\nrdi_decompressed_size_from_parsed(RDI_Parsed *rdi)\n{\n  RDI_U64 decompressed_size = rdi->raw_data_size;\n  for(RDI_U64 section_idx = 0; section_idx < rdi->sections_count; section_idx += 1)\n  {\n    decompressed_size += (rdi->sections[section_idx].unpacked_size - rdi->sections[section_idx].encoded_size);\n  }\n  return decompressed_size;\n}\n\n//- decompression\n\ninternal void\nrdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi)\n{\n  // rjf: copy header\n  RDI_Header *src_header = (RDI_Header *)og_rdi->raw_data;\n  RDI_Header *dst_header = (RDI_Header *)decompressed_data;\n  {\n    MemoryCopy(dst_header, src_header, sizeof(RDI_Header));\n  }\n  \n  // rjf: copy & adjust sections for decompressed version\n  if(og_rdi->sections_count != 0)\n  {\n    RDI_Section *dsec_base = (RDI_Section *)(decompressed_data + dst_header->data_section_off);\n    MemoryCopy(dsec_base, (U8 *)og_rdi->raw_data + src_header->data_section_off, sizeof(RDI_Section) * og_rdi->sections_count);\n    U64 off = dst_header->data_section_off + sizeof(RDI_Section) * og_rdi->sections_count;\n    off += 7;\n    off -= off%8;\n    for(U64 idx = 0; idx < og_rdi->sections_count; idx += 1)\n    {\n      dsec_base[idx].encoding = RDI_SectionEncoding_Unpacked;\n      dsec_base[idx].off = off;\n      dsec_base[idx].encoded_size = dsec_base[idx].unpacked_size;\n      off += dsec_base[idx].unpacked_size;\n      off += 7;\n      off -= off%8;\n    }\n  }\n  \n  // rjf: decompress sections into new decompressed file buffer\n  if(og_rdi->sections_count != 0)\n  {\n    RDI_Section *src_first = og_rdi->sections;\n    RDI_Section *dst_first = (RDI_Section *)(decompressed_data + dst_header->data_section_off);\n    RDI_Section *src_opl = src_first + og_rdi->sections_count;\n    RDI_Section *dst_opl = dst_first + og_rdi->sections_count;\n    for(RDI_Section *src = src_first, *dst = dst_first;\n        src < src_opl && dst < dst_opl;\n        src += 1, dst += 1)\n    {\n      rr_lzb_simple_decode((U8*)og_rdi->raw_data + src->off, src->encoded_size,\n                           decompressed_data     + dst->off, dst->unpacked_size);\n    }\n  }\n}\n\n//- strings\n\nRDI_PROC RDI_U8 *\nrdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out)\n{\n  RDI_U8 *result_base = 0;\n  RDI_U64 result_size = 0;\n  {\n    RDI_U64 string_offs_count = 0;\n    RDI_U32 *string_offs = rdi_table_from_name(rdi, StringTable, &string_offs_count);\n    if(idx < string_offs_count)\n    {\n      RDI_U64 string_data_size = 0;\n      RDI_U8 *string_data = rdi_table_from_name(rdi, StringData, &string_data_size);\n      RDI_U32 off_raw = string_offs[idx];\n      RDI_U32 opl_raw = string_offs[idx + 1];\n      RDI_U32 opl = rdi_parse__min(opl_raw, string_data_size);\n      RDI_U32 off = rdi_parse__min(off_raw, opl);\n      result_base = string_data + off;\n      result_size = opl - off;\n    }\n  }\n  *len_out = result_size;\n  return result_base;\n}\n\n//- index runs\n\nRDI_PROC RDI_U32*\nrdi_idx_run_from_first_count(RDI_Parsed *rdi, RDI_U32 raw_first, RDI_U32 raw_count, RDI_U32 *n_out)\n{\n  RDI_U64 idx_run_count = 0;\n  RDI_U32 *idx_run_data = rdi_table_from_name(rdi, IndexRuns, &idx_run_count);\n  RDI_U32 raw_opl = raw_first + raw_count;\n  RDI_U32 opl = rdi_parse__min(raw_opl, idx_run_count);\n  RDI_U32 first = rdi_parse__min(raw_first, opl);\n  RDI_U32 *result = 0;\n  if(first < idx_run_count)\n  {\n    result = idx_run_data + first;\n  }\n  *n_out = opl - first;\n  return result;\n}\n\n//- line info\n\nRDI_PROC void\nrdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_ParsedLineTable *out)\n{\n  //- rjf: extract top-level line info tables\n  RDI_U64 all_voffs_count = 0;\n  RDI_U64 *all_voffs = rdi_table_from_name(rdi, LineInfoVOffs, &all_voffs_count);\n  RDI_U64 *all_voffs_opl = all_voffs + all_voffs_count;\n  RDI_U64 all_lines_count = 0;\n  RDI_Line *all_lines = rdi_table_from_name(rdi, LineInfoLines, &all_lines_count);\n  RDI_Line *all_lines_opl = all_lines + all_lines_count;\n  RDI_U64 all_cols_count = 0;\n  RDI_Column *all_cols = rdi_table_from_name(rdi, LineInfoColumns, &all_cols_count);\n  RDI_Column *all_cols_opl = all_cols + all_cols_count;\n  \n  //- rjf: extract ranges of top-level tables belonging to this line table\n  RDI_U64    *lt_voffs = all_voffs + line_table->voffs_base_idx;\n  RDI_Line   *lt_lines = all_lines + line_table->lines_base_idx;\n  RDI_Column *lt_cols  = all_cols  + line_table->cols_base_idx;\n  RDI_U64 lines_count = line_table->lines_count;\n  RDI_U64 cols_count  = line_table->cols_count;\n  if(lt_voffs >= all_voffs_opl) {lt_voffs = all_voffs; lines_count = 0;}\n  if(lt_lines >= all_lines_opl) {lt_lines = all_lines; lines_count = 0;}\n  if(lt_cols  >= all_cols_opl)  {lt_cols  = all_cols;  cols_count = 0;}\n  \n  //- rjf: fill result\n  out->voffs     = lt_voffs;\n  out->lines     = lt_lines;\n  out->cols      = lt_cols;\n  out->count     = lines_count;\n  out->col_count = cols_count;\n}\n\nRDI_PROC RDI_U64\nrdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out)\n{\n  RDI_U64 result = 0;\n  RDI_U64 n = 0;\n  if(line_info->count > 0 && line_info->voffs[0] <= voff && voff < line_info->voffs[line_info->count - 1])\n  {\n    //- rjf: find i such that: (vmap[i].voff <= voff) && (voff < vmap[i + 1].voff)\n    // assuming: (i < j) -> (vmap[i].voff < vmap[j].voff)\n    RDI_U32 first = 0;\n    RDI_U32 opl   = line_info->count;\n    for(;;)\n    {\n      RDI_U32 mid = (first + opl)/2;\n      if(line_info->voffs[mid] < voff)\n      {\n        first = mid;\n      }\n      else if(line_info->voffs[mid] > voff)\n      {\n        opl = mid;\n      }\n      else\n      {\n        first = mid;\n        break;\n      }\n      if(opl - first <= 1)\n      {\n        break;\n      }\n    }\n    result = (RDI_U64)first;\n    \n    //- rjf: scan leftward, to find shallowest line info matching this voff\n    for(;result != 0;)\n    {\n      if(line_info->voffs[result-1] == voff)\n      {\n        result -= 1;\n      }\n      else\n      {\n        break;\n      }\n    }\n    \n    //- rjf: scan rightward, to count # of line info with this voff\n    for(RDI_U64 idx = result; idx < line_info->count; idx += 1)\n    {\n      if(line_info->voffs[idx] == voff)\n      {\n        n += 1;\n      }\n      else\n      {\n        break;\n      }\n    }\n  }\n  if(n_out)\n  {\n    *n_out = n;\n  }\n  return result;\n}\n\nRDI_PROC RDI_U64\nrdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff)\n{\n  RDI_U64 count = 0;\n  RDI_U64 result = rdi_line_info_idx_range_from_voff(line_info, voff, &count);\n  for(RDI_S64 idx = count-1; idx >= 0; idx -= 1)\n  {\n    if(result + idx < line_info->count && line_info->lines[result+idx].file_idx != 0)\n    {\n      result += idx;\n      break;\n    }\n  }\n  return result;\n}\n\nRDI_PROC void\nrdi_parsed_from_source_line_map(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_ParsedSourceLineMap *out)\n{\n  //- rjf: extract top-level line info tables\n  RDI_U64 all_nums_count = 0;\n  RDI_U32 *all_nums = rdi_table_from_name(rdi, SourceLineMapNumbers, &all_nums_count);\n  RDI_U32 *all_nums_opl = all_nums + all_nums_count;\n  RDI_U64 all_rngs_count = 0;\n  RDI_U32 *all_rngs = rdi_table_from_name(rdi, SourceLineMapRanges, &all_rngs_count);\n  RDI_U32 *all_rngs_opl = all_rngs + all_rngs_count;\n  RDI_U64 all_voffs_count = 0;\n  RDI_U64 *all_voffs = rdi_table_from_name(rdi, SourceLineMapVOffs, &all_voffs_count);\n  RDI_U64 *all_voffs_opl = all_voffs + all_voffs_count;\n  \n  //- rjf: extract ranges of top-level tables belonging to this line map\n  RDI_U32 *map_nums = all_nums + map->line_map_nums_base_idx;\n  RDI_U32 *map_rngs = all_rngs + map->line_map_range_base_idx;\n  RDI_U64 *map_voffs= all_voffs+ map->line_map_voff_base_idx;\n  RDI_U64 lines_count = (RDI_U64)map->line_count;\n  RDI_U64 voffs_count = (RDI_U64)map->voff_count;\n  if(map_nums >= all_nums_opl) {map_nums = all_nums; lines_count = 0;}\n  if(map_rngs >= all_rngs_opl) {map_rngs = all_rngs; lines_count = 0;}\n  if(map_voffs>= all_voffs_opl){map_voffs= all_voffs;voffs_count = 0;}\n  \n  //- rjf: fill result\n  out->nums       = map_nums;\n  out->ranges     = map_rngs;\n  out->voffs      = map_voffs;\n  out->count      = lines_count;\n  out->voff_count = voffs_count;\n}\n\nRDI_PROC RDI_U64 *\nrdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 *n_out)\n{\n  RDI_U64 *result = 0;\n  *n_out = 0;\n  RDI_U32 closest_i = 0;\n  if(map->count > 0 && map->nums[0] <= linenum)\n  {\n    // assuming: (i < j) -> (nums[i] < nums[j])\n    // find i such that: (nums[i] <= linenum) && (linenum < nums[i + 1])\n    RDI_U32 *nums = map->nums;\n    RDI_U32 first = 0;\n    RDI_U32 opl   = map->count;\n    for(;;)\n    {\n      RDI_U32 mid = (first + opl)/2;\n      if(nums[mid] < linenum)\n      {\n        first = mid;\n      }\n      else if(nums[mid] > linenum)\n      {\n        opl = mid;\n      }\n      else\n      {\n        first = mid;\n        break;\n      }\n      if(opl - first <= 1)\n      {\n        break;\n      }\n    }\n    closest_i = first;\n  }\n  \n  // round up instead of down if possible\n  if(closest_i + 1 < map->count && map->nums[closest_i] < linenum)\n  {\n    closest_i += 1;\n  }\n  \n  // set result if possible\n  if(closest_i < map->count)\n  {\n    RDI_U32 first = map->ranges[closest_i];\n    RDI_U32 opl   = map->ranges[closest_i + 1];\n    if(opl <= map->voff_count)\n    {\n      result = map->voffs + first;\n      *n_out = opl - first;\n    }\n  }\n  \n  return result;\n}\n\n//- vmap lookups\n\nRDI_PROC RDI_U64\nrdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff)\n{\n  RDI_U64 result = 0;\n  if(vmap_count > 0 && vmap[0].voff <= voff && voff < vmap[vmap_count - 1].voff)\n  {\n    // assuming: (i < j) -> (vmap[i].voff < vmap[j].voff)\n    // find i such that: (vmap[i].voff <= voff) && (voff < vmap[i + 1].voff)\n    RDI_U32 first = 0;\n    RDI_U32 opl   = vmap_count;\n    for(;;)\n    {\n      RDI_U32 mid = (first + opl)/2;\n      if(vmap[mid].voff < voff)\n      {\n        first = mid;\n      }\n      else if(vmap[mid].voff > voff)\n      {\n        opl = mid;\n      }\n      else\n      {\n        first = mid;\n        break;\n      }\n      if(opl - first <= 1)\n      {\n        break;\n      }\n    }\n    result = (RDI_U64)vmap[first].idx;\n  }\n  return result;\n}\n\nRDI_PROC RDI_U64\nrdi_vmap_idx_from_section_kind_voff(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 voff)\n{\n  RDI_U64 vmaps_count = 0;\n  RDI_VMapEntry *vmaps = rdi_section_raw_table_from_kind(rdi, kind, &vmaps_count);\n  RDI_U64 result = rdi_vmap_idx_from_voff(vmaps, vmaps_count, voff);\n  return result;\n}\n\n//- name maps\n\nRDI_PROC void\nrdi_parsed_from_name_map(RDI_Parsed *rdi, RDI_NameMap *mapptr, RDI_ParsedNameMap *out)\n{\n  out->buckets = 0;\n  out->bucket_count = 0;\n  if(mapptr != 0)\n  {\n    RDI_U64 all_buckets_count = 0;\n    RDI_NameMapBucket *all_buckets = rdi_table_from_name(rdi, NameMapBuckets, &all_buckets_count);\n    RDI_U64 all_nodes_count = 0;\n    RDI_NameMapNode *all_nodes = rdi_table_from_name(rdi, NameMapNodes, &all_nodes_count);\n    out->buckets = all_buckets+mapptr->bucket_base_idx;\n    out->nodes = all_nodes+mapptr->node_base_idx;\n    out->bucket_count = mapptr->bucket_count;\n    out->node_count = mapptr->node_count;\n    if(mapptr->bucket_base_idx > all_buckets_count)\n    {\n      out->buckets = 0;\n      out->bucket_count = 0;\n    }\n    if(mapptr->node_base_idx > all_nodes_count)\n    {\n      out->nodes = 0;\n      out->node_count = 0;\n    }\n  }\n}\n\nRDI_PROC RDI_NameMapNode*\nrdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len)\n{\n  RDI_NameMapNode *result = 0;\n  if(map->bucket_count > 0)\n  {\n    RDI_NameMapBucket *buckets = map->buckets;\n    RDI_U64 bucket_count = map->bucket_count;\n    RDI_U64 hash = rdi_hash(str, len);\n    RDI_U64 bucket_index = hash%bucket_count;\n    RDI_NameMapBucket *bucket = map->buckets + bucket_index;\n    RDI_NameMapNode *node = map->nodes + bucket->first_node;\n    RDI_NameMapNode *node_opl = node + bucket->node_count;\n    for(;node < node_opl; node += 1)\n    {\n      // extract a string from this node\n      RDI_U64 nlen = 0;\n      RDI_U8 *nstr = rdi_string_from_idx(p, node->string_idx, &nlen);\n      \n      // compare this to the needle string\n      RDI_S32 match = 0;\n      if(nlen == len)\n      {\n        RDI_U8 *a = str;\n        RDI_U8 *aopl = str + len;\n        RDI_U8 *b = nstr;\n        for (;a < aopl && *a == *b; a += 1, b += 1);\n        match = (a == aopl);\n      }\n      \n      // stop with a matching node in result\n      if(match)\n      {\n        result = node;\n        break;\n      }\n      \n    }\n  }\n  return result;\n}\n\nRDI_PROC RDI_U32*\nrdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out)\n{\n  RDI_U32 *result = 0;\n  *n_out = 0;\n  if(node != 0)\n  {\n    if(node->match_count == 1)\n    {\n      result = &node->match_idx_or_idx_run_first;\n      *n_out = 1;\n    }\n    else\n    {\n      result = rdi_idx_run_from_first_count(p, node->match_idx_or_idx_run_first, node->match_count, n_out);\n    }\n  }\n  return result;\n}\n\n////////////////////////////////\n//~ High-Level Composite Lookup Functions\n\n//- procedures\n\nRDI_PROC RDI_Procedure *\nrdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size)\n{\n  RDI_NameMap *map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_Procedures);\n  RDI_ParsedNameMap map_parsed = {0};\n  rdi_parsed_from_name_map(rdi, map, &map_parsed);\n  RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map_parsed, name, name_size);\n  RDI_U32 id_count = 0;\n  RDI_U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\n  RDI_U32 procedure_idx = 0;\n  if(id_count > 0)\n  {\n    procedure_idx = ids[0];\n  }\n  RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, procedure_idx);\n  return procedure;\n}\n\nRDI_PROC RDI_Procedure *\nrdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr)\n{\n  RDI_Procedure *result = rdi_procedure_from_name(rdi, (RDI_U8 *)cstr, rdi_cstring_length(cstr));\n  return result;\n}\n\nRDI_PROC RDI_U8 *\nrdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out)\n{\n  return rdi_string_from_idx(rdi, procedure->name_string_idx, len_out);\n}\n\nRDI_PROC RDI_Scope *\nrdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)\n{\n  RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx);\n  return scope;\n}\n\nRDI_PROC RDI_UDT *\nrdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)\n{\n  RDI_U64 idx = 0;\n  if(procedure->link_flags & RDI_LinkFlag_TypeScoped)\n  {\n    idx = procedure->container_idx;\n  }\n  RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, idx);\n  return udt;\n}\n\nRDI_PROC RDI_Procedure *\nrdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)\n{\n  RDI_U64 idx = 0;\n  if(procedure->link_flags & RDI_LinkFlag_ProcScoped)\n  {\n    idx = procedure->container_idx;\n  }\n  RDI_Procedure *container_procedure = rdi_element_from_name_idx(rdi, Procedures, idx);\n  return container_procedure;\n}\n\nRDI_PROC RDI_U64\nrdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)\n{\n  RDI_Scope *scope = rdi_root_scope_from_procedure(rdi, procedure);\n  RDI_U64 result = rdi_first_voff_from_scope(rdi, scope);\n  return result;\n}\n\nRDI_PROC RDI_U64\nrdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure)\n{\n  RDI_Scope *scope = rdi_root_scope_from_procedure(rdi, procedure);\n  RDI_U64 result = rdi_opl_voff_from_scope(rdi, scope);\n  return result;\n}\n\nRDI_PROC RDI_Procedure *\nrdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff)\n{\n  RDI_Scope *scope = rdi_scope_from_voff(rdi, voff);\n  RDI_Procedure *procedure = rdi_procedure_from_scope(rdi, scope);\n  return procedure;\n}\n\n//- scopes\n\nRDI_PROC RDI_U64\nrdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope)\n{\n  RDI_U64 *voffs = rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_first);\n  RDI_U64 result = *voffs;\n  return result;\n}\n\nRDI_PROC RDI_U64\nrdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope)\n{\n  RDI_U64 result = 0;\n  if(scope->voff_range_opl != 0)\n  {\n    RDI_U64 *voffs = rdi_element_from_name_idx(rdi, ScopeVOffData, scope->voff_range_opl-1);\n    result = *voffs;\n  }\n  return result;\n}\n\nRDI_PROC RDI_Scope *\nrdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff)\n{\n  RDI_U32 idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_ScopeVMap, voff);\n  RDI_Scope *scope = rdi_element_from_name_idx(rdi, Scopes, idx);\n  return scope;\n}\n\nRDI_PROC RDI_Scope *\nrdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope)\n{\n  RDI_Scope *parent = rdi_element_from_name_idx(rdi, Scopes, scope->parent_scope_idx);\n  return parent;\n}\n\nRDI_PROC RDI_Procedure *\nrdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope)\n{\n  RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx);\n  return procedure;\n}\n\nRDI_PROC RDI_InlineSite *\nrdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope)\n{\n  RDI_InlineSite *inline_site = rdi_element_from_name_idx(rdi, InlineSites, scope->inline_site_idx);\n  return inline_site;\n}\n\n//- global variables\n\nRDI_PROC RDI_GlobalVariable *\nrdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff)\n{\n  RDI_U32 idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_GlobalVMap, voff);\n  RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, idx);\n  return gvar;\n}\n\n//- units\n\nRDI_PROC RDI_Unit *\nrdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff)\n{\n  RDI_U32 unit_idx = rdi_vmap_idx_from_section_kind_voff(rdi, RDI_SectionKind_UnitVMap, voff);\n  RDI_Unit *unit = rdi_element_from_name_idx(rdi, Units, unit_idx);\n  return unit;\n}\n\nRDI_PROC RDI_LineTable *\nrdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit)\n{\n  RDI_LineTable *line_table = rdi_element_from_name_idx(rdi, LineTables, unit->line_table_idx);\n  return line_table;\n}\n\n//- line info\n\nRDI_PROC RDI_Line\nrdi_line_from_voff(RDI_Parsed *rdi, RDI_U64 voff)\n{\n  RDI_Unit *unit = rdi_unit_from_voff(rdi, voff);\n  RDI_LineTable *line_table = rdi_line_table_from_unit(rdi, unit);\n  RDI_Line line = rdi_line_from_line_table_voff(rdi, line_table, voff);\n  return line;\n}\n\nRDI_PROC RDI_Line\nrdi_line_from_line_table_voff(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_U64 voff)\n{\n  RDI_ParsedLineTable parsed = {0};\n  rdi_parsed_from_line_table(rdi, line_table, &parsed);\n  RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&parsed, voff);\n  RDI_Line result = {0};\n  if(line_info_idx < parsed.count)\n  {\n    result = parsed.lines[line_info_idx];\n  }\n  return result;\n}\n\nRDI_PROC RDI_SourceFile *\nrdi_source_file_from_line(RDI_Parsed *rdi, RDI_Line *line)\n{\n  RDI_SourceFile *result = rdi_element_from_name_idx(rdi, SourceFiles, line->file_idx);\n  return result;\n}\n\n//- source files\n\nRDI_PROC RDI_SourceFile *\nrdi_source_file_from_normal_path(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size)\n{\n  RDI_NameMap *map = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths);\n  RDI_ParsedNameMap map_parsed = {0};\n  rdi_parsed_from_name_map(rdi, map, &map_parsed);\n  RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map_parsed, name, name_size);\n  RDI_U32 id_count = 0;\n  RDI_U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\n  RDI_U32 file_idx = 0;\n  if(id_count > 0)\n  {\n    file_idx = ids[0];\n  }\n  RDI_SourceFile *file = rdi_element_from_name_idx(rdi, SourceFiles, file_idx);\n  return file;\n}\n\nRDI_PROC RDI_SourceFile *\nrdi_source_file_from_normal_path_cstr(RDI_Parsed *rdi, char *cstr)\n{\n  RDI_SourceFile *result = rdi_source_file_from_normal_path(rdi, (RDI_U8 *)cstr, rdi_cstring_length(cstr));\n  return result;\n}\n\nRDI_PROC RDI_U8 *\nrdi_normal_path_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U64 *len_out)\n{\n  return rdi_string_from_idx(rdi, src_file->normal_full_path_string_idx, len_out);\n}\n\nRDI_PROC RDI_FilePathNode *\nrdi_file_path_node_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file)\n{\n  RDI_FilePathNode *result = rdi_element_from_name_idx(rdi, FilePathNodes, src_file->file_path_node_idx);\n  return result;\n}\n\nRDI_PROC RDI_SourceLineMap *\nrdi_source_line_map_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file)\n{\n  RDI_SourceLineMap *result = rdi_element_from_name_idx(rdi, SourceLineMaps, src_file->source_line_map_idx);\n  return result;\n}\n\nRDI_PROC RDI_U64\nrdi_first_voff_from_source_file_line_num(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U32 line_num)\n{\n  RDI_SourceLineMap *source_line_map = rdi_source_line_map_from_source_file(rdi, src_file);\n  RDI_U64 voff = rdi_first_voff_from_source_line_map_num(rdi, source_line_map, line_num);\n  return voff;\n}\n\n//- source line maps\n\nRDI_PROC RDI_U64\nrdi_first_voff_from_source_line_map_num(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_U32 line_num)\n{\n  RDI_ParsedSourceLineMap parsed = {0};\n  rdi_parsed_from_source_line_map(rdi, map, &parsed);\n  RDI_U32 all_voffs_count = 0;\n  RDI_U64 *all_voffs = rdi_line_voffs_from_num(&parsed, line_num, &all_voffs_count);\n  RDI_U64 voff = 0;\n  if(all_voffs_count != 0)\n  {\n    voff = all_voffs[0];\n  }\n  return voff;\n}\n\n//- file path nodes\n\nRDI_PROC RDI_FilePathNode *\nrdi_parent_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node)\n{\n  RDI_FilePathNode *result = rdi_element_from_name_idx(rdi, FilePathNodes, node->parent_path_node);\n  return result;\n}\n\nRDI_PROC RDI_U8 *\nrdi_name_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node, RDI_U64 *len_out)\n{\n  return rdi_string_from_idx(rdi, node->name_string_idx, len_out);\n}\n\n////////////////////////////////\n//~ Parser Helpers\n\nRDI_PROC RDI_U64\nrdi_cstring_length(char *cstr)\n{\n  RDI_U64 result = 0;\n  for(;cstr[result] != 0; result += 1){}\n  return result;\n}\n\nRDI_PROC RDI_U64\nrdi_size_from_bytecode_stream(RDI_U8 *ptr, RDI_U8 *opl)\n{\n  RDI_U64 bytecode_size = 0;\n  RDI_U8 *off_first = ptr + sizeof(RDI_LocationKind);\n  for(RDI_U8 *off = off_first, *next_off = opl; off < opl; off = next_off)\n  {\n    RDI_U8 op = *off;\n    if(op == 0)\n    {\n      break;\n    }\n    \n    RDI_U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];\n    RDI_U32 p_size   = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\n    bytecode_size += (1 + p_size);\n    next_off = (off + 1 + p_size);\n  }\n  return bytecode_size;\n}\n\n////////////////////////////////\n//~ Compression/Decompression Implementation\n\n#include <string.h>\n\n//-------------------------------------------------\n// UINTr = int the size of a register\n\n#ifdef __RAD64REGS__\n\n#define RAD_UINTr RAD_U64\n#define RAD_SINTr RAD_S64\n\n#define readR read64\n#define writeR write64\n\n#define rrClzBytesR rrClzBytes64\n#define rrCtzBytesR rrCtzBytes64\n\n#else\n\n#define RAD_UINTr RAD_U32\n#define RAD_SINTr RAD_S32\n\n#define readR read32\n#define writeR write32\n\n#define rrClzBytesR rrClzBytes32\n#define rrCtzBytesR rrCtzBytes32\n\n#endif\n\ntypedef RAD_SINTr SINTr;\ntypedef RAD_UINTr UINTr;\n\n#define OOINLINE\tRADFORCEINLINE\n\n#define if_unlikely(exp)\tif ( RAD_UNLIKELY( exp ) )\n#define if_likely(  exp)\tif ( RAD_LIKELY( exp ) )\n\n// Raw byte IO\n\n#if defined(__RADARM__) && !defined(__RAD64__) && defined(__GNUC__)\n\n// older GCCs don't turn the memcpy variant into loads/stores, but\n// they do support this:\ntypedef union\n{\n\tU16 u16;\n\tU32 u32; \n\tU64 u64; \n} __attribute__((packed)) unaligned_type;\n\nstatic inline U16 read16(const void *ptr) \t\t{ return ((const unaligned_type *)ptr)->u16; }\nstatic inline void write16(void *ptr, U16 x) \t{ ((unaligned_type *)ptr)->u16 = x; }\n\nstatic inline U32 read32(const void *ptr) \t\t{ return ((const unaligned_type *)ptr)->u32; }\nstatic inline void write32(void *ptr, U32 x) \t{ ((unaligned_type *)ptr)->u32 = x; }\n\nstatic inline U64 read64(const void *ptr) \t\t{ return ((const unaligned_type *)ptr)->u64; }\nstatic inline void write64(void *ptr, U64 x) \t{ ((unaligned_type *)ptr)->u64 = x; }\n\n#else\n\n// most C compilers we target are smart enough to turn this into single loads/stores\nstatic inline U16 read16(const void *ptr) \t\t{ U16 x; memcpy(&x, ptr, sizeof(x)); return x; }\nstatic inline void write16(void *ptr, U16 x) \t{ memcpy(ptr, &x, sizeof(x)); }\n\nstatic inline U32 read32(const void *ptr) \t\t{ U32 x; memcpy(&x, ptr, sizeof(x)); return x; }\nstatic inline void write32(void *ptr, U32 x) \t{ memcpy(ptr, &x, sizeof(x)); }\n\nstatic inline U64 read64(const void *ptr) \t\t{ U64 x; memcpy(&x, ptr, sizeof(x)); return x; }\nstatic inline void write64(void *ptr, U64 x) \t{ memcpy(ptr, &x, sizeof(x)); }\n\n#endif\n\n#define RR_PUT16_LE_UNALIGNED(ptr,val)                 RR_PUT16_LE(ptr,val)\n#define RR_PUT16_LE_UNALIGNED_OFFSET(ptr,val,offset)   RR_PUT16_LE_OFFSET(ptr,val,offset)\n\n//===========================================================================\n\nstatic RADINLINE SINTa rrPtrDiffV(void * end, void *start) { return (SINTa)( ((char *)(end)) - ((char *)(start)) ); }\n\n// helper function to show I really am intending to put a pointer difference in an int :\nstatic RADINLINE SINTa rrPtrDiff(SINTa val) { return val; }\nstatic RADINLINE S32 rrPtrDiff32(SINTa val) { S32 ret = (S32) val; RR_ASSERT( (SINTa)ret == val ); return ret; }\nstatic RADINLINE SINTr rrPtrDiffR(SINTa val) { SINTr ret = (SINTr) val; RR_ASSERT( (SINTa)ret == val ); return ret; }\n\n//=================================================================\n\n#define LZB_LRL_BITS\t4\n#define LZB_LRL_ESCAPE\t15\n\n#define LZB_ML_BITS\t\t4\n#define LZB_MLCONTROL_ESCAPE\t15\n\n#define LZB_SLIDING_WINDOW_POW2\t16\n#define LZB_SLIDING_WINDOW_SIZE\t(1<<LZB_SLIDING_WINDOW_POW2)\n\n#define LZB_MAX_OFFSET\t\t0xFFFF\n\n#define LZB_MML\t\t4\t\t// should be 3 if I had LO\n\n#define LZB_MATCHLEN_ESCAPE\t\t(LZB_MLCONTROL_ESCAPE+4)\n\n\n#define LZB_END_WITH_LITERALS\t\t\t1\t// @@ ??\n//#define LZB_END_WITH_LITERALS\t\t\t0\t// @@ ??\n#define LZB_END_OF_BLOCK_NO_MATCH_ZONE\t8\n\n/**\n\nNOTE ABOUT LZB_END_OF_BLOCK_NO_MATCH_ZONE\n\nThe limitation in LZB does not actually come from the 8-at-a-time match copier\n\nit comes from the unconditional 8-byte LRL copy\n\nthat means the last 8 bytes of every block *must* be literals\n\n(note that's *block* not quantum)\n\nThe constraint due to matches is actually weaker\n(match len rounded up to next multiple of 8 must not go past block end)\n\n**/\n\n// decode speed on lzt99 :\n// LZ4 :      1715.10235\n\n#define LZB_FORCELASTLRL9\t1\n\n//=======================================\n\n#define lz_copywordstep(d,s)\t\t\tdo { writeR(d, readR(s)); (s) += sizeof(UINTr); (d) += sizeof(UINTr); } while(0)\n#define lz_copywordsteptoend(d,s,e)\t\tdo { lz_copywordstep(d,s); } while ((d)<(e))\n\n// lz_copysteptoend_overrunok\n// NOTE : unlike memcpy, adjusts dest pointer to end !\n#define lz_copysteptoend_overrunok(d,s,l)\tdo { U8 * e=(d)+(l); lz_copywordsteptoend(d,s,e); d=e; } while(0)\n\n//=======================================\n\n#define LZB_PutExcessBW(cp,val)\tdo { \\\nif ( val < 192 ) *cp++ = (U8) val; \\\nelse { val -= 192; *cp++ = 192 + (U8) ( val&0x3F); val >>= 6; \\\nif ( val < 128 ) *cp++ = (U8) val; \\\nelse { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \\\nif ( val < 128 ) *cp++ = (U8) val; \\\nelse { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \\\nif ( val < 128 ) *cp++ = (U8) val; \\\nelse { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; *cp++ = (U8) val; } } } } \\\n} while(0)\n\n// max bytes consumed: 5\n#define LZB_AddExcessBW(cp,val)\tdo { U32 b = *cp++; \\\nif ( b < 192 ) val += b; \\\nelse { val += 192; val += (b-192); b = *cp++; \\\nval += (b<<6); if ( b >= 128 ) { b = *cp++; \\\nval += (b<<13); if ( b >= 128 ) { b = *cp++; \\\nval += (b<<20); if ( b >= 128 ) { b = *cp++; \\\nval += (b<<27); } } } } \\\n} while(0)\n\n#define LZB_PutExcessLRL(cp,val) LZB_PutExcessBW(cp,val)\n#define LZB_PutExcessML(cp,val)  LZB_PutExcessBW(cp,val)\n\n#define LZB_AddExcessLRL(cp,val) LZB_AddExcessBW(cp,val)\n#define LZB_AddExcessML(cp,val)  LZB_AddExcessBW(cp,val)\n\n//=============================================================================\n// match copies :\n\n// used for LRL :\nstatic OOINLINE void copy_no_overlap_long(U8 * to, const U8 * from, SINTr length)\n{\n\tfor(int i=0;i<length;i+=8)\n\t\twrite64(to+i, read64(from+i));\n}\n\nstatic OOINLINE void copy_no_overlap_nooverrun(U8 * to, const U8 * from, SINTr length)\n{\n\t// used for final LRL of every block\n\t//  must not overrun\n\tmemmove(to,from,(size_t)length);\n}\n\nRR_COMPILER_ASSERT( LZB_MLCONTROL_ESCAPE == 15 );\nRR_COMPILER_ASSERT( LZB_MATCHLEN_ESCAPE == 19 );\n\nstatic OOINLINE void copy_match_short_overlap(U8 * to, const U8 * from, SINTr ml)\n{\n\tRR_ASSERT( ml >= LZB_MML && ml < LZB_MATCHLEN_ESCAPE );\n  \n\t// overlap\n\t// @@ err not awesome\n\tto[0] = from[0];\n\tto[1] = from[1];\n\tto[2] = from[2];\n\tto[3] = from[3];\n\tto[4] = from[4];\n\tto[5] = from[5];\n\tto[6] = from[6];\n\tto[7] = from[7];\n\tif ( ml > 8 )\n\t{\n\t\tto += 8; from += 8; ml -= 8;\n\t\t// max of 10 more\n\t\twhile(ml--)\n\t\t{\n\t\t\t*to++ = *from++;\n\t\t}\n\t}\n}\n\nstatic OOINLINE void copy_match_memset(U8 * to, int c, SINTr ml)\n{\n\tRR_ASSERT( ml >= 4 );\n\tU32 four = c * 0x01010101;\n\tU8 * end = to + ml;\n\twrite32(to, four); to += 4;\n\twhile(to<end)\n\t{\n\t\twrite32(to, four); to += 4;\n\t}\n}\n\n//=============================================================================\n\nstatic SINTa rr_lzb_simple_decode_notexpanded(const void * comp, void * raw, SINTa rawLen)\n{\n\tU8 * rp = (U8 *)raw;\n\tU8 * rpEnd = rp+rawLen;\n  \n\tconst U8 *\tcp = (const U8 *)comp;\n\t\n\tfor(;;)\n\t{\n\t\tRR_ASSERT( rp < rpEnd );\n    \n\t\t// max bytes consumed (fast paths):\n\t\t// - 1 control\n\t\t// - lits:\n\t\t//   * 15 lits OR\n\t\t//   * 5 excess lrl + long lit run\n\t\t// - match:\n\t\t//   * 2 match offset (short match) OR\n\t\t//   * 1 excess code + 5 excess ML (overlap match) OR\n\t\t//   * 1 excess code + 5 excess ML (long match)\n\t\t//\n\t\t// need near-end checks mainly on long lit runs.\n    \n\t\tUINTr control = *cp++;\n    \n\t\tUINTr lrl = control & 0xF;\n\t\tUINTr ml_control = (control>>4);\n    \n\t\t// copy 4 literals speculatively :\n\t\twrite32( rp , read32(cp) );\n    \n\t\t//RR_ASSERT( lrl >= 8 || ml_control >= 8 );\n    \n\t\tif ( lrl > 4 )\n\t\t{\n\t\t\t// if lrl was <= 8 we did it, else need this :\n\t\t\tif_unlikely ( lrl > 8 )\n\t\t\t{\n\t\t\t\tif_unlikely ( lrl >= LZB_LRL_ESCAPE )\n\t\t\t\t{\n\t\t\t\t\tLZB_AddExcessLRL( cp, lrl );\n          \n\t\t\t\t\t// hide the EOF check here ?\n\t\t\t\t\t// has to be after the GetExcess\n\t\t\t\t\tif_unlikely ( rp+lrl >= rpEnd )\n\t\t\t\t\t{\t\n\t\t\t\t\t\tRR_ASSERT( rp+lrl == rpEnd );\n            \n\t\t\t\t\t\tcopy_no_overlap_nooverrun(rp,cp,lrl);\n            \n\t\t\t\t\t\trp += lrl;\n\t\t\t\t\t\tcp += lrl;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// total undo of the previous copy\t\n\t\t\t\t\t\tcopy_no_overlap_long(rp,cp,lrl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse // > 8 but not 0xF\n\t\t\t\t{\n\t\t\t\t\t// hide the EOF check here ?\n\t\t\t\t\tif_unlikely ( rp+lrl >= rpEnd )\n\t\t\t\t\t{\t\n\t\t\t\t\t\tif ( lrl == 9 )\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t// may be a false 9\n\t\t\t\t\t\t\tlrl = rrPtrDiff32( rpEnd - rp );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tRR_ASSERT( rp+lrl == rpEnd );\n            \n\t\t\t\t\t\tcopy_no_overlap_nooverrun(rp,cp,lrl);\n            \n\t\t\t\t\t\trp += lrl;\n\t\t\t\t\t\tcp += lrl;\n\t\t\t\t\t\tbreak;\t\t\t\t\t\t\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\twrite32( rp+4 , read32(cp+4) );\n\t\t\t\t\t\t// put 8 more :\n\t\t\t\t\t\twrite64( (rp+8) , read64((cp+8)) );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\twrite32( rp+4 , read32(cp+4) );\n\t\t\t}\n\t\t}\n    \n\t\trp += lrl;\n\t\tcp += lrl;\n    \n\t\tRR_ASSERT( rp+LZB_MML <= rpEnd );\n    \n\t\tUINTr ml = ml_control + LZB_MML;\n    \n\t\t// speculatively grab offset but don't advance cp yet\n\t\tUINTr off = RR_GET16_LE_UNALIGNED(cp);\n    \n\t\tif ( ml_control <= 8 )\n\t\t{\n\t\t\tcp += 2; // consume offset\n\t\t\tconst U8 * match = rp - off;\n      \n\t\t\tRR_ASSERT( ml <= 12 );\n      \n\t\t\twrite64( rp , read64(match) );\n\t\t\twrite32( rp+8 , read32(match+8) );\n      \n\t\t\trp += ml;\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n      \n\t\t\tif_likely( ml_control < LZB_MLCONTROL_ESCAPE ) // short match\n\t\t\t{\n\t\t\t\tcp += 2; // consume offset\n\t\t\t\tconst U8 * match = rp - off;\n        \n\t\t\t\tRR_ASSERT( off >= 8 || ml <= off );\n        \n\t\t\t\twrite64( rp , read64(match) );\n\t\t\t\twrite64( rp+8 , read64(match+8) );\n        \n\t\t\t\tif ( ml > 16 )\n\t\t\t\t{\n\t\t\t\t\twrite16( rp+16, read16(match+16) );\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// get 1-byte excess code\n\t\t\t\tUINTr excesslow = off&127;\n\t\t\t\tcp++; // consume 1\n        \n\t\t\t\t//if ( excess1 >= 128 )\n\t\t\t\tif ( off & 128 )\n\t\t\t\t{\t\t\t\t\n\t\t\t\t\tml_control = excesslow >> 3;\n\t\t\t\t\tml = ml_control + LZB_MML;\n\t\t\t\t\tif ( ml_control == 0xF )\n\t\t\t\t\t{\n\t\t\t\t\t\t// get more ml\n\t\t\t\t\t\tLZB_AddExcessML( cp, ml );\n\t\t\t\t\t}\t\n          \n\t\t\t\t\tUINTr myoff = off & 7;\n          \n\t\t\t\t\t// low offset, can't do 8-byte grabs\n\t\t\t\t\tif ( myoff == 1 )\n\t\t\t\t\t{\n\t\t\t\t\t\tint c = rp[-1];\n\t\t\t\t\t\tcopy_match_memset(rp,c,ml);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\t// shit but whatever, very rare\n\t\t\t\t\t\tfor(UINTr i=0;i<ml;i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trp[i] = rp[i-myoff];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tUINTr myoff = RR_GET16_LE_UNALIGNED(cp); cp += 2;\n\t\t\t\t\tconst U8 * match = rp - myoff;\n          \n\t\t\t\t\tml += excesslow;\n          \n\t\t\t\t\tif ( excesslow == 127 )\n\t\t\t\t\t{\n\t\t\t\t\t\t// get more ml\n\t\t\t\t\t\tLZB_AddExcessML( cp, ml );\n\t\t\t\t\t}\n          \n\t\t\t\t\t// 8-byte copier :\n\t\t\t\t\tcopy_no_overlap_long(rp,match,ml);\n\t\t\t\t}\n\t\t\t}\n      \n\t\t\trp += ml;\n\t\t}\n\t}\n  \n\tRR_ASSERT( rp == rpEnd );\n  \n\tSINTa used = rrPtrDiff( cp - (const U8 *)comp );\n\t\n\tRR_ASSERT( used < rawLen );\n\t\n\treturn used;\n}\n\nSINTa rr_lzb_simple_decode(const void * comp, SINTa compLen, void * raw, SINTa rawLen)\n{\n\tRR_ASSERT_ALWAYS( compLen <= rawLen );\n\tif ( compLen == rawLen )\n\t{\n\t\tmemcpy(raw,comp,rawLen);\n\t\treturn compLen;\n\t}\n\treturn rr_lzb_simple_decode_notexpanded(comp,raw,rawLen);\n}\n\n//=====================================================\n\n\nstatic RADINLINE U32 hmf_hash4_32(U32 ptr32)\n{\n  U32 h = ( ptr32 * 2654435761u );\n  h ^= (h>>13);\n  return h;\n}\n\n#define HashMatchFinder_Hash32\thmf_hash4_32\n\n//=================================================================================\n\n#define LZB_Hash4\thmf_hash4_32\n\nstatic RADINLINE U32 LZB_SecondHash4(U32 be4)\n{\n\tconst U32 m = 0x5bd1e995;\n  \n\tU32 h = be4 * m;\n\th += (h>>11);\n\t\n\treturn h;\n}\n\n//=============================================    \n\nstatic int RADFORCEINLINE GetNumBytesZeroNeverAllR(UINTr x)\n{\n\tRR_ASSERT( x != 0 );\n  \n#if defined(__RADBIGENDIAN__)\n\t// big endian, so earlier bytes are at the top\n\tint nb = (int)rrClzBytesR(x);\n#elif defined(__RADLITTLEENDIAN__)\n\t// little endian, so earlier bytes are at the bottom\n\tint nb = (int)rrCtzBytesR(x);\n#else\n#error wtf no endian set\n#endif\n  \n\tRR_ASSERT( nb >= 0 && nb < (int)sizeof(UINTr) );\n\treturn nb;\n}\n\n//===============================\n\nstatic RADFORCEINLINE U8 * LZB_Output(U8 * cp, S32 lrl, const U8 * literals,  S32 matchlen ,  S32 mo )\n{\n\tRR_ASSERT( lrl >= 0 );\n\tRR_ASSERT( matchlen >= LZB_MML );\n\tRR_ASSERT( mo > 0 && mo <= LZB_MAX_OFFSET );\n\t\n\t//rrprintf(\"[%3d][%3d][%7d]\\n\",lrl,ml,mo);\n  \n\tS32 sendml = matchlen - LZB_MML;\n\t\n\tU32 ml_in_control  = RR_MIN(sendml,LZB_MLCONTROL_ESCAPE);\n\t\n\tif ( mo >= 8 ) // no overlap\t\n\t{\n\t\tif ( lrl < LZB_LRL_ESCAPE )\n\t\t{\n\t\t\tU32 control = lrl | (ml_in_control<<4);\n      \n\t\t\t*cp++ = (U8) control;\n\t\t\t\n\t\t\twrite64(cp, read64(literals));\n\t\t\tif ( lrl > 8 )\n\t\t\t{\n\t\t\t\twrite64(cp+8, read64(literals+8));\n\t\t\t}\n\t\t\tcp += lrl;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tU32 control = LZB_LRL_ESCAPE | (ml_in_control<<4);\n      \n\t\t\t*cp++ = (U8) control;\n\t\t\t\n\t\t\tU32 lrl_excess = lrl - LZB_LRL_ESCAPE;\n\t\t\tLZB_PutExcessLRL(cp,lrl_excess);\n      \n\t\t\t// @@ ? is this okay for overrun ?\n\t\t\tlz_copysteptoend_overrunok(cp,literals,lrl);\n\t\t}\n\t\t\n\t\tif ( ml_in_control < LZB_MLCONTROL_ESCAPE )\n\t\t{\n\t\t\tRR_ASSERT( (U16)(mo) == mo );\n\t\t\tRR_PUT16_LE_UNALIGNED(cp,(U16)(mo));\n\t\t\tcp += 2;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tU32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE;\n\t\t\t\n\t\t\t// put special first byte, then offset, then remainder\n\t\t\tif ( ml_excess < 127 )\n\t\t\t{\n\t\t\t\t*cp++ = (U8)ml_excess;\n        \n\t\t\t\tRR_ASSERT( (U16)(mo) == mo );\n\t\t\t\tRR_PUT16_LE_UNALIGNED(cp,(U16)(mo));\n\t\t\t\tcp += 2;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*cp++ = (U8)127;\n        \n\t\t\t\tRR_ASSERT( (U16)(mo) == mo );\n\t\t\t\tRR_PUT16_LE_UNALIGNED(cp,(U16)(mo));\n\t\t\t\tcp += 2;\n        \n\t\t\t\tml_excess -= 127;\n\t\t\t\tLZB_PutExcessML(cp,ml_excess);\n\t\t\t}\n\t\t}\n\t}\n\telse\n\t{\n\t\tU32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE);\n    \n    // overlap case\n\t\tU32 control = (lrl_in_control) | (LZB_MLCONTROL_ESCAPE<<4);\n\t\t\n\t\t*cp++ = (U8) control;\n\t\t\n\t\tif ( lrl_in_control == LZB_LRL_ESCAPE )\n\t\t{\n\t\t\tU32 lrl_excess = lrl - LZB_LRL_ESCAPE;\n\t\t\tLZB_PutExcessLRL(cp,lrl_excess);\n\t\t}\n\t\t\n\t\tlz_copysteptoend_overrunok(cp,literals,lrl);\n\t\t//cp += lrl;\n\t\t\n\t\t// special excess1 :\n\t\tUINTr excess1 = 128 + (ml_in_control<<3) + mo;\n\t\tRR_ASSERT( excess1 < 256 );\n\t\t\n\t\t*cp++ = (U8)excess1;\n\t\t\n\t\tif ( ml_in_control == LZB_MLCONTROL_ESCAPE )\n\t\t{\n\t\t\tU32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE;\n\t\t\tLZB_PutExcessML(cp,ml_excess);\n\t\t}\t\t\n\t}\n\t\n\treturn cp;\n}\n\n#if LZB_FORCELASTLRL9\n\nstatic RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals )\n{\n\tRR_ASSERT( lrl >= 0 );\n\t\n\t//U32 ml = 0;\n\t//U32 mo = 0;\n  \n\tU32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE);\n\t\n#if LZB_END_WITH_LITERALS\n\t// lrl_in_control must be at least 9\n\tlrl_in_control = RR_MAX(lrl_in_control,9);\n#endif\n\t\n\tU32 control = lrl_in_control;\n  \n\t*cp++ = (U8) control;\n\t\n\tif ( lrl_in_control == LZB_LRL_ESCAPE )\n\t{\n\t\tU32 lrl_excess = lrl - LZB_LRL_ESCAPE;\n\t\tLZB_PutExcessLRL(cp,lrl_excess);\n\t}\n\t\n\tmemmove(cp,literals,lrl);\n\tcp += lrl;\n\t\n\treturn cp;\n}\n\n#else\n\nstatic RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals )\n{\n\tcp = LZB_Output(cp,lrl,literals,LZB_MML,1);\n\t\n\t// remove the offset we put :\n\tcp -= 2;\n\t\n\treturn cp;\n}\n\n#endif\n\n//===============================================================\n\nstatic void rr_lzb_simple_context_init(rr_lzb_simple_context * ctx) //, const void * base)\n{\n\tRR_ASSERT( ctx->m_tableSizeBits >= 12 && ctx->m_tableSizeBits <= 24 );\n\tmemset(ctx->m_hashTable,0,sizeof(U16)*((SINTa)1<<ctx->m_tableSizeBits));\n}\n\n//===============================================================\n\n/*     \n#define FAST_HASH_DEPTH_SHIFT   (1) // more depth = more & more compression,\n#define DO_FAST_2ND_HASH    //  rate= 30.69 mb/s , 15451369 <- turning this off is the best way to get more speed and less compression\n/*/\n#define FAST_HASH_DEPTH_SHIFT   (0)\n#define DO_FAST_2ND_HASH\n/**/\n\n//     lzt99,  24700820,  15475520,  16677179\n//encode only      : 0.880 seconds, 1.62 b/hc, rate= 28.08 mb/s\n\n//#define FAST_HASH_DEPTH_SHIFT   (1) // more depth = more & more compression, but slower\n\n#define DO_FAST_UPDATE_MATCH_HASHES 1 // helps compression a lot , like 0.30\n//#define DO_FAST_UPDATE_MATCH_HASHES 2 // helps compression a lot , like 0.30\n#define DO_FAST_LAZY_MATCH  // also helps a lot , like 0.15\n#define DO_FAST_HASH_DWORD\t\t1\n\n#define FAST_MULTISTEP_LITERALS_SHIFT\t(5)\n\n\n//-----------------------\n// derived :\n\n/*\n#define FAST_HASH_BITS          (FAST_HASH_TOTAL_BITS-FAST_HASH_DEPTH_SHIFT)\n#define FAST_HASH_SIZE          (1<<FAST_HASH_BITS)\n#define FAST_HASH_MASK          (FAST_HASH_SIZE-1)\n*/\n\n#undef FAST_HASH_DEPTH\n#define FAST_HASH_DEPTH         (1<<FAST_HASH_DEPTH_SHIFT)\n\n/*\n#if FAST_HASH_DEPTH == 1\n#error nope\n#endif\n*/\n\n#undef FAST_HASH_CYCLE_MASK\n#define FAST_HASH_CYCLE_MASK    (FAST_HASH_DEPTH-1)\n\n#undef FAST_HASH_INDEX\n#if FAST_HASH_DEPTH > 1\n#define FAST_HASH_INDEX(h,d)    ( ((h)<<FAST_HASH_DEPTH_SHIFT) + (d) )\n#else\n#define FAST_HASH_INDEX(h,d)    (h)\n#endif\n\n#undef FAST_HASH_FUNC\n#define FAST_HASH_FUNC(ptr,dword)\t( LZB_Hash4(dword) & hash_table_mask )\n\n\n\nstatic SINTa rr_lzb_simple_encode_fast_sub(rr_lzb_simple_context * fh,\n                                           const void * raw, SINTa rawLen, void * comp)\n{\n\t//SIMPLEPROFILE_SCOPE_N(lzbfast_sub,rawLen);\n\t//THREADPROFILEFUNC();\n\t\n\tU8 * cp = (U8 *)comp;\n\tU8 * compExpandedPtr = cp + rawLen - 8;\n  \n\tconst U8 * rp = (const U8 *)raw;\n\tconst U8 * rpEnd = rp+rawLen;\n  \n\tconst U8 * rpMatchEnd = rpEnd - LZB_END_OF_BLOCK_NO_MATCH_ZONE;\n\t\n\tconst U8 * rpEndSafe = rpMatchEnd - LZB_MML;\n\t\n\tif ( rpEndSafe <= (U8 *)raw )\n\t{\n\t\t// can't compress\n\t\treturn rawLen+1;\n\t}\n\t\n\tconst U8 * literals_start = rp;\n  \n#if FAST_HASH_DEPTH > 1\n\tint hashCycle = 0;\n#endif\n  \n\tU16 * hashTable16 = fh->m_hashTable;\n\t\n\tint hashTableSizeBits = fh->m_tableSizeBits;\n\tU32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits - FAST_HASH_DEPTH_SHIFT)) - 1);\n\t\n\tconst U8 * zeroPosPtr = (const U8 *)raw;\n  \n\t// first byte is always a literal\n\trp++;\n\t\n\tfor(;;)\n\t{\t\n\t\tS32 matchOff;\n    \n\t\tUINTr failedMatches = (1<<FAST_MULTISTEP_LITERALS_SHIFT) + 3;\n\t\t\n\t\tU32 rp32 = read32(rp);\n\t\tU32 hash = FAST_HASH_FUNC(rp, rp32 );\n\t\tSINTa curpos;\n\t\tconst U8 * hashrp;\n    \n#ifdef DO_FAST_2ND_HASH\n\t\tU32 hash2;\n#endif\n    \n\t\t// literals :\n\t\tfor(;;)\t\t\n\t\t{    \t\t\t\t\n\t\t\tcurpos = rrPtrDiff(rp - zeroPosPtr);\t\n\t\t\tRR_ASSERT( curpos >= 0 );\n\t\t\t\n#ifdef DO_FAST_2ND_HASH\n\t\t\thash2 = ( LZB_SecondHash4(rp32) ) & hash_table_mask;\n#endif\n      \n#if FAST_HASH_DEPTH > 1\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\n#endif\n\t\t\t{\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(hash,d) ];\n\t\t\t\t\n\t\t\t\tmatchOff = (U16)(curpos - hashpos16);\n\t\t\t\tRR_ASSERT( matchOff >= 0 );\n\t\t\t\t\n\t\t\t\thashrp = rp - matchOff;\n        \n\t\t\t\t//if ( matchOff <= LZB_MAX_OFFSET )\n\t\t\t\tRR_ASSERT( matchOff <= LZB_MAX_OFFSET );\n\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\tconst U32 hashrp32 = read32(hashrp);\n          \n\t\t\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tgoto found_match;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n      \n#ifdef DO_FAST_2ND_HASH\n      \n#if FAST_HASH_DEPTH > 1\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\n#endif\n\t\t\t{\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(hash2,d) ];\n\t\t\t\t\n\t\t\t\tmatchOff = (U16)(curpos - hashpos16);\n\t\t\t\tRR_ASSERT( matchOff >= 0 );\n\t\t\t\t\n\t\t\t\thashrp = rp - matchOff;\n        \n\t\t\t\tRR_ASSERT( matchOff <= LZB_MAX_OFFSET );\n\t\t\t\t{\t\t\t\t\t\t\t\n\t\t\t\t\tconst U32 hashrp32 = read32(hashrp);\n          \n\t\t\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tgoto found_match;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} \n\t\t\t\n#endif\n      \n\t\t\t//---------------------------\n\t\t\t// update hash :\n      \n\t\t\thashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos;\n      \n#ifdef DO_FAST_2ND_HASH\n\t\t\t// do NOT step hashCycle !\n\t\t\t//hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\n\t\t\thashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos;\n#endif\n\t\t\t\n#if FAST_HASH_DEPTH > 1\n\t\t\thashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\n#endif\n      \n\t\t\tUINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT);\n\t\t\tRR_ASSERT( stepLiterals >= 1 );\n      \n\t\t\t++failedMatches;\n      \n\t\t\trp += stepLiterals;\n      \n\t\t\tif ( rp >= rpEndSafe )\n\t\t\t\tgoto done;\n      \n\t\t\trp32 = read32(rp);\n\t\t\thash = FAST_HASH_FUNC(rp, rp32 );\n      \n\t\t}\n\t\t\n\t\t//-------------------------------\n\t\tfound_match:\n    \n\t\t// found something\n    \n    //-------------------------\n    // update hash now so lazy can see it :\n    \n#if 1 // pretty important to compression\n\t\thashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos;\n    \n#ifdef DO_FAST_2ND_HASH\n\t\t// do NOT step hashCycle !\n\t\t//hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\n\t\thashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos;\n#endif\n\t\t\n#if FAST_HASH_DEPTH > 1\n\t\thashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\n#endif\n#endif\n\t\t\n\t\t//-----------------------------------\n\t\t\n\t\tconst U8 * match_start = rp;\n\t\trp += 4;\n    \n\t\twhile( rp < rpEndSafe )\n\t\t{\n\t\t\tUINTr big1 = readR(rp);\n\t\t\tUINTr big2 = readR(rp-matchOff);\n\t    \n\t\t\tif ( big1 == big2 )\n\t\t\t{\n\t\t\t\trp += RAD_PTRBYTES;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trp += GetNumBytesZeroNeverAllR(big1^big2);  \n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\trp = RR_MIN(rp,rpMatchEnd);\n    \n\t\t//-------------------------------\n    // rp is now at the *end* of the match\n    \n\t\t//-------------------------------\n\t\t\n\t\t// check lazy match too\n#ifdef DO_FAST_LAZY_MATCH\n\t\tif (rp< rpEndSafe)\n\t\t{\n\t\t\tconst U8 * lazyrp = match_start + 1;\n\t\t\t//SINTa lazypos = rrPtrDiff(lazyrp - zeroPosPtr);\n\t\t\tSINTa lazypos = curpos + 1;\n\t\t\tRR_ASSERT( lazypos == rrPtrDiff(lazyrp - zeroPosPtr) );\n      \n\t\t\tU32 lazyrp32 = read32(lazyrp);\n      \n\t\t\tconst U8 * lazyhashrp;\t\n\t\t\tSINTa lazymatchOff;\t\t\t\t\t\n\t\t\t\n\t\t\tU32 lazyHash = FAST_HASH_FUNC(lazyrp, lazyrp32 );\n\t\t\t\n#ifdef DO_FAST_2ND_HASH\n\t\t\tU32 lazyhash2 = LZB_SecondHash4(lazyrp32) & hash_table_mask;\n#endif\n\t\t\t\n#if FAST_HASH_DEPTH > 1\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\n#endif\n\t\t\t{\t\t\t\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(lazyHash,d) ];\n\t\t\t\t\n\t\t\t\tlazymatchOff = (U16)(lazypos - hashpos16);\n\t\t\t\tRR_ASSERT( lazymatchOff >= 0 );\n\t\t\t\t\n\t\t\t\tRR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET );\n\t\t\t\t{\n\t\t\t\t\tlazyhashrp = lazyrp - lazymatchOff;\n          \n\t\t\t\t\tconst U32 hashrp32 = read32(lazyhashrp);\n          \n\t\t\t\t\tif ( lazyrp32 == hashrp32 && lazymatchOff != 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tgoto lazy_found_match;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n      \n#ifdef DO_FAST_2ND_HASH\n#if FAST_HASH_DEPTH > 1\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\n#endif\n\t\t\t{\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(lazyhash2,d) ];\n\t\t\t\t\n\t\t\t\tlazymatchOff = (U16)(lazypos - hashpos16);\n\t\t\t\tRR_ASSERT( lazymatchOff >= 0 );\n\t\t\t\t\n\t\t\t\tRR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET );\n\t\t\t\t{\n\t\t\t\t\tlazyhashrp = lazyrp - lazymatchOff;\n          \n\t\t\t\t\tconst U32 hashrp32 = read32(lazyhashrp);\n          \n\t\t\t\t\tif ( lazyrp32 == hashrp32 && lazymatchOff != 0 )\n\t\t\t\t\t{\n\t\t\t\t\t\tgoto lazy_found_match;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}  \n#endif\n\t\t\t\n\t\t\tif ( 0 )\n\t\t\t{\n\t\t\t\tlazy_found_match:\n        \n\t\t\t\tlazyrp += 4;\n        \n\t\t\t\twhile( lazyrp < rpEndSafe )\n\t\t\t\t{\n\t\t\t\t\tUINTr big1 = readR(lazyrp);\n\t\t\t\t\tUINTr big2 = readR(lazyrp-lazymatchOff);\n\t\t\t    \n\t\t\t\t\tif ( big1 == big2 )\n\t\t\t\t\t{\n\t\t\t\t\t\tlazyrp += RAD_PTRBYTES;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tlazyrp += GetNumBytesZeroNeverAllR(big1^big2);  \n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlazyrp = RR_MIN(lazyrp,rpMatchEnd);\n\t\t\t\t\n\t\t\t\t//S32 lazymatchLen = rrPtrDiff32( lazyrp - (match_start+1) );\n\t\t\t\t//RR_ASSERT( lazymatchLen >= 4 );\n        \n\t\t\t\tif ( lazyrp >= rp+3 )\n\t\t\t\t{\n\t\t\t\t\t// yes take the lazy match\n\t\t\t\t\t\n\t\t\t\t\t// put a literal :\n\t\t\t\t\tmatch_start++;\n          \n\t\t\t\t\t// I had a bug where lazypos was set wrong for the hash fill\n\t\t\t\t\t// it set it to the *end* of the normal match\n\t\t\t\t\t// and for some reason that helped compression WTF WTF\t\t\t\t\t\t              \n\t\t\t\t\t//SINTa lazypos = rrPtrDiff(rp - zeroPosPtr); // 233647528\n\t\t\t\t\t// with correct lazypos : 233651228\t\n\t\t\t\t\t\n\t\t\t\t\t// really this shouldn't be necessary at all\n\t\t\t\t\t// because I do an update of hash at all positions in the match including first!\n#if 1\t // with update disabled - 233690274\t\t\t    \n          \n\t\t\t\t\thashTable16[ FAST_HASH_INDEX(lazyHash,hashCycle) ] = (U16) lazypos;\n          \n#ifdef DO_FAST_2ND_HASH\n\t\t\t\t\t// do NOT step hashCycle !\n\t\t\t\t\thashTable16[ FAST_HASH_INDEX(lazyhash2,hashCycle) ] = (U16) lazypos;\n#endif\n\t\t\t\t\t\n#if FAST_HASH_DEPTH > 1\n\t\t\t\t\thashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\n#endif\n\t\t\t\t\t\n#endif\n\t\t\t\t\t\n\t\t\t\t\t// and then drop out and do the lazy match :\n\t\t\t\t\t//matchLen = lazymatchLen;\n\t\t\t\t\tmatchOff = (S32)lazymatchOff;\n\t\t\t\t\trp = lazyrp;\n\t\t\t\t\thashrp = lazyhashrp;\n\t\t\t\t}\t\n\t\t\t}\n\t\t}\n#endif\t\t\t  \n\t\t\n\t\t//---------------------------------------------------\n    \n\t\t// back up start of match that we missed due to stepLiterals !\n\t\t// make sure we don't read off the start of the array\n\t\t\n\t\t// this costs a little speed and gains a little compression\n\t\t// 15662162 at 121.58 mb/s\n\t\t// 15776473 at 127.92 mb/s\n#if 1\n\t\t/*\n\t\tlzbf : 24,700,820 ->15,963,503 =  5.170 bpb =  1.547 to 1\n\t\tencode           : 0.171 seconds, 83.60 b/kc, rate= 144.54 M/s\n\t\tdecode           : 0.014 seconds, 1002.64 b/kc, rate= 1733.57 M/s\n\t\t*/\n\t\t{\n\t\t\t// 144 M/s\n\t\t\t// back up start of match that we missed\n\t\t\t// make sure we don't read off the start of the array\n\t\t\t\n\t\t\tconst U8 * rpm1 = match_start-1;\n\t\t\tif ( rpm1 >= literals_start && hashrp > zeroPosPtr && rpm1[0] == hashrp[-1] )\n\t\t\t{\n\t\t\t\trpm1--; hashrp-= 2;\n\t\t\t\t\n\t\t\t\twhile ( rpm1 >= literals_start && hashrp >= zeroPosPtr && rpm1[0] == *hashrp )\n\t\t\t\t{\n\t\t\t\t\trpm1--;\n\t\t\t\t\thashrp--;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tmatch_start = rpm1+1;\n\t\t\t\t//rp = RR_MAX(rp,literals_start);\n\t\t\t\tRR_ASSERT( match_start >= literals_start );\n\t\t\t}\n\t\t}\n#endif\n\t\t\n\t\tS32 matchLen = rrPtrDiff32( rp - match_start );\n\t\tRR_ASSERT( matchLen >= 4 );\n    \n\t\t//===============================================\n\t\t// chose a match\n\t\t//\toutput LRL (if any) and match\n\t\t\n\t\tS32 cur_lrl = rrPtrDiff32(match_start - literals_start);\n    \n\t\t// catch expansion while writing :\n\t\tif_unlikely ( cp+cur_lrl >= compExpandedPtr )\n\t\t{\n\t\t\treturn rawLen+1;\n\t\t}\n    \n\t\tcp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff);\n    \n\t\t// skip the match :\n\t\tliterals_start = rp;\t\t\n\t\t\n\t\tif ( rp >= rpEndSafe )\n\t\t\tbreak;\n\t\t\n\t\t// step & update hashes :\n\t\t//  (I already did cur pos)\n#ifdef DO_FAST_UPDATE_MATCH_HASHES\n\t\t// don't bother if it takes us to the end :      \n\t\t//\t(this check is not for speed it's to avoid the access violation)          \n\t\tconst U8 * ptr = match_start+1;\n\t\tU16 pos16 = (U16) rrPtrDiff( ptr - zeroPosPtr );\n\t\tfor(;ptr<rp;ptr++)\n\t\t{\n\t\t\tU32 hash_result = FAST_HASH_FUNC( ptr, read32(ptr) );\n\t\t\thashTable16[ FAST_HASH_INDEX(hash_result,hashCycle) ] = pos16; pos16++;\n\t\t\t//hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\n\t\t\t// helps a bit to NOT step cycle here\n\t\t\t//  the hash entries that come inside a match are of much lower quality\n\t\t}\n#endif\n\t}\n  \n\tdone:;\n\t\n\tint cur_lrl = rrPtrDiff32(rpEnd - literals_start);\n#if LZB_END_WITH_LITERALS\n\tRR_ASSERT_ALWAYS(cur_lrl > 0 );\n#endif\n  \n\tif ( cur_lrl > 0 )\n\t{\n\t\t// catch expansion while writing :\n\t\tif ( cp+cur_lrl >= compExpandedPtr )\n\t\t{\n\t\t\treturn rawLen+1;\n\t\t}\n\t\t\n\t\tcp = LZB_OutputLast(cp,cur_lrl,literals_start);\n\t}\n  \n\tSINTa compLen = rrPtrDiff( cp - (U8 *)comp );\n  \n\treturn compLen;\n}\n\nSINTa rr_lzb_simple_encode_fast(rr_lzb_simple_context * fh,\n                                const void * raw, SINTa rawLen, void * comp)\n{\n\trr_lzb_simple_context_init(fh); //,raw);\n  \n\tSINTa comp_len = rr_lzb_simple_encode_fast_sub(fh,raw,rawLen,comp);\n\tif ( comp_len >= rawLen )\n\t{\n\t\tmemcpy(comp,raw,rawLen);\n\t\treturn rawLen;\n\t}\n\treturn comp_len;\n}\n\n#undef FAST_HASH_DEPTH_SHIFT\n\n#undef DO_FAST_UPDATE_MATCH_HASHES\n#undef DO_FAST_LAZY_MATCH\n#undef DO_FAST_2ND_HASH  \n\n//=====================================================\n\n#define FAST_HASH_DEPTH_SHIFT\t(0)\n\n#undef FAST_MULTISTEP_LITERALS_SHIFT\n#define FAST_MULTISTEP_LITERALS_SHIFT\t(4)\n\n\n\n//-----------------------\n// derived :\n\nRR_COMPILER_ASSERT( FAST_HASH_DEPTH_SHIFT == 0 );\n\n#undef FAST_HASH_FUNC\n//#define FAST_HASH_FUNC(ptr,dword)\t( LZB_Hash4(dword) & hash_table_mask )\n#define FAST_HASH_FUNC(ptr,dword)\t( (((dword)*2654435761U)>>16) & hash_table_mask )\n\n\n// @@@@ ????\n#define LZBVF_DO_BACKUP\t0\n//#define LZBVF_DO_BACKUP\t1\n\n\nstatic SINTa rr_lzb_simple_encode_veryfast_sub(rr_lzb_simple_context * fh,\n                                               const void * raw, SINTa rawLen, void * comp)\n{\n\t//SIMPLEPROFILE_SCOPE_N(lzbfast_sub,rawLen);\n\t//THREADPROFILEFUNC();\n\t\n\tU8 * cp = (U8 *)comp;\n\tU8 * compExpandedPtr = cp + rawLen - 8;\n  \n\tconst U8 * rp = (const U8 *)raw;\n\tconst U8 * rpEnd = rp+rawLen;\n  \n\t// we can match up to rpEnd\n\t//\tbut matches can't start past rpEndSafe\n\tconst U8 * rpMatchEnd = rpEnd - LZB_END_OF_BLOCK_NO_MATCH_ZONE;\n\t\n\tconst U8 * rpEndSafe = rpMatchEnd - LZB_MML;\n\t\n\tif ( rpEndSafe <= (U8 *)raw )\n\t{\n\t\t// can't compress\n\t\treturn rawLen+1;\n\t}\n\t\n\tconst U8 * literals_start = rp;\n  \n\tU16 * hashTable16 = fh->m_hashTable;\n\tint hashTableSizeBits = fh->m_tableSizeBits;\n\tU32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits)) - 1);\n  \n\tconst U8 * zeroPosPtr = (const U8 *)raw;\n  \n\t// first byte is always a literal\n\trp++;\n\t\n\tfor(;;)\n\t{   \t\t\n\t\tU32 rp32 = read32(rp);\n\t\tU32 hash = FAST_HASH_FUNC(rp, rp32 );\n\t\tconst U8 * hashrp;\n\t\tS32 matchOff;\n\t\tUINTr failedMatches;\n    \n\t\t// loop while no match found :\n\t\t\n\t\t// first loop with step = 1\n\t\t// @@\n\t\t//int step1count = (1<<FAST_MULTISTEP_LITERALS_SHIFT); // full count\n\t\tint step1count = (1<<(FAST_MULTISTEP_LITERALS_SHIFT-1)); // half count\n\t\twhile(step1count--)\n\t\t{\t\t\t    \t\t\t\t\t\n\t\t\tSINTa curpos = rrPtrDiff(rp - zeroPosPtr);\t\n\t\t\tRR_ASSERT( curpos >= 0 );\n\t\t\t\n\t\t\tU16 hashpos16 = hashTable16[hash];\n\t\t\thashTable16[ hash ] = (U16) curpos;\n\t\t\t\n\t\t\tmatchOff = (U16)(curpos - hashpos16);\n\t\t\tRR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET );\n\t\t\thashrp = rp - matchOff;\n      \n\t\t\tconst U32 hashrp32 = read32(hashrp);\n\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\n\t\t\t{\n\t\t\t\tgoto found_match;\n\t\t\t}\n      \n\t\t\tif ( ++rp >= rpEndSafe )\n\t\t\t\tgoto done;\n      \n\t\t\trp32 = read32(rp);\n\t\t\thash = FAST_HASH_FUNC(rp, rp32 );\n\t\t}\n\t\t\n\t\t// step starts at 2 :\n\t\tfailedMatches = (2<<FAST_MULTISTEP_LITERALS_SHIFT);\n    \n\t\tfor(;;)\t\t\n\t\t{\t\t\t    \t\t\n\t\t\tSINTa curpos = rrPtrDiff(rp - zeroPosPtr);\t\n\t\t\tRR_ASSERT( curpos >= 0 );\n\t\t\t\n\t\t\tU16 hashpos16 = hashTable16[hash];\n\t\t\thashTable16[ hash ] = (U16) curpos;\n      \n\t\t\tmatchOff = (U16)(curpos - hashpos16);\n\t\t\tRR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET );\n\t\t\thashrp = rp - matchOff;\n      \n\t\t\tconst U32 hashrp32 = read32(hashrp);\n      \n\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\n\t\t\t{\n\t\t\t\tgoto found_match;\n\t\t\t}\n      \n\t\t\tUINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT);\n\t\t\tRR_ASSERT( stepLiterals >= 1 );\n      \n\t\t\t++failedMatches;\n      \n\t\t\trp += stepLiterals;\n      \n\t\t\tif ( rp >= rpEndSafe )\n\t\t\t\tgoto done;\n      \n\t\t\trp32 = read32(rp);\n\t\t\thash = FAST_HASH_FUNC(rp, rp32 );\n\t\t}\n\t\t\n\t\t//-------------------------------\n\t\tfound_match:;\n    \n\t\t// found something\n    \n#if LZBVF_DO_BACKUP\n\t\t\n\t\t// alternative backup using counter :\n\t\tS32 cur_lrl = rrPtrDiff32(rp - literals_start);\n\t\tint neg_max_backup = - RR_MIN(cur_lrl , rrPtrDiff32(hashrp - zeroPosPtr) );\n\t\tint neg_backup = -1;\n\t\tif( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] )\n\t\t{\n\t\t\tneg_backup--;\n\t\t\twhile( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] )\n\t\t\t{\n\t\t\t\tneg_backup--;\n\t\t\t}\n\t\t\tneg_backup++;\n\t\t\trp += neg_backup;\n\t\t\tcur_lrl += neg_backup;\n\t\t\tRR_ASSERT( cur_lrl >= 0 );\n\t\t\tRR_ASSERT( cur_lrl == rrPtrDiff32(rp - literals_start) );\n\t\t}\n\t\t\n#else\n\t\t\n\t\tS32 cur_lrl = rrPtrDiff32(rp - literals_start);\n\t\t\n#endif\n    \n\t\t// catch expansion while writing :\n\t\tif_unlikely ( cp+cur_lrl >= compExpandedPtr )\n\t\t{\n\t\t\treturn rawLen+1;\n\t\t}\n\t\t\n\t\tRR_ASSERT( matchOff >= 1 );\n    \n\t\t//---------------------------------------\n\t\t// find rest of match len\n\t\t// save pointer to start of match\n\t\t// walk rp ahead to end of match\n\t\tconst U8 * match_start = rp;\n\t\trp += 4;\n    \n\t\twhile( rp < rpEndSafe )\n\t\t{\n\t\t\tUINTr big1 = readR(rp);\n\t\t\tUINTr big2 = readR(rp-matchOff);\n\t    \n\t\t\tif ( big1 == big2 )\n\t\t\t{\n\t\t\t\trp += RAD_PTRBYTES;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\trp += GetNumBytesZeroNeverAllR(big1^big2);  \n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\trp = RR_MIN(rp,rpMatchEnd);\n\t\tS32 matchLen = rrPtrDiff32( rp - match_start );\n\t\t\n\t\t//===============================================\n\t\t// chose a match\n\t\t//\toutput LRL (if any) and match\n\t\t\n\t\tcp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff);\n    \n\t\t// skip the match :\n\t\tliterals_start = rp;\n\t\t\n\t\tif ( rp >= rpEndSafe )\n\t\t\tgoto done;\t\n\t}\n\t\n\tdone:;\n\t\n\tint cur_lrl = rrPtrDiff32(rpEnd - literals_start);\n#if LZB_END_WITH_LITERALS\n\tRR_ASSERT_ALWAYS(cur_lrl > 0 );\n#endif\n  \n\tif ( cur_lrl > 0 )\n\t{\n\t\t// catch expansion while writing :\n\t\tif ( cp+cur_lrl >= compExpandedPtr )\n\t\t{\n\t\t\treturn rawLen+1;\n\t\t}\n\t\t\n\t\tcp = LZB_OutputLast(cp,cur_lrl,literals_start);\n\t}\n  \n\tSINTa compLen = rrPtrDiff( cp - (U8 *)comp );\n  \n\treturn compLen;\n}\n\nSINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * fh,\n                                    const void * raw, SINTa rawLen, void * comp)\n{\n\trr_lzb_simple_context_init(fh); //,raw);\n\t\n\tSINTa comp_len = rr_lzb_simple_encode_veryfast_sub(fh,raw,rawLen,comp);\n\tif ( comp_len >= rawLen )\n\t{\n\t\tmemcpy(comp,raw,rawLen);\n\t\treturn rawLen;\n\t}\n\treturn comp_len;\n}\n\n#undef FAST_HASH_DEPTH_SHIFT\n\n#undef DO_FAST_UPDATE_MATCH_HASHES\n#undef DO_FAST_LAZY_MATCH\n#undef DO_FAST_2ND_HASH  \n\n//=====================================================\n// vim:noet:sw=4:ts=4\n"
  },
  {
    "path": "src/lib_rdi/rdi_parse.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////////////////////////////////////\n//~ (R)AD (D)ebug (I)nfo Format Parsing Library\n//\n// Defines helper types and functions for extracting data from\n// RDI files.\n\n////////////////////////////////////////////////////////////////\n//~ Usage Samples\n//\n#if 0\n// Procedure Name -> Line\n{\n  RDI_Parsed *rdi = ...;\n  char *name = \"mule_main\";\n  RDI_Procedure *procedure = rdi_procedure_from_name_cstr(rdi, name);                  // 1. name -> procedure\n  RDI_U64 procedure_first_voff = rdi_first_voff_from_procedure(rdi, procedure);        // 2. procedure -> virtual offset\n  RDI_Line line = rdi_line_from_voff(rdi, procedure_first_voff);                       // 3. virtual offset -> line\n  RDI_SourceFile *file = rdi_source_file_from_line(rdi, &line);                        // 4. line -> source file\n  RDI_U64 file_path_size = 0;                                                          // 5. source file -> path\n  RDI_U8 *file_path = rdi_normal_path_from_source_file(rdi, file, &file_path_size);\n  printf(\"%s is at %.*s:%u\\n\", name, (int)file_path_size, file_path, line.line_num);\n}\n\n// Line -> Procedure Name\n{\n  RDI_Parsed *rdi = ...;\n  char *path = \"c:/devel/raddebugger/src/mule/mule_main.cpp\";\n  RDI_U32 line_num = 2557;\n  RDI_SourceFile *file = rdi_source_file_from_normal_path_cstr(rdi, path);      // 1. path -> source file\n  RDI_U64 voff = rdi_first_voff_from_source_file_line_num(rdi, file, line_num); // 2. (source file, line) -> virtual offset\n  RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);                // 3. virtual offset -> procedure\n  RDI_U64 name_size = 0;                                                        // 4. procedure -> name\n  RDI_U8 *name = rdi_name_from_procedure(rdi, procedure, &name_size);\n  printf(\"%s:%u is inside %.*s\\n\", path, line_num, (int)name_size, name);\n}\n#endif\n\n#ifndef RDI_PARSE_H\n#define RDI_PARSE_H\n\n////////////////////////////////////////////////////////////////\n//~ Parsed Information Types\n\ntypedef enum RDI_ParseStatus\n{\n  RDI_ParseStatus_Good = 0,\n  RDI_ParseStatus_HeaderDoesNotMatch = 1,\n  RDI_ParseStatus_UnsupportedVersionNumber = 2,\n  RDI_ParseStatus_InvalidDataSecionLayout = 3,\n}\nRDI_ParseStatus;\n\ntypedef struct RDI_Parsed RDI_Parsed;\nstruct RDI_Parsed\n{\n  RDI_U8 *raw_data;\n  RDI_U64 raw_data_size;\n  RDI_Section *sections;\n  RDI_U64 sections_count;\n};\n\ntypedef struct RDI_ParsedLineTable RDI_ParsedLineTable;\nstruct RDI_ParsedLineTable\n{\n  // NOTE: Mapping VOFF -> LINE_INFO\n  //\n  // * [ voff[i], voff[i + 1] ) forms the voff range\n  // * for the line info at lines[i] (and cols[i] if i < col_count)\n  RDI_U64*    voffs; // [count + 1] sorted\n  RDI_Line*   lines; // [count]\n  RDI_Column* cols;  // [col_count]\n  RDI_U64 count;\n  RDI_U64 col_count;\n};\n\ntypedef struct RDI_ParsedSourceLineMap RDI_ParsedSourceLineMap;\nstruct RDI_ParsedSourceLineMap\n{\n  // NOTE: Mapping LINE_NUMBER -> VOFFs\n  //\n  // * nums[i] gives a line number\n  // * that line number has one or more associated voffs\n  //\n  // * to find all associated voffs for the line number nums[i] :\n  // * let k span over the range [ ranges[i], ranges[i + 1] )\n  // * voffs[k] gives the associated voffs\n  RDI_U32* nums;   // [count] sorted\n  RDI_U32* ranges; // [count + 1]\n  RDI_U64* voffs;  // [voff_count]\n  RDI_U64 count;\n  RDI_U64 voff_count;\n};\n\ntypedef struct RDI_ParsedNameMap RDI_ParsedNameMap;\nstruct RDI_ParsedNameMap\n{\n  RDI_NameMapBucket *buckets;\n  RDI_NameMapNode *nodes;\n  RDI_U64 bucket_count;\n  RDI_U64 node_count;\n};\n\n////////////////////////////////\n//~ Global Nils\n\nstatic union\n{\n  RDI_TopLevelInfo top_level_info;\n  RDI_BinarySection binary_section;\n  RDI_FilePathNode file_path_node;\n  RDI_SourceFile source_file;\n  RDI_LineTable line_table;\n  RDI_SourceLineMap source_line_map;\n  RDI_Line line;\n  RDI_Column column;\n  RDI_Unit unit;\n  RDI_VMapEntry vmap_entry;\n  RDI_TypeNode type_node;\n  RDI_UDT udt;\n  RDI_Member member;\n  RDI_EnumMember enum_member;\n  RDI_GlobalVariable global_variable;\n  RDI_ThreadVariable thread_variable;\n  RDI_Procedure procedure;\n  RDI_Scope scope;\n  RDI_U64 voff;\n  RDI_LocationBlock location_block;\n  RDI_Local local;\n}\nrdi_nil_element_union = {0};\nstatic RDI_Parsed rdi_parsed_nil = {0};\n\n////////////////////////////////\n//~ Top-Level Parsing API\n\nRDI_PROC RDI_ParseStatus rdi_parse(RDI_U8 *data, RDI_U64 size, RDI_Parsed *out);\n\n////////////////////////////////\n//~ Base Parsed Info Extraction Helpers\n\n//- section table/element raw data extraction\nRDI_PROC void *rdi_section_raw_data_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_SectionEncoding *encoding_out, RDI_U64 *size_out);\nRDI_PROC void *rdi_section_raw_table_from_kind(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 *count_out);\nRDI_PROC void *rdi_section_raw_element_from_kind_idx(RDI_Parsed *rdi, RDI_SectionKind kind, RDI_U64 idx);\n#define rdi_table_from_name(rdi, name, count_out) ((RDI_SectionElementType_##name *)rdi_section_raw_table_from_kind((rdi), RDI_SectionKind_##name, (count_out)))\n#define rdi_element_from_name_idx(rdi, name, idx) ((RDI_SectionElementType_##name *)rdi_section_raw_element_from_kind_idx((rdi), RDI_SectionKind_##name, (idx)))\n\n//- info about whole parse\nRDI_PROC RDI_U64 rdi_decompressed_size_from_parsed(RDI_Parsed *rdi);\n\n//- decompression\ninternal void rdi_decompress_parsed(U8 *decompressed_data, U64 decompressed_size, RDI_Parsed *og_rdi);\n\n//- strings\nRDI_PROC RDI_U8 *rdi_string_from_idx(RDI_Parsed *rdi, RDI_U32 idx, RDI_U64 *len_out);\n\n//- index runs\nRDI_PROC RDI_U32 *rdi_idx_run_from_first_count(RDI_Parsed *rdi, RDI_U32 raw_first, RDI_U32 raw_count, RDI_U32 *n_out);\n\n//- line info\nRDI_PROC void rdi_parsed_from_line_table(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_ParsedLineTable *out);\nRDI_PROC RDI_U64 rdi_line_info_idx_range_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff, RDI_U64 *n_out);\nRDI_PROC RDI_U64 rdi_line_info_idx_from_voff(RDI_ParsedLineTable *line_info, RDI_U64 voff);\nRDI_PROC void rdi_parsed_from_source_line_map(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_ParsedSourceLineMap *out);\nRDI_PROC RDI_U64 *rdi_line_voffs_from_num(RDI_ParsedSourceLineMap *map, RDI_U32 linenum, RDI_U32 *n_out);\n\n//- vmap lookups\nRDI_PROC RDI_U64 rdi_vmap_idx_from_voff(RDI_VMapEntry *vmap, RDI_U64 vmap_count, RDI_U64 voff);\n\n//- name maps\nRDI_PROC RDI_NameMap *rdi_name_map_from_kind(RDI_Parsed *p, RDI_NameMapKind kind);\nRDI_PROC void rdi_name_map_parse(RDI_Parsed* p, RDI_NameMap *mapptr, RDI_ParsedNameMap *out);\nRDI_PROC RDI_NameMapNode *rdi_name_map_lookup(RDI_Parsed *p, RDI_ParsedNameMap *map, RDI_U8 *str, RDI_U64 len);\nRDI_PROC RDI_U32 *rdi_matches_from_map_node(RDI_Parsed *p, RDI_NameMapNode *node, RDI_U32 *n_out);\n\n////////////////////////////////\n//~ High-Level Composite Lookup Functions\n\n//- procedures\nRDI_PROC RDI_Procedure *rdi_procedure_from_name(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size);\nRDI_PROC RDI_Procedure *rdi_procedure_from_name_cstr(RDI_Parsed *rdi, char *cstr);\nRDI_PROC RDI_U8 *rdi_name_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure, RDI_U64 *len_out);\nRDI_PROC RDI_Scope *rdi_root_scope_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);\nRDI_PROC RDI_UDT *rdi_container_udt_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);\nRDI_PROC RDI_Procedure *rdi_container_procedure_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);\nRDI_PROC RDI_U64 rdi_first_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);\nRDI_PROC RDI_U64 rdi_opl_voff_from_procedure(RDI_Parsed *rdi, RDI_Procedure *procedure);\nRDI_PROC RDI_Procedure *rdi_procedure_from_voff(RDI_Parsed *rdi, RDI_U64 voff);\n\n//- scopes\nRDI_PROC RDI_U64 rdi_first_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope);\nRDI_PROC RDI_U64 rdi_opl_voff_from_scope(RDI_Parsed *rdi, RDI_Scope *scope);\nRDI_PROC RDI_Scope *rdi_scope_from_voff(RDI_Parsed *rdi, RDI_U64 voff);\nRDI_PROC RDI_Scope *rdi_parent_from_scope(RDI_Parsed *rdi, RDI_Scope *scope);\nRDI_PROC RDI_Procedure *rdi_procedure_from_scope(RDI_Parsed *rdi, RDI_Scope *scope);\nRDI_PROC RDI_InlineSite *rdi_inline_site_from_scope(RDI_Parsed *rdi, RDI_Scope *scope);\n\n//- global variables\nRDI_PROC RDI_GlobalVariable *rdi_global_variable_from_voff(RDI_Parsed *rdi, RDI_U64 voff);\n\n//- units\nRDI_PROC RDI_Unit *rdi_unit_from_voff(RDI_Parsed *rdi, RDI_U64 voff);\nRDI_PROC RDI_LineTable *rdi_line_table_from_unit(RDI_Parsed *rdi, RDI_Unit *unit);\n\n//- line tables\nRDI_PROC RDI_Line rdi_line_from_voff(RDI_Parsed *rdi, RDI_U64 voff);\nRDI_PROC RDI_Line rdi_line_from_line_table_voff(RDI_Parsed *rdi, RDI_LineTable *line_table, RDI_U64 voff);\nRDI_PROC RDI_SourceFile *rdi_source_file_from_line(RDI_Parsed *rdi, RDI_Line *line);\n\n//- source files\nRDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path(RDI_Parsed *rdi, RDI_U8 *name, RDI_U64 name_size);\nRDI_PROC RDI_SourceFile *rdi_source_file_from_normal_path_cstr(RDI_Parsed *rdi, char *cstr);\nRDI_PROC RDI_U8 *rdi_normal_path_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U64 *len_out);\nRDI_PROC RDI_FilePathNode *rdi_file_path_node_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file);\nRDI_PROC RDI_SourceLineMap *rdi_source_line_map_from_source_file(RDI_Parsed *rdi, RDI_SourceFile *src_file);\nRDI_PROC RDI_U64 rdi_first_voff_from_source_file_line_num(RDI_Parsed *rdi, RDI_SourceFile *src_file, RDI_U32 line_num);\n\n//- source line maps\nRDI_PROC RDI_U64 rdi_first_voff_from_source_line_map_num(RDI_Parsed *rdi, RDI_SourceLineMap *map, RDI_U32 line_num);\n\n//- file path nodes\nRDI_PROC RDI_FilePathNode *rdi_parent_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node);\nRDI_PROC RDI_U8 *rdi_name_from_file_path_node(RDI_Parsed *rdi, RDI_FilePathNode *node, RDI_U64 *len_out);\n\n////////////////////////////////\n//~ Parser Helpers\n\n#define rdi_parse__min(a,b) (((a)<(b))?(a):(b))\nRDI_PROC RDI_U64 rdi_cstring_length(char *cstr);\nRDI_PROC RDI_U64 rdi_size_from_bytecode_stream(RDI_U8 *ptr, RDI_U8 *opl);\n\n#endif // RDI_FORMAT_PARSE_H\n"
  },
  {
    "path": "src/lib_rdi_make/rdi_make.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: API Implementation Helper Macros\r\n\r\n#define RDIM_IdxedChunkListPush(arena, list, chunk_type, element_type, cap_value, result, ...) \\\r\nelement_type *result = 0;\\\r\ndo\\\r\n{\\\r\nchunk_type *n = list->last;\\\r\nif(n == 0 || n->count >= n->cap)\\\r\n{\\\r\nn = rdim_push_array(arena, chunk_type, 1);\\\r\nn->cap = cap_value;\\\r\nn->base_idx = list->total_count;\\\r\n__VA_ARGS__;\\\r\nn->v = rdim_push_array_no_zero(arena, element_type, n->cap);\\\r\nRDIM_SLLQueuePush(list->first, list->last, n);\\\r\nlist->chunk_count += 1;\\\r\n}\\\r\nresult = &n->v[n->count];\\\r\nresult->chunk = n;\\\r\nn->count += 1;\\\r\nlist->total_count += 1;\\\r\n}while(0)\r\n\r\n#define RDIM_IdxedChunkListElementGetIdx(ptr, result) \\\r\nRDI_U64 idx = 0;\\\r\nif(ptr != 0 && ptr->chunk != 0)\\\r\n{\\\r\nidx = ptr->chunk->base_idx + (ptr - ptr->chunk->v) + 1;\\\r\n}\r\n\r\n#define RDIM_IdxedChunkListConcatInPlace(chunk_type, dst, to_push, ...) \\\r\nfor(chunk_type *n = to_push->first; n != 0; n = n->next)\\\r\n{\\\r\nn->base_idx += dst->total_count;\\\r\n}\\\r\nif(dst->last != 0 && to_push->first != 0)\\\r\n{\\\r\ndst->last->next = to_push->first;\\\r\ndst->last = to_push->last;\\\r\ndst->chunk_count += to_push->chunk_count;\\\r\ndst->total_count += to_push->total_count;\\\r\n__VA_ARGS__;\\\r\n}\\\r\nelse if(dst->first == 0)\\\r\n{\\\r\nrdim_memcpy_struct(dst, to_push);\\\r\n}\\\r\nrdim_memzero_struct(to_push);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\n//- rjf: memory set\r\n\r\n#if !defined(RDIM_MEMSET_OVERRIDE)\r\nRDI_PROC void *\r\nrdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size)\r\n{\r\n  for(RDI_U64 idx = 0; idx < size; idx += 1)\r\n  {\r\n    ((RDI_U8 *)dst)[idx] = c;\r\n  }\r\n  return dst;\r\n}\r\n#endif\r\n\r\n#if !defined(RDIM_MEMCPY_OVERRIDE)\r\nRDI_PROC void *\r\nrdim_memcpy_fallback(void *dst, void *src, RDI_U64 size)\r\n{\r\n  for(RDI_U64 idx = 0; idx < size; idx += 1)\r\n  {\r\n    ((RDI_U8 *)dst)[idx] = ((RDI_U8 *)src)[idx];\r\n  }\r\n  return dst;\r\n}\r\n#endif\r\n\r\n//- rjf: arenas\r\n\r\n#if !defined (RDIM_ARENA_OVERRIDE)\r\n\r\nRDI_PROC RDIM_Arena *\r\nrdim_arena_alloc_fallback(void)\r\n{\r\n  RDIM_Arena *arena = 0;\r\n  // TODO(rjf)\r\n  return arena;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_arena_release_fallback(RDIM_Arena *arena)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_arena_pos_fallback(RDIM_Arena *arena)\r\n{\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\nRDI_PROC void *\r\nrdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 size, RDI_U64 align, RDI_U32 zero)\r\n{\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\n#endif\r\n\r\n//- rjf: thread-local scratch arenas\r\n\r\n#if !defined (RDIM_SCRATCH_OVERRIDE)\r\nstatic RDIM_THREAD_LOCAL RDIM_Arena *rdim_thread_scratches[2];\r\n\r\nRDI_PROC RDIM_Temp\r\nrdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count)\r\n{\r\n  if(rdim_thread_scratches[0] == 0)\r\n  {\r\n    rdim_thread_scratches[0] = rdim_arena_alloc();\r\n    rdim_thread_scratches[1] = rdim_arena_alloc();\r\n  }\r\n  RDIM_Arena *arena = 0;\r\n  for(RDI_U64 scratch_idx = 0;\r\n      scratch_idx < sizeof(rdim_thread_scratches)/sizeof(rdim_thread_scratches[0]);\r\n      scratch_idx += 1)\r\n  {\r\n    RDI_S32 scratch_conflicts = 0;\r\n    for(RDI_U64 conflict_idx = 0; conflict_idx < conflicts_count; conflict_idx += 1)\r\n    {\r\n      if(conflicts[conflict_idx] == rdim_thread_scratches[scratch_idx])\r\n      {\r\n        scratch_conflicts = 1;\r\n        break;\r\n      }\r\n    }\r\n    if(!scratch_conflicts)\r\n    {\r\n      arena = rdim_thread_scratches[scratch_idx];\r\n    }\r\n  }\r\n  RDIM_Temp temp;\r\n  temp.arena = arena;\r\n  temp.pos = rdim_arena_pos(arena);\r\n  return temp;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_scratch_end_fallback(RDIM_Temp temp)\r\n{\r\n  rdim_arena_pop_to(temp.arena, temp.pos);\r\n}\r\n\r\n#endif\r\n\r\n//- rjf: strings\r\n\r\nRDI_PROC RDIM_String8\r\nrdim_str8(RDI_U8 *str, RDI_U64 size)\r\n{\r\n  RDIM_String8 result;\r\n  result.RDIM_String8_BaseMember = str;\r\n  result.RDIM_String8_SizeMember = size;\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDIM_String8\r\nrdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src)\r\n{\r\n  RDIM_String8 dst;\r\n  dst.RDIM_String8_SizeMember = src.RDIM_String8_SizeMember;\r\n  dst.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, dst.RDIM_String8_SizeMember+1);\r\n  rdim_memcpy(dst.RDIM_String8_BaseMember, src.RDIM_String8_BaseMember, src.RDIM_String8_SizeMember);\r\n  dst.RDIM_String8_BaseMember[dst.RDIM_String8_SizeMember] = 0;\r\n  return dst;\r\n}\r\n\r\nRDI_PROC RDIM_String8\r\nrdim_str8f(RDIM_Arena *arena, char *fmt, ...)\r\n{\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  RDIM_String8 result = rdim_str8fv(arena, fmt, args);\r\n  va_end(args);\r\n  return(result);\r\n}\r\n\r\nRDI_PROC RDIM_String8\r\nrdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args)\r\n{\r\n  va_list args2;\r\n  va_copy(args2, args);\r\n  RDI_U32 needed_bytes = rdim_vsnprintf(0, 0, fmt, args) + 1;\r\n  RDIM_String8 result = {0};\r\n  result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, needed_bytes);\r\n  result.RDIM_String8_SizeMember = rdim_vsnprintf((char*)result.str, needed_bytes, fmt, args2);\r\n  result.RDIM_String8_BaseMember[result.RDIM_String8_SizeMember] = 0;\r\n  va_end(args2);\r\n  return(result);\r\n}\r\n\r\nRDI_PROC RDI_S32\r\nrdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags)\r\n{\r\n  RDI_S32 result = 0;\r\n  if(a.RDIM_String8_SizeMember == b.RDIM_String8_SizeMember)\r\n  {\r\n    RDI_S32 case_insensitive = (flags & RDIM_StringMatchFlag_CaseInsensitive);\r\n    RDI_U64 size = a.RDIM_String8_SizeMember;\r\n    result = 1;\r\n    for(RDI_U64 idx = 0; idx < size; idx += 1)\r\n    {\r\n      RDI_U8 at = a.RDIM_String8_BaseMember[idx];\r\n      RDI_U8 bt = b.RDIM_String8_BaseMember[idx];\r\n      if(case_insensitive)\r\n      {\r\n        at = ('a' <= at && at <= 'z') ? at-('a'-'A') : at;\r\n        bt = ('a' <= bt && bt <= 'z') ? bt-('a'-'A') : bt;\r\n      }\r\n      if(at != bt)\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDIM_String8\r\nrdim_lower_from_str8(RDIM_Arena *arena, RDIM_String8 string)\r\n{\r\n  RDIM_String8 result = rdim_str8_copy(arena, string);\r\n  for(RDI_U64 idx = 0; idx < result.RDIM_String8_SizeMember; idx += 1)\r\n  {\r\n    RDI_U8 byte = result.RDIM_String8_BaseMember[idx];\r\n    if('A' <= byte && byte <= 'Z')\r\n    {\r\n      result.RDIM_String8_BaseMember[idx] += ('a' - 'A');\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: string lists\r\n\r\nRDI_PROC void\r\nrdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string)\r\n{\r\n  RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1);\r\n  n->RDIM_String8Node_StringMember = string;\r\n  RDIM_SLLQueuePush_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember);\r\n  list->RDIM_String8List_NodeCountMember += 1;\r\n  list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string)\r\n{\r\n  RDIM_String8Node *n = rdim_push_array(arena, RDIM_String8Node, 1);\r\n  n->RDIM_String8Node_StringMember = string;\r\n  RDIM_SLLQueuePushFront_N(list->RDIM_String8List_FirstMember, list->RDIM_String8List_LastMember, n, RDIM_String8Node_NextPtrMember);\r\n  list->RDIM_String8List_NodeCountMember += 1;\r\n  list->RDIM_String8List_TotalSizeMember += string.RDIM_String8_SizeMember;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align)\r\n{\r\n  RDI_U64 total_size_pre_align  = list->total_size;\r\n  RDI_U64 total_size_post_align = (total_size_pre_align + (align-1))&(~(align-1));\r\n  RDI_U64 needed_size = total_size_post_align - total_size_pre_align;\r\n  if(needed_size != 0)\r\n  {\r\n    RDI_U8 *padding = rdim_push_array(arena, RDI_U8, needed_size);\r\n    rdim_str8_list_push(arena, list, rdim_str8(padding, needed_size));\r\n  }\r\n}\r\n\r\nRDI_PROC RDIM_String8\r\nrdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep)\r\n{\r\n  RDIM_String8 result;\r\n  rdim_memzero_struct(&result);\r\n  RDI_U64 sep_count = (list->RDIM_String8List_NodeCountMember > 1) ? (list->RDIM_String8List_NodeCountMember-1) : 0;\r\n  result.RDIM_String8_SizeMember = list->RDIM_String8List_TotalSizeMember+sep_count*sep.RDIM_String8_SizeMember;\r\n  result.RDIM_String8_BaseMember = rdim_push_array_no_zero(arena, RDI_U8, result.RDIM_String8_SizeMember+1);\r\n  RDI_U64 off = 0;\r\n  for(RDIM_String8Node *node = list->RDIM_String8List_FirstMember;\r\n      node != 0;\r\n      node = node->RDIM_String8Node_NextPtrMember)\r\n  {\r\n    rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off,\r\n                node->RDIM_String8Node_StringMember.RDIM_String8_BaseMember,\r\n                node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember);\r\n    off += node->RDIM_String8Node_StringMember.RDIM_String8_SizeMember;\r\n    if(sep.RDIM_String8_SizeMember != 0 && node->RDIM_String8Node_NextPtrMember != 0)\r\n    {\r\n      rdim_memcpy((RDI_U8*)result.RDIM_String8_BaseMember+off,\r\n                  sep.RDIM_String8_BaseMember,\r\n                  sep.RDIM_String8_SizeMember);\r\n      off += sep.RDIM_String8_SizeMember;\r\n    }\r\n  }\r\n  result.RDIM_String8_BaseMember[off] = 0;\r\n  return result;\r\n}\r\n\r\n//- rjf: sortable range sorting\r\n\r\nRDI_PROC RSFORCEINLINE int\r\nrdim_sort_key_is_before(void *l, void *r)\r\n{\r\n  return ((RDIM_SortKey *)l)->key < ((RDIM_SortKey *)r)->key;\r\n}\r\n\r\nRDI_PROC RDIM_SortKey *\r\nrdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count)\r\n{\r\n  // This sort is designed to take advantage of lots of pre-existing sorted ranges.\r\n  // Most line info is already sorted or close to already sorted.\r\n  // Similarly most vmap data has lots of pre-sorted ranges. etc. etc.\r\n  // Also - this sort should be a \"stable\" sort. In the use case of sorting vmap\r\n  // ranges, we want to be able to rely on order, so it needs to be preserved here.\r\n  \r\n  RDIM_Temp scratch = rdim_scratch_begin(&arena, 1);\r\n  RDIM_SortKey *result = 0;\r\n  \r\n  if(count <= 1)\r\n  {\r\n    result = keys;\r\n  }\r\n  else\r\n  {\r\n    RDIM_OrderedRange *ranges_first = 0;\r\n    RDIM_OrderedRange *ranges_last = 0;\r\n    RDI_U64 range_count = 0;\r\n    {\r\n      RDI_U64 pos = 0;\r\n      for(;pos < count;)\r\n      {\r\n        // identify ordered range\r\n        RDI_U64 first = pos;\r\n        RDI_U64 opl = pos + 1;\r\n        for(; opl < count && keys[opl - 1].key <= keys[opl].key; opl += 1);\r\n        \r\n        // generate an ordered range node\r\n        RDIM_OrderedRange *new_range = rdim_push_array(rdim_temp_arena(scratch), RDIM_OrderedRange, 1);\r\n        RDIM_SLLQueuePush(ranges_first, ranges_last, new_range);\r\n        range_count += 1;\r\n        new_range->first = first;\r\n        new_range->opl = opl;\r\n        \r\n        // update pos\r\n        pos = opl;\r\n      }\r\n    }\r\n    \r\n    if(range_count == 1)\r\n    {\r\n      result = keys;\r\n    }\r\n    else\r\n    {\r\n      RDIM_SortKey *keys_swap = rdim_push_array_no_zero(arena, RDIM_SortKey, count);\r\n      RDIM_SortKey *src = keys;\r\n      RDIM_SortKey *dst = keys_swap;\r\n      RDIM_OrderedRange *src_ranges = ranges_first;\r\n      RDIM_OrderedRange *dst_ranges = 0;\r\n      RDIM_OrderedRange *dst_ranges_last = 0;\r\n      \r\n      for(;;)\r\n      {\r\n        // begin a pass\r\n        for(;;)\r\n        {\r\n          // end pass when out of ranges\r\n          if(src_ranges == 0)\r\n          {\r\n            break;\r\n          }\r\n          \r\n          // get first range\r\n          RDIM_OrderedRange *range1 = src_ranges;\r\n          RDIM_SLLStackPop(src_ranges);\r\n          \r\n          // if this range is the whole array, we are done\r\n          if(range1->first == 0 && range1->opl == count)\r\n          {\r\n            result = src;\r\n            goto sort_done;\r\n          }\r\n          \r\n          // if there is not a second range, save this range for next time and end this pass\r\n          if(src_ranges == 0)\r\n          {\r\n            RDI_U64 first = range1->first;\r\n            rdim_memcpy(dst + first, src + first, sizeof(*src)*(range1->opl - first));\r\n            RDIM_SLLQueuePush(dst_ranges, dst_ranges_last, range1);\r\n            break;\r\n          }\r\n          \r\n          // get second range\r\n          RDIM_OrderedRange *range2 = src_ranges;\r\n          RDIM_SLLStackPop(src_ranges);\r\n#if 0\r\n          rdim_assert(range1->opl == range2->first);\r\n#endif\r\n          \r\n          // merge these ranges\r\n          RDI_U64 jd = range1->first;\r\n          RDI_U64 j1 = range1->first;\r\n          RDI_U64 j1_opl = range1->opl;\r\n          RDI_U64 j2 = range2->first;\r\n          RDI_U64 j2_opl = range2->opl;\r\n          for(;;)\r\n          {\r\n            if(src[j1].key <= src[j2].key)\r\n            {\r\n              rdim_memcpy(dst + jd, src + j1, sizeof(*src));\r\n              j1 += 1;\r\n              jd += 1;\r\n              if(j1 >= j1_opl)\r\n              {\r\n                break;\r\n              }\r\n            }\r\n            else\r\n            {\r\n              rdim_memcpy(dst + jd, src + j2, sizeof(*src));\r\n              j2 += 1;\r\n              jd += 1;\r\n              if(j2 >= j2_opl)\r\n              {\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          if(j1 < j1_opl)\r\n          {\r\n            rdim_memcpy(dst + jd, src + j1, sizeof(*src)*(j1_opl - j1));\r\n          }\r\n          else\r\n          {\r\n            rdim_memcpy(dst + jd, src + j2, sizeof(*src)*(j2_opl - j2));\r\n          }\r\n          \r\n          // save this as one range\r\n          range1->opl = range2->opl;\r\n          SLLQueuePush(dst_ranges, dst_ranges_last, range1);\r\n        }\r\n        \r\n        // end pass by swapping buffers and range nodes\r\n        {\r\n          RDIM_SortKey *temp = src;\r\n          src = dst;\r\n          dst = temp;\r\n        }\r\n        src_ranges = dst_ranges;\r\n        dst_ranges = 0;\r\n        dst_ranges_last = 0;\r\n      }\r\n    }\r\n  }\r\n  sort_done:;\r\n  \r\n#if 0\r\n  // assert sortedness\r\n  for(RDI_U64 i = 1; i < count; i += 1)\r\n  {\r\n    rdim_assert(result[i - 1].key <= result[i].key);\r\n  }\r\n#endif\r\n  \r\n  rdim_scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: rng1u64 list\r\n\r\nRDI_PROC void\r\nrdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r)\r\n{\r\n  RDIM_Rng1U64Node *n = rdim_push_array(arena, RDIM_Rng1U64Node, 1);\r\n  n->v = r;\r\n  RDIM_SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  if(list->count == 1 || r.min < list->min)\r\n  {\r\n    list->min = r.min;\r\n  }\r\n}\r\n\r\nRDI_PROC void\r\nrdim_rng1u64_chunk_list_push(RDIM_Arena *arena, RDIM_Rng1U64ChunkList *list, RDI_U64 chunk_cap, RDIM_Rng1U64 r)\r\n{\r\n  RDIM_Rng1U64ChunkNode *n = list->last;\r\n  if(n == 0 || n->count >= n->cap)\r\n  {\r\n    n = rdim_push_array(arena, RDIM_Rng1U64ChunkNode, 1);\r\n    RDIM_SLLQueuePush(list->first, list->last, n);\r\n    n->cap = chunk_cap;\r\n    n->v = rdim_push_array_no_zero(arena, RDIM_Rng1U64, n->cap);\r\n    list->chunk_count += 1;\r\n  }\r\n  n->v[n->count] = r;\r\n  n->count += 1;\r\n  list->total_count += 1;\r\n  if(list->total_count == 1 || r.min < list->min)\r\n  {\r\n    list->min = r.min;\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Data Model\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_short_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_S16;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_S16;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_S16;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_S16;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_S64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_unsigned_short_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_U16;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_U16;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_U16;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_U16;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_U64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_int_type_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_S32;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_S32;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_S32;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_S64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_unsigned_int_type_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_U32;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_U32;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_U32;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_U64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_long_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_S32;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_S32;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_S64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_unsigned_long_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_U32;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_U32;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_U64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_long_long_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_S64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_S64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_unsigned_long_long_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_U64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_TypeKind\r\nrdim_pointer_size_t_type_kind_from_data_model(RDIM_DataModel data_model)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch((RDIM_DataModelEnum)data_model)\r\n  {\r\n    case RDIM_DataModel_Null:{}break;\r\n    case RDIM_DataModel_ILP32 :{result = RDI_TypeKind_U32;}break;\r\n    case RDIM_DataModel_LLP64 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_LP64  :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_ILP64 :{result = RDI_TypeKind_U64;}break;\r\n    case RDIM_DataModel_SILP64:{result = RDI_TypeKind_U64;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Binary Section List Building\r\n\r\nRDI_PROC RDIM_BinarySection *\r\nrdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list)\r\n{\r\n  RDIM_BinarySectionNode *n = rdim_push_array(arena, RDIM_BinarySectionNode, 1);\r\n  RDIM_SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  RDIM_BinarySection *result = &n->v;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Source File Info Building\r\n\r\nRDI_PROC RDIM_SrcFile *\r\nrdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_SrcFileChunkNode, RDIM_SrcFile, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_src_file(RDIM_SrcFile *src_file)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(src_file, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_SrcFileChunkNode, dst, to_push,\r\n                                   dst->source_line_map_count += to_push->source_line_map_count,\r\n                                   dst->total_line_count += to_push->total_line_count);\r\n}\r\n\r\nRDI_PROC void\r\nrdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq)\r\n{\r\n  if(src_file->first_line_map_fragment == 0)\r\n  {\r\n    src_files->source_line_map_count += 1;\r\n  }\r\n  RDIM_SrcFileLineMapFragment *fragment = rdim_push_array(arena, RDIM_SrcFileLineMapFragment, 1);\r\n  fragment->seq = seq;\r\n  RDIM_SLLQueuePush(src_file->first_line_map_fragment, src_file->last_line_map_fragment, fragment);\r\n  src_file->total_line_count += seq->line_count;\r\n  src_files->total_line_count += seq->line_count;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Line Info Building\r\n\r\nRDI_PROC RDIM_LineTable *\r\nrdim_line_table_chunk_list_push(RDIM_Arena *arena, RDIM_LineTableChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_LineTableChunkNode, RDIM_LineTable, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_line_table(RDIM_LineTable *line_table)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(line_table, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_line_table_chunk_list_concat_in_place(RDIM_LineTableChunkList *dst, RDIM_LineTableChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_LineTableChunkNode, dst, to_push,\r\n                                   dst->total_seq_count += to_push->total_seq_count,\r\n                                   dst->total_line_count += to_push->total_line_count,\r\n                                   dst->total_col_count += to_push->total_col_count);\r\n}\r\n\r\nRDI_PROC RDIM_LineSequence *\r\nrdim_line_table_push_sequence(RDIM_Arena *arena, RDIM_LineTableChunkList *line_tables, RDIM_LineTable *line_table, RDIM_SrcFile *src_file, RDI_U64 *voffs, RDI_U32 *line_nums, RDI_U16 *col_nums, RDI_U64 line_count)\r\n{\r\n  RDIM_LineSequenceNode *n = push_array(arena, RDIM_LineSequenceNode, 1);\r\n  n->v.src_file = src_file;\r\n  n->v.voffs = voffs;\r\n  n->v.line_nums = line_nums;\r\n  n->v.col_nums = col_nums;\r\n  n->v.line_count = line_count;\r\n  SLLQueuePush(line_table->first_seq, line_table->last_seq, n);\r\n  line_table->seq_count += 1;\r\n  line_table->line_count += line_count;\r\n  line_table->col_count += line_count*2*(col_nums != 0);\r\n  line_tables->total_seq_count += 1;\r\n  line_tables->total_line_count += line_count;\r\n  line_tables->total_col_count += line_count*2*(col_nums != 0);\r\n  return &n->v;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Unit List Building\r\n\r\nRDI_PROC RDIM_Unit *\r\nrdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_UnitChunkNode, RDIM_Unit, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_unit(RDIM_Unit *unit)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(unit, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_UnitChunkNode, dst, to_push);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Type Info Building\r\n\r\n//- rjf: type nodes\r\n\r\nRDI_PROC RDIM_Type **\r\nrdim_array_from_type_list(RDIM_Arena *arena, RDIM_TypeList list)\r\n{\r\n  RDIM_Type **arr = push_array(arena, RDIM_Type *, list.count);\r\n  U64         i   = 0;\r\n  for(RDIM_TypeNode *n = list.first; n != 0; n = n->next, ++i)\r\n  {\r\n    arr[i] = n->v;\r\n  }\r\n  return arr;\r\n}\r\n\r\nRDI_PROC RDIM_TypeNode *\r\nrdim_type_list_push(RDIM_Arena *arena, RDIM_TypeList *list, RDIM_Type *v)\r\n{\r\n  RDIM_TypeNode *n = push_array(arena, RDIM_TypeNode, 1);\r\n  n->v = v;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  return n;\r\n}\r\n\r\nRDI_PROC RDIM_Type *\r\nrdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_TypeChunkNode, RDIM_Type, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_type(RDIM_Type *type)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(type, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_TypeChunkNode, dst, to_push);\r\n}\r\n\r\n//- rjf: UDTs\r\n\r\nRDI_PROC RDIM_UDT *\r\nrdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_UDTChunkNode, RDIM_UDT, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_udt(RDIM_UDT *udt)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(udt, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_UDTChunkNode, dst, to_push,\r\n                                   dst->total_member_count += to_push->total_member_count,\r\n                                   dst->total_enum_val_count += to_push->total_enum_val_count);\r\n}\r\n\r\nRDI_PROC RDIM_UDTMember *\r\nrdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt)\r\n{\r\n  RDIM_UDTMember *mem = rdim_push_array(arena, RDIM_UDTMember, 1);\r\n  RDIM_SLLQueuePush(udt->first_member, udt->last_member, mem);\r\n  udt->member_count += 1;\r\n  list->total_member_count += 1;\r\n  return mem;\r\n}\r\n\r\nRDI_PROC RDIM_UDTEnumVal *\r\nrdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt)\r\n{\r\n  RDIM_UDTEnumVal *mem = rdim_push_array(arena, RDIM_UDTEnumVal, 1);\r\n  RDIM_SLLQueuePush(udt->first_enum_val, udt->last_enum_val, mem);\r\n  udt->enum_val_count += 1;\r\n  list->total_enum_val_count += 1;\r\n  return mem;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Symbol Info Building\r\n\r\nRDI_PROC RDIM_Symbol *\r\nrdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_SymbolChunkNode, RDIM_Symbol, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_symbol(RDIM_Symbol *symbol)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(symbol, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_SymbolChunkNode, dst, to_push, dst->total_value_data_size += to_push->total_value_data_size);\r\n}\r\n\r\ninternal void\r\nrdim_symbol_push_value_data(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDIM_Symbol *symbol, RDIM_String8 data)\r\n{\r\n  symbol->value_data = rdim_str8_copy(arena, data);\r\n  list->total_value_data_size += data.size;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Inline Site Info Building\r\n\r\nRDI_PROC RDIM_InlineSite *\r\nrdim_inline_site_chunk_list_push(RDIM_Arena *arena, RDIM_InlineSiteChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_InlineSiteChunkNode, RDIM_InlineSite, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_inline_site(RDIM_InlineSite *inline_site)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(inline_site, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_InlineSiteChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_InlineSiteChunkNode, dst, to_push);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Location Info Building\r\n\r\n//- rjf: bytecode\r\n\r\nRDI_PROC RDIM_EvalBytecodeOp *\r\nrdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p)\r\n{\r\n  RDI_U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];\r\n  RDI_U32 p_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\r\n  \r\n  RDIM_EvalBytecodeOp *node = rdim_push_array(arena, RDIM_EvalBytecodeOp, 1);\r\n  node->op = op;\r\n  node->p_size = p_size;\r\n  node->p = p;\r\n  \r\n  RDIM_SLLQueuePush(bytecode->first_op, bytecode->last_op, node);\r\n  bytecode->op_count += 1;\r\n  bytecode->encoded_size += 1 + p_size;\r\n  \r\n  return node;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x)\r\n{\r\n  if(x <= 0xFF)\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, x);\r\n  }\r\n  else if(x <= 0xFFFF)\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, x);\r\n  }\r\n  else if(x <= 0xFFFFFFFF)\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, x);\r\n  }\r\n  else\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, x);\r\n  }\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x)\r\n{\r\n  if(-0x80 <= x && x <= 0x7F)\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)x);\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8);\r\n  }\r\n  else if(-0x8000 <= x && x <= 0x7FFF)\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)x);\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16);\r\n  }\r\n  else if(-0x80000000ll <= x && x <= 0x7FFFFFFFll)\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)x);\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 32);\r\n  }\r\n  else\r\n  {\r\n    rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)x);\r\n  }\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bytecode_push_convert(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalTypeGroup in, RDI_EvalTypeGroup out)\r\n{\r\n  rdim_bytecode_push_op(arena, bytecode, RDI_EvalOp_Convert, (U16)(in) | ((U16)(out) << 8));\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed)\r\n{\r\n  if(right_destroyed->first_op != 0)\r\n  {\r\n    if(left_dst->first_op == 0)\r\n    {\r\n      rdim_memcpy_struct(left_dst, right_destroyed);\r\n    }\r\n    else\r\n    {\r\n      left_dst->last_op->next  = right_destroyed->first_op;\r\n      left_dst->last_op        = right_destroyed->last_op;\r\n      left_dst->op_count      += right_destroyed->op_count;\r\n      left_dst->encoded_size  += right_destroyed->encoded_size;\r\n    }\r\n    rdim_memzero_struct(right_destroyed);\r\n  }\r\n}\r\n\r\nRDI_PROC B32\r\nrdim_is_bytecode_tls_dependent(RDIM_EvalBytecode bytecode)\r\n{\r\n  B32 result = 0;\r\n  for(RDIM_EvalBytecodeOp *n = bytecode.first_op; n != 0; n = n->next)\r\n  {\r\n    if(n->op == RDI_EvalOp_TLSOff)\r\n    {\r\n      result = 1;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: locations\r\n\r\nRDI_PROC RDI_U64\r\nrdim_encoded_size_from_location_info(RDIM_LocationInfo *info)\r\n{\r\n  RDI_U64 result = 0;\r\n  switch((RDI_LocationKindEnum)info->kind)\r\n  {\r\n    case RDI_LocationKind_NULL:{}break;\r\n    \r\n    case RDI_LocationKind_AddrBytecodeStream:\r\n    case RDI_LocationKind_ValBytecodeStream:\r\n    {\r\n      result = sizeof(RDI_LocationBytecodeStream) + info->bytecode.encoded_size + 1;\r\n    }break;\r\n    \r\n    case RDI_LocationKind_AddrRegPlusU16:\r\n    case RDI_LocationKind_AddrAddrRegPlusU16:\r\n    {\r\n      result = sizeof(RDI_LocationRegPlusU16);\r\n    }break;\r\n    \r\n    case RDI_LocationKind_ValReg:\r\n    {\r\n      result = sizeof(RDI_LocationReg);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDIM_Location *\r\nrdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_LocationInfo *info)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_LocationChunkNode, RDIM_Location, cap, result, n->base_encoding_off = list->total_encoded_size);\r\n  {\r\n    RDI_U64 encoded_size = rdim_encoded_size_from_location_info(info);\r\n    rdim_memcpy_struct(&result->info, info);\r\n    result->relative_encoding_off = list->last->encoded_size;\r\n    list->last->encoded_size += encoded_size;\r\n    list->total_encoded_size += encoded_size;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_off_from_location(RDIM_Location *location)\r\n{\r\n  RDI_U64 off = 0;\r\n  if(location != 0 && location->chunk != 0)\r\n  {\r\n    off = location->chunk->base_encoding_off + location->relative_encoding_off + 1;\r\n  }\r\n  return off;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_location_chunk_list_concat_in_place(RDIM_LocationChunkList *dst, RDIM_LocationChunkList *to_push)\r\n{\r\n  for(RDIM_LocationChunkNode *n = to_push->first; n != 0; n = n->next)\r\n  {\r\n    n->base_encoding_off += dst->total_encoded_size;\r\n  }\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_LocationChunkNode, dst, to_push, dst->total_encoded_size += to_push->total_encoded_size);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Scope Info Building\r\n\r\nRDI_PROC RDIM_Scope *\r\nrdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_IdxedChunkListPush(arena, list, RDIM_ScopeChunkNode, RDIM_Scope, cap, result);\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDI_U64\r\nrdim_idx_from_scope(RDIM_Scope *scope)\r\n{\r\n  RDIM_IdxedChunkListElementGetIdx(scope, idx);\r\n  return idx;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push)\r\n{\r\n  RDIM_IdxedChunkListConcatInPlace(RDIM_ScopeChunkNode, dst, to_push,\r\n                                   dst->scope_voff_count      += to_push->scope_voff_count,\r\n                                   dst->local_count           += to_push->local_count,\r\n                                   dst->location_case_count   += to_push->location_case_count);\r\n}\r\n\r\nRDI_PROC void\r\nrdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range)\r\n{\r\n  rdim_rng1u64_list_push(arena, &scope->voff_ranges, range);\r\n  list->scope_voff_count += 2;\r\n}\r\n\r\nRDI_PROC RDIM_Local *\r\nrdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope)\r\n{\r\n  RDIM_Local *local = rdim_push_array(arena, RDIM_Local, 1);\r\n  RDIM_SLLQueuePush(scope->first_local, scope->last_local, local);\r\n  scope->local_count += 1;\r\n  scopes->local_count += 1;\r\n  return local;\r\n}\r\n\r\nRDI_PROC RDIM_LocationCase *\r\nrdim_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_LocationCaseList *list, RDIM_Location *location, RDIM_Rng1U64 voff_range)\r\n{\r\n  RDIM_LocationCase *n = rdim_push_array(arena, RDIM_LocationCase, 1);\r\n  RDIM_SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  n->location = location;\r\n  n->voff_range = voff_range;\r\n  scopes->location_case_count += 1;\r\n  return n;\r\n}\r\n\r\nRDI_PROC RDIM_LocationCase *\r\nrdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *location, RDIM_Rng1U64 voff_range)\r\n{\r\n  return rdim_push_location_case(arena, scopes, &local->location_cases, location, voff_range);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Bake Parameter Joining\r\n\r\nRDI_PROC void\r\nrdim_bake_params_concat_in_place(RDIM_BakeParams *dst, RDIM_BakeParams *src)\r\n{\r\n  // rjf: join top-level info (deduplicate - throw away conflicts)\r\n  {\r\n    dst->subset_flags |= src->subset_flags;\r\n    if(dst->top_level_info.arch == RDI_Arch_NULL)\r\n    {\r\n      dst->top_level_info.arch = src->top_level_info.arch;\r\n    }\r\n    if(dst->top_level_info.exe_name.size == 0)\r\n    {\r\n      dst->top_level_info.exe_name = src->top_level_info.exe_name;\r\n    }\r\n    if(dst->top_level_info.exe_hash == 0)\r\n    {\r\n      dst->top_level_info.exe_hash = src->top_level_info.exe_hash;\r\n    }\r\n    if(dst->top_level_info.voff_max == 0)\r\n    {\r\n      dst->top_level_info.voff_max = src->top_level_info.voff_max;\r\n    }\r\n    if(dst->top_level_info.guid.u64[0] == 0 && \r\n       dst->top_level_info.guid.u64[1] == 0)\r\n    {\r\n      dst->top_level_info.guid = src->top_level_info.guid;\r\n    }\r\n    if(dst->top_level_info.producer_name.size == 0)\r\n    {\r\n      dst->top_level_info.producer_name = src->top_level_info.producer_name;\r\n    }\r\n  }\r\n  \r\n  // rjf: join binary sections (deduplicate)\r\n  {\r\n    RDIM_Temp scratch = rdim_scratch_begin(0, 0);\r\n    RDI_U64 slots_count = 256;\r\n    RDIM_BinarySectionNode **slots = rdim_push_array(scratch.arena, RDIM_BinarySectionNode *, slots_count);\r\n    for(RDIM_BinarySectionNode *n = dst->binary_sections.first; n != 0; n = n->next)\r\n    {\r\n      RDIM_BinarySectionNode *hash_node = rdim_push_array(scratch.arena, RDIM_BinarySectionNode, 1);\r\n      RDI_U64 hash = rdi_hash(n->v.name.str, n->v.name.size);\r\n      RDI_U64 slot_idx = hash%slots_count;\r\n      RDIM_SLLStackPush(slots[slot_idx], hash_node);\r\n      hash_node->v = n->v;\r\n    }\r\n    for(RDIM_BinarySectionNode *n = src->binary_sections.first, *next = 0; n != 0; n = next)\r\n    {\r\n      next = n->next;\r\n      RDI_U64 hash = rdi_hash(n->v.name.str, n->v.name.size);\r\n      RDI_U64 slot_idx = hash%slots_count;\r\n      RDI_S32 is_duplicate = 0;\r\n      for(RDIM_BinarySectionNode *hash_n = slots[slot_idx]; hash_n != 0; hash_n = hash_n->next)\r\n      {\r\n        if(rdim_str8_match(hash_n->v.name, n->v.name, 0))\r\n        {\r\n          is_duplicate = 1;\r\n          break;\r\n        }\r\n      }\r\n      if(!is_duplicate)\r\n      {\r\n        RDIM_SLLQueuePush(dst->binary_sections.first, dst->binary_sections.last, n);\r\n        dst->binary_sections.count += 1;\r\n      }\r\n    }\r\n    rdim_scratch_end(scratch);\r\n  }\r\n  \r\n  // rjf: join non-top-level chunk lists\r\n  {\r\n    rdim_unit_chunk_list_concat_in_place(&dst->units, &src->units);\r\n    rdim_type_chunk_list_concat_in_place(&dst->types, &src->types);\r\n    rdim_udt_chunk_list_concat_in_place(&dst->udts, &src->udts);\r\n    rdim_src_file_chunk_list_concat_in_place(&dst->src_files, &src->src_files);\r\n    rdim_line_table_chunk_list_concat_in_place(&dst->line_tables, &src->line_tables);\r\n    rdim_location_chunk_list_concat_in_place(&dst->locations, &src->locations);\r\n    rdim_symbol_chunk_list_concat_in_place(&dst->global_variables, &src->global_variables);\r\n    rdim_symbol_chunk_list_concat_in_place(&dst->thread_variables, &src->thread_variables);\r\n    rdim_symbol_chunk_list_concat_in_place(&dst->constants, &src->constants);\r\n    rdim_symbol_chunk_list_concat_in_place(&dst->procedures, &src->procedures);\r\n    rdim_scope_chunk_list_concat_in_place(&dst->scopes, &src->scopes);\r\n    rdim_inline_site_chunk_list_concat_in_place(&dst->inline_sites, &src->inline_sites);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated String Baking Map\r\n\r\n//- rjf: chunk lists\r\n\r\nRDI_PROC RDIM_BakeString *\r\nrdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_BakeStringChunkNode *n = list->last;\r\n  if(n == 0 || n->count >= n->cap)\r\n  {\r\n    n = rdim_push_array(arena, RDIM_BakeStringChunkNode, 1);\r\n    n->cap = cap;\r\n    n->v = rdim_push_array(arena, RDIM_BakeString, n->cap);\r\n    RDIM_SLLQueuePush(list->first, list->last, n);\r\n    list->chunk_count += 1;\r\n  }\r\n  RDIM_BakeString *s = &n->v[n->count];\r\n  n->count += 1;\r\n  list->total_count += 1;\r\n  return s;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push)\r\n{\r\n  for(RDIM_BakeStringChunkNode *n = to_push->first; n != 0; n = n->next)\r\n  {\r\n    n->base_idx += dst->total_count;\r\n  }\r\n  if(dst->last != 0 && to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->chunk_count += to_push->chunk_count;\r\n    dst->total_count += to_push->total_count;\r\n  }\r\n  else if(dst->first == 0)\r\n  {\r\n    rdim_memcpy_struct(dst, to_push);\r\n  }\r\n  rdim_memzero_struct(to_push);\r\n}\r\n\r\nRDI_PROC RSFORCEINLINE int\r\nrdim_bake_string_is_before(void *l, void *r)\r\n{\r\n  return str8_is_before(((RDIM_BakeString *)l)->string, ((RDIM_BakeString *)r)->string);\r\n}\r\n\r\nRDI_PROC RDIM_BakeStringChunkList\r\nrdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src)\r\n{\r\n  //- rjf: produce unsorted destination list with single chunk node\r\n  RDIM_BakeStringChunkList dst = {0};\r\n  for(RDIM_BakeStringChunkNode *n = src->first; n != 0; n = n->next)\r\n  {\r\n    for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n    {\r\n      RDIM_BakeString *src_str = &n->v[idx];\r\n      RDIM_BakeString *dst_str = rdim_bake_string_chunk_list_push(arena, &dst, src->total_count);\r\n      rdim_memcpy_struct(dst_str, src_str);\r\n    }\r\n  }\r\n  \r\n  //- rjf: sort chunk node\r\n  if(dst.first != 0)\r\n  {\r\n    radsort(dst.first->v, dst.first->count, rdim_bake_string_is_before);\r\n  }\r\n  \r\n  //- rjf: iterate sorted chunk node, remove duplicates, count # of duplicates\r\n  RDI_U64 num_duplicates = 0;\r\n  if(dst.first != 0)\r\n  {\r\n    RDI_U64 last_idx = 0;\r\n    for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1)\r\n    {\r\n      if(rdim_str8_match(dst.first->v[last_idx].string, dst.first->v[idx].string, 0))\r\n      {\r\n        rdim_memzero_struct(&dst.first->v[idx]);\r\n        num_duplicates += 1;\r\n      }\r\n      else\r\n      {\r\n        last_idx = idx;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: iterate sorted chunk node, make non-empty elements contiguous\r\n  if(num_duplicates != 0)\r\n  {\r\n    RDI_U64 last_idx = 0;\r\n    for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1)\r\n    {\r\n      if(last_idx == 0 &&\r\n         dst.first->v[idx].string.RDIM_String8_SizeMember == 0 &&\r\n         dst.first->v[idx].hash == 0)\r\n      {\r\n        last_idx = idx;\r\n      }\r\n      if(last_idx != 0 && dst.first->v[idx].string.RDIM_String8_SizeMember != 0)\r\n      {\r\n        rdim_memcpy_struct(&dst.first->v[last_idx], &dst.first->v[idx]);\r\n        rdim_memzero_struct(&dst.first->v[idx]);\r\n        last_idx += 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: pop extras\r\n    if(num_duplicates != 0)\r\n    {\r\n      RDI_U64 arena_pos_pre_pop = rdim_arena_pos(arena);\r\n      rdim_arena_pop_to(arena, arena_pos_pre_pop - num_duplicates*sizeof(dst.first->v[0]));\r\n      dst.first->count -= num_duplicates;\r\n      dst.first->cap   -= num_duplicates;\r\n      dst.total_count  -= num_duplicates;\r\n    }\r\n  }\r\n  \r\n  return dst;\r\n}\r\n\r\n//- rjf: loose map\r\n\r\nRDI_PROC RDIM_BakeStringMapLoose *\r\nrdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top)\r\n{\r\n  RDIM_BakeStringMapLoose *map = rdim_push_array(arena, RDIM_BakeStringMapLoose, 1);\r\n  map->slots = rdim_push_array(arena, RDIM_BakeStringChunkList *, top->slots_count);\r\n  return map;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string)\r\n{\r\n  if(string.RDIM_String8_SizeMember != 0)\r\n  {\r\n    RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember);\r\n    RDI_U64 slot_idx = hash%map_topology->slots_count;\r\n    RDIM_BakeStringChunkList *slot = map->slots[slot_idx];\r\n    if(slot == 0)\r\n    {\r\n      slot = map->slots[slot_idx] = rdim_push_array(arena, RDIM_BakeStringChunkList, 1);\r\n    }\r\n    RDI_S32 is_duplicate = 0;\r\n    for(RDIM_BakeStringChunkNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n      {\r\n        if(rdim_str8_match(n->v[idx].string, string, 0))\r\n        {\r\n          is_duplicate = 1;\r\n          goto break_all;\r\n        }\r\n      }\r\n    }\r\n    break_all:;\r\n    if(!is_duplicate)\r\n    {\r\n      RDIM_BakeString *bstr = rdim_bake_string_chunk_list_push(arena, slot, chunk_cap);\r\n      bstr->string = string;\r\n      bstr->hash = hash;\r\n    }\r\n  }\r\n}\r\n\r\nRDI_PROC RDIM_BakeStringMapBaseIndices\r\nrdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map)\r\n{\r\n  RDIM_BakeStringMapBaseIndices indices = {0};\r\n  indices.slots_base_idxs = rdim_push_array(arena, RDI_U64, map_topology->slots_count+1);\r\n  RDI_U64 total_count = 0;\r\n  for(RDI_U64 idx = 0; idx < map_topology->slots_count; idx += 1)\r\n  {\r\n    indices.slots_base_idxs[idx] += total_count;\r\n    if(map->slots[idx] != 0)\r\n    {\r\n      total_count += map->slots[idx]->total_count;\r\n    }\r\n  }\r\n  indices.slots_base_idxs[map_topology->slots_count] = total_count;\r\n  return indices;\r\n}\r\n\r\n//- rjf: finalized / tight map\r\n\r\nRDI_PROC RDI_U32\r\nrdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string)\r\n{\r\n  RDI_U32 idx = 0;\r\n  if(string.RDIM_String8_SizeMember != 0)\r\n  {\r\n    RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember);\r\n    RDI_U64 slot_idx = hash%map->slots_count;\r\n    for(RDIM_BakeStringChunkNode *n = map->slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1)\r\n      {\r\n        if(n->v[chunk_idx].hash == hash && rdim_str8_match(n->v[chunk_idx].string, string, 0))\r\n        {\r\n          idx = map->slots_base_idxs[slot_idx] + n->base_idx + chunk_idx + 1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return idx;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated Index Run Baking Map\r\n\r\n//- rjf: bake idx run map reading/writing\r\n\r\nRDI_PROC RDI_U64\r\nrdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count)\r\n{\r\n  RDI_U64 hash = 5381;\r\n  RDI_U32 *ptr = idx_run;\r\n  RDI_U32 *opl = idx_run + count;\r\n  for(;ptr < opl; ptr += 1)\r\n  {\r\n    hash = ((hash << 5) + hash) + (*ptr);\r\n  }\r\n  return hash;\r\n}\r\n\r\n//- rjf: chunk lists\r\n\r\nRDI_PROC RDIM_BakeIdxRun *\r\nrdim_bake_idx_run_chunk_list_push(RDIM_Arena *arena, RDIM_BakeIdxRunChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_BakeIdxRunChunkNode *n = list->last;\r\n  if(n == 0 || n->count >= n->cap)\r\n  {\r\n    n = rdim_push_array(arena, RDIM_BakeIdxRunChunkNode, 1);\r\n    n->cap = cap;\r\n    n->v = rdim_push_array(arena, RDIM_BakeIdxRun, n->cap);\r\n    RDIM_SLLQueuePush(list->first, list->last, n);\r\n    list->chunk_count += 1;\r\n  }\r\n  RDIM_BakeIdxRun *s = &n->v[n->count];\r\n  n->count += 1;\r\n  list->total_count += 1;\r\n  return s;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_idx_run_chunk_list_concat_in_place(RDIM_BakeIdxRunChunkList *dst, RDIM_BakeIdxRunChunkList *to_push)\r\n{\r\n  if(dst->last != 0 && to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->chunk_count += to_push->chunk_count;\r\n    dst->total_count += to_push->total_count;\r\n  }\r\n  else if(dst->first == 0)\r\n  {\r\n    rdim_memcpy_struct(dst, to_push);\r\n  }\r\n  rdim_memzero_struct(to_push);\r\n}\r\n\r\nRDI_PROC RSFORCEINLINE int\r\nrdim_bake_idx_run_is_before(void *l, void *r)\r\n{\r\n  B32 is_less_than = 0;\r\n  {\r\n    RDIM_BakeIdxRun *lir = (RDIM_BakeIdxRun *)l;\r\n    RDIM_BakeIdxRun *rir = (RDIM_BakeIdxRun *)r;\r\n    U64 common_count = Min(lir->count, rir->count);\r\n    for(U64 off = 0; off < common_count; off += 1)\r\n    {\r\n      if(lir->idxes[off] < rir->idxes[off])\r\n      {\r\n        is_less_than = 1;\r\n        break;\r\n      }\r\n      else if(lir->idxes[off] > rir->idxes[off])\r\n      {\r\n        is_less_than = 0;\r\n        break;\r\n      }\r\n      else if(off+1 == common_count)\r\n      {\r\n        is_less_than = (lir->count < rir->count);\r\n      }\r\n    }\r\n  }\r\n  return is_less_than;\r\n}\r\n\r\nRDI_PROC RDIM_BakeIdxRunChunkList\r\nrdim_bake_idx_run_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeIdxRunChunkList *src)\r\n{\r\n  //- rjf: produce unsorted destination list with single chunk node\r\n  RDIM_BakeIdxRunChunkList dst = {0};\r\n  for(RDIM_BakeIdxRunChunkNode *n = src->first; n != 0; n = n->next)\r\n  {\r\n    for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n    {\r\n      RDIM_BakeIdxRun *src_str = &n->v[idx];\r\n      RDIM_BakeIdxRun *dst_str = rdim_bake_idx_run_chunk_list_push(arena, &dst, src->total_count);\r\n      rdim_memcpy_struct(dst_str, src_str);\r\n    }\r\n  }\r\n  \r\n  //- rjf: sort chunk node\r\n  if(dst.first != 0)\r\n  {\r\n    radsort(dst.first->v, dst.first->count, rdim_bake_idx_run_is_before);\r\n  }\r\n  \r\n  //- rjf: iterate sorted chunk node, remove duplicates, count # of duplicates\r\n  RDI_U64 num_duplicates = 0;\r\n  if(dst.first != 0)\r\n  {\r\n    RDI_U64 last_idx = 0;\r\n    for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1)\r\n    {\r\n      if(dst.first->v[last_idx].count == dst.first->v[idx].count &&\r\n         MemoryMatch(dst.first->v[last_idx].idxes,\r\n                     dst.first->v[idx].idxes,\r\n                     sizeof(dst.first->v[idx].idxes[0]) * dst.first->v[idx].count))\r\n      {\r\n        rdim_memzero_struct(&dst.first->v[idx]);\r\n        num_duplicates += 1;\r\n      }\r\n      else\r\n      {\r\n        last_idx = idx;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: iterate sorted chunk node, make non-empty elements contiguous\r\n  if(num_duplicates != 0)\r\n  {\r\n    RDI_U64 last_idx = 0;\r\n    for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1)\r\n    {\r\n      if(last_idx == 0 && dst.first->v[idx].hash == 0)\r\n      {\r\n        last_idx = idx;\r\n      }\r\n      if(last_idx != 0 && dst.first->v[idx].hash != 0)\r\n      {\r\n        rdim_memcpy_struct(&dst.first->v[last_idx], &dst.first->v[idx]);\r\n        rdim_memzero_struct(&dst.first->v[idx]);\r\n        last_idx += 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: pop extras\r\n    if(num_duplicates != 0)\r\n    {\r\n      RDI_U64 arena_pos_pre_pop = rdim_arena_pos(arena);\r\n      rdim_arena_pop_to(arena, arena_pos_pre_pop - num_duplicates*sizeof(dst.first->v[0]));\r\n      dst.first->count -= num_duplicates;\r\n      dst.first->cap   -= num_duplicates;\r\n      dst.total_count  -= num_duplicates;\r\n    }\r\n  }\r\n  \r\n  return dst;\r\n}\r\n\r\n//- rjf: loose map\r\n\r\nRDI_PROC RDIM_BakeIdxRunMapLoose *\r\nrdim_bake_idx_run_map_loose_make(RDIM_Arena *arena, RDIM_BakeIdxRunMapTopology *top)\r\n{\r\n  RDIM_BakeIdxRunMapLoose *map = rdim_push_array(arena, RDIM_BakeIdxRunMapLoose, 1);\r\n  map->slots = rdim_push_array(arena, RDIM_BakeIdxRunChunkList *, top->slots_count);\r\n  map->slots_idx_counts = rdim_push_array(arena, RDI_U64, top->slots_count);\r\n  return map;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_idx_run_map_loose_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMapTopology *map_topology, RDIM_BakeIdxRunMapLoose *map, RDI_U64 chunk_cap, RDI_U32 *idxes, RDI_U32 count)\r\n{\r\n  if(count != 0)\r\n  {\r\n    RDI_U64 hash = rdim_hash_from_idx_run(idxes, count);\r\n    RDI_U64 slot_idx = hash%map_topology->slots_count;\r\n    RDIM_BakeIdxRunChunkList *slot = map->slots[slot_idx];\r\n    if(slot == 0)\r\n    {\r\n      slot = map->slots[slot_idx] = rdim_push_array(arena, RDIM_BakeIdxRunChunkList, 1);\r\n    }\r\n    RDI_S32 is_duplicate = 0;\r\n    for(RDIM_BakeIdxRunChunkNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n      {\r\n        if(n->v[idx].hash == hash &&\r\n           n->v[idx].count == count &&\r\n           MemoryMatch(n->v[idx].idxes, idxes, sizeof(idxes[0])*count))\r\n        {\r\n          is_duplicate = 1;\r\n          goto break_all;\r\n        }\r\n      }\r\n    }\r\n    break_all:;\r\n    if(!is_duplicate)\r\n    {\r\n      RDIM_BakeIdxRun *bir = rdim_bake_idx_run_chunk_list_push(arena, slot, chunk_cap);\r\n      bir->hash = hash;\r\n      bir->count = count;\r\n      bir->idxes = idxes;\r\n      map->slots_idx_counts[slot_idx] += count;\r\n    }\r\n  }\r\n}\r\n\r\n//- rjf: finalized / tight map\r\n\r\nRDI_PROC RDI_U32\r\nrdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idxes, RDI_U32 count)\r\n{\r\n  RDI_U32 idx = 0;\r\n  if(count != 0)\r\n  {\r\n    RDI_U64 hash = rdim_hash_from_idx_run(idxes, count);\r\n    RDI_U64 slot_idx = hash%map->slots_count;\r\n    RDI_U64 off = 0;\r\n    for(RDIM_BakeIdxRunChunkNode *n = map->slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      for(RDI_U64 chunk_idx = 0; chunk_idx < n->count; chunk_idx += 1)\r\n      {\r\n        if(n->v[chunk_idx].hash == hash &&\r\n           n->v[chunk_idx].count == count &&\r\n           MemoryMatch(n->v[chunk_idx].idxes, idxes, sizeof(idxes[0])*count))\r\n        {\r\n          idx = (RDI_U32)(map->slots_base_idxs[slot_idx] + off); // TODO(rjf): @u64_to_u32\r\n          goto end_lookup;\r\n        }\r\n        off += n->v[chunk_idx].count;\r\n      }\r\n    }\r\n    end_lookup:;\r\n  }\r\n  return idx;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated Name Map Baking Map\r\n\r\n//- rjf: chunk lists\r\n\r\nRDI_PROC RDIM_BakeName *\r\nrdim_bake_name_chunk_list_push(RDIM_Arena *arena, RDIM_BakeNameChunkList *list, RDI_U64 cap)\r\n{\r\n  RDIM_BakeNameChunkNode *n = list->last;\r\n  if(n == 0 || n->count >= n->cap)\r\n  {\r\n    n = rdim_push_array(arena, RDIM_BakeNameChunkNode, 1);\r\n    n->cap = cap;\r\n    n->base_idx = list->total_count;\r\n    n->v = rdim_push_array(arena, RDIM_BakeName, n->cap);\r\n    RDIM_SLLQueuePush(list->first, list->last, n);\r\n    list->chunk_count += 1;\r\n  }\r\n  RDIM_BakeName *result = &n->v[n->count];\r\n  n->count += 1;\r\n  list->total_count += 1;\r\n  return result;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_name_chunk_list_concat_in_place(RDIM_BakeNameChunkList *dst, RDIM_BakeNameChunkList *to_push)\r\n{\r\n  for(RDIM_BakeNameChunkNode *n = to_push->first; n != 0; n = n->next)\r\n  {\r\n    n->base_idx += dst->total_count;\r\n  }\r\n  if(dst->last != 0 && to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->chunk_count += to_push->chunk_count;\r\n    dst->total_count += to_push->total_count;\r\n  }\r\n  else if(dst->first == 0)\r\n  {\r\n    rdim_memcpy_struct(dst, to_push);\r\n  }\r\n  rdim_memzero_struct(to_push);\r\n}\r\n\r\nRDI_PROC RSFORCEINLINE int\r\nrdim_bake_name_is_before(void *l, void *r)\r\n{\r\n  RDIM_BakeName *lhs = (RDIM_BakeName *)l;\r\n  RDIM_BakeName *rhs = (RDIM_BakeName *)r;\r\n  B32 lhs_name_lt = str8_is_before(lhs->string, rhs->string);\r\n  B32 is_before = lhs_name_lt;\r\n  if(!lhs_name_lt)\r\n  {\r\n    B32 rhs_name_lt = str8_is_before(rhs->string, lhs->string);\r\n    if(!rhs_name_lt)\r\n    {\r\n      is_before = (lhs->idx > rhs->idx);\r\n    }\r\n  }\r\n  return is_before;\r\n}\r\n\r\nRDI_PROC RDIM_BakeNameChunkList\r\nrdim_bake_name_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeNameChunkList *src)\r\n{\r\n  //- rjf: produce unsorted destination list with single chunk node\r\n  RDIM_BakeNameChunkList dst = {0};\r\n  for(RDIM_BakeNameChunkNode *n = src->first; n != 0; n = n->next)\r\n  {\r\n    for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n    {\r\n      RDIM_BakeName *src_str = &n->v[idx];\r\n      RDIM_BakeName *dst_str = rdim_bake_name_chunk_list_push(arena, &dst, src->total_count);\r\n      rdim_memcpy_struct(dst_str, src_str);\r\n    }\r\n  }\r\n  \r\n  //- rjf: sort chunk node\r\n  if(dst.first != 0)\r\n  {\r\n    radsort(dst.first->v, dst.first->count, rdim_bake_name_is_before);\r\n  }\r\n  \r\n  //- rjf: iterate sorted chunk node, remove duplicates, count # of duplicates\r\n  RDI_U64 num_duplicates = 0;\r\n  if(dst.first != 0)\r\n  {\r\n    RDI_U64 last_idx = 0;\r\n    for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1)\r\n    {\r\n      if(rdim_str8_match(dst.first->v[last_idx].string, dst.first->v[idx].string, 0) &&\r\n         dst.first->v[last_idx].idx == dst.first->v[idx].idx)\r\n      {\r\n        rdim_memzero_struct(&dst.first->v[idx]);\r\n        num_duplicates += 1;\r\n      }\r\n      else\r\n      {\r\n        last_idx = idx;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: iterate sorted chunk node, make non-empty elements contiguous\r\n  if(num_duplicates != 0)\r\n  {\r\n    RDI_U64 last_idx = 0;\r\n    for(RDI_U64 idx = 1; idx < dst.first->count; idx += 1)\r\n    {\r\n      if(last_idx == 0 &&\r\n         dst.first->v[idx].string.RDIM_String8_SizeMember == 0 &&\r\n         dst.first->v[idx].hash == 0)\r\n      {\r\n        last_idx = idx;\r\n      }\r\n      if(last_idx != 0 && dst.first->v[idx].string.RDIM_String8_SizeMember != 0)\r\n      {\r\n        rdim_memcpy_struct(&dst.first->v[last_idx], &dst.first->v[idx]);\r\n        rdim_memzero_struct(&dst.first->v[idx]);\r\n        last_idx += 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: pop extras\r\n    if(num_duplicates != 0)\r\n    {\r\n      RDI_U64 arena_pos_pre_pop = rdim_arena_pos(arena);\r\n      rdim_arena_pop_to(arena, arena_pos_pre_pop - num_duplicates*sizeof(dst.first->v[0]));\r\n      dst.first->count -= num_duplicates;\r\n      dst.first->cap   -= num_duplicates;\r\n      dst.total_count  -= num_duplicates;\r\n    }\r\n  }\r\n  \r\n  return dst;\r\n}\r\n\r\n//- rjf: bake name chunk list maps\r\n\r\nRDI_PROC RDIM_BakeNameMap *\r\nrdim_bake_name_map_make(RDIM_Arena *arena, RDIM_BakeNameMapTopology *top)\r\n{\r\n  RDIM_BakeNameMap *map = rdim_push_array(arena, RDIM_BakeNameMap, 1);\r\n  map->slots = rdim_push_array(arena, RDIM_BakeNameChunkList *, top->slots_count);\r\n  return map;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_name_map_insert(RDIM_Arena *arena, RDIM_BakeNameMapTopology *map_topology, RDIM_BakeNameMap *map, RDI_U64 chunk_cap, RDIM_String8 string, RDI_U64 idx)\r\n{\r\n  if(string.RDIM_String8_SizeMember != 0)\r\n  {\r\n    RDI_U64 hash = rdi_hash(string.RDIM_String8_BaseMember, string.RDIM_String8_SizeMember);\r\n    RDI_U64 slot_idx = hash%map_topology->slots_count;\r\n    RDIM_BakeNameChunkList *slot = map->slots[slot_idx];\r\n    if(slot == 0)\r\n    {\r\n      slot = map->slots[slot_idx] = rdim_push_array(arena, RDIM_BakeNameChunkList, 1);\r\n    }\r\n    RDI_S32 is_duplicate = 0;\r\n    for(RDIM_BakeNameChunkNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n      {\r\n        if(rdim_str8_match(n->v[idx].string, string, 0) &&\r\n           n->v[idx].idx == idx)\r\n        {\r\n          is_duplicate = 1;\r\n          goto break_all;\r\n        }\r\n      }\r\n    }\r\n    break_all:;\r\n    if(!is_duplicate)\r\n    {\r\n      RDIM_BakeName *bstr = rdim_bake_name_chunk_list_push(arena, slot, chunk_cap);\r\n      bstr->string = string;\r\n      bstr->idx = idx;\r\n      bstr->hash = hash;\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated Path Baking Tree\r\n\r\nRDI_PROC RDIM_BakePathNode *\r\nrdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string)\r\n{\r\n  RDIM_BakePathNode *node = &tree->root;\r\n  RDI_U8 *ptr = string.str;\r\n  RDI_U8 *opl = string.str + string.size;\r\n  for(;ptr < opl && node != 0;)\r\n  {\r\n    // rjf: skip past non-leading slashes\r\n    RDI_U32 leading_slash = 0;\r\n    if(ptr > string.str)\r\n    {\r\n      for(;ptr < opl && (*ptr == '/' || *ptr == '\\\\'); ptr += 1);\r\n    }\r\n    else if(ptr < opl)\r\n    {\r\n      leading_slash = (*ptr == '/');\r\n    }\r\n    \r\n    // rjf: save beginning of non-slash range\r\n    RDI_U8 *range_first = ptr;\r\n    \r\n    // rjf: advance past leading slash\r\n    if(leading_slash)\r\n    {\r\n      ptr += 1;\r\n    }\r\n    \r\n    // rjf: skip past non-slashes\r\n    for(;ptr < opl && !(*ptr == '/' || *ptr == '\\\\'); ptr += 1);\r\n    \r\n    // rjf: empty range -> continue\r\n    if(range_first >= ptr)\r\n    {\r\n      continue;\r\n    }\r\n    \r\n    // rjf: range -> sub-directory string\r\n    RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first));\r\n    \r\n    // rjf: sub-directory string -> find child of node\r\n    RDIM_BakePathNode *sub_dir_node = 0;\r\n    for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling)\r\n    {\r\n      if(rdim_str8_match(child->name, sub_dir, 0))\r\n      {\r\n        sub_dir_node = child;\r\n      }\r\n    }\r\n    \r\n    // rjf: .. -> go up\r\n    if(sub_dir.RDIM_String8_SizeMember == 2 &&\r\n       sub_dir.RDIM_String8_BaseMember[0] == '.' &&\r\n       sub_dir.RDIM_String8_BaseMember[1] == '.')\r\n    {\r\n      sub_dir_node = node->parent;\r\n      if(sub_dir_node == 0)\r\n      {\r\n        sub_dir_node = &tree->root;\r\n      }\r\n    }\r\n    \r\n    // rjf: . -> stay here\r\n    else if(sub_dir.RDIM_String8_SizeMember == 1 &&\r\n            sub_dir.RDIM_String8_BaseMember[0] == '.')\r\n    {\r\n      sub_dir_node = node;\r\n    }\r\n    \r\n    // rjf: descend to child\r\n    node = sub_dir_node;\r\n  }\r\n  return node;\r\n}\r\n\r\nRDI_PROC RDI_U32\r\nrdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string)\r\n{\r\n  RDIM_BakePathNode *path_node = rdim_bake_path_node_from_string(tree, string);\r\n  RDI_U32 result = 0;\r\n  if(path_node != 0)\r\n  {\r\n    result = path_node->idx;\r\n  }\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDIM_BakePathNode *\r\nrdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string)\r\n{\r\n  RDIM_BakePathNode *node = &tree->root;\r\n  RDI_U8 *ptr = string.str;\r\n  RDI_U8 *opl = string.str + string.size;\r\n  for(;ptr < opl;)\r\n  {\r\n    // rjf: skip past non-leading slashes\r\n    RDI_U32 leading_slash = 0;\r\n    if(ptr > string.str)\r\n    {\r\n      for(;ptr < opl && (*ptr == '/' || *ptr == '\\\\'); ptr += 1);\r\n    }\r\n    else if(ptr < opl)\r\n    {\r\n      leading_slash = (*ptr == '/');\r\n    }\r\n    \r\n    // rjf: save beginning of path part\r\n    RDI_U8 *range_first = ptr;\r\n    \r\n    // rjf: advance past leading slash\r\n    if(leading_slash)\r\n    {\r\n      ptr += 1;\r\n    }\r\n    \r\n    // rjf: skip past non-slashes\r\n    for(;ptr < opl && !(*ptr == '/' || *ptr == '\\\\'); ptr += 1);\r\n    \r\n    // rjf: empty range -> continue\r\n    if(range_first >= ptr)\r\n    {\r\n      continue;\r\n    }\r\n    \r\n    // rjf: range -> sub-directory string\r\n    RDIM_String8 sub_dir = rdim_str8(range_first, (RDI_U64)(ptr-range_first));\r\n    \r\n    // rjf: sub-directory string -> find child of node\r\n    RDIM_BakePathNode *sub_dir_node = 0;\r\n    for(RDIM_BakePathNode *child = node->first_child; child != 0; child = child->next_sibling)\r\n    {\r\n      if(rdim_str8_match(child->name, sub_dir, 0))\r\n      {\r\n        sub_dir_node = child;\r\n      }\r\n    }\r\n    \r\n    // rjf: .. -> go up\r\n    if(sub_dir.RDIM_String8_SizeMember == 2 &&\r\n       sub_dir.RDIM_String8_BaseMember[0] == '.' &&\r\n       sub_dir.RDIM_String8_BaseMember[1] == '.')\r\n    {\r\n      sub_dir_node = node->parent;\r\n      if(sub_dir_node == 0)\r\n      {\r\n        sub_dir_node = &tree->root;\r\n      }\r\n    }\r\n    \r\n    // rjf: . -> stay here\r\n    else if(sub_dir.RDIM_String8_SizeMember == 1 &&\r\n            sub_dir.RDIM_String8_BaseMember[0] == '.')\r\n    {\r\n      sub_dir_node = node;\r\n    }\r\n    \r\n    // rjf: no child -> make one\r\n    else if(sub_dir_node == 0)\r\n    {\r\n      sub_dir_node = rdim_push_array(arena, RDIM_BakePathNode, 1);\r\n      RDIM_SLLQueuePush_N(tree->first, tree->last, sub_dir_node, next_order);\r\n      sub_dir_node->parent = node;\r\n      RDIM_SLLQueuePush_N(node->first_child, node->last_child, sub_dir_node, next_sibling);\r\n      sub_dir_node->name = rdim_str8_copy(arena, sub_dir);\r\n      sub_dir_node->idx = tree->count;\r\n      tree->count += 1;\r\n    }\r\n    \r\n    // rjf: descend to child\r\n    node = sub_dir_node;\r\n  }\r\n  return node;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Data Section List Building Helpers\r\n\r\nRDI_PROC RDIM_BakeSection *\r\nrdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list)\r\n{\r\n  RDIM_BakeSectionNode *n = rdim_push_array(arena, RDIM_BakeSectionNode, 1);\r\n  RDIM_SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n  RDIM_BakeSection *result = &n->v;\r\n  return result;\r\n}\r\n\r\nRDI_PROC RDIM_BakeSection *\r\nrdim_bake_section_list_push_new_unpacked(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_SectionKind tag, RDI_U64 tag_idx)\r\n{\r\n  RDIM_BakeSection *section = rdim_bake_section_list_push(arena, list);\r\n  section->data = data;\r\n  section->encoding = RDI_SectionEncoding_Unpacked;\r\n  section->encoded_size = size;\r\n  section->unpacked_size = size;\r\n  section->tag = tag;\r\n  section->tag_idx = tag_idx;\r\n  return section;\r\n}\r\n\r\nRDI_PROC void\r\nrdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push)\r\n{\r\n  if(dst->last != 0 && to_push->first != 0)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    dst->last = to_push->last;\r\n    dst->count += to_push->count;\r\n  }\r\n  else if(to_push->first != 0)\r\n  {\r\n    rdim_memcpy_struct(dst, to_push);\r\n  }\r\n  rdim_memzero_struct(to_push);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: [Serializing] Bake Results -> String Blobs\r\n\r\nRDI_PROC RDIM_SerializedSection\r\nrdim_serialized_section_make_unpacked(void *data, RDI_U64 size)\r\n{\r\n  RDIM_SerializedSection s;\r\n  rdim_memzero_struct(&s);\r\n  s.data = data;\r\n  s.encoded_size = s.unpacked_size = size;\r\n  s.encoding = RDI_SectionEncoding_Unpacked;\r\n  return s;\r\n}\r\n\r\nRDI_PROC RDIM_SerializedSectionBundle\r\nrdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results)\r\n{\r\n  RDIM_SerializedSectionBundle bundle;\r\n  rdim_memzero_struct(&bundle);\r\n  bundle.sections[RDI_SectionKind_TopLevelInfo]         = rdim_serialized_section_make_unpacked_struct(&results->top_level_info.top_level_info);\r\n  bundle.sections[RDI_SectionKind_StringData]           = rdim_serialized_section_make_unpacked_array(results->strings.string_data, results->strings.string_data_size);\r\n  bundle.sections[RDI_SectionKind_StringTable]          = rdim_serialized_section_make_unpacked_array(results->strings.string_offs, results->strings.string_offs_count);\r\n  bundle.sections[RDI_SectionKind_IndexRuns]            = rdim_serialized_section_make_unpacked_array(results->idx_runs.idx_runs, results->idx_runs.idx_count);\r\n  bundle.sections[RDI_SectionKind_BinarySections]       = rdim_serialized_section_make_unpacked_array(results->binary_sections.binary_sections, results->binary_sections.binary_sections_count);\r\n  bundle.sections[RDI_SectionKind_FilePathNodes]        = rdim_serialized_section_make_unpacked_array(results->file_paths.nodes, results->file_paths.nodes_count);\r\n  bundle.sections[RDI_SectionKind_SourceFiles]          = rdim_serialized_section_make_unpacked_array(results->src_files.source_files, results->src_files.source_files_count);\r\n  bundle.sections[RDI_SectionKind_LineTables]           = rdim_serialized_section_make_unpacked_array(results->line_tables.line_tables, results->line_tables.line_tables_count);\r\n  bundle.sections[RDI_SectionKind_LineInfoVOffs]        = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_voffs, results->line_tables.line_table_voffs_count);\r\n  bundle.sections[RDI_SectionKind_LineInfoLines]        = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_lines, results->line_tables.line_table_lines_count);\r\n  bundle.sections[RDI_SectionKind_LineInfoColumns]      = rdim_serialized_section_make_unpacked_array(results->line_tables.line_table_columns, results->line_tables.line_table_columns_count);\r\n  bundle.sections[RDI_SectionKind_SourceLineMaps]       = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_maps, results->src_files.source_line_maps_count);\r\n  bundle.sections[RDI_SectionKind_SourceLineMapNumbers] = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_nums, results->src_files.source_line_map_nums_count);\r\n  bundle.sections[RDI_SectionKind_SourceLineMapRanges]  = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_rngs, results->src_files.source_line_map_rngs_count);\r\n  bundle.sections[RDI_SectionKind_SourceLineMapVOffs]   = rdim_serialized_section_make_unpacked_array(results->src_files.source_line_map_voffs, results->src_files.source_line_map_voffs_count);\r\n  bundle.sections[RDI_SectionKind_Units]                = rdim_serialized_section_make_unpacked_array(results->units.units, results->units.units_count);\r\n  bundle.sections[RDI_SectionKind_UnitVMap]             = rdim_serialized_section_make_unpacked_array(results->unit_vmap.vmap.vmap, results->unit_vmap.vmap.count);\r\n  bundle.sections[RDI_SectionKind_TypeNodes]            = rdim_serialized_section_make_unpacked_array(results->type_nodes.type_nodes, results->type_nodes.type_nodes_count);\r\n  bundle.sections[RDI_SectionKind_UDTs]                 = rdim_serialized_section_make_unpacked_array(results->udts.udts, results->udts.udts_count);\r\n  bundle.sections[RDI_SectionKind_Members]              = rdim_serialized_section_make_unpacked_array(results->udts.members, results->udts.members_count);\r\n  bundle.sections[RDI_SectionKind_EnumMembers]          = rdim_serialized_section_make_unpacked_array(results->udts.enum_members, results->udts.enum_members_count);\r\n  bundle.sections[RDI_SectionKind_GlobalVariables]      = rdim_serialized_section_make_unpacked_array(results->global_variables.global_variables, results->global_variables.global_variables_count);\r\n  bundle.sections[RDI_SectionKind_GlobalVMap]           = rdim_serialized_section_make_unpacked_array(results->global_vmap.vmap.vmap, results->global_vmap.vmap.count);\r\n  bundle.sections[RDI_SectionKind_ThreadVariables]      = rdim_serialized_section_make_unpacked_array(results->thread_variables.thread_variables, results->thread_variables.thread_variables_count);\r\n  bundle.sections[RDI_SectionKind_Constants]            = rdim_serialized_section_make_unpacked_array(results->constants.constants, results->constants.constants_count);\r\n  bundle.sections[RDI_SectionKind_Procedures]           = rdim_serialized_section_make_unpacked_array(results->procedures.procedures, results->procedures.procedures_count);\r\n  bundle.sections[RDI_SectionKind_Scopes]               = rdim_serialized_section_make_unpacked_array(results->scopes.scopes, results->scopes.scopes_count);\r\n  bundle.sections[RDI_SectionKind_ScopeVOffData]        = rdim_serialized_section_make_unpacked_array(results->scopes.scope_voffs, results->scopes.scope_voffs_count);\r\n  bundle.sections[RDI_SectionKind_ScopeVMap]            = rdim_serialized_section_make_unpacked_array(results->scope_vmap.vmap.vmap, results->scope_vmap.vmap.count);\r\n  bundle.sections[RDI_SectionKind_InlineSites]          = rdim_serialized_section_make_unpacked_array(results->inline_sites.inline_sites, results->inline_sites.inline_sites_count);\r\n  bundle.sections[RDI_SectionKind_Locals]               = rdim_serialized_section_make_unpacked_array(results->scopes.locals, results->scopes.locals_count);\r\n  bundle.sections[RDI_SectionKind_LocationBlocks]       = rdim_serialized_section_make_unpacked_array(results->location_blocks.location_blocks, results->location_blocks.location_blocks_count);\r\n  bundle.sections[RDI_SectionKind_LocationData]         = rdim_serialized_section_make_unpacked_array(results->locations.location_data, results->locations.location_data_size);\r\n  bundle.sections[RDI_SectionKind_ConstantValueData]    = rdim_serialized_section_make_unpacked_array(results->constants.constant_value_data, results->constants.constant_value_data_size);\r\n  bundle.sections[RDI_SectionKind_ConstantValueTable]   = rdim_serialized_section_make_unpacked_array(results->constants.constant_values, results->constants.constant_values_count);\r\n  bundle.sections[RDI_SectionKind_MD5Checksums]         = rdim_serialized_section_make_unpacked_array(results->checksums.md5s, results->checksums.md5s_count);\r\n  bundle.sections[RDI_SectionKind_SHA1Checksums]        = rdim_serialized_section_make_unpacked_array(results->checksums.sha1s, results->checksums.sha1s_count);\r\n  bundle.sections[RDI_SectionKind_SHA256Checksums]      = rdim_serialized_section_make_unpacked_array(results->checksums.sha256s, results->checksums.sha256s_count);\r\n  bundle.sections[RDI_SectionKind_NameMaps]             = rdim_serialized_section_make_unpacked_array(results->top_level_name_maps.name_maps, results->top_level_name_maps.name_maps_count);\r\n  bundle.sections[RDI_SectionKind_NameMapBuckets]       = rdim_serialized_section_make_unpacked_array(results->name_maps.buckets, results->name_maps.buckets_count);\r\n  bundle.sections[RDI_SectionKind_NameMapNodes]         = rdim_serialized_section_make_unpacked_array(results->name_maps.nodes, results->name_maps.nodes_count);\r\n  return bundle;\r\n}\r\n\r\nRDI_PROC RDIM_String8List\r\nrdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle)\r\n{\r\n  RDIM_String8List strings;\r\n  rdim_memzero_struct(&strings);\r\n  {\r\n    RDIM_Temp scratch = rdim_scratch_begin(&arena, 1);\r\n    \r\n    // rjf: push empty header & data section table\r\n    RDI_Header *rdi_header = rdim_push_array(arena, RDI_Header, 1);\r\n    RDI_Section *rdi_sections = rdim_push_array(arena, RDI_Section, RDI_SectionKind_COUNT);\r\n    rdim_str8_list_push(arena, &strings, rdim_str8_struct(rdi_header));\r\n    rdim_str8_list_push_align(arena, &strings, 8);\r\n    U32 data_section_off = (U32)strings.total_size;\r\n    rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)rdi_sections, sizeof(RDI_Section)*RDI_SectionKind_COUNT));\r\n    \r\n    // rjf: fill baked header\r\n    {\r\n      rdi_header->magic              = RDI_MAGIC_CONSTANT;\r\n      rdi_header->encoding_version   = RDI_ENCODING_VERSION;\r\n      rdi_header->data_section_off   = data_section_off;\r\n      rdi_header->data_section_count = RDI_SectionKind_COUNT;\r\n    }\r\n    \r\n    // rjf: fill baked data section table\r\n    for(RDI_SectionKind k = RDI_SectionKind_NULL; k < RDI_SectionKind_COUNT; k += 1)\r\n    {\r\n      RDI_Section *dst = rdi_sections+k;\r\n      U64 data_section_off = 0;\r\n      if(bundle->sections[k].encoded_size != 0)\r\n      {\r\n        rdim_str8_list_push_align(arena, &strings, 8);\r\n        data_section_off = strings.total_size;\r\n        rdim_str8_list_push(arena, &strings, rdim_str8((RDI_U8 *)bundle->sections[k].data, bundle->sections[k].encoded_size));\r\n      }\r\n      dst->encoding      = bundle->sections[k].encoding;\r\n      dst->off           = data_section_off;\r\n      dst->encoded_size  = bundle->sections[k].encoded_size;\r\n      dst->unpacked_size = bundle->sections[k].unpacked_size;\r\n    }\r\n    \r\n    rdim_scratch_end(scratch);\r\n  }\r\n  return strings;\r\n}\r\n"
  },
  {
    "path": "src/lib_rdi_make/rdi_make.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////////////////////////////////////\r\n// RAD Debug Info Make, (R)AD(D)BG(I) (M)ake Library\r\n//\r\n// Library for building loose data structures which contain\r\n// RDI debug information, and baking that down into the\r\n// proper flattened RDI format.\r\n//\r\n// Requires prior inclusion of the RAD Debug Info, (R)AD(D)BG(I)\r\n// Format Library, in rdi_format.h.\r\n\r\n#ifndef RDI_MAKE_H\r\n#define RDI_MAKE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Overrideable Memory Operations\r\n\r\n// To override the slow/default memset implementation used by the library,\r\n// do the following:\r\n//\r\n// #define RDIM_MEMSET_OVERRIDE\r\n// #define rdim_memset <name of memset implementation>\r\n\r\n#if !defined(rdim_memset)\r\n# define rdim_memset rdim_memset_fallback\r\n#endif\r\n\r\n// To override the slow/default memcpy implementation used by the library,\r\n// do the following:\r\n//\r\n// #define RDIM_MEMCPY_OVERRIDE\r\n// #define rdim_memcpy <name of memcpy implementation>\r\n\r\n#if !defined(rdim_memset)\r\n# define rdim_memset rdim_memset_fallback\r\n#endif\r\n\r\n#if !defined(rdim_memcpy)\r\n# define rdim_memcpy rdim_memcpy_fallback\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Overrideable sprintf Functions\r\n\r\n#if !defined(rdim_vsnprintf)\r\n# include <string.h>\r\n# define rdim_vsnprintf vsnprintf\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Overrideable String View Types\r\n\r\n// To override the string view type used by the library, do the following:\r\n//\r\n// #define RDIM_STRING8_OVERRIDE\r\n// #define RDIM_String8 <name of your string type here>\r\n// #define RDIM_String8_BaseMember <name of base pointer member>\r\n// #define RDIM_String8_SizeMember <name of size member>\r\n\r\n// To override the string view list type used by the library, do the following:\r\n//\r\n// #define RDIM_STRING8LIST_OVERRIDE\r\n// #define RDIM_String8Node <name of your string node here>\r\n// #define RDIM_String8_NextPtrMember <name of member encoding next pointer>\r\n// #define RDIM_String8_StringMember <name of node member containing string view>\r\n// #define RDIM_String8List <name of your string list here>\r\n// #define RDIM_String8_FirstMember <name of member encoding first pointer>\r\n// #define RDIM_String8_LastMember <name of member encoding last pointer>\r\n// #define RDIM_String8_NodeCount <name of U64 list member containing node count>\r\n// #define RDIM_String8_TotalSizeMember <name of U64 list member containing total joined string size>\r\n\r\n#if !defined(RDIM_String8)\r\n#define RDIM_String8 RDIM_String8\r\n#define RDIM_String8_BaseMember str\r\n#define RDIM_String8_SizeMember size\r\ntypedef struct RDIM_String8 RDIM_String8;\r\nstruct RDIM_String8\r\n{\r\n  RDI_U8 *str;\r\n  RDI_U64 size;\r\n};\r\n#endif\r\n\r\n#if !defined(RDIM_String8Node)\r\n#define RDIM_String8Node RDIM_String8Node\r\n#define RDIM_String8Node_NextPtrMember next\r\n#define RDIM_String8Node_StringMember string\r\ntypedef struct RDIM_String8Node RDIM_String8Node;\r\nstruct RDIM_String8Node\r\n{\r\n  RDIM_String8Node *next;\r\n  RDIM_String8 string;\r\n};\r\n#endif\r\n\r\n#if !defined(RDIM_String8List)\r\n#define RDIM_String8List RDIM_String8List\r\n#define RDIM_String8List_FirstMember first\r\n#define RDIM_String8List_LastMember last\r\n#define RDIM_String8List_NodeCountMember node_count\r\n#define RDIM_String8List_TotalSizeMember total_size\r\ntypedef struct RDIM_String8List RDIM_String8List;\r\nstruct RDIM_String8List\r\n{\r\n  RDIM_String8Node *first;\r\n  RDIM_String8Node *last;\r\n  RDI_U64 node_count;\r\n  RDI_U64 total_size;\r\n};\r\n#endif\r\n\r\ntypedef RDI_U32 RDIM_StringMatchFlags;\r\nenum\r\n{\r\n  RDIM_StringMatchFlag_CaseInsensitive = (1<<0),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Overrideable Arena Allocator Types\r\n\r\n// To override the arena allocator type used by the library, do the following:\r\n//\r\n// #define RDIM_ARENA_OVERRIDE\r\n// #define RDIM_Arena <name of your arena type here>\r\n// #define rdim_arena_alloc   <name of your creation function - must be (void) -> Arena*>\r\n// #define rdim_arena_release <name of your release function  - must be (Arena*) -> void>\r\n// #define rdim_arena_pos     <name of your position function - must be (Arena*) -> U64>\r\n// #define rdim_arena_push    <name of your pushing function  - must be (Arena*, U64 size, U64 align, B32 zero) -> void*>\r\n// #define rdim_arena_pop_to  <name of your popping function  - must be (Arena*, U64 pos) -> void>\r\n\r\n#if !defined(RDIM_Arena)\r\n# define RDIM_Arena RDIM_Arena \r\ntypedef struct RDIM_Arena RDIM_Arena;\r\nstruct RDIM_Arena\r\n{\r\n  RDIM_Arena *prev;\r\n  RDIM_Arena *current;\r\n  RDI_U64 base_pos;\r\n  RDI_U64 pos;\r\n  RDI_U64 cmt;\r\n  RDI_U64 res;\r\n  RDI_U64 align;\r\n  RDI_S8 grow;\r\n};\r\n#endif\r\n\r\n#if !defined(rdim_arena_alloc)\r\n# define rdim_arena_alloc rdim_arena_alloc_fallback\r\n#endif\r\n#if !defined(rdim_arena_release)\r\n# define rdim_arena_release rdim_arena_release_fallback\r\n#endif\r\n#if !defined(rdim_arena_pos)\r\n# define rdim_arena_pos rdim_arena_pos_fallback\r\n#endif\r\n#if !defined(rdim_arena_push)\r\n# define rdim_arena_push rdim_arena_push_fallback\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Overrideable Thread-Local Scratch Arenas\r\n\r\n// To override the default thread-local scratch arenas used by the library,\r\n// do the following:\r\n//\r\n// #define RDIM_SCRATCH_OVERRIDE\r\n// #define RDIM_Temp <name of arena temp block type - generally struct: (Arena*, U64)\r\n// #define rdim_temp_arena <name of temp -> arena implementation - must be (Temp) -> (Arena*)>\r\n// #define rdim_scratch_begin <name of scratch begin implementation - must be (Arena **conflicts, U64 conflict_count) -> Temp>\r\n// #define rdim_scratch_end <name of scratch end function - must be (Temp) -> void\r\n\r\n#if !defined(RDIM_Temp)\r\n# define RDIM_Temp RDIM_Temp\r\ntypedef struct RDIM_Temp RDIM_Temp;\r\nstruct RDIM_Temp\r\n{\r\n  RDIM_Arena *arena;\r\n  RDI_U64 pos;\r\n};\r\n#define rdim_temp_arena(t) ((t).arena)\r\n#endif\r\n\r\n#if !defined(rdim_scratch_begin)\r\n# define rdim_scratch_begin rdim_scratch_begin_fallback\r\n#endif\r\n#if !defined(rdim_scratch_end)\r\n# define rdim_scratch_end rdim_scratch_end_fallback\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Overrideable Profile Markup\r\n\r\n// To override the default profiling markup, do the following:\r\n//\r\n// #define RDIM_ProfBegin(...) <some expression, like a function call, to begin profiling some zone>\r\n// #define RDIM_ProfEnd() <some expression, like a function call, to end profiling some zone>\r\n\r\n#if !defined(RDIM_ProfBegin)\r\n# define RDIM_ProfBegin(...) ((void)0)\r\n#endif\r\n#if !defined(RDIM_ProfEnd)\r\n# define RDIM_ProfEnd() ((void)0)\r\n#endif\r\n\r\n#define RDIM_ProfScope(...) for(int _i_ = ((RDIM_ProfBegin(__VA_ARGS__)), 0); !_i_; _i_ += 1, (RDIM_ProfEnd()))\r\n\r\n////////////////////////////////\r\n//~ rjf: Alignment Macros\r\n\r\n#if _MSC_VER\r\n# define RDIM_AlignOf(T) __alignof(T)\r\n#elif __clang__\r\n# define RDIM_AlignOf(T) __alignof(T)\r\n#elif __GNUC__\r\n# define RDIM_AlignOf(T) __alignof__(T)\r\n#else\r\n# error [RDIM Build Error] RDIM_AlignOf(T) is not defined for this compiler.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Linked List Helper Macros\r\n\r\n#define RDIM_CheckNil(nil,p) ((p) == 0 || (p) == nil)\r\n#define RDIM_SetNil(nil,p) ((p) = nil)\r\n\r\n//- rjf: Base Doubly-Linked-List Macros\r\n#define RDIM_DLLInsert_NPZ(nil,f,l,p,n,next,prev) (RDIM_CheckNil(nil,f) ? \\\r\n((f) = (l) = (n), RDIM_SetNil(nil,(n)->next), RDIM_SetNil(nil,(n)->prev)) :\\\r\nRDIM_CheckNil(nil,p) ? \\\r\n((n)->next = (f), (f)->prev = (n), (f) = (n), RDIM_SetNil(nil,(n)->prev)) :\\\r\n((p)==(l)) ? \\\r\n((l)->next = (n), (n)->prev = (l), (l) = (n), RDIM_SetNil(nil, (n)->next)) :\\\r\n(((!RDIM_CheckNil(nil,p) && RDIM_CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p))))\r\n#define RDIM_DLLPushBack_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,f,l,l,n,next,prev)\r\n#define RDIM_DLLPushFront_NPZ(nil,f,l,n,next,prev) RDIM_DLLInsert_NPZ(nil,l,f,f,n,prev,next)\r\n#define RDIM_DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\\\r\n((n) == (l) ? (l) = (l)->prev : (0)),\\\r\n(RDIM_CheckNil(nil,(n)->prev) ? (0) :\\\r\n((n)->prev->next = (n)->next)),\\\r\n(RDIM_CheckNil(nil,(n)->next) ? (0) :\\\r\n((n)->next->prev = (n)->prev)))\r\n\r\n//- rjf: Base Singly-Linked-List Queue Macros\r\n#define RDIM_SLLQueuePush_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\\\r\n((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\\\r\n((l)->next=(n),(l)=(n),RDIM_SetNil(nil,(n)->next)))\r\n#define RDIM_SLLQueuePushFront_NZ(nil,f,l,n,next) (RDIM_CheckNil(nil,f)?\\\r\n((f)=(l)=(n),RDIM_SetNil(nil,(n)->next)):\\\r\n((n)->next=(f),(f)=(n)))\r\n#define RDIM_SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\\\r\n(RDIM_SetNil(nil,f), RDIM_SetNil(nil,l)):\\\r\n((f)=(f)->next))\r\n\r\n//- rjf: Base Singly-Linked-List Stack Macros\r\n#define RDIM_SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n))\r\n#define RDIM_SLLStackPop_N(f,next) ((f)=(f)->next)\r\n\r\n////////////////////////////////\r\n//~ rjf: Convenience Wrappers\r\n\r\n//- rjf: Doubly-Linked-List Wrappers\r\n#define RDIM_DLLInsert_NP(f,l,p,n,next,prev) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev)\r\n#define RDIM_DLLPushBack_NP(f,l,n,next,prev) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev)\r\n#define RDIM_DLLPushFront_NP(f,l,n,next,prev) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev)\r\n#define RDIM_DLLRemove_NP(f,l,n,next,prev) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev)\r\n#define RDIM_DLLInsert(f,l,p,n) RDIM_DLLInsert_NPZ(0,f,l,p,n,next,prev)\r\n#define RDIM_DLLPushBack(f,l,n) RDIM_DLLPushBack_NPZ(0,f,l,n,next,prev)\r\n#define RDIM_DLLPushFront(f,l,n) RDIM_DLLPushFront_NPZ(0,f,l,n,next,prev)\r\n#define RDIM_DLLRemove(f,l,n) RDIM_DLLRemove_NPZ(0,f,l,n,next,prev)\r\n\r\n//- rjf: Singly-Linked-List Queue Wrappers\r\n#define RDIM_SLLQueuePush_N(f,l,n,next) RDIM_SLLQueuePush_NZ(0,f,l,n,next)\r\n#define RDIM_SLLQueuePushFront_N(f,l,n,next) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next)\r\n#define RDIM_SLLQueuePop_N(f,l,next) RDIM_SLLQueuePop_NZ(0,f,l,next)\r\n#define RDIM_SLLQueuePush(f,l,n) RDIM_SLLQueuePush_NZ(0,f,l,n,next)\r\n#define RDIM_SLLQueuePushFront(f,l,n) RDIM_SLLQueuePushFront_NZ(0,f,l,n,next)\r\n#define RDIM_SLLQueuePop(f,l) RDIM_SLLQueuePop_NZ(0,f,l,next)\r\n\r\n//- rjf: Singly-Linked-List Stack Wrappers\r\n#define RDIM_SLLStackPush(f,n) RDIM_SLLStackPush_N(f,n,next)\r\n#define RDIM_SLLStackPop(f) RDIM_SLLStackPop_N(f,next)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helper Macros\r\n\r\n#if defined(_MSC_VER)\r\n# define RDIM_THREAD_LOCAL __declspec(thread)\r\n#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)\r\n# define RDIM_THREAD_LOCAL __thread\r\n#else\r\n# error RDIM_THREAD_LOCAL not defined for this compiler.\r\n#endif\r\n\r\n#if defined(_MSC_VER)\r\n# define rdim_trap() __debugbreak()\r\n#elif defined(__clang__) || defined(__GNUC__) || defined(__GNUG__)\r\n# define rdim_trap() __builtin_trap()\r\n#else\r\n# error \"rdim_trap not defined for this compiler.\"\r\n#endif\r\n\r\n#define rdim_assert_always(x) do{if(!(x)) {rdim_trap();}}while(0)\r\n#if !defined(NDEBUG)\r\n# define rdim_assert(x) rdim_assert_always(x)\r\n#else\r\n# define rdim_assert(x) (void)(x)\r\n#endif\r\n#define rdim_noop ((void)0)\r\n\r\n////////////////////////////////\r\n//~ rjf: RDI Subsets\r\n\r\n#define RDIM_Subset_XList \\\r\nX(BinarySections,              binary_sections)\\\r\nX(Units,                       units)\\\r\nX(Procedures,                  procedures)\\\r\nX(GlobalVariables,             global_variables)\\\r\nX(ThreadVariables,             thread_variables)\\\r\nX(Constants,                   constants)\\\r\nX(Scopes,                      scopes)\\\r\nX(Locals,                      locals)\\\r\nX(Types,                       types)\\\r\nX(UDTs,                        udts)\\\r\nX(LineInfo,                    line_info)\\\r\nX(InlineLineInfo,              inline_line_info)\\\r\nY(GlobalVariableNameMap,       global_variable_name_map)\\\r\nY(ThreadVariableNameMap,       thread_variable_name_map)\\\r\nY(ProcedureNameMap,            procedure_name_map)\\\r\nY(ConstantNameMap,             constant_name_map)\\\r\nY(TypeNameMap,                 type_name_map)\\\r\nY(LinkNameProcedureNameMap,    link_name_procedure_name_map)\\\r\nY(NormalSourcePathNameMap,     normal_source_path_name_map)\\\r\n\r\ntypedef enum RDIM_Subset\r\n{\r\n#define X(name, name_lower) RDIM_Subset_##name,\r\n#define Y(name, name_lower) RDIM_Subset_##name,\r\n  RDIM_Subset_XList\r\n#undef X\r\n#undef Y\r\n}\r\nRDIM_Subset;\r\n\r\ntypedef U32 RDIM_SubsetFlags;\r\nenum\r\n{\r\n#define X(name, name_lower) RDIM_SubsetFlag_##name = (1<<RDIM_Subset_##name),\r\n#define Y(name, name_lower) RDIM_SubsetFlag_##name = (1<<RDIM_Subset_##name),\r\n  RDIM_Subset_XList\r\n#undef X\r\n#undef Y\r\n#define X(name, name_lower)\r\n#define Y(name, name_lower) |RDIM_SubsetFlag_##name\r\n  RDIM_SubsetFlag_NameMaps = 0 RDIM_Subset_XList,\r\n#undef X\r\n#undef Y\r\n  RDIM_SubsetFlag_All = 0xffffffffu,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Auxiliary Data Structure Types\r\n\r\n//- rjf: 1-dimensional U64 ranges\r\n\r\ntypedef struct RDIM_Rng1U64 RDIM_Rng1U64;\r\nstruct RDIM_Rng1U64\r\n{\r\n  RDI_U64 min;\r\n  RDI_U64 max;\r\n};\r\n\r\ntypedef struct RDIM_Rng1U64Node RDIM_Rng1U64Node;\r\nstruct RDIM_Rng1U64Node\r\n{\r\n  RDIM_Rng1U64Node *next;\r\n  RDIM_Rng1U64 v;\r\n};\r\n\r\ntypedef struct RDIM_Rng1U64List RDIM_Rng1U64List;\r\nstruct RDIM_Rng1U64List\r\n{\r\n  RDIM_Rng1U64Node *first;\r\n  RDIM_Rng1U64Node *last;\r\n  RDI_U64 count;\r\n  RDI_U64 min;\r\n};\r\n\r\ntypedef struct RDIM_Rng1U64ChunkNode RDIM_Rng1U64ChunkNode;\r\nstruct RDIM_Rng1U64ChunkNode\r\n{\r\n  RDIM_Rng1U64ChunkNode *next;\r\n  RDIM_Rng1U64 *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n};\r\n\r\ntypedef struct RDIM_Rng1U64ChunkList RDIM_Rng1U64ChunkList;\r\nstruct RDIM_Rng1U64ChunkList\r\n{\r\n  RDIM_Rng1U64ChunkNode *first;\r\n  RDIM_Rng1U64ChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 min;\r\n};\r\n\r\n//- rjf: u64 -> pointer map\r\n\r\ntypedef struct RDIM_U64ToPtrNode RDIM_U64ToPtrNode;\r\nstruct RDIM_U64ToPtrNode\r\n{\r\n  RDIM_U64ToPtrNode *next;\r\n  RDI_U64 _padding_;\r\n  RDI_U64 key[1];\r\n  void *ptr[1];\r\n};\r\n\r\ntypedef struct RDIM_U64ToPtrMap RDIM_U64ToPtrMap;\r\nstruct RDIM_U64ToPtrMap\r\n{\r\n  RDIM_U64ToPtrNode **buckets;\r\n  RDI_U64 buckets_count;\r\n  RDI_U64 bucket_collision_count;\r\n  RDI_U64 pair_count;\r\n};\r\n\r\ntypedef struct RDIM_U64ToPtrLookup RDIM_U64ToPtrLookup;\r\nstruct RDIM_U64ToPtrLookup\r\n{\r\n  void *match;\r\n  RDIM_U64ToPtrNode *fill_node;\r\n  RDI_U32 fill_k;\r\n};\r\n\r\n//- rjf: string8 -> pointer map\r\n\r\ntypedef struct RDIM_Str8ToPtrNode RDIM_Str8ToPtrNode;\r\nstruct RDIM_Str8ToPtrNode\r\n{\r\n  struct RDIM_Str8ToPtrNode *next;\r\n  RDIM_String8 key;\r\n  RDI_U64 hash;\r\n  void *ptr;\r\n};\r\n\r\ntypedef struct RDIM_Str8ToPtrMap RDIM_Str8ToPtrMap;\r\nstruct RDIM_Str8ToPtrMap\r\n{\r\n  RDIM_Str8ToPtrNode **buckets;\r\n  RDI_U64 buckets_count;\r\n  RDI_U64 bucket_collision_count;\r\n  RDI_U64 pair_count;\r\n};\r\n\r\n//- rjf: sortable range data structure\r\n\r\ntypedef struct RDIM_SortKey RDIM_SortKey;\r\nstruct RDIM_SortKey\r\n{\r\n  RDI_U64 key;\r\n  void *val;\r\n};\r\n\r\ntypedef struct RDIM_OrderedRange RDIM_OrderedRange;\r\nstruct RDIM_OrderedRange\r\n{\r\n  RDIM_OrderedRange *next;\r\n  RDI_U64 first;\r\n  RDI_U64 opl;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Error/Warning/Note Message Types\r\n\r\ntypedef struct RDIM_Msg RDIM_Msg;\r\nstruct RDIM_Msg\r\n{\r\n  RDIM_Msg *next;\r\n  RDIM_String8 string;\r\n};\r\n\r\ntypedef struct RDIM_MsgList RDIM_MsgList;\r\nstruct RDIM_MsgList\r\n{\r\n  RDIM_Msg *first;\r\n  RDIM_Msg *last;\r\n  RDI_U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Debug Info Types\r\n\r\ntypedef struct RDIM_TopLevelInfo RDIM_TopLevelInfo;\r\nstruct RDIM_TopLevelInfo\r\n{\r\n  RDI_Arch arch;\r\n  RDIM_String8 exe_name;\r\n  RDI_U64 exe_hash;\r\n  RDI_U64 voff_max;\r\n  RDI_GUID guid;\r\n  RDIM_String8 producer_name;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Binary Section Types\r\n\r\ntypedef struct RDIM_BinarySection RDIM_BinarySection;\r\nstruct RDIM_BinarySection\r\n{\r\n  RDIM_String8 name;\r\n  RDI_BinarySectionFlags flags;\r\n  RDI_U64 voff_first;\r\n  RDI_U64 voff_opl;\r\n  RDI_U64 foff_first;\r\n  RDI_U64 foff_opl;\r\n};\r\n\r\ntypedef struct RDIM_BinarySectionNode RDIM_BinarySectionNode;\r\nstruct RDIM_BinarySectionNode\r\n{\r\n  RDIM_BinarySectionNode *next;\r\n  RDIM_BinarySection v;\r\n};\r\n\r\ntypedef struct RDIM_BinarySectionList RDIM_BinarySectionList;\r\nstruct RDIM_BinarySectionList\r\n{\r\n  RDIM_BinarySectionNode *first;\r\n  RDIM_BinarySectionNode *last;\r\n  RDI_U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Source File Info Types\r\n\r\ntypedef struct RDIM_SrcFileLineMapFragment RDIM_SrcFileLineMapFragment;\r\nstruct RDIM_SrcFileLineMapFragment\r\n{\r\n  RDIM_SrcFileLineMapFragment *next;\r\n  struct RDIM_LineSequence *seq;\r\n};\r\n\r\ntypedef struct RDIM_SrcFile RDIM_SrcFile;\r\nstruct RDIM_SrcFile\r\n{\r\n  struct RDIM_SrcFileChunkNode *chunk;\r\n  RDIM_String8 path;\r\n  RDIM_SrcFileLineMapFragment *first_line_map_fragment;\r\n  RDIM_SrcFileLineMapFragment *last_line_map_fragment;\r\n  RDI_U64 total_line_count;\r\n  RDI_ChecksumKind checksum_kind;\r\n  RDIM_String8 checksum;\r\n};\r\n\r\ntypedef struct RDIM_SrcFileChunkNode RDIM_SrcFileChunkNode;\r\nstruct RDIM_SrcFileChunkNode\r\n{\r\n  RDIM_SrcFileChunkNode *next;\r\n  RDIM_SrcFile *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct  RDIM_SrcFileChunkList RDIM_SrcFileChunkList;\r\nstruct RDIM_SrcFileChunkList\r\n{\r\n  RDIM_SrcFileChunkNode *first;\r\n  RDIM_SrcFileChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 source_line_map_count;\r\n  RDI_U64 total_line_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Line Info Types\r\n\r\ntypedef struct RDIM_LineSequence RDIM_LineSequence;\r\nstruct RDIM_LineSequence\r\n{\r\n  RDIM_SrcFile *src_file;\r\n  RDI_U64 *voffs;     // [line_count + 1] (sorted)\r\n  RDI_U32 *line_nums; // [line_count]\r\n  RDI_U16 *col_nums;  // [2*line_count]\r\n  RDI_U64 line_count;\r\n};\r\n\r\ntypedef struct RDIM_LineSequenceNode RDIM_LineSequenceNode;\r\nstruct RDIM_LineSequenceNode\r\n{\r\n  RDIM_LineSequenceNode *next;\r\n  RDIM_LineSequence v;\r\n};\r\n\r\ntypedef struct RDIM_LineTable RDIM_LineTable;\r\nstruct RDIM_LineTable\r\n{\r\n  struct RDIM_LineTableChunkNode *chunk;\r\n  RDIM_LineSequenceNode *first_seq;\r\n  RDIM_LineSequenceNode *last_seq;\r\n  RDI_U64 seq_count;\r\n  RDI_U64 line_count;\r\n  RDI_U64 col_count;\r\n};\r\n\r\ntypedef struct RDIM_LineTableChunkNode RDIM_LineTableChunkNode;\r\nstruct RDIM_LineTableChunkNode\r\n{\r\n  RDIM_LineTableChunkNode *next;\r\n  RDIM_LineTable *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_LineTableChunkList RDIM_LineTableChunkList;\r\nstruct RDIM_LineTableChunkList\r\n{\r\n  RDIM_LineTableChunkNode *first;\r\n  RDIM_LineTableChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 total_seq_count;\r\n  RDI_U64 total_line_count;\r\n  RDI_U64 total_col_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Per-Compilation-Unit Info Types\r\n\r\ntypedef struct RDIM_Unit RDIM_Unit;\r\nstruct RDIM_Unit\r\n{\r\n  struct RDIM_UnitChunkNode *chunk;\r\n  RDIM_String8 unit_name;\r\n  RDIM_String8 compiler_name;\r\n  RDIM_String8 source_file;\r\n  RDIM_String8 object_file;\r\n  RDIM_String8 archive_file;\r\n  RDIM_String8 build_path;\r\n  RDI_Language language;\r\n  RDIM_LineTable *line_table;\r\n  RDIM_Rng1U64ChunkList voff_ranges;\r\n};\r\n\r\ntypedef struct RDIM_UnitChunkNode RDIM_UnitChunkNode;\r\nstruct RDIM_UnitChunkNode\r\n{\r\n  RDIM_UnitChunkNode *next;\r\n  RDIM_Unit *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_UnitChunkList RDIM_UnitChunkList;\r\nstruct RDIM_UnitChunkList\r\n{\r\n  RDIM_UnitChunkNode *first;\r\n  RDIM_UnitChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type System Node Types\r\n\r\ntypedef RDI_U32 RDIM_DataModel;\r\ntypedef enum RDIM_DataModelEnum\r\n{\r\n  RDIM_DataModel_Null,\r\n  RDIM_DataModel_ILP32,\r\n  RDIM_DataModel_LLP64,\r\n  RDIM_DataModel_LP64,\r\n  RDIM_DataModel_ILP64,\r\n  RDIM_DataModel_SILP64\r\n}\r\nRDIM_DataModelEnum;\r\n\r\ntypedef struct RDIM_Type RDIM_Type;\r\nstruct RDIM_Type\r\n{\r\n  struct RDIM_TypeChunkNode *chunk;\r\n  RDI_TypeKind kind;\r\n  RDI_U32 byte_size;\r\n  RDI_U32 flags;\r\n  RDI_U32 off;\r\n  RDI_U32 count;\r\n  RDIM_String8 name;\r\n  RDIM_String8 link_name;\r\n  RDIM_Type *direct_type;\r\n  RDIM_Type **param_types;\r\n  struct RDIM_UDT *udt;\r\n};\r\n\r\ntypedef struct RDIM_TypeNode RDIM_TypeNode;\r\nstruct RDIM_TypeNode\r\n{\r\n  struct RDIM_TypeNode *next;\r\n  RDIM_Type *v;\r\n};\r\n\r\ntypedef struct RDIM_TypeList RDIM_TypeList;\r\nstruct RDIM_TypeList\r\n{\r\n  U64            count;\r\n  RDIM_TypeNode *first;\r\n  RDIM_TypeNode *last;\r\n};\r\n\r\ntypedef struct RDIM_TypeChunkNode RDIM_TypeChunkNode;\r\nstruct RDIM_TypeChunkNode\r\n{\r\n  RDIM_TypeChunkNode *next;\r\n  RDIM_Type *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_TypeChunkList RDIM_TypeChunkList;\r\nstruct RDIM_TypeChunkList\r\n{\r\n  RDIM_TypeChunkNode *first;\r\n  RDIM_TypeChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: User-Defined-Type Info Types\r\n\r\n//- rjf: UDT members\r\n\r\ntypedef struct RDIM_UDTMember RDIM_UDTMember;\r\nstruct RDIM_UDTMember\r\n{\r\n  RDIM_UDTMember *next;\r\n  RDI_MemberKind kind;\r\n  RDIM_String8 name;\r\n  RDIM_Type *type;\r\n  RDI_U32 off;\r\n};\r\n\r\n//- rjf: UDT enum values\r\n\r\ntypedef struct RDIM_UDTEnumVal RDIM_UDTEnumVal;\r\nstruct RDIM_UDTEnumVal\r\n{\r\n  RDIM_UDTEnumVal *next;\r\n  RDIM_String8 name;\r\n  RDI_U64 val;\r\n};\r\n\r\n//- rjf: UDTs\r\n\r\ntypedef struct RDIM_UDT RDIM_UDT;\r\nstruct RDIM_UDT\r\n{\r\n  struct RDIM_UDTChunkNode *chunk;\r\n  RDIM_Type *self_type;\r\n  RDIM_UDTMember *first_member;\r\n  RDIM_UDTMember *last_member;\r\n  RDIM_UDTEnumVal *first_enum_val;\r\n  RDIM_UDTEnumVal *last_enum_val;\r\n  RDI_U32 member_count;\r\n  RDI_U32 enum_val_count;\r\n  RDIM_SrcFile *src_file;\r\n  RDI_U32 line;\r\n  RDI_U32 col;\r\n};\r\n\r\ntypedef struct RDIM_UDTChunkNode RDIM_UDTChunkNode;\r\nstruct RDIM_UDTChunkNode\r\n{\r\n  RDIM_UDTChunkNode *next;\r\n  RDIM_UDT *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_UDTChunkList RDIM_UDTChunkList;\r\nstruct RDIM_UDTChunkList\r\n{\r\n  RDIM_UDTChunkNode *first;\r\n  RDIM_UDTChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 total_member_count;\r\n  RDI_U64 total_enum_val_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Location Info Types\r\n\r\n//- rjf: bytecode types\r\n\r\ntypedef struct RDIM_EvalBytecodeOp RDIM_EvalBytecodeOp;\r\nstruct RDIM_EvalBytecodeOp\r\n{\r\n  RDIM_EvalBytecodeOp *next;\r\n  RDI_EvalOp op;\r\n  RDI_U32 p_size;\r\n  RDI_U64 p;\r\n};\r\n\r\ntypedef struct RDIM_EvalBytecode RDIM_EvalBytecode;\r\nstruct RDIM_EvalBytecode\r\n{\r\n  RDIM_EvalBytecodeOp *first_op;\r\n  RDIM_EvalBytecodeOp *last_op;\r\n  RDI_U32 op_count;\r\n  RDI_U32 encoded_size;\r\n};\r\n\r\n//- rjf: location types\r\n\r\ntypedef struct RDIM_LocationInfo RDIM_LocationInfo;\r\nstruct RDIM_LocationInfo\r\n{\r\n  RDI_LocationKind kind;\r\n  RDI_U8 reg_code;\r\n  RDI_U16 offset;\r\n  RDIM_EvalBytecode bytecode;\r\n};\r\n\r\ntypedef struct RDIM_Location RDIM_Location;\r\nstruct RDIM_Location\r\n{\r\n  struct RDIM_LocationChunkNode *chunk;\r\n  RDIM_LocationInfo info;\r\n  RDI_U64 relative_encoding_off;\r\n};\r\n\r\ntypedef struct RDIM_LocationChunkNode RDIM_LocationChunkNode;\r\nstruct RDIM_LocationChunkNode\r\n{\r\n  RDIM_LocationChunkNode *next;\r\n  RDIM_Location *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n  RDI_U64 base_encoding_off;\r\n  RDI_U64 encoded_size;\r\n};\r\n\r\ntypedef struct RDIM_LocationChunkList RDIM_LocationChunkList;\r\nstruct RDIM_LocationChunkList\r\n{\r\n  RDIM_LocationChunkNode *first;\r\n  RDIM_LocationChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 total_encoded_size;\r\n};\r\n\r\n//- rjf: location cases\r\n\r\ntypedef struct RDIM_LocationCase RDIM_LocationCase;\r\nstruct RDIM_LocationCase\r\n{\r\n  RDIM_LocationCase *next;\r\n  RDIM_Location *location;\r\n  RDIM_Rng1U64 voff_range;\r\n};\r\n\r\ntypedef struct RDIM_LocationCaseList RDIM_LocationCaseList;\r\nstruct RDIM_LocationCaseList\r\n{\r\n  RDIM_LocationCase *first;\r\n  RDIM_LocationCase *last;\r\n  RDI_U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Symbol Info Types\r\n\r\ntypedef struct RDIM_Symbol RDIM_Symbol;\r\nstruct RDIM_Symbol\r\n{\r\n  struct RDIM_SymbolChunkNode *chunk;\r\n  RDI_S32 is_extern;\r\n  RDIM_String8 name;\r\n  RDIM_String8 link_name;\r\n  RDIM_Type *type;\r\n  RDI_U64 offset;\r\n  RDIM_Symbol *container_symbol;\r\n  RDIM_Type *container_type;\r\n  struct RDIM_Scope *root_scope;\r\n  RDIM_LocationCaseList location_cases;\r\n  RDIM_String8 value_data;\r\n};\r\n\r\ntypedef struct RDIM_SymbolChunkNode RDIM_SymbolChunkNode;\r\nstruct RDIM_SymbolChunkNode\r\n{\r\n  RDIM_SymbolChunkNode *next;\r\n  RDIM_Symbol *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_SymbolChunkList RDIM_SymbolChunkList;\r\nstruct RDIM_SymbolChunkList\r\n{\r\n  RDIM_SymbolChunkNode *first;\r\n  RDIM_SymbolChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 total_value_data_size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Inline Site Info Types\r\n\r\ntypedef struct RDIM_InlineSite RDIM_InlineSite;\r\nstruct RDIM_InlineSite\r\n{\r\n  struct RDIM_InlineSiteChunkNode *chunk;\r\n  RDIM_String8 name;\r\n  RDIM_Type *type;\r\n  RDIM_Type *owner;\r\n  RDIM_LineTable *line_table;\r\n};\r\n\r\ntypedef struct RDIM_InlineSiteChunkNode RDIM_InlineSiteChunkNode;\r\nstruct RDIM_InlineSiteChunkNode\r\n{\r\n  RDIM_InlineSiteChunkNode *next;\r\n  RDIM_InlineSite *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_InlineSiteChunkList RDIM_InlineSiteChunkList;\r\nstruct RDIM_InlineSiteChunkList\r\n{\r\n  RDIM_InlineSiteChunkNode *first;\r\n  RDIM_InlineSiteChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Scope Info Types\r\n\r\ntypedef struct RDIM_Local RDIM_Local;\r\nstruct RDIM_Local\r\n{\r\n  RDIM_Local *next;\r\n  RDI_LocalKind kind;\r\n  RDIM_String8 name;\r\n  RDIM_Type *type;\r\n  RDIM_LocationCaseList location_cases;\r\n};\r\n\r\ntypedef struct RDIM_Scope RDIM_Scope;\r\nstruct RDIM_Scope\r\n{\r\n  struct RDIM_ScopeChunkNode *chunk;\r\n  RDIM_Symbol *symbol;\r\n  RDIM_Scope *parent_scope;\r\n  RDIM_Scope *first_child;\r\n  RDIM_Scope *last_child;\r\n  RDIM_Scope *next_sibling;\r\n  RDIM_Rng1U64List voff_ranges;\r\n  RDIM_Local *first_local;\r\n  RDIM_Local *last_local;\r\n  RDI_U32 local_count;\r\n  RDIM_InlineSite *inline_site;\r\n};\r\n\r\ntypedef struct RDIM_ScopeChunkNode RDIM_ScopeChunkNode;\r\nstruct RDIM_ScopeChunkNode\r\n{\r\n  RDIM_ScopeChunkNode *next;\r\n  RDIM_Scope *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_ScopeChunkList RDIM_ScopeChunkList;\r\nstruct RDIM_ScopeChunkList\r\n{\r\n  RDIM_ScopeChunkNode *first;\r\n  RDIM_ScopeChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n  RDI_U64 scope_voff_count;\r\n  RDI_U64 local_count;\r\n  RDI_U64 location_case_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Baking Types\r\n\r\n//- rjf: baking parameters\r\n\r\ntypedef struct RDIM_BakeParams RDIM_BakeParams;\r\nstruct RDIM_BakeParams\r\n{\r\n  RDIM_SubsetFlags subset_flags;\r\n  RDIM_TopLevelInfo top_level_info;\r\n  RDIM_BinarySectionList binary_sections;\r\n  RDIM_UnitChunkList units;\r\n  RDIM_TypeChunkList types;\r\n  RDIM_UDTChunkList udts;\r\n  RDIM_SrcFileChunkList src_files;\r\n  RDIM_LineTableChunkList line_tables;\r\n  RDIM_LocationChunkList locations;\r\n  RDIM_SymbolChunkList global_variables;\r\n  RDIM_SymbolChunkList thread_variables;\r\n  RDIM_SymbolChunkList constants;\r\n  RDIM_SymbolChunkList procedures;\r\n  RDIM_ScopeChunkList scopes;\r\n  RDIM_InlineSiteChunkList inline_sites;\r\n};\r\n\r\n//- rjf: data sections\r\n\r\ntypedef struct RDIM_BakeSection RDIM_BakeSection;\r\nstruct RDIM_BakeSection\r\n{\r\n  void *data;\r\n  RDI_SectionEncoding encoding;\r\n  RDI_U64 encoded_size;\r\n  RDI_U64 unpacked_size;\r\n  RDI_SectionKind tag;\r\n  RDI_U64 tag_idx;\r\n};\r\n\r\ntypedef struct RDIM_BakeSectionNode RDIM_BakeSectionNode;\r\nstruct RDIM_BakeSectionNode\r\n{\r\n  RDIM_BakeSectionNode *next;\r\n  RDIM_BakeSection v;\r\n};\r\n\r\ntypedef struct RDIM_BakeSectionList RDIM_BakeSectionList;\r\nstruct RDIM_BakeSectionList\r\n{\r\n  RDIM_BakeSectionNode *first;\r\n  RDIM_BakeSectionNode *last;\r\n  RDI_U64 count;\r\n};\r\n\r\n//- rjf: interned string type\r\n\r\ntypedef struct RDIM_BakeString RDIM_BakeString;\r\nstruct RDIM_BakeString\r\n{\r\n  RDI_U64 hash;\r\n  RDIM_String8 string;\r\n};\r\n\r\ntypedef struct RDIM_BakeStringChunkNode RDIM_BakeStringChunkNode;\r\nstruct RDIM_BakeStringChunkNode\r\n{\r\n  RDIM_BakeStringChunkNode *next;\r\n  RDIM_BakeString *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_BakeStringChunkList RDIM_BakeStringChunkList;\r\nstruct RDIM_BakeStringChunkList\r\n{\r\n  RDIM_BakeStringChunkNode *first;\r\n  RDIM_BakeStringChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeStringMapTopology RDIM_BakeStringMapTopology;\r\nstruct RDIM_BakeStringMapTopology\r\n{\r\n  RDI_U64 slots_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeStringMapBaseIndices RDIM_BakeStringMapBaseIndices;\r\nstruct RDIM_BakeStringMapBaseIndices\r\n{\r\n  RDI_U64 *slots_base_idxs;\r\n};\r\n\r\ntypedef struct RDIM_BakeStringMapLoose RDIM_BakeStringMapLoose;\r\nstruct RDIM_BakeStringMapLoose\r\n{\r\n  RDIM_BakeStringChunkList **slots;\r\n};\r\n\r\ntypedef struct RDIM_BakeStringMapTight RDIM_BakeStringMapTight;\r\nstruct RDIM_BakeStringMapTight\r\n{\r\n  RDIM_BakeStringChunkList *slots;\r\n  RDI_U64 *slots_base_idxs;\r\n  RDI_U64 slots_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\n//- rjf: index runs\r\n\r\ntypedef struct RDIM_BakeIdxRun RDIM_BakeIdxRun;\r\nstruct RDIM_BakeIdxRun\r\n{\r\n  RDI_U64 hash;\r\n  RDI_U64 count;\r\n  RDI_U32 *idxes;\r\n};\r\n\r\ntypedef struct RDIM_BakeIdxRunChunkNode RDIM_BakeIdxRunChunkNode;\r\nstruct RDIM_BakeIdxRunChunkNode\r\n{\r\n  RDIM_BakeIdxRunChunkNode *next;\r\n  RDIM_BakeIdxRun *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n};\r\n\r\ntypedef struct RDIM_BakeIdxRunChunkList RDIM_BakeIdxRunChunkList;\r\nstruct RDIM_BakeIdxRunChunkList\r\n{\r\n  RDIM_BakeIdxRunChunkNode *first;\r\n  RDIM_BakeIdxRunChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeIdxRunMapTopology RDIM_BakeIdxRunMapTopology;\r\nstruct RDIM_BakeIdxRunMapTopology\r\n{\r\n  RDI_U64 slots_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeIdxRunMapLoose RDIM_BakeIdxRunMapLoose;\r\nstruct RDIM_BakeIdxRunMapLoose\r\n{\r\n  RDIM_BakeIdxRunChunkList **slots;\r\n  RDI_U64 *slots_idx_counts;\r\n};\r\n\r\ntypedef struct RDIM_BakeIdxRunMap RDIM_BakeIdxRunMap;\r\nstruct RDIM_BakeIdxRunMap\r\n{\r\n  RDIM_BakeIdxRunChunkList *slots;\r\n  RDI_U64 *slots_base_idxs; // NOTE(rjf): [slots_count+1], [slots_count] holds total count\r\n  RDI_U64 slots_count;\r\n};\r\n\r\n//- rjf: source info & path tree\r\n\r\ntypedef struct RDIM_BakePathNode RDIM_BakePathNode;\r\nstruct RDIM_BakePathNode\r\n{\r\n  RDIM_BakePathNode *next_order;\r\n  RDIM_BakePathNode *parent;\r\n  RDIM_BakePathNode *first_child;\r\n  RDIM_BakePathNode *last_child;\r\n  RDIM_BakePathNode *next_sibling;\r\n  RDIM_String8 name;\r\n  RDIM_SrcFile *src_file;\r\n  RDI_U32 idx;\r\n};\r\n\r\ntypedef struct RDIM_BakeLineMapFragment RDIM_BakeLineMapFragment;\r\nstruct RDIM_BakeLineMapFragment\r\n{\r\n  RDIM_BakeLineMapFragment *next;\r\n  RDIM_LineSequence *seq;\r\n};\r\n\r\ntypedef struct RDIM_BakePathTree RDIM_BakePathTree;\r\nstruct RDIM_BakePathTree\r\n{\r\n  RDIM_BakePathNode root;\r\n  RDIM_BakePathNode *first;\r\n  RDIM_BakePathNode *last;\r\n  RDI_U32 count;\r\n};\r\n\r\n//- rjf: name maps\r\n\r\ntypedef struct RDIM_BakeName RDIM_BakeName;\r\nstruct RDIM_BakeName\r\n{\r\n  RDIM_String8 string;\r\n  RDI_U64 hash;\r\n  RDI_U64 idx;\r\n};\r\n\r\ntypedef struct RDIM_BakeNameChunkNode RDIM_BakeNameChunkNode;\r\nstruct RDIM_BakeNameChunkNode\r\n{\r\n  RDIM_BakeNameChunkNode *next;\r\n  RDIM_BakeName *v;\r\n  RDI_U64 count;\r\n  RDI_U64 cap;\r\n  RDI_U64 base_idx;\r\n};\r\n\r\ntypedef struct RDIM_BakeNameChunkList RDIM_BakeNameChunkList;\r\nstruct RDIM_BakeNameChunkList\r\n{\r\n  RDIM_BakeNameChunkNode *first;\r\n  RDIM_BakeNameChunkNode *last;\r\n  RDI_U64 chunk_count;\r\n  RDI_U64 total_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeNameMapTopology RDIM_BakeNameMapTopology;\r\nstruct RDIM_BakeNameMapTopology\r\n{\r\n  RDI_U64 slots_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeNameMap RDIM_BakeNameMap;\r\nstruct RDIM_BakeNameMap\r\n{\r\n  RDIM_BakeNameChunkList **slots;\r\n};\r\n\r\n//- rjf: vmaps\r\n\r\ntypedef struct RDIM_BakeVMap RDIM_BakeVMap;\r\nstruct RDIM_BakeVMap\r\n{\r\n  RDI_VMapEntry *vmap; // [count + 1]\r\n  RDI_U32 count;\r\n};\r\n\r\ntypedef struct RDIM_VMapMarker RDIM_VMapMarker;\r\nstruct RDIM_VMapMarker\r\n{\r\n  RDI_U32 idx;\r\n  RDI_U32 begin_range;\r\n};\r\n\r\n//- rjf: source line maps\r\n\r\ntypedef struct RDIM_BakeSrcLineMapNode RDIM_BakeSrcLineMapNode;\r\nstruct RDIM_BakeSrcLineMapNode\r\n{\r\n  RDIM_BakeSrcLineMapNode *next;\r\n  RDI_U32 line_num;\r\n  RDIM_Rng1U64List voff_ranges;\r\n};\r\n\r\ntypedef struct RDIM_BakeSrcLineMapSlot RDIM_BakeSrcLineMapSlot;\r\nstruct RDIM_BakeSrcLineMapSlot\r\n{\r\n  RDIM_BakeSrcLineMapNode *first;\r\n  RDIM_BakeSrcLineMapNode *last;\r\n};\r\n\r\ntypedef struct RDIM_BakeSrcLineMap RDIM_BakeSrcLineMap;\r\nstruct RDIM_BakeSrcLineMap\r\n{\r\n  RDIM_BakeSrcLineMapSlot *slots;\r\n  RDI_U64 slots_count;\r\n  RDI_U64 line_count;\r\n  RDI_U64 voff_range_count;\r\n};\r\n\r\n//- rjf: line table records\r\n\r\ntypedef struct RDIM_LineRec RDIM_LineRec;\r\nstruct RDIM_LineRec\r\n{\r\n  RDI_U32 file_id;\r\n  RDI_U32 line_num;\r\n  RDI_U16 col_first;\r\n  RDI_U16 col_opl;\r\n};\r\n\r\n//- rjf: baking results\r\n\r\ntypedef struct RDIM_TopLevelInfoBakeResult RDIM_TopLevelInfoBakeResult;\r\nstruct RDIM_TopLevelInfoBakeResult\r\n{\r\n  RDI_TopLevelInfo top_level_info;\r\n};\r\n\r\ntypedef struct RDIM_BinarySectionBakeResult RDIM_BinarySectionBakeResult;\r\nstruct RDIM_BinarySectionBakeResult\r\n{\r\n  RDI_BinarySection *binary_sections;\r\n  RDI_U64 binary_sections_count;\r\n};\r\n\r\ntypedef struct RDIM_UnitBakeResult RDIM_UnitBakeResult;\r\nstruct RDIM_UnitBakeResult\r\n{\r\n  RDI_Unit *units;\r\n  RDI_U64 units_count;\r\n};\r\n\r\ntypedef struct RDIM_UnitVMapBakeResult RDIM_UnitVMapBakeResult;\r\nstruct RDIM_UnitVMapBakeResult\r\n{\r\n  RDIM_BakeVMap vmap;\r\n};\r\n\r\ntypedef struct RDIM_SrcFileBakeResult RDIM_SrcFileBakeResult;\r\nstruct RDIM_SrcFileBakeResult\r\n{\r\n  RDI_SourceFile *source_files;\r\n  RDI_U64 source_files_count;\r\n  RDI_SourceLineMap *source_line_maps;\r\n  RDI_U64 source_line_maps_count;\r\n  RDI_U32 *source_line_map_nums;\r\n  RDI_U32 *source_line_map_rngs;\r\n  RDI_U64 *source_line_map_voffs;\r\n  RDI_U64 source_line_map_nums_count;\r\n  RDI_U64 source_line_map_rngs_count;\r\n  RDI_U64 source_line_map_voffs_count;\r\n};\r\n\r\ntypedef struct RDIM_ChecksumBakeResult RDIM_ChecksumBakeResult;\r\nstruct RDIM_ChecksumBakeResult\r\n{\r\n  RDI_MD5 *md5s;\r\n  RDI_U64 md5s_count;\r\n  RDI_SHA1 *sha1s;\r\n  RDI_U64 sha1s_count;\r\n  RDI_SHA256 *sha256s;\r\n  RDI_U64 sha256s_count;\r\n  RDI_U64 *timestamps;\r\n  RDI_U64 timestamps_count;\r\n};\r\n\r\ntypedef struct RDIM_LineTableBakeResult RDIM_LineTableBakeResult;\r\nstruct RDIM_LineTableBakeResult\r\n{\r\n  RDI_LineTable *line_tables;\r\n  RDI_U64 line_tables_count;\r\n  RDI_U64 *line_table_voffs;\r\n  RDI_U64 line_table_voffs_count;\r\n  RDI_Line *line_table_lines;\r\n  RDI_U64 line_table_lines_count;\r\n  RDI_Column *line_table_columns;\r\n  RDI_U64 line_table_columns_count;\r\n};\r\n\r\ntypedef struct RDIM_TypeNodeBakeResult RDIM_TypeNodeBakeResult;\r\nstruct RDIM_TypeNodeBakeResult\r\n{\r\n  RDI_TypeNode *type_nodes;\r\n  RDI_U64 type_nodes_count;\r\n};\r\n\r\ntypedef struct RDIM_UDTBakeResult RDIM_UDTBakeResult;\r\nstruct RDIM_UDTBakeResult\r\n{\r\n  RDI_UDT *udts;\r\n  RDI_U64 udts_count;\r\n  RDI_Member *members;\r\n  RDI_U64 members_count;\r\n  RDI_EnumMember *enum_members;\r\n  RDI_U64 enum_members_count;\r\n};\r\n\r\ntypedef struct RDIM_LocationBakeResult RDIM_LocationBakeResult;\r\nstruct RDIM_LocationBakeResult\r\n{\r\n  RDI_U8 *location_data;\r\n  RDI_U64 location_data_size;\r\n};\r\n\r\ntypedef struct RDIM_LocationBlockBakeResult RDIM_LocationBlockBakeResult;\r\nstruct RDIM_LocationBlockBakeResult\r\n{\r\n  RDI_LocationBlock *location_blocks;\r\n  RDI_U64 location_blocks_count;\r\n};\r\n\r\ntypedef struct RDIM_GlobalVariableBakeResult RDIM_GlobalVariableBakeResult;\r\nstruct RDIM_GlobalVariableBakeResult\r\n{\r\n  RDI_GlobalVariable *global_variables;\r\n  RDI_U64 global_variables_count;\r\n};\r\n\r\ntypedef struct RDIM_GlobalVMapBakeResult RDIM_GlobalVMapBakeResult;\r\nstruct RDIM_GlobalVMapBakeResult\r\n{\r\n  RDIM_BakeVMap vmap;\r\n};\r\n\r\ntypedef struct RDIM_ThreadVariableBakeResult RDIM_ThreadVariableBakeResult;\r\nstruct RDIM_ThreadVariableBakeResult\r\n{\r\n  RDI_ThreadVariable *thread_variables;\r\n  RDI_U64 thread_variables_count;\r\n};\r\n\r\ntypedef struct RDIM_ConstantsBakeResult RDIM_ConstantsBakeResult;\r\nstruct RDIM_ConstantsBakeResult\r\n{\r\n  RDI_Constant *constants;\r\n  RDI_U64 constants_count;\r\n  RDI_U32 *constant_values;\r\n  RDI_U64 constant_values_count;\r\n  RDI_U8 *constant_value_data;\r\n  RDI_U64 constant_value_data_size;\r\n};\r\n\r\ntypedef struct RDIM_ProcedureBakeResult RDIM_ProcedureBakeResult;\r\nstruct RDIM_ProcedureBakeResult\r\n{\r\n  RDI_Procedure *procedures;\r\n  RDI_U64 procedures_count;\r\n};\r\n\r\ntypedef struct RDIM_ScopeBakeResult RDIM_ScopeBakeResult;\r\nstruct RDIM_ScopeBakeResult\r\n{\r\n  RDI_Scope *scopes;\r\n  RDI_U64 scopes_count;\r\n  RDI_U64 *scope_voffs;\r\n  RDI_U64 scope_voffs_count;\r\n  RDI_Local *locals;\r\n  RDI_U64 locals_count;\r\n};\r\n\r\ntypedef struct RDIM_ScopeVMapBakeResult RDIM_ScopeVMapBakeResult;\r\nstruct RDIM_ScopeVMapBakeResult\r\n{\r\n  RDIM_BakeVMap vmap;\r\n};\r\n\r\ntypedef struct RDIM_InlineSiteBakeResult RDIM_InlineSiteBakeResult;\r\nstruct RDIM_InlineSiteBakeResult\r\n{\r\n  RDI_InlineSite *inline_sites;\r\n  RDI_U64 inline_sites_count;\r\n};\r\n\r\ntypedef struct RDIM_TopLevelNameMapBakeResult RDIM_TopLevelNameMapBakeResult;\r\nstruct RDIM_TopLevelNameMapBakeResult\r\n{\r\n  RDI_NameMap *name_maps;\r\n  RDI_U64 name_maps_count;\r\n};\r\n\r\ntypedef struct RDIM_NameMapBakeResult RDIM_NameMapBakeResult;\r\nstruct RDIM_NameMapBakeResult\r\n{\r\n  RDI_NameMapBucket *buckets;\r\n  RDI_U64 buckets_count;\r\n  RDI_NameMapNode *nodes;\r\n  RDI_U64 nodes_count;\r\n};\r\n\r\ntypedef struct RDIM_FilePathBakeResult RDIM_FilePathBakeResult;\r\nstruct RDIM_FilePathBakeResult\r\n{\r\n  RDI_FilePathNode *nodes;\r\n  RDI_U64 nodes_count;\r\n};\r\n\r\ntypedef struct RDIM_StringBakeResult RDIM_StringBakeResult;\r\nstruct RDIM_StringBakeResult\r\n{\r\n  RDI_U32 *string_offs;\r\n  RDI_U64 string_offs_count;\r\n  RDI_U8 *string_data;\r\n  RDI_U64 string_data_size;\r\n};\r\n\r\ntypedef struct RDIM_IndexRunBakeResult RDIM_IndexRunBakeResult;\r\nstruct RDIM_IndexRunBakeResult\r\n{\r\n  RDI_U32 *idx_runs;\r\n  RDI_U64 idx_count;\r\n};\r\n\r\ntypedef struct RDIM_BakeResults RDIM_BakeResults;\r\nstruct RDIM_BakeResults\r\n{\r\n  RDIM_TopLevelInfoBakeResult top_level_info;\r\n  RDIM_BinarySectionBakeResult binary_sections;\r\n  RDIM_UnitBakeResult units;\r\n  RDIM_UnitVMapBakeResult unit_vmap;\r\n  RDIM_SrcFileBakeResult src_files;\r\n  RDIM_ChecksumBakeResult checksums;\r\n  RDIM_LineTableBakeResult line_tables;\r\n  RDIM_TypeNodeBakeResult type_nodes;\r\n  RDIM_UDTBakeResult udts;\r\n  RDIM_GlobalVariableBakeResult global_variables;\r\n  RDIM_GlobalVMapBakeResult global_vmap;\r\n  RDIM_ThreadVariableBakeResult thread_variables;\r\n  RDIM_ConstantsBakeResult constants;\r\n  RDIM_ProcedureBakeResult procedures;\r\n  RDIM_ScopeBakeResult scopes;\r\n  RDIM_InlineSiteBakeResult inline_sites;\r\n  RDIM_ScopeVMapBakeResult scope_vmap;\r\n  RDIM_TopLevelNameMapBakeResult top_level_name_maps;\r\n  RDIM_NameMapBakeResult name_maps;\r\n  RDIM_FilePathBakeResult file_paths;\r\n  RDIM_StringBakeResult strings;\r\n  RDIM_IndexRunBakeResult idx_runs;\r\n  RDIM_LocationBakeResult locations;\r\n  RDIM_LocationBlockBakeResult location_blocks;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Serialization Types\r\n\r\ntypedef struct RDIM_SerializedSection RDIM_SerializedSection;\r\nstruct RDIM_SerializedSection\r\n{\r\n  void *data;\r\n  RDI_U64 encoded_size;\r\n  RDI_U64 unpacked_size;\r\n  RDI_SectionEncoding encoding;\r\n};\r\n\r\ntypedef struct RDIM_SerializedSectionBundle RDIM_SerializedSectionBundle;\r\nstruct RDIM_SerializedSectionBundle\r\n{\r\n  RDIM_SerializedSection sections[RDI_SectionKind_COUNT];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\n//- rjf: memory operations\r\n#if !defined(RDIM_MEMSET_OVERRIDE)\r\nRDI_PROC void *rdim_memset_fallback(void *dst, RDI_U8 c, RDI_U64 size);\r\n#endif\r\n#if !defined(RDIM_MEMCPY_OVERRIDE)\r\nRDI_PROC void *rdim_memcpy_fallback(void *dst, void *src, RDI_U64 size);\r\n#endif\r\n#define rdim_memzero(ptr, size) rdim_memset((ptr), 0, (size))\r\n#define rdim_memzero_struct(ptr) rdim_memset((ptr), 0, sizeof(*(ptr)))\r\n#define rdim_memcpy_struct(dst, src) rdim_memcpy((dst), (src), sizeof(*(dst)))\r\n\r\n//- rjf: arenas\r\n#if !defined(RDIM_ARENA_OVERRIDE)\r\nRDI_PROC RDIM_Arena *rdim_arena_alloc_fallback(void);\r\nRDI_PROC void rdim_arena_release_fallback(RDIM_Arena *arena);\r\nRDI_PROC RDI_U64 rdim_arena_pos_fallback(RDIM_Arena *arena);\r\nRDI_PROC void *rdim_arena_push_fallback(RDIM_Arena *arena, RDI_U64 align, RDI_U64 size);\r\nRDI_PROC void rdim_arena_pop_to_fallback(RDIM_Arena *arena, RDI_U64 pos);\r\n#endif\r\n#define rdim_push_array_no_zero(a,T,c) (T*)rdim_arena_push((a), sizeof(T)*(c), RDIM_AlignOf(T), (0))\r\n#define rdim_push_array(a,T,c) (T*)rdim_arena_push((a), sizeof(T)*(c), RDIM_AlignOf(T), (1))\r\n\r\n//- rjf: thread-local scratch arenas\r\n#if !defined (RDIM_SCRATCH_OVERRIDE)\r\nRDI_PROC RDIM_Temp rdim_scratch_begin_fallback(RDIM_Arena **conflicts, RDI_U64 conflicts_count);\r\nRDI_PROC void rdim_scratch_end_fallback(RDIM_Temp temp);\r\n#endif\r\n\r\n//- rjf: strings\r\nRDI_PROC RDIM_String8 rdim_str8(RDI_U8 *str, RDI_U64 size);\r\nRDI_PROC RDIM_String8 rdim_str8_copy(RDIM_Arena *arena, RDIM_String8 src);\r\nRDI_PROC RDIM_String8 rdim_str8f(RDIM_Arena *arena, char *fmt, ...);\r\nRDI_PROC RDIM_String8 rdim_str8fv(RDIM_Arena *arena, char *fmt, va_list args);\r\nRDI_PROC RDI_S32 rdim_str8_match(RDIM_String8 a, RDIM_String8 b, RDIM_StringMatchFlags flags);\r\n#define rdim_str8_lit(S)              rdim_str8((RDI_U8*)(S), sizeof(S) - 1)\r\n#define rdim_str8_struct(S)           rdim_str8((RDI_U8*)(S), sizeof(*(S)))\r\n#define rdim_str8_struct_array(S, C)  rdim_str8((RDI_U8*)(S), sizeof(*(S)) * (C))\r\nRDI_PROC RDIM_String8 rdim_lower_from_str8(RDIM_Arena *arena, RDIM_String8 string);\r\n\r\n//- rjf: string lists\r\nRDI_PROC void rdim_str8_list_push(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string);\r\nRDI_PROC void rdim_str8_list_push_front(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 string);\r\nRDI_PROC void rdim_str8_list_push_align(RDIM_Arena *arena, RDIM_String8List *list, RDI_U64 align);\r\nRDI_PROC RDIM_String8 rdim_str8_list_join(RDIM_Arena *arena, RDIM_String8List *list, RDIM_String8 sep);\r\n\r\n//- rjf: sortable range sorting\r\nRDI_PROC RDIM_SortKey *rdim_sort_key_array(RDIM_Arena *arena, RDIM_SortKey *keys, RDI_U64 count);\r\n\r\n//- rjf: rng1u64 lists\r\nRDI_PROC void rdim_rng1u64_list_push(RDIM_Arena *arena, RDIM_Rng1U64List *list, RDIM_Rng1U64 r);\r\nRDI_PROC void rdim_rng1u64_chunk_list_push(RDIM_Arena *arena, RDIM_Rng1U64ChunkList *list, RDI_U64 chunk_cap, RDIM_Rng1U64 r);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Data Model\r\n\r\nRDI_PROC RDI_TypeKind rdim_short_type_kind_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_unsigned_short_type_kind_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_int_type_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_unsigned_int_type_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_long_type_kind_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_unsigned_long_type_kind_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_long_long_type_kind_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_unsigned_long_long_type_kind_from_data_model(RDIM_DataModel data_model);\r\nRDI_PROC RDI_TypeKind rdim_pointer_size_t_type_kind_from_data_model(RDIM_DataModel data_model);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Binary Section Info Building\r\n\r\nRDI_PROC RDIM_BinarySection *rdim_binary_section_list_push(RDIM_Arena *arena, RDIM_BinarySectionList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Source File Info Building\r\n\r\nRDI_PROC RDIM_SrcFile *rdim_src_file_chunk_list_push(RDIM_Arena *arena, RDIM_SrcFileChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_src_file(RDIM_SrcFile *src_file);\r\nRDI_PROC void rdim_src_file_chunk_list_concat_in_place(RDIM_SrcFileChunkList *dst, RDIM_SrcFileChunkList *to_push);\r\nRDI_PROC void rdim_src_file_push_line_sequence(RDIM_Arena *arena, RDIM_SrcFileChunkList *src_files, RDIM_SrcFile *src_file, RDIM_LineSequence *seq);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Line Info Building\r\n\r\nRDI_PROC RDIM_LineTable *rdim_line_table_chunk_list_push(RDIM_Arena *arena, RDIM_LineTableChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_line_table(RDIM_LineTable *line_table);\r\nRDI_PROC void rdim_line_table_chunk_list_concat_in_place(RDIM_LineTableChunkList *dst, RDIM_LineTableChunkList *to_push);\r\nRDI_PROC RDIM_LineSequence *rdim_line_table_push_sequence(RDIM_Arena *arena, RDIM_LineTableChunkList *line_tables, RDIM_LineTable *line_table, RDIM_SrcFile *src_file, RDI_U64 *voffs, RDI_U32 *line_nums, RDI_U16 *col_nums, RDI_U64 line_count);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Unit Info Building\r\n\r\nRDI_PROC RDIM_Unit *rdim_unit_chunk_list_push(RDIM_Arena *arena, RDIM_UnitChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_unit(RDIM_Unit *unit);\r\nRDI_PROC void rdim_unit_chunk_list_concat_in_place(RDIM_UnitChunkList *dst, RDIM_UnitChunkList *to_push);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Type Info & UDT Building\r\n\r\n//- rjf: type nodes\r\nRDI_PROC RDIM_Type *rdim_type_chunk_list_push(RDIM_Arena *arena, RDIM_TypeChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_type(RDIM_Type *type);\r\nRDI_PROC void rdim_type_chunk_list_concat_in_place(RDIM_TypeChunkList *dst, RDIM_TypeChunkList *to_push);\r\n\r\n//- rjf: UDTs\r\nRDI_PROC RDIM_UDT *rdim_udt_chunk_list_push(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_udt(RDIM_UDT *udt);\r\nRDI_PROC void rdim_udt_chunk_list_concat_in_place(RDIM_UDTChunkList *dst, RDIM_UDTChunkList *to_push);\r\nRDI_PROC RDIM_UDTMember *rdim_udt_push_member(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt);\r\nRDI_PROC RDIM_UDTEnumVal *rdim_udt_push_enum_val(RDIM_Arena *arena, RDIM_UDTChunkList *list, RDIM_UDT *udt);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Symbol Info Building\r\n\r\nRDI_PROC RDIM_Symbol *rdim_symbol_chunk_list_push(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_symbol(RDIM_Symbol *symbol);\r\nRDI_PROC void rdim_symbol_chunk_list_concat_in_place(RDIM_SymbolChunkList *dst, RDIM_SymbolChunkList *to_push);\r\ninternal void rdim_symbol_push_value_data(RDIM_Arena *arena, RDIM_SymbolChunkList *list, RDIM_Symbol *symbol, RDIM_String8 data);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Inline Site Info Building\r\n\r\nRDI_PROC RDIM_InlineSite *rdim_inline_site_chunk_list_push(RDIM_Arena *arena, RDIM_InlineSiteChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_inline_site(RDIM_InlineSite *inline_site);\r\nRDI_PROC void rdim_inline_site_chunk_list_concat_in_place(RDIM_InlineSiteChunkList *dst, RDIM_InlineSiteChunkList *to_push);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Location Info Building\r\n\r\n//- rjf: bytecode\r\nRDI_PROC RDIM_EvalBytecodeOp * rdim_bytecode_push_op(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p);\r\nRDI_PROC void rdim_bytecode_push_uconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_U64 x);\r\nRDI_PROC void rdim_bytecode_push_sconst(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_S64 x);\r\nRDI_PROC void rdim_bytecode_push_convert(RDIM_Arena *arena, RDIM_EvalBytecode *bytecode, RDI_EvalTypeGroup in, RDI_EvalTypeGroup out);\r\nRDI_PROC void rdim_bytecode_concat_in_place(RDIM_EvalBytecode *left_dst, RDIM_EvalBytecode *right_destroyed);\r\nRDI_PROC B32 rdim_is_bytecode_tls_dependent(RDIM_EvalBytecode bytecode);\r\n\r\n//- rjf: locations\r\nRDI_PROC RDI_U64 rdim_encoded_size_from_location_info(RDIM_LocationInfo *info);\r\nRDI_PROC RDIM_Location *rdim_location_chunk_list_push_new(RDIM_Arena *arena, RDIM_LocationChunkList *list, RDI_U64 cap, RDIM_LocationInfo *info);\r\nRDI_PROC RDI_U64 rdim_off_from_location(RDIM_Location *location);\r\nRDI_PROC void rdim_location_chunk_list_concat_in_place(RDIM_LocationChunkList *dst, RDIM_LocationChunkList *to_push);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Scope Info Building\r\n\r\nRDI_PROC RDIM_Scope *rdim_scope_chunk_list_push(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDI_U64 cap);\r\nRDI_PROC RDI_U64 rdim_idx_from_scope(RDIM_Scope *scope);\r\nRDI_PROC void rdim_scope_chunk_list_concat_in_place(RDIM_ScopeChunkList *dst, RDIM_ScopeChunkList *to_push);\r\nRDI_PROC void rdim_scope_push_voff_range(RDIM_Arena *arena, RDIM_ScopeChunkList *list, RDIM_Scope *scope, RDIM_Rng1U64 range);\r\nRDI_PROC RDIM_Local *rdim_scope_push_local(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *scope);\r\nRDI_PROC RDIM_LocationCase *rdim_local_push_location_case(RDIM_Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *location, RDIM_Rng1U64 voff_range);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Building] Bake Parameter Joining\r\n\r\nRDI_PROC void rdim_bake_params_concat_in_place(RDIM_BakeParams *dst, RDIM_BakeParams *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated String Baking Map\r\n\r\n//- rjf: chunk lists\r\nRDI_PROC RDIM_BakeString *rdim_bake_string_chunk_list_push(RDIM_Arena *arena, RDIM_BakeStringChunkList *list, RDI_U64 cap);\r\nRDI_PROC void rdim_bake_string_chunk_list_concat_in_place(RDIM_BakeStringChunkList *dst, RDIM_BakeStringChunkList *to_push);\r\nRDI_PROC RDIM_BakeStringChunkList rdim_bake_string_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeStringChunkList *src);\r\n\r\n//- rjf: loose map\r\nRDI_PROC RDIM_BakeStringMapLoose *rdim_bake_string_map_loose_make(RDIM_Arena *arena, RDIM_BakeStringMapTopology *top);\r\nRDI_PROC void rdim_bake_string_map_loose_insert(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map, RDI_U64 chunk_cap, RDIM_String8 string);\r\nRDI_PROC RDIM_BakeStringMapBaseIndices rdim_bake_string_map_base_indices_from_map_loose(RDIM_Arena *arena, RDIM_BakeStringMapTopology *map_topology, RDIM_BakeStringMapLoose *map);\r\n\r\n//- rjf: finalized / tight map\r\nRDI_PROC RDI_U32 rdim_bake_idx_from_string(RDIM_BakeStringMapTight *map, RDIM_String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated Index Run Baking Map\r\n\r\n//- rjf: bake idx run map reading/writing\r\nRDI_PROC RDI_U64 rdim_hash_from_idx_run(RDI_U32 *idx_run, RDI_U32 count);\r\n\r\n//- rjf: chunk lists\r\nRDI_PROC RDIM_BakeIdxRun *rdim_bake_idx_run_chunk_list_push(RDIM_Arena *arena, RDIM_BakeIdxRunChunkList *list, RDI_U64 cap);\r\nRDI_PROC void rdim_bake_idx_run_chunk_list_concat_in_place(RDIM_BakeIdxRunChunkList *dst, RDIM_BakeIdxRunChunkList *to_push);\r\nRDI_PROC RDIM_BakeIdxRunChunkList rdim_bake_idx_run_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeIdxRunChunkList *src);\r\n\r\n//- rjf: loose map\r\nRDI_PROC RDIM_BakeIdxRunMapLoose *rdim_bake_idx_run_map_loose_make(RDIM_Arena *arena, RDIM_BakeIdxRunMapTopology *top);\r\nRDI_PROC void rdim_bake_idx_run_map_loose_insert(RDIM_Arena *arena, RDIM_BakeIdxRunMapTopology *map_topology, RDIM_BakeIdxRunMapLoose *map, RDI_U64 chunk_cap, RDI_U32 *idxes, RDI_U32 count);\r\n\r\n//- rjf: finalized / tight map\r\nRDI_PROC RDI_U32 rdim_bake_idx_from_idx_run(RDIM_BakeIdxRunMap *map, RDI_U32 *idxes, RDI_U32 count);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated Name Map Baking Map\r\n\r\n//- rjf: chunk lists\r\nRDI_PROC RDIM_BakeName *rdim_bake_name_chunk_list_push(RDIM_Arena *arena, RDIM_BakeNameChunkList *list, RDI_U64 cap);\r\nRDI_PROC void rdim_bake_name_chunk_list_concat_in_place(RDIM_BakeNameChunkList *dst, RDIM_BakeNameChunkList *to_push);\r\nRDI_PROC RDIM_BakeNameChunkList rdim_bake_name_chunk_list_sorted_from_unsorted(RDIM_Arena *arena, RDIM_BakeNameChunkList *src);\r\n\r\n//- rjf: bake name chunk list maps\r\nRDI_PROC RDIM_BakeNameMap *rdim_bake_name_map_make(RDIM_Arena *arena, RDIM_BakeNameMapTopology *top);\r\nRDI_PROC void rdim_bake_name_map_insert(RDIM_Arena *arena, RDIM_BakeNameMapTopology *map_topology, RDIM_BakeNameMap *map, RDI_U64 chunk_cap, RDIM_String8 string, RDI_U64 idx);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Deduplicated Path Baking Tree\r\n\r\nRDI_PROC RDIM_BakePathNode *rdim_bake_path_node_from_string(RDIM_BakePathTree *tree, RDIM_String8 string);\r\nRDI_PROC RDI_U32 rdim_bake_path_node_idx_from_string(RDIM_BakePathTree *tree, RDIM_String8 string);\r\nRDI_PROC RDIM_BakePathNode *rdim_bake_path_tree_insert(RDIM_Arena *arena, RDIM_BakePathTree *tree, RDIM_String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Baking Helpers] Data Section List Building Helpers\r\n\r\nRDI_PROC RDIM_BakeSection *rdim_bake_section_list_push(RDIM_Arena *arena, RDIM_BakeSectionList *list);\r\nRDI_PROC RDIM_BakeSection *rdim_bake_section_list_push_new_unpacked(RDIM_Arena *arena, RDIM_BakeSectionList *list, void *data, RDI_U64 size, RDI_SectionKind tag, RDI_U64 tag_idx);\r\nRDI_PROC void rdim_bake_section_list_concat_in_place(RDIM_BakeSectionList *dst, RDIM_BakeSectionList *to_push);\r\n\r\n////////////////////////////////\r\n//~ rjf: [Serializing] Bake Results -> String Blobs\r\n\r\nRDI_PROC RDIM_SerializedSection rdim_serialized_section_make_unpacked(void *data, RDI_U64 size);\r\n#define rdim_serialized_section_make_unpacked_struct(ptr) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr)))\r\n#define rdim_serialized_section_make_unpacked_array(ptr, count) rdim_serialized_section_make_unpacked((ptr), sizeof(*(ptr))*(count))\r\nRDI_PROC RDIM_SerializedSectionBundle rdim_serialized_section_bundle_from_bake_results(RDIM_BakeResults *results);\r\nRDI_PROC RDIM_String8List rdim_file_blobs_from_section_bundle(RDIM_Arena *arena, RDIM_SerializedSectionBundle *bundle);\r\n\r\n#endif // RDI_MAKE_H\r\n"
  },
  {
    "path": "src/linker/base_ext/base_arena.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64 *\npush_u64(Arena *arena, U64 value)\n{\n  U64 *result = push_array_no_zero(arena, U64, 1);\n  *result = value;\n  return result;\n}\n\ninternal U32 *\npush_array_copy_u32(Arena *arena, U32 *v, U64 count)\n{\n  U32 *result = push_array_no_zero(arena, U32, count);\n  MemoryCopyTyped(result, v, count);\n  return result;\n}\n\ninternal U64 *\npush_array_copy_u64(Arena *arena, U64 *v, U64 count)\n{\n  U64 *result = push_array_no_zero(arena, U64, count);\n  MemoryCopyTyped(result, v, count);\n  return result;\n}\n\ninternal U64 **\npush_matrix_u64(Arena *arena, U64 rows, U64 columns)\n{\n  U64 **result = push_array_no_zero(arena, U64 *, rows);\n  for (U64 row_idx = 0; row_idx < rows; row_idx += 1) {\n    result[row_idx] = push_array(arena, U64, columns);\n  }\n  return result;\n}\n\ninternal Arena **\nalloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt)\n{\n  U64 data_size = sizeof(count) + sizeof(Arena *) * count;\n  U8 *data = push_array_no_zero(arena, U8, data_size);\n  U64 *count_ptr = (U64 *)data;\n  Arena **arr = (Arena **)(count_ptr + 1);\n  *count_ptr = count;\n\n  ArenaParams params  = {0};\n  params.reserve_size = res;\n  params.commit_size  = cmt;\n\n  for (U64 i = 0; i < count; i += 1) {\n    Arena *fixed_arena = arena_alloc_(&params);\n    arr[i] = fixed_arena;\n  }\n\n  return arr;\n}\n\ninternal void\nrelease_arena_array(Arena **arr)\n{\n  U64 *count_ptr = (U64 *)arr - 1;\n  U64 count = *count_ptr;\n  for (U64 i = 0; i < count; i += 1) {\n    arena_release(arr[i]);\n    arr[i] = 0;\n  }\n}\n\n"
  },
  {
    "path": "src/linker/base_ext/base_arena.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal U64 *   push_u64           (Arena *arena, U64 value);\ninternal U32 *   push_array_copy_u32(Arena *arena, U32 *v, U64 count);\ninternal U64 *   push_array_copy_u64(Arena *arena, U64 *v, U64 count);\ninternal U64 **  push_matrix_u64    (Arena *arena, U64 rows, U64 columns);\n\ninternal Arena ** alloc_fixed_size_arena_array(Arena *arena, U64 count, U64 res, U64 cmt);\ninternal void     release_arena_array(Arena **arr);\n\n"
  },
  {
    "path": "src/linker/base_ext/base_arrays.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64\nvoid_list_count_nodes(VoidNode *head)\n{\n  U64 node_count = 0;\n  for (VoidNode *curr = head; curr != 0; curr = curr->next) {\n    ++node_count;\n  }\n  return node_count;\n}\n\ninternal void\nvoid_node_concat(VoidNode **head, VoidNode *node)\n{\n  Assert(*head != node);\n  node->next = *head;\n  *head = node;\n}\n\ninternal void\nvoid_node_concat_atomic(VoidNode **head, VoidNode *node)\n{\n  Assert(*head != node);\n  node->next = ins_atomic_ptr_eval_assign(head, node);\n}\n\ninternal U64Node *\nu64_list_push(Arena *arena, U64List *list, U64 data)\n{\n  U64Node *n = push_array(arena, U64Node, 1);\n  n->next = 0;\n  n->data = data;\n  \n  SLLQueuePush(list->first, list->last, n);\n  ++list->count;\n  \n  return n;\n}\n\ninternal void\nu64_list_concat_in_place(U64List *list, U64List *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal U64Array\nu64_array_from_list(Arena *arena, U64List *list)\n{\n  U64Array result;\n  result.count = 0;\n  result.v = push_array(arena, U64, list->count);\n  for (U64Node *n = list->first; n != NULL; n = n->next) {\n    result.v[result.count++] = n->data;\n  }\n  return result;\n}\n\ninternal void\nu32_array_sort(U64 count, U32 *v)\n{\n  radsort(v, count, u32_is_before);\n}\n\ninternal void\nu64_array_sort(U64 count, U64 *v)\n{\n  radsort(v, count, u64_is_before);\n}\n\ninternal void\nu32_pair_radix_sort(U64 count, PairU32 *arr)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  PairU32 *temp = push_array(scratch.arena, PairU32, count);\n\n  const U64 bit_count0 = 11;\n  const U64 bit_count1 = 11;\n  const U64 bit_count2 = 10;\n  \n  U32 *count0 = push_array(scratch.arena, U32, (1 << bit_count0));\n  U32 *count1 = push_array(scratch.arena, U32, (1 << bit_count1));\n  U32 *count2 = push_array(scratch.arena, U32, (1 << bit_count2));\n\n  for (U64 i = 0; i < count; ++i) {\n    U32 digit0 = (arr[i].v0 >> 0         ) % (1 << bit_count0);\n    U32 digit1 = (arr[i].v0 >> bit_count0) % (1 << bit_count1);\n    U32 digit2 = (arr[i].v0 >> bit_count1) % (1 << bit_count2);\n\n    ++count0[digit0];\n    ++count1[digit1];\n    ++count2[digit2];\n  }\n\n  counts_to_offsets_array_u32((1 << bit_count0), count0);\n  counts_to_offsets_array_u32((1 << bit_count1), count1);\n  counts_to_offsets_array_u32((1 << bit_count2), count2);\n\n  for (U64 i = 0; i < count; ++i) {\n    U32 digit0 = (arr[i].v0 >> 0) % (1 << bit_count0);\n    temp[count0[digit0]++] = arr[i];\n  }\n\n  for (U64 i = 0; i < count; ++i) {\n    U32 digit1 = (temp[i].v0 >> bit_count0) % (1 << bit_count1);\n    arr[count1[digit1]++] = temp[i];\n  }\n\n  for (U64 i = 0; i < count; ++i) {\n    U32 digit2 = (arr[i].v0 >> bit_count1) % (1 << bit_count2);\n    temp[count2[digit2]++] = arr[i];\n  }\n\n  MemoryCopyTyped(arr, temp, count);\n\n  scratch_end(scratch);\n}\n\ninternal B32\nu32_array_compare(U32Array a, U32Array b)\n{\n  B32 are_equal = 0;\n  if (a.count == b.count) {\n    int cmp = MemoryCompare(a.v, b.v, sizeof(a.v[0]) * a.count);\n    are_equal = (cmp == 0);\n  }\n  return are_equal;\n}\n\ninternal U64Array\nu64_array_remove_duplicates(Arena *arena, U64Array in)\n{\n  U64Array result;\n  result.count = 0;\n  result.v = push_array(arena, U64, in.count);\n  \n  for (U64 i = 1; i < in.count; ++i) {\n    B32 is_unique = in.v[i - 1] != in.v[i];\n    if (is_unique) {\n      result.v[result.count++] = in.v[i - 1];\n    }\n  }\n  \n  if (in.count > 0 && result.count > 0) {\n    B32 is_unique = result.v[result.count - 1] != in.v[in.count - 1];\n    if (is_unique) {\n      result.v[result.count++] = in.v[in.count - 1];\n    }\n  }\n  \n  U64 slack_size = (in.count - result.count) * sizeof(result.v[0]);\n  arena_pop(arena, slack_size);\n  \n  return result;\n}\n\ninternal U64\nsum_array_u64(U64 count, U64 *v)\n{\n  U64 result = 0;\n  for (U64 i = 0; i < count; i += 1) {\n    result += v[i];\n  }\n  return result;\n}\n\ninternal U64\nsum_matrix_u64(U64 rows, U64 cols, U64 **v)\n{\n  U64 result = 0;\n  for (U64 i = 0; i < rows; ++i) {\n    result += sum_array_u64(cols, v[i]);\n  }\n  return result;\n}\n\ninternal U64\nmax_array_u64(U64 count, U64 *v)\n{\n  U64 result = 0;\n  for (U64 i = 0; i < count; i += 1) {\n    result = Max(v[i], result);\n  }\n  return result;\n}\n\ninternal U64\nmin_array_u64(U64 count, U64 *v)\n{\n  U64 result = max_U64;\n  for (U64 i = 0; i < count; i += 1) {\n    result = Min(v[i], result);\n  }\n  return result;\n}\n\ninternal void\ncounts_to_offsets_array_u32(U64 count, U32 *arr)\n{\n  U32 next_offset = 0;\n  for (U64 i = 0; i < count; i += 1) {\n    U32 current_offset = next_offset;\n    next_offset += arr[i];\n    arr[i] = current_offset;\n  }\n}\n\ninternal void\ncounts_to_offsets_array_u64(U64 count, U64 *arr)\n{\n  U64 next_offset = 0;\n  for (U64 i = 0; i < count; i += 1) {\n    U64 current_offset = next_offset;\n    next_offset += arr[i];\n    arr[i] = current_offset;\n  }\n}\n\ninternal U32 *\noffsets_from_counts_array_u32(Arena *arena, U32 *v, U64 count)\n{\n  U32 *result = push_array_copy_u32(arena, v, count);\n  counts_to_offsets_array_u32(count, result);\n  return result;\n}\n\ninternal U64 *\noffsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count)\n{\n  U64 *result = push_array_copy_u64(arena, v, count);\n  counts_to_offsets_array_u64(count, result);\n  return result;\n}\n\n"
  },
  {
    "path": "src/linker/base_ext/base_arrays.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef struct U32Node\n{\n  struct U32Node *next;\n  U32             data;\n} U32Node;\n\ntypedef struct U64Node\n{\n  struct U64Node *next;\n  U64             data;\n} U64Node;\n\ntypedef struct U64List\n{\n  U64      count;\n  U64Node *first;\n  U64Node *last;\n} U64List;\n\ntypedef struct VoidNode\n{\n  struct VoidNode *next;\n  void            *v;\n} VoidNode;\n\n////////////////////////////////\n\ninternal U64Node * u64_list_push(Arena *arena, U64List *list, U64 data);\ninternal void      u64_list_concat_in_place(U64List *list, U64List *to_concat);\ninternal U64Array  u64_array_from_list(Arena *arena, U64List *list);\n\ninternal U64Array u64_array_remove_duplicates(Arena *arena, U64Array in);\n\ninternal void u32_array_sort(U64 count, U32 *v);\ninternal void u64_array_sort(U64 count, U64 *v);\ninternal B32  u32_array_compare(U32Array a, U32Array b);\n\ninternal U64 sum_array_u64(U64 count, U64 *v);\ninternal U64 max_array_u64(U64 count, U64 *v);\ninternal U64 min_array_u64(U64 count, U64 *v);\n\ninternal void  counts_to_offsets_array_u32(U64 count, U32 *arr);\ninternal void  counts_to_offsets_array_u64(U64 count, U64 *arr);\n\ninternal U32 * offsets_from_counts_array_u32(Arena *arena, U32 *v, U64 count);\ninternal U64 * offsets_from_counts_array_u64(Arena *arena, U64 *v, U64 count);\n\n"
  },
  {
    "path": "src/linker/base_ext/base_bit_array.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U32Array\nbit_array_init32(Arena *arena, U64 word_count)\n{\n  U32Array result;\n  result.count = CeilIntegerDiv(word_count, 32);\n  result.v = push_array(arena, U32, word_count);\n  return result;\n}\n\ninternal U64\nbit_array_scan_left_to_right32(U32Array bit_array, U64 lo, U64 hi, B32 state)\n{\n  Assert(lo < bit_array.count*32);\n  Assert(hi <= bit_array.count*32);\n  Assert(lo <= hi);\n  Assert(state == 0 || state == 1);\n  \n  U64 word_lo = lo / 32;\n  U64 word_hi = CeilIntegerDiv(hi, 32) - 1;\n  \n  U64 word_idx = word_lo;\n  U64 bit_idx = 0;\n  \n  U64 scan_count = hi - lo;\n  if (scan_count < 32) {\n    U64 bit_lo = lo % 32;\n    U64 bit_hi = hi % 32;\n    U64 word = bit_array.v[word_idx];\n    word ^= state - 1;\n    word &= (1U << bit_hi) - (1U << bit_lo);\n    if (word) {\n      bit_idx = ctz32(word);\n      goto exit;\n    }\n  } else {\n    U32 first_word = bit_array.v[word_idx];\n    first_word ^= state - 1;\n    first_word &= ~0u << (lo % 32);\n    if (first_word) {\n      bit_idx = ctz32(first_word);\n      goto exit;\n    }\n    \n    for (word_idx += 1; word_idx < word_hi; word_idx += 1) {\n      U32 word = bit_array.v[word_idx];\n      word ^= state - 1;\n      if (word != 0) {\n        bit_idx = ctz32(word);\n        goto exit;\n      }\n    }\n    \n    U64 bit_hi = hi - (word_idx * 32);\n    U32 last_word = bit_array.v[word_idx];\n    last_word ^= state - 1;\n    last_word &= (1 << bit_hi) - 1;\n    if (last_word) {\n      bit_idx = ctz32(last_word);\n      goto exit;\n    }\n  }\n  \n  word_idx = 0;\n  bit_idx = max_U32;\n  \n  exit:;\n  \n  U64 result = word_idx * 32 + bit_idx;\n  return result;\n}\n\ninternal U64\nbit_array_scan_right_to_left32(U32Array bit_array, U64 lo, U64 hi, B32 state)\n{\n  Assert(lo <= hi);\n  Assert(state == 0 || state == 1);\n  \n  S64 word_lo = lo / 32;\n  S64 word_hi = CeilIntegerDiv(hi, 32) - 1;\n  \n  S64 word_idx = word_hi;\n  S64 bit_idx = -1;\n  \n  U64 scan_count = hi - lo;\n  if (scan_count < 32) {\n    S64 bit_lo = lo % 32;\n    S64 bit_hi = bit_lo + scan_count;\n    U32 word = bit_array.v[word_idx];\n    for (bit_idx = bit_hi; bit_idx >= bit_lo; bit_idx -= 1) {\n      U32 bit = ExtractBit(word, bit_idx);\n      if (bit == state) {\n        goto exit;\n      }\n    }\n  } else {\n    U32 last_word = bit_array.v[word_idx];\n    S64 bit_hi = hi % 32;\n    for (bit_idx = bit_hi; bit_idx >= 0; bit_idx -= 1) {\n      U32 bit = ExtractBit(last_word, bit_idx);\n      if (bit == state) {\n        goto exit;\n      }\n    }\n    \n    for (word_idx -= 1; word_idx > word_lo; word_idx -= 1) {\n      U32 word = bit_array.v[word_idx];\n      for (bit_idx = 32 - 1; bit_idx >= 0; bit_idx -= 1) {\n        U32 bit = ExtractBit(word, bit_idx);\n        if (bit == state) {\n          goto exit;\n        }\n      }\n    }\n    \n    U32 first_word = bit_array.v[word_idx];\n    S64 bit_lo = lo % 32;\n    for (bit_idx = 32 - 1; bit_idx >= bit_lo; bit_idx -= 1) {\n      U32 bit = ExtractBit(first_word, bit_idx);\n      if (bit == state) {\n        goto exit;\n      }\n    }\n  }\n  \n  word_idx = 0;\n  bit_idx = max_U32;\n  \n  exit:;\n  \n  S64 result_s64 = word_idx * 32 + bit_idx;\n  U64 result_u64 = (U64)result_s64;\n  return result_u64;\n}\n\ninternal Rng1U64\nbit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count)\n{\n  Rng1U64 result = rng_1u64(max_U64, max_U64);\n  \n  U64 curr_count = 0, rover = lo;\n  while (curr_count < in_row_count) {\n    rover = bit_array_scan_left_to_right32(bit_array, rover, hi, state);\n    \n    // no more bits in range\n    if (rover >= hi) {\n      break;\n    }\n    \n    // set first match\n    if (result.v[0] == max_U64) {\n      result = rng_1u64(rover, rover);\n      continue;\n    }\n    \n    // reset on non-contiguous range\n    B32 is_bit_index_not_adjoined = (result.v[0] + 1 < rover);\n    if (is_bit_index_not_adjoined) {\n      curr_count = 0;\n      result = rng_1u64(max_U64, max_U64);\n      continue;\n    }\n    \n    // advance\n    result.v[1] = rover;\n    curr_count -= 1;\n  }\n  \n  // did we allocate enough bits?\n  if (curr_count != in_row_count) {\n    result = rng_1u64(max_U64, max_U64);\n  }\n  \n  return result;\n}\n\ninternal Rng1U64\nbit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count)\n{\n  Rng1U64 result = rng_1u64(max_U64, max_U64);\n  \n  U64 curr_count = 0, rover = lo;\n  while (curr_count < in_row_count) {\n    rover = bit_array_scan_right_to_left32(bit_array, lo, rover, state);\n    \n    // no more bits in range\n    if (rover >= hi) {\n      break;\n    }\n    \n    // set first match\n    if (result.v[0] == max_U64) {\n      result = rng_1u64(rover, rover);\n      continue;\n    }\n    \n    // reset on non-contiguous range\n    B32 is_bit_index_not_adjoined = (result.v[0] + 1 < rover);\n    if (is_bit_index_not_adjoined) {\n      curr_count = 0;\n      result = rng_1u64(max_U64, max_U64);\n      continue;\n    }\n    \n    // advance\n    result.v[0] = rover;\n    curr_count -= 1;\n  }\n  \n  // did we allocate enough bits?\n  if (curr_count != in_row_count) {\n    result = rng_1u64(max_U64, max_U64);\n  }\n  \n  return result;\n}\n\ninternal U64\nbit_array_find_next_unset_bit32(U32Array bit_array)\n{\n  U64 result = bit_array_scan_left_to_right32(bit_array, 0, bit_array.count*32, 0);\n  return result;\n}\n\ninternal U64\nbit_array_find_next_set_bit32(U32Array bit_array)\n{\n  U64 result = bit_array_scan_left_to_right32(bit_array, 0, bit_array.count*32, 1);\n  return result;\n}\n\ninternal void\nbit_array_set_bit32(U32Array bit_array, U64 idx, B32 state)\n{\n  Assert(idx < bit_array.count*32);\n  U64 word_idx = idx / 32;\n  U64 bit_idx = idx % 32;\n  if (state) {\n    bit_array.v[word_idx] |= (1 << bit_idx);\n  } else {\n    bit_array.v[word_idx] &= ~(1 << bit_idx);\n  }\n}\n\ninternal void\nbit_array_set_bit_range32(U32Array bit_array, Rng1U64 range, B32 state)\n{\n  for (U64 idx = range.min ; idx < range.max; idx += 1) {\n    bit_array_set_bit32(bit_array, idx, state);\n  }\n}\n\ninternal U32\nbit_array_get_bit32(U32Array bit_array, U64 idx)\n{\n  Assert(idx < bit_array.count*32);\n  U64 word_idx = idx / 32;\n  U64 bit_idx = idx % 32;\n  U32 bit = (bit_array.v[word_idx] & (1 << bit_idx)) >> bit_idx;\n  return bit;\n}\n\ninternal B32\nbit_array_is_bit_set(U32Array bit_arr, U64 bit_pos)\n{\n  U64 word_idx = bit_pos / 32;\n  Assert(word_idx < bit_arr.count);\n  U32 word = bit_arr.v[word_idx];\n  U64 bit_idx = bit_pos % 32;\n  B32 is_set = !!(word & (1 << bit_idx));\n  return is_set;\n}\n\n\n"
  },
  {
    "path": "src/linker/base_ext/base_bit_array.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal U32Array  bit_array_init32                         (Arena *arena, U64 word_count);\ninternal U64       bit_array_scan_left_to_right32           (U32Array bit_array, U64 lo, U64 hi, B32 state);\ninternal U64       bit_array_scan_right_to_left32           (U32Array bit_array, U64 lo, U64 hi, B32 state);\ninternal Rng1U64   bit_array_scan_left_to_right32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count);\ninternal Rng1U64   bit_array_scan_right_to_left32_contiguous(U32Array bit_array, U64 lo, U64 hi, B32 state, U64 in_row_count);\ninternal B32       byte_scan_right_to_left                  (U8 *start, U8 *opl, U8 byte, U64 *offset_out);\ninternal U64       bit_array_find_next_unset_bit32          (U32Array bit_array);\ninternal U64       bit_array_find_next_set_bit32            (U32Array bit_array);\ninternal void      bit_array_set_bit32                      (U32Array bit_array, U64 idx, B32 state);\ninternal void      bit_array_set_bit_range32                (U32Array bit_array, Rng1U64 range, B32 state);\ninternal U32       bit_array_get_bit32                      (U32Array bit_array, U64 idx);\n\n\n"
  },
  {
    "path": "src/linker/base_ext/base_blake3.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#if defined(__clang__)\n#pragma clang diagnostic push\n#pragma clang diagnostic ignored \"-Wmacro-redefined\"\n#pragma clang diagnostic ignored \"-Wsign-conversion\"\n#elif defined(_MSC_VER)\n#pragma warning (push, 0)\n#endif\n\n#include \"third_party/blake3/c/blake3_portable.c\"\n\n#if defined(_M_AMD64) || defined(__x86_64__)\n\n#define round_fn           sse2_round_fn\n#define compress_pre       sse2_compress_pre\n\n#include \"third_party/blake3/c/blake3_sse2.c\"\n\n#define loadu              sse41_loadu\n#define storeu             sse41_storeu\n#define addv               sse41_addv\n#define xorv               sse41_xorv\n#define set1               sse41_set1\n#define set4               sse41_set4\n#define rot16              sse41_rot16\n#define rot12              sse41_rot12\n#define rot8               sse41_rot8\n#define rot7               sse41_rot7\n#define g1                 sse41_g1\n#define g2                 sse41_g2\n#define diagonalize        sse41_diagonalize\n#define undiagonalize      sse41_undiagonalize\n#define compress_pre       sse41_compress_pre\n#define round_fn           sse41_round_fn\n#define transpose_vecs     sse41_transpose_vecs\n#define transpose_msg_vecs sse41_transpose_msg_vecs\n#define load_counters      sse41_load_counters\n\n#if defined(__clang__)\n#pragma clang attribute push(__attribute__((target(\"sse4.1\"))), apply_to=function)\n#endif\n#include \"third_party/blake3/c/blake3_sse41.c\"\n#if defined(__clang__)\n#pragma clang attribute pop\n#endif\n\n#define loadu              avx2_loadu\n#define storeu             avx2_storeu\n#define addv               avx2_addv\n#define xorv               avx2_xorv\n#define set1               avx2_set1\n#define rot7               avx2_rot7\n#define rot8               avx2_rot8\n#define rot12              avx2_rot12\n#define rot16              avx2_rot16\n#define round_fn           avx2_round_fn\n#define transpose_vecs     avx2_transpose_vecs\n#define transpose_msg_vecs avx2_transpose_msg_vecs\n#define load_counters      avx2_load_counters\n\n#if defined(__clang__)\n#pragma clang attribute push(__attribute__((target(\"avx2\"))), apply_to=function)\n#endif\n#include \"third_party/blake3/c/blake3_avx2.c\"\n#if defined(__clang__)\n#pragma clang attribute pop\n#endif\n\n#define set4               avx512_set4\n#define g1                 avx512_g1\n#define g2                 avx512_g2\n#define diagonalize        avx512_diagonalize\n#define undiagonalize      avx512_undiagonalize\n#define compress_pre       avx512_compress_pre\n#define transpose_vecs     avx512_transpose_vecs\n#define transpose_msg_vecs avx512_transpose_msg_vecs\n#define load_counters      avx512_load_counters\n\n#if defined(__clang__)\n#pragma clang attribute push(__attribute__((target(\"avx512f,avx512vl\"))), apply_to=function)\n#endif\n#include \"third_party/blake3/c/blake3_avx512.c\"\n#if defined(__clang__)\n#pragma clang attribute pop\n#endif\n\n#endif\n\n#if defined(__aarch64__) || defined(_M_ARM64)\n#include \"third_party/blake3/c/blake3_neon.c\"\n#endif\n\n#include \"third_party/blake3/c/blake3_dispatch.c\"\n#include \"third_party/blake3/c/blake3.c\"\n\n#if defined(__clang__)\n#pragma clang diagnostic pop\n#elif defined(_MSC_VER)\n#pragma warning (pop, 0)\n#endif\n\n"
  },
  {
    "path": "src/linker/base_ext/base_blake3.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n#define BLAKE3_API static\n#define BLAKE3_PRIVATE static\n\n#if defined(__clang__) && defined(__x86_64__)\n#  if defined(__IMMINTRIN_H)\n#    error \"include this header before immintrin.h / x86intrin.h / intrin.h\"\n#  endif\n#  pragma clang diagnostic push\n#  pragma clang diagnostic ignored \"-Wreserved-macro-identifier\"\n#  pragma push_macro(\"__AVX__\")\n#  pragma push_macro(\"__AVX2__\")\n#  pragma push_macro(\"__SSE4_1__\")\n#  pragma push_macro(\"__AVX512F__\")\n#  pragma push_macro(\"__AVX512VL__\")\n#  define __AVX__ 1\n#  define __AVX2__ 1\n#  define __SSE4_1__ 1\n#  define __AVX512F__ 1\n#  define __AVX512VL__ 1\n#  include <immintrin.h>\n#  pragma pop_macro(\"__AVX512VL__\")\n#  pragma pop_macro(\"__AVX512F__\")\n#  pragma pop_macro(\"__SSE4_1__\")\n#  pragma pop_macro(\"__AVX2__\")\n#  pragma pop_macro(\"__AVX__\")\n#  pragma clang diagnostic pop\n#endif\n\n#include \"third_party/blake3/c/blake3.h\"\n\nstatic void\nblake3(void* out, size_t outlen, void* in, size_t inlen)\n{\n  blake3_hasher hasher;\n  blake3_hasher_init(&hasher);\n  blake3_hasher_update(&hasher, in, inlen);\n  blake3_hasher_finalize(&hasher, (uint8_t*)out, outlen);\n}\n\n"
  },
  {
    "path": "src/linker/base_ext/base_core.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U16\nsafe_cast_u16x(U64 x)\n{\n  AssertAlways(x <= max_U16);\n  return (U16)x;\n}\n\ninternal U64\nu128_mod64(U128 a, U64 b)\n{\n  return a.u64[1] % b;\n}\n\ninternal Version\nmake_version(U64 major, U64 minor)\n{\n  Version version;\n  version.major = major;\n  version.minor = minor;\n  return version;\n}\n\ninternal int\nversion_compar(Version a, Version b)\n{\n  int cmp = 0;\n  if (a.major < b.major) {\n    cmp = -1;\n  } else if (a.major > b.major) {\n    cmp = +1;\n  } else if (a.major == b.major) {\n    if (a.minor < b.minor) {\n      cmp = -1;\n    } else if (a.minor > b.minor) {\n      cmp = +1;\n    }\n  }\n  return cmp;\n}\n\ninternal ISectOff\nisect_off(U32 isect, U32 off)\n{\n  ISectOff result = { isect, off };\n  return result;\n}\n\ninternal int\nu16_compar(const void *raw_a, const void *raw_b)\n{\n  U16 a = *(U16*)raw_a;\n  U16 b = *(U16*)raw_b;\n  int result = a < b  ? -1 :\n               a > b  ? +1 :\n               0;\n  return result;\n}\n\ninternal int\nu32_compar(const void *raw_a, const void *raw_b)\n{\n  U32 a = *(U32*)raw_a;\n  U32 b = *(U32*)raw_b;\n  int result = a < b  ? -1 :\n  a > b  ? +1 :\n  0;\n  return result;\n}\n\ninternal int\nu64_compar(const void *raw_a, const void *raw_b)\n{\n  U64 a = *(const U64*)raw_a;\n  U64 b = *(const U64*)raw_b;\n  int result = a < b  ? -1 : a > b  ? +1 : 0;\n  return result;\n}\n\ninternal int\nu64_compar_inv(const void *raw_a, const void *raw_b)\n{\n  U64 a = *(const U64*)raw_a;\n  U64 b = *(const U64*)raw_b;\n  int result = a < b  ? +1 : a > b  ? -1 : 0;\n  return result;\n}\n\ninternal int\nu16_compar_is_before(void *raw_a, void *raw_b)\n{\n  U16 *a = (U16 *)raw_a;\n  U16 *b = (U16 *)raw_b;\n  int is_before = *a < *b;\n  return is_before; \n}\n\ninternal int\nu32_compar_is_before(void *raw_a, void *raw_b)\n{\n  U32 *a = (U32 *)raw_a;\n  U32 *b = (U32 *)raw_b;\n  int is_before = *a < *b;\n  return is_before; \n}\n\ninternal int\nu64_compar_is_before(void *raw_a, void *raw_b)\n{\n  U64 *a = (U64 *)raw_a;\n  U64 *b = (U64 *)raw_b;\n  int is_before = *a < *b;\n  return is_before; \n}\n\ninternal int\nu8_is_before(void *raw_a, void *raw_b)\n{\n  U8 *a = (U8 *) raw_a;\n  U8 *b = (U8 *) raw_b;\n  return *a < *b;\n}\n\ninternal int\nu16_is_before(void *raw_a, void *raw_b)\n{\n  U16 *a = (U16 *) raw_a;\n  U16 *b = (U16 *) raw_b;\n  return *a < *b;\n}\n\ninternal int\nu32_is_before(void *raw_a, void *raw_b)\n{\n  U32 *a = (U32 *) raw_a;\n  U32 *b = (U32 *) raw_b;\n  return *a < *b;\n}\n\ninternal int\nu64_is_before(void *raw_a, void *raw_b)\n{\n  U64 *a = (U64 *) raw_a;\n  U64 *b = (U64 *) raw_b;\n  return *a < *b;\n}\n\ninternal int\npair_u32_is_before_v0(void *raw_a, void *raw_b)\n{\n  PairU32 *a = raw_a;\n  PairU32 *b = raw_b;\n  return a->v0 < b->v0;\n}\n\ninternal int\npair_u32_is_before(void *raw_a, void *raw_b)\n{\n  PairU32 *a = raw_a;\n  PairU32 *b = raw_b;\n  return a->v1 < b->v1;\n}\n\ninternal int\npair_u64_is_before_v0(void *raw_a, void *raw_b)\n{\n  PairU64 *a = raw_a;\n  PairU64 *b = raw_b;\n  return a->v0 < b->v0;\n}\n\ninternal int\npair_u64_is_before_v1(void *raw_a, void *raw_b)\n{\n  PairU64 *a = raw_a;\n  PairU64 *b = raw_b;\n  return a->v1 < b->v1;\n}\n\ninternal int\npair_u32_compar_v0(const void *raw_a, const void *raw_b)\n{\n  const PairU32 *a = raw_a;\n  const PairU32 *b = raw_b;\n  return u32_compar(&a->v0, &b->v0);\n}\n\ninternal int\npair_u64_compar_v0(const void *raw_a, const void *raw_b)\n{\n  const PairU64 *a = raw_a;\n  const PairU64 *b = raw_b;\n  return u64_compar(&a->v0, &b->v0);\n}\n\ninternal int\npair_u64_compar_v1(const void *raw_a, const void *raw_b)\n{\n  const PairU64 *a = raw_a;\n  const PairU64 *b = raw_b;\n  return u64_compar(&a->v1, &b->v1);\n}\n\ninternal U64\npair_u64_nearest_v0(PairU64 *arr, U64 count, U64 v)\n{\n  U64 result = max_U64;\n\n  if (count > 1 && arr[0].v0 <= v && v < arr[count-1].v0) {\n    U64 l = 0;\n    U64 r = count - 1;\n    for (; l <= r; ) {\n      U64 m = l + (r - l) / 2;\n      if (arr[m].v0 == v) {\n        return m;\n      } else if (arr[m].v0 < v) {\n        l = m + 1;\n      } else {\n        r = m - 1;\n      }\n    }\n    result = l;\n  } else if (count == 1 && arr[0].v0 == v) {\n    result = 0;\n  } else if (count > 0 && v >= arr[count-1].v0) {\n    result = count-1;\n  }\n\n  return result;\n}\n\ninternal void\nstr8_list_concat_in_place_array(String8List *list, String8List *arr, U64 count)\n{\n  for (U64 i = 0; i < count; ++i) {\n    str8_list_concat_in_place(list, &arr[i]);\n  }\n}\n\n\n\n"
  },
  {
    "path": "src/linker/base_ext/base_core.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n#if COMPILER_MSVC\n# define COMPILER_STRING \"MSVC\"\n#elif COMPILER_CLANG\n# define COMPILER_STRING \"Clang\"\n#elif COMPILER_GCC\n# define COMPILER_STRING \"GCC\"\n#else\n# error \"undefined compiler string\"\n#endif\n\n#if BUILD_DEBUG\n# define BUILD_MODE_STRING \"Debug\"\n#else\n# define BUILD_MODE_STRING \"Release\"\n#endif\n\n////////////////////////////////\n\n#define BitExtract(x, count, shift) (((x) >> (shift)) & ((1 << (count)) - 1))\n\n////////////////////////////////\n// Linked List Helpers\n\n#define DLLConcatInPlace(list, to_concat) do { \\\n  if ((to_concat)->count) {                    \\\n    if ((list)->count) {                       \\\n      (list)->last->next = (to_concat)->first; \\\n      (to_concat)->first->prev = (list)->last; \\\n      (list)->last = (to_concat)->last;        \\\n    } else {                                   \\\n      (list)->first = (to_concat)->first;      \\\n      (list)->last = (to_concat)->last;        \\\n    }                                          \\\n    (list)->count += (to_concat)->count;       \\\n    MemoryZeroStruct(to_concat);               \\\n  }                                            \\\n} while (0)\n#define DLLConcatInPlaceArray(list, to_concat_arr, count) for (U64 i = 0; i < (count); i += 1) { DLLConcatInPlace(list, &(to_concat_arr)[i]); }\n\n#define SLLQueuePushCount(list, node) do { \\\n  SLLQueuePush((list)->first, (list)->last, node); \\\n  ++(list)->count; \\\n} while (0)\n\n#define SLLConcatInPlaceNoCount(list, to_concat) do { \\\n  if ((to_concat)->first) {                           \\\n    if ((list)->first) {                              \\\n      (list)->last->next = (to_concat)->first;        \\\n      (list)->last = (to_concat)->last;               \\\n    } else {                                          \\\n      (list)->first = (to_concat)->first;             \\\n      (list)->last = (to_concat)->last;               \\\n    }                                                 \\\n    MemoryZeroStruct(to_concat);                      \\\n  }                                                   \\\n} while (0)\n\n#define SLLConcatInPlace(list, to_concat) do { \\\n  if ((to_concat)->count) {                    \\\n    if ((list)->count) {                       \\\n      (list)->last->next = (to_concat)->first; \\\n      (list)->last = (to_concat)->last;        \\\n    } else {                                   \\\n      (list)->first = (to_concat)->first;      \\\n      (list)->last = (to_concat)->last;        \\\n    }                                          \\\n    (list)->count += (to_concat)->count;       \\\n    MemoryZeroStruct(to_concat);               \\\n  }                                            \\\n} while (0)\n#define SLLConcatInPlaceArray(list, to_concat_arr, count) for (U64 i = 0; i < (count); ++i) { SLLConcatInPlace(list, &(to_concat_arr)[i]); }\n\n#define SLLConcatInPlaceChunkList(list, to_concat, chunk_type) do {   \\\n    if ((list)->last != 0) {                                          \\\n      U64 base_cursor = (list)->last->base + (list)->last->count;     \\\n      for (chunk_type *c = (to_concat)->first; c != 0; c = c->next) { \\\n        c->base = base_cursor;                                        \\\n        base_cursor += c->count;                                      \\\n      }                                                               \\\n    }                                                                 \\\n    SLLConcatInPlace(list, to_concat);                                \\\n  } while (0)\n\n#define SLLConcatInPlaceChunkListArray(list, to_concat_arr, type, count) for (U64 i = 0; i < (count); ++i) { SLLConcatInPlaceChunkList(list, &(to_concat_arr)[i], type); }\n\n#define SLLChunkListPush(_arena, _list, _cap, _value_type) do {                      \\\n  if ((_list)->last == 0 || (_list)->last->count >= (_list)->last->cap) {            \\\n    _value_type##Chunk *new_chunk = push_array(_arena, _value_type##Chunk, 1);       \\\n    new_chunk->v     = push_array(_arena, _value_type, _cap);                \\\n    new_chunk->cap   = _cap;                                                         \\\n    new_chunk->base  = (_list)->last ? (_list)->last->base + (_list)->last->cap : 0; \\\n    SLLQueuePushCount(_list, new_chunk);                                             \\\n  }                                                                                  \\\n  _value_type *v = &(_list)->last->v[(_list)->last->count++];                        \\\n  v->chunk = (_list)->last;                                                          \\\n} while (0)\n\n#define SLLChunkListPushZero(_arena, _list, _cap, _value_type) do { \\\n  SLLChunkListPush(_arena, _list, _cap, _value_type);               \\\n  MemoryZeroStruct(SLLChunkListLastItem(_list));                    \\\n  SLLChunkListLastItem(_list)->chunk = (_list)->last;               \\\n} while(0)\n\n#define SLLChunkListLastItem(_list) (&(_list)->last->v[(_list)->last->count - 1])\n\n////////////////////////////////\n\ntypedef struct\n{\n  U64 major;\n  U64 minor;\n} Version;\n\n////////////////////////////////\n\ntypedef struct ISectOff\n{\n  U32 isect;\n  U32 off;\n} ISectOff;\n\n////////////////////////////////\n\ntypedef struct PairU32\n{\n  U32 v0;\n  U32 v1;\n} PairU32;\n\ntypedef struct PairU64\n{\n  U64 v0;\n  U64 v1;\n} PairU64;\n\n////////////////////////////////\n\ninternal U16 safe_cast_u16x(U64 x);\n\n////////////////////////////////\n\ninternal U64 u128_mod64(U128 a, U64 b);\n\n////////////////////////////////\n\ninternal Version make_version(U64 major, U64 minor);\ninternal int     version_compar(Version a, Version b);\n\n////////////////////////////////\n\ninternal ISectOff isect_off(U32 isect, U32 off);\n\n////////////////////////////////\n\ninternal int u16_compar(const void *raw_a, const void *raw_b);\ninternal int u32_compar(const void *raw_a, const void *raw_b);\ninternal int u64_compar(const void *raw_a, const void *raw_b);\n\ninternal int u8_is_before(void *raw_a, void *raw_b);\ninternal int u16_is_before(void *raw_a, void *raw_b);\ninternal int u32_is_before(void *raw_a, void *raw_b);\ninternal int u64_is_before(void *raw_a, void *raw_b);\n\ninternal int pair_u32_is_before_v0(void *raw_a, void *raw_b);\ninternal int pair_u32_is_before_v1(void *raw_a, void *raw_b);\ninternal int pair_u64_is_before_v0(void *raw_a, void *raw_b);\ninternal int pair_u64_is_before_v1(void *raw_a, void *raw_b);\n\n////////////////////////////////\n\ninternal void str8_list_concat_in_place_array(String8List *list, String8List *arr, U64 count);\n\n"
  },
  {
    "path": "src/linker/base_ext/base_crc32.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U32\nupdate_crc32(U32 crc, U8 *ptr, U64 size)\n{\n  // CRC-32 algo borrowed from stb.h\n\n  local_persist U32 crc_table[256] = {\n\t\t0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 0xe963a535,\n\t\t0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd,\n\t\t0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, 0x1adad47d,\n\t\t0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,\n\t\t0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,\n\t\t0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,\n\t\t0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac,\n\t\t0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,\n\t\t0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 0x2f6f7c87, 0x58684c11, 0xc1611dab,\n\t\t0xb6662d3d, 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,\n\t\t0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb,\n\t\t0x086d3d2d, 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,\n\t\t0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea,\n\t\t0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 0x4db26158, 0x3ab551ce,\n\t\t0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,\n\t\t0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,\n\t\t0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409,\n\t\t0xce61e49f, 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,\n\t\t0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 0xead54739,\n\t\t0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,\n\t\t0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344, 0x8708a3d2, 0x1e01f268,\n\t\t0x6906c2fe, 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0,\n\t\t0x10da7a5a, 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8,\n\t\t0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,\n\t\t0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,\n\t\t0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 0xcc0c7795, 0xbb0b4703,\n\t\t0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7,\n\t\t0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,\n\t\t0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae,\n\t\t0x0cb61b38, 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,\n\t\t0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 0x88085ae6,\n\t\t0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,\n\t\t0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7, 0x4969474d,\n\t\t0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5,\n\t\t0x47b2cf7f, 0x30b5ffe9, 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,\n\t\t0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,\n\t\t0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d\n  };\n\n#if 0\n  for (U32 i = 0; i < 256; ++i) {\n    U32 s = i;\n    for (U32 j = 0; j < 8; ++j) {\n      s = (s >> 1) ^ (s & 1 ? 0xedb88320 : 0);\n    }\n    crc_table[i] = s;\n  }\n#endif\n\n  crc = ~crc;\n  for (U32 i = 0; i < size; ++i) {\n    crc = (crc >> 8) ^ crc_table[(ptr[i] ^ crc) & 0xff];\n  }\n\n  return ~crc;\n}\n\ninternal U32\ncrc32_from_string(String8 string)\n{\n  return update_crc32(0, string.str, string.size);\n}\n\n"
  },
  {
    "path": "src/linker/base_ext/base_crc32.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal U32 update_crc32(U32 crc, U8 *ptr, U64 size);\ninternal U32 crc32_from_string(String8 string);\n\n"
  },
  {
    "path": "src/linker/base_ext/base_inc.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#include \"base_core.c\"\n#include \"base_strings.c\"\n#include \"base_arena.c\"\n#include \"base_arrays.c\"\n#include \"base_bit_array.c\"\n#include \"base_crc32.c\"\n\n"
  },
  {
    "path": "src/linker/base_ext/base_inc.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n#include \"base_core.h\"\n#include \"base_strings.h\"\n#include \"base_arena.h\"\n#include \"base_arrays.h\"\n#include \"base_blake3.h\"\n#include \"base_bit_array.h\"\n#include \"base_crc32.h\"\n\n"
  },
  {
    "path": "src/linker/base_ext/base_strings.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal B32\nstr8_starts_with(String8 string, String8 expected_prefix)\n{\n  return str8_match(str8_prefix(string, expected_prefix.size), expected_prefix, 0);\n}\n\ninternal String8Node *\nstr8_list_pop_front(String8List *list)\n{\n  String8Node *node = 0;\n  if (list->node_count) {\n\tnode = list->first;\n    Assert(list->total_size >= list->first->string.size);\n    list->node_count -= 1;\n    list->total_size -= list->first->string.size;\n    SLLQueuePop(list->first, list->last);\n  }\n  return node;\n}\n\ninternal U64\nstr8_array_bsearch(String8Array arr, String8 value)\n{\n  if (arr.count > 1) {\n    int lo_compar = str8_compar_case_sensitive(&value, &arr.v[0]);\n    if (lo_compar == 0) {\n      return 0;\n    }\n\n    int hi_compar = str8_compar_case_sensitive(&value, &arr.v[arr.count-1]);\n    if (hi_compar == 0){ \n      return arr.count-1;\n    }\n\n    if (lo_compar > 0 && hi_compar < 0) {\n      for (U64 l = 0, r = arr.count -1; l <= r; ) {\n        U64 m = l + (r- l) / 2;\n        int cmp = str8_compar_case_sensitive(&arr.v[m], &value);\n        if (cmp == 0) {\n          return m;\n        } else if (cmp < 0) {\n          l = m + 1;\n        } else {\n          r = m - 1;\n        }\n      }\n    }\n  } else if (arr.count == 1 && str8_match(arr.v[0], value, 0)) {\n    return 0;\n  }\n  return max_U64;\n}\n"
  },
  {
    "path": "src/linker/base_ext/base_strings.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n// TODO: remove\ninternal String8Node * str8_list_pop_front(String8List *list);\n\ninternal B32 str8_starts_with(String8 string, String8 expected_prefix);\n\ninternal U64 str8_array_bsearch(String8Array arr, String8 value);\n"
  },
  {
    "path": "src/linker/codeview_ext/codeview.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n\ninternal U64\nhash_from_cv_symbol(CV_Symbol *symbol)\n{\n  XXH3_state_t hasher;\n  XXH3_64bits_reset(&hasher);\n  XXH3_64bits_update(&hasher, &symbol->kind, sizeof(symbol->kind));\n  XXH3_64bits_update(&hasher, &symbol->data.size, sizeof(symbol->data.size));\n  XXH3_64bits_update(&hasher, symbol->data.str, symbol->data.size);\n  XXH64_hash_t hash = XXH3_64bits_digest(&hasher);\n  return hash;\n}\n\n////////////////////////////////\n\ninternal CV_ObjInfo\ncv_obj_info_from_symbol(CV_Symbol symbol)\n{\n  CV_ObjInfo result; MemoryZeroStruct(&result);\n  switch (symbol.kind) {\n  case CV_SymKind_OBJNAME: {\n    CV_SymObjName *obj_name = (CV_SymObjName *) symbol.data.str;\n    result.sig = obj_name->sig;\n    str8_deserial_read_cstr(symbol.data, sizeof(CV_SymObjName), &result.name);\n  } break;\n  case CV_SymKind_OBJNAME_ST: {\n    NotImplemented;\n  } break;\n  default: {\n    InvalidPath;\n  } break;\n  }\n  return result;\n}\n\ninternal CV_TypeServerInfo\ncv_type_server_info_from_leaf(CV_Leaf leaf)\n{\n  CV_TypeServerInfo result = {0};\n  switch (leaf.kind) {\n  case CV_LeafKind_TYPESERVER: {\n    CV_LeafTypeServer *ts   = (CV_LeafTypeServer *) leaf.data.str;\n\n    result.name      = str8_cstring_capped_reverse(ts + 1, leaf.data.str + leaf.data.size);\n    result.sig.data1 = ts->sig;\n    result.age       = ts->age;\n  } break;\n  case CV_LeafKind_TYPESERVER2: {\n    CV_LeafTypeServer2 *ts = (CV_LeafTypeServer2 *) leaf.data.str;\n    \n    Assert(sizeof(result.sig) == sizeof(ts->sig70));\n    MemoryCopy(&result.sig, &ts->sig70, sizeof(ts->sig70));\n    result.name = str8_cstring_capped_reverse(ts + 1, leaf.data.str + leaf.data.size);\n    result.age  = ts->age;\n  } break;\n  case CV_LeafKind_TYPESERVER_ST: {\n    Assert(\"TODO: LF_TYPESERVER_ST\");\n  } break;\n  default: InvalidPath;\n  }\n  return result;\n}\n\ninternal CV_PrecompInfo\ncv_precomp_info_from_leaf(CV_Leaf leaf)\n{\n  CV_PrecompInfo result = {0};\n  switch (leaf.kind) {\n  case CV_LeafKind_PRECOMP: {\n    CV_LeafPreComp *precomp = (CV_LeafPreComp*)leaf.data.str;\n    result.start_index = precomp->start_index;\n    result.sig         = precomp->sig;\n    result.leaf_count  = precomp->count;\n    str8_deserial_read_cstr(leaf.data, sizeof(CV_LeafPreComp), &result.obj_name);\n  } break;\n  case CV_LeafKind_PRECOMP_16t: {\n    NotImplemented;\n  } break;\n  case CV_LeafKind_PRECOMP_ST: {\n    NotImplemented;\n  } break;\n  default: {\n    InvalidPath;\n  } break;\n  }\n  return result;\n}\n\n////////////////////////////////\n//~ Leaf Helpers\n\ninternal U64\ncv_compute_leaf_record_size(String8 data, U64 align)\n{\n  U64 size = 0;\n  size += sizeof(CV_LeafSize);\n  size += sizeof(CV_LeafKind);\n  size += data.size;\n  size = AlignPow2(size, align);\n  return size;\n}\n\ninternal U64\ncv_serialize_leaf_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align)\n{\n  U64 buffer_cursor_start = buffer_cursor;\n\n  // compute record size\n  U64 record_size = sizeof(kind) + data.size;\n  Assert(record_size <= CV_LeafSize_Max);\n  CV_LeafSize record_size16 = (CV_LeafSize)record_size;\n\n  // compute pad\n  static U8 LEAF_PAD_ARR[] = { 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff };\n  U64 pad_size = AlignPadPow2(data.size, align);\n  Assert(pad_size <= ArrayCount(LEAF_PAD_ARR));\n\n  // write header\n  CV_LeafHeader *header_ptr = (CV_LeafHeader *)(buffer + buffer_cursor);\n  header_ptr->size = record_size16;\n  header_ptr->kind = kind;\n  buffer_cursor += sizeof(*header_ptr);\n\n  // write body\n  U8 *leaf_data_ptr = buffer + buffer_cursor;\n  MemoryCopy(leaf_data_ptr, data.str, data.size);\n  buffer_cursor += data.size;\n\n  // write pad\n  U8 *pad_data_ptr = buffer + buffer_cursor;\n  MemoryCopy(pad_data_ptr, &LEAF_PAD_ARR[0], pad_size);\n  buffer_cursor += pad_size;\n\n  U64 write_size = buffer_cursor - buffer_cursor_start;\n  return write_size;\n}\n\ninternal String8\ncv_serialize_raw_leaf(Arena *arena, CV_LeafKind kind, String8 data, U64 align)\n{\n  U64      buffer_size = cv_compute_leaf_record_size(data, align);\n  U8      *buffer      = push_array_no_zero(arena, U8, buffer_size);\n  U64      size        = cv_serialize_leaf_to_buffer(buffer, 0, buffer_size, kind, data, align);\n  String8  raw_leaf    = str8(buffer, size);\n  return raw_leaf;\n}\n\ninternal String8\ncv_serialize_leaf(Arena *arena, CV_Leaf *leaf, U64 align)\n{\n  return cv_serialize_raw_leaf(arena, leaf->kind, leaf->data, align);\n}\n\ninternal CV_Leaf\ncv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data)\n{\n  CV_Leaf result = {0};\n  String8 raw_leaf = cv_serialize_raw_leaf(arena, kind, data, 1);\n  cv_deserial_leaf(raw_leaf, 0, 1, &result);\n  return result;\n}\n\ninternal U64\ncv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out)\n{\n  // do we have enough bytes to read header?\n  Assert(raw_data.size >= sizeof(CV_LeafHeader));\n\n  CV_LeafHeader *header = (CV_LeafHeader*)(raw_data.str + off);\n\n  // leaf size must have enough bytes for the kind enum\n  Assert(header->size >= sizeof(CV_LeafKind));\n\n  // do we have enough bytes to read leaf data?\n  Assert(sizeof(CV_LeafSize) + header->size <= raw_data.size);\n\n  // fill out leaf\n  leaf_out->kind = header->kind;\n  leaf_out->data = str8(raw_data.str + sizeof(CV_LeafHeader), header->size - sizeof(CV_LeafKind));\n\n  U64 leaf_size = AlignPow2(sizeof(CV_LeafHeader) + leaf_out->data.size, align);\n  Assert(leaf_size <= raw_data.size);\n  return leaf_size;\n}\n\ninternal CV_Leaf\ncv_leaf_from_string(String8 raw_data)\n{\n  CV_Leaf result;\n  cv_deserial_leaf(raw_data, 0, 1, &result);\n  return result;\n}\n\n////////////////////////////////\n//~ Symbol Helpers\n\ninternal U64\ncv_compute_symbol_record_size(CV_Symbol *symbol, U64 align)\n{\n  U64 size = 0;\n  size += sizeof(CV_SymSize);\n  size += sizeof(CV_SymKind);\n  size += AlignPow2(symbol->data.size, align);\n  return size;\n}\n\ninternal U64\ncv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align)\n{\n  U64 write_size = cv_compute_symbol_record_size(symbol, align);\n  Assert(buffer_cursor + write_size <= buffer_size);\n\n  U64 record_size = 0;\n  record_size += sizeof(symbol->kind);\n  record_size += AlignPow2(symbol->data.size, align);\n  \n  Assert(record_size <= CV_SymSize_Max);\n  CV_SymSize record_size16 = (CV_SymSize)record_size;\n\n  // init header\n  CV_SymbolHeader *header = (CV_SymbolHeader *)(buffer + buffer_cursor);\n  header->size = record_size16;\n  header->kind = symbol->kind;\n\n  // copy symbol data\n  U8 *data_dst = (U8 *)(header + 1);\n  MemoryCopy(data_dst, symbol->data.str, symbol->data.size);\n\n  // set pad bytes\n  U64 pad_size = AlignPadPow2(symbol->data.size, align);\n  U8 *pad_dst = data_dst + symbol->data.size;\n  MemorySet(&pad_dst[0], 0, pad_size);\n\n  return write_size;\n}\n\ninternal String8\ncv_serialize_symbol(Arena *arena, CV_Symbol *symbol, U64 align)\n{\n  U64 buffer_size = cv_compute_symbol_record_size(symbol, align);\n  U8 *buffer = push_array(arena, U8, buffer_size);\n  cv_serialize_symbol_to_buffer(buffer, 0, buffer_size, symbol, align);\n  String8 result = str8(buffer, buffer_size);\n  return result;\n}\n\ninternal String8\ncv_make_symbol(Arena *arena, CV_SymKind kind, String8 data)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  AssertAlways((data.size + sizeof(kind)) <= CV_SymSize_Max);\n  CV_SymSize symbol_size = (CV_SymSize)data.size + sizeof(kind);\n  String8List srl = {0};\n  str8_serial_begin(scratch.arena, &srl);\n  str8_serial_push_struct(scratch.arena, &srl, &symbol_size);\n  str8_serial_push_struct(scratch.arena, &srl, &kind);\n  str8_serial_push_string(scratch.arena, &srl, data);\n  String8 symbol = str8_serial_end(arena, &srl);\n  scratch_end(scratch);\n  ProfEnd();\n  return symbol;\n}\n\ninternal String8\ncv_make_obj_name(Arena *arena, String8 obj_path, U32 sig)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  CV_SymObjName obj = {0};\n  obj.sig = sig;\n  \n  String8List serial = {0};\n  str8_serial_begin(scratch.arena, &serial);\n  str8_serial_push_struct(scratch.arena, &serial, &obj);\n  str8_serial_push_cstr(scratch.arena, &serial, obj_path);\n  String8 result = str8_serial_end(arena, &serial);\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal String8\ncv_make_comp3(Arena *arena,\n              CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, \n              U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe,\n              U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe,\n              String8 version_string)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  CV_SymCompile3 comp = {0};\n  comp.flags          = flags | lang;\n  comp.machine        = arch;\n  comp.ver_fe_major   = ver_fe_major;\n  comp.ver_fe_minor   = ver_fe_minor;\n  comp.ver_fe_build   = ver_fe_build;\n  comp.ver_feqfe      = ver_feqfe;\n  comp.ver_major      = ver_major;\n  comp.ver_minor      = ver_minor;\n  comp.ver_build      = ver_build;\n  comp.ver_qfe        = ver_qfe;\n  \n  String8List serial = {0};\n  str8_serial_begin(scratch.arena, &serial);\n  str8_serial_push_struct(scratch.arena, &serial, &comp);\n  str8_serial_push_cstr(scratch.arena, &serial, version_string);\n  String8 result = str8_serial_end(arena, &serial);\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal String8\ncv_make_envblock(Arena *arena, String8List string_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List serial = {0};\n  str8_serial_begin(scratch.arena, &serial);\n  CV_SymEnvBlock envblock = {0};\n  str8_serial_push_struct(scratch.arena, &serial, &envblock);\n  for (String8Node *n = string_list.first; n != NULL; n = n->next) {\n    str8_serial_push_cstr(scratch.arena, &serial, n->string);\n  }\n  String8 result = str8_serial_end(arena, &serial);\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal CV_Symbol\ncv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local)\n{\n  U64 buffer_size = sizeof(CV_SymRef2) + name.size + 1;\n  U8 *buffer      = push_array_no_zero(arena, U8, buffer_size);\n  \n  CV_SymRef2 *ref = (CV_SymRef2*)buffer;\n  ref->suc_name = 0;\n  ref->sym_off  = stream_offset;\n  ref->imod     = imod + 1; // MSVC adds one\n  \n  U8 *name_ptr = (U8*)(ref + 1);\n  MemoryCopy(name_ptr, name.str, name.size);\n  name_ptr[name.size] = '\\0';\n  \n  CV_Symbol symbol;\n  symbol.kind   = is_local ? CV_SymKind_LPROCREF : CV_SymKind_PROCREF;\n  symbol.data   = str8(buffer, buffer_size);\n  symbol.offset = max_U64;\n  \n  return symbol;\n}\n\ninternal CV_Symbol\ncv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name)\n{\n  U64 buffer_size = sizeof(CV_SymPub32) + name.size + 1;\n  U8 *buffer      = push_array_no_zero(arena, U8, buffer_size);\n\n  CV_SymPub32 *pub = (CV_SymPub32 *)buffer;\n  pub->flags = flags;\n  pub->off   = off;\n  pub->sec   = isect;\n  \n  U8 *name_ptr = (U8*)(pub + 1);\n  MemoryCopy(name_ptr, name.str, name.size);\n  name_ptr[name.size] = '\\0';\n  \n  CV_Symbol symbol;\n  symbol.kind = CV_SymKind_PUB32;\n  symbol.data = str8(buffer, buffer_size);\n  \n  return symbol;\n}\n\ninternal CV_SymbolList\ncv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list)\n{\n  CV_SymbolList proc_ref_list = {0};\n  for (CV_SymbolNode *symbol_node = symbol_list.first; symbol_node != 0; symbol_node = symbol_node->next) {\n    CV_Symbol *symbol = &symbol_node->data;\n    if (symbol->kind == CV_SymKind_GPROC32) {\n      String8        name          = cv_name_from_symbol(symbol->kind, symbol->data);\n      CV_Symbol      ref           = cv_make_proc_ref(arena, imod, safe_cast_u32(symbol->offset), name, /* is_local: */ 0);\n      CV_SymbolNode *proc_ref_node = cv_symbol_list_push(arena, &proc_ref_list);\n      proc_ref_node->data = ref;\n    } else if (symbol->kind == CV_SymKind_LPROC32) {\n      String8        name          = cv_name_from_symbol(symbol->kind, symbol->data);\n      CV_Symbol      ref           = cv_make_proc_ref(arena, imod, safe_cast_u32(symbol->offset), name, /* is_local */ 1);\n      CV_SymbolNode *proc_ref_node = cv_symbol_list_push(arena, &proc_ref_list);\n      proc_ref_node->data = ref;\n    }\n  }\n  return proc_ref_list;\n}\n\n////////////////////////////////\n//~ .debug$S helpers\n\ninternal void\ncv_parse_debug_s_c13_(Arena *arena, CV_DebugS *debug_s, String8 raw_debug_s)\n{\n  for (U64 cursor = 0; cursor + sizeof(CV_C13SubSectionHeader) <= raw_debug_s.size; ) {\n    // read header\n    CV_C13SubSectionHeader header = {0};\n    cursor += str8_deserial_read_struct(raw_debug_s, cursor, &header);\n\n    if (~header.kind & CV_C13SubSectionKind_IgnoreFlag) {\n      // pick sub-section list\n      U64          sub_sect_idx  = cv_c13_sub_section_idx_from_kind(header.kind);\n      String8List *sub_sect_list = debug_s->data_list + sub_sect_idx;\n\n      // push data to sub-section\n      Rng1U64 sub_sect_range = r1u64(cursor, cursor + header.size);\n      String8 sub_sect_data  = str8_substr(raw_debug_s, sub_sect_range);\n      str8_list_push(arena, sub_sect_list, sub_sect_data);\n    }\n\n    // advance\n    cursor += header.size;\n    cursor = AlignPow2(cursor, CV_C13SubSectionAlign);\n  }\n}\n\ninternal CV_DebugS\ncv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s)\n{\n  CV_DebugS debug_s = {0};\n  cv_parse_debug_s_c13_(arena, &debug_s, raw_debug_s);\n  return debug_s;\n}\n\ninternal CV_DebugS\ncv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s)\n{\n  CV_DebugS debug_s = {0};\n  for (String8Node *node = raw_debug_s.first; node != 0; node = node->next) {\n    cv_parse_debug_s_c13_(arena, &debug_s, node->string);\n  }\n  return debug_s;\n}\n\ninternal CV_DebugS \ncv_parse_debug_s(Arena *arena, String8 raw_debug_s)\n{\n  CV_DebugS result; MemoryZeroStruct(&result);\n  if (raw_debug_s.size >= sizeof(CV_Signature)) {\n    CV_Signature sig = *(CV_Signature *)raw_debug_s.str;\n    switch (sig) {\n    case CV_Signature_C13: {\n      String8 raw_debug_s_past_sig = str8_substr(raw_debug_s, r1u64(sizeof(sig), raw_debug_s.size));\n      result = cv_parse_debug_s_c13(arena, raw_debug_s_past_sig);\n    } break;\n    case CV_Signature_C6: {\n      Assert(!\"TODO: handle C6\");\n    } break;\n    case CV_Signature_C7: {\n      Assert(!\"TODO: handle C7\");\n    } break;\n    case CV_Signature_C11: {\n      Assert(!\"TODO: handle C11\");\n    } break;\n    default: Assert(!\"invalid signature\"); break;\n    }\n  }\n  return result;\n}\n\ninternal void\ncv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src)\n{\n  for (U64 sub_sect_idx = 0; sub_sect_idx < ArrayCount(dst->data_list); sub_sect_idx += 1) {\n    str8_list_concat_in_place(&dst->data_list[sub_sect_idx], &src->data_list[sub_sect_idx]);\n  }\n}\n\ninternal String8List\ncv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig)\n{\n  String8List srl = {0};\n  str8_serial_begin(arena, &srl);\n  \n  if (write_sig) {\n    CV_Signature sig = CV_Signature_C13;\n    str8_serial_push_struct(arena, &srl, &sig);\n  }\n  \n  static CV_C13SubSectionKind layout_arr[] = {\n    CV_C13SubSectionKind_Symbols,\n    //CV_C13SubSectionKind_Lines,\n    CV_C13SubSectionKind_FileChksms,\n    CV_C13SubSectionKind_FrameData,\n    CV_C13SubSectionKind_InlineeLines,\n    CV_C13SubSectionKind_IlLines,\n    CV_C13SubSectionKind_CrossScopeImports,\n    CV_C13SubSectionKind_CrossScopeExports,\n    CV_C13SubSectionKind_FuncMDTokenMap,\n    CV_C13SubSectionKind_TypeMDTokenMap,\n    CV_C13SubSectionKind_MergedAssemblyInput,\n    CV_C13SubSectionKind_CoffSymbolRVA,\n    CV_C13SubSectionKind_XfgHashType,\n    CV_C13SubSectionKind_XfgHashVirtual,\n  };\n  \n  for (U64 layout_idx = 0; layout_idx < ArrayCount(layout_arr); layout_idx += 1) {\n    CV_C13SubSectionKind kind = layout_arr[layout_idx];\n    String8List *data = cv_sub_section_ptr_from_debug_s(debug_s, kind);\n    if (data->total_size > 0) {\n      U32 size32 = safe_cast_u32(data->total_size);\n      str8_serial_push_u32(arena, &srl, kind);\n      str8_serial_push_u32(arena, &srl, size32);\n      str8_serial_push_data_list(arena, &srl, data->first);\n      str8_serial_push_align(arena, &srl, 4);\n    }\n  }\n  \n  String8List *line_data = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Lines);\n  for (String8Node *line_node = line_data->first; line_node != 0; line_node = line_node->next) {\n    str8_serial_push_u32(arena, &srl, CV_C13SubSectionKind_Lines);\n    str8_serial_push_u32(arena, &srl, safe_cast_u32(line_node->string.size));\n    str8_serial_push_string(arena, &srl, line_node->string);\n    str8_serial_push_align(arena, &srl, 4);\n  }\n  \n  return srl;\n}\n\ninternal CV_C13SubSectionIdxKind\ncv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind)\n{\n  switch (kind) {\n#define X(n,c) case CV_C13SubSectionKind_##n: return CV_C13SubSectionIdxKind_##n;\n    CV_C13SubSectionKindXList(X)\n#undef X\n  }\n  return CV_C13SubSectionIdxKind_NULL;\n} \n\ninternal String8List *\ncv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind)\n{\n  CV_C13SubSectionIdxKind idx = cv_c13_sub_section_idx_from_kind(kind);\n  return &debug_s->data_list[idx];\n}\n\ninternal String8List\ncv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind)\n{\n  String8List *list_ptr = cv_sub_section_ptr_from_debug_s(&debug_s, kind);\n  return *list_ptr;\n}\n\ninternal String8\ncv_string_table_from_debug_s(CV_DebugS debug_s)\n{\n  String8List data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable);\n  String8 string_data = str8_zero();\n  if (data_list.node_count > 0) {\n    string_data = data_list.first->string;\n  }\n  return string_data;\n}\n\ninternal String8\ncv_file_chksms_from_debug_s(CV_DebugS debug_s)\n{\n  String8List data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms);\n  String8 file_chksms = str8_zero();\n  if (data_list.node_count > 0) {\n    file_chksms = data_list.first->string;\n  }\n  return file_chksms;\n}\n\n////////////////////////////////\n//~ String Table Deduper\n\ninternal U64\ncv_string_hash_table_hash(String8 string)\n{\n  return u64_hash_from_str8(string);\n}\n\ninternal int\ncv_string_bucket_is_before(void *raw_a, void *raw_b)\n{\n  CV_StringBucket **a = raw_a;\n  CV_StringBucket **b = raw_b;\n\n  int is_before;\n\n  if ((*a)->u.idx0 == (*b)->u.idx0) {\n    is_before = (*a)->u.idx1 < (*b)->u.idx1;\n  } else {\n    is_before = (*a)->u.idx0 < (*b)->u.idx0;\n  }\n\n  return is_before;\n}\n\ninternal CV_StringBucket *\ncv_string_hash_table_insert_or_update(CV_StringBucket **buckets, U64 cap, U64 hash, CV_StringBucket *new_bucket)\n{\n  CV_StringBucket *result                         = 0;\n  B32              was_bucket_inserted_or_updated = 0;\n\n  U64 best_idx = hash % cap;\n  U64 idx      = best_idx;\n\n  do {\n    retry:;\n    CV_StringBucket *curr_bucket = buckets[idx];\n\n    if (curr_bucket == 0) {\n      CV_StringBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    } else if (str8_match(curr_bucket->string, new_bucket->string, 0)) {\n      if (cv_string_bucket_is_before(&curr_bucket, &new_bucket)) {\n        // recycle bucket\n        result = new_bucket;\n\n        // don't need to update, more recent leaf is in the bucket\n        was_bucket_inserted_or_updated = 1;\n\n        break;\n      }\n\n      CV_StringBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n\n        // recycle bucket\n        result = compare_bucket;\n\n        // new bucket is in the hash table, exit\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    }\n\n    // advance\n    idx = (idx + 1) % cap;\n  } while (idx != best_idx);\n\n  // are there enough free buckets?\n  Assert(was_bucket_inserted_or_updated);\n\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_count_strings_in_debug_s_arr_task)\n{\n  ProfBeginFunction();\n  CV_DedupStringTablesTask *task          = raw_task;\n  CV_StringTableRange      *range_list    = task->range_lists[task_id];\n\n  for (CV_StringTableRange *range_n = range_list; range_n != 0; range_n = range_n->next) {\n    CV_DebugS debug_s       = task->arr[range_n->debug_s_idx];\n    String8   string_buffer = cv_string_table_from_debug_s(debug_s);\n\n    Assert(range_n->range.min <= range_n->range.max);\n    Assert(range_n->range.min <= string_buffer.size);\n    Assert(range_n->range.max <= string_buffer.size);\n\n    U64 count = 0;\n    for (U64 i = range_n->range.min; i < range_n->range.max; ++i) {\n      U8 b = string_buffer.str[i];\n      if (b == '\\0') {\n        count += 1;\n      }\n    }\n\n    ins_atomic_u64_add_eval(&task->string_counts[range_n->debug_s_idx], count);\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_dedup_strings_in_debug_s_arr_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  U64                       debug_s_idx = task_id;\n  CV_DedupStringTablesTask *task        = raw_task;\n  CV_DebugS                 debug_s     = task->arr[debug_s_idx];\n\n  String8     string_table = cv_string_table_from_debug_s(debug_s);\n  String8List strings_list = str8_split_by_string_chars(scratch.arena, string_table, str8_lit(\"\\0\"), 0);\n\n  CV_StringBucket *bucket = 0;\n\n  U64 total_string_size  = 0;\n  U64 total_insert_count = 0;\n\n  U64 string_idx = 0;\n\n\n  for (String8Node *string_n = strings_list.first; string_n != 0; string_n = string_n->next, ++string_idx) {\n    if (bucket == 0) {\n      bucket = push_array_no_zero(arena, CV_StringBucket, 1);\n    }\n\n    bucket->u.idx0 = debug_s_idx;\n    bucket->u.idx1 = string_idx;\n    bucket->string = string_n->string;\n\n    U64              hash             = cv_string_hash_table_hash(string_n->string);\n    CV_StringBucket *insert_or_update = cv_string_hash_table_insert_or_update(task->buckets, task->bucket_cap, hash, bucket);\n\n    if (insert_or_update == 0) {\n      total_string_size  += string_n->string.size;\n      total_insert_count += 1;\n    }\n\n    if (insert_or_update != bucket) {\n      bucket = 0;\n    }\n  }\n\n  ins_atomic_u64_add_eval(&task->total_string_size, total_string_size);\n  ins_atomic_u64_add_eval(&task->total_insert_count, total_insert_count);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal CV_StringHashTable\ncv_dedup_string_tables(TP_Arena *arena, TP_Context *tp, U64 count, CV_DebugS *arr)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Compute Total Weight\");\n  U64 total_weight = 0;\n  for (U64 i = 0; i < count; ++i) {\n    String8 string_table = cv_string_table_from_debug_s(arr[i]);\n    total_weight += string_table.size;\n  }\n  ProfEnd();\n\n  U64                   per_task_weight = CeilIntegerDiv(total_weight, tp->worker_count);\n  U64                   task_weight     = 0;\n  U64                   task_id         = 0;\n  CV_StringTableRange **range_lists     = push_array(scratch.arena, CV_StringTableRange *, tp->worker_count);\n\n  ProfBegin(\"Divide Work\");\n  for (U64 debug_s_idx = 0; debug_s_idx < count; ++debug_s_idx) {\n    String8 string_table = cv_string_table_from_debug_s(arr[debug_s_idx]);\n\n    for (U64 cursor = 0; cursor < string_table.size; cursor += per_task_weight) {\n      if (task_weight >= per_task_weight) {\n        task_id     = (task_id + 1) % tp->worker_count;\n        task_weight = 0;\n      }\n\n      U64 max_range_weight = Min(per_task_weight, string_table.size - cursor);\n\n      CV_StringTableRange *node = push_array(scratch.arena, CV_StringTableRange, 1);\n      node->range               = rng_1u64(cursor, cursor + max_range_weight);\n      node->debug_s_idx         = debug_s_idx;\n\n      SLLStackPush(range_lists[task_id], node);\n      task_weight += max_range_weight;\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Count\");\n  CV_DedupStringTablesTask task = {0};\n  task.arr                      = arr;\n  task.range_lists              = range_lists;\n  task.string_counts            = push_array(scratch.arena, U64, count);\n  tp_for_parallel(tp, 0, tp->worker_count, cv_count_strings_in_debug_s_arr_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Dedup\");\n  U64 total_string_count = sum_array_u64(count, task.string_counts);\n  task.bucket_cap = (U64)((F64)total_string_count * 1.3);\n  task.buckets    = push_array(arena->v[0], CV_StringBucket *, task.bucket_cap);\n  tp_for_parallel(tp, arena, count, cv_dedup_strings_in_debug_s_arr_task, &task);\n  ProfEnd();\n\n  CV_StringHashTable string_ht = {0};\n  string_ht.total_string_size  = task.total_string_size;\n  string_ht.total_insert_count = task.total_insert_count;\n  string_ht.bucket_cap         = task.bucket_cap;\n  string_ht.buckets            = task.buckets;\n\n  scratch_end(scratch);\n  ProfEnd();\n  return string_ht;\n}\n\ninternal void\ncv_string_hash_table_assign_buffer_offsets(TP_Context *tp, CV_StringHashTable string_ht)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  ProfBegin(\"Count Strings\");\n  U64 string_count = 0;\n  for (U64 i = 0; i < string_ht.bucket_cap; ++i) {\n    if (string_ht.buckets[i] != 0) {\n      string_count += 1;\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Push\");\n  CV_StringBucket **strings = push_array_no_zero(scratch.arena, CV_StringBucket *, string_count);\n  ProfEnd();\n\n  ProfBegin(\"Copy Present Buckets\");\n  for (U64 i = 0, string_idx = 0; i < string_ht.bucket_cap; ++i) {\n    if (string_ht.buckets[i] != 0) {\n      strings[string_idx++] = string_ht.buckets[i];\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Sort\");\n  radsort(strings, string_count, cv_string_bucket_is_before);\n  ProfEnd();\n\n  ProfBegin(\"Assign Offsets\");\n  for (U64 i = 0, offset_cursor = 0; i < string_count; ++i) {\n    CV_StringBucket *s = strings[i];\n    s->u.offset = offset_cursor;\n    offset_cursor += s->string.size + 1;\n  }\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal CV_StringBucket *\ncv_string_hash_table_lookup(CV_StringHashTable ht, String8 string)\n{\n  U64 hash     = cv_string_hash_table_hash(string);\n  U64 best_idx = hash % ht.bucket_cap;\n  U64 idx      = best_idx;\n\n  do {\n    if (ht.buckets[idx] == 0) {\n      break;\n    }\n\n    if (str8_match(ht.buckets[idx]->string, string, 0)) {\n      return ht.buckets[idx];\n    }\n\n    idx = (idx + 1) % ht.bucket_cap;\n  } while (idx != best_idx);\n\n  return 0;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_pack_string_hash_table_task)\n{\n  ProfBeginFunction();\n  CV_PackStringHashTableTask *task  = raw_task;\n  Rng1U64                     range = task->ranges[task_id];\n  for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) {\n    CV_StringBucket *bucket = task->buckets[bucket_idx];\n    if (bucket) {\n      MemoryCopy(task->buffer + bucket->u.offset, bucket->string.str, bucket->string.size);\n      task->buffer[bucket->u.offset + bucket->string.size] = '\\0';\n    }\n  }\n  ProfEnd();\n}\n\ninternal String8\ncv_pack_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable string_ht)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  U64  buffer_size = string_ht.total_string_size + /* nulls: */ string_ht.total_insert_count;\n  U8  *buffer      = push_array_no_zero(arena, U8, buffer_size);\n\n  CV_PackStringHashTableTask task = {0};\n  task.buckets                    = string_ht.buckets;\n  task.buffer                     = buffer;\n  task.ranges                     = tp_divide_work(scratch.arena, string_ht.bucket_cap, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, cv_pack_string_hash_table_task, &task);\n\n  String8 result = str8(buffer, buffer_size);\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\n////////////////////////////////\n//~ Symbol Deduper\n\ninternal int\ncv_symbol_deduper_is_before(void *raw_a, void *raw_b)\n{\n  return raw_a < raw_b;\n}\n\ninternal CV_SymbolNode **\ncv_symbol_deduper_insert_or_update(CV_SymbolNode ***buckets, U64 cap, U64 hash, CV_SymbolNode **new_bucket)\n{\n  CV_SymbolNode **result                 = 0;\n  B32             is_inserted_or_updated = 0;\n\n  U64 best_idx = hash % cap;\n  U64 idx      = best_idx;\n\n  do {\n    retry:;\n    CV_SymbolNode **curr_bucket = buckets[idx];\n\n    Assert(curr_bucket != new_bucket);\n\n    if (curr_bucket == 0) {\n      CV_SymbolNode **compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        is_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    } else if ((*curr_bucket)->data.kind == (*new_bucket)->data.kind &&\n               (*curr_bucket)->data.data.size == (*new_bucket)->data.data.size &&\n               MemoryMatch((*curr_bucket)->data.data.str, (*new_bucket)->data.data.str, (*new_bucket)->data.data.size)) {\n      if (cv_symbol_deduper_is_before(curr_bucket, new_bucket)) {\n        result = new_bucket;\n\n        is_inserted_or_updated = 1;\n\n        // don't need to update, more recent leaf is in the bucket\n        break;\n      }\n\n      CV_SymbolNode **compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n      if (compare_bucket == curr_bucket) {\n        result = compare_bucket;\n\n        is_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    }\n\n    // advance\n    idx = (idx + 1) % cap;\n  } while (idx != best_idx);\n\n  Assert(is_inserted_or_updated);\n\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_symbol_deduper_insert_task)\n{\n  ProfBeginFunction();\n  CV_SymbolDeduperTask *task  = raw_task;\n  Rng1U64               range = task->ranges[task_id];\n  for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) {\n    CV_SymbolNode **symbol_node = &task->symbols[symbol_idx];\n    U64             hash        = hash_from_cv_symbol(&(*symbol_node)->data);\n    cv_symbol_deduper_insert_or_update(task->u.buckets, task->cap, hash, symbol_node);\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_symbol_deduper_deref_buckets_task)\n{\n  ProfBeginFunction();\n  CV_SymbolDeduperTask *task  = raw_task;\n  Rng1U64               range = task->ranges[task_id];\n  for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) {\n    CV_SymbolNode **bucket = task->u.buckets[bucket_idx];\n    if (bucket) {\n      task->u.deref_buckets[bucket_idx] = *bucket;\n    }\n  }\n  ProfEnd();\n}\n\ninternal void\ncv_dedup_symbol_ptr_array(TP_Context *tp, CV_SymbolPtrArray *symbols)\n{\n  ProfBeginDynamic(\"Dedup Symbols [Count %llu]\", symbols->count);\n  Temp scratch = scratch_begin(0, 0);\n\n  ProfBegin(\"Setup Task\");\n  CV_SymbolDeduperTask task = {0};\n  task.symbols              = symbols->v;\n  task.cap                  = (U64)((F64)symbols->count * 1.3);\n  task.u.buckets            = push_array(scratch.arena, CV_SymbolNode **, task.cap);\n  ProfEnd();\n\n  ProfBegin(\"Dedup\");\n  task.ranges = tp_divide_work(scratch.arena, symbols->count, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_deduper_insert_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Deref Buckets\");\n  task.ranges = tp_divide_work(scratch.arena, task.cap, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_deduper_deref_buckets_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Copy Extant Buckets\");\n  U64 unique_symbol_count = 0;\n  for (U64 bucket_idx = 0; bucket_idx < task.cap; ++bucket_idx) {\n    CV_SymbolNode *bucket = task.u.deref_buckets[bucket_idx];\n    if (bucket) {\n      symbols->v[unique_symbol_count++] = bucket;\n    }\n  }\n  ProfEnd();\n\n  Assert(unique_symbol_count <= symbols->count);\n  symbols->count = unique_symbol_count;\n\n  ProfBeginDynamic(\"Sort [Count %llu]\", symbols->count);\n  radsort(symbols->v, symbols->count, cv_symbol_deduper_is_before);\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\n////////////////////////////////\n//~ .debug$T helpers\n\ninternal CV_DebugT\ncv_debug_t_from_data_arr(Arena *arena, String8Array data_arr, U64 align)\n{\n  ProfBegin(\"Upfront parse\");\n  U64 max_leaf_count = 0;\n  for (U64 data_idx = 0; data_idx < data_arr.count; data_idx += 1) {\n    String8 data = data_arr.v[data_idx];\n    for (U64 cursor = 0; cursor < data.size; ) {\n      CV_Leaf leaf;\n      cursor += cv_deserial_leaf(data, cursor, align, &leaf);\n      max_leaf_count += 1;\n    }\n  }\n  ProfEnd();\n\n  U8 **leaf_arr   = push_array_no_zero(arena, U8 *, max_leaf_count);\n  U64  leaf_count = 0;\n  for (U64 data_idx = 0; data_idx < data_arr.count; data_idx += 1) {\n    String8 data = data_arr.v[data_idx];\n\n    U64 cursor = 0;\n    while (cursor < data.size) {\n      CV_Leaf leaf;\n      U64 read_size = cv_deserial_leaf(data, cursor, align, &leaf);\n\n      Assert(leaf_count < max_leaf_count);\n      leaf_arr[leaf_count] = str8_deserial_get_raw_ptr(data, cursor, read_size);\n      leaf_count += 1;\n\n      // advance cursor\n      cursor += read_size;\n    }\n  }\n\n  CV_DebugT debug_t = {0};\n  debug_t.count     = leaf_count;\n  debug_t.v         = leaf_arr;\n  return debug_t;\n}\n\ninternal CV_DebugT\ncv_debug_t_from_data(Arena *arena, String8 data, U64 align)\n{\n  String8Array arr = {0};\n  arr.count        = 1;\n  arr.v            = &data;\n  return cv_debug_t_from_data_arr(arena, arr, align);\n}\n\ninternal CV_Leaf\ncv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx)\n{\n  Assert(leaf_idx < debug_t.count);\n\n  U8 *ptr = debug_t.v[leaf_idx];\n  String8 data = str8(ptr, max_U64);\n\n  CV_Leaf leaf;\n  cv_deserial_leaf(data, 0, 1, &leaf);\n\n  U64 size = cv_header_struct_size_from_leaf_kind(leaf.kind);\n  Assert(size <= leaf.data.size);\n\n  return leaf;\n}\n\ninternal String8\ncv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx)\n{\n  Assert(leaf_idx < debug_t.count);\n  U8          *leaf_ptr   = debug_t.v[leaf_idx];\n  CV_LeafSize *size_ptr   = (CV_LeafSize *)leaf_ptr;\n  CV_LeafSize  total_size = sizeof(*size_ptr) + *size_ptr;\n  String8 raw_leaf = str8(leaf_ptr, total_size);\n  return raw_leaf;\n}\n\ninternal CV_LeafHeader *\ncv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx)\n{\n  Assert(leaf_idx < debug_t.count);\n  CV_LeafHeader *leaf_header = (CV_LeafHeader *) debug_t.v[leaf_idx];\n  return leaf_header;\n}\n\ninternal B32\ncv_debug_t_is_pch(CV_DebugT debug_t)\n{\n  if (debug_t.count > 0) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0);\n    return cv_is_leaf_pch(leaf.kind);\n  }\n  return 0;\n}\n\ninternal B32\ncv_debug_t_is_type_server(CV_DebugT debug_t)\n{\n  if (debug_t.count > 0) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, 0);\n    return cv_is_leaf_type_server(leaf.kind);\n  }\n  return 0;\n}\n\ninternal U64\ncv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr)\n{\n  U64 total_leaf_count = 0;\n  for (U64 i = 0; i < count; i += 1) {\n    total_leaf_count += arr[i].count;\n  }\n  return total_leaf_count;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_str8_list_from_debug_t_task)\n{\n  CV_Str8ListFromDebugT *task = raw_task;\n  for (U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) {\n    String8Node *node = &task->nodes[leaf_idx];\n    node->string = cv_debug_t_get_raw_leaf(task->debug_t, leaf_idx);\n    str8_list_push_node(&task->lists[task_id], node);\n  }\n}\n\ninternal String8List\ncv_str8_list_from_debug_t_parallel(TP_Context *tp, Arena *arena, CV_DebugT debug_t)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  // build lists in parallel\n  CV_Str8ListFromDebugT task = {0};\n  task.debug_t = debug_t;\n  task.ranges  = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count);\n  task.lists   = push_array(scratch.arena, String8List, tp->worker_count);\n  task.nodes   = push_array_no_zero(arena, String8Node, debug_t.count);\n  tp_for_parallel(tp, 0, tp->worker_count, cv_str8_list_from_debug_t_task, &task);\n\n  // concat output lists\n  String8List list = {0};\n  for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) {\n    str8_list_concat_in_place(&list, &task.lists[task_id]);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n  return list;\n}\n\n// $$Symbols\n\ninternal void\ncv_parse_symbol_sub_section_capped(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align, U64 cap)\n{\n  U64 count = 0;\n  for (U64 cursor = 0, opl = data.size; cursor < opl && count < cap; count += 1) {\n    // read symbol header\n    CV_SymbolHeader header;\n    cursor += str8_deserial_read_struct(data, cursor, &header);\n    \n    // size from header has to be larger than 2 bytes\n    if (header.size < sizeof(header.kind)) {\n      Assert(!\"TODO: error handle invalid symbol data\");\n      break;\n    }\n    \n    // is there enough bytes in the range?\n    U64 symbol_opl = cursor + (header.size - sizeof(header.kind));\n    if (symbol_opl > opl) {\n      Assert(!\"TODO: error handle corrupted symbol data\");\n      break;\n    }\n    \n    // get symbol data\n    Rng1U64 symbol_data_range = r1u64(cursor, symbol_opl);\n    String8 symbol_data       = str8_substr(data, symbol_data_range);\n    \n    // init symbol\n    CV_SymbolNode *node = cv_symbol_list_push(arena, list);\n    node->data.offset   = offset_base + cursor;\n    node->data.kind     = header.kind;\n    node->data.data     = symbol_data;\n    \n    // advance cursor\n    cursor = symbol_opl;\n    cursor = AlignPow2(cursor, align);\n  }\n}\n\ninternal void\ncv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align)\n{\n  cv_parse_symbol_sub_section_capped(arena, list, offset_base, data, align, max_U64);\n}\n\ninternal CV_SymbolList\ncv_symbol_list_from_data_list(Arena *arena, String8List data_list, U64 align)\n{\n  CV_SymbolList symbol_list = {0};\n  U64 cursor = 0;\n  for (String8Node *sect = data_list.first; sect != 0; cursor += sect->string.size, sect = sect->next) {\n    cv_parse_symbol_sub_section(arena, &symbol_list, cursor, sect->string, align);\n  }\n  return symbol_list;\n}\n\ninternal void\ncv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node)\n{\n  node->prev = 0;\n  node->next = 0;\n  DLLPushBack(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal CV_SymbolNode *\ncv_symbol_list_push(Arena *arena, CV_SymbolList *list)\n{\n  CV_SymbolNode *node = push_array(arena, CV_SymbolNode, 1);\n  cv_symbol_list_push_node(list, node);\n  return node;\n}\n\ninternal CV_SymbolNode *\ncv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data)\n{\n  CV_SymbolNode *node = cv_symbol_list_push(arena, list);\n  node->data.kind = kind;\n  node->data.data = data;\n  return node;\n}\n\ninternal CV_SymbolNode *\ncv_symbol_list_push_many(Arena *arena, CV_SymbolList *list, U64 count)\n{\n  CV_SymbolNode *node_arr = push_array_no_zero(arena, CV_SymbolNode, 1);\n  for (U64 node_idx = 0; node_idx < count; node_idx += 1) {\n    cv_symbol_list_push_node(list, &node_arr[node_idx]);\n  }\n  return node_arr;\n}\n\ninternal void\ncv_symbol_list_remove_node(CV_SymbolList *list, CV_SymbolNode *node)\n{\n  Assert(list->count > 0);\n  list->count -= 1;\n  DLLRemove(list->first, list->last, node);\n}\n\ninternal void\ncv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal void\ncv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat)\n{\n  SLLConcatInPlaceArray(list, to_concat, count);\n}\n\ninternal U64\ncv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr)\n{\n  U64 result = 0;\n  for (U64 idx = 0; idx < count; idx += 1) {\n    result += list_arr[idx].count;\n  }\n  return result;\n}\n\ninternal String8List\ncv_data_from_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align)\n{\n  String8List data_list = {0};\n  for (CV_SymbolNode *node = symbol_list.first; node != 0; node = node->next) {\n    String8 data = cv_serialize_symbol(arena, &node->data, align);\n    str8_list_push(arena, &data_list, data);\n  }\n  return data_list;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(cv_symbol_list_syncer)\n{\n  ProfBeginFunction();\n\n  CV_SymbolListSyncer *task = raw_task;\n\n  // context shortcuts\n  Rng1U64 list_range  = task->list_range_arr[task_id];\n  U64     symbol_base = task->symbol_base_arr[task_id];\n\n  for (U64 list_idx = list_range.min, symbol_idx = symbol_base; list_idx < list_range.max; list_idx += 1) {\n    // pick up assigned list\n    CV_SymbolList list = task->list_arr[list_idx];\n\n    // fill out assigned range in the symbol array\n    for (CV_SymbolNode *node = list.first; node != 0; node = node->next, symbol_idx += 1) {\n      task->symbol_arr[symbol_idx] = node;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal CV_SymbolPtrArray\ncv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *list_arr)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  U64 total_count = cv_symbol_list_arr_get_count(count, list_arr);\n\n  CV_SymbolListSyncer task = {0};\n  task.list_arr            = list_arr;\n  task.symbol_arr          = push_array_no_zero(arena, CV_SymbolNode *, total_count);\n  task.symbol_base_arr     = push_array_no_zero(scratch.arena, U64, tp->worker_count);\n  task.list_range_arr      = tp_divide_work(scratch.arena, count, tp->worker_count);\n\n  for (U64 thread_idx = 0, symbol_base = 0; thread_idx < tp->worker_count; thread_idx += 1) {\n    task.symbol_base_arr[thread_idx] = symbol_base;\n    Rng1U64 range = task.list_range_arr[thread_idx];\n    for (U64 list_idx = range.min; list_idx < range.max; list_idx += 1) {\n      symbol_base += list_arr[list_idx].count;\n    }\n  }\n\n  tp_for_parallel(tp, 0, tp->worker_count, cv_symbol_list_syncer, &task);\n\n  CV_SymbolPtrArray result = {0};\n  result.count             = total_count;\n  result.v                 = task.symbol_arr;\n\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal CV_Scope *\ncv_scope_list_push(Arena *arena, CV_ScopeList *list)\n{\n  CV_Scope *node = push_array(arena, CV_Scope, 1);\n  SLLQueuePush(list->first, list->last, node);\n  return node;\n}\n\ninternal CV_SymbolList\ncv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list)\n{\n  CV_SymbolList gsym_list = {0};\n  S64 scope_depth = 0;\n  for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) {\n    CV_Symbol symbol = symbol_n->data;\n    if (cv_is_global_symbol(symbol.kind) && scope_depth == 0) {\n      cv_symbol_list_push_data(arena, &gsym_list, symbol.kind, symbol.data);\n    } else if (cv_is_scope_symbol(symbol.kind)) {\n      scope_depth += 1;\n    } else if (cv_is_end_symbol(symbol.kind)) {\n      scope_depth -= 1;\n      if (scope_depth < 0) {\n        break;\n      }\n    }\n  }\n  return gsym_list;\n}\n\ninternal CV_ScopeList\ncv_symbol_tree_from_symbol_list(Arena *arena, CV_SymbolList list)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  CV_ScopeList root = {0};\n  \n  // setup root frame\n  CV_ScopeFrame *stack = push_array(scratch.arena, CV_ScopeFrame, 1);\n  stack->list = &root;\n  \n  for (CV_SymbolNode *symbol_node = list.first; symbol_node != 0; symbol_node = symbol_node->next) {\n    // store symbol in current scope\n    CV_Scope *scope = cv_scope_list_push(arena, stack->list);\n    scope->symbol = symbol_node->data;\n    \n    // does this symbol define a new scope?\n    if (cv_is_scope_symbol(symbol_node->data.kind)) {\n      CV_ScopeFrame *frame = push_array(scratch.arena, CV_ScopeFrame, 1);\n      frame->list = push_array(arena, CV_ScopeList, 1);\n      SLLStackPush(stack, frame);\n    }\n    // does this symbol end current scope?\n    else if (cv_is_end_symbol(symbol_node->data.kind)) {\n      CV_ScopeFrame *prev_stack_frame = stack->next;\n      if (prev_stack_frame) {\n        // set children in parent scope\n        CV_Scope *parent_scope = prev_stack_frame->list->last;\n        parent_scope->children = stack->list;\n      }\n      \n      // pop frame\n      SLLStackPop(stack);\n    }\n  }\n  \n  scratch_end(scratch);\n  return root;\n}\n\ninternal U64\ncv_patch_symbol_tree_offsets(CV_SymbolList list, U64 base_offset, U64 align)\n{\n  Temp scratch = scratch_begin(0, 0);\n\n  struct Stack {\n    struct Stack *next;\n    CV_Symbol    *symbol;\n    U64           offset;\n  };\n  struct Stack *stack     = 0;\n  struct Stack *free_list = 0;\n\n  U64 cursor = base_offset;\n\n  for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) {\n    CV_Symbol symbol = symbol_n->data;\n    if (cv_is_scope_symbol(symbol.kind)) {\n      // NOTE: We don't patch 'next' offset in PROC symbols because\n      // it's not used by visual studio and MSVC leaves the offsets\n      // zeroed. LLD is on the same page.\n      Assert(symbol.data.size >= sizeof(U32)*2);\n\n      // patch symbol parent\n      if (stack) {\n        U32 *parent_off_ptr = (U32 *)symbol.data.str;\n        *parent_off_ptr = stack->offset;\n      }\n\n      // reuse/alloc frame\n      struct Stack *frame;\n      if (free_list) {\n        frame = free_list;\n        SLLStackPop(free_list);\n      } else {\n        frame = push_array_no_zero(scratch.arena, struct Stack, 1);\n      }\n\n      // push frame to the stack\n      frame->symbol = &symbol_n->data;\n      frame->offset = cursor;\n      SLLStackPush(stack, frame);\n    } else if (cv_is_end_symbol(symbol.kind)) {\n      // patch symbol end\n      U32 *end_off_ptr = (U32 *)stack->symbol->data.str + /* skip parent off */ 1;\n      *end_off_ptr = cursor;\n\n      // recycle frame\n      struct Stack *free_frame = stack;\n      SLLStackPop(stack);\n      SLLStackPush(free_list, free_frame);\n    }\n\n    // advance cursor\n    cursor += cv_compute_symbol_record_size(&symbol, align);\n  }\n\n  scratch_end(scratch);\n  U64 serial_size = cursor - base_offset;\n  return serial_size;\n}\n\n// $$FileChksms\n\ninternal void\ncv_parse_checksum_data(Arena *arena, CV_ChecksumList *list, String8 checksum_data)\n{\n  for (U64 cursor = 0, cursor_opl = checksum_data.size; cursor < cursor_opl; ) {\n    U64 expected_cursor_after_checksum = cursor + sizeof(CV_C13Checksum);\n    if (expected_cursor_after_checksum > cursor_opl) {\n      break;\n    }\n    CV_C13Checksum *header = (CV_C13Checksum *)str8_deserial_get_raw_ptr(checksum_data, cursor, sizeof(CV_C13Checksum));\n    cursor += sizeof(CV_C13Checksum);\n    \n    U64 expected_cursor_after_value = cursor + header->len;\n    if (expected_cursor_after_value > cursor_opl) {\n      break;\n    }\n    String8 value = str8(0,0);\n    cursor += str8_deserial_read_block(checksum_data, cursor, header->len, &value);\n    cursor = AlignPow2(cursor, 4);\n    \n    CV_ChecksumNode *node = push_array(arena, CV_ChecksumNode, 1);\n    node->next = 0;\n    \n    CV_Checksum *data = &node->data;\n    data->header = header;\n    data->value = value;\n    \n    SLLQueuePush(list->first, list->last, node);\n    list->count += 1;\n  }\n}\n\ninternal CV_ChecksumList\ncv_c13_parse_checksum_data_list(Arena *arena, String8List checksum_data_list)\n{\n  CV_ChecksumList result = {0};\n  for (String8Node *node = checksum_data_list.first; node != 0; node = node->next) {\n    cv_parse_checksum_data(arena, &result, node->string);\n  }\n  return result;\n}\n\ninternal void\ncv_c13_patch_string_offsets_in_checksum_list(CV_ChecksumList checksum_list, String8 string_data, U64 string_data_base_offset, CV_StringHashTable string_ht)\n{\n  for (CV_ChecksumNode *node = checksum_list.first; node != 0; node = node->next) {\n    CV_Checksum     *checksum = &node->data;\n    CV_C13Checksum  *header   = checksum->header;\n    String8          name     = str8_cstring_capped(string_data.str + header->name_off, string_data.str + string_data.size);\n    CV_StringBucket *bucket   = cv_string_hash_table_lookup(string_ht, name);\n\n    U64 name_off64 = string_data_base_offset + bucket->u.offset;\n    header->name_off = safe_cast_u32(name_off64);\n  }\n}\n\ninternal String8List\ncv_c13_collect_source_file_names(Arena *arena, CV_ChecksumList checksum_list, String8 string_data)\n{\n  String8List source_file_name_list = {0};\n  for (CV_ChecksumNode *node = checksum_list.first; node != 0; node = node->next) {\n    CV_Checksum *checksum = &node->data;\n    CV_C13Checksum *header = checksum->header;\n    Assert(header->name_off < string_data.size);\n    String8 name = str8_cstring_capped(string_data.str + header->name_off, string_data.str + string_data.size);\n    str8_list_push(arena, &source_file_name_list, name);\n  }\n  return source_file_name_list;\n}\n\n// $$Lines\n\ninternal void\ncv_c13_lines_header_list_concat_in_place(CV_C13LinesHeaderList *list, CV_C13LinesHeaderList *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal CV_C13LinesHeaderList\ncv_c13_lines_from_sub_sections(Arena *arena, String8 c13_data, Rng1U64 ss_range)\n{\n  ProfBeginFunction();\n\n  CV_C13LinesHeaderList parsed_line_list = {0};\n\n  String8 sub_sect_data  = str8_substr(c13_data, ss_range);\n\n  for (U64 cursor = 0; cursor + sizeof(CV_C13SubSecLinesHeader) <= sub_sect_data.size; ) {\n    CV_C13SubSecLinesHeader *hdr = (CV_C13SubSecLinesHeader *)(sub_sect_data.str + cursor);\n    cursor += sizeof(*hdr);\n\n    // read files\n    for (; cursor + sizeof(CV_C13File) <= sub_sect_data.size; ) {\n      // grab next file header\n      CV_C13File *file = (CV_C13File *)(sub_sect_data.str + cursor);\n      cursor += sizeof(CV_C13File);\n\n      // parse lines and columns\n      //\n      // TODO: export columns\n      U64  max_line_count = (sub_sect_data.size - cursor) / sizeof(CV_C13Line);\n      U32  line_count     = Min(file->num_lines, max_line_count);\n\n      // TODO(allen): check order correctness here\n\n      U64 line_array_off = cursor;\n      //U64 col_array_off  = line_array_off + line_count * sizeof(CV_C13Line);\n\n      // compute line entry size\n      U64 line_entry_size = sizeof(CV_C13Line);\n      if (hdr->flags & CV_C13SubSecLinesFlag_HasColumns) {\n        line_entry_size += sizeof(CV_C13Column);\n      }\n\n      // advance past line and column entries\n      cursor += line_count * line_entry_size;\n\n      // emit parsed lines\n      CV_C13LinesHeaderNode *lines_parsed_node = push_array_no_zero(arena, CV_C13LinesHeaderNode, 1);\n      lines_parsed_node->next = 0;\n\n      CV_C13LinesHeader *lines_parsed = &lines_parsed_node->v;\n      lines_parsed->sec_idx        = hdr->sec;\n      lines_parsed->sec_off_lo     = hdr->sec_off;\n      lines_parsed->sec_off_hi     = hdr->sec_off + hdr->len;\n      lines_parsed->file_off       = file->file_off;\n      lines_parsed->line_count     = line_count;\n      lines_parsed->col_count      = 0; // TODO: columns\n      lines_parsed->line_array_off = ss_range.min + line_array_off;\n      lines_parsed->col_array_off  = 0; // TODO: columns\n\n      SLLQueuePush(parsed_line_list.first, parsed_line_list.last, lines_parsed_node);\n      parsed_line_list.count += 1;\n    }\n  }\n\n  ProfEnd();\n  return parsed_line_list;\n}\n\ninternal CV_LineArray\ncv_c13_line_array_from_data(Arena *arena, String8 c13_data, U64 sec_base, CV_C13LinesHeader parsed_lines)\n{\n  CV_LineArray result;\n  result.file_off   = parsed_lines.file_off;\n  result.line_count = parsed_lines.line_count;\n  result.col_count  = parsed_lines.col_count;\n  result.voffs      = push_array_no_zero(arena, U64, parsed_lines.line_count + 1);\n  result.line_nums  = push_array_no_zero(arena, U32, parsed_lines.line_count);\n  result.col_nums   = 0;\n\n  CV_C13Line *raw_lines = (CV_C13Line *)str8_deserial_get_raw_ptr(c13_data, parsed_lines.line_array_off, parsed_lines.line_count * sizeof(raw_lines[0]));\n\n  for(U64 line_idx = 0; line_idx < parsed_lines.line_count; line_idx += 1)\n  {\n    CV_C13Line line = raw_lines[line_idx];\n    result.voffs[line_idx]     = sec_base + parsed_lines.sec_off_lo + line.off;\n    result.line_nums[line_idx] = CV_C13LineFlags_Extract_LineNumber(line.flags);\n  }\n\n  // emit voff ender\n  result.voffs[result.line_count] = sec_base + parsed_lines.sec_off_hi;\n\n  return result;\n}\n\ninternal void\ncv_c13_patch_checksum_offsets_in_line_data_list(String8List line_data, U64 checksum_rebase)\n{\n  for(String8Node *node = line_data.first; node != 0; node = node->next)\n  {\n    String8 raw_data = node->string;\n    if(raw_data.size < sizeof(CV_C13SubSecLinesHeader))\n    {\n      Assert(!\"unable to patch checksum in line sub seciton header\");\n      continue;\n    }\n    CV_C13File *file_header = (CV_C13File *)(raw_data.str + sizeof(CV_C13SubSecLinesHeader));\n    U64 rebased_file_off = file_header->file_off + checksum_rebase;\n    file_header->file_off = safe_cast_u32(rebased_file_off);\n  }\n}\n\n// $$InlineeLines\n\ninternal CV_C13InlineeLinesParsedList\ncv_c13_inlinee_lines_from_sub_sections(Arena *arena, String8List raw_inlinee_lines)\n{\n  ProfBeginFunction();\n\n  CV_C13InlineeLinesParsedList inlinee_lines_list = {0};\n\n  for (String8Node *raw_data_node = raw_inlinee_lines.first; raw_data_node != 0; raw_data_node = raw_data_node->next) {\n    U64 cursor = 0;\n\n    CV_C13InlineeLinesSig sig = 0;\n    cursor += str8_deserial_read_struct(raw_data_node->string, cursor, &sig);\n\n    for (; cursor + sizeof(CV_C13InlineeSourceLineHeader) <= raw_data_node->string.size; ) {\n      CV_C13InlineeSourceLineHeader *hdr = (CV_C13InlineeSourceLineHeader *)(raw_data_node->string.str + cursor);\n      cursor += sizeof(*hdr);\n\n      CV_C13InlineeLinesParsedNode *inlinee_parsed_node = push_array_no_zero(arena, CV_C13InlineeLinesParsedNode, 1);\n      inlinee_parsed_node->next = 0;\n      SLLQueuePush(inlinee_lines_list.first, inlinee_lines_list.last, inlinee_parsed_node);\n      inlinee_lines_list.count += 1;\n\n      CV_C13InlineeLinesParsed *inlinee_parsed = &inlinee_parsed_node->v;\n      inlinee_parsed->inlinee          = hdr->inlinee;\n      inlinee_parsed->file_off         = hdr->file_off;\n      inlinee_parsed->first_source_ln  = hdr->first_source_ln;\n      inlinee_parsed->extra_file_count = 0;\n      inlinee_parsed->extra_files      = 0;\n\n      if (sig == CV_C13InlineeLinesSig_EXTRA_FILES) {\n        if (cursor + sizeof(U32) <= raw_data_node->string.size) {\n          U32 *extra_file_count_ptr = (U32 *)(raw_data_node->string.str + cursor);\n          cursor += sizeof(*extra_file_count_ptr);\n\n          U32 max_extra_file_count = (raw_data_node->string.size - cursor) / sizeof(U32);\n          U32 extra_file_count     = Min(*extra_file_count_ptr, max_extra_file_count);\n          U32 *extra_files         = (U32 *)(raw_data_node->string.str + cursor);\n          cursor += sizeof(*extra_files) * extra_file_count;\n\n          inlinee_parsed->extra_file_count = extra_file_count;\n          inlinee_parsed->extra_files      = extra_files;\n        }\n      }\n    }\n  }\n\n  ProfEnd();\n  return inlinee_lines_list;\n}\n\n// $$FrameData\n\ninternal void\ncv_c13_patch_checksum_offsets_in_frame_data_list(String8List frame_data, U32 checksum_rebase)\n{\n  for(String8Node *node = frame_data.first; node != 0; node = node->next)\n  {\n    String8 raw_data = node->string;\n    U64 count = raw_data.size / sizeof(CV_C13FrameData);\n    CV_C13FrameData *arr = (CV_C13FrameData *)raw_data.str;\n    CV_C13FrameData *ptr = arr;\n    CV_C13FrameData *opl = arr + count;\n    for(; ptr < opl; ptr += 1)\n    {\n      U64 rebased_frame_func = ptr->frame_func + checksum_rebase;\n      ptr->frame_func = safe_cast_u32(rebased_frame_func);\n    }\n  }\n}\n\n////////////////////////////////\n// $$Lines Accel\n\ninternal int\ncv_c13_voff_map_compar(const void *raw_a, const void *raw_b)\n{\n  CV_Line *a = (CV_Line*)raw_a;\n  CV_Line *b = (CV_Line*)raw_b;\n  int cmp = a->voff < b->voff ? -1 :\n            a->voff > b->voff ? +1 :\n            0;\n  return cmp;\n}\n\ninternal CV_LinesAccel *\ncv_c13_make_lines_accel(Arena *arena, U64 lines_count, CV_LineArray *lines)\n{\n  ProfBeginFunction();\n\n  U64 total_voff_count = 0;\n  for(U64 arr_idx = 0; arr_idx < lines_count; arr_idx += 1) {\n    total_voff_count += lines[arr_idx].line_count + 1;\n  }\n\n  CV_Line *map      = push_array_no_zero(arena, CV_Line, total_voff_count);\n  U64      map_idx  = 0;\n\n  for(U64 line_idx = 0; line_idx < lines_count; line_idx += 1) {\n    CV_LineArray *l = lines + line_idx;\n    if (l->line_count > 0) {\n      for(U64 voff_idx = 0; voff_idx < l->line_count; voff_idx += 1) {\n        map[map_idx].voff     = l->voffs[voff_idx];\n        map[map_idx].file_off = l->file_off;\n        map[map_idx].line_num = l->line_nums[voff_idx];\n        map[map_idx].col_num  = 0; // TODO: columns\n        map_idx += 1;\n      }\n\n      map[map_idx].voff     = l->voffs[l->line_count];\n      map[map_idx].file_off = l->file_off;\n      map[map_idx].line_num = 0;\n      map[map_idx].col_num  = 0;\n      map_idx += 1;\n    }\n  }\n  Assert(map_idx == total_voff_count);\n\n  qsort(map, total_voff_count, sizeof(map[0]), cv_c13_voff_map_compar);\n\n  CV_LinesAccel *accel = push_array(arena, CV_LinesAccel, 1);\n  accel->map_count = total_voff_count;\n  accel->map       = map;\n\n  ProfEnd();\n  return accel;\n}\n\ninternal CV_LinesAccel *\ncv_lines_accel_from_debug_s(Arena *arena, CV_DebugS debug_s)\n{\n  // parse $$LINES\n  U64           c13_lines_count = 0;\n  CV_LineArray *c13_lines       = 0;\n  {\n    String8List raw_lines_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines);\n\n    for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) {\n      Temp temp = temp_begin(arena);\n      CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(temp.arena, raw_lines_node->string, rng_1u64(0, raw_lines_node->string.size));\n      c13_lines_count += parsed_list.count;\n      temp_end(temp);\n    }\n\n    c13_lines = push_array_no_zero(arena, CV_LineArray, c13_lines_count);\n\n    U64 c13_lines_idx = 0;\n    for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) {\n      String8               raw_lines   = raw_lines_node->string;\n      CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(arena, raw_lines, rng_1u64(0, raw_lines.size));\n\n      for(CV_C13LinesHeaderNode *header_node = parsed_list.first; header_node != 0; header_node = header_node->next) {\n        c13_lines[c13_lines_idx++] = cv_c13_line_array_from_data(arena, raw_lines, 0, header_node->v);\n      }\n    }\n  }\n\n  return cv_c13_make_lines_accel(arena, c13_lines_count, c13_lines);\n}\n\ninternal U64\ncv_nearest_line(CV_Line *arr, U64 count, U64 value)\n{\n  if(count > 1 && arr[0].voff <= value && value < arr[count-1].voff)\n  {\n    U64 l = 0;\n    U64 r = count - 1;\n    for (; l <= r; ) {\n      U64 m = l + (r - l) / 2;\n      if (arr[m].voff == value) {\n        return m;\n      } else if (arr[m].voff < value) {\n        l = m + 1;\n      } else {\n        r = m - 1;\n      }\n    }\n    return l;\n  }\n  else if (count == 1 && arr[0].voff == value)\n  {\n    return 0;\n  }\n  return max_U64;\n}\n\ninternal CV_Line *\ncv_line_from_voff(CV_LinesAccel *accel, U64 voff, U64 *out_line_count)\n{\n  ProfBeginFunction();\n\n  U64      voff_line_count = 0;\n  CV_Line *lines           = 0;\n\n  U64 map_idx = cv_nearest_line(accel->map, accel->map_count, voff);\n  if(map_idx < accel->map_count) {\n    U64 near_voff = accel->map[map_idx].voff;\n\n    for (; map_idx > 0; map_idx -= 1) {\n      if(accel->map[map_idx - 1].voff != near_voff) {\n        break;\n      }\n    }\n\n    lines = accel->map + map_idx;\n\n    for(; map_idx < (accel->map_count-1); map_idx += 1) {\n      if(accel->map[map_idx].voff != near_voff) {\n        break;\n      }\n      voff_line_count += 1;\n    }\n  }\n\n  *out_line_count = voff_line_count;\n\n  ProfEnd();\n  return lines;\n}\n\n////////////////////////////////\n// $$InlineeLines Accel\n\ninternal U64\ncv_c13_inlinee_lines_accel_hash(void *buffer, U64 size)\n{\n  XXH64_hash_t hash64 = XXH3_64bits(buffer, size);\n  return hash64;\n}\n\ninternal B32\ncv_c13_inlinee_lines_accel_push(CV_InlineeLinesAccel *accel, CV_C13InlineeLinesParsed *parsed)\n{\n  U64 load_factor = accel->bucket_max * 2/3 + 1;  \n  if(accel->bucket_count > load_factor) {\n    Assert(\"TODO: increase max count and rehash buckets\");\n  }\n\n  B32 is_pushed = 0;\n\n  U64 hash     = cv_c13_inlinee_lines_accel_hash(&parsed->inlinee, sizeof(parsed->inlinee));\n  U64 best_idx = hash % accel->bucket_max;\n  U64 idx      = best_idx;\n\n  do {\n    if(accel->buckets[idx] == 0) {\n      accel->buckets[idx] = parsed;\n      accel->bucket_count += 1;\n      is_pushed = 1;\n      break;\n    }\n\n    idx = (idx + 1) % accel->bucket_max;\n  } while(idx != best_idx);\n\n  return is_pushed;\n}\n\ninternal CV_C13InlineeLinesParsed *\ncv_c13_inlinee_lines_accel_find(CV_InlineeLinesAccel *accel, CV_ItemId inlinee)\n{\n  CV_C13InlineeLinesParsed *match = 0;\n\n  U64 hash     = cv_c13_inlinee_lines_accel_hash(&inlinee, sizeof(inlinee));\n  U64 best_idx = hash % accel->bucket_max;\n  U64 idx      = best_idx;\n\n  do {\n    if(accel->buckets[idx] != 0) {\n      if(accel->buckets[idx]->inlinee == inlinee) {\n        match = accel->buckets[idx]; \n        break;\n      }\n    }\n\n    idx = (idx + 1) % accel->bucket_max;\n  } while(idx != best_idx);\n\n  return match;\n}\n\ninternal CV_InlineeLinesAccel *\ncv_c13_make_inlinee_lines_accel(Arena *arena, CV_C13InlineeLinesParsedList inlinee_lines)\n{\n  ProfBeginFunction();\n\n  // alloc hash table\n  CV_InlineeLinesAccel *accel = push_array(arena, CV_InlineeLinesAccel, 1);\n  accel->bucket_count = 0;\n  accel->bucket_max   = (U64)((F64)inlinee_lines.count * 2.5);\n  accel->buckets      = push_array(arena, CV_C13InlineeLinesParsed *, accel->bucket_max);\n\n  // push parsed inlinees\n  for(CV_C13InlineeLinesParsedNode *inlinee = inlinee_lines.first; inlinee != 0; inlinee = inlinee->next) {\n    cv_c13_inlinee_lines_accel_push(accel, &inlinee->v);\n  }\n\n  ProfEnd();\n  return accel;\n}\n\n////////////////////////////////\n\ninternal CV_InlineBinaryAnnotsParsed\ncv_c13_parse_inline_binary_annots(Arena                    *arena,\n                                  U64                       parent_voff,\n                                  CV_C13InlineeLinesParsed *inlinee_parsed,\n                                  String8                   binary_annots)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  struct CodeRange {\n    struct CodeRange *next;\n    Rng1U64 range;\n  };\n  struct SourceLine {\n    struct SourceLine *next;\n    U64                voff;\n    U64                length;\n    U64                ln;\n    U64                cn;\n    CV_InlineRangeKind kind;\n  };\n  struct SourceFile {\n    struct SourceFile *next;\n    struct SourceLine *line_first;\n    struct SourceLine *line_last;\n    U64                line_count;\n    U64                checksum_off;\n    Rng1U64            last_code_range;\n  };\n\n  Rng1U64List        code_ranges = {0};\n  struct SourceFile *file_first  = 0;\n  struct SourceFile *file_last   = 0;\n  U64                file_count  = 0;\n\n  CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_parsed->file_off, inlinee_parsed->first_source_ln, parent_voff);\n  for (;;) {\n    CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots);\n    if (step.flags == 0) {\n      break;\n    }\n    if (step.flags & CV_C13InlineSiteDecoderStepFlag_EmitRange) {\n      rng1u64_list_push(arena, &code_ranges, step.range);\n    }\n    if (step.flags & CV_C13InlineSiteDecoderStepFlag_ExtendLastRange) {\n      if (code_ranges.last) {\n        code_ranges.last->v = step.range;\n      }\n    }\n    if (step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile) {\n      struct SourceFile *file = push_array(scratch.arena, struct SourceFile, 1);\n      file->checksum_off      = step.file_off;\n      SLLQueuePush(file_first, file_last, file);\n      ++file_count;\n    }\n    if (step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine) {\n      struct SourceLine *line = push_array(scratch.arena, struct SourceLine, 1);\n      line->voff              = step.line_voff;\n      line->ln                = step.ln;\n      line->cn                = step.cn;\n      SLLQueuePush(file_last->line_first, file_last->line_last, line);\n      ++file_last->line_count;\n    }\n  }\n\n  CV_LineArray *lines = push_array(arena, CV_LineArray, file_count);\n  {\n    U64 lines_idx = 0;\n    for (struct SourceFile *file = file_first; file != 0; file = file->next, lines_idx += 1) {\n      CV_LineArray *l = lines + lines_idx;\n\n      l->file_off   = file->checksum_off;\n      l->line_count = file->line_count;\n      l->col_count  = 0;\n\n      if (file->line_count > 0) {\n        l->voffs     = push_array_no_zero(arena, U64, file->line_count + 1);\n        l->line_nums = push_array_no_zero(arena, U32, file->line_count);\n        l->col_nums  = 0; // TODO: column info \n\n        U64 line_idx = 0;\n        for (struct SourceLine *line = file->line_first; line != NULL; line = line->next, ++line_idx) {\n          // emit line voff and line number\n          l->voffs[line_idx]     = line->voff;\n          l->line_nums[line_idx] = (U32)line->ln;\n        }\n        Assert(line_idx == file->line_count);\n        l->voffs[line_idx] = file->last_code_range.max;\n      }\n    }\n  }\n\n  // fill out result\n  CV_InlineBinaryAnnotsParsed result = {0};\n  result.lines_count                 = file_count;\n  result.lines                       = lines;\n  result.code_ranges                 = code_ranges;\n\n  scratch_end(scratch);\n  return result;\n}\n\n////////////////////////////////\n\ninternal Rng1U64List\ncv_make_defined_range_list_from_gaps(Arena *arena, Rng1U64 defrange, CV_LvarAddrGap *gaps, U64 gap_count)\n{\n  Rng1U64List result = {0};\n\n  if (gap_count == 0) {\n    // no gaps, push whole range\n    rng1u64_list_push(arena, &result, defrange);\n  } else {\n    U64 cursor = defrange.min;\n    for (U64 gap_idx = 0; gap_idx < gap_count; ++gap_idx) {\n      // make range\n      Rng1U64 range = rng_1u64(cursor, cursor + gaps[gap_idx].off);\n      rng1u64_list_push(arena, &result, range);\n\n      // advance\n      cursor = defrange.min + gaps[gap_idx].off + gaps[gap_idx].len;\n    }\n\n\n    // emit range past last gap\n    if (gap_count > 0) {\n      CV_LvarAddrGap  last_gap             = gaps[gap_count - 1];\n      U64             last_range_byte_size = dim_1u64(defrange) - (last_gap.off + last_gap.len);\n      if (last_range_byte_size) {\n        Rng1U64 last_range = rng_1u64(defrange.min + last_gap.off + last_gap.len, defrange.max);\n        rng1u64_list_push(arena, &result, last_range);\n      }\n    }\n  }\n\n  return result;\n}\n\n"
  },
  {
    "path": "src/linker/codeview_ext/codeview.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n//- Symbol and Leaf Headers\n\ntypedef struct CV_LeafHeader\n{\n  CV_LeafSize size;\n  CV_LeafKind kind;\n} CV_LeafHeader;\n\ntypedef struct CV_SymbolHeader\n{\n  CV_SymSize size;\n  CV_SymKind kind;\n} CV_SymbolHeader;\n\n////////////////////////////////\n// Type Index Helpers\n\n//- $$Symbols\n\ntypedef struct CV_Symbol\n{\n  CV_SymKind kind;\n  U64        offset;\n  String8    data;\n} CV_Symbol;\n\ntypedef struct CV_SymbolNode\n{\n  struct CV_SymbolNode *next;\n  struct CV_SymbolNode *prev;\n  CV_Symbol             data;\n} CV_SymbolNode;\n\ntypedef struct CV_SymbolPtrNode\n{\n  struct CV_SymbolPtrNode *next;\n  CV_Symbol               *data;\n} CV_SymbolPtrNode;\n\ntypedef struct CV_SymbolList\n{\n  U64            count;\n  CV_Signature   signature;\n  CV_SymbolNode *first;\n  CV_SymbolNode *last;\n} CV_SymbolList;\n\ntypedef struct CV_SymbolListArray\n{\n  U64            count;\n  CV_SymbolList *v;\n} CV_SymbolListArray;\n\ntypedef struct CV_SymbolPtrArray\n{\n  U64             count;\n  CV_SymbolNode **v;\n} CV_SymbolPtrArray;\n\ntypedef struct CV_Scope\n{\n  struct CV_ScopeList *children;\n  struct CV_Scope     *next;\n  struct CV_Scope     *prev;\n  CV_Symbol            symbol;\n} CV_Scope;\n\ntypedef struct CV_ScopeList\n{\n  CV_Scope *first;\n  CV_Scope *last;\n} CV_ScopeList;\n\ntypedef struct CV_ScopeFrame\n{\n  struct        CV_ScopeFrame *next;\n  CV_ScopeList *list;\n  CV_Scope     *curr;\n  U64           symbol_off;\n  U32          *parent_off_ptr;\n  U32          *end_off_ptr;\n} CV_ScopeFrame;\n\n//- $$FileChksms\n\ntypedef struct CV_Checksum\n{\n  CV_C13Checksum *header;\n  String8 value;\n} CV_Checksum;\n\ntypedef struct CV_ChecksumNode\n{\n  struct CV_ChecksumNode *next;\n  CV_Checksum data;\n} CV_ChecksumNode;\n\ntypedef struct CV_ChecksumList\n{\n  U64 count;\n  CV_ChecksumNode *first;\n  CV_ChecksumNode *last;\n} CV_ChecksumList;\n\n//- $$Lines\n\ntypedef struct CV_LineArray\n{\n  U32  file_off;\n  U64  line_count;\n  U64  col_count;\n  U64 *voffs;     // [line_count + 1]\n  U32 *line_nums; // [line_count]\n  U16 *col_nums;  // [line_count * 2]\n} CV_LineArray;\n\ntypedef struct CV_File\n{\n  U32          file_off;\n  CV_LineArray lines;\n} CV_File;\n\ntypedef struct CV_C13LinesHeader\n{\n  U64 sec_idx;\n  U64 sec_off_lo;\n  U64 sec_off_hi;\n  U64 file_off;\n  U64 line_count;\n  U64 col_count;\n  U64 line_array_off;\n  U64 col_array_off;\n} CV_C13LinesHeader;\n\ntypedef struct CV_C13LinesHeaderNode\n{\n  struct CV_C13LinesHeaderNode *next;\n  CV_C13LinesHeader             v;\n} CV_C13LinesHeaderNode;\n\ntypedef struct CV_C13LinesHeaderList\n{\n  CV_C13LinesHeaderNode *first;\n  CV_C13LinesHeaderNode *last;\n  U64                    count;\n} CV_C13LinesHeaderList;\n\n////////////////////////////////\n\ntypedef struct CV_TypeServerInfo\n{\n  String8 name;\n  Guid    sig;\n  U32     age;\n} CV_TypeServerInfo;\n\ntypedef struct CV_TypeServerInfoNode\n{\n  struct CV_TypeServerInfoNode *next;\n  CV_TypeServerInfo             data;\n} CV_TypeServerInfoNode;\n\ntypedef struct CV_TypeServerInfoList\n{\n  CV_TypeServerInfoNode *first;\n  CV_TypeServerInfoNode *last;\n  U64                    count;\n} CV_TypeServerInfoList;\n\ntypedef struct CV_PrecompInfo\n{\n  CV_TypeIndex start_index;\n  U32          sig;\n  U32          leaf_count;\n  String8      obj_name;\n} CV_PrecompInfo;\n\ntypedef struct CV_ObjInfo\n{\n  U32     sig;\n  String8 name;\n} CV_ObjInfo;\n\n////////////////////////////////\n// Accels\n\ntypedef struct CV_Line\n{\n  U64 voff;\n  U32 file_off;\n  U32 line_num;\n  U16 col_num;\n} CV_Line;\n\ntypedef struct CV_LinesAccel\n{\n  U64      map_count;\n  CV_Line *map;\n} CV_LinesAccel;\n\ntypedef struct CV_InlineeLinesAccel\n{\n  U64                        bucket_count;\n  U64                        bucket_max;\n  CV_C13InlineeLinesParsed **buckets;\n} CV_InlineeLinesAccel;\n\ntypedef struct CV_InlineBinaryAnnotsParsed\n{\n  U64           lines_count;\n  CV_LineArray *lines;\n  Rng1U64List   code_ranges;\n} CV_InlineBinaryAnnotsParsed;\n\ntypedef struct CV_C13InlineeLinesParsedList\n{\n  CV_C13InlineeLinesParsedNode *first;\n  CV_C13InlineeLinesParsedNode *last;\n  U64                           count;\n} CV_C13InlineeLinesParsedList;\n\n////////////////////////////////\n\ntypedef U32 CV_C13SubSectionIdxKind;\nenum\n{\n  CV_C13SubSectionIdxKind_NULL,\n#define X(N,c) CV_C13SubSectionIdxKind_##N,\n  CV_C13SubSectionKindXList(X)\n#undef X\n  CV_C13SubSectionIdxKind_COUNT\n};\n\ntypedef struct CV_C13SubSectionList\n{\n  CV_C13SubSectionNode *first;\n  CV_C13SubSectionNode *last;\n  U64                   count;\n} CV_C13SubSectionList;\n\n////////////////////////////////\n\ntypedef struct CV_DebugS\n{\n  String8List data_list[CV_C13SubSectionIdxKind_COUNT];\n} CV_DebugS;\n\ntypedef struct CV_DebugT\n{\n  U64  size;\n  U64  count;\n  U8 **v;\n} CV_DebugT;\n\n////////////////////////////////\n//~ Leaf Helpers\n\ntypedef struct CV_Leaf\n{\n  CV_LeafKind kind;\n  String8     data;\n} CV_Leaf;\n\ntypedef struct CV_LeafNode\n{\n  struct CV_LeafNode *next;\n  CV_Leaf             data;\n} CV_LeafNode;\n\ntypedef struct CV_LeafList\n{\n  U64          count;\n  CV_LeafNode *first;\n  CV_LeafNode *last;\n} CV_LeafList;\n\n////////////////////////////////\n//~ String Hash Table\n\ntypedef struct CV_StringTableRange\n{\n  struct CV_StringTableRange *next;\n  Rng1U64                     range;\n  U64                         debug_s_idx;\n} CV_StringTableRange;\n\ntypedef struct CV_StringBucket\n{\n  String8 string;\n  union {\n    struct {\n      U32 idx0;\n      U32 idx1;\n    };\n    U64 offset;\n  } u;\n} CV_StringBucket;\n\ntypedef struct CV_StringHashTable\n{\n  U64               total_string_size;\n  U64               total_insert_count;\n  U64               bucket_cap;\n  CV_StringBucket **buckets;\n} CV_StringHashTable;\n\ntypedef struct CV_StringHashTableResult\n{\n  U64               string_count;\n  CV_StringBucket **buckets;\n} CV_StringHashTableResult;\n\n////////////////////////////////\n//~ Task Contexts\n\ntypedef struct\n{\n  U64              cap;\n  union {\n    CV_SymbolNode ***buckets;\n    CV_SymbolNode  **deref_buckets;\n  } u;\n  Rng1U64         *ranges;\n  CV_SymbolNode  **symbols;\n} CV_SymbolDeduperTask;\n\ntypedef struct\n{\n  CV_SymbolList  *list_arr;\n  Rng1U64        *list_range_arr;\n  U64            *symbol_base_arr;\n  CV_SymbolNode **symbol_arr;\n} CV_SymbolListSyncer;\n\ntypedef struct\n{\n  CV_DebugS            *arr;\n  CV_StringTableRange **range_lists;\n  U64                  *string_counts;\n  U64                   bucket_cap;\n  CV_StringBucket     **buckets;\n  U64                   total_string_size;\n  U64                   total_insert_count;\n} CV_DedupStringTablesTask;\n\ntypedef struct\n{\n  U8               *buffer;\n  Rng1U64          *ranges;\n  CV_StringBucket **buckets;\n} CV_PackStringHashTableTask;\n\ntypedef struct\n{\n  CV_DebugT    debug_t;\n  Rng1U64     *ranges;\n  String8List *lists;\n  String8Node *nodes;\n} CV_Str8ListFromDebugT;\n\n////////////////////////////////\n\ninternal CV_ObjInfo        cv_obj_info_from_symbol(CV_Symbol symbol);\ninternal CV_TypeServerInfo cv_type_server_info_from_leaf(CV_Leaf leaf);\ninternal CV_PrecompInfo    cv_precomp_info_from_leaf(CV_Leaf leaf);\n\n////////////////////////////////\n//~ Leaf Helpers\n\ninternal U64     cv_compute_leaf_record_size(String8 data, U64 align);\ninternal U64     cv_serialize_leaf_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_LeafKind kind, String8 data, U64 align);\ninternal String8 cv_serialize_raw_leaf(Arena *arena, CV_LeafKind kind, String8 data, U64 align);\ninternal String8 cv_serialize_leaf(Arena *arena, CV_Leaf *leaf, U64 align);\ninternal CV_Leaf cv_make_leaf(Arena *arena, CV_LeafKind kind, String8 data);\ninternal U64     cv_deserial_leaf(String8 raw_data, U64 off, U64 align, CV_Leaf *leaf_out);\ninternal CV_Leaf cv_leaf_from_string(String8 raw_data);\n\n////////////////////////////////\n//~ Symbol Helpers\n\ninternal U64     cv_compute_symbol_record_size(CV_Symbol *symbol, U64 align);\ninternal U64     cv_serialize_symbol_to_buffer(U8 *buffer, U64 buffer_cursor, U64 buffer_size, CV_Symbol *symbol, U64 align);\ninternal String8 cv_serialize_symbol(Arena *arena, CV_Symbol *symbol, U64 align);\n\ninternal String8       cv_make_symbol(Arena *arena, CV_SymKind kind, String8 data);\ninternal String8       cv_make_obj_name(Arena *arena, String8 obj_path, U32 sig);\ninternal String8       cv_make_comp3(Arena *arena,\n                                     CV_Compile3Flags flags, CV_Language lang, CV_Arch arch, \n                                     U16 ver_fe_major, U16 ver_fe_minor, U16 ver_fe_build, U16 ver_feqfe,\n                                     U16 ver_major, U16 ver_minor, U16 ver_build, U16 ver_qfe,\n                                     String8 version_string);\ninternal String8       cv_make_envblock(Arena *arena, String8List string_list);\ninternal CV_Symbol     cv_make_proc_ref(Arena *arena, CV_ModIndex imod, U32 stream_offset, String8 name, B32 is_local);\ninternal CV_Symbol     cv_make_pub32(Arena *arena, CV_Pub32Flags flags, U32 off, U16 isect, String8 name);\ninternal CV_SymbolList cv_make_proc_refs(Arena *arena, CV_ModIndex imod, CV_SymbolList symbol_list);\n\n////////////////////////////////\n// .debug$S Helpers\n\ninternal CV_DebugS    cv_parse_debug_s_c13(Arena *arena, String8 raw_debug_s);\ninternal CV_DebugS    cv_parse_debug_s_c13_list(Arena *arena, String8List raw_debug_s);\ninternal CV_DebugS    cv_parse_debug_s(Arena *arena, String8 raw_debug_s);\ninternal void         cv_debug_s_concat_in_place(CV_DebugS *dst, CV_DebugS *src);\ninternal String8List  cv_data_c13_from_debug_s(Arena *arena, CV_DebugS *debug_s, B32 write_sig);\n\ninternal CV_C13SubSectionIdxKind cv_c13_sub_section_idx_from_kind(CV_C13SubSectionKind kind);\ninternal String8List *           cv_sub_section_ptr_from_debug_s(CV_DebugS *debug_s, CV_C13SubSectionKind kind);\ninternal String8List             cv_sub_section_from_debug_s(CV_DebugS debug_s, CV_C13SubSectionKind kind);\ninternal String8                 cv_string_table_from_debug_s(CV_DebugS debug_s);\ninternal String8                 cv_file_chksms_from_debug_s(CV_DebugS debug_s);\n\n////////////////////////////////\n//~ .debug$T helpers\n\ninternal CV_DebugT       cv_debug_t_from_data_arr(Arena *arena, String8Array data_arr, U64 align);\ninternal CV_DebugT       cv_debug_t_from_data(Arena *arena, String8 data, U64 align);\ninternal CV_Leaf         cv_debug_t_get_leaf(CV_DebugT debug_t, U64 leaf_idx);\ninternal String8         cv_debug_t_get_raw_leaf(CV_DebugT debug_t, U64 leaf_idx);\ninternal CV_LeafHeader * cv_debug_t_get_leaf_header(CV_DebugT debug_t, U64 leaf_idx);\ninternal B32             cv_debug_t_is_pch(CV_DebugT debug_t);\ninternal B32             cv_debug_t_is_type_server(CV_DebugT debug_t);\ninternal U64             cv_debug_t_array_count_leaves(U64 count, CV_DebugT *arr);\n\ninternal String8List cv_str8_list_from_debug_t_parallel(TP_Context *tp, Arena *arena, CV_DebugT types);\n\n////////////////////////////////\n//~ Sub Section helpers\n\n// $$Symbols\ninternal void              cv_parse_symbol_sub_section_capped(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align, U64 cap);\ninternal void              cv_parse_symbol_sub_section(Arena *arena, CV_SymbolList *list, U64 offset_base, String8 data, U64 align);\ninternal void              cv_symbol_list_push_node(CV_SymbolList *list, CV_SymbolNode *node);\ninternal CV_SymbolNode *   cv_symbol_list_push(Arena *arena, CV_SymbolList *list);\ninternal CV_SymbolNode *   cv_symbol_list_push_data(Arena *arena, CV_SymbolList *list, CV_SymKind kind, String8 data);\ninternal CV_SymbolNode *   cv_symbol_list_push_many(Arena *arena, CV_SymbolList *list, U64 count);\ninternal void              cv_symbol_list_remove_node(CV_SymbolList *list, CV_SymbolNode *node);\ninternal void              cv_symbol_list_concat_in_place(CV_SymbolList *list, CV_SymbolList *to_concat);\ninternal void              cv_symbol_list_concat_in_place_arr(CV_SymbolList *list, U64 count, CV_SymbolList *to_concat);\ninternal U64               cv_symbol_list_arr_get_count(U64 count, CV_SymbolList *list_arr);\ninternal String8List       cv_data_from_symbol_list(Arena *arena, CV_SymbolList symbol_list, U64 align);\ninternal CV_SymbolList     cv_global_scope_symbols_from_list(Arena *arena, CV_SymbolList list);\ninternal CV_SymbolPtrArray cv_symbol_ptr_array_from_list(Arena *arena, TP_Context *tp, U64 count, CV_SymbolList *symbol_list_arr);\n\n// $$FileChksms\n#define CV_MAP_STRING_TO_OFFSET_FUNC(name) U64 name(void *ud, String8 string)\ntypedef CV_MAP_STRING_TO_OFFSET_FUNC(CV_MapStringToOffsetFunc);\n\ninternal void        cv_c13_patch_string_offsets_in_checksum_list(CV_ChecksumList checksum_list, String8 string_data, U64 string_data_base_offset, CV_StringHashTable string_ht);\ninternal String8List cv_c13_collect_source_file_names(Arena *arena, CV_ChecksumList checksum_list, String8 string_data);\n\n// $$Lines\ninternal CV_C13LinesHeaderList cv_c13_lines_from_sub_sections(Arena *arena, String8 c13_data, Rng1U64 ss_range);\ninternal CV_LineArray          cv_c13_line_array_from_data(Arena *arena, String8 c13_data, U64 sec_base, CV_C13LinesHeader parsed_lines);\n\n// $$InlineeLines\ninternal CV_C13InlineeLinesParsedList cv_c13_inlinee_lines_from_sub_sections(Arena *arena, String8List raw_inlinee_lines);\ninternal CV_InlineBinaryAnnotsParsed  cv_c13_parse_inline_binary_annots(Arena *arena, U64 parent_voff, CV_C13InlineeLinesParsed *inlinee_parsed, String8 binary_annots);\n\n// $$FrameData\ninternal void cv_c13_patch_checksum_offsets_in_frame_data_list(String8List frame_data, U32 checksum_rebase);\n\n////////////////////////////////\n// $$Lines Accel\n\ninternal void            cv_make_c13_files(Arena *arena, String8 c13_data, CV_C13SubSectionList lines, U64 *file_count_out, CV_C13File **files_out);\ninternal CV_LinesAccel * cv_make_lines_accel(Arena *arena, U64 lines_count, CV_LineArray *lines);\ninternal CV_Line *       cv_line_from_voff(CV_LinesAccel *accel, U64 voff, U64 *out_line_count);\n\n////////////////////////////////\n// $$InlineeLines Accel\n\ninternal U64                        cv_c13_inlinee_lines_accel_hash(void *buffer, U64 size);\ninternal B32                        cv_c13_inlinee_lines_accel_push(CV_InlineeLinesAccel *accel, CV_C13InlineeLinesParsed *parsed);\ninternal CV_C13InlineeLinesParsed * cv_c13_inlinee_lines_accel_find(CV_InlineeLinesAccel *accel, CV_ItemId inlinee);\ninternal CV_InlineeLinesAccel *     cv_c13_make_inlinee_lines_accel(Arena *arena, CV_C13InlineeLinesParsedList sub_sects);\n\n////////////////////////////////\n// String Hash Table\n\ninternal U64                      cv_string_hash_table_hash(String8 string);\ninternal CV_StringHashTable       cv_dedup_string_tables(TP_Arena *arena, TP_Context *tp, U64 count, CV_DebugS *arr);\ninternal CV_StringHashTableResult cv_serialize_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable string_ht);\ninternal String8                  cv_pack_string_hash_table(Arena *arena, TP_Context *tp, CV_StringHashTable string_ht);\n\n////////////////////////////////\n\ninternal Rng1U64List cv_make_defined_range_list_from_gaps(Arena *arena, Rng1U64 defrange, CV_LvarAddrGap *gaps, U64 gap_count);\n\n\n"
  },
  {
    "path": "src/linker/hash_table.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal void\nbucket_list_concat_in_place(BucketList *list, BucketList *to_concat)\n{\n  if (to_concat->first) {\n    if (list->first) {\n      list->last->next = to_concat->first;\n      list->last = to_concat->last;\n    } else {\n      list->first = to_concat->first;\n      list->last = to_concat->last;\n    }\n    MemoryZeroStruct(to_concat);\n  }\n}\n\ninternal BucketNode *\nbucket_list_pop(BucketList *list)\n{\n  BucketNode *result = list->first;\n  SLLQueuePop(list->first, list->last);\n  return result;\n}\n\ninternal U64\nhash_table_hasher(String8 string)\n{\n  return u64_hash_from_str8(string);\n}\n\ninternal HashTable *\nhash_table_init(Arena *arena, U64 cap)\n{\n  HashTable *ht = push_array(arena, HashTable, 1);\n  ht->cap       = cap;\n  ht->buckets   = push_array(arena, BucketList, cap);\n  return ht;\n}\n\ninternal void\nhash_table_purge(HashTable *ht)\n{\n  // reset key count\n  ht->count = 0;\n  \n  // concat buckets\n  for (U64 ibucket = 0; ibucket < ht->cap; ++ibucket) {\n    bucket_list_concat_in_place(&ht->free_buckets, &ht->buckets[ibucket]);\n  }\n}\n\ninternal BucketNode *\nhash_table_push(Arena *arena, HashTable *ht, U64 hash, KeyValuePair v)\n{\n  BucketNode *node;\n  if (ht->free_buckets.first != 0) {\n    node = bucket_list_pop(&ht->free_buckets);\n  } else {\n    node = push_array(arena, BucketNode, 1);\n  }\n  node->next = 0;\n  node->v    = v;\n  \n  U64 ibucket = hash % ht->cap;\n  DLLPushBack(ht->buckets[ibucket].first, ht->buckets[ibucket].last, node);\n  ht->count += 1;\n  \n  return node;\n}\n\ninternal BucketNode *\nhash_table_push_string_string(Arena *arena, HashTable *ht, String8 key, String8 value)\n{\n  U64 hash = hash_table_hasher(key);\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = key, .value_string = value });\n}\n\ninternal BucketNode *\nhash_table_push_string_raw(Arena *arena, HashTable *ht, String8 key, void *value)\n{\n  U64 hash = hash_table_hasher(key);\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = key, .value_raw = value });\n}\n\ninternal BucketNode *\nhash_table_push_string_u64(Arena *arena, HashTable *ht, String8 key, U64 value)\n{\n  U64 hash = hash_table_hasher(key);\n  return hash_table_push(arena, ht, hash, (KeyValuePair){.key_string = key, .value_u64 = value });\n}\n\ninternal BucketNode *\nhash_table_push_u32_raw(Arena *arena, HashTable *ht, U32 key, void *value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u32 = key, .value_raw = value });\n}\n\ninternal BucketNode *\nhash_table_push_u32_string(Arena *arena, HashTable *ht, U32 key, String8 value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u32 = key, .value_string = value });\n}\n\ninternal BucketNode *\nhash_table_push_u64_raw(Arena *arena, HashTable *ht, U64 key, void *value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u64 = key, .value_raw = value });\n}\n\ninternal BucketNode *\nhash_table_push_u64_string(Arena *arena, HashTable *ht, U64 key, String8 value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u64 = key, .value_string = value });\n}\n\ninternal BucketNode *\nhash_table_push_u64_u64(Arena *arena, HashTable *ht, U64 key, U64 value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u64 = key, .value_u64 = value });\n}\n\ninternal String8\nhash_table_normalize_path_string(Arena *arena, String8 path)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 result;\n  result = lower_from_str8(scratch.arena, path);\n  result = path_convert_slashes(arena, result, PathStyle_UnixAbsolute);\n  scratch_end(scratch);\n  return result;\n}\n\ninternal BucketNode *\nhash_table_push_path_string(Arena *arena, HashTable *ht, String8 path, String8 value)\n{\n  String8 path_canon = hash_table_normalize_path_string(arena, path); \n  return hash_table_push_string_string(arena, ht, path_canon, value);\n}\n\ninternal BucketNode *\nhash_table_push_path_u64(Arena *arena, HashTable *ht, String8 path, U64 value)\n{\n  String8 path_canon = hash_table_normalize_path_string(arena, path);\n  U64 hash = hash_table_hasher(path_canon);\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = path_canon, .value_u64 = value });\n}\n\ninternal BucketNode *\nhash_table_push_path_raw(Arena *arena, HashTable *ht, String8 path, void *value)\n{\n  String8 path_canon = hash_table_normalize_path_string(arena, path);\n  U64 hash = hash_table_hasher(path_canon);\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_string = path_canon, .value_raw = value });\n}\n\n////////////////////////////////\n\ninternal BucketNode *\nhash_table_search_string(HashTable *ht, String8 key_string)\n{\n  U64         hash    = hash_table_hasher(key_string);\n  U64         ibucket = hash % ht->cap;\n  BucketList *bucket  = ht->buckets + ibucket;\n  for (BucketNode *n = bucket->first; n != 0; n = n->next) {\n    if (str8_match(n->v.key_string, key_string, 0)) {\n      return n;\n    }\n  }\n  return 0;\n}\n\ninternal BucketNode *\nhash_table_search_u32(HashTable *ht, U32 key_u32)\n{\n  U64         hash    = hash_table_hasher(str8_struct(&key_u32));\n  U64         ibucket = hash % ht->cap;\n  BucketList *bucket  = ht->buckets + ibucket;\n  for (BucketNode *n = bucket->first; n != 0; n = n->next) {\n    if (n->v.key_u32 == key_u32) {\n      return n;\n    }\n  }\n  return 0;\n}\n\ninternal BucketNode *\nhash_table_search_u64(HashTable *ht, U64 key_u64)\n{\n  U64         hash    = hash_table_hasher(str8_struct(&key_u64));\n  U64         ibucket = hash % ht->cap;\n  BucketList *bucket  = ht->buckets + ibucket;\n  for (BucketNode *n = bucket->first; n != 0; n = n->next) {\n    if (n->v.key_u64 == key_u64) {\n      return n;\n    }\n  }\n  return 0;\n}\n\ninternal BucketNode *\nhash_table_search_path(HashTable *ht, String8 path)\n{\n  Temp scratch = scratch_begin(0,0);\n  String8 path_canon = path;\n  path_canon = lower_from_str8(scratch.arena, path_canon);\n  path_canon = path_convert_slashes(scratch.arena, path_canon, PathStyle_UnixAbsolute);\n  BucketNode *result = hash_table_search_string(ht, path_canon);\n  scratch_end(scratch);\n  return result;\n}\n\ninternal BucketNode *\nhash_table_search_raw(HashTable *ht, void *key)\n{\n  U64         hash    = hash_table_hasher(str8_struct(&key));\n  U64         ibucket = hash % ht->cap;\n  BucketList *bucket  = ht->buckets + ibucket;\n  for (BucketNode *n = bucket->first; n != 0; n = n->next) {\n    if (n->v.key_raw == key) {\n      return n;\n    }\n  }\n  return 0;\n}\n\ninternal B32\nhash_table_search_path_u64(HashTable *ht, String8 key, U64 *value_out)\n{\n  BucketNode *result = hash_table_search_path(ht, key);\n  if (result != 0) {\n    if (value_out != 0) {\n      *value_out = result->v.value_u64;\n    }\n    return 1;\n  }\n  return 0;\n}\n\ninternal BucketNode *\nhash_table_push_u32_u32(Arena *arena, HashTable *ht, U32 key, U32 value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_u32 = key, .value_u32 = value });\n}\n\ninternal BucketNode *\nhash_table_push_raw_raw(Arena *arena, HashTable *ht, void *key, void *value)\n{\n  U64 hash = hash_table_hasher(str8_struct(&key));\n  return hash_table_push(arena, ht, hash, (KeyValuePair){ .key_raw = key, .value_raw = value });\n}\n\ninternal B32\nhash_table_search_string_u64(HashTable *ht, String8 key, U64 *value_out)\n{\n  BucketNode *result = hash_table_search_string(ht, key);\n  if (result != 0) {\n    if (value_out != 0) {\n      *value_out = result->v.value_u64;\n    }\n    return 1;\n  }\n  return 0;\n}\n\ninternal B32\nhash_table_search_string_string(HashTable *ht, String8 key, String8 *value_out)\n{\n  BucketNode *result = hash_table_search_string(ht, key);\n  if (result) {\n    if (value_out) {\n      *value_out = result->v.value_string;\n    }\n    return 1;\n  }\n  return 0;\n}\n\ninternal B32\nhash_table_search_u32_u32(HashTable *ht, U32 key, U32 *value_out)\n{\n  BucketNode *result = hash_table_search_u32(ht, key);\n  if (result) {\n    if (value_out) {\n      *value_out = result->v.value_u32;\n    }\n    return 1;\n  }\n  return 0;\n}\n\ninternal void *\nhash_table_search_string_raw(HashTable *ht, String8 key)\n{\n  BucketNode *result = hash_table_search_string(ht, key);\n  if (result) {\n    return result->v.value_raw;\n  }\n  return 0;\n}\n\ninternal void *\nhash_table_search_u64_raw(HashTable *ht, U64 key_u64)\n{\n  BucketNode *n = hash_table_search_u64(ht, key_u64);\n  return n ? n->v.value_raw : 0;\n}\n\ninternal void *\nhash_table_search_path_raw(HashTable *ht, String8 path)\n{\n  BucketNode *n = hash_table_search_path(ht, path);\n  return n ? n->v.value_raw : 0;\n}\n\ninternal void *\nhash_table_search_raw_raw(HashTable *ht, void *key)\n{\n  BucketNode *n = hash_table_search_raw(ht, key);\n  return n ? n->v.value_raw : 0;\n}\n\ninternal void\nhash_table_purge_item(HashTable *ht, U64 hash, BucketNode *node)\n{\n  U64 bucket_idx = hash % ht->cap;\n  DLLRemove(ht->buckets[bucket_idx].first, ht->buckets[bucket_idx].last, node);\n  ht->count -= 1;\n}\n\ninternal B32\nhash_table_purge_u64(HashTable *ht, U64 key)\n{\n  U64         hash = hash_table_hasher(str8_struct(&key));\n  BucketNode *n    = hash_table_search_u64(ht, key);\n  if (n) {\n    hash_table_purge_item(ht, hash, n);\n    return 1;\n  }\n  return 0;\n}\n\ninternal B32\nhash_table_purge_string(HashTable *ht, String8 key)\n{\n  U64         hash = hash_table_hasher(key);\n  BucketNode *n    = hash_table_search_string(ht, key);\n  if (n) {\n    hash_table_purge_item(ht, hash, n);\n    return 1;\n  }\n  return 0;\n}\n\ninternal int\nkey_value_pair_is_before_u32(void *a, void *b)\n{\n  return ((KeyValuePair *)a)->key_u32 < ((KeyValuePair *)b)->key_u32;\n}\n\ninternal int\nkey_value_pair_is_before_u64(void *a, void *b)\n{\n  return ((KeyValuePair *)a)->key_u64 < ((KeyValuePair *)b)->key_u64;\n}\n\ninternal int\nkey_value_pair_is_before_string_sensitive(void *a, void *b)\n{\n  return str8_compar_case_sensitive(&((KeyValuePair*)a)->key_string, &((KeyValuePair*)b)->key_string) < 0;\n}\n\ninternal U32 *\nkeys_from_hash_table_u32(Arena *arena, HashTable *ht)\n{\n  U32 *result = push_array_no_zero(arena, U32, ht->count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) {\n    for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) {\n      Assert(cursor < ht->count);\n      result[cursor++] = n->v.key_u32;\n    }\n  }\n  return result;\n}\n\ninternal U64 *\nkeys_from_hash_table_u64(Arena *arena, HashTable *ht)\n{\n  U64 *result = push_array_no_zero(arena, U64, ht->count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) {\n    for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) {\n      Assert(cursor < ht->count);\n      result[cursor++] = n->v.key_u64;\n    }\n  }\n  return result;\n}\n\ninternal String8 *\nkeys_from_hash_table_string(Arena *arena, HashTable *ht)\n{\n  String8 *result = push_array_no_zero(arena, String8, ht->count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) {\n    for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) {\n      Assert(cursor < ht->count);\n      result[cursor++] = n->v.key_string;\n    }\n  }\n  return result;\n}\n\ninternal KeyValuePair *\nkey_value_pairs_from_hash_table(Arena *arena, HashTable *ht)\n{\n  KeyValuePair *pairs = push_array_no_zero(arena, KeyValuePair, ht->count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) {\n    for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) {\n      Assert(cursor < ht->count);\n      pairs[cursor++] = n->v;\n    }\n  }\n  return pairs;\n}\n\ninternal void *\nkeys_from_hash_table_raw(Arena *arena, HashTable *ht)\n{\n  void **result = push_array(arena, void *, ht->count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) {\n    for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) {\n      Assert(cursor < ht->count);\n      result[cursor++] = n->v.key_raw;\n    }\n  }\n  return result;\n}\n\ninternal void *\nvalues_from_hash_table_raw(Arena *arena, HashTable *ht)\n{\n  void **result = push_array(arena, void *, ht->count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < ht->cap; ++bucket_idx) {\n    for (BucketNode *n = ht->buckets[bucket_idx].first; n != 0; n = n->next) {\n      Assert(cursor < ht->count);\n      result[cursor++] = n->v.value_raw;\n    }\n  }\n  return result;\n}\n\n#include \"third_party/radsort/radsort.h\"\n\ninternal void\nsort_key_value_pairs_as_u32(KeyValuePair *pairs, U64 count)\n{\n  radsort(pairs, count, key_value_pair_is_before_u32);\n}\n\ninternal void\nsort_key_value_pairs_as_u64(KeyValuePair *pairs, U64 count)\n{\n  radsort(pairs, count, key_value_pair_is_before_u64);\n}\n\ninternal void\nsort_key_value_pairs_as_string_sensitive(KeyValuePair *pairs, U64 count)\n{\n  radsort(pairs, count, key_value_pair_is_before_string_sensitive);\n}\n\ninternal U64Array\nremove_duplicates_u64_array(Arena *arena, U64Array arr)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  HashTable *ht = hash_table_init(scratch.arena, ((U64)(F64)arr.count * 0.5));\n  \n  for (U64 i = 0; i < arr.count; ++i) {\n    BucketNode *is_present = hash_table_search_u64(ht, arr.v[i]);\n    if (!is_present) {\n      hash_table_push_u64_raw(scratch.arena, ht, arr.v[i], 0);\n    }\n  }\n  \n  U64Array result = {0};\n  result.count    = ht->count;\n  result.v        = keys_from_hash_table_u64(arena, ht);\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8List\nremove_duplicates_str8_list(Arena *arena, String8List list)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8List  result = {0};\n  HashTable   *ht     = hash_table_init(scratch.arena, list.node_count);\n  \n  for (String8Node *node = list.first; node != 0; node = node->next) {\n    BucketNode *is_present = hash_table_search_string(ht, node->string);\n    if (!is_present) {\n      hash_table_push_string_raw(scratch.arena, ht, node->string, 0);\n      str8_list_push(arena, &result, node->string);\n    }\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\n"
  },
  {
    "path": "src/linker/hash_table.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef struct KeyValuePair\n{\n  union {\n    String8 key_string;\n    void   *key_raw;\n    U32     key_u32;\n    U64     key_u64;\n  };\n  union {\n    String8  value_string;\n    void    *value_raw;\n    U32      value_u32;\n    U64      value_u64;\n  };\n} KeyValuePair;\n\ntypedef struct BucketNode\n{\n  KeyValuePair       v;\n  struct BucketNode *next;\n  struct BucketNode *prev;\n} BucketNode;\n\ntypedef struct BucketList\n{\n  BucketNode *first;\n  BucketNode *last;\n} BucketList;\n\ntypedef struct HashTable\n{\n  U64         count;\n  U64         cap;\n  BucketList *buckets;\n  BucketList  free_buckets;\n} HashTable;\n\n// --- Bucket List -------------------------------------------------------------\n\ninternal void         bucket_list_concat_in_place(BucketList *list, BucketList *to_concat);\ninternal BucketNode * bucket_list_pop            (BucketList *list);\n\n// --- Hash Table --------------------------------------------------------------\n\ninternal U64 hash_table_hasher(String8 string);\n\ninternal HashTable * hash_table_init (Arena *arena, U64 cap);\ninternal void        hash_table_purge(HashTable *ht);\n\ninternal BucketNode * hash_table_push(Arena *arena, HashTable *ht, U64 hash,     KeyValuePair  kv);\n\ninternal BucketNode * hash_table_push_u32_string   (Arena *arena, HashTable *ht, U32     key,  String8       value);\ninternal BucketNode * hash_table_push_u64_string   (Arena *arena, HashTable *ht, U64     key,  String8       value);\ninternal BucketNode * hash_table_push_string_string(Arena *arena, HashTable *ht, String8 key,  String8       value);\ninternal BucketNode * hash_table_push_path_string  (Arena *arena, HashTable *ht, String8 key,  String8       value);\ninternal BucketNode * hash_table_push_u32_raw      (Arena *arena, HashTable *ht, U32     key,  void         *value);\ninternal BucketNode * hash_table_push_u64_raw      (Arena *arena, HashTable *ht, U64     key,  void         *value);\ninternal BucketNode * hash_table_push_path_raw     (Arena *arena, HashTable *ht, String8 path, void         *value);\ninternal BucketNode * hash_table_push_path_u64     (Arena *arena, HashTable *ht, String8 path, U64           value);\ninternal BucketNode * hash_table_push_u64_u64      (Arena *arena, HashTable *ht, U64     key,  U64           value);\ninternal BucketNode * hash_table_push_u32_u32      (Arena *arena, HashTable *ht, U32     key,  U32           value);\n\ninternal BucketNode * hash_table_search_string  (HashTable *ht, String8 key);\ninternal BucketNode * hash_table_search_u32     (HashTable *ht, U32     key);\ninternal BucketNode * hash_table_search_u64     (HashTable *ht, U64     key);\ninternal BucketNode * hash_table_search_path    (HashTable *ht, String8 key);\ninternal BucketNode * hash_table_search_raw     (HashTable *ht, void   *key);\n\ninternal B32 hash_table_search_path_u64     (HashTable *ht, String8 key, U64     *value_out);\ninternal B32 hash_table_search_string_u64   (HashTable *ht, String8 key, U64     *value_out);\ninternal B32 hash_table_search_string_string(HashTable *ht, String8 key, String8 *value_out);\ninternal B32 hash_table_search_u32_u32      (HashTable *ht, U32 key,     U32     *value_out);\n\ninternal void * hash_table_search_string_raw(HashTable *ht, String8 key);\ninternal void * hash_table_search_u64_raw   (HashTable *ht, U64     key);\ninternal void * hash_table_search_path_raw  (HashTable *ht, String8 key);\ninternal void * hash_table_search_raw_raw   (HashTable *ht, void   *key);\n\ninternal void hash_table_purge_item  (HashTable *ht, U64 hash, BucketNode *node);\ninternal B32  hash_table_purge_u64   (HashTable *ht, U64 key);\ninternal B32  hash_table_purge_string(HashTable *ht, String8 key);\n\n// --- Key Value Helpers -------------------------------------------------------\n\ninternal U32 *          keys_from_hash_table_u32       (Arena *arena, HashTable *ht);\ninternal U64 *          keys_from_hash_table_u64       (Arena *arena, HashTable *ht);\ninternal String8        keys_from_hash_table_str8      (Arena *arena, HashTable *ht);\ninternal KeyValuePair * key_value_pairs_from_hash_table(Arena *arena, HashTable *ht);\n\ninternal void * keys_from_hash_table_raw  (Arena *arena, HashTable *ht);\ninternal void * values_from_hash_table_raw(Arena *arena, HashTable *ht);\n\ninternal void sort_key_value_pairs_as_u32             (KeyValuePair *pairs, U64 count);\ninternal void sort_key_value_pairs_as_u64             (KeyValuePair *pairs, U64 count);\ninternal void sort_key_value_pairs_as_string_sensitive(KeyValuePair *pairs, U64 count);\n\n// --- Misc --------------------------------------------------------------------\n\ninternal U64Array    remove_duplicates_u64_array(Arena *arena, U64Array arr);\ninternal String8List remove_duplicates_str8_list(Arena *arena, String8List list);\n\n"
  },
  {
    "path": "src/linker/linker.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\n  <Type Name=\"LNK_Section\">\n    <DisplayString>{{ name={name} flags={flags} id={id} sort_index={sort_index} }}</DisplayString>\n  </Type>\n\n  <Type Name=\"LNK_LibMemberRef\">\n    <Expand>\n      <Item Name=\"[Link Symbol]\">lib->was_member_linked[member_idx]</Item>\n      <Item Name=\"[Lib]\">lib</Item>\n      <Item Name=\"[Member Index]\">member_idx</Item>\n    </Expand>\n  </Type>\n\n  <Type Name=\"U32Array\">\n    <AlternativeType Name=\"U64Array\"/>\n    <Expand>\n      <Item Name=\"[count]\">count</Item>\n      <ArrayItems>\n        <Size>count</Size>\n        <ValuePointer>v</ValuePointer>\n      </ArrayItems>\n    </Expand>\n  </Type>\n\n  <Type Name=\"LNK_ExportParseList\">\n    <AlternativeType Name=\"LNK_InputObjList\"/>\n    <AlternativeType Name=\"LNK_InputList\"/>\n    <AlternativeType Name=\"LNK_LibMemberRefList\"/>\n    <DisplayString>{{count={count} first={first} last={last} }}</DisplayString>\n    <Expand>\n\t\t\t<LinkedListItems>\n\t\t\t\t<Size>count</Size>\n\t\t\t\t<HeadPointer>first</HeadPointer>\n\t\t\t\t<NextPointer>next</NextPointer>\n        <ValueNode>this</ValueNode>\n\t\t\t</LinkedListItems>\n    </Expand>\n  </Type>\n  <Type Name=\"LNK_SymbolList\">\n    <AlternativeType Name=\"LNK_LibList\"/>\n    <AlternativeType Name=\"LNK_SectionList\"/>\n    <AlternativeType Name=\"LNK_ChunkList\"/>\n    <AlternativeType Name=\"LNK_ExportParseList\"/>\n    <AlternativeType Name=\"LNK_InputImportList\"/>\n    <AlternativeType Name=\"LNK_ObjList\"/>\n    <AlternativeType Name=\"LNK_InputImportList\"/>\n    <AlternativeType Name=\"CV_SymbolList\"/>\n    <DisplayString>{{count={count} first={first} }}</DisplayString>\n    <Expand>\n\t\t\t<LinkedListItems>\n\t\t\t\t<Size>count</Size>\n\t\t\t\t<HeadPointer>first</HeadPointer>\n\t\t\t\t<NextPointer>next</NextPointer>\n        <ValueNode>data</ValueNode>\n\t\t\t</LinkedListItems>\n    </Expand>\n  </Type>\n\n  <Type Name=\"LNK_SectionContribChunk\">\n    <Expand>\n      <ArrayItems>\n        <Size>count</Size>\n        <ValuePointer>v</ValuePointer>\n      </ArrayItems>\n    </Expand>\n  </Type>\n\n  <Type Name=\"LNK_SectionContribChunkList\">\n    <Expand>\n      <LinkedListItems>\n        <Size>chunk_count</Size>\n        <HeadPointer>first</HeadPointer>\n        <NextPointer>next</NextPointer>\n        <ValueNode>this</ValueNode>\n      </LinkedListItems>\n    </Expand>\n  </Type>\n\n  <Type Name=\"Rng1U64List\">\n    <DisplayString>{{count={count} first={first} last={last} }}</DisplayString>\n    <Expand>\n\t\t\t<LinkedListItems>\n\t\t\t\t<Size>count</Size>\n\t\t\t\t<HeadPointer>first</HeadPointer>\n\t\t\t\t<NextPointer>next</NextPointer>\n        <ValueNode>v</ValueNode>\n\t\t\t</LinkedListItems>\n    </Expand>\n  </Type>\n\n\t<Type Name=\"RDIB_LineTable\">\n    <DisplayString>{{count={count} first={first} last={last} }}</DisplayString>\n\t\t<Expand>\n\t\t\t<Item Name=\"[count]\">count</Item>\n\t\t\t<LinkedListItems>\n\t\t\t\t<Size>count</Size>\n\t\t\t\t<HeadPointer>first</HeadPointer>\n\t\t\t\t<NextPointer>next_line_table</NextPointer>\n        <ValueNode>this</ValueNode>\n\t\t\t</LinkedListItems>\n\t\t</Expand>\n\t</Type>\n\n\t<Type Name=\"LNK_SymbolHashTrieChunkList\">\n\t\t<Expand>\n      <Item Name=\"[chunk count]\">count</Item>\n      <CustomListItems MaxItemsPerView=\"5000\">\n        <Variable Name=\"node\" InitialValue=\"first\"/>\n        <Variable Name=\"idx\" InitialValue=\"0\"/>\n        <Loop>\n          <Break Condition=\"node == 0\"/>\n          <Exec>idx = 0</Exec>\n          <Loop>\n            <Break Condition=\"idx >= node->count\"/>\n            <Item>node->v[idx]</Item>\n            <Exec>idx += 1</Exec>\n          </Loop>\n          <Exec>node = node->next</Exec>\n        </Loop>\n      </CustomListItems>\n\t\t</Expand>\n\t</Type>\n\n  <Type Name=\"LNK_SymbolHashTrieChunk\">\n    <DisplayString>{count,cap,v}</DisplayString>\n    <Expand>\n      <Item Name=\"[count]\">count</Item>\n      <Item Name=\"[cap]\">cap</Item>\n      <ArrayItems>\n        <Size>count</Size>\n        <ValuePointer>v</ValuePointer>\n      </ArrayItems>\n    </Expand>\n  </Type>\n\n\t<Type Name=\"RDIB_VariableChunkList\">\n    <AlternativeType Name=\"RDIB_UnitChunkList\"/>\n    <AlternativeType Name=\"RDIB_LineTableChunkList\"/>\n    <AlternativeType Name=\"RDIB_SourceFileChunkList\"/>\n    <AlternativeType Name=\"RDIB_ProcedureChunkList\"/>\n    <AlternativeType Name=\"RDIB_ScopeChunkList\"/>\n    <AlternativeType Name=\"RDIB_InlineSiteChunkList\"/>\n    <AlternativeType Name=\"RDIB_UDTMemberChunkList\"/>\n    <AlternativeType Name=\"RDIB_TypeChunkList\"/>\n\t\t<Expand>\n      <Item Name=\"[chunk count]\">count</Item>\n      <CustomListItems MaxItemsPerView=\"5000\">\n        <Variable Name=\"node\" InitialValue=\"first\"/>\n        <Variable Name=\"idx\" InitialValue=\"0\"/>\n        <Loop>\n          <Break Condition=\"node == 0\"/>\n          <Exec>idx = 0</Exec>\n          <Loop>\n            <Break Condition=\"idx >= node->count\"/>\n            <Item>node->v[idx]</Item>\n            <Exec>idx += 1</Exec>\n          </Loop>\n          <Exec>node = node->next</Exec>\n        </Loop>\n      </CustomListItems>\n\t\t</Expand>\n\t</Type>\n\n  <Type Name=\"RDIB_VariableChunk\">\n    <AlternativeType Name=\"RDIB_UnitChunk\"/>\n    <AlternativeType Name=\"RDIB_LineTableChunk\"/>\n    <AlternativeType Name=\"RDIB_SourceFileChunk\"/>\n    <AlternativeType Name=\"RDIB_ProcedureChunk\"/>\n    <AlternativeType Name=\"RDIB_ScopeChunk\"/>\n    <AlternativeType Name=\"RDIB_InlineSiteChunk\"/>\n    <AlternativeType Name=\"RDIB_UDTMemberChunk\"/>\n    <AlternativeType Name=\"RDIB_TypeChunk\"/>\n    <DisplayString>{count,cap,v}</DisplayString>\n    <Expand>\n      <Item Name=\"[base]\">base</Item>\n      <Item Name=\"[count]\">count</Item>\n      <Item Name=\"[cap]\">cap</Item>\n      <ArrayItems>\n        <Size>count</Size>\n        <ValuePointer>v</ValuePointer>\n      </ArrayItems>\n    </Expand>\n  </Type>\n\n\t<Type Name=\"BucketList\">\n    <AlternativeType Name=\"LNK_IncludeSymbolList\"/>\n    <AlternativeType Name=\"LNK_AltNameList\"/>\n    <AlternativeType Name=\"LNK_MergeDirectiveList\"/>\n    <DisplayString Condition=\"first == 0\">empty</DisplayString>\n\t\t<Expand>\n\t\t\t<LinkedListItems>\n\t\t\t\t<HeadPointer>first</HeadPointer>\n\t\t\t\t<NextPointer>next</NextPointer>\n        <ValueNode>v</ValueNode>\n\t\t\t</LinkedListItems>\n\t\t</Expand>\n\t</Type>\n\n  <Type Name=\"HashTable\">\n    <Expand>\n      <Item Name=\"[cap]\">cap</Item>\n      <Item Name=\"[count]\">count</Item>\n      <Item Name=\"[free buckets]\">free_buckets</Item>\n      <CustomListItems MaxItemsPerView=\"512\">\n        <Variable Name=\"bucket_idx\" InitialValue=\"0\"/>\n        <Variable Name=\"node\" InitialValue=\"buckets[0].first\"/>\n        <Loop>\n          <Exec>node = buckets[bucket_idx].first</Exec>\n          <Break Condition=\"bucket_idx >= cap\"/>\n          <Loop>\n            <Break Condition=\"node == 0\"/>\n            <Item>node</Item>\n            <Exec>node = node->next</Exec>\n          </Loop>\n          <Exec>bucket_idx += 1</Exec>\n        </Loop>\n      </CustomListItems>\n    </Expand>\n  </Type>\n\n</AutoVisualizer>\n\n"
  },
  {
    "path": "src/linker/lnk.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n// --- Build Options -----------------------------------------------------------\n\n#define BUILD_CONSOLE_INTERFACE 1\n#define BUILD_TITLE \"Epic Games Tools (R) RAD PE/COFF Linker\"\n\n// --- Arena -------------------------------------------------------------------\n\n#define ARENA_FREE_LIST 1\n\n// --- Third Party -------------------------------------------------------------\n\n#include \"base_ext/base_blake3.h\"\n#include \"base_ext/base_blake3.c\"\n#define XXH_INLINE_ALL\n#define XXH_IMPLEMENTATION\n#define XXH_STATIC_LINKING_ONLY\n#include \"third_party/xxHash/xxhash.c\"\n#include \"third_party/xxHash/xxhash.h\"\n#include \"third_party/radsort/radsort.h\"\n\n// --- Code Base ---------------------------------------------------------------\n\n#include \"base/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"hash_table.h\"\n#include \"coff/coff.h\"\n#include \"coff/coff_parse.h\"\n#include \"coff/coff_obj_writer.h\"\n#include \"coff/coff_lib_writer.h\"\n#include \"pe/pe.h\"\n#include \"pe/pe_section_flags.h\"\n#include \"pe/pe_make_import_table.h\"\n#include \"pe/pe_make_export_table.h\"\n#include \"pe/pe_make_debug_dir.h\"\n#include \"codeview/codeview.h\"\n#include \"codeview/codeview_parse.h\"\n#include \"msf/msf.h\"\n#include \"msf/msf_parse.h\"\n#include \"pdb/pdb.h\"\n#include \"msvc_crt/msvc_crt.h\"\n\n#include \"base/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"hash_table.c\"\n#include \"coff/coff.c\"\n#include \"coff/coff_parse.c\"\n#include \"coff/coff_obj_writer.c\"\n#include \"coff/coff_lib_writer.c\"\n#include \"pe/pe.c\"\n#include \"pe/pe_make_import_table.c\"\n#include \"pe/pe_make_export_table.c\"\n#include \"pe/pe_make_debug_dir.c\"\n#include \"codeview/codeview.c\"\n#include \"codeview/codeview_parse.c\"\n#include \"msf/msf.c\"\n#include \"msf/msf_parse.c\"\n#include \"pdb/pdb.c\"\n#include \"msvc_crt/msvc_crt.c\"\n\n// --- RDI ---------------------------------------------------------------------\n\n#include \"rdi/rdi_local.h\"\n#include \"rdi/rdi_local.c\"\n\n// --- Code Base Extensions ----------------------------------------------------\n\n#include \"base_ext/base_inc.h\"\n#include \"thread_pool/thread_pool.h\"\n#include \"codeview_ext/codeview.h\"\n#include \"pdb_ext/msf_builder.h\"\n#include \"pdb_ext/pdb.h\"\n#include \"pdb_ext/pdb_helpers.h\"\n#include \"pdb_ext/pdb_builder.h\"\n\n#include \"base_ext/base_inc.c\"\n#include \"thread_pool/thread_pool.c\"\n#include \"codeview_ext/codeview.c\"\n#include \"pdb_ext/msf_builder.c\"\n#include \"pdb_ext/pdb.c\"\n#include \"pdb_ext/pdb_helpers.c\"\n#include \"pdb_ext/pdb_builder.c\"\n\n// --- RDI Builder -------------------------------------------------------------\n\n#include \"rdi/rdi_builder.h\"\n#include \"rdi/rdi_coff.h\" \n#include \"rdi/rdi_cv.h\"\n\n#include \"rdi/rdi_builder.c\"\n#include \"rdi/rdi_coff.c\"\n#include \"rdi/rdi_cv.c\"\n\n// --- Linker ------------------------------------------------------------------\n\n#include \"lnk_error.h\"\n#include \"lnk_log.h\"\n#include \"lnk_timer.h\"\n#include \"lnk_io.h\"\n#include \"lnk_cmd_line.h\"\n#include \"lnk_config.h\"\n#include \"lnk_symbol_table.h\"\n#include \"lnk_section_table.h\"\n#include \"lnk_debug_helper.h\"\n#include \"lnk_obj.h\"\n#include \"lnk_lib.h\"\n#include \"lnk_debug_info.h\"\n#include \"lnk.h\"\n\n#include \"lnk_error.c\"\n#include \"lnk_log.c\"\n#include \"lnk_timer.c\"\n#include \"lnk_io.c\"\n#include \"lnk_cmd_line.c\"\n#include \"lnk_config.c\"\n#include \"lnk_symbol_table.c\"\n#include \"lnk_section_table.c\"\n#include \"lnk_obj.c\"\n#include \"lnk_debug_helper.c\"\n#include \"lnk_lib.c\"\n#include \"lnk_debug_info.c\"\n\n// -----------------------------------------------------------------------------\n\ninternal LNK_Config *\nlnk_config_from_argcv(Arena *arena, int argc, char **argv)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8List raw_cmd_line = {0};\n  for EachIndex(i, argc) {\n    str8_list_push(arena, &raw_cmd_line, str8_cstring(argv[i]));\n  }\n\n  // remove exe name first argument\n  str8_list_pop_front(&raw_cmd_line); \n\n  // parse command line\n  String8List unwrapped_cmd_line = lnk_unwrap_rsp(scratch.arena, raw_cmd_line);\n  LNK_CmdLine cmd_line           = lnk_cmd_line_parse_windows_rules(scratch.arena, unwrapped_cmd_line);\n\n  // setup default flags\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Align,     \"%u\", KB(4));\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Debug,     \"none\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_FileAlign, \"%u\", 512);\n  if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Dll)) {\n    lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_SubSystem, \"%S\", pe_string_from_subsystem(PE_WindowsSubsystem_WINDOWS_GUI));\n  }\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_HighEntropyVa,               \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_ManifestUac,                 \"\\\"level='asInvoker' uiAccess='false'\\\"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_NxCompat,                    \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_LargeAddressAware,           \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbAltPath,                  \"%%_RAD_PDB_PATH%%\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_PdbPageSize,                 \"%u\", KB(4));\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Brepro)) {\n    lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TimeStamp, \"%u\", os_get_process_start_time_unix());\n  }\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Age,                     \"%u\", 1);\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll, \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DoMerge,                 \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_EnvLib,                  \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Exe,                     \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Guid,                    \"imageblake3\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LargePages,              \"no\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_LinkVer,                 \"14.0\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_OsVer,                   \"6.0\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PageSize,                \"%u\", KB(4));\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_PathStyle,               \"system\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Workers,                 \"%u\", os_get_system_info()->logical_processor_count);\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_TargetOs,                \"windows\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_DebugAltPath,            \"%%_RAD_RDI_PATH%%\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MemoryMapFiles,          \"\");\n#if BUILD_DEBUG\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, \"debug\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_Log, \"io_write\");\n#else\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SuppressError, \"%u\", LNK_Error_InvalidTypeIndex);\n#endif\n\n  // default section merges\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".xdata=.rdata\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".00cfg=.rdata\");\n  // TODO: .tls must be always first contribution in .data section because compiler generates TLS relative movs\n  //lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".tls=.data\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".idata=.data\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".didat=.data\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".edata=.rdata\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".RAD_LINK_PE_DEBUG_DIR=.rdata\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Merge, \".RAD_LINK_PE_DEBUG_DATA=.rdata\");\n\n  // sections to remove from the image\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, \".debug\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, \".gehcont\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, \".gfids\");\n  lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_RemoveSection, \".gxfg\");\n\n  // set limits on unresolved symbol errors\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, \"\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolLimit, \"1000\");\n  lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit, \"10\");\n\n  // set default max worker count \n  if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_SharedThreadPool)) {\n    lnk_cmd_line_push_optionf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers, \"\");\n  }\n\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_MtPath)) {\n    lnk_cmd_line_push_option_if_not_presentf(scratch.arena, &cmd_line, LNK_CmdSwitch_Rad_MtPath, \"%s\", LNK_MANIFEST_MERGE_TOOL_NAME);\n  }\n\n  // when /FORCE is specified on the command line, do not stop on these errors\n  if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Force)) {\n    g_error_mode_arr[LNK_Error_UnresolvedSymbol] = LNK_ErrorMode_Continue;\n  }\n\n  // init config\n  LNK_Config *config = lnk_config_from_cmd_line(raw_cmd_line, cmd_line);\n\n#if PROFILE_TELEMETRY\n  {\n    String8 cmdl = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(\" \") });\n    tmMessage(0, TMMF_ICON_NOTE, \"Command Line: %.*s\", str8_varg(cmdl));\n  }\n#endif\n\n  if (lnk_get_log_status(LNK_Log_Debug)) {\n    String8 full_cmd_line = str8_list_join(scratch.arena, &raw_cmd_line, &(StringJoin){ .sep = str8_lit_comp(\" \") });\n    fprintf(stderr, \"--------------------------------------------------------------------------------\\n\");\n    fprintf(stderr, \"Command Line: %.*s\\n\", str8_varg(full_cmd_line));\n    fprintf(stderr, \"Work Dir    : %.*s\\n\", str8_varg(config->work_dir));\n    fprintf(stderr, \"--------------------------------------------------------------------------------\\n\");\n  }\n\n  scratch_end(scratch);\n  return config;\n}\n\ninternal String8\nlnk_make_full_path(Arena *arena, PathStyle system_path_style, String8 work_dir, String8 path)\n{\n  ProfBeginFunction();\n  String8 result = str8(0,0);\n  PathStyle path_style = path_style_from_str8(path);\n  if (path_style == PathStyle_Relative) {\n    Temp scratch = scratch_begin(&arena, 1);\n    String8List list = {0};\n    str8_list_push(scratch.arena, &list, work_dir);\n    str8_list_push(scratch.arena, &list, path);\n    result = str8_path_list_join_by_style(arena, &list, system_path_style);\n    scratch_end(scratch);\n  } else {\n    result = push_str8_copy(arena, path);\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_blake3_hasher_task)\n{\n  ProfBeginFunction();\n  \n  LNK_Blake3Hasher *task     = raw_task;\n  Rng1U64           range    = task->ranges[task_id];\n  String8           sub_data = str8_substr(task->data, range);\n  \n  blake3_hasher hasher; blake3_hasher_init(&hasher);\n  blake3_hasher_update(&hasher, sub_data.str, sub_data.size);\n  blake3_hasher_finalize(&hasher, (U8 *)task->hashes[task_id].u64, sizeof(task->hashes[task_id].u64));\n  \n  ProfEnd();\n}\n\ninternal U128\nlnk_blake3_hash_parallel(TP_Context *tp, U64 chunk_count, String8 data)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  ProfBegin(\"Hash Chunks\");\n  LNK_Blake3Hasher task = {0};\n  task.data             = data;\n  task.ranges           = tp_divide_work(scratch.arena, data.size, chunk_count);\n  task.hashes           = push_array(scratch.arena, U128, chunk_count);\n  tp_for_parallel(tp, 0, chunk_count, lnk_blake3_hasher_task, &task);\n  ProfEnd();\n  \n  ProfBegin(\"Combine Hashes\");\n  blake3_hasher hasher; blake3_hasher_init(&hasher);\n  for (U64 i = 0; i < chunk_count; ++i) {\n    blake3_hasher_update(&hasher, (U8 *)task.hashes[i].u64, sizeof(task.hashes[i].u64));\n  }\n  U128 result;\n  blake3_hasher_finalize(&hasher, (U8 *)result.u64, sizeof(result.u64));\n  ProfEnd();\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal String8\nlnk_make_linker_manifest(Arena      *arena,\n                         B32         manifest_uac,\n                         String8     manifest_level,\n                         String8     manifest_ui_access,\n                         String8List manifest_dependency_list)\n{\n  // TODO: we write a temp file with manifest attributes collected from obj directives and command line switches\n  // so we can pass file to mt.exe or llvm-mt.exe, when we have our own tool for merging manifest we can switch\n  // to writing manifest file in memory to skip roun-trip to disk\n\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8List srl = {0};\n  str8_serial_begin(scratch.arena, &srl);\n  str8_serial_push_string(scratch.arena, &srl, str8_lit(\n                                                \"<?xml version=\\\"1.0\\\" standalone=\\\"yes\\\"?>\\n\"\n                                                \"<assembly xmlns=\\\"urn:schemas-microsoft-com:asm.v1\\\"\\n\"\n                                                \"          manifestVersion=\\\"1.0\\\">\\n\"));\n  if (manifest_uac) {\n#if 1\n    String8 uac = push_str8f(scratch.arena,\n                             \"   <trustInfo>\\n\"\n                             \"     <security>\\n\"\n                             \"       <requestedPrivileges>\\n\"\n                             \"         <requestedExecutionLevel level=%S uiAccess=%S/>\\n\"\n                             \"       </requestedPrivileges>\\n\"\n                             \"     </security>\\n\"\n                             \"   </trustInfo>\\n\",\n                             manifest_level,\n                             manifest_ui_access);\n#else\n    String8 uac = push_str8f(scratch.arena,\n        \t\"<ms_asmv2:trustInfo xmlns:ms_asmv2=\"urn:schemas-microsoft-com:asm.v2\" xmlns=\"urn:schemas-microsoft-com:asm.v3\">\\n\"\n\t\t        \"<ms_asmv2:security>\"\n\t\t\t        \"<ms_asmv2:requestedPrivileges>\"\n\t\t\t\t        \"<ms_asmv2:requestedExecutionLevel level=%S uiAccess=%S>\"\n                \"</ms_asmv2:requestedExecutionLevel>\"\n\t\t\t        \"</ms_asmv2:requestedPrivileges>\"\n\t\t        \"</ms_asmv2:security>\"\n\t        \"</ms_asmv2:trustInfo>\", manifest_level, manifest_ui_access);\n#endif\n    str8_serial_push_string(scratch.arena, &srl, uac);\n  }\n  for (String8Node *node = manifest_dependency_list.first; node != 0; node = node->next) {\n    String8 dep = push_str8f(scratch.arena, \n                             \" <dependency>\\n\"\n                             \"   <dependentAssembly>\\n\"\n                             \"     <assemblyIdentity %S/>\\n\"\n                             \"   </dependentAssembly>\\n\"\n                             \" </dependency>\\n\",\n                             node->string);\n    str8_serial_push_string(scratch.arena, &srl, dep);\n  }\n  str8_serial_push_string(scratch.arena, &srl, str8_lit(\"</assembly>\\n\"));\n\n  String8 result = str8_list_join(arena, &srl, 0);\n\n  scratch_end(scratch);\n  return result;\n}\n\ninternal void\nlnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest_path_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n  \n  String8List cmd_line = {0};\n  str8_list_push(scratch.arena, &cmd_line, mt_path);\n  str8_list_pushf(scratch.arena, &cmd_line, \"-out:%S\", out_name);\n  str8_list_pushf(scratch.arena, &cmd_line, \"-nologo\");\n\n  // register input manifest files on command line\n  String8 work_dir = os_get_current_path(scratch.arena);\n  for (String8Node *man_node = manifest_path_list.first;\n       man_node != 0;\n       man_node = man_node->next) {\n    // resolve relative inputs\n    String8 full_path = path_absolute_dst_from_relative_dst_src(scratch.arena, man_node->string, work_dir);\n\n    // normalize slashes\n    full_path = path_convert_slashes(scratch.arena, full_path, PathStyle_UnixAbsolute);\n\n    // push input to command line\n    str8_list_pushf(scratch.arena, &cmd_line, \"-manifest\");\n    str8_list_push(scratch.arena, &cmd_line, full_path);\n  }\n  \n  // launch mt.exe with our command line\n  OS_ProcessLaunchParams launch_opts = {0};\n  launch_opts.cmd_line               = cmd_line;\n  launch_opts.inherit_env            = 1;\n  launch_opts.consoleless            = 0;\n  OS_Handle mt_handle = os_process_launch(&launch_opts);\n  if (os_handle_match(mt_handle, os_handle_zero())) {\n    lnk_error(LNK_Error_Mt, \"unable to start process: %S\", mt_path);\n  } else {\n    os_process_join(mt_handle, max_U64, 0);\n    os_process_detach(mt_handle);\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n} \n\ninternal String8\nlnk_manifest_from_inputs(Arena       *arena,\n                         LNK_IO_Flags io_flags,\n                         String8      mt_path,\n                         String8      manifest_name,\n                         B32          manifest_uac,\n                         String8      manifest_level,\n                         String8      manifest_ui_access,\n                         String8List  input_manifest_path_list,\n                         String8List  deps_list)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8List unique_deps = remove_duplicates_str8_list(scratch.arena, deps_list);\n\n  String8 manifest_data;\n\n  if (input_manifest_path_list.node_count > 0) {\n    ProfBegin(\"Merge Manifests\");\n    \n    String8 linker_manifest = lnk_make_linker_manifest(scratch.arena, manifest_uac, manifest_level, manifest_ui_access, unique_deps);\n\n    // write linker manifest to temp file\n    String8 linker_manifest_path = push_str8f(scratch.arena, \"%S.manifest.temp\", manifest_name);\n    lnk_write_data_to_file_path(linker_manifest_path, str8_zero(), linker_manifest);\n\n    String8List unique_input_manifest_paths = remove_duplicates_str8_list(scratch.arena, input_manifest_path_list);\n\n    // push linker manifest\n    str8_list_push(scratch.arena, &unique_input_manifest_paths, linker_manifest_path);\n\n    // launch mt.exe to merge input manifests\n    String8 merged_manifest_path = push_str8f(scratch.arena, \"%S.manifest.merged\", manifest_name);\n    lnk_merge_manifest_files(mt_path, merged_manifest_path, unique_input_manifest_paths);\n\n    // read mt.exe output from disk\n    manifest_data = lnk_read_data_from_file_path(arena, io_flags, merged_manifest_path);\n    if (manifest_data.size == 0) {\n      lnk_error(LNK_Error_Mt, \"unable to find mt.exe output manifest on disk, expected path \\\"%S\\\"\", merged_manifest_path);\n    }\n\n    // cleanup disk\n    os_delete_file_at_path(linker_manifest_path);\n    os_delete_file_at_path(merged_manifest_path);\n\n    ProfEnd();\n  } else {\n    manifest_data = lnk_make_linker_manifest(arena, manifest_uac, manifest_level, manifest_ui_access, unique_deps);\n  }\n\n  scratch_end(scratch);\n  return manifest_data;\n}\n\ninternal String8\nlnk_make_null_obj(Arena *arena)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_Unknown);\n\n  // push null symbol\n  COFF_ObjSymbol *null_abs = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(LNK_NULL_SYMBOL), 0, COFF_SymStorageClass_External);\n\n  // push import stub\n  coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(LNK_IMPORT_STUB), COFF_WeakExt_Null, null_abs);\n\n  // push .debug$T sections with null leaf\n  String8 null_debug_data;\n  {\n    String8 raw_null_leaf = cv_serialize_raw_leaf(obj_writer->arena, CV_LeafKind_NOTYPE, str8(0,0), 1);\n\n    String8List srl = {0};\n    str8_serial_begin(obj_writer->arena, &srl);\n    str8_serial_push_u32(obj_writer->arena, &srl, CV_Signature_C13);\n    str8_serial_push_string(obj_writer->arena, &srl, raw_null_leaf);\n    null_debug_data = str8_serial_end(obj_writer->arena, &srl);\n  }\n  coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$T\"), PE_DEBUG_SECTION_FLAGS, null_debug_data);\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n  return obj;\n}\n\ninternal int\nlnk_res_string_id_is_before(void *raw_a, void *raw_b)\n{\n  PE_Resource *a = raw_a;\n  PE_Resource *b = raw_b;\n  Assert(a->id.type == COFF_ResourceIDType_String);\n  Assert(b->id.type == COFF_ResourceIDType_String);\n  int is_before = str8_is_before_case_sensitive(&a->id.u.string, &b->id.u.string);\n  return is_before;\n}\n\ninternal int\nlnk_res_number_id_is_before(void *raw_a, void *raw_b)\n{\n  PE_Resource *a = raw_a;\n  PE_Resource *b = raw_b;\n  Assert(a->id.type == COFF_ResourceIDType_Number);\n  Assert(b->id.type == COFF_ResourceIDType_Number);\n  int is_before = u16_is_before(&a->id.u.number, &b->id.u.number);\n  return is_before;\n}\n\ninternal void\nlnk_serialize_pe_resource_tree(COFF_ObjWriter *obj_writer, PE_ResourceDir *root_dir)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  struct Stack {\n    struct Stack          *next;\n    U64                    arr_idx;\n    U64                    res_idx[2];\n    PE_ResourceArray       res_arr[2];\n    COFF_ResourceDirEntry *coff_entry_arr[2];\n  };\n  struct Stack *stack = push_array(scratch.arena, struct Stack, 1);\n  // init stack\n  {\n    PE_Resource *root_wrapper = push_array(scratch.arena, PE_Resource, 1);\n    root_wrapper->id.type     = COFF_ResourceIDType_Number;\n    root_wrapper->id.u.number = 0;\n    root_wrapper->kind        = PE_ResDataKind_DIR;\n    root_wrapper->u.dir       = root_dir;\n\n    COFF_ResourceDirEntry *root_dir = push_array(scratch.arena, COFF_ResourceDirEntry, 1);\n\n    stack->res_arr[0].count = 1;\n    stack->res_arr[0].v     = root_wrapper;\n\n    stack->coff_entry_arr[0] = root_dir;\n    stack->coff_entry_arr[1] = 0;\n  }\n\n  COFF_ObjSection *rsrc1 = coff_obj_writer_push_section(obj_writer, str8_lit(\".rsrc$01\"), PE_RSRC1_SECTION_FLAGS, str8_zero());\n  COFF_ObjSection *rsrc2 = coff_obj_writer_push_section(obj_writer, str8_lit(\".rsrc$02\"), PE_RSRC2_SECTION_FLAGS, str8_zero());\n  \n  for (; stack; ) {\n    for (; stack->arr_idx < ArrayCount(stack->res_arr); stack->arr_idx += 1) {\n      for (; stack->res_idx[stack->arr_idx] < stack->res_arr[stack->arr_idx].count; ) {\n        U64          res_idx = stack->res_idx[stack->arr_idx]++;\n        PE_Resource *res     = &stack->res_arr[stack->arr_idx].v[res_idx];\n\n        {\n          COFF_ResourceDirEntry *coff_entry = &stack->coff_entry_arr[stack->arr_idx][res_idx];\n\n          // assign entry data offset\n          coff_entry->id.data_entry_offset = safe_cast_u32(rsrc1->data.total_size);\n\n          // set directory flag\n          if (res->kind == PE_ResDataKind_DIR) {\n            coff_entry->id.data_entry_offset |= COFF_Resource_SubDirFlag;\n          }\n        }\n\n        switch (res->kind) {\n        case PE_ResDataKind_DIR: {\n          // fill out directory header\n          COFF_ResourceDirTable *dir_header = push_array(obj_writer->arena, COFF_ResourceDirTable, 1);\n          dir_header->characteristics       = res->u.dir->characteristics;\n          dir_header->time_stamp            = res->u.dir->time_stamp;\n          dir_header->major_version         = res->u.dir->major_version;\n          dir_header->minor_version         = res->u.dir->minor_version;\n          dir_header->name_entry_count      = res->u.dir->named_list.count;\n          dir_header->id_entry_count        = res->u.dir->id_list.count;\n\n          // sort input resources\n          PE_ResourceArray named_array = pe_resource_list_to_array(scratch.arena, &res->u.dir->named_list);\n          PE_ResourceArray id_array    = pe_resource_list_to_array(scratch.arena, &res->u.dir->id_list);\n          radsort(named_array.v, named_array.count, lnk_res_string_id_is_before);\n          radsort(id_array.v,    id_array.count,    lnk_res_number_id_is_before);\n\n          // allocate COFF entries\n          COFF_ResourceDirEntry *named_entries = push_array(obj_writer->arena, COFF_ResourceDirEntry, named_array.count);\n          COFF_ResourceDirEntry *id_entries    = push_array(obj_writer->arena, COFF_ResourceDirEntry, id_array.count);\n\n          // push header and entries\n          str8_list_push(obj_writer->arena, &rsrc1->data, str8_struct(dir_header));\n          str8_list_push(obj_writer->arena, &rsrc1->data, str8_array(named_entries, named_array.count));\n          str8_list_push(obj_writer->arena, &rsrc1->data, str8_array(id_entries, id_array.count));\n\n          // fill out named ids\n          for (U64 i = 0; i < named_array.count; i += 1) {\n            PE_Resource            src = named_array.v[i];\n            COFF_ResourceDirEntry *dst = &named_entries[i];\n\n            // append resource name\n            U32     res_name_off = safe_cast_u32(rsrc1->data.total_size);\n            String8 res_name     = coff_resource_string_from_str8(obj_writer->arena, res->id.u.string);\n            str8_list_push(obj_writer->arena, &rsrc1->data, res_name);\n\n            // not sure why high bit has to be turned on here since number id and string id entries are\n            // in separate arrays but windows doesn't treat name offset like string without this bit.\n            dst->name.offset = (1 << 31) | res_name_off;\n          }\n\n          // fill out number ids\n          for (U64 i = 0; i < id_array.count; i += 1) {\n            PE_Resource            src = id_array.v[i];\n            COFF_ResourceDirEntry *dst = &id_entries[i];\n            dst->name.id = src.id.u.number;\n          }\n\n          // fill out sub directory stack frame\n          struct Stack *frame      = push_array(scratch.arena, struct Stack, 1);\n          frame->res_arr[0]        = named_array;\n          frame->res_arr[1]        = id_array;\n          frame->coff_entry_arr[0] = named_entries;\n          frame->coff_entry_arr[1] = id_entries;\n          SLLStackPush(stack, frame);\n        } goto yield; // recurse to sub directory\n\n        case PE_ResDataKind_COFF_RESOURCE: {\n          // fill out resource header\n          COFF_ResourceDataEntry *coff_res = push_array(obj_writer->arena, COFF_ResourceDataEntry, 1);\n          coff_res->data_size              = res->u.coff_res.data.size;\n          coff_res->data_voff              = 0; // relocated\n          coff_res->code_page              = 0; // TODO: whats this for? (lld-link writes zero)\n\n          // emit symbol for resource data\n          U32 resdat_off = safe_cast_u32(rsrc2->data.total_size);\n          COFF_ObjSymbol *resdat = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"resdat\"), resdat_off, rsrc2);\n\n          // emit reloc for 'data_voff'\n          U64 apply_off   = rsrc1->data.total_size + OffsetOf(COFF_ResourceDataEntry, data_voff);\n          U32 apply_off32 = safe_cast_u32(apply_off);\n          coff_obj_writer_section_push_reloc(obj_writer, rsrc1, apply_off32, resdat, COFF_Reloc_X64_Addr32Nb);\n\n          // push resource entry & data\n          str8_list_push(obj_writer->arena, &rsrc1->data, str8_struct(coff_res));\n          str8_list_push(obj_writer->arena, &rsrc2->data, res->u.coff_res.data);\n        } break;\n\n        case PE_ResDataKind_NULL: break;\n\n        // we must not have this resource node here, it is used to represent on-disk version of entry\n        case PE_ResDataKind_COFF_LEAF: InvalidPath;\n        }\n      }\n    }\n    SLLStackPop(stack);\n    yield:;\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nlnk_add_resource_debug_s(COFF_ObjWriter *obj_writer,\n                         String8         obj_path,\n                         String8         cwd_path,\n                         String8         exe_path,\n                         CV_Arch         arch,\n                         String8List     res_file_list,\n                         MD5            *res_hash_array)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n  \n  // init serial for tables\n  String8List string_srl = {0};\n  String8List file_srl   = {0};\n  str8_serial_begin(scratch.arena, &string_srl);\n  str8_serial_begin(scratch.arena, &file_srl);\n  \n  // reserve first byte for null\n  str8_serial_push_u8(scratch.arena, &string_srl, 0);\n  \n  // build file and string table\n  U64 node_idx = 0;\n  for (String8Node *n = res_file_list.first; n != NULL; n = n->next, ++node_idx) {\n    CV_C13Checksum checksum = {0};\n    checksum.name_off = string_srl.total_size;\n    checksum.len = sizeof(MD5);\n    checksum.kind = CV_C13ChecksumKind_MD5;\n    str8_serial_push_struct(scratch.arena, &file_srl, &checksum);\n    str8_serial_push_struct(scratch.arena, &file_srl, &res_hash_array[node_idx]);\n    str8_serial_push_align(scratch.arena, &file_srl, CV_FileCheckSumsAlign);\n    str8_serial_push_cstr(scratch.arena, &string_srl, n->string);\n  }\n  \n  // build symbols\n  String8 obj_data = cv_make_obj_name(scratch.arena, obj_path, 0);\n  \n  String8 exe_name_with_ext = str8_skip_last_slash(exe_path);\n  String8 exe_name_ext = str8_skip_last_dot(exe_name_with_ext);\n  String8 exe_name = str8_chop(exe_name_with_ext, exe_name_ext.size);\n  if (exe_name_ext.size > 0) {\n    exe_name = str8_chop(exe_name, 1);\n  }\n  String8 version_string = push_str8f(scratch.arena, BUILD_TITLE_STRING_LITERAL);\n  String8 comp_data = cv_make_comp3(scratch.arena, CV_Compile3Flag_EC, CV_Language_CVTRES, arch,\n                                    0, 0, 0, 0,\n                                    1, 0, 1, 0,\n                                    version_string);\n  \n  String8List env_list = {0};\n  str8_list_push(scratch.arena, &env_list, str8_lit(\"cwd\"));\n  str8_list_push(scratch.arena, &env_list, cwd_path);\n  str8_list_push(scratch.arena, &env_list, str8_lit(\"exe\"));\n  str8_list_push(scratch.arena, &env_list, exe_path);\n  str8_list_push(scratch.arena, &env_list, str8_lit(\"\"));\n  str8_list_push(scratch.arena, &env_list, str8_lit(\"\"));\n  String8 envblock_data = cv_make_envblock(scratch.arena, env_list);\n  \n  String8 obj_symbol      = cv_make_symbol(scratch.arena, CV_SymKind_OBJNAME,  obj_data);\n  String8 comp_symbol     = cv_make_symbol(scratch.arena, CV_SymKind_COMPILE3, comp_data);\n  String8 envblock_symbol = cv_make_symbol(scratch.arena, CV_SymKind_ENVBLOCK, envblock_data);\n  \n  String8List symbol_srl = {0};\n  str8_serial_begin(scratch.arena, &symbol_srl);\n  str8_serial_push_string(scratch.arena, &symbol_srl, obj_symbol);\n  str8_serial_push_string(scratch.arena, &symbol_srl, comp_symbol);\n  str8_serial_push_string(scratch.arena, &symbol_srl, envblock_symbol);\n  \n  // build code view sub-sections\n  String8List sub_sect_srl = {0};\n  str8_serial_begin(scratch.arena, &sub_sect_srl);\n  CV_Signature sig = CV_Signature_C13;\n  str8_serial_push_struct(scratch.arena, &sub_sect_srl, &sig);\n  \n  CV_C13SubSectionHeader string_header;\n  string_header.kind = CV_C13SubSectionKind_StringTable;\n  string_header.size = string_srl.total_size;\n  str8_serial_push_struct(scratch.arena, &sub_sect_srl, &string_header);\n  str8_serial_push_data_list(scratch.arena, &sub_sect_srl, string_srl.first);\n  str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign);\n  \n  CV_C13SubSectionHeader file_header;\n  file_header.kind = CV_C13SubSectionKind_FileChksms;\n  file_header.size = file_srl.total_size;\n  str8_serial_push_struct(scratch.arena, &sub_sect_srl, &file_header);\n  str8_serial_push_data_list(scratch.arena, &sub_sect_srl, file_srl.first);\n  str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign);\n  \n  CV_C13SubSectionHeader symbol_header;\n  symbol_header.kind = CV_C13SubSectionKind_Symbols;\n  symbol_header.size = symbol_srl.total_size;\n  str8_serial_push_struct(scratch.arena, &sub_sect_srl, &symbol_header);\n  str8_serial_push_data_list(scratch.arena, &sub_sect_srl, symbol_srl.first);\n  str8_serial_push_align(scratch.arena, &sub_sect_srl, CV_C13SubSectionAlign);\n  \n  String8 sub_sect_data = str8_serial_end(obj_writer->arena, &sub_sect_srl);\n  coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS, sub_sect_data);\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal String8\nlnk_make_res_obj(Arena            *arena,\n                 String8List       res_data_list,\n                 String8List       res_path_list,\n                 COFF_MachineType  machine,\n                 U32               time_stamp,\n                 String8           work_dir,\n                 PathStyle         system_path_style,\n                 String8           obj_name)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena,1);\n  \n  Assert(res_data_list.node_count == res_path_list.node_count);\n  \n  // load res files\n  PE_ResourceDir *root_dir       = push_array(scratch.arena, PE_ResourceDir, 1);\n  MD5            *res_hash_array = push_array(scratch.arena, MD5, res_data_list.node_count);\n  U64 node_idx = 0;\n  for (String8Node *node = res_data_list.first; node != 0; node = node->next, node_idx += 1) {\n    res_hash_array[node_idx] = md5_from_data(node->string);\n    pe_resource_dir_push_res_file(scratch.arena, root_dir, node->string);\n  }\n  \n  // convert res paths to stable paths\n  String8List stable_res_file_list = {0};\n  for (String8Node *node = res_path_list.first; node != 0; node = node->next) {\n    String8 stable_res_path = lnk_make_full_path(scratch.arena, system_path_style, work_dir, node->string);\n    str8_list_push(scratch.arena, &stable_res_file_list, stable_res_path);\n  }\n  \n  // convert res to obj\n  OS_ProcessInfo *process_info = os_get_process_info();\n  String8List exe_path_strs = {0};\n  str8_list_push(scratch.arena, &exe_path_strs, process_info->binary_path);\n  String8 exe_path = str8_list_first(&exe_path_strs);\n\n  String8 res_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n\n    // obj features\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"@feat.00\"), COFF_SymStorageClass_Static, MSCRT_FeatFlag_HAS_SAFE_SEH|MSCRT_FeatFlag_UNKNOWN_4);\n\n    // serialize resource tree\n    lnk_serialize_pe_resource_tree(obj_writer, root_dir);\n\n    // push resource debug info\n    lnk_add_resource_debug_s(obj_writer, obj_name, work_dir, exe_path, cv_arch_from_coff_machine(machine), stable_res_file_list, res_hash_array);\n\n    // finalize obj\n    res_obj = coff_obj_writer_serialize(arena, obj_writer);\n\n    coff_obj_writer_release(&obj_writer);\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return res_obj;\n}\n\ninternal String8\nlnk_make_linker_coff_obj(Arena            *arena,\n                         COFF_TimeStamp    time_stamp,\n                         COFF_MachineType  machine,\n                         String8           cwd_path,\n                         String8           exe_path,\n                         String8           pdb_path,\n                         String8           cmd_line,\n                         String8           obj_name)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 debug_symbols = {0};\n  {\n    CV_SymbolList symbol_list = { .signature = CV_Signature_C13 };\n    \n    // S_OBJ\n    String8 obj_data = cv_make_obj_name(scratch.arena, obj_name, 0);\n    cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_OBJNAME, obj_data);\n    \n    // S_COMPILE3\n    String8 comp3_data = lnk_make_linker_compile3(scratch.arena, machine);\n    cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data);\n    \n    // S_ENVBLOCK\n    String8List env_list = {0};\n    str8_list_push(scratch.arena, &env_list, str8_lit(\"cwd\"));\n    str8_list_push(scratch.arena, &env_list, cwd_path);\n    str8_list_push(scratch.arena, &env_list, str8_lit(\"exe\"));\n    str8_list_push(scratch.arena, &env_list, exe_path);\n    str8_list_push(scratch.arena, &env_list, str8_lit(\"pdb\"));\n    str8_list_push(scratch.arena, &env_list, pdb_path);\n    str8_list_push(scratch.arena, &env_list, str8_lit(\"cmd\"));\n    str8_list_push(scratch.arena, &env_list, cmd_line);\n    str8_list_push(scratch.arena, &env_list, str8_lit(\"\"));\n    str8_list_push(scratch.arena, &env_list, str8_lit(\"\"));\n    cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_ENVBLOCK, cv_make_envblock(scratch.arena, env_list));\n\n    // TODO: emit S_SECTION and S_COFFGROUP\n    // TODO: emit S_TRAMPOLINE\n    \n    debug_symbols = lnk_make_debug_s(scratch.arena, symbol_list);\n  }\n\n  String8 obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n    obj = coff_obj_writer_serialize(arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n  \n  scratch_end(scratch);\n  return obj;\n}\n\ninternal String8\nlnk_make_linker_obj(Arena *arena, LNK_Config *config)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(COFF_TimeStamp_Max, config->machine);\n\n  // Emit __ImageBase symbol.\n  //\n  // This symbol is used with REL32 to compute delta from current IP\n  // to the image base. CRT uses this trick to get to HINSTANCE * without\n  // passing it around as a function argument.\n  //\n  //  100h: lea rax, [rip + ffffff00h] ; -100h \n  coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"__ImageBase\"), 0, COFF_SymStorageClass_External);\n  \n  { // load config symbols\n    if (config->machine == COFF_MachineType_X86) {\n      coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_SAFE_SE_HANDLER_TABLE_SYMBOL_NAME), 0, COFF_SymStorageClass_External);\n      coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_SAFE_SE_HANDLER_COUNT_SYMBOL_NAME), 0, COFF_SymStorageClass_External);\n    }\n    \n    // TODO: investigate IMAGE_ENCLAVE_CONFIG 32/64\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_ENCLAVE_CONFIG_SYMBOL_NAME), 0, COFF_SymStorageClass_External);\n    \n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_FLAGS_SYMBOL_NAME)        , 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_FIDS_TABLE_SYMBOL_NAME)   , 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_FIDS_COUNT_SYMBOL_NAME)   , 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_IAT_TABLE_SYMBOL_NAME)    , 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_IAT_COUNT_SYMBOL_NAME)    , 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_LONGJMP_TABLE_SYMBOL_NAME), 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_LONGJMP_COUNT_SYMBOL_NAME), 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_EHCONT_TABLE_SYMBOL_NAME) , 0, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(MSCRT_GUARD_EHCONT_COUNT_SYMBOL_NAME) , 0, COFF_SymStorageClass_External);\n  }\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\nlnk_make_obj_with_undefined_symbols(Arena *arena, String8List symbol_names)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown);\n  for (String8Node *name_n = symbol_names.first; name_n != 0; name_n = name_n->next) {\n    coff_obj_writer_push_symbol_undef(obj_writer, name_n->string);\n  }\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n  return obj;\n}\n\ninternal void\nlnk_input_list_push_node(LNK_InputList *list, LNK_Input *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal void\nlnk_input_list_concat_in_place(LNK_InputList *list, LNK_InputList *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal LNK_InputPtrArray\nlnk_array_from_input_list(Arena *arena, LNK_InputList list)\n{\n  LNK_InputPtrArray result = {0};\n  result.v = push_array(arena, LNK_Input *, list.count);\n  for (LNK_Input *node = list.first; node != 0; node = node->next, result.count += 1) {\n    result.v[result.count] = node;\n  }\n  return result;\n}\n\ninternal LNK_Inputer *\nlnk_inputer_init(void)\n{\n  Arena *arena = arena_alloc();\n  LNK_Inputer *inputer = push_array(arena, LNK_Inputer, 1);\n  inputer->arena            = arena;\n  inputer->objs_ht          = hash_table_init(arena, 0x20000);\n  inputer->libs_ht          = hash_table_init(arena, 0x1000);\n  inputer->missing_lib_ht   = hash_table_init(arena, 0x100);\n  return inputer;\n}\n\ninternal LNK_Input *\nlnk_input_push(Arena *arena, LNK_InputList *list, String8 path, String8 data)\n{\n  LNK_Input *node = push_array(arena, LNK_Input, 1);\n  node->path      = path;\n  node->data      = data;\n  lnk_input_list_push_node(list, node);\n  return node;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_linkgen(Arena *arena, LNK_InputList *list, String8 data, String8 path)\n{\n  LNK_Input *input = lnk_input_push(arena, list, data, path);\n  input->exclude_from_debug_info = 1;\n  return input;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_thin(Arena *arena, LNK_InputList *list, HashTable *ht, String8 full_path)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  LNK_Input *input = hash_table_search_path_raw(ht, full_path);\n  if (input == 0) {\n    input          = lnk_input_push(arena, list, full_path, str8_zero());\n    input->path    = push_str8_copy(arena, full_path);\n    input->is_thin = 1;\n\n    hash_table_push_path_raw(arena, ht, full_path, input);\n  }\n  scratch_end(scratch);\n  return input;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_obj(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, String8 path, String8 data)\n{\n  lnk_log(LNK_Log_InputObj, \"Input Obj: %S\", path);\n  LNK_Input *input = lnk_input_push(inputer->arena, &inputer->new_objs, path, data);\n  input->link_member = link_member;\n  return input;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_obj_linkgen(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, String8 path, String8 data)\n{\n  lnk_log(LNK_Log_InputObj, \"Input Obj: %S\", path);\n  LNK_Input *input = lnk_inputer_push_linkgen(inputer->arena, &inputer->new_objs, path, data);\n  input->link_member = link_member;\n  return input;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_obj_thin(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, String8 path)\n{\n  lnk_log(LNK_Log_InputObj, \"Input Obj: %S\", path);\n  Temp scratch = scratch_begin(0,0);\n  String8    full_path = os_full_path_from_path(scratch.arena, path);\n  LNK_Input *input     = lnk_inputer_push_thin(inputer->arena, &inputer->new_objs, inputer->objs_ht, full_path);\n  input->link_member = link_member;\n  scratch_end(scratch);\n  return input;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_lib(LNK_Inputer *inputer, LNK_InputSourceType input_source, String8 path, String8 data)\n{\n  lnk_log(LNK_Log_InputLib, \"Input Lib: %S\", path);\n  return lnk_input_push(inputer->arena, &inputer->new_libs[input_source], path, data);\n}\n\ninternal LNK_Input *\nlnk_inputer_push_lib_linkgen(LNK_Inputer *inputer, LNK_InputSourceType input_source, String8 path, String8 data)\n{\n  lnk_log(LNK_Log_InputLib, \"Input Lib: %S\", path);\n  return lnk_input_push(inputer->arena, &inputer->new_libs[input_source], path, data);\n}\n\ninternal LNK_Input *\nlnk_input_from_path(HashTable *load_ht, String8 path)\n{\n  LNK_Input *input = hash_table_search_path_raw(load_ht, path);\n  if (input == 0) {\n    Temp scratch = scratch_begin(0, 0);\n    String8 full_path = os_full_path_from_path(scratch.arena, path);\n    input = hash_table_search_path_raw(load_ht, full_path);\n    scratch_end(scratch);\n  }\n  return input;\n}\n\ninternal LNK_Input *\nlnk_inputer_push_lib_thin(LNK_Inputer *inputer, LNK_Config *config, LNK_InputSourceType input_source, String8 path)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_Input *input = 0;\n\n  // default libraries may omit extension\n  if (input_source == LNK_InputSource_Default || input_source == LNK_InputSource_Obj) {\n    if (!str8_ends_with(path, str8_lit(\".lib\"), StringMatchFlag_CaseInsensitive)) {\n      path = push_str8f(scratch.arena, \"%S.lib\", path);\n    }\n    if (lnk_is_lib_disallowed(config, path)) {\n      goto exit;\n    }\n  }\n\n  // was library already loaded?\n  input = hash_table_search_path_raw(inputer->libs_ht, path);\n  if (input) {\n    goto exit;\n  }\n\n  // search disk for library\n  String8 first_match = lnk_find_first_file(scratch.arena, config->lib_dir_list, path);\n\n  // warn about missing library\n  if (first_match.size == 0) {\n    BucketNode *was_reported = hash_table_search_path(inputer->missing_lib_ht, path);\n    if (was_reported == 0) {\n      hash_table_push_path_u64(inputer->arena, inputer->missing_lib_ht, path, 0);\n      lnk_error(LNK_Warning_FileNotFound, \"unable to find library `%S`\", path);\n    }\n    goto exit;\n  }\n\n  // was input with full path already loaded?\n  input = hash_table_search_path_raw(inputer->libs_ht, first_match);\n  if (input) {\n    goto exit;\n  }\n\n  lnk_log(LNK_Log_InputLib, \"Input Lib: %S\", first_match);\n  input = lnk_inputer_push_thin(inputer->arena, &inputer->new_libs[input_source], inputer->libs_ht, first_match);\n\n  // store input path to early-out of file searches for default libs\n  if (!str8_match(first_match, path, StringMatchFlag_CaseInsensitive)) {\n    hash_table_push_path_raw(inputer->arena, inputer->libs_ht, path, input);\n  }\n\n  exit:;\n  scratch_end(scratch);\n  return input;\n}\n\ninternal B32\nlnk_inputer_has_items(LNK_Inputer *inputer)\n{\n  if (inputer->new_objs.count > 0) {\n    return 1;\n  }\n\n  for EachIndex(i, ArrayCount(inputer->new_libs)) {\n    if (inputer->new_libs[i].count > 0) {\n      return 1;\n    }\n  }\n\n  return 0;\n}\n\ninternal LNK_InputPtrArray\nlnk_inputer_flush(Arena *arena, TP_Context *tp, LNK_Inputer *inputer, LNK_IO_Flags io_flags, LNK_InputList *all_inputs, LNK_InputList *new_inputs)\n{\n  ProfBeginFunction();\n\n  Temp scratch = scratch_begin(&arena, 1);\n\n  ProfBegin(\"Gather Thin Inputs\");\n  U64 thin_inputs_count = 0;\n  for (LNK_Input *node = new_inputs->first; node != 0; node = node->next) {\n    if (node->is_thin) {\n      thin_inputs_count += 1;\n    }\n  }\n  LNK_Input **thin_inputs = push_array(scratch.arena, LNK_Input *, thin_inputs_count);\n  U64         thin_idx    = 0;\n  for (LNK_Input *node = new_inputs->first; node != 0; node = node->next) {\n    if (node->is_thin) {\n      thin_inputs[thin_idx++] = node;\n    }\n  }\n  String8Array thin_input_paths = {0};\n  thin_input_paths.count = thin_inputs_count;\n  thin_input_paths.v     = push_array(scratch.arena, String8, thin_inputs_count);\n  for EachIndex(i, thin_inputs_count) {\n    thin_input_paths.v[i] = thin_inputs[i]->path;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Load Inputs From Disk\"); \n  String8Array thin_input_datas  = lnk_read_data_from_file_path_parallel(tp, inputer->arena, io_flags, thin_input_paths);\n  for EachIndex(thin_input_idx, thin_inputs_count) {\n    thin_inputs[thin_input_idx]->has_disk_read_failed = thin_input_datas.v[thin_input_idx].size == 0;\n    thin_inputs[thin_input_idx]->data                 = thin_input_datas.v[thin_input_idx];\n  }\n  ProfEnd();\n\n  ProfBegin(\"Disk Read Check\");\n  for EachIndex(i, thin_inputs_count) {\n    if (thin_inputs[i]->has_disk_read_failed) {\n      lnk_error(LNK_Error_InvalidPath, \"unable to find file \\\"%S\\\"\", thin_inputs[i]->path);\n    }\n  }\n  ProfEnd();\n\n  LNK_InputPtrArray result = lnk_array_from_input_list(arena, *new_inputs);\n\n  lnk_input_list_concat_in_place(all_inputs, new_inputs);\n\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal void\nlnk_lib_member_ref_list_push_node(LNK_LibMemberRefList *list, LNK_LibMemberRef *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal void\nlnk_lib_member_ref_list_concat_in_place_array(LNK_LibMemberRefList *list, LNK_LibMemberRefList *to_concat_arr, U64 count)\n{\n  SLLConcatInPlaceArray(list, to_concat_arr, count);\n}\n\ninternal int\nlnk_lib_member_ref_is_before(void *raw_a, void *raw_b)\n{\n  LNK_LibMemberRef **a = raw_a, **b = raw_b;\n  LNK_Symbol *a_pull_in_ref = (*a)->lib->member_links[(*a)->member_idx];\n  LNK_Symbol *b_pull_in_ref = (*b)->lib->member_links[(*b)->member_idx];\n  return lnk_symbol_is_before(a_pull_in_ref, b_pull_in_ref);\n}\n\ninternal LNK_LibMemberRef **\nlnk_array_from_lib_member_list(Arena *arena, LNK_LibMemberRefList list)\n{\n  LNK_LibMemberRef **result = push_array(arena, LNK_LibMemberRef *, list.count);\n  U64 idx = 0;\n  for (LNK_LibMemberRef *node = list.first; node != 0; node = node->next, idx += 1) {\n    result[idx] = node;\n  }\n  return result;\n}\n\ninternal LNK_ObjNode *\nlnk_load_objs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link, U64 *objs_count_out)\n{\n  ProfBeginV(\"Load Objs [Count %llu]\", inputer->new_objs.count);\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  // load obj inputer from disk\n  LNK_InputPtrArray new_input_objs = lnk_inputer_flush(arena->v[0], tp, inputer, config->io_flags, &inputer->objs, &inputer->new_objs);\n\n  if (lnk_get_log_status(LNK_Log_InputObj) && new_input_objs.count) {\n    U64 input_size = 0;\n    for EachIndex(i, new_input_objs.count) { input_size += new_input_objs.v[i]->data.size; }\n    lnk_log(LNK_Log_InputObj, \"[ Obj Input Size %M ]\", input_size);\n  }\n\n  LNK_ObjNode *new_objs = lnk_obj_from_input_many(tp, arena, config->machine, new_input_objs.count, new_input_objs.v);\n\n  // if machine type was unspecified on the command line, derive it from obj file\n  if (config->machine == COFF_MachineType_Unknown) {\n    for EachIndex(obj_idx, new_input_objs.count) {\n      if (new_objs[obj_idx].data.header.machine != COFF_MachineType_Unknown) {\n        config->machine = new_objs[obj_idx].data.header.machine;\n        break;\n      }\n    }\n  }\n\n  ProfBegin(\"Apply Directives\");\n  for EachIndex(obj_idx, new_input_objs.count) {\n    LNK_Obj           *obj            = &new_objs[obj_idx].data;\n    String8List        raw_directives = lnk_raw_directives_from_obj(scratch.arena, obj);\n    LNK_DirectiveInfo  directive_info = lnk_directive_info_from_raw_directives(scratch.arena, obj, raw_directives);\n    for EachIndex(i, ArrayCount(directive_info.v)) {\n      for (LNK_Directive *dir = directive_info.v[i].first; dir != 0; dir = dir->next) {\n        lnk_apply_cmd_option_to_config(config, dir->id, dir->value_list, obj);\n      }\n    }\n  }\n  ProfEnd();\n\n  if (objs_count_out) {\n    *objs_count_out = new_input_objs.count;\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n  return new_objs;\n}\n\ninternal void\nlnk_load_libs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_Link *link)\n{\n  for EachIndex(input_source, LNK_InputSource_Count) {\n    ProfBegin(\"Input Libs [Count %llu]\", inputer->new_libs[input_source].count);\n\n    LNK_InputPtrArray new_input_libs = lnk_inputer_flush(arena->v[0], tp, inputer, config->io_flags, &inputer->libs, &inputer->new_libs[input_source]);\n\n    if (lnk_get_log_status(LNK_Log_InputLib) && new_input_libs.count) {\n      U64 input_size = 0;\n      for EachIndex(i, new_input_libs.count) { input_size += new_input_libs.v[i]->data.size; }\n      lnk_log(LNK_Log_InputObj, \"[ Lib Input Size %M ]\", input_size);\n    }\n\n    lnk_lib_list_push_parallel(tp, arena, &link->libs, new_input_libs.count, new_input_libs.v);\n\n    ProfEnd();\n  }\n}\n\ninternal void\nlnk_load_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  U64 obj_id_base = link->objs.count;\n\n  U64          objs_count  = 0;\n  LNK_ObjNode *objs        = lnk_load_objs(tp, arena, config, inputer, symtab, link, &objs_count);\n  lnk_obj_list_push_node_many(&link->objs, objs_count, objs);\n  \n  // if delay load DLLs are present, include delay load helper symbol\n  if (config->machine != COFF_MachineType_Unknown && config->delay_load_helper_name.size == 0 && config->delay_load_dll_list.node_count) {\n    config->delay_load_helper_name = mscrt_delay_load_helper_name_from_machine(config->machine);\n    if (config->delay_load_helper_name.size) {\n      lnk_include_symbol(config, config->delay_load_helper_name, 0);\n    }\n  }\n\n  {\n    ProfBegin(\"Process /INCLUDE\");\n\n    // group include symbols by obj\n    HashTable *ht = hash_table_init(scratch.arena, 64);\n    for (; *link->last_include; link->last_include = &(*link->last_include)->next) {\n      LNK_IncludeSymbol *include_symbol = &(*link->last_include)->v;\n\n      // skip, include symbol is already in the global symbol table\n      if (lnk_symbol_table_search(symtab, include_symbol->name)) {\n        continue;\n      }\n\n      // was obj already seen?\n      String8List *include_name_list = hash_table_search_raw_raw(ht, include_symbol->obj);\n\n      if (include_name_list == 0) {\n        // push entry for new obj\n        include_name_list = push_array(scratch.arena, String8List, 1);\n        hash_table_push_raw_raw(scratch.arena, ht, include_symbol->obj, include_name_list);\n      }\n\n      // append include symbol to obj's name list\n      str8_list_push(scratch.arena, include_name_list, include_symbol->name);\n    }\n\n    LNK_Obj     **objs_with_includes = keys_from_hash_table_raw(scratch.arena, ht);\n    String8List **include_names      = values_from_hash_table_raw(scratch.arena, ht);\n    for EachIndex(i, ht->count) {\n      LNK_Obj *obj_with_includes = objs_with_includes[i];\n      String8  include_obj_path  = obj_with_includes ? obj_with_includes->path : str8_lit(\"RADLINK\");\n      String8  include_obj_data  = lnk_make_obj_with_undefined_symbols(arena->v[0], *include_names[i]);\n      lnk_inputer_push_obj_linkgen(inputer, obj_with_includes ? obj_with_includes->link_member : 0, include_obj_path, include_obj_data);\n\n      U64          include_obj_count = 0;\n      LNK_ObjNode *include_obj       = lnk_load_objs(tp, arena, config, inputer, symtab, link, &include_obj_count);\n      AssertAlways(include_obj_count == 1);\n\n      if (obj_with_includes) {\n        DLLInsert(link->objs.first, link->objs.last, obj_with_includes->node, include_obj);\n        link->objs.count += 1;\n      } else {\n        lnk_obj_list_push_node(&link->objs, include_obj);\n      }\n    }\n\n    ProfEnd();\n  }\n\n  // finalize input indices on new objs and push external symbols to the symbol table\n  {\n    U64 node_idx = 0;\n    for (LNK_ObjNode **n = link->last_symbol_input; *n; n = &(*n)->next, node_idx += 1) {\n      (*n)->data.input_idx = obj_id_base + node_idx;\n    }\n\n    U64       new_objs_count = node_idx;\n    LNK_Obj **new_objs       = push_array(scratch.arena, LNK_Obj *, node_idx);\n    node_idx = 0;\n    for (; *link->last_symbol_input; link->last_symbol_input = &(*link->last_symbol_input)->next, node_idx += 1) {\n      new_objs[node_idx] = &(*link->last_symbol_input)->data;\n    }\n\n    lnk_push_obj_symbols(tp, arena, symtab, new_objs_count, new_objs);\n  }\n\n  // input default libraries\n  for (; *link->last_default_lib; link->last_default_lib = &(*link->last_default_lib)->next) {\n    lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Default, (*link->last_default_lib)->string);\n  }\n\n  // input libraries referenced in objs\n  for (; *link->last_obj_lib; link->last_obj_lib = &(*link->last_obj_lib)->next) {\n    lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_Obj, (*link->last_obj_lib)->string);\n  }\n\n  // load new libs\n  lnk_load_libs(tp, arena, config, inputer, link);\n\n  // resolve entry point\n  if (link->try_to_resolve_entry_point) {\n    B32 is_entry_point_name_inferred = config->entry_point_name.size == 0;\n\n    // loop over all possible subsystems and entry point names and pick\n    // subsystem that has a defined entry point symbol\n    if (config->entry_point_name.size == 0) {\n      PE_WindowsSubsystem  subsys_first       = config->subsystem;\n      PE_WindowsSubsystem  subsys_last        = config->subsystem == PE_WindowsSubsystem_UNKNOWN ? PE_WindowsSubsystem_COUNT : config->subsystem+1;\n      LNK_Symbol          *entry_point_symbol = 0;\n      for (U64 subsys_idx = subsys_first; subsys_idx < subsys_last; subsys_idx += 1) {\n        String8Array entry_points = pe_get_entry_point_names(config->machine, (PE_WindowsSubsystem)subsys_idx, config->file_characteristics);\n        for EachIndex(i, entry_points.count) {\n          LNK_Symbol *symbol = lnk_symbol_table_search(symtab, entry_points.v[i]);\n          if (symbol) {\n            config->subsystem        = subsys_idx;\n            config->entry_point_name = entry_points.v[i];\n            goto found_entry_and_subsystem;\n          }\n        }\n      }\n      found_entry_and_subsystem:;\n    }\n\n    // search for entry point in libs\n    if (config->entry_point_name.size == 0 && config->subsystem != PE_WindowsSubsystem_UNKNOWN) {\n      String8Array entry_points = pe_get_entry_point_names(config->machine, config->subsystem, config->file_characteristics);\n      for EachIndex(entry_idx, entry_points.count) {\n        for (LNK_LibNode *lib_n = link->libs.first; lib_n != 0; lib_n = lib_n->next) {\n          if (lnk_search_lib(&lib_n->data, entry_points.v[entry_idx], 0)) {\n            config->entry_point_name = entry_points.v[entry_idx];\n            goto found_entry_in_libs;\n          }\n        }\n      }\n      found_entry_in_libs:;\n    }\n\n    // infer subsystem from entry point name\n    if (config->entry_point_name.size != 0 && config->subsystem == PE_WindowsSubsystem_UNKNOWN) {\n      for EachIndex(subsys_idx, PE_WindowsSubsystem_COUNT) {\n        String8Array entry_points = pe_get_entry_point_names(config->machine, subsys_idx, config->file_characteristics);\n        for EachIndex(i, entry_points.count) {\n          if (str8_match(entry_points.v[i], config->entry_point_name, 0)) {\n            config->subsystem = subsys_idx;\n            goto subsystem_inferred_from_entry;\n          }\n        }\n      }\n      subsystem_inferred_from_entry:;\n    }\n\n    // do we have an entry point name?\n    if (config->entry_point_name.size) {\n      if (is_entry_point_name_inferred) {\n        // redirect user entry to appropriate CRT entry\n        String8 crt_entry_point_name = msvcrt_ctr_entry_from_user_entry(config->entry_point_name);\n        config->entry_point_name = crt_entry_point_name.size ? crt_entry_point_name : config->entry_point_name;\n      }\n\n      // generate undefined symbol for entry point\n      lnk_include_symbol(config, config->entry_point_name, 0);\n\n      // do we have a subsystem?\n      if (config->subsystem != PE_WindowsSubsystem_UNKNOWN) {\n        // if subsystem version not specified set default values\n        if (config->subsystem_ver.major == 0 && config->subsystem_ver.minor == 0) {\n          config->subsystem_ver = lnk_get_default_subsystem_version(config->subsystem, config->machine);\n        }\n\n        // check subsystem version against allowed min version\n        Version min_subsystem_ver = lnk_get_min_subsystem_version(config->subsystem, config->machine);\n        if (version_compar(config->subsystem_ver, min_subsystem_ver) < 0) {\n          lnk_error(LNK_Error_Cmdl, \"subsystem version %I64u.%I64u can't be lower than %I64u.%I64u\", \n                    config->subsystem_ver.major, config->subsystem_ver.minor, min_subsystem_ver.major, min_subsystem_ver.minor);\n        }\n\n        // by default terminal server is enabled for windows and console applications\n        if (~config->flags & LNK_ConfigFlag_NoTsAware && ~config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) {\n          if (config->subsystem == PE_WindowsSubsystem_WINDOWS_GUI || config->subsystem == PE_WindowsSubsystem_WINDOWS_CUI) {\n            config->dll_characteristics |= PE_DllCharacteristic_TERMINAL_SERVER_AWARE;\n          }\n        }\n\n        // entry point found!\n        link->try_to_resolve_entry_point = 0;\n      } else {\n        lnk_error(LNK_Error_NoSubsystem, \"unknown subsystem, please use /SUBSYSTEM to set subsytem type you need\");\n      }\n    }\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nlnk_queue_lib_member(Arena *arena, LNK_LibMemberRefList *queued_members, LNK_Symbol *link_symbol, LNK_Lib *lib, U32 member_idx)\n{\n  B32 was_linked = lnk_lib_set_link_symbol(lib, member_idx, link_symbol);\n  if (was_linked) {\n    LNK_LibMemberRef *member_ref = push_array(arena, LNK_LibMemberRef, 1);\n    member_ref->lib        = lib;\n    member_ref->member_idx = member_idx;\n    lnk_lib_member_ref_list_push_node(queued_members, member_ref);\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_search_lib_task)\n{\n  LNK_SearchLibTask    *task             = raw_task;\n  LNK_Lib              *lib              = task->lib;\n  LNK_SymbolTable      *symtab           = task->symtab;\n  B32                   search_anti_deps = task->search_anti_deps;\n  LNK_LibMemberRefList *member_ref_list  = &task->member_ref_lists[task_id];\n\n  for EachNode(c, LNK_SymbolHashTrieChunk, symtab->search_chunks[task_id].first) {\n    for EachIndex(i, c->count) {\n      LNK_Symbol *symbol = c->v[i].symbol;\n\n      LNK_ObjSymbolRef           symbol_ref    = lnk_ref_from_symbol(symbol);\n      COFF_ParsedSymbol          symbol_parsed = lnk_parsed_from_symbol(symbol);\n      COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed);\n      if (symbol_interp == COFF_SymbolValueInterp_Undefined) {\n        U32 member_idx;\n        if (lnk_search_lib(lib, symbol->name, &member_idx)) {\n          lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx);\n        }\n      } else if (symbol_interp == COFF_SymbolValueInterp_Weak) {\n        COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(symbol_parsed, symbol_ref.obj->header.is_big_obj);\n        if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) {\n          U32 member_idx;\n          if (lnk_search_lib(lib, symbol->name, &member_idx)) {\n            lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx);\n          }\n        } else if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) {\n          if (search_anti_deps) {\n            LNK_ObjSymbolRef dep_symbol = {0};\n            if (lnk_resolve_weak_symbol(symtab, symbol_ref, &dep_symbol)) {\n              COFF_ParsedSymbol          dep_parsed = lnk_parsed_symbol_from_coff_symbol_idx(dep_symbol.obj, dep_symbol.symbol_idx);\n              COFF_SymbolValueInterpType dep_interp = coff_interp_from_parsed_symbol(dep_parsed);\n              if (dep_interp == COFF_SymbolValueInterp_Weak) {\n                U32 member_idx;\n                if (lnk_search_lib(lib, symbol_parsed.name, &member_idx)) {\n                  lnk_queue_lib_member(arena, member_ref_list, symbol, lib, member_idx);\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n  }\n}\n\ninternal void\nlnk_link_inputs(TP_Context      *tp,\n                TP_Arena         *arena,\n                LNK_Config       *config,\n                LNK_Inputer      *inputer,\n                LNK_SymbolTable  *symtab,\n                LNK_Link         *link)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  LNK_LibMemberRefList *member_ref_lists = push_array(scratch.arena, LNK_LibMemberRefList, tp->worker_count);\n  B32                   search_anti_deps = 0;\n  for (U64 resolved_members_count = 0; ; resolved_members_count = 0) {\n    lnk_load_inputs(tp, arena, config, inputer, symtab, link);\n\n    for EachNode(lib_n, LNK_LibNode, link->libs.first) {\n      LNK_Lib *lib = &lib_n->data;\n\n      ProfBeginV(\"Search %S\", str8_skip_last_slash(lib->path));\n      do {\n        lnk_load_inputs(tp, arena, config, inputer, symtab, link);\n\n        // search symbols in lib\n        MemoryZeroTyped(member_ref_lists, tp->worker_count);\n        tp_for_parallel(tp, arena, tp->worker_count, lnk_search_lib_task, &(LNK_SearchLibTask){ .search_anti_deps = search_anti_deps, .lib = lib, .symtab = symtab, .member_ref_lists = member_ref_lists });\n\n        LNK_LibMemberRefList queued_members = {0};\n        lnk_lib_member_ref_list_concat_in_place_array(&queued_members, member_ref_lists, tp->worker_count);\n\n        // sort library member refs to match the order of their appearance in obj symbol tables\n        LNK_LibMemberRef **member_refs = lnk_array_from_lib_member_list(scratch.arena, queued_members);\n        //qsort(member_refs, queued_members.count, sizeof(member_refs[0]), lnk_lib_member_ref_compar);\n        radsort(member_refs, queued_members.count, lnk_lib_member_ref_is_before);\n\n        if (queued_members.count) {\n          lnk_log(LNK_Log_Links, \"Searching %S:\", lib_n->data.path);\n\n          for EachIndex(i, queued_members.count) {\n            Temp temp = temp_begin(scratch.arena);\n\n            LNK_LibMemberRef *member_ref  = member_refs[i];\n            LNK_Lib          *lib         = member_ref->lib;\n            LNK_Symbol       *link_symbol = lib->member_links[member_ref->member_idx];\n\n            COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_ref->member_idx]);\n            COFF_DataType      member_type = coff_data_type_from_data(member_info.data);\n            String8            member_name = coff_decode_member_name(lib->long_names, member_info.header.name);\n\n            U64                refs_count = 0;\n            LNK_ObjSymbolRef **refs       = lnk_ref_from_symbol_many(temp.arena, link_symbol, &refs_count);\n            lnk_log(LNK_Log_Links, \"\\tFound %S in %S\", link_symbol->name, str8_skip_last_slash(member_name));\n            for EachIndex(i, refs_count) {\n              lnk_log(LNK_Log_Links, \"\\t\\tReferenced in %S\", lnk_loc_from_obj(temp.arena, refs[i]->obj));\n            }\n\n            temp_end(temp);\n          }\n        }\n\n        // push inputs for lib member refs\n        for EachIndex(i, queued_members.count) {\n          LNK_LibMemberRef *member_ref = member_refs[i];\n          U64               member_idx = member_ref->member_idx;\n\n          // parse member info\n          COFF_ArchiveMember member_info = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_idx]);\n          COFF_DataType      member_type = coff_data_type_from_data(member_info.data);\n          String8            member_name = coff_decode_member_name(lib->long_names, member_info.header.name);\n\n          switch (member_type) {\n          case COFF_DataType_Import: {\n            LNK_Symbol *link_symbol = lib->member_links[member_idx];\n\n            LNK_Symbol *import_symbols[2] = {0};\n            if (str8_starts_with(link_symbol->name, str8_lit(\"__imp_\"))) {\n              import_symbols[0] = link_symbol;\n              import_symbols[1] = lnk_symbol_table_search(symtab, str8_skip(link_symbol->name, str8_lit(\"__imp_\").size));\n            } else {\n              Temp temp = temp_begin(scratch.arena);\n              String8 imp_name = push_str8f(temp.arena, \"__imp_%S\", link_symbol->name);\n              import_symbols[0] = lnk_symbol_table_search(symtab, imp_name);\n              import_symbols[1] = link_symbol;\n              temp_end(temp);\n            }\n\n            for EachIndex(i, ArrayCount(import_symbols)) {\n              LNK_Symbol *import_symbol = import_symbols[i];\n              if (import_symbol == 0) { continue; }\n\n              LNK_Symbol *import_stub = lnk_symbol_table_search(symtab, str8_lit(LNK_IMPORT_STUB));\n\n              // same import symbol must never be queued more than once, if it is, there is a bug in the link set logic\n              AssertAlways(import_symbol->refs != import_stub->refs);\n\n              // replace the import symbol with a stub, which is later replaced with the real import symbol once import obj is ready\n              import_symbol->refs = import_stub->refs;\n            }\n\n            // push import member for import obj generation\n            lnk_lib_member_ref_list_push_node(&link->imports, member_ref);\n          } break;\n          case COFF_DataType_BigObj:\n          case COFF_DataType_Obj: {\n            if (lib->type == COFF_Archive_Thin) {\n              // obj path in thin archive is relative to the directory with lib\n              String8List obj_path_list = {0};\n              str8_list_push(scratch.arena, &obj_path_list, str8_chop_last_slash(lib->path));\n              str8_list_push(scratch.arena, &obj_path_list, member_name);\n              String8 obj_path = str8_path_list_join_by_style(inputer->arena, &obj_path_list, config->path_style);\n\n              lnk_inputer_push_obj_thin(inputer, member_ref, obj_path);\n            } else {\n              lnk_inputer_push_obj(inputer, member_ref, member_name, member_info.data);\n            }\n          } break;\n          case COFF_DataType_Null: break;\n          default: { InvalidPath; } break;\n          }\n        }\n\n        resolved_members_count += queued_members.count;\n      } while (lnk_inputer_has_items(inputer));\n      ProfEnd();\n    }\n\n    if (resolved_members_count == 0) {\n      search_anti_deps = 0;\n\n      // replace undefined symbols that have an alternate name with a weak symbol\n      for (LNK_AltNameNode *alt_name_n = config->alt_name_list.first; alt_name_n != 0; alt_name_n = alt_name_n->next) {\n        LNK_SymbolHashTrie *symbol_ht = lnk_symbol_table_search_(symtab, alt_name_n->v.from);\n        if (symbol_ht) {\n          COFF_SymbolValueInterpType interp = lnk_interp_from_symbol(symbol_ht->symbol);\n          if (interp == COFF_SymbolValueInterp_Undefined) {\n            // clear out slot so weak symbol can replace undefined symbol (general rule is\n            // weak symbol is not allowed to replace undefined)\n            LNK_Symbol *undef_symbol = symbol_ht->symbol;\n            symbol_ht->symbol = 0;\n\n            // make obj with alternamte name symbol\n            String8 alt_name_obj_data;\n            {\n              COFF_ObjWriter *obj_writer  = coff_obj_writer_alloc(0, COFF_MachineType_Unknown);\n              COFF_ObjSymbol *from_symbol = coff_obj_writer_push_symbol_weak(obj_writer, alt_name_n->v.from, COFF_WeakExt_SearchLibrary, 0);\n              COFF_ObjSymbol *to_symbol   = coff_obj_writer_push_symbol_weak(obj_writer, alt_name_n->v.to,   COFF_WeakExt_AntiDependency, from_symbol);\n              coff_obj_writer_set_default_symbol(from_symbol, to_symbol);\n              alt_name_obj_data = coff_obj_writer_serialize(arena->v[0], obj_writer);\n              coff_obj_writer_release(&obj_writer);\n            }\n\n            LNK_Obj *obj_with_alt_name      = alt_name_n->v.obj;\n            String8  obj_with_alt_name_path = obj_with_alt_name ? obj_with_alt_name->path : str8_lit(\"RADLINK\");\n            lnk_inputer_push_obj_linkgen(inputer, obj_with_alt_name ? obj_with_alt_name->link_member : 0, obj_with_alt_name_path, alt_name_obj_data);\n\n            search_anti_deps = 1;\n          }\n        }\n      }\n\n      resolved_members_count = lnk_inputer_has_items(inputer);\n    }\n\n    if (resolved_members_count == 0) { break; }\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal LNK_Link *\nlnk_link_image(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  //\n  // init link context\n  //\n  LNK_Link *link = push_array(arena->v[0], LNK_Link, 1);\n  link->last_symbol_input          = &link->objs.first;\n  link->last_include               = &config->include_symbol_list.first;\n  link->last_default_lib           = &config->input_default_lib_list.first;\n  link->last_obj_lib               = &config->input_obj_lib_list.first;\n  link->last_cmd_lib               = &config->input_list[LNK_Input_Lib].first;\n  link->try_to_resolve_entry_point = 1;\n\n  // input :null_obj\n  String8 null_obj = lnk_make_null_obj(inputer->arena);\n  lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Null *\"), null_obj);\n\n  // input objs on command line\n  for (String8Node *obj_path = config->input_list[LNK_Input_Obj].first; obj_path != 0; obj_path = obj_path->next) {\n    lnk_inputer_push_obj_thin(inputer, 0, obj_path->string);\n  }\n\n  // input libs from command line\n  for (; *link->last_cmd_lib; link->last_cmd_lib = &(*link->last_cmd_lib)->next) {\n    lnk_inputer_push_lib_thin(inputer, config, LNK_InputSource_CmdLine, (*link->last_cmd_lib)->string);\n  }\n\n  // link inputer\n  lnk_link_inputs(tp, arena, config, inputer, symtab, link);\n\n  // TODO: need to figure out under what condition to include load config\n  //lnk_include_symbol(config, str8_lit(MSCRT_LOAD_CONFIG_SYMBOL_NAME), 0);\n\n  {\n    ProfBegin(\"Push Linker Symbols\");\n    String8 linker_symbols_obj = lnk_make_linker_obj(arena->v[0], config);\n    lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Linker Symbols *\"), linker_symbols_obj);\n    ProfEnd();\n  }\n\n  //\n  // make imports\n  //\n  {\n    HashTable   *static_imports_ht  = hash_table_init(scratch.arena, 0x1000);\n    HashTable   *delayed_imports_ht = hash_table_init(scratch.arena, 0x1000);\n    String8List  delayed_dll_names  = {0};\n    String8List  static_dll_names   = {0};\n\n    for EachNode(member_ref, LNK_LibMemberRef, link->imports.first) {\n      LNK_Lib    *lib         = member_ref->lib;\n      U64         member_idx  = member_ref->member_idx;\n      LNK_Symbol *link_symbol = lib->member_links[member_idx];\n\n      COFF_ArchiveMember             member_info   = coff_archive_member_from_offset(lib->data, lib->member_offsets[member_idx]);\n      COFF_DataType                  member_type   = coff_data_type_from_data(member_info.data);\n      String8                        member_name   = coff_decode_member_name(lib->long_names, member_info.header.name);\n      COFF_ParsedArchiveImportHeader import_header = coff_archive_import_from_data(member_info.data);\n\n      // import machine compat check\n      if (import_header.machine != config->machine) {\n        LNK_ObjSymbolRef ref = lnk_ref_from_symbol(link_symbol);\n        lnk_error_obj(LNK_Error_IncompatibleMachine,\n                      ref.obj,\n                      \"symbol %S pulls-in import from %S with an incompatible machine %S (expected machine %S)\",\n                      link_symbol->name,\n                      str8_chop_last_slash(lib->path),\n                      coff_string_from_machine_type(import_header.machine),\n                      coff_string_from_machine_type(config->machine));\n        break;\n      }\n\n      // find DLL with import symbols\n      B32                is_delay_load  = lnk_is_dll_delay_load(config, import_header.dll_name);\n      String8List       *dll_names      = is_delay_load ? &delayed_dll_names : &static_dll_names;\n      HashTable         *imports_ht     = is_delay_load ? delayed_imports_ht : static_imports_ht;\n      PE_MakeImportList *import_symbols = hash_table_search_path_raw(imports_ht, import_header.dll_name);\n\n      // create record for a first time-DLL\n      if (import_symbols == 0) {\n        import_symbols = push_array(scratch.arena, PE_MakeImportList, 1);\n        str8_list_push(scratch.arena, dll_names, import_header.dll_name);\n        hash_table_push_path_raw(scratch.arena, imports_ht, import_header.dll_name, import_symbols);\n      }\n\n      B32 make_jump_thunk = 1;\n      if (str8_starts_with(link_symbol->name, str8_lit(\"__imp_\"))) {\n        LNK_Symbol *thunk_symbol = lnk_symbol_table_search(symtab, str8_skip(link_symbol->name, str8_lit(\"__imp_\").size));\n        make_jump_thunk = thunk_symbol != 0;\n      }\n\n      // push make import info\n      pe_make_import_header_list_push(scratch.arena, import_symbols, (PE_MakeImport){ .header = member_info.data, .make_jump_thunk = make_jump_thunk });\n    }\n    AssertAlways(delayed_dll_names.node_count == delayed_imports_ht->count);\n    AssertAlways(static_dll_names.node_count == static_imports_ht->count);\n\n    // make and input delayed imports\n    if (delayed_imports_ht->count) {\n      ProfBegin(\"Build Delay Import Table\");\n\n      COFF_TimeStamp time_stamp = COFF_TimeStamp_Max;\n      B32            emit_biat  = config->import_table_emit_biat == LNK_SwitchState_Yes;\n      B32            emit_uiat  = config->import_table_emit_uiat == LNK_SwitchState_Yes;\n\n      for (String8Node *dll_name_n = delayed_dll_names.first; dll_name_n != 0; dll_name_n = dll_name_n->next) {\n        PE_MakeImportList *imports              = hash_table_search_path_raw(delayed_imports_ht, dll_name_n->string);\n        String8                  import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string);\n        String8                  import_obj           = pe_make_import_dll_obj_delayed(arena->v[0], time_stamp, config->machine, dll_name_n->string, config->delay_load_helper_name, import_debug_symbols, *imports, emit_biat, emit_uiat);\n        lnk_inputer_push_obj(inputer, 0, dll_name_n->string, import_obj);\n      }\n\n      String8 linker_debug_symbols = lnk_make_linker_debug_symbols(arena->v[0], config->machine);\n      String8 null_desc_obj        = pe_make_null_import_descriptor_delayed(arena->v[0], time_stamp, config->machine, linker_debug_symbols);\n      String8 null_thunk_obj       = pe_make_null_thunk_data_obj_delayed(arena->v[0], lnk_get_image_name(config), time_stamp, config->machine, linker_debug_symbols);\n      lnk_inputer_push_obj(inputer, 0, str8_lit(\"* Delayed Null Import Descriptor *\"), null_desc_obj);\n      lnk_inputer_push_obj(inputer, 0, str8_lit(\"* Delayed Null Thunk Data *\"),        null_thunk_obj);\n\n      ProfEnd();\n    }\n\n    // make and input static imports\n    if (static_imports_ht->count) {\n      ProfBegin(\"Build Static Import Table\");\n\n      COFF_TimeStamp time_stamp = COFF_TimeStamp_Max;\n\n      for (String8Node *dll_name_n = static_dll_names.first; dll_name_n != 0; dll_name_n = dll_name_n->next) {\n        PE_MakeImportList *imports              = hash_table_search_path_raw(static_imports_ht, dll_name_n->string);\n        String8                  import_debug_symbols = lnk_make_dll_import_debug_symbols(scratch.arena, config->machine, dll_name_n->string);\n        String8                  import_obj           = pe_make_import_dll_obj_static(arena->v[0], time_stamp, config->machine, dll_name_n->string, import_debug_symbols, *imports);\n        lnk_inputer_push_obj(inputer, 0, dll_name_n->string, import_obj);\n      }\n\n      String8 linker_debug_symbols = lnk_make_linker_debug_symbols(scratch.arena, config->machine);\n      String8 null_desc_obj        = pe_make_null_import_descriptor_obj(arena->v[0], time_stamp, config->machine, linker_debug_symbols);\n      String8 null_thunk_obj       = pe_make_null_thunk_data_obj(arena->v[0], lnk_get_image_name(config), time_stamp, config->machine, linker_debug_symbols);\n      lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Null Import Descriptor *\"), null_desc_obj);\n      lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Null Thunk Data *\"),        null_thunk_obj);\n\n      ProfEnd();\n    }\n    \n    // warn about unused delayloads\n    if (config->flags & LNK_ConfigFlag_CheckUnusedDelayLoadDll) {\n      for (String8Node *dll_name_n = config->delay_load_dll_list.first; dll_name_n != 0; dll_name_n = dll_name_n->next) {\n        if (!hash_table_search_path_raw(delayed_imports_ht, dll_name_n->string)) {\n          lnk_error(LNK_Warning_UnusedDelayLoadDll, \"/DELAYLOAD: %S found no imports\", dll_name_n->string);\n        }\n      }\n    }\n  }\n\n  if (config->export_symbol_list.count) {\n    ProfBegin(\"Build Export Table\");\n\n    PE_ExportParseList resolved_exports = {0};\n    for (PE_ExportParseNode *exp_n = config->export_symbol_list.first, *exp_n_next; exp_n != 0; exp_n = exp_n_next) {\n      exp_n_next = exp_n->next;\n      PE_ExportParse *exp = &exp_n->data;\n\n      if (str8_match(exp->name, config->entry_point_name, 0)) {\n        lnk_error_with_loc(LNK_Warning_TryingToExportEntryPoint, exp->obj_path, exp->lib_path, \"exported entry point \\\"%S\\\"\", exp->name);\n      }\n      if (str8_match(exp->alias, config->entry_point_name, 0)) {\n        lnk_error_with_loc(LNK_Warning_TryingToExportEntryPoint, exp->obj_path, exp->lib_path, \"alias exports entry point \\\"%S=%S\\\"\", exp->name, exp->alias);\n        continue;\n      }\n\n      if (!exp->is_forwarder) {\n        // filter out unresolved exports\n        LNK_Symbol *symbol = lnk_symbol_table_search(symtab, exp_n->data.name);\n        if (symbol == 0) {\n          lnk_error_with_loc(LNK_Warning_IllExport, exp->obj_path, exp->lib_path, \"unresolved export symbol %S\\n\", exp->name);\n          continue;\n        }\n      }\n\n      // push resolved export\n      pe_export_parse_list_push_node(&resolved_exports, exp_n);\n    }\n\n    PE_FinalizedExports finalized_exports = pe_finalize_export_list(scratch.arena, resolved_exports);\n    String8             edata_obj         = pe_make_edata_obj(arena->v[0], str8_skip_last_slash(config->image_name), COFF_TimeStamp_Max, config->machine, finalized_exports);\n    lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Exports *\"), edata_obj);\n\n    ProfEnd();\n  }\n\n  {\n    String8List res_data_list = {0};\n    String8List res_path_list = {0};\n    \n    // do we have manifest deps passed through pragma alone?\n    LNK_ManifestOpt manifest_opt = config->manifest_opt;\n    if (config->manifest_dependency_list.node_count > 0 && manifest_opt == LNK_ManifestOpt_Null) {\n      manifest_opt = LNK_ManifestOpt_Embed;\n    }\n\n    switch (manifest_opt) {\n    case LNK_ManifestOpt_Embed: {\n      ProfBegin(\"Embed Manifest\");\n      // TODO: currently we convert manifest to res and parse res again, this unnecessary instead push manifest \n      // resource to the tree directly\n      String8 manifest_data = lnk_manifest_from_inputs(scratch.arena, config->io_flags, config->mt_path, config->manifest_name, config->manifest_uac, config->manifest_level, config->manifest_ui_access, config->input_list[LNK_Input_Manifest], config->manifest_dependency_list);\n      String8 manifest_res  = pe_make_manifest_resource(scratch.arena, *config->manifest_resource_id, manifest_data);\n      str8_list_push(scratch.arena, &res_data_list, manifest_res);\n      str8_list_push(scratch.arena, &res_path_list, str8_lit(\"* Manifest *\"));\n      ProfEnd();\n    } break;\n    case LNK_ManifestOpt_WriteToFile: {\n      ProfBeginDynamic(\"Write Manifest To: %.*s\", str8_varg(config->manifest_name));\n      Temp temp = temp_begin(scratch.arena);\n      String8 manifest_data = lnk_manifest_from_inputs(temp.arena, config->io_flags, config->mt_path, config->manifest_name, config->manifest_uac, config->manifest_level, config->manifest_ui_access, config->input_list[LNK_Input_Manifest], config->manifest_dependency_list);\n      lnk_write_data_to_file_path(config->manifest_name, str8_zero(), manifest_data);\n      temp_end(temp);\n      ProfEnd();\n    } break;\n    case LNK_ManifestOpt_Null: {\n      Assert(config->input_list[LNK_Input_Manifest].node_count == 0);\n      Assert(config->manifest_dependency_list.node_count == 0);\n    } break;\n    case LNK_ManifestOpt_No: {\n      // omit manifest generation\n    } break;\n    }\n    \n    ProfBegin(\"Load .res files from disk\");\n    for (String8Node *node = config->input_list[LNK_Input_Res].first; node != 0; node = node->next) {\n      String8 res_data = lnk_read_data_from_file_path(scratch.arena, config->io_flags, node->string);\n      if (res_data.size > 0) {\n        if (pe_is_res(res_data)) {\n          str8_list_push(scratch.arena, &res_data_list, res_data);\n          String8 stable_res_path = lnk_make_full_path(scratch.arena, config->path_style, config->work_dir, node->string);\n          str8_list_push(scratch.arena, &res_path_list, stable_res_path);\n        } else {\n          lnk_error(LNK_Error_LoadRes, \"file is not of RES format: %S\", node->string);\n        }\n      } else {\n        lnk_error(LNK_Error_LoadRes, \"unable to open res file: %S\", node->string);\n      }\n    }\n    ProfEnd();\n    \n    if (res_data_list.node_count > 0) {\n      ProfBegin(\"Build * Resources *\");\n      String8 obj_name = str8_lit(\"* Resources *\");\n      String8 obj_data = lnk_make_res_obj(arena->v[0], res_data_list, res_path_list, config->machine, config->time_stamp, config->work_dir, config->path_style, obj_name);\n      lnk_inputer_push_obj_linkgen(inputer, 0, obj_name, obj_data);\n      ProfEnd();\n    }\n  }\n\n  if (lnk_do_debug_info(config)) {\n    {\n      ProfBegin(\"Build * Linker * Obj\");\n      String8 obj_name     = str8_lit(\"* Linker *\");\n      String8 raw_cmd_line = str8_list_join(scratch.arena, &config->raw_cmd_line, &(StringJoin){ str8_lit_comp(\"\"),  str8_lit_comp(\" \"), str8_lit_comp(\"\") });\n      String8 obj_data     = lnk_make_linker_coff_obj(arena->v[0], config->time_stamp, config->machine, config->work_dir, config->image_name, config->pdb_name, raw_cmd_line, obj_name);\n      lnk_inputer_push_obj_linkgen(inputer, 0, obj_name, obj_data);\n      ProfEnd();\n    }\n\n    ProfBegin(\"Build * Debug Directories *\");\n    if (config->debug_mode != LNK_DebugMode_None && config->debug_mode != LNK_DebugMode_Null) {\n      String8 pdb_dir_obj = pe_make_debug_directory_pdb_obj(arena->v[0], config->machine, config->guid, config->age, config->time_stamp, config->pdb_alt_path);\n      lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Debug Directory PDB *\"), pdb_dir_obj);\n    }\n    if (config->rad_debug == LNK_SwitchState_Yes) {\n      String8 rdi_dir_obj = pe_make_debug_directory_rdi_obj(arena->v[0], config->machine, config->guid, config->age, config->time_stamp, config->rad_debug_alt_path);\n      lnk_inputer_push_obj_linkgen(inputer, 0, str8_lit(\"* Debug Directory RDI *\"), rdi_dir_obj);\n    }\n    ProfEnd();\n  }\n\n  //\n  // link linker made objs\n  //\n  lnk_link_inputs(tp, arena, config, inputer, symtab, link);\n\n  //\n  // finalize symbol table\n  //\n  lnk_replace_weak_with_default_symbols(tp, symtab);\n\n  //\n  // was entry point resolved?\n  //\n  if (config->entry_point_name.size == 0 || link->try_to_resolve_entry_point) {\n    lnk_error(LNK_Error_EntryPoint, \"unable to find entry point symbol\");\n  }\n\n  //\n  // report unresolved symbols\n  //\n  {\n    ProfBegin(\"Report Unresolved Symbols\");\n\n    U64          unresolved_symbols_count = 0;\n    LNK_Symbol **unresolved_symbols       = 0;\n    {\n      U64                       chunks_count = 0;\n      LNK_SymbolHashTrieChunk **chunks       = lnk_array_from_symbol_hash_trie_chunk_list(scratch.arena, symtab->chunks, symtab->arena->count, &chunks_count);\n\n      for EachIndex(chunk_idx, chunks_count) {\n        LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];\n        for EachIndex(i, chunk->count) {\n          LNK_Symbol                 *symbol        = chunk->v[i].symbol;\n          COFF_SymbolValueInterpType  symbol_interp = lnk_interp_from_symbol(symbol);\n          if (symbol_interp == COFF_SymbolValueInterp_Undefined) {\n            unresolved_symbols_count += 1;\n          }\n        }\n      }\n\n      unresolved_symbols = push_array(scratch.arena, LNK_Symbol *, unresolved_symbols_count);\n      if (unresolved_symbols_count) {\n        U64 cursor = 0;\n        for EachIndex(chunk_idx, chunks_count) {\n          LNK_SymbolHashTrieChunk *chunk = chunks[chunk_idx];\n          for EachIndex(i, chunk->count) {\n            LNK_Symbol *symbol = chunk->v[i].symbol;\n            if (lnk_interp_from_symbol(symbol) == COFF_SymbolValueInterp_Undefined) {\n              unresolved_symbols[cursor++] = chunk->v[i].symbol;\n            }\n          }\n        }\n      }\n\n      radsort(unresolved_symbols, unresolved_symbols_count, lnk_symbol_ptr_is_before);\n    }\n\n    for EachIndex(i, unresolved_symbols_count) {\n      LNK_Symbol *symbol = unresolved_symbols[i];\n\n      if (i > config->unresolved_symbol_limit) {\n        lnk_error(LNK_Error_UnresolvedSymbol, \"too many unresolved symbol errors, stopping now\");\n        break;\n      }\n\n      String8List supp_info = {0};\n      {\n        U64                refs_count = 0;\n        LNK_ObjSymbolRef **refs       = lnk_ref_from_symbol_many(scratch.arena, symbol, &refs_count);\n        for EachIndex(ref_idx, refs_count) {\n          LNK_ObjSymbolRef   *ref           = refs[ref_idx];\n          LNK_Obj            *obj           = ref->obj;\n          COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);\n          String8             string_table  = lnk_coff_string_table_from_obj(obj);\n\n          CV_DebugS           debug_s         = {0};\n          CV_LinesAccel      *debug_lines     = 0;\n          String8             debug_checksums = {0};\n          String8             debug_strings   = {0};\n\n          for EachIndex(sect_idx, obj->header.section_count_no_null) {\n            COFF_SectionHeader *section_header = &section_table[sect_idx];\n            if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; }\n\n            String8             section_name   = coff_name_from_section_header(string_table, section_header);\n            U64                 section_number = sect_idx+1;\n            COFF_RelocArray     relocs         = lnk_coff_relocs_from_section_header(obj, section_header);\n            for EachIndex(reloc_idx, relocs.count) {\n              if (supp_info.node_count > config->unresolved_symbol_ref_limit) {\n                str8_list_pushf(scratch.arena, &supp_info, \"too many unresolved symbol references reported, stopping now\");\n                goto next_undefined_symbol;\n              }\n              COFF_Reloc *reloc = &relocs.v[reloc_idx];\n              if (reloc->isymbol == ref->symbol_idx) {\n                U64      line_matches_count = 0;\n                CV_Line *line_matches       = 0;\n                if (config->map_lines_for_unresolved_symbols == LNK_SwitchState_Yes) {\n                  if (debug_lines == 0) {\n                    debug_s = lnk_debug_s_from_obj(scratch.arena, obj);\n                    String8List raw_checksums = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms);\n                    String8List raw_strings   = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable);\n                    debug_lines     = cv_lines_accel_from_debug_s(scratch.arena, debug_s);\n                    debug_checksums = str8_list_first(&raw_checksums);\n                    debug_strings   = str8_list_first(&raw_strings);\n                  }\n                  line_matches_count = 0;\n                  line_matches      = cv_line_from_voff(debug_lines, reloc->apply_off, &line_matches_count);\n                }\n\n                if (line_matches) {\n                  for EachIndex(i, line_matches_count) {\n                    CV_Line        line      = line_matches[i];\n                    CV_C13Checksum checksum  = {0};\n                    String8        file_name = {0};\n                    str8_deserial_read_struct(debug_checksums, line.file_off, &checksum);\n                    str8_deserial_read_cstr(debug_strings, checksum.name_off, &file_name);\n                    str8_list_pushf(scratch.arena, &supp_info, \"%S: %S:%u\", lnk_loc_from_obj(scratch.arena, obj), file_name, line.line_num);\n                  }\n                } else {\n                  str8_list_pushf(scratch.arena, &supp_info, \"%S: %S(%llx)+%x\", lnk_loc_from_obj(scratch.arena, obj), section_name, section_number, reloc->apply_off);\n                }\n              }\n            }\n          }\n        }\n        next_undefined_symbol:;\n      }\n\n      lnk_error(LNK_Error_UnresolvedSymbol, \"unresolved symbol %S\", symbol->name);\n      lnk_supplement_error_list(supp_info);\n    }\n\n    // TODO: /FORCE\n    if (unresolved_symbols_count) {\n      lnk_exit(LNK_Error_UnresolvedSymbol);\n    }\n\n    ProfEnd();\n  }\n\n  //\n  // discard COMDAT sections that are not referenced\n  //\n  if (config->opt_ref == LNK_SwitchState_Yes) {\n    lnk_opt_ref(tp, symtab, config, link->objs);\n  }\n\n  //\n  // infer minimal padding size for functions from the target machine\n  //\n  if (config->machine != COFF_MachineType_Unknown && config->infer_function_pad_min) {\n    config->function_pad_min = lnk_get_default_function_pad_min(config->machine);\n    config->infer_function_pad_min = 0;\n  }\n\n  //\n  // log\n  //\n  if (lnk_get_log_status(LNK_Log_InputObj)) {\n    U64 total_input_size = 0;\n    for (LNK_ObjNode *obj_n = link->objs.first; obj_n != 0; obj_n = obj_n->next) { total_input_size += obj_n->data.data.size; }\n    lnk_log(LNK_Log_InputObj, \"[Total Obj Input Size %M]\", total_input_size);\n  }\n  if (lnk_get_log_status(LNK_Log_InputLib)) {\n    U64 total_input_size = 0;\n    for (LNK_LibNode *lib_n = link->libs.first; lib_n != 0; lib_n = lib_n->next) { total_input_size += lib_n->data.data.size; }\n    lnk_log(LNK_Log_InputLib, \"[Total Lib Input Size %M]\", total_input_size);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n  return link;\n}\n\ninternal void\nlnk_reloc_refs_list_push_node(LNK_RelocRefsList *list, LNK_RelocRefsNode *node)\n{\n  LNK_RelocRefsPointer old_head = list->head;\n  node->next = old_head.node;\n  list->head = (LNK_RelocRefsPointer){ .node = node, .tag = old_head.tag + 1 };\n}\n\ninternal LNK_RelocRefsNode *\nlnk_reloc_refs_list_pop_node(LNK_RelocRefsList *list)\n{\n  LNK_RelocRefsPointer old_head = list->head;\n  if (old_head.node) {\n    list->head = (LNK_RelocRefsPointer){ .node = old_head.node->next, .tag = old_head.tag + 1};\n  }\n  return old_head.node;\n}\n\ninternal LNK_RelocRefsNode *\nlnk_reloc_refs_list_push(Arena *arena, LNK_RelocRefsList *list, LNK_RelocRefs *v)\n{\n  LNK_RelocRefsNode *node = push_array(arena, LNK_RelocRefsNode, 1);\n  node->v = v;\n  lnk_reloc_refs_list_push_node(list, node);\n  return node;\n}\n\ninternal LNK_RelocRefsNode *\nlnk_reloc_refs_list_pop_node_atomic(LNK_RelocRefsList *list)\n{\n  LNK_RelocRefsPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) };\n  for (;;) {\n    if (old_head.node == 0) { break; }\n    LNK_RelocRefsPointer new_head = { .node = old_head.node->next, .tag = old_head.tag + 1 };\n    if (ins_atomic_u128_eval_cond_assign(&list->head, &new_head, &old_head)) { break; }\n  }\n  return old_head.node;\n}\n\ninternal void\nlnk_reloc_refs_list_push_node_atomic(LNK_RelocRefsList *list, LNK_RelocRefsNode *node)\n{\n  LNK_RelocRefsPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) };\n  for (;;) {\n    node->next = old_head.node;\n    LNK_RelocRefsPointer new_head = { .node = node, .tag = old_head.tag + 1 };\n    if (ins_atomic_u128_eval_cond_assign(&list->head, &new_head, &old_head)) { break; }\n  }\n}\n\ninternal void\nlnk_reloc_refs_list_concat_in_place(LNK_RelocRefsList *list, LNK_RelocRefsNode *first, LNK_RelocRefsNode *last)\n{\n  LNK_RelocRefsPointer old_head = { .node = ins_atomic_ptr_eval(&list->head.node), .tag = ins_atomic_u64_eval(&list->head.tag) };\n  for (;;) {\n    last->next = old_head.node;\n    LNK_RelocRefsPointer new_head = { .node = first, .tag = old_head.tag + 1 };\n    if (ins_atomic_u128_eval_cond_assign(&list->head, &new_head, &old_head)) { break; }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_walk_relocs_and_mark_ref_sections_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_OptRefTask  *task   = raw_task;\n  LNK_SymbolTable *symtab = task->symtab;\n\n  LNK_RelocRefsList free_list = {0};\n  for (;;) {\n    // update active thread count\n    ins_atomic_u32_inc_eval(&task->active_thread_count);\n\n    for (;;) {\n      // pop head node\n      LNK_RelocRefsNode *node = lnk_reloc_refs_list_pop_node_atomic(task->reloc_refs);\n      if (!node) { break; }\n\n      LNK_RelocRefs *reloc_refs = node->v;\n\n      LNK_RelocRefsNode *first_node = 0, *last_node = 0;\n      for EachIndex(reloc_idx, reloc_refs->relocs.count) {\n        COFF_Reloc                 *reloc        = &reloc_refs->relocs.v[reloc_idx];\n        LNK_ObjSymbolRef            reloc_defn   = (LNK_ObjSymbolRef){ .obj = reloc_refs->obj, .symbol_idx = reloc->isymbol };\n        COFF_ParsedSymbol           reloc_parsed = lnk_parsed_symbol_from_coff_symbol_idx(reloc_defn.obj, reloc_defn.symbol_idx);\n        COFF_SymbolValueInterpType  reloc_interp = coff_interp_from_parsed_symbol(reloc_parsed);\n\n        LNK_ObjSymbolRef ref_symbol = reloc_defn;\n        for (;;) {\n          COFF_ParsedSymbol          ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx);\n          COFF_SymbolValueInterpType ref_interp = coff_interp_from_parsed_symbol(ref_parsed);\n\n          LNK_ObjSymbolRef next_ref = {0};\n          if (ref_interp == COFF_SymbolValueInterp_Regular) {\n            LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(ref_symbol.obj, ref_parsed.section_number);\n            if (symlink) {\n              ref_symbol = lnk_ref_from_symbol(symlink);\n            }\n            break;\n          } else if (ref_interp == COFF_SymbolValueInterp_Undefined) {\n            if (reloc_parsed.storage_class == COFF_SymStorageClass_External) {\n              LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name);\n              next_ref = lnk_ref_from_symbol(defn);\n            } else {\n              MemoryZeroStruct(&ref_symbol);\n              break;\n            }\n          } else if (ref_interp == COFF_SymbolValueInterp_Weak) {\n            LNK_Symbol *defn = lnk_symbol_table_search(symtab, ref_parsed.name);\n            next_ref = lnk_ref_from_symbol(defn);\n          } else {\n            break;\n          }\n\n          if (MemoryMatchStruct(&next_ref, &ref_symbol)) {\n            MemoryZeroStruct(&ref_symbol);\n            break;\n          }\n          ref_symbol = next_ref;\n        }\n\n        // skip unresolved symbol\n        if (ref_symbol.obj == 0) { continue; }\n\n        COFF_ParsedSymbol           ref_parsed = lnk_parsed_symbol_from_coff_symbol_idx(ref_symbol.obj, ref_symbol.symbol_idx);\n        COFF_SymbolValueInterpType  ref_interp = coff_interp_from_parsed_symbol(ref_parsed);\n        LNK_Obj                    *ref_obj    = ref_symbol.obj;\n\n        if (ref_interp == COFF_SymbolValueInterp_Regular) {\n          // make section number list (reloc section + associates)\n          U32Node *section_number_list = push_array(scratch.arena, U32Node, 1);\n          section_number_list->data    = ref_parsed.section_number;\n          section_number_list->next    = ref_obj->associated_sections[ref_parsed.section_number];\n\n          // push section headers relocations to the task stack\n          for EachNode(section_number_n, U32Node, section_number_list) {\n            COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(ref_obj, section_number_n->data);\n\n            // is section eligible for walking?\n            if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; }\n            if (section_header->flags & COFF_SectionFlag_LnkInfo)   { continue; }\n            if (section_header->flags & LNK_SECTION_FLAG_DEBUG)     { continue; }\n            if (section_header->flags & LNK_SECTION_FLAG_LIVE)      { continue; }\n\n            // mark section live\n            section_header->flags |= LNK_SECTION_FLAG_LIVE;\n\n            LNK_RelocRefsNode *node;\n            if (free_list.head.node) {\n              node = lnk_reloc_refs_list_pop_node(&free_list);\n            } else {\n              node    = push_array(scratch.arena, LNK_RelocRefsNode, 1);\n              node->v = push_array(scratch.arena, LNK_RelocRefs, 1);\n            }\n\n            node->v->obj    = ref_obj;\n            node->v->relocs = lnk_coff_reloc_info_from_section_number(ref_obj, section_number_n->data);\n\n            if (first_node == 0) {\n              first_node = node;\n              last_node  = node;\n            } else {\n              node->next = first_node;\n              first_node = node;\n            }\n          }\n        }\n      }\n\n      lnk_reloc_refs_list_push_node(&free_list, node);\n\n      if (first_node && last_node) {\n        lnk_reloc_refs_list_concat_in_place(task->reloc_refs, first_node, last_node);\n      }\n    }\n\n    // are all threads done walking?\n    U32 active_thread_count = ins_atomic_u32_dec_eval(&task->active_thread_count);\n    if (active_thread_count == 0 && ins_atomic_ptr_eval(&task->reloc_refs->head.node) == 0) {\n      break;\n    }\n\n    // comprehensive solution to the waiting problem\n    for (; ins_atomic_ptr_eval(&task->reloc_refs->head.node) == 0; ) {\n      // was signaled to exit?\n      if (ins_atomic_u64_eval(&task->active_thread_count) == 0) { goto exit; }\n    }\n  }\n  exit:;\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nlnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_ObjList objs)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_RelocRefsList reloc_refs = {0};\n\n  //\n  // reset live flag on sections\n  //\n  for EachNode(obj_n, LNK_ObjNode, objs.first) {\n    for EachIndex(sect_idx, obj_n->data.header.section_count_no_null) {\n      COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(&obj_n->data, sect_idx+1);\n      section_header->flags &= ~LNK_SECTION_FLAG_LIVE;\n    }\n  }\n\n  //\n  // define roots\n  //\n  {\n    // tls\n    LNK_Symbol *tls_symbol = lnk_symbol_table_searchf(symtab, MSCRT_TLS_SYMBOL_NAME);\n    if (tls_symbol) {\n      lnk_include_symbol(config, str8_lit(MSCRT_TLS_SYMBOL_NAME), 0);\n    }\n\n    // push tasks for each root symbol\n    for EachNode(root_n, LNK_IncludeSymbolNode, config->include_symbol_list.first) {\n      LNK_Symbol       *root     = lnk_symbol_table_search(symtab, root_n->v.name);\n      LNK_ObjSymbolRef  root_ref = lnk_ref_from_symbol(root);\n\n      LNK_RelocRefs *r = push_array(scratch.arena, LNK_RelocRefs, 1);\n      r->obj                 = root_ref.obj;\n      r->relocs.count        = 1;\n      r->relocs.v            = push_array(scratch.arena, COFF_Reloc, 1);\n      r->relocs.v[0].isymbol = root_ref.symbol_idx;\n\n      lnk_reloc_refs_list_push(scratch.arena, &reloc_refs, r);\n    }\n\n    // push task for every non-COMDAT section\n    for EachNode(obj_n, LNK_ObjNode, objs.first) {\n      LNK_Obj *obj = &obj_n->data;\n      for EachIndex(sect_idx, obj->header.section_count_no_null) {\n        U32                 section_number = sect_idx+1;\n        COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);\n\n        // is section eligible for walking?\n        if (section_header->flags & COFF_SectionFlag_LnkRemove)  { continue; }\n        if (section_header->flags & COFF_SectionFlag_LnkCOMDAT)  { continue; }\n        if (section_header->flags & COFF_SectionFlag_LnkInfo)    { continue; }\n        if (section_header->flags & LNK_SECTION_FLAG_DEBUG)      { continue; }\n\n        // divide relocs and push task for each reloc block\n        COFF_RelocArray  relocs         = lnk_coff_reloc_info_from_section_number(obj, section_number);\n        U64              new_task_count = CeilIntegerDiv(relocs.count, LNK_RELOCS_PER_TASK);\n        LNK_RelocRefs   *new_tasks      = push_array(scratch.arena, LNK_RelocRefs, new_task_count);\n        for EachIndex(new_task_idx, new_task_count) {\n          LNK_RelocRefs *r = new_tasks + new_task_idx;\n          r->obj          = obj;\n          r->relocs.count = Min(LNK_RELOCS_PER_TASK, relocs.count - (new_task_idx * LNK_RELOCS_PER_TASK));\n          r->relocs.v     = relocs.v + (new_task_idx * LNK_RELOCS_PER_TASK);\n\n          lnk_reloc_refs_list_push(scratch.arena, &reloc_refs, r);\n        }\n      }\n    }\n  }\n\n  //\n  // walk relocations and mark referenced sections with live flag\n  //\n  LNK_OptRefTask task = {0};\n  task.symtab         = symtab;\n  task.reloc_refs     = &reloc_refs;\n  tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_walk_relocs_and_mark_ref_sections_task, &task, \"Mark Live Sections\");\n\n  ProfBegin(\"Remove Unreachable Sections\");\n  for EachNode(obj_n, LNK_ObjNode, objs.first) {\n    LNK_Obj *obj = &obj_n->data;\n\n    for EachIndex(sect_idx, obj->header.section_count_no_null) {\n      U32                 section_number = sect_idx+1;\n      COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);\n\n      if (section_header->flags & LNK_SECTION_FLAG_DEBUG) { continue; }\n\n      // remove unreferenced sections\n      if (~section_header->flags & LNK_SECTION_FLAG_LIVE && section_header->flags & COFF_SectionFlag_LnkCOMDAT) {\n        section_header->flags |= COFF_SectionFlag_LnkRemove;\n      }\n\n      // remove associated sections\n      if (section_header->flags & COFF_SectionFlag_LnkRemove) {\n        for EachNode(section_number_n, U32Node, obj->associated_sections[section_number]) {\n          COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number_n->data);\n          section_header->flags |= COFF_SectionFlag_LnkRemove;\n        }\n      }\n      \n      // TODO: Reset reserved flag so it does not get propagated to the image sections.\n      // We need to mask out reserved flags when gathering section definitions to actually\n      // prevent propagation.\n      section_header->flags &= ~LNK_SECTION_FLAG_LIVE;\n    }\n  }\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal B32\nlnk_resolve_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *symbol_out)\n{\n  B32                        is_resolved   = 1;\n  COFF_ParsedSymbol          symbol_parsed = lnk_parsed_symbol_from_coff_symbol_idx(symbol.obj, symbol.symbol_idx);\n  COFF_SymbolValueInterpType symbol_interp = coff_interp_symbol(symbol_parsed.section_number, symbol_parsed.value, symbol_parsed.storage_class);\n  switch (symbol_interp) {\n  case COFF_SymbolValueInterp_Regular: { \n    LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(symbol.obj, symbol_parsed.section_number);\n    *symbol_out = symlink ? lnk_ref_from_symbol(symlink) : symbol;\n  } break;\n  case COFF_SymbolValueInterp_Weak: {\n    LNK_Symbol                 *defn        = lnk_symbol_table_search(symtab, symbol_parsed.name);\n    COFF_ParsedSymbol           defn_parsed = lnk_parsed_from_symbol(defn);\n    COFF_SymbolValueInterpType  defn_interp = lnk_interp_from_symbol(defn);\n    if (defn_interp != COFF_SymbolValueInterp_Undefined) {\n      *symbol_out = lnk_ref_from_symbol(defn);\n    } else {\n      is_resolved = 0;\n    }\n  } break;\n  case COFF_SymbolValueInterp_Undefined: {\n    LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name);\n    if (defn) {\n      *symbol_out = lnk_ref_from_symbol(defn);\n    } else {\n      is_resolved = 0;\n    }\n  } break;\n  case COFF_SymbolValueInterp_Common: {\n    LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name);\n    *symbol_out = lnk_ref_from_symbol(defn);\n  } break;\n  case COFF_SymbolValueInterp_Abs: {\n    if (symbol_parsed.storage_class == COFF_SymStorageClass_External) { \n      LNK_Symbol *defn = lnk_symbol_table_search(symtab, symbol_parsed.name);\n      *symbol_out = lnk_ref_from_symbol(defn);\n    } else {\n      *symbol_out = symbol;\n    }\n  } break;\n  case COFF_SymbolValueInterp_Debug: { *symbol_out = symbol; } break;\n  }\n  return is_resolved;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_gather_section_definitions_task)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n\n  HashTable          *sect_defn_ht  = task->u.gather_sects.defns[worker_id];\n  LNK_Obj            *obj           = task->objs[obj_idx];\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  String8             string_table  = str8_substr(obj->data, obj->header.string_table_range);\n\n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n\n    if (~sect_header->flags & COFF_SectionFlag_LnkRemove && ~sect_header->flags & COFF_SectionFlag_LnkInfo && sect_header->fsize > 0) {\n      Temp temp = temp_begin(scratch.arena);\n\n      // was section defined?\n      String8                sect_name            = coff_name_from_section_header(string_table, sect_header);\n      String8                sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_header->flags & ~COFF_SectionFlags_LnkFlags);\n      LNK_SectionDefinition *sect_defn            = hash_table_search_string_raw(sect_defn_ht, sect_name_with_flags);\n\n      // push new section definition\n      if (sect_defn == 0) {\n        sect_defn = push_array(arena, LNK_SectionDefinition, 1);\n        sect_defn->name         = sect_name;\n        sect_defn->obj          = obj;\n        sect_defn->obj_sect_idx = sect_idx;\n        sect_defn->flags        = sect_header->flags & ~COFF_SectionFlags_LnkFlags;\n\n        sect_name_with_flags = push_str8_copy(arena, sect_name_with_flags);\n        hash_table_push_string_raw(arena, sect_defn_ht, sect_name_with_flags, sect_defn);\n      }\n\n      // acc contrib count\n      sect_defn->contribs_count += 1;\n      \n      temp_end(temp);\n    }\n  }\n\n  scratch_end(scratch);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_gather_section_contribs_task)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n\n  LNK_Obj            *obj           = task->objs[obj_idx];\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  String8             string_table  = str8_substr(obj->data, obj->header.string_table_range);\n\n  ProfBeginV(\"Gather Section Contribs [%S]\", obj->path);\n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    LNK_SectionContrib *sc          = task->null_sc;\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n    if (~sect_header->flags & COFF_SectionFlag_LnkRemove && ~sect_header->flags & COFF_SectionFlag_LnkInfo && sect_header->fsize > 0) {\n      LNK_SectionContribChunk *sc_chunk = 0;\n      {\n        Temp temp = temp_begin(scratch.arena);\n        String8 sect_name            = coff_name_from_section_header(string_table, sect_header);\n        String8 sect_name_with_flags = lnk_make_name_with_flags(temp.arena, sect_name, sect_header->flags & ~COFF_SectionFlags_LnkFlags);\n        sc_chunk = hash_table_search_string_raw(task->contribs_ht, sect_name_with_flags);\n        temp_end(temp);\n      }\n\n      if (sc_chunk) {\n        String8 data;\n        if (sect_header->flags & COFF_SectionFlag_CntUninitializedData) {\n          data = str8(0, sect_header->fsize);\n        } else {\n          data = str8_substr(obj->data, rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize));\n        }\n\n        U16 sc_align = coff_align_size_from_section_flags(sect_header->flags);\n        sc = lnk_section_contrib_chunk_push_atomic(sc_chunk, 1);\n        sc->first_data_node.next   = 0;\n        sc->first_data_node.string = data;\n        sc->last_data_node         = &sc->first_data_node;\n        sc->align                  = sc_align == 0 ? task->default_align : sc_align;\n        sc->u.obj_idx              = obj_idx;\n        sc->u.obj_sect_idx         = sect_idx;\n      }\n    }\n    task->sect_map[obj_idx][sect_idx] = sc;\n  }\n  ProfEnd();\n\n  scratch_end(scratch);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_set_comdat_leaders_contribs_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBeginV(\"Set COMDAT Section Contribs [%S]\", obj->path);\n  for EachIndex(sect_idx, obj->header.section_count_no_null) {\n    U64 section_number = sect_idx+1;\n\n    COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);\n    if (~section_header->flags & COFF_SectionFlag_LnkCOMDAT) { continue; }\n\n    LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, section_number);\n    if (symlink == 0) { continue; }\n\n    COFF_ParsedSymbol symlink_parsed = lnk_parsed_from_symbol(symlink);\n    LNK_ObjSymbolRef  symlink_ref    = lnk_ref_from_symbol(symlink);\n    task->sect_map[obj_idx][sect_idx] = task->sect_map[symlink_ref.obj->input_idx][symlink_parsed.section_number - 1];\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_flag_debug_symbols_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n    if (interp == COFF_SymbolValueInterp_Regular) {\n      COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number);\n      if (section_header->flags & LNK_SECTION_FLAG_DEBUG) {\n        task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx] = 1;\n      }\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_comdat_leaders_task)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBeginV(\"%S\", obj->path);\n\n  ProfBegin(\"Patch COMDAT Offsets\");\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n\n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n    if (interp == COFF_SymbolValueInterp_Regular) {\n      LNK_Symbol *symlink = lnk_obj_get_comdat_symlink(obj, symbol.section_number);\n      if (symlink) {\n        LNK_ObjSymbolRef symlink_ref = lnk_ref_from_symbol(symlink);\n        if (symlink_ref.obj != obj) {\n          U32 section_number;\n          U32 value;\n          if (symbol.storage_class == COFF_SymStorageClass_External) {\n            // COMDAT leader may be at a different offset, so update this symbol with leader's offset\n            COFF_ParsedSymbol parsed_symlink = lnk_parsed_from_symbol(symlink);\n            section_number = symbol.section_number;\n            value          = parsed_symlink.value;\n          } else {\n            // COMDAT section may have static symbols which are now invalid to relocate against\n            section_number = lnk_obj_get_removed_section_number(obj);\n            value          = max_U32;\n            task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx] = 1;\n          }\n\n          if (obj->header.is_big_obj) {\n            COFF_Symbol32 *symbol32  = symbol.raw_symbol;\n            symbol32->section_number = section_number;\n            symbol32->value          = value;\n          } else {\n            COFF_Symbol16 *symbol16  = symbol.raw_symbol;\n            symbol16->section_number = (U16)section_number;\n            symbol16->value          = value;\n          }\n        }\n      }\n    }\n  }\n  ProfEnd();\n\n  ProfEnd();\n\n  scratch_end(scratch);\n}\n\ninternal int\nlnk_section_contrib_ptr_is_before(void *raw_a, void *raw_b)\n{\n  LNK_SectionContrib **a = raw_a, **b = raw_b;\n  U64 input_idx_a = Compose64Bit((*a)->u.obj_idx, (*a)->u.obj_sect_idx);\n  U64 input_idx_b = Compose64Bit((*b)->u.obj_idx, (*b)->u.obj_sect_idx);\n  return u64_compar_is_before(&input_idx_a, &input_idx_b);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_sort_contribs_task)\n{\n  LNK_BuildImageTask *task = raw_task;\n  LNK_SectionContribChunk *chunk = task->u.sort_contribs.chunks[task_id];\n  ProfBeginV(\"[%llu]\", chunk->count);\n  radsort(chunk->v, chunk->count, lnk_section_contrib_ptr_is_before);\n  ProfEnd();\n}\n\ninternal int\nlnk_common_block_contrib_is_before(void *raw_a, void *raw_b)\n{\n  LNK_CommonBlockContrib *a = raw_a;\n  LNK_CommonBlockContrib *b = raw_b;\n\n  int is_before;\n  if (a->u.size == b->u.size) {\n    LNK_Symbol *a_symbol = a->symbol;\n    LNK_Symbol *b_symbol = b->symbol;\n    is_before = lnk_symbol_is_before(a_symbol, b_symbol);\n  } else {\n    is_before = a->u.size > b->u.size;\n  }\n\n  return is_before;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_common_block_leaders_task)\n{\n  ProfBeginFunction();\n\n  LNK_BuildImageTask *task          = raw_task;\n  Rng1U64             contrib_range = task->u.patch_symtabs.common_block_ranges[task_id];\n\n  for (U64 contrib_idx = contrib_range.min; contrib_idx < contrib_range.max; contrib_idx += 1) {\n    LNK_CommonBlockContrib *contrib        = &task->u.patch_symtabs.common_block_contribs[contrib_idx];\n    LNK_Symbol             *symbol         = contrib->symbol;\n    LNK_ObjSymbolRef        symbol_ref     = lnk_ref_from_symbol(symbol);\n    COFF_ParsedSymbol       parsed_symbol  = lnk_parsed_from_symbol(symbol);\n    U64                     section_number = task->u.patch_symtabs.common_block_sect->sect_idx + 1;\n\n    if (symbol_ref.obj->header.is_big_obj) {\n      COFF_Symbol32 *symbol32 = parsed_symbol.raw_symbol;\n      symbol32->value          = contrib->u.offset;\n      symbol32->section_number = safe_cast_u32(section_number);\n    } else {\n      COFF_Symbol16 *symbol16 = parsed_symbol.raw_symbol;\n      symbol16->value          = contrib->u.offset;\n      symbol16->section_number = safe_cast_u16(section_number);\n    }\n\n    task->u.patch_symtabs.was_symbol_patched[symbol_ref.obj->input_idx][symbol_ref.symbol_idx] = 1;\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_common_block_symbols_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBeginV(\"Patch Common Block Symbols [%S]\", obj->path);\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n    if (interp == COFF_SymbolValueInterp_Common) {\n      LNK_Symbol       *defn        = lnk_symbol_table_search(task->symtab, symbol.name);\n      COFF_ParsedSymbol defn_parsed = lnk_parsed_from_symbol(defn);\n      Assert(lnk_interp_from_symbol(defn) == COFF_SymbolValueInterp_Regular);\n      if (defn) {\n        if (obj->header.is_big_obj) {\n          COFF_Symbol32 *symbol32  = symbol.raw_symbol;\n          symbol32->section_number = defn_parsed.section_number;\n          symbol32->value          = safe_cast_u32(defn_parsed.value);\n          symbol32->storage_class  = COFF_SymStorageClass_Static;\n        } else {\n          COFF_Symbol16 *symbol16  = symbol.raw_symbol;\n          symbol16->section_number = safe_cast_u16(defn_parsed.section_number);\n          symbol16->value          = safe_cast_u32(defn_parsed.value);\n          symbol16->storage_class  = COFF_SymStorageClass_Static;\n        }\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_regular_symbols_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBeginV(\"Patch Regular Symbols [%S]\", obj->path);\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n\n    if (task->u.patch_symtabs.was_symbol_patched[obj_idx][symbol_idx]) {\n      continue;\n    }\n\n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n    if (interp == COFF_SymbolValueInterp_Regular) {\n      COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number);\n\n      LNK_SectionContrib *sc = task->sect_map[obj_idx][symbol.section_number-1];\n      U32                 section_number;\n      U32                 value;\n      if (sc == task->null_sc) {\n        section_number = lnk_obj_get_removed_section_number(obj);\n        value          = max_U32;\n      } else {\n        section_number = safe_cast_u32(sc->u.sect_idx + 1);\n        value          = sc->u.off + symbol.value;\n      }\n\n      if (obj->header.is_big_obj) {\n        COFF_Symbol32 *symbol32  = symbol.raw_symbol;\n        symbol32->section_number = section_number;\n        symbol32->value          = value;\n      } else {\n        COFF_Symbol16 *symbol16  = symbol.raw_symbol;\n        symbol16->section_number = safe_cast_u16(section_number);\n        symbol16->value          = value;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal void\nlnk_patch_obj_symtab(LNK_SymbolTable *symtab, LNK_Obj *obj, B8 *was_symbol_patched, COFF_SymbolValueInterpType fixup_type)\n{\n  ProfBeginV(\"%S\\n\", obj->path);\n\n  COFF_ParsedSymbol fixup_dst;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + fixup_dst.aux_symbol_count)) {\n    fixup_dst = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    if (was_symbol_patched[symbol_idx]) { continue; }\n\n    COFF_SymbolValueInterpType fixup_dst_type = coff_interp_symbol(fixup_dst.section_number, fixup_dst.value, fixup_dst.storage_class);\n    if (fixup_type != fixup_dst_type) { continue; }\n\n    LNK_ObjSymbolRef symbol_to_resolve = { .obj = obj, .symbol_idx = symbol_idx };\n    LNK_ObjSymbolRef fixup_symbol      = {0};\n    B32               is_resolved       = lnk_resolve_symbol(symtab, symbol_to_resolve, &fixup_symbol);\n    if (is_resolved) {\n      COFF_ParsedSymbol          fixup_src          = lnk_parsed_symbol_from_coff_symbol_idx(fixup_symbol.obj, fixup_symbol.symbol_idx);\n      COFF_SymbolValueInterpType fixup_type         = coff_interp_symbol(fixup_src.section_number, fixup_src.value, fixup_src.storage_class);\n      B32                         was_fixup_removed = fixup_src.section_number == lnk_obj_get_removed_section_number(fixup_symbol.obj);\n\n      U32 section_number;\n      U32 value;\n      if (was_fixup_removed || fixup_type == COFF_SymbolValueInterp_Undefined || fixup_type == COFF_SymbolValueInterp_Weak) {\n        section_number = lnk_obj_get_removed_section_number(obj);\n        value          = 0;\n      } else {\n        section_number = fixup_src.section_number;\n        value          = fixup_src.value;\n      }\n\n      if (obj->header.is_big_obj) {\n        COFF_Symbol32 *symbol32  = fixup_dst.raw_symbol;\n        symbol32->section_number = section_number;\n        symbol32->value          = value;\n        symbol32->storage_class  = COFF_SymStorageClass_Static;\n      } else {\n        COFF_Symbol16 *symbol16  = fixup_dst.raw_symbol;\n        symbol16->section_number = (U16)section_number;\n        symbol16->value          = value;\n        symbol16->storage_class  = COFF_SymStorageClass_Static;\n      }\n\n      was_symbol_patched[symbol_idx] = 1;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_common_symbols_task)\n{\n  LNK_BuildImageTask *task = raw_task;\n  lnk_patch_obj_symtab(task->symtab, task->objs[task_id], task->u.patch_symtabs.was_symbol_patched[task_id], COFF_SymbolValueInterp_Common);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_abs_symbols_task)\n{\n  LNK_BuildImageTask *task = raw_task;\n  lnk_patch_obj_symtab(task->symtab, task->objs[task_id], task->u.patch_symtabs.was_symbol_patched[task_id], COFF_SymbolValueInterp_Abs);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_undefined_symbols_task)\n{\n  LNK_BuildImageTask *task = raw_task;\n  lnk_patch_obj_symtab(task->symtab, task->objs[task_id], task->u.patch_symtabs.was_symbol_patched[task_id], COFF_SymbolValueInterp_Undefined);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_weak_symbols_task)\n{\n  LNK_BuildImageTask *task = raw_task;\n  lnk_patch_obj_symtab(task->symtab, task->objs[task_id], task->u.patch_symtabs.was_symbol_patched[task_id], COFF_SymbolValueInterp_Weak);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_image_fill_task)\n{\n  ProfBeginFunction();\n  LNK_BuildImageTask *task       = raw_task;\n  String8             image_data = task->u.image_fill.image_data;\n  for EachNode(n, LNK_ImageFillNode, task->u.image_fill.fill_nodes[task_id]) {\n    for EachIndex(i, n->sc_count) {\n      LNK_SectionContrib *sc = n->sc[i];\n      U64 cursor = 0;\n      for EachNode(data_n, String8Node, &sc->first_data_node) {\n        U64 image_off = sc->u.off + n->base_foff + cursor;\n        Assert(image_off + data_n->string.size <= image_data.size);\n        MemoryCopyStr8(image_data.str + image_off, data_n->string);\n        cursor += data_n->string.size;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal U64\nlnk_compute_win32_image_header_size(LNK_Config *config, U64 sect_count)\n{\n  U64 image_header_size = 0;\n  image_header_size += sizeof(PE_DosHeader) + pe_dos_program.size;\n  image_header_size += sizeof(U32); // PE_MAGIC\n  image_header_size += sizeof(COFF_FileHeader);\n  image_header_size += pe_has_plus_header(config->machine) ? sizeof(PE_OptionalHeader32Plus) : sizeof(PE_OptionalHeader32);\n  image_header_size += sizeof(PE_DataDirectory) * config->data_dir_count;\n  image_header_size += sizeof(COFF_SectionHeader) * sect_count;\n  return image_header_size;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_obj_reloc_patcher)\n{\n  ProfBeginFunction();\n\n  LNK_ObjRelocPatcher *task = raw_task;\n  LNK_Obj             *obj  = task->objs[task_id];\n\n  COFF_FileHeaderInfo  obj_header    = obj->header;\n  COFF_SectionHeader  *section_table = lnk_coff_section_table_from_obj(obj);\n  String8              symbol_table  = lnk_coff_symbol_table_from_obj(obj);\n  String8              string_table  = lnk_coff_string_table_from_obj(obj);\n\n  U32 closest_sect  = 0;\n  U32 closest_reloc = 0;\n  U32 closest_foff  = max_U32;\n\n  for EachIndex(sect_idx, obj_header.section_count_no_null) {\n    COFF_SectionHeader *section_header = &section_table[sect_idx];\n\n    if (section_header->flags & COFF_SectionFlag_LnkInfo)              { continue; }\n    if (section_header->flags & COFF_SectionFlag_LnkRemove)            { continue; }\n    if (section_header->flags & COFF_SectionFlag_CntUninitializedData) { continue; }\n\n    // get section bytes (special case debug info because it is not copied to the image)\n    String8 data           = section_header->flags & LNK_SECTION_FLAG_DEBUG ? obj->data : task->image_data;\n    Rng1U64 section_frange = rng_1u64(section_header->foff, section_header->foff + section_header->fsize);\n    String8 section_data   = str8_substr(data, section_frange);\n\n    // apply relocs\n    COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, section_header);\n    for EachIndex(reloc_idx, relocs.count) {\n      COFF_Reloc *reloc = &relocs.v[reloc_idx];\n\n      // error check relocation\n      if (obj->header.machine == COFF_MachineType_X64) {\n        if (reloc->type > COFF_Reloc_X64_Last) {\n          lnk_error_obj(LNK_Error_IllegalRelocation, obj, \"unknown relocation type 0x%x\", reloc->type);\n        }\n      } else if (obj->header.machine != COFF_MachineType_Unknown) {\n        lnk_not_implemented(\"relocation patching is not implemented for %S\", coff_string_from_machine_type(obj->header.machine));\n        continue;\n      }\n\n      // compute virtual offsets\n      U64 reloc_voff = section_header->voff + reloc->apply_off;\n\n      // compute symbol location values\n      U32 symbol_secnum = 0;\n      U32 symbol_secoff = 0;\n      S64 symbol_voff   = 0;\n      {\n        COFF_ParsedSymbol          symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, reloc->isymbol);\n        COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol);\n        if (interp == COFF_SymbolValueInterp_Regular) {\n          if (symbol.section_number == lnk_obj_get_removed_section_number(obj)) {\n            if (~section_header->flags & LNK_SECTION_FLAG_DEBUG) {\n              String8 sect_name = coff_name_from_section_header(string_table, &section_table[sect_idx]);\n              lnk_error_obj(LNK_Error_RelocationAgainstRemovedSection, obj, \"relocating against symbol that is in a removed section (symbol: %S, reloc-section: %S 0x%llx, reloc-index: 0x%llx)\", symbol.name, sect_name, sect_idx+1, reloc_idx);\n            }\n            continue;\n          }\n          symbol_secnum = symbol.section_number;\n          symbol_secoff = symbol.value;\n          symbol_voff   = safe_cast_u32((U64)task->image_section_table[symbol.section_number]->voff + (U64)symbol_secoff);\n        } else if (interp == COFF_SymbolValueInterp_Abs) {\n          // There aren't enough bits in COFF symbol to store full image base address,\n          // so we special case __ImageBase. A better solution would be to add\n          // a 64-bit symbol format to COFF.\n          if (str8_match(symbol.name, str8_lit(\"__ImageBase\"), 0)) {\n            symbol.value = task->image_base;\n          }\n          symbol_secnum = 0;\n          symbol_secoff = 0;\n          symbol_voff   = (S64)symbol.value - (S64)task->image_base;\n        } else if (interp == COFF_SymbolValueInterp_Weak) {\n          // unresolved weak\n        } else if (interp == COFF_SymbolValueInterp_Undefined) {\n          // unresolved undefined\n        } else {\n          InvalidPath;\n        }\n      }\n\n      // pick reloc value\n      COFF_RelocValue reloc_value = {0};\n      switch (obj_header.machine) {\n      case COFF_MachineType_Unknown: {} break;\n      case COFF_MachineType_X64: { reloc_value = coff_pick_reloc_value_x64(reloc->type, task->image_base, reloc_voff, symbol_secnum, symbol_secoff, symbol_voff); } break;\n      default: { NotImplemented; } break;\n      }\n\n      // read addend\n      Assert(reloc_value.size <= section_data.size);\n      U64 raw_addend = 0;\n      str8_deserial_read(section_data, reloc->apply_off, &raw_addend, reloc_value.size, 1);\n\n      // compute new reloc value\n      S64 addend       = extend_sign64(raw_addend, reloc_value.size);\n      U64 reloc_result = reloc_value.value + addend;\n\n      // commit new reloc value\n      MemoryCopy(section_data.str + reloc->apply_off, &reloc_result, reloc_value.size);\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal int\nlnk_section_definition_is_before(void *raw_a, void *raw_b)\n{\n  LNK_SectionDefinition **a = raw_a, **b = raw_b;\n  U64 input_idx_a = Compose64Bit((*a)->obj->input_idx, (*a)->obj_sect_idx);\n  U64 input_idx_b = Compose64Bit((*b)->obj->input_idx, (*b)->obj_sect_idx);\n  return u64_compar_is_before(&input_idx_a, &input_idx_b);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_count_common_block_contribs_task)\n{\n  LNK_BuildImageTask *task   = raw_task;\n  LNK_SymbolTable    *symtab = task->symtab;\n\n  for (LNK_SymbolHashTrieChunk *chunk = symtab->chunks[task_id].first; chunk != 0; chunk = chunk->next) {\n    for EachIndex(i, chunk->count) {\n      LNK_Symbol                 *symbol        = chunk->v[i].symbol;\n      COFF_ParsedSymbol           parsed_symbol = lnk_parsed_from_symbol(symbol);\n      COFF_SymbolValueInterpType  parsed_interp = coff_interp_symbol(parsed_symbol.section_number, parsed_symbol.value, parsed_symbol.storage_class);\n      if (parsed_interp == COFF_SymbolValueInterp_Common) {\n        task->u.common_block.counts[task_id] += 1;\n      }\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_fill_out_common_block_contribs_task)\n{\n  LNK_BuildImageTask *task   = raw_task;\n  LNK_SymbolTable    *symtab = task->symtab;\n  U64                 cursor = task->u.common_block.offsets[task_id];\n\n  for (LNK_SymbolHashTrieChunk *chunk = symtab->chunks[task_id].first; chunk != 0; chunk = chunk->next) {\n    for EachIndex(i, chunk->count) {\n      LNK_Symbol                 *symbol        = chunk->v[i].symbol;\n      COFF_ParsedSymbol           parsed_symbol = lnk_parsed_from_symbol(symbol);\n      COFF_SymbolValueInterpType  parsed_interp = coff_interp_symbol(parsed_symbol.section_number, parsed_symbol.value, parsed_symbol.storage_class);\n      if (parsed_interp == COFF_SymbolValueInterp_Common) {\n        LNK_CommonBlockContrib *contrib = &task->u.common_block.contribs[cursor++];\n        contrib->symbol                 = chunk->v[i].symbol;\n        contrib->u.size                 = parsed_symbol.value;\n      }\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_flag_hotpatch_contribs_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n  \n  if (obj->hotpatch) {\n    COFF_ParsedSymbol symbol;\n    for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n      symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n      COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n      if (interp == COFF_SymbolValueInterp_Regular && COFF_SymbolType_IsFunc(symbol.type)) {\n        COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number);\n        LNK_SectionContrib *sc = task->sect_map[obj_idx][symbol.section_number-1];\n        if (sc != task->null_sc) {\n          sc->hotpatch = !!(section_header->flags & COFF_SectionFlag_CntCode);\n        }\n      }\n    }\n  }\n}\n\ninternal void\nlnk_push_coff_symbols_from_data(Arena *arena, LNK_SymbolList *symbol_list, String8 data, LNK_SymbolArray obj_symbols)\n{\n  if (data.size % sizeof(U32)) {\n    // TODO: report invalid data size\n  }\n  U64 count = data.size / sizeof(U32);\n  for (U32 *ptr = (U32*)data.str, *opl = ptr + count; ptr < opl; ++ptr) {\n    U32 coff_symbol_idx = *ptr;\n    if (coff_symbol_idx >= obj_symbols.count) {\n      // TODO: report invalid symbol index\n      continue;\n    }\n    Assert(coff_symbol_idx < obj_symbols.count);\n    LNK_Symbol *symbol = obj_symbols.v + coff_symbol_idx;\n    lnk_symbol_list_push(arena, symbol_list, symbol);\n  }\n}\n\ninternal String8\nlnk_build_guard_data(Arena *arena, U64Array voff_arr, U64 stride)\n{\n  Assert(stride >= sizeof(U32));\n  \n  // check for duplicates\n#if DEBUG\n  for (U64 i = 1; i < voff_arr.count; ++i) {\n    Assert(voff_arr.[i-1] != voff_ptr[i]);\n  }\n#endif\n  \n  U64 buffer_size = stride * voff_arr.count;\n  U8 *buffer = push_array(arena, U8, buffer_size);\n  for (U64 i = 0; i < voff_arr.count; ++i) {\n    U32 *voff_ptr = (U32*)(buffer + i * stride);\n    *voff_ptr = voff_arr.v[i];\n  }\n  \n  String8 guard_data = str8(buffer, buffer_size);\n  return guard_data;\n}\n\ninternal String8List\nlnk_build_guard_tables(TP_Context       *tp,\n                       LNK_SectionTable *sectab,\n                       LNK_SymbolTable  *symtab,\n                       U64               objs_count,\n                       LNK_Obj         **objs,\n                       COFF_MachineType  machine,\n                       String8           entry_point_name,\n                       LNK_GuardFlags    guard_flags,\n                       B32               emit_suppress_flag)\n{\n  NotImplemented;\n  String8List result = {0};\n  return result;\n#if 0\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  LNK_Section **sect_id_map = lnk_sect_id_map_from_section_table(scratch.arena, sectab);\n  \n  enum { GUARD_FIDS, GUARD_IATS, GUARD_LJMP, GUARD_EHCONT, GUARD_COUNT };\n  LNK_SymbolList guard_symbol_list_table[GUARD_COUNT]; MemoryZeroStruct(&guard_symbol_list_table[0]);\n  \n  // collect symbols from objs\n  for (LNK_ObjNode *obj_node = obj_list.first; obj_node != NULL; obj_node = obj_node->next) {\n    LNK_Obj *obj = &obj_node->data;\n    MSCRT_FeatFlags feat_flags = lnk_obj_get_features(obj);\n    B32 has_guard_flags = (feat_flags & MSCRT_FeatFlag_GUARD_CF) || (feat_flags & MSCRT_FeatFlag_GUARD_EH_CONT);\n    if (has_guard_flags) {\n      LNK_SymbolArray symbol_arr = lnk_symbol_array_from_list(scratch.arena, obj->symbol_list);\n      if (guard_flags & LNK_Guard_Cf) {\n        String8List gfids_list = lnk_collect_obj_chunks(scratch.arena, obj, str8_lit(\".gfids\"), str8_zero(), 1);\n        for (String8Node *node = gfids_list.first; node != 0; node = node->next) {\n          lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], node->string, symbol_arr);\n        }\n        String8List giats_list = lnk_collect_obj_chunks(scratch.arena, obj, str8_lit(\".giats\"), str8_zero(), 1);\n        for (String8Node *node = giats_list.first; node != 0; node = node->next) {\n          lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_IATS], node->string, symbol_arr);\n        }\n      }\n      if (guard_flags & LNK_Guard_LongJmp) {\n        String8List gljmp_list = lnk_obj_search_chunks(scratch.arena, obj, str8_lit(\".gljmp\"), str8_zero(), 1);\n        for (String8Node *node = gljmp_list.first; node != 0; node = node->next) {\n          lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_LJMP], node->string, symbol_arr);\n        }\n      }\n      if (guard_flags & LNK_Guard_EhCont) {\n        String8List gehcont_list = lnk_obj_search_chunks(scratch.arena, obj, str8_lit(\".gehcont\"), str8_zero(), 1);\n        for (String8Node *node = gehcont_list.first; node != 0; node = node->next) {\n          lnk_push_coff_symbols_from_data(scratch.arena, &guard_symbol_list_table[GUARD_EHCONT], node->string, symbol_arr);\n        }\n      }\n    } else {\n      // TODO: loop over COFF relocs\n      NotImplemented;\n#if 0\n      // use relocation data in code sections to get function symbols\n      for (U64 isect = 0; isect < obj->sect_count; ++isect) {\n        LNK_Chunk *chunk = obj->chunk_arr[isect];\n        if (!chunk) {\n          continue;\n        }\n        if (lnk_chunk_is_discarded(chunk)) {\n          continue;\n        }\n        if (~chunk->flags & COFF_SectionFlag_CntCode) {\n          continue;\n        }\n        Assert(chunk->type == LNK_Chunk_Leaf);\n        for (LNK_Reloc *reloc = obj->sect_reloc_list_arr[isect].first; reloc != 0; reloc = reloc->next) {\n          LNK_Symbol *symbol = lnk_resolve_symbol(symtab, reloc->symbol);\n          if (!LNK_Symbol_IsDefined(symbol->type)) {\n            continue;\n          }\n          LNK_DefinedSymbol *defined_symbol = &symbol->u.defined;\n          if (~defined_symbol->flags & LNK_DefinedSymbolFlag_IsFunc) {\n            continue;\n          }\n          LNK_Chunk *symbol_chunk = defined_symbol->u.chunk;\n          if (!symbol_chunk) {\n            continue;\n          }\n          if (symbol_chunk->type != LNK_Chunk_Leaf) {\n            continue;\n          }\n          if (~symbol_chunk->flags & COFF_SectionFlag_CntCode) {\n            continue;\n          }\n          lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], symbol);\n        }\n      }\n#endif\n    }\n  }\n  \n  // entry point\n  LNK_Symbol *entry_point_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, entry_point_name);\n  lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], entry_point_symbol);\n  \n  // push exports\n  {\n    Temp temp = temp_begin(scratch.arena);\n    KeyValuePair *raw_exports = key_value_pairs_from_hash_table(temp.arena, exptab->name_export_ht);\n    for (U64 i = 0; i < exptab->name_export_ht->count; ++i) {\n      LNK_Export *exp = raw_exports[i].value_raw;\n      lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], exp->symbol);\n    }\n    scratch_end(temp);\n  }\n  \n  // TODO: push noname exports\n  \n  NotImplemented;\n#if 0\n  // push thunks\n  LNK_SymbolScope scope_array[] = { LNK_SymbolScope_Defined, LNK_SymbolScope_Internal };\n  for (U64 iscope = 0; iscope < ArrayCount(scope_array); ++iscope) {\n    LNK_SymbolScope scope = scope_array[iscope];\n    for (U64 ibucket = 0; ibucket < symtab->bucket_count[scope]; ++ibucket) {\n      for (LNK_SymbolNode *symbol_node = symtab->buckets[scope][ibucket].first;\n           symbol_node != NULL;\n           symbol_node = symbol_node->next) {\n        LNK_Symbol *symbol = symbol_node->data;\n        if (!LNK_Symbol_IsDefined(symbol->type)) continue;\n        LNK_DefinedSymbol *defined_symbol = &symbol->u.defined;\n        if (~defined_symbol->flags & LNK_DefinedSymbolFlag_IsThunk) continue;\n        lnk_symbol_list_push(scratch.arena, &guard_symbol_list_table[GUARD_FIDS], symbol);\n      } \n    }\n  }\n#endif\n  \n  // build section data\n  lnk_section_table_build_data(tp, sectab, machine);\n  lnk_section_table_assign_virtual_offsets(sectab);\n  \n  // compute symbols virtual offsets\n  U64Array guard_voff_arr_table[GUARD_COUNT];\n  for (U64 i = 0; i < ArrayCount(guard_symbol_list_table); ++i) {\n    U64List voff_list; MemoryZeroStruct(&voff_list);\n    LNK_SymbolList symbol_list = guard_symbol_list_table[i];\n    for (LNK_SymbolNode *symbol_node = symbol_list.first; symbol_node != NULL; symbol_node = symbol_node->next) {\n      LNK_Symbol *symbol = lnk_resolve_symbol(symtab, symbol_node->data);\n      if (!LNK_Symbol_IsDefined(symbol->type)) {\n        continue;\n      }\n      LNK_DefinedSymbol *defined_symbol = &symbol->u.defined;\n      LNK_Chunk *chunk = defined_symbol->u.chunk;\n      if (!chunk) {\n        continue;\n      }\n      if (lnk_chunk_is_discarded(chunk)) {\n        continue;\n      }\n      U64 chunk_voff = lnk_virt_off_from_chunk_ref(sect_id_map, chunk->ref);\n      U64 symbol_voff = chunk_voff + defined_symbol->u.chunk_offset;\n      Assert(symbol_voff != 0);\n      u64_list_push(scratch.arena, &voff_list, symbol_voff);\n    }\n    U64Array voff_arr = u64_array_from_list(scratch.arena, &voff_list);\n    radsort(voff_arr.v, voff_arr.count, u64_compar_is_before);\n    guard_voff_arr_table[i] = u64_array_remove_duplicates(scratch.arena, voff_arr);\n  }\n  \n  // push guard sections\n  static struct {\n    char *name;\n    char *symbol;\n    int flags;\n  } sect_layout[] = {\n    { \".gfids\",   LNK_GFIDS_SYMBOL_NAME,   LNK_GFIDS_SECTION_FLAGS   },\n    { \".giats\",   LNK_GIATS_SYMBOL_NAME,   LNK_GIATS_SECTION_FLAGS   },\n    { \".gljmp\",   LNK_GLJMP_SYMBOL_NAME,   LNK_GLJMP_SECTION_FLAGS   },\n    { \".gehcont\", LNK_GEHCONT_SYMBOL_NAME, LNK_GEHCONT_SECTION_FLAGS },\n  };\n  for (U64 i = 0; i < ArrayCount(sect_layout); ++i) {\n    LNK_Section *sect = lnk_section_table_push(sectab, str8_cstring(sect_layout[i].name), sect_layout[i].flags);\n  }\n  \n  // TODO: emit table for SEH on X86\n  if (machine == COFF_MachineType_X86) {\n    lnk_not_implemented(\"__safe_se_handler_table\");\n    lnk_not_implemented(\"__safe_se_handler_count\");\n  }\n  \n  LNK_Symbol *gfids_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Internal, str8_lit(LNK_GFIDS_SYMBOL_NAME));\n  LNK_Symbol *giats_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Internal, str8_lit(LNK_GIATS_SYMBOL_NAME));\n  LNK_Symbol *gljmp_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Internal, str8_lit(LNK_GLJMP_SYMBOL_NAME));\n  LNK_Symbol *gehcont_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Internal, str8_lit(LNK_GEHCONT_SYMBOL_NAME));\n  \n  LNK_Section *gfids_sect = lnk_section_table_search_id(sectab, gfids_symbol->u.defined.u.chunk->ref.sect_id);\n  LNK_Section *giats_sect = lnk_section_table_search_id(sectab, giats_symbol->u.defined.u.chunk->ref.sect_id);\n  LNK_Section *gljmp_sect = lnk_section_table_search_id(sectab, gljmp_symbol->u.defined.u.chunk->ref.sect_id);\n  LNK_Section *gehcont_sect = lnk_section_table_search_id(sectab, gehcont_symbol->u.defined.u.chunk->ref.sect_id);\n  \n  LNK_Chunk *gfids_array_chunk = gfids_sect->root;\n  LNK_Chunk *giats_array_chunk = giats_sect->root;\n  LNK_Chunk *gljmp_array_chunk = gljmp_sect->root;\n  LNK_Chunk *gehcont_array_chunk = gehcont_sect->root;\n  \n  // first 4 bytes are call's destination virtual offset\n  U64 entry_stride = sizeof(U32);\n  if (emit_suppress_flag) {\n    // 4th byte tells kernel what to do when destination VA is not in the bitmap. \n    // If byte is 1 exception is suppressed and program keeps running.\n    // If zero then exception is raised with nt!_KiRaiseSecurityCheckFailure(FAST_FAIL_GUARD_ICALL_CHECK_FAILURE) and exception code 0xA.\n    entry_stride = 5;\n  }\n  \n  // make guard data from virtual offsets\n  String8 gfids_data   = lnk_build_guard_data(gfids_sect->arena, guard_voff_arr_table[GUARD_FIDS], entry_stride);\n  String8 giats_data   = lnk_build_guard_data(giats_sect->arena, guard_voff_arr_table[GUARD_IATS], entry_stride);\n  String8 gljmp_data   = lnk_build_guard_data(gljmp_sect->arena, guard_voff_arr_table[GUARD_LJMP], entry_stride);\n  String8 gehcont_data = lnk_build_guard_data(gehcont_sect->arena, guard_voff_arr_table[GUARD_EHCONT], entry_stride);\n  \n  // push guard data\n  lnk_section_push_chunk_data(gfids_sect, gfids_array_chunk, gfids_data, str8_zero());\n  lnk_section_push_chunk_data(giats_sect, giats_array_chunk, giats_data, str8_zero());\n  lnk_section_push_chunk_data(gljmp_sect, gljmp_array_chunk, gljmp_data, str8_zero());\n  lnk_section_push_chunk_data(gehcont_sect, gehcont_array_chunk, gehcont_data, str8_zero());\n  \n  LNK_Symbol *gflags_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_FLAGS_SYMBOL_NAME));\n  LNK_Symbol *gfids_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_FIDS_TABLE_SYMBOL_NAME));\n  LNK_Symbol *gfids_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_FIDS_COUNT_SYMBOL_NAME));\n  LNK_Symbol *giats_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_IAT_TABLE_SYMBOL_NAME));\n  LNK_Symbol *giats_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_IAT_COUNT_SYMBOL_NAME));\n  LNK_Symbol *gljmp_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_LONGJMP_TABLE_SYMBOL_NAME));\n  LNK_Symbol *gljmp_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_LONGJMP_COUNT_SYMBOL_NAME));\n  LNK_Symbol *gehcont_table_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_EHCONT_TABLE_SYMBOL_NAME));\n  LNK_Symbol *gehcont_count_symbol = lnk_symbol_table_search(symtab, LNK_SymbolScope_Main, str8_lit(MSCRT_GUARD_EHCONT_COUNT_SYMBOL_NAME));\n  \n  LNK_DefinedSymbol *gflags_def = &gflags_symbol->u.defined;\n  LNK_DefinedSymbol *gfids_table_def = &gfids_table_symbol->u.defined;\n  LNK_DefinedSymbol *gfids_count_def = &gfids_count_symbol->u.defined;\n  LNK_DefinedSymbol *giats_table_def = &giats_table_symbol->u.defined;\n  LNK_DefinedSymbol *giats_count_def = &giats_count_symbol->u.defined;\n  LNK_DefinedSymbol *gljmp_table_def = &gljmp_table_symbol->u.defined;\n  LNK_DefinedSymbol *gljmp_count_def = &gljmp_count_symbol->u.defined;\n  LNK_DefinedSymbol *gehcont_table_def = &gehcont_table_symbol->u.defined;\n  LNK_DefinedSymbol *gehcont_count_def = &gehcont_count_symbol->u.defined;\n  \n  // guard flags\n  gflags_def->value_type = LNK_DefinedSymbolValue_VA;\n  gflags_def->u.va = PE_LoadConfigGuardFlags_CF_INSTRUMENTED;\n  if ((guard_flags & LNK_Guard_Cf)) {\n    gflags_def->u.va |= PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_PRESENT;\n  }\n  if ((guard_flags & LNK_Guard_LongJmp) && guard_voff_arr_table[GUARD_LJMP].count) {\n    gflags_def->u.va |= PE_LoadConfigGuardFlags_CF_LONGJUMP_TABLE_PRESENT;\n  }\n  if ((guard_flags & LNK_Guard_EhCont) && guard_voff_arr_table[GUARD_EHCONT].count) {\n    gflags_def->u.va |= PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT;\n  }\n  {\n    LNK_Section *didat_sect = lnk_section_table_search(sectab, str8_lit(\".didat\"));\n    if (didat_sect) {\n      gflags_def->u.va |= PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION;\n    }\n  }\n  if (entry_stride > sizeof(U32)) {\n    U64 size_bit = (entry_stride - 5);\n    if (emit_suppress_flag) {\n      gflags_def->u.va |= PE_LoadConfigGuardFlags_CF_EXPORT_SUPPRESSION_INFO_PRESENT;\n    }\n    gflags_def->u.va |= (1 << size_bit) << PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT;\n  }\n  \n  // gfids\n  if (guard_voff_arr_table[GUARD_FIDS].count) {\n    gfids_table_def->value_type = LNK_DefinedSymbolValue_Chunk;\n    gfids_table_def->u.chunk = gfids_array_chunk;\n  }\n  gfids_count_def->value_type = LNK_DefinedSymbolValue_VA;\n  gfids_count_def->u.va = guard_voff_arr_table[GUARD_FIDS].count;\n  \n  // giats\n  if (guard_voff_arr_table[GUARD_IATS].count) {\n    giats_table_def->value_type = LNK_DefinedSymbolValue_Chunk;\n    giats_table_def->u.chunk = giats_array_chunk;\n  }\n  giats_count_def->value_type = LNK_DefinedSymbolValue_VA;\n  giats_count_def->u.va = guard_voff_arr_table[GUARD_IATS].count;\n  \n  // gljmp\n  if (guard_voff_arr_table[GUARD_LJMP].count) {\n    gljmp_table_def->value_type = LNK_DefinedSymbolValue_Chunk;\n    gljmp_table_def->u.chunk = gljmp_array_chunk;\n  }\n  gljmp_count_def->value_type = LNK_DefinedSymbolValue_VA;\n  gljmp_count_def->u.va = guard_voff_arr_table[GUARD_LJMP].count;\n  \n  // gehcont\n  if (guard_voff_arr_table[GUARD_EHCONT].count) {\n    gehcont_table_def->value_type = LNK_DefinedSymbolValue_Chunk;\n    gehcont_table_def->u.chunk = gehcont_array_chunk;\n  }\n  gehcont_count_def->value_type = LNK_DefinedSymbolValue_VA;\n  gehcont_count_def->u.va = guard_voff_arr_table[GUARD_EHCONT].count;\n  \n  scratch_end(scratch);\n  ProfEnd();\n#endif\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_virtual_offsets_and_sizes_in_obj_section_headers_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBeginV(\"Patch Virtual Offset And Size In Section Headers [%S]\", obj->path);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n    if (~sect_header->flags & COFF_SectionFlag_LnkRemove) {\n      LNK_SectionContrib *sc   = task->sect_map[obj_idx][sect_idx];\n      LNK_Section        *sect = task->image_sects.v[sc->u.sect_idx];\n      sect_header->vsize = lnk_size_from_section_contrib(sc);\n      sect_header->voff  = sect->voff + sc->u.off;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_file_offsets_and_sizes_in_obj_section_headers_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBeginV(\"Patch File Offsets And Sizes In Obj Section Headers [%S]\", obj->path);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n    B32 patch_section_header = (~sect_header->flags & COFF_SectionFlag_LnkRemove) &&\n                               (~sect_header->flags & LNK_SECTION_FLAG_DEBUG);\n    if (patch_section_header) {\n      LNK_SectionContrib *sc   = task->sect_map[obj_idx][sect_idx];\n      LNK_Section        *sect = task->image_sects.v[sc->u.sect_idx];\n      if (~sect->flags & COFF_SectionFlag_CntUninitializedData) {\n        sect_header->fsize = lnk_size_from_section_contrib(sc);\n        sect_header->foff  = sect->foff + sc->u.off;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_section_symbols_task)\n{\n  LNK_BuildImageTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n  LNK_Obj            *obj     = task->objs[obj_idx];\n\n  ProfBegin(\"Patch Section Symbols [%S]\", obj->path);\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n    if (interp == COFF_SymbolValueInterp_Undefined) {\n      if (symbol.storage_class == COFF_SymStorageClass_Section) {\n        LNK_Section *sect = lnk_section_table_search(task->sectab, symbol.name, symbol.value);\n        if (sect) {\n          if (~sect->flags & COFF_SectionFlag_MemDiscardable) {\n            LNK_SectionContrib *first_sc = lnk_get_first_section_contrib(sect);\n            if (obj->header.is_big_obj) {\n              COFF_Symbol32 *symbol32 = symbol.raw_symbol;\n              symbol32->section_number = safe_cast_u32(first_sc->u.sect_idx + 1);\n              symbol32->value          = first_sc->u.off;\n              symbol32->storage_class  = COFF_SymStorageClass_Static;\n            } else {\n              COFF_Symbol16 *symbol16 = symbol.raw_symbol;\n              symbol16->section_number = safe_cast_u16(first_sc->u.sect_idx + 1);\n              symbol16->value          = first_sc->u.off;\n              symbol16->storage_class  = COFF_SymStorageClass_Static;\n            }\n          } else {\n            lnk_error_obj(LNK_Error_SectRefsDiscardedMemory, obj, \"symbol %S (No. 0x%llx) references section with discard flag\", symbol.name, symbol_idx);\n          }\n        } else {\n          lnk_error_obj(LNK_Error_UnresolvedSymbol, obj, \"undefined section symbol %S (No 0x%llx) refers to an image section that doesn't exist\", symbol.name, symbol_idx);\n        }\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_gather_base_reloc_pages_task)\n{\n  LNK_BaseRelocsTask    *task       = raw_task;\n  HashTable             *page_ht    = task->gather.page_ht[worker_id];\n  LNK_BaseRelocPageList *pages      = &task->gather.pages[worker_id];\n  LNK_Obj               *obj        = task->gather.objs[task_id];\n  COFF_SectionHeader    *sect_table = lnk_coff_section_table_from_obj(obj);\n\n  ProfBeginV(\"%S\", obj->path);\n  for EachIndex(sect_idx, obj->header.section_count_no_null) {\n    COFF_SectionHeader *sect_header = &sect_table[sect_idx];\n    if (sect_header->flags & COFF_SectionFlag_LnkRemove) { continue; }\n\n    COFF_RelocArray relocs = lnk_coff_relocs_from_section_header(obj, sect_header);\n    for EachIndex(reloc_idx, relocs.count) {\n      COFF_Reloc *r = &relocs.v[reloc_idx];\n\n      COFF_ParsedSymbol          symbol        = lnk_parsed_symbol_from_coff_symbol_idx(obj, r->isymbol);\n      COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol);\n      if (symbol_interp == COFF_SymbolValueInterp_Abs) { continue; }\n\n      U64 is_addr = coff_is_addr_reloc(obj->header.machine, r->type);\n      if (is_addr == 0) { continue; }\n\n      U64                    reloc_voff = sect_header->voff + r->apply_off;\n      U64                    page_voff  = AlignDownPow2(reloc_voff, task->page_size);\n      LNK_BaseRelocPageNode *page       = hash_table_search_u64_raw(page_ht, page_voff);\n      if (page == 0) {\n        // fill out page\n        page         = push_array(arena, LNK_BaseRelocPageNode, 1);\n        page->v.voff = page_voff;\n        page->v.entries_addr32 = push_array(arena, U64List, 1);\n        page->v.entries_addr64 = push_array(arena, U64List, 1);\n\n        // push page\n        SLLQueuePush(pages->first, pages->last, page);\n        pages->count += 1;\n\n        // register page voff\n        hash_table_push_u64_raw(arena, page_ht, page_voff, page);\n      }\n\n      switch (is_addr) {\n      case 4: {\n        if (task->is_large_addr_aware) {\n          lnk_error_obj(LNK_Error_LargeAddrAwareRequired, obj, \"found out of range ADDR32 relocation for '%S', link with /LARGEADDRESSAWARE:NO\", symbol.name);\n        } else {\n          u64_list_push(arena, page->v.entries_addr32, reloc_voff);\n        }\n      } break;\n      case 8: {\n        u64_list_push(arena, page->v.entries_addr64, reloc_voff);\n      } break;\n      default: { InvalidPath; } break;\n      }\n    }\n\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_serialize_base_reloc_pages_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n\n  LNK_BaseRelocsTask *task    = raw_task;\n  HashTable          *voff_ht = hash_table_init(scratch.arena, task->page_size);\n\n  U64  voffs_max = task->page_size;\n  U32 *voffs32   = push_array(scratch.arena, U32, voffs_max);\n  U64 *voffs64   = push_array(scratch.arena, U64, voffs_max);\n\n  for EachInRange(page_idx, task->serialize.ranges[task_id]) {\n    LNK_BaseRelocPage *page = &task->serialize.pages.v[page_idx];\n\n    // filter out duplicate 32-bit virtual offsets\n    U64 voff_count32 = 0;\n    for EachNode(voff_n, U64Node, page->entries_addr32->first) {\n      if (hash_table_search_u64(voff_ht, voff_n->data)) { continue; }\n      hash_table_push_u64_u64(scratch.arena, voff_ht, voff_n->data, 0);\n      voffs32[voff_count32] = voff_n->data;\n      voff_count32 += 1;\n    }\n\n    // filter out duplicate 64-bit virtual offsets\n    U64 voff_count64 = 0;\n    for EachNode(voff_n, U64Node, page->entries_addr64->first) {\n      if (hash_table_search_u64(voff_ht, voff_n->data)) { continue; }\n      hash_table_push_u64_u64(scratch.arena, voff_ht, voff_n->data, 0);\n      voffs64[voff_count64] = voff_n->data;\n      voff_count64 += 1;\n    }\n\n    // gather step is not deterministic\n    radsort(voffs32, voff_count32, u32_is_before);\n    radsort(voffs64, voff_count64, u64_is_before);\n\n    // find block bytes in the buffer\n    void *block = task->serialize.buffer + page->buffer_offset;\n\n    // setup pointers into the block\n    U32 *page_voff_ptr  = block;\n    U32 *block_size_ptr = page_voff_ptr + 1;\n    U16 *reloc_arr_base = (U16 *)(block_size_ptr + 1);\n    U16 *reloc_arr_ptr = reloc_arr_base;\n\n    // write 32-bit relocation entries\n    for EachIndex(i, voff_count32) {\n      U64 rel_off = voffs32[i] - page->voff;\n      *reloc_arr_ptr = PE_BaseRelocMake(PE_BaseRelocKind_HIGHLOW, rel_off);\n      reloc_arr_ptr += 1;\n    }\n\n    // write 64-bit relocation entries\n    for EachIndex(i, voff_count64) {\n      U64 rel_off = voffs64[i] - page->voff;\n      *reloc_arr_ptr = PE_BaseRelocMake(PE_BaseRelocKind_DIR64, rel_off);\n      reloc_arr_ptr += 1;\n    }\n\n    // compute block size\n    U64 reloc_arr_size     = IntFromPtr(reloc_arr_ptr - reloc_arr_base) * sizeof(reloc_arr_ptr[0]);\n    U64 block_size         = sizeof(*page_voff_ptr) + sizeof(*block_size_ptr) + reloc_arr_size;\n    U64 block_size_aligned = AlignPow2(block_size, sizeof(U32));\n\n    // zero-out alignment\n    U64 align_size = block_size_aligned - block_size;\n    MemoryZero(reloc_arr_ptr, align_size);\n\n    // write page header\n    *page_voff_ptr  = safe_cast_u32(page->voff);\n    *block_size_ptr = safe_cast_u32(block_size_aligned);\n\n    // purge hash table for the next run\n    hash_table_purge(voff_ht);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal int\nlnk_base_reloc_page_is_before(void *raw_a, void *raw_b)\n{\n  return ((LNK_BaseRelocPage *)raw_a)->voff < ((LNK_BaseRelocPage *)raw_b)->voff;\n}\n\ninternal String8\nlnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config, U64 objs_count, LNK_Obj **objs)\n{\n  ProfBeginFunction();\n  Arena *arena   = tp_arena->v[0];\n  Temp   scratch = scratch_begin(tp_arena->v, tp_arena->count);\n  tp_arena->v[0] = scratch.arena;\n  TP_Temp tp_temp = tp_temp_begin(tp_arena);\n\n  LNK_BaseRelocsTask task  = {0};\n  task.page_size           = config->machine_page_size;\n  task.is_large_addr_aware = !!(config->file_characteristics & PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE);\n  \n  LNK_BaseRelocPageArray pages = {0};\n  {\n    LNK_BaseRelocPageList  *page_lists = push_array(scratch.arena, LNK_BaseRelocPageList, tp->worker_count);\n    HashTable             **page_ht    = push_array(scratch.arena, HashTable *,           tp->worker_count);\n    for EachIndex(i, tp->worker_count) { page_ht[i] = hash_table_init(scratch.arena, task.page_size/2); }\n\n    task.gather.objs    = objs;\n    task.gather.pages   = page_lists;\n    task.gather.page_ht = page_ht;\n    tp_for_parallel_prof(tp, tp_arena, objs_count, lnk_gather_base_reloc_pages_task, &task, \"Gather\");\n\n    ProfBegin(\"Merge Page Lists\");\n    LNK_BaseRelocPageList *main_page_list = &page_lists[0];\n    HashTable             *main_ht        = page_ht[0];\n    for (U64 list_idx = 1; list_idx < tp->worker_count; list_idx += 1) {\n      for (LNK_BaseRelocPageNode *src_page = page_lists[list_idx].first, *src_next; src_page != 0; src_page = src_next) {\n        src_next = src_page->next;\n\n        LNK_BaseRelocPageNode *page = hash_table_search_u64_raw(main_ht, src_page->v.voff);\n        if (page) {\n          // page exists, concat voffs\n          Assert(page != src_page);\n          u64_list_concat_in_place(page->v.entries_addr32, src_page->v.entries_addr32);\n          u64_list_concat_in_place(page->v.entries_addr64, src_page->v.entries_addr64);\n        } else {\n          // push page to the main list\n          SLLQueuePush(main_page_list->first, main_page_list->last, src_page);\n          main_page_list->count += 1;\n\n          // store lookup voff \n          hash_table_push_u64_raw(scratch.arena, main_ht, src_page->v.voff, src_page);\n        }\n      }\n    }\n    ProfEnd();\n\n    ProfBegin(\"Page List -> Array\");\n    pages.v = push_array_no_zero(scratch.arena, LNK_BaseRelocPage, main_page_list->count);\n    for EachNode(n, LNK_BaseRelocPageNode, main_page_list->first) { pages.v[pages.count++] = n->v; }\n    ProfEnd();\n  }\n\n  ProfBeginV(\"Sort Pages [Count %llu]\", pages.count);\n  radsort(pages.v, pages.count, lnk_base_reloc_page_is_before);\n  ProfEnd();\n  \n  String8 base_relocs = {0};\n  {\n    ProfBegin(\"Compute Buffer Size\");\n    U64 buffer_size = 0;\n    for EachIndex(page_idx, pages.count) {\n      LNK_BaseRelocPage *page = &pages.v[page_idx];\n      page->buffer_offset = buffer_size;\n      buffer_size += /* page base voff */ sizeof(U32) + /* size of block */ sizeof(U32); // header\n      buffer_size += sizeof(U16)*page->entries_addr32->count;                            // 32-bit voff entries\n      buffer_size += sizeof(U16)*page->entries_addr64->count;                            // 64-bit voff entries\n      buffer_size  = AlignPow2(buffer_size, sizeof(U32));\n    }\n    ProfEnd();\n\n    ProfBeginV(\"Alloc Buffer [%M]\", buffer_size);\n    U8 *buffer = push_array_no_zero(arena, U8, buffer_size);\n    ProfEnd();\n\n    task.serialize.buffer_size = buffer_size;\n    task.serialize.buffer      = buffer;\n    task.serialize.pages       = pages;\n    task.serialize.ranges      = tp_divide_work(scratch.arena, pages.count, tp->worker_count);\n    tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_serialize_base_reloc_pages_task, &task, \"Serialize\");\n\n    base_relocs = str8(task.serialize.buffer, task.serialize.buffer_size);\n  }\n\n  tp_temp_end(tp_temp); // scratch is cleared here\n  tp_arena->v[0] = arena;\n  ProfEnd();\n  return base_relocs;\n}\n\ninternal String8List\nlnk_build_win32_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config, LNK_SectionArray sects, U64 expected_image_header_size)\n{\n  ProfBeginFunction();\n\n  String8List result = {0};\n\n  //\n  // DOS header\n  //\n  U32 dos_stub_size = sizeof(PE_DosHeader) + pe_dos_program.size;\n  {\n    PE_DosHeader *dos_header          = push_array(arena, PE_DosHeader, 1);\n    dos_header->magic                 = PE_DOS_MAGIC;\n    dos_header->last_page_size        = dos_stub_size % 512;\n    dos_header->page_count            = CeilIntegerDiv(dos_stub_size, 512);\n    dos_header->paragraph_header_size = sizeof(PE_DosHeader) / 16;\n    dos_header->min_paragraph         = 0;\n    dos_header->max_paragraph         = 0;\n    dos_header->init_ss               = 0;\n    dos_header->init_sp               = 0;\n    dos_header->checksum              = 0;\n    dos_header->init_ip               = 0xFFFF;\n    dos_header->init_cs               = 0;\n    dos_header->reloc_table_file_off  = sizeof(PE_DosHeader);\n    dos_header->overlay_number        = 0;\n    MemoryZeroStruct(dos_header->reserved);\n    dos_header->oem_id                = 0;\n    dos_header->oem_info              = 0;\n    MemoryZeroArray(dos_header->reserved2);\n    dos_header->coff_file_offset      = dos_stub_size;\n\n    str8_list_push(arena, &result, str8_struct(dos_header));\n    str8_list_push(arena, &result, pe_dos_program);\n  }\n\n  //\n  // PE magic\n  //\n  U32 *pe_magic = push_array(arena, U32, 1);\n  *pe_magic = PE_MAGIC;\n  str8_list_push(arena, &result, str8_struct(pe_magic));\n\n  //\n  // determine PE optional header type\n  //\n  B32 has_pe_plus_header = pe_has_plus_header(config->machine);\n\n  //\n  // COFF file header\n  //\n  {\n    COFF_FileHeader *file_header      = push_array_no_zero(arena, COFF_FileHeader, 1);\n    file_header->machine              = config->machine;\n    file_header->time_stamp           = config->time_stamp;\n    file_header->symbol_table_foff    = 0;\n    file_header->symbol_count         = 0;\n    file_header->section_count        = sects.count;\n    file_header->optional_header_size = (has_pe_plus_header ? sizeof(PE_OptionalHeader32Plus) : sizeof(PE_OptionalHeader32)) + (sizeof(PE_DataDirectory) * config->data_dir_count);\n    file_header->flags                = config->file_characteristics;\n    str8_list_push(arena, &result, str8_struct(file_header));\n  }\n\n  //\n  // compute code/inited/uninited sizes\n  //\n  U64 code_base            = 0;\n  U64 sizeof_code          = 0;\n  U64 sizeof_inited_data   = 0;\n  U64 sizeof_uninited_data = 0;\n  U64 sizeof_image         = 0;\n  for (U64 sect_idx = 0; sect_idx < sects.count; sect_idx += 1) {\n    LNK_Section *sect = sects.v[sect_idx];\n    if (code_base == 0 && sect->flags & COFF_SectionFlag_CntCode) {\n      code_base = sect->voff;\n    }\n    if (sect->flags & COFF_SectionFlag_CntUninitializedData) {\n      sizeof_uninited_data += sect->vsize;\n    }\n    if ((sect->flags & COFF_SectionFlag_CntInitializedData) || (sect->flags & COFF_SectionFlag_CntCode)) {\n      sizeof_inited_data += sect->fsize;\n    }\n    if (sect->flags & COFF_SectionFlag_CntCode) { \n      sizeof_code += sect->fsize;\n    }\n    sizeof_image = Max(sizeof_image, sects.v[sect_idx]->voff + sects.v[sect_idx]->vsize);\n  }\n  sizeof_code          = AlignPow2(sizeof_code, config->file_align);\n  sizeof_inited_data   = AlignPow2(sizeof_inited_data, config->file_align);\n  sizeof_uninited_data = AlignPow2(sizeof_uninited_data, config->file_align);\n  sizeof_image         = AlignPow2(sizeof_image, 4096);\n\n  //\n  // compute image headers size\n  //\n  U64 sizeof_image_headers = 0;\n  sizeof_image_headers += dos_stub_size;\n  sizeof_image_headers += sizeof(COFF_FileHeader);\n  sizeof_image_headers += has_pe_plus_header ? sizeof(PE_OptionalHeader32Plus) : sizeof(PE_OptionalHeader32);\n  sizeof_image_headers += sizeof(PE_DataDirectory) * config->data_dir_count;\n  sizeof_image_headers += sizeof(COFF_SectionHeader) * sects.count;\n  sizeof_image_headers = AlignPow2(sizeof_image_headers, config->file_align);\n\n  //\n  // fill out PE optional header\n  //\n  U32 *entry_point_va;\n  U32 *check_sum;\n  if (has_pe_plus_header) {\n    PE_OptionalHeader32Plus *opt_header = push_array_no_zero(arena, PE_OptionalHeader32Plus, 1);\n    opt_header->magic                   = PE_PE32PLUS_MAGIC;\n    opt_header->major_linker_version    = config->link_ver.major;\n    opt_header->minor_linker_version    = config->link_ver.minor;\n    opt_header->sizeof_code             = safe_cast_u32(sizeof_code);\n    opt_header->sizeof_inited_data      = safe_cast_u32(sizeof_inited_data);\n    opt_header->sizeof_uninited_data    = safe_cast_u32(sizeof_uninited_data);\n    opt_header->entry_point_va          = 0;\n    opt_header->code_base               = code_base;\n    opt_header->image_base              = lnk_get_base_addr(config);\n    opt_header->section_alignment       = config->sect_align;\n    opt_header->file_alignment          = config->file_align;\n    opt_header->major_os_ver            = config->os_ver.major;\n    opt_header->minor_os_ver            = config->os_ver.minor;\n    opt_header->major_img_ver           = config->image_ver.major;\n    opt_header->minor_img_ver           = config->image_ver.minor;\n    opt_header->major_subsystem_ver     = config->subsystem_ver.major;\n    opt_header->minor_subsystem_ver     = config->subsystem_ver.minor;\n    opt_header->win32_version_value     = 0; // MSVC writes zero\n    opt_header->sizeof_image            = sizeof_image;\n    opt_header->sizeof_headers          = safe_cast_u32(sizeof_image_headers);\n    opt_header->check_sum               = 0; // :check_sum\n    opt_header->subsystem               = config->subsystem;\n    opt_header->dll_characteristics     = config->dll_characteristics;\n    opt_header->sizeof_stack_reserve    = config->stack_reserve;\n    opt_header->sizeof_stack_commit     = config->stack_commit;\n    opt_header->sizeof_heap_reserve     = config->heap_reserve;\n    opt_header->sizeof_heap_commit      = config->heap_commit;\n    opt_header->loader_flags            = 0; // for dynamic linker, always zero\n    opt_header->data_dir_count          = safe_cast_u32(config->data_dir_count);\n\n    entry_point_va = &opt_header->entry_point_va;\n    check_sum      = &opt_header->check_sum;\n\n    str8_list_push(arena, &result, str8_struct(opt_header));\n  } else {\n    NotImplemented;\n  }\n\n  //\n  // PE directories\n  //\n  PE_DataDirectory *directory_array;\n  {\n    directory_array = push_array(arena, PE_DataDirectory, config->data_dir_count);\n    str8_list_push(arena, &result, str8_array(directory_array, config->data_dir_count));\n  }\n\n  //\n  // COFF section table\n  //\n  COFF_SectionHeader *coff_section_table       = push_array(arena, COFF_SectionHeader, sects.count);\n  U64                 coff_section_table_count = 0;\n  {\n    for (U64 sect_idx = 0; sect_idx < sects.count; sect_idx += 1) {\n      LNK_Section *sect = sects.v[sect_idx];\n\n      COFF_SectionHeader *coff_section = &coff_section_table[sect_idx];\n\n      if (coff_section->flags & COFF_SectionFlag_LnkRemove) { continue; }\n\n      // TODO: for objs we can store long name in string table and write here /offset\n      if (sect->name.size > sizeof(coff_section->name)) {\n        lnk_error(LNK_Warning_LongSectionName, \"not enough space in COFF section header to store entire name \\\"%S\\\"\", sect->name);\n      }\n\n      MemorySet(&coff_section->name[0], 0, sizeof(coff_section->name));\n      MemoryCopy(&coff_section->name[0], sect->name.str, Min(sect->name.size, sizeof(coff_section->name)));\n      coff_section->vsize       = sect->vsize;\n      coff_section->voff        = sect->voff;\n      coff_section->fsize       = sect->fsize;\n      coff_section->foff        = sect->foff;\n      coff_section->relocs_foff = 0; // not present in image\n      coff_section->lines_foff  = 0; // obsolete\n      coff_section->reloc_count = 0; // not present in image\n      coff_section->line_count  = 0; // obsolete\n      coff_section->flags       = sect->flags;\n\n      coff_section_table_count += 1;\n    }\n\n    str8_list_push(arena, &result, str8_array(coff_section_table, coff_section_table_count));\n  }\n\n  // align image headers\n  {\n    U64 image_headers_align_size = AlignPadPow2(result.total_size, config->file_align);\n    U8 *image_headers_align      = push_array(arena, U8, image_headers_align_size);\n    str8_list_push(arena, &result, str8(image_headers_align, image_headers_align_size));\n  }\n\n  //\n  // entry point\n  //\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n\n    COFF_SectionHeader **section_table = push_array(arena, COFF_SectionHeader *, coff_section_table_count + 1);\n    for (U64 i = 1; i <= coff_section_table_count; i += 1) { section_table[i] = &coff_section_table[i-1]; }\n\n    LNK_Symbol *entry_symbol = lnk_symbol_table_search(symtab, config->entry_point_name);\n    if (entry_symbol) {\n      *entry_point_va = safe_cast_u32(lnk_voff_from_symbol(section_table, entry_symbol));\n    }\n\n    scratch_end(scratch);\n  }\n\n  Assert(result.total_size == expected_image_header_size);\n  ProfEnd();\n  return result;\n}\n\ninternal LNK_ImageContext\nlnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolTable *symtab, U64 objs_count, LNK_Obj **objs)\n{\n  ProfBegin(\"Image\");\n  lnk_timer_begin(LNK_Timer_Image);\n\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  //\n  // init section table\n  //\n  LNK_SectionTable *sectab = lnk_section_table_alloc();\n  lnk_section_table_push(sectab, str8_lit(\".text\" ), PE_TEXT_SECTION_FLAGS );\n  lnk_section_table_push(sectab, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS);\n  lnk_section_table_push(sectab, str8_lit(\".data\" ), PE_DATA_SECTION_FLAGS );\n  lnk_section_table_push(sectab, str8_lit(\".bss\"  ), PE_BSS_SECTION_FLAGS  );\n  lnk_section_table_push(sectab, str8_lit(\".pdata\"), PE_PDATA_SECTION_FLAGS);\n  LNK_Section *common_block_sect = lnk_section_table_search(sectab, str8_lit(\".bss\"), PE_BSS_SECTION_FLAGS);\n\n  LNK_BuildImageTask task = {\n    .symtab           = symtab,\n    .sectab           = sectab,\n    .objs_count       = objs_count,\n    .objs             = objs,\n    .function_pad_min = config->function_pad_min,\n    .default_align    = coff_default_align_from_machine(config->machine),\n    .null_sc          = push_array(arena->v[0], LNK_SectionContrib, 1),\n  };\n\n  {\n    ProfBegin(\"Define And Count Sections\");\n    TP_Temp temp = tp_temp_begin(arena);\n\n    ProfBegin(\"Init Hash Tables For Gathering Section Definitions\");\n    task.u.gather_sects.defns = push_array(arena->v[0], HashTable *, tp->worker_count);\n    for EachIndex(worker_id, tp->worker_count) { task.u.gather_sects.defns[worker_id] = hash_table_init(arena->v[0], 128); }\n    ProfEnd();\n\n    tp_for_parallel_prof(tp, arena, objs_count, lnk_gather_section_definitions_task, &task, \"Gather Section Definitions\");\n\n    ProfBegin(\"Merge Section Definitions Hash Tables\");\n    for (U64 worker_idx = 1; worker_idx < tp->worker_count; worker_idx += 1) {\n      U64                     sect_defns_count = task.u.gather_sects.defns[worker_idx]->count;\n      LNK_SectionDefinition **sect_defns       = values_from_hash_table_raw(arena->v[0], task.u.gather_sects.defns[worker_idx]);\n      radsort(sect_defns, sect_defns_count, lnk_section_definition_is_before);\n\n      for EachIndex(defn_idx, sect_defns_count) {\n        LNK_SectionDefinition *defn            = sect_defns[defn_idx];\n        String8                name_with_flags = lnk_make_name_with_flags(arena->v[0], defn->name, defn->flags);\n        LNK_SectionDefinition *main_defn       = hash_table_search_string_raw(task.u.gather_sects.defns[0], name_with_flags);\n        if (main_defn == 0) {\n          main_defn = sect_defns[defn_idx];\n          hash_table_push_string_raw(arena->v[0], task.u.gather_sects.defns[0], name_with_flags, main_defn);\n        } else {\n          if (lnk_section_definition_is_before(&sect_defns[defn_idx], &main_defn)) {\n            main_defn->obj = sect_defns[defn_idx]->obj;\n            main_defn->obj_sect_idx = sect_defns[defn_idx]->obj_sect_idx;\n          }\n          main_defn->contribs_count += sect_defns[defn_idx]->contribs_count;\n        }\n      }\n    }\n    U64                     sect_defns_count = task.u.gather_sects.defns[0]->count;\n    LNK_SectionDefinition **sect_defns       = values_from_hash_table_raw(arena->v[0], task.u.gather_sects.defns[0]);\n    ProfEnd();\n\n    ProfBegin(\"Sort Sections Definitions\");\n    radsort(sect_defns, sect_defns_count, lnk_section_definition_is_before);\n    ProfEnd();\n\n    ProfBegin(\"Push Sections And Reserve Section Contrib Memory\");\n    task.contribs_ht = hash_table_init(sectab->arena, sect_defns_count);\n    for EachIndex(defn_idx, sect_defns_count) {\n      LNK_SectionDefinition *sect_defn = sect_defns[defn_idx];\n\n      // parse section name\n      String8 sect_name, sort_idx;\n      coff_parse_section_name(sect_defn->name, &sect_name, &sort_idx);\n\n      // do not create definitions for sections that are removed from the image\n      if (lnk_is_section_removed(config, sect_name)) { continue; }\n\n      // warn about conflicting section flags\n      for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n        if (str8_match(sect_n->data.name, sect_name, 0) && sect_n->data.flags != sect_defn->flags) {\n          LNK_Obj            *obj                = sect_defn->obj;\n          U32                 sect_number        = sect_defn->obj_sect_idx + 1;\n          COFF_SectionHeader *sect_header        = lnk_coff_section_header_from_section_number(obj, sect_number);\n          String8             sect_name          = coff_name_from_section_header(str8_substr(obj->data, obj->header.string_table_range), sect_header);\n          String8             expected_flags_str = coff_string_from_section_flags(arena->v[0], sect_n->data.flags);\n          String8             current_flags_str  = coff_string_from_section_flags(arena->v[0], sect_defn->flags);\n          lnk_error_obj(LNK_Warning_SectionFlagsConflict, sect_defn->obj, \"detected section flags conflict in %S(No. %X); expected {%S} but got {%S}\", sect_name, sect_number, expected_flags_str, current_flags_str);\n        }\n      }\n\n      {\n        ProfBeginV(\"Reserve Section Contrib Chunks [%S]\", sect_defn->name);\n\n        LNK_Section *sect = lnk_section_table_search(sectab, sect_name, sect_defn->flags);\n        if (!sect) {\n          sect = lnk_section_table_push(sectab, sect_name, sect_defn->flags);\n        }\n\n        String8                  defn_name_with_flags = lnk_make_name_with_flags(sectab->arena, sect_defn->name, sect_defn->flags);\n        LNK_SectionContribChunk *contrib_chunk        = hash_table_search_string_raw(task.contribs_ht, defn_name_with_flags);\n        if (!contrib_chunk) {\n          contrib_chunk = lnk_section_contrib_chunk_list_push_chunk(arena->v[0], &sect->contribs, sect_defn->contribs_count, sort_idx);\n          hash_table_push_string_raw(sectab->arena, task.contribs_ht, defn_name_with_flags, contrib_chunk);\n        }\n        \n        ProfEnd();\n      }\n    }\n    ProfEnd();\n\n    tp_temp_end(temp);\n    ProfEnd();\n  }\n\n  U64 expected_image_header_size;\n  {\n    ProfBegin(\"Alloc Section Map\");\n    task.sect_map = push_array(scratch.arena, LNK_SectionContrib **, objs_count);\n    for EachIndex(obj_idx, objs_count) { task.sect_map[obj_idx] = push_array(scratch.arena, LNK_SectionContrib *, objs[obj_idx]->header.section_count_no_null); }\n    ProfEnd();\n\n    tp_for_parallel_prof(tp, 0, objs_count, lnk_gather_section_contribs_task, &task, \"Gather Section Contribs\");\n\n    // ensure determinism by sorting section contribs in chunks by input index\n    {\n      ProfBegin(\"Sort Section Contribs\");\n\n      U64 total_chunk_count = 0;\n      {\n        for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n          total_chunk_count += sect_n->data.contribs.chunk_count;\n        }\n      }\n\n      {\n        U64 cursor = 0;\n        task.u.sort_contribs.chunks = push_array(scratch.arena, LNK_SectionContribChunk *, total_chunk_count);\n        for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n          for (LNK_SectionContribChunk *chunk_n = sect_n->data.contribs.first; chunk_n != 0; chunk_n = chunk_n->next) {\n            task.u.sort_contribs.chunks[cursor++] = chunk_n;\n          }\n        }\n        Assert(cursor == total_chunk_count);\n      }\n\n      tp_for_parallel(tp, 0, total_chunk_count, lnk_sort_contribs_task, &task);\n\n      ProfEnd();\n    }\n\n    tp_for_parallel_prof(tp, 0, objs_count, lnk_set_comdat_leaders_contribs_task, &task, \"Update Section Map With COMDAT Leader Contribs\");\n\n    // build common block\n    //\n    // TODO: build common block in .bss and merge with .data\n    U64                     common_block_contribs_count;\n    LNK_CommonBlockContrib *common_block_contribs;\n    {\n      ProfBegin(\"Build Common Block\");\n\n      task.u.common_block.counts = push_array(scratch.arena, U64, tp->worker_count);\n      tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_count_common_block_contribs_task, &task, \"Count Contribs\");\n\n      ProfBegin(\"Push Contribs\");\n      common_block_contribs_count = sum_array_u64(tp->worker_count, task.u.common_block.counts);\n      common_block_contribs       = push_array(scratch.arena, LNK_CommonBlockContrib, common_block_contribs_count);\n      ProfEnd();\n\n      ProfBegin(\"Fill Out Contribs [%Iu64]\", common_block_contribs_count);\n      task.u.common_block.offsets  = offsets_from_counts_array_u64(scratch.arena, task.u.common_block.counts, tp->worker_count);\n      task.u.common_block.contribs = common_block_contribs;\n      tp_for_parallel(tp, 0, tp->worker_count, lnk_fill_out_common_block_contribs_task, &task);\n      ProfEnd();\n\n      if (common_block_contribs_count) {\n        ProfBeginV(\"Make Common Block [count %llu]\", common_block_contribs_count);\n\n        // sort common blocks from for tighter packing\n        radsort(common_block_contribs, common_block_contribs_count, lnk_common_block_contrib_is_before);\n\n        // compute .bss virtual size - this marks start of the common block\n        lnk_finalize_section_layout(common_block_sect, config->file_align, config->function_pad_min);\n        U64 common_block_cursor = common_block_sect->vsize;\n\n        // compute and assign offsets into the common block\n        for EachIndex(contrib_idx, common_block_contribs_count) {\n          LNK_CommonBlockContrib *contrib = &common_block_contribs[contrib_idx];\n          U32 size  = contrib->u.size;\n          U32 align = Min(32, u64_up_to_pow2(size)); // link.exe caps align at 32 bytes\n          common_block_cursor = AlignPow2(common_block_cursor, align);\n          contrib->u.offset = common_block_cursor;\n          common_block_cursor += size;\n        }\n\n        // append common block's contribution\n        LNK_SectionContribChunk *common_block_chunk = lnk_section_contrib_chunk_list_push_chunk(sectab->arena, &common_block_sect->contribs, 1, str8(0,0));\n        LNK_SectionContrib      *common_block_sc    = lnk_section_contrib_chunk_push(common_block_chunk, 1);\n        common_block_sc->u.obj_idx              = max_U32;\n        common_block_sc->u.obj_sect_idx         = max_U32;\n        common_block_sc->align                  = 1;\n        common_block_sc->first_data_node.next   = 0;\n        common_block_sc->first_data_node.string = str8(0, common_block_cursor - common_block_sect->vsize);\n        common_block_sc->last_data_node         = &common_block_sc->first_data_node;\n\n        ProfEnd();\n      }\n\n      ProfEnd();\n    }\n\n    {\n      ProfBegin(\"Finalize Sections Layout\");\n\n      // Grouped Sections (PE Format)\n      //  \"All contributions with the same object-section name are allocated contiguously in the image,\n      //  and the blocks of contributions are sorted in lexical order by object-section name.\" \n      ProfBegin(\"Sort Sections\");\n      for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n        lnk_sort_section_contribs(&sect_n->data);\n      }\n      ProfEnd();\n\n      // merge sections\n      if (config->flags & LNK_ConfigFlag_Merge) {\n        lnk_section_table_merge(sectab, config->merge_list);\n      }\n\n      if (config->do_function_pad_min == LNK_SwitchState_Yes) {\n        tp_for_parallel_prof(tp, arena, objs_count, lnk_flag_hotpatch_contribs_task, &task, \"Flag Hotpatch Section Contribs\");\n      }\n\n      // assign contribs offsets, sizes, and section indices\n      for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n        lnk_finalize_section_layout(&sect_n->data, config->file_align, config->function_pad_min);\n      }\n\n      // remove empty sections\n      {\n        String8List empty_sect_list = {0};\n        for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n          if (sect_n->data.vsize == 0) {\n            str8_list_push(scratch.arena, &empty_sect_list, sect_n->data.name);\n          }\n        }\n        for (String8Node *name_n = empty_sect_list.first; name_n != 0; name_n = name_n->next) {\n          lnk_section_table_purge(sectab, name_n->string);\n        }\n      }\n\n      // assign section indices to sections\n      for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n        lnk_assign_section_index(&sect_n->data, sectab->next_sect_idx++);\n      }\n\n      // assing layout offsets and sizes to merged sections\n      for (LNK_SectionNode *sect_n = sectab->merge_list.first; sect_n != 0; sect_n = sect_n->next) {\n        LNK_Section        *sect         = &sect_n->data;\n        LNK_SectionContrib *first_sc     = lnk_get_first_section_contrib(sect);\n        LNK_SectionContrib *last_sc      = lnk_get_last_section_contrib(sect);\n        U64                 last_sc_size = lnk_size_from_section_contrib(last_sc);\n        sect->voff  = sect->merge_dst->voff + first_sc->u.off;\n        sect->vsize = (last_sc->u.off - first_sc->u.off) + last_sc_size;\n        sect->foff  = sect->merge_dst->foff + first_sc->u.off;\n        sect->fsize = (last_sc->u.off - first_sc->u.off) + last_sc_size;\n        lnk_assign_section_index(sect, sect->merge_dst->sect_idx);\n      }\n\n      ProfEnd();\n    }\n\n    {\n      ProfBegin(\"Patch Symbol Tables\");\n      Temp temp = temp_begin(scratch.arena);\n\n      // set up context for patch tasks\n      task.u.patch_symtabs.common_block_sect     = common_block_sect;\n      task.u.patch_symtabs.common_block_ranges   = tp_divide_work(temp.arena, common_block_contribs_count, tp->worker_count);\n      task.u.patch_symtabs.common_block_contribs = common_block_contribs;\n      task.u.patch_symtabs.was_symbol_patched    = push_array(temp.arena, B8 *, objs_count);\n      for EachIndex(obj_idx, objs_count) { task.u.patch_symtabs.was_symbol_patched[obj_idx] = push_array(temp.arena, B8, objs[obj_idx]->header.symbol_count); }\n\n      // flag debug symbols to prevent them from being patched in subsequent passes\n      tp_for_parallel_prof(tp, 0, objs_count, lnk_flag_debug_symbols_task, &task, \"Flag Debug Symbols\");\n\n      // patch symbols\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_comdat_leaders_task,       &task, \"COMDAT Leaders\"      );\n      tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_patch_common_block_leaders_task, &task, \"Common Block Leaders\");\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_regular_symbols_task,      &task, \"Regular Symbols\"     );\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_common_symbols_task,       &task, \"Common Symbols\"      );\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_abs_symbols_task,          &task, \"Absolute Symbols\"    );\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_undefined_symbols_task,    &task, \"Undefined Symbols\"   );\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_weak_symbols_task,         &task, \"Weak Symbols\"        );\n      tp_for_parallel_prof(tp, 0, objs_count,       lnk_patch_undefined_symbols_task,    &task, \"Undefined Symbols\"   );\n\n      temp_end(temp);\n      ProfEnd();\n    }\n\n    // section list -> array\n    task.image_sects = lnk_section_array_from_list(scratch.arena, sectab->list);\n\n    // assign virtual offsets to sections\n    expected_image_header_size = lnk_compute_win32_image_header_size(config, task.image_sects.count);\n    U64 voff_cursor = AlignPow2(expected_image_header_size + sizeof(COFF_SectionHeader), config->sect_align);\n    for EachIndex(sect_idx, task.image_sects.count) { lnk_assign_section_virtual_space(task.image_sects.v[sect_idx], config->sect_align, &voff_cursor); }\n    tp_for_parallel_prof(tp, 0, task.objs_count, lnk_patch_virtual_offsets_and_sizes_in_obj_section_headers_task, &task, \"Patch Virtual Offsets and Sizes in Obj Section Headers\");\n\n    // build base relocs\n    if (~config->flags & LNK_ConfigFlag_Fixed) {\n      String8 base_relocs_data = lnk_build_base_relocs(tp, arena, config, objs_count, objs);\n      if (base_relocs_data.size) {\n        LNK_Section             *reloc          = lnk_section_table_push(sectab, str8_lit(\".reloc\"), PE_RELOC_SECTION_FLAGS);\n        LNK_SectionContribChunk *first_sc_chunk = lnk_section_contrib_chunk_list_push_chunk(sectab->arena, &reloc->contribs, 1, str8_zero());\n        LNK_SectionContrib      *sc             = lnk_section_contrib_chunk_push(first_sc_chunk, 1);\n        sc->first_data_node.string = base_relocs_data;\n        sc->last_data_node         = &sc->first_data_node;\n        sc->align                  = 1;\n        sc->u.obj_idx              = max_U32;\n\n        lnk_finalize_section_layout(reloc, config->file_align, config->function_pad_min);\n        lnk_assign_section_virtual_space(reloc, config->sect_align, &voff_cursor);\n        lnk_assign_section_index(reloc, sectab->next_sect_idx++);\n\n        task.image_sects           = lnk_section_array_from_list(scratch.arena, sectab->list);\n        expected_image_header_size = lnk_compute_win32_image_header_size(config, task.image_sects.count);\n      }\n    }\n\n    // assign file offsets to sections\n    U64 foff_cursor = AlignPow2(expected_image_header_size, config->file_align);\n    for EachIndex(sect_idx, task.image_sects.count) { lnk_assign_section_file_space(task.image_sects.v[sect_idx], &foff_cursor); }\n    tp_for_parallel_prof(tp, 0, task.objs_count, lnk_patch_file_offsets_and_sizes_in_obj_section_headers_task, &task, \"Patch File Offsets And Sizes In Section Headers\");\n  }\n\n  // build win32 image header\n  {\n    String8List              image_header_data     = lnk_build_win32_header(sectab->arena, symtab, config, task.image_sects, AlignPow2(expected_image_header_size, config->file_align));\n    LNK_Section             *image_header_sect     = lnk_section_table_push(sectab, str8_lit(\".rad_linker_image_header_section\"), 0);\n    LNK_SectionContribChunk *image_header_sc_chunk = lnk_section_contrib_chunk_list_push_chunk(sectab->arena, &image_header_sect->contribs, 1, str8_zero());\n    LNK_SectionContrib      *image_header_sc       = lnk_section_contrib_chunk_push(image_header_sc_chunk, 1);\n    image_header_sc->align           = config->file_align;\n    image_header_sc->first_data_node = *image_header_data.first;\n    image_header_sc->last_data_node  = image_header_data.last;\n    lnk_finalize_section_layout(image_header_sect, config->file_align, config->function_pad_min);\n  }\n\n  tp_for_parallel_prof(tp, 0, task.objs_count, lnk_patch_section_symbols_task, &task, \"Patch Section Symbols\");\n\n  String8 image_data = {0};\n  {\n    ProfBegin(\"Image Fill\");\n\n    ProfBeginV(\"Alloc Image Buffer [%M]\", lnk_section_table_total_fsize(sectab));\n    image_data.size = lnk_section_table_total_fsize(sectab);\n    image_data.str  = push_array_no_zero(arena->v[0], U8, image_data.size);\n    ProfEnd();\n\n    ProfBegin(\"Fill Align Bytes\");\n    for EachNode(sect_n, LNK_SectionNode, sectab->list.first) {\n      LNK_Section *sect = &sect_n->data;\n      ProfBeginV(\"Section: %S Size: %M\", sect->name, sect->fsize);\n      U8 fill_byte = sect->flags & COFF_SectionFlag_CntCode ? coff_code_align_byte_from_machine(config->machine) : 0;\n      MemorySet(image_data.str + sect->foff, fill_byte, sect->fsize);\n      ProfEnd();\n    }\n    ProfEnd();\n\n    Temp temp = temp_begin(scratch.arena);\n\n    ProfBegin(\"Prepare Worker Nodes\");\n    LNK_ImageFillNode **fill_nodes = push_array(scratch.arena, LNK_ImageFillNode *, tp->worker_count);\n    U64 worker_cap = 4096, worker_load = 0, worker_idx = 0;\n    for EachNode(sect_n, LNK_SectionNode, sectab->list.first) {\n      LNK_Section *sect = &sect_n->data;\n\n      // skip bss sections\n      if (sect->flags & COFF_SectionFlag_CntUninitializedData) { continue; }\n\n      for EachNode(sc_chunk, LNK_SectionContribChunk, sect->contribs.first) {\n        for (U64 sc_left = sc_chunk->count; sc_left > 0; ) {\n          U64 count  = Min(worker_cap - worker_load, sc_left);\n          U64 sc_pos = sc_chunk->count - sc_left;\n          sc_left -= count;\n\n          LNK_ImageFillNode *n = push_array(scratch.arena, LNK_ImageFillNode, 1);\n          n->base_foff = sect->foff;\n          n->sc_count  = count;\n          n->sc        = sc_chunk->v + sc_pos;\n          SLLStackPush(fill_nodes[worker_idx], n);\n\n          worker_load += count;\n          if (worker_load >= worker_cap) {\n            worker_load = 0;\n            worker_idx  = (worker_idx + 1) % tp->worker_count;\n          }\n        }\n      }\n    }\n    ProfEnd();\n\n    task.u.image_fill.image_data = image_data;\n    task.u.image_fill.fill_nodes = fill_nodes;\n    tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_image_fill_task, &task, \"Fill\");\n\n    temp_end(temp);\n\n    ProfEnd();\n  }\n\n  {\n    ProfBegin(\"Image Patch\");\n\n    PE_BinInfo           pe                  = pe_bin_info_from_data(scratch.arena, image_data);\n    COFF_SectionHeader **image_section_table = coff_section_table_from_data(scratch.arena, image_data, pe.section_table_range);\n\n    // patch relocs\n    {\n      LNK_ObjRelocPatcher task = { .image_data = image_data, .objs = objs, .image_base = pe.image_base, .image_section_table = image_section_table };\n      tp_for_parallel_prof(tp, 0, objs_count, lnk_obj_reloc_patcher, &task, \"Patch Relocs\");\n    }\n\n    // patch load config\n    {\n      LNK_Symbol *load_config_symbol = lnk_symbol_table_search(symtab, str8_lit(MSCRT_LOAD_CONFIG_SYMBOL_NAME));\n      if (load_config_symbol) {\n        U64     load_config_foff   = lnk_foff_from_symbol(image_section_table, load_config_symbol);\n        String8 load_config_data   = str8_skip(image_data, load_config_foff);\n\n        U32 load_config_size = 0;\n        if (sizeof(load_config_size) <= load_config_data.size) {\n          PE_DataDirectory *load_config_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_LOAD_CONFIG);\n          load_config_dir->virt_off  = lnk_voff_from_symbol(image_section_table, load_config_symbol);\n          load_config_dir->virt_size = load_config_size;\n        } else {\n          // TODO: report corrupted load config\n        }\n      }\n    }\n\n    // patch exceptions\n    {\n      LNK_Section *pdata_sect = lnk_section_table_search(sectab, str8_lit(\".pdata\"), PE_PDATA_SECTION_FLAGS);\n      if (pdata_sect) {\n        String8 raw_pdata = str8_substr(image_data, rng_1u64(pdata_sect->foff, pdata_sect->foff + pdata_sect->vsize));\n        pe_pdata_sort(config->machine, raw_pdata);\n\n        PE_DataDirectory *pdata_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_EXCEPTIONS);\n        pdata_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, pdata_sect);\n        pdata_dir->virt_size = lnk_get_section_contrib_size(pdata_sect);\n      }\n    }\n\n    // patch export\n    {\n      LNK_Section *edata_sect = lnk_section_table_search(sectab, str8_lit(\".edata\"), PE_EDATA_SECTION_FLAGS);\n      if (edata_sect) {\n        PE_DataDirectory   *export_dir          = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_EXPORT);\n        LNK_SectionContrib *edata_first_contrib = lnk_get_first_section_contrib(edata_sect);\n        LNK_SectionContrib *edata_last_contrib  = lnk_get_last_section_contrib(edata_sect);\n        export_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, edata_sect);\n        export_dir->virt_size = lnk_get_section_contrib_size(edata_sect);\n      }\n    }\n\n    // patch base relocs\n    {\n      LNK_Section *reloc_sect = lnk_section_table_search(sectab, str8_lit(\".reloc\"), PE_RELOC_SECTION_FLAGS);\n      if (reloc_sect) {\n        PE_DataDirectory *reloc_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_BASE_RELOC);\n        reloc_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, reloc_sect);\n        reloc_dir->virt_size = lnk_get_section_contrib_size(reloc_sect);\n      }\n    }\n\n    // patch import and import addr\n    {\n      LNK_Section *idata_sect       = lnk_section_table_search(sectab, str8_lit(\".idata\"), PE_IDATA_SECTION_FLAGS);\n      LNK_Symbol  *null_import_desc = lnk_symbol_table_searchf(symtab, \"__NULL_IMPORT_DESCRIPTOR\");\n      LNK_Symbol  *null_thunk_data  = lnk_symbol_table_searchf(symtab, \"\\x7f%S_NULL_THUNK_DATA\", lnk_get_image_name(config));\n      if (idata_sect && null_import_desc && null_thunk_data) {\n        COFF_ParsedSymbol   null_import_desc_parsed = lnk_parsed_from_symbol(null_import_desc);\n        LNK_SectionContrib *idata_first_contrib     = lnk_get_first_section_contrib(idata_sect);\n        PE_DataDirectory   *import_dir              = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_IMPORT);\n        import_dir->virt_off  = image_section_table[idata_first_contrib->u.sect_idx + 1]->voff + idata_first_contrib->u.off;\n        import_dir->virt_size = null_import_desc_parsed.value - idata_first_contrib->u.off;\n\n        COFF_ParsedSymbol  null_thunk_data_parsed = lnk_parsed_from_symbol(null_thunk_data);\n        U64                null_thunk_data_voff   = image_section_table[null_thunk_data_parsed.section_number]->voff + null_thunk_data_parsed.value;\n        U64                first_import_foff      = image_section_table[idata_first_contrib->u.sect_idx+1]->foff + idata_first_contrib->u.off;\n        PE_ImportEntry    *first_import           = str8_deserial_get_raw_ptr(image_data, first_import_foff, sizeof(*first_import));\n        PE_DataDirectory  *import_addr_dir        = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_IMPORT_ADDR);\n        import_addr_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, idata_sect);\n        import_addr_dir->virt_size = null_thunk_data_voff - first_import->import_addr_table_voff /* null */ + coff_word_size_from_machine(config->machine);\n      }\n    }\n\n    // patch delay imports\n    {\n      LNK_Section *didat_sect       = lnk_section_table_search(sectab, str8_lit(\".didat\"), PE_IDATA_SECTION_FLAGS);\n      LNK_Symbol  *null_import_desc = lnk_symbol_table_search(symtab, str8_lit(\"__NULL_DELAY_IMPORT_DESCRIPTOR\"));\n      LNK_Symbol  *last_null_thunk  = lnk_symbol_table_searchf(symtab,\"\\x7f%S_NULL_THUNK_DATA_DLA\", lnk_get_image_name(config));\n      if (didat_sect && null_import_desc && last_null_thunk) {\n        COFF_ParsedSymbol   null_import_desc_parsed = lnk_parsed_from_symbol(null_import_desc);\n        LNK_SectionContrib *didat_first_contrib     = lnk_get_first_section_contrib(didat_sect);\n        PE_DataDirectory   *import_dir              = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_DELAY_IMPORT);\n        import_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, didat_sect);\n        import_dir->virt_size = lnk_get_section_contrib_size(didat_sect);\n      }\n    }\n\n    // patch TLS\n    {\n      LNK_Symbol *tls_used_symbol = lnk_symbol_table_searchf(symtab, MSCRT_TLS_SYMBOL_NAME);\n      if (tls_used_symbol) {\n        ProfBegin(\"Patch TLS\");\n\n        // find max align in .tls\n        U64          tls_align = 0;\n        LNK_Section *tls_sect  = lnk_section_table_search(sectab, str8_lit(\".tls\"), PE_TLS_SECTION_FLAGS);\n        for (LNK_SectionContribChunk *sc_chunk = tls_sect->contribs.first; sc_chunk != 0; sc_chunk = sc_chunk->next) {\n          for EachIndex (sc_idx, sc_chunk->count) {\n            Assert(IsPow2(sc_chunk->v[sc_idx]->align));\n            tls_align = Max(tls_align, sc_chunk->v[sc_idx]->align);\n          }\n        }\n\n        // patch-in align\n        U64 tls_header_foff = lnk_foff_from_symbol(image_section_table, tls_used_symbol);\n        B32 is_tls_header64 = coff_word_size_from_machine(config->machine) == 8;\n        if (is_tls_header64) {\n          PE_TLSHeader64 *tls_header = str8_deserial_get_raw_ptr(image_data, tls_header_foff, sizeof(*tls_header));\n          tls_header->characteristics |= coff_section_flag_from_align_size(tls_align);\n        } else {\n          PE_TLSHeader32 *tls_header = str8_deserial_get_raw_ptr(image_data, tls_header_foff, sizeof(*tls_header));\n          tls_header->characteristics |= coff_section_flag_from_align_size(tls_align);\n        }\n\n        // patch directory\n        PE_DataDirectory *tls_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_TLS);\n        tls_dir->virt_off  = lnk_voff_from_symbol(image_section_table, tls_used_symbol);\n        tls_dir->virt_size = is_tls_header64 ? sizeof(PE_TLSHeader64) : sizeof(PE_TLSHeader32);\n\n        ProfEnd();\n      }\n    }\n\n    // patch debug\n    {\n      LNK_Section *debug_dir_sect = lnk_section_table_search(sectab, str8_lit(\".RAD_LINK_PE_DEBUG_DIR\"), PE_RDATA_SECTION_FLAGS);\n      if (debug_dir_sect) {\n        // patch directory\n        PE_DataDirectory *debug_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_DEBUG);\n        debug_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, debug_dir_sect);\n        debug_dir->virt_size = lnk_get_section_contrib_size(debug_dir_sect);\n\n        // find debug directory begin and end pair\n        LNK_SectionContrib *first_sc = lnk_get_first_section_contrib(debug_dir_sect);\n        LNK_SectionContrib *last_sc  = lnk_get_last_section_contrib(debug_dir_sect);\n        U64 debug_begin_foff = lnk_foff_from_section_contrib(image_section_table, first_sc);\n        U64 debug_end_fopl   = lnk_fopl_from_section_contrib(image_section_table, last_sc);\n\n        // patch file offsets to the debug directories\n        for (U64 cursor = debug_begin_foff; cursor + sizeof(PE_DebugDirectory) <= debug_end_fopl; cursor += sizeof(PE_DebugDirectory)) {\n          PE_DebugDirectory *dir = str8_deserial_get_raw_ptr(image_data, cursor, sizeof(PE_DebugDirectory));\n          for (U64 section_number = 1; section_number < pe.section_count+1; section_number += 1) {\n            if (image_section_table[section_number]->voff <= dir->voff && dir->voff < image_section_table[section_number]->voff + image_section_table[section_number]->vsize) {\n              dir->foff = image_section_table[section_number]->foff + (dir->voff - image_section_table[section_number]->voff);\n            }\n          }\n        }\n      }\n    }\n\n    // patch resources\n    {\n      LNK_Section *rsrc_sect = lnk_section_table_search(sectab, str8_lit(\".rsrc\"), PE_RSRC_SECTION_FLAGS);\n      if (rsrc_sect) {\n        PE_DataDirectory *rsrc_dir = pe_data_directory_from_idx(image_data, pe, PE_DataDirectoryIndex_RESOURCES);\n        rsrc_dir->virt_off  = lnk_get_first_section_contrib_voff(image_section_table, rsrc_sect);\n        rsrc_dir->virt_size = lnk_get_section_contrib_size(rsrc_sect);\n      }\n    }\n\n    // image checksum\n    if (config->flags & LNK_ConfigFlag_WriteImageChecksum) {\n      ProfBegin(\"Image Checksum\");\n      *pe.check_sum = pe_compute_checksum(image_data.str, image_data.size);\n      ProfEnd();\n    }\n\n    // compute image guid, and patch PDB and RDI guids\n    {\n      LNK_Symbol *guid_pdb_symbol = lnk_symbol_table_search(symtab, str8_lit(\"RAD_LINK_PE_DEBUG_GUID_PDB\"));\n      LNK_Symbol *guid_rdi_symbol = lnk_symbol_table_search(symtab, str8_lit(\"RAD_LINK_PE_DEBUG_GUID_RDI\"));\n\n      if (guid_pdb_symbol || guid_rdi_symbol) {\n        switch (config->guid_type) {\n        case LNK_DebugInfoGuid_Null: break;\n        case Lnk_DebugInfoGuid_ImageBlake3: {\n          ProfBegin(\"Hash Image With Blake3\");\n          U128 hash = lnk_blake3_hash_parallel(tp, 128, image_data);\n          MemoryCopy(&config->guid, hash.u8, sizeof(hash.u8));\n          ProfEnd();\n        } break;\n        }\n      }\n\n      if (guid_pdb_symbol) {\n        U64   cv_guid_foff = lnk_foff_from_symbol(image_section_table, guid_pdb_symbol);\n        Guid *cv_guid  = str8_deserial_get_raw_ptr(image_data, cv_guid_foff, sizeof(*cv_guid));\n        *cv_guid = config->guid;\n      }\n\n      if (guid_rdi_symbol) {\n        U64   cv_guid_foff = lnk_foff_from_symbol(image_section_table, guid_rdi_symbol);\n        Guid *cv_guid  = str8_deserial_get_raw_ptr(image_data, cv_guid_foff, sizeof(*cv_guid));\n        *cv_guid = config->guid;\n      }\n    }\n    \n    ProfEnd();\n  }\n\n  LNK_ImageContext image_ctx = {0};\n  image_ctx.image_data       = image_data;\n  image_ctx.sectab           = sectab;\n\n  lnk_timer_end(LNK_Timer_Image);\n  ProfEnd(); // :EndImage\n  scratch_end(scratch);\n  return image_ctx;\n}\n\ninternal PairU32 *\nlnk_obj_sect_idx_from_section(Arena *arena, U64 objs_count, LNK_Obj **objs, LNK_Section *sect, LNK_Config *config, U64 *obj_sect_idxs_count_out)\n{\n  U64 max_contribs = 0;\n  for (LNK_SectionContribChunk *chunk = sect->contribs.first; chunk != 0; chunk = chunk->next) {\n    max_contribs += chunk->count;\n  }\n\n  U64      obj_sect_idxs_count = 0;\n  PairU32 *obj_sect_idxs       = push_array(arena, PairU32, max_contribs);\n  for (U64 obj_idx = 0; obj_idx < objs_count; obj_idx += 1) {\n    LNK_Obj *obj = objs[obj_idx];\n    COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(obj->data, obj->header.section_table_range.min, 0);\n    String8             string_table  = str8_substr(obj->data, obj->header.string_table_range);\n    for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n      COFF_SectionHeader *section_header    = &section_table[sect_idx];\n      String8             full_section_name = coff_name_from_section_header(string_table, section_header);\n      String8             section_name, section_postfix;\n      coff_parse_section_name(full_section_name, &section_name, &section_postfix);\n\n      if (section_header->flags & COFF_SectionFlag_LnkRemove) { continue; }\n      if (section_header->fsize == 0)                         { continue; }\n      if (lnk_is_section_removed(config, section_name))       { continue; }\n\n      if (sect->voff <= section_header->voff && section_header->voff < sect->voff + sect->vsize) {\n        Assert(obj_sect_idxs_count < max_contribs);\n        obj_sect_idxs[obj_sect_idxs_count].v0 = obj_idx;\n        obj_sect_idxs[obj_sect_idxs_count].v1 = sect_idx;\n        obj_sect_idxs_count += 1;\n      }\n    }\n  }\n\n  U64 pop_size = (max_contribs - obj_sect_idxs_count) * sizeof(obj_sect_idxs[0]);\n  arena_pop(arena, pop_size);\n\n  *obj_sect_idxs_count_out = obj_sect_idxs_count;\n\n  return obj_sect_idxs;\n}\n\ninternal COFF_SectionHeader *\nlnk_coff_section_header_from_obj_sect_idx_pair(LNK_Obj **objs, PairU32 p)\n{\n  LNK_Obj            *obj           = objs[p.v0];\n  COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(obj->data, obj->header.section_table_range.min, 0);\n  return &section_table[p.v1];\n}\n\nglobal LNK_Obj **g_rad_map_objs;\n\ninternal int\nlnk_obj_sect_idx_is_before(void *raw_a, void *raw_b)\n{\n  PairU32 *a = raw_a, *b = raw_b;\n  COFF_SectionHeader *section_header_a = lnk_coff_section_header_from_obj_sect_idx_pair(g_rad_map_objs, *a);\n  COFF_SectionHeader *section_header_b = lnk_coff_section_header_from_obj_sect_idx_pair(g_rad_map_objs, *b);\n  return section_header_a->voff < section_header_b->voff;\n}\n\ninternal U64\nlnk_pair_u32_nearest_section(PairU32 *arr, U64 count, LNK_Obj **objs, U32 voff)\n{\n  U64 result = max_U64;\n\n  if (count > 0) {\n    COFF_SectionHeader *first = lnk_coff_section_header_from_obj_sect_idx_pair(objs, arr[0]);\n    if (first->voff == voff) {\n      return 0;\n    }\n\n    COFF_SectionHeader *last = lnk_coff_section_header_from_obj_sect_idx_pair(objs, arr[count-1]);\n    if (last->voff <= voff) {\n      return count - 1;\n    }\n\n    if (first->voff <= voff && voff < last->voff + last->vsize) {\n      U64 l = 0;\n      U64 r = count - 1;\n      for (; l <= r; ) {\n        U64 m = l + (r - l) / 2;\n        COFF_SectionHeader *s = lnk_coff_section_header_from_obj_sect_idx_pair(objs, arr[m]);\n        if (s->voff == voff) {\n          return m;\n        } else if (s->voff < voff) {\n          l = m + 1;\n        } else {\n          r = m - 1;\n        }\n      }\n      result = l;\n    }\n  }\n\n  return result;\n}\n\ninternal String8List\nlnk_build_rad_map(Arena *arena, String8 image_data, LNK_Config *config, U64 objs_count, LNK_Obj **objs, U64 libs_count, LNK_Lib **libs, LNK_SectionTable *sectab)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  PE_BinInfo           pe                  = pe_bin_info_from_data(scratch.arena, image_data);\n  COFF_SectionHeader **image_section_table = coff_section_table_from_data(scratch.arena, image_data, pe.section_table_range);\n\n  String8List map = {0};\n\n  ProfBegin(\"SECTIONS\");\n  str8_list_pushf(arena, &map, \"# SECTIONS\\n\");\n  for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n    LNK_Section *sect = &sect_n->data;\n\n    str8_list_pushf(arena, &map, \"%S\\n\", sect->name);\n    str8_list_pushf(arena, &map, \"%-4s %-8s %-8s %-8s %-8s %-16s %-4s %s\\n\", \"No.\", \"VirtOff\", \"VirtSize\", \"FileOff\", \"FileSize\", \"Blake3\", \"Algn\", \"SC\");\n\n    U64      obj_sect_idxs_count = 0;\n    PairU32 *obj_sect_idxs       = lnk_obj_sect_idx_from_section(scratch.arena, objs_count, objs, sect, config, &obj_sect_idxs_count);\n    g_rad_map_objs = objs;\n    radsort(obj_sect_idxs, obj_sect_idxs_count, lnk_obj_sect_idx_is_before);\n\n    U64 global_sc_idx = 0;\n    for (LNK_SectionContribChunk *sc_chunk = sect->contribs.first; sc_chunk != 0; sc_chunk = sc_chunk->next) {\n      for (U64 sc_idx = 0; sc_idx < sc_chunk->count; sc_idx += 1, global_sc_idx += 1) {\n        Temp temp = temp_begin(scratch.arena);\n        LNK_SectionContrib *sc = sc_chunk->v[sc_idx];\n\n        U64        file_off   = image_section_table[sc->u.sect_idx+1]->foff + sc->u.off;\n        U64        virt_off   = image_section_table[sc->u.sect_idx+1]->voff + sc->u.off;\n        U64        virt_size  = lnk_size_from_section_contrib(sc);\n        U64        file_size  = lnk_size_from_section_contrib(sc);\n        String8    sc_data    = str8_substr(image_data, rng_1u64(file_off, file_off + virt_size));\n\n        LNK_Obj *obj      = 0;\n        U32      sect_idx = 0;\n        U64 obj_sect_idx_idx = lnk_pair_u32_nearest_section(obj_sect_idxs, obj_sect_idxs_count, objs, virt_off);\n        if (obj_sect_idx_idx < obj_sect_idxs_count) {\n          obj      = objs[obj_sect_idxs[obj_sect_idx_idx].v0];\n          sect_idx = obj_sect_idxs[obj_sect_idx_idx].v1;\n        }\n\n        U128 sc_hash = {0};\n        if (~sect->flags & COFF_SectionFlag_CntUninitializedData) {\n          blake3_hasher hasher; blake3_hasher_init(&hasher);\n          blake3_hasher_update(&hasher, sc_data.str, sc_data.size);\n          blake3_hasher_finalize(&hasher, (U8 *)&sc_hash, sizeof(sc_hash));\n        }\n\n        String8 sc_idx_str    = push_str8f(temp.arena, \"%4llx\",      global_sc_idx);\n        String8 virt_size_str = push_str8f(temp.arena, \"%08x\",       virt_size);\n        String8 sc_hash_str   = (~sect->flags & COFF_SectionFlag_CntUninitializedData) ? push_str8f(temp.arena, \"%08x%08x\",   sc_hash.u64[0], sc_hash.u64[1]) : str8_lit(\"--------\");\n        String8 file_off_str  = (~sect->flags & COFF_SectionFlag_CntUninitializedData) ? push_str8f(temp.arena, \"%08x\", file_off)  : str8_lit(\"--------\");\n        String8 file_size_str = (~sect->flags & COFF_SectionFlag_CntUninitializedData) ? push_str8f(temp.arena, \"%08x\", file_size) : str8_lit(\"--------\");\n        String8 virt_off_str  = push_str8f(temp.arena, \"%08x\",       virt_off);\n        String8 align_str     = push_str8f(temp.arena, \"%4x\",        sc->align);\n        String8 contrib_str;\n        {\n          String8List source_list = {0};\n          if (obj) {\n            COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, sect_idx+1);\n            String8             string_table   = str8_substr(obj->data, obj->header.string_table_range);\n            String8             section_name   = coff_name_from_section_header(string_table, section_header);\n            LNK_Lib            *lib            = lnk_obj_get_lib(obj);\n            if (lib) {\n              String8 lib_name = str8_chop_last_dot(str8_skip_last_slash(lib->path));\n              String8 obj_name = str8_skip_last_slash(obj->path);\n              str8_list_pushf(temp.arena, &source_list, \"%S(%S) SECT%X (%S)\", lib_name, obj_name, sect_idx+1, section_name);\n            } else {\n              str8_list_pushf(temp.arena, &source_list, \"%S SECT%X (%S)\", obj->path, sect_idx+1, section_name);\n            }\n          } else {\n            str8_list_pushf(temp.arena, &source_list, \"<no_loc>\");\n          }\n          contrib_str = str8_list_join(temp.arena, &source_list, &(StringJoin){.sep=str8_lit(\" \")});\n        }\n\n        str8_list_pushf(arena, &map, \"%S %S %S %S %S %S %S %S\\n\", sc_idx_str, virt_off_str, virt_size_str, file_off_str, file_size_str, sc_hash_str, align_str, contrib_str);\n\n        temp_end(temp);\n      }\n    }\n    str8_list_pushf(arena, &map, \"\\n\");\n  }\n  ProfEnd();\n\n  str8_list_pushf(arena, &map, \"# DEBUG\\n\");\n  for (U64 obj_idx = 0; obj_idx < objs_count; obj_idx += 1) {\n    LNK_Obj            *obj           = objs[obj_idx];\n    COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(obj->data, obj->header.section_table_range.min, 0);\n    for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n      COFF_SectionHeader *section_header = &section_table[sect_idx];\n      if (~section_header->flags & COFF_SectionFlag_LnkRemove && section_header->flags & LNK_SECTION_FLAG_DEBUG) {\n        LNK_Lib *lib = lnk_obj_get_lib(obj);\n        if (lib) {\n          String8 lib_name = str8_chop_last_dot(str8_skip_last_slash(lib->path));\n          String8 obj_name = str8_skip_last_slash(obj->path);\n          str8_list_pushf(arena, &map, \"%S(%S) SECT%X\\n\", lib_name, obj_name, sect_idx+1);\n        } else {\n          str8_list_pushf(arena, &map, \"%S SECT%X\\n\", obj->path, sect_idx+1);\n        }\n      }\n    }\n  }\n  str8_list_pushf(arena, &map, \"\\n\");\n\n  ProfBegin(\"LIBS\");\n  if (libs_count) {\n    str8_list_pushf(arena, &map, \"# LIBS\\n\");\n    for EachIndex(i, libs_count) {\n      str8_list_pushf(arena, &map, \"%S\\n\", libs[i]->path);\n    }\n  }\n  ProfEnd();\n \n  scratch_end(scratch);\n  ProfEnd();\n  return map;\n}\n\ninternal void\nlnk_write_thread(void *raw_ctx)\n{\n  ProfBeginFunction();\n  LNK_WriteThreadContext *ctx = raw_ctx;\n  lnk_write_data_to_file_path(ctx->path, ctx->temp_path, ctx->data);\n  ProfEnd();\n}\n\ninternal void\nlnk_log_timers(void)\n{\n  Temp scratch = scratch_begin(0, 0);\n  \n  U64 total_build_time_micro = 0;\n  for (U64 i = 0; i < LNK_Timer_Count; ++i) {\n    total_build_time_micro += g_timers[i].end - g_timers[i].begin;\n  }\n  \n  String8List output_list = {0};\n  str8_list_pushf(scratch.arena, &output_list, \"------ Link Times --------------------------------------------------------------\");\n  for (U64 i = 0; i < LNK_Timer_Count; ++i) {\n    U64 build_time_micro = g_timers[i].end - g_timers[i].begin;\n    if (build_time_micro != 0) {\n      String8  timer_name = lnk_string_from_timer_type(i);\n      DateTime time       = date_time_from_micro_seconds(build_time_micro);\n      String8  time_str   = string_from_elapsed_time(scratch.arena, time);\n      str8_list_pushf(scratch.arena, &output_list, \"  %-5S Time: %S\", timer_name, time_str);\n    }\n  }\n  \n  DateTime total_time = date_time_from_micro_seconds(total_build_time_micro);\n  String8 total_time_str = string_from_elapsed_time(scratch.arena, total_time);\n  str8_list_pushf(scratch.arena, &output_list, \"  Total Time: %S\", total_time_str);\n  \n  StringJoin new_line_join = { str8_lit_comp(\"\"), str8_lit_comp(\"\\n\"), str8_lit_comp(\"\") };\n  String8 output = str8_list_join(scratch.arena, &output_list, &new_line_join);\n  lnk_log(LNK_Log_Timers, \"%S\\n\", output);\n  \n  scratch_end(scratch);\n}\n\ninternal void\nlnk_run(TP_Context *tp, TP_Arena *arena, LNK_Config *config)\n{\n  ProfBeginFunction();\n\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  //\n  // Input Context\n  //\n  LNK_Inputer *inputer = lnk_inputer_init();\n\n  //\n  // Symbol Table\n  //\n  LNK_SymbolTable *symtab = lnk_symbol_table_init(arena);\n\n  //\n  // Link Image\n  //\n  LNK_Link *link = lnk_link_image(tp, arena, config, inputer, symtab);\n\n  U64       objs_count = link->objs.count;\n  U64       libs_count = link->libs.count;\n  LNK_Obj **objs       = lnk_array_from_obj_list(scratch.arena, link->objs);\n  LNK_Lib **libs       = lnk_array_from_lib_list(scratch.arena, link->libs);\n\n  //\n  // Layout Image\n  //\n  LNK_ImageContext image_ctx = lnk_build_image(arena, tp, config, symtab, objs_count, objs);\n\n  // Write image in the background\n  LNK_WriteThreadContext *image_write_ctx = push_array(scratch.arena, LNK_WriteThreadContext, 1);\n  image_write_ctx->path      = config->image_name;\n  image_write_ctx->temp_path = config->temp_image_name;\n  image_write_ctx->data      = image_ctx.image_data;\n  Thread image_write_thread = thread_launch(lnk_write_thread, image_write_ctx);\n\n  //\n  // RAD Map\n  //\n  if (config->rad_chunk_map == LNK_SwitchState_Yes) {\n    String8List rad_map = lnk_build_rad_map(scratch.arena, image_ctx.image_data, config, objs_count, objs, libs_count, libs, image_ctx.sectab);\n    lnk_write_data_list_to_file_path(config->rad_chunk_map_name, config->temp_rad_chunk_map_name, rad_map);\n  }\n\n  //\n  // Import Library\n  //\n  if (config->build_imp_lib && (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL)) {\n    ProfBegin(\"Build Import Library\");\n    lnk_timer_begin(LNK_Timer_Lib);\n    String8 linker_debug_symbols = lnk_make_linker_debug_symbols(scratch.arena, config->machine);\n    String8 lib                  = pe_make_import_lib(arena->v[0], config->machine, config->time_stamp, str8_skip_last_slash(config->image_name), linker_debug_symbols, config->export_symbol_list);\n    lnk_write_data_to_file_path(config->imp_lib_name, str8_zero(), lib);\n    lnk_timer_end(LNK_Timer_Lib);\n    ProfEnd();\n  }\n\n  //\n  // Debug Info\n  //\n  if (lnk_do_debug_info(config)) {\n    ProfBegin(\"Debug Info\");\n    lnk_timer_begin(LNK_Timer_Debug);\n\n    U64       debug_info_objs_count = 0;\n    LNK_Obj **debug_info_objs       = push_array(scratch.arena, LNK_Obj *, objs_count);\n    for EachIndex(obj_idx, objs_count) {\n      LNK_Obj *obj = objs[obj_idx];\n      if (obj->exclude_from_debug_info) { continue; }\n      debug_info_objs[debug_info_objs_count++] = obj;\n    }\n\n    //\n    // CodeView\n    //\n    LNK_CodeViewInput input = lnk_make_code_view_input(tp, arena, config->io_flags, config->lib_dir_list, config->alt_pch_dirs, debug_info_objs_count, debug_info_objs);\n    CV_DebugT        *types = lnk_import_types(tp, arena, &input);\n\n    //\n    // RDI\n    //\n    if (config->rad_debug == LNK_SwitchState_Yes) {\n      lnk_timer_begin(LNK_Timer_Rdi);\n\n      String8List rdi_data = lnk_build_rad_debug_info(tp,\n                                                      arena,\n                                                      config->target_os,\n                                                      rdi_arch_from_coff_machine(config->machine),\n                                                      config->image_name,\n                                                      image_ctx.image_data,\n                                                      input.count,\n                                                      input.obj_arr,\n                                                      input.debug_s_arr,\n                                                      input.total_symbol_input_count,\n                                                      input.symbol_inputs,\n                                                      input.parsed_symbols,\n                                                      types);\n\n      lnk_write_data_list_to_file_path(config->rad_debug_name, config->temp_rad_debug_name, rdi_data);\n\n      lnk_timer_end(LNK_Timer_Rdi);\n    }\n\n    //\n    // PDB\n    //\n    // TODO: Parallel debug info builds are currently blocked by the patch\n    // strings in $$FILE_CHECKSUM step in `lnk_process_c13_data_task`.\n    if (config->debug_mode == LNK_DebugMode_Full) {\n      lnk_timer_begin(LNK_Timer_Pdb);\n\n      if (config->pdb_hash_type_names != LNK_TypeNameHashMode_Null && config->pdb_hash_type_names != LNK_TypeNameHashMode_None) {\n        lnk_replace_type_names_with_hashes(tp, arena, types[CV_TypeIndexSource_TPI], config->pdb_hash_type_names, config->pdb_hash_type_name_length, config->pdb_hash_type_name_map);\n      }\n\n      String8List pdb_data = lnk_build_pdb(tp,\n                                           arena,\n                                           image_ctx.image_data,\n                                           config,\n                                           symtab,\n                                           input.count,\n                                           input.obj_arr,\n                                           input.debug_s_arr,\n                                           input.total_symbol_input_count,\n                                           input.symbol_inputs,\n                                           input.parsed_symbols,\n                                           types);\n\n      lnk_write_data_list_to_file_path(config->pdb_name, config->temp_pdb_name, pdb_data);\n      lnk_timer_end(LNK_Timer_Pdb);\n    }\n\n    lnk_timer_end(LNK_Timer_Debug);\n    ProfEnd();\n  }\n\n  // wait for the thread to finish writing image to disk\n  thread_join(image_write_thread, -1);\n\n  //\n  // Timers\n  //\n  if (lnk_get_log_status(LNK_Log_Timers)) {\n    lnk_log_timers();\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nentry_point(CmdLine *cmdline)\n{\n  Temp scratch = scratch_begin(0,0);\n  lnk_init_error_handler();\n  LNK_Config *config   = lnk_config_from_argcv(scratch.arena, cmdline->argc, cmdline->argv);\n  TP_Context *tp       = tp_alloc(scratch.arena, config->worker_count, config->max_worker_count, config->shared_thread_pool_name);\n  TP_Arena   *tp_arena = tp_arena_alloc(tp);\n  lnk_run(tp, tp_arena, config);\n  scratch_end(scratch);\n}\n\n"
  },
  {
    "path": "src/linker/lnk.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n// --- Input -------------------------------------------------------------------\n\ntypedef struct LNK_LibMemberRef\n{\n  LNK_Lib *lib;\n  U32      member_idx;\n  struct LNK_LibMemberRef *next;\n} LNK_LibMemberRef;\n\ntypedef struct LNK_LibMemberRefList\n{\n  U64               count;\n  LNK_LibMemberRef *first;\n  LNK_LibMemberRef *last;\n} LNK_LibMemberRefList;\n\ntypedef enum\n{\n  LNK_InputSource_CmdLine, // specified on command line\n  LNK_InputSource_Default, // specified through defaultlib switch\n  LNK_InputSource_Obj,     // refrenced from objects\n  LNK_InputSource_Count\n} LNK_InputSourceType;\n\ntypedef struct LNK_Input\n{\n  String8           path;\n  String8           data;\n  B32               disallow;\n  B32               is_thin;\n  B32               has_disk_read_failed;\n  B32               exclude_from_debug_info;\n  LNK_LibMemberRef *link_member;\n  void             *loaded_input;\n\n  struct LNK_Input *next;\n} LNK_Input;\n\ntypedef struct LNK_InputList\n{\n  U64        count;\n  LNK_Input *first;\n  LNK_Input *last;\n} LNK_InputList;\n\ntypedef struct LNK_InputPtrArray\n{\n  U64         count;\n  LNK_Input **v;\n} LNK_InputPtrArray;\n\ntypedef struct LNK_Inputer\n{\n  Arena *arena;\n\n  LNK_InputList  objs;\n  HashTable     *objs_ht;\n  LNK_InputList  new_objs;\n\n  HashTable     *libs_ht;\n  HashTable     *missing_lib_ht;\n  LNK_InputList  libs;\n  LNK_InputList  new_libs[LNK_InputSource_Count];\n} LNK_Inputer;\n\n// --- Image Link -------------------------------------------------------------\n\n#define LNK_IMPORT_STUB \"*** RAD_IMPORT_STUB ***\"\n#define LNK_NULL_SYMBOL \"*** RAD_NULL_SYMBOL ***\"\n\n#define LNK_SECTION_FLAG_LIVE    (1 << 0)\n#define LNK_SECTION_FLAG_DEBUG (1 << 1)\n\ntypedef struct LNK_Link\n{\n  LNK_ObjList              objs;\n  LNK_LibList              libs;\n  LNK_ObjNode            **last_symbol_input;\n  LNK_IncludeSymbolNode  **last_include;\n  String8Node            **last_cmd_lib;\n  String8Node            **last_default_lib;\n  String8Node            **last_obj_lib;\n  LNK_LibMemberRefList     imports;\n  B32                      try_to_resolve_entry_point;\n} LNK_Link;\n\n// -- Image Layout ------------------------------------------------------------\n\n#define LNK_REMOVED_SECTION_NUMBER_32 (U32)-3\n#define LNK_REMOVED_SECTION_NUMBER_16 (U16)-3\n\ntypedef struct LNK_ImageContext\n{\n  String8           image_data;\n  LNK_SectionTable *sectab;\n} LNK_ImageContext;\n\ntypedef struct LNK_SectionDefinition\n{\n  String8           name;\n  COFF_SectionFlags flags;\n  U64               contribs_count;\n  struct LNK_Obj   *obj;\n  U64               obj_sect_idx;\n} LNK_SectionDefinition;\n\ntypedef struct LNK_CommonBlockContrib\n{\n  struct LNK_Symbol *symbol;\n  union {\n    U32 size;\n    U32 offset;\n  } u;\n} LNK_CommonBlockContrib;\n\n// --- Ref ---------------------------------------------------------------------\n\n#define LNK_RELOCS_PER_TASK 0x1000\n\ntypedef struct LNK_RelocRefs\n{\n  LNK_Obj         *obj;\n  COFF_RelocArray  relocs;\n} LNK_RelocRefs;\n\ntypedef struct LNK_RelocRefsNode\n{\n  LNK_RelocRefs *v;\n  struct LNK_RelocRefsNode *next;\n} LNK_RelocRefsNode;\n\ntypedef union LNK_RelocRefsPointer\n{\n  struct {\n    LNK_RelocRefsNode *node;\n    U64                tag;\n  };\n  U64 v[2];\n} LNK_RelocRefsPointer;\n\ntypedef struct AlignType(16) LNK_RelocRefsList\n{\n  LNK_RelocRefsPointer head;\n} LNK_RelocRefsList;\n\n// --- Base Reloc --------------------------------------------------------------\n\ntypedef struct LNK_BaseRelocPage\n{\n  U32      buffer_offset;\n  U32      voff;\n  U64List *entries_addr32;\n  U64List *entries_addr64;\n} LNK_BaseRelocPage;\n\ntypedef struct LNK_BaseRelocPageNode\n{\n  struct LNK_BaseRelocPageNode *next;\n  LNK_BaseRelocPage             v;\n} LNK_BaseRelocPageNode;\n\ntypedef struct LNK_BaseRelocPageList\n{\n  U64                    count;\n  LNK_BaseRelocPageNode *first;\n  LNK_BaseRelocPageNode *last;\n} LNK_BaseRelocPageList;\n\ntypedef struct LNK_BaseRelocPageArray\n{\n  U64                count;\n  LNK_BaseRelocPage *v;\n} LNK_BaseRelocPageArray;\n\n// --- Workers Contexts --------------------------------------------------------\n\ntypedef struct\n{\n  B32                   search_anti_deps;\n  LNK_SymbolTable      *symtab;\n  LNK_Lib              *lib;\n  LNK_LibMemberRefList *member_ref_lists;\n} LNK_SearchLibTask;\n\ntypedef struct\n{\n  LNK_SymbolTable   *symtab;\n  U32                active_thread_count;\n  LNK_RelocRefsList *reloc_refs;\n} LNK_OptRefTask;\n\ntypedef struct\n{\n  String8              image_data;\n  LNK_Obj            **objs;\n  U64                  image_base;\n  COFF_SectionHeader **image_section_table;\n} LNK_ObjRelocPatcher;\n\ntypedef struct\n{\n  U64 page_size;\n  B32 is_large_addr_aware;\n  union {\n    struct {\n      LNK_Obj               **objs;\n      LNK_BaseRelocPageList  *pages;\n      HashTable             **page_ht;\n    } gather;\n    struct {\n      U64                     buffer_size;\n      U8                     *buffer;\n      LNK_BaseRelocPageArray  pages;\n      Rng1U64                *ranges;\n    } serialize;\n  };\n} LNK_BaseRelocsTask;\n\ntypedef struct LNK_ImageFillNode\n{\n  U64                  base_foff;\n  U64                  sc_count;\n  LNK_SectionContrib **sc;\n\n  struct LNK_ImageFillNode *next;\n} LNK_ImageFillNode;\n\ntypedef struct\n{\n  LNK_SymbolTable           *symtab;\n  LNK_SectionTable          *sectab;\n  U64                        objs_count;\n  LNK_Obj                  **objs;\n  U64                        function_pad_min;\n  U64                        default_align;\n  LNK_SectionContrib        *null_sc;\n  LNK_SectionContrib      ***sect_map;\n  HashTable                 *contribs_ht;\n  LNK_SectionArray           image_sects;\n  union {\n    struct {\n      HashTable **defns;\n    } gather_sects;\n    struct {\n      U64                    *counts;\n      U64                    *offsets;\n      LNK_CommonBlockContrib *contribs;\n    } common_block;\n    struct {\n      LNK_SectionContribChunk **chunks;\n    } sort_contribs;\n    struct {\n      B8                        **was_symbol_patched;\n      LNK_Section                *common_block_sect;\n      Rng1U64                    *common_block_ranges;\n      LNK_CommonBlockContrib     *common_block_contribs;\n      COFF_SymbolValueInterpType  fixup_type;\n    } patch_symtabs;\n    struct {\n      String8             image_data;\n      LNK_ImageFillNode **fill_nodes;\n    } image_fill;\n  } u;\n} LNK_BuildImageTask;\n\ntypedef struct\n{\n  String8 path;\n  String8 temp_path;\n  String8 data;\n} LNK_WriteThreadContext;\n\ntypedef struct\n{\n  String8  data;\n  Rng1U64 *ranges;\n  U128    *hashes;\n} LNK_Blake3Hasher;\n\n// --- Config -----------------------------------------------------------------\n\ninternal LNK_Config * lnk_config_from_argcv(Arena *arena, int argc, char **argv);\n\n// --- Entry Point -------------------------------------------------------------\n\ninternal void lnk_run(TP_Context *tp, TP_Arena *tp_arena, LNK_Config *config);\n\n// --- Path --------------------------------------------------------------------\n\ninternal String8 lnk_make_full_path(Arena *arena, PathStyle system_path_style, String8 work_dir, String8 path);\n\n// --- Hasher ------------------------------------------------------------------\n\ninternal U128 lnk_blake3_hash_parallel(TP_Context *tp, U64 chunk_count, String8 data);\n\n// --- Manifest ----------------------------------------------------------------\n\ninternal String8 lnk_make_linker_manifest(Arena *arena, B32 manifest_uac, String8 manifest_level, String8 manifest_ui_access, String8List manifest_dependency_list);\ninternal void    lnk_merge_manifest_files(String8 mt_path, String8 out_name, String8List manifest_path_list);\ninternal String8 lnk_manifest_from_inputs(Arena *arena, LNK_IO_Flags io_flags, String8 mt_path, String8 manifest_name, B32 manifest_uac, String8 manifest_level, String8 manifest_ui_access, String8List input_manifest_path_list, String8List deps_list);\n\n// --- Internal Objs -----------------------------------------------------------\n\ninternal String8 lnk_make_null_obj(Arena *arena);\ninternal String8 lnk_make_res_obj(Arena *arena, String8List res_file_list, String8List res_path_list, COFF_MachineType machine, U32 time_stamp, String8 work_dir, PathStyle system_path_style, String8 obj_name);\ninternal String8 lnk_make_linker_obj(Arena *arena, LNK_Config *config);\n\n// --- Inputer -----------------------------------------------------------------\n\ninternal void              lnk_input_list_push_node(LNK_InputList *list, LNK_Input *node);\ninternal void              lnk_input_list_concat_in_place(LNK_InputList *list, LNK_InputList *to_concat);\ninternal LNK_InputPtrArray lnk_array_from_input_list(Arena *arena, LNK_InputList list);\n\ninternal LNK_Inputer * lnk_inputer_init(void);\n\ninternal LNK_Input * lnk_input_push(Arena *arena, LNK_InputList *list, String8 path, String8 data);\ninternal LNK_Input * lnk_inputer_push_linkgen(Arena *arena, LNK_InputList *list, String8 path, String8 data);\ninternal LNK_Input * lnk_inputer_push_thin(Arena *arena, LNK_InputList *list, HashTable *ht, String8 full_path);\n\ninternal LNK_Input * lnk_inputer_push_obj(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, String8 path, String8 data);\ninternal LNK_Input * lnk_inputer_push_obj_linkgen(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, String8 path, String8 data);\ninternal LNK_Input * lnk_inputer_push_obj_thin(LNK_Inputer *inputer, LNK_LibMemberRef *link_member, String8 path);\n\ninternal LNK_Input * lnk_inputer_push_lib(LNK_Inputer *inputer, LNK_InputSourceType input_source, String8 path, String8 data);\ninternal LNK_Input * lnk_inputer_push_lib_linkgen(LNK_Inputer *inputer, LNK_InputSourceType input_source, String8 path, String8 data);\ninternal LNK_Input * lnk_inputer_push_lib_thin(LNK_Inputer *inputer, LNK_Config *config, LNK_InputSourceType input_source, String8 lib_path);\n\ninternal B32               lnk_inputer_has_items(LNK_Inputer *inputer);\ninternal LNK_InputPtrArray lnk_inputer_flush(Arena *arena, TP_Context *tp, LNK_Inputer *inputer, LNK_IO_Flags io_flags, LNK_InputList *all_inputs, LNK_InputList *new_inputs);\n\n// --- Link Context ------------------------------------------------------------\n\ninternal void                lnk_lib_member_ref_list_push_node(LNK_LibMemberRefList *list, LNK_LibMemberRef *node);\ninternal void                lnk_lib_member_ref_list_concat_in_place_array(LNK_LibMemberRefList *list, LNK_LibMemberRefList *to_concat_arr, U64 count);\ninternal int                 lnk_lib_member_ref_is_before(void *raw_a, void *raw_b);\ninternal LNK_LibMemberRef ** lnk_array_from_lib_member_list(Arena *arena, LNK_LibMemberRefList list);\n\ninternal LNK_ObjNode * lnk_load_objs  (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link, U64 *objs_count_out);\ninternal void          lnk_load_libs  (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_Link *link);\ninternal void          lnk_link_inputs(TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab, LNK_Link *link);\ninternal LNK_Link *    lnk_link_image (TP_Context *tp, TP_Arena *arena, LNK_Config *config, LNK_Inputer *inputer, LNK_SymbolTable *symtab);\n\n// --- Optimizations -----------------------------------------------------------\n\ninternal void lnk_opt_ref(TP_Context *tp, LNK_SymbolTable *symtab, LNK_Config *config, LNK_ObjList objs);\n\n// --- Win32 Image -------------------------------------------------------------\n\ninternal String8List      lnk_build_guard_tables(TP_Context *tp, LNK_SectionTable *sectab, LNK_SymbolTable *symtab, U64 objs_count, LNK_Obj **objs, COFF_MachineType machine, String8 entry_point_name, LNK_GuardFlags guard_flags, B32 emit_suppress_flag);\ninternal String8          lnk_build_base_relocs(TP_Context *tp, TP_Arena *tp_temp, LNK_Config *config, U64 objs_count, LNK_Obj **objs);\ninternal String8List      lnk_build_win32_image_header(Arena *arena, LNK_SymbolTable *symtab, LNK_Config *config, LNK_SectionArray sect_arr, U64 expected_image_header_size);\ninternal LNK_ImageContext lnk_build_image(TP_Arena *arena, TP_Context *tp, LNK_Config *config, LNK_SymbolTable *symtab, U64 obj_count, LNK_Obj **objs);\n\n// --- Logger ------------------------------------------------------------------\n\ninternal void lnk_log_link_stats(LNK_ObjList obj_list, LNK_LibList *lib_index, LNK_SectionTable *sectab);\ninternal void lnk_log_timers(void);\n\n"
  },
  {
    "path": "src/linker/lnk_cmd_line.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8List\nlnk_arg_list_parse_windows_rules(Arena *arena, String8 string)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8List list = {0};\n  \n  U8 *ptr = string.str;\n  U8 *opl = string.str + string.size;\n  while (ptr < opl) {\n    // skip white space and new lines\n    for (;;) {\n      U64 size = (U64)(opl - ptr);\n      UnicodeDecode uni = utf8_decode(ptr, size);\n      if (uni.codepoint != ' ' && uni.codepoint != '\\n' && uni.codepoint != '\\r') {\n        break;\n      }\n      ptr += uni.inc;\n    }\n    \n    if (*ptr == '\\0') {\n      break;\n    }\n    \n    String8List token_builder = {0};\n    U8 *anchor = ptr;\n    while (ptr < opl) {\n      UnicodeDecode uni;\n      \n      uni = utf8_decode(ptr, (U64)(opl-ptr));\n      if (uni.codepoint == '\\0' || uni.codepoint == '\\n' || uni.codepoint == '\\r' || uni.codepoint == ' ') {\n        break;\n      }\n      \n      // handle string and strip quotes\n      if (uni.codepoint == '\"') {\n        String8 text_before_quote = str8(anchor, (U64)(ptr - anchor));\n        str8_list_push(scratch.arena, &token_builder, text_before_quote);\n        \n        // advance past starting quote\n        ptr += uni.inc;\n        anchor = ptr;\n        \n        U8 *quote_end = ptr;\n        while (ptr < opl) {\n          uni = utf8_decode(ptr, (U64)(opl - ptr));\n          ptr += uni.inc;\n          // skip escape char\n          if (uni.codepoint == '\\\\') {\n            uni = utf8_decode(ptr, (U64)(opl - ptr));\n            ptr += uni.inc;\n          } else if (uni.codepoint == '\"' || uni.codepoint == '\\0') {\n            break; // found matching quote char\n          }\n          quote_end = ptr;\n        }\n        \n        String8 text_inside_quotes = str8(anchor, (U64)(quote_end - anchor));\n        str8_list_push(scratch.arena, &token_builder, text_inside_quotes);\n        anchor = ptr;\n      } else {\n        ptr += uni.inc;\n      }\n    }\n    \n    // push remaining text \n    String8 text = str8(anchor, (U64)(ptr - anchor));\n    str8_list_push(scratch.arena, &token_builder, text);\n    \n    // push token\n    String8 token = str8_list_join(arena, &token_builder, NULL);\n    if (token.size) {\n      str8_list_push(arena,  &list, token);\n    }\n  }\n  \n  scratch_end(scratch);\n  return list;\n}\n\ninternal void\nlnk_cmd_line_push_option_node(LNK_CmdLine *cmd_line, LNK_CmdOption *opt)\n{\n  SLLQueuePush(cmd_line->first_option, cmd_line->last_option, opt);\n  cmd_line->option_count += 1;\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_push_option_list(Arena *arena, LNK_CmdLine *cmd_line, String8 string, String8List value_strings)\n{\n  // fill out node\n  LNK_CmdOption *opt = push_array_no_zero(arena, LNK_CmdOption, 1);\n  opt->next          = 0;\n  opt->string        = string;\n  opt->value_strings = value_strings;\n\n  // push node\n  lnk_cmd_line_push_option_node(cmd_line, opt);\n\n  return opt;\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_push_option_string(Arena *arena, LNK_CmdLine *cmd_line, String8 string, String8 value)\n{\n  String8List value_list = str8_split_by_string_chars(arena, value, str8_lit(\",\"), StringSplitFlag_KeepEmpties);\n  LNK_CmdOption *opt = lnk_cmd_line_push_option_list(arena, cmd_line, string, value_list);\n  return opt;\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_push_option(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value)\n{\n  return lnk_cmd_line_push_option_string(arena, cmd_line, str8_cstring(string), str8_cstring(value));\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value)\n{\n  if (!lnk_cmd_line_has_option(*cmd_line, string)) {\n    return lnk_cmd_line_push_option(arena, cmd_line, string, value);\n  }\n  return 0;\n}\n\ninternal LNK_CmdLine\nlnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list)\n{\n  LNK_CmdLine cmd_line = {0};\n  cmd_line.raw_cmd_line = str8_list_copy(arena, &arg_list);\n\n  for (String8Node *arg_node = arg_list.first; arg_node != 0; arg_node = arg_node->next) {\n    String8 arg = arg_node->string;\n    B32 is_option = str8_match_lit(\"/\", arg, StringMatchFlag_RightSideSloppy) ||\n                    str8_match_lit(\"-\", arg, StringMatchFlag_RightSideSloppy);\n    if (is_option) {\n      U64 param_start_pos = str8_find_needle(arg, 0, str8_lit(\":\"), 0);\n      String8 option_name = str8_chop(arg, arg.size - param_start_pos);\n\n      // remove '/' or '-' from option name\n      option_name = str8_skip(option_name, 1);\n\n      // skip ':'\n      String8 value_string = str8_skip(arg, param_start_pos + 1);\n\n      // make value list\n      String8List value_list = str8_split_by_string_chars(arena, value_string, str8_lit(\",\"), 0);\n\n      // push command\n      lnk_cmd_line_push_option_list(arena, &cmd_line, option_name, value_list);\n    } else {\n      str8_list_push(arena, &cmd_line.input_list, arg);\n    }\n  }\n  return cmd_line;\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_option_from_string(LNK_CmdLine cmd_line, String8 string)\n{\n  LNK_CmdOption *opt;\n  for (opt = cmd_line.first_option; opt != NULL; opt = opt->next) {\n    if (str8_match(string, opt->string, StringMatchFlag_CaseInsensitive)) {\n      break;\n    }\n  }\n  return opt;\n}\n\ninternal B32\nlnk_cmd_line_has_option_string(LNK_CmdLine cmd_line, String8 string)\n{\n  LNK_CmdOption *opt = lnk_cmd_line_option_from_string(cmd_line, string);\n  B32 has_option = (opt != 0);\n  return has_option;\n}\n\ninternal B32\nlnk_cmd_line_has_option(LNK_CmdLine cmd_line, char *string)\n{\n  return lnk_cmd_line_has_option_string(cmd_line, str8_cstring(string));\n}\n\ninternal String8List\nlnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line)\n{\n  String8List result = {0};\n\n  for (LNK_CmdOption *opt = cmd_line.first_option; opt != 0; opt = opt->next) {\n    // separate directives\n    if (opt != cmd_line.first_option) {\n      str8_list_pushf(arena, &result, \" \");\n    }\n\n    // push new directive\n    str8_list_pushf(arena, &result, \"/%.*s\", str8_varg(opt->string));\n\n    // do we have arguments?\n    if (opt->value_strings.node_count > 0) {\n      str8_list_pushf(arena, &result, \":\");\n\n      for (String8Node *value_node = opt->value_strings.first; value_node != 0; value_node = value_node->next) {\n        // separate arguments\n        if (value_node != opt->value_strings.first) {\n          str8_list_pushf(arena, &result, \",\");\n        }\n\n        // push argument\n        B32 has_spaces = str8_find_needle(value_node->string, 0, str8_lit(\" \"), StringMatchFlag_CaseInsensitive) < value_node->string.size;\n        if (has_spaces) {\n          str8_list_pushf(arena, &result, \"\\\"%.*s\\\"\", str8_varg(value_node->string));\n        } else {\n          str8_list_pushf(arena, &result, \"%.*s\", str8_varg(value_node->string));\n        }\n      }\n    }\n  }\n\n  // append inputs\n  for (String8Node *input_node = cmd_line.input_list.first; input_node != 0; input_node = input_node->next) {\n    if (input_node != cmd_line.input_list.first) {\n      str8_list_pushf(arena, &result, \" \");\n    }\n    str8_list_pushf(arena, &result, \"\\\"%.*s\\\"\", str8_varg(input_node->string));\n  }\n\n  return result;\n}\n"
  },
  {
    "path": "src/linker/lnk_cmd_line.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef struct LNK_CmdOption\n{\n  struct LNK_CmdOption *next;\n  String8               string;\n  String8List           value_strings;\n} LNK_CmdOption;\n\ntypedef struct LNK_CmdLine\n{\n  U64            option_count;\n  LNK_CmdOption *first_option;\n  LNK_CmdOption *last_option;\n  String8List    input_list;\n  String8List    raw_cmd_line;\n} LNK_CmdLine;\n\ninternal String8List     lnk_arg_list_parse_windows_rules(Arena *arena, String8 string);\ninternal LNK_CmdLine     lnk_cmd_line_parse_windows_rules(Arena *arena, String8List arg_list);\ninternal LNK_CmdOption * lnk_cmd_line_option_from_string(LNK_CmdLine cmd_line, String8 string);\ninternal B32             lnk_cmd_line_has_option_string(LNK_CmdLine cmd_line, String8 string);\ninternal B32             lnk_cmd_line_has_option(LNK_CmdLine cmd_line, char *string);\n\ninternal LNK_CmdOption * lnk_cmd_line_push_option(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value);\ninternal LNK_CmdOption * lnk_cmd_line_push_option_if_not_present(Arena *arena, LNK_CmdLine *cmd_line, char *string, char *value);\n\ninternal String8List lnk_data_from_cmd_line(Arena *arena, LNK_CmdLine cmd_line);\n\n"
  },
  {
    "path": "src/linker/lnk_config.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\nglobal read_only LNK_CmdSwitch g_cmd_switch_map[] =\n{\n  { LNK_CmdSwitch_Null,               0, \"\",                     \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"NOT_IMPLEMENTED\",      \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Align,              0, \"ALIGN\",                \":#\", \"\"                                                                                                    },\n  { LNK_CmdSwitch_AllowBind,          0, \"ALLOWBIND\",            \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_AllowIsolation,     0, \"ALLOWISOLATION\",       \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_AlternateName,      1, \"ALTERNATENAME\",        \"Creates an a symbol alias \\\"FROM=TO\\\".\"                                                                    },\n  { LNK_CmdSwitch_AppContainer,       0, \"APPCONTAINER\",         \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_NotImplemented,     0, \"ASSEMBLYDEBUG\",        \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"ASSEMBLYLINKRESOURCE\", \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"ASSEMBLYMODULE\",       \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"ASSEMBLYRESOURCE\",     \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_Base,               0, \"BASE\",                 \"{ADDRESS[,SIZE]|@FILENAME,KEY}\", \"\"                                                                        },\n  { LNK_CmdSwitch_Brepro,             0, \"BREPRO\",               \"\", \"Not supported\"                                                                                         },\n  { LNK_CmdSwitch_NotImplemented,     0, \"CLRIMAGETYPE\",         \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"CLRLOADEROPTIMIZATION\",\"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"CLRSUPPORTLASTERROR\",  \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"CLRTHREADATTRIBUTE\",   \"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_NotImplemented,     0, \"CLRUNMANAGEDCODECHECK\",\"\", \"\"                                                                                                      }, // .NET\n  { LNK_CmdSwitch_Debug,              0, \"DEBUG\",                \"[:{FULL|NONE}]\", \"\"                                                                                        },\n  { LNK_CmdSwitch_Dump,               0, \"DUMP\",                 \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"DEF\",                  \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_DefaultLib,         1, \"DEFAULTLIB\",           \":LIBNAME\", \"\"                                                                                              },\n  { LNK_CmdSwitch_Delay,              0, \"DELAY\",                \":{NOBIND|UNLOAD}\", \"\"                                                                                      },\n  { LNK_CmdSwitch_DelayLoad,          0, \"DELAYLOAD\",            \":DLL\", \"\"                                                                                                  },\n  { LNK_CmdSwitch_NotImplemented,     0, \"DELAYSIGN\",            \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"DEPENDENTLOADFLAG\",    \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Dll,                0, \"DLL\",                  \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"DRIVER\",               \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_DisallowLib,        1, \"DISALLOWLIB\",          \":LIBRARY\", \"\",                                                                                             },\n  { LNK_CmdSwitch_D2,                 0, \"D2\",                   \"\"                                                                                                          },\n  { LNK_CmdSwitch_EditAndContinue,    1, \"EDITANDCONTINUE\",      \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_DynamicBase,        0, \"DYNAMICBASE\",          \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_NotImplemented,     0, \"EMITVOLATILEMETADATA\", \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Entry,              1, \"ENTRY\",                \":FUNCTION\", \"\"                                                                                             },\n  { LNK_CmdSwitch_ErrorReport,        0, \"ERRORREPORT\",          \"\", \"Deprecated starting Windows Vista.\"                                                                    },\n  { LNK_CmdSwitch_Export,             1, \"EXPORT\",               \":SYMBOL\", \"\"                                                                                               },\n  { LNK_CmdSwitch_NotImplemented,     0, \"EXPORTADMIN\",          \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_FastFail,           0, \"FASTFAIL\",             \"\", \"Not used.\"                                                                                             },\n  { LNK_CmdSwitch_NotImplemented,     0, \"FASTGENPROFILE\",       \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_FailIfMismatch,     1, \"FAILIFMISMATCH\",       \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_FileAlign,          0, \"FILEALIGN\",            \":#\", \"\"                                                                                                    },\n  { LNK_CmdSwitch_Fixed,              0, \"FIXED\",                \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_NotImplemented,     0, \"FORCE\",                \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_FunctionPadMin,     0, \"FUNCTIONPADMIN\",      \":#\", \"Not Implemented\"                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"GUARD\",                \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_GuardSym,           1, \"GUARDSYM\",             \"\", \"\",                                                                                                     },\n  { LNK_CmdSwitch_NotImplemented,     0, \"GENPROFILE\",           \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Heap,               0, \"HEAP\",                 \"RESERVE[,COMMIT]\", \"\"                                                                                      },\n  { LNK_CmdSwitch_HighEntropyVa,      0, \"HIGHENTROPYVA\",        \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_NotImplemented,     0, \"IDLOUT\",               \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Ignore,             0, \"IGNORE\",               \":#\", \"\"                                                                                                    },\n  { LNK_CmdSwitch_NotImplemented,     0, \"IGNOREIDL\",            \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"ILK\",                  \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_ImpLib,             0, \"IMPLIB\",               \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_Include,            1, \"INCLUDE\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Incremental,        0, \"INCREMENTAL\",          \"[:NO]\", \"Incremental linking is not supported.\"                                                            },\n  { LNK_CmdSwitch_NotImplemented,     0, \"INTEGRITYCHECK\",       \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_InferAsanLibs,      1, \"INFERASANLIBS\",        \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_InferAsanLibsNo,    1, \"INFERASANLIBSNO\",      \"\", \"\",                                                                                                     },\n  { LNK_CmdSwitch_NotImplemented,     0, \"KERNEL\",               \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"KEYCONTAINER\",         \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"KEYFILE\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_LargeAddressAware,  0, \"LARGEADDRESSAWARE\",    \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_Lib,                0, \"LIB\",                  \"\"                                                                                                          },\n  { LNK_CmdSwitch_LibPath,            0, \"LIBPATH\",              \":DIR\", \"\"                                                                                                  },\n  { LNK_CmdSwitch_NotImplemented,     0, \"LINKERREPO\",           \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"LINKERREPOTARGET\",     \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"LTCG\",                 \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"LTCGOUT\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Machine,            0, \"MACHINE\",              \":{X64|X86}\", \"\"                                                                                            },\n  { LNK_CmdSwitch_Manifest,           0, \"MANIFEST\",             \"[:{EMBED[,ID=#]|NO]\", \"\"                                                                                   },\n  { LNK_CmdSwitch_ManifestDependency, 1, \"MANIFESTDEPENDENCY\",   \":\\\"manifest dependency XML string\\\"\", \"\"                                                                   },\n  { LNK_CmdSwitch_ManifestFile,       0, \"MANIFESTFILE\",         \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_ManifestInput,      0, \"MANIFESTINPUT\",        \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_ManifestUac,        0, \"MANIFESTUAC\",          \":{NO|{'level'={'asInvoker'|'highestAvailable'|'requireAdministrator'} ['uiAccess'={'true'|'false'}]}}\", \"\" },\n  { LNK_CmdSwitch_NotImplemented,     0, \"MAP\",                  \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"MAPINFO\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Merge,              1, \"MERGE\",                \":from=to\", \"\"                                                                                              },\n  { LNK_CmdSwitch_NotImplemented,     0, \"MIDL\",                 \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Natvis,             0, \"NATVIS\",               \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_NotImplemented,     0, \"NOASSEMBLY\",           \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NoDefaultLib,       1, \"NODEFAULTLIB\",         \":LIBNAME\", \"\"                                                                                              },\n  { LNK_CmdSwitch_NoDefaultLib,       0, \"NOD\",                  \":LIBNAME\", \"\"                                                                                              },\n  { LNK_CmdSwitch_NotImplemented,     0, \"NOENTRY\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NoExp,              0, \"NOEXP\",                \"\", \".exp is not supported.\"                                                                                },\n  { LNK_CmdSwitch_NoImpLib,           0, \"NOIMPLIB\",             \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NoLogo,             0, \"NOLOGO\",               \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NxCompat,           0, \"NXCOMPAT\",             \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_Opt,                0, \"OPT\",                  \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"ORDER\",                \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Out,                0, \"OUT\",                  \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_Pdb,                0, \"PDB\",                  \":FILENAME\", \"\"                                                                                             },\n  { LNK_CmdSwitch_PdbAltPath,         0, \"PDBALTPATH\",           \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"PDBSTRIPPED\",          \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_PdbPageSize,        0, \"PDBPAGESIZE\",          \":#\", \"Page size must be power of two\"                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"PROFILE\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Release,            1, \"RELEASE\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"SAFESEH\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Section,            1, \"SECTION\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"SOURCELINK\",           \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Stack,              1, \"STACK\",                \":RESERVE[,COMMIT]\", \"\"                                                                                     },\n  { LNK_CmdSwitch_NotImplemented,     0, \"STUB\",                 \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_SubSystem,          1, \"SUBSYSTEM\",            \":{CONSOLE|NATIVE|WINDOWS}[,#[.##]]\", \"\"                                                                    },\n  { LNK_CmdSwitch_NotImplemented,     0, \"SWAPRUN\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"TLBID\",                \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"TLBOUT\",               \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"TIME\",                 \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_TsAware,            0, \"TSAWARE\",              \"[:NO]\", \"\"                                                                                                 },\n  { LNK_CmdSwitch_ThrowingNew,        1, \"THROWINGNEW\",          \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"USERPROFILE\",          \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"VERBOSE\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_Version,            0, \"VERSION\",              \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"WINMD\",                \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"WINMDDELAYSIGN\",       \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"WINMDKEYCONTAINER\",    \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"WINMDKEYFILE\",         \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"WHOLEARCHIVE\",         \"\", \"\"                                                                                                      },\n  { LNK_CmdSwitch_NotImplemented,     0, \"WX\",                   \"\", \"\"                                                                                                      },\n\n  //- internal switches\n  { LNK_CmdSwitch_Rad_Age,                          0, \"RAD_AGE\",                              \":#\",        \"Age embeded in EXE and PDB, used to validate incremental build. Default is 1.\"    },\n  { LNK_CmdSwitch_Rad_AltPchDir,                    0, \"RAD_ALT_PCH_DIR\",                      \":PATH\",     \"Alternative directory to search for PCH object files.\"                            },\n  { LNK_CmdSwitch_Rad_BuildInfo,                    0, \"RAD_BUILD_INFO\",                       \"\",          \"Print build info and exit.\"                                                       },\n  { LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll,      0, \"RAD_CHECK_UNUSED_DELAY_LOAD_DLL\",      \"[:NO]\",     \"\"                                                                                 },\n  { LNK_CmdSwitch_Rad_Map,                          0, \"RAD_MAP\",                              \":FILENAME\", \"Emit file with the output image's layout description.\"                            },\n  { LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols, 0, \"RAD_MAP_LINES_FOR_UNRESOLVED_SYMBOLS\", \"[:NO]\",     \"Use debug info to print source file location for unresolved symbol\"               },\n  { LNK_CmdSwitch_Rad_MemoryMapFiles,               0, \"RAD_MEMORY_MAP_FILES\",                 \"[:NO]\",     \"When enabled, files are memory-mapped instead of being read entirely on request.\" },\n  { LNK_CmdSwitch_Rad_Debug,                        0, \"RAD_DEBUG\",                            \"[:NO]\",     \"Emit RAD debug info file.\"                                                        },\n  { LNK_CmdSwitch_Rad_DebugAltPath,                 0, \"RAD_DEBUGALTPATH\",                     \"\", \"\"                                                                                          },\n  { LNK_CmdSwitch_Rad_DebugName,                    0, \"RAD_DEBUG_NAME\",                       \":FILENAME\", \"Sets file name for RAD debug info file.\"                                          },\n  { LNK_CmdSwitch_Rad_DelayBind,                    0, \"RAD_DELAY_BIND\",                       \"[:NO]\", \"\"                                                                                     },\n  { LNK_CmdSwitch_Rad_DoMerge,                      0, \"RAD_DO_MERGE\",                         \"[:NO]\", \"\"                                                                                     },\n  { LNK_CmdSwitch_Rad_EnvLib,                       0, \"RAD_ENV_LIB\",                          \"[:NO]\", \"\"                                                                                     },\n  { LNK_CmdSwitch_Rad_Exe,                          0, \"RAD_EXE\",                              \"[:NO]\", \"\"                                                                                     },\n  { LNK_CmdSwitch_Rad_Guid,                         0, \"RAD_GUID\",                             \":{IMAGEBLAKE3|XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX}\", \"\"                                   },\n  { LNK_CmdSwitch_Rad_LargePages,                   0, \"RAD_LARGE_PAGES\",                      \"[:NO]\",     \"Disabled by default on Windows.\"                                                  },\n  { LNK_CmdSwitch_Rad_LinkVer,                      0, \"RAD_LINK_VER\",                         \":##,##\", \"\"                                                                                    },\n  { LNK_CmdSwitch_Rad_Log,                          0, \"RAD_LOG\",                              \":{ALL,INPUT_OBJ,INPUT_LIB,IO,LINK_STATS,TIMERS}\", \"\"                                           },\n  { LNK_CmdSwitch_Rad_MtPath,                       0, \"RAD_MT_PATH\",                          \":EXEPATH\",  \"Exe path to manifest tool, default: \" LNK_MANIFEST_MERGE_TOOL_NAME                },\n  { LNK_CmdSwitch_Rad_OsVer,                        0, \"RAD_OS_VER\",                           \":##,##\", \"\"                                                                                    },\n  { LNK_CmdSwitch_Rad_PageSize,                     0, \"RAD_PAGE_SIZE\",                        \":#\",        \"Must be power of two.\"                                                            },\n  { LNK_CmdSwitch_Rad_PathStyle,                    0, \"RAD_PATH_STYLE\",                       \":{WindowsAbsolute|UnixAbsolute}\", \"\"                                                           },\n  { LNK_CmdSwitch_Rad_PdbHashTypeNameLength,        0, \"RAD_PDB_HASH_TYPE_NAME_LENGTH\",        \":#\",        \"Number of hash bytes to use to replace type name. Default 8 bytes (Max 16).\"      },\n  { LNK_CmdSwitch_Rad_PdbHashTypeNameMap,           0, \"RAD_PDB_HASH_TYPE_NAME_MAP\",           \":FILENAME\", \"Produce map file with hash -> type name mappings.\"                                },\n  { LNK_CmdSwitch_Rad_PdbHashTypeNames,             0, \"RAD_PDB_HASH_TYPE_NAMES\",              \":{NONE|LENIENT|FULL}\", \"Replace type names in LF_STRUCTURE and LF_CLASS with hashes.\"          },\n  { LNK_CmdSwitch_Rad_RemoveSection,                0, \"RAD_REMOVE_SECTION\",                   \":NAME\",     \"Removes a section from output image.\"                                             },\n  { LNK_CmdSwitch_Rad_SharedThreadPool,             0, \"RAD_SHARED_THREAD_POOL\",               \"[:STRING]\", \"Default value \\\"\" LNK_DEFAULT_THREAD_POOL_NAME \"\\\"\"                               },\n  { LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers,   0, \"RAD_SHARED_THREAD_POOL_MAX_WORKERS\",   \":#\",        \"Sets maximum number of workers in a thread pool.\"                                 },\n  { LNK_CmdSwitch_Rad_SuppressError,                0, \"RAD_SUPPRESS_ERROR\",                   \":#\",        \"\"                                                                                 },\n  { LNK_CmdSwitch_Rad_TargetOs,                     0, \"RAD_TARGET_OS\",                        \":{WINDOWS,LINUX,MAC}\"                                                                          },\n  { LNK_CmdSwitch_Rad_WriteTempFiles,               0, \"RAD_WRITE_TEMP_FILES\",                 \"[:NO]\",     \"When speicifed linker writes image and debug info to temporary files and renames after link is done.\" },\n  { LNK_CmdSwitch_Rad_TimeStamp,                    0, \"RAD_TIME_STAMP\",                       \":#\",        \"Time stamp embeded in EXE and PDB.\"                                               },\n  { LNK_CmdSwitch_Rad_UnresolvedSymbolLimit,        0, \"RAD_UNRESOLVED_SYMBOL_LIMIT\",          \":#\",        \"Limits number of unresolved symbol errors linker reports.\"                        },\n  { LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit,     0, \"RAD_UNRESOLVED_SYMBOL_REF_LIMIT\",      \":#\",        \"Limit number of unresolved symbol references linker reports.\"                     },\n  { LNK_CmdSwitch_Rad_Version,                      0, \"RAD_VERSION\",                          \"\",          \"Print version and exit.\"                                                          },\n  { LNK_CmdSwitch_Rad_Workers,                      0, \"RAD_WORKERS\",                          \":#\",        \"Sets number of workers created in the pool. Number is capped at 1024. When /RAD_SHARED_THREAD_POOL is specified this number cant exceed /RAD_SHARED_THREAD_POOL_MAX_WORKERS.\" },\n\n  { LNK_CmdSwitch_Help, 0, \"HELP\", \"\", \"\" },\n  { LNK_CmdSwitch_Help, 0, \"?\",    \"\", \"\" },\n};\n\nglobal read_only struct\n{\n  char         *name;\n  LNK_InputType type;\n} g_input_type_map[] = {\n  { \"o\",    LNK_Input_Obj },\n  { \"obj\",  LNK_Input_Obj },\n  { \"lib\",  LNK_Input_Lib },\n  { \"rlib\", LNK_Input_Lib }, // rust libs\n  { \"res\",  LNK_Input_Res },\n};\n\nglobal read_only struct\n{\n  char         *name;\n  LNK_DebugMode mode;\n} g_debug_mode_map[] = {\n  { \"null\",     LNK_DebugMode_Null     },\n  { \"none\",     LNK_DebugMode_None     },\n  { \"fastlink\", LNK_DebugMode_FastLink },\n  { \"ghash\",    LNK_DebugMode_GHash    },\n  { \"full\",     LNK_DebugMode_Full     },\n}; \n\nglobal read_only struct\n{\n   char                 *name;\n   LNK_TypeNameHashMode  mode;\n} g_type_name_hash_mode_map[] = {\n  { \"none\",    LNK_TypeNameHashMode_None    },\n  { \"lenient\", LNK_TypeNameHashMode_Lenient },\n  { \"full\",    LNK_TypeNameHashMode_Full    }\n};\n\ninternal LNK_CmdSwitchType\nlnk_cmd_switch_type_from_string(String8 name)\n{\n  for (U64 i = 0; i < ArrayCount(g_cmd_switch_map); i += 1) {\n    if (str8_match_cstr(g_cmd_switch_map[i].name, name, StringMatchFlag_CaseInsensitive)) {\n      return g_cmd_switch_map[i].type;\n    }\n  }\n  return LNK_CmdSwitch_Null;\n}\n\ninternal LNK_CmdSwitch *\nlnk_cmd_switch_from_string(String8 name)\n{\n  for (U64 i = 0; i < ArrayCount(g_cmd_switch_map); i += 1) {\n    if (str8_match_cstr(g_cmd_switch_map[i].name, name, StringMatchFlag_CaseInsensitive)) {\n      return &g_cmd_switch_map[i];\n    }\n  }\n  return 0;\n}\n\ninternal LNK_CmdSwitch *\nlnk_cmd_switch_from_type(LNK_CmdSwitchType type)\n{\n  for (U64 cmd_idx = 0; cmd_idx < ArrayCount(g_cmd_switch_map); cmd_idx += 1) {\n    if (g_cmd_switch_map[cmd_idx].type == type) {\n      return &g_cmd_switch_map[cmd_idx];\n    }\n  }\n  return 0;\n}\n\ninternal String8\nlnk_string_from_cmd_switch_type(LNK_CmdSwitchType type)\n{\n  LNK_CmdSwitch *cmd_switch = lnk_cmd_switch_from_type(type);\n  return cmd_switch ? str8_cstring(cmd_switch->name) : str8_zero();\n}\n\ninternal LNK_InputType\nlnk_input_type_from_string(String8 name)\n{\n  for (U64 i = 0; i < ArrayCount(g_input_type_map); i += 1) {\n    if (str8_match_cstr(g_input_type_map[i].name, name, StringMatchFlag_CaseInsensitive)) {\n      return g_input_type_map[i].type;\n    }\n  }\n  return LNK_Input_Null;\n}\n\ninternal LNK_DebugMode\nlnk_debug_mode_from_string(String8 name)\n{\n  for (U64 i = 0; i < ArrayCount(g_debug_mode_map); i += 1) {\n    if (str8_match_cstr(g_debug_mode_map[i].name, name, StringMatchFlag_CaseInsensitive)) {\n      return g_debug_mode_map[i].mode;\n    }\n  }\n  return LNK_DebugMode_Null;\n}\n\ninternal LNK_TypeNameHashMode\nlnk_type_name_hash_mode_from_string(String8 name)\n{\n  for (U64 i = 0; i < ArrayCount(g_type_name_hash_mode_map); i += 1) {\n    if (str8_match_cstr(g_type_name_hash_mode_map[i].name, name, StringMatchFlag_CaseInsensitive)) {\n      return g_type_name_hash_mode_map[i].mode;\n    }\n  }\n  return LNK_TypeNameHashMode_Null;\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_push_option_if_not_presentf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...)\n{\n  LNK_CmdOption *opt = 0;\n  String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch_type);\n  if (!lnk_cmd_line_has_option_string(*cmd_line, cmd_switch_name)) {\n    va_list param_args;\n    va_start(param_args, param_fmt);\n    String8 param_str = push_str8fv(arena, param_fmt, param_args);\n    va_end(param_args);\n\n    opt = lnk_cmd_line_push_option_string(arena, cmd_line, cmd_switch_name, param_str);\n  }\n  return opt;\n}\n\ninternal LNK_CmdOption *\nlnk_cmd_line_push_optionf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch, char *param_fmt, ...)\n{\n  va_list param_args;\n  va_start(param_args, param_fmt);\n  String8 param_str = push_str8fv(arena, param_fmt, param_args);\n  va_end(param_args);\n  String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch);\n  LNK_CmdOption *opt = lnk_cmd_line_push_option_string(arena, cmd_line, cmd_switch_name, param_str);\n  return opt;\n}\n\ninternal B32\nlnk_cmd_line_has_switch(LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch)\n{\n  String8 cmd_switch_name = lnk_string_from_cmd_switch_type(cmd_switch);\n  return lnk_cmd_line_has_option_string(cmd_line, cmd_switch_name);\n}\n\ninternal void\nlnk_error_cmd_switch(LNK_ErrorCode code, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, char *fmt, ...)\n{\n  Temp scratch = scratch_begin(0,0);\n  va_list args; va_start(args, fmt);\n  String8 switch_name = lnk_string_from_cmd_switch_type(cmd_switch);\n  String8 message     = push_str8fv(scratch.arena, fmt, args);\n  String8 output      = push_str8f(scratch.arena, \"/%S: %S\", switch_name, message);\n  lnk_error_obj(code, obj, \"%S\", output);\n  va_end(args);\n  scratch_end(scratch);\n}\n\ninternal void\nlnk_error_cmd_switch_invalid_param_count(LNK_ErrorCode code, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch)\n{\n  lnk_error_cmd_switch(code, obj, cmd_switch, \"invalid number of parameters\");\n}\n\ninternal void\nlnk_error_cmd_switch_invalid_param(LNK_ErrorCode code, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8 param)\n{\n  lnk_error_cmd_switch(code, obj, cmd_switch, \"invalid parameter \\\"%S\\\"\", param);\n}\n\ninternal String8\nlnk_error_check_and_strip_quotes(LNK_ErrorCode error_code, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8 string)\n{\n  String8 result = string;\n\n  B32 starts_with_quote = str8_match(str8_substr(string, rng_1u64(0,1)), str8_lit(\"\\\"\"), 0);\n  B32 ends_with_quote   = 0;\n  if (string.size > 2) {\n    ends_with_quote = str8_match(str8_substr(string, rng_1u64(string.size-1,string.size)), str8_lit(\"\\\"\"), 0);\n  }\n\n  if (starts_with_quote && ends_with_quote) {\n    result = str8_skip(result, 1);\n    result = str8_chop(result, 1);\n  } else if (starts_with_quote && !ends_with_quote) {\n    lnk_error_cmd_switch(error_code, obj, cmd_switch, \"detected unmatched \\\" in \\\"%S\\\"\", string);\n  }\n\n  return result;\n}\n\ninternal void\nlnk_error_invalid_uac_level_param(LNK_ErrorCode error_code, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8 input)\n{\n  lnk_error_cmd_switch(error_code, obj, cmd_switch, \"invalid param format, expected \\\"level={'asInvoker'|'highestAvailable'|'requireAdministrator'}\\\" but got \\\"%S\\\"\", input);\n}\n\ninternal void\nlnk_error_invalid_uac_ui_access_param(LNK_ErrorCode error_code, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8 input)\n{\n  lnk_error_cmd_switch(error_code, obj, cmd_switch, \"invalid param format, expected \\\"uiAccess={'true'|'false'}\\\" but got \\\"%S\\\"\", input);\n}\n\ninternal B32\nlnk_cmd_switch_parse_version(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, Version *ver_out)\n{\n  Temp scratch = scratch_begin(0,0);\n  B32 is_parsed = 0;\n\n  if (value_strings.node_count == 1) {\n    String8List split_list = str8_split_by_string_chars(scratch.arena, value_strings.first->string, str8_lit(\".\"), StringSplitFlag_KeepEmpties);\n\n    String8 maj_str = str8_lit(\"0\");\n    String8 min_str = str8_lit(\"0\");\n    if (split_list.node_count == 1) {\n      maj_str = split_list.first->string;\n    } else if (split_list.node_count == 2) {\n      maj_str = split_list.first->string;\n      min_str = split_list.last->string;\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid version format, too many dots, expected format: {N[.N]}\");\n      goto exit;\n    }\n\n    U64 maj, min;\n    if (try_u64_from_str8_c_rules(maj_str, &maj)) {\n      if (try_u64_from_str8_c_rules(min_str, &min)) {\n        *ver_out = make_version(maj, min);\n        is_parsed = 1;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse minor version\");\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse major version\");\n    }\n  } else {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n  }\n\nexit:;\n  scratch_end(scratch);\n  return is_parsed;\n}\n\ninternal B32\nlnk_cmd_switch_parse_tuple(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, Rng1U64 *tuple_out)\n{\n  if (value_strings.node_count == 1) {\n    U64 value;\n    if (try_u64_from_str8_c_rules(value_strings.first->string, &value)) {\n      tuple_out->v[0] = value;\n      return 1;\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse the parameter \\\"%S\\\"\", value_strings.first->string);\n    }\n  } else if (value_strings.node_count == 2) {\n    U64 a,b;\n    if (try_u64_from_str8_c_rules(value_strings.first->string, &a)) {\n      if (try_u64_from_str8_c_rules(value_strings.last->string, &b)) {\n        tuple_out->v[0] = a;\n        tuple_out->v[1] = b;\n        return 1;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable ot parse second parameter \\\"%S\\\"\", value_strings.last->string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse first parameter \\\"%S\\\"\", value_strings.first->string);\n    }\n  } else {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n  }\n  return 0;\n}\n\ninternal B32\nlnk_try_parse_u64(String8 string, LNK_ParseU64Flags flags, U64 *value_out)\n{\n  if (try_u64_from_str8_c_rules(string, value_out)) {\n    if (flags & LNK_ParseU64Flag_CheckUnder32bit) {\n      if (*value_out > max_U32) {\n        return 0;\n      }\n    }\n    if (flags & LNK_ParseU64Flag_CheckPow2) {\n      if (!IsPow2(*value_out)) {\n        return 0;\n      }\n    }\n  }\n\n  return 1;\n}\n\ninternal B32\nlnk_cmd_switch_parse_u64(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *value_out, LNK_ParseU64Flags flags)\n{\n  if (value_strings.node_count != 1) {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters, exepcted integer number as input\");\n    return 0;\n  }\n  if (!lnk_try_parse_u64(value_strings.first->string, flags, value_out)) {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse string \\\"%S\\\"\", value_strings.first->string);\n    return 0;\n  }\n  return 1;\n}\n\ninternal B32\nlnk_cmd_switch_parse_u32(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U32 *value_out, LNK_ParseU64Flags flags)\n{\n  U64 value;\n  if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &value, flags | LNK_ParseU64Flag_CheckUnder32bit)) {\n    *value_out = (U32)value;\n    return 1;\n  }\n  return 0;\n}\n\ninternal B32\nlnk_cmd_switch_parse_u64_list(Arena *arena, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64List *list_out, LNK_ParseU64Flags flags)\n{\n  for (String8Node *string_n = value_strings.first; string_n != 0; string_n = string_n->next) {\n    U64 value;\n    if (!lnk_try_parse_u64(string_n->string, flags, &value)) {\n      return 0;\n    }\n    u64_list_push(arena, list_out, value);\n  }\n  return 1;\n}\n\ninternal B32\nlnk_cmd_switch_parse_flag(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, LNK_SwitchState *value_out)\n{\n  B32 is_parsed = 0;\n  if (value_strings.node_count > 1) {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"too many parameters\");\n  } else if (value_strings.node_count == 1) {\n    if (str8_match_lit(\"no\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n      *value_out = LNK_SwitchState_No;\n      is_parsed = 1;\n    } else if (str8_match_lit(\"yes\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n      *value_out = LNK_SwitchState_Yes;\n      is_parsed = 1;\n    } else if (value_strings.first->string.size == 0) {\n      *value_out = 1;\n      is_parsed = 1;\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid parameter \\\"%S\\\"\", value_strings.first->string);\n    }\n  } else {\n    *value_out = LNK_SwitchState_Yes;\n    is_parsed = 1;\n  }\n  return is_parsed;\n}\n\ninternal void\nlnk_cmd_switch_set_flag_inv_16(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U16 *flags, U16 bits)\n{\n  LNK_SwitchState state;\n  if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) {\n    switch (state) {\n    case LNK_SwitchState_Null: break;\n    case LNK_SwitchState_Yes : *flags |= bits;  break;\n    case LNK_SwitchState_No  : *flags &= ~bits; break;\n    }\n  }\n}\n\ninternal void\nlnk_cmd_switch_set_flag_inv_64(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *flags, U64 bits)\n{\n  LNK_SwitchState state;\n  if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) {\n    switch (state) {\n    case LNK_SwitchState_Null: break;\n    case LNK_SwitchState_Yes : *flags |= bits;  break;\n    case LNK_SwitchState_No  : *flags &= ~bits; break;\n    }\n  }\n}\n\ninternal void\nlnk_cmd_switch_set_flag_16(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U16 *flags, U16 bits)\n{\n  LNK_SwitchState state;\n  if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) {\n    switch (state) {\n    case LNK_SwitchState_Null: break;\n    case LNK_SwitchState_Yes : *flags |= bits;  break;\n    case LNK_SwitchState_No  : *flags &= ~bits; break;\n    }\n  }\n}\n\ninternal void\nlnk_cmd_switch_set_flag_32(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U32 *flags, U32 bits)\n{\n  LNK_SwitchState state;\n  if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) {\n    switch (state) {\n    case LNK_SwitchState_Null: break;\n    case LNK_SwitchState_Yes : *flags |= bits;  break;\n    case LNK_SwitchState_No  : *flags &= ~bits; break;\n    }\n  }\n}\n\ninternal void\nlnk_cmd_switch_set_flag_64(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *flags, U64 bits)\n{\n  LNK_SwitchState state;\n  if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) {\n    switch (state) {\n    case LNK_SwitchState_Null: break;\n    case LNK_SwitchState_Yes : *flags |= bits;  break;\n    case LNK_SwitchState_No  : *flags &= ~bits; break;\n    }\n  }\n}\n\ninternal B32\nlnk_cmd_switch_parse_string(LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, String8 *string_out)\n{\n  if (value_strings.node_count == 1) {\n    if (value_strings.first->string.size > 0) {\n      *string_out = value_strings.first->string;\n      return 1;\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"empty string is not permitted\");\n    }\n  } else {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n  }\n  return 0;\n}\n\ninternal void\nlnk_cmd_switch_parse_string_copy(Arena *arena, LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, String8 *string_out)\n{\n  if (lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, string_out)) {\n    *string_out = push_str8_copy(arena, *string_out);\n  }\n}\n\ninternal B32\nlnk_parse_alt_name_directive(String8 string, LNK_Obj *obj, LNK_AltName *alt_out)\n{\n  Temp scratch = scratch_begin(0,0);\n  B32 is_parse_ok = 0;\n  String8List pair = str8_split_by_string_chars(scratch.arena, string, str8_lit(\"=\"), 0);\n  if (pair.node_count == 2) {\n    alt_out->from = pair.first->string;\n    alt_out->to   = pair.last->string;\n    alt_out->obj  = obj;\n    is_parse_ok = 1;\n  } else {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, LNK_CmdSwitch_AlternateName, \"syntax error in \\\"%S\\\", expected format \\\"FROM=TO\\\"\", string);\n  }\n  scratch_end(scratch);\n  return is_parse_ok;\n}\n\ninternal B32\nlnk_parse_export_directive_ex(Arena *arena, String8List directive, LNK_Obj *obj, PE_ExportParse *export_out)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  B32 is_parsed = 0;\n\n  // parse \"alias=name\"\n  String8     name  = {0};\n  String8     alias = {0};\n  String8List flags = {0};\n  {\n    String8List alias_name_split = str8_split_by_string_chars(scratch.arena, directive.first->string, str8_lit(\"=\"), 0);\n    if (alias_name_split.node_count == 2) {\n      alias = alias_name_split.first->string;\n      name  = alias_name_split.last->string;\n    } else if (alias_name_split.node_count == 1) {\n      name = alias_name_split.first->string;\n    } else {\n      String8 d = str8_list_join(scratch.arena, &directive, &(StringJoin){.sep=str8_lit(\",\")});\n      lnk_error_obj(LNK_Error_IllExport, obj, \"invalid export directive \\\"/EXPORT:%S\\\"\", d);\n      goto exit;\n    }\n\n    flags = directive;\n    str8_list_pop_front(&flags);\n  }\n\n  // discard alias to itself\n  if (str8_match(name, alias, 0)) {\n    alias = str8_zero();\n  }\n\n  // does directive have ordinal?\n  COFF_ImportByType import_by = COFF_ImportBy_Name;\n  U16 ordinal16 = 0;\n  String8 ordinal = {0};\n  String8 noname_flag = {0};\n  if (str8_match(str8_prefix(str8_list_first(&flags), 1), str8_lit(\"@\"), 0)) {\n    // parse ordinal\n    ordinal = str8_skip(str8_list_pop_front(&flags)->string, 1);\n    if (str8_is_integer(ordinal, 10)) {\n      U64 ordinal64 = u64_from_str8(ordinal, 10);\n      if (ordinal64 <= max_U16) {\n        ordinal16 = (U16)ordinal64;\n        import_by = COFF_ImportBy_Ordinal;\n      } else {\n        String8 d = str8_list_join(scratch.arena, &directive, &(StringJoin){.sep=str8_lit(\",\")});\n        lnk_error_obj(LNK_Error_IllExport, obj, \"ordinal value must fit into 16-bit integer, \\\"/EXPORT:%S\\\"\", d);\n        goto exit;\n      }\n    } else {\n      String8 d = str8_list_join(scratch.arena, &directive, &(StringJoin){.sep=str8_lit(\",\")});\n      lnk_error_obj(LNK_Error_IllExport, obj, \"invalid export directive \\\"/EXPORT:%S\\\"\", d);\n      goto exit;\n    }\n\n    // detect NONAME flag\n    if (str8_match(str8_list_first(&flags), str8_lit(\"NONAME\"), StringMatchFlag_CaseInsensitive)) {\n      noname_flag = str8_list_pop_front(&flags)->string;\n    }\n  }\n\n  // detect PRIVATE flag\n  String8 private_flag = {0};\n  if (str8_match(str8_list_first(&flags), str8_lit(\"PRIVATE\"), StringMatchFlag_CaseInsensitive)) {\n    private_flag = str8_list_pop_front(&flags)->string;\n  }\n\n  // parse export type\n  COFF_ImportType type = COFF_ImportHeader_Code;\n  if (flags.node_count) {\n    type = coff_import_header_type_from_string(str8_list_pop_front(&flags)->string);\n    if (type == COFF_ImportType_Invalid) {\n      String8 d = str8_list_join(scratch.arena, &directive, &(StringJoin){.sep=str8_lit(\",\")});\n      lnk_error_obj(LNK_Error_IllExport, obj, \"invalid export directive \\\"/EXPORT:%S\\\"\", d);\n      goto exit;\n    }\n  }\n\n  // are there leftover nodes?\n  if (flags.node_count != 0) {\n    String8 d = str8_list_join(scratch.arena, &directive, &(StringJoin){.sep=str8_lit(\",\")});\n    lnk_error_obj(LNK_Error_IllExport, obj, \"invalid export directive \\\"/EXPORT:%S\\\"\", d);\n    goto exit;\n  }\n\n  // fill out export\n  export_out->obj_path            = obj ? obj->path : str8_zero();\n  export_out->lib_path            = lnk_obj_get_lib_path(obj);\n  export_out->name                = push_str8_copy(arena, name);\n  export_out->alias               = push_str8_copy(arena, alias);\n  export_out->type                = type;\n  export_out->import_by           = import_by;\n  export_out->ordinal             = ordinal16;\n  export_out->is_ordinal_assigned = ordinal.size > 0;\n  export_out->is_noname_present   = noname_flag.size > 0;\n  export_out->is_private          = private_flag.size > 0;\n  export_out->is_forwarder        = str8_find_needle(name, 0, str8_lit(\".\"), 0) < name.size;\n\n  is_parsed = 1;\n  \nexit:;\n  scratch_end(scratch);\n  ProfEnd();\n  return is_parsed;\n}\n\ninternal B32\nlnk_parse_export_directive(Arena *arena, String8 directive, LNK_Obj *obj, PE_ExportParse *export_out)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List split_directive = str8_split_by_string_chars(scratch.arena, directive, str8_lit(\",\"), 0);\n  B32 is_parsed = lnk_parse_export_directive_ex(arena, split_directive, obj, export_out);\n  scratch_end(scratch);\n  return is_parsed;\n}\n\ninternal B32\nlnk_parse_merge_directive(String8 string, LNK_Obj *obj, LNK_MergeDirective *out)\n{\n  Temp scratch = scratch_begin(0, 0);\n  B32 is_parse_ok = 0;\n  String8List list = str8_split_by_string_chars(scratch.arena, string, str8_lit(\"=\"), 0);\n  if (list.node_count == 2) {\n    out->src = list.first->string;\n    out->dst = list.last->string;\n    is_parse_ok = 1;\n  } else {\n    lnk_error_cmd_switch(LNK_Warning_InvalidMergeDirectiveFormat, obj, LNK_CmdSwitch_Merge, \"unable to parse merge directive, expected format \\\"/MERGE:FROM=TO\\\" but got \\\"%S\\\"\", string);\n  }\n  scratch_end(scratch);\n  return is_parse_ok;\n}\n\ninternal LNK_AltNameNode *\nlnk_alt_name_list_push(Arena *arena, LNK_AltNameList *list, LNK_AltName v)\n{\n  LNK_AltNameNode *node = push_array(arena, LNK_AltNameNode, 1);\n  node->v = v;\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n  return node;\n}\n\ninternal LNK_MergeDirectiveNode *\nlnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective v)\n{\n  LNK_MergeDirectiveNode *node = push_array_no_zero(arena, LNK_MergeDirectiveNode, 1);\n  node->v = v;\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n  return node;\n}\n\ninternal String8\nlnk_get_image_name(LNK_Config *config)\n{\n  String8 image_name = config->image_name;\n  image_name = str8_skip_last_slash(image_name);\n  image_name = str8_chop_last_dot(image_name);\n  return image_name;\n}\n\ninternal U64\nlnk_get_default_function_pad_min(COFF_MachineType machine)\n{\n  U64 function_pad_min = 0;\n  switch (machine) {\n    case COFF_MachineType_Unknown: break;\n    case COFF_MachineType_X86: {\n      function_pad_min = 5;\n    } break;\n    case COFF_MachineType_X64: {\n      function_pad_min = 6;\n    } break;\n    default: {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, 0, LNK_CmdSwitch_FunctionPadMin, \"default paramter is not defined for: %S\", coff_string_from_machine_type(machine));\n    } break;\n  }\n  return function_pad_min;\n}\n\ninternal U64\nlnk_get_base_addr(LNK_Config *config)\n{\n  U64 base_addr = config->user_base_addr;\n  if (base_addr == 0) {\n    if (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) {\n      base_addr = coff_default_dll_base_from_machine(config->machine);\n    } else if (config->file_characteristics & PE_ImageFileCharacteristic_EXE) {\n      if ((~config->file_characteristics & PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE) && config->machine == COFF_MachineType_X64) {\n        base_addr = coff_default_exe_base_from_machine(COFF_MachineType_X86);\n      } else {\n        base_addr = coff_default_exe_base_from_machine(config->machine);\n      }\n    } else {\n      lnk_error(LNK_Error_Cmdl, \"image type is not specified.\");\n    }\n  }\n  return base_addr;\n}\n\ninternal Version\nlnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine)\n{\n  Version ver = make_version(0,0);\n  switch (subsystem) {\n  case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: ver = make_version(1,0); break;\n\n  case PE_WindowsSubsystem_WINDOWS_CUI: {\n    switch (machine) {\n    case COFF_MachineType_X64: \n    case COFF_MachineType_X86: ver = make_version(6,0); break;\n\n    case COFF_MachineType_ArmNt:\n    case COFF_MachineType_Arm64:\n    case COFF_MachineType_Arm: ver = make_version(6,2); break;\n\n    default: lnk_not_implemented(\"define subsystem(%S) version for %S\", pe_string_from_subsystem(subsystem), coff_string_from_machine_type(machine)); break;\n    }\n  } break;\n\n  case PE_WindowsSubsystem_WINDOWS_GUI: {\n    switch (machine) {\n    case COFF_MachineType_X64:\n    case COFF_MachineType_X86: ver = make_version(6,0); break;\n\n    case COFF_MachineType_ArmNt:\n    case COFF_MachineType_Arm64:\n    case COFF_MachineType_Arm: ver = make_version(6,2); break;\n\n    default: lnk_not_implemented(\"define subsystem(%S) version for %S\", pe_string_from_subsystem(subsystem), coff_string_from_machine_type(machine)); break;\n    }\n  } break;\n\n  case PE_WindowsSubsystem_POSIX_CUI: ver = make_version(19,90); break;\n\n  case PE_WindowsSubsystem_EFI_APPLICATION: \n  case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER:\n  case PE_WindowsSubsystem_EFI_ROM: \n  case PE_WindowsSubsystem_EFI_RUNTIME_DRIVER: ver = make_version(1,0); break;\n\n  case PE_WindowsSubsystem_NATIVE_WINDOWS:\n  case PE_WindowsSubsystem_NATIVE: lnk_not_implemented(\"detect -drive=WDM switch\"); break;\n\n  default: lnk_not_implemented(\"unknown subsystem kind %u\", subsystem); break;\n  }\n  return ver;\n}\n\ninternal Version\nlnk_get_min_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine)\n{\n  Version ver = make_version(0,0);\n  switch (subsystem) {\n  case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: ver = make_version(1,0); break;\n\n  case PE_WindowsSubsystem_WINDOWS_CUI: {\n    switch (machine) {\n    case COFF_MachineType_X86: ver = make_version(5,1); break;\n\n    case COFF_MachineType_X64: ver = make_version(5,2); break;\n\n    case COFF_MachineType_ArmNt:\n    case COFF_MachineType_Arm64:\n    case COFF_MachineType_Arm: ver = make_version(6,2); break;\n\n    default: lnk_not_implemented(\"define min subsystem(%S) version for %S\", pe_string_from_subsystem(subsystem), coff_string_from_machine_type(machine)); break;\n    }\n  } break;\n\n  case PE_WindowsSubsystem_WINDOWS_GUI: {\n    switch (machine) {\n    case COFF_MachineType_X86: ver = make_version(5,1); break;\n\n    case COFF_MachineType_X64: ver = make_version(5,2); break;\n\n    case COFF_MachineType_ArmNt:\n    case COFF_MachineType_Arm64:\n    case COFF_MachineType_Arm: ver = make_version(6,2); break;\n\n    default: lnk_not_implemented(\"define min subsystem(%S) version for %S\", pe_string_from_subsystem(subsystem), coff_string_from_machine_type(machine)); break;\n    }\n  } break;\n\n  case PE_WindowsSubsystem_POSIX_CUI: ver = make_version(1,0); break;\n\n  case PE_WindowsSubsystem_EFI_APPLICATION: \n  case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER:\n  case PE_WindowsSubsystem_EFI_ROM: \n  case PE_WindowsSubsystem_EFI_RUNTIME_DRIVER: ver = make_version(1,0); break;\n\n  case PE_WindowsSubsystem_NATIVE_WINDOWS:\n  case PE_WindowsSubsystem_NATIVE: lnk_not_implemented(\"detect -drive=WDM switch\"); break;\n  \n  default: lnk_not_implemented(\"unknown subsystem kind %u\", subsystem);\n  }\n  return ver;\n}\n\ninternal B32\nlnk_do_debug_info(LNK_Config *config)\n{\n  B32 do_debug_info = config->rad_debug == LNK_SwitchState_Yes ||\n    (config->debug_mode != LNK_DebugMode_None && config->debug_mode != LNK_DebugMode_Null);\n  return do_debug_info;\n}\n\ninternal B32\nlnk_is_thread_pool_shared(LNK_Config *config)\n{\n  return config->shared_thread_pool_name.size > 0;\n}\n\ninternal B32\nlnk_is_section_removed(LNK_Config *config, String8 section_name)\n{\n  B32 is_removed = 0;\n  for (String8Node *name_n = config->remove_sections.first; name_n != 0 && !is_removed; name_n = name_n->next) {\n    is_removed = str8_match(section_name, name_n->string, 0);\n  }\n  return is_removed;\n}\n\ninternal B32\nlnk_is_dll_delay_load(LNK_Config *config, String8 dll_name)\n{\n  return hash_table_search_path_u64(config->delay_load_ht, dll_name, 0);\n}\n\ninternal String8\nlnk_get_lib_name(String8 path)\n{\n  static String8 LIB_EXT = str8_lit_comp(\".LIB\");\n  \n  // strip path\n  String8 name = str8_skip_last_slash(path);\n  \n  // strip extension\n  String8 name_ext = str8_postfix(name, LIB_EXT.size);\n  if (str8_match(name_ext, LIB_EXT, StringMatchFlag_CaseInsensitive)) {\n    name = str8_chop(name, LIB_EXT.size);\n  }\n  \n  return name;\n}\n\ninternal void\nlnk_push_disallow_lib(LNK_Config *config, String8 path)\n{\n  String8 lib_name = lnk_get_lib_name(path);\n  hash_table_push_path_u64(config->arena, config->disallow_lib_ht, lib_name, 0);\n}\n\ninternal B32\nlnk_is_lib_disallowed(LNK_Config *config, String8 path)\n{\n  String8 lib_name = lnk_get_lib_name(path);\n  return hash_table_search_path(config->disallow_lib_ht, lib_name) != 0;\n}\n\ninternal void\nlnk_include_symbol(LNK_Config *config, String8 name, LNK_Obj *obj)\n{\n  // is this a duplicate symbol?\n  if (hash_table_search_string_raw(config->include_symbol_ht, name)) {\n    return;\n  }\n\n  name = push_str8_copy(config->arena, name);\n\n  LNK_IncludeSymbolNode *node = push_array(config->arena, LNK_IncludeSymbolNode, 1);\n  node->v.name = name;\n  node->v.obj  = obj;\n\n  SLLQueuePush(config->include_symbol_list.first, config->include_symbol_list.last, node);\n  config->include_symbol_list.count += 1;\n\n  hash_table_push_string_raw(config->arena, config->include_symbol_ht, name, node);\n}\n\ninternal void\nlnk_print_build_info()\n{\n  fprintf(stdout, \"  Compiler: %s\\n\", COMPILER_STRING);\n  fprintf(stdout, \"  Mode    : %s\\n\", BUILD_MODE_STRING);\n  fprintf(stdout, \"  Date    : %s %s\\n\", __TIME__, __DATE__);\n  fprintf(stdout, \"  Version : %s\\n\", BUILD_VERSION_STRING_LITERAL);\n}\n\ninternal void\nlnk_print_help(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  fprintf(stdout, \"--- Help -------------------------------------------------------\\n\");\n  fprintf(stdout, \"  %s\\n\", BUILD_TITLE_STRING_LITERAL);\n  fprintf(stdout, \"\\n\");\n  fprintf(stdout, \"  Usage: radlink.exe [Options] [Files] [@rsp]\\n\");\n  fprintf(stdout, \"\\n\");\n\n  fprintf(stdout, \"  Options:\\n\");\n  for (U64 i = 0; i < ArrayCount(g_cmd_switch_map); ++i) {\n    Temp temp = temp_begin(scratch.arena);\n\n    char *name = g_cmd_switch_map[i].name;\n    char *args = g_cmd_switch_map[i].args;\n    char *desc = g_cmd_switch_map[i].desc;\n    LNK_CmdSwitchType type = g_cmd_switch_map[i].type;\n\n    if (strcmp(name, \"\") == 0 ||\n        strcmp(name, \"NOT_IMPLEMENTED\") == 0 ||\n        type == LNK_CmdSwitch_Help) {\n      continue;\n    }\n\n    String8 name_args = push_str8f(temp.arena, \"%s%s\", name, args);\n\n    fprintf(stdout, \"   /%-32.*s %s%s\\n\",\n            str8_varg(name_args),\n            desc,\n            type == LNK_CmdSwitch_NotImplemented ? \"Not Implemented\" : \"\");\n\n    temp_end(temp);\n  }\n\n  fprintf(stdout, \"\\n\");\n\n  scratch_end(scratch);\n}\n\ninternal String8\nlnk_expand_env_vars_windows(Arena *arena, HashTable *env_vars, String8 string)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8List list = {0};\n  for (U64 i = 0; i < string.size; ) {\n    U64 open  = str8_find_needle(string, i,      str8_lit(\"%\"), 0);\n    U64 close = str8_find_needle(string, open+1, str8_lit(\"%\"), 0);\n\n    String8 text = str8_substr(string, rng_1u64(i, open));\n    str8_list_push(scratch.arena, &list, text);\n    i += text.size;\n\n    if (open < close) {\n      String8     env_var_name = str8_substr(string, rng_1u64(open+1, close));\n      BucketNode *match        = hash_table_search_path(env_vars, env_var_name);\n      if (match) {\n        str8_list_push(scratch.arena, &list, match->v.value_string);\n        i = close+1;\n      } else {\n        str8_list_pushf(scratch.arena, &list, \"%%%S\", env_var_name);\n        i = close;\n      }\n    }\n  }\n\n  String8 result = str8_list_join(arena, &list, 0);\n\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8List\nlnk_unwrap_rsp(Arena *arena, String8List arg_list)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8List result = {0};\n\n  for (String8Node *curr = arg_list.first; curr != 0; curr = curr->next) {\n    B32 is_rsp = str8_match_lit(\"@\", curr->string, StringMatchFlag_RightSideSloppy);\n    if (is_rsp) {\n      // remove \"@\"\n      String8 name = str8_skip(curr->string, 1);\n\n      if (os_file_path_exists(name)) {\n        // read rsp from disk\n        String8 file = lnk_read_data_from_file_path(scratch.arena, 0, name);\n        \n        // parse rsp\n        String8List rsp_args = lnk_arg_list_parse_windows_rules(scratch.arena, file);\n        \n        // handle case where rsp references another rsp\n        String8List list = lnk_unwrap_rsp(arena, rsp_args);\n\n        // push arguments from rsp\n        list = str8_list_copy(arena, &list);\n        str8_list_concat_in_place(&result, &list);\n       } else {\n        lnk_error(LNK_Error_Cmdl, \"unable to find rsp: %S\", name);\n      }\n    } else {\n      // push regular argument\n      String8 str = push_str8_copy(arena, curr->string);\n      str8_list_push(arena, &result, str);\n    }\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal void\nlnk_apply_cmd_option_to_config(LNK_Config *config, String8 cmd_name, String8List value_strings, LNK_Obj *obj)\n{\n  Temp scratch = scratch_begin(&config->arena, 1);\n\n  LNK_CmdSwitchType cmd_switch = lnk_cmd_switch_type_from_string(cmd_name);\n\n  switch (cmd_switch) {\n  case LNK_CmdSwitch_Null: {\n    String8 value = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.sep=str8_lit_comp(\",\")});\n    lnk_error_obj(LNK_Warning_UnknownSwitch, obj, \"unknown switch: \\\"/%S%s%S\\\"\", cmd_name, value.size ? \":\" : \"\", value);\n  } break;\n\n  default: break;\n\n  case LNK_CmdSwitch_NotImplemented: {\n    String8 value = str8_list_join(scratch.arena, &value_strings, &(StringJoin){.sep=str8_lit_comp(\",\")});\n    lnk_not_implemented(\"switch \\\"%S\\\" is not implemented \\\"%S\\\"\", cmd_name, value);\n  } break;\n\n  case LNK_CmdSwitch_Align: {\n    lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->sect_align, LNK_ParseU64Flag_CheckPow2);\n  } break;\n\n  case LNK_CmdSwitch_AllowBind: {\n    lnk_cmd_switch_set_flag_inv_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_NO_BIND);\n  } break;\n\n  case LNK_CmdSwitch_AllowIsolation: {\n    lnk_cmd_switch_set_flag_inv_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_NO_ISOLATION);\n  } break;\n\n  case LNK_CmdSwitch_AlternateName: {\n    if (value_strings.node_count == 1) {\n      LNK_AltName alt_name;\n      if (lnk_parse_alt_name_directive(value_strings.first->string, obj, &alt_name)) {\n        String8 to_extant = {0};\n        if (hash_table_search_string_string(config->alt_name_ht, alt_name.from, &to_extant)) {\n          if (str8_match(to_extant, alt_name.to, 0)) {\n            // ignore, duplicate\n          } else {\n            lnk_error_obj(LNK_Error_AlternateNameConflict, obj, \"conflicting alternative name: existing '%S=%S' vs. new '%S=%S'\", alt_name.from, to_extant, alt_name.from, alt_name.to);\n          }\n        } else {\n          alt_name.from = push_str8_copy(config->arena, alt_name.from);\n          alt_name.to   = push_str8_copy(config->arena, alt_name.to);\n\n          lnk_alt_name_list_push(config->arena, &config->alt_name_list, alt_name);\n          hash_table_push_string_string(config->arena, config->alt_name_ht, alt_name.from, alt_name.to);\n        }\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_AppContainer: {\n    lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_APPCONTAINER);\n  } break;\n\n  case LNK_CmdSwitch_Base: {\n    if (value_strings.node_count == 2) {\n      String8Node *first_node = value_strings.first;\n      //String8Node *second_node = first_node->next;\n      B32 is_response_file = str8_match_lit(\"@\", first_node->string, StringMatchFlag_RightSideSloppy);\n      if (is_response_file) {\n        //String8 file_path = first_node->string;\n        //String8 tag = second_node->string;\n        lnk_not_implemented(\"Response files are not implemented for /BASE\");\n      } else {\n        Rng1U64 addr_size = {0};\n        if (lnk_cmd_switch_parse_tuple(obj, cmd_switch, value_strings, &addr_size)) {\n          config->user_base_addr = addr_size.v[0];\n          config->max_image_size = addr_size.v[1];\n        }\n      }\n    } else if (value_strings.node_count == 1) {\n      U64 addr;\n      if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &addr, 0)) {\n        config->user_base_addr = addr;\n      }\n    } else if (value_strings.node_count == 0) {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"expected at least 1 parameter\");\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"too many parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Brepro: {\n    // not supported -- ignore\n  } break;\n\n  case LNK_CmdSwitch_Debug: {\n    if (value_strings.node_count == 0) {\n      config->debug_mode = LNK_DebugMode_Full;\n    } else if (value_strings.node_count == 1) {\n      LNK_DebugMode debug_mode = lnk_debug_mode_from_string(value_strings.first->string);\n      if (debug_mode == LNK_DebugMode_GHash) {\n        config->debug_mode = LNK_DebugMode_Full;\n        lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"GHASH is not supported, switching to FULL\");\n      } else if (debug_mode == LNK_DebugMode_FastLink) {\n        config->debug_mode = LNK_DebugMode_Full;\n        lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"FASTLINK is not supported, switching to FULL\");\n      } else if (debug_mode != LNK_DebugMode_Null) {\n        config->debug_mode = debug_mode;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid parameter \\\"%S\\\"\", value_strings.first->string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_DefaultLib: {\n    String8List default_lib_list = str8_list_copy(config->arena, &value_strings);\n    if (obj) {\n      str8_list_concat_in_place(&config->input_obj_lib_list, &default_lib_list);\n    } else {\n      str8_list_concat_in_place(&config->input_default_lib_list, &default_lib_list);\n    }\n  } break;\n\n  case LNK_CmdSwitch_Delay: {\n    if (value_strings.node_count == 0 || value_strings.node_count > 1) {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    } else {\n      String8 value = value_strings.first->string;\n      if (str8_match_lit(\"unload\", value, StringMatchFlag_CaseInsensitive)) {\n        config->import_table_emit_uiat = 1;\n      } else if (str8_match_lit(\"nobind\", value, StringMatchFlag_CaseInsensitive)) {\n        config->import_table_emit_biat = 0;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unknown parameter \\\"%S\\\"\", value);\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_DelayLoad: {\n    for (String8Node *name_n = value_strings.first; name_n != 0; name_n = name_n->next) {\n      if (hash_table_search_path_u64(config->delay_load_ht, name_n->string, 0)) { continue; }\n      String8 name = push_str8_copy(config->arena, name_n->string);\n      hash_table_push_path_u64(config->arena, config->delay_load_ht, name, 0);\n      str8_list_push(config->arena, &config->delay_load_dll_list, name);\n    }\n  } break;\n\n  case LNK_CmdSwitch_Dll: {\n    config->file_characteristics |= PE_ImageFileCharacteristic_FILE_DLL;\n  } break;\n\n  case LNK_CmdSwitch_DynamicBase: {\n    lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_DYNAMIC_BASE);\n  } break;\n\n  case LNK_CmdSwitch_Dump: { \n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unsupported switch; binary dump is done by passing /DUMP to link.exe\");\n  } break;\n\n  case LNK_CmdSwitch_D2: {\n    // not supported -- ignore\n  } break;\n\n  case LNK_CmdSwitch_Entry: {\n    String8 new_entry_point_name = {0};\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &new_entry_point_name);\n\n    if (config->entry_point_name.size) {\n      lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"unable to redefine entry point \\\"%S\\\" to \\\"%S\\\"\", config->entry_point_name, new_entry_point_name);\n      break;\n    }\n\n    config->entry_point_name = new_entry_point_name;\n  } break;\n\n  case LNK_CmdSwitch_ErrorReport: {\n    // not supported -- ignore\n  } break;\n\n  case LNK_CmdSwitch_Export: {\n    PE_ExportParse export_parse = {0};\n    if (lnk_parse_export_directive_ex(config->arena, value_strings, obj, &export_parse)) {\n      String8             export_name = pe_name_from_export_parse(&export_parse);\n      PE_ExportParseNode *exp_n       = hash_table_search_string_raw(config->export_ht, export_name);\n\n      if (exp_n == 0) {\n        // make sure export is defined\n        if (!export_parse.is_forwarder) {\n          lnk_include_symbol(config, export_parse.name, 0);\n        }\n\n        // push new export\n        exp_n = pe_export_parse_list_push(config->arena, &config->export_symbol_list, export_parse);\n\n        hash_table_push_string_raw(config->arena, config->export_ht, export_name, exp_n);\n      } else {\n        B32 is_ambiguous = 1;\n        PE_ExportParse *extant_export = &exp_n->data;\n\n        if (extant_export->alias.size && export_parse.alias.size && !str8_match(extant_export->alias, export_parse.alias, 0)) {\n          goto report;\n        }\n\n        if (extant_export->ordinal != export_parse.ordinal) {\n          goto report;\n        }\n\n        is_ambiguous = 0;\n\n        if (extant_export->alias.size == 0 && export_parse.alias.size != 0) {\n          extant_export->alias = export_parse.alias;\n        }\n\n      report:;\n       if (is_ambiguous) {\n         lnk_error_obj(LNK_Error_IllExport, obj, \"ambiguous symbol export %S\", export_parse.name);\n       }\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_FastFail: {\n    // do nothing\n  } break;\n\n  case LNK_CmdSwitch_FileAlign: {\n    lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->file_align, LNK_ParseU64Flag_CheckPow2);\n  } break;\n\n  case LNK_CmdSwitch_Fixed: {\n    lnk_cmd_switch_set_flag_64(obj, cmd_switch, value_strings, &config->flags, LNK_ConfigFlag_Fixed);\n  } break;\n\n  case LNK_CmdSwitch_FunctionPadMin: {\n    if (value_strings.node_count == 0) {\n      config->function_pad_min       = 0;\n      config->infer_function_pad_min = 1;\n    } else {\n      lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->function_pad_min, LNK_ParseU64Flag_CheckUnder32bit);\n    }\n    config->do_function_pad_min = LNK_SwitchState_Yes;\n  } break;\n\n  case LNK_CmdSwitch_Heap: {\n    Rng1U64 reserve_commit;\n    reserve_commit.v[0] = config->heap_reserve;\n    reserve_commit.v[1] = config->heap_commit;\n    if (lnk_cmd_switch_parse_tuple(obj, cmd_switch, value_strings, &reserve_commit)) {\n      if (reserve_commit.v[0] >= reserve_commit.v[1]) {\n        U64 reserve_aligned = AlignPow2(reserve_commit.v[0], 4);\n        U64 commit_aligned = AlignPow2(reserve_commit.v[1], 4);\n#if 0\n        if (reserve_aligned != reserve_commit.v[0]) {\n          lnk_error_cmd_switch(LNK_WARNING_CMDL, obj, cmd_switch, \"reserve is not power of two, aligned to %u bytes\", reserve_aligned);\n        }\n        if (commit_aligned != reserve_commit.v[1]) {\n          lnk_error_cmd_switch(LNK_WARNING_CMDL, obj, cmd_switch, \"commit is not power of two, aligned to %u bytes\", commit_aligned);\n        }\n#endif\n        config->heap_reserve = reserve_aligned;\n        config->heap_commit = commit_aligned;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"commit(%llu) is greater than reserve(%llu)\", reserve_commit.v[1], reserve_commit.v[0]);\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_HighEntropyVa: {\n    lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_HIGH_ENTROPY_VA);\n  } break;\n\n  case LNK_CmdSwitch_Ignore: {\n    U64 error_code;\n    if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &error_code, 0)) {\n      switch (error_code) {\n      case LNK_MsWarningCode_UnsuedDelayLoadDll: {\n        lnk_suppress_error(LNK_Warning_UnusedDelayLoadDll);\n      } break;\n      case LNK_MsWarningCode_MissingExternalTypeServer: {\n        lnk_suppress_error(LNK_Warning_MissingExternalTypeServer);\n      } break;\n      case LNK_MsWarningCode_SectionFlagsConflict: {\n        lnk_suppress_error(LNK_Warning_SectionFlagsConflict);\n      } break;\n      default: {\n        lnk_not_implemented(\"TODO: /IGNORE:%llu\", error_code);\n      } break;\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_ImpLib: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->imp_lib_name);\n  } break;\n\n  case LNK_CmdSwitch_Include: {\n    for (String8Node *value_n = value_strings.first; value_n != 0; value_n = value_n->next) {\n      lnk_include_symbol(config, value_n->string, obj);\n    }\n  } break;\n\n  case LNK_CmdSwitch_Incremental: {\n    LNK_SwitchState state;\n    if (lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &state)) {\n      if (state == LNK_SwitchState_Yes) {\n        lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"incremental linkage is not supported\");\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_LargeAddressAware: {\n    lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->file_characteristics, PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE);\n  } break;\n\n  case LNK_CmdSwitch_Lib: {\n    lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unsupported switch; static library is created by passing /LIB to link.exe\");\n  } break;\n\n  case LNK_CmdSwitch_LibPath: {\n    String8List lib_dir_list = str8_list_copy(config->arena, &value_strings);\n    for (String8Node *dir_n = lib_dir_list.first; dir_n != 0; dir_n = dir_n->next) {\n      if (!os_folder_path_exists(dir_n->string)) {\n        String8 full_path = os_full_path_from_path(scratch.arena, dir_n->string);\n        lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"path doesn't exist %S\", full_path);\n      }\n    }\n    str8_list_concat_in_place(&config->lib_dir_list, &lib_dir_list);\n  } break;\n\n  case LNK_CmdSwitch_Machine: {\n    if (value_strings.node_count == 1) {\n      COFF_MachineType machine = coff_machine_from_string(value_strings.first->string);\n      if (machine != COFF_MachineType_Unknown) {\n        config->machine = machine;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unknown parameter \\\"%S\\\"\", value_strings.first->string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Manifest: {\n    if (value_strings.node_count == 1) {\n      String8List  param_list = str8_split_by_string_chars(scratch.arena, value_strings.first->string, str8_lit(\",\"), 0);\n      String8Array param_arr  = str8_array_from_list(scratch.arena, &param_list);\n      if (param_arr.count > 0) {\n        if (str8_match_lit(\"embed\", param_arr.v[0], StringMatchFlag_CaseInsensitive)) {\n          config->manifest_opt = LNK_ManifestOpt_Embed;\n          if (param_arr.count == 1) {\n            config->manifest_resource_id = 0;\n          } else if (param_arr.count > 1) {\n            // parse resource id\n            if (str8_match_lit(\"id=\", param_arr.v[1], StringMatchFlag_RightSideSloppy|StringMatchFlag_CaseInsensitive)) {\n              String8List  res_id_list = str8_split_by_string_chars(scratch.arena, param_arr.v[1], str8_lit(\"=\"), 0);\n              String8Array res_id_arr  = str8_array_from_list(scratch.arena, &res_id_list);\n              if (res_id_arr.count == 2) {\n                U64 resource_id;\n                if (try_u64_from_str8_c_rules(res_id_arr.v[1], &resource_id)) {\n                  config->manifest_resource_id = push_u64(config->arena, resource_id);\n                } else {\n                  lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse resource_id \\\"%S\\\"\", res_id_arr.v[1]);\n                }\n              } else {\n                lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid syntax expected form ID=# but got \\\"%S\\\"\", param_arr.v[1]);\n              }\n            } else {\n              lnk_error_cmd_switch_invalid_param(LNK_Error_Cmdl, obj, cmd_switch, param_arr.v[0]);\n            }\n          } else {\n            lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch);\n          }\n        } else if (str8_match_lit(\"no\", param_arr.v[0], StringMatchFlag_CaseInsensitive)) {\n          config->manifest_opt = LNK_ManifestOpt_No;\n        } else {\n          lnk_error_cmd_switch_invalid_param(LNK_Error_Cmdl, obj, cmd_switch, param_arr.v[0]);\n        }\n      } else {\n        lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch);\n      }\n    } else if (value_strings.node_count == 0) {\n      config->manifest_opt = LNK_ManifestOpt_WriteToFile;\n    } else {\n      lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch);\n    }\n  } break;\n\n  case LNK_CmdSwitch_ManifestDependency: {\n    String8List manifest_dependency_list = str8_list_copy(config->arena, &value_strings);\n    str8_list_concat_in_place(&config->manifest_dependency_list, &manifest_dependency_list);\n\n    if (config->manifest_opt == LNK_ManifestOpt_Null) {\n      config->manifest_opt = LNK_ManifestOpt_WriteToFile;\n    }\n  } break;\n\n  case LNK_CmdSwitch_ManifestFile: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->manifest_name);\n  } break;\n\n  case LNK_CmdSwitch_ManifestInput: {\n    // see :manifest_input\n  } break;\n\n  case LNK_CmdSwitch_ManifestUac: {\n    if (value_strings.node_count == 1) {\n      String8 uac = lnk_error_check_and_strip_quotes(LNK_Error_Cmdl, obj, cmd_switch, value_strings.first->string);\n      String8List  param_list = str8_split_by_string_chars(scratch.arena, uac, str8_lit(\" \"), 0);\n      String8Array param_arr  = str8_array_from_list(scratch.arena, &param_list);\n      if (param_arr.count > 0) {\n        if (str8_match_lit(\"level=\", param_arr.v[0], StringMatchFlag_RightSideSloppy|StringMatchFlag_CaseInsensitive)) {\n          String8 level_param = param_arr.v[0];\n          String8List level_list = str8_split_by_string_chars(scratch.arena, level_param, str8_lit(\"=\"), 0);\n          if (level_list.node_count == 2) {\n            if (str8_match_lit(\"level\", level_list.first->string, StringMatchFlag_CaseInsensitive)) {\n              String8 level = level_list.last->string;\n              if (str8_match_lit(\"'asInvoker'\", level, 0) ||\n                  str8_match_lit(\"'highestAvailable'\", level, 0) ||\n                  str8_match_lit(\"'requireAdministrator'\", level, 0)) {\n                // manifest level was parsed!\n                config->manifest_uac = 1;\n                config->manifest_level = push_str8_copy(config->arena, level);\n                if (param_arr.count > 1) {\n                  String8 ui_access_param = param_arr.v[1];\n                  String8List ui_access_list = str8_split_by_string_chars(scratch.arena, ui_access_param, str8_lit(\"=\"), 0);\n                  if (ui_access_list.node_count == 2) {\n                    String8 ui_access = ui_access_list.last->string;\n                    if (str8_match_lit(\"'true'\", ui_access, 0) ||\n                        str8_match_lit(\"'false'\", ui_access, 0)) {\n                      // ui access was parsed!\n                      config->manifest_ui_access = push_str8_copy(config->arena, ui_access);\n                    } else {\n                      lnk_error_invalid_uac_ui_access_param(LNK_Error_Cmdl, obj, cmd_switch, ui_access_param);\n                    }\n                  } else {\n                    lnk_error_invalid_uac_ui_access_param(LNK_Error_Cmdl, obj, cmd_switch, ui_access_param);\n                  }\n                }\n              } else {\n                lnk_error_invalid_uac_level_param(LNK_Error_Cmdl, obj, cmd_switch, level_param);\n              }\n            } else {\n              lnk_error_invalid_uac_level_param(LNK_Error_Cmdl, obj, cmd_switch, level_param);\n            }\n          } else {\n            lnk_error_invalid_uac_level_param(LNK_Error_Cmdl, obj, cmd_switch, level_param);\n          }\n        } else if (str8_match_lit(\"no\", param_arr.v[0], StringMatchFlag_CaseInsensitive)) {\n          config->manifest_uac = 0;\n        } else {\n          lnk_error_cmd_switch_invalid_param(LNK_Error_Cmdl, obj, cmd_switch, param_arr.v[0]);\n        }\n      } else {\n        lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"empty param string\");\n      }\n    } else {\n      lnk_error_cmd_switch_invalid_param_count(LNK_Error_Cmdl, obj, cmd_switch);\n    }\n  } break;\n\n  case LNK_CmdSwitch_Merge: {\n    if (value_strings.node_count == 1) {\n      LNK_MergeDirective merge = {0};\n      if (lnk_parse_merge_directive(value_strings.first->string, obj, &merge)) {\n        merge.src = push_str8_copy(config->arena, merge.src);\n        merge.dst = push_str8_copy(config->arena, merge.dst);\n        lnk_merge_directive_list_push(config->arena, &config->merge_list, merge);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters %d\", value_strings.node_count);\n    }\n  } break;\n\n  case LNK_CmdSwitch_Natvis: {\n    // warn about invalid natvis extension\n    for (String8Node *node = value_strings.first; node != 0; node = node->next) {\n      String8 ext = str8_skip_last_dot(node->string);\n      if (!str8_match_lit(\"natvis\", ext, StringMatchFlag_CaseInsensitive)) {\n        lnk_error_cmd_switch(LNK_Warning_InvalidNatvisFileExt, obj, cmd_switch, \"Visual Studio expects .natvis extension: \\\"%S\\\"\", node->string);\n      }\n    }\n\n    String8List natvis_list = str8_list_copy(config->arena, &value_strings);\n    str8_list_concat_in_place(&config->natvis_list, &natvis_list);\n  } break;\n\n  case LNK_CmdSwitch_DisallowLib:\n  case LNK_CmdSwitch_NoDefaultLib: {\n    if (value_strings.node_count == 0) {\n      config->no_default_libs = 1;\n    } else {\n      for (String8Node *lib_n = value_strings.first; lib_n != 0; lib_n = lib_n->next) {\n        String8 lib_name = lnk_get_lib_name(lib_n->string);\n        if (hash_table_search_path_raw(config->disallow_lib_ht, lib_name)) {\n          continue;\n        }\n        hash_table_push_path_raw(config->arena, config->disallow_lib_ht, lib_name, 0);\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_NoExp: {\n    config->build_exp = 0;\n  } break;\n\n  case LNK_CmdSwitch_NoImpLib: {\n    config->build_imp_lib = 0;\n  } break;\n\n  case LNK_CmdSwitch_NoLogo: {\n    // we don't print logo\n  } break;\n\n  case LNK_CmdSwitch_NxCompat: {\n    lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->dll_characteristics, PE_DllCharacteristic_NX_COMPAT);\n  } break;\n\n  case LNK_CmdSwitch_Opt: {\n    for (String8Node *n = value_strings.first; n != 0; n = n->next) {\n      String8 param = n->string;\n      if (str8_match_lit(\"ref\", param, StringMatchFlag_CaseInsensitive)) {\n        config->opt_ref = LNK_SwitchState_Yes; \n      } else if (str8_match_lit(\"noref\", param, StringMatchFlag_CaseInsensitive)) {\n        config->opt_ref = LNK_SwitchState_No;\n      } else if (str8_match_lit(\"icf\", param, StringMatchFlag_CaseInsensitive) ||\n                 str8_match_lit(\"icf=\", param, StringMatchFlag_CaseInsensitive | StringMatchFlag_RightSideSloppy)) {\n        String8List vals = str8_split_by_string_chars(scratch.arena, param, str8_lit(\"=\"), 0);\n        if (vals.node_count > 2) {\n          lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"too many parameters for iteration\");\n          continue;\n        }\n        if (vals.node_count == 2) {\n          B32 is_parsed = try_u64_from_str8_c_rules(vals.last->string, &config->opt_iter_count);\n          if (!is_parsed) {\n            lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse iterations \\\"%S\\\"\", vals.last->string);\n            continue;\n          }\n        }\n        config->opt_icf = LNK_SwitchState_Yes;\n      } else if (str8_match_lit(\"noicf\", param, StringMatchFlag_CaseInsensitive)) {\n        config->opt_icf = LNK_SwitchState_No;\n      } else if (str8_match_lit(\"lbr\", param, StringMatchFlag_CaseInsensitive)) {\n        config->opt_lbr = LNK_SwitchState_Yes;\n      } else if (str8_match_lit(\"nolibr\", param, StringMatchFlag_CaseInsensitive)) {\n        config->opt_lbr = LNK_SwitchState_No;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unknown option \\\"%S\\\"\", param);\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_Out: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->image_name);\n  } break;\n\n  case LNK_CmdSwitch_Pdb: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->pdb_name);\n  } break;\n\n  case LNK_CmdSwitch_PdbAltPath: {\n    // see :PdbAltPath\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->pdb_alt_path);\n  } break;\n\n  case LNK_CmdSwitch_PdbPageSize: {\n    U64 page_size;\n    if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &page_size, LNK_ParseU64Flag_CheckPow2)) {\n      if (page_size >= MSF_MIN_PAGE_SIZE) {\n        if (page_size < MSF_MAX_PAGE_SIZE) {\n          config->pdb_page_size = page_size;\n        } else {\n          lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"page size must be <= %u bytes\", MSF_MAX_PAGE_SIZE);\n        }\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"page size must be >= %u bytes\", MSF_MIN_PAGE_SIZE);\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_Release: {\n    if (value_strings.node_count == 0) {\n      config->flags |= LNK_ConfigFlag_WriteImageChecksum;\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Stack: {\n    Rng1U64 reserve_commit;\n    reserve_commit.v[0] = config->stack_reserve;\n    reserve_commit.v[1] = config->stack_commit;\n    if (lnk_cmd_switch_parse_tuple(obj, cmd_switch, value_strings, &reserve_commit)) {\n      if (reserve_commit.v[0] >= reserve_commit.v[1]) {\n        U64 reserve_aligned = AlignPow2(reserve_commit.v[0], 4);\n        U64 commit_aligned = AlignPow2(reserve_commit.v[1], 4);\n#if 0\n        if (reserve_aligned != reserve_commit.v[0]) {\n          lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"reserve is not power of two, aligned to %u\", reserve_aligned);\n        }\n        if (commit_aligned != reserve_commit.v[1]) {\n          lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"commit is not power of two, aligned to %u\", commit_aligned);\n        }\n#endif\n        config->stack_reserve = reserve_aligned;\n        config->stack_commit = commit_aligned;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"commit(%llu) is greater than reserve(%llu)\", reserve_commit.v[1], reserve_commit.v[0]);\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_SubSystem: {\n    if (value_strings.node_count <= 2 && value_strings.node_count > 0) {\n      // set subsystem type\n      PE_WindowsSubsystem subsystem = pe_subsystem_from_string(value_strings.first->string);\n      if (subsystem != PE_WindowsSubsystem_UNKNOWN) {\n        if (config->subsystem != PE_WindowsSubsystem_UNKNOWN) {\n          lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"overriding subystem \\\"%S\\\" with \\\"%S\\\"\",\n                               pe_string_from_subsystem(config->subsystem),\n                               pe_string_from_subsystem(subsystem));\n        }\n        config->subsystem = subsystem;\n\n        // parse version (optional)\n        if (value_strings.node_count == 2) {\n          str8_list_pop_front(&value_strings); // pop subsystem parameter\n          lnk_cmd_switch_parse_version(obj, cmd_switch, value_strings, &config->subsystem_ver);\n        }\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid subsystem \\\"%S\\\"\", value_strings.first->string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Time: {\n  } break;\n\n  case LNK_CmdSwitch_TsAware: {\n    lnk_cmd_switch_set_flag_inv_64(obj, cmd_switch, value_strings, &config->flags, LNK_ConfigFlag_NoTsAware);\n  } break;\n\n  case LNK_CmdSwitch_Version: {\n    lnk_cmd_switch_parse_version(obj, cmd_switch, value_strings, &config->image_ver);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Age: {\n    lnk_cmd_switch_parse_u32(obj, cmd_switch, value_strings, &config->age, 0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_AltPchDir: {\n    if (value_strings.node_count == 0) {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"missing parameters\");\n      break;\n    }\n    String8List dirs = str8_list_copy(config->arena, &value_strings);\n    str8_list_concat_in_place(&config->alt_pch_dirs, &dirs);\n  } break;\n\n  case LNK_CmdSwitch_Rad_BuildInfo: {\n    lnk_print_build_info();\n    os_abort(0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll: {\n    lnk_cmd_switch_set_flag_64(obj, cmd_switch, value_strings, &config->flags, LNK_ConfigFlag_CheckUnusedDelayLoadDll);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Map: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->rad_chunk_map_name);\n    config->rad_chunk_map = LNK_SwitchState_Yes;\n  } break;\n\n  case LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols: {\n    lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->map_lines_for_unresolved_symbols);\n  } break;\n\n  case LNK_CmdSwitch_Rad_MemoryMapFiles: {\n    lnk_cmd_switch_set_flag_32(obj, cmd_switch, value_strings, &config->io_flags, LNK_IO_Flags_MemoryMapFiles);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Debug: {\n    lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->rad_debug);\n  } break;\n\n  case LNK_CmdSwitch_Rad_DebugName: {\n    // :Rad_DebugAltPath\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->rad_debug_name);\n  } break;\n\n  case LNK_CmdSwitch_Rad_DebugAltPath: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->rad_debug_alt_path);\n  } break;\n\n  case LNK_CmdSwitch_Rad_DelayBind: {\n    lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->import_table_emit_biat);\n  } break;\n\n  case LNK_CmdSwitch_Rad_DoMerge: {\n    lnk_cmd_switch_set_flag_64(obj, cmd_switch, value_strings, &config->flags, LNK_ConfigFlag_Merge);\n  } break;\n\n  case LNK_CmdSwitch_Rad_EnvLib: {\n    lnk_cmd_switch_set_flag_64(obj, cmd_switch, value_strings, &config->flags, LNK_ConfigFlag_EnvLib);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Exe: {\n    lnk_cmd_switch_set_flag_16(obj, cmd_switch, value_strings, &config->file_characteristics, PE_ImageFileCharacteristic_EXE);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Guid: {\n    if (value_strings.node_count == 1) {\n      if (str8_match_lit(\"imageblake3\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n        config->guid_type = Lnk_DebugInfoGuid_ImageBlake3;\n      } else if (str8_match_lit(\"random\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n        config->guid = os_make_guid();\n      } else {\n        Guid guid;\n        if (try_guid_from_string(value_strings.first->string, &guid)) {\n          config->guid = guid;\n        } else {\n          lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse \\\"%S\\\"\", value_strings.first->string);\n        }\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters, expected GUID formatted as following: \\\"0000000-0000-0000-0000-000000000000\\\"\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_LargePages: {\n    if (value_strings.node_count == 0) {\n      OS_ProcessInfo *process_info = os_get_process_info();\n      if (process_info->large_pages_allowed) {\n        arena_default_flags |= ArenaFlag_LargePages;\n      } else {\n        lnk_error_cmd_switch(LNK_Warning_LargePages, obj, cmd_switch, \"Large pages aren't enabled on this system.\");\n#if OS_WINDOWS\n        lnk_supplement_error(\"To enable large pages:\");\n        lnk_supplement_error(\"\\t- Press Win+R and open \\\"gpedit.msc\\\"\");\n        lnk_supplement_error(\"\\t- Navigate to Local Computer Policy > Computer Configuration > Windows Settings > Security Settings > Local Policies > User Rights And Assignments\");\n        lnk_supplement_error(\"\\t- Double-click on \\\"Lock pages in memory\\\"\");\n        lnk_supplement_error(\"\\t- Click \\\"Add User or Group...\\\"\");\n        lnk_supplement_error(\"\\t- Type in your user name\");\n        lnk_supplement_error(\"\\t- Click Oks and reboot the machine\");\n#endif\n      }\n    } else if (value_strings.node_count == 1) {\n      if (str8_match_lit(\"quiet\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n        OS_ProcessInfo *process_info = os_get_process_info();\n        if (process_info->large_pages_allowed) {\n          arena_default_flags |= ArenaFlag_LargePages;\n        }\n      } else if (str8_match_lit(\"no\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n        arena_default_flags &= ~ArenaFlag_LargePages;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid parameter: \\\"%S\\\", expected NO or QUIET\", value_strings.first->string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_LinkVer: {\n    lnk_cmd_switch_parse_version(obj, cmd_switch, value_strings, &config->link_ver);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Log: {\n    if (value_strings.node_count == 1) {\n      if (str8_match_lit(\"all\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n        for (U64 ilog = 0; ilog < LNK_Log_Count; ilog += 1) {\n          lnk_set_log_status((LNK_LogType)ilog, 1);\n        }\n      } else if (str8_match_lit(\"io\", value_strings.first->string, StringMatchFlag_CaseInsensitive)) {\n        lnk_set_log_status(LNK_Log_IO_Read, 1);\n        lnk_set_log_status(LNK_Log_IO_Write, 1);\n      } else {\n        LNK_LogType log_type = lnk_log_type_from_string(value_strings.first->string);\n        if (log_type == LNK_Log_Null) {\n          lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unknown parameter \\\"%S\\\"\", value_strings.first->string);\n        } else {\n          lnk_set_log_status(log_type, 1);\n        }\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters, expected 1\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_MtPath: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->mt_path);\n  } break;\n\n  case LNK_CmdSwitch_Rad_OsVer: {\n    lnk_cmd_switch_parse_version(obj, cmd_switch, value_strings, &config->os_ver);\n  } break;\n\n  case LNK_CmdSwitch_Rad_PageSize: {\n    lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->machine_page_size, 0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_PathStyle: {\n    if (value_strings.node_count == 1) {\n      PathStyle path_style = path_style_from_string(str8_list_first(&value_strings));\n      if (path_style != PathStyle_Null) {\n        config->path_style = path_style;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unable to parse parameter \\\"%S\\\"\", value_strings.first->string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid number of parameters\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_PdbHashTypeNames: {\n    String8              mode_string = str8_list_first(&value_strings);\n\n    LNK_TypeNameHashMode mode;\n    if (mode_string.size == 0) {\n      config->pdb_hash_type_names = LNK_TypeNameHashMode_Lenient;\n    } else {\n      mode = lnk_type_name_hash_mode_from_string(mode_string);\n      if (mode == LNK_TypeNameHashMode_Null) {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unknown parameter: \\\"%S\\\"\", mode_string);\n      } else {\n        config->pdb_hash_type_names = mode;\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_PdbHashTypeNameMap: {\n    lnk_cmd_switch_parse_string_copy(config->arena, obj, cmd_switch, value_strings, &config->pdb_hash_type_name_map);\n  } break;\n\n  case LNK_CmdSwitch_Rad_PdbHashTypeNameLength: {\n    lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->pdb_hash_type_name_length, 0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_RemoveSection: {\n    String8 sect_name = {0};\n    if (lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, &sect_name)) {\n      sect_name = push_str8_copy(config->arena, sect_name);\n      str8_list_push(config->arena, &config->remove_sections, sect_name);\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_SharedThreadPool: {\n    if (value_strings.node_count == 0) {\n      config->shared_thread_pool_name = str8_lit(LNK_DEFAULT_THREAD_POOL_NAME);\n    } else {\n      lnk_cmd_switch_parse_string(obj, cmd_switch, value_strings, &config->shared_thread_pool_name);\n      if (config->shared_thread_pool_name.size == 0) {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"invalid empty string for thread pool name\");\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers: {\n    OS_SystemInfo *sysinfo = os_get_system_info();\n    if (value_strings.node_count == 0) {\n      config->max_worker_count = sysinfo->logical_processor_count;\n    } else {\n      lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->max_worker_count, 0);\n      if (config->max_worker_count == 0) {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"number of workers must be greater than zero\");\n      } else if (config->max_worker_count > sysinfo->logical_processor_count) {\n        lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"number of workers %llu exceeds processor count %llu\", config->max_worker_count, sysinfo->logical_processor_count);\n        config->max_worker_count = sysinfo->logical_processor_count;\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_SuppressError: {\n    U64List error_code_list = {0};\n    if (lnk_cmd_switch_parse_u64_list(scratch.arena, obj, cmd_switch, value_strings, &error_code_list, 0)) {\n      for (U64Node *error_code_n = error_code_list.first; error_code_n != 0; error_code_n = error_code_n->next) {\n        if (error_code_n->data < LNK_Error_Count) {\n          lnk_suppress_error(error_code_n->data);\n        } else {\n          lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"unknown error code %llu\", error_code_n->data);\n        }\n      }\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_TargetOs: {\n    if (value_strings.node_count == 1) {\n      String8 os_string = str8_list_first(&value_strings);\n      OperatingSystem target_os = operating_system_from_string(os_string);\n      if (target_os != OperatingSystem_Null) {\n        config->target_os = target_os;\n      } else {\n        lnk_error_cmd_switch(LNK_Error_Cmdl, obj, cmd_switch, \"unknown operating system type %S\", os_string);\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Warning_Cmdl, obj, cmd_switch, \"expected 1 parameter\");\n    }\n  } break;\n\n  case LNK_CmdSwitch_Rad_WriteTempFiles: {\n    lnk_cmd_switch_parse_flag(obj, cmd_switch, value_strings, &config->write_temp_files);\n  } break;\n\n  case LNK_CmdSwitch_Rad_TimeStamp: {\n    lnk_cmd_switch_parse_u32(obj, cmd_switch, value_strings, &config->time_stamp, 0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_UnresolvedSymbolLimit: {\n    lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->unresolved_symbol_limit, 0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit: {\n    lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &config->unresolved_symbol_ref_limit, 0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Version: {\n    fprintf(stdout, \"%s\\n\", BUILD_TITLE_STRING_LITERAL);\n    os_abort(0);\n  } break;\n\n  case LNK_CmdSwitch_Rad_Workers: {\n    U64 worker_count;\n    if (lnk_cmd_switch_parse_u64(obj, cmd_switch, value_strings, &worker_count, 0)) {\n      config->worker_count = worker_count;\n    }\n  } break;\n\n  case LNK_CmdSwitch_Help: {\n    lnk_print_help();\n    os_abort(0);\n  } break;\n  }\n\n  scratch_end(scratch);\n}\n\ninternal LNK_Config *\nlnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  Arena      *arena  = arena_alloc();\n  LNK_Config *config = push_array(arena, LNK_Config, 1);\n  config->arena                     = arena;\n  config->raw_cmd_line              = str8_list_copy(arena, &raw_cmd_line);\n  config->work_dir                  = os_get_current_path(arena);\n  config->build_imp_lib             = 1;\n  config->build_exp                 = 1;\n  config->heap_reserve              = MB(1);\n  config->heap_commit               = KB(1);\n  config->stack_reserve             = MB(1);\n  config->stack_commit              = KB(1);\n  config->pdb_hash_type_names       = LNK_TypeNameHashMode_None;\n  config->pdb_hash_type_name_length = 8;\n  config->data_dir_count            = PE_DataDirectoryIndex_COUNT;\n  config->export_ht                 = hash_table_init(arena, max_U16/2);\n  config->alt_name_ht               = hash_table_init(arena, 0x100);\n  config->include_symbol_ht         = hash_table_init(arena, 0x100);\n  config->delay_load_ht             = hash_table_init(arena, 0x100);\n  config->disallow_lib_ht           = hash_table_init(arena, 0x100);\n\n  // process command line switches\n  for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) {\n    lnk_apply_cmd_option_to_config(config, cmd->string, cmd->value_strings, 0);\n  }\n\n  // :manifest_input\n  if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ManifestInput)) {\n    if (config->manifest_opt == LNK_ManifestOpt_Embed) {\n      for (LNK_CmdOption *cmd = cmd_line.first_option; cmd != 0; cmd = cmd->next) {\n        LNK_CmdSwitchType cmd_switch = lnk_cmd_switch_type_from_string(cmd->string);\n        if (cmd_switch == LNK_CmdSwitch_ManifestInput) {\n          String8List manifest_list = str8_list_copy(arena, &cmd->value_strings);\n          str8_list_concat_in_place(&config->input_list[LNK_Input_Manifest], &manifest_list);\n        }\n      }\n    } else {\n      lnk_error_cmd_switch(LNK_Error_Cmdl, 0, LNK_CmdSwitch_ManifestInput, \"missing /MANIFEST:EMBED\");\n    }\n  }\n\n  // set default manifest resource id\n  if (config->manifest_resource_id == 0) {\n    if (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) {\n      config->manifest_resource_id = push_u64(arena, 2);\n    } else {\n      config->manifest_resource_id = push_u64(arena, 1);\n    }\n  }\n\n  // input files\n  for (String8Node *input_node = cmd_line.input_list.first; input_node != 0; input_node = input_node->next) {\n    String8 path = push_str8_copy(arena, input_node->string);\n    String8 ext = str8_skip_last_dot(path);\n\n    // map file extension to input type\n    LNK_InputType input_type = lnk_input_type_from_string(ext);\n\n    // do we support this file format?\n    if (input_type == LNK_Input_Null) {\n      lnk_error(LNK_Error_Cmdl, \"unknown file format \\\"%S\\\"\", path);\n      continue;\n    }\n\n    // psuh file path\n    str8_list_push(arena, &config->input_list[input_type], path);\n  }\n\n  // os version and subsystem are always same?\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_OsVer)) {\n    config->os_ver = config->subsystem_ver;\n  }\n  \n  // don't emit bind table with /ALLOWBIND:NO\n  if (config->dll_characteristics & PE_DllCharacteristic_NO_BIND) {\n    config->import_table_emit_biat = LNK_SwitchState_No;\n  }\n  \n  // set flags for /OPT\n  {\n    // these flags remove and merge inline functions and methods defined in class,\n    // and makes stepping tougher, in debug mode we don't link with these optimizations\n    // unless user specifically orverrides.\n    if (config->debug_mode != LNK_DebugMode_None) {\n      if (config->opt_ref == LNK_SwitchState_Null) {\n        config->opt_ref = LNK_SwitchState_No;\n      }\n      if (config->opt_icf == LNK_SwitchState_Null) {\n        config->opt_icf = LNK_SwitchState_No;\n      }\n    }\n    \n    // by default enable all optimizations\n    if (config->opt_ref == LNK_SwitchState_Null) {\n      config->opt_ref = LNK_SwitchState_Yes;\n    }\n    if (config->opt_icf == LNK_SwitchState_Null) {\n      config->opt_icf = LNK_SwitchState_Yes;\n    }\n    if (config->opt_lbr == LNK_SwitchState_Null) {\n      config->opt_lbr = LNK_SwitchState_Yes;\n    }\n  }\n\n  // warn about unused large address aware flag\n  if ((~config->file_characteristics & PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE) && (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL)) {\n    lnk_error(LNK_Warning_NoLargeAddressAwarenessForDll, \"/LARGEADDRESSAWARE:NO has no effect when specified together with /DLL\");\n  }\n  \n  // error check base address flags\n  if (config->flags & LNK_ConfigFlag_Fixed) {\n    if (lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_DynamicBase)) {\n      B32 is_dynamic_base_set = !!(config->dll_characteristics & PE_DllCharacteristic_DYNAMIC_BASE);\n      if (is_dynamic_base_set) {\n        lnk_error(LNK_Error_IncomatibleCmdOptions, \"unable to link with /FIXED and /DYNAMICBASE at the same time\");\n      }\n    }\n  }\n\n  if (lnk_is_thread_pool_shared(config)) {\n    if (config->worker_count > config->max_worker_count) {\n      config->worker_count = config->max_worker_count;\n      lnk_error_cmd_switch(LNK_Warning_Cmdl, 0, LNK_CmdSwitch_Rad_Workers, \"worker count %llu exceeds thread pool max worker count %llu; claping count to max\", config->worker_count, config->max_worker_count);\n    }\n  }\n  \n  // set flags for /FIXED\n  if (config->flags & LNK_ConfigFlag_Fixed) {\n    config->file_characteristics |= PE_ImageFileCharacteristic_STRIPPED;\n    config->dll_characteristics &= ~PE_DllCharacteristic_DYNAMIC_BASE;\n  }\n  // if we don't have a fixed image and dynamic base switch \n  // was omitted we make image with dynamic base\n  else if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_DynamicBase)) {\n    config->dll_characteristics |= PE_DllCharacteristic_DYNAMIC_BASE;\n  }\n  \n  // set flag for /guard\n  if (config->guard_flags != LNK_Guard_None) {\n    config->dll_characteristics |= PE_DllCharacteristic_GUARD_CF;\n  }\n\n  // handle empty /OUT\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Out)) {\n    String8 name      = str8_list_first(&config->input_list[LNK_Input_Obj]);\n    String8 ext       = (config->file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) ? str8_lit(\"dll\") : str8_lit(\"exe\");\n    config->image_name = path_replace_file_extension(scratch.arena, name, ext);\n  }\n\n  // handle empty /PDB\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Pdb)) {\n    config->pdb_name = path_replace_file_extension(scratch.arena, config->image_name, str8_lit(\"pdb\"));\n  }\n\n  // handle empty /RAD_DEBUG_NAME\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_Rad_DebugName)) {\n    config->rad_debug_name = path_replace_file_extension(scratch.arena, config->image_name, str8_lit(\"rdi\"));\n  }\n\n  // handle empty /IMPLIB\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ImpLib)) {\n    config->imp_lib_name = path_replace_file_extension(scratch.arena, config->image_name, str8_lit(\"lib\"));\n  }\n\n  // handle empty /MANIFESTFILE\n  if (!lnk_cmd_line_has_switch(cmd_line, LNK_CmdSwitch_ManifestFile)) {\n    config->manifest_name = push_str8f(scratch.arena, \"%S.manifest\", config->image_name);\n  }\n\n  // convert to full paths\n  config->image_name     = os_full_path_from_path(arena, config->image_name);\n  config->pdb_name       = os_full_path_from_path(arena, config->pdb_name);\n  config->rad_debug_name = os_full_path_from_path(arena, config->rad_debug_name);\n  config->imp_lib_name   = os_full_path_from_path(arena, config->imp_lib_name);\n  config->manifest_name  = os_full_path_from_path(arena, config->manifest_name);\n\n  // collect env vars\n  HashTable *env_vars = hash_table_init(scratch.arena, 512);\n  {\n#if OS_WINDOWS\n    OS_ProcessInfo *process_info = os_get_process_info();\n    for (String8Node *node = process_info->environment.first; node != 0; node = node->next) {\n      String8List list = str8_split_by_string_chars(scratch.arena, node->string, str8_lit(\"=\"), 0);\n\n      String8 key = list.first->string;\n      String8 val = str8_zero();\n      if (list.node_count == 2) {\n        val = list.last->string;\n      } else if (list.node_count > 2) {\n        U64 sep_idx = str8_find_needle(node->string, node->string.size, str8_lit(\"=\"), 0);\n        val = str8_skip(node->string, sep_idx+1);\n      }\n\n      hash_table_push_path_string(scratch.arena, env_vars, key, val);\n    }\n#endif\n  }\n\n  // define linker env vars\n  hash_table_push_path_string(scratch.arena, env_vars, str8_lit(\"_pdb\"),          str8_skip_last_slash(config->pdb_name));\n  hash_table_push_path_string(scratch.arena, env_vars, str8_lit(\"_ext\"),          str8_skip_last_dot(config->image_name));\n  hash_table_push_path_string(scratch.arena, env_vars, str8_lit(\"_rad_pdb_path\"), config->pdb_name);\n  hash_table_push_path_string(scratch.arena, env_vars, str8_lit(\"_rad_rdi\"),      str8_skip_last_slash(config->rad_debug_name));\n  hash_table_push_path_string(scratch.arena, env_vars, str8_lit(\"_rad_rdi_path\"), config->rad_debug_name);\n\n  // collect LIB and LIBPATH\n  if (config->flags & LNK_ConfigFlag_EnvLib) {\n    BucketNode *lib = hash_table_search_path(env_vars, str8_lit(\"lib\"));\n    if (lib) {\n      String8List val_list      = str8_split_by_string_chars(scratch.arena, lib->v.value_string, str8_lit(\";\"), 0);\n      String8List val_list_copy = str8_list_copy(arena, &val_list);\n      str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy);\n    }\n\n    BucketNode *lib_path = hash_table_search_path(env_vars, str8_lit(\"libpath\"));\n    if (lib_path) {\n      String8List val_list      = str8_split_by_string_chars(scratch.arena, lib->v.value_string, str8_lit(\";\"), 0);\n      String8List val_list_copy = str8_list_copy(arena, &val_list);\n      str8_list_concat_in_place(&config->lib_dir_list, &val_list_copy);\n    }\n  }\n  \n  // :PdbAltPath\n  config->pdb_alt_path = lnk_expand_env_vars_windows(arena, env_vars, config->pdb_alt_path);\n\n  // :Rad_DebugAltPath\n  config->rad_debug_alt_path = lnk_expand_env_vars_windows(arena, env_vars, config->rad_debug_alt_path);\n\n  // create temporary files names\n  if (config->write_temp_files == LNK_SwitchState_Yes) {\n    config->temp_rad_chunk_map_name = push_str8f(arena, \"%S.tmp%x\", config->rad_chunk_map_name, config->time_stamp);\n    config->temp_image_name         = push_str8f(arena, \"%S.tmp%x\", config->image_name,         config->time_stamp);\n    config->temp_pdb_name           = push_str8f(arena, \"%S.tmp%x\", config->pdb_name,           config->time_stamp);\n    config->temp_rad_debug_name     = push_str8f(arena, \"%S.tmp%x\", config->rad_debug_name,     config->time_stamp);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n  return config;\n}\n\n"
  },
  {
    "path": "src/linker/lnk_config.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n#if OS_WINDOWS\n# define LNK_MANIFEST_MERGE_TOOL_NAME \"mt.exe\"\n#elif OS_LINUX || OS_MAC\n# define LNK_MANIFEST_MERGE_TOOL_NAME \"llvm-mt\"\n#else\n# error \n#endif\n\n#define LNK_DEFAULT_THREAD_POOL_NAME \"RADLINK_THREAD_POOL\"\n\ntypedef enum\n{\n  LNK_ParseU64Flag_CheckUnder32bit = (1 << 0),\n  LNK_ParseU64Flag_CheckPow2       = (1 << 1),\n} LNK_ParseU64Flags;\n\ntypedef enum\n{\n  LNK_SwitchState_Null,\n  LNK_SwitchState_No,\n  LNK_SwitchState_Yes\n} LNK_SwitchState;\n\ntypedef enum\n{\n  LNK_CmdSwitch_Null,\n  LNK_CmdSwitch_NotImplemented,\n\n  LNK_CmdSwitch_Align,\n  LNK_CmdSwitch_AllowBind,\n  LNK_CmdSwitch_AllowIsolation,\n  LNK_CmdSwitch_AlternateName,\n  LNK_CmdSwitch_AppContainer,\n  LNK_CmdSwitch_Base,\n  LNK_CmdSwitch_Brepro,\n  LNK_CmdSwitch_Debug,\n  LNK_CmdSwitch_DefaultLib,\n  LNK_CmdSwitch_Delay,\n  LNK_CmdSwitch_DelayLoad,\n  LNK_CmdSwitch_Dll,\n  LNK_CmdSwitch_DynamicBase,\n  LNK_CmdSwitch_Dump,\n  LNK_CmdSwitch_D2,\n  LNK_CmdSwitch_Entry,\n  LNK_CmdSwitch_ErrorReport,\n  LNK_CmdSwitch_Export,\n  LNK_CmdSwitch_FastFail,\n  LNK_CmdSwitch_FileAlign,\n  LNK_CmdSwitch_Fixed,\n  LNK_CmdSwitch_FunctionPadMin,\n  LNK_CmdSwitch_Heap,\n  LNK_CmdSwitch_HighEntropyVa,\n  LNK_CmdSwitch_Ignore,\n  LNK_CmdSwitch_ImpLib,\n  LNK_CmdSwitch_Include,\n  LNK_CmdSwitch_Incremental,\n  LNK_CmdSwitch_LargeAddressAware,\n  LNK_CmdSwitch_Lib,\n  LNK_CmdSwitch_LibPath,\n  LNK_CmdSwitch_Machine,\n  LNK_CmdSwitch_Manifest,\n  LNK_CmdSwitch_ManifestDependency,\n  LNK_CmdSwitch_ManifestFile,\n  LNK_CmdSwitch_ManifestInput,\n  LNK_CmdSwitch_ManifestUac,\n  LNK_CmdSwitch_Merge,\n  LNK_CmdSwitch_Natvis,\n  LNK_CmdSwitch_NoDefaultLib,\n  LNK_CmdSwitch_NoExp,\n  LNK_CmdSwitch_NoImpLib,\n  LNK_CmdSwitch_NoLogo,\n  LNK_CmdSwitch_NxCompat,\n  LNK_CmdSwitch_Opt,\n  LNK_CmdSwitch_Out,\n  LNK_CmdSwitch_Pdb,\n  LNK_CmdSwitch_PdbAltPath,\n  LNK_CmdSwitch_PdbPageSize,\n  LNK_CmdSwitch_Stack,\n  LNK_CmdSwitch_SubSystem,\n  LNK_CmdSwitch_Time,\n  LNK_CmdSwitch_TsAware,\n\n  // -- NOT Implemented:\n\n  LNK_CmdSwitch_AssemblyDebug,\n  LNK_CmdSwitch_AssemblyLinkResource,\n  LNK_CmdSwitch_AssemblyModule,\n  LNK_CmdSwitch_AssemblyResource,\n  LNK_CmdSwitch_ClrImageType,\n  LNK_CmdSwitch_ClrLoaderOptimization,\n  LNK_CmdSwitch_ClrSupportLastError,\n  LNK_CmdSwitch_ClrThreadAttribute,\n  LNK_CmdSwitch_ClrRunManagedCodeCheck,\n  LNK_CmdSwitch_ClrUnmanagedCheck,\n  LNK_CmdSwitch_Def,\n  LNK_CmdSwitch_DelaySign,\n  LNK_CmdSwitch_DependentLoadFlag,\n  LNK_CmdSwitch_Driver,\n  LNK_CmdSwitch_DisallowLib,\n  LNK_CmdSwitch_EditAndContinue,\n  LNK_CmdSwitch_EmitVolatileMetadata,\n  LNK_CmdSwitch_ExportAdmin,\n  LNK_CmdSwitch_FastGenProfile,\n  LNK_CmdSwitch_FailIfMismatch,\n  LNK_CmdSwitch_Force,\n  LNK_CmdSwitch_Guard,\n  LNK_CmdSwitch_GuardSym,\n  LNK_CmdSwitch_GenProfile,\n  LNK_CmdSwitch_IdlOut,\n  LNK_CmdSwitch_IgnoreIdl,\n  LNK_CmdSwitch_Ilk,\n  LNK_CmdSwitch_IntegrityCheck,\n  LNK_CmdSwitch_InferAsanLibs,\n  LNK_CmdSwitch_InferAsanLibsNo,\n  LNK_CmdSwitch_Kernel,\n  LNK_CmdSwitch_KeyContainer,\n  LNK_CmdSwitch_KeyFile,\n  LNK_CmdSwitch_LinkerRepro,\n  LNK_CmdSwitch_LinkerReproTarget,\n  LNK_CmdSwitch_Ltcg,\n  LNK_CmdSwitch_LtcgOut,\n  LNK_CmdSwitch_Map,\n  LNK_CmdSwitch_MapInfo,\n  LNK_CmdSwitch_Midl,\n  LNK_CmdSwitch_NoAssembly,\n  LNK_CmdSwitch_NoEntry,\n  LNK_CmdSwitch_Order,\n  LNK_CmdSwitch_PdbStripped,\n  LNK_CmdSwitch_Profile,\n  LNK_CmdSwitch_Release,\n  LNK_CmdSwitch_SafeSeh,\n  LNK_CmdSwitch_Section,\n  LNK_CmdSwitch_SourceLink,\n  LNK_CmdSwitch_Stub,\n  LNK_CmdSwitch_SwapRun,\n  LNK_CmdSwitch_TlbId,\n  LNK_CmdSwitch_ThrowingNew,\n  LNK_CmdSwitch_UserProfile,\n  LNK_CmdSwitch_Verbose,\n  LNK_CmdSwitch_Version,\n  LNK_CmdSwitch_Winmd,\n  LNK_CmdSwitch_WinmdDelaySign,\n  LNK_CmdSwitch_WinmdKeyContainer,\n  LNK_CmdSwitch_WinmdKeyFile,\n  LNK_CmdSwitch_WholeArchive,\n  LNK_CmdSwitch_Wx,\n\n  LNK_CmdSwitch_Rad_Age,\n  LNK_CmdSwitch_Rad_AltPchDir,\n  LNK_CmdSwitch_Rad_BuildInfo,\n  LNK_CmdSwitch_Rad_CheckUnusedDelayLoadDll,\n  LNK_CmdSwitch_Rad_Debug,\n  LNK_CmdSwitch_Rad_DebugAltPath,\n  LNK_CmdSwitch_Rad_DebugName,\n  LNK_CmdSwitch_Rad_DelayBind,\n  LNK_CmdSwitch_Rad_DoMerge,\n  LNK_CmdSwitch_Rad_EnvLib,\n  LNK_CmdSwitch_Rad_Exe,\n  LNK_CmdSwitch_Rad_Guid,\n  LNK_CmdSwitch_Rad_LargePages,\n  LNK_CmdSwitch_Rad_LinkVer, \n  LNK_CmdSwitch_Rad_Log,\n  LNK_CmdSwitch_Rad_Logo,\n  LNK_CmdSwitch_Rad_Map,\n  LNK_CmdSwitch_Rad_MapLinesForUnresolvedSymbols,\n  LNK_CmdSwitch_Rad_MemoryMapFiles,\n  LNK_CmdSwitch_Rad_MtPath,\n  LNK_CmdSwitch_Rad_OsVer,\n  LNK_CmdSwitch_Rad_PageSize,\n  LNK_CmdSwitch_Rad_PathStyle,\n  LNK_CmdSwitch_Rad_PdbHashTypeNameLength,\n  LNK_CmdSwitch_Rad_PdbHashTypeNameMap,\n  LNK_CmdSwitch_Rad_PdbHashTypeNames,\n  LNK_CmdSwitch_Rad_RemoveSection,\n  LNK_CmdSwitch_Rad_SharedThreadPool,\n  LNK_CmdSwitch_Rad_SharedThreadPoolMaxWorkers,\n  LNK_CmdSwitch_Rad_SuppressError,\n  LNK_CmdSwitch_Rad_TargetOs,\n  LNK_CmdSwitch_Rad_TimeStamp,\n  LNK_CmdSwitch_Rad_UnresolvedSymbolLimit,\n  LNK_CmdSwitch_Rad_UnresolvedSymbolRefLimit,\n  LNK_CmdSwitch_Rad_Version,\n  LNK_CmdSwitch_Rad_Workers,\n  LNK_CmdSwitch_Rad_WriteTempFiles,\n\n  LNK_CmdSwitch_Help,\n\n  LNK_CmdSwitch_Count\n} LNK_CmdSwitchType;\n\ntypedef struct LNK_CmdSwitch\n{\n  LNK_CmdSwitchType type;\n  B32               is_legal_directive;\n  char             *name;\n  char             *args;\n  char             *desc;\n} LNK_CmdSwitch;\n\ntypedef enum \n{\n  LNK_Input_Null,\n  LNK_Input_Obj,\n  LNK_Input_Lib,\n  LNK_Input_Res,\n  LNK_Input_Manifest,\n  LNK_Input_Count\n} LNK_InputType;\n\nenum\n{\n  LNK_ConfigFlag_Fixed                   = (1 << 0),\n  LNK_ConfigFlag_Merge                   = (1 << 1),\n  LNK_ConfigFlag_EnvLib                  = (1 << 2),\n  LNK_ConfigFlag_CheckUnusedDelayLoadDll = (1 << 5),\n  LNK_ConfigFlag_NoTsAware               = (1 << 6),\n  LNK_ConfigFlag_WriteImageChecksum      = (1 << 8),\n  LNK_ConfigFlag_ManifestEmbed           = (1 << 9),\n};\ntypedef U64 LNK_ConfigFlags;\n\ntypedef enum\n{\n  LNK_DebugMode_Null,\n  LNK_DebugMode_None,\n  LNK_DebugMode_FastLink,\n  LNK_DebugMode_GHash,\n  LNK_DebugMode_Full,\n} LNK_DebugMode;\n\nenum\n{\n  LNK_Guard_None    = 0,\n  LNK_Guard_Cf      = (1 << 0),\n  LNK_Guard_LongJmp = (1 << 1),\n  LNK_Guard_EhCont  = (1 << 2),\n  LNK_Guard_All     = LNK_Guard_Cf | LNK_Guard_LongJmp | LNK_Guard_EhCont\n};\ntypedef U32 LNK_GuardFlags;\n\ntypedef enum\n{\n  LNK_ManifestOpt_Null,\n  LNK_ManifestOpt_WriteToFile,\n  LNK_ManifestOpt_Embed,\n  LNK_ManifestOpt_No,\n} LNK_ManifestOpt;\n\ntypedef struct LNK_IncludeSymbol\n{\n  String8         name;\n  struct LNK_Obj *obj;\n} LNK_IncludeSymbol;\n\ntypedef struct LNK_IncludeSymbolNode\n{\n  struct LNK_IncludeSymbolNode *next;\n  LNK_IncludeSymbol             v;\n} LNK_IncludeSymbolNode;\n\ntypedef struct LNK_IncludeSymbolList\n{\n  U64                    count;\n  LNK_IncludeSymbolNode *first;\n  LNK_IncludeSymbolNode *last;\n} LNK_IncludeSymbolList;\n\ntypedef struct LNK_AltName\n{\n  String8 from;\n  String8 to;\n  struct LNK_Obj *obj;\n} LNK_AltName;\n\ntypedef struct LNK_AltNameNode\n{\n  struct LNK_AltNameNode *next;\n  LNK_AltName v;\n} LNK_AltNameNode;\n\ntypedef struct LNK_AltNameList\n{\n  U64              count;\n  LNK_AltNameNode *first;\n  LNK_AltNameNode *last;\n} LNK_AltNameList;\n\ntypedef struct LNK_MergeDirective\n{\n  String8 src;\n  String8 dst;\n} LNK_MergeDirective;\n\ntypedef struct LNK_MergeDirectiveNode\n{\n  struct LNK_MergeDirectiveNode *next;\n  LNK_MergeDirective             v;\n} LNK_MergeDirectiveNode;\n\ntypedef struct LNK_MergeDirectiveList\n{\n  U64                     count;\n  LNK_MergeDirectiveNode *first;\n  LNK_MergeDirectiveNode *last;\n} LNK_MergeDirectiveList;\n\ntypedef enum\n{\n  LNK_DebugInfoGuid_Null,\n  Lnk_DebugInfoGuid_ImageBlake3,\n} LNK_DebugInfoGuidType;\n\ntypedef enum\n{\n  LNK_TypeNameHashMode_Null,\n  LNK_TypeNameHashMode_None,\n  LNK_TypeNameHashMode_Lenient,\n  LNK_TypeNameHashMode_Full,\n} LNK_TypeNameHashMode;\n\ntypedef struct LNK_Config\n{\n  Arena                      *arena;\n  LNK_ConfigFlags             flags;\n  LNK_DebugMode               debug_mode;\n  LNK_SwitchState             opt_ref;\n  LNK_SwitchState             opt_icf;\n  LNK_SwitchState             opt_lbr;\n  U64                         opt_iter_count;\n  LNK_SwitchState             import_table_emit_biat;\n  LNK_SwitchState             import_table_emit_uiat;\n  LNK_GuardFlags              guard_flags;\n  LNK_DebugInfoGuidType       guid_type;\n  Guid                        guid;\n  COFF_TimeStamp              time_stamp;\n  U32                         age;\n  U64                         file_align;\n  U64                         sect_align;\n  U64                         stack_reserve;\n  U64                         stack_commit;\n  U64                         heap_reserve;\n  U64                         heap_commit;\n  U64                         user_base_addr;\n  U64                         max_image_size;\n  U64                         machine_page_size;\n  U64                         pdb_page_size;\n  U64                         worker_count;\n  U64                         max_worker_count;\n  String8                     shared_thread_pool_name;\n  LNK_SwitchState             do_function_pad_min;\n  B32                         infer_function_pad_min;\n  U64                         function_pad_min;\n  U64                        *manifest_resource_id;\n  B32                         no_default_libs;\n  Version                     link_ver;\n  Version                     os_ver;\n  Version                     image_ver;\n  OperatingSystem             target_os;\n  COFF_MachineType            machine;\n  PE_WindowsSubsystem         subsystem;\n  Version                     subsystem_ver;\n  PE_ImageFileCharacteristics file_characteristics;\n  PE_DllCharacteristics       dll_characteristics;\n  String8                     entry_point_name;\n  String8List                 lib_dir_list;\n  PathStyle                   path_style;\n  LNK_ManifestOpt             manifest_opt;\n  String8                     work_dir;\n  String8                     image_name;\n  String8                     imp_lib_name;\n  String8List                 raw_cmd_line;\n  String8                     pdb_name;\n  String8                     pdb_alt_path;\n  String8                     mt_path;\n  LNK_TypeNameHashMode        pdb_hash_type_names;\n  String8                     pdb_hash_type_name_map;\n  U64                         pdb_hash_type_name_length;\n  PE_ExportParseList          export_symbol_list;\n  String8List                 input_list[LNK_Input_Count];\n  String8List                 input_obj_lib_list;\n  String8List                 input_default_lib_list;\n  String8List                 delay_load_dll_list;\n  String8List                 natvis_list;\n  String8                     manifest_name;\n  B32                         manifest_uac;\n  String8                     manifest_level;\n  String8                     manifest_ui_access;\n  String8List                 manifest_dependency_list;\n  LNK_SwitchState             rad_debug;\n  LNK_SwitchState             rad_chunk_map;\n  String8                     rad_chunk_map_name;\n  String8                     rad_debug_name;\n  String8                     rad_debug_alt_path;\n  LNK_IncludeSymbolList       include_symbol_list;\n  LNK_AltNameList             alt_name_list;\n  LNK_MergeDirectiveList      merge_list;\n  U64                         data_dir_count;\n  B32                         build_imp_lib;\n  B32                         build_exp;\n  LNK_SwitchState             write_temp_files;\n  String8                     temp_image_name;\n  String8                     temp_pdb_name;\n  String8                     temp_rad_debug_name;\n  String8                     temp_rad_chunk_map_name;\n  String8                     delay_load_helper_name;\n  String8List                 remove_sections;\n  LNK_IO_Flags                io_flags;\n  HashTable                  *export_ht;\n  HashTable                  *alt_name_ht;\n  HashTable                  *include_symbol_ht;\n  HashTable                  *delay_load_ht;\n  HashTable                  *disallow_lib_ht;\n  U64                         unresolved_symbol_limit;\n  U64                         unresolved_symbol_ref_limit;\n  LNK_SwitchState             map_lines_for_unresolved_symbols;\n  String8List                 alt_pch_dirs;\n} LNK_Config;\n\n// --- MSVC Error Codes --------------------------------------------------------\n\ntypedef enum\n{\n  LNK_MsErrorCode_Lnk1000 = 1000,\n  LNK_MsErrorCode_Lnk1103 = 1103,\n  LNK_MsErrorCode_Lnk1104 = 1104,\n  LNK_MsErrorCode_Lnk1106 = 1106,\n  LNK_MsErrorCode_Lnk1107 = 1107,\n  LNK_MsErrorCode_Lnk1112 = 1112,\n  LNK_MsErrorCode_Lnk1113 = 1113,\n  LNK_MsErrorCode_Lnk1120 = 1120,\n  LNK_MsErrorCode_Lnk1123 = 1123,\n  LNK_MsErrorCode_Lnk1127 = 1127,\n  LNK_MsErrorCode_Lnk1136 = 1136,\n  LNK_MsErrorCode_Lnk1140 = 1140,\n  LNK_MsErrorCode_Lnk1141 = 1141,\n  LNK_MsErrorCode_Lnk1143 = 1143,\n  LNK_MsErrorCode_Lnk1152 = 1152,\n  LNK_MsErrorCode_Lnk1158 = 1158,\n  LNK_MsErrorCode_Lnk1164 = 1164,\n  LNK_MsErrorCode_Lnk1166 = 1166,\n  LNK_MsErrorCode_Lnk1168 = 1168,\n  LNK_MsErrorCode_Lnk1169 = 1169,\n  LNK_MsErrorCode_Lnk1170 = 1170,\n  LNK_MsErrorCode_Lnk1179 = 1179,\n  LNK_MsErrorCode_Lnk1181 = 1181,\n  LNK_MsErrorCode_Lnk1189 = 1189,\n  LNK_MsErrorCode_Lnk1196 = 1196,\n  LNK_MsErrorCode_Lnk1200 = 1200,\n  LNK_MsErrorCode_Lnk1201 = 1201,\n  LNK_MsErrorCode_Lnk1211 = 1211,\n  LNK_MsErrorCode_Lnk1215 = 1215,\n  LNK_MsErrorCode_Lnk1218 = 1218,\n  LNK_MsErrorCode_Lnk1221 = 1221,\n  LNK_MsErrorCode_Lnk1223 = 1223,\n  LNK_MsErrorCode_Lnk1224 = 1224,\n  LNK_MsErrorCode_Lnk1237 = 1237,\n  LNK_MsErrorCode_Lnk1240 = 1240,\n  LNK_MsErrorCode_Lnk1241 = 1241,\n  LNK_MsErrorCode_Lnk1245 = 1245,\n  LNK_MsErrorCode_Lnk1248 = 1248,\n  LNK_MsErrorCode_Lnk1256 = 1256,\n  LNK_MsErrorCode_Lnk1264 = 1264,\n  LNK_MsErrorCode_Lnk1277 = 1277,\n  LNK_MsErrorCode_Lnk1282 = 1282,\n  LNK_MsErrorCode_Lnk1287 = 1287,\n  LNK_MsErrorCode_Lnk1296 = 1296,\n  LNK_MsErrorCode_Lnk1301 = 1301,\n  LNK_MsErrorCode_Lnk1302 = 1302,\n  LNK_MsErrorCode_Lnk1306 = 1306,\n  LNK_MsErrorCode_Lnk1309 = 1309,\n  LNK_MsErrorCode_Lnk1312 = 1312,\n  LNK_MsErrorCode_Lnk1313 = 1313,\n  LNK_MsErrorCode_Lnk1314 = 1314,\n  LNK_MsErrorCode_Lnk1318 = 1318,\n  LNK_MsErrorCode_Lnk1332 = 1332,\n  LNK_MsErrorCode_Lnk1352 = 1352,\n  LNK_MsErrorCode_Lnk1561 = 1561,\n  LNK_MsErrorCode_Lnk2001 = 2001,\n  LNK_MsErrorCode_Lnk2004 = 2004,\n  LNK_MsErrorCode_Lnk2005 = 2005,\n  LNK_MsErrorCode_Lnk2008 = 2008,\n  LNK_MsErrorCode_Lnk2011 = 2011,\n  LNK_MsErrorCode_Lnk2013 = 2013,\n  LNK_MsErrorCode_Lnk2017 = 2017,\n  LNK_MsErrorCode_Lnk2019 = 2019,\n  LNK_MsErrorCode_Lnk2020 = 2020,\n  LNK_MsErrorCode_Lnk2022 = 2022,\n  LNK_MsErrorCode_Lnk2023 = 2023,\n  LNK_MsErrorCode_Lnk2026 = 2026,\n  LNK_MsErrorCode_Lnk2027 = 2027,\n  LNK_MsErrorCode_Lnk2031 = 2031,\n  LNK_MsErrorCode_Lnk2033 = 2033,\n  LNK_MsErrorCode_Lnk2038 = 2038,\n  LNK_MsErrorCode_Lnk2039 = 2039,\n\n  LNK_MsWarningCode_Lnk4001 = 4001,\n  LNK_MsWarningCode_Lnk4002 = 4002,\n  LNK_MsWarningCode_Lnk4006 = 4006,\n  LNK_MsWarningCode_Lnk4010 = 4010,\n  LNK_MsWarningCode_Lnk4014 = 4014,\n  LNK_MsWarningCode_Lnk4020 = 4020,\n  LNK_MsWarningCode_Lnk4022 = 4022,\n  LNK_MsWarningCode_Lnk4039 = 4039,\n  LNK_MsWarningCode_Lnk4044 = 4044,\n  LNK_MsWarningCode_Lnk4049 = 4049,\n  LNK_MsWarningCode_Lnk4065 = 4065,\n  LNK_MsWarningCode_Lnk4070 = 4070,\n  LNK_MsWarningCode_Lnk4071 = 4071,\n  LNK_MsWarningCode_Lnk4073 = 4073,\n  LNK_MsWarningCode_Lnk4075 = 4075,\n  LNK_MsWarningCode_Lnk4076 = 4076,\n  LNK_MsWarningCode_SectionFlagsConflict = 4078,\n  LNK_MsWarningCode_Lnk4086 = 4086,\n  LNK_MsWarningCode_Lnk4092 = 4092,\n  LNK_MsWarningCode_Lnk4096 = 4096,\n  LNK_MsWarningCode_Lnk4098 = 4098,\n  LNK_MsWarningCode_MissingExternalTypeServer = 4099,\n  LNK_MsWarningCode_Lnk4102 = 4102,\n  LNK_MsWarningCode_Lnk4104 = 4104,\n  LNK_MsWarningCode_Lnk4105 = 4105,\n  LNK_MsWarningCode_Lnk4194 = 4194,\n  LNK_MsWarningCode_Lnk4197 = 4197,\n  LNK_MsWarningCode_UnsuedDelayLoadDll = 4199,\n  LNK_MsWarningCode_Lnk4200 = 4200,\n  LNK_MsWarningCode_Lnk4204 = 4204,\n  LNK_MsWarningCode_Lnk4205 = 4205,\n  LNK_MsWarningCode_Lnk4206 = 4206,\n  LNK_MsWarningCode_Lnk4210 = 4210,\n  LNK_MsWarningCode_Lnk4216 = 4216,\n  LNK_MsWarningCode_Lnk4217 = 4217,\n  LNK_MsWarningCode_Lnk4219 = 4219,\n  LNK_MsWarningCode_Lnk4220 = 4220,\n  LNK_MsWarningCode_Lnk4221 = 4221,\n  LNK_MsWarningCode_Lnk4222 = 4222,\n  LNK_MsWarningCode_Lnk4224 = 4224,\n  LNK_MsWarningCode_Lnk4227 = 4227,\n  LNK_MsWarningCode_Lnk4229 = 4229,\n  LNK_MsWarningCode_Lnk4237 = 4237,\n  LNK_MsWarningCode_Lnk4247 = 4247,\n  LNK_MsWarningCode_Lnk4248 = 4248,\n  LNK_MsWarningCode_Lnk4253 = 4253,\n  LNK_MsWarningCode_Lnk4254 = 4254,\n  LNK_MsWarningCode_Lnk4286 = 4286,\n} LNK_MsErrorCode;\n\n// --- Enum <-> String ---------------------------------------------------------\n\ninternal String8              lnk_string_cmd_switch_type(LNK_CmdSwitchType type);\ninternal LNK_CmdSwitchType    lnk_cmd_switch_type_from_string(String8 string);\ninternal LNK_CmdSwitch *      lnk_cmd_switch_from_string(String8 string);\ninternal LNK_InputType        lnk_input_type_from_string(String8 string);\ninternal LNK_DebugMode        lnk_debug_mode_from_string(String8 string);\ninternal LNK_TypeNameHashMode lnk_type_name_hash_mode_from_string(String8 string);\n\n// --- Command Line Helpers ----------------------------------------------------\n\ninternal LNK_CmdOption * lnk_cmd_line_push_option_if_not_presentf(Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...);\ninternal LNK_CmdOption * lnk_cmd_line_push_optionf               (Arena *arena, LNK_CmdLine *cmd_line, LNK_CmdSwitchType cmd_switch_type, char *param_fmt, ...);\n\ninternal B32 lnk_cmd_line_has_switch(LNK_CmdLine cmd_line, LNK_CmdSwitchType cmd_switch_type);\n\n// --- Errors ------------------------------------------------------------------\n\ninternal void lnk_error_cmd_switch                    (LNK_ErrorCode code, struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, char *fmt, ...);\ninternal void lnk_error_cmd_switch_invalid_param_count(LNK_ErrorCode code, struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch);\ninternal void lnk_error_cmd_switch_invalid_param      (LNK_ErrorCode code, struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8 param);\n\n// --- Specialized Parsers ------------------------------------------------------\n\ninternal B32  lnk_cmd_switch_parse_version  (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, Version *ver_out);\ninternal B32  lnk_cmd_switch_parse_tuple    (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, Rng1U64 *tuple_out);\ninternal B32  lnk_cmd_switch_parse_u64      (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *value_out, LNK_ParseU64Flags flags);\ninternal B32  lnk_cmd_switch_parse_u32      (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U32 *value_out, LNK_ParseU64Flags flags);\ninternal B32  lnk_cmd_switch_parse_flag     (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, LNK_SwitchState *value_out);\ninternal void lnk_cmd_switch_set_flag_inv_16(struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U16 *flags, U16 bits);\ninternal void lnk_cmd_switch_set_flag_inv_64(struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *flags, U64 bits);\ninternal void lnk_cmd_switch_set_flag_16    (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U16 *flags, U16 bits);\ninternal void lnk_cmd_switch_set_flag_32    (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U32 *flags, U32 bits);\ninternal void lnk_cmd_switch_set_flag_64    (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, U64 *flags, U64 bits);\ninternal B32  lnk_cmd_switch_parse_string   (struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, String8 *string_out);\ninternal void lnk_cmd_switch_parse_string_copy(Arena *arena, struct LNK_Obj *obj, LNK_CmdSwitchType cmd_switch, String8List value_strings, String8 *string_out);\n\ninternal B32 lnk_parse_alt_name_directive (String8 string, struct LNK_Obj *obj, LNK_AltName *alt_out);\ninternal B32 lnk_parse_merge_directive    (String8 string, struct LNK_Obj *obj, LNK_MergeDirective *parse_out);\ninternal B32 lnk_parse_export_directive   (Arena *arena, String8 directive, struct LNK_Obj *obj, PE_ExportParse *export_out);\ninternal B32 lnk_parse_export_directive_ex(Arena *arena, String8List directive, struct LNK_Obj *obj, PE_ExportParse *export_out);\n\ninternal LNK_AltNameNode *        lnk_alt_name_list_push(Arena *arena, LNK_AltNameList *list, LNK_AltName v);\ninternal LNK_MergeDirectiveNode * lnk_merge_directive_list_push(Arena *arena, LNK_MergeDirectiveList *list, LNK_MergeDirective v);\n\n// --- Getters -----------------------------------------------------------------\n\ninternal String8 lnk_get_image_name               (LNK_Config *config);\ninternal U64     lnk_get_default_function_pad_min (COFF_MachineType machine);\ninternal U64     lnk_get_base_addr                (LNK_Config *config);\ninternal Version lnk_get_default_subsystem_version(PE_WindowsSubsystem subsystem, COFF_MachineType machine);\ninternal Version lnk_get_min_subsystem_version    (PE_WindowsSubsystem subsystem, COFF_MachineType machine);\n\ninternal B32 lnk_do_debug_info        (LNK_Config *config);\ninternal B32 lnk_is_thread_pool_shared(LNK_Config *config);\ninternal B32 lnk_is_section_removed   (LNK_Config *config, String8 section_name);\ninternal B32 lnk_is_dll_delay_load    (LNK_Config *config, String8 dll_name);\n\ninternal String8 lnk_get_lib_name     (String8 path);\ninternal void    lnk_push_disallow_lib(LNK_Config *config, String8 path);\ninternal B32     lnk_is_lib_disallowed(LNK_Config *config, String8 path);\n\ninternal void lnk_include_symbol(LNK_Config *config, String8 name, struct LNK_Obj *obj);\n\n// --- Config ------------------------------------------------------------------\n\ninternal void lnk_apply_cmd_option_to_config(LNK_Config *config, String8 name, String8List value_list, struct LNK_Obj *obj);\n\ninternal LNK_Config * lnk_config_from_cmd_line(String8List raw_cmd_line, LNK_CmdLine cmd_line);\n\n"
  },
  {
    "path": "src/linker/lnk_debug_helper.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8\nlnk_make_linker_compile3(Arena *arena, COFF_MachineType machine)\n{\n  String8 comp3_data = cv_make_comp3(arena,\n                                     0,\n                                     CV_Language_LINK,\n                                     cv_arch_from_coff_machine(machine),\n                                     /* ver_fe_major */ 0,\n                                     /* ver_fe_minor */ 0,\n                                     /* ver_fe_build */ 0,\n                                     /* ver_feqfe    */ 0,\n                                     /* ver_major    */ 14,\n                                     /* ver_minor    */ 36,\n                                     /* ver_build    */ 32537,\n                                     /* ver_qfe      */ 0,\n                                     str8_lit(BUILD_TITLE));\n  return comp3_data;\n}\n\ninternal String8\nlnk_make_debug_s(Arena *arena, CV_SymbolList symbol_list)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  CV_DebugS debug_s = {0};\n  String8List *symbol_list_ptr = cv_sub_section_ptr_from_debug_s(&debug_s, CV_C13SubSectionKind_Symbols);\n  *symbol_list_ptr = cv_data_from_symbol_list(scratch.arena, symbol_list, CV_SymbolAlign);\n\n  String8List debug_s_data_list = cv_data_c13_from_debug_s(scratch.arena, &debug_s, 1);\n  String8     debug_s_data      = str8_list_join(arena, &debug_s_data_list, 0);\n\n  scratch_end(scratch);\n  return debug_s_data;\n}\n\ninternal String8\nlnk_make_linker_debug_symbols(Arena *arena, COFF_MachineType machine)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  CV_SymbolList symbol_list = { .signature = CV_Signature_C13 };\n  String8       comp3_data  = lnk_make_linker_compile3(scratch.arena, machine);\n  cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data);\n  String8 debug_symbols = lnk_make_debug_s(arena, symbol_list);\n  scratch_end(scratch);\n  return debug_symbols;\n}\n\ninternal String8\nlnk_make_dll_import_debug_symbols(Arena *arena, COFF_MachineType machine, String8 dll_name)\n{\n  Temp scratch = scratch_begin(&arena,1);\n\n  CV_SymbolList symbol_list = { .signature = CV_Signature_C13 };\n\n  // S_OBJ\n  String8 obj_data = cv_make_obj_name(scratch.arena, dll_name, 0);\n  cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_OBJNAME, obj_data);\n\n  // S_COMPILE3\n  String8 comp3_data = lnk_make_linker_compile3(scratch.arena, machine);\n  cv_symbol_list_push_data(scratch.arena, &symbol_list, CV_SymKind_COMPILE3, comp3_data);\n\n  // TODO: add thunks\n\n  // serialize symbols\n  String8 debug_symbols = lnk_make_debug_s(arena, symbol_list);\n\n  scratch_end(scratch);\n  return debug_symbols;\n}\n\n"
  },
  {
    "path": "src/linker/lnk_debug_helper.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal String8 lnk_make_linker_compile3(Arena *arena, COFF_MachineType machine);\ninternal String8 lnk_make_debug_s(Arena *arena, CV_SymbolList symbol_list);\n\n"
  },
  {
    "path": "src/linker/lnk_debug_info.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_parse_debug_s_task)\n{\n  U64                      obj_idx = task_id;\n  LNK_ParseDebugSTaskData *task    = raw_task;\n\n  LNK_Obj    *obj       = task->obj_arr[obj_idx];\n  String8List sect_list = task->sect_list_arr[obj_idx];\n  CV_DebugS  *debug_s   = &task->debug_s_arr[obj_idx];\n\n  for (String8Node *node = sect_list.first; node != 0; node = node->next) {\n    // parse & merge sub sections\n    CV_DebugS ds = cv_parse_debug_s(arena, node->string);\n    cv_debug_s_concat_in_place(debug_s, &ds);\n\n    // make sure there is one string table\n    String8List string_data_list = cv_sub_section_from_debug_s(*debug_s, CV_C13SubSectionKind_StringTable);\n    if (string_data_list.node_count > 1) {\n      // TODO: print section index\n      lnk_error_obj(LNK_Warning_IllData, obj, \".debug$S has %u string table sub-sections defined, picking first sub-section\", string_data_list.node_count);\n    }\n\n    // make sure there is one file checksum table\n    String8List checksum_data_list = cv_sub_section_from_debug_s(*debug_s, CV_C13SubSectionKind_FileChksms);\n    if (checksum_data_list.node_count > 1) {\n      // TODO: print section index\n      lnk_error_obj(LNK_Warning_IllData, obj, \".debug$S has %u file checksum sub-sections defined, picking first sub-section\", checksum_data_list.node_count);\n    }\n  }\n}\n\ninternal CV_DebugS *\nlnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr)\n{\n  ProfBeginFunction();\n\n  LNK_ParseDebugSTaskData task_data = {0};\n  task_data.obj_arr                 = obj_arr;\n  task_data.sect_list_arr           = sect_list_arr;\n  task_data.debug_s_arr             = push_array(arena->v[0], CV_DebugS, obj_count);\n\n  tp_for_parallel(tp, arena, obj_count, lnk_parse_debug_s_task, &task_data);\n\n  ProfEnd();\n  return task_data.debug_s_arr;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_check_debug_t_sig_and_get_data_task)\n{\n  U64                         obj_idx = task_id;\n  LNK_CheckDebugTSigTaskData *task    = raw_task;\n\n  String8Array data_arr = task->data_arr_arr[obj_idx];\n  LNK_Obj *obj = task->obj_arr[obj_idx];\n\n  for (String8 *data_ptr = &data_arr.v[0], *data_opl = data_arr.v + data_arr.count;\n       data_ptr < data_opl;\n       ++data_ptr) {\n    if (data_ptr->size == 0) {\n      continue;\n    }\n\n    if (data_ptr->size < sizeof(CV_Signature)) {\n      // TODO: print section index\n      lnk_error_obj(LNK_Error_IllData, obj, \".debug$T must have at least 4 bytes for CodeView signature\");\n    }\n\n    CV_Signature *sig_ptr = (CV_Signature *)data_ptr->str;\n    switch (*sig_ptr) {\n    default: {\n      lnk_error_obj(LNK_Warning_IllData, obj, \"unknown CodeView type signature in section (TODO: print section index)\");\n      *data_ptr = str8(0,0);\n    } break;\n    case CV_Signature_C6:  {\n      lnk_not_implemented(\"TODO: C6 types\");\n      *data_ptr = str8(0,0);\n    } break;\n    case CV_Signature_C7: {\n      lnk_not_implemented(\"TODO: C7 types\");\n      *data_ptr = str8(0,0);\n    } break;\n    case CV_Signature_C11: {\n      lnk_not_implemented(\"TODO: C11 types\");\n      *data_ptr = str8(0,0);\n    } break;\n    case CV_Signature_C13: {\n      data_ptr->str += sizeof(CV_Signature);\n      data_ptr->size -= sizeof(CV_Signature);\n    } break;\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_parse_debug_t_task)\n{\n  ProfBeginFunction();\n  U64                      obj_idx  = task_id;\n  LNK_ParseDebugTTaskData *task     = raw_task;\n  String8Array             data_arr = task->data_arr_arr[obj_idx];\n  CV_DebugT               *debug_t  = &task->debug_t_arr[obj_idx];\n  *debug_t = cv_debug_t_from_data_arr(arena, data_arr, CV_LeafAlign);\n  ProfEnd();\n}\n\ninternal CV_DebugT *\nlnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr)\n{\n  ProfBeginFunction();\n  \n  // list -> array\n  String8Array *data_arr_arr = str8_array_from_list_arr(arena->v[0], debug_t_list_arr, obj_count);\n\n  // validate signatures\n  LNK_CheckDebugTSigTaskData check_sig;\n  check_sig.obj_arr      = obj_arr;\n  check_sig.data_arr_arr = data_arr_arr;\n  tp_for_parallel(tp, 0, obj_count, lnk_check_debug_t_sig_and_get_data_task, &check_sig);\n\n  // parse debug types\n  LNK_ParseDebugTTaskData parse;\n  parse.data_arr_arr = data_arr_arr;\n  parse.debug_t_arr  = push_array_no_zero(arena->v[0], CV_DebugT, obj_count);\n  tp_for_parallel(tp, arena, obj_count, lnk_parse_debug_t_task, &parse);\n\n  ProfEnd();\n  return parse.debug_t_arr;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_parse_cv_symbols_task)\n{\n  LNK_ParseCVSymbolsTaskData *task  = raw_task;\n  LNK_CodeViewSymbolsInput   *input = &task->inputs[task_id];\n  cv_parse_symbol_sub_section(arena, input->symbol_list, 0, input->raw_symbols, CV_SymbolAlign);\n}\n\ninternal LNK_PchInfo *\nlnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols, String8List alt_pch_dirs)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8 work_dir = os_get_current_path(scratch.arena);\n\n  HashTable      *debug_p_ht     = hash_table_init(scratch.arena, obj_count);\n  CV_LeafHeader **endprecomp_arr = push_array(scratch.arena, CV_LeafHeader *, obj_count);\n\n  for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n    CV_DebugT *debug_p = &debug_p_arr[obj_idx];\n    CV_DebugT *debug_t = &debug_t_arr[obj_idx];\n\n    if (debug_t->count && debug_p->count) {\n        lnk_error_obj(LNK_Warning_MultipleDebugTAndDebugP,\n                      obj_arr[obj_idx],\n                      \"multiple sections with debug types detected, obj must have either .debug$T or .debug$P (using .debug$T for type server)\");\n      continue;\n    }\n\n    if (debug_p->count) {\n      String8 obj_path = obj_arr[obj_idx]->path;      \n      obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, obj_path, work_dir);\n      if (hash_table_search_path(debug_p_ht, obj_path)) {\n        lnk_error_obj(LNK_Warning_DuplicateObjPath, obj_arr[obj_idx], \"duplicate obj path %S\", obj_path);\n      } else {\n        hash_table_push_path_u64(scratch.arena, debug_p_ht, obj_path, obj_idx);\n      }\n    }\n  }\n\n  LNK_PchInfo* pch_arr = push_array_no_zero(arena, LNK_PchInfo, obj_count);\n  for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n    CV_DebugT debug_t = debug_t_arr[obj_idx];\n    if (cv_debug_t_is_pch(debug_t)) {\n      CV_Leaf        precomp_leaf = cv_debug_t_get_leaf(debug_t, 0);\n      CV_PrecompInfo precomp      = cv_precomp_info_from_leaf(precomp_leaf);\n\n      String8 obj_path = path_absolute_dst_from_relative_dst_src(scratch.arena, precomp.obj_name, work_dir);\n      \n      // map obj name in LF_PRECOMP to obj index\n      U64 debug_p_obj_idx = max_U64;\n      if (!hash_table_search_path_u64(debug_p_ht, obj_path, &debug_p_obj_idx)) {\n        String8 obj_name = str8_skip_last_slash(obj_path);\n        for EachNode(alt_dir_n, String8Node, alt_pch_dirs.first) {\n          String8 alt_obj_path = str8f(scratch.arena, \"%S/%S\", alt_dir_n->string, obj_name);\n          if (hash_table_search_path_u64(debug_p_ht, alt_obj_path, &debug_p_obj_idx)) {\n            break;\n          }\n        }\n      }\n\n      if (debug_p_obj_idx == max_U64) {\n        lnk_error_obj(LNK_Error_PrecompObjNotFound, obj_arr[obj_idx], \"LF_PRECOMP references non-existent obj %S\", obj_path);\n        lnk_exit(LNK_Error_PrecompObjNotFound);\n      }\n\n      // get LF_PRECOMP\n      CV_DebugT          debug_p         = debug_p_arr[debug_p_obj_idx];\n      CV_Leaf            endprecomp_leaf = cv_debug_t_get_leaf(debug_p, precomp.leaf_count);\n      CV_LeafEndPreComp *endprecomp      = (CV_LeafEndPreComp*) endprecomp_leaf.data.str;\n\n      // error check LF_PRECOMP\n      if (precomp.start_index > CV_MinComplexTypeIndex) {\n        lnk_error_obj(LNK_Warning_AtypicalStartIndex, obj_arr[obj_idx], \"atypical start index 0x%X in LF_PRECOMP\", precomp.start_index);\n      }\n      if (precomp.start_index < CV_MinComplexTypeIndex) {\n        lnk_error_obj(LNK_Error_InvalidStartIndex, obj_arr[obj_idx], \"invalid start index 0x%X in LF_PRECOMP; must be >= 0x%X\", precomp.start_index, CV_MinComplexTypeIndex);\n      }\n      if (precomp.leaf_count > debug_p.count) {\n        lnk_error_obj(LNK_Error_InvalidPrecompLeafCount, obj_arr[obj_idx], \"leaf count %u LF_PRECOMP exceeds leaf count %u in .debug$P in %S\", precomp.leaf_count, debug_p.count, obj_arr[debug_p_obj_idx]->path);\n      }\n\n      // error check LF_ENDPRECOMP\n      if (endprecomp_leaf.kind != CV_LeafKind_ENDPRECOMP) {\n        lnk_error_obj(LNK_Error_EndprecompNotFound, obj_arr[obj_idx], \"unable to find LF_ENDPRECOMP @ 0x%X in %S\", precomp.leaf_count, obj_arr[debug_p_obj_idx]->path);\n      }\n      if (endprecomp_leaf.data.size != sizeof(CV_LeafEndPreComp)) {\n        lnk_error_obj(LNK_Error_IllData, obj_arr[obj_idx], \"invalid size 0x%X for LF_ENDPRECOMP\", endprecomp_leaf.data.size);\n      }\n      if (endprecomp->sig != precomp.sig) {\n        lnk_error_obj(LNK_Error_PrecompSigMismatch, obj_arr[obj_idx], \"signature mismatch between LF_PRECOMP(0x%X) and LF_ENDPRECOMP(0x%X); precomp obj %S\", precomp.sig, endprecomp->sig, obj_arr[debug_p_obj_idx]->path);\n      }\n      { // check against S_OBJNAME sig in precompiled obj $$SYMBOLS\n        CV_SymbolList symbol_list = parsed_symbols[debug_p_obj_idx].v[0];\n        if (symbol_list.count) {\n          CV_ObjInfo obj_info = cv_obj_info_from_symbol(symbol_list.first->data);\n          if (obj_info.sig != 0 && obj_info.sig != precomp.sig) {\n            lnk_error_obj(LNK_Error_PrecompSigMismatch, obj_arr[obj_idx], \"signature mismatch between LF_PRECOMP(0x%X) and S_OBJNAME(0x%X) in %S\", precomp.sig, obj_info.sig, obj_arr[debug_p_obj_idx]->path);\n          }\n        } else {\n          lnk_error_obj(LNK_Warning_PrecompObjSymbolsNotFound, obj_arr[obj_idx], \"symbols not found, unable to chceck LF_PRECOMP signature against S_OBJ\");\n        }\n      }\n\n      // see :pch_check\n      LNK_PchInfo *pch     = &pch_arr[obj_idx];\n      pch->ti_lo           = precomp.start_index;\n      pch->ti_hi           = precomp.start_index + precomp.leaf_count;\n      pch->debug_p_obj_idx = debug_p_obj_idx;\n\n      // [start_index, start_index+type_index_count)\n      debug_t_arr[obj_idx].count -= 1;\n      debug_t_arr[obj_idx].v     += 1;\n\n      endprecomp_arr[debug_p_obj_idx] = cv_debug_t_get_leaf_header(debug_p, precomp.leaf_count);\n    } else {\n      LNK_PchInfo *pch     = &pch_arr[obj_idx];\n      pch->ti_lo           = CV_MinComplexTypeIndex;\n      pch->ti_hi           = CV_MinComplexTypeIndex;\n      pch->debug_p_obj_idx = 0; // :null_obj\n    }\n  }\n \n  // remove LF_ENDPRECOMP\n  for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n    if (endprecomp_arr[obj_idx]) {\n      endprecomp_arr[obj_idx]->kind = CV_LeafKind_NOTYPE;\n      endprecomp_arr[obj_idx]->size = sizeof(CV_LeafKind);\n    }\n  }\n\n  scratch_end(scratch);\n  return pch_arr;\n}\n\ninternal void\nlnk_do_debug_info_discard(CV_DebugS *debug_s_arr, CV_SymbolListArray *parsed_symbols, U64 obj_idx)\n{\n  // remove symbols\n  for (U64 i = 0; i < parsed_symbols[obj_idx].count; ++i) {\n    MemoryZeroStruct(&parsed_symbols[obj_idx].v[i]);\n  }\n\n  // remove inline sites\n  String8List *inlineelines_ptr = cv_sub_section_ptr_from_debug_s(&debug_s_arr[obj_idx], CV_C13SubSectionKind_InlineeLines);\n  MemoryZeroStruct(inlineelines_ptr);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_msf_parsed_from_data_task)\n{\n  ProfBeginFunction();\n  LNK_MsfParsedFromDataTask *task = raw_task;\n  // TODO: pick Info, TPI and IPI to flattten to make sure we don't waste compute on throw-away streams\n  task->msf_parse_arr[task_id] = msf_parsed_from_data(arena, task->data_arr.v[task_id]);\n  ProfEnd();\n}\n\ninternal MSF_Parsed **\nlnk_msf_parsed_from_data_parallel(TP_Arena *arena, TP_Context *tp, String8Array data_arr)\n{\n  ProfBeginFunction();\n  LNK_MsfParsedFromDataTask task = {0};\n  task.data_arr                  = data_arr;\n  task.msf_parse_arr             = push_array_no_zero(arena->v[0], MSF_Parsed *, data_arr.count);\n  tp_for_parallel(tp, arena, data_arr.count, lnk_msf_parsed_from_data_task, &task);\n  ProfEnd();\n  return task.msf_parse_arr;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_get_external_leaves_task)\n{\n  ProfBeginFunction();\n\n  U64                        ts_idx    = task_id;\n  LNK_GetExternalLeavesTask *task      = raw_task;\n  MSF_Parsed                *msf_parse = task->msf_parse_arr[ts_idx];\n\n  task->external_ti_ranges[ts_idx] = push_array(arena, Rng1U64,   CV_TypeIndexSource_COUNT);\n  task->external_leaves[ts_idx]    = push_array(arena, CV_DebugT, CV_TypeIndexSource_COUNT);\n  task->is_corrupted[ts_idx]       = 1;\n\n  if (msf_parse) {\n    PDB_OpenTypeServerError tpi_error = PDB_OpenTypeServerError_UNKNOWN;\n    PDB_OpenTypeServerError ipi_error = PDB_OpenTypeServerError_UNKNOWN;   \n\n    PDB_TypeServerParse tpi_parse, ipi_parse;\n    if (PDB_FixedStream_Tpi < msf_parse->stream_count && PDB_FixedStream_Ipi < msf_parse->stream_count) {\n      tpi_error = pdb_type_server_parse_from_data(msf_parse->streams[PDB_FixedStream_Tpi], &tpi_parse);\n      ipi_error = pdb_type_server_parse_from_data(msf_parse->streams[PDB_FixedStream_Ipi], &ipi_parse);\n    }\n\n    if (tpi_error == PDB_OpenTypeServerError_OK && ipi_error == PDB_OpenTypeServerError_OK) {\n      task->is_corrupted[ts_idx] = 0;\n\n      task->external_ti_ranges[ts_idx][CV_TypeIndexSource_NULL] = rng_1u64(0,0);\n      task->external_ti_ranges[ts_idx][CV_TypeIndexSource_TPI ] = tpi_parse.ti_range;\n      task->external_ti_ranges[ts_idx][CV_TypeIndexSource_IPI ] = ipi_parse.ti_range;\n\n      MemoryZeroStruct(&task->external_leaves[ts_idx][CV_TypeIndexSource_NULL]);\n      task->external_leaves[ts_idx][CV_TypeIndexSource_TPI] = cv_debug_t_from_data(arena, tpi_parse.leaf_data, PDB_LEAF_ALIGN);\n      task->external_leaves[ts_idx][CV_TypeIndexSource_IPI] = cv_debug_t_from_data(arena, ipi_parse.leaf_data, PDB_LEAF_ALIGN);\n    } else {\n      if (tpi_error != PDB_OpenTypeServerError_OK) {\n        lnk_error(LNK_Error_UnableToOpenTypeServer, \"failed to open TPI in %S, reson %S\", task->ts_info_arr[ts_idx].name, pdb_string_from_open_type_server_error(tpi_error));\n      }\n      if (ipi_error != PDB_OpenTypeServerError_OK) {\n        lnk_error(LNK_Error_UnableToOpenTypeServer, \"failed to open IPI in %S, reason %S\", task->ts_info_arr[ts_idx].name, pdb_string_from_open_type_server_error(ipi_error));\n      }\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal CV_DebugT *\nlnk_merge_debug_t_and_debug_p(Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr)\n{\n  CV_DebugT *result = push_array_no_zero(arena, CV_DebugT, obj_count);\n  for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n    CV_DebugT *debug_p = &debug_p_arr[obj_idx];\n    CV_DebugT *debug_t = &debug_t_arr[obj_idx];\n    if (debug_p->count) {\n      Assert(!debug_t->count);\n      result[obj_idx] = *debug_p;\n    } else if (debug_t->count) {\n      Assert(!debug_p->count);\n      result[obj_idx] = *debug_t;\n    } else {\n      MemoryZeroStruct(&result[obj_idx]);\n    }\n  }\n  return result;\n}\n\ninternal LNK_CodeViewInput\nlnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 obj_count, LNK_Obj **obj_arr)\n{\n  ProfBegin(\"Extract CodeView\");\n  Temp scratch = scratch_begin(0,0);\n  \n  // gather debug info sections from objs\n  ProfBegin(\"Collect CodeView\");\n  // TODO: fix memory leak, we need a Temp wrapper for pool arena\n  B32 collect_discarded_flag = 0;\n  String8List *debug_s_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(\".debug$S\"), collect_discarded_flag);\n  String8List *debug_p_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(\".debug$P\"), collect_discarded_flag);\n  String8List *debug_t_list_arr = lnk_collect_obj_sections(tp, tp_arena, obj_count, obj_arr, str8_lit(\".debug$T\"), collect_discarded_flag);\n  ProfEnd();\n\n  if (lnk_get_log_status(LNK_Log_Debug) || PROFILE_TELEMETRY) {\n    U64 total_debug_s_size = 0, total_debug_t_size = 0, total_debug_p_size = 0;\n    for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n      for (String8Node *chunk = debug_s_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) {\n        total_debug_s_size += chunk->string.size;\n      }\n      for (String8Node *chunk = debug_t_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) {\n        total_debug_t_size += chunk->string.size;\n      }\n      for (String8Node *chunk = debug_p_list_arr[obj_idx].first; chunk != 0; chunk = chunk->next) {\n        total_debug_p_size += chunk->string.size;\n      }\n    }\n\t\n    ProfNoteV(\"Total .debug$S Input Size: %M\", total_debug_s_size);\n    ProfNoteV(\"Total .debug$T Input Size: %M\", total_debug_t_size);\n    ProfNoteV(\"Total .debug$P Input Size: %M\", total_debug_p_size);\n\t\n    if (lnk_get_log_status(LNK_Log_Debug)) {\n      lnk_log(LNK_Log_Debug, \"[Total .debug$S Input Size %M]\", total_debug_s_size);\n      lnk_log(LNK_Log_Debug, \"[Total .debug$T Input Size %M]\", total_debug_t_size);\n      lnk_log(LNK_Log_Debug, \"[Total .debug$P Input Size %M]\", total_debug_p_size);\n    }\n  }\n\n  ProfBegin(\"Parse CodeView\");\n  CV_DebugS *debug_s_arr = lnk_parse_debug_s_sections(tp, tp_arena, obj_count, obj_arr, debug_s_list_arr);\n  CV_DebugT *debug_p_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_p_list_arr);\n  CV_DebugT *debug_t_arr = lnk_parse_debug_t_sections(tp, tp_arena, obj_count, obj_arr, debug_t_list_arr);\n  ProfEnd();\n \n  ProfBegin(\"Sort Type Servers\");\n\n  U64 external_count = 0, internal_count = 0;\n  LNK_Obj   **sorted_obj_arr    = push_array_no_zero(tp_arena->v[0], LNK_Obj *, obj_count);\n  CV_DebugS *sorted_debug_s_arr = push_array_no_zero(tp_arena->v[0], CV_DebugS, obj_count);\n  CV_DebugT *sorted_debug_t_arr = push_array_no_zero(tp_arena->v[0], CV_DebugT, obj_count);\n  CV_DebugT *sorted_debug_p_arr = push_array_no_zero(tp_arena->v[0], CV_DebugT, obj_count);\n  for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n    B32 is_type_server = cv_debug_t_is_type_server(debug_t_arr[obj_idx]);\n    if (is_type_server) {\n      Assert(internal_count + external_count < obj_count);\n      U64 slot_idx = (obj_count - external_count - 1);\n      ++external_count;\n\n      // TODO: report error: somehow obj was compiled with /Zi and /Yc\n      Assert(debug_p_arr[obj_idx].count == 0);\n      \n      sorted_obj_arr[slot_idx]     = obj_arr[obj_idx];\n      sorted_debug_s_arr[slot_idx] = debug_s_arr[obj_idx];\n      sorted_debug_t_arr[slot_idx] = debug_t_arr[obj_idx];\n      MemoryZeroStruct(&sorted_debug_p_arr[slot_idx]);\n    } else {\n      Assert(internal_count + external_count < obj_count);\n      U64 slot_idx = internal_count;\n      ++internal_count;\n      \n      sorted_obj_arr[slot_idx]     = obj_arr[obj_idx];\n      sorted_debug_s_arr[slot_idx] = debug_s_arr[obj_idx];\n      sorted_debug_t_arr[slot_idx] = debug_t_arr[obj_idx];\n      sorted_debug_p_arr[slot_idx] = debug_p_arr[obj_idx];\n    }\n  }\n\n  ProfEnd();\n  \n  // setup pointers to arrays\n  LNK_Obj   **internal_obj_arr     = sorted_obj_arr;\n  LNK_Obj   **external_obj_arr     = sorted_obj_arr + internal_count;\n  CV_DebugS *internal_debug_s_arr = sorted_debug_s_arr;\n  CV_DebugS *external_debug_s_arr = sorted_debug_s_arr + internal_count;\n  CV_DebugT *internal_debug_t_arr = sorted_debug_t_arr;\n  CV_DebugT *external_debug_t_arr = sorted_debug_t_arr + internal_count;\n  CV_DebugT *internal_debug_p_arr = sorted_debug_p_arr;\n  CV_DebugT *external_debug_p_arr = sorted_debug_p_arr + internal_count;\n\n  ProfBegin(\"Parse Symbols\");\n\n  ProfBegin(\"Count Symbol Inputs\");\n  U64 internal_total_symbol_input_count = 0;\n  U64 external_total_symbol_input_count = 0;\n  for (U64 obj_idx = 0; obj_idx < internal_count; ++obj_idx) {\n    String8List raw_symbols = cv_sub_section_from_debug_s(internal_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols);\n    internal_total_symbol_input_count += raw_symbols.node_count;\n  }\n  for (U64 obj_idx = 0; obj_idx < external_count; ++obj_idx) {\n    String8List raw_symbols = cv_sub_section_from_debug_s(external_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols);\n    external_total_symbol_input_count += raw_symbols.node_count;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Prepare Symbol Inputs\");\n  U64                       total_symbol_input_count = internal_total_symbol_input_count + external_total_symbol_input_count;\n  LNK_CodeViewSymbolsInput *symbol_inputs            = push_array_no_zero(tp_arena->v[0], LNK_CodeViewSymbolsInput, total_symbol_input_count);\n  CV_SymbolListArray       *parsed_symbols           = push_array_no_zero(tp_arena->v[0], CV_SymbolListArray,       obj_count);\n  {\n    CV_SymbolList *reserved_lists = push_array(tp_arena->v[0], CV_SymbolList, total_symbol_input_count);\n    for (U64 obj_idx = 0, input_idx = 0; obj_idx < obj_count; ++obj_idx) {\n      String8List raw_symbols = cv_sub_section_from_debug_s(sorted_debug_s_arr[obj_idx], CV_C13SubSectionKind_Symbols);\n\n      // init parse output\n      if (raw_symbols.node_count > 0) {\n        parsed_symbols[obj_idx].count = raw_symbols.node_count;\n        parsed_symbols[obj_idx].v     = reserved_lists + input_idx;\n      } else {\n        parsed_symbols[obj_idx].count = 0;\n        parsed_symbols[obj_idx].v     = 0;\n      }\n\n      // init worker input\n      for (String8Node *data_n = raw_symbols.first; data_n != 0; data_n = data_n->next, ++input_idx) {\n        Assert(input_idx < total_symbol_input_count);\n        LNK_CodeViewSymbolsInput *in = &symbol_inputs[input_idx];\n        in->obj_idx                  = obj_idx;\n        in->symbol_list              = &reserved_lists[input_idx];\n        in->raw_symbols              = data_n->string;\n      }\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Symbol Parse\");\n  LNK_ParseCVSymbolsTaskData task = {0};\n  task.inputs                     = symbol_inputs;\n  tp_for_parallel(tp, tp_arena, total_symbol_input_count, lnk_parse_cv_symbols_task, &task);\n  ProfEnd();\n\n  // TODO: do we rely on this behaviour?\n  //\n  // :zero_out_symbol_sub_section\n  ProfBegin(\"Zero-out Symbols Sub-sections\");\n  for (U64 i = 0; i < obj_count; ++i) {\n    CV_DebugS *debug_s = &sorted_debug_s_arr[i];\n    String8List *symbols_ptr = cv_sub_section_ptr_from_debug_s(debug_s, CV_C13SubSectionKind_Symbols);\n    MemoryZeroStruct(symbols_ptr);\n  }\n  ProfEnd();\n\n  ProfEnd();\n\n  CV_SymbolListArray       *internal_parsed_symbols = parsed_symbols;\n  CV_SymbolListArray       *external_parsed_symbols = parsed_symbols + internal_count;\n  LNK_CodeViewSymbolsInput *internal_symbol_inputs  = symbol_inputs;\n  LNK_CodeViewSymbolsInput *external_symbol_inputs  = symbol_inputs + internal_count;\n\n  LNK_PchInfo *pch_arr = lnk_setup_pch(tp_arena->v[0],\n                                       internal_count,\n                                       internal_obj_arr,\n                                       internal_debug_t_arr,\n                                       internal_debug_p_arr,\n                                       internal_parsed_symbols,\n                                       alt_pch_dirs);\n\n  CV_DebugT *merged_debug_t_p_arr = lnk_merge_debug_t_and_debug_p(tp_arena->v[0], internal_count, internal_debug_t_arr, internal_debug_p_arr);\n\n  ProfBegin(\"Analyze & Read External Type Server Files\");\n  String8Array ts_path_arr;\n  Rng1U64    **external_ti_ranges;\n  CV_DebugT  **external_leaves;\n  U64         *obj_to_ts_idx_arr = push_array_no_zero(tp_arena->v[0], U64, external_count + 1);\n  U64List     *ts_to_obj_arr     = push_array(tp_arena->v[0], U64List, external_count + 1);\n  {\n    HashTable             *type_server_path_ht   = hash_table_init(scratch.arena, 256);\n    HashTable             *ignored_path_ht       = hash_table_init(scratch.arena, 256);\n    CV_TypeServerInfoList  ts_info_list = {0};\n\n    // push null\n    CV_TypeServerInfoNode *null_ts_info = push_array(scratch.arena, CV_TypeServerInfoNode, 1);\n    null_ts_info->data.name = str8_lit(\"\\0\");\n    SLLQueuePush(ts_info_list.first, ts_info_list.last, null_ts_info);\n    ++ts_info_list.count;\n\n    for (U64 obj_idx = 0; obj_idx < external_count; ++obj_idx) {\n      // first leaf always type server\n      CV_DebugT         debug_t = external_debug_t_arr[obj_idx];\n      CV_Leaf           leaf    = cv_debug_t_get_leaf(debug_t, 0);\n      CV_TypeServerInfo ts      = cv_type_server_info_from_leaf(leaf);\n\n      // search disk for type server\n      String8 type_server_path = lnk_find_first_file(scratch.arena, lib_dir_list, ts.name);\n\n      // report no match\n      B32 do_debug_info_discard = 0;\n      if (type_server_path.size == 0) {\n        if (!hash_table_search_path(ignored_path_ht, ts.name)) {\n          hash_table_push_string_u64(scratch.arena, ignored_path_ht, ts.name, 0);\n          lnk_error_obj(LNK_Warning_MissingExternalTypeServer, obj_arr[obj_idx], \"unable to open external type server %S\", ts.name);\n        }\n        do_debug_info_discard = 1;\n      }\n\n      // external type server is missing, discard parts of debug info that need types\n      if (do_debug_info_discard) {\n        lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, obj_idx);\n        continue;\n      }\n\n      {\n        struct HT_Value {\n          CV_TypeServerInfo  ts;\n          LNK_Obj           *obj;\n          U64                ts_idx;\n        };\n\n        // was this type server queued?\n        BucketNode *is_path_queued = hash_table_search_path(type_server_path_ht, type_server_path);\n        if (is_path_queued) {\n          struct HT_Value *present = is_path_queued->v.value_raw;\n          \n          // make sure type servers sigs match\n          if (MemoryMatchStruct(&ts.sig, &present->ts.sig)) {\n            // wire obj to type server data\n            obj_to_ts_idx_arr[obj_idx] = present->ts_idx;\n\n            // wire type server to obj\n            u64_list_push(tp_arena->v[0], &ts_to_obj_arr[present->ts_idx], obj_idx);\n          } else {\n            lnk_error_obj(LNK_Error_ExternalTypeServerConflict,\n                          obj_arr[obj_idx],\n                          \"external type server signature conflicts with type server loaded from '%S'\",\n                          present->obj->path);\n          }\n        } else {\n          U64 ts_idx = ts_info_list.count;\n\n          // when we search matches on disk we store path on scratch,\n          // make path copy in case we need it for error reporting\n          type_server_path = push_str8_copy(tp_arena->v[0], type_server_path);\n\n          // fill out type server info we read from obj\n          CV_TypeServerInfoNode *ts_info_node = push_array(scratch.arena, CV_TypeServerInfoNode, 1);\n          ts_info_node->data                  = ts;\n          ts_info_node->data.name             = type_server_path;\n\n          // push to type server info list\n          SLLQueuePush(ts_info_list.first, ts_info_list.last, ts_info_node);\n          ts_info_list.count += 1;\n          \n          // wire obj to type server\n          obj_to_ts_idx_arr[obj_idx] = ts_idx;\n\n          // wire type server to obj\n          u64_list_push(tp_arena->v[0], &ts_to_obj_arr[ts_idx], obj_idx);\n          \n          // fill out value\n          struct HT_Value *value = push_array(scratch.arena, struct HT_Value, 1);\n          value->ts     = ts;\n          value->obj    = obj_arr[obj_idx];\n          value->ts_idx = ts_idx;\n          \n          // update hash table\n          hash_table_push_path_raw(scratch.arena, type_server_path_ht, type_server_path, value);\n        }\n      }\n    }\n\n    // type server info list -> array\n    ts_path_arr.count              = ts_info_list.count;\n    ts_path_arr.v                  = push_array(tp_arena->v[0], String8, ts_info_list.count);\n    CV_TypeServerInfo *ts_info_arr = push_array(scratch.arena, CV_TypeServerInfo, ts_info_list.count);\n    {\n      U64 idx = 0;\n      for (CV_TypeServerInfoNode *n = ts_info_list.first; n != 0; n = n->next, ++idx) {\n        ts_path_arr.v[idx] = n->data.name;\n        ts_info_arr[idx]   = n->data;\n      }\n    }\n\n    // read type servers from disk in parallel\n    {\n      ProfBegin(\"Read External Type Servers\");\n      String8Array msf_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, 0, ts_path_arr);\n      ProfEnd();\n\n      MSF_Parsed **msf_parse_arr = lnk_msf_parsed_from_data_parallel(tp_arena, tp, msf_data_arr);\n\n      ProfBegin(\"Error check type servers\");\n      for (U64 ts_idx = 0; ts_idx < msf_data_arr.count; ++ts_idx) {\n        MSF_Parsed *msf_parse = msf_parse_arr[ts_idx];\n\n        B32 do_debug_info_discard = 0;\n\n        if (!msf_parse) {\n          do_debug_info_discard = 1;\n        } else {\n          PDB_InfoParse info_parse = {0};\n          pdb_info_parse_from_data(msf_parse->streams[PDB_FixedStream_Info], &info_parse);\n          if (!MemoryMatchStruct(&info_parse.guid, &ts_info_arr[ts_idx].sig)) {\n            Temp scratch = scratch_begin(0,0);\n            String8 expected_sig_str = string_from_guid(scratch.arena, ts_info_arr[ts_idx].sig);\n            String8 on_disk_sig_str  = string_from_guid(scratch.arena, info_parse.guid);\n            lnk_error(LNK_Warning_MismatchedTypeServerSignature, \"%S: signature mismatch in type server read from disk, expected %S, got %S\",\n                ts_info_arr[ts_idx].name, expected_sig_str, on_disk_sig_str);\n            scratch_end(scratch);\n\n            do_debug_info_discard = 1;\n          }\n        }\n\n        if (do_debug_info_discard) {\n          U64List obj_idx_list = ts_to_obj_arr[ts_idx];\n          for (U64Node *obj_idx_n = obj_idx_list.first; obj_idx_n != 0; obj_idx_n = obj_idx_n->next) {\n            lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, obj_idx_n->data);\n          }\n        }\n      }\n      ProfEnd();\n\n      ProfBeginDynamic(\"Open External Type Servers [Count %llu]\", ts_path_arr.count);\n      LNK_GetExternalLeavesTask task = {0};\n      task.ts_info_arr               = ts_info_arr;\n      task.msf_parse_arr             = msf_parse_arr;\n      task.external_ti_ranges        = push_array_no_zero(tp_arena->v[0], Rng1U64 *, msf_data_arr.count);\n      task.external_leaves           = push_array_no_zero(tp_arena->v[0], CV_DebugT *, msf_data_arr.count);\n      task.is_corrupted              = push_array_no_zero(scratch.arena, B8, msf_data_arr.count);\n      tp_for_parallel(tp, tp_arena, msf_data_arr.count, lnk_get_external_leaves_task, &task);\n      ProfEnd();\n\n      String8List unopen_type_server_list = {0};\n\n      // discard debug info that depends on the missing type server \n      for (U64 ts_idx = 1; ts_idx < msf_data_arr.count; ++ts_idx) {\n        if (task.is_corrupted[ts_idx]) {\n          U64List obj_idx_list = ts_to_obj_arr[ts_idx];\n          for (U64Node *node = obj_idx_list.first; node != 0; node = node->next) {\n            lnk_do_debug_info_discard(external_debug_s_arr, external_parsed_symbols, node->data);\n          }\n        }\n      }\n\n      // format error \n      for (U64 ts_idx = 1; ts_idx < msf_data_arr.count; ++ts_idx) {\n        if (task.is_corrupted[ts_idx]) {\n          U64List obj_idx_list = ts_to_obj_arr[ts_idx];\n          str8_list_pushf(scratch.arena, &unopen_type_server_list, \"\\t%S\\n\", ts_path_arr.v[ts_idx]);\n          str8_list_pushf(scratch.arena, &unopen_type_server_list, \"\\t\\tDependent obj(s):\\n\");\n          for (U64Node *obj_idx_node = obj_idx_list.first; obj_idx_node != 0; obj_idx_node = obj_idx_node->next) {\n            String8 obj_path = external_obj_arr[obj_idx_node->data]->path;\n            str8_list_pushf(scratch.arena, &unopen_type_server_list, \"\\t\\t\\t%S\\n\", obj_path);\n          }\n        }\n      }\n      if (unopen_type_server_list.node_count) {\n        String8List error_msg_list = { 0 };\n        str8_list_pushf(scratch.arena, &error_msg_list, \"unable to open external type server(s):\\n\");\n        str8_list_concat_in_place(&error_msg_list, &unopen_type_server_list);\n        String8 error_msg = str8_list_join(scratch.arena, &error_msg_list, 0);\n        lnk_error(LNK_Error_UnableToOpenTypeServer, \"%S\", error_msg);\n      }\n\n      // output\n      external_ti_ranges = task.external_ti_ranges;\n      external_leaves    = task.external_leaves;\n    }\n  }\n  ProfEnd();\n\n  // fill out result\n  LNK_CodeViewInput cv                 = {0};\n  cv.count                             = obj_count;\n  cv.internal_count                    = internal_count;\n  cv.external_count                    = external_count;\n  cv.type_server_count                 = ts_path_arr.count;\n  cv.type_server_path_arr              = ts_path_arr.v;\n  cv.ts_to_obj_arr                     = ts_to_obj_arr;\n  cv.obj_arr                           = sorted_obj_arr;\n  cv.pch_arr                           = pch_arr;\n  cv.debug_s_arr                       = sorted_debug_s_arr;\n  cv.debug_p_arr                       = sorted_debug_p_arr;\n  cv.debug_t_arr                       = sorted_debug_t_arr;\n  cv.merged_debug_t_p_arr              = merged_debug_t_p_arr;\n  cv.total_symbol_input_count          = total_symbol_input_count;\n  cv.symbol_inputs                     = symbol_inputs;\n  cv.parsed_symbols                    = parsed_symbols;\n  cv.internal_obj_arr                  = internal_obj_arr;\n  cv.external_obj_arr                  = external_obj_arr;\n  cv.internal_debug_s_arr              = internal_debug_s_arr;\n  cv.external_debug_s_arr              = external_debug_s_arr;\n  cv.internal_debug_t_arr              = internal_debug_t_arr;\n  cv.external_debug_t_arr              = external_debug_t_arr;\n  cv.internal_debug_p_arr              = internal_debug_p_arr;\n  cv.external_debug_p_arr              = external_debug_p_arr;\n  cv.internal_total_symbol_input_count = internal_total_symbol_input_count;\n  cv.internal_symbol_inputs            = internal_symbol_inputs;\n  cv.internal_parsed_symbols           = internal_parsed_symbols;\n  cv.external_total_symbol_input_count = external_total_symbol_input_count;\n  cv.external_symbol_inputs            = external_symbol_inputs;\n  cv.external_parsed_symbols           = external_parsed_symbols;\n  cv.external_ti_ranges                = external_ti_ranges;\n  cv.external_leaves                   = external_leaves;\n  cv.external_obj_to_ts_idx_arr        = obj_to_ts_idx_arr;\n  cv.external_obj_range                = rng_1u64(internal_count, internal_count + external_count);\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return cv;\n}\n\ninternal LNK_LeafRef\nlnk_leaf_ref(U32 enc_loc_idx, U32 enc_leaf_idx)\n{\n  LNK_LeafRef ref;\n  ref.enc_loc_idx  = enc_loc_idx;\n  ref.enc_leaf_idx = enc_leaf_idx;\n  return ref;\n}\n\ninternal LNK_LeafRef\nlnk_obj_leaf_ref(U32 obj_idx, U32 leaf_idx)\n{\n  return lnk_leaf_ref(obj_idx, leaf_idx);\n}\n\ninternal LNK_LeafRef\nlnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx)\n{\n  ts_idx |= LNK_LeafRefFlag_LocIdxExternal;\n\n  if (ti_source == CV_TypeIndexSource_IPI) {\n    leaf_idx |= LNK_LeafRefFlag_LeafIdxIPI;\n  }\n\n  return lnk_leaf_ref(ts_idx, leaf_idx);\n}\n\ninternal int\nlnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b)\n{\n  int cmp = 0;\n  if (a.enc_loc_idx < b.enc_loc_idx) {\n    cmp = -1;\n  } else if (a.enc_loc_idx > b.enc_loc_idx) {\n    cmp = +1;\n  } else {\n    if (a.enc_leaf_idx < b.enc_leaf_idx) {\n      cmp = -1;\n    } else if (a.enc_leaf_idx > b.enc_leaf_idx) {\n      cmp = +1;\n    }\n  }\n  return cmp;\n}\n\ninternal int\nlnk_leaf_ref_is_before(void *raw_a, void *raw_b)\n{\n  LNK_LeafRef **a = raw_a;\n  LNK_LeafRef **b = raw_b;\n  int is_before;\n  if ((*a)->enc_loc_idx == (*b)->enc_loc_idx) {\n    is_before = (*a)->enc_leaf_idx < (*b)->enc_leaf_idx;\n  } else {\n    is_before = (*a)->enc_loc_idx < (*b)->enc_loc_idx;\n  }\n  return is_before;\n}\n\ninternal LNK_LeafLocType\nlnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref)\n{\n  if (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) {\n    return LNK_LeafLocType_External;\n  }\n  return LNK_LeafLocType_Internal;\n}\n\ninternal LNK_LeafLocType\nlnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx)\n{\n  if (input->external_obj_range.min <= obj_idx && obj_idx < input->external_obj_range.max) {\n    return LNK_LeafLocType_External;\n  }\n  return LNK_LeafLocType_Internal;\n}\n\ninternal U64\nlnk_loc_idx_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx)\n{\n  if (input->external_obj_range.min <= obj_idx && obj_idx < input->external_obj_range.max) {\n    return input->external_obj_to_ts_idx_arr[obj_idx - input->external_obj_range.min];\n  }\n  return obj_idx;\n}\n\ninternal CV_TypeIndex\nlnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref)\n{\n  CV_TypeIndex ti_lo;\n\n  LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref);\n  switch (loc_type) {\n  case LNK_LeafLocType_Internal: {\n    ti_lo = CV_MinComplexTypeIndex;\n  } break;\n  case LNK_LeafLocType_External: {\n    U64                ts_idx    = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n    CV_TypeIndexSource ti_source = (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LeafIdxIPI) ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI;\n    ti_lo = input->external_ti_ranges[ts_idx][ti_source].min;\n  } break;\n  default: ti_lo = 0; break;\n  }\n\n  return ti_lo;\n}\n\ninternal CV_TypeIndex\nlnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source)\n{\n  CV_TypeIndex ti_lo = 0;\n  if (loc_type == LNK_LeafLocType_Internal) {\n    ti_lo = CV_MinComplexTypeIndex;\n  } else if (loc_type == LNK_LeafLocType_External) {\n    ti_lo = input->external_ti_ranges[loc_idx][ti_source].min;\n  }\n  return ti_lo;\n}\n\ninternal String8\nlnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref)\n{\n  String8 data;\n\n  LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref);\n  switch (loc_type) {\n  case LNK_LeafLocType_Internal: {\n    U32       obj_idx  = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n    U32       leaf_idx = leaf_ref.enc_leaf_idx;\n    CV_DebugT debug_t  = input->merged_debug_t_p_arr[obj_idx];\n    data = cv_debug_t_get_raw_leaf(debug_t, leaf_idx);\n  } break;\n\n  case LNK_LeafLocType_External: {\n    U64                ts_idx    = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n    U64                leaf_idx  = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI;\n    CV_TypeIndexSource ti_source = leaf_ref.enc_leaf_idx & LNK_LeafRefFlag_LeafIdxIPI ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI;\n    CV_DebugT          debug_t   = input->external_leaves[ts_idx][ti_source];\n    data = cv_debug_t_get_raw_leaf(debug_t, leaf_idx);\n  } break;\n\n  default: data = str8(0,0); break;\n  }\n\n  return data;\n}\n\ninternal CV_TypeIndex\nlnk_type_index_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref)\n{\n  CV_TypeIndex type_index = 0;\n  LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(leaf_ref);\n  switch (loc_type) {\n  case LNK_LeafLocType_Internal: {\n    LNK_PchInfo pch_info = input->pch_arr[leaf_ref.enc_loc_idx];\n    type_index = pch_info.ti_hi + leaf_ref.enc_leaf_idx;\n  } break;\n  case LNK_LeafLocType_External: {\n    CV_TypeIndex lo = lnk_ti_lo_from_leaf_ref(input, leaf_ref);\n    type_index = lo + leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI;\n  } break;\n  default: InvalidPath;\n  }\n  return type_index;\n}\n\ninternal CV_Leaf\nlnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref)\n{\n  String8 raw_leaf = lnk_data_from_leaf_ref(input, leaf_ref);\n  CV_Leaf leaf;\n  cv_deserial_leaf(raw_leaf, 0, 1, &leaf);\n  return leaf;\n}\n\ninternal U128\nlnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref)\n{\n  LNK_LeafLocType    loc_type;\n  CV_TypeIndexSource ti_source;\n  if (leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) {\n    loc_type  = LNK_LeafLocType_External;\n    ti_source = (leaf_ref.enc_leaf_idx & LNK_LeafRefFlag_LeafIdxIPI) ? CV_TypeIndexSource_IPI : CV_TypeIndexSource_TPI;\n  } else {\n    loc_type  = LNK_LeafLocType_Internal;\n    ti_source = CV_TypeIndexSource_TPI;\n  }\n\n  U32 loc_idx  = leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n  U32 leaf_idx = leaf_ref.enc_leaf_idx & ~LNK_LeafRefFlag_LeafIdxIPI;\n  U128 hash    = hashes->v[loc_type][loc_idx][ti_source].v[leaf_idx];\n\n  return hash;\n}\n\ninternal LNK_LeafRef\nlnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput  *input,\n                                 LNK_LeafLocType     loc_type,\n                                 CV_TypeIndexSource  ti_source,\n                                 U64                 loc_idx,\n                                 CV_TypeIndex        obj_ti)\n{\n  LNK_LeafRef leaf_ref;\n\n  switch (loc_type) {\n  case LNK_LeafLocType_External: {\n    U64 ts_idx = loc_idx;\n\n    CV_TypeIndex ti_lo = input->external_ti_ranges[ts_idx][ti_source].min;\n    Assert(obj_ti >= ti_lo);\n\n    // encode leaf index for type server\n    leaf_ref = lnk_ts_leaf_ref(ti_source, ts_idx, obj_ti - ti_lo);\n  } break;\n\n  case LNK_LeafLocType_Internal: {\n    U64 obj_idx = loc_idx;\n\n    LNK_PchInfo pch = input->pch_arr[obj_idx];\n    if (obj_ti < pch.ti_lo) {\n      CV_TypeIndex ti_lo = CV_MinComplexTypeIndex;\n      Assert(obj_ti >= ti_lo);\n      leaf_ref = lnk_obj_leaf_ref(obj_idx, obj_ti - ti_lo);\n    }\n    // PCH indirection\n    else if (obj_ti < pch.ti_hi) {\n      // we don't support nested precompiled types\n      Assert(input->pch_arr[pch.debug_p_obj_idx].debug_p_obj_idx == /* null_obj: */ 0);\n      Assert(input->pch_arr[pch.debug_p_obj_idx].ti_lo == input->pch_arr[pch.debug_p_obj_idx].ti_hi);\n      leaf_ref = lnk_obj_leaf_ref(pch.debug_p_obj_idx, obj_ti - pch.ti_lo);\n    } else {\n      leaf_ref = lnk_obj_leaf_ref(obj_idx, pch.ti_lo + (obj_ti - pch.ti_hi) - CV_MinComplexTypeIndex);\n    }\n  } break;\n\n  default: leaf_ref = lnk_leaf_ref(0, 0); break;\n  }\n\n  return leaf_ref;\n}\n\ninternal B32\nlnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b)\n{\n  B32 are_same = 0;\n\n  U128 a_hash = lnk_hash_from_leaf_ref(hashes, a);\n  U128 b_hash = lnk_hash_from_leaf_ref(hashes, b);\n\n  if (u128_match(a_hash, b_hash)) {\n    CV_Leaf a_leaf = lnk_cv_leaf_from_leaf_ref(input, a);\n    CV_Leaf b_leaf = lnk_cv_leaf_from_leaf_ref(input, b);\n    Assert(a_leaf.kind == b_leaf.kind);\n#if 0\n    {\n      Temp scratch = scratch_begin(0,0);\n      CV_TypeIndexInfoList ti_info_list   = cv_get_leaf_type_index_offsets(scratch.arena, a_leaf.kind, a_leaf.data);\n      String8Array         a_raw_data_arr = cv_get_data_around_type_indices(scratch.arena, ti_info_list, a_leaf.data);\n      String8Array         b_raw_data_arr = cv_get_data_around_type_indices(scratch.arena, ti_info_list, b_leaf.data);\n      for (U64 i = 0; i < a_raw_data_arr.count; ++i) {\n        String8 a_chunk = a_raw_data_arr.v[i];\n        String8 b_chunk = b_raw_data_arr.v[i];\n        Assert(str8_match(a_chunk, b_chunk, 0));\n      }\n      scratch_end(scratch);\n    }\n#endif\n    are_same = 1;\n  }\n\n  return are_same;\n}\n\ninternal B32\nlnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b)\n{\n  B32 are_equal = 0;\n\n  U128 a_hash = lnk_hash_from_leaf_ref(hashes, a);\n  U128 b_hash = lnk_hash_from_leaf_ref(hashes, b);\n  \n  if (u128_match(a_hash, b_hash)) {\n    String8 a_raw_leaf = lnk_data_from_leaf_ref(input, a);\n    String8 b_raw_leaf = lnk_data_from_leaf_ref(input, b);\n\n    CV_LeafHeader *a_header = (CV_LeafHeader *) a_raw_leaf.str;\n    CV_LeafHeader *b_header = (CV_LeafHeader *) b_raw_leaf.str;\n\n    if (a_header->kind == b_header->kind && a_header->size == b_header->size) {\n      CV_Leaf a_leaf = cv_leaf_from_string(a_raw_leaf);\n      CV_Leaf b_leaf = cv_leaf_from_string(b_raw_leaf);\n\n      Temp temp = temp_begin(arena);\n\n      CV_TypeIndexInfoList ti_info_list   = cv_get_leaf_type_index_offsets(temp.arena, a_leaf.kind, a_leaf.data);\n      String8Array         a_raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, a_leaf.data);\n      String8Array         b_raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, b_leaf.data);\n\n      are_equal = 1;\n\n      for (U64 i = 0; i < a_raw_data_arr.count; ++i) {\n        String8 a_chunk = a_raw_data_arr.v[i];\n        String8 b_chunk = b_raw_data_arr.v[i];\n        Assert(a_chunk.size == b_chunk.size);\n        are_equal = str8_match(a_chunk, b_chunk, 0);\n        if (!are_equal) {\n          goto skip_type_index_compare;\n        }\n      }\n\n      CV_TypeIndex a_ti_lo = lnk_ti_lo_from_leaf_ref(input, a);\n      CV_TypeIndex b_ti_lo = lnk_ti_lo_from_leaf_ref(input, b);\n      AssertAlways(a_ti_lo == b_ti_lo);\n\n      for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) {\n        CV_TypeIndex *a_ti_ptr = (CV_TypeIndex *) (a_leaf.data.str + ti_info->offset);\n        CV_TypeIndex *b_ti_ptr = (CV_TypeIndex *)(b_leaf.data.str + ti_info->offset);\n\n        if (*a_ti_ptr >= a_ti_lo && *b_ti_ptr >= b_ti_lo) {\n          LNK_LeafLocType a_loc_type = (a.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) >> 31;\n          LNK_LeafLocType b_loc_type = (b.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal) >> 31;\n\n          U64 a_loc_idx = a.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n          U64 b_loc_idx = b.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n\n          LNK_LeafRef a_sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, a_loc_type, ti_info->source, a_loc_idx, *a_ti_ptr);\n          LNK_LeafRef b_sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, b_loc_type, ti_info->source, b_loc_idx, *b_ti_ptr);\n\n          are_equal = lnk_match_leaf_ref_deep(arena, input, hashes, a_sub_leaf_ref, b_sub_leaf_ref);\n          if (!are_equal) {\n            break;\n          }\n        }\n        // compare simple leaves\n        else {\n          are_equal = *a_ti_ptr == *b_ti_ptr;\n          if (!are_equal) {\n            break;\n          }\n        }\n      }\n\nskip_type_index_compare:;\n      temp_end(temp);\n    }\n  }\n\n  return are_equal;\n}\n\ninternal U128\nlnk_hash_cv_leaf(Arena               *arena,\n                 LNK_CodeViewInput   *input,\n                 LNK_LeafHashes      *hashes,\n                 LNK_LeafLocType      loc_type,\n                 U32                  loc_idx,\n                 Rng1U64             *ti_ranges,\n                 CV_TypeIndex         curr_ti,\n                 CV_Leaf              leaf,\n                 CV_TypeIndexInfoList ti_info_list)\n{\n  // init hasher\n  blake3_hasher hasher; blake3_hasher_init(&hasher);\n\n  // hash leaf size\n  blake3_hasher_update(&hasher, &leaf.data.size, sizeof leaf.data.size);\n\n  // hash leaf kind\n  blake3_hasher_update(&hasher, &leaf.kind, sizeof leaf.kind);\n\n  // hash bytes around indices\n  {\n    Temp temp = temp_begin(arena);\n    String8Array raw_data_arr = cv_get_data_around_type_indices(temp.arena, ti_info_list, leaf.data);\n    for (U64 i = 0; i < raw_data_arr.count; ++i) {\n      blake3_hasher_update(&hasher, raw_data_arr.v[i].str, raw_data_arr.v[i].size);\n    }\n    temp_end(temp);\n  }\n\n  // mix-in sub leaf hashes\n  for (CV_TypeIndexInfo *ti_n = ti_info_list.first; ti_n != 0; ti_n = ti_n->next) {\n    CV_TypeIndex sub_ti = *(CV_TypeIndex *) (leaf.data.str + ti_n->offset);\n\n    // is type index complex?\n    if (sub_ti >= ti_ranges[ti_n->source].min) {\n      // Mostly leaves are laid out as DAG and we can get to sub leaf hash through index lookup,\n      // however MASM doesn't follow DAG rule, for example:\n      //\n      // Engine\\Source\\Developer\\Windows\\LiveCoding\\Private\\External\\LC_JumpToSelf.asm\n      //  .debug$T (No. 4):\n      //    LF_PROCEDURE (0x1000) [0008-0014]\n      //     Return type:         3\n      //     Call Convention:     Near C\n      //     Function Attribs:    NULL\n      //     Argumnet Count:      0\n      //     Argument List Type:  1001\n      //   LF_ARGLIST (0x1001) [0018-001C]\n      //     Types 0\n      //   LF_LABEL (0x1002) [0020-0024]\n      //     $UNDEFINED: E\n      // \n      // Note: LF_ARGLIST(0x1001) > LF_PROCEDURE(0x1000)\n      // \n      // Luckily we don't have many leaves that break DAG rule and we can skip without \n      // much memory and perf penalty (In Ancient Game we skip 7 leaves) \n      if (sub_ti < curr_ti) {\n        LNK_LeafRef sub_leaf_ref = lnk_leaf_ref_from_loc_idx_and_ti(input, loc_type, ti_n->source, loc_idx, sub_ti);\n\n        // query sub hash\n        U128 sub_hash = lnk_hash_from_leaf_ref(hashes, sub_leaf_ref);\n\n        // make sure sub hash was computed (:zero_hash_array)\n        Assert(!u128_match(sub_hash, u128_zero()));\n\n        // mix-in sub hash\n        blake3_hasher_update(&hasher, &sub_hash, sizeof sub_hash);\n      } else {\n        Temp scratch = scratch_begin(0,0);\n        String8 leaf_kind_str = cv_string_from_leaf_kind(leaf.kind);\n        String8 leaf_info     = push_str8f(scratch.arena, \"LF_%S(type_index: 0x%x) forward refs member type index 0x%x (leaf struct offset: 0x%llx)\", leaf_kind_str, curr_ti, sub_ti, ti_n->offset);\n        if (loc_type == LNK_LeafLocType_Internal) {\n          lnk_error_obj(LNK_Error_InvalidTypeIndex, input->internal_obj_arr[loc_idx], \"%S\", leaf_info);\n        } else if (loc_type == LNK_LeafLocType_External) {\n          lnk_error(LNK_Error_InvalidTypeIndex, \"%S: %S\", input->type_server_path_arr[loc_idx], leaf_info);\n        } else {\n          InvalidPath;\n        }\n        scratch_end(scratch);\n      }\n    }\n    // simple indices are stable across compile units \n    else {\n      blake3_hasher_update(&hasher, &sub_ti, sizeof sub_ti);\n    }\n  }\n\n  U128 hash;\n  blake3_hasher_finalize(&hasher, (U8 *) &hash, sizeof hash);\n\n  return hash;\n}\n\ninternal void\nlnk_hash_cv_leaf_deep(Arena               *arena,\n                      LNK_CodeViewInput   *input,\n                      Rng1U64             *ti_ranges,\n                      CV_DebugT           *leaves,\n                      LNK_LeafHashes      *hashes,\n                      LNK_LeafLocType      loc_type,\n                      U32                  loc_idx,\n                      CV_TypeIndexInfoList ti_info_list,\n                      String8              data)\n{\n  Temp temp = temp_begin(arena);\n\n  struct stack_s {\n    struct stack_s      *next;\n    CV_TypeIndexInfoList ti_info_list;\n    CV_TypeIndexInfo    *ti_info;\n    CV_Leaf              leaf;\n    String8              data;\n    CV_TypeIndex         ti;\n    CV_TypeIndexSource   ti_source;\n  };\n\n  // set up root frame\n  struct stack_s *root_frame = push_array_no_zero(temp.arena, struct stack_s, 1);\n  root_frame->next         = 0;\n  root_frame->ti_info_list = ti_info_list;\n  root_frame->ti_info      = ti_info_list.first;\n  root_frame->data         = data;\n  root_frame->ti           = 0;\n  root_frame->ti_source    = CV_TypeIndexSource_NULL;\n  MemoryZeroStruct(&root_frame->leaf);\n\n  U128Array *curr_hashes = hashes->v[loc_type][loc_idx];\n\n  struct stack_s *stack = root_frame;\n  while (stack) {\n    while (stack->ti_info) {\n      CV_TypeIndexInfo *curr_ti_info = stack->ti_info;\n\n      // advance iterator\n      stack->ti_info = stack->ti_info->next;\n\n      // get type index info\n      CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (stack->data.str + curr_ti_info->offset);\n\n      // is index complex?\n      if (*ti_ptr >= ti_ranges[curr_ti_info->source].min) {\n        // TODO: handle malformed index\n        AssertAlways(*ti_ptr < ti_ranges[curr_ti_info->source].max);\n        U64 ti_idx = (*ti_ptr - ti_ranges[curr_ti_info->source].min);\n\n        // was leaf hashed?\n        if (MemoryIsZeroStruct(&curr_hashes[curr_ti_info->source].v[ti_idx])) { // :zero_hash_array\n          CV_Leaf leaf = cv_debug_t_get_leaf(leaves[curr_ti_info->source], ti_idx);\n\n          // find index offsets\n          CV_TypeIndexInfoList sub_ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data);\n\n          // do we have sub leaves?\n          if (sub_ti_info_list.count) {\n            // fill out new frame\n            struct stack_s *frame = push_array_no_zero(temp.arena, struct stack_s, 1);\n            frame->next         = 0;\n            frame->ti_info_list = sub_ti_info_list;\n            frame->ti_info      = sub_ti_info_list.first;\n            frame->leaf         = leaf;\n            frame->data         = leaf.data;\n            frame->ti           = *ti_ptr;\n            frame->ti_source    = curr_ti_info->source;\n\n            // recurse to sub leaf\n            SLLStackPush(stack, frame);\n            break;\n          } else {\n            curr_hashes[curr_ti_info->source].v[ti_idx] = lnk_hash_cv_leaf(temp.arena,\n                                                                           input,\n                                                                           hashes,\n                                                                           loc_type,\n                                                                           loc_idx,\n                                                                           ti_ranges,\n                                                                           CV_TypeIndex_Max,\n                                                                           leaf,\n                                                                           sub_ti_info_list);\n          }\n        }\n      }\n    }\n\n    // no more type indices, pop frame\n    if (!stack->ti_info) {\n\n      if (stack != root_frame) {\n        // sub leaves are hashed we can now hash parent leaf\n        Temp temp2 = temp_begin(temp.arena);\n        U64 leaf_idx = stack->ti - ti_ranges[stack->ti_source].min;\n        curr_hashes[stack->ti_source].v[leaf_idx] = lnk_hash_cv_leaf(temp2.arena,\n                                                                     input,\n                                                                     hashes,\n                                                                     loc_type,\n                                                                     loc_idx,\n                                                                     ti_ranges,\n                                                                     CV_TypeIndex_Max,\n                                                                     stack->leaf,\n                                                                     stack->ti_info_list);\n        temp_end(temp2);\n      }\n\n      SLLStackPop(stack);\n    }\n  }\n\n  temp_end(temp);\n}\n\ninternal LNK_LeafBucket *\nlnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U128 new_hash, LNK_LeafBucket *new_bucket)\n{\n  LNK_LeafBucket *result                 = 0;\n  B32             is_inserted_or_updated = 0;\n\n  U64 best_idx = u128_mod64(new_hash, leaf_ht->cap);\n  U64 idx      = best_idx;\n\n  do {\n    retry:;\n    LNK_LeafBucket *curr_bucket = leaf_ht->bucket_arr[idx];\n\n    if (curr_bucket == 0) {\n      LNK_LeafBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        is_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    } else if (lnk_match_leaf_ref(input, hashes, curr_bucket->leaf_ref, new_bucket->leaf_ref)) {\n      int leaf_cmp = lnk_leaf_ref_compare(curr_bucket->leaf_ref, new_bucket->leaf_ref);\n\n      if (leaf_cmp <= 0) {\n        // are we inserting bucket that was already inserterd?\n        Assert(leaf_cmp < 0);\n\n        result = new_bucket;\n\n        is_inserted_or_updated = 1;\n\n        // don't need to update, more recent leaf is in the bucket\n        break;\n      }\n\n      LNK_LeafBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&leaf_ht->bucket_arr[idx], new_bucket, curr_bucket);\n      if (compare_bucket == curr_bucket) {\n        result = compare_bucket;\n\n        is_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    }\n\n    // advance\n    idx = (idx + 1) % leaf_ht->cap;\n  } while (idx != best_idx);\n\n  Assert(is_inserted_or_updated);\n\n  return result;\n}\n\ninternal LNK_LeafBucket *\nlnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref)\n{\n  LNK_LeafBucket *match = 0;\n\n  U128 hash            = lnk_hash_from_leaf_ref(hashes, leaf_ref);\n  U64  best_bucket_idx = u128_mod64(hash, ht->cap);\n  U64  bucket_idx      = best_bucket_idx;\n\n  do {\n    LNK_LeafBucket *bucket = ht->bucket_arr[bucket_idx];\n\n    if (bucket == 0) {\n      break;\n    }\n\n    if (lnk_match_leaf_ref(input, hashes, bucket->leaf_ref, leaf_ref)) {\n      match = bucket;\n      break;\n    }\n\n    bucket_idx = (bucket_idx + 1) % ht->cap;\n  } while (bucket_idx != best_bucket_idx);\n\n  return match;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_count_per_source_leaf_task)\n{\n  ProfBeginFunction();\n\n  LNK_CountPerSourceLeafTask *task            = raw_task;\n  LNK_LeafRangeList           leaf_range_list = task->leaf_ranges_per_task[task_id];\n\n  for (LNK_LeafRange *leaf_range = leaf_range_list.first; leaf_range != 0; leaf_range = leaf_range->next) {\n    CV_DebugT debug_t = *leaf_range->debug_t;\n    for (U64 leaf_idx = leaf_range->range.min; leaf_idx < leaf_range->range.max; ++leaf_idx) {\n      CV_LeafHeader      *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx);\n      CV_TypeIndexSource  leaf_source = cv_type_index_source_from_leaf_kind(leaf_header->kind);\n      task->count_arr_arr[leaf_source][task_id] += 1;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal void\nlnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 per_source_count_arr[CV_TypeIndexSource_COUNT])\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  ProfBegin(\"Compute Per Task Ranges\");\n  U64                per_task_leaf_count  = 10000;\n  LNK_LeafRangeList *leaf_ranges_per_task = push_array(scratch.arena, LNK_LeafRangeList, tp->worker_count);\n  for (U64 i = 0, task_weight = 0, task_id = 0; i < count; ++i) {\n    CV_DebugT *debug_t = &debug_t_arr[i];\n    for (U64 k = 0; k < debug_t->count; k += per_task_leaf_count) {\n      U64 cap = per_task_leaf_count - task_weight;\n\n      LNK_LeafRange *leaf_range = push_array(scratch.arena, LNK_LeafRange, 1);\n      leaf_range->range         = rng_1u64(k, Min(k + cap, debug_t->count));\n      leaf_range->debug_t       = debug_t;\n\n      LNK_LeafRangeList *list = &leaf_ranges_per_task[task_id];\n      SLLQueuePush(list->first, list->last, leaf_range);\n      ++list->count;\n\n      task_weight += dim_1u64(leaf_range->range);\n      if (task_weight >= per_task_leaf_count) {\n        task_id     = (task_id + 1) % tp->worker_count;\n        task_weight = 0;\n      }\n    }\n  }\n  ProfEnd();\n\n\n  LNK_CountPerSourceLeafTask task;\n  task.leaf_ranges_per_task = leaf_ranges_per_task;\n  task.count_arr_arr        = push_matrix_u64(scratch.arena, CV_TypeIndexSource_COUNT, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_count_per_source_leaf_task, &task);\n\n  for (U64 i = 0; i < CV_TypeIndexSource_COUNT; ++i) {\n    per_source_count_arr[i] += sum_array_u64(tp->worker_count, task.count_arr_arr[i]);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_hash_debug_t_task)\n{\n  ProfBeginFunction();\n\n  U64                 obj_idx = task_id;\n  LNK_LeafHasherTask *task    = raw_task;\n\n  Arena     *fixed_arena = task->fixed_arenas[worker_id];\n  CV_DebugT  debug_t     = task->debug_t_arr[obj_idx];\n  U128Array  out_hashes  = task->hashes->v[LNK_LeafLocType_Internal][obj_idx][CV_TypeIndexSource_TPI];\n\n  Rng1U64 ti_ranges[CV_TypeIndexSource_COUNT];\n  for (U64 ti_source = 0; ti_source < ArrayCount(ti_ranges); ++ti_source) {\n    ti_ranges[ti_source] = rng_1u64(task->input->pch_arr[obj_idx].ti_lo, task->input->pch_arr[obj_idx].ti_hi + debug_t.count);\n  }\n\n  for (U64 leaf_idx = 0; leaf_idx < debug_t.count; ++leaf_idx) {\n    Temp temp = temp_begin(fixed_arena);\n\n    // :debug_zero_hash_assert make sure we don't write same hash more than once\n    //Assert(MemoryIsZeroStruct(&out_hash_arr.v[leaf_idx])); \n\n    CV_TypeIndex         curr_ti      = lnk_type_index_from_leaf_ref(task->input, lnk_leaf_ref(obj_idx, leaf_idx));\n    CV_Leaf              leaf         = cv_debug_t_get_leaf(debug_t, leaf_idx);\n    CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data);\n\n    out_hashes.v[leaf_idx] = lnk_hash_cv_leaf(temp.arena,\n                                              task->input,\n                                              task->hashes,\n                                              LNK_LeafLocType_Internal,\n                                              obj_idx,\n                                              ti_ranges,\n                                              curr_ti,\n                                              leaf,\n                                              ti_info_list);\n\n    temp_end(temp);\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_hash_type_server_leaves_task)\n{\n  ProfBeginFunction();\n\n  LNK_LeafHasherTask *task    = raw_task;\n  U64                 obj_idx = task_id;\n\n  LNK_CodeViewInput *input  = task->input;\n  LNK_LeafHashes    *hashes = task->hashes;\n\n  CV_SymbolListArray parsed_symbols = input->external_parsed_symbols[obj_idx];\n  CV_DebugS          debug_s        = input->external_debug_s_arr[obj_idx];\n  U64                ts_idx         = input->external_obj_to_ts_idx_arr[obj_idx];\n  CV_DebugT         *leaves         = input->external_leaves[ts_idx];\n  Rng1U64           *ti_ranges      = input->external_ti_ranges[ts_idx];\n\n  // hash leaves referenced in symbols\n  for (U64 i = 0; i < parsed_symbols.count; ++i) {\n    CV_SymbolList symbol_list = parsed_symbols.v[i];\n    for (CV_SymbolNode *symnode = symbol_list.first; symnode != 0; symnode = symnode->next) {\n      Temp temp = temp_begin(task->fixed_arenas[worker_id]);\n      CV_TypeIndexInfoList ti_info_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data);\n      lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, symnode->data.data);\n      temp_end(temp);\n    }\n  }\n  \n  // hash leaves referenced in inlinees\n  String8List inline_data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines);\n  for (String8Node *inline_data_node = inline_data_list.first; inline_data_node != 0; inline_data_node = inline_data_node->next) {\n    Temp temp = temp_begin(task->fixed_arenas[worker_id]);\n    CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string);\n    lnk_hash_cv_leaf_deep(temp.arena, task->input, ti_ranges, leaves, hashes, LNK_LeafLocType_External, ts_idx, ti_info_list, inline_data_node->string);\n    temp_end(temp);\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_leaf_dedup_internal_task)\n{\n  LNK_LeafDedupInternal *task    = raw_task;\n  U64                    obj_idx = task_id;\n  CV_DebugT              debug_t = task->debug_t_arr[obj_idx];\n\n  ProfBeginDynamic(\"Leaf Dedup Task 0x%X [Leaf Count %u]\", obj_idx, task->debug_t_arr[obj_idx].count);\n  \n  LNK_LeafBucket *bucket = 0;\n  for (U64 leaf_idx = 0; leaf_idx < debug_t.count; ++leaf_idx) {\n    CV_LeafHeader     *leaf_header = cv_debug_t_get_leaf_header(debug_t, leaf_idx);\n    CV_TypeIndexSource ti_source   = cv_type_index_source_from_leaf_kind(leaf_header->kind);\n    LNK_LeafHashTable *leaf_ht     = &task->leaf_ht_arr[ti_source];\n\n    LNK_LeafRef leaf_ref  = lnk_obj_leaf_ref(obj_idx, leaf_idx);\n    U128        leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref);\n\n    if (bucket == 0) {\n      bucket = push_array_no_zero(arena, LNK_LeafBucket, 1);\n    }\n    bucket->leaf_ref = leaf_ref;\n\n    LNK_LeafBucket *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket);\n\n    if (inserted_or_updated != bucket) {\n      bucket = 0;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_leaf_dedup_external_task)\n{\n  ProfBeginFunction();\n\n  LNK_LeafDedupExternal *task   = raw_task;\n  U64                    ts_idx = task_id;\n\n  LNK_CodeViewInput *input      = task->input;\n  LNK_LeafHashTable *leaf_ht    = &task->leaf_ht_arr[task->dedup_ti_source];\n  U128Array          hashes     = task->hashes->external_hashes[ts_idx][task->dedup_ti_source];\n  U64                leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][task->dedup_ti_source]);\n\n  LNK_LeafBucket *bucket = 0;\n\n  for (U64 leaf_idx = 0; leaf_idx < leaf_count; ++leaf_idx) {\n    if (!MemoryIsZeroStruct(&hashes.v[leaf_idx])) { // :zero_hash_check\n      LNK_LeafRef leaf_ref  = lnk_ts_leaf_ref(task->dedup_ti_source, ts_idx, leaf_idx);\n      U128        leaf_hash = lnk_hash_from_leaf_ref(task->hashes, leaf_ref);\n\n      if (bucket == 0) {\n        bucket = push_array_no_zero(arena, LNK_LeafBucket, 1);\n      }\n      bucket->leaf_ref = leaf_ref;\n\n      LNK_LeafBucket *inserted_or_updated = lnk_leaf_hash_table_insert_or_update(leaf_ht, task->input, task->hashes, leaf_hash, bucket);\n\n      if (inserted_or_updated != bucket) {\n        bucket = 0;\n      }\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_count_present_buckets_task)\n{\n  ProfBeginFunction();\n  LNK_GetPresentBucketsTask *task = raw_task;\n  for (U64 bucket_idx = task->range_arr[task_id].min; bucket_idx < task->range_arr[task_id].max; ++bucket_idx) {\n    if (task->ht->bucket_arr[bucket_idx] != 0) {\n      task->count_arr[task_id] += 1;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_get_present_buckets_task)\n{\n  ProfBeginFunction();\n\n  LNK_GetPresentBucketsTask *task = raw_task;\n\n  Rng1U64            range  = task->range_arr[task_id];\n  U64                cursor = task->offset_arr[task_id];\n  LNK_LeafHashTable *ht     = task->ht;\n\n  for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) {\n    if (ht->bucket_arr[bucket_idx]) {\n      task->result.v[cursor++] = ht->bucket_arr[bucket_idx];\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal LNK_LeafBucketArray\nlnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_GetPresentBucketsTask task = {0};\n  task.ht                        = ht;\n  task.count_arr                 = push_array(scratch.arena, U64, tp->worker_count);\n  task.range_arr                 = tp_divide_work(scratch.arena, ht->cap, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_count_present_buckets_task, &task);\n\n  LNK_LeafBucketArray result;\n  result.count = sum_array_u64(tp->worker_count, task.count_arr);\n  result.v     = push_array_no_zero(arena, LNK_LeafBucket *, result.count);\n\n  task.result     = result;\n  task.offset_arr = offsets_from_counts_array_u64(scratch.arena, task.count_arr, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_get_present_buckets_task, &task);\n\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_leaf_ref_histo_task)\n{\n  ProfBeginFunction();\n\n  LNK_LeafRadixSortTask *task       = raw_task;\n  Rng1U64                range      = task->ranges[task_id];\n  U32                   *counts_ptr = task->counts_arr[task_id];\n\n  U32 loc_idx_bit_count_0 = task->loc_idx_bit_count_0;\n  U32 loc_idx_bit_count_1 = task->loc_idx_bit_count_1;\n  U32 loc_idx_bit_count_2 = task->loc_idx_bit_count_2;\n\n  MemoryZeroTyped(task->counts_arr[task_id], task->counts_max);\n\n  switch (task->pass_idx) {\n  case 0: {\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 leaf_digit0 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 10, 0);\n      ++counts_ptr[leaf_digit0];\n    }\n  } break;\n  case 1: {\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 leaf_digit1 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 10);\n      ++counts_ptr[leaf_digit1];\n    }\n  } break;\n  case 2: {\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 leaf_digit2 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag\n      ++counts_ptr[leaf_digit2];\n    }\n  } break;\n\n  case 3: {\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 digit0 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_0, 0);\n      ++counts_ptr[digit0];\n    }\n  } break;\n  case 4: {\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 digit1 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0);\n      ++counts_ptr[digit1];\n    }\n  } break;\n  case 5: {\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 digit2 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1);\n\n      U64 loc_bit = !!(bucket->leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal);\n      digit2 |= loc_bit << loc_idx_bit_count_2;\n\n      ++counts_ptr[digit2];\n    }\n  } break;\n  default: InvalidPath;\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_loc_idx_radix_sort_task)\n{\n  ProfBeginFunction();\n\n  LNK_LeafRadixSortTask *task                = raw_task;\n  Rng1U64                range               = task->ranges[task_id];\n  U32                   *counts_ptr          = task->counts_arr[task_id];\n  U32                    loc_idx_bit_count_0 = task->loc_idx_bit_count_0;\n  U32                    loc_idx_bit_count_1 = task->loc_idx_bit_count_1;\n  U32                    loc_idx_bit_count_2 = task->loc_idx_bit_count_2;\n\n  switch (task->pass_idx) {\n  //\n  // Sort items on leaf index\n  //\n  case 0: {\n    ProfBegin(\"Leaf Sort Low\");\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 leaf_digit0 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 10, 0);\n      task->dst[counts_ptr[leaf_digit0]++] = bucket;\n    }\n    ProfEnd();\n  } break;\n  case 1: {\n    ProfBegin(\"Leaf Sort Mid\");\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 leaf_digit1 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 10);\n      task->dst[counts_ptr[leaf_digit1]++] = bucket;\n    }\n    ProfEnd();\n  } break;\n  case 2: {\n    ProfBegin(\"Leaf Sort High\");\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 leaf_digit2 = BitExtract(bucket->leaf_ref.enc_leaf_idx, 11, 21 - 1); // don't take into account IPI flag\n      task->dst[counts_ptr[leaf_digit2]++] = bucket;\n    }\n    ProfEnd();\n  } break;\n\n  //\n  // Sort items on obj and type server index\n  //\n  case 3: {\n    ProfBegin(\"Loc Sort Low\");\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 digit0 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_0, 0);\n      task->dst[counts_ptr[digit0]++] = bucket;\n    }\n    ProfEnd();\n  } break;\n  case 4: {\n    ProfBegin(\"Loc Sort Mid\");\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 digit1 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_1, loc_idx_bit_count_0);\n      task->dst[counts_ptr[digit1]++] = bucket;\n    }\n    ProfEnd();\n  } break;\n  case 5: {\n    ProfBegin(\"Loc Sort High\");\n    for (U64 i = range.min; i < range.max; ++i) {\n      LNK_LeafBucket *bucket = task->src[i];\n      U64 digit2 = BitExtract(bucket->leaf_ref.enc_loc_idx, loc_idx_bit_count_2, loc_idx_bit_count_0 + loc_idx_bit_count_1);\n\n      U64 loc_bit = !!(bucket->leaf_ref.enc_loc_idx & LNK_LeafRefFlag_LocIdxExternal);\n      digit2 |= loc_bit << loc_idx_bit_count_2;\n\n      Assert(counts_ptr[digit2] != max_U32);\n      task->dst[counts_ptr[digit2]++] = bucket;\n    }\n    ProfEnd();\n  } break;\n\n  default: InvalidPath;\n  }\n\n  ProfEnd();\n}\n\ninternal void\nlnk_leaf_bucket_array_sort(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count)\n{\n  Temp scratch = scratch_begin(0,0);\n\n#if PROFILE_TELEMETRY\n  String8 leaf_count_string        = str8_from_count(scratch.arena, arr.count);\n  String8 obj_count_string         = str8_from_count(scratch.arena, obj_count);\n  String8 type_server_count_string = str8_from_count(scratch.arena, type_server_count);\n  ProfBeginDynamic(\"Leaf Sort [Leaf Count: %.*s, Obj Count: %.*s, Type Server Count: %.*s]\", str8_varg(leaf_count_string), str8_varg(obj_count_string), str8_varg(type_server_count_string));\n#endif\n\n  if (arr.count > 140000) {\n    ProfBegin(\"Radix\");\n\n    U32 loc_idx_max_bits = 32 - clz32(Max(obj_count, type_server_count));\n\n    LNK_LeafRadixSortTask task = {0};\n    task.loc_idx_bit_count_0   = Clamp(0, (S32)loc_idx_max_bits - 21, 11);\n    task.loc_idx_bit_count_1   = Clamp(0, (S32)loc_idx_max_bits - 10, 11);\n    task.loc_idx_bit_count_2   = Clamp(0, (S32)loc_idx_max_bits,      10);\n    task.counts_max            = (1 << 11);\n    task.loc_idx_max           = arr.count;\n    task.ranges                = tp_divide_work(scratch.arena, arr.count, tp->worker_count);\n    task.dst                   = push_array_no_zero(scratch.arena, LNK_LeafBucket *, arr.count);\n    task.src                   = arr.v;\n\n    ProfBegin(\"Push Counts\");\n    task.counts_arr = push_array_no_zero(scratch.arena, U32 *, tp->worker_count);\n    for (U64 i = 0; i < tp->worker_count; ++i) {\n      // zero-out happens in histogram step\n      task.counts_arr[i] = push_array_no_zero(scratch.arena, U32, task.counts_max);\n    }\n    ProfEnd();\n\n    for (task.pass_idx = 0; task.pass_idx < 6; ++task.pass_idx) {\n      ProfBeginDynamic(\"Pass: %u\", task.pass_idx);\n\n      ProfBegin(\"Histo\");\n      tp_for_parallel(tp, 0, tp->worker_count, lnk_leaf_ref_histo_task, &task);\n      ProfEnd();\n\n      B32 is_range_not_empty = 0;\n      for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) {\n        is_range_not_empty = task.counts_arr[task_id][0] != dim_1u64(task.ranges[task_id]);\n        if (is_range_not_empty) {\n          break;\n        }\n      }\n\n      ProfBegin(\"Counts -> Offsets\");\n      {\n        U64 digit_cursor = 0;\n        for (U64 digit_idx = 0; digit_idx < task.counts_max; ++digit_idx) {\n          for (U64 task_id = 0; task_id < tp->worker_count; ++task_id) {\n            U64 count = task.counts_arr[task_id][digit_idx];\n            task.counts_arr[task_id][digit_idx] = digit_cursor;\n            digit_cursor += count;\n          }\n        }\n        Assert(digit_cursor == arr.count);\n      }\n      ProfEnd();\n\n      ProfBegin(\"Sort\");\n      tp_for_parallel(tp, 0, tp->worker_count, lnk_loc_idx_radix_sort_task, &task);\n      Swap(LNK_LeafBucket **, task.src, task.dst);\n      ProfEnd();\n\n      ProfEnd();\n    }\n\n    if (task.src != arr.v) {\n      MemoryCopyTyped(arr.v, task.dst, arr.count);\n    }\n\n#if 0\n    for (U64 i = 1; i < arr.count; ++i) {\n      AssertAlways(arr.v[i-1]->leaf_ref.enc_loc_idx <= arr.v[i]->leaf_ref.enc_loc_idx);\n      if (arr.v[i-1]->leaf_ref.enc_loc_idx == arr.v[i]->leaf_ref.enc_loc_idx) {\n        AssertAlways(arr.v[i-1]->leaf_ref.enc_leaf_idx <= arr.v[i]->leaf_ref.enc_leaf_idx);\n      }\n    }\n#endif\n\n    ProfEnd();\n  } else {\n    ProfBegin(\"Radsort\");\n    radsort(arr.v, arr.count, lnk_leaf_ref_is_before);\n    ProfEnd();\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_assign_type_indices_task)\n{\n  LNK_AssignTypeIndicesTask *task  = raw_task;\n  Rng1U64                    range = task->range_arr[task_id];\n  for (U64 i = range.min; i < range.max; ++i) {\n    LNK_LeafBucket *bucket = task->bucket_arr.v[i];\n    bucket->type_index = task->min_type_index + i;\n  }\n}\n\ninternal void\nlnk_assign_type_indices(TP_Context *tp, LNK_LeafBucketArray bucket_arr, CV_TypeIndex min_type_index)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_AssignTypeIndicesTask task;\n  task.range_arr      = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count);\n  task.bucket_arr     = bucket_arr;\n  task.min_type_index = min_type_index;\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_assign_type_indices_task, &task);\n\n  ProfEnd();\n  scratch_end(scratch);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_symbols_task)\n{\n  ProfBeginFunction();\n  LNK_PatchSymbolTypesTask *task         = raw_task;\n  Arena                    *fixed_arena  = task->arena_arr[task_id];\n\n  for EachInRange(symbol_input_idx, task->ranges[task_id]) {\n    LNK_CodeViewSymbolsInput symbol_input = task->input->symbol_inputs[symbol_input_idx];\n    LNK_LeafLocType          loc_type     = lnk_loc_type_from_obj_idx(task->input, symbol_input.obj_idx);\n    U64                      loc_idx      = lnk_loc_idx_from_obj_idx(task->input, symbol_input.obj_idx);\n\n    CV_TypeIndex ti_lo_arr[CV_TypeIndexSource_COUNT];\n    ti_lo_arr[CV_TypeIndexSource_NULL] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_NULL);\n    ti_lo_arr[CV_TypeIndexSource_TPI ] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_TPI);\n    ti_lo_arr[CV_TypeIndexSource_IPI ] = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, CV_TypeIndexSource_IPI);\n\n    for (CV_SymbolNode *symnode = symbol_input.symbol_list->first; symnode != 0; symnode = symnode->next) {\n      Temp temp = temp_begin(fixed_arena);\n\n      // find type index offsets in symbol\n      CV_TypeIndexInfoList ti_list = cv_get_symbol_type_index_offsets(temp.arena, symnode->data.kind, symnode->data.data);\n\n      // overwrite type indices in symbol\n      for (CV_TypeIndexInfo *ti_info = ti_list.first; ti_info != 0; ti_info = ti_info->next) {\n        CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (symnode->data.data.str + ti_info->offset);\n        if (*ti_ptr >= ti_lo_arr[ti_info->source]) {\n          LNK_LeafHashTable *leaf_ht     = &task->leaf_ht_arr[ti_info->source];\n          LNK_LeafRef        leaf_ref    = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr);\n          LNK_LeafBucket    *leaf_bucket = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, leaf_ref);\n\n          // we overwrite section memory directly\n          *ti_ptr = leaf_bucket->type_index;\n        }\n      }\n\n      temp_end(temp);\n    }\n  }\n  ProfEnd();\n}\n\ninternal void\nlnk_patch_symbols(TP_Context         *tp,\n                  LNK_CodeViewInput  *input,\n                  LNK_LeafHashes     *hashes,\n                  LNK_LeafHashTable  *leaf_ht_arr)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  U64 max_ti_list_size = sizeof(CV_TypeIndexInfo) * (max_U16 / sizeof(CV_TypeIndex));\n\n  LNK_PatchSymbolTypesTask task = {0};\n  task.ranges          = tp_divide_work(scratch.arena, input->total_symbol_input_count, tp->worker_count);\n  task.input           = input;\n  task.hashes          = hashes;\n  task.leaf_ht_arr     = leaf_ht_arr;\n  task.arena_arr       = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, max_ti_list_size, max_ti_list_size);\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_patch_symbols_task, &task);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_inlines_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n\n  LNK_PatchInlinesTask *task = raw_task;\n\n  U64             loc_idx          = lnk_loc_idx_from_obj_idx(task->input, task_id);\n  LNK_LeafLocType loc_type         = lnk_loc_type_from_obj_idx(task->input, task_id);\n  String8List     inline_data_list = cv_sub_section_from_debug_s(task->debug_s_arr[task_id], CV_C13SubSectionKind_InlineeLines);\n\n  for (String8Node *inline_data_node = inline_data_list.first; inline_data_node != 0; inline_data_node = inline_data_node->next) {\n    Temp temp = temp_begin(scratch.arena);\n\n    // get indices offsets\n    CV_TypeIndexInfoList ti_info_list = cv_get_inlinee_type_index_offsets(temp.arena, inline_data_node->string);\n\n    for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) {\n      CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (inline_data_node->string.str + ti_info->offset);\n      CV_TypeIndex  ti_lo  = lnk_ti_lo_from_loc(task->input, loc_type, loc_idx, ti_info->source);\n      if (*ti_ptr >= ti_lo) {\n        LNK_LeafRef     leaf_ref    = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr);\n        LNK_LeafBucket *leaf_bucket = lnk_leaf_hash_table_search(&task->leaf_ht_arr[ti_info->source], task->input, task->hashes, leaf_ref);\n        \n        // patch index\n        *ti_ptr = leaf_bucket->type_index;\n      }\n    }\n\n    temp_end(temp);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nlnk_patch_inlines(TP_Context         *tp,\n                  LNK_CodeViewInput  *input,\n                  LNK_LeafHashes     *hashes,\n                  LNK_LeafHashTable  *leaf_ht_arr,\n                  U64                 obj_count,\n                  CV_DebugS          *debug_s_arr)\n{\n  ProfBeginFunction();\n  \n  LNK_PatchInlinesTask task = {0};\n  task.input       = input;\n  task.hashes      = hashes;\n  task.leaf_ht_arr = leaf_ht_arr;\n  task.debug_s_arr = debug_s_arr;\n  tp_for_parallel(tp, 0, obj_count, lnk_patch_inlines_task, &task);\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_patch_leaves_task)\n{\n  ProfBeginFunction();\n\n  LNK_PatchLeavesTask *task  = raw_task;\n  Rng1U64              range = task->range_arr[task_id];\n\n  for (U64 bucket_idx = range.min; bucket_idx < range.max; ++bucket_idx) {\n    Temp temp = temp_begin(task->fixed_arena_arr[task_id]);\n\n    LNK_LeafBucket *bucket = task->bucket_arr[bucket_idx];\n\n    U64             loc_idx  = bucket->leaf_ref.enc_loc_idx & ~LNK_LeafRefFlag_LocIdxExternal;\n    LNK_LeafLocType loc_type = lnk_loc_type_from_leaf_ref(bucket->leaf_ref);\n    CV_TypeIndex    ti_lo    = lnk_ti_lo_from_leaf_ref(task->input, bucket->leaf_ref);\n    String8         raw_leaf = lnk_data_from_leaf_ref(task->input, bucket->leaf_ref);\n    CV_Leaf         leaf     = cv_leaf_from_string(raw_leaf);\n\n    // get type indices offsets\n    CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf.kind, leaf.data);\n    for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) {\n      CV_TypeIndex *ti_ptr = (CV_TypeIndex *) (leaf.data.str + ti_info->offset);\n      if (*ti_ptr >= ti_lo) {\n        LNK_LeafHashTable *leaf_ht         = &task->leaf_ht_arr[ti_info->source];\n        LNK_LeafRef        sub_leaf_ref    = lnk_leaf_ref_from_loc_idx_and_ti(task->input, loc_type, ti_info->source, loc_idx, *ti_ptr);\n        LNK_LeafBucket    *sub_leaf_bucket = lnk_leaf_hash_table_search(leaf_ht, task->input, task->hashes, sub_leaf_ref);\n\n         // patch index\n        *ti_ptr = sub_leaf_bucket->type_index;\n      }\n    }\n\n    temp_end(temp);\n  }\n\n  ProfEnd();\n}\n\ninternal void\nlnk_patch_leaves(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, LNK_LeafBucketArray bucket_arr)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_PatchLeavesTask task;\n  task.input           = input;\n  task.hashes          = hashes;\n  task.leaf_ht_arr     = leaf_ht_arr;\n  task.bucket_arr      = bucket_arr.v;\n  task.range_arr       = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count);\n  task.fixed_arena_arr = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, MB(1), MB(1));\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_patch_leaves_task, &task);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_unbucket_raw_leaves_task)\n{\n  LNK_UnbucketRawLeavesTask *task  = raw_task;\n  Rng1U64                    range = task->range_arr[task_id];\n  for (U64 i = range.min; i < range.max; ++i) {\n    String8 raw_leaf = lnk_data_from_leaf_ref(task->input, task->bucket_arr[i]->leaf_ref);\n    task->raw_leaf_arr[i] = raw_leaf.str;\n  }\n}\n\ninternal CV_DebugT\nlnk_unbucket_leaf_array(TP_Context *tp, Arena *arena, LNK_CodeViewInput *input, LNK_LeafBucketArray bucket_arr)\n{\n  ProfBeginDynamic(\"Unbucket Leaves [Count %llu]\", bucket_arr.count);\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_UnbucketRawLeavesTask task = {0};\n  task.input        = input;\n  task.bucket_arr   = bucket_arr.v;\n  task.raw_leaf_arr = push_array_no_zero(arena, U8 *, bucket_arr.count);\n  task.range_arr    = tp_divide_work(scratch.arena, bucket_arr.count, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_unbucket_raw_leaves_task, &task);\n\n  CV_DebugT debug_t = {0};\n  debug_t.count = bucket_arr.count;\n  debug_t.v     = task.raw_leaf_arr;\n\n  scratch_end(scratch);\n  ProfEnd();\n  return debug_t;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_post_process_cv_symbols_task)\n{\n  LNK_PostProcessCvSymbolsTask *task         = raw_task;\n  LNK_CodeViewSymbolsInput      symbol_input = task->symbol_inputs[task_id];\n\n  for (CV_SymbolNode *symnode = symbol_input.symbol_list->first; symnode != 0; symnode = symnode->next) {\n    CV_Symbol *symbol = &symnode->data;\n\n    if (symbol->kind == CV_SymKind_LPROC32_ID || symbol->kind == CV_SymKind_GPROC32_ID || symbol->kind == CV_SymKind_LPROC32_DPC) {\n      CV_SymProc32 *proc32 = (CV_SymProc32 *) symbol->data.str;\n      if (proc32->itype >= task->ipi_min_type_index) {\n        if ((proc32->itype - task->ipi_min_type_index) < task->ipi_types.count) {\n          U64     leaf_idx = proc32->itype - task->ipi_min_type_index;\n          CV_Leaf leaf     = cv_debug_t_get_leaf(task->ipi_types, leaf_idx);\n\n          if (leaf.kind == CV_LeafKind_FUNC_ID) {\n            if (leaf.data.size >= sizeof(CV_LeafFuncId)) {\n              proc32->itype = ((CV_LeafFuncId *) leaf.data.str)->itype;\n            } else {\n              Assert(!\"TODO: error handle corrupt leaf\");\n            }\n          } else if (leaf.kind == CV_LeafKind_MFUNC_ID) {\n            if (leaf.data.size >= sizeof(CV_LeafMFuncId)) {\n              proc32->itype = ((CV_LeafMFuncId *) leaf.data.str)->itype;\n            } else {\n              Assert(!\"TODO: error handle corrupt leaf\");\n            }\n          } else {\n            Assert(!\"TODO: erorr handle unexpected leaf type\");\n          }\n        } else {\n          Assert(\"TODO: error handle corrupted type index\");\n        }\n      } else {\n        // TODO: in some cases destructors don't have a type, need a repro\n      }\n    }\n\n    // convert symbol to final type\n    switch (symbol->kind) {\n    case CV_SymKind_LPROC32_ID:     symbol->kind = CV_SymKind_LPROC32;     break;\n    case CV_SymKind_GPROC32_ID:     symbol->kind = CV_SymKind_GPROC32;     break;\n    case CV_SymKind_LPROC32_DPC_ID: symbol->kind = CV_SymKind_LPROC32_DPC; break;\n    case CV_SymKind_LPROCMIPS_ID:   symbol->kind = CV_SymKind_LPROCMIPS;   break;\n    case CV_SymKind_GPROCMIPS_ID:   symbol->kind = CV_SymKind_GPROCMIPS;   break;\n    case CV_SymKind_LPROCIA64_ID:   symbol->kind = CV_SymKind_LPROCIA64;   break;\n    case CV_SymKind_GPROCIA64_ID:   symbol->kind = CV_SymKind_GPROCIA64;   break;\n    case CV_SymKind_PROC_ID_END:    symbol->kind = CV_SymKind_END;         break;\n    }\n  }\n}\n\ninternal CV_DebugT *\nlnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input)\n{\n  ProfBegin(\"Import Types\");\n\n  ProfBegin(\"Hash Leaves\");\n  LNK_LeafHashes *hashes = push_array(tp_temp->v[0], LNK_LeafHashes, 1);\n  {\n    Temp scratch = scratch_begin(tp_temp->v, tp_temp->count);\n\n    // push internal hash arrays\n    //\n    // TPI and IPI leaves in .debug$T are stored in one array (we don't move them\n    // to respective arrays before this point to save on memory move)\n    ProfBegin(\"Push Internal Hash Arrays\");\n    hashes->internal_hashes = push_array_no_zero(tp_temp->v[0], U128Array *, input->internal_count);\n    for (U64 obj_idx = 0; obj_idx < input->internal_count; ++obj_idx) {\n      CV_DebugT debug_t = input->merged_debug_t_p_arr[obj_idx];\n\n      U128Array arr = {0};\n      arr.count     = debug_t.count;\n      arr.v         = push_array_no_zero(tp_temp->v[0], U128, debug_t.count);\n      // :debug_zero_hash_assert\n#if BUILD_DEBUG\n      MemoryZeroTyped(arr.v, arr.count);\n#endif\n\n      hashes->internal_hashes[obj_idx] = push_array(tp_temp->v[0], U128Array, CV_TypeIndexSource_COUNT);\n      for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) {\n        hashes->internal_hashes[obj_idx][ti_source] = arr;\n      }\n    }\n    ProfEnd();\n\n    // push external hash arrays\n    ProfBegin(\"Push External Hash Arrays\");\n    hashes->external_hashes = push_array_no_zero(tp_temp->v[0], U128Array *, input->type_server_count);\n    for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) {\n      hashes->external_hashes[ts_idx] = push_array_no_zero(tp_temp->v[0], U128Array, CV_TypeIndexSource_COUNT);\n      for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) {\n        U64 leaf_count = dim_1u64(input->external_ti_ranges[ts_idx][ti_source]);\n        hashes->external_hashes[ts_idx][ti_source].count = leaf_count;\n        hashes->external_hashes[ts_idx][ti_source].v     = push_array(tp_temp->v[0], U128, leaf_count); // :zero_hash_check\n      }\n    }\n    ProfEnd();\n\n    LNK_LeafHasherTask task = {0};\n    task.input        = input;\n    task.hashes       = hashes;\n    task.fixed_arenas = alloc_fixed_size_arena_array(scratch.arena, tp->worker_count, MB(1), MB(1));\n\n    // hash .debug$P first so we can mix in hashes for precompiled sub leaves when hashing leaves in .debug$T\n    ProfBeginDynamic(\"Hash .debug$P [Count: %llu]\", input->internal_count);\n    task.debug_t_arr = input->internal_debug_p_arr;\n    tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task);\n    ProfEnd();\n\n#if PROFILE_TELEMETRY\n    String8 count_string = str8_from_count(scratch.arena, input->internal_count);\n    ProfBegin(\"Hash .debug$T [Count: %.*s]\", str8_varg(count_string));\n#endif\n    task.debug_t_arr = input->internal_debug_t_arr;\n    tp_for_parallel(tp, 0, input->internal_count, lnk_hash_debug_t_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Hash Type Server Leaves [Count: %.*s]\", str8_varg(count_string));\n    tp_for_parallel(tp, 0, input->external_count, lnk_hash_type_server_leaves_task, &task);\n    ProfEnd();\n\n    scratch_end(scratch);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Leaf Hash Table Init\");\n  LNK_LeafHashTable leaf_ht_arr[CV_TypeIndexSource_COUNT] = { 0 };\n  U64 internal_per_source_count[CV_TypeIndexSource_COUNT] = { 0 };\n  U64 external_per_source_count[CV_TypeIndexSource_COUNT] = { 0 };\n  {\n    // count internal leaves\n    lnk_cv_debug_t_count_leaves_per_source(tp, input->internal_count, input->internal_debug_p_arr, internal_per_source_count);\n    lnk_cv_debug_t_count_leaves_per_source(tp, input->internal_count, input->internal_debug_t_arr, internal_per_source_count);\n\n    // count external leaves\n    for (U64 ts_idx = 0; ts_idx < input->type_server_count; ++ts_idx) {\n      for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) {\n        external_per_source_count[ti_source] += dim_1u64(input->external_ti_ranges[ts_idx][ti_source]);\n      }\n    }\n\n    // push buckets per source\n    for (U64 ti_source = 0; ti_source < CV_TypeIndexSource_COUNT; ++ti_source) {\n      U64 bucket_cap = 0;\n      bucket_cap += internal_per_source_count[ti_source];\n      bucket_cap += external_per_source_count[ti_source];\n      bucket_cap  = (U64) ((F64) bucket_cap * 1.3);\n\n      #if PROFILE_TELEMETRY\n      tmMessage(0, TMMF_ICON_NOTE, \"%.*s Bucket Count: %llu\", str8_varg(cv_string_from_type_index_source(ti_source)), bucket_cap);\n      #endif\n\n      leaf_ht_arr[ti_source].cap        = bucket_cap;\n      leaf_ht_arr[ti_source].bucket_arr = push_array(tp_temp->v[0], LNK_LeafBucket *, bucket_cap);\n    }\n  }\n  ProfEnd();\n\n#if PROFILE_TELEMETRY\n  String8 obj_count_string = str8_from_count(tp_temp->v[0], input->internal_count);\n  String8 tpi_count_string = str8_from_count(tp_temp->v[0], internal_per_source_count[CV_TypeIndexSource_TPI]);\n  String8 ipi_count_string = str8_from_count(tp_temp->v[0], internal_per_source_count[CV_TypeIndexSource_IPI]);\n  ProfBeginDynamic(\"Internal Leaf Dedup [Obj Count: %.*s, TPI: %.*s, IPI: %.*s]\",\n                           str8_varg(obj_count_string),\n                           str8_varg(tpi_count_string),\n                           str8_varg(ipi_count_string));\n#endif\n  {\n\n    LNK_LeafDedupInternal task;\n    task.input       = input;\n    task.hashes      = hashes;\n    task.leaf_ht_arr = leaf_ht_arr;\n\n    ProfBegin(\"Dedup .debug$P\");\n    task.debug_t_arr = input->internal_debug_p_arr;\n    tp_for_parallel(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Dedup .debug$T\");\n    task.debug_t_arr = input->internal_debug_t_arr;\n    tp_for_parallel(tp, tp_temp, input->internal_count, lnk_leaf_dedup_internal_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBeginDynamic(\"External Leaf Import [Type Server Count: %llu, Dependent Obj Count: %llu]\", input->type_server_count, input->external_count);\n  {\n    LNK_LeafDedupExternal task = {0};\n    task.input                 = input;\n    task.hashes                = hashes;\n    task.leaf_ht_arr           = leaf_ht_arr;\n\n    ProfBeginDynamic(\"Dedup TPI [Leaf Count %llu]\", external_per_source_count[CV_TypeIndexSource_TPI]);\n    task.dedup_ti_source = CV_TypeIndexSource_TPI;\n    tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task);\n    ProfEnd();\n\n    ProfBeginDynamic(\"Dedup IPI [Leaf Count %llu]\", external_per_source_count[CV_TypeIndexSource_IPI]);\n    task.dedup_ti_source = CV_TypeIndexSource_IPI;\n    tp_for_parallel(tp, tp_temp, input->type_server_count, lnk_leaf_dedup_external_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  // extract present buckets from the hash tables\n  LNK_LeafBucketArray tpi_arr = lnk_present_bucket_array_from_leaf_hash_table(tp, tp_temp->v[0], &leaf_ht_arr[CV_TypeIndexSource_TPI]);\n  LNK_LeafBucketArray ipi_arr = lnk_present_bucket_array_from_leaf_hash_table(tp, tp_temp->v[0], &leaf_ht_arr[CV_TypeIndexSource_IPI]);\n\n  // sort output leaves based on { location index, leaf index } to guarantee determinism\n  lnk_leaf_bucket_array_sort(tp, ipi_arr, input->internal_count, input->type_server_count);\n  lnk_leaf_bucket_array_sort(tp, tpi_arr, input->internal_count, input->type_server_count);\n\n  // assign type indices to each bucket\n  lnk_assign_type_indices(tp, tpi_arr, CV_MinComplexTypeIndex);\n  lnk_assign_type_indices(tp, ipi_arr, CV_MinComplexTypeIndex);\n\n  // patch indices in symbols, inline sites, and leaves\n  lnk_patch_symbols(tp, input, hashes, leaf_ht_arr);\n  lnk_patch_inlines(tp, input, hashes, leaf_ht_arr, input->count, input->debug_s_arr);\n  lnk_patch_leaves(tp, input, hashes, leaf_ht_arr, tpi_arr);\n  lnk_patch_leaves(tp, input, hashes, leaf_ht_arr, ipi_arr);\n\n  CV_DebugT tpi_types = lnk_unbucket_leaf_array(tp, tp_temp->v[0], input, tpi_arr);\n  CV_DebugT ipi_types = lnk_unbucket_leaf_array(tp, tp_temp->v[0], input, ipi_arr);\n\n  ProfBegin(\"Post Process CV Symbols\");\n  {\n    LNK_PostProcessCvSymbolsTask task = {0};\n    task.ipi_min_type_index           = CV_MinComplexTypeIndex;\n    task.ipi_types                    = ipi_types;\n    task.symbol_inputs                = input->symbol_inputs;\n    task.parsed_symbols               = input->parsed_symbols;\n    tp_for_parallel(tp, 0, input->total_symbol_input_count, lnk_post_process_cv_symbols_task, &task);\n  }\n  ProfEnd();\n\n  CV_DebugT *types = push_array(tp_temp->v[0], CV_DebugT, CV_TypeIndexSource_COUNT);\n  types[CV_TypeIndexSource_TPI] = tpi_types;\n  types[CV_TypeIndexSource_IPI] = ipi_types;\n\n  ProfEnd();\n  return types;\n}\n\ninternal U64\nlnk_format_u128(U8 *buf, U64 buf_max, U64 length, U128 v)\n{\n  U64 size = 0;\n  if (length > 0 && buf_max > 0) {\n    if (length <= 8) {\n      U64 mask = length == 8 ? max_U64 : (1ull << (length*8)) - 1;\n      size = raddbg_snprintf((char*)buf, buf_max - 1, \"%llX\", (long long)(v.u64[0] & mask));\n    } else {\n      U64 mask1 = length == 16 ? max_U64 : (1ull << ((length-8)*8)) - 1;\n      size = raddbg_snprintf((char*)buf, buf_max, \"%llX%llX\", (long long)(v.u64[1] & mask1), (long long)v.u64[0]);\n    }\n  }\n  return size;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_lenient_task)\n{\n  ProfBeginFunction();\n\n  LNK_TypeNameReplacer *task        = raw_task;\n  Rng1U64               range       = task->ranges[task_id];\n  CV_DebugT             debug_t     = task->debug_t;\n  U64                   hash_length = task->hash_length;\n\n  B32          make_map  = task->make_map;\n  Arena       *map_arena = 0;\n  String8List *map       = 0;\n  if (make_map) {\n    map_arena = task->map_arena->v[task_id];\n    map       = &task->maps[task_id];\n  }\n\n  U64 hash_max_chars = hash_length*2;\n  U8  temp[128];\n\n  for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx);\n    if (leaf.kind == CV_LeafKind_STRUCTURE || leaf.kind == CV_LeafKind_CLASS) {\n      CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n\n      if ((udt_info.props & CV_TypeProp_HasUniqueName) &&\n           udt_info.unique_name.size > hash_max_chars &&\n           udt_info.name.size > hash_max_chars) {\n        // hash unique name\n        U128 name_hash;\n        blake3_hasher hasher; blake3_hasher_init(&hasher);\n        blake3_hasher_update(&hasher, udt_info.unique_name.str, udt_info.unique_name.size);\n        blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash));\n\n        // emit hash -> unique name map\n        if (make_map) {\n          lnk_format_u128(temp, sizeof(temp), hash_length, name_hash);\n          str8_list_pushf(map_arena, map, \"%s %S\\n\", temp, str8_varg(udt_info.unique_name));\n        }\n\n        // parse leaf size\n        CV_NumericParsed dummy;\n        U64 numeric_size = cv_read_numeric(leaf.data, sizeof(CV_LeafStruct), &dummy);\n\n        String8 lambda_prefix = str8_lit(\"<lambda_\");\n        U64     colon_pos     = str8_find_needle_reverse(udt_info.name, 0, lambda_prefix, 0);\n        B32     is_lambda     = colon_pos != 0;\n\n        if (is_lambda) {\n          U64 size = lnk_format_u128(temp, sizeof(temp), hash_length, name_hash);\n          Assert(size < udt_info.name.size);\n          Assert(size < udt_info.unique_name.size);\n          MemoryCopy(udt_info.name.str, temp, size+1);\n          MemoryCopy(udt_info.name.str+size+1, temp, size+1);\n          udt_info.name.size        = size;\n          udt_info.unique_name.size = size;\n\n          // update leaf header\n          CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx);\n          header->size          = sizeof(CV_LeafKind) +\n                                  sizeof(CV_LeafStruct) +\n                                  numeric_size +\n                                  udt_info.name.size + 1 +\n                                  udt_info.unique_name.size + 1;\n        } else {\n          // replace uniuqe type name with hash\n          udt_info.unique_name.str  = udt_info.name.str + udt_info.name.size + 1;\n          udt_info.unique_name.size = lnk_format_u128(udt_info.unique_name.str, udt_info.unique_name.size, hash_length, name_hash);\n\n          // update leaf header\n          CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx);\n          header->size          = sizeof(CV_LeafKind) +\n                                  sizeof(CV_LeafStruct) +\n                                  numeric_size +\n                                  udt_info.name.size + 1 +\n                                  udt_info.unique_name.size + 1;\n        }\n      }\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_replace_type_names_with_hashes_full_task)\n{\n  ProfBeginFunction();\n\n  LNK_TypeNameReplacer *task        = raw_task;\n  Rng1U64               range       = task->ranges[task_id];\n  CV_DebugT             debug_t     = task->debug_t;\n  U64                   hash_length = task->hash_length;\n\n  B32          make_map  = task->make_map;\n  Arena       *map_arena = 0;\n  String8List *map       = 0;\n  if (make_map) {\n    map_arena = task->map_arena->v[task_id];\n    map       = &task->maps[task_id];\n  }\n\n  U64 hash_max_chars = hash_length*2;\n  U8  temp[128];\n\n  for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx);\n    if (leaf.kind == CV_LeafKind_STRUCTURE || leaf.kind == CV_LeafKind_CLASS) {\n      CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n\n      if (udt_info.name.size > hash_max_chars) {\n        // pick name to hash\n        String8 name;\n        if (udt_info.props & CV_TypeProp_HasUniqueName) {\n          name = udt_info.unique_name;\n        } else {\n          name = udt_info.name;\n        }\n\n        // hash name\n        U128 name_hash;\n        blake3_hasher hasher; blake3_hasher_init(&hasher);\n        blake3_hasher_update(&hasher, udt_info.name.str, udt_info.name.size);\n        blake3_hasher_finalize(&hasher, (U8*)&name_hash, sizeof(name_hash));\n\n        // emit hash -> name map\n        if (make_map) {\n          lnk_format_u128(temp, sizeof(temp), hash_length, name_hash);\n          str8_list_pushf(map_arena, map, \"%s %.*s\\n\", temp, str8_varg(name));\n        }\n\n        // replace name with hash\n        udt_info.name.size = lnk_format_u128(udt_info.name.str, udt_info.name.size, hash_length, name_hash);\n\n        // parse struct size\n        CV_NumericParsed dummy;\n        U64 numeric_size = cv_read_numeric(leaf.data, sizeof(CV_LeafStruct), &dummy);\n\n        // update header\n        CV_LeafHeader *header = cv_debug_t_get_leaf_header(debug_t, leaf_idx);\n        header->size          = sizeof(CV_LeafKind) + sizeof(CV_LeafStruct) + numeric_size + udt_info.name.size + 1;\n\n        // discard unique name\n        CV_LeafStruct *lf = (CV_LeafStruct *)(header + 1);\n        lf->props &= ~CV_TypeProp_HasUniqueName;\n      }\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal void\nlnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  // init task context\n  LNK_TypeNameReplacer task = {0};\n  task.debug_t              = debug_t;\n  task.ranges               = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count);\n  task.hash_length          = Clamp(1, hash_length, 16);\n\n  if (map_name.size > 0) {\n    task.make_map  = 1;\n    task.map_arena = tp_arena_alloc(tp);\n    task.maps      = push_array(scratch.arena, String8List, tp->worker_count);\n  }\n\n  // pick task function\n  TP_TaskFunc *func = 0;\n  switch (mode) {\n  case LNK_TypeNameHashMode_Null: \n  case LNK_TypeNameHashMode_None:\n    break;\n\n  case LNK_TypeNameHashMode_Lenient: func = lnk_replace_type_names_with_hashes_lenient_task; break;\n  case LNK_TypeNameHashMode_Full:    func = lnk_replace_type_names_with_hashes_full_task;    break;\n  }\n\n  // run task\n  tp_for_parallel(tp, arena, tp->worker_count, func, &task);\n\n  // optionally write out map file \n  if (task.make_map) {\n    String8List map = {0};\n    str8_list_concat_in_place_array(&map, task.maps, tp->worker_count);\n    lnk_write_data_list_to_file_path(map_name, str8_zero(), map);\n    tp_arena_release(&task.map_arena);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_filter_out_gsi_symbols_task)\n{\n  U64                         obj_idx        = task_id;\n  LNK_ProcessSymDataTaskData *task           = raw_task;\n  CV_SymbolList              *gsi_list       = &task->gsi_list_arr[obj_idx];\n  CV_SymbolListArray          parsed_symbols = task->parsed_symbols[obj_idx];\n\n  CV_SymbolList global_list  = {0};\n  CV_SymbolList typedef_list = {0};\n  for (U64 i = 0; i < parsed_symbols.count; ++i) {\n    CV_SymbolList *list = &parsed_symbols.v[i];\n    U64 depth = 0;\n    for (CV_SymbolNode *curr = list->first, *next; curr != 0; curr = next) {\n      next = curr->next;\n\n      if (cv_is_global_symbol(curr->data.kind)) {\n        cv_symbol_list_remove_node(list, curr);\n        cv_symbol_list_push_node(&global_list, curr);\n      } else if (cv_is_typedef(curr->data.kind)) {\n        if (depth == 0) {\n          cv_symbol_list_remove_node(list, curr);\n          cv_symbol_list_push_node(&typedef_list, curr);\n        }\n      }\n      // Undocumented symbol that appears only in objs.\n      //  MSVC removes these symbols from output.\n      //\n      //  LLD-link replaces symbol with S_SKIP:\n      //  https://github.com/llvm/llvm-project/blob/main/lld/COFF/PDB.cpp#L575\n      else if (curr->data.kind == 0x1176) {\n        cv_symbol_list_remove_node(list, curr);\n      }\n\n      if (cv_is_scope_symbol(curr->data.kind)) {\n        ++depth;\n      } else if (cv_is_end_symbol(curr->data.kind)) {\n        Assert(depth > 0);\n        --depth;\n      }\n    }\n  }\n \n  // collect GSI symbols\n  Assert(gsi_list->count == 0);\n  cv_symbol_list_concat_in_place(gsi_list, &global_list);\n  cv_symbol_list_concat_in_place(gsi_list, &typedef_list);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_make_proc_refs_task)\n{\n  ProfBeginFunction();\n\n  U64                         obj_idx        = task_id;\n  LNK_ProcessSymDataTaskData *task           = raw_task;\n  PDB_DbiModule              *mod            = task->mod_arr[obj_idx];\n  CV_SymbolList              *gsi_list       = &task->gsi_list_arr[obj_idx];\n  CV_SymbolListArray          parsed_symbols = task->parsed_symbols[obj_idx];\n\n  for (U64 i = 0; i < parsed_symbols.count; ++i) {\n    CV_SymbolList list      = parsed_symbols.v[i];\n    CV_SymbolList proc_refs = cv_make_proc_refs(arena, mod->imod, list);\n    cv_symbol_list_concat_in_place(gsi_list, &proc_refs);\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_process_sym_data_task)\n{\n  ProfBeginFunction();\n\n  U64                         obj_idx        = task_id;\n  LNK_ProcessSymDataTaskData *task           = raw_task;\n  CV_SymbolListArray          parsed_symbols = task->parsed_symbols[obj_idx];\n\n  static CV_Signature MODULE_SYMBOL_SIGNATURE = CV_Signature_C13;\n\n  ProfBegin(\"Compute Buffer Size\");\n  U64 buffer_size = sizeof(MODULE_SYMBOL_SIGNATURE);\n  for (U64 i = 0; i < parsed_symbols.count; ++i) {\n    CV_SymbolList list = parsed_symbols.v[i];\n    U64 data_size = cv_patch_symbol_tree_offsets(list, buffer_size, PDB_SYMBOL_ALIGN);\n    buffer_size += data_size;\n  }\n  ProfEnd();\n\n  // alloc buffer\n  U8 *buffer        = push_array_no_zero(arena, U8, buffer_size);\n  U64 buffer_cursor = 0;\n\n  // MS Symbol and Type Information p.4:\n  //   \"The first four bytes of the $$SYMBOLS segment is used as a signature to specify the version of\n  //    the Symbol and Type OMF contained in the $$SYMBOLS segment.\"\n  CV_Signature *sig_ptr = (CV_Signature *) (buffer + buffer_cursor);\n  *sig_ptr = MODULE_SYMBOL_SIGNATURE;\n  buffer_cursor += sizeof(*sig_ptr);\n\n  ProfBegin(\"Serialize Symbols\");\n  for (U64 i = 0; i < parsed_symbols.count; ++i) {\n    CV_SymbolList list = parsed_symbols.v[i];\n    for (CV_SymbolNode *symbol_n = list.first; symbol_n != 0; symbol_n = symbol_n->next) {\n      symbol_n->data.offset = buffer_cursor;\n      buffer_cursor += cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, &symbol_n->data, PDB_SYMBOL_ALIGN);\n    }\n  }\n  ProfEnd();\n\n  // output\n  Assert(task->symbol_data_arr[obj_idx].total_size == 0);\n  str8_list_push(arena, &task->symbol_data_arr[obj_idx], str8(buffer, buffer_size));\n  \n  ProfEnd();\n}\n\ninternal LNK_ProcessedCodeViewC11Data\nlnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr)\n{\n  // TODO: handle c11 data\n  String8List *data_list_arr = push_array(arena->v[0], String8List, obj_count);\n  LNK_ProcessedCodeViewC11Data result;\n  result.data_list_arr = data_list_arr;\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_process_c13_data_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena,1);\n\n  U64                     obj_idx = task_id;\n  LNK_ProcessC13DataTask *task    = raw_task;\n  CV_DebugS               debug_s = task->debug_s_arr[obj_idx];\n\n  // parse checksum data\n  String8List     checksum_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms);\n  CV_ChecksumList checksum_list = cv_c13_parse_checksum_data_list(scratch.arena, checksum_data);\n\n  // get strings sub-section\n  String8 string_data = cv_string_table_from_debug_s(debug_s);\n\n  // collect source file names from checksum headers\n  String8List source_file_names_list = cv_c13_collect_source_file_names(arena, checksum_list, string_data);\n\n  // relocate checksum data \n  cv_c13_patch_string_offsets_in_checksum_list(checksum_list, string_data, task->string_data_base_offset, task->string_ht);\n\n  // get module sub-sections\n  PDB_DbiModule *mod          = task->dbi_mod_arr[obj_idx];\n  String8        mod_c13_data = dbi_module_read_c13_data(scratch.arena, task->msf, mod);\n  CV_DebugS      mod_debug_s  = cv_parse_debug_s_c13(scratch.arena, mod_c13_data);\n\n  // relocate line and frame data \n  String8List *mod_checksum_data        = cv_sub_section_ptr_from_debug_s(&mod_debug_s, CV_C13SubSectionKind_FileChksms);\n  U64          checksum_base            = mod_checksum_data->total_size;\n  B32          is_checksum_patch_needed = checksum_base > 0;\n  if (is_checksum_patch_needed) {\n    String8List line_data  = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines);\n    String8List frame_data = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FrameData);\n    cv_c13_patch_checksum_offsets_in_line_data_list(line_data, checksum_base);\n    cv_c13_patch_checksum_offsets_in_frame_data_list(frame_data, checksum_base);\n  }\n\n  // push obj c13 data to module\n  cv_debug_s_concat_in_place(&mod_debug_s, &debug_s);\n\n  // serialize c13 data\n  B32 include_sig = 0;\n  String8List c13_data = cv_data_c13_from_debug_s(arena, &mod_debug_s, include_sig);\n\n  // store for later pass\n  task->c13_data_arr[obj_idx]               = c13_data;\n  task->source_file_names_list_arr[obj_idx] = source_file_names_list;\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal LNK_ProcessedCodeViewC13Data\nlnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr)\n{\n  ProfBeginFunction();\n\n  LNK_ProcessC13DataTask task     = {0};\n  task.debug_s_arr                = debug_s_arr;\n  task.msf                        = msf;\n  task.dbi_mod_arr                = mod_arr;\n  task.c13_data_arr               = push_array_no_zero(arena->v[0], String8List, obj_count);\n  task.source_file_names_list_arr = push_array_no_zero(arena->v[0], String8List, obj_count);\n  task.string_data_base_offset    = string_data_base_offset;\n  task.string_ht                  = string_ht;\n  tp_for_parallel(tp, arena, obj_count, lnk_process_c13_data_task, &task);\n  \n  // fill out result\n  LNK_ProcessedCodeViewC13Data result = {0};\n  result.data_list_arr                = task.c13_data_arr;\n  result.source_file_names_list_arr   = task.source_file_names_list_arr;\n\n  ProfEnd();\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_write_module_data_task)\n{\n  U64 obj_idx = task_id;\n  LNK_WriteModuleDataTask *task = raw_task;\n\n  PDB_DbiModule *mod = task->mod_arr[obj_idx];\n  String8List sym_data = task->symbol_data_arr[obj_idx];\n  String8List c11_data = task->c11_data_list_arr[obj_idx];\n  String8List c13_data = task->c13_data_list_arr[obj_idx];\n  String8List globrefs = task->globrefs_arr[obj_idx];\n  \n  U32 sym_data_size32 = safe_cast_u32(sym_data.total_size);\n  U32 c11_data_size32 = safe_cast_u32(c11_data.total_size);\n  U32 c13_data_size32 = safe_cast_u32(c13_data.total_size);\n  U32 globrefs_size32 = safe_cast_u32(globrefs.total_size);\n  \n  // layout module data\n  String8List module_data = {0};\n  str8_list_concat_in_place(&module_data, &sym_data);\n  str8_list_concat_in_place(&module_data, &c11_data);\n  str8_list_concat_in_place(&module_data, &c13_data);\n  str8_list_concat_in_place(&module_data, &globrefs);\n\n  // make stream has enough memory so it doens't trigger memory allocations in MSF\n  // during multi-thread write\n  MSF_UInt stream_pos = msf_stream_get_pos(task->msf, mod->sn);\n  if (stream_pos != 0) {\n    Assert(!\"stream must be at start position\");\n  }\n  MSF_UInt stream_cap = msf_stream_get_cap(task->msf, mod->sn);\n  if (stream_cap < module_data.total_size) {\n    Assert(!\"not enough bytes in destination stream to copy module data\");\n  }\n  \n  // write data\n  B32 is_write_ok = msf_stream_write_list(task->msf, mod->sn, module_data);\n  \n  // update module data sizes\n  if (is_write_ok) {\n    mod->sym_data_size = sym_data_size32;\n    mod->c11_data_size = c11_data_size32;\n    mod->c13_data_size = c13_data_size32;\n    mod->globrefs_size = globrefs_size32;\n  } else {\n    // TODO: error handle\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_cv_symbol_ptr_array_hasher)\n{\n  LNK_CvSymbolPtrArrayHasher *task  = raw_task;\n  Rng1U64                     range = task->range_arr[task_id];\n  for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) {\n    task->hash_arr[symbol_idx] = XXH3_64bits(task->arr[symbol_idx]->data.data.str, task->arr[symbol_idx]->data.data.size);\n  }\n}\n\ninternal U64 *\nlnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_CvSymbolPtrArrayHasher task = {0};\n  task.hash_arr                   = push_array_no_zero(arena, U64, arr.count);\n  task.arr                        = arr.v;\n  task.range_arr = tp_divide_work(scratch.arena, arr.count, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, lnk_cv_symbol_ptr_array_hasher, &task);\n\n  scratch_end(scratch);\n  ProfEnd();\n  return task.hash_arr;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_push_dbi_sec_contrib_task)\n{\n  // TODO: use chunked lists for SC\n  // TODO: put back unused sc nodes\n  // TODO: compute CRC for relocations\n\n  U64                             obj_idx = task_id;\n  LNK_PushDbiSecContribTaskData  *task    = raw_task;\n  PDB_DbiModule                  *mod     = task->mod_arr[obj_idx];\n  LNK_Obj                        *obj     = task->obj_arr[obj_idx];\n\n  COFF_SectionHeader        *obj_section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  PDB_DbiSectionContribNode *sc_arr            = push_array_no_zero(arena, PDB_DbiSectionContribNode, obj->header.section_count_no_null);\n  U64                        sc_count          = 0;\n  \n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *obj_sect_header = &obj_section_table[sect_idx];\n\n    if (obj_sect_header->flags & COFF_SectionFlag_LnkInfo)   { continue; }\n    if (obj_sect_header->flags & COFF_SectionFlag_LnkRemove) { continue; }\n    if (obj_sect_header->flags & LNK_SECTION_FLAG_DEBUG)     { continue; }\n\n    U64     sect_number;\n    String8 sect_data;\n    U32     sect_off;\n    U32     data_crc;\n    if (obj_sect_header->flags & COFF_SectionFlag_CntUninitializedData) {\n      if (obj_sect_header->vsize == 0) {\n        continue;\n      }\n      sect_number = rng_1u64_array_bsearch(task->image_section_virt_ranges, obj_sect_header->voff);\n      Assert(sect_number < task->image_section_virt_ranges.count);\n      sect_data   = str8_zero();\n      sect_off    = obj_sect_header->voff - task->image_section_virt_ranges.v[sect_number].min;\n      data_crc    = 0;\n    } else {\n      if (obj_sect_header->fsize == 0) {\n        continue;\n      }\n      sect_number = rng_1u64_array_bsearch(task->image_section_file_ranges, obj_sect_header->foff);\n      Assert(sect_number < task->image_section_file_ranges.count);\n      sect_data   = str8_substr(task->image_data, rng_1u64(obj_sect_header->foff, obj_sect_header->foff + obj_sect_header->fsize));\n      sect_off    = obj_sect_header->foff - task->image_section_file_ranges.v[sect_number].min;\n      data_crc    = update_crc32(0, sect_data.str, sect_data.size);\n    }\n\n    // fill out SC\n    PDB_DbiSectionContribNode *sc = sc_arr + sc_count++;\n    sc->data.base.sec             = (U16)sect_number;\n    sc->data.base.pad0            = 0;\n    sc->data.base.sec_off         = sect_off;\n    sc->data.base.size            = obj_sect_header->vsize;\n    sc->data.base.flags           = obj_sect_header->flags;\n    sc->data.base.mod             = mod->imod;\n    sc->data.base.pad1            = 0;\n    sc->data.data_crc             = 0;\n    sc->data.reloc_crc            = 0; \n\n    dbi_sec_contrib_list_push_node(&task->sc_list[obj_idx], sc);\n  }\n\n  // Mod1::fUpdateSecContrib\n  if (sc_count > 0) {\n    for (U64 sc_idx = 0; sc_idx < sc_count; ++sc_idx) {\n      if (sc_arr[sc_idx].data.base.flags & COFF_SectionFlag_CntCode) {\n        mod->first_sc = sc_arr[sc_idx].data;\n        break;\n      }\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_build_pdb_public_symbols_defined_task)\n{\n  ProfBeginFunction();\n\n  LNK_BuildPublicSymbolsTask *task = raw_task;\n  for (LNK_SymbolHashTrieChunk *chunk = task->chunk_lists[task_id].first; chunk != 0; chunk = chunk->next) {\n    CV_SymbolNode *nodes    = push_array_no_zero(arena, CV_SymbolNode, chunk->count);\n    U64            node_idx = 0;\n    for EachIndex(i, chunk->count) {\n      LNK_Symbol        *symbol        = chunk->v[i].symbol;\n      LNK_ObjSymbolRef   symbol_ref    = lnk_ref_from_symbol(symbol);\n      COFF_ParsedSymbol  symbol_parsed = lnk_parsed_from_symbol(symbol);\n\n      if (symbol_parsed.section_number == lnk_obj_get_removed_section_number(symbol_ref.obj)) { continue; }\n\n      COFF_SymbolValueInterpType symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed);\n      if (symbol_interp != COFF_SymbolValueInterp_Regular) { continue; }\n\n      CV_Pub32Flags flags = 0;\n      if (COFF_SymbolType_IsFunc(symbol_parsed.type)) { flags |= CV_Pub32Flag_Function; }\n\n      ISectOff sc             = lnk_sc_from_symbol(symbol);\n      U16      symbol_isect16 = safe_cast_u16(sc.isect);\n      U32      symbol_off32   = safe_cast_u32(sc.off);\n\n      nodes[node_idx].data = cv_make_pub32(arena, flags, symbol_off32, symbol_isect16, symbol->name);\n      cv_symbol_list_push_node(&task->pub_list_arr[task_id], &nodes[node_idx]);\n      node_idx += 1;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_gsi_hash_cv_list_task)\n{\n  ProfBeginFunction();\n\n  LNK_BuildPublicSymbolsTask *task  = raw_task;\n  Rng1U64                     range = task->symbol_ranges[task_id];\n\n  for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) {\n    CV_Symbol *symbol = &task->symbols.v[symbol_idx]->data;\n    String8 name = cv_name_from_symbol(symbol->kind, symbol->data);\n    task->hashes[symbol_idx] = gsi_hash(task->gsi, name);\n  }\n\n  ProfEnd();\n}\n\ninternal void\nlnk_build_pdb_public_symbols(TP_Context            *tp,\n                             TP_Arena              *arena,\n                             LNK_SymbolTable       *symtab,\n                             PDB_PsiContext        *psi)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Defined\");\n  LNK_BuildPublicSymbolsTask task = {0};\n  task.pub_list_arr = push_array(scratch.arena, CV_SymbolList, tp->worker_count);\n  task.chunk_lists  = symtab->chunks;\n  tp_for_parallel(tp, arena, tp->worker_count, lnk_build_pdb_public_symbols_defined_task, &task);\n  ProfEnd();\n\n  CV_SymbolPtrArray symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, tp->worker_count, task.pub_list_arr);\n\n  ProfBegin(\"GSI Push\");\n  gsi_push_many_arr(tp, psi->gsi, symbols.count, symbols.v);\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal String8List\nlnk_build_pdb(TP_Context               *tp,\n              TP_Arena                 *tp_arena,\n              String8                   image_data,\n              LNK_Config               *config,\n              LNK_SymbolTable          *symtab,\n              U64                       obj_count,\n              LNK_Obj                 **obj_arr,\n              CV_DebugS                *debug_s_arr,\n              U64                       total_symbol_input_count,\n              LNK_CodeViewSymbolsInput *symbol_inputs,\n              CV_SymbolListArray       *parsed_symbols,\n              CV_DebugT                 types[CV_TypeIndexSource_COUNT])\n{\n  ProfBegin(\"PDB\");\n  Temp scratch = scratch_begin(tp_arena->v, tp_arena->count);\n\n  PE_BinInfo           pe                        = pe_bin_info_from_data(scratch.arena, image_data);\n  COFF_SectionHeader **image_section_table       = coff_section_table_from_data(scratch.arena, image_data, pe.section_table_range);\n  U64                  image_section_table_count = pe.section_count+1;\n\n  ProfBegin(\"Setup PDB Context\");\n  PDB_Context *pdb = pdb_alloc(config->pdb_page_size, config->machine, config->time_stamp, config->age, config->guid);\n  ProfEnd();\n\n  // move patched type data\n  //\n  // leaf data is stored in g_file_arena which has linker's life-time\n  // and this way we skip redundant leaf copy to the type server to make things faster\n  pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_IPI], types[CV_TypeIndexSource_IPI]);\n  pdb_type_server_push_parallel(tp, pdb->type_servers[CV_TypeIndexSource_TPI], types[CV_TypeIndexSource_TPI]);\n\n  ProfBegin(\"Collect Symbols for GSI\");\n  CV_SymbolList *gsi_list_arr = push_array(scratch.arena, CV_SymbolList, obj_count);\n  {\n    LNK_ProcessSymDataTaskData task = {0};\n    task.gsi_list_arr               = gsi_list_arr;\n    task.parsed_symbols             = parsed_symbols;\n    tp_for_parallel(tp, 0, obj_count, lnk_filter_out_gsi_symbols_task, &task);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Reserve DBI Modules\");\n  PDB_DbiModule **mod_arr = push_array(tp_arena->v[0], PDB_DbiModule *, obj_count);\n  for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n    LNK_Obj *obj = obj_arr[obj_idx];\n    mod_arr[obj_idx] = dbi_push_module(pdb->dbi, obj->path, lnk_obj_get_lib_path(obj));\n\n    // we don't support symbol append\n    Assert(mod_arr[obj_idx]->sn == MSF_INVALID_STREAM_NUMBER);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Build String Table\");\n  CV_StringHashTable string_ht = cv_dedup_string_tables(tp_arena, tp, obj_count, debug_s_arr);\n  cv_string_hash_table_assign_buffer_offsets(tp, string_ht);\n  U64 string_data_base_offset = pdb->info->strtab.size;\n  pdb_strtab_add_cv_string_hash_table(&pdb->info->strtab, string_ht);\n  ProfEnd();\n\n  ProfBegin(\"Build DBI Modules\");\n  {\n    TP_Temp temp = tp_temp_begin(tp_arena);\n    {\n      ProfBegin(\"Reloc Module Data\");\n\n      ProfBegin(\"Serialize Symbols\");\n      String8List *serialized_symbol_data = push_array(scratch.arena, String8List, obj_count);\n      {\n        LNK_ProcessSymDataTaskData task = {0};\n        task.symbol_inputs              = symbol_inputs;\n        task.parsed_symbols             = parsed_symbols;\n        task.mod_arr                    = mod_arr;\n        task.symbol_data_arr            = serialized_symbol_data;\n        tp_for_parallel(tp, tp_arena, obj_count, lnk_process_sym_data_task, &task);\n      }\n      ProfEnd();\n\n      LNK_ProcessedCodeViewC11Data processed_c11 = lnk_process_c11_data(tp, tp_arena, obj_count, debug_s_arr, string_data_base_offset, string_ht, pdb->msf, mod_arr);\n      LNK_ProcessedCodeViewC13Data processed_c13 = lnk_process_c13_data(tp, tp_arena, obj_count, debug_s_arr, string_data_base_offset, string_ht, pdb->msf, mod_arr);\n\n      ProfEnd();\n\n      // TODO: actually collect offsets and pass them here\n      ProfBegin(\"Build Empty Global Reference Array\");\n      String8List *globrefs_arr = push_array(tp_arena->v[0], String8List, obj_count);\n      for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n        String8List *globrefs = &globrefs_arr[obj_idx];\n        str8_serial_begin(tp_arena->v[0], globrefs);\n        Assert(globrefs->total_size == 0);\n        str8_serial_push_u32(tp_arena->v[0], globrefs, globrefs->total_size);\n      }\n      ProfEnd();\n\n      // reserve memory for module streams\n      ProfBegin(\"Reserve Modules Memory\");\n      for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n        // compute number of bytes needed for module data\n        U64 mod_size = 0;\n        mod_size += serialized_symbol_data[obj_idx].total_size;\n        mod_size += processed_c11.data_list_arr[obj_idx].total_size;\n        mod_size += processed_c13.data_list_arr[obj_idx].total_size;\n        mod_size += globrefs_arr[obj_idx].total_size;\n\n        U32 mod_size32 = safe_cast_u32(mod_size);\n\n        // allocate stream for module\n        PDB_DbiModule *mod = mod_arr[obj_idx];\n        mod->sn = msf_stream_alloc_ex(pdb->msf, mod_size32);\n      }\n      ProfEnd();\n\n      // copy data to module streams\n      ProfBegin(\"Write Modules Data\");\n      LNK_WriteModuleDataTask write_module_data_task_data;\n      write_module_data_task_data.msf               = pdb->msf;\n      write_module_data_task_data.mod_arr           = mod_arr;\n      write_module_data_task_data.symbol_data_arr   = serialized_symbol_data;\n      write_module_data_task_data.c11_data_list_arr = processed_c11.data_list_arr;\n      write_module_data_task_data.c13_data_list_arr = processed_c13.data_list_arr;\n      write_module_data_task_data.globrefs_arr      = globrefs_arr;\n      tp_for_parallel(tp, 0, obj_count, lnk_write_module_data_task, &write_module_data_task_data);\n      ProfEnd();\n\n      // push source files per module info\n      ProfBegin(\"Build Source Files List\");\n      for (U64 obj_idx = 0; obj_idx < obj_count; ++obj_idx) {\n        PDB_DbiModule *mod = mod_arr[obj_idx];\n        String8List source_file_list_scratch = processed_c13.source_file_names_list_arr[obj_idx];\n        String8List source_file_list = str8_list_copy(pdb->dbi->arena, &source_file_list_scratch);\n        str8_list_concat_in_place(&mod->source_file_list, &source_file_list);\n      }\n      ProfEnd();\n    }\n    tp_temp_end(temp);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Make Proc Refs\");\n  {\n    LNK_ProcessSymDataTaskData task = {0};\n    task.mod_arr                    = mod_arr;\n    task.gsi_list_arr               = gsi_list_arr;\n    task.parsed_symbols             = parsed_symbols;\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_make_proc_refs_task, &task);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Push Global Symbols\");\n  {\n    CV_SymbolPtrArray global_symbols = cv_symbol_ptr_array_from_list(scratch.arena, tp, obj_count, gsi_list_arr);\n    cv_dedup_symbol_ptr_array(tp, &global_symbols);\n    gsi_push_many_arr(tp, pdb->gsi, global_symbols.count, global_symbols.v);\n  }\n  ProfEnd();\n  \n  ProfBegin(\"Build DBI Section Headers\");\n  {\n    for (U64 sect_idx = 1; sect_idx < image_section_table_count; sect_idx += 1) {\n      dbi_push_section(pdb->dbi, image_section_table[sect_idx]);\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Build Section Contrib Map\");\n  {\n\n    Rng1U64Array image_section_file_ranges = {0};\n    image_section_file_ranges.count = 0;\n    image_section_file_ranges.v     = push_array(scratch.arena, Rng1U64, image_section_table_count);\n    Rng1U64Array image_section_virt_ranges = {0};\n    image_section_virt_ranges.count = image_section_table_count;\n    image_section_virt_ranges.v     = push_array(scratch.arena, Rng1U64, image_section_table_count);\n    for (U64 i = 0; i < image_section_table_count; i += 1) {\n      COFF_SectionHeader *sect_header = image_section_table[i];\n      if (~sect_header->flags & COFF_SectionFlag_CntUninitializedData) {\n        image_section_file_ranges.v[image_section_file_ranges.count++] = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize);\n      }\n      image_section_virt_ranges.v[i] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize);\n    }\n\n    LNK_PushDbiSecContribTaskData task = {0};\n    task.obj_arr                       = obj_arr;\n    task.mod_arr                       = mod_arr;\n    task.sc_list                       = push_array(scratch.arena, PDB_DbiSectionContribList, obj_count);\n    task.image_data                    = image_data;\n    task.image_section_file_ranges     = image_section_file_ranges;\n    task.image_section_virt_ranges     = image_section_virt_ranges;\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_push_dbi_sec_contrib_task, &task);\n\n    dbi_sec_list_concat_arr(&pdb->dbi->sec_contrib_list, obj_count, task.sc_list);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Build NatVis\");\n  {\n    String8Array natvis_file_path_arr = str8_array_from_list(scratch.arena, &config->natvis_list);\n    String8Array natvis_file_data_arr = lnk_read_data_from_file_path_parallel(tp, scratch.arena, config->io_flags, natvis_file_path_arr);\n\n    for (U64 i = 0; i < natvis_file_data_arr.count; ++i) {\n      String8 natvis_file_path = natvis_file_path_arr.v[i];\n      String8 natvis_file_data = natvis_file_data_arr.v[i];\n\n      // did we read the file?\n      if (natvis_file_data.size == 0) {\n        lnk_error(LNK_Warning_FileNotFound, \"unable to open natvis file \\\"%S\\\"\", natvis_file_path);\n        continue;\n      }\n\n      // sanity check file extension or VS wont load NatVis\n      String8 ext = str8_skip_last_dot(natvis_file_path);\n      if (!str8_match(ext, str8_lit(\"natvis\"), StringMatchFlag_CaseInsensitive)) {\n        lnk_error(LNK_Warning_Natvis, \"Visual Studio expects .natvis extension: \\\"%S\\\"\", natvis_file_path);\n      }\n\n      // add natvis to PDB\n      PDB_SrcError error = pdb_add_src(pdb->info, pdb->msf, natvis_file_path, natvis_file_data, PDB_SrcComp_NULL);\n      if (error != PDB_SrcError_OK) {\n        lnk_error(LNK_Error_Natvis, \"%S\", pdb_string_from_src_error(error));\n      }\n    }\n  }\n  ProfEnd();\n  \n  lnk_build_pdb_public_symbols(tp, tp_arena, symtab, pdb->psi);\n  \n  pdb_build(tp, tp_arena, pdb, string_ht);\n\n  MSF_Error msf_err = msf_build(pdb->msf);\n  if (msf_err != MSF_Error_OK) {\n    lnk_error(LNK_Error_UnableToSerializeMsf, \"unable to serialize MSF: %s\", msf_error_to_string(msf_err));\n  }\n\n  ProfBegin(\"Get Page Nodes\");\n  String8List page_data_list = msf_get_page_data_nodes(tp_arena->v[0], pdb->msf);\n  ProfEnd();\n\n  \n  // NOTE: linker is about to exit so we can skip memory release\n  // and let windows free memory since it does this faster\n#if 0\n  ProfBegin(\"Context Release\");\n  pdb_release(&pdb);\n  ProfEnd();\n#endif\n\n  scratch_end(scratch);\n  ProfEnd();\n  return page_data_list;\n}\n\ninternal U64\nlnk_udt_name_hash_table_hash(String8 string)\n{\n  return XXH3_64bits(string.str, string.size);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_build_udt_name_hash_table_task)\n{\n  LNK_BuildUDTNameHashTableTask *task = raw_task;\n\n  LNK_UDTNameBucket *new_bucket = 0;\n\n  for (U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(task->debug_t, leaf_idx);\n    if (cv_is_udt(leaf.kind)) {\n      CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n      if (~udt_info.props & CV_TypeProp_FwdRef) {\n        if (!cv_is_udt_name_anon(udt_info.name)) {\n          String8 name       = cv_name_from_udt_info(udt_info);\n          U64     hash       = lnk_udt_name_hash_table_hash(name);\n          U64     best_idx   = hash % task->buckets_cap;\n          U64     bucket_idx = best_idx;\n\n          if (new_bucket == 0) {\n            new_bucket = push_array(arena, LNK_UDTNameBucket, 1);\n          }\n          new_bucket->name = name;\n          new_bucket->leaf_idx = leaf_idx;\n          \n          B32 is_inserted_or_updated = 0;\n          do {\n            retry:;\n            LNK_UDTNameBucket *curr_bucket = task->buckets[bucket_idx];\n\n            if (curr_bucket == 0) {\n              LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket);\n\n              if (compare_bucket == curr_bucket) {\n                // success, bucket was inserted\n                is_inserted_or_updated = 1;\n                break;\n              }\n\n              // another thread took the bucket...\n              goto retry;\n            } else if (str8_match(curr_bucket->name, name, 0)) {\n              // there is more than one UDT with identical name, pick most recent and ignore others\n              \n              if (leaf_idx < curr_bucket->leaf_idx) {\n                LNK_UDTNameBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&task->buckets[bucket_idx], new_bucket, curr_bucket);\n                if (compare_bucket == curr_bucket) {\n                  is_inserted_or_updated = 1;\n                  break;\n                }\n              } else {\n                // don't need to update, more recent leaf is in the bucket\n                break;\n              }\n\n              // another thread took the bucket...\n              goto retry;\n            }\n\n            // advance\n            bucket_idx = (bucket_idx + 1) % task->buckets_cap;\n          } while (bucket_idx != best_idx);\n\n          if (is_inserted_or_updated) {\n            new_bucket = 0;\n          }\n        }\n      }\n    }\n  }\n}\n\n\ninternal LNK_UDTNameBucket **\nlnk_udt_name_hash_table_from_debug_t(TP_Context *tp,\n                                     TP_Arena   *arena,\n                                     CV_DebugT   debug_t,\n                                     U64        *buckets_cap_out)\n{\n  Temp scratch = scratch_begin(&arena->v[0], 1);\n  LNK_BuildUDTNameHashTableTask task = {0};\n  task.debug_t     = debug_t;\n  task.buckets_cap = (U64)((F64)debug_t.count * 1.3);\n  task.buckets     = push_array(arena->v[0], LNK_UDTNameBucket *, task.buckets_cap);\n  task.ranges      = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count);\n  tp_for_parallel(tp, arena, tp->worker_count, lnk_build_udt_name_hash_table_task, &task);\n  *buckets_cap_out = task.buckets_cap;\n  scratch_end(scratch);\n  return task.buckets;\n}\n\ninternal LNK_UDTNameBucket *\nlnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name)\n{\n  U64 hash       = lnk_udt_name_hash_table_hash(name);\n  U64 best_idx   = hash % cap;\n  U64 bucket_idx = best_idx;\n  do {\n    if (buckets[bucket_idx] == 0) {\n      break;\n    }\n    if (str8_match(buckets[bucket_idx]->name, name, 0)) {\n      return buckets[bucket_idx];\n    }\n    bucket_idx = (bucket_idx + 1) % cap;\n  } while (bucket_idx != best_idx);\n  return 0;\n}\n\ninternal CV_TypeIndex\nlnk_udt_name_hash_table_lookup_itype(LNK_UDTNameBucket **buckets, U64 cap, String8 name)\n{\n  LNK_UDTNameBucket *bucket = lnk_udt_name_hash_table_lookup(buckets, cap, name);\n  if (bucket != 0) {\n    return CV_MinComplexTypeIndex + bucket->leaf_idx;\n  }\n  return 0;\n}\n\ninternal RDIB_Type *\nlnk_push_converted_codeview_type(Arena *arena, RDIB_TypeChunkList *list, RDIB_Type **itype_map, CV_TypeIndex itype)\n{\n  RDIB_Type *type = rdib_type_chunk_list_push(arena, list, 8196);\n  type->final_idx = 0;\n  type->itype     = itype;\n\n  Assert(itype_map[itype] == 0);\n  itype_map[itype] = type;\n\n  return type;\n}\n\ninternal void\nlnk_push_basic_itypes(Arena *arena, RDIB_DataModel data_model, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list)\n{\n  RDI_TypeKind short_type      = rdib_short_type_from_data_model(data_model);\n  RDI_TypeKind ushort_type     = rdib_unsigned_short_type_from_data_model(data_model);\n  RDI_TypeKind int_type        = rdib_int_type_from_data_model(data_model);\n  RDI_TypeKind uint_type       = rdib_unsigned_int_type_from_data_model(data_model);\n  RDI_TypeKind long_type       = rdib_long_type_from_data_model(data_model);\n  RDI_TypeKind ulong_type      = rdib_unsigned_long_type_from_data_model(data_model);\n  RDI_TypeKind long_long_type  = rdib_long_long_type_from_data_model(data_model);\n  RDI_TypeKind ulong_long_type = rdib_unsigned_long_long_type_from_data_model(data_model);\n  RDI_TypeKind ptr_type        = rdib_pointer_size_t_type_from_data_model(data_model);\n\n  struct {\n    char *       name;\n    RDI_TypeKind kind_rdi;\n    CV_LeafKind  kind_cv;\n    B32          make_pointer_near;\n    B32          make_pointer_32;\n    B32          make_pointer_64;\n  } table[] = {\n    { \"void\"                 , RDI_TypeKind_Void       , CV_BasicType_VOID       , 1, 1, 1 },\n    { \"HRESULT\"              , RDI_TypeKind_Handle     , CV_BasicType_HRESULT    , 0, 1, 1 },\n    { \"signed char\"          , RDI_TypeKind_Char8      , CV_BasicType_CHAR       , 1, 1, 1 }, // TODO: we need Signed Char8 in RDI\n    { \"short\"                , short_type              , CV_BasicType_SHORT      , 1, 1, 1 },\n    { \"long\"                 , long_type               , CV_BasicType_LONG       , 1, 1, 1 },\n    { \"long long\"            , long_long_type          , CV_BasicType_QUAD       , 1, 1, 1 },\n    { \"__int128\"             , RDI_TypeKind_S128       , CV_BasicType_OCT        , 1, 1, 1 }, // GCC/Clang type\n    { \"unsigned char\"        , RDI_TypeKind_UChar8     , CV_BasicType_UCHAR      , 1, 1, 1 },\n    { \"unsigned short\"       , ushort_type             , CV_BasicType_USHORT     , 1, 1, 1 },\n    { \"unsigned long\"        , ulong_type              , CV_BasicType_ULONG      , 1, 1, 1 },\n    { \"unsigned long long\"   , ulong_long_type         , CV_BasicType_UQUAD      , 1, 1, 1 },\n    { \"__uint128\"            , RDI_TypeKind_U128       , CV_BasicType_UOCT       , 1, 1, 1 }, // GCC/Clang type\n    { \"bool\"                 , RDI_TypeKind_S8         , CV_BasicType_BOOL8      , 1, 1, 1 }, // TODO: we need a actual boolean type in RDI so we can format value as true/false.\n    { \"__bool16\"             , RDI_TypeKind_S16        , CV_BasicType_BOOL16     , 1, 1, 1 }, // not real C type\n    { \"__bool32\"             , RDI_TypeKind_S32        , CV_BasicType_BOOL32     , 1, 1, 1 }, // not real C type\n    { \"float\"                , RDI_TypeKind_F32        , CV_BasicType_FLOAT32    , 1, 1, 1 },\n    { \"double\"               , RDI_TypeKind_F64        , CV_BasicType_FLOAT64    , 1, 1, 1 },\n    { \"long double\"          , RDI_TypeKind_F80        , CV_BasicType_FLOAT80    , 1, 1, 1 },\n    { \"__float128\"           , RDI_TypeKind_F128       , CV_BasicType_FLOAT128   , 1, 1, 1 }, // GCC/Clang type\n    { \"__float48\"            , RDI_TypeKind_F48        , CV_BasicType_FLOAT48    , 1, 1, 1 }, // not real C type\n    { \"__float32pp\"          , RDI_TypeKind_F32PP      , CV_BasicType_FLOAT32PP  , 1, 1, 1 }, // not real C type\n    { \"_Complex float\"       , RDI_TypeKind_ComplexF32 , CV_BasicType_COMPLEX32  , 0, 0, 0 },\n    { \"_Complex double\"      , RDI_TypeKind_ComplexF64 , CV_BasicType_COMPLEX64  , 0, 0, 0 },\n    { \"_Complex long double\" , RDI_TypeKind_ComplexF80 , CV_BasicType_COMPLEX80  , 0, 0, 0 },\n    { \"_Complex __float128\"  , RDI_TypeKind_ComplexF128, CV_BasicType_COMPLEX128 , 0, 0, 0 },\n    { \"__int8\"               , RDI_TypeKind_S8         , CV_BasicType_INT8       , 1, 1, 1 },\n    { \"__uint8\"              , RDI_TypeKind_U8         , CV_BasicType_UINT8      , 1, 1, 1 },\n    { \"__int16\"              , RDI_TypeKind_S16        , CV_BasicType_INT16      , 1, 1, 1 },\n    { \"__uint16\"             , RDI_TypeKind_U16        , CV_BasicType_UINT16     , 1, 1, 1 },\n    { \"int\"                  , int_type                , CV_BasicType_INT32      , 1, 1, 1 },\n    { \"unsigned int\"         , uint_type               , CV_BasicType_UINT32     , 1, 1, 1 },\n    { \"__int64\"              , RDI_TypeKind_S64        , CV_BasicType_INT64      , 1, 1, 1 },\n    { \"__uint64\"             , RDI_TypeKind_U64        , CV_BasicType_UINT64     , 1, 1, 1 },\n    { \"__int128\"             , RDI_TypeKind_S128       , CV_BasicType_INT128     , 1, 1, 1 },\n    { \"__uint128\"            , RDI_TypeKind_U128       , CV_BasicType_UINT128    , 1, 1, 1 },\n    { \"char\"                 , RDI_TypeKind_Char8      , CV_BasicType_RCHAR      , 1, 1, 1 }, // always ASCII\n    { \"wchar_t\"              , RDI_TypeKind_UChar16    , CV_BasicType_WCHAR      , 1, 1, 1 }, // on windows always UTF-16\n    { \"char8_t\"              , RDI_TypeKind_Char8      , CV_BasicType_CHAR8      , 1, 1, 1 }, // always UTF-8\n    { \"char16_t\"             , RDI_TypeKind_Char16     , CV_BasicType_CHAR16     , 1, 1, 1 }, // always UTF-16\n    { \"char32_t\"             , RDI_TypeKind_Char32     , CV_BasicType_CHAR32     , 1, 1, 1 }, // always UTF-32\n    { \"__pointer\"            , ptr_type                , CV_BasicType_PTR        , 0, 0, 0 }\n  };\n\n  for (U64 i = 0; i < ArrayCount(table); ++i) {\n    U64 builtin_size;\n    if (table[i].kind_rdi == RDI_TypeKind_Void || table[i].kind_rdi == RDI_TypeKind_Handle) {\n      builtin_size = rdi_size_from_basic_type_kind(ptr_type);\n    } else {\n      builtin_size = rdi_size_from_basic_type_kind(table[i].kind_rdi);\n    }\n\n    RDIB_Type *builtin    = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv);\n    builtin->kind         = table[i].kind_rdi;\n    builtin->builtin.name = str8_cstring(table[i].name);\n    builtin->builtin.size = builtin_size;\n\n    RDIB_Type **wrapper = push_array(arena, RDIB_Type *, 1);\n    *wrapper = builtin;\n\n    if (table[i].make_pointer_near) {\n      RDIB_Type *ptr_near    = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x100);\n      ptr_near->kind         = RDI_TypeKind_Ptr;\n      ptr_near->ptr.size     = rdi_size_from_basic_type_kind(ptr_type);\n      ptr_near->ptr.type_ref = wrapper;\n    }\n    if (table[i].make_pointer_32) {\n      RDIB_Type *ptr_32    = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x400);\n      ptr_32->kind         = RDI_TypeKind_Ptr;\n      ptr_32->ptr.size     = 4;\n      ptr_32->ptr.type_ref = wrapper;\n    }\n    if (table[i].make_pointer_64) {\n      RDIB_Type *ptr_64    = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x600);\n      ptr_64->kind         = RDI_TypeKind_Ptr;\n      ptr_64->ptr.size     = 8;\n      ptr_64->ptr.type_ref = wrapper;\n    }\n\n#if 0\n      RDIB_Type *ptr_far   = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x200);\n      RDIB_Type *ptr_huge  = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x300);\n      RDIB_Type *ptr_16_32 = lnk_push_converted_codeview_type(arena, rdib_types_list, itype_map, table[i].kind_cv | 0x500);\n\n      ptr_far->kind           = RDI_TypeKind_Ptr;\n      ptr_far->ptr.size       = rdi_size_from_basic_type_kind(ptr_type);\n      ptr_far->ptr.type_ref   = wrapper;\n\n      ptr_huge->kind          = RDI_TypeKind_Ptr;\n      ptr_huge->ptr.size      = 4;\n      ptr_huge->ptr.type_ref  = wrapper;\n\n\n      ptr_16_32->kind         = RDI_TypeKind_Ptr;\n      ptr_16_32->ptr.size     = 6;\n      ptr_16_32->ptr.type_ref = wrapper;\n#endif\n  }\n}\n\ninternal RDIB_TypeRef\nlnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype)\n{\n  RDIB_TypeRef result    = &task->tpi_itype_map[0];\n  Rng1U64      tpi_range = task->itype_ranges[CV_TypeIndexSource_TPI];\n\n  if (itype < tpi_range.min) {\n    // check for supported CodeView pointer formats:\n    AssertAlways(BitExtract(itype, 8, 8) == /* near   */  0x1 ||\n                 BitExtract(itype, 8, 8) == /* 32 bit */  0x4 ||\n                 BitExtract(itype, 8, 8) == /* 64 bit */  0x6 ||\n                 BitExtract(itype, 8, 8) == /* regular */ 0x0);\n  }\n\n  if (itype < tpi_range.max) {\n    CV_TypeIndex final_itype = itype;\n\n    // try to resovle forward reference (defn might be missing)\n    if (itype >= tpi_range.min) {\n      U64     leaf_idx = itype - tpi_range.min;\n      CV_Leaf leaf     = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], leaf_idx);\n      if (cv_is_udt(leaf.kind)) {\n        CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n        if (udt_info.props & CV_TypeProp_FwdRef) {\n          String8      name           = cv_name_from_udt_info(udt_info);\n          CV_TypeIndex resolved_itype = lnk_udt_name_hash_table_lookup_itype(task->udt_name_buckets, task->udt_name_bucket_cap, name);\n          if (resolved_itype != 0) {\n            final_itype = resolved_itype;\n          }\n        }\n      }\n    }\n\n    result = &task->tpi_itype_map[final_itype];\n  }\n\n  return result;\n}\n\ninternal RDI_MemberKind\nlnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop)\n{\n  switch (prop) {\n  case CV_MethodProp_Vanilla:     return RDI_MemberKind_Method;\n  case CV_MethodProp_Virtual:     return RDI_MemberKind_VirtualMethod;\n  case CV_MethodProp_Static:      return RDI_MemberKind_StaticMethod;\n  case CV_MethodProp_Friend:      NotImplemented;\n  case CV_MethodProp_Intro:       return RDI_MemberKind_VirtualMethod;\n  case CV_MethodProp_PureVirtual: return RDI_MemberKind_VirtualMethod;\n  case CV_MethodProp_PureIntro:   return RDI_MemberKind_VirtualMethod;\n  }\n  return RDI_MemberKind_NULL;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_convert_types_to_rdi_task)\n{\n  ProfBeginFunction();\n  LNK_ConvertTypesToRDI *task = raw_task;\n\n  // upfront push output type array\n  U64 leaf_count = dim_1u64(task->ranges[task_id]);\n  rdib_type_chunk_list_reserve(arena, &task->rdib_types_lists[task_id], leaf_count);\n\n  for(U64 leaf_idx = task->ranges[task_id].min; leaf_idx < task->ranges[task_id].max; ++leaf_idx) {\n    U64     itype = task->itype_ranges[CV_TypeIndexSource_TPI].min + leaf_idx;\n    CV_Leaf src   = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], leaf_idx);\n\n    switch (src.kind) {\n    case CV_LeafKind_MODIFIER: {\n      CV_LeafModifier *modifier = (CV_LeafModifier *) src.data.str;\n\n      RDIB_Type *dst         = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind              = RDI_TypeKind_Modifier;\n      dst->modifier.flags    = rdi_type_modifier_flags_from_cv_modifier_flags(modifier->flags);\n      dst->modifier.type_ref = lnk_rdib_type_from_itype(task, modifier->itype);\n    } break;\n    case CV_LeafKind_POINTER: {\n      CV_LeafPointer *ptr      = (CV_LeafPointer *) src.data.str;\n      CV_PointerKind  ptr_kind = CV_PointerAttribs_Extract_Kind(ptr->attribs);\n      CV_PointerMode  ptr_mode = CV_PointerAttribs_Extract_Mode(ptr->attribs);\n      U32             ptr_size = CV_PointerAttribs_Extract_Size(ptr->attribs);\n      (void)ptr_kind;\n\n      // parse ahead type chain and squash modifiers\n      RDI_TypeModifierFlags modifier_flags = rdi_type_modifier_flags_from_cv_pointer_attribs(ptr->attribs);\n      CV_TypeIndex          next_itype;\n      for (next_itype = ptr->itype; task->itype_ranges[CV_TypeIndexSource_TPI].min <= next_itype && next_itype < task->itype_ranges[CV_TypeIndexSource_TPI].max;) {\n        U64     next_leaf_idx = next_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min;\n        CV_Leaf next_leaf     = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], next_leaf_idx);\n        if (next_leaf.kind != CV_LeafKind_MODIFIER) {\n          break;\n        }\n\n        // parse LF_MODIFIER\n        CV_LeafModifier       *sym_modifier = (CV_LeafModifier *) next_leaf.data.str;\n        RDI_TypeModifierFlags  flags        = rdi_type_modifier_flags_from_cv_modifier_flags(sym_modifier->flags);\n\n        // accumulate modifier flags\n        modifier_flags |= flags;\n\n        // advance\n        next_itype = sym_modifier->itype;\n      }\n\n      if (modifier_flags == 0) {\n        // No modifer just generate pointer type.\n        RDIB_Type *dst    = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n        dst->kind         = rdi_type_kind_from_pointer(ptr->attribs, ptr_mode);\n        dst->ptr.size     = ptr_size;\n        dst->ptr.type_ref = lnk_rdib_type_from_itype(task, ptr->itype);\n      } else {\n        // CodeView embeds modifier in pointer struct, we don't have an equivalent \n        // so generate a modifier type in pointer slot and link with pointer type.\n\n        RDIB_Type *ptr_type    = rdib_type_chunk_list_push(arena, &task->rdib_types_lists[task_id], task->type_cap);\n        ptr_type->kind         = rdi_type_kind_from_pointer(ptr->attribs, ptr_mode);\n        ptr_type->ptr.type_ref = lnk_rdib_type_from_itype(task, next_itype);\n        RDIB_Type **indirect_ptr_type = push_array(arena, RDIB_Type *, 1);\n        *indirect_ptr_type = ptr_type;\n\n        RDIB_Type *dst         = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n        dst->kind              = RDI_TypeKind_Modifier;\n        dst->modifier.flags    = modifier_flags;\n        dst->modifier.type_ref = indirect_ptr_type;\n      }\n    } break;\n    case CV_LeafKind_PROCEDURE: {\n      CV_LeafProcedure *proc = (CV_LeafProcedure *) src.data.str;\n\n      RDIB_Type *dst        = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind             = RDI_TypeKind_Function;\n      dst->func.return_type = lnk_rdib_type_from_itype(task, proc->ret_itype);\n      dst->func.params_type = lnk_rdib_type_from_itype(task, proc->arg_itype);\n    } break;\n    case CV_LeafKind_MFUNCTION: {\n      CV_LeafMFunction *mfunc = (CV_LeafMFunction *) src.data.str;\n      B32 is_static_method = mfunc->this_itype == 0;\n      RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n\n      if (is_static_method) {\n        dst->kind                      = RDI_TypeKindExt_StaticMethod;\n        dst->static_method.class_type  = lnk_rdib_type_from_itype(task, mfunc->class_itype);\n        dst->static_method.return_type = lnk_rdib_type_from_itype(task, mfunc->ret_itype);\n        dst->static_method.params_type = lnk_rdib_type_from_itype(task, mfunc->arg_itype);\n      } else {\n        dst->kind               = RDI_TypeKind_Method;\n        dst->method.class_type  = lnk_rdib_type_from_itype(task, mfunc->class_itype);\n        dst->method.this_type   = lnk_rdib_type_from_itype(task, mfunc->this_itype);\n        dst->method.return_type = lnk_rdib_type_from_itype(task, mfunc->ret_itype);\n        dst->method.params_type = lnk_rdib_type_from_itype(task, mfunc->arg_itype);\n      }\n    } break;\n    case CV_LeafKind_BITFIELD: {\n      CV_LeafBitField *bitfield = (CV_LeafBitField *) src.data.str;\n\n      RDIB_Type *dst           = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind                = RDI_TypeKind_Bitfield;\n      dst->bitfield.off        = bitfield->pos;\n      dst->bitfield.count      = bitfield->len;\n      dst->bitfield.value_type = lnk_rdib_type_from_itype(task, bitfield->itype);\n    } break;\n    case CV_LeafKind_ARRAY: {\n      CV_LeafArray     *array = (CV_LeafArray *) src.data.str;\n      CV_NumericParsed  size  = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafArray), src.data.str + src.data.size);\n\n      RDIB_Type *dst        = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind             = RDI_TypeKind_Array;\n      dst->array.entry_type = lnk_rdib_type_from_itype(task, array->entry_itype);\n      dst->array.size       = cv_u64_from_numeric(&size);\n    } break;\n    case CV_LeafKind_CLASS:\n    case CV_LeafKind_STRUCTURE: {\n      CV_LeafStruct    *udt  = (CV_LeafStruct *) src.data.str;\n      CV_NumericParsed  size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafStruct), src.data.str + src.data.size);\n\n      String8 name;\n      String8 link_name;\n      if (udt->props & CV_TypeProp_HasUniqueName) {\n        name      = str8_cstring_capped(src.data.str + sizeof(CV_LeafStruct) + size.encoded_size, src.data.str + src.data.size);\n        link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size);\n      } else {\n        name      = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafStruct) + size.encoded_size, src.data.str + src.data.size);\n        link_name = name;\n      }\n\n      RDIB_Type *dst               = lnk_push_converted_codeview_type(arena, &task->rdib_types_struct_lists[task_id], task->tpi_itype_map, itype);\n      dst->udt.name                = name;\n      dst->udt.link_name           = link_name;\n      dst->udt.members             = lnk_rdib_type_from_itype(task, udt->field_itype);\n      dst->udt.struct_type.size    = cv_u64_from_numeric(&size);\n      dst->udt.struct_type.derived = lnk_rdib_type_from_itype(task, udt->derived_itype);\n      dst->udt.struct_type.vtshape = lnk_rdib_type_from_itype(task, udt->vshape_itype);\n\n      if (udt->props & CV_TypeProp_FwdRef) {\n        dst->kind = src.kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct;\n      } else {\n        dst->kind = src.kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct;\n      }\n    } break;\n    case CV_LeafKind_CLASS2:\n    case CV_LeafKind_STRUCT2: {\n      CV_LeafStruct2   *udt  = (CV_LeafStruct2 *) src.data.str;\n      CV_NumericParsed  size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafStruct2), src.data.str + src.data.size);\n\n      String8 name;\n      String8 link_name;\n      if (udt->props & CV_TypeProp_HasUniqueName) {\n        name      = str8_cstring_capped(src.data.str + sizeof(CV_LeafStruct2) + size.encoded_size, src.data.str + src.data.size);\n        link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size);\n      } else {\n        name      = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafStruct2) + size.encoded_size, src.data.str + src.data.size);\n        link_name = name;\n      }\n\n      RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_struct_lists[task_id], task->tpi_itype_map, itype);\n      dst->udt.name                = name;\n      dst->udt.link_name           = link_name;\n      dst->udt.members             = lnk_rdib_type_from_itype(task, udt->field_itype);\n      dst->udt.struct_type.size    = cv_u64_from_numeric(&size);\n      dst->udt.struct_type.derived = lnk_rdib_type_from_itype(task, udt->derived_itype);\n      dst->udt.struct_type.vtshape = lnk_rdib_type_from_itype(task, udt->vshape_itype);\n\n      if (udt->props & CV_TypeProp_FwdRef) {\n        dst->kind = src.kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct;\n      } else {\n        dst->kind = src.kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct;\n      }\n    } break;\n    case CV_LeafKind_UNION: {\n      CV_LeafUnion     *udt  = (CV_LeafUnion *) src.data.str;\n      CV_NumericParsed  size = cv_numeric_from_data_range(src.data.str + sizeof(CV_LeafUnion), src.data.str + src.data.size);\n\n      String8 name;\n      String8 link_name;\n      if (udt->props & CV_TypeProp_HasUniqueName) {\n        name      = str8_cstring_capped(src.data.str + sizeof(CV_LeafUnion) + size.encoded_size, src.data.str + src.data.size);\n        link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size);\n      } else {\n        name      = str8_cstring_capped_reverse(src.data.str + sizeof(CV_LeafUnion) + size.encoded_size, src.data.str + src.data.size);\n        link_name = name;\n      }\n\n      RDIB_Type *dst           = lnk_push_converted_codeview_type(arena, &task->rdib_types_union_lists[task_id], task->tpi_itype_map, itype);\n      dst->udt.name            = name;\n      dst->udt.link_name       = link_name;\n      dst->udt.members         = lnk_rdib_type_from_itype(task, udt->field_itype);\n      dst->udt.union_type.size = cv_u64_from_numeric(&size);\n\n      if (udt->props & CV_TypeProp_FwdRef) {\n        dst->kind = RDI_TypeKind_IncompleteUnion;\n      } else {\n        dst->kind = RDI_TypeKind_Union;\n      }\n    } break;\n    case CV_LeafKind_ENUM: {\n      CV_LeafEnum *udt  = (CV_LeafEnum *) src.data.str;\n\n      String8 name;\n      String8 link_name;\n      if (udt->props & CV_TypeProp_HasUniqueName) {\n        name      = str8_cstring_capped(src.data.str + sizeof(*udt), src.data.str + src.data.size);\n        link_name = str8_cstring_capped_reverse(name.str + name.size + 1, src.data.str + src.data.size);\n      } else {\n        name      = str8_cstring_capped_reverse(src.data.str + sizeof(*udt), src.data.str + src.data.size);\n        link_name = name;\n      }\n\n      RDIB_Type *dst               = lnk_push_converted_codeview_type(arena, &task->rdib_types_enum_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind                    = (RDI_TypeKindExt)RDI_TypeKind_Enum;\n      dst->udt.name                = name;\n      dst->udt.link_name           = link_name;\n      dst->udt.members             = lnk_rdib_type_from_itype(task, udt->field_itype);\n      dst->udt.enum_type.base_type = lnk_rdib_type_from_itype(task, udt->base_itype);\n\n      if (udt->props & CV_TypeProp_FwdRef) {\n        dst->kind = RDI_TypeKind_IncompleteEnum;\n      } else {\n        dst->kind = (RDI_TypeKindExt)RDI_TypeKind_Enum;\n      }\n    } break;\n    case CV_LeafKind_ARGLIST: {\n      CV_LeafArgList *arglist = (CV_LeafArgList *) src.data.str;\n      CV_TypeIndex   *itypes  = (CV_TypeIndex *) (arglist + 1);\n\n      if (arglist->count * sizeof(CV_TypeIndex) + sizeof(CV_LeafArgList) > src.data.size) {\n        AssertAlways(\"error: ill-formed LF_ARGLIST\");\n        break;\n      }\n\n      RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_params_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind         = RDI_TypeKindExt_Params; // there is no Params kind in RDI\n      dst->params.count = arglist->count;\n      dst->params.types = push_array(arena, RDIB_TypeRef, arglist->count);\n      for (U64 param_idx = 0; param_idx < arglist->count; ++param_idx) {\n        // strange way to encode variadic params, when outside LF_ARGLIST LF_NOTYPE actually means null...\n        if (itypes[param_idx] == CV_LeafKind_NOTYPE) { \n          dst->params.types[param_idx] = task->variadic_type_ref;\n        } else {\n          dst->params.types[param_idx] = lnk_rdib_type_from_itype(task, itypes[param_idx]);\n        }\n      }\n    } break;\n    case CV_LeafKind_FIELDLIST: {\n      RDIB_UDTMemberChunkList *rdib_member_list;\n      RDIB_TypeChunkList      *rdib_member_types;\n      B32 is_enum = sizeof(CV_LeafKind) <= src.data.size && (*(CV_LeafKind *)src.data.str == CV_LeafKind_ENUMERATE);\n      if (is_enum) {\n        rdib_member_list  = &task->rdib_enum_members_lists[worker_id];\n        rdib_member_types = &task->rdib_types_enum_members_lists[worker_id];\n      } else {\n        rdib_member_list  = &task->rdib_udt_members_lists[worker_id];\n        rdib_member_types = &task->rdib_types_udt_members_lists[worker_id];\n      }\n\n      RDIB_Type *dst = lnk_push_converted_codeview_type(arena, rdib_member_types, task->tpi_itype_map, itype);\n      dst->kind = RDI_TypeKindExt_Members;\n\n      for (U64 cursor = 0; cursor + sizeof(CV_LeafKind) <= src.data.size; ) {\n        CV_LeafKind field_kind = *(CV_LeafKind *) (src.data.str + cursor);\n        cursor += sizeof(field_kind);\n\n        // do we have bytes to read?\n        U64 header_size = cv_header_struct_size_from_leaf_kind(field_kind);\n        if (cursor + header_size > src.data.size) {\n          break;\n        }\n\n        switch (field_kind) {\n        case CV_LeafKind_INDEX: {\n          CV_LeafIndex *index = (CV_LeafIndex *) (src.data.str + cursor);\n          cursor += sizeof(*index);\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB member list pointer\n          member->kind                = RDI_MemberKindExt_MemberListPointer;\n          member->member_list_pointer = lnk_rdib_type_from_itype(task, index->itype);\n        } break;\n        case CV_LeafKind_MEMBER: {\n          // prase CodeView struct/class/union data member\n          CV_LeafMember   *leaf_member = (CV_LeafMember *) (src.data.str + cursor);\n          CV_NumericParsed offset      = cv_numeric_from_data_range((U8 *)(leaf_member + 1), src.data.str + src.data.size);\n          String8          name        = str8_cstring_capped(src.data.str + cursor + sizeof(CV_LeafMember) + offset.encoded_size, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafMember);\n          cursor += offset.encoded_size;\n          cursor += name.size + 1;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB data member\n          member->kind                = RDI_MemberKind_DataField;\n          member->data_field.name     = name;\n          member->data_field.type_ref = lnk_rdib_type_from_itype(task, leaf_member->itype);\n          member->data_field.offset   = cv_u64_from_numeric(&offset);\n        } break;\n        case CV_LeafKind_STMEMBER: {\n          // parse CodeView static member\n          CV_LeafStMember *st_member = (CV_LeafStMember *) (src.data.str + cursor);\n          String8         name      = str8_cstring_capped(st_member + 1, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafStMember);\n          cursor += name.size + 1;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB static member\n          member->kind                 = RDI_MemberKind_StaticData;\n          member->static_data.name     = name;\n          member->static_data.type_ref = lnk_rdib_type_from_itype(task, st_member->itype);\n        } break;\n        case CV_LeafKind_METHOD: {\n          // parse CodeView over-loaded method\n          CV_LeafMethod *method = (CV_LeafMethod *) (src.data.str + cursor);\n          String8        name   = str8_cstring_capped(method + 1, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafMethod);\n          cursor += name.size + 1;\n\n          if (contains_1u64(task->itype_ranges[CV_TypeIndexSource_TPI], method->list_itype)) {\n            U64     method_list_leaf_idx = method->list_itype - task->itype_ranges[CV_TypeIndexSource_TPI].min;\n            CV_Leaf method_list_leaf     = cv_debug_t_get_leaf(task->types[CV_TypeIndexSource_TPI], method_list_leaf_idx);\n            if (method_list_leaf.kind == CV_LeafKind_METHODLIST) {\n              for (U64 cursor = 0; cursor + sizeof(CV_LeafMethodListMember) <= method_list_leaf.data.size; ) {\n                // parse CodeView method overload info\n                CV_LeafMethodListMember *list_member = (CV_LeafMethodListMember *) (method_list_leaf.data.str + cursor);\n                CV_MethodProp            prop        = CV_FieldAttribs_Extract_MethodProp(list_member->attribs);\n                cursor += sizeof(CV_LeafMethodListMember);\n                U32 vftable_offset = 0;\n                if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) {\n                  str8_deserial_read_struct(src.data, cursor, &vftable_offset);\n                  cursor += sizeof(vftable_offset);\n                }\n\n                // push new node\n                RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n                rdib_udt_member_list_push_node(&dst->members.list, member);\n\n                // fill out RDIB method\n                member->kind                  = RDI_MemberKind_Method;\n                member->method.kind           = lnk_rdib_method_kind_from_cv_prop(prop);\n                member->method.name           = name;\n                member->method.type_ref       = lnk_rdib_type_from_itype(task, list_member->itype);\n                member->method.vftable_offset = vftable_offset;\n              }\n            } else {\n              Assert(!\"error: expected LF_METHODLIST\");\n            }\n          }\n        } break;\n        case CV_LeafKind_ONEMETHOD: {\n          // parse CodeView method\n          CV_LeafOneMethod *one_method = (CV_LeafOneMethod *) (src.data.str + cursor);\n          CV_MethodProp     prop       = CV_FieldAttribs_Extract_MethodProp(one_method->attribs);\n          cursor += sizeof(CV_LeafOneMethod);\n          U32 vftable_offset = 0;\n          if (prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro) {\n            str8_deserial_read_struct(src.data, cursor, &vftable_offset);\n            cursor += sizeof(vftable_offset);\n          }\n          String8 name = str8_cstring_capped(src.data.str + cursor, src.data.str + src.data.size);\n          cursor += name.size + 1;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB member\n          member->kind                  = RDI_MemberKind_Method;\n          member->method.kind           = lnk_rdib_method_kind_from_cv_prop(prop);\n          member->method.name           = name;\n          member->method.type_ref       = lnk_rdib_type_from_itype(task, one_method->itype);\n          member->method.vftable_offset = vftable_offset;\n        } break;\n        case CV_LeafKind_NESTTYPE: {\n          // parse CodeView nested type\n          CV_LeafNestType *nest_type = (CV_LeafNestType *) (src.data.str + cursor);\n          String8          name      = str8_cstring_capped(nest_type + 1, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafNestType);\n          cursor += name.size + 1;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB nested type member\n          member->kind                 = RDI_MemberKind_NestedType;\n          member->nested_type.name     = name;\n          member->nested_type.type_ref = lnk_rdib_type_from_itype(task, nest_type->itype);\n        } break;\n        case CV_LeafKind_NESTTYPEEX: {\n          // parse CodeView nested type extended\n          CV_LeafNestTypeEx *nest_type_ex = (CV_LeafNestTypeEx *) (src.data.str + cursor);\n          String8            name         = str8_cstring_capped(nest_type_ex + 1, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafNestTypeEx);\n          cursor += name.size + 1;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB nested type member\n          member->kind                 = RDI_MemberKind_NestedType;\n          member->nested_type.name     = name;\n          member->nested_type.type_ref = lnk_rdib_type_from_itype(task, nest_type_ex->itype);\n        } break;\n        case CV_LeafKind_BCLASS: {\n          // parse CodeView base class member\n          CV_LeafBClass    *bclass = (CV_LeafBClass *) (src.data.str + cursor);\n          CV_NumericParsed  offset = cv_numeric_from_data_range((U8 *)(bclass + 1), src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafBClass);\n          cursor += offset.encoded_size;\n\n          U64 offset64 = cv_u64_from_numeric(&offset);\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB base class member\n          member->kind                = RDI_MemberKind_Base;\n          member->base_class.type_ref = lnk_rdib_type_from_itype(task, bclass->itype);\n          member->base_class.offset   = offset64;\n        } break;\n        case CV_LeafKind_VBCLASS:\n        case CV_LeafKind_IVBCLASS: {\n          // parse CodeView virtual base class\n          CV_LeafVBClass   *vbclass    = (CV_LeafVBClass *) (src.data.str + cursor);\n          CV_NumericParsed  vbptr_off  = cv_numeric_from_data_range(src.data.str + cursor + sizeof(*vbclass), src.data.str + src.data.size);\n          CV_NumericParsed  vtable_off = cv_numeric_from_data_range(src.data.str + cursor + sizeof(*vbclass) + vbptr_off.encoded_size, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafVBClass);\n          cursor += vbptr_off.encoded_size;\n          cursor += vtable_off.encoded_size;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB virtual base class member\n          member->kind                          = RDI_MemberKind_VirtualBase;\n          member->virtual_base_class.type_ref   = lnk_rdib_type_from_itype(task, vbclass->itype);\n          member->virtual_base_class.vbptr_off  = cv_u64_from_numeric(&vbptr_off);\n          member->virtual_base_class.vtable_off = cv_u64_from_numeric(&vtable_off);\n        } break;\n        case CV_LeafKind_VFUNCTAB: {\n          // parse CodeView virtual function table\n          CV_LeafVFuncTab *vfunc_tab = (CV_LeafVFuncTab *) (src.data.str + cursor);\n          cursor += sizeof(*vfunc_tab);\n\n          // TODO: we don't have an equivalent in RDI\n        } break;\n        case CV_LeafKind_ENUMERATE: {\n          // parse CodeView enum member\n          CV_LeafEnumerate *enumerate = (CV_LeafEnumerate *) (src.data.str + cursor);\n          CV_NumericParsed  value     = cv_numeric_from_data_range((U8 *) (enumerate + 1), src.data.str + src.data.size);\n          String8           name      = str8_cstring_capped(src.data.str + cursor + sizeof(CV_LeafEnumerate) + value.encoded_size, src.data.str + src.data.size);\n          cursor += sizeof(CV_LeafEnumerate);\n          cursor += value.encoded_size;\n          cursor += name.size + 1;\n\n          // push new node\n          RDIB_UDTMember *member = rdib_udt_member_chunk_list_push(arena, rdib_member_list, task->udt_cap);\n          rdib_udt_member_list_push_node(&dst->members.list, member);\n\n          // fill out RDIB enum member\n          member->kind            = RDI_MemberKind_NULL;\n          member->enumerate.name  = name;\n          member->enumerate.value = cv_u64_from_numeric(&value);\n        } break;\n        default: InvalidPath;\n        }\n\n        cursor = AlignPow2(cursor, 4);\n      }\n    } break;\n    case CV_LeafKind_METHODLIST: {\n      // see CV_LeafKind_METHOD\n    } break;\n    case CV_LeafKind_LABEL: {\n      // ???\n    } break;\n    case CV_LeafKind_VTSHAPE: {\n      RDIB_Type *dst = lnk_push_converted_codeview_type(arena, &task->rdib_types_lists[task_id], task->tpi_itype_map, itype);\n      dst->kind = RDI_TypeKindExt_VirtualTable;\n      // ???\n    } break;\n    case CV_LeafKind_VFTABLE: {\n      // ???\n    } break;\n    default: InvalidPath; break;\n    }\n\n#undef push_converted_type\n  }\n  ProfEnd();\n}\n\ninternal U64\nlnk_src_file_hash_cv(String8 normal_full_path, CV_C13ChecksumKind checksum_kind, String8 checksum)\n{\n  XXH3_state_t state;\n  XXH3_INITSTATE(&state);\n  XXH3_64bits_reset(&state);\n  XXH3_64bits_update(&state, normal_full_path.str, normal_full_path.size);\n  XXH3_64bits_update(&state, &checksum_kind, sizeof(checksum_kind));\n  XXH3_64bits_update(&state, checksum.str, checksum.size);\n  XXH64_hash_t result = XXH3_64bits_digest(&state);\n  return result;\n}\n\ninternal String8\nlnk_normalize_src_file_path(Arena *arena, String8 file_path)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 result = file_path;\n  result = lower_from_str8(scratch.arena, result);\n  result = path_convert_slashes(scratch.arena, result, PathStyle_UnixAbsolute);\n  result = push_str8_copy(arena, result);\n  scratch_end(scratch);\n  return result;\n}\n\ninternal LNK_SourceFileBucket *\nlnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **buckets,\n                                    U64                    cap,\n                                    U64                    hash,\n                                    String8                normal_path,\n                                    CV_C13ChecksumKind    checksum_kind,\n                                    String8                checksum)\n{\n  U64 best_idx   = hash % cap;\n  U64 bucket_idx = best_idx;\n\n  RDIB_SourceFile temp  = {0};\n  temp.normal_full_path = normal_path;\n  temp.checksum_kind    = checksum_kind;\n  temp.checksum         = checksum;\n\n  do {\n    if (buckets[bucket_idx] == 0) {\n      break;\n    }\n    if (rdib_source_file_match(buckets[bucket_idx]->src_file, &temp, OperatingSystem_CURRENT)) {\n      return buckets[bucket_idx];\n    }\n    bucket_idx = (bucket_idx + 1) % cap;\n  } while (bucket_idx != best_idx);\n\n  return 0;\n}\n\n\ninternal LNK_SourceFileBucket *\nlnk_src_file_insert_or_update(LNK_SourceFileBucket **buckets, U64 cap, U64 hash, LNK_SourceFileBucket *new_bucket)\n{\n  LNK_SourceFileBucket *result = 0;\n\n  U64 best_idx = hash % cap;\n  U64 idx      = best_idx;\n  do {\n    retry:;\n    LNK_SourceFileBucket *curr_bucket = buckets[idx];\n\n    if (curr_bucket == 0) {\n      LNK_SourceFileBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        result = curr_bucket;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    } else if (rdib_source_file_match(curr_bucket->src_file, new_bucket->src_file, OperatingSystem_CURRENT)) {\n      // do we need to update value in the bucket?\n      int cmp = u64_compar(&curr_bucket->obj_idx, &new_bucket->obj_idx);\n      if (cmp <= 0) {\n        // are we inserting bucket that was already inserterd?\n        Assert(cmp < 0);\n\n        // don't need to update, more recent value is in the bucket\n        break;\n      }\n\n      LNK_SourceFileBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        result = compare_bucket;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    }\n\n    // advance\n    idx = (idx + 1);\n    idx = idx == cap ? 0 : idx;\n  } while (idx != best_idx);\n\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_count_source_files_task)\n{\n  U64                              unit_idx        = task_id;\n  LNK_ConvertSourceFilesToRDITask *task            = raw_task;\n  CV_DebugS                        debug_s         = task->debug_s_arr[unit_idx];\n  String8List                      raw_chksms_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms);\n\n  U64 count = 0;\n\n  for (String8Node *raw_chksms_n = raw_chksms_list.first; raw_chksms_n != 0; raw_chksms_n = raw_chksms_n->next) {\n    for(U64 cursor = 0; cursor + sizeof(CV_C13Checksum) <= raw_chksms_n->string.size; ) {\n      // parse header\n      CV_C13Checksum *header = (CV_C13Checksum *) (raw_chksms_n->string.str + cursor);\n\n      // update count\n      ++count;\n\n      // advance cursor\n      cursor += sizeof(*header);\n      cursor += header->len;\n      cursor = AlignPow2(cursor, CV_FileCheckSumsAlign);\n    }\n  }\n\n  // update total count\n  ins_atomic_u64_add_eval(&task->total_src_file_count, count);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_insert_src_files_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  U64                              obj_idx         = task_id;\n  LNK_ConvertSourceFilesToRDITask *task            = raw_task;\n  CV_DebugS                        debug_s         = task->debug_s_arr[obj_idx];\n  String8List                      raw_chksms_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms);\n  String8List                      raw_strtab_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable);\n\n  if (raw_strtab_list.node_count > 1) {\n    lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], \"Multiple string table sub-sections, picking first one.\");\n  }\n  if (raw_chksms_list.node_count > 1) {\n    lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], \"Multiple file checksum sub-sections, picking first one.\");\n  }\n\n  String8               string_table = cv_string_table_from_debug_s(debug_s);\n  LNK_SourceFileBucket *curr_bucket  = 0;\n\n  for (String8Node *raw_chksms_n = raw_chksms_list.first; raw_chksms_n != 0; raw_chksms_n = raw_chksms_n->next) {\n    for (U64 cursor = 0; cursor + sizeof(CV_C13Checksum) <= raw_chksms_n->string.size; ) {\n      // parse header\n      CV_C13Checksum *header = (CV_C13Checksum *) (raw_chksms_n->string.str + cursor);\n\n      // grab checksum\n      String8 checksum = str8_substr(raw_chksms_n->string, rng_1u64(cursor + sizeof(CV_C13Checksum), \n                                                                    cursor + sizeof(CV_C13Checksum) + header->len));\n\n      // grab file path\n      Assert(header->name_off < string_table.size);\n      String8 file_path = str8_cstring_capped(string_table.str + header->name_off, string_table.str + string_table.size);\n\n      // normalize file path\n      String8 normal_path = lnk_normalize_src_file_path(arena, file_path);\n\n      // push new bucket\n      if (curr_bucket == 0) {\n        curr_bucket           = push_array(arena, LNK_SourceFileBucket, 1);\n        curr_bucket->src_file = push_array(arena, RDIB_SourceFile, 1);\n      }\n\n      // fill out obj idx so we can decide which source file to keep in the hash table\n      curr_bucket->obj_idx = obj_idx;\n\n      // fill out part with source file info\n      curr_bucket->src_file->file_path        = file_path;\n      curr_bucket->src_file->normal_full_path = normal_path;\n      curr_bucket->src_file->checksum_kind    = rdi_checksum_from_cv_c13(header->kind);\n      curr_bucket->src_file->checksum         = checksum;\n      curr_bucket->src_file->line_table_frags = 0;\n\n      // insert bucket\n      U64                   normal_path_hash = lnk_src_file_hash_cv(normal_path, header->kind, checksum);\n      LNK_SourceFileBucket *insert_result    = lnk_src_file_insert_or_update(task->src_file_buckets, task->src_file_buckets_cap, normal_path_hash, curr_bucket);\n\n      if (curr_bucket == insert_result) {\n        // bucket was inserted into empty slot, reset current bucket\n        curr_bucket = 0;\n      } else if (curr_bucket != insert_result) {\n        // reuse evicted bucket\n        curr_bucket = insert_result;\n      }\n\n      // advance cursor\n      cursor += sizeof(*header);\n      cursor += header->len;\n      cursor = AlignPow2(cursor, CV_FileCheckSumsAlign);\n    }\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal RDIB_Type *\nlnk_find_container_type(String8 name, Rng1U64 tpi_itype_range, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap, RDIB_Type **tpi_itype_map)\n{\n  CV_TypeIndex container_itype = 0;\n\n  String8 delim     = str8_lit(\"::\");\n  U64     delim_pos = str8_find_needle_reverse(name, 0, delim, 0);\n  if (delim_pos > 0) {\n    U64     container_name_size = delim_pos - delim.size;\n    String8 container_name      = str8_prefix(name, container_name_size);\n    container_itype = lnk_udt_name_hash_table_lookup_itype(udt_name_buckets, udt_name_buckets_cap, container_name);\n  }\n\n  RDIB_Type *container = 0;\n  if (container_itype > 0) {\n    Assert(container_itype < tpi_itype_range.max);\n    container = tpi_itype_map[container_itype];\n  }\n\n  return container;\n}\n\ninternal RDIB_Type *\nlnk_type_from_itype(CV_TypeIndex itype, Rng1U64 tpi_itype_range, RDIB_Type **tpi_itype_map, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset)\n{\n  RDIB_Type *type = 0;\n  if (itype < tpi_itype_range.max) {\n    type = tpi_itype_map[itype];\n  } else {\n    lnk_error_obj(LNK_Error_CvIllSymbolData, obj, \"Out of bounds type index 0x%x in S_%S @ 0x%llx.\",\n                  itype, cv_string_from_sym_kind(symbol_kind), symbol_offset);\n  }\n  return type;\n}\n\ninternal U64\nlnk_voff_from_sect_off(U64 sect_idx, U64 sect_off, COFF_SectionHeaderArray image_sects, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset)\n{\n  U64 voff = 0;\n  if (sect_idx < image_sects.count) {\n    voff = image_sects.v[sect_idx].voff + sect_off;\n  } else {\n    lnk_error_obj(LNK_Error_CvIllSymbolData, obj, \"Out of bounds section index 0x%x in S_%S @ 0x%llx.\",\n                  sect_idx, cv_string_from_sym_kind(symbol_kind), symbol_offset);\n  }\n  return voff;\n}\n\ninternal Rng1U64\nlnk_virt_range_from_sect_off_size(U64 sect_idx, U64 sect_off, U64 size, COFF_SectionHeaderArray image_sects, LNK_Obj *obj, CV_SymKind symbol_kind, U64 symbol_offset)\n{\n  Rng1U64 virt_range = {0};\n  if (sect_idx < image_sects.count) {\n    U64 voff = image_sects.v[sect_idx].voff + sect_off;\n    virt_range = rng_1u64(voff, voff + size);\n  } else {\n    lnk_error_obj(LNK_Error_CvIllSymbolData, obj, \"Out of bounds section index 0x%x in S_%S @ 0x%llx.\",\n                  sect_idx, cv_string_from_sym_kind(symbol_kind), symbol_offset);\n  }\n  return virt_range;\n}\n\ninternal void\nlnk_error_on_invalid_defrange_symbol(LNK_Obj *obj, CV_Symbol symbol)\n{\n  lnk_error_obj(LNK_Error_CvIllSymbolData, obj, \"Unable to parse symbol stream, unexpected S_%S without preceding S_LOCAL @ 0x%llx.\",\n                cv_string_from_sym_kind(symbol.kind), symbol.offset);\n}\n\ninternal void\nlnk_error_on_missing_cv_frameproc(LNK_Obj *obj, CV_Symbol symbol)\n{\n  lnk_error_obj(LNK_Error_CvIllSymbolData, obj, \"Missing S_FRAMEPROC, unable to parse S_%S @ 0x%llx.\",\n                cv_string_from_sym_kind(symbol.kind), symbol.offset);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_find_obj_compiler_info_task)\n{\n  ProfBeginFunction();\n\n  LNK_ConvertUnitToRDITask *task           = raw_task;\n  CV_SymbolListArray        parsed_symbols = task->parsed_symbols[task_id];\n  LNK_CodeViewCompilerInfo *comp_info      = &task->comp_info_arr[task_id];\n\n  comp_info->arch          = (CV_Arch)~0u;\n  comp_info->language      = (CV_Language)~0u;\n  comp_info->compiler_name = str8_zero();\n\n  // infer unit compiler data from S_COMPILE* which always follows S_OBJ\n  for (U64 symbol_list_idx = 0; symbol_list_idx < parsed_symbols.count; ++symbol_list_idx) {\n    CV_SymbolList symbol_list = parsed_symbols.v[symbol_list_idx];\n    for (CV_SymbolNode *symbol_n = symbol_list.first; symbol_n != 0; symbol_n = symbol_n->next) {\n      CV_Symbol symbol = symbol_n->data;\n      if (symbol.kind == CV_SymKind_COMPILE) {\n        AssertAlways(sizeof(CV_SymCompile) <= symbol.data.size);\n        CV_SymCompile *compile = (CV_SymCompile *)symbol.data.str;\n        comp_info->arch          = compile->machine;\n        comp_info->language      = CV_CompileFlags_Extract_Language(compile->flags);\n        comp_info->compiler_name = str8_cstring_capped(compile + 1, symbol.data.str + symbol.data.size);\n        goto exit;\n      } else if (symbol.kind == CV_SymKind_COMPILE2) {\n        AssertAlways(sizeof(CV_SymCompile2) <= symbol.data.size);\n        CV_SymCompile2 *compile2 = (CV_SymCompile2 *)symbol.data.str;\n        comp_info->arch          = compile2->machine;\n        comp_info->language      = CV_Compile2Flags_Extract_Language(compile2->flags);\n        comp_info->compiler_name = str8_cstring_capped(compile2 + 1, symbol.data.str + symbol.data.size);\n        goto exit;\n      } else if (symbol.kind == CV_SymKind_COMPILE3) {\n        AssertAlways(sizeof(CV_SymCompile3) <= symbol.data.size);\n        CV_SymCompile3 *compile3 = (CV_SymCompile3 *)symbol.data.str;\n        comp_info->arch          = compile3->machine;\n        comp_info->language      = CV_Compile3Flags_Extract_Language(compile3->flags);\n        comp_info->compiler_name = str8_cstring_capped(compile3 + 1, symbol.data.str + symbol.data.size);\n        goto exit;\n      }\n    }\n  }\n  exit:;\n\n  LNK_Obj *obj = task->obj_arr[task_id];\n\n  // fill out unit info\n  U64 unit_chunk_idx = task_id / task->unit_chunk_cap;\n  U64 local_unit_idx = task_id - unit_chunk_idx * task->unit_chunk_cap;\n\n  RDIB_Unit *dst     = &task->units[unit_chunk_idx].v[local_unit_idx];\n  dst->arch          = rdi_arch_from_cv_arch(comp_info->arch);\n  dst->unit_name     = str8_skip_last_slash(obj->path);\n  dst->compiler_name = comp_info->compiler_name;\n  dst->source_file   = str8_zero();\n  dst->object_file   = push_str8_copy(arena, obj->path);\n  dst->archive_file  = lnk_obj_get_lib_path(obj);\n  dst->build_path    = str8_zero();\n  dst->language      = rdi_language_from_cv_language(comp_info->language);\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_convert_line_tables_to_rdi_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  U64                       unit_idx = task_id;\n  LNK_ConvertUnitToRDITask *task     = raw_task;\n  LNK_Obj                  *obj      = task->obj_arr[unit_idx];\n  CV_DebugS                 debug_s  = task->debug_s_arr[unit_idx];\n\n  U64        unit_chunk_idx = unit_idx / task->unit_chunk_cap;\n  U64        local_unit_idx = unit_idx - unit_chunk_idx * task->unit_chunk_cap;\n  RDIB_Unit *dst            = &task->units[unit_chunk_idx].v[local_unit_idx];\n\n  // find sub sections\n  String8     raw_string_table = cv_string_table_from_debug_s(debug_s);\n  String8     raw_file_chksms  = cv_file_chksms_from_debug_s(debug_s);\n  String8List raw_lines_list   = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines);\n\n  // emit line table fragments for each source file from C13 line info\n  dst->line_table = rdib_line_table_chunk_list_push(arena, &task->line_tables[worker_id], task->line_table_cap);\n\n  for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) {\n    String8               raw_lines   = raw_lines_node->string;\n    CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(scratch.arena, raw_lines, rng_1u64(0, raw_lines.size));\n    for (CV_C13LinesHeaderNode *lines_node = parsed_list.first; lines_node != 0; lines_node = lines_node->next) {\n      CV_C13LinesHeader parsed_lines = lines_node->v;\n\n      // parse checksum header\n      if (parsed_lines.file_off + sizeof(CV_C13Checksum) > raw_file_chksms.size) {\n        lnk_error_obj(LNK_Warning_IllData, obj, \"Out of bounds $$FILE_CHECKSUM offset (0x%llx) in line table header.\", parsed_lines.file_off);\n        continue;\n      }\n      CV_C13Checksum *checksum_header = (CV_C13Checksum *) (raw_file_chksms.str + parsed_lines.file_off);\n      if (parsed_lines.file_off + sizeof(CV_C13Checksum) + checksum_header->len > raw_file_chksms.size) {\n        lnk_error_obj(LNK_Warning_IllData, obj, \"Not enough bytes to read file checksum @ 0x%llx.\", parsed_lines.file_off);\n        continue;\n      }\n      String8 file_path      = str8_cstring_capped(raw_string_table.str + checksum_header->name_off, raw_string_table.str + raw_string_table.size);\n      String8 checksum_bytes = str8((U8 *) (checksum_header + 1), checksum_header->len);\n\n      // read out lines\n      if (0 == parsed_lines.sec_idx || parsed_lines.sec_idx > task->image_sects.count) {\n        lnk_error_obj(LNK_Warning_IllData, obj, \"Out of bounds section index (%u) in $$LINES; skip line info for \\\"%S\\\".\", parsed_lines.sec_idx, file_path);\n        continue;\n      }\n      COFF_SectionHeader *sect  = &task->image_sects.v[parsed_lines.sec_idx];\n      CV_LineArray        lines = cv_c13_line_array_from_data(arena, raw_lines, sect->voff, parsed_lines);\n\n      // find source file for this line table\n      String8               normal_path     = lnk_normalize_src_file_path(scratch.arena, file_path);\n      U64                   src_file_hash   = lnk_src_file_hash_cv(normal_path, checksum_header->kind, checksum_bytes);\n      LNK_SourceFileBucket *src_file_bucket = lnk_src_file_hash_table_lookup_slot(task->src_file_buckets, task->src_file_buckets_cap, src_file_hash, normal_path, checksum_header->kind, checksum_bytes);\n      if (src_file_bucket == 0) {\n        lnk_error_obj(LNK_Error_UnexpectedCodePath, obj, \"Unable to find source file in the hash table: \\\"%S\\\".\", file_path);\n        continue;\n      }\n      RDIB_SourceFile *src_file = src_file_bucket->src_file;\n\n      // fill out line table fragment and atomically insert\n      RDIB_LineTableFragment *frag = rdib_line_table_push(arena, dst->line_table);\n      frag->src_file   = src_file;\n      frag->voffs      = lines.voffs;\n      frag->line_nums  = lines.line_nums;\n      frag->col_nums   = lines.col_nums;\n      frag->line_count = lines.line_count;\n      frag->col_count  = lines.col_count;\n\n      // build list of line table fragments per file\n      frag->next_src_file = ins_atomic_ptr_eval_assign(&src_file->line_table_frags, frag);\n    }\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_build_inlinee_lines_accels_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_ConvertUnitToRDITask *task    = raw_task;\n  CV_DebugS                 debug_s = task->debug_s_arr[task_id];\n\n  String8List                   raw_inlinee_lines   = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines);\n  CV_C13InlineeLinesParsedList  inlinee_lines       = cv_c13_inlinee_lines_from_sub_sections(arena, raw_inlinee_lines);\n  CV_InlineeLinesAccel         *inlinee_lines_accel = cv_c13_make_inlinee_lines_accel(arena, inlinee_lines);\n\n  task->inlinee_lines_accel_arr[task_id] = inlinee_lines_accel;\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_convert_symbols_to_rdi_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_ConvertUnitToRDITask *task                = raw_task;\n  LNK_CodeViewSymbolsInput  symbols_input       = task->symbol_inputs[task_id];\n  LNK_Obj                  *obj                 = task->obj_arr[symbols_input.obj_idx];\n  LNK_CodeViewCompilerInfo  comp_info           = task->comp_info_arr[symbols_input.obj_idx];\n  CV_InlineeLinesAccel     *inlinee_lines_accel = task->inlinee_lines_accel_arr[symbols_input.obj_idx];\n\n  RDI_Arch arch_rdi = rdi_arch_from_cv_arch(comp_info.arch);\n\n  struct ScopeFrame {\n    struct ScopeFrame *prev;\n    RDIB_Scope        *scope;\n    RDIB_Procedure    *proc;\n    CV_ProcFlags       proc_flags;\n    CV_SymFrameproc   *frameproc;\n    U64                param_count;\n    U64                regrel32_idx;\n    RDIB_Variable     *defrange_target;\n  };\n#define push_scope_frame() do { \\\n  struct ScopeFrame *frame; \\\n  if (free_scope_stack != 0) { \\\n    frame = free_scope_stack; \\\n    SLLStackPop_N(free_scope_stack, prev); \\\n  } else { \\\n    frame = push_array(scratch.arena, struct ScopeFrame, 1); \\\n  } \\\n  SLLStackPush_N(scope_stack, frame, prev); \\\n} while (0)\n\n  struct ScopeFrame *scope_stack      = 0;\n  struct ScopeFrame *free_scope_stack = 0;\n\n  // root frame\n  push_scope_frame();\n\n  for (CV_SymbolNode *symbol_n = symbols_input.symbol_list->first; symbol_n != 0; symbol_n = symbol_n->next) {\n    CV_Symbol symbol = symbol_n->data;\n\n    switch (symbol.kind) {\n    case CV_SymKind_COMPILE:\n    case CV_SymKind_COMPILE2:\n    case CV_SymKind_COMPILE3: {\n      // handled above\n    } break;\n    case CV_SymKind_INLINESITE_END:\n    case CV_SymKind_END: {\n      if (scope_stack != 0) {\n        // move top frame to free stack\n        struct ScopeFrame *free_frame = scope_stack;\n        SLLStackPop_N(scope_stack, prev);\n        SLLStackPush_N(free_scope_stack, free_frame, prev);\n      } else {\n        lnk_error_obj(LNK_Error_CvIllSymbolData, obj, \"Encountered unbalanced blocks. Unable to finish symbol parse.\");\n        goto exit;\n      }\n    } break;\n    case CV_SymKind_BLOCK32: {\n      CV_SymBlock32 *block32    = (CV_SymBlock32 *) symbol.data.str;\n      Rng1U64        virt_range = lnk_virt_range_from_sect_off_size(block32->sec, block32->off, block32->len, task->image_sects, obj, symbol.kind, symbol.offset);\n\n      // push new scope node\n      RDIB_Scope *scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap);\n\n      // fill out scope\n      scope->container_proc = scope_stack->proc;\n      scope->parent         = scope_stack->scope;\n      SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, scope, next_sibling);\n      rng1u64_list_push(arena, &scope->ranges, virt_range);\n\n#if 0\n      if (scope->parent) {\n        Assert(virt_range.min >= scope->parent->ranges.first->v.min);\n        Assert(virt_range.max <= scope->parent->ranges.first->v.max);\n      }\n#endif\n\n      // push new scope stack frame\n      push_scope_frame();\n      scope_stack->scope      = scope;\n      scope_stack->proc       = scope->container_proc;\n      scope_stack->proc_flags = scope_stack->proc_flags;\n      scope_stack->frameproc  = scope_stack->prev->frameproc;\n    } break;\n    case CV_SymKind_GDATA32:\n    case CV_SymKind_LDATA32: {\n      CV_SymData32 *data32         = (CV_SymData32 *) symbol.data.str;\n      String8       name           = str8_cstring_capped(data32 + 1, symbol.data.str + symbol.data.size);\n      RDIB_Type    *type           = lnk_type_from_itype(data32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n      RDIB_Type    *container_type = lnk_find_container_type(name, task->tpi_itype_range, task->udt_name_buckets, task->udt_name_buckets_cap, task->tpi_itype_map);\n      U64           data_voff      = lnk_voff_from_sect_off(data32->sec, data32->off, task->image_sects, obj, symbol.kind, symbol.offset);\n\n      B32 is_comp_gen = symbol.kind == CV_SymKind_LDATA32 && name.size == 0 && type == 0;\n      if (!is_comp_gen) {\n\n      // get link name through virtual offset look up\n      String8 link_name = {0};\n      if (symbol.kind == CV_SymKind_GDATA32) {\n        BucketNode *pair = hash_table_search_u64(task->extern_symbol_voff_ht, data_voff);\n        if (pair != 0) {\n          LNK_Symbol *link_symbol = pair->v.value_raw;\n          link_name = link_symbol->name;\n        }\n      }\n\n      // make module relative location\n      RDIB_LocationList locations = {0};\n      {\n        RDIB_EvalBytecode bytecode = {0};\n        rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_ModuleOff, data_voff);\n\n        U64 data_size = rdib_size_from_type(type);\n        if (data_size == 0) {\n          data_size = max_U64;\n        }\n\n        Rng1U64List ranges = {0};\n        rng1u64_list_push(arena, &ranges, rng_1u64(data_voff, data_voff + data_size));\n\n        RDIB_Location location = rdib_make_location_addr_byte_stream(ranges, bytecode);\n        rdib_location_list_push(arena, &locations, location);\n      }\n\n      RDIB_VariableChunkList *var_chunk_list = symbol.kind == CV_SymKind_GDATA32 ?\n                                               &task->extern_gvars[worker_id] : &task->static_gvars[worker_id];\n\n      // push new node\n      RDIB_Variable *gvar  = rdib_variable_chunk_list_push(arena, var_chunk_list, task->symbol_chunk_cap);\n      gvar->link_flags     = symbol.kind == CV_SymKind_GDATA32 ? RDI_LinkFlag_External : 0;\n      gvar->name           = name;\n      gvar->link_name      = link_name;\n      gvar->type           = type;\n      gvar->container_type = container_type;\n      gvar->container_proc = scope_stack->proc;\n      gvar->locations      = locations;\n      }\n    } break;\n    case CV_SymKind_LTHREAD32:\n    case CV_SymKind_GTHREAD32: {\n      CV_SymThread32 *thread32       = (CV_SymThread32 *) symbol.data.str;\n      String8         name           = str8_cstring_capped(thread32 + 1, symbol.data.str + symbol.data.size);\n      RDIB_Type      *type           = lnk_type_from_itype(thread32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n      RDIB_Type      *container_type = lnk_find_container_type(name, task->tpi_itype_range, task->udt_name_buckets, task->udt_name_buckets_cap, task->tpi_itype_map);\n\n      // make TLS offset location\n      RDIB_LocationList locations = {0};\n      {\n        RDIB_EvalBytecode bytecode = {0};\n        rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_TLSOff, thread32->tls_off);\n          \n        Rng1U64List ranges = {0};\n        rng1u64_list_push(arena, &ranges, rng_1u64(0, max_U64));\n\n        RDIB_Location location = rdib_make_location_addr_byte_stream(ranges, bytecode);\n        rdib_location_list_push(arena, &locations, location);\n      }\n\n      // push new node\n      RDIB_VariableChunkList *tvar_list = symbol.kind == CV_SymKind_GTHREAD32 ? &task->extern_tvars[worker_id] : &task->static_tvars[worker_id];\n      RDIB_Variable          *tvar      = rdib_variable_chunk_list_push(arena, tvar_list, task->symbol_chunk_cap);\n\n      // fill out thread variable\n      tvar->link_flags     = symbol.kind == CV_SymKind_GTHREAD32 ? RDI_LinkFlag_External : 0;\n      tvar->name           = name;\n      tvar->link_name      = str8(0,0);\n      tvar->type           = type;\n      tvar->container_type = container_type;\n      tvar->container_proc = scope_stack->proc;\n      tvar->locations      = locations;\n    } break;\n    case CV_SymKind_LPROC32_ID:\n    case CV_SymKind_GPROC32_ID: {\n      AssertAlways(!\"linker converts *_ID symbols in post-process step, if we ever get to this case then we have a bug in post-process step\");\n    } break;\n    case CV_SymKind_LPROC32:\n    case CV_SymKind_GPROC32: {\n      CV_SymProc32 *proc32     = (CV_SymProc32 *) symbol.data.str;\n      String8       name       = str8_cstring_capped(proc32 + 1, symbol.data.str + symbol.data.size);\n      RDIB_Type    *type       = lnk_type_from_itype(proc32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n      Rng1U64       virt_range = lnk_virt_range_from_sect_off_size(proc32->sec, proc32->off, proc32->len, task->image_sects, obj, symbol.kind, symbol.offset);\n\n      // infer container type for method\n      RDIB_Type *container_type = 0;\n      if (type != 0) {\n        if (type->kind == RDI_TypeKind_Method) {\n          container_type = (RDIB_Type *) type->method.class_type;\n        } else if (type->kind == RDI_TypeKindExt_StaticMethod) {\n          container_type = (RDIB_Type *) type->static_method.class_type;\n        }\n      }\n\n      // get link name through virtual offset look up\n      String8 link_name = str8(0,0);\n      if (symbol.kind == CV_SymKind_GPROC32) {\n        LNK_Symbol *link_symbol = hash_table_search_u64_raw(task->extern_symbol_voff_ht, virt_range.min);\n        if (link_symbol) {\n          link_name = link_symbol->name;\n        }\n      }\n\n      // scan ahead for context S_FRAMEPROC (must be defined in scope of PROC symbol)\n      CV_SymFrameproc *frameproc = 0;\n      {\n        U64 depth = 1;\n        for (CV_SymbolNode *lookahead = symbol_n->next; lookahead != 0; lookahead = lookahead->next) {\n          if (lookahead->data.kind == CV_SymKind_FRAMEPROC) {\n            frameproc = (CV_SymFrameproc *) lookahead->data.data.str;\n            break;\n          }\n          if (cv_is_scope_symbol(lookahead->data.kind)) {\n            ++depth;\n          } else if (cv_is_end_symbol(lookahead->data.kind)) {\n            --depth;\n            if (depth == 0) {\n              break;\n            }\n          }\n        }\n      }\n\n      // push new procedure node\n      RDIB_ProcedureChunkList *proc_list = symbol.kind == CV_SymKind_GPROC32 ? &task->extern_procs[worker_id] : &task->static_procs[worker_id];\n      RDIB_Procedure          *proc      = rdib_procedure_chunk_list_push(arena, proc_list, task->symbol_chunk_cap);\n\n      // push new scope node\n      RDIB_Scope *root_scope     = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap);\n      root_scope->container_proc = proc;\n      root_scope->parent         = scope_stack->scope;\n      if (scope_stack->scope != 0) {\n        SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, root_scope, next_sibling);\n      }\n      rng1u64_list_push(arena, &root_scope->ranges, virt_range);\n\n      // fill out procedure\n      proc->link_flags     = symbol.kind == CV_SymKind_GPROC32 ? RDI_LinkFlag_External : 0;\n      proc->name           = name;\n      proc->link_name      = link_name;\n      proc->type           = type;\n      proc->container_type = container_type;\n      proc->container_proc = scope_stack->proc;\n      proc->scope          = root_scope;\n\n      // push scope frame\n      push_scope_frame();\n      scope_stack->scope      = root_scope;\n      scope_stack->proc       = proc;\n      scope_stack->proc_flags = proc32->flags;\n      scope_stack->frameproc  = frameproc;\n\n      // set number of params for procedure on scope so we can figure out which S_REGREL32 is param\n      {\n        B32 is_proc_scope = (scope_stack->proc->scope == scope_stack->scope);\n        if (is_proc_scope) {\n          RDIB_Type *params = 0;\n          if (scope_stack->proc != 0) {\n            RDIB_Type *proc_type = scope_stack->proc->type;\n            if (proc_type != 0) {\n              if (proc_type->kind == RDI_TypeKind_NULL) {\n                // compiler generates procedures with no type for __try/__except, lambdas, and etc.\n              } else if (proc_type->kind == RDI_TypeKind_Function) {\n                params = (RDIB_Type *)proc_type->func.params_type;\n              } else if (proc_type->kind == RDI_TypeKind_Method) {\n                params = (RDIB_Type *)proc_type->method.params_type;\n              } else if (proc_type->kind == RDI_TypeKindExt_StaticMethod) {\n                params = (RDIB_Type *)proc_type->static_method.params_type;\n              } else {\n                InvalidPath;\n              }\n            }\n          }\n          if (params != 0) {\n            AssertAlways(params->kind == RDI_TypeKindExt_Params);\n            scope_stack->param_count  = params->params.count;\n            scope_stack->regrel32_idx = 0;\n          }\n        }\n      }\n    } break;\n    case CV_SymKind_THUNK32: {\n      CV_SymThunk32 *thunk32    = (CV_SymThunk32 *) symbol.data.str;\n      String8        name       = str8_cstring_capped(thunk32 + 1, symbol.data.str + symbol.data.size);\n      Rng1U64        virt_range = lnk_virt_range_from_sect_off_size(thunk32->sec, thunk32->off, thunk32->len, task->image_sects, obj, symbol.kind, symbol.offset);\n\n      // scan ahead for context S_FRAMEPROC (must be defined in scope of PROC symbol)\n      CV_SymFrameproc *frameproc = 0;\n      {\n        U64 depth = 1;\n        for (CV_SymbolNode *lookahead = symbol_n->next; lookahead != 0; lookahead = lookahead->next) {\n          if (lookahead->data.kind == CV_SymKind_FRAMEPROC) {\n            frameproc = (CV_SymFrameproc *) lookahead->data.data.str;\n            break;\n          }\n          if (cv_is_scope_symbol(lookahead->data.kind)) {\n            ++depth;\n          } else if (cv_is_end_symbol(lookahead->data.kind)) {\n            --depth;\n            if (depth == 0) {\n              break;\n            }\n          }\n        }\n      }\n\n      // push new procedure node\n      RDIB_ProcedureChunkList *proc_list = &task->static_procs[worker_id];\n      RDIB_Procedure          *thunk     = rdib_procedure_chunk_list_push(arena, proc_list, task->symbol_chunk_cap);\n\n      // push new scope node\n      RDIB_Scope *root_scope     = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap);\n      root_scope->container_proc = thunk;\n      root_scope->parent         = scope_stack->scope;\n      if (scope_stack->scope != 0) {\n        SLLQueuePush_N(scope_stack->scope->first_child, scope_stack->scope->last_child, root_scope, next_sibling);\n      }\n      rng1u64_list_push(arena, &root_scope->ranges, virt_range);\n\n      // fill out procedure\n      thunk->name  = name;\n      thunk->type  = 0;\n      thunk->scope = root_scope;\n\n      // push scope frame\n      push_scope_frame();\n      scope_stack->scope      = root_scope;\n      scope_stack->proc       = thunk;\n      scope_stack->proc_flags = 0;\n      scope_stack->frameproc  = frameproc;\n    } break;\n    case CV_SymKind_REGREL32: {\n      if (~scope_stack->proc_flags & CV_ProcFlag_OptDbgInfo) {\n        CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *) symbol.data.str;\n        String8         name     = str8_cstring_capped(regrel32 + 1, symbol.data.str + symbol.data.size);\n        RDIB_Type      *type     = lnk_type_from_itype(regrel32->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n\n        RDI_LocalKind local_kind = RDI_LocalKind_Variable;\n        B32           is_ref     = 0;\n        if (scope_stack->regrel32_idx < scope_stack->param_count) {\n          local_kind = RDI_LocalKind_Parameter;\n          if (type != 0) { \n            U64 byte_size = rdib_size_from_type(type);\n            switch (comp_info.arch) {\n            case CV_Arch_8086: is_ref = byte_size > 4 || !IsPow2OrZero(byte_size); break;\n            case CV_Arch_X64:  is_ref = byte_size > 8 || !IsPow2OrZero(byte_size); break;\n            default: NotImplemented;\n            }\n          }\n        }\n\n        // push node\n        RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap);\n        SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local);\n        ++scope_stack->scope->local_count;\n\n        // fill out local\n        local->link_flags = 0;\n        local->name       = name;\n        local->kind       = local_kind;\n        local->type       = type;\n\n        // encode location\n        RDI_RegCode reg_code   = rdi_reg_code_from_cv(comp_info.arch, regrel32->reg);\n        U32         value_size = 8;\n        U32         value_pos  = 0;\n        rdib_push_location_addr_reg_off(arena, &local->locations, arch_rdi, reg_code, value_size, value_pos, (S64)regrel32->reg_off, is_ref, scope_stack->scope->ranges);\n\n        // advance reg rel index\n        ++scope_stack->regrel32_idx;\n      }\n    } break;\n    case CV_SymKind_LOCAL: {\n      CV_SymLocal *sym_local = (CV_SymLocal *) symbol.data.str;\n      String8      name      = str8_cstring_capped(sym_local + 1, symbol.data.str + symbol.data.size);\n      RDIB_Type   *type      = lnk_type_from_itype(sym_local->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n\n      // reset defrange target\n      scope_stack->defrange_target = 0;\n\n      if (sym_local->flags & CV_LocalFlag_Global) {\n        // TODO: apply global modifications\n      } else if (sym_local->flags & CV_LocalFlag_Static) {\n        // TODO: apply local modifications\n      }\n\n      // push New node\n      RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap);\n      SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local);\n      ++scope_stack->scope->local_count;\n\n      // fill out local\n      local->link_flags = 0;\n      local->kind       = sym_local->flags & CV_LocalFlag_Param ? RDI_LocalKind_Parameter : RDI_LocalKind_Variable;\n      local->name       = name;\n      local->type       = type;\n\n      scope_stack->defrange_target = local;\n    } break;\n    case CV_SymKind_FILESTATIC: {\n      CV_SymFileStatic *file_static = (CV_SymFileStatic *) symbol.data.str;\n      String8           name        = str8_cstring_capped(file_static + 1, symbol.data.str + symbol.data.size);\n      RDIB_Type        *type        = lnk_type_from_itype(file_static->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n\n      // push New node\n      RDIB_Variable *local = rdib_variable_chunk_list_push(arena, &task->locals[worker_id], task->symbol_chunk_cap);\n      SLLQueuePush(scope_stack->scope->local_first, scope_stack->scope->local_last, local);\n      ++scope_stack->scope->local_count;\n\n      // fill out local\n      local->link_flags = 0;\n      local->kind       = RDI_LocalKind_Variable;\n      local->name       = name;\n      local->type       = type;\n\n      // set target for following defrange modifications\n      scope_stack->defrange_target = local;\n    } break;\n    case CV_SymKind_DEFRANGE_REGISTER: {\n      if (scope_stack->defrange_target == 0) {\n        lnk_error_on_invalid_defrange_symbol(obj, symbol);\n        break;\n      }\n\n      CV_SymDefrangeRegister *defrange_reg = (CV_SymDefrangeRegister *) symbol.data.str;\n      RDI_RegCode             reg_code     = rdi_reg_code_from_cv(comp_info.arch, defrange_reg->reg);\n      CV_LvarAddrGap         *gaps         = (CV_LvarAddrGap *) (defrange_reg + 1);\n      U64                     gap_count    = (symbol.data.size - sizeof(*defrange_reg)) / sizeof(*gaps);\n\n      Rng1U64       defrange = lnk_virt_range_from_sect_off_size(defrange_reg->range.sec, defrange_reg->range.off, defrange_reg->range.len, task->image_sects, obj, symbol.kind, symbol.offset);\n      Rng1U64List   ranges   = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count);\n      RDIB_Location location = rdib_make_location_val_reg(ranges, reg_code);\n\n      rdib_location_list_push(arena, &scope_stack->defrange_target->locations, location);\n    } break;\n    case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: {\n      if (scope_stack->defrange_target == 0) {\n        lnk_error_on_invalid_defrange_symbol(obj, symbol);\n        break;\n      }\n      if (scope_stack->frameproc == 0) {\n        lnk_error_on_missing_cv_frameproc(obj, symbol);\n        break;\n      }\n\n      CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel *)symbol.data.str;\n      CV_LvarAddrGap                *gaps           = (CV_LvarAddrGap *) (defrange_fprel + 1);\n      U64                            gap_count      = (symbol.data.size - sizeof(*defrange_fprel)) / sizeof(gaps[0]);\n\n      B32                   is_local_param = scope_stack->defrange_target->kind == RDI_LocalKind_Parameter;\n      CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param);\n      CV_Reg                fp_reg         = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg);\n      RDI_RegCode           fp_reg_rdi     = rdi_reg_code_from_cv(comp_info.arch, fp_reg);\n      Rng1U64               defrange       = lnk_virt_range_from_sect_off_size(defrange_fprel->range.sec, defrange_fprel->range.off, defrange_fprel->range.len, task->image_sects, obj, symbol.kind, symbol.offset);\n      Rng1U64List           ranges         = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count);\n      U32                   value_pos      = 0;\n      U32                   value_size     = rdi_addr_size_from_arch(arch_rdi);\n\n      rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, fp_reg_rdi, value_size, value_pos, (S64)defrange_fprel->off, 0, ranges);\n    } break;\n    case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: {\n      if (scope_stack->defrange_target == 0) {\n        lnk_error_on_invalid_defrange_symbol(obj, symbol);\n        break;\n      }\n\n      CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister *) symbol.data.str;\n      CV_LvarAddrGap                 *gaps                       = (CV_LvarAddrGap *) (defrange_subfield_register + 1);\n      U64                             gap_count                  = (symbol.data.size - sizeof(*defrange_subfield_register)) / sizeof(gaps[0]);\n      RDI_RegCode                     reg_rdi                    = rdi_reg_code_from_cv(comp_info.arch, defrange_subfield_register->reg);\n      U32                             value_pos                  = CV_DefrangeSubfieldRegister_Extract_ParentOffset(defrange_subfield_register->field_offset);\n      U32                             value_size                 = cv_size_from_reg(comp_info.arch, defrange_subfield_register->reg) - value_pos;\n      Rng1U64                         defrange                   = lnk_virt_range_from_sect_off_size(defrange_subfield_register->range.sec, defrange_subfield_register->range.off, defrange_subfield_register->range.len, task->image_sects, obj, symbol.kind, symbol.offset);\n      Rng1U64List                     ranges                     = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count);\n\n      rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, reg_rdi, value_size, value_pos, 0, 0, ranges);\n    } break;\n    case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: {\n      if (scope_stack->defrange_target == 0) {\n        lnk_error_on_invalid_defrange_symbol(obj, symbol);\n        break;\n      }\n      if (scope_stack->frameproc == 0) {\n        lnk_error_on_missing_cv_frameproc(obj, symbol);\n        break;\n      }\n\n      CV_SymDefrangeFramepointerRelFullScope *defrange_fprelfs = (CV_SymDefrangeFramepointerRelFullScope *) symbol.data.str; \n      B32                                     is_local_param   = scope_stack->defrange_target->kind == RDI_LocalKind_Parameter;\n      CV_EncodedFramePtrReg                   encoded_fp_reg   = cv_pick_fp_encoding(scope_stack->frameproc, is_local_param);\n      CV_Reg                                  fp_reg           = cv_decode_fp_reg(comp_info.arch, encoded_fp_reg);\n      RDI_RegCode                             fp_reg_rdi       = rdi_reg_code_from_cv(comp_info.arch, fp_reg);\n      U32                                     value_size       = cv_size_from_reg(comp_info.arch, fp_reg);\n      U32                                     value_pos        = 0;\n      Rng1U64List                             ranges           = scope_stack->scope->ranges; // variable is available everywhere in the scope\n\n      rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, fp_reg_rdi, value_size, value_pos, (S64)defrange_fprelfs->off, 0, ranges);\n    } break;\n    case CV_SymKind_DEFRANGE_REGISTER_REL: {\n      if (scope_stack->defrange_target == 0) {\n        lnk_error_on_invalid_defrange_symbol(obj, symbol);\n        break;\n      }\n\n      CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel *) symbol.data.str;\n      CV_LvarAddrGap            *gaps                  = (CV_LvarAddrGap *) (defrange_register_rel + 1);\n      U64                        gap_count             = (symbol.data.size - sizeof(*defrange_register_rel)) / sizeof(gaps[0]);\n      RDI_RegCode                reg_rdi               = rdi_reg_code_from_cv(comp_info.arch, defrange_register_rel->reg);\n      U64                        value_size            = cv_size_from_reg(comp_info.arch, defrange_register_rel->reg);\n      U64                        value_pos             = 0;\n      Rng1U64                    defrange              = lnk_virt_range_from_sect_off_size(defrange_register_rel->range.sec, defrange_register_rel->range.off, defrange_register_rel->range.len, task->image_sects, obj, symbol.kind, symbol.offset);\n      Rng1U64List                ranges                = cv_make_defined_range_list_from_gaps(arena, defrange, gaps, gap_count);\n\n      rdib_push_location_addr_reg_off(arena, &scope_stack->defrange_target->locations, arch_rdi, reg_rdi, value_size, value_pos, (S64)defrange_register_rel->reg_off, 0, ranges);\n    } break;\n    case CV_SymKind_INLINESITE: {\n      CV_SymInlineSite *sym_inline_site = (CV_SymInlineSite *) symbol.data.str;\n      String8           binary_annots   = str8_skip(symbol.data, sizeof(*sym_inline_site));\n\n      U64 parent_voff = 0;\n      if (scope_stack != 0) {\n        RDIB_Scope *proc_scope = scope_stack->proc->scope;\n        Assert(proc_scope->ranges.count == 1);\n        Rng1U64 scope_vrange = proc_scope->ranges.first->v;\n        parent_voff = scope_vrange.min;\n      } else {\n        Assert(!\"S_INLINESITE doesn't have a parent procedure symbol\");\n      }\n\n      // parse binary annots\n      CV_C13InlineeLinesParsed    *inlinee_parsed       = cv_c13_inlinee_lines_accel_find(inlinee_lines_accel, sym_inline_site->inlinee);\n      CV_InlineBinaryAnnotsParsed  binary_annots_parsed = cv_c13_parse_inline_binary_annots(arena, parent_voff, inlinee_parsed, binary_annots);\n\n      String8    name  = str8_zero();\n      RDIB_Type *type  = 0;\n      RDIB_Type *owner = 0;\n      if (task->ipi_itype_range.min <= sym_inline_site->inlinee && sym_inline_site->inlinee < task->ipi_itype_range.max) {\n        U64     leaf_idx = sym_inline_site->inlinee - task->tpi_itype_range.min;\n        CV_Leaf leaf     = cv_debug_t_get_leaf(task->ipi, leaf_idx);\n        if (leaf.kind == CV_LeafKind_MFUNC_ID) {\n          if (sizeof(CV_LeafMFuncId) <= leaf.data.size) {\n            CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId *) leaf.data.str;\n            name  = str8_cstring_capped_reverse(mfunc_id + 1, leaf.data.str + leaf.data.size);\n            type  = lnk_type_from_itype(mfunc_id->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n            owner = lnk_type_from_itype(mfunc_id->owner_itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n          } else {\n            Assert(!\"invalid leaf size\");\n          }\n        } else if (leaf.kind == CV_LeafKind_FUNC_ID) {\n          if (sizeof(CV_LeafFuncId) <= leaf.data.size) {\n            CV_LeafFuncId *func_id = (CV_LeafFuncId *) leaf.data.str;\n            name  = str8_cstring_capped_reverse(func_id + 1, leaf.data.str + leaf.data.size);\n            type  = lnk_type_from_itype(func_id->itype, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n            owner = lnk_type_from_itype(func_id->scope_string_id, task->tpi_itype_range, task->tpi_itype_map, obj, symbol.kind, symbol.offset);\n          } else {\n            Assert(!\"invalid leaf size\");\n          }\n        } else {\n          Assert(!\"inlinee must pointer to LF_FUNC_ID or LF_MFUNC_ID\");\n        }\n      } else {\n        Assert(!\"out of bounds inlinee\");\n      }\n\n      // fill out inline site\n      RDIB_InlineSite *inline_site = rdib_inline_site_chunk_list_push(arena, &task->inline_sites[worker_id], task->inline_site_cap);\n      inline_site->name            = name;\n      inline_site->type            = type;\n      inline_site->owner           = owner;\n      \n      inline_site->convert_ref.ud0 = binary_annots_parsed.lines;\n      inline_site->convert_ref.ud1 = binary_annots_parsed.lines_count;\n      inline_site->convert_ref.ud2 = symbols_input.obj_idx;\n\n      // fill out scope\n      RDIB_Scope *scope = rdib_scope_chunk_list_push(arena, &task->scopes[worker_id], task->symbol_chunk_cap);\n      scope->container_proc = scope_stack->proc;\n      scope->parent         = scope_stack->scope;\n      scope->inline_site    = inline_site;\n      scope->ranges         = binary_annots_parsed.code_ranges;\n\n      // push new scope stack frame\n      push_scope_frame();\n      scope_stack->scope      = scope;\n      scope_stack->proc       = scope->container_proc;\n      scope_stack->proc_flags = scope_stack->proc_flags;\n      scope_stack->frameproc  = scope_stack->prev->frameproc;\n    } break;\n    default: break;\n    }\n  }\n  exit:;\n\n#undef push_scope_frame\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_convert_inline_site_line_tables_task)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  LNK_ConvertUnitToRDITask *task  = raw_task;\n  RDIB_InlineSiteChunk     *chunk = task->inline_site_chunks[task_id];\n\n  RDIB_LineTableFragmentChunkList frag_chunk_list = {0};\n\n  for (U64 i = 0; i < chunk->count; ++i) {\n    RDIB_InlineSite *inline_site = &chunk->v[i];\n\n    CV_LineArray *lines_arr   = inline_site->convert_ref.ud0;\n    U64           lines_count = inline_site->convert_ref.ud1;\n    U64           obj_idx     = inline_site->convert_ref.ud2;\n\n    CV_DebugS debug_s          = task->debug_s_arr[obj_idx];\n    String8   raw_string_table = cv_string_table_from_debug_s(debug_s);\n    String8   raw_file_chksms  = cv_file_chksms_from_debug_s(debug_s);\n\n    if (lines_count > 0) {\n      inline_site->line_table = rdib_line_table_chunk_list_push(arena, &task->line_tables[worker_id], task->line_table_cap);\n    } else {\n      inline_site->line_table = task->null_line_table;\n    }\n\n    // emit line tables for each file (yes, it is possbile to split inline site among two or more files via #include)\n    for (U64 file_idx = 0; file_idx < lines_count; ++file_idx) {\n      CV_LineArray lines = lines_arr[file_idx];\n\n      // prase checksum header\n      CV_C13Checksum *checksum_header = (CV_C13Checksum *) (raw_file_chksms.str + lines.file_off);\n      if (lines.file_off + sizeof(CV_C13Checksum) + checksum_header->len > raw_file_chksms.size) {\n        lnk_error_obj(LNK_Warning_IllData, task->obj_arr[obj_idx], \"Not enough bytes to read file checksum @ 0x%llx.\", lines.file_off);\n        continue;\n      }\n      String8 file_path      = str8_cstring_capped(raw_string_table.str + checksum_header->name_off, raw_string_table.str + raw_string_table.size);\n      String8 checksum_bytes = str8((U8 *) (checksum_header + 1), checksum_header->len);\n      \n      // find source file for this line table\n      String8               normal_path     = lnk_normalize_src_file_path(scratch.arena, file_path);\n      U64                   src_file_hash   = lnk_src_file_hash_cv(normal_path, checksum_header->kind, checksum_bytes);\n      LNK_SourceFileBucket *src_file_bucket = lnk_src_file_hash_table_lookup_slot(task->src_file_buckets, task->src_file_buckets_cap, src_file_hash, normal_path, checksum_header->kind, checksum_bytes);\n      if (src_file_bucket == 0) {\n        lnk_error_obj(LNK_Error_UnexpectedCodePath, task->obj_arr[obj_idx], \"Unable to find source file in the hash table: \\\"%S\\\".\", file_path);\n        continue;\n      }\n      RDIB_SourceFile *src_file = src_file_bucket->src_file;\n\n      // fill out line table fragment\n      RDIB_LineTableFragment *frag = rdib_line_table_fragment_chunk_list_push(arena, &frag_chunk_list, chunk->count);\n      frag->src_file   = src_file;\n      frag->voffs      = lines.voffs;\n      frag->line_nums  = lines.line_nums;\n      frag->col_nums   = lines.col_nums;\n      frag->line_count = lines.line_count;\n      frag->col_count  = lines.col_count;\n\n      // build list of fragments per line table\n      rdib_line_table_push_fragment_node(inline_site->line_table, frag);\n\n      // build list of line table fragments per file\n      frag->next_src_file = ins_atomic_ptr_eval_assign(&src_file->line_table_frags, frag);\n    }\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_collect_obj_virtual_ranges_task)\n{\n  ProfBeginFunction();\n\n  LNK_ConvertUnitToRDITask *task = raw_task;\n\n  U64      unit_idx = task_id;\n  LNK_Obj *obj      = task->obj_arr[unit_idx];\n\n  U64 unit_chunk_idx = unit_idx / task->unit_chunk_cap;\n  U64 local_unit_idx = unit_idx - unit_chunk_idx * task->unit_chunk_cap;\n\n  RDIB_Unit *dst        = &task->units[unit_chunk_idx].v[local_unit_idx];\n  dst->virt_range_count = 0;\n  dst->virt_ranges      = push_array_no_zero(arena, Rng1U64, obj->header.section_count_no_null);\n\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n\n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n\n    if (sect_header->flags & COFF_SectionFlag_LnkRemove) {\n      continue;\n    }\n    if (sect_header->vsize == 0) {\n      continue;\n    }\n\n    dst->virt_ranges[dst->virt_range_count] = rng_1u64(sect_header->voff, sect_header->voff + sect_header->vsize);\n    ++dst->virt_range_count;\n  }\n\n  // free unused memory\n  arena_pop(arena, sizeof(dst->virt_ranges[0]) * (obj->header.section_count_no_null - dst->virt_range_count));\n\n  ProfEnd();\n}\n\ninternal String8List\nlnk_build_rad_debug_info(TP_Context               *tp,\n                         TP_Arena                 *tp_arena,\n                         OperatingSystem           os,\n                         RDI_Arch                  arch,\n                         String8                   image_name,\n                         String8                   image_data,\n                         U64                       obj_count,\n                         LNK_Obj                 **obj_arr,\n                         CV_DebugS                *debug_s_arr,\n                         U64                       total_symbol_input_count,\n                         LNK_CodeViewSymbolsInput *symbol_inputs,\n                         CV_SymbolListArray       *parsed_symbols,\n                         CV_DebugT                 types[CV_TypeIndexSource_COUNT])\n{\n  ProfBegin(\"RDI\");\n  Temp scratch = scratch_begin(tp_arena->v,tp_arena->count);\n\n  RDIB_Input input = rdib_init_input(scratch.arena);\n\n  COFF_SectionHeaderArray image_sects;\n  String8                 image_strtab;\n  {\n    PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, image_data);\n    image_sects.count = pe.section_count;\n    image_sects.v = (COFF_SectionHeader *)str8_substr(image_data, pe.section_table_range).str;\n    image_strtab = str8_substr(image_data, pe.string_table_range);\n  }\n\n  ProfBegin(\"Top Level Info\");\n  {\n    U64 image_vsize = 0;\n    for (U64 sect_idx = 0; sect_idx < image_sects.count; sect_idx++) {\n      COFF_SectionHeader *sect = &image_sects.v[sect_idx];\n      image_vsize = Max(image_vsize, sect->voff + sect->vsize);\n    }\n\n    input.top_level_info.arch            = arch;\n    input.top_level_info.exe_name        = image_name;\n    input.top_level_info.exe_hash        = rdi_hash(image_data.str, image_data.size);\n    input.top_level_info.voff_max        = image_vsize;\n    input.top_level_info.producer_string = push_str8f(scratch.arena, \"%s [Debug Info: CodeView]\", BUILD_VERSION_STRING_LITERAL);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Sections\");\n  {\n    input.sect_count = image_sects.count;\n    input.sections   = push_array(scratch.arena, RDIB_BinarySection, image_sects.count);\n    for (U64 sect_idx = 0; sect_idx < image_sects.count; ++sect_idx) {\n      COFF_SectionHeader *src = &image_sects.v[sect_idx];\n      RDIB_BinarySection *dst = &input.sections[sect_idx];\n      String8 sect_name = coff_name_from_section_header(image_strtab, src);\n\n      dst->name       = push_str8_copy(scratch.arena, sect_name);\n      dst->flags      = rdi_binary_section_flags_from_coff_section_flags(src->flags);\n      dst->voff_first = src->voff;\n      dst->voff_opl   = src->voff + src->vsize;\n      dst->foff_first = src->foff;\n      dst->foff_opl   = src->foff + src->fsize;\n    }\n  }\n  ProfEnd();\n\n  // assing low and high type indices per source\n  Rng1U64 itype_ranges[CV_TypeIndexSource_COUNT];\n  for (U64 i = 0; i < ArrayCount(itype_ranges); ++i) {\n    itype_ranges[i] = rng_1u64(CV_MinComplexTypeIndex, CV_MinComplexTypeIndex + types[i].count);\n  }\n\n  ProfBegin(\"Convert Types\");\n  U64                 udt_name_buckets_cap;\n  LNK_UDTNameBucket **udt_name_buckets;\n  RDIB_Type         **tpi_itype_map;\n  {\n    ProfBegin(\"Push TPI itype -> RDIB Type map\");\n    tpi_itype_map = push_array(scratch.arena, RDIB_Type *, itype_ranges[CV_TypeIndexSource_TPI].max);\n    ProfEnd();\n\n    ProfBegin(\"Push Built-in Types\");\n    RDIB_DataModel data_model = rdib_infer_data_model(os, arch);\n    lnk_push_basic_itypes(scratch.arena, data_model, tpi_itype_map, &input.types);\n    ProfEnd();\n\n    Assert(tpi_itype_map[0] == 0);\n    tpi_itype_map[0] = input.null_type;\n\n    ProfBegin(\"Build UDT Name Hash Table\");\n    // TODO: fix memory life-time\n    udt_name_buckets_cap = 0;\n    udt_name_buckets     = lnk_udt_name_hash_table_from_debug_t(tp, tp_arena, types[CV_TypeIndexSource_TPI], &udt_name_buckets_cap);\n    ProfEnd();\n\n\n    ProfBegin(\"Convert CodeView types to RDIB Types\");\n    LNK_ConvertTypesToRDI task         = {0};\n    task.types                         = types;\n    task.type_cap                      = input.type_cap;\n    task.udt_cap                       = input.udt_cap;\n    task.variadic_type_ref             = rdib_make_type_ref(scratch.arena, input.variadic_type);\n    task.itype_ranges                  = itype_ranges;\n    task.tpi_itype_map                 = tpi_itype_map;\n    task.udt_name_bucket_cap           = udt_name_buckets_cap;\n    task.udt_name_buckets              = udt_name_buckets;\n    task.rdib_types_lists              = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_types_struct_lists       = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_types_union_lists        = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_types_enum_lists         = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_types_udt_members_lists  = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_types_enum_members_lists = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_types_params_lists       = push_array(scratch.arena, RDIB_TypeChunkList,      tp->worker_count);\n    task.rdib_udt_members_lists        = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count);\n    task.rdib_enum_members_lists       = push_array(scratch.arena, RDIB_UDTMemberChunkList, tp->worker_count);\n    task.ranges                        = tp_divide_work(scratch.arena, types[CV_TypeIndexSource_TPI].count, tp->worker_count);\n    tp_for_parallel(tp, tp_arena, tp->worker_count, lnk_convert_types_to_rdi_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Concat converted types\");\n    rdib_type_chunk_list_concat_in_place_many      (&input.types,             task.rdib_types_lists,              tp->worker_count);\n    rdib_type_chunk_list_concat_in_place_many      (&input.struct_list,       task.rdib_types_struct_lists,       tp->worker_count);\n    rdib_type_chunk_list_concat_in_place_many      (&input.union_list,        task.rdib_types_union_lists,        tp->worker_count);\n    rdib_type_chunk_list_concat_in_place_many      (&input.enum_list,         task.rdib_types_enum_lists,         tp->worker_count);\n    rdib_type_chunk_list_concat_in_place_many      (&input.param_types,       task.rdib_types_params_lists,       tp->worker_count);\n    rdib_type_chunk_list_concat_in_place_many      (&input.member_types,      task.rdib_types_udt_members_lists,  tp->worker_count);\n    rdib_type_chunk_list_concat_in_place_many      (&input.enum_types,        task.rdib_types_enum_members_lists, tp->worker_count);\n    rdib_udt_member_chunk_list_concat_in_place_many(&input.udt_members,       task.rdib_udt_members_lists,        tp->worker_count);\n    rdib_udt_member_chunk_list_concat_in_place_many(&input.enum_members,      task.rdib_enum_members_lists,       tp->worker_count);\n    ProfEnd();\n\n    // types are converted and we can remove indirection and release 'itype_map'\n    ProfBegin(\"Deref Type Refs\");\n    rdib_deref_type_refs(tp, &input.types);\n    rdib_deref_type_refs(tp, &input.struct_list);\n    rdib_deref_type_refs(tp, &input.union_list);\n    rdib_deref_type_refs(tp, &input.enum_list); \n    rdib_deref_type_refs(tp, &input.param_types);\n    rdib_deref_type_refs(tp, &input.member_types);\n    rdib_deref_type_refs(tp, &input.enum_types);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  // Loop over source files in objs and build a hash table\n  // for path -> source file maps. During symbol conversion\n  // we use the hash table to lookup source files and append\n  // inline site line tables.\n  U64                    src_file_buckets_cap;\n  LNK_SourceFileBucket **src_file_buckets;\n  {\n    ProfBegin(\"Build Source File Hash Table\");\n\n    LNK_ConvertSourceFilesToRDITask task = {0};\n    task.obj_arr     = obj_arr;\n    task.debug_s_arr = debug_s_arr;\n\n    ProfBegin(\"Count Source Files\");\n    tp_for_parallel(tp, 0, obj_count, lnk_count_source_files_task, &task);\n    ProfEnd();\n\n    ProfBeginDynamic(\"Insert Source Files [Count %llu]\", task.total_src_file_count);\n    task.src_file_buckets_cap = (U64)(task.total_src_file_count * 1.3);\n    task.src_file_buckets     = push_array(tp_arena->v[0], LNK_SourceFileBucket*, task.src_file_buckets_cap);\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_insert_src_files_task, &task);\n    ProfEnd();\n\n    src_file_buckets_cap = task.src_file_buckets_cap;\n    src_file_buckets     = task.src_file_buckets;\n\n    ProfEnd();\n  }\n\n  // Copy source files to a contiguous array and update source file pointers\n  // in buckets so we can do lookup and compute source file index in output array\n  // with a pointer subtraction.\n  ProfBegin(\"Source Files\");\n  for (U64 bucket_idx = 0; bucket_idx < src_file_buckets_cap; ++bucket_idx) {\n    LNK_SourceFileBucket *bucket = src_file_buckets[bucket_idx];\n    if (bucket != 0) {\n      RDIB_SourceFile *new_src_file = rdib_source_file_chunk_list_push(scratch.arena, &input.src_files, input.src_file_chunk_cap);\n\n      // restore chunk pointer after copy\n      RDIB_SourceFileChunk *new_src_file_chunk = new_src_file->chunk;\n      *new_src_file       = *bucket->src_file;\n      new_src_file->chunk = new_src_file_chunk;\n\n      bucket->src_file = new_src_file;\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Units\");\n  {\n    LNK_ConvertUnitToRDITask task = {0};\n    task.image_sects              = image_sects;\n    task.obj_arr                  = obj_arr;\n    task.debug_s_arr              = debug_s_arr;\n    task.ipi                      = types[CV_TypeIndexSource_IPI];\n    task.symbol_inputs            = symbol_inputs;\n    task.parsed_symbols           = parsed_symbols;\n    task.ipi_itype_range          = itype_ranges[CV_TypeIndexSource_IPI];\n    task.tpi_itype_range          = itype_ranges[CV_TypeIndexSource_TPI];\n    task.tpi_itype_map            = tpi_itype_map;\n    task.src_file_buckets_cap     = src_file_buckets_cap;\n    task.src_file_buckets         = src_file_buckets;\n    task.udt_name_buckets         = udt_name_buckets;\n    task.udt_name_buckets_cap     = udt_name_buckets_cap;\n    task.src_file_chunk_cap       = input.src_file_chunk_cap;\n    task.line_table_cap           = input.line_table_cap;\n    task.symbol_chunk_cap         = input.symbol_chunk_cap;\n    task.unit_chunk_cap           = input.unit_chunk_cap;\n    task.inline_site_cap          = input.inline_site_cap;\n    task.null_line_table          = input.null_line_table;\n    task.extern_symbol_voff_ht    = hash_table_init(scratch.arena, 256);\n    task.units                    = rdib_unit_chunk_list_reserve_ex(scratch.arena, &input.units, input.unit_chunk_cap, obj_count);\n    task.scopes                   = push_array(scratch.arena, RDIB_ScopeChunkList,      tp->worker_count);\n    task.locals                   = push_array(scratch.arena, RDIB_VariableChunkList,   tp->worker_count);\n    task.extern_gvars             = push_array(scratch.arena, RDIB_VariableChunkList,   tp->worker_count);\n    task.static_gvars             = push_array(scratch.arena, RDIB_VariableChunkList,   tp->worker_count);\n    task.extern_tvars             = push_array(scratch.arena, RDIB_VariableChunkList,   tp->worker_count);\n    task.static_tvars             = push_array(scratch.arena, RDIB_VariableChunkList,   tp->worker_count);\n    task.extern_procs             = push_array(scratch.arena, RDIB_ProcedureChunkList,  tp->worker_count);\n    task.static_procs             = push_array(scratch.arena, RDIB_ProcedureChunkList,  tp->worker_count);\n    task.inline_sites             = push_array(scratch.arena, RDIB_InlineSiteChunkList, tp->worker_count);\n    task.line_tables              = push_array(scratch.arena, RDIB_LineTableChunkList,  tp->worker_count);\n\n    ProfBegin(\"Gather Compiler Info\");\n    task.comp_info_arr = push_array(scratch.arena, LNK_CodeViewCompilerInfo, obj_count);\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_find_obj_compiler_info_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Convert Line Tables\");\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_convert_line_tables_to_rdi_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Build Inlinee Lines Accels\");\n    task.inlinee_lines_accel_arr = push_array(scratch.arena, CV_InlineeLinesAccel *, obj_count);\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_build_inlinee_lines_accels_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Convert Symbols\");\n    tp_for_parallel(tp, tp_arena, total_symbol_input_count, lnk_convert_symbols_to_rdi_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Convert Inline Sites Line Tables\");\n    rdib_inline_site_chunk_list_concat_in_place_many(&input.inline_sites, task.inline_sites, tp->worker_count);\n    task.inline_site_chunks = rdib_array_from_inline_site_chunk_list(scratch.arena, input.inline_sites);\n    tp_for_parallel(tp, tp_arena, input.inline_sites.count, lnk_convert_inline_site_line_tables_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Collect Units Virtual Ranges\");\n    tp_for_parallel(tp, tp_arena, obj_count, lnk_collect_obj_virtual_ranges_task, &task);\n    ProfEnd();\n\n    rdib_line_table_chunk_list_concat_in_place_many(&input.line_tables, task.line_tables, tp->worker_count);\n    rdib_scope_chunk_list_concat_in_place_many(&input.scopes, task.scopes, tp->worker_count);\n    rdib_variable_chunk_list_concat_in_place_many(&input.locals, task.locals, tp->worker_count);\n    rdib_variable_chunk_list_concat_in_place_many(&input.extern_gvars, task.extern_gvars, tp->worker_count);\n    rdib_variable_chunk_list_concat_in_place_many(&input.static_gvars, task.static_gvars, tp->worker_count);\n    rdib_variable_chunk_list_concat_in_place_many(&input.extern_tvars, task.extern_tvars, tp->worker_count);\n    rdib_variable_chunk_list_concat_in_place_many(&input.static_tvars, task.static_tvars, tp->worker_count);\n    rdib_procedure_chunk_list_concat_in_place_many(&input.extern_procs, task.extern_procs, tp->worker_count);\n    rdib_procedure_chunk_list_concat_in_place_many(&input.static_procs, task.static_procs, tp->worker_count);\n  }\n  ProfEnd();\n\n  String8List rdi_data = rdib_finish(tp, tp_arena, &input);\n\n  scratch_end(scratch);\n  ProfEnd();\n  return rdi_data;\n}\n\n"
  },
  {
    "path": "src/linker/lnk_debug_info.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n// --- Code View Input ---------------------------------------------------------\n\ntypedef struct LNK_PchInfo\n{\n  CV_TypeIndex ti_lo;\n  CV_TypeIndex ti_hi;\n  U64          debug_p_obj_idx;\n} LNK_PchInfo;\n\ntypedef struct LNK_CodeViewSymbolsInput\n{\n  U64            obj_idx;\n  CV_SymbolList *symbol_list;\n  String8        raw_symbols;\n} LNK_CodeViewSymbolsInput;\n\ntypedef struct LNK_CodeViewInput\n{\n  U64             count;\n  U64             internal_count;\n  U64             external_count;\n  U64             type_server_count;\n  String8        *type_server_path_arr; // [type_server_count]\n  String8        *type_server_data_arr; // [type_server_count]\n  U64List        *ts_to_obj_arr;        // [type_server_count]\n  LNK_Obj       **obj_arr;              // [count]\n  LNK_PchInfo    *pch_arr;              // [count]\n  CV_DebugS      *debug_s_arr;          // [count]\n  CV_DebugT      *debug_p_arr;          // [count]\n  CV_DebugT      *debug_t_arr;          // [count]\n  CV_DebugT      *merged_debug_t_p_arr; // [count]\n\n  U64                       total_symbol_input_count;\n  LNK_CodeViewSymbolsInput *symbol_inputs;  // [total_symbol_input_count]\n  CV_SymbolListArray       *parsed_symbols; // [count]\n\n  LNK_Obj                 **internal_obj_arr;         // [internal_count]\n  CV_DebugS                *internal_debug_s_arr;     // [internal_count]\n  CV_DebugT                *internal_debug_t_arr;     // [internal_count]\n  CV_DebugT                *internal_debug_p_arr;     // [internal_count]\n  U64                      internal_total_symbol_input_count;\n  LNK_CodeViewSymbolsInput *internal_symbol_inputs;   // [internal_total_symbol_input_count]\n  CV_SymbolListArray       *internal_parsed_symbols;  // [internal_count]\n\n  LNK_Obj                  **external_obj_arr;           // [external_count]\n  CV_DebugS                 *external_debug_s_arr;       // [external_count]\n  CV_DebugT                 *external_debug_t_arr;       // [external_count]\n  CV_DebugT                 *external_debug_p_arr;       // [external_count]\n  U64                        external_total_symbol_input_count;\n  LNK_CodeViewSymbolsInput  *external_symbol_inputs;     // [exteranl_total_symbol_input_count]\n  CV_SymbolListArray        *external_parsed_symbols;    // [external_count]\n  Rng1U64                  **external_ti_ranges;         // [type_server_count]\n  CV_DebugT                **external_leaves;            // [type_server_count]\n  U64                       *external_obj_to_ts_idx_arr; // [external_count]\n  Rng1U64                    external_obj_range;\n} LNK_CodeViewInput;\n\n// --- Leaf Ref ----------------------------------------------------------------\n\ntypedef enum\n{\n  LNK_LeafLocType_Internal,\n  LNK_LeafLocType_External,\n  LNK_LeafLocType_Count\n} LNK_LeafLocType;\n\n#define LNK_LeafRefFlag_LocIdxExternal (1 << 31)\n#define LNK_LeafRefFlag_LeafIdxIPI     (1 << 31)\ntypedef struct\n{\n  U32 enc_loc_idx;\n  U32 enc_leaf_idx;\n} LNK_LeafRef;\n\ntypedef struct LNK_LeafRange\n{\n  struct LNK_LeafRange *next;\n  Rng1U64               range;\n  CV_DebugT            *debug_t;\n} LNK_LeafRange;\n\ntypedef struct LNK_LeafRangeList\n{\n  U64            count;\n  LNK_LeafRange *first;\n  LNK_LeafRange *last;\n} LNK_LeafRangeList;\n\ntypedef struct\n{\n  LNK_LeafRef  leaf_ref;\n  CV_TypeIndex type_index;\n} LNK_LeafBucket;\n\ntypedef struct\n{\n  U64              count;\n  LNK_LeafBucket **v;\n} LNK_LeafBucketArray;\n\ntypedef struct\n{\n  U64              cap;\n  LNK_LeafBucket **bucket_arr;\n} LNK_LeafHashTable;\n\ntypedef union\n{\n  struct {\n    U128Array **internal_hashes;\n    U128Array **external_hashes;\n  };\n  U128Array **v[CV_TypeIndexSource_COUNT];\n} LNK_LeafHashes;\n\n// --- Symbol Parsing Tasks ----------------------------------------------------\n\ntypedef struct\n{\n  LNK_Obj    **obj_arr;\n  String8List *sect_list_arr;\n  CV_DebugS   *debug_s_arr;\n} LNK_ParseDebugSTaskData;\n\ntypedef struct\n{\n  LNK_Obj     **obj_arr;\n  String8Array *data_arr_arr;\n} LNK_CheckDebugTSigTaskData;\n\ntypedef struct\n{\n  LNK_Obj     **obj_arr;\n  String8Array *data_arr_arr;\n  CV_DebugT    *debug_t_arr;\n} LNK_ParseDebugTTaskData;\n\ntypedef struct\n{\n  String8Array   data_arr;\n  MSF_Parsed   **msf_parse_arr;\n} LNK_MsfParsedFromDataTask;\n\ntypedef struct\n{\n  CV_TypeServerInfo  *ts_info_arr;\n  MSF_Parsed        **msf_parse_arr;\n  Rng1U64           **external_ti_ranges;\n  CV_DebugT         **external_leaves;\n  B8                 *is_corrupted;\n} LNK_GetExternalLeavesTask;\n\n// --- Leaf Deduping Tasks -----------------------------------------------------\n\ntypedef struct\n{\n  LNK_LeafRangeList  *leaf_ranges_per_task;\n  U64               **count_arr_arr;\n} LNK_CountPerSourceLeafTask;\n\ntypedef struct\n{\n  LNK_CodeViewInput *input;\n  LNK_LeafHashes    *hashes;\n  Arena            **fixed_arenas;\n  CV_DebugT         *debug_t_arr;\n} LNK_LeafHasherTask;\n\ntypedef struct\n{\n  LNK_CodeViewInput  *input;\n  LNK_LeafHashes     *hashes;\n  LNK_LeafHashTable  *leaf_ht_arr;\n  CV_DebugT          *debug_t_arr;\n} LNK_LeafDedupInternal;\n\ntypedef struct\n{\n  LNK_CodeViewInput  *input;\n  LNK_LeafHashes     *hashes;\n  LNK_LeafHashTable  *leaf_ht_arr;\n  CV_TypeIndexSource  dedup_ti_source;\n} LNK_LeafDedupExternal;\n\ntypedef struct\n{\n  LNK_LeafHashTable   *ht;\n  U64                 *count_arr;\n  Rng1U64             *range_arr;\n  U64                 *offset_arr;\n  LNK_LeafBucketArray  result;\n} LNK_GetPresentBucketsTask;\n\ntypedef struct\n{\n  U64             loc_idx_bit_count_0;\n  U64             loc_idx_bit_count_1;\n  U64             loc_idx_bit_count_2;\n  U64             counts_max;\n  U32           **counts_arr;\n  Rng1U64        *ranges;\n  LNK_LeafBucket **dst;\n  LNK_LeafBucket **src;\n  U64             loc_idx_max;\n  U64             pass_idx;\n} LNK_LeafRadixSortTask;\n\ntypedef struct\n{\n  U32             *counts;\n  U32             *offsets;\n  LNK_LeafBucket **dst;\n  LNK_LeafBucket **src;\n  Rng1U64         *ranges;\n} LNK_LeafLocRadixSortTask;\n\ntypedef struct\n{\n  Rng1U64            *range_arr;\n  CV_TypeIndex        min_type_index;\n  LNK_LeafBucketArray bucket_arr;\n} LNK_AssignTypeIndicesTask;\n\ntypedef struct\n{\n  LNK_CodeViewInput  *input;\n  LNK_LeafBucket    **bucket_arr;\n  U8                **raw_leaf_arr;\n  Rng1U64            *range_arr;\n} LNK_UnbucketRawLeavesTask;\n\ntypedef struct\n{\n  Rng1U64            *ranges;\n  LNK_CodeViewInput  *input;\n  LNK_LeafHashes     *hashes;\n  LNK_LeafHashTable  *leaf_ht_arr;\n  CV_SymbolList      *symbol_list_arr;\n  Arena             **arena_arr;\n} LNK_PatchSymbolTypesTask;\n\ntypedef struct\n{\n  LNK_CodeViewInput *input;\n  LNK_LeafHashes    *hashes;\n  LNK_LeafHashTable *leaf_ht_arr;\n  CV_DebugS         *debug_s_arr;\n} LNK_PatchInlinesTask;\n\ntypedef struct\n{\n  LNK_CodeViewInput  *input;\n  LNK_LeafHashes     *hashes;\n  LNK_LeafHashTable  *leaf_ht_arr;\n  LNK_LeafBucket    **bucket_arr;\n  Rng1U64            *range_arr;\n  Arena             **fixed_arena_arr;\n} LNK_PatchLeavesTask;\n\n// --- Code View Processing Trasks ---------------------------------------------\n\ntypedef struct\n{\n  String8List *data_list_arr;\n} LNK_ProcessedCodeViewC11Data;\n\ntypedef struct\n{\n  String8List *data_list_arr;\n  String8List *source_file_names_list_arr;\n} LNK_ProcessedCodeViewC13Data;\n\ntypedef struct\n{\n  LNK_CodeViewSymbolsInput *inputs;\n} LNK_ParseCVSymbolsTaskData;\n\ntypedef struct\n{\n  U64                        total_symbol_input_count;\n  LNK_CodeViewSymbolsInput  *symbol_inputs;\n  CV_SymbolListArray        *parsed_symbols;\n  PDB_DbiModule            **mod_arr;\n  String8List               *symbol_data_arr;\n  CV_SymbolList             *gsi_list_arr;\n} LNK_ProcessSymDataTaskData;\n\ntypedef struct\n{\n  CV_DebugS          *debug_s_arr;\n  MSF_Context        *msf;\n  PDB_DbiModule      **dbi_mod_arr;\n  String8List        *c13_data_arr;\n  String8List        *source_file_names_list_arr;\n  U64                 string_data_base_offset;\n  CV_StringHashTable  string_ht;\n} LNK_ProcessC13DataTask;\n\ntypedef struct\n{\n  MSF_Context    *msf;\n  PDB_DbiModule **mod_arr;\n  String8List    *symbol_data_arr;\n  String8List    *c11_data_list_arr;\n  String8List    *c13_data_list_arr;\n  String8List    *globrefs_arr;\n} LNK_WriteModuleDataTask;\n\ntypedef struct\n{\n  LNK_Obj                   **obj_arr;\n  PDB_DbiModule             **mod_arr;\n  PDB_DbiSectionContribList  *sc_list;\n  String8                     image_data;\n  Rng1U64Array                image_section_file_ranges;\n  Rng1U64Array                image_section_virt_ranges;\n} LNK_PushDbiSecContribTaskData;\n\ntypedef struct\n{\n  U32Array      *hash_arr_arr;\n  CV_SymbolList *list_arr;\n} LNK_HashCVSymbolListTask;\n\ntypedef struct\n{\n  U64            *hash_arr;\n  CV_SymbolNode **arr;\n  Rng1U64        *range_arr;\n} LNK_CvSymbolPtrArrayHasher;\n\ntypedef struct\n{\n  LNK_SymbolHashTrieChunkList  *chunk_lists;\n  CV_SymbolList                *pub_list_arr;\n\n  Rng1U64           *symbol_ranges;\n  PDB_GsiContext    *gsi;\n  CV_SymbolPtrArray  symbols;\n  U32               *hashes;\n} LNK_BuildPublicSymbolsTask;\n\ntypedef struct\n{\n  CV_TypeIndex              ipi_min_type_index;\n  CV_DebugT                 ipi_types;\n  LNK_CodeViewSymbolsInput *symbol_inputs;\n  CV_SymbolListArray       *parsed_symbols;\n} LNK_PostProcessCvSymbolsTask;\n\ntypedef struct\n{\n  Rng1U64           *range_arr;\n  CV_SymbolPtrNode **bucket_arr;\n  CV_SymbolPtrNode **out_arr;\n  U64               *out_count_arr;\n} LNK_GsiDeduper;\n\ntypedef struct\n{\n  Rng1U64           *range_arr;\n  CV_SymbolPtrNode **bucket_arr;\n  U64               *symbol_base_arr;\n  CV_SymbolNode    **symbol_arr;\n} LNK_GsiUnbucket;\n\ntypedef struct\n{\n  CV_DebugT    debug_t;\n  Rng1U64     *ranges;\n  U64          hash_length;\n  B32          make_map;\n  TP_Arena    *map_arena;\n  String8List *maps;\n} LNK_TypeNameReplacer;\n\n// --- RAD Debug Info ----------------------------------------------------------\n\ntypedef struct\n{\n  String8 name;\n  U64     leaf_idx;\n} LNK_UDTNameBucket;\n\ntypedef struct\n{\n  CV_DebugT           debug_t;\n  Rng1U64            *ranges;\n  U64                 buckets_cap;\n  LNK_UDTNameBucket **buckets;\n} LNK_BuildUDTNameHashTableTask;\n\ntypedef struct\n{\n  CV_DebugT           debug_t;\n  CV_TypeIndex        ti_lo;\n  Rng1U64            *ranges;\n  U64                 udt_name_buckets_cap;\n  LNK_UDTNameBucket **udt_name_buckets;\n  CV_TypeIndex       *fwdmap;\n} LNK_BuildUDTFwdMapTask;\n\n// --- RDI Conversion Tasks ----------------------------------------------------\n\ntypedef struct\n{\n  CV_DebugT               *types;\n  U64                      type_cap;\n  U64                      udt_cap;\n  RDIB_TypeRef             variadic_type_ref;\n  Rng1U64                 *itype_ranges;\n  U64                      udt_name_bucket_cap;\n  LNK_UDTNameBucket      **udt_name_buckets;\n  RDIB_Type              **tpi_itype_map;\n  RDIB_TypeChunkList      *rdib_types_lists;\n  RDIB_TypeChunkList      *rdib_types_struct_lists;\n  RDIB_TypeChunkList      *rdib_types_union_lists;\n  RDIB_TypeChunkList      *rdib_types_enum_lists;\n  RDIB_TypeChunkList      *rdib_types_params_lists;\n  RDIB_TypeChunkList      *rdib_types_udt_members_lists;\n  RDIB_TypeChunkList      *rdib_types_enum_members_lists;\n  RDIB_UDTMemberChunkList *rdib_udt_members_lists;\n  RDIB_UDTMemberChunkList *rdib_enum_members_lists;\n  Rng1U64                 *ranges;\n} LNK_ConvertTypesToRDI;\n\ntypedef struct\n{\n  U64              obj_idx;\n  RDIB_SourceFile *src_file;\n} LNK_SourceFileBucket;\n\ntypedef struct\n{\n  LNK_Obj              **obj_arr;\n  CV_DebugS             *debug_s_arr;\n  U64                    total_src_file_count;\n  LNK_SourceFileBucket **src_file_buckets;\n  U64                    src_file_buckets_cap;\n} LNK_ConvertSourceFilesToRDITask;\n\ntypedef struct\n{\n  CV_Arch     arch;\n  CV_Language language;\n  String8     compiler_name;\n} LNK_CodeViewCompilerInfo;\n\ntypedef struct\n{\n  COFF_SectionHeaderArray   image_sects;\n  LNK_Obj                 **obj_arr;\n  CV_DebugS                *debug_s_arr;\n  CV_DebugT                 ipi;\n  LNK_CodeViewSymbolsInput *symbol_inputs;\n  CV_SymbolListArray       *parsed_symbols;\n  Rng1U64                   ipi_itype_range;\n  Rng1U64                   tpi_itype_range;\n  RDIB_Type               **tpi_itype_map;\n  U64                       src_file_buckets_cap;\n  LNK_SourceFileBucket    **src_file_buckets;\n  LNK_UDTNameBucket       **udt_name_buckets;\n  U64                       line_table_cap;\n  U64                       udt_name_buckets_cap;\n  U64                       src_file_chunk_cap;\n  U64                       symbol_chunk_cap;\n  U64                       unit_chunk_cap;\n  U64                       inline_site_cap;\n  RDIB_LineTable           *null_line_table;\n  HashTable                *extern_symbol_voff_ht;\n  LNK_CodeViewCompilerInfo *comp_info_arr;\n  CV_InlineeLinesAccel    **inlinee_lines_accel_arr;\n\n  RDIB_InlineSiteChunk **inline_site_chunks;\n\n  // output\n  RDIB_UnitChunk           *units;\n  RDIB_VariableChunkList   *locals;\n  RDIB_ScopeChunkList      *scopes;\n  RDIB_VariableChunkList   *extern_gvars;\n  RDIB_VariableChunkList   *static_gvars;\n  RDIB_VariableChunkList   *extern_tvars;\n  RDIB_VariableChunkList   *static_tvars;\n  RDIB_ProcedureChunkList  *extern_procs;\n  RDIB_ProcedureChunkList  *static_procs;\n  RDIB_InlineSiteChunkList *inline_sites;\n  RDIB_LineTableChunkList  *line_tables;\n} LNK_ConvertUnitToRDITask;\n\n// --- CodeView ----------------------------------------------------------------\n\ninternal CV_DebugS *       lnk_parse_debug_s_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *sect_list_arr);\ninternal CV_DebugT *       lnk_parse_debug_t_sections(TP_Context *tp, TP_Arena *arena, U64 obj_count, LNK_Obj **obj_arr, String8List *debug_t_list_arr);\ninternal CV_SymbolList *   lnk_cv_symbol_list_arr_from_debug_s_arr(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr);\ninternal LNK_PchInfo *     lnk_setup_pch(Arena *arena, U64 obj_count, LNK_Obj **obj_arr, CV_DebugT *debug_t_arr, CV_DebugT *debug_p_arr, CV_SymbolListArray *parsed_symbols, String8List alt_pch_dirs);\n\ninternal LNK_CodeViewInput lnk_make_code_view_input(TP_Context *tp, TP_Arena *tp_arena, LNK_IO_Flags io_flags, String8List lib_dir_list, String8List alt_pch_dirs, U64 objs_count, LNK_Obj **objs);\n\ninternal LNK_LeafRef      lnk_leaf_ref(U32 idx, U32 leaf_idx);\ninternal LNK_LeafRef      lnk_obj_leaf_ref(U32 obj_idx, U32 leaf_idx);\ninternal LNK_LeafRef      lnk_ts_leaf_ref(CV_TypeIndexSource ti_source, U32 ts_idx, U32 leaf_idx);\ninternal int              lnk_leaf_ref_compare(LNK_LeafRef a, LNK_LeafRef b);\ninternal LNK_LeafLocType  lnk_loc_type_from_leaf_ref(LNK_LeafRef leaf_ref);\ninternal LNK_LeafLocType  lnk_loc_type_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx);\ninternal U64              lnk_loc_idx_from_obj_idx(LNK_CodeViewInput *input, U64 obj_idx);\ninternal CV_TypeIndex     lnk_ti_lo_from_loc(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, U64 loc_idx, CV_TypeIndexSource ti_source);\ninternal CV_TypeIndex     lnk_ti_lo_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref);\ninternal String8          lnk_data_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref);\ninternal CV_Leaf          lnk_cv_leaf_from_leaf_ref(LNK_CodeViewInput *input, LNK_LeafRef leaf_ref);\ninternal U128             lnk_hash_from_leaf_ref(LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref);\ninternal LNK_LeafRef      lnk_leaf_ref_from_loc_idx_and_ti(LNK_CodeViewInput *input, LNK_LeafLocType loc_type, CV_TypeIndexSource ti_source, U64 loc_idx, CV_TypeIndex obj_ti);\ninternal B32              lnk_match_leaf_ref(LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b);\ninternal B32              lnk_match_leaf_ref_deep(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef a, LNK_LeafRef b);\ninternal U128             lnk_hash_cv_leaf(Arena *arena, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, Rng1U64 *ti_ranges, CV_TypeIndex curr_ti, CV_Leaf leaf, CV_TypeIndexInfoList ti_info_list);\ninternal void             lnk_hash_cv_leaf_deep(Arena *arena, LNK_CodeViewInput *input, Rng1U64 *ti_ranges, CV_DebugT *leaves, LNK_LeafHashes *hashes, LNK_LeafLocType loc_type, U32 loc_idx, CV_TypeIndexInfoList ti_info_list, String8 data);\ninternal LNK_LeafBucket * lnk_leaf_hash_table_insert_or_update(LNK_LeafHashTable *leaf_ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, U128 hash, LNK_LeafBucket *new_bucket);\ninternal LNK_LeafBucket * lnk_leaf_hash_table_search(LNK_LeafHashTable *ht, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafRef leaf_ref);\n\ninternal void                lnk_cv_debug_t_count_leaves_per_source(TP_Context *tp, U64 count, CV_DebugT *debug_t_arr, U64 *per_source_count_arr);\ninternal void                lnk_hash_debug_t_arr(TP_Context *tp, Arena *arena, U64 obj_count, CV_DebugT *debug_t_arr, U128Array *hash_arr_arr);\ninternal LNK_LeafBucketArray lnk_present_bucket_array_from_leaf_hash_table(TP_Context *tp, Arena *arena, LNK_LeafHashTable *ht);\ninternal void                lnk_leaf_bucket_array_sort_radix_subset_parallel(TP_Context *tp, U64 bucket_count, U64 loc_idx_max, LNK_LeafBucket **dst, LNK_LeafBucket **src);\ninternal void                lnk_leaf_bucket_array_sort_radix_parallel(TP_Context *tp, LNK_LeafBucketArray arr, U64 obj_count, U64 type_server_count);\ninternal void                lnk_assign_type_indices(TP_Context *tp, LNK_LeafBucketArray bucket_arr, CV_TypeIndex min_type_index);\ninternal void                lnk_patch_symbols(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr);\ninternal void                lnk_patch_inlines(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, U64 obj_count, CV_DebugS *debug_s_arr);\ninternal void                lnk_patch_leaves(TP_Context *tp, LNK_CodeViewInput *input, LNK_LeafHashes *hashes, LNK_LeafHashTable *leaf_ht_arr, LNK_LeafBucketArray bucket_arr);\ninternal String8Node *       lnk_copy_raw_leaf_arr_to_type_server(TP_Context *tp, CV_DebugT types, PDB_TypeServer *type_server);\ninternal CV_DebugT *         lnk_import_types(TP_Context *tp, TP_Arena *tp_temp, LNK_CodeViewInput *input);\n\ninternal void lnk_replace_type_names_with_hashes(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, LNK_TypeNameHashMode mode, U64 hash_length, String8 map_name);\n\n// --- RAD Debug info ----------------------------------------------------------\n\ninternal U64                  lnk_udt_name_hash_table_hash(String8 string);\ninternal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out);\ninternal LNK_UDTNameBucket *  lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name);\ninternal CV_TypeIndex *       lnk_build_udt_fwdmap(TP_Context *tp, Arena *arena, CV_DebugT debug_t, CV_TypeIndex ti_lo, LNK_UDTNameBucket **udt_name_buckets, U64 udt_name_buckets_cap);\n\ninternal RDIB_TypeRef           lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype);\ninternal RDI_MemberKind         lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop);\ninternal LNK_SourceFileBucket * lnk_src_file_hash_table_hash(String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes);\ninternal LNK_SourceFileBucket * lnk_src_file_hash_table_lookup_slot(LNK_SourceFileBucket **src_file_buckets, U64 src_file_buckets_cap, U64 hash, String8 file_path, CV_C13ChecksumKind checksum_kind, String8 checksum_bytes);\n\ninternal String8List lnk_build_rad_debug_info(TP_Context               *tp,\n                                              TP_Arena                 *tp_arena,\n                                              OperatingSystem           os,\n                                              RDI_Arch                  arch,\n                                              String8                   image_name,\n                                              String8                   image_data,\n                                              U64                       obj_count,\n                                              LNK_Obj                 **obj_arr,\n                                              CV_DebugS                *debug_s_arr,\n                                              U64                       total_symbol_input_count,\n                                              LNK_CodeViewSymbolsInput *symbol_inputs,\n                                              CV_SymbolListArray       *parsed_symbols,\n                                              CV_DebugT                 types[CV_TypeIndexSource_COUNT]);\n\n// --- PDB ---------------------------------------------------------------------\n\ninternal LNK_ProcessedCodeViewC11Data lnk_process_c11_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr);\ninternal LNK_ProcessedCodeViewC13Data lnk_process_c13_data(TP_Context *tp, TP_Arena *arena, U64 obj_count, CV_DebugS *debug_s_arr, U64 string_data_base_offset, CV_StringHashTable string_ht, MSF_Context *msf, PDB_DbiModule **mod_arr);\ninternal U64 *                        lnk_hash_cv_symbol_ptr_arr(TP_Context *tp, Arena *arena, CV_SymbolPtrArray arr);\ninternal CV_SymbolPtrArray            lnk_dedup_gsi_symbols(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 obj_count, CV_SymbolList *symbol_list_arr);\n\ninternal void lnk_build_pdb_public_symbols(TP_Context *tp, TP_Arena *arena, LNK_SymbolTable *symtab, PDB_PsiContext *psi);\n\ninternal String8List lnk_build_pdb(TP_Context               *tp,\n                                   TP_Arena                 *tp_arena,\n                                   String8                   image_data,\n                                   LNK_Config               *config,\n                                   LNK_SymbolTable          *symtab,\n                                   U64                       obj_count,\n                                   LNK_Obj                 **obj_arr,\n                                   CV_DebugS                *debug_s_arr,\n                                   U64                       total_symbol_input_count,\n                                   LNK_CodeViewSymbolsInput *symbol_inputs,\n                                   CV_SymbolListArray       *parsed_symbols,\n                                   CV_DebugT                 types[CV_TypeIndexSource_COUNT]);\n\n// --- RAD Debug Info ----------------------------------------------------------\n\ninternal U64                  lnk_udt_name_hash_table_hash(String8 string);\ninternal LNK_UDTNameBucket ** lnk_udt_name_hash_table_from_debug_t(TP_Context *tp, TP_Arena *arena, CV_DebugT debug_t, U64 *buckets_cap_out);\ninternal LNK_UDTNameBucket *  lnk_udt_name_hash_table_lookup(LNK_UDTNameBucket **buckets, U64 cap, String8 name);\n\ninternal CV_TypeIndex * lnk_build_udt_fwdmap(TP_Context         *tp,\n                                             Arena              *arena,\n                                             CV_DebugT           debug_t,\n                                             CV_TypeIndex        ti_lo,\n                                             LNK_UDTNameBucket **udt_name_buckets,\n                                             U64                 udt_name_buckets_cap);\n\ninternal void           lnk_init_rdib_itype_map(Arena *arena, RDI_Arch arch, RDIB_Type **itype_map, RDIB_TypeChunkList *rdib_types_list);\ninternal RDIB_TypeRef   lnk_rdib_type_from_itype(LNK_ConvertTypesToRDI *task, CV_TypeIndex itype);\ninternal RDI_MemberKind lnk_rdib_method_kind_from_cv_prop(CV_MethodProp prop);\n\n"
  },
  {
    "path": "src/linker/lnk_error.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\nstatic LNK_ErrorMode g_error_mode_arr[LNK_Error_Count];\nstatic LNK_ErrorCodeStatus g_error_code_status_arr[LNK_Error_Count];\nstatic B32 g_log_status[LNK_Log_Count];\n\ninternal void\nlnk_exit(int code)\n{\n  exit(code);\n}\n\ninternal void\nlnk_init_error_handler(void)\n{\n  for (int i = LNK_Error_StopFirst; i < LNK_Error_StopLast; ++i) {\n    g_error_mode_arr[i] = LNK_ErrorMode_Stop;\n  }\n  for (int i = LNK_Error_First; i < LNK_Error_Last; ++i) {\n   g_error_mode_arr[i] = LNK_ErrorMode_Continue;\n  }\n  for (int i = LNK_Warning_First; i < LNK_Warning_Last; ++i) {\n    g_error_mode_arr[i] = LNK_ErrorMode_Warn;\n  }\n}\n\ninternal String8\nlnk_string_from_error_mode(LNK_ErrorMode mode)\n{\n  switch (mode) {\n  case LNK_ErrorMode_Ignore:   return str8_lit(\"Ignore\");\n  case LNK_ErrorMode_Continue: return str8_lit(\"Error\");\n  case LNK_ErrorMode_Stop:     return str8_lit(\"Error\");\n  case LNK_ErrorMode_Warn:     return str8_lit(\"Warning\");\n  }\n  return str8_zero();\n}\n\ninternal void\nlnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args)\n{\n  if (g_error_mode_arr[code] == LNK_ErrorMode_Ignore) {\n    return;\n  }\n  if (lnk_is_error_code_ignored(code)) {\n    return;\n  }\n  \n  Temp scratch = scratch_begin(0,0);\n  String8 message = push_str8fv(scratch.arena, fmt, args);\n  String8 string = push_str8f(scratch.arena, \"%S(%03d): %S\\n\", lnk_string_from_error_mode(g_error_mode_arr[code]), code, message);\n  fprintf(stderr, \"%.*s\", str8_varg(string));\n  scratch_end(scratch);\n  \n  if (g_error_mode_arr[code] == LNK_ErrorMode_Stop) {\n    lnk_exit(code);\n  }\n}\n\ninternal void\nlnk_error(LNK_ErrorCode code, char *fmt, ...)\n{\n  va_list args;\n  va_start(args, fmt);\n  lnk_errorfv(code, fmt, args);\n  va_end(args);\n}\n\ninternal void\nlnk_error_with_loc_fv(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, va_list args)\n{\n  Temp scratch = scratch_begin(0, 0);\n  String8 text = push_str8fv(scratch.arena, fmt, args);\n  if (obj_path.size) {\n    if (lib_path.size) {\n      lnk_error(code, \"%S(%S): %S\", lib_path, str8_skip_last_slash(obj_path), text);\n    } else {\n      lnk_error(code, \"%S: %S\", obj_path, text);\n    }\n  } else {\n    lnk_error(code, \"RADLINK: %S\", text);\n  }\n  scratch_end(scratch);\n}\n\ninternal void\nlnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...)\n{\n  va_list args; va_start(args, fmt);\n  lnk_error_with_loc_fv(code, obj_path, lib_path, fmt, args);\n  va_end(args);\n}\n\ninternal void\nlnk_supplement_error(char *fmt, ...)\n{\n  va_list args;\n  va_start(args, fmt);\n\n  Temp scratch = scratch_begin(0,0);\n  String8 string = push_str8fv(scratch.arena, fmt, args);\n\n  fprintf(stderr, \"\\t\");\n  fprintf(stderr, \"%.*s\", str8_varg(string));\n  fprintf(stderr, \"\\n\");\n\n  va_end(args);\n  scratch_end(scratch);\n}\n\ninternal void\nlnk_supplement_error_list(String8List list)\n{\n  for (String8Node *node = list.first; node != 0; node = node->next) {\n    lnk_supplement_error(\"%.*s\", str8_varg(node->string));\n  }\n}\n\ninternal void\nlnk_suppress_error(LNK_ErrorCode code)\n{\n  g_error_code_status_arr[code] = LNK_ErrorCodeStatus_Ignore;\n}\n\ninternal LNK_ErrorCodeStatus\nlnk_get_error_code_status(LNK_ErrorCode code)\n{\n  return g_error_code_status_arr[code];\n}\n\ninternal void\nlnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...)\n{\n  Temp scratch = scratch_begin(0,0);\n  va_list args;\n  va_start(args, fmt);\n  \n  String8 issue = push_str8fv(scratch.arena, fmt, args);\n  fprintf(stderr, \"internal error #%03d in %s:%u\\n\", code, file, line);\n  fprintf(stderr, \"\\t%.*s\\n\", str8_varg(issue));\n  \n  va_end(args);\n  scratch_end(scratch);\n}\n\n"
  },
  {
    "path": "src/linker/lnk_error.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef enum\n{\n  LNK_Error_Null,\n  \n  LNK_Error_StopFirst,\n  LNK_Error_Cmdl,\n  LNK_Error_EndprecompNotFound,\n  LNK_Error_EntryPoint,\n  LNK_Error_ExternalTypeServerConflict,\n  LNK_Error_FileNotFound,\n  LNK_Error_IllData,\n  LNK_Error_IllExport,\n  LNK_Error_IncomatibleCmdOptions,\n  LNK_Error_IncompatibleMachine,\n  LNK_Error_InvalidPrecompLeafCount,\n  LNK_Error_InvalidStartIndex,\n  LNK_Error_NoAccess,\n  LNK_Error_NoSubsystem,\n  LNK_Error_OutOfExportOrdinals,\n  LNK_Error_PrecompObjNotFound,\n  LNK_Error_PrecompSigMismatch,\n  LNK_Error_Telemetry,\n  LNK_Error_UnsupportedMachine,\n  LNK_Error_Mt,\n  LNK_Error_UnableToSerializeMsf,\n  LNK_Error_LoadRes,\n  LNK_Error_IO,\n  LNK_Error_LargeAddrAwareRequired,\n  LNK_Error_InvalidPath,\n  LNK_Error_MultiplyDefinedSymbol,\n  LNK_Error_SectRefsDiscardedMemory,\n  LNK_Error_IllegalSectionMerge,\n  LNK_Error_IllegalRelocation,\n  LNK_Error_CircularMerge,\n  LNK_Error_AssociativeLoop,\n  LNK_Error_AlternateNameConflict,\n  LNK_Error_RelocationAgainstRemovedSection,\n  LNK_Error_StopLast,\n  \n  LNK_Error_First,\n  LNK_Error_AlreadyDefinedSymbol,\n  LNK_Error_CvPrecomp,\n  LNK_Error_Natvis,\n  LNK_Error_TooManyFiles,\n  LNK_Error_UnableToOpenTypeServer,\n  LNK_Error_UnexpectedCodePath,\n  LNK_Error_CvIllSymbolData,\n  LNK_Error_InvalidTypeIndex,\n  LNK_Error_UndefinedIsWeak,\n  LNK_Error_WeakCycle,\n  LNK_Error_InvalidLib,\n  LNK_Error_UnresolvedSymbol,\n  LNK_Error_Last,\n  \n  LNK_Warning_First,\n  LNK_Warning_InvalidMergeDirectiveFormat,\n  LNK_Warning_AmbiguousMerge,\n  LNK_Warning_AtypicalStartIndex,\n  LNK_Warning_Cmdl,\n  LNK_Warning_Directive,\n  LNK_Warning_DuplicateObjPath,\n  LNK_Warning_ExternalTypeServerAgeMismatch,\n  LNK_Warning_FileNotFound,\n  LNK_Warning_IllData,\n  LNK_Warning_IllExport,\n  LNK_Warning_InvalidNatvisFileExt,\n  LNK_Warning_LargePages,\n  LNK_Warning_LargePagesNotEnabled,\n  LNK_Warning_MismatchedTypeServerSignature,\n  LNK_Warning_MissingExternalTypeServer,\n  LNK_Warning_MultipleDebugTAndDebugP,\n  LNK_Warning_MultipleExternalTypeServers,\n  LNK_Warning_MultipleLibMatch,\n  LNK_Warning_MultiplyDefinedImport,\n  LNK_Warning_Natvis,\n  LNK_Warning_PrecompObjSymbolsNotFound,\n  LNK_Warning_SectionFlagsConflict,\n  LNK_Warning_Subsystem,\n  LNK_Warning_UnknownDirective,\n  LNK_Warning_IllegalDirective,\n  LNK_Warning_UnresolvedComdat,\n  LNK_Warning_UnusedDelayLoadDll,\n  LNK_Warning_LongSectionName,\n  LNK_Warning_UnknownSwitch,\n  LNK_Warning_TLSAlign,\n  LNK_Warning_DirectiveSectionWithRelocs,\n  LNK_Warning_NoLargeAddressAwarenessForDll,\n  LNK_Warning_TryingToExportEntryPoint,\n  LNK_Warning_Last,\n  \n  LNK_Error_Count\n} LNK_ErrorCode;\n\ntypedef enum\n{\n  LNK_ErrorMode_Ignore,\n  LNK_ErrorMode_Stop,\n  LNK_ErrorMode_Continue,\n  LNK_ErrorMode_Warn,\n} LNK_ErrorMode;\n\ntypedef enum\n{\n  LNK_InternalError_Null,\n  LNK_InternalError_NotImplemented,\n  LNK_InternalError_InvalidPath,\n  LNK_InternalError_IncompleteSwitch,\n  LNK_InternalError_OutOfMemory\n} LNK_InternalError;\n\ntypedef enum\n{\n  LNK_ErrorCodeStatus_Active,\n  LNK_ErrorCodeStatus_Ignore,\n} LNK_ErrorCodeStatus;\n\ninternal void lnk_init_error_handler(void);\ninternal void lnk_errorfv(LNK_ErrorCode code, char *fmt, va_list args);\ninternal void lnk_error(LNK_ErrorCode code, char *fmt, ...);\ninternal void lnk_error_with_loc(LNK_ErrorCode code, String8 obj_path, String8 lib_path, char *fmt, ...);\ninternal void lnk_supplement_error(char *fmt, ...);\ninternal void lnk_supplement_error_list(String8List list);\ninternal void lnk_suppress_error(LNK_ErrorCode code);\n\n#define lnk_is_error_code_active(code)  (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Active)\n#define lnk_is_error_code_ignored(code) (lnk_get_error_code_status(code) == LNK_ErrorCodeStatus_Ignore)\ninternal LNK_ErrorCodeStatus lnk_get_error_code_status(LNK_ErrorCode code);\n\ninternal void lnk_internal_error(LNK_InternalError code, char *file, int line, char *fmt, ...);\n#define lnk_invalid_path(...)      lnk_internal_error(LNK_InternalError_InvalidPath, __FILE__, __LINE__, __VA_ARGS__)\n#define lnk_not_implemented(...)   lnk_internal_error(LNK_InternalError_NotImplemented, __FILE__, __LINE__, __VA_ARGS__)\n#define lnk_incomplete_switch(...) lnk_internal_error(LNK_InternalError_IncompleteSwitch, __FILE__, __LINE__, __VA_ARGS__)\n\n"
  },
  {
    "path": "src/linker/lnk_io.c",
    "content": "shared_function int\nlnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max)\n{\n  OS_Handle handle = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, str8((U8*)path, path_size));\n  Assert(sizeof(handle) <= handle_buffer_max);\n  MemoryCopy(handle_buffer, &handle, sizeof(handle));\n  return !os_handle_match(handle, os_handle_zero());\n}\n\nshared_function int\nlnk_open_file_write(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max)\n{\n  OS_Handle handle = os_file_open(OS_AccessFlag_Write, str8((U8*)path, path_size));\n  Assert(sizeof(handle) <= handle_buffer_max);\n  MemoryCopy(handle_buffer, &handle, sizeof(handle));\n  return !os_handle_match(handle, os_handle_zero());\n}\n\nshared_function void\nlnk_close_file(void *raw_handle)\n{\n  OS_Handle handle = *(OS_Handle *)raw_handle;\n  os_file_close(handle);\n}\n\nshared_function uint64_t\nlnk_size_from_file(void *raw_handle)\n{\n  OS_Handle handle = *(OS_Handle *)raw_handle;\n  FileProperties props  = os_properties_from_file(handle);\n  return props.size;\n}\n\nshared_function uint64_t\nlnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max)\n{\n  OS_Handle handle = *(OS_Handle *)raw_handle;\n  U64 read_size = os_file_read(handle, rng_1u64(0, buffer_max), buffer);\n  Assert(read_size == buffer_max);\n  return read_size;\n}\n\nshared_function uint64_t\nlnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_size)\n{\n  OS_Handle handle = *(OS_Handle*)raw_handle;\n  U64 write_size = os_file_write(handle, r1u64(offset, offset + buffer_size), buffer);\n  return write_size;\n}\n\ninternal String8\nlnk_find_first_file(Arena *arena, String8List dir_list, String8 path)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 result = {0};\n  if (os_file_path_exists(path)) {\n    PathStyle path_style = path_style_from_str8(path);\n    if (path_style == PathStyle_Relative) {\n      String8 current_path = os_get_current_path(scratch.arena);\n      String8List l = {0};\n      str8_list_push(scratch.arena, &l, current_path);\n      str8_list_push(scratch.arena, &l, path);\n      result = str8_path_list_join_by_style(arena, &l, PathStyle_SystemAbsolute);\n    } else {\n      result = path;\n    }\n  } else {\n    String8 file_name = str8_skip_last_slash(path);\n    for EachNode(n, String8Node, dir_list.first) {\n      String8 full_path = push_str8f(scratch.arena, \"%S/%S\", n->string, file_name);\n      if (os_file_path_exists(full_path)) {\n        result = push_str8_copy(arena, full_path);\n        break;\n      }\n    }\n  }\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal OS_Handle\nlnk_file_open_with_rename_permissions(String8 path)\n{\n  OS_Handle file_handle = os_handle_zero();\n#if OS_WINDOWS\n  Temp scratch = scratch_begin(0,0);\n\n  // open file with permissions to rename\n  String16            path16              = str16_from_8(scratch.arena, path);\n  SECURITY_ATTRIBUTES security_attributes = { sizeof(security_attributes) };\n  HANDLE native_handle = CreateFileW((WCHAR*)path16.str,\n                                     GENERIC_WRITE|DELETE,\n                                     FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,\n                                     &security_attributes,\n                                     CREATE_ALWAYS,\n                                     FILE_ATTRIBUTE_NORMAL,\n                                     0);\n  if (native_handle != INVALID_HANDLE_VALUE) {\n    file_handle.u64[0] = (U64)native_handle;\n  }\n\n  scratch_end(scratch);\n#else\n# error \"TODO: file rename\"\n#endif\n  return file_handle;\n}\n\ninternal B32\nlnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file)\n{\n#if OS_WINDOWS\n  FILE_DISPOSITION_INFO file_disposition = {0};\n  file_disposition.DeleteFile            = (BOOL)delete_file;\n  B32 is_set = SetFileInformationByHandle((HANDLE)handle.u64[0], FileDispositionInfo, &file_disposition, sizeof(file_disposition));\n#else\n# error \"TODO: file rename\"\n#endif\n  return is_set;\n}\n\ninternal B32\nlnk_file_rename(OS_Handle handle, String8 new_name)\n{\n  Temp scratch = scratch_begin(0,0);\n#if OS_WINDOWS\n  String16 new_name16 = str16_from_8(scratch.arena, new_name);\n\n  U64 file_rename_info_size = sizeof(FILE_RENAME_INFO);\n  U64 buffer_size           = file_rename_info_size + sizeof(new_name16.str)*new_name16.size;\n  U8 *buffer                = push_array(scratch.arena, U8, buffer_size);\n\n  FILE_RENAME_INFO *rename_info = (FILE_RENAME_INFO *)buffer;\n  rename_info->ReplaceIfExists  = 1;\n  rename_info->FileNameLength   = new_name16.size * sizeof(new_name16.str[0]);\n  MemoryCopy(rename_info->FileName, new_name16.str, new_name16.size * sizeof(new_name16.str[0]));\n\n  B32 is_renamed = SetFileInformationByHandle((HANDLE)handle.u64[0], FileRenameInfo, buffer, buffer_size);\n#else\n#error \"TODO: file rename\"\n#endif\n  scratch_end(scratch);\n  return is_renamed;\n}\n\ninternal void\nlnk_log_read(String8 path, U64 size)\n{\n  lnk_log(LNK_Log_IO_Read, \"Read from \\\"%S\\\" %M\", path, size);\n}\n\ninternal String8\nlnk_read_data_from_file_path(Arena *arena, LNK_IO_Flags io_flags, String8 path)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  TP_Context *single_thread_ctx = tp_alloc(scratch.arena, 1, 1, str8_zero());\n  String8Array data_arr = lnk_read_data_from_file_path_parallel(single_thread_ctx, arena, io_flags, (String8Array){ .count = 1, .v = &path });\n  scratch_end(scratch);\n  return data_arr.v[0];\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_data_size_from_file_path_task)\n{\n  LNK_DiskReader *task = raw_task;\n  String8         path = task->path_arr.v[task_id];\n\n  OS_Handle handle = {0};\n  U64       size   = 0;\n\n  int is_open = lnk_open_file_read((char*)path.str, path.size, &handle, sizeof(handle));\n  if (is_open) {\n    size = lnk_size_from_file(&handle);\n  }\n\n  task->handle_arr[task_id] = handle;\n  task->size_arr[task_id]   = size;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_data_from_file_path_task)\n{\n  LNK_DiskReader *task = raw_task;\n\n  OS_Handle handle      = task->handle_arr[task_id];\n  U64       buffer_size = task->size_arr[task_id];\n  U8       *buffer      = task->buffer + task->off_arr[task_id];\n\n  U64 read_size = lnk_read_file(&handle, buffer, buffer_size);\n  Assert(read_size == buffer_size);\n\n  task->data_arr.v[task_id] = str8(buffer, read_size);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_memory_map_file_task)\n{\n  LNK_DiskReader *task = raw_task;\n#if OS_WINDOWS\n  Temp scratch = scratch_begin(&arena, 1);\n  String16 path16      = str16_from_8(scratch.arena, task->path_arr.v[task_id]);\n  HANDLE   file_handle = CreateFileW(path16.str, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);\n  if (file_handle != INVALID_HANDLE_VALUE) {\n    HANDLE mapping_handle = CreateFileMappingA(file_handle, 0, PAGE_WRITECOPY, 0, 0, 0);\n    if (mapping_handle != INVALID_HANDLE_VALUE) {\n      LARGE_INTEGER file_size = {0};\n      GetFileSizeEx(file_handle, &file_size);\n      void *file_data = MapViewOfFile(mapping_handle, FILE_MAP_COPY, 0, 0, file_size.QuadPart);\n      if (file_data) {\n        // asan crashes for an unknown reason on memory-mapped files, even though the allocation is perfectly fine\n        AsanUnpoisonMemoryRegion(file_data, file_size.QuadPart);\n        task->data_arr.v[task_id] = str8(file_data, file_size.QuadPart);\n      }\n      CloseHandle(mapping_handle);\n    }\n    CloseHandle(file_handle);\n  }\n  scratch_end(scratch);\n#else\n# error \"memory mapping files is not supported on this platform\"\n#endif\n}\n\ninternal String8Array\nlnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags io_flags, String8Array path_arr)\n{\n  LNK_DiskReader reader = {0};\n\n  if (io_flags & LNK_IO_Flags_MemoryMapFiles) {\n    reader.io_flags       = io_flags;\n    reader.path_arr       = path_arr;\n    reader.data_arr.count = path_arr.count;\n    reader.data_arr.v     = push_array(arena, String8, path_arr.count);\n    tp_for_parallel(tp, 0, path_arr.count, lnk_memory_map_file_task, &reader);\n  } else {\n    Temp scratch = scratch_begin(&arena,1);\n\n    reader.path_arr       = path_arr;\n    reader.handle_arr     = push_array_no_zero(scratch.arena, OS_Handle, path_arr.count);\n    reader.size_arr       = push_array_no_zero(scratch.arena, U64, path_arr.count);\n\n    // open handles and get sizes\n    tp_for_parallel(tp, 0, path_arr.count, lnk_data_size_from_file_path_task, &reader);\n\n    // compute file buffer size\n    U64 total_data_size = sum_array_u64(path_arr.count, reader.size_arr);\n\n    // assign offsets into file buffer\n    U64 *off_arr = push_array_no_zero(scratch.arena, U64, path_arr.count);\n    MemoryCopyTyped(off_arr, reader.size_arr, path_arr.count);\n    counts_to_offsets_array_u64(path_arr.count, off_arr);\n\n    reader.io_flags = io_flags;\n    reader.data_arr = str8_array_reserve(arena, path_arr.count);\n    reader.off_arr  = off_arr;\n    reader.buffer   = push_array_no_zero(arena, U8, total_data_size);\n\n    // read files and close handles\n    tp_for_parallel(tp, 0, path_arr.count, lnk_data_from_file_path_task, &reader);\n\n    scratch_end(scratch);\n  }\n  \n  String8Array result = {0};\n  result.count        = path_arr.count;\n  result.v            = reader.data_arr.v;\n\n  if (lnk_get_log_status(LNK_Log_IO_Read)) {\n    for (U64 i = 0; i < result.count; ++i) {\n      lnk_log_read(path_arr.v[i], result.v[i].size);\n    }\n  }\n\n  return result;\n}\n\ninternal void\nlnk_write_data_list_to_file_path(String8 path, String8 temp_path, String8List data)\n{\n  ProfBeginV(\"Write %M to %S\", data.total_size, path);\n\n  B32       open_with_rename = (temp_path.size > 0);\n  OS_Handle file_handle      = {0};\n  String8   open_file_path   = {0};\n  if (open_with_rename) {\n    file_handle    = lnk_file_open_with_rename_permissions(temp_path);\n    open_file_path = temp_path;\n\n    // mark file to be deleted on exit, so we don't leave corrupted files on disk\n    if (!lnk_file_set_delete_on_close(file_handle, 1)) {\n      lnk_error(LNK_Error_IO, \"failed to update file disposition on %S\", open_file_path);\n    }\n  } else {\n    lnk_open_file_write((char*)path.str, path.size, &file_handle, sizeof(file_handle));\n    open_file_path = path;\n  }\n\n  if (!os_handle_match(file_handle, os_handle_zero())) {\n    // try to reserve up front file size\n    if (!os_file_reserve_size(file_handle, data.total_size)) {\n      lnk_log(LNK_Log_IO_Write, \"Failed to pre-allocate file %S with size %M\", open_file_path, data.total_size);\n    }\n\n    // write data nodes\n    U64 bytes_written = 0;\n    for (String8Node *data_n = data.first; data_n != 0; data_n = data_n->next) {\n      U64 write_size = lnk_write_file(&file_handle, bytes_written, data_n->string.str, data_n->string.size);\n      if (write_size != data_n->string.size) {\n        break;\n      }\n      bytes_written += data_n->string.size;\n    }\n    B32 is_write_complete = (bytes_written == data.total_size);\n\n    if (is_write_complete) {\n      // rename temp file\n      if (open_with_rename) {\n        // all writes succeeded, remove delete on exit flag\n        if (!lnk_file_set_delete_on_close(file_handle, 0)) {\n          lnk_error(LNK_Error_IO, \"failed to update file disposition on %S\", open_file_path);\n        }\n\n        if (lnk_file_rename(file_handle, path)) {\n          lnk_log(LNK_Log_IO_Write, \"Renamed %S -> %S\", temp_path, path);\n        } else {\n          lnk_error(LNK_Error_IO, \"failed to rename %S -> %S\", temp_path, path);\n        }\n      }\n    }\n\n    // clean up file handle\n    lnk_close_file(&file_handle);\n\n    // log write\n    if (is_write_complete) {\n      if (lnk_get_log_status(LNK_Log_IO_Write)) {\n        lnk_log(LNK_Log_IO_Write, \"File \\\"%S\\\" %M written\", path, data.total_size);\n      }\n    } else {\n      lnk_error(LNK_Error_IO, \"incomplete write, %M written, expected %M, file %S\", bytes_written, data.total_size, path);\n    }\n  } else {\n    lnk_error(LNK_Error_NoAccess, \"don't have access to write to %S\", path);\n  }\n  \n  ProfEnd();\n}\n\ninternal void\nlnk_write_data_to_file_path(String8 path, String8 temp_path, String8 data)\n{\n  Temp scratch = scratch_begin(0,0);\n  String8List data_list = {0};\n  str8_list_push(scratch.arena, &data_list, data);\n  lnk_write_data_list_to_file_path(path, temp_path, data_list);\n  scratch_end(scratch);\n}\n\n"
  },
  {
    "path": "src/linker/lnk_io.h",
    "content": "#pragma once\n\ntypedef U32 LNK_IO_Flags;\nenum\n{\n  LNK_IO_Flags_MemoryMapFiles = (1 << 0),\n};\n\ntypedef struct\n{\n  LNK_IO_Flags io_flags;\n  String8Array path_arr;\n  String8Array data_arr;\n  OS_Handle   *handle_arr;\n  U64         *size_arr;\n  U64         *off_arr;\n  U8          *buffer;\n} LNK_DiskReader;\n\n// --- Shared File API ---------------------------------------------------------\n\nshared_function int      lnk_open_file_read(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max);\nshared_function int      lnk_open_file_write(char *path, uint64_t path_size, void *handle_buffer, uint64_t handle_buffer_max);\nshared_function void     lnk_close_file(void *raw_handle);\nshared_function uint64_t lnk_size_from_file(void *raw_handle);\nshared_function uint64_t lnk_read_file(void *raw_handle, void *buffer, uint64_t buffer_max);\nshared_function uint64_t lnk_write_file(void *raw_handle, uint64_t offset, void *buffer, uint64_t buffer_size);\n\n// --- IO Functions ------------------------------------------------------------\n\ninternal OS_Handle lnk_file_open_with_rename_permissions(String8 path);\ninternal B32       lnk_file_set_delete_on_close(OS_Handle handle, B32 delete_file);\ninternal B32       lnk_file_rename(OS_Handle handle, String8 new_name);\n\ninternal String8      lnk_read_data_from_file_path(Arena *arena, LNK_IO_Flags io_flags, String8 path);\ninternal String8Array lnk_read_data_from_file_path_parallel(TP_Context *tp, Arena *arena, LNK_IO_Flags io_flags, String8Array path_arr);\n\ninternal void lnk_write_data_list_to_file_path(String8 path, String8 temp_path, String8List list);\ninternal void lnk_write_data_to_file_path(String8 path, String8 temp_path, String8 data);\n\n"
  },
  {
    "path": "src/linker/lnk_lib.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal int\nlnk_lib_node_is_before(void *a, void *b)\n{\n  return ((LNK_LibNode*)a)->data.input_idx < ((LNK_LibNode*)b)->data.input_idx;\n}\n\ninternal int\nlnk_lib_node_ptr_is_before(void *raw_a, void *raw_b)\n{\n  return lnk_lib_node_is_before(*(LNK_Lib **)raw_a, *(LNK_Lib **)raw_b);\n}\n\ninternal B32\nlnk_first_member_sort_key_is_before(void *raw_a, void *raw_b)\n{\n  LNK_FirstMemberSortKey *a = raw_a, *b = raw_b;\n  return str8_is_before_case_sensitive(&a->symbol_name, &b->symbol_name);\n}\n\ninternal B32\nlnk_lib_from_data(Arena *arena, String8 data, String8 path, U64 input_idx, LNK_Lib *lib_out)\n{\n  // is data archive?\n  COFF_ArchiveType type = coff_archive_type_from_data(data);\n  if (type == COFF_Archive_Null) {\n    return 0;\n  }\n\n  // TODO: report parse errors\n  COFF_ArchiveParse parse = coff_archive_parse_from_data(data);\n  if (parse.error.size) {\n    return 0;\n  }\n\n  U32           member_count   = 0;\n  U64           symbol_count   = 0;\n  String8Array  symbol_names   = {0};\n  U16          *symbol_indices = 0;\n  U32          *member_offsets = 0;\n\n  // try to init library from optional second member\n  if (parse.second_member.member_count) {\n    COFF_ArchiveSecondMember second_member = parse.second_member;\n    Assert(second_member.symbol_count == second_member.symbol_index_count);\n    Assert(second_member.member_count == second_member.member_offset_count);\n    \n    member_count   = second_member.member_count;\n    symbol_count   = second_member.symbol_count;\n    member_offsets = second_member.member_offsets;\n    symbol_indices = second_member.symbol_indices;\n\n    // parse symbol names\n    {\n      Temp scratch = scratch_begin(&arena, 1);\n      String8List symbol_name_list = str8_split_by_string_chars(scratch.arena, second_member.string_table, str8_lit(\"\\0\"), 0);\n      Assert(symbol_name_list.node_count >= symbol_count);\n      symbol_names = str8_array_from_list(arena, &symbol_name_list);\n      scratch_end(scratch);\n    }\n  } \n  // first member is deprecated however tools emit it for compatibility reasons\n  // and lld-link with /DLL emits only first member\n  else if (parse.first_member.symbol_count) {\n    Temp scratch = scratch_begin(&arena, 1);\n\n    COFF_ArchiveFirstMember first_member = parse.first_member;\n    Assert(first_member.symbol_count == first_member.member_offset_count);\n    \n    symbol_count = first_member.symbol_count;\n    \n    // convert big endian offsets\n    for (U32 offset_idx = 0; offset_idx < symbol_count; offset_idx += 1) {\n      first_member.member_offsets[offset_idx] = from_be_u32(first_member.member_offsets[offset_idx]);\n    }\n\n    // compress member offsets to match those from the second header\n    {\n      HashTable *member_off_ht = hash_table_init(scratch.arena, (U64)((F64)first_member.symbol_count * 1.3));\n      for EachIndex(symbol_idx, symbol_count) {\n        if (!hash_table_search_u32_u32(member_off_ht, first_member.member_offsets[symbol_idx], 0)) {\n          hash_table_push_u32_u32(scratch.arena, member_off_ht, first_member.member_offsets[symbol_idx], member_off_ht->count);\n        }\n      }\n\n      symbol_indices = push_array(arena, U16, first_member.symbol_count);\n      for EachIndex(symbol_idx, first_member.symbol_count) {\n        U32 member_off = first_member.member_offsets[symbol_idx];\n        U32 member_off_idx = 0;\n        if (!hash_table_search_u32_u32(member_off_ht, member_off, &member_off_idx)) {\n          InvalidPath;\n        }\n        symbol_indices[symbol_idx] = member_off_idx+1;\n      }\n\n      member_count   = member_off_ht->count;\n      member_offsets = push_array_no_zero(arena, U32, member_count);\n\n      for EachIndex(bucket_idx, member_off_ht->cap) {\n        BucketList *bucket = &member_off_ht->buckets[bucket_idx];\n        for (BucketNode *n = bucket->first; n != 0; n = n->next) {\n          U32 member_off     = n->v.key_u32;\n          U32 member_off_idx = n->v.value_u32;\n          member_offsets[member_off_idx] = member_off;\n        }\n      }\n      \n      // parse symbol names\n      {\n        Temp scratch = scratch_begin(&arena, 1);\n        String8List symbol_name_list = str8_split_by_string_chars(scratch.arena, first_member.string_table, str8_lit(\"\\0\"), 0);\n        Assert(symbol_name_list.node_count >= first_member.symbol_count);\n        symbol_names = str8_array_from_list(arena, &symbol_name_list);\n        scratch_end(scratch);\n      }\n\n      // sort lexically symbol names\n      LNK_FirstMemberSortKey *sort_keys = push_array_no_zero(scratch.arena, LNK_FirstMemberSortKey, first_member.symbol_count);\n      for EachIndex(symbol_idx, first_member.symbol_count) {\n        sort_keys[symbol_idx].symbol_name    = symbol_names.v[symbol_idx];\n        sort_keys[symbol_idx].member_off_idx = symbol_indices[symbol_idx];\n      }\n      radsort(sort_keys, first_member.symbol_count, lnk_first_member_sort_key_is_before);\n\n      for EachIndex(symbol_idx, first_member.symbol_count) {\n        symbol_names.v[symbol_idx] = sort_keys[symbol_idx].symbol_name;\n        symbol_indices[symbol_idx] = sort_keys[symbol_idx].member_off_idx;\n      }\n    }\n\n    scratch_end(scratch);\n  }\n  \n  // init lib\n  lib_out->path              = push_str8_copy(arena, path);\n  lib_out->data              = data;\n  lib_out->type              = type;\n  lib_out->member_count      = member_count;\n  lib_out->symbol_count      = Min(symbol_count, symbol_names.count); // TODO: warn about mismatched number of symbol names and symbol count in the header\n  lib_out->member_offsets    = member_offsets;\n  lib_out->symbol_indices    = symbol_indices;\n  lib_out->member_links      = push_array(arena, LNK_Symbol *, member_count);\n  lib_out->symbol_names      = symbol_names;\n  lib_out->long_names        = parse.long_names;\n  lib_out->input_idx         = input_idx;\n  \n  return 1;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_lib_initer)\n{\n  LNK_LibIniter *task  = raw_task;\n  LNK_Input     *input = task->inputs[task_id];\n\n  U64          lib_node_idx = ins_atomic_u64_inc_eval(&task->next_free_lib_idx)-1;\n  LNK_LibNode *lib_node     = &task->free_libs[lib_node_idx];\n\n  B32 is_valid_lib = lnk_lib_from_data(arena, input->data, input->path, task->lib_id_base + task_id, &lib_node->data);\n  if (is_valid_lib) {\n    U64 valid_lib_idx = ins_atomic_u64_inc_eval(&task->valid_libs_count)-1;\n    task->valid_libs[valid_lib_idx] = lib_node;\n  } else {\n    U64 invalid_lib_idx = ins_atomic_u64_inc_eval(&task->invalid_libs_count);\n    task->invalid_libs[invalid_lib_idx] = lib_node;\n  }\n}\n\ninternal LNK_Lib **\nlnk_array_from_lib_list(Arena *arena, LNK_LibList list)\n{\n  LNK_Lib **arr = push_array_no_zero(arena, LNK_Lib *, list.count);\n  U64 idx = 0;\n  for (LNK_LibNode *node = list.first; node != 0; node = node->next, ++idx) {\n    arr[idx] = &node->data;\n  }\n  return arr;\n}\n\ninternal void\nlnk_lib_list_push_node(LNK_LibList *list, LNK_LibNode *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal LNK_LibNodeArray\nlnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, U64 inputs_count, LNK_Input **inputs)\n{\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  U64 lib_id_base = list->count;\n\n  // parse libs in parallel\n  LNK_LibIniter task = {0};\n  task.lib_id_base   = list->count;\n  task.free_libs     = push_array(arena->v[0], LNK_LibNode, inputs_count);\n  task.valid_libs    = push_array(scratch.arena, LNK_LibNode *, inputs_count);\n  task.invalid_libs  = push_array(scratch.arena, LNK_LibNode *, inputs_count);\n  task.inputs        = inputs;\n  tp_for_parallel(tp, arena, inputs_count, lnk_lib_initer, &task);\n\n  // report invalid libs\n  radsort(task.invalid_libs, task.invalid_libs_count, lnk_lib_node_ptr_is_before);\n  for EachIndex(i, task.invalid_libs_count) {\n    U64 input_idx = task.invalid_libs[i]->data.input_idx;\n    lnk_error(LNK_Error_InvalidLib, \"%S: failed to parse library\", inputs[input_idx]->path);\n  }\n\n  // push parsed libs\n  radsort(task.valid_libs, task.valid_libs_count, lnk_lib_node_ptr_is_before);\n  for EachIndex(i, task.valid_libs_count) {\n    lnk_lib_list_push_node(list, task.valid_libs[i]);\n  }\n\n  LNK_LibNodeArray result = { .count = task.valid_libs_count, task.valid_libs };\n\n  scratch_end(scratch);\n  return result;\n}\n\ninternal B32\nlnk_lib_set_link_symbol(LNK_Lib *lib, U32 member_idx, LNK_Symbol *link_symbol)\n{\n  local_persist LNK_Symbol null_symbol;\n\n  LNK_Symbol *slot = ins_atomic_ptr_eval_assign(&lib->member_links[member_idx], &null_symbol);\n\n  B32 was_linked = (slot == 0);\n\n  for (LNK_Symbol *leader = link_symbol;;) {\n    // update slot symbol if it is empty or link symbol comes before symbol in the slot\n    if (slot && slot != &null_symbol) {\n      if (lnk_symbol_is_before(slot, leader)) {\n        leader = slot;\n      }\n    } else {\n      leader = link_symbol;\n    }\n\n    // try to insert back updated slot symbol\n    LNK_Symbol *swap = ins_atomic_ptr_eval_cond_assign(&lib->member_links[member_idx], leader, &null_symbol);\n\n    // exit if slot symbol was null\n    if (swap == &null_symbol) {\n      break;\n    }\n\n    // reload slot symbol\n    slot = ins_atomic_ptr_eval_assign(&lib->member_links[member_idx], &null_symbol);\n  }\n\n  return was_linked;\n}\n\ninternal force_inline B32\nlnk_search_lib(LNK_Lib *lib, String8 symbol_name, U32 *member_idx_out)\n{\n  U64 symbol_idx = str8_array_bsearch(lib->symbol_names, symbol_name);\n  if (symbol_idx < lib->symbol_count) {\n    if (member_idx_out) {\n      *member_idx_out = lib->symbol_indices[symbol_idx]-1;\n    }\n    return 1;\n  }\n  return 0;\n}\n\n"
  },
  {
    "path": "src/linker/lnk_lib.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef struct LNK_Lib\n{\n  String8              path;\n  String8              data;\n  COFF_ArchiveType     type;\n  U32                  member_count;\n  U32                  symbol_count;\n  U32                 *member_offsets;\n  U16                 *symbol_indices;\n  LNK_Symbol         **member_links;\n  String8Array         symbol_names;\n  String8              long_names;\n  U64                  input_idx;\n} LNK_Lib;\n \ntypedef struct LNK_LibNode\n{\n  LNK_Lib             data;\n  struct LNK_LibNode *next;\n} LNK_LibNode;\n\ntypedef struct LNK_LibNodeArray\n{\n  U64           count;\n  LNK_LibNode **v;\n} LNK_LibNodeArray;\n\ntypedef struct LNK_LibList\n{\n  U64          count;\n  LNK_LibNode *first;\n  LNK_LibNode *last;\n} LNK_LibList;\n\ntypedef struct LNK_FirstMemberSortKey\n{\n  String8 symbol_name;\n  U16     member_off_idx;\n} LNK_FirstMemberSortKey;\n\n// --- Workers Contexts --------------------------------------------------------\n \ntypedef struct\n{\n  struct LNK_Input  **inputs;\n  U64                 lib_id_base;\n  U64                 next_free_lib_idx;\n  U64                 valid_libs_count;\n  U64                 invalid_libs_count;\n  LNK_LibNode        *free_libs;\n  LNK_LibNode       **valid_libs;\n  LNK_LibNode       **invalid_libs;\n} LNK_LibIniter;\n\n// -----------------------------------------------------------------------------\n\ninternal int lnk_lib_node_is_before(void *a, void *b);\ninternal int lnk_lib_node_ptr_is_before(void *raw_a, void *raw_b);\n\ninternal B32              lnk_lib_from_data(Arena *arena, String8 data, String8 path, U64 input_idx, LNK_Lib *lib_out);\ninternal LNK_Lib **       lnk_array_from_lib_list(Arena *arena, LNK_LibList list);\ninternal void             lnk_lib_list_push_node(LNK_LibList *list, LNK_LibNode *node);\ninternal LNK_LibNodeArray lnk_lib_list_push_parallel(TP_Context *tp, TP_Arena *arena, LNK_LibList *list, U64 inputs_count, struct LNK_Input **inputs);\n\ninternal B32 lnk_lib_set_link_symbol(LNK_Lib *lib, U32 member_idx, LNK_Symbol *link_symbol);\n\ninternal B32 lnk_search_lib(LNK_Lib *lib, String8 symbol_name, U32 *member_idx_out);\n\n"
  },
  {
    "path": "src/linker/lnk_log.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal void\nlnk_set_log_status(LNK_LogType type, B32 is_enabled)\n{\n  g_log_status[type] = is_enabled;\n}\n\ninternal B32\nlnk_get_log_status(LNK_LogType type)\n{\n  B32 status = g_log_status[type];\n  return status;\n}\n\ninternal void\nlnk_log(LNK_LogType type, char *fmt, ...)\n{\n  B32 is_log_enabled = g_log_status[type];\n  if (is_log_enabled) {\n    Temp scratch = scratch_begin(0,0);\n    va_list args;\n    va_start(args, fmt);\n    String8 string = push_str8fv(scratch.arena, fmt, args);\n    fprintf(stdout, \"%.*s\\n\", str8_varg(string));\n    va_end(args);\n    scratch_end(scratch);\n  }\n}\n\ninternal LNK_LogType\nlnk_log_type_from_string(String8 string)\n{\n  static struct {\n    char       *name;\n    LNK_LogType type;\n  } map[] = {\n    \"Null\",          LNK_Log_Null,\n    \"Debug\",         LNK_Log_Debug,\n    \"InputObj\",      LNK_Log_InputObj,\n    \"InputLib\",      LNK_Log_InputLib,\n    \"IO_Read\",       LNK_Log_IO_Read,\n    \"IO_Write\",      LNK_Log_IO_Write,\n    \"SizeBreakdown\", LNK_Log_SizeBreakdown,\n    \"LinkStats\",     LNK_Log_LinkStats,\n    \"Timers\",        LNK_Log_Timers,\n    \"Links\",         LNK_Log_Links,\n  };\n  Assert(ArrayCount(map) == LNK_Log_Count);\n\n  for (U64 i = 0; i < ArrayCount(map); ++i) {\n    if (str8_match(str8_cstring(map[i].name), string, StringMatchFlag_CaseInsensitive)) {\n      return map[i].type;\n    }\n  }\n\n  return LNK_Log_Null;\n}\n\n\n"
  },
  {
    "path": "src/linker/lnk_log.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef enum\n{\n  LNK_Log_Null,\n  LNK_Log_Debug,\n  LNK_Log_InputObj,\n  LNK_Log_InputLib,\n  LNK_Log_IO_Read,\n  LNK_Log_IO_Write,\n  LNK_Log_SizeBreakdown,\n  LNK_Log_LinkStats,\n  LNK_Log_Timers,\n  LNK_Log_Links, \n  LNK_Log_Count\n} LNK_LogType;\n\ninternal void set_log_level(LNK_LogType type, B32 is_enabled);\ninternal B32  lnk_get_log_status(LNK_LogType type);\ninternal void lnk_log(LNK_LogType type, char *fmt, ...);\n\ninternal LNK_LogType lnk_log_type_from_string(String8 string);\n\n"
  },
  {
    "path": "src/linker/lnk_obj.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8\nlnk_loc_from_obj(Arena *arena, LNK_Obj *obj)\n{\n  String8 obj_path = str8_skip_last_slash(obj ? obj->path : str8_lit(\"RADLINK\"));\n  String8 lib_path = str8_skip_last_slash(lnk_obj_get_lib_path(obj));\n  String8 result;\n  if (lib_path.size) {\n    result = push_str8f(arena, \"%S(%S)\", lib_path, obj_path);\n  } else {\n    result = push_str8_copy(arena, obj_path);\n  }\n  return result;\n}\n\ninternal void\nlnk_error_obj(LNK_ErrorCode code, LNK_Obj *obj, char *fmt, ...)\n{\n  va_list args; va_start(args, fmt);\n  String8 obj_path = obj ? obj->path : str8_zero();\n  String8 lib_path = lnk_obj_get_lib_path(obj);\n  lnk_error_with_loc_fv(code, obj_path, lib_path, fmt, args);\n  va_end(args);\n}\n\ninternal void\nlnk_error_input_obj(LNK_ErrorCode code, LNK_Input *input, char *fmt, ...)\n{\n  va_list args; va_start(args, fmt);\n  LNK_LibMemberRef *link_member = input->link_member;\n  LNK_Lib          *link_lib    = link_member ? link_member->lib : 0;\n  lnk_error_with_loc_fv(code, input->path, link_lib ? link_lib->path : str8_zero(), fmt, args);\n  va_end(args);\n}\n\ninternal LNK_Obj **\nlnk_array_from_obj_list(Arena *arena, LNK_ObjList list)\n{\n  LNK_Obj **arr = push_array_no_zero(arena, LNK_Obj *, list.count);\n  U64 idx = 0;\n  for (LNK_ObjNode *node = list.first; node != 0; node = node->next, ++idx) {\n    arr[idx] = &node->data;\n  }\n  return arr;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_obj_initer)\n{\n  LNK_ObjIniter *task    = raw_task;\n  LNK_Input     *input   = task->inputs[task_id];\n  LNK_Obj       *obj     = &task->objs[task_id].data;\n\n  //ProfBeginV(\"Init Obj [%S%s%S]\", input->lib_path, (input->lib_path.size ? \": \" : 0), input->path);\n\n  //\n  // parse obj header\n  //\n  COFF_FileHeaderInfo header = coff_file_header_info_from_data(input->data);\n\n  //\n  // set & check machine compatibility\n  //\n  if (header.machine != COFF_MachineType_Unknown) {\n    COFF_MachineType current_machine = ins_atomic_u32_eval_cond_assign(&task->machine, header.machine, COFF_MachineType_Unknown);\n    if (current_machine != COFF_MachineType_Unknown && current_machine != header.machine) {\n      lnk_error_input_obj(LNK_Error_IncompatibleMachine, input,\n          \"conflicting machine types expected %S but got %S\",\n          coff_string_from_machine_type(current_machine),\n          coff_string_from_machine_type(header.machine));\n    }\n  }\n\n  //\n  // extract COFF info\n  //\n  String8 raw_coff_section_table = str8_substr(input->data, header.section_table_range);\n  String8 raw_coff_symbol_table  = str8_substr(input->data, header.symbol_table_range);\n  String8 raw_coff_string_table  = str8_substr(input->data, header.string_table_range);\n\n  //\n  // error check section table / symbol table / string table\n  //\n  if (raw_coff_section_table.size != dim_1u64(header.section_table_range)) {\n    lnk_error_input_obj(LNK_Error_IllData, input, \"corrupted file, unable to read section header table\");\n  }\n  if (raw_coff_symbol_table.size != dim_1u64(header.symbol_table_range)) {\n    lnk_error_input_obj(LNK_Error_IllData, input, \"corrupted file, unable to read symbol table\");\n  }\n  if (raw_coff_string_table.size != dim_1u64(header.string_table_range)) {\n    lnk_error_input_obj(LNK_Error_IllData, input, \"corrupted file, unable to read string table\");\n  }\n\n  //\n  // error check section headers\n  //\n  COFF_SectionHeader *coff_section_table = (COFF_SectionHeader *)raw_coff_section_table.str;\n  for (U64 sect_idx = 0; sect_idx < header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *coff_sect_header = &coff_section_table[sect_idx];\n    String8             sect_name        = coff_name_from_section_header(raw_coff_string_table, coff_sect_header);\n    if (~coff_sect_header->flags & COFF_SectionFlag_CntUninitializedData) {\n      if (coff_sect_header->fsize > 0) {\n        Rng1U64 sect_range = rng_1u64(coff_sect_header->foff, coff_sect_header->foff + coff_sect_header->fsize);\n        if (contains_1u64(header.header_range, coff_sect_header->foff) ||\n            (coff_sect_header->fsize > 0 && contains_1u64(header.header_range, sect_range.max-1))) {\n          lnk_error_input_obj(LNK_Error_IllData, input, \"header (%S No. %#llx) defines out of bounds section data (file offsets point into file header)\", sect_name, sect_idx+1);\n        }\n        if (contains_1u64(header.section_table_range, coff_sect_header->foff) ||\n            (coff_sect_header->fsize > 0 && contains_1u64(header.section_table_range, sect_range.max-1))) {\n          lnk_error_input_obj(LNK_Error_IllData, input, \"header (%S No. %#llx) defines out of bounds section data (file offsets point into section header table)\", sect_name, sect_idx+1);\n        }\n        if (contains_1u64(header.symbol_table_range, coff_sect_header->foff) ||\n            (coff_sect_header->fsize > 0 && contains_1u64(header.symbol_table_range, sect_range.max-1))) {\n          lnk_error_input_obj(LNK_Error_IllData, input, \"header (%S No. %#llx) defines out of bounds section data (file offsets point into symbol table)\", sect_name, sect_idx+1);\n        }\n        if (dim_1u64(sect_range) != coff_sect_header->fsize) {\n          lnk_error_input_obj(LNK_Error_IllData, input, \"header (%S No. %#llx) defines out of bounds section data\", sect_name, sect_idx+1);\n        }\n      }\n    }\n  }\n\n  //\n  // error check symbol table\n  //\n  {\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(input->data, header.section_table_range).str;\n    COFF_ParsedSymbol symbol;\n    for (U64 symbol_idx = 0; symbol_idx < header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n      symbol = coff_parse_symbol(header, raw_coff_string_table, raw_coff_symbol_table, symbol_idx);\n      COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n      if (interp == COFF_SymbolValueInterp_Regular) {\n        if (symbol.section_number == 0 || symbol.section_number > header.section_count_no_null) {\n          lnk_error_input_obj(LNK_Error_IllData, input, \"symbol %S (No. 0x%x) points to an out of bounds section 0x%x\", symbol.name, symbol_idx, symbol.section_number);\n        }\n        if (symbol.storage_class == COFF_SymStorageClass_Static && symbol.aux_symbol_count > 0) {\n          COFF_ComdatSelectType select;\n          U32 section_number = 0;\n          coff_parse_secdef(symbol, header.is_big_obj, &select, &section_number, 0, 0);\n          if (select == COFF_ComdatSelect_Associative) {\n            if (section_number == 0 || section_number > header.section_count_no_null) {\n              lnk_error_input_obj(LNK_Error_IllData, input, \"section definition symbol %S (No. 0x%x) associates with an out of bounds section 0x%x\", symbol.name, symbol_idx, symbol.section_number);\n            }\n          }\n        }\n      }\n    }\n  }\n\n  //\n  // create symbol links to COMDAT sections\n  //\n  U32 *comdats;\n  {\n    comdats = push_array_no_zero(arena, U32, header.section_count_no_null);\n    MemorySet(comdats, 0xff, header.section_count_no_null * sizeof(comdats[0]));\n\n    COFF_ParsedSymbol symbol;\n    for (U64 symbol_idx = 0; symbol_idx < header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n      symbol = coff_parse_symbol(header, raw_coff_string_table, raw_coff_symbol_table, symbol_idx);\n\n      COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n      if (interp == COFF_SymbolValueInterp_Regular) {\n        if (symbol.storage_class == COFF_SymStorageClass_Static) {\n          if (symbol.section_number > 0 && symbol.section_number <= header.section_count_no_null) {\n            COFF_SectionHeader *sect_header = &coff_section_table[symbol.section_number-1];\n            if (sect_header->flags & COFF_SectionFlag_LnkCOMDAT) {\n              if (symbol.aux_symbol_count) {\n                U32 section_length = 0;\n                coff_parse_secdef(symbol, header.is_big_obj, 0, 0, &section_length, 0);\n                if (sect_header->fsize == section_length) {\n                  if (comdats[symbol.section_number-1] == ~0) {\n                    comdats[symbol.section_number-1] = symbol_idx;\n                  } else {\n                    lnk_error_input_obj(LNK_Error_IllData, input, \"section definition symbo (No. 0x%llx) tries to ovewrite comdat\", symbol_idx);\n                  }\n                } else {\n                  lnk_error_input_obj(LNK_Error_IllData, input, \"section size specified by section definition symbol (No 0x%llx) doesn't match size in section header (No. 0x%x); expected 0x%x got 0x%x\", symbol_idx, symbol.section_number, section_length, sect_header->fsize);\n                }\n              }\n            }\n          } else {\n            lnk_error_input_obj(LNK_Error_IllData, input, \"section definition symbol (No. 0x%llx) has out of bounds section number 0x%x\", symbol_idx, symbol.section_number);\n          }\n        }\n      }\n    }\n  }\n\n  //\n  // COMDAT loop checker\n  //\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n\n    HashTable *visited_sections = hash_table_init(scratch.arena, 32);\n    for (U64 sect_idx = 0; sect_idx < header.section_count_no_null; sect_idx += 1) {\n      for (U32 curr_section = sect_idx;;) {\n        U32 symbol_idx = comdats[curr_section];\n\n        // is section COMDAT?\n        if (symbol_idx == max_U32) {\n          break;\n        }\n\n        // extract COMDAT info for current section\n        COFF_ParsedSymbol     symbol         = coff_parse_symbol(header, raw_coff_string_table, raw_coff_symbol_table, symbol_idx);\n        COFF_ComdatSelectType select         = COFF_ComdatSelect_Null;\n        U32                   section_number = 0;\n        coff_parse_secdef(symbol, header.is_big_obj, &select, &section_number, 0, 0);\n\n        if (select != COFF_ComdatSelect_Associative) {\n          // section terminates at non-associative COMDAT -- no loop\n          break;\n        }\n\n        // was section visited? -- loop found\n        if (hash_table_search_u64(visited_sections, curr_section)) {\n          COFF_ParsedSymbol symbol = coff_parse_symbol(header, raw_coff_string_table, raw_coff_symbol_table, comdats[sect_idx]);\n          lnk_error_input_obj(LNK_Error_AssociativeLoop, input, \"section symbol %S (No. 0x%x) does not terminate on a non-associate COMDAT symbol\", symbol.name, comdats[sect_idx]);\n          break;\n        }\n\n        // track visited sections\n        hash_table_push_u64_u64(scratch.arena, visited_sections, curr_section, 0);\n\n        // follow association\n        Assert(section_number > 0);\n        curr_section = section_number-1;\n      }\n\n      // purge hash table for next run\n      hash_table_purge(visited_sections);\n    }\n\n    scratch_end(scratch);\n  }\n\n  //\n  // collect sections associations\n  //\n  U32Node **associated_sections = push_array(arena, U32Node *, header.section_count_no_null + 1);\n  {\n    COFF_ParsedSymbol symbol;\n    for (U32 symbol_idx = 0; symbol_idx < header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n      symbol = coff_parse_symbol(header, raw_coff_string_table, raw_coff_symbol_table, symbol_idx);\n      COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol);\n      if (interp == COFF_SymbolValueInterp_Regular && symbol.storage_class == COFF_SymStorageClass_Static && symbol.aux_symbol_count > 0) {\n        COFF_ComdatSelectType selection      = COFF_ComdatSelect_Null;\n        U32                   section_number = 0;\n        coff_parse_secdef(symbol, header.is_big_obj, &selection, &section_number, 0, 0);\n        if (selection != COFF_ComdatSelect_Associative) { continue; }\n\n        U32Node *associated_node = push_array(arena, U32Node, 1);\n        associated_node->data    = symbol.section_number;\n        SLLStackPush(associated_sections[section_number], associated_node);\n      }\n    }\n  }\n\n  //\n  // mark sections\n  //\n  {\n    for EachIndex(sect_idx, header.section_count_no_null) {\n      COFF_SectionHeader *sect_header = &coff_section_table[sect_idx];\n      String8             sect_name   = coff_name_from_section_header(raw_coff_string_table, sect_header);\n\n      // debug info\n      if (str8_starts_with(sect_name, str8_lit(\".debug$\"))) {\n        sect_header->flags |= LNK_SECTION_FLAG_DEBUG;\n      }\n\n      // function overrides\n      if (str8_ends_with(sect_name, str8_lit(\"$fo$\"), 0) ||\n          str8_ends_with(sect_name, str8_lit(\"$fo_rvas$\"), 0) ||\n          str8_ends_with(sect_name, str8_lit(\"$fo_bdd$\"), 0)) {\n        sect_header->flags |= COFF_SectionFlag_LnkInfo;\n      }\n    }\n  }\n  \n  B8 hotpatch = 0;\n  if (header.machine == COFF_MachineType_X64) {\n    hotpatch = 1;\n  }\n  //\n  // extract obj features from compile symbol in .debug$S\n  //\n  else {\n    Temp scratch = scratch_begin(&arena, 1);\n\n    CV_Symbol comp_symbol = {0};\n    for EachIndex(sect_idx, header.section_count_no_null) {\n      COFF_SectionHeader *sect_header = &coff_section_table[sect_idx];\n      if (sect_header->flags & LNK_SECTION_FLAG_DEBUG) {\n        String8 name = str8_cstring_capped(sect_header->name, sect_header->name+sizeof(sect_header->name));\n        if (str8_match(name, str8_lit(\".debug$S\"), 0)) {\n          Temp temp = temp_begin(scratch.arena);\n          String8   debug_s_data = str8_substr(input->data, rng_1u64(sect_header->foff, sect_header->foff+sect_header->fsize));\n          CV_DebugS debug_s      = cv_parse_debug_s(temp.arena, debug_s_data);\n          for EachNode(symbols_n, String8Node, debug_s.data_list[CV_C13SubSectionIdxKind_Symbols].first) {\n            CV_SymbolList symbol_list = {0};\n            cv_parse_symbol_sub_section_capped(scratch.arena, &symbol_list, 0, symbols_n->string, CV_SymbolAlign, 2);\n            if (symbol_list.first->data.kind == CV_SymKind_COMPILE3) {\n              comp_symbol = symbol_list.first->data;\n              goto found_comp_symbol;\n            } else if (symbol_list.last->data.kind == CV_SymKind_COMPILE3) {\n              comp_symbol = symbol_list.last->data;\n              goto found_comp_symbol;\n            }\n          }\n          temp_end(temp);\n        }\n      }\n    }\n    found_comp_symbol:;\n\n    if (comp_symbol.kind == CV_SymKind_COMPILE3 && comp_symbol.data.size >= sizeof(CV_SymCompile3)) {\n      CV_SymCompile3 *comp = (CV_SymCompile3 *)comp_symbol.data.str;\n      hotpatch = !!(comp->flags & CV_Compile3Flag_HotPatch);\n    }\n\n    scratch_end(scratch);\n  }\n\n  // fill out obj\n  obj->data                    = input->data;\n  obj->path                    = push_str8_copy(arena, input->path);\n  obj->header                  = header;\n  obj->comdats                 = comdats;\n  obj->exclude_from_debug_info = input->exclude_from_debug_info;\n  obj->hotpatch                = hotpatch;\n  obj->associated_sections     = associated_sections;\n  obj->node                    = &task->objs[task_id];\n  obj->link_member             = input->link_member;\n}\n\ninternal LNK_ObjNode *\nlnk_obj_from_input_many(TP_Context *tp, TP_Arena *arena, COFF_MachineType machine, U64 inputs_count, LNK_Input **inputs)\n{\n  LNK_ObjNode *objs = 0;\n  if (inputs_count) {\n    objs = push_array(arena->v[0], LNK_ObjNode, inputs_count);\n    tp_for_parallel(tp, arena, inputs_count, lnk_obj_initer, &(LNK_ObjIniter){ .inputs = inputs, .objs = objs, .machine = machine });\n  }\n  return objs;\n}\n\ninternal LNK_ObjNode *\nlnk_obj_from_input(Arena *arena, COFF_MachineType machine, LNK_Input *input)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  TP_Context  *tp       = tp_alloc(scratch.arena, 1, 1, str8_zero());\n  TP_Arena     tp_arena = { .count = 1, .v = &arena };\n  LNK_ObjNode *result   = lnk_obj_from_input_many(tp, &tp_arena, machine, 1, &input);\n  scratch_end(scratch);\n  return result;\n}\n\ninternal void\nlnk_obj_list_push_node_many(LNK_ObjList *list, U64 count, LNK_ObjNode *nodes)\n{\n  for EachIndex(i, count) {\n    DLLPushBack(list->first, list->last, &nodes[i]);\n  }\n  list->count += count;\n}\n\ninternal void\nlnk_obj_list_push_node(LNK_ObjList *list, LNK_ObjNode *node)\n{\n  lnk_obj_list_push_node_many(list, 1, node);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_input_coff_symbol_table)\n{\n  LNK_InputCoffSymbolTable *task = raw_task;\n  LNK_Obj                  *obj  = task->objs[task_id];\n  COFF_ParsedSymbol symbol = {0};\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    COFF_SymbolValueInterpType interp = coff_interp_from_parsed_symbol(symbol);\n    switch (interp) {\n    case COFF_SymbolValueInterp_Regular: {\n      if (symbol.storage_class == COFF_SymStorageClass_External) {\n        COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number);\n        if (sect_header->flags & COFF_SectionFlag_LnkRemove) {\n          break;\n        }\n        LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx);\n        lnk_symbol_table_push_(task->symtab, arena, worker_id, defn);\n      }\n    } break;\n    case COFF_SymbolValueInterp_Weak: {\n      LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx);\n      lnk_symbol_table_push_(task->symtab, arena, worker_id, defn);\n    } break;\n    case COFF_SymbolValueInterp_Undefined: {\n      if (symbol.storage_class == COFF_SymStorageClass_External) {\n        LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx);\n        lnk_symbol_table_push_(task->symtab, arena, worker_id, defn);\n      }\n    } break;\n    case COFF_SymbolValueInterp_Common: {\n      LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx);\n      lnk_symbol_table_push_(task->symtab, arena, worker_id, defn);\n    } break;\n    case COFF_SymbolValueInterp_Abs: {\n      if (symbol.storage_class == COFF_SymStorageClass_External) {\n        LNK_Symbol *defn = lnk_make_symbol(arena, symbol.name, obj, symbol_idx);\n        lnk_symbol_table_push_(task->symtab, arena, worker_id, defn);\n      }\n    } break;\n    case COFF_SymbolValueInterp_Debug: {\n      // not used\n    } break;\n    default: { InvalidPath; } break;\n    }\n  }\n}\n\ninternal LNK_SymbolHashTrie **\nlnk_symlinks_from_obj(Arena *arena, LNK_SymbolTable *symtab, LNK_Obj *obj)\n{\n  LNK_SymbolHashTrie **symlinks = push_array(arena, LNK_SymbolHashTrie *, obj->header.section_count_no_null+1);\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol.section_number, symbol.value, symbol.storage_class);\n    if (interp == COFF_SymbolValueInterp_Regular && symbol.aux_symbol_count == 0 && symbol.storage_class == COFF_SymStorageClass_External) {\n      COFF_SectionHeader *sect_header = lnk_coff_section_header_from_section_number(obj, symbol.section_number);\n      if (sect_header->flags & COFF_SectionFlag_LnkCOMDAT) {\n        if (symlinks[symbol.section_number] == 0 || symbol.value == 0) {\n          symlinks[symbol.section_number] = lnk_symbol_table_search_(symtab, symbol.name);\n        }\n      }\n    }\n  }\n  return symlinks;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_assign_comdat_symlinks_task)\n{\n  LNK_InputCoffSymbolTable *task = raw_task;\n  LNK_Obj                  *obj  = task->objs[task_id];\n  obj->symlinks = lnk_symlinks_from_obj(arena, task->symtab, obj);\n}\n\ninternal void\nlnk_push_obj_symbols(TP_Context *tp, TP_Arena *arena, LNK_SymbolTable *symtab, U64 objs_count, LNK_Obj **objs)\n{\n  ProfBeginFunction();\n  LNK_InputCoffSymbolTable task = { .symtab = symtab, .objs = objs };\n  tp_for_parallel(tp, arena, objs_count, lnk_input_coff_symbol_table, &task);\n  tp_for_parallel(tp, arena, objs_count, lnk_assign_comdat_symlinks_task, &task);\n  ProfEnd();\n}\n\ninternal COFF_ParsedSymbol\nlnk_obj_match_symbol(LNK_Obj *obj, String8 match_name)\n{\n  COFF_ParsedSymbol symbol;\n  for (U64 symbol_idx = 0; symbol_idx < obj->header.symbol_count; symbol_idx += (1 + symbol.aux_symbol_count)) {\n    symbol = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    if (str8_match(symbol.name, match_name, 0)) {\n      return symbol;\n    }\n  }\n  return (COFF_ParsedSymbol){0};\n}\n\ninternal MSCRT_FeatFlags\nlnk_obj_get_features(LNK_Obj *obj)\n{\n  return lnk_obj_match_symbol(obj, str8_lit(\"@feat.00\")).value;\n}\n\ninternal U32\nlnk_obj_get_comp_id(LNK_Obj *obj)\n{\n  return lnk_obj_match_symbol(obj, str8_lit(\"@comp.id\")).value;\n}\n\ninternal U32\nlnk_obj_get_vol_md(LNK_Obj *obj)\n{\n  return lnk_obj_match_symbol(obj, str8_lit(\"@vol.md\")).value;\n}\n\ninternal LNK_Lib *\nlnk_obj_get_lib(LNK_Obj *obj)\n{\n  return obj->link_member ? obj->link_member->lib : 0;\n}\n\ninternal String8\nlnk_obj_get_lib_path(LNK_Obj *obj)\n{\n  String8 lib_path = {0};\n  if (obj) {\n    LNK_Lib *lib = lnk_obj_get_lib(obj);\n    lib_path = lib ? lib->path : str8_zero();\n  }\n  return lib_path;\n}\n\ninternal U32\nlnk_obj_get_removed_section_number(LNK_Obj *obj)\n{\n  return obj->header.is_big_obj ? LNK_REMOVED_SECTION_NUMBER_32 : LNK_REMOVED_SECTION_NUMBER_16;\n}\n\ninternal LNK_Symbol *\nlnk_obj_get_comdat_symlink(LNK_Obj *obj, U64 section_number)\n{\n  LNK_SymbolHashTrie *symlink = obj->symlinks[section_number];\n  return symlink ? symlink->symbol : 0;\n}\n\ninternal COFF_SectionHeader *\nlnk_coff_section_header_from_section_number(LNK_Obj *obj, U64 section_number)\n{\n  COFF_SectionHeader *section_table  = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  COFF_SectionHeader *section_header = &section_table[section_number-1];\n  return section_header;\n}\n\ninternal COFF_RelocArray\nlnk_coff_relocs_from_section_header(LNK_Obj *obj, COFF_SectionHeader *section_header)\n{\n  COFF_RelocInfo   reloc_info = coff_reloc_info_from_section_header(obj->data, section_header);\n  COFF_Reloc      *relocs     = (COFF_Reloc *)(obj->data.str + reloc_info.array_off);\n  COFF_RelocArray  result     = { .count = reloc_info.count, .v = relocs };\n  return result;\n}\n\ninternal COFF_SectionHeader *\nlnk_coff_section_table_from_obj(LNK_Obj *obj)\n{\n  return (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n}\n\ninternal String8\nlnk_coff_string_table_from_obj(LNK_Obj *obj)\n{\n  return str8_substr(obj->data, obj->header.string_table_range);\n}\n\ninternal String8\nlnk_coff_symbol_table_from_obj(LNK_Obj *obj)\n{\n  return str8_substr(obj->data, obj->header.symbol_table_range);\n}\n\ninternal COFF_RelocArray\nlnk_coff_reloc_info_from_section_number(LNK_Obj *obj, U64 section_number)\n{\n  COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(obj, section_number);\n  COFF_RelocInfo      reloc_info     = coff_reloc_info_from_section_header(obj->data, section_header);\n  COFF_Reloc         *relocs         = str8_deserial_get_raw_ptr(obj->data, reloc_info.array_off, sizeof(*relocs)*reloc_info.count);\n  COFF_RelocArray     result         = { .count = reloc_info.count, .v = relocs };\n  return result;\n}\n\ninternal B32\nlnk_try_comdat_props_from_section_number(LNK_Obj *obj, U32 section_number, COFF_ComdatSelectType *select_out, U32 *section_number_out, U32 *section_length_out, U32 *check_sum_out)\n{\n  Assert(section_number > 0);\n  U32 symbol_idx = obj->comdats[section_number-1];\n  if (symbol_idx != max_U32) {\n    COFF_ParsedSymbol secdef = lnk_parsed_symbol_from_coff_symbol_idx(obj, symbol_idx);\n    coff_parse_secdef(secdef, obj->header.is_big_obj, select_out, section_number_out, section_length_out, check_sum_out);\n    return 1;\n  }\n  return 0;\n}\n\ninternal COFF_ParsedSymbol\nlnk_parsed_symbol_from_coff_symbol_idx(LNK_Obj *obj, U64 symbol_idx)\n{\n  String8 string_table = str8_substr(obj->data, obj->header.string_table_range);\n  String8 symbol_table = str8_substr(obj->data, obj->header.symbol_table_range);\n\n  COFF_ParsedSymbol result = {0};\n  if (obj->header.is_big_obj) {\n    result = coff_parse_symbol32(string_table, (COFF_Symbol32 *)symbol_table.str + symbol_idx);\n  } else {\n    result = coff_parse_symbol16(string_table, (COFF_Symbol16 *)symbol_table.str + symbol_idx);\n  }\n  \n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_collect_obj_chunks_task)\n{\n  LNK_SectionCollector *task = raw_task;\n  LNK_Obj              *obj  = task->objs[task_id];\n\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(obj->data, obj->header.section_table_range).str;\n  String8             string_table  = str8_substr(obj->data, obj->header.string_table_range);\n  for (U32 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *section_header = &section_table[sect_idx];\n\n    if (section_header->flags & COFF_SectionFlag_LnkRemove) {\n      if (!task->collect_discarded) {\n        continue;\n      }\n    }\n\n    String8 section_name = coff_name_from_section_header(string_table, section_header);\n    if (str8_match(section_name, task->name, 0)) {\n      String8 section_data = str8_substr(obj->data, rng_1u64(section_header->foff, section_header->foff + section_header->fsize));\n      str8_list_push(arena, &task->out_lists[task_id], section_data);\n    }\n  }\n}\n\ninternal String8List *\nlnk_collect_obj_sections(TP_Context *tp, TP_Arena *arena, U64 objs_count, LNK_Obj **objs, String8 name, B32 collect_discarded)\n{\n  LNK_SectionCollector task = {0};\n  task.objs              = objs;\n  task.name              = name;\n  task.collect_discarded = collect_discarded;\n  task.out_lists         = push_array(arena->v[0], String8List, objs_count);\n  tp_for_parallel(tp, arena, objs_count, lnk_collect_obj_chunks_task, &task);\n  return task.out_lists;\n}\n\ninternal B32\nlnk_obj_is_before(void *raw_a, void *raw_b)\n{\n  LNK_Obj *a = raw_a, *b = raw_b;\n  return a->input_idx < b->input_idx;\n}\n\ninternal void\nlnk_parse_msvc_linker_directive(Arena *arena, LNK_Obj *obj, LNK_DirectiveInfo *directive_info, String8 buffer)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8 to_parse;\n  {\n    local_persist const U8 bom_sig[]   = { 0xEF, 0xBB, 0xBF };\n    local_persist const U8 ascii_sig[] = { 0x20, 0x20, 0x20 };\n    if (MemoryMatch(buffer.str, &bom_sig[0], sizeof(bom_sig))) {\n      to_parse = str8_zero();\n      lnk_error_obj(LNK_Error_IllData, obj, \"TODO: support for BOM encoding\");\n    } else if (MemoryMatch(buffer.str, &ascii_sig[0], sizeof(ascii_sig))) {\n      to_parse = str8_skip(buffer, sizeof(ascii_sig));\n    } else {\n      to_parse = buffer;\n    }\n  }\n  \n  String8List arg_list = lnk_arg_list_parse_windows_rules(scratch.arena, to_parse);\n  LNK_CmdLine cmd_line = lnk_cmd_line_parse_windows_rules(scratch.arena, arg_list);\n\n  for (LNK_CmdOption *opt = cmd_line.first_option; opt != 0; opt = opt->next) {\n    LNK_CmdSwitch *cmd_switch = lnk_cmd_switch_from_string(opt->string);\n\n    if (cmd_switch == 0) {\n      lnk_error_obj(LNK_Warning_UnknownDirective, obj, \"unknown directive \\\"%S\\\"\", opt->string);\n      continue;\n    }\n    if (!cmd_switch->is_legal_directive) {\n      lnk_error_obj(LNK_Warning_IllegalDirective, obj, \"illegal directive \\\"%S\\\"\", opt->string);\n      continue;\n    }\n\n    LNK_Directive *directive = push_array_no_zero(arena, LNK_Directive, 1);\n    directive->next          = 0;\n    directive->id            = str8_cstring(cmd_switch->name);\n    directive->value_list    = str8_list_copy(arena, &opt->value_strings);\n\n    LNK_DirectiveList *directive_list = &directive_info->v[cmd_switch->type];\n    SLLQueuePush(directive_list->first, directive_list->last, directive);\n    ++directive_list->count;\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal String8List\nlnk_raw_directives_from_obj(Arena *arena, LNK_Obj *obj)\n{\n  COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);\n  String8List drectve_data = {0};\n  for (U64 sect_idx = 0; sect_idx < obj->header.section_count_no_null; sect_idx += 1) {\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n    if (sect_header->flags & COFF_SectionFlag_LnkInfo) {\n      String8 sect_name = str8_cstring_capped(sect_header->name, sect_header->name + sizeof(sect_header->name));\n      if (str8_match(sect_name, str8_lit(\".drectve\"), 0)) {\n        if (sect_header->flags & COFF_SectionFlag_CntUninitializedData) {\n          lnk_error_obj(LNK_Error_IllData, obj, \".drectve section header has flag COFF_SectionFlag_CntUninitializedData\");\n          break;\n        }\n        if (sect_header->fsize < 3) {\n          lnk_error_obj(LNK_Error_IllData, obj, \"not enough bytes to parse .drectve\");\n          break;\n        }\n        if (sect_header->reloc_count > 0) {\n          lnk_error_obj(LNK_Error_IllData, obj, \".drectve must not have relocations\");\n          break;\n        }\n        Rng1U64 sect_range = rng_1u64(sect_header->foff, sect_header->foff + sect_header->fsize);\n        str8_list_push(arena, &drectve_data, str8_substr(obj->data, sect_range));\n      }\n    }\n  }\n  return drectve_data;\n}\n\ninternal LNK_DirectiveInfo\nlnk_directive_info_from_raw_directives(Arena *arena, LNK_Obj *obj, String8List raw_directives)\n{\n  LNK_DirectiveInfo directive_info = {0};\n  for (String8Node *drectve_n = raw_directives.first; drectve_n != 0; drectve_n = drectve_n->next) {\n    lnk_parse_msvc_linker_directive(arena, obj, &directive_info, drectve_n->string);\n  }\n  return directive_info;\n}\n\ninternal CV_DebugS\nlnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8List raw_debug_s = {0};\n  {\n    COFF_SectionHeader *section_table = lnk_coff_section_table_from_obj(obj);\n    String8             string_table  = lnk_coff_string_table_from_obj(obj);\n    for EachIndex(sect_idx, obj->header.section_count_no_null) {\n      COFF_SectionHeader *section_header = &section_table[sect_idx];\n      String8             section_name   = coff_name_from_section_header(string_table, section_header);\n      if (str8_match(section_name, str8_lit(\".debug$S\"), 0)) {\n        String8 debug_s = str8_substr(obj->data, rng_1u64(section_header->foff, section_header->foff + section_header->fsize));\n        str8_list_push(scratch.arena, &raw_debug_s, debug_s);\n      }\n    }\n  }\n\n  CV_DebugS debug_s = {0};\n  {\n    for (String8Node *node = raw_debug_s.first; node != 0; node = node->next) {\n      // parse & merge sub sections\n      CV_DebugS ds = cv_parse_debug_s(scratch.arena, node->string);\n      cv_debug_s_concat_in_place(&debug_s, &ds);\n\n      // make sure there is one string table\n      String8List string_data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_StringTable);\n      if (string_data_list.node_count > 1) {\n        break;\n      }\n\n      // make sure there is one file checksum table\n      String8List checksum_data_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_FileChksms);\n      if (checksum_data_list.node_count > 1) {\n        continue;\n      }\n    }\n  }\n\n  scratch_end(scratch);\n  return debug_s;\n}\n\n"
  },
  {
    "path": "src/linker/lnk_obj.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n// --- Input -------------------------------------------------------------------\n\ntypedef struct LNK_Obj\n{\n  String8                  path;\n  String8                  data;\n  U32                      input_idx;\n  COFF_FileHeaderInfo      header;\n  U32                     *comdats;\n  B8                       hotpatch;\n  B8                       exclude_from_debug_info;\n  U32Node                **associated_sections;\n  LNK_SymbolHashTrie     **symlinks;\n\n  struct LNK_LibMemberRef *link_member;\n\n  struct LNK_ObjNode *node;\n} LNK_Obj;\n\ntypedef struct LNK_ObjNode\n{\n  struct LNK_ObjNode *next;\n  struct LNK_ObjNode *prev;\n  LNK_Obj             data;\n} LNK_ObjNode;\n\ntypedef struct LNK_ObjList\n{\n  U64          count;\n  LNK_ObjNode *first;\n  LNK_ObjNode *last;\n} LNK_ObjList;\n\ntypedef struct LNK_ObjNodeArray\n{\n  U64          count;\n  LNK_ObjNode *v;\n} LNK_ObjNodeArray;\n\n// --- Directive Parser --------------------------------------------------------\n\ntypedef struct LNK_Directive\n{\n  struct LNK_Directive *next;\n  String8               id;\n  String8List           value_list;\n} LNK_Directive;\n\ntypedef struct LNK_DirectiveList\n{\n  U64            count;\n  LNK_Directive *first;\n  LNK_Directive *last;\n} LNK_DirectiveList;\n\ntypedef struct LNK_DirectiveInfo\n{\n  LNK_DirectiveList v[LNK_CmdSwitch_Count];\n} LNK_DirectiveInfo;\n\n// --- Workers Contexts --------------------------------------------------------\n\ntypedef struct\n{\n  struct LNK_Input **inputs;\n  LNK_ObjNode       *objs;\n  U64                obj_id_base;\n  U32                machine;\n} LNK_ObjIniter;\n\ntypedef struct\n{\n  LNK_SymbolTable  *symtab;\n  LNK_Obj         **objs;\n} LNK_InputCoffSymbolTable;\n\ntypedef struct\n{\n  LNK_Obj    **objs;\n  String8      name;\n  B32          collect_discarded;\n  String8List *out_lists;\n} LNK_SectionCollector;\n\n// --- Error -------------------------------------------------------------------\n\ninternal String8 lnk_loc_from_obj(Arena *arena, LNK_Obj *obj);\ninternal void lnk_error_obj(LNK_ErrorCode code, LNK_Obj *obj, char *fmt, ...);\ninternal void lnk_error_input_obj(LNK_ErrorCode code, struct LNK_Input *input, char *fmt, ...);\n\n// --- Input -------------------------------------------------------------------\n\ninternal LNK_Obj ** lnk_array_from_obj_list(Arena *arena, LNK_ObjList list);\ninternal void       lnk_obj_list_push_node_many(LNK_ObjList *list, U64 count, LNK_ObjNode *nodes);\ninternal void       lnk_obj_list_push_node(LNK_ObjList *list, LNK_ObjNode *node);\n\ninternal void       lnk_inputer_push_obj_symbols(TP_Context *tp, TP_Arena *arena, LNK_SymbolTable *symtab, U64 objs_count, LNK_ObjNode *objs);\n\n// --- Metadata ----------------------------------------------------------------\n\ninternal U32              lnk_obj_get_features(LNK_Obj *obj);\ninternal U32              lnk_obj_get_comp_id(LNK_Obj *obj);\ninternal U32              lnk_obj_get_vol_md(LNK_Obj *obj);\ninternal struct LNK_Lib * lnk_obj_get_lib(LNK_Obj *obj);\ninternal String8          lnk_obj_get_lib_path(LNK_Obj *obj);\ninternal U32              lnk_obj_get_removed_section_number(LNK_Obj *obj);\ninternal LNK_Symbol *     lnk_obj_get_comdat_symlink(LNK_Obj *obj, U64 section_number);\n\n// --- Symbol & Section Helpers ------------------------------------------------\n\ninternal COFF_ParsedSymbol    lnk_parsed_symbol_from_coff(LNK_Obj *obj, void *coff_symbol);\ninternal COFF_ParsedSymbol    lnk_parsed_symbol_from_coff_symbol_idx(LNK_Obj *obj, U64 symbol_idx);\ninternal COFF_SectionHeader * lnk_coff_section_header_from_section_number(LNK_Obj *obj, U64 section_number);\ninternal COFF_RelocArray      lnk_coff_relocs_from_section_header(LNK_Obj *obj, COFF_SectionHeader *section_header);\ninternal COFF_SectionHeader * lnk_coff_section_table_from_obj(LNK_Obj *obj);\ninternal String8              lnk_coff_string_table_from_obj(LNK_Obj *obj);\ninternal String8              lnk_coff_symbol_table_from_obj(LNK_Obj *obj);\ninternal B32                  lnk_try_comdat_props_from_section_number(LNK_Obj *obj, U32 section_number, COFF_ComdatSelectType *select_out, U32 *section_number_out, U32 *section_length_out, U32 *check_sum_out);\n\n// --- Helpers ----------------------------------------------------------------- \n\ninternal String8List * lnk_collect_obj_sections(TP_Context *tp, TP_Arena *arena, U64 objs_count, LNK_Obj **objs, String8 name, B32 collect_discarded);\ninternal B32           lnk_obj_is_before(void *raw_a, void *raw_b);\n\n// --- Directive Parser --------------------------------------------------------\n\ninternal void              lnk_parse_msvc_linker_directive(Arena *arena, LNK_Obj *obj, LNK_DirectiveInfo *directive_info, String8 buffer);\ninternal String8List       lnk_raw_directives_from_obj(Arena *arena, LNK_Obj *obj);\ninternal LNK_DirectiveInfo lnk_directive_info_from_raw_directives(Arena *arena, LNK_Obj *obj, String8List raw_directives);\n\n// --- Debug Info --------------------------------------------------------------\n\ninternal CV_DebugS lnk_debug_s_from_obj(Arena *arena, LNK_Obj *obj);\n\n"
  },
  {
    "path": "src/linker/lnk_section_table.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal LNK_SectionContrib *\nlnk_section_contrib_chunk_push(LNK_SectionContribChunk *chunk, U64 count)\n{\n  Assert(chunk->count + count <= chunk->cap);\n  LNK_SectionContrib *result = chunk->v[chunk->count];\n  chunk->count += count;\n  return result;\n}\n\ninternal LNK_SectionContrib *\nlnk_section_contrib_chunk_push_atomic(LNK_SectionContribChunk *chunk, U64 count)\n{\n  U64 pos = ins_atomic_u64_add_eval(&chunk->count, count) - count;\n  Assert(pos + count <= chunk->cap);\n  LNK_SectionContrib *result = chunk->v[pos];\n  return result;\n}\n\ninternal LNK_SectionContribChunk *\nlnk_section_contrib_chunk_list_push_chunk(Arena *arena, LNK_SectionContribChunkList *list, U64 cap, String8 sort_idx)\n{\n  LNK_SectionContribChunk *chunk = push_array(arena, LNK_SectionContribChunk, 1);\n  chunk->count    = 0;\n  chunk->cap      = cap;\n  chunk->v        = push_array(arena, LNK_SectionContrib *, cap);\n  chunk->v2       = push_array(arena, LNK_SectionContrib, cap);\n  chunk->sort_idx = sort_idx;\n  for (U64 i = 0; i < cap; i += 1) { chunk->v[i] = &chunk->v2[i]; }\n  SLLQueuePush(list->first, list->last, chunk);\n  list->chunk_count += 1;\n  return chunk;\n}\n\ninternal void\nlnk_section_contrib_chunk_list_concat_in_place(LNK_SectionContribChunkList *list, LNK_SectionContribChunkList *to_concat)\n{\n  if (list->chunk_count == 0) {\n    *list = *to_concat;\n  } else {\n    list->last->next   = to_concat->first;\n    list->last         = to_concat->last;\n    list->chunk_count += to_concat->chunk_count;\n  }\n}\n\ninternal LNK_SectionContribChunk **\nlnk_array_from_section_contrib_chunk_list(Arena *arena, LNK_SectionContribChunkList list)\n{\n  LNK_SectionContribChunk **result = push_array(arena, LNK_SectionContribChunk *, list.chunk_count);\n  U64 i = 0;\n  for (LNK_SectionContribChunk *chunk = list.first; chunk != 0; chunk = chunk->next, i += 1) {\n    result[i] = chunk;\n  }\n  return result;\n}\n\ninternal void\nlnk_section_list_push_node(LNK_SectionList *list, LNK_SectionNode *node)\n{\n  DLLPushBack(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal void\nlnk_section_list_remove_node(LNK_SectionList *list, LNK_SectionNode *node)\n{\n  DLLRemove(list->first, list->last, node);\n  list->count -= 1;\n}\n\ninternal LNK_SectionArray\nlnk_section_array_from_list(Arena *arena, LNK_SectionList list)\n{\n  LNK_SectionArray result;\n  result.count = 0;\n  result.v = push_array_no_zero(arena, LNK_Section *, list.count);\n  for (LNK_SectionNode *node = list.first; node != 0; node = node->next) {\n    result.v[result.count] = &node->data;\n    result.count += 1;\n  }\n  return result;\n}\n\ninternal String8\nlnk_make_name_with_flags(Arena *arena, String8 name, COFF_SectionFlags flags)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List l = {0};\n  str8_list_push(scratch.arena, &l, name);\n  str8_list_push(scratch.arena, &l, str8_struct(&flags));\n  String8 name_with_flags = str8_list_join(arena, &l, 0);\n  scratch_end(scratch);\n  return name_with_flags;\n}\n\ninternal LNK_SectionTable *\nlnk_section_table_alloc(void)\n{\n  ProfBeginFunction();\n  Arena *arena = arena_alloc();\n  LNK_SectionTable *sectab = push_array(arena, LNK_SectionTable, 1);\n  sectab->arena            = arena;\n  sectab->sect_ht          = hash_table_init(arena, 256);\n  ProfEnd();\n  return sectab;\n}\n\ninternal void\nlnk_section_table_release(LNK_SectionTable **sectab_ptr)\n{\n  ProfBeginFunction();\n  LNK_SectionTable *sectab = *sectab_ptr;\n  arena_release(sectab->arena);\n  *sectab_ptr = 0;\n  ProfEnd();\n}\n\ninternal LNK_Section *\nlnk_section_table_push(LNK_SectionTable *sectab, String8 name, COFF_SectionFlags flags)\n{\n  ProfBeginFunction();\n\n  LNK_SectionNode *sect_node = push_array(sectab->arena, LNK_SectionNode, 1);\n  LNK_Section     *sect      = &sect_node->data;\n  sect->name  = push_str8_copy(sectab->arena, name);\n  sect->flags = flags;\n\n  LNK_SectionList *sect_list = &sectab->list;\n  DLLPushBack(sect_list->first, sect_list->last, sect_node);\n  sect_list->count += 1;\n\n  String8 name_with_flags = lnk_make_name_with_flags(sectab->arena, name, flags);\n  hash_table_push_string_raw(sectab->arena, sectab->sect_ht, name_with_flags, sect);\n\n  ProfEnd();\n  return sect;\n}\n\ninternal LNK_SectionNode *\nlnk_section_table_remove(LNK_SectionTable *sectab, String8 name)\n{\n  ProfBeginFunction();\n  LNK_SectionNode *node;\n  for (node = sectab->list.first; node != 0; node = node->next) {\n    if (str8_match(node->data.name, name, 0)) {\n      lnk_section_list_remove_node(&sectab->list, node);\n      break;\n    }\n  }\n  ProfEnd();\n  return node;\n}\n\ninternal void\nlnk_section_table_purge(LNK_SectionTable *sectab, String8 name)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_SectionNode *node            = lnk_section_table_remove(sectab, name);\n  String8          name_with_flags = lnk_make_name_with_flags(scratch.arena, name, node->data.flags);\n  hash_table_purge_string(sectab->sect_ht, name_with_flags);\n\n  scratch_end(scratch);\n}\n\ninternal LNK_Section *\nlnk_section_table_search(LNK_SectionTable *sectab, String8 full_or_partial_name, COFF_SectionFlags flags)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  String8 name    = {0};\n  String8 postfix = {0};\n  coff_parse_section_name(full_or_partial_name, &name, &postfix);\n\n  String8      name_with_flags = lnk_make_name_with_flags(scratch.arena, name, flags);\n  LNK_Section *section         = hash_table_search_string_raw(sectab->sect_ht, name_with_flags);\n\n  scratch_end(scratch);\n  return section;\n}\n\ninternal LNK_SectionArray\nlnk_section_table_search_many(Arena *arena, LNK_SectionTable *sectab, String8 full_or_partial_name)\n{\n  String8 name    = {0};\n  String8 postfix = {0};\n  coff_parse_section_name(full_or_partial_name, &name, &postfix);\n\n  U64 match_count = 0;\n  for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n    if (str8_match(sect_n->data.name, name, 0)) {\n      match_count += 1;\n    }\n  }\n\n  LNK_SectionArray result = {0};\n\n  if (match_count > 0) {\n    result.count = 0;\n    result.v = push_array(arena, LNK_Section *, match_count);\n\n    for (LNK_SectionNode *sect_n = sectab->list.first; sect_n != 0; sect_n = sect_n->next) {\n      if (str8_match(sect_n->data.name, name, 0)) {\n        result.v[result.count++] = &sect_n->data;\n      }\n    }\n  }\n\n  return result;\n}\n\ninternal void\nlnk_section_table_merge(LNK_SectionTable *sectab, LNK_MergeDirectiveList merge_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  for (LNK_MergeDirectiveNode *merge_node = merge_list.first; merge_node != 0; merge_node = merge_node->next) {\n    LNK_MergeDirective *merge = &merge_node->v;\n\n    // guard against illegal merges\n    {\n      local_persist String8 illegal_merge_sections[] = {\n        str8_lit_comp(\".rsrc\"),\n        str8_lit_comp(\".reloc\"),\n      };\n      for EachIndex(i, ArrayCount(illegal_merge_sections)) {\n        if (str8_match(merge->src, illegal_merge_sections[i], 0)) {\n          lnk_error(LNK_Error_IllegalSectionMerge, \"illegal to merge %S with %S\", illegal_merge_sections[i], merge->dst);\n        }\n        if (str8_match(merge->dst, illegal_merge_sections[i], 0)) {\n          lnk_error(LNK_Error_IllegalSectionMerge, \"illegal to merge %S with %S\", merge->src, illegal_merge_sections[i]);\n        }\n      }\n    }\n\n    // guard against circular merges\n    {\n      if (str8_match(merge_node->v.dst, merge_node->v.src, 0)) {\n        lnk_error(LNK_Error_CircularMerge, \"detected circular /MERGE:%S=%S\", merge_node->v.src, merge_node->v.dst);\n      }\n      for (LNK_SectionNode *sect_n = sectab->merge_list.first; sect_n != 0; sect_n = sect_n->next) {\n        if (str8_match(sect_n->data.name, merge_node->v.dst, 0)) {\n          lnk_error(LNK_Error_CircularMerge, \"detected circular /MERGE:%S=%S\", merge_node->v.src, merge_node->v.dst);\n        }\n      }\n    }\n    \n    // are we trying to merge section that was already merged?\n    LNK_Section *merge_sect = hash_table_search_string_raw(sectab->sect_ht, merge->src);\n    if (merge_sect && merge_sect->merge_dst) {\n      LNK_Section *dst = merge_sect->merge_dst;\n      B32 is_ambiguous_merge = !str8_match(dst->name, merge->dst, 0);\n      if (is_ambiguous_merge) {\n        lnk_error(LNK_Warning_AmbiguousMerge, \"Detected ambiguous section merge:\");\n        lnk_supplement_error(\"%S => %S (Merged)\", merge_sect->name, dst->name);\n        lnk_supplement_error(\"%S => %S\", merge_sect->name, merge->dst);\n      }\n      continue;\n    }\n    \n    // find source seciton\n    LNK_SectionArray src_matches = lnk_section_table_search_many(scratch.arena, sectab, merge->src);\n    if (src_matches.count == 0) {\n      continue;\n    }\n\n    LNK_Section *dst;\n    {\n      LNK_SectionArray dst_matches = lnk_section_table_search_many(scratch.arena, sectab, merge->dst);\n\n      if (dst_matches.count > 1) {\n        lnk_error(LNK_Warning_AmbiguousMerge, \"unable to merge %S=%S, too many dest sections (%llu)\", merge->src, merge->dst, dst_matches.count);\n        continue;\n      }\n\n      // push a new section if the destination section does not exist\n      if (dst_matches.count == 0) {\n        dst = lnk_section_table_push(sectab, merge->dst, src_matches.v[0]->flags);\n      } else {\n        dst = dst_matches.v[0];\n      }\n    }\n\n    for EachIndex(src_idx, src_matches.count) {\n      LNK_Section *src = src_matches.v[src_idx];\n\n      if (src->flags != dst->flags) {\n        lnk_error(LNK_Warning_AmbiguousMerge, \"unable to merge %S=%S because of conflicting section flags\", merge->src, merge->dst);\n        continue;\n      }\n\n      // merge section with destination\n      lnk_section_contrib_chunk_list_concat_in_place(&dst->contribs, &src->contribs);\n      src->merge_dst = dst;\n\n      // remove node from output section list\n      LNK_SectionNode *merge_node = lnk_section_table_remove(sectab, src->name);\n\n      // move node to the merge list\n      lnk_section_list_push_node(&sectab->merge_list, merge_node);\n    }\n  }\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal U64\nlnk_section_table_total_fsize(LNK_SectionTable *sectab)\n{\n  U64 total_fsize = 0;\n  for EachNode(n, LNK_SectionNode, sectab->list.first) { total_fsize += n->data.fsize; }\n  return total_fsize;\n}\n\ninternal U64\nlnk_section_table_total_vsize(LNK_SectionTable *sectab)\n{\n  U64 total_vsize = 0;\n  for EachNode(n, LNK_SectionNode, sectab->list.first) { total_vsize += n->data.vsize; }\n  return total_vsize;\n}\n\ninternal int\nlnk_section_contrib_chunk_is_before(void *raw_a, void *raw_b)\n{\n  LNK_SectionContribChunk **a = raw_a, **b = raw_b;\n  return str8_is_before_case_sensitive(&(*a)->sort_idx, &(*b)->sort_idx);\n}\n\ninternal void\nlnk_sort_section_contribs(LNK_Section *sect)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  LNK_SectionContribChunk **chunks = lnk_array_from_section_contrib_chunk_list(scratch.arena, sect->contribs);\n  radsort(chunks, sect->contribs.chunk_count, lnk_section_contrib_chunk_is_before);\n\n  // repopulate chunk list in sorted order\n  sect->contribs.first = 0;\n  sect->contribs.last  = 0;\n  for (U64 chunk_idx = 0; chunk_idx < sect->contribs.chunk_count; chunk_idx += 1) {\n    SLLQueuePush(sect->contribs.first, sect->contribs.last, chunks[chunk_idx]);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nlnk_finalize_section_layout(LNK_Section *sect, U64 file_align, U64 pad_size)\n{\n  ProfBegin(\"Layout Contribs\");\n  U64 cursor = 0;\n  for (LNK_SectionContribChunk *sc_chunk = sect->contribs.first; sc_chunk != 0; sc_chunk = sc_chunk->next) {\n    for (U64 sc_idx = 0; sc_idx < sc_chunk->count; sc_idx += 1) {\n      LNK_SectionContrib *sc = sc_chunk->v[sc_idx];\n\n      // add section pad bytes\n      if (sc->hotpatch) {\n        cursor += pad_size;\n      }\n\n      // assign offset\n      cursor = AlignPow2(cursor, sc->align);\n      sc->u.off = cursor;\n\n      // advance cursor\n      U64 sc_size = lnk_size_from_section_contrib(sc);\n      cursor += sc_size;\n    }\n  }\n  ProfEnd();\n\n  if (~sect->flags & COFF_SectionFlag_CntUninitializedData) {\n    sect->fsize = AlignPow2(cursor, file_align);\n  }\n  sect->vsize = cursor;\n}\n\ninternal void\nlnk_assign_section_index(LNK_Section *sect, U64 sect_idx)\n{\n  sect->sect_idx = sect_idx;\n\n  // assign section indices to contribs\n  for (LNK_SectionContribChunk *sc_chunk = sect->contribs.first; sc_chunk != 0; sc_chunk = sc_chunk->next) {\n    for (U64 sc_idx = 0; sc_idx < sc_chunk->count; sc_idx += 1) {\n      sc_chunk->v[sc_idx]->u.sect_idx = sect_idx;\n    }\n  }\n}\n\ninternal void\nlnk_assign_section_virtual_space(LNK_Section *sect, U64 sect_align, U64 *voff_cursor)\n{\n  sect->voff    = *voff_cursor;\n  *voff_cursor += sect->vsize;\n  *voff_cursor  = AlignPow2(*voff_cursor, sect_align);\n}\n\ninternal void\nlnk_assign_section_file_space(LNK_Section *sect, U64 *foff_cursor)\n{\n  if (~sect->flags & COFF_SectionFlag_CntUninitializedData) {\n    sect->foff    = *foff_cursor;\n    *foff_cursor += sect->fsize;\n  }\n}\n\ninternal U64\nlnk_size_from_section_contrib(LNK_SectionContrib *sc)\n{\n  U64 size = 0;\n  for (String8Node *n = &sc->first_data_node; n != 0; n = n->next) {\n    size += n->string.size;\n  }\n  return size;\n}\n\ninternal U64\nlnk_voff_from_section_contrib(COFF_SectionHeader **image_section_table, LNK_SectionContrib *sc)\n{\n  COFF_SectionHeader *sect_header = image_section_table[sc->u.sect_idx+1];\n  U64 voff = sect_header->voff + sc->u.off;\n  return voff;\n}\n\ninternal U64\nlnk_foff_from_section_contrib(COFF_SectionHeader **image_section_table, LNK_SectionContrib *sc)\n{\n  COFF_SectionHeader *sect_header = image_section_table[sc->u.sect_idx+1];\n  U64 foff = sect_header->foff + sc->u.off;\n  return foff;\n}\n\ninternal U64\nlnk_fopl_from_section_contrib(COFF_SectionHeader **image_section_table, LNK_SectionContrib *sc)\n{\n  U64 foff = lnk_foff_from_section_contrib(image_section_table, sc);\n  return foff + lnk_size_from_section_contrib(sc);\n}\n\ninternal LNK_SectionContrib *\nlnk_get_first_section_contrib(LNK_Section *sect)\n{\n  if (sect->contribs.chunk_count > 0) {\n    if (sect->contribs.first->count > 0) {\n      return sect->contribs.first->v[0];\n    }\n  }\n  return 0;\n}\n\ninternal LNK_SectionContrib *\nlnk_get_last_section_contrib(LNK_Section *sect)\n{\n  if (sect->contribs.chunk_count > 0) {\n    if (sect->contribs.last->count > 0) {\n      return sect->contribs.last->v[sect->contribs.last->count-1];\n    }\n  }\n  return 0;\n}\n\ninternal U64\nlnk_get_section_contrib_size(LNK_Section *sect)\n{\n  LNK_SectionContrib *first_sc = lnk_get_first_section_contrib(sect);\n  LNK_SectionContrib *last_sc = lnk_get_last_section_contrib(sect);\n  U64 size = (last_sc->u.off - first_sc->u.off) + lnk_size_from_section_contrib(last_sc);\n  return size;\n}\n\ninternal U64\nlnk_get_first_section_contrib_voff(COFF_SectionHeader **image_section_table, LNK_Section *sect)\n{\n  LNK_SectionContrib *sc = lnk_get_first_section_contrib(sect);\n  return lnk_voff_from_section_contrib(image_section_table, sc);\n}\n\n"
  },
  {
    "path": "src/linker/lnk_section_table.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef struct LNK_SectionContrib\n{\n  String8Node  first_data_node; // most contributions require at least one data node, so preallocate it here\n  String8Node *last_data_node;  // list of data nodes that contribute to final section\n  union {\n    // used to sort sections to get deterministic output\n    struct {\n      U32 obj_idx;      // index of the input obj that contributes to the image section\n      U32 obj_sect_idx; // index into contributing obj's section table\n    };\n\n    // used after section layout is finalized\n    struct {\n      U32 off;      // contribution offset within the image section\n      U16 sect_idx; // section index in the image\n      U8  unused[2];\n    };\n  } u;\n  U16 align; // contribution alignment in the image\n  B8 hotpatch;\n} LNK_SectionContrib;\n\ntypedef struct LNK_SectionContribChunk\n{\n  struct LNK_SectionContribChunk *next;\n  U64                             count;\n  U64                             cap;\n  String8                         sort_idx;\n  LNK_SectionContrib            **v;\n  LNK_SectionContrib             *v2;\n} LNK_SectionContribChunk;\n\ntypedef struct LNK_SectionContribChunkList\n{\n  U64                      chunk_count;\n  LNK_SectionContribChunk *first;\n  LNK_SectionContribChunk *last;\n} LNK_SectionContribChunkList;\n\ntypedef struct LNK_Section\n{\n  String8                     name;\n  COFF_SectionFlags           flags;\n  LNK_SectionContribChunkList contribs;\n\n  struct LNK_Section *merge_dst;\n\n  U64 voff;\n  U64 vsize;\n  U64 fsize;\n  U64 foff;\n  U64 sect_idx;\n} LNK_Section;\n\ntypedef struct LNK_SectionNode\n{\n  struct LNK_SectionNode *next;\n  struct LNK_SectionNode *prev;\n  LNK_Section             data;\n} LNK_SectionNode;\n\ntypedef struct LNK_SectionList\n{\n  U64              count;\n  LNK_SectionNode *first;\n  LNK_SectionNode *last;\n} LNK_SectionList;\n\ntypedef struct LNK_SectionArray\n{\n  U64           count;\n  LNK_Section **v;\n} LNK_SectionArray;\n\ntypedef struct LNK_SectionTable\n{\n  Arena           *arena;\n  LNK_SectionList  list;\n  LNK_SectionList  merge_list;\n  HashTable       *sect_ht;        // (name * COFF_SectionFlags) -> LNK_Section *\n  U64              next_sect_idx;\n} LNK_SectionTable;\n\n// --- Section Contrib Chunk List ----------------------------------------------\n\ninternal LNK_SectionContrib *       lnk_section_contrib_chunk_push(LNK_SectionContribChunk *chunk, U64 count);\ninternal LNK_SectionContrib *       lnk_section_contrib_chunk_push_atomic(LNK_SectionContribChunk *chunk, U64 count);\ninternal LNK_SectionContribChunk *  lnk_section_contrib_chunk_list_push_chunk(Arena *arena, LNK_SectionContribChunkList *list, U64 cap, String8 sort_idx);\ninternal void                       lnk_section_contrib_chunk_list_concat_in_place(LNK_SectionContribChunkList *list, LNK_SectionContribChunkList *to_concat);\ninternal LNK_SectionContribChunk ** lnk_array_from_section_contrib_chunk_list(Arena *arena, LNK_SectionContribChunkList list);\n\n// --- Section List ------------------------------------------------------------\n\ninternal LNK_SectionArray lnk_section_array_from_list(Arena *arena, LNK_SectionList list);\n\n// --- Section Table -----------------------------------------------------------\n\ninternal String8 lnk_make_name_with_flags(Arena *arena, String8 name, COFF_SectionFlags flags);\n\ninternal LNK_SectionTable *  lnk_section_table_alloc(void);\ninternal void                lnk_section_table_release(LNK_SectionTable **sectab_ptr);\ninternal LNK_Section *       lnk_section_table_push(LNK_SectionTable *sectab, String8 name, COFF_SectionFlags flags);\ninternal LNK_SectionNode *   lnk_section_table_remove(LNK_SectionTable *sectab, String8 name);\ninternal void                lnk_section_table_purge(LNK_SectionTable *sectab, String8 name);\ninternal LNK_Section *       lnk_section_table_search(LNK_SectionTable *sectab, String8 name, COFF_SectionFlags flags);\ninternal LNK_SectionArray    lnk_section_table_search_many(Arena *arena, LNK_SectionTable *sectab, String8 full_or_partial_name);\ninternal void                lnk_section_table_merge(LNK_SectionTable *sectab, LNK_MergeDirectiveList merge_list);\ninternal U64                 lnk_section_table_total_fsize(LNK_SectionTable *sectab);\ninternal U64                 lnk_section_table_total_vsize(LNK_SectionTable *sectab);\n\n// --- Section Finalization ----------------------------------------------------\n\ninternal void lnk_finalize_section_layout     (LNK_Section *sect, U64 file_align, U64 pad_size);\ninternal void lnk_assign_section_index        (LNK_Section *sect, U64 sect_idx);\ninternal void lnk_assign_section_virtual_space(LNK_Section *sect, U64 sect_align, U64 *voff_cursor);\ninternal void lnk_assign_section_file_space   (LNK_Section *sect, U64 *foff_cursor);\n\n// --- Section Contribution ----------------------------------------------------\n\ninternal U64 lnk_size_from_section_contrib(LNK_SectionContrib *sc);\ninternal U64 lnk_voff_from_section_contrib(COFF_SectionHeader **image_section_table, LNK_SectionContrib *sc);\ninternal U64 lnk_foff_from_section_contrib(COFF_SectionHeader **image_section_table, LNK_SectionContrib *sc);\ninternal U64 lnk_fopl_from_section_contrib(COFF_SectionHeader **image_section_table, LNK_SectionContrib *sc);\n\ninternal LNK_SectionContrib * lnk_get_first_section_contrib(LNK_Section *sect);\ninternal LNK_SectionContrib * lnk_get_last_section_contrib(LNK_Section *sect);\ninternal U64                  lnk_get_section_contrib_size(LNK_Section *sect);\ninternal U64                  lnk_get_first_section_contrib_voff(COFF_SectionHeader **image_section_table, LNK_Section *sect);\n"
  },
  {
    "path": "src/linker/lnk_symbol_table.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal LNK_Symbol *\nlnk_make_symbol(Arena *arena, String8 name, LNK_Obj *obj, U32 symbol_idx)\n{\n  LNK_ObjSymbolRefNode *ref = push_array(arena, LNK_ObjSymbolRefNode, 1);\n  ref->v.obj                = obj;\n  ref->v.symbol_idx         = symbol_idx;\n\n  LNK_Symbol *symbol     = push_array(arena, LNK_Symbol, 1);\n  symbol->name           = name;\n  symbol->refs           = ref;\n\n  return symbol;\n}\n\ninternal int\nlnk_obj_symbol_ref_is_before(void *raw_a, void *raw_b)\n{\n  LNK_ObjSymbolRef *a_ref           = raw_a;\n  LNK_ObjSymbolRef *b_ref           = raw_b;\n  LNK_Lib          *a_lib           = lnk_obj_get_lib(a_ref->obj);\n  LNK_Lib          *b_lib           = lnk_obj_get_lib(b_ref->obj);\n  U32               a_lib_input_idx = a_lib ? a_lib->input_idx : 0;\n  U32               b_lib_input_idx = b_lib ? b_lib->input_idx : 0;\n  if (a_lib_input_idx == b_lib_input_idx) {\n    if (a_ref->obj->input_idx == b_ref->obj->input_idx) {\n      return a_ref->symbol_idx < b_ref->symbol_idx;\n    }\n    return a_ref->obj->input_idx < b_ref->obj->input_idx;\n  }\n  return a_lib_input_idx < b_lib_input_idx;\n}\n\ninternal int\nlnk_obj_symbol_ref_ptr_is_before(void *raw_a, void *raw_b)\n{\n  LNK_ObjSymbolRef **a = raw_a, **b = raw_b;\n  return lnk_obj_symbol_ref_is_before(*a, *b);\n}\n\ninternal int\nlnk_symbol_is_before(void *raw_a, void *raw_b)\n{\n  LNK_Symbol *a = raw_a, *b = raw_b;\n  LNK_ObjSymbolRef a_ref = lnk_ref_from_symbol(a);\n  LNK_ObjSymbolRef b_ref = lnk_ref_from_symbol(b);\n  return lnk_obj_symbol_ref_is_before(&a_ref, &b_ref);\n}\n\ninternal int\nlnk_symbol_ptr_is_before(void *raw_a, void *raw_b)\n{\n  return lnk_symbol_is_before(*(LNK_Symbol **)raw_a, *(LNK_Symbol **)raw_b);\n}\n\ninternal void\nlnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal LNK_SymbolNode *\nlnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol)\n{\n  LNK_SymbolNode *node = push_array(arena, LNK_SymbolNode, 1);\n  node->data           = symbol;\n  lnk_symbol_list_push_node(list, node);\n  return node;\n}\n\ninternal LNK_SymbolHashTrie *\nlnk_symbol_hash_trie_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList *list, U64 cap)\n{\n  if (list->last == 0 || list->last->count >= list->last->cap) {\n    LNK_SymbolHashTrieChunk *chunk = push_array(arena, LNK_SymbolHashTrieChunk, 1);\n    chunk->cap                     = cap;\n    chunk->v                       = push_array_no_zero(arena, LNK_SymbolHashTrie, cap);\n    SLLQueuePush(list->first, list->last, chunk);\n    ++list->count;\n  }\n\n  LNK_SymbolHashTrie *result = &list->last->v[list->last->count++];\n  return result;\n}\n\ninternal void\nlnk_symbol_hash_trie_chunk_list_concat_in_place(LNK_SymbolHashTrieChunkList *list, LNK_SymbolHashTrieChunkList *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal void\nlnk_error_multiply_defined_symbol(LNK_Symbol *dst, LNK_Symbol *src)\n{\n  LNK_ObjSymbolRef dst_ref = lnk_ref_from_symbol(dst);\n  LNK_ObjSymbolRef src_ref = lnk_ref_from_symbol(src);\n  lnk_error_obj(LNK_Error_MultiplyDefinedSymbol, dst_ref.obj, \"symbol \\\"%S\\\" (No. %#x) is multiply defined in %S (No. %#x)\", dst->name, dst_ref.symbol_idx, src_ref.obj->path, src_ref.symbol_idx);\n}\n\ninternal B32\nlnk_can_replace_symbol(LNK_Symbol *dst, LNK_Symbol *src)\n{\n  B32 can_replace = 0;\n\n  COFF_ParsedSymbol           dst_parsed = lnk_parsed_from_symbol(dst);\n  COFF_ParsedSymbol           src_parsed = lnk_parsed_from_symbol(src);\n  COFF_SymbolValueInterpType  dst_interp = lnk_interp_from_symbol(dst);\n  COFF_SymbolValueInterpType  src_interp = lnk_interp_from_symbol(src);\n  LNK_ObjSymbolRef            dst_ref    = lnk_ref_from_symbol(dst);\n  LNK_ObjSymbolRef            src_ref    = lnk_ref_from_symbol(src);\n  LNK_Obj                    *dst_obj    = dst_ref.obj;\n  LNK_Obj                    *src_obj    = src_ref.obj;\n\n  // undefined vs regular\n  if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Regular) {\n    can_replace = 1;\n  }\n  // (weak vs undefined) or (undefined vs weak)\n  else if ((dst_interp == COFF_SymbolValueInterp_Weak && src_interp == COFF_SymbolValueInterp_Undefined) || (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Weak)) {\n    LNK_Symbol *weak, *undef;\n    COFF_ParsedSymbol weak_parsed;\n    if (dst_interp == COFF_SymbolValueInterp_Weak) {\n      weak = dst, undef = src;\n      weak_parsed = dst_parsed;\n    } else {\n      weak = src, undef = dst;\n      weak_parsed = src_parsed;\n    }\n\n    LNK_ObjSymbolRef    weak_symbol_ref = lnk_ref_from_symbol(weak);\n    COFF_SymbolWeakExt *weak_ext        = coff_parse_weak_tag(weak_parsed, weak_symbol_ref.obj->header.is_big_obj);\n    if (weak_ext->characteristics == COFF_WeakExt_SearchLibrary) {\n      // NOTE: MSVC does not let a weak symbol to replace an undefined one,\n      // but LLD links without errors or warnings, meaning undefined symbols\n      // are resolved to the weak, which can potentially change behaviour of\n      // the linked image\n      can_replace = dst_interp == COFF_SymbolValueInterp_Weak;\n    } else if (weak_ext->characteristics == COFF_WeakExt_NoLibrary) {\n      can_replace = dst_interp == COFF_SymbolValueInterp_Weak;\n    } else if (weak_ext->characteristics == COFF_WeakExt_SearchAlias) {\n      can_replace = dst_interp == COFF_SymbolValueInterp_Undefined;\n    } else {\n      can_replace = lnk_symbol_is_before(src, dst);\n    }\n  }\n  // undefined vs undefined\n  else if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Undefined) {\n    can_replace = lnk_symbol_is_before(src, dst);\n  }\n  // undefined vs common\n  else if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Common) {\n    can_replace = 1;\n  }\n  // undefined vs abs\n  else if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Abs) {\n    can_replace = 1;\n  }\n  // undefined vs debug\n  else if (dst_interp == COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Debug) {\n    can_replace = 1;\n  }\n  // regular/common/abs/debug vs undefined\n  else if (dst_interp != COFF_SymbolValueInterp_Undefined && src_interp == COFF_SymbolValueInterp_Undefined) {\n    can_replace = 0;\n  }\n  // regular vs abs\n  else if (dst_interp == COFF_SymbolValueInterp_Regular && src_interp == COFF_SymbolValueInterp_Abs) {\n    lnk_error_multiply_defined_symbol(dst, src);\n  }\n  // abs vs regular\n  else if (dst_interp == COFF_SymbolValueInterp_Abs && src_interp == COFF_SymbolValueInterp_Regular) {\n    lnk_error_multiply_defined_symbol(dst, src);\n  }\n  // abs vs common\n  else if (dst_interp == COFF_SymbolValueInterp_Abs && src_interp == COFF_SymbolValueInterp_Common) {\n    if (lnk_symbol_is_before(dst, src)) {\n      can_replace = 1;\n    } else {\n      lnk_error_multiply_defined_symbol(dst, src);\n    }\n  }\n  // common vs abs\n  else if (dst_interp == COFF_SymbolValueInterp_Common && src_interp == COFF_SymbolValueInterp_Abs) {\n    if (lnk_symbol_is_before(dst, src)) {\n      lnk_error_multiply_defined_symbol(dst, src);\n    }\n  }\n  // abs vs abs\n  else if (dst_interp == COFF_SymbolValueInterp_Abs && src_interp == COFF_SymbolValueInterp_Abs) {\n    lnk_error_multiply_defined_symbol(dst, src);\n  }\n  // weak vs weak\n  else if (dst_interp == COFF_SymbolValueInterp_Weak && src_interp == COFF_SymbolValueInterp_Weak) {\n    COFF_SymbolWeakExt *dst_ext = coff_parse_weak_tag(dst_parsed, dst_ref.obj->header.is_big_obj);\n    COFF_SymbolWeakExt *src_ext = coff_parse_weak_tag(src_parsed, src_ref.obj->header.is_big_obj);\n    if ((dst_ext->characteristics == COFF_WeakExt_SearchAlias && src_ext->characteristics != COFF_WeakExt_SearchAlias)) {\n      if (lnk_symbol_is_before(dst, src) || src_ext->characteristics == COFF_WeakExt_AntiDependency) {\n        can_replace = 0;\n      } else {\n        lnk_error_multiply_defined_symbol(dst, src);\n      }\n    } else if (dst_ext->characteristics != COFF_WeakExt_SearchAlias && src_ext->characteristics == COFF_WeakExt_SearchAlias) {\n      if (lnk_symbol_is_before(src, dst) || dst_ext->characteristics == COFF_WeakExt_AntiDependency) {\n        can_replace = 1;\n      } else {\n        lnk_error_multiply_defined_symbol(dst, src);\n      }\n    } else if (dst_ext->characteristics == COFF_WeakExt_SearchAlias && src_ext->characteristics == COFF_WeakExt_SearchAlias) {\n      lnk_error_multiply_defined_symbol(dst, src);\n    } else {\n      can_replace = lnk_symbol_is_before(src, dst);\n    }\n  }\n  // weak vs regular/abs/common\n  else if (dst_interp == COFF_SymbolValueInterp_Weak && (src_interp == COFF_SymbolValueInterp_Regular || src_interp == COFF_SymbolValueInterp_Abs || src_interp == COFF_SymbolValueInterp_Common)) {\n    can_replace = 1;\n  }\n  // regular/abs/common vs weak\n  else if ((dst_interp == COFF_SymbolValueInterp_Regular || dst_interp == COFF_SymbolValueInterp_Abs || dst_interp == COFF_SymbolValueInterp_Common) && src_interp == COFF_SymbolValueInterp_Weak) {\n    can_replace = 0;\n  }\n  // regular/common vs regular/common\n  else if ((dst_interp == COFF_SymbolValueInterp_Regular || dst_interp == COFF_SymbolValueInterp_Common) && (src_interp == COFF_SymbolValueInterp_Regular || src_interp == COFF_SymbolValueInterp_Common)) {\n    // parse dst symbol properties\n    B32                   dst_is_comdat = 0;\n    COFF_ComdatSelectType dst_select;\n    U32                   dst_section_length;\n    U32                   dst_check_sum;\n    if (dst_interp == COFF_SymbolValueInterp_Regular) {\n      dst_is_comdat = lnk_try_comdat_props_from_section_number(dst_ref.obj, dst_parsed.section_number, &dst_select, 0, &dst_section_length, &dst_check_sum);\n    } else if (dst_interp == COFF_SymbolValueInterp_Common) {\n      dst_select         = COFF_ComdatSelect_Largest;\n      dst_section_length = dst_parsed.value;\n      dst_check_sum      = 0;\n      dst_is_comdat      = 1;\n    }\n\n    // parse src symbol properties\n    B32                   src_is_comdat = 0;\n    COFF_ComdatSelectType src_select;\n    U32                   src_section_length, src_checks;\n    U32                   src_check_sum;\n    if (src_interp == COFF_SymbolValueInterp_Regular) {\n      src_is_comdat = lnk_try_comdat_props_from_section_number(src_ref.obj, src_parsed.section_number, &src_select, 0, &src_section_length, &src_check_sum);\n    } else if (src_interp == COFF_SymbolValueInterp_Common) {\n      src_select         = COFF_ComdatSelect_Largest;\n      src_section_length = src_parsed.value;\n      src_check_sum      = 0;\n      src_is_comdat      = 1;\n    }\n\n    // regular non-comdat vs communal\n    if (dst_interp == COFF_SymbolValueInterp_Regular && !dst_is_comdat && src_interp == COFF_SymbolValueInterp_Common) {\n      can_replace = 0;\n    }\n    // communal vs regular non-comdat\n    else if (dst_interp == COFF_SymbolValueInterp_Common && src_interp == COFF_SymbolValueInterp_Regular && !src_is_comdat) {\n      can_replace = 1;\n    }\n    // handle COMDATs\n    else if (dst_is_comdat && src_is_comdat) {\n      if ((src_select == COFF_ComdatSelect_Any && dst_select == COFF_ComdatSelect_Largest)) {\n        src_select = COFF_ComdatSelect_Largest;\n      }\n      if (src_select == COFF_ComdatSelect_Largest && dst_select == COFF_ComdatSelect_Any) {\n        dst_select = COFF_ComdatSelect_Largest;\n      }\n\n      if (src_select == dst_select) {\n        switch (src_select) {\n        case COFF_ComdatSelect_Null:\n        case COFF_ComdatSelect_Any: {\n          can_replace = lnk_obj_is_before(src_obj, dst_obj);\n        } break;\n        case COFF_ComdatSelect_NoDuplicates: {\n          lnk_error_multiply_defined_symbol(dst, src);\n        } break;\n        case COFF_ComdatSelect_SameSize: {\n          if (dst_section_length == src_section_length) {\n            can_replace = lnk_obj_is_before(src_obj, dst_obj);\n          } else {\n            lnk_error_multiply_defined_symbol(dst, src);\n          }\n        } break;\n        case COFF_ComdatSelect_ExactMatch: {\n          COFF_SectionHeader *dst_sect_header = lnk_coff_section_header_from_section_number(dst_obj, dst_parsed.section_number);\n          COFF_SectionHeader *src_sect_header = lnk_coff_section_header_from_section_number(src_obj, src_parsed.section_number);\n          String8             dst_data        = str8_substr(dst_obj->data, rng_1u64(dst_sect_header->foff, dst_sect_header->foff + dst_sect_header->fsize));\n          String8             src_data        = str8_substr(src_obj->data, rng_1u64(src_sect_header->foff, src_sect_header->foff + src_sect_header->fsize));\n          B32                 is_exact_match  = 0;\n          if (dst_check_sum != 0 && src_check_sum != 0) {\n            is_exact_match = dst_check_sum == src_check_sum && str8_match(dst_data, src_data, 0);\n          } else {\n            is_exact_match = str8_match(dst_data, src_data, 0);\n          }\n\n          if (is_exact_match) {\n            can_replace = lnk_obj_is_before(src_obj, dst_obj);\n          } else {\n            lnk_error_multiply_defined_symbol(dst, src);\n          }\n        } break;\n        case COFF_ComdatSelect_Largest: {\n          if (dst_section_length == src_section_length) {\n            can_replace = lnk_obj_is_before(src_obj, dst_obj);\n          } else {\n            can_replace = dst_section_length < src_section_length;\n          }\n        } break;\n        case COFF_ComdatSelect_Associative: { /* ignore */ } break;\n        default: { InvalidPath; } break;\n        }\n      } else {\n        lnk_error_obj(LNK_Warning_UnresolvedComdat, src_obj,\n            \"%S: COMDAT selection conflict detected, current selection %S, leader selection %S from %S\", \n            src->name, coff_string_from_comdat_select_type(src_select), coff_string_from_comdat_select_type(dst_select), dst_obj);\n      }\n    } else {\n      lnk_error_multiply_defined_symbol(dst, src);\n    }\n  } else {\n    lnk_error(LNK_Error_InvalidPath, \"unable to find a suitable replacement logic for symbol combination\");\n  }\n\n  return can_replace;\n}\n\ninternal void\nlnk_on_symbol_replace(LNK_Symbol *dst, LNK_Symbol *src)\n{\n  COFF_ParsedSymbol          dst_parsed = lnk_parsed_from_symbol(dst);\n  COFF_SymbolValueInterpType dst_interp = lnk_interp_from_symbol(dst);\n  LNK_ObjSymbolRef           dst_ref    = lnk_ref_from_symbol(dst);\n\n  if (dst_interp == COFF_SymbolValueInterp_Regular) {\n    // remove replaced section from the output\n    COFF_SectionHeader *dst_sect = lnk_coff_section_header_from_section_number(dst_ref.obj, dst_parsed.section_number);\n    dst_sect->flags |= COFF_SectionFlag_LnkRemove;\n\n    // remove associated sections from the output\n    for (U32Node *associated_section = dst_ref.obj->associated_sections[dst_parsed.section_number];\n        associated_section != 0;\n        associated_section = associated_section->next) {\n      COFF_SectionHeader *section_header = lnk_coff_section_header_from_section_number(dst_ref.obj, associated_section->data);\n      section_header->flags |= COFF_SectionFlag_LnkRemove;\n    }\n  }\n\n  // merge symbol refs\n  LNK_ObjSymbolRefNode *src_last_ref;\n  for (src_last_ref = src->refs; src_last_ref->next != 0; src_last_ref = src_last_ref->next);\n  src_last_ref->next = dst->refs;\n\n  // assert leader section is live\n#if BUILD_DEBUG\n  {\n    COFF_ParsedSymbol          src_parsed = lnk_parsed_from_symbol(src);\n    COFF_SymbolValueInterpType src_interp = lnk_interp_from_symbol(src);\n    LNK_ObjSymbolRef           src_ref    = lnk_ref_from_symbol(src);\n\n    if (src_interp == COFF_SymbolValueInterp_Regular) {\n      COFF_SectionHeader *src_sect = lnk_coff_section_header_from_section_number(src_ref.obj, src_parsed.section_number);\n      AssertAlways(~src_sect->flags & COFF_SectionFlag_LnkRemove);\n    }\n  }\n#endif\n}\n\ninternal void\nlnk_symbol_hash_trie_insert_or_replace(Arena                        *arena,\n                                       LNK_SymbolHashTrieChunkList  *chunks,\n                                       LNK_SymbolHashTrie          **trie,\n                                       U64                           hash,\n                                       LNK_Symbol                   *symbol)\n{\n  LNK_SymbolHashTrie **curr_trie_ptr = trie;\n  for (U64 h = hash; ; h <<= 2) {\n    // load current pointer\n    LNK_SymbolHashTrie *curr_trie = ins_atomic_ptr_eval(curr_trie_ptr);\n\n    if (curr_trie == 0) {\n      // init node\n      LNK_SymbolHashTrie *new_trie = lnk_symbol_hash_trie_chunk_list_push(arena, chunks, 0x1000);\n      new_trie->name               = &symbol->name;\n      new_trie->symbol             = symbol;\n      MemoryZeroArray(new_trie->child);\n\n      // try to insert new node\n      LNK_SymbolHashTrie *cmp = ins_atomic_ptr_eval_cond_assign(curr_trie_ptr, new_trie, curr_trie);\n\n      // was symbol inserted?\n      if (cmp == curr_trie) {\n        break;\n      }\n\n      // rollback chunk list push\n      --chunks->last->count;\n\n      // retry insert with trie node from another thread\n      curr_trie = cmp;\n    }\n\n    // load current symbol\n    String8 *curr_name = ins_atomic_ptr_eval(&curr_trie->name);\n\n    if (curr_name && str8_match(*curr_name, symbol->name, 0)) {\n      for (LNK_Symbol *src = symbol;;) {\n        // try replacing current symbol with zero, otherwise loop back and retry\n        LNK_Symbol *leader = ins_atomic_ptr_eval_assign(&curr_trie->symbol, 0);\n\n        // apply replacement\n        if (leader) {\n          if (lnk_can_replace_symbol(leader, src)) {\n            // discard leader\n            lnk_on_symbol_replace(leader, src);\n            leader = src;\n          } else {\n            // discard source\n            lnk_on_symbol_replace(src, leader);\n            src = leader;\n          }\n        } else {\n          leader = src;\n        }\n\n        // try replacing symbol, if another thread has already taken the slot, rerun replacement loop again\n        LNK_Symbol *was_replaced = ins_atomic_ptr_eval_cond_assign(&curr_trie->symbol, leader, 0);\n\n        // symbol replaced, exit\n        if (was_replaced == 0) {\n          goto exit;\n        }\n      }\n    }\n\n    // pick child and descend\n    curr_trie_ptr = curr_trie->child + (h >> 62);\n  }\n  exit:;\n}\n\ninternal LNK_SymbolHashTrie *\nlnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name)\n{\n  LNK_SymbolHashTrie  *result   = 0;\n  LNK_SymbolHashTrie **curr_ptr = &trie;\n  for (U64 h = hash; ; h <<= 2) {\n    LNK_SymbolHashTrie *curr = ins_atomic_ptr_eval(curr_ptr);\n    if (curr == 0) {\n      break;\n    }\n    if (curr->name && str8_match(*curr->name, name, 0)) {\n      result = curr;\n      break;\n    }\n    curr_ptr = curr->child + (h >> 62);\n  }\n  return result;\n}\n\ninternal void\nlnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie)\n{\n  ins_atomic_ptr_eval_assign(&trie->name,   0);\n  ins_atomic_ptr_eval_assign(&trie->symbol, 0);\n}\n\ninternal LNK_SymbolHashTrieChunk **\nlnk_array_from_symbol_hash_trie_chunk_list(Arena *arena, LNK_SymbolHashTrieChunkList *lists, U64 lists_count, U64 *count_out)\n{\n  U64 chunks_count = 0;\n  for EachIndex(i, lists_count) { chunks_count += lists[i].count; }\n\n  LNK_SymbolHashTrieChunk **chunks        = push_array(arena, LNK_SymbolHashTrieChunk *, chunks_count);\n  U64                       chunks_cursor = 0;\n  for EachIndex(i, lists_count) {\n    for (LNK_SymbolHashTrieChunk *chunk = lists[i].first; chunk != 0; chunk = chunk->next) {\n      chunks[chunks_cursor++] = chunk;\n    }\n  }\n\n  if (count_out) {\n    *count_out = chunks_count;\n  }\n\n  return chunks;\n}\n\ninternal LNK_ObjSymbolRef\nlnk_ref_from_symbol(LNK_Symbol *symbol)\n{\n  return symbol->refs->v;\n}\n\ninternal U64\nlnk_ref_count_from_symbol(LNK_Symbol *symbol)\n{\n  U64 count = 0;\n  for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, count += 1);\n  return count;\n}\n\ninternal LNK_ObjSymbolRef **\nlnk_ref_from_symbol_many(Arena *arena, LNK_Symbol *symbol, U64 *count_out)\n{\n  // TODO: would be simpler if we sorted refs on insert/update\n  U64                refs_count = lnk_ref_count_from_symbol(symbol);\n  LNK_ObjSymbolRef **refs       = push_array(arena, LNK_ObjSymbolRef *, refs_count);\n  U64                i          = 0;\n  for (LNK_ObjSymbolRefNode *node = symbol->refs; node != 0; node = node->next, i += 1) {\n    refs[i] = &node->v;\n  }\n  radsort(refs, refs_count, lnk_obj_symbol_ref_ptr_is_before);\n  if (count_out) {\n    *count_out = refs_count;\n  }\n  return refs;\n}\n\ninternal COFF_ParsedSymbol\nlnk_parsed_from_symbol(LNK_Symbol *symbol)\n{\n  LNK_ObjSymbolRef ref = lnk_ref_from_symbol(symbol);\n  return lnk_parsed_symbol_from_coff_symbol_idx(ref.obj, ref.symbol_idx);\n}\n\ninternal COFF_SymbolValueInterpType\nlnk_interp_from_symbol(LNK_Symbol *symbol)\n{\n  COFF_ParsedSymbol symbol_parsed = lnk_parsed_from_symbol(symbol); \n  return coff_interp_from_parsed_symbol(symbol_parsed);\n}\n\ninternal U64\nlnk_symbol_table_hasher(String8 string)\n{\n  return u64_hash_from_str8(string);\n}\n\ninternal LNK_SymbolTable *\nlnk_symbol_table_init(TP_Arena *arena)\n{\n  LNK_SymbolTable *symtab   = push_array(arena->v[0], LNK_SymbolTable, 1);\n  symtab->arena             = arena;\n  symtab->chunks            = push_array(arena->v[0], LNK_SymbolHashTrieChunkList, arena->count);\n  symtab->search_chunks     = push_array(arena->v[0], LNK_SymbolHashTrieChunkList, arena->count);\n  return symtab;\n}\n\ninternal void\nlnk_symbol_table_push_(LNK_SymbolTable *symtab, Arena *arena, U64 worker_id, LNK_Symbol *symbol)\n{\n  U64                        hash   = lnk_symbol_table_hasher(symbol->name);\n  COFF_SymbolValueInterpType interp = lnk_interp_from_symbol(symbol);\n  LNK_SymbolHashTrieChunkList *chunks;\n  if (interp == COFF_SymbolValueInterp_Weak || interp == COFF_SymbolValueInterp_Undefined) {\n    chunks = &symtab->search_chunks[worker_id];\n  } else {\n    chunks = &symtab->chunks[worker_id];\n  }\n  lnk_symbol_hash_trie_insert_or_replace(arena, chunks, &symtab->root, hash, symbol);\n}\n\ninternal void\nlnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol)\n{\n  lnk_symbol_table_push_(symtab, symtab->arena->v[0], 0, symbol);\n}\n\ninternal LNK_SymbolHashTrie *\nlnk_symbol_table_search_(LNK_SymbolTable *symtab, String8 name)\n{\n  U64 hash = lnk_symbol_table_hasher(name);\n  return lnk_symbol_hash_trie_search(symtab->root, hash, name);\n}\n\ninternal LNK_Symbol *\nlnk_symbol_table_search(LNK_SymbolTable *symtab, String8 name)\n{\n  LNK_SymbolHashTrie *trie = lnk_symbol_table_search_(symtab, name);\n  return trie ? trie->symbol : 0;\n}\n\ninternal LNK_Symbol *\nlnk_symbol_table_searchf(LNK_SymbolTable *symtab, char *fmt, ...)\n{\n  Temp scratch = scratch_begin(0, 0);\n \n  va_list args; va_start(args, fmt);\n  String8 name = push_str8fv(scratch.arena, fmt, args);\n  va_end(args);\n  \n  LNK_Symbol *symbol = lnk_symbol_table_search(symtab, name);\n\n  scratch_end(scratch);\n  return symbol;\n}\n\ninternal ISectOff\nlnk_sc_from_symbol(LNK_Symbol *symbol)\n{\n  COFF_ParsedSymbol parsed_symbol = lnk_parsed_from_symbol(symbol);\n  ISectOff sc = { .isect = parsed_symbol.section_number, .off = parsed_symbol.value };\n  return sc;\n}\n\ninternal U64\nlnk_voff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol)\n{\n  ISectOff sc   = lnk_sc_from_symbol(symbol);\n  U64      voff = image_section_table[sc.isect]->voff + sc.off;\n  return voff;\n}\n\ninternal U64\nlnk_foff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol)\n{\n  ISectOff sc   = lnk_sc_from_symbol(symbol);\n  U64      foff = image_section_table[sc.isect]->foff + sc.off;\n  return foff;\n}\n\ninternal B32\nlnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *resolved_symbol_out)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  B32 is_resolved = 0;\n\n  struct S { struct S *next; LNK_ObjSymbolRef symbol; B32 is_anti_dep; };\n  struct S *sf = 0, *sl = 0;\n\n  LNK_ObjSymbolRef current_symbol = symbol;\n  for (;;) {\n    // guard against self-referencing weak symbols\n    struct S *was_visited = 0;\n    for (struct S *s = sf; s != 0; s = s->next) {\n      if (MemoryCompare(&s->symbol, &current_symbol, sizeof(LNK_ObjSymbolRef)) == 0) { was_visited = s; break; }\n    }\n    if (was_visited) {\n      String8List chain = {0};\n      for (struct S *s = sf; s != 0; s = s->next) {\n        COFF_ParsedSymbol s_parsed = lnk_parsed_symbol_from_coff_symbol_idx(s->symbol.obj, s->symbol.symbol_idx);\n        str8_list_pushf(scratch.arena, &chain, \"\\t%S Symbol %S (No. %#x) =>\", s->symbol.obj->path, s_parsed.name, s->symbol.symbol_idx);\n      }\n      COFF_ParsedSymbol symbol_parsed = lnk_parsed_symbol_from_coff_symbol_idx(symbol.obj, symbol.symbol_idx);\n      str8_list_pushf(scratch.arena, &chain, \"\\t%S Symbol %S (No. %#x)\", sf->symbol.obj->path, symbol_parsed.name, sf->symbol.symbol_idx);\n\n      String8 chain_string = str8_list_join(scratch.arena, &chain, &(StringJoin){ .sep = str8_lit(\"\\n\") });\n      lnk_error_obj(LNK_Error_WeakCycle, symbol.obj, \"unable to resolve cyclic symbol %S; ref chain:\\n%S\", symbol_parsed.name, chain_string);\n\n      goto exit;\n    }\n\n    COFF_ParsedSymbol          current_parsed = lnk_parsed_symbol_from_coff_symbol_idx(current_symbol.obj, current_symbol.symbol_idx);\n    COFF_SymbolValueInterpType current_interp = coff_interp_symbol(current_parsed.section_number, current_parsed.value, current_parsed.storage_class);\n    if (current_interp == COFF_SymbolValueInterp_Weak) {\n      // record visited symbol\n      struct S *s = push_array(scratch.arena, struct S, 1);\n      s->symbol   = current_symbol;\n      SLLQueuePush(sf, sl, s);\n\n      // does weak symbol have a definition?\n      LNK_Symbol                 *defn_symbol = lnk_symbol_table_search(symtab, current_parsed.name);\n      COFF_ParsedSymbol           defn_parsed = lnk_parsed_from_symbol(defn_symbol);\n      COFF_SymbolValueInterpType  defn_interp = coff_interp_symbol(defn_parsed.section_number, defn_parsed.value, defn_parsed.storage_class);\n      if (defn_interp != COFF_SymbolValueInterp_Weak) {\n        current_symbol = lnk_ref_from_symbol(defn_symbol);\n        break;\n      }\n\n      COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(current_parsed, current_symbol.obj->header.is_big_obj);\n\n      // no definition -- fallback to default symbol\n      COFF_ParsedSymbol           tag_parsed = lnk_parsed_symbol_from_coff_symbol_idx(current_symbol.obj, weak_ext->tag_index);\n      COFF_SymbolValueInterpType  tag_interp = coff_interp_symbol(tag_parsed.section_number, tag_parsed.value, tag_parsed.storage_class);\n      current_symbol = (LNK_ObjSymbolRef){ .obj = current_symbol.obj, .symbol_idx = weak_ext->tag_index };\n\n      if (weak_ext->characteristics == COFF_WeakExt_AntiDependency) {\n        if (tag_interp == COFF_SymbolValueInterp_Undefined || tag_interp == COFF_SymbolValueInterp_Weak) {\n          LNK_Symbol *dep_symbol = lnk_symbol_table_search(symtab, tag_parsed.name);\n          tag_interp = lnk_interp_from_symbol(dep_symbol);\n        }\n        if (tag_interp == COFF_SymbolValueInterp_Weak) { break; }\n      }\n    } else if (current_interp == COFF_SymbolValueInterp_Undefined) {\n      LNK_Symbol                 *defn_symbol = lnk_symbol_table_search(symtab, current_parsed.name);\n      COFF_SymbolValueInterpType  defn_interp = lnk_interp_from_symbol(defn_symbol);\n\n      // unresolved undefined symbol\n      if (defn_interp == COFF_SymbolValueInterp_Undefined) { break; }\n\n      // follow symbol definition\n      current_symbol = lnk_ref_from_symbol(defn_symbol);\n    } else { break; }\n  }\n\n  if (resolved_symbol_out) {\n    *resolved_symbol_out = current_symbol;\n  }\n  is_resolved = 1;\n\nexit:;\n  scratch_end(scratch);\n  return is_resolved;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(lnk_replace_weak_with_default_symbol_task)\n{\n  LNK_SymbolTable *symtab = raw_task;\n  for EachNode(c, LNK_SymbolHashTrieChunk, symtab->search_chunks[task_id].first) {\n    for EachIndex(i, c->count) {\n      LNK_Symbol                 *symbol        = c->v[i].symbol;\n      LNK_ObjSymbolRef            symbol_ref    = lnk_ref_from_symbol(symbol);\n      COFF_ParsedSymbol           symbol_parsed = lnk_parsed_from_symbol(symbol);\n      COFF_SymbolValueInterpType  symbol_interp = coff_interp_from_parsed_symbol(symbol_parsed);\n      if (symbol_interp == COFF_SymbolValueInterp_Weak) {\n        LNK_ObjSymbolRef resolve = {0};\n        if (lnk_resolve_weak_symbol(symtab, symbol_ref, &resolve)) {\n          COFF_ParsedSymbol          resolve_parsed = lnk_parsed_symbol_from_coff_symbol_idx(resolve.obj, resolve.symbol_idx);\n          COFF_SymbolValueInterpType resolve_interp = coff_interp_from_parsed_symbol(resolve_parsed);\n          if (resolve_interp == COFF_SymbolValueInterp_Weak) {\n            COFF_SymbolWeakExt *weak_ext = coff_parse_weak_tag(resolve_parsed, symbol_ref.obj->header.is_big_obj);\n            if (symbol_ref.obj->header.is_big_obj) {\n              COFF_Symbol32 *symbol32  = symbol_parsed.raw_symbol;\n              symbol32->section_number = COFF_Symbol_UndefinedSection;\n              symbol32->value          = 0;\n              symbol32->storage_class  = COFF_SymStorageClass_External;\n            } else {\n              COFF_Symbol16 *symbol16  = symbol_parsed.raw_symbol;\n              symbol16->section_number = COFF_Symbol_UndefinedSection;\n              symbol16->value          = 0;\n              symbol16->storage_class  = COFF_SymStorageClass_External;\n            }\n          } else {\n            symbol->refs->v = resolve;\n          }\n        }\n      }\n    }\n  }\n}\n\ninternal void\nlnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab)\n{\n  ProfBeginFunction();\n\n  tp_for_parallel_prof(tp, 0, tp->worker_count, lnk_replace_weak_with_default_symbol_task, symtab, \"Replace Weak With Default Symbols\");\n\n  for EachIndex(i, tp->worker_count) {\n    lnk_symbol_hash_trie_chunk_list_concat_in_place(&symtab->chunks[i], &symtab->search_chunks[i]);\n  }\n\n  ProfEnd();\n}\n\n"
  },
  {
    "path": "src/linker/lnk_symbol_table.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n// --- Symbol ------------------------------------------------------------------\n\ntypedef struct LNK_ObjSymbolRef\n{\n  struct LNK_Obj *obj;\n  U32             symbol_idx;\n} LNK_ObjSymbolRef;\n\ntypedef struct LNK_ObjSymbolRefNode\n{\n  struct LNK_ObjSymbolRefNode *next;\n  LNK_ObjSymbolRef             v;\n} LNK_ObjSymbolRefNode;\n\ntypedef struct LNK_Symbol\n{\n  String8               name;\n  LNK_ObjSymbolRefNode *refs;\n} LNK_Symbol;\n\n// --- Symbol Containers -------------------------------------------------------\n\ntypedef struct LNK_SymbolNode\n{\n  struct LNK_SymbolNode *next;\n  LNK_Symbol            *data;\n} LNK_SymbolNode;\n\ntypedef struct LNK_SymbolList\n{\n  U64             count;\n  LNK_SymbolNode *first;\n  LNK_SymbolNode *last;\n} LNK_SymbolList;\n\ntypedef struct LNK_SymbolArray\n{\n  U64         count;\n  LNK_Symbol *v;\n} LNK_SymbolArray;\n\n// --- Symbol Hash Trie --------------------------------------------------------\n\ntypedef struct LNK_SymbolHashTrie\n{\n  String8                   *name;\n  LNK_Symbol                *symbol;\n  struct LNK_SymbolHashTrie *child[4];\n} LNK_SymbolHashTrie;\n\ntypedef struct LNK_SymbolHashTrieChunk\n{\n  struct LNK_SymbolHashTrieChunk *next;\n  U64                             count;\n  U64                             cap;\n  LNK_SymbolHashTrie             *v;\n} LNK_SymbolHashTrieChunk;\n\ntypedef struct LNK_SymbolHashTrieChunkList\n{\n  U64                      count;\n  LNK_SymbolHashTrieChunk *first;\n  LNK_SymbolHashTrieChunk *last;\n} LNK_SymbolHashTrieChunkList;\n\n// --- Symbol Table ------------------------------------------------------------\n\ntypedef struct LNK_SymbolTable\n{\n  TP_Arena                    *arena;\n  LNK_SymbolHashTrie          *root;\n  LNK_SymbolHashTrieChunkList *chunks;\n  LNK_SymbolHashTrieChunkList *search_chunks;\n} LNK_SymbolTable;\n\n// --- Workers Contexts --------------------------------------------------------\n\ntypedef struct\n{\n  LNK_SymbolTable          *symtab;\n  LNK_SymbolHashTrieChunk **chunks;\n} LNK_ReplaceWeakSymbolsWithDefaultSymbolTask;\n\n// --- Symbol -----------------------------------------------------------------\n\ninternal LNK_Symbol * lnk_make_symbol(Arena *arena, String8 name, struct LNK_Obj *obj, U32 symbol_idx);\n\ninternal int lnk_obj_symbol_ref_is_before(void *raw_a, void *raw_b);\ninternal int lnk_obj_symbol_ref_ptr_is_before(void *raw_a, void *raw_b);\ninternal int lnk_symbol_is_before(void *raw_a, void *raw_b);\ninternal int lnk_symbol_ptr_is_before(void *raw_a, void *raw_b);\n\n// --- Symbol Containers ------------------------------------------------------\n\ninternal void             lnk_symbol_list_push_node(LNK_SymbolList *list, LNK_SymbolNode *node);\ninternal LNK_SymbolNode * lnk_symbol_list_push(Arena *arena, LNK_SymbolList *list, LNK_Symbol *symbol);\n\n// --- Symbol Hash Trie --------------------------------------------------------\n\ninternal LNK_SymbolHashTrie *       lnk_symbol_hash_tire_chunk_list_push(Arena *arena, LNK_SymbolHashTrieChunkList *list, U64 cap);\ninternal void                       lnk_symbol_hash_trie_chunk_list_concat_in_place(LNK_SymbolHashTrieChunkList *list, LNK_SymbolHashTrieChunkList *to_concat);\ninternal void                       lnk_symbol_hash_trie_insert_or_replace(Arena *arena, LNK_SymbolHashTrieChunkList *chunks, LNK_SymbolHashTrie **trie, U64 hash, LNK_Symbol *symbol);\ninternal LNK_SymbolHashTrie *       lnk_symbol_hash_trie_search(LNK_SymbolHashTrie *trie, U64 hash, String8 name);\ninternal void                       lnk_symbol_hash_trie_remove(LNK_SymbolHashTrie *trie);\ninternal LNK_SymbolHashTrieChunk ** lnk_array_from_symbol_hash_trie_chunk_list(Arena *arena, LNK_SymbolHashTrieChunkList *lists, U64 lists_count, U64 *count_out);\n\n// --- Symbol Helpers ----------------------------------------------------------\n\ninternal LNK_ObjSymbolRef           lnk_ref_from_symbol(LNK_Symbol *symbol);\ninternal U64                        lnk_ref_count_from_symbol(LNK_Symbol *symbol);\ninternal COFF_ParsedSymbol          lnk_parsed_from_symbol(LNK_Symbol *symbol);\ninternal COFF_SymbolValueInterpType lnk_interp_from_symbol(LNK_Symbol *symbol);\n\n// --- Symbol Table ------------------------------------------------------------\n\ninternal U64 lnk_symbol_table_hasher(String8 string);\n\ninternal LNK_SymbolTable * lnk_symbol_table_init(TP_Arena *arena);\ninternal void              lnk_symbol_table_push(LNK_SymbolTable *symtab, LNK_Symbol *symbol);\ninternal LNK_Symbol *      lnk_symbol_table_search(LNK_SymbolTable *symtab, String8 name);\ninternal LNK_Symbol *      lnk_symbol_table_searchf(LNK_SymbolTable *symtab, char *fmt, ...);\n\n// --- Symbol Contrib Helpers --------------------------------------------------\n\ninternal ISectOff lnk_sc_from_symbol(LNK_Symbol *symbol);\ninternal U64      lnk_voff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol);\ninternal U64      lnk_foff_from_symbol(COFF_SectionHeader **image_section_table, LNK_Symbol *symbol);\n\n// --- Weak Symbol -------------------------------------------------------------\n\ninternal B32 lnk_resolve_weak_symbol(LNK_SymbolTable *symtab, LNK_ObjSymbolRef symbol, LNK_ObjSymbolRef *resolved_symbol_out);\n\ninternal void lnk_replace_weak_with_default_symbols(TP_Context *tp, LNK_SymbolTable *symtab);\n\n"
  },
  {
    "path": "src/linker/lnk_timer.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\nglobal LNK_Timer g_timers[LNK_Timer_Count];\n\ninternal void\nlnk_timer_begin(LNK_TimerType timer)\n{\n  g_timers[timer].begin = os_now_microseconds();\n}\n\ninternal void\nlnk_timer_end(LNK_TimerType timer)\n{\n  g_timers[timer].end = os_now_microseconds();\n}\n\ninternal String8\nlnk_string_from_timer_type(LNK_TimerType type)\n{\n  switch (type) {\n  case LNK_Timer_Image: return str8_lit(\"Image\");\n  case LNK_Timer_Pdb:   return str8_lit(\"PDB\");\n  case LNK_Timer_Rdi:   return str8_lit(\"RDI\");\n  case LNK_Timer_Lib:   return str8_lit(\"Lib\");\n  case LNK_Timer_Debug: return str8_lit(\"Debug\");\n  default: InvalidPath;\n  }\n  return str8_zero();\n}\n\n"
  },
  {
    "path": "src/linker/lnk_timer.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ntypedef enum LNK_TimerType\n{\n  LNK_Timer_Image,\n  LNK_Timer_Pdb,\n  LNK_Timer_Rdi,\n  LNK_Timer_Lib,\n  LNK_Timer_Debug,\n  LNK_Timer_Count\n} LNK_TimerType;\n\ntypedef struct LNK_Timer\n{\n  U64 begin;\n  U64 end;\n} LNK_Timer;\n\ninternal void lnk_timer_begin(LNK_TimerType timer);\ninternal void lnk_timer_end(LNK_TimerType timer);\n\n"
  },
  {
    "path": "src/linker/pdb_ext/msf_builder.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64\nmsf_get_data_node_size(MSF_UInt page_size)\n{\n  U64 interval = msf_get_fpm_interval_correct(page_size);\n  U64 bytes_per_interval = interval * (U64)page_size;\n  return bytes_per_interval;\n}\n\ninternal void\nmsf_page_data_list_push(Arena *arena, MSF_PageDataList *list, MSF_UInt page_size, MSF_UInt count)\n{\n  U64 data_size = msf_get_data_node_size(page_size);\n  for (MSF_UInt i = 0; i < count; i += 1) {\n    // TODO: clearing memory to zero here is expensive,\n    // with 4KiB pages we have to zero-out 128 MiB \n    // memory block\n    // \n    // we can make API for stream allocation to let user \n    // choose between zeroed and dirty allocations\n    //\n    U8 *data = push_array_aligned(arena, U8, data_size, page_size);\n\n    // init node\n    MSF_PageDataNode *node = push_array_no_zero(arena, MSF_PageDataNode, 1);\n    node->prev = 0;\n    node->next = 0;\n    node->data = data;\n\n    // push node to list\n    DLLPushBack(list->first, list->last, node);\n    list->count += 1;\n  }\n}\n\ninternal MSF_PageDataList\nmsf_page_data_list_pop(MSF_PageDataList *list, MSF_UInt count)\n{\n  MSF_PageDataList result = {0};\n  \n  MSF_UInt to_remove = Min(count, list->count);\n  for (MSF_UInt i = 0; i < to_remove; i += 1) {\n    MSF_PageDataNode *node = list->last;\n    DLLRemove(list->first, list->last, node);\n    \n    node->prev = 0;\n    node->next = 0;\n    \n    DLLPushBack(result.first, result.last, node);\n    result.count += 1;\n  }\n  list->count -= to_remove;\n  \n  return result;\n}\n\ninternal void\nmsf_page_data_list_concat_in_place(MSF_PageDataList *list, MSF_PageDataList *to_concat)\n{\n  DLLConcatInPlace(list, to_concat);\n}\n\ninternal void\nmsf_set_page_data_list(Arena *arena, MSF_PageDataList *list, MSF_UInt page_size, String8 data)\n{\n  ProfBeginFunction();\n\n  U64 node_size = msf_get_data_node_size(page_size);\n  U64 node_count = CeilIntegerDiv(data.size, node_size);\n  \n  U64 node_idx;\n  for (node_idx = 0; node_idx < node_count - 1; node_idx += 1) {\n    MSF_PageDataNode *node = push_array(arena, MSF_PageDataNode, 1);\n    node->data = data.str + node_idx * node_size;\n    SLLQueuePush(list->first, list->last, node);\n    list->count += 1;\n  }\n  \n  ProfBegin(\"Last Page Handle\");\n  B32 is_last_node_size_aligned = (data.size & (node_size - 1)) == 0;\n  U8 *last_node_data = 0;\n  if (is_last_node_size_aligned) {\n    last_node_data = data.str + node_idx * node_size;\n  } else {\n    U64 last_node_size = data.size % node_size;\n    last_node_data = push_array_no_zero(arena, U8, node_size);\n    MemoryCopy(last_node_data, data.str + node_idx * node_size, last_node_size);\n  }\n  ProfEnd();\n  \n  MSF_PageDataNode *last_node = push_array(arena, MSF_PageDataNode, 1);\n  last_node->data = last_node_data;\n  SLLQueuePush(list->first, list->last, last_node);\n  list->count += 1;\n\n  ProfEnd();\n}\n\ninternal String8\nmsf_data_from_pn(MSF_PageDataList list, MSF_UInt page_size, MSF_PageNumber pn)\n{\n  U64 node_size = msf_get_data_node_size(page_size);\n  U64 page_offset = (U64)pn * (U64)page_size;\n  U64 data_node_idx = page_offset / node_size;\n  MSF_PageDataNode *node = list.first;\n  for (U64 i = 0; i < data_node_idx; i += 1) {\n    node = node->next;\n  }\n  U64 node_offset = page_offset % node_size;\n  U8 *ptr = node->data + node_offset;\n  String8 data = str8(ptr, page_size);\n  return data;\n}\n\n////////////////////////////////\n\ninternal MSF_StreamNode *\nmsf_stream_list_push(Arena *arena, MSF_StreamList *list)\n{\n  MSF_StreamNode *n = push_array(arena, MSF_StreamNode, 1);\n  DLLPushBack(list->first, list->last, n);\n  list->count += 1;\n  return n;\n}\n\ninternal void\nmsf_stream_list_remove(MSF_StreamList *list, MSF_StreamNode *node)\n{\n  Assert(list->count > 0);\n  DLLRemove(list->first, list->last, node);\n  list->count -= 1;\n}\n\n////////////////////////////////\n\ninternal void\nmsf_page_list_push_node(MSF_PageList *list, MSF_PageNode *node)\n{\n  DLLPushBack(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal MSF_PageNode *\nmsf_page_list_push(Arena *arena, MSF_PageList *list)\n{\n  MSF_PageNode *node = push_array(arena, MSF_PageNode, 1);\n  msf_page_list_push_node(list, node);\n  return node;\n}\n\ninternal MSF_PageNode *\nmsf_page_list_pop_last(MSF_PageList *list)\n{\n  MSF_PageNode *node = NULL;\n  if (list->count) {\n    node = list->last;\n    DLLRemove(list->first, list->last, node);\n    list->count -= 1;\n  }\n  return node;\n}\n\ninternal void\nmsf_page_list_concat_in_place(MSF_PageList *list, MSF_PageList *to_concat)\n{\n  DLLConcatInPlace(list, to_concat);\n}\n\ninternal MSF_PageNumber *\nmsf_page_list_to_arr(Arena *arena, MSF_PageList list)\n{\n  MSF_PageNumber *arr = push_array(arena, MSF_PageNumber, list.count);\n  MSF_UInt i = 0;\n  for (MSF_PageNode *node = list.first; node != 0; node = node->next, i += 1) {\n    arr[i] = node->pn;\n  }\n  return arr;\n}\n\ninternal MSF_PageNode *\nmsf_page_from_index(MSF_PageList page_list, MSF_UInt index)\n{\n  MSF_PageNode *page;\n  \n  B32 scan_from_last_node = index > page_list.count/2;\n  if (scan_from_last_node) {\n    page = page_list.last;\n    if (page_list.count > 0) {\n      for (MSF_UInt i = page_list.count - 1; i > index; i -= 1) {\n        page = page->prev;\n        if (!page) {\n          return 0;\n        }\n      }\n    }\n  } else {\n    page = page_list.first;\n    for (MSF_UInt i = 0; i < index; i += 1) {\n      page = page->next;\n      if (!page) {\n        return 0;\n      }\n    }\n  }\n  return page;\n}\n\ninternal void\nmsf_page_list_push_extant_page_arr(Arena *arena, MSF_PageList *list,\n                                   MSF_PageDataList page_data_list, MSF_UInt page_size,\n                                   MSF_PageNumber *pn_arr, MSF_UInt pn_count)\n{\n  U64 node_size = msf_get_data_node_size(page_size);\n  U64 data_max = page_data_list.count * node_size;\n  for (MSF_PageNumber *pn_ptr = pn_arr, *pn_opl = pn_ptr + pn_count; pn_ptr < pn_opl; pn_ptr += 1) {\n    // is page number valid?\n    Assert(*pn_ptr * page_size + page_size <= data_max);\n    \n    // init page node\n    MSF_PageNode *page_node = msf_page_list_push(arena, list);\n    page_node->pn = *pn_ptr;\n  }\n}\n\ninternal void\nmsf_page_list_push_extant_page(Arena *arena, MSF_PageList *list, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber pn)\n{\n  msf_page_list_push_extant_page_arr(arena, list, page_data_list, page_size, &pn, 1);\n}\n\n#if LNK_PARANOID\ninternal void\nmsf_check_fpm_bits_for_page_list(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageList page_list, MSF_UInt test_state)\n{\n  for (MSF_PageNode *page_node = page_list.first; page_node != 0; page_node = page_node->next) {\n    MSF_UInt state = msf_get_fpm_page_bit_state(page_data_list, page_size, active_fpm, page_node->pn);\n    if (state != test_state) {\n      //Assert(!\"state bit doesn't match\");\n    }\n  }\n}\n#endif\n\n////////////////////////////////\n\ninternal MSF_UInt\nmsf_count_pages(MSF_UInt page_size, U64 data_size)\n{\n  MSF_UInt page_count = CeilIntegerDiv(data_size, page_size);\n  return page_count;\n}\n\ninternal MSF_PageNumber\nmsf_get_page_count_cap(MSF_PageDataList page_data_list, MSF_UInt page_size)\n{\n  U64 node_size = msf_get_data_node_size(page_size);\n  U64 file_size = page_data_list.count * node_size;\n  U64 count = CeilIntegerDiv(file_size, (U64)page_size);\n  return safe_cast_u32(count);\n}\n\n////////////////////////////////\n\ninternal U32Array\nmsf_fpm_data_from_pn(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber fpm_pn)\n{\n  String8 raw_fpm = msf_data_from_pn(page_data_list, page_size, fpm_pn);\n  U32Array fpm_data;\n  fpm_data.count = raw_fpm.size / sizeof(fpm_data.v[0]);\n  fpm_data.v = (U32*)raw_fpm.str;\n  return fpm_data;\n}\n\ninternal MSF_UInt\nmsf_get_fpm_interval_correct(MSF_UInt page_size)\n{\n  return page_size * MSF_BITS_PER_CHAR;\n}\n\ninternal MSF_UInt\nmsf_get_fpm_interval_wrong(MSF_UInt page_size)\n{\n  return page_size;\n}\n\ninternal MSF_UInt\nmsf_get_fpm_idx_from_pn(MSF_UInt page_size, MSF_PageNumber pn)\n{\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size);\n  MSF_UInt fpm_idx = pn / fpm_interval_correct;\n  return fpm_idx;\n}\n\ninternal MSF_UInt\nmsf_get_fpm_page_count(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_UInt fpm_interval)\n{\n  U64 node_size = msf_get_data_node_size(page_size);\n  U64 file_size = (U64)page_data_list.count * node_size;\n  U64 file_page_count = CeilIntegerDiv(file_size, page_size);\n  U64 fpm_page_count = CeilIntegerDiv(file_page_count, (U64)fpm_interval);\n  return safe_cast_u32(fpm_page_count);\n}\n\ninternal MSF_PageNumberArray\nmsf_get_fpm_page_arr(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_UInt active_fpm)\n{\n  Assert(active_fpm == MSF_FPM0 || active_fpm == MSF_FPM1);\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size);\n  MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(page_size);\n  MSF_UInt page_count = msf_get_page_count_cap(page_data_list, page_size);\n  MSF_PageNumberArray arr;\n  arr.count = CeilIntegerDiv(page_count, fpm_interval_correct);\n  arr.v = push_array(arena, MSF_PageNumber, arr.count);\n  for (MSF_UInt interval_idx = 0; interval_idx < arr.count; interval_idx += 1) {\n    arr.v[interval_idx] = active_fpm + interval_idx * fpm_interval_wrong;\n  }\n  return arr;\n}\n\ninternal MSF_PageNumber\nmsf_get_fpm_from_page_number(MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn)\n{\n  Assert(active_fpm == 1 || active_fpm == 2);\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size);\n  MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(page_size);\n  MSF_PageNumber fpm_pn = active_fpm;\n  fpm_pn += (pn / fpm_interval_correct) * fpm_interval_wrong;\n  return fpm_pn;\n}\n\ninternal MSF_UInt\nmsf_get_fpm_page_bit_state(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn)\n{\n  // fetch FPM\n  MSF_PageNumber fpm_pn = msf_get_fpm_from_page_number(page_size, active_fpm, pn);\n  U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn);\n  \n  // get page bit\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size);\n  MSF_UInt page_bit_idx = pn % fpm_interval_correct;\n  MSF_UInt state = bit_array_get_bit32(fpm_data, page_bit_idx);\n  \n  return state;\n}\n\ninternal void\nmsf_set_fpm_bit_(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn, B32 state)\n{\n  // fetch FPM\n  MSF_PageNumber fpm_pn = msf_get_fpm_from_page_number(page_size, active_fpm, pn);\n  U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn);\n  \n  // set page bit\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size);\n  MSF_UInt page_bit_idx = pn % fpm_interval_correct;\n  bit_array_set_bit32(fpm_data, page_bit_idx, state);\n}\n\ninternal void\nmsf_set_fpm_bit(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn, B32 state)\n{\n  msf_set_fpm_bit_(page_data_list, page_size, active_fpm, pn, state);\n}\n\ninternal B32\nmsf_grow(MSF_Context *msf, MSF_PageNumber new_page_count)\n{\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(msf->page_size);\n  MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(msf->page_size);\n  \n  // check alloc limit\n  U64 new_page_count64 = AlignPow2((U64)new_page_count, (U64)fpm_interval_correct);\n  B32 is_overflowed = new_page_count64 > MSF_PN_MAX;\n  if (is_overflowed) {\n    return 0;\n  }\n  \n  // check can only grow MSF here\n  new_page_count = safe_cast_u32(new_page_count64);\n  if (new_page_count < msf->page_count) {\n    return 0;\n  }\n\n  // compute number of FPM pages to allocate\n  //\n  // we allocate 8 times more FPMs because in MS impl they use wrong interval:\n  //    https://github.com/microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L509\n  //\n  MSF_PageNumber prev_fpm_page_cap_wrong = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_wrong);\n  MSF_PageNumber curr_fpm_page_cap_wrong = CeilIntegerDiv(new_page_count, fpm_interval_wrong);\n  MSF_PageNumber alloc_count_wrong = curr_fpm_page_cap_wrong - prev_fpm_page_cap_wrong;\n  MSF_PageNumber next_pn_wrong = prev_fpm_page_cap_wrong * fpm_interval_wrong;\n  MSF_PageNumber end_pn_wrong = next_pn_wrong + alloc_count_wrong * fpm_interval_wrong;\n  \n  // compute correct number of FPM pages to grow\n  MSF_PageNumber prev_fpm_page_cap_correct = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_correct);\n  MSF_PageNumber curr_fpm_page_cap_correct = CeilIntegerDiv(new_page_count, fpm_interval_correct);\n  MSF_PageNumber alloc_count_correct = curr_fpm_page_cap_correct - prev_fpm_page_cap_correct;\n  MSF_PageNumber next_pn_correct = prev_fpm_page_cap_correct * fpm_interval_correct;\n  MSF_PageNumber end_pn_correct = next_pn_correct + alloc_count_correct * fpm_interval_correct;\n  \n  MSF_PageNumber to_alloc = alloc_count_correct;\n  \n  // are there unused data nodes?\n  if (msf->page_data_pool.count) {\n    MSF_PageNumber pool_alloc_count = Min(msf->page_data_pool.count, alloc_count_correct);\n    MSF_PageDataList page_data_list = msf_page_data_list_pop(&msf->page_data_pool, pool_alloc_count);\n    msf_page_data_list_concat_in_place(&msf->page_data_list, &page_data_list);\n    to_alloc -= pool_alloc_count;\n  }\n  \n  // push enough data nodes to encompass allocated FPMs\n  msf_page_data_list_push(msf->arena, &msf->page_data_list, msf->page_size, to_alloc);\n  \n  // set FPM bits to free\n  for (MSF_PageNumber pn = next_pn_wrong; pn < end_pn_wrong; pn += fpm_interval_wrong) {\n    MSF_PageNumber fpm0_pn = pn + MSF_FPM0;\n    MSF_PageNumber fpm1_pn = pn + MSF_FPM1;\n    String8 fpm0_data = msf_data_from_pn(msf->page_data_list, msf->page_size, fpm0_pn);\n    String8 fpm1_data = msf_data_from_pn(msf->page_data_list, msf->page_size, fpm1_pn);\n    MemorySet(fpm0_data.str, 0xFF, msf->page_size);\n    MemorySet(fpm1_data.str, 0xFF, msf->page_size);\n  }\n  \n  // set correct FPM bits\n  for (MSF_PageNumber pn = next_pn_correct; pn < end_pn_correct; pn += fpm_interval_correct) {\n    MSF_PageNumber fpm0_pn = pn + MSF_FPM0;\n    MSF_PageNumber fpm1_pn = pn + MSF_FPM1;\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM0, fpm0_pn, MSF_PAGE_STATE_ALLOC);\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM0, fpm1_pn, MSF_PAGE_STATE_ALLOC);\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM1, fpm0_pn, MSF_PAGE_STATE_ALLOC);\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, MSF_FPM1, fpm1_pn, MSF_PAGE_STATE_ALLOC);\n  }\n  \n  // update context\n  msf->page_count += alloc_count_wrong * 2;\n\n  return 1;\n}\n\n#if 0\ninternal B32\nmsf_shrink(MSF_Context *msf, MSF_PageNumber new_page_count)\n{\n  MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(msf->page_size);\n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(msf->page_size);\n  \n  U64 new_page_count64 = AlignPow2((U64)new_page_count, (U64)fpm_interval_correct);\n  new_page_count = safe_cast_u32(new_page_count64);\n  Assert(new_page_count < msf->page_count);\n  \n  // compute number of FPM pages to deallocate\n  MSF_PageNumber prev_fpm_page_count_wrong = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_wrong);\n  MSF_PageNumber curr_fpm_page_count_wrong = CeilIntegerDiv(new_page_count, fpm_interval_wrong);\n  MSF_PageNumber dealloc_count_wrong = prev_fpm_page_count_wrong - curr_fpm_page_count_wrong;\n  \n  // compute next FPM page number\n  MSF_PageNumber next_pn = prev_fpm_page_count_wrong * fpm_interval_wrong;\n  MSF_PageNumber end_pn = next_pn - dealloc_count_wrong * fpm_interval_wrong;\n  \n  // pop data nodes\n  MSF_PageNumber prev_fpm_page_count_correct = msf_get_fpm_page_count(msf->page_data_list, msf->page_size, fpm_interval_correct);\n  MSF_PageNumber curr_fpm_page_count_correct = CeilIntegerDiv(new_page_count, fpm_interval_correct);\n  MSF_PageNumber dealloc_count_correct = prev_fpm_page_count_correct - curr_fpm_page_count_correct;\n  MSF_PageDataList free_page_data_list = msf_page_data_list_pop(&msf->page_data_list, dealloc_count_correct);\n  msf_page_data_list_concat_in_place(&msf->page_data_pool, &free_page_data_list);\n  \n  for (MSF_PageNumber pn = next_pn; pn > end_pn; pn -= fpm_interval_wrong) {\n    MSF_PageNumber fpm0_pn = pn + MSF_FPM0;\n    MSF_PageNumber fpm1_pn = pn + MSF_FPM1;\n    \n    // free FPM pages\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, 1, fpm0_pn, MSF_PAGE_STATE_FREE);\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, 1, fpm1_pn, MSF_PAGE_STATE_FREE);\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, 2, fpm0_pn, MSF_PAGE_STATE_FREE);\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, 2, fpm1_pn, MSF_PAGE_STATE_FREE);\n  }\n  \n  // update context\n  msf->page_count -= dealloc_count_wrong * 2;\n  \n  return true;\n}\n#endif\n\ninternal MSF_PageNumber *\nmsf_alloc_pn_arr(Arena *arena, MSF_Context *msf, MSF_UInt alloc_count)\n{\n  // make sure FPM has enough space for new page numbers\n  // \n  // we grow FPM at correct intervals here because we pre-alloc unused FPM pages ahead of time\n  MSF_UInt curr_page_cap = msf_get_page_count_cap(msf->page_data_list, msf->page_size);\n  MSF_UInt new_page_count = msf->page_count + alloc_count;\n  if (new_page_count > curr_page_cap) {\n    B32 is_fpm_alloced = msf_grow(msf, new_page_count);\n    if (!is_fpm_alloced) {\n      return 0;\n    }\n  }\n\n  Temp scratch = scratch_begin(&arena, 1);\n\n  // reserve memory for page numbers\n  MSF_PageNumber *pn_arr = push_array(arena, MSF_PageNumber, alloc_count);\n  \n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(msf->page_size);\n  MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(msf->page_size);\n  \n  // get first FPM page\n  MSF_PageNumberArray fpm_pn_arr = msf_get_fpm_page_arr(scratch.arena, msf->page_data_list, msf->page_size, msf->active_fpm);\n  \n  for (MSF_UInt alloc_idx = 0; alloc_idx < alloc_count; ) {\n    // get FPM bits\n    MSF_UInt fpm_idx = msf->fpm_rover / fpm_interval_correct;\n    Assert(fpm_idx < fpm_pn_arr.count);\n    MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_idx];\n    U32Array fpm_data = msf_fpm_data_from_pn(msf->page_data_list, msf->page_size, fpm_pn);\n    \n    // scan FPM for free bit\n    MSF_UInt fpm_rover_page_relative = msf->fpm_rover % fpm_interval_correct;\n    U32 bit_idx = bit_array_scan_left_to_right32(fpm_data, fpm_rover_page_relative, fpm_interval_correct, MSF_PAGE_STATE_FREE);\n    \n    B32 is_full = (bit_idx >= fpm_interval_correct);\n    if (is_full) {\n      msf->fpm_rover = (fpm_idx + 1) * fpm_interval_correct;\n      continue;\n    }\n    \n    // compute page number\n    MSF_PageNumber pn = bit_idx + (fpm_idx * fpm_interval_correct);\n    \n    // make sure unused FPMs aren't allocated for regular streams,\n    // we used to mark with free bits unused FPMs but in VS2022\n    // update they started to check for these bits and VS began\n    // to error out with \"PDB format is not supported\" message\n    B32 is_pn_valid = (pn % fpm_interval_wrong) != MSF_FPM0 &&\n                      (pn % fpm_interval_wrong) != MSF_FPM1;\n    if (is_pn_valid) {\n      // update FPM\n      bit_array_set_bit32(fpm_data, bit_idx, MSF_PAGE_STATE_ALLOC);\n      \n      // store page number\n      pn_arr[alloc_idx++] = pn;\n    }\n    \n    // advance FPM rover\n    msf->fpm_rover = pn + 1;\n  }\n  \n  // update context\n  msf->page_count += alloc_count;\n  \n  scratch_end(scratch);\n  return pn_arr;\n}\n\ninternal void\nmsf_free_pn_arr(MSF_Context *msf, MSF_PageNumber *pn_arr, MSF_UInt pn_count)\n{\n  // set FPM bits\n  for (MSF_UInt i = 0; i < pn_count; i += 1) {\n    MSF_PageNumber pn = pn_arr[i];\n    msf_set_fpm_bit(msf->page_data_list, msf->page_size, msf->active_fpm, pn, MSF_PAGE_STATE_FREE);\n\n    // update FPM cursor\n    msf->fpm_rover = Min(msf->fpm_rover, pn);\n  }\n  \n  // update context\n  Assert(msf->page_count >= pn_count);\n  msf->page_count -= pn_count;\n}\n\ninternal MSF_PageList\nmsf_alloc_pages(MSF_Context *msf, MSF_UInt alloc_count)\n{\n  Temp scratch = scratch_begin(0, 0);\n  \n  MSF_PageList alloc_list = {0};\n  MSF_PageNumber *pn_arr = msf_alloc_pn_arr(scratch.arena, msf, alloc_count);\n  if (pn_arr) {\n    for (MSF_UInt page_idx = 0; page_idx < alloc_count; page_idx += 1) {\n      // get page node\n      MSF_PageNode *page_node = 0;\n      if (msf->page_pool.count) {\n        page_node = msf_page_list_pop_last(&msf->page_pool);\n        msf_page_list_push_node(&alloc_list, page_node);\n      } else {\n        page_node = msf_page_list_push(msf->arena, &alloc_list);\n      }\n      \n      // copy page number\n      page_node->pn = pn_arr[page_idx];\n    }\n  }\n  \n  scratch_end(scratch);\n  return alloc_list;\n}\n\ninternal void\nmsf_free_pages(MSF_Context *msf, MSF_PageList *page_list)\n{\n  Temp scratch = scratch_begin(0, 0);\n  \n  // free page numbers\n  MSF_PageNumber *pn_arr = msf_page_list_to_arr(scratch.arena, *page_list);\n  msf_free_pn_arr(msf, pn_arr, page_list->count);\n  \n  // push free nodes\n  msf_page_list_concat_in_place(&msf->page_pool, page_list);\n\n  scratch_end(scratch);\n}\n\ninternal MSF_PageNumber\nmsf_find_max_pn_(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumberArray fpm_pn_arr)\n{\n  MSF_PageNumber max_pn = 0;\n  \n  MSF_UInt fpm_interval_correct = msf_get_fpm_interval_correct(page_size);\n  MSF_UInt fpm_interval_wrong = msf_get_fpm_interval_wrong(page_size);\n  MSF_UInt fpm_page_count = fpm_interval_correct / fpm_interval_wrong;\n  for (MSF_Int fpm_pn_idx = (MSF_Int)fpm_pn_arr.count - 1; fpm_pn_idx >= 0; fpm_pn_idx -= 1) {\n    MSF_PageNumber fpm_pn = fpm_pn_arr.v[fpm_pn_idx];\n    U32Array fpm_data = msf_fpm_data_from_pn(page_data_list, page_size, fpm_pn);\n    \n    // we have to work around the fact that FPM bits are always alloced\n    // and also there is a trail of unused FPM groups too\n    U32 bit_idx = max_U32;\n    for (MSF_Int i = fpm_page_count - 1; i >= 0; i -= 1) {\n      U32 fpm_lo = i * fpm_interval_wrong + 3; // skip first page bit and FPM group bits\n      U32 fpm_hi = i * fpm_interval_wrong + fpm_interval_wrong;\n      bit_idx = bit_array_scan_right_to_left32(fpm_data, fpm_lo, fpm_hi, MSF_PAGE_STATE_ALLOC);\n      if (bit_idx <= fpm_interval_correct) {\n        break;\n      }\n    }\n    \n    // check first page bit\n    if (bit_idx >= fpm_interval_correct) {\n      bit_idx = bit_array_scan_left_to_right32(fpm_data, 0, 1, MSF_PAGE_STATE_ALLOC);\n      if (bit_idx >= fpm_interval_correct) {\n        continue;\n      }\n    }\n    \n    // compute max page number\n    MSF_PageNumber pn = bit_idx + (MSF_UInt)fpm_pn_idx * fpm_interval_correct;\n    max_pn = Max(max_pn, pn);\n    \n    break;\n  }\n  \n  return max_pn;\n}\n\ninternal MSF_PageNumber\nmsf_find_max_pn(MSF_PageDataList page_data_list, MSF_UInt page_size)\n{\n  Temp scratch = scratch_begin(0, 0);\n  MSF_PageNumberArray fpm0_pn_arr = msf_get_fpm_page_arr(scratch.arena, page_data_list, page_size, MSF_FPM0);\n  MSF_PageNumberArray fpm1_pn_arr = msf_get_fpm_page_arr(scratch.arena, page_data_list, page_size, MSF_FPM1);\n  MSF_PageNumber fpm0_max = msf_find_max_pn_(page_data_list, page_size, fpm0_pn_arr);\n  MSF_PageNumber fpm1_max = msf_find_max_pn_(page_data_list, page_size, fpm1_pn_arr);\n  MSF_PageNumber max_pn = Max(fpm0_max, fpm1_max);\n  scratch_end(scratch);\n  return max_pn;\n}\n\n////////////////////////////////\n\ninternal B32\nmsf_write__(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNode **page_ptr, MSF_UInt *pos_ptr, void *buffer, MSF_UInt buffer_size)\n{\n  MSF_PageNode *start_page = *page_ptr;\n  MSF_UInt start_pos = *pos_ptr;\n  \n  MSF_UInt buffer_pos = 0;\n  while (*page_ptr) {\n    MSF_UInt page_offset = *pos_ptr % page_size;\n    \n    // compute copy size\n    MSF_UInt buffer_bytes_left = buffer_size - buffer_pos;\n    MSF_UInt page_bytes_left   = page_size - page_offset;\n    MSF_UInt copy_size         = Min(buffer_bytes_left, page_bytes_left);\n\n    // fetch page bytes\n    MSF_PageNumber page_number = (*page_ptr)->pn;\n    String8        page_bytes  = msf_data_from_pn(page_data_list, page_size, page_number);\n\n    // copy bytes to buffer\n    U8 *buffer_copy_ptr = (U8*)buffer + buffer_pos;\n    U8 *page_bytes_ptr  = page_bytes.str + page_offset;\n    MemoryCopy(page_bytes_ptr, buffer_copy_ptr, copy_size);\n\n    // advance\n    buffer_pos += copy_size;\n    *pos_ptr   += copy_size;\n    \n    // have we used all bytes in this page?\n    if (page_bytes_left <= copy_size) {\n      *page_ptr = (*page_ptr)->next;\n    }\n    \n    // have we copied all bytes?\n    if (buffer_bytes_left <= copy_size) {\n      break;\n    }\n  }\n  \n  B32 is_write_ok = (buffer_pos == buffer_size);\n  \n  // not enough bytes to perform write - restore positions\n  if (!is_write_ok) {\n    *page_ptr = start_page;\n    *pos_ptr  = start_pos;\n  }\n  \n  return is_write_ok;\n}\n\ninternal MSF_UInt\nmsf_read__(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNode **page_ptr, MSF_UInt *pos_ptr, void *buffer, MSF_UInt buffer_size)\n{\n  MSF_UInt buffer_pos = 0;\n  while (*page_ptr) {\n    MSF_UInt page_offset = *pos_ptr % page_size;\n    \n    // compute copy size\n    MSF_UInt buffer_bytes_left = buffer_size - buffer_pos;\n    MSF_UInt page_bytes_left   = page_size - page_offset;\n    MSF_UInt copy_size         = Min(buffer_bytes_left, page_bytes_left);\n    \n    // fetch page bytes\n    MSF_PageNumber page_number = (*page_ptr)->pn;\n    String8        page_bytes  = msf_data_from_pn(page_data_list, page_size, page_number);\n    \n    // copy bytes to buffer\n    U8 *buffer_ptr     = (U8*)buffer + buffer_pos;\n    U8 *page_bytes_ptr = page_bytes.str + page_offset;\n    MemoryCopy(buffer_ptr, page_bytes_ptr, copy_size);\n    \n    // advance\n    buffer_pos  += copy_size;\n    *pos_ptr    += copy_size;\n    \n    // no more bytes left in this page\n    if (page_bytes_left <= copy_size) {\n      *page_ptr = (*page_ptr)->next;\n    }\n    \n    // have we copied all bytes?\n    if (buffer_bytes_left <= copy_size) {\n      break;\n    }\n  }\n  \n  MSF_UInt bytes_read = buffer_pos;\n  //Assert(bytes_read == buffer_size);\n  \n  return bytes_read;\n}\n\ninternal B32\nmsf_write(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size)\n{\n  MSF_UInt page_idx = offset / page_size;\n  MSF_PageNode *page = msf_page_from_index(page_list, page_idx);\n  B32 is_write_ok = msf_write__(page_data_list, page_size, &page, &offset, buffer, buffer_size);\n  return is_write_ok;\n}\n\ninternal MSF_UInt\nmsf_read(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size)\n{\n  MSF_UInt page_idx = offset / page_size;\n  MSF_PageNode *page = msf_page_from_index(page_list, page_idx);\n  MSF_UInt bytes_read = msf_read__(page_data_list, page_size, &page, &offset, buffer, buffer_size);\n  return bytes_read;\n}\n\n////////////////////////////////\n\ninternal MSF_StreamNode * \nmsf_stream_alloc_(Arena *arena, MSF_StreamList *list)\n{\n  Assert(list->count < MSF_STREAM_NUMBER_MAX);\n  MSF_UInt sn = list->count;\n  MSF_StreamNode *stream_node = msf_stream_list_push(arena, list);\n  MSF_Stream *stream = &stream_node->data;\n  stream->sn = safe_cast_u16(sn);\n  return stream_node;\n}\n\ninternal MSF_StreamNumber\nmsf_stream_alloc_ex(MSF_Context *msf, MSF_UInt size)\n{\n  MSF_StreamNode *node = msf_stream_alloc_(msf->arena, &msf->sectab);\n  MSF_Stream *stream = &node->data;\n  msf_stream_resize_ex(msf, stream, size);\n  return stream->sn;\n}\n\ninternal MSF_StreamNumber\nmsf_stream_alloc(MSF_Context *msf)\n{\n  return msf_stream_alloc_ex(msf, 0);\n}\n\ninternal B32\nmsf_stream_resize_ex(MSF_Context *msf, MSF_Stream *stream, MSF_UInt size)\n{\n  MSF_UInt new_page_count = msf_count_pages(msf->page_size, size);\n  MSF_UInt cur_page_count = stream->page_list.count;\n  \n  if (new_page_count > cur_page_count) {\n    MSF_UInt alloc_count = new_page_count - cur_page_count;\n    MSF_PageList page_list = msf_alloc_pages(msf, alloc_count);\n    msf_page_list_concat_in_place(&stream->page_list, &page_list);\n  } else {\n    MSF_PageList free_page_list = {0};\n    for (MSF_UInt i = cur_page_count; i > new_page_count; i -= 1) {\n      MSF_PageNode *page_node = msf_page_list_pop_last(&stream->page_list);\n      msf_page_list_push_node(&free_page_list, page_node);\n    }\n    msf_free_pages(msf, &free_page_list);\n  }\n  \n  // update stream\n  stream->size = Min(stream->size, stream->page_list.count * msf->page_size);\n  stream->pos = Min(stream->pos, stream->size);\n  stream->pos_page = 0;\n\n  return 1;\n}\n\ninternal B32\nmsf_stream_resize(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_size)\n{\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  B32 is_resized = 0;\n  if (stream) {\n    is_resized = msf_stream_resize_ex(msf, stream, new_size);\n  }\n  return is_resized;\n}\n\ninternal B32\nmsf_stream_free(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  B32 is_free_ok = 0;\n  MSF_StreamNode *stream_node = msf_find_stream_node(msf, sn);\n  if (stream_node) {\n    msf_stream_list_remove(&msf->sectab, stream_node);\n    msf_stream_resize_ex(msf, &stream_node->data, 0);\n    stream_node->data.size = MSF_DELETED_STREAM_STAMP;\n    is_free_ok = 1;\n  }\n  return is_free_ok;\n}\n\ninternal void\nmsf_stream_set_size(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt size)\n{\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  if (stream) {\n    stream->size = Min(size, stream->page_list.count * msf->page_size);\n  } else {\n    Assert(!\"invalid stream number\");\n  }\n}\n\ninternal MSF_UInt\nmsf_stream_get_size(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_UInt size = MSF_UINT_MAX;\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  if (stream) {\n    size = stream->size;\n  }\n  return size;\n}\n\ninternal MSF_UInt\nmsf_stream_get_cap__(MSF_Context *msf, MSF_Stream *stream)\n{\n  return stream->page_list.count * msf->page_size;\n}\n\ninternal MSF_UInt\nmsf_stream_get_cap(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  MSF_UInt cap = 0;\n  if (stream) {\n    cap = msf_stream_get_cap__(msf, stream);\n  }\n  return cap;\n}\n\ninternal MSF_UInt\nmsf_stream_get_pos__(MSF_Context *msf, MSF_Stream *stream)\n{\n  return stream->pos;\n}\n\ninternal MSF_UInt\nmsf_stream_get_pos(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  MSF_UInt pos = MSF_UINT_MAX;\n  if (stream) {\n    pos = msf_stream_get_pos__(msf, stream);\n  }\n  return pos;\n}\n\ninternal B32\nmsf_stream_seek__(MSF_Context *msf, MSF_Stream *stream, MSF_UInt new_pos) \n{ (void)msf;\n  stream->pos = Min(new_pos, stream->size);\n  stream->pos_page = 0;\n  return 1;\n}\n\ninternal B32 \nmsf_stream_seek(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_pos)\n{\n  B32 is_seek_ok = 0;\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  if (stream) {\n    is_seek_ok = msf_stream_seek__(msf, stream, new_pos);\n  } else {\n    Assert(!\"failed to stream seek\");\n  }\n  return is_seek_ok;\n}\n\ninternal B32\nmsf_stream_seek_start(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  return msf_stream_seek(msf, sn, 0);\n}\n\ninternal B32\nmsf_stream_seek_end(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_UInt end = msf_stream_get_size(msf, sn);\n  return msf_stream_seek(msf, sn, end);\n}\n\n\ninternal B32 \nmsf_stream_write__(MSF_Context *msf, MSF_Stream *stream, void *buffer, MSF_UInt buffer_size)\n{\n  B32 is_write_ok = 0;\n\n  // are we writing over limit?\n  Assert((U64)stream->pos + (U64)buffer_size <= (U64)MSF_UINT_MAX);\n  \n  // make sure we have enough space to write buffer\n  MSF_UInt stream_cap = msf_stream_get_cap__(msf, stream);\n  MSF_UInt stream_pos_opl = stream->pos + buffer_size;\n  B32 grow_stream = stream_pos_opl > stream_cap;\n  if (grow_stream) {\n    B32 is_resize_ok = msf_stream_resize_ex(msf, stream, stream_pos_opl);\n    if (!is_resize_ok) {\n      goto exit;\n    }\n  }\n  \n  if (buffer) {\n    // lookup page for current stream position\n    if (!stream->pos_page) {\n      MSF_UInt page_idx = stream->pos / msf->page_size;\n      stream->pos_page = msf_page_from_index(stream->page_list, page_idx);\n    }\n  \n    // make write\n    is_write_ok = msf_write__(msf->page_data_list, msf->page_size, &stream->pos_page, &stream->pos, buffer, buffer_size);\n  } else {\n    stream->pos += buffer_size;\n    stream->pos_page = 0;\n    is_write_ok = 1;\n  }\n  \n  // update stream size\n  stream->size = Max(stream->size, stream->pos);\n\nexit:;\n  Assert(is_write_ok);\n  return is_write_ok;\n}\n\ninternal MSF_UInt\nmsf_stream_reserve__(MSF_Context *msf, MSF_Stream *stream, MSF_UInt res)\n{\n  ProfBeginV(\"MSF Reserve %m\", res);\n  \n  B32 is_ok = 1;\n\n  MSF_UInt cap = msf_stream_get_cap__(msf, stream);\n  MSF_UInt pos = msf_stream_get_pos__(msf, stream);\n  MSF_UInt cur = cap - pos;\n\n  if (cur < res) {\n    is_ok = msf_stream_write__(msf, stream, 0, res);\n    AssertAlways(is_ok);\n\n    is_ok = msf_stream_seek__(msf, stream, pos);\n    AssertAlways(is_ok);\n  }\n\n  ProfEnd();\n  return is_ok;\n} \n\ninternal B32\nmsf_stream_reserve(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt res)\n{\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  B32 is_res_ok = 0;\n  if (stream) {\n    is_res_ok = msf_stream_reserve__(msf, stream, res);\n  }\n  return is_res_ok;\n}\n\ninternal B32 \nmsf_stream_write(MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size)\n{\n  B32 is_write_ok = 0;\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  if (stream) {\n    is_write_ok = msf_stream_write__(msf, stream, buffer, buffer_size);\n  }\n  return is_write_ok;\n}\n\ninternal B32\nmsf_stream_write_string(MSF_Context *msf, MSF_StreamNumber sn, String8 string)\n{\n  return msf_stream_write(msf, sn, string.str, string.size);\n}\n\ninternal B32\nmsf_stream_write_list(MSF_Context *msf, MSF_StreamNumber sn, String8List list)\n{\n  B32 is_write_ok = 0;\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  if (stream) {\n    for (String8Node *node = list.first; node != 0; node = node->next) {\n      is_write_ok = msf_stream_write__(msf, stream, node->string.str, node->string.size);\n      if (!is_write_ok) {\n        break;\n      }\n    }\n  }\n  return is_write_ok;\n}\n\ninternal B32 \nmsf_stream_write_uint(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt value)\n{\n  return msf_stream_write_struct(msf, sn, &value);\n}\n\ninternal B32\nmsf_stream_write_cstr(MSF_Context *msf, MSF_StreamNumber sn, String8 string)\n{\n  B32 is_string_written = msf_stream_write_string(msf, sn, string);\n  B32 is_null_written = msf_stream_write(msf, sn, 0, 1);\n  return is_string_written && is_null_written;\n}\n\ninternal B32\nmsf_stream_write_u8(MSF_Context *msf, MSF_StreamNumber sn, U8 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_u16(MSF_Context *msf, MSF_StreamNumber sn, U16 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_u32(MSF_Context *msf, MSF_StreamNumber sn, U32 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_u64(MSF_Context *msf, MSF_StreamNumber sn, U64 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_s8(MSF_Context *msf, MSF_StreamNumber sn, S8 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_s16(MSF_Context *msf, MSF_StreamNumber sn, S16 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_s32(MSF_Context *msf, MSF_StreamNumber sn, S32 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal B32\nmsf_stream_write_s64(MSF_Context *msf, MSF_StreamNumber sn, S64 value)\n{\n  return msf_stream_write(msf, sn, &value, sizeof(value));\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(msf_write_task)\n{\n  ProfBeginFunction();\n  MSF_WriteTask *task = raw_task;\n\n  Rng1U64  range    = task->range_arr[task_id];\n  String8  data     = str8_substr(task->data, range);\n  MSF_UInt data_pos = range.min + task->stream_pos;\n\n  MSF_UInt      page_idx = data_pos / task->page_size;\n  MSF_PageNode *page     = msf_page_from_index(task->page_list, page_idx);\n\n  if (!msf_write__(task->page_data_list, task->page_size, &page, &data_pos, data.str, data.size)) {\n    InvalidPath;\n  }\n  ProfEnd();\n}\n\ninternal B32\nmsf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size)\n{\n  ProfBeginV(\"MSF Write Parallel %m\", buffer_size);\n\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n\n  B32 is_write_ok = msf_stream_reserve__(msf, stream, buffer_size);\n\n  if (is_write_ok) {\n    U64 expected_pos = stream->pos + buffer_size;\n\n    U64 pre_size = Min(AlignPadPow2(stream->pos, msf->page_size), buffer_size);\n    U64 mid_size = AlignDownPow2(buffer_size - pre_size, msf->page_size);\n    U64 end_size = buffer_size - (pre_size + mid_size);\n\n    U8 *pre_ptr = (U8*)buffer;\n    U8 *mid_ptr = (U8*)buffer + pre_size;\n    U8 *end_ptr = (U8*)buffer + pre_size + mid_size;\n\n    ProfBeginV(\"Write Buffer Pre %M\", pre_size);\n    B32 is_pre_written = msf_stream_write__(msf, stream, pre_ptr, pre_size);\n    AssertAlways(is_pre_written);\n    ProfEnd();\n\n    // write buffer mid\n    if (mid_size > 0) {\n\t  Temp scratch = scratch_begin(0,0);\n\t  \n      Assert(stream->pos % msf->page_size == 0);\n      Assert(mid_size % msf->page_size == 0);\n\n      MSF_WriteTask task;\n      task.page_size      = msf->page_size;\n      task.page_data_list = msf->page_data_list;\n      task.page_list      = stream->page_list;\n      task.stream_pos     = stream->pos;\n      task.data           = str8(mid_ptr, mid_size);\n      task.range_arr      = tp_divide_work(scratch.arena, mid_size, tp->worker_count);\n      tp_for_parallel(tp, 0, tp->worker_count, msf_write_task, &task);\n\n      // we rely on low-level msf_write__ to copy bytes which doesn't advance stream pos\n      U64 after_mid = stream->pos + mid_size;\n      B32 is_seek_ok = msf_stream_seek__(msf, stream, after_mid);\n      AssertAlways(is_seek_ok);\n\t  \n      scratch_end(scratch);\n    }\n\n    ProfBeginV(\"Write Buffer End %M\", end_size);\n    B32 is_end_ok = msf_stream_write__(msf, stream, end_ptr, end_size);\n    AssertAlways(is_end_ok);\n    ProfEnd();\n\n    // did we write bytes correctly?\n    AssertAlways(stream->pos == expected_pos);\n  }\n\n  ProfEnd();\n  return is_write_ok;\n}\n\ninternal B32\nmsf_stream_write_string_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, String8 string)\n{\n  return msf_stream_write_parallel(tp, msf, sn, string.str, string.size);\n}\n\n////////////////////////////////\n\ninternal MSF_UInt\nmsf_stream_read__(MSF_Context *msf, MSF_Stream *stream, void *buffer, MSF_UInt buffer_size)\n{\n  // are we reading over limit?\n  Assert((U64)stream->pos + (U64)buffer_size <= (U64)MSF_UINT_MAX);\n  \n  // lookup page for current stream position\n  if (!stream->pos_page) {\n    MSF_UInt pos_page_idx = stream->pos / msf->page_size;\n    stream->pos_page = msf_page_from_index(stream->page_list, pos_page_idx);\n  }\n  \n  MSF_UInt bytes_read = msf_read__(msf->page_data_list, msf->page_size, &stream->pos_page, &stream->pos, buffer, buffer_size);\n  return bytes_read;\n}\n\ninternal MSF_UInt\nmsf_stream_read(MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size)\n{\n  MSF_Stream *stream = msf_find_stream(msf, sn);\n  if (stream) {\n    return msf_stream_read__(msf, stream, buffer, buffer_size);\n  }\n  return 0;\n}\n\ninternal S8\nmsf_stream_read_s8(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  S8 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal S16\nmsf_stream_read_s16(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  S16 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal S32\nmsf_stream_read_s32(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  S32 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal S64\nmsf_stream_read_s64(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  S64 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal U8\nmsf_stream_read_u8(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  U8 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal U16\nmsf_stream_read_u16(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  U16 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal U32\nmsf_stream_read_u32(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  U32 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal U64\nmsf_stream_read_u64(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  U64 result = 0;\n  msf_stream_read_struct(msf, sn, &result);\n  return result;\n}\n\ninternal String8\nmsf_stream_read_block(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U64 block_size)\n{\n  U8 *block_buffer = push_array(arena, U8, block_size);\n  MSF_UInt block_read = msf_stream_read(msf, sn, block_buffer, block_size);\n  Assert((U64)block_read == block_size);\n  String8 block = str8(block_buffer, block_size);\n  return block;\n}\n\ninternal String8\nmsf_stream_read_string(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_UInt start_pos = msf_stream_get_pos(msf, sn);\n  U64 size = 0;\n  for (;; size += 1) {\n    U8 cp = msf_stream_read_u8(msf, sn);\n    if (cp == 0) {\n      break;\n    }\n  }\n  \n  msf_stream_seek(msf, sn, start_pos);\n  String8 string = msf_stream_read_block(arena, msf, sn, size);\n  msf_stream_seek(msf, sn, start_pos + size + 1); // skip null\n\n  return string;\n}\n\ninternal void \nmsf_stream_align(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt align)\n{\n  MSF_UInt pos = msf_stream_get_pos(msf, sn);\n  MSF_UInt pos_aligned = AlignPow2(pos, align);\n  msf_stream_seek(msf, sn, pos_aligned);\n}\n\n////////////////////////////////\n\ninternal MSF_Context * \nmsf_alloc__(MSF_UInt page_size, MSF_PageNumber active_fpm)\n{\n  ProfBeginFunction();\n  Assert(active_fpm == MSF_FPM0 || active_fpm == MSF_FPM1);\n  Assert(IsPow2(page_size));\n  \n  Arena *arena = arena_alloc();\n  \n  MSF_Context *msf = push_array(arena, MSF_Context, 1);\n  msf->arena = arena;\n  msf->page_size = page_size;\n  msf->active_fpm = active_fpm;\n  \n  ProfEnd();\n  return msf;\n}\n\ninternal MSF_Context *\nmsf_alloc(MSF_UInt page_size, MSF_UInt active_fpm)\n{\n  MSF_Context *msf = msf_alloc__(page_size, active_fpm);\n  \n  // reserve first page for header\n  msf->header_page_list = msf_alloc_pages(msf, 1);\n  Assert(msf->header_page_list.count > 0);\n  Assert(msf->header_page_list.first->pn == 0);\n  \n  // reserve root page close to start of the file so we don't have to seek too far (not required)\n  msf->root_page_list = msf_alloc_pages(msf, 1);\n  Assert(msf->root_page_list.count == 1);\n  Assert(msf->root_page_list.first->pn == 3);\n  \n  return msf;\n}\n\ninternal MSF_StreamNode * \nmsf_find_stream_node(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_StreamNode *node;\n  for (node = msf->sectab.first; node != 0; node = node->next) {\n    if (node->data.sn == sn) {\n      break;\n    }\n  }\n  return node;\n}\n\ninternal MSF_Stream *\nmsf_find_stream(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  MSF_StreamNode *node = msf_find_stream_node(msf, sn);\n  MSF_Stream *data = 0;\n  if (node) {\n    data = &node->data;\n  }\n  return data;\n}\n\ninternal MSF_Error\nmsf_open_header(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList *page_list)\n{\n  ProfBeginFunction();\n  msf_page_list_push_extant_page(arena, page_list, page_data_list, page_size, 0);\n  ProfEnd();\n  return MSF_Error_OK;\n}\n\ninternal MSF_Error\nmsf_open_root(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber root_pn, MSF_UInt stream_table_size, MSF_PageList *page_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  MSF_PageNumber st_page_count = msf_count_pages(page_size, stream_table_size);\n  MSF_UInt st_pn_size = sizeof(MSF_PageNumber) * st_page_count;\n  MSF_PageNumber root_pn_count = msf_count_pages(page_size, st_pn_size);\n  MSF_PageNumber *root_pn_arr = push_array(scratch.arena, MSF_PageNumber, root_pn_count);\n  for (MSF_UInt i = 0; i < root_pn_count; i += 1) {\n    root_pn_arr[i] = root_pn + i;\n  }\n  msf_page_list_push_extant_page_arr(arena, page_list, page_data_list, page_size, root_pn_arr, root_pn_count);\n  scratch_end(scratch);\n  ProfEnd();\n  return MSF_Error_OK;\n}\n\ninternal MSF_Error\nmsf_open_stream_table_page_list(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList root_page_list, MSF_UInt stream_table_size, MSF_PageList *page_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  MSF_Error error = MSF_Error_OK; \n  MSF_UInt st_pn_count = msf_count_pages(page_size, stream_table_size);\n  MSF_UInt st_pn_size = st_pn_count * sizeof(MSF_PageNumber);\n  MSF_PageNumber *st_pn_arr = push_array(scratch.arena, MSF_PageNumber, st_pn_count);\n  MSF_UInt st_pn_read_size = msf_read(page_data_list, page_size, root_page_list, 0, st_pn_arr, st_pn_size);\n  if (st_pn_read_size == st_pn_size) {\n    msf_page_list_push_extant_page_arr(arena, page_list, page_data_list, page_size, st_pn_arr, st_pn_count);\n  } else {\n    error = MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS; \n  }\n  scratch_end(scratch);\n  ProfEnd();\n  return error;\n}\n\ninternal MSF_Error\nmsf_open_stream_table(Arena *arena, MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList st_page_list, MSF_UInt stream_table_size, MSF_StreamList *stream_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  MSF_Error error = MSF_Error_OK;\n  \n  // read out entire stream table\n  U8 *st_buffer = push_array(scratch.arena, U8, stream_table_size);\n  MSF_UInt st_read_size = msf_read(page_data_list, page_size, st_page_list, 0, st_buffer, stream_table_size);\n  if (st_read_size != stream_table_size) {\n    error = MSF_OpenError_INVALID_STREAM_TABLE;\n    goto exit;\n  }\n  \n  // setup buffer reader\n  String8 st_data = str8(st_buffer, st_read_size);\n  U64 st_cursor = 0;\n  \n  MSF_UInt stream_count = 0;\n  st_cursor += str8_deserial_read_struct(st_data, st_cursor, &stream_count);\n  \n  // stream count is a 32-bit but stream number is 16-bit?!\n  if (stream_count > MSF_STREAM_NUMBER_MAX) {\n    error = MSF_OpenError_STREAM_COUNT_OVERFLOW;\n    goto exit;\n  }\n  \n  // is there enoguh bytes to read streams sizes?\n  U64 size_arr_end = st_cursor + (U64)stream_count * sizeof(MSF_UInt);\n  if (size_arr_end > st_data.size) {\n    error = MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES;\n    goto exit;\n  }\n  \n  // make pointer to stream sizes array\n  MSF_UInt *stream_size_arr = (MSF_UInt*)(st_buffer + st_cursor);\n  st_cursor += sizeof(stream_size_arr[0]) * stream_count;\n  \n  U64 arena_pos_before_stream_allocations = arena_pos(arena);\n  \n  // open streams\n  for (MSF_UInt stream_idx = 0; stream_idx < stream_count; stream_idx += 1) {\n    MSF_UInt stream_size = stream_size_arr[stream_idx];\n    B32 is_present = stream_size != MSF_DELETED_STREAM_STAMP;\n    if (is_present) {\n      MSF_PageNumber pn_count = msf_count_pages(page_size, stream_size);\n      \n      // is there enough bytes in buffer to build stream page list?\n      MSF_UInt st_pn_end = st_cursor + pn_count * sizeof(MSF_PageNumber);\n      if (st_pn_end > stream_table_size) {\n        break;\n      }\n      \n      // setup page number array\n      MSF_PageNumber *pn_arr = (MSF_PageNumber*)(st_buffer + st_cursor);\n      st_cursor += sizeof(pn_arr[0]) * pn_count;\n      \n      // build stream page list\n      MSF_PageList page_list = {0};\n      msf_page_list_push_extant_page_arr(arena, &page_list, page_data_list, page_size, pn_arr, pn_count);\n      \n      // alloc stream with opened pages\n      MSF_StreamNode *stream_node = msf_stream_alloc_(arena, stream_list);\n      stream_node->data.size = stream_size;\n      stream_node->data.page_list = page_list;\n    }\n    // stream was deleted but slot was kept to be reused in subsequent allocations\n    else {\n      MSF_StreamNode *stream_node = msf_stream_alloc_(arena, stream_list);\n      stream_node->data.size = stream_size;\n    }\n  }\n  \n  if (stream_list->count != stream_count) {\n    arena_pop_to(arena, arena_pos_before_stream_allocations);\n    error = MSF_OpenError_INVALID_STREAM_TABLE;\n    goto exit;\n  }\n  \nexit:;\n  scratch_end(scratch);\n  ProfEnd();\n  return error;\n}\n\ninternal MSF_Error\nmsf_open(String8 data, MSF_Context **msf_out)\n{\n  ProfBeginFunction();\n\n  MSF_Error error = MSF_Error_OK;\n  MSF_Context *msf = 0;\n  MSF_PageDataList page_data_list = {0};\n\n  // are there enough bytes for header?\n  if (sizeof(MSF_Header70) > data.size) {\n    error = MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER;\n    goto exit;\n  }\n  \n  // is this MSF 7.0?\n  MSF_Header70 *header = (MSF_Header70*)data.str;\n  if (MemoryCompare(header->magic, msf_msf70_magic, sizeof(msf_msf70_magic)) != 0) {\n    error = MSF_OpenError_INVALID_MAGIC; \n    goto exit;\n  }\n  \n  // validate page size\n  if (!IsPow2(header->page_size)) {\n    error = MSF_OpenError_PAGE_SIZE_IS_NOT_POW2;\n    goto exit;\n  }\n  \n  // validate page count\n  MSF_UInt file_page_count = msf_count_pages(header->page_size, data.size);\n  if (file_page_count != header->page_count) {\n    error = MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE;\n    goto exit;\n  }\n  \n  // validate FPM\n  if (header->page_size < MSF_MIN_PAGE_SIZE) {\n    error = MSF_OpenError_INVALID_PAGE_SIZE;\n    goto exit;\n  }\n  if (header->page_size > MSF_MAX_PAGE_SIZE) {\n    error = MSF_OpenError_INVALID_PAGE_SIZE;\n    goto exit;\n  }\n  \n  // is there enough bytes to initialize PDB?\n  MSF_UInt check_size = header->page_size*3 + header->stream_table_size;\n  if (check_size > data.size) { \n    error = MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT;\n    goto exit;\n  }\n  \n  // validate FPM\n  if (header->active_fpm != MSF_FPM0 && header->active_fpm != MSF_FPM1) {\n    error = MSF_OpenError_INVALID_ACTIVE_FPM;\n    goto exit;\n  }\n  \n  // is there enough bytes to initialize root stream?\n  MSF_UInt root_pn_offset = OffsetOf(MSF_Header70, root_pn);\n  if (root_pn_offset + header->stream_table_size > data.size) {\n    error = MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER;\n    goto exit;\n  }\n  \n  // validate root directory\n  MSF_UInt root_directory_page_count = msf_count_pages(header->page_size, header->stream_table_size);\n  MSF_UInt root_directory_max_page_count = header->page_size / sizeof(MSF_UInt);\n  if (root_directory_page_count > root_directory_max_page_count) {\n    error = MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES;\n    goto exit;\n  }\n\n  // allocate MSF context and don't reserve special pages\n  msf = msf_alloc__(header->page_size, header->active_fpm);\n  \n  // divide data into fixed size nodes (with 4KB page each node is 128MB)\n  msf_set_page_data_list(msf->arena, &page_data_list, header->page_size, data);\n  \n  do {\n    MSF_PageList header_page_list = {0};\n    error = msf_open_header(msf->arena, page_data_list, header->page_size, &header_page_list);\n    if (error != MSF_Error_OK) {\n      break;\n    }\n    \n    MSF_PageList root_page_list = {0};\n    error = msf_open_root(msf->arena, page_data_list, header->page_size, header->root_pn, header->stream_table_size, &root_page_list);\n    if (error != MSF_Error_OK) { \n      break;\n    }\n    \n    MSF_PageList st_page_list = {0};\n    error = msf_open_stream_table_page_list(msf->arena, page_data_list, header->page_size, root_page_list, header->stream_table_size, &st_page_list);\n    if (error != MSF_Error_OK) {\n      break;\n    }\n    \n    MSF_StreamList stream_list = {0};\n    error = msf_open_stream_table(msf->arena, page_data_list, header->page_size, st_page_list, header->stream_table_size, &stream_list);\n    if (error != MSF_Error_OK) {\n      break;\n    }\n    \n    Assert(msf->page_size == header->page_size);\n    Assert(msf->active_fpm == header->active_fpm);\n    msf->page_count       = header->page_count;\n    msf->page_data_list   = page_data_list;\n    msf->header_page_list = header_page_list;\n    msf->root_page_list   = root_page_list;\n    msf->st_page_list     = st_page_list;\n    msf->sectab               = stream_list;\n    \n    *msf_out = msf;\n    \n#if LNK_PARANOID\n    msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, header_page_list, MSF_PAGE_STATE_ALLOC);\n    msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, root_page_list, MSF_PAGE_STATE_ALLOC);\n    msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, st_page_list, MSF_PAGE_STATE_ALLOC);\n    for (MSF_StreamNode *stream_node = stream_list.first; stream_node != 0; stream_node = stream_node->next) {\n      msf_check_fpm_bits_for_page_list(page_data_list, msf->page_size, msf->active_fpm, stream_node->data.page_list, MSF_PAGE_STATE_ALLOC);\n    }\n#endif\n  } while(0);\n  \nexit:;\n  if (error != MSF_Error_OK) {\n    if (msf) {\n      msf_release(&msf);\n    }\n  }\n\n  ProfEnd();\n  return error;\n}\n\ninternal void\nmsf_release(MSF_Context **msf_ptr)\n{\n  arena_release((*msf_ptr)->arena);\n  *msf_ptr = 0;\n}\n\ninternal String8List\nmsf_build_stream_table_data(Arena *arena, MSF_StreamList *sectab, MSF_UInt page_size, MSF_UInt page_count)\n{\n  ProfBeginFunction();\n  \n  MSF_UInt *stream_count_ptr = push_array(arena, MSF_UInt, 1);\n  *stream_count_ptr = sectab->count;\n\n  MSF_UInt *stream_size_arr = push_array(arena, MSF_UInt, sectab->count);\n  MSF_UInt stream_page_count = 0;\n\n  MSF_PageNumber *stream_pages_arr = push_array(arena, MSF_PageNumber, page_count);\n\n  for (MSF_StreamNode *stream_node = sectab->first; stream_node != 0; stream_node = stream_node->next) {\n    MSF_Stream *stream = &stream_node->data;\n    \n    // is page list correct?\n    MSF_UInt expected_stream_page_count = msf_count_pages(page_size, stream->size);\n    if (expected_stream_page_count > stream->page_list.count) {\n      Assert(!\"invalid page list \");\n    }\n    \n    // store stream sizes\n    stream_size_arr[stream->sn] = stream->size;\n    \n    // store stream pages\n    for (MSF_PageNode *page_node = stream->page_list.first; page_node != 0; page_node = page_node->next) {\n      // first three pages are reserved for header, FPM0, and FPM1\n      Assert(page_node->pn > 2); \n      \n      // it's not necessarily a bug to use interval FPM pages,\n      // but for sake of correctness make sure there is no stream\n      // aside from FPM that uses these pages\n      //\n      // also, actual FPM pages should be asserted on: pn % (msf->page_size * MSF_BITS_PER_CHAR)\n      Assert((page_node->pn % page_size) != 1);\n      Assert((page_node->pn % page_size) != 2);\n      \n      // is there a stream with too many page nodes?\n      Assert(stream_page_count < page_count);\n      \n      // is this page number allocated?\n      //Assert(msf_get_fpm_page_bit_state(msf, page_node->pn) == MSF_PAGE_STATE_ALLOC);\n      \n      stream_pages_arr[stream_page_count] = page_node->pn;\n      stream_page_count += 1;\n    }\n  }\n  \n  // on disk stream table:\n  //  MSF_UInt stream_count;\n  //  MSF_UInt stream_size[stream_count];\n  //  MSF_PageNumber pages[stream_count][*];\n  String8List st_data_list = {0};\n  str8_list_push(arena, &st_data_list, str8((U8*)stream_count_ptr, sizeof(*stream_count_ptr)));\n  str8_list_push(arena, &st_data_list, str8((U8*)stream_size_arr, sizeof(*stream_size_arr) * (*stream_count_ptr)));\n  str8_list_push(arena, &st_data_list, str8((U8*)stream_pages_arr, sizeof(*stream_pages_arr) * stream_page_count));\n  \n  ProfEnd();\n  return st_data_list;\n}\n\ninternal MSF_Error\nmsf_build_stream_table(MSF_Context *msf, MSF_UInt *stream_table_size_out)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n\n  MSF_Error error = MSF_Error_OK;\n  \n  String8List st_data_list = msf_build_stream_table_data(scratch.arena, &msf->sectab, msf->page_size, msf->page_count);\n  \n  MSF_UInt st_page_count = msf_count_pages(msf->page_size, st_data_list.total_size);\n  msf_free_pages(msf, &msf->st_page_list); // TODO: page reuse\n  msf->st_page_list = msf_alloc_pages(msf, st_page_count);\n  \n  MSF_UInt cursor = 0;\n  for (String8Node *node = st_data_list.first; node != 0; node = node->next) {\n    B32 is_data_written = msf_write(msf->page_data_list, msf->page_size, msf->st_page_list, cursor, node->string.str, node->string.size);\n    if (!is_data_written) {\n      error = MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE;\n      goto exit;\n    }\n    cursor += node->string.size;\n  }\n  \n  *stream_table_size_out = st_data_list.total_size;\n  \n  exit:;\n  scratch_end(scratch);\n  ProfEnd();\n  return error;\n}\n\ninternal MSF_Error\nmsf_build_root_directory(MSF_Context *msf)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n\n  MSF_Error error = MSF_Error_OK;\n  \n  // MS impl doesn't handle root directory with page count above 1.\n  MSF_UInt max_page_count_in_root_directory = msf->page_size / sizeof(MSF_PageNumber);\n  if (msf->st_page_list.count > max_page_count_in_root_directory) {\n    error = MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES;\n    goto exit;\n  }\n  \n  // collect stream table page numbers\n  MSF_PageNumber *pn_arr = push_array(scratch.arena, MSF_PageNumber, msf->st_page_list.count);\n  MSF_UInt pn_count = 0;\n  for (MSF_PageNode *page = msf->st_page_list.first; page != 0; page = page->next) {\n    pn_arr[pn_count++] = page->pn;\n  }\n  \n  MSF_UInt root_page_count = msf_count_pages(msf->page_size, pn_count * sizeof(pn_arr[0]));\n  Assert(root_page_count == 1);\n  \n  msf_free_pages(msf, &msf->root_page_list); // TODO: page reuse\n  msf->root_page_list = msf_alloc_pages(msf, root_page_count);\n  B32 is_root_written = msf_write(msf->page_data_list, msf->page_size, msf->root_page_list, 0, pn_arr, sizeof(pn_arr[0]) * pn_count);\n  if (!is_root_written) {\n    error = MSF_BuildError_UNABLE_TO_WRITE_ROOT_DIRECTORY;\n    goto exit;\n  }\n  \nexit:;\n  scratch_end(scratch);\n  ProfEnd();\n  return error;\n}\n\ninternal MSF_Error\nmsf_build_header(MSF_Context *msf, MSF_UInt stream_table_size)\n{\n  ProfBeginFunction();\n  MSF_Error error = MSF_Error_OK;\n  \n  MSF_Header70 header;\n  MemoryCopy(&header.magic[0], &msf_msf70_magic[0], sizeof(msf_msf70_magic));\n  header.page_size         = msf->page_size;\n  header.active_fpm        = msf->active_fpm;\n  header.page_count        = msf->page_count;\n  header.stream_table_size = stream_table_size;\n  header.unknown           = 0;\n  header.root_pn           = msf->root_page_list.first->pn;\n  \n  B32 is_header_written = msf_write(msf->page_data_list, msf->page_size, msf->header_page_list, 0, &header, sizeof(header));\n  if (!is_header_written) {\n    error = MSF_BuildError_UNABLE_TO_WRITE_HEADER;\n    goto exit;\n  }\n  \n  exit:;\n  ProfEnd();\n  return error;\n}\n\ninternal MSF_Error \nmsf_build(MSF_Context *msf)\n{\n  ProfBeginFunction();\n  \n  MSF_Error err;\n  do {\n    MSF_UInt stream_table_size;\n    err = msf_build_stream_table(msf, &stream_table_size);\n    if (err != MSF_Error_OK) {\n      break;\n    }\n    \n    err = msf_build_root_directory(msf);\n    if (err != MSF_Error_OK) {\n      break;\n    }\n    \n    err = msf_build_header(msf, stream_table_size);\n    if (err != MSF_Error_OK) {\n      break;\n    }\n  } while (0);\n\n  ProfEnd();\n  return err;\n}\n\ninternal String8List\nmsf_get_page_data_nodes(Arena *arena, MSF_Context *msf)\n{\n  String8List list; MemoryZeroStruct(&list);\n\n  U64 total_size = msf_get_save_size(msf);\n  U64 bytes_left = total_size;\n  U64 node_size = msf_get_data_node_size(msf->page_size);\n\n  for (MSF_PageDataNode *data_node = msf->page_data_list.first; data_node != 0; data_node = data_node->next) {\n    // compute byte count for the node\n    U64 to_copy = Min(bytes_left, node_size);\n    bytes_left -= to_copy;\n\n    String8 data = str8(data_node->data, to_copy);\n    str8_list_push(arena, &list, data);\n  }\n  return list;\n}\n\ninternal U64\nmsf_get_save_size(MSF_Context *msf)\n{\n#if 0\n  MSF_PageNumber max_pn = msf_find_max_pn(msf->page_data_list, msf->page_size);\n  U64 size = ((U64)max_pn + 1) * (U64)msf->page_size;\n  Assert(msf_count_pages(size, msf->page_size) == msf->page_count);\n#else\n  U64 size = (U64)msf->page_count * msf->page_size;\n#endif\n  return size;\n}\n\ninternal B32\nmsf_save(MSF_Context *msf, void *buffer, U64 buffer_size)\n{\n  ProfBeginFunction();\n\n  U64 node_size = msf_get_data_node_size(msf->page_size);\n  U64 cursor = 0;\n\n  for (MSF_PageDataNode *node = msf->page_data_list.first; node != 0; node = node->next) {\n    // compute byte count for the copy\n    U64 bytes_in_buffer = buffer_size - cursor;\n    U64 to_copy = Min(bytes_in_buffer, node_size);\n\n    // copy MSF bytes to output buffer\n    U8 *dst = (U8 *)buffer + cursor;\n    U8 *src = node->data;\n    MemoryCopy(dst, src, to_copy);\n\n    // advance cursor\n    cursor += to_copy;\n\n    // is output buffer full?\n    if (to_copy == 0) {\n      break;\n    }\n  }\n\n  B32 is_save_ok = (cursor == buffer_size);\n  Assert(is_save_ok);\n\n  ProfEnd();\n  return is_save_ok;\n}\n\ninternal MSF_Error\nmsf_save_arena(Arena *arena, MSF_Context *msf, String8 *data_out)\n{\n  ProfBeginFunction();\n  MSF_Error err = msf_build(msf);\n  if (err == MSF_Error_OK) {\n    U64 buffer_size = msf_get_save_size(msf);\n    U8 *buffer = push_array(arena, U8, buffer_size);\n    B32 is_saved = msf_save(msf, buffer, buffer_size);\n    if (is_saved) {\n      *data_out = str8(buffer, buffer_size);\n    } else {\n      arena_pop(arena, buffer_size);\n    }\n  }\n  ProfEnd();\n  return err;\n}\n\ninternal char *\nmsf_error_to_string(MSF_Error code)\n{\n  char *str = \"\";\n  switch (code) {\n    case MSF_Error_OK: break;\n    \n    case MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES: str = \"stream table exceeds page limit\"; break;\n    \n    case MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER:           str = \"input does not have enough bytes to read header\";  break;\n    case MSF_OpenError_INVALID_MAGIC:                             str = \"magic value does not match\";                       break;\n    case MSF_OpenError_PAGE_SIZE_IS_NOT_POW2:                     str = \"page size is not power of two\";                    break;\n    case MSF_OpenError_INVALID_PAGE_SIZE:                         str = \"invalid page size\";                                break;\n    case MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT:                  str = \"not enough pages to initialize MSF\";               break;\n    case MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER:           str = \"invalid root stream page number\";                  break;\n    case MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS:  str = \"unable to read stream table's page numbers\";       break;\n    case MSF_OpenError_STREAM_COUNT_OVERFLOW:                     str = \"stream count is overflown\";                        break;\n    case MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES:               str = \"unable to read streams sizes\";                     break;\n    case MSF_OpenError_INVALID_STREAM_TABLE:                      str = \"invalid stream table\";                             break;\n    case MSF_OpenError_INVALID_ACTIVE_FPM:                        str = \"invalid active FPM\";                               break;\n    case MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE:         str = \"page count from MSF header does not match data page count\"; break;\n    \n    case MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE:                       str = \"unable to write stream table\";                       break;\n    case MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE_PAGE_NUMBER_DIRECTORY: str = \"unable to write stream table page number directory\"; break;\n    case MSF_BuildError_UNABLE_TO_WRITE_ROOT_DIRECTORY:                     str = \"unable to write root directory\";                     break;\n    case MSF_BuildError_UNABLE_TO_WRITE_HEADER:                             str = \"unable to write header\";                             break;\n  }\n  \n  return str;\n}\n\n////////////////////////////////\n\n/*\n   Multi-Stream-Format is a database type of format for storing debug info\n   but in principle can store anything you want. MSF divides file\n   into fixed-sized pages (default page size is 4KiB) and puts them\n   together into streams. A stream is made up from a non-contigous\n   number of pages and supports following operations: alloc, free, open, write, read.\n   Current MSF 7.0 allows creating up to 64K of streams, where each stream can potentially\n   contain 2GiB of data (assuming default page size).\n\n   Free Page Map assigns a bit to each page to indicate page alloc state. 0 = allocated and 1 = free.\n   FPM is alloced at fixed intervals of 'page_size * MSF_BITS_PER_CHAR'. At the begining of interval\n   two pages are reserved for status bits. The 'active_fpm' field in the MSF header tells which FPM page\n   is in use. On commit time MSF alternates between two pages, this way they support atomic read and write.\n\n   FPM Bug:\n    Let's say you have a MSF file with page size 0x1000 bytes, you can represent 0x1000 * 8 = 0x8000 pages\n    or 0x8000 * 0x1000 = 128MiB. And when file exceeds this size a new FPM group should be allocated\n    at page numbers 0x8001 and 0x8002. However, in MS impl there is a bug where they don't multiply\n    interval by 8 and each FPM group is allocated at intervals of page size or 0x1000, so each FPM group is placed\n    at page numbers 0x1001, 0x1002, 0x2001, 0x2002, and so on. This way MSF files end up allocating 8 times more pages.\n\n    Also, MS impl marks unused pages as allocated thus leaving them empty but LLVM repurposes them\n    for regular allocations and things work out fine because of the fact that MS computes correct\n    number of FPM pages when they save and load and the trailing pages aren't being touched: \n       https://github.com/microsoft/microsoft-pdb/blob/master/PDB/msf/msf.cpp#L2512\n\n   Root directory is a single paged stored as a page number in 'MSF_Header70.root_pn'. \n   The directory contains an array of page numbers needed to read the stream table. This is a late\n   addition introduced in version 7.0 that lets us have bigger stream tables. However, there is a limit\n   if stream table exceeds root directory, MSF becomes invalid. MS impl isn't\n   clear what should happen in this case, so we tried to contiguously allocate root pages\n   but VS and LLVM error out. In practice you can double page size to work around the limit.\n\nTODO: explain stream table\n\n */\n\n#if 0\n\ninternal void\nmsf_bytedump_stream(char *file_name, MSF_Context *msf, MSF_StreamNumber sn, U64 start, U64 byte_count)\n{\n  Temp scratch = scratch_begin(0, 0);\n  U64 pos = msf_stream_get_pos(msf, sn);\n  msf_stream_seek(msf, sn, start);\n  U64 buffer_size = byte_count;\n  U8 *buffer = push_array(scratch.arena, U8, buffer_size);\n  MSF_UInt read_size = msf_stream_read(msf, sn, buffer, buffer_size);\n  os_write_file(str8_cstring(file_name), str8(buffer, read_size));\n  msf_stream_seek(msf, sn, pos);\n  scratch_end(scratch);\n}\n\ninternal void\nmsf_hexdump_stream(FILE *file, MSF_Context *msf, MSF_StreamNumber sn, U64 start, U64 byte_count, U64 stride)\n{\n  Temp scratch = scratch_begin(0, 0);\n  U8 *row_buffer = push_array(scratch.arena, U8, stride);\n  U64 stream_size = msf_stream_get_size(msf, sn);\n  U64 cursor = start;\n  U64 end = Min(start + byte_count, stream_size);\n  while (cursor < stream_size) {\n    MSF_UInt read_size = msf_stream_read(msf, sn, row_buffer, stride);\n    \n    // print offset\n    fprintf(file, \"%04llX\", cursor);\n    \n    // print bytes\n    fprintf(file, \"    \");\n    for (U64 i = 0; i < read_size; i += 1) {\n      if (i > 0) {\n        fprintf(file, \" \");\n      }\n      fprintf(file, \"%02X\", row_buffer[i]);\n    }\n    \n    // print ascii\n    fprintf(file, \"    \");\n    for (U64 i = 0; i < read_size; i += 1) {\n      U8 print_char = row_buffer[i];\n      if (0x20 > print_char || print_char > 0x7E) {\n        print_char = '.';\n      }\n      fprintf(file, \"%c\", print_char);\n    }\n    \n    // row is done\n    fprintf(file, \"\\n\");\n    \n    cursor += stride;\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\nmsf_hexdump_stream_to_file(char *name, MSF_Context *msf, MSF_StreamNumber sn, U64 start, U64 byte_count, U64 stride)\n{\n  FILE *f = fopen(name, \"w\");\n  msf_hexdump_stream(f, msf, sn, start, byte_count, stride);\n  fclose(f);\n}\n\n#endif\n\n#if 0\ninternal void\ntest_msf_open_save(void)\n{\n  Temp scratch = scratch_begin(0, 0);\n  \n  U32 item0 = 123;\n  U32 item1 = 321;\n  \n  MSF_StreamNumber stream;\n  String8 data;\n  {\n    MSF_Context *msf = msf_alloc(MSF_DEFAULT_PAGE_SIZE, MSF_DEFAULT_FPM);\n    stream = msf_stream_alloc(msf);\n    msf_stream_write_u32(msf, stream, item0);\n    msf_stream_write_u32(msf, stream, item1);\n    data = msf_save_arena(scratch.arena, msf);\n    msf_release(&msf);\n  }\n  \n  String8 data1;\n  {\n    MSF_Context *msf = 0;\n    MSF_Error err = msf_open(data, &msf);\n    Assert(err == MSF_Error_OK);\n    U32 read0 = msf_stream_read_u32(msf, stream);\n    Assert(read0 == item0);\n    U32 read1 = msf_stream_read_u32(msf, stream);\n    Assert(read1 == item1);\n    data1 = msf_save_arena(scratch.arena, msf);\n    msf_release(&msf);\n  }\n  \n  {\n    MSF_Context *msf = 0;\n    MSF_Error err = msf_open(data, &msf);\n    Assert(err == MSF_Error_OK);\n    U32 read0 = msf_stream_read_u32(msf, stream);\n    Assert(read0 == item0);\n    U32 read1 = msf_stream_read_u32(msf, stream);\n    Assert(read1 == item1);\n    msf_release(&msf);\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ntest_size_limit(void)\n{\n  Temp scratch = scratch_begin(0, 0);\n  \n  MSF_Context *msf = msf_alloc(8192, MSF_DEFAULT_FPM);\n  Assert(msf);\n  \n  U64 c = (1 * 1024 * 1024 * 1024) / msf->page_size;\n  U64 stream_count = 8;\n  \n  U64 data_size = msf->page_size;\n  U8 *data = push_array(scratch.arena, U8, data_size);\n  \n  for (U64 stream_idx = 0; stream_idx < stream_count; stream_idx += 1) {\n    MSF_StreamNumber stream = msf_stream_alloc(msf);\n    Assert(stream != MSF_INVALID_STREAM_NUMBER);\n    \n    MemorySet(&data[0], 1 + stream_idx, data_size);\n    \n    msf_stream_resize(msf, stream, c * msf->page_size);\n    \n    for (U64 i = 0; i < c; i += 1) {\n      B32 is_written = msf_stream_write(msf, stream, data, data_size);\n      Assert(is_written);\n    }\n  }\n  \n  //msf_grow(msf, MSF_PN_MAX);\n  \n  msf_stream_free(msf, 7);\n  msf_stream_free(msf, 6);\n  msf_stream_free(msf, 5);\n  \n  stream_count -= 3;\n  \n  String8 msf_data = msf_save_arena(scratch.arena, msf);\n  Assert(msf_data.size > 0);\n  msf_release(&msf);\n  \n  //os_write_file(str8_lit(\"test.msf\"), msf_data);\n  \n  MSF_Error err = msf_open(msf_data, &msf);\n  Assert(err == MSF_Error_OK);\n  \n#if 1\n  U8 *buffer = push_array(scratch.arena, U8, data_size);\n  for (U64 stream_idx = 0; stream_idx < stream_count; stream_idx += 1) {\n    MSF_StreamNumber sn = (MSF_StreamNumber)stream_idx;\n    \n    MemorySet(&data[0], 1 + stream_idx, data_size);\n    \n    for (U64 i = 0; i < c; i += 1) {\n      MSF_UInt read_size = msf_stream_read(msf, sn, buffer, data_size);\n      Assert(read_size == data_size);\n      \n      int cmp = MemoryCompare(buffer, data, data_size);\n      Assert(cmp == 0);\n    }\n  }\n#endif\n  \n  msf_release(&msf);\n  scratch_end(scratch);\n}\n\ninternal void\ntest_msf(void)\n{\n  test_size_limit();\n  test_msf_open_save();\n}\n#endif\n\n"
  },
  {
    "path": "src/linker/pdb_ext/msf_builder.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n#define MSF_PAGE_STATE_FREE  1\n#define MSF_PAGE_STATE_ALLOC 0\n\n#define MSF_FPM0 1\n#define MSF_FPM1 2\n\n#define MSF_DEFAULT_PAGE_SIZE 4096\n#define MSF_DEFAULT_FPM MSF_FPM0\n\ntypedef struct MSF_PageNumberArray\n{\n  U64             count;\n  MSF_PageNumber *v;\n} MSF_PageNumberArray;\n\ntypedef struct MSF_PageNode\n{\n  struct MSF_PageNode *next;\n  struct MSF_PageNode *prev;\n  MSF_PageNumber       pn;\n} MSF_PageNode;\n\ntypedef struct MSF_PageList\n{\n  MSF_PageNode *first;\n  MSF_PageNode *last;\n  MSF_UInt      count;\n} MSF_PageList;\n\ntypedef struct MSF_Stream\n{\n  MSF_StreamNumber sn;\n  MSF_UInt         size;\n  MSF_UInt         pos;\n  MSF_PageNode    *pos_page;\n  MSF_PageList     page_list;\n} MSF_Stream;\n\ntypedef struct MSF_StreamNode\n{\n  struct MSF_StreamNode *next;\n  struct MSF_StreamNode *prev;\n  MSF_Stream             data;\n} MSF_StreamNode;\n\ntypedef struct MSF_StreamList\n{\n  MSF_UInt        count;\n  MSF_StreamNode *first;\n  MSF_StreamNode *last;\n} MSF_StreamList;\n\ntypedef struct MSF_PageDataNode\n{\n  struct MSF_PageDataNode *next;\n  struct MSF_PageDataNode *prev;\n  U8                      *data;\n} MSF_PageDataNode;\n\ntypedef struct MSF_PageDataList\n{\n  MSF_PageDataNode *first;\n  MSF_PageDataNode *last;\n  MSF_UInt          count;\n} MSF_PageDataList;\n\ntypedef struct MSF_Context\n{\n  Arena           *arena;\n  MSF_UInt         page_size;\n  MSF_UInt         active_fpm;\n  MSF_UInt         fpm_rover;\n  MSF_PageNumber   page_count;\n  MSF_PageDataList page_data_list;\n  MSF_PageDataList page_data_pool;\n  MSF_PageList     header_page_list;\n  MSF_PageList     root_page_list;\n  MSF_PageList     st_page_list;\n  MSF_PageList     page_pool;\n  MSF_StreamList   sectab;\n} MSF_Context;\n\ntypedef enum MSF_Error\n{\n  MSF_Error_OK,\n  \n  // if you get this error this means stream table was divided into too many\n  // pages, and to fix this you need to bump up the page size\n  MSF_Error_STREAM_TABLE_HAS_TOO_MANY_PAGES,\n  \n  MSF_OpenError_NOT_ENOUGH_BYTES_TO_READ_HEADER,\n  MSF_OpenError_INVALID_MAGIC,\n  MSF_OpenError_PAGE_SIZE_IS_NOT_POW2,\n  MSF_OpenError_INVALID_PAGE_SIZE,\n  MSF_OpenError_NOT_ENOUGH_PAGES_TO_INIT,\n  MSF_OpenError_INVALID_ROOT_STREAM_PAGE_NUMBER,\n  MSF_OpenError_UNABLE_TO_READ_STREAM_TABLE_PAGE_NUMBERS,\n  MSF_OpenError_STREAM_COUNT_OVERFLOW,\n  MSF_OpenError_UNABLE_TO_READ_STREAM_SIZES,\n  MSF_OpenError_INVALID_STREAM_TABLE,\n  MSF_OpenError_INVALID_ACTIVE_FPM,\n  MSF_OpenError_PAGE_COUNT_DOESNT_MATCH_DATA_SIZE,\n  \n  MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE,\n  MSF_BuildError_UNABLE_TO_WRITE_STREAM_TABLE_PAGE_NUMBER_DIRECTORY,\n  MSF_BuildError_UNABLE_TO_WRITE_ROOT_DIRECTORY,\n  MSF_BuildError_UNABLE_TO_WRITE_HEADER,\n} MSF_Error;\n\n////////////////////////////////\n\ntypedef struct\n{\n  MSF_UInt         page_size;\n  MSF_PageDataList page_data_list;\n  MSF_PageList     page_list;\n  MSF_UInt         stream_pos;\n  String8          data;\n  Rng1U64         *range_arr;\n} MSF_WriteTask;\n\n////////////////////////////////\n\ninternal MSF_Context *    msf_alloc(MSF_UInt page_size, MSF_UInt active_fpm);\ninternal MSF_Error        msf_open(String8 data, MSF_Context **msf_out);\ninternal void             msf_release(MSF_Context **msf_ptr);\ninternal MSF_Error        msf_build(MSF_Context *msf);\ninternal U64              msf_get_save_size(MSF_Context *msf);\ninternal String8List      msf_get_page_data_nodes(Arena *arena, MSF_Context *msf);\ninternal B32              msf_save(MSF_Context *msf, void *buffer, U64 buffer_size);\ninternal MSF_Error        msf_save_arena(Arena *arena, MSF_Context *msf, String8 *data_out);\ninternal MSF_StreamNode * msf_find_stream_node(MSF_Context *msf, MSF_StreamNumber sn);\ninternal MSF_Stream *     msf_find_stream(MSF_Context *msf, MSF_StreamNumber sn);\ninternal B32              msf_grow(MSF_Context *msf, MSF_PageNumber page_count);\ninternal MSF_PageNumber * msf_alloc_pn_arr(Arena *arena, MSF_Context *msf, MSF_UInt alloc_count);\ninternal void             msf_free_pn_arr(MSF_Context *msf, MSF_PageNumber *pn_arr, MSF_UInt pn_count);\ninternal MSF_PageList     msf_alloc_pages(MSF_Context *msf, MSF_UInt alloc_count);\ninternal void             msf_free_pages(MSF_Context *msf, MSF_PageList *page_list);\n\ninternal MSF_StreamNumber msf_stream_alloc_ex(MSF_Context *msf, MSF_UInt size);\ninternal MSF_StreamNumber msf_stream_alloc(MSF_Context *msf);\ninternal B32              msf_stream_free(MSF_Context *msf, MSF_StreamNumber sn);\ninternal B32              msf_stream_resize(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_size);\ninternal B32              msf_stream_resize_ex(MSF_Context *msf, MSF_Stream *stream, MSF_UInt size);\ninternal void             msf_stream_set_size(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt size);\ninternal MSF_UInt         msf_stream_get_size(MSF_Context *msf, MSF_StreamNumber sn);\ninternal MSF_UInt         msf_stream_get_cap(MSF_Context *msf, MSF_StreamNumber);\ninternal MSF_UInt         msf_stream_get_pos(MSF_Context *msf, MSF_StreamNumber sn);\ninternal void             msf_stream_align(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt align);\ninternal B32              msf_stream_reserve(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt size);\ninternal B32              msf_stream_seek(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt new_pos);\ninternal B32              msf_stream_seek_start(MSF_Context *msf, MSF_StreamNumber sn);\ninternal B32              msf_stream_seek_end(MSF_Context *msf, MSF_StreamNumber sn);\n\ninternal MSF_UInt msf_stream_read(MSF_Context *msf, MSF_StreamNumber sn, void *dst, MSF_UInt dst_len);\ninternal String8  msf_stream_read_block(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U64 block_size);\ninternal String8  msf_stream_read_string(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn);\ninternal S8       msf_stream_read_s8(MSF_Context *msf, MSF_StreamNumber sn);\ninternal S16      msf_stream_read_s16(MSF_Context *msf, MSF_StreamNumber sn);\ninternal S32      msf_stream_read_s32(MSF_Context *msf, MSF_StreamNumber sn);\ninternal S64      msf_stream_read_s64(MSF_Context *msf, MSF_StreamNumber sn);\ninternal U8       msf_stream_read_u8(MSF_Context *msf, MSF_StreamNumber sn);\ninternal U16      msf_stream_read_u16(MSF_Context *msf, MSF_StreamNumber sn);\ninternal U32      msf_stream_read_u32(MSF_Context *msf, MSF_StreamNumber sn);\ninternal U64      msf_stream_read_u64(MSF_Context *msf, MSF_StreamNumber sn);\n#define msf_stream_read_array(msf, sn, ptr, count) msf_stream_read(msf, sn, ptr, sizeof(*ptr) * (count))\n#define msf_stream_read_struct(msf, sn, ptr) msf_stream_read_array(msf, sn, ptr, 1)\n\ninternal B32 msf_stream_write(MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size);\ninternal B32 msf_stream_write_string(MSF_Context *msf, MSF_StreamNumber sn, String8 string);\ninternal B32 msf_stream_write_list(MSF_Context *msf, MSF_StreamNumber sn, String8List list);\ninternal B32 msf_stream_write_uint(MSF_Context *msf, MSF_StreamNumber sn, MSF_UInt value);\ninternal B32 msf_stream_write_cstr(MSF_Context *msf, MSF_StreamNumber sn, String8 string);\ninternal B32 msf_stream_write_u8(MSF_Context *msf, MSF_StreamNumber sn, U8 value);\ninternal B32 msf_stream_write_u16(MSF_Context *msf, MSF_StreamNumber sn, U16 value);\ninternal B32 msf_stream_write_u32(MSF_Context *msf, MSF_StreamNumber sn, U32 value);\ninternal B32 msf_stream_write_u64(MSF_Context *msf, MSF_StreamNumber sn, U64 value);\ninternal B32 msf_stream_write_s8(MSF_Context *msf, MSF_StreamNumber sn, S8 value);\ninternal B32 msf_stream_write_s16(MSF_Context *msf, MSF_StreamNumber sn, S16 value);\ninternal B32 msf_stream_write_s32(MSF_Context *msf, MSF_StreamNumber sn, S32 value);\ninternal B32 msf_stream_write_s64(MSF_Context *msf, MSF_StreamNumber sn, S64 value);\ninternal B32 msf_stream_write_parallel(TP_Context *tp, MSF_Context *msf, MSF_StreamNumber sn, void *buffer, MSF_UInt buffer_size);\n#define msf_stream_write_array(m, s, v, c) msf_stream_write(m, s, (void*)(v), sizeof(*(v)) * (c))\n#define msf_stream_write_struct(m, s, v )  msf_stream_write_array(m, s, v, 1)\n\ninternal MSF_UInt       msf_count_pages(MSF_UInt page_size, U64 data_size);\ninternal MSF_PageNumber msf_get_page_count_cap(MSF_PageDataList page_data_list, MSF_UInt page_size);\ninternal MSF_UInt       msf_get_fpm_interval_correct(MSF_UInt page_size);\ninternal MSF_UInt       msf_get_fpm_interval_wrong(MSF_UInt page_size);\ninternal MSF_UInt       msf_get_fpm_idx_from_pn(MSF_UInt page_size, MSF_PageNumber pn);\ninternal MSF_UInt       msf_get_fpm_page_bit_state(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn);\ninternal void           msf_set_fpm_bit(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageNumber active_fpm, MSF_PageNumber pn, B32 state);\ninternal B32            msf_write(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size);\ninternal MSF_UInt       msf_read(MSF_PageDataList page_data_list, MSF_UInt page_size, MSF_PageList page_list, MSF_UInt offset, void *buffer, MSF_UInt buffer_size);\n\ninternal char * msf_error_to_string(MSF_Error code);\n\n"
  },
  {
    "path": "src/linker/pdb_ext/pdb.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U32\npdb_hash_udt(CV_UDTInfo udt_info, String8 data)\n{\n  B32 is_fwdref       = !!(udt_info.props & CV_TypeProp_FwdRef);\n  B32 is_scoped       = !!(udt_info.props & CV_TypeProp_Scoped);\n  B32 has_unique_name = !!(udt_info.props & CV_TypeProp_HasUniqueName);\n  B32 is_anon         = has_unique_name && cv_is_udt_name_anon(udt_info.name);\n  \n  U32 hash = 0;\n  // dbi/tpi.cpp:1918\n  if (!is_fwdref && !is_scoped && !is_anon) {\n    hash = pdb_hash_v1(udt_info.name);\n  }\n  // dbi/tpi.cpp:1937\n  else if (!is_fwdref && has_unique_name && is_scoped && !is_anon) {\n    hash = pdb_hash_v1(udt_info.unique_name);\n  }\n  // dbi/tpi.cpp 1338\n  else {\n    hash = pdb_hash_v1(data);\n  }\n  \n  return hash;\n}\n\ninternal U32\npdb_crc32_from_string(String8 string)\n{\n  return ~update_crc32(~0, string.str, string.size);\n}\n\n"
  },
  {
    "path": "src/linker/pdb_ext/pdb.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal U32 pdb_hash_udt(CV_UDTInfo udt_info, String8 data);\ninternal U32 pdb_crc32_from_string(String8 string);\n"
  },
  {
    "path": "src/linker/pdb_ext/pdb_builder.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n\ninternal U64\npdb_hash_table_compute_load_factor(U64 count)\n{\n  // PDB/include/map.h:cdrLoadMax()\n  U64 load_factor = count * 2/3 + 1;\n  return load_factor;\n}\n\ninternal void\npdb_hash_table_alloc(PDB_HashTable *ht, U32 max)\n{\n  ProfBeginFunction();\n  ht->arena        = arena_alloc();\n  ht->bucket_arr   = push_array(ht->arena, PDB_HashTableBucket, max);\n  ht->present_bits = bit_array_init32(ht->arena, max);\n  ht->deleted_bits = bit_array_init32(ht->arena, max);\n  ht->max          = max;\n  ht->count        = 0;\n  bit_array_set_bit_range32(ht->deleted_bits, rng_1u64(0, max), 1);\n  ProfEnd();\n}\n\ninternal void\npdb_hash_table_release(PDB_HashTable *ht)\n{\n  ProfBeginFunction();\n  arena_release(ht->arena);\n  MemoryZeroStruct(ht);\n  ProfEnd();\n}\n\ninternal PDB_HashTableParseError\npdb_hash_table_from_data(PDB_HashTable *ht,\n                         String8 data,\n                         B32 has_local_data,\n                         PDB_HashTableUnpackFunc *unpack_func,\n                         void *unpack_ud,\n                         U64 *read_bytes_out)\n{\n  ProfBeginFunction();\n  PDB_HashTableParseError error = PDB_HashTableParseError_OK;\n\n  U64 cursor = 0;\n  \n  U32      local_data_size = 0;\n  String8  local_data      = str8(0,0);\n  U32      count           = 0;\n  U32      max             = 0;\n  U32Array present_bits    = {0};\n  U32Array deleted_bits    = {0};\n\n  do {\n    error = PDB_HashTableParseError_OUT_OF_BYTES;\n\n    if (has_local_data) {\n      if (cursor + sizeof(local_data_size) > data.size) {\n        break;\n      }\n      cursor += str8_deserial_read_struct(data, cursor, &local_data_size);\n      if (cursor + local_data_size > data.size) {\n        break;\n      }\n      cursor += str8_deserial_read_block(data, cursor, local_data_size, &local_data);\n    }\n\n    if (cursor + sizeof(count) > data.size) {\n      break;\n    }\n    cursor += str8_deserial_read_struct(data, cursor, &count);\n    if (cursor + sizeof(max) > data.size) {\n      break;\n    }\n    cursor += str8_deserial_read_struct(data, cursor, &max);\n    cursor += pdb_read_bit_vector_string(data, cursor, &present_bits);\n    cursor += pdb_read_bit_vector_string(data, cursor, &deleted_bits);\n\n    error = PDB_HashTableParseError_OK;\n  } while(0);\n\n  if (error == PDB_HashTableParseError_OK) {\n    U64 load_factor = pdb_hash_table_compute_load_factor(max);\n    B32 is_count_ok = count < max;\n    B32 is_load_factor_ok = count < load_factor;\n    B32 is_present_bits_ok = present_bits.count <= AlignPow2(max, 32);\n    B32 is_deleted_bits_ok = deleted_bits.count <= AlignPow2(max, 32);\n    if (is_count_ok && is_load_factor_ok && is_present_bits_ok && is_deleted_bits_ok) {\n      Arena *arena = arena_alloc();\n      PDB_HashTableBucket *bucket_arr = push_array_no_zero(arena, PDB_HashTableBucket, max);\n      U32Array present_bits_new = bit_array_init32(arena, max);\n      U32Array deleted_bits_new = bit_array_init32(arena, max);\n      MemoryCopyTyped(&present_bits_new.v[0], &present_bits.v[0], present_bits.count);\n      MemoryCopyTyped(&deleted_bits_new.v[0], &deleted_bits.v[0], deleted_bits.count);\n\n      // unpack buckets\n      U64 read_count = 0;\n      for (U64 bucket_idx = 0; bucket_idx < max; bucket_idx += 1) {\n        if (bit_array_is_bit_set(present_bits_new, bucket_idx)) {\n          if (bit_array_is_bit_set(deleted_bits_new, bucket_idx)) {\n            error = PDB_HashTableParseError_CORRUPTED;\n            break;\n          }\n          if (read_count >= count) {\n            error = PDB_HashTableParseError_CORRUPTED;\n            break;\n          }\n\n          String8 key;\n          String8 value;\n          B32 has_unpack_failed = unpack_func(unpack_ud, local_data, data, &cursor, &key, &value);\n          if (has_unpack_failed) {\n            error = PDB_HashTableParseError_CORRUPTED;\n            break;\n          }\n          \n          bucket_arr[bucket_idx].key = key;\n          bucket_arr[bucket_idx].value = value;\n\n          read_count += 1;\n        }\n      }\n\n      if (error == PDB_HashTableParseError_OK) {\n        ht->arena        = arena;\n        ht->bucket_arr   = bucket_arr;\n        ht->present_bits = present_bits_new;\n        ht->deleted_bits = deleted_bits_new;\n        ht->count        = count;\n        ht->max          = max;\n\n        if (read_bytes_out) {\n          // TBH data format should tell parser upfront size of the hash table\n          *read_bytes_out = cursor;\n        }\n      } else {\n        arena_release(arena);\n      }\n    } else {\n      error = PDB_HashTableParseError_CORRUPTED;\n    }\n  }\n\n  ProfEnd();\n  return error;\n}\n\ninternal String8\npdb_data_from_hash_table(Arena *arena,\n                         PDB_HashTable *ht,\n                         B32 has_local_data,\n                         PDB_HashTablePackFunc *pack_func,\n                         void *pack_ud)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  String8Array key_arr   = {0};\n  String8Array value_arr = {0};\n  pdb_hash_table_get_present_keys_and_values(scratch.arena, ht, &key_arr, &value_arr);\n\n  String8List local_data_srl = {0};\n  String8List key_value_srl = {0};\n  str8_serial_begin(scratch.arena, &local_data_srl);\n  str8_serial_begin(scratch.arena, &key_value_srl);\n\n  for (U64 i = 0; i < ht->count; i += 1) {\n    String8 key   = key_arr.v[i];\n    String8 value = value_arr.v[i];\n    pack_func(scratch.arena, &local_data_srl, &key_value_srl, key, value, pack_ud);\n  }\n\n  // serialize hash table\n  String8List srl = {0};\n  str8_serial_begin(scratch.arena, &srl);\n  if (has_local_data) {\n    U32 local_data_size32 = safe_cast_u32(local_data_srl.total_size);\n    str8_serial_push_u32(scratch.arena, &srl, local_data_size32);\n    str8_list_concat_in_place(&srl, &local_data_srl);\n  }\n  str8_serial_push_u32(scratch.arena, &srl, ht->count);\n  str8_serial_push_u32(scratch.arena, &srl, ht->max);\n  str8_serial_push_u32(scratch.arena, &srl, ht->present_bits.count);\n  str8_serial_push_array(scratch.arena, &srl, &ht->present_bits.v[0], ht->present_bits.count);\n  str8_serial_push_u32(scratch.arena, &srl, ht->deleted_bits.count);\n  str8_serial_push_array(scratch.arena, &srl, &ht->deleted_bits.v[0], ht->deleted_bits.count);\n  str8_list_concat_in_place(&srl, &key_value_srl);\n  String8 data = str8_serial_end(arena, &srl);\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return data;\n}\n\ninternal void\npdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity)\n{\n  ProfBeginFunction();\n  PDB_HashTable new_ht;\n  pdb_hash_table_alloc(&new_ht, new_capacity);\n  for (U32 i = 0; i < ht->max; ++i) {\n    if (bit_array_is_bit_set(ht->present_bits, i)) {\n      PDB_HashTableBucket *bucket = &ht->bucket_arr[i];\n      B32 is_set = pdb_hash_table_try_set(&new_ht, bucket->key, bucket->value);\n      Assert(is_set);\n    }\n  }\n  pdb_hash_table_release(ht);\n  *ht = new_ht;\n  ProfEnd();\n}\n\ninternal U32\npdb_hash_table_hash(String8 key)\n{\n  return (U16)pdb_hash_v1(key);\n}\n\ninternal B32\npdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value)\n{\n  ProfBeginFunction();\n  B32 is_set = 0;\n  U32 best_ibucket = pdb_hash_table_hash(key) % ht->max;\n  U32 ibucket = best_ibucket;\n  do {\n    B32 is_present = pdb_hash_table_is_present(ht, ibucket);\n    if ( ! is_present) {\n      PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket];\n      bucket->key   = push_str8_copy(ht->arena, key);\n      bucket->value = push_str8_copy(ht->arena, value);\n\n      bit_array_set_bit32(ht->present_bits, ibucket, 1);\n      bit_array_set_bit32(ht->deleted_bits, ibucket, 0);\n\n      ht->count += 1;\n      is_set = 1;\n      break;\n    }\n    ibucket = (ibucket + 1) % ht->max;\n  } while (ibucket != best_ibucket);\n  ProfEnd();\n  return is_set;\n}\n\ninternal void\npdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value)\n{\n  ProfBeginFunction();\n\n  // should resize?\n  U64 load_factor = pdb_hash_table_compute_load_factor(ht->max);\n  if (ht->count + 1 >= load_factor) {\n    pdb_hash_table_grow(ht, ht->max * 2);\n  }\n\n  // set new item\n  B32 is_set = pdb_hash_table_try_set(ht, key, value);\n  AssertAlways(is_set);\n\n  ProfEnd();\n}\n\ninternal B32\npdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out)\n{\n  ProfBeginFunction();\n  B32 is_get_ok = 0;\n  U32 best_ibucket = pdb_hash_table_hash(key) % ht->max;\n  U32 ibucket = best_ibucket;\n  do {\n    B32 is_present = pdb_hash_table_is_present(ht, ibucket);\n    if (is_present) {\n      PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket];\n      B32 is_match = str8_match(bucket->key, key, 0);\n      if (is_match) {\n        *value_out = bucket->value;\n        is_get_ok = 1;\n        break;\n      }\n    } else {\n      break;\n    }\n    ibucket = (ibucket + 1) % ht->max;\n  } while (ibucket != best_ibucket);\n  ProfEnd();\n  return is_get_ok;\n}\n\ninternal void\npdb_hash_table_delete(PDB_HashTable *ht, String8 key)\n{\n  ProfBeginFunction();\n  U32 best_ibucket = pdb_hash_table_hash(key) % ht->max;\n  U32 ibucket = best_ibucket;\n  do {\n    B32 is_present = pdb_hash_table_is_present(ht, ibucket);\n    if (!is_present) {\n      break;\n    }\n    PDB_HashTableBucket *bucket = &ht->bucket_arr[ibucket];\n    int cmp = MemoryCompare(key.str, bucket->key.str, key.size);\n    if (cmp == 0) {\n      bit_array_set_bit32(ht->present_bits, ibucket, 0);\n      bit_array_set_bit32(ht->deleted_bits, ibucket, 1);\n      ht->count -= 1;\n      break;\n    }\n    ibucket = (ibucket + 1) % ht->max;\n  } while (ibucket != best_ibucket);\n  ProfEnd();\n}\n\ninternal B32\npdb_hash_table_is_present(PDB_HashTable *ht, U32 k)\n{\n  Assert(k < ht->max);\n  return bit_array_is_bit_set(ht->present_bits, k);\n}\n\ninternal B32\npdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k)\n{\n  Assert(k < ht->max);\n  return bit_array_is_bit_set(ht->deleted_bits, k);\n}\n\ninternal void\npdb_hash_table_get_present_keys_and_values(Arena *arena, PDB_HashTable *ht, String8Array *keys_out, String8Array *values_out)\n{\n  *keys_out   = str8_array_reserve(arena, ht->count);\n  *values_out = str8_array_reserve(arena, ht->count);\n  for (U64 bucket_idx = 0; bucket_idx < ht->max; bucket_idx += 1) {\n    if (bit_array_is_bit_set(ht->present_bits, bucket_idx)) {\n      PDB_HashTableBucket *bucket = &ht->bucket_arr[bucket_idx];\n      Assert(keys_out->count < ht->count);\n      keys_out->v[keys_out->count++] = bucket->key;\n      values_out->v[values_out->count++] = bucket->value;\n    }\n  }\n}\n\n////////////////////////////////\n\ninternal\nPDB_HASH_TABLE_UNPACK_FUNC(pdb_named_stream_ht_unpack)\n{\n  Assert(!ud);\n\n  U32 key_data_offset = max_U32;\n  *key_value_cursor += str8_deserial_read_struct(key_value_data, *key_value_cursor, &key_data_offset);\n\n  U8 *cstr_ptr = local_data.str + key_data_offset;\n  U8 *cstr_opl = local_data.str + local_data.size;\n  String8 stream_name = str8_cstring_capped(cstr_ptr, cstr_opl);\n\n  // NOTE: stream number is U16 but in the reference they cast to U32\n  String8 stream_number = {0};\n  *key_value_cursor += str8_deserial_read_block(key_value_data, *key_value_cursor, sizeof(U32), &stream_number);\n\n  *key_out   = stream_name;\n  *value_out = stream_number;\n\n  return 0;\n}\n\ninternal\nPDB_HASH_TABLE_UNPACK_FUNC(pdb_hash_adj_ht_unpack)\n{\n  Assert(local_data.size == 0);\n\n  if (*key_value_cursor + sizeof(PDB_StringOffset) > key_value_data.size){\n    return 1;\n  }\n  PDB_StringOffset string_offset = 0;\n  *key_value_cursor += str8_deserial_read_struct(key_value_data, *key_value_cursor, &string_offset);\n\n  if (*key_value_cursor + sizeof(CV_TypeIndex) > key_value_data.size) {\n    return 1;\n  }\n  String8 type_index = {0};\n  *key_value_cursor += str8_deserial_read_block(key_value_data, *key_value_cursor, sizeof(CV_TypeIndex), &type_index);\n\n  PDB_StringTable *strtab = (PDB_StringTable*)ud;\n  String8 type_name = pdb_strtab_string_from_offset(strtab, string_offset);\n\n  *key_out   = type_name;\n  *value_out = type_index;\n\n  return 0;\n}\n\ninternal\nPDB_HASH_TABLE_UNPACK_FUNC(pdb_src_header_block_ht_unpack)\n{\n  if (*key_value_cursor + sizeof(PDB_StringOffset) > key_value_data.size) {\n    return 1;\n  }\n  PDB_StringOffset path_offset = 0;\n  *key_value_cursor += str8_deserial_read_struct(key_value_data, *key_value_cursor, &path_offset);\n\n  if (path_offset + sizeof(PDB_SrcHeaderBlockEntry) > key_value_data.size) {\n    return 1;\n  }\n  String8 src_header_block_entry = {0};\n  *key_value_cursor += str8_deserial_read_block(key_value_data, *key_value_cursor, sizeof(PDB_SrcHeaderBlockEntry), &src_header_block_entry);\n\n  PDB_StringTable *strtab = (PDB_StringTable*)ud;\n  String8 path = pdb_strtab_string_from_offset(strtab, path_offset);\n\n  *key_out   = path;\n  *value_out = src_header_block_entry;\n\n  return 0;\n}\n\ninternal\nPDB_HASH_TABLE_PACK_FUNC(pdb_named_stream_ht_pack)\n{\n  Assert(!ud);\n  Assert(value.size == sizeof(U32));\n\n  U64 key_data_offset = local_data_srl->total_size;\n  str8_serial_push_cstr(arena, local_data_srl, key);\n\n  U32 key_data_offset32 = safe_cast_u32(key_data_offset);\n  str8_serial_push_u32(arena, key_value_srl, key_data_offset32);\n  str8_serial_push_string(arena, key_value_srl, value);\n}\n\ninternal\nPDB_HASH_TABLE_PACK_FUNC(pdb_hash_adj_ht_pack)\n{\n  Assert(value.size == sizeof(CV_TypeIndex));\n\n  PDB_StringTable *strtab = (PDB_StringTable*)ud;\n\n  PDB_StringIndex string_idx = PDB_INVALID_STRING_INDEX;\n  B32 is_found = pdb_strtab_search(strtab, key, &string_idx);\n  Assert(is_found);\n\n  PDB_StringOffset type_name_offset = pdb_strtab_string_to_offset(strtab, string_idx);\n\n  str8_serial_push_struct(arena, key_value_srl, &type_name_offset);\n  str8_serial_push_string(arena, key_value_srl, value);\n}\n\ninternal\nPDB_HASH_TABLE_PACK_FUNC(pdb_src_header_block_ht_pack)\n{\n  Assert(value.size == sizeof(PDB_SrcHeaderBlockEntry));\n\n  PDB_StringTable *strtab = (PDB_StringTable*)ud;\n\n  PDB_StringIndex path_idx = 0;\n  B32 is_found = pdb_strtab_search(strtab, key, &path_idx);\n  Assert(is_found);\n\n  PDB_StringOffset path_offset = pdb_strtab_string_to_offset(strtab, path_idx);\n\n  str8_serial_push_struct(arena, key_value_srl, &path_offset);\n  str8_serial_push_string(arena, key_value_srl, value);\n}\n\n////////////////////////////////\n\ninternal PDB_HashTableParseError\npdb_hash_adj_hash_table_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out)\n{\n  return pdb_hash_table_from_data(ht, data, 0, pdb_hash_adj_ht_unpack, strtab, read_bytes_out);\n}\n\ninternal PDB_HashTableParseError\npdb_src_header_block_ht_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out)\n{\n  return pdb_hash_table_from_data(ht, data, 0, pdb_src_header_block_ht_unpack, strtab, read_bytes_out);\n}\n\ninternal PDB_HashTableParseError\npdb_named_stream_ht_from_data(PDB_HashTable *ht, String8 data, U64 *read_bytes_out)\n{\n  return pdb_hash_table_from_data(ht, data, 1, pdb_named_stream_ht_unpack, 0, read_bytes_out);\n}\n\ninternal String8\npdb_data_from_hash_adj_hash_table(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab)\n{\n  String8 data = pdb_data_from_hash_table(arena, ht, 0, pdb_hash_adj_ht_pack, strtab);\n  return data;\n}\n\ninternal String8\npdb_data_from_src_header_block_ht(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab)\n{\n  String8 data = pdb_data_from_hash_table(arena, ht, 0, pdb_src_header_block_ht_pack, strtab);\n  return data;\n}\n\ninternal String8\npdb_data_from_named_stream_ht(Arena *arena, PDB_HashTable *ht)\n{\n  String8 data = pdb_data_from_hash_table(arena, ht, 1, pdb_named_stream_ht_pack, 0);\n  return data;\n}\n\n////////////////////////////////\n\ninternal void\npdb_strtab_alloc(PDB_StringTable *strtab, U32 max)\n{\n  ProfBeginFunction();\n  \n  U64 bucket_max  = (U64)((F64)max * 1.3);\n  bucket_max     += 1; // reserve space for null string\n  \n  strtab->arena         = arena_alloc();\n  strtab->version       = 1;\n  strtab->size          = 0;\n  strtab->bucket_count  = 0;\n  strtab->bucket_max    = bucket_max;\n  strtab->ibucket_array = push_array(strtab->arena, U32, strtab->bucket_max);\n  MemorySet(strtab->ibucket_array, 0xff, sizeof(strtab->ibucket_array[0]) * strtab->bucket_max);\n  strtab->bucket_array = push_array(strtab->arena, PDB_StringTableBucket *, strtab->bucket_max);\n\n  // string table always has a null for first entry\n  pdb_strtab_add(strtab, str8_lit(\"\"));\n\n  ProfEnd();\n}\n\ninternal PDB_StringTableOpenError\npdb_strtab_open(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n\n  PDB_StringTableOpenError err = PDB_StringTableOpenError_OK;\n\n  Arena                  *arena = 0;\n  String8                 string_buffer;\n  U32                     bucket_max;\n  U32                     bucket_count;\n  U32                    *ibucket_array;\n  PDB_StringTableBucket **bucket_array;\n\n  PDB_StringTableHeader header = {0};\n  msf_stream_read_struct(msf, sn, &header);\n\n  if (header.magic == PDB_StringTableHeader_MAGIC) {\n    if (header.version == PDB_StringTableHeader_CurrentVersion) {\n      Temp scratch = scratch_begin(0,0);\n\n      arena = arena_alloc();\n\n      U32     string_size;\n      String8 offset_buffer;\n      \n      // read table data\n      string_size   = msf_stream_read_u32(msf, sn);\n      string_buffer = msf_stream_read_block(arena, msf, sn, string_size);\n      bucket_max    = msf_stream_read_u32(msf, sn);\n      offset_buffer = msf_stream_read_block(scratch.arena, msf, sn, bucket_max * sizeof(U32));\n      bucket_count  = msf_stream_read_u32(msf, sn);\n\n      U64 expected_size = sizeof(PDB_StringTableHeader) +\n                          string_buffer.size +\n                          sizeof(bucket_max) +\n                          offset_buffer.size +\n                          sizeof(bucket_count);\n      U64 actual_size = msf_stream_get_size(msf, sn);\n\n      if (expected_size <= actual_size &&\n          string_buffer.size == string_size &&\n          offset_buffer.size == sizeof(U32)*bucket_max &&\n          bucket_count <= bucket_max) {\n        // init string table\n        ibucket_array = push_array_no_zero(arena, U32, bucket_max);\n        bucket_array  = push_array_no_zero(arena, PDB_StringTableBucket *, bucket_max);\n\n        // open buckets\n        PDB_StringTableBucket *node_arr = push_array_no_zero(arena, PDB_StringTableBucket, bucket_count);\n        U8  *string_buffer_ptr = string_buffer.str;\n        U8  *string_buffer_opl = string_buffer.str + string_buffer.size;\n        U32 *offset_array      = (U32*)offset_buffer.str;\n        U32  bucket_read_idx   = 0;\n\n        for (U32 bucket_idx = 0; bucket_idx < bucket_max; bucket_idx += 1) {\n          U32 string_offset = offset_array[bucket_idx];\n\n          // sanity check offset\n          if (string_offset >= string_buffer.size) {\n            err = PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS;\n            break;\n          } \n\n          // empty bucket\n          else if (string_offset == 0) {\n            ibucket_array[bucket_idx] = 0;\n            bucket_array[bucket_idx]  = 0;\n          }\n\n          // bucket with string\n          else {\n            if (bucket_read_idx >= bucket_count) {\n              err = PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT;\n              break;\n            }\n\n            // get bucket\n            PDB_StringTableBucket *bucket = &node_arr[bucket_read_idx];\n\n            // init bucket\n            bucket->data   = str8_cstring_capped(string_buffer_ptr + string_offset, string_buffer_opl);\n            bucket->offset = string_offset;\n            bucket->istr   = bucket_read_idx;\n\n            // assign bucket\n            bucket_array[bucket_idx]  = bucket;\n            ibucket_array[bucket_idx] = bucket_read_idx;\n\n            // advance\n            bucket_read_idx += 1;\n          }\n        }\n      } else {\n        err = PDB_StringTableOpenError_CORRUPTED;\n      }\n\n      scratch_end(scratch);\n    } else {\n      err = PDB_StringTableOpenError_UNKNOWN_VERSION;\n    }\n  } else {\n    err = PDB_StringTableOpenError_BAD_MAGIC;\n  }\n\n  if (err == PDB_StringTableOpenError_OK) {\n    strtab->arena         = arena;\n    strtab->version       = header.version;\n    strtab->size          = string_buffer.size;\n    strtab->bucket_count  = bucket_count;\n    strtab->bucket_max    = bucket_max;\n    strtab->ibucket_array = ibucket_array;\n    strtab->bucket_array  = bucket_array;\n  } else {\n    if (arena) {\n      arena_release(arena);\n    }\n  }\n\n  ProfEnd();\n\n  return err;\n}\n\ninternal void\npdb_strtab_build(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  // serialize bucket data\n  U8  *string_buffer     = push_array_no_zero(scratch.arena, U8, strtab->size);\n  U32 *bucket_offset_arr = push_array(scratch.arena, U32, strtab->bucket_max);\n\n  for (U32 bucket_idx = 0; bucket_idx < strtab->bucket_max; bucket_idx += 1) {\n    PDB_StringTableBucket *bucket = strtab->bucket_array[bucket_idx];\n    if (bucket) {\n      // store string offset\n      Assert(bucket->offset + bucket->data.size <= strtab->size);\n      bucket_offset_arr[bucket_idx] = bucket->offset;\n\n      // write c string at bucket offset\n      U8 *str_ptr = string_buffer + bucket->offset;\n      MemoryCopy(str_ptr, bucket->data.str, bucket->data.size);\n      str_ptr[bucket->data.size] = '\\0';\n    }\n  }\n  \n  // fill out header\n  PDB_StringTableHeader header;\n  header.magic = PDB_StringTableHeader_MAGIC;\n  header.version = strtab->version;\n\n  // reserve memory for entire string table\n  MSF_UInt reserve_size = sizeof(header)\n                        + sizeof(strtab->size)\n                        + strtab->size\n                        + sizeof(bucket_offset_arr[0]) * strtab->bucket_max\n                        + sizeof(strtab->bucket_count);\n  msf_stream_reserve(msf, sn, reserve_size);\n\n  // write out string table\n  msf_stream_write_struct(msf, sn, &header);\n  msf_stream_write_struct(msf, sn, &strtab->size);\n  msf_stream_write_array (msf, sn, string_buffer, strtab->size);\n  msf_stream_write_struct(msf, sn, &strtab->bucket_max);\n  msf_stream_write_array (msf, sn, bucket_offset_arr, strtab->bucket_max);\n  msf_stream_write_u32(msf, sn, strtab->bucket_count - 1); // 1 for null\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\npdb_strtab_release(PDB_StringTable *strtab)\n{\n  ProfBeginFunction();\n  arena_release(strtab->arena);\n  MemoryZeroStruct(strtab);\n  ProfEnd();\n}\n\ninternal U32\npdb_strtab_get_serialized_size(PDB_StringTable *strtab)\n{\n  U32 result = 0;\n  result += sizeof(PDB_StringTableHeader);\n  result += sizeof(U32); // strtab size\n  result += strtab->size;\n  result += sizeof(U32); // bucket count\n  result += sizeof(U32) * strtab->bucket_max;\n  result += sizeof(U32); // string count\n  return result;\n}\n\ninternal U32\npdb_strtab_hash(PDB_StringTable *strtab, String8 string)\n{\n  U32 hash = 0;\n  switch (strtab->version) {\n  case 1: hash = pdb_hash_v1(string); break;\n  default: NotImplemented; break;\n  }\n  U32 ibucket = hash % strtab->bucket_max;\n  return ibucket;\n}\n\ninternal B32\npdb_strtab_add_(PDB_StringTable *strtab, U64 hash, PDB_StringTableBucket *bucket)\n{\n  U64 best_bucket_idx = hash;\n  U64 bucket_idx      = best_bucket_idx;\n  do {\n    if (strtab->bucket_array[bucket_idx] == 0) {\n      strtab->ibucket_array[bucket->istr]  = bucket_idx;\n      strtab->bucket_array[bucket_idx]     = bucket;\n      strtab->size                        += bucket->data.size + /* null: */ 1;\n      return 1;\n    }\n    bucket_idx = (bucket_idx + 1) % strtab->bucket_max;\n  } while (best_bucket_idx != bucket_idx);\n  return 0;\n}\n\ninternal void\npdb_strtab_add_cv_string_hash_table(PDB_StringTable *strtab, CV_StringHashTable string_ht)\n{\n  ProfBeginFunction();\n\n  // reserve enough slots for new strings\n  pdb_strtab_grow(strtab, string_ht.total_insert_count);\n\n  // upfront push buckets\n  PDB_StringTableBucket *buckets = push_array_no_zero(strtab->arena, PDB_StringTableBucket, string_ht.total_insert_count);\n\n  U64 base_offset = strtab->size;\n\n  // proceed to fill out buckets & add them to the string table\n  for (U64 bucket_idx = 0, string_idx = 0; bucket_idx < string_ht.bucket_cap; ++bucket_idx) {\n    if (string_ht.buckets[bucket_idx] != 0) {\n      PDB_StringTableBucket *dst = &buckets[string_idx++];\n      dst->data                  = string_ht.buckets[bucket_idx]->string;\n      dst->offset                = base_offset + string_ht.buckets[bucket_idx]->u.offset;\n      dst->istr                  = strtab->bucket_count++;\n\n      // TODO: precompute hashes in parallel\n      U64 hash = pdb_strtab_hash(strtab, dst->data);\n      B32 was_added = pdb_strtab_add_(strtab, hash, dst);\n      Assert(was_added);\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal B32\npdb_strtab_try_add(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out)\n{\n  PDB_StringTableBucket *bucket = push_array(strtab->arena, PDB_StringTableBucket, 1);\n  bucket->data                  = push_str8_copy(strtab->arena, string);\n  bucket->offset                = strtab->size;\n  bucket->istr                  = (PDB_StringIndex)strtab->bucket_count++;\n\n  U32 hash      = pdb_strtab_hash(strtab, string);\n  B32 was_added = pdb_strtab_add_(strtab, hash, bucket);\n\n  *index_out = bucket->istr;\n\n  return was_added;\n}\n\ninternal void\npdb_strtab_grow(PDB_StringTable *strtab, U64 new_max)\n{\n  ProfBeginFunction();\n  \n  PDB_StringTable new_strtab;\n  pdb_strtab_alloc(&new_strtab, new_max);\n  \n  // start with 1 because null bucket is already added during string table alloc\n  for (PDB_StringIndex istr = 1; istr < strtab->bucket_max; ++istr) {\n    U32 ibucket = strtab->ibucket_array[istr];\n    \n    B32 is_bucket_null = ibucket >= strtab->bucket_max;\n    if (is_bucket_null) {\n      continue;\n    }\n    \n    PDB_StringTableBucket *bucket = strtab->bucket_array[ibucket];\n    \n    PDB_StringIndex new_istr;\n    B32 is_bucket_pushed = pdb_strtab_try_add(&new_strtab, bucket->data, &new_istr);\n    Assert(is_bucket_pushed);\n    Assert(new_istr == istr);\n    \n    U32 new_ibucket = new_strtab.ibucket_array[new_istr];\n    PDB_StringTableBucket *new_bucket = new_strtab.bucket_array[new_ibucket];\n    Assert(new_bucket->offset == bucket->offset);\n  }\n  \n  *strtab = new_strtab;\n\n  ProfEnd();\n}\n\ninternal PDB_StringIndex\npdb_strtab_add(PDB_StringTable *strtab, String8 string)\n{\n  PDB_StringIndex index = 0;\n  B32 is_pushed = pdb_strtab_try_add(strtab, string, &index);\n  if (!is_pushed) {\n    // increase number of slots in the hash table\n    pdb_strtab_grow(strtab, strtab->bucket_max * 2);\n\n    // now we have enough slots for the new string\n    is_pushed = pdb_strtab_try_add(strtab, string, &index);\n    AssertAlways(is_pushed);\n  }\n  return index;\n}\n\ninternal B32\npdb_strtab_search(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out)\n{\n  B32 is_found = 0;\n  U32 best_ibucket = pdb_strtab_hash(strtab, string);\n  U32 ibucket = best_ibucket;\n  do {\n    PDB_StringTableBucket *bucket = strtab->bucket_array[ibucket];\n    if (bucket == NULL) {\n      break;\n    }\n    \n    if (str8_match(bucket->data, string, 0)) {\n      *index_out = bucket->istr;\n      is_found = 1;\n      break;\n    }\n    \n    ibucket = (ibucket + 1) % strtab->bucket_max;\n  } while (ibucket != best_ibucket);\n  return is_found;\n}\n\ninternal String8\npdb_strtab_string_from_offset(PDB_StringTable *strtab, PDB_StringOffset offset)\n{\n  String8 string = str8(0,0);\n  for (U32 ibucket = 0; ibucket < strtab->bucket_max; ++ibucket) {\n    PDB_StringTableBucket *bucket = strtab->bucket_array[ibucket];\n    if (bucket) {\n      if (bucket->offset == offset) {\n        string = bucket->data;\n        break;\n      }\n    }\n  }\n  return string;\n}\n\ninternal PDB_StringOffset\npdb_strtab_string_to_offset(PDB_StringTable *strtab, PDB_StringIndex stridx)\n{\n  Assert(stridx < strtab->bucket_max);\n  U32 ibucket = strtab->ibucket_array[stridx];\n  PDB_StringOffset offset = strtab->bucket_array[ibucket]->offset;\n  return offset;\n}\n\ninternal String8\npdb_string_from_string_table_open_error(PDB_StringTableOpenError err)\n{\n  String8 result = str8(0,0);\n  switch (err) {\n  case PDB_StringTableOpenError_OK: break;\n  case PDB_StringTableOpenError_BAD_MAGIC:                   result = str8_lit(\"BAD_MAGIC\");                   break;\n  case PDB_StringTableOpenError_UNKNOWN_VERSION:             result = str8_lit(\"UNKNOWN_VERSION\");             break;\n  case PDB_StringTableOpenError_CORRUPTED:                   result = str8_lit(\"CORRUPTED\");                   break;\n  case PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT: result = str8_lit(\"OFFSETS_EXCEED_BUCKET_COUNT\"); break;\n  case PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS: result = str8_lit(\"STRING_OFFSET_OUT_OF_BOUNDS\"); break;\n  }\n  return result;\n}\n\n////////////////////////////////\n\ninternal PDB_OpenTypeServerError\npdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse)\n{\n  ProfBeginFunction();\n\n  PDB_OpenTypeServerError error = PDB_OpenTypeServerError_UNKNOWN;\n\n  PDB_TpiHeader header; MemoryZeroStruct(&header);\n  str8_deserial_read_struct(data, 0, &header);\n  Assert(header.version == PDB_TpiVersion_IMPV80);\n\n  if (header.ti_lo >= CV_MinComplexTypeIndex &&\n      header.ti_lo <= header.ti_hi) {\n    if (header.hash_bucket_count > 0 &&\n        header.hash_bucket_count <= PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX) {\n      parse->ti_range  = rng_1u64(header.ti_lo, header.ti_hi);\n      parse->leaf_data = str8_substr(data, rng_1u64(sizeof(PDB_TpiHeader), sizeof(PDB_TpiHeader) + header.leaf_data_size ));\n      error = PDB_OpenTypeServerError_OK;\n    } else {\n      error = PDB_OpenTypeServerError_INVALID_BUCKET_COUNT;\n    }\n  } else {\n    error = PDB_OpenTypeServerError_INVALID_TI_RANGE;\n  }\n\n  ProfEnd();\n  return error;\n}\n\ninternal PDB_OpenTypeServerError\npdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out)\n{\n  PDB_OpenTypeServerError error = PDB_OpenTypeServerError_UNKNOWN;\n\n  PDB_TpiVersion version = 0;\n  str8_deserial_read_struct(data, 0, &version);\n\n  switch (version) {\n  case PDB_TpiVersion_IMPV80:\n    error = pdb_type_server_parse_from_data_v80(data, parse_out);\n    break;\n  case PDB_TpiVersion_INTV_VC2:\n  case PDB_TpiVersion_IMPV40:\n  case PDB_TpiVersion_IMPV50_INTERIM:\n  case PDB_TpiVersion_IMPV70:\n    error = PDB_OpenTypeServerError_UNSUPPORTED_VERSION;\n  break;\n  default: Assert(!\"unknown TPI version\"); break;\n  }\n\n  return error;\n}\n\ninternal PDB_TypeServer *\npdb_type_server_alloc(U64 bucket_cap)\n{\n  ProfBeginFunction();\n  AssertAlways(0x1000 <= bucket_cap && bucket_cap <= 0x40000);\n\n  Arena *arena = arena_alloc();\n  PDB_TypeServer *ts  = push_array(arena, PDB_TypeServer, 1);\n  ts->arena      = arena;\n  ts->hash_sn    = MSF_INVALID_STREAM_NUMBER;\n  ts->ti_lo      = CV_MinComplexTypeIndex;\n  ts->bucket_cap = bucket_cap;\n  ts->buckets    = push_array(arena, PDB_TypeBucket *, ts->bucket_cap);\n  pdb_hash_table_alloc(&ts->hash_adj, 32);\n\n  ProfEnd();\n  return ts;\n}\n\ninternal PDB_TypeServer *\npdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n\n  PDB_TypeServer *ts = NULL;\n\n  PDB_TpiHeader header = {0};\n  msf_stream_seek(msf, sn, 0);\n  MSF_UInt read_header_size = msf_stream_read_struct(msf, sn, &header);\n\n  // have we read enough bytes?\n  if (read_header_size != sizeof(PDB_TpiHeader)) {\n    goto exit;\n  }\n  // is lowest non-simple type index valid?\n  if (header.ti_lo < CV_MinComplexTypeIndex) {\n    goto exit;\n  }\n  // is high non-simple type index valid?\n  if (header.ti_lo > header.ti_hi) {\n    goto exit;\n  }\n\n  // validate hash bucket count\n  if (header.hash_bucket_count == 0) {\n    goto exit;\n  }\n  if (header.hash_bucket_count > PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX) {\n    goto exit;\n  }\n\n  // are there enough bytes in the stream to read hash values?\n  U64 hash_stream_size = msf_stream_get_size(msf, header.hash_sn);\n  if (header.hash_vals.off + header.hash_vals.size > hash_stream_size) {\n    goto exit;\n  }\n  \n  ts = pdb_type_server_alloc(header.hash_bucket_count);\n  \n  // read & parse code view types\n  String8 types_data = msf_stream_read_block(ts->arena, msf, sn, header.leaf_data_size);\n  CV_DebugT debug_t = cv_debug_t_from_data(scratch.arena, types_data, PDB_LEAF_ALIGN);\n  \n  // read hash data\n  U8 *hash_buffer = push_array(scratch.arena, U8, header.hash_vals.size);\n  msf_stream_seek(msf, header.hash_sn, header.hash_vals.off);\n  MSF_UInt hash_buffer_size = msf_stream_read(msf, header.hash_sn, hash_buffer, header.hash_vals.size);\n  Assert(hash_buffer_size == header.hash_vals.size);\n  \n  // rebuild type buckets\n  for (U64 cursor = 0, leaf_idx = 0; \n       cursor + header.hash_key_size <= hash_buffer_size;\n       cursor += header.hash_key_size, leaf_idx += 1) {\n    String8 raw_leaf = cv_debug_t_get_raw_leaf(debug_t, leaf_idx);\n\n    str8_list_push(ts->arena, &ts->leaf_list, raw_leaf);\n    \n    // read out bucket hash\n    U64 hash = 0;\n    MemoryCopy(&hash, hash_buffer + cursor, header.hash_key_size);\n    \n    // push bucket\n    PDB_TypeBucket *bucket = push_array(ts->arena, PDB_TypeBucket, 1);\n    bucket->raw_leaf   = raw_leaf;\n    bucket->type_index = header.ti_lo + leaf_idx;\n    SLLStackPush(ts->buckets[hash], bucket);\n  }\n  \n  // adjust type buckets\n  msf_stream_seek(msf, header.hash_sn, header.hash_adj.off);\n  String8 adjust_data = msf_stream_read_block(scratch.arena, msf, header.hash_sn, header.hash_adj.size);\n  \n  // open adjust hash table\n  PDB_HashTableParseError hash_adj_parse_error = pdb_hash_adj_hash_table_from_data(&ts->hash_adj, adjust_data, strtab, 0);\n  if (hash_adj_parse_error == PDB_HashTableParseError_OUT_OF_BYTES) {\n    pdb_hash_table_alloc(&ts->hash_adj, 16);\n  } else {\n    Assert(hash_adj_parse_error == PDB_HashTableParseError_OK);\n  }\n\n  // grab keys and values\n  String8Array key_arr   = {0};\n  String8Array value_arr = {0};\n  pdb_hash_table_get_present_keys_and_values(scratch.arena, &ts->hash_adj, &key_arr, &value_arr);\n  \n  // adjust type buckets\n  for (U64 i = 0; i < ts->hash_adj.count; i += 1) {\n    String8      type_name  = key_arr.v[i];\n    CV_TypeIndex type_index = *(CV_TypeIndex*)value_arr.v[i].str;\n\n    // name -> hash\n    U64 hash = pdb_hash_v1(type_name);\n    hash %= ts->bucket_cap;\n    \n    // search for type bucket\n    PDB_TypeBucket *curr, *prev;\n    for (curr = ts->buckets[hash], prev = 0; curr != 0; prev = curr, curr = curr->next) {\n      if (curr->type_index == type_index) {\n        break;\n      }\n    }\n    \n    // move type to the head\n    if (prev && curr) {\n      prev->next = curr->next;\n      curr->next = ts->buckets[hash];\n      ts->buckets[hash] = curr;\n    }\n    \n    Assert(curr);\n  }\n  \n  exit:;\n  scratch_end(scratch);\n  ProfEnd();\n  return ts;\n}\n\ninternal PDB_TypeServer *\npdb_type_server_open(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab)\n{\n  ProfBeginFunction();\n  \n  PDB_TypeServer *ts = NULL;\n  \n  PDB_TpiVersion version = 0;\n  msf_stream_seek(msf, sn, 0);\n  msf_stream_read_struct(msf, sn, &version);\n  \n  switch (version) {\n  case PDB_TpiVersion_IMPV80: {\n    ts = pdb_type_server_open_v80(msf, sn, strtab);\n  } break;\n  case PDB_TpiVersion_INTV_VC2:\n  case PDB_TpiVersion_IMPV40:\n  case PDB_TpiVersion_IMPV50_INTERIM:\n  case PDB_TpiVersion_IMPV70: {\n    NotImplemented;\n  } break;\n  default: Assert(!\"unknown TPI version\"); break;\n  }\n  \n  ProfEnd();\n  return ts;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(pdb_write_type_to_bucket_map_32_task)\n{\n  PDB_WriteTypeToBucketMap *task = raw_task;\n\n  U64 bucket_idx   = task_id;\n  U32 bucket_idx32 = safe_cast_u32(bucket_idx);\n\n  PDB_TypeServer *ts   = task->ts;\n  PDB_TypeBucket *head = ts->buckets[bucket_idx];\n  for (PDB_TypeBucket *bucket = head; bucket != 0; bucket = bucket->next) {\n    Assert(bucket->type_index >= ts->ti_lo);\n    Assert(bucket->type_index - ts->ti_lo < ts->leaf_list.node_count);\n    CV_TypeIndex type_idx = bucket->type_index - ts->ti_lo;\n    Assert(task->map[type_idx] == 0);\n    task->map[type_idx] = bucket_idx32;\n  }\n}\n\ninternal PDB_TypeHashStreamInfo\npdb_type_hash_stream_build(TP_Context      *tp,\n                           PDB_TypeServer  *ts,\n                           PDB_StringTable *strtab,\n                           MSF_Context     *msf,\n                           PDB_TpiOffHint  *hint_arr,\n                           U64              hint_count)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  // write (type index -> bucket index) map\n  //\n  // zero-out entire map so non-UDTs type indices, that are NOT in the hash table,\n  // map to zero offset\n  U32 *type_to_bucket_map = push_array(scratch.arena, U32, ts->leaf_list.node_count);\n  {\n    ProfBegin(\"Bucket Map\");\n    PDB_WriteTypeToBucketMap type_to_bucket_task;\n    type_to_bucket_task.ts  = ts;\n    type_to_bucket_task.map = type_to_bucket_map;\n    tp_for_parallel(tp, 0, ts->bucket_cap, pdb_write_type_to_bucket_map_32_task, &type_to_bucket_task);\n    ProfEnd();\n  }\n\n  // write bucket adjust info\n  String8 hash_adj_data = pdb_data_from_hash_adj_hash_table(scratch.arena, &ts->hash_adj, strtab);\n  \n  ProfBegin(\"MSF Write\");\n\n  // write data to stream\n  if (ts->hash_sn == MSF_INVALID_STREAM_NUMBER) {\n    ts->hash_sn = msf_stream_alloc(msf);\n  }\n  msf_stream_seek_start(msf, ts->hash_sn);\n\n  PDB_OffsetSize hash_vals;\n  hash_vals.off  = msf_stream_get_pos(msf, ts->hash_sn);\n  hash_vals.size = sizeof(type_to_bucket_map[0]) * ts->leaf_list.node_count;\n  msf_stream_write(msf, ts->hash_sn, &type_to_bucket_map[0], hash_vals.size);\n  \n  PDB_OffsetSize hint_offs;\n  hint_offs.off  = msf_stream_get_pos(msf, ts->hash_sn);\n  hint_offs.size = sizeof(hint_arr[0]) * hint_count;\n  msf_stream_write(msf, ts->hash_sn, &hint_arr[0], hint_offs.size);\n  \n  PDB_OffsetSize hash_adj;\n  hash_adj.off  = msf_stream_get_pos(msf, ts->hash_sn);\n  hash_adj.size = hash_adj_data.size;\n  msf_stream_write_string(msf, ts->hash_sn, hash_adj_data);\n\n  ProfEnd();\n  \n  // fill out result\n  PDB_TypeHashStreamInfo result;\n  result.hash_vals = hash_vals;\n  result.ti_offs   = hint_offs;\n  result.hash_adj  = hash_adj;\n\n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(pdb_write_types_task)\n{\n  ProfBeginFunction();\n\n  PDB_WriteTypesTask *task = raw_task;\n\n  String8Node *node   = task->lf_arr[task_id];\n  Rng1U64      range  = task->lf_range_arr[task_id];\n  U64          cursor = task->lf_cursor_arr[task_id];\n\n  for (U64 lf_idx = range.min; lf_idx < range.max; node = node->next, lf_idx += 1) {\n    if (lf_idx % PDB_TYPE_HINT_STEP == 0) {\n      U64 off_idx = lf_idx / PDB_TYPE_HINT_STEP;\n      Assert(off_idx < task->hint_count);\n      Assert(cursor < PDB_TYPE_OFFSET_MAX);\n      task->hint_arr[off_idx].itype = task->ti_lo + lf_idx;\n      task->hint_arr[off_idx].off   = (PDB_TypeOffset)cursor;\n    }\n\n    // copy leaf data\n    MemoryCopy(task->lf_buf + cursor, node->string.str, node->string.size);\n    cursor += node->string.size;\n  }\n\n  ProfEnd();\n}\n\ninternal void\npdb_type_server_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  ProfBeginDynamic(\"Prepare Buffers [Leaf Count: %llu]\", ts->leaf_list.node_count);\n\n  U64             hint_count    = CeilIntegerDiv(ts->leaf_list.node_count, PDB_TYPE_HINT_STEP);\n  PDB_TpiOffHint *hint_arr      = push_array_no_zero(scratch.arena, PDB_TpiOffHint, hint_count);\n  String8Node   **lf_arr        = push_array_no_zero(scratch.arena, String8Node *, tp->worker_count);\n  U64            *lf_cursor_arr = push_array_no_zero(scratch.arena, U64, tp->worker_count);\n  Rng1U64        *lf_range_arr  = tp_divide_work(scratch.arena, ts->leaf_list.node_count, tp->worker_count);\n\n  U64 lf_buf_size = 0;\n  U64 lf_node_idx = 0;\n  U64 lf_arr_idx  = 0;\n  for (String8Node *lf = ts->leaf_list.first; lf != 0; lf = lf->next) {\n    if (lf_node_idx == lf_range_arr[lf_arr_idx].min) { // :thread_pool_dummy_range\n      lf_cursor_arr[lf_arr_idx] = lf_buf_size;\n      lf_arr[lf_arr_idx]        = lf;\n      lf_arr_idx += 1;\n    }\n    lf_buf_size += lf->string.size;\n    lf_node_idx += 1;\n  }\n\n  ProfEnd();\n\n  ProfBegin(\"Write Type Data & Hints\");\n\n  PDB_WriteTypesTask write_types_task;\n  write_types_task.ti_lo         = ts->ti_lo;\n  write_types_task.ti_hi         = ts->ti_lo + ts->leaf_list.node_count;\n  write_types_task.hint_count    = hint_count;\n  write_types_task.hint_arr      = hint_arr;\n  write_types_task.lf_arr        = lf_arr;\n  write_types_task.lf_range_arr  = lf_range_arr;\n  write_types_task.lf_cursor_arr = lf_cursor_arr;\n  write_types_task.lf_buf        = push_array_no_zero(scratch.arena, U8, lf_buf_size);\n  write_types_task.lf_buf_size   = lf_buf_size;\n  tp_for_parallel(tp, 0, tp->worker_count, pdb_write_types_task, &write_types_task);\n\n  ProfEnd();\n  \n  // build type lookup accelerator\n  PDB_TypeHashStreamInfo hash_stream_info = pdb_type_hash_stream_build(tp, ts, strtab, msf, hint_arr, hint_count);\n  \n  // fill out header\n  PDB_TpiHeader header;\n  header.version           = PDB_TpiVersion_IMPV80;\n  header.header_size       = sizeof(header);\n  header.ti_lo             = ts->ti_lo;\n  header.ti_hi             = ts->ti_lo + ts->leaf_list.node_count;\n  header.leaf_data_size    = safe_cast_u32(lf_buf_size);\n  header.hash_sn           = ts->hash_sn;\n  header.hash_sn_aux       = MSF_INVALID_STREAM_NUMBER;\n  header.hash_key_size     = sizeof(U32);\n  header.hash_bucket_count = ts->bucket_cap;\n  header.hash_vals         = hash_stream_info.hash_vals;\n  header.itype_offs        = hash_stream_info.ti_offs;\n  header.hash_adj          = hash_stream_info.hash_adj;\n  \n  // write type server to stream\n  ProfBegin(\"MSF Commit\");\n  msf_stream_seek_start(msf, sn);\n  msf_stream_write_struct(msf, sn, &header);\n  msf_stream_write_parallel(tp, msf, sn, write_types_task.lf_buf, lf_buf_size);\n  ProfEnd();\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\npdb_type_server_release(PDB_TypeServer **ts_ptr)\n{\n  ProfBeginFunction();\n  arena_release((*ts_ptr)->arena);\n  *ts_ptr = 0;\n  ProfEnd();\n}\n\ninternal String8Node *\npdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data)\n{\n  ProfBeginFunction();\n\n  String8      leaf = cv_serialize_raw_leaf(ts->arena, kind, data, PDB_LEAF_ALIGN);\n  String8Node *node = str8_list_push(ts->arena, &ts->leaf_list, leaf);\n  \n  ProfEnd();\n  return node;\n}\n\ninternal U32\npdb_type_server_hash(String8 data)\n{\n  U32 hash = pdb_hash_v1(data);\n  return hash;\n}\n\ninternal PDB_TypeBucket *\npdb_type_server_push_udt_arr(PDB_TypeServer *ts, U64 count, U32 *hash_arr, String8 *raw_leaf_arr)\n{\n  // check if type server already contains this leaf and if so move\n  // it to the head of bucket list. \n#if 0\n  B32 is_udt = pdb_is_udt(kind);\n  if (is_udt) {\n    PDB_UDTInfo udt_info = pdb_get_udt_info(kind, data);\n    U32 udt_hash = pdb_hash_udt(udt_info, data) % ts->bucket_count;\n    U64 match_count = 0;\n    for (PDB_TypeBucket *curr = ts->bucket_table[udt_hash], *prev = NULL;\n         curr != NULL;\n         prev = curr, curr = curr->next) {\n      if (curr->leaf->kind == kind) {\n        PDB_UDTInfo this_udt_info = pdb_get_udt_info(curr->leaf->kind, curr->leaf->data);\n        if (str8_match(udt_info.name, this_udt_info.name)) {\n          B32 is_data_match = curr->leaf->data.size == data.size &&\n            MemoryCompare(curr->leaf->data.str, data.str, data.size) == 0;\n          if (is_data_match) {\n            B32 is_not_head = (match_count > 0);\n            if (is_not_head) {\n              // move bucket to head\n              prev->next = curr->next;\n              curr->next = ts->bucket_table[udt_hash];\n              ts->bucket_table[udt_hash] = curr;\n              \n              // update hash adjust\n              pdb_hash_table_delete(&ts->hash_adj, udt_info.name);\n              pdb_hash_table_set(&ts->hash_adj, udt_info.name, str8((U8*)&curr->leaf->type_index, sizeof(curr->leaf->type_index)));\n            }\n            \n            return curr->leaf;\n          }\n          match_count += 1;\n        }\n      }\n    }\n  }\n#endif\n  \n  PDB_TypeBucket *bucket_arr = push_array_no_zero(ts->arena, PDB_TypeBucket, count);\n\n  for (U64 leaf_idx = 0; leaf_idx < count; leaf_idx += 1) {\n    U32     hash     = hash_arr[leaf_idx];\n    String8 raw_leaf = raw_leaf_arr[leaf_idx];\n\n    CV_Leaf leaf = cv_leaf_from_string(raw_leaf);\n\n    // make sure we push a complete UDT\n    Assert(cv_is_udt(leaf.kind));\n    Assert(!(cv_get_udt_info(leaf.kind, leaf.data).props & CV_TypeProp_FwdRef));\n\n    PDB_TypeBucket *bucket = &bucket_arr[leaf_idx];\n    bucket->next       = 0;\n    bucket->raw_leaf   = raw_leaf;\n    bucket->type_index = ts->ti_lo + ts->leaf_list.node_count + leaf_idx;\n\n    U32 bucket_idx = hash % ts->bucket_cap;\n    SLLStackPush(ts->buckets[bucket_idx], bucket);\n  }\n\n  return bucket_arr;\n}\n\ninternal PDB_TypeBucket *\npdb_type_server_push_udt(PDB_TypeServer *ts, U32 hash, String8 raw_leaf)\n{\n  return pdb_type_server_push_udt_arr(ts, 1, &hash, &raw_leaf);\n}\n\ninternal void\npdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf)\n{\n  ProfBeginFunction();\n\n  CV_Leaf leaf;\n  cv_deserial_leaf(raw_leaf, 0, 1, &leaf);\n\n  if (cv_is_udt(leaf.kind)) {\n    CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n    B32 is_complete = !(udt_info.props & CV_TypeProp_FwdRef);\n    if (is_complete) {\n      U32 hash = pdb_hash_udt(udt_info, leaf.data);\n      pdb_type_server_push_udt(ts, hash, raw_leaf);\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(pdb_count_udt_task)\n{\n  PDB_PushLeafTask *task  = raw_task;\n  Rng1U64           range = task->ranges[task_id];\n  for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(task->debug_t, leaf_idx);\n    if (cv_is_udt(leaf.kind)) {\n      CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n      if (~udt_info.props & CV_TypeProp_FwdRef) {\n        ++task->udt_counts[task_id];\n      }\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(pdb_push_udt_leaf_task)\n{\n  PDB_PushLeafTask *task          = raw_task;\n  PDB_TypeServer   *type_server   = task->type_server;\n  Rng1U64           range         = task->ranges[task_id];\n  U64               bucket_cursor = task->udt_offsets[task_id];\n  CV_DebugT         debug_t       = task->debug_t;\n  PDB_TypeBucket   *new_buckets   = task->udt_buckets;\n\n  U64              type_ht_cap     = type_server->bucket_cap;\n  PDB_TypeBucket **type_ht_buckets = type_server->buckets;\n  U64              base_type_index = type_server->ti_lo + type_server->leaf_list.node_count;\n\n  for (U64 leaf_idx = range.min; leaf_idx < range.max; ++leaf_idx) {\n    CV_Leaf leaf = cv_debug_t_get_leaf(debug_t, leaf_idx);\n    if (cv_is_udt(leaf.kind)) {\n      CV_UDTInfo udt_info = cv_get_udt_info(leaf.kind, leaf.data);\n      if (~udt_info.props & CV_TypeProp_FwdRef) {\n        // hash udt and compute bucket index\n        U32 hash = pdb_hash_udt(udt_info, leaf.data);\n        U32 bucket_idx = hash % type_ht_cap;\n\n        // fill out & insert bucket\n        PDB_TypeBucket *bucket = &new_buckets[bucket_cursor++];\n        bucket->raw_leaf       = cv_debug_t_get_raw_leaf(debug_t, leaf_idx);\n        bucket->type_index     = base_type_index + leaf_idx;\n        bucket->next           = ins_atomic_ptr_eval_assign(&type_ht_buckets[bucket_idx], bucket);\n      }\n    }\n  }\n}\n\ninternal void\npdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *type_server, CV_DebugT debug_t)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n\n  PDB_PushLeafTask task = {0};\n  task.debug_t          = debug_t;\n  task.type_server      = type_server;\n  task.ranges           = tp_divide_work(scratch.arena, debug_t.count, tp->worker_count);\n\n  ProfBegin(\"Count UDT\");\n  task.udt_counts = push_array(scratch.arena, U64, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, pdb_count_udt_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Push UDT Leaves\");\n  U64 total_udt_count = sum_array_u64(tp->worker_count, task.udt_counts);\n  task.udt_offsets = offsets_from_counts_array_u64(scratch.arena, task.udt_counts, tp->worker_count);\n  task.udt_buckets = push_array_no_zero(type_server->arena, PDB_TypeBucket, total_udt_count);\n  tp_for_parallel(tp, 0, tp->worker_count, pdb_push_udt_leaf_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Append New Leaves\");\n  String8List new_leaves = cv_str8_list_from_debug_t_parallel(tp, type_server->arena, debug_t);\n  str8_list_concat_in_place(&type_server->leaf_list, &new_leaves);\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\n#if 0\ninternal CV_LeafNode *\npdb_type_server_leaf_from_string(PDB_TypeServer *ts, String8 string)\n{\n  ProfBeginFunction();\n  U32 hash = pdb_hash_v1(string);\n  U32 bucket_idx = hash % ts->bucket_count;\n  PDB_TypeBucket *head_bucket = ts->bucket_table[bucket_idx];\n  CV_LeafNode *result = 0;\n  for (PDB_TypeBucket *i = head_bucket; i != 0; i = i->next) {\n    CV_LeafNode *leaf = i->leaf_node;\n    String8 leaf_name = cv_get_leaf_name(leaf->data.kind, leaf->data.data);\n    if (str8_match(leaf_name, string, 0)) {\n      result = leaf;\n      break;\n    }\n  }\n  ProfEnd();\n  return result;\n}\n#endif\n\n////////////////////////////////\n\n#if 0\ninternal PDB_TypeIndexMap *\npdb_load_types_from_leaf_list(PDB_TypeServer **type_server_arr, CV_LeafList leaf_list)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  // 1. redistribute leaves in parallel\n  CV_LeafList leaf_list_arr[CV_TypeIndexSource_COUNT] = {0};\n  for (CV_LeafNode *curr = leaf_list.first, *next = 0; curr != 0; curr = next) {\n    next = curr->next;\n    curr->next = 0;\n    CV_TypeIndexSource ti_source = cv_type_index_source_from_leaf_kind(curr->data.kind);\n    CV_LeafList *list = &leaf_list_arr[ti_source];\n    SLLQueuePush(list->first, list->last, curr);\n    list->count += 1;\n  }\n  \n  // 2. reserve type leafs on main thread\n  PDB_TypeLeaf *leaf_arr_arr[CV_TypeIndexSource_COUNT];\n  for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) {\n    PDB_TypeServer *type_server = type_server_arr[source_idx];\n    CV_LeafList input_leaf_list = leaf_list_arr[source_idx];\n    PDB_TypeLeaf *leaf_arr = pdb_type_server_reserve(type_server, input_leaf_list.count);\n    leaf_arr_arr[source_idx] = leaf_arr;\n  }\n  \n  // 3. populate type index map in parallel\n  PDB_TypeIndexMap *ti_map = pdb_type_index_map_alloc();\n  for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) {\n    CV_LeafList input_leaf_list = leaf_list_arr[source_idx];\n    PDB_TypeLeaf *leaf_arr = leaf_arr_arr[source_idx];\n    for (U64 leaf_idx = 0; leaf_idx < input_leaf_list.count; leaf_idx += 1) {\n      CV_TypeIndex external_ti = ti_map->min_itype[source_idx] + leaf_idx;\n      CV_TypeIndex internal_ti = leaf_arr[leaf_idx].type_index;\n      pdb_type_index_map_add(ti_map, (CV_TypeIndexSource)source_idx, external_ti, internal_ti);\n    }\n  }\n  \n  // 4. patch type indices in parallel\n  for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) {\n    CV_LeafList list = leaf_list_arr[source_idx];\n    for (CV_LeafNode *node = list.first; node != 0; node = node->next) {\n      Temp temp = temp_begin(scratch.arena);\n      \n      // get offsets for type indices in data blob\n      CV_Leaf *leaf = &node->data;\n      CV_TypeIndexInfoList ti_info_list = cv_get_leaf_type_index_offsets(temp.arena, leaf->kind, leaf->data);\n      \n      for (CV_TypeIndexInfo *ti_info = ti_info_list.first; ti_info != 0; ti_info = ti_info->next) {\n        Assert(ti_info->offset + sizeof(CV_TypeIndex) <= leaf->data.size);\n        CV_TypeIndex *ti_ptr = (CV_TypeIndex *)(leaf->data.str + ti_info->offset);\n        CV_TypeIndex external_ti = *ti_ptr;\n        \n        B32 is_complex_type = external_ti >= ti_map->min_itype[ti_info->source];\n        if (is_complex_type) {\n          // search external type index\n          CV_TypeIndex internal_tpi_idx = pdb_type_index_map_search(ti_map, CV_TypeIndexSource_TPI, external_ti);\n          CV_TypeIndex internal_ipi_idx = pdb_type_index_map_search(ti_map, CV_TypeIndexSource_IPI, external_ti);\n          \n          // error checks\n          if (internal_tpi_idx == 0 && internal_ipi_idx == 0) {\n            lnk_invalid_path(\"unable to find match for external type index 0x%X\", external_ti);\n            continue;\n          }\n          if (internal_tpi_idx != 0 && internal_ipi_idx != 0) {\n            lnk_invalid_path(\"both TPI and IPI matched for external type index 0x%X\", external_ti);\n            continue;\n          }\n          \n          // rewrite index\n          CV_TypeIndex internal_ti = internal_tpi_idx ? internal_tpi_idx : internal_ipi_idx;\n          *ti_ptr = internal_ti;\n        }\n      }\n      \n      temp_end(temp);\n    }\n  }\n  \n  // 5. push types to hash table on main thread\n  for (U64 source_idx = 0; source_idx < ArrayCount(leaf_list_arr); source_idx += 1) {\n    PDB_TypeServer *type_server = type_server_arr[source_idx];\n    CV_LeafList list = leaf_list_arr[source_idx];\n    PDB_TypeLeaf *leaf_arr = leaf_arr_arr[source_idx];\n    U64 leaf_idx = 0;\n    for (CV_LeafNode *node = list.first; node != 0; node = node->next, leaf_idx += 1) {\n      CV_Leaf *external_leaf = &node->data;\n      \n      // move patched type data\n      PDB_TypeLeaf *internal_leaf = leaf_arr + leaf_idx;\n      internal_leaf->kind = external_leaf->kind;\n      internal_leaf->data = push_str8_copy(type_server->arena, external_leaf->data);\n      \n      // push leaf to type server\n      pdb_type_server_push_(type_server, internal_leaf);\n    }\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return ti_map;\n}\n#endif\n\n////////////////////////////////\n\ninternal PDB_InfoContext *\npdb_info_alloc(U32 age, COFF_TimeStamp time_stamp, Guid guid)\n{\n  ProfBeginFunction();\n  Arena *arena = arena_alloc();\n  PDB_InfoContext *info = push_array(arena, PDB_InfoContext, 1);\n  info->arena      = arena;\n  info->flags      = PDB_FeatureFlag_HAS_ID_STREAM;\n  info->time_stamp = time_stamp;\n  info->age        = age;\n  info->guid       = guid;\n  pdb_strtab_alloc(&info->strtab, 0x3fff);\n  pdb_hash_table_alloc(&info->named_stream_ht, 4);\n  pdb_hash_table_alloc(&info->src_header_block_ht, 8);\n  ProfEnd();\n  return info;\n}\n\ninternal void\npdb_info_parse_from_data(String8 data, PDB_InfoParse *parse_out)\n{\n  PDB_InfoVersion version = 0;\n  str8_deserial_read_struct(data, 0, &version);\n\n  switch (version) {\n  case PDB_InfoVersion_VC70: {\n    U64 cursor = 0;\n\n    // read header\n    PDB_InfoHeaderV70 header;\n    cursor += str8_deserial_read_struct(data, cursor, &header);\n\n    parse_out->version    = version;\n    parse_out->time_stamp = header.time_stamp;\n    parse_out->age        = header.age;\n    parse_out->guid       = header.guid;\n    parse_out->extra_info = str8_skip(data, cursor);\n  } break;\n  case PDB_InfoVersion_VC2:\n  case PDB_InfoVersion_VC4:\n  case PDB_InfoVersion_VC41:\n  case PDB_InfoVersion_VC50:\n  case PDB_InfoVersion_VC98:\n  case PDB_InfoVersion_VC70_DEP:\n  case PDB_InfoVersion_VC80:\n  case PDB_InfoVersion_VC110:\n  case PDB_InfoVersion_VC140: {\n      NotImplemented;\n  } break;\n  default: Assert(!\"invalid info stream version\"); break;\n  }\n}\n\ninternal PDB_InfoContext *\npdb_info_open(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n  \n  U64     info_size = msf_stream_get_size(msf, sn);\n  String8 info_data = msf_stream_read_block(scratch.arena, msf, sn, info_size);\n    \n  PDB_InfoParse parse = {0};\n  pdb_info_parse_from_data(info_data, &parse);\n\n  PDB_FeatureFlags flags           = 0;\n  PDB_HashTable    named_stream_ht = {0};\n  if (parse.version == PDB_InfoVersion_VC70) {\n    // open named stream hash table\n    U64 cursor = 0;\n    U64 named_stream_ht_size = 0;\n    PDB_HashTableParseError named_stream_ht_error = pdb_named_stream_ht_from_data(&named_stream_ht, parse.extra_info, &named_stream_ht_size);\n    if (named_stream_ht_error == PDB_HashTableParseError_OK) {\n      cursor += named_stream_ht_size;\n\n      // read PDB features\n      while (cursor < info_data.size) {\n        PDB_FeatureSig sig = 0;\n        cursor += str8_deserial_read_struct(parse.extra_info, cursor, &sig);\n        switch (sig) {\n        case PDB_FeatureSig_NULL: break;\n        case PDB_FeatureSig_VC140: {\n          flags |= PDB_FeatureFlag_HAS_ID_STREAM;\n        } break;\n        case PDB_FeatureSig_NO_TYPE_MERGE: {\n          flags |= PDB_FeatureFlag_NO_TYPE_MERGE;\n        } break;\n        case PDB_FeatureSig_MINIMAL_DEBUG_INFO: {\n          flags |= PDB_FeatureFlag_MINIMAL_DBG_INFO;\n        } break;\n        default: Assert(!\"unknown feature sig\"); break;\n        }\n      }\n    } else {\n      Assert(!\"unable to open named stream hash table\");\n    }\n  }\n\n  // open string table\n  PDB_StringTable strtab = {0};\n  MSF_StreamNumber strtab_sn = pdb_find_named_stream(&named_stream_ht, PDB_NAMES_STREAM_NAME);\n  if (strtab_sn != MSF_INVALID_STREAM_NUMBER) {\n    PDB_StringTableOpenError err = pdb_strtab_open(&strtab, msf, strtab_sn);\n    Assert(err == PDB_StringTableOpenError_OK);\n  }\n\n  // open injected source files\n  PDB_HashTable src_header_block_ht = {0};\n  MSF_StreamNumber src_header_block_sn = pdb_find_named_stream(&named_stream_ht, PDB_SRC_HEADER_BLOCK_STREAM_NAME);\n  if (src_header_block_sn != MSF_INVALID_STREAM_NUMBER) {\n    U64 src_header_block_stream_size = msf_stream_get_size(msf, src_header_block_sn);\n    String8 src_header_block_data = msf_stream_read_block(scratch.arena, msf, src_header_block_sn, src_header_block_stream_size);\n    PDB_HashTableParseError err = pdb_src_header_block_ht_from_data(&src_header_block_ht, src_header_block_data, &strtab, 0);\n    Assert(err == PDB_HashTableParseError_OK);\n  }\n    \n  // fill out info\n  Arena *arena = arena_alloc();\n  PDB_InfoContext *info = push_array_no_zero(arena, PDB_InfoContext, 1);\n  info->arena               = arena;\n  info->time_stamp          = parse.time_stamp;\n  info->age                 = parse.age;\n  info->guid                = parse.guid;\n  info->flags               = flags;\n  info->named_stream_ht     = named_stream_ht;\n  info->src_header_block_ht = src_header_block_ht;\n  info->strtab              = strtab;\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return info;\n}\n\ninternal void\npdb_info_build_src_header_block(PDB_InfoContext *info, MSF_Context *msf)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  // was stream allocated?\n  MSF_StreamNumber src_header_block_sn = pdb_find_named_stream(&info->named_stream_ht, PDB_SRC_HEADER_BLOCK_STREAM_NAME);\n  if (src_header_block_sn == MSF_INVALID_STREAM_NUMBER) {\n    src_header_block_sn = pdb_push_named_stream(&info->named_stream_ht, msf, PDB_SRC_HEADER_BLOCK_STREAM_NAME);\n  }\n\n  // build the hash table\n  String8 hash_table_data = pdb_data_from_src_header_block_ht(scratch.arena, &info->src_header_block_ht, &info->strtab);\n  AssertAlways(hash_table_data.size);\n\n  // compute stream size \n  U64 src_header_stream_size = 0;\n  src_header_stream_size += sizeof(PDB_SrcHeaderBlockHeader);\n  src_header_stream_size += hash_table_data.size;\n\n  // fill out header\n  PDB_SrcHeaderBlockHeader src_header;\n  src_header.version     = PDB_SRC_HEADER_BLOCK_MAGIC_V1;\n  src_header.stream_size = src_header_stream_size;\n  src_header.file_time   = 0;\n  src_header.age         = 0;\n  MemoryZeroStruct(&src_header.pad);\n\n  // write to stream\n  B32 is_header_written = msf_stream_write_struct(msf, src_header_block_sn, &src_header);\n  B32 is_hash_table_written = msf_stream_write_string(msf, src_header_block_sn, hash_table_data);\n  AssertAlways(is_header_written);\n  AssertAlways(is_hash_table_written);\n  AssertAlways(msf_stream_get_size(msf, src_header_block_sn) == src_header.stream_size);\n\n  scratch_end(scratch);\n}\n\ninternal void\npdb_info_build_link_info(PDB_InfoContext *info, MSF_Context *msf)\n{\n  MSF_StreamNumber linkinfo_sn = pdb_find_named_stream(&info->named_stream_ht, PDB_LINK_INFO_STREAM_NAME);\n  if (linkinfo_sn == MSF_INVALID_STREAM_NUMBER) {\n    linkinfo_sn = pdb_push_named_stream(&info->named_stream_ht, msf, PDB_LINK_INFO_STREAM_NAME);\n  }\n  // TODO: populate LINKINFO\n}\n\ninternal void\npdb_info_build_names(PDB_InfoContext *info, MSF_Context *msf)\n{\n  MSF_StreamNumber strtab_sn = pdb_find_named_stream(&info->named_stream_ht, PDB_NAMES_STREAM_NAME);\n  if (strtab_sn == MSF_INVALID_STREAM_NUMBER) {\n    strtab_sn = pdb_push_named_stream(&info->named_stream_ht, msf, PDB_NAMES_STREAM_NAME);\n  }\n  pdb_strtab_build(&info->strtab, msf, strtab_sn);\n}\n\ninternal void\npdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  // finalize named streams\n  pdb_info_build_src_header_block(info, msf);\n  pdb_info_build_link_info(info, msf);\n  pdb_info_build_names(info, msf);\n\n  // serialize named streams hash table\n  String8 named_stream_ht_data = pdb_data_from_named_stream_ht(scratch.arena, &info->named_stream_ht);\n  \n  // fill out header\n  PDB_InfoHeaderV70 header;\n  header.version    = PDB_InfoVersion_VC70;\n  header.time_stamp = info->time_stamp;\n  header.age        = info->age;\n  header.guid       = info->guid;\n\n  // layout info stream\n  String8List info_srl = {0};\n  str8_serial_begin(scratch.arena, &info_srl);\n  str8_serial_push_struct(scratch.arena, &info_srl, &header);\n  str8_serial_push_string(scratch.arena, &info_srl, named_stream_ht_data);\n  if (info->flags & PDB_FeatureFlag_HAS_ID_STREAM) {\n    str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_VC140);\n  }\n  if (info->flags & PDB_FeatureFlag_NO_TYPE_MERGE) {\n    str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_NO_TYPE_MERGE);\n  }\n  if (info->flags & PDB_FeatureFlag_MINIMAL_DBG_INFO) {\n    str8_serial_push_u32(scratch.arena, &info_srl, PDB_FeatureSig_MINIMAL_DEBUG_INFO);\n  }\n\n  // write info to MSF\n  msf_stream_seek_start(msf, sn);\n  msf_stream_resize(msf, sn, info_srl.total_size);\n  msf_stream_write_list(msf, sn, info_srl);\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\npdb_info_release(PDB_InfoContext **info_ptr)\n{\n  ProfBeginFunction();\n  arena_release((*info_ptr)->arena);\n  *info_ptr = NULL;\n  ProfEnd();\n}\n\ninternal MSF_StreamNumber\npdb_push_named_stream(PDB_HashTable *named_stream_ht, MSF_Context *msf, String8 name)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n  MSF_StreamNumber sn = msf_stream_alloc(msf);\n  String8 name_cstr = push_cstr(scratch.arena, name);\n  U32 sn32 = (U32)sn;\n  pdb_hash_table_set(named_stream_ht, name_cstr, str8_struct(&sn32));\n  scratch_end(scratch);\n  ProfEnd();\n  return sn;\n}\n\ninternal MSF_StreamNumber\npdb_find_named_stream(PDB_HashTable *named_stream_ht, String8 name)\n{\n  ProfBeginFunction();\n  MSF_StreamNumber result = MSF_INVALID_STREAM_NUMBER;\n  String8 value;\n  if (pdb_hash_table_get(named_stream_ht, name, &value)) {\n    Assert(value.size == sizeof(U32));\n    result = *(MSF_StreamNumber*)value.str;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal PDB_SrcError\npdb_add_src(PDB_InfoContext *info, MSF_Context *msf, String8 file_path, String8 file_data, PDB_SrcCompType comp)\n{\n  Temp scratch = scratch_begin(0,0);\n  PDB_SrcError error_status = PDB_SrcError_UNKNOWN;\n\n  if (comp == PDB_SrcComp_NULL) {\n    // process path so it passes VS validity checks\n    String8 virt_path = file_path;\n    String8 work_dir = os_get_current_path(scratch.arena);\n    virt_path = path_absolute_dst_from_relative_dst_src(scratch.arena, virt_path, work_dir);\n    virt_path = lower_from_str8(scratch.arena, virt_path);\n    virt_path = path_convert_slashes(scratch.arena, virt_path, PathStyle_UnixAbsolute);\n\n    String8 dummy_value;\n    B32 is_virt_path_present = pdb_hash_table_get(&info->src_header_block_ht, virt_path, &dummy_value);\n    if (!is_virt_path_present) {\n      String8 stream_name = push_str8f(scratch.arena, \"/src/files/%S\", virt_path);\n      MSF_StreamNumber sn = pdb_find_named_stream(&info->named_stream_ht, stream_name);\n      B32 is_name_free = (sn == MSF_INVALID_STREAM_NUMBER);\n      if (is_name_free) {\n        sn = pdb_push_named_stream(&info->named_stream_ht, msf, stream_name);\n        B32 is_file_data_written = msf_stream_write_string(msf, sn, file_data);\n        if (is_file_data_written) {\n          // add command line path\n          PDB_StringIndex file_path_stridx;\n          if (!pdb_strtab_search(&info->strtab, file_path, &file_path_stridx)) {\n            file_path_stridx = pdb_strtab_add(&info->strtab, file_path);\n          }\n\n          // add virtual path\n          PDB_StringIndex virt_path_stridx;\n          if (!pdb_strtab_search(&info->strtab, virt_path, &virt_path_stridx)) {\n            virt_path_stridx = pdb_strtab_add(&info->strtab, virt_path);\n          }\n\n          // string indices -> offsets\n          PDB_StringOffset file_path_stroff = pdb_strtab_string_to_offset(&info->strtab, file_path_stridx);\n          PDB_StringOffset virt_path_stroff = pdb_strtab_string_to_offset(&info->strtab, virt_path_stridx);\n\n          // fill out entry\n          PDB_SrcHeaderBlockEntry entry;\n          entry.size      = sizeof(entry);\n          entry.version   = PDB_SRC_HEADER_BLOCK_MAGIC_V1;\n          entry.file_crc  = pdb_crc32_from_string(file_data);\n          entry.file_size = file_data.size;\n          entry.file_path = file_path_stroff;\n          entry.obj       = 0; // null string offset\n          entry.virt_path = virt_path_stroff;\n          entry.comp      = comp;\n          entry.flags     = 0;\n          MemorySet(&entry.pad[0], 0, sizeof(entry.pad));\n          MemorySet(&entry.reserved[0], 0, sizeof(entry.reserved));\n\n          // add to hash table { path, entry }\n          String8 key = virt_path;\n          String8 val = str8_struct(&entry);\n          pdb_hash_table_set(&info->src_header_block_ht, key, val);\n\n          error_status = PDB_SrcError_OK;\n        } else {\n          error_status = PDB_SrcError_UNABLE_TO_WRITE_DATA;\n        }\n      } else {\n        error_status = PDB_SrcError_DUPLICATE_NAME_STREAM;\n      }\n    } else {\n      error_status = PDB_SrcError_DUPLICATE_ENTRY;\n    }\n  } else {\n    error_status = PDB_SrcError_UNSUPPORTED_COMPRESSION;\n  }\n\n  scratch_end(scratch);\n  return error_status;\n}\n\n////////////////////////////////\n\ninternal PDB_GsiContext *\ngsi_alloc(void)\n{\n  ProfBeginFunction();\n  Arena *arena = arena_alloc();\n  PDB_GsiContext *gsi  = push_array(arena, PDB_GsiContext, 1);\n  gsi->arena        = arena;\n  gsi->word_size    = PDB_GSI_V70_WORD_SIZE;\n  gsi->symbol_align = PDB_GSI_V70_SYMBOL_ALIGN;\n  gsi->bucket_count = PDB_GSI_V70_BUCKET_COUNT;\n  gsi->bucket_arr   = push_array(arena, CV_SymbolList, gsi->bucket_count);\n  ProfEnd();\n  return gsi;\n}\n\ninternal PDB_GsiContext *\ngsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data)\n{\n  ProfBeginFunction();\n  \n  PDB_GsiHeader header = {0};\n  msf_stream_read_struct(msf, sn, &header);\n  \n  Arena *arena = arena_alloc();\n  PDB_GsiContext *gsi = push_array(arena, PDB_GsiContext, 1);\n  gsi->arena        = arena;\n  gsi->word_size    = PDB_GSI_V70_WORD_SIZE;\n  gsi->symbol_align = PDB_GSI_V70_SYMBOL_ALIGN;\n  gsi->bucket_count = PDB_GSI_V70_BUCKET_COUNT;\n  gsi->bucket_arr   = push_array(gsi->arena, CV_SymbolList, gsi->bucket_count);\n  \n  if (header.signature == PDB_GsiSignature_Basic) {\n    if (header.version == PDB_GsiVersion_V70) {\n      Temp scratch = scratch_begin(0, 0);\n      \n      Assert(header.bucket_data_size >= PDB_GSI_V70_BITMAP_SIZE); // TODO: error handle\n      \n      U64 hash_record_count = header.hash_record_arr_size / sizeof(PDB_GsiHashRecord);\n      PDB_GsiHashRecord *hash_record_array = push_array(scratch.arena, PDB_GsiHashRecord, hash_record_count);\n      msf_stream_read_array(msf, sn, &hash_record_array[0], hash_record_count);\n      \n      U32 *bitmap = push_array(scratch.arena, U32, PDB_GSI_V70_BITMAP_COUNT);\n      msf_stream_read_array(msf, sn, &bitmap[0], PDB_GSI_V70_BITMAP_COUNT);\n      \n      U32 compressed_offset_count = (header.bucket_data_size - PDB_GSI_V70_BITMAP_SIZE) / sizeof(U32);\n      U32 *compressed_offset_array = push_array(scratch.arena, U32, compressed_offset_count);\n      msf_stream_read_array(msf, sn, &compressed_offset_array[0], compressed_offset_count);\n      \n      U32 *compressed_offset_ptr = &compressed_offset_array[0];\n      U32 *compressed_offset_opl = &compressed_offset_array[0] + compressed_offset_count;\n      \n      U32 compressed_offset_max = (header.bucket_data_size / sizeof(PDB_GsiHashRecord)) * sizeof(PDB_GsiHashRecordOffsetCalc);\n      \n      for (U32 imask = 0; imask < PDB_GSI_V70_BITMAP_COUNT; imask += 1) {\n        for (U32 ibit = 0; ibit < PDB_GSI_V70_WORD_SIZE; ibit += 1) {\n          B32 is_bucket_compressed = !!(bitmap[imask] & (1 << ibit));\n          if (is_bucket_compressed) {\n            Assert(compressed_offset_ptr < compressed_offset_opl);\n            \n            U32 next_compressed_offset = compressed_offset_max;\n            if (compressed_offset_ptr + 1 < compressed_offset_opl) {\n              next_compressed_offset = compressed_offset_ptr[1];\n            }\n            U32 compressed_count = (next_compressed_offset - *compressed_offset_ptr) / sizeof(PDB_GsiHashRecordOffsetCalc);\n            \n            U64 hash_record_index = *compressed_offset_ptr / sizeof(PDB_GsiHashRecordOffsetCalc);\n            Assert(hash_record_index < hash_record_count);\n            \n            for (PDB_GsiHashRecord *hash_record_ptr = &hash_record_array[hash_record_index], *hash_record_opl = hash_record_ptr + compressed_count;\n                 hash_record_ptr < hash_record_opl;\n                 hash_record_ptr += 1) {\n              Assert(hash_record_ptr->symbol_off > 0);\n              Assert(hash_record_ptr->cref > 0);\n              \n              U32 symbol_off = hash_record_ptr->symbol_off -1;\n              U8 *symbol_ptr = symbol_data.str + symbol_off;\n              U16 *size_ptr = (U16*)symbol_ptr;\n              CV_SymKind *kind_ptr = (CV_SymKind*)(size_ptr + 1);\n              U8 *data_ptr = (U8*)(kind_ptr + 1);\n              \n              if (*size_ptr >= sizeof(*kind_ptr)) {\n                CV_Symbol symbol;\n                symbol.kind = *kind_ptr;\n                symbol.data = str8(data_ptr, *size_ptr - sizeof(*kind_ptr));\n                gsi_push(gsi, &symbol);\n              } else {\n                Assert(!\"invalid global codeview symbol\");\n              }\n            }\n            \n            compressed_offset_ptr += 1;\n          }\n        }\n      }\n      \n      scratch_end(scratch);\n    } else {\n      Assert(!\"unknown GSI version\");\n    }\n  }\n  \n  // check if buckets are sorted\n#if 0\n  {\n    for (U64 i = 0; i < gsi->bucket_count; ++i) {\n      CV_SymbolList *bucket = &gsi->bucket_arr[i];\n      for (CV_SymbolNode *prev = bucket->first, *curr = bucket->first ? bucket->first->next : NULL;\n           curr != NULL;\n           prev = curr, curr = curr->next) {\n        String8 a = pdb_get_symbol_name(prev->symbol.kind, prev->symbol.data);\n        String8 b = pdb_get_symbol_name(curr->symbol.kind, curr->symbol.data);\n        int compar = string_compar(a, b, false);\n        Assert(compar >= 0);\n      }\n    }\n  }\n#endif\n  \n  ProfEnd();\n  return gsi;\n}\n\ninternal void\ngsi_release(PDB_GsiContext **gsi_ptr)\n{\n  ProfBeginFunction();\n  arena_release((*gsi_ptr)->arena);\n  *gsi_ptr = NULL;\n  ProfEnd();\n}\n\ninternal void\ngsi_write_build_result(TP_Context         *tp,\n                       PDB_GsiBuildResult  build,\n                       MSF_Context        *msf,\n                       MSF_StreamNumber    gsi_sn,\n                       MSF_StreamNumber    symbols_sn)\n{\n  ProfBeginFunction();\n\n  U64 hash_record_arr_size       = sizeof(build.hash_record_arr[0])       * build.hash_record_count;\n  U64 bitmap_size                = sizeof(build.bitmap[0])                * build.bitmap_count;\n  U64 compressed_bucket_arr_size = sizeof(build.compressed_bucket_arr[0]) * build.compressed_bucket_count;\n  U64 gsi_size                   = sizeof(build.header) + hash_record_arr_size + bitmap_size + compressed_bucket_arr_size;\n  \n  ProfBeginV(\"Reserve %M for GSI hash table\", gsi_size);\n  msf_stream_reserve(msf, gsi_sn, gsi_size);\n  ProfEnd();\n\n  ProfBeginV(\"Reserve %M for symbols\", build.symbol_data.size);\n  msf_stream_reserve(msf, symbols_sn, build.symbol_data.size);\n  ProfEnd();\n\n  ProfBegin(\"Write GSI header\");\n  msf_stream_write_struct(msf, gsi_sn, &build.header);\n  ProfEnd();\n\n  ProfBegin(\"Write hash records [%M]\", hash_record_arr_size);\n  msf_stream_write_parallel(tp, msf, gsi_sn, &build.hash_record_arr[0], hash_record_arr_size);\n  ProfEnd();\n\n  ProfBeginV(\"Write bucket bitmap [%M]\", bitmap_size);\n  msf_stream_write(msf, gsi_sn, &build.bitmap[0], bitmap_size);\n  ProfEnd();\n\n  ProfBegin(\"Write buckets [%M]\", compressed_bucket_arr_size);\n  msf_stream_write(msf, gsi_sn, &build.compressed_bucket_arr[0], compressed_bucket_arr_size);\n  ProfEnd();\n  \n  ProfBegin(\"Write symbols [%M]\", build.symbol_data.size);\n  msf_stream_write_string_parallel(tp, msf, symbols_sn, build.symbol_data);\n  ProfEnd();\n\n  ProfEnd();\n}\n\ninternal int\ngsi_hash_record_compar_is_before(void *raw_a, void *raw_b)\n{\n  PDB_GsiSortRecord *a = raw_a;\n  PDB_GsiSortRecord *b = raw_b;\n\n  int is_before;\n  if (a->name.size != b->name.size) {\n    is_before = a->name.size < b->name.size;\n  } else {\n    int cmp = str8_compar_ignore_case(&a->name, &b->name);\n    if (cmp == 0) {\n      cmp = u64_compar(&a->offset, &b->offset);\n    }\n    is_before = cmp < 0;\n  }\n\n  return is_before;\n}\n\ninternal int\npsi_addr_map_compar_is_before(void *raw_a, void *raw_b)\n{\n  PDB_GsiSortRecord *a = raw_a;\n  PDB_GsiSortRecord *b = raw_b;\n\n  int is_before;\n  if (a->isect_off.isect != b->isect_off.isect) {\n    is_before = a->isect_off.isect < b->isect_off.isect;\n  } else if (a->isect_off.off != b->isect_off.off) {\n    is_before = a->isect_off.off < b->isect_off.off;\n  } else {\n    is_before = str8_compar_case_sensitive(&a->name, &b->name);\n  }\n\n  return is_before;\n}\n\ninternal void\ngsi_record_sort_by_name(PDB_GsiSortRecord *arr, U64 count)\n{\n  ProfBeginFunction();\n  radsort(arr, count, gsi_hash_record_compar_is_before);\n  ProfEnd();\n}\n\ninternal void\ngsi_record_sort_by_sc(PDB_GsiSortRecord *arr, U64 count)\n{\n  ProfBeginFunction();\n  radsort(arr, count, psi_addr_map_compar_is_before);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(gsi_size_buckets_task)\n{\n  U64                          bucket_idx  = task_id;\n  PDB_GsiSerializeSymbolsTask *task        = raw_task;\n  CV_SymbolList               *bucket_list = &task->bucket_arr[bucket_idx];\n  for (CV_SymbolNode *node = bucket_list->first; node != 0; node = node->next) {\n    task->bucket_size_arr[bucket_idx] += cv_compute_symbol_record_size(&node->data, task->symbol_align);\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(gsi_serialize_pub32)\n{\n  U64                          bucket_idx = task_id;\n  PDB_GsiSerializeSymbolsTask *task       = raw_task;\n\n  CV_SymbolList      bucket_list     = task->bucket_arr[bucket_idx];\n  PDB_GsiSortRecord *sort_record_arr = task->sort_record_arr_arr[bucket_idx];\n  U64                buffer_size     = task->bucket_size_arr[bucket_idx];\n  U64                buffer_base     = task->bucket_off_arr[bucket_idx];\n  U8                *buffer          = task->buffer + buffer_base;\n\n  U64 sort_idx      = 0;\n  U64 buffer_cursor = 0;\n\n  for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) {\n    CV_Symbol *symbol = &node->data;\n    Assert(symbol->kind == CV_SymKind_PUB32);\n\n    CV_SymPub32 *pub32    = (CV_SymPub32 *)symbol->data.str;\n    U8          *str_ptr  = (U8 *)(pub32 + 1);\n    U64          str_size = symbol->data.size - sizeof(*pub32);\n    String8      name     = str8(str_ptr, str_size);\n\n    // init sort record\n    PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx];\n    sr->isect_off         = isect_off(pub32->sec, pub32->off);\n    sr->name              = name;\n    sr->offset            = buffer_cursor;\n\n    // serialize symbol\n    U64 serial_size = cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align);\n\n    // advance\n    sort_idx      += 1;\n    buffer_cursor += serial_size;\n  }\n\n  Assert(sort_idx == bucket_list.count);\n  Assert(buffer_cursor == buffer_size);\n\n  // sort symbols by name within bucket\n  gsi_record_sort_by_name(sort_record_arr, bucket_list.count);\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(gsi_serialize_symbols_task)\n{\n  U64                          bucket_idx = task_id;\n  PDB_GsiSerializeSymbolsTask *task       = raw_task;\n\n  CV_SymbolList        bucket_list     = task->bucket_arr[bucket_idx];\n  PDB_GsiSortRecord   *sort_record_arr = task->sort_record_arr_arr[bucket_idx];\n  U64                  buffer_size     = task->bucket_size_arr[bucket_idx];\n  U64                  buffer_base     = task->bucket_off_arr[bucket_idx];\n  U8                  *buffer          = task->buffer + buffer_base;\n\n  U64 sort_idx      = 0;\n  U64 buffer_cursor = 0;\n\n  for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) {\n    CV_Symbol *symbol = &node->data;\n\n    // init sort record\n    PDB_GsiSortRecord *sr = &sort_record_arr[sort_idx];\n    //sr->isect_off = isect_off(0,0);\n    sr->name      = cv_name_from_symbol(symbol->kind, symbol->data);\n    sr->offset    = buffer_cursor;\n\n    // serialize symbol\n    U64 serial_size = cv_serialize_symbol_to_buffer(buffer, buffer_cursor, buffer_size, symbol, task->symbol_align);\n\n    // advance\n    sort_idx      += 1;\n    buffer_cursor += serial_size;\n  }\n\n  Assert(sort_idx == bucket_list.count);\n  Assert(buffer_cursor == buffer_size);\n\n  // sort symbols by name within bucket\n  gsi_record_sort_by_name(sort_record_arr, bucket_list.count);\n}\n\ninternal PDB_GsiBuildResult\ngsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 is_pub32, U64 msf_page_size)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena,1);\n\n  ProfBegin(\"Serialize & Sort Symbols\");\n\n  PDB_GsiSerializeSymbolsTask serial_task;\n  serial_task.symbol_align    = gsi->symbol_align;\n  serial_task.bucket_arr      = gsi->bucket_arr;\n  serial_task.bucket_size_arr = push_array(scratch.arena, U64, gsi->bucket_count);\n\n  // estimate each bucket size\n  tp_for_parallel(tp, 0, gsi->bucket_count, gsi_size_buckets_task, &serial_task);\n\n  // prepare serial buffer\n  U64 buffer_size = sum_array_u64(gsi->bucket_count, serial_task.bucket_size_arr);\n  serial_task.buffer         = push_array_no_zero(arena, U8, buffer_size);\n  serial_task.bucket_off_arr = push_array_copy_u64(scratch.arena, serial_task.bucket_size_arr, gsi->bucket_count);\n  counts_to_offsets_array_u64(gsi->bucket_count, serial_task.bucket_off_arr);\n\n  // prepare GSI records\n  serial_task.sort_record_arr_arr  = push_array_no_zero(scratch.arena, PDB_GsiSortRecord *, gsi->bucket_count);\n  serial_task.sort_record_arr      = push_array_no_zero(arena, PDB_GsiSortRecord, gsi->symbol_count);\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < gsi->bucket_count; bucket_idx += 1) {\n    serial_task.sort_record_arr_arr[bucket_idx] = serial_task.sort_record_arr + cursor;\n    cursor += gsi->bucket_arr[bucket_idx].count;\n  }\n\n  // fill out sort records & serialize symbols\n  TP_TaskFunc *serial_func = is_pub32 ? gsi_serialize_pub32 : gsi_serialize_symbols_task;\n  tp_for_parallel(tp, 0, gsi->bucket_count, serial_func, &serial_task);\n\n  ProfEnd();\n\n  U64             bitmap_count            = (gsi->bucket_count / gsi->word_size) + 1; // ms-pdb allocates extra bucket and funnels free buckets there\n  U64             compressed_offset_count = 0;\n  U64             hash_record_count       = gsi->symbol_count;\n  U32            *bitmap                  = push_array(arena, U32, bitmap_count);\n  U32            *compressed_offset_arr   = push_array_no_zero(arena, U32, gsi->bucket_count);\n  PDB_GsiHashRecord *hash_record_arr      = push_array_no_zero(arena, PDB_GsiHashRecord, hash_record_count);\n\n  // offsets for symbol stream are shifted by one to tell apart from null and zero (see GSI1::fixSymRecs) \n  U64 offset_cursor = (1 + symbol_data_base);\n  U64 hash_idx = 0;\n\n  ProfBegin(\"Write Bitmap & Record Offsets\");\n  for (U64 bucket_idx = 0; bucket_idx < gsi->bucket_count; bucket_idx += 1) {\n    // set bit for each occupied bucket\n    CV_SymbolList bucket_list = gsi->bucket_arr[bucket_idx];\n    if (bucket_list.count) {\n      U64 word_idx = bucket_idx / gsi->word_size;\n      Assert(word_idx < bitmap_count);\n      bitmap[word_idx] |= 1 << (bucket_idx % gsi->word_size);\n      compressed_offset_arr[compressed_offset_count] = hash_idx * sizeof(PDB_GsiHashRecordOffsetCalc); // store in-memory offset for first bucket\n      compressed_offset_count += 1;\n    }\n\n    // write out sorted hash records\n    PDB_GsiSortRecord *sort_record_arr = serial_task.sort_record_arr_arr[bucket_idx];\n    for (U64 sr_idx = 0; sr_idx < gsi->bucket_arr[bucket_idx].count; sr_idx += 1, hash_idx += 1) {\n      PDB_GsiHashRecord *hr = &hash_record_arr[hash_idx]; \n      hr->symbol_off = offset_cursor + sort_record_arr[sr_idx].offset;\n      hr->cref       = 1;\n    }\n\n    // advance offset cursor\n    offset_cursor += serial_task.bucket_size_arr[bucket_idx];\n  }\n  ProfEnd();\n\n  // fill out header\n  PDB_GsiHeader header;\n  header.signature            = PDB_GsiSignature_Basic;\n  header.version              = PDB_GsiVersion_V70;\n  header.hash_record_arr_size = sizeof(hash_record_arr[0]) * hash_record_count;\n  header.bucket_data_size     = sizeof(bitmap[0]) * bitmap_count + sizeof(compressed_offset_arr[0]) * compressed_offset_count;\n  \n  // fill out result\n  PDB_GsiBuildResult result;\n  result.header                  = header;\n  result.hash_record_count       = hash_record_count;\n  result.hash_record_arr         = hash_record_arr;\n  result.sort_record_arr         = serial_task.sort_record_arr;\n  result.bitmap_count            = bitmap_count;\n  result.bitmap                  = bitmap;\n  result.compressed_bucket_count = compressed_offset_count;\n  result.compressed_bucket_arr   = compressed_offset_arr;\n  result.total_hash_size         = sizeof(header) + header.hash_record_arr_size + header.bucket_data_size;\n  result.symbol_data             = str8(serial_task.buffer, buffer_size);\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return result;\n}\n\ninternal void\ngsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  U64 symbol_data_base = msf_stream_get_pos(msf, symbols_sn);\n  PDB_GsiBuildResult build = gsi_build_ex(tp, scratch.arena, gsi, symbol_data_base, /* is_pub32: */ 0, msf->page_size);\n  gsi_write_build_result(tp, build, msf, sn, symbols_sn);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal U32\ngsi_hash(PDB_GsiContext *gsi, String8 input)\n{ (void)gsi;\n  U32 hash = pdb_hash_v1(input);\n  return hash;\n}\n\ninternal void\ngsi_push_(PDB_GsiContext *gsi, U32 hash, CV_SymbolNode *node)\n{\n  U64 bucket_idx = hash % gsi->bucket_count;\n  CV_SymbolList *list = &gsi->bucket_arr[bucket_idx];\n  cv_symbol_list_push_node(list, node);\n  gsi->symbol_count += 1;\n}\n\ninternal CV_SymbolNode *\ngsi_push(PDB_GsiContext *gsi, CV_Symbol *symbol)\n{\n  String8 name = cv_name_from_symbol(symbol->kind, symbol->data);\n  U32     hash = gsi_hash(gsi, name);\n\n  CV_SymbolNode *node = push_array_no_zero(gsi->arena, CV_SymbolNode, 1);\n  node->next = 0;\n  node->prev = 0;\n  node->data = *symbol;\n\n  gsi_push_(gsi, hash, node);\n\n  return node;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(gsi_symbol_hasher_task)\n{\n  ProfBeginFunction();\n  GSI_SymbolHasherTask *task  = raw_task;\n  Rng1U64               range = task->ranges[task_id];\n  for (U64 symbol_idx = range.min; symbol_idx < range.max; ++symbol_idx) {\n    CV_SymbolNode *symbol = task->symbols[symbol_idx];\n    String8        name   = cv_name_from_symbol(symbol->data.kind, symbol->data.data);\n    task->hashes[symbol_idx] = gsi_hash(task->gsi, name);\n  }\n  ProfEnd();\n}\n\ninternal void\ngsi_push_many_arr(TP_Context *tp, PDB_GsiContext *gsi, U64 count, CV_SymbolNode **symbols)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n \n  ProfBegin(\"Hash UDT Names\");\n  GSI_SymbolHasherTask task = {0};\n  task.gsi                  = gsi;\n  task.ranges               = tp_divide_work(scratch.arena, count, tp->worker_count);\n  task.symbols              = symbols;\n  task.hashes               = push_array_no_zero(scratch.arena, U32, count);\n  tp_for_parallel(tp, 0, tp->worker_count, gsi_symbol_hasher_task, &task);\n  ProfEnd();\n\n  for (U64 i = 0; i < count; ++i) {\n    gsi_push_(gsi, task.hashes[i], symbols[i]);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\ngsi_push_many_list(PDB_GsiContext *gsi, U64 count, U32 *hash_arr, CV_SymbolList *list)\n{\n  Assert(count == list->count);\n\n  U64 hash_idx = 0;\n  for (CV_SymbolNode *curr = list->first, *next = 0; curr != 0; curr = next, ++hash_idx) {\n    next = curr->next;\n\n    curr->prev = 0;\n    curr->next = 0;\n\n    gsi_push_(gsi, hash_arr[hash_idx], curr);\n  }\n\n  MemoryZeroStruct(list);\n}\n\ninternal CV_SymbolNode *\ngsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol)\n{\n  String8 name    = cv_name_from_symbol(symbol->kind, symbol->data);\n  U32     hash    = gsi_hash(gsi, name);\n  U64     ibucket = hash % gsi->bucket_count;\n\n  CV_SymbolList bucket_list = gsi->bucket_arr[ibucket];\n  for (CV_SymbolNode *node = bucket_list.first; node != 0; node = node->next) {\n    String8 that_name = cv_name_from_symbol(node->data.kind, node->data.data);\n    if (str8_match(name, that_name, 0)) {\n      return node;\n    }\n  }\n\n  return NULL;\n}\n\n////////////////////////////////\n\ninternal PDB_PsiContext *\npsi_alloc(void)\n{\n  ProfBeginFunction();\n  Arena *arena = arena_alloc();\n  PDB_PsiContext *psi = push_array(arena, PDB_PsiContext, 1);\n  psi->arena = arena;\n  psi->gsi = gsi_alloc();\n  ProfEnd();\n  return psi;\n}\n\ninternal PDB_PsiContext *\npsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data)\n{\n  ProfBeginFunction();\n  \n  Arena *arena = arena_alloc();\n  PDB_PsiContext *psi = push_array(arena, PDB_PsiContext, 1);\n  psi->arena = arena;\n  \n  // TODO: read out address table\n  \n  PDB_PsiHeader header = {0};\n  msf_stream_read_struct(msf, sn, &header);\n  \n  psi->gsi = gsi_open(msf, sn, symbol_data);\n  \n  ProfEnd();\n  return psi;\n}\n\ninternal void\npsi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n  \n  U64 symbol_data_base = msf_stream_get_pos(msf, symbols_sn);\n  PDB_GsiBuildResult gsi_build = gsi_build_ex(tp, scratch.arena, psi->gsi, symbol_data_base, /* is_pub32: */ 1, msf->page_size);\n  \n  ProfBegin(\"Address Map\");\n  \n  ProfBegin(\"Sort\");\n  gsi_record_sort_by_sc(gsi_build.sort_record_arr, gsi_build.hash_record_count);\n  ProfEnd();\n  \n  ProfBegin(\"Offset Fill\");\n  U64 addr_map_count = gsi_build.hash_record_count;\n  U64 addr_map_size = addr_map_count * sizeof(U32);\n  U32 *addr_map     = push_array_no_zero(scratch.arena, U32, addr_map_count);\n  for (U64 i = 0; i < addr_map_count; i += 1) {\n    addr_map[i] = gsi_build.sort_record_arr[i].offset;\n  }\n  ProfEnd();\n\n  ProfEnd();\n  \n  PDB_PsiHeader header;\n  header.sym_hash_size       = gsi_build.total_hash_size;\n  header.addr_map_size       = addr_map_size;\n  header.thunk_count         = 0;\n  header.thunk_size          = 0;\n  header.isec_thunk_table    = 0;\n  header.padding             = 0;\n  header.sec_thunk_table_off = 0;\n  header.sec_count           = 0;\n  \n  ProfBegin(\"MSF Write\");\n  msf_stream_write_struct(msf, sn, &header);\n  gsi_write_build_result(tp, gsi_build, msf, sn, symbols_sn);\n  msf_stream_write_array(msf, sn, &addr_map[0], addr_map_count);\n  ProfEnd();\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\npsi_release(PDB_PsiContext **psi_ptr)\n{\n  ProfBeginFunction();\n  gsi_release(&(*psi_ptr)->gsi);\n  arena_release((*psi_ptr)->arena);\n  *psi_ptr = NULL;\n  ProfEnd();\n}\n\ninternal CV_SymbolNode *\npsi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name)\n{\n  CV_Symbol pub = cv_make_pub32(psi->arena, flags, offset, isect, name);\n  CV_SymbolNode *node = gsi_push(psi->gsi, &pub);\n  return node;\n}\n\n////////////////////////////////\n\ninternal void\ndbi_sec_contrib_list_push_node(PDB_DbiSectionContribList *list, PDB_DbiSectionContribNode *node)\n{\n  node->next = 0;\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal PDB_DbiSectionContribNode *\ndbi_sec_contrib_list_push(Arena *arena, PDB_DbiSectionContribList *list)\n{\n  PDB_DbiSectionContribNode *node = push_array_no_zero(arena, PDB_DbiSectionContribNode, 1);\n  node->next = 0;\n  dbi_sec_contrib_list_push_node(list, node);\n  return node;\n}\n\ninternal void\ndbi_sec_list_concat_arr(PDB_DbiSectionContribList *list, U64 count, PDB_DbiSectionContribList *to_concat)\n{\n  SLLConcatInPlaceArray(list, to_concat, count);\n}\n\ninternal PDB_DbiContext *\ndbi_alloc(COFF_MachineType machine, U32 age)\n{\n  ProfBeginFunction();\n  Arena *arena = arena_alloc();\n  PDB_DbiContext *dbi = push_array(arena, PDB_DbiContext, 1);\n  dbi->arena      = arena;\n  dbi->age        = age;\n  dbi->machine    = machine;\n  dbi->globals_sn = MSF_INVALID_STREAM_NUMBER;\n  dbi->publics_sn = MSF_INVALID_STREAM_NUMBER;\n  dbi->symbols_sn = MSF_INVALID_STREAM_NUMBER;\n  pdb_strtab_alloc(&dbi->ec_names, 8);\n  for (U64 istream = 0; istream < ArrayCount(dbi->dbg_streams); istream += 1) {\n    dbi->dbg_streams[istream] = MSF_INVALID_STREAM_NUMBER;\n  }\n  ProfEnd();\n  return dbi;\n}\n\ninternal String8List *\ndbi_open_file_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  MSF_UInt file_info_pos = sizeof(PDB_DbiHeader) +\n    dbi_header->module_info_size +\n    dbi_header->sec_con_size +\n    dbi_header->sec_map_size;\n  msf_stream_seek(msf, sn, file_info_pos);\n  \n  U16 mod_count = msf_stream_read_u16(msf, sn);\n  U16 total_file_count16 = msf_stream_read_u16(msf, sn);\n  \n  CV_ModIndex *imod_array = push_array(scratch.arena, CV_ModIndex, mod_count);\n  msf_stream_read_array(msf, sn, &imod_array[0], mod_count);\n  \n  U16 *mod_file_count = push_array(scratch.arena, U16, mod_count);\n  msf_stream_read_array(msf, sn, &mod_file_count[0], mod_count);\n  \n  U64 total_file_count = 0;\n  for (U16 imod = 0; imod < mod_count; imod += 1) {\n    total_file_count += mod_file_count[imod];\n  }\n  \n  U32 *file_name_offset_array = push_array(scratch.arena, U32, total_file_count);\n  msf_stream_read_array(msf, sn, &file_name_offset_array[0], total_file_count);\n  \n  U64 file_name_buffer_offset = sizeof(mod_count) + \n    sizeof(total_file_count16) +\n    sizeof(imod_array[0]) * mod_count +\n    sizeof(mod_file_count[0]) * mod_count +\n    sizeof(file_name_offset_array[0]) * total_file_count;\n  Assert(dbi_header->file_info_size >= file_name_buffer_offset);\n  U64 file_name_buffer_size = dbi_header->file_info_size - file_name_buffer_offset;\n  char *file_name_buffer = push_array(arena, char, file_name_buffer_size + 1);\n  msf_stream_read_array(msf, sn, &file_name_buffer[0], file_name_buffer_size);\n  \n  String8List *file_info = push_array(arena, String8List, mod_count + 1);\n  \n  U32 *file_name_offset_ptr = &file_name_offset_array[0];\n  for (U64 mod_idx = 0; mod_idx < mod_count; ++mod_idx) {\n    String8List *file_list = &file_info[mod_idx];\n    U16 file_count = mod_file_count[mod_idx];\n    for (U16 ifile = 0; ifile < file_count; ifile += 1, file_name_offset_ptr += 1) {\n      Assert(*file_name_offset_ptr <= file_name_buffer_size);\n      String8 file_path = str8_cstring(file_name_buffer + *file_name_offset_ptr);\n      str8_list_push(arena, file_list, file_path);\n    }\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return file_info;\n}\n\ninternal PDB_DbiModuleList\ndbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header, String8List *file_info)\n{\n  ProfBeginFunction();\n  \n  PDB_DbiModuleList list = {0};\n  \n  MSF_UInt module_info_pos = sizeof(PDB_DbiHeader);\n  msf_stream_seek(msf, sn, module_info_pos);\n\n  MSF_UInt module_info_opl = module_info_pos + dbi_header->module_info_size;\n  while (msf_stream_get_pos(msf, sn) < module_info_opl) { \n    PDB_DbiCompUnitHeader header = {0};\n    msf_stream_read_struct(msf, sn, &header);\n    String8 obj_path = msf_stream_read_string(arena, msf, sn);\n    String8 lib_path = msf_stream_read_string(arena, msf, sn);\n    msf_stream_align(msf, sn, PDB_MODULE_ALIGN);\n    \n    String8List source_file_list = {0};\n    if (header.contribution.base.mod != CV_ModIndex_Invalid) {\n      source_file_list = file_info[header.contribution.base.mod];\n    }\n    \n    PDB_DbiModule *mod    = push_array(arena, PDB_DbiModule, 1);\n    mod->next             = 0;\n    mod->sn               = header.sn;\n    mod->imod             = header.contribution.base.mod;\n    mod->sym_data_size    = header.symbols_size;\n    mod->c11_data_size    = header.c11_lines_size;\n    mod->c13_data_size    = header.c13_lines_size;\n    mod->source_file_list = source_file_list;\n    mod->obj_path         = obj_path;\n    mod->lib_path         = lib_path;\n    mod->first_sc         = header.contribution;\n    \n    SLLQueuePush(list.first, list.last, mod);\n    list.count += 1;\n  }\n  \n  ProfEnd();\n  return list;\n}\n\ninternal PDB_DbiSectionContribList\ndbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header)\n{\n  ProfBeginFunction();\n  \n  PDB_DbiSectionContribList sec_contrib = {0};\n  \n  if (dbi_header->sec_con_size > sizeof(PDB_DbiSectionContrib)) {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    // seek to start of section contrib info\n    MSF_UInt sec_con_pos = sizeof(PDB_DbiHeader) + dbi_header->module_info_size;\n    msf_stream_seek(msf, sn, sec_con_pos);\n    \n    // read header\n    PDB_DbiSectionContribVersion version = 0;\n    msf_stream_read_struct(msf, sn, &version);\n    \n    // parse contrib items\n    switch (version) {\n    case PDB_DbiSectionContribVersion_1: {\n      U64 contrib_count = dbi_header->sec_con_size / sizeof(PDB_DbiSectionContrib);\n      PDB_DbiSectionContrib *src_contrib_array = push_array(scratch.arena, PDB_DbiSectionContrib, contrib_count);\n      MSF_UInt sec_con_read = msf_stream_read_array(msf, sn, &src_contrib_array[0], contrib_count);\n      Assert(sec_con_read == sizeof(src_contrib_array[0]) * contrib_count);\n      \n      PDB_DbiSectionContribNode *dst_contrib_array = push_array_no_zero(arena, PDB_DbiSectionContribNode, contrib_count);\n      for (U64 icontrib = 0; icontrib < contrib_count; icontrib += 1) {\n        dst_contrib_array[icontrib].next = 0;\n        dst_contrib_array[icontrib].data = src_contrib_array[icontrib];\n        dbi_sec_contrib_list_push_node(&sec_contrib, &dst_contrib_array[icontrib]);\n      }\n    } break;\n    case PDB_DbiSectionContribVersion_2: {\n      NotImplemented;\n    } break;\n    default: Assert(!\"unknown section contrib version\"); break;\n    }\n    \n    // have we exhausted sec-con bytes?\n    Assert(sec_con_pos + dbi_header->sec_con_size == msf_stream_get_pos(msf, sn));\n    scratch_end(scratch);\n  }\n  \n  ProfEnd();\n  return sec_contrib;\n}\n\ninternal PDB_StringTable\ndbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header)\n{\n  ProfBeginFunction();\n  PDB_StringTable ec_names = {0};\n  if (dbi_header->ec_info_size >= sizeof(PDB_StringTableHeader)) {\n    MSF_UInt ec_names_pos = sizeof(PDB_DbiHeader)\n      + dbi_header->module_info_size\n      + dbi_header->sec_con_size\n      + dbi_header->sec_map_size\n      + dbi_header->file_info_size\n      + dbi_header->tsm_size;\n    msf_stream_seek(msf, sn, ec_names_pos);\n    pdb_strtab_open(&ec_names, msf, sn);\n  }\n  ProfEnd();\n  return ec_names;\n}\n\ninternal void\ndbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header)\n{\n  ProfBeginFunction();\n  Assert(dbi_header->dbg_header_size % sizeof(dbg_streams[0]) == 0); // TODO: error handle\n  MSF_UInt dbg_stream_pos = sizeof(PDB_DbiHeader) \n    + dbi_header->module_info_size\n    + dbi_header->sec_con_size\n    + dbi_header->sec_map_size\n    + dbi_header->file_info_size\n    + dbi_header->tsm_size\n    + dbi_header->ec_info_size;\n  msf_stream_seek(msf, sn, dbg_stream_pos);\n  msf_stream_read(msf, sn, &dbg_streams[0], dbi_header->dbg_header_size);\n  ProfEnd();\n}\n\ninternal PDB_DbiSectionList\ndbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  PDB_DbiSectionList sec_list = {0};\n  U64 sec_count = msf_stream_get_size(msf, sn) / sizeof(PDB_DbiSectionNode);\n  PDB_DbiSectionNode *sec_nodes = push_array(arena, PDB_DbiSectionNode, sec_count);\n  for (U64 isec = 0; isec < sec_count; isec += 1) {\n    PDB_DbiSectionNode *sec = &sec_nodes[isec];\n    msf_stream_read_struct(msf, sn, &sec->data);\n    SLLQueuePush(sec_list.first, sec_list.last, sec);\n    sec_list.count += 1;\n  }\n  ProfEnd();\n  return sec_list;\n}\n\ninternal PDB_DbiContext *\ndbi_open(MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  \n  PDB_DbiHeader header = {0};\n  msf_stream_read_struct(msf, sn, &header);\n  \n  Arena *arena = arena_alloc();\n  PDB_DbiContext *dbi = push_array(arena, PDB_DbiContext, 1);\n  dbi->arena      = arena;\n  dbi->age        = header.age;\n  dbi->machine    = header.machine;\n  dbi->globals_sn = header.gsi_sn;\n  dbi->publics_sn = header.psi_sn;\n  dbi->symbols_sn = header.sym_sn;\n  \n  if (header.sig == PDB_DbiHeaderSignature_V1) {\n    switch (header.version) {\n    case PDB_DbiVersion_41: \n    case PDB_DbiVersion_50:\n    case PDB_DbiVersion_60:\n    case PDB_DbiVersion_110: {\n      Assert(!\"TODO: support for older DBI versions\");\n    } break;\n    case PDB_DbiVersion_70: {\n      String8List *file_info = dbi_open_file_info(dbi->arena, msf, sn, &header);\n      dbi->module_list = dbi_open_module_info(dbi->arena, msf, sn, &header, file_info);\n      dbi->sec_contrib_list = dbi_open_sec_contrib(dbi->arena, msf, sn, &header);\n      // TODO: section map\n      //dbi->sec_map = dbi_open_sec_map(dbi->arena, msf, sn, &header);\n      dbi->ec_names = dbi_open_ec_names(dbi->arena, msf, sn, &header);\n      dbi_open_dbg_streams(&dbi->dbg_streams[0], msf, sn, &header);\n      dbi->section_list = dbi_open_section_headers(dbi->arena, msf, dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]);\n    } break;\n    }\n  }\n  \n  ProfEnd();\n  return dbi;\n\n}\n\ninternal void\ndbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  \n  U64 header_arr_size = sizeof(dbi->section_list.first->data) * dbi->section_list.count;\n  msf_stream_resize(msf, sn, header_arr_size);\n  msf_stream_seek(msf, sn, 0);\n  \n  for (PDB_DbiSectionNode *i = dbi->section_list.first; i; i = i->next) {\n    msf_stream_write_struct(msf, sn, &i->data);\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(dbi_build_file_info_assign_file_offsets_task)\n{\n  ProfBeginFunction();\n\n  PDB_DbiBuildFileInfoTask *task = raw_task;\n  PDB_DbiModule            *mod  = task->mod_arr[task_id];\n\n  task->imod_arr[mod->imod] = mod->imod;\n\n  if (mod->imod != CV_ModIndex_Invalid) {\n    // assign source file count\n    task->source_file_name_count_arr[mod->imod] = safe_cast_u16x(mod->source_file_list.node_count);\n\n    // assign source file offsets\n    U64 source_file_idx = 0;\n    for (String8Node *string_n = mod->source_file_list.first; string_n != 0; string_n = string_n->next, ++source_file_idx) {\n      CV_StringBucket *string_bucket = cv_string_hash_table_lookup(task->string_ht, string_n->string);\n      task->source_file_name_offset_arr[mod->imod][source_file_idx] = safe_cast_u32(string_bucket->u.offset);\n    }\n  } else {\n    // module was deleted don't create source file info\n    task->source_file_name_count_arr[mod->imod] = 0;\n  }\n\n  ProfEnd();\n}\n\ninternal String8List\ndbi_build_file_info(Arena *arena, TP_Context *tp, PDB_DbiModuleList mod_list, CV_StringHashTable string_ht)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64             total_source_file_count = 0;\n  U64             mod_arr_count           = 0;\n  PDB_DbiModule **mod_arr                 = push_array_no_zero(scratch.arena, PDB_DbiModule *, mod_list.count);\n\n  for (PDB_DbiModule *mod = mod_list.first; mod != 0; mod = mod->next) {\n    mod_arr[mod_arr_count++] = mod;\n    if (mod->imod != CV_ModIndex_Invalid) {\n      total_source_file_count += mod->source_file_list.node_count;\n    }\n  }\n\n  U32 **source_file_name_offsets_arr = push_array_no_zero(scratch.arena, U32 *, mod_list.count);\n  U32  *source_file_name_offsets     = push_array_no_zero(arena, U32, total_source_file_count);\n  for (U64 mod_idx = 0, cursor = 0; mod_idx < mod_list.count; ++mod_idx) {\n    if (mod_arr[mod_idx]->imod != CV_ModIndex_Invalid) {\n      source_file_name_offsets_arr[mod_idx] = source_file_name_offsets + cursor;\n      cursor += mod_arr[mod_idx]->source_file_list.node_count;\n    } else {\n      source_file_name_offsets_arr[mod_idx] = 0;\n    }\n  }\n\n  U16 total_source_file_count16    = Min(max_U16, total_source_file_count);\n  U16 mod_count16                  = Min(max_U16, mod_list.count);\n\n  PDB_DbiBuildFileInfoTask task    = {0};\n  task.string_ht                   = string_ht;\n  task.mod_arr                     = mod_arr;\n  task.imod_arr                    = push_array_no_zero(arena, U16, mod_count16);\n  task.source_file_name_count_arr  = push_array_no_zero(arena, U16, mod_list.count);\n  task.source_file_name_offset_arr = source_file_name_offsets_arr;\n  tp_for_parallel(tp, 0, mod_arr_count, dbi_build_file_info_assign_file_offsets_task, &task);\n\n  // pack strings\n  String8 string_buffer = cv_pack_string_hash_table(arena, tp, string_ht);\n\n  // layout file info sections\n  String8List file_info_srl = {0};\n  str8_serial_begin(arena, &file_info_srl);\n  str8_serial_push_u16(arena, &file_info_srl, mod_count16);\n  str8_serial_push_u16(arena, &file_info_srl, total_source_file_count16);\n  str8_list_push(arena, &file_info_srl, str8_array(task.imod_arr, mod_count16));\n  str8_list_push(arena, &file_info_srl, str8_array(task.source_file_name_count_arr, mod_list.count));\n  str8_list_push(arena, &file_info_srl, str8_array(source_file_name_offsets, total_source_file_count));\n  str8_list_push(arena, &file_info_srl, string_buffer);\n  str8_serial_push_align(arena, &file_info_srl, sizeof(U32));\n\n  scratch_end(scratch);\n  ProfEnd();\n  return file_info_srl;\n}\n\ninternal String8List\ndbi_build_module_info(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf)\n{\n  ProfBeginFunction();\n\n  String8List module_info_list = {0};\n  str8_serial_begin(arena, &module_info_list);\n  \n  for (PDB_DbiModule *mod = dbi->module_list.first; mod != 0; mod = mod->next) {\n    // fill out header\n    PDB_DbiCompUnitHeader *header = push_array(arena, PDB_DbiCompUnitHeader, 1);\n    header->contribution          = mod->first_sc;\n    // we don't use these flags right now\n    // U16 is_written : 1\n    // U16 unused     : 7\n    // U16 tsm_index  : 8 ; index into type server map\n    header->flags                = 0;\n    header->sn                   = mod->sn;\n    header->symbols_size         = mod->sym_data_size;\n    header->c11_lines_size       = mod->c11_data_size;\n    header->c13_lines_size       = mod->c13_data_size;\n    header->num_contrib_files    = Min(max_U16, mod->source_file_list.node_count);\n    header->file_names_offset    = 0; // TODO: fill out the offset\n    // TODO: generate EC info\n    header->src_file             = 0;\n    header->pdb_file             = 0;\n\n    Assert(header->sn != MSF_INVALID_STREAM_NUMBER);\n    \n    // push module info\n    str8_serial_push_struct(arena, &module_info_list, header);\n    str8_serial_push_cstr(arena, &module_info_list, mod->obj_path);\n    str8_serial_push_cstr(arena, &module_info_list, mod->lib_path);\n    str8_serial_push_align(arena, &module_info_list, PDB_MODULE_ALIGN);\n  }\n\n  ProfEnd();\n  return module_info_list;\n}\n\n#if 0\nint \ndbi_sc_compar(const PDB_DbiSectionContrib *a, const PDB_DbiSectionContrib *b)\n{\n#if 0\n  int cmp = 0;\n  if (a->base.sec == b->base.sec) {\n    if (a->base.sec_off < b->base.sec_off) {\n      cmp = -1;\n    } else if (a->base.sec_off > b->base.sec_off) {\n      cmp = +1;\n    }\n  } else if (a->base.sec < b->base.sec) {\n    cmp = -1;\n  } else {\n    cmp = +1;\n  }\n#else\n#define MAKE_SORTER(x) (((U64)(x)->base.sec << 32) | (U64)(x)->base.sec_off)\n  U64 l = MAKE_SORTER(a);\n  U64 r = MAKE_SORTER(b);\n  int cmp = l < r ? -1 : l > r ? + 1 : 0;\n#undef MAKE_SORTER\n#endif\n  return cmp;\n}\n#endif\n\ninternal void\nlnk_radix_sort_dbi_sc_array(PDB_DbiSectionContrib *arr, U64 sc_count, U64 sect_count)\n{\n  ProfBeginFunction();\n\n#if 1\n  // faster but uses more memory\n# define RADIX_BIT_COUNT 16\n# define RADIX_MAX       2\n#else\n  // slower but uses less memory\n# define RADIX_BIT_COUNT 8\n# define RADIX_MAX       4\n#endif\n\n  Temp scratch = scratch_begin(0,0);\n\n  PDB_DbiSectionContrib *temp_arr = push_array_no_zero(scratch.arena, PDB_DbiSectionContrib, sc_count);\n  PDB_DbiSectionContrib *src_arr = arr;\n  PDB_DbiSectionContrib *dst_arr = temp_arr;\n\n  ProfBegin(\"Count Memzero\");\n  U32 count_8lo[256]; MemoryZeroArray(count_8lo);\n  U32 count_8hi[256]; MemoryZeroArray(count_8hi);\n  U32 count_16[1 << 16]; MemoryZeroArray(count_16);\n  U32 *count_arr = push_array(scratch.arena, U32, sect_count + 1);\n  ProfEnd();\n\n  ProfBegin(\"Histogram\");\n  for (U64 i = 0; i < sc_count; i += 1) {\n    PDB_DbiSectionContrib *sc = src_arr + i;\n    count_arr[sc->base.sec] += 1;\n\n    U64 digit_8lo = (sc->base.sec_off >> 0) % ArrayCount(count_8lo);\n    U64 digit_8hi = (sc->base.sec_off >> 8) % ArrayCount(count_8hi);\n    U64 digit_16 = (sc->base.sec_off >> 16) % ArrayCount(count_16);\n    count_8lo[digit_8lo] += 1;\n    count_8hi[digit_8hi] += 1;\n    count_16[digit_16] += 1;\n  }\n  ProfEnd();\n\n  //\n  // sort on section offset\n  //\n\n  ProfBegin(\"Offsets\");\n  U32 offset_8lo = 0;\n  U32 offset_8hi = 0;\n  for (U64 i = 1; i <= ArrayCount(count_8lo); i += 1) {\n    U32 current_8lo = count_8lo[i - 1];\n    U32 current_8hi = count_8hi[i - 1];\n    count_8lo[i - 1] = offset_8lo;\n    count_8hi[i - 1] = offset_8hi;\n    offset_8lo += current_8lo;\n    offset_8hi += current_8hi;\n  }\n\n  U32 offset_16 = 0;\n  for (U64 i = 1; i <= ArrayCount(count_16); i += 1) {\n    U32 current_16 = count_16[i - 1];\n    count_16[i - 1] = offset_16;\n    offset_16 += current_16;\n  }\n  ProfEnd();\n\n  count_8lo[0] = 0;\n  count_8hi[0] = 0;\n  count_16[0] = 0;\n\n  ProfBegin(\"Order 8 Lo\");\n  for (U64 i = 0; i < sc_count; i += 1) {\n    PDB_DbiSectionContrib *sc = &src_arr[i];\n    U64 digit = (sc->base.sec_off >> 0) % ArrayCount(count_8lo);\n    dst_arr[count_8lo[digit]++] = *sc;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Order 8 Hi\");\n  for (U64 i = 0; i < sc_count; i += 1) {\n    PDB_DbiSectionContrib *sc = &dst_arr[i];\n    U64 digit = (sc->base.sec_off >> 8) % ArrayCount(count_8hi);\n    src_arr[count_8hi[digit]++] = *sc;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Order 16\");\n  for (U64 i = 0; i < sc_count; i += 1) {\n    PDB_DbiSectionContrib *sc = &src_arr[i];\n    U64 digit = (sc->base.sec_off >> 16) % ArrayCount(count_16);\n    dst_arr[count_16[digit]++] = *sc;\n  }\n  ProfEnd();\n\n  //\n  // sort on section index\n  //\n\n  ProfBegin(\"Section Indices\");\n  \n  U32 offset = 0;\n  for (U64 i = 1; i <= sect_count; i += 1) {\n    U32 current = count_arr[i - 1];\n    count_arr[i - 1] = offset;\n    offset += current;\n  }\n\n  count_arr[0] = 0;\n\n  for (U64 i = 0; i < sc_count; i += 1) {\n    PDB_DbiSectionContrib *sc = dst_arr + i;\n    src_arr[count_arr[sc->base.sec]++] = *sc;\n  }\n\n  ProfEnd();\n\n#if 0\n  for (U64 i = 1; i < sc_count; i += 1) {\n    U64 a = ((U64)arr[i - 1].base.sec << 32) | arr[i - 1].base.sec_off;\n    U64 b = ((U64)arr[i    ].base.sec << 32) | arr[i    ].base.sec_off;\n    Assert(a <= b);\n  }\n#endif\n\n  scratch_end(scratch);\n\n#undef RADIX_BIT_COUNT\n#undef RADIX_MAX\n\n  ProfEnd();\n}\n\ninternal String8List\ndbi_build_sec_con(Arena *arena, PDB_DbiContext *dbi)\n{\n  ProfBeginFunction();\n\n  PDB_DbiSectionContribVersion *version = push_array(arena, PDB_DbiSectionContribVersion, 1);\n  *version = PDB_DbiSectionContribVersion_1;\n  \n  // push section contribs V1\n  ProfBegin(\"Push sect contribs [Count %llu]\", dbi->sec_contrib_list.count);\n  PDB_DbiSectionContrib *sc_array = push_array_no_zero(arena, PDB_DbiSectionContrib, dbi->sec_contrib_list.count);\n  PDB_DbiSectionContrib *dst = &sc_array[0];\n  for (PDB_DbiSectionContribNode *src = dbi->sec_contrib_list.first; src != 0; src = src->next, dst += 1) {\n    *dst = src->data;\n  }\n  ProfEnd();\n\n  // sort section contribs so they are binary searchable\n  lnk_radix_sort_dbi_sc_array(sc_array, dbi->sec_contrib_list.count, dbi->section_list.count + 1);\n  \n  // push section contrib info\n  ProfBegin(\"List Push\");\n  String8List sec_con_list = {0};\n  str8_list_push(arena, &sec_con_list, str8((U8*)version, sizeof(*version)));\n  str8_list_push(arena, &sec_con_list, str8((U8*)sc_array, sizeof(sc_array[0])*dbi->sec_contrib_list.count));\n  ProfEnd();\n  \n  ProfEnd();\n  return sec_con_list;\n}\n\ninternal String8List\ndbi_build_sec_map(Arena *arena, PDB_DbiContext *dbi)\n{\n  ProfBeginFunction();\n\n  U64 entry_count = dbi->section_list.count + 1;\n  PDB_DbiSecMapEntry *entry_array = push_array(arena, PDB_DbiSecMapEntry, entry_count);\n  U64 isect = 0;\n  for (PDB_DbiSectionNode *sect = dbi->section_list.first; sect; sect = sect->next, ++isect) {\n    PDB_DbiSecMapEntry *s = &entry_array[isect];\n    COFF_SectionHeader *section_header = &sect->data;\n    if (section_header->flags & COFF_SectionFlag_MemRead) {\n      s->flags |= PDB_DbiOMF_READ;\n    }\n    if (section_header->flags & COFF_SectionFlag_MemWrite) {\n      s->flags |= PDB_DbiOMF_WRITE;\n    }\n    if (section_header->flags & COFF_SectionFlag_MemExecute) {\n      s->flags |= PDB_DbiOMF_EXEC;\n    }\n    if (~section_header->flags & COFF_SectionFlag_Mem16Bit) {\n      s->flags |= PDB_DbiOMF_IS_32BIT_ADDR;\n    }\n    s->flags |= PDB_DbiOMF_IS_SELECTOR; // always set\n    s->sec_size = section_header->vsize;\n    s->frame = isect + 1;\n    s->sec_name = max_U16;\n    s->class_name = max_U16;\n  }\n  // init last entry \n  {\n    PDB_DbiSecMapEntry *s = &entry_array[entry_count - 1];\n    s->flags = PDB_DbiOMF_IS_32BIT_ADDR | PDB_DbiOMF_IS_ABS_ADDR;\n    s->sec_size = max_U32;\n    s->frame = isect + 1;\n    s->sec_name = max_U16;\n    s->class_name = max_U16;\n  }\n  \n  // init header\n  PDB_DbiSecMapHeader *header = push_array(arena, PDB_DbiSecMapHeader, 1);\n  header->section_count = entry_count;\n  header->segment_count = entry_count;\n  \n  // push section map info\n  String8List sec_map_list = {0};\n  str8_list_push(arena, &sec_map_list, str8((U8*)header, sizeof(*header)));\n  str8_list_push(arena, &sec_map_list, str8((U8*)entry_array, sizeof(entry_array[0])*entry_count));\n  \n  ProfEnd();\n  return sec_map_list;\n}\n\ninternal String8List\ndbi_build_dbg_header(Arena *arena, PDB_DbiContext *dbi, MSF_Context *msf)\n{\n  ProfBeginFunction();\n  if (dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER] == MSF_INVALID_STREAM_NUMBER) {\n    dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER] = msf_stream_alloc(msf);\n  }\n  dbi_build_section_header_stream(dbi, msf, dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER]);\n  \n  String8List dbg_header_srl = {0};\n  str8_serial_begin(arena, &dbg_header_srl);\n  str8_serial_push_array(arena, &dbg_header_srl, dbi->dbg_streams, ArrayCount(dbi->dbg_streams));\n  \n  ProfEnd();\n  return dbg_header_srl;\n}\n\ninternal void\ndbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  ProfBegin(\"Build\");\n  String8List module_info_list = dbi_build_module_info(scratch.arena, dbi, msf);\n  String8List sec_con_list     = dbi_build_sec_con(scratch.arena, dbi);\n  String8List sec_map_list     = dbi_build_sec_map(scratch.arena, dbi);\n  String8List file_info_list   = dbi_build_file_info(scratch.arena, tp, dbi->module_list, string_ht);\n  String8List dbg_header_list  = dbi_build_dbg_header(scratch.arena, dbi, msf);\n  String8List tsm_list         = {0}; // TODO: TSM\n  ProfEnd();\n  \n  PDB_DbiHeader header    = {0};\n  header.sig              = PDB_DbiHeaderSignature_V1;\n  header.version          = PDB_DbiVersion_70;\n  header.age              = dbi->age;\n  header.gsi_sn           = dbi->globals_sn;\n  header.build_number     = PDB_DbiMakeBuildNumber(14, 11);\n  header.psi_sn           = dbi->publics_sn;\n  header.pdb_version      = 0;\n  header.sym_sn           = dbi->symbols_sn;\n  header.pdb_version2     = 0;\n  header.module_info_size = module_info_list.total_size;\n  header.sec_con_size     = sec_con_list.total_size;\n  header.sec_map_size     = sec_map_list.total_size;\n  header.file_info_size   = file_info_list.total_size;\n  header.tsm_size         = tsm_list.total_size;\n  header.mfc_index        = 0;\n  header.dbg_header_size  = dbg_header_list.total_size;\n  header.ec_info_size     = pdb_strtab_get_serialized_size(&dbi->ec_names);\n  header.flags            = 0;\n  header.machine          = dbi->machine;\n  header.reserved         = 0;\n  \n  ProfBegin(\"MSF Write\");\n\n  U64 dbi_stream_size = sizeof(header) +\n                        module_info_list.total_size +\n                        sec_con_list.total_size +\n                        sec_map_list.total_size +\n                        file_info_list.total_size +\n                        tsm_list.total_size +\n                        dbg_header_list.total_size;\n  msf_stream_resize(msf, dbi_sn, dbi_stream_size);\n  msf_stream_seek_start(msf, dbi_sn);\n  msf_stream_write(msf, dbi_sn, &header, sizeof(header));\n  msf_stream_write_list(msf, dbi_sn, module_info_list);\n  msf_stream_write_list(msf, dbi_sn, sec_con_list);\n  msf_stream_write_list(msf, dbi_sn, sec_map_list);\n  msf_stream_write_list(msf, dbi_sn, file_info_list);\n  msf_stream_write_list(msf, dbi_sn, tsm_list);\n  pdb_strtab_build(&dbi->ec_names, msf, dbi_sn);\n  msf_stream_write_list(msf, dbi_sn, dbg_header_list);\n  ProfEnd();\n  \n  ProfEnd();\n  scratch_end(scratch);\n}\n\ninternal void\ndbi_release(PDB_DbiContext **dbi_ptr)\n{\n  ProfBeginFunction();\n  arena_release((*dbi_ptr)->arena);\n  *dbi_ptr = 0;\n  ProfEnd();\n}\n\ninternal PDB_DbiModule *\ndbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path)\n{\n  // init module\n  PDB_DbiModule *mod = push_array(dbi->arena, PDB_DbiModule, 1);\n  mod->imod          = safe_cast_u32(dbi->module_list.count);\n  mod->sn            = MSF_INVALID_STREAM_NUMBER;\n  mod->obj_path      = push_str8_copy(dbi->arena, obj_path);\n  mod->lib_path      = push_str8_copy(dbi->arena, lib_path.size > 0 ? lib_path : obj_path);\n  \n  // push to list \n  SLLQueuePush(dbi->module_list.first, dbi->module_list.last, mod);\n  dbi->module_list.count += 1;\n  \n  return mod;\n}\n\ninternal void\ndbi_module_push_section_contrib(PDB_DbiContext *dbi,\n                                PDB_DbiModule *mod, \n                                ISectOff isect_off,\n                                U32 size,  \n                                U32 data_crc,\n                                U32 reloc_crc, \n                                COFF_SectionFlags flags)\n{\n  ProfBeginFunction();\n\n  PDB_DbiSectionContrib sc;\n  sc.base.sec     = safe_cast_u16(isect_off.isect);\n  sc.base.sec_off = isect_off.off;\n  sc.base.size    = size;\n  sc.base.flags   = flags;\n  sc.base.mod     = mod->imod;\n  sc.data_crc     = data_crc;\n  sc.reloc_crc    = reloc_crc;\n\n  PDB_DbiSectionContribNode *node = push_array_no_zero(dbi->arena, PDB_DbiSectionContribNode, 1);\n  node->data = sc;\n  dbi_sec_contrib_list_push_node(&dbi->sec_contrib_list, node);\n  \n  // Mod1::fUpdateSecContrib\n  if (mod->first_sc.base.mod == 0) {\n    if (flags & COFF_SectionFlag_CntCode) {\n      mod->first_sc = sc;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal String8\ndbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod)\n{\n  String8 symbol_data = str8(0,0);\n  if (mod->sn != MSF_INVALID_STREAM_NUMBER) {\n    B32 is_seek_ok = msf_stream_seek(msf, mod->sn, 0);\n    if (is_seek_ok) {\n      symbol_data = msf_stream_read_block(arena, msf, mod->sn, mod->sym_data_size);\n    }\n  }\n  return symbol_data;\n}\n\ninternal String8\ndbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod)\n{\n  String8 c11_data = str8(0,0);\n  if (mod->sn != MSF_INVALID_STREAM_NUMBER) {\n    MSF_UInt c11_data_pos = mod->sym_data_size;\n    B32 is_seek_ok = msf_stream_seek(msf, mod->sn, c11_data_pos);\n    if (is_seek_ok) {\n      c11_data = msf_stream_read_block(arena, msf, mod->sn, mod->c13_data_size);\n    }\n  }\n  return c11_data;\n}\n\ninternal String8\ndbi_module_read_c13_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod)\n{\n  String8 c13_data = str8(0,0);\n  if (mod->sn != MSF_INVALID_STREAM_NUMBER) {\n    MSF_UInt c13_data_pos = mod->sym_data_size + mod->c11_data_size;\n    B32 is_seek_ok = msf_stream_seek(msf, mod->sn, c13_data_pos);\n    if (is_seek_ok) {\n      c13_data = msf_stream_read_block(arena, msf, mod->sn, mod->c13_data_size);\n    }\n  }\n  return c13_data;\n}\n\ninternal void\ndbi_push_section(PDB_DbiContext *dbi, COFF_SectionHeader *hdr)\n{\n  ProfBeginFunction();\n  \n  PDB_DbiSectionNode *n = push_array(dbi->arena, PDB_DbiSectionNode, 1);\n  n->data = *hdr;\n  n->next = 0;\n  SLLQueuePush(dbi->section_list.first, dbi->section_list.last, n);\n  dbi->section_list.count += 1;\n\n  ProfEnd();\n}\n\n////////////////////////////////\n\ninternal MSF_Context *\npdb_alloc_msf(U64 page_size)\n{\n  ProfBeginFunction();\n  MSF_Context *msf = msf_alloc(page_size, MSF_DEFAULT_FPM);\n  MSF_StreamNumber null_sn = msf_stream_alloc(msf);\n  MSF_StreamNumber info_sn = msf_stream_alloc(msf);\n  MSF_StreamNumber tpi_sn = msf_stream_alloc(msf);\n  MSF_StreamNumber dbi_sn = msf_stream_alloc(msf);\n  MSF_StreamNumber ipi_sn = msf_stream_alloc(msf);\n  Assert(null_sn == 0);\n  Assert(info_sn == PDB_FixedStream_Info);\n  Assert(dbi_sn == PDB_FixedStream_Dbi);\n  Assert(tpi_sn == PDB_FixedStream_Tpi);\n  Assert(ipi_sn == PDB_FixedStream_Ipi);\n  ProfEnd();\n  return msf;\n}\n\ninternal PDB_Context *\npdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid)\n{\n  ProfBeginFunction();\n  Arena *arena = arena_alloc();\n  PDB_Context *pdb = push_array(arena, PDB_Context, 1);\n  pdb->arena = arena;\n  pdb->msf   = pdb_alloc_msf(page_size);\n  pdb->info  = pdb_info_alloc(age, time_stamp, guid);\n  pdb->dbi   = dbi_alloc(machine, age);\n  pdb->gsi   = gsi_alloc();\n  pdb->psi   = psi_alloc();\n  pdb->type_servers[CV_TypeIndexSource_NULL] = push_array(arena, PDB_TypeServer, 1);\n  for (U64 i = CV_TypeIndexSource_NULL + 1; i < ArrayCount(pdb->type_servers); ++i) {\n    pdb->type_servers[i] = pdb_type_server_alloc(PDB_TYPE_SERVER_HASH_BUCKET_COUNT_CURRENT);\n  }\n  ProfEnd();\n  return pdb;\n}\n\ninternal PDB_Context *\npdb_open(String8 data)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0, 0);\n  \n  PDB_Context *pdb = 0;\n  \n  MSF_Context *msf = 0;\n  MSF_Error msf_err = msf_open(data, &msf);\n  if (msf_err == MSF_Error_OK) {\n    Arena *arena = arena_alloc();\n    pdb = push_array(arena, PDB_Context, 1);\n    pdb->arena = arena;\n    pdb->msf = msf;\n    pdb->info = pdb_info_open(pdb->msf, PDB_FixedStream_Info);\n    pdb->dbi = dbi_open(pdb->msf, PDB_FixedStream_Dbi);\n    if (pdb->dbi) {\n      MSF_UInt sym_data_size = msf_stream_get_size(pdb->msf, pdb->dbi->symbols_sn);\n      String8 symbol_data = msf_stream_read_block(scratch.arena, pdb->msf, pdb->dbi->symbols_sn, sym_data_size);\n      pdb->gsi = gsi_open(pdb->msf, pdb->dbi->globals_sn, symbol_data);\n      pdb->psi = psi_open(pdb->msf, pdb->dbi->publics_sn, symbol_data);\n    }\n    PDB_StringTable *strtab = &pdb->info->strtab;\n    pdb->type_servers[CV_TypeIndexSource_NULL] = push_array(pdb->arena, PDB_TypeServer, 1);\n    pdb->type_servers[CV_TypeIndexSource_TPI] = pdb_type_server_open(pdb->msf, PDB_FixedStream_Tpi, strtab);\n    if (pdb->info->flags & PDB_FeatureFlag_HAS_ID_STREAM) {\n      pdb->type_servers[CV_TypeIndexSource_IPI] = pdb_type_server_open(pdb->msf, PDB_FixedStream_Ipi, strtab);\n    }\n  }\n  \n  scratch_end(scratch);\n  ProfEnd();\n  return pdb;\n}\n\ninternal void\npdb_release(PDB_Context **pdb_ptr)\n{\n  ProfBeginFunction();\n  PDB_Context *pdb = *pdb_ptr;\n  msf_release(&pdb->msf);\n  dbi_release(&pdb->dbi);\n  gsi_release(&pdb->gsi);\n  for (U64 i = 1; i < ArrayCount(pdb->type_servers); ++i) {\n\tpdb_type_server_release(&pdb->type_servers[i]);\n  }\n  arena_release(pdb->arena);\n  *pdb_ptr = 0;\n  ProfEnd();\n}\n\ninternal void\npdb_set_machine(PDB_Context *pdb, COFF_MachineType machine)\n{\n  pdb->dbi->machine = machine;\n}\n\ninternal void\npdb_set_guid(PDB_Context *pdb, Guid guid)\n{\n  pdb->info->guid = guid;\n}\n\ninternal void\npdb_set_time_stamp(PDB_Context *pdb, COFF_TimeStamp time_stamp)\n{\n  pdb->info->time_stamp = time_stamp;\n}\n\ninternal void\npdb_set_age(PDB_Context *pdb, U32 age)\n{\n  pdb->dbi->age = age;\n  pdb->info->age = age;\n}\n\ninternal COFF_MachineType\npdb_get_machine(PDB_Context *pdb)\n{\n  return pdb->dbi->machine;\n}\n\ninternal COFF_TimeStamp\npdb_get_time_stamp(PDB_Context *pdb)\n{\n  return pdb->info->time_stamp;\n}\n\ninternal U32\npdb_get_age(PDB_Context *pdb)\n{\n  return pdb->info->age;\n}\n\ninternal Guid\npdb_get_guid(PDB_Context *pdb)\n{\n  return pdb->info->guid;\n}\n\ninternal void\npdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht)\n{\n  ProfBeginFunction();\n  \n  PDB_InfoContext *info   = pdb->info;\n  PDB_StringTable *strtab = &info->strtab;\n  PDB_DbiContext  *dbi    = pdb->dbi;\n  PDB_TypeServer  *tpi    = pdb->type_servers[CV_TypeIndexSource_TPI];\n  PDB_TypeServer  *ipi    = pdb->type_servers[CV_TypeIndexSource_IPI];\n  \n  if (dbi->globals_sn == MSF_INVALID_STREAM_NUMBER) {\n    dbi->globals_sn = msf_stream_alloc(pdb->msf);\n  }\n  if (dbi->publics_sn == MSF_INVALID_STREAM_NUMBER) {\n    dbi->publics_sn = msf_stream_alloc(pdb->msf);\n  }\n  if (dbi->symbols_sn == MSF_INVALID_STREAM_NUMBER) {\n    dbi->symbols_sn = msf_stream_alloc(pdb->msf);\n  }\n  \n  pdb_type_server_build(tp, tpi, strtab, pdb->msf, PDB_FixedStream_Tpi);\n  if (info->flags & PDB_FeatureFlag_HAS_ID_STREAM) {\n    pdb_type_server_build(tp, ipi, strtab, pdb->msf, PDB_FixedStream_Ipi);\n  }\n\n  psi_build(tp, pdb->psi, pdb->msf, dbi->publics_sn, dbi->symbols_sn);\n  gsi_build(tp, pdb->gsi, pdb->msf, dbi->globals_sn, dbi->symbols_sn);\n  dbi_build(tp, pdb->dbi, pdb->msf, PDB_FixedStream_Dbi, string_ht);\n  pdb_info_build(pdb->info, pdb->msf, PDB_FixedStream_Info);\n\n  ProfEnd();\n}\n\n////////////////////////////////\n\ninternal String8\npdb_string_from_src_error(PDB_SrcError error)\n{\n  switch (error) {\n  case PDB_SrcError_OK:                      return str8_lit(\"OK\");\n  case PDB_SrcError_DUPLICATE_NAME_STREAM:   return str8_lit(\"DUPLICATE_NAME_STREAM\");\n  case PDB_SrcError_DUPLICATE_ENTRY:         return str8_lit(\"DUPLICATE_ENTRY\");\n  case PDB_SrcError_UNABLE_TO_WRITE_DATA:    return str8_lit(\"UNABLE_TO_WRITE_DATA\");\n  case PDB_SrcError_UNSUPPORTED_COMPRESSION: return str8_lit(\"UNSUPPORTED_COMPRESSION\");\n  case PDB_SrcError_UNKNOWN:                 return str8_lit(\"UNKNOWN\");\n  }\n  return str8(0,0);\n}\n\ninternal String8\npdb_string_from_open_type_server_error(PDB_OpenTypeServerError error)\n{\n  switch (error) {\n  case PDB_OpenTypeServerError_OK:                    return str8_lit(\"OK\");\n  case PDB_OpenTypeServerError_UNKNOWN:               return str8_lit(\"UNKNOWN\");\n  case PDB_OpenTypeServerError_INVALID_BUCKET_COUNT:  return str8_lit(\"INVALID_BUCKET_COUNT\");\n  case PDB_OpenTypeServerError_INVALID_TI_RANGE:      return str8_lit(\"INVALID_TI_RANGE\");\n  case PDB_OpenTypeServerError_UNSUPPORTED_VERSION:   return str8_lit(\"UNSUPPORTED_VERSION\");\n  }\n  return str8(0,0);\n}\n\n"
  },
  {
    "path": "src/linker/pdb_ext/pdb_builder.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n////////////////////////////////\n\n#define PDB_NATURAL_ALIGN 4\n#define PDB_SYMBOL_ALIGN PDB_NATURAL_ALIGN\n\n////////////////////////////////\n// Hash table\n\n#define PDB_HASH_TABLE_PACK_FUNC(name) void name(Arena *arena, String8List *local_data_srl, String8List *key_value_srl, String8 key, String8 value, void *ud)\ntypedef PDB_HASH_TABLE_PACK_FUNC(PDB_HashTablePackFunc);\n\n#define PDB_HASH_TABLE_UNPACK_FUNC(name) B32 name(void *ud, String8 local_data, String8 key_value_data, U64 *key_value_cursor, String8 *key_out, String8 *value_out)\ntypedef PDB_HASH_TABLE_UNPACK_FUNC(PDB_HashTableUnpackFunc);\n\ntypedef struct PDB_HashTableBucket\n{\n  String8 key;\n  String8 value;\n} PDB_HashTableBucket;\n\ntypedef struct PDB_HashTable\n{\n  Arena               *arena;\n  PDB_HashTableBucket *bucket_arr;\n  U32Array             present_bits;\n  U32Array             deleted_bits;\n  U32   \t\t\t         max;\n  U32                  count;\n} PDB_HashTable;\n\ntypedef enum\n{\n  PDB_HashTableParseError_OK,\n  PDB_HashTableParseError_OUT_OF_BYTES,\n  PDB_HashTableParseError_CORRUPTED\n} PDB_HashTableParseError;\n\n////////////////////////////////\n// String Table\n\ntypedef struct PDB_StringTableBucket\n{\n  String8          data;\n  PDB_StringOffset offset;\n  PDB_StringIndex  istr;\n} PDB_StringTableBucket;\n\ntypedef struct PDB_StringTable\n{\n  Arena *arena;\n  U32    version;\n  U32    size;\n  U32    bucket_count;\n  U32    bucket_max;\n  U32   *ibucket_array;\n  PDB_StringTableBucket **bucket_array;\n} PDB_StringTable;\n\ntypedef enum\n{\n  PDB_StringTableOpenError_OK,\n  PDB_StringTableOpenError_BAD_MAGIC,\n  PDB_StringTableOpenError_UNKNOWN_VERSION,\n  PDB_StringTableOpenError_CORRUPTED,\n  PDB_StringTableOpenError_STRING_OFFSET_OUT_OF_BOUNDS,\n  PDB_StringTableOpenError_OFFSETS_EXCEED_BUCKET_COUNT\n} PDB_StringTableOpenError;\n\n////////////////////////////////\n// Type Server\n\n#define PDB_TYPE_HINT_STEP 128\n#define PDB_LEAF_ALIGN PDB_NATURAL_ALIGN \n\ntypedef enum\n{\n  PDB_OpenTypeServerError_OK,\n  PDB_OpenTypeServerError_UNKNOWN,\n  PDB_OpenTypeServerError_INVALID_BUCKET_COUNT,\n  PDB_OpenTypeServerError_INVALID_TI_RANGE,\n  PDB_OpenTypeServerError_UNSUPPORTED_VERSION,\n} PDB_OpenTypeServerError;\n\ntypedef struct PDB_TypeBucket\n{\n  struct PDB_TypeBucket *next;\n  String8                raw_leaf;\n  CV_TypeIndex           type_index;\n} PDB_TypeBucket;\n\ntypedef struct PDB_TypeServer\n{\n  Arena             *arena;\n  CV_TypeIndex       ti_lo;\n  String8List        leaf_list;\n  U64                bucket_cap;\n  PDB_TypeBucket   **buckets;\n  MSF_StreamNumber   hash_sn;\n  PDB_HashTable      hash_adj;\n} PDB_TypeServer;\n\ntypedef struct PDB_TypeHashStreamInfo\n{\n  PDB_OffsetSize hash_vals;\n  PDB_OffsetSize ti_offs;\n  PDB_OffsetSize hash_adj;\n} PDB_TypeHashStreamInfo;\n\ntypedef struct PDB_TypeServerParse\n{\n  Rng1U64 ti_range;\n  String8 leaf_data;\n} PDB_TypeServerParse;\n\ntypedef struct\n{\n  CV_DebugT       debug_t;\n  U64            *udt_counts;\n  U64            *udt_offsets;\n  Rng1U64        *ranges;\n  PDB_TypeServer *type_server;\n  PDB_TypeBucket *udt_buckets;\n} PDB_PushLeafTask;\n\ntypedef struct\n{\n  PDB_TypeServer *ts;\n  U32            *map;\n} PDB_WriteTypeToBucketMap;\n\ntypedef struct\n{\n  CV_TypeIndex    ti_lo;\n  CV_TypeIndex    ti_hi;\n  U64             hint_count;\n  PDB_TpiOffHint *hint_arr;\n  String8Node   **lf_arr;\n  Rng1U64        *lf_range_arr;\n  U64            *lf_cursor_arr;\n  U8             *lf_buf;\n  U64             lf_buf_size;\n} PDB_WriteTypesTask;\n\n////////////////////////////////\n// Info\n\ntypedef struct PDB_InfoParse\n{\n  PDB_TpiVersion   version;\n  COFF_TimeStamp   time_stamp;\n  U32              age;\n  Guid             guid;\n  String8          extra_info;\n} PDB_InfoParse;\n\ntypedef struct PDB_InfoContext\n{\n  Arena            *arena;\n  COFF_TimeStamp    time_stamp;\n  U32               age;\n  Guid              guid;\n  PDB_FeatureFlags  flags;\n  PDB_HashTable     named_stream_ht;\n  PDB_HashTable     src_header_block_ht;\n  PDB_StringTable   strtab;\n} PDB_InfoContext;\n\n////////////////////////////////\n// SRC Header Block\n\ntypedef enum\n{\n  PDB_SrcError_OK,\n  PDB_SrcError_DUPLICATE_NAME_STREAM,\n  PDB_SrcError_DUPLICATE_ENTRY,\n  PDB_SrcError_UNABLE_TO_WRITE_DATA,\n  PDB_SrcError_UNSUPPORTED_COMPRESSION,\n  PDB_SrcError_UNKNOWN\n} PDB_SrcError;\n\n////////////////////////////////\n// GSI\n\n#define PDB_GSI_V70_SYMBOL_ALIGN 4\n#define PDB_GSI_V70_WORD_SIZE    32\n#define PDB_GSI_V70_BUCKET_COUNT 4096\n#define PDB_GSI_V70_BITMAP_COUNT ((PDB_GSI_V70_BUCKET_COUNT / PDB_GSI_V70_WORD_SIZE) + 1)\n#define PDB_GSI_V70_BITMAP_SIZE  (PDB_GSI_V70_BITMAP_COUNT * sizeof(U32))\n\ntypedef struct PDB_GsiContext\n{\n  Arena         *arena;\n  U64            word_size;\n  U64            symbol_align;\n  U64            bucket_count;\n  U64            symbol_count;\n  CV_SymbolList *bucket_arr;\n} PDB_GsiContext;\n\ntypedef struct PDB_GsiSortRecord\n{\n  ISectOff isect_off;\n  String8 name;\n  U64 offset;\n} PDB_GsiSortRecord;\n\ntypedef struct PDB_GsiBuildResult\n{\n  PDB_GsiHeader      header;\n  U64                hash_record_count;\n  PDB_GsiHashRecord *hash_record_arr;\n  PDB_GsiSortRecord *sort_record_arr;\n  U64                bitmap_count;\n  U32               *bitmap;\n  U64                compressed_bucket_count;\n  U32               *compressed_bucket_arr;\n  U64                total_hash_size;\n  String8            symbol_data;\n} PDB_GsiBuildResult;\n\ntypedef struct PDB_GsiSerializeSymbolsTask\n{\n  U64                  symbol_align;\n  CV_SymbolList       *bucket_arr;\n  U64                 *bucket_size_arr;\n  U64                 *bucket_off_arr;\n  U8                  *buffer;\n  PDB_GsiSortRecord  **sort_record_arr_arr;\n  PDB_GsiSortRecord   *sort_record_arr;\n} PDB_GsiSerializeSymbolsTask;\n\n////////////////////////////////\n// PSI\n\ntypedef struct PDB_PsiContext\n{\n  Arena *arena;\n  PDB_GsiContext *gsi;\n} PDB_PsiContext;\n\n////////////////////////////////\n// DBI\n\n#define PDB_MODULE_ALIGN PDB_NATURAL_ALIGN\n\ntypedef struct PDB_DbiModule\n{\n  struct PDB_DbiModule *next;\n  MSF_StreamNumber      sn;\n  CV_ModIndex           imod;\n  PDB_DbiSectionContrib first_sc;\n  U64                   sym_data_size;\n  U64                   c11_data_size;\n  U64                   c13_data_size;\n  U64                   globrefs_size; // TODO: what is this for?\n  String8               obj_path;\n  String8               lib_path;\n  String8List           source_file_list;\n} PDB_DbiModule;\n\ntypedef struct PDB_DbiModuleList\n{\n  PDB_DbiModule *first;\n  PDB_DbiModule *last;\n  U64            count;\n} PDB_DbiModuleList;\n\ntypedef struct PDB_DbiSectionContribNode\n{\n  struct PDB_DbiSectionContribNode *next;\n  PDB_DbiSectionContrib             data;\n} PDB_DbiSectionContribNode;\n\ntypedef struct PDB_DbiSectionContribList\n{\n  PDB_DbiSectionContribNode *first;\n  PDB_DbiSectionContribNode *last;\n  U64                        count;\n} PDB_DbiSectionContribList;\n\ntypedef struct PDB_DbiSectionNode\n{\n  struct PDB_DbiSectionNode *next;\n  COFF_SectionHeader         data;\n} PDB_DbiSectionNode;\n\ntypedef struct PDB_DbiSectionList\n{\n  U64                 count;\n  PDB_DbiSectionNode *first;\n  PDB_DbiSectionNode *last;\n} PDB_DbiSectionList;\n\ntypedef struct PDB_DbiContext\n{\n  Arena                *arena;\n  U32                   age;\n  COFF_MachineType      machine;\n  MSF_StreamNumber      globals_sn;\n  MSF_StreamNumber      publics_sn;\n  MSF_StreamNumber      symbols_sn;\n  PDB_DbiModuleList     module_list;\n  PDB_DbiSectionContribList sec_contrib_list;\n  PDB_DbiSectionList    section_list;\n  PDB_StringTable       ec_names;\n  MSF_StreamNumber      dbg_streams[PDB_DbiStream_COUNT];\n} PDB_DbiContext;\n\n////////////////////////////////\n// PDB\n\ntypedef struct PDB_Context\n{\n  Arena           *arena;\n  MSF_Context     *msf;\n  PDB_InfoContext *info;\n  PDB_DbiContext  *dbi;\n  PDB_GsiContext  *gsi;\n  PDB_PsiContext  *psi;\n  PDB_TypeServer  *type_servers[CV_TypeIndexSource_COUNT];\n} PDB_Context;\n\n////////////////////////////////\n\ntypedef struct\n{\n  PDB_GsiContext *gsi;\n  Rng1U64        *ranges;\n  CV_SymbolNode **symbols;\n  U32            *hashes;\n} GSI_SymbolHasherTask;\n\ntypedef struct\n{\n  CV_StringHashTable   string_ht;\n  PDB_DbiModule      **mod_arr;\n  U16                 *imod_arr;\n  U16                 *source_file_name_count_arr;\n  U32                **source_file_name_offset_arr;\n} PDB_DbiBuildFileInfoTask;\n\n////////////////////////////////\n// PDB\n\ninternal PDB_Context *    pdb_alloc(U64 page_size, COFF_MachineType machine, COFF_TimeStamp time_stamp, U32 age, Guid guid);\ninternal PDB_Context *    pdb_open(String8 data);\ninternal void             pdb_release(PDB_Context **pdb_ptr);\ninternal void             pdb_build(TP_Context *tp, TP_Arena *pool_temp, PDB_Context *pdb, CV_StringHashTable string_ht);\ninternal void             pdb_set_machine(PDB_Context *pdb, COFF_MachineType machine);\ninternal void             pdb_set_guid(PDB_Context *pdb, Guid guid);\ninternal void             pdb_set_time_stamp(PDB_Context *pdb, COFF_TimeStamp time_stamp);\ninternal void             pdb_set_age(PDB_Context *pdb, U32 age);\ninternal COFF_MachineType pdb_get_machine(PDB_Context *pdb);\ninternal COFF_TimeStamp   pdb_get_time_stamp(PDB_Context *pdb);\ninternal U32              pdb_get_age(PDB_Context *pdb);\ninternal Guid             pdb_get_guid(PDB_Context *pdb);\n\n////////////////////////////////\n// Info\n\ninternal PDB_InfoContext * pdb_info_alloc(U32 age, COFF_TimeStamp time_stamp, Guid guid);\ninternal void              pdb_info_parse_from_data(String8 data, PDB_InfoParse *parse_out);\ninternal PDB_InfoContext * pdb_info_open(MSF_Context *msf, MSF_StreamNumber sn);\ninternal void              pdb_info_build(PDB_InfoContext *info, MSF_Context *msf, MSF_StreamNumber sn);\ninternal void              pdb_info_release(PDB_InfoContext **info_ptr);\ninternal MSF_StreamNumber  pdb_push_named_stream(PDB_HashTable *named_stream_ht, MSF_Context *msf, String8 name);\ninternal MSF_StreamNumber  pdb_find_named_stream(PDB_HashTable *named_stream_ht, String8 name);\ninternal PDB_SrcError      pdb_add_src(PDB_InfoContext *info, MSF_Context *msf, String8 file_path, String8 file_data, PDB_SrcCompType comp);\n\n////////////////////////////////\n// GSI\n\ninternal PDB_GsiContext *   gsi_alloc(void);\ninternal PDB_GsiContext *   gsi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data);\ninternal void               gsi_build(TP_Context *tp, PDB_GsiContext *gsi, MSF_Context *msf, MSF_StreamNumber gsi_sn, MSF_StreamNumber symbols_sn);\ninternal void               gsi_release(PDB_GsiContext **gsi_ptr);\ninternal void               gsi_write_build_result(TP_Context *tp, PDB_GsiBuildResult build, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn);\ninternal PDB_GsiBuildResult gsi_build_ex(TP_Context *tp, Arena *arena, PDB_GsiContext *gsi, U64 symbol_data_base, B32 export_symbol_ptr_arr, U64 msf_page_size);\ninternal U32                gsi_hash(PDB_GsiContext *gsi, String8 input);\ninternal CV_SymbolNode *    gsi_push(PDB_GsiContext *gsi, CV_Symbol *symbol);\ninternal void               gsi_push_many_arr(TP_Context *tp, PDB_GsiContext *gsi, U64 count, CV_SymbolNode **symbol_arr);\ninternal void               gsi_push_many_list(PDB_GsiContext *gsi, U64 count, U32 *hash_arr, CV_SymbolList *list);\ninternal CV_SymbolNode *    gsi_search(PDB_GsiContext *gsi, CV_Symbol *symbol);\n\n////////////////////////////////\n// PSI\n\ninternal PDB_PsiContext * psi_alloc(void);\ninternal PDB_PsiContext * psi_open(MSF_Context *msf, MSF_StreamNumber sn, String8 symbol_data);\ninternal void             psi_build(TP_Context *tp, PDB_PsiContext *psi, MSF_Context *msf, MSF_StreamNumber sn, MSF_StreamNumber symbols_sn);\ninternal void             psi_release(PDB_PsiContext **psi_ptr);\ninternal CV_SymbolNode *  psi_push(PDB_PsiContext *psi, CV_Pub32Flags flags, U32 offset, U16 isect, String8 name);\n\n// TODO:\n//internal CV_Symbol psi_neareset_symbol(PDB_PsiContext *psi, U16 isect, U32 off);\n//internal void      psi_push_thunk_map(PDB_PsiContext *psi, U32 *thunk_map, U32 thunk_count, U32 thunk_size, PDB_SO *sect_map, U32 sect_count, ISectOff thunk_table);\n\n////////////////////////////////\n// DBI\n\ninternal PDB_DbiContext *          dbi_alloc(COFF_MachineType machine, U32 age);\ninternal PDB_DbiContext *          dbi_open(MSF_Context *msf, MSF_StreamNumber sn);\ninternal void                      dbi_build(TP_Context *tp, PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber dbi_sn, CV_StringHashTable string_ht);\ninternal void                      dbi_release(PDB_DbiContext **dbi_ptr);\ninternal PDB_DbiModule *           dbi_push_module(PDB_DbiContext *dbi, String8 obj_path, String8 lib_path);\ninternal String8                   dbi_module_read_symbol_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod);\ninternal String8                   dbi_module_read_c11_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod);\ninternal String8                   dbi_module_read_c13_data(Arena *arena, MSF_Context *msf, PDB_DbiModule *mod);\ninternal void                      dbi_module_push_section_contrib(PDB_DbiContext *dbi, PDB_DbiModule *mod, ISectOff isect_off, U32 size,  U32 data_crc, U32 reloc_crc, COFF_SectionFlags flags);\ninternal String8List *             dbi_open_file_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header);\ninternal PDB_DbiModuleList         dbi_open_module_info(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header, String8List *file_info);\ninternal PDB_DbiSectionContribList dbi_open_sec_contrib(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header);\ninternal PDB_StringTable           dbi_open_ec_names(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header);\ninternal void                      dbi_open_dbg_streams(MSF_StreamNumber *dbg_streams, MSF_Context *msf, MSF_StreamNumber sn, PDB_DbiHeader *dbi_header);\ninternal PDB_DbiSectionList        dbi_open_section_headers(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn);\ninternal void                      dbi_build_section_header_stream(PDB_DbiContext *dbi, MSF_Context *msf, MSF_StreamNumber sn);\n\n////////////////////////////////\n// Hash Table\n\ninternal void                    pdb_hash_table_alloc(PDB_HashTable *ht, U32 max);\ninternal void                    pdb_hash_table_release(PDB_HashTable *ht);\ninternal PDB_HashTableParseError pdb_hash_table_from_data(PDB_HashTable *ht, String8 data, B32 has_local_data, PDB_HashTableUnpackFunc *unpack_func, void *unpack_ud, U64 *read_bytes_out);\ninternal String8                 pdb_data_from_hash_table(Arena *arena, PDB_HashTable *ht, B32 has_local_data, PDB_HashTablePackFunc *pack_func, void *pack_ud);\ninternal void                    pdb_hash_table_set(PDB_HashTable *ht, String8 key, String8 value);\ninternal B32                     pdb_hash_table_get(PDB_HashTable *ht, String8 key, String8 *value_out);\ninternal void                    pdb_hash_table_delete(PDB_HashTable *ht, String8 key);\ninternal B32                     pdb_hash_table_try_set(PDB_HashTable *ht, String8 key, String8 value);\ninternal B32                     pdb_hash_table_is_present(PDB_HashTable *ht, U32 k);\ninternal B32                     pdb_hash_table_is_deleted(PDB_HashTable *ht, U32 k);\ninternal U32                     pdb_hash_table_hash(String8 key);\ninternal void                    pdb_hash_table_grow(PDB_HashTable *ht, U64 new_capacity);\ninternal void                    pdb_hash_table_get_present_keys_and_values(Arena *arena, PDB_HashTable *ht, String8Array *keys_out, String8Array *values_out);\n\n////////////////////////////////\n\ninternal PDB_HashTableParseError pdb_hash_adj_hash_table_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out);\ninternal PDB_HashTableParseError pdb_src_header_block_ht_from_data(PDB_HashTable *ht, String8 data, PDB_StringTable *strtab, U64 *read_bytes_out);\ninternal PDB_HashTableParseError pdb_named_stream_ht_from_data(PDB_HashTable *ht, String8 data, U64 *read_bytes_out);\n\ninternal String8 pdb_data_from_hash_adj_hash_table(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab);\ninternal String8 pdb_data_from_src_header_block_ht(Arena *arena, PDB_HashTable *ht, PDB_StringTable *strtab);\ninternal String8 pdb_data_from_named_stream_ht(Arena *arena, PDB_HashTable *ht);\n\n////////////////////////////////\n// String Table\n\ninternal void                     pdb_strtab_alloc(PDB_StringTable *strtab, U32 max);\ninternal PDB_StringTableOpenError pdb_strtab_open(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn);\ninternal void                     pdb_strtab_build(PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn);\ninternal void                     pdb_strtab_release(PDB_StringTable *strtab);\ninternal PDB_StringIndex          pdb_strtab_add(PDB_StringTable *strtab, String8 string);\ninternal B32                      pdb_strtab_search(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out);\ninternal String8                  pdb_strtab_string_from_offset(PDB_StringTable *strtab, PDB_StringOffset offset);\ninternal PDB_StringOffset         pdb_strtab_string_to_offset(PDB_StringTable *strtab, PDB_StringIndex stridx);\ninternal U32                      pdb_strtab_get_serialized_size(PDB_StringTable *strtab);\ninternal B32                      pdb_strtab_try_add(PDB_StringTable *strtab, String8 string, PDB_StringIndex *index_out);\ninternal void                     pdb_strtab_grow(PDB_StringTable *strtab, U64 new_max);\ninternal U32                      pdb_strtab_hash(PDB_StringTable *strtab, String8 string);\n\n////////////////////////////////\n// Type Server\n\ninternal PDB_OpenTypeServerError pdb_type_server_parse_from_data_v80(String8 data, PDB_TypeServerParse *parse_out);\ninternal PDB_OpenTypeServerError pdb_type_server_parse_from_data(String8 data, PDB_TypeServerParse *parse_out);\ninternal PDB_TypeServer *        pdb_type_server_alloc(U64 bucket_count);\ninternal PDB_TypeServer *        pdb_type_server_open_v80(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab);\ninternal PDB_TypeServer *        pdb_type_server_open(MSF_Context *msf, MSF_StreamNumber sn, PDB_StringTable *strtab);\ninternal void                    pdb_type_server_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, MSF_StreamNumber sn);\ninternal void                    pdb_type_server_release(PDB_TypeServer **serv_ptr);\ninternal void                    pdb_type_server_push(PDB_TypeServer *ts, String8 raw_leaf);\ninternal void                    pdb_type_server_push_parallel(TP_Context *tp, PDB_TypeServer *ts, CV_DebugT types);\n//internal CV_LeafNode *     pdb_type_server_leaf_from_string(PDB_TypeServer *ts, String8 string);\ninternal String8Node *           pdb_type_server_reserve(PDB_TypeServer *ts, U64 count);\ninternal String8Node *           pdb_type_server_make_leaf(PDB_TypeServer *ts, CV_LeafKind kind, String8 data);\ninternal void                    pdb_type_server_push_bucket(PDB_TypeServer *ts, CV_Leaf *leaf);\ninternal PDB_TypeHashStreamInfo  pdb_type_hash_stream_build(TP_Context *tp, PDB_TypeServer *ts, PDB_StringTable *strtab, MSF_Context *msf, PDB_TpiOffHint *hint_arr, U64 hint_count);\n\n////////////////////////////////\n// Enum -> String\n\ninternal String8 pdb_string_from_src_error(PDB_SrcError error);\ninternal String8 pdb_string_from_open_type_server_error(PDB_OpenTypeServerError error);\n\n\n"
  },
  {
    "path": "src/linker/pdb_ext/pdb_helpers.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal U64\npdb_read_bit_vector_string(String8 data, U64 offset, U32Array *bits_out)\n{\n  U64 cursor = offset;\n  \n  U32 word_count = 0;\n  cursor += str8_deserial_read_struct(data, cursor, &word_count);\n  \n  U64 word_data_read_size = word_count * sizeof(U32);\n  String8 word_data = str8(0,0);\n  cursor += str8_deserial_read_block(data, cursor, word_data_read_size, &word_data);\n  \n  if (word_data.size == word_data_read_size) {\n    bits_out->count = word_count;\n    bits_out->v = (U32*)word_data.str;\n  } else {\n    bits_out->count = 0;\n    bits_out->v = 0;\n  }\n  \n  U64 read_size = cursor - offset;\n  return read_size;\n}\n\ninternal U64\npdb_read_bit_vector_msf(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U32Array *bits_out)\n{\n  // peek word count\n  MSF_UInt pos = msf_stream_get_pos(msf, sn);\n  U32 word_count = msf_stream_read_u32(msf, sn);\n  msf_stream_seek(msf, sn, pos);\n  \n  // read out header + packed words\n  U64 buffer_size = sizeof(word_count) + word_count * sizeof(U32);\n  U8 *buffer = push_array(arena, U8, buffer_size);\n  MSF_UInt read_size = msf_stream_read(msf, sn, buffer, buffer_size);\n  Assert(read_size == buffer_size);\n  \n  // parse words\n  U64 parse_size = pdb_read_bit_vector_string(str8(buffer, buffer_size), 0, bits_out);\n  return parse_size;\n}\n\ninternal B32\npdb_write_bit_vector(MSF_Context *msf, MSF_StreamNumber sn, B32 *flag_array, U64 flag_count)\n{\n  B32 is_write_ok = 0;\n\n  U32 word_size = sizeof(U32);\n  U32 bits_per_word = MSF_BITS_PER_CHAR * word_size;\n  U32 word_count = (flag_count + MSF_BITS_PER_CHAR) / MSF_BITS_PER_CHAR;\n  \n  is_write_ok = msf_stream_write_struct(msf, sn, &word_count);\n  if (is_write_ok) {\n    for (U64 iword = 0, iflag = 0; iword < word_count; ++iword) {\n      U32 word = 0;\n      \n      for (U64 iflag_opl = Min(flag_count, iflag + MSF_BITS_PER_CHAR); iflag < iflag_opl; ++iflag) {\n        if (flag_array[iflag]) {\n          word |= 1 << (iflag % bits_per_word);\n        }\n      }\n      \n      is_write_ok = msf_stream_write_struct(msf, sn, &word);\n      if (!is_write_ok) {\n        break;\n      }\n    }\n  }\n\n  return is_write_ok;\n}\n\ninternal U64\npdb_get_bit_vector_size(U32 bucket_count)\n{\n  U32 word_size = sizeof(U32);\n  U32 word_count = (bucket_count + MSF_BITS_PER_CHAR) / MSF_BITS_PER_CHAR;\n  \n  U64 result = 0;\n  result += sizeof(word_count);\n  result += word_size * word_count;\n  \n  return result;\n}\n\n"
  },
  {
    "path": "src/linker/pdb_ext/pdb_helpers.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal U32 pdb_hash_v1(String8 data);\ninternal U32 pdb_hash_udt(CV_UDTInfo udt_info, String8 data);\n\ninternal U64 pdb_read_bit_vector_string(String8 data, U64 offset, U32Array *bits_out);\ninternal U64 pdb_read_bit_vector_msf(Arena *arena, MSF_Context *msf, MSF_StreamNumber sn, U32Array *bits_out);\ninternal B32 pdb_write_bit_vector(MSF_Context *msf, MSF_StreamNumber sn, B32 *flag_array, U64 flag_count);\ninternal U64 pdb_get_bit_vector_size(U32 bucket_count);\n\n\n"
  },
  {
    "path": "src/linker/rdi/rdi_builder.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal RDIB_DataModel\nrdib_infer_data_model(OperatingSystem os, RDI_Arch arch)\n{\n  RDIB_DataModel data_model = RDIB_DataModel_Null;\n  switch (os) {\n  case OperatingSystem_Null: break;\n  case OperatingSystem_Windows: {\n    switch (arch) {\n    case RDI_Arch_X86:\n    case RDI_Arch_X64:\n      data_model = RDIB_DataModel_LLP64; break;\n    default: NotImplemented;\n    }\n  } break;\n  case OperatingSystem_Linux: {\n    switch (arch) {\n    case RDI_Arch_X86: data_model = RDIB_DataModel_ILP32; break;\n    case RDI_Arch_X64: data_model = RDIB_DataModel_LLP64; break;\n    default: NotImplemented;\n    }\n  } break;\n  case OperatingSystem_Mac: {\n    switch (arch) {\n    case RDI_Arch_X86: NotImplemented; break;\n    case RDI_Arch_X64: data_model = RDIB_DataModel_LP64; break;\n    }\n  } break;\n  default: InvalidPath;\n  }\n  return data_model;\n}\n\ninternal RDI_TypeKind\nrdib_short_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_S16;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_S16;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_S16;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_S16;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_S64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_unsigned_short_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_U16;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_U16;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_U16;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_U16;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_U64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_int_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_S32;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_S32;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_S32;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_S64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_unsigned_int_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_U32;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_U32;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_U64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_long_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_S32;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_S32;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_S64;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_S64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_unsigned_long_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_U32;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_U64;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_U64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_long_long_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_S64;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_S64;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_S64;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_S64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_S64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_unsigned_long_long_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_U64;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_U64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_TypeKind\nrdib_pointer_size_t_type_from_data_model(RDIB_DataModel data_model)\n{\n  switch (data_model) {\n  case RDIB_DataModel_Null  : break;\n  case RDIB_DataModel_ILP32 : return RDI_TypeKind_U32;\n  case RDIB_DataModel_LLP64 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_LP64  : return RDI_TypeKind_U64;\n  case RDIB_DataModel_ILP64 : return RDI_TypeKind_U64;\n  case RDIB_DataModel_SILP64: return RDI_TypeKind_U64;\n  default: InvalidPath;\n  }\n  return RDI_TypeKind_NULL;\n}\n\n////////////////////////////////\n\ninternal void\nrdib_udt_member_list_push_node(RDIB_UDTMemberList *list, RDIB_UDTMember *node)\n{\n  SLLQueuePushCount(list, node);\n}\n\ninternal void\nrdib_udt_member_list_concat_in_place(RDIB_UDTMemberList *list, RDIB_UDTMemberList *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal void\nrdib_line_table_push_fragment_node(RDIB_LineTable *list, RDIB_LineTableFragment *n)\n{\n  SLLQueuePush_N(list->first, list->last, n, next_line_table);\n  ++list->count;\n}\n\ninternal RDIB_LineTableFragment *\nrdib_line_table_push(Arena *arena, RDIB_LineTable *list)\n{\n  RDIB_LineTableFragment *n = push_array(arena, RDIB_LineTableFragment, 1);\n  rdib_line_table_push_fragment_node(list, n);\n  return n;\n}\n\n////////////////////////////////\n\ninternal RDIB_LineTableFragment *\nrdib_line_table_fragment_chunk_list_push(Arena *arena, RDIB_LineTableFragmentChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_LineTableFragment);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Unit *\nrdib_unit_chunk_list_push(Arena *arena, RDIB_UnitChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_Unit);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Scope *\nrdib_scope_chunk_list_push(Arena *arena, RDIB_ScopeChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_Scope);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Procedure *\nrdib_procedure_chunk_list_push(Arena *arena, RDIB_ProcedureChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_Procedure);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Variable *\nrdib_variable_chunk_list_push(Arena *arena, RDIB_VariableChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_Variable);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_LineTable *\nrdib_line_table_chunk_list_push(Arena *arena, RDIB_LineTableChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_LineTable);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Type *\nrdib_type_chunk_list_push(Arena *arena, RDIB_TypeChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_Type);\n  RDIB_Type *type = SLLChunkListLastItem(list);\n  type->final_idx = 0;\n  return type;\n}\n\ninternal RDIB_UDTMember *\nrdib_udt_member_chunk_list_push(Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_UDTMember);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_SourceFile *\nrdib_source_file_chunk_list_push(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_SourceFile);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_InlineSite *\nrdib_inline_site_chunk_list_push(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap)\n{\n  SLLChunkListPush(arena, list, cap, RDIB_InlineSite);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Unit *\nrdib_unit_chunk_list_push_zero(Arena *arena, RDIB_UnitChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_Unit);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Scope *\nrdib_scope_chunk_list_push_zero(Arena *arena, RDIB_ScopeChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_Scope);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Procedure *\nrdib_procedure_chunk_list_push_zero(Arena *arena, RDIB_ProcedureChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_Procedure);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Variable *\nrdib_variable_chunk_list_push_zero(Arena *arena, RDIB_VariableChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_Variable);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_LineTable *\nrdib_line_table_chunk_list_push_zero(Arena *arena, RDIB_LineTableChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_LineTable);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_Type *\nrdib_type_chunk_list_push_zero(Arena *arena, RDIB_TypeChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_Type);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_UDTMember *\nrdib_udt_member_chunk_list_push_zero(Arena *arena, RDIB_UDTMemberChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_UDTMember);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_SourceFile *\nrdib_source_file_chunk_list_push_zero(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_SourceFile);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_InlineSite *\nrdib_inline_site_chunk_list_push_zero(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap)\n{\n  SLLChunkListPushZero(arena, list, cap, RDIB_InlineSite);\n  return SLLChunkListLastItem(list);\n}\n\ninternal RDIB_UnitChunk *\nrdib_unit_chunk_list_reserve_ex(Arena *arena, RDIB_UnitChunkList *list, U64 count_per_chunk, U64 item_count)\n{\n  U64             chunk_count = CeilIntegerDiv(item_count, count_per_chunk);\n  RDIB_UnitChunk *chunks      = push_array(arena, RDIB_UnitChunk, chunk_count);\n  U64             base        = list->last ? list->last->base : 0;\n\n  for (U64 i = 0; i+1 < chunk_count; i += 1, item_count -= count_per_chunk, base += count_per_chunk) {\n    chunks[i].base  = base;\n    chunks[i].count = count_per_chunk;\n    chunks[i].cap   = count_per_chunk;\n    chunks[i].v     = push_array(arena, RDIB_Unit, count_per_chunk);\n    SLLQueuePush(list->first, list->last, &chunks[i]);\n\n    for (U64 k = 0; k < count_per_chunk; ++k) {\n      chunks[i].v[k].chunk = &chunks[i];\n    }\n  }\n\n  chunks[chunk_count-1].base  = base;\n  chunks[chunk_count-1].count = item_count;\n  chunks[chunk_count-1].cap   = item_count;\n  chunks[chunk_count-1].v     = push_array(arena, RDIB_Unit, item_count);\n  for (U64 k = 0; k < item_count; ++k) {\n    chunks[chunk_count-1].v[k].chunk = &chunks[chunk_count-1];\n  }\n\n  SLLQueuePush(list->first, list->last, &chunks[chunk_count-1]);\n  list->count += chunk_count;\n\n  return chunks;\n}\n\ninternal void\nrdib_unit_chunk_list_reserve(Arena *arena, RDIB_UnitChunkList *list, U64 cap)\n{\n  // fill out node\n  RDIB_UnitChunk *chunk = push_array(arena, RDIB_UnitChunk, 1);\n  chunk->cap            = cap;\n  chunk->v              = push_array(arena, RDIB_Unit, cap);\n\n  // push node to list\n  SLLQueuePush(list->first, list->last, chunk);\n  list->count += 1;\n}\n\ninternal void\nrdib_type_chunk_list_reserve(Arena *arena, RDIB_TypeChunkList *list, U64 cap)\n{\n  // fill out node\n  RDIB_TypeChunk *chunk = push_array(arena, RDIB_TypeChunk, 1);\n  chunk->cap            = cap;\n  chunk->v              = push_array(arena, RDIB_Type, cap);\n\n  // push node to list\n  SLLQueuePush(list->first, list->last, chunk);\n  list->count += 1;\n}\n\ninternal void\nrdib_source_file_list_reserve(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap)\n{\n  // fill out node\n  RDIB_SourceFileChunk *chunk = push_array(arena, RDIB_SourceFileChunk, 1);\n  chunk->cap                  = cap;\n  chunk->v                    = push_array(arena, RDIB_SourceFile, cap);\n\n  // push node to list\n  SLLQueuePush(list->first, list->last, chunk);\n  list->count += 1;\n}\n\ninternal void\nrdib_unit_chunk_list_concat_in_place(RDIB_UnitChunkList *list, RDIB_UnitChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_UnitChunk);\n}\n\ninternal void\nrdib_scope_chunk_list_concat_in_place(RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_ScopeChunk);\n}\n\ninternal void\nrdib_udt_member_chunk_list_concat_in_place(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_UDTMemberChunk);\n}\n\ninternal void\nrdib_procedure_chunk_list_concat_in_place(RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_ProcedureChunk);\n}\n\ninternal void\nrdib_variable_chunk_list_concat_in_place(RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_VariableChunk);\n}\n\ninternal void\nrdib_line_table_chunk_list_concat_in_place(RDIB_LineTableChunkList *list, RDIB_LineTableChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_LineTableChunk);\n}\n\ninternal void\nrdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_InlineSiteChunk);\n}\n\ninternal void\nrdib_type_chunk_list_concat_in_place(RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_TypeChunk);\n}\n\ninternal void\nrdib_source_file_chunk_list_concat_in_place(RDIB_SourceFileChunkList *list, RDIB_SourceFileChunkList *to_concat)\n{\n  SLLConcatInPlaceChunkList(list, to_concat, RDIB_SourceFileChunk);\n}\n\ninternal void\nrdib_line_table_chunk_list_concat_in_place_many(RDIB_LineTableChunkList *list, RDIB_LineTableChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_LineTableChunk, count);\n}\n\ninternal void\nrdib_scope_chunk_list_concat_in_place_many(RDIB_ScopeChunkList *list, RDIB_ScopeChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_ScopeChunk, count);\n}\n\ninternal void\nrdib_variable_chunk_list_concat_in_place_many(RDIB_VariableChunkList *list, RDIB_VariableChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_VariableChunk, count);\n}\n\ninternal void\nrdib_procedure_chunk_list_concat_in_place_many(RDIB_ProcedureChunkList *list, RDIB_ProcedureChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_ProcedureChunk, count);\n}\n\ninternal void\nrdib_inline_site_chunk_list_concat_in_place_many(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_InlineSiteChunk, count);\n}\n\ninternal void\nrdib_type_chunk_list_concat_in_place_many(RDIB_TypeChunkList *list, RDIB_TypeChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_TypeChunk, count);\n}\n\ninternal void\nrdib_udt_member_chunk_list_concat_in_place_many(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat, U64 count)\n{\n  SLLConcatInPlaceChunkListArray(list, to_concat, RDIB_UDTMemberChunk, count);\n}\n\ninternal RDIB_UnitChunk **\nrdib_array_from_unit_chunk_list(Arena *arena, RDIB_UnitChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_UnitChunk **result = push_array_no_zero(arena, RDIB_UnitChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_UnitChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_ScopeChunk **\nrdib_array_from_scope_chunk_list(Arena *arena, RDIB_ScopeChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_ScopeChunk **result = push_array_no_zero(arena, RDIB_ScopeChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_ScopeChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_VariableChunk **\nrdib_array_from_variable_chunk_list(Arena *arena, RDIB_VariableChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_VariableChunk **result = push_array_no_zero(arena, RDIB_VariableChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_VariableChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_LineTableChunk **\nrdib_array_from_line_table_chunk_list(Arena *arena, RDIB_LineTableChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_LineTableChunk **result = push_array_no_zero(arena, RDIB_LineTableChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_LineTableChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_ProcedureChunk **\nrdib_array_from_procedure_chunk_list(Arena *arena, RDIB_ProcedureChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_ProcedureChunk **result = push_array_no_zero(arena, RDIB_ProcedureChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_ProcedureChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_InlineSiteChunk **\nrdib_array_from_inline_site_chunk_list(Arena *arena, RDIB_InlineSiteChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_InlineSiteChunk **result = push_array_no_zero(arena, RDIB_InlineSiteChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_InlineSiteChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_UDTMemberChunk **\nrdib_array_from_udt_member_chunk_list(Arena *arena, RDIB_UDTMemberChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_UDTMemberChunk **result = push_array_no_zero(arena, RDIB_UDTMemberChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_UDTMemberChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_TypeChunk **\nrdib_array_from_type_chunk_list(Arena *arena, RDIB_TypeChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_TypeChunk **result = push_array_no_zero(arena, RDIB_TypeChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_TypeChunk *chunk = list.first; chunk != 0; chunk = chunk->next, ++chunk_idx) {\n    result[chunk_idx] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal RDIB_SourceFileChunk **\nrdib_array_from_source_file_chunk_list(Arena *arena, RDIB_SourceFileChunkList list)\n{\n  ProfBeginFunction();\n  RDIB_SourceFileChunk **result = push_array_no_zero(arena, RDIB_SourceFileChunk *, list.count);\n  U64 chunk_idx = 0;\n  for (RDIB_SourceFileChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    result[chunk_idx++] = chunk;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal U64\nrdib_unit_chunk_list_total_count(RDIB_UnitChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_UnitChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_scope_chunk_list_total_count(RDIB_ScopeChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_ScopeChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_variable_chunk_list_total_count(RDIB_VariableChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_VariableChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_line_table_chunk_list_total_count(RDIB_LineTableChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_LineTableChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_procedure_chunk_list_total_count(RDIB_ProcedureChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_ProcedureChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_inline_site_chunk_list_total_count(RDIB_InlineSiteChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_InlineSiteChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_udt_member_chunk_list_total_count(RDIB_UDTMemberChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_UDTMemberChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_type_chunk_list_total_count(RDIB_TypeChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_TypeChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U64\nrdib_source_file_chunk_list_total_count(RDIB_SourceFileChunkList list)\n{\n  U64 total_count = 0;\n  for (RDIB_SourceFileChunk *chunk = list.first; chunk != 0; chunk = chunk->next) {\n    total_count += chunk->count;\n  }\n  return total_count;\n}\n\ninternal U32\nrdib_idx_from_unit(RDIB_Unit *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_scope(RDIB_Scope *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_inline_site(RDIB_InlineSite *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_variable(RDIB_Variable *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_procedure(RDIB_Procedure *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_source_file(RDIB_SourceFile *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_line_table(RDIB_LineTable *n)\n{\n  U32 idx = 0;\n  if (n) {\n    Assert(n->chunk->v <= n && n < (n->chunk->v + n->chunk->count));\n    idx = safe_cast_u32(n->chunk->base + (n - n->chunk->v));\n    Assert(idx - n->chunk->base < n->chunk->count);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_type(RDIB_Type *n)\n{\n  U32 idx = 0;\n  if (n) {\n    idx = safe_cast_u32(n->final_idx);\n  }\n  return idx;\n}\n\ninternal U32\nrdib_idx_from_udt_type(RDIB_Type *n)\n{\n  U32 idx = 0;\n  if (n && RDI_IsUserDefinedType(n->kind)) {\n    idx = safe_cast_u32(n->udt.udt_idx);\n  }\n  return idx;\n}\n\n////////////////////////////////\n// Source File\n\ninternal B32\nrdib_source_file_match(RDIB_SourceFile *a, RDIB_SourceFile *b, OperatingSystem os)\n{\n  StringMatchFlags match_flags = path_match_flags_from_os(os);\n  if (str8_match(a->normal_full_path, b->normal_full_path, match_flags)) {\n    if (a->checksum_kind == b->checksum_kind) {\n      if (str8_match(a->checksum, b->checksum, 0)) {\n        return 1;\n      }\n    }\n  }\n  return 0;\n}\n\n////////////////////////////////\n// Eval Ops\n\ninternal RDIB_EvalBytecodeOp *\nrdib_bytecode_push_op(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p)\n{\n  RDIB_EvalBytecodeOp *node = push_array(arena, RDIB_EvalBytecodeOp, 1);\n  node->op                  = op;\n  node->p_size              = RDI_DECODEN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[op]);\n  node->p                   = p;\n\n  SLLQueuePush(bytecode->first, bytecode->last, node);\n  bytecode->count += 1;\n  bytecode->size  += 1 + node->p_size;\n\n  return node;\n}\n\ninternal void\nrdib_bytecode_push_ucsont(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_U64 uconst)\n{\n  if (uconst <= max_U8) {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, uconst);\n  } else if (uconst <= max_U16) {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, uconst);\n  } else if (uconst <= max_U32) {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, uconst);\n  } else {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, uconst);\n  }\n}\n\ninternal void\nrdib_bytecode_push_sconst(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_S64 sconst)\n{\n  if (min_S8 <= sconst && sconst <= max_S8) {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU8, (RDI_U64)sconst);\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 8);\n  } else if (min_S16 <= sconst && sconst <= max_S16) {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU16, (RDI_U64)sconst);\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_TruncSigned, 16);\n  } else if (min_S32 <= sconst && sconst <= max_S32) {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU32, (RDI_U64)sconst);\n  } else {\n    rdib_bytecode_push_op(arena, bytecode, RDI_EvalOp_ConstU64, (RDI_U64)sconst);\n  }\n}\n\n////////////////////////////////\n// Location\n\ninternal RDIB_Location\nrdib_make_location_addr_byte_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode)\n{\n  RDIB_Location loc = {0};\n  loc.ranges        = ranges;\n  loc.kind          = RDI_LocationKind_AddrBytecodeStream;\n  loc.bytecode      = bytecode;\n  return loc;\n}\n\ninternal RDIB_Location\nrdib_make_location_addr_bytecode_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode)\n{\n  RDIB_Location loc = {0};\n  loc.ranges        = ranges;\n  loc.kind          = RDI_LocationKind_AddrBytecodeStream;\n  loc.bytecode      = bytecode;\n  return loc;\n}\n\ninternal RDIB_Location\nrdib_make_location_val_bytecode_stream(Rng1U64List ranges, RDIB_EvalBytecode bytecode)\n{\n  RDIB_Location loc = {0};\n  loc.ranges        = ranges;\n  loc.kind          = RDI_LocationKind_ValBytecodeStream;\n  loc.bytecode      = bytecode;\n  return loc;\n}\n\ninternal RDIB_Location\nrdib_make_location_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset)\n{\n  RDIB_Location loc = {0};\n  loc.ranges        = ranges;\n  loc.kind          = RDI_LocationKind_AddrRegPlusU16;\n  loc.reg_code      = reg_code;\n  loc.offset        = offset;\n  return loc;\n}\n\ninternal RDIB_Location\nrdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset)\n{\n  RDIB_Location loc = {0};\n  loc.kind          = RDI_LocationKind_AddrAddrRegPlusU16;\n  loc.ranges        = ranges;\n  loc.reg_code      = reg_code;\n  loc.offset        = offset;\n  return loc;\n}\n\ninternal RDIB_Location\nrdib_make_location_val_reg(Rng1U64List ranges, RDI_RegCode reg_code)\n{\n  RDIB_Location loc = {0};\n  loc.kind          = RDI_LocationKind_ValReg;\n  loc.ranges        = ranges;\n  loc.reg_code      = reg_code;\n  return loc;\n}\n\ninternal RDIB_LocationNode *\nrdib_location_list_push(Arena *arena, RDIB_LocationList *list, RDIB_Location v)\n{\n  RDIB_LocationNode *node = push_array(arena, RDIB_LocationNode, 1);\n  node->v = v;\n  SLLQueuePush(list->first, list->last, node);\n  ++list->count;\n  return node;\n}\n\ninternal RDIB_LocationNode *\nrdib_push_location_addr_reg_off(Arena *arena, RDIB_LocationList *list, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 is_reference, Rng1U64List ranges)\n{\n  RDIB_Location loc;\n\n  if (0 <= offset && offset <= (S64)max_U16) {\n    if (is_reference) {\n      loc = rdib_make_location_addr_addr_reg_plus_u16(ranges, reg_code, (U16)offset);\n    } else {\n      loc = rdib_make_location_addr_reg_plus_u16(ranges, reg_code, (U16)offset);\n    }\n  }\n\n  // long offset, emit byte code\n  else {\n    RDIB_EvalBytecode bytecode = {0};\n    U32 reg_read_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos);\n    rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, reg_read_param);\n    rdib_bytecode_push_sconst(arena, &bytecode, offset);\n    rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0);\n\n    if (is_reference) {\n      U64 addr_size = rdi_addr_size_from_arch(arch);\n      rdib_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size);\n    }\n\n    loc = rdib_make_location_addr_bytecode_stream(ranges, bytecode);\n  }\n\n  RDIB_LocationNode *node = rdib_location_list_push(arena, list, loc);\n  return node;\n}\n\ninternal void\nrdib_variable_list_push_node(RDIB_VariableList *list, RDIB_VariableNode *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  ++list->count;\n}\n\ninternal RDIB_VariableNode *\nrdib_variable_list_push(Arena *arena, RDIB_VariableList *list)\n{\n  RDIB_VariableNode *node = push_array(arena, RDIB_VariableNode, 1);\n  rdib_variable_list_push_node(list, node);\n  return node;\n}\n\n////////////////////////////////\n// Types\n\ninternal U64\nrdib_size_from_type(RDIB_Type *type)\n{\n  if (type) {\n    switch (type->kind) {\n    case RDI_TypeKind_Void:\n    case RDI_TypeKind_Char8:\n    case RDI_TypeKind_Char16:\n    case RDI_TypeKind_Char32:\n    case RDI_TypeKind_UChar8:\n    case RDI_TypeKind_UChar16:\n    case RDI_TypeKind_UChar32:\n    case RDI_TypeKind_U8:\n    case RDI_TypeKind_U16:\n    case RDI_TypeKind_U32:\n    case RDI_TypeKind_U64:\n    case RDI_TypeKind_U128:\n    case RDI_TypeKind_U256:\n    case RDI_TypeKind_U512:\n    case RDI_TypeKind_S8:\n    case RDI_TypeKind_S16:\n    case RDI_TypeKind_S32:\n    case RDI_TypeKind_S64:\n    case RDI_TypeKind_S128:\n    case RDI_TypeKind_S256:\n    case RDI_TypeKind_S512:\n    case RDI_TypeKind_Bool:\n    case RDI_TypeKind_F16:\n    case RDI_TypeKind_F32:\n    case RDI_TypeKind_F32PP:\n    case RDI_TypeKind_F48:\n    case RDI_TypeKind_F64:\n    case RDI_TypeKind_F80:\n    case RDI_TypeKind_F128:\n    case RDI_TypeKind_ComplexF32:\n    case RDI_TypeKind_ComplexF64:\n    case RDI_TypeKind_ComplexF80:\n    case RDI_TypeKind_ComplexF128:\n    case RDI_TypeKind_Handle: \n      return type->builtin.size;\n    case RDI_TypeKind_Modifier:\n      return rdib_size_from_type((RDIB_Type *)type->modifier.type_ref);\n    case RDI_TypeKind_Ptr:\n    case RDI_TypeKind_LRef:\n    case RDI_TypeKind_RRef:\n      return type->ptr.size;\n    case RDI_TypeKind_Array:\n      return type->array.size;\n\n    case RDI_TypeKind_Function:\n    case RDI_TypeKind_Method:\n    case RDI_TypeKindExt_StaticMethod: {\n      Assert(!\"check\");\n      return 0;\n    }\n    case RDI_TypeKind_Struct:\n    case RDI_TypeKind_Class:\n    case RDI_TypeKind_IncompleteStruct:\n    case RDI_TypeKind_IncompleteClass:\n      return type->udt.struct_type.size;\n\n    case RDI_TypeKind_Union:\n    case RDI_TypeKind_IncompleteUnion:\n      return type->udt.union_type.size;\n\n    case RDI_TypeKind_Alias:\n      Assert(!\"check\");\n\n    case RDI_TypeKind_Enum:\n    case RDI_TypeKind_IncompleteEnum:\n      return rdib_size_from_type(type->udt.enum_type.base_type);\n\n    case RDI_TypeKind_MemberPtr:\n    case RDI_TypeKind_Bitfield:\n    case RDI_TypeKind_Variadic:\n    case RDI_TypeKindExt_Members:\n    case RDI_TypeKindExt_Params:\n      InvalidPath; // no size\n    }\n  }\n  return 0;\n}\n\ninternal RDIB_TypeRef\nrdib_make_type_ref(Arena *arena, RDIB_Type *type)\n{\n  RDIB_Type **ref = push_array(arena, RDIB_Type *, 1);\n  ref[0] = type;\n  return ref;\n}\n\ninternal void\nrdib_deref_type_refs(TP_Context *tp, RDIB_TypeChunkList *list)\n{\n  for (RDIB_TypeChunk *chunk = list->first; chunk != 0; chunk = chunk->next) {\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Type *type = &chunk->v[i];\n      if (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Class ||\n          type->kind == RDI_TypeKind_IncompleteStruct || type->kind == RDI_TypeKind_IncompleteClass) {\n        type->udt.members             = *(RDIB_Type **)type->udt.members;\n        type->udt.struct_type.derived = *(RDIB_Type **)type->udt.struct_type.derived;\n        type->udt.struct_type.vtshape = *(RDIB_Type **)type->udt.struct_type.vtshape;\n      } else if (type->kind == RDI_TypeKind_Enum || type->kind == RDI_TypeKind_IncompleteEnum) {\n        type->udt.members             = *(RDIB_Type **)type->udt.members;\n        type->udt.enum_type.base_type = *(RDIB_Type **)type->udt.enum_type.base_type;\n      } else if (type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_IncompleteUnion) {\n        type->udt.members = *(RDIB_Type **)type->udt.members;\n      } else if (type->kind == RDI_TypeKind_Array) {\n        type->array.entry_type = *(RDIB_Type **)type->array.entry_type;\n      } else if (type->kind == RDI_TypeKind_Function) {\n        type->func.return_type = *(RDIB_Type **)type->func.return_type;\n        type->func.params_type = *(RDIB_Type **)type->func.params_type;\n      } else if (type->kind == RDI_TypeKind_Method) {\n        type->method.class_type  = *(RDIB_Type **)type->method.class_type;\n        type->method.this_type   = *(RDIB_Type **)type->method.this_type;\n        type->method.return_type = *(RDIB_Type **)type->method.return_type;\n        type->method.params_type = *(RDIB_Type **)type->method.params_type;\n      } else if (type->kind == RDI_TypeKindExt_StaticMethod) {\n        type->static_method.class_type  = *(RDIB_Type **)type->static_method.class_type;\n        type->static_method.return_type = *(RDIB_Type **)type->static_method.return_type;\n        type->static_method.params_type = *(RDIB_Type **)type->static_method.params_type;\n      } else if (type->kind == RDI_TypeKind_Ptr || type->kind == RDI_TypeKind_LRef || type->kind == RDI_TypeKind_RRef) {\n        type->ptr.type_ref = *(RDIB_Type **)type->ptr.type_ref;\n      } else if (type->kind == RDI_TypeKind_Modifier) {\n        type->modifier.type_ref = *(RDIB_Type **)type->modifier.type_ref;\n      } else if (type->kind == RDI_TypeKind_Bitfield) {\n        type->bitfield.value_type = *(RDIB_Type **)type->bitfield.value_type;\n      } else if (type->kind == RDI_TypeKindExt_Params) {\n        for (U64 i = 0; i < type->params.count; ++i) {\n          type->params.types[i] = *(RDIB_Type **)type->params.types[i];\n        }\n      } else if (type->kind == RDI_TypeKindExt_Members) {\n        for (RDIB_UDTMember *member = type->members.list.first; member != 0; member = member->next) {\n          switch (member->kind) {\n          case RDI_MemberKind_NULL: break;\n          case RDI_MemberKind_DataField: {\n            member->data_field.type_ref = *(RDIB_Type **)member->data_field.type_ref;\n          } break;\n          case RDI_MemberKind_StaticData: {\n            member->static_data.type_ref = *(RDIB_Type **)member->static_data.type_ref;\n          } break;\n          case RDI_MemberKind_Method: {\n            member->method.type_ref = *(RDIB_Type **)member->method.type_ref;\n          } break;\n          case RDI_MemberKind_NestedType: {\n            member->nested_type.type_ref = *(RDIB_Type **)member->nested_type.type_ref;\n          } break;\n          case RDI_MemberKind_Base: {\n            member->base_class.type_ref = *(RDIB_Type **)member->base_class.type_ref;\n          } break;\n          case RDI_MemberKind_VirtualBase: {\n            member->virtual_base_class.type_ref = *(RDIB_Type **)member->virtual_base_class.type_ref;\n          } break;\n          case RDI_MemberKindExt_MemberListPointer: {\n            member->member_list_pointer = *(RDIB_Type **)member->member_list_pointer;\n          } break;\n#if 0\n          case RDI_MemberKind_Enumerate: {\n            // no types\n          } break;\n#endif\n          default: InvalidPath;\n          }\n        }\n      }\n    }\n  }\n}\n\ninternal U64\nrdib_sizeof_type(RDIB_Type *type)\n{\n  U64 size = 0;\n  if (RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind < RDI_TypeKind_LastBuiltIn) {\n    size = type->builtin.size;\n  } else if (type->kind == RDI_TypeKind_Modifier) {\n    size = rdib_sizeof_type(type->modifier.type_ref);\n  } else if (type->kind == RDI_TypeKind_Ptr || type->kind == RDI_TypeKind_LRef || type->kind == RDI_TypeKind_RRef) {\n    size = type->ptr.size;\n  } else if (type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Class ||\n             type->kind == RDI_TypeKind_IncompleteStruct || type->kind == RDI_TypeKind_IncompleteClass) {\n    size = type->udt.struct_type.size;\n  } else if (type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_IncompleteUnion) {\n    size = type->udt.union_type.size;\n  } else if (type->kind == RDI_TypeKind_Enum || type->kind == RDI_TypeKind_IncompleteEnum) {\n    size = rdib_sizeof_type(type->udt.enum_type.base_type);\n  } else if (type->kind == RDI_TypeKind_Bitfield) {\n    size = rdib_sizeof_type(type->bitfield.value_type);\n  } else if (type->kind == RDI_TypeKind_Array) {\n    size = type->array.size;\n  } else {\n    Assert(!\"error: type doens't have a size\");\n  }\n  return size;\n}\n\ninternal U64\nrdib_count_members_deep(RDIB_Type *type)\n{\n  U64 member_count = 0;\n  for (RDIB_UDTMember *member = type->members.list.first; member != 0; member = member->next) {\n    if (member->kind == RDI_MemberKindExt_MemberListPointer) {\n      member_count += rdib_count_members_deep(member->member_list_pointer);\n    } else {\n      member_count += 1;\n    }\n  }\n  return member_count;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_type_stats_task)\n{\n  ProfBeginFunction();\n\n  RDIB_TypeStatsTask *task  = raw_task;\n  RDIB_TypeChunk     *chunk = task->chunks[task_id];\n\n  for (U64 itype = 0; itype < chunk->count; ++itype) {\n    RDIB_Type *type = chunk->v + itype;\n\n    if (type->kind == RDI_TypeKind_Class || type->kind == RDI_TypeKind_Struct || type->kind == RDI_TypeKind_Union || type->kind == RDI_TypeKind_Enum) {\n      task->type_stats->udt_counts[task_id] += 1;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_concat_members_task)\n{\n  ProfBeginFunction();\n  RDIB_MembersTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Type          *type = &chunk->v[i];\n      RDIB_UDTMemberList  acc  = {0};\n\n      for (RDIB_Type *curr = type; ;) {\n        // concat members\n        rdib_udt_member_list_concat_in_place(&acc, &curr->members.list);\n\n        // does this type continue member list?\n        if (acc.count == 0 || acc.last->kind != RDI_MemberKindExt_MemberListPointer) {\n          break;\n        }\n\n        // remove member list pointer\n        RDIB_UDTMember *continuation = acc.last;\n        SLLQueuePop(acc.first, acc.last);\n        --acc.count;\n\n        // advance to next type\n        curr = continuation->member_list_pointer;\n\n        // other types should not reference any part of member list except for head type.\n        Assert(curr->kind == RDI_TypeKindExt_Members);\n        curr->kind = RDI_TypeKind_NULL;\n      }\n\n      // update member list\n      type->members.list = acc;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_count_head_members_task)\n{\n  ProfBeginFunction();\n  RDIB_MembersTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Type *type = &chunk->v[i];\n      if (type->kind == RDI_TypeKindExt_Members) {\n        task->counts[task_id] += type->members.list.count;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_assign_head_member_indices_task)\n{\n  ProfBeginFunction();\n  RDIB_MembersTask *task = raw_task;\n  U64 cursor = task->offsets[task_id];\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_TypeChunk *chunk = task->type_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Type *type = &chunk->v[i];\n      if (type->kind == RDI_TypeKindExt_Members) {\n        type->members.first_member_idx = cursor;\n        cursor += type->members.list.count;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_udt_members_task)\n{\n  ProfBeginFunction();\n  RDIB_MembersTask *task  = raw_task;\n  RDIB_TypeChunk   *chunk = task->type_chunks[task_id];\n  for (U64 i = 0; i < chunk->count; ++i) {\n    RDIB_Type *type = chunk->v + i;\n    Assert(type->kind == RDI_TypeKindExt_Members);\n\n    U64 member_idx = 0;\n    for (RDIB_UDTMember *src = type->members.list.first; src != 0; src = src->next, ++member_idx) {\n      U64        idx  = type->members.first_member_idx + member_idx;\n      RDI_Member *dst = &task->udt_members_rdi[idx];\n\n      switch (src->kind) {\n      case RDI_MemberKind_NULL: {\n        MemoryZeroStruct(dst);\n      } break;\n      case RDI_MemberKind_DataField: {\n        dst->kind            = RDI_MemberKind_DataField;\n        dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->data_field.name);\n        dst->type_idx        = rdib_idx_from_type(src->data_field.type_ref);\n        dst->off             = src->data_field.offset;\n      } break;\n      case RDI_MemberKind_StaticData: {\n        dst->kind            = RDI_MemberKind_StaticData;\n        dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->static_data.name);\n        dst->type_idx        = rdib_idx_from_type(src->static_data.type_ref);\n      } break;\n      case RDI_MemberKind_Method:\n      case RDI_MemberKind_StaticMethod:\n      case RDI_MemberKind_VirtualMethod: {\n        dst->kind            = src->kind;\n        dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->method.name);\n        dst->type_idx        = rdib_idx_from_type(src->method.type_ref);\n        dst->off             = src->method.vftable_offset;\n      } break;\n      case RDI_MemberKind_Base: {\n        dst->kind            = RDI_MemberKind_Base;\n        dst->name_string_idx = 0;\n        dst->type_idx        = rdib_idx_from_type(src->base_class.type_ref);\n        dst->off             = src->base_class.offset;\n      } break;\n      case RDI_MemberKind_VirtualBase: {\n        dst->kind            = RDI_MemberKind_VirtualBase;\n        dst->name_string_idx = 0;\n        dst->type_idx        = rdib_idx_from_type(src->virtual_base_class.type_ref);\n        dst->off             = 0; // TODO: ???\n      } break;\n      case RDI_MemberKind_NestedType: {\n        dst->kind            = RDI_MemberKind_NestedType;\n        dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->nested_type.name);\n        dst->type_idx        = rdib_idx_from_type(src->nested_type.type_ref);\n        dst->off             = 0;\n      } break;\n      case RDI_MemberKindExt_MemberListPointer: {\n        InvalidPath;\n      } break;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_enum_members_task)\n{\n  ProfBeginFunction();\n  RDIB_MembersTask *task = raw_task;\n  RDIB_TypeChunk   *chunk = task->type_chunks[task_id];\n  for (U64 i = 0; i < chunk->count; ++i) {\n    RDIB_Type *type = chunk->v + i;\n\n    if (type->kind != RDI_TypeKindExt_Members) continue;\n\n    U64 member_idx = 0;\n    for (RDIB_UDTMember *src = type->members.list.first; src != 0; src = src->next, ++member_idx) {\n      U64            idx   = type->members.first_member_idx + member_idx;\n      RDI_EnumMember *dst  = &task->enum_members_rdi[idx];\n      dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->enumerate.name);\n      dst->val             = src->enumerate.value;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_udts_task)\n{\n  ProfBeginFunction();\n  RDIB_UserDefinesTask *task = raw_task;\n\n  U64             ichunk     = task_id;\n  RDIB_TypeChunk *chunk      = task->type_chunks[ichunk];\n  U64             udt_cursor = task->udt_base_idx[ichunk];\n  U64             udt_cap    = task->type_stats.udt_counts[ichunk];\n\n  for (U64 i = 0; i < chunk->count; ++i) {\n    RDIB_Type *type = &chunk->v[i];\n\n    if (RDI_IsCompleteUserDefinedTypeKind(type->kind)) {\n      RDIB_Type *members_type = type->udt.members;\n\n      // assign UDT idx\n      type->udt.udt_idx = udt_cursor;\n\n      // fill out struct/class UDT\n      Assert(udt_cursor < task->udt_base_idx[ichunk] + udt_cap);\n      RDI_UDT *udt       = &task->udts[udt_cursor++];\n      udt->self_type_idx = rdib_idx_from_type(type);\n      udt->flags         = type->kind == RDI_TypeKind_Enum ? RDI_UDTFlag_EnumMembers : 0;\n      if (members_type->members.list.count > 0) {\n        udt->member_first = members_type->members.first_member_idx;\n        udt->member_count = members_type->members.list.count;\n      } else {\n        udt->member_first = 0;\n        udt->member_count = 0;\n      }\n      udt->file_idx      = 0;\n      udt->line          = 0;\n      udt->col           = 0;\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_type_nodes_task)\n{\n  Temp scratch = scratch_begin(0, 0);\n\n  U64                 ichunk = task_id;\n  RDIB_TypeNodesTask *task   = raw_task;\n  RDIB_TypeChunk     *chunk  = task->type_chunks[ichunk];\n\n  for (U64 itype = 0; itype < chunk->count; ++itype) {\n    RDIB_Type *src = &chunk->v[itype];\n    U64 dst_idx = rdib_idx_from_type(src);\n    RDI_TypeNode *dst = &task->type_nodes[dst_idx];\n\n    if (src->kind == RDI_TypeKind_NULL) {\n      MemoryZeroStruct(dst);\n      dst->kind = RDI_TypeKind_NULL;\n    } else if (RDI_TypeKind_FirstBuiltIn <= src->kind && src->kind <= RDI_TypeKind_LastBuiltIn) {\n      dst->kind                     = src->kind;\n      dst->flags                    = 0;\n      dst->byte_size                = src->builtin.size;\n      dst->built_in.name_string_idx = rdib_idx_from_string_map(task->string_map, src->builtin.name);\n    } else if (src->kind == RDI_TypeKind_Modifier) {\n      dst->kind                        = RDI_TypeKind_Modifier;\n      dst->byte_size                   = rdib_sizeof_type(src->modifier.type_ref);\n      dst->flags                       = src->modifier.flags;\n      dst->constructed.direct_type_idx = rdib_idx_from_type(src->modifier.type_ref);\n    } else if (src->kind == RDI_TypeKind_Ptr || src->kind == RDI_TypeKind_LRef || src->kind == RDI_TypeKind_RRef) {\n      dst->kind                        = src->kind;\n      dst->byte_size                   = src->ptr.size;\n      dst->flags                       = 0;\n      dst->constructed.direct_type_idx = rdib_idx_from_type(src->ptr.type_ref);\n    } else if (src->kind == RDI_TypeKind_Method) {\n      RDIB_Type *params_type = src->method.params_type;\n      Assert(params_type->kind == RDI_TypeKindExt_Params);\n      RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->method.param_idx_run_bucket_idx];\n\n      dst->kind                            = RDI_TypeKind_Method;\n      dst->flags                           = 0;\n      dst->byte_size                       = 0;\n      dst->constructed.direct_type_idx     = rdib_idx_from_type(src->method.return_type);\n      dst->constructed.count               = param_idx_run->indices.count;\n      dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array;\n    } else if (src->kind == RDI_TypeKindExt_StaticMethod) {\n      RDIB_Type *params_type = src->static_method.params_type;\n      Assert(params_type->kind == RDI_TypeKindExt_Params);\n      RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->static_method.param_idx_run_bucket_idx];\n\n      dst->kind                            = RDI_TypeKind_Method;\n      dst->flags                           = 0;\n      dst->byte_size                       = 0;\n      dst->constructed.direct_type_idx     = rdib_idx_from_type(src->static_method.return_type);\n      dst->constructed.count               = param_idx_run->indices.count;\n      dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array;\n    } else if (src->kind == RDI_TypeKind_Function) {\n      RDIB_Type *params_type = src->func.params_type;\n      Assert(params_type->kind == RDI_TypeKindExt_Params);\n      RDIB_IndexRunBucket *param_idx_run = task->idx_run_map->buckets[src->func.param_idx_run_bucket_idx];\n\n      dst->kind                            = RDI_TypeKind_Function;\n      dst->flags                           = 0;\n      dst->byte_size                       = 0;\n      dst->constructed.direct_type_idx     = rdib_idx_from_type(src->func.return_type);\n      dst->constructed.count               = param_idx_run->indices.count;\n      dst->constructed.param_idx_run_first = param_idx_run->index_in_output_array;\n    } else if (src->kind == RDI_TypeKind_Array) {\n      U64 entry_size = rdib_size_from_type(src->array.entry_type);\n      U64 array_size = src->array.size;\n      U64 array_count = entry_size > 0 ? array_size / entry_size : 0;\n\n      dst->kind                        = src->kind;\n      dst->flags                       = 0;\n      dst->byte_size                   = array_size;\n      dst->constructed.direct_type_idx = rdib_idx_from_type(src->array.entry_type);\n      dst->constructed.count           = array_count;\n    } else if (src->kind == RDI_TypeKind_Bitfield) {\n      dst->kind                     = RDI_TypeKind_Bitfield;\n      dst->flags                    = 0;\n      dst->byte_size                = rdib_sizeof_type(src->bitfield.value_type);\n      dst->bitfield.direct_type_idx = rdib_idx_from_type(src->bitfield.value_type); \n      dst->bitfield.off             = src->bitfield.off;\n      dst->bitfield.size            = src->bitfield.count;\n    } else if (src->kind == RDI_TypeKind_Struct || src->kind == RDI_TypeKind_Class ||\n               src->kind == RDI_TypeKind_IncompleteStruct || src->kind == RDI_TypeKind_IncompleteClass) {\n      dst->kind                         = src->kind;\n      dst->flags                        = 0;\n      dst->byte_size                    = src->udt.struct_type.size;\n      dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name);\n      dst->user_defined.udt_idx         = src->udt.udt_idx;\n      dst->user_defined.direct_type_idx = 0;\n    } else if (src->kind == RDI_TypeKind_Union || src->kind == RDI_TypeKind_IncompleteUnion) {\n      dst->kind                         = src->kind;\n      dst->flags                        = 0;\n      dst->byte_size                    = src->udt.union_type.size;\n      dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name);\n      dst->user_defined.udt_idx         = src->udt.udt_idx;\n      dst->user_defined.direct_type_idx = 0;\n    } else if (src->kind == RDI_TypeKind_Enum || src->kind == RDI_TypeKind_IncompleteEnum) {\n      dst->kind                         = RDI_TypeKind_Enum;\n      dst->flags                        = 0;\n      dst->byte_size                    = rdib_size_from_type(src->udt.enum_type.base_type);\n      dst->user_defined.name_string_idx = rdib_idx_from_string_map(task->string_map, src->udt.name);\n      dst->user_defined.udt_idx         = src->udt.udt_idx;\n      dst->user_defined.direct_type_idx = rdib_idx_from_type(src->udt.enum_type.base_type);\n    } else if (src->kind == RDI_TypeKind_Alias) {\n      // TODO\n      NotImplemented;\n    } else if (src->kind == RDI_TypeKind_MemberPtr) {\n      // TODO\n      NotImplemented;\n    } else if (src->kind == RDI_TypeKind_Variadic) {\n      MemoryZeroStruct(dst);\n      dst->kind = RDI_TypeKind_Variadic;\n    } else if (src->kind == RDI_TypeKindExt_VirtualTable) {\n      // TODO\n      MemoryZeroStruct(dst);\n      dst->kind = RDI_TypeKind_NULL;\n    } else {\n      InvalidPath;\n    }\n  }\n\n  scratch_end(scratch);\n}\n\ninternal void\nrdib_data_sections_from_types(TP_Context            *tp,\n                              Arena                 *arena,\n                              RDIB_DataSectionList  *sect_list,\n                              RDI_Arch               arch,\n                              RDIB_StringMap        *string_map,\n                              RDIB_IndexRunMap      *idx_run_map,\n                              U64                    udt_member_chunk_count,\n                              RDIB_TypeChunk       **udt_member_type_chunks,\n                              U64                    enum_member_chunk_count,\n                              RDIB_TypeChunk       **enum_member_type_chunks,\n                              U64                    total_type_node_count,\n                              U64                    type_chunk_count,\n                              RDIB_TypeChunk       **type_chunks,\n                              RDIB_TypeStats         type_stats)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  ProfBegin(\"UDT Members\");\n  U64         udt_member_count_rdi;\n  RDI_Member *udt_members_rdi;\n  {\n    RDIB_MembersTask task = {0};\n\n    ProfBegin(\"Concat\");\n    task.ranges      = tp_divide_work(scratch.arena, udt_member_chunk_count, tp->worker_count);\n    task.type_chunks = udt_member_type_chunks;\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_concat_members_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Count\");\n    task.counts = push_array(scratch.arena, U64, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_count_head_members_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Assign Indices\");\n    task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_assign_head_member_indices_task, &task);\n    ProfEnd();\n\n    udt_member_count_rdi = sum_array_u64(tp->worker_count, task.counts);\n    udt_members_rdi      = push_array_no_zero(arena, RDI_Member, udt_member_count_rdi);\n\n    ProfBegin(\"Fill\");\n    task.string_map      = string_map;\n    task.udt_members_rdi = udt_members_rdi;\n    tp_for_parallel(tp, 0, udt_member_chunk_count, rdib_fill_udt_members_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBegin(\"Enum Members\");\n  U64             enum_member_count_rdi;\n  RDI_EnumMember *enum_members_rdi;\n  {\n    RDIB_MembersTask task = {0};\n\n    ProfBegin(\"Concat\");\n    task.ranges      = tp_divide_work(scratch.arena, enum_member_chunk_count, tp->worker_count);\n    task.type_chunks = enum_member_type_chunks;\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_concat_members_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Count\");\n    task.counts = push_array(scratch.arena, U64, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_count_head_members_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Assign Indices\");\n    task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_assign_head_member_indices_task, &task);\n    ProfEnd();\n\n    enum_member_count_rdi = sum_array_u64(tp->worker_count, task.counts);\n    enum_members_rdi      = push_array_no_zero(arena, RDI_EnumMember, enum_member_count_rdi);\n\n    ProfBegin(\"Fill\");\n    task.string_map       = string_map;\n    task.enum_members_rdi = enum_members_rdi;\n    tp_for_parallel(tp, 0, enum_member_chunk_count, rdib_fill_enum_members_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBegin(\"Sum type stats\");\n  U64 total_udt_count = sum_array_u64(type_chunk_count, type_stats.udt_counts);\n  ProfEnd();\n\n  ProfBegin(\"Up front pushes\");\n  RDI_UDT      *udts       = push_array_no_zero(arena, RDI_UDT,      total_udt_count      );\n  RDI_TypeNode *type_nodes = push_array_no_zero(arena, RDI_TypeNode, total_type_node_count);\n  ProfEnd();\n\n  ProfBegin(\"Fill out UDTs\");\n  RDIB_UserDefinesTask udts_task = {0};\n  udts_task.type_chunks          = type_chunks;\n  udts_task.type_stats           = type_stats;\n  udts_task.udt_base_idx         = offsets_from_counts_array_u64(scratch.arena, type_stats.udt_counts, type_chunk_count);\n  udts_task.udts                 = udts;\n  tp_for_parallel(tp, 0, type_chunk_count, rdib_fill_udts_task, &udts_task);\n  ProfEnd();\n\n  ProfBegin(\"Fill out type nodes\");\n  RDIB_TypeNodesTask type_nodes_task = {0};\n  type_nodes_task.addr_size          = rdi_addr_size_from_arch(arch);\n  type_nodes_task.string_map         = string_map;\n  type_nodes_task.idx_run_map        = idx_run_map;\n  type_nodes_task.type_chunks        = type_chunks;\n  type_nodes_task.type_stats         = type_stats;\n  type_nodes_task.type_nodes         = type_nodes;\n  tp_for_parallel(tp, 0, type_chunk_count, rdib_type_nodes_task, &type_nodes_task);\n  ProfEnd();\n\n  RDIB_DataSection udt_member_sect  = { .tag = RDI_SectionKind_Members     };\n  RDIB_DataSection enum_member_sect = { .tag = RDI_SectionKind_EnumMembers };\n  RDIB_DataSection udt_sect         = { .tag = RDI_SectionKind_UDTs        };\n  RDIB_DataSection type_nodes_sect  = { .tag = RDI_SectionKind_TypeNodes   };\n\n  str8_list_push(arena, &udt_member_sect.data,  str8_array(udt_members_rdi,  udt_member_count_rdi ));\n  str8_list_push(arena, &enum_member_sect.data, str8_array(enum_members_rdi, enum_member_count_rdi));\n  str8_list_push(arena, &udt_sect.data,         str8_array(udts,             total_udt_count      ));\n  str8_list_push(arena, &type_nodes_sect.data,  str8_array(type_nodes,       total_type_node_count));\n\n  rdib_data_section_list_push(arena, sect_list, enum_member_sect);\n  rdib_data_section_list_push(arena, sect_list, udt_member_sect );\n  rdib_data_section_list_push(arena, sect_list, udt_sect        );\n  rdib_data_section_list_push(arena, sect_list, type_nodes_sect );\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\n////////////////////////////////\n\ninternal RDIB_PathTree *\nrdib_path_tree_init(Arena *arena, U64 list_count)\n{\n  RDIB_PathTree *tree = push_array(arena, RDIB_PathTree, 1);\n  tree->root          = push_array(arena, RDIB_PathTreeNode, 1);\n  tree->list_count    = list_count;\n  tree->node_lists    = push_array(arena, RDIB_PathTreeNodeList, list_count);\n  return tree;\n}\n\ninternal void\nrdib_path_tree_insert(Arena *arena, RDIB_PathTree *tree, String8 path, RDIB_SourceFile *src_file)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  RDIB_PathTreeNode *curr_sub_path = tree->root;\n  String8List        sub_paths     = str8_split_path(scratch.arena, path);\n  str8_path_list_resolve_dots_in_place(&sub_paths, path_style_from_str8(path));\n\n  for (String8Node *n = sub_paths.first; n != 0; n = n->next) {\n    RDIB_PathTreeNode *sub_child;\n\n    // is there directory or file defined on this level?\n    for (sub_child = curr_sub_path->first_child; sub_child != 0; sub_child = sub_child->next_sibling) {\n      if (str8_match(sub_child->sub_path, n->string, 0)) {\n        break;\n      }\n    }\n\n    // new directory/file\n    if (sub_child == 0) {\n      sub_child           = push_array(arena, RDIB_PathTreeNode, 1);\n      sub_child->node_idx = tree->node_count;\n      sub_child->parent   = curr_sub_path;\n      sub_child->sub_path = n->string;\n      sub_child->src_file = 0;\n      SLLQueuePush_N(curr_sub_path->first_child, curr_sub_path->last_child, sub_child, next_sibling);\n      ++tree->node_count;\n\n      // last node, insert file\n      if (n->next == 0) {\n        sub_child->src_file = src_file;\n      }\n\n      // HACK: setup node list per thread for serialization step\n      U64 list_idx = tree->next_list_idx % tree->list_count;\n      SLLQueuePush_N(tree->node_lists[list_idx].first, tree->node_lists[list_idx].last, sub_child, next_order);\n      ++tree->next_list_idx;\n    }\n\n    // descend to sub node\n    curr_sub_path = sub_child;\n  }\n\n  scratch_end(scratch);\n}\n\ninternal U32\nrdib_idx_from_path_tree(RDIB_PathTree *tree, String8 path)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  // redirect to special nil string\n  if (path.size == 0) {\n    path = RDIB_PATH_TREE_NIL_STRING;\n  }\n\n  // begin traverse from tree root\n  RDIB_PathTreeNode *curr_sub_path = tree->root;\n\n  // split path & resolve dots\n  String8List sub_paths = str8_split_path(scratch.arena, path);\n  str8_path_list_resolve_dots_in_place(&sub_paths, path_style_from_str8(path));\n\n  for (String8Node *n = sub_paths.first; n != 0; n = n->next) {\n    // scan children sub-path match\n    RDIB_PathTreeNode *sub_child;\n    for (sub_child = curr_sub_path->first_child; sub_child != 0; sub_child = sub_child->next_sibling) {\n      if (str8_match(sub_child->sub_path, n->string, 0)) {\n        break;\n      }\n    }\n\n    // found match?\n    if (sub_child == 0) {\n      break;\n    }\n\n    // descend to sub directory\n    curr_sub_path = sub_child;\n  }\n\n  // did we find source file?\n  U64 idx = 0;\n  if (curr_sub_path != 0 && curr_sub_path->src_file != 0) {\n    idx = curr_sub_path->node_idx;\n  } else {\n    Assert(!\"unable to find source file path\");\n  }\n\n  scratch_end(scratch);\n  return safe_cast_u32(idx);\n}\n\n\n////////////////////////////////\n\ninternal U64\nrdib_string_map_hash(String8 string)\n{\n  XXH64_hash_t hash64 = XXH3_64bits(string.str, string.size);\n  return hash64;\n}\n\ninternal RDIB_StringMap *\nrdib_init_string_map(Arena *arena, U64 cap)\n{\n  RDIB_StringMap *string_map = push_array(arena, RDIB_StringMap, 1);\n  string_map->cap            = (U64)((F64)cap * 1.3);\n  string_map->buckets        = push_array(arena, RDIB_StringMapBucket *, string_map->cap);\n  return string_map;\n}\n\ninternal U32\nrdib_idx_from_string_map(RDIB_StringMap *string_map, String8 string)\n{\n  U64 hash     = rdib_string_map_hash(string);\n  U64 best_idx = hash % string_map->cap;\n  U64 idx      = best_idx;\n\n  do {\n    RDIB_StringMapBucket *bucket = string_map->buckets[idx];\n\n    if (bucket == 0) {\n      break;\n    }\n\n    if (str8_match(bucket->string, string, 0)) {\n      return safe_cast_u32(bucket->idx);\n    }\n\n    idx = (idx + 1) % string_map->cap;\n  } while (idx != best_idx);\n\n  Assert(!\"incomplete string map\");\n  return max_U32;\n}\n\ninternal RDIB_StringMapBucket *\nrdib_string_map_insert_or_update(RDIB_StringMapBucket **buckets, U64 cap, U64 hash, RDIB_StringMapBucket *new_bucket, RDIB_StringMapUpdateFunc *update_func)\n{\n  RDIB_StringMapBucket *result                         = 0;\n  B32                   was_bucket_inserted_or_updated = 0;\n\n  U64 best_idx = hash % cap;\n  U64 idx      = best_idx;\n\n  do {\n    retry:;\n    RDIB_StringMapBucket *curr_bucket = buckets[idx];\n\n    if (curr_bucket == 0) {\n      RDIB_StringMapBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    } else if (str8_match(curr_bucket->string, new_bucket->string, 0)) {\n      if (curr_bucket->sorter.v <= new_bucket->sorter.v) {\n        if (new_bucket->raw_values != 0) {\n          void_node_concat_atomic(&curr_bucket->raw_values, new_bucket->raw_values);\n          new_bucket->raw_values = 0;\n        }\n\n        // recycle bucket\n        result = new_bucket;\n\n        // don't need to update, more recent leaf is in the bucket\n        was_bucket_inserted_or_updated = 1;\n\n        break;\n      }\n\n      if (new_bucket->raw_values) {\n        new_bucket->raw_values->next = buckets[idx]->raw_values;\n      }\n\n      RDIB_StringMapBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n\n        // recycle bucket\n        result = compare_bucket;\n\n        // new bucket is in the hash table, exit\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      if (new_bucket->raw_values) {\n        new_bucket->raw_values->next = 0;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    }\n\n    // advance\n    idx = (idx + 1) % cap;\n  } while (idx != best_idx);\n\n  // are there enough free buckets?\n  Assert(was_bucket_inserted_or_updated);\n\n  return result;\n}\n\ninternal void\nrdib_string_map_insert_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, void *value)\n{\n  // do we have a free bucket?\n  RDIB_StringMapBucket **bucket = &task->free_buckets[task_id];\n  if (*bucket == 0) {\n    *bucket = push_array(arena, RDIB_StringMapBucket, 1);\n  }\n\n  // fill out bucket\n  (*bucket)->string     = string;\n  (*bucket)->raw_values = value;\n  (*bucket)->sorter.hi  = safe_cast_u32(task_id);\n  (*bucket)->sorter.lo  = safe_cast_u32(task->element_indices[task_id]);\n\n  // insert bucket into string map\n  U64                   hash             = rdib_string_map_hash(string);\n  RDIB_StringMapBucket *insert_or_update = rdib_string_map_insert_or_update(task->string_map->buckets, task->string_map->cap, hash, *bucket, task->string_map_update_func);\n\n  // advance element index\n  if (insert_or_update != *bucket) {\n    ++task->element_indices[task_id];\n  }\n\n  // recycle bucket\n  *bucket = insert_or_update;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_count_extant_buckets_string_map_task)\n{\n  ProfBeginFunction();\n  RDIB_GetExtantBucketsStringMapTask *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    if (task->string_map->buckets[bucket_idx] != 0) {\n      task->counts[task_id] += 1;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_get_extant_buckets_string_map_task)\n{\n  ProfBeginFunction();\n  RDIB_GetExtantBucketsStringMapTask *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min, cursor = task->offsets[task_id]; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_StringMapBucket *bucket = task->string_map->buckets[bucket_idx];\n    if (bucket != 0) {\n      task->result[cursor] = bucket;\n      ++cursor;\n    }\n  }\n  ProfEnd();\n}\n\ninternal RDIB_StringMapBucket **\nrdib_extant_buckets_from_string_map(TP_Context *tp, Arena *arena, RDIB_StringMap *string_map, U64 *bucket_count_out)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  RDIB_GetExtantBucketsStringMapTask task = {0};\n  task.string_map = string_map;\n\n  ProfBegin(\"Count Extant Buckets\");\n  task.counts = push_array(scratch.arena, U64, tp->worker_count);\n  task.ranges = tp_divide_work(scratch.arena, string_map->cap, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_count_extant_buckets_string_map_task, &task);\n  ProfEnd();\n\n  *bucket_count_out = sum_array_u64(tp->worker_count, task.counts);\n\n  ProfBegin(\"Copy Extant Buckets\");\n  task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n  task.result  = push_array(arena, RDIB_StringMapBucket *, *bucket_count_out);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_get_extant_buckets_string_map_task, &task);\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n  return task.result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_string_map_bucket_chunk_idx_histo_task)\n{\n  ProfBeginFunction();\n  RDIB_StringMapRadixSort *task    = raw_task;\n  Temp                     scratch = scratch_begin(0,0);\n\n  U32 *range_histo = push_array(scratch.arena, U32, task->chunk_idx_opl);\n\n  // count items per sorter\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_StringMapBucket *bucket = task->src[bucket_idx];\n    U64 chunk_idx = bucket->sorter.hi;\n    Assert(chunk_idx < task->chunk_idx_opl);\n    ++range_histo[chunk_idx];\n  }\n\n  // add in per thread sorter counts\n  for (U64 i = 0; i < task->chunk_idx_opl; ++i) {\n    ins_atomic_u32_add_eval(&task->chunk_histo[i], range_histo[i]);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_chunk_idx_task)\n{\n  ProfBeginFunction();\n  RDIB_StringMapRadixSort *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_StringMapBucket *bucket    = task->src[bucket_idx];\n    U32                   chunk_idx = bucket->sorter.hi;\n    U32                   dst_idx   = ins_atomic_u32_inc_eval(&task->chunk_offsets[chunk_idx]) - 1;\n    task->dst[dst_idx] = bucket;\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_string_map_radix_sort_element_idx_task)\n{\n  ProfBeginFunction();\n  RDIB_StringMapRadixSort *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    U64 range_lo = task->chunk_offsets[chunk_idx];\n    U64 range_hi = task->chunk_offsets[chunk_idx] + task->chunk_histo[chunk_idx];\n\n    ProfBegin(\"Zero out Histogram\");\n    U32 histo_bot[1 << 10]; MemoryZeroArray(histo_bot);\n    U32 histo_mid[1 << 11]; MemoryZeroArray(histo_mid);\n    U32 histo_top[1 << 11]; MemoryZeroArray(histo_top);\n    ProfEnd();\n\n    ProfBegin(\"Element Histogram\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_StringMapBucket *elem = task->dst[i];\n      U32 elem_idx  = elem->sorter.lo;\n      U32 digit_bot = (elem_idx >>  0) % ArrayCount(histo_bot);\n      U32 digit_mid = (elem_idx >> 10) % ArrayCount(histo_mid);\n      U32 digit_top = (elem_idx >> 21) % ArrayCount(histo_top);\n      histo_bot[digit_bot] += 1;\n      histo_mid[digit_mid] += 1;\n      histo_top[digit_top] += 1;\n    }\n    ProfEnd();\n\n    ProfBegin(\"Histogram Counts -> Offsets\");\n    counts_to_offsets_array_u32(ArrayCount(histo_bot), &histo_bot[0]);\n    counts_to_offsets_array_u32(ArrayCount(histo_mid), &histo_mid[0]);\n    counts_to_offsets_array_u32(ArrayCount(histo_top), &histo_top[0]);\n    ProfEnd();\n\n    ProfBegin(\"Sort Bot\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_StringMapBucket *elem     = task->dst[i];\n      U32                   elem_idx = elem->sorter.lo;\n      U32                   digit    = (elem_idx >> 0) % ArrayCount(histo_bot);\n      U32                   src_idx  = range_lo + histo_bot[digit]++;\n      task->src[src_idx] = elem;\n    }\n    ProfEnd();\n\n    ProfBegin(\"Sort Mid\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_StringMapBucket *elem     = task->src[i];\n      U32                   elem_idx = elem->sorter.lo;\n      U32                   digit    = (elem_idx >> 10) % ArrayCount(histo_mid);\n      U32                   dst_idx  = range_lo + histo_mid[digit]++;\n      task->dst[dst_idx] = elem;\n    }\n    ProfEnd();\n\n    ProfBegin(\"Sort Top\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_StringMapBucket *elem     = task->dst[i];\n      U32                   elem_idx = elem->sorter.lo;\n      U32                   digit    = (elem_idx >> 21) % ArrayCount(histo_top);\n      U32                   src_idx  = range_lo + histo_top[digit]++;\n      task->src[src_idx] = elem;\n    }\n    ProfEnd();\n  }\n\n  ProfEnd();\n}\n\ninternal void\nrdib_string_map_sort_buckets(TP_Context *tp, RDIB_StringMapBucket **buckets, U64 bucket_count, U64 chunk_idx_opl)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  RDIB_StringMapRadixSort task = {0};\n  task.chunk_idx_opl = chunk_idx_opl;\n  task.ranges        = tp_divide_work(scratch.arena, bucket_count, tp->worker_count);\n  task.src           = buckets;\n  task.dst           = push_array_no_zero(scratch.arena, RDIB_StringMapBucket *, bucket_count);\n\n  ProfBegin(\"Chunk Index Histogram\");\n  task.chunk_histo = push_array(scratch.arena, U32, chunk_idx_opl);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_bucket_chunk_idx_histo_task, &task);\n  ProfEnd();\n\n  // sort correctness check on chunk index\n#if 0\n  for (U64 i = 1; i < bucket_count; ++i) {\n    RDIB_StringMapBucket *prev = buckets[i - 1];\n    RDIB_StringMapBucket *curr = buckets[i + 0];\n    U32 prev_chunk_idx = prev->sorter.hi;\n    U32 curr_chunk_idx = curr->sorter.hi;\n    AssertAlways(prev_chunk_idx <= curr_chunk_idx);\n  }\n#endif\n\n  ProfBegin(\"Chunk Histo -> Offsets\");\n  task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl);\n  ProfEnd();\n\n  ProfBegin(\"Sort on chunk index\");\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_chunk_idx_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Sort on element index\");\n  task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl);\n  task.ranges        = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_string_map_radix_sort_element_idx_task, &task);\n  ProfEnd();\n\n  // sort correctness check on element index\n#if 0\n  {\n    for (U64 i = 1; i < bucket_count; ++i) {\n      RDIB_StringMapBucket *prev = buckets[i - 1];\n      RDIB_StringMapBucket *curr = buckets[i + 0];\n      U32 prev_chunk_idx = prev->sorter.hi;\n      U32 curr_chunk_idx = curr->sorter.hi;\n      if (prev_chunk_idx == curr_chunk_idx) {\n        U32 prev_elem_idx = prev->sorter.lo;\n        U32 curr_elem_idx = curr->sorter.lo;\n        AssertAlways(prev_elem_idx < curr_elem_idx);\n      }\n    }\n  }\n#endif\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nrdib_string_map_assign_indices(RDIB_StringMapBucket **buckets, U64 bucket_count)\n{\n  ProfBeginFunction();\n  for (U64 idx = 0; idx < bucket_count; ++idx) {\n    buckets[idx]->idx = idx;\n  }\n  ProfEnd();\n}\n\n// Specialized Inserts\n\ninternal void\nrdib_string_map_insert_string_table_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string)\n{\n  rdib_string_map_insert_item(arena, task, task_id, string, 0);\n}\n\ninternal void\nrdib_string_map_insert_name_map_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, VoidNode *node)\n{\n  rdib_string_map_insert_item(arena, task, task_id, string, node);\n}\n\ninternal\nRDIB_STRING_MAP_UPDATE_FUNC(rdib_string_map_update_null)\n{\n  // null update\n}\n\ninternal\nRDIB_STRING_MAP_UPDATE_FUNC(rdib_string_map_update_concat_void_list_atomic)\n{\n  node->next = ins_atomic_ptr_eval_assign(head, node);\n}\n\n////////////////////////////////\n// String Table Tasks\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_sects_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 sect_idx = task->ranges[task_id].min; sect_idx < task->ranges[task_id].max; ++sect_idx) {\n    RDIB_BinarySection *sect = &task->sects[sect_idx];\n    rdib_string_map_insert_string_table_item(arena, task, task_id, sect->name);\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_units_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_UnitChunk *chunk = task->units[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Unit *unit = &chunk->v[i];\n      rdib_string_map_insert_string_table_item(arena, task, task_id, unit->unit_name);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, unit->compiler_name);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, unit->source_file);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, unit->object_file);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, unit->archive_file);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, unit->build_path);\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_source_files_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_SourceFile *src_file = chunk->v + i;\n      rdib_string_map_insert_string_table_item(arena, task, task_id, src_file->normal_full_path);\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_vars_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->vars[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Variable *var = &chunk->v[i];\n      rdib_string_map_insert_string_table_item(arena, task, task_id, var->name);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, var->link_name);\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_procs_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ProcedureChunk *chunk = task->procs[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Procedure *proc = &chunk->v[i];\n      rdib_string_map_insert_string_table_item(arena, task, task_id, proc->name);\n      rdib_string_map_insert_string_table_item(arena, task, task_id, proc->link_name);\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_inline_sites_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_InlineSiteChunk *chunk = task->inline_sites[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_InlineSite *inline_site = &chunk->v[i];\n      rdib_string_map_insert_string_table_item(arena, task, task_id, inline_site->name);\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_udt_members_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_UDTMemberChunk *chunk = task->udt_members[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_UDTMember *udt_member = &chunk->v[i];\n      switch (udt_member->kind) {\n      case RDI_MemberKind_NULL            : break;\n      case RDI_MemberKind_DataField       : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->data_field.name ); break;\n      case RDI_MemberKind_StaticData      : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->static_data.name); break;\n      case RDI_MemberKind_Method          : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->method.name     ); break;\n      case RDI_MemberKind_NestedType      : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->nested_type.name); break;\n      case RDI_MemberKind_Base            : break;\n      case RDI_MemberKind_VirtualBase     : break;\n      //case RDI_MemberKind_Enumerate       : rdib_string_map_insert_string_table_item(arena, task, task_id, udt_member->enumerate.name); break;\n      case RDI_MemberKindExt_MemberListPointer: break;\n      default: InvalidPath;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_enum_members_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_UDTMemberChunk *chunk = task->enum_members[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      rdib_string_map_insert_string_table_item(arena, task, task_id, chunk->v[i].enumerate.name);\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_types_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_TypeChunk *chunk = task->types[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Type *type = &chunk->v[i];\n      if (RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn) {\n        rdib_string_map_insert_string_table_item(arena, task, task_id, type->builtin.name);\n      } else if (RDI_IsUserDefinedType(type->kind)) {\n        rdib_string_map_insert_string_table_item(arena, task, task_id, type->udt.name);\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_collect_strings_path_nodes_task)\n{\n  ProfBeginFunction();\n  RDIB_CollectStringsTask *task = raw_task;\n  for (RDIB_PathTreeNode *n = task->path_node_lists[task_id].first; n != 0; n = n->next_order) {\n    rdib_string_map_insert_string_table_item(arena, task, task_id, n->sub_path);\n  }\n  ProfEnd();\n}\n\n////////////////////////////////\n// Name Map Tasks\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_name_map_var_task)\n{\n  RDIB_CollectStringsTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->vars[chunk_idx];\n    VoidNode           *nodes = push_array(arena, VoidNode, chunk->count);\n    for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) {\n      RDIB_Variable *n = &chunk->v[var_idx];\n      nodes[var_idx].v = n;\n      rdib_string_map_insert_name_map_item(arena, task, task_id, n->name, &nodes[var_idx]);\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_name_map_var_link_name_task)\n{\n  RDIB_CollectStringsTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->vars[chunk_idx];\n    VoidNode           *nodes = push_array(arena, VoidNode, chunk->count);\n    for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) {\n      RDIB_Variable *n = &chunk->v[var_idx];\n      nodes[var_idx].v = n;\n      rdib_string_map_insert_name_map_item(arena, task, task_id, n->link_name, &nodes[var_idx]);\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_name_map_procedure_task)\n{\n  RDIB_CollectStringsTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ProcedureChunk *chunk = task->procs[chunk_idx];\n    VoidNode *nodes = push_array(arena, VoidNode, chunk->count);\n    for (U64 proc_idx = 0; proc_idx < chunk->count; ++proc_idx) {\n      RDIB_Procedure *n = &chunk->v[proc_idx];\n      nodes[proc_idx].v = n;\n      rdib_string_map_insert_name_map_item(arena, task, task_id, n->name, &nodes[proc_idx]);\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_name_map_procedures_link_name_task)\n{\n  RDIB_CollectStringsTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ProcedureChunk *chunk = task->procs[chunk_idx];\n    VoidNode            *nodes = push_array(arena, VoidNode, chunk->count);\n    for (U64 proc_idx = 0; proc_idx < chunk->count; ++proc_idx) {\n      RDIB_Procedure *n = &chunk->v[proc_idx];\n      nodes[proc_idx].v = n;\n      rdib_string_map_insert_name_map_item(arena, task, task_id, n->link_name, &nodes[proc_idx]);\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_name_map_types_task)\n{\n  RDIB_CollectStringsTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_TypeChunk *chunk = task->types[chunk_idx];\n    VoidNode *nodes       = push_array(arena, VoidNode, chunk->count);\n    VoidNode *node_cursor = nodes;\n    for (U64 type_idx = 0; type_idx < chunk->count; ++type_idx) {\n      RDIB_Type *type = &chunk->v[type_idx];\n      node_cursor->v = type;\n\n      if (RDI_IsUserDefinedType(type->kind)) {\n        rdib_string_map_insert_name_map_item(arena, task, task_id, type->udt.name, node_cursor);\n        ++node_cursor;\n      }\n    }\n  }\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_name_map_normal_paths_task)\n{\n  RDIB_CollectStringsTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx];\n    VoidNode *nodes             = push_array(arena, VoidNode, chunk->count);\n    VoidNode *node_cursor       = nodes;\n    for (U64 i = 0; i < chunk->count; ++i, ++node_cursor) {\n      node_cursor->v = &chunk->v[i];\n      rdib_string_map_insert_name_map_item(arena, task, task_id, chunk->v[i].normal_full_path, node_cursor);\n    }\n  }\n}\n\n////////////////////////////////\n// Index Run Map\n\ninternal U64\nrdib_index_run_hash(U32 count, U32 *idxs)\n{\n  XXH64_hash_t hash64 = XXH3_64bits(idxs, count * sizeof(idxs[0]));\n  return hash64;\n}\n\ninternal RDIB_IndexRunMap *\nrdib_init_index_run_map(Arena *arena, U64 cap)\n{\n  ProfBeginFunction();\n  RDIB_IndexRunMap *map = push_array(arena, RDIB_IndexRunMap, 1);\n  map->cap              = cap;\n  map->buckets          = push_array(arena, RDIB_IndexRunBucket *, cap);\n  ProfEnd();\n  return map;\n}\n\ninternal RDIB_IndexRunBucket *\nrdib_index_run_map_insert_or_update(Arena *arena, RDIB_IndexRunBucket **buckets, U64 cap, U64 hash, RDIB_IndexRunBucket *new_bucket, U64 *bucket_idx_out)\n{\n  B32 was_bucket_inserted_or_updated = 0;\n\n  RDIB_IndexRunBucket *result = 0;\n\n  U64 best_idx = hash % cap;\n  U64 idx      = best_idx;\n\n  do {\n    retry:;\n    RDIB_IndexRunBucket *curr_bucket = buckets[idx];\n\n    if (curr_bucket == 0) {\n      RDIB_IndexRunBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n\n      if (compare_bucket == curr_bucket) {\n        // success, bucket was inserted\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    } else if (u32_array_compare(curr_bucket->indices, new_bucket->indices)) {\n      if (curr_bucket->sorter.v <= new_bucket->sorter.v) {\n        // recycle bucket\n        result = new_bucket;\n\n        // don't need to update, more recent leaf is in the bucket\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      RDIB_IndexRunBucket *compare_bucket = ins_atomic_ptr_eval_cond_assign(&buckets[idx], new_bucket, curr_bucket);\n      if (compare_bucket == curr_bucket) {\n        // recycle bucket\n        result = compare_bucket;\n\n        // new bucket is in the hash table, exit\n        was_bucket_inserted_or_updated = 1;\n        break;\n      }\n\n      // another thread took the bucket...\n      goto retry;\n    }\n\n    // advance\n    idx = (idx + 1) % cap;\n  } while (idx != best_idx);\n\n  // are there enough free buckets?\n  Assert(was_bucket_inserted_or_updated);\n\n  // output bucket index\n  *bucket_idx_out = idx;\n\n  return result;\n}\n\ninternal U32\nrdib_idx_run_from_bucket_idx(RDIB_IndexRunMap *map, U64 bucket_idx)\n{\n  RDIB_IndexRunBucket *bucket = map->buckets[bucket_idx];\n  U32 idx_run32 = safe_cast_u32(bucket->index_in_output_array);\n  return idx_run32;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_count_extant_buckets_index_run_map_task)\n{\n  ProfBeginFunction();\n  RDIB_GetExtantBucketsIndexRunMapTask *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    if (task->idx_run_map->buckets[bucket_idx] != 0) {\n      task->counts[task_id] += 1;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_get_extant_buckets_index_run_map_task)\n{\n  ProfBeginFunction();\n  RDIB_GetExtantBucketsIndexRunMapTask *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min, cursor = task->offsets[task_id]; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_IndexRunBucket *bucket = task->idx_run_map->buckets[bucket_idx];\n    if (bucket != 0) {\n      task->result[cursor] = bucket;\n      ++cursor;\n    }\n  }\n  ProfEnd();\n}\n\ninternal RDIB_IndexRunBucket **\nrdib_extant_buckets_from_index_run_map(TP_Context *tp, Arena *arena, RDIB_IndexRunMap *idx_run_map, U64 *bucket_count_out)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  RDIB_GetExtantBucketsIndexRunMapTask task = {0};\n  task.idx_run_map = idx_run_map;\n\n  ProfBegin(\"Count Extant Buckets\");\n  task.counts = push_array(scratch.arena, U64, tp->worker_count);\n  task.ranges = tp_divide_work(scratch.arena, idx_run_map->cap, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_count_extant_buckets_index_run_map_task, &task);\n  ProfEnd();\n\n  *bucket_count_out = sum_array_u64(tp->worker_count, task.counts);\n\n  ProfBegin(\"Copy Extant Buckets\");\n  task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n  task.result  = push_array(arena, RDIB_IndexRunBucket *, *bucket_count_out);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_get_extant_buckets_index_run_map_task, &task);\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n  return task.result;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_index_run_map_bucket_chunk_idx_histo_task)\n{\n  ProfBeginFunction();\n  RDIB_IndexRunMapRadixSort *task    = raw_task;\n  Temp                       scratch = scratch_begin(0,0);\n\n  U32 *range_histo = push_array(scratch.arena, U32, task->chunk_idx_opl);\n\n  // count items per sorter\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_IndexRunBucket *bucket = task->src[bucket_idx];\n    U32 chunk_idx = bucket->sorter.hi;\n    Assert(chunk_idx < task->chunk_idx_opl);\n    ++range_histo[chunk_idx];\n  }\n\n  // add in per thread sorter counts\n  for (U64 i = 0; i < task->chunk_idx_opl; ++i) {\n    ins_atomic_u32_add_eval(&task->chunk_histo[i], range_histo[i]);\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_chunk_idx_task)\n{\n  ProfBeginFunction();\n  RDIB_IndexRunMapRadixSort *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_IndexRunBucket *bucket    = task->src[bucket_idx];\n    U32                  chunk_idx = bucket->sorter.hi;\n    U32                  dst_idx   = ins_atomic_u32_inc_eval(&task->chunk_offsets[chunk_idx]) - 1;\n    task->dst[dst_idx] = bucket;\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_index_run_map_radix_sort_element_idx_task)\n{\n  ProfBeginFunction();\n  RDIB_IndexRunMapRadixSort *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    U64 range_lo = task->chunk_offsets[chunk_idx];\n    U64 range_hi = task->chunk_offsets[chunk_idx] + task->chunk_histo[chunk_idx];\n\n    ProfBegin(\"Zero out Histogram\");\n    U32 histo_bot[1 << 10]; MemoryZeroArray(histo_bot);\n    U32 histo_mid[1 << 11]; MemoryZeroArray(histo_mid);\n    U32 histo_top[1 << 11]; MemoryZeroArray(histo_top);\n    ProfEnd();\n\n    ProfBegin(\"Element Histogram\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_IndexRunBucket *elem = task->dst[i];\n      U32 elem_idx  = elem->sorter.lo;\n      U32 digit_bot = (elem_idx >>  0) % ArrayCount(histo_bot);\n      U32 digit_mid = (elem_idx >> 10) % ArrayCount(histo_mid);\n      U32 digit_top = (elem_idx >> 21) % ArrayCount(histo_top);\n      histo_bot[digit_bot] += 1;\n      histo_mid[digit_mid] += 1;\n      histo_top[digit_top] += 1;\n    }\n    ProfEnd();\n\n    ProfBegin(\"Histogram Counts -> Offsets\");\n    counts_to_offsets_array_u32(ArrayCount(histo_bot), &histo_bot[0]);\n    counts_to_offsets_array_u32(ArrayCount(histo_mid), &histo_mid[0]);\n    counts_to_offsets_array_u32(ArrayCount(histo_top), &histo_top[0]);\n    ProfEnd();\n\n    ProfBegin(\"Sort Bot\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_IndexRunBucket *elem     = task->dst[i];\n      U32                  elem_idx = elem->sorter.lo;\n      U32                  digit    = (elem_idx >> 0) % ArrayCount(histo_bot);\n      U32                  src_idx  = range_lo + histo_bot[digit]++;\n      task->src[src_idx] = elem;\n    }\n    ProfEnd();\n\n    ProfBegin(\"Sort Mid\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_IndexRunBucket *elem     = task->src[i];\n      U32                  elem_idx = elem->sorter.lo;\n      U32                  digit    = (elem_idx >> 10) % ArrayCount(histo_mid);\n      U32                  dst_idx  = range_lo + histo_mid[digit]++;\n      task->dst[dst_idx] = elem;\n    }\n    ProfEnd();\n\n    ProfBegin(\"Sort Top\");\n    for (U64 i = range_lo; i < range_hi; ++i) {\n      RDIB_IndexRunBucket *elem     = task->dst[i];\n      U32                  elem_idx = elem->sorter.lo;\n      U32                  digit    = (elem_idx >> 21) % ArrayCount(histo_top);\n      U32                  src_idx  = range_lo + histo_top[digit]++;\n      task->src[src_idx] = elem;\n    }\n    ProfEnd();\n  }\n\n  ProfEnd();\n}\n\ninternal void\nrdib_index_run_map_sort_buckets(TP_Context *tp, RDIB_IndexRunBucket **buckets, U64 bucket_count, U64 chunk_idx_opl)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  RDIB_IndexRunMapRadixSort task = {0};\n  task.chunk_idx_opl = chunk_idx_opl;\n  task.ranges        = tp_divide_work(scratch.arena, bucket_count, tp->worker_count);\n  task.src           = buckets;\n  task.dst           = push_array_no_zero(scratch.arena, RDIB_IndexRunBucket *, bucket_count);\n\n  ProfBegin(\"Chunk Index Histogram\");\n  task.chunk_histo = push_array(scratch.arena, U32, chunk_idx_opl);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_bucket_chunk_idx_histo_task, &task);\n  ProfEnd();\n\n  // sort correctness check on chunk index\n#if 0\n  for (U64 i = 1; i < bucket_count; ++i) {\n    RDIB_StringMapBucket *prev = buckets[i - 1];\n    RDIB_StringMapBucket *curr = buckets[i + 0];\n    U32 prev_chunk_idx = RDIB_StringMap_ChunkIdx32FromSorter(prev->sorter);\n    U32 curr_chunk_idx = RDIB_StringMap_ChunkIdx32FromSorter(curr->sorter);\n    AssertAlways(prev_chunk_idx <= curr_chunk_idx);\n  }\n#endif\n\n  ProfBegin(\"Chunk Histo -> Offsets\");\n  task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl);\n  ProfEnd();\n\n  ProfBegin(\"Sort on chunk index\");\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_chunk_idx_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Sort on element index\");\n  task.chunk_offsets = offsets_from_counts_array_u32(scratch.arena, task.chunk_histo, chunk_idx_opl);\n  task.ranges        = tp_divide_work(scratch.arena, chunk_idx_opl, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_index_run_map_radix_sort_element_idx_task, &task);\n  ProfEnd();\n\n  // sort correctness check on element index\n#if 0\n  {\n    for (U64 i = 1; i < bucket_count; ++i) {\n      RDIB_IndexRunBucket *prev = buckets[i - 1];\n      RDIB_IndexRunBucket *curr = buckets[i + 0];\n      U32 prev_chunk_idx = prev->sorter.hi;\n      U32 curr_chunk_idx = curr->sorter.hi;\n      if (prev_chunk_idx == curr_chunk_idx) {\n        U32 prev_elem_idx = prev->sorter.lo;\n        U32 curr_elem_idx = curr->sorter.lo;\n        AssertAlways(prev_elem_idx < curr_elem_idx);\n      }\n    }\n  }\n#endif\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nrdib_index_run_map_assign_indices(RDIB_IndexRunBucket **buckets, U64 bucket_count)\n{\n  ProfBeginFunction();\n  for (U64 bucket_idx = 0, cursor = 0; bucket_idx < bucket_count; ++bucket_idx) {\n    buckets[bucket_idx]->index_in_output_array = cursor;\n    cursor += buckets[bucket_idx]->indices.count;\n  }\n  ProfEnd();\n}\n\n// index run map specialization\n\ninternal U64\nrdib_index_run_map_insert_item(Arena *arena, RDIB_BuildIndexRunsTask *task, U64 worker_id, U64 item_idx, U64 count, U32 *idxs)\n{\n  Assert(item_idx < max_U32);\n\n  // do we have a free bucket?\n  RDIB_IndexRunBucket *bucket = task->free_buckets[worker_id];\n  if (bucket == 0) {\n    bucket = push_array(arena, RDIB_IndexRunBucket, 1);\n  }\n\n  // fill out bucket\n  bucket->indices.count = count;\n  bucket->indices.v     = idxs;\n  bucket->sorter.v      = task->sorter_idx << 32 | (U32)item_idx;\n\n  // insert bucket\n  U64                  hash       = rdib_index_run_hash(count, idxs);\n  U64                  bucket_idx = max_U64;\n  RDIB_IndexRunBucket *free_bucket = rdib_index_run_map_insert_or_update(arena,\n                                                                         task->idx_run_map->buckets,\n                                                                         task->idx_run_map->cap,\n                                                                         hash,\n                                                                         bucket,\n                                                                         &bucket_idx);\n  Assert(bucket_idx != max_U64);\n\n  // recycle bucket\n  task->free_buckets[worker_id] = free_bucket;\n\n  return bucket_idx;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_idx_runs_params_task)\n{\n  ProfBeginFunction();\n\n  RDIB_BuildIndexRunsTask *task  = raw_task;\n  RDIB_TypeChunk          *chunk = task->type_chunks[task_id];\n\n  for (RDIB_Type *type = &chunk->v[0], *opl = chunk->v + chunk->count; type < opl; ++type) {\n    if (type->kind == RDI_TypeKind_Function) {\n      RDIB_Type *params = type->func.params_type;\n\n      // pack params\n      U64  type_index_count = params->params.count;\n      U32 *type_indices     = push_array_no_zero(arena, U32, type_index_count);\n      for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) {\n        type_indices[param_idx] = rdib_idx_from_type(params->params.types[param_idx]);\n      }\n\n      // insert type indices\n      U32 func_type_idx = rdib_idx_from_type(type);\n      type->func.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, func_type_idx, type_index_count, type_indices);\n    } else if (type->kind == RDI_TypeKind_Method) {\n      RDIB_Type *params = type->method.params_type;\n\n      U64  type_index_count = params->params.count + 1;\n      U32 *type_indices     = push_array_no_zero(arena, U32, type_index_count);\n      U64  type_idx_cursor  = 0;\n\n      // pack 'this' type\n      type_indices[type_idx_cursor++] = rdib_idx_from_type(type->method.this_type);\n\n      // pack params\n      for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) {\n        type_indices[type_idx_cursor++] = rdib_idx_from_type(params->params.types[param_idx]);\n      }\n\n      // insert type indices\n      U32 method_type_idx = rdib_idx_from_type(type);\n      type->method.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, method_type_idx, type_index_count, type_indices);\n    } else if (type->kind == RDI_TypeKindExt_StaticMethod) {\n      RDIB_Type *params = type->static_method.params_type;\n\n      U64  type_index_count = params->params.count + 1;\n      U32 *type_indices     = push_array_no_zero(arena, U32, type_index_count);\n      U64  type_idx_cursor  = 0;\n\n      // static methods don't have 'this'\n      type_indices[type_idx_cursor++] = 0;\n\n      // pack params\n      for (U64 param_idx = 0; param_idx < params->params.count; ++param_idx) {\n        type_indices[type_idx_cursor++] = rdib_idx_from_type(params->params.types[param_idx]);\n      }\n\n      // insert type indices\n      U32 static_method_type_idx = rdib_idx_from_type(type);\n      type->static_method.param_idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, static_method_type_idx, type_index_count, type_indices);\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal U32\nrdib_idx_from_name_map_void_node(RDIB_BuildIndexRunsTask *task, VoidNode *node)\n{\n  U64 idx = 0;\n  switch (task->name_map_kind) {\n  case RDI_NameMapKind_NULL              : break;\n  case RDI_NameMapKind_GlobalVariables   : idx = rdib_idx_from_variable   ((RDIB_Variable*   ) node); break;\n  case RDI_NameMapKind_ThreadVariables   : idx = rdib_idx_from_variable   ((RDIB_Variable *  ) node); break;\n  case RDI_NameMapKind_Procedures        : idx = rdib_idx_from_procedure  ((RDIB_Procedure * ) node); break;\n  case RDI_NameMapKind_Types             : idx = rdib_idx_from_type       ((RDIB_Type *      ) node); break;\n  case RDI_NameMapKind_LinkNameProcedures: idx = rdib_idx_from_procedure  ((RDIB_Procedure * ) node); break;\n  case RDI_NameMapKind_NormalSourcePaths : idx = rdib_idx_from_source_file((RDIB_SourceFile *) node); break;\n  default: InvalidPath;\n  }\n  U32 idx32 = safe_cast_u32(idx);\n  return idx32;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_idx_runs_name_map_buckets_task)\n{\n  ProfBeginFunction();\n\n  RDIB_BuildIndexRunsTask *task = raw_task;\n\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_StringMapBucket *bucket = task->name_map_buckets[bucket_idx];\n    U64                   count  = void_list_count_nodes(bucket->raw_values);\n\n    if (count > 1) {\n      // build array of indices that point to name map respective arrays\n      U32 *idxs = push_array_no_zero(arena, U32, count);\n      {\n        U64 curr_idx = 0;\n        for (VoidNode *curr = bucket->raw_values; curr != 0; curr = curr->next, ++curr_idx) {\n          idxs[curr_idx] = rdib_idx_from_name_map_void_node(task, curr->v);\n        }\n      }\n\n      // make index array deterministic\n      u32_array_sort(count, idxs); // TODO: we don't need to sort with one worker thread\n\n      // :string_map_bucket_sorter_copy\n      U64 idx_run_bucket_idx = rdib_index_run_map_insert_item(arena, task, worker_id, bucket_idx, count, idxs); // TODO: fix `idx` leak when we insert same runs\n      \n      // fill out bucket\n      bucket->count              = count;\n      bucket->idx_run_bucket_idx = idx_run_bucket_idx;\n    } if (count == 1) {\n      U32 match_idx = rdib_idx_from_name_map_void_node(task, bucket->raw_values->v);\n\n      // fill out bucket\n      bucket->count     = 1;\n      bucket->match_idx = match_idx;\n    }\n  }\n\n  ProfEnd();\n}\n\n////////////////////////////////\n\n#if 0\ninternal U32\nrdib_idx_from_params(RDIB_IndexRunMap *map, RDIB_Type *params)\n{\n  Assert(params->kind == RDI_TypeKindExt_Params);\n  U32 idx = params->params.idx_run_bucket->index_in_output_array;\n  return idx;\n}\n#endif\n\n////////////////////////////////\n// Data Sections\n\ninternal void\nrdib_data_section_list_push_node(RDIB_DataSectionList *list, RDIB_DataSectionNode *node)\n{\n  SLLQueuePushCount(list, node);\n}\n\ninternal RDIB_DataSectionNode *\nrdib_data_section_list_push(Arena *arena, RDIB_DataSectionList *list, RDIB_DataSection v)\n{\n  RDIB_DataSectionNode *node = push_array(arena, RDIB_DataSectionNode, 1);\n  node->v                    = v;\n  rdib_data_section_list_push_node(list, node);\n  return node;\n}\n\ninternal void\nrdib_data_section_list_concat_in_place(RDIB_DataSectionList *list, RDIB_DataSectionList *to_concat)\n{\n  SLLConcatInPlace(list, to_concat);\n}\n\ninternal void\nrdib_data_sections_from_top_level_info(Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_TopLevelInfo *src)\n{\n  ProfBeginFunction();\n\n  RDI_TopLevelInfo *dst         = push_array(arena, RDI_TopLevelInfo, 1);\n  dst->arch                     = src->arch;\n  dst->exe_name_string_idx      = rdib_idx_from_string_map(string_map, src->exe_name);\n  dst->exe_hash                 = src->exe_hash;\n  dst->voff_max                 = src->voff_max;\n  dst->producer_name_string_idx = rdib_idx_from_string_map(string_map, src->producer_string);\n\n  RDIB_DataSection sect = { .tag = RDI_SectionKind_TopLevelInfo };\n  str8_list_push(arena, &sect.data, str8_struct(dst));\n  rdib_data_section_list_push(arena, sect_list, sect);\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_binary_sections(Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_BinarySection *binary_sects, U64 binary_sects_count)\n{\n  ProfBeginFunction();\n\n  RDI_BinarySection *dst_arr = push_array(arena, RDI_BinarySection, binary_sects_count);\n\n  for (U64 sect_idx = 0; sect_idx < binary_sects_count; ++sect_idx) {\n    RDIB_BinarySection *src = &binary_sects[sect_idx];\n    RDI_BinarySection  *dst = &dst_arr[sect_idx];\n\n    dst->name_string_idx = rdib_idx_from_string_map(string_map, src->name);\n    dst->flags           = src->flags;\n    dst->voff_first      = src->voff_first;\n    dst->voff_opl        = src->voff_opl;\n    dst->foff_first      = src->foff_first;\n    dst->foff_opl        = src->foff_opl;\n  }\n\n  RDIB_DataSection sect = { .tag = RDI_SectionKind_BinarySections };\n  str8_list_push(arena, &sect.data, str8_array(dst_arr, binary_sects_count));\n  rdib_data_section_list_push(arena, sect_list, sect);\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_units(Arena                *arena,\n                              RDIB_DataSectionList *sect_list,\n                              RDIB_StringMap       *string_map,\n                              RDIB_PathTree        *path_tree,\n                              U64                   total_unit_count,\n                              U64                   unit_chunk_count,\n                              RDIB_UnitChunk      **unit_chunks)\n{\n  ProfBeginFunction();\n\n  RDI_Unit *dst_arr = push_array(arena, RDI_Unit, total_unit_count);\n  for (U64 chunk_idx = 0; chunk_idx < unit_chunk_count; chunk_idx += 1) {\n    RDIB_UnitChunk *chunk = unit_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; i += 1) {\n      RDIB_Unit *src     = &chunk->v[i];\n      U64       unit_idx = rdib_idx_from_unit(src);\n      RDI_Unit  *dst     = &dst_arr[unit_idx];\n      dst->unit_name_string_idx     = rdib_idx_from_string_map(string_map, src->unit_name);\n      dst->compiler_name_string_idx = rdib_idx_from_string_map(string_map, src->compiler_name);\n      dst->source_file_path_node    = rdib_idx_from_path_tree(path_tree, src->source_file);\n      dst->object_file_path_node    = rdib_idx_from_path_tree(path_tree, src->object_file);\n      dst->archive_file_path_node   = rdib_idx_from_path_tree(path_tree, src->archive_file);\n      dst->build_path_node          = rdib_idx_from_path_tree(path_tree, src->build_path);\n      dst->language                 = src->language;\n      dst->line_table_idx           = src->line_table->output_array_idx;\n    }\n  }\n\n  RDIB_DataSection sect = { .tag = RDI_SectionKind_Units };\n  str8_list_push(arena, &sect.data, str8_array(dst_arr, total_unit_count));\n  rdib_data_section_list_push(arena, sect_list, sect);\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_unit_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_UnitChunk *chunk = task->unit_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Unit *unit = &chunk->v[i];\n      task->counts[task_id] += unit->virt_range_count;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_gvar_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->gvar_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Variable *var = &chunk->v[i];\n      for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) {\n        task->counts[task_id] += loc_n->v.ranges.count;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_vmap_count_ranges_scope_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ScopeChunk *chunk = task->scope_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      task->counts[task_id] += chunk->v[i].ranges.count;\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_unit_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task            = raw_task;\n  U64                  range_cursor     = task->offsets[task_id];\n  U64                  range_cursor_opl = task->offsets[task_id] + task->counts[task_id];\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_UnitChunk *chunk = task->unit_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Unit *unit = &chunk->v[i];\n      for (Rng1U64 *range_ptr = unit->virt_ranges, *range_opl = unit->virt_ranges + unit->virt_range_count;\n           range_ptr < range_opl; ++range_ptr) {\n        Assert(range_cursor < range_cursor_opl);\n        Assert(range_ptr->min <= range_ptr->max);\n\n        RDIB_VMapRange *vmap_range = task->vmap + range_cursor;\n        vmap_range->voff           = range_ptr->min;\n        vmap_range->size           = range_ptr->max - range_ptr->min;\n        vmap_range->idx            = rdib_idx_from_unit(unit);\n        range_cursor += 1;\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_gvar_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task = raw_task;\n\n  U64 range_cursor     = task->offsets[task_id];\n  U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id];\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->gvar_chunks[chunk_idx];\n    for (U64 var_idx = 0; var_idx < chunk->count; ++var_idx) {\n      RDIB_Variable *var = &chunk->v[var_idx];\n      for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) {\n        for (Rng1U64Node *range_n = loc_n->v.ranges.first; range_n != 0; range_n = range_n->next) {\n          Assert(range_cursor < range_cursor_opl);\n          Assert(range_n->v.min <= range_n->v.max);\n          U64 size = range_n->v.max - range_n->v.min;\n\n          RDIB_VMapRange *vmap_range = task->vmap + range_cursor;\n          vmap_range->voff           = range_n->v.min;\n          vmap_range->size           = size;\n          vmap_range->idx            = rdib_idx_from_variable(var);\n          range_cursor += 1;\n        }\n      }\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_vmap_entries_scope_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task = raw_task;\n\n  U64 range_cursor     = task->offsets[task_id];\n  U64 range_cursor_opl = task->offsets[task_id] + task->counts[task_id];\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ScopeChunk *chunk = task->scope_chunks[chunk_idx];\n    for (U64 scope_idx = 0; scope_idx < chunk->count; ++scope_idx) {\n      RDIB_Scope *scope = &chunk->v[scope_idx];\n      for (Rng1U64Node *range_n = scope->ranges.first; range_n != 0; range_n = range_n->next) {\n        Assert(range_cursor  < range_cursor_opl);\n        Assert(range_n->v.min <= range_n->v.max);\n\n        RDIB_VMapRange *vmap_range = task->vmap + range_cursor;\n        vmap_range->voff           = range_n->v.min;\n        vmap_range->size           = range_n->v.max - range_n->v.min;\n        vmap_range->idx            = rdib_idx_from_scope(scope);\n        range_cursor += 1;\n      }\n    }\n  }\n\n  ProfEnd();\n}\n\ninternal void\nrdib_sort_procs_radix_32(RDIB_Procedure **v, U64 count)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  RDIB_Procedure **temp = push_array_no_zero(scratch.arena, RDIB_Procedure *, count);\n  RDIB_Procedure **src  = v;\n  RDIB_Procedure **dst  = temp;\n\n  ProfBegin(\"Count Memzero\");\n  U32 count_8lo[256];    MemoryZeroArray(count_8lo);\n  U32 count_8hi[256];    MemoryZeroArray(count_8hi);\n  U32 count_16[1 << 16]; MemoryZeroArray(count_16);\n  ProfEnd();\n\n  ProfBegin(\"Histogram\");\n  for (U64 i = 0; i < count; i += 1) {\n    RDIB_Procedure *p = src[i];\n\n    U64 digit_8lo  = (p->scope->ranges.first->v.min >> 0)  % ArrayCount(count_8lo);\n    U64 digit_8hi  = (p->scope->ranges.first->v.min >> 8)  % ArrayCount(count_8hi);\n    U64 digit_16   = (p->scope->ranges.first->v.min >> 16) % ArrayCount(count_16);\n\n    count_8lo[digit_8lo]  += 1;\n    count_8hi[digit_8hi]  += 1;\n    count_16[digit_16]    += 1;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Counts -> Offsets\");\n  counts_to_offsets_array_u32(ArrayCount(count_8lo),  count_8lo);\n  counts_to_offsets_array_u32(ArrayCount(count_8hi),  count_8hi);\n  counts_to_offsets_array_u32(ArrayCount(count_16),   count_16 );\n  ProfEnd();\n\n  ProfBegin(\"Order 8 Lo\");\n  for (U64 i = 0; i < count; i += 1) {\n    RDIB_Procedure *p = src[i];\n    U64 digit = (p->scope->ranges.first->v.min >> 0) % ArrayCount(count_8lo);\n    dst[count_8lo[digit]++] = p;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Order 8 Hi\");\n  for (U64 i = 0; i < count; i += 1) {\n    RDIB_Procedure *p = dst[i];\n    U64 digit = (p->scope->ranges.first->v.min >> 8) % ArrayCount(count_8hi);\n    src[count_8hi[digit]++] = p;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Order 16\");\n  for (U64 i = 0; i < count; i += 1) {\n    RDIB_Procedure *p = src[i];\n    U64 digit = (p->scope->ranges.first->v.min >> 16) % ArrayCount(count_16);\n    dst[count_16[digit]++] = p;\n  }\n  ProfEnd();\n\n  MemoryCopyTyped(src, dst, count);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal String8List\nrdib_data_from_vmap(Arena *arena, U64 range_count, RDIB_VMapRange *ranges)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  const U64 size_bit_count0 = 8;\n  const U64 size_bit_count1 = 8;\n  const U64 size_bit_count2 = 16;\n\n  const U64 voff_bit_count0 = 11;\n  const U64 voff_bit_count1 = 11;\n  const U64 voff_bit_count2 = 10;\n\n  ProfBegin(\"Push shared buffer\");\n  U64 radix_memory_size = sizeof(RDIB_VMapRange) * range_count +\n                          sizeof(U32) * ((1 << size_bit_count0) + (1 << size_bit_count1) + (1 << size_bit_count2)) +\n                          sizeof(U32) * ((1 << voff_bit_count0) + (1 << voff_bit_count1) + (1 << voff_bit_count2));\n  U8 *radix_memory      = push_array_no_zero(arena, U8, radix_memory_size);\n  ProfEnd();\n\n  // TODO: windows caps images at 4GiB so we use 32-bit radix sort, but on linux\n  // images can have > 4GiB and we need to detect when vmap uses upper 32bits\n  // in voffs do a 64-bit radix sort.\n  ProfBegin(\"Sort\");\n  {\n    RDIB_VMapRange *src = ranges;\n    RDIB_VMapRange *dst = (RDIB_VMapRange *)radix_memory;\n\n    U32 *size_count0 = (U32 *)(dst + range_count);\n    U32 *size_count1 = size_count0 + (1 << size_bit_count0);\n    U32 *size_count2 = size_count1 + (1 << size_bit_count1);\n\n    U32 *voff_count0 = size_count2 + (1 << size_bit_count2);\n    U32 *voff_count1 = voff_count0 + (1 << voff_bit_count0);\n    U32 *voff_count2 = voff_count1 + (1 << voff_bit_count1);\n\n    //\n    // Build histogram\n    //\n\n    MemoryZeroTyped(size_count0, 1 << size_bit_count0);\n    MemoryZeroTyped(size_count1, 1 << size_bit_count1);\n    MemoryZeroTyped(size_count2, 1 << size_bit_count2);\n\n    MemoryZeroTyped(voff_count0, 1 << voff_bit_count0);\n    MemoryZeroTyped(voff_count1, 1 << voff_bit_count1);\n    MemoryZeroTyped(voff_count2, 1 << voff_bit_count2);\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange *r = src+i;\n\n      U32 size_digit0 = (-r->size >> 0)                                   % (1 << size_bit_count0);\n      U32 size_digit1 = (-r->size >> size_bit_count0)                     % (1 << size_bit_count1);\n      U32 size_digit2 = (-r->size >> (size_bit_count0 + size_bit_count1)) % (1 << size_bit_count2);\n\n      U64 voff_digit0 = (r->voff >> 0)                                   % (1 << voff_bit_count0);\n      U64 voff_digit1 = (r->voff >> voff_bit_count0)                     % (1 << voff_bit_count1);\n      U64 voff_digit2 = (r->voff >> (voff_bit_count0 + voff_bit_count1)) % (1 << voff_bit_count2);\n\n      ++size_count0[size_digit0];\n      ++size_count1[size_digit1];\n      ++size_count2[size_digit2];\n\n      ++voff_count0[voff_digit0];\n      ++voff_count1[voff_digit1];\n      ++voff_count2[voff_digit2];\n    }\n\n    counts_to_offsets_array_u32((1 << size_bit_count0), size_count0);\n    counts_to_offsets_array_u32((1 << size_bit_count1), size_count1);\n    counts_to_offsets_array_u32((1 << size_bit_count2), size_count2);\n\n    counts_to_offsets_array_u32((1 << voff_bit_count0), voff_count0);\n    counts_to_offsets_array_u32((1 << voff_bit_count1), voff_count1);\n    counts_to_offsets_array_u32((1 << voff_bit_count2), voff_count2);\n\n    //\n    // Sort on range size (high to low)\n    //\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange r = src[i];\n      U32 digit = (-r.size >> 0) % (1 << size_bit_count0);\n      dst[size_count0[digit]++] = r;\n    }\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange r = dst[i];\n      U32 digit = (-r.size >> size_bit_count0) % (1 << size_bit_count1);\n      src[size_count1[digit]++] = r;\n    }\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange r = src[i];\n      U32 digit = (-r.size >> (size_bit_count0 + size_bit_count1)) % (1 << size_bit_count2);\n      dst[size_count2[digit]++] = r;\n    }\n\n    //\n    // Sort on range voff (low to high)\n    //\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange r = dst[i];\n      U32 digit = (r.voff >> 0) % (1 << voff_bit_count0);\n      src[voff_count0[digit]++] = r;\n    }\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange r = src[i];\n      U32 digit = (r.voff >> voff_bit_count0) % (1 << voff_bit_count1);\n      dst[voff_count1[digit]++] = r;\n    }\n\n    for (U64 i = 0; i < range_count; ++i) {\n      RDIB_VMapRange r = dst[i];\n      U32 digit = (r.voff >> (voff_bit_count0 + voff_bit_count1)) % (1 << voff_bit_count2);\n      src[voff_count2[digit]++] = r;\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Layout virtual map\");\n  String8List raw_vmap = {0};\n  {\n    U64            default_vme_cap = 4096;\n    U64            vme_block_cap   = radix_memory_size / sizeof(RDI_VMapEntry);\n    U64            vme_block_size  = 0;\n    RDI_VMapEntry *vme_block       = (RDI_VMapEntry *)radix_memory;\n\n    // Recycle radix sort memory\n    str8_list_push(arena, &raw_vmap, str8_array(vme_block, vme_block_cap));\n\n#define push_vme() (vme_block_size < raw_vmap.last->string.size/sizeof(vme_block[0])) ? &vme_block[vme_block_size++] :    \\\n                                                  (vme_block = push_array(arena, RDI_VMapEntry, vme_block_cap),           \\\n                                                  vme_block_cap  = default_vme_cap,                                       \\\n                                                  vme_block_size = 0,                                                     \\\n                                                  str8_list_push(arena, &raw_vmap, str8_array(vme_block, vme_block_cap)), \\\n                                                  &vme_block[vme_block_size++])\n\n    struct Stack {\n      RDIB_VMapRange *range;\n      struct Stack   *next;\n    };\n    struct Stack *stack      = 0;\n    struct Stack *free_stack = 0;\n    stack        = push_array(scratch.arena, struct Stack, 1);\n    stack->range = &ranges[0];\n\n    for (U64 range_idx = 1; range_idx < range_count; ++range_idx) {\n      RDIB_VMapRange *r = ranges+range_idx;\n      RDIB_VMapRange *last_bot_range = stack->range;\n      RDIB_VMapRange *last_pop_range = 0;\n      while (stack->range->idx != 0) {\n        if (r->voff < stack->range->voff + stack->range->size) {\n          // Current range is a subset, keep building stack\n          break;\n        }\n\n        struct Stack *frame = stack;\n        SLLStackPop(stack);\n\n        // Did we reach bottom most range?\n        if (last_pop_range == 0) {\n          // Don't push VME for index with adjacent ranges\n          if (vme_block_size > 0 && vme_block[vme_block_size-1].idx != frame->range->idx) {\n            RDI_VMapEntry *vme = push_vme();\n            vme->voff          = frame->range->voff;\n            vme->idx           = frame->range->idx;\n          }\n        }\n\n        // Reopen parent range\n        //\n        //  Does parent range extend past child range?\n        if (stack->range->voff + stack->range->size != frame->range->voff + frame->range->size && \n        //  Does next range open on where stack range ends?\n            r->voff != frame->range->voff + frame->range->size) {\n          RDI_VMapEntry *vme = push_vme();\n          vme->idx           = stack->range->idx;\n          vme->voff          = frame->range->voff + frame->range->size;\n        }\n\n        last_pop_range = stack->range;\n\n        // Recycle stack frame\n        SLLStackPush(free_stack, frame);\n      }\n\n      // Prefix\n      if (last_pop_range == 0 && last_bot_range->voff != r->voff) {\n        RDI_VMapEntry* vme = push_vme();\n        vme->voff          = last_bot_range->voff;\n        vme->idx           = last_bot_range->idx;\n      }\n\n      struct Stack *frame;\n      if (free_stack == 0) {\n        frame = push_array(scratch.arena, struct Stack, 1);\n      } else {\n        frame = free_stack;\n        SLLStackPop(free_stack);\n      }\n      frame->range = r;\n      SLLStackPush(stack, frame);\n    }\n\n    // Empty stack\n    {\n      RDIB_VMapRange *last_pop_range = 0;\n      while (stack->range->idx != 0) {\n        struct Stack *frame = stack;\n        SLLStackPop(stack);\n\n        if (last_pop_range == 0) {\n          if (vme_block_size > 0 && vme_block[vme_block_size-1].idx != frame->range->idx) {\n            RDI_VMapEntry *vme = push_vme();\n            vme->voff          = frame->range->voff;\n            vme->idx           = frame->range->idx;\n          }\n        }\n\n        if (stack->range->voff + stack->range->size != frame->range->voff + frame->range->size) {\n          RDI_VMapEntry *vme = push_vme();\n          vme->voff          = frame->range->voff + frame->range->size;\n          vme->idx           = stack->range->idx;\n        }\n\n        last_pop_range = stack->range;\n      }\n    }\n\n    // Subtract unsued vmap entries\n    U64 last_vme_unused         = raw_vmap.last->string.size - sizeof(vme_block[0]) * vme_block_size;\n    raw_vmap.last->string.size -= last_vme_unused;\n    raw_vmap.total_size        -= last_vme_unused;\n\n#undef push_vme\n  }\n  ProfEnd();\n\n\n  // duplicate voff check\n#if 0\n  U64 prev = max_U64;\n  for (String8Node *node = raw_vmap.first; node != 0; node = node->next) {\n    RDI_VMapEntry *e = (RDI_VMapEntry*)node->string.str;\n    for (U64 i = 0, c = node->string.size / sizeof(RDI_VMapEntry); i < c; ++i) {\n      Assert(e[i].voff != prev);\n      prev = e[i].voff;\n    }\n  }\n#endif\n\n  scratch_end(scratch);\n  ProfEnd();\n  return raw_vmap;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_scope_vmaps_task)\n{\n  ProfBeginFunction();\n  RDIB_VMapBuilderTask *task = raw_task;\n  task->raw_vmaps[task_id] = rdib_data_from_vmap(arena, task->vmap_counts[task_id], task->vmaps[task_id]);\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_unit_gvar_scope_vmaps(TP_Context           *tp,\n                                              TP_Arena             *arena,\n                                              RDIB_DataSectionList *sect_list,\n                                              U64 unit_chunk_count,  RDIB_UnitChunk     **unit_chunks,\n                                              U64 gvar_chunk_count,  RDIB_VariableChunk **gvar_chunks,\n                                              U64 scope_chunk_count, RDIB_ScopeChunk    **scope_chunks)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  RDIB_VMapBuilderTask task = {0};\n  task.counts               = push_array(scratch.arena, U64, tp->worker_count);\n  task.ranges               = tp_divide_work(scratch.arena, unit_chunk_count, tp->worker_count);\n\n  ProfBegin(\"Unit VMap\");\n  U64             unit_vmap_count;\n  RDIB_VMapRange *unit_vmaps;\n  {\n    ProfBegin(\"Count Ranges\");\n    MemoryZeroTyped(task.counts, tp->worker_count);\n    task.unit_chunks = unit_chunks;\n    task.ranges      = tp_divide_work(scratch.arena, unit_chunk_count, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_unit_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Push\");\n    unit_vmap_count = sum_array_u64(tp->worker_count, task.counts);\n    unit_vmaps      = push_array_no_zero(scratch.arena, RDIB_VMapRange, unit_vmap_count);\n    ProfEnd();\n\n    ProfBegin(\"Fill\");\n    task.vmap        = unit_vmaps;\n    task.unit_chunks = unit_chunks;\n    task.offsets = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_unit_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBegin(\"Global Variables\");\n  U64             gvar_vmap_count;\n  RDIB_VMapRange *gvar_vmaps;\n  {\n    ProfBegin(\"Count\");\n    MemoryZeroTyped(task.counts, tp->worker_count);\n    task.ranges      = tp_divide_work(scratch.arena, gvar_chunk_count, tp->worker_count);\n    task.gvar_chunks = gvar_chunks;\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_gvar_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Push\");\n    gvar_vmap_count = sum_array_u64(tp->worker_count, task.counts);\n    gvar_vmaps      = push_array_no_zero(scratch.arena, RDIB_VMapRange, gvar_vmap_count);\n    ProfEnd();\n\n    ProfBegin(\"Fill\");\n    task.vmap        = gvar_vmaps;\n    task.gvar_chunks = gvar_chunks;\n    task.offsets     = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_gvar_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBegin(\"Scopes\");\n  U64             scope_vmap_count;\n  RDIB_VMapRange *scope_vmaps;\n  {\n    ProfBegin(\"Count\");\n    MemoryZeroTyped(task.counts, tp->worker_count);\n    task.ranges       = tp_divide_work(scratch.arena, scope_chunk_count, tp->worker_count);\n    task.scope_chunks = scope_chunks;\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_vmap_count_ranges_scope_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Push\");\n    scope_vmap_count = sum_array_u64(tp->worker_count, task.counts);\n    scope_vmaps      = push_array_no_zero(scratch.arena, RDIB_VMapRange, scope_vmap_count);\n    ProfEnd();\n\n    ProfBegin(\"Fill\");\n    task.vmap         = scope_vmaps;\n    task.scope_chunks = scope_chunks;\n    task.offsets      = offsets_from_counts_array_u64(scratch.arena, task.counts, tp->worker_count);\n    tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_vmap_entries_scope_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  task.vmap_counts[0] = unit_vmap_count;\n  task.vmap_counts[1] = gvar_vmap_count;\n  task.vmap_counts[2] = scope_vmap_count;\n  task.vmaps[0]       = unit_vmaps;\n  task.vmaps[1]       = gvar_vmaps;\n  task.vmaps[2]       = scope_vmaps;\n\n  ProfBegin(\"Fill RDI VMaps\");\n  MemoryZeroArray(task.raw_vmaps);\n  tp_for_parallel(tp, arena, 3, rdib_fill_scope_vmaps_task, &task);\n  ProfEnd();\n\n  RDIB_DataSection unit_vmap_sect  = { .tag = RDI_SectionKind_UnitVMap,   .data = task.raw_vmaps[0] };\n  RDIB_DataSection gvar_vmap_sect  = { .tag = RDI_SectionKind_GlobalVMap, .data = task.raw_vmaps[1] };\n  RDIB_DataSection scope_vmap_sect = { .tag = RDI_SectionKind_ScopeVMap,  .data = task.raw_vmaps[2] };\n  rdib_data_section_list_push(arena->v[0], sect_list, unit_vmap_sect );\n  rdib_data_section_list_push(arena->v[0], sect_list, gvar_vmap_sect );\n  rdib_data_section_list_push(arena->v[0], sect_list, scope_vmap_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_copy_string_data_task)\n{\n  RDIB_CopyStringDataTask *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_StringMapBucket *bucket              = task->buckets[bucket_idx];\n    U64                   string_table_offset = task->string_table[bucket_idx];\n    Assert(string_table_offset + bucket->string.size <= task->string_data_size);\n    MemoryCopy(task->string_data + string_table_offset, bucket->string.str, bucket->string.size);\n  }\n}\n\ninternal void\nrdib_data_sections_from_string_map(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  // assign string table offset for each bucket\n  U64  cursor       = 0;\n  U32 *string_table = push_array_no_zero(arena, U32, bucket_count);\n  for (U64 bucket_idx = 0; bucket_idx < bucket_count; ++bucket_idx) {\n    string_table[bucket_idx] = cursor;\n    cursor += buckets[bucket_idx]->string.size;\n  }\n\n  // populate string data buffer with bucket strings\n  RDIB_CopyStringDataTask task = {0};\n  task.string_table     = string_table;\n  task.string_data_size = cursor;\n  task.string_data      = push_array_no_zero(arena, U8, task.string_data_size);\n  task.buckets          = buckets;\n  task.ranges           = tp_divide_work(scratch.arena, bucket_count, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_copy_string_data_task, &task);\n\n  // fill out string table section\n  RDIB_DataSection string_table_sect = {0};\n  string_table_sect.tag = RDI_SectionKind_StringTable;\n  str8_list_push(arena, &string_table_sect.data, str8((U8 *)task.string_table, sizeof(task.string_table[0]) * bucket_count));\n\n  // fill out string data section\n  RDIB_DataSection string_data_sect = { .tag = RDI_SectionKind_StringData };\n  str8_list_push(arena, &string_data_sect.data, str8(task.string_data, task.string_data_size));\n  \n  // push sections to list\n  rdib_data_section_list_push(arena, sect_list, string_table_sect);\n  rdib_data_section_list_push(arena, sect_list, string_data_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_idx_run_copy_task)\n{\n  RDIB_IdxRunCopyTask *task = raw_task;\n  for (U64 bucket_idx = task->ranges[task_id].min; bucket_idx < task->ranges[task_id].max; ++bucket_idx) {\n    RDIB_IndexRunBucket *bucket = task->buckets[bucket_idx];\n    MemoryCopyTyped(&task->output_array[bucket->index_in_output_array], bucket->indices.v, bucket->indices.count);\n  }\n}\n\ninternal void\nrdib_data_sections_from_index_runs(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_IndexRunBucket **buckets, U64 bucket_count)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  ProfBegin(\"Count Indices\");\n  U64 total_index_count = 0;\n  for (U64 bucket_idx = 0; bucket_idx < bucket_count; ++bucket_idx) {\n    total_index_count += buckets[bucket_idx]->indices.count;\n  }\n  ProfEnd();\n\n  U32 *output_array = push_array_no_zero(arena, U32, total_index_count);\n\n  RDIB_IdxRunCopyTask task = {0};\n  task.buckets             = buckets;\n  task.ranges              = tp_divide_work(scratch.arena, bucket_count, tp->worker_count);\n  task.output_array        = output_array;\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_idx_run_copy_task, &task);\n\n  RDIB_DataSection data_sect = { .tag = RDI_SectionKind_IndexRuns };\n  str8_list_push(arena, &data_sect.data, str8_array(output_array, total_index_count));\n\n  rdib_data_section_list_push(arena, sect_list, data_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_file_path_nodes_task)\n{\n  ProfBeginFunction();\n  RDIB_BuildFilePathNodesTask *task       = raw_task;\n  RDIB_StringMap              *string_map = task->string_map;\n  RDIB_PathTree               *path_tree  = task->path_tree;\n  for (RDIB_PathTreeNode *n = path_tree->node_lists[task_id].first; n != 0; n = n->next_order) {\n    RDI_FilePathNode *dst = task->nodes_dst + n->node_idx;\n    dst->name_string_idx  = rdib_idx_from_string_map(string_map, n->sub_path);\n\n    B32 is_source_file_node = (n->first_child == 0);\n    if (is_source_file_node) {\n      dst->source_file_idx = rdib_idx_from_source_file(n->src_file);\n    } else {\n      // directories don't have a source file\n      Assert(n->src_file == 0);\n      dst->source_file_idx = 0;\n    }\n\n    if(n->parent) {\n      dst->parent_path_node = n->parent->node_idx;\n    }\n    if (n->first_child) {\n      dst->first_child = n->first_child->node_idx;\n    }\n    if (n->next_sibling) {\n      dst->next_sibling = n->next_sibling->node_idx;\n    }\n  }\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_path_tree(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree)\n{\n  ProfBeginFunction();\n  RDI_FilePathNode *nodes_dst = push_array_no_zero(arena, RDI_FilePathNode, path_tree->node_count);\n\n  RDIB_BuildFilePathNodesTask task = {0};\n  task.path_tree  = path_tree;\n  task.string_map = string_map;\n  task.nodes_dst  = nodes_dst;\n  tp_for_parallel(tp, 0, path_tree->list_count, rdib_build_file_path_nodes_task, &task);\n\n  RDIB_DataSection data_sect = { .tag = RDI_SectionKind_FilePathNodes };\n  str8_list_push(arena, &data_sect.data, str8_array(nodes_dst, path_tree->node_count));\n\n  rdib_data_section_list_push(arena, sect_list, data_sect);\n\n  ProfEnd();\n}\n\ninternal RDIB_PathTree *\nrdib_build_path_tree(Arena                 *arena,\n                     U64                    worker_count,\n                     RDIB_SourceFile       *null_src_file,\n                     U64                    unit_chunk_count,\n                     RDIB_UnitChunk       **unit_chunks,\n                     U64                    src_file_chunk_count,\n                     RDIB_SourceFileChunk **src_file_chunks)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n\n  RDIB_PathTree *tree = rdib_path_tree_init(arena, worker_count);\n  rdib_path_tree_insert(arena, tree, RDIB_PATH_TREE_NIL_STRING, null_src_file);\n\n  ProfBegin(\"Units\");\n  for (U64 ichunk = 0; ichunk < unit_chunk_count; ++ichunk) {\n    RDIB_UnitChunk *chunk = unit_chunks[ichunk];\n    for (U64 iunit = 0; iunit < chunk->count; ++iunit) {\n      RDIB_Unit *unit = &chunk->v[iunit];\n      rdib_path_tree_insert(arena, tree, unit->source_file,  null_src_file);\n      rdib_path_tree_insert(arena, tree, unit->object_file,  null_src_file);\n      rdib_path_tree_insert(arena, tree, unit->archive_file, null_src_file);\n      rdib_path_tree_insert(arena, tree, unit->build_path,   null_src_file);\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Source Files\");\n  for (U64 chunk_idx = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) {\n    RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_SourceFile *src_file = chunk->v + i;\n      rdib_path_tree_insert(arena, tree, src_file->file_path, src_file);\n    }\n  }\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n  return tree;\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_var_section_task)\n{\n  ProfBeginDynamic(\"Global Variables Task %llu\", task_id);\n  RDIB_BuildSymbolSectionTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->gvars_rdib[chunk_idx];\n    RDI_GlobalVariable *vars  = push_array_no_zero(arena, RDI_GlobalVariable, chunk->count);\n\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Variable      *src = &chunk->v[i];\n      RDI_GlobalVariable *dst = &vars[i];\n\n      // TODO: temporary hack while we don't have bytecode eval in RDI_GlobalVariable\n      U64 voff = 0;\n      if (src->locations.first != 0) {\n        if (src->locations.first->v.kind == RDI_LocationKind_AddrBytecodeStream && src->locations.first->v.bytecode.first->op == RDI_EvalOp_ModuleOff) {\n          voff = src->locations.first->v.bytecode.first->p;\n        }\n      }\n\n      dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name);\n      dst->voff            = voff;\n      dst->type_idx        = rdib_idx_from_type(src->type);\n      dst->link_flags      = src->link_flags;\n\n      if (src->container_type != 0) {\n        Assert(!src->container_proc);\n        dst->link_flags    |= RDI_LinkFlag_TypeScoped;\n        dst->container_idx  = rdib_idx_from_udt_type(src->container_type);\n      }\n      if (src->container_proc != 0) {\n        Assert(!src->container_type);\n        dst->link_flags    |= RDI_LinkFlag_ProcScoped;\n        dst->container_idx  = rdib_idx_from_procedure(src->container_proc);\n      }\n    }\n\n    str8_list_push(arena, &task->gvars_out[task_id], str8_array(vars, chunk->count));\n  }\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_global_variables(TP_Context           *tp,\n                                         TP_Arena             *arena,\n                                         RDIB_DataSectionList *sect_list,\n                                         RDIB_StringMap       *string_map,\n                                         U64                   total_count,\n                                         U64                   chunk_count,\n                                         RDIB_VariableChunk   **chunks)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Build\");\n  RDIB_BuildSymbolSectionTask task = {0};\n  task.string_map                  = string_map;\n  task.ranges                      = tp_divide_work(scratch.arena, chunk_count, tp->worker_count);\n  task.gvars_rdib                  = chunks;\n  task.gvars_out                   = push_array(scratch.arena, String8List, tp->worker_count);\n  tp_for_parallel(tp, arena, tp->worker_count, rdib_build_var_section_task, &task);\n  ProfEnd();\n\n  RDIB_DataSection gvars_sect = { .tag = RDI_SectionKind_GlobalVariables };\n  str8_list_concat_in_place_array(&gvars_sect.data, task.gvars_out, tp->worker_count);\n  rdib_data_section_list_push(arena->v[0], sect_list, gvars_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_tvar_section_task)\n{\n  RDIB_BuildSymbolSectionTask *task = raw_task;\n  ProfBeginDynamic(\"Thread Variables Task [Chunk Count: %llu]\", task->ranges[task_id].max - task->ranges[task_id].min);\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_VariableChunk *chunk = task->tvars_rdib[chunk_idx];\n    RDI_ThreadVariable *vars  = push_array_no_zero(arena, RDI_ThreadVariable, chunk->count);\n\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Variable      *src = &chunk->v[i];\n      RDI_ThreadVariable *dst = &vars[i];\n\n      U32 tls_off = 0;\n      if (src->locations.first != 0) {\n        if (src->locations.first->v.kind == RDI_LocationKind_AddrBytecodeStream && src->locations.first->v.bytecode.first->op == RDI_EvalOp_TLSOff) {\n          tls_off = src->locations.first->v.bytecode.first->p;\n        }\n      }\n\n      dst->name_string_idx = rdib_idx_from_string_map(task->string_map, src->name);\n      dst->tls_off         = tls_off;\n      dst->type_idx        = rdib_idx_from_type(src->type);\n\n      if (src->container_type != 0) {\n        Assert(!src->container_proc);\n        dst->link_flags    |= RDI_LinkFlag_TypeScoped;\n        dst->container_idx  = rdib_idx_from_udt_type(src->container_type);\n      }\n      if (src->container_proc != 0) {\n        Assert(!src->container_type);\n        dst->link_flags    |= RDI_LinkFlag_ProcScoped;\n        dst->container_idx  = rdib_idx_from_procedure(src->container_proc);\n      }\n    }\n\n    str8_list_push(arena, &task->tvars_out[task_id], str8_array(vars, chunk->count));\n  }\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_thread_variables(TP_Context           *tp,\n                                         TP_Arena             *arena,\n                                         RDIB_DataSectionList *sect_list,\n                                         RDIB_StringMap       *string_map,\n                                         U64                   total_count,\n                                         U64                   chunk_count,\n                                         RDIB_VariableChunk   **chunks)\n{\n  ProfBeginDynamic(\"Thread Variables [Chunk Count: %llu, Total Count %llu]\", total_count, chunk_count);\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Build\");\n  RDIB_BuildSymbolSectionTask task = {0};\n  task.string_map                  = string_map;\n  task.ranges                      = tp_divide_work(scratch.arena, chunk_count, tp->worker_count);\n  task.tvars_rdib                  = chunks;\n  task.tvars_out                   = push_array(scratch.arena, String8List, tp->worker_count);\n  tp_for_parallel(tp, arena, tp->worker_count, rdib_build_tvar_section_task, &task);\n  ProfEnd();\n\n  RDIB_DataSection tvars_sect = { .tag = RDI_SectionKind_ThreadVariables };\n  str8_list_concat_in_place_array(&tvars_sect.data, task.tvars_out, tp->worker_count);\n  rdib_data_section_list_push(arena->v[0], sect_list, tvars_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_procs_section_task)\n{\n  RDIB_BuildSymbolSectionTask *task = raw_task;\n  ProfBeginDynamic(\"Procedures Task [Chunk Count: %llu]\", task->ranges[task_id].max - task->ranges[task_id].min);\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ProcedureChunk *chunk = task->procs_rdib[chunk_idx];\n    RDI_Procedure       *procs = push_array_no_zero(arena, RDI_Procedure, chunk->count);\n\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_Procedure *src = &chunk->v[i];\n      RDI_Procedure  *dst = &procs[i];\n\n      dst->name_string_idx      = rdib_idx_from_string_map(task->string_map, src->name);\n      dst->link_name_string_idx = rdib_idx_from_string_map(task->string_map, src->link_name);\n      dst->link_flags           = src->link_flags;\n      dst->type_idx             = rdib_idx_from_type(src->type);\n      dst->root_scope_idx       = rdib_idx_from_scope(src->scope);\n\n      if (src->container_type != 0) {\n        AssertAlways(!src->container_proc);\n        dst->link_flags    |= RDI_LinkFlag_TypeScoped;\n        dst->container_idx  = rdib_idx_from_udt_type(src->container_type);\n      }\n\n      if (src->container_proc != 0) {\n        AssertAlways(!src->container_type);\n        dst->link_flags    |= RDI_LinkFlag_ProcScoped;\n        dst->container_idx  = rdib_idx_from_procedure(0); Assert(!\"TODO\"); // src->container_proc\n      }\n    }\n\n    str8_list_push(arena, &task->procs_out[task_id], str8_array(procs, chunk->count));\n  }\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_procedures(TP_Context           *tp,\n                                   TP_Arena             *arena,\n                                   RDIB_DataSectionList *sect_list,\n                                   RDIB_StringMap       *string_map,\n                                   U64                   total_count,\n                                   U64                   chunk_count,\n                                   RDIB_ProcedureChunk  **chunks)\n{\n  ProfBeginDynamic(\"Procedures [Total Count: %llu, Chunk Count: %llu]\", total_count, chunk_count);\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Build\");\n  RDIB_BuildSymbolSectionTask task = {0};\n  task.string_map                  = string_map;\n  task.ranges                      = tp_divide_work(scratch.arena, chunk_count, tp->worker_count);\n  task.procs_rdib                  = chunks;\n  task.procs_out                   = push_array(scratch.arena, String8List, tp->worker_count);\n  tp_for_parallel(tp, arena, tp->worker_count, rdib_build_procs_section_task, &task);\n  ProfEnd();\n\n  RDIB_DataSection procs_sect = { .tag = RDI_SectionKind_Procedures };\n  str8_list_concat_in_place_array(&procs_sect.data, task.procs_out, tp->worker_count);\n  rdib_data_section_list_push(arena->v[0], sect_list, procs_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_count_scopes_task)\n{\n  ProfBeginFunction();\n  RDIB_BuildSymbolSectionTask *task = raw_task;\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_ScopeChunk *chunk = task->scopes_rdib[chunk_idx];\n    for (U64 scope_i = 0; scope_i < chunk->count; ++scope_i) {\n      RDIB_Scope *scope = &chunk->v[scope_i];\n\n      task->scope_voff_counts[task_id] += scope->ranges.count * 2;\n      task->local_counts[task_id]      += scope->local_count;\n\n      for (RDIB_Variable *var = scope->local_first; var != 0; var = var->next) {\n        for (RDIB_LocationNode *loc_n = var->locations.first; loc_n != 0; loc_n = loc_n->next) {\n          switch (loc_n->v.kind) {\n          case RDI_LocationKind_NULL: break;\n          case RDI_LocationKind_AddrBytecodeStream:\n          case RDI_LocationKind_ValBytecodeStream: {\n            task->loc_data_sizes[task_id] += loc_n->v.bytecode.size + /* stream ender: */ 1;\n          } break;\n          case RDI_LocationKind_ValReg: {\n            task->loc_data_sizes[task_id] += sizeof(RDI_LocationReg);\n          } break;\n          case RDI_LocationKind_AddrRegPlusU16:\n          case RDI_LocationKind_AddrAddrRegPlusU16: {\n            task->loc_data_sizes[task_id] += sizeof(RDI_LocationRegPlusU16);\n          } break;\n          default: InvalidPath;\n          }\n\n          task->loc_block_counts[task_id] += loc_n->v.ranges.count;\n          task->loc_data_sizes[task_id]   += AlignPadPow2(task->loc_data_sizes[task_id], 8);\n        }\n      }\n    }\n  }\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_scopes_task)\n{\n  RDIB_BuildSymbolSectionTask *task = raw_task;\n  ProfBeginDynamic(\"Scopes [Chunk Count: %llu]\", task->ranges[task_id].max - task->ranges[task_id].min);\n\n  // scope voff fill info\n  U64  scope_voff_cursor = task->scope_voff_offsets[task_id];\n  U64  scope_voff_max    = task->scope_voff_offsets[task_id] + task->scope_voff_counts[task_id];\n  U64 *scope_voff_ptr    = task->scope_voffs_rdi;\n \n  // local fill info\n  U64 local_cursor  = task->local_offsets[task_id];\n  U64 local_max     = task->local_offsets[task_id] + task->local_counts[task_id];\n  RDI_Local *locals = task->locals_rdi;\n\n  // location data fill info\n  U64  loc_data_max    = task->loc_data_offsets[task_id] + task->loc_data_sizes[task_id];\n  U64  loc_data_cursor = task->loc_data_offsets[task_id];\n  U8  *loc_data        = task->loc_data_rdi;\n\n  // location block fill info\n  U64                loc_block_cursor = task->loc_block_offsets[task_id];\n  U64                loc_block_max    = task->loc_block_offsets[task_id] + task->loc_block_counts[task_id];\n  RDI_LocationBlock *loc_blocks       = task->loc_blocks_rdi;\n\n  for (U64 ichunk = task->ranges[task_id].min; ichunk < task->ranges[task_id].max; ++ichunk) {\n    RDIB_ScopeChunk *chunk = task->scopes_rdib[ichunk];\n    for (U64 iscope = 0; iscope < chunk->count; ++iscope) {\n      RDIB_Scope *scope_src = &chunk->v[iscope];\n      U64         scope_idx = rdib_idx_from_scope(scope_src);\n      RDI_Scope  *scope_dst = &task->scopes_rdi[scope_idx];\n\n      scope_dst->proc_idx               = rdib_idx_from_procedure(scope_src->container_proc);\n      scope_dst->parent_scope_idx       = rdib_idx_from_scope(scope_src->parent);\n      scope_dst->first_child_scope_idx  = rdib_idx_from_scope(scope_src->first_child);\n      scope_dst->next_sibling_scope_idx = rdib_idx_from_scope(scope_src->next_sibling);\n      scope_dst->voff_range_first       = scope_voff_cursor;\n      scope_dst->voff_range_opl         = scope_voff_cursor + scope_src->ranges.count * 2;\n      scope_dst->local_count            = scope_src->local_count;\n      if (scope_src->local_count > 0) {\n        scope_dst->local_first = local_cursor;\n      } else {\n        scope_dst->local_first = 0;\n      }\n      // TODO: static locals can be exported as local variables\n      //scope_dst->static_local_idx_run_first = ???;\n      //scope_dst->static_local_count         = ???;\n      scope_dst->inline_site_idx = rdib_idx_from_inline_site(scope_src->inline_site);\n\n      // fill out scope voffs\n      for (Rng1U64Node *range_n = scope_src->ranges.first; range_n != 0; range_n = range_n->next) {\n        Assert(scope_voff_cursor + 2 <= scope_voff_max);\n        scope_voff_ptr[scope_voff_cursor + 0] = range_n->v.min;\n        scope_voff_ptr[scope_voff_cursor + 1] = range_n->v.max;\n        scope_voff_cursor += 2;\n      }\n\n      // fill out locals & locations\n      for (RDIB_Variable *local_src = scope_src->local_first; local_src != 0; local_src = local_src->next, ++local_cursor) {\n        U64 loc_block_first = loc_block_cursor;\n\n        for (RDIB_LocationNode *loc_n = local_src->locations.first; loc_n != 0; loc_n = loc_n->next) {\n          RDIB_Location *loc = &loc_n->v;\n\n          // fill out location data\n          U64 location_data_off = loc_data_cursor;\n          switch (loc->kind) {\n          case RDI_LocationKind_NULL: break;\n          case RDI_LocationKind_AddrBytecodeStream:\n          case RDI_LocationKind_ValBytecodeStream: {\n            // write opcodes & operands\n            for (RDIB_EvalBytecodeOp *op_node = loc->bytecode.first; op_node != 0; op_node = op_node->next) {\n              // opcode\n              Assert(loc_data_cursor + sizeof(op_node->op) <= loc_data_max);\n              MemoryCopy(loc_data + loc_data_cursor, &op_node->op, sizeof(op_node->op));\n              loc_data_cursor += sizeof(op_node->op);\n\n              // operand\n              Assert(loc_data_cursor + op_node->p_size <= loc_data_max);\n              MemoryCopy(loc_data + loc_data_cursor, &op_node->p, op_node->p_size);\n              loc_data_cursor += op_node->p_size;\n            }\n\n            // stream ender\n            Assert(loc_data_cursor + 1 <= loc_data_max);\n            loc_data[loc_data_cursor] = 0;\n            loc_data_cursor += 1;\n          } break;\n          case RDI_LocationKind_AddrRegPlusU16:\n          case RDI_LocationKind_AddrAddrRegPlusU16: {\n            Assert(loc_data_cursor + sizeof(RDI_LocationRegPlusU16) <= loc_data_max);\n            RDI_LocationRegPlusU16 *dst = (RDI_LocationRegPlusU16 *) (loc_data + loc_data_cursor);\n            dst->kind                   = loc->kind;\n            dst->reg_code               = loc->reg_code;\n            dst->offset                 = loc->offset;\n\n            loc_data_cursor += sizeof(*dst);\n          } break;\n          case RDI_LocationKind_ValReg: {\n            Assert(loc_data_cursor + sizeof(RDI_LocationReg) <= loc_data_max);\n            RDI_LocationReg *dst  = (RDI_LocationReg *) (loc_data + loc_data_cursor);\n            dst->kind             = loc->kind;\n            dst->reg_code         = loc->reg_code;\n            loc_data_cursor      += sizeof(*dst);\n          } break;\n          default: InvalidPath;\n          }\n\n          // zero out align bytes\n          U64 align_size = AlignPadPow2(loc_data_cursor, 8);\n          Assert(loc_data_cursor + align_size <= loc_data_max);\n          MemorySet(loc_data + loc_data_cursor, 0, align_size);\n          loc_data_cursor += align_size;\n\n          // fill out location block\n          for (Rng1U64Node *range_n = loc->ranges.first; range_n != 0; range_n = range_n->next, ++loc_block_cursor) {\n            Assert(loc_block_cursor < loc_block_max);\n            RDI_LocationBlock *loc_block_dst = &loc_blocks[loc_block_cursor];\n            loc_block_dst->scope_off_first   = range_n->v.min;\n            loc_block_dst->scope_off_opl     = range_n->v.max;\n            loc_block_dst->location_data_off = location_data_off;\n          }\n        }\n\n        Assert(local_cursor <= local_max);\n        RDI_Local *local_dst       = &locals[local_cursor];\n        local_dst->kind            = local_src->kind;\n        local_dst->name_string_idx = rdib_idx_from_string_map(task->string_map, local_src->name);\n        local_dst->type_idx        = rdib_idx_from_type(local_src->type);\n        if (local_src->locations.count > 0) {\n          local_dst->location_first = loc_block_first;\n          local_dst->location_opl   = loc_block_cursor;\n        } else {\n          local_dst->location_first = 0;\n          local_dst->location_opl   = 0;\n        }\n      }\n    }\n  }\n\n  Assert(scope_voff_cursor == scope_voff_max);\n  Assert(local_cursor == local_max);\n  Assert(loc_data_cursor == loc_data_max);\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_scopes(TP_Context            *tp,\n                               TP_Arena              *arena,\n                               RDIB_DataSectionList  *sect_list,\n                               RDIB_StringMap        *string_map,\n                               U64                    total_scope_count,\n                               U64                    chunk_count,\n                               RDIB_ScopeChunk      **scopes)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  RDIB_BuildSymbolSectionTask task = {0};\n  task.string_map                  = string_map;\n  task.ranges                      = tp_divide_work(scratch.arena, chunk_count, tp->worker_count);\n  task.scopes_rdib                 = scopes;\n  \n  ProfBegin(\"Count Locals & Locations\");\n  task.scope_voff_counts = push_array(scratch.arena, U64, tp->worker_count);\n  task.local_counts      = push_array(scratch.arena, U64, tp->worker_count);\n  task.loc_block_counts  = push_array(scratch.arena, U64, tp->worker_count);\n  task.loc_data_sizes    = push_array(scratch.arena, U64, tp->worker_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_count_scopes_task, &task);\n  ProfEnd();\n\n  U64 total_scope_voff_count = sum_array_u64(tp->worker_count, task.scope_voff_counts);\n  U64 total_local_count      = sum_array_u64(tp->worker_count, task.local_counts     );\n  U64 total_loc_block_count  = sum_array_u64(tp->worker_count, task.loc_block_counts );\n  U64 total_loc_data_size    = sum_array_u64(tp->worker_count, task.loc_data_sizes   );\n\n  ProfBegin(\"Fill out scopes, locals, location blocks, and location data\");\n  task.scope_voff_offsets = offsets_from_counts_array_u64(scratch.arena, task.scope_voff_counts, tp->worker_count);\n  task.local_offsets      = offsets_from_counts_array_u64(scratch.arena, task.local_counts,      tp->worker_count);\n  task.loc_block_offsets  = offsets_from_counts_array_u64(scratch.arena, task.loc_block_counts,  tp->worker_count);\n  task.loc_data_offsets   = offsets_from_counts_array_u64(scratch.arena, task.loc_data_sizes,    tp->worker_count);\n\n  ProfBegin(\"Push\");\n  task.scope_voffs_rdi = push_array_no_zero(arena->v[0], U64,               total_scope_voff_count);\n  task.scopes_rdi      = push_array_no_zero(arena->v[0], RDI_Scope,         total_scope_count     );\n  task.locals_rdi      = push_array_no_zero(arena->v[0], RDI_Local,         total_local_count     );\n  task.loc_blocks_rdi  = push_array_no_zero(arena->v[0], RDI_LocationBlock, total_loc_block_count );\n  task.loc_data_rdi    = push_array_no_zero(arena->v[0], U8,                total_loc_data_size   );\n  ProfEnd();\n\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_build_scopes_task, &task);\n  ProfEnd();\n\n  RDIB_DataSection scopes_sect      = { .tag = RDI_SectionKind_Scopes         };\n  RDIB_DataSection scope_voffs_sect = { .tag = RDI_SectionKind_ScopeVOffData  };\n  RDIB_DataSection locals_sect      = { .tag = RDI_SectionKind_Locals         };\n  RDIB_DataSection loc_blocks_sect  = { .tag = RDI_SectionKind_LocationBlocks };\n  RDIB_DataSection loc_data_sect    = { .tag = RDI_SectionKind_LocationData   };\n\n  str8_list_push(arena->v[0], &scopes_sect.data,      str8_array(task.scopes_rdi,      total_scope_count     ));\n  str8_list_push(arena->v[0], &scope_voffs_sect.data, str8_array(task.scope_voffs_rdi, total_scope_voff_count));\n  str8_list_push(arena->v[0], &locals_sect.data,      str8_array(task.locals_rdi,      total_local_count     ));\n  str8_list_push(arena->v[0], &loc_blocks_sect.data,  str8_array(task.loc_blocks_rdi,  total_loc_block_count ));\n  str8_list_push(arena->v[0], &loc_data_sect.data,    str8_array(task.loc_data_rdi,    total_loc_data_size   ));\n\n  rdib_data_section_list_push(arena->v[0], sect_list, scopes_sect     );\n  rdib_data_section_list_push(arena->v[0], sect_list, scope_voffs_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, locals_sect     );\n  rdib_data_section_list_push(arena->v[0], sect_list, loc_blocks_sect );\n  rdib_data_section_list_push(arena->v[0], sect_list, loc_data_sect   );\n  \n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_name_map_task)\n{\n  ProfBeginFunction(\"Build Name Map\");\n  Temp scratch = scratch_begin(&arena, 1);\n\n  RDIB_NameMapBuilderTask *task         = raw_task;\n  RDI_NameMapKind          name_map_idx = (RDI_NameMapKind)task_id;\n\n  U64 out_node_count   = task->in_bucket_counts[name_map_idx];\n  U64 load_factor      = 4;\n  U64 out_bucket_count = CeilIntegerDiv(out_node_count, load_factor);\n\n  ProfBegin(\"Build temp hash map\");\n  struct Node {\n    struct Node          *next;\n    RDIB_StringMapBucket *name;\n  };\n  struct NodeList {\n    struct Node *first;\n    struct Node *last;\n    U64          node_count;\n  };\n  struct NodeList *temp_map   = push_array(scratch.arena,         struct NodeList, out_bucket_count);\n  struct Node     *temp_nodes = push_array_no_zero(scratch.arena, struct Node,     out_node_count);\n  for (U64 i = 0; i < task->in_bucket_counts[name_map_idx]; ++i) {\n    RDIB_StringMapBucket *src_bucket = task->in_buckets[name_map_idx][i];\n\n    U64 hash       = rdi_hash(src_bucket->string.str, src_bucket->string.size);\n    U64 bucket_idx = hash % out_bucket_count;\n\n    struct Node *node = temp_nodes + i;\n    node->next = 0;\n    node->name = src_bucket;\n\n    SLLQueuePush(temp_map[bucket_idx].first, temp_map[bucket_idx].last, node);\n    ++temp_map[bucket_idx].node_count;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Push buckets and nodes\");\n  RDI_NameMapBucket *out_buckets = push_array_no_zero(arena, RDI_NameMapBucket, out_bucket_count);\n  RDI_NameMapNode   *out_nodes   = push_array_no_zero(arena, RDI_NameMapNode,   out_node_count);\n  ProfEnd();\n\n  ProfBegin(\"Fill out buckets\");\n  for (U64 bucket_idx = 0, node_cursor = 0; bucket_idx < out_bucket_count; ++bucket_idx) {\n    struct NodeList   *src_bucket = &temp_map[bucket_idx];\n    RDI_NameMapBucket *dst_bucket = &out_buckets[bucket_idx];\n\n    if (src_bucket->node_count == 0) {\n      dst_bucket->first_node = 0;\n      dst_bucket->node_count = 0;\n      continue;\n    }\n\n    dst_bucket->first_node = safe_cast_u32(node_cursor);\n    dst_bucket->node_count = src_bucket->node_count;\n\n    for (struct Node *n = src_bucket->first; n != 0; n = n->next, ++node_cursor) {\n      RDIB_StringMapBucket *src_name = n->name;\n\n      RDI_NameMapNode *dst_node = &out_nodes[node_cursor];\n      dst_node->string_idx      = rdib_idx_from_string_map(task->string_map, src_name->string);\n      dst_node->match_count     = src_name->count;\n      if (src_name->count > 1) {\n        dst_node->match_idx_or_idx_run_first = task->idx_run_map->buckets[src_name->idx_run_bucket_idx]->index_in_output_array;\n      } else {\n        dst_node->match_idx_or_idx_run_first = src_name->match_idx;\n      }\n    }\n  }\n  ProfEnd();\n\n  // fill out output\n  task->out_buckets[name_map_idx]       = out_buckets;\n  task->out_nodes[name_map_idx]         = out_nodes;\n  task->out_bucket_counts[name_map_idx] = out_bucket_count;\n  task->out_node_counts[name_map_idx]   = out_node_count;\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_name_maps(TP_Context            *tp,\n                                  TP_Arena              *arena,\n                                  RDIB_DataSectionList  *sect_list,\n                                  RDIB_StringMap        *string_map,\n                                  RDIB_IndexRunMap      *idx_run_map,\n                                  RDIB_StringMapBucket **src_name_maps[RDI_NameMapKind_COUNT],\n                                  U64                    src_name_map_counts[RDI_NameMapKind_COUNT])\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Build Name Maps\");\n  RDIB_NameMapBuilderTask task = {0};\n  task.string_map        = string_map;\n  task.idx_run_map       = idx_run_map;\n  task.in_bucket_counts  = src_name_map_counts;\n  task.in_buckets        = src_name_maps;\n  task.out_buckets       = push_array(scratch.arena, RDI_NameMapBucket *, RDI_NameMapKind_COUNT);\n  task.out_nodes         = push_array(scratch.arena, RDI_NameMapNode *,   RDI_NameMapKind_COUNT);\n  task.out_bucket_counts = push_array(scratch.arena, U64,                 RDI_NameMapKind_COUNT);\n  task.out_node_counts   = push_array(scratch.arena, U64,                 RDI_NameMapKind_COUNT);\n  tp_for_parallel(tp, arena, RDI_NameMapKind_COUNT, rdib_build_name_map_task, &task);\n  ProfEnd();\n\n  U64 *bucket_offsets = offsets_from_counts_array_u64(scratch.arena, task.out_bucket_counts, RDI_NameMapKind_COUNT);\n  U64 *node_offsets   = offsets_from_counts_array_u64(scratch.arena, task.out_node_counts,   RDI_NameMapKind_COUNT);\n\n  String8List raw_name_maps = {0}, raw_name_map_buckets = {0}, raw_name_map_nodes = {0}; \n  for (U64 i = 0; i < RDI_NameMapKind_COUNT; ++i) {\n    RDI_NameMap *dst_name_map = push_array(arena->v[0], RDI_NameMap, 1);\n    dst_name_map->bucket_base_idx = bucket_offsets[i];\n    dst_name_map->node_base_idx   = node_offsets[i];\n    dst_name_map->bucket_count    = task.out_bucket_counts[i];\n    dst_name_map->node_count      = task.out_node_counts[i];\n\n    str8_list_push(arena->v[0], &raw_name_maps,        str8_struct(dst_name_map));\n    str8_list_push(arena->v[0], &raw_name_map_buckets, str8_array(task.out_buckets[i], task.out_bucket_counts[i]));\n    str8_list_push(arena->v[0], &raw_name_map_nodes,   str8_array(task.out_nodes[i],   task.out_node_counts[i]));\n  }\n\n  RDIB_DataSection name_maps_sect        = { .tag = RDI_SectionKind_NameMaps,       .data = raw_name_maps        };\n  RDIB_DataSection name_map_buckets_sect = { .tag = RDI_SectionKind_NameMapBuckets, .data = raw_name_map_buckets };\n  RDIB_DataSection name_map_nodes_sect   = { .tag = RDI_SectionKind_NameMapNodes,   .data = raw_name_map_nodes   };\n  rdib_data_section_list_push(arena->v[0], sect_list, name_maps_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, name_map_buckets_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, name_map_nodes_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_src_line_map_task)\n{\n  // Line tables are ordered to perform 'virtual offset -> line number' maps,\n  // and thus we potentially can have multiple virtual offsets map to same line number.\n  // (e.g. in C/C++ if for-loop declaration site is on one line, intial-statment-condition\n  // and expression parts map to same line number). And so to make things easy on debugger\n  // we remove duplicates from source line map and reorient mapping to 'line number -> virtual offset'\n  // this way debugger can quickly compute virtual offsets when placing a breakpoint on a source line.\n\n  Temp                  scratch = scratch_begin(&arena, 1);\n  RDIB_SrcLineMapsTask *task    = raw_task;\n\n  RDIB_SourceFile *src_file     = task->src_file_arr[task_id];\n  U64              src_file_idx = rdib_idx_from_source_file(src_file);\n\n  //ProfBeginDynamic(\"Build Source Line Map [%.*s]\", str8_varg(src_file->file_path));\n  ProfBegin(\"Build Source Line Map\");\n\n  ProfBegin(\"Count lines/virt offsets\");\n  U64 ln_voff_count = 0;\n  for (RDIB_LineTableFragment *frag = src_file->line_table_frags; frag != 0; frag = frag->next_src_file) {\n    ln_voff_count += frag->line_count;\n  }\n  ProfEnd();\n\n  ProfBegin(\"Push ln_voff_arr\");\n  PairU32 *ln_voff_arr = push_array_no_zero(scratch.arena, PairU32, ln_voff_count);\n  ProfEnd();\n\n  ProfBegin(\"Fill out ln_voff_arr\");\n  {\n    U64 cursor = 0;\n    for (RDIB_LineTableFragment *frag = src_file->line_table_frags; frag != 0; frag = frag->next_src_file) {\n      for (U64 line_idx = 0; line_idx < frag->line_count; ++line_idx) {\n        ln_voff_arr[cursor].v0 = frag->line_nums[line_idx];\n        ln_voff_arr[cursor].v1 = frag->voffs[line_idx];\n        ++cursor;\n      }\n    }\n  }\n  ProfEnd();\n\n  // sort on line number\n  ProfBegin(\"Sort\");\n  if (ln_voff_count < 512) {\n    // TODO: Radsort is buggy and inifte loops if we sort pair of u64.\n    // Check-in with Jeff on Monday about bugfix. For now workaround\n    // the bug wiht pair of u32s. There is no virtual offset larger\n    // than 4GiB in line table anyway.\n    radsort(ln_voff_arr, ln_voff_count, pair_u32_is_before_v0);\n  } else {\n    u32_pair_radix_sort(ln_voff_count, ln_voff_arr);\n  }\n  ProfEnd();\n\n  // TODO: leak, precompute unique line number count and push exact array lengths\n  U32 *line_nums   = push_array_no_zero(arena, U32, ln_voff_count);\n  U32 *line_ranges = push_array_no_zero(arena, U32, ln_voff_count + 1);\n  U64 *voffs       = push_array_no_zero(arena, U64, ln_voff_count);\n\n  U64 voff_cursor     = 0;\n  U64 line_num_cursor = 0;\n  if (ln_voff_count > 0) {\n    line_nums[line_num_cursor]   = ln_voff_arr[0].v0;\n    voffs[voff_cursor]           = ln_voff_arr[0].v1;\n    line_ranges[line_num_cursor] = voff_cursor;\n\n    ++voff_cursor;\n    ++line_num_cursor;\n\n    ProfBegin(\"Fill out output array\");\n    for (U64 i = 1; i < ln_voff_count; ++i) {\n      // does this voff belong to next line number?\n      if (ln_voff_arr[i].v0 != line_nums[line_num_cursor-1]) {\n        line_nums[line_num_cursor]   = ln_voff_arr[i].v0;\n        line_ranges[line_num_cursor] = (U32)voff_cursor;\n        ++line_num_cursor;\n      }\n      voffs[voff_cursor++] = ln_voff_arr[i].v1;\n    }\n    ProfEnd();\n\n    // did we fill out voff array correctly?\n    Assert(voff_cursor == ln_voff_count);\n\n    // close last line range\n    line_ranges[line_num_cursor] = voff_cursor;\n  }\n\n  // fill out result\n  task->out_line_counts[src_file_idx] = line_num_cursor;\n  task->out_voff_counts[src_file_idx] = safe_cast_u32(voff_cursor);\n  task->out_line_nums[src_file_idx]   = line_nums;\n  task->out_line_ranges[src_file_idx] = line_ranges;\n  task->out_voffs[src_file_idx]       = voffs;\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_source_line_maps(TP_Context            *tp,\n                                         TP_Arena              *arena,\n                                         RDIB_DataSectionList  *sect_list,\n                                         U64                    total_src_file_count,\n                                         U64                    src_file_chunk_count,\n                                         RDIB_SourceFileChunk **src_file_chunks)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  ProfBegin(\"Prepare Source File Array\");\n  RDIB_SourceFile **src_file_arr = push_array_no_zero(scratch.arena, RDIB_SourceFile *, total_src_file_count);\n  for (U64 chunk_idx = 0, cursor = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) {\n    RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx];  \n    for (U64 i = 0; i < chunk->count; ++i) {\n      src_file_arr[cursor++] = &chunk->v[i];\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Init Task Context\");\n  RDIB_SrcLineMapsTask task = {0};\n  task.src_file_arr    = src_file_arr;\n  task.out_line_counts = push_array_no_zero(scratch.arena, U32,   total_src_file_count);\n  task.out_voff_counts = push_array_no_zero(scratch.arena, U32,   total_src_file_count);\n  task.out_line_nums   = push_array_no_zero(scratch.arena, U32 *, total_src_file_count);\n  task.out_line_ranges = push_array_no_zero(scratch.arena, U32 *, total_src_file_count);\n  task.out_voffs       = push_array_no_zero(scratch.arena, U64 *, total_src_file_count);\n  ProfEnd();\n\n  ProfBegin(\"Build Source Line Maps\");\n  tp_for_parallel(tp, arena, total_src_file_count, rdib_build_src_line_map_task, &task);\n  ProfEnd();\n\n  ProfBegin(\"Fill out Source Line Maps\");\n  RDIB_DataSection src_line_maps_sect   = { .tag = RDI_SectionKind_SourceLineMaps       };\n  RDIB_DataSection src_line_nums_sect   = { .tag = RDI_SectionKind_SourceLineMapNumbers };\n  RDIB_DataSection src_line_ranges_sect = { .tag = RDI_SectionKind_SourceLineMapRanges  };\n  RDIB_DataSection src_line_voffs_sect  = { .tag = RDI_SectionKind_SourceLineMapVOffs   };\n\n  ProfBegin(\"Push\");\n  RDI_SourceLineMap *src_line_maps = push_array_no_zero(arena->v[0], RDI_SourceLineMap, total_src_file_count + 1);\n  ProfEnd();\n\n  U64 src_line_map_cursor = 0;\n  U64 line_num_cursor     = 0;\n  U64 line_range_cursor   = 0;\n  U64 voff_cursor         = 0;\n\n  // zero-out null source line map\n  MemoryZeroStruct(&src_line_maps[src_line_map_cursor]);\n  ++src_line_map_cursor;\n\n  for (U64 chunk_idx = 0; chunk_idx < src_file_chunk_count; ++chunk_idx) {\n    RDIB_SourceFileChunk *chunk = src_file_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_SourceFile *src_file     = chunk->v + i;\n      U64              src_file_idx = rdib_idx_from_source_file(src_file);\n\n      if (task.out_line_counts[src_file_idx] > 0) {\n        src_file->src_line_map_idx = src_line_map_cursor;\n\n        RDI_SourceLineMap *sm = src_line_maps + src_line_map_cursor++;\n        sm->line_count              = task.out_line_counts[src_file_idx];\n        sm->voff_count              = task.out_voff_counts[src_file_idx];\n        sm->line_map_nums_base_idx  = line_num_cursor;\n        sm->line_map_range_base_idx = line_range_cursor;\n        sm->line_map_voff_base_idx  = voff_cursor;\n\n        str8_list_push(arena->v[0], &src_line_nums_sect.data,   str8_array(task.out_line_nums[src_file_idx],   task.out_line_counts[src_file_idx]));\n        str8_list_push(arena->v[0], &src_line_ranges_sect.data, str8_array(task.out_line_ranges[src_file_idx], task.out_line_counts[src_file_idx] + 1));\n        str8_list_push(arena->v[0], &src_line_voffs_sect.data,  str8_array(task.out_voffs[src_file_idx],       task.out_voff_counts[src_file_idx]));\n        \n        line_num_cursor   += task.out_line_counts[src_file_idx];\n        line_range_cursor += task.out_line_counts[src_file_idx] + 1;\n        voff_cursor       += task.out_voff_counts[src_file_idx];\n      } else {\n        src_file->src_line_map_idx = 0;\n      }\n    }\n  }\n  ProfEnd();\n\n  str8_list_push(arena->v[0], &src_line_maps_sect.data, str8_array(src_line_maps, src_line_map_cursor));\n\n  rdib_data_section_list_push(arena->v[0], sect_list, src_line_maps_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, src_line_nums_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, src_line_ranges_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, src_line_voffs_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_build_line_tables_task)\n{\n  ProfBeginFunction();\n  Temp                      scratch = scratch_begin(&arena, 1);\n  RDIB_BuildLineTablesTask *task    = raw_task;\n  Rng1U64                   range   = task->ranges[task_id];\n\n  for (U64 chunk_idx = range.min; chunk_idx < range.max; ++chunk_idx) {\n    RDIB_LineTableChunk *chunk = task->chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_LineTable *line_table     = &chunk->v[i];\n      U64             line_table_idx = chunk->base + i;\n\n      U64 total_line_count = 0;\n      for (RDIB_LineTableFragment *frag = line_table->first; frag != 0; frag = frag->next_line_table) {\n        total_line_count += frag->line_count + /* range terminator */ 1;\n      }\n\n      if (total_line_count > 0) {\n        struct Value {\n          U32 src_file_idx;\n          U32 line_num;\n          U16 col_first;\n          U16 col_opl;\n        };\n        KeyValuePair *pairs       = push_array_no_zero(scratch.arena, KeyValuePair, total_line_count);\n        struct Value *values      = push_array_no_zero(scratch.arena, struct Value, total_line_count);\n        U64           pair_cursor = 0;\n\n        for (RDIB_LineTableFragment *frag = line_table->first; frag != 0; frag = frag->next_line_table) {\n          for (U64 line_idx = 0; line_idx < frag->line_count; ++line_idx, ++pair_cursor) {\n            struct Value *value = &values[pair_cursor];\n            KeyValuePair *pair  = &pairs[pair_cursor];\n\n            value->src_file_idx = rdib_idx_from_source_file(frag->src_file);\n            value->line_num     = frag->line_nums[line_idx];\n            if (frag->col_count > 0) {\n              value->col_first = frag->col_nums[line_idx*2];\n              value->col_opl   = frag->col_nums[line_idx*2 + 1];\n            } else {\n              value->col_first = 0;\n              value->col_opl   = 0;\n            }\n\n            pair->key_u64      = frag->voffs[line_idx];\n            pair->value_raw    = value;\n          }\n\n          // emit terminator\n          {\n            KeyValuePair *pair  = &pairs[pair_cursor];\n            struct Value *value = &values[pair_cursor];\n            pair_cursor += 1;\n\n            value->src_file_idx = 0;\n            value->line_num     = 0;\n            value->col_first    = 0;\n            value->col_opl      = 0;\n\n            pair->key_u64 = frag->voffs[frag->line_count];\n            pair->value_raw = value;\n          }\n        }\n\n        // sort on virtual offset\n        sort_key_value_pairs_as_u64(pairs, pair_cursor);\n\n        // fill out RDI_Line output\n        U64       line_count = pair_cursor + 1;\n        U64      *voffs      = push_array_no_zero(arena, U64,      line_count);\n        RDI_Line *lines      = push_array_no_zero(arena, RDI_Line, line_count);\n\n        U64 line_cursor = 0;\n        for (U64 line_idx = 0; line_idx < pair_cursor; ++line_idx) {\n          // remove terminator if there is a real line number\n          if (line_idx + 1 < pair_cursor && pairs[line_idx].key_u64 == pairs[line_idx+1].key_u64) {\n            continue;\n          }\n          struct Value *value         = pairs[line_idx].value_raw;\n          voffs[line_cursor]          = pairs[line_idx].key_u64;\n          lines[line_cursor].file_idx = value->src_file_idx;\n          lines[line_cursor].line_num = value->line_num;\n          line_cursor += 1;\n        }\n\n        // fill out terminators\n        voffs[line_cursor] = ~0llu;\n        MemoryZeroStruct(&lines[line_cursor]);\n        line_cursor += 1;\n\n        // fill out line table output\n        task->out_line_table_counts[line_table_idx] = line_cursor;\n        task->out_line_table_voffs[line_table_idx]  = voffs;\n        task->out_line_table_lines[line_table_idx]  = lines;\n      } else {\n        task->out_line_table_counts[line_table_idx] = 0;\n        task->out_line_table_voffs[line_table_idx]  = 0;\n        task->out_line_table_lines[line_table_idx]  = 0;\n      }\n    }\n  }\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_line_tables(TP_Context            *tp,\n                                    TP_Arena              *arena,\n                                    RDIB_DataSectionList  *sect_list,\n                                    U64                    total_line_table_count,\n                                    U64                    chunk_count,\n                                    RDIB_LineTableChunk  **chunks)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n\n  ProfBegin(\"Build Line Tables\");\n  RDIB_BuildLineTablesTask task = {0};\n  task.chunks                   = chunks;\n  task.ranges                   = tp_divide_work(scratch.arena, chunk_count, tp->worker_count);\n  task.out_line_table_counts    = push_array_no_zero(scratch.arena, U64,        total_line_table_count);\n  task.out_line_table_voffs     = push_array_no_zero(scratch.arena, U64 *,      total_line_table_count);\n  task.out_line_table_lines     = push_array_no_zero(scratch.arena, RDI_Line *, total_line_table_count);\n  tp_for_parallel(tp, arena, tp->worker_count, rdib_build_line_tables_task, &task);\n  ProfEnd();\n\n  RDIB_DataSection line_tables_sect      = { .tag = RDI_SectionKind_LineTables      };\n  RDIB_DataSection line_table_voffs_sect = { .tag = RDI_SectionKind_LineInfoVOffs   };\n  RDIB_DataSection line_table_lines_sect = { .tag = RDI_SectionKind_LineInfoLines   };\n  RDIB_DataSection line_table_cols_sect  = { .tag = RDI_SectionKind_LineInfoColumns };\n\n  ProfBegin(\"Fill out Line Tables\");\n\n  ProfBegin(\"Push\");\n  RDI_LineTable *line_tables_rdi = push_array_no_zero(arena->v[0], RDI_LineTable, total_line_table_count);\n  ProfEnd();\n\n  U64 line_table_cursor      = 0;\n  U64 line_table_voff_cursor = 0;\n  U64 line_table_line_cursor = 0;\n\n  for (U64 chunk_idx = 0; chunk_idx < chunk_count; ++chunk_idx) {\n    RDIB_LineTableChunk *chunk = chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_LineTable *src     = &chunk->v[i];\n      U64             src_idx = rdib_idx_from_line_table(src);\n      if (task.out_line_table_counts[src_idx] > 0) {\n        RDI_LineTable *dst = &line_tables_rdi[line_table_cursor];\n\n        src->output_array_idx = line_table_cursor;\n\n        dst->voffs_base_idx = line_table_voff_cursor;\n        dst->lines_base_idx = line_table_line_cursor;\n        dst->cols_base_idx  = 0;\n        dst->lines_count    = task.out_line_table_counts[src_idx] - 1;\n        dst->cols_count     = 0;\n\n        str8_list_push(arena->v[0], &line_table_voffs_sect.data, str8_array(task.out_line_table_voffs[src_idx], task.out_line_table_counts[src_idx]));\n        str8_list_push(arena->v[0], &line_table_lines_sect.data, str8_array(task.out_line_table_lines[src_idx], task.out_line_table_counts[src_idx]));\n\n        line_table_voff_cursor += task.out_line_table_counts[src_idx];\n        line_table_line_cursor += task.out_line_table_counts[src_idx];\n\n        line_table_cursor += 1;\n      } else {\n        src->output_array_idx = 0;\n      }\n    }\n  }\n\n  str8_list_push(arena->v[0], &line_tables_sect.data, str8_array(line_tables_rdi, line_table_cursor));\n\n  ProfEnd();\n\n  rdib_data_section_list_push(arena->v[0], sect_list, line_tables_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, line_table_voffs_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, line_table_lines_sect);\n  rdib_data_section_list_push(arena->v[0], sect_list, line_table_cols_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal\nTHREAD_POOL_TASK_FUNC(rdib_fill_src_files_task)\n{\n  RDIB_FillSourceFilesTask *task = raw_task;\n\n  for (U64 chunk_idx = task->ranges[task_id].min; chunk_idx < task->ranges[task_id].max; ++chunk_idx) {\n    RDIB_SourceFileChunk *chunk = task->src_file_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_SourceFile *src          = chunk->v + i;\n      U32              src_file_idx = rdib_idx_from_source_file(src);\n      RDI_SourceFile  *dst          = task->src_files_dst + src_file_idx;\n\n      dst->file_path_node_idx          = rdib_idx_from_path_tree(task->path_tree, src->file_path);\n      dst->normal_full_path_string_idx = rdib_idx_from_string_map(task->string_map, src->normal_full_path);\n      dst->source_line_map_idx         = src->src_line_map_idx;\n    }\n  }\n}\n\ninternal void\nrdib_data_sections_from_source_files(TP_Context            *tp,\n                                     TP_Arena              *arena,\n                                     RDIB_DataSectionList  *sect_list,\n                                     RDIB_StringMap        *string_map,\n                                     RDIB_PathTree         *path_tree,\n                                     U64                    total_src_file_count,\n                                     U64                    src_file_chunk_count,\n                                     RDIB_SourceFileChunk **src_file_chunks)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  RDIB_FillSourceFilesTask task = {0};\n  task.ranges          = tp_divide_work(scratch.arena, src_file_chunk_count, tp->worker_count);\n  task.string_map      = string_map;\n  task.path_tree       = path_tree;\n  task.src_file_chunks = src_file_chunks;\n  task.src_files_dst   = push_array_no_zero(arena->v[0], RDI_SourceFile, total_src_file_count);\n  tp_for_parallel(tp, 0, tp->worker_count, rdib_fill_src_files_task, &task);\n\n  RDIB_DataSection src_files_sect = { .tag = RDI_SectionKind_SourceFiles };\n  str8_list_push(arena->v[0], &src_files_sect.data, str8_array(task.src_files_dst, total_src_file_count));\n  rdib_data_section_list_push(arena->v[0], sect_list, src_files_sect);\n\n  scratch_end(scratch);\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_inline_sites(TP_Context *tp,\n                                     Arena *arena,\n                                     RDIB_DataSectionList *sect_list,\n                                     RDIB_StringMap *string_map,\n                                     U64 total_inline_site_count,\n                                     U64 inline_site_chunk_count,\n                                     RDIB_InlineSiteChunk **inline_site_chunks)\n{\n  ProfBeginFunction();\n\n  RDI_InlineSite *dst_arr = push_array(arena, RDI_InlineSite, total_inline_site_count);\n\n  for (U64 chunk_idx = 0; chunk_idx < inline_site_chunk_count; ++chunk_idx) {\n    RDIB_InlineSiteChunk *chunk = inline_site_chunks[chunk_idx];\n    for (U64 i = 0; i < chunk->count; ++i) {\n      RDIB_InlineSite *src = &chunk->v[i];\n      U64 idx = rdib_idx_from_inline_site(src);\n      RDI_InlineSite *dst = &dst_arr[idx];\n\n      dst->name_string_idx = rdib_idx_from_string_map(string_map, src->name);\n      dst->type_idx        = rdib_idx_from_type(src->type);\n      dst->owner_type_idx  = rdib_idx_from_type(src->owner);\n      dst->line_table_idx  = src->line_table->output_array_idx;\n    }\n  }\n\n  RDIB_DataSection inline_site_sect = { .tag = RDI_SectionKind_InlineSites };\n  str8_list_push(arena, &inline_site_sect.data, str8_array(dst_arr, total_inline_site_count));\n  rdib_data_section_list_push(arena, sect_list, inline_site_sect);\n\n  ProfEnd();\n}\n\ninternal void\nrdib_data_sections_from_checksums(TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list)\n{\n  NotImplemented;\n}\n\n////////////////////////////////\n\ninternal RDIB_Input\nrdib_init_input(Arena *arena)\n{\n  ProfBeginFunction();\n\n  RDIB_Input input         = {0};\n  input.unit_chunk_cap     = 128;\n  input.src_file_chunk_cap = 4096;\n  input.symbol_chunk_cap   = 4096;\n  input.line_table_cap     = 4096;\n  input.inline_site_cap    = 4096;\n  input.type_cap           = 1024;\n  input.udt_cap            = 4096;\n\n  RDIB_SourceFile        *null_src_file    = rdib_source_file_chunk_list_push_zero(arena, &input.src_files,    1);\n  RDIB_LineTable         *null_line_table  = rdib_line_table_chunk_list_push_zero (arena, &input.line_tables,  1);\n  RDIB_LineTableFragment *null_frag        = rdib_line_table_push                 (arena, null_line_table);\n  RDIB_Type              *null_type        = rdib_type_chunk_list_push_zero       (arena, &input.types,        1);\n  RDIB_Scope             *null_scope       = rdib_scope_chunk_list_push_zero      (arena, &input.scopes,       1);\n  RDIB_Unit              *null_unit        = rdib_unit_chunk_list_push_zero       (arena, &input.units,        1);\n  RDIB_Procedure         *null_proc        = rdib_procedure_chunk_list_push_zero  (arena, &input.procs,        1);\n  RDIB_Variable          *null_local       = rdib_variable_chunk_list_push_zero   (arena, &input.locals,       1);\n  RDIB_Variable          *null_gvar        = rdib_variable_chunk_list_push_zero   (arena, &input.gvars,        1);\n  RDIB_Variable          *null_tvar        = rdib_variable_chunk_list_push_zero   (arena, &input.tvars,        1);\n  RDIB_UDTMember         *null_udt_member  = rdib_udt_member_chunk_list_push_zero (arena, &input.udt_members,  1);\n  RDIB_UDTMember         *null_enum_member = rdib_udt_member_chunk_list_push_zero (arena, &input.enum_members, 1);\n  RDIB_InlineSite        *null_inline_site = rdib_inline_site_chunk_list_push_zero(arena, &input.inline_sites, 1);\n  {\n    // Line Table Fragment\n    null_frag->src_file = null_src_file;\n    null_frag->voffs    = push_array(arena, U64, 1);\n\n    // Source File\n    null_src_file->line_table_frags = null_frag;\n\n    // Unit\n    null_unit->arch             = RDI_Arch_NULL;\n    null_unit->unit_name        = str8_zero();\n    null_unit->compiler_name    = str8_zero();\n    null_unit->source_file      = str8_zero();\n    null_unit->object_file      = str8_zero();\n    null_unit->archive_file     = str8_zero();\n    null_unit->build_path       = str8_zero();\n    null_unit->virt_range_count = 1;\n    null_unit->virt_ranges      = push_array(arena, Rng1U64, 1);\n    null_unit->virt_ranges[0]   = rng_1u64(0,0);\n    null_unit->line_table       = null_line_table;\n\n    // Scope\n    rng1u64_list_push(arena, &null_scope->ranges, rng_1u64(0,max_U32));\n\n    // Location\n    RDIB_Location null_loc = {0};\n    rng1u64_list_push(arena, &null_loc.ranges, rng_1u64(0,0));\n    RDIB_LocationList null_loc_list = {0};\n    rdib_location_list_push(arena, &null_loc_list, null_loc);\n\n    // Proc\n    null_proc->type  = null_type;\n    null_proc->scope = null_scope;\n\n    // Global Var\n    null_gvar->link_flags = RDI_LinkFlag_External;\n    null_gvar->type       = null_type;\n    null_gvar->locations  = null_loc_list;\n\n    // Thread Var\n    null_tvar->link_flags = RDI_LinkFlag_External;\n    null_tvar->type       = null_type;\n    null_tvar->locations  = null_loc_list;\n\n    // Local Var\n    null_local->type      = null_type;\n    null_local->locations = null_loc_list;\n\n    // Inline Site\n    null_inline_site->type       = null_type;\n    null_inline_site->owner      = 0;\n    null_inline_site->line_table = null_line_table;\n  }\n\n  input.null_src_file    = null_src_file;\n  input.null_line_table  = null_line_table;\n  input.null_frag        = null_frag;\n  input.null_type        = null_type;\n  input.null_scope       = null_scope;\n  input.null_unit        = null_unit;\n  input.null_proc        = null_proc;\n  input.null_local       = null_local;\n  input.null_gvar        = null_gvar;\n  input.null_tvar        = null_tvar;\n  input.null_udt_member  = null_udt_member;\n  input.null_enum_member = null_enum_member;\n  input.null_inline_site = null_inline_site;\n\n  input.variadic_type       = rdib_type_chunk_list_push(arena, &input.types, 1);\n  input.variadic_type->kind = RDI_TypeKind_Variadic;\n\n  ProfEnd();\n  return input;\n}\n\ninternal String8List\nrdib_finish(TP_Context *tp, TP_Arena *arena, RDIB_Input *input)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(arena->v, arena->count);\n\n  RDIB_UnitChunkList       all_units             = {0};\n  RDIB_SourceFileChunkList all_src_files         = {0};\n  RDIB_LineTableChunkList  all_line_tables       = {0};\n  RDIB_VariableChunkList   all_locals            = {0};\n  RDIB_VariableChunkList   all_tvars             = {0};\n  RDIB_VariableChunkList   all_gvars             = {0};\n  RDIB_ProcedureChunkList  all_procs             = {0};\n  RDIB_ScopeChunkList      all_scopes            = {0};\n  RDIB_InlineSiteChunkList all_inline_sites      = {0};\n  RDIB_TypeChunkList       all_types             = {0};\n  RDIB_TypeChunkList       all_param_types       = {0};\n  RDIB_TypeChunkList       all_udt_member_types  = {0};\n  RDIB_TypeChunkList       all_enum_member_types = {0};\n  RDIB_UDTMemberChunkList  all_udt_members       = {0};\n  RDIB_UDTMemberChunkList  all_enum_members      = {0};\n\n  //U64 type_chunk_count        = types.count;\n  //U64 struct_chunk_count      = struct_list.count;\n  //U64 union_chunk_count       = union_list.count;\n  //U64 enum_chunk_count        = enum_list.count;\n  //U64 total_struct_count      = rdib_type_chunk_list_total_count(struct_list);\n  //U64 total_union_count       = rdib_type_chunk_list_total_count(union_list);\n  //U64 total_enum_count        = rdib_type_chunk_list_total_count(enum_list);\n  //U64 extern_gvar_chunk_count = extern_gvars.count;\n  //U64 extern_tvar_chunk_count = extern_tvars.count;\n  //U64 extern_proc_chunk_count = extern_procs.count;\n  //U64 static_gvar_chunk_count = static_gvars.count;\n  //U64 static_tvar_chunk_count = static_tvars.count;\n  //U64 static_proc_chunk_count = static_procs.count;\n  //U64 total_extern_gvar_count = rdib_variable_chunk_list_total_count (extern_gvars);\n  //U64 total_extern_tvar_count = rdib_variable_chunk_list_total_count (extern_tvars);\n  //U64 total_extern_proc_count = rdib_procedure_chunk_list_total_count(extern_procs);\n\n  ProfBegin(\"Concat Chunk Lists\");\n  rdib_unit_chunk_list_concat_in_place       (&all_units,             &input->units            );\n  rdib_source_file_chunk_list_concat_in_place(&all_src_files,         &input->src_files        );\n  rdib_line_table_chunk_list_concat_in_place (&all_line_tables,       &input->line_tables      );\n  rdib_scope_chunk_list_concat_in_place      (&all_scopes,            &input->scopes           );\n  rdib_variable_chunk_list_concat_in_place   (&all_locals,            &input->locals           );\n  rdib_variable_chunk_list_concat_in_place   (&all_tvars,             &input->tvars            );\n  rdib_variable_chunk_list_concat_in_place   (&all_tvars,             &input->extern_tvars     );\n  rdib_variable_chunk_list_concat_in_place   (&all_tvars,             &input->static_tvars     );\n  rdib_variable_chunk_list_concat_in_place   (&all_gvars,             &input->gvars            );\n  rdib_variable_chunk_list_concat_in_place   (&all_gvars,             &input->extern_gvars     );\n  rdib_variable_chunk_list_concat_in_place   (&all_gvars,             &input->static_gvars     );\n  rdib_procedure_chunk_list_concat_in_place  (&all_procs,             &input->procs            );\n  rdib_procedure_chunk_list_concat_in_place  (&all_procs,             &input->extern_procs     );\n  rdib_procedure_chunk_list_concat_in_place  (&all_procs,             &input->static_procs     );\n  rdib_inline_site_chunk_list_concat_in_place(&all_inline_sites,      &input->inline_sites     );\n  rdib_type_chunk_list_concat_in_place       (&all_types,             &input->types            );\n  rdib_type_chunk_list_concat_in_place       (&all_types,             &input->struct_list      );\n  rdib_type_chunk_list_concat_in_place       (&all_types,             &input->union_list       );\n  rdib_type_chunk_list_concat_in_place       (&all_types,             &input->enum_list        );\n  rdib_type_chunk_list_concat_in_place       (&all_param_types,       &input->param_types      );\n  rdib_type_chunk_list_concat_in_place       (&all_udt_member_types,  &input->member_types     );\n  rdib_type_chunk_list_concat_in_place       (&all_enum_member_types, &input->enum_types       );\n  rdib_udt_member_chunk_list_concat_in_place (&all_udt_members,       &input->udt_members      );\n  rdib_udt_member_chunk_list_concat_in_place (&all_enum_members,      &input->enum_members     );\n  ProfEnd();\n\n  ProfBegin(\"Chunk Lists -> Chunk Arrays\");\n  RDIB_UnitChunk       **all_unit_chunks             = rdib_array_from_unit_chunk_list       (scratch.arena, all_units            );\n  RDIB_SourceFileChunk **all_src_file_chunks         = rdib_array_from_source_file_chunk_list(scratch.arena, all_src_files        );\n  RDIB_LineTableChunk  **all_line_table_chunks       = rdib_array_from_line_table_chunk_list (scratch.arena, all_line_tables      );\n  RDIB_ScopeChunk      **all_scope_chunks            = rdib_array_from_scope_chunk_list      (scratch.arena, all_scopes           );\n  RDIB_VariableChunk   **all_local_chunks            = rdib_array_from_variable_chunk_list   (scratch.arena, all_locals           );\n  RDIB_VariableChunk   **all_gvar_chunks             = rdib_array_from_variable_chunk_list   (scratch.arena, all_gvars            );\n  RDIB_VariableChunk   **all_tvar_chunks             = rdib_array_from_variable_chunk_list   (scratch.arena, all_tvars            );\n  RDIB_ProcedureChunk  **all_proc_chunks             = rdib_array_from_procedure_chunk_list  (scratch.arena, all_procs            );\n  RDIB_InlineSiteChunk **all_inline_site_chunks      = rdib_array_from_inline_site_chunk_list(scratch.arena, all_inline_sites     );\n  RDIB_TypeChunk       **all_type_chunks             = rdib_array_from_type_chunk_list       (scratch.arena, all_types            );\n  //RDIB_TypeChunk       **all_param_type_chunks       = rdib_array_from_type_chunk_list       (scratch.arena, all_param_types      );\n  RDIB_TypeChunk       **all_udt_member_type_chunks  = rdib_array_from_type_chunk_list       (scratch.arena, all_udt_member_types );\n  RDIB_TypeChunk       **all_enum_member_type_chunks = rdib_array_from_type_chunk_list       (scratch.arena, all_enum_member_types);\n  RDIB_UDTMemberChunk  **all_udt_member_chunks       = rdib_array_from_udt_member_chunk_list (scratch.arena, all_udt_members      );\n  RDIB_UDTMemberChunk  **all_enum_member_chunks      = rdib_array_from_udt_member_chunk_list (scratch.arena, all_enum_members     );\n  ProfEnd();\n\n  ProfBegin(\"Count Symbols, Types, and etc.\");\n  U64 total_unit_count             = rdib_unit_chunk_list_total_count       (all_units            );\n  U64 total_src_file_count         = rdib_source_file_chunk_list_total_count(all_src_files        );\n  U64 total_line_table_count       = rdib_line_table_chunk_list_total_count (all_line_tables      );\n  U64 total_scope_count            = rdib_scope_chunk_list_total_count      (all_scopes           );\n  U64 total_local_count            = rdib_variable_chunk_list_total_count   (all_locals           );\n  U64 total_inline_site_count      = rdib_inline_site_chunk_list_total_count(all_inline_sites     );\n  U64 total_udt_member_count       = rdib_udt_member_chunk_list_total_count (all_udt_members      );\n  U64 total_enum_member_count      = rdib_udt_member_chunk_list_total_count (all_enum_members     );\n  U64 total_type_count             = rdib_type_chunk_list_total_count       (all_types            );\n  U64 total_param_type_count       = rdib_type_chunk_list_total_count       (all_param_types      );\n  //U64 total_udt_member_type_count  = rdib_type_chunk_list_total_count       (all_udt_member_types );\n  //U64 total_enum_member_type_count = rdib_type_chunk_list_total_count       (all_enum_member_types); \n  U64 total_tvar_count             = rdib_variable_chunk_list_total_count   (all_tvars            );\n  U64 total_gvar_count             = rdib_variable_chunk_list_total_count   (all_gvars            );\n  U64 total_proc_count             = rdib_procedure_chunk_list_total_count  (all_procs            );\n  ProfEnd();\n\n  // +1 to skip nulls\n  //RDIB_VariableChunk  **extern_gvar_chunks = all_gvar_chunks + 1;\n  //RDIB_VariableChunk  **extern_tvar_chunks = all_tvar_chunks + 1;\n  //RDIB_ProcedureChunk **extern_proc_chunks = all_proc_chunks + 1;\n  //RDIB_VariableChunk  **static_gvar_chunks = extern_gvar_chunks + extern_gvar_chunk_count;\n  //RDIB_VariableChunk  **static_tvar_chunks = extern_tvar_chunks + extern_tvar_chunk_count;\n  //RDIB_ProcedureChunk **static_proc_chunks = extern_proc_chunks + extern_proc_chunk_count;\n  //RDIB_TypeChunk      **type_chunks        = all_type_chunks + 1;\n  //RDIB_TypeChunk      **struct_chunks      = type_chunks + type_chunk_count;\n  //RDIB_TypeChunk      **union_chunks       = struct_chunks + struct_chunk_count;\n  //RDIB_TypeChunk      **enum_chunks        = union_chunks + union_chunk_count;\n  //RDIB_TypeChunk      **udt_chunks         = struct_chunks;\n  //U64                  udt_chunk_count     = struct_chunk_count + union_chunk_count + enum_chunk_count;\n\n  ProfBegin(\"Assign Type Indices\");\n  U64 total_type_node_count = 1;\n  {\n    struct TypeNode {\n      struct TypeNode *next;\n      RDIB_Type       *type;\n    };\n    struct TypeNode *stack      = 0;\n    struct TypeNode *free_nodes = 0;\n#define push_node(t) do {                                           \\\nif (((RDIB_Type*)(t))->kind == RDI_TypeKindExt_VirtualTable) break; \\\n  struct TypeNode *n;                                               \\\n  if (free_nodes == 0) {                                            \\\n    n = push_array(scratch.arena, struct TypeNode, 1);              \\\n  } else {                                                          \\\n    n = free_nodes;                                                 \\\n    SLLStackPop(free_nodes);                                        \\\n  }                                                                 \\\n  Assert(t);                                                        \\\n  n->type = t;                                                      \\\n  SLLStackPush(stack, n);                                           \\\n} while (0)\n\n    for (U64 chunk_idx = 0; chunk_idx < all_types.count; ++chunk_idx) {\n      RDIB_TypeChunk *chunk = all_type_chunks[chunk_idx];\n      for (U64 i = 0; i < chunk->count; ++i) {\n        push_node(&chunk->v[i]);\n\n        for (struct TypeNode *cursor = stack; cursor != 0; cursor = cursor->next) {\n          if (cursor->type->kind == RDI_TypeKind_NULL){\n            // no type refs\n          } else if (cursor->type->kind == RDI_TypeKind_Variadic) {\n            // no type refs\n          } else if (cursor->type->kind == RDI_TypeKind_Union) {\n            // no type refs\n          } else if (RDI_IsBuiltinType(cursor->type->kind)) {\n            // no type refs\n          } else if (cursor->type->kind == RDI_TypeKind_IncompleteStruct) {\n            // no type refs\n          } else if (cursor->type->kind == RDI_TypeKind_IncompleteUnion) {\n            // no type refs\n          } else if (cursor->type->kind == RDI_TypeKind_IncompleteClass) {\n            // no type refs\n          } else if (cursor->type->kind == RDI_TypeKind_IncompleteEnum) {\n            push_node(cursor->type->udt.enum_type.base_type);\n          } else if (cursor->type->kind == RDI_TypeKind_Modifier) {\n            push_node(cursor->type->modifier.type_ref);\n          } else if (RDI_IsPtrType(cursor->type->kind)) {\n            push_node(cursor->type->ptr.type_ref);\n          } else if (cursor->type->kind == RDI_TypeKind_Function) {\n            push_node(cursor->type->func.return_type);\n            push_node(cursor->type->func.params_type);\n            RDIB_Type *params = cursor->type->func.params_type;\n            for (U64 i = 0; i < params->params.count; ++i) {\n              push_node(params->params.types[i]);\n            }\n          } else if (cursor->type->kind == RDI_TypeKind_Method) {\n            push_node(cursor->type->method.class_type);\n            push_node(cursor->type->method.this_type);\n            push_node(cursor->type->method.return_type);\n            RDIB_Type *params = cursor->type->method.params_type;\n            for (U64 i = 0; i < params->params.count; ++i) {\n              push_node(params->params.types[i]);\n            }\n          } else if (cursor->type->kind == RDI_TypeKindExt_StaticMethod) {\n            push_node(cursor->type->static_method.class_type);\n            push_node(cursor->type->static_method.return_type);\n            RDIB_Type *params = cursor->type->static_method.params_type;\n            for (U64 i = 0; i < params->params.count; ++i) {\n              push_node(params->params.types[i]);\n            }\n          } else if (cursor->type->kind == RDI_TypeKind_Bitfield) {\n            push_node(cursor->type->bitfield.value_type);\n          } else if (cursor->type->kind == RDI_TypeKind_Array) {\n            push_node(cursor->type->array.entry_type);\n          } else if (cursor->type->kind == RDI_TypeKind_Struct || cursor->type->kind == RDI_TypeKind_Class) {\n            if (cursor->type->udt.struct_type.derived != 0) {\n              push_node(cursor->type->udt.struct_type.derived);\n            }\n            //push_node(cursor->type->udt.struct_type.vtshape);\n          } else if (cursor->type->kind == RDI_TypeKind_Enum) {\n            push_node(cursor->type->udt.enum_type.base_type);\n          } else if (cursor->type->kind > RDI_TypeKindExt_Lo) {\n            InvalidPath;\n          } else {\n            InvalidPath;\n          }\n        }\n\n        for (struct TypeNode *cursor = stack; cursor != 0; cursor = cursor->next) {\n          // was this type visisted?\n          if (cursor->type != input->null_type && cursor->type->final_idx == 0) {\n            cursor->type->final_idx = total_type_node_count;\n            ++total_type_node_count;\n          }\n        }\n\n        free_nodes = stack;\n        stack      = 0;\n      }\n    }\n#undef push_node\n  }\n  ProfEnd();\n\n  ProfBegin(\"Type Stats\");\n  RDIB_TypeStats type_stats = {0};\n  {\n    type_stats.udt_counts = push_array(scratch.arena, U64, all_types.count);\n    RDIB_TypeStatsTask task = { .chunks = all_type_chunks, .type_stats = &type_stats };\n    tp_for_parallel(tp, 0, all_types.count, rdib_type_stats_task, &task);\n  }\n  ProfEnd();\n\n  RDIB_PathTree *path_tree = rdib_build_path_tree(arena->v[0],\n                                                  tp->worker_count,\n                                                  input->null_src_file,\n                                                  all_units.count,\n                                                  all_unit_chunks,\n                                                  all_src_files.count,\n                                                  all_src_file_chunks);\n\n  // loop over structs and build a map with every possible string\n  ProfBegin(\"String Map\");\n  RDIB_StringMap *string_map;\n  {\n    U64 top_level_string_count   = 2;\n    U64 sect_string_count        = 1;\n    U64 src_file_string_count    = 1;\n    U64 unit_string_count        = 6;\n    U64 variable_string_count    = 2;\n    U64 procedure_string_count   = 2;\n    U64 scope_string_count       = 0;\n    U64 inline_site_string_count = 0;\n    U64 member_string_count      = 2;\n    U64 type_string_count        = 3;\n    U64 path_tree_node_count     = 1;\n\n    U64 total_string_count = 1 /* :string_map_null */                           +\n                             1                       * top_level_string_count   +\n                             input->sect_count       * sect_string_count        +\n                             total_src_file_count    * src_file_string_count    +\n                             total_unit_count        * unit_string_count        +\n                             total_local_count       * variable_string_count    + \n                             total_gvar_count        * variable_string_count    + \n                             total_tvar_count        * variable_string_count    +\n                             total_proc_count        * procedure_string_count   +\n                             total_inline_site_count * inline_site_string_count +\n                             total_udt_member_count  * member_string_count      +\n                             total_enum_member_count * member_string_count      +\n                             total_type_count        * type_string_count        +\n                             path_tree->node_count   * path_tree_node_count     +\n                             total_scope_count       * scope_string_count;\n\n    string_map = rdib_init_string_map(arena->v[0], total_string_count);\n\n    RDIB_CollectStringsTask task = {0};\n    task.string_map             = string_map;\n    task.string_map_update_func = rdib_string_map_update_null;\n    task.free_buckets           = push_array(scratch.arena, RDIB_StringMapBucket *, tp->worker_count);\n    task.element_indices        = push_array(scratch.arena, U64,                    tp->worker_count);\n\n    // :string_map_null\n    rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, str8_lit(\"\"));\n\n    // top level info\n    rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, input->top_level_info.exe_name);\n    rdib_string_map_insert_string_table_item(arena->v[0], &task, 0, input->top_level_info.producer_string);\n\n    ProfBegin(\"Sections\");\n    task.ranges = tp_divide_work(scratch.arena, input->sect_count, tp->worker_count);\n    task.sects  = input->sections;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_sects_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Units\");\n    task.ranges = tp_divide_work(scratch.arena, all_units.count, tp->worker_count);\n    task.units  = all_unit_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_units_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Source Files\");\n    task.ranges          = tp_divide_work(scratch.arena, all_src_files.count, tp->worker_count);\n    task.src_file_chunks = all_src_file_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_source_files_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Locals\");\n    task.ranges = tp_divide_work(scratch.arena, all_locals.count, tp->worker_count);\n    task.vars   = all_local_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Global Variables\");\n    task.ranges = tp_divide_work(scratch.arena, all_gvars.count, tp->worker_count);\n    task.vars   = all_gvar_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Thread Variables\");\n    task.ranges = tp_divide_work(scratch.arena, all_tvars.count, tp->worker_count);\n    task.vars   = all_tvar_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_vars_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Procedures\");\n    task.ranges = tp_divide_work(scratch.arena, all_procs.count, tp->worker_count);\n    task.procs  = all_proc_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_procs_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Inline Sites\");\n    task.ranges       = tp_divide_work(scratch.arena, all_inline_sites.count, tp->worker_count);\n    task.inline_sites = all_inline_site_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_inline_sites_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"UDT Members\");\n    task.ranges      = tp_divide_work(scratch.arena, all_udt_members.count, tp->worker_count);\n    task.udt_members = all_udt_member_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_udt_members_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Enum Members\");\n    task.ranges      = tp_divide_work(scratch.arena, all_enum_members.count, tp->worker_count);\n    task.udt_members = all_enum_member_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_enum_members_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Types\");\n    task.ranges     = tp_divide_work(scratch.arena, all_types.count, tp->worker_count);\n    task.types      = all_type_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_types_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Path Tree\");\n    task.ranges          = tp_divide_work(scratch.arena, path_tree->list_count, tp->worker_count);\n    task.path_node_lists = path_tree->node_lists;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_collect_strings_path_nodes_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBegin(\"Name Maps\");\n  RDIB_StringMap *name_maps[RDI_NameMapKind_COUNT] = {0};\n  {\n    name_maps[RDI_NameMapKind_NULL              ] = rdib_init_string_map(scratch.arena, 1                   );\n    name_maps[RDI_NameMapKind_GlobalVariables   ] = rdib_init_string_map(scratch.arena, total_gvar_count    );\n    name_maps[RDI_NameMapKind_ThreadVariables   ] = rdib_init_string_map(scratch.arena, total_tvar_count    );\n    name_maps[RDI_NameMapKind_Procedures        ] = rdib_init_string_map(scratch.arena, total_proc_count    );\n    name_maps[RDI_NameMapKind_Types             ] = rdib_init_string_map(scratch.arena, total_type_count    );\n    name_maps[RDI_NameMapKind_LinkNameProcedures] = rdib_init_string_map(scratch.arena, total_proc_count    );\n    name_maps[RDI_NameMapKind_NormalSourcePaths ] = rdib_init_string_map(scratch.arena, total_src_file_count);\n\n    RDIB_CollectStringsTask task = {0};\n    task.string_map             = 0;\n    task.string_map_update_func = rdib_string_map_update_concat_void_list_atomic;\n    task.free_buckets           = push_array(scratch.arena, RDIB_StringMapBucket *, tp->worker_count);\n    task.element_indices        = push_array(scratch.arena, U64,                    tp->worker_count);\n\n    ProfBegin(\"Global Variables\");\n    task.string_map = name_maps[RDI_NameMapKind_GlobalVariables];\n    task.ranges     = tp_divide_work(scratch.arena, all_gvars.count, tp->worker_count);\n    task.vars       = all_gvar_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_var_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Thread Variables\");\n    task.string_map = name_maps[RDI_NameMapKind_ThreadVariables];\n    task.ranges     = tp_divide_work(scratch.arena, all_tvars.count, tp->worker_count);\n    task.vars       = all_tvar_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_var_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Procedure Names\");\n    task.string_map = name_maps[RDI_NameMapKind_Procedures];\n    task.ranges     = tp_divide_work(scratch.arena, all_procs.count, tp->worker_count);\n    task.procs      = all_proc_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_procedure_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Types\");\n    task.string_map = name_maps[RDI_NameMapKind_Types];\n    task.ranges     = tp_divide_work(scratch.arena, all_types.count, tp->worker_count);\n    task.types      = all_type_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_types_task, &task);\n    ProfEnd();\n\n    ProfBegin(\"Normal Source Paths\");\n    task.string_map      = name_maps[RDI_NameMapKind_NormalSourcePaths];\n    task.ranges          = tp_divide_work(scratch.arena, all_src_files.count, tp->worker_count);\n    task.src_file_chunks = all_src_file_chunks;\n    tp_for_parallel(tp, arena, tp->worker_count, rdib_name_map_normal_paths_task, &task);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBeginDynamic(\"Extract String Table Buckets [Cap: %llu]\", string_map->cap);\n  U64                    string_map_bucket_count;\n  RDIB_StringMapBucket **string_map_buckets = rdib_extant_buckets_from_string_map(tp, scratch.arena, string_map, &string_map_bucket_count);\n  rdib_string_map_sort_buckets(tp, string_map_buckets, string_map_bucket_count, tp->worker_count);\n  rdib_string_map_assign_indices(string_map_buckets, string_map_bucket_count);\n  ProfEnd();\n\n  ProfBegin(\"Extract Name Maps Buckets\");\n  RDIB_StringMapBucket **name_map_buckets[RDI_NameMapKind_COUNT];\n  U64                    name_map_bucket_counts[RDI_NameMapKind_COUNT];\n  for (U64 i = 0; i < ArrayCount(name_map_buckets); ++i) {\n    ProfBeginDynamic(\"Name Map: %.*s\", str8_varg(rdi_string_from_name_map_kind(i)));\n    name_map_buckets[i] = rdib_extant_buckets_from_string_map(tp, scratch.arena, name_maps[i], &name_map_bucket_counts[i]);\n    rdib_string_map_sort_buckets(tp, name_map_buckets[i], name_map_bucket_counts[i], tp->worker_count);\n    rdib_string_map_assign_indices(name_map_buckets[i], name_map_bucket_counts[i]);\n    ProfEnd();\n  }\n  ProfEnd();\n\n  ProfBegin(\"Index Run Map\");\n  RDIB_IndexRunMap     *idx_run_map;\n  RDIB_IndexRunBucket **idx_run_buckets;\n  U64                   idx_run_bucket_count;\n  {\n    // TODO: we over-allocate for name map index runs since not every bucket has > 1 value\n    U64 total_name_map_value_count = 0;\n    for (U64 i = 0; i < ArrayCount(name_map_bucket_counts); ++i) {\n      total_name_map_value_count += name_map_bucket_counts[i];\n    }\n\n    // rough bucket estimate\n    U64 idx_run_cap = (total_param_type_count + total_name_map_value_count) * 2;\n    idx_run_map     = rdib_init_index_run_map(arena->v[0], idx_run_cap);\n\n    // setup task context\n    RDIB_BuildIndexRunsTask task = {0};\n    task.idx_run_map    = idx_run_map;\n    task.free_buckets   = push_array(scratch.arena, RDIB_IndexRunBucket *, tp->worker_count);\n\n    ProfBegin(\"Type Params Pass\");\n    task.type_chunks = all_type_chunks;\n    tp_for_parallel(tp, arena, all_types.count, rdib_build_idx_runs_params_task, &task);\n    task.sorter_idx += 1;\n    ProfEnd();\n\n    ProfBegin(\"Name Maps Pass - Build Index Runs\");\n    for (U64 name_map_kind = 0; name_map_kind < ArrayCount(name_maps); ++name_map_kind) {\n      ProfBeginDynamic(\"Name Map: %.*s\", str8_varg(rdi_string_from_name_map_kind(name_map_kind)));\n      task.name_map_kind     = name_map_kind;\n      task.ranges            = tp_divide_work(scratch.arena, name_map_bucket_counts[name_map_kind], tp->worker_count);\n      task.name_map_buckets  = name_map_buckets[name_map_kind];\n      tp_for_parallel(tp, arena, tp->worker_count, rdib_build_idx_runs_name_map_buckets_task, &task);\n      task.sorter_idx       += 1;\n      ProfEnd();\n    }\n    ProfEnd();\n\n    idx_run_buckets = rdib_extant_buckets_from_index_run_map(tp, arena->v[0], idx_run_map, &idx_run_bucket_count);\n    rdib_index_run_map_sort_buckets(tp, idx_run_buckets, idx_run_bucket_count, task.sorter_idx);\n    rdib_index_run_map_assign_indices(idx_run_buckets, idx_run_bucket_count);\n  }\n  ProfEnd();\n\n  ProfBegin(\"Serialize Data Sections\");\n  RDIB_DataSectionList sections = {0};\n  rdib_data_sections_from_top_level_info(arena->v[0], &sections, string_map, &input->top_level_info);\n  rdib_data_sections_from_binary_sections(arena->v[0], &sections, string_map, input->sections, input->sect_count);\n  rdib_data_sections_from_path_tree(tp, arena->v[0], &sections, string_map, path_tree);\n  rdib_data_sections_from_string_map(tp, arena->v[0], &sections, string_map_buckets, string_map_bucket_count);\n  rdib_data_sections_from_index_runs(tp, arena->v[0], &sections, idx_run_buckets, idx_run_bucket_count);\n  rdib_data_sections_from_name_maps(tp, arena, &sections, string_map, idx_run_map, name_map_buckets, name_map_bucket_counts);\n  rdib_data_sections_from_types(tp, arena->v[0], &sections, input->top_level_info.arch, string_map, idx_run_map, all_udt_member_types.count, all_udt_member_type_chunks, all_enum_member_types.count, all_enum_member_type_chunks, total_type_node_count, all_types.count, all_type_chunks, type_stats);\n  rdib_data_sections_from_line_tables(tp, arena, &sections, total_line_table_count, all_line_tables.count, all_line_table_chunks);\n  rdib_data_sections_from_source_line_maps(tp, arena, &sections, total_src_file_count, all_src_files.count, all_src_file_chunks);\n  rdib_data_sections_from_source_files(tp, arena, &sections, string_map, path_tree, total_src_file_count, all_src_files.count, all_src_file_chunks);\n  rdib_data_sections_from_units(arena->v[0], &sections, string_map, path_tree, total_unit_count, all_units.count, all_unit_chunks);\n  rdib_data_sections_from_global_variables(tp, arena, &sections, string_map, total_gvar_count, all_gvars.count, all_gvar_chunks);\n  rdib_data_sections_from_thread_variables(tp, arena, &sections, string_map, total_tvar_count, all_tvars.count, all_tvar_chunks);\n  rdib_data_sections_from_procedures(tp, arena, &sections, string_map, total_proc_count, all_procs.count, all_proc_chunks);\n  rdib_data_sections_from_scopes(tp, arena, &sections, string_map, total_scope_count, all_scopes.count, all_scope_chunks);\n  rdib_data_sections_from_unit_gvar_scope_vmaps(tp, arena, &sections, all_units.count, all_unit_chunks, all_gvars.count, all_gvar_chunks, all_scopes.count, all_scope_chunks);\n  rdib_data_sections_from_inline_sites(tp, arena->v[0], &sections, string_map, total_inline_site_count, all_inline_sites.count, all_inline_site_chunks);\n  //rdib_data_sections_from_checksums(tp, arena->v[0], &sections);\n  ProfEnd();\n\n  ProfBegin(\"Make RDI header and sections\");\n  String8List rdi_data = {0};\n  {\n    // concat section datas\n    String8List raw_section_datas[RDI_SectionKind_COUNT] = {0};\n    for (RDIB_DataSectionNode *n = sections.first; n != 0; n = n->next) {\n      str8_list_concat_in_place(&raw_section_datas[n->v.tag], &n->v.data);\n    }\n\n    RDI_Header  *rdi_header   = push_array(arena->v[0], RDI_Header,  1);\n    RDI_Section *rdi_sections = push_array(arena->v[0], RDI_Section, RDI_SectionKind_COUNT);\n\n    rdi_header->magic              = RDI_MAGIC_CONSTANT;\n    rdi_header->encoding_version   = RDI_ENCODING_VERSION;\n    rdi_header->data_section_off   = sizeof(*rdi_header);\n    rdi_header->data_section_count = RDI_SectionKind_COUNT;\n\n    str8_list_push(arena->v[0], &rdi_data, str8_struct(rdi_header));\n    str8_list_push(arena->v[0], &rdi_data, str8_array(rdi_sections, RDI_SectionKind_COUNT));\n\n    for (U64 sect_idx = 0; sect_idx < RDI_SectionKind_COUNT; ++sect_idx) {\n      RDI_Section *dst   = &rdi_sections[sect_idx];\n      dst->encoding      = RDI_SectionEncoding_Unpacked;\n      dst->pad           = 0;\n      dst->off           = 0;\n      dst->encoded_size  = 0;\n      dst->unpacked_size = 0;\n\n      if (raw_section_datas[sect_idx].total_size > 0) {\n        str8_list_push_aligner(arena->v[0], &rdi_data, 0, 8);\n\n        dst->off           = rdi_data.total_size;\n        dst->encoded_size  = raw_section_datas[sect_idx].total_size;\n        dst->unpacked_size = raw_section_datas[sect_idx].total_size;\n\n        str8_list_concat_in_place(&rdi_data, &raw_section_datas[sect_idx]);\n\n#if BUILD_DEBUG\n        {\n          U64 expected_total_size = 0;\n          for (String8Node *n = rdi_data.first; n != 0; n = n->next) {\n            expected_total_size += n->string.size;\n          }\n          Assert(expected_total_size == rdi_data.total_size);\n        }\n#endif\n      }\n    }\n  }\n  ProfEnd();\n\n  scratch_end(scratch);\n  ProfEnd();\n  return rdi_data;\n}\n\n"
  },
  {
    "path": "src/linker/rdi/rdi_builder.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\nStaticAssert(sizeof(RDI_Header) == AlignPow2(sizeof(RDI_Header), 8), g_rdi_header_align_check);\n\n////////////////////////////////\n// TODO: move to rdi_format.h\n\n#define RDI_IsCompleteUserDefinedTypeKind(x)   ((x) == RDI_TypeKind_Class || (x) == RDI_TypeKind_Struct || (x) == RDI_TypeKind_Union || (x) == RDI_TypeKind_Enum)\n#define RDI_IsIncompleteUsedDefinedTypeKind(x) (RDI_TypeKind_FirstIncomplete <= (x) && (x) <= RDI_TypeKind_LastIncomplete)\n#define RDI_IsUserDefinedType(x)               (RDI_IsCompleteUserDefinedTypeKind(x) || RDI_IsIncompleteUsedDefinedTypeKind(x))\n#define RDI_IsBuiltinType(x)                   (RDI_TypeKind_FirstBuiltIn <= (x) && (x) <= RDI_TypeKind_LastBuiltIn)\n#define RDI_IsPtrType(x)                       ((x) == RDI_TypeKind_Ptr || (x) == RDI_TypeKind_LRef || (x) == RDI_TypeKind_RRef)\n\n////////////////////////////////\n\ntypedef enum\n{\n  RDIB_DataModel_Null,\n  RDIB_DataModel_ILP32,\n  RDIB_DataModel_LLP64,\n  RDIB_DataModel_LP64,\n  RDIB_DataModel_ILP64,\n  RDIB_DataModel_SILP64\n} RDIB_DataModel;\n\n////////////////////////////////\n\ntypedef void * RDIB_TypeRef;\n\ntypedef struct RDIB_EvalBytecodeOp\n{\n  struct RDIB_EvalBytecodeOp *next;\n  RDI_EvalOp                  op;\n  U64                         p_size;\n  U64                         p;\n} RDIB_EvalBytecodeOp;\n\ntypedef struct RDIB_EvalBytecode\n{\n  U64                  count;\n  U64                  size;\n  RDIB_EvalBytecodeOp *first;\n  RDIB_EvalBytecodeOp *last;\n} RDIB_EvalBytecode;\n\ntypedef struct RDIB_Location\n{\n  RDI_LocationKind kind;\n  Rng1U64List      ranges;\n  union {\n    struct {\n      RDI_RegCode reg_code;\n      U64         offset;\n    };\n    RDIB_EvalBytecode bytecode;\n  };\n\n  // used by RDI builder\n  U64 data_offset;\n} RDIB_Location;\n\ntypedef struct RDIB_LocationNode\n{\n  struct RDIB_LocationNode *next;\n  RDIB_Location             v;\n} RDIB_LocationNode;\n\ntypedef struct RDIB_LocationList\n{\n  U64                count;\n  RDIB_LocationNode *first;\n  RDIB_LocationNode *last;\n} RDIB_LocationList;\n\n\ntypedef struct RDIB_Variable\n{\n  RDI_LinkFlags              link_flags;\n  String8                    name;\n  String8                    link_name;\n  RDI_LocalKind              kind;\n  struct RDIB_Type          *type;\n  struct RDIB_Type          *container_type;\n  struct RDIB_Procedure     *container_proc;\n  RDIB_LocationList          locations;\n  struct RDIB_VariableChunk *chunk;\n  struct RDIB_Variable      *next;\n} RDIB_Variable;\n\ntypedef struct RDIB_VariableNode\n{\n  struct RDIB_VariableNode  *next;\n  RDIB_Variable              v;\n} RDIB_VariableNode;\n\ntypedef struct RDIB_VariableList\n{\n  U64                count;\n  RDIB_VariableNode *first;\n  RDIB_VariableNode *last;\n} RDIB_VariableList;\n\n////////////////////////////////\n\ntypedef struct\n{\n  RDI_Arch arch;\n  U64      exe_hash;\n  U64      voff_max;\n  String8  exe_name;\n  String8  producer_string;\n} RDIB_TopLevelInfo;\n\ntypedef struct\n{\n  String8                name;\n  RDI_BinarySectionFlags flags;\n  U64                    voff_first;\n  U64                    voff_opl;\n  U64                    foff_first;\n  U64                    foff_opl;\n} RDIB_BinarySection;\n\ntypedef struct RDIB_LineTableFragment\n{\n  struct RDIB_SourceFile        *src_file;\n  PairU32                        ln_voff;\n  U64                           *voffs;\n  U32                           *line_nums;\n  U16                           *col_nums;\n  U64                            line_count;\n  U64                            col_count;\n  struct RDIB_LineTableFragment *next_src_file;\n  struct RDIB_LineTableFragment *next_line_table;\n  struct RDIB_LineTableFragmentChunk *chunk;\n} RDIB_LineTableFragment;\n\ntypedef struct RDIB_LineTableFragmentChunk\n{\n  struct RDIB_LineTableFragmentChunk *next;\n  U64 base;\n  U64 count;\n  U64 cap;\n  RDIB_LineTableFragment *v;\n} RDIB_LineTableFragmentChunk;\n\ntypedef struct RDIB_LineTableFragmentChunkList\n{\n  U64 count;\n  RDIB_LineTableFragmentChunk *first;\n  RDIB_LineTableFragmentChunk *last;\n} RDIB_LineTableFragmentChunkList;\n\ntypedef struct RDIB_LineTable\n{\n  struct RDIB_LineTableChunk *chunk;\n  U64                         count;\n  RDIB_LineTableFragment     *first;\n  RDIB_LineTableFragment     *last;\n  U32                         output_array_idx;\n} RDIB_LineTable;\n\ntypedef struct RDIB_LineTableChunk\n{\n  struct RDIB_LineTableChunk *next;\n  U64                         base;\n  U64                         count;\n  U64                         cap;\n  RDIB_LineTable             *v;\n} RDIB_LineTableChunk;\n\ntypedef struct RDIB_LineTableChunkList\n{\n  U64                  count;\n  RDIB_LineTableChunk *first;\n  RDIB_LineTableChunk *last;\n} RDIB_LineTableChunkList;\n\ntypedef struct RDIB_SourceFile\n{\n  String8                      file_path;\n  String8                      normal_full_path;\n  RDI_ChecksumKind             checksum_kind;\n  String8                      checksum;\n  RDIB_LineTableFragment      *line_table_frags;\n\n  U64 src_line_map_idx;\n  U64 line_table_idx;\n\n  struct RDIB_SourceFileChunk *chunk;\n} RDIB_SourceFile;\n\ntypedef struct RDIB_SourceFileChunk\n{\n  struct RDIB_SourceFileChunk *next;\n  U64                          base;\n  U64                          count;\n  U64                          cap;\n  RDIB_SourceFile             *v;\n} RDIB_SourceFileChunk;\n\ntypedef struct RDIB_SourceFileChunkList\n{\n  U64                   count;\n  RDIB_SourceFileChunk *first;\n  RDIB_SourceFileChunk *last;\n} RDIB_SourceFileChunkList;\n\ntypedef struct RDIB_Procedure\n{\n  RDI_LinkFlags          link_flags;\n  String8                name;\n  String8                link_name;\n  struct RDIB_Type      *type;\n  struct RDIB_Type      *container_type;\n  struct RDIB_Procedure *container_proc;\n\n  struct RDIB_Scope     *scope;\n  struct RDIB_ScopeNode *scope_first;\n  struct RDIB_ScopeNode *scope_last;\n  \n  U64                         scope_count;\n  struct RDIB_ProcedureChunk *chunk;\n} RDIB_Procedure;\n\ntypedef struct RDIB_Scope\n{\n  struct RDIB_Scope      *parent;\n  struct RDIB_Scope      *first_child;\n  struct RDIB_Scope      *last_child;\n  struct RDIB_Scope      *next_sibling;\n  struct RDIB_Procedure  *container_proc;\n  Rng1U64List             ranges;\n  RDIB_Variable          *local_first;\n  RDIB_Variable          *local_last;\n  U64                     local_count;\n  struct RDIB_InlineSite *inline_site;\n\n  // used by RDI builder\n  U64 local_first_idx;\n\n  struct RDIB_ScopeChunk *chunk;\n} RDIB_Scope;\n\ntypedef struct RDIB_InlineSite\n{\n  String8                      name;\n  struct RDIB_Type            *type;\n  struct RDIB_Type            *owner;\n  struct RDIB_InlineSiteChunk *chunk;\n  union {\n    struct RDIB_LineTable *line_table;\n    struct {\n      void *ud0;\n      U64   ud1;\n      U64   ud2;\n    } convert_ref;\n  };\n} RDIB_InlineSite;\n\ntypedef RDI_MemberKind RDI_MemberKindExt;\nenum\n{\n  RDI_MemberKind_COUNT = RDI_MemberKind_NestedType,\n  RDI_MemberKindExt_MemberListPointer // NOTE: must always be last in the list!\n};\n\ntypedef struct RDIB_UDTMember\n{\n  RDI_MemberKindExt kind;\n  union {\n    struct {\n      String8      name;\n      U64          offset;\n      RDIB_TypeRef type_ref;\n    } data_field;\n    struct {\n      String8      name;\n      RDIB_TypeRef type_ref;\n    } static_data;\n    RDIB_TypeRef member_list_pointer;\n    struct {\n      RDI_MemberKind kind;\n      String8         name;\n      RDIB_TypeRef    type_ref;\n      U64             vftable_offset;\n    } method;\n    struct {\n      String8      name;\n      RDIB_TypeRef type_ref;\n    } nested_type;\n    struct {\n      RDIB_TypeRef type_ref;\n      U64          offset;\n    } base_class;\n    struct {\n      RDIB_TypeRef type_ref;\n      U64          vbptr_off;\n      U64          vtable_off;\n    } virtual_base_class;\n    struct {\n      String8 name;\n      U64     value;\n    } enumerate;\n  };\n  struct RDIB_UDTMember      *next;\n  struct RDIB_UDTMemberChunk *chunk;\n} RDIB_UDTMember;\n\ntypedef struct RDIB_UDTMemberList\n{\n  U64             count;\n  RDIB_UDTMember *first;\n  RDIB_UDTMember *last;\n} RDIB_UDTMemberList;\n\ntypedef struct RDIB_UDT\n{\n  struct RDIB_Type *self_type;\n  struct RDIB_Type *members;\n  RDIB_SourceFile  *decl_src_file;\n  U32               decl_line_num;\n  U32               decl_col_num;\n} RDIB_UDT;\n\nenum\n{\n  RDI_TypeKindExt_Lo = RDI_TypeKind_Count,\n  RDI_TypeKindExt_VirtualTable,\n  RDI_TypeKindExt_StaticMethod,\n  RDI_TypeKindExt_Members,\n  RDI_TypeKindExt_Params,\n  RDI_TypeKindExt_Count,\n};\ntypedef RDI_TypeKind RDI_TypeKindExt;\n\ntypedef struct RDIB_Type\n{\n  RDI_TypeKindExt kind;\n  U64 final_idx;\n  U64 itype;\n  union {\n    struct {\n      String8 name;\n      U64     size;\n    } builtin;\n    struct {\n      RDI_TypeModifierFlags flags;\n      RDIB_TypeRef          type_ref;\n    } modifier;\n    struct {\n      RDIB_TypeRef type_ref;\n      U64          size;\n    } ptr;\n    struct {\n      RDIB_TypeRef return_type;\n      RDIB_TypeRef params_type;\n\n      U64 param_idx_run_bucket_idx;\n    } func;\n    struct {\n      RDIB_TypeRef class_type;\n      RDIB_TypeRef this_type;\n      RDIB_TypeRef return_type;\n      RDIB_TypeRef params_type;\n\n      U64 param_idx_run_bucket_idx;\n    } method;\n    struct {\n      RDIB_TypeRef class_type;\n      RDIB_TypeRef return_type;\n      RDIB_TypeRef params_type;\n\n      U64 param_idx_run_bucket_idx;\n    } static_method;\n    struct {\n      U64          off;\n      U64          count;\n      RDIB_TypeRef value_type;\n    } bitfield;\n    struct {\n      RDIB_TypeRef entry_type;\n      U64          size;\n    } array;\n    struct {\n      String8      name;\n      String8      link_name;\n      RDIB_TypeRef members;\n      // assigned in UDT build step\n      U64 udt_idx;\n      union {\n        struct {\n          U64          size;\n          RDIB_TypeRef derived;\n          RDIB_TypeRef vtshape;\n        } struct_type;\n        struct {\n          U64          size;\n        } union_type;\n        struct {\n          String8      name;\n          RDIB_TypeRef base_type;\n        } enum_type;\n      };\n    } udt;\n    struct {\n      U64           count;\n      RDIB_TypeRef *types;\n    } params;\n    struct {\n      RDIB_UDTMemberList list;\n\n      // assigned in member build step\n      B32 is_head;\n      U64 first_member_idx;\n    } members, enum_members;\n  };\n  struct RDIB_TypeChunk *chunk;\n} RDIB_Type;\n\ntypedef struct RDIB_Unit\n{\n  RDI_Arch        arch;\n  String8         unit_name;\n  String8         compiler_name;\n  String8         source_file;\n  String8         object_file;\n  String8         archive_file;\n  String8         build_path;\n  RDI_Language    language;\n  RDIB_LineTable *line_table;\n  U64             virt_range_count;\n  Rng1U64        *virt_ranges;\n\n  struct RDIB_UnitChunk *chunk;\n} RDIB_Unit;\n\ntypedef struct RDIB_DataSection\n{\n  RDI_SectionKind tag;\n  String8List     data;\n} RDIB_DataSection;\n\ntypedef struct RDIB_DataSectionNode\n{\n  struct RDIB_DataSectionNode *next;\n  RDIB_DataSection             v;\n} RDIB_DataSectionNode;\n\ntypedef struct RDIB_DataSectionList\n{\n  U64                   count;\n  RDIB_DataSectionNode *first;\n  RDIB_DataSectionNode *last;\n} RDIB_DataSectionList;\n\n\ntypedef struct RDIB_UnitChunk\n{\n  U64                    base;\n  U64                    count;\n  U64                    cap;\n  RDIB_Unit             *v;\n  struct RDIB_UnitChunk *next;\n} RDIB_UnitChunk;\n\ntypedef struct RDIB_UnitChunkList\n{\n  U64             count;\n  RDIB_UnitChunk *first;\n  RDIB_UnitChunk *last;\n} RDIB_UnitChunkList;\n\ntypedef struct RDIB_VariableChunk\n{\n  struct RDIB_VariableChunk *next;\n  U64                        base;\n  U64                        count;\n  U64                        cap;\n  RDIB_Variable             *v;\n} RDIB_VariableChunk;\n\ntypedef struct RDIB_VariableChunkList\n{\n  U64                 count;\n  RDIB_VariableChunk *first;\n  RDIB_VariableChunk *last;\n} RDIB_VariableChunkList;\n\ntypedef struct RDIB_ProcedureChunk\n{\n  struct RDIB_ProcedureChunk *next;\n  U64                         base;\n  U64                         count;\n  U64                         cap;\n  RDIB_Procedure             *v;\n} RDIB_ProcedureChunk;\n\ntypedef struct RDIB_ProcedureChunkList\n{\n  U64                  count;\n  RDIB_ProcedureChunk *first;\n  RDIB_ProcedureChunk *last;\n} RDIB_ProcedureChunkList;\n\ntypedef struct RDIB_ScopeChunk\n{\n  struct RDIB_ScopeChunk *next;\n  U64                     base;\n  U64                     count;\n  U64                     cap;\n  RDIB_Scope             *v;\n} RDIB_ScopeChunk;\n\ntypedef struct RDIB_ScopeChunkList\n{\n  U64              count;\n  RDIB_ScopeChunk *first;\n  RDIB_ScopeChunk *last;\n} RDIB_ScopeChunkList;\n\ntypedef struct RDIB_ScopeNode\n{\n  struct RDIB_ScopeNode *next;\n  RDIB_Scope            *v;\n} RDIB_ScopeNode;\n\ntypedef struct RDIB_ScopeList\n{\n  U64         count;\n  RDIB_Scope *first;\n  RDIB_Scope *last;\n} RDIB_ScopeList;\n\ntypedef struct RDIB_InlineSiteChunk\n{\n  struct RDIB_InlineSiteChunk *next;\n  U64                          base;\n  U64                          count;\n  U64                          cap;\n  RDIB_InlineSite             *v;\n} RDIB_InlineSiteChunk;\n\ntypedef struct RDIB_InlineSiteChunkList\n{\n  U64                   count;\n  RDIB_InlineSiteChunk *first;\n  RDIB_InlineSiteChunk *last;\n} RDIB_InlineSiteChunkList;\n\ntypedef struct RDIB_TypeChunk\n{\n  struct RDIB_TypeChunk *next;\n  U64                    base;\n  U64                    count;\n  U64                    cap;\n  RDIB_Type             *v;\n} RDIB_TypeChunk;\n\ntypedef struct\n{\n  U64             count;\n  RDIB_TypeChunk *first;\n  RDIB_TypeChunk *last;\n} RDIB_TypeChunkList;\n\ntypedef struct RDIB_UDTMemberChunk\n{\n  struct RDIB_UDTMemberChunk *next;\n  U64                         base;\n  U64                         count;\n  U64                         cap;\n  RDIB_UDTMember             *v;\n} RDIB_UDTMemberChunk;\n\ntypedef struct RDIB_UDTMemberChunkList\n{\n  U64                  count;\n  RDIB_UDTMemberChunk *first;\n  RDIB_UDTMemberChunk *last;\n} RDIB_UDTMemberChunkList;\n\n////////////////////////////////\n// UDT Forward Ref Map\n\ntypedef struct\n{\n  struct RDIB_Type *type;\n  U64 idx;\n} RDIB_UDTFwdrefBucket;\n\n////////////////////////////////\n// String Map\n\ntypedef struct RDIB_StringMapBucket\n{\n  String8 string;\n\n  union {\n    // to get deterministic output we assign each bucket a unique index\n    union {\n      struct {\n        U32 lo;\n        U32 hi;\n      };\n      U64 v;\n    } sorter;\n\n    // after buckets are sorted we replace 'sorter' with indices into output array\n    U64 idx;\n  };\n\n  union {\n    // depending on the usage context sotres: pointers to variables, procedures, and etc.\n    VoidNode *raw_values;\n\n    // during index-run-map build step 'raw_values' are replaced with index-run bucket index\n    struct {\n      U32 count;\n      // if we have single index - store it in the bucket\n      union {\n        U64 idx_run_bucket_idx;\n        U32 match_idx;\n      };\n    };\n  };\n} RDIB_StringMapBucket;\n\ntypedef struct RDIB_StringMap\n{\n  U64                    cap;\n  RDIB_StringMapBucket **buckets;\n} RDIB_StringMap;\n\n#define RDIB_STRING_MAP_UPDATE_FUNC(name) void name(VoidNode **head, VoidNode *node)\ntypedef RDIB_STRING_MAP_UPDATE_FUNC(RDIB_StringMapUpdateFunc);\n\ntypedef struct\n{\n  RDIB_StringMap        *string_map;\n  Rng1U64               *ranges;\n  U64                   *counts;\n  U64                   *offsets;\n  RDIB_StringMapBucket **result;\n} RDIB_GetExtantBucketsStringMapTask;\n\ntypedef struct\n{\n  U32                   *string_table;\n  U64                    string_data_size;\n  U8                    *string_data;\n  RDIB_StringMapBucket **buckets;\n  Rng1U64               *ranges;\n} RDIB_CopyStringDataTask;\n\ntypedef struct\n{\n  U64                    chunk_idx_opl;\n  Rng1U64               *ranges;\n  RDIB_StringMapBucket **src;\n  RDIB_StringMapBucket **dst;\n  U32                   *chunk_histo;\n  U32                   *chunk_offsets;\n} RDIB_StringMapRadixSort;\n\n////////////////////////////////\n// Index Run Map\n\ntypedef struct RDIB_IndexRunBucket\n{\n  union {\n    struct {\n      U32 lo;\n      U32 hi;\n    };\n    U64 v;\n  } sorter;\n  U32Array indices;\n  U64      index_in_output_array;\n} RDIB_IndexRunBucket;\n\ntypedef struct RDIB_IndexRunMap\n{\n  U64                   cap;\n  RDIB_IndexRunBucket **buckets;\n} RDIB_IndexRunMap;\n\n////////////////////////////////\n\ntypedef struct\n{\n  U64 voff;\n  U32 size;\n  U32 idx;\n} RDIB_VMapRange;\n\n////////////////////////////////\n\n#define RDIB_PATH_TREE_NIL_STRING str8_lit(\"<nil>\")\n\ntypedef struct RDIB_PathTreeNode\n{\n  struct RDIB_PathTreeNode *parent;\n  struct RDIB_PathTreeNode *next_order;\n  struct RDIB_PathTreeNode *next_sibling;\n  struct RDIB_PathTreeNode *first_child;\n  struct RDIB_PathTreeNode *last_child;\n  U64                       node_idx;\n  String8                   sub_path;\n  RDIB_SourceFile          *src_file;\n} RDIB_PathTreeNode;\n\ntypedef struct RDIB_PathTreeNodeList\n{\n  U64                count;\n  RDIB_PathTreeNode *first;\n  RDIB_PathTreeNode *last;\n} RDIB_PathTreeNodeList;\n\ntypedef struct RDIB_PathTree\n{\n  RDIB_PathTreeNode     *root;\n  U64                    node_count;\n  U64                    next_list_idx;\n  U64                    list_count;\n  RDIB_PathTreeNodeList *node_lists;\n} RDIB_PathTree;\n\n////////////////////////////////\n\ntypedef struct RDIB_Input\n{\n  U64 unit_chunk_cap;\n  U64 src_file_chunk_cap;\n  U64 symbol_chunk_cap;\n  U64 line_table_cap;\n  U64 inline_site_cap;\n  U64 type_cap;\n  U64 udt_cap;\n\n  RDIB_TopLevelInfo         top_level_info;\n  U64                       sect_count;\n  RDIB_BinarySection       *sections;\n  RDIB_UnitChunkList        units;\n  RDIB_SourceFileChunkList  src_files;\n  RDIB_LineTableChunkList   line_tables;\n  RDIB_ScopeChunkList       scopes;\n  RDIB_VariableChunkList    locals;\n  RDIB_VariableChunkList    gvars;\n  RDIB_VariableChunkList    extern_gvars;\n  RDIB_VariableChunkList    static_gvars;\n  RDIB_VariableChunkList    tvars;\n  RDIB_VariableChunkList    extern_tvars;\n  RDIB_VariableChunkList    static_tvars;\n  RDIB_ProcedureChunkList   procs;\n  RDIB_ProcedureChunkList   extern_procs;\n  RDIB_ProcedureChunkList   static_procs;\n  RDIB_InlineSiteChunkList  inline_sites;\n  RDIB_TypeChunkList        types;\n  RDIB_TypeChunkList        struct_list;\n  RDIB_TypeChunkList        union_list;\n  RDIB_TypeChunkList        enum_list;\n  RDIB_TypeChunkList        param_types;\n  RDIB_TypeChunkList        member_types;\n  RDIB_TypeChunkList        enum_types;\n  RDIB_UDTMemberChunkList   udt_members;\n  RDIB_UDTMemberChunkList   enum_members;\n\n  RDIB_SourceFile        *null_src_file;\n  RDIB_LineTable         *null_line_table;\n  RDIB_LineTableFragment *null_frag;\n  RDIB_Type              *null_type;\n  RDIB_Scope             *null_scope;\n  RDIB_Unit              *null_unit;\n  RDIB_Procedure         *null_proc;\n  RDIB_Variable          *null_local;\n  RDIB_Variable          *null_gvar;\n  RDIB_Variable          *null_tvar;\n  RDIB_UDTMember         *null_udt_member;\n  RDIB_UDTMember         *null_enum_member;\n  RDIB_InlineSite        *null_inline_site;\n\n  RDIB_Type *variadic_type;\n\n  //RDIB_TypeChunkList       struct_list;\n  //RDIB_TypeChunkList       union_list;\n  //RDIB_TypeChunkList       enum_list;\n  //RDIB_TypeChunkList       param_types;\n} RDIB_Input;\n\n////////////////////////////////\n// Parallel For Tasks\n\ntypedef struct\n{\n  U64 *udt_counts;\n} RDIB_TypeStats;\n\ntypedef struct\n{\n  RDIB_TypeChunk **chunks;\n  RDIB_TypeStats  *type_stats;\n} RDIB_TypeStatsTask;\n\ntypedef struct\n{\n  Rng1U64         *ranges;\n  U64             *counts;\n  U64             *offsets;\n  RDIB_TypeChunk **type_chunks;\n  RDIB_StringMap  *string_map;\n  union {\n    RDI_Member     *udt_members_rdi;\n    RDI_EnumMember *enum_members_rdi;\n  };\n} RDIB_MembersTask;\n\ntypedef struct\n{\n  RDIB_TypeChunk    **type_chunks;\n  RDIB_TypeStats      type_stats;\n  U64                *udt_base_idx;\n  RDI_UDT            *udts;\n} RDIB_UserDefinesTask;\n\ntypedef struct\n{\n  U64                 addr_size;\n  RDIB_StringMap     *string_map;\n  RDIB_IndexRunMap   *idx_run_map;\n  RDIB_TypeChunk    **type_chunks;\n  RDIB_TypeStats      type_stats;\n  RDI_TypeNode       *type_nodes;\n} RDIB_TypeNodesTask;\n\ntypedef struct\n{\n  RDIB_StringMap            *string_map;\n  Rng1U64                   *ranges;\n  RDIB_StringMapUpdateFunc  *string_map_update_func;\n  RDIB_StringMapBucket     **free_buckets;\n  U64                       *insert_counts;\n  U64                       *element_indices;\n  union\n  {\n    RDIB_UnitChunk        **units;\n    RDIB_BinarySection     *sects;\n    RDIB_SourceFileChunk  **src_file_chunks;\n    RDIB_VariableChunk    **vars;\n    RDIB_ProcedureChunk   **procs;\n    RDIB_InlineSiteChunk  **inline_sites;\n    RDIB_UDTMemberChunk   **udt_members;\n    RDIB_UDTMemberChunk   **enum_members;\n    RDIB_TypeChunk        **types;\n    RDIB_PathTreeNodeList  *path_node_lists;\n  };\n} RDIB_CollectStringsTask;\n\ntypedef struct\n{\n  RDIB_StringMap  *string_map;\n  Rng1U64         *ranges;\n  RDIB_TypeChunk **chunks;\n  String8List     *data_lists;\n} RDIB_BuildTypeDataTask;\n\ntypedef struct\n{\n  RDIB_StringMap *string_map;\n  Rng1U64        *ranges;\n  union {\n    struct {\n      RDIB_VariableChunk **gvars_rdib;\n      String8List         *gvars_out;\n    };\n    struct {\n      RDIB_VariableChunk **tvars_rdib;\n      String8List         *tvars_out;\n    };\n    struct {\n      RDIB_ProcedureChunk **procs_rdib;\n      String8List          *procs_out;\n    };\n    struct {\n      RDIB_ScopeChunk  **scopes_rdib;\n      U64               *scope_voff_counts;\n      U64               *loc_data_sizes;\n      U64               *local_counts;\n      U64               *loc_block_counts;\n      U64               *scope_voff_offsets;\n      U64               *local_offsets;\n      U64               *loc_block_offsets;\n      U64               *loc_data_offsets;\n      U64               *scope_voffs_rdi;\n      RDI_Scope         *scopes_rdi;\n      RDI_Local         *locals_rdi;\n      RDI_LocationBlock *loc_blocks_rdi;\n      U8                *loc_data_rdi;\n    };\n  };\n} RDIB_BuildSymbolSectionTask;\n\ntypedef union\n{\n  struct {\n    U64            *counts;\n    U64            *offsets;\n    Rng1U64        *ranges;\n    RDIB_VMapRange *vmap;\n    union {\n      RDIB_UnitChunk     **unit_chunks;\n      RDIB_VariableChunk **gvar_chunks;\n      RDIB_ScopeChunk    **scope_chunks;\n    };\n  };\n\n  struct {\n    U64             vmap_counts[3];\n    RDIB_VMapRange *vmaps[3];\n    String8List     raw_vmaps[3];\n  };\n} RDIB_VMapBuilderTask;\n\ntypedef struct\n{\n  U64                   sorter_idx;\n  RDI_NameMapKind       name_map_kind;\n  RDIB_IndexRunMap     *idx_run_map;\n  RDIB_IndexRunBucket **free_buckets;\n  Rng1U64              *ranges;\n  union {\n    RDIB_TypeChunk       **type_chunks;\n    RDIB_StringMapBucket **name_map_buckets;\n  };\n} RDIB_BuildIndexRunsTask;\n\ntypedef struct\n{\n  RDIB_IndexRunBucket **buckets;\n  Rng1U64             *ranges;\n  U32                 *output_array;\n} RDIB_IdxRunCopyTask;\n\ntypedef struct\n{\n  RDIB_IndexRunMap     *idx_run_map;\n  Rng1U64              *ranges;\n  U64                  *counts;\n  U64                  *offsets;\n  RDIB_IndexRunBucket **result;\n} RDIB_GetExtantBucketsIndexRunMapTask;\n\ntypedef struct\n{\n  U64                   chunk_idx_opl;\n  Rng1U64              *ranges;\n  RDIB_IndexRunBucket **src;\n  RDIB_IndexRunBucket **dst;\n  U32                  *chunk_histo;\n  U32                  *chunk_offsets;\n} RDIB_IndexRunMapRadixSort;\n\ntypedef struct\n{\n  RDIB_StringMap         *string_map;\n  RDIB_IndexRunMap       *idx_run_map;\n  U64                    *in_bucket_counts;\n  RDIB_StringMapBucket ***in_buckets;\n\n  RDI_NameMapBucket **out_buckets;\n  RDI_NameMapNode   **out_nodes;\n  U64                *out_bucket_counts;\n  U64                *out_node_counts;\n} RDIB_NameMapBuilderTask;\n\ntypedef struct\n{\n  RDIB_PathTree    *path_tree;\n  RDIB_StringMap   *string_map;\n  RDI_FilePathNode *nodes_dst;\n} RDIB_BuildFilePathNodesTask;\n\ntypedef struct\n{\n  RDIB_SourceFile **src_file_arr;\n  U32             *out_line_counts;\n  U32             *out_voff_counts;\n  U32             **out_line_nums;\n  U32             **out_line_ranges;\n  U64             **out_voffs;\n} RDIB_SrcLineMapsTask;\n\ntypedef struct\n{\n  RDIB_LineTableChunk **chunks;\n  Rng1U64              *ranges;\n\n  U64       *out_line_table_counts;\n  U64      **out_line_table_voffs;\n  RDI_Line **out_line_table_lines;\n} RDIB_BuildLineTablesTask;\n\ntypedef struct\n{\n  Rng1U64               *ranges;\n  RDIB_StringMap        *string_map;\n  RDIB_PathTree         *path_tree;\n  RDIB_SourceFileChunk **src_file_chunks;\n  RDI_SourceFile        *src_files_dst;\n} RDIB_FillSourceFilesTask;\n\n////////////////////////////////\n// Data Model Helpers\n\ninternal RDIB_DataModel rdib_infer_data_model(OperatingSystem os, RDI_Arch arch);\n\ninternal RDI_TypeKind rdib_short_type_from_data_model             (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_unsigned_short_type_from_data_model    (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_int_type_from_data_model               (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_unsigned_int_type_from_data_model      (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_long_type_from_data_model              (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_unsigned_long_type_from_data_model     (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_long_long_type_from_data_model         (RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_unsigned_long_long_type_from_data_model(RDIB_DataModel data_model);\ninternal RDI_TypeKind rdib_pointer_size_t_type_from_data_model    (RDIB_DataModel data_model);\n\n////////////////////////////////\n\ninternal void rdib_udt_member_list_push_node      (RDIB_UDTMemberList *list, RDIB_UDTMember *node);\ninternal void rdib_udt_member_list_concat_in_place(RDIB_UDTMemberList *list, RDIB_UDTMemberList *to_concat);\n\ninternal RDIB_LineTableFragment * rdib_line_table_push(Arena *arena, RDIB_LineTable *list);\n\n////////////////////////////////\n// Chunk Lists\n\n// push\ninternal RDIB_Unit          * rdib_unit_chunk_list_push       (Arena *arena, RDIB_UnitChunkList       *list, U64 cap);\ninternal RDIB_Scope         * rdib_scope_chunk_list_push      (Arena *arena, RDIB_ScopeChunkList      *list, U64 cap);\ninternal RDIB_Procedure     * rdib_procedure_chunk_list_push  (Arena *arena, RDIB_ProcedureChunkList  *list, U64 cap);\ninternal RDIB_Variable      * rdib_variable_chunk_list_push   (Arena *arena, RDIB_VariableChunkList   *list, U64 cap);\ninternal RDIB_LineTable     * rdib_line_table_chunk_list_push (Arena *arena, RDIB_LineTableChunkList  *list, U64 cap);\ninternal RDIB_Type          * rdib_type_chunk_list_push       (Arena *arena, RDIB_TypeChunkList       *list, U64 cap);\ninternal RDIB_UDTMember     * rdib_udt_member_chunk_list_push (Arena *arena, RDIB_UDTMemberChunkList  *list, U64 cap);\ninternal RDIB_SourceFile    * rdib_source_file_chunk_list_push(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap);\ninternal RDIB_InlineSite    * rdib_inline_site_chunk_list_push(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap);\n\ninternal RDIB_Scope      * rdib_scope_chunk_list_push_zero      (Arena *arena, RDIB_ScopeChunkList *list,      U64 cap);\ninternal RDIB_Procedure  * rdib_procedure_chunk_list_push_zero  (Arena *arena, RDIB_ProcedureChunkList *list,  U64 cap);\ninternal RDIB_Variable   * rdib_variable_chunk_list_push_zero   (Arena *arena, RDIB_VariableChunkList *list,   U64 cap);\ninternal RDIB_LineTable  * rdib_line_table_chunk_list_push_zero (Arena *arena, RDIB_LineTableChunkList *list,  U64 cap);\ninternal RDIB_Type       * rdib_type_chunk_list_push_zero       (Arena *arena, RDIB_TypeChunkList *list,       U64 cap);\ninternal RDIB_UDTMember  * rdib_udt_member_chunk_list_push_zero (Arena *arena, RDIB_UDTMemberChunkList *list,  U64 cap);\ninternal RDIB_SourceFile * rdib_source_file_chunk_list_push_zero(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap);\ninternal RDIB_InlineSite * rdib_inline_site_chunk_list_push_zero(Arena *arena, RDIB_InlineSiteChunkList *list, U64 cap);\n\n// push many\ninternal RDIB_UnitChunk * rdib_unit_chunk_list_reserve_ex(Arena *arena, RDIB_UnitChunkList *list, U64 chunk_count, U64 item_count);\n\ninternal void rdib_unit_chunk_list_reserve       (Arena *arena, RDIB_UnitChunkList       *list, U64 cap);\ninternal void rdib_type_chunk_list_reserve       (Arena *arena, RDIB_TypeChunkList       *list, U64 cap);\ninternal void rdib_source_file_chunk_list_reserve(Arena *arena, RDIB_SourceFileChunkList *list, U64 cap);\n\n// concat in place\ninternal void rdib_scope_chunk_list_concat_in_place      (RDIB_ScopeChunkList      *list, RDIB_ScopeChunkList      *to_concat);\ninternal void rdib_udt_member_chunk_list_concat_in_place (RDIB_UDTMemberChunkList  *list, RDIB_UDTMemberChunkList  *to_concat);\ninternal void rdib_procedure_chunk_list_concat_in_place  (RDIB_ProcedureChunkList  *list, RDIB_ProcedureChunkList  *to_concat);\ninternal void rdib_variable_chunk_list_concat_in_place   (RDIB_VariableChunkList   *list, RDIB_VariableChunkList   *to_concat);\ninternal void rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat);\ninternal void rdib_inline_site_chunk_list_concat_in_place(RDIB_InlineSiteChunkList *list, RDIB_InlineSiteChunkList *to_concat);\ninternal void rdib_type_chunk_list_concat_in_place       (RDIB_TypeChunkList       *list, RDIB_TypeChunkList       *to_concat);\ninternal void rdib_source_file_chunk_list_concat_in_place(RDIB_SourceFileChunkList *list, RDIB_SourceFileChunkList *to_concat);\n\n// concat in place many\ninternal void rdib_type_chunk_list_concat_in_place_many      (RDIB_TypeChunkList      *list, RDIB_TypeChunkList      *to_concat, U64 count);\ninternal void rdib_udt_member_chunk_list_concat_in_place_many(RDIB_UDTMemberChunkList *list, RDIB_UDTMemberChunkList *to_concat, U64 count);\n\n// array from chunk list\ninternal RDIB_UnitChunk       ** rdib_array_from_unit_chunk_list       (Arena *arena, RDIB_UnitChunkList list);\ninternal RDIB_ScopeChunk      ** rdib_array_from_scope_chunk_list      (Arena *arena, RDIB_ScopeChunkList      list);\ninternal RDIB_ProcedureChunk  ** rdib_array_from_procedure_chunk_list  (Arena *arena, RDIB_ProcedureChunkList  list);\ninternal RDIB_VariableChunk   ** rdib_array_from_variable_chunk_list   (Arena *arena, RDIB_VariableChunkList   list);\ninternal RDIB_LineTableChunk  ** rdib_array_from_line_table_chunk_list (Arena *arena, RDIB_LineTableChunkList  list);\ninternal RDIB_InlineSiteChunk ** rdib_array_from_inline_site_chunk_list(Arena *arena, RDIB_InlineSiteChunkList list);\ninternal RDIB_UDTMemberChunk  ** rdib_array_from_udt_member_chunk_list (Arena *arena, RDIB_UDTMemberChunkList  list);\ninternal RDIB_TypeChunk       ** rdib_array_from_type_chunk_list       (Arena *arena, RDIB_TypeChunkList       list);\ninternal RDIB_SourceFileChunk ** rdib_array_from_source_file_chunk_list(Arena *arena, RDIB_SourceFileChunkList list);\n\n// total count from chunk list\ninternal U64 rdib_unit_chunk_list_total_count       (RDIB_UnitChunkList list);\ninternal U64 rdib_scope_chunk_list_total_count      (RDIB_ScopeChunkList      list);\ninternal U64 rdib_variable_chunk_list_total_count   (RDIB_VariableChunkList   list);\ninternal U64 rdib_line_table_chunk_list_total_count (RDIB_LineTableChunkList  list);\ninternal U64 rdib_procedure_chunk_list_total_count  (RDIB_ProcedureChunkList  list);\ninternal U64 rdib_inline_site_chunk_list_total_count(RDIB_InlineSiteChunkList list);\ninternal U64 rdib_udt_member_chunk_list_total_count (RDIB_UDTMemberChunkList  list);\ninternal U64 rdib_type_chunk_list_total_count       (RDIB_TypeChunkList       list);\ninternal U64 rdib_source_file_chunk_list_total_count(RDIB_SourceFileChunkList list);\n\n// pointer -> array index\ninternal U32 rdib_idx_from_unit       (RDIB_Unit *n);\ninternal U32 rdib_idx_from_scope      (RDIB_Scope      *n);\ninternal U32 rdib_idx_from_variable   (RDIB_Variable   *n);\ninternal U32 rdib_idx_from_procedure  (RDIB_Procedure  *n);\ninternal U32 rdib_idx_from_source_file(RDIB_SourceFile *n);\ninternal U32 rdib_idx_from_line_table (RDIB_LineTable *n);\ninternal U32 rdib_idx_from_type       (RDIB_Type       *n);\ninternal U32 rdib_idx_from_udt_type   (RDIB_Type       *n);\ninternal U32 rdib_idx_from_inline_site(RDIB_InlineSite *n);\n\n////////////////////////////////\n\n//- Source File\n\ninternal B32 rdib_source_file_match(RDIB_SourceFile *a, RDIB_SourceFile *b, OperatingSystem os);\n\n//- Eval Ops\n\ninternal RDIB_EvalBytecodeOp * rdib_bytecode_push_op    (Arena *arena, RDIB_EvalBytecode *bytecode, RDI_EvalOp op, RDI_U64 p);\ninternal void                  rdib_bytecode_push_ucsont(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_U64 uconst);\ninternal void                  rdib_bytecode_push_sconst(Arena *arena, RDIB_EvalBytecode *bytecode, RDI_S64 sconst);\n\n//- Location\n\ninternal RDIB_Location rdib_make_location_addr_byte_stream      (Rng1U64List ranges, RDIB_EvalBytecode bytecode);\ninternal RDIB_Location rdib_make_location_addr_bytecode_stream  (Rng1U64List ranges, RDIB_EvalBytecode bytecode);\ninternal RDIB_Location rdib_make_location_val_bytecode_stream   (Rng1U64List ranges, RDIB_EvalBytecode bytecode);\ninternal RDIB_Location rdib_make_location_addr_reg_plus_u16     (Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset);\n\ninternal RDIB_Location rdib_make_location_addr_addr_reg_plus_u16(Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset);\ninternal RDIB_Location rdib_make_location_addr_reg_plus_u16     (Rng1U64List ranges, RDI_RegCode reg_code, RDI_U16 offset);\ninternal RDIB_Location rdib_make_location_val_reg               (Rng1U64List ranges, RDI_RegCode reg_code);\n\ninternal RDIB_LocationNode * rdib_push_location_addr_reg_off(Arena *arena, RDIB_LocationList *list, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 is_reference, Rng1U64List ranges);\n\n//- UDT Fwdrefs\n\ninternal U64                    rdib_udt_fwdref_map_hash(String8 string);\ninternal RDIB_UDTFwdrefBucket * rdib_udt_fwdref_map_insert_or_update(RDIB_UDTFwdrefBucket **buckets, U64 cap, U64 hash, RDIB_UDTFwdrefBucket *new_bucket);\ninternal RDIB_UDTFwdrefBucket * rdib_udt_fwdrefmap_map_lookup(RDIB_UDTFwdrefBucket **buckets, U64 cap, U64 hash, String8 name);\n\n//- Types\n\ninternal RDIB_TypeRef rdib_make_type_ref(Arena *arena, RDIB_Type *type);\ninternal void         rdib_deref_type_refs(TP_Context *tp, RDIB_TypeChunkList *list);\n\ninternal RDIB_TypeStats rdib_sum_type_stats                 (RDIB_TypeStats *stats, U64 count);\ninternal U64            rdib_udt_count_from_type_stats      (RDIB_TypeStats *stats);\ninternal U64            rdib_type_node_count_from_type_stats(RDIB_TypeStats *stats);\n\ninternal U64 rdib_size_from_type    (RDIB_Type *type);\ninternal U64 rdib_count_members_deep(RDIB_Type *type);\n\n//- Path Tree\n\ninternal RDIB_PathTree * rdib_path_tree_init    (Arena *arena, U64 list_count);\ninternal void            rdib_path_tree_insert  (Arena *arena, RDIB_PathTree *tree, String8 path, RDIB_SourceFile *src_file);\ninternal U32             rdib_idx_from_path_tree(RDIB_PathTree *tree, String8 path);\n\n\n//- String Map\n\ninternal U64                     rdib_string_map_hash               (String8 string);\ninternal RDIB_StringMap *        rdib_init_string_map               (Arena *arena, U64 cap);\ninternal U32                     rdib_idx_from_string_map           (RDIB_StringMap *string_map, String8 string);\ninternal RDIB_StringMapBucket *  rdib_string_map_insert_or_update   (RDIB_StringMapBucket **buckets, U64 cap, U64 hash, RDIB_StringMapBucket *new_bucket, RDIB_StringMapUpdateFunc *update_func);\ninternal void                    rdib_string_map_assign_indices     (RDIB_StringMapBucket **buckets, U64 bucket_count);\ninternal RDIB_StringMapBucket ** rdib_extant_buckets_from_string_map(TP_Context *tp, Arena *arena, RDIB_StringMap *string_map, U64 *bucket_count_out);\ninternal void                    rdib_string_map_sort_buckets       (TP_Context *tp, RDIB_StringMapBucket **buckets, U64 bucket_count, U64 max_sorter);\n\n//- String Map Specialized Inserters\n\ninternal void rdib_string_map_insert_item             (Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, void *value);\ninternal void rdib_string_map_insert_string_table_item(Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string);\ninternal void rdib_string_map_insert_name_map_item    (Arena *arena, RDIB_CollectStringsTask *task, U64 task_id, String8 string, VoidNode *node);\n\n//- Index Run Map\n\ninternal U64                    rdib_index_run_hash                   (U32 count, U32 *idxs);\ninternal RDIB_IndexRunMap *     rdib_init_index_run_map               (Arena *arena, U64 cap);\ninternal RDIB_IndexRunBucket *  rdib_index_run_map_insert_or_update   (Arena *arena, RDIB_IndexRunBucket **buckets, U64 cap, U64 hash, RDIB_IndexRunBucket *new_bucket, U64 *bucket_idx_out);\ninternal U32                    rdib_idx_run_from_bucket_idx          (RDIB_IndexRunMap *map, U64 bucket_idx);\ninternal void                   rdib_index_run_map_assign_indices     (RDIB_IndexRunBucket **buckets, U64 bucket_count);\ninternal RDIB_IndexRunBucket ** rdib_extant_buckets_from_index_run_map(TP_Context *tp, Arena *arena, RDIB_IndexRunMap *idx_run_map, U64 *bucket_count_out);\ninternal void                   rdib_index_run_map_sort_buckets       (TP_Context *tp, RDIB_IndexRunBucket **buckets, U64 bucket_count, U64 chunk_idx_opl);\n\n//- Index Map Spesialized Query\n\ninternal U32 rdib_idx_from_params(RDIB_IndexRunMap *map, RDIB_Type *params);\n\n//- Data Sections\n\ninternal void                   rdib_data_section_list_push_node      (RDIB_DataSectionList *list, RDIB_DataSectionNode *node);\ninternal RDIB_DataSectionNode * rdib_data_section_list_push           (Arena *arena, RDIB_DataSectionList *list, RDIB_DataSection v);\ninternal void                   rdib_data_section_list_concat_in_place(RDIB_DataSectionList *list, RDIB_DataSectionList *to_concat);\n\ninternal void rdib_data_sections_from_top_level_info       (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_TopLevelInfo *src);\ninternal void rdib_data_sections_from_binary_sections      (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_BinarySection *binary_sects, U64 binary_sects_count);\ninternal void rdib_data_sections_from_string_map           (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count);\ninternal void rdib_data_sections_from_index_runs           (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_IndexRunBucket **buckets, U64 bucket_count);\ninternal void rdib_data_sections_from_file_path_nodes      (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list,  RDIB_PathTree *tree);\ninternal void rdib_data_sections_from_source_files         (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree, U64 total_src_file_count, U64 src_file_chunk_count, RDIB_SourceFileChunk **src_file_chunks);\ninternal void rdib_data_sections_from_units                (Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_PathTree *path_tree, U64 total_unit_count, U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks);\ninternal void rdib_data_sections_from_string_map           (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMapBucket **buckets, U64 bucket_count);\ninternal void rdib_data_sections_from_types(TP_Context            *tp,\n                                            Arena                 *arena,\n                                            RDIB_DataSectionList  *sect_list,\n                                            RDI_Arch               arch,\n                                            RDIB_StringMap        *string_map,\n                                            RDIB_IndexRunMap      *idx_run_map,\n                                            U64                    udt_member_chunk_count,\n                                            RDIB_TypeChunk       **udt_member_type_chunks,\n                                            U64                    enum_member_chunk_count,\n                                            RDIB_TypeChunk       **enum_member_type_chunks,\n                                            U64                    total_type_node_count,\n                                            U64                    type_chunk_count,\n                                            RDIB_TypeChunk       **type_chunks,\n                                            RDIB_TypeStats         type_stats);\ninternal void rdib_data_sections_from_global_variables     (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_VariableChunk **chunks);\ninternal void rdib_data_sections_from_thread_variables     (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_VariableChunk **chunks);\ninternal void rdib_data_sections_from_procedures           (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_ProcedureChunk **chunks);\ninternal void rdib_data_sections_from_scopes               (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_count, U64 chunk_count, RDIB_ScopeChunk **chunks);\ninternal void rdib_data_sections_from_name_maps            (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, RDIB_IndexRunMap *idx_run_map, RDIB_StringMapBucket **src_name_maps[RDI_NameMapKind_COUNT], U64 src_name_map_counts[RDI_NameMapKind_COUNT]);\ninternal void rdib_data_sections_from_source_line_maps \t   (TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, U64 total_src_file_count, U64 src_file_chunk_count, RDIB_SourceFileChunk **src_fille_chunks);\ninternal void rdib_data_sections_from_unit_gvar_scope_vmaps(TP_Context *tp, TP_Arena *arena, RDIB_DataSectionList *sect_list, U64 unit_chunk_count, RDIB_UnitChunk **unit_chunks, U64 gvar_chunk_count, RDIB_VariableChunk **gvar_chunks, U64 scope_chunk_count, RDIB_ScopeChunk **scope_chunks);\ninternal void rdib_data_sections_from_inline_sites         (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list, RDIB_StringMap *string_map, U64 total_inline_site_count, U64 inline_site_chunk_count, RDIB_InlineSiteChunk **inline_site_chunks);\ninternal void rdib_data_sections_from_checksums            (TP_Context *tp, Arena *arena, RDIB_DataSectionList *sect_list);\n\ninternal RDIB_Input  rdib_init_input(Arena *arena);\ninternal String8List rdib_finish(TP_Context *tp, TP_Arena *arena, RDIB_Input *input);\n\n"
  },
  {
    "path": "src/linker/rdi/rdi_coff.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal RDI_Arch\nrdi_arch_from_coff_machine(COFF_MachineType machine)\n{\n  switch (machine) {\n  case COFF_MachineType_X86: return RDI_Arch_X86;\n  case COFF_MachineType_X64: return RDI_Arch_X64;\n\n  case COFF_MachineType_Unknown:\n  case COFF_MachineType_Am33:\n  case COFF_MachineType_Arm:\n  case COFF_MachineType_Arm64:\n  case COFF_MachineType_ArmNt:\n  case COFF_MachineType_Ebc:\n  case COFF_MachineType_Ia64:\n  case COFF_MachineType_M32R:\n  case COFF_MachineType_Mips16:\n  case COFF_MachineType_MipsFpu:\n  case COFF_MachineType_MipsFpu16:\n  case COFF_MachineType_PowerPc:\n  case COFF_MachineType_PowerPcFp:\n  case COFF_MachineType_R4000:\n  case COFF_MachineType_RiscV32:\n  case COFF_MachineType_RiscV64:\n  case COFF_MachineType_Sh3:\n  case COFF_MachineType_Sh3Dsp:\n  case COFF_MachineType_Sh4:\n  case COFF_MachineType_Sh5:\n  case COFF_MachineType_Thumb:\n  case COFF_MachineType_WceMipsV2:\n    NotImplemented;\n  default:\n    return RDI_Arch_NULL;\n  }\n}\n\ninternal RDI_BinarySectionFlags\nrdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags)\n{\n  RDI_BinarySectionFlags result = 0;\n  if (flags & COFF_SectionFlag_MemRead) {\n    result |= RDI_BinarySectionFlag_Read;\n  }\n  if (flags & COFF_SectionFlag_MemWrite) {\n    result |= RDI_BinarySectionFlag_Write;\n  }\n  if (flags & COFF_SectionFlag_MemExecute) {\n    result |= RDI_BinarySectionFlag_Execute;\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/linker/rdi/rdi_coff.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal RDI_Arch rdi_arch_from_coff_machine(COFF_MachineType machine);\n\n"
  },
  {
    "path": "src/linker/rdi/rdi_cv.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal RDI_Arch\nrdi_arch_from_cv_arch(CV_Arch arch)\n{\n  switch (arch) {\n  case CV_Arch_8086: return RDI_Arch_X86;\n  case CV_Arch_X64:  return RDI_Arch_X64;\n\n  case CV_Arch_8080: \n  case CV_Arch_80286: \n  case CV_Arch_80386: \n  case CV_Arch_80486: \n  case CV_Arch_PENTIUM: \n  case CV_Arch_PENTIUMII: \n  case CV_Arch_PENTIUMIII: \n  case CV_Arch_MIPS: \n  case CV_Arch_MIPS16: \n  case CV_Arch_MIPS32: \n  case CV_Arch_MIPS64: \n  case CV_Arch_MIPSI: \n  case CV_Arch_MIPSII: \n  case CV_Arch_MIPSIII: \n  case CV_Arch_MIPSIV: \n  case CV_Arch_MIPSV: \n  case CV_Arch_M68000: \n  case CV_Arch_M68010: \n  case CV_Arch_M68020: \n  case CV_Arch_M68030: \n  case CV_Arch_M68040: \n  case CV_Arch_ALPHA: \n  case CV_Arch_ALPHA_21164: \n  case CV_Arch_ALPHA_21164A: \n  case CV_Arch_ALPHA_21264: \n  case CV_Arch_ALPHA_21364: \n  case CV_Arch_PPC601: \n  case CV_Arch_PPC603: \n  case CV_Arch_PPC604: \n  case CV_Arch_PPC620: \n  case CV_Arch_PPCFP: \n  case CV_Arch_PPCBE: \n  case CV_Arch_SH3: \n  case CV_Arch_SH3E: \n  case CV_Arch_SH3DSP: \n  case CV_Arch_SH4: \n  case CV_Arch_SHMEDIA: \n  case CV_Arch_ARM3: \n  case CV_Arch_ARM4: \n  case CV_Arch_ARM4T: \n  case CV_Arch_ARM5: \n  case CV_Arch_ARM5T: \n  case CV_Arch_ARM6: \n  case CV_Arch_ARM_XMAC: \n  case CV_Arch_ARM_WMMX: \n  case CV_Arch_ARM7: \n  case CV_Arch_OMNI: \n  case CV_Arch_IA64_1: \n  case CV_Arch_IA64_2: \n  case CV_Arch_CEE: \n  case CV_Arch_AM33: \n  case CV_Arch_M32R: \n  case CV_Arch_TRICORE: \n  case CV_Arch_EBC: \n  case CV_Arch_THUMB: \n  case CV_Arch_ARMNT: \n  case CV_Arch_ARM64: \n  case CV_Arch_D3D11_SHADER: \n    NotImplemented;\n  default:\n    return RDI_Arch_NULL;\n  }\n}\n\ninternal RDI_Language\nrdi_language_from_cv_language(CV_Language language)\n{\n  switch (language) {\n  case CV_Language_C:      return RDI_Language_C;\n  case CV_Language_CXX:    return RDI_Language_CPlusPlus;\n  case CV_Language_MASM:   return RDI_Language_Masm;\n  case CV_Language_LINK:   return RDI_Language_NULL;\n  case CV_Language_CVTRES: return RDI_Language_NULL;\n\n  case CV_Language_FORTRAN: \n  case CV_Language_PASCAL:  \n  case CV_Language_BASIC:   \n  case CV_Language_COBOL:   \n  case CV_Language_CVTPGD:  \n  case CV_Language_CSHARP:  \n  case CV_Language_VB:      \n  case CV_Language_ILASM:   \n  case CV_Language_JAVA:    \n  case CV_Language_JSCRIPT: \n  case CV_Language_MSIL:    \n  case CV_Language_HLSL:    \n    NotImplemented;\n  default:\n    return RDI_Language_NULL;\n  }\n}\n\ninternal RDI_TypeModifierFlags\nrdi_type_modifier_flags_from_cv_modifier_flags(CV_ModifierFlags flags)\n{\n  RDI_TypeModifierFlags result = 0;\n  if (flags & CV_ModifierFlag_Const) {\n    result |= RDI_TypeModifierFlag_Const;\n  }\n  if (flags & CV_ModifierFlag_Volatile) {\n    result |= RDI_TypeModifierFlag_Volatile;\n  }\n  return result;\n}\n\ninternal RDI_TypeModifierFlags\nrdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs)\n{\n  RDI_TypeModifierFlags result = 0;\n  if (attribs & CV_PointerAttrib_Const) {\n    result |= RDI_TypeModifierFlag_Const;\n  }\n  if (attribs & CV_PointerAttrib_Volatile) {\n    result |= RDI_TypeModifierFlag_Volatile;\n  }\n  return result;\n}\n\ninternal RDI_TypeKind\nrdi_type_kind_from_pointer(CV_PointerAttribs attribs, CV_PointerMode mode)\n{\n  RDI_TypeKind result = RDI_TypeKind_Ptr;\n  \n  if (attribs & CV_PointerAttrib_LRef) {\n    result = RDI_TypeKind_LRef;\n  } else if (attribs & CV_PointerAttrib_RRef) {\n    result = RDI_TypeKind_RRef;\n  }\n\n  if (mode == CV_PointerMode_LRef) {\n    result = RDI_TypeKind_LRef;\n  } else if (mode == CV_PointerMode_RRef) {\n    result = RDI_TypeKind_RRef;\n  }\n\n  return result;\n}\n\ninternal RDI_TypeKind\nrdi_type_kind_from_cv_basic_type(CV_BasicType basic_type)\n{\n  switch (basic_type) {\n  case CV_BasicType_NOTYPE    : return RDI_TypeKind_NULL;\n  case CV_BasicType_ABS       : return RDI_TypeKind_NULL;\n  case CV_BasicType_SEGMENT   : return RDI_TypeKind_NULL;\n  case CV_BasicType_VOID      : return RDI_TypeKind_Void;\n  case CV_BasicType_CURRENCY  : return RDI_TypeKind_NULL;\n  case CV_BasicType_NBASICSTR : return RDI_TypeKind_NULL;\n  case CV_BasicType_FBASICSTR : return RDI_TypeKind_NULL;\n  case CV_BasicType_HRESULT   : return RDI_TypeKind_Handle;\n  case CV_BasicType_CHAR      : return RDI_TypeKind_Char8;\n  case CV_BasicType_SHORT     : return RDI_TypeKind_S16;\n  case CV_BasicType_LONG      : return RDI_TypeKind_S32;\n  case CV_BasicType_QUAD      : return RDI_TypeKind_S64;\n  case CV_BasicType_OCT       : return RDI_TypeKind_S128;\n  case CV_BasicType_UCHAR     : return RDI_TypeKind_UChar8;\n  case CV_BasicType_USHORT    : return RDI_TypeKind_U16;\n  case CV_BasicType_ULONG     : return RDI_TypeKind_U32;\n  case CV_BasicType_UQUAD     : return RDI_TypeKind_U64;\n  case CV_BasicType_UOCT      : return RDI_TypeKind_U128;\n  case CV_BasicType_BOOL8     : return RDI_TypeKind_S8;\n  case CV_BasicType_BOOL16    : return RDI_TypeKind_S16;\n  case CV_BasicType_BOOL32    : return RDI_TypeKind_S32;\n  case CV_BasicType_BOOL64    : return RDI_TypeKind_S64;\n  case CV_BasicType_FLOAT32   : return RDI_TypeKind_F32;\n  case CV_BasicType_FLOAT64   : return RDI_TypeKind_F64;\n  case CV_BasicType_FLOAT80   : return RDI_TypeKind_F80;\n  case CV_BasicType_FLOAT128  : return RDI_TypeKind_F128;\n  case CV_BasicType_FLOAT48   : return RDI_TypeKind_F48;\n  case CV_BasicType_FLOAT32PP : return RDI_TypeKind_F32PP;\n  case CV_BasicType_FLOAT16   : return RDI_TypeKind_F16;\n  case CV_BasicType_COMPLEX32 : return RDI_TypeKind_ComplexF32;\n  case CV_BasicType_COMPLEX64 : return RDI_TypeKind_ComplexF64;\n  case CV_BasicType_COMPLEX80 : return RDI_TypeKind_ComplexF80;\n  case CV_BasicType_COMPLEX128: return RDI_TypeKind_ComplexF128;\n  case CV_BasicType_BIT       : return RDI_TypeKind_NULL;\n  case CV_BasicType_PASCHAR   : return RDI_TypeKind_NULL;\n  case CV_BasicType_BOOL32FF  : return RDI_TypeKind_NULL;\n  case CV_BasicType_INT8      : return RDI_TypeKind_S8;\n  case CV_BasicType_UINT8     : return RDI_TypeKind_U8;\n  case CV_BasicType_RCHAR     : return RDI_TypeKind_Char8;\n  case CV_BasicType_WCHAR     : return RDI_TypeKind_UChar16;\n  case CV_BasicType_CHAR16    : return RDI_TypeKind_Char16;\n  case CV_BasicType_CHAR32    : return RDI_TypeKind_Char32;\n  case CV_BasicType_INT16     : return RDI_TypeKind_S16;\n  case CV_BasicType_UINT16    : return RDI_TypeKind_U16;\n  case CV_BasicType_INT32     : return RDI_TypeKind_S32;\n  case CV_BasicType_UINT32    : return RDI_TypeKind_U32;\n  case CV_BasicType_INT64     : return RDI_TypeKind_S64;\n  case CV_BasicType_UINT64    : return RDI_TypeKind_U64;\n  case CV_BasicType_INT128    : return RDI_TypeKind_S128;\n  case CV_BasicType_UINT128   : return RDI_TypeKind_U128;\n  case CV_BasicType_CHAR8     : return RDI_TypeKind_Char8;\n  case CV_BasicType_PTR       : return RDI_TypeKind_Ptr;\n  }\n  return RDI_TypeKind_NULL;\n}\n\ninternal RDI_RegCode\nrdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg)\n{\n  RDI_RegCode result = 0;\n  switch (arch) {\n  case CV_Arch_8086: {\n    switch (reg) {\n#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break;\n        CV_Reg_X86_XList(X)\n#undef X\n    }\n  } break;\n  case CV_Arch_X64: {\n    switch (reg) {\n#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break;\n        CV_Reg_X64_XList(X)\n#undef X\n    }\n  } break;\n  default: NotImplemented;\n  }\n  return result;\n}\n\ninternal RDI_ChecksumKind\nrdi_checksum_from_cv_c13(CV_C13ChecksumKind kind)\n{\n  switch (kind) {\n  case CV_C13ChecksumKind_Null:   return RDI_ChecksumKind_NULL;\n  case CV_C13ChecksumKind_MD5:    return RDI_ChecksumKind_MD5;\n  case CV_C13ChecksumKind_SHA1:   return RDI_ChecksumKind_SHA1;\n  case CV_C13ChecksumKind_SHA256: return RDI_ChecksumKind_SHA256;\n  }\n  return RDI_ChecksumKind_NULL;\n}\n"
  },
  {
    "path": "src/linker/rdi/rdi_cv.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\ninternal RDI_Arch              rdi_arch_from_cv_arch(CV_Arch arch);\ninternal RDI_Language          rdi_language_from_cv_language(CV_Language language);\ninternal RDI_TypeModifierFlags rdi_type_modifier_flags_from_cv_pointer_attribs(CV_PointerAttribs attribs);\ninternal RDI_TypeKind          rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type);\ninternal RDI_RegCode           rdi_reg_code_from_cv(CV_Arch arch, CV_Reg reg);\n\ninternal RDI_ChecksumKind rdi_checksum_from_cv_c13(CV_C13ChecksumKind kind);\n\n\n"
  },
  {
    "path": "src/linker/rdi/rdi_overrides.h",
    "content": "#pragma once\n\ntypedef U8  RDI_U8;\ntypedef U16 RDI_U16;\ntypedef U32 RDI_U32;\ntypedef U64 RDI_U64;\ntypedef S8  RDI_S8;\ntypedef S16 RDI_S16;\ntypedef S32 RDI_S32;\ntypedef S64 RDI_S64;\n\n#define RDI_PROC internal\n#define RDIM_MEMSET_OVERRIDE\n#define rdim_memset MemorySet\n\n#define RDIM_MEMCPY_OVERRIDE\n#define rdim_memcpy MemoryCopy\n\n#define rdim_vsnprintf raddbg_vsnprintf\n\n"
  },
  {
    "path": "src/linker/scripts/obj_paths_from_pdb.py",
    "content": "import subprocess\nimport sys\nimport os\n\ndef get_sorted_objs(pdb_path):\n    result = subprocess.run([\"llvm-pdbutil\", \"dump\", \"--modules\", pdb_path], stdout=subprocess.PIPE, text=True)\n    lines = result.stdout.strip().split('\\n')\n    filtered_lines = [line for line in lines if line.lstrip().startswith(\"Mod \")]\n    # sort by the obj_path portion (line format: \"Mod <imod> <obj_path>\")\n    def extract_path(line):  return line.split(maxsplit=2)[2].lower()\n    #sorted_lines = sorted(filtered_lines, key=extract_path)\n    return filtered_lines\n\nif __name__ == \"__main__\":\n    sorted_objs = get_sorted_objs(sys.argv[1])\n    for l in sorted_objs: print(l.lstrip())\n"
  },
  {
    "path": "src/linker/thread_pool/thread_pool.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal void\ntp_run_tasks(TP_Context *pool, TP_Worker *worker)\n{\n  for (;;) {\n    S64 task_left = ins_atomic_u64_dec_eval(&pool->task_left);\n\n    // are there any tasks left to run?\n    if (task_left < 0) {\n      break;\n    }\n\n    // run task\n    Arena *arena   = pool->task_arena ? pool->task_arena->v[worker->id] : 0;\n    U64    task_id = pool->task_count - (task_left+1);\n    pool->task_func(arena, worker->id, task_id, pool->task_data);\n\n    // cache task count so we dont touch pool memory after atomic inc\n    U64 task_count = pool->task_count;\n\n    // on last task ping main thread\n    U64 task_done = ins_atomic_u64_inc_eval(&pool->task_done);\n    if (task_done == task_count) {\n      os_semaphore_drop(pool->main_semaphore);\n    }\n  }\n}\n\ninternal void\ntp_worker_main(void *raw_worker)\n{\n  TP_Worker  *worker = raw_worker;\n  TP_Context *pool   = worker->pool;\n  for (; pool->is_live; ) {\n    if (os_semaphore_take(pool->task_semaphore, max_U64)) {\n      tp_run_tasks(pool, worker);\n    }\n  }\n}\n\ninternal void\ntp_worker_main_shared(void *raw_worker)\n{\n  TP_Worker  *worker = raw_worker;\n  TP_Context *pool   = worker->pool;\n  for (; pool->is_live; ) {\n    if (os_semaphore_take(pool->exec_semaphore, max_U64)) {\n      if (os_semaphore_take(pool->task_semaphore, max_U64)) {\n        tp_run_tasks(pool, worker);\n      }\n    }\n  }\n}\n\ninternal TP_Context * \ntp_alloc(Arena *arena, U32 worker_count, U32 max_worker_count, String8 name)\n{\n  ProfBeginDynamic(\"Alloc Thread Pool [Worker Count: %u]\", worker_count);\n  AssertAlways(worker_count > 0);\n\n  B32 is_shared = (name.size > 0);\n\n  // alloc semaphores\n  Semaphore main_semaphore = {0};\n  Semaphore task_semaphore = {0};\n  Semaphore exec_semaphore = {0};\n  if (worker_count > 1) {\n    main_semaphore = os_semaphore_alloc(0, 1, str8_zero());\n    if (is_shared) {\n      AssertAlways(worker_count <= max_worker_count);\n      task_semaphore = os_semaphore_alloc(0, max_worker_count, name);\n      exec_semaphore = os_semaphore_alloc(0, worker_count, str8_zero());\n    } else {\n      task_semaphore = os_semaphore_alloc(0, worker_count, str8_zero());\n    }\n  }\n\n  // pick entry point for the workers\n  void *worker_entry = is_shared ? tp_worker_main_shared : tp_worker_main;\n\n  // init pool\n  TP_Context *pool     = push_array(arena, TP_Context, 1);\n  pool->exec_semaphore = exec_semaphore;\n  pool->task_semaphore = task_semaphore;\n  pool->main_semaphore = main_semaphore;\n  pool->is_live        = 1;\n  pool->worker_count   = worker_count;\n  pool->worker_arr     = push_array(arena, TP_Worker, worker_count);\n  \n  // init worker data\n  for (U64 i = 0; i < worker_count; i += 1) {\n    TP_Worker *worker = &pool->worker_arr[i];\n    worker->id        = i;\n    worker->pool      = pool;\n  }\n  \n  // launch worker threads\n  for (U64 i = 1; i < worker_count; i += 1) {\n    TP_Worker *worker = &pool->worker_arr[i];\n    worker->handle    = thread_launch(worker_entry, worker);\n  }\n  \n  ProfEnd();\n  return pool;\n}\n\ninternal void\ntp_release(TP_Context *pool)\n{\n  pool->is_live = 0;\n\n  B32 is_shared = pool->exec_semaphore.u64[0] != 0;\n  if (is_shared) {\n    for (U64 i = 0; i < pool->worker_count; ++i) {\n      semaphore_drop(pool->exec_semaphore);\n    }\n  }\n  for (U64 i = 0; i < pool->worker_count; ++i) {\n    semaphore_drop(pool->task_semaphore);\n  }\n  for (U64 i = 1; i < pool->worker_count; i += 1) {\n    thread_detach(pool->worker_arr[i].handle);\n  }\n  if (is_shared) {\n    semaphore_release(pool->exec_semaphore);\n  }\n  semaphore_release(pool->task_semaphore);\n  semaphore_release(pool->main_semaphore);\n\n  MemoryZeroStruct(pool);\n}\n\ninternal TP_Arena *\ntp_arena_alloc(TP_Context *pool)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(0,0);\n  Arena **arr = push_array(scratch.arena, Arena *, pool->worker_count);\n  for (U64 i = 0; i < pool->worker_count; ++i) {\n    arr[i] = arena_alloc();\n  }\n  Arena **dst = push_array(arr[0], Arena *, pool->worker_count);\n  MemoryCopy(dst, arr, sizeof(Arena*) * pool->worker_count);\n  TP_Arena *worker_arena_arr = push_array(arr[0], TP_Arena, 1);\n  worker_arena_arr->count = pool->worker_count;\n  worker_arena_arr->v = dst;\n  scratch_end(scratch);\n  ProfEnd();\n  return worker_arena_arr;\n}\n\ninternal void\ntp_arena_release(TP_Arena **arena_ptr)\n{\n  ProfBeginFunction();\n  for (U64 i = 1; i < (*arena_ptr)->count; ++i) {\n    arena_release((*arena_ptr)->v[i]);\n  }\n  arena_release((*arena_ptr)->v[0]);\n  *arena_ptr = NULL;\n  ProfEnd();\n}\n\ninternal TP_Temp\ntp_temp_begin(TP_Arena *arena)\n{\n  ProfBeginFunction();\n\n  Temp first_temp = temp_begin(arena->v[0]);\n\n  TP_Temp temp;\n  temp.count = arena->count;\n  temp.v     = push_array_no_zero(first_temp.arena, Temp, arena->count);\n\n  temp.v[0] = first_temp;\n\n  for (U64 arena_idx = 1; arena_idx < arena->count; arena_idx += 1) {\n    temp.v[arena_idx] = temp_begin(arena->v[arena_idx]);\n  }\n\n  ProfEnd();\n  return temp;\n}\n\ninternal void\ntp_temp_end(TP_Temp temp)\n{\n  ProfBeginFunction();\n  for (U64 temp_idx = temp.count - 1; temp_idx > 0; temp_idx -= 1) {\n    temp_end(temp.v[temp_idx]);\n  }\n  ProfEnd();\n}\n\ninternal void\ntp_for_parallel(TP_Context *pool, TP_Arena *task_arena, U64 task_count, TP_TaskFunc *task_func, void *task_data)\n{\n  if (task_count > 0) {\n    // init run\n    pool->task_arena = task_arena;\n    pool->task_func  = task_func;\n    pool->task_data  = task_data;\n    pool->task_count = task_count;\n    pool->task_done  = 0;\n    ins_atomic_u64_eval_assign(&pool->task_left, task_count);\n\n    U64 drop_count = Min(task_count, pool->worker_count);\n\n    // if we are in shared mode ping local semaphore\n    if (pool->exec_semaphore.u64[0] != 0) {\n      for (U64 worker_idx = 0; worker_idx < drop_count; worker_idx +=1) {\n        os_semaphore_drop(pool->exec_semaphore);\n      }\n    }\n    \n    // ping shared semaphore\n    for (U64 worker_idx = 0; worker_idx < drop_count; worker_idx += 1) {\n      os_semaphore_drop(pool->task_semaphore);\n    }\n    \n    // run tasks on main worker\n    tp_run_tasks(pool, &pool->worker_arr[0]);\n    \n    // wait for workers to finish tasks\n    os_semaphore_take(pool->main_semaphore, max_U64);\n  }\n}\n\ninternal Rng1U64 *\ntp_divide_work(Arena *arena, U64 item_count, U32 worker_count)\n{\n  U64      per_count = CeilIntegerDiv(item_count, worker_count);\n  Rng1U64 *range_arr = push_array_no_zero(arena, Rng1U64, worker_count + 1);\n  for (U64 i = 0; i < worker_count; i += 1) {\n    range_arr[i] = rng_1u64(Min(item_count, i * per_count), \n                            Min(item_count, i * per_count + per_count));\n  }\n\n  // thread_pool_dummy_range:\n  range_arr[worker_count] = rng_1u64(item_count, item_count);\n\n  return range_arr;\n}\n"
  },
  {
    "path": "src/linker/thread_pool/thread_pool.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#pragma once\n\n#define THREAD_POOL_TASK_FUNC(name) void name(Arena *arena, U64 worker_id, U64 task_id, void *raw_task)\ntypedef THREAD_POOL_TASK_FUNC(TP_TaskFunc);\n\ntypedef struct TP_Arena\n{\n  U64     count;\n  Arena **v;\n} TP_Arena;\n\ntypedef struct TP_Temp\n{\n  U64   count;\n  Temp *v;\n} TP_Temp;\n\ntypedef struct TP_Worker\n{\n  U64                id;\n  struct TP_Context *pool;\n  Thread             handle;\n} TP_Worker;\n\ntypedef struct TP_Context\n{\n  B32          is_live;\n  Semaphore    exec_semaphore;\n  Semaphore    task_semaphore;\n  Semaphore    main_semaphore;\n\n  U32          worker_count;\n  TP_Worker   *worker_arr;\n\n  TP_Arena    *task_arena;\n  TP_TaskFunc *task_func;\n  void        *task_data;\n  U64          task_count;\n  U64          task_done;\n  S64          task_left;\n} TP_Context;\n\ninternal TP_Context * tp_alloc(Arena *arena, U32 worker_count, U32 max_worker_count, String8 name);\ninternal void         tp_release(TP_Context *pool);\ninternal TP_Arena *   tp_arena_alloc(TP_Context *pool);\ninternal void         tp_arena_release(TP_Arena **arena_ptr);\ninternal TP_Temp      tp_temp_begin(TP_Arena *arena);\ninternal void         tp_temp_end(TP_Temp temp);\n#define tp_for_parallel_prof(pool, arena, task_count, task_func, task_data, zone_name) ProfBegin(zone_name); tp_for_parallel(pool, arena, task_count, task_func, task_data); ProfEnd();\ninternal void         tp_for_parallel(TP_Context *pool, TP_Arena *arena, U64 task_count, TP_TaskFunc *task_func, void *task_data);\ninternal Rng1U64 *    tp_divide_work(Arena *arena, U64 item_count, U32 worker_count);\n\n"
  },
  {
    "path": "src/mdesk/mdesk.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Type Functions\r\n\r\ninternal void\r\nmd_msg_list_push(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, String8 string)\r\n{\r\n  MD_Msg *msg = push_array(arena, MD_Msg, 1);\r\n  msg->node = node;\r\n  msg->kind = kind;\r\n  msg->string = string;\r\n  SLLQueuePush(msgs->first, msgs->last, msg);\r\n  msgs->count += 1;\r\n  msgs->worst_message_kind = Max(kind, msgs->worst_message_kind);\r\n}\r\n\r\ninternal void\r\nmd_msg_list_pushf(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, char *fmt, ...)\r\n{\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(arena, fmt, args);\r\n  md_msg_list_push(arena, msgs, node, kind, string);\r\n  va_end(args);\r\n}\r\n\r\ninternal void\r\nmd_msg_list_concat_in_place(MD_MsgList *dst, MD_MsgList *to_push)\r\n{\r\n  if(to_push->first != 0)\r\n  {\r\n    if(dst->last)\r\n    {\r\n      dst->last->next = to_push->first;\r\n      dst->last = to_push->last;\r\n      dst->count += to_push->count;\r\n      dst->worst_message_kind = Max(dst->worst_message_kind, to_push->worst_message_kind);\r\n    }\r\n    else\r\n    {\r\n      MemoryCopyStruct(dst, to_push);\r\n    }\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Token Type Functions\r\n\r\ninternal MD_Token\r\nmd_token_make(Rng1U64 range, MD_TokenFlags flags)\r\n{\r\n  MD_Token token = {range, flags};\r\n  return token;\r\n}\r\n\r\ninternal B32\r\nmd_token_match(MD_Token a, MD_Token b)\r\n{\r\n  return (a.range.min == b.range.min &&\r\n          a.range.max == b.range.max &&\r\n          a.flags == b.flags);\r\n}\r\n\r\ninternal String8List\r\nmd_string_list_from_token_flags(Arena *arena, MD_TokenFlags flags)\r\n{\r\n  String8List strs = {0};\r\n  if(flags & MD_TokenFlag_Identifier          ){str8_list_push(arena, &strs, str8_lit(\"Identifier\"));}\r\n  if(flags & MD_TokenFlag_Numeric             ){str8_list_push(arena, &strs, str8_lit(\"Numeric\"));}\r\n  if(flags & MD_TokenFlag_StringLiteral       ){str8_list_push(arena, &strs, str8_lit(\"StringLiteral\"));}\r\n  if(flags & MD_TokenFlag_Symbol              ){str8_list_push(arena, &strs, str8_lit(\"Symbol\"));}\r\n  if(flags & MD_TokenFlag_Reserved            ){str8_list_push(arena, &strs, str8_lit(\"Reserved\"));}\r\n  if(flags & MD_TokenFlag_Comment             ){str8_list_push(arena, &strs, str8_lit(\"Comment\"));}\r\n  if(flags & MD_TokenFlag_Whitespace          ){str8_list_push(arena, &strs, str8_lit(\"Whitespace\"));}\r\n  if(flags & MD_TokenFlag_Newline             ){str8_list_push(arena, &strs, str8_lit(\"Newline\"));}\r\n  if(flags & MD_TokenFlag_BrokenComment       ){str8_list_push(arena, &strs, str8_lit(\"BrokenComment\"));}\r\n  if(flags & MD_TokenFlag_BrokenStringLiteral ){str8_list_push(arena, &strs, str8_lit(\"BrokenStringLiteral\"));}\r\n  if(flags & MD_TokenFlag_BadCharacter        ){str8_list_push(arena, &strs, str8_lit(\"BadCharacter\"));}\r\n  return strs;\r\n}\r\n\r\ninternal void\r\nmd_token_chunk_list_push(Arena *arena, MD_TokenChunkList *list, U64 cap, MD_Token token)\r\n{\r\n  MD_TokenChunkNode *node = list->last;\r\n  if(node == 0 || node->count >= node->cap)\r\n  {\r\n    node = push_array(arena, MD_TokenChunkNode, 1);\r\n    node->cap = cap;\r\n    node->v = push_array_no_zero(arena, MD_Token, cap);\r\n    SLLQueuePush(list->first, list->last, node);\r\n    list->chunk_count += 1;\r\n  }\r\n  MemoryCopyStruct(&node->v[node->count], &token);\r\n  node->count += 1;\r\n  list->total_token_count += 1;\r\n}\r\n\r\ninternal MD_TokenArray\r\nmd_token_array_from_chunk_list(Arena *arena, MD_TokenChunkList *chunks)\r\n{\r\n  MD_TokenArray result = {0};\r\n  result.count = chunks->total_token_count;\r\n  result.v = push_array_no_zero(arena, MD_Token, result.count);\r\n  U64 write_idx = 0;\r\n  for(MD_TokenChunkNode *n = chunks->first; n != 0; n = n->next)\r\n  {\r\n    MemoryCopy(result.v+write_idx, n->v, sizeof(MD_Token)*n->count);\r\n    write_idx += n->count;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nmd_content_string_from_token_flags_str8(MD_TokenFlags flags, String8 string)\r\n{\r\n  U64 num_chop = 0;\r\n  U64 num_skip = 0;\r\n  {\r\n    num_skip += 3*!!(flags & MD_TokenFlag_StringTriplet);\r\n    num_chop += 3*!!(flags & MD_TokenFlag_StringTriplet);\r\n    num_skip += 1*(!(flags & MD_TokenFlag_StringTriplet) && flags & MD_TokenFlag_StringLiteral);\r\n    num_chop += 1*(!(flags & MD_TokenFlag_StringTriplet) && flags & MD_TokenFlag_StringLiteral);\r\n  }\r\n  String8 result = string;\r\n  result = str8_chop(result, num_chop);\r\n  result = str8_skip(result, num_skip);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Type Functions\r\n\r\n//- rjf: flag conversions\r\n\r\ninternal MD_NodeFlags\r\nmd_node_flags_from_token_flags(MD_TokenFlags flags)\r\n{\r\n  MD_NodeFlags result = 0;\r\n  result |=         MD_NodeFlag_Identifier*!!(flags&MD_TokenFlag_Identifier);\r\n  result |=            MD_NodeFlag_Numeric*!!(flags&MD_TokenFlag_Numeric);\r\n  result |=      MD_NodeFlag_StringLiteral*!!(flags&MD_TokenFlag_StringLiteral);\r\n  result |=             MD_NodeFlag_Symbol*!!(flags&MD_TokenFlag_Symbol);\r\n  result |= MD_NodeFlag_StringSingleQuote *!!(flags&MD_TokenFlag_StringSingleQuote);\r\n  result |= MD_NodeFlag_StringDoubleQuote *!!(flags&MD_TokenFlag_StringDoubleQuote);\r\n  result |=         MD_NodeFlag_StringTick*!!(flags&MD_TokenFlag_StringTick);\r\n  result |=      MD_NodeFlag_StringTriplet*!!(flags&MD_TokenFlag_StringTriplet);\r\n  return result;\r\n}\r\n\r\n//- rjf: nil\r\n\r\ninternal B32\r\nmd_node_is_nil(MD_Node *node)\r\n{\r\n  return (node == 0 || node == &md_nil_node || node->kind == MD_NodeKind_Nil);\r\n}\r\n\r\n//- rjf: iteration\r\n\r\ninternal MD_NodeRec\r\nmd_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off)\r\n{\r\n  MD_NodeRec rec = {0};\r\n  rec.next = &md_nil_node;\r\n  if(!md_node_is_nil(*MemberFromOffset(MD_Node **, node, child_off)))\r\n  {\r\n    rec.next = *MemberFromOffset(MD_Node **, node, child_off);\r\n    rec.push_count = 1;\r\n  }\r\n  else for(MD_Node *p = node; !md_node_is_nil(p) && p != subtree_root; p = p->parent, rec.pop_count += 1)\r\n  {\r\n    if(!md_node_is_nil(*MemberFromOffset(MD_Node **, p, sib_off)))\r\n    {\r\n      rec.next = *MemberFromOffset(MD_Node **, p, sib_off);\r\n      break;\r\n    }\r\n  }\r\n  return rec;\r\n}\r\n\r\n//- rjf: tree building\r\n\r\ninternal MD_Node *\r\nmd_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset)\r\n{\r\n  MD_Node *node = push_array(arena, MD_Node, 1);\r\n  node->first = node->last = node->parent = node->next = node->prev = node->first_tag = node->last_tag = &md_nil_node;\r\n  node->kind       = kind;\r\n  node->flags      = flags;\r\n  node->string     = string;\r\n  node->raw_string = raw_string;\r\n  node->src_offset = src_offset;\r\n  return node;\r\n}\r\n\r\ninternal void\r\nmd_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node)\r\n{\r\n  node->parent = parent;\r\n  DLLInsert_NPZ(&md_nil_node, parent->first, parent->last, prev_child, node, next, prev);\r\n}\r\n\r\ninternal void\r\nmd_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node)\r\n{\r\n  node->kind = MD_NodeKind_Tag;\r\n  node->parent = parent;\r\n  DLLInsert_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, prev_child, node, next, prev);\r\n}\r\n\r\ninternal void\r\nmd_node_push_child(MD_Node *parent, MD_Node *node)\r\n{\r\n  node->parent = parent;\r\n  DLLPushBack_NPZ(&md_nil_node, parent->first, parent->last, node, next, prev);\r\n}\r\n\r\ninternal void\r\nmd_node_push_tag(MD_Node *parent, MD_Node *node)\r\n{\r\n  node->kind = MD_NodeKind_Tag;\r\n  node->parent = parent;\r\n  DLLPushBack_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev);\r\n}\r\n\r\ninternal void\r\nmd_unhook(MD_Node *node)\r\n{\r\n  MD_Node *parent = node->parent;\r\n  if(!md_node_is_nil(parent))\r\n  {\r\n    if(node->kind == MD_NodeKind_Tag)\r\n    {\r\n      DLLRemove_NPZ(&md_nil_node, parent->first_tag, parent->last_tag, node, next, prev);\r\n    }\r\n    else\r\n    {\r\n      DLLRemove_NPZ(&md_nil_node, parent->first, parent->last, node, next, prev);\r\n    }\r\n    node->parent = &md_nil_node;\r\n  }\r\n}\r\n\r\n//- rjf: tree introspection\r\n\r\ninternal MD_Node *\r\nmd_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags)\r\n{\r\n  MD_Node *result = &md_nil_node;\r\n  for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next)\r\n  {\r\n    if(str8_match(n->string, string, flags))\r\n    {\r\n      result = n;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MD_Node *\r\nmd_node_from_chain_index(MD_Node *first, MD_Node *opl, U64 index)\r\n{\r\n  MD_Node *result = &md_nil_node;\r\n  S64 idx = 0;\r\n  for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next, idx += 1)\r\n  {\r\n    if(index == idx)\r\n    {\r\n      result = n;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MD_Node *\r\nmd_node_from_chain_flags(MD_Node *first, MD_Node *opl, MD_NodeFlags flags)\r\n{\r\n  MD_Node *result = &md_nil_node;\r\n  for(MD_Node *n = first; !md_node_is_nil(n) && n != opl; n = n->next)\r\n  {\r\n    if(n->flags & flags)\r\n    {\r\n      result = n;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nmd_index_from_node(MD_Node *node)\r\n{\r\n  U64 index = 0;\r\n  for(MD_Node *n = node->prev; !md_node_is_nil(n); n = n->prev)\r\n  {\r\n    index += 1;\r\n  }\r\n  return index;\r\n}\r\n\r\ninternal MD_Node *\r\nmd_root_from_node(MD_Node *node)\r\n{\r\n  MD_Node *result = node;\r\n  for(MD_Node *p = node->parent; (p->kind == MD_NodeKind_Main || p->kind == MD_NodeKind_Tag) && !md_node_is_nil(p); p = p->parent)\r\n  {\r\n    result = p;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MD_Node *\r\nmd_child_from_string(MD_Node *node, String8 child_string, StringMatchFlags flags)\r\n{\r\n  return md_node_from_chain_string(node->first, &md_nil_node, child_string, flags);\r\n}\r\n\r\ninternal MD_Node *\r\nmd_tag_from_string(MD_Node *node, String8 tag_string, StringMatchFlags flags)\r\n{\r\n  return md_node_from_chain_string(node->first_tag, &md_nil_node, tag_string, flags);\r\n}\r\n\r\ninternal MD_Node *\r\nmd_child_from_index(MD_Node *node, U64 index)\r\n{\r\n  return md_node_from_chain_index(node->first, &md_nil_node, index);\r\n}\r\n\r\ninternal MD_Node *\r\nmd_tag_from_index(MD_Node *node, U64 index)\r\n{\r\n  return md_node_from_chain_index(node->first_tag, &md_nil_node, index);\r\n}\r\n\r\ninternal MD_Node *\r\nmd_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index)\r\n{\r\n  MD_Node *tag = md_tag_from_string(node, tag_string, flags);\r\n  return md_child_from_index(tag, index);\r\n}\r\n\r\ninternal MD_Node *\r\nmd_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags)\r\n{\r\n  MD_Node *tag = md_tag_from_string(node, tag_string, tag_str_flags);\r\n  MD_Node *arg = md_child_from_string(tag, arg_string, arg_str_flags);\r\n  return arg;\r\n}\r\n\r\ninternal B32\r\nmd_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags)\r\n{\r\n  return !md_node_is_nil(md_child_from_string(node, string, flags));\r\n}\r\n\r\ninternal B32\r\nmd_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags)\r\n{\r\n  return !md_node_is_nil(md_tag_from_string(node, string, flags));\r\n}\r\n\r\ninternal U64\r\nmd_child_count_from_node(MD_Node *node)\r\n{\r\n  U64 result = 0;\r\n  for(MD_Node *child = node->first; !md_node_is_nil(child); child = child->next)\r\n  {\r\n    result += 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nmd_tag_count_from_node(MD_Node *node)\r\n{\r\n  U64 result = 0;\r\n  for(MD_Node *child = node->first_tag; !md_node_is_nil(child); child = child->next)\r\n  {\r\n    result += 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nmd_string_from_children(Arena *arena, MD_Node *root)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strs = {0};\r\n  for MD_EachNode(child, root->first)\r\n  {\r\n    if(child->flags == child->prev->flags)\r\n    {\r\n      str8_list_push(scratch.arena, &strs, str8_lit(\" \"));\r\n    }\r\n    str8_list_push(scratch.arena, &strs, child->string);\r\n  }\r\n  String8 result = str8_list_join(arena, &strs, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: tree comparison\r\n\r\ninternal B32\r\nmd_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags)\r\n{\r\n  B32 result = 0;\r\n  if(a->kind == b->kind && str8_match(a->string, b->string, flags))\r\n  {\r\n    result = 1;\r\n    if(result)\r\n    {\r\n      result = result && a->flags == b->flags;\r\n    }\r\n    if(result && a->kind != MD_NodeKind_Tag)\r\n    {\r\n      for(MD_Node *a_tag = a->first_tag, *b_tag = b->first_tag;\r\n          !md_node_is_nil(a_tag) || !md_node_is_nil(b_tag);\r\n          a_tag = a_tag->next, b_tag = b_tag->next)\r\n      {\r\n        if(md_node_match(a_tag, b_tag, flags))\r\n        {\r\n          for(MD_Node *a_tag_arg = a_tag->first, *b_tag_arg = b_tag->first;\r\n              !md_node_is_nil(a_tag_arg) || !md_node_is_nil(b_tag_arg);\r\n              a_tag_arg = a_tag_arg->next, b_tag_arg = b_tag_arg->next)\r\n          {\r\n            if(!md_tree_match(a_tag_arg, b_tag_arg, flags))\r\n            {\r\n              result = 0;\r\n              goto end;\r\n            }\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result = 0;\r\n          goto end;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  end:;\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nmd_tree_match(MD_Node *a, MD_Node *b, StringMatchFlags flags)\r\n{\r\n  B32 result = md_node_match(a, b, flags);\r\n  if(result)\r\n  {\r\n    for(MD_Node *a_child = a->first, *b_child = b->first;\r\n        !md_node_is_nil(a_child) || !md_node_is_nil(b_child);\r\n        a_child = a_child->next, b_child = b_child->next)\r\n    {\r\n      if(!md_tree_match(a_child, b_child, flags))\r\n      {\r\n        result = 0;\r\n        goto end;\r\n      }\r\n    }\r\n  }\r\n  end:;\r\n  return result;\r\n}\r\n\r\n//- rjf: tree duplication\r\n\r\ninternal MD_Node *\r\nmd_tree_copy(Arena *arena, MD_Node *src_root)\r\n{\r\n  MD_Node *dst_root = &md_nil_node;\r\n  MD_Node *dst_parent = dst_root;\r\n  {\r\n    MD_NodeRec rec = {0};\r\n    for(MD_Node *src = src_root; !md_node_is_nil(src); src = rec.next)\r\n    {\r\n      MD_Node *dst = push_array(arena, MD_Node, 1);\r\n      dst->first = dst->last = dst->parent = dst->next = dst->prev = &md_nil_node;\r\n      dst->first_tag = dst->last_tag = &md_nil_node;\r\n      dst->kind  = src->kind;\r\n      dst->flags = src->flags;\r\n      dst->string = push_str8_copy(arena, src->string);\r\n      dst->raw_string = push_str8_copy(arena, src->raw_string);\r\n      dst->src_offset = src->src_offset;\r\n      dst->parent = dst_parent;\r\n      if(dst_parent != &md_nil_node)\r\n      {\r\n        DLLPushBack_NPZ(&md_nil_node, dst_parent->first, dst_parent->last, dst, next, prev);\r\n      }\r\n      else\r\n      {\r\n        dst_root = dst_parent = dst;\r\n      }\r\n      rec = md_node_rec_depth_first_pre(src, src_root);\r\n      if(rec.push_count != 0)\r\n      {\r\n        dst_parent = dst;\r\n      }\r\n      else for(U64 idx = 0; idx < rec.pop_count; idx += 1)\r\n      {\r\n        dst_parent = dst_parent->parent;\r\n      }\r\n    }\r\n  }\r\n  return dst_root;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text -> Tokens Functions\r\n\r\ninternal MD_TokenizeResult\r\nmd_tokenize_from_text(Arena *arena, String8 text)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  MD_TokenChunkList tokens = {0};\r\n  MD_MsgList msgs = {0};\r\n  U8 *byte_first = text.str;\r\n  U8 *byte_opl = byte_first + text.size;\r\n  U8 *byte = byte_first;\r\n  \r\n  //- rjf: scan string & produce tokens\r\n  for(;byte < byte_opl;)\r\n  {\r\n    MD_TokenFlags token_flags = 0;\r\n    U8 *token_start = 0;\r\n    U8 *token_opl = 0;\r\n    \r\n    //- rjf: whitespace\r\n    if(token_flags == 0 && (*byte == ' ' || *byte == '\\t' || *byte == '\\v' || *byte == '\\r'))\r\n    {\r\n      token_flags = MD_TokenFlag_Whitespace;\r\n      token_start = byte;\r\n      token_opl = byte;\r\n      byte += 1;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        token_opl += 1;\r\n        if(byte == byte_opl || (*byte != ' ' && *byte != '\\t' && *byte != '\\v' && *byte != '\\r'))\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: newlines\r\n    if(token_flags == 0 && *byte == '\\n')\r\n    {\r\n      token_flags = MD_TokenFlag_Newline;\r\n      token_start = byte;\r\n      token_opl = byte+1;\r\n      byte += 1;\r\n    }\r\n    \r\n    //- rjf: single-line comments\r\n    if(token_flags == 0 && (byte+1 < byte_opl && *byte == '/' && byte[1] == '/'))\r\n    {\r\n      token_flags = MD_TokenFlag_Comment;\r\n      token_start = byte;\r\n      token_opl = byte+2;\r\n      byte += 2;\r\n      B32 escaped = 0;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        token_opl += 1;\r\n        if(byte == byte_opl)\r\n        {\r\n          break;\r\n        }\r\n        if(escaped)\r\n        {\r\n          escaped = 0;\r\n        }\r\n        else\r\n        {\r\n          if(*byte == '\\n')\r\n          {\r\n            break;\r\n          }\r\n          else if(*byte == '\\\\')\r\n          {\r\n            escaped = 1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: multi-line comments\r\n    if(token_flags == 0 && (byte+1 < byte_opl && *byte == '/' && byte[1] == '*'))\r\n    {\r\n      token_flags = MD_TokenFlag_Comment;\r\n      token_start = byte;\r\n      token_opl = byte+2;\r\n      byte += 2;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        token_opl += 1;\r\n        if(byte == byte_opl)\r\n        {\r\n          token_flags |= MD_TokenFlag_BrokenComment;\r\n          break;\r\n        }\r\n        if(byte+1 < byte_opl && byte[0] == '*' && byte[1] == '/')\r\n        {\r\n          token_opl += 2;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: identifiers\r\n    if(token_flags == 0 && (('A' <= *byte && *byte <= 'Z') ||\r\n                            ('a' <= *byte && *byte <= 'z') ||\r\n                            *byte == '_' ||\r\n                            utf8_class[*byte>>3] >= 2 ))\r\n    {\r\n      token_flags = MD_TokenFlag_Identifier;\r\n      token_start = byte;\r\n      token_opl = byte;\r\n      byte += 1;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        token_opl += 1;\r\n        if(byte == byte_opl ||\r\n           (!('A' <= *byte && *byte <= 'Z') &&\r\n            !('a' <= *byte && *byte <= 'z') &&\r\n            !('0' <= *byte && *byte <= '9') &&\r\n            *byte != '_' &&\r\n            utf8_class[*byte>>3] < 2))\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: numerics\r\n    if(token_flags == 0 && (('0' <= *byte && *byte <= '9') ||\r\n                            (*byte == '.' && byte+1 < byte_opl && '0' <= byte[1] && byte[1] <= '9') ||\r\n                            (*byte == '-' && byte+1 < byte_opl && '0' <= byte[1] && byte[1] <= '9') ||\r\n                            *byte == '_'))\r\n    {\r\n      token_flags = MD_TokenFlag_Numeric;\r\n      token_start = byte;\r\n      token_opl = byte;\r\n      byte += 1;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        token_opl += 1;\r\n        if(byte == byte_opl ||\r\n           (!('A' <= *byte && *byte <= 'Z') &&\r\n            !('a' <= *byte && *byte <= 'z') &&\r\n            !('0' <= *byte && *byte <= '9') &&\r\n            *byte != '_' &&\r\n            *byte != '.'))\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: triplet string literals\r\n    if(token_flags == 0 && byte+2 < byte_opl &&\r\n       ((byte[0] == '\"' && byte[1] == '\"' && byte[2] == '\"') ||\r\n        (byte[0] == '\\''&& byte[1] == '\\''&& byte[2] == '\\'') ||\r\n        (byte[0] == '`' && byte[1] == '`' && byte[2] == '`')))\r\n    {\r\n      U8 literal_style = byte[0];\r\n      token_flags = MD_TokenFlag_StringLiteral|MD_TokenFlag_StringTriplet;\r\n      token_flags |= (literal_style == '\\'')*MD_TokenFlag_StringSingleQuote;\r\n      token_flags |= (literal_style ==  '\"')*MD_TokenFlag_StringDoubleQuote;\r\n      token_flags |= (literal_style ==  '`')*MD_TokenFlag_StringTick;\r\n      token_start = byte;\r\n      token_opl = byte+3;\r\n      byte += 3;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        if(byte == byte_opl)\r\n        {\r\n          token_flags |= MD_TokenFlag_BrokenStringLiteral;\r\n          token_opl = byte;\r\n          break;\r\n        }\r\n        if(byte+2 < byte_opl && (byte[0] == literal_style && byte[1] == literal_style && byte[2] == literal_style))\r\n        {\r\n          byte += 3;\r\n          token_opl = byte;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: singlet string literals\r\n    if(token_flags == 0 && (byte[0] == '\"' || byte[0] == '\\'' || byte[0] == '`'))\r\n    {\r\n      U8 literal_style = byte[0];\r\n      token_flags = MD_TokenFlag_StringLiteral;\r\n      token_flags |= (literal_style == '\\'')*MD_TokenFlag_StringSingleQuote;\r\n      token_flags |= (literal_style ==  '\"')*MD_TokenFlag_StringDoubleQuote;\r\n      token_flags |= (literal_style ==  '`')*MD_TokenFlag_StringTick;\r\n      token_start = byte;\r\n      token_opl = byte+1;\r\n      byte += 1;\r\n      B32 escaped = 0;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        if(byte == byte_opl || *byte == '\\n')\r\n        {\r\n          token_opl = byte;\r\n          token_flags |= MD_TokenFlag_BrokenStringLiteral;\r\n          break;\r\n        }\r\n        if(!escaped && byte[0] == '\\\\')\r\n        {\r\n          escaped = 1;\r\n        }\r\n        else if(!escaped && byte[0] == literal_style)\r\n        {\r\n          token_opl = byte+1;\r\n          byte += 1;\r\n          break;\r\n        }\r\n        else if(escaped)\r\n        {\r\n          escaped = 0;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: non-reserved symbols\r\n    if(token_flags == 0 && (*byte == '~' || *byte == '!' || *byte == '$' || *byte == '%' || *byte == '^' ||\r\n                            *byte == '&' || *byte == '*' || *byte == '-' || *byte == '=' || *byte == '+' ||\r\n                            *byte == '<' || *byte == '.' || *byte == '>' || *byte == '/' || *byte == '?' ||\r\n                            *byte == '|'))\r\n    {\r\n      token_flags = MD_TokenFlag_Symbol;\r\n      token_start = byte;\r\n      token_opl = byte;\r\n      byte += 1;\r\n      for(;byte <= byte_opl; byte += 1)\r\n      {\r\n        token_opl += 1;\r\n        if(byte == byte_opl ||\r\n           (*byte != '~' && *byte != '!' && *byte != '$' && *byte != '%' && *byte != '^' &&\r\n            *byte != '&' && *byte != '*' && *byte != '-' && *byte != '=' && *byte != '+' &&\r\n            *byte != '<' && *byte != '.' && *byte != '>' && *byte != '/' && *byte != '?' &&\r\n            *byte != '|'))\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: reserved symbols\r\n    if(token_flags == 0 && (*byte == '{' || *byte == '}' || *byte == '(' || *byte == ')' ||\r\n                            *byte == '[' || *byte == ']' || *byte == '#' || *byte == ',' ||\r\n                            *byte == '\\\\'|| *byte == ':' || *byte == ';' || *byte == '@'))\r\n    {\r\n      token_flags = MD_TokenFlag_Reserved;\r\n      token_start = byte;\r\n      token_opl = byte+1;\r\n      byte += 1;\r\n    }\r\n    \r\n    //- rjf: bad characters in all other cases\r\n    if(token_flags == 0)\r\n    {\r\n      token_flags = MD_TokenFlag_BadCharacter;\r\n      token_start = byte;\r\n      token_opl = byte+1;\r\n      byte += 1;\r\n    }\r\n    \r\n    //- rjf; push token if formed\r\n    if(token_flags != 0 && token_start != 0 && token_opl > token_start)\r\n    {\r\n      MD_Token token = {{(U64)(token_start - byte_first), (U64)(token_opl - byte_first)}, token_flags};\r\n      md_token_chunk_list_push(scratch.arena, &tokens, 4096, token);\r\n    }\r\n    \r\n    //- rjf: push errors on unterminated comments\r\n    if(token_flags & MD_TokenFlag_BrokenComment)\r\n    {\r\n      MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(\"\"), str8_lit(\"\"), token_start - byte_first);\r\n      String8 error_string = str8_lit(\"Unterminated comment.\");\r\n      md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string);\r\n    }\r\n    \r\n    //- rjf: push errors on unterminated strings\r\n    if(token_flags & MD_TokenFlag_BrokenStringLiteral)\r\n    {\r\n      MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, str8_lit(\"\"), str8_lit(\"\"), token_start - byte_first);\r\n      String8 error_string = str8_lit(\"Unterminated string literal.\");\r\n      md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string);\r\n    }\r\n  }\r\n  \r\n  //- rjf: bake, fill & return\r\n  MD_TokenizeResult result = {0};\r\n  {\r\n    result.tokens = md_token_array_from_chunk_list(arena, &tokens);\r\n    result.msgs = msgs;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Tokens -> Tree Functions\r\n\r\ninternal MD_ParseResult\r\nmd_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_TokenArray tokens)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: set up outputs\r\n  MD_MsgList msgs = {0};\r\n  MD_Node *root = md_push_node(arena, MD_NodeKind_File, 0, filename, text, 0);\r\n  \r\n  //- rjf: set up parse rule stack\r\n  typedef enum MD_ParseWorkKind\r\n  {\r\n    MD_ParseWorkKind_Main,\r\n    MD_ParseWorkKind_MainImplicit,\r\n    MD_ParseWorkKind_NodeOptionalFollowUp,\r\n    MD_ParseWorkKind_NodeChildrenStyleScan,\r\n  }\r\n  MD_ParseWorkKind;\r\n  typedef struct MD_ParseWorkNode MD_ParseWorkNode;\r\n  struct MD_ParseWorkNode\r\n  {\r\n    MD_ParseWorkNode *next;\r\n    MD_ParseWorkKind kind;\r\n    MD_Node *parent;\r\n    MD_Node *first_gathered_tag;\r\n    MD_Node *last_gathered_tag;\r\n    MD_NodeFlags gathered_node_flags;\r\n    S32 counted_newlines;\r\n  };\r\n  MD_ParseWorkNode first_work =\r\n  {\r\n    0,\r\n    MD_ParseWorkKind_Main,\r\n    root,\r\n  };\r\n  MD_ParseWorkNode broken_work = { 0, MD_ParseWorkKind_Main, root,};\r\n  MD_ParseWorkNode *work_top = &first_work;\r\n  MD_ParseWorkNode *work_free = 0;\r\n#define MD_ParseWorkPush(work_kind, work_parent) do\\\r\n{\\\r\nMD_ParseWorkNode *work_node = work_free;\\\r\nif(work_node == 0) {work_node = push_array(scratch.arena, MD_ParseWorkNode, 1);}\\\r\nelse { SLLStackPop(work_free); }\\\r\nwork_node->kind = (work_kind);\\\r\nwork_node->parent = (work_parent);\\\r\nSLLStackPush(work_top, work_node);\\\r\n}while(0)\r\n#define MD_ParseWorkPop() do\\\r\n{\\\r\nSLLStackPop(work_top);\\\r\nif(work_top == 0) {work_top = &broken_work;}\\\r\n}while(0)\r\n  \r\n  //- rjf: parse\r\n  MD_Token *tokens_first = tokens.v;\r\n  MD_Token *tokens_opl = tokens_first + tokens.count;\r\n  MD_Token *token = tokens_first;\r\n  for(;token < tokens_opl;)\r\n  {\r\n    //- rjf: unpack token\r\n    String8 token_string = str8_substr(text, token[0].range);\r\n    \r\n    //- rjf: whitespace -> always no-op & inc\r\n    if(token->flags & MD_TokenFlag_Whitespace)\r\n    {\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: comments -> always no-op & inc\r\n    if(token->flags & MD_TokenGroup_Comment)\r\n    {\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [node follow up] : following label -> work top parent has children. we need\r\n    // to scan for explicit delimiters, else parse an implicitly delimited set of children\r\n    if(work_top->kind == MD_ParseWorkKind_NodeOptionalFollowUp && str8_match(token_string, str8_lit(\":\"), 0))\r\n    {\r\n      MD_Node *parent = work_top->parent;\r\n      MD_ParseWorkPop();\r\n      MD_ParseWorkPush(MD_ParseWorkKind_NodeChildrenStyleScan, parent);\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [node follow up] anything but : following label -> node has no children. just\r\n    // pop & move on\r\n    if(work_top->kind == MD_ParseWorkKind_NodeOptionalFollowUp)\r\n    {\r\n      MD_ParseWorkPop();\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main] separators -> mark & inc\r\n    if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\",\"), 0) ||\r\n        str8_match(token_string, str8_lit(\";\"), 0)))\r\n    {\r\n      MD_Node *parent = work_top->parent;\r\n      if(!md_node_is_nil(parent->last))\r\n      {\r\n        parent->last->flags |=     MD_NodeFlag_IsBeforeComma*!!str8_match(token_string, str8_lit(\",\"), 0);\r\n        parent->last->flags |= MD_NodeFlag_IsBeforeSemicolon*!!str8_match(token_string, str8_lit(\";\"), 0);\r\n        work_top->gathered_node_flags |=     MD_NodeFlag_IsAfterComma*!!str8_match(token_string, str8_lit(\",\"), 0);\r\n        work_top->gathered_node_flags |= MD_NodeFlag_IsAfterSemicolon*!!str8_match(token_string, str8_lit(\";\"), 0);\r\n      }\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main_implicit] separators -> pop\r\n    if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\",\"), 0) ||\r\n        str8_match(token_string, str8_lit(\";\"), 0)))\r\n    {\r\n      MD_ParseWorkPop();\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main, main_implicit] unexpected reserved tokens\r\n    if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) &&\r\n       token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\"#\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"\\\\\"), 0) ||\r\n        str8_match(token_string, str8_lit(\":\"), 0)))\r\n    {\r\n      MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min);\r\n      String8 error_string = push_str8f(arena, \"Unexpected reserved symbol \\\"%S\\\".\", token_string);\r\n      md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string);\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main, main_implicit] tag signifier -> create new tag\r\n    if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) &&\r\n       token[0].flags & MD_TokenFlag_Reserved && str8_match(token_string, str8_lit(\"@\"), 0))\r\n    {\r\n      if(token+1 >= tokens_opl ||\r\n         !(token[1].flags & MD_TokenGroup_Label))\r\n      {\r\n        MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min);\r\n        String8 error_string = str8_lit(\"Tag label expected after @ symbol.\");\r\n        md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string);\r\n        token += 1;\r\n        goto end_consume;\r\n      }\r\n      else\r\n      {\r\n        String8 tag_name_raw = str8_substr(text, token[1].range);\r\n        String8 tag_name = md_content_string_from_token_flags_str8(token[1].flags, tag_name_raw);\r\n        MD_Node *node = md_push_node(arena, MD_NodeKind_Tag, md_node_flags_from_token_flags(token[1].flags), tag_name, tag_name_raw, token[0].range.min);\r\n        DLLPushBack_NPZ(&md_nil_node, work_top->first_gathered_tag, work_top->last_gathered_tag, node, next, prev);\r\n        if(token+2 < tokens_opl && token[2].flags & MD_TokenFlag_Reserved &&\r\n           (str8_match(str8_substr(text, token[2].range), str8_lit(\"(\"), 0) ||\r\n            str8_match(str8_substr(text, token[2].range), str8_lit(\"[\"), 0) ||\r\n            str8_match(str8_substr(text, token[2].range), str8_lit(\"{\"), 0)))\r\n        {\r\n          token += 3;\r\n          MD_ParseWorkPush(MD_ParseWorkKind_Main, node);\r\n        }\r\n        else\r\n        {\r\n          token += 2;\r\n        }\r\n        goto end_consume;\r\n      }\r\n    }\r\n    \r\n    //- rjf: [main, main_implicit] label -> create new main\r\n    if((work_top->kind == MD_ParseWorkKind_Main || work_top->kind == MD_ParseWorkKind_MainImplicit) &&\r\n       token->flags & MD_TokenGroup_Label)\r\n    {\r\n      String8 node_string_raw = token_string;\r\n      String8 node_string = md_content_string_from_token_flags_str8(token->flags, node_string_raw);\r\n      MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags;\r\n      work_top->gathered_node_flags = 0;\r\n      MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, node_string, node_string_raw, token[0].range.min);\r\n      node->first_tag = work_top->first_gathered_tag;\r\n      node->last_tag = work_top->last_gathered_tag;\r\n      for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next)\r\n      {\r\n        tag->parent = node;\r\n      }\r\n      work_top->first_gathered_tag = work_top->last_gathered_tag = &md_nil_node;\r\n      md_node_push_child(work_top->parent, node);\r\n      MD_ParseWorkPush(MD_ParseWorkKind_NodeOptionalFollowUp, node);\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main] {s, [s, and (s -> create new main\r\n    if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\"{\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"[\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"(\"), 0)))\r\n    {\r\n      MD_NodeFlags flags = md_node_flags_from_token_flags(token->flags)|work_top->gathered_node_flags;\r\n      flags |=   MD_NodeFlag_HasBraceLeft*!!str8_match(token_string, str8_lit(\"{\"), 0);\r\n      flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit(\"[\"), 0);\r\n      flags |=   MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit(\"(\"), 0);\r\n      work_top->gathered_node_flags = 0;\r\n      MD_Node *node = md_push_node(arena, MD_NodeKind_Main, flags, str8_lit(\"\"), str8_lit(\"\"), token[0].range.min);\r\n      node->first_tag = work_top->first_gathered_tag;\r\n      node->last_tag = work_top->last_gathered_tag;\r\n      for(MD_Node *tag = work_top->first_gathered_tag; !md_node_is_nil(tag); tag = tag->next)\r\n      {\r\n        tag->parent = node;\r\n      }\r\n      work_top->first_gathered_tag = work_top->last_gathered_tag = &md_nil_node;\r\n      md_node_push_child(work_top->parent, node);\r\n      MD_ParseWorkPush(MD_ParseWorkKind_Main, node);\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [node children style scan] {s, [s, and (s -> explicitly delimited children\r\n    if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan && token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\"{\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"[\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"(\"), 0)))\r\n    {\r\n      MD_Node *parent = work_top->parent;\r\n      parent->flags |=   MD_NodeFlag_HasBraceLeft*!!str8_match(token_string, str8_lit(\"{\"), 0);\r\n      parent->flags |= MD_NodeFlag_HasBracketLeft*!!str8_match(token_string, str8_lit(\"[\"), 0);\r\n      parent->flags |=   MD_NodeFlag_HasParenLeft*!!str8_match(token_string, str8_lit(\"(\"), 0);\r\n      MD_ParseWorkPop();\r\n      MD_ParseWorkPush(MD_ParseWorkKind_Main, parent);\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [node children style scan] count newlines\r\n    if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan && token->flags & MD_TokenFlag_Newline)\r\n    {\r\n      work_top->counted_newlines += 1;\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main_implicit] newline -> pop *all* current implicit work tasks\r\n    if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Newline)\r\n    {\r\n      for(;work_top->kind == MD_ParseWorkKind_MainImplicit;)\r\n      {\r\n        MD_ParseWorkPop();\r\n      }\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [all but main_implicit] newline -> no-op & inc\r\n    if(work_top->kind != MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Newline)\r\n    {\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [node children style scan] anything causing implicit set -> <2 newlines, all good,\r\n    // >=2 newlines, houston we have a problem\r\n    if(work_top->kind == MD_ParseWorkKind_NodeChildrenStyleScan)\r\n    {\r\n      if(work_top->counted_newlines >= 2)\r\n      {\r\n        MD_Node *node = work_top->parent;\r\n        MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min);\r\n        String8 error_string = push_str8f(arena, \"More than two newlines following \\\"%S\\\", which has implicitly-delimited children, resulting in an empty list of children.\", node->string);\r\n        md_msg_list_push(arena, &msgs, error, MD_MsgKind_Warning, error_string);\r\n        MD_ParseWorkPop();\r\n      }\r\n      else\r\n      {\r\n        MD_Node *parent = work_top->parent;\r\n        MD_ParseWorkPop();\r\n        MD_ParseWorkPush(MD_ParseWorkKind_MainImplicit, parent);\r\n      }\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main] }s, ]s, and )s -> pop\r\n    if(work_top->kind == MD_ParseWorkKind_Main && token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\"}\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"]\"), 0) ||\r\n        str8_match(token_string, str8_lit(\")\"), 0)))\r\n    {\r\n      MD_Node *parent = work_top->parent;\r\n      parent->flags |=   MD_NodeFlag_HasBraceRight*!!str8_match(token_string, str8_lit(\"}\"), 0);\r\n      parent->flags |= MD_NodeFlag_HasBracketRight*!!str8_match(token_string, str8_lit(\"]\"), 0);\r\n      parent->flags |=   MD_NodeFlag_HasParenRight*!!str8_match(token_string, str8_lit(\")\"), 0);\r\n      MD_ParseWorkPop();\r\n      token += 1;\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: [main implicit] }s, ]s, and )s -> pop without advancing\r\n    if(work_top->kind == MD_ParseWorkKind_MainImplicit && token->flags & MD_TokenFlag_Reserved &&\r\n       (str8_match(token_string, str8_lit(\"}\"), 0) ||\r\n        str8_match(token_string, str8_lit(\"]\"), 0) ||\r\n        str8_match(token_string, str8_lit(\")\"), 0)))\r\n    {\r\n      MD_ParseWorkPop();\r\n      goto end_consume;\r\n    }\r\n    \r\n    //- rjf: no consumption -> unexpected token! we don't know what to do with this.\r\n    {\r\n      MD_Node *error = md_push_node(arena, MD_NodeKind_ErrorMarker, 0, token_string, token_string, token->range.min);\r\n      String8 error_string = push_str8f(arena, \"Unexpected \\\"%S\\\" token.\", token_string);\r\n      md_msg_list_push(arena, &msgs, error, MD_MsgKind_Error, error_string);\r\n      token += 1;\r\n    }\r\n    \r\n    end_consume:;\r\n  }\r\n  \r\n  //- rjf: fill & return\r\n  MD_ParseResult result = {0};\r\n  result.root = root;\r\n  result.msgs = msgs;\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Bundled Text -> Tree Functions\r\n\r\ninternal MD_ParseResult\r\nmd_parse_from_text(Arena *arena, String8 filename, String8 text)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  MD_TokenizeResult tokenize = md_tokenize_from_text(scratch.arena, text);\r\n  MD_ParseResult parse = md_parse_from_text_tokens(arena, filename, text, tokenize.tokens); \r\n  scratch_end(scratch);\r\n  return parse;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Tree -> Text Functions\r\n\r\ninternal String8List\r\nmd_debug_string_list_from_tree(Arena *arena, MD_Node *root)\r\n{\r\n  String8List strings = {0};\r\n  {\r\n    char *indentation = \"                                                                                                                                \";\r\n    S32 depth = 0;\r\n    for(MD_Node *node = root, *next = &md_nil_node; !md_node_is_nil(node); node = next)\r\n    {\r\n      // rjf: get next recursion\r\n      MD_NodeRec rec = md_node_rec_depth_first_pre(node, root);\r\n      next = rec.next;\r\n      \r\n      // rjf: extract node info\r\n      String8 kind_string = str8_lit(\"Unknown\");\r\n      switch(node->kind)\r\n      {\r\n        default:{}break;\r\n        case MD_NodeKind_File:       {kind_string = str8_lit(\"File\");       }break;\r\n        case MD_NodeKind_ErrorMarker:{kind_string = str8_lit(\"ErrorMarker\");}break;\r\n        case MD_NodeKind_Main:       {kind_string = str8_lit(\"Main\");       }break;\r\n        case MD_NodeKind_Tag:        {kind_string = str8_lit(\"Tag\");        }break;\r\n        case MD_NodeKind_List:       {kind_string = str8_lit(\"List\");       }break;\r\n        case MD_NodeKind_Reference:  {kind_string = str8_lit(\"Reference\");  }break;\r\n      }\r\n      \r\n      // rjf: push node line\r\n      str8_list_pushf(arena, &strings, \"%.*s\\\"%S\\\" : %S\", depth, indentation, node->string, kind_string);\r\n      \r\n      // rjf: children -> open brace\r\n      if(rec.push_count != 0)\r\n      {\r\n        str8_list_pushf(arena, &strings, \"%.*s{\", depth, indentation);\r\n      }\r\n      \r\n      // rjf: descend\r\n      depth += rec.push_count;\r\n      \r\n      // rjf: popping -> close braces\r\n      for(S32 pop_idx = 0; pop_idx < rec.pop_count; pop_idx += 1)\r\n      {\r\n        str8_list_pushf(arena, &strings, \"%.*s}\", depth-1-pop_idx, indentation);\r\n      }\r\n      \r\n      // rjf: ascend\r\n      depth -= rec.pop_count;\r\n    }\r\n  }\r\n  return strings;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Pointer List Functions\r\n\r\ninternal void\r\nmd_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node)\r\n{\r\n  MD_NodePtrNode *n = push_array(arena, MD_NodePtrNode, 1);\r\n  n->v = node;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal void\r\nmd_node_ptr_list_push_front(Arena *arena, MD_NodePtrList *list, MD_Node *node)\r\n{\r\n  MD_NodePtrNode *n = push_array(arena, MD_NodePtrNode, 1);\r\n  n->v = node;\r\n  SLLQueuePushFront(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\n"
  },
  {
    "path": "src/mdesk/mdesk.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef MDESK_H\r\n#define MDESK_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Messages\r\n\r\ntypedef enum MD_MsgKind\r\n{\r\n  MD_MsgKind_Null,\r\n  MD_MsgKind_Note,\r\n  MD_MsgKind_Warning,\r\n  MD_MsgKind_Error,\r\n  MD_MsgKind_FatalError,\r\n}\r\nMD_MsgKind;\r\n\r\ntypedef struct MD_Msg MD_Msg;\r\nstruct MD_Msg\r\n{\r\n  MD_Msg *next;\r\n  struct MD_Node *node;\r\n  MD_MsgKind kind;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct MD_MsgList MD_MsgList;\r\nstruct MD_MsgList\r\n{\r\n  MD_Msg *first;\r\n  MD_Msg *last;\r\n  U64 count;\r\n  MD_MsgKind worst_message_kind;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Token Types\r\n\r\ntypedef U32 MD_TokenFlags;\r\nenum\r\n{\r\n  // rjf: base kind info\r\n  MD_TokenFlag_Identifier          = (1<<0),\r\n  MD_TokenFlag_Numeric             = (1<<1),\r\n  MD_TokenFlag_StringLiteral       = (1<<2),\r\n  MD_TokenFlag_Symbol              = (1<<3),\r\n  MD_TokenFlag_Reserved            = (1<<4),\r\n  MD_TokenFlag_Comment             = (1<<5),\r\n  MD_TokenFlag_Whitespace          = (1<<6),\r\n  MD_TokenFlag_Newline             = (1<<7),\r\n  \r\n  // rjf: decoration info\r\n  MD_TokenFlag_StringSingleQuote   = (1<<8),\r\n  MD_TokenFlag_StringDoubleQuote   = (1<<9),\r\n  MD_TokenFlag_StringTick          = (1<<10),\r\n  MD_TokenFlag_StringTriplet       = (1<<11),\r\n  \r\n  // rjf: error info\r\n  MD_TokenFlag_BrokenComment       = (1<<12),\r\n  MD_TokenFlag_BrokenStringLiteral = (1<<13),\r\n  MD_TokenFlag_BadCharacter        = (1<<14),\r\n};\r\n\r\ntypedef U32 MD_TokenGroups;\r\nenum\r\n{\r\n  MD_TokenGroup_Comment    = MD_TokenFlag_Comment,\r\n  MD_TokenGroup_Whitespace = (MD_TokenFlag_Whitespace|\r\n                              MD_TokenFlag_Newline),\r\n  MD_TokenGroup_Irregular  = (MD_TokenGroup_Comment|\r\n                              MD_TokenGroup_Whitespace),\r\n  MD_TokenGroup_Regular    = ~MD_TokenGroup_Irregular,\r\n  MD_TokenGroup_Label      = (MD_TokenFlag_Identifier|\r\n                              MD_TokenFlag_Numeric|\r\n                              MD_TokenFlag_StringLiteral|\r\n                              MD_TokenFlag_Symbol),\r\n  MD_TokenGroup_Error      = (MD_TokenFlag_BrokenComment|\r\n                              MD_TokenFlag_BrokenStringLiteral|\r\n                              MD_TokenFlag_BadCharacter),\r\n};\r\n\r\ntypedef struct MD_Token MD_Token;\r\nstruct MD_Token\r\n{\r\n  Rng1U64 range;\r\n  MD_TokenFlags flags;\r\n};\r\n\r\ntypedef struct MD_TokenChunkNode MD_TokenChunkNode;\r\nstruct MD_TokenChunkNode\r\n{\r\n  MD_TokenChunkNode *next;\r\n  MD_Token *v;\r\n  U64 count;\r\n  U64 cap;\r\n};\r\n\r\ntypedef struct MD_TokenChunkList MD_TokenChunkList;\r\nstruct MD_TokenChunkList\r\n{\r\n  MD_TokenChunkNode *first;\r\n  MD_TokenChunkNode *last;\r\n  U64 chunk_count;\r\n  U64 total_token_count;\r\n};\r\n\r\ntypedef struct MD_TokenArray MD_TokenArray;\r\nstruct MD_TokenArray\r\n{\r\n  MD_Token *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Types\r\n\r\ntypedef enum MD_NodeKind\r\n{\r\n  MD_NodeKind_Nil,\r\n  MD_NodeKind_File,\r\n  MD_NodeKind_ErrorMarker,\r\n  MD_NodeKind_Main,\r\n  MD_NodeKind_Tag,\r\n  MD_NodeKind_List,\r\n  MD_NodeKind_Reference,\r\n  MD_NodeKind_COUNT\r\n}\r\nMD_NodeKind;\r\n\r\ntypedef U32 MD_NodeFlags;\r\nenum\r\n{\r\n  MD_NodeFlag_MaskSetDelimiters          = (0x3F<<0),\r\n  MD_NodeFlag_HasParenLeft               = (1<<0),\r\n  MD_NodeFlag_HasParenRight              = (1<<1),\r\n  MD_NodeFlag_HasBracketLeft             = (1<<2),\r\n  MD_NodeFlag_HasBracketRight            = (1<<3),\r\n  MD_NodeFlag_HasBraceLeft               = (1<<4),\r\n  MD_NodeFlag_HasBraceRight              = (1<<5),\r\n  \r\n  MD_NodeFlag_MaskSeparators             = (0xF<<6),\r\n  MD_NodeFlag_IsBeforeSemicolon          = (1<<6),\r\n  MD_NodeFlag_IsAfterSemicolon           = (1<<7),\r\n  MD_NodeFlag_IsBeforeComma              = (1<<8),\r\n  MD_NodeFlag_IsAfterComma               = (1<<9),\r\n  \r\n  MD_NodeFlag_MaskStringDelimiters       = (0xF<<10),\r\n  MD_NodeFlag_StringSingleQuote          = (1<<10),\r\n  MD_NodeFlag_StringDoubleQuote          = (1<<11),\r\n  MD_NodeFlag_StringTick                 = (1<<12),\r\n  MD_NodeFlag_StringTriplet              = (1<<13),\r\n  \r\n  MD_NodeFlag_MaskLabelKind              = (0xF<<14),\r\n  MD_NodeFlag_Numeric                    = (1<<14),\r\n  MD_NodeFlag_Identifier                 = (1<<15),\r\n  MD_NodeFlag_StringLiteral              = (1<<16),\r\n  MD_NodeFlag_Symbol                     = (1<<17),\r\n};\r\n#define MD_NodeFlag_AfterFromBefore(f) ((f) << 1)\r\n\r\ntypedef struct MD_Node MD_Node;\r\nstruct MD_Node\r\n{\r\n  // rjf: tree links\r\n  MD_Node *next;\r\n  MD_Node *prev;\r\n  MD_Node *parent;\r\n  MD_Node *first;\r\n  MD_Node *last;\r\n  \r\n  // rjf: tag links\r\n  MD_Node *first_tag;\r\n  MD_Node *last_tag;\r\n  \r\n  // rjf: node info\r\n  MD_NodeKind kind;\r\n  MD_NodeFlags flags;\r\n  String8 string;\r\n  String8 raw_string;\r\n  \r\n  // rjf: source code info\r\n  U64 src_offset;\r\n  \r\n  // rjf: user-controlled generation number\r\n  //\r\n  // (unused by mdesk layer, but can be used by usage code to use MD_Node trees\r\n  // in a \"retained mode\" way, where stable generational handles can be formed\r\n  // to nodes)\r\n  U64 user_gen;\r\n  \r\n  // rjf: extra padding to 128 bytes\r\n  U64 _unused_[2];\r\n};\r\n\r\ntypedef struct MD_NodeRec MD_NodeRec;\r\nstruct MD_NodeRec\r\n{\r\n  MD_Node *next;\r\n  S32 push_count;\r\n  S32 pop_count;\r\n};\r\n\r\ntypedef struct MD_NodePtrNode MD_NodePtrNode;\r\nstruct MD_NodePtrNode\r\n{\r\n  MD_NodePtrNode *next;\r\n  MD_Node *v;\r\n};\r\n\r\ntypedef struct MD_NodePtrList MD_NodePtrList;\r\nstruct MD_NodePtrList\r\n{\r\n  MD_NodePtrNode *first;\r\n  MD_NodePtrNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Text -> Tokens Types\r\n\r\ntypedef struct MD_TokenizeResult MD_TokenizeResult;\r\nstruct MD_TokenizeResult\r\n{\r\n  MD_TokenArray tokens;\r\n  MD_MsgList msgs;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Tokens -> Tree Types\r\n\r\ntypedef struct MD_ParseResult MD_ParseResult;\r\nstruct MD_ParseResult\r\n{\r\n  MD_Node *root;\r\n  MD_MsgList msgs;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal read_only MD_Node md_nil_node =\r\n{\r\n  &md_nil_node,\r\n  &md_nil_node,\r\n  &md_nil_node,\r\n  &md_nil_node,\r\n  &md_nil_node,\r\n  &md_nil_node,\r\n  &md_nil_node,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Type Functions\r\n\r\ninternal void md_msg_list_push(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, String8 string);\r\ninternal void md_msg_list_pushf(Arena *arena, MD_MsgList *msgs, MD_Node *node, MD_MsgKind kind, char *fmt, ...);\r\ninternal void md_msg_list_concat_in_place(MD_MsgList *dst, MD_MsgList *to_push);\r\n\r\n////////////////////////////////\r\n//~ rjf: Token Type Functions\r\n\r\ninternal MD_Token md_token_make(Rng1U64 range, MD_TokenFlags flags);\r\ninternal B32 md_token_match(MD_Token a, MD_Token b);\r\ninternal String8List md_string_list_from_token_flags(Arena *arena, MD_TokenFlags flags);\r\ninternal void md_token_chunk_list_push(Arena *arena, MD_TokenChunkList *list, U64 cap, MD_Token token);\r\ninternal MD_TokenArray md_token_array_from_chunk_list(Arena *arena, MD_TokenChunkList *chunks);\r\ninternal String8 md_content_string_from_token_flags_str8(MD_TokenFlags flags, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Type Functions\r\n\r\n//- rjf: flag conversions\r\ninternal MD_NodeFlags md_node_flags_from_token_flags(MD_TokenFlags flags);\r\n\r\n//- rjf: nil\r\ninternal B32 md_node_is_nil(MD_Node *node);\r\n\r\n//- rjf: iteration\r\n#define MD_EachNode(it, first) (MD_Node *it = first; !md_node_is_nil(it); it = it->next)\r\ninternal MD_NodeRec md_node_rec_depth_first(MD_Node *node, MD_Node *subtree_root, U64 child_off, U64 sib_off);\r\n#define md_node_rec_depth_first_pre(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, first), OffsetOf(MD_Node, next))\r\n#define md_node_rec_depth_first_pre_rev(node, subtree_root) md_node_rec_depth_first((node), (subtree_root), OffsetOf(MD_Node, last), OffsetOf(MD_Node, prev))\r\n\r\n//- rjf: tree building\r\ninternal MD_Node *md_push_node(Arena *arena, MD_NodeKind kind, MD_NodeFlags flags, String8 string, String8 raw_string, U64 src_offset);\r\ninternal void md_node_insert_child(MD_Node *parent, MD_Node *prev_child, MD_Node *node);\r\ninternal void md_node_insert_tag(MD_Node *parent, MD_Node *prev_child, MD_Node *node);\r\ninternal void md_node_push_child(MD_Node *parent, MD_Node *node);\r\ninternal void md_node_push_tag(MD_Node *parent, MD_Node *node);\r\ninternal void md_unhook(MD_Node *node);\r\n\r\n//- rjf: tree introspection\r\ninternal MD_Node *  md_node_from_chain_string(MD_Node *first, MD_Node *opl, String8 string, StringMatchFlags flags);\r\ninternal MD_Node *  md_node_from_chain_index(MD_Node *first, MD_Node *opl, U64 index);\r\ninternal MD_Node *  md_node_from_chain_flags(MD_Node *first, MD_Node *opl, MD_NodeFlags flags);\r\ninternal U64        md_index_from_node(MD_Node *node);\r\ninternal MD_Node *  md_root_from_node(MD_Node *node);\r\ninternal MD_Node *  md_child_from_string(MD_Node *node, String8 child_string, StringMatchFlags flags);\r\ninternal MD_Node *  md_tag_from_string(MD_Node *node, String8 tag_string, StringMatchFlags flags);\r\ninternal MD_Node *  md_child_from_index(MD_Node *node, U64 index);\r\ninternal MD_Node *  md_tag_from_index(MD_Node *node, U64 index);\r\ninternal MD_Node *  md_tag_arg_from_index(MD_Node *node, String8 tag_string, StringMatchFlags flags, U64 index);\r\ninternal MD_Node *  md_tag_arg_from_string(MD_Node *node, String8 tag_string, StringMatchFlags tag_str_flags, String8 arg_string, StringMatchFlags arg_str_flags);\r\ninternal B32        md_node_has_child(MD_Node *node, String8 string, StringMatchFlags flags);\r\ninternal B32        md_node_has_tag(MD_Node *node, String8 string, StringMatchFlags flags);\r\ninternal U64        md_child_count_from_node(MD_Node *node);\r\ninternal U64        md_tag_count_from_node(MD_Node *node);\r\ninternal String8    md_string_from_children(Arena *arena, MD_Node *root);\r\n\r\n//- rjf: tree comparison\r\ninternal B32 md_tree_match(MD_Node *a, MD_Node *b, StringMatchFlags flags);\r\ninternal B32 md_node_match(MD_Node *a, MD_Node *b, StringMatchFlags flags);\r\n\r\n//- rjf: tree duplication\r\ninternal MD_Node *md_tree_copy(Arena *arena, MD_Node *src_root);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text -> Tokens Functions\r\n\r\ninternal MD_TokenizeResult md_tokenize_from_text(Arena *arena, String8 text);\r\n\r\n////////////////////////////////\r\n//~ rjf: Tokens -> Tree Functions\r\n\r\ninternal MD_ParseResult md_parse_from_text_tokens(Arena *arena, String8 filename, String8 text, MD_TokenArray tokens);\r\n\r\n////////////////////////////////\r\n//~ rjf: Bundled Text -> Tree Functions\r\n\r\ninternal MD_ParseResult md_parse_from_text(Arena *arena, String8 filename, String8 text);\r\n#define md_tree_from_string(arena, string) (md_parse_from_text((arena), str8_zero(), (string)).root)\r\n\r\n////////////////////////////////\r\n//~ rjf: Tree -> Text Functions\r\n\r\ninternal String8List md_debug_string_list_from_tree(Arena *arena, MD_Node *root);\r\n\r\n////////////////////////////////\r\n//~ rjf: Node Pointer List Functions\r\n\r\ninternal void md_node_ptr_list_push(Arena *arena, MD_NodePtrList *list, MD_Node *node);\r\ninternal void md_node_ptr_list_push_front(Arena *arena, MD_NodePtrList *list, MD_Node *node);\r\n\r\n#endif // MDESK_H\r\n"
  },
  {
    "path": "src/metagen/metagen.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: String Expression Operator Tables\r\n\r\nread_only global String8 mg_str_expr_op_symbol_string_table[MG_StrExprOp_COUNT] =\r\n{\r\n  str8_lit_comp(\"\"),\r\n  str8_lit_comp(\".\"),  // MG_StrExprOp_Dot\r\n  str8_lit_comp(\"->\"), // MG_StrExprOp_ExpandIfTrue\r\n  str8_lit_comp(\"..\"), // MG_StrExprOp_Concat\r\n  str8_lit_comp(\"=>\"), // MG_StrExprOp_BumpToColumn\r\n  str8_lit_comp(\"+\"),  // MG_StrExprOp_Add\r\n  str8_lit_comp(\"-\"),  // MG_StrExprOp_Subtract\r\n  str8_lit_comp(\"*\"),  // MG_StrExprOp_Multiply\r\n  str8_lit_comp(\"/\"),  // MG_StrExprOp_Divide\r\n  str8_lit_comp(\"%\"),  // MG_StrExprOp_Modulo\r\n  str8_lit_comp(\"<<\"), // MG_StrExprOp_LeftShift\r\n  str8_lit_comp(\">>\"), // MG_StrExprOp_RightShift\r\n  str8_lit_comp(\"&\"),  // MG_StrExprOp_BitwiseAnd\r\n  str8_lit_comp(\"|\"),  // MG_StrExprOp_BitwiseOr\r\n  str8_lit_comp(\"^\"),  // MG_StrExprOp_BitwiseXor\r\n  str8_lit_comp(\"~\"),  // MG_StrExprOp_BitwiseNegate\r\n  str8_lit_comp(\"&&\"), // MG_StrExprOp_BooleanAnd\r\n  str8_lit_comp(\"||\"), // MG_StrExprOp_BooleanOr\r\n  str8_lit_comp(\"!\"),  // MG_StrExprOp_BooleanNot\r\n  str8_lit_comp(\"==\"), // MG_StrExprOp_Equals\r\n  str8_lit_comp(\"!=\"), // MG_StrExprOp_DoesNotEqual\r\n};\r\n\r\nread_only global S8 mg_str_expr_op_precedence_table[MG_StrExprOp_COUNT] =\r\n{\r\n  0,\r\n  20, // MG_StrExprOp_Dot\r\n  1,  // MG_StrExprOp_ExpandIfTrue\r\n  2,  // MG_StrExprOp_Concat\r\n  12, // MG_StrExprOp_BumpToColumn\r\n  5,  // MG_StrExprOp_Add\r\n  5,  // MG_StrExprOp_Subtract\r\n  6,  // MG_StrExprOp_Multiply\r\n  6,  // MG_StrExprOp_Divide\r\n  6,  // MG_StrExprOp_Modulo\r\n  7,  // MG_StrExprOp_LeftShift\r\n  7,  // MG_StrExprOp_RightShift\r\n  8,  // MG_StrExprOp_BitwiseAnd\r\n  10, // MG_StrExprOp_BitwiseOr\r\n  9,  // MG_StrExprOp_BitwiseXor\r\n  11, // MG_StrExprOp_BitwiseNegate\r\n  3,  // MG_StrExprOp_BooleanAnd\r\n  3,  // MG_StrExprOp_BooleanOr\r\n  11, // MG_StrExprOp_BooleanNot\r\n  4,  // MG_StrExprOp_Equals\r\n  4,  // MG_StrExprOp_DoesNotEqual\r\n};\r\n\r\nread_only global MG_StrExprOpKind mg_str_expr_op_kind_table[MG_StrExprOp_COUNT] =\r\n{\r\n  MG_StrExprOpKind_Null,\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Dot\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_ExpandIfTrue\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Concat\r\n  MG_StrExprOpKind_Prefix, // MG_StrExprOp_BumpToColumn\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Add\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Subtract\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Multiply\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Divide\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Modulo\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_LeftShift\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_RightShift\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseAnd\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseOr\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_BitwiseXor\r\n  MG_StrExprOpKind_Prefix, // MG_StrExprOp_BitwiseNegate\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanAnd\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_BooleanOr\r\n  MG_StrExprOpKind_Prefix, // MG_StrExprOp_BooleanNot\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_Equals\r\n  MG_StrExprOpKind_Binary, // MG_StrExprOp_DoesNotEqual\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64\r\nmg_hash_from_string(String8 string)\r\n{\r\n  U64 result = 5381;\r\n  for(U64 i = 0; i < string.size; i += 1)\r\n  {\r\n    result = ((result << 5) + result) + string.str[i];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtPt\r\nmg_txt_pt_from_string_off(String8 string, U64 off)\r\n{\r\n  TxtPt pt = txt_pt(1, 1);\r\n  for(U64 idx = 0; idx < string.size && idx < off; idx += 1)\r\n  {\r\n    if(string.str[idx] == '\\n')\r\n    {\r\n      pt.line += 1;\r\n      pt.column = 1;\r\n    }\r\n    else\r\n    {\r\n      pt.column += 1;\r\n    }\r\n  }\r\n  return pt;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Lists\r\n\r\ninternal void\r\nmg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg)\r\n{\r\n  MG_MsgNode *n = push_array(arena, MG_MsgNode, 1);\r\n  MemoryCopyStruct(&n->v, msg);\r\n  SLLQueuePush(msgs->first, msgs->last, n);\r\n  msgs->count += 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Escaping\r\n\r\ninternal String8\r\nmg_escaped_from_str8(Arena *arena, String8 string)\r\n{\r\n  // NOTE(rjf): This doesn't handle hex/octal/unicode escape sequences right\r\n  // now, just the simple stuff.\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strs = {0};\r\n  U64 start = 0;\r\n  for(U64 idx = 0; idx <= string.size; idx += 1)\r\n  {\r\n    if(idx == string.size || string.str[idx] == '\\\\' || string.str[idx] == '\\r')\r\n    {\r\n      String8 str = str8_substr(string, r1u64(start, idx));\r\n      if(str.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &strs, str);\r\n      }\r\n      start = idx+1;\r\n    }\r\n    if(idx < string.size && string.str[idx] == '\\\\')\r\n    {\r\n      U8 next_char = string.str[idx+1];\r\n      U8 replace_byte = 0;\r\n      switch(next_char)\r\n      {\r\n        default:{}break;\r\n        case 'a': replace_byte = 0x07; break;\r\n        case 'b': replace_byte = 0x08; break;\r\n        case 'e': replace_byte = 0x1b; break;\r\n        case 'f': replace_byte = 0x0c; break;\r\n        case 'n': replace_byte = 0x0a; break;\r\n        case 'r': replace_byte = 0x0d; break;\r\n        case 't': replace_byte = 0x09; break;\r\n        case 'v': replace_byte = 0x0b; break;\r\n        case '\\\\':replace_byte = '\\\\'; break;\r\n        case '\\'':replace_byte = '\\''; break;\r\n        case '\"': replace_byte = '\"';  break;\r\n        case '?': replace_byte = '?';  break;\r\n      }\r\n      String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1));\r\n      str8_list_push(scratch.arena, &strs, replace_string);\r\n      if(replace_byte == '\\\\' || replace_byte == '\"' || replace_byte == '\\'')\r\n      {\r\n        idx += 1;\r\n        start += 1;\r\n      }\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &strs, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Wrapping\r\n\r\ninternal String8List\r\nmg_wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent)\r\n{\r\n  String8List list = {0};\r\n  Rng1U64 line_range = r1u64(0, 0);\r\n  U64 wrapped_indent_level = 0;\r\n  static char *spaces = \"                                                                \";\r\n  for (U64 idx = 0; idx <= string.size; idx += 1){\r\n    U8 chr = idx < string.size ? string.str[idx] : 0;\r\n    if (chr == '\\n'){\r\n      Rng1U64 candidate_line_range = line_range;\r\n      candidate_line_range.max = idx;\r\n      // NOTE(nick): when wrapping is interrupted with \\n we emit a string without including \\n\r\n      // because later tool_fprint_list inserts separator after each node\r\n      // except for last node, so don't strip last \\n.\r\n      if (idx + 1 == string.size){\r\n        candidate_line_range.max += 1;\r\n      }\r\n      String8 substr = str8_substr(string, candidate_line_range);\r\n      str8_list_push(arena, &list, substr);\r\n      line_range = r1u64(idx+1,idx+1);\r\n    }\r\n    else\r\n      if (char_is_space(chr) || chr == 0){\r\n      Rng1U64 candidate_line_range = line_range;\r\n      candidate_line_range.max = idx;\r\n      String8 substr = str8_substr(string, candidate_line_range);\r\n      U64 width_this_line = max_width-wrapped_indent_level;\r\n      if (list.node_count == 0){\r\n        width_this_line = first_line_max_width;\r\n      }\r\n      if (substr.size > width_this_line){\r\n        String8 line = str8_substr(string, line_range);\r\n        if (wrapped_indent_level > 0){\r\n          line = push_str8f(arena, \"%.*s%S\", wrapped_indent_level, spaces, line);\r\n        }\r\n        str8_list_push(arena, &list, line);\r\n        line_range = r1u64(line_range.max+1, candidate_line_range.max);\r\n        wrapped_indent_level = ClampTop(64, wrap_indent);\r\n      }\r\n      else{\r\n        line_range = candidate_line_range;\r\n      }\r\n    }\r\n  }\r\n  if (line_range.min < string.size && line_range.max > line_range.min){\r\n    String8 line = str8_substr(string, line_range);\r\n    if (wrapped_indent_level > 0){\r\n      line = push_str8f(arena, \"%.*s%S\", wrapped_indent_level, spaces, line);\r\n    }\r\n    str8_list_push(arena, &list, line);\r\n  }\r\n  return list;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: C-String-Izing\r\n\r\ninternal String8\r\nmg_c_string_literal_from_multiline_string(String8 string)\r\n{\r\n  String8List strings = {0};\r\n  {\r\n    str8_list_push(mg_arena, &strings, str8_lit(\"\\\"\\\"\\n\"));\r\n    U64 active_line_start_off = 0;\r\n    for(U64 off = 0; off <= string.size; off += 1)\r\n    {\r\n      B32 is_newline = (off < string.size && (string.str[off] == '\\n' || string.str[off] == '\\r'));\r\n      B32 is_ender = (off >= string.size || is_newline);\r\n      if(is_ender)\r\n      {\r\n        String8 line = str8_substr(string, r1u64(active_line_start_off, off));\r\n        str8_list_push(mg_arena, &strings, str8_lit(\"\\\"\"));\r\n        str8_list_push(mg_arena, &strings, line);\r\n        if(is_newline)\r\n        {\r\n          str8_list_push(mg_arena, &strings, str8_lit(\"\\\\n\\\"\\n\"));\r\n        }\r\n        else\r\n        {\r\n          str8_list_push(mg_arena, &strings, str8_lit(\"\\\"\\n\"));\r\n        }\r\n        active_line_start_off = off+1;\r\n      }\r\n      if(is_newline && string.str[off] == '\\r')\r\n      {\r\n        active_line_start_off += 1;\r\n        off += 1;\r\n      }\r\n    }\r\n  }\r\n  String8 result = str8_list_join(mg_arena, &strings, 0);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nmg_c_array_literal_contents_from_data(String8 data)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8List strings = {0};\r\n  {\r\n    for(U64 off = 0; off < data.size;)\r\n    {\r\n      U64 chunk_size = Min(data.size-off, 64);\r\n      U8 *chunk_bytes = data.str+off;\r\n      String8 chunk_text_string = {0};\r\n      chunk_text_string.size = chunk_size*5;\r\n      chunk_text_string.str = push_array(mg_arena, U8, chunk_text_string.size);\r\n      for(U64 byte_idx = 0; byte_idx < chunk_size; byte_idx += 1)\r\n      {\r\n        String8 byte_str = push_str8f(scratch.arena, \"0x%02x,\", chunk_bytes[byte_idx]);\r\n        MemoryCopy(chunk_text_string.str+byte_idx*5, byte_str.str, byte_str.size);\r\n      }\r\n      off += chunk_size;\r\n      str8_list_push(mg_arena, &strings, chunk_text_string);\r\n      str8_list_push(mg_arena, &strings, str8_lit(\"\\n\"));\r\n    }\r\n  }\r\n  String8 result = str8_list_join(mg_arena, &strings, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Map Functions\r\n\r\ninternal MG_Map\r\nmg_push_map(Arena *arena, U64 slot_count)\r\n{\r\n  MG_Map map = {0};\r\n  map.slots_count = slot_count;\r\n  map.slots = push_array(arena, MG_MapSlot, map.slots_count);\r\n  return map;\r\n}\r\n\r\ninternal void *\r\nmg_map_ptr_from_string(MG_Map *map, String8 string)\r\n{\r\n  void *result = 0;\r\n  {\r\n    U64 hash = mg_hash_from_string(string);\r\n    U64 slot_idx = hash%map->slots_count;\r\n    MG_MapSlot *slot = &map->slots[slot_idx];\r\n    for(MG_MapNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->key, string, 0))\r\n      {\r\n        result = n->val;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nmg_map_insert_ptr(Arena *arena, MG_Map *map, String8 string, void *val)\r\n{\r\n  U64 hash = mg_hash_from_string(string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  MG_MapSlot *slot = &map->slots[slot_idx];\r\n  MG_MapNode *n = push_array(arena, MG_MapNode, 1);\r\n  n->key = push_str8_copy(arena, string);\r\n  n->val = val;\r\n  SLLQueuePush(slot->first, slot->last, n);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Expression Parsing\r\n\r\ninternal MG_StrExpr *\r\nmg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node)\r\n{\r\n  MG_StrExpr *expr = push_array(arena, MG_StrExpr, 1);\r\n  MemoryCopyStruct(expr, &mg_str_expr_nil);\r\n  expr->op = op;\r\n  expr->node = node;\r\n  return expr;\r\n}\r\n\r\ninternal MG_StrExprParseResult\r\nmg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec)\r\n{\r\n  MG_StrExprParseResult parse = {&mg_str_expr_nil};\r\n  {\r\n    MD_Node *it = first;\r\n    \r\n    //- rjf: consume prefix operators\r\n    MG_StrExpr *leafmost_op = &mg_str_expr_nil;\r\n    for(;it != opl && !md_node_is_nil(it);)\r\n    {\r\n      MG_StrExprOp found_op = MG_StrExprOp_Null;\r\n      for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1);\r\n          op < MG_StrExprOp_COUNT;\r\n          op = (MG_StrExprOp)(op+1))\r\n      {\r\n        if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Prefix &&\r\n           str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) &&\r\n           mg_str_expr_op_precedence_table[op] >= min_prec)\r\n        {\r\n          found_op = op;\r\n          break;\r\n        }\r\n      }\r\n      if(found_op != MG_StrExprOp_Null)\r\n      {\r\n        MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it);\r\n        if(leafmost_op == &mg_str_expr_nil)\r\n        {\r\n          leafmost_op = op_expr;\r\n        }\r\n        op_expr->left = parse.root;\r\n        parse.root = op_expr;\r\n        it = it->next;\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    \r\n    //- rjf: parse atom\r\n    {\r\n      MG_StrExpr *atom = &mg_str_expr_nil;\r\n      if(it->flags & (MD_NodeFlag_Identifier|MD_NodeFlag_Numeric|MD_NodeFlag_StringLiteral) &&\r\n         md_node_is_nil(it->first))\r\n      {\r\n        atom = mg_push_str_expr(arena, MG_StrExprOp_Null, it);\r\n        it = it->next;\r\n      }\r\n      else if(!md_node_is_nil(it->first))\r\n      {\r\n        MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it->first, &md_nil_node, 0);\r\n        atom = subparse.root;\r\n        md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs);\r\n        it = it->next;\r\n      }\r\n      if(leafmost_op != &mg_str_expr_nil)\r\n      {\r\n        leafmost_op->left = atom;\r\n      }\r\n      else\r\n      {\r\n        parse.root = atom;\r\n      }\r\n    }\r\n    \r\n    //- rjf: parse binary operator extensions at this precedence level\r\n    for(;it != opl && !md_node_is_nil(it);)\r\n    {\r\n      // rjf: find binary op kind of `it`\r\n      MG_StrExprOp found_op = MG_StrExprOp_Null;\r\n      for(MG_StrExprOp op = (MG_StrExprOp)(MG_StrExprOp_Null+1);\r\n          op < MG_StrExprOp_COUNT;\r\n          op = (MG_StrExprOp)(op+1))\r\n      {\r\n        if(mg_str_expr_op_kind_table[op] == MG_StrExprOpKind_Binary &&\r\n           str8_match(it->string, mg_str_expr_op_symbol_string_table[op], 0) &&\r\n           mg_str_expr_op_precedence_table[op] >= min_prec)\r\n        {\r\n          found_op = op;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: good found_op -> build binary expr\r\n      if(found_op != MG_StrExprOp_Null)\r\n      {\r\n        MG_StrExpr *op_expr = mg_push_str_expr(arena, found_op, it);\r\n        if(leafmost_op == &mg_str_expr_nil)\r\n        {\r\n          leafmost_op = op_expr;\r\n        }\r\n        op_expr->left = parse.root;\r\n        parse.root = op_expr;\r\n        it = it->next;\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n      \r\n      // rjf: parse right hand side of binary operator\r\n      MG_StrExprParseResult subparse = mg_str_expr_parse_from_first_opl__min_prec(arena, it, opl, mg_str_expr_op_precedence_table[found_op]+1);\r\n      parse.root->right = subparse.root;\r\n      md_msg_list_concat_in_place(&parse.msgs, &subparse.msgs);\r\n      if(subparse.root == &mg_str_expr_nil)\r\n      {\r\n        md_msg_list_pushf(arena, &parse.msgs, it, MD_MsgKind_Error, \"Missing right-hand-side of '%S'.\", mg_str_expr_op_symbol_string_table[found_op]);\r\n      }\r\n      it = subparse.next_node;\r\n    }\r\n    \r\n    // rjf: store next node for more caller-side parsing\r\n    parse.next_node = it;\r\n  }\r\n  return parse;\r\n}\r\n\r\ninternal MG_StrExprParseResult\r\nmg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl)\r\n{\r\n  MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, first, opl, 0);\r\n  return parse;\r\n}\r\n\r\ninternal MG_StrExprParseResult\r\nmg_str_expr_parse_from_root(Arena *arena, MD_Node *root)\r\n{\r\n  MG_StrExprParseResult parse = mg_str_expr_parse_from_first_opl__min_prec(arena, root->first, &md_nil_node, 0);\r\n  return parse;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Generation Functions\r\n\r\ninternal MG_NodeArray\r\nmg_node_array_make(Arena *arena, U64 count)\r\n{\r\n  MG_NodeArray result = {0};\r\n  result.count = count;\r\n  result.v = push_array(arena, MD_Node *, result.count);\r\n  for(U64 idx = 0; idx < result.count; idx += 1)\r\n  {\r\n    result.v[idx] = &md_nil_node;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MG_NodeArray\r\nmg_child_array_from_node(Arena *arena, MD_Node *node)\r\n{\r\n  MG_NodeArray children = mg_node_array_make(arena, md_child_count_from_node(node));\r\n  U64 idx = 0;\r\n  for MD_EachNode(child, node->first)\r\n  {\r\n    children.v[idx] = child;\r\n    idx += 1;\r\n  }\r\n  return children;\r\n}\r\n\r\ninternal MG_NodeGrid\r\nmg_node_grid_make_from_node(Arena *arena, MD_Node *root)\r\n{\r\n  MG_NodeGrid grid = {0};\r\n  \r\n  // rjf: determine dimensions\r\n  U64 row_count = md_child_count_from_node(root);\r\n  U64 column_count = 0;\r\n  for MD_EachNode(row, root->first)\r\n  {\r\n    U64 cell_count_this_row = md_child_count_from_node(row);\r\n    column_count = Max(column_count, cell_count_this_row);\r\n  }\r\n  \r\n  // rjf: fill grid\r\n  grid.x_stride = 1;\r\n  grid.y_stride = column_count;\r\n  grid.cells = mg_node_array_make(arena, row_count*column_count);\r\n  grid.row_parents = mg_node_array_make(arena, row_count);\r\n  \r\n  // rjf: fill nodes\r\n  {\r\n    U64 y = 0;\r\n    for MD_EachNode(row, root->first)\r\n    {\r\n      U64 x = 0;\r\n      grid.row_parents.v[y] = row;\r\n      for MD_EachNode(cell, row->first)\r\n      {\r\n        grid.cells.v[x*grid.x_stride + y*grid.y_stride] = cell;\r\n        x += 1;\r\n      }\r\n      y += 1;\r\n    }\r\n  }\r\n  \r\n  return grid;\r\n}\r\n\r\ninternal MG_NodeArray\r\nmg_row_from_index(MG_NodeGrid grid, U64 index)\r\n{\r\n  MG_NodeArray result = {0};\r\n  if(0 <= index && index < grid.cells.count / grid.x_stride)\r\n  {\r\n    result.count = grid.y_stride;\r\n    result.v = &grid.cells.v[index*grid.y_stride];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MG_NodeArray\r\nmg_column_from_index(Arena *arena, MG_NodeGrid grid, U64 index)\r\n{\r\n  MG_NodeArray result = {0};\r\n  if(0 <= index && index < grid.y_stride)\r\n  {\r\n    U64 row_count = grid.cells.count / grid.y_stride;\r\n    result = mg_node_array_make(arena, row_count);\r\n    U64 idx = 0;\r\n    for(U64 row_idx = 0; row_idx < row_count; row_idx += 1, idx += 1)\r\n    {\r\n      result.v[idx] = grid.cells.v[index*grid.x_stride + row_idx*grid.y_stride];\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MD_Node *\r\nmg_node_from_grid_xy(MG_NodeGrid grid, U64 x, U64 y)\r\n{\r\n  MD_Node *result = &md_nil_node;\r\n  U64 idx = x*grid.x_stride + y*grid.y_stride;\r\n  if(0 <= idx && idx < grid.cells.count)\r\n  {\r\n    result = grid.cells.v[idx];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MG_ColumnDescArray\r\nmg_column_desc_array_make(Arena *arena, U64 count, MG_ColumnDesc *descs)\r\n{\r\n  MG_ColumnDescArray result = {0};\r\n  result.count = count;\r\n  result.v = push_array(arena, MG_ColumnDesc, result.count);\r\n  MemoryCopy(result.v, descs, sizeof(*result.v)*result.count);\r\n  return result;\r\n}\r\n\r\ninternal MG_ColumnDescArray\r\nmg_column_desc_array_from_tag(Arena *arena, MD_Node *tag)\r\n{\r\n  MG_ColumnDescArray result = {0};\r\n  result.count = md_child_count_from_node(tag);\r\n  result.v = push_array(arena, MG_ColumnDesc, result.count);\r\n  U64 idx = 0;\r\n  for MD_EachNode(hdr, tag->first)\r\n  {\r\n    result.v[idx].name = push_str8_copy(arena, hdr->string);\r\n    result.v[idx].kind = MG_ColumnKind_DirectCell;\r\n    if(md_node_has_tag(hdr, str8_lit(\"tag_check\"), 0))\r\n    {\r\n      result.v[idx].kind = MG_ColumnKind_CheckForTag;\r\n    }\r\n    if(md_node_has_tag(hdr, str8_lit(\"tag_child\"), 0))\r\n    {\r\n      String8 tag_name = md_tag_from_string(hdr, str8_lit(\"tag_child\"), 0)->first->string;\r\n      result.v[idx].kind = MG_ColumnKind_TagChild;\r\n      result.v[idx].tag_name = tag_name;\r\n    }\r\n    idx += 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nmg_column_index_from_name(MG_ColumnDescArray descs, String8 name)\r\n{\r\n  U64 result = 0;\r\n  for(U64 idx = 0; idx < descs.count; idx += 1)\r\n  {\r\n    if(str8_match(descs.v[idx].name, name, 0))\r\n    {\r\n      result = idx;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nmg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 idx)\r\n{\r\n  String8 result = {0};\r\n  \r\n  // rjf: grab relevant column description\r\n  MG_ColumnDesc *desc = 0;\r\n  if(0 <= idx && idx < descs.count)\r\n  {\r\n    desc = descs.v + idx;\r\n  }\r\n  \r\n  // rjf: grab node\r\n  if(desc != 0)\r\n  {\r\n    switch(desc->kind)\r\n    {\r\n      default: break;\r\n      \r\n      case MG_ColumnKind_DirectCell:\r\n      {\r\n        // rjf: determine grid idx (shifted by synthetic columns)\r\n        U64 cell_idx = idx;\r\n        for(U64 col_idx = 0; col_idx < descs.count && col_idx < idx; col_idx += 1)\r\n        {\r\n          if(descs.v[col_idx].kind != MG_ColumnKind_DirectCell)\r\n          {\r\n            cell_idx -= 1;\r\n          }\r\n        }\r\n        MD_Node *node = md_child_from_index(row_parent, cell_idx);\n        result = node->string;\n      }break;\r\n      \r\n      case MG_ColumnKind_CheckForTag:\r\n      {\r\n        String8 tag_name = desc->name;\r\n        MD_Node *tag = md_tag_from_string(row_parent, tag_name, 0);\r\n        result = md_node_is_nil(tag) ? str8_lit(\"0\") : str8_lit(\"1\");\r\n      }break;\r\n      \r\n      case MG_ColumnKind_TagChild:\r\n      {\r\n        String8 tag_name = desc->tag_name;\r\n        MD_Node *tag = md_tag_from_string(row_parent, tag_name, 0);\r\n        result = tag->first->string;\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal S64\r\nmg_eval_table_expand_expr__numeric(MG_StrExpr *expr, MG_TableExpandInfo *info)\r\n{\r\n  S64 result = 0;\r\n  MG_StrExprOp op = expr->op;\r\n  \r\n  switch(op)\r\n  {\r\n    default:\r\n    {\r\n      if(MG_StrExprOp_FirstString <= op && op <= MG_StrExprOp_LastString)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        String8List result_strs = {0};\r\n        mg_eval_table_expand_expr__string(scratch.arena, expr, info, &result_strs);\r\n        String8 result_str = str8_list_join(scratch.arena, &result_strs, 0);\r\n        try_s64_from_str8_c_rules(result_str, &result);\r\n        scratch_end(scratch);\r\n      }\r\n    }break;\r\n    \r\n    case MG_StrExprOp_Null:\r\n    {\r\n      try_s64_from_str8_c_rules(expr->node->string, &result);\r\n    }break;\r\n    \r\n    //- rjf: numeric arithmetic binary ops\r\n    case MG_StrExprOp_Add:\r\n    case MG_StrExprOp_Subtract:\r\n    case MG_StrExprOp_Multiply:\r\n    case MG_StrExprOp_Divide:\r\n    case MG_StrExprOp_Modulo:\r\n    case MG_StrExprOp_LeftShift:\r\n    case MG_StrExprOp_RightShift:\r\n    case MG_StrExprOp_BitwiseAnd:\r\n    case MG_StrExprOp_BitwiseOr:\r\n    case MG_StrExprOp_BitwiseXor:\r\n    case MG_StrExprOp_BooleanAnd:\r\n    case MG_StrExprOp_BooleanOr:\r\n    {\r\n      S64 left_val = mg_eval_table_expand_expr__numeric(expr->left, info);\r\n      S64 right_val = mg_eval_table_expand_expr__numeric(expr->right, info);\r\n      switch(op)\r\n      {\r\n        default:break;\r\n        case MG_StrExprOp_Add:        result = left_val+right_val;  break;\r\n        case MG_StrExprOp_Subtract:   result = left_val-right_val;  break;\r\n        case MG_StrExprOp_Multiply:   result = left_val*right_val;  break;\r\n        case MG_StrExprOp_Divide:     result = left_val/right_val;  break;\r\n        case MG_StrExprOp_Modulo:     result = left_val%right_val;  break;\r\n        case MG_StrExprOp_LeftShift:  result = left_val<<right_val; break;\r\n        case MG_StrExprOp_RightShift: result = left_val>>right_val; break;\r\n        case MG_StrExprOp_BitwiseAnd: result = left_val&right_val;  break;\r\n        case MG_StrExprOp_BitwiseOr:  result = left_val|right_val;  break;\r\n        case MG_StrExprOp_BitwiseXor: result = left_val^right_val;  break;\r\n        case MG_StrExprOp_BooleanAnd: result = left_val&&right_val; break;\r\n        case MG_StrExprOp_BooleanOr:  result = left_val||right_val; break;\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: prefix unary ops\r\n    case MG_StrExprOp_BitwiseNegate:\r\n    case MG_StrExprOp_BooleanNot:\r\n    {\r\n      S64 right_val = mg_eval_table_expand_expr__numeric(expr->left, info);\r\n      switch(op)\r\n      {\r\n        default:break;\r\n        case MG_StrExprOp_BitwiseNegate: result = (S64)(~((U64)right_val)); break;\r\n        case MG_StrExprOp_BooleanNot:    result = !right_val;\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: comparisons\r\n    case MG_StrExprOp_Equals:\r\n    case MG_StrExprOp_DoesNotEqual:\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      String8List left_strs = {0};\r\n      String8List right_strs = {0};\r\n      mg_eval_table_expand_expr__string(scratch.arena, expr->left, info, &left_strs);\r\n      mg_eval_table_expand_expr__string(scratch.arena, expr->right, info, &right_strs);\r\n      String8 left_str = str8_list_join(scratch.arena, &left_strs, 0);\r\n      String8 right_str = str8_list_join(scratch.arena, &right_strs, 0);\r\n      B32 match = str8_match(left_str, right_str, 0);\r\n      result = (op == MG_StrExprOp_Equals ? match : !match);\r\n      scratch_end(scratch);\r\n    }break;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal void\r\nmg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpandInfo *info, String8List *out)\r\n{\r\n  MG_StrExprOp op = expr->op;\r\n  \r\n  switch(op)\r\n  {\r\n    default:\r\n    {\r\n      if(MG_StrExprOp_FirstNumeric <= op && op <= MG_StrExprOp_LastNumeric)\r\n      {\r\n        S64 numeric_eval = mg_eval_table_expand_expr__numeric(expr, info);\r\n        String8 numeric_eval_stringized = {0};\r\n        if(md_node_has_tag(md_root_from_node(expr->node), str8_lit(\"hex\"), 0))\r\n        {\r\n          numeric_eval_stringized = push_str8f(arena, \"0x%I64x\", numeric_eval);\r\n        }\r\n        else\r\n        {\r\n          numeric_eval_stringized = push_str8f(arena, \"%I64d\", numeric_eval);\r\n        }\r\n        str8_list_push(arena, out, numeric_eval_stringized);\r\n      }\r\n    }break;\r\n    \r\n    case MG_StrExprOp_Null:\r\n    {\n      str8_list_push(arena, out, expr->node->string);\n    }break;\r\n    \r\n    case MG_StrExprOp_Dot:\r\n    {\r\n      // rjf: grab left/right\r\n      MG_StrExpr *left_expr = expr->left;\r\n      MD_Node *left_node = left_expr->node;\r\n      MG_StrExpr *right_expr = expr->right;\r\n      MD_Node *right_node = right_expr->node;\r\n      \r\n      // rjf: grab table name (LHS of .) and column lookup string (RHS of .)\r\n      String8 expand_label = left_node->string;\r\n      String8 column_lookup = right_node->string;\r\n      \r\n      // rjf: find which task corresponds to this table\r\n      U64 row_idx = 0;\r\n      MG_NodeGrid *grid = 0;\r\n      MG_ColumnDescArray column_descs = {0};\r\n      {\r\n        for(MG_TableExpandTask *task = info->first_expand_task; task != 0; task = task->next)\r\n        {\r\n          if(str8_match(expand_label, task->expansion_label, 0))\r\n          {\r\n            row_idx = task->idx;\r\n            grid = task->grid;\r\n            column_descs = task->column_descs;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: grab row parent\r\n      MD_Node *row_parent = &md_nil_node;\r\n      if(grid && (0 <= row_idx && row_idx < grid->row_parents.count))\r\n      {\r\n        row_parent = grid->row_parents.v[row_idx];\r\n      }\r\n      \r\n      // rjf: get string for this table lookup\r\n      String8 lookup_string = {0};\r\n      {\r\n        U64 column_idx = 0;\r\n        \r\n        if(str8_match(column_lookup, str8_lit(\"_it\"), 0))\r\n        {\r\n          lookup_string = push_str8f(arena, \"%I64u\", row_idx);\r\n        }\r\n        else\r\n        {\r\n          // NOTE(rjf): numeric column lookup (column index)\r\n          if(right_node->flags & MD_NodeFlag_Numeric)\r\n          {\r\n            try_u64_from_str8_c_rules(column_lookup, &column_idx);\r\n          }\r\n          \r\n          // NOTE(rjf): string column lookup (column name)\r\n          if(right_node->flags & (MD_NodeFlag_Identifier|MD_NodeFlag_StringLiteral))\r\n          {\r\n            column_idx = mg_column_index_from_name(column_descs, column_lookup);\r\n          }\r\n          \r\n          lookup_string = mg_string_from_row_desc_idx(row_parent, column_descs, column_idx);\r\n          if(str8_match(lookup_string, str8_lit(\"--\"), 0))\r\n          {\r\n            lookup_string = info->missing_value_fallback;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push lookup string\r\n      {\n        B32 is_multiline = (str8_find_needle(lookup_string, 0, str8_lit(\"\\n\"), 0) < lookup_string.size);\n        if(is_multiline)\n        {\n          lookup_string = indented_from_string(mg_arena, lookup_string);\n          lookup_string = escaped_from_raw_str8(mg_arena, lookup_string);\n          lookup_string = escaped_from_raw_str8(mg_arena, lookup_string);\n        }\n        str8_list_push(arena, out, lookup_string);\r\n      }\r\n    }break;\r\n    \r\n    case MG_StrExprOp_ExpandIfTrue:\r\n    {\r\n      S64 bool_value = mg_eval_table_expand_expr__numeric(expr->left, info);\r\n      if(bool_value)\r\n      {\r\n        mg_eval_table_expand_expr__string(arena, expr->right, info, out);\r\n      }\r\n    }break;\r\n    \r\n    case MG_StrExprOp_Concat:\r\n    {\r\n      mg_eval_table_expand_expr__string(arena, expr->left, info, out);\r\n      mg_eval_table_expand_expr__string(arena, expr->right, info, out);\r\n    }break;\r\n    \r\n    case MG_StrExprOp_BumpToColumn:\r\n    {\r\n      S64 column = mg_eval_table_expand_expr__numeric(expr->left, info);\r\n      S64 current_column = out->total_size;\r\n      S64 spaces_to_push = column - current_column;\r\n      if(spaces_to_push > 0)\r\n      {\r\n        String8 str = {0};\r\n        str.size = spaces_to_push;\r\n        str.str = push_array(arena, U8, spaces_to_push);\r\n        for(S64 idx = 0; idx < spaces_to_push; idx += 1)\r\n        {\r\n          str.str[idx] = ' ';\r\n        }\r\n        str8_list_push(arena, out, str);\r\n      }\r\n    }break;\r\n  }\r\n}\r\n\r\ninternal void\r\nmg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo *info, MG_TableExpandTask *task, String8List *out)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  for(U64 it_idx = 0; it_idx < task->count; it_idx += 1)\r\n  {\r\n    task->idx = it_idx;\r\n    \r\n    //- rjf: iterate all further dimensions, if there's left in the chain\r\n    if(task->next)\r\n    {\r\n      mg_loop_table_column_expansion(arena, strexpr, info, task->next, out);\r\n    }\r\n    \r\n    //- rjf: if this is the last task in the chain, perform expansion\r\n    else\r\n    {\r\n      String8List expansion_strs = {0};\r\n      U64 start = 0;\r\n      for(U64 char_idx = 0; char_idx <= strexpr.size;)\r\n      {\r\n        // rjf: push plain text parts of strexpr\r\n        if(char_idx == strexpr.size || strexpr.str[char_idx] == '$')\r\n        {\r\n          String8 plain_text_substr = str8_substr(strexpr, r1u64(start, char_idx));\r\n          start = char_idx;\r\n          if(plain_text_substr.size != 0)\r\n          {\r\n            str8_list_push(arena, &expansion_strs, plain_text_substr);\r\n          }\r\n        }\r\n        \r\n        // rjf: handle expansion expression\r\n        if(strexpr.str[char_idx] == '$')\r\n        {\r\n          String8 string = str8_skip(strexpr, char_idx+1);\r\n          Rng1U64 expr_range = {0};\r\n          S64 paren_nest = 0;\r\n          for(U64 idx = 0; idx < string.size; idx += 1)\r\n          {\r\n            if(string.str[idx] == '(')\r\n            {\r\n              paren_nest += 1;\r\n              if(paren_nest == 1)\r\n              {\r\n                expr_range.min = idx;\r\n              }\r\n            }\r\n            if(string.str[idx] == ')')\r\n            {\r\n              paren_nest -= 1;\r\n              if(paren_nest == 0)\r\n              {\r\n                expr_range.max = idx+1;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          String8 expr_string = str8_substr(string, expr_range);\r\n          MD_TokenizeResult expr_tokenize = md_tokenize_from_text(scratch.arena, expr_string);\r\n          MD_ParseResult expr_base_parse = md_parse_from_text_tokens(scratch.arena, str8_lit(\"\"), expr_string, expr_tokenize.tokens);\r\n          MG_StrExprParseResult expr_parse = mg_str_expr_parse_from_root(scratch.arena, expr_base_parse.root->first);\r\n          mg_eval_table_expand_expr__string(arena, expr_parse.root, info, &expansion_strs);\r\n          char_idx = start = char_idx + 1 + expr_range.max;\r\n        }\r\n        else\r\n        {\r\n          char_idx += 1;\r\n        }\r\n      }\r\n      String8 expansion_str = str8_list_join(arena, &expansion_strs, 0);\n      if(expansion_str.size != 0)\r\n      {\n        expansion_str = raw_from_escaped_str8(mg_arena, expansion_str);\n        str8_list_push(arena, out, expansion_str);\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8List\r\nmg_string_list_from_table_gen(Arena *arena, MG_Map grid_name_map, MG_Map grid_column_desc_map, String8 fallback, MD_Node *gen)\r\n{\r\n  String8List result = {0};\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  if(md_node_is_nil(gen->first) && gen->string.size != 0)\r\n  {\r\n    str8_list_push(arena, &result, raw_from_escaped_str8(arena, gen->string));\r\n    str8_list_push(arena, &result, str8_lit(\"\\n\"));\r\n  }\r\n  else for MD_EachNode(strexpr_node, gen->first)\r\n  {\r\n    // rjf: build task list\r\n    MG_TableExpandTask *first_task = 0;\r\n    MG_TableExpandTask *last_task = 0;\r\n    for MD_EachNode(tag, strexpr_node->first_tag)\r\n    {\r\n      if(str8_match(tag->string, str8_lit(\"expand\"), 0))\r\n      {\r\n        // rjf: grab args for this expansion\r\n        MD_Node *table_name_node = md_child_from_index(tag, 0);\r\n        MD_Node *expand_label_node = md_child_from_index(tag, 1);\r\n        String8 table_name = table_name_node->string;\r\n        String8 expand_label = expand_label_node->string;\r\n        \r\n        // rjf: lookup table / column descriptions\r\n        MG_NodeGrid *grid = mg_map_ptr_from_string(&grid_name_map, table_name);\r\n        MG_ColumnDescArray *column_descs = mg_map_ptr_from_string(&grid_column_desc_map, table_name);\r\n        \r\n        // rjf: figure out row count\r\n        U64 grid_row_count = 0;\r\n        if(grid != 0)\r\n        {\r\n          grid_row_count = grid->cells.count / grid->y_stride;\r\n        }\r\n        \r\n        // rjf: push task for this expansion\r\n        if(grid != 0)\r\n        {\r\n          MG_TableExpandTask *task = push_array(scratch.arena, MG_TableExpandTask, 1);\r\n          task->expansion_label = expand_label;\r\n          task->grid = grid;\r\n          task->column_descs = *column_descs;\r\n          task->count = grid_row_count;\r\n          task->idx = 0;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: do expansion generation, OR just push this string if we have no expansions\r\n    {\r\n      MG_TableExpandInfo info = {first_task, fallback};\r\n      if(first_task != 0)\r\n      {\r\n        mg_loop_table_column_expansion(arena, strexpr_node->string, &info, first_task, &result);\r\n      }\r\n      else\r\n      {\r\n        str8_list_push(arena, &result, raw_from_escaped_str8(arena, strexpr_node->string));\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Layer Lookup Functions\r\n\r\ninternal String8\r\nmg_layer_key_from_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U64 src_folder_pos = 0;\r\n  for(U64 next_src_folder_pos = 0;\r\n      next_src_folder_pos < path.size;\r\n      next_src_folder_pos = str8_find_needle(path, next_src_folder_pos+1, str8_lit(\"src\"), 0))\r\n  {\r\n    src_folder_pos = next_src_folder_pos;\r\n  }\r\n  String8List path_parts = str8_split_path(scratch.arena, str8_chop_last_slash(str8_skip(path, src_folder_pos+4)));\r\n  StringJoin join = {0};\r\n  join.sep = str8_lit(\"/\");\r\n  String8 key = str8_list_join(mg_arena, &path_parts, &join);\r\n  scratch_end(scratch);\r\n  return key;\r\n}\r\n\r\ninternal MG_Layer *\r\nmg_layer_from_key(String8 key)\r\n{\r\n  U64 hash = mg_hash_from_string(key);\r\n  U64 slot_idx = hash%mg_state->slots_count;\r\n  MG_LayerSlot *slot = &mg_state->slots[slot_idx];\r\n  MG_Layer *layer = 0;\r\n  for(MG_LayerNode *n = slot->first; n != 0; n = n->next)\r\n  {\r\n    if(str8_match(n->v.key, key, 0))\r\n    {\r\n      layer = &n->v;\r\n      break;\r\n    }\r\n  }\r\n  if(layer == 0)\r\n  {\r\n    MG_LayerNode *n = push_array(mg_arena, MG_LayerNode, 1);\r\n    SLLQueuePush(slot->first, slot->last, n);\r\n    n->v.key = push_str8_copy(mg_arena, key);\r\n    layer = &n->v;\r\n  }\r\n  return layer;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef METAGEN_H\r\n#define METAGEN_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Type\r\n\r\ntypedef struct MG_Msg MG_Msg;\r\nstruct MG_Msg\r\n{\r\n  String8 location;\r\n  String8 kind;\r\n  String8 msg;\r\n};\r\n\r\ntypedef struct MG_MsgNode MG_MsgNode;\r\nstruct MG_MsgNode\r\n{\r\n  MG_MsgNode *next;\r\n  MG_Msg v;\r\n};\r\n\r\ntypedef struct MG_MsgList MG_MsgList;\r\nstruct MG_MsgList\r\n{\r\n  MG_MsgNode *first;\r\n  MG_MsgNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Parse Artifact Types\r\n\r\ntypedef struct MG_FileParse MG_FileParse;\r\nstruct MG_FileParse\r\n{\r\n  MD_Node *root;\r\n};\r\n\r\ntypedef struct MG_FileParseNode MG_FileParseNode;\r\nstruct MG_FileParseNode\r\n{\r\n  MG_FileParseNode *next;\r\n  MG_FileParse v;\r\n};\r\n\r\ntypedef struct MG_FileParseList MG_FileParseList;\r\nstruct MG_FileParseList\r\n{\r\n  MG_FileParseNode *first;\r\n  MG_FileParseNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Map Type\r\n\r\ntypedef struct MG_MapNode MG_MapNode;\r\nstruct MG_MapNode\r\n{\r\n  MG_MapNode *next;\r\n  String8 key;\r\n  void *val;\r\n};\r\n\r\ntypedef struct MG_MapSlot MG_MapSlot;\r\nstruct MG_MapSlot\r\n{\r\n  MG_MapNode *first;\r\n  MG_MapNode *last;\r\n};\r\n\r\ntypedef struct MG_Map MG_Map;\r\nstruct MG_Map\r\n{\r\n  MG_MapSlot *slots;\r\n  U64 slots_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Expression Types\r\n\r\ntypedef enum MG_StrExprOpKind\r\n{\r\n  MG_StrExprOpKind_Null,\r\n  MG_StrExprOpKind_Prefix,\r\n  MG_StrExprOpKind_Postfix,\r\n  MG_StrExprOpKind_Binary,\r\n  MG_StrExprOpKind_COUNT\r\n}\r\nMG_StrExprOpKind;\r\n\r\ntypedef enum MG_StrExprOp\r\n{\r\n  MG_StrExprOp_Null,\r\n  \r\n#define MG_StrExprOp_FirstString MG_StrExprOp_Dot\r\n  MG_StrExprOp_Dot,\r\n  MG_StrExprOp_ExpandIfTrue,\r\n  MG_StrExprOp_Concat,\r\n  MG_StrExprOp_BumpToColumn,\r\n#define MG_StrExprOp_LastString MG_StrExprOp_BumpToColumn\r\n  \r\n#define MG_StrExprOp_FirstNumeric MG_StrExprOp_Add\r\n  MG_StrExprOp_Add,\r\n  MG_StrExprOp_Subtract,\r\n  MG_StrExprOp_Multiply,\r\n  MG_StrExprOp_Divide,\r\n  MG_StrExprOp_Modulo,\r\n  MG_StrExprOp_LeftShift,\r\n  MG_StrExprOp_RightShift,\r\n  MG_StrExprOp_BitwiseAnd,\r\n  MG_StrExprOp_BitwiseOr,\r\n  MG_StrExprOp_BitwiseXor,\r\n  MG_StrExprOp_BitwiseNegate,\r\n  MG_StrExprOp_BooleanAnd,\r\n  MG_StrExprOp_BooleanOr,\r\n  MG_StrExprOp_BooleanNot,\r\n  MG_StrExprOp_Equals,\r\n  MG_StrExprOp_DoesNotEqual,\r\n#define MG_StrExprOp_LastNumeric MG_StrExprOp_DoesNotEqual\r\n  \r\n  MG_StrExprOp_COUNT,\r\n}\r\nMG_StrExprOp;\r\n\r\ntypedef struct MG_StrExpr MG_StrExpr;\r\nstruct MG_StrExpr\r\n{\r\n  MG_StrExpr *parent;\r\n  MG_StrExpr *left;\r\n  MG_StrExpr *right;\r\n  MG_StrExprOp op;\r\n  MD_Node *node;\r\n};\r\n\r\ntypedef struct MG_StrExprParseResult MG_StrExprParseResult;\r\nstruct MG_StrExprParseResult\r\n{\r\n  MG_StrExpr *root;\r\n  MD_MsgList msgs;\r\n  MD_Node *next_node;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Generation Types\r\n\r\ntypedef struct MG_NodeArray MG_NodeArray;\r\nstruct MG_NodeArray\r\n{\r\n  MD_Node **v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct MG_NodeGrid MG_NodeGrid;\r\nstruct MG_NodeGrid\r\n{\r\n  U64 x_stride;\r\n  U64 y_stride;\r\n  MG_NodeArray cells;\r\n  MG_NodeArray row_parents;\r\n};\r\n\r\ntypedef enum MG_ColumnKind\r\n{\r\n  MG_ColumnKind_DirectCell,\r\n  MG_ColumnKind_CheckForTag,\r\n  MG_ColumnKind_TagChild,\r\n  MG_ColumnKind_COUNT\r\n}\r\nMG_ColumnKind;\r\n\r\ntypedef struct MG_ColumnDesc MG_ColumnDesc;\r\nstruct MG_ColumnDesc\r\n{\r\n  String8 name;\r\n  MG_ColumnKind kind;\r\n  String8 tag_name;\r\n};\r\n\r\ntypedef struct MG_ColumnDescArray MG_ColumnDescArray;\r\nstruct MG_ColumnDescArray\r\n{\r\n  U64 count;\r\n  MG_ColumnDesc *v;\r\n};\r\n\r\ntypedef struct MG_TableExpandTask MG_TableExpandTask;\r\nstruct MG_TableExpandTask\r\n{\r\n  MG_TableExpandTask *next;\r\n  String8 expansion_label;\r\n  MG_NodeGrid *grid;\r\n  MG_ColumnDescArray column_descs;\r\n  U64 count;\r\n  U64 idx;\r\n};\r\n\r\ntypedef struct MG_TableExpandInfo MG_TableExpandInfo;\r\nstruct MG_TableExpandInfo\r\n{\r\n  MG_TableExpandTask *first_expand_task;\r\n  String8 missing_value_fallback;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Output Path Types\r\n\r\ntypedef struct MG_Layer MG_Layer;\r\nstruct MG_Layer\r\n{\r\n  String8 key;\r\n  B32 is_library;\r\n  String8 gen_folder_name;\r\n  String8 h_name_override;\r\n  String8 c_name_override;\r\n  String8List enums;\r\n  String8List structs;\r\n  String8List h_functions;\r\n  String8List h_tables;\r\n  String8List h_catchall;\r\n  String8List h_header;\r\n  String8List h_footer;\r\n  String8List c_functions;\r\n  String8List c_tables;\r\n  String8List c_catchall;\r\n  String8List c_header;\r\n  String8List c_footer;\r\n};\r\n\r\ntypedef struct MG_LayerNode MG_LayerNode;\r\nstruct MG_LayerNode\r\n{\r\n  MG_LayerNode *next;\r\n  MG_Layer v;\r\n};\r\n\r\ntypedef struct MG_LayerSlot MG_LayerSlot;\r\nstruct MG_LayerSlot\r\n{\r\n  MG_LayerNode *first;\r\n  MG_LayerNode *last;\r\n};\r\n\r\ntypedef struct MG_State MG_State;\r\nstruct MG_State\r\n{\r\n  U64 slots_count;\r\n  MG_LayerSlot *slots;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal Arena *mg_arena = 0;\r\nglobal MG_State *mg_state = 0;\r\nread_only global MG_StrExpr mg_str_expr_nil = {&mg_str_expr_nil, &mg_str_expr_nil, &mg_str_expr_nil};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64 mg_hash_from_string(String8 string);\r\ninternal TxtPt mg_txt_pt_from_string_off(String8 string, U64 off);\r\n\r\n////////////////////////////////\r\n//~ rjf: Message Lists\r\n\r\ninternal void mg_msg_list_push(Arena *arena, MG_MsgList *msgs, MG_Msg *msg);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Escaping\r\n\r\ninternal String8 mg_escaped_from_str8(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Wrapping\r\n\r\ninternal String8List mg_wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent);\r\n\r\n////////////////////////////////\r\n//~ rjf: C-String-Izing\r\n\r\ninternal String8 mg_c_string_literal_from_multiline_string(String8 string);\r\ninternal String8 mg_c_array_literal_contents_from_data(String8 data);\r\n\r\n////////////////////////////////\r\n//~ rjf: Map Functions\r\n\r\ninternal MG_Map mg_push_map(Arena *arena, U64 slot_count);\r\ninternal void *mg_map_ptr_from_string(MG_Map *map, String8 string);\r\ninternal void mg_map_insert_ptr(Arena *arena, MG_Map *map, String8 string, void *val);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Expression Parsing\r\n\r\ninternal MG_StrExpr *mg_push_str_expr(Arena *arena, MG_StrExprOp op, MD_Node *node);\r\ninternal MG_StrExprParseResult mg_str_expr_parse_from_first_opl__min_prec(Arena *arena, MD_Node *first, MD_Node *opl, S8 min_prec);\r\ninternal MG_StrExprParseResult mg_str_expr_parse_from_first_opl(Arena *arena, MD_Node *first, MD_Node *opl);\r\ninternal MG_StrExprParseResult mg_str_expr_parse_from_root(Arena *arena, MD_Node *root);\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Generation Functions\r\n\r\ninternal MG_NodeArray mg_node_array_make(Arena *arena, U64 count);\r\ninternal MG_NodeArray mg_child_array_from_node(Arena *arena, MD_Node *node);\r\ninternal MG_NodeGrid mg_node_grid_make_from_node(Arena *arena, MD_Node *root);\r\ninternal MG_NodeArray mg_row_from_index(MG_NodeGrid grid, U64 index);\r\ninternal MG_NodeArray mg_column_from_index(Arena *arena, MG_NodeGrid grid, U64 index);\r\ninternal MD_Node *mg_node_from_grid_xy(MG_NodeGrid grid, U64 x, U64 y);\r\n\r\ninternal MG_ColumnDescArray mg_column_desc_array_make(Arena *arena, U64 count, MG_ColumnDesc *descs);\r\ninternal MG_ColumnDescArray mg_column_desc_array_from_tag(Arena *arena, MD_Node *tag);\r\ninternal U64 mg_column_index_from_name(MG_ColumnDescArray descs, String8 name);\r\ninternal String8 mg_string_from_row_desc_idx(MD_Node *row_parent, MG_ColumnDescArray descs, U64 idx);\r\n\r\ninternal S64 mg_eval_table_expand_expr__numeric(MG_StrExpr *expr, MG_TableExpandInfo *info);\r\ninternal void mg_eval_table_expand_expr__string(Arena *arena, MG_StrExpr *expr, MG_TableExpandInfo *info, String8List *out);\r\ninternal void mg_loop_table_column_expansion(Arena *arena, String8 strexpr, MG_TableExpandInfo *info, MG_TableExpandTask *task, String8List *out);\r\ninternal String8List mg_string_list_from_table_gen(Arena *arena, MG_Map grid_name_map, MG_Map grid_column_desc_map, String8 fallback, MD_Node *gen);\r\n\r\n////////////////////////////////\r\n//~ rjf: Layer Lookup Functions\r\n\r\ninternal String8 mg_layer_key_from_path(String8 path);\r\ninternal MG_Layer *mg_layer_from_key(String8 key);\r\n\r\n#endif //METAGEN_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_arena.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Arena Functions\r\n\r\n//- rjf: arena creation/destruction\r\n\r\ninternal Arena *\r\narena_alloc_(ArenaParams *params)\r\n{\r\n  // rjf: round up reserve/commit sizes\r\n  U64 reserve_size = params->reserve_size;\r\n  U64 commit_size = params->commit_size;\r\n  if(params->flags & ArenaFlag_LargePages)\r\n  {\r\n    reserve_size = AlignPow2(reserve_size, os_get_system_info()->large_page_size);\r\n    commit_size  = AlignPow2(commit_size,  os_get_system_info()->large_page_size);\r\n  }\r\n  else\r\n  {\r\n    reserve_size = AlignPow2(reserve_size, os_get_system_info()->page_size);\r\n    commit_size  = AlignPow2(commit_size,  os_get_system_info()->page_size);\r\n  }\r\n  \r\n  // rjf: reserve/commit initial block\r\n  void *base = params->optional_backing_buffer;\r\n  if(base == 0)\r\n  {\r\n    if(params->flags & ArenaFlag_LargePages)\r\n    {\r\n      base = os_reserve_large(reserve_size);\r\n      os_commit_large(base, commit_size);\r\n    }\r\n    else\r\n    {\r\n      base = os_reserve(reserve_size);\r\n      os_commit(base, commit_size);\r\n    }\r\n  }\r\n  \r\n  // rjf: panic on arena creation failure\r\n#if OS_FEATURE_GRAPHICAL\r\n  if(Unlikely(base == 0))\r\n  {\r\n    os_graphical_message(1, str8_lit(\"Fatal Allocation Failure\"), str8_lit(\"Unexpected memory allocation failure.\"));\r\n    os_abort(1);\r\n  }\r\n#endif\r\n  \r\n  // rjf: extract arena header & fill\r\n  Arena *arena = (Arena *)base;\r\n  arena->current = arena;\r\n  arena->flags = params->flags;\r\n  arena->cmt_size = params->commit_size;\r\n  arena->res_size = params->reserve_size;\r\n  arena->base_pos = 0;\r\n  arena->pos = ARENA_HEADER_SIZE;\r\n  arena->cmt = commit_size;\r\n  arena->res = reserve_size;\r\n#if ARENA_FREE_LIST\r\n  arena->free_size = 0;\r\n  arena->free_last = 0;\r\n#endif\r\n  AsanPoisonMemoryRegion(base, commit_size);\r\n  AsanUnpoisonMemoryRegion(base, ARENA_HEADER_SIZE);\r\n  return arena;\r\n}\r\n\r\ninternal void\r\narena_release(Arena *arena)\r\n{\r\n  for(Arena *n = arena->current, *prev = 0; n != 0; n = prev)\r\n  {\r\n    prev = n->prev;\r\n    os_release(n, n->res);\r\n  }\r\n}\r\n\r\n//- rjf: arena push/pop core functions\r\n\r\ninternal void *\r\narena_push(Arena *arena, U64 size, U64 align)\r\n{\r\n  Arena *current = arena->current;\r\n  U64 pos_pre = AlignPow2(current->pos, align);\r\n  U64 pos_pst = pos_pre + size;\r\n  \r\n  // rjf: chain, if needed\r\n  if(current->res < pos_pst && !(arena->flags & ArenaFlag_NoChain))\r\n  {\r\n    Arena *new_block = 0;\r\n    \r\n#if ARENA_FREE_LIST\r\n    Arena *prev_block;\r\n    for(new_block = arena->free_last, prev_block = 0; new_block != 0; prev_block = new_block, new_block = new_block->prev)\r\n    {\r\n      if(new_block->res >= AlignPow2(size, align))\r\n      {\r\n        if(prev_block)\r\n        {\r\n          prev_block->prev = new_block->prev;\r\n        }\r\n        else\r\n        {\r\n          arena->free_last = new_block->prev;\r\n        }\r\n        arena->free_size -= new_block->res_size;\r\n        AsanUnpoisonMemoryRegion((U8*)new_block + ARENA_HEADER_SIZE, new_block->res_size - ARENA_HEADER_SIZE);\r\n        break;\r\n      }\r\n    }\r\n#endif\r\n    \r\n    if(new_block == 0)\r\n    {\r\n      U64 res_size = current->res_size;\r\n      U64 cmt_size = current->cmt_size;\r\n      if(size + ARENA_HEADER_SIZE > res_size)\r\n      {\r\n        res_size = AlignPow2(size + ARENA_HEADER_SIZE, align);\r\n        cmt_size = AlignPow2(size + ARENA_HEADER_SIZE, align);\r\n      }\r\n      new_block = arena_alloc(.reserve_size = res_size,\r\n                              .commit_size  = cmt_size,\r\n                              .flags        = current->flags);\r\n    }\r\n    \r\n    new_block->base_pos = current->base_pos + current->res;\r\n    SLLStackPush_N(arena->current, new_block, prev);\r\n    \r\n    current = new_block;\r\n    pos_pre = AlignPow2(current->pos, align);\r\n    pos_pst = pos_pre + size;\r\n  }\r\n  \r\n  // rjf: commit new pages, if needed\r\n  if(current->cmt < pos_pst)\r\n  {\r\n    U64 cmt_pst_aligned = pos_pst + current->cmt_size-1;\r\n    cmt_pst_aligned -= cmt_pst_aligned%current->cmt_size;\r\n    U64 cmt_pst_clamped = ClampTop(cmt_pst_aligned, current->res);\r\n    U64 cmt_size = cmt_pst_clamped - current->cmt;\r\n    U8 *cmt_ptr = (U8 *)current + current->cmt;\r\n    if(current->flags & ArenaFlag_LargePages)\r\n    {\r\n      os_commit_large(cmt_ptr, cmt_size);\r\n    }\r\n    else\r\n    {\r\n      os_commit(cmt_ptr, cmt_size);\r\n    }\r\n    current->cmt = cmt_pst_clamped;\r\n  }\r\n  \r\n  // rjf: push onto current block\r\n  void *result = 0;\r\n  if(current->cmt >= pos_pst)\r\n  {\r\n    result = (U8 *)current+pos_pre;\r\n    current->pos = pos_pst;\r\n    AsanUnpoisonMemoryRegion(result, size);\r\n  }\r\n  \r\n  // rjf: panic on failure\r\n#if OS_FEATURE_GRAPHICAL\r\n  if(Unlikely(result == 0))\r\n  {\r\n    os_graphical_message(1, str8_lit(\"Fatal Allocation Failure\"), str8_lit(\"Unexpected memory allocation failure.\"));\r\n    os_abort(1);\r\n  }\r\n#endif\r\n  \r\n  return result;\r\n}\r\n\r\ninternal U64\r\narena_pos(Arena *arena)\r\n{\r\n  Arena *current = arena->current;\r\n  U64 pos = current->base_pos + current->pos;\r\n  return pos;\r\n}\r\n\r\ninternal void\r\narena_pop_to(Arena *arena, U64 pos)\r\n{\r\n  U64 big_pos = ClampBot(ARENA_HEADER_SIZE, pos);\r\n  Arena *current = arena->current;\r\n  \r\n#if ARENA_FREE_LIST\r\n  for(Arena *prev = 0; current->base_pos >= big_pos; current = prev)\r\n  {\r\n    prev = current->prev;\r\n    current->pos = ARENA_HEADER_SIZE;\r\n    arena->free_size += current->res_size;\r\n    SLLStackPush_N(arena->free_last, current, prev);\r\n    AsanPoisonMemoryRegion((U8*)current + ARENA_HEADER_SIZE, current->res_size - ARENA_HEADER_SIZE);\r\n  }\r\n#else\r\n  for(Arena *prev = 0; current->base_pos >= big_pos; current = prev)\r\n  {\r\n    prev = current->prev;\r\n    os_release(current, current->res);\r\n  }\r\n#endif\r\n  arena->current = current;\r\n  U64 new_pos = big_pos - current->base_pos;\r\n  AssertAlways(new_pos <= current->pos);\r\n  AsanPoisonMemoryRegion((U8*)current + new_pos, (current->pos - new_pos));\r\n  current->pos = new_pos;\r\n}\r\n\r\n//- rjf: arena push/pop helpers\r\n\r\ninternal void\r\narena_clear(Arena *arena)\r\n{\r\n  arena_pop_to(arena, 0);\r\n}\r\n\r\ninternal void\r\narena_pop(Arena *arena, U64 amt)\r\n{\r\n  U64 pos_old = arena_pos(arena);\r\n  U64 pos_new = pos_old;\r\n  if(amt < pos_old)\r\n  {\r\n    pos_new = pos_old - amt;\r\n  }\r\n  arena_pop_to(arena, pos_new);\r\n}\r\n\r\n//- rjf: temporary arena scopes\r\n\r\ninternal Temp\r\ntemp_begin(Arena *arena)\r\n{\r\n  U64 pos = arena_pos(arena);\r\n  Temp temp = {arena, pos};\r\n  return temp;\r\n}\r\n\r\ninternal void\r\ntemp_end(Temp temp)\r\n{\r\n  arena_pop_to(temp.arena, temp.pos);\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_arena.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_ARENA_H\r\n#define BASE_ARENA_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Constants\r\n\r\n#define ARENA_HEADER_SIZE 128\r\n\r\n////////////////////////////////\r\n//~ rjf: Types\r\n\r\ntypedef U64 ArenaFlags;\r\nenum\r\n{\r\n  ArenaFlag_NoChain    = (1<<0),\r\n  ArenaFlag_LargePages = (1<<1),\r\n};\r\n\r\ntypedef struct ArenaParams ArenaParams;\r\nstruct ArenaParams\r\n{\r\n  ArenaFlags flags;\r\n  U64 reserve_size;\r\n  U64 commit_size;\r\n  void *optional_backing_buffer;\r\n};\r\n\r\ntypedef struct Arena Arena;\r\nstruct Arena\r\n{\r\n  Arena *prev;    // previous arena in chain\r\n  Arena *current; // current arena in chain\r\n  ArenaFlags flags;\r\n  U64 cmt_size;\r\n  U64 res_size;\r\n  U64 base_pos;\r\n  U64 pos;\r\n  U64 cmt;\r\n  U64 res;\r\n#if ARENA_FREE_LIST\r\n  U64 free_size;\r\n  Arena *free_last;\r\n#endif\r\n};\r\nStaticAssert(sizeof(Arena) <= ARENA_HEADER_SIZE, arena_header_size_check);\r\n\r\ntypedef struct Temp Temp;\r\nstruct Temp\r\n{\r\n  Arena *arena;\r\n  U64 pos;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Global Defaults\r\n\r\nglobal U64 arena_default_reserve_size = MB(64);\r\nglobal U64 arena_default_commit_size  = KB(64);\r\nglobal ArenaFlags arena_default_flags = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Arena Functions\r\n\r\n//- rjf: arena creation/destruction\r\ninternal Arena *arena_alloc_(ArenaParams *params);\r\n#define arena_alloc(...) arena_alloc_(&(ArenaParams){.reserve_size = arena_default_reserve_size, .commit_size = arena_default_commit_size, .flags = arena_default_flags, __VA_ARGS__})\r\ninternal void arena_release(Arena *arena);\r\n\r\n//- rjf: arena push/pop/pos core functions\r\ninternal void *arena_push(Arena *arena, U64 size, U64 align);\r\ninternal U64   arena_pos(Arena *arena);\r\ninternal void  arena_pop_to(Arena *arena, U64 pos);\r\n\r\n//- rjf: arena push/pop helpers\r\ninternal void arena_clear(Arena *arena);\r\ninternal void arena_pop(Arena *arena, U64 amt);\r\n\r\n//- rjf: temporary arena scopes\r\ninternal Temp temp_begin(Arena *arena);\r\ninternal void temp_end(Temp temp);\r\n\r\n//- rjf: push helper macros\r\n#define push_array_no_zero_aligned(a, T, c, align) (T *)arena_push((a), sizeof(T)*(c), (align))\r\n#define push_array_aligned(a, T, c, align) (T *)MemoryZero(push_array_no_zero_aligned(a, T, c, align), sizeof(T)*(c))\r\n#define push_array_no_zero(a, T, c) push_array_no_zero_aligned(a, T, c, Max(8, AlignOf(T)))\r\n#define push_array(a, T, c) push_array_aligned(a, T, c, Max(8, AlignOf(T)))\r\n\r\n#endif // BASE_ARENA_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_command_line.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ NOTE(rjf): Command Line Option Parsing\r\n\r\ninternal U64\r\ncmd_line_hash_from_string(String8 string)\r\n{\r\n  U64 result = 5381;\r\n  for(U64 i = 0; i < string.size; i += 1)\r\n  {\r\n    result = ((result << 5) + result) + string.str[i];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CmdLineOpt **\r\ncmd_line_slot_from_string(CmdLine *cmd_line, String8 string)\r\n{\r\n  CmdLineOpt **slot = 0;\r\n  if(cmd_line->option_table_size != 0)\r\n  {\r\n    U64 hash = cmd_line_hash_from_string(string);\r\n    U64 bucket = hash % cmd_line->option_table_size;\r\n    slot = &cmd_line->option_table[bucket];\r\n  }\r\n  return slot;\r\n}\r\n\r\ninternal CmdLineOpt *\r\ncmd_line_opt_from_slot(CmdLineOpt **slot, String8 string)\r\n{\r\n  CmdLineOpt *result = 0;\r\n  for(CmdLineOpt *var = *slot; var; var = var->hash_next)\r\n  {\r\n    if(str8_match(string, var->string, 0))\r\n    {\r\n      result = var;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\ncmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var)\r\n{\r\n  SLLQueuePush(list->first, list->last, var);\r\n  list->count += 1;\r\n}\r\n\r\ninternal CmdLineOpt *\r\ncmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values)\r\n{\r\n  CmdLineOpt *var = 0;\r\n  CmdLineOpt **slot = cmd_line_slot_from_string(cmd_line, string);\r\n  CmdLineOpt *existing_var = cmd_line_opt_from_slot(slot, string);\r\n  if(existing_var != 0)\r\n  {\r\n    var = existing_var;\r\n  }\r\n  else\r\n  {\r\n    var = push_array(arena, CmdLineOpt, 1);\r\n    var->hash_next = *slot;\r\n    var->hash = cmd_line_hash_from_string(string);\r\n    var->string = push_str8_copy(arena, string);\r\n    var->value_strings = values;\r\n    StringJoin join = {0};\r\n    join.pre = str8_lit(\"\");\r\n    join.sep = str8_lit(\",\");\r\n    join.post = str8_lit(\"\");\r\n    var->value_string = str8_list_join(arena, &var->value_strings, &join);\r\n    *slot = var;\r\n    cmd_line_push_opt(&cmd_line->options, var);\r\n  }\r\n  return var;\r\n}\r\n\r\ninternal CmdLine\r\ncmd_line_from_string_list(Arena *arena, String8List command_line)\r\n{\r\n  CmdLine parsed = {0};\r\n  parsed.exe_name = command_line.first->string;\r\n  \r\n  // NOTE(rjf): Set up config option table.\r\n  {\r\n    parsed.option_table_size = 4096;\r\n    parsed.option_table = push_array(arena, CmdLineOpt *, parsed.option_table_size);\r\n  }\r\n  \r\n  // NOTE(rjf): Parse command line.\r\n  B32 after_passthrough_option = 0;\r\n  B32 first_passthrough = 1;\r\n  for(String8Node *node = command_line.first->next, *next = 0; node != 0; node = next)\r\n  {\r\n    next = node->next;\r\n    String8 option_name = node->string;\r\n    \r\n    // NOTE(rjf): Look at --, -, or / (only on Windows) at the start of an\r\n    // argument to determine if it's a flag option. All arguments after a\r\n    // single \"--\" (with no trailing string on the command line will be\r\n    // considered as input files.\r\n    B32 is_option = 1;\r\n    if(after_passthrough_option == 0)\r\n    {\r\n      if(str8_match(node->string, str8_lit(\"--\"), 0))\r\n      {\r\n        after_passthrough_option = 1;\r\n        is_option = 0;\r\n      }\r\n      else if(str8_match(str8_prefix(node->string, 2), str8_lit(\"--\"), 0))\r\n      {\r\n        option_name = str8_skip(option_name, 2);\r\n      }\r\n      else if(str8_match(str8_prefix(node->string, 1), str8_lit(\"-\"), 0))\r\n      {\r\n        option_name = str8_skip(option_name, 1);\r\n      }\r\n      else if(operating_system_from_context() == OperatingSystem_Windows &&\r\n              str8_match(str8_prefix(node->string, 1), str8_lit(\"/\"), 0))\r\n      {\r\n        option_name = str8_skip(option_name, 1);\r\n      }\r\n      else\r\n      {\r\n        is_option = 0;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      is_option = 0;\r\n    }\r\n    \r\n    // NOTE(rjf): This string is an option.\r\n    if(is_option)\r\n    {\r\n      B32 has_arguments = 0;\r\n      U64 arg_signifier_position1 = str8_find_needle(option_name, 0, str8_lit(\":\"), 0);\r\n      U64 arg_signifier_position2 = str8_find_needle(option_name, 0, str8_lit(\"=\"), 0);\r\n      U64 arg_signifier_position = Min(arg_signifier_position1, arg_signifier_position2);\r\n      String8 arg_portion_this_string = str8_skip(option_name, arg_signifier_position+1);\r\n      if(arg_signifier_position < option_name.size)\r\n      {\r\n        has_arguments = 1;\r\n      }\r\n      option_name = str8_prefix(option_name, arg_signifier_position);\r\n      \r\n      String8List arguments = {0};\r\n      \r\n      // NOTE(rjf): Parse arguments.\r\n      if(has_arguments)\r\n      {\r\n        for(String8Node *n = node; n; n = n->next)\r\n        {\r\n          next = n->next;\r\n          \r\n          String8 string = n->string;\r\n          if(n == node)\r\n          {\r\n            string = arg_portion_this_string;\r\n          }\r\n          \r\n          U8 splits[] = { ',' };\r\n          String8List args_in_this_string = str8_split(arena, string, splits, ArrayCount(splits), 0);\r\n          for(String8Node *sub_arg = args_in_this_string.first; sub_arg; sub_arg = sub_arg->next)\r\n          {\r\n            str8_list_push(arena, &arguments, sub_arg->string);\r\n          }\r\n          if(!str8_match(str8_postfix(n->string, 1), str8_lit(\",\"), 0) &&\r\n             (n != node || arg_portion_this_string.size != 0))\r\n          {\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // NOTE(rjf): Register config variable.\r\n      cmd_line_insert_opt(arena, &parsed, option_name, arguments);\r\n    }\r\n    \r\n    // NOTE(rjf): Default path, treat as a passthrough config option to be\r\n    // handled by tool-specific code.\r\n    else if(!str8_match(node->string, str8_lit(\"--\"), 0) || !first_passthrough)\r\n    {\r\n      str8_list_push(arena, &parsed.inputs, node->string);\r\n      after_passthrough_option = 1;\r\n      first_passthrough = 0;\r\n    }\r\n  }\r\n  \r\n  // rjf: fill argc/argv\r\n  parsed.argc = command_line.node_count;\r\n  parsed.argv = push_array(arena, char *, parsed.argc);\r\n  {\r\n    U64 idx = 0;\r\n    for(String8Node *n = command_line.first; n != 0; n = n->next)\r\n    {\r\n      parsed.argv[idx] = (char *)push_str8_copy(arena, n->string).str;\r\n      idx += 1;\r\n    }\r\n  }\r\n  \r\n  return parsed;\r\n}\r\n\r\ninternal CmdLineOpt *\r\ncmd_line_opt_from_string(CmdLine *cmd_line, String8 name)\r\n{\r\n  return cmd_line_opt_from_slot(cmd_line_slot_from_string(cmd_line, name), name);\r\n}\r\n\r\ninternal String8List \r\ncmd_line_strings(CmdLine *cmd_line, String8 name)\r\n{\r\n  String8List result = {0};\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  if(var != 0)\r\n  {\r\n    result = var->value_strings;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8     \r\ncmd_line_string(CmdLine *cmd_line, String8 name)\r\n{\r\n  String8 result = {0};\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  if(var != 0)\r\n  {\r\n    result = var->value_string;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ncmd_line_has_flag(CmdLine *cmd_line, String8 name)\r\n{\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  return(var != 0);\r\n}\r\n\r\ninternal B32\r\ncmd_line_has_argument(CmdLine *cmd_line, String8 name)\r\n{\r\n  CmdLineOpt *var = cmd_line_opt_from_string(cmd_line, name);\r\n  return(var != 0 && var->value_strings.node_count > 0);\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_command_line.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_COMMAND_LINE_H\r\n#define BASE_COMMAND_LINE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Parsed Command Line Types\r\n\r\ntypedef struct CmdLineOpt CmdLineOpt;\r\nstruct CmdLineOpt\r\n{\r\n  CmdLineOpt *next;\r\n  CmdLineOpt *hash_next;\r\n  U64 hash;\r\n  String8 string;\r\n  String8List value_strings;\r\n  String8 value_string;\r\n};\r\n\r\ntypedef struct CmdLineOptList CmdLineOptList;\r\nstruct CmdLineOptList\r\n{\r\n  U64 count;\r\n  CmdLineOpt *first;\r\n  CmdLineOpt *last;\r\n};\r\n\r\ntypedef struct CmdLine CmdLine;\r\nstruct CmdLine\r\n{\r\n  String8 exe_name;\r\n  CmdLineOptList options;\r\n  String8List inputs;\r\n  U64 option_table_size;\r\n  CmdLineOpt **option_table;\r\n  U64 argc;\r\n  char **argv;\r\n};\r\n\r\n////////////////////////////////\r\n//~ NOTE(rjf): Command Line Option Parsing\r\n\r\ninternal U64              cmd_line_hash_from_string(String8 string);\r\ninternal CmdLineOpt**     cmd_line_slot_from_string(CmdLine *cmd_line, String8 string);\r\ninternal CmdLineOpt*      cmd_line_opt_from_slot(CmdLineOpt **slot, String8 string);\r\ninternal void             cmd_line_push_opt(CmdLineOptList *list, CmdLineOpt *var);\r\ninternal CmdLineOpt*      cmd_line_insert_opt(Arena *arena, CmdLine *cmd_line, String8 string, String8List values);\r\ninternal CmdLine          cmd_line_from_string_list(Arena *arena, String8List arguments);\r\ninternal CmdLineOpt*      cmd_line_opt_from_string(CmdLine *cmd_line, String8 name);\r\ninternal String8List      cmd_line_strings(CmdLine *cmd_line, String8 name);\r\ninternal String8          cmd_line_string(CmdLine *cmd_line, String8 name);\r\ninternal B32              cmd_line_has_flag(CmdLine *cmd_line, String8 name);\r\ninternal B32              cmd_line_has_argument(CmdLine *cmd_line, String8 name);\r\n\r\n#endif // BASE_COMMAND_LINE_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_context_cracking.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_CONTEXT_CRACKING_H\r\n#define BASE_CONTEXT_CRACKING_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Clang OS/Arch Cracking\r\n\r\n#if defined(__clang__)\r\n\r\n# define COMPILER_CLANG 1\r\n\r\n# if defined(_WIN32)\r\n#  define OS_WINDOWS 1\r\n# elif defined(__gnu_linux__) || defined(__linux__)\r\n#  define OS_LINUX 1\r\n# elif defined(__APPLE__) && defined(__MACH__)\r\n#  define OS_MAC 1\r\n# else\r\n#  error This compiler/OS combo is not supported.\r\n# endif\r\n\r\n# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)\r\n#  define ARCH_X64 1\r\n# elif defined(i386) || defined(__i386) || defined(__i386__)\r\n#  define ARCH_X86 1\r\n# elif defined(__aarch64__)\r\n#  define ARCH_ARM64 1\r\n# elif defined(__arm__)\r\n#  define ARCH_ARM32 1\r\n# else\r\n#  error Architecture not supported.\r\n# endif\r\n\r\n////////////////////////////////\r\n//~ rjf: MSVC OS/Arch Cracking\r\n\r\n#elif defined(_MSC_VER)\r\n\r\n# define COMPILER_MSVC 1\r\n\r\n# if _MSC_VER >= 1920\r\n#  define COMPILER_MSVC_YEAR 2019\r\n# elif _MSC_VER >= 1910\r\n#  define COMPILER_MSVC_YEAR 2017\r\n# elif _MSC_VER >= 1900\r\n#  define COMPILER_MSVC_YEAR 2015\r\n# elif _MSC_VER >= 1800\r\n#  define COMPILER_MSVC_YEAR 2013\r\n# elif _MSC_VER >= 1700\r\n#  define COMPILER_MSVC_YEAR 2012\r\n# elif _MSC_VER >= 1600\r\n#  define COMPILER_MSVC_YEAR 2010\r\n# elif _MSC_VER >= 1500\r\n#  define COMPILER_MSVC_YEAR 2008\r\n# elif _MSC_VER >= 1400\r\n#  define COMPILER_MSVC_YEAR 2005\r\n# else\r\n#  define COMPILER_MSVC_YEAR 0\r\n# endif\r\n\r\n# if defined(_WIN32)\r\n#  define OS_WINDOWS 1\r\n# else\r\n#  error This compiler/OS combo is not supported.\r\n# endif\r\n\r\n# if defined(_M_AMD64)\r\n#  define ARCH_X64 1\r\n# elif defined(_M_IX86)\r\n#  define ARCH_X86 1\r\n# elif defined(_M_ARM64)\r\n#  define ARCH_ARM64 1\r\n# elif defined(_M_ARM)\r\n#  define ARCH_ARM32 1\r\n# else\r\n#  error Architecture not supported.\r\n# endif\r\n\r\n////////////////////////////////\r\n//~ rjf: GCC OS/Arch Cracking\r\n\r\n#elif defined(__GNUC__) || defined(__GNUG__)\r\n\r\n# define COMPILER_GCC 1\r\n\r\n# if defined(__gnu_linux__) || defined(__linux__)\r\n#  define OS_LINUX 1\r\n# else\r\n#  error This compiler/OS combo is not supported.\r\n# endif\r\n\r\n# if defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)\r\n#  define ARCH_X64 1\r\n# elif defined(i386) || defined(__i386) || defined(__i386__)\r\n#  define ARCH_X86 1\r\n# elif defined(__aarch64__)\r\n#  define ARCH_ARM64 1\r\n# elif defined(__arm__)\r\n#  define ARCH_ARM32 1\r\n# else\r\n#  error Architecture not supported.\r\n# endif\r\n\r\n#else\r\n# error Compiler not supported.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Arch Cracking\r\n\r\n#if defined(ARCH_X64)\r\n# define ARCH_64BIT 1\r\n#elif defined(ARCH_X86)\r\n# define ARCH_32BIT 1\r\n#endif\r\n\r\n#if ARCH_ARM32 || ARCH_ARM64 || ARCH_X64 || ARCH_X86\r\n# define ARCH_LITTLE_ENDIAN 1\r\n#else\r\n# error Endianness of this architecture not understood by context cracker.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Language Cracking\r\n\r\n#if defined(__cplusplus)\r\n# define LANG_CPP 1\r\n#else\r\n# define LANG_C 1\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Build Option Cracking\r\n\r\n#if !defined(BUILD_DEBUG)\r\n# define BUILD_DEBUG 1\r\n#endif\r\n\r\n#if !defined(BUILD_SUPPLEMENTARY_UNIT)\r\n# define BUILD_SUPPLEMENTARY_UNIT 0\r\n#endif\r\n\r\n#if !defined(BUILD_ENTRY_DEFINING_UNIT)\r\n# define BUILD_ENTRY_DEFINING_UNIT 1\r\n#endif\r\n\r\n#if !defined(BUILD_CONSOLE_INTERFACE)\r\n# define BUILD_CONSOLE_INTERFACE 0\r\n#endif\r\n\r\n#if !defined(BUILD_VERSION_MAJOR)\r\n# define BUILD_VERSION_MAJOR 0\r\n#endif\r\n\r\n#if !defined(BUILD_VERSION_MINOR)\r\n# define BUILD_VERSION_MINOR 9\r\n#endif\r\n\r\n#if !defined(BUILD_VERSION_PATCH)\r\n# define BUILD_VERSION_PATCH 14\r\n#endif\r\n\r\n#define BUILD_VERSION_STRING_LITERAL Stringify(BUILD_VERSION_MAJOR) \".\" Stringify(BUILD_VERSION_MINOR) \".\" Stringify(BUILD_VERSION_PATCH)\r\n#if BUILD_DEBUG\r\n# define BUILD_MODE_STRING_LITERAL_APPEND \" [Debug]\"\r\n#else\r\n# define BUILD_MODE_STRING_LITERAL_APPEND \"\"\r\n#endif\r\n#if defined(BUILD_GIT_HASH)\r\n# define BUILD_GIT_HASH_STRING_LITERAL_APPEND \" [\" BUILD_GIT_HASH \"]\"\r\n#else\r\n# define BUILD_GIT_HASH_STRING_LITERAL_APPEND \"\"\r\n#endif\r\n\r\n#if !defined(BUILD_TITLE)\r\n# define BUILD_TITLE \"Untitled\"\r\n#endif\r\n\r\n#if !defined(BUILD_RELEASE_PHASE_STRING_LITERAL)\r\n# define BUILD_RELEASE_PHASE_STRING_LITERAL \"ALPHA\"\r\n#endif\r\n\r\n#if !defined(BUILD_ISSUES_LINK_STRING_LITERAL)\r\n# define BUILD_ISSUES_LINK_STRING_LITERAL \"https://github.com/EpicGamesExt/raddebugger/issues\"\r\n#endif\r\n\r\n#define BUILD_TITLE_STRING_LITERAL BUILD_TITLE \" (\" BUILD_VERSION_STRING_LITERAL \" \" BUILD_RELEASE_PHASE_STRING_LITERAL \") - \" __DATE__ \"\" BUILD_GIT_HASH_STRING_LITERAL_APPEND BUILD_MODE_STRING_LITERAL_APPEND\r\n\r\n////////////////////////////////\r\n//~ rjf: Zero All Undefined Options\r\n\r\n#if !defined(ARCH_32BIT)\r\n# define ARCH_32BIT 0\r\n#endif\r\n#if !defined(ARCH_64BIT)\r\n# define ARCH_64BIT 0\r\n#endif\r\n#if !defined(ARCH_X64)\r\n# define ARCH_X64 0\r\n#endif\r\n#if !defined(ARCH_X86)\r\n# define ARCH_X86 0\r\n#endif\r\n#if !defined(ARCH_ARM64)\r\n# define ARCH_ARM64 0\r\n#endif\r\n#if !defined(ARCH_ARM32)\r\n# define ARCH_ARM32 0\r\n#endif\r\n#if !defined(COMPILER_MSVC)\r\n# define COMPILER_MSVC 0\r\n#endif\r\n#if !defined(COMPILER_GCC)\r\n# define COMPILER_GCC 0\r\n#endif\r\n#if !defined(COMPILER_CLANG)\r\n# define COMPILER_CLANG 0\r\n#endif\r\n#if !defined(OS_WINDOWS)\r\n# define OS_WINDOWS 0\r\n#endif\r\n#if !defined(OS_LINUX)\r\n# define OS_LINUX 0\r\n#endif\r\n#if !defined(OS_MAC)\r\n# define OS_MAC 0\r\n#endif\r\n#if !defined(LANG_CPP)\r\n# define LANG_CPP 0\r\n#endif\r\n#if !defined(LANG_C)\r\n# define LANG_C 0\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Unsupported Errors\r\n\r\n#if ARCH_X86\r\n# error You tried to build in x86 (32 bit) mode, but currently, only building in x64 (64 bit) mode is supported.\r\n#endif\r\n#if !ARCH_X64\r\n# error You tried to build with an unsupported architecture. Currently, only building in x64 mode is supported.\r\n#endif\r\n\r\n#endif // BASE_CONTEXT_CRACKING_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_core.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Safe Casts\r\n\r\ninternal U16\r\nsafe_cast_u16(U32 x)\r\n{\r\n  AssertAlways(x <= max_U16);\r\n  U16 result = (U16)x;\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nsafe_cast_u32(U64 x)\r\n{\r\n  AssertAlways(x <= max_U32);\r\n  U32 result = (U32)x;\r\n  return result;\r\n}\r\n\r\ninternal S32\r\nsafe_cast_s32(S64 x)\r\n{\r\n  AssertAlways(x <= max_S32);\r\n  S32 result = (S32)x;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Large Base Type Functions\r\n\r\ninternal U128\r\nu128_zero(void)\r\n{\r\n  U128 v = {0};\r\n  return v;\r\n}\r\n\r\ninternal U128\r\nu128_make(U64 v0, U64 v1)\r\n{\r\n  U128 v = {v0, v1};\r\n  return v;\r\n}\r\n\r\ninternal B32\r\nu128_match(U128 a, U128 b)\r\n{\r\n  return MemoryMatchStruct(&a, &b);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Bit Patterns\r\n\r\ninternal U32\r\nu32_from_u64_saturate(U64 x){\r\n  U32 x32 = (x > max_U32)?max_U32:(U32)x;\r\n  return(x32);\r\n}\r\n\r\ninternal U64\r\nu64_up_to_pow2(U64 x){\r\n  if (x == 0){\r\n    x = 1;\r\n  }\r\n  else{\r\n    x -= 1;\r\n    x |= (x >> 1);\r\n    x |= (x >> 2);\r\n    x |= (x >> 4);\r\n    x |= (x >> 8);\r\n    x |= (x >> 16);\r\n    x |= (x >> 32);\r\n    x += 1;\r\n  }\r\n  return(x);\r\n}\r\n\r\ninternal S32\r\nextend_sign32(U32 x, U32 size){\r\n  U32 high_bit = size * 8;\r\n  U32 shift = 32 - high_bit;\r\n  S32 result = ((S32)x << shift) >> shift;\r\n  return result;\r\n}\r\n\r\ninternal S64\r\nextend_sign64(U64 x, U64 size){\r\n  U64 high_bit = size * 8;\r\n  U64 shift = 64 - high_bit;\r\n  S64 result = ((S64)x << shift) >> shift;\r\n  return result;\r\n}\r\n\r\ninternal F32\r\ninf32(void){\r\n  union { U32 u; F32 f; } x;\r\n  x.u = exponent32;\r\n  return(x.f);\r\n}\r\n\r\ninternal F32\r\nneg_inf32(void){\r\n  union { U32 u; F32 f; } x;\r\n  x.u = sign32 | exponent32;\r\n  return(x.f);\r\n}\r\n\r\ninternal U16\r\nbswap_u16(U16 x)\r\n{\r\n  U16 result = (((x & 0xFF00) >> 8) |\r\n                ((x & 0x00FF) << 8));\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nbswap_u32(U32 x)\r\n{\r\n  U32 result = (((x & 0xFF000000) >> 24) |\r\n                ((x & 0x00FF0000) >> 8)  |\r\n                ((x & 0x0000FF00) << 8)  |\r\n                ((x & 0x000000FF) << 24));\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nbswap_u64(U64 x)\r\n{\r\n  // TODO(nick): naive bswap, replace with something that is faster like an intrinsic\r\n  U64 result = (((x & 0xFF00000000000000ULL) >> 56) |\r\n                ((x & 0x00FF000000000000ULL) >> 40) |\r\n                ((x & 0x0000FF0000000000ULL) >> 24) |\r\n                ((x & 0x000000FF00000000ULL) >> 8)  |\r\n                ((x & 0x00000000FF000000ULL) << 8)  |\r\n                ((x & 0x0000000000FF0000ULL) << 24) |\r\n                ((x & 0x000000000000FF00ULL) << 40) |\r\n                ((x & 0x00000000000000FFULL) << 56));\r\n  return result;\r\n}\r\n\r\n#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS)\r\n\r\ninternal U64\r\ncount_bits_set32(U32 val)\r\n{\r\n  return __popcnt(val);\r\n}\r\n\r\ninternal U64\r\ncount_bits_set64(U64 val)\r\n{\r\n  return __popcnt64(val);\r\n}\r\n\r\ninternal U64\r\nctz32(U32 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanForward(&idx, mask);\r\n  return idx;\r\n}\r\n\r\ninternal U64\r\nctz64(U64 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanForward64(&idx, mask);\r\n  return idx;\r\n}\r\n\r\ninternal U64\r\nclz32(U32 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanReverse(&idx, mask);\r\n  return 31 - idx;\r\n}\r\n\r\ninternal U64\r\nclz64(U64 mask)\r\n{\r\n  unsigned long idx;\r\n  _BitScanReverse64(&idx, mask);\r\n  return 63 - idx;\r\n}\r\n\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n\r\ninternal U64\r\ncount_bits_set32(U32 val)\r\n{\r\n  return __builtin_popcount(val);\r\n}\r\n\r\ninternal U64\r\ncount_bits_set64(U64 val)\r\n{\r\n  return __builtin_popcountll(val);\r\n}\r\n\r\ninternal U64\r\nctz32(U32 val)\r\n{\r\n  return __builtin_ctz(val);\r\n}\r\n\r\ninternal U64\r\nclz32(U32 val)\r\n{\r\n  return __builtin_clz(val);\r\n}\r\n\r\ninternal U64\r\nctz64(U64 val)\r\n{\r\n  return __builtin_ctzll(val);\r\n}\r\n\r\ninternal U64\r\nclz64(U64 val)\r\n{\r\n  return __builtin_clzll(val);\r\n}\r\n\r\n#else\r\n# error \"Bit intrinsic functions not defined for this compiler.\"\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> Sign\r\n\r\ninternal S32\r\nsign_from_side_S32(Side side){\r\n  return((side == Side_Min)?-1:1);\r\n}\r\n\r\ninternal F32\r\nsign_from_side_F32(Side side){\r\n  return((side == Side_Min)?-1.f:1.f);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Memory Functions\r\n\r\ninternal B32\r\nmemory_is_zero(void *ptr, U64 size){\r\n  B32 result = 1;\r\n  \r\n  // break down size\r\n  U64 extra = (size&0x7);\r\n  U64 count8 = (size >> 3);\r\n  \r\n  // check with 8-byte stride\r\n  U64 *p64 = (U64*)ptr;\r\n  if(result)\r\n  {\r\n    for (U64 i = 0; i < count8; i += 1, p64 += 1){\r\n      if (*p64 != 0){\r\n        result = 0;\r\n        goto done;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // check extra\r\n  if(result)\r\n  {\r\n    U8 *p8 = (U8*)p64;\r\n    for (U64 i = 0; i < extra; i += 1, p8 += 1){\r\n      if (*p8 != 0){\r\n        result = 0;\r\n        goto done;\r\n      }\r\n    }\r\n  }\r\n  \r\n  done:;\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text 2D Coordinate/Range Functions\r\n\r\ninternal TxtPt\r\ntxt_pt(S64 line, S64 column)\r\n{\r\n  TxtPt p = {0};\r\n  p.line = line;\r\n  p.column = column;\r\n  return p;\r\n}\r\n\r\ninternal B32\r\ntxt_pt_match(TxtPt a, TxtPt b)\r\n{\r\n  return a.line == b.line && a.column == b.column;\r\n}\r\n\r\ninternal B32\r\ntxt_pt_less_than(TxtPt a, TxtPt b)\r\n{\r\n  B32 result = 0;\r\n  if(a.line < b.line)\r\n  {\r\n    result = 1;\r\n  }\r\n  else if(a.line == b.line)\r\n  {\r\n    result = a.column < b.column;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtPt\r\ntxt_pt_min(TxtPt a, TxtPt b)\r\n{\r\n  TxtPt result = b;\r\n  if(txt_pt_less_than(a, b))\r\n  {\r\n    result = a;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtPt\r\ntxt_pt_max(TxtPt a, TxtPt b)\r\n{\r\n  TxtPt result = a;\r\n  if(txt_pt_less_than(a, b))\r\n  {\r\n    result = b;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtRng\r\ntxt_rng(TxtPt min, TxtPt max)\r\n{\r\n  TxtRng range = {0};\r\n  if(txt_pt_less_than(min, max))\r\n  {\r\n    range.min = min;\r\n    range.max = max;\r\n  }\r\n  else\r\n  {\r\n    range.min = max;\r\n    range.max = min;\r\n  }\r\n  return range;\r\n}\r\n\r\ninternal TxtRng\r\ntxt_rng_intersect(TxtRng a, TxtRng b)\r\n{\r\n  TxtRng result = {0};\r\n  result.min = txt_pt_max(a.min, b.min);\r\n  result.max = txt_pt_min(a.max, b.max);\r\n  if(txt_pt_less_than(result.max, result.min))\r\n  {\r\n    MemoryZeroStruct(&result);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TxtRng\r\ntxt_rng_union(TxtRng a, TxtRng b)\r\n{\r\n  TxtRng result = {0};\r\n  result.min = txt_pt_min(a.min, b.min);\r\n  result.max = txt_pt_max(a.max, b.max);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ntxt_rng_contains(TxtRng r, TxtPt pt)\r\n{\r\n  B32 result = ((txt_pt_less_than(r.min, pt) || txt_pt_match(r.min, pt)) &&\r\n                txt_pt_less_than(pt, r.max));\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Toolchain/Environment Enum Functions\r\n\r\ninternal U64\r\nbit_size_from_arch(Arch arch)\r\n{\r\n  // TODO(rjf): metacode\r\n  U64 arch_bitsize = 0;\r\n  switch(arch)\r\n  {\r\n    case Arch_x64:   arch_bitsize = 64; break;\r\n    case Arch_x86:   arch_bitsize = 32; break;\r\n    case Arch_arm64: arch_bitsize = 64; break;\r\n    case Arch_arm32: arch_bitsize = 32; break;\r\n    default: break;\r\n  }\r\n  return arch_bitsize;\r\n}\r\n\r\ninternal U64\r\nmax_instruction_size_from_arch(Arch arch)\r\n{\r\n  // TODO(rjf): make this real\r\n  return 64;\r\n}\r\n\r\ninternal OperatingSystem\r\noperating_system_from_context(void){\r\n  OperatingSystem os = OperatingSystem_Null;\r\n#if OS_WINDOWS\r\n  os = OperatingSystem_Windows;\r\n#elif OS_LINUX\r\n  os = OperatingSystem_Linux;\r\n#elif OS_MAC\r\n  os = OperatingSystem_Mac;\r\n#endif\r\n  return os;\r\n}\r\n\r\ninternal Arch\r\narch_from_context(void){\r\n  Arch arch = Arch_Null;\r\n#if ARCH_X64\r\n  arch = Arch_x64;\r\n#elif ARCH_X86\r\n  arch = Arch_x86;\r\n#elif ARCH_ARM64\r\n  arch = Arch_arm64;\r\n#elif ARCH_ARM32\r\n  arch = Arch_arm32;\r\n#endif\r\n  return arch;\r\n}\r\n\r\ninternal Compiler\r\ncompiler_from_context(void){\r\n  Compiler compiler = Compiler_Null;\r\n#if COMPILER_MSVC\r\n  compiler = Compiler_msvc;\r\n#elif COMPILER_GCC\r\n  compiler = Compiler_gcc;\r\n#elif COMPILER_CLANG\r\n  compiler = Compiler_clang;\r\n#endif\r\n  return compiler;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Functions\r\n\r\ninternal DenseTime\r\ndense_time_from_date_time(DateTime date_time){\r\n  DenseTime result = 0;\r\n  result += date_time.year;\r\n  result *= 12;\r\n  result += date_time.mon;\r\n  result *= 31;\r\n  result += date_time.day;\r\n  result *= 24;\r\n  result += date_time.hour;\r\n  result *= 60;\r\n  result += date_time.min;\r\n  result *= 61;\r\n  result += date_time.sec;\r\n  result *= 1000;\r\n  result += date_time.msec;\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\ndate_time_from_dense_time(DenseTime time){\r\n  DateTime result = {0};\r\n  result.msec = time%1000;\r\n  time /= 1000;\r\n  result.sec  = time%61;\r\n  time /= 61;\r\n  result.min  = time%60;\r\n  time /= 60;\r\n  result.hour = time%24;\r\n  time /= 24;\r\n  result.day  = time%31;\r\n  time /= 31;\r\n  result.mon  = time%12;\r\n  time /= 12;\r\n  Assert(time <= max_U32);\r\n  result.year = (U32)time;\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\ndate_time_from_micro_seconds(U64 time){\r\n  DateTime result = {0};\r\n  result.micro_sec = time%1000;\r\n  time /= 1000;\r\n  result.msec = time%1000;\r\n  time /= 1000;\r\n  result.sec = time%60;\r\n  time /= 60;\r\n  result.min = time%60;\r\n  time /= 60;\r\n  result.hour = time%24;\r\n  time /= 24;\r\n  result.day = time%31;\r\n  time /= 31;\r\n  result.mon = time%12;\r\n  time /= 12;\r\n  Assert(time <= max_U32);\r\n  result.year = (U32)time;\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\ndate_time_from_unix_time(U64 unix_time)\r\n{\r\n  DateTime date = {0};\r\n  date.year     = 1970;\r\n  date.day      = 1 + (unix_time / 86400);\r\n  date.sec      = (U32)unix_time % 60;\r\n  date.min      = (U32)(unix_time / 60) % 60;\r\n  date.hour     = (U32)(unix_time / 3600) % 24;\r\n\r\n  for(;;)\r\n  {\r\n    for(date.month = 0; date.month < 12; ++date.month)\r\n    {\r\n      U64 c = 0;\r\n      switch(date.month)\r\n      {\r\n        case Month_Jan: c = 31; break;\r\n        case Month_Feb:\r\n        {\r\n          if((date.year % 4 == 0) && ((date.year % 100) != 0 || (date.year % 400) == 0))\r\n          {\r\n            c = 29;\r\n          }\r\n          else\r\n          {\r\n            c = 28;\r\n          }\r\n        } break;\r\n        case Month_Mar: c = 31; break;\r\n        case Month_Apr: c = 30; break;\r\n        case Month_May: c = 31; break;\r\n        case Month_Jun: c = 30; break;\r\n        case Month_Jul: c = 31; break;\r\n        case Month_Aug: c = 31; break;\r\n        case Month_Sep: c = 30; break;\r\n        case Month_Oct: c = 31; break;\r\n        case Month_Nov: c = 30; break;\r\n        case Month_Dec: c = 31; break;\r\n        default: InvalidPath;\r\n      }\r\n      if(date.day <= c)\r\n      {\r\n        goto exit;\r\n      }\r\n      date.day -= c;\r\n    }\r\n    ++date.year;\r\n  }\r\n  exit:;\r\n\r\n  return date;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Non-Fancy Ring Buffer Reads/Writes\r\n\r\ninternal U64\r\nring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size)\r\n{\r\n  Assert(src_data_size <= ring_size);\r\n  {\r\n    U64 ring_off = ring_pos%ring_size;\r\n    U64 bytes_before_split = ring_size-ring_off;\r\n    U64 pre_split_bytes = Min(bytes_before_split, src_data_size);\r\n    U64 pst_split_bytes = src_data_size-pre_split_bytes;\r\n    void *pre_split_data = src_data;\r\n    void *pst_split_data = ((U8 *)src_data + pre_split_bytes);\r\n    MemoryCopy(ring_base+ring_off, pre_split_data, pre_split_bytes);\r\n    MemoryCopy(ring_base+0, pst_split_data, pst_split_bytes);\r\n  }\r\n  return src_data_size;\r\n}\r\n\r\ninternal U64\r\nring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size)\r\n{\r\n  Assert(read_size <= ring_size);\r\n  {\r\n    U64 ring_off = ring_pos%ring_size;\r\n    U64 bytes_before_split = ring_size-ring_off;\r\n    U64 pre_split_bytes = Min(bytes_before_split, read_size);\r\n    U64 pst_split_bytes = read_size-pre_split_bytes;\r\n    MemoryCopy(dst_data, ring_base+ring_off, pre_split_bytes);\r\n    MemoryCopy((U8 *)dst_data + pre_split_bytes, ring_base+0, pst_split_bytes);\r\n  }\r\n  return read_size;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_core.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_CORE_H\r\n#define BASE_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Foreign Includes\r\n\r\n#include <stdio.h>\r\n#include <stdarg.h>\r\n#include <math.h>\r\n#include <string.h>\r\n#include <stdint.h>\r\n\r\n////////////////////////////////\r\n//~ rjf: Codebase Keywords\r\n\r\n#define internal      static\r\n#define global        static\r\n#define local_persist static\r\n\r\n#if COMPILER_MSVC || (COMPILER_CLANG && OS_WINDOWS)\r\n# pragma section(\".rdata$\", read)\r\n# define read_only __declspec(allocate(\".rdata$\"))\r\n#elif (COMPILER_CLANG && OS_LINUX)\r\n# define read_only __attribute__((section(\".rodata\")))\r\n#else\r\n// NOTE(rjf): I don't know of a useful way to do this in GCC land.\r\n// __attribute__((section(\".rodata\"))) looked promising, but it introduces a\r\n// strange warning about malformed section attributes, and it doesn't look\r\n// like writing to that section reliably produces access violations, strangely\r\n// enough. (It does on Clang)\r\n# define read_only\r\n#endif\r\n\r\n#if COMPILER_MSVC\r\n# define thread_static __declspec(thread)\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define thread_static __thread\r\n#endif\r\n\r\n#if COMPILER_MSVC\r\n# define force_inline __forceinline\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define force_inline __attribute__((always_inline))\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Linkage Keyword Macros\r\n\r\n#if OS_WINDOWS\r\n# define shared_function C_LINKAGE __declspec(dllexport)\r\n#else\r\n# define shared_function C_LINKAGE\r\n#endif\r\n\r\n#if LANG_CPP\r\n# define C_LINKAGE_BEGIN extern \"C\"{\r\n# define C_LINKAGE_END }\r\n# define C_LINKAGE extern \"C\"\r\n#else\r\n# define C_LINKAGE_BEGIN\r\n# define C_LINKAGE_END\r\n# define C_LINKAGE\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Units\r\n\r\n#define KB(n)  (((U64)(n)) << 10)\r\n#define MB(n)  (((U64)(n)) << 20)\r\n#define GB(n)  (((U64)(n)) << 30)\r\n#define TB(n)  (((U64)(n)) << 40)\r\n#define Thousand(n)   ((n)*1000)\r\n#define Million(n)    ((n)*1000000)\r\n#define Billion(n)    ((n)*1000000000)\r\n\r\n////////////////////////////////\r\n//~ rjf: Branch Predictor Hints\r\n\r\n#if defined(__clang__)\r\n# define Expect(expr, val) __builtin_expect((expr), (val))\r\n#else\r\n# define Expect(expr, val) (expr)\r\n#endif\r\n\r\n#define Likely(expr)            Expect(expr,1)\r\n#define Unlikely(expr)          Expect(expr,0)\r\n\r\n////////////////////////////////\r\n//~ rjf: Clamps, Mins, Maxes\r\n\r\n#define Min(A,B) (((A)<(B))?(A):(B))\r\n#define Max(A,B) (((A)>(B))?(A):(B))\r\n#define ClampTop(A,X) Min(A,X)\r\n#define ClampBot(X,B) Max(X,B)\r\n#define Clamp(A,X,B) (((X)<(A))?(A):((X)>(B))?(B):(X))\r\n\r\n////////////////////////////////\r\n//~ rjf: Type -> Alignment\r\n\r\n#if COMPILER_MSVC\r\n# define AlignOf(T) __alignof(T)\r\n#elif COMPILER_CLANG\r\n# define AlignOf(T) __alignof(T)\r\n#elif COMPILER_GCC\r\n# define AlignOf(T) __alignof__(T)\r\n#else\r\n# error AlignOf not defined for this compiler.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Member Offsets\r\n\r\n#define Member(T,m)                 (((T*)0)->m)\r\n#define OffsetOf(T,m)               IntFromPtr(&Member(T,m))\r\n#define MemberFromOffset(T,ptr,off) (T)((((U8 *)ptr)+(off)))\r\n#define CastFromMember(T,m,ptr)     (T*)(((U8*)ptr) - OffsetOf(T,m))\r\n\r\n////////////////////////////////\r\n//~ rjf: For-Loop Construct Macros\r\n\r\n#define DeferLoop(begin, end)        for(int _i_ = ((begin), 0); !_i_; _i_ += 1, (end))\r\n#define DeferLoopChecked(begin, end) for(int _i_ = 2 * !(begin); (_i_ == 2 ? ((end), 0) : !_i_); _i_ += 1, (end))\r\n\r\n#define EachIndex(it, count) (U64 it = 0; it < (count); it += 1)\r\n#define EachElement(it, array) (U64 it = 0; it < ArrayCount(array); it += 1)\r\n#define EachEnumVal(type, it) (type it = (type)0; it < type##_COUNT; it = (type)(it+1))\r\n#define EachNonZeroEnumVal(type, it) (type it = (type)1; it < type##_COUNT; it = (type)(it+1))\r\n\r\n////////////////////////////////\r\n//~ rjf: Memory Operation Macros\r\n\r\n#define MemoryCopy(dst, src, size)    memmove((dst), (src), (size))\r\n#define MemorySet(dst, byte, size)    memset((dst), (byte), (size))\r\n#define MemoryCompare(a, b, size)     memcmp((a), (b), (size))\r\n#define MemoryStrlen(ptr)             strlen(ptr)\r\n\r\n#define MemoryCopyStruct(d,s)  MemoryCopy((d),(s),sizeof(*(d)))\r\n#define MemoryCopyArray(d,s)   MemoryCopy((d),(s),sizeof(d))\r\n#define MemoryCopyTyped(d,s,c) MemoryCopy((d),(s),sizeof(*(d))*(c))\r\n\r\n#define MemoryZero(s,z)       memset((s),0,(z))\r\n#define MemoryZeroStruct(s)   MemoryZero((s),sizeof(*(s)))\r\n#define MemoryZeroArray(a)    MemoryZero((a),sizeof(a))\r\n#define MemoryZeroTyped(m,c)  MemoryZero((m),sizeof(*(m))*(c))\r\n\r\n#define MemoryMatch(a,b,z)     (MemoryCompare((a),(b),(z)) == 0)\r\n#define MemoryMatchStruct(a,b)  MemoryMatch((a),(b),sizeof(*(a)))\r\n#define MemoryMatchArray(a,b)   MemoryMatch((a),(b),sizeof(a))\r\n\r\n#define MemoryRead(T,p,e)    ( ((p)+sizeof(T)<=(e))?(*(T*)(p)):(0) )\r\n#define MemoryConsume(T,p,e) ( ((p)+sizeof(T)<=(e))?((p)+=sizeof(T),*(T*)((p)-sizeof(T))):((p)=(e),0) )\r\n\r\n////////////////////////////////\r\n//~ rjf: Asserts\r\n\r\n#if COMPILER_MSVC\r\n# define Trap() __debugbreak()\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n# define Trap() __builtin_trap()\r\n#else\r\n# error Unknown trap intrinsic for this compiler.\r\n#endif\r\n\r\n#define AssertAlways(x) do{if(!(x)) {Trap();}}while(0)\r\n#if BUILD_DEBUG\r\n# define Assert(x) AssertAlways(x)\r\n#else\r\n# define Assert(x) (void)(x)\r\n#endif\r\n#define InvalidPath        Assert(!\"Invalid Path!\")\r\n#define NotImplemented     Assert(!\"Not Implemented!\")\r\n#define NoOp               ((void)0)\r\n#define StaticAssert(C, ID) global U8 Glue(ID, __LINE__)[(C)?1:-1]\r\n\r\n////////////////////////////////\r\n//~ rjf: Atomic Operations\r\n\r\n#if COMPILER_MSVC\r\n# include <intrin.h>\r\n# if ARCH_X64\r\n#  define ins_atomic_u64_eval(x)                 *((volatile U64 *)(x))\r\n#  define ins_atomic_u64_inc_eval(x)             InterlockedIncrement64((volatile __int64 *)(x))\r\n#  define ins_atomic_u64_dec_eval(x)             InterlockedDecrement64((volatile __int64 *)(x))\r\n#  define ins_atomic_u64_eval_assign(x,c)        InterlockedExchange64((volatile __int64 *)(x),(c))\r\n#  define ins_atomic_u64_add_eval(x,c)           InterlockedAdd64((volatile __int64 *)(x), c)\r\n#  define ins_atomic_u64_eval_cond_assign(x,k,c) InterlockedCompareExchange64((volatile __int64 *)(x),(k),(c))\r\n#  define ins_atomic_u32_eval(x)                 *((volatile U32 *)(x))\r\n#  define ins_atomic_u32_inc_eval(x)             InterlockedIncrement((volatile LONG *)x)\r\n#  define ins_atomic_u32_eval_assign(x,c)        InterlockedExchange((volatile LONG *)(x),(c))\r\n#  define ins_atomic_u32_eval_cond_assign(x,k,c) InterlockedCompareExchange((volatile LONG *)(x),(k),(c))\r\n#  define ins_atomic_u32_add_eval(x,c)           InterlockedAdd((volatile LONG *)(x), c)\r\n# else\r\n#  error Atomic intrinsics not defined for this compiler / architecture combination.\r\n# endif\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n#  define ins_atomic_u64_eval(x)                 __atomic_load_n(x, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u64_inc_eval(x)             (__atomic_fetch_add((volatile U64 *)(x), 1, __ATOMIC_SEQ_CST) + 1)\r\n#  define ins_atomic_u64_dec_eval(x)             (__atomic_fetch_sub((volatile U64 *)(x), 1, __ATOMIC_SEQ_CST) - 1)\r\n#  define ins_atomic_u64_eval_assign(x,c)        __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u64_add_eval(x,c)           (__atomic_fetch_add((volatile U64 *)(x), c, __ATOMIC_SEQ_CST) + (c))\r\n#  define ins_atomic_u64_eval_cond_assign(x,k,c) ({ U64 _new = (c); __atomic_compare_exchange_n((volatile U64 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; })\r\n#  define ins_atomic_u32_eval(x)                 __atomic_load_n(x, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u32_inc_eval(x)             (__atomic_fetch_add((volatile U32 *)(x), 1, __ATOMIC_SEQ_CST) + 1)\r\n#  define ins_atomic_u32_add_eval(x,c)           (__atomic_fetch_add((volatile U32 *)(x), c, __ATOMIC_SEQ_CST) + (c))\r\n#  define ins_atomic_u32_eval_assign(x,c)        __atomic_exchange_n(x, c, __ATOMIC_SEQ_CST)\r\n#  define ins_atomic_u32_eval_cond_assign(x,k,c) ({ U32 _new = (c); __atomic_compare_exchange_n((volatile U32 *)(x),&_new,(k),0,__ATOMIC_SEQ_CST,__ATOMIC_SEQ_CST); _new; })\r\n#else\r\n#  error Atomic intrinsics not defined for this compiler / architecture.\r\n#endif\r\n\r\n#if ARCH_64BIT\r\n# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void*)ins_atomic_u64_eval_cond_assign((volatile U64 *)(x), (U64)(k), (U64)(c))\r\n# define ins_atomic_ptr_eval_assign(x,c)        (void*)ins_atomic_u64_eval_assign((volatile U64 *)(x), (U64)(c))\r\n# define ins_atomic_ptr_eval(x)                 (void*)ins_atomic_u64_eval((volatile U64 *)x)\r\n#elif ARCH_32BIT\r\n# define ins_atomic_ptr_eval_cond_assign(x,k,c) (void*)ins_atomic_u32_eval_cond_assign((volatile U32 *)(x), (U32)(k), (U32)(c))\r\n# define ins_atomic_ptr_eval_assign(x,c)        (void*)ins_atomic_u32_eval_assign((volatile U32 *)(x), (U32)(c))\r\n# define ins_atomic_ptr_eval(x)                 (void*)ins_atomic_u32_eval((volatile U32 *)x)\r\n#else\r\n# error Atomic intrinsics for pointers not defined for this architecture.\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Linked List Building Macros\r\n\r\n//- rjf: linked list macro helpers\r\n#define CheckNil(nil,p) ((p) == 0 || (p) == nil)\r\n#define SetNil(nil,p) ((p) = nil)\r\n\r\n//- rjf: doubly-linked-lists\r\n#define DLLInsert_NPZ(nil,f,l,p,n,next,prev) (CheckNil(nil,f) ? \\\r\n((f) = (l) = (n), SetNil(nil,(n)->next), SetNil(nil,(n)->prev)) :\\\r\nCheckNil(nil,p) ? \\\r\n((n)->next = (f), (f)->prev = (n), (f) = (n), SetNil(nil,(n)->prev)) :\\\r\n((p)==(l)) ? \\\r\n((l)->next = (n), (n)->prev = (l), (l) = (n), SetNil(nil, (n)->next)) :\\\r\n(((!CheckNil(nil,p) && CheckNil(nil,(p)->next)) ? (0) : ((p)->next->prev = (n))), ((n)->next = (p)->next), ((p)->next = (n)), ((n)->prev = (p))))\r\n#define DLLPushBack_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,f,l,l,n,next,prev)\r\n#define DLLPushFront_NPZ(nil,f,l,n,next,prev) DLLInsert_NPZ(nil,l,f,f,n,prev,next)\r\n#define DLLRemove_NPZ(nil,f,l,n,next,prev) (((n) == (f) ? (f) = (n)->next : (0)),\\\r\n((n) == (l) ? (l) = (l)->prev : (0)),\\\r\n(CheckNil(nil,(n)->prev) ? (0) :\\\r\n((n)->prev->next = (n)->next)),\\\r\n(CheckNil(nil,(n)->next) ? (0) :\\\r\n((n)->next->prev = (n)->prev)))\r\n\r\n//- rjf: singly-linked, doubly-headed lists (queues)\r\n#define SLLQueuePush_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\\\r\n((f)=(l)=(n),SetNil(nil,(n)->next)):\\\r\n((l)->next=(n),(l)=(n),SetNil(nil,(n)->next)))\r\n#define SLLQueuePushFront_NZ(nil,f,l,n,next) (CheckNil(nil,f)?\\\r\n((f)=(l)=(n),SetNil(nil,(n)->next)):\\\r\n((n)->next=(f),(f)=(n)))\r\n#define SLLQueuePop_NZ(nil,f,l,next) ((f)==(l)?\\\r\n(SetNil(nil,f),SetNil(nil,l)):\\\r\n((f)=(f)->next))\r\n\r\n//- rjf: singly-linked, singly-headed lists (stacks)\r\n#define SLLStackPush_N(f,n,next) ((n)->next=(f), (f)=(n))\r\n#define SLLStackPop_N(f,next) ((f)=(f)->next)\r\n\r\n//- rjf: doubly-linked-list helpers\r\n#define DLLInsert_NP(f,l,p,n,next,prev) DLLInsert_NPZ(0,f,l,p,n,next,prev)\r\n#define DLLPushBack_NP(f,l,n,next,prev) DLLPushBack_NPZ(0,f,l,n,next,prev)\r\n#define DLLPushFront_NP(f,l,n,next,prev) DLLPushFront_NPZ(0,f,l,n,next,prev)\r\n#define DLLRemove_NP(f,l,n,next,prev) DLLRemove_NPZ(0,f,l,n,next,prev)\r\n#define DLLInsert(f,l,p,n) DLLInsert_NPZ(0,f,l,p,n,next,prev)\r\n#define DLLPushBack(f,l,n) DLLPushBack_NPZ(0,f,l,n,next,prev)\r\n#define DLLPushFront(f,l,n) DLLPushFront_NPZ(0,f,l,n,next,prev)\r\n#define DLLRemove(f,l,n) DLLRemove_NPZ(0,f,l,n,next,prev)\r\n\r\n//- rjf: singly-linked, doubly-headed list helpers\r\n#define SLLQueuePush_N(f,l,n,next) SLLQueuePush_NZ(0,f,l,n,next)\r\n#define SLLQueuePushFront_N(f,l,n,next) SLLQueuePushFront_NZ(0,f,l,n,next)\r\n#define SLLQueuePop_N(f,l,next) SLLQueuePop_NZ(0,f,l,next)\r\n#define SLLQueuePush(f,l,n) SLLQueuePush_NZ(0,f,l,n,next)\r\n#define SLLQueuePushFront(f,l,n) SLLQueuePushFront_NZ(0,f,l,n,next)\r\n#define SLLQueuePop(f,l) SLLQueuePop_NZ(0,f,l,next)\r\n\r\n//- rjf: singly-linked, singly-headed list helpers\r\n#define SLLStackPush(f,n) SLLStackPush_N(f,n,next)\r\n#define SLLStackPop(f) SLLStackPop_N(f,next)\r\n\r\n////////////////////////////////\r\n//~ rjf: Address Sanitizer Markup\r\n\r\n#if COMPILER_MSVC\r\n# if defined(__SANITIZE_ADDRESS__)\r\n#  define ASAN_ENABLED 1\r\n#  define NO_ASAN __declspec(no_sanitize_address)\r\n# else\r\n#  define NO_ASAN\r\n# endif\r\n#elif COMPILER_CLANG\r\n# if defined(__has_feature)\r\n#  if __has_feature(address_sanitizer) || defined(__SANITIZE_ADDRESS__)\r\n#   define ASAN_ENABLED 1\r\n#  endif\r\n# endif\r\n# define NO_ASAN __attribute__((no_sanitize(\"address\")))\r\n#else\r\n# define NO_ASAN\r\n#endif\r\n\r\n#if ASAN_ENABLED\r\n#pragma comment(lib, \"clang_rt.asan-x86_64.lib\")\r\nC_LINKAGE void __asan_poison_memory_region(void const volatile *addr, size_t size);\r\nC_LINKAGE void __asan_unpoison_memory_region(void const volatile *addr, size_t size);\r\n# define AsanPoisonMemoryRegion(addr, size)   __asan_poison_memory_region((addr), (size))\r\n# define AsanUnpoisonMemoryRegion(addr, size) __asan_unpoison_memory_region((addr), (size))\r\n#else\r\n# define AsanPoisonMemoryRegion(addr, size)   ((void)(addr), (void)(size))\r\n# define AsanUnpoisonMemoryRegion(addr, size) ((void)(addr), (void)(size))\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Misc. Helper Macros\r\n\r\n#define Stringify_(S) #S\r\n#define Stringify(S) Stringify_(S)\r\n\r\n#define Glue_(A,B) A##B\r\n#define Glue(A,B) Glue_(A,B)\r\n\r\n#define ArrayCount(a) (sizeof(a) / sizeof((a)[0]))\r\n\r\n#define CeilIntegerDiv(a,b) (((a) + (b) - 1)/(b))\r\n\r\n#define Swap(T,a,b) do{T t__ = a; a = b; b = t__;}while(0)\r\n\r\n#if ARCH_64BIT\r\n# define IntFromPtr(ptr) ((U64)(ptr))\r\n#elif ARCH_32BIT\r\n# define IntFromPtr(ptr) ((U32)(ptr))\r\n#else\r\n# error Missing pointer-to-integer cast for this architecture.\r\n#endif\r\n#define PtrFromInt(i) (void*)((U8*)0 + (i))\r\n\r\n#define Compose64Bit(a,b)  ((((U64)a) << 32) | ((U64)b));\r\n#define AlignPow2(x,b)     (((x) + (b) - 1)&(~((b) - 1)))\r\n#define AlignDownPow2(x,b) ((x)&(~((b) - 1)))\r\n#define AlignPadPow2(x,b)  ((0-(x)) & ((b) - 1))\r\n#define IsPow2(x)          ((x)!=0 && ((x)&((x)-1))==0)\r\n#define IsPow2OrZero(x)    ((((x) - 1)&(x)) == 0)\r\n\r\n#define ExtractBit(word, idx) (((word) >> (idx)) & 1)\r\n\r\n#if LANG_CPP\r\n# define zero_struct {}\r\n#else\r\n# define zero_struct {0}\r\n#endif\r\n\r\n#if COMPILER_MSVC && COMPILER_MSVC_YEAR < 2015\r\n# define this_function_name \"unknown\"\r\n#else\r\n# define this_function_name __func__\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Types\r\n\r\ntypedef uint8_t  U8;\r\ntypedef uint16_t U16;\r\ntypedef uint32_t U32;\r\ntypedef uint64_t U64;\r\ntypedef int8_t   S8;\r\ntypedef int16_t  S16;\r\ntypedef int32_t  S32;\r\ntypedef int64_t  S64;\r\ntypedef S8       B8;\r\ntypedef S16      B16;\r\ntypedef S32      B32;\r\ntypedef S64      B64;\r\ntypedef float    F32;\r\ntypedef double   F64;\r\ntypedef void VoidProc(void);\r\ntypedef struct U128 U128;\r\nstruct U128\r\n{\r\n  U64 u64[2];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Types & Spaces\r\n\r\ntypedef enum Dimension\r\n{\r\n  Dimension_X,\r\n  Dimension_Y,\r\n  Dimension_Z,\r\n  Dimension_W,\r\n}\r\nDimension;\r\n\r\ntypedef enum Side\r\n{\r\n  Side_Invalid = -1,\r\n  Side_Min,\r\n  Side_Max,\r\n  Side_COUNT,\r\n}\r\nSide;\r\n#define side_flip(s) ((Side)(!(s)))\r\n\r\ntypedef enum Axis2\r\n{\r\n  Axis2_Invalid = -1,\r\n  Axis2_X,\r\n  Axis2_Y,\r\n  Axis2_COUNT,\r\n}\r\nAxis2;\r\n#define axis2_flip(a) ((Axis2)(!(a)))\r\n\r\ntypedef enum Corner\r\n{\r\n  Corner_Invalid = -1,\r\n  Corner_00,\r\n  Corner_01,\r\n  Corner_10,\r\n  Corner_11,\r\n  Corner_COUNT\r\n}\r\nCorner;\r\n\r\ntypedef enum Dir2\r\n{\r\n  Dir2_Invalid = -1,\r\n  Dir2_Left,\r\n  Dir2_Up,\r\n  Dir2_Right,\r\n  Dir2_Down,\r\n  Dir2_COUNT\r\n}\r\nDir2;\r\n#define axis2_from_dir2(d) (((d) & 1) ? Axis2_Y : Axis2_X)\r\n#define side_from_dir2(d) (((d) < Dir2_Right) ? Side_Min : Side_Max)\r\n\r\n////////////////////////////////\r\n//~ rjf: Toolchain/Environment Enums\r\n\r\ntypedef enum OperatingSystem\r\n{\r\n  OperatingSystem_Null,\r\n  OperatingSystem_Windows,\r\n  OperatingSystem_Linux,\r\n  OperatingSystem_Mac,\r\n  OperatingSystem_COUNT,\r\n}\r\nOperatingSystem;\r\n\r\ntypedef enum ImageType\r\n{\r\n  Image_Null,\r\n  Image_CoffPe,\r\n  Image_Elf32,\r\n  Image_Elf64,\r\n  Image_Macho\r\n} ImageType;\r\n\r\ntypedef enum Arch\r\n{\r\n  Arch_Null,\r\n  Arch_x64,\r\n  Arch_x86,\r\n  Arch_arm64,\r\n  Arch_arm32,\r\n  Arch_COUNT,\r\n}\r\nArch;\r\n\r\ntypedef enum Compiler\r\n{\r\n  Compiler_Null,\r\n  Compiler_msvc,\r\n  Compiler_gcc,\r\n  Compiler_clang,\r\n  Compiler_COUNT,\r\n}\r\nCompiler;\r\n\r\n////////////////////////////////\r\n//~ rjf: Text 2D Coordinates & Ranges\r\n\r\ntypedef struct TxtPt TxtPt;\r\nstruct TxtPt\r\n{\r\n  S64 line;\r\n  S64 column;\r\n};\r\n\r\ntypedef struct TxtRng TxtRng;\r\nstruct TxtRng\r\n{\r\n  TxtPt min;\r\n  TxtPt max;\r\n};\r\n\r\n////////////////////////////////\r\n//~ Globally Unique Ids\r\n\r\ntypedef union Guid Guid;\r\nunion Guid\r\n{\r\n  struct\r\n  {\r\n    U32 data1;\r\n    U16 data2;\r\n    U16 data3;\r\n    U8  data4[8];\r\n  };\r\n  U8 v[16];\r\n};\r\nStaticAssert(sizeof(Guid) == 16, g_guid_size_check);\r\n\r\n////////////////////////////////\r\n//~ Arrays\r\n\r\ntypedef struct U16Array U16Array;\r\nstruct U16Array\r\n{\r\n  U64  count;\r\n  U16 *v;\r\n};\r\ntypedef struct U32Array U32Array;\r\nstruct U32Array\r\n{\r\n  U64  count;\r\n  U32 *v;\r\n};\r\ntypedef struct U64Array U64Array;\r\nstruct U64Array\r\n{\r\n  U64  count;\r\n  U64 *v;\r\n};\r\ntypedef struct U128Array U128Array;\r\nstruct U128Array\r\n{\r\n  U64   count;\r\n  U128 *v;\r\n};\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Constants\r\n\r\nglobal U32 sign32     = 0x80000000;\r\nglobal U32 exponent32 = 0x7F800000;\r\nglobal U32 mantissa32 = 0x007FFFFF;\r\n\r\nglobal F32   big_golden32 = 1.61803398875f;\r\nglobal F32 small_golden32 = 0.61803398875f;\r\n\r\nglobal F32 pi32 = 3.1415926535897f;\r\n\r\nglobal F64 machine_epsilon64 = 4.94065645841247e-324;\r\n\r\nglobal U64 max_U64 = 0xffffffffffffffffull;\r\nglobal U32 max_U32 = 0xffffffff;\r\nglobal U16 max_U16 = 0xffff;\r\nglobal U8  max_U8  = 0xff;\r\n\r\nglobal S64 max_S64 = (S64)0x7fffffffffffffffull;\r\nglobal S32 max_S32 = (S32)0x7fffffff;\r\nglobal S16 max_S16 = (S16)0x7fff;\r\nglobal S8  max_S8  =  (S8)0x7f;\r\n\r\nglobal S64 min_S64 = (S64)0xffffffffffffffffull;\r\nglobal S32 min_S32 = (S32)0xffffffff;\r\nglobal S16 min_S16 = (S16)0xffff;\r\nglobal S8  min_S8  =  (S8)0xff;\r\n\r\nglobal const U32 bitmask1  = 0x00000001;\r\nglobal const U32 bitmask2  = 0x00000003;\r\nglobal const U32 bitmask3  = 0x00000007;\r\nglobal const U32 bitmask4  = 0x0000000f;\r\nglobal const U32 bitmask5  = 0x0000001f;\r\nglobal const U32 bitmask6  = 0x0000003f;\r\nglobal const U32 bitmask7  = 0x0000007f;\r\nglobal const U32 bitmask8  = 0x000000ff;\r\nglobal const U32 bitmask9  = 0x000001ff;\r\nglobal const U32 bitmask10 = 0x000003ff;\r\nglobal const U32 bitmask11 = 0x000007ff;\r\nglobal const U32 bitmask12 = 0x00000fff;\r\nglobal const U32 bitmask13 = 0x00001fff;\r\nglobal const U32 bitmask14 = 0x00003fff;\r\nglobal const U32 bitmask15 = 0x00007fff;\r\nglobal const U32 bitmask16 = 0x0000ffff;\r\nglobal const U32 bitmask17 = 0x0001ffff;\r\nglobal const U32 bitmask18 = 0x0003ffff;\r\nglobal const U32 bitmask19 = 0x0007ffff;\r\nglobal const U32 bitmask20 = 0x000fffff;\r\nglobal const U32 bitmask21 = 0x001fffff;\r\nglobal const U32 bitmask22 = 0x003fffff;\r\nglobal const U32 bitmask23 = 0x007fffff;\r\nglobal const U32 bitmask24 = 0x00ffffff;\r\nglobal const U32 bitmask25 = 0x01ffffff;\r\nglobal const U32 bitmask26 = 0x03ffffff;\r\nglobal const U32 bitmask27 = 0x07ffffff;\r\nglobal const U32 bitmask28 = 0x0fffffff;\r\nglobal const U32 bitmask29 = 0x1fffffff;\r\nglobal const U32 bitmask30 = 0x3fffffff;\r\nglobal const U32 bitmask31 = 0x7fffffff;\r\nglobal const U32 bitmask32 = 0xffffffff;\r\n\r\nglobal const U64 bitmask33 = 0x00000001ffffffffull;\r\nglobal const U64 bitmask34 = 0x00000003ffffffffull;\r\nglobal const U64 bitmask35 = 0x00000007ffffffffull;\r\nglobal const U64 bitmask36 = 0x0000000fffffffffull;\r\nglobal const U64 bitmask37 = 0x0000001fffffffffull;\r\nglobal const U64 bitmask38 = 0x0000003fffffffffull;\r\nglobal const U64 bitmask39 = 0x0000007fffffffffull;\r\nglobal const U64 bitmask40 = 0x000000ffffffffffull;\r\nglobal const U64 bitmask41 = 0x000001ffffffffffull;\r\nglobal const U64 bitmask42 = 0x000003ffffffffffull;\r\nglobal const U64 bitmask43 = 0x000007ffffffffffull;\r\nglobal const U64 bitmask44 = 0x00000fffffffffffull;\r\nglobal const U64 bitmask45 = 0x00001fffffffffffull;\r\nglobal const U64 bitmask46 = 0x00003fffffffffffull;\r\nglobal const U64 bitmask47 = 0x00007fffffffffffull;\r\nglobal const U64 bitmask48 = 0x0000ffffffffffffull;\r\nglobal const U64 bitmask49 = 0x0001ffffffffffffull;\r\nglobal const U64 bitmask50 = 0x0003ffffffffffffull;\r\nglobal const U64 bitmask51 = 0x0007ffffffffffffull;\r\nglobal const U64 bitmask52 = 0x000fffffffffffffull;\r\nglobal const U64 bitmask53 = 0x001fffffffffffffull;\r\nglobal const U64 bitmask54 = 0x003fffffffffffffull;\r\nglobal const U64 bitmask55 = 0x007fffffffffffffull;\r\nglobal const U64 bitmask56 = 0x00ffffffffffffffull;\r\nglobal const U64 bitmask57 = 0x01ffffffffffffffull;\r\nglobal const U64 bitmask58 = 0x03ffffffffffffffull;\r\nglobal const U64 bitmask59 = 0x07ffffffffffffffull;\r\nglobal const U64 bitmask60 = 0x0fffffffffffffffull;\r\nglobal const U64 bitmask61 = 0x1fffffffffffffffull;\r\nglobal const U64 bitmask62 = 0x3fffffffffffffffull;\r\nglobal const U64 bitmask63 = 0x7fffffffffffffffull;\r\nglobal const U64 bitmask64 = 0xffffffffffffffffull;\r\n\r\nglobal const U32 bit1  = (1<<0);\r\nglobal const U32 bit2  = (1<<1);\r\nglobal const U32 bit3  = (1<<2);\r\nglobal const U32 bit4  = (1<<3);\r\nglobal const U32 bit5  = (1<<4);\r\nglobal const U32 bit6  = (1<<5);\r\nglobal const U32 bit7  = (1<<6);\r\nglobal const U32 bit8  = (1<<7);\r\nglobal const U32 bit9  = (1<<8);\r\nglobal const U32 bit10 = (1<<9);\r\nglobal const U32 bit11 = (1<<10);\r\nglobal const U32 bit12 = (1<<11);\r\nglobal const U32 bit13 = (1<<12);\r\nglobal const U32 bit14 = (1<<13);\r\nglobal const U32 bit15 = (1<<14);\r\nglobal const U32 bit16 = (1<<15);\r\nglobal const U32 bit17 = (1<<16);\r\nglobal const U32 bit18 = (1<<17);\r\nglobal const U32 bit19 = (1<<18);\r\nglobal const U32 bit20 = (1<<19);\r\nglobal const U32 bit21 = (1<<20);\r\nglobal const U32 bit22 = (1<<21);\r\nglobal const U32 bit23 = (1<<22);\r\nglobal const U32 bit24 = (1<<23);\r\nglobal const U32 bit25 = (1<<24);\r\nglobal const U32 bit26 = (1<<25);\r\nglobal const U32 bit27 = (1<<26);\r\nglobal const U32 bit28 = (1<<27);\r\nglobal const U32 bit29 = (1<<28);\r\nglobal const U32 bit30 = (1<<29);\r\nglobal const U32 bit31 = (1<<30);\r\nglobal const U32 bit32 = (1<<31);\r\n\r\nglobal const U64 bit33 = (1ull<<32);\r\nglobal const U64 bit34 = (1ull<<33);\r\nglobal const U64 bit35 = (1ull<<34);\r\nglobal const U64 bit36 = (1ull<<35);\r\nglobal const U64 bit37 = (1ull<<36);\r\nglobal const U64 bit38 = (1ull<<37);\r\nglobal const U64 bit39 = (1ull<<38);\r\nglobal const U64 bit40 = (1ull<<39);\r\nglobal const U64 bit41 = (1ull<<40);\r\nglobal const U64 bit42 = (1ull<<41);\r\nglobal const U64 bit43 = (1ull<<42);\r\nglobal const U64 bit44 = (1ull<<43);\r\nglobal const U64 bit45 = (1ull<<44);\r\nglobal const U64 bit46 = (1ull<<45);\r\nglobal const U64 bit47 = (1ull<<46);\r\nglobal const U64 bit48 = (1ull<<47);\r\nglobal const U64 bit49 = (1ull<<48);\r\nglobal const U64 bit50 = (1ull<<49);\r\nglobal const U64 bit51 = (1ull<<50);\r\nglobal const U64 bit52 = (1ull<<51);\r\nglobal const U64 bit53 = (1ull<<52);\r\nglobal const U64 bit54 = (1ull<<53);\r\nglobal const U64 bit55 = (1ull<<54);\r\nglobal const U64 bit56 = (1ull<<55);\r\nglobal const U64 bit57 = (1ull<<56);\r\nglobal const U64 bit58 = (1ull<<57);\r\nglobal const U64 bit59 = (1ull<<58);\r\nglobal const U64 bit60 = (1ull<<59);\r\nglobal const U64 bit61 = (1ull<<60);\r\nglobal const U64 bit62 = (1ull<<61);\r\nglobal const U64 bit63 = (1ull<<62);\r\nglobal const U64 bit64 = (1ull<<63);\r\n\r\n////////////////////////////////\r\n//~ allen: Time\r\n\r\ntypedef enum WeekDay\r\n{\r\n  WeekDay_Sun,\r\n  WeekDay_Mon,\r\n  WeekDay_Tue,\r\n  WeekDay_Wed,\r\n  WeekDay_Thu,\r\n  WeekDay_Fri,\r\n  WeekDay_Sat,\r\n  WeekDay_COUNT,\r\n}\r\nWeekDay;\r\n\r\ntypedef enum Month\r\n{\r\n  Month_Jan,\r\n  Month_Feb,\r\n  Month_Mar,\r\n  Month_Apr,\r\n  Month_May,\r\n  Month_Jun,\r\n  Month_Jul,\r\n  Month_Aug,\r\n  Month_Sep,\r\n  Month_Oct,\r\n  Month_Nov,\r\n  Month_Dec,\r\n  Month_COUNT,\r\n}\r\nMonth;\r\n\r\ntypedef struct DateTime DateTime;\r\nstruct DateTime\r\n{\r\n  U16 micro_sec; // [0,999]\r\n  U16 msec; // [0,999]\r\n  U16 sec;  // [0,60]\r\n  U16 min;  // [0,59]\r\n  U16 hour; // [0,24]\r\n  U16 day;  // [0,30]\r\n  union\r\n  {\r\n    WeekDay week_day;\r\n    U32 wday;\r\n  };\r\n  union\r\n  {\r\n    Month month;\r\n    U32 mon;\r\n  };\r\n  U32 year; // 1 = 1 CE, 0 = 1 BC\r\n};\r\n\r\ntypedef U64 DenseTime;\r\n\r\n////////////////////////////////\r\n//~ allen: Files\r\n\r\ntypedef U32 FilePropertyFlags;\r\nenum\r\n{\r\n  FilePropertyFlag_IsFolder = (1 << 0),\r\n};\r\n\r\ntypedef struct FileProperties FileProperties;\r\nstruct FileProperties\r\n{\r\n  U64 size;\r\n  DenseTime modified;\r\n  DenseTime created;\r\n  FilePropertyFlags flags;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Safe Casts\r\n\r\ninternal U16 safe_cast_u16(U32 x);\r\ninternal U32 safe_cast_u32(U64 x);\r\ninternal S32 safe_cast_s32(S64 x);\r\n\r\n////////////////////////////////\r\n//~ rjf: Large Base Type Functions\r\n\r\ninternal U128 u128_zero(void);\r\ninternal U128 u128_make(U64 v0, U64 v1);\r\ninternal B32 u128_match(U128 a, U128 b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Bit Patterns\r\n\r\ninternal U32 u32_from_u64_saturate(U64 x);\r\ninternal U64 u64_up_to_pow2(U64 x);\r\ninternal S32 extend_sign32(U32 x, U32 size);\r\ninternal S64 extend_sign64(U64 x, U64 size);\r\n\r\ninternal F32 inf32(void);\r\ninternal F32 neg_inf32(void);\r\n\r\ninternal U16 bswap_u16(U16 x);\r\ninternal U32 bswap_u32(U32 x);\r\ninternal U64 bswap_u64(U64 x);\r\n\r\n#if ARCH_LITTLE_ENDIAN\r\n# define from_be_u16(x) bswap_u16(x)\r\n# define from_be_u32(x) bswap_u32(x)\r\n# define from_be_u64(x) bswap_u64(x)\r\n#else\r\n# define from_be_u16(x) (x)\r\n# define from_be_u32(x) (x)\r\n# define from_be_u64(x) (x)\r\n#endif\r\n\r\ninternal U64 count_bits_set32(U32 val);\r\ninternal U64 count_bits_set64(U64 val);\r\n\r\ninternal U64 ctz32(U32 val);\r\ninternal U64 ctz64(U64 val);\r\ninternal U64 clz32(U32 val);\r\ninternal U64 clz64(U64 val);\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum -> Sign\r\n\r\ninternal S32 sign_from_side_S32(Side side);\r\ninternal F32 sign_from_side_F32(Side side);\r\n\r\n////////////////////////////////\r\n//~ rjf: Memory Functions\r\n\r\ninternal B32 memory_is_zero(void *ptr, U64 size);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text 2D Coordinate/Range Functions\r\n\r\ninternal TxtPt txt_pt(S64 line, S64 column);\r\ninternal B32 txt_pt_match(TxtPt a, TxtPt b);\r\ninternal B32 txt_pt_less_than(TxtPt a, TxtPt b);\r\ninternal TxtPt txt_pt_min(TxtPt a, TxtPt b);\r\ninternal TxtPt txt_pt_max(TxtPt a, TxtPt b);\r\ninternal TxtRng txt_rng(TxtPt min, TxtPt max);\r\ninternal TxtRng txt_rng_intersect(TxtRng a, TxtRng b);\r\ninternal TxtRng txt_rng_union(TxtRng a, TxtRng b);\r\ninternal B32 txt_rng_contains(TxtRng r, TxtPt pt);\r\n\r\n////////////////////////////////\r\n//~ rjf: Toolchain/Environment Enum Functions\r\n\r\ninternal U64 bit_size_from_arch(Arch arch);\r\ninternal U64 max_instruction_size_from_arch(Arch arch);\r\n\r\ninternal OperatingSystem operating_system_from_context(void);\r\ninternal Arch arch_from_context(void);\r\ninternal Compiler compiler_from_context(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Functions\r\n\r\ninternal DenseTime dense_time_from_date_time(DateTime date_time);\r\ninternal DateTime  date_time_from_dense_time(DenseTime time);\r\ninternal DateTime  date_time_from_micro_seconds(U64 time);\r\ninternal DateTime  date_time_from_unix_time(U64 unix_time);\r\n\r\n////////////////////////////////\r\n//~ rjf: Non-Fancy Ring Buffer Reads/Writes\r\n\r\ninternal U64 ring_write(U8 *ring_base, U64 ring_size, U64 ring_pos, void *src_data, U64 src_data_size);\r\ninternal U64 ring_read(U8 *ring_base, U64 ring_size, U64 ring_pos, void *dst_data, U64 read_size);\r\n#define ring_write_struct(ring_base, ring_size, ring_pos, ptr) ring_write((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr)))\r\n#define ring_read_struct(ring_base, ring_size, ring_pos, ptr) ring_read((ring_base), (ring_size), (ring_pos), (ptr), sizeof(*(ptr)))\r\n\r\n////////////////////////////////\r\n//~ rjf: Sorts\r\n\r\n#define quick_sort(ptr, count, element_size, cmp_function) qsort((ptr), (count), (element_size), (int (*)(const void *, const void *))(cmp_function))\r\n\r\n#endif // BASE_CORE_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_entry_point.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\nglobal U64 global_update_tick_idx = 0;\r\n\r\ninternal void\r\nmain_thread_base_entry_point(int arguments_count, char **arguments)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  ThreadNameF(\"[main thread]\");\r\n  \r\n  //- rjf: set up telemetry\r\n#if PROFILE_TELEMETRY\r\n  local_persist char tm_data[MB(64)];\r\n  tmLoadLibrary(TM_RELEASE);\r\n  tmSetMaxThreadCount(256);\r\n  tmInitialize(sizeof(tm_data), tm_data);\r\n#endif\r\n  \r\n  //- rjf: parse command line\r\n  String8List command_line_argument_strings = os_string_list_from_argcv(scratch.arena, arguments_count, arguments);\r\n  CmdLine cmdline = cmd_line_from_string_list(scratch.arena, command_line_argument_strings);\r\n  \r\n  //- rjf: begin captures\r\n  B32 capture = cmd_line_has_flag(&cmdline, str8_lit(\"capture\"));\r\n  if(capture)\r\n  {\r\n    ProfBeginCapture(arguments[0]);\r\n  }\r\n  \r\n#if PROFILE_TELEMETRY \r\n  tmMessage(0, TMMF_ICON_NOTE, BUILD_TITLE);\r\n#endif\r\n  \r\n  //- rjf: initialize all included layers\r\n#if defined(ASYNC_H) && !defined(ASYNC_INIT_MANUAL)\r\n  async_init(&cmdline);\r\n#endif\r\n#if defined(RDI_FROM_PDB_H) && !defined(P2R_INIT_MANUAL)\r\n  p2r_init();\r\n#endif\r\n#if defined(HASH_STORE_H) && !defined(HS_INIT_MANUAL)\r\n  hs_init();\r\n#endif\r\n#if defined(FILE_STREAM_H) && !defined(FS_INIT_MANUAL)\r\n  fs_init();\r\n#endif\r\n#if defined(TEXT_CACHE_H) && !defined(TXT_INIT_MANUAL)\r\n  txt_init();\r\n#endif\r\n#if defined(MUTABLE_TEXT_H) && !defined(MTX_INIT_MANUAL)\r\n  mtx_init();\r\n#endif\r\n#if defined(DASM_CACHE_H) && !defined(DASM_INIT_MANUAL)\r\n  dasm_init();\r\n#endif\r\n#if defined(DBGI_H) && !defined(DI_INIT_MANUAL)\r\n  di_init();\r\n#endif\r\n#if defined(DEMON_CORE_H) && !defined(DMN_INIT_MANUAL)\r\n  dmn_init();\r\n#endif\r\n#if defined(CTRL_CORE_H) && !defined(CTRL_INIT_MANUAL)\r\n  ctrl_init();\r\n#endif\r\n#if defined(OS_GFX_H) && !defined(OS_GFX_INIT_MANUAL)\r\n  os_gfx_init();\r\n#endif\r\n#if defined(FONT_PROVIDER_H) && !defined(FP_INIT_MANUAL)\r\n  fp_init();\r\n#endif\r\n#if defined(RENDER_CORE_H) && !defined(R_INIT_MANUAL)\r\n  r_init(&cmdline);\r\n#endif\r\n#if defined(TEXTURE_CACHE_H) && !defined(TEX_INIT_MANUAL)\r\n  tex_init();\r\n#endif\r\n#if defined(GEO_CACHE_H) && !defined(GEO_INIT_MANUAL)\r\n  geo_init();\r\n#endif\r\n#if defined(FONT_CACHE_H) && !defined(FNT_INIT_MANUAL)\r\n  fnt_init();\r\n#endif\r\n#if defined(DBG_ENGINE_CORE_H) && !defined(D_INIT_MANUAL)\r\n  d_init();\r\n#endif\r\n#if defined(RADDBG_CORE_H) && !defined(RD_INIT_MANUAL)\r\n  rd_init(&cmdline);\r\n#endif\r\n  \r\n  //- rjf: call into entry point\r\n  entry_point(&cmdline);\r\n  \r\n  //- rjf: end captures\r\n  if(capture)\r\n  {\r\n    ProfEndCapture();\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nsupplement_thread_base_entry_point(void (*entry_point)(void *params), void *params)\r\n{\r\n  TCTX tctx;\r\n  tctx_init_and_equip(&tctx);\r\n  entry_point(params);\r\n  tctx_release();\r\n}\r\n\r\ninternal U64\r\nupdate_tick_idx(void)\r\n{\r\n  U64 result = ins_atomic_u64_eval(&global_update_tick_idx);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nupdate(void)\r\n{\r\n  ProfTick(0);\r\n  ins_atomic_u64_inc_eval(&global_update_tick_idx);\r\n#if OS_FEATURE_GRAPHICAL\r\n  B32 result = frame();\r\n#else\r\n  B32 result = 0;\r\n#endif\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_entry_point.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_ENTRY_POINT_H\r\n#define BASE_ENTRY_POINT_H\r\n\r\ninternal void main_thread_base_entry_point(int argc, char **argv);\r\ninternal void supplement_thread_base_entry_point(void (*entry_point)(void *params), void *params);\r\ninternal U64 update_tick_idx(void);\r\ninternal B32 update(void);\r\n\r\n#endif // BASE_ENTRY_POINT_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_inc.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Includes\r\n\r\n#undef MARKUP_LAYER_COLOR\r\n#define MARKUP_LAYER_COLOR 0.20f, 0.60f, 0.80f\r\n\r\n#include \"metagen_base_core.c\"\r\n#include \"metagen_base_profile.c\"\r\n#include \"metagen_base_arena.c\"\r\n#include \"metagen_base_math.c\"\r\n#include \"metagen_base_strings.c\"\r\n#include \"metagen_base_thread_context.c\"\r\n#include \"metagen_base_command_line.c\"\r\n#include \"metagen_base_markup.c\"\r\n#include \"metagen_base_meta.c\"\r\n#include \"metagen_base_log.c\"\r\n#include \"metagen_base_entry_point.c\"\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_inc.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_INC_H\r\n#define BASE_INC_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Base Includes\r\n\r\n#include \"metagen_base_context_cracking.h\"\r\n\r\n#include \"metagen_base_core.h\"\r\n#include \"metagen_base_profile.h\"\r\n#include \"metagen_base_arena.h\"\r\n#include \"metagen_base_math.h\"\r\n#include \"metagen_base_strings.h\"\r\n#include \"metagen_base_thread_context.h\"\r\n#include \"metagen_base_command_line.h\"\r\n#include \"metagen_base_markup.h\"\r\n#include \"metagen_base_meta.h\"\r\n#include \"metagen_base_log.h\"\r\n#include \"metagen_base_entry_point.h\"\r\n\r\n#endif // BASE_INC_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_log.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals/Thread-Locals\r\n\r\nC_LINKAGE thread_static Log *log_active;\r\n#if !BUILD_SUPPLEMENTARY_UNIT\r\nC_LINKAGE thread_static Log *log_active = 0;\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Creation/Selection\r\n\r\ninternal Log *\r\nlog_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  Log *log = push_array(arena, Log, 1);\r\n  log->arena = arena;\r\n  return log;\r\n}\r\n\r\ninternal void\r\nlog_release(Log *log)\r\n{\r\n  arena_release(log->arena);\r\n}\r\n\r\ninternal void\r\nlog_select(Log *log)\r\n{\r\n  log_active = log;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Building/Clearing\r\n\r\ninternal void\r\nlog_msg(LogMsgKind kind, String8 string)\r\n{\r\n  if(log_active != 0 && log_active->top_scope != 0)\r\n  {\r\n    String8 string_copy = push_str8_copy(log_active->arena, string);\r\n    str8_list_push(log_active->arena, &log_active->top_scope->strings[kind], string_copy);\r\n  }\r\n}\r\n\r\ninternal void\r\nlog_msgf(LogMsgKind kind, char *fmt, ...)\r\n{\r\n  if(log_active != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    va_list args;\r\n    va_start(args, fmt);\r\n    String8 string = push_str8fv(scratch.arena, fmt, args);\r\n    log_msg(kind, string);\r\n    va_end(args);\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Scopes\r\n\r\ninternal void\r\nlog_scope_begin(void)\r\n{\r\n  if(log_active != 0)\r\n  {\r\n    U64 pos = arena_pos(log_active->arena);\r\n    LogScope *scope = push_array(log_active->arena, LogScope, 1);\r\n    scope->pos = pos;\r\n    SLLStackPush(log_active->top_scope, scope);\r\n  }\r\n}\r\n\r\ninternal LogScopeResult\r\nlog_scope_end(Arena *arena)\r\n{\r\n  LogScopeResult result = {0};\r\n  if(log_active != 0)\r\n  {\r\n    LogScope *scope = log_active->top_scope;\r\n    if(scope != 0)\r\n    {\r\n      SLLStackPop(log_active->top_scope);\r\n      if(arena != 0)\r\n      {\r\n        for EachEnumVal(LogMsgKind, kind)\r\n        {\r\n          Temp scratch = scratch_begin(&arena, 1);\r\n          String8 result_unindented = str8_list_join(scratch.arena, &scope->strings[kind], 0);\r\n          result.strings[kind] = indented_from_string(arena, result_unindented);\r\n          scratch_end(scratch);\r\n        }\r\n      }\r\n      arena_pop_to(log_active->arena, scope->pos);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_log.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_LOG_H\r\n#define BASE_LOG_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Types\r\n\r\ntypedef enum LogMsgKind\r\n{\r\n  LogMsgKind_Info,\r\n  LogMsgKind_UserError,\r\n  LogMsgKind_COUNT\r\n}\r\nLogMsgKind;\r\n\r\ntypedef struct LogScope LogScope;\r\nstruct LogScope\r\n{\r\n  LogScope *next;\r\n  U64 pos;\r\n  String8List strings[LogMsgKind_COUNT];\r\n};\r\n\r\ntypedef struct LogScopeResult LogScopeResult;\r\nstruct LogScopeResult\r\n{\r\n  String8 strings[LogMsgKind_COUNT];\r\n};\r\n\r\ntypedef struct Log Log;\r\nstruct Log\r\n{\r\n  Arena *arena;\r\n  LogScope *top_scope;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Creation/Selection\r\n\r\ninternal Log *log_alloc(void);\r\ninternal void log_release(Log *log);\r\ninternal void log_select(Log *log);\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Building\r\n\r\ninternal void log_msg(LogMsgKind kind, String8 string);\r\ninternal void log_msgf(LogMsgKind kind, char *fmt, ...);\r\n#define log_info(s)               log_msg(LogMsgKind_Info, (s))\r\n#define log_infof(fmt, ...)       log_msgf(LogMsgKind_Info, (fmt), __VA_ARGS__)\r\n#define log_user_error(s)         log_msg(LogMsgKind_UserError, (s))\r\n#define log_user_errorf(fmt, ...) log_msgf(LogMsgKind_UserError, (fmt), __VA_ARGS__)\r\n\r\n#define LogInfoNamedBlock(s) DeferLoop(log_infof(\"%S:\\n{\\n\", (s)), log_infof(\"}\\n\"))\r\n#define LogInfoNamedBlockF(fmt, ...) DeferLoop((log_infof(fmt, __VA_ARGS__), log_infof(\":\\n{\\n\")), log_infof(\"}\\n\"))\r\n\r\n////////////////////////////////\r\n//~ rjf: Log Scopes\r\n\r\ninternal void log_scope_begin(void);\r\ninternal LogScopeResult log_scope_end(Arena *arena);\r\n\r\n#endif // BASE_LOG_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_markup.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal void\r\nset_thread_name(String8 string)\r\n{\r\n  ProfThreadName(\"%.*s\", str8_varg(string));\r\n  os_set_thread_name(string);\r\n}\r\n\r\ninternal void\r\nset_thread_namef(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  set_thread_name(string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_markup.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_MARKUP_H\r\n#define BASE_MARKUP_H\r\n\r\ninternal void set_thread_name(String8 string);\r\ninternal void set_thread_namef(char *fmt, ...);\r\n#define ThreadNameF(...) (set_thread_namef(__VA_ARGS__))\r\n#define ThreadName(str) (set_thread_name(str))\r\n\r\n#endif // BASE_MARKUP_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_math.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Scalar Ops\r\n\r\ninternal F32\r\nmix_1f32(F32 a, F32 b, F32 t)\r\n{\r\n  F32 c = (a + (b-a) * Clamp(0.f, t, 1.f));\r\n  return c;\r\n}\r\n\r\ninternal F64\r\nmix_1f64(F64 a, F64 b, F64 t)\r\n{\r\n  F64 c = (a + (b-a) * Clamp(0.0, t, 1.0));\r\n  return c;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Vector Ops\r\n\r\ninternal Vec2F32 vec_2f32(F32 x, F32 y)                         {Vec2F32 v = {x, y}; return v;}\r\ninternal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x+b.x, a.y+b.y}; return c;}\r\ninternal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x-b.x, a.y-b.y}; return c;}\r\ninternal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x*b.x, a.y*b.y}; return c;}\r\ninternal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b)                 {Vec2F32 c = {a.x/b.x, a.y/b.y}; return c;}\r\ninternal Vec2F32 scale_2f32(Vec2F32 v, F32 s)                   {Vec2F32 c = {v.x*s, v.y*s}; return c;}\r\ninternal F32 dot_2f32(Vec2F32 a, Vec2F32 b)                     {F32 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal F32 length_squared_2f32(Vec2F32 v)                     {F32 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal F32 length_2f32(Vec2F32 v)                             {F32 c = sqrt_f32(v.x*v.x + v.y*v.y); return c;}\r\ninternal Vec2F32 normalize_2f32(Vec2F32 v)                      {v = scale_2f32(v, 1.f/length_2f32(v)); return v;}\r\ninternal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t)          {Vec2F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t)}; return c;}\r\n\r\ninternal Vec2S64 vec_2s64(S64 x, S64 y)                         {Vec2S64 v = {x, y}; return v;}\r\ninternal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x+b.x, a.y+b.y}; return c;}\r\ninternal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x-b.x, a.y-b.y}; return c;}\r\ninternal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x*b.x, a.y*b.y}; return c;}\r\ninternal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b)                 {Vec2S64 c = {a.x/b.x, a.y/b.y}; return c;}\r\ninternal Vec2S64 scale_2s64(Vec2S64 v, S64 s)                   {Vec2S64 c = {v.x*s, v.y*s}; return c;}\r\ninternal S64 dot_2s64(Vec2S64 a, Vec2S64 b)                     {S64 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal S64 length_squared_2s64(Vec2S64 v)                     {S64 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal S64 length_2s64(Vec2S64 v)                             {S64 c = (S64)sqrt_f64((F64)(v.x*v.x + v.y*v.y)); return c;}\r\ninternal Vec2S64 normalize_2s64(Vec2S64 v)                      {v = scale_2s64(v, (S64)(1.f/length_2s64(v))); return v;}\r\ninternal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t)          {Vec2S64 c = {(S64)mix_1f32((F32)a.x, (F32)b.x, t), (S64)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;}\r\n\r\ninternal Vec2S32 vec_2s32(S32 x, S32 y)                         {Vec2S32 v = {x, y}; return v;}\r\ninternal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x+b.x, a.y+b.y}; return c;}\r\ninternal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x-b.x, a.y-b.y}; return c;}\r\ninternal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x*b.x, a.y*b.y}; return c;}\r\ninternal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b)                 {Vec2S32 c = {a.x/b.x, a.y/b.y}; return c;}\r\ninternal Vec2S32 scale_2s32(Vec2S32 v, S32 s)                   {Vec2S32 c = {v.x*s, v.y*s}; return c;}\r\ninternal S32 dot_2s32(Vec2S32 a, Vec2S32 b)                     {S32 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal S32 length_squared_2s32(Vec2S32 v)                     {S32 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal S32 length_2s32(Vec2S32 v)                             {S32 c = (S32)sqrt_f32((F32)v.x*(F32)v.x + (F32)v.y*(F32)v.y); return c;}\r\ninternal Vec2S32 normalize_2s32(Vec2S32 v)                      {v = scale_2s32(v, (S32)(1.f/length_2s32(v))); return v;}\r\ninternal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t)          {Vec2S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;}\r\n\r\ninternal Vec2S16 vec_2s16(S16 x, S16 y)                         {Vec2S16 v = {x, y}; return v;}\r\ninternal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x+b.x), (S16)(a.y+b.y)}; return c;}\r\ninternal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x-b.x), (S16)(a.y-b.y)}; return c;}\r\ninternal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x*b.x), (S16)(a.y*b.y)}; return c;}\r\ninternal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b)                 {Vec2S16 c = {(S16)(a.x/b.x), (S16)(a.y/b.y)}; return c;}\r\ninternal Vec2S16 scale_2s16(Vec2S16 v, S16 s)                   {Vec2S16 c = {(S16)(v.x*s), (S16)(v.y*s)}; return c;}\r\ninternal S16 dot_2s16(Vec2S16 a, Vec2S16 b)                     {S16 c = a.x*b.x + a.y*b.y; return c;}\r\ninternal S16 length_squared_2s16(Vec2S16 v)                     {S16 c = v.x*v.x + v.y*v.y; return c;}\r\ninternal S16 length_2s16(Vec2S16 v)                             {S16 c = (S16)sqrt_f32((F32)(v.x*v.x + v.y*v.y)); return c;}\r\ninternal Vec2S16 normalize_2s16(Vec2S16 v)                      {v = scale_2s16(v, (S16)(1.f/length_2s16(v))); return v;}\r\ninternal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t)          {Vec2S16 c = {(S16)mix_1f32((F32)a.x, (F32)b.x, t), (S16)mix_1f32((F32)a.y, (F32)b.y, t)}; return c;}\r\n\r\ninternal Vec3F32 vec_3f32(F32 x, F32 y, F32 z)                  {Vec3F32 v = {x, y, z}; return v;}\r\ninternal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;}\r\ninternal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;}\r\ninternal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;}\r\ninternal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b)                 {Vec3F32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;}\r\ninternal Vec3F32 scale_3f32(Vec3F32 v, F32 s)                   {Vec3F32 c = {v.x*s, v.y*s, v.z*s}; return c;}\r\ninternal F32 dot_3f32(Vec3F32 a, Vec3F32 b)                     {F32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;}\r\ninternal F32 length_squared_3f32(Vec3F32 v)                     {F32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;}\r\ninternal F32 length_3f32(Vec3F32 v)                             {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z); return c;}\r\ninternal Vec3F32 normalize_3f32(Vec3F32 v)                      {v = scale_3f32(v, 1.f/length_3f32(v)); return v;}\r\ninternal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t)          {Vec3F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t)}; return c;}\r\ninternal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b)               {Vec3F32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;}\r\n\r\ninternal Vec3S32 vec_3s32(S32 x, S32 y, S32 z)                  {Vec3S32 v = {x, y, z}; return v;}\r\ninternal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x+b.x, a.y+b.y, a.z+b.z}; return c;}\r\ninternal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x-b.x, a.y-b.y, a.z-b.z}; return c;}\r\ninternal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x*b.x, a.y*b.y, a.z*b.z}; return c;}\r\ninternal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b)                 {Vec3S32 c = {a.x/b.x, a.y/b.y, a.z/b.z}; return c;}\r\ninternal Vec3S32 scale_3s32(Vec3S32 v, S32 s)                   {Vec3S32 c = {v.x*s, v.y*s, v.z*s}; return c;}\r\ninternal S32 dot_3s32(Vec3S32 a, Vec3S32 b)                     {S32 c = a.x*b.x + a.y*b.y + a.z*b.z; return c;}\r\ninternal S32 length_squared_3s32(Vec3S32 v)                     {S32 c = v.x*v.x + v.y*v.y + v.z*v.z; return c;}\r\ninternal S32 length_3s32(Vec3S32 v)                             {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z)); return c;}\r\ninternal Vec3S32 normalize_3s32(Vec3S32 v)                      {v = scale_3s32(v, (S32)(1.f/length_3s32(v))); return v;}\r\ninternal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t)          {Vec3S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t)}; return c;}\r\ninternal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b)               {Vec3S32 c = {a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x}; return c;}\r\n\r\ninternal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w)           {Vec4F32 v = {x, y, z, w}; return v;}\r\ninternal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;}\r\ninternal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;}\r\ninternal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;}\r\ninternal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b)                 {Vec4F32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;}\r\ninternal Vec4F32 scale_4f32(Vec4F32 v, F32 s)                   {Vec4F32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;}\r\ninternal F32 dot_4f32(Vec4F32 a, Vec4F32 b)                     {F32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;}\r\ninternal F32 length_squared_4f32(Vec4F32 v)                     {F32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;}\r\ninternal F32 length_4f32(Vec4F32 v)                             {F32 c = sqrt_f32(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w); return c;}\r\ninternal Vec4F32 normalize_4f32(Vec4F32 v)                      {v = scale_4f32(v, 1.f/length_4f32(v)); return v;}\r\ninternal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t)          {Vec4F32 c = {mix_1f32(a.x, b.x, t), mix_1f32(a.y, b.y, t), mix_1f32(a.z, b.z, t), mix_1f32(a.w, b.w, t)}; return c;}\r\n\r\ninternal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w)           {Vec4S32 v = {x, y, z, w}; return v;}\r\ninternal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x+b.x, a.y+b.y, a.z+b.z, a.w+b.w}; return c;}\r\ninternal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x-b.x, a.y-b.y, a.z-b.z, a.w-b.w}; return c;}\r\ninternal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x*b.x, a.y*b.y, a.z*b.z, a.w*b.w}; return c;}\r\ninternal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b)                 {Vec4S32 c = {a.x/b.x, a.y/b.y, a.z/b.z, a.w/b.w}; return c;}\r\ninternal Vec4S32 scale_4s32(Vec4S32 v, S32 s)                   {Vec4S32 c = {v.x*s, v.y*s, v.z*s, v.w*s}; return c;}\r\ninternal S32 dot_4s32(Vec4S32 a, Vec4S32 b)                     {S32 c = a.x*b.x + a.y*b.y + a.z*b.z + a.w*b.w; return c;}\r\ninternal S32 length_squared_4s32(Vec4S32 v)                     {S32 c = v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w; return c;}\r\ninternal S32 length_4s32(Vec4S32 v)                             {S32 c = (S32)sqrt_f32((F32)(v.x*v.x + v.y*v.y + v.z*v.z + v.w*v.w)); return c;}\r\ninternal Vec4S32 normalize_4s32(Vec4S32 v)                      {v = scale_4s32(v, (S32)(1.f/length_4s32(v))); return v;}\r\ninternal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t)          {Vec4S32 c = {(S32)mix_1f32((F32)a.x, (F32)b.x, t), (S32)mix_1f32((F32)a.y, (F32)b.y, t), (S32)mix_1f32((F32)a.z, (F32)b.z, t), (S32)mix_1f32((F32)a.w, (F32)b.w, t)}; return c;}\r\n\r\n////////////////////////////////\r\n//~ rjf: Matrix Ops\r\n\r\ninternal Mat3x3F32\r\nmat_3x3f32(F32 diagonal)\r\n{\r\n  Mat3x3F32 result = {0};\r\n  result.v[0][0] = diagonal;\r\n  result.v[1][1] = diagonal;\r\n  result.v[2][2] = diagonal;\r\n  return result;\r\n}\r\n\r\ninternal Mat3x3F32\r\nmake_translate_3x3f32(Vec2F32 delta)\r\n{\r\n  Mat3x3F32 mat = mat_3x3f32(1.f);\r\n  mat.v[2][0] = delta.x;\r\n  mat.v[2][1] = delta.y;\r\n  return mat;\r\n}\r\n\r\ninternal Mat3x3F32\r\nmake_scale_3x3f32(Vec2F32 scale)\r\n{\r\n  Mat3x3F32 mat = mat_3x3f32(1.f);\r\n  mat.v[0][0] = scale.x;\r\n  mat.v[1][1] = scale.y;\r\n  return mat;\r\n}\r\n\r\ninternal Mat3x3F32\r\nmul_3x3f32(Mat3x3F32 a, Mat3x3F32 b)\r\n{\r\n  Mat3x3F32 c = {0};\r\n  for(int j = 0; j < 3; j += 1)\r\n  {\r\n    for(int i = 0; i < 3; i += 1)\r\n    {\r\n      c.v[i][j] = (a.v[0][j]*b.v[i][0] +\r\n                   a.v[1][j]*b.v[i][1] +\r\n                   a.v[2][j]*b.v[i][2]);\r\n    }\r\n  }\r\n  return c;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmat_4x4f32(F32 diagonal)\r\n{\r\n  Mat4x4F32 result = {0};\r\n  result.v[0][0] = diagonal;\r\n  result.v[1][1] = diagonal;\r\n  result.v[2][2] = diagonal;\r\n  result.v[3][3] = diagonal;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_translate_4x4f32(Vec3F32 delta)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  result.v[3][0] = delta.x;\r\n  result.v[3][1] = delta.y;\r\n  result.v[3][2] = delta.z;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_scale_4x4f32(Vec3F32 scale)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  result.v[0][0] = scale.x;\r\n  result.v[1][1] = scale.y;\r\n  result.v[2][2] = scale.z;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  F32 tan_theta_over_2 = tan_f32(fov / 2);\r\n  result.v[0][0] = 1.f / tan_theta_over_2;\r\n  result.v[1][1] = aspect_ratio / tan_theta_over_2;\r\n  result.v[2][3] = 1.f;\r\n  result.v[2][2] = -(near_z + far_z) / (near_z - far_z);\r\n  result.v[3][2] = (2.f * near_z * far_z) / (near_z - far_z);\r\n  result.v[3][3] = 0.f;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  \r\n  result.v[0][0] = 2.f / (right - left);\r\n  result.v[1][1] = 2.f / (top - bottom);\r\n  result.v[2][2] = 2.f / (far_z - near_z);\r\n  result.v[3][3] = 1.f;\r\n  \r\n  result.v[3][0] = (left + right) / (left - right);\r\n  result.v[3][1] = (bottom + top) / (bottom - top);\r\n  result.v[3][2] = (near_z + far_z) / (near_z - far_z);\r\n  \r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up)\r\n{\r\n  Mat4x4F32 result;\r\n  Vec3F32 f = normalize_3f32(sub_3f32(eye, center));\r\n  Vec3F32 s = normalize_3f32(cross_3f32(f, up));\r\n  Vec3F32 u = cross_3f32(s, f);\r\n  result.v[0][0] = s.x;\r\n  result.v[0][1] = u.x;\r\n  result.v[0][2] = -f.x;\r\n  result.v[0][3] = 0.0f;\r\n  result.v[1][0] = s.y;\r\n  result.v[1][1] = u.y;\r\n  result.v[1][2] = -f.y;\r\n  result.v[1][3] = 0.0f;\r\n  result.v[2][0] = s.z;\r\n  result.v[2][1] = u.z;\r\n  result.v[2][2] = -f.z;\r\n  result.v[2][3] = 0.0f;\r\n  result.v[3][0] = -dot_3f32(s, eye);\r\n  result.v[3][1] = -dot_3f32(u, eye);\r\n  result.v[3][2] = dot_3f32(f, eye);\r\n  result.v[3][3] = 1.0f;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmake_rotate_4x4f32(Vec3F32 axis, F32 turns)\r\n{\r\n  Mat4x4F32 result = mat_4x4f32(1.f);\r\n  axis = normalize_3f32(axis);\r\n  F32 sin_theta = sin_f32(turns);\r\n  F32 cos_theta = cos_f32(turns);\r\n  F32 cos_value = 1.f - cos_theta;\r\n  result.v[0][0] = (axis.x * axis.x * cos_value) + cos_theta;\r\n  result.v[0][1] = (axis.x * axis.y * cos_value) + (axis.z * sin_theta);\r\n  result.v[0][2] = (axis.x * axis.z * cos_value) - (axis.y * sin_theta);\r\n  result.v[1][0] = (axis.y * axis.x * cos_value) - (axis.z * sin_theta);\r\n  result.v[1][1] = (axis.y * axis.y * cos_value) + cos_theta;\r\n  result.v[1][2] = (axis.y * axis.z * cos_value) + (axis.x * sin_theta);\r\n  result.v[2][0] = (axis.z * axis.x * cos_value) + (axis.y * sin_theta);\r\n  result.v[2][1] = (axis.z * axis.y * cos_value) - (axis.x * sin_theta);\r\n  result.v[2][2] = (axis.z * axis.z * cos_value) + cos_theta;\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nmul_4x4f32(Mat4x4F32 a, Mat4x4F32 b)\r\n{\r\n  Mat4x4F32 c = {0};\r\n  for(int j = 0; j < 4; j += 1)\r\n  {\r\n    for(int i = 0; i < 4; i += 1)\r\n    {\r\n      c.v[i][j] = (a.v[0][j]*b.v[i][0] +\r\n                   a.v[1][j]*b.v[i][1] +\r\n                   a.v[2][j]*b.v[i][2] +\r\n                   a.v[3][j]*b.v[i][3]);\r\n    }\r\n  }\r\n  return c;\r\n}\r\n\r\ninternal Mat4x4F32\r\nscale_4x4f32(Mat4x4F32 m, F32 scale)\r\n{\r\n  for(int j = 0; j < 4; j += 1)\r\n  {\r\n    for(int i = 0; i < 4; i += 1)\r\n    {\r\n      m.v[i][j] *= scale;\r\n    }\r\n  }\r\n  return m;\r\n}\r\n\r\ninternal Mat4x4F32\r\ninverse_4x4f32(Mat4x4F32 m)\r\n{\r\n  F32 coef00 = m.v[2][2] * m.v[3][3] - m.v[3][2] * m.v[2][3];\r\n  F32 coef02 = m.v[1][2] * m.v[3][3] - m.v[3][2] * m.v[1][3];\r\n  F32 coef03 = m.v[1][2] * m.v[2][3] - m.v[2][2] * m.v[1][3];\r\n  F32 coef04 = m.v[2][1] * m.v[3][3] - m.v[3][1] * m.v[2][3];\r\n  F32 coef06 = m.v[1][1] * m.v[3][3] - m.v[3][1] * m.v[1][3];\r\n  F32 coef07 = m.v[1][1] * m.v[2][3] - m.v[2][1] * m.v[1][3];\r\n  F32 coef08 = m.v[2][1] * m.v[3][2] - m.v[3][1] * m.v[2][2];\r\n  F32 coef10 = m.v[1][1] * m.v[3][2] - m.v[3][1] * m.v[1][2];\r\n  F32 coef11 = m.v[1][1] * m.v[2][2] - m.v[2][1] * m.v[1][2];\r\n  F32 coef12 = m.v[2][0] * m.v[3][3] - m.v[3][0] * m.v[2][3];\r\n  F32 coef14 = m.v[1][0] * m.v[3][3] - m.v[3][0] * m.v[1][3];\r\n  F32 coef15 = m.v[1][0] * m.v[2][3] - m.v[2][0] * m.v[1][3];\r\n  F32 coef16 = m.v[2][0] * m.v[3][2] - m.v[3][0] * m.v[2][2];\r\n  F32 coef18 = m.v[1][0] * m.v[3][2] - m.v[3][0] * m.v[1][2];\r\n  F32 coef19 = m.v[1][0] * m.v[2][2] - m.v[2][0] * m.v[1][2];\r\n  F32 coef20 = m.v[2][0] * m.v[3][1] - m.v[3][0] * m.v[2][1];\r\n  F32 coef22 = m.v[1][0] * m.v[3][1] - m.v[3][0] * m.v[1][1];\r\n  F32 coef23 = m.v[1][0] * m.v[2][1] - m.v[2][0] * m.v[1][1];\r\n  \r\n  Vec4F32 fac0 = { coef00, coef00, coef02, coef03 };\r\n  Vec4F32 fac1 = { coef04, coef04, coef06, coef07 };\r\n  Vec4F32 fac2 = { coef08, coef08, coef10, coef11 };\r\n  Vec4F32 fac3 = { coef12, coef12, coef14, coef15 };\r\n  Vec4F32 fac4 = { coef16, coef16, coef18, coef19 };\r\n  Vec4F32 fac5 = { coef20, coef20, coef22, coef23 };\r\n  \r\n  Vec4F32 vec0 = { m.v[1][0], m.v[0][0], m.v[0][0], m.v[0][0] };\r\n  Vec4F32 vec1 = { m.v[1][1], m.v[0][1], m.v[0][1], m.v[0][1] };\r\n  Vec4F32 vec2 = { m.v[1][2], m.v[0][2], m.v[0][2], m.v[0][2] };\r\n  Vec4F32 vec3 = { m.v[1][3], m.v[0][3], m.v[0][3], m.v[0][3] };\r\n  \r\n  Vec4F32 inv0 = add_4f32(sub_4f32(mul_4f32(vec1, fac0), mul_4f32(vec2, fac1)), mul_4f32(vec3, fac2));\r\n  Vec4F32 inv1 = add_4f32(sub_4f32(mul_4f32(vec0, fac0), mul_4f32(vec2, fac3)), mul_4f32(vec3, fac4));\r\n  Vec4F32 inv2 = add_4f32(sub_4f32(mul_4f32(vec0, fac1), mul_4f32(vec1, fac3)), mul_4f32(vec3, fac5));\r\n  Vec4F32 inv3 = add_4f32(sub_4f32(mul_4f32(vec0, fac2), mul_4f32(vec1, fac4)), mul_4f32(vec2, fac5));\r\n  \r\n  Vec4F32 sign_a = { +1, -1, +1, -1 };\r\n  Vec4F32 sign_b = { -1, +1, -1, +1 };\r\n  \r\n  Mat4x4F32 inverse;\r\n  for(U32 i = 0; i < 4; i += 1)\r\n  {\r\n    inverse.v[0][i] = inv0.v[i] * sign_a.v[i];\r\n    inverse.v[1][i] = inv1.v[i] * sign_b.v[i];\r\n    inverse.v[2][i] = inv2.v[i] * sign_a.v[i];\r\n    inverse.v[3][i] = inv3.v[i] * sign_b.v[i];\r\n  }\r\n  \r\n  Vec4F32 row0 = { inverse.v[0][0], inverse.v[1][0], inverse.v[2][0], inverse.v[3][0] };\r\n  Vec4F32 m0 = { m.v[0][0], m.v[0][1], m.v[0][2], m.v[0][3] };\r\n  Vec4F32 dot0 = mul_4f32(m0, row0);\r\n  F32 dot1 = (dot0.x + dot0.y) + (dot0.z + dot0.w);\r\n  \r\n  F32 one_over_det = 1 / dot1;\r\n  \r\n  return scale_4x4f32(inverse, one_over_det);\r\n}\r\n\r\ninternal Mat4x4F32\r\nderotate_4x4f32(Mat4x4F32 mat)\r\n{\r\n  Vec3F32 scale =\r\n  {\r\n    length_3f32(v3f32(mat.v[0][0], mat.v[0][1], mat.v[0][2])),\r\n    length_3f32(v3f32(mat.v[1][0], mat.v[1][1], mat.v[1][2])),\r\n    length_3f32(v3f32(mat.v[2][0], mat.v[2][1], mat.v[2][2])),\r\n  };\r\n  mat.v[0][0] = scale.x;\r\n  mat.v[1][0] = 0.f;\r\n  mat.v[2][0] = 0.f;\r\n  mat.v[0][1] = 0.f;\r\n  mat.v[1][1] = scale.y;\r\n  mat.v[2][1] = 0.f;\r\n  mat.v[0][2] = 0.f;\r\n  mat.v[1][2] = 0.f;\r\n  mat.v[2][2] = scale.z;\r\n  return mat;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Range Ops\r\n\r\ninternal Rng1U32 rng_1u32(U32 min, U32 max)                     {Rng1U32 r = {min, max}; if(r.min > r.max) { Swap(U32, r.min, r.max); } return r;}\r\ninternal Rng1U32 shift_1u32(Rng1U32 r, U32 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1U32 pad_1u32(Rng1U32 r, U32 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal U32 center_1u32(Rng1U32 r)                             {U32 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1u32(Rng1U32 r, U32 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal U32 dim_1u32(Rng1U32 r)                                {U32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b)               {Rng1U32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b)           {Rng1U32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal U32 clamp_1u32(Rng1U32 r, U32 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1S32 rng_1s32(S32 min, S32 max)                     {Rng1S32 r = {min, max}; if(r.min > r.max) { Swap(S32, r.min, r.max); } return r;}\r\ninternal Rng1S32 shift_1s32(Rng1S32 r, S32 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1S32 pad_1s32(Rng1S32 r, S32 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal S32 center_1s32(Rng1S32 r)                             {S32 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1s32(Rng1S32 r, S32 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal S32 dim_1s32(Rng1S32 r)                                {S32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b)               {Rng1S32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b)           {Rng1S32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal S32 clamp_1s32(Rng1S32 r, S32 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1U64 rng_1u64(U64 min, U64 max)                     {Rng1U64 r = {min, max}; if(r.min > r.max) { Swap(U64, r.min, r.max); } return r;}\r\ninternal Rng1U64 shift_1u64(Rng1U64 r, U64 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1U64 pad_1u64(Rng1U64 r, U64 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal U64 center_1u64(Rng1U64 r)                             {U64 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1u64(Rng1U64 r, U64 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal U64 dim_1u64(Rng1U64 r)                                {U64 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b)               {Rng1U64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b)           {Rng1U64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal U64 clamp_1u64(Rng1U64 r, U64 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1S64 rng_1s64(S64 min, S64 max)                     {Rng1S64 r = {min, max}; if(r.min > r.max) { Swap(S64, r.min, r.max); } return r;}\r\ninternal Rng1S64 shift_1s64(Rng1S64 r, S64 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1S64 pad_1s64(Rng1S64 r, S64 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal S64 center_1s64(Rng1S64 r)                             {S64 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1s64(Rng1S64 r, S64 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal S64 dim_1s64(Rng1S64 r)                                {S64 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b)               {Rng1S64 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b)           {Rng1S64 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal S64 clamp_1s64(Rng1S64 r, S64 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng1F32 rng_1f32(F32 min, F32 max)                     {Rng1F32 r = {min, max}; if(r.min > r.max) { Swap(F32, r.min, r.max); } return r;}\r\ninternal Rng1F32 shift_1f32(Rng1F32 r, F32 x)                   {r.min += x; r.max += x; return r;}\r\ninternal Rng1F32 pad_1f32(Rng1F32 r, F32 x)                     {r.min -= x; r.max += x; return r;}\r\ninternal F32 center_1f32(Rng1F32 r)                             {F32 c = (r.min+r.max)/2; return c;}\r\ninternal B32 contains_1f32(Rng1F32 r, F32 x)                    {B32 c = (r.min <= x && x < r.max); return c;}\r\ninternal F32 dim_1f32(Rng1F32 r)                                {F32 c = ((r.max > r.min) ? (r.max - r.min) : 0); return c;}\r\ninternal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b)               {Rng1F32 c = {Min(a.min, b.min), Max(a.max, b.max)}; return c;}\r\ninternal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b)           {Rng1F32 c = {Max(a.min, b.min), Min(a.max, b.max)}; return c;}\r\ninternal F32 clamp_1f32(Rng1F32 r, F32 v)                       {v = Clamp(r.min, v, r.max); return v;}\r\n\r\ninternal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max)             {Rng2S16 r = {min, max}; return r;}\r\ninternal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x)               {r.min = add_2s16(r.min, x); r.max = add_2s16(r.max, x); return r;}\r\ninternal Rng2S16 pad_2s16(Rng2S16 r, S16 x)                     {Vec2S16 xv = {x, x}; r.min = sub_2s16(r.min, xv); r.max = add_2s16(r.max, xv); return r;}\r\ninternal Vec2S16 center_2s16(Rng2S16 r)                         {Vec2S16 c = {(S16)((r.min.x+r.max.x)/2), (S16)((r.min.y+r.max.y)/2)}; return c;}\r\ninternal B32 contains_2s16(Rng2S16 r, Vec2S16 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2S16 dim_2s16(Rng2S16 r)                            {Vec2S16 dim = {(S16)(((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0)), (S16)(((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0))}; return dim;}\r\ninternal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b)               {Rng2S16 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b)           {Rng2S16 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\ninternal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max)             {Rng2S32 r = {min, max}; return r;}\r\ninternal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x)               {r.min = add_2s32(r.min, x); r.max = add_2s32(r.max, x); return r;}\r\ninternal Rng2S32 pad_2s32(Rng2S32 r, S32 x)                     {Vec2S32 xv = {x, x}; r.min = sub_2s32(r.min, xv); r.max = add_2s32(r.max, xv); return r;}\r\ninternal Vec2S32 center_2s32(Rng2S32 r)                         {Vec2S32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;}\r\ninternal B32 contains_2s32(Rng2S32 r, Vec2S32 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2S32 dim_2s32(Rng2S32 r)                            {Vec2S32 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;}\r\ninternal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b)               {Rng2S32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b)           {Rng2S32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\ninternal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max)             {Rng2S64 r = {min, max}; return r;}\r\ninternal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x)               {r.min = add_2s64(r.min, x); r.max = add_2s64(r.max, x); return r;}\r\ninternal Rng2S64 pad_2s64(Rng2S64 r, S64 x)                     {Vec2S64 xv = {x, x}; r.min = sub_2s64(r.min, xv); r.max = add_2s64(r.max, xv); return r;}\r\ninternal Vec2S64 center_2s64(Rng2S64 r)                         {Vec2S64 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;}\r\ninternal B32 contains_2s64(Rng2S64 r, Vec2S64 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2S64 dim_2s64(Rng2S64 r)                            {Vec2S64 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;}\r\ninternal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b)               {Rng2S64 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b)           {Rng2S64 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\ninternal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max)             {Rng2F32 r = {min, max}; return r;}\r\ninternal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x)               {r.min = add_2f32(r.min, x); r.max = add_2f32(r.max, x); return r;}\r\ninternal Rng2F32 pad_2f32(Rng2F32 r, F32 x)                     {Vec2F32 xv = {x, x}; r.min = sub_2f32(r.min, xv); r.max = add_2f32(r.max, xv); return r;}\r\ninternal Vec2F32 center_2f32(Rng2F32 r)                         {Vec2F32 c = {(r.min.x+r.max.x)/2, (r.min.y+r.max.y)/2}; return c;}\r\ninternal B32 contains_2f32(Rng2F32 r, Vec2F32 x)                {B32 c = (r.min.x <= x.x && x.x < r.max.x && r.min.y <= x.y && x.y < r.max.y); return c;}\r\ninternal Vec2F32 dim_2f32(Rng2F32 r)                            {Vec2F32 dim = {((r.max.x > r.min.x) ? (r.max.x - r.min.x) : 0), ((r.max.y > r.min.y) ? (r.max.y - r.min.y) : 0)}; return dim;}\r\ninternal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b)               {Rng2F32 c; c.p0.x = Min(a.min.x, b.min.x); c.p0.y = Min(a.min.y, b.min.y); c.p1.x = Max(a.max.x, b.max.x); c.p1.y = Max(a.max.y, b.max.y); return c;}\r\ninternal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b)           {Rng2F32 c; c.p0.x = Max(a.min.x, b.min.x); c.p0.y = Max(a.min.y, b.min.y); c.p1.x = Min(a.max.x, b.max.x); c.p1.y = Min(a.max.y, b.max.y); return c;}\r\ninternal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v)               {v.x = Clamp(r.min.x, v.x, r.max.x); v.y = Clamp(r.min.y, v.y, r.max.y); return v;}\r\n\r\n////////////////////////////////\r\n//~ rjf: Miscellaneous Ops\r\n\r\ninternal Vec3F32\r\nhsv_from_rgb(Vec3F32 rgb)\r\n{\r\n  F32 c_max = Max(rgb.x, Max(rgb.y, rgb.z));\r\n  F32 c_min = Min(rgb.x, Min(rgb.y, rgb.z));\r\n  F32 delta = c_max - c_min;\r\n  F32 h = ((delta == 0.f) ? 0.f :\r\n           (c_max == rgb.x) ? mod_f32((rgb.y - rgb.z)/delta + 6.f, 6.f) :\r\n           (c_max == rgb.y) ? (rgb.z - rgb.x)/delta + 2.f :\r\n           (c_max == rgb.z) ? (rgb.x - rgb.y)/delta + 4.f :\r\n           0.f);\r\n  F32 s = (c_max == 0.f) ? 0.f : (delta/c_max);\r\n  F32 v = c_max;\r\n  Vec3F32 hsv = {h/6.f, s, v};\r\n  return hsv;\r\n}\r\n\r\ninternal Vec3F32\r\nrgb_from_hsv(Vec3F32 hsv)\r\n{\r\n  F32 h = mod_f32(hsv.x * 360.f, 360.f);\r\n  F32 s = hsv.y;\r\n  F32 v = hsv.z;\r\n  \r\n  F32 c = v*s;\r\n  F32 x = c*(1.f - abs_f32(mod_f32(h/60.f, 2.f) - 1.f));\r\n  F32 m = v - c;\r\n  \r\n  F32 r = 0;\r\n  F32 g = 0;\r\n  F32 b = 0;\r\n  \r\n  if ((h >= 0.f && h < 60.f) || (h >= 360.f && h < 420.f)){\r\n    r = c;\r\n    g = x;\r\n    b = 0;\r\n  }\r\n  else if (h >= 60.f && h < 120.f){\r\n    r = x;\r\n    g = c;\r\n    b = 0;\r\n  }\r\n  else if (h >= 120.f && h < 180.f){\r\n    r = 0;\r\n    g = c;\r\n    b = x;\r\n  }\r\n  else if (h >= 180.f && h < 240.f){\r\n    r = 0;\r\n    g = x;\r\n    b = c;\r\n  }\r\n  else if (h >= 240.f && h < 300.f){\r\n    r = x;\r\n    g = 0;\r\n    b = c;\r\n  }\r\n  else if ((h >= 300.f && h <= 360.f) || (h >= -60.f && h <= 0.f)){\r\n    r = c;\r\n    g = 0;\r\n    b = x;\r\n  }\r\n  \r\n  Vec3F32 rgb = {r + m, g + m, b + m};\r\n  return(rgb);\r\n}\r\n\r\ninternal Vec4F32\r\nhsva_from_rgba(Vec4F32 rgba)\r\n{\r\n  Vec3F32 rgb = v3f32(rgba.x, rgba.y, rgba.z);\r\n  Vec3F32 hsv = hsv_from_rgb(rgb);\r\n  Vec4F32 hsva = v4f32(hsv.x, hsv.y, hsv.z, rgba.w);\r\n  return hsva;\r\n}\r\n\r\ninternal Vec4F32\r\nrgba_from_hsva(Vec4F32 hsva)\r\n{\r\n  Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z);\r\n  Vec3F32 rgb = rgb_from_hsv(hsv);\r\n  Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w);\r\n  return rgba;\r\n}\r\n\r\ninternal Vec4F32\r\nrgba_from_u32(U32 hex)\r\n{\r\n  Vec4F32 result = v4f32(((hex&0xff000000)>>24)/255.f,\r\n                         ((hex&0x00ff0000)>>16)/255.f,\r\n                         ((hex&0x0000ff00)>> 8)/255.f,\r\n                         ((hex&0x000000ff)>> 0)/255.f);\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nu32_from_rgba(Vec4F32 rgba)\r\n{\r\n  U32 result = 0;\r\n  result |= ((U32)((U8)(rgba.x*255.f))) << 24;\r\n  result |= ((U32)((U8)(rgba.y*255.f))) << 16;\r\n  result |= ((U32)((U8)(rgba.z*255.f))) <<  8;\r\n  result |= ((U32)((U8)(rgba.w*255.f))) <<  0;\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: List Type Functions\r\n\r\ninternal void\r\nrng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng)\r\n{\r\n  Rng1U64Node *n = push_array(arena, Rng1U64Node, 1);\r\n  MemoryCopyStruct(&n->v, &rng);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal void\r\nrng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat)\r\n{\r\n  if(to_concat->first)\r\n  {\r\n    if(list->first)\r\n    {\r\n      list->last->next = to_concat->first;\r\n      list->last       = to_concat->last;\r\n    }\r\n    else\r\n    {\r\n      list->first = to_concat->first;\r\n      list->last  = to_concat->last;\r\n    }\r\n    MemoryZeroStruct(to_concat);\r\n  }\r\n}\r\n\r\ninternal Rng1U64Array\r\nrng1u64_array_from_list(Arena *arena, Rng1U64List *list)\r\n{\r\n  Rng1U64Array arr = {0};\r\n  arr.count        = list->count;\r\n  arr.v            = push_array_no_zero(arena, Rng1U64, arr.count);\r\n  U64 idx = 0;\r\n  for(Rng1U64Node *n = list->first; n != 0; n = n->next)\r\n  {\r\n    arr.v[idx] = n->v;\r\n    idx += 1;\r\n  }\r\n  return arr;\r\n}\r\n\r\ninternal void\r\nrng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng)\r\n{\r\n  Rng1S64Node *n = push_array(arena, Rng1S64Node, 1);\r\n  MemoryCopyStruct(&n->v, &rng);\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\ninternal Rng1S64Array\r\nrng1s64_array_from_list(Arena *arena, Rng1S64List *list)\r\n{\r\n  Rng1S64Array arr = {0};\r\n  arr.count = list->count;\r\n  arr.v = push_array_no_zero(arena, Rng1S64, arr.count);\r\n  U64 idx = 0;\r\n  for(Rng1S64Node *n = list->first; n != 0; n = n->next)\r\n  {\r\n    arr.v[idx] = n->v;\r\n    idx += 1;\r\n  }\r\n  return arr;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_math.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_MATH_H\r\n#define BASE_MATH_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Vector Types\r\n\r\n//- rjf: 2-vectors\r\n\r\ntypedef union Vec2F32 Vec2F32;\r\nunion Vec2F32\r\n{\r\n  struct\r\n  {\r\n    F32 x;\r\n    F32 y;\r\n  };\r\n  F32 v[2];\r\n};\r\n\r\ntypedef union Vec2S64 Vec2S64;\r\nunion Vec2S64\r\n{\r\n  struct\r\n  {\r\n    S64 x;\r\n    S64 y;\r\n  };\r\n  S64 v[2];\r\n};\r\n\r\ntypedef union Vec2S32 Vec2S32;\r\nunion Vec2S32\r\n{\r\n  struct\r\n  {\r\n    S32 x;\r\n    S32 y;\r\n  };\r\n  S32 v[2];\r\n};\r\n\r\ntypedef union Vec2S16 Vec2S16;\r\nunion Vec2S16\r\n{\r\n  struct\r\n  {\r\n    S16 x;\r\n    S16 y;\r\n  };\r\n  S16 v[2];\r\n};\r\n\r\n//- rjf: 3-vectors\r\n\r\ntypedef union Vec3F32 Vec3F32;\r\nunion Vec3F32\r\n{\r\n  struct\r\n  {\r\n    F32 x;\r\n    F32 y;\r\n    F32 z;\r\n  };\r\n  struct\r\n  {\r\n    Vec2F32 xy;\r\n    F32 _z0;\r\n  };\r\n  struct\r\n  {\r\n    F32 _x0;\r\n    Vec2F32 yz;\r\n  };\r\n  F32 v[3];\r\n};\r\n\r\ntypedef union Vec3S32 Vec3S32;\r\nunion Vec3S32\r\n{\r\n  struct\r\n  {\r\n    S32 x;\r\n    S32 y;\r\n    S32 z;\r\n  };\r\n  struct\r\n  {\r\n    Vec2S32 xy;\r\n    S32 _z0;\r\n  };\r\n  struct\r\n  {\r\n    S32 _x0;\r\n    Vec2S32 yz;\r\n  };\r\n  S32 v[3];\r\n};\r\n\r\n//- rjf: 4-vectors\r\n\r\ntypedef union Vec4F32 Vec4F32;\r\nunion Vec4F32\r\n{\r\n  struct\r\n  {\r\n    F32 x;\r\n    F32 y;\r\n    F32 z;\r\n    F32 w;\r\n  };\r\n  struct\r\n  {\r\n    Vec2F32 xy;\r\n    Vec2F32 zw;\r\n  };\r\n  struct\r\n  {\r\n    Vec3F32 xyz;\r\n    F32 _z0;\r\n  };\r\n  struct\r\n  {\r\n    F32 _x0;\r\n    Vec3F32 yzw;\r\n  };\r\n  F32 v[4];\r\n};\r\n\r\ntypedef union Vec4S32 Vec4S32;\r\nunion Vec4S32\r\n{\r\n  struct\r\n  {\r\n    S32 x;\r\n    S32 y;\r\n    S32 z;\r\n    S32 w;\r\n  };\r\n  struct\r\n  {\r\n    Vec2S32 xy;\r\n    Vec2S32 zw;\r\n  };\r\n  struct\r\n  {\r\n    Vec3S32 xyz;\r\n    S32 _z0;\r\n  };\r\n  struct\r\n  {\r\n    S32 _x0;\r\n    Vec3S32 yzw;\r\n  };\r\n  S32 v[4];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Matrix Types\r\n\r\ntypedef struct Mat3x3F32 Mat3x3F32;\r\nstruct Mat3x3F32\r\n{\r\n  F32 v[3][3];\r\n};\r\n\r\ntypedef struct Mat4x4F32 Mat4x4F32;\r\nstruct Mat4x4F32\r\n{\r\n  F32 v[4][4];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Range Types\r\n\r\n//- rjf: 1-range\r\n\r\ntypedef union Rng1U32 Rng1U32;\r\nunion Rng1U32\r\n{\r\n  struct\r\n  {\r\n    U32 min;\r\n    U32 max;\r\n  };\r\n  U32 v[2];\r\n};\r\n\r\ntypedef union Rng1S32 Rng1S32;\r\nunion Rng1S32\r\n{\r\n  struct\r\n  {\r\n    S32 min;\r\n    S32 max;\r\n  };\r\n  S32 v[2];\r\n};\r\n\r\ntypedef union Rng1U64 Rng1U64;\r\nunion Rng1U64\r\n{\r\n  struct\r\n  {\r\n    U64 min;\r\n    U64 max;\r\n  };\r\n  U64 v[2];\r\n};\r\n\r\ntypedef union Rng1S64 Rng1S64;\r\nunion Rng1S64\r\n{\r\n  struct\r\n  {\r\n    S64 min;\r\n    S64 max;\r\n  };\r\n  S64 v[2];\r\n};\r\n\r\ntypedef union Rng1F32 Rng1F32;\r\nunion Rng1F32\r\n{\r\n  struct\r\n  {\r\n    F32 min;\r\n    F32 max;\r\n  };\r\n  F32 v[2];\r\n};\r\n\r\n//- rjf: 2-range (rectangles)\r\n\r\ntypedef union Rng2S16 Rng2S16;\r\nunion Rng2S16\r\n{\r\n  struct\r\n  {\r\n    Vec2S16 min;\r\n    Vec2S16 max;\r\n  };\r\n  struct\r\n  {\r\n    Vec2S16 p0;\r\n    Vec2S16 p1;\r\n  };\r\n  struct\r\n  {\r\n    S16 x0;\r\n    S16 y0;\r\n    S16 x1;\r\n    S16 y1;\r\n  };\r\n  Vec2S16 v[2];\r\n};\r\n\r\ntypedef union Rng2S32 Rng2S32;\r\nunion Rng2S32\r\n{\r\n  struct\r\n  {\r\n    Vec2S32 min;\r\n    Vec2S32 max;\r\n  };\r\n  struct\r\n  {\r\n    Vec2S32 p0;\r\n    Vec2S32 p1;\r\n  };\r\n  struct\r\n  {\r\n    S32 x0;\r\n    S32 y0;\r\n    S32 x1;\r\n    S32 y1;\r\n  };\r\n  Vec2S32 v[2];\r\n};\r\n\r\ntypedef union Rng2F32 Rng2F32;\r\nunion Rng2F32\r\n{\r\n  struct\r\n  {\r\n    Vec2F32 min;\r\n    Vec2F32 max;\r\n  };\r\n  struct\r\n  {\r\n    Vec2F32 p0;\r\n    Vec2F32 p1;\r\n  };\r\n  struct\r\n  {\r\n    F32 x0;\r\n    F32 y0;\r\n    F32 x1;\r\n    F32 y1;\r\n  };\r\n  Vec2F32 v[2];\r\n};\r\n\r\ntypedef union Rng2S64 Rng2S64;\r\nunion Rng2S64\r\n{\r\n  struct\r\n  {\r\n    Vec2S64 min;\r\n    Vec2S64 max;\r\n  };\r\n  struct\r\n  {\r\n    Vec2S64 p0;\r\n    Vec2S64 p1;\r\n  };\r\n  struct\r\n  {\r\n    S64 x0;\r\n    S64 y0;\r\n    S64 x1;\r\n    S64 y1;\r\n  };\r\n  Vec2S64 v[2];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: List Types\r\n\r\ntypedef struct Rng1U64Node Rng1U64Node;\r\nstruct Rng1U64Node\r\n{\r\n  Rng1U64Node *next;\r\n  Rng1U64 v;\r\n};\r\n\r\ntypedef struct Rng1U64List Rng1U64List;\r\nstruct Rng1U64List\r\n{\r\n  U64 count;\r\n  Rng1U64Node *first;\r\n  Rng1U64Node *last;\r\n};\r\n\r\ntypedef struct Rng1U64Array Rng1U64Array;\r\nstruct Rng1U64Array\r\n{\r\n  Rng1U64 *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct Rng1S64Node Rng1S64Node;\r\nstruct Rng1S64Node\r\n{\r\n  Rng1S64Node *next;\r\n  Rng1S64 v;\r\n};\r\n\r\ntypedef struct Rng1S64List Rng1S64List;\r\nstruct Rng1S64List\r\n{\r\n  Rng1S64Node *first;\r\n  Rng1S64Node *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct Rng1S64Array Rng1S64Array;\r\nstruct Rng1S64Array\r\n{\r\n  Rng1S64 *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Scalar Ops\r\n\r\n#define abs_s64(v) (S64)llabs(v)\r\n\r\n#define sqrt_f32(v)   sqrtf(v)\r\n#define mod_f32(a, b) fmodf((a), (b))\r\n#define pow_f32(b, e) powf((b), (e))\r\n#define ceil_f32(v)   ceilf(v)\r\n#define floor_f32(v)  floorf(v)\r\n#define round_f32(v)  roundf(v)\r\n#define abs_f32(v)    fabsf(v)\r\n#define radians_from_turns_f32(v) ((v)*2*3.1415926535897f)\r\n#define turns_from_radians_f32(v) ((v)/2*3.1415926535897f)\r\n#define degrees_from_turns_f32(v) ((v)*360.f)\r\n#define turns_from_degrees_f32(v) ((v)/360.f)\r\n#define degrees_from_radians_f32(v) (degrees_from_turns_f32(turns_from_radians_f32(v)))\r\n#define radians_from_degrees_f32(v) (radians_from_turns_f32(turns_from_degrees_f32(v)))\r\n#define sin_f32(v)    sinf(radians_from_turns_f32(v))\r\n#define cos_f32(v)    cosf(radians_from_turns_f32(v))\r\n#define tan_f32(v)    tanf(radians_from_turns_f32(v))\r\n\r\n#define sqrt_f64(v)   sqrt(v)\r\n#define mod_f64(a, b) fmod((a), (b))\r\n#define pow_f64(b, e) pow((b), (e))\r\n#define ceil_f64(v)   ceil(v)\r\n#define floor_f64(v)  floor(v)\r\n#define round_f64(v)  round(v)\r\n#define abs_f64(v)    fabs(v)\r\n#define radians_from_turns_f64(v) ((v)*2*3.1415926535897)\r\n#define turns_from_radians_f64(v) ((v)/2*3.1415926535897)\r\n#define degrees_from_turns_f64(v) ((v)*360.0)\r\n#define turns_from_degrees_f64(v) ((v)/360.0)\r\n#define degrees_from_radians_f64(v) (degrees_from_turns_f64(turns_from_radians_f64(v)))\r\n#define radians_from_degrees_f64(v) (radians_from_turns_f64(turns_from_degrees_f64(v)))\r\n#define sin_f64(v)    sin(radians_from_turns_f64(v))\r\n#define cos_f64(v)    cos(radians_from_turns_f64(v))\r\n#define tan_f64(v)    tan(radians_from_turns_f64(v))\r\n\r\ninternal F32 mix_1f32(F32 a, F32 b, F32 t);\r\ninternal F64 mix_1f64(F64 a, F64 b, F64 t);\r\n\r\n////////////////////////////////\r\n//~ rjf: Vector Ops\r\n\r\n#define v2f32(x, y) vec_2f32((x), (y))\r\ninternal Vec2F32 vec_2f32(F32 x, F32 y);\r\ninternal Vec2F32 add_2f32(Vec2F32 a, Vec2F32 b);\r\ninternal Vec2F32 sub_2f32(Vec2F32 a, Vec2F32 b);\r\ninternal Vec2F32 mul_2f32(Vec2F32 a, Vec2F32 b);\r\ninternal Vec2F32 div_2f32(Vec2F32 a, Vec2F32 b);\r\ninternal Vec2F32 scale_2f32(Vec2F32 v, F32 s);\r\ninternal F32 dot_2f32(Vec2F32 a, Vec2F32 b);\r\ninternal F32 length_squared_2f32(Vec2F32 v);\r\ninternal F32 length_2f32(Vec2F32 v);\r\ninternal Vec2F32 normalize_2f32(Vec2F32 v);\r\ninternal Vec2F32 mix_2f32(Vec2F32 a, Vec2F32 b, F32 t);\r\n\r\n#define v2s64(x, y) vec_2s64((x), (y))\r\ninternal Vec2S64 vec_2s64(S64 x, S64 y);\r\ninternal Vec2S64 add_2s64(Vec2S64 a, Vec2S64 b);\r\ninternal Vec2S64 sub_2s64(Vec2S64 a, Vec2S64 b);\r\ninternal Vec2S64 mul_2s64(Vec2S64 a, Vec2S64 b);\r\ninternal Vec2S64 div_2s64(Vec2S64 a, Vec2S64 b);\r\ninternal Vec2S64 scale_2s64(Vec2S64 v, S64 s);\r\ninternal S64 dot_2s64(Vec2S64 a, Vec2S64 b);\r\ninternal S64 length_squared_2s64(Vec2S64 v);\r\ninternal S64 length_2s64(Vec2S64 v);\r\ninternal Vec2S64 normalize_2s64(Vec2S64 v);\r\ninternal Vec2S64 mix_2s64(Vec2S64 a, Vec2S64 b, F32 t);\r\n\r\n#define v2s32(x, y) vec_2s32((x), (y))\r\ninternal Vec2S32 vec_2s32(S32 x, S32 y);\r\ninternal Vec2S32 add_2s32(Vec2S32 a, Vec2S32 b);\r\ninternal Vec2S32 sub_2s32(Vec2S32 a, Vec2S32 b);\r\ninternal Vec2S32 mul_2s32(Vec2S32 a, Vec2S32 b);\r\ninternal Vec2S32 div_2s32(Vec2S32 a, Vec2S32 b);\r\ninternal Vec2S32 scale_2s32(Vec2S32 v, S32 s);\r\ninternal S32 dot_2s32(Vec2S32 a, Vec2S32 b);\r\ninternal S32 length_squared_2s32(Vec2S32 v);\r\ninternal S32 length_2s32(Vec2S32 v);\r\ninternal Vec2S32 normalize_2s32(Vec2S32 v);\r\ninternal Vec2S32 mix_2s32(Vec2S32 a, Vec2S32 b, F32 t);\r\n\r\n#define v2s16(x, y) vec_2s16((x), (y))\r\ninternal Vec2S16 vec_2s16(S16 x, S16 y);\r\ninternal Vec2S16 add_2s16(Vec2S16 a, Vec2S16 b);\r\ninternal Vec2S16 sub_2s16(Vec2S16 a, Vec2S16 b);\r\ninternal Vec2S16 mul_2s16(Vec2S16 a, Vec2S16 b);\r\ninternal Vec2S16 div_2s16(Vec2S16 a, Vec2S16 b);\r\ninternal Vec2S16 scale_2s16(Vec2S16 v, S16 s);\r\ninternal S16 dot_2s16(Vec2S16 a, Vec2S16 b);\r\ninternal S16 length_squared_2s16(Vec2S16 v);\r\ninternal S16 length_2s16(Vec2S16 v);\r\ninternal Vec2S16 normalize_2s16(Vec2S16 v);\r\ninternal Vec2S16 mix_2s16(Vec2S16 a, Vec2S16 b, F32 t);\r\n\r\n#define v3f32(x, y, z) vec_3f32((x), (y), (z))\r\ninternal Vec3F32 vec_3f32(F32 x, F32 y, F32 z);\r\ninternal Vec3F32 add_3f32(Vec3F32 a, Vec3F32 b);\r\ninternal Vec3F32 sub_3f32(Vec3F32 a, Vec3F32 b);\r\ninternal Vec3F32 mul_3f32(Vec3F32 a, Vec3F32 b);\r\ninternal Vec3F32 div_3f32(Vec3F32 a, Vec3F32 b);\r\ninternal Vec3F32 scale_3f32(Vec3F32 v, F32 s);\r\ninternal F32 dot_3f32(Vec3F32 a, Vec3F32 b);\r\ninternal F32 length_squared_3f32(Vec3F32 v);\r\ninternal F32 length_3f32(Vec3F32 v);\r\ninternal Vec3F32 normalize_3f32(Vec3F32 v);\r\ninternal Vec3F32 mix_3f32(Vec3F32 a, Vec3F32 b, F32 t);\r\ninternal Vec3F32 cross_3f32(Vec3F32 a, Vec3F32 b);\r\n\r\n#define v3s32(x, y, z) vec_3s32((x), (y), (z))\r\ninternal Vec3S32 vec_3s32(S32 x, S32 y, S32 z);\r\ninternal Vec3S32 add_3s32(Vec3S32 a, Vec3S32 b);\r\ninternal Vec3S32 sub_3s32(Vec3S32 a, Vec3S32 b);\r\ninternal Vec3S32 mul_3s32(Vec3S32 a, Vec3S32 b);\r\ninternal Vec3S32 div_3s32(Vec3S32 a, Vec3S32 b);\r\ninternal Vec3S32 scale_3s32(Vec3S32 v, S32 s);\r\ninternal S32 dot_3s32(Vec3S32 a, Vec3S32 b);\r\ninternal S32 length_squared_3s32(Vec3S32 v);\r\ninternal S32 length_3s32(Vec3S32 v);\r\ninternal Vec3S32 normalize_3s32(Vec3S32 v);\r\ninternal Vec3S32 mix_3s32(Vec3S32 a, Vec3S32 b, F32 t);\r\ninternal Vec3S32 cross_3s32(Vec3S32 a, Vec3S32 b);\r\n\r\n#define v4f32(x, y, z, w) vec_4f32((x), (y), (z), (w))\r\ninternal Vec4F32 vec_4f32(F32 x, F32 y, F32 z, F32 w);\r\ninternal Vec4F32 add_4f32(Vec4F32 a, Vec4F32 b);\r\ninternal Vec4F32 sub_4f32(Vec4F32 a, Vec4F32 b);\r\ninternal Vec4F32 mul_4f32(Vec4F32 a, Vec4F32 b);\r\ninternal Vec4F32 div_4f32(Vec4F32 a, Vec4F32 b);\r\ninternal Vec4F32 scale_4f32(Vec4F32 v, F32 s);\r\ninternal F32 dot_4f32(Vec4F32 a, Vec4F32 b);\r\ninternal F32 length_squared_4f32(Vec4F32 v);\r\ninternal F32 length_4f32(Vec4F32 v);\r\ninternal Vec4F32 normalize_4f32(Vec4F32 v);\r\ninternal Vec4F32 mix_4f32(Vec4F32 a, Vec4F32 b, F32 t);\r\n\r\n#define v4s32(x, y, z, w) vec_4s32((x), (y), (z), (w))\r\ninternal Vec4S32 vec_4s32(S32 x, S32 y, S32 z, S32 w);\r\ninternal Vec4S32 add_4s32(Vec4S32 a, Vec4S32 b);\r\ninternal Vec4S32 sub_4s32(Vec4S32 a, Vec4S32 b);\r\ninternal Vec4S32 mul_4s32(Vec4S32 a, Vec4S32 b);\r\ninternal Vec4S32 div_4s32(Vec4S32 a, Vec4S32 b);\r\ninternal Vec4S32 scale_4s32(Vec4S32 v, S32 s);\r\ninternal S32 dot_4s32(Vec4S32 a, Vec4S32 b);\r\ninternal S32 length_squared_4s32(Vec4S32 v);\r\ninternal S32 length_4s32(Vec4S32 v);\r\ninternal Vec4S32 normalize_4s32(Vec4S32 v);\r\ninternal Vec4S32 mix_4s32(Vec4S32 a, Vec4S32 b, F32 t);\r\n\r\n////////////////////////////////\r\n//~ rjf: Matrix Ops\r\n\r\ninternal Mat3x3F32 mat_3x3f32(F32 diagonal);\r\ninternal Mat3x3F32 make_translate_3x3f32(Vec2F32 delta);\r\ninternal Mat3x3F32 make_scale_3x3f32(Vec2F32 scale);\r\ninternal Mat3x3F32 mul_3x3f32(Mat3x3F32 a, Mat3x3F32 b);\r\n\r\ninternal Mat4x4F32 mat_4x4f32(F32 diagonal);\r\ninternal Mat4x4F32 make_translate_4x4f32(Vec3F32 delta);\r\ninternal Mat4x4F32 make_scale_4x4f32(Vec3F32 scale);\r\ninternal Mat4x4F32 make_perspective_4x4f32(F32 fov, F32 aspect_ratio, F32 near_z, F32 far_z);\r\ninternal Mat4x4F32 make_orthographic_4x4f32(F32 left, F32 right, F32 bottom, F32 top, F32 near_z, F32 far_z);\r\ninternal Mat4x4F32 make_look_at_4x4f32(Vec3F32 eye, Vec3F32 center, Vec3F32 up);\r\ninternal Mat4x4F32 make_rotate_4x4f32(Vec3F32 axis, F32 turns);\r\ninternal Mat4x4F32 mul_4x4f32(Mat4x4F32 a, Mat4x4F32 b);\r\ninternal Mat4x4F32 scale_4x4f32(Mat4x4F32 m, F32 scale);\r\ninternal Mat4x4F32 inverse_4x4f32(Mat4x4F32 m);\r\ninternal Mat4x4F32 derotate_4x4f32(Mat4x4F32 mat);\r\n\r\n////////////////////////////////\r\n//~ rjf: Range Ops\r\n\r\n#define r1u32(min, max) rng_1u32((min), (max))\r\ninternal Rng1U32 rng_1u32(U32 min, U32 max);\r\ninternal Rng1U32 shift_1u32(Rng1U32 r, U32 x);\r\ninternal Rng1U32 pad_1u32(Rng1U32 r, U32 x);\r\ninternal U32 center_1u32(Rng1U32 r);\r\ninternal B32 contains_1u32(Rng1U32 r, U32 x);\r\ninternal U32 dim_1u32(Rng1U32 r);\r\ninternal Rng1U32 union_1u32(Rng1U32 a, Rng1U32 b);\r\ninternal Rng1U32 intersect_1u32(Rng1U32 a, Rng1U32 b);\r\ninternal U32 clamp_1u32(Rng1U32 r, U32 v);\r\n\r\n#define r1s32(min, max) rng_1s32((min), (max))\r\ninternal Rng1S32 rng_1s32(S32 min, S32 max);\r\ninternal Rng1S32 shift_1s32(Rng1S32 r, S32 x);\r\ninternal Rng1S32 pad_1s32(Rng1S32 r, S32 x);\r\ninternal S32 center_1s32(Rng1S32 r);\r\ninternal B32 contains_1s32(Rng1S32 r, S32 x);\r\ninternal S32 dim_1s32(Rng1S32 r);\r\ninternal Rng1S32 union_1s32(Rng1S32 a, Rng1S32 b);\r\ninternal Rng1S32 intersect_1s32(Rng1S32 a, Rng1S32 b);\r\ninternal S32 clamp_1s32(Rng1S32 r, S32 v);\r\n\r\n#define r1u64(min, max) rng_1u64((min), (max))\r\ninternal Rng1U64 rng_1u64(U64 min, U64 max);\r\ninternal Rng1U64 shift_1u64(Rng1U64 r, U64 x);\r\ninternal Rng1U64 pad_1u64(Rng1U64 r, U64 x);\r\ninternal U64 center_1u64(Rng1U64 r);\r\ninternal B32 contains_1u64(Rng1U64 r, U64 x);\r\ninternal U64 dim_1u64(Rng1U64 r);\r\ninternal Rng1U64 union_1u64(Rng1U64 a, Rng1U64 b);\r\ninternal Rng1U64 intersect_1u64(Rng1U64 a, Rng1U64 b);\r\ninternal U64 clamp_1u64(Rng1U64 r, U64 v);\r\n\r\n#define r1s64(min, max) rng_1s64((min), (max))\r\ninternal Rng1S64 rng_1s64(S64 min, S64 max);\r\ninternal Rng1S64 shift_1s64(Rng1S64 r, S64 x);\r\ninternal Rng1S64 pad_1s64(Rng1S64 r, S64 x);\r\ninternal S64 center_1s64(Rng1S64 r);\r\ninternal B32 contains_1s64(Rng1S64 r, S64 x);\r\ninternal S64 dim_1s64(Rng1S64 r);\r\ninternal Rng1S64 union_1s64(Rng1S64 a, Rng1S64 b);\r\ninternal Rng1S64 intersect_1s64(Rng1S64 a, Rng1S64 b);\r\ninternal S64 clamp_1s64(Rng1S64 r, S64 v);\r\n\r\n#define r1f32(min, max) rng_1f32((min), (max))\r\ninternal Rng1F32 rng_1f32(F32 min, F32 max);\r\ninternal Rng1F32 shift_1f32(Rng1F32 r, F32 x);\r\ninternal Rng1F32 pad_1f32(Rng1F32 r, F32 x);\r\ninternal F32 center_1f32(Rng1F32 r);\r\ninternal B32 contains_1f32(Rng1F32 r, F32 x);\r\ninternal F32 dim_1f32(Rng1F32 r);\r\ninternal Rng1F32 union_1f32(Rng1F32 a, Rng1F32 b);\r\ninternal Rng1F32 intersect_1f32(Rng1F32 a, Rng1F32 b);\r\ninternal F32 clamp_1f32(Rng1F32 r, F32 v);\r\n\r\n#define r2s16(min, max) rng_2s16((min), (max))\r\n#define r2s16p(x, y, z, w) r2s16(v2s16((x), (y)), v2s16((z), (w)))\r\ninternal Rng2S16 rng_2s16(Vec2S16 min, Vec2S16 max);\r\ninternal Rng2S16 shift_2s16(Rng2S16 r, Vec2S16 x);\r\ninternal Rng2S16 pad_2s16(Rng2S16 r, S16 x);\r\ninternal Vec2S16 center_2s16(Rng2S16 r);\r\ninternal B32 contains_2s16(Rng2S16 r, Vec2S16 x);\r\ninternal Vec2S16 dim_2s16(Rng2S16 r);\r\ninternal Rng2S16 union_2s16(Rng2S16 a, Rng2S16 b);\r\ninternal Rng2S16 intersect_2s16(Rng2S16 a, Rng2S16 b);\r\ninternal Vec2S16 clamp_2s16(Rng2S16 r, Vec2S16 v);\r\n\r\n#define r2s32(min, max) rng_2s32((min), (max))\r\n#define r2s32p(x, y, z, w) r2s32(v2s32((x), (y)), v2s32((z), (w)))\r\ninternal Rng2S32 rng_2s32(Vec2S32 min, Vec2S32 max);\r\ninternal Rng2S32 shift_2s32(Rng2S32 r, Vec2S32 x);\r\ninternal Rng2S32 pad_2s32(Rng2S32 r, S32 x);\r\ninternal Vec2S32 center_2s32(Rng2S32 r);\r\ninternal B32 contains_2s32(Rng2S32 r, Vec2S32 x);\r\ninternal Vec2S32 dim_2s32(Rng2S32 r);\r\ninternal Rng2S32 union_2s32(Rng2S32 a, Rng2S32 b);\r\ninternal Rng2S32 intersect_2s32(Rng2S32 a, Rng2S32 b);\r\ninternal Vec2S32 clamp_2s32(Rng2S32 r, Vec2S32 v);\r\n\r\n#define r2s64(min, max) rng_2s64((min), (max))\r\n#define r2s64p(x, y, z, w) r2s64(v2s64((x), (y)), v2s64((z), (w)))\r\ninternal Rng2S64 rng_2s64(Vec2S64 min, Vec2S64 max);\r\ninternal Rng2S64 shift_2s64(Rng2S64 r, Vec2S64 x);\r\ninternal Rng2S64 pad_2s64(Rng2S64 r, S64 x);\r\ninternal Vec2S64 center_2s64(Rng2S64 r);\r\ninternal B32 contains_2s64(Rng2S64 r, Vec2S64 x);\r\ninternal Vec2S64 dim_2s64(Rng2S64 r);\r\ninternal Rng2S64 union_2s64(Rng2S64 a, Rng2S64 b);\r\ninternal Rng2S64 intersect_2s64(Rng2S64 a, Rng2S64 b);\r\ninternal Vec2S64 clamp_2s64(Rng2S64 r, Vec2S64 v);\r\n\r\n#define r2f32(min, max) rng_2f32((min), (max))\r\n#define r2f32p(x, y, z, w) r2f32(v2f32((x), (y)), v2f32((z), (w)))\r\ninternal Rng2F32 rng_2f32(Vec2F32 min, Vec2F32 max);\r\ninternal Rng2F32 shift_2f32(Rng2F32 r, Vec2F32 x);\r\ninternal Rng2F32 pad_2f32(Rng2F32 r, F32 x);\r\ninternal Vec2F32 center_2f32(Rng2F32 r);\r\ninternal B32 contains_2f32(Rng2F32 r, Vec2F32 x);\r\ninternal Vec2F32 dim_2f32(Rng2F32 r);\r\ninternal Rng2F32 union_2f32(Rng2F32 a, Rng2F32 b);\r\ninternal Rng2F32 intersect_2f32(Rng2F32 a, Rng2F32 b);\r\ninternal Vec2F32 clamp_2f32(Rng2F32 r, Vec2F32 v);\r\n\r\n////////////////////////////////\r\n//~ rjf: Miscellaneous Ops\r\n\r\ninternal Vec3F32 hsv_from_rgb(Vec3F32 rgb);\r\ninternal Vec3F32 rgb_from_hsv(Vec3F32 hsv);\r\ninternal Vec4F32 hsva_from_rgba(Vec4F32 rgba);\r\ninternal Vec4F32 rgba_from_hsva(Vec4F32 hsva);\r\ninternal Vec4F32 rgba_from_u32(U32 hex);\r\ninternal U32 u32_from_rgba(Vec4F32 rgba);\r\n\r\n#define rgba_from_u32_lit_comp(h) { (((h)&0xff000000)>>24)/255.f, (((h)&0x00ff0000)>>16)/255.f, (((h)&0x0000ff00)>> 8)/255.f, (((h)&0x000000ff)>> 0)/255.f }\r\n\r\n////////////////////////////////\r\n//~ rjf: List Type Functions\r\n\r\ninternal void rng1u64_list_push(Arena *arena, Rng1U64List *list, Rng1U64 rng);\r\ninternal void rng1u64_list_concat(Rng1U64List *list, Rng1U64List *to_concat);\r\ninternal Rng1U64Array rng1u64_array_from_list(Arena *arena, Rng1U64List *list);\r\n\r\ninternal void rng1s64_list_push(Arena *arena, Rng1S64List *list, Rng1S64 rng);\r\ninternal Rng1S64Array rng1s64_array_from_list(Arena *arena, Rng1S64List *list);\r\n\r\n#endif // BASE_MATH_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_meta.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Lookups\r\n\r\ninternal Member *\r\nmember_from_name(Type *type, String8 name)\r\n{\r\n  Member *member = &member_nil;\r\n  if(type->members != 0 && name.size != 0)\r\n  {\r\n    for(U64 idx = 0; idx < type->count; idx += 1)\r\n    {\r\n      if(str8_match(type->members[idx].name, name, 0))\r\n      {\r\n        member = &type->members[idx];\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return member;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info * Instance Operations\r\n\r\ninternal void\r\ntyped_data_rebase_ptrs(Type *type, String8 data, void *base_ptr)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  typedef struct RebaseTypeTask RebaseTypeTask;\r\n  struct RebaseTypeTask\r\n  {\r\n    RebaseTypeTask *next;\r\n    Type *type;\r\n    U8 *ptr;\r\n  };\r\n  RebaseTypeTask start_task = {0, type, data.str};\r\n  RebaseTypeTask *first_task = &start_task;\r\n  RebaseTypeTask *last_task = first_task;\r\n  for(RebaseTypeTask *t = first_task; t != 0; t = t->next)\r\n  {\r\n    switch(t->type->kind)\r\n    {\r\n      default:{}break;\r\n      case TypeKind_Ptr:\n      if(!(t->type->flags & TypeFlag_IsExternal))\n      {\r\n        *(U64 *)t->ptr = ((U64)(*(U8 **)t->ptr - (U8 *)base_ptr));\r\n      }break;\r\n      case TypeKind_Array:\r\n      {\r\n        for(U64 idx = 0; idx < t->type->count; idx += 1)\r\n        {\r\n          RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1);\r\n          task->type = t->type->direct;\r\n          task->ptr  = t->ptr + t->type->direct->size * idx;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }\r\n      }break;\r\n      case TypeKind_Struct:\r\n      {\r\n        for(U64 idx = 0; idx < t->type->count; idx += 1)\r\n        {\r\n          Member *member = &t->type->members[idx];\r\n          RebaseTypeTask *task = push_array(scratch.arena, RebaseTypeTask, 1);\r\n          task->type = member->type;\r\n          task->ptr  = t->ptr + member->value;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8\r\nserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strings = {0};\r\n  str8_serial_begin(scratch.arena, &strings);\r\n  {\r\n    typedef struct SerializeTypeTask SerializeTypeTask;\r\n    struct SerializeTypeTask\r\n    {\r\n      SerializeTypeTask *next;\r\n      Type *type;\r\n      U64 count;\r\n      U8 *src;\r\n      Type *containing_type;\r\n      U8 *containing_ptr;\r\n      B32 is_post_header;\r\n    };\r\n    SerializeTypeTask start_task = {0, type, 1, data.str};\r\n    SerializeTypeTask *first_task = &start_task;\r\n    SerializeTypeTask *last_task = first_task;\r\n    for(SerializeTypeTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      switch(t->type->kind)\r\n      {\r\n        //- rjf: leaf -> just copy the data directly\r\n        default:\r\n        if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf)\r\n        {\r\n          str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));\r\n        }break;\r\n        \r\n        //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise just write as plain data\r\n        case TypeKind_Ptr:\r\n        {\r\n          // rjf: unpack info about this pointer\r\n          TypeSerializePtrRefInfo *ptr_ref_info = 0;\r\n          for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1)\r\n          {\r\n            if(params->ptr_ref_infos[idx].type == t->type->direct)\r\n            {\r\n              ptr_ref_info = &params->ptr_ref_infos[idx];\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: indexification -> subtract base, divide direct size, write index\r\n          if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t->src, sizeof(ptr_value));\r\n            U64 ptr_write_value = ((U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->indexify_base)/t->type->direct->size);\r\n            str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value);\r\n          }\r\n          \r\n          // rjf: offsetification -> subtract base, write offsets\r\n          else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t->src, sizeof(ptr_value));\r\n            U64 ptr_write_value = (U64)((U8 *)ptr_value - (U8 *)ptr_ref_info->offsetify_base);\r\n            str8_serial_push_struct(scratch.arena, &strings, &ptr_write_value);\r\n          }\r\n          \r\n          // rjf: size-by-member (pre-header): still potentially dependent on other members which\r\n          // delimit our size, so push a new post-header task for pointer.\r\n          else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header)\r\n          {\r\n            SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n            task->type  = t->type;\r\n            task->count = t->count;\r\n            task->src   = t->src;\r\n            task->containing_type = t->containing_type;\r\n            task->containing_ptr  = t->containing_ptr;\r\n            task->is_post_header = 1;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\r\n          \r\n          // rjf: size-by-member (post-header): all flat parts of containing struct have been\r\n          // iterated, so now we can read the size, & descend to new task to read pointer\r\n          // destination contents\r\n          else if(t->type->count_delimiter_name.size != 0 && t->is_post_header)\r\n          {\r\n            // rjf: determine count of this pointer\r\n            U64 count = 0;\r\n            {\r\n              Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name);\r\n              MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size);\r\n            }\r\n            \r\n            // rjf: push task\r\n            SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n            task->type                 = t->type->direct;\r\n            task->count                = count;\r\n            task->src                  = *(void **)t->src;\r\n            task->containing_type      = t->containing_type;\r\n            task->containing_ptr       = t->containing_ptr;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\n          \n          // rjf: catch-all: write pointer value\n          else\n          {\n            str8_serial_push_string(scratch.arena, &strings, str8(t->src, t->type->size*t->count));\n          }\n        }break;\r\n        \r\n        //- rjf: arrays -> descend to underlying type, + count\r\n        case TypeKind_Array:\r\n        {\r\n          SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->type->count;\r\n          task->src   = t->src;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n        \r\n        //- rjf: struct -> descend to members\r\n        case TypeKind_Struct:\r\n        {\r\n          U64 off = 0;\r\n          for(U64 idx = 0; idx < t->count; idx += 1)\r\n          {\r\n            for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1)\r\n            {\r\n              if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize)\r\n              {\r\n                continue;\r\n              }\r\n              SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n              task->type            = t->type->members[member_idx].type;\r\n              task->count           = 1;\r\n              task->src             = t->src + idx*t->type->size + t->type->members[member_idx].value;\r\n              task->containing_type = t->type;\r\n              task->containing_ptr  = t->src;\r\n              SLLQueuePush(first_task, last_task, task);\r\n            }\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: enum -> descend to basic type interpretation\r\n        case TypeKind_Enum:\r\n        {\r\n          SerializeTypeTask *task = push_array(scratch.arena, SerializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->count;\r\n          task->src   = t->src;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  String8 result = str8_serial_end(arena, &strings);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndeserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)\r\n{\r\n  String8 result = {0};\r\n  result.size = type->size;\r\n  result.str  = push_array(arena, U8, result.size);\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    typedef struct DeserializeTypeTask DeserializeTypeTask;\r\n    struct DeserializeTypeTask\r\n    {\r\n      DeserializeTypeTask *next;\r\n      Type *type;\r\n      U64 count;\r\n      U8 *dst;\r\n      Type *containing_type;\r\n      U8 *containing_ptr;\r\n      B32 is_post_header;\r\n    };\r\n    U64 read_off = 0;\r\n    DeserializeTypeTask start_task = {0, type, 1, result.str};\r\n    DeserializeTypeTask *first_task = &start_task;\r\n    DeserializeTypeTask *last_task = first_task;\r\n    for(DeserializeTypeTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      U8 *t_src = data.str + read_off;\r\n      switch(t->type->kind)\r\n      {\r\n        //- rjf: leaf -> copy the data directly\r\n        default:\r\n        if(TypeKind_FirstLeaf <= t->type->kind && t->type->kind <= TypeKind_LastLeaf)\r\n        {\r\n          MemoryCopy(t->dst, t_src, t->type->size*t->count);\r\n          read_off += t->type->size*t->count;\r\n        }break;\r\n        \r\n        //- rjf: pointers -> try to interpret/understand pointer & read/write, otherwise skip\r\n        case TypeKind_Ptr:\r\n        {\r\n          // rjf: unpack info about this pointer\r\n          TypeSerializePtrRefInfo *ptr_ref_info = 0;\r\n          for(U64 idx = 0; idx < params->ptr_ref_infos_count; idx += 1)\r\n          {\r\n            if(params->ptr_ref_infos[idx].type == t->type->direct)\r\n            {\r\n              ptr_ref_info = &params->ptr_ref_infos[idx];\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: indexification -> add base, multiply direct size\r\n          if(ptr_ref_info != 0 && ptr_ref_info->indexify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t_src, sizeof(ptr_value));\r\n            U64 ptr_write_value = (ptr_value + (U64)ptr_ref_info->indexify_base) * t->type->direct->size;\r\n            MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value));\r\n            read_off += sizeof(ptr_value);\r\n          }\r\n          \r\n          // rjf: offsetification -> subtract base, write offsets\r\n          else if(ptr_ref_info != 0 && ptr_ref_info->offsetify_base != 0)\r\n          {\r\n            U64 ptr_value = 0;\r\n            MemoryCopy(&ptr_value, t_src, sizeof(ptr_value));\r\n            U64 ptr_write_value = ptr_value + (U64)ptr_ref_info->offsetify_base;\r\n            MemoryCopy(t->dst, &ptr_write_value, sizeof(ptr_write_value));\r\n            read_off += sizeof(ptr_value);\r\n          }\r\n          \r\n          // rjf: size-by-member (pre-header): still potentially dependent on other members which\r\n          // delimit our size, so push a new post-header task for pointer.\r\n          else if(t->type->count_delimiter_name.size != 0 && !t->is_post_header)\r\n          {\r\n            DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n            task->type  = t->type;\r\n            task->count = t->count;\r\n            task->dst   = t->dst;\r\n            task->containing_type = t->containing_type;\r\n            task->containing_ptr = t->containing_ptr;\r\n            task->is_post_header = 1;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\r\n          \r\n          // rjf: size-by-member (post-header): all flat parts of containing struct have been\r\n          // iterated, so now we can read the size, & descend to new task to read pointer\r\n          // destination contents\r\n          else if(t->type->count_delimiter_name.size != 0 && t->is_post_header)\r\n          {\r\n            // rjf: determine count of this pointer\r\n            U64 count = 0;\r\n            {\r\n              Member *count_member = member_from_name(t->containing_type, t->type->count_delimiter_name);\r\n              MemoryCopy(&count, t->containing_ptr + count_member->value, count_member->type->size);\r\n            }\r\n            \r\n            // rjf: allocate buffer for pointer destination; write address into pointer value slot\r\n            U64 ptr_dest_buffer_size = (count+1)*t->type->direct->size;\r\n            U8 *ptr_dest_buffer = push_array(arena, U8, ptr_dest_buffer_size);\r\n            MemoryCopy(t->dst, &ptr_dest_buffer, sizeof(ptr_dest_buffer));\r\n            \r\n            // rjf: push task\r\n            DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n            task->type                 = t->type->direct;\r\n            task->count                = count;\r\n            task->dst                  = ptr_dest_buffer;\r\n            task->containing_type      = t->containing_type;\r\n            task->containing_ptr       = t->containing_ptr;\r\n            SLLQueuePush(first_task, last_task, task);\r\n          }\n          \n          // rjf: catch-all: read pointer value\n          else\n          {\n            MemoryCopy(t->dst, t_src, t->type->size*t->count);\r\n            read_off += t->type->size*t->count;\n          }\n        }break;\r\n        \r\n        //- rjf: arrays -> descend to underlying type, + count\r\n        case TypeKind_Array:\r\n        {\r\n          DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->type->count;\r\n          task->dst   = t->dst;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n        \r\n        //- rjf: struct -> descend to members\r\n        case TypeKind_Struct:\r\n        {\r\n          for(U64 idx = 0; idx < t->count; idx += 1)\r\n          {\r\n            for(U64 member_idx = 0; member_idx < t->type->count; member_idx += 1)\r\n            {\r\n              if(t->type->members[member_idx].flags & MemberFlag_DoNotSerialize)\r\n              {\r\n                continue;\r\n              }\r\n              DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n              task->type            = t->type->members[member_idx].type;\r\n              task->count           = 1;\r\n              task->dst             = t->dst + idx*t->type->size + t->type->members[member_idx].value;\r\n              task->containing_type = t->type;\r\n              task->containing_ptr  = t->dst;\r\n              SLLQueuePush(first_task, last_task, task);\r\n            }\r\n          }\r\n        }break;\r\n        \r\n        //- rjf: enum -> descend to basic type interpretation\r\n        case TypeKind_Enum:\r\n        {\r\n          DeserializeTypeTask *task = push_array(scratch.arena, DeserializeTypeTask, 1);\r\n          task->type  = t->type->direct;\r\n          task->count = t->count;\r\n          task->dst   = t->dst;\r\n          task->containing_type = t->containing_type;\r\n          task->containing_ptr  = t->containing_ptr;\r\n          SLLQueuePush(first_task, last_task, task);\r\n        }break;\r\n      }\r\n    }\r\n    if(params->advance_out != 0)\r\n    {\r\n      params->advance_out[0] = read_off;\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ndeep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 data_srlz = serialized_from_typed_data(scratch.arena, type, data, params);\r\n  String8 data_copy = deserialized_from_typed_data(arena, type, data_srlz, params);\r\n  scratch_end(scratch);\r\n  return data_copy;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_meta.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_META_H\r\n#define BASE_META_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Meta Markup Features\r\n\r\n#define EmbedFile(name, path)\r\n#define TweakB32(name, default)           (TWEAK_##name)\r\n#define TweakF32(name, default, min, max) (TWEAK_##name)\r\n\r\n////////////////////////////////\r\n//~ rjf: Tweak Info Tables\r\n\r\ntypedef struct TweakB32Info TweakB32Info;\r\nstruct TweakB32Info\r\n{\r\n  String8 name;\r\n  B32 default_value;\r\n  B32 *value_ptr;\r\n};\r\n\r\ntypedef struct TweakF32Info TweakF32Info;\r\nstruct TweakF32Info\r\n{\r\n  String8 name;\r\n  F32 default_value;\r\n  Rng1F32 value_range;\r\n  F32 *value_ptr;\r\n};\r\n\r\ntypedef struct TweakB32InfoTable TweakB32InfoTable;\r\nstruct TweakB32InfoTable\r\n{\r\n  TweakB32Info *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct TweakF32InfoTable TweakF32InfoTable;\r\nstruct TweakF32InfoTable\r\n{\r\n  TweakF32Info *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct EmbedInfo EmbedInfo;\r\nstruct EmbedInfo\r\n{\r\n  String8 name;\r\n  String8 *data;\r\n  U128 *hash;\r\n};\r\n\r\ntypedef struct EmbedInfoTable EmbedInfoTable;\r\nstruct EmbedInfoTable\r\n{\r\n  EmbedInfo *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Types\r\n\r\ntypedef enum TypeKind\r\n{\r\n  TypeKind_Null,\r\n  \r\n  // rjf: leaves\r\n  TypeKind_Void, TypeKind_FirstLeaf = TypeKind_Void,\r\n  TypeKind_U8,\r\n  TypeKind_U16,\r\n  TypeKind_U32,\r\n  TypeKind_U64,\r\n  TypeKind_S8,\r\n  TypeKind_S16,\r\n  TypeKind_S32,\r\n  TypeKind_S64,\r\n  TypeKind_B8,\r\n  TypeKind_B16,\r\n  TypeKind_B32,\r\n  TypeKind_B64,\r\n  TypeKind_F32,\r\n  TypeKind_F64, TypeKind_LastLeaf = TypeKind_F64,\r\n  \r\n  // rjf: operators\r\n  TypeKind_Ptr,\r\n  TypeKind_Array,\r\n  \r\n  // rjf: user-defined-types\r\n  TypeKind_Struct,\r\n  TypeKind_Union,\r\n  TypeKind_Enum,\r\n  \r\n  TypeKind_COUNT\r\n}\r\nTypeKind;\r\n\r\ntypedef U32 TypeFlags;\r\nenum\r\n{\r\n  TypeFlag_IsExternal  = (1<<0),\r\n  TypeFlag_IsPlainText = (1<<1),\r\n  TypeFlag_IsCodeText  = (1<<2),\r\n  TypeFlag_IsPathText  = (1<<3),\r\n};\r\n\r\ntypedef U32 MemberFlags;\r\nenum\r\n{\r\n  MemberFlag_DoNotSerialize  = (1<<0),\r\n};\r\n\r\ntypedef struct Type Type;\r\ntypedef struct Member Member;\r\nstruct Member\r\n{\r\n  String8 name;\r\n  String8 pretty_name;\r\n  Type *type;\r\n  U64 value;\r\n  MemberFlags flags;\r\n};\r\n\r\ntypedef struct Type Type;\r\nstruct Type\r\n{\r\n  TypeKind kind;\r\n  TypeFlags flags;\r\n  U64 size;\r\n  Type *direct;\r\n  String8 name;\r\n  String8 count_delimiter_name; // gathered from surrounding members, turns *->[1] into *->[N]\r\n  U64 count;\r\n  Member *members;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Serialization Parameters\r\n\r\ntypedef struct TypeSerializePtrRefInfo TypeSerializePtrRefInfo;\r\nstruct TypeSerializePtrRefInfo\r\n{\r\n  Type *type;           // pointers to this\r\n  void *indexify_base;  // can be indexified using this\r\n  void *offsetify_base; // can be offsetified using this\r\n  void *nil_ptr;        // is terminal if matching 0 or this\r\n};\r\n\r\ntypedef struct TypeSerializeParams TypeSerializeParams;\r\nstruct TypeSerializeParams\r\n{\r\n  U64 *advance_out;\r\n  TypeSerializePtrRefInfo *ptr_ref_infos;\r\n  U64 ptr_ref_infos_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Name -> Type Info\r\n\r\n#define type(T) (&T##__type)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Table Initializer Helpers\r\n\r\n#define member_lit_comp(S, ti, m, ...) {str8_lit_comp(#m), {0}, (ti), OffsetOf(S, m), __VA_ARGS__}\r\n#define struct_members(S) read_only global Member S##__members[] =\r\n#define struct_type(S, ...) read_only global Type S##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#S), {0}, ArrayCount(S##__members), S##__members, __VA_ARGS__}\r\n#define named_struct_type(name, S, ...) read_only global Type name##__type = {TypeKind_Struct, 0, sizeof(S), &type_nil, str8_lit_comp(#name), {0}, ArrayCount(name##__members), name##__members, __VA_ARGS__}\r\n#define ptr_type(name, ti, ...) read_only global Type name = {TypeKind_Ptr, 0, sizeof(void *), (ti), __VA_ARGS__}\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nread_only global Type type_nil   = {TypeKind_Null, 0, 0, &type_nil};\r\nread_only global Member member_nil = {{0}, {0}, &type_nil};\r\n\r\n////////////////////////////////\r\n//~ rjf: Built-In Types\r\n\r\n//- rjf: leaves\r\nread_only global Type void__type = {TypeKind_Void, 0, 0,           &type_nil, str8_lit_comp(\"void\")};\r\nread_only global Type U8__type   = {TypeKind_U8,   0, sizeof(U8),  &type_nil, str8_lit_comp(\"U8\")};\r\nread_only global Type U16__type  = {TypeKind_U16,  0, sizeof(U16), &type_nil, str8_lit_comp(\"U16\")};\r\nread_only global Type U32__type  = {TypeKind_U32,  0, sizeof(U32), &type_nil, str8_lit_comp(\"U32\")};\r\nread_only global Type U64__type  = {TypeKind_U64,  0, sizeof(U64), &type_nil, str8_lit_comp(\"U64\")};\r\nread_only global Type S8__type   = {TypeKind_S8,   0, sizeof(S8),  &type_nil, str8_lit_comp(\"S8\")};\r\nread_only global Type S16__type  = {TypeKind_S16,  0, sizeof(S16), &type_nil, str8_lit_comp(\"S16\")};\r\nread_only global Type S32__type  = {TypeKind_S32,  0, sizeof(S32), &type_nil, str8_lit_comp(\"S32\")};\r\nread_only global Type S64__type  = {TypeKind_S64,  0, sizeof(S64), &type_nil, str8_lit_comp(\"S64\")};\r\nread_only global Type B8__type   = {TypeKind_B8,   0, sizeof(B8),  &type_nil, str8_lit_comp(\"B8\")};\r\nread_only global Type B16__type  = {TypeKind_B16,  0, sizeof(B16), &type_nil, str8_lit_comp(\"B16\")};\r\nread_only global Type B32__type  = {TypeKind_B32,  0, sizeof(B32), &type_nil, str8_lit_comp(\"B32\")};\r\nread_only global Type B64__type  = {TypeKind_B64,  0, sizeof(B64), &type_nil, str8_lit_comp(\"B64\")};\r\nread_only global Type F32__type  = {TypeKind_F32,  0, sizeof(F32), &type_nil, str8_lit_comp(\"F32\")};\r\nread_only global Type F64__type  = {TypeKind_F64,  0, sizeof(F64), &type_nil, str8_lit_comp(\"F64\")};\r\nread_only global Type *type_kind_type_table[] =\r\n{\r\n  &type_nil,\r\n  type(void),\r\n  type(U8),\r\n  type(U16),\r\n  type(U32),\r\n  type(U64),\r\n  type(S8),\r\n  type(S16),\r\n  type(S32),\r\n  type(S64),\r\n  type(B8),\r\n  type(B16),\r\n  type(B32),\r\n  type(B64),\r\n  type(F32),\r\n  type(F64),\r\n  &type_nil,\r\n  &type_nil,\r\n  &type_nil,\r\n  &type_nil,\r\n  &type_nil,\r\n};\r\n\r\n//- rjf: Rng1U64\r\nstruct_members(Rng1U64)\r\n{\r\n  member_lit_comp(Rng1U64, type(U64), min),\r\n  member_lit_comp(Rng1U64, type(U64), max),\r\n};\r\nstruct_type(Rng1U64);\r\n\r\n//- rjf: String8\r\nptr_type(String8__str_ptr_type, type(U8), str8_lit_comp(\"size\"));\r\nstruct_members(String8)\r\n{\r\n  member_lit_comp(String8, &String8__str_ptr_type, str),\r\n  member_lit_comp(String8, type(U64),              size),\r\n};\r\nstruct_type(String8);\r\n\r\n//- rjf: String8Node\r\nextern Type String8Node__type;\r\nType String8Node__ptr_type = {TypeKind_Ptr, 0, sizeof(void *), &String8Node__type};\r\nMember String8Node__members[] =\r\n{\r\n  {str8_lit_comp(\"next\"),   {0}, &String8Node__ptr_type,     OffsetOf(String8Node, next)},\r\n  {str8_lit_comp(\"string\"), {0}, type(String8),              OffsetOf(String8Node, string)},\r\n};\r\nType String8Node__type =\r\n{\r\n  TypeKind_Struct,\r\n  0,\r\n  sizeof(String8Node),\r\n  &type_nil,\r\n  str8_lit_comp(\"String8Node\"),\r\n  {0},\r\n  ArrayCount(String8Node__members),\r\n  String8Node__members,\r\n};\r\n\r\n//- rjf: String8List\r\nMember String8List__members[] =\r\n{\r\n  {str8_lit_comp(\"first\"),      {0}, &String8Node__ptr_type,     OffsetOf(String8List, first)},\r\n  {str8_lit_comp(\"last\"),       {0}, &String8Node__ptr_type,     OffsetOf(String8List, last), MemberFlag_DoNotSerialize},\r\n  {str8_lit_comp(\"node_count\"), {0}, type(U64), OffsetOf(String8List, node_count)},\r\n  {str8_lit_comp(\"total_size\"), {0}, type(U64), OffsetOf(String8List, total_size)},\r\n};\r\nType String8List__type =\r\n{\r\n  TypeKind_Struct,\r\n  0,\r\n  sizeof(String8List),\r\n  &type_nil,\r\n  str8_lit_comp(\"String8List\"),\r\n  {0},\r\n  ArrayCount(String8List__members),\r\n  String8List__members,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info Lookups\r\n\r\ninternal Member *member_from_name(Type *type, String8 name);\r\n#define EachMember(T, it) (Member *it = (type(T))->members; it != 0 && it < (type(T))->members + (type(T))->count; it += 1)\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Info * Instance Operations\r\n\r\ninternal void typed_data_rebase_ptrs(Type *type, String8 data, void *base_ptr);\r\ninternal String8 serialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);\r\ninternal String8 deserialized_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);\r\ninternal String8 deep_copy_from_typed_data(Arena *arena, Type *type, String8 data, TypeSerializeParams *params);\r\n#define struct_rebase_ptrs(T, ptr, base)                   typed_data_rebase_ptrs(type(T), str8_struct(ptr), (base))\r\n#define serialized_from_struct(arena, T, ptr, ...)         serialized_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__})\r\n#define struct_from_serialized(arena, T, string, ...) (T *)deserialized_from_typed_data((arena), type(T), (string), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str\r\n#define deep_copy_from_struct(arena, T, ptr, ...)     (T *)deep_copy_from_typed_data((arena), type(T), str8_struct(ptr), &(TypeSerializeParams){.ptr_ref_infos = 0, __VA_ARGS__}).str\r\n\r\n#endif // BASE_META_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_profile.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_profile.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_PROFILE_H\r\n#define BASE_PROFILE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Zero Settings\r\n\r\n#if !defined(PROFILE_TELEMETRY)\r\n# define PROFILE_TELEMETRY 0\r\n#endif\r\n\r\n#if !defined(MARKUP_LAYER_COLOR)\r\n# define MARKUP_LAYER_COLOR 1.00f, 0.00f, 1.00f\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Third Party Includes\r\n\r\n#if PROFILE_TELEMETRY\r\n# include \"rad_tm.h\"\r\n# if OS_WINDOWS\r\n#  pragma comment(lib, \"ws2_32.lib\")\r\n#  pragma comment(lib, \"rad_tm_win64.lib\")\r\n# endif\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Telemetry Profile Defines\r\n\r\n#if PROFILE_TELEMETRY\r\n# define ProfBegin(...)            tmEnter(0, 0, __VA_ARGS__)\r\n# define ProfBeginDynamic(...)     (TM_API_PTR ? TM_API_PTR->_tmEnterZoneV_Core(0, 0, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0)\r\n# define ProfEnd(...)              (TM_API_PTR ? TM_API_PTR->_tmLeaveZone(0) : (void)0)\r\n# define ProfTick(...)             tmTick(0)\r\n# define ProfIsCapturing(...)      tmRunning()\r\n# define ProfBeginCapture(...)     tmOpen(0, __VA_ARGS__, __DATE__, \"localhost\", TMCT_TCP, TELEMETRY_DEFAULT_PORT, TMOF_INIT_NETWORKING|TMOF_CAPTURE_CONTEXT_SWITCHES, 100)\r\n# define ProfEndCapture(...)       tmClose(0)\r\n# define ProfThreadName(...)       (TM_API_PTR ? TM_API_PTR->_tmThreadName(0, 0, __VA_ARGS__) : (void)0)\r\n# define ProfMsg(...)              (TM_API_PTR ? TM_API_PTR->_tmMessageV_Core(0, TMMF_ICON_NOTE, __FILE__, &g_telemetry_filename_id, __LINE__, __VA_ARGS__) : (void)0)\r\n# define ProfBeginLockWait(...)    tmStartWaitForLock(0, 0, __VA_ARGS__)\r\n# define ProfEndLockWait(...)      tmEndWaitForLock(0)\r\n# define ProfLockTake(...)         tmAcquiredLock(0, 0, __VA_ARGS__)\r\n# define ProfLockDrop(...)         tmReleasedLock(0, __VA_ARGS__)\r\n# define ProfColor(color)          tmZoneColorSticky(color)\r\n# define ProfBeginV(...)                                                           \\\r\nif (TM_API_PTR) {                                                                \\\r\nstatic tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \\\r\nTemp scratch = scratch_begin(0,0);                                             \\\r\nString8 string = push_str8f(scratch.arena, __VA_ARGS__);                       \\\r\ntm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size);          \\\r\nhash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str);              \\\r\nTM_API_PTR->_tmEnterZoneFast_Core(0, 0, file_id, __LINE__, hash);              \\\r\nscratch_end(scratch);                                                          \\\r\n}\r\n# define ProfNoteV(...) \t\t\t\t\t\t\t\t\t\t\t\t\t\t   \\\r\nif (TM_API_PTR) {     \t\t\t\t\t\t\t\t\t\t\t\t\t\t   \\\r\nstatic tm_uint64 file_id = 0; TM_API_PTR->_tmStaticString(&file_id, __FILE__); \\\r\nTemp scratch = scratch_begin(0,0);                                             \\\r\nString8 string = push_str8f(scratch.arena, __VA_ARGS__);                       \\\r\ntm_uint64 hash = TM_API_PTR->_tmHash((char*)string.str, string.size);          \\\r\nhash = TM_API_PTR->_tmSendDynamicString(hash, (char*)string.str);              \\\r\nTM_API_PTR->_tmMessageFast_Core(0, TMMF_ICON_NOTE, file_id, __LINE__, hash);   \\\r\nscratch_end(scratch);                                                          \\\r\n}\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Zeroify Undefined Defines\r\n\r\n#if !defined(ProfBegin)\r\n# define ProfBegin(...)         (0)\r\n# define ProfBeginDynamic(...)  (0)\r\n# define ProfEnd(...)           (0)\r\n# define ProfTick(...)          (0)\r\n# define ProfIsCapturing(...)   (0)\r\n# define ProfBeginCapture(...)  (0)\r\n# define ProfEndCapture(...)    (0)\r\n# define ProfThreadName(...)    (0)\r\n# define ProfMsg(...)           (0)\r\n# define ProfBeginLockWait(...) (0)\r\n# define ProfEndLockWait(...)   (0)\r\n# define ProfLockTake(...)      (0)\r\n# define ProfLockDrop(...)      (0)\r\n# define ProfColor(...)         (0)\r\n# define ProfBeginV(...)        (0)\r\n# define ProfNoteV(...)         (0)\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Helper Wrappers\r\n\r\n#define ProfBeginFunction(...) ProfBegin(this_function_name)\r\n#define ProfScope(...) DeferLoop(ProfBeginDynamic(__VA_ARGS__), ProfEnd())\r\n\r\n#endif // BASE_PROFILE_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_strings.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Third Party Includes\r\n\r\n#if !BUILD_SUPPLEMENTARY_UNIT\r\n# define STB_SPRINTF_IMPLEMENTATION\r\n# define STB_SPRINTF_STATIC\r\n# include \"third_party/stb/stb_sprintf.h\"\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): String <-> Integer Tables\r\n\r\nread_only global U8 integer_symbols[16] = {\r\n  '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F',\r\n};\r\n\r\n// NOTE(allen): Includes reverses for uppercase and lowercase hex.\r\nread_only global U8 integer_symbol_reverse[128] = {\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n};\r\n\r\nread_only global U8 base64[64] = {\r\n  '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',\r\n  'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',\r\n  'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',\r\n  'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',\r\n  'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',\r\n  '_', '$',\r\n};\r\n\r\nread_only global U8 base64_reverse[128] = {\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0xFF,0xFF,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,\r\n  0xFF,0x24,0x25,0x26,0x27,0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F,0x30,0x31,0x32,\r\n  0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x3A,0x3B,0x3C,0x3D,0xFF,0xFF,0xFF,0xFF,0x3E,\r\n  0xFF,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,\r\n  0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F,0x20,0x21,0x22,0x23,0xFF,0xFF,0xFF,0xFF,0xFF,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Character Classification & Conversion Functions\r\n\r\ninternal B32\r\nchar_is_space(U8 c){\r\n  return(c == ' ' || c == '\\n' || c == '\\t' || c == '\\r' || c == '\\f' || c == '\\v');\r\n}\r\n\r\ninternal B32\r\nchar_is_upper(U8 c){\r\n  return('A' <= c && c <= 'Z');\r\n}\r\n\r\ninternal B32\r\nchar_is_lower(U8 c){\r\n  return('a' <= c && c <= 'z');\r\n}\r\n\r\ninternal B32\r\nchar_is_alpha(U8 c){\r\n  return(char_is_upper(c) || char_is_lower(c));\r\n}\r\n\r\ninternal B32\r\nchar_is_slash(U8 c){\r\n  return(c == '/' || c == '\\\\');\r\n}\r\n\r\ninternal B32\r\nchar_is_digit(U8 c, U32 base){\r\n  B32 result = 0;\r\n  if (0 < base && base <= 16){\r\n    U8 val = integer_symbol_reverse[c];\r\n    if (val < base){\r\n      result = 1;\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal U8\r\nchar_to_lower(U8 c){\r\n  if (char_is_upper(c)){\r\n    c += ('a' - 'A');\r\n  }\r\n  return(c);\r\n}\r\n\r\ninternal U8\r\nchar_to_upper(U8 c){\r\n  if (char_is_lower(c)){\r\n    c += ('A' - 'a');\r\n  }\r\n  return(c);\r\n}\r\n\r\ninternal U8\r\nchar_to_correct_slash(U8 c){\r\n  if(char_is_slash(c)){\r\n    c = '/';\r\n  }\r\n  return(c);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: C-String Measurement\r\n\r\ninternal U64\r\ncstring8_length(U8 *c){\r\n  U8 *p = c;\r\n  for (;*p != 0; p += 1);\r\n  return(p - c);\r\n}\r\n\r\ninternal U64\r\ncstring16_length(U16 *c){\r\n  U16 *p = c;\r\n  for (;*p != 0; p += 1);\r\n  return(p - c);\r\n}\r\n\r\ninternal U64\r\ncstring32_length(U32 *c){\r\n  U32 *p = c;\r\n  for (;*p != 0; p += 1);\r\n  return(p - c);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Constructors\r\n\r\ninternal String8\r\nstr8(U8 *str, U64 size){\r\n  String8 result = {str, size};\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstr8_range(U8 *first, U8 *one_past_last){\r\n  String8 result = {first, (U64)(one_past_last - first)};\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstr8_zero(void){\r\n  String8 result = {0};\r\n  return(result);\r\n}\r\n\r\ninternal String16\r\nstr16(U16 *str, U64 size){\r\n  String16 result = {str, size};\r\n  return(result);\r\n}\r\n\r\ninternal String16\r\nstr16_range(U16 *first, U16 *one_past_last){\r\n  String16 result = {first, (U64)(one_past_last - first)};\r\n  return(result);\r\n}\r\n\r\ninternal String16\r\nstr16_zero(void){\r\n  String16 result = {0};\r\n  return(result);\r\n}\r\n\r\ninternal String32\r\nstr32(U32 *str, U64 size){\r\n  String32 result = {str, size};\r\n  return(result);\r\n}\r\n\r\ninternal String32\r\nstr32_range(U32 *first, U32 *one_past_last){\r\n  String32 result = {first, (U64)(one_past_last - first)};\r\n  return(result);\r\n}\r\n\r\ninternal String32\r\nstr32_zero(void){\r\n  String32 result = {0};\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstr8_cstring(char *c){\r\n  String8 result = {(U8*)c, cstring8_length((U8*)c)};\r\n  return(result);\r\n}\r\n\r\ninternal String16\r\nstr16_cstring(U16 *c){\r\n  String16 result = {(U16*)c, cstring16_length((U16*)c)};\r\n  return(result);\r\n}\r\n\r\ninternal String32\r\nstr32_cstring(U32 *c){\r\n  String32 result = {(U32*)c, cstring32_length((U32*)c)};\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstr8_cstring_capped(void *cstr, void *cap)\r\n{\r\n  char *ptr = (char *)cstr;\r\n  char *opl = (char *)cap;\r\n  for (;ptr < opl && *ptr != 0; ptr += 1);\r\n  U64 size = (U64)(ptr - (char *)cstr);\r\n  String8 result = str8((U8*)cstr, size);\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_cstring_capped(void *cstr, void *cap)\r\n{\r\n  U16 *ptr = (U16 *)cstr;\r\n  U16 *opl = (U16 *)cap;\r\n  for (;ptr < opl && *ptr != 0; ptr += 1);\r\n  U64 size = (U64)(ptr - (U16 *)cstr);\r\n  String16 result = str16(cstr, size);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_cstring_capped_reverse(void *raw_start, void *raw_cap)\r\n{\r\n  U8 *start = raw_start;\r\n  U8 *ptr   = raw_cap;\r\n  for(; ptr > start; )\r\n  {\r\n    ptr -= 1;\r\n\r\n    if (*ptr == '\\0')\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  U64 size = (U64)(ptr - start);\r\n  String8 result  = str8(start, size);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Stylization\r\n\r\ninternal String8\r\nupper_from_str8(Arena *arena, String8 string)\r\n{\r\n  string = push_str8_copy(arena, string);\r\n  for(U64 idx = 0; idx < string.size; idx += 1)\r\n  {\r\n    string.str[idx] = char_to_upper(string.str[idx]);\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nlower_from_str8(Arena *arena, String8 string)\r\n{\r\n  string = push_str8_copy(arena, string);\r\n  for(U64 idx = 0; idx < string.size; idx += 1)\r\n  {\r\n    string.str[idx] = char_to_lower(string.str[idx]);\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nbackslashed_from_str8(Arena *arena, String8 string)\r\n{\r\n  string = push_str8_copy(arena, string);\r\n  for(U64 idx = 0; idx < string.size; idx += 1)\r\n  {\r\n    string.str[idx] = char_is_slash(string.str[idx]) ? '\\\\' : string.str[idx];\r\n  }\r\n  return string;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Matching\r\n\r\ninternal B32\r\nstr8_match(String8 a, String8 b, StringMatchFlags flags)\r\n{\r\n  B32 result = 0;\r\n  if(a.size == b.size && flags == 0)\r\n  {\r\n    result = MemoryMatch(a.str, b.str, b.size);\r\n  }\r\n  else if(a.size == b.size || (flags & StringMatchFlag_RightSideSloppy))\r\n  {\r\n    B32 case_insensitive  = (flags & StringMatchFlag_CaseInsensitive);\r\n    B32 slash_insensitive = (flags & StringMatchFlag_SlashInsensitive);\r\n    U64 size              = Min(a.size, b.size);\r\n    result = 1;\r\n    for(U64 i = 0; i < size; i += 1)\r\n    {\r\n      U8 at = a.str[i];\r\n      U8 bt = b.str[i];\r\n      if(case_insensitive)\r\n      {\r\n        at = char_to_upper(at);\r\n        bt = char_to_upper(bt);\r\n      }\r\n      if(slash_insensitive)\r\n      {\r\n        at = char_to_correct_slash(at);\r\n        bt = char_to_correct_slash(bt);\r\n      }\r\n      if(at != bt)\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nstr8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags){\r\n  U8 *p = string.str + start_pos;\r\n  U64 stop_offset = Max(string.size + 1, needle.size) - needle.size;\r\n  U8 *stop_p = string.str + stop_offset;\r\n  if (needle.size > 0){\r\n    U8 *string_opl = string.str + string.size;\r\n    String8 needle_tail = str8_skip(needle, 1);\r\n    StringMatchFlags adjusted_flags = flags | StringMatchFlag_RightSideSloppy;\r\n    U8 needle_first_char_adjusted = needle.str[0];\r\n    if(adjusted_flags & StringMatchFlag_CaseInsensitive){\r\n      needle_first_char_adjusted = char_to_upper(needle_first_char_adjusted);\r\n    }\r\n    for (;p < stop_p; p += 1){\r\n      U8 haystack_char_adjusted = *p;\r\n      if(adjusted_flags & StringMatchFlag_CaseInsensitive){\r\n        haystack_char_adjusted = char_to_upper(haystack_char_adjusted);\r\n      }\r\n      if (haystack_char_adjusted == needle_first_char_adjusted){\r\n        if (str8_match(str8_range(p + 1, string_opl), needle_tail, adjusted_flags)){\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  U64 result = string.size;\r\n  if (p < stop_p){\r\n    result = (U64)(p - string.str);\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal U64\r\nstr8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags)\r\n{\r\n  U64 result = 0;\r\n  for(S64 i = string.size - start_pos - needle.size; i >= 0; --i)\r\n  {\r\n    String8 haystack = str8_substr(string, rng_1u64(i, i + needle.size));\r\n    if(str8_match(haystack, needle, flags))\r\n    {\r\n      result = (U64)i + needle.size;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nstr8_ends_with(String8 string, String8 end, StringMatchFlags flags){\r\n  String8 postfix = str8_postfix(string, end.size);\r\n  B32 is_match = str8_match(end, postfix, flags);\r\n  return is_match;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Slicing\r\n\r\ninternal String8\r\nstr8_substr(String8 str, Rng1U64 range){\r\n  range.min = ClampTop(range.min, str.size);\r\n  range.max = ClampTop(range.max, str.size);\r\n  str.str += range.min;\r\n  str.size = dim_1u64(range);\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\nstr8_prefix(String8 str, U64 size){\r\n  str.size = ClampTop(size, str.size);\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\nstr8_skip(String8 str, U64 amt){\r\n  amt = ClampTop(amt, str.size);\r\n  str.str += amt;\r\n  str.size -= amt;\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\nstr8_postfix(String8 str, U64 size){\r\n  size = ClampTop(size, str.size);\r\n  str.str = (str.str + str.size) - size;\r\n  str.size = size;\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\nstr8_chop(String8 str, U64 amt){\r\n  amt = ClampTop(amt, str.size);\r\n  str.size -= amt;\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\nstr8_skip_chop_whitespace(String8 string){\r\n  U8 *first = string.str;\r\n  U8 *opl = first + string.size;\r\n  for (;first < opl; first += 1){\r\n    if (!char_is_space(*first)){\r\n      break;\r\n    }\r\n  }\r\n  for (;opl > first;){\r\n    opl -= 1;\r\n    if (!char_is_space(*opl)){\r\n      opl += 1;\r\n      break;\r\n    }\r\n  }\r\n  String8 result = str8_range(first, opl);\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Formatting & Copying\r\n\r\ninternal String8\r\npush_str8_cat(Arena *arena, String8 s1, String8 s2){\r\n  String8 str;\r\n  str.size = s1.size + s2.size;\r\n  str.str = push_array_no_zero(arena, U8, str.size + 1);\r\n  MemoryCopy(str.str, s1.str, s1.size);\r\n  MemoryCopy(str.str + s1.size, s2.str, s2.size);\r\n  str.str[str.size] = 0;\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\npush_str8_copy(Arena *arena, String8 s){\r\n  String8 str;\r\n  str.size = s.size;\r\n  str.str = push_array_no_zero(arena, U8, str.size + 1);\r\n  MemoryCopy(str.str, s.str, s.size);\r\n  str.str[str.size] = 0;\r\n  return(str);\r\n}\r\n\r\ninternal String8\r\npush_str8fv(Arena *arena, char *fmt, va_list args){\r\n  va_list args2;\r\n  va_copy(args2, args);\r\n  U32 needed_bytes = raddbg_vsnprintf(0, 0, fmt, args) + 1;\r\n  String8 result = {0};\r\n  result.str = push_array_no_zero(arena, U8, needed_bytes);\r\n  result.size = raddbg_vsnprintf((char*)result.str, needed_bytes, fmt, args2);\r\n  result.str[result.size] = 0;\r\n  va_end(args2);\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\npush_str8f(Arena *arena, char *fmt, ...){\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 result = push_str8fv(arena, fmt, args);\r\n  va_end(args);\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Integer Conversions\r\n\r\n//- rjf: string -> integer\r\n\r\ninternal S64\r\nsign_from_str8(String8 string, String8 *string_tail){\r\n  // count negative signs\r\n  U64 neg_count = 0;\r\n  U64 i = 0;\r\n  for (; i < string.size; i += 1){\r\n    if (string.str[i] == '-'){\r\n      neg_count += 1;\r\n    }\r\n    else if (string.str[i] != '+'){\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // output part of string after signs\r\n  *string_tail = str8_skip(string, i);\r\n  \r\n  // output integer sign\r\n  S64 sign = (neg_count & 1)?-1:+1;\r\n  return(sign);\r\n}\r\n\r\ninternal B32\r\nstr8_is_integer(String8 string, U32 radix){\r\n  B32 result = 0;\r\n  if (string.size > 0){\r\n    if (1 < radix && radix <= 16){\r\n      result = 1;\r\n      for (U64 i = 0; i < string.size; i += 1){\r\n        U8 c = string.str[i];\r\n        if (!(c < 0x80) || integer_symbol_reverse[c] >= radix){\r\n          result = 0;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal U64\r\nu64_from_str8(String8 string, U32 radix){\r\n  U64 x = 0;\r\n  if (1 < radix && radix <= 16){\r\n    for (U64 i = 0; i < string.size; i += 1){\r\n      x *= radix;\r\n      x += integer_symbol_reverse[string.str[i]&0x7F];\r\n    }\r\n  }\r\n  return(x);\r\n}\r\n\r\ninternal S64\r\ns64_from_str8(String8 string, U32 radix){\r\n  S64 sign = sign_from_str8(string, &string);\r\n  S64 x = (S64)u64_from_str8(string, radix) * sign;\r\n  return(x);\r\n}\r\n\r\ninternal U32\r\nu32_from_str8(String8 string, U32 radix)\r\n{\r\n  U64 x64 = u64_from_str8(string, radix);\r\n  U32 x32 = safe_cast_u32(x64);\r\n  return x32;\r\n}\r\n\r\ninternal S32\r\ns32_from_str8(String8 string, U32 radix)\r\n{\r\n  S64 x64 = s64_from_str8(string, radix);\r\n  S32 x32 = safe_cast_s32(x64);\r\n  return x32;\r\n}\r\n\r\ninternal B32\r\ntry_u64_from_str8_c_rules(String8 string, U64 *x){\r\n  B32 is_integer = 0;\r\n  if (str8_is_integer(string, 10)){\r\n    is_integer = 1;\r\n    *x = u64_from_str8(string, 10);\r\n  }\r\n  else{\r\n    String8 hex_string = str8_skip(string, 2);\r\n    if (str8_match(str8_prefix(string, 2), str8_lit(\"0x\"), 0) &&\r\n        str8_is_integer(hex_string, 0x10)){\r\n      is_integer = 1;\r\n      *x = u64_from_str8(hex_string, 0x10);\r\n    }\r\n    else if (str8_match(str8_prefix(string, 2), str8_lit(\"0b\"), 0) &&\r\n             str8_is_integer(hex_string, 2)){\r\n      is_integer = 1;\r\n      *x = u64_from_str8(hex_string, 2);\r\n    }\r\n    else{\r\n      String8 oct_string = str8_skip(string, 1);\r\n      if (str8_match(str8_prefix(string, 1), str8_lit(\"0\"), 0) &&\r\n          str8_is_integer(hex_string, 010)){\r\n        is_integer = 1;\r\n        *x = u64_from_str8(oct_string, 010);\r\n      }\r\n    }\r\n  }\r\n  return(is_integer);\r\n}\r\n\r\ninternal B32\r\ntry_s64_from_str8_c_rules(String8 string, S64 *x){\r\n  String8 string_tail = {0};\r\n  S64 sign = sign_from_str8(string, &string_tail);\r\n  U64 x_u64 = 0;\r\n  B32 is_integer = try_u64_from_str8_c_rules(string_tail, &x_u64);\r\n  *x = x_u64*sign;\r\n  return(is_integer);\r\n}\r\n\r\n//- rjf: integer -> string\r\n\r\ninternal String8\r\nstr8_from_memory_size(Arena *arena, U64 size)\r\n{\r\n  String8 result;\r\n\r\n  if(size < KB(1))\r\n  {\r\n    result = push_str8f(arena, \"%llu Bytes\", size);\r\n  }\r\n  else if(size < MB(1))\r\n  {\r\n    result = push_str8f(arena, \"%llu.%02llu KiB\", size / KB(1), ((size * 100) / KB(1)) % 100);\r\n  }\r\n  else if(size < GB(1))\r\n  {\r\n    result = push_str8f(arena, \"%llu.%02llu MiB\", size / MB(1), ((size * 100) / MB(1)) % 100);\r\n  }\r\n  else if(size < TB(1))\r\n  {\r\n    result = push_str8f(arena, \"%llu.%02llu GiB\", size / GB(1), ((size * 100) / GB(1)) % 100);\r\n  }\r\n  else\r\n  {\r\n    result = push_str8f(arena, \"%llu.%02llu TiB\", size / TB(1), ((size * 100) / TB(1)) % 100);\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_count(Arena *arena, U64 count)\r\n{\r\n  String8 result;\r\n\r\n  if(count < 1 * 1000)\r\n  {\r\n    result = push_str8f(arena, \"%llu\", count);\r\n  }\r\n  else if(count < 1000000)\r\n  {\r\n    U64 frac = ((count * 100) / 1000) % 100;\r\n    if(frac > 0)\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02lluK\", count / 1000, frac);\r\n    }\r\n    else\r\n    {\r\n      result = push_str8f(arena, \"%lluK\", count / 1000);\r\n    }\r\n  }\r\n  else if(count < 1000000000)\r\n  {\r\n    U64 frac = ((count * 100) / 1000000) % 100;\r\n    if(frac > 0)\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02lluM\", count / 1000000, frac);\r\n    }\r\n    else\r\n    {\r\n      result = push_str8f(arena, \"%lluM\", count / 1000000);\r\n    }\r\n  }\r\n  else\r\n  {\r\n    U64 frac = ((count * 100) * 1000000000) % 100;\r\n    if(frac > 0)\r\n    {\r\n      result = push_str8f(arena, \"%llu.%02lluB\", count / 1000000000, frac);\r\n    }\r\n    else\r\n    {\r\n      result = push_str8f(arena, \"%lluB\", count / 1000000000, frac);\r\n    }\r\n  }\r\n\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_bits_u32(Arena *arena, U32 x)\r\n{\r\n  U8 c0 = 'a' + ((x >> 28) & 0xf);\r\n  U8 c1 = 'a' + ((x >> 24) & 0xf);\r\n  U8 c2 = 'a' + ((x >> 20) & 0xf);\r\n  U8 c3 = 'a' + ((x >> 16) & 0xf);\r\n  U8 c4 = 'a' + ((x >> 12) & 0xf);\r\n  U8 c5 = 'a' + ((x >>  8) & 0xf);\r\n  U8 c6 = 'a' + ((x >>  4) & 0xf);\r\n  U8 c7 = 'a' + ((x >>  0) & 0xf);\r\n  String8 result = push_str8f(arena, \"%c%c%c%c%c%c%c%c\", c0, c1, c2, c3, c4, c5, c6, c7);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_bits_u64(Arena *arena, U64 x)\r\n{\r\n  U8 c0 = 'a' + ((x >> 60) & 0xf);\r\n  U8 c1 = 'a' + ((x >> 56) & 0xf);\r\n  U8 c2 = 'a' + ((x >> 52) & 0xf);\r\n  U8 c3 = 'a' + ((x >> 48) & 0xf);\r\n  U8 c4 = 'a' + ((x >> 44) & 0xf);\r\n  U8 c5 = 'a' + ((x >> 40) & 0xf);\r\n  U8 c6 = 'a' + ((x >> 36) & 0xf);\r\n  U8 c7 = 'a' + ((x >> 32) & 0xf);\r\n  U8 c8 = 'a' + ((x >> 28) & 0xf);\r\n  U8 c9 = 'a' + ((x >> 24) & 0xf);\r\n  U8 ca = 'a' + ((x >> 20) & 0xf);\r\n  U8 cb = 'a' + ((x >> 16) & 0xf);\r\n  U8 cc = 'a' + ((x >> 12) & 0xf);\r\n  U8 cd = 'a' + ((x >>  8) & 0xf);\r\n  U8 ce = 'a' + ((x >>  4) & 0xf);\r\n  U8 cf = 'a' + ((x >>  0) & 0xf);\r\n  String8 result = push_str8f(arena,\r\n                              \"%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\",\r\n                              c0, c1, c2, c3, c4, c5, c6, c7, c8, c9, ca, cb, cc, cd, ce, cf);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    // rjf: prefix\r\n    String8 prefix = {0};\r\n    switch(radix)\r\n    {\r\n      case 16:{prefix = str8_lit(\"0x\");}break;\r\n      case 8: {prefix = str8_lit(\"0o\");}break;\r\n      case 2: {prefix = str8_lit(\"0b\");}break;\r\n    }\r\n    \r\n    // rjf: determine # of chars between separators\r\n    U8 digit_group_size = 3;\r\n    switch(radix)\r\n    {\r\n      default:break;\r\n      case 2:\r\n      case 8:\r\n      case 16:\r\n      {digit_group_size = 4;}break;\r\n    }\r\n    \r\n    // rjf: prep\r\n    U64 needed_leading_0s = 0;\r\n    {\r\n      U64 needed_digits = 1;\r\n      {\r\n        U64 u64_reduce = u64;\r\n        for(;;)\r\n        {\r\n          u64_reduce /= radix;\r\n          if(u64_reduce == 0)\r\n          {\r\n            break;\r\n          }\r\n          needed_digits += 1;\r\n        }\r\n      }\r\n      needed_leading_0s = (min_digits > needed_digits) ? min_digits - needed_digits : 0;\r\n      U64 needed_separators = 0;\r\n      if(digit_group_separator != 0)\r\n      {\r\n        needed_separators = (needed_digits+needed_leading_0s)/digit_group_size;\r\n        if(needed_separators > 0 && (needed_digits+needed_leading_0s)%digit_group_size == 0)\r\n        {\r\n          needed_separators -= 1;\r\n        }\r\n      }\r\n      result.size = prefix.size + needed_leading_0s + needed_separators + needed_digits;\r\n      result.str = push_array_no_zero(arena, U8, result.size + 1);\r\n      result.str[result.size] = 0;\r\n    }\r\n    \r\n    // rjf: fill contents\r\n    {\r\n      U64 u64_reduce = u64;\r\n      U64 digits_until_separator = digit_group_size;\r\n      for(U64 idx = 0; idx < result.size; idx += 1)\r\n      {\r\n        if(digits_until_separator == 0 && digit_group_separator != 0)\r\n        {\r\n          result.str[result.size - idx - 1] = digit_group_separator;\r\n          digits_until_separator = digit_group_size+1;\r\n        }\r\n        else\r\n        {\r\n          result.str[result.size - idx - 1] = char_to_lower(integer_symbols[u64_reduce%radix]);\r\n          u64_reduce /= radix;\r\n        }\r\n        digits_until_separator -= 1;\r\n        if(u64_reduce == 0)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n      for(U64 leading_0_idx = 0; leading_0_idx < needed_leading_0s; leading_0_idx += 1)\r\n      {\r\n        result.str[prefix.size + leading_0_idx] = '0';\r\n      }\r\n    }\r\n    \r\n    // rjf: fill prefix\r\n    if(prefix.size != 0)\r\n    {\r\n      MemoryCopy(result.str, prefix.str, prefix.size);\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator)\r\n{\r\n  String8 result = {0};\r\n  // TODO(rjf): preeeeetty sloppy...\r\n  if(s64 < 0)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8 numeric_part = str8_from_u64(scratch.arena, (U64)(-s64), radix, min_digits, digit_group_separator);\r\n    result = push_str8f(arena, \"-%S\", numeric_part);\r\n    scratch_end(scratch);\r\n  }\r\n  else\r\n  {\r\n    result = str8_from_u64(arena, (U64)s64, radix, min_digits, digit_group_separator);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Float Conversions\r\n\r\ninternal F64\r\nf64_from_str8(String8 string)\r\n{\r\n  // TODO(rjf): crappy implementation for now that just uses atof.\r\n  F64 result = 0;\r\n  if(string.size > 0)\r\n  {\r\n    // rjf: find starting pos of numeric string, as well as sign\r\n    F64 sign = +1.0;\r\n    if(string.str[0] == '-')\r\n    {\r\n      sign = -1.0;\r\n    }\r\n    else if(string.str[0] == '+')\r\n    {\r\n      sign = 1.0;\r\n    }\r\n    \r\n    // rjf: gather numerics\r\n    U64 num_valid_chars = 0;\r\n    char buffer[64];\r\n    B32 exp = 0;\r\n    for(U64 idx = 0; idx < string.size && num_valid_chars < sizeof(buffer)-1; idx += 1)\r\n    {\r\n      if(char_is_digit(string.str[idx], 10) || string.str[idx] == '.' || string.str[idx] == 'e' ||\r\n         (exp && (string.str[idx] == '+' || string.str[idx] == '-')))\r\n      {\r\n        buffer[num_valid_chars] = string.str[idx];\r\n        num_valid_chars += 1;\r\n        exp = 0;\r\n        exp = (string.str[idx] == 'e');\r\n      }\r\n    }\r\n    \r\n    // rjf: null-terminate (the reason for all of this!!!!!!)\r\n    buffer[num_valid_chars] = 0;\r\n    \r\n    // rjf: do final conversion\r\n    result = sign * atof(buffer);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String List Construction Functions\r\n\r\ninternal String8Node*\r\nstr8_list_push_node(String8List *list, String8Node *node){\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += node->string.size;\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_node_set_string(String8List *list, String8Node *node, String8 string){\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += string.size;\r\n  node->string = string;\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_node_front(String8List *list, String8Node *node){\r\n  SLLQueuePushFront(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += node->string.size;\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string){\r\n  SLLQueuePushFront(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size += string.size;\r\n  node->string = string;\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push(Arena *arena, String8List *list, String8 string){\r\n  String8Node *node = push_array_no_zero(arena, String8Node, 1);\r\n  str8_list_push_node_set_string(list, node, string);\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_front(Arena *arena, String8List *list, String8 string){\r\n  String8Node *node = push_array_no_zero(arena, String8Node, 1);\r\n  str8_list_push_node_front_set_string(list, node, string);\r\n  return(node);\r\n}\r\n\r\ninternal void\r\nstr8_list_concat_in_place(String8List *list, String8List *to_push){\r\n  if(to_push->node_count != 0){\r\n    if (list->last){\r\n      list->node_count += to_push->node_count;\r\n      list->total_size += to_push->total_size;\r\n      list->last->next = to_push->first;\r\n      list->last = to_push->last;\r\n    }\r\n    else{\r\n      *list = *to_push;\r\n    }\r\n    MemoryZeroStruct(to_push);\r\n  }\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align){\r\n  String8Node *node = push_array_no_zero(arena, String8Node, 1);\r\n  U64 new_size = list->total_size + min;\r\n  U64 increase_size = 0;\r\n  if (align > 1){\r\n    // NOTE(allen): assert is power of 2\r\n    Assert(((align - 1) & align) == 0);\r\n    U64 mask = align - 1;\r\n    new_size += mask;\r\n    new_size &= (~mask);\r\n    increase_size = new_size - list->total_size;\r\n  }\r\n  local_persist const U8 zeroes_buffer[64] = {0};\r\n  Assert(increase_size <= ArrayCount(zeroes_buffer));\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->node_count += 1;\r\n  list->total_size = new_size;\r\n  node->string.str = (U8*)zeroes_buffer;\r\n  node->string.size = increase_size;\r\n  return(node);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_pushf(Arena *arena, String8List *list, char *fmt, ...){\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(arena, fmt, args);\r\n  String8Node *result = str8_list_push(arena, list, string);\r\n  va_end(args);\r\n  return(result);\r\n}\r\n\r\ninternal String8Node*\r\nstr8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...){\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(arena, fmt, args);\r\n  String8Node *result = str8_list_push_front(arena, list, string);\r\n  va_end(args);\r\n  return(result);\r\n}\r\n\r\ninternal String8List\r\nstr8_list_copy(Arena *arena, String8List *list){\r\n  String8List result = {0};\r\n  for (String8Node *node = list->first;\r\n       node != 0;\r\n       node = node->next){\r\n    String8Node *new_node = push_array_no_zero(arena, String8Node, 1);\r\n    String8 new_string = push_str8_copy(arena, node->string);\r\n    str8_list_push_node_set_string(&result, new_node, new_string);\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8List\r\nstr8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags){\r\n  String8List list = {0};\r\n  \r\n  B32 keep_empties = (flags & StringSplitFlag_KeepEmpties);\r\n  \r\n  U8 *ptr = string.str;\r\n  U8 *opl = string.str + string.size;\r\n  for (;ptr < opl;){\r\n    U8 *first = ptr;\r\n    for (;ptr < opl; ptr += 1){\r\n      U8 c = *ptr;\r\n      B32 is_split = 0;\r\n      for (U64 i = 0; i < split_char_count; i += 1){\r\n        if (split_chars[i] == c){\r\n          is_split = 1;\r\n          break;\r\n        }\r\n      }\r\n      if (is_split){\r\n        break;\r\n      }\r\n    }\r\n    \r\n    String8 string = str8_range(first, ptr);\r\n    if (keep_empties || string.size > 0){\r\n      str8_list_push(arena, &list, string);\r\n    }\r\n    ptr += 1;\r\n  }\r\n  \r\n  return(list);\r\n}\r\n\r\ninternal String8List\r\nstr8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags){\r\n  String8List list = str8_split(arena, string, split_chars.str, split_chars.size, flags);\r\n  return list;\r\n}\r\n\r\ninternal String8List\r\nstr8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags){\r\n  String8List result = {0};\r\n  for (String8Node *node = list.first; node != 0; node = node->next){\r\n    String8List split = str8_split_by_string_chars(arena, node->string, split_chars, flags);\r\n    str8_list_concat_in_place(&result, &split);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_list_join(Arena *arena, String8List *list, StringJoin *optional_params){\r\n  StringJoin join = {0};\r\n  if (optional_params != 0){\r\n    MemoryCopyStruct(&join, optional_params);\r\n  }\r\n  \r\n  U64 sep_count = 0;\r\n  if (list->node_count > 0){\r\n    sep_count = list->node_count - 1;\r\n  }\r\n  \r\n  String8 result;\r\n  result.size = join.pre.size + join.post.size + sep_count*join.sep.size + list->total_size;\r\n  U8 *ptr = result.str = push_array_no_zero(arena, U8, result.size + 1);\r\n  \r\n  MemoryCopy(ptr, join.pre.str, join.pre.size);\r\n  ptr += join.pre.size;\r\n  for (String8Node *node = list->first;\r\n       node != 0;\r\n       node = node->next){\r\n    MemoryCopy(ptr, node->string.str, node->string.size);\r\n    ptr += node->string.size;\r\n    if (node->next != 0){\r\n      MemoryCopy(ptr, join.sep.str, join.sep.size);\r\n      ptr += join.sep.size;\r\n    }\r\n  }\r\n  MemoryCopy(ptr, join.post.str, join.post.size);\r\n  ptr += join.post.size;\r\n  \r\n  *ptr = 0;\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal void\r\nstr8_list_from_flags(Arena *arena, String8List *list,\r\n                     U32 flags, String8 *flag_string_table, U32 flag_string_count){\r\n  for (U32 i = 0; i < flag_string_count; i += 1){\r\n    U32 flag = (1 << i);\r\n    if (flags & flag){\r\n      str8_list_push(arena, list, flag_string_table[i]);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf; String Arrays\r\n\r\ninternal String8Array\r\nstr8_array_from_list(Arena *arena, String8List *list)\r\n{\r\n  String8Array array;\r\n  array.count   = list->node_count;\r\n  array.v = push_array_no_zero(arena, String8, array.count);\r\n  U64 idx = 0;\r\n  for(String8Node *n = list->first; n != 0; n = n->next, idx += 1)\r\n  {\r\n    array.v[idx] = n->string;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal String8Array\r\nstr8_array_reserve(Arena *arena, U64 count)\r\n{\r\n  String8Array arr;\r\n  arr.count = 0;\r\n  arr.v = push_array(arena, String8, count);\r\n  return arr;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Path Helpers\r\n\r\ninternal String8\r\nstr8_chop_last_slash(String8 string){\r\n  if (string.size > 0){\r\n    U8 *ptr = string.str + string.size - 1;\r\n    for (;ptr >= string.str; ptr -= 1){\r\n      if (*ptr == '/' || *ptr == '\\\\'){\r\n        break;\r\n      }\r\n    }\r\n    if (ptr >= string.str){\r\n      string.size = (U64)(ptr - string.str);\r\n    }\r\n    else{\r\n      string.size = 0;\r\n    }\r\n  }\r\n  return(string);\r\n}\r\n\r\ninternal String8\r\nstr8_skip_last_slash(String8 string){\r\n  if (string.size > 0){\r\n    U8 *ptr = string.str + string.size - 1;\r\n    for (;ptr >= string.str; ptr -= 1){\r\n      if (*ptr == '/' || *ptr == '\\\\'){\r\n        break;\r\n      }\r\n    }\r\n    if (ptr >= string.str){\r\n      ptr += 1;\r\n      string.size = (U64)(string.str + string.size - ptr);\r\n      string.str = ptr;\r\n    }\r\n  }\r\n  return(string);\r\n}\r\n\r\ninternal String8\r\nstr8_chop_last_dot(String8 string)\r\n{\r\n  String8 result = string;\r\n  U64 p = string.size;\r\n  for (;p > 0;){\r\n    p -= 1;\r\n    if (string.str[p] == '.'){\r\n      result = str8_prefix(string, p);\r\n      break;\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstr8_skip_last_dot(String8 string){\r\n  String8 result = string;\r\n  U64 p = string.size;\r\n  for (;p > 0;){\r\n    p -= 1;\r\n    if (string.str[p] == '.'){\r\n      result = str8_skip(string, p + 1);\r\n      break;\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal PathStyle\r\npath_style_from_str8(String8 string){\r\n  PathStyle result = PathStyle_Relative;\r\n  if (string.size >= 1 && string.str[0] == '/'){\r\n    result = PathStyle_UnixAbsolute;\r\n  }\r\n  else if (string.size >= 2 &&\r\n           char_is_alpha(string.str[0]) &&\r\n           string.str[1] == ':'){\r\n    if (string.size == 2 ||\r\n        char_is_slash(string.str[2])){\r\n      result = PathStyle_WindowsAbsolute;\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8List\r\nstr8_split_path(Arena *arena, String8 string){\r\n  String8List result = str8_split(arena, string, (U8*)\"/\\\\\", 2, 0);\r\n  return(result);\r\n}\r\n\r\ninternal void\r\nstr8_path_list_resolve_dots_in_place(String8List *path, PathStyle style){\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  String8MetaNode *stack = 0;\r\n  String8MetaNode *free_meta_node = 0;\r\n  String8Node *first = path->first;\r\n  \r\n  MemoryZeroStruct(path);\r\n  for (String8Node *node = first, *next = 0;\r\n       node != 0;\r\n       node = next){\r\n    // save next now\r\n    next = node->next;\r\n    \r\n    // cases:\r\n    if (node == first && style == PathStyle_WindowsAbsolute){\r\n      goto save_without_stack;\r\n    }\r\n    if (node->string.size == 1 && node->string.str[0] == '.'){\r\n      goto do_nothing;\r\n    }\r\n    if (node->string.size == 2 && node->string.str[0] == '.' && node->string.str[1] == '.'){\r\n      if (stack != 0){\r\n        goto eliminate_stack_top;\r\n      }\r\n      else{\r\n        goto save_without_stack;\r\n      }\r\n    }\r\n    goto save_with_stack;\r\n    \r\n    \r\n    // handlers:\r\n    save_with_stack:\r\n    {\r\n      str8_list_push_node(path, node);\r\n      \r\n      String8MetaNode *stack_node = free_meta_node;\r\n      if (stack_node != 0){\r\n        SLLStackPop(free_meta_node);\r\n      }\r\n      else{\r\n        stack_node = push_array_no_zero(scratch.arena, String8MetaNode, 1);\r\n      }\r\n      SLLStackPush(stack, stack_node);\r\n      stack_node->node = node;\r\n      \r\n      continue;\r\n    }\r\n    \r\n    save_without_stack:\r\n    {\r\n      str8_list_push_node(path, node);\r\n      \r\n      continue;\r\n    }\r\n    \r\n    eliminate_stack_top:\r\n    {\r\n      path->node_count -= 1;\r\n      path->total_size -= stack->node->string.size;\r\n      \r\n      SLLStackPop(stack);\r\n      \r\n      if (stack == 0){\r\n        path->last = path->first;\r\n      }\r\n      else{\r\n        path->last = stack->node;\r\n      }\r\n      continue;\r\n    }\r\n    \r\n    do_nothing: continue;\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8\r\nstr8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style){\r\n  StringJoin params = {0};\r\n  switch(style)\r\n  {\r\n    case PathStyle_Null:{}break;\r\n    case PathStyle_Relative:\r\n    case PathStyle_WindowsAbsolute:\r\n    {\r\n      params.sep = str8_lit(\"/\");\r\n    }break;\r\n    \r\n    case PathStyle_UnixAbsolute:\r\n    {\r\n      params.pre = str8_lit(\"/\");\r\n      params.sep = str8_lit(\"/\");\r\n    }break;\r\n  }\r\n  String8 result = str8_list_join(arena, path, &params);\r\n  return result;\r\n}\r\n\r\ninternal String8TxtPtPair\r\nstr8_txt_pt_pair_from_string(String8 string)\r\n{\r\n  String8TxtPtPair pair = {0};\r\n  {\r\n    String8 file_part = {0};\r\n    String8 line_part = {0};\r\n    String8 col_part = {0};\r\n    \r\n    // rjf: grab file part\r\n    for(U64 idx = 0; idx <= string.size; idx += 1)\r\n    {\r\n      U8 byte = (idx < string.size) ? (string.str[idx]) : 0;\r\n      U8 next_byte = ((idx+1 < string.size) ? (string.str[idx+1]) : 0);\r\n      if(byte == ':' && next_byte != '/' && next_byte != '\\\\')\r\n      {\r\n        file_part = str8_prefix(string, idx);\r\n        line_part = str8_skip(string, idx+1);\r\n        break;\r\n      }\r\n      else if(byte == 0)\r\n      {\r\n        file_part = string;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: grab line/column\r\n    {\r\n      U64 colon_pos = str8_find_needle(line_part, 0, str8_lit(\":\"), 0);\r\n      if(colon_pos < line_part.size)\r\n      {\r\n        col_part = str8_skip(line_part, colon_pos+1);\r\n        line_part = str8_prefix(line_part, colon_pos);\r\n      }\r\n    }\r\n    \r\n    // rjf: convert line/column strings to numerics\r\n    U64 line = 0;\r\n    U64 column = 0;\r\n    try_u64_from_str8_c_rules(line_part, &line);\r\n    try_u64_from_str8_c_rules(col_part, &column);\r\n    \r\n    // rjf: fill\r\n    pair.string = file_part;\r\n    pair.pt = txt_pt((S64)line, (S64)column);\r\n    if(pair.pt.line == 0) { pair.pt.line = 1; }\r\n    if(pair.pt.column == 0) { pair.pt.column = 1; }\r\n  }\r\n  return pair;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UTF-8 & UTF-16 Decoding/Encoding\r\n\r\nread_only global U8 utf8_class[32] = {\r\n  1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,2,2,2,2,3,3,4,5,\r\n};\r\n\r\ninternal UnicodeDecode\r\nutf8_decode(U8 *str, U64 max){\r\n  UnicodeDecode result = {1, max_U32};\r\n  U8 byte = str[0];\r\n  U8 byte_class = utf8_class[byte >> 3];\r\n  switch (byte_class)\r\n  {\r\n    case 1:\r\n    {\r\n      result.codepoint = byte;\r\n    }break;\r\n    case 2:\r\n    {\r\n      if (2 < max)\r\n      {\r\n        U8 cont_byte = str[1];\r\n        if (utf8_class[cont_byte >> 3] == 0)\r\n        {\r\n          result.codepoint = (byte & bitmask5) << 6;\r\n          result.codepoint |=  (cont_byte & bitmask6);\r\n          result.inc = 2;\r\n        }\r\n      }\r\n    }break;\r\n    case 3:\r\n    {\r\n      if (2 < max)\r\n      {\r\n        U8 cont_byte[2] = {str[1], str[2]};\r\n        if (utf8_class[cont_byte[0] >> 3] == 0 &&\r\n            utf8_class[cont_byte[1] >> 3] == 0)\r\n        {\r\n          result.codepoint = (byte & bitmask4) << 12;\r\n          result.codepoint |= ((cont_byte[0] & bitmask6) << 6);\r\n          result.codepoint |=  (cont_byte[1] & bitmask6);\r\n          result.inc = 3;\r\n        }\r\n      }\r\n    }break;\r\n    case 4:\r\n    {\r\n      if (3 < max)\r\n      {\r\n        U8 cont_byte[3] = {str[1], str[2], str[3]};\r\n        if (utf8_class[cont_byte[0] >> 3] == 0 &&\r\n            utf8_class[cont_byte[1] >> 3] == 0 &&\r\n            utf8_class[cont_byte[2] >> 3] == 0)\r\n        {\r\n          result.codepoint = (byte & bitmask3) << 18;\r\n          result.codepoint |= ((cont_byte[0] & bitmask6) << 12);\r\n          result.codepoint |= ((cont_byte[1] & bitmask6) <<  6);\r\n          result.codepoint |=  (cont_byte[2] & bitmask6);\r\n          result.inc = 4;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal UnicodeDecode\r\nutf16_decode(U16 *str, U64 max){\r\n  UnicodeDecode result = {1, max_U32};\r\n  result.codepoint = str[0];\r\n  result.inc = 1;\r\n  if (max > 1 && 0xD800 <= str[0] && str[0] < 0xDC00 && 0xDC00 <= str[1] && str[1] < 0xE000){\r\n    result.codepoint = ((str[0] - 0xD800) << 10) | ((str[1] - 0xDC00) + 0x10000);\r\n    result.inc = 2;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal U32\r\nutf8_encode(U8 *str, U32 codepoint){\r\n  U32 inc = 0;\r\n  if (codepoint <= 0x7F){\r\n    str[0] = (U8)codepoint;\r\n    inc = 1;\r\n  }\r\n  else if (codepoint <= 0x7FF){\r\n    str[0] = (bitmask2 << 6) | ((codepoint >> 6) & bitmask5);\r\n    str[1] = bit8 | (codepoint & bitmask6);\r\n    inc = 2;\r\n  }\r\n  else if (codepoint <= 0xFFFF){\r\n    str[0] = (bitmask3 << 5) | ((codepoint >> 12) & bitmask4);\r\n    str[1] = bit8 | ((codepoint >> 6) & bitmask6);\r\n    str[2] = bit8 | ( codepoint       & bitmask6);\r\n    inc = 3;\r\n  }\r\n  else if (codepoint <= 0x10FFFF){\r\n    str[0] = (bitmask4 << 4) | ((codepoint >> 18) & bitmask3);\r\n    str[1] = bit8 | ((codepoint >> 12) & bitmask6);\r\n    str[2] = bit8 | ((codepoint >>  6) & bitmask6);\r\n    str[3] = bit8 | ( codepoint        & bitmask6);\r\n    inc = 4;\r\n  }\r\n  else{\r\n    str[0] = '?';\r\n    inc = 1;\r\n  }\r\n  return(inc);\r\n}\r\n\r\ninternal U32\r\nutf16_encode(U16 *str, U32 codepoint){\r\n  U32 inc = 1;\r\n  if (codepoint == max_U32){\r\n    str[0] = (U16)'?';\r\n  }\r\n  else if (codepoint < 0x10000){\r\n    str[0] = (U16)codepoint;\r\n  }\r\n  else{\r\n    U32 v = codepoint - 0x10000;\r\n    str[0] = safe_cast_u16(0xD800 + (v >> 10));\r\n    str[1] = safe_cast_u16(0xDC00 + (v & bitmask10));\r\n    inc = 2;\r\n  }\r\n  return(inc);\r\n}\r\n\r\ninternal U32\r\nutf8_from_utf32_single(U8 *buffer, U32 character){\r\n  return(utf8_encode(buffer, character));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Unicode String Conversions\r\n\r\ninternal String8\r\nstr8_from_16(Arena *arena, String16 in)\r\n{\r\n  String8 result = str8_zero();\r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size*3;\r\n    U8 *str = push_array_no_zero(arena, U8, cap + 1);\r\n    U16 *ptr = in.str;\r\n    U16 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    UnicodeDecode consume;\r\n    for(;ptr < opl; ptr += consume.inc)\r\n    {\r\n      consume = utf16_decode(ptr, opl - ptr);\r\n      size += utf8_encode(str + size, consume.codepoint);\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size));\r\n    result = str8(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String16\r\nstr16_from_8(Arena *arena, String8 in)\r\n{\r\n  String16 result = str16_zero();\r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size*2;\r\n    U16 *str = push_array_no_zero(arena, U16, cap + 1);\r\n    U8 *ptr = in.str;\r\n    U8 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    UnicodeDecode consume;\r\n    for(;ptr < opl; ptr += consume.inc)\r\n    {\r\n      consume = utf8_decode(ptr, opl - ptr);\r\n      size += utf16_encode(str + size, consume.codepoint);\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size)*2);\r\n    result = str16(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstr8_from_32(Arena *arena, String32 in)\r\n{\r\n  String8 result = str8_zero();\r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size*4;\r\n    U8 *str = push_array_no_zero(arena, U8, cap + 1);\r\n    U32 *ptr = in.str;\r\n    U32 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    for(;ptr < opl; ptr += 1)\r\n    {\r\n      size += utf8_encode(str + size, *ptr);\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size));\r\n    result = str8(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String32\r\nstr32_from_8(Arena *arena, String8 in)\r\n{\r\n  String32 result = str32_zero(); \r\n  if(in.size)\r\n  {\r\n    U64 cap = in.size;\r\n    U32 *str = push_array_no_zero(arena, U32, cap + 1);\r\n    U8 *ptr = in.str;\r\n    U8 *opl = ptr + in.size;\r\n    U64 size = 0;\r\n    UnicodeDecode consume;\r\n    for(;ptr < opl; ptr += consume.inc)\r\n    {\r\n      consume = utf8_decode(ptr, opl - ptr);\r\n      str[size] = consume.codepoint;\r\n      size += 1;\r\n    }\r\n    str[size] = 0;\r\n    arena_pop(arena, (cap - size)*4);\r\n    result = str32(str, size);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ String -> Enum Conversions\r\n\r\nread_only global struct\r\n{\r\n  String8         string;\r\n  OperatingSystem os;\r\n} g_os_enum_map[] =\r\n{\r\n  { str8_lit_comp(\"\"),        OperatingSystem_Null     },\r\n  { str8_lit_comp(\"Windows\"), OperatingSystem_Windows, },\r\n  { str8_lit_comp(\"Linux\"),   OperatingSystem_Linux,   },\r\n  { str8_lit_comp(\"Mac\"),     OperatingSystem_Mac,     },\r\n};\r\nStaticAssert(ArrayCount(g_os_enum_map) == OperatingSystem_COUNT, g_os_enum_map_count_check);\r\n\r\ninternal OperatingSystem\r\noperating_system_from_string(String8 string)\r\n{\r\n  for(U64 i = 0; i < ArrayCount(g_os_enum_map); ++i)\r\n  {\r\n    if(str8_match(g_os_enum_map[i].string, string, StringMatchFlag_CaseInsensitive))\r\n    {\r\n      return g_os_enum_map[i].os;\r\n    }\r\n  }\r\n  return OperatingSystem_Null;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Types & Space Enum -> String Conversions\r\n\r\ninternal String8\r\nstring_from_dimension(Dimension dimension){\r\n  local_persist String8 strings[] = {\r\n    str8_lit_comp(\"X\"),\r\n    str8_lit_comp(\"Y\"),\r\n    str8_lit_comp(\"Z\"),\r\n    str8_lit_comp(\"W\"),\r\n  };\r\n  String8 result = str8_lit(\"error\");\r\n  if ((U32)dimension < 4){\r\n    result = strings[dimension];\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstring_from_side(Side side){\r\n  local_persist String8 strings[] = {\r\n    str8_lit_comp(\"Min\"),\r\n    str8_lit_comp(\"Max\"),\r\n  };\r\n  String8 result = str8_lit(\"error\");\r\n  if ((U32)side < 2){\r\n    result = strings[side];\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstring_from_operating_system(OperatingSystem os)\r\n{\r\n  String8 result = g_os_enum_map[OperatingSystem_Null].string;\r\n  if(os < ArrayCount(g_os_enum_map))\r\n  {\r\n    result = g_os_enum_map[os].string;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstring_from_arch(Arch arch){\r\n  local_persist String8 strings[] = {\r\n    str8_lit_comp(\"Null\"),\r\n    str8_lit_comp(\"x64\"),\r\n    str8_lit_comp(\"x86\"),\r\n    str8_lit_comp(\"arm64\"),\r\n    str8_lit_comp(\"arm32\"),\r\n  };\r\n  String8 result = str8_lit(\"error\");\r\n  if (arch < Arch_COUNT){\r\n    result = strings[arch];\r\n  }\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Types -> String\r\n\r\ninternal String8\r\nstring_from_week_day(WeekDay week_day){\r\n  local_persist String8 strings[] = {\r\n    str8_lit_comp(\"Sun\"),\r\n    str8_lit_comp(\"Mon\"),\r\n    str8_lit_comp(\"Tue\"),\r\n    str8_lit_comp(\"Wed\"),\r\n    str8_lit_comp(\"Thu\"),\r\n    str8_lit_comp(\"Fri\"),\r\n    str8_lit_comp(\"Sat\"),\r\n  };\r\n  String8 result = str8_lit(\"Err\");\r\n  if ((U32)week_day < WeekDay_COUNT){\r\n    result = strings[week_day];\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstring_from_month(Month month){\r\n  local_persist String8 strings[] = {\r\n    str8_lit_comp(\"Jan\"),\r\n    str8_lit_comp(\"Feb\"),\r\n    str8_lit_comp(\"Mar\"),\r\n    str8_lit_comp(\"Apr\"),\r\n    str8_lit_comp(\"May\"),\r\n    str8_lit_comp(\"Jun\"),\r\n    str8_lit_comp(\"Jul\"),\r\n    str8_lit_comp(\"Aug\"),\r\n    str8_lit_comp(\"Sep\"),\r\n    str8_lit_comp(\"Oct\"),\r\n    str8_lit_comp(\"Nov\"),\r\n    str8_lit_comp(\"Dec\"),\r\n  };\r\n  String8 result = str8_lit(\"Err\");\r\n  if ((U32)month < Month_COUNT){\r\n    result = strings[month];\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\npush_date_time_string(Arena *arena, DateTime *date_time){\r\n  char *mon_str = (char*)string_from_month(date_time->month).str;\r\n  U32 adjusted_hour = date_time->hour%12;\r\n  if (adjusted_hour == 0){\r\n    adjusted_hour = 12;\r\n  }\r\n  char *ampm = \"am\";\r\n  if (date_time->hour >= 12){\r\n    ampm = \"pm\";\r\n  }\r\n  String8 result = push_str8f(arena, \"%d %s %d, %02d:%02d:%02d %s\",\r\n                              date_time->day, mon_str, date_time->year,\r\n                              adjusted_hour, date_time->min, date_time->sec, ampm);\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\npush_file_name_date_time_string(Arena *arena, DateTime *date_time){\r\n  char *mon_str = (char*)string_from_month(date_time->month).str;\r\n  String8 result = push_str8f(arena, \"%d-%s-%0d--%02d-%02d-%02d\",\r\n                              date_time->year, mon_str, date_time->day,\r\n                              date_time->hour, date_time->min, date_time->sec);\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nstring_from_elapsed_time(Arena *arena, DateTime dt){\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List list = {0};\r\n  if (dt.year){\r\n    str8_list_pushf(scratch.arena, &list, \"%dy\", dt.year);\r\n    str8_list_pushf(scratch.arena, &list, \"%um\", dt.mon);\r\n    str8_list_pushf(scratch.arena, &list, \"%ud\", dt.day);\r\n  } else if (dt.mon){\r\n    str8_list_pushf(scratch.arena, &list, \"%um\", dt.mon);\r\n    str8_list_pushf(scratch.arena, &list, \"%ud\", dt.day);\r\n  } else if (dt.day){\r\n    str8_list_pushf(scratch.arena, &list, \"%ud\", dt.day);\r\n  }\r\n  str8_list_pushf(scratch.arena, &list, \"%u:%u:%u:%u ms\", dt.hour, dt.min, dt.sec, dt.msec);\r\n  StringJoin join = { str8_lit_comp(\"\"), str8_lit_comp(\" \"), str8_lit_comp(\"\") };\r\n  String8 result = str8_list_join(arena, &list, &join);\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ Globally UNique Ids\r\n\r\ninternal String8\r\nstring_from_guid(Arena *arena, Guid guid)\r\n{\r\n  String8 result = push_str8f(arena, \"%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X\",\r\n                              guid.data1,\r\n                              guid.data2,\r\n                              guid.data3,\r\n                              guid.data4[0],\r\n                              guid.data4[1],\r\n                              guid.data4[2],\r\n                              guid.data4[3],\r\n                              guid.data4[4],\r\n                              guid.data4[5],\r\n                              guid.data4[6],\r\n                              guid.data4[7]);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\ntry_guid_from_string(String8 string, Guid *guid_out)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  B32 is_parsed = 0;\r\n  String8List list = str8_split_by_string_chars(scratch.arena, string, str8_lit(\"-\"), StringSplitFlag_KeepEmpties);\r\n  if(list.node_count == 5)\r\n  {\r\n    String8 data1_str    = list.first->string;\r\n    String8 data2_str    = list.first->next->string;\r\n    String8 data3_str    = list.first->next->next->string;\r\n    String8 data4_hi_str = list.first->next->next->next->string;\r\n    String8 data4_lo_str = list.first->next->next->next->next->string;\r\n    if(str8_is_integer(data1_str, 16) && \r\n        str8_is_integer(data2_str, 16) &&\r\n        str8_is_integer(data3_str, 16) &&\r\n        str8_is_integer(data4_hi_str, 16) &&\r\n        str8_is_integer(data4_lo_str, 16))\r\n    {\r\n      U64 data1    = u64_from_str8(data1_str, 16);\r\n      U64 data2    = u64_from_str8(data2_str, 16);\r\n      U64 data3    = u64_from_str8(data3_str, 16);\r\n      U64 data4_hi = u64_from_str8(data4_hi_str, 16);\r\n      U64 data4_lo = u64_from_str8(data4_lo_str, 16);\r\n      if(data1 <= max_U32 &&\r\n          data2 <= max_U16 &&\r\n          data3 <= max_U16 &&\r\n          data4_hi <= max_U16 &&\r\n          data4_lo <= 0xffffffffffff)\r\n      {\r\n        guid_out->data1 = (U32)data1;\r\n        guid_out->data2 = (U16)data2;\r\n        guid_out->data3 = (U16)data3;\r\n        U64 data4 = (data4_hi << 48) | data4_lo;\r\n        MemoryCopy(&guid_out->data4[0], &data4, sizeof(data4));\r\n        is_parsed = 1;\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return is_parsed;\r\n}\r\n\r\ninternal Guid\r\nguid_from_string(String8 string)\r\n{\r\n  Guid guid = {0};\r\n  try_guid_from_string(string, &guid);\r\n  return guid;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Text Indentation\r\n\r\ninternal String8\r\nindented_from_string(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  read_only local_persist U8 indentation_bytes[] = \"                                                                                                                                \";\r\n  String8List indented_strings = {0};\r\n  S64 depth = 0;\r\n  S64 next_depth = 0;\r\n  U64 line_begin_off = 0;\r\n  for(U64 off = 0; off <= string.size; off += 1)\r\n  {\r\n    U8 byte = off<string.size ? string.str[off] : 0;\r\n    switch(byte)\r\n    {\r\n      default:{}break;\r\n      case '{':case '[':case '(':{next_depth += 1; next_depth = Max(0, next_depth);}break;\r\n      case '}':case ']':case ')':{next_depth -= 1; next_depth = Max(0, next_depth); depth = next_depth;}break;\r\n      case '\\n':\r\n      case 0:\r\n      {\r\n        String8 line = str8_skip_chop_whitespace(str8_substr(string, r1u64(line_begin_off, off)));\r\n        if(line.size != 0)\r\n        {\r\n          str8_list_pushf(scratch.arena, &indented_strings, \"%.*s%S\\n\", (int)depth*2, indentation_bytes, line);\r\n        }\r\n        if(line.size == 0 && indented_strings.node_count != 0 && off < string.size)\r\n        {\r\n          str8_list_pushf(scratch.arena, &indented_strings, \"\\n\");\r\n        }\r\n        line_begin_off = off+1;\r\n        depth = next_depth;\r\n      }break;\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &indented_strings, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Escaping\r\n\r\ninternal String8\r\nescaped_from_raw_str8(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List parts = {0};\r\n  U64 start_split_idx = 0;\r\n  for(U64 idx = 0; idx <= string.size; idx += 1)\r\n  {\r\n    U8 byte = (idx < string.size) ? string.str[idx] : 0;\r\n    B32 split = 1;\r\n    String8 separator_replace = {0};\r\n    switch(byte)\r\n    {\r\n      default:{split = 0;}break;\r\n      case 0:    {}break;\r\n      case '\\a': {separator_replace = str8_lit(\"\\\\a\");}break;\r\n      case '\\b': {separator_replace = str8_lit(\"\\\\b\");}break;\r\n      case '\\f': {separator_replace = str8_lit(\"\\\\f\");}break;\r\n      case '\\n': {separator_replace = str8_lit(\"\\\\n\");}break;\r\n      case '\\r': {separator_replace = str8_lit(\"\\\\r\");}break;\r\n      case '\\t': {separator_replace = str8_lit(\"\\\\t\");}break;\r\n      case '\\v': {separator_replace = str8_lit(\"\\\\v\");}break;\r\n      case '\\\\': {separator_replace = str8_lit(\"\\\\\\\\\");}break;\r\n      case '\"':  {separator_replace = str8_lit(\"\\\\\\\"\");}break;\r\n      case '?':  {separator_replace = str8_lit(\"\\\\?\");}break;\r\n    }\r\n    if(split)\r\n    {\r\n      String8 substr = str8_substr(string, r1u64(start_split_idx, idx));\r\n      start_split_idx = idx+1;\r\n      str8_list_push(scratch.arena, &parts, substr);\r\n      if(separator_replace.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &parts, separator_replace);\r\n      }\r\n    }\r\n  }\r\n  StringJoin join = {0};\r\n  String8 result = str8_list_join(arena, &parts, &join);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nraw_from_escaped_str8(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strs = {0};\r\n  U64 start = 0;\r\n  for(U64 idx = 0; idx <= string.size; idx += 1)\r\n  {\r\n    if(idx == string.size || string.str[idx] == '\\\\' || string.str[idx] == '\\r')\r\n    {\r\n      String8 str = str8_substr(string, r1u64(start, idx));\r\n      if(str.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &strs, str);\r\n      }\r\n      start = idx+1;\r\n    }\r\n    if(idx < string.size && string.str[idx] == '\\\\')\r\n    {\r\n      U8 next_char = string.str[idx+1];\r\n      U8 replace_byte = 0;\r\n      switch(next_char)\r\n      {\r\n        default:{}break;\r\n        case 'a': replace_byte = 0x07; break;\r\n        case 'b': replace_byte = 0x08; break;\r\n        case 'e': replace_byte = 0x1b; break;\r\n        case 'f': replace_byte = 0x0c; break;\r\n        case 'n': replace_byte = 0x0a; break;\r\n        case 'r': replace_byte = 0x0d; break;\r\n        case 't': replace_byte = 0x09; break;\r\n        case 'v': replace_byte = 0x0b; break;\r\n        case '\\\\':replace_byte = '\\\\'; break;\r\n        case '\\'':replace_byte = '\\''; break;\r\n        case '\"': replace_byte = '\"';  break;\r\n        case '?': replace_byte = '?';  break;\r\n      }\r\n      String8 replace_string = push_str8_copy(scratch.arena, str8(&replace_byte, 1));\r\n      str8_list_push(scratch.arena, &strs, replace_string);\r\n      idx += 1;\r\n      start += 1;\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &strs, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Wrapping\r\n\r\ninternal String8List\r\nwrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent)\r\n{\r\n  String8List list = {0};\r\n  Rng1U64 line_range = r1u64(0, 0);\r\n  U64 wrapped_indent_level = 0;\r\n  static char *spaces = \"                                                                \";\r\n  for (U64 idx = 0; idx <= string.size; idx += 1){\r\n    U8 chr = idx < string.size ? string.str[idx] : 0;\r\n    if (chr == '\\n'){\r\n      Rng1U64 candidate_line_range = line_range;\r\n      candidate_line_range.max = idx;\r\n      // NOTE(nick): when wrapping is interrupted with \\n we emit a string without including \\n\r\n      // because later tool_fprint_list inserts separator after each node\r\n      // except for last node, so don't strip last \\n.\r\n      if (idx + 1 == string.size){\r\n        candidate_line_range.max += 1;\r\n      }\r\n      String8 substr = str8_substr(string, candidate_line_range);\r\n      str8_list_push(arena, &list, substr);\r\n      line_range = r1u64(idx+1,idx+1);\r\n    }\r\n    else\r\n      if (char_is_space(chr) || chr == 0){\r\n      Rng1U64 candidate_line_range = line_range;\r\n      candidate_line_range.max = idx;\r\n      String8 substr = str8_substr(string, candidate_line_range);\r\n      U64 width_this_line = max_width-wrapped_indent_level;\r\n      if (list.node_count == 0){\r\n        width_this_line = first_line_max_width;\r\n      }\r\n      if (substr.size > width_this_line){\r\n        String8 line = str8_substr(string, line_range);\r\n        if (wrapped_indent_level > 0){\r\n          line = push_str8f(arena, \"%.*s%S\", wrapped_indent_level, spaces, line);\r\n        }\r\n        str8_list_push(arena, &list, line);\r\n        line_range = r1u64(line_range.max+1, candidate_line_range.max);\r\n        wrapped_indent_level = ClampTop(64, wrap_indent);\r\n      }\r\n      else{\r\n        line_range = candidate_line_range;\r\n      }\r\n    }\r\n  }\r\n  if (line_range.min < string.size && line_range.max > line_range.min){\r\n    String8 line = str8_substr(string, line_range);\r\n    if (wrapped_indent_level > 0){\r\n      line = push_str8f(arena, \"%.*s%S\", wrapped_indent_level, spaces, line);\r\n    }\r\n    str8_list_push(arena, &list, line);\r\n  }\r\n  return list;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Color\r\n\r\ninternal String8\r\nhex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba)\r\n{\r\n  String8 hex_string = push_str8f(arena, \"%02x%02x%02x%02x\", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f));\r\n  return hex_string;\r\n}\r\n\r\ninternal Vec4F32\r\nrgba_from_hex_string_4f32(String8 hex_string)\r\n{\r\n  U8 byte_text[8] = {0};\r\n  U64 byte_text_idx = 0;\r\n  for(U64 idx = 0; idx < hex_string.size && byte_text_idx < ArrayCount(byte_text); idx += 1)\r\n  {\r\n    if(char_is_digit(hex_string.str[idx], 16))\r\n    {\r\n      byte_text[byte_text_idx] = char_to_lower(hex_string.str[idx]);\r\n      byte_text_idx += 1;\r\n    }\r\n  }\r\n  U8 byte_vals[4] = {0};\r\n  for(U64 idx = 0; idx < 4; idx += 1)\r\n  {\r\n    byte_vals[idx] = (U8)u64_from_str8(str8(&byte_text[idx*2], 2), 16);\r\n  }\r\n  Vec4F32 rgba = v4f32(byte_vals[0]/255.f, byte_vals[1]/255.f, byte_vals[2]/255.f, byte_vals[3]/255.f);\r\n  return rgba;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: String Fuzzy Matching\r\n\r\ninternal FuzzyMatchRangeList\r\nfuzzy_match_find(Arena *arena, String8 needle, String8 haystack)\r\n{\r\n  FuzzyMatchRangeList result = {0};\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List needles = str8_split(scratch.arena, needle, (U8*)\" \", 1, 0);\r\n  result.needle_part_count = needles.node_count;\r\n  for(String8Node *needle_n = needles.first; needle_n != 0; needle_n = needle_n->next)\r\n  {\r\n    U64 find_pos = 0;\r\n    for(;find_pos < haystack.size;)\r\n    {\r\n      find_pos = str8_find_needle(haystack, find_pos, needle_n->string, StringMatchFlag_CaseInsensitive);\r\n      B32 is_in_gathered_ranges = 0;\r\n      for(FuzzyMatchRangeNode *n = result.first; n != 0; n = n->next)\r\n      {\r\n        if(n->range.min <= find_pos && find_pos < n->range.max)\r\n        {\r\n          is_in_gathered_ranges = 1;\r\n          find_pos = n->range.max;\r\n          break;\r\n        }\r\n      }\r\n      if(!is_in_gathered_ranges)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    if(find_pos < haystack.size)\r\n    {\r\n      Rng1U64 range = r1u64(find_pos, find_pos+needle_n->string.size);\r\n      FuzzyMatchRangeNode *n = push_array(arena, FuzzyMatchRangeNode, 1);\r\n      n->range = range;\r\n      SLLQueuePush(result.first, result.last, n);\r\n      result.count += 1;\r\n      result.total_dim += dim_1u64(range);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal FuzzyMatchRangeList\r\nfuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src)\r\n{\r\n  FuzzyMatchRangeList dst = {0};\r\n  for(FuzzyMatchRangeNode *src_n = src->first; src_n != 0; src_n = src_n->next)\r\n  {\r\n    FuzzyMatchRangeNode *dst_n = push_array(arena, FuzzyMatchRangeNode, 1);\r\n    SLLQueuePush(dst.first, dst.last, dst_n);\r\n    dst_n->range = src_n->range;\r\n  }\r\n  dst.count = src->count;\r\n  dst.needle_part_count = src->needle_part_count;\r\n  dst.total_dim = src->total_dim;\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Serialization Helpers\r\n\r\ninternal void\r\nstr8_serial_begin(Arena *arena, String8List *srl){\r\n  String8Node *node = push_array(arena, String8Node, 1);\r\n  node->string.str = push_array_no_zero(arena, U8, 0);\r\n  srl->first = srl->last = node;\r\n  srl->node_count = 1;\r\n  srl->total_size = 0;\r\n}\r\n\r\ninternal String8\r\nstr8_serial_end(Arena *arena, String8List *srl){\r\n  U64 size = srl->total_size;\r\n  U8 *out = push_array_no_zero(arena, U8, size);\r\n  str8_serial_write_to_dst(srl, out);\r\n  String8 result = str8(out, size);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nstr8_serial_write_to_dst(String8List *srl, void *out){\r\n  U8 *ptr = (U8*)out;\r\n  for (String8Node *node = srl->first;\r\n       node != 0;\r\n       node = node->next){\r\n    U64 size = node->string.size;\r\n    MemoryCopy(ptr, node->string.str, size);\r\n    ptr += size;\r\n  }\r\n}\r\n\r\ninternal U64\r\nstr8_serial_push_align(Arena *arena, String8List *srl, U64 align){\r\n  Assert(IsPow2(align));\r\n  \r\n  U64 pos = srl->total_size;\r\n  U64 new_pos = AlignPow2(pos, align);\r\n  U64 size = (new_pos - pos);\r\n  \r\n  if(size != 0)\r\n  {\r\n    U8 *buf = push_array(arena, U8, size);\r\n    \r\n    String8 *str = &srl->last->string;\r\n    if (str->str + str->size == buf){\r\n      srl->last->string.size += size;\r\n      srl->total_size += size;\r\n    }\r\n    else{\r\n      str8_list_push(arena, srl, str8(buf, size));\r\n    }\r\n  }\r\n  return size;\r\n}\r\n\r\ninternal void *\r\nstr8_serial_push_size(Arena *arena, String8List *srl, U64 size)\r\n{\r\n  void *result = 0;\r\n  if(size != 0)\r\n  {\r\n    U8 *buf = push_array_no_zero(arena, U8, size);\r\n    String8 *str = &srl->last->string;\r\n    if (str->str + str->size == buf){\r\n      srl->last->string.size += size;\r\n      srl->total_size += size;\r\n    }\r\n    else{\r\n      str8_list_push(arena, srl, str8(buf, size));\r\n    }\r\n    result = buf;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void *\r\nstr8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size){\r\n  void *result = str8_serial_push_size(arena, srl, size);\r\n  if(result != 0)\r\n  {\r\n    MemoryCopy(result, data, size);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first){\r\n  for (String8Node *node = first;\r\n       node != 0;\r\n       node = node->next){\r\n    str8_serial_push_data(arena, srl, node->string.str, node->string.size);\r\n  }\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u64(Arena *arena, String8List *srl, U64 x){\r\n  U8 *buf = push_array_no_zero(arena, U8, 8);\r\n  MemoryCopy(buf, &x, 8);\r\n  String8 *str = &srl->last->string;\r\n  if (str->str + str->size == buf){\r\n    srl->last->string.size += 8;\r\n    srl->total_size += 8;\r\n  }\r\n  else{\r\n    str8_list_push(arena, srl, str8(buf, 8));\r\n  }\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u32(Arena *arena, String8List *srl, U32 x){\r\n  U8 *buf = push_array_no_zero(arena, U8, 4);\r\n  MemoryCopy(buf, &x, 4);\r\n  String8 *str = &srl->last->string;\r\n  if (str->str + str->size == buf){\r\n    srl->last->string.size += 4;\r\n    srl->total_size += 4;\r\n  }\r\n  else{\r\n    str8_list_push(arena, srl, str8(buf, 4));\r\n  }\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u16(Arena *arena, String8List *srl, U16 x){\r\n  str8_serial_push_data(arena, srl, &x, sizeof(x));\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_u8(Arena *arena, String8List *srl, U8 x){\r\n  str8_serial_push_data(arena, srl, &x, sizeof(x));\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_cstr(Arena *arena, String8List *srl, String8 str){\r\n  str8_serial_push_data(arena, srl, str.str, str.size);\r\n  str8_serial_push_u8(arena, srl, 0);\r\n}\r\n\r\ninternal void\r\nstr8_serial_push_string(Arena *arena, String8List *srl, String8 str){\r\n  str8_serial_push_data(arena, srl, str.str, str.size);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Deserialization Helpers\r\n\r\ninternal U64\r\nstr8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity)\r\n{\r\n  U64 bytes_left = string.size-Min(off, string.size);\r\n  U64 actually_readable_size = Min(bytes_left, read_size);\r\n  U64 legally_readable_size = actually_readable_size - actually_readable_size%granularity;\r\n  if(legally_readable_size > 0)\r\n  {\r\n    MemoryCopy(read_dst, string.str+off, legally_readable_size);\r\n  }\r\n  return legally_readable_size;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_find_first_match(String8 string, U64 off, U16 scan_val)\r\n{\r\n  U64 cursor = off;\r\n  for (;;) {\r\n    U16 val = 0;\r\n    str8_deserial_read_struct(string, cursor, &val);\r\n    if (val == scan_val) {\r\n      break;\r\n    }\r\n    cursor += sizeof(val);\r\n  }\r\n  return cursor;\r\n}\r\n\r\ninternal void *\r\nstr8_deserial_get_raw_ptr(String8 string, U64 off, U64 size)\r\n{\r\n  void *raw_ptr = 0;\r\n  if (off + size <= string.size) {\r\n    raw_ptr = string.str + off;\r\n  }\r\n  return raw_ptr;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out)\r\n{\r\n  U64 cstr_size = 0;\r\n  if (off < string.size) {\r\n    U8 *ptr = string.str + off;\r\n    U8 *cap = string.str + string.size;\r\n    *cstr_out = str8_cstring_capped(ptr, cap);\r\n    cstr_size = (cstr_out->size + 1);\r\n  }\r\n  return cstr_size;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out)\r\n{\r\n  U64 null_off = str8_deserial_find_first_match(string, off, 0);\r\n  U64 size = null_off - off;\r\n  U16 *str = (U16 *)str8_deserial_get_raw_ptr(string, off, size);\r\n  U64 count = size / sizeof(*str);\r\n  *str_out = str16(str, count);\r\n  \r\n  U64 read_size_with_null = size + sizeof(*str);\r\n  return read_size_with_null;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out)\r\n{\r\n  Rng1U64 range = rng_1u64(off, off + size);\r\n  *block_out = str8_substr(string, range);\r\n  return block_out->size;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out)\r\n{\r\n  U64 value  = 0;\r\n  U64 shift  = 0;\r\n  U64 cursor = off;\r\n  for(;;)\r\n  {\r\n    U8  byte       = 0;\r\n    U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);\r\n\r\n    if(bytes_read != sizeof(byte))\r\n    {\r\n      break;\r\n    }\r\n\r\n    U8 val = byte & 0x7fu;\r\n    value |= ((U64)val) << shift;\r\n\r\n    cursor += bytes_read;\r\n    shift += 7u;\r\n\r\n    if((byte & 0x80u) == 0)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  if(value_out != 0)\r\n  {\r\n    *value_out = value;\r\n  }\r\n  U64 bytes_read = cursor - off;\r\n  return bytes_read;\r\n}\r\n\r\ninternal U64\r\nstr8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out)\r\n{\r\n  U64 value  = 0;\r\n  U64 shift  = 0;\r\n  U64 cursor = off;\r\n  for(;;)\r\n  {\r\n    U8 byte;\r\n    U64 bytes_read = str8_deserial_read_struct(string, cursor, &byte);\r\n    if(bytes_read != sizeof(byte))\r\n    {\r\n      break;\r\n    }\r\n\r\n    U8 val = byte & 0x7fu;\r\n    value |= ((U64)val) << shift;\r\n\r\n    cursor += bytes_read;\r\n    shift += 7u;\r\n\r\n    if((byte & 0x80u) == 0)\r\n    {\r\n      if(shift < sizeof(value) * 8 && (byte & 0x40u) != 0)\r\n      {\r\n        value |= -(S64)(1ull << shift);\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  if(value_out != 0)\r\n  {\r\n    *value_out = value;\r\n  }\r\n  U64 bytes_read = cursor - off;\r\n  return bytes_read;\r\n}\r\n\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_strings.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_STRINGS_H\r\n#define BASE_STRINGS_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Third Party Includes\r\n\r\n#define STB_SPRINTF_DECORATE(name) raddbg_##name\r\n#include \"third_party/stb/stb_sprintf.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: String Types\r\n\r\ntypedef struct String8 String8;\r\nstruct String8\r\n{\r\n  U8 *str;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct String16 String16;\r\nstruct String16\r\n{\r\n  U16 *str;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct String32 String32;\r\nstruct String32\r\n{\r\n  U32 *str;\r\n  U64 size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String List & Array Types\r\n\r\ntypedef struct String8Node String8Node;\r\nstruct String8Node\r\n{\r\n  String8Node *next;\r\n  String8 string;\r\n};\r\n\r\ntypedef struct String8MetaNode String8MetaNode;\r\nstruct String8MetaNode\r\n{\r\n  String8MetaNode *next;\r\n  String8Node *node;\r\n};\r\n\r\ntypedef struct String8List String8List;\r\nstruct String8List\r\n{\r\n  String8Node *first;\r\n  String8Node *last;\r\n  U64 node_count;\r\n  U64 total_size;\r\n};\r\n\r\ntypedef struct String8Array String8Array;\r\nstruct String8Array\r\n{\r\n  String8 *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Matching, Splitting, & Joining Types\r\n\r\ntypedef U32 StringMatchFlags;\r\nenum\r\n{\r\n  StringMatchFlag_CaseInsensitive  = (1 << 0),\r\n  StringMatchFlag_RightSideSloppy  = (1 << 1),\r\n  StringMatchFlag_SlashInsensitive = (1 << 2),\r\n};\r\n\r\ntypedef U32 StringSplitFlags;\r\nenum\r\n{\r\n  StringSplitFlag_KeepEmpties = (1 << 0),\r\n};\r\n\r\ntypedef enum PathStyle\r\n{\r\n  PathStyle_Null,\r\n  PathStyle_Relative,\r\n  PathStyle_WindowsAbsolute,\r\n  PathStyle_UnixAbsolute,\r\n  \r\n#if OS_WINDOWS\r\n  PathStyle_SystemAbsolute = PathStyle_WindowsAbsolute\r\n#elif OS_LINUX\r\n  PathStyle_SystemAbsolute = PathStyle_UnixAbsolute\r\n#else\r\n# error \"absolute path style is undefined for this OS\"\r\n#endif\r\n}\r\nPathStyle;\r\n\r\ntypedef struct StringJoin StringJoin;\r\nstruct StringJoin\r\n{\r\n  String8 pre;\r\n  String8 sep;\r\n  String8 post;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Pair Types\r\n\r\ntypedef struct String8TxtPtPair String8TxtPtPair;\r\nstruct String8TxtPtPair\r\n{\r\n  String8 string;\r\n  TxtPt pt;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: UTF Decoding Types\r\n\r\ntypedef struct UnicodeDecode UnicodeDecode;\r\nstruct UnicodeDecode\r\n{\r\n  U32 inc;\r\n  U32 codepoint;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: String Fuzzy Matching Types\r\n\r\ntypedef struct FuzzyMatchRangeNode FuzzyMatchRangeNode;\r\nstruct FuzzyMatchRangeNode\r\n{\r\n  FuzzyMatchRangeNode *next;\r\n  Rng1U64 range;\r\n};\r\n\r\ntypedef struct FuzzyMatchRangeList FuzzyMatchRangeList;\r\nstruct FuzzyMatchRangeList\r\n{\r\n  FuzzyMatchRangeNode *first;\r\n  FuzzyMatchRangeNode *last;\r\n  U64 count;\r\n  U64 needle_part_count;\r\n  U64 total_dim;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Character Classification & Conversion Functions\r\n\r\ninternal B32 char_is_space(U8 c);\r\ninternal B32 char_is_upper(U8 c);\r\ninternal B32 char_is_lower(U8 c);\r\ninternal B32 char_is_alpha(U8 c);\r\ninternal B32 char_is_slash(U8 c);\r\ninternal B32 char_is_digit(U8 c, U32 base);\r\ninternal U8 char_to_lower(U8 c);\r\ninternal U8 char_to_upper(U8 c);\r\ninternal U8 char_to_correct_slash(U8 c);\r\n\r\n////////////////////////////////\r\n//~ rjf: C-String Measurement\r\n\r\ninternal U64 cstring8_length(U8 *c);\r\ninternal U64 cstring16_length(U16 *c);\r\ninternal U64 cstring32_length(U32 *c);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Constructors\r\n\r\n#define str8_lit(S)  str8((U8*)(S), sizeof(S) - 1)\r\n#define str8_lit_comp(S) {(U8*)(S), sizeof(S) - 1,}\r\n#define str8_varg(S) (int)((S).size), ((S).str)\r\n\r\n#define str8_array(S,C) str8((U8*)(S), sizeof(*(S))*(C))\r\n#define str8_array_fixed(S) str8((U8*)(S), sizeof(S))\r\n#define str8_struct(S) str8((U8*)(S), sizeof(*(S)))\r\n\r\ninternal String8  str8(U8 *str, U64 size);\r\ninternal String8  str8_range(U8 *first, U8 *one_past_last);\r\ninternal String8  str8_zero(void);\r\ninternal String16 str16(U16 *str, U64 size);\r\ninternal String16 str16_range(U16 *first, U16 *one_past_last);\r\ninternal String16 str16_zero(void);\r\ninternal String32 str32(U32 *str, U64 size);\r\ninternal String32 str32_range(U32 *first, U32 *one_past_last);\r\ninternal String32 str32_zero(void);\r\ninternal String8  str8_cstring(char *c);\r\ninternal String16 str16_cstring(U16 *c);\r\ninternal String32 str32_cstring(U32 *c);\r\ninternal String8  str8_cstring_capped(void *cstr, void *cap);\r\ninternal String16 str16_cstring_capped(void *cstr, void *cap);\r\ninternal String8  str8_cstring_capped_reverse(void *raw_start, void *raw_cap);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Stylization\r\n\r\ninternal String8 upper_from_str8(Arena *arena, String8 string);\r\ninternal String8 lower_from_str8(Arena *arena, String8 string);\r\ninternal String8 backslashed_from_str8(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Matching\r\n\r\ninternal B32 str8_match(String8 a, String8 b, StringMatchFlags flags);\r\ninternal U64 str8_find_needle(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags);\r\ninternal U64 str8_find_needle_reverse(String8 string, U64 start_pos, String8 needle, StringMatchFlags flags);\r\ninternal B32 str8_ends_with(String8 string, String8 end, StringMatchFlags flags);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Slicing\r\n\r\ninternal String8 str8_substr(String8 str, Rng1U64 range);\r\ninternal String8 str8_prefix(String8 str, U64 size);\r\ninternal String8 str8_skip(String8 str, U64 amt);\r\ninternal String8 str8_postfix(String8 str, U64 size);\r\ninternal String8 str8_chop(String8 str, U64 amt);\r\ninternal String8 str8_skip_chop_whitespace(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Formatting & Copying\r\n\r\ninternal String8 push_str8_cat(Arena *arena, String8 s1, String8 s2);\r\ninternal String8 push_str8_copy(Arena *arena, String8 s);\r\ninternal String8 push_str8fv(Arena *arena, char *fmt, va_list args);\r\ninternal String8 push_str8f(Arena *arena, char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Integer Conversions\r\n\r\n//- rjf: string -> integer\r\ninternal S64 sign_from_str8(String8 string, String8 *string_tail);\r\ninternal B32 str8_is_integer(String8 string, U32 radix);\r\n\r\ninternal U64 u64_from_str8(String8 string, U32 radix);\r\ninternal S64 s64_from_str8(String8 string, U32 radix);\r\ninternal U32 u32_from_str8(String8 string, U32 radix);\r\ninternal S32 s32_from_str8(String8 string, U32 radix);\r\ninternal B32 try_u64_from_str8_c_rules(String8 string, U64 *x);\r\ninternal B32 try_s64_from_str8_c_rules(String8 string, S64 *x);\r\n\r\n//- rjf: integer -> string\r\ninternal String8 str8_from_memory_size(Arena *arena, U64 size);\r\ninternal String8 str8_from_count(Arena *arena, U64 count);\r\ninternal String8 str8_from_bits_u32(Arena *arena, U32 x);\r\ninternal String8 str8_from_bits_u64(Arena *arena, U64 x);\r\ninternal String8 str8_from_u64(Arena *arena, U64 u64, U32 radix, U8 min_digits, U8 digit_group_separator);\r\ninternal String8 str8_from_s64(Arena *arena, S64 s64, U32 radix, U8 min_digits, U8 digit_group_separator);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <=> Float Conversions\r\n\r\ninternal F64 f64_from_str8(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String List Construction Functions\r\n\r\ninternal String8Node* str8_list_push_node(String8List *list, String8Node *node);\r\ninternal String8Node* str8_list_push_node_set_string(String8List *list, String8Node *node, String8 string);\r\ninternal String8Node* str8_list_push_node_front(String8List *list, String8Node *node);\r\ninternal String8Node* str8_list_push_node_front_set_string(String8List *list, String8Node *node, String8 string);\r\ninternal String8Node* str8_list_push(Arena *arena, String8List *list, String8 string);\r\ninternal String8Node* str8_list_push_front(Arena *arena, String8List *list, String8 string);\r\ninternal void         str8_list_concat_in_place(String8List *list, String8List *to_push);\r\ninternal String8Node* str8_list_push_aligner(Arena *arena, String8List *list, U64 min, U64 align);\r\ninternal String8Node* str8_list_pushf(Arena *arena, String8List *list, char *fmt, ...);\r\ninternal String8Node* str8_list_push_frontf(Arena *arena, String8List *list, char *fmt, ...);\r\ninternal String8List  str8_list_copy(Arena *arena, String8List *list);\r\n#define str8_list_first(list) ((list)->first ? (list)->first->string : str8_zero())\r\n\r\n////////////////////////////////\r\n//~ rjf: String Splitting & Joining\r\n\r\ninternal String8List  str8_split(Arena *arena, String8 string, U8 *split_chars, U64 split_char_count, StringSplitFlags flags);\r\ninternal String8List  str8_split_by_string_chars(Arena *arena, String8 string, String8 split_chars, StringSplitFlags flags);\r\ninternal String8List  str8_list_split_by_string_chars(Arena *arena, String8List list, String8 split_chars, StringSplitFlags flags);\r\ninternal String8      str8_list_join(Arena *arena, String8List *list, StringJoin *optional_params);\r\ninternal void         str8_list_from_flags(Arena *arena, String8List *list, U32 flags, String8 *flag_string_table, U32 flag_string_count);\r\n\r\n////////////////////////////////\r\n//~ rjf; String Arrays\r\n\r\ninternal String8Array str8_array_from_list(Arena *arena, String8List *list);\r\ninternal String8Array str8_array_reserve(Arena *arena, U64 count);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Path Helpers\r\n\r\ninternal String8 str8_chop_last_slash(String8 string);\r\ninternal String8 str8_skip_last_slash(String8 string);\r\ninternal String8 str8_chop_last_dot(String8 string);\r\ninternal String8 str8_skip_last_dot(String8 string);\r\n\r\ninternal PathStyle   path_style_from_str8(String8 string);\r\ninternal String8List str8_split_path(Arena *arena, String8 string);\r\ninternal void        str8_path_list_resolve_dots_in_place(String8List *path, PathStyle style);\r\ninternal String8     str8_path_list_join_by_style(Arena *arena, String8List *path, PathStyle style);\r\n\r\ninternal String8TxtPtPair str8_txt_pt_pair_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: UTF-8 & UTF-16 Decoding/Encoding\r\n\r\ninternal UnicodeDecode utf8_decode(U8 *str, U64 max);\r\ninternal UnicodeDecode utf16_decode(U16 *str, U64 max);\r\ninternal U32 utf8_encode(U8 *str, U32 codepoint);\r\ninternal U32 utf16_encode(U16 *str, U32 codepoint);\r\ninternal U32 utf8_from_utf32_single(U8 *buffer, U32 character);\r\n\r\n////////////////////////////////\r\n//~ rjf: Unicode String Conversions\r\n\r\ninternal String8 str8_from_16(Arena *arena, String16 in);\r\ninternal String16 str16_from_8(Arena *arena, String8 in);\r\ninternal String8 str8_from_32(Arena *arena, String32 in);\r\ninternal String32 str32_from_8(Arena *arena, String8 in);\r\n\r\n////////////////////////////////\r\n//~ String -> Enum Conversions\r\n\r\ninternal OperatingSystem operating_system_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Types & Space Enum -> String Conversions\r\n\r\ninternal String8 string_from_dimension(Dimension dimension);\r\ninternal String8 string_from_side(Side side);\r\ninternal String8 string_from_operating_system(OperatingSystem os);\r\ninternal String8 string_from_arch(Arch arch);\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Types -> String\r\n\r\ninternal String8 string_from_week_day(WeekDay week_day);\r\ninternal String8 string_from_month(Month month);\r\ninternal String8 push_date_time_string(Arena *arena, DateTime *date_time);\r\ninternal String8 push_file_name_date_time_string(Arena *arena, DateTime *date_time);\r\ninternal String8 string_from_elapsed_time(Arena *arena, DateTime dt);\r\n\r\n////////////////////////////////\r\n//~ Globally Unique Ids\r\n\r\ninternal String8 string_from_guid(Arena *arena, Guid guid);\r\ninternal B32     try_guid_from_string(String8 string, Guid *guid_out);\r\ninternal Guid    guid_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Text Indentation\r\n\r\ninternal String8 indented_from_string(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Escaping\r\n\r\ninternal String8 escaped_from_raw_str8(Arena *arena, String8 string);\r\ninternal String8 raw_from_escaped_str8(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Wrapping\r\n\r\ninternal String8List wrapped_lines_from_string(Arena *arena, String8 string, U64 first_line_max_width, U64 max_width, U64 wrap_indent);\r\n\r\n////////////////////////////////\r\n//~ rjf: String <-> Color\r\n\r\ninternal String8 hex_string_from_rgba_4f32(Arena *arena, Vec4F32 rgba);\r\ninternal Vec4F32 rgba_from_hex_string_4f32(String8 hex_string);\r\n\r\n////////////////////////////////\r\n//~ rjf: String Fuzzy Matching\r\n\r\ninternal FuzzyMatchRangeList fuzzy_match_find(Arena *arena, String8 needle, String8 haystack);\r\ninternal FuzzyMatchRangeList fuzzy_match_range_list_copy(Arena *arena, FuzzyMatchRangeList *src);\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Serialization Helpers\r\n\r\ninternal void    str8_serial_begin(Arena *arena, String8List *srl);\r\ninternal String8 str8_serial_end(Arena *arena, String8List *srl);\r\ninternal void    str8_serial_write_to_dst(String8List *srl, void *out);\r\ninternal U64     str8_serial_push_align(Arena *arena, String8List *srl, U64 align);\r\ninternal void *  str8_serial_push_size(Arena *arena, String8List *srl, U64 size);\r\ninternal void *  str8_serial_push_data(Arena *arena, String8List *srl, void *data, U64 size);\r\ninternal void    str8_serial_push_data_list(Arena *arena, String8List *srl, String8Node *first);\r\ninternal void    str8_serial_push_u64(Arena *arena, String8List *srl, U64 x);\r\ninternal void    str8_serial_push_u32(Arena *arena, String8List *srl, U32 x);\r\ninternal void    str8_serial_push_u16(Arena *arena, String8List *srl, U16 x);\r\ninternal void    str8_serial_push_u8(Arena *arena, String8List *srl, U8 x);\r\ninternal void    str8_serial_push_cstr(Arena *arena, String8List *srl, String8 str);\r\ninternal void    str8_serial_push_string(Arena *arena, String8List *srl, String8 str);\r\n#define str8_serial_push_array(arena, srl, ptr, count) str8_serial_push_data(arena, srl, ptr, sizeof(*(ptr)) * (count))\r\n#define str8_serial_push_struct(arena, srl, ptr) str8_serial_push_array(arena, srl, ptr, 1)\r\n\r\n////////////////////////////////\r\n//~ rjf: Deserialization Helpers\r\n\r\ninternal U64    str8_deserial_read(String8 string, U64 off, void *read_dst, U64 read_size, U64 granularity);\r\ninternal U64    str8_deserial_find_first_match(String8 string, U64 off, U16 scan_val);\r\ninternal void * str8_deserial_get_raw_ptr(String8 string, U64 off, U64 size);\r\ninternal U64    str8_deserial_read_cstr(String8 string, U64 off, String8 *cstr_out);\r\ninternal U64    str8_deserial_read_windows_utf16_string16(String8 string, U64 off, String16 *str_out);\r\ninternal U64    str8_deserial_read_block(String8 string, U64 off, U64 size, String8 *block_out);\r\ninternal U64    str8_deserial_read_uleb128(String8 string, U64 off, U64 *value_out);\r\ninternal U64    str8_deserial_read_sleb128(String8 string, U64 off, S64 *value_out);\r\n#define str8_deserial_read_array(string, off, ptr, count) str8_deserial_read((string), (off), (ptr), sizeof(*(ptr))*(count), sizeof(*(ptr)))\r\n#define str8_deserial_read_struct(string, off, ptr)       str8_deserial_read_array(string, off, ptr, 1)\r\n\r\n#endif // BASE_STRINGS_H\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_thread_context.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Thread Context Functions\r\n\r\nC_LINKAGE thread_static TCTX* tctx_thread_local;\r\n#if !BUILD_SUPPLEMENTARY_UNIT\r\nC_LINKAGE thread_static TCTX* tctx_thread_local = 0;\r\n#endif\r\n\r\ninternal void\r\ntctx_init_and_equip(TCTX *tctx){\r\n  MemoryZeroStruct(tctx);\r\n  Arena **arena_ptr = tctx->arenas;\r\n  for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){\r\n    *arena_ptr = arena_alloc();\r\n  }\r\n  tctx_thread_local = tctx;\r\n}\r\n\r\ninternal void\r\ntctx_release(void)\r\n{\r\n  for(U64 i = 0; i < ArrayCount(tctx_thread_local->arenas); i += 1)\r\n  {\r\n    arena_release(tctx_thread_local->arenas[i]);\r\n  }\r\n}\r\n\r\ninternal TCTX*\r\ntctx_get_equipped(void){\r\n  return(tctx_thread_local);\r\n}\r\n\r\ninternal Arena*\r\ntctx_get_scratch(Arena **conflicts, U64 count){\r\n  TCTX *tctx = tctx_get_equipped();\r\n  \r\n  Arena *result = 0;\r\n  Arena **arena_ptr = tctx->arenas;\r\n  for (U64 i = 0; i < ArrayCount(tctx->arenas); i += 1, arena_ptr += 1){\r\n    Arena **conflict_ptr = conflicts;\r\n    B32 has_conflict = 0;\r\n    for (U64 j = 0; j < count; j += 1, conflict_ptr += 1){\r\n      if (*arena_ptr == *conflict_ptr){\r\n        has_conflict = 1;\r\n        break;\r\n      }\r\n    }\r\n    if (!has_conflict){\r\n      result = *arena_ptr;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\ninternal void\r\ntctx_set_thread_name(String8 string){\r\n  TCTX *tctx = tctx_get_equipped();\r\n  U64 size = ClampTop(string.size, sizeof(tctx->thread_name));\r\n  MemoryCopy(tctx->thread_name, string.str, size);\r\n  tctx->thread_name_size = size;\r\n}\r\n\r\ninternal String8\r\ntctx_get_thread_name(void){\r\n  TCTX *tctx = tctx_get_equipped();\r\n  String8 result = str8(tctx->thread_name, tctx->thread_name_size);\r\n  return(result);\r\n}\r\n\r\ninternal void\r\ntctx_write_srcloc(char *file_name, U64 line_number){\r\n  TCTX *tctx = tctx_get_equipped();\r\n  tctx->file_name = file_name;\r\n  tctx->line_number = line_number;\r\n}\r\n\r\ninternal void\r\ntctx_read_srcloc(char **file_name, U64 *line_number){\r\n  TCTX *tctx = tctx_get_equipped();\r\n  *file_name = tctx->file_name;\r\n  *line_number = tctx->line_number;\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_base/metagen_base_thread_context.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef BASE_THREAD_CONTEXT_H\r\n#define BASE_THREAD_CONTEXT_H\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Thread Context\r\n\r\ntypedef struct TCTX TCTX;\r\nstruct TCTX\r\n{\r\n  Arena *arenas[2];\r\n  \r\n  U8 thread_name[32];\r\n  U64 thread_name_size;\r\n  \r\n  char *file_name;\r\n  U64 line_number;\r\n};\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Thread Context Functions\r\n\r\ninternal void      tctx_init_and_equip(TCTX *tctx);\r\ninternal void      tctx_release(void);\r\ninternal TCTX*     tctx_get_equipped(void);\r\n\r\ninternal Arena*    tctx_get_scratch(Arena **conflicts, U64 countt);\r\n\r\ninternal void      tctx_set_thread_name(String8 name);\r\ninternal String8   tctx_get_thread_name(void);\r\n\r\ninternal void      tctx_write_srcloc(char *file_name, U64 line_number);\r\ninternal void      tctx_read_srcloc(char **file_name, U64 *line_number);\r\n#define tctx_write_this_srcloc() tctx_write_srcloc(__FILE__, __LINE__)\r\n\r\n#define scratch_begin(conflicts, count) temp_begin(tctx_get_scratch((conflicts), (count)))\r\n#define scratch_end(scratch) temp_end(scratch)\r\n\r\n#endif // BASE_THREAD_CONTEXT_H\r\n"
  },
  {
    "path": "src/metagen/metagen_main.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Build Options\r\n\r\n#define BUILD_CONSOLE_INTERFACE 1\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n//- rjf: headers\r\n#include \"metagen/metagen_base/metagen_base_inc.h\"\r\n#include \"metagen/metagen_os/metagen_os_inc.h\"\r\n#include \"mdesk/mdesk.h\"\r\n#include \"metagen.h\"\r\n\r\n//- rjf: impls\r\n#include \"metagen/metagen_base/metagen_base_inc.c\"\r\n#include \"metagen/metagen_os/metagen_os_inc.c\"\r\n#include \"mdesk/mdesk.c\"\r\n#include \"metagen.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Entry Point\r\n\r\ninternal void\r\nentry_point(CmdLine *cmdline)\r\n{\r\n  //////////////////////////////\r\n  //- rjf: set up state\r\n  //\r\n  MG_MsgList msgs = {0};\r\n  mg_arena = arena_alloc(.reserve_size = GB(64), .commit_size = MB(64));\r\n  mg_state = push_array(mg_arena, MG_State, 1);\r\n  mg_state->slots_count = 256;\r\n  mg_state->slots = push_array(mg_arena, MG_LayerSlot, mg_state->slots_count);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: extract paths\r\n  //\r\n  String8 build_dir_path   = os_get_process_info()->binary_path;\r\n  String8 project_dir_path = str8_chop_last_slash(build_dir_path);\r\n  String8 code_dir_path    = push_str8f(mg_arena, \"%S/src\", project_dir_path);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: search code directories for all files to consider\r\n  //\r\n  String8List file_paths = {0};\r\n  DeferLoop(printf(\"searching %.*s...\", str8_varg(code_dir_path)), printf(\" %i files found\\n\", (int)file_paths.node_count))\r\n  {\r\n    typedef struct Task Task;\r\n    struct Task\r\n    {\r\n      Task *next;\r\n      String8 path;\r\n    };\r\n    Task start_task = {0, code_dir_path};\r\n    Task *first_task = &start_task;\r\n    Task *last_task = &start_task;\r\n    for(Task *task = first_task; task != 0; task = task->next)\r\n    {\r\n      OS_FileIter *it = os_file_iter_begin(mg_arena, task->path, 0);\r\n      for(OS_FileInfo info = {0}; os_file_iter_next(mg_arena, it, &info);)\r\n      {\r\n        String8 file_path = push_str8f(mg_arena, \"%S/%S\", task->path, info.name);\r\n        if(info.props.flags & FilePropertyFlag_IsFolder)\r\n        {\r\n          Task *next_task = push_array(mg_arena, Task, 1);\r\n          SLLQueuePush(first_task, last_task, next_task);\r\n          next_task->path = file_path;\r\n        }\r\n        else\r\n        {\r\n          str8_list_push(mg_arena, &file_paths, file_path);\r\n        }\r\n      }\r\n      os_file_iter_end(it);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: parse all metadesk files\r\n  //\r\n  MG_FileParseList parses = {0};\r\n  DeferLoop(printf(\"parsing metadesk...\"), printf(\" %i metadesk files parsed\\n\", (int)parses.count))\r\n  {\r\n    for(String8Node *n = file_paths.first; n != 0; n = n->next)\r\n    {\r\n      String8 file_path = n->string;\r\n      String8 file_ext = str8_skip_last_dot(file_path);\r\n      if(str8_match(file_ext, str8_lit(\"mdesk\"), 0))\r\n      {\r\n        String8 data = os_data_from_file_path(mg_arena, file_path);\r\n        MD_TokenizeResult tokenize = md_tokenize_from_text(mg_arena, data);\r\n        MD_ParseResult parse = md_parse_from_text_tokens(mg_arena, file_path, data, tokenize.tokens);\r\n        for(MD_Msg *m = parse.msgs.first; m != 0; m = m->next)\r\n        {\r\n          TxtPt pt = mg_txt_pt_from_string_off(data, m->node->src_offset);\r\n          String8 msg_kind_string = {0};\r\n          switch(m->kind)\r\n          {\r\n            default:{}break;\r\n            case MD_MsgKind_Note:        {msg_kind_string = str8_lit(\"note\");}break;\r\n            case MD_MsgKind_Warning:     {msg_kind_string = str8_lit(\"warning\");}break;\r\n            case MD_MsgKind_Error:       {msg_kind_string = str8_lit(\"error\");}break;\r\n            case MD_MsgKind_FatalError:  {msg_kind_string = str8_lit(\"fatal error\");}break;\r\n          }\r\n          String8 location = push_str8f(mg_arena, \"%S:%I64d:%I64d\", file_path, pt.line, pt.column);\r\n          MG_Msg dst_m = {location, msg_kind_string, m->string};\r\n          mg_msg_list_push(mg_arena, &msgs, &dst_m);\r\n        }\r\n        MG_FileParseNode *parse_n = push_array(mg_arena, MG_FileParseNode, 1);\r\n        SLLQueuePush(parses.first, parses.last, parse_n);\r\n        parse_n->v.root = parse.root;\r\n        parses.count += 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather tables\r\n  //\r\n  MG_Map table_grid_map = mg_push_map(mg_arena, 1024);\r\n  MG_Map table_col_map = mg_push_map(mg_arena, 1024);\r\n  U64 table_count = 0;\r\n  DeferLoop(printf(\"gathering tables...\"), printf(\" %i tables found\\n\", (int)table_count))\r\n  {\r\n    for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n    {\r\n      MD_Node *file = n->v.root;\r\n      for MD_EachNode(node, file->first)\r\n      {\r\n        MD_Node *table_tag = md_tag_from_string(node, str8_lit(\"table\"), 0);\r\n        if(!md_node_is_nil(table_tag))\r\n        {\r\n          MG_NodeGrid *table = push_array(mg_arena, MG_NodeGrid, 1);\r\n          MG_ColumnDescArray *col_descs = push_array(mg_arena, MG_ColumnDescArray, 1);\r\n          *table = mg_node_grid_make_from_node(mg_arena, node);\r\n          *col_descs = mg_column_desc_array_from_tag(mg_arena, table_tag);\r\n          mg_map_insert_ptr(mg_arena, &table_grid_map, node->string, table);\r\n          mg_map_insert_ptr(mg_arena, &table_col_map, node->string, col_descs);\r\n          table_count += 1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather layer options\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    String8 layer_key = mg_layer_key_from_path(file->string);\r\n    MG_Layer *layer = mg_layer_from_key(layer_key);\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      if(md_node_has_tag(node, str8_lit(\"option\"), 0))\r\n      {\r\n        if(str8_match(node->string, str8_lit(\"library\"), 0))\r\n        {\r\n          layer->is_library = 1;\r\n        }\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"gen_folder\"), 0))\r\n      {\r\n        layer->gen_folder_name = node->string;\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"h_name\"), 0))\r\n      {\r\n        layer->h_name_override = node->string;\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"c_name\"), 0))\r\n      {\r\n        layer->c_name_override = node->string;\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"h_header\"), 0))\r\n      {\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(mg_arena, &layer->h_header, n->string);\r\n          str8_list_push(mg_arena, &layer->h_header, str8_lit(\"\\n\"));\r\n        }\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"h_footer\"), 0))\r\n      {\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(mg_arena, &layer->h_footer, n->string);\r\n          str8_list_push(mg_arena, &layer->h_footer, str8_lit(\"\\n\"));\r\n        }\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"c_header\"), 0))\r\n      {\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(mg_arena, &layer->c_header, n->string);\r\n          str8_list_push(mg_arena, &layer->c_header, str8_lit(\"\\n\"));\r\n        }\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"c_footer\"), 0))\r\n      {\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(mg_arena, &layer->c_footer, n->string);\r\n          str8_list_push(mg_arena, &layer->c_footer, str8_lit(\"\\n\"));\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate enums\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      MD_Node *tag = md_tag_from_string(node, str8_lit(\"enum\"), 0);\r\n      if(!md_node_is_nil(tag))\r\n      {\r\n        String8 enum_name = node->string;\r\n        String8 enum_member_prefix = enum_name;\r\n        if(str8_match(str8_postfix(enum_name, 5), str8_lit(\"Flags\"), 0))\r\n        {\r\n          enum_member_prefix = str8_chop(enum_name, 1);\r\n        }\r\n        String8 enum_base_type_name = tag->first->string;\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        if(enum_base_type_name.size == 0)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->enums, \"typedef enum %S\\n{\\n\", enum_name);\r\n        }\r\n        else\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->enums, \"typedef %S %S;\\n\", enum_base_type_name, enum_name);\r\n          str8_list_pushf(mg_arena, &layer->enums, \"typedef enum %SEnum\\n{\\n\", enum_name);\r\n        }\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->enums, \"%S_%S,\\n\", enum_member_prefix, n->string);\r\n        }\r\n        if(enum_base_type_name.size == 0)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->enums, \"} %S;\\n\\n\", enum_name);\r\n        }\r\n        else\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->enums, \"} %SEnum;\\n\\n\", enum_name);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate xlists\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      MD_Node *tag = md_tag_from_string(node, str8_lit(\"xlist\"), 0);\r\n      if(!md_node_is_nil(tag))\r\n      {\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        str8_list_pushf(mg_arena, &layer->enums, \"#define %S \\\\\\n\", node->string);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->enums, \"X(%S)\\\\\\n\", n->string);\r\n        }\r\n        str8_list_push(mg_arena, &layer->enums, str8_lit(\"\\n\"));\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate structs\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      if(md_node_has_tag(node, str8_lit(\"struct\"), 0))\r\n      {\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        str8_list_pushf(mg_arena, &layer->structs, \"typedef struct %S %S;\\n\", node->string, node->string);\r\n        str8_list_pushf(mg_arena, &layer->structs, \"struct %S\\n{\\n\", node->string);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->structs, \"%S;\\n\", n->string);\r\n        }\r\n        str8_list_pushf(mg_arena, &layer->structs, \"};\\n\\n\");\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate data tables\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      MD_Node *tag = md_tag_from_string(node, str8_lit(\"data\"), 0);\r\n      if(!md_node_is_nil(tag))\r\n      {\r\n        String8 element_type = tag->first->string;\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        if(!md_node_has_tag(node, str8_lit(\"c_file\"), 0))\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->h_tables, \"extern %S %S[%I64u];\\n\", element_type, node->string, gen_strings.node_count);\r\n        }\r\n        str8_list_pushf(mg_arena, &layer->c_tables, \"%S %S[%I64u] =\\n{\\n\", element_type, node->string, gen_strings.node_count);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->c_tables, \"%S,\\n\", n->string);\r\n        }\r\n        str8_list_push(mg_arena, &layer->c_tables, str8_lit(\"};\\n\\n\"));\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate enum -> string mapping functions\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      MD_Node *tag = md_tag_from_string(node, str8_lit(\"enum2string_switch\"), 0);\r\n      if(!md_node_is_nil(tag))\r\n      {\r\n        String8 enum_type = tag->first->string;\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        str8_list_pushf(mg_arena, &layer->h_functions, \"internal String8 %S(%S v);\\n\", node->string, enum_type);\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"internal String8\\n%S(%S v)\\n{\\n\", node->string, enum_type);\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"String8 result = str8_lit(\\\"<Unknown %S>\\\");\\n\", enum_type);\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"switch(v)\\n\");\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"{\\n\");\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"default:{}break;\\n\");\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_pushf(mg_arena, &layer->c_functions, \"%S;\\n\", n->string);\r\n        }\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"}\\n\");\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"return result;\\n\");\r\n        str8_list_pushf(mg_arena, &layer->c_functions, \"}\\n\\n\");\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate catch-all generations\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      MD_Node *tag = md_tag_from_string(node, str8_lit(\"gen\"), 0);\r\n      if(!md_node_is_nil(tag))\r\n      {\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        B32 prefer_c_file = md_node_has_tag(node, str8_lit(\"c_file\"), 0);\r\n        String8List *out = prefer_c_file ? &layer->c_catchall : &layer->h_catchall;\r\n        if(tag->first->string.size == 0){}\r\n        else if(str8_match(tag->first->string, str8_lit(\"enums\"), 0))     { out = &layer->enums; }\r\n        else if(str8_match(tag->first->string, str8_lit(\"structs\"), 0))   { out = &layer->structs; }\r\n        else if(str8_match(tag->first->string, str8_lit(\"functions\"), 0)) { out = prefer_c_file ? &layer->c_functions : &layer->h_functions; }\r\n        else if(str8_match(tag->first->string, str8_lit(\"tables\"), 0))    { out = prefer_c_file ? &layer->c_tables : &layer->h_tables; }\r\n        String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), node);\r\n        for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n        {\r\n          String8 trimmed = str8_skip_chop_whitespace(n->string);\r\n          str8_list_push(mg_arena, out, trimmed);\r\n          str8_list_push(mg_arena, out, str8_lit(\"\\n\"));\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: gather & generate all embeds\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      if(md_node_has_tag(node, str8_lit(\"embed_string\"), 0))\r\n      {\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8 embed_string = mg_c_string_literal_from_multiline_string(node->first->string);\r\n        str8_list_pushf(mg_arena, &layer->h_tables, \"read_only global String8 %S =\\nstr8_lit_comp(\\n\", node->string);\r\n        str8_list_push (mg_arena, &layer->h_tables, embed_string);\r\n        str8_list_pushf(mg_arena, &layer->h_tables, \");\\n\\n\");\r\n      }\r\n      if(md_node_has_tag(node, str8_lit(\"embed_file\"), 0))\r\n      {\r\n        String8 layer_key = mg_layer_key_from_path(file->string);\r\n        MG_Layer *layer = mg_layer_from_key(layer_key);\r\n        String8 data = os_data_from_file_path(mg_arena, node->first->string);\r\n        String8 embed_string = mg_c_array_literal_contents_from_data(data);\r\n        str8_list_pushf(mg_arena, &layer->h_tables, \"read_only global U8 %S__data[] =\\n{\\n\", node->string);\r\n        str8_list_push (mg_arena, &layer->h_tables, embed_string);\r\n        str8_list_pushf(mg_arena, &layer->h_tables, \"};\\n\\n\");\r\n        str8_list_pushf(mg_arena, &layer->h_tables, \"read_only global String8 %S = {%S__data, sizeof(%S__data)};\\n\",\r\n                        node->string,\r\n                        node->string,\r\n                        node->string);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: generate all markdown in build folder\r\n  //\r\n  for(MG_FileParseNode *n = parses.first; n != 0; n = n->next)\r\n  {\r\n    MD_Node *file = n->v.root;\r\n    for MD_EachNode(node, file->first)\r\n    {\r\n      //- rjf: generate markdown page\r\n      if(md_node_has_tag(node, str8_lit(\"markdown\"), 0))\r\n      {\r\n        String8List md_strs = {0};\r\n        for(MD_Node *piece = node->first; !md_node_is_nil(piece); piece = piece->next)\r\n        {\r\n          if(md_node_has_tag(piece, str8_lit(\"title\"), 0))\r\n          {\r\n            str8_list_pushf(mg_arena, &md_strs, \"# %S\\n\\n\", piece->string);\r\n          }\r\n          if(md_node_has_tag(piece, str8_lit(\"subtitle\"), 0))\r\n          {\r\n            str8_list_pushf(mg_arena, &md_strs, \"## %S\\n\\n\", piece->string);\r\n          }\r\n          if(md_node_has_tag(piece, str8_lit(\"p\"), 0))\r\n          {\r\n            String8 paragraph_text = piece->string;\r\n            String8List paragraph_lines = mg_wrapped_lines_from_string(mg_arena, paragraph_text, 80, 80, 0);\r\n            for(String8Node *n = paragraph_lines.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_push(mg_arena, &md_strs, n->string);\r\n              str8_list_push(mg_arena, &md_strs, str8_lit(\"\\n\"));\r\n            }\r\n            str8_list_push(mg_arena, &md_strs, str8_lit(\"\\n\"));\r\n          }\r\n          if(md_node_has_tag(piece, str8_lit(\"unordered_list\"), 0))\r\n          {\r\n            String8List gen_strings = mg_string_list_from_table_gen(mg_arena, table_grid_map, table_col_map, str8_lit(\"\"), piece);\r\n            for(String8Node *n = gen_strings.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_pushf(mg_arena, &md_strs, \" - \");\r\n              String8 item_text = n->string;\r\n              String8List item_lines = mg_wrapped_lines_from_string(mg_arena, item_text, 80-3, 80, 3);\r\n              for(String8Node *line_n = item_lines.first; line_n != 0; line_n = line_n->next)\r\n              {\r\n                str8_list_push(mg_arena, &md_strs, line_n->string);\r\n                str8_list_pushf(mg_arena, &md_strs, \"\\n\");\r\n              }\r\n            }\r\n            str8_list_pushf(mg_arena, &md_strs, \"\\n\");\r\n          }\r\n        }\r\n        String8 output_path = push_str8f(mg_arena, \"%S/%S.md\", build_dir_path, node->string);\r\n        FILE *file = fopen((char *)output_path.str, \"w\");\r\n        for(String8Node *n = md_strs.first; n != 0; n = n->next)\r\n        {\r\n          fwrite(n->string.str, n->string.size, 1, file);\r\n        }\r\n        fclose(file);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: write all layer output files\r\n  //\r\n  DeferLoop(printf(\"generating layer code...\"), printf(\"\\n\"))\r\n  {\r\n    for(U64 slot_idx = 0; slot_idx < mg_state->slots_count; slot_idx += 1)\r\n    {\r\n      MG_LayerSlot *slot = &mg_state->slots[slot_idx];\r\n      for(MG_LayerNode *n = slot->first; n != 0; n = n->next)\r\n      {\r\n        MG_Layer *layer = &n->v;\r\n        String8 layer_generated_folder = {0};\r\n        if(layer->gen_folder_name.size != 0)\r\n        {\r\n          String8 gen_folder = layer->gen_folder_name;\r\n          layer_generated_folder = push_str8f(mg_arena, \"%S/%S\", code_dir_path, gen_folder);\r\n        }\r\n        else\r\n        {\r\n          String8 gen_folder = str8_lit(\"generated\");\r\n          layer_generated_folder = push_str8f(mg_arena, \"%S/%S/%S\", code_dir_path, layer->key, gen_folder);\r\n        }\r\n        if(os_make_directory(layer_generated_folder))\r\n        {\r\n          String8List layer_key_parts = str8_split_path(mg_arena, layer->key);\r\n          StringJoin join = {0};\r\n          join.sep = str8_lit(\"_\");\r\n          String8 layer_key_filename = str8_list_join(mg_arena, &layer_key_parts, &join);\r\n          String8 layer_key_filename_upper = upper_from_str8(mg_arena, layer_key_filename);\r\n          String8 h_path = push_str8f(mg_arena, \"%S/%S.meta.h\", layer_generated_folder, layer_key_filename);\r\n          String8 c_path = push_str8f(mg_arena, \"%S/%S.meta.c\", layer_generated_folder, layer_key_filename);\r\n          if(layer->h_name_override.size != 0)\r\n          {\r\n            h_path = push_str8f(mg_arena, \"%S/%S\", layer_generated_folder, str8_skip_last_slash(layer->h_name_override));\r\n          }\r\n          if(layer->c_name_override.size != 0)\r\n          {\r\n            c_path = push_str8f(mg_arena, \"%S/%S\", layer_generated_folder, str8_skip_last_slash(layer->c_name_override));\r\n          }\r\n          {\r\n            FILE *h = fopen((char *)h_path.str, \"w\");\r\n            fprintf(h, \"// Copyright (c) Epic Games Tools\\n\");\r\n            fprintf(h, \"// Licensed under the MIT license (https://opensource.org/license/mit/)\\n\\n\");\r\n            if(layer->h_header.first == 0)\r\n            {\r\n              fprintf(h, \"//- GENERATED CODE\\n\\n\");\r\n              fprintf(h, \"#ifndef %.*s_META_H\\n\", str8_varg(layer_key_filename_upper));\r\n              fprintf(h, \"#define %.*s_META_H\\n\\n\", str8_varg(layer_key_filename_upper));\r\n            }\r\n            else for(String8Node *n = layer->h_header.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, h);\r\n            }\r\n            for(String8Node *n = layer->enums.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, h);\r\n            }\r\n            for(String8Node *n = layer->structs.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, h);\r\n            }\r\n            for(String8Node *n = layer->h_catchall.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, h);\r\n            }\r\n            for(String8Node *n = layer->h_functions.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, h);\r\n            }\r\n            if(layer->h_tables.first != 0)\r\n            {\r\n              if(!layer->is_library)\r\n              {\r\n                fprintf(h, \"C_LINKAGE_BEGIN\\n\");\r\n              }\r\n              for(String8Node *n = layer->h_tables.first; n != 0; n = n->next)\r\n              {\r\n                fwrite(n->string.str, n->string.size, 1, h);\r\n              }\r\n              fprintf(h, \"\\n\");\r\n              if(!layer->is_library)\r\n              {\r\n                fprintf(h, \"C_LINKAGE_END\\n\\n\");\r\n              }\r\n            }\r\n            if(layer->h_footer.first == 0)\r\n            {\r\n              fprintf(h, \"#endif // %.*s_META_H\\n\", str8_varg(layer_key_filename_upper));\r\n            }\r\n            else for(String8Node *n = layer->h_footer.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, h);\r\n            }\r\n            fclose(h);\r\n          }\r\n          {\r\n            FILE *c = fopen((char *)c_path.str, \"w\");\r\n            fprintf(c, \"// Copyright (c) Epic Games Tools\\n\");\r\n            fprintf(c, \"// Licensed under the MIT license (https://opensource.org/license/mit/)\\n\\n\");\r\n            if(layer->c_header.first == 0)\r\n            {\r\n              fprintf(c, \"//- GENERATED CODE\\n\\n\");\r\n            }\r\n            else for(String8Node *n = layer->c_header.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, c);\r\n            }\r\n            for(String8Node *n = layer->c_catchall.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, c);\r\n            }\r\n            if(layer->c_tables.first != 0)\r\n            {\r\n              if(!layer->is_library)\r\n              {\r\n                fprintf(c, \"C_LINKAGE_BEGIN\\n\");\r\n              }\r\n              for(String8Node *n = layer->c_tables.first; n != 0; n = n->next)\r\n              {\r\n                fwrite(n->string.str, n->string.size, 1, c);\r\n              }\r\n              if(!layer->is_library)\r\n              {\r\n                fprintf(c, \"C_LINKAGE_END\\n\\n\");\r\n              }\r\n            }\r\n            for(String8Node *n = layer->c_functions.first; n != 0; n = n->next)\r\n            {\r\n              fwrite(n->string.str, n->string.size, 1, c);\r\n            }\r\n            if(layer->c_footer.first != 0)\r\n            {\r\n              for(String8Node *n = layer->c_footer.first; n != 0; n = n->next)\r\n              {\r\n                fwrite(n->string.str, n->string.size, 1, c);\r\n              }\r\n            }\r\n            fclose(c);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: write out all messages to stderr\r\n  //\r\n  for(MG_MsgNode *n = msgs.first; n != 0; n = n->next)\r\n  {\r\n    MG_Msg *msg = &n->v;\r\n    fprintf(stderr, \"%.*s: %.*s: %.*s\\n\", str8_varg(msg->location), str8_varg(msg->kind), str8_varg(msg->msg));\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_os/core/linux/metagen_os_core_linux.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DateTime\r\nos_lnx_date_time_from_tm(tm in, U32 msec)\r\n{\r\n  DateTime dt = {0};\r\n  dt.sec  = in.tm_sec;\r\n  dt.min  = in.tm_min;\r\n  dt.hour = in.tm_hour;\r\n  dt.day  = in.tm_mday-1;\r\n  dt.mon  = in.tm_mon;\r\n  dt.year = in.tm_year+1900;\r\n  dt.msec = msec;\r\n  return dt;\r\n}\r\n\r\ninternal tm\r\nos_lnx_tm_from_date_time(DateTime dt)\r\n{\r\n  tm result = {0};\r\n  result.tm_sec = dt.sec;\r\n  result.tm_min = dt.min;\r\n  result.tm_hour= dt.hour;\r\n  result.tm_mday= dt.day+1;\r\n  result.tm_mon = dt.mon;\r\n  result.tm_year= dt.year-1900;\r\n  return result;\r\n}\r\n\r\ninternal timespec\r\nos_lnx_timespec_from_date_time(DateTime dt)\r\n{\r\n  tm tm_val = os_lnx_tm_from_date_time(dt);\r\n  time_t seconds = timegm(&tm_val);\r\n  timespec result = {0};\r\n  result.tv_sec = seconds;\r\n  return result;\r\n}\r\n\r\ninternal DenseTime\r\nos_lnx_dense_time_from_timespec(timespec in)\r\n{\r\n  DenseTime result = 0;\r\n  {\r\n    struct tm tm_time = {0};\r\n    gmtime_r(&in.tv_sec, &tm_time);\r\n    DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1));\r\n    result = dense_time_from_date_time(date_time);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal FileProperties\r\nos_lnx_file_properties_from_stat(struct stat *s)\r\n{\r\n  FileProperties props = {0};\r\n  props.size     = s->st_size;\r\n  props.created  = os_lnx_dense_time_from_timespec(s->st_ctim);\r\n  props.modified = os_lnx_dense_time_from_timespec(s->st_mtim);\r\n  if(s->st_mode & S_IFDIR)\r\n  {\r\n    props.flags |= FilePropertyFlag_IsFolder;\r\n  }\r\n  return props;\r\n}\r\n\r\ninternal void\r\nos_lnx_safe_call_sig_handler(int x)\r\n{\r\n  OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain;\r\n  if(chain != 0 && chain->fail_handler != 0)\r\n  {\r\n    chain->fail_handler(chain->ptr);\r\n  }\r\n  abort();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entities\r\n\r\ninternal OS_LNX_Entity *\r\nos_lnx_entity_alloc(OS_LNX_EntityKind kind)\r\n{\r\n  OS_LNX_Entity *entity = 0;\r\n  DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex),\r\n            pthread_mutex_unlock(&os_lnx_state.entity_mutex))\r\n  {\r\n    entity = os_lnx_state.entity_free;\r\n    if(entity)\r\n    {\r\n      SLLStackPop(os_lnx_state.entity_free);\r\n    }\r\n    else\r\n    {\r\n      entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1);\r\n    }\r\n  }\r\n  MemoryZeroStruct(entity);\r\n  entity->kind = kind;\r\n  return entity;\r\n}\r\n\r\ninternal void\r\nos_lnx_entity_release(OS_LNX_Entity *entity)\r\n{\r\n  DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex),\r\n            pthread_mutex_unlock(&os_lnx_state.entity_mutex))\r\n  {\r\n    SLLStackPush(os_lnx_state.entity_free, entity);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal void *\r\nos_lnx_thread_entry_point(void *ptr)\r\n{\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr;\r\n  OS_ThreadFunctionType *func = entity->thread.func;\r\n  void *thread_ptr = entity->thread.ptr;\r\n  TCTX tctx_;\r\n  tctx_init_and_equip(&tctx_);\r\n  func(thread_ptr);\r\n  tctx_release();\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System/Process Info (Implemented Per-OS)\r\n\r\ninternal OS_SystemInfo *\r\nos_get_system_info(void)\r\n{\r\n  return &os_lnx_state.system_info;\r\n}\r\n\r\ninternal OS_ProcessInfo *\r\nos_get_process_info(void)\r\n{\r\n  return &os_lnx_state.process_info;\r\n}\r\n\r\ninternal String8\r\nos_get_current_path(Arena *arena)\r\n{\r\n  char *cwdir = getcwd(0, 0);\r\n  String8 string = push_str8_copy(arena, str8_cstring(cwdir));\r\n  free(cwdir);\r\n  return string;\r\n}\r\n\r\ninternal U32\r\nos_get_process_start_time_unix(void)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  U64 start_time = 0;\r\n  pid_t pid = getpid();\r\n  String8 path = push_str8f(scratch.arena, \"/proc/%u\", pid);\r\n  struct stat st;\r\n  int err = stat((char*)path.str, &st);\r\n  if(err == 0)\r\n  {\r\n    start_time = st.st_mtime;\r\n  }\r\n  scratch_end(scratch);\r\n  return (U32)start_time;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\n//- rjf: basic\r\n\r\ninternal void *\r\nos_reserve(U64 size)\r\n{\r\n  void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);\r\n  if(result == MAP_FAILED)\r\n  {\r\n    result = 0;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit(void *ptr, U64 size)\r\n{\r\n  mprotect(ptr, size, PROT_READ|PROT_WRITE);\r\n  return 1;\r\n}\r\n\r\ninternal void\r\nos_decommit(void *ptr, U64 size)\r\n{\r\n  madvise(ptr, size, MADV_DONTNEED);\r\n  mprotect(ptr, size, PROT_NONE);\r\n}\r\n\r\ninternal void\r\nos_release(void *ptr, U64 size)\r\n{\r\n  munmap(ptr, size);\r\n}\r\n\r\n//- rjf: large pages\r\n\r\ninternal void *\r\nos_reserve_large(U64 size)\r\n{\r\n  void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);\r\n  if(result == MAP_FAILED)\r\n  {\r\n    result = 0;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit_large(void *ptr, U64 size)\r\n{\r\n  mprotect(ptr, size, PROT_READ|PROT_WRITE);\r\n  return 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Thread Info (Implemented Per-OS)\r\n\r\ninternal U32\r\nos_tid(void)\r\n{\r\n  U32 result = gettid();\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_set_thread_name(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  pthread_t current_thread = pthread_self();\r\n  pthread_setname_np(current_thread, (char *)name_copy.str);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Aborting (Implemented Per-OS)\r\n\r\ninternal void\r\nos_abort(S32 exit_code)\r\n{\r\n  exit(exit_code);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\n\r\ninternal OS_Handle\r\nos_file_open(OS_AccessFlags flags, String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  int lnx_flags = 0;\r\n  if(flags & OS_AccessFlag_Read && flags & OS_AccessFlag_Write)\r\n  {\r\n    lnx_flags = O_RDWR;\r\n  }\r\n  else if(flags & OS_AccessFlag_Write)\r\n  {\r\n    lnx_flags = O_WRONLY;\r\n  }\r\n  else if(flags & OS_AccessFlag_Read)\r\n  {\r\n    lnx_flags = O_RDONLY;\r\n  }\r\n  if(flags & OS_AccessFlag_Append)\r\n  {\r\n    lnx_flags |= O_APPEND;\r\n  }\r\n  if(flags & (OS_AccessFlag_Write|OS_AccessFlag_Append))\r\n  {\r\n    lnx_flags |= O_CREAT;\r\n  }\r\n  int fd = open((char *)path_copy.str, lnx_flags, 0755);\r\n  OS_Handle handle = {0};\r\n  if(fd != -1)\r\n  {\r\n    handle.u64[0] = fd;\r\n  }\r\n  scratch_end(scratch);\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_file_close(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return; }\r\n  int fd = (int)file.u64[0];\r\n  close(fd);\r\n}\r\n\r\ninternal U64\r\nos_file_read(OS_Handle file, Rng1U64 rng, void *out_data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  int fd = (int)file.u64[0];\r\n  U64 total_num_bytes_to_read = dim_1u64(rng);\r\n  U64 total_num_bytes_read = 0;\r\n  U64 total_num_bytes_left_to_read = total_num_bytes_to_read;\r\n  for(;total_num_bytes_left_to_read > 0;)\r\n  {\r\n    int read_result = pread(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read, rng.min + total_num_bytes_read);\r\n    if(read_result >= 0)\r\n    {\r\n      total_num_bytes_read += read_result;\r\n      total_num_bytes_left_to_read -= read_result;\r\n    }\r\n    else if(errno != EINTR)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return total_num_bytes_read;\r\n}\r\n\r\ninternal U64\r\nos_file_write(OS_Handle file, Rng1U64 rng, void *data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  int fd = (int)file.u64[0];\r\n  U64 total_num_bytes_to_write = dim_1u64(rng);\r\n  U64 total_num_bytes_written = 0;\r\n  U64 total_num_bytes_left_to_write = total_num_bytes_to_write;\r\n  for(;total_num_bytes_left_to_write > 0;)\r\n  {\r\n    int write_result = pwrite(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write, rng.min + total_num_bytes_written);\r\n    if(write_result >= 0)\r\n    {\r\n      total_num_bytes_written += write_result;\r\n      total_num_bytes_left_to_write -= write_result;\r\n    }\r\n    else if(errno != EINTR)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return total_num_bytes_written;\r\n}\r\n\r\ninternal B32\r\nos_file_set_times(OS_Handle file, DateTime date_time)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  int fd = (int)file.u64[0];\r\n  timespec time = os_lnx_timespec_from_date_time(date_time);\r\n  timespec times[2] = {time, time};\r\n  int futimens_result = futimens(fd, times);\r\n  B32 good = (futimens_result != -1);\r\n  return good;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return (FileProperties){0}; }\r\n  int fd = (int)file.u64[0];\r\n  struct stat fd_stat = {0};\r\n  int fstat_result = fstat(fd, &fd_stat);\r\n  FileProperties props = {0};\r\n  if(fstat_result != -1)\r\n  {\r\n    props = os_lnx_file_properties_from_stat(&fd_stat);\r\n  }\r\n  return props;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return (OS_FileID){0}; }\r\n  int fd = (int)file.u64[0];\r\n  struct stat fd_stat = {0};\r\n  int fstat_result = fstat(fd, &fd_stat);\r\n  OS_FileID id = {0};\r\n  if(fstat_result != -1)\r\n  {\r\n    id.v[0] = fd_stat.st_dev;\r\n    id.v[1] = fd_stat.st_ino;\r\n  }\r\n  return id;\r\n}\r\n\r\ninternal B32\r\nos_delete_file_at_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = 0;\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  if(remove((char*)path_copy.str) != -1)\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_copy_file_path(String8 dst, String8 src)\r\n{\r\n  B32 result = 0;\r\n  OS_Handle src_h = os_file_open(OS_AccessFlag_Read, src);\r\n  OS_Handle dst_h = os_file_open(OS_AccessFlag_Write, dst);\r\n  if(!os_handle_match(src_h, os_handle_zero()) &&\r\n     !os_handle_match(dst_h, os_handle_zero()))\r\n  {\r\n    int src_fd = (int)src_h.u64[0];\r\n    int dst_fd = (int)dst_h.u64[0];\r\n    FileProperties src_props = os_properties_from_file(src_h);\r\n    U64 size = src_props.size;\r\n    U64 total_bytes_copied = 0;\r\n    U64 bytes_left_to_copy = size;\r\n    for(;bytes_left_to_copy > 0;)\r\n    {\r\n      off_t sendfile_off = total_bytes_copied;\r\n      int send_result = sendfile(dst_fd, src_fd, &sendfile_off, bytes_left_to_copy);\r\n      if(send_result <= 0)\r\n      {\r\n        break;\r\n      }\r\n      U64 bytes_copied = (U64)send_result;\r\n      bytes_left_to_copy -= bytes_copied;\r\n      total_bytes_copied += bytes_copied;\r\n    }\r\n  }\r\n  os_file_close(src_h);\r\n  os_file_close(dst_h);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_move_file_path(String8 dst, String8 src)\r\n{\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\ninternal String8\r\nos_full_path_from_path(Arena *arena, String8 path)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  char buffer[PATH_MAX] = {0};\r\n  realpath((char *)path_copy.str, buffer);\r\n  String8 result = push_str8_copy(arena, str8_cstring(buffer));\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_file_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  int access_result = access((char *)path_copy.str, F_OK);\r\n  B32 result = 0;\r\n  if(access_result == 0)\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_folder_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32      exists    = 0;\r\n  String8  path_copy = push_str8_copy(scratch.arena, path);\r\n  DIR     *handle    = opendir((char*)path_copy.str);\r\n  if(handle)\r\n  {\r\n    closedir(handle);\r\n    exists = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return exists;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  struct stat f_stat = {0};\r\n  int stat_result = stat((char *)path_copy.str, &f_stat);\r\n  FileProperties props = {0};\r\n  if(stat_result != -1)\r\n  {\r\n    props = os_lnx_file_properties_from_stat(&f_stat);\r\n  }\r\n  scratch_end(scratch);\r\n  return props;\r\n}\r\n\r\n//- rjf: file maps\r\n\r\ninternal OS_Handle\r\nos_file_map_open(OS_AccessFlags flags, OS_Handle file)\r\n{\r\n  OS_Handle map = file;\r\n  return map;\r\n}\r\n\r\ninternal void\r\nos_file_map_close(OS_Handle map)\r\n{\r\n  // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in\r\n  // the linux implementation (on Windows they require separate handles)\r\n}\r\n\r\ninternal void *\r\nos_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range)\r\n{\r\n  if(os_handle_match(map, os_handle_zero())) { return 0; }\r\n  int fd = (int)map.u64[0];\r\n  int prot_flags = 0;\r\n  if(flags & OS_AccessFlag_Write) { prot_flags |= PROT_WRITE; }\r\n  if(flags & OS_AccessFlag_Read)  { prot_flags |= PROT_READ; }\r\n  int map_flags = MAP_PRIVATE;\r\n  void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min);\r\n  if(base == MAP_FAILED)\r\n  {\r\n    base = 0;\r\n  }\r\n  return base;\r\n}\r\n\r\ninternal void\r\nos_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range)\r\n{\r\n  munmap(ptr, dim_1u64(range));\r\n}\r\n\r\n//- rjf: directory iteration\r\n\r\ninternal OS_FileIter *\r\nos_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags)\r\n{\r\n  OS_FileIter *base_iter = push_array(arena, OS_FileIter, 1);\r\n  base_iter->flags = flags;\r\n  OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory;\r\n  {\r\n    String8 path_copy = push_str8_copy(arena, path);\r\n    iter->dir = opendir((char *)path_copy.str);\r\n    iter->path = path_copy;\r\n  }\r\n  return base_iter;\r\n}\r\n\r\ninternal B32\r\nos_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)\r\n{\r\n  B32 good = 0;\r\n  OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory;\r\n  for(;;)\r\n  {\r\n    // rjf: get next entry\r\n    lnx_iter->dp = readdir(lnx_iter->dir);\r\n    good = (lnx_iter->dp != 0);\r\n    \r\n    // rjf: unpack entry info\r\n    struct stat st = {0};\r\n    int stat_result = 0;\r\n    if(good)\r\n    {\r\n      Temp scratch = scratch_begin(&arena, 1);\r\n      String8 full_path = push_str8f(scratch.arena, \"%S/%s\", lnx_iter->path, lnx_iter->dp->d_name);\r\n      stat_result = stat((char *)full_path.str, &st);\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    // rjf: determine if filtered\r\n    B32 filtered = 0;\r\n    if(good)\r\n    {\r\n      filtered = ((st.st_mode == S_IFDIR && iter->flags & OS_FileIterFlag_SkipFolders) ||\r\n                  (st.st_mode == S_IFREG && iter->flags & OS_FileIterFlag_SkipFiles) ||\r\n                  (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) ||\r\n                  (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0));\r\n    }\r\n    \r\n    // rjf: output & exit, if good & unfiltered\r\n    if(good && !filtered)\r\n    {\r\n      info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name));\r\n      if(stat_result != -1)\r\n      {\r\n        info_out->props = os_lnx_file_properties_from_stat(&st);\r\n      }\r\n      break;\r\n    }\r\n    \r\n    // rjf: exit if not good\r\n    if(!good)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal void\r\nos_file_iter_end(OS_FileIter *iter)\r\n{\r\n  OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory;\r\n  closedir(lnx_iter->dir);\r\n}\r\n\r\n//- rjf: directory creation\r\n\r\ninternal B32\r\nos_make_directory(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = 0;\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  if(mkdir((char*)path_copy.str, 0755) != -1)\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_shared_memory_alloc(U64 size, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  int id = shm_open((char *)name_copy.str, O_RDWR, 0);\r\n  ftruncate(id, size);\r\n  OS_Handle result = {(U64)id};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_shared_memory_open(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  int id = shm_open((char *)name_copy.str, O_RDWR, 0);\r\n  OS_Handle result = {(U64)id};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_close(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())){return;}\r\n  int id = (int)handle.u64[0];\r\n  close(id);\r\n}\r\n\r\ninternal void *\r\nos_shared_memory_view_open(OS_Handle handle, Rng1U64 range)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())){return 0;}\r\n  int id = (int)handle.u64[0];\r\n  void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min);\r\n  if(base == MAP_FAILED)\r\n  {\r\n    base = 0;\r\n  }\r\n  return base;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())){return;}\r\n  munmap(ptr, dim_1u64(range));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U64\r\nos_now_microseconds(void)\r\n{\r\n  struct timespec t;\r\n  clock_gettime(CLOCK_MONOTONIC, &t);\r\n  U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1));\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nos_now_unix(void)\r\n{\r\n  time_t t = time(0);\r\n  return (U32)t;\r\n}\r\n\r\ninternal DateTime\r\nos_now_universal_time(void)\r\n{\r\n  time_t t = 0;\r\n  time(&t);\r\n  struct tm universal_tm = {0};\r\n  gmtime_r(&t, &universal_tm);\r\n  DateTime result = os_lnx_date_time_from_tm(universal_tm, 0);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_universal_time_from_local(DateTime *date_time)\r\n{\r\n  // rjf: local DateTime -> universal time_t\r\n  tm local_tm = os_lnx_tm_from_date_time(*date_time);\r\n  local_tm.tm_isdst = -1;\r\n  time_t universal_t = mktime(&local_tm);\r\n  \r\n  // rjf: universal time_t -> DateTime\r\n  tm universal_tm = {0};\r\n  gmtime_r(&universal_t, &universal_tm);\r\n  DateTime result = os_lnx_date_time_from_tm(universal_tm, 0);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_local_time_from_universal(DateTime *date_time)\r\n{\r\n  // rjf: universal DateTime -> local time_t\r\n  tm universal_tm = os_lnx_tm_from_date_time(*date_time);\r\n  universal_tm.tm_isdst = -1;\r\n  time_t universal_t = timegm(&universal_tm);\r\n  tm local_tm = {0};\r\n  localtime_r(&universal_t, &local_tm);\r\n  \r\n  // rjf: local tm -> DateTime\r\n  DateTime result = os_lnx_date_time_from_tm(local_tm, 0);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_sleep_milliseconds(U32 msec)\r\n{\r\n  usleep(msec*Thousand(1));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_process_launch(OS_ProcessLaunchParams *params)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal B32\r\nos_process_join(OS_Handle handle, U64 endt_us)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\nos_process_detach(OS_Handle handle)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread);\r\n  entity->thread.func = func;\r\n  entity->thread.ptr = ptr;\r\n  {\r\n    int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity);\r\n    if(pthread_result == -1)\r\n    {\r\n      os_lnx_entity_release(entity);\r\n      entity = 0;\r\n    }\r\n  }\r\n  OS_Handle handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nos_thread_join(OS_Handle handle, U64 endt_us)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) { return 0; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0];\r\n  int join_result = pthread_join(entity->thread.handle, 0);\r\n  B32 result = (join_result == 0);\r\n  os_lnx_entity_release(entity);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_thread_detach(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0];\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n//- rjf: mutexes\r\n\r\ninternal OS_Handle\r\nos_mutex_alloc(void)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex);\r\n  pthread_mutexattr_t attr;\r\n  pthread_mutexattr_init(&attr);\r\n  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\r\n  int init_result = pthread_mutex_init(&entity->mutex_handle, &attr);\r\n  pthread_mutexattr_destroy(&attr);\r\n  if(init_result == -1)\r\n  {\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  OS_Handle handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_mutex_release(OS_Handle mutex)\r\n{\r\n  if(os_handle_match(mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  pthread_mutex_destroy(&entity->mutex_handle);\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_mutex_take(OS_Handle mutex)\r\n{\r\n  if(os_handle_match(mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  pthread_mutex_lock(&entity->mutex_handle);\r\n}\r\n\r\ninternal void\r\nos_mutex_drop(OS_Handle mutex)\r\n{\r\n  if(os_handle_match(mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  pthread_mutex_unlock(&entity->mutex_handle);\r\n}\r\n\r\n//- rjf: reader/writer mutexes\r\n\r\ninternal OS_Handle\r\nos_rw_mutex_alloc(void)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex);\r\n  int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0);\r\n  if(init_result == -1)\r\n  {\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  OS_Handle handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_release(OS_Handle rw_mutex)\r\n{\r\n  if(os_handle_match(rw_mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_destroy(&entity->rwmutex_handle);\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take_r(OS_Handle rw_mutex)\r\n{\r\n  if(os_handle_match(rw_mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_rdlock(&entity->rwmutex_handle);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop_r(OS_Handle rw_mutex)\r\n{\r\n  if(os_handle_match(rw_mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_unlock(&entity->rwmutex_handle);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take_w(OS_Handle rw_mutex)\r\n{\r\n  if(os_handle_match(rw_mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_wrlock(&entity->rwmutex_handle);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop_w(OS_Handle rw_mutex)\r\n{\r\n  if(os_handle_match(rw_mutex, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_unlock(&entity->rwmutex_handle);\r\n}\r\n\r\n//- rjf: condition variables\r\n\r\ninternal OS_Handle\r\nos_condition_variable_alloc(void)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable);\r\n  int init_result = pthread_cond_init(&entity->cv.cond_handle, 0);\r\n  if(init_result == -1)\r\n  {\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  int init2_result = 0;\r\n  if(entity)\r\n  {\r\n    init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0);\r\n  }\r\n  if(init2_result == -1)\r\n  {\r\n    pthread_cond_destroy(&entity->cv.cond_handle);\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  OS_Handle handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_condition_variable_release(OS_Handle cv)\r\n{\r\n  if(os_handle_match(cv, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0];\r\n  pthread_cond_destroy(&entity->cv.cond_handle);\r\n  pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle);\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us)\r\n{\r\n  if(os_handle_match(cv, os_handle_zero())) { return 0; }\r\n  if(os_handle_match(mutex, os_handle_zero())) { return 0; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  struct timespec endt_timespec;\r\n  endt_timespec.tv_sec = endt_us/Million(1);\r\n  endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));\r\n  int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec);\r\n  B32 result = (wait_result != ETIMEDOUT);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us)\r\n{\r\n  // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack\r\n  // this together, but this would probably just be a lot better if we just\r\n  // implemented the primitives ourselves with e.g. futexes\r\n  //\r\n  if(os_handle_match(cv, os_handle_zero())) { return 0; }\r\n  if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0];\r\n  struct timespec endt_timespec;\r\n  endt_timespec.tv_sec = endt_us/Million(1);\r\n  endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));\r\n  B32 result = 0;\r\n  for(;;)\r\n  {\r\n    pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle);\r\n    int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec);\r\n    if(wait_result != ETIMEDOUT)\r\n    {\r\n      pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle);\r\n      pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle);\r\n      result = 1;\r\n      break;\r\n    }\r\n    pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle);\r\n    if(wait_result == ETIMEDOUT)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us)\r\n{\r\n  // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack\r\n  // this together, but this would probably just be a lot better if we just\r\n  // implemented the primitives ourselves with e.g. futexes\r\n  //\r\n  if(os_handle_match(cv, os_handle_zero())) { return 0; }\r\n  if(os_handle_match(mutex_rw, os_handle_zero())) { return 0; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0];\r\n  struct timespec endt_timespec;\r\n  endt_timespec.tv_sec = endt_us/Million(1);\r\n  endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));\r\n  B32 result = 0;\r\n  for(;;)\r\n  {\r\n    pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle);\r\n    int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec);\r\n    if(wait_result != ETIMEDOUT)\r\n    {\r\n      pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle);\r\n      pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle);\r\n      result = 1;\r\n      break;\r\n    }\r\n    pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle);\r\n    if(wait_result == ETIMEDOUT)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_condition_variable_signal(OS_Handle cv)\r\n{\r\n  if(os_handle_match(cv, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  pthread_cond_signal(&cv_entity->cv.cond_handle);\r\n}\r\n\r\ninternal void\r\nos_condition_variable_broadcast(OS_Handle cv)\r\n{\r\n  if(os_handle_match(cv, os_handle_zero())) { return; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  pthread_cond_broadcast(&cv_entity->cv.cond_handle);\r\n}\r\n\r\n//- rjf: cross-process semaphores\r\n\r\ninternal OS_Handle\r\nos_semaphore_alloc(U32 initial_count, U32 max_count, String8 name)\r\n{\r\n  OS_Handle result = {0};\r\n  if (name.size > 0) {\r\n    // TODO: we need to allocate shared memory to store sem_t\r\n    NotImplemented;\r\n  } else {\r\n    sem_t *s = mmap(0, sizeof(*s), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);\r\n    AssertAlways(s != MAP_FAILED);\r\n    int err = sem_init(s, 0, initial_count);\r\n    if (err == 0) {\r\n      result.u64[0] = (U64)s;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_release(OS_Handle semaphore)\r\n{\r\n  int err = munmap((void*)semaphore.u64[0], sizeof(sem_t));\r\n  AssertAlways(err == 0);\r\n}\r\n\r\ninternal OS_Handle\r\nos_semaphore_open(String8 name)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\nos_semaphore_close(OS_Handle semaphore)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal B32\r\nos_semaphore_take(OS_Handle semaphore, U64 endt_us)\r\n{\r\n  AssertAlways(endt_us == max_U64);\r\n  for (;;) {\r\n    int err = sem_wait((sem_t*)semaphore.u64[0]);\r\n    if (err == 0) {\r\n      break;\r\n    } else {\r\n      if (errno == EAGAIN) {\r\n        continue;\r\n      }\r\n    }\r\n    InvalidPath;\r\n    break;\r\n  }\r\n  return 1;\r\n}\r\n\r\ninternal void\r\nos_semaphore_drop(OS_Handle semaphore)\r\n{\r\n  for (;;) {\r\n    int err = sem_post((sem_t*)semaphore.u64[0]);\r\n    if (err == 0) {\r\n      break;\r\n    } else {\r\n      if (errno == EAGAIN) {\r\n        continue;\r\n      }\r\n    }\r\n    InvalidPath;\r\n    break;\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_library_open(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str;\r\n  void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL);\r\n  OS_Handle lib = { (U64)so };\r\n  scratch_end(scratch);\r\n  return lib;\r\n}\r\n\r\ninternal VoidProc*\r\nos_library_load_proc(OS_Handle lib, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  void *so = (void *)lib.u64;\r\n  char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str;\r\n  VoidProc *proc = (VoidProc *)dlsym(so, name_cstr);\r\n  scratch_end(scratch);\r\n  return proc;\r\n}\r\n\r\ninternal void\r\nos_library_close(OS_Handle lib)\r\n{\r\n  void *so = (void *)lib.u64;\r\n  dlclose(so);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Safe Calls (Implemented Per-OS)\r\n\r\ninternal void\r\nos_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr)\r\n{\r\n  // rjf: push handler to chain\r\n  OS_LNX_SafeCallChain chain = {0};\r\n  SLLStackPush(os_lnx_safe_call_chain, &chain);\r\n  chain.fail_handler = fail_handler;\r\n  chain.ptr = ptr;\r\n  \r\n  // rjf: set up sig handler info\r\n  struct sigaction new_act = {0};\r\n  new_act.sa_handler = os_lnx_safe_call_sig_handler;\r\n  int signals_to_handle[] =\r\n  {\r\n    SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP,\r\n  };\r\n  struct sigaction og_act[ArrayCount(signals_to_handle)] = {0};\r\n  \r\n  // rjf: attach handler info for all signals\r\n  for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1)\r\n  {\r\n    sigaction(signals_to_handle[i], &new_act, &og_act[i]);\r\n  }\r\n  \r\n  // rjf: call function\r\n  func(ptr);\r\n  \r\n  // rjf: reset handler info for all signals\r\n  for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1)\r\n  {\r\n    sigaction(signals_to_handle[i], &og_act[i], 0);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks GUIDs (Implemented Per-OS)\r\n\r\ninternal Guid\r\nos_make_guid(void)\r\n{\r\n  Guid guid = {0};\r\n  getrandom(guid.v, sizeof(guid.v), 0);\r\n  guid.data3 &= 0x0fff;\r\n  guid.data3 |= (4 << 12);\r\n  guid.data4[0] &= 0x3f;\r\n  guid.data4[0] |= 0x80;\r\n  return guid;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Entry Points (Implemented Per-OS)\r\n\r\nint\r\nmain(int argc, char **argv)\r\n{\r\n  //- rjf: set up OS layer\r\n  {\r\n    //- rjf: get statically-allocated system/process info\r\n    {\r\n      OS_SystemInfo *info = &os_lnx_state.system_info;\r\n      info->logical_processor_count = (U32)get_nprocs();\r\n      info->page_size               = (U64)getpagesize();\r\n      info->large_page_size         = MB(2);\r\n      info->allocation_granularity  = info->page_size;\r\n    }\r\n    {\r\n      OS_ProcessInfo *info = &os_lnx_state.process_info;\r\n      info->pid = (U32)getpid();\r\n    }\r\n    \r\n    //- rjf: set up thread context\r\n    local_persist TCTX tctx;\r\n    tctx_init_and_equip(&tctx);\r\n    \r\n    //- rjf: set up dynamically allocated state\r\n    os_lnx_state.arena = arena_alloc();\r\n    os_lnx_state.entity_arena = arena_alloc();\r\n    pthread_mutex_init(&os_lnx_state.entity_mutex, 0);\r\n    \r\n    //- rjf: grab dynamically allocated system info\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      OS_SystemInfo *info = &os_lnx_state.system_info;\r\n      \r\n      // rjf: get machine name\r\n      B32 got_final_result = 0;\r\n      U8 *buffer = 0;\r\n      int size = 0;\r\n      for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1)\r\n      {\r\n        scratch_end(scratch);\r\n        buffer = push_array_no_zero(scratch.arena, U8, cap);\r\n        size = gethostname((char*)buffer, cap);\r\n        if(size < cap)\r\n        {\r\n          got_final_result = 1;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: save name to info\r\n      if(got_final_result && size > 0)\r\n      {\r\n        info->machine_name.size = size;\r\n        info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1);\r\n        MemoryCopy(info->machine_name.str, buffer, info->machine_name.size);\r\n        info->machine_name.str[info->machine_name.size] = 0;\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    //- rjf: grab dynamically allocated process info\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      OS_ProcessInfo *info = &os_lnx_state.process_info;\r\n      \r\n      // rjf: grab binary path\r\n      {\r\n        // rjf: get self string\r\n        B32 got_final_result = 0;\r\n        U8 *buffer = 0;\r\n        int size = 0;\r\n        for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1)\r\n        {\r\n          scratch_end(scratch);\r\n          buffer = push_array_no_zero(scratch.arena, U8, cap);\r\n          size = readlink(\"/proc/self/exe\", (char*)buffer, cap);\r\n          if(size < cap)\r\n          {\r\n            got_final_result = 1;\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: save\r\n        if(got_final_result && size > 0)\r\n        {\r\n          String8 full_name = str8(buffer, size);\r\n          String8 name_chopped = str8_chop_last_slash(full_name);\r\n          info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped);\r\n        }\r\n      }\r\n      \r\n      // rjf: grab initial directory\r\n      {\r\n        info->initial_path = os_get_current_path(os_lnx_state.arena);\r\n      }\r\n      \r\n      // rjf: grab home directory\r\n      {\r\n        char *home = getenv(\"HOME\");\r\n        info->user_program_data_path = str8_cstring(home);\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n  \r\n  //- rjf: call into \"real\" entry point\r\n  main_thread_base_entry_point(argc, argv);\r\n}\r\n"
  },
  {
    "path": "src/metagen/metagen_os/core/linux/metagen_os_core_linux.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_CORE_LINUX_H\r\n#define OS_CORE_LINUX_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n#include <dirent.h>\r\n#include <dlfcn.h>\r\n#include <errno.h>\r\n#include <fcntl.h>\r\n#include <features.h>\r\n#include <linux/limits.h>\r\n#include <pthread.h>\r\n#include <semaphore.h>\r\n#include <signal.h>\r\n#include <stdlib.h>\r\n#include <sys/mman.h>\r\n#include <sys/random.h>\r\n#include <sys/sendfile.h>\r\n#include <sys/stat.h>\r\n#include <sys/syscall.h>\r\n#include <sys/sysinfo.h>\r\n#include <sys/types.h>\r\n#include <time.h>\r\n#include <unistd.h>\r\n\r\npid_t gettid(void);\r\nint pthread_setname_np(pthread_t thread, const char *name);\r\nint pthread_getname_np(pthread_t thread, char *name, size_t size);\r\n\r\ntypedef struct tm tm;\r\ntypedef struct timespec timespec;\r\n\r\n////////////////////////////////\r\n//~ rjf: File Iterator\r\n\r\ntypedef struct OS_LNX_FileIter OS_LNX_FileIter;\r\nstruct OS_LNX_FileIter\r\n{\r\n  DIR *dir;\r\n  struct dirent *dp;\r\n  String8 path;\r\n};\r\nStaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check);\r\n\r\n////////////////////////////////\r\n//~ rjf: Safe Call Handler Chain\r\n\r\ntypedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain;\r\nstruct OS_LNX_SafeCallChain\r\n{\r\n  OS_LNX_SafeCallChain *next;\r\n  OS_ThreadFunctionType *fail_handler;\r\n  void *ptr;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Entities\r\n\r\ntypedef enum OS_LNX_EntityKind\r\n{\r\n  OS_LNX_EntityKind_Thread,\r\n  OS_LNX_EntityKind_Mutex,\r\n  OS_LNX_EntityKind_RWMutex,\r\n  OS_LNX_EntityKind_ConditionVariable,\r\n}\r\nOS_LNX_EntityKind;\r\n\r\ntypedef struct OS_LNX_Entity OS_LNX_Entity;\r\nstruct OS_LNX_Entity\r\n{\r\n  OS_LNX_Entity *next;\r\n  OS_LNX_EntityKind kind;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      pthread_t handle;\r\n      OS_ThreadFunctionType *func;\r\n      void *ptr;\r\n    } thread;\r\n    pthread_mutex_t mutex_handle;\r\n    pthread_rwlock_t rwmutex_handle;\r\n    struct\r\n    {\r\n      pthread_cond_t cond_handle;\r\n      pthread_mutex_t rwlock_mutex_handle;\r\n    } cv;\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: State\r\n\r\ntypedef struct OS_LNX_State OS_LNX_State;\r\nstruct OS_LNX_State\r\n{\r\n  Arena *arena;\r\n  OS_SystemInfo system_info;\r\n  OS_ProcessInfo process_info;\r\n  pthread_mutex_t entity_mutex;\r\n  Arena *entity_arena;\r\n  OS_LNX_Entity *entity_free;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal OS_LNX_State os_lnx_state = {0};\r\nthread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DateTime os_lnx_date_time_from_tm(tm in, U32 msec);\r\ninternal tm os_lnx_tm_from_date_time(DateTime dt);\r\ninternal timespec os_lnx_timespec_from_date_time(DateTime dt);\r\ninternal DenseTime os_lnx_dense_time_from_timespec(timespec in);\r\ninternal FileProperties os_lnx_file_properties_from_stat(struct stat *s);\r\ninternal void os_lnx_safe_call_sig_handler(int x);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entities\r\n\r\ninternal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind);\r\ninternal void os_lnx_entity_release(OS_LNX_Entity *entity);\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal void *os_lnx_thread_entry_point(void *ptr);\r\n\r\n#endif // OS_CORE_LINUX_H\r\n"
  },
  {
    "path": "src/metagen/metagen_os/core/metagen_os_core.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type Functions (Helpers, Implemented Once)\r\n\r\ninternal OS_Handle\r\nos_handle_zero(void)\r\n{\r\n  OS_Handle handle = {0};\r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nos_handle_match(OS_Handle a, OS_Handle b)\r\n{\r\n  return a.u64[0] == b.u64[0];\r\n}\r\n\r\ninternal void\r\nos_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle)\r\n{\r\n  OS_HandleNode *n = push_array(arena, OS_HandleNode, 1);\r\n  n->v = handle;\r\n  SLLQueuePush(handles->first, handles->last, n);\r\n  handles->count += 1;\r\n}\r\n\r\ninternal OS_HandleArray\r\nos_handle_array_from_list(Arena *arena, OS_HandleList *list)\r\n{\r\n  OS_HandleArray result = {0};\r\n  result.count = list->count;\r\n  result.v = push_array_no_zero(arena, OS_Handle, result.count);\r\n  U64 idx = 0;\r\n  for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1)\r\n  {\r\n    result.v[idx] = n->v;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once)\r\n\r\ninternal String8List\r\nos_string_list_from_argcv(Arena *arena, int argc, char **argv)\r\n{\r\n  String8List result = {0};\r\n  for(int i = 0; i < argc; i += 1)\r\n  {\r\n    String8 str = str8_cstring(argv[i]);\r\n    str8_list_push(arena, &result, str);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Filesystem Helpers (Helpers, Implemented Once)\r\n\r\ninternal String8\r\nos_data_from_file_path(Arena *arena, String8 path)\r\n{\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);\r\n  FileProperties props = os_properties_from_file(file);\r\n  String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size));\r\n  os_file_close(file);\r\n  return data;\r\n}\r\n\r\ninternal B32\r\nos_write_data_to_file_path(String8 path, String8 data)\r\n{\r\n  B32 good = 0;\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Write, path);\r\n  if(!os_handle_match(file, os_handle_zero()))\r\n  {\r\n    good = 1;\r\n    os_file_write(file, r1u64(0, data.size), data.str);\r\n    os_file_close(file);\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal B32\r\nos_write_data_list_to_file_path(String8 path, String8List list)\r\n{\r\n  B32 good = 0;\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Write, path);\r\n  if(!os_handle_match(file, os_handle_zero()))\r\n  {\r\n    good = 1;\r\n    U64 off = 0;\r\n    for(String8Node *n = list.first; n != 0; n = n->next)\r\n    {\r\n      os_file_write(file, r1u64(off, off+n->string.size), n->string.str);\r\n      off += n->string.size;\r\n    }\r\n    os_file_close(file);\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal B32\r\nos_append_data_to_file_path(String8 path, String8 data)\r\n{\r\n  B32 good = 0;\r\n  if(data.size != 0)\r\n  {\r\n    OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path);\r\n    if(!os_handle_match(file, os_handle_zero()))\r\n    {\r\n      good = 1;\r\n      U64 pos = os_properties_from_file(file).size;\r\n      os_file_write(file, r1u64(pos, pos+data.size), data.str);\r\n      os_file_close(file);\r\n    }\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file_path(String8 path)\r\n{\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);\r\n  OS_FileID id = os_id_from_file(file);\r\n  os_file_close(file);\r\n  return id;\r\n}\r\n\r\ninternal S64\r\nos_file_id_compare(OS_FileID a, OS_FileID b)\r\n{\r\n  S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v));\r\n  return cmp;\r\n}\r\n\r\ninternal String8\r\nos_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range)\r\n{\r\n  U64 pre_pos = arena_pos(arena);\r\n  String8 result;\r\n  result.size = dim_1u64(range);\r\n  result.str = push_array_no_zero(arena, U8, result.size);\r\n  U64 actual_read_size = os_file_read(file, range, result.str);\r\n  if(actual_read_size < result.size)\r\n  {\r\n    arena_pop_to(arena, pre_pos + actual_read_size);\r\n    result.size = actual_read_size;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Launcher Helpers\r\n\r\ninternal OS_Handle\r\nos_cmd_line_launch(String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U8 split_chars[] = {' '};\r\n  String8List parts = str8_split(scratch.arena, string, split_chars, ArrayCount(split_chars), 0);\r\n  OS_Handle handle = {0};\r\n  if(parts.node_count != 0)\r\n  {\r\n    // rjf: unpack exe part\r\n    String8 exe = parts.first->string;\r\n    String8 exe_folder = str8_chop_last_slash(exe);\r\n    if(exe_folder.size == 0)\r\n    {\r\n      exe_folder = os_get_current_path(scratch.arena);\r\n    }\r\n    \r\n    // rjf: find stdout delimiter\r\n    String8Node *stdout_delimiter_n = 0;\r\n    for(String8Node *n = parts.first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->string, str8_lit(\">\"), 0))\r\n      {\r\n        stdout_delimiter_n = n;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: read stdout path\r\n    String8 stdout_path = {0};\r\n    if(stdout_delimiter_n && stdout_delimiter_n->next)\r\n    {\r\n      stdout_path = stdout_delimiter_n->next->string;\r\n    }\r\n    \r\n    // rjf: open stdout handle\r\n    OS_Handle stdout_handle = {0};\r\n    if(stdout_path.size != 0)\r\n    {\r\n      OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path);\r\n      os_file_close(file);\r\n      stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdout_path);\r\n    }\r\n    \r\n    // rjf: form command line\r\n    String8List cmdline = {0};\r\n    for(String8Node *n = parts.first; n != stdout_delimiter_n && n != 0; n = n->next)\r\n    {\r\n      str8_list_push(scratch.arena, &cmdline, n->string);\r\n    }\r\n    \r\n    // rjf: launch\r\n    OS_ProcessLaunchParams params = {0};\r\n    params.cmd_line = cmdline;\r\n    params.path = exe_folder;\r\n    params.inherit_env = 1;\r\n    params.stdout_file = stdout_handle;\r\n    handle = os_process_launch(&params);\r\n    \r\n    // rjf: close stdout handle\r\n    {\r\n      if(stdout_path.size != 0)\r\n      {\r\n        os_file_close(stdout_handle);\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return handle;\r\n}\r\n\r\ninternal OS_Handle\r\nos_cmd_line_launchf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  OS_Handle result = os_cmd_line_launch(string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n"
  },
  {
    "path": "src/metagen/metagen_os/core/metagen_os_core.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_CORE_H\r\n#define OS_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: System Info\r\n\r\ntypedef struct OS_SystemInfo OS_SystemInfo;\r\nstruct OS_SystemInfo\r\n{\r\n  U32 logical_processor_count;\r\n  U64 page_size;\r\n  U64 large_page_size;\r\n  U64 allocation_granularity;\r\n  String8 machine_name;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Info\r\n\r\ntypedef struct OS_ProcessInfo OS_ProcessInfo;\r\nstruct OS_ProcessInfo\r\n{\r\n  U32 pid;\r\n  B32 large_pages_allowed;\r\n  String8 binary_path;\r\n  String8 initial_path;\r\n  String8 user_program_data_path;\r\n  String8List module_load_paths;\r\n  String8List environment;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Access Flags\r\n\r\ntypedef U32 OS_AccessFlags;\r\nenum\r\n{\r\n  OS_AccessFlag_Read        = (1<<0),\r\n  OS_AccessFlag_Write       = (1<<1),\r\n  OS_AccessFlag_Execute     = (1<<2),\r\n  OS_AccessFlag_Append      = (1<<3),\r\n  OS_AccessFlag_ShareRead   = (1<<4),\r\n  OS_AccessFlag_ShareWrite  = (1<<5),\r\n  OS_AccessFlag_Inherited   = (1<<6),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Files\r\n\r\ntypedef U32 OS_FileIterFlags;\r\nenum\r\n{\r\n  OS_FileIterFlag_SkipFolders     = (1 << 0),\r\n  OS_FileIterFlag_SkipFiles       = (1 << 1),\r\n  OS_FileIterFlag_SkipHiddenFiles = (1 << 2),\r\n  OS_FileIterFlag_Done            = (1 << 31),\r\n};\r\n\r\ntypedef struct OS_FileIter OS_FileIter;\r\nstruct OS_FileIter\r\n{\r\n  OS_FileIterFlags flags;\r\n  U8 memory[800];\r\n};\r\n\r\ntypedef struct OS_FileInfo OS_FileInfo;\r\nstruct OS_FileInfo\r\n{\r\n  String8 name;\r\n  FileProperties props;\r\n};\r\n\r\n// nick: on-disk file identifier\r\ntypedef struct OS_FileID OS_FileID;\r\nstruct OS_FileID\r\n{\r\n  U64 v[3];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type\r\n\r\ntypedef struct OS_Handle OS_Handle;\r\nstruct OS_Handle\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct OS_HandleNode OS_HandleNode;\r\nstruct OS_HandleNode\r\n{\r\n  OS_HandleNode *next;\r\n  OS_Handle v;\r\n};\r\n\r\ntypedef struct OS_HandleList OS_HandleList;\r\nstruct OS_HandleList\r\n{\r\n  OS_HandleNode *first;\r\n  OS_HandleNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct OS_HandleArray OS_HandleArray;\r\nstruct OS_HandleArray\r\n{\r\n  OS_Handle *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Launch Parameters\r\n\r\ntypedef struct OS_ProcessLaunchParams OS_ProcessLaunchParams;\r\nstruct OS_ProcessLaunchParams\r\n{\r\n  String8List cmd_line;\r\n  String8 path;\r\n  String8List env;\r\n  B32 inherit_env;\r\n  B32 debug_subprocesses;\r\n  B32 consoleless;\r\n  OS_Handle stdout_file;\r\n  OS_Handle stderr_file;\r\n  OS_Handle stdin_file;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Types\r\n\r\ntypedef void OS_ThreadFunctionType(void *ptr);\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type Functions (Helpers, Implemented Once)\r\n\r\ninternal OS_Handle os_handle_zero(void);\r\ninternal B32 os_handle_match(OS_Handle a, OS_Handle b);\r\ninternal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle);\r\ninternal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Line Argc/Argv Helper (Helper, Implemented Once)\r\n\r\ninternal String8List os_string_list_from_argcv(Arena *arena, int argc, char **argv);\r\n\r\n////////////////////////////////\r\n//~ rjf: Filesystem Helpers (Helpers, Implemented Once)\r\n\r\ninternal String8        os_data_from_file_path(Arena *arena, String8 path);\r\ninternal B32            os_write_data_to_file_path(String8 path, String8 data);\r\ninternal B32            os_write_data_list_to_file_path(String8 path, String8List list);\r\ninternal B32            os_append_data_to_file_path(String8 path, String8 data);\r\ninternal OS_FileID      os_id_from_file_path(String8 path);\r\ninternal S64            os_file_id_compare(OS_FileID a, OS_FileID b);\r\ninternal String8        os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range);\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Launcher Helpers\r\n\r\ninternal OS_Handle os_cmd_line_launch(String8 string);\r\ninternal OS_Handle os_cmd_line_launchf(char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System/Process Info (Implemented Per-OS)\r\n\r\ninternal OS_SystemInfo  *os_get_system_info(void);\r\ninternal OS_ProcessInfo *os_get_process_info(void);\r\ninternal String8         os_get_current_path(Arena *arena);\r\ninternal U32             os_get_process_start_time_unix(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\n//- rjf: basic\r\ninternal void *os_reserve(U64 size);\r\ninternal B32   os_commit(void *ptr, U64 size);\r\ninternal void  os_decommit(void *ptr, U64 size);\r\ninternal void  os_release(void *ptr, U64 size);\r\n\r\n//- rjf: large pages\r\ninternal void *os_reserve_large(U64 size);\r\ninternal B32 os_commit_large(void *ptr, U64 size);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Thread Info (Implemented Per-OS)\r\n\r\ninternal U32 os_tid(void);\r\ninternal void os_set_thread_name(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Aborting (Implemented Per-OS)\r\n\r\ninternal void os_abort(S32 exit_code);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\ninternal OS_Handle      os_file_open(OS_AccessFlags flags, String8 path);\r\ninternal void           os_file_close(OS_Handle file);\r\ninternal U64            os_file_read(OS_Handle file, Rng1U64 rng, void *out_data);\r\n#define os_file_read_struct(f, off, ptr) os_file_read((f), r1u64((off), (off)+sizeof(*(ptr))), (ptr))\r\ninternal U64            os_file_write(OS_Handle file, Rng1U64 rng, void *data);\r\ninternal B32            os_file_set_times(OS_Handle file, DateTime time);\r\ninternal FileProperties os_properties_from_file(OS_Handle file);\r\ninternal OS_FileID      os_id_from_file(OS_Handle file);\r\ninternal B32            os_file_reserve_size(OS_Handle file, U64 size);\r\ninternal B32            os_delete_file_at_path(String8 path);\r\ninternal B32            os_copy_file_path(String8 dst, String8 src);\r\ninternal B32            os_move_file_path(String8 dst, String8 src);\r\ninternal String8        os_full_path_from_path(Arena *arena, String8 path);\r\ninternal B32            os_file_path_exists(String8 path);\r\ninternal B32            os_folder_path_exists(String8 path);\r\ninternal FileProperties os_properties_from_file_path(String8 path);\r\n\r\n//- rjf: file maps\r\ninternal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file);\r\ninternal void      os_file_map_close(OS_Handle map);\r\ninternal void *    os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range);\r\ninternal void      os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range);\r\n\r\n//- rjf: directory iteration\r\ninternal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags);\r\ninternal B32          os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out);\r\ninternal void         os_file_iter_end(OS_FileIter *iter);\r\n\r\n//- rjf: directory creation\r\ninternal B32 os_make_directory(String8 path);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_shared_memory_alloc(U64 size, String8 name);\r\ninternal OS_Handle os_shared_memory_open(String8 name);\r\ninternal void      os_shared_memory_close(OS_Handle handle);\r\ninternal void *    os_shared_memory_view_open(OS_Handle handle, Rng1U64 range);\r\ninternal void      os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U64         os_now_microseconds(void);\r\ninternal U32         os_now_unix(void);\r\ninternal DateTime    os_now_universal_time(void);\r\ninternal DateTime    os_universal_time_from_local(DateTime *local_time);\r\ninternal DateTime    os_local_time_from_universal(DateTime *universal_time);\r\ninternal void        os_sleep_milliseconds(U32 msec);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_process_launch(OS_ProcessLaunchParams *params);\r\ninternal B32       os_process_join(OS_Handle handle, U64 endt_us);\r\ninternal void      os_process_detach(OS_Handle handle);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params);\r\ninternal B32       os_thread_join(OS_Handle handle, U64 endt_us);\r\ninternal void      os_thread_detach(OS_Handle handle);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n//- rjf: recursive mutexes\r\ninternal OS_Handle os_mutex_alloc(void);\r\ninternal void      os_mutex_release(OS_Handle mutex);\r\ninternal void      os_mutex_take(OS_Handle mutex);\r\ninternal void      os_mutex_drop(OS_Handle mutex);\r\n\r\n//- rjf: reader/writer mutexes\r\ninternal OS_Handle os_rw_mutex_alloc(void);\r\ninternal void      os_rw_mutex_release(OS_Handle rw_mutex);\r\ninternal void      os_rw_mutex_take_r(OS_Handle mutex);\r\ninternal void      os_rw_mutex_drop_r(OS_Handle mutex);\r\ninternal void      os_rw_mutex_take_w(OS_Handle mutex);\r\ninternal void      os_rw_mutex_drop_w(OS_Handle mutex);\r\n\r\n//- rjf: condition variables\r\ninternal OS_Handle os_condition_variable_alloc(void);\r\ninternal void      os_condition_variable_release(OS_Handle cv);\r\n// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout\r\ninternal B32       os_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us);\r\ninternal B32       os_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us);\r\ninternal B32       os_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us);\r\ninternal void      os_condition_variable_signal(OS_Handle cv);\r\ninternal void      os_condition_variable_broadcast(OS_Handle cv);\r\n\r\n//- rjf: cross-process semaphores\r\ninternal OS_Handle os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name);\r\ninternal void      os_semaphore_release(OS_Handle semaphore);\r\ninternal OS_Handle os_semaphore_open(String8 name);\r\ninternal void      os_semaphore_close(OS_Handle semaphore);\r\ninternal B32       os_semaphore_take(OS_Handle semaphore, U64 endt_us);\r\ninternal void      os_semaphore_drop(OS_Handle semaphore);\r\n\r\n//- rjf: scope macros\r\n#define OS_MutexScope(mutex) DeferLoop(os_mutex_take(mutex), os_mutex_drop(mutex))\r\n#define OS_MutexScopeR(mutex) DeferLoop(os_rw_mutex_take_r(mutex), os_rw_mutex_drop_r(mutex))\r\n#define OS_MutexScopeW(mutex) DeferLoop(os_rw_mutex_take_w(mutex), os_rw_mutex_drop_w(mutex))\r\n#define OS_MutexScopeRWPromote(mutex) DeferLoop((os_rw_mutex_drop_r(mutex), os_rw_mutex_take_w(mutex)), (os_rw_mutex_drop_w(mutex), os_rw_mutex_take_r(mutex)))\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_library_open(String8 path);\r\ninternal void      os_library_close(OS_Handle lib);\r\ninternal VoidProc *os_library_load_proc(OS_Handle lib, String8 name);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Safe Calls (Implemented Per-OS)\r\n\r\ninternal void os_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks GUIDs (Implemented Per-OS)\r\n\r\ninternal Guid os_make_guid(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Entry Points (Implemented Per-OS)\r\n\r\n// NOTE(rjf): The implementation of `os_core` will define low-level entry\r\n// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call\r\n// into the standard codebase program entry points, named \"entry_point\".\r\n\r\n#if BUILD_ENTRY_DEFINING_UNIT\r\ninternal void entry_point(CmdLine *cmdline);\r\n#endif\r\n\r\n#endif // OS_CORE_H\r\n"
  },
  {
    "path": "src/metagen/metagen_os/core/win32/metagen_os_core_win32.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Modern Windows SDK Functions\r\n//\r\n// (We must dynamically link to them, since they can be missing in older SDKs)\r\n\r\ntypedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription);\r\nglobal W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: File Info Conversion Helpers\r\n\r\ninternal FilePropertyFlags\r\nos_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes)\r\n{\r\n  FilePropertyFlags flags = 0;\r\n  if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r\n  {\r\n    flags |= FilePropertyFlag_IsFolder;\r\n  }\r\n  return flags;\r\n}\r\n\r\ninternal void\r\nos_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes)\r\n{\r\n  properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow);\r\n  os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime);\r\n  os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime);\r\n  properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Conversion Helpers\r\n\r\ninternal void\r\nos_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in)\r\n{\r\n  out->year    = in->wYear;\r\n  out->mon     = in->wMonth - 1;\r\n  out->wday    = in->wDayOfWeek;\r\n\tout->day     = in->wDay;\r\n\tout->hour    = in->wHour;\r\n\tout->min     = in->wMinute;\r\n\tout->sec     = in->wSecond;\r\n  out->msec    = in->wMilliseconds;\r\n}\r\n\r\ninternal void\r\nos_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in)\r\n{\r\n  out->wYear         = (WORD)(in->year);\r\n  out->wMonth        = in->mon + 1;\r\n  out->wDay          = in->day;\r\n  out->wHour         = in->hour;\r\n  out->wMinute       = in->min;\r\n  out->wSecond       = in->sec;\r\n  out->wMilliseconds = in->msec;\r\n}\r\n\r\ninternal void\r\nos_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  FileTimeToSystemTime(in, &systime);\r\n  DateTime date_time = {0};\r\n  os_w32_date_time_from_system_time(&date_time, &systime);\r\n  *out = dense_time_from_date_time(date_time);\r\n}\r\n\r\ninternal U32\r\nos_w32_sleep_ms_from_endt_us(U64 endt_us)\r\n{\r\n  U32 sleep_ms = 0;\r\n  if(endt_us == max_U64)\r\n  {\r\n    sleep_ms = INFINITE;\r\n  }\r\n  else\r\n  {\r\n    U64 begint = os_now_microseconds();\r\n    if(begint < endt_us)\r\n    {\r\n      U64 sleep_us = endt_us - begint;\r\n      sleep_ms = (U32)((sleep_us + 999)/1000);\r\n    }\r\n  }\r\n  return sleep_ms;\r\n}\r\n\r\ninternal U32\r\nos_w32_unix_time_from_file_time(FILETIME file_time)\r\n{\r\n  U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime;\r\n  U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000);\r\n  \r\n  Assert(unix_time64 <= max_U32);\r\n  U32 unix_time32 = (U32)unix_time64;\r\n  \r\n  return unix_time32;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Functions\r\n\r\ninternal OS_W32_Entity *\r\nos_w32_entity_alloc(OS_W32_EntityKind kind)\r\n{\r\n  OS_W32_Entity *result = 0;\r\n  EnterCriticalSection(&os_w32_state.entity_mutex);\r\n  {\r\n    result = os_w32_state.entity_free;\r\n    if(result)\r\n    {\r\n      SLLStackPop(os_w32_state.entity_free);\r\n    }\r\n    else\r\n    {\r\n      result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1);\r\n    }\r\n    MemoryZeroStruct(result);\r\n  }\r\n  LeaveCriticalSection(&os_w32_state.entity_mutex);\r\n  result->kind = kind;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_w32_entity_release(OS_W32_Entity *entity)\r\n{\r\n  entity->kind = OS_W32_EntityKind_Null;\r\n  EnterCriticalSection(&os_w32_state.entity_mutex);\r\n  SLLStackPush(os_w32_state.entity_free, entity);\r\n  LeaveCriticalSection(&os_w32_state.entity_mutex);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal DWORD\r\nos_w32_thread_entry_point(void *ptr)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity *)ptr;\r\n  OS_ThreadFunctionType *func = entity->thread.func;\r\n  void *thread_ptr = entity->thread.ptr;\r\n  TCTX tctx_;\r\n  tctx_init_and_equip(&tctx_);\r\n  func(thread_ptr);\r\n  tctx_release();\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System/Process Info (Implemented Per-OS)\r\n\r\ninternal OS_SystemInfo *\r\nos_get_system_info(void)\r\n{\r\n  return &os_w32_state.system_info;\r\n}\r\n\r\ninternal OS_ProcessInfo *\r\nos_get_process_info(void)\r\n{\r\n  return &os_w32_state.process_info;\r\n}\r\n\r\ninternal String8\r\nos_get_current_path(Arena *arena)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DWORD length = GetCurrentDirectoryW(0, 0);\r\n  U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1);\r\n  length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory);\r\n  String8 name = str8_from_16(arena, str16(memory, length));\r\n  scratch_end(scratch);\r\n  return name;\r\n}\r\n\r\ninternal U32\r\nos_get_process_start_time_unix(void)\r\n{\r\n  HANDLE handle = GetCurrentProcess();\r\n  FILETIME start_time = {0};\r\n  FILETIME exit_time;\r\n  FILETIME kernel_time;\r\n  FILETIME user_time;\r\n  if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time))\r\n  {\r\n    return os_w32_unix_time_from_file_time(start_time);\r\n  }\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\n//- rjf: basic\r\n\r\ninternal void *\r\nos_reserve(U64 size)\r\n{\r\n  void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit(void *ptr, U64 size)\r\n{\r\n  B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_decommit(void *ptr, U64 size)\r\n{\r\n  VirtualFree(ptr, size, MEM_DECOMMIT);\r\n}\r\n\r\ninternal void\r\nos_release(void *ptr, U64 size)\r\n{\r\n  // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes.\r\n  VirtualFree(ptr, 0, MEM_RELEASE);\r\n}\r\n\r\n//- rjf: large pages\r\n\r\ninternal void *\r\nos_reserve_large(U64 size)\r\n{\r\n  // we commit on reserve because windows\r\n  void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit_large(void *ptr, U64 size)\r\n{\r\n  return 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Thread Info (Implemented Per-OS)\r\n\r\ninternal U32\r\nos_tid(void)\r\n{\r\n  DWORD id = GetCurrentThreadId();\r\n  return (U32)id;\r\n}\r\n\r\ninternal void\r\nos_set_thread_name(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  // rjf: windows 10 style\r\n  if(w32_SetThreadDescription_func)\r\n  {\r\n    String16 name16 = str16_from_8(scratch.arena, name);\r\n    HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str);\r\n  }\r\n  \r\n  // rjf: raise-exception style\r\n  {\r\n    String8 name_copy = push_str8_copy(scratch.arena, name);\r\n#pragma pack(push,8)\r\n    typedef struct THREADNAME_INFO THREADNAME_INFO;\r\n    struct THREADNAME_INFO\r\n    {\r\n      U32 dwType;     // Must be 0x1000.\r\n      char *szName;   // Pointer to name (in user addr space).\r\n      U32 dwThreadID; // Thread ID (-1=caller thread).\r\n      U32 dwFlags;    // Reserved for future use, must be zero.\r\n    };\r\n#pragma pack(pop)\r\n    THREADNAME_INFO info;\r\n    info.dwType = 0x1000;\r\n    info.szName = (char *)name_copy.str;\r\n    info.dwThreadID = os_tid();\r\n    info.dwFlags = 0;\r\n#pragma warning(push)\r\n#pragma warning(disable: 6320 6322)\r\n    __try\r\n    {\r\n      RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info);\r\n    }\r\n    __except (EXCEPTION_EXECUTE_HANDLER)\r\n    {\r\n    }\r\n#pragma warning(pop)\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Aborting (Implemented Per-OS)\r\n\r\ninternal void\r\nos_abort(S32 exit_code)\r\n{\r\n  ExitProcess(exit_code);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\n\r\ninternal OS_Handle\r\nos_file_open(OS_AccessFlags flags, String8 path)\r\n{\r\n  OS_Handle result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  DWORD access_flags = 0;\r\n  DWORD share_mode = 0;\r\n  DWORD creation_disposition = OPEN_EXISTING;\r\n  SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0};\r\n  if(flags & OS_AccessFlag_Read)        {access_flags |= GENERIC_READ;}\r\n  if(flags & OS_AccessFlag_Write)       {access_flags |= GENERIC_WRITE;}\r\n  if(flags & OS_AccessFlag_Execute)     {access_flags |= GENERIC_EXECUTE;}\r\n  if(flags & OS_AccessFlag_ShareRead)   {share_mode |= FILE_SHARE_READ;}\r\n  if(flags & OS_AccessFlag_ShareWrite)  {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;}\r\n  if(flags & OS_AccessFlag_Write)       {creation_disposition = CREATE_ALWAYS;}\r\n  if(flags & OS_AccessFlag_Append)      {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; }\r\n  if(flags & OS_AccessFlag_Inherited)\r\n  {\r\n    security_attributes.bInheritHandle = 1;\r\n  }\r\n  HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, &security_attributes, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0);\r\n  if(file != INVALID_HANDLE_VALUE)\r\n  {\r\n    result.u64[0] = (U64)file;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_file_close(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return; }\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  BOOL result = CloseHandle(handle);\r\n  (void)result;\r\n}\r\n\r\ninternal U64\r\nos_file_read(OS_Handle file, Rng1U64 rng, void *out_data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  \r\n  // rjf: clamp range by file size\r\n  U64 size = 0;\r\n  GetFileSizeEx(handle, (LARGE_INTEGER *)&size);\r\n  Rng1U64 rng_clamped  = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size));\r\n  U64 total_read_size = 0;\r\n  \r\n  // rjf: read loop\r\n  {\r\n    U64 to_read = dim_1u64(rng_clamped);\r\n    for(U64 off = rng.min; total_read_size < to_read;)\r\n    {\r\n      U64 amt64 = to_read - total_read_size;\r\n      U32 amt32 = u32_from_u64_saturate(amt64);\r\n      DWORD read_size = 0;\r\n      OVERLAPPED overlapped = {0};\r\n      overlapped.Offset     = (off&0x00000000ffffffffull);\r\n      overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32;\r\n      ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped);\r\n      off += read_size;\r\n      total_read_size += read_size;\r\n      if(read_size != amt32)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return total_read_size;\r\n}\r\n\r\ninternal U64\r\nos_file_write(OS_Handle file, Rng1U64 rng, void *data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  HANDLE win_handle = (HANDLE)file.u64[0];\r\n  U64 src_off = 0;\r\n  U64 dst_off = rng.min;\r\n  U64 total_write_size = dim_1u64(rng);\r\n  for(;;)\r\n  {\r\n    void *bytes_src = (U8 *)data + src_off;\r\n    U64 bytes_left = total_write_size - src_off;\r\n    DWORD write_size = Min(MB(1), bytes_left);\r\n    DWORD bytes_written = 0;\r\n    OVERLAPPED overlapped = {0};\r\n    overlapped.Offset = (dst_off&0x00000000ffffffffull);\r\n    overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32;\r\n    BOOL success = WriteFile(win_handle, bytes_src, write_size, &bytes_written, &overlapped);\r\n    if(success == 0)\r\n    {\r\n      break;\r\n    }\r\n    src_off += bytes_written;\r\n    dst_off += bytes_written;\r\n    if(bytes_left == 0)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return src_off;\r\n}\r\n\r\ninternal B32\r\nos_file_set_time(OS_Handle file, DateTime time)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  B32 result = 0;\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  SYSTEMTIME system_time = {0};\r\n  os_w32_system_time_from_date_time(&system_time, &time);\r\n  FILETIME file_time = {0};\r\n  result = (SystemTimeToFileTime(&system_time, &file_time) &&\r\n            SetFileTime(handle, &file_time, &file_time, &file_time));\r\n  return result;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; }\r\n  FileProperties props = {0};\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  BY_HANDLE_FILE_INFORMATION info;\r\n  BOOL info_good = GetFileInformationByHandle(handle, &info);\r\n  if(info_good)\r\n  {\r\n    U32 size_lo = info.nFileSizeLow;\r\n    U32 size_hi = info.nFileSizeHigh;\r\n    props.size     = (U64)size_lo | (((U64)size_hi)<<32);\r\n    os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime);\r\n    os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime);\r\n    props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes);\r\n  }\r\n  return props;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; }\r\n  OS_FileID result = {0};\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  BY_HANDLE_FILE_INFORMATION info;\r\n  BOOL is_ok = GetFileInformationByHandle(handle, &info);\r\n  if(is_ok)\r\n  {\r\n    result.v[0] = info.dwVolumeSerialNumber;\r\n    result.v[1] = info.nFileIndexLow;\r\n    result.v[2] = info.nFileIndexHigh;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_file_reserve_size(OS_Handle file, U64 size)\r\n{\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  \r\n  FILE_ALLOCATION_INFO alloc_info    = {0};\r\n  alloc_info.AllocationSize.LowPart  = size & max_U32;\r\n  alloc_info.AllocationSize.HighPart = (size >> 32) & max_U32;\r\n  \r\n  BOOL is_reserved = SetFileInformationByHandle(handle, FileAllocationInfo, &alloc_info, sizeof(alloc_info));\r\n  return is_reserved;\r\n}\r\n\r\ninternal B32\r\nos_delete_file_at_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  B32 result = DeleteFileW((WCHAR*)path16.str);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_copy_file_path(String8 dst, String8 src)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 dst16 = str16_from_8(scratch.arena, dst);\r\n  String16 src16 = str16_from_8(scratch.arena, src);\r\n  B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_move_file_path(String8 dst, String8 src)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 dst16 = str16_from_8(scratch.arena, dst);\r\n  String16 src16 = str16_from_8(scratch.arena, src);\r\n  B32 result = MoveFileW((WCHAR*)src16.str, (WCHAR*)dst16.str);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nos_full_path_from_path(Arena *arena, String8 path)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DWORD     buffer_size = Max(MAX_PATH, path.size * 2) + 1;\r\n  String16  path16      = str16_from_8(scratch.arena, path);\r\n  WCHAR    *buffer      = push_array_no_zero(scratch.arena, WCHAR, buffer_size);\r\n  DWORD     path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL);\r\n  if(path16_size > buffer_size)\r\n  {\r\n    arena_pop(scratch.arena, buffer_size);\r\n    buffer_size = path16_size + 1;\r\n    buffer      = push_array_no_zero(scratch.arena, WCHAR, buffer_size);\r\n    path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL);\r\n  }\r\n  String8 full_path = str8_from_16(arena, str16((U16*)buffer, path16_size));\r\n  scratch_end(scratch);\r\n  return full_path;\r\n}\r\n\r\ninternal B32\r\nos_file_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  DWORD attributes = GetFileAttributesW((WCHAR *)path16.str);\r\n  B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY);\r\n  scratch_end(scratch);\r\n  return exists;\r\n}\r\n\r\ninternal B32\r\nos_folder_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  String16 path16     = str16_from_8(scratch.arena, path);\r\n  DWORD    attributes = GetFileAttributesW((WCHAR *)path16.str);\r\n  B32      exists     = (attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY);\r\n  scratch_end(scratch);\r\n  return exists;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file_path(String8 path)\r\n{\r\n  WIN32_FIND_DATAW find_data = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data);\r\n  FileProperties props = {0};\r\n  if(handle != INVALID_HANDLE_VALUE)\r\n  {\r\n    props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow);\r\n    os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime);\r\n    os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime);\r\n    props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes);\r\n  }\r\n  else\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    WCHAR buffer[512] = {0};\r\n    DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer);\r\n    U64 last_slash_pos = 0;\r\n    for(;last_slash_pos < path.size; last_slash_pos = str8_find_needle(path, last_slash_pos+1, str8_lit(\"/\"), StringMatchFlag_SlashInsensitive));\r\n    String8 path_trimmed = str8_prefix(path, last_slash_pos);\r\n    for(U64 off = 0; off < (U64)length;)\r\n    {\r\n      String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off);\r\n      off += next_drive_string_16.size+1;\r\n      String8 next_drive_string = str8_from_16(scratch.arena, next_drive_string_16);\r\n      next_drive_string = str8_chop_last_slash(next_drive_string);\r\n      if(str8_match(path_trimmed, next_drive_string, StringMatchFlag_CaseInsensitive))\r\n      {\r\n        props.flags |= FilePropertyFlag_IsFolder;\r\n        break;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  FindClose(handle);\r\n  scratch_end(scratch);\r\n  return props;\r\n}\r\n\r\n//- rjf: file maps\r\n\r\ninternal OS_Handle\r\nos_file_map_open(OS_AccessFlags flags, OS_Handle file)\r\n{\r\n  OS_Handle map = {0};\r\n  {\r\n    HANDLE file_handle = (HANDLE)file.u64[0];\r\n    DWORD protect_flags = 0;\r\n    {\r\n      switch(flags)\r\n      {\r\n        default:{}break;\r\n        case OS_AccessFlag_Read:\r\n        {protect_flags = PAGE_READONLY;}break;\r\n        case OS_AccessFlag_Write:\r\n        case OS_AccessFlag_Read|OS_AccessFlag_Write:\r\n        {protect_flags = PAGE_READWRITE;}break;\r\n        case OS_AccessFlag_Execute:\r\n        case OS_AccessFlag_Read|OS_AccessFlag_Execute:\r\n        {protect_flags = PAGE_EXECUTE_READ;}break;\r\n        case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read:\r\n        case OS_AccessFlag_Execute|OS_AccessFlag_Write:\r\n        {protect_flags = PAGE_EXECUTE_READWRITE;}break;\r\n      }\r\n    }\r\n    HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0);\r\n    map.u64[0] = (U64)map_handle;\r\n  }\r\n  return map;\r\n}\r\n\r\ninternal void\r\nos_file_map_close(OS_Handle map)\r\n{\r\n  HANDLE handle = (HANDLE)map.u64[0];\r\n  BOOL result = CloseHandle(handle);\r\n  (void)result;\r\n}\r\n\r\ninternal void *\r\nos_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range)\r\n{\r\n  HANDLE handle = (HANDLE)map.u64[0];\r\n  U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0);\r\n  U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32);\r\n  U64 size = dim_1u64(range);\r\n  DWORD access_flags = 0;\r\n  {\r\n    switch(flags)\r\n    {\r\n      default:{}break;\r\n      case OS_AccessFlag_Read:\r\n      {\r\n        access_flags = FILE_MAP_READ;\r\n      }break;\r\n      case OS_AccessFlag_Write:\r\n      {\r\n        access_flags = FILE_MAP_WRITE;\r\n      }break;\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Write:\r\n      {\r\n        access_flags = FILE_MAP_ALL_ACCESS;\r\n      }break;\r\n      case OS_AccessFlag_Execute:\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Execute:\r\n      case OS_AccessFlag_Write|OS_AccessFlag_Execute:\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute:\r\n      {\r\n        access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE;\r\n      }break;\r\n    }\r\n  }\r\n  void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range)\r\n{\r\n  BOOL result = UnmapViewOfFile(ptr);\r\n  (void)result;\r\n}\r\n\r\n//- rjf: directory iteration\r\n\r\ninternal OS_FileIter *\r\nos_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit(\"\\\\*\"));\r\n  String16 path16 = str16_from_8(scratch.arena, path_with_wildcard);\r\n  OS_FileIter *iter = push_array(arena, OS_FileIter, 1);\r\n  iter->flags = flags;\r\n  OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;\r\n  if(path.size == 0)\r\n  {\r\n    w32_iter->is_volume_iter = 1;\r\n    WCHAR buffer[512] = {0};\r\n    DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer);\r\n    String8List drive_strings = {0};\r\n    for(U64 off = 0; off < (U64)length;)\r\n    {\r\n      String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off);\r\n      off += next_drive_string_16.size+1;\r\n      String8 next_drive_string = str8_from_16(arena, next_drive_string_16);\r\n      next_drive_string = str8_chop_last_slash(next_drive_string);\r\n      str8_list_push(scratch.arena, &drive_strings, next_drive_string);\r\n    }\r\n    w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings);\r\n    w32_iter->drive_strings_iter_idx = 0;\r\n  }\r\n  else\r\n  {\r\n    w32_iter->handle = FindFirstFileW((WCHAR*)path16.str, &w32_iter->find_data);\r\n  }\r\n  scratch_end(scratch);\r\n  return iter;\r\n}\r\n\r\ninternal B32\r\nos_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)\r\n{\r\n  B32 result = 0;\r\n  OS_FileIterFlags flags = iter->flags;\r\n  OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;\r\n  switch(w32_iter->is_volume_iter)\r\n  {\r\n    //- rjf: file iteration\r\n    default:\r\n    case 0:\r\n    {\r\n      if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE)\r\n      {\r\n        do\r\n        {\r\n          // check is usable\r\n          B32 usable_file = 1;\r\n          \r\n          WCHAR *file_name = w32_iter->find_data.cFileName;\r\n          DWORD attributes = w32_iter->find_data.dwFileAttributes;\r\n          if (file_name[0] == '.'){\r\n            if (flags & OS_FileIterFlag_SkipHiddenFiles){\r\n              usable_file = 0;\r\n            }\r\n            else if (file_name[1] == 0){\r\n              usable_file = 0;\r\n            }\r\n            else if (file_name[1] == '.' && file_name[2] == 0){\r\n              usable_file = 0;\r\n            }\r\n          }\r\n          if (attributes & FILE_ATTRIBUTE_DIRECTORY){\r\n            if (flags & OS_FileIterFlag_SkipFolders){\r\n              usable_file = 0;\r\n            }\r\n          }\r\n          else{\r\n            if (flags & OS_FileIterFlag_SkipFiles){\r\n              usable_file = 0;\r\n            }\r\n          }\r\n          \r\n          // emit if usable\r\n          if (usable_file){\r\n            info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name));\r\n            info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32);\r\n            os_w32_dense_time_from_file_time(&info_out->props.created,  &w32_iter->find_data.ftCreationTime);\r\n            os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime);\r\n            info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes);\r\n            result = 1;\r\n            if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){\r\n              iter->flags |= OS_FileIterFlag_Done;\r\n            }\r\n            break;\r\n          }\r\n        }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data));\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: volume iteration\r\n    case 1:\r\n    {\r\n      result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count;\r\n      if(result != 0)\r\n      {\r\n        MemoryZeroStruct(info_out);\r\n        info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx];\r\n        info_out->props.flags |= FilePropertyFlag_IsFolder;\r\n        w32_iter->drive_strings_iter_idx += 1;\r\n      }\r\n    }break;\r\n  }\r\n  if(!result)\r\n  {\r\n    iter->flags |= OS_FileIterFlag_Done;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_file_iter_end(OS_FileIter *iter)\r\n{\r\n  OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;\r\n  HANDLE zero_handle;\r\n  MemoryZeroStruct(&zero_handle);\r\n  if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle))\r\n  {\r\n    FindClose(w32_iter->handle);\r\n  }\r\n}\r\n\r\n//- rjf: directory creation\r\n\r\ninternal B32\r\nos_make_directory(String8 path)\r\n{\r\n  B32 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, path);\r\n  WIN32_FILE_ATTRIBUTE_DATA attributes = {0};\r\n  GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes);\r\n  if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r\n  {\r\n    result = 1;\r\n  }\r\n  else if(CreateDirectoryW((WCHAR*)name16.str, 0))\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_shared_memory_alloc(U64 size, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE,\r\n                                   0,\r\n                                   PAGE_READWRITE,\r\n                                   (U32)((size & 0xffffffff00000000) >> 32),\r\n                                   (U32)((size & 0x00000000ffffffff)),\r\n                                   (WCHAR *)name16.str);\r\n  OS_Handle result = {(U64)file};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_shared_memory_open(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str);\r\n  OS_Handle result = {(U64)file};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_close(OS_Handle handle)\r\n{\r\n  HANDLE file = (HANDLE)(handle.u64[0]);\r\n  CloseHandle(file);\r\n}\r\n\r\ninternal void *\r\nos_shared_memory_view_open(OS_Handle handle, Rng1U64 range)\r\n{\r\n  HANDLE file = (HANDLE)(handle.u64[0]);\r\n  U64 offset = range.min;\r\n  U64 size = range.max-range.min;\r\n  void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS,\r\n                            (U32)((offset & 0xffffffff00000000) >> 32),\r\n                            (U32)((offset & 0x00000000ffffffff)),\r\n                            size);\r\n  return ptr;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range)\r\n{\r\n  UnmapViewOfFile(ptr);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U64\r\nos_now_microseconds(void)\r\n{\r\n  U64 result = 0;\r\n  LARGE_INTEGER large_int_counter;\r\n  if(QueryPerformanceCounter(&large_int_counter))\r\n  {\r\n    result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nos_now_unix(void)\r\n{\r\n  FILETIME file_time;\r\n  GetSystemTimeAsFileTime(&file_time);\r\n  U32 unix_time = os_w32_unix_time_from_file_time(file_time);\r\n  return unix_time;\r\n}\r\n\r\ninternal DateTime\r\nos_now_universal_time(void)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  GetSystemTime(&systime);\r\n  DateTime result = {0};\r\n  os_w32_date_time_from_system_time(&result, &systime);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_universal_time_from_local(DateTime *date_time)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  os_w32_system_time_from_date_time(&systime, date_time);\r\n  FILETIME ftime = {0};\r\n  SystemTimeToFileTime(&systime, &ftime);\r\n  FILETIME ftime_local = {0};\r\n  LocalFileTimeToFileTime(&ftime, &ftime_local);\r\n  FileTimeToSystemTime(&ftime_local, &systime);\r\n  DateTime result = {0};\r\n  os_w32_date_time_from_system_time(&result, &systime);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_local_time_from_universal(DateTime *date_time)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  os_w32_system_time_from_date_time(&systime, date_time);\r\n  FILETIME ftime = {0};\r\n  SystemTimeToFileTime(&systime, &ftime);\r\n  FILETIME ftime_local = {0};\r\n  FileTimeToLocalFileTime(&ftime, &ftime_local);\r\n  FileTimeToSystemTime(&ftime_local, &systime);\r\n  DateTime result = {0};\r\n  os_w32_date_time_from_system_time(&result, &systime);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_sleep_milliseconds(U32 msec)\r\n{\r\n  Sleep(msec);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_process_launch(OS_ProcessLaunchParams *params)\r\n{\r\n  OS_Handle result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: form full command string\r\n  String8 cmd = {0};\r\n  {\r\n    StringJoin join_params = {0};\r\n    join_params.pre = str8_lit(\"\\\"\");\r\n    join_params.sep = str8_lit(\"\\\" \\\"\");\r\n    join_params.post = str8_lit(\"\\\"\");\r\n    cmd = str8_list_join(scratch.arena, &params->cmd_line, &join_params);\r\n  }\r\n  \r\n  //- rjf: form environment\r\n  B32 use_null_env_arg = 0;\r\n  String8 env = {0};\r\n  {\r\n    StringJoin join_params2 = {0};\r\n    join_params2.sep = str8_lit(\"\\0\");\r\n    join_params2.post = str8_lit(\"\\0\");\r\n    String8List all_opts = params->env;\r\n    if(params->inherit_env != 0)\r\n    {\r\n      if(all_opts.node_count != 0)\r\n      {\r\n        MemoryZeroStruct(&all_opts);\r\n        for(String8Node *n = params->env.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(scratch.arena, &all_opts, n->string);\r\n        }\r\n        for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(scratch.arena, &all_opts, n->string);\r\n        }\r\n      }\r\n      else\r\n      {\r\n        use_null_env_arg = 1;\r\n      }\r\n    }\r\n    if(use_null_env_arg == 0)\r\n    {\r\n      env = str8_list_join(scratch.arena, &all_opts, &join_params2);\r\n    }\r\n  }\r\n  \r\n  //- rjf: utf-8 -> utf-16\r\n  String16 cmd16 = str16_from_8(scratch.arena, cmd);\r\n  String16 dir16 = str16_from_8(scratch.arena, params->path);\r\n  String16 env16 = {0};\r\n  if(use_null_env_arg == 0)\r\n  {\r\n    env16 = str16_from_8(scratch.arena, env);\r\n  }\r\n  \r\n  //- rjf: determine creation flags\r\n  DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT;\r\n  if(params->consoleless)\r\n  {\r\n    creation_flags |= CREATE_NO_WINDOW;\r\n  }\r\n  \r\n  //- rjf: launch\r\n  BOOL inherit_handles = 0;\r\n  STARTUPINFOW startup_info = {sizeof(startup_info)};\r\n  if(!os_handle_match(params->stdout_file, os_handle_zero()))\r\n  {\r\n    HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0];\r\n    startup_info.hStdOutput = stdout_handle;\r\n    startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n    inherit_handles = 1;\r\n  }\r\n  if(!os_handle_match(params->stderr_file, os_handle_zero()))\r\n  {\r\n    HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0];\r\n    startup_info.hStdError = stderr_handle;\r\n    startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n    inherit_handles = 1;\r\n  }\r\n  if(!os_handle_match(params->stdin_file, os_handle_zero()))\r\n  {\r\n    HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0];\r\n    startup_info.hStdInput = stdin_handle;\r\n    startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n    inherit_handles = 1;\r\n  }\r\n  PROCESS_INFORMATION process_info = {0};\r\n  if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info))\r\n  {\r\n    result.u64[0] = (U64)process_info.hProcess;\r\n    CloseHandle(process_info.hThread);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_process_join(OS_Handle handle, U64 endt_us)\r\n{\r\n  HANDLE process = (HANDLE)(handle.u64[0]);\r\n  DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  DWORD result = WaitForSingleObject(process, sleep_ms);\r\n  return (result == WAIT_OBJECT_0);\r\n}\r\n\r\ninternal void\r\nos_process_detach(OS_Handle handle)\r\n{\r\n  HANDLE process = (HANDLE)(handle.u64[0]);\r\n  CloseHandle(process);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_thread_launch(OS_ThreadFunctionType *func, void *ptr, void *params)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread);\r\n  entity->thread.func = func;\r\n  entity->thread.ptr = ptr;\r\n  entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid);\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_thread_join(OS_Handle handle, U64 endt_us)\r\n{\r\n  DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(handle.u64[0]);\r\n  DWORD wait_result = WAIT_OBJECT_0;\r\n  if(entity != 0)\r\n  {\r\n    wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms);\r\n    CloseHandle(entity->thread.handle);\r\n    os_w32_entity_release(entity);\r\n  }\r\n  return (wait_result == WAIT_OBJECT_0);\r\n}\r\n\r\ninternal void\r\nos_thread_detach(OS_Handle thread)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]);\r\n  if(entity != 0)\r\n  {\r\n    CloseHandle(entity->thread.handle);\r\n    os_w32_entity_release(entity);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n//- rjf: mutexes\r\n\r\ninternal OS_Handle\r\nos_mutex_alloc(void)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex);\r\n  InitializeCriticalSection(&entity->mutex);\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_mutex_release(OS_Handle mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n  os_w32_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_mutex_take(OS_Handle mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n  EnterCriticalSection(&entity->mutex);\r\n}\r\n\r\ninternal void\r\nos_mutex_drop(OS_Handle mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n  LeaveCriticalSection(&entity->mutex);\r\n}\r\n\r\n//- rjf: reader/writer mutexes\r\n\r\ninternal OS_Handle\r\nos_rw_mutex_alloc(void)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex);\r\n  InitializeSRWLock(&entity->rw_mutex);\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_release(OS_Handle rw_mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  os_w32_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take_r(OS_Handle rw_mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  AcquireSRWLockShared(&entity->rw_mutex);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop_r(OS_Handle rw_mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  ReleaseSRWLockShared(&entity->rw_mutex);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take_w(OS_Handle rw_mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  AcquireSRWLockExclusive(&entity->rw_mutex);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop_w(OS_Handle rw_mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  ReleaseSRWLockExclusive(&entity->rw_mutex);\r\n}\r\n\r\n//- rjf: condition variables\r\n\r\ninternal OS_Handle\r\nos_condition_variable_alloc(void)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable);\r\n  InitializeConditionVariable(&entity->cv);\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_condition_variable_release(OS_Handle cv)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n  os_w32_entity_release(entity);\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait(OS_Handle cv, OS_Handle mutex, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  BOOL result = 0;\r\n  if(sleep_ms > 0)\r\n  {\r\n    OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n    OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n    result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_rw_r(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  BOOL result = 0;\r\n  if(sleep_ms > 0)\r\n  {\r\n    OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n    OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]);\r\n    result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms,\r\n                                       CONDITION_VARIABLE_LOCKMODE_SHARED);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_rw_w(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  BOOL result = 0;\r\n  if(sleep_ms > 0)\r\n  {\r\n    OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n    OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]);\r\n    result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms, 0);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_condition_variable_signal(OS_Handle cv)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n  WakeConditionVariable(&entity->cv);\r\n}\r\n\r\ninternal void\r\nos_condition_variable_broadcast(OS_Handle cv)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n  WakeAllConditionVariable(&entity->cv);\r\n}\r\n\r\n//- rjf: cross-process semaphores\r\n\r\ninternal OS_Handle\r\nos_semaphore_alloc(U32 initial_count, U32 max_count, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str);\r\n  OS_Handle result = {(U64)handle};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_release(OS_Handle semaphore)\r\n{\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  CloseHandle(handle);\r\n}\r\n\r\ninternal OS_Handle\r\nos_semaphore_open(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS , 0, (WCHAR *)name16.str);\r\n  OS_Handle result = {(U64)handle};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_close(OS_Handle semaphore)\r\n{\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  CloseHandle(handle);\r\n}\r\n\r\ninternal B32\r\nos_semaphore_take(OS_Handle semaphore, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  DWORD wait_result = WaitForSingleObject(handle, sleep_ms);\r\n  B32 result = (wait_result == WAIT_OBJECT_0);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_drop(OS_Handle semaphore)\r\n{\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  ReleaseSemaphore(handle, 1, 0);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_library_open(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  HMODULE mod = LoadLibraryW((LPCWSTR)path16.str);\r\n  OS_Handle result = { (U64)mod };\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal VoidProc*\r\nos_library_load_proc(OS_Handle lib, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  HMODULE mod = (HMODULE)lib.u64[0];\r\n  name = push_str8_copy(scratch.arena, name);\r\n  VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_library_close(OS_Handle lib)\r\n{\r\n  HMODULE mod = (HMODULE)lib.u64[0];\r\n  FreeLibrary(mod);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Safe Calls (Implemented Per-OS)\r\n\r\ninternal void\r\nos_safe_call(OS_ThreadFunctionType *func, OS_ThreadFunctionType *fail_handler, void *ptr)\r\n{\r\n  __try\r\n  {\r\n    func(ptr);\r\n  }\r\n  __except (EXCEPTION_EXECUTE_HANDLER)\r\n  {\r\n    if(fail_handler != 0)\r\n    {\r\n      fail_handler(ptr);\r\n    }\r\n    ExitProcess(1);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks GUIDs (Implemented Per-OS)\r\n\r\ninternal Guid\r\nos_make_guid(void)\r\n{\r\n  Guid result; MemoryZeroStruct(&result);\r\n  UUID uuid;\r\n  RPC_STATUS rpc_status = UuidCreate(&uuid);\r\n  if(rpc_status == RPC_S_OK)\r\n  {\r\n    result.data1 = uuid.Data1;\r\n    result.data2 = uuid.Data2;\r\n    result.data3 = uuid.Data3;\r\n    MemoryCopyArray(result.data4, uuid.Data4);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Entry Points (Implemented Per-OS)\r\n\r\n#include <dbghelp.h>\r\n#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside\r\n#include <shlwapi.h>\r\n\r\ninternal B32 win32_g_is_quiet = 0;\r\n\r\ninternal HRESULT WINAPI\r\nwin32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data)\r\n{\r\n  if(msg == TDN_HYPERLINK_CLICKED)\r\n  {\r\n    ShellExecuteW(NULL, L\"open\", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL);\r\n  }\r\n  return S_OK;\r\n}\r\n\r\ninternal LONG WINAPI\r\nwin32_exception_filter(EXCEPTION_POINTERS* exception_ptrs)\r\n{\r\n  if(win32_g_is_quiet)\r\n  {\r\n    ExitProcess(1);\r\n  }\r\n  \r\n  static volatile LONG first = 0;\r\n  if(InterlockedCompareExchange(&first, 1, 0) != 0)\r\n  {\r\n    // prevent failures in other threads to popup same message box\r\n    // this handler just shows first thread that crashes\r\n    // we are terminating afterwards anyway\r\n    for (;;) Sleep(1000);\r\n  }\r\n  \r\n  WCHAR buffer[4096] = {0};\r\n  int buflen = 0;\r\n  \r\n  DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode;\r\n  buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"A fatal exception (code 0x%x) occurred. The process is terminating.\\n\", exception_code);\r\n  \r\n  // load dbghelp dynamically just in case if it is missing\r\n  HMODULE dbghelp = LoadLibraryA(\"dbghelp.dll\");\r\n  if(dbghelp)\r\n  {\r\n    DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions);\r\n    BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess);\r\n    BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread,\r\n                                   LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,\r\n                                   PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,\r\n                                   PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);\r\n    PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase);\r\n    DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr);\r\n    BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol);\r\n    BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line);\r\n    BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo);\r\n    \r\n    *(FARPROC*)&dbg_SymSetOptions            = GetProcAddress(dbghelp, \"SymSetOptions\");\r\n    *(FARPROC*)&dbg_SymInitializeW           = GetProcAddress(dbghelp, \"SymInitializeW\");\r\n    *(FARPROC*)&dbg_StackWalk64              = GetProcAddress(dbghelp, \"StackWalk64\");\r\n    *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, \"SymFunctionTableAccess64\");\r\n    *(FARPROC*)&dbg_SymGetModuleBase64       = GetProcAddress(dbghelp, \"SymGetModuleBase64\");\r\n    *(FARPROC*)&dbg_SymFromAddrW             = GetProcAddress(dbghelp, \"SymFromAddrW\");\r\n    *(FARPROC*)&dbg_SymGetLineFromAddrW64    = GetProcAddress(dbghelp, \"SymGetLineFromAddrW64\");\r\n    *(FARPROC*)&dbg_SymGetModuleInfoW64      = GetProcAddress(dbghelp, \"SymGetModuleInfoW64\");\r\n    \r\n    if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64)\r\n    {\r\n      HANDLE process = GetCurrentProcess();\r\n      HANDLE thread = GetCurrentThread();\r\n      CONTEXT* context = exception_ptrs->ContextRecord;\r\n      \r\n      WCHAR module_path[MAX_PATH];\r\n      GetModuleFileNameW(NULL, module_path, ArrayCount(module_path));\r\n      PathRemoveFileSpecW(module_path);\r\n      \r\n      dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);\r\n      if(dbg_SymInitializeW(process, module_path, TRUE))\r\n      {\r\n        // check that raddbg.pdb file is good\r\n        B32 raddbg_pdb_valid = 0;\r\n        {\r\n          IMAGEHLP_MODULEW64 module = {0};\r\n          module.SizeOfStruct = sizeof(module);\r\n          if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module))\r\n          {\r\n            raddbg_pdb_valid = (module.SymType == SymPdb);\r\n          }\r\n        }\r\n        \r\n        if(!raddbg_pdb_valid)\r\n        {\r\n          buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen,\r\n                               L\"\\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\\n\");\r\n        }\r\n        else\r\n        {\r\n          STACKFRAME64 frame = {0};\r\n          DWORD image_type;\r\n#if defined(_M_AMD64)\r\n          image_type = IMAGE_FILE_MACHINE_AMD64;\r\n          frame.AddrPC.Offset = context->Rip;\r\n          frame.AddrPC.Mode = AddrModeFlat;\r\n          frame.AddrFrame.Offset = context->Rbp;\r\n          frame.AddrFrame.Mode = AddrModeFlat;\r\n          frame.AddrStack.Offset = context->Rsp;\r\n          frame.AddrStack.Mode = AddrModeFlat;\r\n#elif defined(_M_ARM64)\r\n          image_type = IMAGE_FILE_MACHINE_ARM64;\r\n          frame.AddrPC.Offset = context->Pc;\r\n          frame.AddrPC.Mode = AddrModeFlat;\r\n          frame.AddrFrame.Offset = context->Fp;\r\n          frame.AddrFrame.Mode = AddrModeFlat;\r\n          frame.AddrStack.Offset = context->Sp;\r\n          frame.AddrStack.Mode = AddrModeFlat;\r\n#else\r\n#  error Arch not supported!\r\n#endif\r\n          \r\n          for(U32 idx=0; ;idx++)\r\n          {\r\n            const U32 max_frames = 32;\r\n            if(idx == max_frames)\r\n            {\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"...\");\r\n              break;\r\n            }\r\n            \r\n            if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0))\r\n            {\r\n              break;\r\n            }\r\n            \r\n            U64 address = frame.AddrPC.Offset;\r\n            if(address == 0)\r\n            {\r\n              break;\r\n            }\r\n            \r\n            if(idx==0)\r\n            {\r\n#if BUILD_CONSOLE_INTERFACE\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"\\nCreate a new issue with this report at %S.\\n\\n\", BUILD_ISSUES_LINK_STRING_LITERAL);\r\n#else\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen,\r\n                                   L\"\\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\\n\"\r\n                                   L\"<a href=\\\"%S\\\">%S</a>\\n\\n\", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL);\r\n#endif\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"Call stack:\\n\");\r\n            }\r\n            \r\n            buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"%u. [0x%I64x]\", idx + 1, address);\r\n            \r\n            struct {\r\n              SYMBOL_INFOW info;\r\n              WCHAR name[MAX_SYM_NAME];\r\n            } symbol = {0};\r\n            \r\n            symbol.info.SizeOfStruct = sizeof(symbol.info);\r\n            symbol.info.MaxNameLen = MAX_SYM_NAME;\r\n            \r\n            DWORD64 displacement = 0;\r\n            if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info))\r\n            {\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\" %s +%u\", symbol.info.Name, (DWORD)displacement);\r\n              \r\n              IMAGEHLP_LINEW64 line = {0};\r\n              line.SizeOfStruct = sizeof(line);\r\n              \r\n              DWORD line_displacement = 0;\r\n              if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line))\r\n              {\r\n                buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\", %s line %u\", PathFindFileNameW(line.FileName), line.LineNumber);\r\n              }\r\n            }\r\n            else\r\n            {\r\n              IMAGEHLP_MODULEW64 module = {0};\r\n              module.SizeOfStruct = sizeof(module);\r\n              if(dbg_SymGetModuleInfoW64(process, address, &module))\r\n              {\r\n                buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\" %s\", module.ModuleName);\r\n              }\r\n            }\r\n            \r\n            buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"\\n\");\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"\\nVersion: %S%S\", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND);\r\n  \r\n#if BUILD_CONSOLE_INTERFACE\r\n  fwprintf(stderr, L\"\\n--- Fatal Exception ---\\n\");\r\n  fwprintf(stderr, L\"%s\\n\\n\", buffer);\r\n#else\r\n  TASKDIALOGCONFIG dialog = {0};\r\n  dialog.cbSize = sizeof(dialog);\r\n  dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION;\r\n  dialog.pszMainIcon = TD_ERROR_ICON;\r\n  dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON;\r\n  dialog.pszWindowTitle = L\"Fatal Exception\";\r\n  dialog.pszContent = buffer;\r\n  dialog.pfCallback = &win32_dialog_callback;\r\n  TaskDialogIndirect(&dialog, 0, 0, 0);\r\n#endif\r\n  \r\n  ExitProcess(1);\r\n}\r\n\r\n#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside\r\n#define OS_WINDOWS 1\r\n\r\ninternal void\r\nw32_entry_point_caller(int argc, WCHAR **wargv)\r\n{\r\n  SetUnhandledExceptionFilter(&win32_exception_filter);\r\n  \r\n  //- rjf: dynamically load windows functions which are not guaranteed\r\n  // in all SDKs\r\n  {\r\n    HMODULE module = LoadLibraryA(\"kernel32.dll\");\r\n    w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, \"SetThreadDescription\");\r\n    FreeLibrary(module);\r\n  }\r\n  \r\n  //- rjf: try to allow large pages if we can\r\n  B32 large_pages_allowed = 0;\r\n  {\r\n    HANDLE token;\r\n    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))\r\n    {\r\n      LUID luid;\r\n      if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid))\r\n      {\r\n        TOKEN_PRIVILEGES priv;\r\n        priv.PrivilegeCount           = 1;\r\n        priv.Privileges[0].Luid       = luid;\r\n        priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\r\n        large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0);\r\n      }\r\n      CloseHandle(token);\r\n    }\r\n  }\r\n  \r\n  //- rjf: get system info\r\n  SYSTEM_INFO sysinfo = {0};\r\n  GetSystemInfo(&sysinfo);\r\n  \r\n  //- rjf: set up non-dynamically-alloc'd state\r\n  //\r\n  // (we need to set up some basics before this layer can supply\r\n  // memory allocation primitives)\r\n  {\r\n    os_w32_state.microsecond_resolution  = 1;\r\n    LARGE_INTEGER large_int_resolution;\r\n    if(QueryPerformanceFrequency(&large_int_resolution))\r\n    {\r\n      os_w32_state.microsecond_resolution = large_int_resolution.QuadPart;\r\n    }\r\n  }\r\n  {\r\n    OS_SystemInfo *info = &os_w32_state.system_info;\r\n    info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors;\r\n    info->page_size               = sysinfo.dwPageSize;\r\n    info->large_page_size         = GetLargePageMinimum();\r\n    info->allocation_granularity  = sysinfo.dwAllocationGranularity;\r\n  }\r\n  {\r\n    OS_ProcessInfo *info = &os_w32_state.process_info;\r\n    info->large_pages_allowed = large_pages_allowed;\r\n    info->pid = GetCurrentProcessId();\r\n  }\r\n  \r\n  //- rjf: extract arguments\r\n  Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32));\r\n  char **argv = push_array(args_arena, char *, argc);\r\n  for(int i = 0; i < argc; i += 1)\r\n  {\r\n    String16 arg16 = str16_cstring((U16 *)wargv[i]);\r\n    String8 arg8 = str8_from_16(args_arena, arg16);\r\n    if(str8_match(arg8, str8_lit(\"--quiet\"), StringMatchFlag_CaseInsensitive) ||\r\n       str8_match(arg8, str8_lit(\"-quiet\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      win32_g_is_quiet = 1;\r\n    }\r\n    if(str8_match(arg8, str8_lit(\"--large_pages\"), StringMatchFlag_CaseInsensitive) ||\r\n       str8_match(arg8, str8_lit(\"-large_pages\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      arena_default_flags        = ArenaFlag_LargePages;\r\n      arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size);\r\n      arena_default_commit_size  = arena_default_reserve_size;\r\n    }\r\n    argv[i] = (char *)arg8.str;\r\n  }\r\n  \r\n  //- rjf: set up thread context\r\n  local_persist TCTX tctx;\r\n  tctx_init_and_equip(&tctx);\r\n  \r\n  //- rjf: set up dynamically-alloc'd state\r\n  Arena *arena = arena_alloc();\r\n  {\r\n    os_w32_state.arena = arena;\r\n    {\r\n      OS_SystemInfo *info = &os_w32_state.system_info;\r\n      U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0};\r\n      DWORD size = MAX_COMPUTERNAME_LENGTH + 1;\r\n      if(GetComputerNameA((char*)buffer, &size))\r\n      {\r\n        info->machine_name = push_str8_copy(arena, str8(buffer, size));\r\n      }\r\n    }\r\n  }\r\n  {\r\n    OS_ProcessInfo *info = &os_w32_state.process_info;\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      DWORD size = KB(32);\r\n      U16 *buffer = push_array_no_zero(scratch.arena, U16, size);\r\n      DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size);\r\n      String8 name8 = str8_from_16(scratch.arena, str16(buffer, length));\r\n      String8 name_chopped = str8_chop_last_slash(name8);\r\n      info->binary_path = push_str8_copy(arena, name_chopped);\r\n      scratch_end(scratch);\r\n    }\r\n    info->initial_path = os_get_current_path(arena);\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      U64 size = KB(32);\r\n      U16 *buffer = push_array_no_zero(scratch.arena, U16, size);\r\n      if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer)))\r\n      {\r\n        info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer));\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n    {\r\n      WCHAR *this_proc_env = GetEnvironmentStringsW();\r\n      U64 start_idx = 0;\r\n      for(U64 idx = 0;; idx += 1)\r\n      {\r\n        if(this_proc_env[idx] == 0)\r\n        {\r\n          if(start_idx == idx)\r\n          {\r\n            break;\r\n          }\r\n          else\r\n          {\r\n            String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx);\r\n            String8 string = str8_from_16(arena, string16);\r\n            str8_list_push(arena, &info->environment, string);\r\n            start_idx = idx+1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: set up entity storage\r\n  InitializeCriticalSection(&os_w32_state.entity_mutex);\r\n  os_w32_state.entity_arena = arena_alloc();\r\n  \r\n  //- rjf: call into \"real\" entry point\r\n  main_thread_base_entry_point(argc, argv);\r\n}\r\n\r\n#if BUILD_CONSOLE_INTERFACE\r\nint wmain(int argc, WCHAR **argv)\r\n{\r\n  w32_entry_point_caller(argc, argv);\r\n  return 0;\r\n}\r\n#else\r\nint wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)\r\n{\r\n  w32_entry_point_caller(__argc, __wargv);\r\n  return 0;\r\n}\r\n#endif\r\n"
  },
  {
    "path": "src/metagen/metagen_os/core/win32/metagen_os_core_win32.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_CORE_WIN32_H\r\n#define OS_CORE_WIN32_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes / Libraries\r\n\r\n#include <windows.h>\r\n#include <windowsx.h>\r\n#include <timeapi.h>\r\n#include <tlhelp32.h>\r\n#include <Shlobj.h>\r\n#include <processthreadsapi.h>\r\n#pragma comment(lib, \"user32\")\r\n#pragma comment(lib, \"winmm\")\r\n#pragma comment(lib, \"shell32\")\r\n#pragma comment(lib, \"advapi32\")\r\n#pragma comment(lib, \"rpcrt4\")\r\n#pragma comment(lib, \"shlwapi\")\r\n#pragma comment(lib, \"comctl32\")\r\n#pragma comment(linker,\"\\\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\\\"\") // this is required for loading correct comctl32 dll file\r\n\r\n////////////////////////////////\r\n//~ rjf: File Iterator Types\r\n\r\ntypedef struct OS_W32_FileIter OS_W32_FileIter;\r\nstruct OS_W32_FileIter\r\n{\r\n  HANDLE handle;\r\n  WIN32_FIND_DATAW find_data;\r\n  B32 is_volume_iter;\r\n  String8Array drive_strings;\r\n  U64 drive_strings_iter_idx;\r\n};\r\nStaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Types\r\n\r\ntypedef enum OS_W32_EntityKind\r\n{\r\n  OS_W32_EntityKind_Null,\r\n  OS_W32_EntityKind_Thread,\r\n  OS_W32_EntityKind_Mutex,\r\n  OS_W32_EntityKind_RWMutex,\r\n  OS_W32_EntityKind_ConditionVariable,\r\n}\r\nOS_W32_EntityKind;\r\n\r\ntypedef struct OS_W32_Entity OS_W32_Entity;\r\nstruct OS_W32_Entity\r\n{\r\n  OS_W32_Entity *next;\r\n  OS_W32_EntityKind kind;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      OS_ThreadFunctionType *func;\r\n      void *ptr;\r\n      HANDLE handle;\r\n      DWORD tid;\r\n    } thread;\r\n    CRITICAL_SECTION mutex;\r\n    SRWLOCK rw_mutex;\r\n    CONDITION_VARIABLE cv;\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: State\r\n\r\ntypedef struct OS_W32_State OS_W32_State;\r\nstruct OS_W32_State\r\n{\r\n  Arena *arena;\r\n  \r\n  // rjf: info\r\n  OS_SystemInfo system_info;\r\n  OS_ProcessInfo process_info;\r\n  U64 microsecond_resolution;\r\n  \r\n  // rjf: entity storage\r\n  CRITICAL_SECTION entity_mutex;\r\n  Arena *entity_arena;\r\n  OS_W32_Entity *entity_free;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal OS_W32_State os_w32_state = {0};\r\n\r\n////////////////////////////////\r\n//~ rjf: File Info Conversion Helpers\r\n\r\ninternal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes);\r\ninternal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes);\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Conversion Helpers\r\n\r\ninternal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in);\r\ninternal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in);\r\ninternal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in);\r\ninternal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Functions\r\n\r\ninternal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind);\r\ninternal void os_w32_entity_release(OS_W32_Entity *entity);\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal DWORD os_w32_thread_entry_point(void *ptr);\r\n\r\n#endif // OS_CORE_WIN32_H\r\n"
  },
  {
    "path": "src/metagen/metagen_os/metagen_os_inc.c",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"metagen/metagen_os/core/metagen_os_core.c\"\r\n\r\n#if OS_WINDOWS\r\n# include \"metagen/metagen_os/core/win32/metagen_os_core_win32.c\"\r\n#elif OS_LINUX\r\n# include \"metagen/metagen_os/core/linux/metagen_os_core_linux.c\"\r\n#else\r\n# error OS core layer not implemented for this operating system.\r\n#endif\r\n"
  },
  {
    "path": "src/metagen/metagen_os/metagen_os_inc.h",
    "content": "// Copyright (c) 2024 Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_INC_H\r\n#define OS_INC_H\r\n\r\n#if !defined(OS_FEATURE_GRAPHICAL)\r\n# define OS_FEATURE_GRAPHICAL 0\r\n#endif\r\n\r\n#include \"metagen/metagen_os/core/metagen_os_core.h\"\r\n\r\n#if OS_WINDOWS\r\n# include \"metagen/metagen_os/core/win32/metagen_os_core_win32.h\"\r\n#elif OS_LINUX\r\n# include \"metagen/metagen_os/core/linux/metagen_os_core_linux.h\"\r\n#else\r\n# error OS core layer not implemented for this operating system.\r\n#endif\r\n\r\n#endif // OS_INC_H\r\n"
  },
  {
    "path": "src/msf/msf.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal B32\r\nmsf_check_magic_20(String8 data)\r\n{\r\n  B32 is_msf = data.size >= sizeof(msf_msf20_magic) && str8_match(data, str8_lit(msf_msf20_magic), StringMatchFlag_RightSideSloppy);\r\n  return is_msf;\r\n}\r\n\r\ninternal B32\r\nmsf_check_magic_70(String8 data)\r\n{\r\n  B32 is_msf = data.size >= sizeof(msf_msf70_magic) && str8_match(data, str8_lit(msf_msf70_magic), StringMatchFlag_RightSideSloppy);\r\n  return is_msf;\r\n}\r\n"
  },
  {
    "path": "src/msf/msf.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef MSF_H\r\n#define MSF_H\r\n\r\n////////////////////////////////\r\n//~ rjf: MSF Format Types\r\n\r\n#define MSF_UINT_MAX max_U32\r\ntypedef U32 MSF_UInt;\r\ntypedef S32 MSF_Int;\r\n\r\n#define MSF_BITS_PER_CHAR 8\r\n#define MSF_BITS_PER_WORD (sizeof(MSF_UInt) * MSF_BITS_PER_CHAR)\r\n\r\n#define MSF_PN_MAX MSF_UINT_MAX\r\ntypedef MSF_UInt MSF_PageNumber;\r\n#define MSF_MIN_PAGE_SIZE 512\r\n#define MSF_MAX_PAGE_SIZE 32768\r\n\r\n#define MSF_MAX_STREAM_SIZE       MSF_INT_MAX\r\n#define MSF_DELETED_STREAM_STAMP  MSF_UINT_MAX\r\n#define MSF_STREAM_NUMBER_MAX     max_U16\r\n#define MSF_INVALID_STREAM_NUMBER MSF_STREAM_NUMBER_MAX\r\ntypedef U16 MSF_StreamNumber;\r\n\r\nstatic char msf_msf20_magic[] = \"Microsoft C/C++ program database 2.00\\r\\n\\x1aJG\\0\\0\";\r\nstatic char msf_msf70_magic[] = \"Microsoft C/C++ MSF 7.00\\r\\n\\032DS\\0\\0\";\r\n\r\ntypedef struct MSF_Header20 MSF_Header20;\r\nstruct MSF_Header20\r\n{\r\n  U8  magic[sizeof(msf_msf20_magic)];\r\n  U32 page_size;\r\n  U16 active_fpm;\r\n  U16 page_count;\r\n  U32 stream_table_size;\r\n  U32 unknown;\r\n  U16 root_pn;\r\n};\r\n\r\ntypedef struct MSF_Header70 MSF_Header70;\r\nstruct MSF_Header70\r\n{\r\n  U8             magic[sizeof(msf_msf70_magic)];\r\n  MSF_UInt       page_size;\r\n  MSF_PageNumber active_fpm;\r\n  MSF_PageNumber page_count;\r\n  MSF_UInt       stream_table_size;\r\n  MSF_UInt       unknown; // always set to zero (used to be stream table page number, see SI_PERSIST in msf.cpp)\r\n  MSF_PageNumber root_pn;\r\n};\r\n\r\n////////////////////////////////\r\n\r\ninternal B32 msf_check_magic_20(String8 data);\r\ninternal B32 msf_check_magic_70(String8 data);\r\n\r\n#endif // MSF_H\r\n"
  },
  {
    "path": "src/msf/msf_parse.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: MSF Parser Functions\n\ninternal MSF_RawStreamTable *\nmsf_raw_stream_table_from_data(Arena *arena, String8 msf_data)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  MSF_RawStreamTable *result = 0;\n  \n  //- determine msf type\n  U32 index_size = 0;\n  if (msf_check_magic_20(msf_data)) {\n    index_size = 2;\n  } else if (msf_check_magic_70(msf_data)) {\n    index_size = 4;\n  }\n  \n  if (index_size == 2 || index_size == 4) {\n    //- extract info from header\n    U32 page_size_raw             = 0;\n    U32 whole_file_page_count_raw = 0;\n    U32 directory_size_raw        = 0;\n    U32 directory_super_map_raw   = 0;\n    \n    if (index_size == 2) {\n      MSF_Header20 *header      = (MSF_Header20 *) msf_data.str;\n      page_size_raw             = header->page_size;\n      whole_file_page_count_raw = header->page_count;\n      directory_size_raw        = header->stream_table_size;\n    } else if (index_size == 4) {\n      MSF_Header70 *header      = (MSF_Header70 *) msf_data.str;\n      page_size_raw             = header->page_size;\n      whole_file_page_count_raw = header->page_count;\n      directory_size_raw        = header->stream_table_size;\n      directory_super_map_raw   = header->root_pn;\n    }\n    \n    //- setup important sizes & counts\n    \n    //  (pages)\n    U32 page_size = ClampTop(page_size_raw, msf_data.size);\n    \n    //  (whole file page count)\n    U32 whole_file_page_count_max = CeilIntegerDiv(msf_data.size, page_size);\n    U32 whole_file_page_count     = ClampTop(whole_file_page_count_raw, whole_file_page_count_max);\n    \n    //  (directory)\n    U32 directory_size          = ClampTop(directory_size_raw, msf_data.size);\n    U32 page_count_in_directory = CeilIntegerDiv(directory_size, page_size);\n    \n    //  (map)\n    U32 directory_map_size           = page_count_in_directory * index_size;\n    U32 page_count_in_directory_map = CeilIntegerDiv(directory_map_size, page_size);\n    \n    // Layout of the \"directory\":\n    //\n    // super map: [s1, s2, s3, ...]\n    //       map: s1 -> [i1, i2, i3, ...]; s2 -> [...]; s3 -> [...]; ...\n    // directory: i1 -> [data]; i2 -> [data]; i3 -> [data]; ... i1 -> [data]; ...\n    // \n    // The \"data\" in the directory describes streams:\n    // PDB20:\n    // struct Pdb20StreamSize {\n    //  U32 size;\n    //  U32 unknown; // looks like kind codes or revision counters or something\n    // }\n    // struct {\n    //  U32 stream_count;\n    //  Pdb20StreamSize stream_sizes[stream_count];\n    //  U16 stream_indices[stream_count][...];\n    // }\n    //\n    // PDB70:\n    // struct {\n    //  U32 stream_count;\n    //  U32 stream_sizes[stream_count];\n    //  U32 stream_indices[stream_count][...];\n    // }\n    \n    //- parse stream directory\n    U8 *directory_buf = push_array_no_zero(arena, U8, directory_size);\n    B32 got_directory = 1;\n    \n    {\n      U32  directory_super_map_dummy    = 0;\n      U32 *directory_super_map          = 0;\n      U32  directory_map_page_skip_size = 0;\n      if (index_size == 2) {\n        directory_super_map           = &directory_super_map_dummy;\n        directory_map_page_skip_size = OffsetOf(MSF_Header20, stream_table_size);\n      } else {\n        U64 super_map_off   = OffsetOf(MSF_Header70, root_pn);\n        directory_super_map = (U32 *) (msf_data.str + super_map_off);\n      }\n      \n      U32 max_index_count_in_map_page = (page_size - directory_map_page_skip_size) / index_size;\n      \n      // for each index in super map ...\n      U8  *out_ptr       = directory_buf;\n      U32 *super_map_ptr = directory_super_map;\n      for (U32 i = 0; i < page_count_in_directory_map; ++i, ++super_map_ptr) {\n        U32 directory_map_page_index = *super_map_ptr;\n        if (directory_map_page_index >= whole_file_page_count) {\n          got_directory = 0;\n          goto parse_directory_done;\n        }\n        \n        U64 directory_map_page_off  = ((U64) directory_map_page_index) * page_size;\n        U8 *directory_map_page_base = msf_data.str + directory_map_page_off;\n        \n        // clamp index count by end of directory\n        U32 index_count;\n        {\n          U32 directory_pos            = (U32)(out_ptr - directory_buf);\n          U32 remaining_size           = directory_size - directory_pos;\n          U32 remaining_map_page_count = CeilIntegerDiv(remaining_size, page_size);\n          index_count = ClampTop(max_index_count_in_map_page, remaining_map_page_count);\n        }\n        \n        // for each index in map ...\n        U8 *map_ptr = directory_map_page_base + directory_map_page_skip_size;\n        for (U32 j = 0; j < index_count; ++j, map_ptr += index_size) {\n          \n          // read index\n          U32 directory_page_index = 0;\n          if (index_size == 4) {\n            directory_page_index = *(U32 *) map_ptr;\n          } else {\n            directory_page_index = *(U16 *) map_ptr;\n          }\n          if (directory_page_index >= whole_file_page_count) {\n            got_directory = 0;\n            goto parse_directory_done;\n          }\n          \n          U64 directory_page_off  = ((U64) directory_page_index) * page_size;\n          U8 *directory_page_base = msf_data.str + directory_page_off;\n          \n          // clamp copy size by end of directory\n          U32 copy_size;\n          {\n            U32 directory_pos  = (U32) (out_ptr - directory_buf);\n            U32 remaining_size = directory_size - directory_pos;\n            copy_size          = ClampTop(page_size, remaining_size);\n          }\n          \n          // copy page data\n          MemoryCopy(out_ptr, directory_page_base, copy_size);\n          out_ptr += copy_size;\n        }\n        \n      }\n      \n      parse_directory_done:;\n    }\n    \n    //- parse streams from directory\n    U32            stream_count = 0;\n    B32            got_streams  = 0;\n    MSF_RawStream *streams      = 0;\n    \n    if (got_directory) {\n      got_streams = 1;\n      \n      // read stream count\n      U32 stream_count_raw = *(U32 *) directory_buf;\n      \n      // setup counts, sizes, and offsets\n      U32 size_of_stream_entry   = index_size == 2 ? 8 : 4;\n      U32 stream_count_max       = (directory_size - 4) / size_of_stream_entry;\n      U32 stream_count__inner    = ClampTop(stream_count_raw, stream_count_max);\n      U32 all_stream_entries_off = 4;\n      U32 all_indices_off        = all_stream_entries_off + (stream_count__inner * size_of_stream_entry);\n      \n      // set output buffer and count\n      stream_count = stream_count__inner;\n      streams      = push_array_no_zero(arena, MSF_RawStream, stream_count);\n      \n      // iterate sizes and indices in lock step\n      U32            entry_cursor = all_stream_entries_off;\n      U32            index_cursor = all_indices_off;\n      MSF_RawStream *stream_ptr   = streams;\n      for (U32 i = 0; i < stream_count; ++i) {\n        // read stream size\n        U32 stream_size_raw = *(U32 *) (directory_buf + entry_cursor);\n        if (stream_size_raw == MSF_DELETED_STREAM_STAMP) {\n          stream_size_raw = 0;\n        }\n        \n        // compute page count\n        U32 stream_page_count_raw = CeilIntegerDiv(stream_size_raw, page_size);\n        U32 stream_page_count_max = (directory_size - index_cursor) / index_size;\n        U32 stream_page_count     = ClampTop(stream_page_count_raw, stream_page_count_max);\n        U32 stream_size           = ClampTop(stream_size_raw, stream_page_count*page_size);\n        \n        // copy stream data\n        stream_ptr->size       = stream_size;\n        stream_ptr->page_count = stream_page_count;\n        if (index_size == 4) {\n          stream_ptr->u.page_indices_u32 = (U32 *)(directory_buf + index_cursor);\n        } else {\n          stream_ptr->u.page_indices_u16 = (U16 *)(directory_buf + index_cursor);\n        }\n        \n        // advance cursors\n        entry_cursor += size_of_stream_entry;\n        index_cursor += stream_page_count * index_size;\n        stream_ptr   += 1;\n      }\n    }\n    \n    if (got_streams) {\n      result                   = push_array(arena, MSF_RawStreamTable, 1);\n      result->total_page_count = whole_file_page_count;\n      result->index_size       = index_size;\n      result->page_size        = page_size;\n      result->stream_count     = stream_count;\n      result->streams          = streams;\n    }\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nmsf_data_from_stream_number(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn)\n{\n  ProfBeginFunction();\n  String8 result = {0};\n  if(sn < st->stream_count)\n  {\n    MSF_RawStream stream = st->streams[sn];\n    U8 *stream_buf     = push_array_no_zero(arena, U8, stream.size);\n    U8 *stream_out_ptr = stream_buf;\n    for (U32 i = 0; i < stream.page_count; ++i) {\n      U64 page_idx;\n      if (st->index_size == 4) {\n        page_idx = stream.u.page_indices_u32[i];\n      } else {\n        page_idx = stream.u.page_indices_u16[i];\n      }\n      \n      U64 stream_page_off = (U64)page_idx * st->page_size;\n      if (stream_page_off + st->page_size > msf_data.size) {\n        break;\n      }\n      \n      U8 *stream_page_base = msf_data.str + stream_page_off;\n      \n      // clamp copy size by end of stream\n      U32 stream_pos     = (U32) (stream_out_ptr - stream_buf);\n      U32 remaining_size = stream.size - stream_pos;\n      U32 copy_size      = ClampTop(st->page_size, remaining_size);\n      \n      // copy page data\n      MemoryCopy(stream_out_ptr, stream_page_base, copy_size);\n      stream_out_ptr += copy_size;\n    }\n    \n    U64 copy_size = (U64)(stream_out_ptr - stream_buf);\n    \n    U64 unused_buf_size = stream.size - copy_size;\n    arena_pop(arena, unused_buf_size);\n    \n    result = str8(stream_buf, copy_size);\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal MSF_Parsed *\nmsf_parsed_from_data(Arena *arena, String8 msf_data)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  MSF_Parsed *result = 0;\n  \n  MSF_RawStreamTable *st = msf_raw_stream_table_from_data(scratch.arena, msf_data);\n  if (st) {\n    String8 *streams = push_array_no_zero(arena, String8, st->stream_count);\n    for (MSF_StreamNumber sn = 0; sn < st->stream_count; ++sn) {\n      streams[sn] = msf_data_from_stream_number(arena, msf_data, st, sn);\n    }\n    \n    result               = push_array_no_zero(arena, MSF_Parsed, 1);\n    result->streams      = streams;\n    result->stream_count = st->stream_count;\n    result->page_size   = st->page_size;\n    result->page_count  = st->total_page_count;\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nmsf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn)\n{\n  String8 result = {0};\n  if(sn < msf->stream_count)\n  {\n    result = msf->streams[sn];\n  }\n  return(result);\n}\n"
  },
  {
    "path": "src/msf/msf_parse.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef MSF_PARSE_H\n#define MSF_PARSE_H\n\n////////////////////////////////\n//~ rjf: MSF Parser Helper Types\n\ntypedef struct MSF_RawStream MSF_RawStream;\nstruct MSF_RawStream\n{\n  U64 size;\n  U64 page_count;\n  union {\n    U32 *page_indices_u32;\n    U16 *page_indices_u16;\n  } u;\n};\n\ntypedef struct MSF_RawStreamTable MSF_RawStreamTable;\nstruct MSF_RawStreamTable\n{\n  U64            total_page_count;\n  U64            index_size;\n  U64            page_size;\n  U64            stream_count;\n  MSF_RawStream *streams;\n};\n\ntypedef struct MSF_Parsed MSF_Parsed;\nstruct MSF_Parsed\n{\n  String8 *streams;\n  U64      stream_count;\n  U64      page_size;\n  U64      page_count;\n};\n\n////////////////////////////////\n//~ rjf: MSF Parser Functions\n\ninternal MSF_RawStreamTable* msf_raw_stream_table_from_data(Arena *arena, String8 msf_data);\ninternal String8             msf_data_from_stream_number(Arena *arena, String8 msf_data, MSF_RawStreamTable *st, MSF_StreamNumber sn);\ninternal MSF_Parsed*         msf_parsed_from_data(Arena *arena, String8 msf_data);\ninternal String8             msf_data_from_stream(MSF_Parsed *msf, MSF_StreamNumber sn);\n\n#endif // MSF_PARSE_H\n"
  },
  {
    "path": "src/msvc_crt/msvc_crt.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8\nmsvcrt_ctr_entry_from_user_entry(String8 user_entry)\n{\n  String8 crt_entry = {0};\n  if (str8_match_lit(\"wmain\", user_entry, 0)) {\n    crt_entry = str8_lit(\"wmainCRTStartup\");\n  } else if (str8_match_lit(\"main\", user_entry, 0)) {\n    crt_entry = str8_lit(\"mainCRTStartup\");\n  } else if (str8_match_lit(\"WinMain\", user_entry, 0)) {\n    crt_entry = str8_lit(\"WinMainCRTStartup\");\n  } else if (str8_match_lit(\"wWinMain\", user_entry, 0)) {\n    crt_entry = str8_lit(\"wWinMainCRTStartup\");\n  }\n  return crt_entry;\n}\n\ninternal String8\nmscrt_delay_load_helper_name_from_machine(COFF_MachineType machine)\n{\n  String8 delay_load_helper_name = str8_zero();\n  switch (machine) {\n  case COFF_MachineType_Unknown: break;\n  case COFF_MachineType_X86: delay_load_helper_name = str8_cstring(MSCRT_DELAY_LOAD_HELPER2_X86_SYMBOL_NAME); break;\n  case COFF_MachineType_X64: delay_load_helper_name = str8_cstring(MSCRT_DELAY_LOAD_HELPER2_SYMBOL_NAME);     break;\n  default: { NotImplemented; } break;\n  }\n  return delay_load_helper_name;\n}\n\ninternal U64\nmscrt_parse_func_info(Arena              *arena,\n                      String8             raw_data,\n                      U64                 section_count,\n                      COFF_SectionHeader *sections,\n                      U64                 off,\n                      MSCRT_FuncInfo     *func_info)\n{\n  U64 cursor = off;\n  \n  U32 handler_data_voff = 0;\n  cursor += str8_deserial_read_struct(raw_data, cursor, &handler_data_voff);\n  \n  // TODO: what is this? padding?\n  U32 unknown = 0;\n  cursor += str8_deserial_read_struct(raw_data, cursor, &unknown);\n  \n  // read function info\n  U64 handler_data_foff = coff_foff_from_voff(sections, section_count, handler_data_voff);\n  \n  MSCRT_FuncInfo32 func_info32 = {0};\n  str8_deserial_read_struct(raw_data, handler_data_foff, &func_info32);\n  \n  // unwind map\n  MSCRT_UnwindMap32 *unwind_map      = push_array(arena, MSCRT_UnwindMap32, func_info32.max_state);\n  U64                unwind_map_foff = coff_foff_from_voff(sections, section_count, func_info32.unwind_map_voff);\n  cursor += str8_deserial_read_array(raw_data, unwind_map_foff, &unwind_map[0], func_info32.max_state);\n  \n  // read ip states\n  MSCRT_IPState32 *ip_map      = push_array(arena, MSCRT_IPState32, func_info32.ip_map_count);\n  U64              ip_map_foff = coff_foff_from_voff(sections, section_count, func_info32.ip_map_voff);\n  str8_deserial_read_array(raw_data, ip_map_foff, &ip_map[0], func_info32.ip_map_count);\n  \n  // read try map\n  MSCRT_TryMapBlock *try_block_map = push_array(arena, MSCRT_TryMapBlock, func_info32.try_block_map_count);\n  U64                try_map_foff  = coff_foff_from_voff(sections, section_count, func_info32.try_block_map_voff);\n  for (U32 imap = 0; imap < func_info32.try_block_map_count; ++imap) {\n    MSCRT_TryMapBlock32 map32 = {0};\n    str8_deserial_read_struct(raw_data, try_map_foff + imap*sizeof(map32), &map32);\n    \n    // convert try map to in-memory version\n    MSCRT_TryMapBlock *map    = &try_block_map[imap];\n    map->try_low              = map32.try_low;\n    map->try_high             = map32.try_high;\n    map->catch_high           = map32.catch_high;\n    map->catch_handlers_count = map32.catch_handlers_count;\n    map->catch_handlers       = push_array(arena, MSCRT_EhHandlerType32, map32.catch_handlers_count);\n    \n    // read handlers\n    U64 catch_handlers_foff = coff_foff_from_voff(sections, section_count, map32.catch_handlers_voff);\n    str8_deserial_read_array(raw_data, catch_handlers_foff, &map->catch_handlers[0], map->catch_handlers_count);\n  }\n  \n  // read exception spec list\n  MSCRT_ExceptionSpecTypeList es_type_list = {0};\n  if (func_info32.es_type_list_voff) {\n    MSCRT_ExceptionSpecTypeList32 es_list32    = {0};\n    U64                           es_list_foff = coff_foff_from_voff(sections, section_count, func_info32.es_type_list_voff);\n    str8_deserial_read_struct(raw_data, es_list_foff, &es_list32);\n    \n    es_type_list.count    = es_list32.count;\n    es_type_list.handlers = push_array(arena, MSCRT_EhHandlerType32, es_list32.count);\n    \n    U64 handlers_foff = coff_foff_from_voff(sections, section_count, es_list32.handlers_voff);\n    str8_deserial_read_array(raw_data, handlers_foff, &es_type_list.handlers[0], es_type_list.count);\n  }\n  \n  // pack result\n  func_info->magic                      = func_info32.magic;\n  func_info->max_state                  = func_info32.max_state;\n  func_info->unwind_map                 = unwind_map;\n  func_info->try_block_map_count        = func_info32.try_block_map_count;\n  func_info->try_block_map              = try_block_map;\n  func_info->ip_map_count               = func_info32.ip_map_count;\n  func_info->ip_map                     = ip_map;\n  func_info->frame_offset_unwind_helper = func_info32.frame_offset_unwind_helper;\n  func_info->es_type_list               = es_type_list;\n  func_info->eh_flags                   = func_info32.eh_flags;\n  \n  U64 parse_size = (cursor - off);\n  return parse_size;\n}\n\n////////////////////////////////\n\ninternal U64\nmscrt_v4_parse_u32(String8 raw_data, U64 offset, U32 *uint_out)\n{\n  U64 cursor = offset;\n  \n  U8 one = 0;\n  cursor += str8_deserial_read_struct(raw_data, cursor, &one);\n  \n  if ((one & 0xF) == 15) {\n    U8 two = 0, three = 0, four = 0, five = 0;\n    cursor += str8_deserial_read_struct(raw_data, cursor, &two);\n    cursor += str8_deserial_read_struct(raw_data, cursor, &three);\n    cursor += str8_deserial_read_struct(raw_data, cursor, &four);\n    cursor += str8_deserial_read_struct(raw_data, cursor, &five);\n    *uint_out = (U32)two | ((U32)three << 8) | ((U32)four << 16) | ((U32)five << 24);\n  } else if ((one & 0xF) == 7) {\n    U8 two = 0, three = 0, four = 0;\n    cursor += str8_deserial_read_struct(raw_data, cursor, &two);\n    cursor += str8_deserial_read_struct(raw_data, cursor, &three);\n    cursor += str8_deserial_read_struct(raw_data, cursor, &four);\n    *uint_out = ((U32)one >> 4) | ((U32)two << 4) | ((U32)three << 12) | ((U32)four << 20);\n  } else if ((one & 0x7) == 3) {\n    U8 two = 0, three = 0;\n    cursor += str8_deserial_read_struct(raw_data, cursor, &two);\n    cursor += str8_deserial_read_struct(raw_data, cursor, &three);\n    *uint_out = ((U32)one >> 3) | ((U32)two << 5) | ((U32)three << 13);\n  } else if ((one & 0x3) == 1) {\n    U8 two = 0;\n    cursor += str8_deserial_read_struct(raw_data, cursor, &two);\n    *uint_out = ((U32)one >> 2) | ((U32)two << 6);\n  } else {\n    *uint_out = one >> 1;\n  }\n  \n  U64 read_size = cursor - offset;\n  return read_size;\n}\n\ninternal U64\nmscrt_v4_parse_s32(String8 raw_data, U64 offset, S32 *int_out)\n{\n  return str8_deserial_read_struct(raw_data, offset, int_out);\n}\n\ninternal U64\nmscrt_parse_handler_type_v4(String8 raw_data, U64 offset, U64 func_voff, MSCRT_EhHandlerTypeV4 *handler)\n{\n  U64 cursor = offset;\n  \n  cursor += str8_deserial_read_struct(raw_data, cursor, &handler->flags);\n  if (handler->flags & MSCRT_EhHandlerV4Flag_Adjectives) {\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &handler->adjectives);\n  }\n  if (handler->flags & MSCRT_EhHandlerV4Flag_DispType) {\n    cursor += mscrt_v4_parse_s32(raw_data, cursor, &handler->type_voff);\n  }\n  if (handler->flags & MSCRT_EhHandlerV4Flag_DispCatchObj) {\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &handler->catch_obj_voff);\n  }\n  cursor += mscrt_v4_parse_s32(raw_data, cursor, &handler->catch_code_voff);\n  \n  U32 cont_type = (handler->flags & MSCRT_EhHandlerV4Flag_ContVOffMask) >> MSCRT_EhHandlerV4Flag_ContVOffShift;\n  if (handler->flags & MSCRT_EhHandlerV4Flag_ContIsVOff) {\n    switch (cont_type) {\n      case MSCRT_ContV4Type_NoMetadata: break;\n      case MSCRT_ContV4Type_OneFuncRelAddr: {\n        S32 v = 0;\n        cursor += mscrt_v4_parse_s32(raw_data, cursor, &v);\n        handler->catch_funclet_cont_addr[0]    = (U64)v;\n        handler->catch_funclet_cont_addr_count = 1;\n      } break;\n      case MSCRT_ContV4Type_TwoFuncRelAddr: {\n        S32 v1 = 0, v2 = 0;\n        cursor += mscrt_v4_parse_s32(raw_data, cursor, &v1);\n        cursor += mscrt_v4_parse_s32(raw_data, cursor, &v2);\n        handler->catch_funclet_cont_addr[0]    = (U64)v1;\n        handler->catch_funclet_cont_addr[1]    = (U64)v2;\n        handler->catch_funclet_cont_addr_count = 2;\n      } break;\n    }\n  } else {\n    switch (cont_type) {\n      case MSCRT_ContV4Type_NoMetadata: {\n      } break;\n      case MSCRT_ContV4Type_OneFuncRelAddr: {\n        U32 v = 0;\n        cursor += mscrt_v4_parse_u32(raw_data, cursor, &v);\n        handler->catch_funclet_cont_addr[0]    = func_voff + (U64)v;\n        handler->catch_funclet_cont_addr_count = 1;\n      } break;\n      case MSCRT_ContV4Type_TwoFuncRelAddr: {\n        U32 v1 = 0, v2 = 0;\n        cursor += mscrt_v4_parse_u32(raw_data, cursor, &v1);\n        cursor += mscrt_v4_parse_u32(raw_data, cursor, &v2);\n        handler->catch_funclet_cont_addr[0]    = func_voff + (U64)v1;\n        handler->catch_funclet_cont_addr[1]    = func_voff + (U64)v2;\n        handler->catch_funclet_cont_addr_count = 2;\n      } break;\n    }\n  }\n  \n  U64 read_size = cursor - offset;\n  return read_size;\n}\n\ninternal U64\nmscrt_parse_handler_type_v4_array(Arena                      *arena,\n                                  String8                     raw_data,\n                                  U64                         offset,\n                                  U64                         func_voff,\n                                  MSCRT_EhHandlerTypeV4Array *array_out)\n{\n  U64 cursor = offset;\n  U32 count  = 0;\n  cursor += mscrt_v4_parse_u32(raw_data, cursor, &count);\n  \n  MSCRT_EhHandlerTypeV4 *handlers = 0;\n  if (count) {\n    handlers = push_array(arena, MSCRT_EhHandlerTypeV4, count);\n    for (U32 i = 0; i < count; ++i) {\n      cursor += mscrt_parse_handler_type_v4(raw_data, cursor, func_voff, &handlers[i]);\n    }\n  }\n  \n  array_out->count = count;\n  array_out->v     = handlers;\n  \n  U64 read_size = cursor - offset;\n  return read_size;\n}\n\ninternal U64\nmscrt_parse_unwind_v4_entry(String8 raw_data, U64 offset, MSCRT_UnwindEntryV4 *entry_out)\n{\n  U64 cursor = offset;\n  \n  U32 type_and_next_off = 0;\n  cursor += mscrt_v4_parse_u32(raw_data, cursor, &type_and_next_off);\n  \n  entry_out->type     = type_and_next_off & 0x3;\n  entry_out->next_off = type_and_next_off >> 2;\n  \n  switch (entry_out->type) {\n    case MSCRT_UnwindMapV4Type_DtorWithObj:\n    case MSCRT_UnwindMapV4Type_DtorWithPtrToObj: {\n      cursor += mscrt_v4_parse_s32(raw_data, cursor, &entry_out->action);\n      cursor += mscrt_v4_parse_u32(raw_data, cursor, &entry_out->object);\n    } break;\n    case MSCRT_UnwindMapV4Type_VOFF: {\n      cursor += mscrt_v4_parse_s32(raw_data, cursor, &entry_out->action);\n    } break;\n    case MSCRT_UnwindMapV4Type_NoUW: {\n      // no action and/or object is associated with this type\n    } break;\n    default: {\n      Assert(!\"unknown unwind entry type\");\n    } break;\n  }\n  \n  U64 read_size = cursor - offset;\n  return read_size;\n}\n\ninternal U64\nmscrt_parse_unwind_map_v4(Arena *arena, String8 raw_data, U64 off, MSCRT_UnwindMapV4 *map_out)\n{\n  U64 cursor = off;\n  cursor += mscrt_v4_parse_u32(raw_data, cursor, &map_out->count);\n  map_out->v = push_array(arena, MSCRT_UnwindEntryV4, map_out->count);\n  for (U32 i = 0; i < map_out->count; ++i) {\n    cursor += mscrt_parse_unwind_v4_entry(raw_data, cursor, &map_out->v[i]);\n  }\n  U64 read_size = cursor - off;\n  return read_size;\n}\n\ninternal U64\nmscrt_parse_try_block_map_array_v4(Arena                   *arena,\n                                   String8                  raw_data,\n                                   U64                      off,\n                                   U64                      section_count,\n                                   COFF_SectionHeader      *sections,\n                                   U64                      func_voff,\n                                   MSCRT_TryBlockMapV4Array *map_out)\n{\n  U64 cursor = off;\n  \n  U32 try_block_map_count = 0;\n  cursor += mscrt_v4_parse_u32(raw_data, cursor, &try_block_map_count);\n  \n  MSCRT_TryBlockMapV4 *try_block_map = push_array(arena, MSCRT_TryBlockMapV4, try_block_map_count);\n  for (U32 itry = 0; itry < try_block_map_count; ++itry) {\n    MSCRT_TryBlockMapV4 *try_block = &try_block_map[itry];\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &try_block->try_low);\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &try_block->try_high);\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &try_block->catch_high);\n    \n    S32 handler_array_voff = 0;\n    cursor += mscrt_v4_parse_s32(raw_data, cursor, &handler_array_voff);\n    \n    U64 handler_array_foff = coff_foff_from_voff(sections, section_count, (U32)handler_array_voff);\n    mscrt_parse_handler_type_v4_array(arena, raw_data, handler_array_foff, func_voff, &try_block->handlers);\n  }\n  \n  map_out->count = try_block_map_count;\n  map_out->v     = try_block_map;\n  \n  U64 read_size = cursor - off;\n  return read_size;\n}\n\ninternal U64\nmscrt_parse_ip2state_map_v4(Arena              *arena,\n                            String8             raw_data,\n                            U64                 off,\n                            U64                 func_voff,\n                            MSCRT_IP2State32V4 *ip2state_map_out)\n{\n  U64 cursor = off;\n  \n  U32 count = 0;\n  cursor += mscrt_v4_parse_u32(raw_data, cursor, &count);\n  \n  U32 *voffs  = push_array(arena, U32, count);\n  S32 *states = push_array(arena, S32, count);\n  \n  U32 prev_voff = func_voff;\n  for (U32 i = 0; i < count; ++i) {\n    // virtual offsets are encoded as deltas\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &voffs[i]);\n    voffs[i] += prev_voff;\n    prev_voff = voffs[i];\n    \n    // states are encoded with +1 to avoid encoding negative integers\n    U32 encoded_state = 0;\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &encoded_state);\n    states[i] = (S32)encoded_state - 1;\n  }\n  \n  ip2state_map_out->count  = count;\n  ip2state_map_out->voffs  = voffs;\n  ip2state_map_out->states = states;\n  \n  U64 read_size = cursor - off;\n  return read_size;\n}\n\ninternal U64\nmscrt_parse_func_info_v4(Arena                     *arena,\n                         String8                 raw_data,\n                         U64                     section_count,\n                         COFF_SectionHeader     *sections,\n                         U64                     off,\n                         U64                     func_voff,\n                         MSCRT_ParsedFuncInfoV4 *func_info_out)\n{\n  U64 cursor = off;\n  \n  MSCRT_FuncInfo32V4 func_info = {0};\n  cursor += str8_deserial_read_struct(raw_data, cursor, &func_info.header);\n  if (func_info.header & MSCRT_FuncInfoV4Flag_IsBBT) {\n    cursor += mscrt_v4_parse_u32(raw_data, cursor, &func_info.bbt_flags);\n  }\n  if (func_info.header & MSCRT_FuncInfoV4Flag_UnwindMap) {\n    cursor += mscrt_v4_parse_s32(raw_data, cursor, &func_info.unwind_map_voff);\n  }\n  if (func_info.header & MSCRT_FuncInfoV4Flag_TryBlockMap) {\n    cursor += mscrt_v4_parse_s32(raw_data, cursor, &func_info.try_block_map_voff);\n  }\n  if (func_info.header & MSCRT_FuncInfoV4Flag_IsSeparated) {\n    // TODO: separted IP state map\n    NotImplemented;\n  } else {\n    cursor += mscrt_v4_parse_s32(raw_data, cursor, &func_info.ip_to_state_map_voff);\n  }\n  if (func_info.header & MSCRT_FuncInfoV4Flag_IsCatch) {\n    cursor += mscrt_v4_parse_s32(raw_data, cursor, &func_info.wrt_frame_establisher_voff);\n  }\n  \n  MSCRT_UnwindMapV4 unwind_map = {0};\n  if (func_info.header & MSCRT_FuncInfoV4Flag_UnwindMap) {\n    U64 unwind_map_foff = coff_foff_from_voff(sections, section_count, func_info.unwind_map_voff);\n    mscrt_parse_unwind_map_v4(arena, raw_data, unwind_map_foff, &unwind_map);\n  }\n  \n  MSCRT_TryBlockMapV4Array try_block_map = {0};\n  if (func_info.header & MSCRT_FuncInfoV4Flag_TryBlockMap) {\n    U64 try_block_map_foff = coff_foff_from_voff(sections, section_count, func_info.try_block_map_voff);\n    mscrt_parse_try_block_map_array_v4(arena, raw_data, try_block_map_foff, section_count, sections, func_voff, &try_block_map);\n  }\n  \n  MSCRT_IP2State32V4 ip2state_map = {0};\n  if (func_info.header & MSCRT_FuncInfoV4Flag_IsSeparated) {\n    Assert(!\"TODO: separated ip2state map\");\n  } else {\n    U64 ip_to_state_map_foff = coff_foff_from_voff(sections, section_count, func_info.ip_to_state_map_voff);\n    mscrt_parse_ip2state_map_v4(arena, raw_data, ip_to_state_map_foff, func_voff, &ip2state_map);\n  }\n  \n  func_info_out->header        = func_info.header;\n  func_info_out->bbt_flags     = func_info.bbt_flags;\n  func_info_out->try_block_map = try_block_map;\n  func_info_out->unwind_map    = unwind_map;\n  func_info_out->ip2state_map  = ip2state_map;\n  \n  U64 read_size = cursor - off;\n  return read_size;\n}\n\n////////////////////////////////\n\ninternal Rng1U64List\nmscrt_catch_blocks_from_data_x8664(Arena              *arena,\n                                   String8             raw_data,\n                                   U64                 section_count,\n                                   COFF_SectionHeader *sections,\n                                   Rng1U64             except_frange)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  Rng1U64List result = {0};\n  \n  String8        raw_pdata   = str8_substr(raw_data, except_frange);\n  U64            pdata_count = raw_pdata.size / sizeof(PE_IntelPdata);\n  PE_IntelPdata *src_pdata   = (PE_IntelPdata *)raw_pdata.str;\n  PE_IntelPdata *opl_pdata   = src_pdata + pdata_count;\n  \n  for (PE_IntelPdata *pdata = src_pdata; pdata < opl_pdata; ++pdata) {\n    U64            uwinfo_foff = coff_foff_from_voff(sections, section_count, pdata->voff_unwind_info);\n    PE_UnwindInfo *uwinfo      = str8_deserial_get_raw_ptr(raw_data, uwinfo_foff, sizeof(*uwinfo));\n    \n    U8  flags            = PE_UNWIND_INFO_FLAGS_FROM_HDR(uwinfo->header);\n    B32 is_chained       = !!(flags & PE_UnwindInfoFlag_CHAINED);\n    B32 has_handler_data = !is_chained && ((flags & (PE_UnwindInfoFlag_EHANDLER | PE_UnwindInfoFlag_UHANDLER)) != 0);\n    \n    if (has_handler_data) {\n      Temp temp = temp_begin(scratch.arena);\n      \n      U32 actual_code_count = PE_UNWIND_INFO_GET_CODE_COUNT(uwinfo->codes_num);\n      U64 handler_data_foff = uwinfo_foff + sizeof(PE_UnwindInfo) + actual_code_count * sizeof(PE_UnwindCode);\n      U32 handler_voff      = *(U32 *)str8_deserial_get_raw_ptr(raw_data, handler_data_foff, sizeof(handler_voff));\n      \n      String8 handler_name = str8_zero();\n      /* TODO:\n      {\n        UnitID     uid  = syms_group_uid_from_voff__accelerated(group, handler_voff);\n        UnitAccel *unit = syms_group_unit_from_uid(group, uid);\n        SYMS_SymbolID   sid  = syms_group_proc_sid_from_uid_voff__accelerated(group, uid, handler_voff);\n        handler_name = syms_group_symbol_name_from_sid(temp.arena, group, unit, sid);\n      }\n      */\n      \n      B32 is_handler_v3_or_below = str8_match_lit(\"__CxxFrameHandler3\",  handler_name, 0) ||\n        str8_match_lit(\"__GSHandlerCheck_EH\", handler_name, 0);\n      if (is_handler_v3_or_below) {\n        U64            func_info_foff = handler_data_foff + sizeof(handler_voff);\n        MSCRT_FuncInfo func_info      = {0};\n        mscrt_parse_func_info(temp.arena, raw_data, section_count, sections, func_info_foff, &func_info);\n        \n        for (U32 itry = 0; itry < func_info.try_block_map_count; ++itry) {\n          MSCRT_TryMapBlock *try_block = &func_info.try_block_map[itry];\n          for (U32 icatch = 0; icatch < try_block->catch_handlers_count; ++icatch) {\n            MSCRT_EhHandlerType32 *catch_block     = &try_block->catch_handlers[icatch];\n            U64                    catch_pdata_off = pe_pdata_off_from_voff__binary_search_x8664(raw_pdata, catch_block->catch_handler_voff);\n            PE_IntelPdata         *catch_pdata     = str8_deserial_get_raw_ptr(raw_pdata, catch_pdata_off, sizeof(*catch_pdata));\n            rng1u64_list_push(arena, &result, rng_1u64(catch_pdata->voff_first, catch_pdata->voff_one_past_last));\n          }\n        }\n        goto next;\n      }\n      \n      B32 is_handler_v4 = str8_match_lit(\"__CxxFrameHandler4\", handler_name, 0) ||\n        str8_match_lit(\"__GSHandlerCheck_EH4\", handler_name, 0);\n      if (is_handler_v4) {\n        U32                   func_info_voff = *(U32 *)str8_deserial_get_raw_ptr(raw_data, handler_data_foff + sizeof(handler_voff), sizeof(func_info_voff));\n        U64                   func_info_foff = coff_foff_from_voff(sections, section_count, func_info_voff);\n        MSCRT_ParsedFuncInfoV4 func_info     = {0};\n        mscrt_parse_func_info_v4(temp.arena, raw_data, section_count, sections, func_info_foff, pdata->voff_first, &func_info);\n        \n        for (U32 itry = 0; itry < func_info.try_block_map.count; ++itry) {\n          MSCRT_TryBlockMapV4 *try_block = &func_info.try_block_map.v[itry];\n          for (U32 icatch = 0; icatch < try_block->handlers.count; ++icatch) {\n            MSCRT_EhHandlerTypeV4 *catch_block     = &try_block->handlers.v[icatch];\n            U64                    catch_pdata_off = pe_pdata_off_from_voff__binary_search_x8664(raw_pdata, catch_block->catch_code_voff);\n            PE_IntelPdata         *catch_pdata     = str8_deserial_get_raw_ptr(raw_pdata, catch_pdata_off, sizeof(*catch_pdata));\n            rng1u64_list_push(arena, &result, rng_1u64(catch_pdata->voff_first, catch_pdata->voff_one_past_last));\n          }\n        }\n        goto next;\n      }\n      \n      next:;\n      temp_end(temp);\n    }\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: Enum -> String\n\ninternal String8\nmscrt_string_from_eh_adjectives(Arena *arena, MSCRT_EhHandlerTypeFlags adjectives)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List adj_list = {0};\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsConst) {\n    str8_list_pushf(scratch.arena, &adj_list, \"Const\");\n  }\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsVolatile) {\n    str8_list_pushf(scratch.arena, &adj_list, \"Volatile\");\n  }\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsUnaligned) {\n    str8_list_pushf(scratch.arena, &adj_list, \"Unaligned\");\n  }\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsReference) {\n    str8_list_pushf(scratch.arena, &adj_list, \"Reference\");\n  }\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsResumable) {\n    str8_list_pushf(scratch.arena, &adj_list, \"Resumable\");\n  }\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsStdDotDot) {\n    str8_list_pushf(scratch.arena, &adj_list, \"StdDotDot\");\n  }\n  if (adjectives & MSCRT_EhHandlerTypeFlag_IsComplusEH) {\n    str8_list_pushf(scratch.arena, &adj_list, \"ComplusEH\");\n  }\n  String8 result = str8_list_join(arena, &adj_list, &(StringJoin){.sep=str8_lit(\", \")});\n  scratch_end(scratch);\n  return result;\n}\n"
  },
  {
    "path": "src/msvc_crt/msvc_crt.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef MSVC_CRT\n#define MSVC_CRT\n\n////////////////////////////////\n// CRT Symbols\n\n// _load_config_used points to PE_LoadConfig32/PE_LoadConfig64\n// and symbols below are used to patch patricual fields of the struct.\n#define MSCRT_LOAD_CONFIG_SYMBOL_NAME         \"_load_config_used\"\n#define MSCRT_ENCLAVE_CONFIG_SYMBOL_NAME      \"__enclave_config\"\n#define MSCRT_GUARD_FLAGS_SYMBOL_NAME         \"__guard_flags\"\n#define MSCRT_GUARD_FIDS_TABLE_SYMBOL_NAME    \"__guard_fids_table\"\n#define MSCRT_GUARD_FIDS_COUNT_SYMBOL_NAME    \"__guard_fids_count\"\n#define MSCRT_GUARD_IAT_TABLE_SYMBOL_NAME     \"__guard_iat_table\"\n#define MSCRT_GUARD_IAT_COUNT_SYMBOL_NAME     \"__guard_iat_count\"\n#define MSCRT_GUARD_LONGJMP_TABLE_SYMBOL_NAME \"__guard_longjmp_table\"\n#define MSCRT_GUARD_LONGJMP_COUNT_SYMBOL_NAME \"__guard_longjmp_count\"\n#define MSCRT_GUARD_EHCONT_TABLE_SYMBOL_NAME  \"__guard_eh_cont_table\"\n#define MSCRT_GUARD_EHCONT_COUNT_SYMBOL_NAME  \"__guard_eh_cont_count\"\n\n// x86 load config fields\n#define MSCRT_SAFE_SE_HANDLER_TABLE_SYMBOL_NAME \"__safe_se_handler_table\"\n#define MSCRT_SAFE_SE_HANDLER_COUNT_SYMBOL_NAME \"__safe_se_handler_count\"\n\n// load symbols from delayimp.lib\n#define MSCRT_DELAY_LOAD_HELPER2_SYMBOL_NAME     \"__delayLoadHelper2\"\n#define MSCRT_DELAY_LOAD_HELPER2_X86_SYMBOL_NAME \"___delayLoadHelper2@8\"\n\n// _tls_used is a special section in CRT which has format of \n// PE_TLSHeader32 or PE_TLSHeader64, according to machine type.\n#define MSCRT_TLS_SYMBOL_NAME \"_tls_used\"\n\n////////////////////////////////\n\n// feature flags in absolute symbol @feat.00\nenum\n{\n  MSCRT_FeatFlag_HAS_SAFE_SEH  = (1 << 0),  // /safeseh\n  MSCRT_FeatFlag_UNKNOWN_4     = (1 << 4),\n  MSCRT_FeatFlag_GUARD_STACK   = (1 << 8),  // /GS\n  MSCRT_FeatFlag_SDL           = (1 << 9),  // /sdl\n  MSCRT_FeatFlag_GUARD_CF      = (1 << 11), // /guard:cf\n  MSCRT_FeatFlag_GUARD_EH_CONT = (1 << 14), // /guard:ehcont\n  MSCRT_FeatFlag_NO_RTTI       = (1 << 17), // /GR-\n  MSCRT_FeatFlag_KERNEL        = (1 << 30), // /kernel\n};\ntypedef U32 MSCRT_FeatFlags;\n\ntypedef struct MSCRT_VCFeatures\n{\n  U32 pre_vcpp;\n  U32 c_cpp;\n  U32 gs;\n  U32 sdl;\n  U32 guard_n;\n} MSCRT_VCFeatures;\n\n////////////////////////////////\n// GS Handler\n\n#define MSCRT_GSHandler_GetFlags(x)        (((x) & 0x00000007) >> 0)\n#define MSCRT_GSHandler_GetCookieOffset(x) (((x) & 0xFFFFFFF8) >> 3)\n\ntypedef U8 MSCRT_GSHandlerFlags;\nenum\n{\n  MSCRT_GSHandlerFlag_EHandler     = (1 << 0),\n  MSCRT_GSHandlerFlag_UHandler     = (1 << 1),\n  MSCRT_GSHandlerFlag_HasAlignment = (1 << 2)\n};\n\n////////////////////////////////\n// Exceptions < v4\n\n#define MSCRT_MAGIC_GET_CHECK(x) ((x)  & 0x1FFFFFFF)\n#define MSCRT_MAGIC_GET_FLAGS(x) (((x) & 0xE0000000) >> 29)\n\n// Magic numbers are incremented by one everytime there is a new version.\n// Top 3 bits are reserved for flags.\nenum\n{\n  MSCRT_Magic1     = 0x19930520,\n  MSCRT_Magic2     = 0x19930521,\n  MSCRT_Magic3     = 0x19930522,\n  \n  // pure magic indicates that exception cannot be caught in native or managed code.\n  MSCRT_PureMagic1 = 0x1994000,\n};\nenum\n{\n  MSCRT_MagicFlag_EHS         = (1 << 0),\n  MSCRT_MagicFlag_DYNSTALKING = (1 << 1),\n  MSCRT_MagicFlag_EHNOEXCEPT  = (1 << 2)\n};\n\ntypedef U32 MSCRT_Flags;\nenum\n{\n  MSCRT_Flag_SynchronousExceptionOnly = (1 << 0),\n  MSCRT_Flag_UNKNOWN                  = (1 << 1),\n  MSCRT_Flag_StopUnwind               = (1 << 2), // When set unwinding can't continue.\n};\n\nenum\n{\n  MSCRT_CatchableType_IsSimpleType   = (1 << 0),\n  MSCRT_CatchableType_ByRefOnly      = (1 << 1),\n  MSCRT_CatchableType_HasVirtualBase = (1 << 2), // type is a class with virtual base\n  MSCRT_CatchableType_IsWinRTHandle  = (1 << 3), // type is a WinRT handle\n  MSCRT_CatchableType_IsStdBadAlloc  = (1 << 4)  // type is a std::bad_alloc\n};\n\nenum\n{\n  MSCRT_ThrowInfo_IsConst     = (1 << 0),\n  MSCRT_ThrowInfo_IsVolatile  = (1 << 1),\n  MSCRT_ThrowInfo_IsUnaligned = (1 << 2),\n  MSCRT_ThrowInfo_IsPure      = (1 << 3), // thrown object is from pure module\n  MSCRT_ThrowInfo_IsWinRT     = (1 << 4)  // thrown object is a WinRT exception\n};\n\ntypedef U32 MSCRT_EhHandlerTypeFlags;\nenum\n{\n  MSCRT_EhHandlerTypeFlag_IsConst     = (1 << 0), // referenced type is 'const'\n  MSCRT_EhHandlerTypeFlag_IsVolatile  = (1 << 1), // referenced type is 'volatile'\n  MSCRT_EhHandlerTypeFlag_IsUnaligned = (1 << 2), // referenced type is 'unaligned'\n  MSCRT_EhHandlerTypeFlag_IsReference = (1 << 3), // catch type is by reference\n  MSCRT_EhHandlerTypeFlag_IsResumable = (1 << 4), // catch may choose to resume\n  MSCRT_EhHandlerTypeFlag_IsStdDotDot = (1 << 6), // catch(...)\n  MSCRT_EhHandlerTypeFlag_IsComplusEH = (1 << 31) // is handling EH in complus\n};\n\ntypedef struct MSCRT_FuncInfo32\n{\n  U32         magic;\n  U32         max_state;\n  U32         unwind_map_voff;\n  U32         try_block_map_count;\n  U32         try_block_map_voff;\n  U32         ip_map_count;\n  U32         ip_map_voff;\n  U32         frame_offset_unwind_helper;\n  U32         es_type_list_voff;           // llvm emits zero, not sure what this supposed to be\n  MSCRT_Flags eh_flags;\n} MSCRT_FuncInfo32;\n\ntypedef struct MSCRT_IPState32\n{\n  U32 ip;\n  S32 state;\n} MSCRT_IPState32;\n\ntypedef struct MSCRT_UnwindMap32\n{\n  S32 next_state;\n  U32 action_virt_off;\n} MSCRT_UnwindMap32;\n\ntypedef struct MSCRT_EhHandlerType32\n{\n  MSCRT_EhHandlerTypeFlags adjectives;\n  U32                      descriptor_voff;\n  U32                      catch_obj_frame_offset;\n  U32                      catch_handler_voff;\n  U32                      fp_distance;\n} MSCRT_EhHandlerType32;\n\ntypedef struct MSCRT_TryMapBlock32\n{\n  S32 try_low;\n  S32 try_high;\n  S32 catch_high;\n  S32 catch_handlers_count;\n  U32 catch_handlers_voff;\n} MSCRT_TryMapBlock32;\n\ntypedef struct MSCRT_ExceptionSpecTypeList32\n{\n  S32 count;\n  U32 handlers_voff;\n} MSCRT_ExceptionSpecTypeList32;\n\ntypedef struct MSCRT_TryMapBlock\n{\n  S32                    try_low;\n  S32                    try_high;\n  S32                    catch_high;\n  S32                    catch_handlers_count;\n  MSCRT_EhHandlerType32 *catch_handlers;\n} MSCRT_TryMapBlock;\n\ntypedef struct MSCRT_ExceptionSpecTypeList\n{\n  S32                    count;\n  MSCRT_EhHandlerType32 *handlers;\n} MSCRT_ExceptionSpecTypeList;\n\ntypedef struct MSCRT_FuncInfo\n{\n  U32                          magic;\n  U32                          max_state;\n  MSCRT_UnwindMap32           *unwind_map;\n  U32                          try_block_map_count;\n  MSCRT_TryMapBlock           *try_block_map;\n  U32                          ip_map_count;\n  MSCRT_IPState32             *ip_map;\n  U32                          frame_offset_unwind_helper;\n  MSCRT_ExceptionSpecTypeList  es_type_list;\n  MSCRT_Flags                  eh_flags;\n} MSCRT_FuncInfo;\n\n////////////////////////////////\n// C++ Exceptions V4\n\ntypedef U8 MSCRT_FuncInfoV4Flags;\nenum\n{\n  MSCRT_FuncInfoV4Flag_IsCatch     = (1 << 0), // catch funclet\n  MSCRT_FuncInfoV4Flag_IsSeparated = (1 << 1), // func has separate code segment\n  MSCRT_FuncInfoV4Flag_IsBBT       = (1 << 2), // flags set by basic block trasformations\n  MSCRT_FuncInfoV4Flag_UnwindMap   = (1 << 3), // unwind map is present\n  MSCRT_FuncInfoV4Flag_TryBlockMap = (1 << 4), // try block map is present\n  MSCRT_FuncInfoV4Flag_EHs         = (1 << 5),\n  MSCRT_FuncInfoV4Flag_NoExcept    = (1 << 6),\n  MSCRT_FuncInfoV4Flag_Reserved    = (1 << 7)\n};\n\ntypedef U32 MSCRT_UnwindMapV4Type;\nenum\n{\n  MSCRT_UnwindMapV4Type_NoUW             = 0, // no unwind action associated with this state\n  MSCRT_UnwindMapV4Type_DtorWithObj      = 1, // dtor with an object offset\n  MSCRT_UnwindMapV4Type_DtorWithPtrToObj = 2, // dtor with an offset that contains a pointer to the object to be destroyed\n  MSCRT_UnwindMapV4Type_VOFF             = 3, // dtor  that has a direct function that is called that knows where the object is and can perform more exotic destruction\n};\n\nenum\n{\n  MSCRT_ContV4Type_NoMetadata     = 1, // no metadata use whatever funclet returns\n  MSCRT_ContV4Type_OneFuncRelAddr = 2,\n  MSCRT_ContV4Type_TwoFuncRelAddr = 3\n};\n\n#define MSCRT__EH_HANDLER_V4_FLAGS_EXTRACT_CONT_TYPE(x) (((x) & MSCRT_EhHandlerV4Flag_ContVOffMask) >> MSVC_CRTHandlerV4Flag_ContVOffShift)\ntypedef U8 MSCRT_EhHandlerV4Flags;\nenum\n{\n  MSCRT_EhHandlerV4Flag_Adjectives   = (1 << 0), // set if adjectives are present\n  MSCRT_EhHandlerV4Flag_DispType     = (1 << 1), // set if type descriptors are present\n  MSCRT_EhHandlerV4Flag_DispCatchObj = (1 << 2), // set if catch object object is present\n  MSCRT_EhHandlerV4Flag_ContIsVOff   = (1 << 3), // continuantion addresses are VOFF rather than function relative\n  \n  MSCRT_EhHandlerV4Flag_ContVOffMask  = 0x30,\n  MSCRT_EhHandlerV4Flag_ContVOffShift = 4,\n};\n\ntypedef struct MSCRT_EhHandlerTypeV4\n{\n  MSCRT_EhHandlerV4Flags   flags;\n  MSCRT_EhHandlerTypeFlags adjectives;\n  S32                      type_voff;\n  U32                      catch_obj_voff;\n  S32                      catch_code_voff;\n  U64                      catch_funclet_cont_addr[2];\n  U32                      catch_funclet_cont_addr_count;\n} MSCRT_EhHandlerTypeV4;\n\ntypedef struct MSCRT_EhHandlerTypeV4Array\n{\n  U64                    count;\n  MSCRT_EhHandlerTypeV4 *v;\n} MSCRT_EhHandlerTypeV4Array;\n\ntypedef struct MSCRT_TryBlockMap32V4\n{\n  U32 try_low;\n  U32 try_high;\n  U32 catch_high;\n  S32 handler_array_voff;\n} MSCRT_TryBlockMap32V4;\n\ntypedef struct MSCRT_IP2State32V4\n{\n  U32  count;\n  U32 *voffs;\n  S32 *states;\n} MSCRT_IP2State32V4;\n\ntypedef struct MSCRT_SepIPState32V4\n{\n  S32 func_start_voff;\n  S32 ip_map_voff;\n} MSCRT_SepIPState32V4;\n\ntypedef struct MSCRT_FuncInfo32V4\n{\n  MSCRT_FuncInfoV4Flags header;\n  U32                   bbt_flags;\n  S32                   unwind_map_voff;\n  S32                   try_block_map_voff;\n  S32                   ip_to_state_map_voff;\n  S32                   wrt_frame_establisher_voff; // used only in catch funclets\n} MSCRT_FuncInfo32V4;\n\ntypedef struct MSCRT_UnwindEntryV4\n{\n  MSCRT_UnwindMapV4Type type;\n  S32                   action;\n  U32                   object;\n  U32                   next_off;\n} MSCRT_UnwindEntryV4;\n\ntypedef struct MSCRT_UnwindMapV4\n{\n  U32                  count;\n  MSCRT_UnwindEntryV4 *v;\n} MSCRT_UnwindMapV4;\n\ntypedef struct MSCRT_TryBlockMapV4\n{\n  U32                        try_low;\n  U32                        try_high;\n  U32                        catch_high;\n  MSCRT_EhHandlerTypeV4Array handlers;\n} MSCRT_TryBlockMapV4;\n\ntypedef struct MSCRT_TryBlockMapV4Array\n{\n  U64                  count;\n  MSCRT_TryBlockMapV4 *v;\n} MSCRT_TryBlockMapV4Array;\n\ntypedef struct MSCRT_ParsedFuncInfoV4\n{\n  MSCRT_FuncInfoV4Flags    header;\n  U32                      bbt_flags;\n  MSCRT_UnwindMapV4        unwind_map;\n  MSCRT_TryBlockMapV4Array try_block_map;\n  MSCRT_IP2State32V4       ip2state_map;\n} MSCRT_ParsedFuncInfoV4;\n\n//- Entry Point\n\ninternal String8 msvcrt_ctr_entry_from_user_entry(String8 user_entry_point);\n\n//- Delay Load Helper\n\ninternal String8 mscrt_delay_load_helper_name_from_machine(COFF_MachineType machine);\n\n//- Exception info < v4\n\ninternal U64 mscrt_parse_func_info(Arena *arena, String8 raw_data, U64 section_count, COFF_SectionHeader *sections, U64 off, MSCRT_FuncInfo *func_info);\n\n//- Exception info v4\n\ninternal U64 mscrt_parse_handler_type_v4       (String8 raw_data, U64 offset, U64 func_voff, MSCRT_EhHandlerTypeV4 *handler);\ninternal U64 mscrt_parse_unwind_v4_entry       (String8 raw_data, U64 offset, MSCRT_UnwindEntryV4 *entry_out);\ninternal U64 mscrt_parse_handler_type_v4_array (Arena *arena, String8 raw_data, U64 offset, U64 func_voff, MSCRT_EhHandlerTypeV4Array *array_out);\ninternal U64 mscrt_parse_unwind_map_v4         (Arena *arena, String8 raw_data, U64 off, MSCRT_UnwindMapV4 *map_out);\ninternal U64 mscrt_parse_try_block_map_array_v4(Arena *arena, String8 raw_data, U64 off, U64 section_count, COFF_SectionHeader *sections, U64 func_voff, MSCRT_TryBlockMapV4Array *map_out);\ninternal U64 mscrt_parse_ip2state_map_v4       (Arena *arena, String8 raw_data, U64 off, U64 func_voff, MSCRT_IP2State32V4 *ip2state_map_out);\ninternal U64 mscrt_parse_func_info_v4          (Arena *arena, String8 raw_data, U64 section_count, COFF_SectionHeader *sections, U64 off, U64 func_voff, MSCRT_ParsedFuncInfoV4 *func_info_out);\ninternal Rng1U64List\nmscrt_catch_blocks_from_data_x8664(Arena              *arena,\n                                   String8             raw_data,\n                                   U64                 section_count,\n                                   COFF_SectionHeader *sections,\n                                   Rng1U64             except_frange);\n\n////////////////////////////////\n//~ rjf: Enum -> String\n\ninternal String8 mscrt_string_from_eh_adjectives(Arena *arena, MSCRT_EhHandlerTypeFlags adjectives);\n\n#endif // MSVC_CRT\n\n"
  },
  {
    "path": "src/mule/inline_body.cpp",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\nbias = (bias^x)&7;\r\nx -= bias;\r\nx *= 2;\r\nx *= x;\r\nx += bias;"
  },
  {
    "path": "src/mule/mule_c.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n/*\r\n* Program to run in debugger organized to provide tests for\r\n* single threaded stepping, breakpoints, evaluation.\r\n*/\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Complex Types\r\n\r\n#include <complex.h>\r\n\r\nvoid\r\nc_type_coverage_eval_tests(void){\r\n#if _WIN32\r\n  _Fcomplex x = _FCbuild(0.f, 1.f);\r\n  _Dcomplex y = _Cbuild(0.f, -1.f);\r\n  \r\n#else\r\n  float complex x = 0.f + 1.f*I;\r\n  double complex y = 0.0 - 1.0*I;\r\n  \r\n#endif\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Reuse Type Names From Another Module\r\n\r\n#include <stdint.h>\r\n\r\ntypedef struct Basics{\r\n  double a;\r\n  float b;\r\n  unsigned long long c;\r\n  long long d;\r\n  unsigned int e;\r\n  int f;\r\n  unsigned short g;\r\n  short h;\r\n  unsigned char i;\r\n  char j;\r\n  \r\n  int z;\r\n} Basics;\r\n\r\ntypedef struct Basics_Stdint{\r\n  double   x1;\r\n  float    x2;\r\n  uint64_t x3;\r\n  int64_t  x4;\r\n  uint32_t x5;\r\n  int32_t  x6;\r\n  uint16_t x7;\r\n  int16_t  x8;\r\n  uint8_t  x9;\r\n  int8_t   x0;\r\n} Basics_Stdint;\r\n\r\ntypedef struct Pair{\r\n  int i;\r\n  float f;\r\n} Pair;\r\n\r\nvoid\r\nc_versions_of_same_types(void){\r\n  Basics basics = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, };\r\n  Basics_Stdint basics_stdint = { 1.5f, 1.50000000000001, -1, 1, -2, 2, -4, 4, -8, 8, };\r\n  Pair memory_[] = {\r\n    {100,  1.f},\r\n    {101,  2.f},\r\n    {102,  4.f},\r\n    {103,  8.f},\r\n    {104, 16.f},\r\n    {105, 32.f},\r\n  };\r\n  \r\n  int x = memory_[3].i + basics.f;\r\n}\r\n\r\n////////////////////////////////\r\n//~ NOTE(rjf): Bitfields\r\n\r\ntypedef struct TypeWithBitfield TypeWithBitfield;\r\nstruct TypeWithBitfield\r\n{\r\n  int v : 14;\r\n  int w : 4;\r\n  int x : 32;\r\n  int y : 4;\r\n  int z : 10;\r\n};\r\n\r\ntypedef struct BitfieldType64 BitfieldType64;\r\nstruct BitfieldType64\r\n{\r\n  uint64_t size    : 63;\r\n  uint64_t is_free : 1;\r\n};\r\n\r\nvoid\r\nc_type_with_bitfield_usage(void)\r\n{\r\n  TypeWithBitfield b = {0};\r\n  b.v = 100;\r\n  b.w = 6;\r\n  b.x = 434512;\r\n  b.y = 7;\r\n  b.z = 12;\r\n  int x = (b.v + b.x);\r\n  int y = (b.y - b.z);\r\n  int z = (b.w) + 5;\r\n  BitfieldType64 b64 = {0};\r\n  b64.size = 524288;\r\n  b64.is_free = 1;\r\n  int abc = 0;\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_c.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n/*\r\n* Program to run in debugger organized to provide tests for\r\n* single threaded stepping, breakpoints, evaluation.\r\n*/\r\n\r\nvoid c_type_coverage_eval_tests(void);\r\nvoid c_type_with_bitfield_usage(void);"
  },
  {
    "path": "src/mule/mule_hotload_main.c",
    "content": "#include <stdint.h>\r\n#include <windows.h>\r\n\r\nint main(int argc, char **argv)\r\n{\r\n  int lib_loaded = 0;\r\n  HANDLE lib = {0};\r\n  FILETIME lib_last_filetime = {0};\r\n  int (*get_number)(void) = 0;\r\n  for(;;)\r\n  {\r\n    //- rjf: hot-load dll\r\n    {\r\n      HANDLE file = CreateFileA(\"mule_hotload_module.dll\", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);\r\n      FILETIME modified = {0};\r\n      if(GetFileTime(file, 0, 0, &modified) &&\r\n         CompareFileTime(&lib_last_filetime, &modified) == -1)\r\n      {\r\n        for(int reloaded = 0; !reloaded;)\r\n        {\r\n          if(lib_loaded)\r\n          {\r\n            FreeLibrary(lib);\r\n            lib_loaded = 0;\r\n          }\r\n          BOOL copy_worked = CopyFile(\"mule_hotload_module.dll\", \"mule_hotload_module_temp.dll\", 0);\r\n          lib = LoadLibraryA(\"mule_hotload_module_temp.dll\");\r\n          if(lib != INVALID_HANDLE_VALUE)\r\n          {\r\n            reloaded = 1;\r\n            lib_last_filetime = modified;\r\n            get_number = (int(*)(void))GetProcAddress(lib, \"get_number\");\r\n            lib_loaded = 1;\r\n          }\r\n        }\r\n      }\r\n      CloseHandle(file);\r\n    }\r\n    int number = get_number();\r\n    printf(\"got a number: %i\\n\", number);\r\n    if(number == 0)\r\n    {\r\n      break;\r\n    }\r\n    Sleep(1000);\r\n  }\r\n  return 0;\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_hotload_module_main.c",
    "content": "__declspec(dllexport) int\r\nget_number(void)\r\n{\r\n  int sum = 0;\r\n  for(int i = 0; i < 100; i += 1)\r\n  {\r\n    sum += i;\r\n    sum += i;\r\n    sum += 1;\r\n  }\r\n  sum = 1000;\r\n  return sum;\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_inline.cpp",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n/*\r\n** Make sure we have an inlined function\r\n*/\r\n\r\n#if defined(_MSC_VER)\r\n# define FORCE_INLINE __forceinline\r\n#elif defined(__clang__) || defined(__GNUC__)\r\n# define FORCE_INLINE  __attribute__((always_inline))\r\n#else\r\n# error need force inline for this compiler\r\n#endif\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Inline Stepping\r\n\r\nunsigned int fixed_frac_bits = 5;\r\nstatic unsigned int bias = 7;\r\n\r\nstatic FORCE_INLINE unsigned int\r\nfixed_mul(unsigned int a, unsigned int b){\r\n  unsigned int c = (((a - bias)*(b - bias)) >> fixed_frac_bits) + bias;\r\n  return(c);\r\n}\r\n\r\nstatic FORCE_INLINE unsigned int\r\nmulti_file_inlinesite(unsigned int x){\r\n\t// force compiler to generate annotations for code that's inside another file\r\n#include \"inline_body.cpp\"\r\n\treturn x >> fixed_frac_bits;\r\n}\r\n\r\nstatic unsigned int test_value = 0;\r\n\r\nunsigned int\r\ninline_stepping_tests(void){\r\n  bias = 15;\r\n  \r\n  // NOTE(nick): Interesting that CL does not generate inline site symbols in order of apperance here unlike clang.\r\n  \r\n  // CL:\r\n  //  BinaryAnnotations:    CodeLengthAndCodeOffset d 0\r\n  //  BinaryAnnotation Length: 4 bytes (1 bytes padding)\r\n  //\r\n  // Clang:\r\n  //  BinaryAnnotations:    LineOffset 1  CodeLength d\r\n  //  BinaryAnnotation Length: 4 bytes (0 bytes padding)\r\n  unsigned int x = fixed_mul(5001, 7121);\r\n  \r\n  // CL:\r\n  //  BinaryAnnotations:    CodeOffsetAndLineOffset d  File 0  CodeOffsetAndLineOffset 22  LineOffset 1e\r\n  //                        CodeLengthAndCodeOffset 2 3\r\n  //  BinaryAnnotation Length: 12 bytes (1 bytes padding)\r\n  //\r\n  // Clang:\r\n  //  BinaryAnnotations:  File 18  LineOffset ffffffe6  CodeOffset d  CodeOffsetAndLineOffset 22\r\n  //                      File 0  LineOffset 1e  CodeOffset 3  CodeLength 2\r\n  //  BinaryAnnotation Length: 16 bytes (0 bytes padding)\r\n  unsigned int z = multi_file_inlinesite(x);\r\n  return(z);\r\n}\r\n\r\n"
  },
  {
    "path": "src/mule/mule_main.cpp",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n/*\r\n** Program to run in debugger organized to provide tests for\r\n** stepping, breakpoints, evaluation, cross-module calls.\r\n*/\r\n\r\n#include <string>\r\n#include <vector>\r\n#include <unordered_map>\r\n#include <memory>\r\n#if !_WIN32\r\n# define RADDBG_MARKUP_STUBS\r\n#endif\r\n#define RADDBG_MARKUP_IMPLEMENTATION\r\n#include \"lib_raddbg_markup/raddbg_markup.h\"\r\n\r\n////////////////////////////////\r\n// NOTE(allen): System For DLL Testing\r\n\r\ntypedef void TestFunction(void);\r\n\r\nstatic void          mule_init(void);\r\nstatic TestFunction* mule_get_module_function(char *name);\r\n\r\n#if _WIN32\r\n\r\n#include <Windows.h>\r\n\r\nHMODULE mule_dll = 0;\r\n\r\nstatic void\r\nmule_init(void){\r\n  mule_dll = LoadLibraryA(\"mule_module.dll\");\r\n}\r\n\r\nstatic TestFunction*\r\nmule_get_module_function(char *name){\r\n  TestFunction *result = (TestFunction*)GetProcAddress(mule_dll, name);\r\n  return(result);\r\n}\r\n\r\n#else\r\n\r\nstatic void\r\nmule_init(void){\r\n  // TODO(allen): implement\r\n}\r\n\r\nstatic TestFunction*\r\nmule_get_module_function(char *name){\r\n  // TODO(allen): implement\r\n  return(0);\r\n}\r\n\r\n#endif\r\n\r\n\r\n////////////////////////////////\r\n// NOTE(nick): Entry Point\r\n\r\nint\r\nmule_main(int argc, char **argv);\r\n\r\n#if _WIN32\r\n#include <windows.h>\r\n#include <malloc.h>\r\nint WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd){\r\n  int argc = __argc;\r\n  char **argv = __argv;\r\n  int result = mule_main(argc, argv);\r\n  return(result);\r\n}\r\n#else\r\nint main(int argc, char **argv){\r\n  return(mule_main(argc, argv));\r\n}\r\n#endif\r\n\r\n////////////////////////////////\r\n// NOTE(nick): BSS section test\r\n\r\n#if defined(__clang__)\r\n# pragma clang section bss=\"muleBSS\"\r\n#elif defined(_MSC_VER)\r\n// NOTE(nick): clang-cl is borken it allocates memory and sets Initialized Flag on the seciton.\r\n// This is was reported by Jeff => https://bugs.llvm.org/show_bug.cgi?id=47939\r\n//\r\n// This is still unresolved, last checked Sep 11, 2023.\r\n# pragma bss_seg(\"muleBSS\")\r\n#else\r\n# error \"bss not defined\"\r\n#endif\r\nchar global_variable_in_bss[4096*10000];\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Inline Stepping (Built In Separate Unit)\r\n\r\nextern unsigned int fixed_frac_bits;\r\nunsigned int inline_stepping_tests(void);\r\n\r\n\r\n////////////////////////////////\r\n// NOTE(rjf): -O2 Optimized Code (Built In Separate Unit)\r\n\r\nvoid optimized_build_eval_tests(void);\r\nvoid optimized_struct_parameters_eval_tests(void);\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Type Coverage Eval\r\n\r\n#include <stdint.h>\r\n\r\nstruct Basics\r\n{\r\n  char a;\r\n  unsigned char b;\r\n  short c;\r\n  unsigned short d;\r\n  int e;\r\n  unsigned int f;\r\n  long long g;\r\n  unsigned long long h;\r\n  float i;\r\n  double j;\r\n  int z;\r\n};\r\n\r\nstruct Basics_Stdint\r\n{\r\n  int8_t   a;\r\n  uint8_t  b;\r\n  int16_t  c;\r\n  uint16_t d;\r\n  int32_t  e;\r\n  uint32_t f;\r\n  int64_t  g;\r\n  uint64_t h;\r\n  float    i;\r\n  double   j;\r\n};\r\n\r\nstruct Pair\r\n{\r\n  int x;\r\n  float y;\r\n};\r\n\r\nstruct Fixed_Array\r\n{\r\n  Pair pairs[10];\r\n  int count;\r\n};\r\n\r\nstruct Dynamic_Array\r\n{\r\n  Pair *pairs;\r\n  int count;\r\n};\r\nraddbg_type_view(Dynamic_Array, slice($));\r\n\r\ntemplate<typename T>\r\nstruct TemplatedDynamicArray\r\n{\r\n  T *v;\r\n  int count;\r\n};\r\nraddbg_type_view(TemplatedDynamicArray<?>, rows($, count, array(v, count)));\r\n\r\ntemplate<typename T>\r\nstruct OpaqueTemplatedDynamicArray\r\n{\r\n  void *v;\r\n  int count;\r\n};\r\nraddbg_type_view(OpaqueTemplatedDynamicArray<?{type}>, array(cast(type *)v, count));\r\n\r\nstruct Struct_With_Embedded_Arrays\r\n{\r\n  int x;\r\n  float y;\r\n  Pair pairs[10];\r\n  char z;\r\n};\r\n\r\ntypedef unsigned int Custom_Index_Type;\r\n\r\ntypedef void Function_No_Params_Type(void);\r\ntypedef void Function_Few_Params_Type(Pair *pairs, int count, Function_No_Params_Type *no_params_type);\r\n\r\nstatic Function_No_Params_Type *ty_no_params = 0;\r\nstatic Function_Few_Params_Type *ty_few_params = 0;\r\n\r\nstruct Callback{\r\n  Function_Few_Params_Type *few_params;\r\n  Function_No_Params_Type *no_params;\r\n  Pair pair;\r\n};\r\n\r\nunion Vector_R2\r\n{\r\n  struct\r\n  {\r\n    float x;\r\n    float y;\r\n  };\r\n  float v[2];\r\n};\r\nraddbg_type_view(Vector_R2, rows($, x, y));\r\n\r\ntypedef union Matrix4x4F32 Matrix4x4F32;\r\nunion Matrix4x4F32\r\n{\r\n  float elements[4][4];\r\n};\r\nraddbg_type_view(Matrix4x4F32, columns($.elements, $[0], $[1], $[2], $[3]));\r\n\r\nunion PackedF16\r\n{\r\n  uint16_t v;\r\n  struct\r\n  {\r\n    uint16_t mantissa : 10;\r\n    uint16_t exponent : 5;\r\n    uint16_t sign : 1;\r\n  };\r\n};\r\nraddbg_type_view(PackedF16,\r\n                 exponent == 0 ? (0.00006103515625f*mantissa/1024.f) :\r\n                 (exponent == 31 && mantissa == 0 && sign == 1) ? \"-infinity\" :\r\n                 (exponent == 31 && mantissa == 0 && sign == 1) ? \"+infinity\" :\r\n                 (exponent == 31) ? \"NaN\" :\r\n                 (exponent < 15) ? (1.f/(1<<(15 - exponent)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) :\r\n                 (exponent > 15) ? ((1<<(exponent-15)) * (sign * -2 + 1.f) * (1.f + mantissa/1024.f)) :\r\n                 ((sign * -2 + 1) * 1.f + mantissa/1024.f));\r\n\r\nenum Kind\r\n{\r\n  Kind_Negative = -1,\r\n  Kind_None,\r\n  Kind_First,\r\n  Kind_Second,\r\n  Kind_Third,\r\n  Kind_Fourth,\r\n  Kind_COUNT,\r\n};\r\n\r\nenum Flag\r\n{\r\n  Flag_None = 0,\r\n  Flag_First = 1,\r\n  Flag_Second = 2,\r\n  Flag_Third = 4,\r\n  Flag_Fourth = 8,\r\n  Flag_AllMoreNarrow = 0xFF,\r\n  Flag_AllNarrow = 0xFFFF,\r\n  Flag_All = 0xFFFFFFFF,\r\n};\r\n\r\nstruct Has_Enums\r\n{\r\n  Kind kind;\r\n  Flag flags;\r\n};\r\n\r\nstruct Discriminated_Union\r\n{\r\n  Kind kind;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      int x;\r\n      int y;\r\n      Vector_R2 vector;\r\n    } first;\r\n    Pair second;\r\n    struct\r\n    {\r\n      Function_Few_Params_Type *few_params;\r\n      Pair pairs[4];\r\n    } third;\r\n    struct\r\n    {\r\n      Kind sub_kind;\r\n      Flag flags;\r\n    } fourth;\r\n  };\r\n};\r\nraddbg_type_view(Discriminated_Union,\r\n                 kind == Kind.First ? first :\r\n                 kind == Kind.Second ? second :\r\n                 kind == Kind.Third ? third :\r\n                 kind == Kind.Fourth ? fourth :\r\n                 $);\r\n\r\nstruct Crazy_Union\r\n{\r\n  Kind kind;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      int first_and_third__x;\r\n      int first_and_third__y;\r\n      int first_and_third__z;\r\n    } first_and_third;\r\n    struct\r\n    {\r\n      char *second__name;\r\n      Pair second__pairs[16];\r\n    } second;\r\n  };\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      char *first__name;\r\n      int first__x;\r\n    } first;\r\n    struct\r\n    {\r\n      char *third__name;\r\n      Function_Few_Params_Type *third__few_params;\r\n    } third;\r\n  };\r\n};\r\nraddbg_type_view(Crazy_Union,\r\n                 kind == Kind.First ? rows($, first_and_third, first) :\r\n                 kind == Kind.Second ? rows($, second) :\r\n                 kind == Kind.Third ? rows($, first_and_third, third) :\r\n                 kind == Kind.Fourth ? kind :\r\n                 $);\r\n\r\nstruct Linked_List{\r\n  Linked_List *next;\r\n  Linked_List *prev;\r\n  int x;\r\n};\r\n\r\nenum{\r\n  Anonymous_A,\r\n  Anonymous_B,\r\n  Anonymous_C,\r\n  Anonymous_D,\r\n};\r\n\r\ntypedef uint32_t SizedKind;\r\nenum SizedKindEnum\r\n{\r\n  SizedKind_A,\r\n  SizedKind_B,\r\n  SizedKind_C,\r\n  SizedKind_D,\r\n};\r\n\r\ntypedef Kind Alias1;\r\ntypedef Flag Alias2;\r\ntypedef Has_Enums Alias3;\r\ntypedef Discriminated_Union Alias4;\r\n\r\nstruct Has_A_Pre_Forward_Reference{\r\n  struct Gets_Referenced_Forwardly *pointer;\r\n};\r\n\r\nstruct Gets_Referenced_Forwardly{\r\n  int x;\r\n  int y;\r\n};\r\n\r\nstruct Has_A_Post_Forward_Reference{\r\n  struct Gets_Referenced_Forwardly value;\r\n};\r\n\r\nstruct TypeWithMemberFunction\r\n{\r\n  int x;\r\n  int y;\r\n  int z;\r\n  char *name;\r\n  __declspec(noinline) void SetInfo(int _x, int _y, char *_name)\r\n  {\r\n    x = _x;\r\n    y = _y;\r\n    z = 0;\r\n    name = _name;\r\n    OutputDebugStringA(\"setting info\\n\");\r\n  }\r\n};\r\n\r\nstatic void\r\nno_params1(void){\r\n  \r\n}\r\n\r\nstatic void\r\nfew_params1(Pair *pairs, int count, Function_No_Params_Type *no_params_type){\r\n  \r\n}\r\n\r\nstatic void\r\ntype_coverage_eval_tests(void)\r\n{\r\n  Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001};\r\n  Basics_Stdint basics_stdint = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001};\r\n  \r\n  uint32_t a = (1<<31);\r\n  int32_t  b = (1<<31);\r\n  \r\n  char string[] = \"Hello World!\";\r\n  char longer_text[] =\r\n    \"Suppose there was some text\\n\"\r\n    \"With multiple lines in it\\r\\n\"\r\n    \"\\t> What ways might it be rendered?\\n\"\r\n    \"\\t> How would it deal with line endings?\\r\\n\";\r\n  wchar_t a_wide_string[] =\r\n    L\"This is a string, but instead of being encoded in a stream of bytes,\\n\"\r\n    L\"it is encoded in a stream of 2-byte packages!\\n\";\r\n  char some_data_with_a_string[] =\r\n  {\r\n    'H', 'e', 'l', 'l', 'o', 27, 27, 2, 27, 125,\r\n  };\r\n  struct SomeDataStructured\r\n  {\r\n    char data[4];\r\n  };\r\n  SomeDataStructured *some_data = (SomeDataStructured *)&some_data_with_a_string[0];\r\n  \r\n  const char *const_string = \"Hello, World!\";\r\n  const char const_string_array[] = \"Hello, World!\";\r\n  const char *const const_ptr_const_string = \"Hello, World!\";\r\n  \r\n  void *pointer = &basics;\r\n  Basics *pointer_to_basics = &basics;\r\n  Basics **pointer_to_pointer_to_basics = &pointer_to_basics;\r\n  \r\n  Fixed_Array fixed =\r\n  {\r\n    {\r\n      { 3,  4.f},\r\n      { 5,  6.f},\r\n      { 7,  8.f},\r\n      { 9, 10.f},\r\n      {11, 12.f},\r\n      {13, 14.f},\r\n      {15, 16.f},\r\n      {17, 18.f},\r\n      {19, 20.f},\r\n    },\r\n    9\r\n  };\r\n  Pair memory_[] =\r\n  {\r\n    {100,  1.f},\r\n    {101,  2.f},\r\n    {102,  4.f},\r\n    {103,  8.f},\r\n    {104, 16.f},\r\n    {105, 32.f},\r\n  };\r\n  Dynamic_Array dynamic =\r\n  {\r\n    memory_,\r\n    6\r\n  };\r\n  \r\n  TemplatedDynamicArray<Pair> templated_dynamic = {dynamic.pairs, dynamic.count};\r\n  TemplatedDynamicArray<Pair> templated_dynamics[] =\r\n  {\r\n    {dynamic.pairs, dynamic.count},\r\n    {dynamic.pairs, dynamic.count},\r\n    {dynamic.pairs, dynamic.count},\r\n    {dynamic.pairs, dynamic.count},\r\n    {dynamic.pairs, dynamic.count},\r\n  };\r\n  \r\n  OpaqueTemplatedDynamicArray<Pair> otd = {dynamic.pairs, dynamic.count};\r\n  \r\n  raddbg_pin(columns(sequence(6), fixed.pairs[$], memory_[$]));\r\n  raddbg_pin(basics);\r\n  raddbg_pin(fixed);\r\n  raddbg_pin(pointer);\r\n  raddbg_pin(dynamic);\r\n  \r\n  Struct_With_Embedded_Arrays swea = {0};\r\n  {\r\n    swea.x = 4;\r\n    swea.y = 23.5f;\r\n    swea.pairs[0].x = 100;\r\n    swea.pairs[0].y = 123.f;\r\n    swea.pairs[2].x = 300;\r\n    swea.pairs[2].y = 323.f;\r\n    swea.pairs[5].x = 600;\r\n    swea.pairs[5].y = 623.f;\r\n    swea.z = 'z';\r\n  }\r\n  \r\n  Struct_With_Embedded_Arrays *swea_ptr = &swea;\r\n  int access_via_ptr_member = swea_ptr->x;\r\n  \r\n  Custom_Index_Type custom_index = 42;\r\n  Custom_Index_Type more_custom_indices[] = {\r\n    04,13,22,31,40\r\n  };\r\n  \r\n  Function_No_Params_Type *ptr_no_params = no_params1;\r\n  Function_No_Params_Type **ptr_ptr_no_params = &ptr_no_params;\r\n  Function_Few_Params_Type *ptr_few_params = few_params1;\r\n  Function_Few_Params_Type **ptr_ptr_few_params = &ptr_few_params;\r\n  Callback callback = {few_params1, no_params1, {1, 2.f}};\r\n  \r\n  Matrix4x4F32 matrix =\r\n  {\r\n    {\r\n      {1.f, 0.f, 0.f, 0.f},\r\n      {0.f, 1.f, 0.f, 0.f},\r\n      {0.f, 0.f, 1.f, 0.f},\r\n      {0.f, 0.f, 0.f, 1.f},\r\n    }\r\n  };\r\n  \r\n  Vector_R2 vector = {1.f, 2.f};\r\n  \r\n  Has_Enums has_enums = {(Kind)4, (Flag)7};\r\n  \r\n  struct EnumBitfields\r\n  {\r\n    Kind k1 : 4;\r\n    Kind k2 : 3;\r\n    Kind k3 : 1;\r\n    Kind k4 : 16;\r\n  };\r\n  \r\n  EnumBitfields enum_bitfields = {};\r\n  enum_bitfields.k1 = Kind_First;\r\n  enum_bitfields.k2 = Kind_Second;\r\n  enum_bitfields.k3 = Kind_None;\r\n  enum_bitfields.k4 = Kind_Fourth;\r\n  \r\n  Crazy_Union crazy_union = {};\r\n  \r\n  crazy_union.kind = Kind_First;\r\n  crazy_union.kind = Kind_Second;\r\n  crazy_union.kind = Kind_Third;\r\n  crazy_union.kind = Kind_Fourth;\r\n  \r\n  Discriminated_Union discriminated_union = {};\r\n  \r\n  discriminated_union.kind = Kind_First;\r\n  discriminated_union.first.x = 16;\r\n  discriminated_union.first.y = 8;\r\n  discriminated_union.first.vector.x = 4.f;\r\n  discriminated_union.first.vector.y = 2.f;\r\n  \r\n  discriminated_union.kind = Kind_Second;\r\n  discriminated_union.second.x = 123;\r\n  discriminated_union.second.y = 3.14f;\r\n  \r\n  discriminated_union.kind = Kind_Third;\r\n  discriminated_union.third.few_params = few_params1;\r\n  discriminated_union.third.pairs[0] = memory_[0];\r\n  discriminated_union.third.pairs[1] = memory_[1];\r\n  discriminated_union.third.pairs[2] = memory_[2];\r\n  discriminated_union.third.pairs[3] = memory_[3];\r\n  \r\n  discriminated_union.kind = Kind_Fourth;\r\n  discriminated_union.fourth.sub_kind = Kind_First;\r\n  discriminated_union.fourth.flags = (Flag)7;\r\n  \r\n  Linked_List list = {&list, &list, 0};\r\n  \r\n  struct SLLNode\r\n  {\r\n    SLLNode *next;\r\n    SLLNode *the_real_next_ptr;\r\n    int x;\r\n  };\r\n  SLLNode node6 = {0, 0, 6};\r\n  SLLNode node5 = {0, &node6, 5};\r\n  SLLNode node4 = {0, &node5, 4};\r\n  SLLNode node3 = {0, &node4, 3};\r\n  SLLNode node2 = {0, &node3, 2};\r\n  SLLNode node1 = {0, &node2, 1};\r\n  raddbg_pin(list(node1, the_real_next_ptr));\r\n  \r\n  node6.next = &node1;\r\n  \r\n  Alias1 a1 = has_enums.kind;\r\n  Alias2 a2 = has_enums.flags;\r\n  Alias3 a3 = has_enums;\r\n  Alias4 a4 = discriminated_union;\r\n  \r\n  Has_A_Pre_Forward_Reference  r1 = {0};\r\n  Has_A_Post_Forward_Reference r2 = {0};\r\n  \r\n  Basics &basics_ref = basics;\r\n  const Basics *basics_const_ptr = &basics;\r\n  const Basics &basics_const_ref = basics;\r\n  \r\n  union\r\n  {\r\n    int x;\r\n    char y[4];\r\n  } integer_slicing = {123456789};\r\n  \r\n  typedef struct stks\r\n  {\r\n    void *left;\r\n    size_t len;\r\n  } stks;\r\n  stks stks_test[256] = {0};\r\n  stks *stks_first = &stks_test[0];\r\n  stks *stks_ptr = stks_first + 8;\r\n  \r\n  TypeWithMemberFunction twmf = {0};\r\n  twmf.SetInfo(123, 456, \"foobar\");\r\n  \r\n  TestFunction *function = mule_get_module_function(\"dll_type_eval_tests\");\r\n  function();\r\n  \r\n  int abc = 0;\r\n  for(int i = 0; i < 1000; i += 1)\r\n  {\r\n    if(i == 500)\r\n    {\r\n      abc+= 1;\r\n    }\r\n    int a = i + abc;\r\n    int b = a*5;\r\n  }\r\n  \r\n  char *names[] =\r\n  {\r\n    \"samwise gamgee\", \"mithrandir\", \"grima wormtongue\", \"theodred\", \"theoden\", \"eomer\", \"eowyn\",\r\n    \"arwen\", \"sauron\", \"baggins\", \"proudfoot\", \"hardbottle\", \"bag end\", \"hobbiton\",\r\n    \"bree\", \"imladris\", \"isengard\", \"moria\", \"mount doom\", \"helm's deep\", \"bracegirdle\",\r\n    \"buckleberry ferry\", \"amun sul\", \"frodo\", \"bilbo\", \"buckland\", \"fangorn\", \"elrond\",\r\n    \"numenor\", \"treebeard\", \"shadowfax\", \"brego\", \"erod\", \"azufel\", \"dunedain\",\r\n    \"saruman\", \"aragorn\", \"gandalf\", \"meriadoc brandybuck\", \"peregrine took\", \"faramir\", \"boromir\",\r\n    \"ecthelion\", \"denethor\", \"mithrandil\", \"isildur\", \"haldir\", \"elessar\", \"elendil\",\r\n    \"dead marsh\", \"rohan\", \"gondor\", \"anarion\", \"earendil\", \"cirith ungol\", \"minas morghul\",\r\n    \"minas tirith\", \"barad-dur\", \"rivendell\", \"pellenor\", \"ithilien\", \"anduril\", \"narsil\",\r\n    \"edoras\", \"mordor\", \"osgiliath\",\r\n  };\r\n  \r\n  for(int i = 0; i < sizeof(names)/sizeof(names[0]); i += 1)\r\n  {\r\n    OutputDebugStringA(names[i]);\r\n    OutputDebugStringA(\"\\n\");\r\n  }\r\n  \r\n  const int32_t x1 = 3;\r\n  const int32_t y1 = -10;\r\n  const int32_t z1 = x1 + y1;\r\n  \r\n  std::string small_cplusplus_string = \"smallstr\";\r\n  std::string cplusplus_string = \"This is a C++ string!\";\r\n  \r\n  std::vector<int> int_vector;\r\n  int_vector.push_back(1);\r\n  int_vector.push_back(2);\r\n  int_vector.push_back(3);\r\n  int_vector.push_back(4);\r\n  int_vector.push_back(5);\r\n  int_vector.push_back(6);\r\n  int_vector.push_back(7);\r\n  \r\n  std::unordered_map<std::string, int> people =\r\n  {\r\n    {\"Peter\", 1},\r\n    {\"Oliver\", 2},\r\n    {\"Jack\", 3},\r\n  };\r\n  \r\n  std::vector<int> *pint_vector = &int_vector;\r\n  std::vector<int> &rint_vector =  int_vector;\r\n  \r\n  std::vector<Dynamic_Array> dynamic_array_vector;\r\n  dynamic_array_vector.push_back(dynamic);\r\n  dynamic_array_vector.push_back(dynamic);\r\n  dynamic_array_vector.push_back(dynamic);\r\n  dynamic_array_vector.push_back(dynamic);\r\n  \r\n  SizedKind sized_kind = SizedKind_C;\r\n  \r\n  int x = (int)(Anonymous_D);\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Mutating Variables Eval\r\n\r\nstatic const int con_some_constant = 4;\r\nstatic const float con_some_constant_f = 0.04f;\r\n\r\nstatic int mut_x = 0;\r\nstatic int mut_y;\r\nstatic int mut_xarray[4] = {0, 1, 2, 3};\r\nstatic int *mut_xptr;\r\n\r\nstatic float mut_f = 0;\r\nstatic float mut_g;\r\nstatic float mut_farray[4] = {0.5f, 1.5f, 2.5f, 3.5f};\r\nstatic float *mut_fptr;\r\n\r\nstatic float mut_arrayarray[3][3];\r\n\r\nstatic Linked_List mut_link;\r\n\r\nstatic void\r\nmutate_in_function(int *array, int count){\r\n  for (int i = 0; i < count; i += 1){\r\n    array[i] += 1;\r\n  }\r\n  \r\n  for (int i = 0; i < 4; i += 1){\r\n    mut_farray[i] += 1.f;\r\n  }\r\n}\r\n\r\nstatic void\r\nmutating_variables_eval_tests(void){\r\n  ////////////////////////////////\r\n  // NOTE(allen): Basics\r\n  \r\n  int array_literal[10] = {\r\n    10, 20, 30, 40, 50, 60, 70, 80, 90,\r\n  };\r\n  \r\n  Basics struct_literal = {\r\n    -1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001,\r\n  };\r\n  \r\n  array_literal[0] = struct_literal.e = 9;\r\n  \r\n  int x = mut_x;\r\n  int y = x + 10 + con_some_constant;\r\n  mut_y = y;\r\n  mut_xarray[0] += 0;\r\n  mut_xarray[1] += x;\r\n  mut_xarray[2] += y;\r\n  mut_xarray[3] += x + y;\r\n  \r\n  mut_xptr = &mut_xarray[2];\r\n  \r\n  *mut_xptr -= (y - x)/2;\r\n  *(mut_xptr - 1) += 11;\r\n  \r\n  float f = mut_f + .333f + con_some_constant_f;\r\n  float g = f + 10.1f;\r\n  mut_g = g;\r\n  mut_farray[0] += 0.000001f;\r\n  mut_farray[1] += f;\r\n  mut_farray[2] += g;\r\n  mut_farray[3] += f + g;\r\n  \r\n  mut_fptr = &mut_farray[3];\r\n  \r\n  *mut_fptr -= (g - f)*0.5f;\r\n  *(mut_fptr - 1) += 1.f;\r\n  \r\n  float a = 0.777f;\r\n  for (int i = 0; i < 3; i += 1){\r\n    float b = a*a - 1.f;\r\n    for (int j = 0; j < 3; j += 1){\r\n      mut_arrayarray[i][j] = b;\r\n      b += 0.111f;\r\n    }\r\n    a += 0.333f;\r\n  }\r\n  \r\n  ////////////////////////////////\r\n  // NOTE(allen): Changes in functions\r\n  \r\n  mutate_in_function(array_literal, 10);\r\n  \r\n  mutate_in_function(array_literal, 10);\r\n  \r\n  ////////////////////////////////\r\n  // NOTE(allen): Changes through pointers\r\n  \r\n  Basics basic = struct_literal;\r\n  Basics advanced = struct_literal;\r\n  \r\n  Basics *struct_pointer = &basic;\r\n  \r\n  basic.a += 1;\r\n  advanced.a += 1;\r\n  struct_pointer->a += 1;\r\n  \r\n  struct_pointer = &advanced;\r\n  \r\n  basic.b += 1;\r\n  advanced.b += 1;\r\n  struct_pointer->b += 1;\r\n  \r\n  Linked_List links[5];\r\n  for (int i = 0; i < 5; i += 1){\r\n    links[i].next = &links[i + 1];\r\n    links[i].prev = &links[i - 1];\r\n    links[i].x = i;\r\n  }\r\n  links[0].prev = 0;\r\n  links[4].next = &mut_link;\r\n  mut_link.prev = &links[4];\r\n  mut_link.next = 0;\r\n  mut_link.x = 1000;\r\n  \r\n  Linked_List *link_ptr = links;\r\n  \r\n  link_ptr = link_ptr->next;\r\n  \r\n  link_ptr = &links[4];\r\n  link_ptr = &mut_link;\r\n  \r\n  Linked_List sentinel = {0};\r\n  sentinel.x = -1;\r\n  sentinel.next = &links[0];\r\n  links[0].prev = &sentinel;\r\n  sentinel.prev = &mut_link;\r\n  mut_link.next = &sentinel;\r\n  \r\n  link_ptr = &sentinel;\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Global Eval\r\n\r\nstruct NestedNodeInner{\r\n  unsigned int small0;\r\n  unsigned int small1;\r\n  unsigned int big0;\r\n  unsigned int big1;\r\n};\r\n\r\nstruct NestedNodeOuter{\r\n  NestedNodeOuter *next;\r\n  NestedNodeInner *inner_nodes;\r\n  unsigned int inner_node_count;\r\n};\r\n\r\nstatic void\r\nnested_types_eval_tests(void){\r\n  // doing some setup\r\n  NestedNodeOuter *outer1 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter));\r\n  NestedNodeOuter *outer2 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter));\r\n  NestedNodeOuter *outer3 = (NestedNodeOuter*)malloc(sizeof(NestedNodeOuter));\r\n  \r\n  outer1->next = outer2;\r\n  outer2->next = outer3;\r\n  outer3->next = 0;\r\n  \r\n  outer1->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10);\r\n  outer1->inner_node_count = 10;\r\n  \r\n  outer2->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10);\r\n  outer2->inner_node_count = 10;\r\n  \r\n  outer3->inner_nodes = (NestedNodeInner*)malloc(sizeof(NestedNodeInner)*10);\r\n  outer3->inner_node_count = 10;\r\n  \r\n  for (unsigned int i = 0; i < 10; i += 1){\r\n    outer1->inner_nodes[i].small0 = i;\r\n    outer1->inner_nodes[i].small1 = 2*i;\r\n    outer1->inner_nodes[i].big0 = 0xFFFFFF + 0xF*i;\r\n    outer1->inner_nodes[i].big1 = 0xFFFFFF + 0xFF*i;\r\n    \r\n    outer2->inner_nodes[i].small0 = 1 + i;\r\n    outer2->inner_nodes[i].small1 = 3*i;\r\n    outer2->inner_nodes[i].big0 = 0x1000000 + 0x10*i;\r\n    outer2->inner_nodes[i].big1 = 0x1000000 + 0x101*i;\r\n    \r\n    outer3->inner_nodes[i].small0 = 2 + i;\r\n    outer3->inner_nodes[i].small1 = 4*i;\r\n    outer3->inner_nodes[i].big0 = 0x8000000 + 0xF0*i;\r\n    outer3->inner_nodes[i].big1 = 0x8000000 + 0xF0F*i;\r\n  }\r\n  \r\n  // okay eval it here\r\n  int x = 0;\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(rjf): Struct Parameters Eval\r\n\r\nstatic void\r\nstruct_parameter_helper(Basics basics)\r\n{\r\n  basics.a += 1;\r\n  basics.a += 1;\r\n  basics.a += 1;\r\n}\r\n\r\nstatic void\r\nstruct_parameters_eval_tests(void)\r\n{\r\n  Basics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001};\r\n  struct_parameter_helper(basics);\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Global Eval\r\n\r\nstatic int g_abc = 100;\r\nstatic float g_xyz = 21.f;\r\nstatic Alias1 g_kind = Kind_First;\r\n\r\n// TODO(allen): more global test types\r\n\r\nstatic void\r\ncomplicated_global_mutation(int *x){\r\n  *x = (int)g_xyz;\r\n}\r\n\r\nstatic void\r\ncross_unit_global_mutation(void){\r\n  fixed_frac_bits = 10;\r\n}\r\n\r\nstatic void\r\nglobal_eval_tests(void){\r\n  g_abc = 11*11;\r\n  g_xyz = (float)g_abc - 21.f;\r\n  \r\n  int z = g_abc;\r\n  complicated_global_mutation(&z);\r\n  \r\n  complicated_global_mutation(&g_abc);\r\n  \r\n  if (g_kind == Kind_First){\r\n    g_abc -= 1;\r\n    g_kind = Kind_None;\r\n  }\r\n  \r\n  cross_unit_global_mutation();\r\n  \r\n  static int l_abc = 200;\r\n  static float l_xyz = 42.f;\r\n  static Alias1 l_kind = Kind_Second;\r\n  \r\n  l_abc = g_abc*2;\r\n  l_xyz = g_xyz*2;\r\n  l_kind = (Alias1)(g_kind + 1);\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Return Eval\r\n\r\nstatic int\r\ncomplicated_return_expression(void){\r\n  int x = 171717;\r\n  return((x % 13) <= 5?(x % 19)*11:(x - 500)%200);\r\n}\r\n\r\nstatic void\r\nreturn_eval_tests(void){\r\n  complicated_return_expression();\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): TLS Eval\r\n\r\n#if _WIN32\r\n# define thread_var __declspec(thread)\r\n#else\r\n# define thread_var __thread\r\n#endif\r\n\r\nthread_var int tls_a = 100;\r\nthread_var int tls_b = 999;\r\n\r\nstatic void\r\ntls_eval_tests(void){\r\n  tls_a = (tls_a + tls_b)/2;\r\n  tls_b = tls_b - tls_a;\r\n  \r\n  TestFunction *dll_tls_eval_test = mule_get_module_function(\"dll_tls_eval_test\");\r\n  if (dll_tls_eval_test != 0){\r\n    dll_tls_eval_test();\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Complicated Type Coverage Eval\r\n\r\nstruct Complicated_Type_Members{\r\n  int x600[2][2][2][2];\r\n  int *x601[2][2][2][2];\r\n  int (*x602)[2][2][2][2];\r\n  int (*x603[2])[2][2][2];\r\n  int (*(*x604[2])[2])[2][2];\r\n  int (*(*(*x605[2])[2])[2])[2];\r\n  \r\n  int (*x33[2])(void);\r\n  int (*x34[3])(void);\r\n  int (*x35[2][2])(void);\r\n  \r\n  int (*(*z33)(void))[2];\r\n  int (*(*z34)(void))[3];\r\n  int (*(*z35)(void))[2][2];\r\n  \r\n  int   (*(*f2)(void))(void);\r\n  int (*(*(*f3)(void))(void))(void);\r\n  int   (*(*f4)(int))(void);\r\n  int   (*(*f5)(void))(int);\r\n  int   (*(*f6)(int))(int);\r\n  int (*(*(*f7_growing)(char))(short))(int);\r\n  int (*(*(*f7_shrinking)(int))(short))(char);\r\n};\r\n\r\nstatic void\r\ncomplicated_type_coverage_tests(void){\r\n  Complicated_Type_Members m = {0};\r\n  \r\n  int x1 = {0};\r\n  int *x2 = {0};\r\n  int **x3 = {0};\r\n  \r\n  int x4a[2] = {0};\r\n  int *x4[2] = {0};\r\n  int x5a[3] = {0};\r\n  int *x5[3] = {0};\r\n  int *x6[2][2] = {0};\r\n  int (*x7)[2] = {0};\r\n  int (*x8)[3] = {0};\r\n  int (*x9)[2][2] = {0};\r\n  \r\n  int x600[2][2][2][2] = {0};\r\n  int *x601[2][2][2][2] = {0};\r\n  int (*x602)[2][2][2][2] = {0};\r\n  int (*x603[2])[2][2][2] = {0};\r\n  int (*(*x604[2])[2])[2][2] = {0};\r\n  int (*(*(*x605[2])[2])[2])[2] = {0};\r\n  \r\n  int x606_growing  [2][3][4][5] = {0};\r\n  int x606_shrinking[5][4][3][2] = {0};\r\n  \r\n  int (*(*(*x607_growing  [2])[3])[4])[5] = {0};\r\n  int (*(*(*x607_shrinking[5])[4])[3])[2] = {0};\r\n  \r\n  int **x10[2] = {0};\r\n  int **x11[3] = {0};\r\n  int **x12[2][2] = {0};\r\n  int *(*x13)[2] = {0};\r\n  int *(*x14)[3] = {0};\r\n  int *(*x15)[2][2] = {0};\r\n  int **x16[2] = {0};\r\n  int **x17[3] = {0};\r\n  int **x18[2][2] = {0};\r\n  \r\n  int (*y1[2])[2] = {0};\r\n  int (*y2[3])[2] = {0};\r\n  int (*y3[2][2])[2] = {0};\r\n  int (*y4[2])[3] = {0};\r\n  int (*y5[3])[3] = {0};\r\n  int (*y6[2][2])[3] = {0};\r\n  int (*y7[2])[2][2] = {0};\r\n  int (*y8[3])[2][2] = {0};\r\n  int (*y9[2][2])[2][2] = {0};\r\n  \r\n  int (*x19)(void) = {0};\r\n  int (*x20)(int) = {0};\r\n  int (*x21)(int, int) = {0};\r\n  int (*x22)(int*, int) = {0};\r\n  int (*x23)(int**, int) = {0};\r\n  int (*x24)(int**, int*) = {0};\r\n  int (*x25)(int**, int**) = {0};\r\n  \r\n  int *(*x26)(void) = {0};\r\n  int *(*x27)(int) = {0};\r\n  int *(*x28)(int, int) = {0};\r\n  int *(*x29)(int*, int) = {0};\r\n  int *(*x30)(int**, int) = {0};\r\n  int *(*x31)(int**, int*) = {0};\r\n  int *(*x32)(int**, int**) = {0};\r\n  \r\n  int (*x33[2])(void) = {0};\r\n  int (*x34[3])(void) = {0};\r\n  int (*x35[2][2])(void) = {0};\r\n  \r\n  int (*x36[2])(int) = {0};\r\n  int (*x37[3])(int) = {0};\r\n  int (*x38[2][2])(int) = {0};\r\n  \r\n  int (*x39[2])(int, int) = {0};\r\n  int (*x40[3])(int, int) = {0};\r\n  int (*x41[2][2])(int, int) = {0};\r\n  \r\n  int (*x42[2])(int*, int) = {0};\r\n  int (*x43[3])(int*, int) = {0};\r\n  int (*x44[2][2])(int*, int) = {0};\r\n  \r\n  int (*x45[2])(int**, int) = {0};\r\n  int (*x46[3])(int**, int) = {0};\r\n  int (*x47[2][2])(int**, int) = {0};\r\n  \r\n  int (*x48[2])(int**, int*) = {0};\r\n  int (*x49[3])(int**, int*) = {0};\r\n  int (*x50[2][2])(int**, int*) = {0};\r\n  \r\n  int (*x51[2])(int**, int**) = {0};\r\n  int (*x52[3])(int**, int**) = {0};\r\n  int (*x53[2][2])(int**, int**) = {0};\r\n  \r\n  int (*(*z33)(void))[2] = {0};\r\n  int (*(*z34)(void))[3] = {0};\r\n  int (*(*z35)(void))[2][2] = {0};\r\n  \r\n  int (*(*z36)(int))[2] = {0};\r\n  int (*(*z37)(int))[3] = {0};\r\n  int (*(*z38)(int))[2][2] = {0};\r\n  \r\n  int (*(*z39)(int, int))[2] = {0};\r\n  int (*(*z40)(int, int))[3] = {0};\r\n  int (*(*z41)(int, int))[2][2] = {0};\r\n  \r\n  int (*(*z42)(int*, int))[2] = {0};\r\n  int (*(*z43)(int*, int))[3] = {0};\r\n  int (*(*z44)(int*, int))[2][2] = {0};\r\n  \r\n  int (*(*z45)(int**, int))[2] = {0};\r\n  int (*(*z46)(int**, int))[3] = {0};\r\n  int (*(*z47)(int**, int))[2][2] = {0};\r\n  \r\n  int (*(*z48)(int**, int*))[2] = {0};\r\n  int (*(*z49)(int**, int*))[3] = {0};\r\n  int (*(*z50)(int**, int*))[2][2] = {0};\r\n  \r\n  int (*(*z51)(int**, int**))[2] = {0};\r\n  int (*(*z52)(int**, int**))[3] = {0};\r\n  int (*(*z53)(int**, int**))[2][2] = {0};\r\n  \r\n  int (*(*z303[2])(void)) = {0};\r\n  int (*(*z304[3])(void)) = {0};\r\n  int (*(*z305[2][2])(void)) = {0};\r\n  \r\n  int (*(*z306[2])(int)) = {0};\r\n  int (*(*z307[3])(int)) = {0};\r\n  int (*(*z308[2][2])(int)) = {0};\r\n  \r\n  int (*(*z309[2])(int, int)) = {0};\r\n  int (*(*z400[3])(int, int)) = {0};\r\n  int (*(*z401[2][2])(int, int)) = {0};\r\n  \r\n  int (*(*z402[2])(int*, int)) = {0};\r\n  int (*(*z403[3])(int*, int)) = {0};\r\n  int (*(*z404[2][2])(int*, int)) = {0};\r\n  \r\n  int (*(*z405[2])(int**, int)) = {0};\r\n  int (*(*z406[3])(int**, int)) = {0};\r\n  int (*(*z407[2][2])(int**, int)) = {0};\r\n  \r\n  int (*(*z408[2])(int**, int*)) = {0};\r\n  int (*(*z409[3])(int**, int*)) = {0};\r\n  int (*(*z500[2][2])(int**, int*)) = {0};\r\n  \r\n  int (*(*z501[2])(int**, int**)) = {0};\r\n  int (*(*z502[3])(int**, int**)) = {0};\r\n  int (*(*z503[2][2])(int**, int**)) = {0};\r\n  \r\n  int   (*(*f2)(void))(void) = {0};\r\n  int (*(*(*f3)(void))(void))(void) = {0};\r\n  int   (*(*f4)(int))(void) = {0};\r\n  int   (*(*f5)(void))(int) = {0};\r\n  int   (*(*f6)(int))(int) = {0};\r\n  int (*(*(*f7_growing)(char))(short))(int) = {0};\r\n  int (*(*(*f7_shrinking)(int))(short))(char) = {0};\r\n  \r\n  int (*f8)(int (*)(void)) = {0};\r\n  int (*f9)(void (*)(int)) = {0};\r\n  void (*f10)(int (*)(int)) = {0};\r\n  int (*f11)(int, int (*)(void)) = {0};\r\n  int (*f12)(int (*)(void), int) = {0};\r\n  int (*f13)(int (*)(void), int (*)(void)) = {0};\r\n  \r\n  int (*f14)(int (*)(void)) = {0};\r\n  int (*f15)(int (*)(int (*)(void))) = {0};\r\n  int (*f16)(int (*)(int (*)(int (*)(void)))) = {0};\r\n  int (*f17)(int (*)(int (*)(int (*)(int (*)(void))))) = {0};\r\n  \r\n  int (*f18)(int (*)(void)) = {0};\r\n  int (*f19)(int (*(*)(void))(void)) = {0};\r\n  int (*f20)(int (*(*(*)(void))(void))(void)) = {0};\r\n  int (*f21)(int (*(*(*(*)(void))(void))(void))(void)) = {0};\r\n  \r\n  int (*(*(*(*f22)(void))(void))(void))(void) = {0};\r\n  int (*(*(*(*f23)(int [2]))(void))(void))(void) = {0};\r\n  int (*(*(*(*f24)(int *[2]))(int [3]))(void))(void) = {0};\r\n  int (*(*(*(*f25)(int (*)[2]))(int *[3]))(int [4]))(void) = {0};\r\n  int (*(*(*(*f26)(int **(**)[2]))(int (*)[3]))(int *[4]))(int [5]) = {0};\r\n  \r\n  int x = 0;\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Extended Type Coverage Eval\r\n\r\ntemplate<class X>\r\nstruct Template_Example{\r\n  X x;\r\n  int y;\r\n};\r\n\r\ntemplate<class X, class Y>\r\nstruct Template_Example2{\r\n  X x;\r\n  Y y;\r\n};\r\n\r\ntemplate<class X, class Y>\r\nstruct Template_Example3{\r\n  X x;\r\n  Y y;\r\n  Template_Example3(X x, Y y)\r\n  {\r\n    this->x = x;\r\n    this->y = y;\r\n  }\r\n  ~Template_Example3()\r\n  {\r\n    int x = 2;\r\n    int y = 5;\r\n    int z = x + y;\r\n  }\r\n};\r\n\r\nstruct SingleInheritanceBase\r\n{\r\n  int x;\r\n  int y;\r\n};\r\n\r\nstruct SingleInheritanceDerived : SingleInheritanceBase\r\n{\r\n  int z;\r\n  int w;\r\n};\r\n\r\nstruct Has_Members{\r\n  int a;\r\n  int b;\r\n  uint64_t c;\r\n  uint64_t d;\r\n  Basics bas;\r\n  \r\n  int w(void){ return a; }\r\n  int x(void){ return b; }\r\n  uint64_t y(void){ return c; }\r\n  uint64_t z(void){ return d; }\r\n  Basics bas_f(void){ return bas; }\r\n};\r\n\r\nstruct Has_Static_Members{\r\n  int a;\r\n  int b;\r\n  static uint64_t c;\r\n  static uint64_t d;\r\n  \r\n  int w(void){ return a; }\r\n  int x(void){ return b; }\r\n  static uint64_t y(void){ return c; }\r\n  static uint64_t z(void){ return d; }\r\n};\r\n\r\nuint64_t Has_Static_Members::c = 0;\r\nuint64_t Has_Static_Members::d = 0;\r\n\r\nstruct Pointer_To_Member{\r\n  int      Has_Members::*member_ptr_int;\r\n  uint64_t Has_Members::*member_ptr_u64;\r\n  Basics   Has_Members::*member_ptr_bas;\r\n  \r\n  int      (Has_Members::*method_ptr_int)(void);\r\n  uint64_t (Has_Members::*method_ptr_u64)(void);\r\n  Basics   (Has_Members::*method_ptr_bas)(void);\r\n};\r\n\r\nstruct Has_Sub_Types{\r\n  struct Sub_Type1{\r\n    int x;\r\n    int y;\r\n  };\r\n  \r\n  struct Sub_Type2{\r\n    float x;\r\n    float y;\r\n  };\r\n  \r\n  Sub_Type1 a;\r\n  Sub_Type2 b;\r\n};\r\n\r\nstruct Conflicting_Type_Names{\r\n  struct Sub_Type1{\r\n    uint64_t z;\r\n  };\r\n  \r\n  struct Sub_Type2{\r\n    int64_t z;\r\n  };\r\n  \r\n  Sub_Type1 a;\r\n  Sub_Type2 b;\r\n};\r\n\r\nstruct Has_Private_Sub_Types{\r\n  Has_Private_Sub_Types(char x1, char y1,\r\n                        float x2, int y2,\r\n                        int x3, float y3){\r\n    this->a.x = x1;\r\n    this->a.y = y1;\r\n    this->b.x = x2;\r\n    this->b.y = y2;\r\n    this->c.x = x3;\r\n    this->c.y = y3;\r\n  }\r\n  \r\n  struct Public_Sub_Type{\r\n    char x;\r\n    char y;\r\n  };\r\n  Public_Sub_Type a;\r\n  \r\n  protected:\r\n  struct Protected_Sub_Type{\r\n    float x;\r\n    int y;\r\n  };\r\n  Protected_Sub_Type b;\r\n  \r\n  private:\r\n  struct Private_Sub_Type{\r\n    int x;\r\n    float y;\r\n  };\r\n  Private_Sub_Type c;\r\n};\r\n\r\nstruct Vtable_Parent{\r\n  virtual void a_virtual_function(void) = 0;\r\n  virtual void b_virtual_function(void) = 0;\r\n  virtual void c_virtual_function(void) = 0;\r\n  \r\n  void a_virtual_function(int r){\r\n    for (int i = 0; i < r; i += 1){\r\n      a_virtual_function();\r\n    }\r\n  }\r\n};\r\n\r\nstruct Vtable_Child : Vtable_Parent{\r\n  int x;\r\n  int y;\r\n  \r\n  Vtable_Child(int a, int b){\r\n    x = a;\r\n    y = b;\r\n  }\r\n  virtual void a_virtual_function(void){\r\n    x = 0;\r\n  };\r\n  virtual void b_virtual_function(void){\r\n    y = 0;\r\n  };\r\n  virtual void c_virtual_function(void){\r\n    x = y;\r\n  };\r\n};\r\n\r\nstruct Vinheritance_Base{\r\n  int x;\r\n  int y;\r\n  \r\n  virtual void a_virtual_function(void){\r\n    x = 0;\r\n  };\r\n  virtual void b_virtual_function(void){\r\n    y = 0;\r\n  };\r\n  virtual void x_virtual_function(void){\r\n    y = x;\r\n  };\r\n};\r\n\r\nstruct Vinheritance_MidLeft : virtual Vinheritance_Base{\r\n  float left;\r\n  \r\n  virtual void c1_virtual_function(void){\r\n    left = 0;\r\n  };\r\n  virtual void c2_virtual_function(void){\r\n    left = 0;\r\n  };\r\n};\r\n\r\nstruct Vinheritance_MidRight : virtual Vinheritance_Base{\r\n  float right;\r\n  \r\n  virtual void d_virtual_function(void){\r\n    right = 0;\r\n  };\r\n};\r\n\r\nstruct Vinheritance_Child : Vinheritance_MidLeft, Vinheritance_MidRight{\r\n  char *name;\r\n  \r\n  virtual void a_virtual_function(void){\r\n    x = 1;\r\n  };\r\n  virtual void c1_virtual_function(void){\r\n    left = 1;\r\n  };\r\n};\r\n\r\nstruct Minheritance_Base{\r\n  int x;\r\n  int y;\r\n};\r\n\r\nstruct Minheritance_MidLeft : Minheritance_Base{\r\n  float left;\r\n};\r\n\r\nstruct Minheritance_MidRight : Minheritance_Base{\r\n  float right;\r\n};\r\n\r\nstruct Minheritance_Child : Minheritance_MidLeft, Minheritance_MidRight{\r\n  char *name;\r\n};\r\n\r\nstruct Pure\r\n{\r\n  virtual ~Pure() = default;\r\n  virtual void Foo() = 0;\r\n};\r\n\r\nstruct PureChild : Pure\r\n{\r\n  virtual ~PureChild() = default;\r\n  virtual void Foo() {a += 1;}\r\n  double a = 0;\r\n};\r\n\r\nstruct Base\r\n{\r\n  int x;\r\n  int y;\r\n  int z;\r\n  Base(){x = 1; y = 2; z = 3;}\r\n  virtual ~Base() = default;\r\n  virtual void Foo() = 0;\r\n};\r\n\r\nstruct Derived : Base\r\n{\r\n  int r;\r\n  int g;\r\n  int b;\r\n  int a;\r\n  virtual ~Derived() = default;\r\n  virtual void Foo()\r\n  {\r\n    x += 1;\r\n    y += 1;\r\n    y += 1;\r\n    z += 1;\r\n    z += 1;\r\n    z += 1;\r\n    a += 1;\r\n    a += 1;\r\n    a += 1;\r\n    a += 1;\r\n  }\r\n};\r\n\r\nstruct DerivedA : Base\r\n{\r\n  float a;\r\n  float b;\r\n  DerivedA() {a = 123.f; b = 123.f;}\r\n  virtual void Foo() {a += 1;}\r\n  virtual ~DerivedA() = default;\r\n};\r\n\r\nstruct DerivedB : Base\r\n{\r\n  double c;\r\n  double d;\r\n  DerivedB() {c = 123.0; d = 123.0;}\r\n  virtual void Foo() {c += 1;}\r\n  virtual ~DerivedB() = default;\r\n};\r\n\r\nstruct NonVirtualBase\r\n{\r\n  int x;\r\n  int y;\r\n  int z;\r\n};\r\n\r\nstruct NonVirtualDerived : NonVirtualBase\r\n{\r\n  int r;\r\n  int g;\r\n  int b;\r\n  int a;\r\n};\r\n\r\nstruct OverloadedMethods{\r\n  int x;\r\n  int cool_method(void){\r\n    return(x);\r\n  }\r\n  int cool_method(int z){\r\n    int r = x;\r\n    x = z;\r\n    return(r);\r\n  }\r\n  void cool_method(int y, int z){\r\n    if (x < z){\r\n      x = y;\r\n    }\r\n    else{\r\n      x = z;\r\n    }\r\n  }\r\n};\r\n\r\nstruct HasStaticConstMembers\r\n{\r\n  int a;\r\n  int b;\r\n  static int c;\r\n  static int d;\r\n  static const int e = 789;\r\n  static const int f = 101112;\r\n};\r\n\r\nint HasStaticConstMembers::c = 123;\r\nint HasStaticConstMembers::d = 456;\r\n\r\nstruct Has_A_Constructor{\r\n  int n;\r\n  int d;\r\n  Has_A_Constructor(int a, int b){\r\n    int gcd = 1;\r\n    {\r\n      int x = a;\r\n      int y = b;\r\n      if (x < y){\r\n        y = a;\r\n        x = b;\r\n      }\r\n      for (;y > 0;){\r\n        int z = x%y;\r\n        x = y;\r\n        y = z;\r\n      }\r\n      gcd = x;\r\n    }\r\n    n = a/gcd;\r\n    d = b/gcd;\r\n  }\r\n  \r\n  static int N;\r\n  static int D;\r\n  ~Has_A_Constructor(){\r\n    int m = N*d + n*D;\r\n    int e = d*D;\r\n    N = m;\r\n    D = d;\r\n  }\r\n};\r\n\r\nint Has_A_Constructor::N = 0;\r\nint Has_A_Constructor::D = 1;\r\n\r\nstruct Constructor_Gotcha_Test{\r\n  int x;\r\n  int y;\r\n  void Constructor_Gotcha(void){\r\n    x = y = 0;\r\n  }\r\n};\r\n\r\nstruct Has_A_Friend{\r\n  friend struct Modifies_Other;\r\n  int get_x(void){ return x; }\r\n  int get_y(void){ return y; }\r\n  \r\n  private:\r\n  int x;\r\n  int y;\r\n};\r\n\r\nstruct Modifies_Other{\r\n  int x;\r\n  int y;\r\n  \r\n  void talk_to_friend(Has_A_Friend *other){\r\n    other->x = y;\r\n    other->y = x;\r\n  }\r\n};\r\n\r\nnamespace UserNamespace{\r\n  namespace SubA{\r\n    struct Foo{\r\n      int x;\r\n      int y;\r\n    };\r\n  };\r\n  namespace SubB{\r\n    struct Foo{\r\n      float u;\r\n      float v;\r\n    };\r\n  };\r\n  \r\n  SubA::Foo foo_a = {10, 20};\r\n  SubB::Foo foo_b = {0.1f, 0.05f};\r\n  \r\n  static void namespaced_function(void){\r\n    foo_a.x = (int)(foo_a.y*foo_b.u);\r\n    foo_b.v = (float)(foo_a.x*foo_b.v);\r\n  }\r\n};\r\n\r\nstatic void\r\ncall_with_pass_by_reference(int &x){\r\n  x += 1;\r\n}\r\n\r\nstatic void\r\ncall_with_pass_by_const_reference(const int &x){\r\n  int y = x;\r\n}\r\n\r\nstatic void\r\nextended_type_coverage_eval_tests(void){\r\n  ////////////////////////////////\r\n  // NOTE(allen): Extensions to base type system.\r\n  {\r\n    int x = 0;\r\n    const int *x_ptr = &x;\r\n    int *const x_cptr = &x;\r\n    \r\n    call_with_pass_by_reference(x);\r\n    \r\n    call_with_pass_by_const_reference(x);\r\n  }\r\n  \r\n  ////////////////////////////////\r\n  // NOTE(allen): Extensions to user defined types\r\n  {\r\n    Template_Example<float> temp_f = {1.f, 2};\r\n    Template_Example<void*> temp_v = {(void*)&temp_f, 2};\r\n    Template_Example<Template_Example<float> > temp_tf = {temp_f, 2};\r\n    Template_Example2<int, float> temp_if = {2, 1.f};\r\n    Template_Example3<int, float> temp3_if(2, 1.f);\r\n    Template_Example3<void *, float> temp3_vi((void *)&temp3_if, 1.f);\r\n    Template_Example3<int, Template_Example2<int, float>> temp3_itif(123, temp_if);\r\n    \r\n    SingleInheritanceDerived sid;\r\n    sid.x = 123;\r\n    sid.y = 456;\r\n    sid.z = 789;\r\n    sid.w = 999;\r\n    \r\n    Pointer_To_Member pointer_to_member = {\r\n      &Has_Members::a, &Has_Members::c, &Has_Members::bas,\r\n      &Has_Members::x, &Has_Members::z, &Has_Members::bas_f,\r\n    };\r\n    \r\n    Has_Static_Members has_static_members = { 10, 20 };\r\n    Has_Static_Members::c = 100;\r\n    Has_Static_Members::d = 110;\r\n    has_static_members.x();\r\n    has_static_members.y();\r\n    has_static_members.z();\r\n    has_static_members.w();\r\n    \r\n    Has_Sub_Types has_sub_types = {\r\n      {100, 200},\r\n      {.1f, .2f},\r\n    };\r\n    \r\n    Conflicting_Type_Names conflicting_type_names = {\r\n      {10}, {-20},\r\n    };\r\n    \r\n    Has_Private_Sub_Types has_private_sub_types(1, 2, 4, 8, 16, 32);\r\n    \r\n    Vtable_Child vtable_child(1, 2);\r\n    vtable_child.a_virtual_function();\r\n    \r\n    Vinheritance_Child vinheritance_child;\r\n    vinheritance_child.name  = \"foobar\";\r\n    vinheritance_child.left  = 10.5f;\r\n    vinheritance_child.right = 13.0f;\r\n    vinheritance_child.x     = -1;\r\n    vinheritance_child.y     = -1;\r\n    \r\n    Minheritance_Child minheritance_child;\r\n    minheritance_child.name  = \"foobar\";\r\n    minheritance_child.left  = 10.5f;\r\n    minheritance_child.right = 13.0f;\r\n    minheritance_child.Minheritance_MidLeft::x = -1;\r\n    minheritance_child.Minheritance_MidLeft::y = -1;\r\n    minheritance_child.Minheritance_MidRight::x = +1;\r\n    minheritance_child.Minheritance_MidRight::y = +1;\r\n    \r\n    Pure *child = new PureChild();\r\n    child->Foo();\r\n    child->Foo();\r\n    child->Foo();\r\n    delete child;\r\n    \r\n    Base *derived = new Derived();\r\n    derived->Foo();\r\n    derived->Foo();\r\n    derived->Foo();\r\n    delete derived;\r\n    \r\n    NonVirtualBase *non_virtual_derived = new NonVirtualDerived();\r\n    non_virtual_derived->x += 1;\r\n    non_virtual_derived->x += 1;\r\n    non_virtual_derived->x += 1;\r\n    \r\n    std::unique_ptr<Base> ridiculous_cplusplus_base_class = std::make_unique<DerivedB>();\r\n    \r\n    std::vector<std::unique_ptr<Base>> ridiculous_cplusplus_array;\r\n    for(int i = 0; i < 1024; i += 1)\r\n    {\r\n      if((i & 1) == 1)\r\n      {\r\n        ridiculous_cplusplus_array.push_back(std::make_unique<DerivedA>());\r\n      }\r\n      else\r\n      {\r\n        ridiculous_cplusplus_array.push_back(std::make_unique<DerivedB>());\r\n      }\r\n    }\r\n    \r\n    Base *base_array[1024] = {0};\r\n    for(int i = 0; i < sizeof(base_array)/sizeof(base_array[0]); i += 1)\r\n    {\r\n      if((i & 1) == 1)\r\n      {\r\n        base_array[i] = new DerivedA();\r\n      }\r\n      else\r\n      {\r\n        base_array[i] = new DerivedB();\r\n      }\r\n    }\r\n    \r\n    OverloadedMethods overloaded_methods;\r\n    {\r\n      overloaded_methods.x = 0;\r\n      int a = overloaded_methods.cool_method();\r\n      overloaded_methods.cool_method(-10, 100);\r\n      int b = overloaded_methods.cool_method(100);\r\n      overloaded_methods.cool_method(b*2, a*2);\r\n      int c = overloaded_methods.cool_method(a + b);\r\n      int z = c;\r\n    }\r\n    \r\n    Has_A_Constructor construct_me(360, 25);\r\n    \r\n    Has_A_Friend has_a_friend;\r\n    \r\n    Modifies_Other modifies_other;\r\n    modifies_other.x = 57;\r\n    modifies_other.y = 66;\r\n    \r\n    modifies_other.talk_to_friend(&has_a_friend);\r\n    \r\n    int x = has_a_friend.get_x();\r\n    int y = has_a_friend.get_y();\r\n    int z = x;\r\n    \r\n    HasStaticConstMembers static_const_members = {0};\r\n    static_const_members.a = 123 + HasStaticConstMembers::c * HasStaticConstMembers::e;\r\n    static_const_members.b = 456 + HasStaticConstMembers::d * HasStaticConstMembers::f;\r\n  }\r\n  \r\n  ////////////////////////////////\r\n  // NOTE(allen): Namespaces\r\n  {\r\n    UserNamespace::namespaced_function();\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Templated Function Eval Tests\r\n\r\ntypedef struct TemplateArg TemplateArg;\r\nstruct TemplateArg\r\n{\r\n  int x;\r\n  int y;\r\n  int z;\r\n  float a;\r\n  float b;\r\n  float c;\r\n  char *name;\r\n};\r\n\r\ntemplate<typename T> static T\r\ntemplated_factorial(T t)\r\n{\r\n  T result = t;\r\n  if(t > 1)\r\n  {\r\n    result *= templated_factorial<T>(t-1);\r\n  }\r\n  return result;\r\n}\r\n\r\ntemplate<typename T> static T\r\ncompute_template_arg_info(T t)\r\n{\r\n  int sum = t.x + t.y + t.z;\r\n  int size = sizeof(t);\r\n  float sum_f = t.a + t.b + t.c;\r\n  OutputDebugStringA(t.name);\r\n  return t;\r\n}\r\n\r\nstatic void\r\ntemplated_function_eval_tests(void)\r\n{\r\n  int int_factorial = templated_factorial<int>(10);\r\n  float float_factorial = templated_factorial<float>(10);\r\n  TemplateArg arg = {1, 2, 3, 4.f, 5.f, 6.f, \"my template arg\"};\r\n  compute_template_arg_info(arg);\r\n  int x = 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): C Type Coverage\r\n\r\nextern \"C\"{\r\n#include \"mule_c.h\"\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Inline Line Info Tests\r\n\r\n#if defined(_MSC_VER)\r\n# define FORCE_INLINE __forceinline\r\n#elif defined(__clang__)\r\n# define FORCE_INLINE  __attribute__((always_inline))\r\n#else\r\n# error need force inline for this compiler\r\n#endif\r\n\r\nstatic FORCE_INLINE void\r\nbasic_inlinee(int inlinee_param_x, int inlinee_param_y, int inlinee_param_z)\r\n{\r\n  OutputDebugStringA(\"A\\n\");\r\n  OutputDebugStringA(\"B\\n\");\r\n  OutputDebugStringA(\"C\\n\");\r\n  OutputDebugStringA(\"D\\n\");\r\n}\r\n\r\nstatic void\r\nbasic_inline_tests(void)\r\n{\r\n  OutputDebugStringA(\"{\\n\");\r\n  basic_inlinee(12, 34, 56);\r\n  OutputDebugStringA(\"}\\n\");\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Fancy Visualization Eval Tests\r\n\r\nstruct PackedBits\r\n{\r\n  unsigned char b1 : 1;\r\n  unsigned char b2 : 1;\r\n  unsigned char b3 : 1;\r\n  unsigned char b4 : 1;\r\n  unsigned char b5 : 1;\r\n  unsigned char b6 : 1;\r\n};\r\nraddbg_type_view(unsigned char : 1, bool($));\r\n\r\nstruct Bitmap\r\n{\r\n  unsigned char *base;\r\n  int width;\r\n  int height;\r\n};\r\nraddbg_type_view(Bitmap, bitmap(base, width, height));\r\n\r\nstatic unsigned int\r\nmule_bswap_u32(unsigned int x)\r\n{\r\n  unsigned int result = (((x & 0xFF000000) >> 24) |\r\n                         ((x & 0x00FF0000) >> 8)  |\r\n                         ((x & 0x0000FF00) << 8)  |\r\n                         ((x & 0x000000FF) << 24));\r\n  return result;\r\n}\r\n\r\nstatic void\r\nfancy_viz_eval_tests(void)\r\n{\r\n  //- rjf: windows -> GetLastError\r\n#if _WIN32\r\n  DWORD error_code = 0;\r\n  SetLastError(1234);\r\n  error_code = GetLastError();\r\n  SetLastError(4567);\r\n  error_code = GetLastError();\r\n  (void)error_code;\r\n#endif\r\n  \r\n  //- rjf: booleans (checkboxes)\r\n  bool bool1 = 0; raddbg_pin(bool1);\r\n  bool bool2 = 1; raddbg_pin(bool2);\r\n  bool bool3 = 0; raddbg_pin(bool3);\r\n  PackedBits packed_bits = {};\r\n  packed_bits.b1 = 1;\r\n  packed_bits.b3 = 1;\r\n  packed_bits.b5 = 1;\r\n  \r\n  //- rjf: sliders\r\n  float slide1 = 500.f; raddbg_pin(range1(slide1, 0, 1000));\r\n  double slide2 = 0.75; raddbg_pin(range1(slide2, 0, 1.0));\r\n  int slide3 = 25;      raddbg_pin(range1(slide3, 0, 100));\r\n  \r\n  //- rjf: colors\r\n  float example_color_4f32[4] = {1.00f, 0.85f, 0.25f, 1.00f};\r\n  unsigned int example_color_u32 = 0xff6f30ff;\r\n  struct {float r, g, b, a;} example_color_struct = {0.50f, 0.95f, 0.75f, 1.00f};\r\n  int x0 = 0;\r\n  raddbg_pin(color(example_color_4f32));\r\n  raddbg_pin(color(example_color_u32));\r\n  raddbg_pin(color(example_color_struct));\r\n  \r\n  //- rjf: multiline text\r\n  char *long_string = (\"This is an example of some very long text with line breaks\\n\"\r\n                       \"in it. This is a very common kind of data which is inspected\\n\"\r\n                       \"in the debugger while programming, and it is often a pain\\n\"\r\n                       \"when it is poorly supported.\\n\");\r\n  char *code_string = (\"#include <stdio.h>\\n\"\r\n                       \"\\n\"\r\n                       \"int main(int argc, char**argv)\\n\"\r\n                       \"{\\n\"\r\n                       \"  printf(\\\"Hello, World!\\\\n\\\");\\n\"\r\n                       \"  return 0;\\n\"\r\n                       \"}\\n\\n\");\r\n  int x1 = 0;\r\n  raddbg_pin(text(long_string));\r\n  raddbg_pin(text(code_string, lang=c));\r\n  raddbg_pin(disasm(fancy_viz_eval_tests));\r\n  \r\n  //- rjf: programmatic memory annotations\r\n  void *some_block_of_memory = malloc(256);\r\n  memset(some_block_of_memory, 0x27, 256);\r\n  raddbg_annotate_vaddr_range(some_block_of_memory, 256, \"test memory annotation\");\r\n  \r\n  //- rjf: half-floats\r\n  PackedF16 f16s[] =\r\n  {\r\n    {0x0001}, // ~0.000000059604645\r\n    {0x03ff}, // ~0.000060975552\r\n    {0x0400}, // ~0.00006103515625\r\n    {0x3555}, // ~0.33325195\r\n    {0x3bff}, // ~0.99951172\r\n    {0x3c00}, // 1\r\n    {0x3c01}, // 1.00097656\r\n    {0x7bff}, // 65504,\r\n    {0x7c00}, // +inf\r\n    {0xfc00}, // -inf\r\n  };\r\n  \r\n  //- rjf: table index lookups\r\n  struct\r\n  {\r\n    char *name;\r\n    int x;\r\n    int y;\r\n    int z;\r\n  }\r\n  nodes[] =\r\n  {\r\n    {\"---\",     1,  7,  3},\r\n    {\"---\",     5,  4,  2},\r\n    {\"second\", 12, 41, 22},\r\n    {\"---\",     8,  9,  1},\r\n    {\"---\",     1,  1,  1},\r\n    {\"first\",  50, 50, 50},\r\n    {\"fourth\",  7,  7,  7},\r\n    {\"---\",     7, 12,  1},\r\n    {\"third\",  27, 43, 41},\r\n    {\"---\",     2, 17, 50},\r\n  };\r\n  int node_indices[] =\r\n  {\r\n    5, 2, 8, 6\r\n  };\r\n  raddbg_pin(columns(node_indices, nodes[$]));\r\n  \r\n  //- rjf: bitmaps\r\n  unsigned int background_color = 0x00000000;\r\n  unsigned int main_color       = 0xff2424ff;\r\n  unsigned int shine_color      = 0xff5693ff;\r\n  unsigned int shadow_color     = 0xff238faf;\r\n  unsigned int bg = mule_bswap_u32(background_color);\r\n  unsigned int cl = mule_bswap_u32(main_color);\r\n  unsigned int sn = mule_bswap_u32(shine_color);\r\n  unsigned int sh = mule_bswap_u32(shadow_color);\r\n  unsigned int pixels[] =\r\n  {\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, cl, cl, bg, cl, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, cl, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, cl, sh, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, cl, cl, cl, bg, cl, sh, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, cl, sn, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, sh, sn, cl, cl, cl, sh, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, sh, cl, cl, cl, sh, sh, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, sh, sh, sh, bg, bg, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg,\r\n    bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg, bg,\r\n  };\r\n  raddbg_pin(bitmap(pixels, 18, 18));\r\n  for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1)\r\n  {\r\n    unsigned int r = pixels[i]&0x000000ff;\r\n    unsigned int a = pixels[i]&0xff000000;\r\n    pixels[i] = pixels[i]>>8;\r\n    pixels[i] &= ~0xffff0000;\r\n    pixels[i] |= (r<<16);\r\n    pixels[i] |= (a);\r\n  }\r\n  for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1)\r\n  {\r\n    unsigned int r = pixels[i]&0x000000ff;\r\n    unsigned int a = pixels[i]&0xff000000;\r\n    pixels[i] = pixels[i]>>8;\r\n    pixels[i] &= ~0xffff0000;\r\n    pixels[i] |= (r<<16);\r\n    pixels[i] |= (a);\r\n  }\r\n  for(int i = 0; i < sizeof(pixels)/sizeof(pixels[0]); i += 1)\r\n  {\r\n    unsigned int r = pixels[i]&0x000000ff;\r\n    unsigned int a = pixels[i]&0xff000000;\r\n    pixels[i] = pixels[i]>>8;\r\n    pixels[i] &= ~0xffff0000;\r\n    pixels[i] |= (r<<16);\r\n    pixels[i] |= (a);\r\n  }\r\n  int x2 = 0;\r\n  \r\n  //- rjf: type-viewed bitmaps\r\n  Bitmap foo = {(unsigned char *)&pixels[0], 18, 18};\r\n  raddbg_pin(foo);\r\n  \r\n  //- rjf: name collisions with debugger rules\r\n  Function_Few_Params_Type *raw = 0;\r\n  char *text = \"some_important_text_here\\n\";\r\n  Bitmap bitmap = foo;\r\n  int x3 = 0;\r\n  \r\n  //- rjf: 3D geometry\r\n  float vertex_data[] = // pos.x, pos.y, pos.z, nor.x, nor.y, nor.z, tex.u, tex.v, col.r, col.g, col.b, ...\r\n  {\r\n    -1.0f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  2.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  8.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    1.0f,  1.0f, -1.0f,  0.0f,  0.0f, -1.0f, 10.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f,  0.6f, -1.0f,  0.0f,  0.0f, -1.0f,  2.0f,  2.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f,  0.6f, -1.0f,  0.0f,  0.0f, -1.0f,  8.0f,  2.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f, -0.6f, -1.0f,  0.0f,  0.0f, -1.0f,  2.0f,  8.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f, -0.6f, -1.0f,  0.0f,  0.0f, -1.0f,  8.0f,  8.0f,  0.973f,  0.480f,  0.002f,\r\n    -1.0f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  0.0f, 10.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  2.0f, 10.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f,  8.0f, 10.0f,  0.973f,  0.480f,  0.002f,\r\n    1.0f, -1.0f, -1.0f,  0.0f,  0.0f, -1.0f, 10.0f, 10.0f,  0.973f,  0.480f,  0.002f,\r\n    1.0f,  1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  1.0f, -0.6f,  1.0f,  0.0f,  0.0f,  2.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  1.0f,  0.6f,  1.0f,  0.0f,  0.0f,  8.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  1.0f,  1.0f,  1.0f,  0.0f,  0.0f, 10.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  2.0f,  2.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  8.0f,  2.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  2.0f,  8.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  8.0f,  8.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f, 10.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -1.0f, -0.6f,  1.0f,  0.0f,  0.0f,  2.0f, 10.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -1.0f,  0.6f,  1.0f,  0.0f,  0.0f,  8.0f, 10.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -1.0f,  1.0f,  1.0f,  0.0f,  0.0f, 10.0f, 10.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f,  2.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f,  8.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -1.0f,  1.0f,  1.0f,  0.0f,  0.0f,  1.0f, 10.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  1.0f,  2.0f,  2.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  1.0f,  8.0f,  2.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  1.0f,  2.0f,  8.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  1.0f,  8.0f,  8.0f,  0.612f,  0.000f,  0.069f,\r\n    1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  1.0f,  0.0f, 10.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f, -1.0f,  1.0f,  0.0f,  0.0f,  1.0f,  2.0f, 10.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f, -1.0f,  1.0f,  0.0f,  0.0f,  1.0f,  8.0f, 10.0f,  0.612f,  0.000f,  0.069f,\r\n    -1.0f, -1.0f,  1.0f,  0.0f,  0.0f,  1.0f, 10.0f, 10.0f,  0.612f,  0.000f,  0.069f,\r\n    -1.0f,  1.0f,  1.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  1.0f,  0.6f, -1.0f,  0.0f,  0.0f,  2.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  1.0f, -0.6f, -1.0f,  0.0f,  0.0f,  8.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  1.0f, -1.0f, -1.0f,  0.0f,  0.0f, 10.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  0.6f,  0.6f, -1.0f,  0.0f,  0.0f,  2.0f,  2.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  0.6f, -0.6f, -1.0f,  0.0f,  0.0f,  8.0f,  2.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -0.6f,  0.6f, -1.0f,  0.0f,  0.0f,  2.0f,  8.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -0.6f, -0.6f, -1.0f,  0.0f,  0.0f,  8.0f,  8.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -1.0f,  1.0f, -1.0f,  0.0f,  0.0f,  0.0f, 10.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -1.0f,  0.6f, -1.0f,  0.0f,  0.0f,  2.0f, 10.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -1.0f, -0.6f, -1.0f,  0.0f,  0.0f,  8.0f, 10.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -1.0f, -1.0f, -1.0f,  0.0f,  0.0f, 10.0f, 10.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f,  2.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f,  8.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    1.0f,  1.0f,  1.0f,  0.0f,  1.0f,  0.0f, 10.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f,  0.6f,  0.0f,  1.0f,  0.0f,  2.0f,  2.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f,  0.6f,  0.0f,  1.0f,  0.0f,  8.0f,  2.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f, -0.6f,  0.0f,  1.0f,  0.0f,  2.0f,  8.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f, -0.6f,  0.0f,  1.0f,  0.0f,  8.0f,  8.0f,  0.000f,  0.254f,  0.637f,\r\n    -1.0f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f,  0.0f, 10.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f,  2.0f, 10.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f,  8.0f, 10.0f,  0.000f,  0.254f,  0.637f,\r\n    1.0f,  1.0f, -1.0f,  0.0f,  1.0f,  0.0f, 10.0f, 10.0f,  0.000f,  0.254f,  0.637f,\r\n    -1.0f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f,  2.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f,  8.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    1.0f, -1.0f, -1.0f,  0.0f, -1.0f,  0.0f, 10.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f, -0.6f,  0.0f, -1.0f,  0.0f,  2.0f,  2.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f, -0.6f,  0.0f, -1.0f,  0.0f,  8.0f,  2.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f,  0.6f,  0.0f, -1.0f,  0.0f,  2.0f,  8.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f,  0.6f,  0.0f, -1.0f,  0.0f,  8.0f,  8.0f,  0.001f,  0.447f,  0.067f,\r\n    -1.0f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f,  0.0f, 10.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f,  2.0f, 10.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f,  8.0f, 10.0f,  0.001f,  0.447f,  0.067f,\r\n    1.0f, -1.0f,  1.0f,  0.0f, -1.0f,  0.0f, 10.0f, 10.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f,  0.6f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f,  0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f, -0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f, -0.6f, -1.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f,  0.6f, -0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f,  0.6f, -1.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f, -0.6f, -1.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f, -0.6f, -0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f, -0.6f, -1.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f, -0.6f, -0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f, -0.6f, -0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f, -0.6f, -1.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f,  0.6f, -0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    -0.6f,  0.6f, -1.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f,  0.6f, -1.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    0.6f,  0.6f, -0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.973f,  0.480f,  0.002f,\r\n    1.0f,  0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f,  0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f, -0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f,  0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f, -0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  0.6f,  0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f,  0.6f,  0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f,  0.6f, -0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f,  0.6f, -0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f, -0.6f,  0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -0.6f,  0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    1.0f, -0.6f, -0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f, -0.6f, -0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.897f,  0.163f,  0.011f,\r\n    0.6f,  0.6f,  1.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f,  0.6f,  0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f, -0.6f,  0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f, -0.6f,  1.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f,  0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f,  0.6f,  1.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f, -0.6f,  1.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f, -0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f, -0.6f,  1.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f, -0.6f,  0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f, -0.6f,  0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f, -0.6f,  1.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f,  0.6f,  0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    0.6f,  0.6f,  1.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f,  0.6f,  1.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -0.6f,  0.6f,  0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.612f,  0.000f,  0.069f,\r\n    -1.0f,  0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f,  0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f, -0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f,  0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f, -0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -0.6f,  0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f, -0.6f,  0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f, -0.6f, -0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f, -0.6f, -0.6f,  0.0f,  1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f,  0.6f,  0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  0.6f,  0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -1.0f,  0.6f, -0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f,  0.6f, -0.6f,  0.0f, -1.0f,  0.0f,  0.0f,  0.0f,  0.127f,  0.116f,  0.408f,\r\n    -0.6f,  1.0f,  0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f, -0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  0.6f,  0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f,  0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f, -0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  0.6f, -0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f,  1.0f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  1.0f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    0.6f,  0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.000f,  0.254f,  0.637f,\r\n    -0.6f, -0.6f,  0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f,  0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f, -0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -0.6f, -0.6f,  1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f,  0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -0.6f,  0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -0.6f, -0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f, -0.6f, -1.0f,  0.0f,  0.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -0.6f, -0.6f,  0.0f,  0.0f,  1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -1.0f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    -0.6f, -0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -0.6f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n    0.6f, -1.0f,  0.6f,  0.0f,  0.0f, -1.0f,  0.0f,  0.0f,  0.001f,  0.447f,  0.067f,\r\n  };\r\n  unsigned int index_data[] =\r\n  {\r\n    0,   1,   9,   9,   8,   0,   1,   2,   5,   5,   4,   1,   6,   7,  10,  10,   9,   6,   2,   3,  11,  11,  10,   2,\r\n    12,  13,  21,  21,  20,  12,  13,  14,  17,  17,  16,  13,  18,  19,  22,  22,  21,  18,  14,  15,  23,  23,  22,  14,\r\n    24,  25,  33,  33,  32,  24,  25,  26,  29,  29,  28,  25,  30,  31,  34,  34,  33,  30,  26,  27,  35,  35,  34,  26,\r\n    36,  37,  45,  45,  44,  36,  37,  38,  41,  41,  40,  37,  42,  43,  46,  46,  45,  42,  38,  39,  47,  47,  46,  38,\r\n    48,  49,  57,  57,  56,  48,  49,  50,  53,  53,  52,  49,  54,  55,  58,  58,  57,  54,  50,  51,  59,  59,  58,  50,\r\n    60,  61,  69,  69,  68,  60,  61,  62,  65,  65,  64,  61,  66,  67,  70,  70,  69,  66,  62,  63,  71,  71,  70,  62,\r\n    72,  73,  74,  74,  75,  72,  76,  77,  78,  78,  79,  76,  80,  81,  82,  82,  83,  80,  84,  85,  86,  86,  87,  84,\r\n    88,  89,  90,  90,  91,  88,  92,  93,  94,  94,  95,  92,  96,  97,  98,  98,  99,  96, 100, 101, 102, 102, 103, 100,\r\n    104, 105, 106, 106, 107, 104, 108, 109, 110, 110, 111, 108, 112, 113, 114, 114, 115, 112, 116, 117, 118, 118, 119, 116,\r\n    120, 121, 122, 122, 123, 120, 124, 125, 126, 126, 127, 124, 128, 129, 130, 130, 131, 128, 132, 133, 134, 134, 135, 132,\r\n    136, 137, 138, 138, 139, 136, 140, 141, 142, 142, 143, 140, 144, 145, 146, 146, 147, 144, 148, 149, 150, 150, 151, 148,\r\n    152, 153, 154, 154, 155, 152, 156, 157, 158, 158, 159, 156, 160, 161, 162, 162, 163, 160, 164, 165, 166, 166, 167, 164,\r\n  };\r\n  int count = (sizeof index_data/4);\r\n  float *vtx = vertex_data;\r\n  int vtx_size = sizeof vertex_data;\r\n  raddbg_pin(geo3d(index_data, count = count, vtx = vtx, vtx_size = vtx_size));\r\n  int x4 = 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Markup Tests\r\n\r\nstatic void\r\nmarkup_tests(void)\r\n{\r\n  int x = 0;\r\n  raddbg_add_breakpoint(&x, sizeof(x), 0, 1, 0);\r\n  for(int i = 0; i < 10000; i += 1)\r\n  {\r\n    if(i == 5000)\r\n    {\r\n      x += 1;\r\n    }\r\n  }\r\n  raddbg_remove_breakpoint(&x, sizeof(x), 0, 1, 0);\r\n}\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Function Overload Resolution\r\n\r\nstatic int\r\noverloaded_function(float y){\r\n  int r = (int)(y + 0.5f);\r\n  return(r);\r\n}\r\n\r\nstatic int\r\noverloaded_function(float y, int x){\r\n  int r = overloaded_function(y) + x;\r\n  return(r);\r\n}\r\n\r\nstatic int\r\noverloaded_function(int x){\r\n  float y = (float)x;\r\n  int r = overloaded_function(y, 1);\r\n  return(r);\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Control Flow Stepping\r\n\r\nstatic void\r\ncontrol_flow_stepping_tests(void){\r\n  {\r\n    int a = 1;\r\n    if (a < 1){\r\n      a += 1;\r\n    }\r\n    if (a < 2){\r\n      a += 2;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int a = 1;\r\n    if (a < 1)\r\n    {\r\n      a += 1;\r\n    }\r\n    if (a < 2)\r\n    {\r\n      a += 2;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int a = 1;\r\n    if (a < 1)\r\n      a += 1;\r\n    if (a < 2)\r\n      a += 2;\r\n  }\r\n  \r\n  {\r\n    int a = 1;\r\n    int b = 2;\r\n    if (a <= b){\r\n      if (a == b){\r\n        b += 1;\r\n      }\r\n      else{\r\n        a += 1;\r\n      }\r\n    }\r\n    else{\r\n      if (a%2){\r\n        a = b;\r\n      }\r\n      else{\r\n        a = b - 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  {\r\n    int a = 1;\r\n    int b = 2;\r\n    if (a <= b)\r\n    {\r\n      if (a == b)\r\n      {\r\n        b += 1;\r\n      }\r\n      else\r\n      {\r\n        a += 1;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      if (a%2)\r\n      {\r\n        a = b;\r\n      }\r\n      else\r\n      {\r\n        a = b - 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  {\r\n    int a = 1;\r\n    int b = 2;\r\n    if (a <= b)\r\n      if (a == b)\r\n      b += 1;\r\n    else\r\n      a += 1;\r\n    else\r\n      if (a%2)\r\n      a = b;\r\n    else\r\n      a = b - 1;\r\n  }\r\n  \r\n  {\r\n    int x = 0;\r\n    for (int i = 0; i < 10; i += 1){\r\n      x += i;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int x = 0;\r\n    for (int i = 0; i < 10; i += 1)\r\n    {\r\n      x += i;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int x = 0;\r\n    for (int i = 0; i < 10; i += 1)\r\n      x += i;\r\n  }\r\n  \r\n  {\r\n    int x = 0;\r\n    for (int i = 0; i < 10; i += 1) x += i;\r\n  }\r\n  \r\n  {\r\n    int a = 1;\r\n    for (;a < 10;){\r\n      switch (a){\r\n        case 0: case 1: case 2:\r\n        {\r\n          a += 2;\r\n        }break;\r\n        \r\n        default:\r\n        case 4:\r\n        case 5:\r\n        {\r\n          a += 1;\r\n        }break;\r\n        \r\n        case 6: a += 1; break;\r\n        case 7: a += 1;\r\n        case 8:\r\n        case 9: a += 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  {\r\n    int i = 0;\r\n    while (i < 5){\r\n      i += 1;\r\n    }\r\n    \r\n    while (i < 10)\r\n    {\r\n      i += 1;\r\n    }\r\n    \r\n    while (i < 15)\r\n      i += 1;\r\n    \r\n    while (i < 20) i += 1;\r\n  }\r\n  \r\n  {\r\n    int i = 0;\r\n    do\r\n    {\r\n      i += 1;\r\n    } while (i < 10);\r\n  }\r\n  \r\n  {\r\n    int i = 17;\r\n    \r\n    check_again:\r\n    if (i <= 1) goto done;\r\n    if ((i&1) == 0) goto even_case;\r\n    \r\n    // odd_case:\r\n    i = 3*i + 1;\r\n    \r\n    even_case:\r\n    i /= 2;\r\n    goto check_again;\r\n    \r\n    done:;\r\n  }\r\n  \r\n  {\r\n    int x = 15;\r\n    label_same_line:; x -= 1; if(x > 0) { goto label_same_line; } else { goto end_label_same_line; }\r\n  }\r\n  end_label_same_line:;\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Indirect Call/Jump Stepping Tests\r\n\r\ntypedef int FunctionType(int);\r\n\r\nstatic int\r\nfunction_foo(int a){\r\n  if (a < 1){\r\n    a += 1;\r\n  }\r\n  if (a < 2){\r\n    a += 2;\r\n  }\r\n  return(a);\r\n}\r\n\r\nstatic int\r\nfunction_bar(int x){\r\n  for (int i = 0; i < 10; i += 1){\r\n    x += i;\r\n  }\r\n  return(x);\r\n}\r\n\r\n\r\nstatic void\r\nindirect_call_jump_stepping_tests(void){\r\n  int z = 1;\r\n  FunctionType *ptr = function_foo;\r\n  z = ptr(z);\r\n  if ((z & 1) == 0){\r\n    ptr = function_bar;\r\n  }\r\n  z = ptr(z);\r\n  \r\n  switch (z&7){\r\n    case 0:\r\n    {\r\n      z += 2;\r\n      ptr = function_bar;\r\n    }break;\r\n    \r\n    case 1:\r\n    {\r\n      z += 1;\r\n      ptr = function_bar;\r\n    }break;\r\n    \r\n    case 2:\r\n    {\r\n      z *= 2;\r\n      ptr = function_bar;\r\n    }break;\r\n    \r\n    case 3:\r\n    {\r\n      z -= 10;\r\n      ptr = function_foo;\r\n    }break;\r\n    \r\n    case 4:\r\n    {\r\n      z -= 5;\r\n      ptr = function_foo;\r\n    }break;\r\n    \r\n    case 5:\r\n    {\r\n      z = z ^ 0x10;\r\n      ptr = function_foo;\r\n    }break;\r\n    \r\n    case 6:\r\n    {\r\n      z = z & ~0x10;\r\n      ptr = function_foo;\r\n    }break;\r\n    \r\n    case 7:\r\n    {\r\n      z = z | 0x10;\r\n      ptr = function_foo;\r\n    }break;\r\n  }\r\n  \r\n  z = ptr(z);\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(rjf): alloca (Variable-Width Stack Changes) Stepping Tests\r\n\r\nstatic void\r\nalloca_stepping_tests(void)\r\n{\r\n  int x = 1;\r\n  int y = 3;\r\n  int z = 5;\r\n  \r\n#if _WIN32\r\n  int *mem = (int *)_alloca((x+y+z)*sizeof(int));\r\n  mem[0] = x;\r\n  mem[1] = y;\r\n  mem[2] = z;\r\n#else\r\n  int *mem = (int *)__builtin_alloca((x+y+z)*sizeof(int));\r\n  mem[0] = x;\r\n  mem[1] = y;\r\n  mem[2] = z;\r\n#endif\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Overloaded Line Stepping\r\n\r\nstatic int\r\nfunction_get_integer(void){\r\n  return(1);\r\n}\r\n\r\nstatic void\r\nfunction_with_multiple_parameters(int x, int y){\r\n  x += y;\r\n}\r\n\r\nstatic int\r\nrecursive_single_line(int x){ return(x <= 1?0:x + recursive_single_line(x/2)); }\r\n\r\nstatic int shared_1(int x) { return(x); } static int shared_2(int x) { return(1 + shared_1(x)); }\r\n\r\nstatic void\r\noverloaded_line_stepping_tests(void){\r\n  function_with_multiple_parameters(function_get_integer(), function_get_integer());\r\n  function_with_multiple_parameters(function_get_integer(), function_get_integer());\r\n  function_with_multiple_parameters(function_get_integer(), function_get_integer());\r\n  \r\n  recursive_single_line(50);\r\n  recursive_single_line(50);\r\n  recursive_single_line(50);\r\n  \r\n  shared_2(5);\r\n  shared_2(5);\r\n  shared_2(5);\r\n  \r\n  function_get_integer(); shared_1(1); shared_1(2);\r\n  \r\n  if ((shared_2(10) && shared_2(-1)) ||\r\n      shared_2(function_get_integer())){\r\n    int x = 0;\r\n  }\r\n  else{\r\n    int y = 0;\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Long Jump Stepping\r\n\r\n#include <setjmp.h>\r\n\r\nstatic jmp_buf global_jump_buffer;\r\nstatic int global_jump_x;\r\n\r\nstatic void\r\nlong_jump_from_function(void){\r\n  int spin = 0;\r\n  for (; spin < 5; spin += 1);\r\n  longjmp(global_jump_buffer, 2);\r\n  global_jump_x = spin;\r\n}\r\n\r\nstatic void\r\nlong_jump_wrapped_in_function(void){\r\n  global_jump_x = 0;\r\n  int val = setjmp(global_jump_buffer);\r\n  if (val == 0){\r\n    global_jump_x = 1;\r\n    longjmp(global_jump_buffer, 1);\r\n  }\r\n  else if (val == 1){\r\n    if (global_jump_x == 1){\r\n      global_jump_x = 2;\r\n      long_jump_from_function();\r\n    }\r\n  }\r\n  else if (val == 2){\r\n    global_jump_x = 3;\r\n  }\r\n}\r\n\r\nstatic void\r\nlong_jump_stepping_tests(void){\r\n  \r\n  long_jump_wrapped_in_function();\r\n  \r\n  long_jump_wrapped_in_function();\r\n  \r\n  long_jump_wrapped_in_function();\r\n  \r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Recursion Stepping\r\n\r\nstatic int\r\nrecursive_call(int x){\r\n  if (x <= 1){\r\n    return(x);\r\n  }\r\n  \r\n  int r1 = recursive_call(x - 1);\r\n  int r2 = recursive_call(x - 2);\r\n  return(r1 + r2);\r\n}\r\n\r\nstatic int\r\ntail_recursive_call(int x, int m){\r\n  if (x <= 1){\r\n    return(m);\r\n  }\r\n  return(tail_recursive_call(x - 1, x*m));\r\n}\r\n\r\nstatic void\r\nrecursion_stepping_tests(void){\r\n  \r\n  recursive_call(4);\r\n  \r\n  recursive_call(4);\r\n  \r\n  tail_recursive_call(5, 1);\r\n  \r\n  tail_recursive_call(5, 1);\r\n  \r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(rjf): Thread Stepping\r\n\r\n#if _WIN32\r\nDWORD thread_step_thread(void *p)\r\n{\r\n  int x = 0;\r\n  for(int i = 0; i < 100000; i += 1)\r\n  {\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n    x += 1;\r\n  }\r\n  return 0;\r\n}\r\n#endif\r\n\r\nvoid thread_stepping_tests(void)\r\n{\r\n#if _WIN32\r\n  HANDLE h[8] = {0};\r\n  for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1)\r\n  {\r\n    DWORD id = 0;\r\n    h[i] = CreateThread(0, 0, thread_step_thread, 0, CREATE_SUSPENDED, &id);\r\n    raddbg_thread_id_name(id, \"thread_step_thread_%i\", i);\r\n    raddbg_thread_id_color_u32(id, 0xff9f23ff);\r\n  }\r\n  for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1)\r\n  {\r\n    ResumeThread(h[i]);\r\n  }\r\n  for(int i = 0; i < sizeof(h)/sizeof(h[0]); i += 1)\r\n  {\r\n    WaitForSingleObject(h[i], INFINITE);\r\n  }\r\n#endif\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(rjf): Debug Strings\r\n\r\nstatic void\r\ndebug_string_tests(void)\r\n{\r\n  for(int i = 0; i < 100; i += 1)\r\n  {\r\n    printf(\"here is a number: %i\\n\", i);\r\n    fflush(stdout);\r\n  }\r\n#if _WIN32\r\n  for(int i = 0; i < 100; i += 1)\r\n  {\r\n    OutputDebugStringA(\"Hello, World!\\n\");\r\n  }\r\n  char message[65409+1];\r\n  memset(&message[0], '=', sizeof(message));\r\n  for(int i = 1; i < sizeof(message); i += 128)\r\n  {\r\n    message[i] = '\\n';\r\n  }\r\n  message[sizeof(message) - 1] = 0;\r\n  OutputDebugStringA(message);\r\n#endif\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Name Test\r\n\r\n#if _WIN32\r\nDWORD dummy_thread(void *p)\r\n{\r\n  Sleep(10);\r\n  return 0;\r\n}\r\n#endif\r\n\r\nstatic void\r\nthread_name_tests(void)\r\n{\r\n#if _WIN32\r\n  DWORD id = 0;\r\n  HANDLE h = CreateThread(0, 0, dummy_thread, 0, CREATE_SUSPENDED, &id);\r\n  raddbg_thread_id_name(id, \"dummy_thread\");\r\n  raddbg_thread_id_color_u32(id, 0xff1f23ff);\r\n  ResumeThread(h);\r\n  WaitForSingleObject(h, INFINITE);\r\n#endif\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Interrupt Stepping Tests\r\n\r\n#include <assert.h>\r\n\r\nstatic void\r\ninterrupt_stepping_tests(void)\r\n{\r\n  __debugbreak();\r\n  __debugbreak();\r\n  __debugbreak();\r\n  __debugbreak();\r\n  for(int i = 0; i < 1000; i += 1)\r\n  {\r\n    if(i == 999)\r\n    {\r\n      __debugbreak();\r\n    }\r\n  }\r\n  for(int i = 0; i < 1000; i += 1)\r\n  {\r\n    if(i == 999)\r\n    {\r\n      assert(0);\r\n    }\r\n  }\r\n  int x = 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: JIT Stepping Tests\r\n\r\nstatic void\r\njit_stepping_tests(void)\r\n{\r\n  OutputDebugString(\"A\\n\");\r\n  VOID *code = VirtualAlloc(0, 0x1000, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);\r\n  *((uint32_t*)code) = 0xC39090CC;\r\n  ((void (__fastcall *)()) code)();\r\n  OutputDebugString(\"B\\n\");\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Exception Stepping\r\n\r\nstatic void\r\nexception_filter_test(void)\r\n{\r\n  __try\r\n  {\r\n    RaiseException(0xc0000095, 0, 0, 0);\r\n  }\r\n  __except (EXCEPTION_EXECUTE_HANDLER)\r\n  {\r\n    OutputDebugStringA(\"did an exception\\n\");\r\n  }\r\n}\r\n\r\nint *global_null_read_pointer = 0;\r\nstatic void\r\ntrip(void){\r\n  *global_null_read_pointer = 0;\r\n}\r\n\r\nstatic void\r\ncpp_exception_in_function(void){\r\n  int v = 0;\r\n  try{\r\n    throw 1;\r\n  }\r\n  catch (...){\r\n    v = 1;\r\n  }\r\n}\r\n\r\nstatic void\r\ncpp_throw_in_function(void){\r\n  throw 1;\r\n}\r\n\r\nstatic void\r\nwin32_exception_in_function(void){\r\n#if _WIN32\r\n  int v = 0;\r\n  __try{\r\n    trip();\r\n    v = 1;\r\n  }\r\n  __except (EXCEPTION_EXECUTE_HANDLER){\r\n    v = 2;\r\n  }\r\n  \r\n  v = 3;\r\n  __try{\r\n    trip();\r\n    v = 4;\r\n  }\r\n  __except (EXCEPTION_EXECUTE_HANDLER){\r\n    v = 5;\r\n  }\r\n#endif\r\n}\r\n\r\nstatic void\r\ncpp_recursive_exception(int x){\r\n  try{\r\n    if (x > 1){\r\n      throw 1;\r\n    }\r\n  }\r\n  catch (...){\r\n    x -= 1;\r\n    cpp_recursive_exception(x);\r\n    x += 1;\r\n  }\r\n}\r\n\r\nstatic void\r\nwin32_recursive_exception(int x){\r\n#if _WIN32\r\n  __try{\r\n    if (x > 1){\r\n      throw 1;\r\n    }\r\n  }\r\n  __except (EXCEPTION_EXECUTE_HANDLER){\r\n    x -= 1;\r\n    win32_recursive_exception(x);\r\n    x += 1;\r\n  }\r\n#endif\r\n}\r\n\r\nstatic void\r\nexception_stepping_tests(void){\r\n  {\r\n    int v = 0;\r\n    try{\r\n      throw 1;\r\n    }\r\n    catch (...){\r\n      v = 1;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int v = 0;\r\n    try{\r\n      cpp_throw_in_function();\r\n    }\r\n    catch (...){\r\n      v = 1;\r\n    }\r\n  }\r\n  \r\n  cpp_exception_in_function();\r\n  cpp_exception_in_function();\r\n  \r\n#if _WIN32\r\n  win32_exception_in_function();\r\n  win32_exception_in_function();\r\n#endif\r\n  \r\n  // NOTE(allen): Exception in catch tests\r\n  {\r\n    int v = 0;\r\n    try{\r\n      v = 1;\r\n      throw 1;\r\n    }\r\n    catch (...){\r\n      try{\r\n        v = 2;\r\n        throw 2;\r\n      }\r\n      catch (...){\r\n        v = 3;\r\n      }\r\n    }\r\n  }\r\n  \r\n  {\r\n    int v = 0;\r\n    try{\r\n      v = 1;\r\n      throw 1;\r\n    }\r\n    catch (...){\r\n      cpp_exception_in_function();\r\n    }\r\n  }\r\n  \r\n#if _WIN32\r\n  {\r\n    int v = 0;\r\n    try{\r\n      v = 1;\r\n      throw 1;\r\n    }\r\n    catch (...){\r\n      win32_exception_in_function();\r\n    }\r\n  }\r\n#endif\r\n  \r\n  cpp_recursive_exception(4);\r\n  cpp_recursive_exception(4);\r\n  cpp_recursive_exception(4);\r\n  \r\n#if _WIN32\r\n  win32_recursive_exception(4);\r\n  win32_recursive_exception(4);\r\n  win32_recursive_exception(4);\r\n#endif\r\n  \r\n  // NOTE(allen): Try in try tests\r\n  {\r\n    int v = 0;\r\n    try{\r\n      try{\r\n        v = 1;\r\n        throw 1;\r\n      }\r\n      catch (...){\r\n        v = 2;\r\n      }\r\n      throw 2;\r\n    }\r\n    catch (...){\r\n      v = 3;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int v = 0;\r\n    try{\r\n      try{\r\n        v = 1;\r\n        cpp_throw_in_function();\r\n      }\r\n      catch (...){\r\n        v = 2;\r\n      }\r\n      throw 2;\r\n    }\r\n    catch (...){\r\n      v = 3;\r\n    }\r\n  }\r\n  \r\n  {\r\n    int v = 0;\r\n    try{\r\n      cpp_exception_in_function();\r\n      throw 2;\r\n    }\r\n    catch (...){\r\n      v = 3;\r\n    }\r\n  }\r\n  \r\n#if _WIN32\r\n  {\r\n    int v = 0;\r\n    try{\r\n      win32_exception_in_function();\r\n      throw 2;\r\n    }\r\n    catch (...){\r\n      v = 3;\r\n    }\r\n  }\r\n#endif\r\n  \r\n}\r\n\r\ntypedef void (*callback_t)(int a);\r\nstatic void\r\ndynamic_step_test(void){\r\n#if _WIN32\r\n#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined( _M_AMD64 )\r\n  void *page = VirtualAlloc(0, 4096, MEM_RESERVE|MEM_COMMIT, PAGE_EXECUTE_READWRITE);\r\n  char *ptr = (char*)page;\r\n  *ptr++ =  0x51; // push rcx\r\n  *ptr++ = 0x59; // pop rcx\r\n  *ptr++ = 0xC3; // ret\r\n  callback_t cb = (callback_t)page;\r\n  cb(1);\r\n#endif\r\n#endif\r\n}\r\n\r\n////////////////////////////////\r\n\r\nraddbg_entry_point(mule_main);\r\n\r\nint\r\nmule_main(int argc, char** argv)\r\n{\r\n  raddbg_thread_name(\"mule_main_thread\");\r\n  raddbg_thread_color_rgba(0.4f, 0.9f, 0.2f, 1);\r\n  if(raddbg_is_attached())\r\n  {\r\n    raddbg_log(\"raddbg is attached!\\n\");\r\n  }\r\n  \r\n  mule_init();\r\n  \r\n  // NOTE(allen): Eval Tests\r\n  type_coverage_eval_tests();\r\n  \r\n  mutating_variables_eval_tests();\r\n  \r\n  nested_types_eval_tests();\r\n  \r\n  struct_parameters_eval_tests();\r\n  \r\n  global_eval_tests();\r\n  \r\n  return_eval_tests();\r\n  \r\n  tls_eval_tests();\r\n  \r\n  complicated_type_coverage_tests();\r\n  \r\n  extended_type_coverage_eval_tests();\r\n  \r\n  templated_function_eval_tests();\r\n  \r\n  c_type_coverage_eval_tests();\r\n  \r\n  c_type_with_bitfield_usage();\r\n  \r\n  optimized_build_eval_tests();\r\n  \r\n  optimized_struct_parameters_eval_tests();\r\n  \r\n  fancy_viz_eval_tests();\r\n  \r\n  exception_filter_test();\r\n  \r\n  markup_tests();\r\n  \r\n  // NOTE(allen): Stepping Tests\r\n  control_flow_stepping_tests();\r\n  \r\n  indirect_call_jump_stepping_tests();\r\n  \r\n  alloca_stepping_tests();\r\n  \r\n  basic_inline_tests();\r\n  \r\n  inline_stepping_tests();\r\n  \r\n  overloaded_line_stepping_tests();\r\n  \r\n  overloaded_function(100);\r\n  \r\n  dynamic_step_test();\r\n  \r\n  long_jump_stepping_tests();\r\n  \r\n  recursion_stepping_tests();\r\n  \r\n  thread_stepping_tests();\r\n  \r\n  debug_string_tests();\r\n  \r\n  thread_name_tests();\r\n  \r\n  jit_stepping_tests();\r\n  \r\n  interrupt_stepping_tests();\r\n  \r\n  exception_stepping_tests();\r\n  \r\n  return(0);\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_module.cpp",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#if _WIN32\r\n#define export_function extern \"C\" __declspec(dllexport)\r\n#else\r\n#define export_function extern \"C\"\r\n#endif\r\n\r\n#if _WIN32\r\n# define thread_var __declspec(thread)\r\n#else\r\n# define thread_var __thread\r\n#endif\r\n\r\ntypedef struct OnlyInModule OnlyInModule;\r\nstruct OnlyInModule\r\n{\r\n  int x;\r\n  int y;\r\n  int z;\r\n  char *name;\r\n};\r\n\r\ntypedef struct Basics Basics;\r\nstruct Basics\r\n{\r\n  int a;\r\n  int b;\r\n  int c;\r\n  int d;\r\n};\r\n\r\nstatic OnlyInModule only_in_module_global =\r\n{\r\n  1, 2, 3, \"foobar\",\r\n};\r\n\r\nthread_var float tls_a = 1.015625f;\r\nthread_var int   tls_b = -100;\r\n\r\nexport_function void\r\ndll_tls_eval_test(void)\r\n{\r\n  tls_a *= 1.5f;\r\n  tls_b *= -2;\r\n  only_in_module_global.x += 1;\r\n  only_in_module_global.y += 2;\r\n  only_in_module_global.z += 3;\r\n}\r\n\r\nexport_function void\r\ndll_type_eval_tests(void)\r\n{\r\n  Basics basics1 = {1, 2, 3, 4};\r\n  Basics basics2 = {4, 5, 6, 7};\r\n  OnlyInModule only_in_module = {123, 456, 789, \"this type is only in the module!\"};\r\n  int x = 0;\r\n  (void)x;\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_o2.cpp",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\nstatic int important_s32 = 0;\r\nstatic float important_f32 = 0;\r\n\r\n#if _WIN32\r\n#include <Windows.h>\r\n#endif\r\n\r\nstatic void\r\ndo_something_with_intermediate_values(void)\r\n{\r\n  static int another_important_s32 = 0;\r\n  static float another_important_f32 = 0;\r\n  \r\n  another_important_s32 = (int)important_f32;\r\n  another_important_f32 = (float)important_s32;\r\n  \r\n#if _WIN32\r\n  char buffer[256] = \"Hello, World!\\n\";\r\n  buffer[0] += important_s32 + another_important_s32;\r\n  buffer[1] += (int)another_important_f32 * important_f32;\r\n  OutputDebugStringA(buffer);\r\n#endif\r\n}\r\n\r\nstatic void\r\nstore_important_s32(int *ptr)\r\n{\r\n  important_s32 = *ptr;\r\n}\r\n\r\nstatic void\r\nstore_important_f32(float *ptr)\r\n{\r\n  important_f32 = *ptr;\r\n}\r\n\r\nvoid\r\noptimized_build_eval_tests(void)\r\n{\r\n  int simple_sum = 0;\r\n  for(int i = 0; i < 10000; i += 1)\r\n  {\r\n    simple_sum += i;\r\n  }\r\n  store_important_s32(&simple_sum);\r\n  \r\n  do_something_with_intermediate_values();\r\n  \r\n  static struct {float x, y;} vec2s[] =\r\n  {\r\n    { 10.f, 76.f },\r\n    { 40.f, 50.f },\r\n    { -230.f, 20.f },\r\n    { 27.f, 27.f },\r\n    { 57.f, -57.f },\r\n    { -37.f, 97.f },\r\n    { 99.f, 67.f },\r\n    { 99.f, 37.f },\r\n    { 99.f, 57.f },\r\n  };\r\n  {\r\n    struct{float x, y;}sum = {0};\r\n    int count = sizeof(vec2s)/sizeof(vec2s[0]);\r\n    for(int i = 0; i < count; i += 1)\r\n    {\r\n      sum.x += vec2s[i].x;\r\n      sum.y += vec2s[i].y;\r\n    }\r\n    struct{float x, y;}avg = {sum.x/count, sum.y/count};\r\n    float f32 = avg.x * avg.y;\r\n    store_important_f32(&f32);\r\n  }\r\n  \r\n  do_something_with_intermediate_values();\r\n  \r\n  int factorial = 1;\r\n  for(int i = 10; i > 0; i -= 1)\r\n  {\r\n    factorial *= i;\r\n  }\r\n  store_important_s32(&factorial);\r\n  \r\n  do_something_with_intermediate_values();\r\n}\r\n\r\n////////////////////////////////\r\n// NOTE(allen): Struct Parameters Eval\r\n\r\nstruct OptimizedBasics{\r\n  char a;\r\n  unsigned char b;\r\n  short c;\r\n  unsigned short d;\r\n  int e;\r\n  unsigned int f;\r\n  long long g;\r\n  unsigned long long h;\r\n  float i;\r\n  double j;\r\n};\r\n\r\nstatic void\r\noptimized_struct_parameter_helper(int *ptr, OptimizedBasics basics)\r\n{\r\n  basics.a += *ptr;\r\n  basics.a += 1;\r\n  basics.a += 1;\r\n}\r\n\r\nvoid\r\noptimized_struct_parameters_eval_tests(void)\r\n{\r\n  int x = 10;\r\n  OptimizedBasics basics = {-1, 1, -2, 2, -4, 4, -8, 8, 1.5f, 1.50000000000001};\r\n  optimized_struct_parameter_helper(&x, basics);\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_peb_trample.c",
    "content": "#include <windows.h>\r\n#include <winternl.h>\r\n#include \"mule_peb_trample_reload.c\"\r\n\r\nstatic void\r\nHideModuleFromWindowsReload(HMODULE ModuleToFlush)\r\n{\r\n  /* NOTE(casey): Normally you cannot \"reload\" an executable module with the same name,\r\n     because Windows checks a linked list of loaded modules and assumes that if\r\n     it's already loaded, it doesn't need to reload it, even though it may have to because\r\n     it has changed on disk.\r\n     \r\n     This solution to that problem comes from some excellent spelunking by Martins Mozeiko,\r\n     who figured out that you could overwrite the filenames Windows stores in your process's\r\n     loaded module table, thus thwarting the Windows filename check against loaded modules,\r\n     allowing you to reload an existing module that has changed without requiring it to\r\n     have a different filename!\r\n  */\r\n  \r\n  PEB *Peb = (PEB *)__readgsqword(offsetof(TEB, ProcessEnvironmentBlock));\r\n  LIST_ENTRY *Head = &Peb->Ldr->InMemoryOrderModuleList;\r\n  for(LIST_ENTRY *Entry = Head->Flink;\r\n      Entry != Head;\r\n      Entry = Entry->Flink)\r\n  {\r\n    LDR_DATA_TABLE_ENTRY *Mod = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);\r\n    if(Mod->DllBase == ModuleToFlush)\r\n    {\r\n      ZeroMemory(Mod->FullDllName.Buffer, Mod->FullDllName.Length);\r\n      Mod->DllBase = 0;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\nint main(int argument_count, char **arguments)\r\n{\r\n  char *exe_name = arguments[0];\r\n  HANDLE last_module = GetModuleHandle(0);\r\n  int (*loop_iteration_function)(int it) = (int (*)(int))GetProcAddress(last_module, \"loop_iteration\");\r\n  FILETIME last_filetime = {0};\r\n  int should_exit = 0;\r\n  for(int it = 0; !should_exit; it += 1)\r\n  {\r\n    int result = loop_iteration_function(it);\r\n    printf(\"%i\\n\", result);\r\n    Sleep(50);\r\n    FILETIME current_filetime = {0};\r\n    HANDLE current_exe_file = CreateFile(exe_name, 0, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);\r\n    GetFileTime(current_exe_file, 0, 0, &current_filetime);\r\n    CloseHandle(current_exe_file);\r\n    if(it != 0 && CompareFileTime(&last_filetime, &current_filetime) < 0)\r\n    {\r\n      HideModuleFromWindowsReload(last_module);\r\n      last_module = LoadLibrary(arguments[0]);\r\n      loop_iteration_function = (int (*)(int))GetProcAddress(last_module, \"loop_iteration\");\r\n    }\r\n    last_filetime = current_filetime;\r\n  }\r\n  return 0;\r\n}\r\n"
  },
  {
    "path": "src/mule/mule_peb_trample_reload.c",
    "content": "__declspec(dllexport) int\r\nloop_iteration(int it)\r\n{\r\n  //return 111;\r\n#if 1\r\n  int sum = 0;\r\n  for(int i = 0; i < 1000; i += 1)\r\n  {\r\n    sum += it*i;\r\n  }\r\n  return sum;\r\n#endif\r\n}\r\n"
  },
  {
    "path": "src/mutable_text/mutable_text.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xb8a06bff\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void\r\nmtx_init(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  mtx_shared = push_array(arena, MTX_Shared, 1);\r\n  mtx_shared->arena = arena;\r\n  mtx_shared->slots_count = 256;\r\n  mtx_shared->stripes_count = Min(mtx_shared->slots_count, os_get_system_info()->logical_processor_count);\r\n  mtx_shared->slots = push_array(arena, MTX_Slot, mtx_shared->slots_count);\r\n  mtx_shared->stripes = push_array(arena, MTX_Stripe, mtx_shared->stripes_count);\r\n  for(U64 idx = 0; idx < mtx_shared->stripes_count; idx += 1)\r\n  {\r\n    mtx_shared->stripes[idx].arena = arena_alloc();\r\n    mtx_shared->stripes[idx].rw_mutex = rw_mutex_alloc();\r\n  }\r\n  mtx_shared->mut_threads_count = Min(os_get_system_info()->logical_processor_count, 4);\r\n  mtx_shared->mut_threads = push_array(arena, MTX_MutThread, mtx_shared->mut_threads_count);\r\n  for(U64 idx = 0; idx < mtx_shared->mut_threads_count; idx += 1)\r\n  {\r\n    mtx_shared->mut_threads[idx].ring_size = KB(64);\r\n    mtx_shared->mut_threads[idx].ring_base = push_array_no_zero(arena, U8, mtx_shared->mut_threads[idx].ring_size);\r\n    mtx_shared->mut_threads[idx].cv = cond_var_alloc();\r\n    mtx_shared->mut_threads[idx].mutex = mutex_alloc();\r\n    mtx_shared->mut_threads[idx].thread = thread_launch(mtx_mut_thread__entry_point, &mtx_shared->mut_threads[idx]);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Buffer Operations\r\n\r\ninternal void\r\nmtx_push_op(C_Key buffer_key, MTX_Op op)\r\n{\r\n  U64 hash = u64_hash_from_str8(str8_struct(&buffer_key));\r\n  MTX_MutThread *thread = &mtx_shared->mut_threads[hash%mtx_shared->mut_threads_count];\r\n  mtx_enqueue_op(thread, buffer_key, op);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Mutation Threads\r\n\r\ninternal void\r\nmtx_enqueue_op(MTX_MutThread *thread, C_Key buffer_key, MTX_Op op)\r\n{\r\n  // TODO(rjf): if op.replace is too big, need to split into multiple edits\r\n  MutexScope(thread->mutex) for(;;)\r\n  {\r\n    U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos;\r\n    U64 available_size = thread->ring_size - unconsumed_size;\r\n    U64 needed_size = sizeof(buffer_key) + sizeof(op.range) + sizeof(op.replace.size) + op.replace.size;\r\n    if(available_size >= needed_size)\r\n    {\r\n      thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &buffer_key);\r\n      thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.range);\r\n      thread->ring_write_pos += ring_write_struct(thread->ring_base, thread->ring_size, thread->ring_write_pos, &op.replace.size);\r\n      thread->ring_write_pos += ring_write(thread->ring_base, thread->ring_size, thread->ring_write_pos, op.replace.str, op.replace.size);\r\n      break;\r\n    }\r\n    cond_var_wait(thread->cv, thread->mutex, max_U64);\r\n  }\r\n  cond_var_broadcast(thread->cv);\r\n}\r\n\r\ninternal void\r\nmtx_dequeue_op(Arena *arena, MTX_MutThread *thread, C_Key *buffer_key_out, MTX_Op *op_out)\r\n{\r\n  MutexScope(thread->mutex) for(;;)\r\n  {\r\n    U64 unconsumed_size = thread->ring_write_pos - thread->ring_read_pos;\r\n    if(unconsumed_size >= sizeof(*buffer_key_out) + sizeof(op_out->range) + sizeof(op_out->replace.size))\r\n    {\r\n      thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, buffer_key_out);\r\n      thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->range);\r\n      thread->ring_read_pos += ring_read_struct(thread->ring_base, thread->ring_size, thread->ring_read_pos, &op_out->replace.size);\r\n      op_out->replace.str = push_array_no_zero(arena, U8, op_out->replace.size);\r\n      thread->ring_read_pos += ring_read(thread->ring_base, thread->ring_size, thread->ring_read_pos, op_out->replace.str, op_out->replace.size);\r\n      break;\r\n    }\r\n    cond_var_wait(thread->cv, thread->mutex, max_U64);\r\n  }\r\n  cond_var_broadcast(thread->cv);\r\n}\r\n\r\ninternal void\r\nmtx_mut_thread__entry_point(void *p)\r\n{\r\n  MTX_MutThread *mut_thread = (MTX_MutThread *)p;\r\n  ThreadNameF(\"mtx_mut_thread_%I64u\", (U64)(mut_thread - mtx_shared->mut_threads));\r\n  for(;;)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    Access *access = access_open();\r\n    \r\n    //- rjf: get next op\r\n    C_Key buffer_key = {0};\r\n    MTX_Op op = {0};\r\n    mtx_dequeue_op(scratch.arena, mut_thread, &buffer_key, &op);\r\n    \r\n    //- rjf: get buffer's current data\r\n    U128 hash = c_hash_from_key(buffer_key, 0);\r\n    String8 data = c_data_from_hash(access, hash);\r\n    \r\n    //- rjf: clamp op by data\r\n    op.range.min = Min(op.range.min, data.size);\r\n    op.range.max = Min(op.range.max, data.size);\r\n    \r\n    //- rjf: construct new buffer\r\n    if(op.range.max != op.range.min || op.replace.size != 0)\r\n    {\r\n      U64 new_data_size = data.size + op.replace.size - dim_1u64(op.range);\r\n      Arena *arena = arena_alloc(.commit_size = new_data_size + ARENA_HEADER_SIZE, .reserve_size = new_data_size + ARENA_HEADER_SIZE);\r\n      U8 *new_data_base = push_array_no_zero(arena, U8, new_data_size);\r\n      String8 pre_replace_data = str8_substr(data, r1u64(0, op.range.min));\r\n      String8 post_replace_data = str8_substr(data, r1u64(op.range.max, data.size));\r\n      if(pre_replace_data.size != 0)\r\n      {\r\n        MemoryCopy(new_data_base+0,                                     pre_replace_data.str, pre_replace_data.size);\r\n      }\r\n      if(op.replace.size != 0)\r\n      {\r\n        MemoryCopy(new_data_base+pre_replace_data.size,                 op.replace.str, op.replace.size);\r\n      }\r\n      if(post_replace_data.size != 0)\r\n      {\r\n        MemoryCopy(new_data_base+pre_replace_data.size+op.replace.size, post_replace_data.str, post_replace_data.size);\r\n      }\r\n      String8 new_data = str8(new_data_base, new_data_size);\r\n      c_submit_data(buffer_key, &arena, new_data);\r\n    }\r\n    \r\n    access_close(access);\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/mutable_text/mutable_text.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef MUTABLE_TEXT_H\r\n#define MUTABLE_TEXT_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Cache Types\r\n\r\ntypedef struct MTX_Node MTX_Node;\r\nstruct MTX_Node\r\n{\r\n  MTX_Node *next;\r\n  MTX_Node *prev;\r\n  U128 key;\r\n};\r\n\r\ntypedef struct MTX_Slot MTX_Slot;\r\nstruct MTX_Slot\r\n{\r\n  MTX_Node *first;\r\n  MTX_Node *last;\r\n};\r\n\r\ntypedef struct MTX_Stripe MTX_Stripe;\r\nstruct MTX_Stripe\r\n{\r\n  Arena *arena;\r\n  MTX_Node *free_node;\r\n  RWMutex rw_mutex;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Mutation Thread Types\r\n\r\ntypedef struct MTX_Op MTX_Op;\r\nstruct MTX_Op\r\n{\r\n  Rng1U64 range;\r\n  String8 replace;\r\n};\r\n\r\ntypedef struct MTX_MutThread MTX_MutThread;\r\nstruct MTX_MutThread\r\n{\r\n  U64 ring_size;\r\n  U8 *ring_base;\r\n  U64 ring_read_pos;\r\n  U64 ring_write_pos;\r\n  CondVar cv;\r\n  Mutex mutex;\r\n  Thread thread;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Shared State\r\n\r\ntypedef struct MTX_Shared MTX_Shared;\r\nstruct MTX_Shared\r\n{\r\n  Arena *arena;\r\n  \r\n  // rjf: buffer cache\r\n  U64 slots_count;\r\n  U64 stripes_count;\r\n  MTX_Slot *slots;\r\n  MTX_Stripe *stripes;\r\n  \r\n  // rjf: mut threads\r\n  U64 mut_threads_count;\r\n  MTX_MutThread *mut_threads;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal MTX_Shared *mtx_shared = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Initialization\r\n\r\ninternal void mtx_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Buffer Operations\r\n\r\ninternal void mtx_push_op(C_Key buffer_key, MTX_Op op);\r\n\r\n////////////////////////////////\r\n//~ rjf: Mutation Threads\r\n\r\ninternal void mtx_enqueue_op(MTX_MutThread *thread, C_Key buffer_key, MTX_Op op);\r\ninternal void mtx_dequeue_op(Arena *arena, MTX_MutThread *thread, C_Key *buffer_key_out, MTX_Op *op_out);\r\ninternal void mtx_mut_thread__entry_point(void *p);\r\n\r\n#endif // MUTABLE_TEXT_H\r\n"
  },
  {
    "path": "src/natvis/base.natvis",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n<AutoVisualizer xmlns=\"http://schemas.microsoft.com/vstudio/debugger/natvis/2010\">\r\n  <Type Name=\"String8\">\r\n    <DisplayString>{size,str}</DisplayString>\r\n    <StringView>size,str</StringView>\r\n  </Type>\r\n\r\n  <Type Name=\"String8Node\">\r\n    <DisplayString>{{ string={string.size,string.str} next={next} }}</DisplayString>\r\n  </Type>\r\n\r\n\t<Type Name=\"String8List\">\r\n    <DisplayString Condition=\"node_count == 0\">empty</DisplayString>\r\n    <DisplayString>{{node count={node_count} total size={total_size} first={first->string} last={last->string} }} </DisplayString>\r\n\t\t<Expand>\r\n\t\t\t<Item Name=\"[node count]\">node_count</Item>\r\n\t\t\t<Item Name=\"[total size]\">total_size</Item>\r\n\t\t\t<LinkedListItems>\r\n\t\t\t\t<Size>node_count</Size>\r\n\t\t\t\t<HeadPointer>first</HeadPointer>\r\n\t\t\t\t<NextPointer>next</NextPointer>\r\n\t\t\t\t<ValueNode>string</ValueNode>\r\n\t\t\t</LinkedListItems>\r\n\t\t</Expand>\r\n\t</Type>\r\n\t\r\n\t<Type Name=\"String8Array\">\r\n    <DisplayString>{{ count={count} pointer={strings} }}</DisplayString>\r\n    <Expand>\r\n      <Item Name=\"[count]\">count</Item>\r\n      <ArrayItems>\r\n        <Size>count</Size>\r\n        <ValuePointer>strings</ValuePointer>\r\n      </ArrayItems>\r\n    </Expand>\r\n\t</Type>\r\n\r\n  <Type Name=\"Vec2F32\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Vec2S32\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Vec2S64\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Vec3F32\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"z\">z</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y + z*z</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Vec3S32\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"z\">z</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y + z*z</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Vec4F32\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"z\">z</Item>\r\n      <Item Name=\"w\">w</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y + z*z + w*w</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Vec4S32\">\r\n    <Expand>\r\n      <Item Name=\"x\">x</Item>\r\n      <Item Name=\"y\">y</Item>\r\n      <Item Name=\"z\">z</Item>\r\n      <Item Name=\"w\">w</Item>\r\n      <Item Name=\"[length squared]\">x*x + y*y + z*z + w*w</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Rng1U32\">\r\n    <DisplayString>{{ min={min} max={max} [dim]={max - min} }}</DisplayString>\r\n    <Expand>\r\n      <Item Name=\"min\">min</Item>\r\n      <Item Name=\"max\">max</Item>\r\n      <Item Name=\"[dim]\">max - min</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Rng1S32\">\r\n    <DisplayString>{{ min={min} max={max} [dim]={max - min} }}</DisplayString>\r\n    <Expand>\r\n      <Item Name=\"min\">min</Item>\r\n      <Item Name=\"max\">max</Item>\r\n      <Item Name=\"[dim]\">max - min</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Rng1U64\">\r\n    <DisplayString>{{ min={min} max={max} [dim]={max - min} }}</DisplayString>\r\n    <Expand>\r\n      <Item Name=\"min\">min</Item>\r\n      <Item Name=\"max\">max</Item>\r\n      <Item Name=\"[dim]\">max - min</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Rng1S64\">\r\n    <DisplayString>{{ min={min} max={max} [dim]={max - min} }}</DisplayString>\r\n    <Expand>\r\n      <Item Name=\"min\">min</Item>\r\n      <Item Name=\"max\">max</Item>\r\n      <Item Name=\"[dim]\">max - min</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"Rng1F32\">\r\n    <DisplayString>{{ min={min} max={max} [dim]={max - min} }}</DisplayString>\r\n    <Expand>\r\n      <Item Name=\"min\">min</Item>\r\n      <Item Name=\"max\">max</Item>\r\n      <Item Name=\"[dim]\">max - min</Item>\r\n    </Expand>\r\n  </Type>\r\n\r\n  <Type Name=\"CmdLineOpt\">\r\n    <DisplayString>{{ name={string} hash={hash} value_string={value_string} value_stirngs={value_strings} }}</DisplayString>\r\n  </Type>\r\n\r\n  <Type Name=\"CmdLineOptList\">\r\n    <AlternativeType Name=\"Rng1U64List\"/>\r\n    <AlternativeType Name=\"Rng1S64List\"/>\r\n    <AlternativeType Name=\"DW_AttribList\"/>\r\n    <AlternativeType Name=\"DW_LocList\"/>\r\n    <AlternativeType Name=\"COFF_LibWriterSymbolList\"/>\r\n    <AlternativeType Name=\"COFF_LibWriterMemberList\"/>\r\n    <DisplayString>{{ count={count} first={first} }} </DisplayString>\r\n    <Expand>\r\n\t\t\t<Item Name=\"[count]\">count</Item>\r\n      <LinkedListItems>\r\n        <Size>count</Size>\r\n        <HeadPointer>first</HeadPointer>\r\n        <NextPointer>next</NextPointer>\r\n        <ValueNode>this</ValueNode>\r\n      </LinkedListItems>\r\n    </Expand>\r\n  </Type>\r\n\r\n\t<Type Name=\"RDIM_TypeChunkList\">\r\n    <AlternativeType Name=\"RDIM_SrcFileChunkList\"/>\r\n    <AlternativeType Name=\"RDIM_LineTableChunkList\"/>\r\n    <AlternativeType Name=\"RDIM_UnitChunkList\"/>\r\n    <AlternativeType Name=\"RDIM_UDTChunkList\"/>\r\n    <AlternativeType Name=\"RDIM_SymbolChunkList\"/>\r\n    <AlternativeType Name=\"RDIM_InlineSiteChunkList\"/>\r\n    <AlternativeType Name=\"RDIM_ScopeChunkList\"/>\r\n\t\t<Expand>\r\n      <Item Name=\"[chunk count]\">chunk_count</Item>\r\n      <CustomListItems MaxItemsPerView=\"5000\">\r\n        <Variable Name=\"node\" InitialValue=\"first\"/>\r\n        <Variable Name=\"idx\" InitialValue=\"0\"/>\r\n        <Loop>\r\n          <Break Condition=\"node == 0\"/>\r\n          <Exec>idx = 0</Exec>\r\n          <Loop>\r\n            <Break Condition=\"idx >= node->count\"/>\r\n            <Item>node->v[idx]</Item>\r\n            <Exec>idx += 1</Exec>\r\n          </Loop>\r\n          <Exec>node = node->next</Exec>\r\n        </Loop>\r\n      </CustomListItems>\r\n\t\t</Expand>\r\n\t</Type>\r\n\r\n</AutoVisualizer>\r\n"
  },
  {
    "path": "src/os/core/linux/os_core_linux.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DateTime\r\nos_lnx_date_time_from_tm(tm in, U32 msec)\r\n{\r\n  DateTime dt = {0};\r\n  dt.sec  = in.tm_sec;\r\n  dt.min  = in.tm_min;\r\n  dt.hour = in.tm_hour;\r\n  dt.day  = in.tm_mday-1;\r\n  dt.mon  = in.tm_mon;\r\n  dt.year = in.tm_year+1900;\r\n  dt.msec = msec;\r\n  return dt;\r\n}\r\n\r\ninternal tm\r\nos_lnx_tm_from_date_time(DateTime dt)\r\n{\r\n  tm result = {0};\r\n  result.tm_sec = dt.sec;\r\n  result.tm_min = dt.min;\r\n  result.tm_hour= dt.hour;\r\n  result.tm_mday= dt.day+1;\r\n  result.tm_mon = dt.mon;\r\n  result.tm_year= dt.year-1900;\r\n  return result;\r\n}\r\n\r\ninternal timespec\r\nos_lnx_timespec_from_date_time(DateTime dt)\r\n{\r\n  tm tm_val = os_lnx_tm_from_date_time(dt);\r\n  time_t seconds = timegm(&tm_val);\r\n  timespec result = {0};\r\n  result.tv_sec = seconds;\r\n  return result;\r\n}\r\n\r\ninternal DenseTime\r\nos_lnx_dense_time_from_timespec(timespec in)\r\n{\r\n  DenseTime result = 0;\r\n  {\r\n    struct tm tm_time = {0};\r\n    gmtime_r(&in.tv_sec, &tm_time);\r\n    DateTime date_time = os_lnx_date_time_from_tm(tm_time, in.tv_nsec/Million(1));\r\n    result = dense_time_from_date_time(date_time);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal FileProperties\r\nos_lnx_file_properties_from_stat(struct stat *s)\r\n{\r\n  FileProperties props = {0};\r\n  props.size     = s->st_size;\r\n  props.created  = os_lnx_dense_time_from_timespec(s->st_ctim);\r\n  props.modified = os_lnx_dense_time_from_timespec(s->st_mtim);\r\n  if(s->st_mode & S_IFDIR)\r\n  {\r\n    props.flags |= FilePropertyFlag_IsFolder;\r\n  }\r\n  return props;\r\n}\r\n\r\ninternal void\r\nos_lnx_safe_call_sig_handler(int x)\r\n{\r\n  OS_LNX_SafeCallChain *chain = os_lnx_safe_call_chain;\r\n  if(chain != 0 && chain->fail_handler != 0)\r\n  {\r\n    chain->fail_handler(chain->ptr);\r\n  }\r\n  abort();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entities\r\n\r\ninternal OS_LNX_Entity *\r\nos_lnx_entity_alloc(OS_LNX_EntityKind kind)\r\n{\r\n  OS_LNX_Entity *entity = 0;\r\n  DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex),\r\n            pthread_mutex_unlock(&os_lnx_state.entity_mutex))\r\n  {\r\n    entity = os_lnx_state.entity_free;\r\n    if(entity)\r\n    {\r\n      SLLStackPop(os_lnx_state.entity_free);\r\n    }\r\n    else\r\n    {\r\n      entity = push_array_no_zero(os_lnx_state.entity_arena, OS_LNX_Entity, 1);\r\n    }\r\n  }\r\n  MemoryZeroStruct(entity);\r\n  entity->kind = kind;\r\n  return entity;\r\n}\r\n\r\ninternal void\r\nos_lnx_entity_release(OS_LNX_Entity *entity)\r\n{\r\n  DeferLoop(pthread_mutex_lock(&os_lnx_state.entity_mutex),\r\n            pthread_mutex_unlock(&os_lnx_state.entity_mutex))\r\n  {\r\n    SLLStackPush(os_lnx_state.entity_free, entity);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal void *\r\nos_lnx_thread_entry_point(void *ptr)\r\n{\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)ptr;\r\n  ThreadEntryPointFunctionType *func = entity->thread.func;\r\n  void *thread_ptr = entity->thread.ptr;\r\n  supplement_thread_base_entry_point(func, thread_ptr);\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System/Process Info (Implemented Per-OS)\r\n\r\ninternal OS_SystemInfo *\r\nos_get_system_info(void)\r\n{\r\n  return &os_lnx_state.system_info;\r\n}\r\n\r\ninternal OS_ProcessInfo *\r\nos_get_process_info(void)\r\n{\r\n  return &os_lnx_state.process_info;\r\n}\r\n\r\ninternal String8\r\nos_get_current_path(Arena *arena)\r\n{\r\n  char *cwdir = getcwd(0, 0);\r\n  String8 string = push_str8_copy(arena, str8_cstring(cwdir));\r\n  free(cwdir);\r\n  return string;\r\n}\r\n\r\ninternal U32\r\nos_get_process_start_time_unix(void)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  U64 start_time = 0;\r\n  pid_t pid = getpid();\r\n  String8 path = push_str8f(scratch.arena, \"/proc/%u\", pid);\r\n  struct stat st;\r\n  int err = stat((char*)path.str, &st);\r\n  if(err == 0)\r\n  {\r\n    start_time = st.st_mtime;\r\n  }\r\n  scratch_end(scratch);\r\n  return (U32)start_time;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\n//- rjf: basic\r\n\r\ninternal void *\r\nos_reserve(U64 size)\r\n{\r\n  void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);\r\n  if(result == MAP_FAILED)\r\n  {\r\n    result = 0;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit(void *ptr, U64 size)\r\n{\r\n  mprotect(ptr, size, PROT_READ|PROT_WRITE);\r\n  return 1;\r\n}\r\n\r\ninternal void\r\nos_decommit(void *ptr, U64 size)\r\n{\r\n  madvise(ptr, size, MADV_DONTNEED);\r\n  mprotect(ptr, size, PROT_NONE);\r\n}\r\n\r\ninternal void\r\nos_release(void *ptr, U64 size)\r\n{\r\n  munmap(ptr, size);\r\n}\r\n\r\n//- rjf: large pages\r\n\r\ninternal void *\r\nos_reserve_large(U64 size)\r\n{\r\n  void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0);\r\n  if(result == MAP_FAILED)\r\n  {\r\n    result = 0;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit_large(void *ptr, U64 size)\r\n{\r\n  mprotect(ptr, size, PROT_READ|PROT_WRITE);\r\n  return 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Thread Info (Implemented Per-OS)\r\n\r\ninternal U32\r\nos_tid(void)\r\n{\r\n  U32 result = gettid();\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_set_thread_name(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  pthread_t current_thread = pthread_self();\r\n  pthread_setname_np(current_thread, (char *)name_copy.str);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Aborting (Implemented Per-OS)\r\n\r\ninternal void\r\nos_abort(S32 exit_code)\r\n{\r\n  exit(exit_code);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\n\r\ninternal OS_Handle\r\nos_file_open(OS_AccessFlags flags, String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  int lnx_flags = 0;\r\n  if(flags & OS_AccessFlag_Read && flags & OS_AccessFlag_Write)\r\n  {\r\n    lnx_flags = O_RDWR;\r\n  }\r\n  else if(flags & OS_AccessFlag_Write)\r\n  {\r\n    lnx_flags = O_WRONLY;\r\n  }\r\n  else if(flags & OS_AccessFlag_Read)\r\n  {\r\n    lnx_flags = O_RDONLY;\r\n  }\r\n  if(flags & OS_AccessFlag_Append)\r\n  {\r\n    lnx_flags |= O_APPEND;\r\n  }\r\n  if(flags & (OS_AccessFlag_Write|OS_AccessFlag_Append))\r\n  {\r\n    lnx_flags |= O_CREAT;\r\n  }\r\n  lnx_flags |= O_CLOEXEC;\r\n  int fd = open((char *)path_copy.str, lnx_flags, 0755);\r\n  OS_Handle handle = {0};\r\n  if(fd != -1)\r\n  {\r\n    handle.u64[0] = fd;\r\n  }\r\n  scratch_end(scratch);\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_file_close(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return; }\r\n  int fd = (int)file.u64[0];\r\n  close(fd);\r\n}\r\n\r\ninternal U64\r\nos_file_read(OS_Handle file, Rng1U64 rng, void *out_data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  int fd = (int)file.u64[0];\r\n  U64 total_num_bytes_to_read = dim_1u64(rng);\r\n  U64 total_num_bytes_read = 0;\r\n  U64 total_num_bytes_left_to_read = total_num_bytes_to_read;\r\n  for(;total_num_bytes_left_to_read > 0;)\r\n  {\r\n    int read_result = pread(fd, (U8 *)out_data + total_num_bytes_read, total_num_bytes_left_to_read, rng.min + total_num_bytes_read);\r\n    if(read_result >= 0)\r\n    {\r\n      total_num_bytes_read += read_result;\r\n      total_num_bytes_left_to_read -= read_result;\r\n    }\r\n    else if(errno != EINTR)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return total_num_bytes_read;\r\n}\r\n\r\ninternal U64\r\nos_file_write(OS_Handle file, Rng1U64 rng, void *data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  int fd = (int)file.u64[0];\r\n  U64 total_num_bytes_to_write = dim_1u64(rng);\r\n  U64 total_num_bytes_written = 0;\r\n  U64 total_num_bytes_left_to_write = total_num_bytes_to_write;\r\n  for(;total_num_bytes_left_to_write > 0;)\r\n  {\r\n    int write_result = pwrite(fd, (U8 *)data + total_num_bytes_written, total_num_bytes_left_to_write, rng.min + total_num_bytes_written);\r\n    if(write_result >= 0)\r\n    {\r\n      total_num_bytes_written += write_result;\r\n      total_num_bytes_left_to_write -= write_result;\r\n    }\r\n    else if(errno != EINTR)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return total_num_bytes_written;\r\n}\r\n\r\ninternal B32\r\nos_file_set_times(OS_Handle file, DateTime date_time)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  int fd = (int)file.u64[0];\r\n  timespec time = os_lnx_timespec_from_date_time(date_time);\r\n  timespec times[2] = {time, time};\r\n  int futimens_result = futimens(fd, times);\r\n  B32 good = (futimens_result != -1);\r\n  return good;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return (FileProperties){0}; }\r\n  int fd = (int)file.u64[0];\r\n  struct stat fd_stat = {0};\r\n  int fstat_result = fstat(fd, &fd_stat);\r\n  FileProperties props = {0};\r\n  if(fstat_result != -1)\r\n  {\r\n    props = os_lnx_file_properties_from_stat(&fd_stat);\r\n  }\r\n  return props;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return (OS_FileID){0}; }\r\n  int fd = (int)file.u64[0];\r\n  struct stat fd_stat = {0};\r\n  int fstat_result = fstat(fd, &fd_stat);\r\n  OS_FileID id = {0};\r\n  if(fstat_result != -1)\r\n  {\r\n    id.v[0] = fd_stat.st_dev;\r\n    id.v[1] = fd_stat.st_ino;\r\n  }\r\n  return id;\r\n}\r\n\r\ninternal B32\r\nos_delete_file_at_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = 0;\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  if(remove((char*)path_copy.str) != -1)\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_copy_file_path(String8 dst, String8 src)\r\n{\r\n  B32 result = 0;\r\n  OS_Handle src_h = os_file_open(OS_AccessFlag_Read, src);\r\n  OS_Handle dst_h = os_file_open(OS_AccessFlag_Write, dst);\r\n  if(!os_handle_match(src_h, os_handle_zero()) &&\r\n     !os_handle_match(dst_h, os_handle_zero()))\r\n  {\r\n    int src_fd = (int)src_h.u64[0];\r\n    int dst_fd = (int)dst_h.u64[0];\r\n    FileProperties src_props = os_properties_from_file(src_h);\r\n    U64 size = src_props.size;\r\n    U64 total_bytes_copied = 0;\r\n    U64 bytes_left_to_copy = size;\r\n    for(;bytes_left_to_copy > 0;)\r\n    {\r\n      off_t sendfile_off = total_bytes_copied;\r\n      int send_result = sendfile(dst_fd, src_fd, &sendfile_off, bytes_left_to_copy);\r\n      if(send_result <= 0)\r\n      {\r\n        break;\r\n      }\r\n      U64 bytes_copied = (U64)send_result;\r\n      bytes_left_to_copy -= bytes_copied;\r\n      total_bytes_copied += bytes_copied;\r\n    }\r\n  }\r\n  os_file_close(src_h);\r\n  os_file_close(dst_h);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_move_file_path(String8 dst, String8 src)\r\n{\r\n  B32 good = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  {\r\n    char *src_cstr = (char *)push_str8_copy(scratch.arena, src).str;\r\n    char *dst_cstr = (char *)push_str8_copy(scratch.arena, dst).str;\r\n    int rename_result = rename(src_cstr, dst_cstr);\r\n    good = (rename_result != -1);\r\n  }\r\n  scratch_end(scratch);\r\n  return good;\r\n}\r\n\r\ninternal String8\r\nos_full_path_from_path(Arena *arena, String8 path)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  char buffer[PATH_MAX] = {0};\r\n  realpath((char *)path_copy.str, buffer);\r\n  String8 result = push_str8_copy(arena, str8_cstring(buffer));\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_file_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  int access_result = access((char *)path_copy.str, F_OK);\r\n  B32 result = 0;\r\n  if(access_result == 0)\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_folder_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32      exists    = 0;\r\n  String8  path_copy = push_str8_copy(scratch.arena, path);\r\n  DIR     *handle    = opendir((char*)path_copy.str);\r\n  if(handle)\r\n  {\r\n    closedir(handle);\r\n    exists = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return exists;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  struct stat f_stat = {0};\r\n  int stat_result = stat((char *)path_copy.str, &f_stat);\r\n  FileProperties props = {0};\r\n  if(stat_result != -1)\r\n  {\r\n    props = os_lnx_file_properties_from_stat(&f_stat);\r\n  }\r\n  scratch_end(scratch);\r\n  return props;\r\n}\r\n\r\n//- rjf: file maps\r\n\r\ninternal OS_Handle\r\nos_file_map_open(OS_AccessFlags flags, OS_Handle file)\r\n{\r\n  OS_Handle map = file;\r\n  return map;\r\n}\r\n\r\ninternal void\r\nos_file_map_close(OS_Handle map)\r\n{\r\n  // NOTE(rjf): nothing to do; `map` handles are the same as `file` handles in\r\n  // the linux implementation (on Windows they require separate handles)\r\n}\r\n\r\ninternal void *\r\nos_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range)\r\n{\r\n  if(os_handle_match(map, os_handle_zero())) { return 0; }\r\n  int fd = (int)map.u64[0];\r\n  int prot_flags = 0;\r\n  if(flags & OS_AccessFlag_Write) { prot_flags |= PROT_WRITE; }\r\n  if(flags & OS_AccessFlag_Read)  { prot_flags |= PROT_READ; }\r\n  int map_flags = MAP_PRIVATE;\r\n  void *base = mmap(0, dim_1u64(range), prot_flags, map_flags, fd, range.min);\r\n  if(base == MAP_FAILED)\r\n  {\r\n    base = 0;\r\n  }\r\n  return base;\r\n}\r\n\r\ninternal void\r\nos_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range)\r\n{\r\n  munmap(ptr, dim_1u64(range));\r\n}\r\n\r\n//- rjf: directory iteration\r\n\r\ninternal OS_FileIter *\r\nos_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags)\r\n{\r\n  OS_FileIter *base_iter = push_array(arena, OS_FileIter, 1);\r\n  base_iter->flags = flags;\r\n  OS_LNX_FileIter *iter = (OS_LNX_FileIter *)base_iter->memory;\r\n  {\r\n    String8 path_copy = push_str8_copy(arena, path);\r\n    iter->dir = opendir((char *)path_copy.str);\r\n    iter->path = path_copy;\r\n  }\r\n  return base_iter;\r\n}\r\n\r\ninternal B32\r\nos_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)\r\n{\r\n  B32 good = 0;\r\n  OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory;\r\n  for(;lnx_iter->dir != 0;)\r\n  {\r\n    // rjf: get next entry\r\n    lnx_iter->dp = readdir(lnx_iter->dir);\r\n    good = (lnx_iter->dp != 0);\r\n    \r\n    // rjf: unpack entry info\r\n    struct stat st = {0};\r\n    int stat_result = 0;\r\n    if(good)\r\n    {\r\n      Temp scratch = scratch_begin(&arena, 1);\r\n      String8 full_path = push_str8f(scratch.arena, \"%S/%s\", lnx_iter->path, lnx_iter->dp->d_name);\r\n      stat_result = stat((char *)full_path.str, &st);\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    // rjf: determine if filtered\r\n    B32 filtered = 0;\r\n    if(good)\r\n    {\r\n      filtered = ((st.st_mode == S_IFDIR && iter->flags & OS_FileIterFlag_SkipFolders) ||\r\n                  (st.st_mode == S_IFREG && iter->flags & OS_FileIterFlag_SkipFiles) ||\r\n                  (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == 0) ||\r\n                  (lnx_iter->dp->d_name[0] == '.' && lnx_iter->dp->d_name[1] == '.' && lnx_iter->dp->d_name[2] == 0));\r\n    }\r\n    \r\n    // rjf: output & exit, if good & unfiltered\r\n    if(good && !filtered)\r\n    {\r\n      info_out->name = push_str8_copy(arena, str8_cstring(lnx_iter->dp->d_name));\r\n      if(stat_result != -1)\r\n      {\r\n        info_out->props = os_lnx_file_properties_from_stat(&st);\r\n      }\r\n      break;\r\n    }\r\n    \r\n    // rjf: exit if not good\r\n    if(!good)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal void\r\nos_file_iter_end(OS_FileIter *iter)\r\n{\r\n  OS_LNX_FileIter *lnx_iter = (OS_LNX_FileIter *)iter->memory;\r\n  closedir(lnx_iter->dir);\r\n}\r\n\r\n//- rjf: directory creation\r\n\r\ninternal B32\r\nos_make_directory(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = 0;\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  if(mkdir((char*)path_copy.str, 0755) != -1)\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_shared_memory_alloc(U64 size, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  int id = shm_open((char *)name_copy.str, O_RDWR|O_CREAT, 0666);\r\n  ftruncate(id, size);\r\n  OS_Handle result = {(U64)id};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_shared_memory_open(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  int id = shm_open((char *)name_copy.str, O_RDWR, 0);\r\n  OS_Handle result = {(U64)id};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_close(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())){return;}\r\n  int id = (int)handle.u64[0];\r\n  close(id);\r\n}\r\n\r\ninternal void *\r\nos_shared_memory_view_open(OS_Handle handle, Rng1U64 range)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())){return 0;}\r\n  int id = (int)handle.u64[0];\r\n  void *base = mmap(0, dim_1u64(range), PROT_READ|PROT_WRITE, MAP_SHARED, id, range.min);\r\n  if(base == MAP_FAILED)\r\n  {\r\n    base = 0;\r\n  }\r\n  return base;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())){return;}\r\n  munmap(ptr, dim_1u64(range));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U64\r\nos_now_microseconds(void)\r\n{\r\n  struct timespec t;\r\n  clock_gettime(CLOCK_MONOTONIC, &t);\r\n  U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1));\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nos_now_unix(void)\r\n{\r\n  time_t t = time(0);\r\n  return (U32)t;\r\n}\r\n\r\ninternal DateTime\r\nos_now_universal_time(void)\r\n{\r\n  time_t t = 0;\r\n  time(&t);\r\n  struct tm universal_tm = {0};\r\n  gmtime_r(&t, &universal_tm);\r\n  DateTime result = os_lnx_date_time_from_tm(universal_tm, 0);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_universal_time_from_local(DateTime *date_time)\r\n{\r\n  // rjf: local DateTime -> universal time_t\r\n  tm local_tm = os_lnx_tm_from_date_time(*date_time);\r\n  local_tm.tm_isdst = -1;\r\n  time_t universal_t = mktime(&local_tm);\r\n  \r\n  // rjf: universal time_t -> DateTime\r\n  tm universal_tm = {0};\r\n  gmtime_r(&universal_t, &universal_tm);\r\n  DateTime result = os_lnx_date_time_from_tm(universal_tm, 0);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_local_time_from_universal(DateTime *date_time)\r\n{\r\n  // rjf: universal DateTime -> local time_t\r\n  tm universal_tm = os_lnx_tm_from_date_time(*date_time);\r\n  universal_tm.tm_isdst = -1;\r\n  time_t universal_t = timegm(&universal_tm);\r\n  tm local_tm = {0};\r\n  localtime_r(&universal_t, &local_tm);\r\n  \r\n  // rjf: local tm -> DateTime\r\n  DateTime result = os_lnx_date_time_from_tm(local_tm, 0);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_sleep_milliseconds(U32 msec)\r\n{\r\n  usleep(msec*Thousand(1));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_process_launch(OS_ProcessLaunchParams *params)\r\n{\r\n  OS_Handle handle = {0};\r\n  \r\n  posix_spawn_file_actions_t file_actions = {0};\r\n  int file_actions_init_code = posix_spawn_file_actions_init(&file_actions);\r\n  if(file_actions_init_code == 0)\r\n  {\r\n    // redirect STDOUT \r\n    int stdout_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdout_file.u64[0], STDOUT_FILENO);\r\n    Assert(stdout_code == 0);\r\n    \r\n    // redirect STDERR\r\n    int stderr_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stderr_file.u64[0], STDERR_FILENO);\r\n    Assert(stderr_code == 0);\r\n    \r\n    // redirect STDIN\r\n    int stdin_code = posix_spawn_file_actions_adddup2(&file_actions, (int)params->stdin_file.u64[0], STDIN_FILENO);\r\n    Assert(stdin_code == 0);\r\n    \r\n    posix_spawnattr_t attr = {0};\r\n    int attr_init_code = posix_spawnattr_init(&attr);\r\n    if(attr_init_code == 0)\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      \r\n      // package argv\r\n      char **argv = push_array(scratch.arena, char *, params->cmd_line.node_count + 1);\r\n      {\r\n        String8List l = str8_split_path(scratch.arena, params->path);\r\n        str8_list_push(scratch.arena, &l, params->cmd_line.first->string);\r\n        String8 path_to_exe = str8_path_list_join_by_style(scratch.arena, &l, PathStyle_SystemAbsolute);\r\n        \r\n        argv[0] = (char *)path_to_exe.str;\r\n        U64 arg_idx = 1;\r\n        for EachNode(n, String8Node, params->cmd_line.first->next) { argv[arg_idx++] = (char *)n->string.str; }\r\n      }\r\n      \r\n      // package envp\r\n      char **envp = 0;\r\n      if(params->inherit_env)\r\n      {\r\n        envp = __environ;\r\n      }\r\n      else\r\n      {\r\n        envp = push_array(scratch.arena, char *, params->env.node_count + 2);\r\n        U64 env_idx = 0;\r\n        for EachNode(n, String8Node, params->cmd_line.first)\r\n        {\r\n          envp[env_idx] = (char *)n->string.str;\r\n        }\r\n      }\r\n      \r\n      if(params->debug_subprocesses)\r\n      {\r\n        // not suported\r\n        InvalidPath;\r\n      }\r\n      \r\n      if(!params->consoleless)\r\n      {\r\n        NotImplemented;\r\n      }\r\n      \r\n      // spawn process\r\n      pid_t pid = 0;\r\n      int spawn_code = posix_spawn(&pid, argv[0], &file_actions, &attr, argv, envp);\r\n      \r\n      if(spawn_code == 0)\r\n      {\r\n        handle.u64[0] = (U64)pid;\r\n      }\r\n      \r\n      // clean up attributes\r\n      int attr_destroy_code = posix_spawnattr_destroy(&attr);\r\n      Assert(attr_destroy_code == 0);\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    // clean up file actions\r\n    int file_actions_destroy_code = posix_spawn_file_actions_destroy(&file_actions);\r\n    Assert(file_actions_destroy_code == 0);\r\n  }\r\n  \r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nos_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out)\r\n{\r\n  pid_t pid = (pid_t)handle.u64[0];\r\n  B32 result = 0;\r\n  if(endt_us == 0)\r\n  {\r\n    if(kill(pid, 0) >= 0)\r\n    {\r\n      result = (errno == ENOENT);\r\n      \r\n      if(result)\r\n      {\r\n        int status;\r\n        waitpid(pid, &status, 0);\r\n      }\r\n    }\r\n    else { Assert(0 && \"failed to get status from pid\"); }\r\n  }\r\n  else if(endt_us == max_U64)\r\n  {\r\n    for(;;)\r\n    {\r\n      int status = 0;\r\n      int w = waitpid(pid, &status, 0);\r\n      if(w == -1)\r\n      {\r\n        break;\r\n      }\r\n      if(WIFEXITED(status) || WIFSTOPPED(status) || WIFSIGNALED(status))\r\n      {\r\n        result = 1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  else\r\n  {\r\n    NotImplemented;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_process_detach(OS_Handle handle)\r\n{\r\n  // no need to close pid\r\n}\r\n\r\ninternal B32\r\nos_process_kill(OS_Handle handle)\r\n{\r\n  int error_code = kill((pid_t)handle.u64[0], SIGKILL);\r\n  B32 is_killed = error_code == 0;\r\n  return is_killed;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal Thread\r\nos_thread_launch(ThreadEntryPointFunctionType *func, void *ptr)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Thread);\r\n  entity->thread.func = func;\r\n  entity->thread.ptr = ptr;\r\n  {\r\n    int pthread_result = pthread_create(&entity->thread.handle, 0, os_lnx_thread_entry_point, entity);\r\n    if(pthread_result == -1)\r\n    {\r\n      os_lnx_entity_release(entity);\r\n      entity = 0;\r\n    }\r\n  }\r\n  Thread handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nos_thread_join(Thread handle, U64 endt_us)\r\n{\r\n  if(MemoryIsZeroStruct(&handle)) { return 0; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0];\r\n  int join_result = pthread_join(entity->thread.handle, 0);\r\n  B32 result = (join_result == 0);\r\n  os_lnx_entity_release(entity);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_thread_detach(Thread handle)\r\n{\r\n  if(MemoryIsZeroStruct(&handle)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)handle.u64[0];\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n//- rjf: mutexes\r\n\r\ninternal Mutex\r\nos_mutex_alloc(void)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Mutex);\r\n  int init_result = pthread_mutex_init(&entity->mutex_handle, 0);\r\n  if(init_result == -1)\r\n  {\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  Mutex handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_mutex_release(Mutex mutex)\r\n{\r\n  if(MemoryIsZeroStruct(&mutex)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  pthread_mutex_destroy(&entity->mutex_handle);\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_mutex_take(Mutex mutex)\r\n{\r\n  if(MemoryIsZeroStruct(&mutex)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  pthread_mutex_lock(&entity->mutex_handle);\r\n}\r\n\r\ninternal void\r\nos_mutex_drop(Mutex mutex)\r\n{\r\n  if(MemoryIsZeroStruct(&mutex)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  pthread_mutex_unlock(&entity->mutex_handle);\r\n}\r\n\r\n//- rjf: reader/writer mutexes\r\n\r\ninternal RWMutex\r\nos_rw_mutex_alloc(void)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_RWMutex);\r\n  int init_result = pthread_rwlock_init(&entity->rwmutex_handle, 0);\r\n  if(init_result == -1)\r\n  {\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  RWMutex handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_release(RWMutex rw_mutex)\r\n{\r\n  if(MemoryIsZeroStruct(&rw_mutex)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_destroy(&entity->rwmutex_handle);\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take(RWMutex rw_mutex, B32 write_mode)\r\n{\r\n  if(MemoryIsZeroStruct(&rw_mutex)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  if(write_mode)\r\n  {\r\n    pthread_rwlock_wrlock(&entity->rwmutex_handle);\r\n  }\r\n  else\r\n  {\r\n    pthread_rwlock_rdlock(&entity->rwmutex_handle);\r\n  }\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop(RWMutex rw_mutex, B32 write_mode)\r\n{\r\n  if(MemoryIsZeroStruct(&rw_mutex)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)rw_mutex.u64[0];\r\n  pthread_rwlock_unlock(&entity->rwmutex_handle);\r\n}\r\n\r\n//- rjf: condition variables\r\n\r\ninternal CondVar\r\nos_cond_var_alloc(void)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_ConditionVariable);\r\n  int init_result = pthread_cond_init(&entity->cv.cond_handle, 0);\r\n  if(init_result == -1)\r\n  {\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  int init2_result = 0;\r\n  if(entity)\r\n  {\r\n    init2_result = pthread_mutex_init(&entity->cv.rwlock_mutex_handle, 0);\r\n  }\r\n  if(init2_result == -1)\r\n  {\r\n    pthread_cond_destroy(&entity->cv.cond_handle);\r\n    os_lnx_entity_release(entity);\r\n    entity = 0;\r\n  }\r\n  CondVar handle = {(U64)entity};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_cond_var_release(CondVar cv)\r\n{\r\n  if(MemoryIsZeroStruct(&cv)) { return; }\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity *)cv.u64[0];\r\n  pthread_cond_destroy(&entity->cv.cond_handle);\r\n  pthread_mutex_destroy(&entity->cv.rwlock_mutex_handle);\r\n  os_lnx_entity_release(entity);\r\n}\r\n\r\ninternal B32\r\nos_cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us)\r\n{\r\n  if(MemoryIsZeroStruct(&cv)) { return 0; }\r\n  if(MemoryIsZeroStruct(&mutex)) { return 0; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  OS_LNX_Entity *mutex_entity = (OS_LNX_Entity *)mutex.u64[0];\r\n  struct timespec endt_timespec;\r\n  endt_timespec.tv_sec = endt_us/Million(1);\r\n  endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));\r\n  int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &mutex_entity->mutex_handle, &endt_timespec);\r\n  B32 result = (wait_result != ETIMEDOUT);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us)\r\n{\r\n  // TODO(rjf): because pthread does not supply cv/rw natively, I had to hack\r\n  // this together, but this would probably just be a lot better if we just\r\n  // implemented the primitives ourselves with e.g. futexes\r\n  //\r\n  if(MemoryIsZeroStruct(&cv)) { return 0; }\r\n  if(MemoryIsZeroStruct(&mutex_rw)) { return 0; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  OS_LNX_Entity *rw_mutex_entity = (OS_LNX_Entity *)mutex_rw.u64[0];\r\n  struct timespec endt_timespec;\r\n  endt_timespec.tv_sec = endt_us/Million(1);\r\n  endt_timespec.tv_nsec = Thousand(1) * (endt_us - (endt_us/Million(1))*Million(1));\r\n  B32 result = 0;\r\n  pthread_mutex_lock(&cv_entity->cv.rwlock_mutex_handle);\r\n  pthread_rwlock_unlock(&rw_mutex_entity->rwmutex_handle);\r\n  for(;;)\r\n  {\r\n    int wait_result = pthread_cond_timedwait(&cv_entity->cv.cond_handle, &cv_entity->cv.rwlock_mutex_handle, &endt_timespec);\r\n    if(wait_result != ETIMEDOUT)\r\n    {\r\n      if(write_mode)\r\n      {\r\n        pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle);\r\n      }\r\n      else\r\n      {\r\n        pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle);\r\n      }\r\n      result = 1;\r\n      break;\r\n    }\r\n    if(wait_result == ETIMEDOUT)\r\n    {\r\n      if(write_mode)\r\n      {\r\n        pthread_rwlock_wrlock(&rw_mutex_entity->rwmutex_handle);\r\n      }\r\n      else\r\n      {\r\n        pthread_rwlock_rdlock(&rw_mutex_entity->rwmutex_handle);\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  pthread_mutex_unlock(&cv_entity->cv.rwlock_mutex_handle);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_cond_var_signal(CondVar cv)\r\n{\r\n  if(MemoryIsZeroStruct(&cv)) { return; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  pthread_cond_signal(&cv_entity->cv.cond_handle);\r\n}\r\n\r\ninternal void\r\nos_cond_var_broadcast(CondVar cv)\r\n{\r\n  if(MemoryIsZeroStruct(&cv)) { return; }\r\n  OS_LNX_Entity *cv_entity = (OS_LNX_Entity *)cv.u64[0];\r\n  pthread_cond_broadcast(&cv_entity->cv.cond_handle);\r\n}\r\n\r\n//- rjf: cross-process semaphores\r\n\r\ninternal Semaphore\r\nos_semaphore_alloc(U32 initial_count, U32 max_count, String8 name)\r\n{\r\n  Semaphore result = {0};\r\n  if (name.size > 0)\r\n  {\r\n    for EachIndex(attempt_idx, 64)\r\n    {\r\n      sem_t *s = sem_open((char *)name.str, O_CREAT | O_EXCL, 0666, initial_count);\r\n      if(s == SEM_FAILED)\r\n      {\r\n        s = sem_open((char *)name.str, 0);\r\n      }\r\n      if(s != SEM_FAILED)\r\n      {\r\n        result.u64[0] = (U64)s;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  else\r\n  {\r\n    sem_t *s = mmap(0, sizeof(*s), PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);\r\n    AssertAlways(s != MAP_FAILED);\r\n    int err = sem_init(s, 0, initial_count);\r\n    if(err == 0)\r\n    {\r\n      result.u64[0] = (U64)s;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_release(Semaphore semaphore)\r\n{\r\n  int err = munmap((void*)semaphore.u64[0], sizeof(sem_t));\r\n  AssertAlways(err == 0);\r\n}\r\n\r\ninternal Semaphore\r\nos_semaphore_open(String8 name)\r\n{\r\n  Semaphore result = {0};\r\n  sem_t *s = sem_open((char *)name.str, 0);\r\n  if(s != SEM_FAILED)\r\n  {\r\n    result.u64[0] = (U64)s;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_close(Semaphore semaphore)\r\n{\r\n  sem_t *s = (sem_t *)semaphore.u64[0];\r\n  sem_close(s);\r\n}\r\n\r\ninternal B32\r\nos_semaphore_take(Semaphore semaphore, U64 endt_us)\r\n{\r\n  // TODO(rjf): we need to use `sem_timedwait` here.\r\n  AssertAlways(endt_us == max_U64);\r\n  for(;;)\r\n  {\r\n    int err = sem_wait((sem_t*)semaphore.u64[0]);\r\n    if(err == 0)\r\n    {\r\n      break;\r\n    }\r\n    else if(errno == EAGAIN)\r\n    {\r\n      continue;\r\n    }\r\n    break;\r\n  }\r\n  return 1;\r\n}\r\n\r\ninternal void\r\nos_semaphore_drop(Semaphore semaphore)\r\n{\r\n  for(;;)\r\n  {\r\n    int err = sem_post((sem_t*)semaphore.u64[0]);\r\n    if(err == 0)\r\n    {\r\n      break;\r\n    }\r\n    else\r\n    {\r\n      if(errno == EAGAIN)\r\n      {\r\n        continue;\r\n      }\r\n    }\r\n    break;\r\n  }\r\n}\r\n\r\n//- rjf: barriers\r\n\r\ninternal Barrier\r\nos_barrier_alloc(U64 count)\r\n{\r\n  OS_LNX_Entity *entity = os_lnx_entity_alloc(OS_LNX_EntityKind_Barrier);\r\n  if(entity != 0)\r\n  {\r\n    pthread_barrier_init(&entity->barrier, 0, count);\r\n  }\r\n  Barrier result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_barrier_release(Barrier barrier)\r\n{\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]);\r\n  if(entity != 0)\r\n  {\r\n    pthread_barrier_destroy(&entity->barrier);\r\n    os_lnx_entity_release(entity);\r\n  }\r\n}\r\n\r\ninternal void\r\nos_barrier_wait(Barrier barrier)\r\n{\r\n  OS_LNX_Entity *entity = (OS_LNX_Entity*)PtrFromInt(barrier.u64[0]);\r\n  if(entity != 0)\r\n  {\r\n    pthread_barrier_wait(&entity->barrier);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_library_open(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str;\r\n  void *so = dlopen(path_cstr, RTLD_LAZY|RTLD_LOCAL);\r\n  OS_Handle lib = { (U64)so };\r\n  scratch_end(scratch);\r\n  return lib;\r\n}\r\n\r\ninternal VoidProc*\r\nos_library_load_proc(OS_Handle lib, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  void *so = (void *)lib.u64;\r\n  char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str;\r\n  VoidProc *proc = (VoidProc *)dlsym(so, name_cstr);\r\n  scratch_end(scratch);\r\n  return proc;\r\n}\r\n\r\ninternal void\r\nos_library_close(OS_Handle lib)\r\n{\r\n  void *so = (void *)lib.u64;\r\n  dlclose(so);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Safe Calls (Implemented Per-OS)\r\n\r\ninternal void\r\nos_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr)\r\n{\r\n  // rjf: push handler to chain\r\n  OS_LNX_SafeCallChain chain = {0};\r\n  SLLStackPush(os_lnx_safe_call_chain, &chain);\r\n  chain.fail_handler = fail_handler;\r\n  chain.ptr = ptr;\r\n  \r\n  // rjf: set up sig handler info\r\n  struct sigaction new_act = {0};\r\n  new_act.sa_handler = os_lnx_safe_call_sig_handler;\r\n  int signals_to_handle[] =\r\n  {\r\n    SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP,\r\n  };\r\n  struct sigaction og_act[ArrayCount(signals_to_handle)] = {0};\r\n  \r\n  // rjf: attach handler info for all signals\r\n  for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1)\r\n  {\r\n    sigaction(signals_to_handle[i], &new_act, &og_act[i]);\r\n  }\r\n  \r\n  // rjf: call function\r\n  func(ptr);\r\n  \r\n  // rjf: reset handler info for all signals\r\n  for(U32 i = 0; i < ArrayCount(signals_to_handle); i += 1)\r\n  {\r\n    sigaction(signals_to_handle[i], &og_act[i], 0);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks GUIDs (Implemented Per-OS)\r\n\r\ninternal Guid\r\nos_make_guid(void)\r\n{\r\n  Guid guid = {0};\r\n  getrandom(guid.v, sizeof(guid.v), 0);\r\n  guid.data3 &= 0x0fff;\r\n  guid.data3 |= (4 << 12);\r\n  guid.data4[0] &= 0x3f;\r\n  guid.data4[0] |= 0x80;\r\n  return guid;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Entry Points (Implemented Per-OS)\r\n\r\ninternal void\r\nlnx_signal_handler(int sig, siginfo_t *info, void *arg)\r\n{\r\n  local_persist volatile U32 first = 0;\r\n  if (ins_atomic_u32_eval_cond_assign(&first, 1, 0) != 0)\r\n  {\r\n    for(;;)\r\n    {\r\n      sleep(UINT32_MAX);\r\n    }\r\n  }\r\n  \r\n  local_persist void *ips[4096];\r\n  int ips_count = backtrace(ips, ArrayCount(ips));\r\n  \r\n  fprintf(stderr, \"A fatal signal was received: %s (%d). The process is terminating.\\n\", strsignal(sig), sig);\r\n  fprintf(stderr, \"Create a new issue with this report at %s.\\n\\n\", BUILD_ISSUES_LINK_STRING_LITERAL);\r\n  fprintf(stderr, \"Callstack:\\n\");\r\n  for EachIndex(i, ips_count)\r\n  {\r\n    Dl_info info = {0};\r\n    dladdr(ips[i], &info);\r\n    \r\n    char cmd[2048];\r\n    snprintf(cmd, sizeof(cmd), \"llvm-symbolizer --relative-address -f -e %s %lu\", info.dli_fname, (unsigned long)ips[i] - (unsigned long)info.dli_fbase);\r\n    FILE *f = popen(cmd, \"r\");\r\n    if(f)\r\n    {\r\n      char func_name[256], file_name[256];\r\n      if(fgets(func_name, sizeof(func_name), f) && fgets(file_name, sizeof(file_name), f))\r\n      {\r\n        String8 func = str8_cstring(func_name);\r\n        if(func.size > 0) func.size -= 1;\r\n        String8 module = str8_skip_last_slash(str8_cstring(info.dli_fname));\r\n        String8 file   = str8_skip_last_slash(str8_cstring_capped(file_name, file_name + sizeof(file_name)));\r\n        if(file.size > 0) file.size -= 1;\r\n        \r\n        B32 no_func = str8_match(func, str8_lit(\"??\"), StringMatchFlag_RightSideSloppy);\r\n        B32 no_file = str8_match(file, str8_lit(\"??\"), StringMatchFlag_RightSideSloppy);\r\n        if(no_func) { func = str8_zero(); }\r\n        if(no_file) { file = str8_zero(); }\r\n        \r\n        fprintf(stderr, \"%ld. [0x%016lx] %.*s%s%.*s %.*s\\n\", i+1, (unsigned long)ips[i], (int)module.size, module.str, (!no_func || !no_file) ? \", \" : \"\", (int)func.size, func.str, (int)file.size, file.str);\r\n      }\r\n      pclose(f);\r\n    }\r\n    else\r\n    {\r\n      fprintf(stderr, \"%ld. [0x%016lx] %s\\n\", i+1, (unsigned long)ips[i], info.dli_fname);\r\n    }\r\n  }\r\n  fprintf(stderr, \"\\nVersion: %s%s\\n\\n\", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND);\r\n  \r\n  _exit(0);\r\n}\r\n\r\nint\r\nmain(int argc, char **argv)\r\n{\r\n  // install signal handler for the crash call stacks\r\n  {\r\n    struct sigaction handler = { .sa_sigaction = lnx_signal_handler, .sa_flags = SA_SIGINFO, };\r\n    sigfillset(&handler.sa_mask);\r\n    sigaction(SIGILL, &handler, NULL);\r\n    sigaction(SIGTRAP, &handler, NULL);\r\n    sigaction(SIGABRT, &handler, NULL);\r\n    sigaction(SIGFPE, &handler, NULL);\r\n    sigaction(SIGBUS, &handler, NULL);\r\n    sigaction(SIGSEGV, &handler, NULL);\r\n    sigaction(SIGQUIT, &handler, NULL);\r\n  }\r\n  \r\n  //- rjf: set up OS layer\r\n  {\r\n    //- rjf: get statically-allocated system/process info\r\n    {\r\n      OS_SystemInfo *info = &os_lnx_state.system_info;\r\n      info->logical_processor_count = (U32)get_nprocs();\r\n      info->page_size               = (U64)getpagesize();\r\n      info->large_page_size         = MB(2);\r\n      info->allocation_granularity  = info->page_size;\r\n    }\r\n    {\r\n      OS_ProcessInfo *info = &os_lnx_state.process_info;\r\n      info->pid = (U32)getpid();\r\n    }\r\n    \r\n    //- rjf: set up thread context\r\n    TCTX *tctx = tctx_alloc();\r\n    tctx_select(tctx);\r\n    \r\n    //- rjf: set up dynamically allocated state\r\n    os_lnx_state.arena = arena_alloc();\r\n    os_lnx_state.entity_arena = arena_alloc();\r\n    pthread_mutex_init(&os_lnx_state.entity_mutex, 0);\r\n    \r\n    //- rjf: grab dynamically allocated system info\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      OS_SystemInfo *info = &os_lnx_state.system_info;\r\n      \r\n      // rjf: get machine name\r\n      B32 got_final_result = 0;\r\n      U8 *buffer = 0;\r\n      int size = 0;\r\n      for(S64 cap = 4096, r = 0; r < 4; cap *= 2, r += 1)\r\n      {\r\n        scratch_end(scratch);\r\n        buffer = push_array(scratch.arena, U8, cap);\r\n        int gethostname_result = gethostname((char*)buffer, cap);\r\n        size = cstring8_length(buffer);\r\n        if(gethostname_result == 0 && size < cap)\r\n        {\r\n          got_final_result = 1;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: save name to info\r\n      if(got_final_result && size > 0)\r\n      {\r\n        info->machine_name.size = size;\r\n        info->machine_name.str = push_array_no_zero(os_lnx_state.arena, U8, info->machine_name.size + 1);\r\n        MemoryCopy(info->machine_name.str, buffer, info->machine_name.size);\r\n        info->machine_name.str[info->machine_name.size] = 0;\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    //- rjf: grab dynamically allocated process info\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      OS_ProcessInfo *info = &os_lnx_state.process_info;\r\n      \r\n      // rjf: grab binary path\r\n      {\r\n        // rjf: get self string\r\n        B32 got_final_result = 0;\r\n        U8 *buffer = 0;\r\n        int size = 0;\r\n        for(S64 cap = PATH_MAX, r = 0; r < 4; cap *= 2, r += 1)\r\n        {\r\n          scratch_end(scratch);\r\n          buffer = push_array_no_zero(scratch.arena, U8, cap);\r\n          size = readlink(\"/proc/self/exe\", (char*)buffer, cap);\r\n          if(size < cap)\r\n          {\r\n            got_final_result = 1;\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: save\r\n        if(got_final_result && size > 0)\r\n        {\r\n          String8 full_name = str8(buffer, size);\r\n          String8 name_chopped = str8_chop_last_slash(full_name);\r\n          info->binary_path = push_str8_copy(os_lnx_state.arena, name_chopped);\r\n        }\r\n      }\r\n      \r\n      // rjf: grab initial directory\r\n      {\r\n        info->initial_path = os_get_current_path(os_lnx_state.arena);\r\n      }\r\n      \r\n      // rjf: grab home directory\r\n      {\r\n        char *home = getenv(\"HOME\");\r\n        info->user_program_data_path = str8_cstring(home);\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n  \r\n  //- rjf: call into \"real\" entry point\r\n  main_thread_base_entry_point(argc, argv);\r\n}\r\n"
  },
  {
    "path": "src/os/core/linux/os_core_linux.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_CORE_LINUX_H\r\n#define OS_CORE_LINUX_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n#include <dirent.h>\r\n#include <dlfcn.h>\r\n#include <dlfcn.h>\r\n#include <errno.h>\r\n#include <execinfo.h>\r\n#include <fcntl.h>\r\n#include <features.h>\r\n#include <linux/limits.h>\r\n#include <pthread.h>\r\n#include <semaphore.h>\r\n#include <signal.h>\r\n#include <spawn.h>\r\n#include <stdlib.h>\r\n#include <sys/mman.h>\r\n#include <sys/random.h>\r\n#include <sys/sendfile.h>\r\n#include <sys/stat.h>\r\n#include <sys/syscall.h>\r\n#include <sys/sysinfo.h>\r\n#include <sys/types.h>\r\n#include <sys/wait.h>\r\n#include <time.h>\r\n#include <unistd.h>\r\n\r\npid_t gettid(void);\r\nint pthread_setname_np(pthread_t thread, const char *name);\r\nint pthread_getname_np(pthread_t thread, char *name, size_t size);\r\n\r\ntypedef struct tm tm;\r\ntypedef struct timespec timespec;\r\n\r\n////////////////////////////////\r\n//~ rjf: File Iterator\r\n\r\ntypedef struct OS_LNX_FileIter OS_LNX_FileIter;\r\nstruct OS_LNX_FileIter\r\n{\r\n  DIR *dir;\r\n  struct dirent *dp;\r\n  String8 path;\r\n};\r\nStaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_LNX_FileIter), os_lnx_file_iter_size_check);\r\n\r\n////////////////////////////////\r\n//~ rjf: Safe Call Handler Chain\r\n\r\ntypedef struct OS_LNX_SafeCallChain OS_LNX_SafeCallChain;\r\nstruct OS_LNX_SafeCallChain\r\n{\r\n  OS_LNX_SafeCallChain *next;\r\n  ThreadEntryPointFunctionType *fail_handler;\r\n  void *ptr;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Entities\r\n\r\ntypedef enum OS_LNX_EntityKind\r\n{\r\n  OS_LNX_EntityKind_Thread,\r\n  OS_LNX_EntityKind_Mutex,\r\n  OS_LNX_EntityKind_RWMutex,\r\n  OS_LNX_EntityKind_ConditionVariable,\r\n  OS_LNX_EntityKind_Barrier,\r\n}\r\nOS_LNX_EntityKind;\r\n\r\ntypedef struct OS_LNX_Entity OS_LNX_Entity;\r\nstruct OS_LNX_Entity\r\n{\r\n  OS_LNX_Entity *next;\r\n  OS_LNX_EntityKind kind;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      pthread_t handle;\r\n      ThreadEntryPointFunctionType *func;\r\n      void *ptr;\r\n    } thread;\r\n    pthread_mutex_t mutex_handle;\r\n    pthread_rwlock_t rwmutex_handle;\r\n    struct\r\n    {\r\n      pthread_cond_t cond_handle;\r\n      pthread_mutex_t rwlock_mutex_handle;\r\n    } cv;\r\n    pthread_barrier_t barrier;\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: State\r\n\r\ntypedef struct OS_LNX_State OS_LNX_State;\r\nstruct OS_LNX_State\r\n{\r\n  Arena *arena;\r\n  OS_SystemInfo system_info;\r\n  OS_ProcessInfo process_info;\r\n  pthread_mutex_t entity_mutex;\r\n  Arena *entity_arena;\r\n  OS_LNX_Entity *entity_free;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal OS_LNX_State os_lnx_state = {0};\r\nthread_static OS_LNX_SafeCallChain *os_lnx_safe_call_chain = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal DateTime os_lnx_date_time_from_tm(tm in, U32 msec);\r\ninternal tm os_lnx_tm_from_date_time(DateTime dt);\r\ninternal timespec os_lnx_timespec_from_date_time(DateTime dt);\r\ninternal DenseTime os_lnx_dense_time_from_timespec(timespec in);\r\ninternal FileProperties os_lnx_file_properties_from_stat(struct stat *s);\r\ninternal void os_lnx_safe_call_sig_handler(int x);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entities\r\n\r\ninternal OS_LNX_Entity *os_lnx_entity_alloc(OS_LNX_EntityKind kind);\r\ninternal void os_lnx_entity_release(OS_LNX_Entity *entity);\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal void *os_lnx_thread_entry_point(void *ptr);\r\n\r\n#endif // OS_CORE_LINUX_H\r\n"
  },
  {
    "path": "src/os/core/linux/os_core_linux_old.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include <stdio.h>\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal pthread_mutex_t lnx_mutex = {0};\r\nglobal Arena *lnx_perm_arena = 0;\r\nglobal String8List lnx_cmd_line_args = {0};\r\nglobal LNX_Entity lnx_entity_buffer[1024];\r\nglobal LNX_Entity *lnx_entity_free = 0;\r\nglobal String8 lnx_initial_path = {0};\r\nthread_static LNX_SafeCallChain *lnx_safe_call_chain = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal B32\r\nlnx_write_list_to_file_descriptor(int fd, String8List list){\r\n  B32 success = true;\r\n  \r\n  String8Node *node = list.first;\r\n  if (node != 0){\r\n    U8 *ptr = node->string.str;;\r\n    U8 *opl = ptr + node->string.size;\r\n    \r\n    U64 p = 0;\r\n    for (;p < list.total_size;){\r\n      U64 amt64 = (U64)(opl - ptr);\r\n      U32 amt = u32_from_u64_saturate(amt64);\r\n      S64 written_amt = write(fd, ptr, amt);\r\n      if (written_amt < 0){\r\n        break;\r\n      }\r\n      p += written_amt;\r\n      ptr += written_amt;\r\n      \r\n      Assert(ptr <= opl);\r\n      if (ptr == opl){\r\n        node = node->next;\r\n        if (node == 0){\r\n          if (p < list.total_size){\r\n            success = false;\r\n          }\r\n          break;\r\n        }\r\n        ptr = node->string.str;\r\n        opl = ptr + node->string.size;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return(success);\r\n}\r\n\r\ninternal void\r\nlnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec){\r\n  out->msec = msec;\r\n  out->sec  = in->tm_sec;\r\n  out->min  = in->tm_min;\r\n  out->hour = in->tm_hour;\r\n  out->day  = in->tm_mday - 1;\r\n  out->wday = in->tm_wday;\r\n  out->mon  = in->tm_mon;\r\n  out->year = in->tm_year + 1900;\r\n}\r\n\r\ninternal void\r\nlnx_tm_from_date_time(struct tm *out, DateTime *in){\r\n  out->tm_sec  = in->sec;\r\n  out->tm_min  = in->min;\r\n  out->tm_hour = in->hour;\r\n  out->tm_mday = in->day + 1;\r\n  out->tm_mon  = in->mon;\r\n  out->tm_year = in->year - 1900;\r\n}\r\n\r\ninternal void\r\nlnx_dense_time_from_timespec(DenseTime *out, struct timespec *in){\r\n  struct tm tm_time = {0};\r\n  gmtime_r(&in->tv_sec, &tm_time);\r\n  DateTime date_time = {0};\r\n  lnx_date_time_from_tm(&date_time, &tm_time, in->tv_nsec/Million(1));\r\n  *out = dense_time_from_date_time(date_time);\r\n}\r\n\r\ninternal void\r\nlnx_file_properties_from_stat(FileProperties *out, struct stat *in){\r\n  MemoryZeroStruct(out);\r\n  out->size = in->st_size;\r\n  lnx_dense_time_from_timespec(&out->created, &in->st_ctim);\r\n  lnx_dense_time_from_timespec(&out->modified, &in->st_mtim);\r\n  if ((in->st_mode & S_IFDIR) != 0){\r\n    out->flags |= FilePropertyFlag_IsFolder;\r\n  }\r\n}\r\n\r\ninternal String8\r\nlnx_string_from_signal(int signum){\r\n  String8 result = str8_lit(\"<unknown-signal>\");\r\n  switch (signum){\r\n    case SIGABRT:\r\n    {\r\n      result = str8_lit(\"SIGABRT\");\r\n    }break;\r\n    case SIGALRM:\r\n    {\r\n      result = str8_lit(\"SIGALRM\");\r\n    }break;\r\n    case SIGBUS:\r\n    {\r\n      result = str8_lit(\"SIGBUS\");\r\n    }break;\r\n    case SIGCHLD:\r\n    {\r\n      result = str8_lit(\"SIGCHLD\");\r\n    }break;\r\n    case SIGCONT:\r\n    {\r\n      result = str8_lit(\"SIGCONT\");\r\n    }break;\r\n    case SIGFPE:\r\n    {\r\n      result = str8_lit(\"SIGFPE\");\r\n    }break;\r\n    case SIGHUP:\r\n    {\r\n      result = str8_lit(\"SIGHUP\");\r\n    }break;\r\n    case SIGILL:\r\n    {\r\n      result = str8_lit(\"SIGILL\");\r\n    }break;\r\n    case SIGINT:\r\n    {\r\n      result = str8_lit(\"SIGINT\");\r\n    }break;\r\n    case SIGIO:\r\n    {\r\n      result = str8_lit(\"SIGIO\");\r\n    }\r\n    case SIGKILL:\r\n    {\r\n      result = str8_lit(\"SIGKILL\");\r\n    }break;\r\n    case SIGPIPE:\r\n    {\r\n      result = str8_lit(\"SIGPIPE\");\r\n    }break;\r\n    case SIGPROF:\r\n    {\r\n      result = str8_lit(\"SIGPROF\");\r\n    }break;\r\n    case SIGPWR:\r\n    {\r\n      result = str8_lit(\"SIGPWR\");\r\n    }break;\r\n    case SIGQUIT:\r\n    {\r\n      result = str8_lit(\"SIGQUIT\");\r\n    }break;\r\n    case SIGSEGV:\r\n    {\r\n      result = str8_lit(\"SIGSEGV\");\r\n    }break;\r\n    case SIGSTKFLT:\r\n    {\r\n      result = str8_lit(\"SIGSTKFLT\");\r\n    }break;\r\n    case SIGSTOP:\r\n    {\r\n      result = str8_lit(\"SIGSTOP\");\r\n    }break;\r\n    case SIGTSTP:\r\n    {\r\n      result = str8_lit(\"SIGTSTP\");\r\n    }break;\r\n    case SIGSYS:\r\n    {\r\n      result = str8_lit(\"SIGSYS\");\r\n    }break;\r\n    case SIGTERM:\r\n    {\r\n      result = str8_lit(\"SIGTERM\");\r\n    }break;\r\n    case SIGTRAP:\r\n    {\r\n      result = str8_lit(\"SIGTRAP\");\r\n    }break;\r\n    case SIGTTIN:\r\n    {\r\n      result = str8_lit(\"SIGTTIN\");\r\n    }break;\r\n    case SIGTTOU:\r\n    {\r\n      result = str8_lit(\"SIGTTOU\");\r\n    }break;\r\n    case SIGURG:\r\n    {\r\n      result = str8_lit(\"SIGURG\");\r\n    }break;\r\n    case SIGUSR1:\r\n    {\r\n      result = str8_lit(\"SIGUSR1\");\r\n    }break;\r\n    case SIGUSR2:\r\n    {\r\n      result = str8_lit(\"SIGUSR2\");\r\n    }break;\r\n    case SIGVTALRM:\r\n    {\r\n      result = str8_lit(\"SIGVTALRM\");\r\n    }break;\r\n    case SIGXCPU:\r\n    {\r\n      result = str8_lit(\"SIGXCPU\");\r\n    }break;\r\n    case SIGXFSZ:\r\n    {\r\n      result = str8_lit(\"SIGXFSZ\");\r\n    }break;\r\n    case SIGWINCH:\r\n    {\r\n      result = str8_lit(\"SIGWINCH\");\r\n    }break;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal String8\r\nlnx_string_from_errno(int error_number){\r\n  String8 result = str8_lit(\"<unknown-errno>\");\r\n  switch (error_number){\r\n    case EPERM:\r\n    {\r\n      result = str8_lit(\"EPERM\");\r\n    }break;\r\n    case ENOENT:\r\n    {\r\n      result = str8_lit(\"ENOENT\");\r\n    }break;\r\n    case ESRCH:\r\n    {\r\n      result = str8_lit(\"ESRCH\");\r\n    }break;\r\n    case EINTR:\r\n    {\r\n      result = str8_lit(\"EINTR\");\r\n    }break;\r\n    case EIO:\r\n    {\r\n      result = str8_lit(\"EIO\");\r\n    }break;\r\n    case ENXIO:\r\n    {\r\n      result = str8_lit(\"ENXIO\");\r\n    }break;\r\n    case E2BIG:\r\n    {\r\n      result = str8_lit(\"E2BIG\");\r\n    }break;\r\n    case ENOEXEC:\r\n    {\r\n      result = str8_lit(\"ENOEXEC\");\r\n    }break;\r\n    case EBADF:\r\n    {\r\n      result = str8_lit(\"EBADF\");\r\n    }break;\r\n    case ECHILD:\r\n    {\r\n      result = str8_lit(\"ECHILD\");\r\n    }break;\r\n    case EAGAIN:\r\n    {\r\n      result = str8_lit(\"EAGAIN\");\r\n    }break;\r\n    case ENOMEM:\r\n    {\r\n      result = str8_lit(\"ENOMEM\");\r\n    }break;\r\n    case EACCES:\r\n    {\r\n      result = str8_lit(\"EACCES\");\r\n    }break;\r\n    case EFAULT:\r\n    {\r\n      result = str8_lit(\"EFAULT\");\r\n    }break;\r\n    case ENOTBLK:\r\n    {\r\n      result = str8_lit(\"ENOTBLK\");\r\n    }break;\r\n    case EBUSY:\r\n    {\r\n      result = str8_lit(\"EBUSY\");\r\n    }break;\r\n    case EEXIST:\r\n    {\r\n      result = str8_lit(\"EEXIST\");\r\n    }break;\r\n    case EXDEV:\r\n    {\r\n      result = str8_lit(\"EXDEV\");\r\n    }break;\r\n    case ENODEV:\r\n    {\r\n      result = str8_lit(\"ENODEV\");\r\n    }break;\r\n    case ENOTDIR:\r\n    {\r\n      result = str8_lit(\"ENOTDIR\");\r\n    }break;\r\n    case EISDIR:\r\n    {\r\n      result = str8_lit(\"EISDIR\");\r\n    }break;\r\n    case EINVAL:\r\n    {\r\n      result = str8_lit(\"EINVAL\");\r\n    }break;\r\n    case ENFILE:\r\n    {\r\n      result = str8_lit(\"ENFILE\");\r\n    }break;\r\n    case EMFILE:\r\n    {\r\n      result = str8_lit(\"EMFILE\");\r\n    }break;\r\n    case ENOTTY:\r\n    {\r\n      result = str8_lit(\"ENOTTY\");\r\n    }break;\r\n    case ETXTBSY:\r\n    {\r\n      result = str8_lit(\"ETXTBSY\");\r\n    }break;\r\n    case EFBIG:\r\n    {\r\n      result = str8_lit(\"EFBIG\");\r\n    }break;\r\n    case ENOSPC:\r\n    {\r\n      result = str8_lit(\"ENOSPC\");\r\n    }break;\r\n    case ESPIPE:\r\n    {\r\n      result = str8_lit(\"ESPIPE\");\r\n    }break;\r\n    case EROFS:\r\n    {\r\n      result = str8_lit(\"EROFS\");\r\n    }break;\r\n    case EMLINK:\r\n    {\r\n      result = str8_lit(\"EMLINK\");\r\n    }break;\r\n    case EPIPE:\r\n    {\r\n      result = str8_lit(\"EPIPE\");\r\n    }break;\r\n    case EDOM:\r\n    {\r\n      result = str8_lit(\"EDOM\");\r\n    }break;\r\n    case ERANGE:\r\n    {\r\n      result = str8_lit(\"ERANGE\");\r\n    }break;\r\n    case EDEADLK:\r\n    {\r\n      result = str8_lit(\"EDEADLK\");\r\n    }break;\r\n    case ENAMETOOLONG:\r\n    {\r\n      result = str8_lit(\"ENAMETOOLONG\");\r\n    }break;\r\n    case ENOLCK:\r\n    {\r\n      result = str8_lit(\"ENOLCK\");\r\n    }break;\r\n    case ENOSYS:\r\n    {\r\n      result = str8_lit(\"ENOSYS\");\r\n    }break;\r\n    case ENOTEMPTY:\r\n    {\r\n      result = str8_lit(\"ENOTEMPTY\");\r\n    }break;\r\n    case ELOOP:\r\n    {\r\n      result = str8_lit(\"ELOOP\");\r\n    }break;\r\n    case ENOMSG:\r\n    {\r\n      result = str8_lit(\"ENOMSG\");\r\n    }break;\r\n    case EIDRM:\r\n    {\r\n      result = str8_lit(\"EIDRM\");\r\n    }break;\r\n    case ECHRNG:\r\n    {\r\n      result = str8_lit(\"ECHRNG\");\r\n    }break;\r\n    case EL2NSYNC:\r\n    {\r\n      result = str8_lit(\"EL2NSYNC\");\r\n    }break;\r\n    case EL3HLT:\r\n    {\r\n      result = str8_lit(\"EL3HLT\");\r\n    }break;\r\n    case EL3RST:\r\n    {\r\n      result = str8_lit(\"EL3RST\");\r\n    }break;\r\n    case ELNRNG:\r\n    {\r\n      result = str8_lit(\"ELNRNG\");\r\n    }break;\r\n    case EUNATCH:\r\n    {\r\n      result = str8_lit(\"EUNATCH\");\r\n    }break;\r\n    case ENOCSI:\r\n    {\r\n      result = str8_lit(\"ENOCSI\");\r\n    }break;\r\n    case EL2HLT:\r\n    {\r\n      result = str8_lit(\"EL2HLT\");\r\n    }break;\r\n    case EBADE:\r\n    {\r\n      result = str8_lit(\"EBADE\");\r\n    }break;\r\n    case EBADR:\r\n    {\r\n      result = str8_lit(\"EBADR\");\r\n    }break;\r\n    case EXFULL:\r\n    {\r\n      result = str8_lit(\"EXFULL\");\r\n    }break;\r\n    case ENOANO:\r\n    {\r\n      result = str8_lit(\"ENOANO\");\r\n    }break;\r\n    case EBADRQC:\r\n    {\r\n      result = str8_lit(\"EBADRQC\");\r\n    }break;\r\n    case EBADSLT:\r\n    {\r\n      result = str8_lit(\"EBADSLT\");\r\n    }break;\r\n    case EBFONT:\r\n    {\r\n      result = str8_lit(\"EBFONT\");\r\n    }break;\r\n    case ENOSTR:\r\n    {\r\n      result = str8_lit(\"ENOSTR\");\r\n    }break;\r\n    case ENODATA:\r\n    {\r\n      result = str8_lit(\"ENODATA\");\r\n    }break;\r\n    case ETIME:\r\n    {\r\n      result = str8_lit(\"ETIME\");\r\n    }break;\r\n    case ENOSR:\r\n    {\r\n      result = str8_lit(\"ENOSR\");\r\n    }break;\r\n    case ENONET:\r\n    {\r\n      result = str8_lit(\"ENONET\");\r\n    }break;\r\n    case ENOPKG:\r\n    {\r\n      result = str8_lit(\"ENOPKG\");\r\n    }break;\r\n    case EREMOTE:\r\n    {\r\n      result = str8_lit(\"EREMOTE\");\r\n    }break;\r\n    case ENOLINK:\r\n    {\r\n      result = str8_lit(\"ENOLINK\");\r\n    }break;\r\n    case EADV:\r\n    {\r\n      result = str8_lit(\"EADV\");\r\n    }break;\r\n    case ESRMNT:\r\n    {\r\n      result = str8_lit(\"ESRMNT\");\r\n    }break;\r\n    case ECOMM:\r\n    {\r\n      result = str8_lit(\"ECOMM\");\r\n    }break;\r\n    case EPROTO:\r\n    {\r\n      result = str8_lit(\"EPROTO\");\r\n    }break;\r\n    case EMULTIHOP:\r\n    {\r\n      result = str8_lit(\"EMULTIHOP\");\r\n    }break;\r\n    case EDOTDOT:\r\n    {\r\n      result = str8_lit(\"EDOTDOT\");\r\n    }break;\r\n    case EBADMSG:\r\n    {\r\n      result = str8_lit(\"EBADMSG\");\r\n    }break;\r\n    case EOVERFLOW:\r\n    {\r\n      result = str8_lit(\"EOVERFLOW\");\r\n    }break;\r\n    case ENOTUNIQ:\r\n    {\r\n      result = str8_lit(\"ENOTUNIQ\");\r\n    }break;\r\n    case EBADFD:\r\n    {\r\n      result = str8_lit(\"EBADFD\");\r\n    }break;\r\n    case EREMCHG:\r\n    {\r\n      result = str8_lit(\"EREMCHG\");\r\n    }break;\r\n    case ELIBACC:\r\n    {\r\n      result = str8_lit(\"ELIBACC\");\r\n    }break;\r\n    case ELIBBAD:\r\n    {\r\n      result = str8_lit(\"ELIBBAD\");\r\n    }break;\r\n    case ELIBSCN:\r\n    {\r\n      result = str8_lit(\"ELIBSCN\");\r\n    }break;\r\n    case ELIBMAX:\r\n    {\r\n      result = str8_lit(\"ELIBMAX\");\r\n    }break;\r\n    case ELIBEXEC:\r\n    {\r\n      result = str8_lit(\"ELIBEXEC\");\r\n    }break;\r\n    case EILSEQ:\r\n    {\r\n      result = str8_lit(\"EILSEQ\");\r\n    }break;\r\n    case ERESTART:\r\n    {\r\n      result = str8_lit(\"ERESTART\");\r\n    }break;\r\n    case ESTRPIPE:\r\n    {\r\n      result = str8_lit(\"ESTRPIPE\");\r\n    }break;\r\n    case EUSERS:\r\n    {\r\n      result = str8_lit(\"EUSERS\");\r\n    }break;\r\n    case ENOTSOCK:\r\n    {\r\n      result = str8_lit(\"ENOTSOCK\");\r\n    }break;\r\n    case EDESTADDRREQ:\r\n    {\r\n      result = str8_lit(\"EDESTADDRREQ\");\r\n    }break;\r\n    case EMSGSIZE:\r\n    {\r\n      result = str8_lit(\"EMSGSIZE\");\r\n    }break;\r\n    case EPROTOTYPE:\r\n    {\r\n      result = str8_lit(\"EPROTOTYPE\");\r\n    }break;\r\n    case ENOPROTOOPT:\r\n    {\r\n      result = str8_lit(\"ENOPROTOOPT\");\r\n    }break;\r\n    case EPROTONOSUPPORT:\r\n    {\r\n      result = str8_lit(\"EPROTONOSUPPORT\");\r\n    }break;\r\n    case ESOCKTNOSUPPORT:\r\n    {\r\n      result = str8_lit(\"ESOCKTNOSUPPORT\");\r\n    }break;\r\n    case EOPNOTSUPP:\r\n    {\r\n      result = str8_lit(\"EOPNOTSUPP\");\r\n    }break;\r\n    case EPFNOSUPPORT:\r\n    {\r\n      result = str8_lit(\"EPFNOSUPPORT\");\r\n    }break;\r\n    case EAFNOSUPPORT:\r\n    {\r\n      result = str8_lit(\"EAFNOSUPPORT\");\r\n    }break;\r\n    case EADDRINUSE:\r\n    {\r\n      result = str8_lit(\"EADDRINUSE\");\r\n    }break;\r\n    case EADDRNOTAVAIL:\r\n    {\r\n      result = str8_lit(\"EADDRNOTAVAIL\");\r\n    }break;\r\n    case ENETDOWN:\r\n    {\r\n      result = str8_lit(\"ENETDOWN\");\r\n    }break;\r\n    case ENETUNREACH:\r\n    {\r\n      result = str8_lit(\"ENETUNREACH\");\r\n    }break;\r\n    case ENETRESET:\r\n    {\r\n      result = str8_lit(\"ENETRESET\");\r\n    }break;\r\n    case ECONNABORTED:\r\n    {\r\n      result = str8_lit(\"ECONNABORTED\");\r\n    }break;\r\n    case ECONNRESET:\r\n    {\r\n      result = str8_lit(\"ECONNRESET\");\r\n    }break;\r\n    case ENOBUFS:\r\n    {\r\n      result = str8_lit(\"ENOBUFS\");\r\n    }break;\r\n    case EISCONN:\r\n    {\r\n      result = str8_lit(\"EISCONN\");\r\n    }break;\r\n    case ENOTCONN:\r\n    {\r\n      result = str8_lit(\"ENOTCONN\");\r\n    }break;\r\n    case ESHUTDOWN:\r\n    {\r\n      result = str8_lit(\"ESHUTDOWN\");\r\n    }break;\r\n    case ETOOMANYREFS:\r\n    {\r\n      result = str8_lit(\"ETOOMANYREFS\");\r\n    }break;\r\n    case ETIMEDOUT:\r\n    {\r\n      result = str8_lit(\"ETIMEDOUT\");\r\n    }break;\r\n    case ECONNREFUSED:\r\n    {\r\n      result = str8_lit(\"ECONNREFUSED\");\r\n    }break;\r\n    case EHOSTDOWN:\r\n    {\r\n      result = str8_lit(\"EHOSTDOWN\");\r\n    }break;\r\n    case EHOSTUNREACH:\r\n    {\r\n      result = str8_lit(\"EHOSTUNREACH\");\r\n    }break;\r\n    case EALREADY:\r\n    {\r\n      result = str8_lit(\"EALREADY\");\r\n    }break;\r\n    case EINPROGRESS:\r\n    {\r\n      result = str8_lit(\"EINPROGRESS\");\r\n    }break;\r\n    case ESTALE:\r\n    {\r\n      result = str8_lit(\"ESTALE\");\r\n    }break;\r\n    case EUCLEAN:\r\n    {\r\n      result = str8_lit(\"EUCLEAN\");\r\n    }break;\r\n    case ENOTNAM:\r\n    {\r\n      result = str8_lit(\"ENOTNAM\");\r\n    }break;\r\n    case ENAVAIL:\r\n    {\r\n      result = str8_lit(\"ENAVAIL\");\r\n    }break;\r\n    case EISNAM:\r\n    {\r\n      result = str8_lit(\"EISNAM\");\r\n    }break;\r\n    case EREMOTEIO:\r\n    {\r\n      result = str8_lit(\"EREMOTEIO\");\r\n    }break;\r\n    case EDQUOT:\r\n    {\r\n      result = str8_lit(\"EDQUOT\");\r\n    }break;\r\n    case ENOMEDIUM:\r\n    {\r\n      result = str8_lit(\"ENOMEDIUM\");\r\n    }break;\r\n    case EMEDIUMTYPE:\r\n    {\r\n      result = str8_lit(\"EMEDIUMTYPE\");\r\n    }break;\r\n    case ECANCELED:\r\n    {\r\n      result = str8_lit(\"ECANCELED\");\r\n    }break;\r\n    case ENOKEY:\r\n    {\r\n      result = str8_lit(\"ENOKEY\");\r\n    }break;\r\n    case EKEYEXPIRED:\r\n    {\r\n      result = str8_lit(\"EKEYEXPIRED\");\r\n    }break;\r\n    case EKEYREVOKED:\r\n    {\r\n      result = str8_lit(\"EKEYREVOKED\");\r\n    }break;\r\n    case EKEYREJECTED:\r\n    {\r\n      result = str8_lit(\"EKEYREJECTED\");\r\n    }break;\r\n    case EOWNERDEAD:\r\n    {\r\n      result = str8_lit(\"EOWNERDEAD\");\r\n    }break;\r\n    case ENOTRECOVERABLE:\r\n    {\r\n      result = str8_lit(\"ENOTRECOVERABLE\");\r\n    }break;\r\n    case ERFKILL:\r\n    {\r\n      result = str8_lit(\"ERFKILL\");\r\n    }break;\r\n    case EHWPOISON:\r\n    {\r\n      result = str8_lit(\"EHWPOISON\");\r\n    }break;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal LNX_Entity*\r\nlnx_alloc_entity(LNX_EntityKind kind){\r\n  pthread_mutex_lock(&lnx_mutex);\r\n  LNX_Entity *result = lnx_entity_free;\r\n  Assert(result != 0);\r\n  SLLStackPop(lnx_entity_free);\r\n  pthread_mutex_unlock(&lnx_mutex);\r\n  result->kind = kind;\r\n  return(result);\r\n}\r\n\r\ninternal void\r\nlnx_free_entity(LNX_Entity *entity){\r\n  entity->kind = LNX_EntityKind_Null;\r\n  pthread_mutex_lock(&lnx_mutex);\r\n  SLLStackPush(lnx_entity_free, entity);\r\n  pthread_mutex_unlock(&lnx_mutex);\r\n}\r\n\r\ninternal void*\r\nlnx_thread_base(void *ptr){\r\n  LNX_Entity *entity = (LNX_Entity*)ptr;\r\n  ThreadEntryPointFunctionType *func = entity->thread.func;\r\n  void *thread_ptr = entity->thread.ptr;\r\n  \r\n  TCTX tctx_;\r\n  tctx_init_and_equip(&tctx_);\r\n  func(thread_ptr);\r\n  tctx_release();\r\n  \r\n  // remove my bit\r\n  U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x2);\r\n  // if the other bit is also gone, free entity\r\n  if ((result & 0x1) == 0){\r\n    lnx_free_entity(entity);\r\n  }\r\n  return(0);\r\n}\r\n\r\ninternal void\r\nlnx_safe_call_sig_handler(int){\r\n  LNX_SafeCallChain *chain = lnx_safe_call_chain;\r\n  if (chain != 0 && chain->fail_handler != 0){\r\n    chain->fail_handler(chain->ptr);\r\n  }\r\n  abort();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)\r\n\r\ninternal void\r\nos_init(void)\r\n{\r\n  // NOTE(allen): Initialize linux layer mutex\r\n  {\r\n    pthread_mutexattr_t attr;\r\n    pthread_mutexattr_init(&attr);\r\n    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\r\n    int pthread_result = pthread_mutex_init(&lnx_mutex, &attr);\r\n    pthread_mutexattr_destroy(&attr);\r\n    if (pthread_result == -1){\r\n      abort();\r\n    }\r\n  }\r\n  MemoryZeroArray(lnx_entity_buffer);\r\n  {\r\n    LNX_Entity *ptr = lnx_entity_free = lnx_entity_buffer;\r\n    for (U64 i = 1; i < ArrayCount(lnx_entity_buffer); i += 1, ptr += 1){\r\n      ptr->next = ptr + 1;\r\n    }\r\n    ptr->next = 0;\r\n  }\r\n  \r\n  // NOTE(allen): Permanent memory allocator for this layer\r\n  Arena *perm_arena = arena_alloc();\r\n  lnx_perm_arena = perm_arena;\r\n  \r\n  // NOTE(allen): Initialize Paths\r\n  lnx_initial_path = os_get_path(lnx_perm_arena, OS_SystemPath_Current);\r\n  \r\n  // NOTE(rjf): Setup command line args\r\n  lnx_cmd_line_args = os_string_list_from_argcv(lnx_perm_arena, argc, argv);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\ninternal void*\r\nos_reserve(U64 size){\r\n  void *result = mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\nos_commit(void *ptr, U64 size){\r\n  mprotect(ptr, size, PROT_READ|PROT_WRITE);\r\n  // TODO(allen): can we test this?\r\n  return(true);\r\n}\r\n\r\ninternal void*\r\nos_reserve_large(U64 size){\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\nos_commit_large(void *ptr, U64 size){\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_decommit(void *ptr, U64 size){\r\n  madvise(ptr, size, MADV_DONTNEED);\r\n  mprotect(ptr, size, PROT_NONE);\r\n}\r\n\r\ninternal void\r\nos_release(void *ptr, U64 size){\r\n  munmap(ptr, size);\r\n}\r\n\r\ninternal void\r\nos_set_large_pages_enabled(B32 flag)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal B32\r\nos_large_pages_enabled(void)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\nos_large_page_size(void)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System Info (Implemented Per-OS)\r\n\r\ninternal String8\r\nos_machine_name(void){\r\n  local_persist B32 first = true;\r\n  local_persist String8 name = {0};\r\n  \r\n  // TODO(allen): let's just pre-compute this at init and skip the complexity\r\n  pthread_mutex_lock(&lnx_mutex);\r\n  if (first){\r\n    Temp scratch = scratch_begin(0, 0);\r\n    first = false;\r\n    \r\n    // get name\r\n    B32 got_final_result = false;\r\n    U8 *buffer = 0;\r\n    int size = 0;\r\n    for (S64 cap = 4096, r = 0;\r\n         r < 4;\r\n         cap *= 2, r += 1){\r\n      scratch.restore();\r\n      buffer = push_array_no_zero(scratch.arena, U8, cap);\r\n      size = gethostname((char*)buffer, cap);\r\n      if (size < cap){\r\n        got_final_result = true;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // save string\r\n    if (got_final_result && size > 0){\r\n      name.size = size;\r\n      name.str = push_array_no_zero(lnx_perm_arena, U8, name.size + 1);\r\n      MemoryCopy(name.str, buffer, name.size);\r\n      name.str[name.size] = 0;\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  pthread_mutex_unlock(&lnx_mutex);\r\n  \r\n  return(name);\r\n}\r\n\r\ninternal U64\r\nos_page_size(void){\r\n  int size = getpagesize();\r\n  return((U64)size);\r\n}\r\n\r\ninternal U64\r\nos_allocation_granularity(void)\r\n{\r\n  // On linux there is no equivalent of \"dwAllocationGranularity\"\r\n  os_page_size();\r\n}\r\n\r\ninternal U64\r\nos_logical_core_count(void)\r\n{\r\n  // TODO(rjf): check this\r\n  return get_nprocs();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Process & Thread Info (Implemented Per-OS)\r\n\r\ninternal String8List\r\nos_get_command_line_arguments(void)\r\n{\r\n  return lnx_cmd_line_args;\r\n}\r\n\r\ninternal S32\r\nos_pid(void){\r\n  S32 result = getpid();\r\n  return(result);\r\n}\r\n\r\ninternal S32\r\nos_tid(void){\r\n  S32 result = 0;\r\n#ifdef SYS_gettid\r\n  result = syscall(SYS_gettid);\r\n#else\r\n  result = gettid();\r\n#endif\r\n  return(result);\r\n}\r\n\r\ninternal String8List\r\nos_environment(void)\r\n{\r\n  NotImplemented;\r\n  String8List result = {0};\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nos_string_list_from_system_path(Arena *arena, OS_SystemPath path, String8List *out){\r\n  U64 result = 0;\r\n  \r\n  switch (path){\r\n    case OS_SystemPath_Binary:\r\n    {\r\n      local_persist B32 first = true;\r\n      local_persist String8 name = {0};\r\n      \r\n      // TODO(allen): let's just pre-compute this at init and skip the complexity\r\n      pthread_mutex_lock(&lnx_mutex);\r\n      if (first){\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        first = false;\r\n        \r\n        // get self string\r\n        B32 got_final_result = false;\r\n        U8 *buffer = 0;\r\n        int size = 0;\r\n        for (S64 cap = PATH_MAX, r = 0;\r\n             r < 4;\r\n             cap *= 2, r += 1){\r\n          scratch.restore();\r\n          buffer = push_array_no_zero(scratch.arena, U8, cap);\r\n          size = readlink(\"/proc/self/exe\", (char*)buffer, cap);\r\n          if (size < cap){\r\n            got_final_result = true;\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // save string\r\n        if (got_final_result && size > 0){\r\n          String8 full_name = str8(buffer, size);\r\n          String8 name_chopped = string_path_chop_last_slash(full_name);\r\n          name = push_str8_copy(lnx_perm_arena, name_chopped);\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n      pthread_mutex_unlock(&lnx_mutex);\r\n      \r\n      result = 1;\r\n      str8_list_push(arena, out, name);\r\n    }break;\r\n    \r\n    case OS_SystemPath_Initial:\r\n    {\r\n      Assert(lnx_initial_path.str != 0);\r\n      result = 1;\r\n      str8_list_push(arena, out, lnx_initial_path);\r\n    }break;\r\n    \r\n    case OS_SystemPath_Current:\r\n    {\r\n      char *cwdir = getcwd(0, 0);\r\n      String8 string = push_str8_copy(arena, str8_cstring(cwdir));\r\n      free(cwdir);\r\n      result = 1;\r\n      str8_list_push(arena, out, string);\r\n    }break;\r\n    \r\n    case OS_SystemPath_UserProgramData:\r\n    {\r\n      char *home = getenv(\"HOME\");\r\n      String8 string = str8_cstring(home);\r\n      result = 1;\r\n      str8_list_push(arena, out, string);\r\n    }break;\r\n    \r\n    case OS_SystemPath_ModuleLoad:\r\n    {\r\n      // TODO(allen): this one is big and complicated and only needed for making\r\n      // a debugger, skipping for now.\r\n      NotImplemented;\r\n    }break;\r\n  }\r\n  \r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Process Control (Implemented Per-OS)\r\n\r\ninternal void\r\nos_abort(S32 exit_code){\r\n  exit(exit_code);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\n\r\ninternal OS_Handle\r\nos_file_open(OS_AccessFlags flags, String8 path)\r\n{\r\n  OS_Handle file = {0};\r\n  NotImplemented;\r\n  return file;\r\n}\r\n\r\ninternal void\r\nos_file_close(OS_Handle file)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal U64\r\nos_file_read(OS_Handle file, Rng1U64 rng, void *out_data)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal U64\r\nos_file_write(OS_Handle file, Rng1U64 rng, void *data)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal B32\r\nos_file_set_times(OS_Handle file, DateTime time)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file(OS_Handle file)\r\n{\r\n  FileProperties props = {0};\r\n  NotImplemented;\r\n  return props;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file(OS_Handle file)\r\n{\r\n  // TODO(nick): querry struct stat with fstat(2) and use st_dev and st_ino as ids\r\n  OS_FileID id = {0};\r\n  NotImplemented;\r\n  return id;\r\n}\r\n\r\ninternal B32\r\nos_delete_file_at_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = false;\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  if (remove((char*)name_copy.str) != -1){\r\n    result = true;\r\n  }\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\nos_copy_file_path(String8 dst, String8 src)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal String8\r\nos_full_path_from_path(Arena *arena, String8 path)\r\n{\r\n  // TODO: realpath can be used to resolve full path\r\n  String8 result = {0};\r\n  NotImplemented;\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_file_path_exists(String8 path)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file_path(String8 path)\r\n{\r\n  FileProperties props = {0};\r\n  NotImplemented;\r\n  return props;\r\n}\r\n\r\n//- rjf: file maps\r\n\r\ninternal OS_Handle\r\nos_file_map_open(OS_AccessFlags flags, OS_Handle file)\r\n{\r\n  NotImplemented;\r\n  OS_Handle handle = {0};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_file_map_close(OS_Handle map)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void *\r\nos_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n//- rjf: directory iteration\r\n\r\ninternal OS_FileIter *\r\nos_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\nos_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_file_iter_end(OS_FileIter *iter)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n//- rjf: directory creation\r\n\r\ninternal B32\r\nos_make_directory(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = false;\r\n  String8 name_copy = push_str8_copy(scratch.arena, name);\r\n  if (mkdir((char*)name_copy.str, 0777) != -1){\r\n    result = true;\r\n  }\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_shared_memory_alloc(U64 size, String8 name)\r\n{\r\n  OS_Handle result = {0};\r\n  NotImplemented;\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_shared_memory_open(String8 name)\r\n{\r\n  OS_Handle result = {0};\r\n  NotImplemented;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_close(OS_Handle handle)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void *\r\nos_shared_memory_view_open(OS_Handle handle, Rng1U64 range)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U32\r\nos_now_unix(void)\r\n{\r\n  time_t t = time(0);\r\n  return (U32)t;\r\n}\r\n\r\ninternal DateTime\r\nos_now_universal_time(void){\r\n  time_t t = 0;\r\n  time(&t);\r\n  struct tm universal_tm = {0};\r\n  gmtime_r(&t, &universal_tm);\r\n  DateTime result = {0};\r\n  lnx_date_time_from_tm(&result, &universal_tm, 0);\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\nos_universal_time_from_local(DateTime *local_time){\r\n  // local time -> universal time (using whatever types it takes)\r\n  struct tm local_tm = {0};\r\n  lnx_tm_from_date_time(&local_tm, local_time);\r\n  local_tm.tm_isdst = -1;\r\n  time_t universal_t = mktime(&local_tm);\r\n  \r\n  // whatever type we ended up with -> DateTime (don't alter the space along the way)\r\n  struct tm universal_tm = {0};\r\n  gmtime_r(&universal_t, &universal_tm);\r\n  DateTime result = {0};\r\n  lnx_date_time_from_tm(&result, &universal_tm, 0);\r\n  return(result);\r\n}\r\n\r\ninternal DateTime\r\nos_local_time_from_universal(DateTime *universal_time){\r\n  // universal time -> local time (using whatever types it takes)\r\n  struct tm universal_tm = {0};\r\n  lnx_tm_from_date_time(&universal_tm, universal_time);\r\n  universal_tm.tm_isdst = -1;\r\n  time_t universal_t = timegm(&universal_tm);\r\n  struct tm local_tm = {0};\r\n  localtime_r(&universal_t, &local_tm);\r\n  \r\n  // whatever type we ended up with -> DateTime (don't alter the space along the way)\r\n  DateTime result = {0};\r\n  lnx_date_time_from_tm(&result, &local_tm, 0);\r\n  return(result);\r\n}\r\n\r\ninternal U64\r\nos_now_microseconds(void){\r\n  struct timespec t;\r\n  clock_gettime(CLOCK_MONOTONIC, &t);\r\n  U64 result = t.tv_sec*Million(1) + (t.tv_nsec/Thousand(1));\r\n  return(result);\r\n}\r\n\r\ninternal void\r\nos_sleep_milliseconds(U32 msec){\r\n  usleep(msec*Thousand(1));\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal B32\r\nos_launch_process(OS_LaunchOptions *options){\r\n  // TODO(allen): I want to redo this API before I bother implementing it here\r\n  NotImplemented;\r\n  return(false);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_thread_launch(ThreadEntryPointFunctionType *func, void *ptr, void *params){\r\n  // entity\r\n  LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Thread);\r\n  entity->reference_mask = 0x3;\r\n  entity->thread.func = func;\r\n  entity->thread.ptr = ptr;\r\n  \r\n  // pthread\r\n  pthread_attr_t attr;\r\n  pthread_attr_init(&attr);\r\n  int pthread_result = pthread_create(&entity->thread.handle, &attr, lnx_thread_base, entity);\r\n  pthread_attr_destroy(&attr);\r\n  if (pthread_result == -1){\r\n    lnx_free_entity(entity);\r\n    entity = 0;\r\n  }\r\n  \r\n  // cast to opaque handle\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return(result);\r\n}\r\n\r\ninternal void\r\nos_release_thread_handle(OS_Handle thread){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(thread.id);\r\n  // remove my bit\r\n  U32 result = __sync_fetch_and_and(&entity->reference_mask, ~0x1);\r\n  // if the other bit is also gone, free entity\r\n  if ((result & 0x2) == 0){\r\n    lnx_free_entity(entity);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n// NOTE(allen): Mutexes are recursive - support counted acquire/release nesting\r\n// on a single thread\r\n\r\n//- rjf: recursive mutexes\r\n\r\ninternal OS_Handle\r\nos_mutex_alloc(void){\r\n  // entity\r\n  LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_Mutex);\r\n  \r\n  // pthread\r\n  pthread_mutexattr_t attr;\r\n  pthread_mutexattr_init(&attr);\r\n  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);\r\n  int pthread_result = pthread_mutex_init(&entity->mutex, &attr);\r\n  pthread_mutexattr_destroy(&attr);\r\n  if (pthread_result == -1){\r\n    lnx_free_entity(entity);\r\n    entity = 0;\r\n  }\r\n  \r\n  // cast to opaque handle\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return(result);\r\n}\r\n\r\ninternal void\r\nos_mutex_release(OS_Handle mutex){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id);\r\n  pthread_mutex_destroy(&entity->mutex);\r\n  lnx_free_entity(entity);\r\n}\r\n\r\ninternal void\r\nos_mutex_take_(OS_Handle mutex){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id);\r\n  pthread_mutex_lock(&entity->mutex);\r\n}\r\n\r\ninternal void\r\nos_mutex_drop_(OS_Handle mutex){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(mutex.id);\r\n  pthread_mutex_unlock(&entity->mutex);\r\n}\r\n\r\n//- rjf: reader/writer mutexes\r\n\r\ninternal OS_Handle\r\nos_rw_mutex_alloc(void)\r\n{\r\n  OS_Handle result = {0};\r\n  NotImplemented;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_release(OS_Handle rw_mutex)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take_r_(OS_Handle mutex)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop_r_(OS_Handle mutex)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take_w_(OS_Handle mutex)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop_w_(OS_Handle mutex)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n//- rjf: condition variables\r\n\r\ninternal OS_Handle\r\nos_cond_var_alloc(void){\r\n  // entity\r\n  LNX_Entity *entity = lnx_alloc_entity(LNX_EntityKind_ConditionVariable);\r\n  \r\n  // pthread\r\n  pthread_condattr_t attr;\r\n  pthread_condattr_init(&attr);\r\n  int pthread_result = pthread_cond_init(&entity->cond, &attr);\r\n  pthread_condattr_destroy(&attr);\r\n  if (pthread_result == -1){\r\n    lnx_free_entity(entity);\r\n    entity = 0;\r\n  }\r\n  \r\n  // cast to opaque handle\r\n  OS_Handle result = {IntFromPtr(entity)};\r\n  return(result);\r\n}\r\n\r\ninternal void\r\nos_cond_var_release(OS_Handle cv){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id);\r\n  pthread_cond_destroy(&entity->cond);\r\n  lnx_free_entity(entity);\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_(OS_Handle cv, OS_Handle mutex, U64 endt_us){\r\n  B32 result = false;\r\n  LNX_Entity *entity_cond = (LNX_Entity*)PtrFromInt(cv.id);\r\n  LNX_Entity *entity_mutex = (LNX_Entity*)PtrFromInt(mutex.id);\r\n  // TODO(allen): implement the time control\r\n  pthread_cond_timedwait(&entity_cond->cond, &entity_mutex->mutex);\r\n  return(result);\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_rw_r_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\nos_condition_variable_wait_rw_w_(OS_Handle cv, OS_Handle mutex_rw, U64 endt_us)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_condition_variable_signal_(OS_Handle cv){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id);\r\n  pthread_cond_signal(&entity->cond);\r\n}\r\n\r\ninternal void\r\nos_condition_variable_broadcast_(OS_Handle cv){\r\n  LNX_Entity *entity = (LNX_Entity*)PtrFromInt(cv.id);\r\n  DontCompile;\r\n}\r\n\r\n//- rjf: cross-process semaphores\r\n\r\ninternal OS_Handle\r\nos_semaphore_alloc(U32 initial_count, U32 max_count, String8 name)\r\n{\r\n  OS_Handle result = {0};\r\n  NotImplemented;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_release(OS_Handle semaphore)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal OS_Handle\r\nos_semaphore_open(String8 name)\r\n{\r\n  OS_Handle result = {0};\r\n  NotImplemented;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_close(OS_Handle semaphore)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\ninternal B32\r\nos_semaphore_take(OS_Handle semaphore, U64 endt_us)\r\n{\r\n  NotImplemented;\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_semaphore_drop(OS_Handle semaphore)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_library_open(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  char *path_cstr = (char *)push_str8_copy(scratch.arena, path).str;\r\n  void *so = dlopen(path_cstr, RTLD_LAZY);\r\n  OS_Handle lib = { (U64)so };\r\n  scratch_end(scratch);\r\n  return lib;\r\n}\r\n\r\ninternal VoidProc *\r\nos_library_load_proc(OS_Handle lib, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  void *so = (void *)lib.id;\r\n  char *name_cstr = (char *)push_str8_copy(scratch.arena, name).str;\r\n  VoidProc *proc = (VoidProc *)dlsym(so, name_cstr);\r\n  scratch_end(scratch);\r\n  return proc;\r\n}\r\n\r\ninternal void\r\nos_library_close(OS_Handle lib)\r\n{\r\n  void *so = (void *)lib.id;\r\n  dlclose(so);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal void\r\nos_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr){\r\n  LNX_SafeCallChain chain = {0};\r\n  SLLStackPush(lnx_safe_call_chain, &chain);\r\n  chain.fail_handler = fail_handler;\r\n  chain.ptr = ptr;\r\n  \r\n  struct sigaction new_act = {0};\r\n  new_act.sa_handler = lnx_safe_call_sig_handler;\r\n  \r\n  int signals_to_handle[] = {\r\n    SIGILL, SIGFPE, SIGSEGV, SIGBUS, SIGTRAP,\r\n  };\r\n  struct sigaction og_act[ArrayCount(signals_to_handle)] = {0};\r\n  \r\n  for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){\r\n    sigaction(signals_to_handle[i], &new_act, &og_act[i]);\r\n  }\r\n  \r\n  func(ptr);\r\n  \r\n  for (U32 i = 0; i < ArrayCount(signals_to_handle); i += 1){\r\n    sigaction(signals_to_handle[i], &og_act[i], 0);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal OS_Guid\r\nos_make_guid(void)\r\n{\r\n  NotImplemented;\r\n}\r\n\r\n"
  },
  {
    "path": "src/os/core/linux/os_core_linux_old.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef LINUX_H\r\n#define LINUX_H\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Get all these linux includes\r\n\r\n#include <stdlib.h>\r\n#include <sys/mman.h>\r\n#include <sys/types.h>\r\n#include <sys/stat.h>\r\n#include <unistd.h>\r\n#include <fcntl.h>\r\n#include <linux/limits.h>\r\n#include <time.h>\r\n#include <dirent.h>\r\n#include <pthread.h>\r\n#include <sys/syscall.h>\r\n#include <signal.h>\r\n#include <errno.h>\r\n#include <dlfcn.h>\r\n#include <sys/sysinfo.h>\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): File Iterator\r\n\r\nstruct LNX_FileIter{\r\n  int fd;\r\n  DIR *dir;\r\n};\r\nStaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(LNX_FileIter), file_iter_memory_size);\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Threading Entities\r\n\r\nenum LNX_EntityKind{\r\n  LNX_EntityKind_Null,\r\n  LNX_EntityKind_Thread,\r\n  LNX_EntityKind_Mutex,\r\n  LNX_EntityKind_ConditionVariable,\r\n};\r\n\r\nstruct LNX_Entity{\r\n  LNX_Entity *next;\r\n  LNX_EntityKind kind;\r\n  volatile U32 reference_mask;\r\n  union{\r\n    struct{\r\n      ThreadEntryPointFunctionType *func;\r\n      void *ptr;\r\n      pthread_t handle;\r\n    } thread;\r\n    pthread_mutex_t mutex;\r\n    pthread_cond_t cond;\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Safe Call Chain\r\n\r\nstruct LNX_SafeCallChain{\r\n  LNX_SafeCallChain *next;\r\n  ThreadEntryPointFunctionType *fail_handler;\r\n  void *ptr;\r\n};\r\n\r\n////////////////////////////////\r\n//~ NOTE(allen): Helpers\r\n\r\ninternal B32 lnx_write_list_to_file_descriptor(int fd, String8List list);\r\n\r\ninternal void lnx_date_time_from_tm(DateTime *out, struct tm *in, U32 msec);\r\ninternal void lnx_tm_from_date_time(struct tm *out, DateTime *in);\r\ninternal void lnx_dense_time_from_timespec(DenseTime *out, struct timespec *in);\r\ninternal void lnx_file_properties_from_stat(FileProperties *out, struct stat *in);\r\n\r\ninternal String8 lnx_string_from_signal(int signum);\r\ninternal String8 lnx_string_from_errno(int error_number);\r\n\r\ninternal LNX_Entity* lnx_alloc_entity(LNX_EntityKind kind);\r\ninternal void lnx_free_entity(LNX_Entity *entity);\r\ninternal void* lnx_thread_base(void *ptr);\r\n\r\ninternal void lnx_safe_call_sig_handler(int);\r\n\r\n#endif //LINUX_H\r\n"
  },
  {
    "path": "src/os/core/os_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type Functions (Helpers, Implemented Once)\r\n\r\ninternal OS_Handle\r\nos_handle_zero(void)\r\n{\r\n  OS_Handle handle = {0};\r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nos_handle_match(OS_Handle a, OS_Handle b)\r\n{\r\n  return a.u64[0] == b.u64[0];\r\n}\r\n\r\ninternal void\r\nos_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle)\r\n{\r\n  OS_HandleNode *n = push_array(arena, OS_HandleNode, 1);\r\n  n->v = handle;\r\n  SLLQueuePush(handles->first, handles->last, n);\r\n  handles->count += 1;\r\n}\r\n\r\ninternal OS_HandleArray\r\nos_handle_array_from_list(Arena *arena, OS_HandleList *list)\r\n{\r\n  OS_HandleArray result = {0};\r\n  result.count = list->count;\r\n  result.v = push_array_no_zero(arena, OS_Handle, result.count);\r\n  U64 idx = 0;\r\n  for(OS_HandleNode *n = list->first; n != 0; n = n->next, idx += 1)\r\n  {\r\n    result.v[idx] = n->v;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Filesystem Helpers (Helpers, Implemented Once)\r\n\r\ninternal String8\r\nos_data_from_file_path(Arena *arena, String8 path)\r\n{\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);\r\n  FileProperties props = os_properties_from_file(file);\r\n  String8 data = os_string_from_file_range(arena, file, r1u64(0, props.size));\r\n  os_file_close(file);\r\n  return data;\r\n}\r\n\r\ninternal B32\r\nos_write_data_to_file_path(String8 path, String8 data)\r\n{\r\n  B32 good = 0;\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Write, path);\r\n  if(!os_handle_match(file, os_handle_zero()))\r\n  {\r\n    U64 bytes_written = os_file_write(file, r1u64(0, data.size), data.str);\r\n    good = (bytes_written == data.size);\r\n    os_file_close(file);\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal B32\r\nos_write_data_list_to_file_path(String8 path, String8List list)\r\n{\r\n  B32 good = 0;\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Write, path);\r\n  if(!os_handle_match(file, os_handle_zero()))\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    U64 write_buffer_size = KB(64);\r\n    U8 *write_buffer = push_array_no_zero(scratch.arena, U8, write_buffer_size);\r\n    U64 write_buffer_write_pos = 0;\r\n    U64 write_buffer_read_pos = 0;\r\n    U64 file_off = 0;\r\n    {\r\n      for(String8Node *n = list.first; n != 0; n = n->next)\r\n      {\r\n        for(U64 n_off = 0; n_off < n->string.size;)\r\n        {\r\n          U64 write_buffer_unconsumed_size = (write_buffer_write_pos - write_buffer_read_pos);\r\n          U64 write_buffer_available_size = (write_buffer_size - write_buffer_unconsumed_size);\r\n          if(write_buffer_available_size == 0)\r\n          {\r\n            U64 file_write_size = os_file_write(file, r1u64(file_off, file_off+write_buffer_size), write_buffer);\r\n            if(file_write_size != write_buffer_size)\r\n            {\r\n              goto dbl_break;\r\n            }\r\n            file_off += write_buffer_size;\r\n            write_buffer_read_pos += write_buffer_size;\r\n          }\r\n          else\r\n          {\r\n            U64 bytes_to_copy = Min(write_buffer_available_size, n->string.size - n_off);\r\n            write_buffer_write_pos += ring_write(write_buffer, write_buffer_size, write_buffer_write_pos, n->string.str + n_off, bytes_to_copy);\r\n            n_off += bytes_to_copy;\r\n          }\r\n        }\r\n      }\r\n      if(write_buffer_write_pos > write_buffer_read_pos)\r\n      {\r\n        U64 file_write_size = os_file_write(file, r1u64(file_off, file_off + (write_buffer_write_pos-write_buffer_read_pos)), write_buffer);\r\n        file_off += file_write_size;\r\n      }\r\n    }\r\n    dbl_break:;\r\n    good = (file_off == list.total_size);\r\n    os_file_close(file);\r\n    scratch_end(scratch);\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal B32\r\nos_append_data_to_file_path(String8 path, String8 data)\r\n{\r\n  B32 good = 0;\r\n  if(data.size != 0)\r\n  {\r\n    OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append, path);\r\n    if(!os_handle_match(file, os_handle_zero()))\r\n    {\r\n      U64 pos = os_properties_from_file(file).size;\r\n      U64 bytes_written = os_file_write(file, r1u64(pos, pos+data.size), data.str);\r\n      good = (bytes_written == data.size);\r\n      os_file_close(file);\r\n    }\r\n  }\r\n  return good;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file_path(String8 path)\r\n{\r\n  OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, path);\r\n  OS_FileID id = os_id_from_file(file);\r\n  os_file_close(file);\r\n  return id;\r\n}\r\n\r\ninternal S64\r\nos_file_id_compare(OS_FileID a, OS_FileID b)\r\n{\r\n  S64 cmp = MemoryCompare((void*)&a.v[0], (void*)&b.v[0], sizeof(a.v));\r\n  return cmp;\r\n}\r\n\r\ninternal String8\r\nos_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range)\r\n{\r\n  U64 pre_pos = arena_pos(arena);\r\n  String8 result;\r\n  result.size = dim_1u64(range);\r\n  result.str = push_array_no_zero(arena, U8, result.size);\r\n  U64 actual_read_size = os_file_read(file, range, result.str);\r\n  if(actual_read_size < result.size)\r\n  {\r\n    arena_pop_to(arena, pre_pos + actual_read_size);\r\n    result.size = actual_read_size;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nos_file_read_cstring(Arena *arena, OS_Handle file, U64 off)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List block_list = {0};\r\n  for(U64 cursor = off, stride = 256;; cursor += stride)\r\n  {\r\n    U8      *raw_block = push_array_no_zero(scratch.arena, U8, stride);\r\n    U64      read_size = os_file_read(file, r1u64(cursor, cursor + stride), raw_block);\r\n    String8  block     = str8_cstring_capped(raw_block, raw_block+read_size);\r\n    str8_list_push(scratch.arena, &block_list, block);\r\n    if(read_size != stride || (block.size+1 <= read_size && block.str[block.size] == 0))\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &block_list, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Launcher Helpers\r\n\r\ninternal OS_Handle\r\nos_cmd_line_launch(String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U8 split_chars[] = {' '};\r\n  String8List parts = str8_split(scratch.arena, string, split_chars, ArrayCount(split_chars), 0);\r\n  OS_Handle handle = {0};\r\n  if(parts.node_count != 0)\r\n  {\r\n    // rjf: unpack exe part\r\n    String8 exe = parts.first->string;\r\n    String8 exe_folder = str8_chop_last_slash(exe);\r\n    if(exe_folder.size == 0)\r\n    {\r\n      exe_folder = os_get_current_path(scratch.arena);\r\n    }\r\n    \r\n    // rjf: find stdout delimiter\r\n    String8Node *stdout_delimiter_n = 0;\r\n    for(String8Node *n = parts.first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->string, str8_lit(\">\"), 0))\r\n      {\r\n        stdout_delimiter_n = n;\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: read stdout path\r\n    String8 stdout_path = {0};\r\n    if(stdout_delimiter_n && stdout_delimiter_n->next)\r\n    {\r\n      stdout_path = stdout_delimiter_n->next->string;\r\n    }\r\n    \r\n    // rjf: open stdout handle\r\n    OS_Handle stdout_handle = {0};\r\n    if(stdout_path.size != 0)\r\n    {\r\n      OS_Handle file = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Read, stdout_path);\r\n      os_file_close(file);\r\n      stdout_handle = os_file_open(OS_AccessFlag_Write|OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, stdout_path);\r\n    }\r\n    \r\n    // rjf: form command line\r\n    String8List cmdline = {0};\r\n    for(String8Node *n = parts.first; n != stdout_delimiter_n && n != 0; n = n->next)\r\n    {\r\n      str8_list_push(scratch.arena, &cmdline, n->string);\r\n    }\r\n    \r\n    // rjf: launch\r\n    OS_ProcessLaunchParams params = {0};\r\n    params.cmd_line = cmdline;\r\n    params.path = exe_folder;\r\n    params.inherit_env = 1;\r\n    params.stdout_file = stdout_handle;\r\n    handle = os_process_launch(&params);\r\n    \r\n    // rjf: close stdout handle\r\n    {\r\n      if(stdout_path.size != 0)\r\n      {\r\n        os_file_close(stdout_handle);\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return handle;\r\n}\r\n\r\ninternal OS_Handle\r\nos_cmd_line_launchf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  OS_Handle result = os_cmd_line_launch(string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n"
  },
  {
    "path": "src/os/core/os_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_CORE_H\r\n#define OS_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: System Info\r\n\r\ntypedef struct OS_SystemInfo OS_SystemInfo;\r\nstruct OS_SystemInfo\r\n{\r\n  U32 logical_processor_count;\r\n  U64 page_size;\r\n  U64 large_page_size;\r\n  U64 allocation_granularity;\r\n  String8 machine_name;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Info\r\n\r\ntypedef struct OS_ProcessInfo OS_ProcessInfo;\r\nstruct OS_ProcessInfo\r\n{\r\n  U32 pid;\r\n  B32 large_pages_allowed;\r\n  String8 binary_path;\r\n  String8 initial_path;\r\n  String8 user_program_data_path;\r\n  String8List module_load_paths;\r\n  String8List environment;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Access Flags\r\n\r\ntypedef U32 OS_AccessFlags;\r\nenum\r\n{\r\n  OS_AccessFlag_Read        = (1<<0),\r\n  OS_AccessFlag_Write       = (1<<1),\r\n  OS_AccessFlag_Execute     = (1<<2),\r\n  OS_AccessFlag_Append      = (1<<3),\r\n  OS_AccessFlag_ShareRead   = (1<<4),\r\n  OS_AccessFlag_ShareWrite  = (1<<5),\r\n  OS_AccessFlag_Inherited   = (1<<6),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Files\r\n\r\ntypedef U32 OS_FileIterFlags;\r\nenum\r\n{\r\n  OS_FileIterFlag_SkipFolders     = (1 << 0),\r\n  OS_FileIterFlag_SkipFiles       = (1 << 1),\r\n  OS_FileIterFlag_SkipHiddenFiles = (1 << 2),\r\n  OS_FileIterFlag_Done            = (1 << 31),\r\n};\r\n\r\ntypedef struct OS_FileIter OS_FileIter;\r\nstruct OS_FileIter\r\n{\r\n  OS_FileIterFlags flags;\r\n  U8 memory[800];\r\n};\r\n\r\ntypedef struct OS_FileInfo OS_FileInfo;\r\nstruct OS_FileInfo\r\n{\r\n  String8 name;\r\n  FileProperties props;\r\n};\r\n\r\n// nick: on-disk file identifier\r\ntypedef struct OS_FileID OS_FileID;\r\nstruct OS_FileID\r\n{\r\n  U64 v[3];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type\r\n\r\ntypedef struct OS_Handle OS_Handle;\r\nstruct OS_Handle\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\ntypedef struct OS_HandleNode OS_HandleNode;\r\nstruct OS_HandleNode\r\n{\r\n  OS_HandleNode *next;\r\n  OS_Handle v;\r\n};\r\n\r\ntypedef struct OS_HandleList OS_HandleList;\r\nstruct OS_HandleList\r\n{\r\n  OS_HandleNode *first;\r\n  OS_HandleNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct OS_HandleArray OS_HandleArray;\r\nstruct OS_HandleArray\r\n{\r\n  OS_Handle *v;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Launch Parameters\r\n\r\ntypedef struct OS_ProcessLaunchParams OS_ProcessLaunchParams;\r\nstruct OS_ProcessLaunchParams\r\n{\r\n  String8List cmd_line;\r\n  String8 path;\r\n  String8List env;\r\n  B32 inherit_env;\r\n  B32 debug_subprocesses;\r\n  B32 consoleless;\r\n  OS_Handle stdout_file;\r\n  OS_Handle stderr_file;\r\n  OS_Handle stdin_file;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type Functions (Helpers, Implemented Once)\r\n\r\ninternal OS_Handle os_handle_zero(void);\r\ninternal B32 os_handle_match(OS_Handle a, OS_Handle b);\r\ninternal void os_handle_list_push(Arena *arena, OS_HandleList *handles, OS_Handle handle);\r\ninternal OS_HandleArray os_handle_array_from_list(Arena *arena, OS_HandleList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Filesystem Helpers (Helpers, Implemented Once)\r\n\r\ninternal String8        os_data_from_file_path(Arena *arena, String8 path);\r\ninternal B32            os_write_data_to_file_path(String8 path, String8 data);\r\ninternal B32            os_write_data_list_to_file_path(String8 path, String8List list);\r\ninternal B32            os_append_data_to_file_path(String8 path, String8 data);\r\ninternal OS_FileID      os_id_from_file_path(String8 path);\r\ninternal S64            os_file_id_compare(OS_FileID a, OS_FileID b);\r\ninternal String8        os_string_from_file_range(Arena *arena, OS_Handle file, Rng1U64 range);\r\ninternal String8        os_file_read_cstring(Arena *arena, OS_Handle file, U64 off);\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Launcher Helpers\r\n\r\ninternal OS_Handle os_cmd_line_launch(String8 string);\r\ninternal OS_Handle os_cmd_line_launchf(char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System/Process Info (Implemented Per-OS)\r\n\r\ninternal OS_SystemInfo  *os_get_system_info(void);\r\ninternal OS_ProcessInfo *os_get_process_info(void);\r\ninternal String8         os_get_current_path(Arena *arena);\r\ninternal U32             os_get_process_start_time_unix(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\n//- rjf: basic\r\ninternal void *os_reserve(U64 size);\r\ninternal B32   os_commit(void *ptr, U64 size);\r\ninternal void  os_decommit(void *ptr, U64 size);\r\ninternal void  os_release(void *ptr, U64 size);\r\n\r\n//- rjf: large pages\r\ninternal void *os_reserve_large(U64 size);\r\ninternal B32 os_commit_large(void *ptr, U64 size);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Thread Info (Implemented Per-OS)\r\n\r\ninternal U32 os_tid(void);\r\ninternal void os_set_thread_name(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Aborting (Implemented Per-OS)\r\n\r\ninternal void os_abort(S32 exit_code);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\ninternal OS_Handle      os_file_open(OS_AccessFlags flags, String8 path);\r\ninternal void           os_file_close(OS_Handle file);\r\ninternal U64            os_file_read(OS_Handle file, Rng1U64 rng, void *out_data);\r\n#define os_file_read_struct(f, off, ptr) os_file_read((f), r1u64((off), (off)+sizeof(*(ptr))), (ptr))\r\ninternal U64            os_file_write(OS_Handle file, Rng1U64 rng, void *data);\r\ninternal B32            os_file_set_times(OS_Handle file, DateTime time);\r\ninternal FileProperties os_properties_from_file(OS_Handle file);\r\ninternal OS_FileID      os_id_from_file(OS_Handle file);\r\ninternal B32            os_file_reserve_size(OS_Handle file, U64 size);\r\ninternal B32            os_delete_file_at_path(String8 path);\r\ninternal B32            os_copy_file_path(String8 dst, String8 src);\r\ninternal B32            os_move_file_path(String8 dst, String8 src);\r\ninternal String8        os_full_path_from_path(Arena *arena, String8 path);\r\ninternal B32            os_file_path_exists(String8 path);\r\ninternal B32            os_folder_path_exists(String8 path);\r\ninternal FileProperties os_properties_from_file_path(String8 path);\r\n\r\n//- rjf: file maps\r\ninternal OS_Handle os_file_map_open(OS_AccessFlags flags, OS_Handle file);\r\ninternal void      os_file_map_close(OS_Handle map);\r\ninternal void *    os_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range);\r\ninternal void      os_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range);\r\n\r\n//- rjf: directory iteration\r\ninternal OS_FileIter *os_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags);\r\ninternal B32          os_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out);\r\ninternal void         os_file_iter_end(OS_FileIter *iter);\r\n\r\n//- rjf: directory creation\r\ninternal B32 os_make_directory(String8 path);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_shared_memory_alloc(U64 size, String8 name);\r\ninternal OS_Handle os_shared_memory_open(String8 name);\r\ninternal void      os_shared_memory_close(OS_Handle handle);\r\ninternal void *    os_shared_memory_view_open(OS_Handle handle, Rng1U64 range);\r\ninternal void      os_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U64         os_now_microseconds(void);\r\ninternal U32         os_now_unix(void);\r\ninternal DateTime    os_now_universal_time(void);\r\ninternal DateTime    os_universal_time_from_local(DateTime *local_time);\r\ninternal DateTime    os_local_time_from_universal(DateTime *universal_time);\r\ninternal void        os_sleep_milliseconds(U32 msec);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_process_launch(OS_ProcessLaunchParams *params);\r\ninternal B32       os_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out);\r\ninternal void      os_process_detach(OS_Handle handle);\r\ninternal B32       os_process_kill(OS_Handle handle);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal Thread os_thread_launch(ThreadEntryPointFunctionType *f, void *p);\r\ninternal B32 os_thread_join(Thread handle, U64 endt_us);\r\ninternal void os_thread_detach(Thread handle);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n//- rjf: recursive mutexes\r\ninternal Mutex os_mutex_alloc(void);\r\ninternal void  os_mutex_release(Mutex mutex);\r\ninternal void  os_mutex_take(Mutex mutex);\r\ninternal void  os_mutex_drop(Mutex mutex);\r\n\r\n//- rjf: reader/writer mutexes\r\ninternal RWMutex os_rw_mutex_alloc(void);\r\ninternal void    os_rw_mutex_release(RWMutex mutex);\r\ninternal void    os_rw_mutex_take(RWMutex mutex, B32 write_mode);\r\ninternal void    os_rw_mutex_drop(RWMutex mutex, B32 write_mode);\r\n\r\n//- rjf: condition variables\r\ninternal CondVar   os_cond_var_alloc(void);\r\ninternal void      os_cond_var_release(CondVar cv);\r\n// returns false on timeout, true on signal, (max_wait_ms = max_U64) -> no timeout\r\ninternal B32       os_cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us);\r\ninternal B32       os_cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us);\r\ninternal void      os_cond_var_signal(CondVar cv);\r\ninternal void      os_cond_var_broadcast(CondVar cv);\r\n\r\n//- rjf: cross-process semaphores\r\ninternal Semaphore os_semaphore_alloc(U32 initial_count, U32 max_count, String8 name);\r\ninternal void      os_semaphore_release(Semaphore semaphore);\r\ninternal Semaphore os_semaphore_open(String8 name);\r\ninternal void      os_semaphore_close(Semaphore semaphore);\r\ninternal B32       os_semaphore_take(Semaphore semaphore, U64 endt_us);\r\ninternal void      os_semaphore_drop(Semaphore semaphore);\r\n\r\n//- rjf: barriers\r\ninternal Barrier   os_barrier_alloc(U64 count);\r\ninternal void      os_barrier_release(Barrier barrier);\r\ninternal void      os_barrier_wait(Barrier barrier);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle os_library_open(String8 path);\r\ninternal void      os_library_close(OS_Handle lib);\r\ninternal VoidProc *os_library_load_proc(OS_Handle lib, String8 name);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Safe Calls (Implemented Per-OS)\r\n\r\ninternal void os_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks GUIDs (Implemented Per-OS)\r\n\r\ninternal Guid os_make_guid(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Entry Points (Implemented Per-OS)\r\n\r\n// NOTE(rjf): The implementation of `os_core` will define low-level entry\r\n// points if BUILD_ENTRY_DEFINING_UNIT is defined to 1. These will call\r\n// into the standard codebase program entry points, named \"entry_point\".\r\n\r\n#if BUILD_ENTRY_DEFINING_UNIT\r\nraddbg_entry_point(entry_point);\r\ninternal no_inline void entry_point(CmdLine *cmdline);\r\n#endif\r\n\r\n#endif // OS_CORE_H\r\n"
  },
  {
    "path": "src/os/core/win32/os_core_win32.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Modern Windows SDK Functions\r\n//\r\n// (We must dynamically link to them, since they can be missing in older SDKs)\r\n\r\ntypedef HRESULT W32_SetThreadDescription_Type(HANDLE hThread, PCWSTR lpThreadDescription);\r\nglobal W32_SetThreadDescription_Type *w32_SetThreadDescription_func = 0;\r\nglobal RIO_EXTENSION_FUNCTION_TABLE w32_rio_functions = {0};\r\n\r\n////////////////////////////////\r\n//~ rjf: File Info Conversion Helpers\r\n\r\ninternal FilePropertyFlags\r\nos_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes)\r\n{\r\n  FilePropertyFlags flags = 0;\r\n  if(dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r\n  {\r\n    flags |= FilePropertyFlag_IsFolder;\r\n  }\r\n  return flags;\r\n}\r\n\r\ninternal void\r\nos_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes)\r\n{\r\n  properties->size = Compose64Bit(attributes->nFileSizeHigh, attributes->nFileSizeLow);\r\n  os_w32_dense_time_from_file_time(&properties->created, &attributes->ftCreationTime);\r\n  os_w32_dense_time_from_file_time(&properties->modified, &attributes->ftLastWriteTime);\r\n  properties->flags = os_w32_file_property_flags_from_dwFileAttributes(attributes->dwFileAttributes);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Conversion Helpers\r\n\r\ninternal void\r\nos_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in)\r\n{\r\n  out->year    = in->wYear;\r\n  out->mon     = in->wMonth - 1;\r\n  out->wday    = in->wDayOfWeek;\r\n\tout->day     = in->wDay;\r\n\tout->hour    = in->wHour;\r\n\tout->min     = in->wMinute;\r\n\tout->sec     = in->wSecond;\r\n  out->msec    = in->wMilliseconds;\r\n}\r\n\r\ninternal void\r\nos_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in)\r\n{\r\n  out->wYear         = (WORD)(in->year);\r\n  out->wMonth        = in->mon + 1;\r\n  out->wDay          = in->day;\r\n  out->wHour         = in->hour;\r\n  out->wMinute       = in->min;\r\n  out->wSecond       = in->sec;\r\n  out->wMilliseconds = in->msec;\r\n}\r\n\r\ninternal void\r\nos_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  FileTimeToSystemTime(in, &systime);\r\n  DateTime date_time = {0};\r\n  os_w32_date_time_from_system_time(&date_time, &systime);\r\n  *out = dense_time_from_date_time(date_time);\r\n}\r\n\r\ninternal U32\r\nos_w32_sleep_ms_from_endt_us(U64 endt_us)\r\n{\r\n  U32 sleep_ms = 0;\r\n  if(endt_us == max_U64)\r\n  {\r\n    sleep_ms = INFINITE;\r\n  }\r\n  else\r\n  {\r\n    U64 begint = os_now_microseconds();\r\n    if(begint < endt_us)\r\n    {\r\n      U64 sleep_us = endt_us - begint;\r\n      sleep_ms = (U32)((sleep_us + 999)/1000);\r\n    }\r\n  }\r\n  return sleep_ms;\r\n}\r\n\r\ninternal U32\r\nos_w32_unix_time_from_file_time(FILETIME file_time)\r\n{\r\n  U64 win32_time = ((U64)file_time.dwHighDateTime << 32) | file_time.dwLowDateTime;\r\n  U64 unix_time64 = ((win32_time - 0x19DB1DED53E8000ULL) / 10000000);\r\n  \r\n  Assert(unix_time64 <= max_U32);\r\n  U32 unix_time32 = (U32)unix_time64;\r\n  \r\n  return unix_time32;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Functions\r\n\r\ninternal OS_W32_Entity *\r\nos_w32_entity_alloc(OS_W32_EntityKind kind)\r\n{\r\n  OS_W32_Entity *result = 0;\r\n  EnterCriticalSection(&os_w32_state.entity_mutex);\r\n  {\r\n    result = os_w32_state.entity_free;\r\n    if(result)\r\n    {\r\n      SLLStackPop(os_w32_state.entity_free);\r\n    }\r\n    else\r\n    {\r\n      result = push_array_no_zero(os_w32_state.entity_arena, OS_W32_Entity, 1);\r\n    }\r\n    MemoryZeroStruct(result);\r\n  }\r\n  LeaveCriticalSection(&os_w32_state.entity_mutex);\r\n  result->kind = kind;\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_w32_entity_release(OS_W32_Entity *entity)\r\n{\r\n  entity->kind = OS_W32_EntityKind_Null;\r\n  EnterCriticalSection(&os_w32_state.entity_mutex);\r\n  SLLStackPush(os_w32_state.entity_free, entity);\r\n  LeaveCriticalSection(&os_w32_state.entity_mutex);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal DWORD\r\nos_w32_thread_entry_point(void *ptr)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity *)ptr;\r\n  ThreadEntryPointFunctionType *func = entity->thread.func;\r\n  void *thread_ptr = entity->thread.ptr;\r\n  supplement_thread_base_entry_point(func, thread_ptr);\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks System/Process Info (Implemented Per-OS)\r\n\r\ninternal OS_SystemInfo *\r\nos_get_system_info(void)\r\n{\r\n  return &os_w32_state.system_info;\r\n}\r\n\r\ninternal OS_ProcessInfo *\r\nos_get_process_info(void)\r\n{\r\n  return &os_w32_state.process_info;\r\n}\r\n\r\ninternal String8\r\nos_get_current_path(Arena *arena)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DWORD length = GetCurrentDirectoryW(0, 0);\r\n  U16 *memory = push_array_no_zero(scratch.arena, U16, length + 1);\r\n  length = GetCurrentDirectoryW(length + 1, (WCHAR*)memory);\r\n  String8 name = str8_from_16(arena, str16(memory, length));\r\n  scratch_end(scratch);\r\n  return name;\r\n}\r\n\r\ninternal U32\r\nos_get_process_start_time_unix(void)\r\n{\r\n  HANDLE handle = GetCurrentProcess();\r\n  FILETIME start_time = {0};\r\n  FILETIME exit_time;\r\n  FILETIME kernel_time;\r\n  FILETIME user_time;\r\n  if(GetProcessTimes(handle, &start_time, &exit_time, &kernel_time, &user_time))\r\n  {\r\n    return os_w32_unix_time_from_file_time(start_time);\r\n  }\r\n  return 0;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Memory Allocation (Implemented Per-OS)\r\n\r\n//- rjf: basic\r\n\r\ninternal void *\r\nos_reserve(U64 size)\r\n{\r\n  void *result = VirtualAlloc(0, size, MEM_RESERVE, PAGE_READWRITE);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit(void *ptr, U64 size)\r\n{\r\n  B32 result = (VirtualAlloc(ptr, size, MEM_COMMIT, PAGE_READWRITE) != 0);\r\n  w32_rio_functions.RIODeregisterBuffer(w32_rio_functions.RIORegisterBuffer(ptr, size));\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_decommit(void *ptr, U64 size)\r\n{\r\n  VirtualFree(ptr, size, MEM_DECOMMIT);\r\n}\r\n\r\ninternal void\r\nos_release(void *ptr, U64 size)\r\n{\r\n  // NOTE(rjf): size not used - not necessary on Windows, but necessary for other OSes.\r\n  VirtualFree(ptr, 0, MEM_RELEASE);\r\n}\r\n\r\n//- rjf: large pages\r\n\r\ninternal void *\r\nos_reserve_large(U64 size)\r\n{\r\n  // we commit on reserve because windows\r\n  void *result = VirtualAlloc(0, size, MEM_RESERVE|MEM_COMMIT|MEM_LARGE_PAGES, PAGE_READWRITE);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_commit_large(void *ptr, U64 size)\r\n{\r\n  return 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Thread Info (Implemented Per-OS)\r\n\r\ninternal U32\r\nos_tid(void)\r\n{\r\n  DWORD id = GetCurrentThreadId();\r\n  return (U32)id;\r\n}\r\n\r\ninternal void\r\nos_set_thread_name(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  // rjf: windows 10 style\r\n  if(w32_SetThreadDescription_func)\r\n  {\r\n    String16 name16 = str16_from_8(scratch.arena, name);\r\n    HRESULT hr = w32_SetThreadDescription_func(GetCurrentThread(), (WCHAR*)name16.str);\r\n  }\r\n  \r\n  // rjf: raise-exception style\r\n  {\r\n    String8 name_copy = push_str8_copy(scratch.arena, name);\r\n#pragma pack(push,8)\r\n    typedef struct THREADNAME_INFO THREADNAME_INFO;\r\n    struct THREADNAME_INFO\r\n    {\r\n      U32 dwType;     // Must be 0x1000.\r\n      char *szName;   // Pointer to name (in user addr space).\r\n      U32 dwThreadID; // Thread ID (-1=caller thread).\r\n      U32 dwFlags;    // Reserved for future use, must be zero.\r\n    };\r\n#pragma pack(pop)\r\n    THREADNAME_INFO info;\r\n    info.dwType = 0x1000;\r\n    info.szName = (char *)name_copy.str;\r\n    info.dwThreadID = os_tid();\r\n    info.dwFlags = 0;\r\n#pragma warning(push)\r\n#pragma warning(disable: 6320 6322)\r\n    __try\r\n    {\r\n      RaiseException(0x406D1388, 0, sizeof(info) / sizeof(void *), (const ULONG_PTR *)&info);\r\n    }\r\n    __except (EXCEPTION_EXECUTE_HANDLER)\r\n    {\r\n    }\r\n#pragma warning(pop)\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Aborting (Implemented Per-OS)\r\n\r\ninternal void\r\nos_abort(S32 exit_code)\r\n{\r\n  ExitProcess(exit_code);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks File System (Implemented Per-OS)\r\n\r\n//- rjf: files\r\n\r\ninternal OS_Handle\r\nos_file_open(OS_AccessFlags flags, String8 path)\r\n{\r\n  OS_Handle result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  DWORD access_flags = 0;\r\n  DWORD share_mode = 0;\r\n  DWORD creation_disposition = OPEN_EXISTING;\r\n  SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0};\r\n  if(flags & OS_AccessFlag_Read)        {access_flags |= GENERIC_READ;}\r\n  if(flags & OS_AccessFlag_Write)       {access_flags |= GENERIC_WRITE;}\r\n  if(flags & OS_AccessFlag_Execute)     {access_flags |= GENERIC_EXECUTE;}\r\n  if(flags & OS_AccessFlag_ShareRead)   {share_mode |= FILE_SHARE_READ;}\r\n  if(flags & OS_AccessFlag_ShareWrite)  {share_mode |= FILE_SHARE_WRITE|FILE_SHARE_DELETE;}\r\n  if(flags & OS_AccessFlag_Write)       {creation_disposition = CREATE_ALWAYS;}\r\n  if(flags & OS_AccessFlag_Append)      {creation_disposition = OPEN_ALWAYS; access_flags |= FILE_APPEND_DATA; }\r\n  if(flags & OS_AccessFlag_Inherited)\r\n  {\r\n    security_attributes.bInheritHandle = 1;\r\n  }\r\n  HANDLE file = CreateFileW((WCHAR *)path16.str, access_flags, share_mode, &security_attributes, creation_disposition, FILE_ATTRIBUTE_NORMAL, 0);\r\n  if(file != INVALID_HANDLE_VALUE)\r\n  {\r\n    result.u64[0] = (U64)file;\r\n  }\r\n  else\r\n  {\r\n    DWORD err = GetLastError();\r\n    (void)err;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_file_close(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return; }\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  BOOL result = CloseHandle(handle);\r\n  (void)result;\r\n}\r\n\r\ninternal U64\r\nos_file_read(OS_Handle file, Rng1U64 rng, void *out_data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  \r\n  // rjf: clamp range by file size\r\n  U64 size = 0;\r\n  GetFileSizeEx(handle, (LARGE_INTEGER *)&size);\r\n  Rng1U64 rng_clamped  = r1u64(ClampTop(rng.min, size), ClampTop(rng.max, size));\r\n  U64 total_read_size = 0;\r\n  \r\n  // rjf: read loop\r\n  {\r\n    U64 to_read = dim_1u64(rng_clamped);\r\n    for(U64 off = rng.min; total_read_size < to_read;)\r\n    {\r\n      U64 amt64 = to_read - total_read_size;\r\n      U32 amt32 = u32_from_u64_saturate(amt64);\r\n      DWORD read_size = 0;\r\n      OVERLAPPED overlapped = {0};\r\n      overlapped.Offset     = (off&0x00000000ffffffffull);\r\n      overlapped.OffsetHigh = (off&0xffffffff00000000ull) >> 32;\r\n      ReadFile(handle, (U8 *)out_data + total_read_size, amt32, &read_size, &overlapped);\r\n      off += read_size;\r\n      total_read_size += read_size;\r\n      if(read_size != amt32)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return total_read_size;\r\n}\r\n\r\ninternal U64\r\nos_file_write(OS_Handle file, Rng1U64 rng, void *data)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  HANDLE win_handle = (HANDLE)file.u64[0];\r\n  U64 src_off = 0;\r\n  U64 dst_off = rng.min;\r\n  U64 total_write_size = dim_1u64(rng);\r\n  for(;;)\r\n  {\r\n    void *bytes_src = (U8 *)data + src_off;\r\n    U64 bytes_left = total_write_size - src_off;\r\n    DWORD write_size = Min(MB(1), bytes_left);\r\n    DWORD bytes_written = 0;\r\n    OVERLAPPED overlapped = {0};\r\n    overlapped.Offset = (dst_off&0x00000000ffffffffull);\r\n    overlapped.OffsetHigh = (dst_off&0xffffffff00000000ull) >> 32;\r\n    BOOL success = WriteFile(win_handle, bytes_src, write_size, &bytes_written, &overlapped);\r\n    if(success == 0)\r\n    {\r\n      break;\r\n    }\r\n    src_off += bytes_written;\r\n    dst_off += bytes_written;\r\n    if(bytes_left == 0)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  return src_off;\r\n}\r\n\r\ninternal B32\r\nos_file_set_time(OS_Handle file, DateTime time)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { return 0; }\r\n  B32 result = 0;\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  SYSTEMTIME system_time = {0};\r\n  os_w32_system_time_from_date_time(&system_time, &time);\r\n  FILETIME file_time = {0};\r\n  result = (SystemTimeToFileTime(&system_time, &file_time) &&\r\n            SetFileTime(handle, &file_time, &file_time, &file_time));\r\n  return result;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { FileProperties r = {0}; return r; }\r\n  FileProperties props = {0};\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  BY_HANDLE_FILE_INFORMATION info;\r\n  BOOL info_good = GetFileInformationByHandle(handle, &info);\r\n  if(info_good)\r\n  {\r\n    U32 size_lo = info.nFileSizeLow;\r\n    U32 size_hi = info.nFileSizeHigh;\r\n    props.size     = (U64)size_lo | (((U64)size_hi)<<32);\r\n    os_w32_dense_time_from_file_time(&props.modified, &info.ftLastWriteTime);\r\n    os_w32_dense_time_from_file_time(&props.created, &info.ftCreationTime);\r\n    props.flags = os_w32_file_property_flags_from_dwFileAttributes(info.dwFileAttributes);\r\n  }\r\n  return props;\r\n}\r\n\r\ninternal OS_FileID\r\nos_id_from_file(OS_Handle file)\r\n{\r\n  if(os_handle_match(file, os_handle_zero())) { OS_FileID r = {0}; return r; }\r\n  OS_FileID result = {0};\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  BY_HANDLE_FILE_INFORMATION info;\r\n  BOOL is_ok = GetFileInformationByHandle(handle, &info);\r\n  if(is_ok)\r\n  {\r\n    result.v[0] = info.dwVolumeSerialNumber;\r\n    result.v[1] = info.nFileIndexLow;\r\n    result.v[2] = info.nFileIndexHigh;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_file_reserve_size(OS_Handle file, U64 size)\r\n{\r\n  HANDLE handle = (HANDLE)file.u64[0];\r\n  \r\n  FILE_ALLOCATION_INFO alloc_info    = {0};\r\n  alloc_info.AllocationSize.LowPart  = size & max_U32;\r\n  alloc_info.AllocationSize.HighPart = (size >> 32) & max_U32;\r\n  \r\n  BOOL is_reserved = SetFileInformationByHandle(handle, FileAllocationInfo, &alloc_info, sizeof(alloc_info));\r\n  return is_reserved;\r\n}\r\n\r\ninternal B32\r\nos_delete_file_at_path(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  B32 result = DeleteFileW((WCHAR*)path16.str);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_copy_file_path(String8 dst, String8 src)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 dst16 = str16_from_8(scratch.arena, dst);\r\n  String16 src16 = str16_from_8(scratch.arena, src);\r\n  B32 result = CopyFileW((WCHAR*)src16.str, (WCHAR*)dst16.str, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_move_file_path(String8 dst, String8 src)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 dst16 = str16_from_8(scratch.arena, dst);\r\n  String16 src16 = str16_from_8(scratch.arena, src);\r\n  B32 result = MoveFileW((WCHAR*)src16.str, (WCHAR*)dst16.str);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nos_full_path_from_path(Arena *arena, String8 path)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DWORD     buffer_size = Max(MAX_PATH, path.size * 2) + 1;\r\n  String16  path16      = str16_from_8(scratch.arena, path);\r\n  WCHAR    *buffer      = push_array_no_zero(scratch.arena, WCHAR, buffer_size);\r\n  DWORD     path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL);\r\n  if(path16_size > buffer_size)\r\n  {\r\n    arena_pop(scratch.arena, buffer_size);\r\n    buffer_size = path16_size + 1;\r\n    buffer      = push_array_no_zero(scratch.arena, WCHAR, buffer_size);\r\n    path16_size = GetFullPathNameW((WCHAR*)path16.str, buffer_size, buffer, NULL);\r\n  }\r\n  String8 full_path = str8_from_16(arena, str16((U16*)buffer, path16_size));\r\n  scratch_end(scratch);\r\n  return full_path;\r\n}\r\n\r\ninternal B32\r\nos_file_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  DWORD attributes = GetFileAttributesW((WCHAR *)path16.str);\r\n  B32 exists = (attributes != INVALID_FILE_ATTRIBUTES) && !!(~attributes & FILE_ATTRIBUTE_DIRECTORY);\r\n  scratch_end(scratch);\r\n  return exists;\r\n}\r\n\r\ninternal B32\r\nos_folder_path_exists(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  String16 path16     = str16_from_8(scratch.arena, path);\r\n  DWORD    attributes = GetFileAttributesW((WCHAR *)path16.str);\r\n  B32      exists     = (attributes != INVALID_FILE_ATTRIBUTES) && (attributes & FILE_ATTRIBUTE_DIRECTORY);\r\n  scratch_end(scratch);\r\n  return exists;\r\n}\r\n\r\ninternal FileProperties\r\nos_properties_from_file_path(String8 path)\r\n{\r\n  WIN32_FIND_DATAW find_data = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  HANDLE handle = FindFirstFileW((WCHAR *)path16.str, &find_data);\r\n  FileProperties props = {0};\r\n  if(handle != INVALID_HANDLE_VALUE)\r\n  {\r\n    props.size = Compose64Bit(find_data.nFileSizeHigh, find_data.nFileSizeLow);\r\n    os_w32_dense_time_from_file_time(&props.created, &find_data.ftCreationTime);\r\n    os_w32_dense_time_from_file_time(&props.modified, &find_data.ftLastWriteTime);\r\n    props.flags = os_w32_file_property_flags_from_dwFileAttributes(find_data.dwFileAttributes);\r\n  }\r\n  else\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    WCHAR buffer[512] = {0};\r\n    DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer);\r\n    U64 last_slash_pos = 0;\r\n    for(;last_slash_pos < path.size; last_slash_pos = str8_find_needle(path, last_slash_pos+1, str8_lit(\"/\"), StringMatchFlag_SlashInsensitive));\r\n    String8 path_trimmed = str8_prefix(path, last_slash_pos);\r\n    for(U64 off = 0; off < (U64)length;)\r\n    {\r\n      String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off);\r\n      off += next_drive_string_16.size+1;\r\n      String8 next_drive_string = str8_from_16(scratch.arena, next_drive_string_16);\r\n      next_drive_string = str8_chop_last_slash(next_drive_string);\r\n      if(str8_match(path_trimmed, next_drive_string, StringMatchFlag_CaseInsensitive))\r\n      {\r\n        props.flags |= FilePropertyFlag_IsFolder;\r\n        break;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  FindClose(handle);\r\n  scratch_end(scratch);\r\n  return props;\r\n}\r\n\r\n//- rjf: file maps\r\n\r\ninternal OS_Handle\r\nos_file_map_open(OS_AccessFlags flags, OS_Handle file)\r\n{\r\n  OS_Handle map = {0};\r\n  {\r\n    HANDLE file_handle = (HANDLE)file.u64[0];\r\n    DWORD protect_flags = 0;\r\n    {\r\n      switch(flags)\r\n      {\r\n        default:{}break;\r\n        case OS_AccessFlag_Read:\r\n        {protect_flags = PAGE_READONLY;}break;\r\n        case OS_AccessFlag_Write:\r\n        case OS_AccessFlag_Read|OS_AccessFlag_Write:\r\n        {protect_flags = PAGE_READWRITE;}break;\r\n        case OS_AccessFlag_Execute:\r\n        case OS_AccessFlag_Read|OS_AccessFlag_Execute:\r\n        {protect_flags = PAGE_EXECUTE_READ;}break;\r\n        case OS_AccessFlag_Execute|OS_AccessFlag_Write|OS_AccessFlag_Read:\r\n        case OS_AccessFlag_Execute|OS_AccessFlag_Write:\r\n        {protect_flags = PAGE_EXECUTE_READWRITE;}break;\r\n      }\r\n    }\r\n    HANDLE map_handle = CreateFileMappingA(file_handle, 0, protect_flags, 0, 0, 0);\r\n    map.u64[0] = (U64)map_handle;\r\n  }\r\n  return map;\r\n}\r\n\r\ninternal void\r\nos_file_map_close(OS_Handle map)\r\n{\r\n  HANDLE handle = (HANDLE)map.u64[0];\r\n  BOOL result = CloseHandle(handle);\r\n  (void)result;\r\n}\r\n\r\ninternal void *\r\nos_file_map_view_open(OS_Handle map, OS_AccessFlags flags, Rng1U64 range)\r\n{\r\n  HANDLE handle = (HANDLE)map.u64[0];\r\n  U32 off_lo = (U32)((range.min&0x00000000ffffffffull)>>0);\r\n  U32 off_hi = (U32)((range.min&0xffffffff00000000ull)>>32);\r\n  U64 size = dim_1u64(range);\r\n  DWORD access_flags = 0;\r\n  {\r\n    switch(flags)\r\n    {\r\n      default:{}break;\r\n      case OS_AccessFlag_Read:\r\n      {\r\n        access_flags = FILE_MAP_READ;\r\n      }break;\r\n      case OS_AccessFlag_Write:\r\n      {\r\n        access_flags = FILE_MAP_WRITE;\r\n      }break;\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Write:\r\n      {\r\n        access_flags = FILE_MAP_ALL_ACCESS;\r\n      }break;\r\n      case OS_AccessFlag_Execute:\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Execute:\r\n      case OS_AccessFlag_Write|OS_AccessFlag_Execute:\r\n      case OS_AccessFlag_Read|OS_AccessFlag_Write|OS_AccessFlag_Execute:\r\n      {\r\n        access_flags = FILE_MAP_ALL_ACCESS|FILE_MAP_EXECUTE;\r\n      }break;\r\n    }\r\n  }\r\n  void *result = MapViewOfFile(handle, access_flags, off_hi, off_lo, size);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_file_map_view_close(OS_Handle map, void *ptr, Rng1U64 range)\r\n{\r\n  BOOL result = UnmapViewOfFile(ptr);\r\n  (void)result;\r\n}\r\n\r\n//- rjf: directory iteration\r\n\r\ninternal OS_FileIter *\r\nos_file_iter_begin(Arena *arena, String8 path, OS_FileIterFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 path_with_wildcard = push_str8_cat(scratch.arena, path, str8_lit(\"\\\\*\"));\r\n  String16 path16 = str16_from_8(scratch.arena, path_with_wildcard);\r\n  OS_FileIter *iter = push_array(arena, OS_FileIter, 1);\r\n  iter->flags = flags;\r\n  OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;\r\n  if(path.size == 0)\r\n  {\r\n    w32_iter->is_volume_iter = 1;\r\n    WCHAR buffer[512] = {0};\r\n    DWORD length = GetLogicalDriveStringsW(sizeof(buffer), buffer);\r\n    String8List drive_strings = {0};\r\n    for(U64 off = 0; off < (U64)length;)\r\n    {\r\n      String16 next_drive_string_16 = str16_cstring((U16 *)buffer+off);\r\n      off += next_drive_string_16.size+1;\r\n      String8 next_drive_string = str8_from_16(arena, next_drive_string_16);\r\n      next_drive_string = str8_chop_last_slash(next_drive_string);\r\n      str8_list_push(scratch.arena, &drive_strings, next_drive_string);\r\n    }\r\n    w32_iter->drive_strings = str8_array_from_list(arena, &drive_strings);\r\n    w32_iter->drive_strings_iter_idx = 0;\r\n  }\r\n  else\r\n  {\r\n    w32_iter->handle = FindFirstFileExW((WCHAR*)path16.str, FindExInfoBasic, &w32_iter->find_data, FindExSearchNameMatch, 0, FIND_FIRST_EX_LARGE_FETCH);\r\n  }\r\n  scratch_end(scratch);\r\n  return iter;\r\n}\r\n\r\ninternal B32\r\nos_file_iter_next(Arena *arena, OS_FileIter *iter, OS_FileInfo *info_out)\r\n{\r\n  B32 result = 0;\r\n  OS_FileIterFlags flags = iter->flags;\r\n  OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;\r\n  switch(w32_iter->is_volume_iter)\r\n  {\r\n    //- rjf: file iteration\r\n    default:\r\n    case 0:\r\n    {\r\n      if (!(flags & OS_FileIterFlag_Done) && w32_iter->handle != INVALID_HANDLE_VALUE)\r\n      {\r\n        do\r\n        {\r\n          // check is usable\r\n          B32 usable_file = 1;\r\n          \r\n          WCHAR *file_name = w32_iter->find_data.cFileName;\r\n          DWORD attributes = w32_iter->find_data.dwFileAttributes;\r\n          if (file_name[0] == '.'){\r\n            if (flags & OS_FileIterFlag_SkipHiddenFiles){\r\n              usable_file = 0;\r\n            }\r\n            else if (file_name[1] == 0){\r\n              usable_file = 0;\r\n            }\r\n            else if (file_name[1] == '.' && file_name[2] == 0){\r\n              usable_file = 0;\r\n            }\r\n          }\r\n          if (attributes & FILE_ATTRIBUTE_DIRECTORY){\r\n            if (flags & OS_FileIterFlag_SkipFolders){\r\n              usable_file = 0;\r\n            }\r\n          }\r\n          else{\r\n            if (flags & OS_FileIterFlag_SkipFiles){\r\n              usable_file = 0;\r\n            }\r\n          }\r\n          \r\n          // emit if usable\r\n          if (usable_file){\r\n            info_out->name = str8_from_16(arena, str16_cstring((U16*)file_name));\r\n            info_out->props.size = (U64)w32_iter->find_data.nFileSizeLow | (((U64)w32_iter->find_data.nFileSizeHigh)<<32);\r\n            os_w32_dense_time_from_file_time(&info_out->props.created,  &w32_iter->find_data.ftCreationTime);\r\n            os_w32_dense_time_from_file_time(&info_out->props.modified, &w32_iter->find_data.ftLastWriteTime);\r\n            info_out->props.flags = os_w32_file_property_flags_from_dwFileAttributes(attributes);\r\n            result = 1;\r\n            if (!FindNextFileW(w32_iter->handle, &w32_iter->find_data)){\r\n              iter->flags |= OS_FileIterFlag_Done;\r\n            }\r\n            break;\r\n          }\r\n        }while(FindNextFileW(w32_iter->handle, &w32_iter->find_data));\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: volume iteration\r\n    case 1:\r\n    {\r\n      result = w32_iter->drive_strings_iter_idx < w32_iter->drive_strings.count;\r\n      if(result != 0)\r\n      {\r\n        MemoryZeroStruct(info_out);\r\n        info_out->name = w32_iter->drive_strings.v[w32_iter->drive_strings_iter_idx];\r\n        info_out->props.flags |= FilePropertyFlag_IsFolder;\r\n        w32_iter->drive_strings_iter_idx += 1;\r\n      }\r\n    }break;\r\n  }\r\n  if(!result)\r\n  {\r\n    iter->flags |= OS_FileIterFlag_Done;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_file_iter_end(OS_FileIter *iter)\r\n{\r\n  OS_W32_FileIter *w32_iter = (OS_W32_FileIter*)iter->memory;\r\n  HANDLE zero_handle;\r\n  MemoryZeroStruct(&zero_handle);\r\n  if(!MemoryMatchStruct(&zero_handle, &w32_iter->handle))\r\n  {\r\n    FindClose(w32_iter->handle);\r\n  }\r\n}\r\n\r\n//- rjf: directory creation\r\n\r\ninternal B32\r\nos_make_directory(String8 path)\r\n{\r\n  B32 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, path);\r\n  WIN32_FILE_ATTRIBUTE_DATA attributes = {0};\r\n  GetFileAttributesExW((WCHAR*)name16.str, GetFileExInfoStandard, &attributes);\r\n  if(attributes.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)\r\n  {\r\n    result = 1;\r\n  }\r\n  else if(CreateDirectoryW((WCHAR*)name16.str, 0))\r\n  {\r\n    result = 1;\r\n  }\r\n  scratch_end(scratch);\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shared Memory (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_shared_memory_alloc(U64 size, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE file = CreateFileMappingW(INVALID_HANDLE_VALUE,\r\n                                   0,\r\n                                   PAGE_READWRITE,\r\n                                   (U32)((size & 0xffffffff00000000) >> 32),\r\n                                   (U32)((size & 0x00000000ffffffff)),\r\n                                   (WCHAR *)name16.str);\r\n  OS_Handle result = {(U64)file};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_shared_memory_open(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE file = OpenFileMappingW(FILE_MAP_ALL_ACCESS, 0, (WCHAR *)name16.str);\r\n  OS_Handle result = {(U64)file};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_close(OS_Handle handle)\r\n{\r\n  HANDLE file = (HANDLE)(handle.u64[0]);\r\n  CloseHandle(file);\r\n}\r\n\r\ninternal void *\r\nos_shared_memory_view_open(OS_Handle handle, Rng1U64 range)\r\n{\r\n  HANDLE file = (HANDLE)(handle.u64[0]);\r\n  U64 offset = range.min;\r\n  U64 size = range.max-range.min;\r\n  void *ptr = MapViewOfFile(file, FILE_MAP_ALL_ACCESS,\r\n                            (U32)((offset & 0xffffffff00000000) >> 32),\r\n                            (U32)((offset & 0x00000000ffffffff)),\r\n                            size);\r\n  return ptr;\r\n}\r\n\r\ninternal void\r\nos_shared_memory_view_close(OS_Handle handle, void *ptr, Rng1U64 range)\r\n{\r\n  UnmapViewOfFile(ptr);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Time (Implemented Per-OS)\r\n\r\ninternal U64\r\nos_now_microseconds(void)\r\n{\r\n  U64 result = 0;\r\n  LARGE_INTEGER large_int_counter;\r\n  if(QueryPerformanceCounter(&large_int_counter))\r\n  {\r\n    result = (large_int_counter.QuadPart*Million(1))/os_w32_state.microsecond_resolution;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nos_now_unix(void)\r\n{\r\n  FILETIME file_time;\r\n  GetSystemTimeAsFileTime(&file_time);\r\n  U32 unix_time = os_w32_unix_time_from_file_time(file_time);\r\n  return unix_time;\r\n}\r\n\r\ninternal DateTime\r\nos_now_universal_time(void)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  GetSystemTime(&systime);\r\n  DateTime result = {0};\r\n  os_w32_date_time_from_system_time(&result, &systime);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_universal_time_from_local(DateTime *date_time)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  os_w32_system_time_from_date_time(&systime, date_time);\r\n  FILETIME ftime = {0};\r\n  SystemTimeToFileTime(&systime, &ftime);\r\n  FILETIME ftime_local = {0};\r\n  LocalFileTimeToFileTime(&ftime, &ftime_local);\r\n  FileTimeToSystemTime(&ftime_local, &systime);\r\n  DateTime result = {0};\r\n  os_w32_date_time_from_system_time(&result, &systime);\r\n  return result;\r\n}\r\n\r\ninternal DateTime\r\nos_local_time_from_universal(DateTime *date_time)\r\n{\r\n  SYSTEMTIME systime = {0};\r\n  os_w32_system_time_from_date_time(&systime, date_time);\r\n  FILETIME ftime = {0};\r\n  SystemTimeToFileTime(&systime, &ftime);\r\n  FILETIME ftime_local = {0};\r\n  FileTimeToLocalFileTime(&ftime, &ftime_local);\r\n  FileTimeToSystemTime(&ftime_local, &systime);\r\n  DateTime result = {0};\r\n  os_w32_date_time_from_system_time(&result, &systime);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_sleep_milliseconds(U32 msec)\r\n{\r\n  Sleep(msec);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Child Processes (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_process_launch(OS_ProcessLaunchParams *params)\r\n{\r\n  OS_Handle result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: form full command string\r\n  String8 cmd = {0};\r\n  {\r\n    StringJoin join_params = {0};\r\n    join_params.pre = str8_lit(\"\\\"\");\r\n    join_params.sep = str8_lit(\"\\\" \\\"\");\r\n    join_params.post = str8_lit(\"\\\"\");\r\n    cmd = str8_list_join(scratch.arena, &params->cmd_line, &join_params);\r\n  }\r\n  \r\n  //- rjf: form environment\r\n  B32 use_null_env_arg = 0;\r\n  String8 env = {0};\r\n  {\r\n    StringJoin join_params2 = {0};\r\n    join_params2.sep = str8_lit(\"\\0\");\r\n    join_params2.post = str8_lit(\"\\0\");\r\n    String8List all_opts = params->env;\r\n    if(params->inherit_env != 0)\r\n    {\r\n      if(all_opts.node_count != 0)\r\n      {\r\n        MemoryZeroStruct(&all_opts);\r\n        for(String8Node *n = params->env.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(scratch.arena, &all_opts, n->string);\r\n        }\r\n        for(String8Node *n = os_w32_state.process_info.environment.first; n != 0; n = n->next)\r\n        {\r\n          str8_list_push(scratch.arena, &all_opts, n->string);\r\n        }\r\n      }\r\n      else\r\n      {\r\n        use_null_env_arg = 1;\r\n      }\r\n    }\r\n    if(use_null_env_arg == 0)\r\n    {\r\n      env = str8_list_join(scratch.arena, &all_opts, &join_params2);\r\n    }\r\n  }\r\n  \r\n  //- rjf: utf-8 -> utf-16\r\n  String16 cmd16 = str16_from_8(scratch.arena, cmd);\r\n  String16 dir16 = str16_from_8(scratch.arena, params->path);\r\n  String16 env16 = {0};\r\n  if(use_null_env_arg == 0)\r\n  {\r\n    env16 = str16_from_8(scratch.arena, env);\r\n  }\r\n  \r\n  //- rjf: determine creation flags\r\n  DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT;\r\n  if(params->consoleless)\r\n  {\r\n    creation_flags |= CREATE_NO_WINDOW;\r\n  }\r\n  \r\n  //- rjf: launch\r\n  BOOL inherit_handles = 0;\r\n  STARTUPINFOW startup_info = {sizeof(startup_info)};\r\n  if(!os_handle_match(params->stdout_file, os_handle_zero()))\r\n  {\r\n    HANDLE stdout_handle = (HANDLE)params->stdout_file.u64[0];\r\n    startup_info.hStdOutput = stdout_handle;\r\n    startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n    inherit_handles = 1;\r\n  }\r\n  if(!os_handle_match(params->stderr_file, os_handle_zero()))\r\n  {\r\n    HANDLE stderr_handle = (HANDLE)params->stderr_file.u64[0];\r\n    startup_info.hStdError = stderr_handle;\r\n    startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n    inherit_handles = 1;\r\n  }\r\n  if(!os_handle_match(params->stdin_file, os_handle_zero()))\r\n  {\r\n    HANDLE stdin_handle = (HANDLE)params->stdin_file.u64[0];\r\n    startup_info.hStdInput = stdin_handle;\r\n    startup_info.dwFlags |= STARTF_USESTDHANDLES;\r\n    inherit_handles = 1;\r\n  }\r\n  PROCESS_INFORMATION process_info = {0};\r\n  if(CreateProcessW(0, (WCHAR*)cmd16.str, 0, 0, inherit_handles, creation_flags, use_null_env_arg ? 0 : (WCHAR*)env16.str, (WCHAR*)dir16.str, &startup_info, &process_info))\r\n  {\r\n    result.u64[0] = (U64)process_info.hProcess;\r\n    CloseHandle(process_info.hThread);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_process_join(OS_Handle handle, U64 endt_us, U64 *exit_code_out)\r\n{\r\n  HANDLE process = (HANDLE)(handle.u64[0]);\r\n  DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  DWORD result = WaitForSingleObject(process, sleep_ms);\r\n  B32 process_joined = (result == WAIT_OBJECT_0);\r\n  if(process_joined && exit_code_out)\r\n  {\r\n    DWORD exit_code = 0;\r\n    if(GetExitCodeProcess(process, &exit_code))\r\n    {\r\n      *exit_code_out = exit_code;\r\n    }\r\n  }\r\n  return process_joined;\r\n}\r\n\r\ninternal B32\r\nos_process_kill(OS_Handle handle)\r\n{\r\n  HANDLE process = (HANDLE)handle.u64[0];\r\n  BOOL was_terminated = TerminateProcess(process, 999);\r\n  return was_terminated;\r\n}\r\n\r\ninternal void\r\nos_process_detach(OS_Handle handle)\r\n{\r\n  HANDLE process = (HANDLE)(handle.u64[0]);\r\n  CloseHandle(process);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Threads (Implemented Per-OS)\r\n\r\ninternal Thread\r\nos_thread_launch(ThreadEntryPointFunctionType *f, void *p)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Thread);\r\n  entity->thread.func = f;\r\n  entity->thread.ptr = p;\r\n  entity->thread.handle = CreateThread(0, 0, os_w32_thread_entry_point, entity, 0, &entity->thread.tid);\r\n  Thread result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_thread_join(Thread handle, U64 endt_us)\r\n{\r\n  DWORD sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  OS_W32_Entity *entity = (OS_W32_Entity *)PtrFromInt(handle.u64[0]);\r\n  DWORD wait_result = WAIT_OBJECT_0;\r\n  if(entity != 0)\r\n  {\r\n    wait_result = WaitForSingleObject(entity->thread.handle, sleep_ms);\r\n    CloseHandle(entity->thread.handle);\r\n    os_w32_entity_release(entity);\r\n  }\r\n  return (wait_result == WAIT_OBJECT_0);\r\n}\r\n\r\ninternal void\r\nos_thread_detach(Thread thread)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(thread.u64[0]);\r\n  if(entity != 0)\r\n  {\r\n    CloseHandle(entity->thread.handle);\r\n    os_w32_entity_release(entity);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Synchronization Primitives (Implemented Per-OS)\r\n\r\n//- rjf: mutexes\r\n\r\ninternal Mutex\r\nos_mutex_alloc(void)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Mutex);\r\n  InitializeCriticalSection(&entity->mutex);\r\n  Mutex result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_mutex_release(Mutex mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n  DeleteCriticalSection(&entity->mutex);\r\n  os_w32_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_mutex_take(Mutex mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n  EnterCriticalSection(&entity->mutex);\r\n}\r\n\r\ninternal void\r\nos_mutex_drop(Mutex mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n  LeaveCriticalSection(&entity->mutex);\r\n}\r\n\r\n//- rjf: reader/writer mutexes\r\n\r\ninternal RWMutex\r\nos_rw_mutex_alloc(void)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_RWMutex);\r\n  InitializeSRWLock(&entity->rw_mutex);\r\n  RWMutex result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_release(RWMutex rw_mutex)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  os_w32_entity_release(entity);\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_take(RWMutex rw_mutex, B32 write_mode)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  if(write_mode)\r\n  {\r\n    AcquireSRWLockExclusive(&entity->rw_mutex);\r\n  }\r\n  else\r\n  {\r\n    AcquireSRWLockShared(&entity->rw_mutex);\r\n  }\r\n}\r\n\r\ninternal void\r\nos_rw_mutex_drop(RWMutex rw_mutex, B32 write_mode)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(rw_mutex.u64[0]);\r\n  if(write_mode)\r\n  {\r\n    ReleaseSRWLockExclusive(&entity->rw_mutex);\r\n  }\r\n  else\r\n  {\r\n    ReleaseSRWLockShared(&entity->rw_mutex);\r\n  }\r\n}\r\n\r\n//- rjf: condition variables\r\n\r\ninternal CondVar\r\nos_cond_var_alloc(void)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_ConditionVariable);\r\n  InitializeConditionVariable(&entity->cv);\r\n  CondVar result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_cond_var_release(CondVar cv)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n  os_w32_entity_release(entity);\r\n}\r\n\r\ninternal B32\r\nos_cond_var_wait(CondVar cv, Mutex mutex, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  BOOL result = 0;\r\n  if(sleep_ms > 0)\r\n  {\r\n    OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n    OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex.u64[0]);\r\n    result = SleepConditionVariableCS(&entity->cv, &mutex_entity->mutex, sleep_ms);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_cond_var_wait_rw(CondVar cv, RWMutex mutex_rw, B32 write_mode, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  BOOL result = 0;\r\n  if(sleep_ms > 0)\r\n  {\r\n    OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n    OS_W32_Entity *mutex_entity = (OS_W32_Entity*)PtrFromInt(mutex_rw.u64[0]);\r\n    result = SleepConditionVariableSRW(&entity->cv, &mutex_entity->rw_mutex, sleep_ms,\r\n                                       write_mode ? 0 : CONDITION_VARIABLE_LOCKMODE_SHARED);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_cond_var_signal(CondVar cv)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n  WakeConditionVariable(&entity->cv);\r\n}\r\n\r\ninternal void\r\nos_cond_var_broadcast(CondVar cv)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(cv.u64[0]);\r\n  WakeAllConditionVariable(&entity->cv);\r\n}\r\n\r\n//- rjf: cross-process semaphores\r\n\r\ninternal Semaphore\r\nos_semaphore_alloc(U32 initial_count, U32 max_count, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE handle = CreateSemaphoreW(0, initial_count, max_count, (WCHAR *)name16.str);\r\n  Semaphore result = {(U64)handle};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_release(Semaphore semaphore)\r\n{\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  CloseHandle(handle);\r\n}\r\n\r\ninternal Semaphore\r\nos_semaphore_open(String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 name16 = str16_from_8(scratch.arena, name);\r\n  HANDLE handle = OpenSemaphoreW(SEMAPHORE_ALL_ACCESS, 0, (WCHAR *)name16.str);\r\n  Semaphore result = {(U64)handle};\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_close(Semaphore semaphore)\r\n{\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  CloseHandle(handle);\r\n}\r\n\r\ninternal B32\r\nos_semaphore_take(Semaphore semaphore, U64 endt_us)\r\n{\r\n  U32 sleep_ms = os_w32_sleep_ms_from_endt_us(endt_us);\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  DWORD wait_result = WaitForSingleObject(handle, sleep_ms);\r\n  B32 result = (wait_result == WAIT_OBJECT_0);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_semaphore_drop(Semaphore semaphore)\r\n{\r\n  HANDLE handle = (HANDLE)semaphore.u64[0];\r\n  ReleaseSemaphore(handle, 1, 0);\r\n}\r\n\r\n//- rjf: barriers\r\n\r\ninternal Barrier\r\nos_barrier_alloc(U64 count)\r\n{\r\n  OS_W32_Entity *entity = os_w32_entity_alloc(OS_W32_EntityKind_Barrier);\r\n  if(entity != 0)\r\n  {\r\n    BOOL init_good = InitializeSynchronizationBarrier(&entity->sb, count, -1);\r\n    (void)init_good;\r\n  }\r\n  Barrier result = {IntFromPtr(entity)};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_barrier_release(Barrier barrier)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]);\r\n  if(entity != 0)\r\n  {\r\n    DeleteSynchronizationBarrier(&entity->sb);\r\n    os_w32_entity_release(entity);\r\n  }\r\n}\r\n\r\ninternal void\r\nos_barrier_wait(Barrier barrier)\r\n{\r\n  OS_W32_Entity *entity = (OS_W32_Entity*)PtrFromInt(barrier.u64[0]);\r\n  if(entity != 0)\r\n  {\r\n    EnterSynchronizationBarrier(&entity->sb, 0);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Dynamically-Loaded Libraries (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_library_open(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 path16 = str16_from_8(scratch.arena, path);\r\n  HMODULE mod = LoadLibraryW((LPCWSTR)path16.str);\r\n  OS_Handle result = { (U64)mod };\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal VoidProc*\r\nos_library_load_proc(OS_Handle lib, String8 name)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  HMODULE mod = (HMODULE)lib.u64[0];\r\n  name = push_str8_copy(scratch.arena, name);\r\n  VoidProc *result = (VoidProc*)GetProcAddress(mod, (LPCSTR)name.str);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_library_close(OS_Handle lib)\r\n{\r\n  HMODULE mod = (HMODULE)lib.u64[0];\r\n  FreeLibrary(mod);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Safe Calls (Implemented Per-OS)\r\n\r\ninternal void\r\nos_safe_call(ThreadEntryPointFunctionType *func, ThreadEntryPointFunctionType *fail_handler, void *ptr)\r\n{\r\n  __try\r\n  {\r\n    func(ptr);\r\n  }\r\n  __except (EXCEPTION_EXECUTE_HANDLER)\r\n  {\r\n    if(fail_handler != 0)\r\n    {\r\n      fail_handler(ptr);\r\n    }\r\n    ExitProcess(1);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks GUIDs (Implemented Per-OS)\r\n\r\ninternal Guid\r\nos_make_guid(void)\r\n{\r\n  Guid result; MemoryZeroStruct(&result);\r\n  UUID uuid;\r\n  RPC_STATUS rpc_status = UuidCreate(&uuid);\r\n  if(rpc_status == RPC_S_OK)\r\n  {\r\n    result.data1 = uuid.Data1;\r\n    result.data2 = uuid.Data2;\r\n    result.data3 = uuid.Data3;\r\n    MemoryCopyArray(result.data4, uuid.Data4);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Entry Points (Implemented Per-OS)\r\n\r\n#include <dbghelp.h>\r\n#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside\r\n#include <shlwapi.h>\r\n\r\ninternal B32 win32_g_is_quiet = 0;\r\ninternal B32 win32_g_gen_dump = 0;\r\n\r\ninternal HRESULT WINAPI\r\nwin32_dialog_callback(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam, LONG_PTR data)\r\n{\r\n  if(msg == TDN_HYPERLINK_CLICKED)\r\n  {\r\n    ShellExecuteW(NULL, L\"open\", (LPWSTR)lparam, NULL, NULL, SW_SHOWNORMAL);\r\n  }\r\n  return S_OK;\r\n}\r\n\r\ninternal LONG WINAPI\r\nwin32_exception_filter(EXCEPTION_POINTERS* exception_ptrs)\r\n{\r\n  if(win32_g_is_quiet)\r\n  {\r\n    ExitProcess(1);\r\n  }\r\n  \r\n  static volatile LONG first = 0;\r\n  if(InterlockedCompareExchange(&first, 1, 0) != 0)\r\n  {\r\n    // prevent failures in other threads to popup same message box\r\n    // this handler just shows first thread that crashes\r\n    // we are terminating afterwards anyway\r\n    for (;;) Sleep(1000);\r\n  }\r\n  \r\n  WCHAR buffer[4096] = {0};\r\n  int buflen = 0;\r\n  \r\n  DWORD exception_code = exception_ptrs->ExceptionRecord->ExceptionCode;\r\n  buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"A fatal exception (code 0x%x) occurred. The process is terminating.\\n\", exception_code);\r\n  \r\n  // load dbghelp dynamically just in case if it is missing\r\n  BOOL (WINAPI *dbg_MiniDumpWriteDump)(HANDLE hProcess, DWORD ProcessId, HANDLE hFile, MINIDUMP_TYPE DumpType, PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam, PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam, PMINIDUMP_CALLBACK_INFORMATION CallbackParam) = 0;\r\n  HMODULE dbghelp = LoadLibraryA(\"dbghelp.dll\");\r\n  if(dbghelp)\r\n  {\r\n    DWORD (WINAPI *dbg_SymSetOptions)(DWORD SymOptions);\r\n    BOOL (WINAPI *dbg_SymInitializeW)(HANDLE hProcess, PCWSTR UserSearchPath, BOOL fInvadeProcess);\r\n    BOOL (WINAPI *dbg_StackWalk64)(DWORD MachineType, HANDLE hProcess, HANDLE hThread,\r\n                                   LPSTACKFRAME64 StackFrame, PVOID ContextRecord, PREAD_PROCESS_MEMORY_ROUTINE64 ReadMemoryRoutine,\r\n                                   PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine, PGET_MODULE_BASE_ROUTINE64 GetModuleBaseRoutine,\r\n                                   PTRANSLATE_ADDRESS_ROUTINE64 TranslateAddress);\r\n    PVOID (WINAPI *dbg_SymFunctionTableAccess64)(HANDLE hProcess, DWORD64 AddrBase);\r\n    DWORD64 (WINAPI *dbg_SymGetModuleBase64)(HANDLE hProcess, DWORD64 qwAddr);\r\n    BOOL (WINAPI *dbg_SymFromAddrW)(HANDLE hProcess, DWORD64 Address, PDWORD64 Displacement, PSYMBOL_INFOW Symbol);\r\n    BOOL (WINAPI *dbg_SymGetLineFromAddrW64)(HANDLE hProcess, DWORD64 dwAddr, PDWORD pdwDisplacement, PIMAGEHLP_LINEW64 Line);\r\n    BOOL (WINAPI *dbg_SymGetModuleInfoW64)(HANDLE hProcess, DWORD64 qwAddr, PIMAGEHLP_MODULEW64 ModuleInfo);\r\n    \r\n    *(FARPROC*)&dbg_SymSetOptions            = GetProcAddress(dbghelp, \"SymSetOptions\");\r\n    *(FARPROC*)&dbg_SymInitializeW           = GetProcAddress(dbghelp, \"SymInitializeW\");\r\n    *(FARPROC*)&dbg_StackWalk64              = GetProcAddress(dbghelp, \"StackWalk64\");\r\n    *(FARPROC*)&dbg_SymFunctionTableAccess64 = GetProcAddress(dbghelp, \"SymFunctionTableAccess64\");\r\n    *(FARPROC*)&dbg_SymGetModuleBase64       = GetProcAddress(dbghelp, \"SymGetModuleBase64\");\r\n    *(FARPROC*)&dbg_SymFromAddrW             = GetProcAddress(dbghelp, \"SymFromAddrW\");\r\n    *(FARPROC*)&dbg_SymGetLineFromAddrW64    = GetProcAddress(dbghelp, \"SymGetLineFromAddrW64\");\r\n    *(FARPROC*)&dbg_SymGetModuleInfoW64      = GetProcAddress(dbghelp, \"SymGetModuleInfoW64\");\r\n    *(FARPROC*)&dbg_MiniDumpWriteDump        = GetProcAddress(dbghelp, \"MiniDumpWriteDump\");\r\n    \r\n    if(dbg_SymSetOptions && dbg_SymInitializeW && dbg_StackWalk64 && dbg_SymFunctionTableAccess64 && dbg_SymGetModuleBase64 && dbg_SymFromAddrW && dbg_SymGetLineFromAddrW64 && dbg_SymGetModuleInfoW64)\r\n    {\r\n      HANDLE process = GetCurrentProcess();\r\n      HANDLE thread = GetCurrentThread();\r\n      CONTEXT* context = exception_ptrs->ContextRecord;\r\n      \r\n      WCHAR module_path[MAX_PATH];\r\n      GetModuleFileNameW(NULL, module_path, ArrayCount(module_path));\r\n      PathRemoveFileSpecW(module_path);\r\n      \r\n      dbg_SymSetOptions(SYMOPT_EXACT_SYMBOLS | SYMOPT_FAIL_CRITICAL_ERRORS | SYMOPT_LOAD_LINES | SYMOPT_UNDNAME);\r\n      if(dbg_SymInitializeW(process, module_path, TRUE))\r\n      {\r\n        // check that raddbg.pdb file is good\r\n        B32 raddbg_pdb_valid = 0;\r\n        {\r\n          IMAGEHLP_MODULEW64 module = {0};\r\n          module.SizeOfStruct = sizeof(module);\r\n          if(dbg_SymGetModuleInfoW64(process, (DWORD64)&win32_exception_filter, &module))\r\n          {\r\n            raddbg_pdb_valid = (module.SymType == SymPdb);\r\n          }\r\n        }\r\n        \r\n        if(!raddbg_pdb_valid)\r\n        {\r\n          buflen += wnsprintfW(buffer + buflen, sizeof(buffer) - buflen,\r\n                               L\"\\nThe PDB debug information file for this executable is not valid or was not found. Please rebuild binary to get the call stack.\\n\");\r\n        }\r\n        else\r\n        {\r\n          STACKFRAME64 frame = {0};\r\n          DWORD image_type;\r\n#if defined(_M_AMD64)\r\n          image_type = IMAGE_FILE_MACHINE_AMD64;\r\n          frame.AddrPC.Offset = context->Rip;\r\n          frame.AddrPC.Mode = AddrModeFlat;\r\n          frame.AddrFrame.Offset = context->Rbp;\r\n          frame.AddrFrame.Mode = AddrModeFlat;\r\n          frame.AddrStack.Offset = context->Rsp;\r\n          frame.AddrStack.Mode = AddrModeFlat;\r\n#elif defined(_M_ARM64)\r\n          image_type = IMAGE_FILE_MACHINE_ARM64;\r\n          frame.AddrPC.Offset = context->Pc;\r\n          frame.AddrPC.Mode = AddrModeFlat;\r\n          frame.AddrFrame.Offset = context->Fp;\r\n          frame.AddrFrame.Mode = AddrModeFlat;\r\n          frame.AddrStack.Offset = context->Sp;\r\n          frame.AddrStack.Mode = AddrModeFlat;\r\n#else\r\n#  error Arch not supported!\r\n#endif\r\n          \r\n          for(U32 idx=0; ;idx++)\r\n          {\r\n            const U32 max_frames = 32;\r\n            if(idx == max_frames)\r\n            {\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"...\");\r\n              break;\r\n            }\r\n            \r\n            if(!dbg_StackWalk64(image_type, process, thread, &frame, context, 0, dbg_SymFunctionTableAccess64, dbg_SymGetModuleBase64, 0))\r\n            {\r\n              break;\r\n            }\r\n            \r\n            U64 address = frame.AddrPC.Offset;\r\n            if(address == 0)\r\n            {\r\n              break;\r\n            }\r\n            \r\n            if(idx==0)\r\n            {\r\n#if BUILD_CONSOLE_INTERFACE\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"\\nCreate a new issue with this report at %S.\\n\\n\", BUILD_ISSUES_LINK_STRING_LITERAL);\r\n#else\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen,\r\n                                   L\"\\nPress Ctrl+C to copy this text to clipboard, then create a new issue at\\n\"\r\n                                   L\"<a href=\\\"%S\\\">%S</a>\\n\\n\", BUILD_ISSUES_LINK_STRING_LITERAL, BUILD_ISSUES_LINK_STRING_LITERAL);\r\n#endif\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"Call stack:\\n\");\r\n            }\r\n            \r\n            buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"%u. [0x%I64x]\", idx + 1, address);\r\n            \r\n            struct {\r\n              SYMBOL_INFOW info;\r\n              WCHAR name[MAX_SYM_NAME];\r\n            } symbol = {0};\r\n            \r\n            symbol.info.SizeOfStruct = sizeof(symbol.info);\r\n            symbol.info.MaxNameLen = MAX_SYM_NAME;\r\n            \r\n            DWORD64 displacement = 0;\r\n            if(dbg_SymFromAddrW(process, address, &displacement, &symbol.info))\r\n            {\r\n              buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\" %s +%u\", symbol.info.Name, (DWORD)displacement);\r\n              \r\n              IMAGEHLP_LINEW64 line = {0};\r\n              line.SizeOfStruct = sizeof(line);\r\n              \r\n              DWORD line_displacement = 0;\r\n              if(dbg_SymGetLineFromAddrW64(process, address, &line_displacement, &line))\r\n              {\r\n                buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\", %s line %u\", PathFindFileNameW(line.FileName), line.LineNumber);\r\n              }\r\n            }\r\n            else\r\n            {\r\n              IMAGEHLP_MODULEW64 module = {0};\r\n              module.SizeOfStruct = sizeof(module);\r\n              if(dbg_SymGetModuleInfoW64(process, address, &module))\r\n              {\r\n                buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\" %s\", module.ModuleName);\r\n              }\r\n            }\r\n            \r\n            buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"\\n\");\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  buflen += wnsprintfW(buffer + buflen, ArrayCount(buffer) - buflen, L\"\\nVersion: %S%S\", BUILD_VERSION_STRING_LITERAL, BUILD_GIT_HASH_STRING_LITERAL_APPEND);\r\n  \r\n  B32 generate_crash_dump = win32_g_gen_dump;\r\n#if BUILD_CONSOLE_INTERFACE\r\n  fwprintf(stderr, L\"\\n--- Fatal Exception ---\\n\");\r\n  fwprintf(stderr, L\"%s\\n\\n\", buffer);\r\n#else\r\n  int selected_button = 0;\r\n  TASKDIALOG_BUTTON generate_dump = {1, L\"Generate Crash Dump File\"};\r\n  TASKDIALOGCONFIG dialog = {0};\r\n  dialog.cbSize = sizeof(dialog);\r\n  dialog.dwFlags = TDF_SIZE_TO_CONTENT | TDF_ENABLE_HYPERLINKS | TDF_ALLOW_DIALOG_CANCELLATION;\r\n  dialog.pszMainIcon = TD_ERROR_ICON;\r\n  dialog.dwCommonButtons = TDCBF_CLOSE_BUTTON;\r\n  dialog.pszWindowTitle = L\"Fatal Exception\";\r\n  dialog.pszContent = buffer;\r\n  dialog.pfCallback = &win32_dialog_callback;\r\n  dialog.cButtons = 1;\r\n  dialog.pButtons = &generate_dump;\r\n  TaskDialogIndirect(&dialog, &selected_button, 0, 0);\r\n  generate_crash_dump = (selected_button == generate_dump.nButtonID);\r\n#endif\r\n  \r\n  if(dbg_MiniDumpWriteDump && generate_crash_dump)\r\n  {\r\n    WCHAR desktop_path[512] = {0};\r\n    SHGetFolderPathW(0, CSIDL_DESKTOP, 0, 0, desktop_path);\r\n    WCHAR dump_file_path[512] = {0};\r\n    wnsprintfW(dump_file_path, ArrayCount(dump_file_path), L\"%s\\\\raddbg_crash_dump.dmp\", desktop_path);\r\n    SECURITY_ATTRIBUTES security_attributes = {sizeof(security_attributes), 0, 0};\r\n    HANDLE file = CreateFileW(dump_file_path, GENERIC_WRITE, 0, &security_attributes, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);\r\n    BOOL dump_successful = dbg_MiniDumpWriteDump(GetCurrentProcess(), os_get_process_info()->pid, file, MiniDumpNormal, 0, 0, 0);\r\n    CloseHandle(file);\r\n    (void)dump_successful;\r\n  }\r\n  \r\n  ExitProcess(1);\r\n}\r\n\r\n#undef OS_WINDOWS // shlwapi uses its own OS_WINDOWS include inside\r\n#define OS_WINDOWS 1\r\n\r\ninternal void\r\nw32_entry_point_caller(int argc, WCHAR **wargv)\r\n{\r\n  SetUnhandledExceptionFilter(&win32_exception_filter);\r\n  \r\n  //- rjf: dynamically load windows functions which are not guaranteed\r\n  // in all SDKs\r\n  {\r\n    HMODULE module = LoadLibraryA(\"kernel32.dll\");\r\n    w32_SetThreadDescription_func = (W32_SetThreadDescription_Type *)GetProcAddress(module, \"SetThreadDescription\");\r\n    FreeLibrary(module);\r\n  }\r\n  \r\n  //- rjf: try to allow large pages if we can\r\n  B32 large_pages_allowed = 0;\r\n  {\r\n    HANDLE token;\r\n    if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &token))\r\n    {\r\n      LUID luid;\r\n      if(LookupPrivilegeValue(0, SE_LOCK_MEMORY_NAME, &luid))\r\n      {\r\n        TOKEN_PRIVILEGES priv;\r\n        priv.PrivilegeCount           = 1;\r\n        priv.Privileges[0].Luid       = luid;\r\n        priv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;\r\n        large_pages_allowed = !!AdjustTokenPrivileges(token, 0, &priv, sizeof(priv), 0, 0);\r\n      }\r\n      CloseHandle(token);\r\n    }\r\n  }\r\n  \r\n  //- rjf: get RIO extension function table\r\n  {\r\n    // NOTE(mmozeiko): need to get function pointers to RIO functions, and that requires dummy socket\r\n    WSADATA WinSockData;\r\n    WSAStartup(MAKEWORD(2, 2), &WinSockData);\r\n    GUID guid = WSAID_MULTIPLE_RIO;\r\n    DWORD rio_byte = 0;\r\n    SOCKET Sock = socket(AF_UNSPEC, SOCK_STREAM, IPPROTO_TCP);\r\n    WSAIoctl(Sock, SIO_GET_MULTIPLE_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), (void**)&w32_rio_functions, sizeof(w32_rio_functions), &rio_byte, 0, 0);\r\n    closesocket(Sock);\r\n  }\r\n  \r\n  //- rjf: get system info\r\n  SYSTEM_INFO sysinfo = {0};\r\n  GetSystemInfo(&sysinfo);\r\n  \r\n  //- rjf: set up non-dynamically-alloc'd state\r\n  //\r\n  // (we need to set up some basics before this layer can supply\r\n  // memory allocation primitives)\r\n  {\r\n    os_w32_state.microsecond_resolution  = 1;\r\n    LARGE_INTEGER large_int_resolution;\r\n    if(QueryPerformanceFrequency(&large_int_resolution))\r\n    {\r\n      os_w32_state.microsecond_resolution = large_int_resolution.QuadPart;\r\n    }\r\n  }\r\n  {\r\n    OS_SystemInfo *info = &os_w32_state.system_info;\r\n    info->logical_processor_count = (U64)sysinfo.dwNumberOfProcessors;\r\n    info->page_size               = sysinfo.dwPageSize;\r\n    info->large_page_size         = GetLargePageMinimum();\r\n    info->allocation_granularity  = sysinfo.dwAllocationGranularity;\r\n  }\r\n  {\r\n    OS_ProcessInfo *info = &os_w32_state.process_info;\r\n    info->large_pages_allowed = large_pages_allowed;\r\n    info->pid = GetCurrentProcessId();\r\n  }\r\n  \r\n  //- rjf: extract arguments\r\n  Arena *args_arena = arena_alloc(.reserve_size = MB(1), .commit_size = KB(32));\r\n  char **argv = push_array(args_arena, char *, argc);\r\n  for(int i = 0; i < argc; i += 1)\r\n  {\r\n    String16 arg16 = str16_cstring((U16 *)wargv[i]);\r\n    String8 arg8 = str8_from_16(args_arena, arg16);\r\n    if(str8_match(arg8, str8_lit(\"--quiet\"), StringMatchFlag_CaseInsensitive) ||\r\n       str8_match(arg8, str8_lit(\"-quiet\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      win32_g_is_quiet = 1;\r\n    }\r\n    if(str8_match(arg8, str8_lit(\"--large_pages\"), StringMatchFlag_CaseInsensitive) ||\r\n       str8_match(arg8, str8_lit(\"-large_pages\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      arena_default_flags        = ArenaFlag_LargePages;\r\n      arena_default_reserve_size = Max(MB(64), os_w32_state.system_info.large_page_size);\r\n      arena_default_commit_size  = arena_default_reserve_size;\r\n    }\r\n    if(str8_match(arg8, str8_lit(\"--gen_crash_dump\"), StringMatchFlag_CaseInsensitive) ||\r\n       str8_match(arg8, str8_lit(\"-gen_crash_dump\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      win32_g_gen_dump = 1;\r\n    }\r\n    argv[i] = (char *)arg8.str;\r\n  }\r\n  \r\n  //- rjf: set up thread context\r\n  TCTX *tctx = tctx_alloc();\r\n  tctx_select(tctx);\r\n  \r\n  //- rjf: set up dynamically-alloc'd state\r\n  Arena *arena = arena_alloc();\r\n  {\r\n    os_w32_state.arena = arena;\r\n    {\r\n      OS_SystemInfo *info = &os_w32_state.system_info;\r\n      U8 buffer[MAX_COMPUTERNAME_LENGTH + 1] = {0};\r\n      DWORD size = MAX_COMPUTERNAME_LENGTH + 1;\r\n      if(GetComputerNameA((char*)buffer, &size))\r\n      {\r\n        info->machine_name = push_str8_copy(arena, str8(buffer, size));\r\n      }\r\n    }\r\n  }\r\n  {\r\n    OS_ProcessInfo *info = &os_w32_state.process_info;\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      DWORD size = KB(32);\r\n      U16 *buffer = push_array_no_zero(scratch.arena, U16, size);\r\n      DWORD length = GetModuleFileNameW(0, (WCHAR*)buffer, size);\r\n      String8 name8 = str8_from_16(scratch.arena, str16(buffer, length));\r\n      String8 name_chopped = str8_chop_last_slash(name8);\r\n      info->binary_path = push_str8_copy(arena, name_chopped);\r\n      scratch_end(scratch);\r\n    }\r\n    info->initial_path = os_get_current_path(arena);\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      U64 size = KB(32);\r\n      U16 *buffer = push_array_no_zero(scratch.arena, U16, size);\r\n      if(SUCCEEDED(SHGetFolderPathW(0, CSIDL_APPDATA, 0, 0, (WCHAR*)buffer)))\r\n      {\r\n        info->user_program_data_path = str8_from_16(arena, str16_cstring(buffer));\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n    {\r\n      WCHAR *this_proc_env = GetEnvironmentStringsW();\r\n      U64 start_idx = 0;\r\n      for(U64 idx = 0;; idx += 1)\r\n      {\r\n        if(this_proc_env[idx] == 0)\r\n        {\r\n          if(start_idx == idx)\r\n          {\r\n            break;\r\n          }\r\n          else\r\n          {\r\n            String16 string16 = str16((U16 *)this_proc_env + start_idx, idx - start_idx);\r\n            String8 string = str8_from_16(arena, string16);\r\n            str8_list_push(arena, &info->environment, string);\r\n            start_idx = idx+1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: set up entity storage\r\n  InitializeCriticalSection(&os_w32_state.entity_mutex);\r\n  os_w32_state.entity_arena = arena_alloc();\r\n  \r\n  //- rjf: call into \"real\" entry point\r\n  main_thread_base_entry_point(argc, argv);\r\n}\r\n\r\n#if BUILD_CONSOLE_INTERFACE\r\nint wmain(int argc, WCHAR **argv)\r\n{\r\n  w32_entry_point_caller(argc, argv);\r\n  return 0;\r\n}\r\n#else\r\nint wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLine, int nShowCmd)\r\n{\r\n  w32_entry_point_caller(__argc, __wargv);\r\n  return 0;\r\n}\r\n#endif\r\n"
  },
  {
    "path": "src/os/core/win32/os_core_win32.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_CORE_WIN32_H\r\n#define OS_CORE_WIN32_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes / Libraries\r\n\r\n#include <winsock2.h>\r\n#include <mswsock.h>\r\n#include <windows.h>\r\n#include <windowsx.h>\r\n#include <timeapi.h>\r\n#include <tlhelp32.h>\r\n#include <Shlobj.h>\r\n#include <processthreadsapi.h>\r\n#pragma comment(lib, \"user32\")\r\n#pragma comment(lib, \"winmm\")\r\n#pragma comment(lib, \"shell32\")\r\n#pragma comment(lib, \"advapi32\")\r\n#pragma comment(lib, \"rpcrt4\")\r\n#pragma comment(lib, \"shlwapi\")\r\n#pragma comment(lib, \"comctl32\")\r\n#pragma comment(lib, \"ws2_32\")\r\n#pragma comment(linker,\"\\\"/manifestdependency:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\\\"\") // this is required for loading correct comctl32 dll file\r\n\r\n////////////////////////////////\r\n//~ rjf: File Iterator Types\r\n\r\ntypedef struct OS_W32_FileIter OS_W32_FileIter;\r\nstruct OS_W32_FileIter\r\n{\r\n  HANDLE handle;\r\n  WIN32_FIND_DATAW find_data;\r\n  B32 is_volume_iter;\r\n  String8Array drive_strings;\r\n  U64 drive_strings_iter_idx;\r\n};\r\nStaticAssert(sizeof(Member(OS_FileIter, memory)) >= sizeof(OS_W32_FileIter), file_iter_memory_size);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Types\r\n\r\ntypedef enum OS_W32_EntityKind\r\n{\r\n  OS_W32_EntityKind_Null,\r\n  OS_W32_EntityKind_Thread,\r\n  OS_W32_EntityKind_Mutex,\r\n  OS_W32_EntityKind_RWMutex,\r\n  OS_W32_EntityKind_ConditionVariable,\r\n  OS_W32_EntityKind_Barrier,\r\n}\r\nOS_W32_EntityKind;\r\n\r\ntypedef struct OS_W32_Entity OS_W32_Entity;\r\nstruct OS_W32_Entity\r\n{\r\n  OS_W32_Entity *next;\r\n  OS_W32_EntityKind kind;\r\n  union\r\n  {\r\n    struct\r\n    {\r\n      ThreadEntryPointFunctionType *func;\r\n      void *ptr;\r\n      HANDLE handle;\r\n      DWORD tid;\r\n    } thread;\r\n    CRITICAL_SECTION mutex;\r\n    SRWLOCK rw_mutex;\r\n    CONDITION_VARIABLE cv;\r\n    SYNCHRONIZATION_BARRIER sb;\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: State\r\n\r\ntypedef struct OS_W32_State OS_W32_State;\r\nstruct OS_W32_State\r\n{\r\n  Arena *arena;\r\n  \r\n  // rjf: info\r\n  OS_SystemInfo system_info;\r\n  OS_ProcessInfo process_info;\r\n  U64 microsecond_resolution;\r\n  \r\n  // rjf: entity storage\r\n  CRITICAL_SECTION entity_mutex;\r\n  Arena *entity_arena;\r\n  OS_W32_Entity *entity_free;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal OS_W32_State os_w32_state = {0};\r\n\r\n////////////////////////////////\r\n//~ rjf: File Info Conversion Helpers\r\n\r\ninternal FilePropertyFlags os_w32_file_property_flags_from_dwFileAttributes(DWORD dwFileAttributes);\r\ninternal void os_w32_file_properties_from_attribute_data(FileProperties *properties, WIN32_FILE_ATTRIBUTE_DATA *attributes);\r\n\r\n////////////////////////////////\r\n//~ rjf: Time Conversion Helpers\r\n\r\ninternal void os_w32_date_time_from_system_time(DateTime *out, SYSTEMTIME *in);\r\ninternal void os_w32_system_time_from_date_time(SYSTEMTIME *out, DateTime *in);\r\ninternal void os_w32_dense_time_from_file_time(DenseTime *out, FILETIME *in);\r\ninternal U32 os_w32_sleep_ms_from_endt_us(U64 endt_us);\r\n\r\n////////////////////////////////\r\n//~ rjf: Entity Functions\r\n\r\ninternal OS_W32_Entity *os_w32_entity_alloc(OS_W32_EntityKind kind);\r\ninternal void os_w32_entity_release(OS_W32_Entity *entity);\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Entry Point\r\n\r\ninternal DWORD os_w32_thread_entry_point(void *ptr);\r\n\r\n#endif // OS_CORE_WIN32_H\r\n"
  },
  {
    "path": "src/os/gfx/generated/os_gfx.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 os_g_key_display_string_table[143] =\r\n{\r\nstr8_lit_comp(\"Invalid Key\"),\r\nstr8_lit_comp(\"Escape\"),\r\nstr8_lit_comp(\"F1\"),\r\nstr8_lit_comp(\"F2\"),\r\nstr8_lit_comp(\"F3\"),\r\nstr8_lit_comp(\"F4\"),\r\nstr8_lit_comp(\"F5\"),\r\nstr8_lit_comp(\"F6\"),\r\nstr8_lit_comp(\"F7\"),\r\nstr8_lit_comp(\"F8\"),\r\nstr8_lit_comp(\"F9\"),\r\nstr8_lit_comp(\"F10\"),\r\nstr8_lit_comp(\"F11\"),\r\nstr8_lit_comp(\"F12\"),\r\nstr8_lit_comp(\"F13\"),\r\nstr8_lit_comp(\"F14\"),\r\nstr8_lit_comp(\"F15\"),\r\nstr8_lit_comp(\"F16\"),\r\nstr8_lit_comp(\"F17\"),\r\nstr8_lit_comp(\"F18\"),\r\nstr8_lit_comp(\"F19\"),\r\nstr8_lit_comp(\"F20\"),\r\nstr8_lit_comp(\"F21\"),\r\nstr8_lit_comp(\"F22\"),\r\nstr8_lit_comp(\"F23\"),\r\nstr8_lit_comp(\"F24\"),\r\nstr8_lit_comp(\"Tick\"),\r\nstr8_lit_comp(\"0\"),\r\nstr8_lit_comp(\"1\"),\r\nstr8_lit_comp(\"2\"),\r\nstr8_lit_comp(\"3\"),\r\nstr8_lit_comp(\"4\"),\r\nstr8_lit_comp(\"5\"),\r\nstr8_lit_comp(\"6\"),\r\nstr8_lit_comp(\"7\"),\r\nstr8_lit_comp(\"8\"),\r\nstr8_lit_comp(\"9\"),\r\nstr8_lit_comp(\"Minus\"),\r\nstr8_lit_comp(\"Equal\"),\r\nstr8_lit_comp(\"Backspace\"),\r\nstr8_lit_comp(\"Tab\"),\r\nstr8_lit_comp(\"Q\"),\r\nstr8_lit_comp(\"W\"),\r\nstr8_lit_comp(\"E\"),\r\nstr8_lit_comp(\"R\"),\r\nstr8_lit_comp(\"T\"),\r\nstr8_lit_comp(\"Y\"),\r\nstr8_lit_comp(\"U\"),\r\nstr8_lit_comp(\"I\"),\r\nstr8_lit_comp(\"O\"),\r\nstr8_lit_comp(\"P\"),\r\nstr8_lit_comp(\"Left Bracket\"),\r\nstr8_lit_comp(\"Right Bracket\"),\r\nstr8_lit_comp(\"Back Slash\"),\r\nstr8_lit_comp(\"Caps Lock\"),\r\nstr8_lit_comp(\"A\"),\r\nstr8_lit_comp(\"S\"),\r\nstr8_lit_comp(\"D\"),\r\nstr8_lit_comp(\"F\"),\r\nstr8_lit_comp(\"G\"),\r\nstr8_lit_comp(\"H\"),\r\nstr8_lit_comp(\"J\"),\r\nstr8_lit_comp(\"K\"),\r\nstr8_lit_comp(\"L\"),\r\nstr8_lit_comp(\"Semicolon\"),\r\nstr8_lit_comp(\"Quote\"),\r\nstr8_lit_comp(\"Return\"),\r\nstr8_lit_comp(\"Shift\"),\r\nstr8_lit_comp(\"Z\"),\r\nstr8_lit_comp(\"X\"),\r\nstr8_lit_comp(\"C\"),\r\nstr8_lit_comp(\"V\"),\r\nstr8_lit_comp(\"B\"),\r\nstr8_lit_comp(\"N\"),\r\nstr8_lit_comp(\"M\"),\r\nstr8_lit_comp(\"Comma\"),\r\nstr8_lit_comp(\"Period\"),\r\nstr8_lit_comp(\"Slash\"),\r\nstr8_lit_comp(\"Ctrl\"),\r\nstr8_lit_comp(\"Alt\"),\r\nstr8_lit_comp(\"Space\"),\r\nstr8_lit_comp(\"Menu\"),\r\nstr8_lit_comp(\"Scroll Lock\"),\r\nstr8_lit_comp(\"Pause\"),\r\nstr8_lit_comp(\"Insert\"),\r\nstr8_lit_comp(\"Home\"),\r\nstr8_lit_comp(\"Page Up\"),\r\nstr8_lit_comp(\"Delete\"),\r\nstr8_lit_comp(\"End\"),\r\nstr8_lit_comp(\"Page Down\"),\r\nstr8_lit_comp(\"Up\"),\r\nstr8_lit_comp(\"Left\"),\r\nstr8_lit_comp(\"Down\"),\r\nstr8_lit_comp(\"Right\"),\r\nstr8_lit_comp(\"Ex0\"),\r\nstr8_lit_comp(\"Ex1\"),\r\nstr8_lit_comp(\"Ex2\"),\r\nstr8_lit_comp(\"Ex3\"),\r\nstr8_lit_comp(\"Ex4\"),\r\nstr8_lit_comp(\"Ex5\"),\r\nstr8_lit_comp(\"Ex6\"),\r\nstr8_lit_comp(\"Ex7\"),\r\nstr8_lit_comp(\"Ex8\"),\r\nstr8_lit_comp(\"Ex9\"),\r\nstr8_lit_comp(\"Ex10\"),\r\nstr8_lit_comp(\"Ex11\"),\r\nstr8_lit_comp(\"Ex12\"),\r\nstr8_lit_comp(\"Ex13\"),\r\nstr8_lit_comp(\"Ex14\"),\r\nstr8_lit_comp(\"Ex15\"),\r\nstr8_lit_comp(\"Ex16\"),\r\nstr8_lit_comp(\"Ex17\"),\r\nstr8_lit_comp(\"Ex18\"),\r\nstr8_lit_comp(\"Ex19\"),\r\nstr8_lit_comp(\"Ex20\"),\r\nstr8_lit_comp(\"Ex21\"),\r\nstr8_lit_comp(\"Ex22\"),\r\nstr8_lit_comp(\"Ex23\"),\r\nstr8_lit_comp(\"Ex24\"),\r\nstr8_lit_comp(\"Ex25\"),\r\nstr8_lit_comp(\"Ex26\"),\r\nstr8_lit_comp(\"Ex27\"),\r\nstr8_lit_comp(\"Ex28\"),\r\nstr8_lit_comp(\"Ex29\"),\r\nstr8_lit_comp(\"Num Lock\"),\r\nstr8_lit_comp(\"Numpad Slash\"),\r\nstr8_lit_comp(\"Numpad Star\"),\r\nstr8_lit_comp(\"Numpad Minus\"),\r\nstr8_lit_comp(\"Numpad Plus\"),\r\nstr8_lit_comp(\"Numpad Period\"),\r\nstr8_lit_comp(\"Numpad 0\"),\r\nstr8_lit_comp(\"Numpad 1\"),\r\nstr8_lit_comp(\"Numpad 2\"),\r\nstr8_lit_comp(\"Numpad 3\"),\r\nstr8_lit_comp(\"Numpad 4\"),\r\nstr8_lit_comp(\"Numpad 5\"),\r\nstr8_lit_comp(\"Numpad 6\"),\r\nstr8_lit_comp(\"Numpad 7\"),\r\nstr8_lit_comp(\"Numpad 8\"),\r\nstr8_lit_comp(\"Numpad 9\"),\r\nstr8_lit_comp(\"Left Mouse Button\"),\r\nstr8_lit_comp(\"Middle Mouse Button\"),\r\nstr8_lit_comp(\"Right Mouse Button\"),\r\n};\r\n\r\nString8 os_g_key_cfg_string_table[143] =\r\n{\r\nstr8_lit_comp(\"null\"),\r\nstr8_lit_comp(\"esc\"),\r\nstr8_lit_comp(\"f1\"),\r\nstr8_lit_comp(\"f2\"),\r\nstr8_lit_comp(\"f3\"),\r\nstr8_lit_comp(\"f4\"),\r\nstr8_lit_comp(\"f5\"),\r\nstr8_lit_comp(\"f6\"),\r\nstr8_lit_comp(\"f7\"),\r\nstr8_lit_comp(\"f8\"),\r\nstr8_lit_comp(\"f9\"),\r\nstr8_lit_comp(\"f10\"),\r\nstr8_lit_comp(\"f11\"),\r\nstr8_lit_comp(\"f12\"),\r\nstr8_lit_comp(\"f13\"),\r\nstr8_lit_comp(\"f14\"),\r\nstr8_lit_comp(\"f15\"),\r\nstr8_lit_comp(\"f16\"),\r\nstr8_lit_comp(\"f17\"),\r\nstr8_lit_comp(\"f18\"),\r\nstr8_lit_comp(\"f19\"),\r\nstr8_lit_comp(\"f20\"),\r\nstr8_lit_comp(\"f21\"),\r\nstr8_lit_comp(\"f22\"),\r\nstr8_lit_comp(\"f23\"),\r\nstr8_lit_comp(\"f24\"),\r\nstr8_lit_comp(\"tick\"),\r\nstr8_lit_comp(\"0\"),\r\nstr8_lit_comp(\"1\"),\r\nstr8_lit_comp(\"2\"),\r\nstr8_lit_comp(\"3\"),\r\nstr8_lit_comp(\"4\"),\r\nstr8_lit_comp(\"5\"),\r\nstr8_lit_comp(\"6\"),\r\nstr8_lit_comp(\"7\"),\r\nstr8_lit_comp(\"8\"),\r\nstr8_lit_comp(\"9\"),\r\nstr8_lit_comp(\"minus\"),\r\nstr8_lit_comp(\"equal\"),\r\nstr8_lit_comp(\"backspace\"),\r\nstr8_lit_comp(\"tab\"),\r\nstr8_lit_comp(\"q\"),\r\nstr8_lit_comp(\"w\"),\r\nstr8_lit_comp(\"e\"),\r\nstr8_lit_comp(\"r\"),\r\nstr8_lit_comp(\"t\"),\r\nstr8_lit_comp(\"y\"),\r\nstr8_lit_comp(\"u\"),\r\nstr8_lit_comp(\"i\"),\r\nstr8_lit_comp(\"o\"),\r\nstr8_lit_comp(\"p\"),\r\nstr8_lit_comp(\"left_bracket\"),\r\nstr8_lit_comp(\"right_bracket\"),\r\nstr8_lit_comp(\"backslash\"),\r\nstr8_lit_comp(\"caps_lock\"),\r\nstr8_lit_comp(\"a\"),\r\nstr8_lit_comp(\"s\"),\r\nstr8_lit_comp(\"d\"),\r\nstr8_lit_comp(\"f\"),\r\nstr8_lit_comp(\"g\"),\r\nstr8_lit_comp(\"h\"),\r\nstr8_lit_comp(\"j\"),\r\nstr8_lit_comp(\"k\"),\r\nstr8_lit_comp(\"l\"),\r\nstr8_lit_comp(\"semicolon\"),\r\nstr8_lit_comp(\"quote\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"shift\"),\r\nstr8_lit_comp(\"z\"),\r\nstr8_lit_comp(\"x\"),\r\nstr8_lit_comp(\"c\"),\r\nstr8_lit_comp(\"v\"),\r\nstr8_lit_comp(\"b\"),\r\nstr8_lit_comp(\"n\"),\r\nstr8_lit_comp(\"m\"),\r\nstr8_lit_comp(\"comma\"),\r\nstr8_lit_comp(\"period\"),\r\nstr8_lit_comp(\"slash\"),\r\nstr8_lit_comp(\"ctrl\"),\r\nstr8_lit_comp(\"alt\"),\r\nstr8_lit_comp(\"space\"),\r\nstr8_lit_comp(\"menu\"),\r\nstr8_lit_comp(\"scroll_lock\"),\r\nstr8_lit_comp(\"pause\"),\r\nstr8_lit_comp(\"insert\"),\r\nstr8_lit_comp(\"home\"),\r\nstr8_lit_comp(\"page_up\"),\r\nstr8_lit_comp(\"delete\"),\r\nstr8_lit_comp(\"end\"),\r\nstr8_lit_comp(\"page_down\"),\r\nstr8_lit_comp(\"up\"),\r\nstr8_lit_comp(\"left\"),\r\nstr8_lit_comp(\"down\"),\r\nstr8_lit_comp(\"right\"),\r\nstr8_lit_comp(\"ex0\"),\r\nstr8_lit_comp(\"ex1\"),\r\nstr8_lit_comp(\"ex2\"),\r\nstr8_lit_comp(\"ex3\"),\r\nstr8_lit_comp(\"ex4\"),\r\nstr8_lit_comp(\"ex5\"),\r\nstr8_lit_comp(\"ex6\"),\r\nstr8_lit_comp(\"ex7\"),\r\nstr8_lit_comp(\"ex8\"),\r\nstr8_lit_comp(\"ex9\"),\r\nstr8_lit_comp(\"ex10\"),\r\nstr8_lit_comp(\"ex11\"),\r\nstr8_lit_comp(\"ex12\"),\r\nstr8_lit_comp(\"ex13\"),\r\nstr8_lit_comp(\"ex14\"),\r\nstr8_lit_comp(\"ex15\"),\r\nstr8_lit_comp(\"ex16\"),\r\nstr8_lit_comp(\"ex17\"),\r\nstr8_lit_comp(\"ex18\"),\r\nstr8_lit_comp(\"ex19\"),\r\nstr8_lit_comp(\"ex20\"),\r\nstr8_lit_comp(\"ex21\"),\r\nstr8_lit_comp(\"ex22\"),\r\nstr8_lit_comp(\"ex23\"),\r\nstr8_lit_comp(\"ex24\"),\r\nstr8_lit_comp(\"ex25\"),\r\nstr8_lit_comp(\"ex26\"),\r\nstr8_lit_comp(\"ex27\"),\r\nstr8_lit_comp(\"ex28\"),\r\nstr8_lit_comp(\"ex29\"),\r\nstr8_lit_comp(\"num_lock\"),\r\nstr8_lit_comp(\"numpad_slash\"),\r\nstr8_lit_comp(\"numpad_star\"),\r\nstr8_lit_comp(\"numpad_minus\"),\r\nstr8_lit_comp(\"numpad_plus\"),\r\nstr8_lit_comp(\"numpad_period\"),\r\nstr8_lit_comp(\"numpad_0\"),\r\nstr8_lit_comp(\"numpad_1\"),\r\nstr8_lit_comp(\"numpad_2\"),\r\nstr8_lit_comp(\"numpad_3\"),\r\nstr8_lit_comp(\"numpad_4\"),\r\nstr8_lit_comp(\"numpad_5\"),\r\nstr8_lit_comp(\"numpad_6\"),\r\nstr8_lit_comp(\"numpad_7\"),\r\nstr8_lit_comp(\"numpad_8\"),\r\nstr8_lit_comp(\"numpad_9\"),\r\nstr8_lit_comp(\"left_mouse\"),\r\nstr8_lit_comp(\"middle_mouse\"),\r\nstr8_lit_comp(\"right_mouse\"),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/os/gfx/generated/os_gfx.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef OS_GFX_META_H\r\n#define OS_GFX_META_H\r\n\r\ntypedef enum OS_Key\r\n{\r\nOS_Key_Null,\r\nOS_Key_Esc,\r\nOS_Key_F1,\r\nOS_Key_F2,\r\nOS_Key_F3,\r\nOS_Key_F4,\r\nOS_Key_F5,\r\nOS_Key_F6,\r\nOS_Key_F7,\r\nOS_Key_F8,\r\nOS_Key_F9,\r\nOS_Key_F10,\r\nOS_Key_F11,\r\nOS_Key_F12,\r\nOS_Key_F13,\r\nOS_Key_F14,\r\nOS_Key_F15,\r\nOS_Key_F16,\r\nOS_Key_F17,\r\nOS_Key_F18,\r\nOS_Key_F19,\r\nOS_Key_F20,\r\nOS_Key_F21,\r\nOS_Key_F22,\r\nOS_Key_F23,\r\nOS_Key_F24,\r\nOS_Key_Tick,\r\nOS_Key_0,\r\nOS_Key_1,\r\nOS_Key_2,\r\nOS_Key_3,\r\nOS_Key_4,\r\nOS_Key_5,\r\nOS_Key_6,\r\nOS_Key_7,\r\nOS_Key_8,\r\nOS_Key_9,\r\nOS_Key_Minus,\r\nOS_Key_Equal,\r\nOS_Key_Backspace,\r\nOS_Key_Tab,\r\nOS_Key_Q,\r\nOS_Key_W,\r\nOS_Key_E,\r\nOS_Key_R,\r\nOS_Key_T,\r\nOS_Key_Y,\r\nOS_Key_U,\r\nOS_Key_I,\r\nOS_Key_O,\r\nOS_Key_P,\r\nOS_Key_LeftBracket,\r\nOS_Key_RightBracket,\r\nOS_Key_BackSlash,\r\nOS_Key_CapsLock,\r\nOS_Key_A,\r\nOS_Key_S,\r\nOS_Key_D,\r\nOS_Key_F,\r\nOS_Key_G,\r\nOS_Key_H,\r\nOS_Key_J,\r\nOS_Key_K,\r\nOS_Key_L,\r\nOS_Key_Semicolon,\r\nOS_Key_Quote,\r\nOS_Key_Return,\r\nOS_Key_Shift,\r\nOS_Key_Z,\r\nOS_Key_X,\r\nOS_Key_C,\r\nOS_Key_V,\r\nOS_Key_B,\r\nOS_Key_N,\r\nOS_Key_M,\r\nOS_Key_Comma,\r\nOS_Key_Period,\r\nOS_Key_Slash,\r\nOS_Key_Ctrl,\r\nOS_Key_Alt,\r\nOS_Key_Space,\r\nOS_Key_Menu,\r\nOS_Key_ScrollLock,\r\nOS_Key_Pause,\r\nOS_Key_Insert,\r\nOS_Key_Home,\r\nOS_Key_PageUp,\r\nOS_Key_Delete,\r\nOS_Key_End,\r\nOS_Key_PageDown,\r\nOS_Key_Up,\r\nOS_Key_Left,\r\nOS_Key_Down,\r\nOS_Key_Right,\r\nOS_Key_Ex0,\r\nOS_Key_Ex1,\r\nOS_Key_Ex2,\r\nOS_Key_Ex3,\r\nOS_Key_Ex4,\r\nOS_Key_Ex5,\r\nOS_Key_Ex6,\r\nOS_Key_Ex7,\r\nOS_Key_Ex8,\r\nOS_Key_Ex9,\r\nOS_Key_Ex10,\r\nOS_Key_Ex11,\r\nOS_Key_Ex12,\r\nOS_Key_Ex13,\r\nOS_Key_Ex14,\r\nOS_Key_Ex15,\r\nOS_Key_Ex16,\r\nOS_Key_Ex17,\r\nOS_Key_Ex18,\r\nOS_Key_Ex19,\r\nOS_Key_Ex20,\r\nOS_Key_Ex21,\r\nOS_Key_Ex22,\r\nOS_Key_Ex23,\r\nOS_Key_Ex24,\r\nOS_Key_Ex25,\r\nOS_Key_Ex26,\r\nOS_Key_Ex27,\r\nOS_Key_Ex28,\r\nOS_Key_Ex29,\r\nOS_Key_NumLock,\r\nOS_Key_NumSlash,\r\nOS_Key_NumStar,\r\nOS_Key_NumMinus,\r\nOS_Key_NumPlus,\r\nOS_Key_NumPeriod,\r\nOS_Key_Num0,\r\nOS_Key_Num1,\r\nOS_Key_Num2,\r\nOS_Key_Num3,\r\nOS_Key_Num4,\r\nOS_Key_Num5,\r\nOS_Key_Num6,\r\nOS_Key_Num7,\r\nOS_Key_Num8,\r\nOS_Key_Num9,\r\nOS_Key_LeftMouseButton,\r\nOS_Key_MiddleMouseButton,\r\nOS_Key_RightMouseButton,\r\nOS_Key_COUNT,\r\n} OS_Key;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 os_g_key_display_string_table[143];\r\nextern String8 os_g_key_cfg_string_table[143];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // OS_GFX_META_H\r\n"
  },
  {
    "path": "src/os/gfx/linux/os_gfx_linux.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal OS_LNX_Window *\r\nos_lnx_window_from_x11window(Window window)\r\n{\r\n  OS_LNX_Window *result = 0;\r\n  for(OS_LNX_Window *w = os_lnx_gfx_state->first_window; w != 0; w = w->next)\r\n  {\r\n    if(w->window == window)\r\n    {\r\n      result = w;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)\r\n\r\ninternal void\r\nos_gfx_init(void)\r\n{\r\n  //- rjf: initialize basics\r\n  Arena *arena = arena_alloc();\r\n  os_lnx_gfx_state = push_array(arena, OS_LNX_GfxState, 1);\r\n  os_lnx_gfx_state->arena = arena;\r\n  os_lnx_gfx_state->display = XOpenDisplay(0);\r\n  \r\n  //- rjf: calculate atoms\r\n  os_lnx_gfx_state->wm_delete_window_atom        = XInternAtom(os_lnx_gfx_state->display, \"WM_DELETE_WINDOW\", 0);\r\n  os_lnx_gfx_state->wm_sync_request_atom         = XInternAtom(os_lnx_gfx_state->display, \"_NET_WM_SYNC_REQUEST\", 0);\r\n  os_lnx_gfx_state->wm_sync_request_counter_atom = XInternAtom(os_lnx_gfx_state->display, \"_NET_WM_SYNC_REQUEST_COUNTER\", 0);\r\n  \r\n  //- rjf: open im\r\n  os_lnx_gfx_state->xim = XOpenIM(os_lnx_gfx_state->display, 0, 0, 0);\r\n  \r\n  //- rjf: fill out gfx info\r\n  os_lnx_gfx_state->gfx_info.double_click_time = 0.5f;\r\n  os_lnx_gfx_state->gfx_info.caret_blink_time = 0.5f;\r\n  os_lnx_gfx_state->gfx_info.default_refresh_rate = 60.f;\r\n  \r\n  //- rjf: fill out cursors\r\n  {\r\n    struct\r\n    {\r\n      OS_Cursor cursor;\r\n      unsigned int id;\r\n    }\r\n    map[] =\r\n    {\r\n      {OS_Cursor_Pointer,         XC_left_ptr},\r\n      {OS_Cursor_IBar,            XC_xterm},\r\n      {OS_Cursor_LeftRight,       XC_sb_h_double_arrow},\r\n      {OS_Cursor_UpDown,          XC_sb_v_double_arrow},\r\n      {OS_Cursor_DownRight,       XC_bottom_right_corner},\r\n      {OS_Cursor_UpRight,         XC_top_right_corner},\r\n      {OS_Cursor_UpDownLeftRight, XC_fleur},\r\n      {OS_Cursor_HandPoint,       XC_hand1},\r\n      {OS_Cursor_Disabled,        XC_X_cursor},\r\n    };\r\n    for EachElement(idx, map)\r\n    {\r\n      os_lnx_gfx_state->cursors[map[idx].cursor] = XCreateFontCursor(os_lnx_gfx_state->display, map[idx].id);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS)\r\n\r\ninternal OS_GfxInfo *\r\nos_get_gfx_info(void)\r\n{\r\n  return &os_lnx_gfx_state->gfx_info;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Clipboards (Implemented Per-OS)\r\n\r\ninternal void\r\nos_set_clipboard_text(String8 string)\r\n{\r\n  \r\n}\r\n\r\ninternal String8\r\nos_get_clipboard_text(Arena *arena)\r\n{\r\n  String8 result = {0};\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title)\r\n{\r\n  Vec2F32 resolution = dim_2f32(rect);\r\n  \r\n  //- rjf: allocate window\r\n  OS_LNX_Window *w = os_lnx_gfx_state->free_window;\r\n  if(w)\r\n  {\r\n    SLLStackPop(os_lnx_gfx_state->free_window);\r\n  }\r\n  else\r\n  {\r\n    w = push_array_no_zero(os_lnx_gfx_state->arena, OS_LNX_Window, 1);\r\n  }\r\n  MemoryZeroStruct(w);\r\n  DLLPushBack(os_lnx_gfx_state->first_window, os_lnx_gfx_state->last_window, w);\r\n  \r\n  //- rjf: create window & equip with x11 info\r\n  w->window = XCreateWindow(os_lnx_gfx_state->display,\r\n                            XDefaultRootWindow(os_lnx_gfx_state->display),\r\n                            0, 0, resolution.x, resolution.y,\r\n                            0,\r\n                            CopyFromParent,\r\n                            InputOutput,\r\n                            CopyFromParent,\r\n                            0,\r\n                            0);\r\n  XSelectInput(os_lnx_gfx_state->display, w->window,\r\n               ExposureMask|\r\n               PointerMotionMask|\r\n               ButtonPressMask|\r\n               ButtonReleaseMask|\r\n               KeyPressMask|\r\n               KeyReleaseMask|\r\n               FocusChangeMask);\r\n  Atom protocols[] =\r\n  {\r\n    os_lnx_gfx_state->wm_delete_window_atom,\r\n    os_lnx_gfx_state->wm_sync_request_atom,\r\n  };\r\n  XSetWMProtocols(os_lnx_gfx_state->display, w->window, protocols, ArrayCount(protocols));\r\n  {\r\n    XSyncValue initial_value;\r\n    XSyncIntToValue(&initial_value, 0);\r\n    w->counter_xid = XSyncCreateCounter(os_lnx_gfx_state->display, initial_value);\r\n  }\r\n  XChangeProperty(os_lnx_gfx_state->display, w->window, os_lnx_gfx_state->wm_sync_request_counter_atom, XA_CARDINAL, 32, PropModeReplace, (U8 *)&w->counter_xid, 1);\r\n  \r\n  //- rjf: create xic\r\n  w->xic = XCreateIC(os_lnx_gfx_state->xim,\r\n                     XNInputStyle, XIMPreeditNothing|XIMStatusNothing,\r\n                     XNClientWindow, w->window,\r\n                     XNFocusWindow, w->window,\r\n                     NULL);\r\n  \r\n  //- rjf: attach name\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 title_copy = push_str8_copy(scratch.arena, title);\r\n  XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str);\r\n  scratch_end(scratch);\r\n  \r\n  //- rjf: convert to handle & return\r\n  OS_Handle handle = {(U64)w};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_window_close(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  XDestroyWindow(os_lnx_gfx_state->display, w->window);\r\n}\r\n\r\ninternal void\r\nos_window_set_title(OS_Handle handle, String8 title)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  Temp scratch = scratch_begin(0, 0);\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  String8 title_copy = push_str8_copy(scratch.arena, title);\r\n  XStoreName(os_lnx_gfx_state->display, w->window, (char *)title_copy.str);\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nos_window_first_paint(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  XMapWindow(os_lnx_gfx_state->display, w->window);\r\n}\r\n\r\ninternal void\r\nos_window_focus(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  XSetInputFocus(os_lnx_gfx_state->display, w->window, RevertToNone, CurrentTime);\r\n}\r\n\r\ninternal B32\r\nos_window_is_focused(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return 0;}\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  Window focused_window = 0;\r\n  int revert_to = 0;\r\n  XGetInputFocus(os_lnx_gfx_state->display, &focused_window, &revert_to);\r\n  B32 result = (w->window == focused_window);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_window_is_fullscreen(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return 0;}\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_window_set_fullscreen(OS_Handle handle, B32 fullscreen)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal B32\r\nos_window_is_maximized(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return 0;}\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_window_set_maximized(OS_Handle handle, B32 maximized)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal B32\r\nos_window_is_minimized(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return 0;}\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_window_set_minimized(OS_Handle handle, B32 minimized)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_window_bring_to_front(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_window_set_monitor(OS_Handle handle, OS_Handle monitor)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_window_clear_custom_border_data(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_title_bar(OS_Handle handle, F32 thickness)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_edges(OS_Handle handle, F32 thickness)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return;}\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal Rng2F32\r\nos_rect_from_window(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return r2f32p(0, 0, 0, 0);}\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  XWindowAttributes atts = {0};\r\n  Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts);\r\n  Rng2F32 result = r2f32p((F32)atts.x, (F32)atts.y, (F32)atts.x + (F32)atts.width, (F32)atts.y + (F32)atts.height);\r\n  return result;\r\n}\r\n\r\ninternal Rng2F32\r\nos_client_rect_from_window(OS_Handle handle)\r\n{\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  XWindowAttributes atts = {0};\r\n  Status s = XGetWindowAttributes(os_lnx_gfx_state->display, w->window, &atts);\r\n  Rng2F32 result = r2f32p(0, 0, (F32)atts.width, (F32)atts.height);\r\n  return result;\r\n}\r\n\r\ninternal F32\r\nos_dpi_from_window(OS_Handle handle)\r\n{\r\n  // TODO(rjf)\r\n  return 96.f;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks External Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_focused_external_window(void)\r\n{\r\n  OS_Handle result = {0};\r\n  // TODO(rjf)\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_focus_external_window(OS_Handle handle)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Monitors (Implemented Per-OS)\r\n\r\ninternal OS_HandleArray\r\nos_push_monitors_array(Arena *arena)\r\n{\r\n  OS_HandleArray result = {0};\r\n  // TODO(rjf)\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_primary_monitor(void)\r\n{\r\n  OS_Handle result = {0};\r\n  // TODO(rjf)\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_monitor_from_window(OS_Handle window)\r\n{\r\n  OS_Handle result = {0};\r\n  // TODO(rjf)\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nos_name_from_monitor(Arena *arena, OS_Handle monitor)\r\n{\r\n  // TODO(rjf)\r\n  return str8_zero();\r\n}\r\n\r\ninternal Vec2F32\r\nos_dim_from_monitor(OS_Handle monitor)\r\n{\r\n  // TODO(rjf)\r\n  return v2f32(0, 0);\r\n}\r\n\r\ninternal F32\r\nos_dpi_from_monitor(OS_Handle monitor)\r\n{\r\n  // TODO(rjf)\r\n  return 96.f;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Events (Implemented Per-OS)\r\n\r\ninternal void\r\nos_send_wakeup_event(void)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal OS_EventList\r\nos_get_events(Arena *arena, B32 wait)\r\n{\r\n  OS_EventList evts = {0};\r\n  for(;XPending(os_lnx_gfx_state->display) > 0 || (wait && evts.count == 0);)\r\n  {\r\n    XEvent evt = {0};\r\n    XNextEvent(os_lnx_gfx_state->display, &evt);\r\n    B32 set_mouse_cursor = 0;\r\n    switch(evt.type)\r\n    {\r\n      default:{}break;\r\n      \r\n      //- rjf: key presses/releases\r\n      case KeyPress:\r\n      case KeyRelease:\r\n      {\r\n        // rjf: determine flags\r\n        OS_Modifiers modifiers = 0;\r\n        if(evt.xkey.state & ShiftMask)   { modifiers |= OS_Modifier_Shift; }\r\n        if(evt.xkey.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; }\r\n        if(evt.xkey.state & Mod1Mask)    { modifiers |= OS_Modifier_Alt; }\r\n        \r\n        // rjf: map keycode -> keysym & codepoint\r\n        OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xkey.window);\r\n        KeySym keysym = 0;\r\n        U8 text[256] = {0};\r\n        U64 text_size = Xutf8LookupString(window->xic, &evt.xkey, (char *)text, sizeof(text), &keysym, 0);\r\n        \r\n        // rjf: map keysym -> OS_Key\r\n        B32 is_right_sided = 0;\r\n        OS_Key key = OS_Key_Null;\r\n        switch(keysym)\r\n        {\r\n          default:\r\n          {\r\n            if(0){}\r\n            else if(XK_F1 <= keysym && keysym <= XK_F24) { key = (OS_Key)(OS_Key_F1 + (keysym - XK_F1)); }\r\n            else if('0' <= keysym && keysym <= '9')      { key = OS_Key_0 + (keysym-'0'); }\r\n          }break;\r\n          case XK_Escape:{key = OS_Key_Esc;};break;\r\n          case XK_BackSpace:{key = OS_Key_Backspace;}break;\r\n          case XK_Delete:{key = OS_Key_Delete;}break;\r\n          case XK_Return:{key = OS_Key_Return;}break;\r\n          case XK_Pause:{key = OS_Key_Pause;}break;\r\n          case XK_Tab:{key = OS_Key_Tab;}break;\r\n          case XK_Left:{key = OS_Key_Left;}break;\r\n          case XK_Right:{key = OS_Key_Right;}break;\r\n          case XK_Up:{key = OS_Key_Up;}break;\r\n          case XK_Down:{key = OS_Key_Down;}break;\r\n          case XK_Home:{key = OS_Key_Home;}break;\r\n          case XK_End:{key = OS_Key_End;}break;\r\n          case XK_Page_Up:{key = OS_Key_PageUp;}break;\r\n          case XK_Page_Down:{key = OS_Key_PageDown;}break;\r\n          case XK_Alt_L:{ key = OS_Key_Alt; }break;\r\n          case XK_Alt_R:{ key = OS_Key_Alt; is_right_sided = 1;}break;\r\n          case XK_Shift_L:{ key = OS_Key_Shift; }break;\r\n          case XK_Shift_R:{ key = OS_Key_Shift; is_right_sided = 1;}break;\r\n          case XK_Control_L:{ key = OS_Key_Ctrl; }break;\r\n          case XK_Control_R:{ key = OS_Key_Ctrl; is_right_sided = 1;}break;\r\n          case '-':{key = OS_Key_Minus;}break;\r\n          case '=':{key = OS_Key_Equal;}break;\r\n          case '[':{key = OS_Key_LeftBracket;}break;\r\n          case ']':{key = OS_Key_RightBracket;}break;\r\n          case ';':{key = OS_Key_Semicolon;}break;\r\n          case '\\'':{key = OS_Key_Quote;}break;\r\n          case '.':{key = OS_Key_Period;}break;\r\n          case ',':{key = OS_Key_Comma;}break;\r\n          case '/':{key = OS_Key_Slash;}break;\r\n          case '\\\\':{key = OS_Key_BackSlash;}break;\r\n          case '\\t':{key = OS_Key_Tab;}break;\r\n          case 'a':case 'A':{key = OS_Key_A;}break;\r\n          case 'b':case 'B':{key = OS_Key_B;}break;\r\n          case 'c':case 'C':{key = OS_Key_C;}break;\r\n          case 'd':case 'D':{key = OS_Key_D;}break;\r\n          case 'e':case 'E':{key = OS_Key_E;}break;\r\n          case 'f':case 'F':{key = OS_Key_F;}break;\r\n          case 'g':case 'G':{key = OS_Key_G;}break;\r\n          case 'h':case 'H':{key = OS_Key_H;}break;\r\n          case 'i':case 'I':{key = OS_Key_I;}break;\r\n          case 'j':case 'J':{key = OS_Key_J;}break;\r\n          case 'k':case 'K':{key = OS_Key_K;}break;\r\n          case 'l':case 'L':{key = OS_Key_L;}break;\r\n          case 'm':case 'M':{key = OS_Key_M;}break;\r\n          case 'n':case 'N':{key = OS_Key_N;}break;\r\n          case 'o':case 'O':{key = OS_Key_O;}break;\r\n          case 'p':case 'P':{key = OS_Key_P;}break;\r\n          case 'q':case 'Q':{key = OS_Key_Q;}break;\r\n          case 'r':case 'R':{key = OS_Key_R;}break;\r\n          case 's':case 'S':{key = OS_Key_S;}break;\r\n          case 't':case 'T':{key = OS_Key_T;}break;\r\n          case 'u':case 'U':{key = OS_Key_U;}break;\r\n          case 'v':case 'V':{key = OS_Key_V;}break;\r\n          case 'w':case 'W':{key = OS_Key_W;}break;\r\n          case 'x':case 'X':{key = OS_Key_X;}break;\r\n          case 'y':case 'Y':{key = OS_Key_Y;}break;\r\n          case 'z':case 'Z':{key = OS_Key_Z;}break;\r\n          case ' ':{key = OS_Key_Space;}break;\r\n        }\r\n        \r\n        // rjf: push text event\r\n        if(evt.type == KeyPress && text_size != 0)\r\n        {\r\n          for(U64 off = 0; off < text_size;)\r\n          {\r\n            UnicodeDecode decode = utf8_decode(text+off, text_size-off);\r\n            if(decode.codepoint != 0 && (decode.codepoint >= 32 || decode.codepoint == '\\t'))\r\n            {\r\n              OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Text);\r\n              e->window.u64[0] = (U64)window;\r\n              e->character = decode.codepoint;\r\n            }\r\n            if(decode.inc == 0)\r\n            {\r\n              break;\r\n            }\r\n            off += decode.inc;\r\n          }\r\n        }\r\n        \r\n        // rjf: push key event\r\n        {\r\n          OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == KeyPress ? OS_EventKind_Press : OS_EventKind_Release);\r\n          e->window.u64[0] = (U64)window;\r\n          e->modifiers = modifiers;\r\n          e->key = key;\r\n          e->right_sided = is_right_sided;\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: mouse button presses/releases\r\n      case ButtonPress:\r\n      case ButtonRelease:\r\n      {\r\n        // rjf: determine flags\r\n        OS_Modifiers modifiers = 0;\r\n        if(evt.xbutton.state & ShiftMask)   { modifiers |= OS_Modifier_Shift; }\r\n        if(evt.xbutton.state & ControlMask) { modifiers |= OS_Modifier_Ctrl; }\r\n        if(evt.xbutton.state & Mod1Mask)    { modifiers |= OS_Modifier_Alt; }\r\n        \r\n        // rjf: map button -> OS_Key\r\n        OS_Key key = OS_Key_Null;\r\n        switch(evt.xbutton.button)\r\n        {\r\n          default:{}break;\r\n          case Button1:{key = OS_Key_LeftMouseButton;}break;\r\n          case Button2:{key = OS_Key_MiddleMouseButton;}break;\r\n          case Button3:{key = OS_Key_RightMouseButton;}break;\r\n        }\r\n        \r\n        // rjf: push event\r\n        OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xbutton.window);\r\n        if(key != OS_Key_Null)\r\n        {\r\n          OS_Event *e = os_event_list_push_new(arena, &evts, evt.type == ButtonPress ? OS_EventKind_Press : OS_EventKind_Release);\r\n          e->window.u64[0] = (U64)window;\r\n          e->modifiers = modifiers;\r\n          e->key = key;\r\n          e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y);\r\n        }\r\n        else if(evt.xbutton.button == Button4 ||\r\n                evt.xbutton.button == Button5)\r\n        {\r\n          OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_Scroll);\r\n          e->window.u64[0] = (U64)window;\r\n          e->modifiers = modifiers;\r\n          e->delta = v2f32(0, evt.xbutton.button == Button4 ? -1.f : +1.f);\r\n          e->pos = v2f32((F32)evt.xbutton.x, (F32)evt.xbutton.y);\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: mouse motion\r\n      case MotionNotify:\r\n      {\r\n        OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window);\r\n        OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_MouseMove);\r\n        e->window.u64[0] = (U64)window;\r\n        e->pos.x = (F32)evt.xmotion.x;\r\n        e->pos.y = (F32)evt.xmotion.y;\r\n        set_mouse_cursor = 1;\r\n      }break;\r\n      \r\n      //- rjf: window focus/unfocus\r\n      case FocusIn:\r\n      {\r\n      }break;\r\n      case FocusOut:\r\n      {\r\n        OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xfocus.window);\r\n        OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowLoseFocus);\r\n        e->window.u64[0] = (U64)window;\r\n      }break;\r\n      \r\n      //- rjf: client messages\r\n      case ClientMessage:\r\n      {\r\n        if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_delete_window_atom)\r\n        {\r\n          OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window);\r\n          OS_Event *e = os_event_list_push_new(arena, &evts, OS_EventKind_WindowClose);\r\n          e->window.u64[0] = (U64)window;\r\n        }\r\n        else if((Atom)evt.xclient.data.l[0] == os_lnx_gfx_state->wm_sync_request_atom)\r\n        {\r\n          OS_LNX_Window *window = os_lnx_window_from_x11window(evt.xclient.window);\r\n          if(window != 0)\r\n          {\r\n            window->counter_value = 0;\r\n            window->counter_value |= evt.xclient.data.l[2];\r\n            window->counter_value |= (evt.xclient.data.l[3] << 32);\r\n            XSyncValue value;\r\n            XSyncIntToValue(&value, window->counter_value);\r\n            XSyncSetCounter(os_lnx_gfx_state->display, window->counter_xid, value);\r\n          }\r\n        }\r\n      }break;\r\n    }\r\n    if(set_mouse_cursor)\r\n    {\r\n      Window root_window = 0;\r\n      Window child_window = 0;\r\n      int root_rel_x = 0;\r\n      int root_rel_y = 0;\r\n      int child_rel_x = 0;\r\n      int child_rel_y = 0;\r\n      unsigned int mask = 0;\r\n      if(XQueryPointer(os_lnx_gfx_state->display, XDefaultRootWindow(os_lnx_gfx_state->display), &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask))\r\n      {\r\n        XDefineCursor(os_lnx_gfx_state->display, root_window, os_lnx_gfx_state->cursors[os_lnx_gfx_state->last_set_cursor]);\r\n        XFlush(os_lnx_gfx_state->display);\r\n      }\r\n    }\r\n  }\r\n  return evts;\r\n}\r\n\r\ninternal OS_Modifiers\r\nos_get_modifiers(void)\r\n{\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\nos_key_is_down(OS_Key key)\r\n{\r\n  // TODO(rjf)\r\n  return 0;\r\n}\r\n\r\ninternal Vec2F32\r\nos_mouse_from_window(OS_Handle handle)\r\n{\r\n  if(os_handle_match(handle, os_handle_zero())) {return v2f32(0, 0);}\r\n  OS_LNX_Window *w = (OS_LNX_Window *)handle.u64[0];\r\n  Vec2F32 result = {0};\r\n  {\r\n    Window root_window = 0;\r\n    Window child_window = 0;\r\n    int root_rel_x = 0;\r\n    int root_rel_y = 0;\r\n    int child_rel_x = 0;\r\n    int child_rel_y = 0;\r\n    unsigned int mask = 0;\r\n    if(XQueryPointer(os_lnx_gfx_state->display, w->window, &root_window, &child_window, &root_rel_x, &root_rel_y, &child_rel_x, &child_rel_y, &mask))\r\n    {\r\n      result.x = child_rel_x;\r\n      result.y = child_rel_y;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Cursors (Implemented Per-OS)\r\n\r\ninternal void\r\nos_set_cursor(OS_Cursor cursor)\r\n{\r\n  os_lnx_gfx_state->last_set_cursor = cursor;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS)\r\n\r\ninternal void\r\nos_graphical_message(B32 error, String8 title, String8 message)\r\n{\r\n  if(error)\r\n  {\r\n    fprintf(stderr, \"[X] \");\r\n  }\r\n  fprintf(stderr, \"%.*s\\n\", str8_varg(title));\r\n  fprintf(stderr, \"%.*s\\n\\n\", str8_varg(message));\r\n}\r\n\r\ninternal String8\r\nos_graphical_pick_file(Arena *arena, String8 initial_path)\r\n{\r\n  return str8_zero();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shell Operations\r\n\r\ninternal void\r\nos_show_in_filesystem_ui(String8 path)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\ninternal void\r\nos_open_in_browser(String8 url)\r\n{\r\n  // TODO(rjf)\r\n}\r\n"
  },
  {
    "path": "src/os/gfx/linux/os_gfx_linux.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_GFX_LINUX_H\r\n#define OS_GFX_LINUX_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n#include <X11/Xlib.h>\r\n#include <X11/Xatom.h>\r\n#include <X11/cursorfont.h>\r\n#include <X11/extensions/sync.h>\r\n#include <X11/keysym.h>\r\n#include <X11/keysymdef.h>\r\n\r\n////////////////////////////////\r\n//~ rjf: Window State\r\n\r\ntypedef struct OS_LNX_Window OS_LNX_Window;\r\nstruct OS_LNX_Window\r\n{\r\n  OS_LNX_Window *next;\r\n  OS_LNX_Window *prev;\r\n  Window window;\r\n  XIC xic;\r\n  XID counter_xid;\r\n  U64 counter_value;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: State Bundle\r\n\r\ntypedef struct OS_LNX_GfxState OS_LNX_GfxState;\r\nstruct OS_LNX_GfxState\r\n{\r\n  Arena *arena;\r\n  Display *display;\r\n  XIM xim;\r\n  OS_LNX_Window *first_window;\r\n  OS_LNX_Window *last_window;\r\n  OS_LNX_Window *free_window;\r\n  Atom wm_delete_window_atom;\r\n  Atom wm_sync_request_atom;\r\n  Atom wm_sync_request_counter_atom;\r\n  Cursor cursors[OS_Cursor_COUNT];\r\n  OS_Cursor last_set_cursor;\r\n  OS_GfxInfo gfx_info;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal OS_LNX_GfxState *os_lnx_gfx_state = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal OS_LNX_Window *os_lnx_window_from_x11window(Window window);\r\n\r\n#endif // OS_GFX_LINUX_H\r\n"
  },
  {
    "path": "src/os/gfx/os_gfx.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/os_gfx.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Functions (Helpers, Implemented Once)\r\n\r\ninternal String8\r\nos_string_from_event_kind(OS_EventKind kind)\r\n{\r\n  String8 result = {0};\r\n  switch(kind)\r\n  {\r\n    case OS_EventKind_Null:\r\n    case OS_EventKind_COUNT:\r\n    {}break;\r\n    case OS_EventKind_Press:                {result = str8_lit(\"Press\");}break;\r\n    case OS_EventKind_Release:              {result = str8_lit(\"Release\");}break;\r\n    case OS_EventKind_MouseMove:            {result = str8_lit(\"MouseMove\");}break;\r\n    case OS_EventKind_Text:                 {result = str8_lit(\"Text\");}break;\r\n    case OS_EventKind_Scroll:               {result = str8_lit(\"Scroll\");}break;\r\n    case OS_EventKind_WindowLoseFocus:      {result = str8_lit(\"WindowLoseFocus\");}break;\r\n    case OS_EventKind_WindowClose:          {result = str8_lit(\"WindowClose\");}break;\r\n    case OS_EventKind_FileDrop:             {result = str8_lit(\"FileDrop\");}break;\r\n    case OS_EventKind_Wakeup:               {result = str8_lit(\"Wakeup\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8List\r\nos_string_list_from_modifiers(Arena *arena, OS_Modifiers modifiers)\r\n{\r\n  String8List result = {0};\r\n  if(modifiers & OS_Modifier_Ctrl)  { str8_list_push(arena, &result, str8_lit(\"Ctrl\")); }\r\n  if(modifiers & OS_Modifier_Shift) { str8_list_push(arena, &result, str8_lit(\"Shift\")); }\r\n  if(modifiers & OS_Modifier_Alt)   { str8_list_push(arena, &result, str8_lit(\"Alt\")); }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nos_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key)\r\n{\r\n  String8 result = {0};\r\n  if(key != OS_Key_Null)\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    String8List mods = os_string_list_from_modifiers(scratch.arena, modifiers);\r\n    String8 key_string = os_g_key_display_string_table[key];\r\n    str8_list_push(scratch.arena, &mods, key_string);\r\n    StringJoin join = {0};\r\n    join.sep = str8_lit(\" + \");\r\n    result = str8_list_join(arena, &mods, &join);\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U32\r\nos_codepoint_from_modifiers_and_key(OS_Modifiers modifiers, OS_Key key)\r\n{\r\n  U32 result = 0;\r\n  \r\n  // rjf: special-case map\r\n  local_persist read_only struct {U32 character; OS_Key key; OS_Modifiers modifiers;} map[] =\r\n  {\r\n    {'!', OS_Key_1, OS_Modifier_Shift},\r\n    {'@', OS_Key_2, OS_Modifier_Shift},\r\n    {'#', OS_Key_3, OS_Modifier_Shift},\r\n    {'$', OS_Key_4, OS_Modifier_Shift},\r\n    {'%', OS_Key_5, OS_Modifier_Shift},\r\n    {'^', OS_Key_6, OS_Modifier_Shift},\r\n    {'&', OS_Key_7, OS_Modifier_Shift},\r\n    {'*', OS_Key_8, OS_Modifier_Shift},\r\n    {'(', OS_Key_9, OS_Modifier_Shift},\r\n    {')', OS_Key_0, OS_Modifier_Shift},\r\n    {'_', OS_Key_Minus, OS_Modifier_Shift},\r\n    {'_', OS_Key_Minus, OS_Modifier_Shift},\r\n    {'-', OS_Key_Minus, 0},\r\n    {'=', OS_Key_Equal, 0},\r\n    {'+', OS_Key_Equal, OS_Modifier_Shift},\r\n    {'`', OS_Key_Tick, 0},\r\n    {'~', OS_Key_Tick, OS_Modifier_Shift},\r\n    {'[', OS_Key_LeftBracket, 0},\r\n    {']', OS_Key_RightBracket, 0},\r\n    {'{', OS_Key_LeftBracket, OS_Modifier_Shift},\r\n    {'}', OS_Key_RightBracket, OS_Modifier_Shift},\r\n    {'\\\\', OS_Key_BackSlash, 0},\r\n    {'|', OS_Key_BackSlash, OS_Modifier_Shift},\r\n    {';', OS_Key_Semicolon, 0},\r\n    {':', OS_Key_Semicolon, OS_Modifier_Shift},\r\n    {'\\'', OS_Key_Quote, 0},\r\n    {'\"', OS_Key_Quote, OS_Modifier_Shift},\r\n    {'.', OS_Key_Period, 0},\r\n    {',', OS_Key_Comma, 0},\r\n    {'<', OS_Key_Period, OS_Modifier_Shift},\r\n    {'>', OS_Key_Comma, OS_Modifier_Shift},\r\n    {'/', OS_Key_Slash, 0},\r\n    {'?', OS_Key_Slash, OS_Modifier_Shift},\r\n    {'a', OS_Key_A, 0},\r\n    {'b', OS_Key_B, 0},\r\n    {'c', OS_Key_C, 0},\r\n    {'d', OS_Key_D, 0},\r\n    {'e', OS_Key_E, 0},\r\n    {'f', OS_Key_F, 0},\r\n    {'g', OS_Key_G, 0},\r\n    {'h', OS_Key_H, 0},\r\n    {'i', OS_Key_I, 0},\r\n    {'j', OS_Key_J, 0},\r\n    {'k', OS_Key_K, 0},\r\n    {'l', OS_Key_L, 0},\r\n    {'m', OS_Key_M, 0},\r\n    {'n', OS_Key_N, 0},\r\n    {'o', OS_Key_O, 0},\r\n    {'p', OS_Key_P, 0},\r\n    {'q', OS_Key_Q, 0},\r\n    {'r', OS_Key_R, 0},\r\n    {'s', OS_Key_S, 0},\r\n    {'t', OS_Key_T, 0},\r\n    {'u', OS_Key_U, 0},\r\n    {'v', OS_Key_V, 0},\r\n    {'w', OS_Key_W, 0},\r\n    {'x', OS_Key_X, 0},\r\n    {'y', OS_Key_Y, 0},\r\n    {'z', OS_Key_Z, 0},\r\n    {'A', OS_Key_A, OS_Modifier_Shift},\r\n    {'B', OS_Key_B, OS_Modifier_Shift},\r\n    {'C', OS_Key_C, OS_Modifier_Shift},\r\n    {'D', OS_Key_D, OS_Modifier_Shift},\r\n    {'E', OS_Key_E, OS_Modifier_Shift},\r\n    {'F', OS_Key_F, OS_Modifier_Shift},\r\n    {'G', OS_Key_G, OS_Modifier_Shift},\r\n    {'H', OS_Key_H, OS_Modifier_Shift},\r\n    {'I', OS_Key_I, OS_Modifier_Shift},\r\n    {'J', OS_Key_J, OS_Modifier_Shift},\r\n    {'K', OS_Key_K, OS_Modifier_Shift},\r\n    {'L', OS_Key_L, OS_Modifier_Shift},\r\n    {'M', OS_Key_M, OS_Modifier_Shift},\r\n    {'N', OS_Key_N, OS_Modifier_Shift},\r\n    {'O', OS_Key_O, OS_Modifier_Shift},\r\n    {'P', OS_Key_P, OS_Modifier_Shift},\r\n    {'Q', OS_Key_Q, OS_Modifier_Shift},\r\n    {'R', OS_Key_R, OS_Modifier_Shift},\r\n    {'S', OS_Key_S, OS_Modifier_Shift},\r\n    {'T', OS_Key_T, OS_Modifier_Shift},\r\n    {'U', OS_Key_U, OS_Modifier_Shift},\r\n    {'V', OS_Key_V, OS_Modifier_Shift},\r\n    {'W', OS_Key_W, OS_Modifier_Shift},\r\n    {'X', OS_Key_X, OS_Modifier_Shift},\r\n    {'Y', OS_Key_Y, OS_Modifier_Shift},\r\n    {'Z', OS_Key_Z, OS_Modifier_Shift},\r\n    {' ', OS_Key_Space, 0},\r\n  };\r\n  \r\n  // rjf: check numeric\r\n  if(OS_Key_0 <= key && key <= OS_Key_9)\r\n  {\r\n    result = '0' + (key - OS_Key_0);\r\n  }\r\n  \r\n  // rjf: check special-case map\r\n  for(U64 idx = 0; idx < ArrayCount(map); idx += 1)\r\n  {\r\n    if(map[idx].key == key && map[idx].modifiers == modifiers)\r\n    {\r\n      result = map[idx].character;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_eat_event(OS_EventList *events, OS_Event *event)\r\n{\r\n  DLLRemove(events->first, events->last, event);\r\n  events->count -= 1;\r\n}\r\n\r\ninternal B32\r\nos_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key)\r\n{\r\n  B32 result = 0;\r\n  for(OS_Event *event = events->first; event != 0; event = event->next)\r\n  {\r\n    if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) &&\r\n       event->kind == OS_EventKind_Press && event->key == key && event->modifiers == modifiers)\r\n    {\r\n      result = 1;\r\n      os_eat_event(events, event);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key)\r\n{\r\n  B32 result = 0;\r\n  for(OS_Event *event = events->first; event != 0; event = event->next)\r\n  {\r\n    if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) &&\r\n       event->kind == OS_EventKind_Release && event->key == key && event->modifiers == modifiers)\r\n    {\r\n      result = 1;\r\n      os_eat_event(events, event);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nos_text(OS_EventList *events, OS_Handle window, U32 character)\r\n{\r\n  B32 result = 0;\r\n  for(OS_Event *event = events->first; event != 0; event = event->next)\r\n  {\r\n    if((os_handle_match(event->window, window) || os_handle_match(window, os_handle_zero())) &&\r\n       event->kind == OS_EventKind_Text && event->character == character)\r\n    {\r\n      result = 1;\r\n      os_eat_event(events, event);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal OS_EventList\r\nos_event_list_copy(Arena *arena, OS_EventList *src)\r\n{\r\n  OS_EventList dst = {0};\r\n  for(OS_Event *s = src->first; s != 0; s = s->next)\r\n  {\r\n    OS_Event *d = push_array(arena, OS_Event, 1);\r\n    MemoryCopyStruct(d, s);\r\n    d->strings = str8_list_copy(arena, &s->strings);\r\n    DLLPushBack(dst.first, dst.last, d);\r\n    dst.count += 1;\r\n  }\r\n  return dst;\r\n}\r\n\r\ninternal void\r\nos_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push)\r\n{\r\n  if(dst->last && to_push->first)\r\n  {\r\n    dst->last->next = to_push->first;\r\n    to_push->first->prev = dst->last;\r\n    dst->last = to_push->last;\r\n    dst->count += to_push->count;\r\n  }\r\n  else if(!dst->last && to_push->first)\r\n  {\r\n    MemoryCopyStruct(dst, to_push);\r\n  }\r\n  MemoryZeroStruct(to_push);\r\n}\r\n\r\ninternal OS_Event *\r\nos_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind)\r\n{\r\n  OS_Event *evt = push_array(arena, OS_Event, 1);\r\n  DLLPushBack(evts->first, evts->last, evt);\r\n  evts->count += 1;\r\n  evt->timestamp_us = os_now_microseconds();\r\n  evt->kind = kind;\r\n  return evt;\r\n}\r\n"
  },
  {
    "path": "src/os/gfx/os_gfx.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_GFX_H\r\n#define OS_GFX_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Graphics System Info\r\n\r\ntypedef struct OS_GfxInfo OS_GfxInfo;\r\nstruct OS_GfxInfo\r\n{\r\n  F32 double_click_time;\r\n  F32 caret_blink_time;\r\n  F32 default_refresh_rate;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Window Types\r\n\r\ntypedef U32 OS_WindowFlags;\r\nenum\r\n{\r\n  OS_WindowFlag_CustomBorder       = (1<<0),\r\n  OS_WindowFlag_UseDefaultPosition = (1<<1),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Cursor Types\r\n\r\ntypedef enum OS_Cursor\r\n{\r\n  OS_Cursor_Pointer,\r\n  OS_Cursor_IBar,\r\n  OS_Cursor_LeftRight,\r\n  OS_Cursor_UpDown,\r\n  OS_Cursor_DownRight,\r\n  OS_Cursor_UpRight,\r\n  OS_Cursor_UpDownLeftRight,\r\n  OS_Cursor_HandPoint,\r\n  OS_Cursor_Disabled,\r\n  OS_Cursor_COUNT,\r\n}\r\nOS_Cursor;\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"os/gfx/generated/os_gfx.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Types\r\n\r\ntypedef enum OS_EventKind\r\n{\r\n  OS_EventKind_Null,\r\n  OS_EventKind_Press,\r\n  OS_EventKind_Release,\r\n  OS_EventKind_MouseMove,\r\n  OS_EventKind_Text,\r\n  OS_EventKind_Scroll,\r\n  OS_EventKind_WindowLoseFocus,\r\n  OS_EventKind_WindowClose,\r\n  OS_EventKind_FileDrop,\r\n  OS_EventKind_Wakeup,\r\n  OS_EventKind_COUNT\r\n}\r\nOS_EventKind;\r\n\r\ntypedef U32 OS_Modifiers;\r\nenum\r\n{\r\n  OS_Modifier_Ctrl  = (1<<0),\r\n  OS_Modifier_Shift = (1<<1),\r\n  OS_Modifier_Alt   = (1<<2),\r\n};\r\n\r\ntypedef struct OS_Event OS_Event;\r\nstruct OS_Event\r\n{\r\n  OS_Event *next;\r\n  OS_Event *prev;\r\n  U64 timestamp_us;\r\n  OS_Handle window;\r\n  OS_EventKind kind;\r\n  OS_Modifiers modifiers;\r\n  OS_Key key;\r\n  B32 is_repeat;\r\n  B32 right_sided;\r\n  U32 character;\r\n  U32 repeat_count;\r\n  Vec2F32 pos;\r\n  Vec2F32 delta;\r\n  String8List strings;\r\n};\r\n\r\ntypedef struct OS_EventList OS_EventList;\r\nstruct OS_EventList\r\n{\r\n  U64 count;\r\n  OS_Event *first;\r\n  OS_Event *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Application-Defined Frame Hook Forward Declaration\r\n\r\ninternal B32 frame(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Functions (Helpers, Implemented Once)\r\n\r\ninternal String8 os_string_from_event_kind(OS_EventKind kind);\r\ninternal String8List os_string_list_from_modifiers(Arena *arena, OS_Modifiers flags);\r\ninternal String8 os_string_from_modifiers_key(Arena *arena, OS_Modifiers modifiers, OS_Key key);\r\ninternal U32 os_codepoint_from_modifiers_and_key(OS_Modifiers flags, OS_Key key);\r\ninternal void os_eat_event(OS_EventList *events, OS_Event *event);\r\ninternal B32  os_key_press(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key);\r\ninternal B32  os_key_release(OS_EventList *events, OS_Handle window, OS_Modifiers modifiers, OS_Key key);\r\ninternal B32  os_text(OS_EventList *events, OS_Handle window, U32 character);\r\ninternal OS_EventList os_event_list_copy(Arena *arena, OS_EventList *src);\r\ninternal void os_event_list_concat_in_place(OS_EventList *dst, OS_EventList *to_push);\r\ninternal OS_Event *os_event_list_push_new(Arena *arena, OS_EventList *evts, OS_EventKind kind);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)\r\n\r\ninternal void os_gfx_init(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS)\r\n\r\ninternal OS_GfxInfo *os_get_gfx_info(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Clipboards (Implemented Per-OS)\r\n\r\ninternal void    os_set_clipboard_text(String8 string);\r\ninternal String8 os_get_clipboard_text(Arena *arena);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle      os_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title);\r\ninternal void           os_window_close(OS_Handle window);\r\ninternal void           os_window_set_title(OS_Handle window, String8 title);\r\ninternal void           os_window_first_paint(OS_Handle window);\r\ninternal void           os_window_focus(OS_Handle window);\r\ninternal B32            os_window_is_focused(OS_Handle window);\r\ninternal B32            os_window_is_fullscreen(OS_Handle window);\r\ninternal void           os_window_set_fullscreen(OS_Handle window, B32 fullscreen);\r\ninternal B32            os_window_is_maximized(OS_Handle window);\r\ninternal void           os_window_set_maximized(OS_Handle window, B32 maximized);\r\ninternal B32            os_window_is_minimized(OS_Handle window);\r\ninternal void           os_window_set_minimized(OS_Handle window, B32 minimized);\r\ninternal void           os_window_bring_to_front(OS_Handle window);\r\ninternal void           os_window_set_monitor(OS_Handle window, OS_Handle monitor);\r\ninternal void           os_window_clear_custom_border_data(OS_Handle handle);\r\ninternal void           os_window_push_custom_title_bar(OS_Handle handle, F32 thickness);\r\ninternal void           os_window_push_custom_edges(OS_Handle handle, F32 thickness);\r\ninternal void           os_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect);\r\ninternal Rng2F32        os_rect_from_window(OS_Handle window);\r\ninternal Rng2F32        os_client_rect_from_window(OS_Handle window);\r\ninternal F32            os_dpi_from_window(OS_Handle window);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks External Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle      os_focused_external_window(void);\r\ninternal void           os_focus_external_window(OS_Handle handle);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Monitors (Implemented Per-OS)\r\n\r\ninternal OS_HandleArray os_push_monitors_array(Arena *arena);\r\ninternal OS_Handle      os_primary_monitor(void);\r\ninternal OS_Handle      os_monitor_from_window(OS_Handle window);\r\ninternal String8        os_name_from_monitor(Arena *arena, OS_Handle monitor);\r\ninternal Vec2F32        os_dim_from_monitor(OS_Handle monitor);\r\ninternal F32            os_dpi_from_monitor(OS_Handle monitor);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Events (Implemented Per-OS)\r\n\r\ninternal void           os_send_wakeup_event(void);\r\ninternal OS_EventList   os_get_events(Arena *arena, B32 wait);\r\ninternal OS_Modifiers   os_get_modifiers(void);\r\ninternal B32            os_key_is_down(OS_Key key);\r\ninternal Vec2F32        os_mouse_from_window(OS_Handle window);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Cursors (Implemented Per-OS)\r\n\r\ninternal void           os_set_cursor(OS_Cursor cursor);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS)\r\n\r\ninternal void           os_graphical_message(B32 error, String8 title, String8 message);\r\ninternal String8        os_graphical_pick_file(Arena *arena, String8 initial_path);\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shell Operations\r\n\r\ninternal void           os_show_in_filesystem_ui(String8 path);\r\ninternal void           os_open_in_browser(String8 url);\r\n\r\n#endif // OS_GFX_H\r\n"
  },
  {
    "path": "src/os/gfx/os_gfx.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Tables\r\n\r\n@table(name, display_string, cfg_string)\r\nOS_KeyTable:\r\n{\r\n  {Null                 \"Invalid Key\"            \"null\"                                }\r\n  {Esc                  \"Escape\"                 \"esc\"                                 }\r\n  {F1                   \"F1\"                     \"f1\"                                  }\r\n  {F2                   \"F2\"                     \"f2\"                                  }\r\n  {F3                   \"F3\"                     \"f3\"                                  }\r\n  {F4                   \"F4\"                     \"f4\"                                  }\r\n  {F5                   \"F5\"                     \"f5\"                                  }\r\n  {F6                   \"F6\"                     \"f6\"                                  }\r\n  {F7                   \"F7\"                     \"f7\"                                  }\r\n  {F8                   \"F8\"                     \"f8\"                                  }\r\n  {F9                   \"F9\"                     \"f9\"                                  }\r\n  {F10                  \"F10\"                    \"f10\"                                 }\r\n  {F11                  \"F11\"                    \"f11\"                                 }\r\n  {F12                  \"F12\"                    \"f12\"                                 }\r\n  {F13                  \"F13\"                    \"f13\"                                 }\r\n  {F14                  \"F14\"                    \"f14\"                                 }\r\n  {F15                  \"F15\"                    \"f15\"                                 }\r\n  {F16                  \"F16\"                    \"f16\"                                 }\r\n  {F17                  \"F17\"                    \"f17\"                                 }\r\n  {F18                  \"F18\"                    \"f18\"                                 }\r\n  {F19                  \"F19\"                    \"f19\"                                 }\r\n  {F20                  \"F20\"                    \"f20\"                                 }\r\n  {F21                  \"F21\"                    \"f21\"                                 }\r\n  {F22                  \"F22\"                    \"f22\"                                 }\r\n  {F23                  \"F23\"                    \"f23\"                                 }\r\n  {F24                  \"F24\"                    \"f24\"                                 }\r\n  {Tick                 \"Tick\"                   \"tick\"                                }\r\n  {0                    \"0\"                      \"0\"                                   }\r\n  {1                    \"1\"                      \"1\"                                   }\r\n  {2                    \"2\"                      \"2\"                                   }\r\n  {3                    \"3\"                      \"3\"                                   }\r\n  {4                    \"4\"                      \"4\"                                   }\r\n  {5                    \"5\"                      \"5\"                                   }\r\n  {6                    \"6\"                      \"6\"                                   }\r\n  {7                    \"7\"                      \"7\"                                   }\r\n  {8                    \"8\"                      \"8\"                                   }\r\n  {9                    \"9\"                      \"9\"                                   }\r\n  {Minus                \"Minus\"                  \"minus\"                               }\r\n  {Equal                \"Equal\"                  \"equal\"                               }\r\n  {Backspace            \"Backspace\"              \"backspace\"                           }\r\n  {Tab                  \"Tab\"                    \"tab\"                                 }\r\n  {Q                    \"Q\"                      \"q\"                                   }\r\n  {W                    \"W\"                      \"w\"                                   }\r\n  {E                    \"E\"                      \"e\"                                   }\r\n  {R                    \"R\"                      \"r\"                                   }\r\n  {T                    \"T\"                      \"t\"                                   }\r\n  {Y                    \"Y\"                      \"y\"                                   }\r\n  {U                    \"U\"                      \"u\"                                   }\r\n  {I                    \"I\"                      \"i\"                                   }\r\n  {O                    \"O\"                      \"o\"                                   }\r\n  {P                    \"P\"                      \"p\"                                   }\r\n  {LeftBracket          \"Left Bracket\"           \"left_bracket\"                        }\r\n  {RightBracket         \"Right Bracket\"          \"right_bracket\"                       }\r\n  {BackSlash            \"Back Slash\"             \"backslash\"                           }\r\n  {CapsLock             \"Caps Lock\"              \"caps_lock\"                           }\r\n  {A                    \"A\"                      \"a\"                                   }\r\n  {S                    \"S\"                      \"s\"                                   }\r\n  {D                    \"D\"                      \"d\"                                   }\r\n  {F                    \"F\"                      \"f\"                                   }\r\n  {G                    \"G\"                      \"g\"                                   }\r\n  {H                    \"H\"                      \"h\"                                   }\r\n  {J                    \"J\"                      \"j\"                                   }\r\n  {K                    \"K\"                      \"k\"                                   }\r\n  {L                    \"L\"                      \"l\"                                   }\r\n  {Semicolon            \"Semicolon\"              \"semicolon\"                           }\r\n  {Quote                \"Quote\"                  \"quote\"                               }\r\n  {Return               \"Return\"                 \"return\"                              }\r\n  {Shift                \"Shift\"                  \"shift\"                               }\r\n  {Z                    \"Z\"                      \"z\"                                   }\r\n  {X                    \"X\"                      \"x\"                                   }\r\n  {C                    \"C\"                      \"c\"                                   }\r\n  {V                    \"V\"                      \"v\"                                   }\r\n  {B                    \"B\"                      \"b\"                                   }\r\n  {N                    \"N\"                      \"n\"                                   }\r\n  {M                    \"M\"                      \"m\"                                   }\r\n  {Comma                \"Comma\"                  \"comma\"                               }\r\n  {Period               \"Period\"                 \"period\"                              }\r\n  {Slash                \"Slash\"                  \"slash\"                               }\r\n  {Ctrl                 \"Ctrl\"                   \"ctrl\"                                }\r\n  {Alt                  \"Alt\"                    \"alt\"                                 }\r\n  {Space                \"Space\"                  \"space\"                               }\r\n  {Menu                 \"Menu\"                   \"menu\"                                }\r\n  {ScrollLock           \"Scroll Lock\"            \"scroll_lock\"                         }\r\n  {Pause                \"Pause\"                  \"pause\"                               }\r\n  {Insert               \"Insert\"                 \"insert\"                              }\r\n  {Home                 \"Home\"                   \"home\"                                }\r\n  {PageUp               \"Page Up\"                \"page_up\"                             }\r\n  {Delete               \"Delete\"                 \"delete\"                              }\r\n  {End                  \"End\"                    \"end\"                                 }\r\n  {PageDown             \"Page Down\"              \"page_down\"                           }\r\n  {Up                   \"Up\"                     \"up\"                                  }\r\n  {Left                 \"Left\"                   \"left\"                                }\r\n  {Down                 \"Down\"                   \"down\"                                }\r\n  {Right                \"Right\"                  \"right\"                               }\r\n  {Ex0                  \"Ex0\"                    \"ex0\"                                 }\r\n  {Ex1                  \"Ex1\"                    \"ex1\"                                 }\r\n  {Ex2                  \"Ex2\"                    \"ex2\"                                 }\r\n  {Ex3                  \"Ex3\"                    \"ex3\"                                 }\r\n  {Ex4                  \"Ex4\"                    \"ex4\"                                 }\r\n  {Ex5                  \"Ex5\"                    \"ex5\"                                 }\r\n  {Ex6                  \"Ex6\"                    \"ex6\"                                 }\r\n  {Ex7                  \"Ex7\"                    \"ex7\"                                 }\r\n  {Ex8                  \"Ex8\"                    \"ex8\"                                 }\r\n  {Ex9                  \"Ex9\"                    \"ex9\"                                 }\r\n  {Ex10                 \"Ex10\"                   \"ex10\"                                }\r\n  {Ex11                 \"Ex11\"                   \"ex11\"                                }\r\n  {Ex12                 \"Ex12\"                   \"ex12\"                                }\r\n  {Ex13                 \"Ex13\"                   \"ex13\"                                }\r\n  {Ex14                 \"Ex14\"                   \"ex14\"                                }\r\n  {Ex15                 \"Ex15\"                   \"ex15\"                                }\r\n  {Ex16                 \"Ex16\"                   \"ex16\"                                }\r\n  {Ex17                 \"Ex17\"                   \"ex17\"                                }\r\n  {Ex18                 \"Ex18\"                   \"ex18\"                                }\r\n  {Ex19                 \"Ex19\"                   \"ex19\"                                }\r\n  {Ex20                 \"Ex20\"                   \"ex20\"                                }\r\n  {Ex21                 \"Ex21\"                   \"ex21\"                                }\r\n  {Ex22                 \"Ex22\"                   \"ex22\"                                }\r\n  {Ex23                 \"Ex23\"                   \"ex23\"                                }\r\n  {Ex24                 \"Ex24\"                   \"ex24\"                                }\r\n  {Ex25                 \"Ex25\"                   \"ex25\"                                }\r\n  {Ex26                 \"Ex26\"                   \"ex26\"                                }\r\n  {Ex27                 \"Ex27\"                   \"ex27\"                                }\r\n  {Ex28                 \"Ex28\"                   \"ex28\"                                }\r\n  {Ex29                 \"Ex29\"                   \"ex29\"                                }\r\n  {NumLock              \"Num Lock\"               \"num_lock\"                            }\r\n  {NumSlash             \"Numpad Slash\"           \"numpad_slash\"                        }\r\n  {NumStar              \"Numpad Star\"            \"numpad_star\"                         }\r\n  {NumMinus             \"Numpad Minus\"           \"numpad_minus\"                        }\r\n  {NumPlus              \"Numpad Plus\"            \"numpad_plus\"                         }\r\n  {NumPeriod            \"Numpad Period\"          \"numpad_period\"                       }\r\n  {Num0                 \"Numpad 0\"               \"numpad_0\"                            }\r\n  {Num1                 \"Numpad 1\"               \"numpad_1\"                            }\r\n  {Num2                 \"Numpad 2\"               \"numpad_2\"                            }\r\n  {Num3                 \"Numpad 3\"               \"numpad_3\"                            }\r\n  {Num4                 \"Numpad 4\"               \"numpad_4\"                            }\r\n  {Num5                 \"Numpad 5\"               \"numpad_5\"                            }\r\n  {Num6                 \"Numpad 6\"               \"numpad_6\"                            }\r\n  {Num7                 \"Numpad 7\"               \"numpad_7\"                            }\r\n  {Num8                 \"Numpad 8\"               \"numpad_8\"                            }\r\n  {Num9                 \"Numpad 9\"               \"numpad_9\"                            }\r\n  {LeftMouseButton      \"Left Mouse Button\"      \"left_mouse\"                          }\r\n  {MiddleMouseButton    \"Middle Mouse Button\"    \"middle_mouse\"                        }\r\n  {RightMouseButton     \"Right Mouse Button\"     \"right_mouse\"                         }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Generators\r\n\r\n@enum OS_Key:\r\n{\r\n  @expand(OS_KeyTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@data(String8) os_g_key_display_string_table:\r\n{\r\n  @expand(OS_KeyTable a) `str8_lit_comp(\"$(a.display_string)\")`;\r\n}\r\n\r\n@data(String8) os_g_key_cfg_string_table:\r\n{\r\n  @expand(OS_KeyTable a) `str8_lit_comp(\"$(a.cfg_string)\")`;\r\n}\r\n"
  },
  {
    "path": "src/os/gfx/stub/os_gfx_stub.c",
    "content": "////////////////////////////////\r\n//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)\r\n\r\ninternal void\r\nos_gfx_init(void)\r\n{\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS)\r\n\r\ninternal OS_GfxInfo *\r\nos_get_gfx_info(void)\r\n{\r\n  local_persist OS_GfxInfo g = {0};\r\n  return &g;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Clipboards (Implemented Per-OS)\r\n\r\ninternal void\r\nos_set_clipboard_text(String8 string)\r\n{\r\n}\r\n\r\ninternal String8\r\nos_get_clipboard_text(Arena *arena)\r\n{\r\n  return str8_zero();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title)\r\n{\r\n  OS_Handle handle = {1};\r\n  return handle;\r\n}\r\n\r\ninternal void\r\nos_window_close(OS_Handle window)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_set_title(OS_Handle window, String8 title)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_first_paint(OS_Handle window)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_focus(OS_Handle window)\r\n{\r\n}\r\n\r\ninternal B32\r\nos_window_is_focused(OS_Handle window)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal B32\r\nos_window_is_fullscreen(OS_Handle window)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_window_set_fullscreen(OS_Handle window, B32 fullscreen)\r\n{\r\n}\r\n\r\ninternal B32\r\nos_window_is_maximized(OS_Handle window)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_window_set_maximized(OS_Handle window, B32 maximized)\r\n{\r\n}\r\n\r\ninternal B32\r\nos_window_is_minimized(OS_Handle window)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal void\r\nos_window_set_minimized(OS_Handle window, B32 minimized)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_bring_to_front(OS_Handle window)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_set_monitor(OS_Handle window, OS_Handle monitor)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_clear_custom_border_data(OS_Handle handle)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_title_bar(OS_Handle handle, F32 thickness)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_edges(OS_Handle handle, F32 thickness)\r\n{\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect)\r\n{\r\n}\r\n\r\ninternal Rng2F32\r\nos_rect_from_window(OS_Handle window)\r\n{\r\n  Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500));\r\n  return rect;\r\n}\r\n\r\ninternal Rng2F32\r\nos_client_rect_from_window(OS_Handle window)\r\n{\r\n  Rng2F32 rect = r2f32(v2f32(0, 0), v2f32(500, 500));\r\n  return rect;\r\n}\r\n\r\ninternal F32\r\nos_dpi_from_window(OS_Handle window)\r\n{\r\n  return 96.f;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks External Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_focused_external_window(void)\r\n{\r\n  OS_Handle result = {0};\r\n  // TODO(rjf)\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_focus_external_window(OS_Handle handle)\r\n{\r\n  // TODO(rjf)\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Monitors (Implemented Per-OS)\r\n\r\ninternal OS_HandleArray\r\nos_push_monitors_array(Arena *arena)\r\n{\r\n  OS_HandleArray arr = {0};\r\n  return arr;\r\n}\r\n\r\ninternal OS_Handle\r\nos_primary_monitor(void)\r\n{\r\n  OS_Handle handle = {1};\r\n  return handle;\r\n}\r\n\r\ninternal OS_Handle\r\nos_monitor_from_window(OS_Handle window)\r\n{\r\n  OS_Handle handle = {1};\r\n  return handle;\r\n}\r\n\r\ninternal String8\r\nos_name_from_monitor(Arena *arena, OS_Handle monitor)\r\n{\r\n  return str8_zero();\r\n}\r\n\r\ninternal Vec2F32\r\nos_dim_from_monitor(OS_Handle monitor)\r\n{\r\n  Vec2F32 v = v2f32(1000, 1000);\r\n  return v;\r\n}\r\n\r\ninternal F32\r\nos_dpi_from_monitor(OS_Handle monitor)\r\n{\r\n  return 96.f;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Events (Implemented Per-OS)\r\n\r\ninternal void\r\nos_send_wakeup_event(void)\r\n{\r\n}\r\n\r\ninternal OS_EventList\r\nos_get_events(Arena *arena, B32 wait)\r\n{\r\n  OS_EventList evts = {0};\r\n  return evts;\r\n}\r\n\r\ninternal OS_Modifiers\r\nos_get_modifiers(void)\r\n{\r\n  OS_Modifiers f = 0;\r\n  return f;\r\n}\r\n\r\ninternal B32\r\nos_key_is_down(OS_Key key)\r\n{\r\n  return 0;\r\n}\r\n\r\ninternal Vec2F32\r\nos_mouse_from_window(OS_Handle window)\r\n{\r\n  return v2f32(0, 0);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Cursors (Implemented Per-OS)\r\n\r\ninternal void\r\nos_set_cursor(OS_Cursor cursor)\r\n{\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS)\r\n\r\ninternal void\r\nos_graphical_message(B32 error, String8 title, String8 message)\r\n{\r\n}\r\n\r\ninternal String8\r\nos_graphical_pick_file(Arena *arena, String8 initial_path)\r\n{\r\n  return str8_zero();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shell Operations\r\n\r\ninternal void\r\nos_show_in_filesystem_ui(String8 path)\r\n{\r\n}\r\n\r\ninternal void\r\nos_open_in_browser(String8 url)\r\n{\r\n}\r\n"
  },
  {
    "path": "src/os/gfx/stub/os_gfx_stub.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_GFX_STUB_H\r\n#define OS_GFX_STUB_H\r\n\r\n#endif // OS_GFX_STUB_H\r\n"
  },
  {
    "path": "src/os/gfx/win32/os_gfx_win32.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Modern Windows SDK Functions\r\n//\r\n// (We must dynamically link to them, since they can be missing in older SDKs)\r\n\r\ntypedef BOOL w32_SetProcessDpiAwarenessContext_Type(void* value);\r\ntypedef UINT w32_GetDpiForWindow_Type(HWND hwnd);\r\ntypedef HRESULT w32_GetDpiForMonitor_Type(HMONITOR hmonitor, MONITOR_DPI_TYPE dpiType, UINT *dpiX, UINT *dpiY);\r\ntypedef int w32_GetSystemMetricsForDpi_Type(int nIndex, UINT dpi);\r\n#define w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 ((void*)-4)\r\nglobal w32_GetDpiForWindow_Type *w32_GetDpiForWindow_func = 0;\r\nglobal w32_GetDpiForMonitor_Type *w32_GetDpiForMonitor_func = 0;\r\nglobal w32_GetSystemMetricsForDpi_Type *w32_GetSystemMetricsForDpi_func = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal Rng2F32\r\nos_w32_rng2f32_from_rect(RECT rect)\r\n{\r\n  Rng2F32 r = {0};\r\n  r.x0 = (F32)rect.left;\r\n  r.x1 = (F32)rect.right;\r\n  r.y0 = (F32)rect.top;\r\n  r.y1 = (F32)rect.bottom;\r\n  return r;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Windows\r\n\r\ninternal OS_Handle\r\nos_w32_handle_from_window(OS_W32_Window *window)\r\n{\r\n  OS_Handle handle = {(U64)window};\r\n  return handle;\r\n}\r\n\r\ninternal OS_W32_Window *\r\nos_w32_window_from_handle(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = (OS_W32_Window *)handle.u64[0];\r\n  return window;\r\n}\r\n\r\ninternal OS_W32_Window *\r\nos_w32_window_from_hwnd(HWND hwnd)\r\n{\r\n  OS_W32_Window *result = 0;\r\n  for(OS_W32_Window *w = os_w32_gfx_state->first_window; w; w = w->next)\r\n  {\r\n    if(w->hwnd == hwnd)\r\n    {\r\n      result = w;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal HWND\r\nos_w32_hwnd_from_window(OS_W32_Window *window)\r\n{\r\n  return window->hwnd;\r\n}\r\n\r\ninternal OS_W32_Window *\r\nos_w32_window_alloc(void)\r\n{\r\n  OS_W32_Window *result = os_w32_gfx_state->free_window;\r\n  if(result)\r\n  {\r\n    SLLStackPop(os_w32_gfx_state->free_window);\r\n  }\r\n  else\r\n  {\r\n    result = push_array_no_zero(os_w32_gfx_state->arena, OS_W32_Window, 1);\r\n  }\r\n  MemoryZeroStruct(result);\r\n  if(result)\r\n  {\r\n    DLLPushBack(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, result);\r\n  }\r\n  result->last_window_placement.length = sizeof(WINDOWPLACEMENT);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_w32_window_release(OS_W32_Window *window)\r\n{\r\n  if(window->paint_arena != 0)\r\n  {\r\n    arena_release(window->paint_arena);\r\n  }\r\n  ReleaseDC(window->hwnd, window->hdc);\r\n  DestroyWindow(window->hwnd);\r\n  DLLRemove(os_w32_gfx_state->first_window, os_w32_gfx_state->last_window, window);\r\n  SLLStackPush(os_w32_gfx_state->free_window, window);\r\n}\r\n\r\ninternal OS_Event *\r\nos_w32_push_event(OS_EventKind kind, OS_W32_Window *window)\r\n{\r\n  OS_Event *result = os_event_list_push_new(os_w32_event_arena, &os_w32_event_list, kind);\r\n  result->window = os_w32_handle_from_window(window);\r\n  result->modifiers = os_get_modifiers();\r\n  return result;\r\n}\r\n\r\ninternal OS_Key\r\nos_w32_os_key_from_vkey(WPARAM vkey)\r\n{\r\n  local_persist B32 first = 1;\r\n  local_persist OS_Key key_table[256];\r\n  if (first){\r\n    first = 0;\r\n    MemoryZeroArray(key_table);\r\n    \r\n    key_table[(unsigned int)'A'] = OS_Key_A;\r\n    key_table[(unsigned int)'B'] = OS_Key_B;\r\n    key_table[(unsigned int)'C'] = OS_Key_C;\r\n    key_table[(unsigned int)'D'] = OS_Key_D;\r\n    key_table[(unsigned int)'E'] = OS_Key_E;\r\n    key_table[(unsigned int)'F'] = OS_Key_F;\r\n    key_table[(unsigned int)'G'] = OS_Key_G;\r\n    key_table[(unsigned int)'H'] = OS_Key_H;\r\n    key_table[(unsigned int)'I'] = OS_Key_I;\r\n    key_table[(unsigned int)'J'] = OS_Key_J;\r\n    key_table[(unsigned int)'K'] = OS_Key_K;\r\n    key_table[(unsigned int)'L'] = OS_Key_L;\r\n    key_table[(unsigned int)'M'] = OS_Key_M;\r\n    key_table[(unsigned int)'N'] = OS_Key_N;\r\n    key_table[(unsigned int)'O'] = OS_Key_O;\r\n    key_table[(unsigned int)'P'] = OS_Key_P;\r\n    key_table[(unsigned int)'Q'] = OS_Key_Q;\r\n    key_table[(unsigned int)'R'] = OS_Key_R;\r\n    key_table[(unsigned int)'S'] = OS_Key_S;\r\n    key_table[(unsigned int)'T'] = OS_Key_T;\r\n    key_table[(unsigned int)'U'] = OS_Key_U;\r\n    key_table[(unsigned int)'V'] = OS_Key_V;\r\n    key_table[(unsigned int)'W'] = OS_Key_W;\r\n    key_table[(unsigned int)'X'] = OS_Key_X;\r\n    key_table[(unsigned int)'Y'] = OS_Key_Y;\r\n    key_table[(unsigned int)'Z'] = OS_Key_Z;\r\n    \r\n    for (U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1){\r\n      key_table[i] = (OS_Key)j;\r\n    }\r\n    for (U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1){\r\n      key_table[i] = (OS_Key)j;\r\n    }\r\n    for (U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1){\r\n      key_table[i] = (OS_Key)j;\r\n    }\r\n    \r\n    key_table[VK_SPACE]     = OS_Key_Space;\r\n    key_table[VK_OEM_3]     = OS_Key_Tick;\r\n    key_table[VK_OEM_MINUS] = OS_Key_Minus;\r\n    key_table[VK_OEM_PLUS]  = OS_Key_Equal;\r\n    key_table[VK_OEM_4]     = OS_Key_LeftBracket;\r\n    key_table[VK_OEM_6]     = OS_Key_RightBracket;\r\n    key_table[VK_OEM_1]     = OS_Key_Semicolon;\r\n    key_table[VK_OEM_7]     = OS_Key_Quote;\r\n    key_table[VK_OEM_COMMA] = OS_Key_Comma;\r\n    key_table[VK_OEM_PERIOD]= OS_Key_Period;\r\n    key_table[VK_OEM_2]     = OS_Key_Slash;\r\n    key_table[VK_OEM_5]     = OS_Key_BackSlash;\r\n    \r\n    key_table[VK_TAB]       = OS_Key_Tab;\r\n    key_table[VK_PAUSE]     = OS_Key_Pause;\r\n    key_table[VK_ESCAPE]    = OS_Key_Esc;\r\n    \r\n    key_table[VK_UP]        = OS_Key_Up;\r\n    key_table[VK_LEFT]      = OS_Key_Left;\r\n    key_table[VK_DOWN]      = OS_Key_Down;\r\n    key_table[VK_RIGHT]     = OS_Key_Right;\r\n    \r\n    key_table[VK_BACK]      = OS_Key_Backspace;\r\n    key_table[VK_RETURN]    = OS_Key_Return;\r\n    \r\n    key_table[VK_DELETE]    = OS_Key_Delete;\r\n    key_table[VK_INSERT]    = OS_Key_Insert;\r\n    key_table[VK_PRIOR]     = OS_Key_PageUp;\r\n    key_table[VK_NEXT]      = OS_Key_PageDown;\r\n    key_table[VK_HOME]      = OS_Key_Home;\r\n    key_table[VK_END]       = OS_Key_End;\r\n    \r\n    key_table[VK_CAPITAL]   = OS_Key_CapsLock;\r\n    key_table[VK_NUMLOCK]   = OS_Key_NumLock;\r\n    key_table[VK_SCROLL]    = OS_Key_ScrollLock;\r\n    key_table[VK_APPS]      = OS_Key_Menu;\r\n    \r\n    key_table[VK_CONTROL]   = OS_Key_Ctrl;\r\n    key_table[VK_LCONTROL]  = OS_Key_Ctrl;\r\n    key_table[VK_RCONTROL]  = OS_Key_Ctrl;\r\n    key_table[VK_SHIFT]     = OS_Key_Shift;\r\n    key_table[VK_LSHIFT]    = OS_Key_Shift;\r\n    key_table[VK_RSHIFT]    = OS_Key_Shift;\r\n    key_table[VK_MENU]      = OS_Key_Alt;\r\n    key_table[VK_LMENU]     = OS_Key_Alt;\r\n    key_table[VK_RMENU]     = OS_Key_Alt;\r\n    \r\n    key_table[VK_DIVIDE]   = OS_Key_NumSlash;\r\n    key_table[VK_MULTIPLY] = OS_Key_NumStar;\r\n    key_table[VK_SUBTRACT] = OS_Key_NumMinus;\r\n    key_table[VK_ADD]      = OS_Key_NumPlus;\r\n    key_table[VK_DECIMAL]  = OS_Key_NumPeriod;\r\n    \r\n    for (U32 i = 0; i < 10; i += 1){\r\n      key_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i);\r\n    }\r\n    \r\n    for (U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1){\r\n      key_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j);\r\n    }\r\n  }\r\n  \r\n  OS_Key key = key_table[vkey&bitmask8];\r\n  return key;\r\n}\r\n\r\ninternal WPARAM\r\nos_w32_vkey_from_os_key(OS_Key key)\r\n{\r\n  WPARAM result = 0;\r\n  {\r\n    local_persist B32 initialized = 0;\r\n    local_persist WPARAM vkey_table[OS_Key_COUNT] = {0};\r\n    if(initialized == 0)\r\n    {\r\n      initialized = 1;\r\n      vkey_table[OS_Key_Esc] = VK_ESCAPE;\r\n      for(OS_Key key = OS_Key_F1; key <= OS_Key_F24; key = (OS_Key)(key+1))\r\n      {\r\n        vkey_table[key] = VK_F1+(key-OS_Key_F1);\r\n      }\r\n      vkey_table[OS_Key_Tick] = VK_OEM_3;\r\n      for(OS_Key key = OS_Key_0; key <= OS_Key_9; key = (OS_Key)(key+1))\r\n      {\r\n        vkey_table[key] = '0'+(key-OS_Key_0);\r\n      }\r\n      vkey_table[OS_Key_Minus] = VK_OEM_MINUS;\r\n      vkey_table[OS_Key_Equal] = VK_OEM_PLUS;\r\n      vkey_table[OS_Key_Backspace] = VK_BACK;\r\n      vkey_table[OS_Key_Tab] = VK_TAB;\r\n      vkey_table[OS_Key_Q] = 'Q';\r\n      vkey_table[OS_Key_W] = 'W';\r\n      vkey_table[OS_Key_E] = 'E';\r\n      vkey_table[OS_Key_R] = 'R';\r\n      vkey_table[OS_Key_T] = 'T';\r\n      vkey_table[OS_Key_Y] = 'Y';\r\n      vkey_table[OS_Key_U] = 'U';\r\n      vkey_table[OS_Key_I] = 'I';\r\n      vkey_table[OS_Key_O] = 'O';\r\n      vkey_table[OS_Key_P] = 'P';\r\n      vkey_table[OS_Key_LeftBracket] = VK_OEM_4;\r\n      vkey_table[OS_Key_RightBracket] = VK_OEM_6;\r\n      vkey_table[OS_Key_BackSlash] = VK_OEM_5;\r\n      vkey_table[OS_Key_CapsLock] = VK_CAPITAL;\r\n      vkey_table[OS_Key_A] = 'A';\r\n      vkey_table[OS_Key_S] = 'S';\r\n      vkey_table[OS_Key_D] = 'D';\r\n      vkey_table[OS_Key_F] = 'F';\r\n      vkey_table[OS_Key_G] = 'G';\r\n      vkey_table[OS_Key_H] = 'H';\r\n      vkey_table[OS_Key_J] = 'J';\r\n      vkey_table[OS_Key_K] = 'K';\r\n      vkey_table[OS_Key_L] = 'L';\r\n      vkey_table[OS_Key_Semicolon] = VK_OEM_1;\r\n      vkey_table[OS_Key_Quote] = VK_OEM_7;\r\n      vkey_table[OS_Key_Return] = VK_RETURN;\r\n      vkey_table[OS_Key_Shift] = VK_SHIFT;\r\n      vkey_table[OS_Key_Z] = 'Z';\r\n      vkey_table[OS_Key_X] = 'X';\r\n      vkey_table[OS_Key_C] = 'C';\r\n      vkey_table[OS_Key_V] = 'V';\r\n      vkey_table[OS_Key_B] = 'B';\r\n      vkey_table[OS_Key_N] = 'N';\r\n      vkey_table[OS_Key_M] = 'M';\r\n      vkey_table[OS_Key_Comma] = VK_OEM_COMMA;\r\n      vkey_table[OS_Key_Period] = VK_OEM_PERIOD;\r\n      vkey_table[OS_Key_Slash] = VK_OEM_2;\r\n      vkey_table[OS_Key_Ctrl] = VK_CONTROL;\r\n      vkey_table[OS_Key_Alt] = VK_MENU;\r\n      vkey_table[OS_Key_Space] = VK_SPACE;\r\n      vkey_table[OS_Key_Menu] = VK_APPS;\r\n      vkey_table[OS_Key_ScrollLock] = VK_SCROLL;\r\n      vkey_table[OS_Key_Pause] = VK_PAUSE;\r\n      vkey_table[OS_Key_Insert] = VK_INSERT;\r\n      vkey_table[OS_Key_Home] = VK_HOME;\r\n      vkey_table[OS_Key_PageUp] = VK_PRIOR;\r\n      vkey_table[OS_Key_Delete] = VK_DELETE;\r\n      vkey_table[OS_Key_End] = VK_END;\r\n      vkey_table[OS_Key_PageDown] = VK_NEXT;\r\n      vkey_table[OS_Key_Up] = VK_UP;\r\n      vkey_table[OS_Key_Left] = VK_LEFT;\r\n      vkey_table[OS_Key_Down] = VK_DOWN;\r\n      vkey_table[OS_Key_Right] = VK_RIGHT;\r\n      for(OS_Key key = OS_Key_Ex0; key <= OS_Key_Ex29; key = (OS_Key)(key+1))\r\n      {\r\n        vkey_table[key] = 0xDF + (key-OS_Key_Ex0);\r\n      }\r\n      vkey_table[OS_Key_NumLock] = VK_NUMLOCK;\r\n      vkey_table[OS_Key_NumSlash] = VK_DIVIDE;\r\n      vkey_table[OS_Key_NumStar] = VK_MULTIPLY;\r\n      vkey_table[OS_Key_NumMinus] = VK_SUBTRACT;\r\n      vkey_table[OS_Key_NumPlus] = VK_ADD;\r\n      vkey_table[OS_Key_NumPeriod] = VK_DECIMAL;\r\n      vkey_table[OS_Key_Num0] = VK_NUMPAD0;\r\n      vkey_table[OS_Key_Num1] = VK_NUMPAD1;\r\n      vkey_table[OS_Key_Num2] = VK_NUMPAD2;\r\n      vkey_table[OS_Key_Num3] = VK_NUMPAD3;\r\n      vkey_table[OS_Key_Num4] = VK_NUMPAD4;\r\n      vkey_table[OS_Key_Num5] = VK_NUMPAD5;\r\n      vkey_table[OS_Key_Num6] = VK_NUMPAD6;\r\n      vkey_table[OS_Key_Num7] = VK_NUMPAD7;\r\n      vkey_table[OS_Key_Num8] = VK_NUMPAD8;\r\n      vkey_table[OS_Key_Num9] = VK_NUMPAD9;\r\n      vkey_table[OS_Key_LeftMouseButton] = VK_LBUTTON;\r\n      vkey_table[OS_Key_MiddleMouseButton] = VK_MBUTTON;\r\n      vkey_table[OS_Key_RightMouseButton] = VK_RBUTTON;\r\n    }\r\n    result = vkey_table[key];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal LRESULT\r\nos_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)\r\n{\r\n  ProfBeginFunction();\r\n  LRESULT result = 0;\r\n  B32 good = 1;\r\n  if(os_w32_event_arena == 0)\r\n  {\r\n    result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n    good = 0;\r\n  }\r\n  if(good)\r\n  {\r\n    OS_W32_Window *window = os_w32_window_from_hwnd(hwnd);\r\n    OS_Handle window_handle = os_w32_handle_from_window(window);\r\n    B32 release = 0;\r\n    \r\n    switch(uMsg)\r\n    {\r\n      default:\r\n      {\r\n        result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n      }break;\r\n      \r\n      case WM_ENTERSIZEMOVE:\r\n      {\r\n        os_w32_resizing = 1;\r\n      }break;\r\n      \r\n      case WM_EXITSIZEMOVE:\r\n      {\r\n        os_w32_resizing = 0;\r\n      }break;\r\n      \r\n      case WM_SIZE:\r\n      case WM_PAINT:\r\n      {\r\n        PAINTSTRUCT ps = {0};\r\n        BeginPaint(hwnd, &ps);\r\n        update();\r\n        EndPaint(hwnd, &ps);\r\n        DwmFlush();\r\n      }break;\r\n      \r\n      case WM_CLOSE:\r\n      {\r\n        os_w32_push_event(OS_EventKind_WindowClose, window);\r\n      }break;\r\n      \r\n      case WM_LBUTTONUP:\r\n      case WM_MBUTTONUP:\r\n      case WM_RBUTTONUP:\r\n      {\r\n        release = 1;\r\n      } // fallthrough;\r\n      case WM_LBUTTONDOWN:\r\n      case WM_MBUTTONDOWN:\r\n      case WM_RBUTTONDOWN:\r\n      {\r\n        OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window);\r\n        switch (uMsg)\r\n        {\r\n          case WM_LBUTTONUP: case WM_LBUTTONDOWN:\r\n          {\r\n            event->key = OS_Key_LeftMouseButton;\r\n          }break;\r\n          case WM_MBUTTONUP: case WM_MBUTTONDOWN:\r\n          {\r\n            event->key = OS_Key_MiddleMouseButton;\r\n          }break;\r\n          case WM_RBUTTONUP: case WM_RBUTTONDOWN:\r\n          {\r\n            event->key = OS_Key_RightMouseButton;\r\n          }break;\r\n        }\r\n        event->pos.x = (F32)(S16)LOWORD(lParam);\r\n        event->pos.y = (F32)(S16)HIWORD(lParam);\r\n        if(release)\r\n        {\r\n          ReleaseCapture();\r\n        }\r\n        else\r\n        {\r\n          SetCapture(hwnd);\r\n        }\r\n      }break;\r\n      \r\n      case WM_MOUSEMOVE:\r\n      {\r\n        OS_Event *event = os_w32_push_event(OS_EventKind_MouseMove, window);\r\n        event->pos.x = (F32)(S16)LOWORD(lParam);\r\n        event->pos.y = (F32)(S16)HIWORD(lParam);\r\n      }break;\r\n      \r\n      case WM_MOUSEWHEEL:\r\n      {\r\n        S16 wheel_delta = HIWORD(wParam);\r\n        OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window);\r\n        POINT p;\r\n        p.x = (S32)(S16)LOWORD(lParam);\r\n        p.y = (S32)(S16)HIWORD(lParam);\r\n        ScreenToClient(window->hwnd, &p);\r\n        event->pos.x = (F32)p.x;\r\n        event->pos.y = (F32)p.y;\r\n        event->delta = v2f32(0.f, -(F32)wheel_delta);\r\n      }break;\r\n      \r\n      case WM_MOUSEHWHEEL:\r\n      {\r\n        S16 wheel_delta = HIWORD(wParam);\r\n        OS_Event *event = os_w32_push_event(OS_EventKind_Scroll, window);\r\n        POINT p;\r\n        p.x = (S32)(S16)LOWORD(lParam);\r\n        p.y = (S32)(S16)HIWORD(lParam);\r\n        ScreenToClient(window->hwnd, &p);\r\n        event->pos.x = (F32)p.x;\r\n        event->pos.y = (F32)p.y;\r\n        event->delta = v2f32((F32)wheel_delta, 0.f);\r\n      }break;\r\n      \r\n      case WM_SYSKEYDOWN: case WM_SYSKEYUP:\r\n      {\r\n        if(wParam != VK_MENU && (wParam < VK_F1 || VK_F24 < wParam || wParam == VK_F4))\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      } // fallthrough;\r\n      case WM_KEYDOWN: case WM_KEYUP:\r\n      {\r\n        B32 was_down = (lParam & bit31);\r\n        B32 is_down  = !(lParam & bit32);\r\n        \r\n        B32 is_repeat = 0;\r\n        if(!is_down)\r\n        {\r\n          release = 1;\r\n        }\r\n        else if(was_down)\r\n        {\r\n          is_repeat = 1;\r\n        }\r\n        \r\n        B32 right_sided = 0;\r\n        if ((lParam & bit25) &&\r\n            (wParam == VK_CONTROL || wParam == VK_RCONTROL ||\r\n             wParam == VK_MENU || wParam == VK_RMENU ||\r\n             wParam == VK_SHIFT || wParam == VK_RSHIFT))\r\n        {\r\n          right_sided = 1;\r\n        }\r\n        \r\n        OS_Event *event = os_w32_push_event(release ? OS_EventKind_Release : OS_EventKind_Press, window);\r\n        event->key = os_w32_os_key_from_vkey(wParam);\r\n        event->repeat_count = lParam & bitmask16;\r\n        event->is_repeat = is_repeat;\r\n        event->right_sided = right_sided;\r\n        if(event->key == OS_Key_Alt   && event->modifiers & OS_Modifier_Alt)   { event->modifiers &= ~OS_Modifier_Alt; }\r\n        if(event->key == OS_Key_Ctrl  && event->modifiers & OS_Modifier_Ctrl)  { event->modifiers &= ~OS_Modifier_Ctrl; }\r\n        if(event->key == OS_Key_Shift && event->modifiers & OS_Modifier_Shift) { event->modifiers &= ~OS_Modifier_Shift; }\r\n      }break;\r\n      \r\n      case WM_SYSCHAR:\r\n      {\r\n        WORD vk_code = LOWORD(wParam);\r\n        if(vk_code == VK_SPACE)\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n        else\r\n        {\r\n          result = 0;\r\n        }\r\n      }break;\r\n      \r\n      case WM_CHAR:\r\n      {\r\n        U32 character = wParam;\r\n        if(character >= 32 && character != 127)\r\n        {\r\n          OS_Event *event = os_w32_push_event(OS_EventKind_Text, window);\r\n          if(lParam & bit29)\r\n          {\r\n            event->modifiers |= OS_Modifier_Alt;\r\n          }\r\n          event->character = character;\r\n        }\r\n      }break;\r\n      \r\n      case WM_KILLFOCUS:\r\n      {\r\n        os_w32_push_event(OS_EventKind_WindowLoseFocus, window);\r\n        ReleaseCapture();\r\n      }break;\r\n      \r\n      case WM_SETCURSOR:\r\n      {\r\n        Rng2F32 window_rect = os_client_rect_from_window(window_handle);\r\n        Vec2F32 mouse = os_mouse_from_window(window_handle);\r\n        B32 on_border = 0;\r\n        DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0;\r\n        B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW);\r\n        if(window != 0 && window->custom_border && !is_fullscreen)\r\n        {\r\n          B32 on_border_x = (mouse.x <= window->custom_border_edge_thickness || window_rect.x1-window->custom_border_edge_thickness <= mouse.x);\r\n          B32 on_border_y = (mouse.y <= window->custom_border_edge_thickness || window_rect.y1-window->custom_border_edge_thickness <= mouse.y);\r\n          on_border = on_border_x || on_border_y;\r\n        }\r\n        if(!os_w32_resizing && !on_border && contains_2f32(window_rect, mouse))\r\n        {\r\n          SetCursor(os_w32_gfx_state->hCursor);\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      }break;\r\n      \r\n      case WM_DPICHANGED:\r\n      {\r\n        F32 new_dpi = (F32)(wParam & 0xffff);\r\n        RECT suggested_new_rect = *(RECT *)lParam;\r\n        window->dpi = new_dpi;\r\n        SetWindowPos(window->hwnd, 0,\r\n                     suggested_new_rect.left,\r\n                     suggested_new_rect.top,\r\n                     suggested_new_rect.right - suggested_new_rect.left,\r\n                     suggested_new_rect.bottom - suggested_new_rect.top,\r\n                     0);\r\n      }break;\r\n      \r\n      //- rjf: [file drop]\r\n      case WM_DROPFILES:\r\n      {\r\n        HDROP drop = (HDROP)wParam;\r\n        POINT drop_pt = {0};\r\n        DragQueryPoint(drop, &drop_pt);\r\n        U64 num_files_dropped = DragQueryFile(drop, 0xffffffff, 0, 0);\r\n        OS_Event *event = os_w32_push_event(OS_EventKind_FileDrop, window);\r\n        event->pos = v2f32((F32)drop_pt.x, (F32)drop_pt.y);\r\n        for(U64 idx = 0; idx < num_files_dropped; idx += 1)\r\n        {\r\n          U64 name_size = DragQueryFile(drop, idx, 0, 0) + 1;\r\n          U8 *name_ptr = push_array(os_w32_event_arena, U8, name_size);\r\n          DragQueryFile(drop, idx, (char *)name_ptr, name_size);\r\n          String8 path_string = str8(name_ptr, name_size - 1);\r\n          String8 path_string__normalized = path_normalized_from_string(os_w32_event_arena, path_string);\r\n          str8_list_push(os_w32_event_arena, &event->strings, path_string__normalized);\r\n        }\r\n        DragFinish(drop);\r\n      }break;\r\n      \r\n      //- rjf: [custom border]\r\n      case WM_NCPAINT:\r\n      {\r\n        if(os_w32_new_window_custom_border || (window != 0 && window->custom_border && !window->custom_border_composition_enabled))\r\n        {\r\n          result = 0;\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      }break;\r\n      case WM_DWMCOMPOSITIONCHANGED:\r\n      {\r\n        if(window != 0 && window->custom_border)\r\n        {\r\n          BOOL enabled = 0;\r\n          DwmIsCompositionEnabled(&enabled);\r\n          window->custom_border_composition_enabled = enabled;\r\n          if(enabled)\r\n          {\r\n            MARGINS m = { 0, 0, 1, 0 };\r\n            DwmExtendFrameIntoClientArea(hwnd, &m);\r\n            DWORD dwmncrp_enabled = DWMNCRP_ENABLED;\r\n            DwmSetWindowAttribute(hwnd, DWMWA_NCRENDERING_POLICY, &enabled, sizeof(dwmncrp_enabled));\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      }break;\r\n      case WM_WINDOWPOSCHANGED:\r\n      {\r\n        result = 0;\r\n      }break;\r\n      case WM_NCUAHDRAWCAPTION:\r\n      case WM_NCUAHDRAWFRAME:\r\n      {\r\n        // NOTE(rjf): undocumented messages for drawing themed window borders.\r\n        if(os_w32_new_window_custom_border || (window != 0 && window->custom_border))\r\n        {\r\n          result = 0;\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      }break;\r\n      case WM_SETICON:\r\n      case WM_SETTEXT:\r\n      {\r\n        if(os_w32_new_window_custom_border || (window && window->custom_border && !window->custom_border_composition_enabled))\r\n        {\r\n          // NOTE(rjf):\r\n          // https://blogs.msdn.microsoft.com/wpfsdk/2008/09/08/custom-window-chrome-in-wpf/\r\n          LONG_PTR old_style = GetWindowLongPtrW(hwnd, GWL_STYLE);\r\n          SetWindowLongPtrW(hwnd, GWL_STYLE, old_style & ~WS_VISIBLE);\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n          SetWindowLongPtrW(hwnd, GWL_STYLE, old_style);\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: [custom border] activation - without this `result`, stuff flickers.\r\n      case WM_NCACTIVATE:\r\n      {\r\n        if(!os_w32_new_window_custom_border && (window == 0 || window->custom_border == 0))\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, -1);\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: [custom border] client/window size calculation\r\n      case WM_NCCALCSIZE:\r\n      {\r\n        if(os_w32_new_window_custom_border || (window && window->custom_border))\r\n        {\r\n          F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f;\r\n          S32 frame_x = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXFRAME, dpi) : GetSystemMetrics(SM_CXFRAME);\r\n          S32 frame_y = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CYFRAME, dpi) : GetSystemMetrics(SM_CYFRAME);\r\n          S32 padding = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXPADDEDBORDER, dpi) : GetSystemMetrics(SM_CXPADDEDBORDER);\r\n          DWORD window_style = GetWindowLong(hwnd, GWL_STYLE);\r\n          B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW);\r\n          if(!is_fullscreen)\r\n          {\r\n            RECT* rect = wParam == 0 ? (RECT*)lParam : ((NCCALCSIZE_PARAMS*)lParam)->rgrc;\r\n            rect->right  -= frame_x + padding;\r\n            rect->left   += frame_x + padding;\r\n            rect->bottom -= frame_y + padding;\r\n            \r\n            if(IsMaximized(hwnd))\r\n            {\r\n              rect->top += frame_y + padding;\r\n              // If we do not do this hidden taskbar can not be unhidden on mouse hover\r\n              // Unfortunately it can create an ugly bottom border when maximized...\r\n              rect->bottom -= 1; \r\n            }\r\n          }\r\n        }\r\n        else\r\n        {\r\n          result = DefWindowProc(hwnd, uMsg, wParam, lParam);\r\n        }\r\n      }break;\r\n      \r\n      //- rjf: [custom border] client/window hit testing (mapping mouse -> action)\r\n      case WM_NCHITTEST:\r\n      {\r\n        DWORD window_style = window ? GetWindowLong(window->hwnd, GWL_STYLE) : 0;\r\n        B32 is_fullscreen = !(window_style & WS_OVERLAPPEDWINDOW);\r\n        if(window == 0 || window->custom_border == 0 || is_fullscreen)\r\n        {\r\n          result = DefWindowProcW(hwnd, uMsg, wParam, lParam);\r\n        }\r\n        else\r\n        {\r\n          B32 is_default_handled = 0;\r\n          \r\n          // Let the default procedure handle resizing areas\r\n          result = DefWindowProc(hwnd, uMsg, wParam, lParam);\r\n          switch (result)\r\n          {\r\n            case HTNOWHERE:\r\n            case HTRIGHT:\r\n            case HTLEFT:\r\n            case HTTOPLEFT:\r\n            case HTTOPRIGHT:\r\n            case HTBOTTOMRIGHT:\r\n            case HTBOTTOM:\r\n            case HTBOTTOMLEFT:\r\n            {\r\n              is_default_handled = 1;\r\n            } break;\r\n          }\r\n          \r\n          if (!is_default_handled)\r\n          {\r\n            POINT pos_monitor;\r\n            pos_monitor.x = GET_X_LPARAM(lParam);\r\n            pos_monitor.y = GET_Y_LPARAM(lParam);\r\n            POINT pos_client = pos_monitor;\r\n            ScreenToClient(hwnd, &pos_client);\r\n            \r\n            // Adjustments happening in NCCALCSIZE are messing with the detection\r\n            // of the top hit area so manually checking that.\r\n            F32 dpi = w32_GetDpiForWindow_func ? (F32)w32_GetDpiForWindow_func(hwnd) : 96.f;\r\n            S32 frame_y = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CYFRAME, dpi) : GetSystemMetrics(SM_CYFRAME);\r\n            // NOTE(rjf): it seems incorrect to apply this padding here...\r\n            // S32 padding = w32_GetSystemMetricsForDpi_func ? w32_GetSystemMetricsForDpi_func(SM_CXPADDEDBORDER, dpi) : GetSystemMetrics(SM_CXPADDEDBORDER);\r\n            \r\n            B32 is_over_top_resize = pos_client.y >= 0 && pos_client.y < frame_y; // + padding;\r\n            B32 is_over_title_bar  = pos_client.y >= 0 && pos_client.y < window->custom_border_title_thickness;\r\n            \r\n            //- rjf: check against title bar client areas\r\n            B32 is_over_title_bar_client_area = 0;\r\n            for(OS_W32_TitleBarClientArea *area = window->first_title_bar_client_area;\r\n                area != 0;\r\n                area = area->next)\r\n            {\r\n              Rng2F32 rect = area->rect;\r\n              if(rect.x0 <= pos_client.x && pos_client.x < rect.x1 &&\r\n                 rect.y0 <= pos_client.y && pos_client.y < rect.y1)\r\n              {\r\n                is_over_title_bar_client_area = 1;\r\n                break;\r\n              }\r\n            }\r\n            \r\n            if (IsMaximized(hwnd))\r\n            {\r\n              if (is_over_title_bar_client_area)\r\n              {\r\n                result = HTCLIENT;\r\n              }\r\n              else if (is_over_title_bar)\r\n              {\r\n                result = HTCAPTION;\r\n              }\r\n              else \r\n              {\r\n                result = HTCLIENT;\r\n              }\r\n            }\r\n            else\r\n            {\r\n              //Swap the first two conditions to choose if hovering the top border\r\n              //should prioritize resize or title bar buttons.\r\n              if (is_over_title_bar_client_area)\r\n              {\r\n                result = HTCLIENT;\r\n              }\r\n              else if (is_over_top_resize)\r\n              {\r\n                result = HTTOP;\r\n              }\r\n              else if (is_over_title_bar)\r\n              {\r\n                result = HTCAPTION;\r\n              }\r\n              else {\r\n                result = HTCLIENT;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Monitors\r\n\r\ninternal BOOL\r\nos_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr)\r\n{\r\n  OS_W32_MonitorGatherBundle *bundle = (OS_W32_MonitorGatherBundle *)bundle_ptr;\r\n  OS_Handle handle = {(U64)monitor};\r\n  os_handle_list_push(bundle->arena, bundle->list, handle);\r\n  return 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Main Initialization API (Implemented Per-OS)\r\n\r\ninternal void\r\nos_gfx_init(void)\r\n{\r\n  //- rjf: set up base shared state\r\n  Arena *arena = arena_alloc();\r\n  os_w32_gfx_state = push_array(arena, OS_W32_GfxState, 1);\r\n  os_w32_gfx_state->arena = arena;\r\n  os_w32_gfx_state->gfx_thread_tid = (U32)GetCurrentThreadId();\r\n  os_w32_gfx_state->hInstance = GetModuleHandle(0);\r\n  \r\n  //- rjf: set dpi awareness\r\n  w32_SetProcessDpiAwarenessContext_Type *SetProcessDpiAwarenessContext_func = 0;\r\n  HMODULE module = LoadLibraryA(\"user32.dll\");\r\n  if(module != 0)\r\n  {\r\n    SetProcessDpiAwarenessContext_func =\r\n    (w32_SetProcessDpiAwarenessContext_Type*)GetProcAddress(module, \"SetProcessDpiAwarenessContext\");\r\n    w32_GetDpiForWindow_func =\r\n    (w32_GetDpiForWindow_Type*)GetProcAddress(module, \"GetDpiForWindow\");\r\n    w32_GetDpiForMonitor_func = (w32_GetDpiForMonitor_Type *)GetProcAddress(module, \"GetDpiForMonitor\");\r\n    w32_GetSystemMetricsForDpi_func = (w32_GetSystemMetricsForDpi_Type *)GetProcAddress(module, \"GetSystemMetricsForDpi\");\r\n    FreeLibrary(module);\r\n  }\r\n  if(SetProcessDpiAwarenessContext_func != 0)\r\n  {\r\n    SetProcessDpiAwarenessContext_func(w32_DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2);\r\n  }\r\n  else\r\n  {\r\n    HMODULE shcore = LoadLibraryA(\"shcore.dll\");\r\n    if(shcore)\r\n    {\r\n      typedef HRESULT (WINAPI* SetProcessDpiAwareness_t)(int);\r\n      SetProcessDpiAwareness_t SetProcessDpiAwareness = (void*)GetProcAddress(shcore, \"SetProcessDpiAwareness\");\r\n      if(SetProcessDpiAwareness)\r\n      {\r\n        SetProcessDpiAwareness(2);\r\n      }\r\n      FreeLibrary(shcore);\r\n    }\r\n    SetProcessDPIAware();\r\n  }\r\n  \r\n  //- rjf: register graphical-window class\r\n  {\r\n    WNDCLASSEXW wndclass = {sizeof(wndclass)};\r\n    wndclass.lpfnWndProc = os_w32_wnd_proc;\r\n    wndclass.hInstance = os_w32_gfx_state->hInstance;\r\n    wndclass.lpszClassName = L\"graphical-window\";\r\n    wndclass.hCursor = LoadCursorA(0, IDC_ARROW);\r\n    wndclass.hIcon = LoadIcon(os_w32_gfx_state->hInstance, MAKEINTRESOURCE(1));\r\n    wndclass.style = CS_VREDRAW|CS_HREDRAW;\r\n    ATOM wndatom = RegisterClassExW(&wndclass);\r\n    (void)wndatom;\r\n  }\r\n  \r\n  //- rjf: grab graphics system info\r\n  {\r\n    os_w32_gfx_state->gfx_info.double_click_time = GetDoubleClickTime()/1000.f;\r\n    os_w32_gfx_state->gfx_info.caret_blink_time = GetCaretBlinkTime()/1000.f;\r\n    DEVMODEW devmodew = {0};\r\n    if(EnumDisplaySettingsW(0, ENUM_CURRENT_SETTINGS, &devmodew))\r\n    {\r\n      os_w32_gfx_state->gfx_info.default_refresh_rate = (F32)devmodew.dmDisplayFrequency;\r\n    }\r\n  }\r\n  \r\n  //- rjf: set initial cursor\r\n  os_set_cursor(OS_Cursor_Pointer);\r\n  \r\n  //- rjf: fill vkey -> OS_Key table\r\n  {\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'A'] = OS_Key_A;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'B'] = OS_Key_B;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'C'] = OS_Key_C;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'D'] = OS_Key_D;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'E'] = OS_Key_E;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'F'] = OS_Key_F;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'G'] = OS_Key_G;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'H'] = OS_Key_H;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'I'] = OS_Key_I;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'J'] = OS_Key_J;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'K'] = OS_Key_K;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'L'] = OS_Key_L;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'M'] = OS_Key_M;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'N'] = OS_Key_N;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'O'] = OS_Key_O;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'P'] = OS_Key_P;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Q'] = OS_Key_Q;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'R'] = OS_Key_R;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'S'] = OS_Key_S;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'T'] = OS_Key_T;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'U'] = OS_Key_U;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'V'] = OS_Key_V;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'W'] = OS_Key_W;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'X'] = OS_Key_X;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Y'] = OS_Key_Y;\r\n    os_w32_gfx_state->key_from_vkey_table[(unsigned int)'Z'] = OS_Key_Z;\r\n    \r\n    for(U64 i = '0', j = OS_Key_0; i <= '9'; i += 1, j += 1)\r\n    {\r\n      os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j;\r\n    }\r\n    for(U64 i = VK_NUMPAD0, j = OS_Key_0; i <= VK_NUMPAD9; i += 1, j += 1)\r\n    {\r\n      os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j;\r\n    }\r\n    for(U64 i = VK_F1, j = OS_Key_F1; i <= VK_F24; i += 1, j += 1)\r\n    {\r\n      os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)j;\r\n    }\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_SPACE]     = OS_Key_Space;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_3]     = OS_Key_Tick;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_MINUS] = OS_Key_Minus;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_PLUS]  = OS_Key_Equal;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_4]     = OS_Key_LeftBracket;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_6]     = OS_Key_RightBracket;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_1]     = OS_Key_Semicolon;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_7]     = OS_Key_Quote;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_COMMA] = OS_Key_Comma;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_PERIOD]= OS_Key_Period;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_2]     = OS_Key_Slash;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_OEM_5]     = OS_Key_BackSlash;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_TAB]       = OS_Key_Tab;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_PAUSE]     = OS_Key_Pause;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_ESCAPE]    = OS_Key_Esc;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_UP]        = OS_Key_Up;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_LEFT]      = OS_Key_Left;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_DOWN]      = OS_Key_Down;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_RIGHT]     = OS_Key_Right;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_BACK]      = OS_Key_Backspace;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_RETURN]    = OS_Key_Return;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_DELETE]    = OS_Key_Delete;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_INSERT]    = OS_Key_Insert;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_PRIOR]     = OS_Key_PageUp;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_NEXT]      = OS_Key_PageDown;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_HOME]      = OS_Key_Home;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_END]       = OS_Key_End;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_CAPITAL]   = OS_Key_CapsLock;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_NUMLOCK]   = OS_Key_NumLock;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_SCROLL]    = OS_Key_ScrollLock;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_APPS]      = OS_Key_Menu;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_CONTROL]   = OS_Key_Ctrl;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_LCONTROL]  = OS_Key_Ctrl;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_RCONTROL]  = OS_Key_Ctrl;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_SHIFT]     = OS_Key_Shift;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_LSHIFT]    = OS_Key_Shift;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_RSHIFT]    = OS_Key_Shift;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_MENU]      = OS_Key_Alt;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_LMENU]     = OS_Key_Alt;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_RMENU]     = OS_Key_Alt;\r\n    \r\n    os_w32_gfx_state->key_from_vkey_table[VK_DIVIDE]   = OS_Key_NumSlash;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_MULTIPLY] = OS_Key_NumStar;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_SUBTRACT] = OS_Key_NumMinus;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_ADD]      = OS_Key_NumPlus;\r\n    os_w32_gfx_state->key_from_vkey_table[VK_DECIMAL]  = OS_Key_NumPeriod;\r\n    \r\n    for(U32 i = 0; i < 10; i += 1)\r\n    {\r\n      os_w32_gfx_state->key_from_vkey_table[VK_NUMPAD0 + i] = (OS_Key)((U64)OS_Key_Num0 + i);\r\n    }\r\n    \r\n    for(U64 i = 0xDF, j = 0; i < 0xFF; i += 1, j += 1)\r\n    {\r\n      os_w32_gfx_state->key_from_vkey_table[i] = (OS_Key)((U64)OS_Key_Ex0 + j);\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Graphics System Info (Implemented Per-OS)\r\n\r\ninternal OS_GfxInfo *\r\nos_get_gfx_info(void)\r\n{\r\n  return &os_w32_gfx_state->gfx_info;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Clipboards (Implemented Per-OS)\r\n\r\ninternal void\r\nos_set_clipboard_text(String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  if(OpenClipboard(0))\r\n  {\r\n    EmptyClipboard();\r\n    String16 string16 = str16_from_8(scratch.arena, string);\r\n    HANDLE string16_copy_handle = GlobalAlloc(GMEM_MOVEABLE, (string16.size+1)*sizeof(string16.str[0]));\r\n    if(string16_copy_handle)\r\n    {\r\n      U16 *copy_buffer = (U16 *)GlobalLock(string16_copy_handle);\r\n      MemoryCopy(copy_buffer, string16.str, string16.size*sizeof(string16.str[0]));\r\n      copy_buffer[string16.size] = 0;\r\n      GlobalUnlock(string16_copy_handle);\r\n      SetClipboardData(CF_UNICODETEXT, string16_copy_handle);\r\n    }\r\n    CloseClipboard();\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8\r\nos_get_clipboard_text(Arena *arena)\r\n{\r\n  String8 result = {0};\r\n  if(IsClipboardFormatAvailable(CF_UNICODETEXT) &&\r\n     OpenClipboard(0))\r\n  {\r\n    HANDLE data_handle = GetClipboardData(CF_UNICODETEXT);\r\n    if(data_handle)\r\n    {\r\n      U16 *buffer = (U16 *)GlobalLock(data_handle);\r\n      if(buffer)\r\n      {\r\n        U64 size = cstring16_length(buffer);\r\n        String16 string16 = str16(buffer, size);\r\n        result = str8_from_16(arena, string16);\r\n        GlobalUnlock(data_handle);\r\n      }\r\n    }\r\n    CloseClipboard();\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_window_open(Rng2F32 rect, OS_WindowFlags flags, String8 title)\r\n{\r\n  B32 custom_border = !!(flags & OS_WindowFlag_CustomBorder);\r\n  B32 use_default_position = !!(flags & OS_WindowFlag_UseDefaultPosition);\r\n  Vec2F32 pos = rect.p0;\r\n  Vec2F32 dim = dim_2f32(rect);\r\n  \r\n  //- rjf: make hwnd\r\n  HWND hwnd = 0;\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String16 title16 = str16_from_8(scratch.arena, title);\r\n    os_w32_new_window_custom_border = custom_border;\r\n    DWORD style_flags = WS_EX_APPWINDOW;\r\n#if defined(R_BACKEND) && R_BACKEND != R_BACKEND_OPENGL\r\n    style_flags |= WS_EX_NOREDIRECTIONBITMAP;\r\n#endif\r\n    hwnd = CreateWindowExW(style_flags,\r\n                           L\"graphical-window\",\r\n                           (WCHAR*)title16.str,\r\n                           WS_OVERLAPPEDWINDOW | WS_SIZEBOX,\r\n                           use_default_position ? CW_USEDEFAULT : (S32)pos.x,\r\n                           use_default_position ? CW_USEDEFAULT : (S32)pos.y,\r\n                           (S32)dim.x,\r\n                           (S32)dim.y,\r\n                           0, 0,\r\n                           os_w32_gfx_state->hInstance,\r\n                           0);\r\n    DragAcceptFiles(hwnd, 1);\r\n    os_w32_new_window_custom_border = 0;\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //- rjf- make/fill window\r\n  OS_W32_Window *window = os_w32_window_alloc();\r\n  {\r\n    window->hwnd = hwnd;\r\n    window->hdc = GetDC(hwnd);\r\n    if(w32_GetDpiForWindow_func != 0)\r\n    {\r\n      window->dpi = (F32)w32_GetDpiForWindow_func(hwnd);\r\n    }\r\n    else\r\n    {\r\n      window->dpi = 96.f;\r\n    }\r\n  }\r\n  \r\n  //- rjf: early detection of composition\r\n  {\r\n    BOOL enabled = 0;\r\n    DwmIsCompositionEnabled(&enabled);\r\n    window->custom_border_composition_enabled = enabled;\r\n  }\r\n  \r\n  //- rjf: custom border\r\n  if(flags & OS_WindowFlag_CustomBorder)\r\n  {\r\n    window->custom_border = 1;\r\n    window->paint_arena = arena_alloc();\r\n  }\r\n  \r\n  //- rjf: convert to handle + return\r\n  OS_Handle result = os_w32_handle_from_window(window);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_window_close(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  os_w32_window_release(window);\r\n}\r\n\r\ninternal void\r\nos_window_set_title(OS_Handle handle, String8 title)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  String16 title16 = str16_from_8(scratch.arena, title);\r\n  SetWindowTextW(window->hwnd, (WCHAR *)title16.str);\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nos_window_first_paint(OS_Handle window_handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(window_handle);\r\n  window->first_paint_done = 1;\r\n  ShowWindow(window->hwnd, SW_SHOW);\r\n  if(window->maximized)\r\n  {\r\n    ShowWindow(window->hwnd, SW_MAXIMIZE);\r\n  }\r\n}\r\n\r\ninternal void\r\nos_window_focus(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  SetForegroundWindow(window->hwnd);\r\n  SetFocus(window->hwnd);\r\n}\r\n\r\ninternal B32\r\nos_window_is_focused(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  HWND active_hwnd = GetActiveWindow();\r\n  return active_hwnd == window->hwnd;\r\n}\r\n\r\ninternal B32\r\nos_window_is_fullscreen(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE);\r\n  return !(window_style & WS_OVERLAPPEDWINDOW);\r\n}\r\n\r\ninternal void\r\nos_window_set_fullscreen(OS_Handle handle, B32 fullscreen)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  DWORD window_style = GetWindowLong(window->hwnd, GWL_STYLE);\r\n  B32 is_fullscreen_already = os_window_is_fullscreen(handle);\r\n  if(fullscreen)\r\n  {\r\n    if(!is_fullscreen_already)\r\n    {\r\n      GetWindowPlacement(window->hwnd, &window->last_window_placement);\r\n    }\r\n    MONITORINFO monitor_info = {sizeof(monitor_info)};\r\n    if(GetMonitorInfo(MonitorFromWindow(window->hwnd, MONITOR_DEFAULTTOPRIMARY), &monitor_info))\r\n    {\r\n      SetWindowLong(window->hwnd, GWL_STYLE, window_style & ~WS_OVERLAPPEDWINDOW);\r\n      SetWindowPos(window->hwnd, HWND_TOP,\r\n                   monitor_info.rcMonitor.left,\r\n                   monitor_info.rcMonitor.top,\r\n                   monitor_info.rcMonitor.right - monitor_info.rcMonitor.left,\r\n                   monitor_info.rcMonitor.bottom - monitor_info.rcMonitor.top,\r\n                   SWP_NOOWNERZORDER | SWP_FRAMECHANGED);\r\n    }\r\n  }\r\n  else\r\n  {\r\n    SetWindowLong(window->hwnd, GWL_STYLE, window_style | WS_OVERLAPPEDWINDOW);\r\n    SetWindowPlacement(window->hwnd, &window->last_window_placement);\r\n    SetWindowPos(window->hwnd, 0, 0, 0, 0, 0,\r\n                 SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER |\r\n                 SWP_NOOWNERZORDER | SWP_FRAMECHANGED);\r\n  }\r\n}\r\n\r\ninternal B32\r\nos_window_is_maximized(OS_Handle handle)\r\n{\r\n  B32 result = 0;\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window)\r\n  {\r\n    result = !!(IsZoomed(window->hwnd));\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_window_set_maximized(OS_Handle handle, B32 maximized)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window != 0)\r\n  {\r\n    if(window->first_paint_done)\r\n    {\r\n      switch(maximized)\r\n      {\r\n        default:\r\n        case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break;\r\n        case 1:{ShowWindow(window->hwnd, SW_MAXIMIZE);}break;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      window->maximized = maximized;\r\n    }\r\n  }\r\n}\r\n\r\ninternal B32\r\nos_window_is_minimized(OS_Handle handle)\r\n{\r\n  B32 result = 0;\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window)\r\n  {\r\n    result = !!(IsIconic(window->hwnd));\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_window_set_minimized(OS_Handle handle, B32 minimized)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window != 0 && minimized != os_window_is_minimized(handle))\r\n  {\r\n    switch(minimized)\r\n    {\r\n      default:\r\n      case 0:{ShowWindow(window->hwnd, SW_RESTORE);}break;\r\n      case 1:{ShowWindow(window->hwnd, SW_MINIMIZE);}break;\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nos_window_bring_to_front(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window != 0)\r\n  {\r\n    BringWindowToTop(window->hwnd);\r\n  }\r\n}\r\n\r\ninternal void\r\nos_window_set_monitor(OS_Handle window_handle, OS_Handle monitor)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(window_handle);\r\n  HMONITOR hmonitor = (HMONITOR)monitor.u64[0];\r\n  {\r\n    MONITORINFOEXW info;\r\n    info.cbSize = sizeof(MONITORINFOEXW);\r\n    if(GetMonitorInfoW(hmonitor, (MONITORINFO *)&info))\r\n    {\r\n      Rng2F32 existing_rect = os_rect_from_window(window_handle);\r\n      Vec2F32 window_size = dim_2f32(existing_rect);\r\n      SetWindowPos(window->hwnd, HWND_TOP,\r\n                   (info.rcWork.left + info.rcWork.right)/2 - window_size.x/2,\r\n                   (info.rcWork.top + info.rcWork.bottom)/2 - window_size.y/2,\r\n                   window_size.x,\r\n                   window_size.y, 0);\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nos_window_clear_custom_border_data(OS_Handle handle)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window->custom_border)\r\n  {\r\n    arena_clear(window->paint_arena);\r\n    window->first_title_bar_client_area = window->last_title_bar_client_area = 0;\r\n    window->custom_border_title_thickness = 0;\r\n    window->custom_border_edge_thickness = 0;\r\n  }\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_title_bar(OS_Handle handle, F32 thickness)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  window->custom_border_title_thickness = thickness;\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_edges(OS_Handle handle, F32 thickness)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  window->custom_border_edge_thickness = thickness;\r\n}\r\n\r\ninternal void\r\nos_window_push_custom_title_bar_client_area(OS_Handle handle, Rng2F32 rect)\r\n{\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window->custom_border)\r\n  {\r\n    OS_W32_TitleBarClientArea *area = push_array(window->paint_arena, OS_W32_TitleBarClientArea, 1);\r\n    if(area != 0)\r\n    {\r\n      area->rect = rect;\r\n      SLLQueuePush(window->first_title_bar_client_area, window->last_title_bar_client_area, area);\r\n    }\r\n  }\r\n}\r\n\r\ninternal Rng2F32\r\nos_rect_from_window(OS_Handle handle)\r\n{\r\n  Rng2F32 r = {0};\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window)\r\n  {\r\n    RECT rect = {0};\r\n    GetWindowRect(os_w32_hwnd_from_window(window), &rect);\r\n    r = os_w32_rng2f32_from_rect(rect);\r\n  }\r\n  return r;\r\n}\r\n\r\ninternal Rng2F32\r\nos_client_rect_from_window(OS_Handle handle)\r\n{\r\n  Rng2F32 r = {0};\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window)\r\n  {\r\n    RECT rect = {0};\r\n    GetClientRect(os_w32_hwnd_from_window(window), &rect);\r\n    r = os_w32_rng2f32_from_rect(rect);\r\n  }\r\n  return r;\r\n}\r\n\r\ninternal F32\r\nos_dpi_from_window(OS_Handle handle)\r\n{\r\n  F32 result = 96.f;\r\n  OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n  if(window != 0)\r\n  {\r\n    result = window->dpi;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks External Windows (Implemented Per-OS)\r\n\r\ninternal OS_Handle\r\nos_focused_external_window(void)\r\n{\r\n  HWND hwnd = GetForegroundWindow();\r\n  OS_Handle result = {(U64)hwnd};\r\n  return result;\r\n}\r\n\r\ninternal void\r\nos_focus_external_window(OS_Handle handle)\r\n{\r\n  HWND hwnd = (HWND)handle.u64[0];\r\n  if(hwnd != 0)\r\n  {\r\n    SetForegroundWindow(hwnd);\r\n    SetFocus(hwnd);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Monitors (Implemented Per-OS)\r\n\r\ninternal OS_HandleArray\r\nos_push_monitors_array(Arena *arena)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  OS_HandleList list = {0};\r\n  {\r\n    OS_W32_MonitorGatherBundle bundle = {arena, &list};\r\n    EnumDisplayMonitors(0, 0, os_w32_monitor_gather_enum_proc, (LPARAM)&bundle);\r\n  }\r\n  OS_HandleArray array = os_handle_array_from_list(arena, &list);\r\n  scratch_end(scratch);\r\n  return array;\r\n}\r\n\r\ninternal OS_Handle\r\nos_primary_monitor(void)\r\n{\r\n  POINT zero_pt = {0, 0};\r\n  HMONITOR monitor = MonitorFromPoint(zero_pt, MONITOR_DEFAULTTOPRIMARY);\r\n  OS_Handle result = {(U64)monitor};\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nos_monitor_from_window(OS_Handle window)\r\n{\r\n  OS_W32_Window *w = os_w32_window_from_handle(window);\r\n  HMONITOR handle = MonitorFromWindow(w->hwnd, MONITOR_DEFAULTTOPRIMARY);\r\n  OS_Handle result = {(U64)handle};\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nos_name_from_monitor(Arena *arena, OS_Handle monitor)\r\n{\r\n  String8 result = {0};\r\n  HMONITOR monitor_handle = (HMONITOR)monitor.u64[0];\r\n  MONITORINFOEXW info;\r\n  info.cbSize = sizeof(MONITORINFOEXW);\r\n  if(GetMonitorInfoW(monitor_handle, (MONITORINFO *)&info))\r\n  {\r\n    String16 result16 = str16_cstring((U16 *)info.szDevice);\r\n    result = str8_from_16(arena, result16);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Vec2F32\r\nos_dim_from_monitor(OS_Handle monitor)\r\n{\r\n  Vec2F32 result = {0};\r\n  HMONITOR monitor_handle = (HMONITOR)monitor.u64[0];\r\n  MONITORINFO info = {0};\r\n  info.cbSize = sizeof(MONITORINFO);\r\n  if(GetMonitorInfoW(monitor_handle, &info))\r\n  {\r\n    result.x = info.rcWork.right - info.rcWork.left;\r\n    result.y = info.rcWork.bottom - info.rcWork.top;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal F32\r\nos_dpi_from_monitor(OS_Handle monitor)\r\n{\r\n  F32 result = 96.f;\r\n  HMONITOR monitor_handle = (HMONITOR)monitor.u64[0];\r\n  if(w32_GetDpiForMonitor_func != 0)\r\n  {\r\n    UINT dpi_x = 0;\r\n    UINT dpi_y = 0;\r\n    HRESULT hr = w32_GetDpiForMonitor_func(monitor_handle, MDT_EFFECTIVE_DPI, &dpi_x, &dpi_y);\r\n    result = (F32)dpi_x;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Events (Implemented Per-OS)\r\n\r\ninternal void\r\nos_send_wakeup_event(void)\r\n{\r\n  PostThreadMessageA(os_w32_gfx_state->gfx_thread_tid, 0x401, 0, 0);\r\n}\r\n\r\ninternal OS_EventList\r\nos_get_events(Arena *arena, B32 wait)\r\n{\r\n  os_w32_event_arena = arena;\r\n  MemoryZeroStruct(&os_w32_event_list);\r\n  MSG msg = {0};\r\n  if(!wait || GetMessage(&msg, 0, 0, 0))\r\n  {\r\n    B32 first_wait = wait;\r\n    for(;first_wait || PeekMessage(&msg, 0, 0, 0, PM_REMOVE); first_wait = 0)\r\n    {\r\n      DispatchMessage(&msg);\r\n      TranslateMessage(&msg);\r\n      if(msg.message == WM_QUIT)\r\n      {\r\n        os_w32_push_event(OS_EventKind_WindowClose, 0);\r\n      }\r\n    }\r\n  }\r\n  return os_w32_event_list;\r\n}\r\n\r\ninternal OS_Modifiers\r\nos_get_modifiers(void)\r\n{\r\n  OS_Modifiers modifiers = 0;\r\n  if(GetKeyState(VK_CONTROL) & 0x8000)\r\n  {\r\n    modifiers |= OS_Modifier_Ctrl;\r\n  }\r\n  if(GetKeyState(VK_SHIFT) & 0x8000)\r\n  {\r\n    modifiers |= OS_Modifier_Shift;\r\n  }\r\n  if(GetKeyState(VK_MENU) & 0x8000)\r\n  {\r\n    modifiers |= OS_Modifier_Alt;\r\n  }\r\n  return modifiers;\r\n}\r\n\r\ninternal B32\r\nos_key_is_down(OS_Key key)\r\n{\r\n  B32 down = 0;\r\n  WPARAM vkey = os_w32_vkey_from_os_key(key);\r\n  if(GetKeyState(vkey) & 0x8000)\r\n  {\r\n    down = 1;\r\n  }\r\n  return down;\r\n}\r\n\r\ninternal Vec2F32\r\nos_mouse_from_window(OS_Handle handle)\r\n{\r\n  ProfBeginFunction();\r\n  Vec2F32 v = {0};\r\n  POINT p;\r\n  if(GetCursorPos(&p))\r\n  {\r\n    OS_W32_Window *window = os_w32_window_from_handle(handle);\r\n    ScreenToClient(window->hwnd, &p);\r\n    v.x = (F32)p.x;\r\n    v.y = (F32)p.y;\r\n  }\r\n  ProfEnd();\r\n  return v;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Cursors (Implemented Per-OS)\r\n\r\ninternal void\r\nos_set_cursor(OS_Cursor cursor)\r\n{\r\n  B32 valid_cursor = 1;\r\n  HCURSOR hcursor = 0;\r\n  switch(cursor)\r\n  {\r\n    default: {valid_cursor = 0;}break;\r\n#define Win32CursorXList(X) \\\r\nX(Pointer, IDC_ARROW) \\\r\nX(IBar, IDC_IBEAM) \\\r\nX(LeftRight, IDC_SIZEWE) \\\r\nX(UpDown, IDC_SIZENS) \\\r\nX(DownRight, IDC_SIZENWSE) \\\r\nX(UpRight, IDC_SIZENESW) \\\r\nX(UpDownLeftRight, IDC_SIZEALL) \\\r\nX(HandPoint, IDC_HAND)\\\r\nX(Disabled, IDC_NO)\r\n#define CursorCase(E,R) case OS_Cursor_##E:{ \\\r\nlocal_persist HCURSOR curs = 0; \\\r\nif (curs == 0){ curs = LoadCursor(NULL, R); } \\\r\nhcursor = curs; }break;\r\n    Win32CursorXList(CursorCase)\r\n#undef CursorCase\r\n#undef Win32CursorXList\r\n  }\r\n  if(valid_cursor && !os_w32_resizing)\r\n  {\r\n    if(hcursor != os_w32_gfx_state->hCursor)\r\n    {\r\n      PostMessage(0, WM_SETCURSOR, 0, 0);\r\n      POINT p = {0};\r\n      GetCursorPos(&p);\r\n      SetCursorPos(p.x, p.y);\r\n    }\r\n    os_w32_gfx_state->hCursor = hcursor;\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Native User-Facing Graphical Messages (Implemented Per-OS)\r\n\r\ninternal void\r\nos_graphical_message(B32 error, String8 title, String8 message)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 title16 = str16_from_8(scratch.arena, title);\r\n  String16 message16 = str16_from_8(scratch.arena, message);\r\n  MessageBoxW(0, (WCHAR *)message16.str, (WCHAR *)title16.str, MB_OK|(!!error*MB_ICONERROR));\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal String8\r\nos_graphical_pick_file(Arena *arena, String8 initial_path)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    U64 buffer_size = 4096;\r\n    U16 *buffer = push_array(scratch.arena, U16, buffer_size);\r\n    OPENFILENAMEW params = {sizeof(params)};\r\n    {\r\n      params.lpstrFile = (WCHAR *)buffer;\r\n      params.nMaxFile = buffer_size;\r\n      params.lpstrInitialDir = (WCHAR *)str16_from_8(scratch.arena, initial_path).str;\r\n    }\r\n    if(GetOpenFileNameW(&params))\r\n    {\r\n      result = str8_from_16(arena, str16_cstring((U16 *)buffer));\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: @os_hooks Shell Operations\r\n\r\ninternal void\r\nos_show_in_filesystem_ui(String8 path)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 path_copy = push_str8_copy(scratch.arena, path);\r\n  for(U64 idx = 0; idx < path_copy.size; idx += 1)\r\n  {\r\n    if(path_copy.str[idx] == '/')\r\n    {\r\n      path_copy.str[idx] = '\\\\';\r\n    }\r\n  }\r\n  String16 path16 = str16_from_8(scratch.arena, path_copy);\r\n  SFGAOF flags = 0;\r\n  PIDLIST_ABSOLUTE list = 0;\r\n  if(path16.size != 0 && SUCCEEDED(SHParseDisplayName(path16.str, 0, &list, 0, &flags)))\r\n  {\r\n    HRESULT hr = SHOpenFolderAndSelectItems(list, 0, 0, 0);\r\n    CoTaskMemFree(list);\r\n    (void)hr;\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nos_open_in_browser(String8 url)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String16 url16 = str16_from_8(scratch.arena, url);\r\n  ShellExecuteW(0, L\"open\", (WCHAR *)url16.str, 0, 0, SW_SHOWNORMAL);\r\n  scratch_end(scratch);\r\n}\r\n"
  },
  {
    "path": "src/os/gfx/win32/os_gfx_win32.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_GFX_WIN32_H\r\n#define OS_GFX_WIN32_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes / Libraries\r\n\r\n#include <uxtheme.h>\r\n#include <dwmapi.h>\r\n#include <shellscalingapi.h>\r\n#pragma comment(lib, \"gdi32\")\r\n#pragma comment(lib, \"dwmapi\")\r\n#pragma comment(lib, \"UxTheme\")\r\n#pragma comment(lib, \"ole32\")\r\n#pragma comment(lib, \"user32\")\r\n#pragma comment(lib, \"comdlg32\")\r\n#ifndef WM_NCUAHDRAWCAPTION\r\n#define WM_NCUAHDRAWCAPTION (0x00AE)\r\n#endif\r\n#ifndef WM_NCUAHDRAWFRAME\r\n#define WM_NCUAHDRAWFRAME (0x00AF)\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Windows\r\n\r\ntypedef struct OS_W32_TitleBarClientArea OS_W32_TitleBarClientArea;\r\nstruct OS_W32_TitleBarClientArea\r\n{\r\n  OS_W32_TitleBarClientArea *next;\r\n  Rng2F32 rect;\r\n};\r\n\r\ntypedef struct OS_W32_Window OS_W32_Window;\r\nstruct OS_W32_Window\r\n{\r\n  OS_W32_Window *next;\r\n  OS_W32_Window *prev;\r\n  HWND hwnd;\r\n  HDC hdc;\r\n  WINDOWPLACEMENT last_window_placement;\r\n  F32 dpi;\r\n  B32 first_paint_done;\r\n  B32 maximized;\r\n  B32 custom_border;\r\n  F32 custom_border_title_thickness;\r\n  F32 custom_border_edge_thickness;\r\n  B32 custom_border_composition_enabled;\r\n  Arena *paint_arena;\r\n  OS_W32_TitleBarClientArea *first_title_bar_client_area;\r\n  OS_W32_TitleBarClientArea *last_title_bar_client_area;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Monitor Gathering Bundle\r\n\r\ntypedef struct OS_W32_MonitorGatherBundle OS_W32_MonitorGatherBundle;\r\nstruct OS_W32_MonitorGatherBundle\r\n{\r\n  Arena *arena;\r\n  OS_HandleList *list;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Global State\r\n\r\ntypedef struct OS_W32_GfxState OS_W32_GfxState;\r\nstruct OS_W32_GfxState\r\n{\r\n  Arena *arena;\r\n  U32 gfx_thread_tid;\r\n  HINSTANCE hInstance;\r\n  HCURSOR hCursor;\r\n  OS_GfxInfo gfx_info;\r\n  OS_W32_Window *first_window;\r\n  OS_W32_Window *last_window;\r\n  OS_W32_Window *free_window;\r\n  OS_Key key_from_vkey_table[256];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal OS_W32_GfxState *os_w32_gfx_state = 0;\r\nglobal OS_EventList os_w32_event_list = {0};\r\nglobal Arena *os_w32_event_arena = 0;\r\nglobal B32 os_w32_resizing = 0;\r\nglobal B32 os_w32_new_window_custom_border = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal Rng2F32 os_w32_rng2f32_from_rect(RECT rect);\r\n\r\n////////////////////////////////\r\n//~ rjf: Windows\r\n\r\ninternal OS_Handle       os_w32_handle_from_window(OS_W32_Window *window);\r\ninternal OS_W32_Window * os_w32_window_from_handle(OS_Handle window);\r\ninternal OS_W32_Window * os_w32_window_from_hwnd(HWND hwnd);\r\ninternal HWND            os_w32_hwnd_from_window(OS_W32_Window *window);\r\ninternal OS_W32_Window * os_w32_window_alloc(void);\r\ninternal void            os_w32_window_release(OS_W32_Window *window);\r\ninternal OS_Event *      os_w32_push_event(OS_EventKind kind, OS_W32_Window *window);\r\ninternal OS_Key          os_w32_os_key_from_vkey(WPARAM vkey);\r\ninternal WPARAM          os_w32_vkey_from_os_key(OS_Key key);\r\ninternal LRESULT         os_w32_wnd_proc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);\r\n\r\n////////////////////////////////\r\n//~ rjf: Monitors\r\n\r\ninternal BOOL os_w32_monitor_gather_enum_proc(HMONITOR monitor, HDC hdc, LPRECT rect, LPARAM bundle_ptr);\r\n\r\n#endif // OS_GFX_WIN32_H\r\n"
  },
  {
    "path": "src/os/os_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"os/core/os_core.c\"\r\n#if OS_FEATURE_GRAPHICAL\r\n# include \"os/gfx/os_gfx.c\"\r\n#endif\r\n\r\n#if OS_WINDOWS\r\n# include \"os/core/win32/os_core_win32.c\"\r\n#elif OS_LINUX\r\n# include \"os/core/linux/os_core_linux.c\"\r\n#else\r\n# error OS core layer not implemented for this operating system.\r\n#endif\r\n\r\n#if OS_FEATURE_GRAPHICAL\r\n# if OS_GFX_STUB\r\n#  include \"os/gfx/stub/os_gfx_stub.c\"\r\n# elif OS_WINDOWS\r\n#  include \"os/gfx/win32/os_gfx_win32.c\"\r\n# elif OS_LINUX\r\n#  include \"os/gfx/linux/os_gfx_linux.c\"\r\n# else\r\n#  error OS graphical layer not implemented for this operating system.\r\n# endif\r\n#endif\r\n"
  },
  {
    "path": "src/os/os_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef OS_INC_H\r\n#define OS_INC_H\r\n\r\n#if !defined(OS_FEATURE_GRAPHICAL)\r\n# define OS_FEATURE_GRAPHICAL 0\r\n#endif\r\n\r\n#if !defined(OS_GFX_STUB)\r\n# define OS_GFX_STUB 0\r\n#endif\r\n\r\n#include \"os/core/os_core.h\"\r\n#if OS_FEATURE_GRAPHICAL\r\n# include \"os/gfx/os_gfx.h\"\r\n#endif\r\n\r\n#if OS_WINDOWS\r\n# include \"os/core/win32/os_core_win32.h\"\r\n#elif OS_LINUX\r\n# include \"os/core/linux/os_core_linux.h\"\r\n#else\r\n# error OS core layer not implemented for this operating system.\r\n#endif\r\n\r\n#if OS_FEATURE_GRAPHICAL\r\n# if OS_GFX_STUB\r\n#  include \"os/gfx/stub/os_gfx_stub.h\"\r\n# elif OS_WINDOWS\r\n#  include \"os/gfx/win32/os_gfx_win32.h\"\r\n# elif OS_LINUX\r\n#  include \"os/gfx/linux/os_gfx_linux.h\"\r\n# else\r\n#  error OS graphical layer not implemented for this operating system.\r\n# endif\r\n#endif\r\n\r\n#endif // OS_INC_H\r\n"
  },
  {
    "path": "src/pdb/pdb.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal U32\r\npdb_hash_v1(String8 string)\r\n{\r\n  U32 result = 0;\r\n  U8 *ptr = string.str;\r\n  U8 *opl = ptr + (string.size&(~3));\r\n  for(; ptr < opl; ptr += 4)\r\n  {\r\n    result ^= *(U32*)ptr;\r\n  }\r\n  if((string.size&2) != 0)\r\n  {\r\n    result ^= *(U16*)ptr; ptr += 2;\r\n  }\r\n  if((string.size&1) != 0)\r\n  {\r\n    result ^= *ptr;\r\n  }\r\n  result |= 0x20202020;\r\n  result ^= (result >> 11);\r\n  result ^= (result >> 16);\r\n  return result;\r\n}\r\n\r\n"
  },
  {
    "path": "src/pdb/pdb.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef PDB_H\r\n#define PDB_H\r\n\r\n// https://github.com/microsoft/microsoft-pdb/tree/master/PDB\r\n\r\n////////////////////////////////\r\n//~ PDB String Table Types\r\n\r\n#define PDB_INVALID_STRING_INDEX max_U32\r\ntypedef U32 PDB_StringIndex;\r\ntypedef U32 PDB_StringOffset;\r\n\r\nenum\r\n{\r\n  PDB_StringTableHeader_MAGIC = 0xEFFEEFFE\r\n};\r\n\r\nenum\r\n{\r\n  PDB_StringTableHeader_Version1       = 1,\r\n  PDB_StringTableHeader_CurrentVersion = PDB_StringTableHeader_Version1\r\n};\r\n\r\ntypedef struct PDB_StringTableHeader\r\n{\r\n  U32 magic;\r\n  U32 version;\r\n} PDB_StringTableHeader;\r\n\r\n////////////////////////////////\r\n\r\ntypedef enum PDB_FixedStream\r\n{\r\n  PDB_FixedStream_Info = 1,\r\n  PDB_FixedStream_Tpi  = 2,\r\n  PDB_FixedStream_Dbi  = 3,\r\n  PDB_FixedStream_Ipi  = 4\r\n} PDB_FixedStream;\r\n\r\n////////////////////////////////\r\n//~ PDB Info Types\r\n\r\ntypedef U32 PDB_InfoVersion;\r\nenum{\r\n  PDB_InfoVersion_VC2      = 19941610,\r\n  PDB_InfoVersion_VC4      = 19950623,\r\n  PDB_InfoVersion_VC41     = 19950814,\r\n  PDB_InfoVersion_VC50     = 19960307,\r\n  PDB_InfoVersion_VC98     = 19970604,\r\n  PDB_InfoVersion_VC70_DEP = 19990604,\r\n  PDB_InfoVersion_VC70     = 20000404,\r\n  PDB_InfoVersion_VC80     = 20030901,\r\n  PDB_InfoVersion_VC110    = 20091201,\r\n  PDB_InfoVersion_VC140    = 20140508\r\n};\r\n\r\n// referenced in PDB1::loadPdbStream\r\nenum\r\n{\r\n  PDB_FeatureSig_NULL               = 0,\r\n  PDB_FeatureSig_VC110              = PDB_InfoVersion_VC110,\r\n  PDB_FeatureSig_VC140              = PDB_InfoVersion_VC140,\r\n  PDB_FeatureSig_NO_TYPE_MERGE      = 0x4D544F4E,\r\n  PDB_FeatureSig_MINIMAL_DEBUG_INFO = 0x494E494D,\r\n};\r\ntypedef U32 PDB_FeatureSig;\r\n\r\nenum\r\n{\r\n  PDB_FeatureFlag_HAS_ID_STREAM    = (1 << 0),\r\n  PDB_FeatureFlag_NO_TYPE_MERGE    = (1 << 1),\r\n  PDB_FeatureFlag_MINIMAL_DBG_INFO = (1 << 2),\r\n};\r\ntypedef U32 PDB_FeatureFlags;\r\n\r\n#pragma pack(push,1)\r\ntypedef struct PDB_InfoHeaderV70\r\n{\r\n  PDB_InfoVersion    version;\r\n  COFF_TimeStamp     time_stamp;\r\n  U32                age;\r\n  Guid               guid;\r\n  // PDB_HashTable   named_stream_hash_table\r\n  // PDB_FeatureFlag features[*]\r\n} PDB_InfoHeaderV70;\r\n\r\n#pragma pack(pop)\r\nStaticAssert(sizeof(PDB_InfoHeaderV70) == 28, pdb_info_header_v70_size_check);\r\n\r\n#define PDB_SRC_HEADER_BLOCK_STREAM_NAME str8_lit(\"/src/headerblock\")\r\n#define PDB_LINK_INFO_STREAM_NAME        str8_lit(\"/LinkInfo\")\r\n#define PDB_NAMES_STREAM_NAME            str8_lit(\"/names\")\r\n\r\n////////////////////////////////\r\n// SRC Header Block\r\n\r\n#define PDB_SRC_HEADER_BLOCK_MAGIC_V1 19980827\r\n\r\ntypedef struct PDB_SrcHeaderBlockHeader\r\n{\r\n  U32 version;\r\n  U32 stream_size;\r\n  U64 file_time;\r\n  U32 age;\r\n  U8  pad[44];\r\n} PDB_SrcHeaderBlockHeader;\r\n\r\nenum\r\n{\r\n  PDB_SrcComp_NULL,\r\n  PDB_SrcComp_RUN_LENGTH_RECORD,\r\n  PDB_SrcComp_HUFFMAN,\r\n  PDB_SrcComp_LZ,\r\n  PDB_SrcComp_DOTNET\r\n};\r\ntypedef U8 PDB_SrcCompType;\r\n\r\nenum\r\n{\r\n  PDB_SrcHeaderBlockEntryFlag_IS_VIRTUAL = (1 << 0)\r\n};\r\ntypedef U8 PDB_SrcHeaderFlags;\r\n\r\n// (PDB/include/pdb.h: SrcHeaderOut)\r\ntypedef struct PDB_SrcHeaderBlockEntry\r\n{\r\n  U32                size;\r\n  U32                version;\r\n  U32                file_crc;\r\n  U32                file_size;\r\n  PDB_StringOffset   file_path;\r\n  PDB_StringOffset   obj;\r\n  PDB_StringOffset   virt_path;\r\n  PDB_SrcCompType    comp;\r\n  PDB_SrcHeaderFlags flags;\r\n  U8                 pad[2];\r\n  U8                 reserved[8];\r\n} PDB_SrcHeaderBlockEntry;\r\n\r\n////////////////////////////////\r\n//~ PDB Format DBI Types\r\n\r\ntypedef U32 PDB_DbiStream;\r\nenum\r\n{\r\n  PDB_DbiStream_FPO,\r\n  PDB_DbiStream_EXCEPTION,\r\n  PDB_DbiStream_FIXUP,\r\n  PDB_DbiStream_OMAP_TO_SRC,\r\n  PDB_DbiStream_OMAP_FROM_SRC,\r\n  PDB_DbiStream_SECTION_HEADER,\r\n  PDB_DbiStream_TOKEN_RDI_MAP,\r\n  PDB_DbiStream_XDATA,\r\n  PDB_DbiStream_PDATA,\r\n  PDB_DbiStream_NEW_FPO,\r\n  PDB_DbiStream_SECTION_HEADER_ORIG,\r\n  PDB_DbiStream_COUNT\r\n};\r\n\r\ntypedef U32 PDB_DbiHeaderSignature;\r\nenum\r\n{\r\n  PDB_DbiHeaderSignature_V1 = 0xFFFFFFFF\r\n};\r\n\r\ntypedef U32 PDB_DbiVersion;\r\nenum\r\n{\r\n  PDB_DbiVersion_41  =   930803,\r\n  PDB_DbiVersion_50  = 19960307,\r\n  PDB_DbiVersion_60  = 19970606,\r\n  PDB_DbiVersion_70  = 19990903,\r\n  PDB_DbiVersion_110 = 20091201,\r\n};\r\n\r\ntypedef U16 PDB_DbiBuildNumber;\r\n#define PDB_DbiBuildNumberNewFormatFlag 0x8000\r\n#define PDB_DbiBuildNumberMinor(bn)     ((bn)&0xFF)\r\n#define PDB_DbiBuildNumberMajor(bn)     (((bn) >> 8)&0x7F)\r\n#define PDB_DbiBuildNumberNewFormat(bn) (!!((bn)&PDB_DbiBuildNumberNewFormatFlag))\r\n#define PDB_DbiMakeBuildNumber(maj, min) (PDB_DbiBuildNumber)(PDB_DbiBuildNumberNewFormatFlag | ((min)&0xFF) | (((maj)&0x7F) << 16))\r\n\r\ntypedef U16 PDB_DbiHeaderFlags;\r\nenum\r\n{\r\n  PDB_DbiHeaderFlag_Incremental = 0x1,\r\n  PDB_DbiHeaderFlag_Stripped    = 0x2,\r\n  PDB_DbiHeaderFlag_CTypes      = 0x4\r\n};\r\n\r\ntypedef struct PDB_DbiHeader\r\n{\r\n  PDB_DbiHeaderSignature sig;\r\n  PDB_DbiVersion version;\r\n  U32 age;\r\n  MSF_StreamNumber gsi_sn;\r\n  PDB_DbiBuildNumber build_number;\r\n  \r\n  MSF_StreamNumber psi_sn;\r\n  U16 pdb_version;\r\n  \r\n  MSF_StreamNumber sym_sn;\r\n  U16 pdb_version2;\r\n  \r\n  U32 module_info_size;\r\n  U32 sec_con_size;\r\n  U32 sec_map_size;\r\n  U32 file_info_size;\r\n  \r\n  U32 tsm_size;\r\n  U32 mfc_index;\r\n  U32 dbg_header_size;\r\n  U32 ec_info_size;\r\n  \r\n  PDB_DbiHeaderFlags flags;\r\n  COFF_MachineType machine;\r\n  \r\n  U32 reserved;\r\n} PDB_DbiHeader;\r\n\r\n// \"ModuleInfo\" DBI range\r\n\r\ntypedef U32 PDB_DbiSectionContribVersion;\r\n#define PDB_DbiSectionContribVersion_1 (0xeffe0000u + 19970605u)\r\n#define PDB_DbiSectionContribVersion_2 (0xeffe0000u + 20140516u)\r\n\r\ntypedef struct PDB_DbiSectionContrib40\r\n{\r\n  CV_SectionIndex sec;\r\n  U16 pad0;\r\n  U32 sec_off;\r\n  U32 size;\r\n  U32 flags;\r\n  CV_ModIndex mod;\r\n  U16 pad1;\r\n} PDB_DbiSectionContrib40;\r\n\r\ntypedef struct PDB_DbiSectionContrib\r\n{\r\n  PDB_DbiSectionContrib40 base;\r\n  U32 data_crc;\r\n  U32 reloc_crc;\r\n} PDB_DbiSectionContrib;\r\n\r\ntypedef struct PDB_DbiSectionContrib2\r\n{\r\n  PDB_DbiSectionContrib40 base;\r\n  U32 data_crc;\r\n  U32 reloc_crc;\r\n  U32 sec_coff;\r\n} PDB_DbiSectionContrib2;\r\n\r\ntypedef struct PDB_DbiCompUnitHeader\r\n{\r\n  U32 unused;\r\n  PDB_DbiSectionContrib contribution;\r\n  U16 flags; // unknown\r\n  \r\n  MSF_StreamNumber sn;\r\n  U32 symbols_size;\r\n  U32 c11_lines_size;\r\n  U32 c13_lines_size;\r\n  \r\n  U16 num_contrib_files;\r\n  U16 unused2;\r\n  U32 file_names_offset;\r\n  \r\n  PDB_StringIndex src_file;\r\n  PDB_StringIndex pdb_file;\r\n  \r\n  // U8[] module_name (null terminated)\r\n  // U8[] obj_name (null terminated)\r\n} PDB_DbiCompUnitHeader;\r\n\r\n////////////////////////////////\r\n\r\nenum\r\n{\r\n  PDB_DbiOMF_NONE          = 0,\r\n  PDB_DbiOMF_READ          = (1 << 0),\r\n  PDB_DbiOMF_WRITE         = (1 << 1),\r\n  PDB_DbiOMF_EXEC          = (1 << 2),\r\n  PDB_DbiOMF_IS_32BIT_ADDR = (1 << 3), // Descritor is 32-bit address\r\n  PDB_DbiOMF_IS_SELECTOR   = (1 << 8), // Frame is a selector\r\n  PDB_DbiOMF_IS_ABS_ADDR   = (1 << 9), // Frame is absolute address\r\n  PDB_DbiOMF_IS_GROUP      = (1 << 10) // Descriptor is a group\r\n};\r\ntypedef U16 PDB_DbiOMF;\r\n\r\ntypedef struct PDB_DbiSecMapEntry\r\n{\r\n  PDB_DbiOMF flags;\r\n  U16        ovl;\r\n  U16        group;\r\n  U16        frame;\r\n  U16        sec_name;\r\n  U16        class_name;\r\n  U32        offset;\r\n  U32        sec_size;\r\n} PDB_DbiSecMapEntry;\r\n\r\ntypedef struct PDB_DbiSecMapHeader\r\n{\r\n  U16 section_count;\r\n  U16 segment_count;\r\n} PDB_DbiSecMapHeader;\r\n\r\n////////////////////////////////\r\n//~ PDB Format TPI/IPI Types\r\n\r\ntypedef U32 PDB_TpiVersion;\r\nenum\r\n{\r\n  PDB_TpiVersion_INTV_VC2       = 920924,\r\n  PDB_TpiVersion_IMPV40         = 19950410,\r\n  PDB_TpiVersion_IMPV41         = 19951122,\r\n  PDB_TpiVersion_IMPV50_INTERIM = 19960307,\r\n  PDB_TpiVersion_IMPV50         = 19961031,\r\n  PDB_TpiVersion_IMPV70         = 19990903,\r\n  PDB_TpiVersion_IMPV80         = 20040203,\r\n};\r\n\r\nenum\r\n{\r\n  PDB_TYPE_SERVER_HASH_BUCKET_COUNT_V7   = 0x1000,\r\n  PDB_TYPE_SERVER_HASH_BUCKET_COUNT_V8   = 0x3FFF,\r\n  PDB_TYPE_SERVER_HASH_BUCKET_COUNT_INIT = 0x1000,\r\n  PDB_TYPE_SERVER_HASH_BUCKET_COUNT_MAX  = 0x40000,\r\n  \r\n  PDB_TYPE_SERVER_HASH_BUCKET_COUNT_CURRENT = PDB_TYPE_SERVER_HASH_BUCKET_COUNT_V8,\r\n};\r\n\r\n#define PDB_TYPE_OFFSET_MAX  max_U32\r\ntypedef U32 PDB_TypeOffset;\r\n\r\ntypedef struct PDB_TpiOffHint\r\n{\r\n  CV_TypeId itype;\r\n  PDB_TypeOffset off;\r\n} PDB_TpiOffHint;\r\n\r\ntypedef struct PDB_OffsetSize\r\n{\r\n  U32 off;\r\n  U32 size;\r\n} PDB_OffsetSize;\r\n\r\ntypedef struct PDB_TpiHeader\r\n{\r\n  //   (HDR)\r\n  PDB_TpiVersion version;\r\n  U32 header_size;\r\n  U32 ti_lo;\r\n  U32 ti_hi;\r\n  U32 leaf_data_size;\r\n  \r\n  //   (PdbTpiHash)\r\n  MSF_StreamNumber hash_sn;\r\n  MSF_StreamNumber hash_sn_aux;\r\n  U32 hash_key_size;\r\n  U32 hash_bucket_count;\r\n  PDB_OffsetSize hash_vals;\r\n  PDB_OffsetSize itype_offs;\r\n  PDB_OffsetSize hash_adj;\r\n} PDB_TpiHeader;\r\n\r\n\r\n////////////////////////////////\r\n//~ PDB Format GSI Types\r\n\r\ntypedef U32 PDB_GsiSignature;\r\nenum\r\n{\r\n  PDB_GsiSignature_Basic = 0xffffffff,\r\n};\r\n\r\ntypedef U32 PDB_GsiVersion;\r\nenum\r\n{\r\n  PDB_GsiVersion_V70 = 0xeffe0000 + 19990810,\r\n};\r\n\r\ntypedef struct PDB_GsiHeader\r\n{\r\n  PDB_GsiSignature signature;\r\n  PDB_GsiVersion version;\r\n  U32 hash_record_arr_size;\r\n  U32 bucket_data_size;\r\n} PDB_GsiHeader;\r\n\r\ntypedef struct PDB_GsiHashRecord\r\n{\r\n  U32 symbol_off;\r\n  U32 cref;\r\n} PDB_GsiHashRecord;\r\n\r\ntypedef struct PDB_GsiHashRecordOffsetCalc\r\n{\r\n  U32 next;\r\n  U32 off;\r\n  U32 cref;\r\n} PDB_GsiHashRecordOffsetCalc;\r\n\r\ntypedef struct PDB_PsiHeader\r\n{\r\n  U32 sym_hash_size;\r\n  U32 addr_map_size;\r\n  U32 thunk_count;\r\n  U32 thunk_size;\r\n  CV_SectionIndex isec_thunk_table;\r\n  U16 padding;\r\n  U32 sec_thunk_table_off;\r\n  U32 sec_count;\r\n} PDB_PsiHeader;\r\n\r\n////////////////////////////////\r\n\r\ninternal U32 pdb_hash_v1(String8 string);\r\n\r\n#endif // PDB_H\r\n"
  },
  {
    "path": "src/pdb/pdb_parse.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ PDB Parser Functions\n\ninternal PDB_Info*\npdb_info_from_data(Arena *arena, String8 data){\n  ProfBegin(\"pdb_info_from_data\");\n  \n  // get header\n  PDB_InfoHeader *header = 0;\n  if (data.size >= sizeof(*header)){\n    header = (PDB_InfoHeader *)data.str;\n  }\n  \n  PDB_Info *result = 0;\n  if (header != 0){\n    // read guid\n    Guid *auth_guid = 0;\n    U32 after_auth_guid_off = sizeof(*header);\n    switch (header->version){\n      case PDB_InfoVersion_VC70_DEP:\n      case PDB_InfoVersion_VC70:\n      case PDB_InfoVersion_VC80:\n      case PDB_InfoVersion_VC110:\n      case PDB_InfoVersion_VC140:\n      {\n        auth_guid = (Guid*)(data.str + after_auth_guid_off);\n        after_auth_guid_off = sizeof(*header) + sizeof(*auth_guid);\n      }break;\n      \n      default:\n      {}break;\n    }\n    \n    if (header->version != 0){\n      // table layout: names\n      U32 names_len_off = after_auth_guid_off;\n      U32 names_len = 0;\n      if (names_len_off + 4 <= data.size){\n        names_len = *(U32*)(data.str + names_len_off);\n      }\n      \n      U32 names_base_off = names_len_off + 4;\n      U32 names_base_opl = names_base_off + names_len;\n      \n      // table layout: hash table\n      U32 hash_table_count_off = names_base_opl;\n      U32 hash_table_max_off = hash_table_count_off + 4;\n      \n      U32 hash_table_count = 0;\n      U32 hash_table_max = 0;\n      if (hash_table_max_off + 4 <= data.size){\n        hash_table_count = *(U32*)(data.str + hash_table_count_off);\n        hash_table_max = *(U32*)(data.str + hash_table_max_off);\n      }\n      \n      // table layout: words\n      U32 num_present_words_off = hash_table_max_off + 4;\n      U32 num_present_words = 0;\n      if (hash_table_max_off + 4 <= data.size){\n        num_present_words = *(U32*)(data.str + num_present_words_off);\n      }\n      U32 present_words_array_off = num_present_words_off + 4;\n      \n      U32 num_deleted_words_off = present_words_array_off + num_present_words*sizeof(U32);\n      U32 num_deleted_words = 0;\n      if (num_deleted_words_off + 4 <= data.size){\n        num_deleted_words = *(U32*)(data.str + num_deleted_words_off);\n      }\n      U32 deleted_words_array_off = num_deleted_words_off + 4;\n      \n      // table layout: epilogue\n      U32 epilogue_base_off = deleted_words_array_off + num_deleted_words*sizeof(U32);\n      \n      if (epilogue_base_off <= data.size){\n        U64 record_off = epilogue_base_off;\n        \n        // read table\n        if (hash_table_count > 0) {\n          PDB_InfoNode *first = 0;\n          PDB_InfoNode *last = 0;\n          \n          for (U32 i = 0; i < hash_table_count; i += 1, record_off += 8){\n            U32 *record = (U32*)(data.str + record_off);\n            U32 relative_name_off = record[0];\n            MSF_StreamNumber sn = (MSF_StreamNumber)record[1];\n            \n            U32 name_off = names_base_off + relative_name_off;\n            String8 name = str8_cstring_capped((char*)(data.str + name_off),\n                                               (char*)(data.str + names_base_opl));\n            \n            // push info node\n            PDB_InfoNode *node = push_array(arena, PDB_InfoNode, 1);\n            SLLQueuePush(first, last, node);\n            node->string = name;\n            node->sn = sn;\n          }\n          \n          result = push_array(arena, PDB_Info, 1);\n          result->first = first;\n          result->last = last;\n          result->auth_guid = *auth_guid;\n        }\n        \n        // read PDB features\n        PDB_FeatureFlags features = 0;\n        for (; record_off + sizeof(PDB_FeatureSig) <= data.size; ) {\n          PDB_FeatureSig sig = 0;\n          record_off += str8_deserial_read_struct(data, record_off, &sig);\n          switch (sig) {\n            case PDB_FeatureSig_NULL: break;\n            case PDB_FeatureSig_VC140:              features |= PDB_FeatureFlag_HAS_ID_STREAM;    break;\n            case PDB_FeatureSig_NO_TYPE_MERGE:      features |= PDB_FeatureFlag_NO_TYPE_MERGE;    break;\n            case PDB_FeatureSig_MINIMAL_DEBUG_INFO: features |= PDB_FeatureFlag_MINIMAL_DBG_INFO; break;\n          }\n        }\n        result->features = features;\n      }\n    }\n  }\n  \n  ProfEnd();\n  \n  return(result);\n}\n\ninternal PDB_NamedStreamTable*\npdb_named_stream_table_from_info(Arena *arena, PDB_Info *info){\n  ProfBegin(\"pdb_named_stream_table_from_info\");\n  \n  // mapping \"NamedStream\" indexes to strings\n  struct StreamNameIndexPair{\n    PDB_NamedStream index;\n    String8 name;\n  };\n  struct StreamNameIndexPair pairs[] = {\n    {PDB_NamedStream_HeaderBlock, str8_lit(\"/src/headerblock\")},\n    {PDB_NamedStream_StringTable, str8_lit(\"/names\")},\n    {PDB_NamedStream_LinkInfo,    str8_lit(\"/LinkInfo\")},\n  };\n  \n  // build baked table\n  PDB_NamedStreamTable *result = push_array(arena, PDB_NamedStreamTable, 1);\n  struct StreamNameIndexPair *p = pairs;\n  for (U64 i = 0; i < ArrayCount(pairs); i += 1, p += 1){\n    String8 name = p->name;\n    \n    // get info node with this name\n    PDB_InfoNode *match = 0;\n    for (PDB_InfoNode *node = info->first;\n         node != 0;\n         node = node->next){\n      if (str8_match(name, node->string, 0)){\n        match = node;\n        break;\n      }\n    }\n    \n    // if match found save stream number\n    if (match != 0){\n      result->sn[p->index] = match->sn;\n    }\n    else{\n      result->sn[p->index] = 0xFFFF;\n    }\n  }\n  \n  ProfEnd();\n  \n  return(result);\n}\n\ninternal PDB_Strtbl*\npdb_strtbl_from_data(Arena *arena, String8 data){\n  ProfBegin(\"pdb_strtbl_from_data\");\n  \n  // get header\n  PDB_StringTableHeader *header = 0;\n  if (sizeof(*header) <= data.size){\n    header = (PDB_StringTableHeader *)data.str;\n  }\n  \n  PDB_Strtbl *result = push_array(arena, PDB_Strtbl, 1);\n  if (header != 0 && header->magic == PDB_StringTableHeader_MAGIC && header->version == 1){\n    U32 strblock_size_off = sizeof(*header);\n    U32 strblock_size = 0;\n    if (strblock_size_off + 4 <= data.size){\n      strblock_size = *(U32*)(data.str + strblock_size_off);\n    }\n    U32 strblock_off = strblock_size_off + 4;\n    \n    U32 bucket_count_off = strblock_off + strblock_size;\n    U32 bucket_count = 0;\n    if (bucket_count_off + 4 <= data.size){\n      bucket_count = *(U32*)(data.str + bucket_count_off);\n    }\n    \n    U32 bucket_array_off = bucket_count_off + 4;\n    U32 bucket_array_size = bucket_count*sizeof(PDB_StringIndex);\n    \n    if (bucket_array_off + bucket_array_size <= data.size){\n      result->data = data;\n      result->bucket_count = bucket_count;\n      result->strblock_min = strblock_off;\n      result->strblock_max = strblock_off + strblock_size;\n      result->buckets_min = bucket_array_off;\n      result->buckets_max = bucket_array_off + bucket_array_size;\n    }\n  }\n  \n  ProfEnd();\n  \n  return(result);\n}\n\ninternal PDB_DbiParsed *\npdb_dbi_from_data(Arena *arena, String8 data)\n{\n  ProfBeginFunction();\n  PDB_DbiParsed *result = push_array(arena, PDB_DbiParsed, 1);;\n  \n  // rjf: extract header\n  PDB_DbiHeader *header = 0;\n  if(sizeof(*header) <= data.size)\n  {\n    header = (PDB_DbiHeader*)data.str;\n  }\n  \n  // rjf: parse\n  if(header != 0 && header->sig == PDB_DbiHeaderSignature_V1)\n  {\n    // extract range sizes\n    U64 range_size[PDB_DbiRange_COUNT];\n    range_size[PDB_DbiRange_ModuleInfo] = header->module_info_size;\n    range_size[PDB_DbiRange_SecCon]     = header->sec_con_size;\n    range_size[PDB_DbiRange_SecMap]     = header->sec_map_size;\n    range_size[PDB_DbiRange_FileInfo]   = header->file_info_size;\n    range_size[PDB_DbiRange_TSM]        = header->tsm_size;\n    range_size[PDB_DbiRange_EcInfo]     = header->ec_info_size;\n    range_size[PDB_DbiRange_DbgHeader]  = header->dbg_header_size;\n    \n    // fill result\n    result->data = data;\n    result->machine_type = header->machine;\n    result->gsi_sn = header->gsi_sn;\n    result->psi_sn = header->psi_sn;\n    result->sym_sn = header->sym_sn;\n    \n    \n    // fill result's range offsets\n    {\n      U64 cursor = sizeof(*header);\n      for(U64 i = 0; i < (U64)(PDB_DbiRange_COUNT); i += 1)\n      {\n        result->range_off[i] = cursor;\n        cursor += range_size[i];\n        cursor = ClampTop(cursor, data.size);\n      }\n      result->range_off[PDB_DbiRange_COUNT] = cursor;\n    }\n    \n    // fill result's debug streams\n    U64 dbg_streams_min = result->range_off[PDB_DbiRange_DbgHeader];\n    U64 dbg_streams_max = result->range_off[PDB_DbiRange_DbgHeader + 1];\n    U64 dbg_streams_size_raw = dbg_streams_max - dbg_streams_min;\n    U64 dbg_streams_size = ClampTop(dbg_streams_size_raw, sizeof(result->dbg_streams));\n    MemoryCopy(result->dbg_streams, data.str + dbg_streams_min, dbg_streams_size);\n    if(dbg_streams_size < sizeof(result->dbg_streams))\n    {\n      U64 filled_count = dbg_streams_size/sizeof(MSF_StreamNumber);\n      MemorySet(result->dbg_streams + filled_count, 0xff, (ArrayCount(result->dbg_streams) - filled_count)*sizeof(MSF_StreamNumber));\n    }\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal PDB_TpiParsed *\npdb_tpi_from_data(Arena *arena, String8 data)\n{\n  ProfBeginFunction();\n  PDB_TpiParsed *result = push_array(arena, PDB_TpiParsed, 1);\n  \n  // rjf: extract header\n  PDB_TpiHeader *header = 0;\n  if (sizeof(*header) <= data.size){\n    header = (PDB_TpiHeader*)data.str;\n  }\n  \n  // rjf: parse\n  if(header != 0 && header->version == PDB_TpiVersion_IMPV80)\n  {\n    U64 leaf_first_raw = header->header_size;\n    U64 leaf_first     = ClampTop(leaf_first_raw, data.size);\n    U64 leaf_opl_raw   = leaf_first + header->leaf_data_size;\n    U64 leaf_opl       = ClampTop(leaf_opl_raw, data.size);\n    \n    result->data = data;\n    \n    result->leaf_first  = leaf_first;\n    result->leaf_opl    = leaf_opl;\n    result->itype_first = header->ti_lo;\n    result->itype_opl   = header->ti_hi;\n    \n    result->hash_sn           = header->hash_sn;\n    result->hash_sn_aux       = header->hash_sn_aux;\n    result->hash_key_size     = header->hash_key_size;\n    result->hash_bucket_count = header->hash_bucket_count;\n    result->hash_vals_off     = header->hash_vals.off;\n    result->hash_vals_size    = header->hash_vals.size;\n    result->itype_off         = header->itype_offs.off;\n    result->itype_size        = header->itype_offs.size;\n    result->hash_adj_off      = header->hash_adj.off;\n    result->hash_adj_size     = header->hash_adj.size;\n  }\n  \n  ProfEnd();\n  return result;\n}\n\ninternal PDB_TpiHashParsed*\npdb_tpi_hash_from_data(Arena *arena, PDB_Strtbl *strtbl, PDB_TpiParsed *tpi, String8 data, String8 aux_data)\n{\n  ProfBeginFunction();\n  PDB_TpiHashParsed *result = push_array(arena, PDB_TpiHashParsed, 1);\n  U32 stride = tpi->hash_key_size;\n  U32 bucket_count = tpi->hash_bucket_count;\n  if(1 <= stride && stride <= 8 && bucket_count > 0 && data.str != 0)\n  {\n    // allocate buckets\n    PDB_TpiHashBlock **buckets = push_array(arena, PDB_TpiHashBlock*, bucket_count);\n    \n    // extract \"hash\" array\n    U8 *hashes = data.str + tpi->hash_vals_off;\n    U8 *hash_opl = hashes + tpi->hash_vals_size;\n    \n    // for each index in the array...\n    CV_TypeId itype = tpi->itype_first;\n    U8 *hash_cursor = hashes;\n    for (;hash_cursor + stride <= hash_opl;){\n      \n      // read index\n      U64 bucket_idx = 0;\n      MemoryCopy(&bucket_idx, hash_cursor, stride);\n      \n      // save to map\n      if (bucket_idx < bucket_count){\n        PDB_TpiHashBlock *block = buckets[bucket_idx];\n        if (block == 0 || block->local_count == ArrayCount(block->itypes)){\n          block = push_array(arena, PDB_TpiHashBlock, 1);\n          SLLStackPush(buckets[bucket_idx], block);\n        }\n        if(block->local_count != 0)\n        {\n          MemoryCopy(block->itypes+1, block->itypes, sizeof(CV_TypeId)*block->local_count);\n        }\n        block->itypes[0] = itype;\n        block->local_count += 1;\n      }\n      \n      // advance cursor\n      hash_cursor += stride;\n      itype += 1;\n    }\n    \n    //- rjf: compute bucket mask\n    U32 bucket_mask = 0;\n    if(IsPow2OrZero(bucket_count))\n    {\n      bucket_mask = bucket_count-1;\n    }\n    \n    //- rjf: apply hash adjustments, to pull correct type IDs to the front of\n    // the chains\n    if(tpi->hash_adj_size != 0)\n    {\n      // NOTE(rjf): this table is laid out in the following format:\n      //\n      // pair_count: U32 -> # of name_index/type_index pairs\n      // slot_count: U32 -> # of slots in this hash table\n      // present_bit_array_count: U32 -> count for next array\n      // present_bit_array: U32[present_bit_array_count] -> 1 bit per slot, \"is present\"\n      // deleted_bit_array_count: U32 -> count for next array\n      // deleted_bit_array: U32[deleted_bit_array_count] -> 1 bit per slot, \"is deleted\"\n      // (U32, U32)[pair_count] -> array of name_index/type_index pairs\n      //\n      U8 *adjs = data.str + tpi->hash_adj_off;\n      U8 *adjs_opl = adjs + tpi->hash_adj_size;\n      U8 *adjs_cursor = adjs;\n      U32 pair_count = *(U32 *)adjs_cursor;\n      adjs_cursor += sizeof(U32);\n      U32 slot_count = *(U32 *)adjs_cursor;\n      adjs_cursor += sizeof(U32);\n      U32 present_bit_array_count = *(U32 *)adjs_cursor; // skip present_bit_array\n      adjs_cursor += sizeof(U32);\n      adjs_cursor += present_bit_array_count*sizeof(U32);\n      U32 deleted_bit_array_count = *(U32 *)adjs_cursor; // skip deleted_bit_array\n      adjs_cursor += sizeof(U32);\n      adjs_cursor += deleted_bit_array_count*sizeof(U32);\n      U32 adjs_stride = sizeof(U32)*2;\n      U32 pair_idx = 0;\n      for(;adjs_cursor < adjs_opl && pair_idx < pair_count;\n          adjs_cursor += adjs_stride, pair_idx += 1)\n      {\n        U32 name_off = ((U32 *)adjs_cursor)[0];\n        CV_TypeId type_id = ((CV_TypeId *)adjs_cursor)[1];\n        String8 string = pdb_strtbl_string_from_off(strtbl, name_off);\n        U32 hash = pdb_hash_v1(string);\n        U32 bucket_idx = ((bucket_mask != 0) ? hash&bucket_mask : hash%bucket_count);\n        PDB_TpiHashBlock *prev_block = 0;\n        for(PDB_TpiHashBlock *block = buckets[bucket_idx];\n            block != 0;\n            prev_block = block, block = block->next)\n        {\n          for(U32 local_idx = 0;\n              local_idx < block->local_count && local_idx < ArrayCount(block->itypes);\n              local_idx += 1)\n          {\n            if(block->itypes[local_idx] == type_id)\n            {\n              if(prev_block != 0)\n              {\n                prev_block->next = block->next;\n                block->next = buckets[bucket_idx];\n                buckets[bucket_idx] = block;\n              }\n              if(local_idx != 0)\n              {\n                Swap(CV_TypeId, block->itypes[0], block->itypes[local_idx]);\n              }\n              break;\n            }\n          }\n        }\n      }\n    }\n    \n    // fill result\n    result->data = data;\n    result->aux_data = aux_data;\n    result->buckets = buckets;\n    result->bucket_count = bucket_count;\n    result->bucket_mask = bucket_mask;\n  }\n  ProfEnd();\n  return result;\n}\n\ninternal PDB_GsiParsed *\npdb_gsi_from_data(Arena *arena, String8 data)\n{\n  ProfBeginFunction();\n  PDB_GsiParsed *result = push_array(arena, PDB_GsiParsed, 1);\n  \n  // rjf: extract header\n  PDB_GsiHeader *header = 0;\n  if(sizeof(*header) <= data.size)\n  {\n    header = (PDB_GsiHeader*)data.str;\n  }\n  \n  // rjf: parse\n  if(header != 0 && header->signature == PDB_GsiSignature_Basic &&\n     header->version == PDB_GsiVersion_V70 && header->bucket_data_size != 0)\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    // hash offset\n    U32 hash_record_array_off = sizeof(*header);\n    \n    // bucket count\n    U32 slot_count = 4097;\n    \n    // array offsets\n    U32 bitmask_u32_count = CeilIntegerDiv(slot_count, 32);\n    U32 bitmask_byte_size = bitmask_u32_count*4;\n    U32 bitmask_off = hash_record_array_off + header->hash_record_arr_size;\n    U32 offsets_off = bitmask_off + bitmask_byte_size;\n    \n    // get bitmask & packed offset arrays\n    U8 *bitmasks = 0;\n    U8 *packed_offsets = 0;\n    if(bitmask_off + bitmask_byte_size <= data.size)\n    {\n      bitmasks = (data.str + bitmask_off);\n      packed_offsets = (data.str + offsets_off);\n    }\n    U32 packed_offset_count = (data.size - offsets_off)/4;\n    \n    // unpack\n    U32 *unpacked_offsets = 0;\n    if(packed_offsets != 0)\n    {\n      unpacked_offsets = push_array(scratch.arena, U32, slot_count);\n      \n      U32 *bitmask_ptr = (U32*)bitmasks;\n      U32 *bitmask_opl = bitmask_ptr + bitmask_u32_count;\n      U32 *src_ptr = (U32*)packed_offsets;\n      U32 *src_opl = src_ptr + packed_offset_count;\n      U32 *dst_ptr = unpacked_offsets;\n      U32 *dst_opl = dst_ptr + slot_count;\n      for(; bitmask_ptr < bitmask_opl && src_ptr < src_opl; bitmask_ptr += 1)\n      {\n        U32 bits = *bitmask_ptr;\n        U32 src_max = (U32)(src_opl - src_ptr);\n        U32 dst_max = (U32)(dst_opl - dst_ptr);\n        U32 k_max0 = ClampTop(32, dst_max);\n        U32 k_max  = ClampTop(k_max0, src_max);\n        for(U32 k = 0; k < k_max; k += 1)\n        {\n          if((bits & 1) == 1)\n          {\n            *dst_ptr = *src_ptr;\n            src_ptr += 1;\n          }\n          else\n          {\n            *dst_ptr = 0xFFFFFFFF;\n          }\n          dst_ptr += 1;\n          bits >>= 1;\n        }\n      }\n      for(; dst_ptr < dst_opl; dst_ptr += 1)\n      {\n        *dst_ptr = 0xFFFFFFFF;\n      }\n    }\n    \n    // construct table\n    B32 bad_table = 0;\n    if(unpacked_offsets != 0)\n    {\n      // hash records\n      PDB_GsiHashRecord *hash_records = (PDB_GsiHashRecord*)(data.str + hash_record_array_off);\n      U32 hash_record_count = header->hash_record_arr_size/sizeof(PDB_GsiHashRecord);\n      \n      // * We unpack hash records into the the table by scanning backwards through the\n      // * hash records. Neighboring values in unpacked_offsets *sort of* form counts, but we \n      // * have to skip the max-U32s (sloppy PDB nonsense).\n      \n      // * PDBs put one extra slot at the beginning of the encoded buckets that is mean\n      // * to be padding for modifying the buffer in place. After decoding there are 4096 buckets, \n      // * in the encoded buckets there are 4097. We are meant to drop the first one.\n      \n      // build table\n      PDB_GsiHashRecord *hash_record_ptr = hash_records + hash_record_count - 1;\n      U32 prev_n = hash_record_count;\n      for(U32 i = slot_count; i > 1;)\n      {\n        i -= 1;\n        if(unpacked_offsets[i] != 0xFFFFFFFF)\n        {\n          // determine hash record range to use\n          // * The \"12\" here is the result of some really sloppy PDB magic.\n          U32 n = unpacked_offsets[i]/12;\n          if(n > prev_n)\n          {\n            bad_table = 1;\n            break;\n          }\n          U32 num_steps = prev_n - n;\n          \n          // fill this bucket\n          U32 *bucket_offs = push_array_aligned(arena, U32, num_steps, 4);\n          for(U32 j = num_steps; j > 0;)\n          {\n            j -= 1;\n            // * The \"- 1\" is more sloppy PDB magic.\n            bucket_offs[j] = hash_record_ptr->symbol_off - 1;\n            hash_record_ptr -= 1;\n          }\n          PDB_GsiBucket *bucket = &result->buckets[i];\n          bucket->count = num_steps;\n          bucket->offs = bucket_offs;\n          \n          // update prev_n\n          prev_n = n;\n        }\n      }\n    }\n    scratch_end(scratch);\n  }\n  \n  ProfEnd();\n  return result;\n}\n\ninternal U64\npdb_gsi_symbol_from_string(PDB_GsiParsed *gsi, String8 symbol_data, String8 string)\n{\n  U64 result = max_U64;\n  \n  U32           hash       = pdb_hash_v1(string);\n  U32           bucket_idx = hash % ArrayCount(gsi->buckets);\n  PDB_GsiBucket bucket     = gsi->buckets[bucket_idx];\n  \n  for(U64 i = 0; i < bucket.count; ++i)\n  {\n    U32 off = bucket.offs[i];\n    if(off + sizeof(CV_RecHeader) <= symbol_data.size)\n    {\n      CV_RecHeader *sym_header = (CV_RecHeader *)(symbol_data.str + off);\n      \n      if(sym_header->size >= sizeof(sym_header->kind))\n      {\n        U64  opl_off = off + sizeof(sym_header->size) + sym_header->size;\n        U8  *sym_opl = (U8*)sym_header;\n        if(opl_off <= symbol_data.size)\n        {\n          sym_opl = symbol_data.str + opl_off;\n        }\n        \n        Rng1U64 raw_symbol_range = rng_1u64(off + sizeof(*sym_header), off + (sym_header->size - sizeof(sym_header->kind)));\n        String8 raw_symbol       = str8_substr(symbol_data, raw_symbol_range);\n        String8 sym_name         = cv_name_from_symbol(sym_header->kind, raw_symbol);\n        \n        if(str8_match(sym_name, string, 0))\n        {\n          result = off;\n          goto exit;\n        }\n      }\n    }\n  }\n  \n  exit:;\n  return result;\n}\n\ninternal COFF_SectionHeaderArray\npdb_coff_section_array_from_data(Arena *arena, String8 data){\n  COFF_SectionHeaderArray result = {0};\n  result.count = data.size/sizeof(COFF_SectionHeader);\n  result.v = (COFF_SectionHeader*)data.str;\n  return(result);\n}\n\ninternal PDB_CompUnitArray*\npdb_comp_unit_array_from_data(Arena *arena, String8 data){\n  PDB_CompUnitNode *first = 0;\n  PDB_CompUnitNode *last = 0;\n  U64 count = 0;\n  \n  U64 cursor = 0;\n  for (;cursor + sizeof(PDB_DbiCompUnitHeader) <= data.size;){\n    // get header\n    PDB_DbiCompUnitHeader *header = (PDB_DbiCompUnitHeader*)(data.str + cursor);\n    \n    // get names\n    U64 name_off = cursor + sizeof(*header);\n    String8 name = str8_cstring_capped((char *)(data.str + name_off), (char *)(data.str + data.size));\n    \n    U64 name2_off = name_off + name.size + 1;\n    String8 name2 = str8_cstring_capped((char *)(data.str + name2_off), (char *)(data.str + data.size));\n    \n    U64 after_name2_off = name2_off + name2.size + 1;\n    \n    // save mod info\n    PDB_CompUnitNode *node = push_array_no_zero(arena, PDB_CompUnitNode, 1);\n    SLLQueuePush(first, last, node);\n    count += 1;\n    node->unit.sn = header->sn;\n    node->unit.obj_name = name;\n    node->unit.group_name = name2;\n    \n    // fill range offsets\n    U32 *range_buf = node->unit.range_off;\n    {\n      // fill the buffer with size of each range\n      range_buf[PDB_DbiCompUnitRange_Symbols] = header->symbols_size;\n      range_buf[PDB_DbiCompUnitRange_C11] = header->c11_lines_size;\n      range_buf[PDB_DbiCompUnitRange_C13] = header->c13_lines_size;\n      Assert(PDB_DbiCompUnitRange_C13 + 1 == PDB_DbiCompUnitRange_COUNT);\n      \n      // in-place sizes -> offs conversion\n      U64 i = 0;\n      U32 range_cursor = 0;\n      for (; i < (U64)(PDB_DbiCompUnitRange_COUNT); i += 1){\n        U64 adv = range_buf[i];\n        range_buf[i] = range_cursor;\n        range_cursor += adv;\n      }\n      range_buf[i] = range_cursor;\n      \n      // skip 4 byte signature in symbols range\n      if (range_buf[1] >= 4){\n        range_buf[0] += 4;\n      }\n    }\n    \n    // update cursor\n    cursor = AlignPow2(after_name2_off, 4);\n  }\n  \n  \n  // fill result\n  PDB_CompUnit **units = push_array_no_zero(arena, PDB_CompUnit*, count);\n  {\n    U64 idx = 0;\n    for (PDB_CompUnitNode *node = first;\n         node != 0;\n         node = node->next, idx += 1){\n      units[idx] = &node->unit;\n    }\n  }\n  \n  PDB_CompUnitArray *result = push_array(arena, PDB_CompUnitArray, 1);\n  result->units = units;\n  result->count = count;\n  \n  return(result);\n}\n\ninternal PDB_CompUnitContributionArray\npdb_comp_unit_contribution_array_from_data(Arena *arena, String8 data, COFF_SectionHeaderArray sections)\n{\n  PDB_CompUnitContribution *contributions = 0;\n  U64 count = 0;\n  if(data.size >= sizeof(PDB_DbiSectionContribVersion))\n  {\n    PDB_DbiSectionContribVersion *version = (PDB_DbiSectionContribVersion*)data.str;\n    \n    // determine array layout from version\n    U32 item_size = 0;\n    U32 array_off = 0;\n    switch(*version)\n    {\n      default:\n      {\n        // TODO(allen): do we have a test case for this?\n        item_size = sizeof(PDB_DbiSectionContrib40);\n      }break;\n      case PDB_DbiSectionContribVersion_1:\n      {\n        item_size = sizeof(PDB_DbiSectionContrib);\n        array_off = sizeof(*version);\n      }break;\n      case PDB_DbiSectionContribVersion_2:\n      {\n        item_size = sizeof(PDB_DbiSectionContrib2);\n        array_off = sizeof(*version);\n      }break;\n    }\n    \n    // allocate ranges\n    U64 max_count = (data.size - array_off)/item_size;\n    contributions = push_array_no_zero(arena, PDB_CompUnitContribution, max_count);\n    \n    // binary section info\n    U64 section_count = sections.count;\n    COFF_SectionHeader* section_headers = sections.v;\n    \n    // fill array\n    PDB_CompUnitContribution *contribution_ptr = contributions;\n    U64 cursor = array_off;\n    for(; cursor + item_size <= data.size; cursor += item_size)\n    {\n      PDB_DbiSectionContrib40 *sc = (PDB_DbiSectionContrib40*)(data.str + cursor);\n      if(sc->size > 0 && 1 <= sc->sec && sc->sec <= section_count)\n      {\n        U64 voff = section_headers[sc->sec - 1].voff + sc->sec_off;\n        contribution_ptr->mod        = sc->mod;\n        contribution_ptr->voff_first = voff;\n        contribution_ptr->voff_opl   = voff + sc->size;\n        contribution_ptr += 1;\n      }\n    }\n    count = (U64)(contribution_ptr - contributions);\n  }\n  \n  // fill result\n  PDB_CompUnitContributionArray result = {0};\n  result.contributions = contributions;\n  result.count = count;\n  return result;\n}\n\n////////////////////////////////\n//~ PDB Dbi Functions\n\ninternal String8\npdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range){\n  String8 result = {0};\n  if (range < PDB_DbiRange_COUNT){\n    U64 first = dbi->range_off[range];\n    U64 opl   = dbi->range_off[range + 1];\n    result.str = dbi->data.str + first;\n    result.size = opl - first;\n  }\n  return(result);\n}\n\ninternal String8\npdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit, PDB_DbiCompUnitRange range){\n  String8 result = {0};\n  if (range < PDB_DbiCompUnitRange_COUNT){\n    String8 full_stream_data = msf_data_from_stream(msf, unit->sn);\n    \n    U64 first_raw = unit->range_off[range];\n    U64 opl_raw = unit->range_off[range + 1];\n    U64 opl = ClampTop(opl_raw, full_stream_data.size);\n    U64 first = ClampTop(first_raw, opl);\n    \n    result.str = full_stream_data.str + first;\n    result.size = opl - first;\n  }\n  return(result);\n}\n\n////////////////////////////////\n//~ PDB Tpi Functions\n\ninternal String8\npdb_leaf_data_from_tpi(PDB_TpiParsed *tpi){\n  String8 data = tpi->data;\n  U8 *first = data.str + tpi->leaf_first;\n  U8 *opl   = data.str + tpi->leaf_opl;\n  String8 result = str8_range(first, opl);\n  return(result);\n}\n\ninternal CV_TypeIdArray\npdb_tpi_itypes_from_name(Arena *arena, PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *leaf, String8 name, B32 compare_unique_name, U32 output_cap)\n{\n  CV_TypeIdArray result = {0};\n  if(tpi_hash->bucket_count != 0)\n  {\n    U32 hash = pdb_hash_v1(name);\n    U32 bucket_idx = ((tpi_hash->bucket_mask != 0) ?\n                      hash&tpi_hash->bucket_mask :\n                      hash%tpi_hash->bucket_count);\n    \n    CV_TypeId itype_first = leaf->itype_first;\n    CV_TypeId itype_opl = leaf->itype_opl;\n    String8 data = leaf->data;\n    \n    Temp scratch = scratch_begin(&arena, 1);\n    struct Chain\n    {\n      struct Chain *next;\n      CV_TypeId itype;\n    };\n    struct Chain *first = 0;\n    struct Chain *last = 0;\n    U32 count = 0;\n    \n    for (PDB_TpiHashBlock *block = tpi_hash->buckets[bucket_idx];\n         block != 0;\n         block = block->next){\n      U32 local_count = block->local_count;\n      CV_TypeId *itype_ptr = block->itypes;\n      for (U32 i = 0; i < local_count; i += 1, itype_ptr += 1){\n        \n        String8 extracted_name = {0};\n        \n        CV_TypeId itype = *itype_ptr;\n        if (itype_first <= itype && itype < itype_opl){\n          CV_RecRange *range = &leaf->leaf_ranges.ranges[itype - leaf->itype_first];\n          if (range->off + range->hdr.size <= data.size){\n            U8 *first = data.str + range->off + 2;\n            U64 cap = range->hdr.size - 2;\n            \n            switch (range->hdr.kind){\n              default:break;\n              \n              case CV_LeafKind_CLASS:\n              case CV_LeafKind_STRUCTURE:\n              {\n                if (sizeof(CV_LeafStruct) <= cap){\n                  CV_LeafStruct *lf_struct = (CV_LeafStruct*)first;\n                  \n                  if (!(lf_struct->props & CV_TypeProp_FwdRef)){\n                    // size\n                    U8 *numeric_ptr = (U8*)(lf_struct + 1);\n                    CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap);\n                    \n                    // name\n                    U8 *name_ptr = numeric_ptr + size.encoded_size;\n                    String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap));\n                    \n                    // unique name\n                    if (compare_unique_name){\n                      if (lf_struct->props & CV_TypeProp_HasUniqueName) {\n                        U8 *unique_name_ptr = name_ptr + name.size + 1;\n                        String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap));\n                        extracted_name = unique_name;\n                      }\n                    }\n                    else{\n                      extracted_name = name;\n                    }\n                  }\n                }\n              }break;\n              \n              case CV_LeafKind_CLASS2:\n              case CV_LeafKind_STRUCT2:\n              {\n                if (sizeof(CV_LeafStruct2) <= cap){\n                  CV_LeafStruct2 *lf_struct = (CV_LeafStruct2*)first;\n                  \n                  if (!(lf_struct->props & CV_TypeProp_FwdRef)){\n                    // size\n                    U8 *numeric_ptr = (U8*)(lf_struct + 1);\n                    CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap);\n                    \n                    // name\n                    U8 *name_ptr = numeric_ptr + size.encoded_size;\n                    String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap));\n                    \n                    // unique name\n                    if (compare_unique_name){\n                      if (lf_struct->props & CV_TypeProp_HasUniqueName) {\n                        U8 *unique_name_ptr = name_ptr + name.size + 1;\n                        String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap));\n                        extracted_name = unique_name;\n                      }\n                    }\n                    else{\n                      extracted_name = name;\n                    }\n                  }\n                }\n              }break;\n              \n              case CV_LeafKind_UNION:\n              {\n                if (sizeof(CV_LeafUnion) <= cap){\n                  CV_LeafUnion *lf_union = (CV_LeafUnion*)first;\n                  \n                  if (!(lf_union->props & CV_TypeProp_FwdRef)){\n                    // size\n                    U8 *numeric_ptr = (U8*)(lf_union + 1);\n                    CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, first + cap);\n                    \n                    // name\n                    U8 *name_ptr = numeric_ptr + size.encoded_size;\n                    String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap));\n                    \n                    // unique name\n                    if (compare_unique_name){\n                      if (lf_union->props & CV_TypeProp_HasUniqueName) {\n                        U8 *unique_name_ptr = name_ptr + name.size + 1;\n                        String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap));\n                        extracted_name = unique_name;\n                      }\n                    }\n                    else{\n                      extracted_name = name;\n                    }\n                  }\n                }\n              }break;\n              \n              case CV_LeafKind_ENUM:\n              {\n                if (sizeof(CV_LeafEnum) <= cap){\n                  CV_LeafEnum *lf_enum = (CV_LeafEnum*)first;\n                  \n                  if (!(lf_enum->props & CV_TypeProp_FwdRef)){\n                    // name\n                    U8 *name_ptr = (U8*)(lf_enum + 1);\n                    String8 name = str8_cstring_capped((char*)name_ptr, (char *)(first + cap));\n                    \n                    // unique name\n                    if (compare_unique_name){\n                      if (lf_enum->props & CV_TypeProp_HasUniqueName) {\n                        U8 *unique_name_ptr = name_ptr + name.size + 1;\n                        String8 unique_name = str8_cstring_capped((char*)unique_name_ptr, (char *)(first + cap));\n                        extracted_name = unique_name;\n                      }\n                    }\n                    else{\n                      extracted_name = name;\n                    }\n                  }\n                }\n              }break;\n            }\n          }\n        }\n        \n        if (str8_match(extracted_name, name, 0)){\n          struct Chain *chain = push_array(scratch.arena, struct Chain, 1);\n          SLLQueuePush(first, last, chain);\n          count += 1;\n          chain->itype = itype;\n          if (count == output_cap){\n            goto dblbreak;\n          }\n        }\n      }\n    }\n    \n    dblbreak:;\n    \n    \n    // assemble result\n    CV_TypeId *itypes = push_array_aligned(arena, CV_TypeId, count, 8);\n    {\n      CV_TypeId *itype_ptr = itypes;\n      for (struct Chain *node = first;\n           node != 0;\n           node = node->next, itype_ptr += 1){\n        *itype_ptr = node->itype;\n      }\n    }\n    result.itypes = itypes;\n    result.count = count;\n    \n    scratch_end(scratch);\n  }\n  return result;\n}\n\ninternal CV_TypeId\npdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash, CV_LeafParsed *tpi_leaf, String8 name, B32 compare_unique_name)\n{\n  Temp scratch = scratch_begin(0, 0);\n  CV_TypeIdArray array = pdb_tpi_itypes_from_name(scratch.arena, tpi_hash, tpi_leaf, name, compare_unique_name, 1);\n  CV_TypeId result = 0;\n  if(array.count > 0)\n  {\n    result = array.itypes[0];\n  }\n  scratch_end(scratch);\n  return(result);\n}\n\n////////////////////////////////\n//~ PDB Strtbl Functions\n\ninternal String8\npdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off){\n  U32 strblock_max = strtbl->strblock_max;\n  U32 full_off_raw = strtbl->strblock_min + off;\n  U32 full_off = ClampTop(full_off_raw, strblock_max);\n  String8 result = str8_cstring_capped((char*)(strtbl->data.str + full_off),\n                                       (char*)(strtbl->data.str + strblock_max));\n  return(result);\n}\n\ninternal String8\npdb_strtbl_string_from_index(PDB_Strtbl *strtbl, PDB_StringIndex idx){\n  String8 result = {0};\n  if (idx < strtbl->bucket_count){\n    U32 off = *(U32*)(strtbl->data.str + strtbl->buckets_min + idx*4);\n    result = pdb_strtbl_string_from_off(strtbl, off);\n  }\n  return(result);\n}\n\ninternal U32\npdb_strtbl_off_from_string(PDB_Strtbl *strtbl, String8 string)\n{\n  U32 result = max_U32;\n  \n  U32 hash            = pdb_hash_v1(string);\n  U32 best_bucket_idx = hash % strtbl->bucket_count;\n  U32 bucket_idx      = best_bucket_idx;\n  \n  do\n  {\n    String8 test_string = pdb_strtbl_string_from_index(strtbl, bucket_idx);\n    \n    if(test_string.size == 0)\n    {\n      break;\n    }\n    \n    if(str8_match(test_string, string, 0))\n    {\n      result = bucket_idx;\n      break;\n    }\n    \n    bucket_idx = (bucket_idx+1) % strtbl->buckets_max;\n  } while (bucket_idx != best_bucket_idx);\n  \n  return result;\n}\n\n////////////////////////////////\n//~ rjf: Thin Lookup Fast Paths\n\ninternal B32\npdb_has_symbol_ref(String8 msf_data, String8List symbol_list, MSF_RawStreamTable *st)\n{\n  Temp scratch = scratch_begin(0,0);\n  \n  B32 has_ref = 0;\n  \n  String8        dbi_data = msf_data_from_stream_number(scratch.arena, msf_data, st, PDB_FixedStream_Dbi);\n  PDB_DbiParsed *dbi      = pdb_dbi_from_data(scratch.arena, dbi_data);\n  if(dbi)\n  {\n    String8        gsi_data   = msf_data_from_stream_number(scratch.arena, msf_data, st, dbi->gsi_sn);\n    PDB_GsiParsed *gsi_parsed = pdb_gsi_from_data(scratch.arena, gsi_data);\n    if(gsi_parsed)\n    {\n      String8 symbol_data = msf_data_from_stream_number(scratch.arena, msf_data, st, dbi->sym_sn);\n      \n      for(String8Node *symbol_n = symbol_list.first; symbol_n != 0; symbol_n = symbol_n->next)\n      {\n        U64 symbol_off = pdb_gsi_symbol_from_string(gsi_parsed, symbol_data, symbol_n->string);\n        if(symbol_off < symbol_data.size)\n        {\n          has_ref = 1;\n          break;\n        }\n      }\n    }\n  }\n  \n  scratch_end(scratch);\n  return has_ref;\n}\n\ninternal B32\npdb_has_file_ref(String8 msf_data, String8List file_list, MSF_RawStreamTable *st)\n{\n  Temp scratch = scratch_begin(0,0);\n  \n  B32 has_ref = 0;\n  \n  String8   info_data = msf_data_from_stream_number(scratch.arena, msf_data, st, PDB_FixedStream_Info);\n  PDB_Info *info      = pdb_info_from_data(scratch.arena, info_data);\n  if(info)\n  {\n    PDB_NamedStreamTable *named_streams = pdb_named_stream_table_from_info(scratch.arena, info);\n    if(named_streams)\n    {\n      MSF_StreamNumber  strtbl_sn   = named_streams->sn[PDB_NamedStream_StringTable];\n      String8           strtbl_data = msf_data_from_stream_number(scratch.arena, msf_data, st, strtbl_sn);\n      PDB_Strtbl       *strtbl      = pdb_strtbl_from_data(scratch.arena, strtbl_data);\n      if(strtbl->bucket_count != 0)\n      {\n        for EachIndex(idx, strtbl->bucket_count)\n        {\n          String8 stored_string = pdb_strtbl_string_from_index(strtbl, idx);\n          for(String8Node *file_n = file_list.first; file_n != 0; file_n = file_n->next)\n          {\n            if(str8_match(file_n->string, stored_string, StringMatchFlag_CaseInsensitive|StringMatchFlag_SlashInsensitive))\n            {\n              has_ref = 1;\n              goto dbl_break;\n            }\n          }\n        }\n        dbl_break:;\n      }\n    }\n  }\n  \n  scratch_end(scratch);\n  return has_ref;\n}\n\ninternal B32\npdb_has_symbol_or_file_ref(String8 msf_data, String8List symbol_list, String8List file_list)\n{\n  Temp scratch = scratch_begin(0,0);\n  \n  B32 has_ref = 0;\n  \n  MSF_RawStreamTable *st = msf_raw_stream_table_from_data(scratch.arena, msf_data);\n  \n  if(!has_ref && symbol_list.node_count)\n  {\n    has_ref = pdb_has_symbol_ref(msf_data, symbol_list, st);\n  }\n  \n  if(!has_ref && file_list.node_count)\n  {\n    has_ref = pdb_has_file_ref(msf_data, file_list, st);\n  }\n  \n  scratch_end(scratch);\n  return has_ref;\n}\n"
  },
  {
    "path": "src/pdb/pdb_parse.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef PDB_PARSE_H\n#define PDB_PARSE_H\n\n////////////////////////////////\n//~ PDB Parser String Table Types\n\ntypedef struct PDB_Strtbl\n{\n  String8 data;\n  U32 bucket_count;\n  U32 strblock_min;\n  U32 strblock_max;\n  U32 buckets_min;\n  U32 buckets_max;\n} PDB_Strtbl;\n\n////////////////////////////////\n//~ PDB Parser Info Types\n\ntypedef enum PDB_NamedStream\n{\n  PDB_NamedStream_HeaderBlock,\n  PDB_NamedStream_StringTable,\n  PDB_NamedStream_LinkInfo,\n  PDB_NamedStream_Count\n} PDB_NamedStream;\n\ntypedef struct PDB_NamedStreamTable\n{\n  MSF_StreamNumber sn[PDB_NamedStream_Count];\n} PDB_NamedStreamTable;\n\ntypedef struct PDB_InfoNode\n{\n  struct PDB_InfoNode *next;\n  String8 string;\n  MSF_StreamNumber sn;\n} PDB_InfoNode;\n\ntypedef struct PDB_Info\n{\n  PDB_InfoNode *first;\n  PDB_InfoNode *last;\n  Guid auth_guid;\n  PDB_FeatureFlags features;\n} PDB_Info;\n\ntypedef struct PDB_InfoHeader\n{\n  PDB_InfoVersion version;\n  U32 time;\n  U32 age;\n} PDB_InfoHeader;\n\n////////////////////////////////\n//~ PDB Parser DBI Types\n\n//  (this is not \"literally\" defined by the format - but helpful to have)\ntypedef enum PDB_DbiRange\n{\n  PDB_DbiRange_ModuleInfo,\n  PDB_DbiRange_SecCon,\n  PDB_DbiRange_SecMap,\n  PDB_DbiRange_FileInfo,\n  PDB_DbiRange_TSM,\n  PDB_DbiRange_EcInfo,\n  PDB_DbiRange_DbgHeader,\n  PDB_DbiRange_COUNT\n} PDB_DbiRange;\n\n//  (this is not \"literally\" defined by the format - but helpful to have)\ntypedef enum\n{\n  PDB_DbiCompUnitRange_Symbols,\n  PDB_DbiCompUnitRange_C11,\n  PDB_DbiCompUnitRange_C13,\n  PDB_DbiCompUnitRange_COUNT\n} PDB_DbiCompUnitRange;\n\ntypedef struct PDB_DbiParsed\n{\n  String8 data;\n  COFF_MachineType machine_type;\n  MSF_StreamNumber gsi_sn;\n  MSF_StreamNumber psi_sn;\n  MSF_StreamNumber sym_sn;\n  U64 range_off[(U64)(PDB_DbiRange_COUNT) + 1];\n  MSF_StreamNumber dbg_streams[PDB_DbiStream_COUNT];\n} PDB_DbiParsed;\n\ntypedef struct PDB_CompUnit\n{\n  MSF_StreamNumber sn;\n  U32 range_off[(U32)(PDB_DbiCompUnitRange_COUNT) + 1];\n  \n  String8 obj_name;\n  String8 group_name;\n} PDB_CompUnit;\n\ntypedef struct PDB_CompUnitNode\n{\n  struct PDB_CompUnitNode *next;\n  PDB_CompUnit unit;\n} PDB_CompUnitNode;\n\ntypedef struct PDB_CompUnitArray\n{\n  PDB_CompUnit **units;\n  U64 count;\n} PDB_CompUnitArray;\n\ntypedef struct PDB_CompUnitContribution\n{\n  U32 mod;\n  U64 voff_first;\n  U64 voff_opl;\n} PDB_CompUnitContribution;\n\ntypedef struct PDB_CompUnitContributionArray\n{\n  PDB_CompUnitContribution *contributions;\n  U64 count;\n} PDB_CompUnitContributionArray;\n\n\n////////////////////////////////\n//~ PDB Parser TPI/IPI Types\n\ntypedef struct PDB_TpiParsed\n{\n  String8 data;\n  \n  // leaf info\n  U64 leaf_first;\n  U64 leaf_opl;\n  U32 itype_first;\n  U32 itype_opl;\n  \n  // hash info\n  MSF_StreamNumber hash_sn;\n  MSF_StreamNumber hash_sn_aux;\n  U32 hash_key_size;\n  U32 hash_bucket_count;\n  U32 hash_vals_off;\n  U32 hash_vals_size;\n  U32 itype_off;\n  U32 itype_size;\n  U32 hash_adj_off;\n  U32 hash_adj_size;\n  \n} PDB_TpiParsed;\n\ntypedef struct PDB_TpiHashBlock\n{\n  struct PDB_TpiHashBlock *next;\n  U32 local_count;\n  CV_TypeId itypes[13]; // 13 = (64 - 12)/4\n} PDB_TpiHashBlock;\n\ntypedef struct PDB_TpiHashParsed\n{\n  String8 data;\n  String8 aux_data;\n  \n  PDB_TpiHashBlock **buckets;\n  U32 bucket_count;\n  U32 bucket_mask;\n} PDB_TpiHashParsed;\n\n////////////////////////////////\n//~ PDB Parser GSI Types\n\ntypedef struct PDB_GsiBucket\n{\n  U32 *offs;\n  U64 count;\n} PDB_GsiBucket;\n\ntypedef struct PDB_GsiParsed\n{\n  PDB_GsiBucket buckets[4096];\n} PDB_GsiParsed;\n\n////////////////////////////////\n//~ rjf: Globals\n\nread_only global PDB_CompUnit pdb_comp_unit_nil = {0};\n\n////////////////////////////////\n//~ PDB Parser Functions\n\ninternal PDB_Info*            pdb_info_from_data(Arena *arena, String8 pdb_info_data);\ninternal PDB_NamedStreamTable*pdb_named_stream_table_from_info(Arena *arena, PDB_Info *info);\ninternal PDB_Strtbl*          pdb_strtbl_from_data(Arena *arena, String8 strtbl_data);\n\ninternal PDB_DbiParsed*       pdb_dbi_from_data(Arena *arena, String8 dbi_data);\ninternal PDB_TpiParsed*       pdb_tpi_from_data(Arena *arena, String8 tpi_data);\ninternal PDB_TpiHashParsed*   pdb_tpi_hash_from_data(Arena *arena,\n                                                     PDB_Strtbl *strtbl,\n                                                     PDB_TpiParsed *tpi,\n                                                     String8 tpi_hash_data,\n                                                     String8 tpi_hash_aux_data);\ninternal PDB_GsiParsed*       pdb_gsi_from_data(Arena *arena, String8 gsi_data);\ninternal U64                  pdb_gsi_symbol_from_string(PDB_GsiParsed *gsi, String8 symbol_data, String8 string);\n\ninternal COFF_SectionHeaderArray pdb_coff_section_array_from_data(Arena *arena, String8 section_data);\n\ninternal PDB_CompUnitArray*   pdb_comp_unit_array_from_data(Arena *arena,\n                                                            String8 module_info_data);\n\ninternal PDB_CompUnitContributionArray pdb_comp_unit_contribution_array_from_data(Arena *arena, String8 seccontrib_data, COFF_SectionHeaderArray sections);\n\n////////////////////////////////\n//~ PDB Dbi Functions\n\ninternal String8              pdb_data_from_dbi_range(PDB_DbiParsed *dbi, PDB_DbiRange range);\ninternal String8              pdb_data_from_unit_range(MSF_Parsed *msf, PDB_CompUnit *unit,\n                                                       PDB_DbiCompUnitRange range);\n\n////////////////////////////////\n//~ PDB Tpi Functions\n\ninternal String8              pdb_leaf_data_from_tpi(PDB_TpiParsed *tpi);\n\ninternal CV_TypeIdArray       pdb_tpi_itypes_from_name(Arena *arena,\n                                                       PDB_TpiHashParsed *tpi_hash,\n                                                       CV_LeafParsed *tpi_leaf,\n                                                       String8 name,\n                                                       B32 compare_unique_name,\n                                                       U32 output_cap);\n\ninternal CV_TypeId            pdb_tpi_first_itype_from_name(PDB_TpiHashParsed *tpi_hash,\n                                                            CV_LeafParsed *tpi_leaf,\n                                                            String8 name,\n                                                            B32 compare_unique_name);\n\n////////////////////////////////\n//~ PDB Strtbl Functions\n\ninternal String8              pdb_strtbl_string_from_off(PDB_Strtbl *strtbl, U32 off);\ninternal String8              pdb_strtbl_string_from_index(PDB_Strtbl *strtbl,\n                                                           PDB_StringIndex idx);\ninternal U32                  pdb_strtbl_off_from_string(PDB_Strtbl *strtbl, String8 string);\n\n////////////////////////////////\n//~ rjf: Thin Lookup Fast Paths\n\ninternal B32 pdb_has_symbol_ref(String8 msf_data, String8List symbol_list, MSF_RawStreamTable *st);\ninternal B32 pdb_has_file_ref(String8 msf_data, String8List file_list, MSF_RawStreamTable *st);\ninternal B32 pdb_has_symbol_or_file_ref(String8 msf_data, String8List symbol_list, String8List file_list);\n\n#endif // PDB_PARSE_H\n"
  },
  {
    "path": "src/pdb/pdb_stringize.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ PDB Stringize Functions\r\n\r\ninternal void\r\npdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash){\r\n  U32 bucket_count = hash->bucket_count;\r\n  str8_list_pushf(arena, out, \"bucket_count=%u\\n\\n\", bucket_count);\r\n  for (U32 i = 0; i < bucket_count; i += 1){\r\n    if (hash->buckets[i] != 0){\r\n      str8_list_pushf(arena, out, \"bucket[%u]:\\n\", i);\r\n      for (PDB_TpiHashBlock *block = hash->buckets[i];\r\n           block != 0;\r\n           block = block->next){\r\n        U32 local_count = block->local_count;\r\n        CV_TypeId *itype_ptr = block->itypes;\r\n        for (U32 j = 0; j < local_count; j += 1, itype_ptr += 1){\r\n          str8_list_pushf(arena, out, \" %u\\n\", *itype_ptr);\r\n        }\r\n      }\r\n      str8_list_push(arena, out, str8_lit(\"\\n\"));\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/pdb/pdb_stringize.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef PDB_STRINGIZE_H\r\n#define PDB_STRINGIZE_H\r\n\r\n////////////////////////////////\r\n//~ PDB Stringize Functions\r\n\r\ninternal void pdb_stringize_tpi_hash(Arena *arena, String8List *out, PDB_TpiHashParsed *hash);\r\n\r\n#endif // PDB_STRINGIZE_H\r\n"
  },
  {
    "path": "src/pe/dos_program.asm",
    "content": "; Copyright (c) Epic Games Tools\r\n; Licensed under the MIT license (https://opensource.org/license/mit/)\r\n; $ c:\\devel\\projects\\bin\\win32\\nasm src\\pe\\dos_program.asm -fbin -o dos_program.bin\r\n\r\nBITS 16\r\n\r\nSEGMENT CODE\r\n push cs         ; copy psp segment address to ds\r\n pop  ds\r\n mov  dx, msg    ; set print string\r\n mov  ah, 9h     ; print to stdout\r\n int  21h\r\n mov  ax, 0x4c01 ; terminate with return code 1 in al\r\n int  0x21\r\n\r\nmsg: DB \"This program cannot be run in DOS mode.$\",0\r\nALIGN 8, DB\r\n"
  },
  {
    "path": "src/pe/pe.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Enum Functions\r\n\r\ninternal U32\r\npe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode)\r\n{\r\n  U32 result = 0;\r\n  switch(opcode)\r\n  {\r\n    case PE_UnwindOpCode_PUSH_NONVOL:     result = 1; break;\r\n    case PE_UnwindOpCode_ALLOC_LARGE:     result = 2; break;\r\n    case PE_UnwindOpCode_ALLOC_SMALL:     result = 1; break;\r\n    case PE_UnwindOpCode_SET_FPREG:       result = 1; break;\r\n    case PE_UnwindOpCode_SAVE_NONVOL:     result = 2; break;\r\n    case PE_UnwindOpCode_SAVE_NONVOL_FAR: result = 3; break;\r\n    case PE_UnwindOpCode_EPILOG:          result = 2; break;\r\n    case PE_UnwindOpCode_SPARE_CODE:      result = 3; break;\r\n    case PE_UnwindOpCode_SAVE_XMM128:     result = 2; break;\r\n    case PE_UnwindOpCode_SAVE_XMM128_FAR: result = 3; break;\r\n    case PE_UnwindOpCode_PUSH_MACHFRAME:  result = 1; break;\r\n  }\r\n  return result;\r\n}\r\n\r\nglobal read_only struct\r\n{\r\n  String8             string;\r\n  PE_WindowsSubsystem type;\r\n} g_pe_subsystem_map[] = {\r\n  { str8_lit_comp(\"\"),                         PE_WindowsSubsystem_UNKNOWN                  },\r\n  { str8_lit_comp(\"native\"),                   PE_WindowsSubsystem_NATIVE                   },\r\n  { str8_lit_comp(\"windows\"),                  PE_WindowsSubsystem_WINDOWS_GUI              },\r\n  { str8_lit_comp(\"console\"),                  PE_WindowsSubsystem_WINDOWS_CUI              },\r\n  { str8_lit_comp(\"os2_cui\"),                  PE_WindowsSubsystem_OS2_CUI                  },\r\n  { str8_lit_comp(\"posix\"),                    PE_WindowsSubsystem_POSIX_CUI                },\r\n  { str8_lit_comp(\"native_windows\"),           PE_WindowsSubsystem_NATIVE_WINDOWS           },\r\n  { str8_lit_comp(\"windows_ce_gui\"),           PE_WindowsSubsystem_WINDOWS_CE_GUI           },\r\n  { str8_lit_comp(\"efi_application\"),          PE_WindowsSubsystem_EFI_APPLICATION          },\r\n  { str8_lit_comp(\"efi_boot_service_driver\"),  PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER  },\r\n  { str8_lit_comp(\"efi_runtime_driver\"),       PE_WindowsSubsystem_EFI_RUNTIME_DRIVER       },\r\n  { str8_lit_comp(\"efi_rom\"),                  PE_WindowsSubsystem_EFI_ROM                  },\r\n  { str8_lit_comp(\"xbox\"),                     PE_WindowsSubsystem_XBOX                     },\r\n  { str8_lit_comp(\"windows_boot_application\"), PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION },\r\n};\r\nStaticAssert(ArrayCount(g_pe_subsystem_map) == PE_WindowsSubsystem_COUNT, g_pe_subsystem_map_count_check);\r\n\r\ninternal String8\r\npe_string_from_subsystem(PE_WindowsSubsystem subsystem)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_pe_subsystem_map); i += 1) {\r\n    if (g_pe_subsystem_map[i].type == subsystem) {\r\n      return g_pe_subsystem_map[i].string;\r\n    }\r\n  }\r\n  return str8(0,0);\r\n}\r\n\r\ninternal String8\r\npe_string_from_unwind_gpr_x64(PE_UnwindGprRegX64 x)\r\n{\r\n  switch (x) {\r\n    case PE_UnwindGprRegX64_RAX: return str8_lit(\"RCX\");\r\n    case PE_UnwindGprRegX64_RCX: return str8_lit(\"RCX\");\r\n    case PE_UnwindGprRegX64_RDX: return str8_lit(\"RDX\");\r\n    case PE_UnwindGprRegX64_RBX: return str8_lit(\"RBX\");\r\n    case PE_UnwindGprRegX64_RSP: return str8_lit(\"RSP\");\r\n    case PE_UnwindGprRegX64_RBP: return str8_lit(\"RBP\");\r\n    case PE_UnwindGprRegX64_RSI: return str8_lit(\"RSI\");\r\n    case PE_UnwindGprRegX64_RDI: return str8_lit(\"RDI\");\r\n    case PE_UnwindGprRegX64_R8:  return str8_lit(\"R8\");\r\n    case PE_UnwindGprRegX64_R9:  return str8_lit(\"R9\");\r\n    case PE_UnwindGprRegX64_R10: return str8_lit(\"R10\");\r\n    case PE_UnwindGprRegX64_R11: return str8_lit(\"R11\");\r\n    case PE_UnwindGprRegX64_R12: return str8_lit(\"R12\");\r\n    case PE_UnwindGprRegX64_R13: return str8_lit(\"R13\");\r\n    case PE_UnwindGprRegX64_R14: return str8_lit(\"R14\");\r\n    case PE_UnwindGprRegX64_R15: return str8_lit(\"R15\");\r\n    default: InvalidPath;\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\npe_string_from_data_directory_index(PE_DataDirectoryIndex x)\r\n{\r\n  switch (x) {\r\n    case PE_DataDirectoryIndex_EXPORT:         return str8_lit(\"Export\");\r\n    case PE_DataDirectoryIndex_IMPORT:         return str8_lit(\"Import\");\r\n    case PE_DataDirectoryIndex_RESOURCES:      return str8_lit(\"Resources\");\r\n    case PE_DataDirectoryIndex_EXCEPTIONS:     return str8_lit(\"Exceptions\");\r\n    case PE_DataDirectoryIndex_CERT:           return str8_lit(\"Cert\");\r\n    case PE_DataDirectoryIndex_BASE_RELOC:     return str8_lit(\"BaseReloc\");\r\n    case PE_DataDirectoryIndex_DEBUG:          return str8_lit(\"Debug\");\r\n    case PE_DataDirectoryIndex_ARCH:           return str8_lit(\"Arch\");\r\n    case PE_DataDirectoryIndex_GLOBAL_PTR:     return str8_lit(\"GlobalPtr\");\r\n    case PE_DataDirectoryIndex_TLS:            return str8_lit(\"TLS\");\r\n    case PE_DataDirectoryIndex_LOAD_CONFIG:    return str8_lit(\"LoadConfig\");\r\n    case PE_DataDirectoryIndex_BOUND_IMPORT:   return str8_lit(\"BoundImport\");\r\n    case PE_DataDirectoryIndex_IMPORT_ADDR:    return str8_lit(\"ImportAddr\");\r\n    case PE_DataDirectoryIndex_DELAY_IMPORT:   return str8_lit(\"DelayImport\");\r\n    case PE_DataDirectoryIndex_COM_DESCRIPTOR: return str8_lit(\"COM Descriptor\");\r\n    case PE_DataDirectoryIndex_RESERVED:       return str8_lit(\"Reserved\");\r\n    default: InvalidPath;\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\npe_string_from_debug_directory_type(PE_DebugDirectoryType x)\r\n{\r\n  switch (x) {\r\n    case PE_DebugDirectoryType_UNKNOWN:               return str8_lit(\"UNKNOWN\");\r\n    case PE_DebugDirectoryType_COFF:                  return str8_lit(\"COFF\");\r\n    case PE_DebugDirectoryType_CODEVIEW:              return str8_lit(\"CODEVIEW\");\r\n    case PE_DebugDirectoryType_FPO:                   return str8_lit(\"FPO\");\r\n    case PE_DebugDirectoryType_MISC:                  return str8_lit(\"MISC\");\r\n    case PE_DebugDirectoryType_EXCEPTION:             return str8_lit(\"EXCEPTION\");\r\n    case PE_DebugDirectoryType_FIXUP:                 return str8_lit(\"FIXUP\");\r\n    case PE_DebugDirectoryType_OMAP_TO_SRC:           return str8_lit(\"OMAP_TO_SRC\");\r\n    case PE_DebugDirectoryType_OMAP_FROM_SRC:         return str8_lit(\"OMAP_FROM_SRC\");\r\n    case PE_DebugDirectoryType_BORLAND:               return str8_lit(\"BORLAND\");\r\n    case PE_DebugDirectoryType_RESERVED10:            return str8_lit(\"RESERVED10\");\r\n    case PE_DebugDirectoryType_CLSID:                 return str8_lit(\"CLSID\");\r\n    case PE_DebugDirectoryType_VC_FEATURE:            return str8_lit(\"VC_FEATURE\");\r\n    case PE_DebugDirectoryType_COFF_GROUP:            return str8_lit(\"COFF_GROUP\");\r\n    case PE_DebugDirectoryType_ILTCG:                 return str8_lit(\"ILTCG\");\r\n    case PE_DebugDirectoryType_MPX:                   return str8_lit(\"MPX\");\r\n    case PE_DebugDirectoryType_REPRO:                 return str8_lit(\"REPRO\");\r\n    case PE_DebugDirectoryType_EX_DLLCHARACTERISTICS: return str8_lit(\"EX_DLLCHARACTERISTICS\");\r\n    case PE_DebugDirectoryType_COUNT:                 return str8_lit(\"COUNT\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\npe_string_from_fpo_type(PE_FPOType x)\r\n{\r\n  switch (x) {\r\n    case PE_FPOType_FPO:   return str8_lit(\"FPO\");\r\n    case PE_FPOType_TRAP:  return str8_lit(\"TRAP\");\r\n    case PE_FPOType_TSS:   return str8_lit(\"TSS\");\r\n    case PE_FPOType_NOFPO: return str8_lit(\"NOFPO\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\npe_string_from_misc_type(PE_DebugMiscType x)\r\n{\r\n  switch (x) {\r\n    case PE_DebugMiscType_NULL:     break;\r\n    case PE_DebugMiscType_EXE_NAME: return str8_lit(\"EXE_NAME\");\r\n  }\r\n  return str8_zero();\r\n}\r\n\r\ninternal String8\r\npe_resource_kind_to_string(PE_ResourceKind x)\r\n{\r\n  String8 result = str8_zero();\r\n  switch (x) {\r\n    case PE_ResourceKind_ACCELERATOR:  result = str8_lit(\"Accelerator\");     break;\r\n    case PE_ResourceKind_ANICURSOR:    result = str8_lit(\"Animated Cursor\"); break;\r\n    case PE_ResourceKind_ANIICON:      result = str8_lit(\"Animated Icon\");   break;\r\n    case PE_ResourceKind_BITMAP:       result = str8_lit(\"Bitmap\");          break;\r\n    case PE_ResourceKind_CURSOR:       result = str8_lit(\"Cursor\");          break;\r\n    case PE_ResourceKind_DIALOG:       result = str8_lit(\"Dialog\");          break;\r\n    case PE_ResourceKind_FONT:         result = str8_lit(\"Font\");            break;\r\n    case PE_ResourceKind_FONTDIR:      result = str8_lit(\"Font Directory\");  break;\r\n    case PE_ResourceKind_GROUP_CURSOR: result = str8_lit(\"Cursor Group\");    break;\r\n    case PE_ResourceKind_GROUP_ICON:   result = str8_lit(\"Icon Group\");      break;\r\n    case PE_ResourceKind_HTML:         result = str8_lit(\"HTML\");            break;\r\n    case PE_ResourceKind_ICON:         result = str8_lit(\"Icon\");            break;\r\n    case PE_ResourceKind_MANIFEST:     result = str8_lit(\"Manifest\");        break;\r\n    case PE_ResourceKind_MENU:         result = str8_lit(\"Menu\");            break;\r\n    case PE_ResourceKind_MESSAGETABLE: result = str8_lit(\"Message Table\");   break;\r\n    case PE_ResourceKind_PLUGPLAY:     result = str8_lit(\"Plug Play\");       break;\r\n    case PE_ResourceKind_RCDATA:       result = str8_lit(\"RC Data\");         break;\r\n    case PE_ResourceKind_STRING:       result = str8_lit(\"String\");          break;\r\n    case PE_ResourceKind_VERSION:      result = str8_lit(\"Version Info\");    break;\r\n    case PE_ResourceKind_VXD:          result = str8_lit(\"VXD\");             break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\npe_string_from_fpo_flags(Arena *arena, PE_FPOFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List l = {0};\r\n  if (flags & PE_FPOFlags_HAS_SEH) {\r\n    str8_list_pushf(scratch.arena, &l, \"HAS_SEH\");\r\n  }\r\n  if (flags & PE_FPOFlags_USE_BP_REG) {\r\n    str8_list_pushf(scratch.arena, &l, \"USE_BP_REG\");\r\n  }\r\n  if (flags & PE_FPOFlags_RESERVED) {\r\n    str8_list_pushf(scratch.arena, &l, \"RESERVED\");\r\n  }\r\n  String8 result = str8_list_join(arena, &l, &(StringJoin){.sep=str8_lit(\" \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\npe_string_from_global_flags(Arena *arena, PE_GlobalFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  String8List l = {0};\r\n  if (flags & PE_GlobalFlags_STOP_ON_EXCEPTION) {\r\n    str8_list_pushf(scratch.arena, &l, \"STOP_ON_EXCEPTION\");\r\n  }\r\n  if (flags & PE_GlobalFlags_SHOW_LDR_SNAPS) {\r\n    str8_list_pushf(scratch.arena, &l, \"SHOW_LDR_SNAPS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_DEBUG_INITIAL_COMMAND) {\r\n    str8_list_pushf(scratch.arena, &l, \"DEBUG_INITIAL_COMMAND\");\r\n  }\r\n  if (flags & PE_GlobalFlags_STOP_ON_HUNG_GUI) {\r\n    str8_list_pushf(scratch.arena, &l, \"STOP_ON_HUNG_GUI\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_ENABLE_TAIL_CHECK) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_ENABLE_TAIL_CHECK\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_ENABLE_FREE_CHECK) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_ENABLE_FREE_CHECK\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_VALIDATE_PARAMETERS) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_VALIDATE_PARAMETERS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_VALIDATE_ALL) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_VALIDATE_ALL\");\r\n  }\r\n  if (flags & PE_GlobalFlags_APPLICATION_VERIFIER) {\r\n    str8_list_pushf(scratch.arena, &l, \"APPLICATION_VERIFIER\");\r\n  }\r\n  if (flags & PE_GlobalFlags_POOL_ENABLE_TAGGING) {\r\n    str8_list_pushf(scratch.arena, &l, \"POOL_ENABLE_TAGGING\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_ENABLE_TAGGING) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_ENABLE_TAGGING\");\r\n  }\r\n  if (flags & PE_GlobalFlags_STACK_TRACE_DB) {\r\n    str8_list_pushf(scratch.arena, &l, \"STACK_TRACE_DB\");\r\n  }\r\n  if (flags & PE_GlobalFlags_KERNEL_STACK_TRACE_DB) {\r\n    str8_list_pushf(scratch.arena, &l, \"KERNEL_STACK_TRACE_DB\");\r\n  }\r\n  if (flags & PE_GlobalFlags_MAINTAIN_OBJECT_TYPELIST) {\r\n    str8_list_pushf(scratch.arena, &l, \"MAINTAIN_OBJECT_TYPELIST\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_ENABLE_TAG_BY_DLL) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_ENABLE_TAG_BY_DLL\");\r\n  }\r\n  if (flags & PE_GlobalFlags_DISABLE_STACK_EXTENSION) {\r\n    str8_list_pushf(scratch.arena, &l, \"DISABLE_STACK_EXTENSION\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_CSRDEBUG) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_CSRDEBUG\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_KDEBUG_SYMBOL_LOAD) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_KDEBUG_SYMBOL_LOAD\");\r\n  }\r\n  if (flags & PE_GlobalFlags_DISABLE_PAGE_KERNEL_STACKS) {\r\n    str8_list_pushf(scratch.arena, &l, \"DISABLE_PAGE_KERNEL_STACKS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_SYSTEM_CRIT_BREAKS) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_SYSTEM_CRIT_BREAKS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_DISABLE_COALESCING) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_DISABLE_COALESCING\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_CLOSE_EXCEPTIONS) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_CLOSE_EXCEPTIONS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_EXCEPTION_LOGGING) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_EXCEPTION_LOGGING\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_HANDLE_TYPE_TAGGING) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_HANDLE_TYPE_TAGGING\");\r\n  }\r\n  if (flags & PE_GlobalFlags_HEAP_PAGE_ALLOCS) {\r\n    str8_list_pushf(scratch.arena, &l, \"HEAP_PAGE_ALLOCS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_DEBUG_INITIAL_COMMAND_EX) {\r\n    str8_list_pushf(scratch.arena, &l, \"DEBUG_INITIAL_COMMAND_EX\");\r\n  }\r\n  if (flags & PE_GlobalFlags_DISABLE_DBGPRINT) {\r\n    str8_list_pushf(scratch.arena, &l, \"DISABLE_DBGPRINT\");\r\n  }\r\n  if (flags & PE_GlobalFlags_CRITSEC_EVENT_CREATION) {\r\n    str8_list_pushf(scratch.arena, &l, \"CRITSEC_EVENT_CREATION\");\r\n  }\r\n  if (flags & PE_GlobalFlags_LDR_TOP_DOWN) {\r\n    str8_list_pushf(scratch.arena, &l, \"LDR_TOP_DOWN\");\r\n  }\r\n  if (flags & PE_GlobalFlags_ENABLE_HANDLE_EXCEPTIONS) {\r\n    str8_list_pushf(scratch.arena, &l, \"ENABLE_HANDLE_EXCEPTIONS\");\r\n  }\r\n  if (flags & PE_GlobalFlags_DISABLE_PROTDLLS) {\r\n    str8_list_pushf(scratch.arena, &l, \"DISABLE_PROTDLLS\");\r\n  }\r\n  \r\n  String8 result = str8_list_join(arena, &l, &(StringJoin){.sep=str8_lit(\" \")});\r\n  return result;\r\n}\r\n\r\ninternal String8\r\npe_string_from_load_config_guard_flags(Arena *arena, PE_LoadConfigGuardFlags flags)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  String8List l = {0};\r\n  if (flags & PE_LoadConfigGuardFlags_CF_INSTRUMENTED) {\r\n    str8_list_pushf(scratch.arena, &l, \"CF_INSTRUMENTED\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_CFW_INSTRUMENTED) {\r\n    str8_list_pushf(scratch.arena, &l, \"CFW_INSTRUMENTED\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_PRESENT) {\r\n    str8_list_pushf(scratch.arena, &l, \"CF_FUNCTION_TABLE_PRESENT\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_SECURITY_COOKIE_UNUSED) {\r\n    str8_list_pushf(scratch.arena, &l, \"SECURITY_COOKIE_UNUSED\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_PROTECT_DELAYLOAD_IAT) {\r\n    str8_list_pushf(scratch.arena, &l, \"PROTECT_DELAYLOAD_IAT\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION) {\r\n    str8_list_pushf(scratch.arena, &l, \"DELAYLOAD_IAT_IN_ITS_OWN_SECTION\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_CF_EXPORT_SUPPRESSION_INFO_PRESENT) {\r\n    str8_list_pushf(scratch.arena, &l, \"CF_EXPORT_SUPPRESSION_INFO_PRESENT\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_CF_ENABLE_EXPORT_SUPPRESSION) {\r\n    str8_list_pushf(scratch.arena, &l, \"CF_ENABLE_EXPORT_SUPPRESSION\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_CF_LONGJUMP_TABLE_PRESENT) {\r\n    str8_list_pushf(scratch.arena, &l, \"CF_LONGJUMP_TABLE_PRESENT\");\r\n  }\r\n  if (flags & PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT) {\r\n    str8_list_pushf(scratch.arena, &l, \"EH_CONTINUATION_TABLE_PRESENT\");\r\n  }\r\n  \r\n  String8 result = str8_list_join(arena, &l, &(StringJoin){.sep = str8_lit(\" \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\npe_string_from_dll_characteristics(Arena *arena, PE_DllCharacteristics dll_chars)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List l = {0};\r\n  if (dll_chars & PE_DllCharacteristic_HIGH_ENTROPY_VA) {\r\n    str8_list_pushf(scratch.arena, &l, \"High Entropy Virtual Address\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_DYNAMIC_BASE) {\r\n    str8_list_pushf(scratch.arena, &l, \"Dynamic Base\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_FORCE_INTEGRITY) {\r\n    str8_list_pushf(scratch.arena, &l, \"Force Integrity\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_NX_COMPAT) {\r\n    str8_list_pushf(scratch.arena, &l, \"NX Compatible\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_NO_ISOLATION) {\r\n    str8_list_pushf(scratch.arena, &l, \"No Isolation\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_NO_SEH) {\r\n    str8_list_pushf(scratch.arena, &l, \"No SEH\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_NO_BIND) {\r\n    str8_list_pushf(scratch.arena, &l, \"No Bind\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_APPCONTAINER) {\r\n    str8_list_pushf(scratch.arena, &l, \"App Container\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_WDM_DRIVER) {\r\n    str8_list_pushf(scratch.arena, &l, \"WDM Driver\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_GUARD_CF) {\r\n    str8_list_pushf(scratch.arena, &l, \"GuardCF\");\r\n  }\r\n  if (dll_chars & PE_DllCharacteristic_TERMINAL_SERVER_AWARE) {\r\n    str8_list_pushf(scratch.arena, &l, \"Terminal Server Aware\");\r\n  }\r\n  String8 result = str8_list_join(arena, &l, &(StringJoin){.sep=str8_lit(\", \")});\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal PE_WindowsSubsystem\r\npe_subsystem_from_string(String8 string)\r\n{\r\n  for (U64 i = 0; i < ArrayCount(g_pe_subsystem_map); i += 1) {\r\n    if (str8_match(g_pe_subsystem_map[i].string, string, StringMatchFlag_CaseInsensitive)) {\r\n      return g_pe_subsystem_map[i].type;\r\n    }\r\n  }\r\n  return PE_WindowsSubsystem_UNKNOWN;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Parser Functions\r\n\r\ninternal B32\r\npe_check_magic(String8 data)\r\n{\r\n  B32 is_pe = 0;\r\n  PE_DosHeader dos_header = {0};\r\n  str8_deserial_read_struct(data, 0, &dos_header);\r\n  if (dos_header.magic == PE_DOS_MAGIC) {\r\n    U32 pe_magic = 0;\r\n    str8_deserial_read_struct(data, dos_header.coff_file_offset, &pe_magic);\r\n    is_pe= pe_magic == PE_MAGIC;\r\n  }\r\n  return is_pe;\r\n}\r\n\r\ninternal PE_BinInfo\r\npe_bin_info_from_data(Arena *arena, String8 data)\r\n{\r\n  PE_BinInfo info = {0};\r\n  B32 valid = 1;\r\n  \r\n  // rjf: read dos header\r\n  PE_DosHeader dos_header = {0};\r\n  str8_deserial_read_struct(data, 0, &dos_header);\r\n  \r\n  // rjf: bad dos magic -> bad\r\n  if(dos_header.magic != PE_DOS_MAGIC)\r\n  {\r\n    valid = 0;\r\n  }\r\n  \r\n  // rjf: read pe magic\r\n  U32 pe_magic = 0;\r\n  if(valid)\r\n  {\r\n    str8_deserial_read_struct(data, dos_header.coff_file_offset, &pe_magic);\r\n  }\r\n  \r\n  // rjf: bad pe magic -> abort\r\n  if(pe_magic != PE_MAGIC)\r\n  {\r\n    valid = 0;\r\n  }\r\n  \r\n  // rjf: read coff header\r\n  U32             file_header_off = dos_header.coff_file_offset + sizeof(pe_magic);\r\n  COFF_FileHeader file_header     = {0};\r\n  if(valid)\r\n  {\r\n    str8_deserial_read_struct(data, file_header_off, &file_header);\r\n  }\r\n  \r\n  // rjf: range of optional extension header (\"optional\" for short)\r\n  U32     optional_size             = file_header.optional_header_size;\r\n  U64     after_file_header_off     = file_header_off + sizeof(COFF_FileHeader);\r\n  U64     after_optional_header_off = after_file_header_off + optional_size;\r\n  Rng1U64 optional_range            = {0};\r\n  if(valid)\r\n  {\r\n    optional_range.min = ClampTop(after_file_header_off,     data.size);\r\n    optional_range.max = ClampTop(after_optional_header_off, data.size);\r\n  }\r\n  \r\n  // rjf: get sections\r\n  U64                 sec_array_off     = optional_range.max;\r\n  U64                 sec_array_raw_opl = sec_array_off + file_header.section_count*sizeof(COFF_SectionHeader);\r\n  U64                 sec_array_opl     = ClampTop(sec_array_raw_opl, data.size);\r\n  U64                 clamped_sec_count = (sec_array_opl - sec_array_off)/sizeof(COFF_SectionHeader);\r\n  COFF_SectionHeader *sections          = (COFF_SectionHeader*)(data.str + sec_array_off);\r\n  \r\n  // rjf: get symbols\r\n  U64 symbol_array_off = file_header.symbol_table_foff;\r\n  U64 symbol_count = file_header.symbol_count;\r\n  \r\n  // rjf: get string table\r\n  U64 string_table_off = symbol_array_off + sizeof(COFF_Symbol16) * symbol_count;\r\n  \r\n  // rjf: read optional header\r\n  U16                  optional_magic     = 0;\r\n  U64                  image_base         = 0;\r\n  U64                  entry_point        = 0;\r\n  PE_WindowsSubsystem  subsystem          = 0;\r\n  U32                 *check_sum          = 0;\r\n  U32                  data_dir_count     = 0;\r\n  U64                  virt_section_align = 0;\r\n  U64                  file_section_align = 0;\r\n  Rng1U64              data_dir_range     = {0};\r\n  Rng1U64             *data_dir_franges   = 0;\r\n  Rng1U64             *data_dir_vranges   = 0;\r\n  if(valid && optional_size > 0)\r\n  {\r\n    // rjf: read magic number\r\n    str8_deserial_read_struct(data, optional_range.min, &optional_magic);\r\n    \r\n    // rjf: read info\r\n    U32 reported_data_dir_offset = 0;\r\n    U32 reported_data_dir_count = 0;\r\n    switch(optional_magic)\r\n    {\r\n      case PE_PE32_MAGIC:\r\n      {\r\n        PE_OptionalHeader32 *pe_optional = str8_deserial_get_raw_ptr(data, optional_range.min, sizeof(*pe_optional));\r\n        if(pe_optional)\r\n        {\r\n          image_base               = pe_optional->image_base;\r\n          entry_point              = pe_optional->entry_point_va;\r\n          subsystem                = pe_optional->subsystem;\r\n          check_sum                = &pe_optional->check_sum;\r\n          virt_section_align       = pe_optional->section_alignment;\r\n          file_section_align       = pe_optional->file_alignment;\r\n          reported_data_dir_offset = sizeof(*pe_optional);\r\n          reported_data_dir_count  = pe_optional->data_dir_count;\r\n        }\r\n        else\r\n        {\r\n          Assert(!\"unable to read PE Optional Header\");\r\n        }\r\n      }break;\r\n      case PE_PE32PLUS_MAGIC:\r\n      {\r\n        PE_OptionalHeader32Plus *pe_optional = str8_deserial_get_raw_ptr(data, optional_range.min, sizeof(*pe_optional));\r\n        if(pe_optional)\r\n        {\r\n          image_base               = pe_optional->image_base;\r\n          entry_point              = pe_optional->entry_point_va;\r\n          subsystem                = pe_optional->subsystem;\r\n          check_sum                = &pe_optional->check_sum;\r\n          virt_section_align       = pe_optional->section_alignment;\r\n          file_section_align       = pe_optional->file_alignment;\r\n          reported_data_dir_offset = sizeof(*pe_optional);\r\n          reported_data_dir_count  = pe_optional->data_dir_count;\r\n        }\r\n        else\r\n        {\r\n          Assert(!\"unable to read PE Optional Plus Header\");\r\n        }\r\n      }break;\r\n    }\r\n    \r\n    // rjf: find file ranges of data directories\r\n    U32 data_dir_max = (optional_size - reported_data_dir_offset) / sizeof(PE_DataDirectory);\r\n    data_dir_count = ClampTop(reported_data_dir_count, data_dir_max);\r\n    \r\n    // rjf: convert PE directories to ranges\r\n    data_dir_franges = push_array(arena, Rng1U64, Max(data_dir_count, PE_DataDirectoryIndex_COUNT));\r\n    for(U32 dir_idx = 0; dir_idx < data_dir_count; dir_idx += 1)\r\n    {\r\n      U64              dir_offset = optional_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*dir_idx;\r\n      PE_DataDirectory dir        = {0};\r\n      if(str8_deserial_read_struct(data, dir_offset, &dir) == sizeof(dir))\r\n      {\r\n        U64 file_off = coff_foff_from_voff(sections, clamped_sec_count, dir.virt_off);\r\n        data_dir_franges[dir_idx] = r1u64(file_off, file_off+dir.virt_size);\r\n      }\r\n      else\r\n      {\r\n        Assert(!\"unable to read data directory\");\r\n      }\r\n    }\r\n    \r\n    // export virtual directory ranges\r\n    data_dir_vranges = push_array(arena, Rng1U64, data_dir_count);\r\n    for(U32 dir_idx = 0; dir_idx < data_dir_count; dir_idx += 1)\r\n    {\r\n      U64              dir_offset = optional_range.min + reported_data_dir_offset + sizeof(PE_DataDirectory)*dir_idx;\r\n      PE_DataDirectory dir        = {0};\r\n      if(str8_deserial_read_struct(data, dir_offset, &dir) == sizeof(dir))\r\n      {\r\n        data_dir_vranges[dir_idx] = r1u64(dir.virt_off, dir.virt_off+dir.virt_size);\r\n      }\r\n      else\r\n      {\r\n        Assert(!\"unable to read data directory\");\r\n      }\r\n    }\r\n    \r\n    // export directory range\r\n    data_dir_range = rng_1u64(optional_range.min + reported_data_dir_offset, optional_range.min + reported_data_dir_offset + data_dir_count * sizeof(PE_DataDirectory));\r\n  }\r\n  \r\n  // rjf: extract tls header\r\n  PE_TLSHeader64 tls_header = {0};\r\n  if(valid && PE_DataDirectoryIndex_TLS < data_dir_count)\r\n  {\r\n    Rng1U64 tls_header_frng = data_dir_franges[PE_DataDirectoryIndex_TLS];\r\n    switch(file_header.machine)\r\n    {\r\n      default:{ NotImplemented; }break;\r\n      case COFF_MachineType_Unknown: break;\r\n      case COFF_MachineType_X86:\r\n      {\r\n        PE_TLSHeader32 tls_header32 = {0};\r\n        if(str8_deserial_read_struct(data, tls_header_frng.min, &tls_header32) == sizeof(tls_header32))\r\n        {\r\n          tls_header.raw_data_start    = (U64)tls_header32.raw_data_start;\r\n          tls_header.raw_data_end      = (U64)tls_header32.raw_data_end;\r\n          tls_header.index_address     = (U64)tls_header32.index_address;\r\n          tls_header.callbacks_address = (U64)tls_header32.callbacks_address;\r\n          tls_header.zero_fill_size    = (U64)tls_header32.zero_fill_size;\r\n          tls_header.characteristics   = (U64)tls_header32.characteristics;\r\n        }\r\n        else\r\n        {\r\n          Assert(!\"unable to read TLS Header 32\");\r\n        }\r\n      }break;\r\n      case COFF_MachineType_X64:\r\n      {\r\n        if(str8_deserial_read_struct(data, tls_header_frng.min, &tls_header) != sizeof(tls_header))\r\n        {\r\n          MemoryZeroStruct(&tls_header);\r\n          Assert(!\"unable to read TLS Header 64\");\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  // rjf: fill info\r\n  if(valid)\r\n  {\r\n    info.arch                = arch_from_coff_machine(file_header.machine);\r\n    info.image_base          = image_base;\r\n    info.entry_point         = entry_point;\r\n    info.is_pe32             = (optional_magic == PE_PE32_MAGIC);\r\n    info.subsystem           = subsystem;\r\n    info.check_sum           = check_sum;\r\n    info.virt_section_align  = virt_section_align;\r\n    info.file_section_align  = file_section_align;\r\n    info.section_count       = clamped_sec_count;\r\n    info.symbol_count        = symbol_count;\r\n    info.optional_header_off = optional_range.min;\r\n    info.section_table_range = rng_1u64(sec_array_off, sec_array_off + sizeof(COFF_SectionHeader) * clamped_sec_count);\r\n    info.symbol_table_range  = rng_1u64(symbol_array_off, symbol_array_off + sizeof(COFF_Symbol16) * symbol_count);\r\n    info.string_table_range  = rng_1u64(string_table_off, data.size);\r\n    info.data_dir_range      = data_dir_range;\r\n    info.data_dir_franges    = data_dir_franges;\r\n    info.data_dir_vranges    = data_dir_vranges;\r\n    info.data_dir_count      = data_dir_count;\r\n    info.tls_header          = tls_header;\r\n  }\r\n  \r\n  return info;\r\n}\r\n\r\ninternal PE_DataDirectory *\r\npe_data_directory_from_idx(String8 file_data, PE_BinInfo pe, PE_DataDirectoryIndex dir_idx)\r\n{\r\n  PE_DataDirectory *result = 0;\r\n  if (dir_idx < pe.data_dir_count) {\r\n    result = str8_deserial_get_raw_ptr(file_data, pe.data_dir_range.min + sizeof(*result)*dir_idx, sizeof(*result));\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal PE_DebugInfoList\r\npe_debug_info_list_from_raw_debug_dir(Arena *arena, String8 raw_image, String8 raw_debug_dir)\r\n{\r\n  PE_DebugInfoList result = {0};\r\n  PE_DebugDirectory *debug_entry     = str8_deserial_get_raw_ptr(raw_debug_dir, 0, sizeof(*debug_entry));\r\n  PE_DebugDirectory *debug_entry_opl = debug_entry + raw_debug_dir.size/sizeof(*debug_entry_opl);\r\n  for(PE_DebugDirectory *entry = debug_entry; entry < debug_entry_opl; entry += 1)\r\n  {\r\n    PE_DebugInfoNode *n = push_array(arena, PE_DebugInfoNode, 1);\r\n    SLLQueuePush(result.first, result.last, n);\r\n    result.count += 1;\r\n    n->v.header = *entry;\r\n    switch(entry->type)\r\n    {\r\n      default:{}break;\r\n      case PE_DebugDirectoryType_CODEVIEW:\r\n      {\r\n        str8_deserial_read_struct(raw_image, entry->foff, &n->v.cv_magic);\r\n        switch(n->v.cv_magic)\r\n        {\r\n          case PE_CODEVIEW_PDB20_MAGIC:\r\n          {\r\n            PE_CvHeaderPDB20 cv = {0};\r\n            U64 cv_read_size = str8_deserial_read_struct(raw_image, entry->foff, &cv);\r\n            if(cv_read_size == sizeof(cv))\r\n            {\r\n              String8 path = {0};\r\n              str8_deserial_read_cstr(raw_image, entry->foff+sizeof(cv), &path);\r\n              n->v.cv_pdb20_header = cv;\r\n              n->v.path = path;\r\n            }\r\n          }break;\r\n          case PE_CODEVIEW_PDB70_MAGIC:\r\n          {\r\n            PE_CvHeaderPDB70 cv = {0};\r\n            U64 cv_read_size = str8_deserial_read_struct(raw_image, entry->foff, &cv);\r\n            if(cv_read_size == sizeof(cv))\r\n            {\r\n              String8 path = {0};\r\n              str8_deserial_read_cstr(raw_image, entry->foff+sizeof(cv), &path);\r\n              n->v.cv_pdb70_header = cv;\r\n              n->v.path = path;\r\n            }\r\n          }break;\r\n          case PE_CODEVIEW_RDI_MAGIC:\r\n          {\r\n            PE_CvHeaderRDI cv = {0};\r\n            U64 cv_read_size = str8_deserial_read_struct(raw_image, entry->foff, &cv);\r\n            if(cv_read_size == sizeof(cv))\r\n            {\r\n              String8 path = {0};\r\n              str8_deserial_read_cstr(raw_image, entry->foff+sizeof(cv), &path);\r\n              n->v.cv_rdi_header = cv;\r\n              n->v.path = path;\r\n            }\r\n          }break;\r\n          default:{}break;\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal U64\r\npe_pdata_off_from_voff__binary_search_x8664(String8 raw_pdata, U64 voff)\r\n{\r\n  U64 result = 0;\r\n  \r\n  if(raw_pdata.size >= sizeof(PE_IntelPdata))\r\n  {\r\n    U64            pdata_count = raw_pdata.size/sizeof(PE_IntelPdata);\r\n    PE_IntelPdata *pdata_array = (PE_IntelPdata*)raw_pdata.str;\r\n    if(voff >= pdata_array[0].voff_first)\r\n    {\r\n      // binary search:\r\n      //  find max index s.t. pdata_array[index].voff_first <= voff\r\n      //  we assume (i < j) -> (pdata_array[i].voff_first < pdata_array[j].voff_first)\r\n      U64 index = pdata_count;\r\n      U64 min   = 0;\r\n      U64 opl   = pdata_count;\r\n      for(;;)\r\n      {\r\n        U64            mid   = (min + opl)/2;\r\n        PE_IntelPdata *pdata = pdata_array + mid;\r\n        if(voff < pdata->voff_first)\r\n        {\r\n          opl = mid;\r\n        }\r\n        else if(pdata->voff_first < voff)\r\n        {\r\n          min = mid;\r\n        }\r\n        else\r\n        {\r\n          index = mid;\r\n          break;\r\n        }\r\n        if(min + 1 >= opl)\r\n        {\r\n          index = min;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // if we are in range fill result\r\n      {\r\n        PE_IntelPdata *pdata = pdata_array + index;\r\n        if(pdata->voff_first <= voff && voff < pdata->voff_one_past_last)\r\n        {\r\n          result = index*sizeof(PE_IntelPdata);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal U64\r\npe_foff_from_voff(String8 data, PE_BinInfo *bin, U64 voff)\r\n{\r\n  U64                 foff              = 0;\r\n  String8             raw_section_table = str8_substr(data, bin->section_table_range);\r\n  COFF_SectionHeader *section_table     = (COFF_SectionHeader *)raw_section_table.str;\r\n  for(U64 sect_idx = 0; sect_idx < bin->section_count; sect_idx += 1)\r\n  {\r\n    COFF_SectionHeader *sect = &section_table[sect_idx];\r\n    if(sect->voff <= voff && voff < sect->voff + sect->vsize)\r\n    {\r\n      if(!(sect->flags & COFF_SectionFlag_CntUninitializedData))\r\n      {\r\n        foff = sect->foff + (voff - sect->voff);\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return foff;\r\n}\r\n\r\ninternal PE_BaseRelocBlockList\r\npe_base_reloc_block_list_from_data(Arena *arena, String8 raw_base_relocs)\r\n{\r\n  PE_BaseRelocBlockList list = {0};\r\n  for(U64 off = 0; off < raw_base_relocs.size;)\r\n  {\r\n    // rjf: read next entry\r\n    U32 page_virt_off = 0;\r\n    U32 block_size = 0;\r\n    off += str8_deserial_read_struct(raw_base_relocs, off, &page_virt_off);\r\n    off += str8_deserial_read_struct(raw_base_relocs, off, &block_size);\r\n    \r\n    // rjf: break on sentinel\r\n    if(block_size == 0)\r\n    {\r\n      break;\r\n    }\r\n    \r\n    // rjf: add node\r\n    PE_BaseRelocBlockNode *node = push_array(arena, PE_BaseRelocBlockNode, 1);\r\n    SLLQueuePush(list.first, list.last, node);\r\n    list.count += 1;\r\n    \r\n    U64 entries_size = block_size - (sizeof(block_size) + sizeof(page_virt_off));\r\n    \r\n    // rjf: fill block\r\n    PE_BaseRelocBlock *block = &node->v;\r\n    block->page_virt_off     = page_virt_off;\r\n    block->entry_count       = entries_size / sizeof(U16);\r\n    block->entries           = push_array(arena, U16, block->entry_count);\r\n    U64 entry_read_size = str8_deserial_read_array(raw_base_relocs, off, &block->entries[0], block->entry_count);\r\n    Assert(entry_read_size == sizeof(block->entries[0]) * block->entry_count);\r\n    \r\n    off += entry_read_size;\r\n  }\r\n  return list;\r\n}\r\n\r\ninternal Rng1U64\r\npe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr)\r\n{\r\n  U64 result_addr = (bin->tls_header.index_address - bin->image_base);\r\n  U64 result_size = sizeof(U32);\r\n  if(bin->arch != Arch_Null)\r\n  {\r\n    U64 addr_size = bit_size_from_arch(bin->arch)/8;\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 raw_relocs = str8_substr(data, bin->data_dir_franges[PE_DataDirectoryIndex_BASE_RELOC]);\r\n    PE_BaseRelocBlockList relocs = pe_base_reloc_block_list_from_data(scratch.arena, raw_relocs);\r\n    for(PE_BaseRelocBlockNode *n = relocs.first; n != 0; n = n->next)\r\n    {\r\n      PE_BaseRelocBlock *block = &n->v;\r\n      for(U64 ientry = 0; ientry < block->entry_count;)\r\n      {\r\n        U32 reloc = block->entries[ientry];\r\n        U16 kind = PE_BaseRelocKindFromEntry(reloc);\r\n        U16 offset = PE_BaseRelocOffsetFromEntry(reloc);\r\n        U64 apply_to_voff = block->page_virt_off + offset;\r\n        U64 apply_to_foff = pe_foff_from_voff(data, bin, apply_to_voff);\r\n        U64 apply_to      = 0;\r\n        str8_deserial_read(data, apply_to_foff, &apply_to, addr_size, 1);\r\n        if(apply_to == bin->tls_header.index_address)\r\n        {\r\n          U64 base_diff = base_vaddr-bin->image_base;\r\n          switch(kind)\r\n          {\r\n            default:\r\n            {\r\n              // NOTE(rjf): these relocs are arm/mips/riscv specific which aren't supported at the moment\r\n            }break;\r\n            case PE_BaseRelocKind_ABSOLUTE:{}break;\r\n            case PE_BaseRelocKind_HIGH:\r\n            {\r\n              // rjf: relocate high 16-bits.\r\n              U64 high_bits = (apply_to & max_U16) << 16;\r\n              result_addr = (high_bits + ((base_diff & max_U32) >> 16)) & max_U16;\r\n            }break;\r\n            case PE_BaseRelocKind_LOW:\r\n            {\r\n              // rjf: relocate low 16-bits.\r\n              U64 low_bits = apply_to & max_U16;\r\n              result_addr = (low_bits + (base_diff & max_U32)) & max_U16;\r\n            }break;\r\n            case PE_BaseRelocKind_HIGHLOW:\r\n            {\r\n              // rjf: relocate 32-bits.\r\n              result_addr = (apply_to & max_U32) + (base_diff & max_U32);\r\n            }break;\r\n            case PE_BaseRelocKind_HIGHADJ:\r\n            {\r\n              if(ientry + 1 >= block->entry_count)\r\n              {\r\n                // NOTE(rjf): malformed relocation, expected two 16-bit entries\r\n                break;\r\n              }\r\n              \r\n              // rjf: relocate high bits and adjust sign bit on lower half.\r\n              U16 adj_offset = PE_BaseRelocOffsetFromEntry(block->entries[ientry + 1]);\r\n              result_addr  = (apply_to & max_U16) << 16;\r\n              result_addr += adj_offset;\r\n              result_addr += (base_diff & max_U32);\r\n              result_addr += 0x8000;\r\n              result_addr  = (result_addr >> 16) & max_U16;\r\n            }break;\r\n            case PE_BaseRelocKind_DIR64:\r\n            {\r\n              // rjf: image base relocation.\r\n              result_addr = apply_to + base_diff;\r\n            }break;\r\n          }\r\n          \r\n          goto dbl_break;\r\n        }\r\n        \r\n        U32 advance = (kind == PE_BaseRelocKind_HIGHADJ) ? 2 : 1;\r\n        ientry += advance;\r\n      }\r\n    }\r\n    dbl_break:;\r\n    scratch_end(scratch);\r\n  }\r\n  Rng1U64 result = r1u64(result_addr, result_addr+result_size);\r\n  return result;\r\n}\r\n\r\ninternal String8Array\r\npe_get_entry_point_names(COFF_MachineType            machine,\r\n                         PE_WindowsSubsystem         subsystem,\r\n                         PE_ImageFileCharacteristics file_characteristics)\r\n{\r\n  String8Array entry_point_names = {0};\r\n  \r\n  if (file_characteristics & PE_ImageFileCharacteristic_FILE_DLL) {\r\n    if (machine == COFF_MachineType_X86) {\r\n      read_only static String8 dll_entry_point_arr[] = {\r\n        str8_lit_comp(\"__DllMainCRTStartup@12\"),\r\n      };\r\n      \r\n      entry_point_names.v = &dll_entry_point_arr[0];\r\n      entry_point_names.count = ArrayCount(dll_entry_point_arr);\r\n    } else {\r\n      read_only static String8 dll_entry_point_arr[] = {\r\n        str8_lit_comp(\"_DllMainCRTStartup\"),\r\n      };\r\n      \r\n      entry_point_names.v = &dll_entry_point_arr[0];\r\n      entry_point_names.count = ArrayCount(dll_entry_point_arr);\r\n    }\r\n  } else {\r\n    switch (subsystem) {\r\n      case PE_WindowsSubsystem_UNKNOWN: break;\r\n      case PE_WindowsSubsystem_WINDOWS_GUI: {\r\n        read_only static String8 gui_entry_point_arr[] = {\r\n          str8_lit_comp(\"WinMain\"),\r\n          str8_lit_comp(\"wWinMain\"),\r\n          str8_lit_comp(\"WinMainCRTStartup\"),\r\n          str8_lit_comp(\"wWinMainCRTStartup\"),\r\n        };\r\n        \r\n        entry_point_names.v = &gui_entry_point_arr[0];\r\n        entry_point_names.count = ArrayCount(gui_entry_point_arr);\r\n      } break;\r\n      case PE_WindowsSubsystem_WINDOWS_CUI: {\r\n        read_only static String8 cui_entry_point_arr[] = {\r\n          str8_lit_comp(\"main\"),\r\n          str8_lit_comp(\"wmain\"),\r\n          str8_lit_comp(\"mainCRTStartup\"),\r\n          str8_lit_comp(\"wmainCRTStartup\"),\r\n        };\r\n        \r\n        entry_point_names.v = &cui_entry_point_arr[0];\r\n        entry_point_names.count = ArrayCount(cui_entry_point_arr);\r\n      } break;\r\n      case PE_WindowsSubsystem_NATIVE:\r\n      case PE_WindowsSubsystem_OS2_CUI:\r\n      case PE_WindowsSubsystem_POSIX_CUI:\r\n      case PE_WindowsSubsystem_NATIVE_WINDOWS:\r\n      case PE_WindowsSubsystem_WINDOWS_CE_GUI:\r\n      case PE_WindowsSubsystem_EFI_APPLICATION:\r\n      case PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER:\r\n      case PE_WindowsSubsystem_EFI_RUNTIME_DRIVER:\r\n      case PE_WindowsSubsystem_EFI_ROM:\r\n      case PE_WindowsSubsystem_XBOX:\r\n      case PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION: {\r\n        // TODO\r\n      } break;\r\n    }\r\n  }\r\n  \r\n  return entry_point_names;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal PE_ParsedImport *\r\npe_parsed_imports_from_data(Arena              *arena,\r\n                            B32                 is_pe32,\r\n                            U64                 section_count,\r\n                            COFF_SectionHeader *sections,\r\n                            String8             raw_data,\r\n                            U64                 name_table_voff,\r\n                            U64                *import_count_out)\r\n{\r\n  PE_ParsedImport *imports      = 0;\r\n  U64              import_count = 0;\r\n  \r\n  U64 name_table_foff = coff_foff_from_voff(sections, section_count, name_table_voff);\r\n  String8 entries = str8_substr(raw_data, rng_1u64(name_table_foff, raw_data.size));\r\n  if (is_pe32) {\r\n    import_count = index_of_zero_u32((U32 *)entries.str, entries.size/sizeof(U32));\r\n    if (import_count == max_U64) { import_count = 0; }\r\n    imports = push_array(arena, PE_ParsedImport, import_count);\r\n    \r\n    for (U64 imp_idx = 0; imp_idx < import_count; imp_idx += 1) {\r\n      U32 raw_entry = 0;\r\n      str8_deserial_read_struct(entries, imp_idx*sizeof(raw_entry), &raw_entry);\r\n      \r\n      B32 is_ordinal = ExtractBit(raw_entry, 31);\r\n      if (is_ordinal) {\r\n        // fill out ordinal import\r\n        PE_ParsedImport *imp = imports+imp_idx;\r\n        imp->type      = PE_ParsedImport_Ordinal;\r\n        imp->u.ordinal = Extract16(raw_entry, 0);\r\n      } else {\r\n        // map voff -> foff\r\n        U64 off = coff_foff_from_voff(sections, section_count, raw_entry);\r\n        \r\n        // read hint & name\r\n        U16     hint = 0;\r\n        String8 name = str8_zero();\r\n        str8_deserial_read_struct(raw_data, off, &hint);\r\n        str8_deserial_read_cstr(raw_data, off+sizeof(hint), &name);\r\n        \r\n        // fill out named import\r\n        PE_ParsedImport *imp = imports+imp_idx;\r\n        imp->type          = PE_ParsedImport_Name;\r\n        imp->u.name.hint   = hint;\r\n        imp->u.name.string = name;\r\n      }\r\n    }\r\n  } else {\r\n    import_count = index_of_zero_u64((U64 *)entries.str, entries.size/sizeof(U64));\r\n    if (import_count == max_U64) { import_count = 0; }\r\n    imports = push_array(arena, PE_ParsedImport, import_count);\r\n    \r\n    for (U64 imp_idx = 0; imp_idx < import_count; imp_idx += 1) {\r\n      U64 raw_entry = 0;\r\n      str8_deserial_read_struct(entries, imp_idx*sizeof(raw_entry), &raw_entry);\r\n      \r\n      B32 is_ordinal = ExtractBit(raw_entry, 63);\r\n      if (is_ordinal) {\r\n        // fill out ordinal import\r\n        PE_ParsedImport *imp = imports+imp_idx;\r\n        imp->type      = PE_ParsedImport_Ordinal;\r\n        imp->u.ordinal = Extract16(raw_entry, 0);\r\n      } else {\r\n        // map voff -> foff\r\n        U64 off = coff_foff_from_voff(sections, section_count, raw_entry);\r\n        \r\n        // read hint & name\r\n        U16     hint = 0;\r\n        String8 name = str8_zero();\r\n        str8_deserial_read_struct(raw_data, off, &hint);\r\n        str8_deserial_read_cstr(raw_data, off + sizeof(hint), &name);\r\n        \r\n        // fill out named import\r\n        PE_ParsedImport *imp = imports+imp_idx;\r\n        imp->type          = PE_ParsedImport_Name;\r\n        imp->u.name.hint   = hint;\r\n        imp->u.name.string = name;\r\n      }\r\n    }\r\n  }\r\n  \r\n  *import_count_out = import_count;\r\n  return imports;\r\n}\r\n\r\ninternal U64 *\r\npe_array_from_null_term_addr(Arena *arena, B32 is_pe32, String8 raw_data, Rng1U64 range, U64 *count_out)\r\n{\r\n  U64 *result = 0;\r\n  *count_out = 0;\r\n  \r\n  if (is_pe32) {\r\n    U32 *src = (U32 *)(raw_data.str + range.min);\r\n    U32 *opl = (U32 *)(raw_data.str + AlignDownPow2(range.max, sizeof(*opl)));\r\n    \r\n    // count items\r\n    U32 *ptr;\r\n    for (ptr = src; ptr < opl && *ptr != 0; ++ptr);\r\n    \r\n    // push output array\r\n    *count_out = (U64)(ptr - src);\r\n    result     = push_array(arena, U64, *count_out);\r\n    \r\n    // convert & copy\r\n    for (U64 i = 0; i < *count_out; ++i) {\r\n      result[i] = (U64)src[i];\r\n    }\r\n  } else {\r\n    U64 *src = (U64 *)(raw_data.str + range.min);\r\n    U64 *opl = (U64 *)(raw_data.str + AlignDownPow2(range.max, sizeof(*opl)));\r\n    \r\n    // count items\r\n    U64 *ptr;\r\n    for (ptr = src; ptr < opl && *ptr != 0; ++ptr);\r\n    \r\n    // push output array\r\n    *count_out = (U64)(ptr - src);\r\n    result     = push_array(arena, U64, *count_out);\r\n    \r\n    // copy\r\n    MemoryCopyTyped(result, src, *count_out);\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal PE_ParsedStaticImportTable\r\npe_static_imports_from_data(Arena              *arena,\r\n                            B32                 is_pe32,\r\n                            U64                 section_count,\r\n                            COFF_SectionHeader *sections,\r\n                            String8             raw_data,\r\n                            Rng1U64             dir_file_range)\r\n{\r\n  // count imports\r\n  U64 max_dll_count = dim_1u64(dir_file_range) / sizeof (PE_ImportEntry);\r\n  U64 dll_count     = max_dll_count;\r\n  for (U64 i = 0; i < max_dll_count; ++i) {\r\n    PE_ImportEntry *imp = str8_deserial_get_raw_ptr(raw_data, dir_file_range.min+(i*sizeof(*imp)), sizeof(*imp));\r\n    if (memory_is_zero(imp, sizeof(*imp))) {\r\n      dll_count = i;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  PE_ParsedStaticDLLImport *dlls = push_array(arena, PE_ParsedStaticDLLImport, dll_count);\r\n  \r\n  for (U64 dll_idx = 0; dll_idx < dll_count; ++dll_idx) {\r\n    PE_ImportEntry *raw_dll = str8_deserial_get_raw_ptr(raw_data, dir_file_range.min+(dll_idx*sizeof(*raw_dll)), sizeof(*raw_dll));\r\n    \r\n    // get name\r\n    U64     name_off = coff_foff_from_voff(sections, section_count, raw_dll->name_voff);\r\n    String8 name     = str8_zero();\r\n    str8_deserial_read_cstr(raw_data, name_off, &name);\r\n    \r\n    U64              import_count = 0;\r\n    PE_ParsedImport *imports      = pe_parsed_imports_from_data(arena,\r\n                                                                is_pe32,\r\n                                                                section_count,\r\n                                                                sections,\r\n                                                                raw_data,\r\n                                                                raw_dll->lookup_table_voff,\r\n                                                                &import_count);\r\n    \r\n    PE_ParsedStaticDLLImport *dll  = dlls+dll_idx;\r\n    dll->name                      = name;\r\n    dll->import_address_table_voff = raw_dll->import_addr_table_voff;\r\n    dll->import_name_table_voff    = raw_dll->lookup_table_voff;\r\n    dll->time_stamp                = raw_dll->time_stamp;\r\n    dll->forwarder_chain           = raw_dll->forwarder_chain;\r\n    dll->import_count              = import_count;\r\n    dll->imports                   = imports;\r\n  }\r\n  \r\n  PE_ParsedStaticImportTable imptab = {0};\r\n  imptab.count                      = dll_count;\r\n  imptab.v                          = dlls;\r\n  \r\n  return imptab;\r\n}\r\n\r\ninternal PE_ParsedDelayImportTable\r\npe_delay_imports_from_data(Arena              *arena,\r\n                           B32                 is_pe32,\r\n                           U64                 section_count,\r\n                           COFF_SectionHeader *sections,\r\n                           String8             raw_data,\r\n                           Rng1U64             dir_file_range)\r\n{\r\n  // count imports\r\n  U64 max_dll_count = dim_1u64(dir_file_range) / sizeof(PE_DelayedImportEntry);\r\n  U64 dll_count     = 0;\r\n  for (; dll_count < max_dll_count; ++dll_count) {\r\n    PE_DelayedImportEntry *raw_dll = str8_deserial_get_raw_ptr(raw_data, dir_file_range.min+(dll_count*sizeof(*raw_dll)), sizeof(*raw_dll));\r\n    if (memory_is_zero(raw_dll, sizeof(*raw_dll))) {\r\n      break;\r\n    }\r\n  }\r\n  \r\n  // parse dll imports\r\n  PE_ParsedDelayDLLImport *dlls = push_array(arena, PE_ParsedDelayDLLImport, dll_count);\r\n  for (U64 dll_idx = 0; dll_idx < dll_count; ++dll_idx) {\r\n    PE_DelayedImportEntry *raw_dll = str8_deserial_get_raw_ptr(raw_data, dir_file_range.min+(dll_idx*sizeof(*raw_dll)), sizeof(*raw_dll));\r\n    \r\n    U64     name_off = coff_foff_from_voff(sections, section_count, raw_dll->name_voff);\r\n    String8 name     = str8_zero();\r\n    str8_deserial_read_cstr(raw_data, name_off, &name);\r\n    \r\n    // parse import table\r\n    U64              import_count = 0;\r\n    PE_ParsedImport *imports      = pe_parsed_imports_from_data(arena,\r\n                                                                is_pe32,\r\n                                                                section_count,\r\n                                                                sections,\r\n                                                                raw_data,\r\n                                                                raw_dll->name_table_voff,\r\n                                                                &import_count);\r\n    \r\n    \r\n    // parse bound table\r\n    Rng1U64 bound_table_range = {0};\r\n    if (raw_dll->bound_table_voff) {\r\n      U64 bound_table_foff = coff_foff_from_voff(sections, section_count, raw_dll->bound_table_voff);\r\n      bound_table_range = rng_1u64(bound_table_foff, raw_data.size);\r\n    }\r\n    U64  bound_table_count;\r\n    U64 *bound_table = pe_array_from_null_term_addr(arena, is_pe32, raw_data, bound_table_range, &bound_table_count);\r\n    \r\n    // parse unload table\r\n    Rng1U64 unload_table_range = {0};\r\n    if (raw_dll->unload_table_voff) {\r\n      U64 unload_table_foff  = coff_foff_from_voff(sections, section_count, raw_dll->unload_table_voff);\r\n      unload_table_range = rng_1u64(unload_table_foff, raw_data.size);\r\n    }\r\n    U64 unload_table_count;\r\n    U64 *unload_table = pe_array_from_null_term_addr(arena, is_pe32, raw_data, unload_table_range, &unload_table_count);\r\n    \r\n    // fill out DLL\r\n    PE_ParsedDelayDLLImport *dll = dlls+dll_idx;\r\n    dll->attributes              = raw_dll->attributes;\r\n    dll->name                    = name;\r\n    dll->module_handle_voff      = raw_dll->module_handle_voff;\r\n    dll->iat_voff                = raw_dll->iat_voff;\r\n    dll->name_table_voff         = raw_dll->name_table_voff;\r\n    dll->bound_table_voff        = raw_dll->bound_table_voff;\r\n    dll->unload_table_voff       = raw_dll->unload_table_voff;\r\n    dll->time_stamp              = raw_dll->time_stamp;\r\n    dll->bound_table_count       = bound_table_count;\r\n    dll->bound_table             = bound_table;\r\n    dll->unload_table_count      = unload_table_count;\r\n    dll->unload_table            = unload_table;\r\n    dll->import_count            = import_count;\r\n    dll->imports                 = imports;\r\n  }\r\n  \r\n  // fill out result\r\n  PE_ParsedDelayImportTable imptab = {0};\r\n  imptab.count                     = dll_count;\r\n  imptab.v                         = dlls;\r\n  \r\n  return imptab;\r\n}\r\n\r\ninternal PE_ParsedExportTable\r\npe_exports_from_data(Arena *arena, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 dir_file_range, Rng1U64 dir_virt_range)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  PE_ParsedExportTable exptab = {0};\r\n  \r\n  String8               raw_dir = str8_substr(raw_data, dir_file_range);\r\n  PE_ExportTableHeader *header  = str8_deserial_get_raw_ptr(raw_dir, 0, sizeof(*header));\r\n  if (header) {\r\n    U64 name_table_off    = coff_foff_from_voff(sections, section_count, header->name_pointer_table_voff);\r\n    U64 export_table_off  = coff_foff_from_voff(sections, section_count, header->export_address_table_voff);\r\n    U64 ordinal_table_off = coff_foff_from_voff(sections, section_count, header->ordinal_table_voff);\r\n    \r\n    U32 *name_table    = str8_deserial_get_raw_ptr(raw_data, name_table_off,    sizeof(*name_table   )*header->name_pointer_table_count);\r\n    U32 *export_table  = str8_deserial_get_raw_ptr(raw_data, export_table_off,  sizeof(*export_table )*header->export_address_table_count);\r\n    U16 *ordinal_table = str8_deserial_get_raw_ptr(raw_data, ordinal_table_off, sizeof(*ordinal_table)*header->name_pointer_table_count);\r\n    \r\n    if (name_table && export_table && ordinal_table) {\r\n      // Scan export address table to get accruate count of ordinals. \r\n      // We can't rely on \"name_pointer_table_count\" becuase it is possible\r\n      // to define an export without a name through NONAME attribute in DEF file\r\n      U64 ordinal_count = 0;\r\n      for (U64 voff_idx = 0; voff_idx < header->export_address_table_count; ++voff_idx) {\r\n        if (export_table[voff_idx] != 0) {\r\n          ++ordinal_count;\r\n        }\r\n      }\r\n      \r\n      U64  ordinal_max     = header->export_address_table_count;\r\n      B32 *is_ordinal_used = push_array(scratch.arena, B32, ordinal_max);\r\n      \r\n      PE_ParsedExport *exports  = push_array(arena, PE_ParsedExport, ordinal_count);\r\n      PE_ParsedExport *curr_exp = exports;\r\n      \r\n      // parse exports with name\r\n      for (U64 i = 0; i < header->name_pointer_table_count; ++i) {\r\n        // get name\r\n        U32     name_voff = name_table[i];\r\n        U64     name_foff = coff_foff_from_voff(sections, section_count, name_voff);\r\n        String8 name      = str8_cstring_capped(raw_data.str+name_foff, raw_data.str+raw_data.size);\r\n        \r\n        // get ordinal\r\n        U16 ordinal_nb = ordinal_table[i];\r\n        \r\n        // mark ordinal\r\n        Assert(ordinal_nb < ordinal_max);\r\n        is_ordinal_used[ordinal_nb] = 1;\r\n        \r\n        // get voff\r\n        U32 export_voff = 0;\r\n        if (ordinal_nb < header->export_address_table_count) {\r\n          export_voff = export_table[ordinal_nb];\r\n        }\r\n        \r\n        // make ordinal\r\n        U16 ordinal = header->ordinal_base + ordinal_nb;\r\n        \r\n        String8 forwarder = str8_zero();\r\n        {\r\n          B32 is_forwarder = dir_virt_range.min <= export_voff && export_voff < dir_virt_range.max;\r\n          if (is_forwarder) {\r\n            U64 fwd_name_off = coff_foff_from_voff(sections, section_count, export_voff);\r\n            str8_deserial_read_cstr(raw_data, fwd_name_off, &forwarder);\r\n          }\r\n        }\r\n        \r\n        curr_exp->forwarder = forwarder;\r\n        curr_exp->name      = name;\r\n        curr_exp->voff      = export_voff;\r\n        curr_exp->ordinal   = ordinal;\r\n        ++curr_exp;\r\n      }\r\n      \r\n      // parse exports with ordinal\r\n      for (U64 ordinal_nb = 0; ordinal_nb < header->export_address_table_count; ++ordinal_nb) {\r\n        U32 voff            = export_table[ordinal_nb];\r\n        B32 is_voff_taken   = (voff != 0);\r\n        B32 is_ordinal_free = !is_ordinal_used[ordinal_nb];\r\n        if (is_voff_taken && is_ordinal_free) {\r\n          curr_exp->name      = str8_zero();\r\n          curr_exp->voff      = voff;\r\n          curr_exp->ordinal   = header->ordinal_base;\r\n          ++curr_exp;\r\n        }\r\n      }\r\n      \r\n      // fill out result\r\n      exptab.flags          = header->flags;\r\n      exptab.time_stamp     = header->time_stamp;\r\n      exptab.major_ver      = header->major_ver;\r\n      exptab.minor_ver      = header->minor_ver;\r\n      exptab.ordinal_base   = header->ordinal_base;\r\n      exptab.export_count   = ordinal_count;\r\n      exptab.exports        = exports;\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return exptab;\r\n}\r\n\r\n\r\ninternal PE_ParsedTLS\r\npe_tls_from_data(Arena              *arena,\r\n                 COFF_MachineType    machine,\r\n                 U64                 image_base,\r\n                 U64                 section_count,\r\n                 COFF_SectionHeader *sections,\r\n                 String8             raw_data,\r\n                 Rng1U64             tls_frange)\r\n{\r\n  String8 raw_tls = str8_substr(raw_data, tls_frange);\r\n  \r\n  PE_TLSHeader64  header64       = {0};\r\n  U64             callback_count = 0;\r\n  U64            *callback_addrs = 0;\r\n  \r\n  switch (machine) {\r\n    case COFF_MachineType_Unknown: break;\r\n    case COFF_MachineType_X86: {\r\n      PE_TLSHeader32 header32 = {0};\r\n      str8_deserial_read_struct(raw_tls, 0, &header32);\r\n      \r\n      header64.raw_data_start    = header32.raw_data_start;\r\n      header64.raw_data_end      = header32.raw_data_end;\r\n      header64.index_address     = header32.index_address;\r\n      header64.callbacks_address = header32.callbacks_address;\r\n      header64.zero_fill_size    = header32.zero_fill_size;\r\n      header64.characteristics   = header32.characteristics;\r\n      \r\n      U64 callbacks_voff = header32.callbacks_address - image_base;\r\n      U64 callbacks_foff = coff_foff_from_voff(sections, section_count, callbacks_voff);\r\n      \r\n      U32 *src = (U32 *)(raw_data.str + callbacks_foff);\r\n      U32 *opl = (U32 *)(raw_data.str + raw_data.size);\r\n      U32 *ptr = src;\r\n      for (; ptr < opl && *ptr != 0; ++ptr);\r\n      \r\n      callback_count = (U64)(ptr-src);\r\n      callback_addrs = push_array(arena, U64, callback_count);\r\n      for (U64 i = 0; i < callback_count; ++i) {\r\n        callback_addrs[i] = (U64)src[i];\r\n      }\r\n    } break;\r\n    case COFF_MachineType_X64: {\r\n      str8_deserial_read_struct(raw_tls, 0, &header64);\r\n      \r\n      U64 callbacks_voff = header64.callbacks_address - image_base;\r\n      U64 callbacks_foff = coff_foff_from_voff(sections, section_count, callbacks_voff);\r\n      \r\n      U64 *src = (U64 *)(raw_data.str + callbacks_foff);\r\n      U64 *opl = (U64 *)(raw_data.str + raw_data.size);\r\n      U64 *ptr = src;\r\n      for (; ptr < opl && *ptr != 0; ++ptr);\r\n      \r\n      callback_count = (U64)(ptr-src);\r\n      callback_addrs = push_array(arena, U64, callback_count);\r\n      MemoryCopyTyped(callback_addrs, src, callback_count);\r\n    } break;\r\n    default: NotImplemented;\r\n  }\r\n  \r\n  PE_ParsedTLS result   = {0};\r\n  result.header         = header64;\r\n  result.callback_count = callback_count;\r\n  result.callback_addrs = callback_addrs;\r\n  \r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal B32\r\npe_is_res(String8 data)\r\n{\r\n  U8 magic[sizeof(PE_RES_MAGIC)]; MemoryZeroStruct(&magic);\r\n  str8_deserial_read_struct(data, 0, &magic);\r\n  B32 is_res = MemoryCompare(&PE_RES_MAGIC, &magic, sizeof(magic)) == 0;\r\n  return is_res;\r\n}\r\n\r\ninternal PE_ResourceNode *\r\npe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version)\r\n{\r\n  PE_ResourceList *list = 0;\r\n  switch (id.type) {\r\n    default:\r\n    case COFF_ResourceIDType_Null: break;\r\n    case COFF_ResourceIDType_String: list = &dir->named_list; break;\r\n    case COFF_ResourceIDType_Number: list = &dir->id_list;    break;\r\n  }\r\n  \r\n  PE_ResourceNode *res_node = push_array(arena, PE_ResourceNode, 1);\r\n  SLLQueuePush(list->first, list->last, res_node);\r\n  list->count += 1;\r\n  \r\n  PE_ResourceDir *sub_dir = push_array(arena, PE_ResourceDir, 1);\r\n  sub_dir->characteristics = characteristics;\r\n  sub_dir->time_stamp      = time_stamp;\r\n  sub_dir->major_version   = major_version;\r\n  sub_dir->minor_version   = minor_version;\r\n  \r\n  PE_Resource *res = &res_node->data;\r\n  res->id    = id;\r\n  res->kind  = PE_ResDataKind_DIR;\r\n  res->u.dir = sub_dir;\r\n  \r\n  return res_node;\r\n}\r\n\r\ninternal PE_ResourceNode *\r\npe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data)\r\n{\r\n  PE_ResourceList *list = NULL;\r\n  switch (id.type) {\r\n    default:\r\n    case COFF_ResourceIDType_Null: break;\r\n    case COFF_ResourceIDType_String: list = &dir->named_list; break;\r\n    case COFF_ResourceIDType_Number: list = &dir->id_list;    break;\r\n  }\r\n  \r\n  PE_ResourceNode *res_node = push_array(arena, PE_ResourceNode, 1);\r\n  SLLQueuePush(list->first, list->last, res_node);\r\n  list->count += 1;\r\n  \r\n  PE_Resource *res = &res_node->data;\r\n  res->id   = id;\r\n  res->kind = PE_ResDataKind_COFF_RESOURCE;\r\n  res->u.coff_res.type         = type;\r\n  res->u.coff_res.data_version = data_version;\r\n  res->u.coff_res.version      = version;\r\n  res->u.coff_res.memory_flags = memory_flags;\r\n  res->u.coff_res.data         = data;\r\n  \r\n  return res_node;\r\n}\r\n\r\ninternal PE_Resource *\r\npe_resource_dir_push_entry(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data)\r\n{\r\n  PE_ResourceNode *node = pe_resource_dir_push_entry_node(arena, dir, id, type, data_version, version, memory_flags, data);\r\n  return &node->data;\r\n}\r\n\r\ninternal PE_Resource *\r\npe_resource_dir_push_dir(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version)\r\n{\r\n  PE_ResourceNode *dir_node = pe_resource_dir_push_dir_node(arena, dir, id, characteristics, time_stamp, major_version, minor_version); \r\n  return &dir_node->data;\r\n}\r\n\r\ninternal PE_ResourceNode *\r\npe_resource_dir_search_node(PE_ResourceDir *dir, COFF_ResourceID id)\r\n{\r\n  for (PE_ResourceNode *i = dir->id_list.first; i != 0; i = i->next) {\r\n    if (coff_resource_id_compar(&i->data.id, &id) == 0) {\r\n      return i;\r\n    }\r\n  }\r\n  return NULL;\r\n}\r\n\r\ninternal PE_Resource *\r\npe_resource_dir_search(PE_ResourceDir *dir, COFF_ResourceID id)\r\n{\r\n  PE_ResourceNode *node = pe_resource_dir_search_node(dir, id);\r\n  return node ? &node->data : NULL;\r\n}\r\n\r\ninternal PE_ResourceArray\r\npe_resource_list_to_array(Arena *arena, PE_ResourceList *list)\r\n{\r\n  PE_ResourceArray result;\r\n  result.count = 0;\r\n  result.v = push_array(arena, PE_Resource, list->count);\r\n  for (PE_ResourceNode *n = list->first; n != NULL; n = n->next) {\r\n    result.v[result.count++] = n->data;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\npe_resource_dir_push_res_file(Arena *arena, PE_ResourceDir *root_dir, String8 res_file)\r\n{\r\n  // parse file into resource list\r\n  String8 res_data = str8_substr(res_file, rng_1u64(sizeof(PE_RES_MAGIC), res_file.size));\r\n  COFF_ParsedResourceList list = coff_resource_list_from_data(arena, res_data);\r\n  \r\n  // move resources to directories based on type\r\n  for (COFF_ParsedResourceNode *res_node = list.first; res_node != NULL; res_node = res_node->next) {\r\n    COFF_ParsedResource *res = &res_node->data;\r\n    \r\n    // search existing directories\r\n    PE_Resource *dir_res = pe_resource_dir_search(root_dir, res->type);\r\n    \r\n    // create new directory\r\n    if (dir_res == NULL) {\r\n      dir_res = pe_resource_dir_push_dir(arena, root_dir, res->type, 0, 0, 0, 0);\r\n    }\r\n    PE_ResourceDir *dir = dir_res->u.dir;\r\n    \r\n    // check for name collisions\r\n    PE_Resource *check_res = pe_resource_dir_search(dir, res->name);\r\n    if (check_res != NULL) {\r\n      // TODO: how do we handle name conflicts?\r\n      Assert(!\"name collision\");\r\n      continue;\r\n    }\r\n    \r\n    // push entry\r\n    PE_Resource *sub_dir_res = pe_resource_dir_push_dir(arena, dir, res->name, 0, 0, 0, 0);\r\n    COFF_ResourceID id;\r\n    id.type = COFF_ResourceIDType_Number;\r\n    id.u.number = res->language_id;\r\n    pe_resource_dir_push_entry(arena, sub_dir_res->u.dir, id, res->type, res->data_version, res->version, res->memory_flags, res->data);\r\n  }\r\n}\r\n\r\ninternal PE_ResourceDir *\r\npe_resource_table_from_directory_data(Arena *arena, String8 data)\r\n{\r\n  struct stack_s {\r\n    struct stack_s *next;\r\n    U64 table_offset;\r\n    U64 name_base_offset;\r\n    U64 id_base_offset;\r\n    PE_ResourceDir *table;\r\n    PE_ResourceDir **directory_ptr;\r\n    U64 name_ientry;\r\n    U64 id_ientry;\r\n    U64 name_entry_count;\r\n    U64 id_entry_count;\r\n  };\r\n  \r\n  Temp scratch = scratch_begin(&arena,1);\r\n  struct stack_s *bottom_frame = push_array(scratch.arena, struct stack_s, 1);\r\n  struct stack_s *stack = bottom_frame;\r\n  \r\n  while (stack) {\r\n    if (stack->table == NULL) {\r\n      COFF_ResourceDirTable coff_table = {0};\r\n      str8_deserial_read_struct(data, stack->table_offset, &coff_table);\r\n      \r\n      PE_ResourceDir *table = push_array(arena, PE_ResourceDir, 1);\r\n      table->characteristics = coff_table.characteristics;\r\n      table->time_stamp = coff_table.time_stamp;\r\n      table->major_version = coff_table.major_version;\r\n      table->minor_version = coff_table.minor_version;\r\n      \r\n      stack->table = table;\r\n      stack->name_base_offset = stack->table_offset + sizeof(COFF_ResourceDirTable);\r\n      stack->id_base_offset = stack->table_offset + sizeof(COFF_ResourceDirTable) + sizeof(COFF_ResourceDirEntry) * coff_table.name_entry_count;\r\n      stack->name_entry_count = coff_table.name_entry_count;\r\n      stack->id_entry_count = coff_table.id_entry_count;\r\n      \r\n      if (stack->directory_ptr) {\r\n        *stack->directory_ptr = table;\r\n      }\r\n    }\r\n    \r\n    while (stack->name_ientry < stack->name_entry_count) {\r\n      U64 entry_offset = stack->name_base_offset + stack->name_ientry * sizeof(COFF_ResourceDirEntry);\r\n      ++stack->name_ientry;\r\n      \r\n      PE_ResourceNode *named_node = push_array(arena, PE_ResourceNode, 1);\r\n      SLLQueuePush(stack->table->named_list.first, stack->table->named_list.last, named_node);\r\n      ++stack->table->named_list.count;\r\n      PE_Resource *entry = &named_node->data;\r\n      \r\n      COFF_ResourceDirEntry coff_entry = {0};\r\n      str8_deserial_read_struct(data, entry_offset, &coff_entry);\r\n      \r\n      // NOTE: this is not documented on MSDN but high bit here is set for some reason\r\n      U32 name_offset = coff_entry.name.offset & ~COFF_Resource_SubDirFlag;\r\n      U16 name_size = 0;\r\n      str8_deserial_read_struct(data, name_offset, &name_size);\r\n      \r\n      String8 name_block;\r\n      str8_deserial_read_block(data,  name_offset + sizeof(name_size), name_size*sizeof(U16), &name_block);\r\n      String16 name16 = str16((U16*)name_block.str, name_size);\r\n      \r\n      B32 is_dir = !!(coff_entry.id.data_entry_offset & COFF_Resource_SubDirFlag);\r\n      \r\n      entry->id.type = COFF_ResourceIDType_String;\r\n      entry->id.u.string = str8_from_16(arena, name16);\r\n      entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF;\r\n      \r\n      if (is_dir) {\r\n        struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1);\r\n        frame->table_offset = coff_entry.id.sub_dir_offset & ~COFF_Resource_SubDirFlag;\r\n        frame->directory_ptr = &entry->u.dir;\r\n        SLLStackPush(stack, frame);\r\n        goto yeild;\r\n      } else {\r\n        str8_deserial_read_struct(data, coff_entry.id.data_entry_offset, &entry->u.leaf);\r\n      }\r\n    }\r\n    \r\n    while (stack->id_ientry < stack->id_entry_count) {\r\n      U64 entry_offset = stack->id_base_offset + stack->id_ientry * sizeof(COFF_ResourceDirEntry);\r\n      ++stack->id_ientry;\r\n      \r\n      PE_ResourceNode *id_node = push_array(arena, PE_ResourceNode, 1);\r\n      SLLQueuePush(stack->table->id_list.first, stack->table->id_list.last, id_node);\r\n      ++stack->table->id_list.count;\r\n      PE_Resource *entry = &id_node->data;\r\n      \r\n      COFF_ResourceDirEntry coff_entry = {0};\r\n      str8_deserial_read_struct(data, entry_offset, &coff_entry);\r\n      \r\n      B32 is_dir = !!(coff_entry.id.sub_dir_offset & COFF_Resource_SubDirFlag);\r\n      \r\n      entry->id.type = COFF_ResourceIDType_Number;\r\n      entry->id.u.number = coff_entry.name.id;\r\n      entry->kind = is_dir ? PE_ResDataKind_DIR : PE_ResDataKind_COFF_LEAF;\r\n      \r\n      if (is_dir) {\r\n        struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1);\r\n        frame->table_offset = coff_entry.id.sub_dir_offset & ~COFF_Resource_SubDirFlag;\r\n        frame->directory_ptr = &entry->u.dir;\r\n        SLLStackPush(stack, frame);\r\n        goto yeild;\r\n      } else {\r\n        str8_deserial_read_struct(data, coff_entry.id.sub_dir_offset, &entry->u.leaf);\r\n      }\r\n    }\r\n    \r\n    SLLStackPop(stack);\r\n    \r\n    yeild:;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return bottom_frame->table;\r\n}\r\n\r\ninternal String8\r\npe_make_manifest_resource(Arena *arena, U32 resource_id, String8 manifest_data)\r\n{\r\n  COFF_ResourceID type = {0};\r\n  type.type            = COFF_ResourceIDType_Number;\r\n  type.u.number        = PE_ResourceKind_MANIFEST;\r\n  \r\n  COFF_ResourceID id = {0};\r\n  id.type            = COFF_ResourceIDType_Number;\r\n  id.u.number        = resource_id;\r\n  \r\n  String8 res = coff_write_resource(arena, type, id, 1, 0, 1033, 0, 0, manifest_data);\r\n  return res;\r\n}\r\n\r\n////////////////////////////////\r\n//~ Debug Directory\r\n\r\ninternal String8\r\npe_make_debug_header_pdb70(Arena *arena, Guid guid, U32 age, String8 pdb_path)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  PE_CvHeaderPDB70 header = {0};\r\n  header.magic \t\t\t  = PE_CODEVIEW_PDB70_MAGIC;\r\n  header.guid  \t\t\t  = guid;\r\n  header.age   \t\t\t  = age;\r\n  \r\n  String8List cv_list = {0};\r\n  str8_serial_begin(scratch.arena, &cv_list);\r\n  str8_serial_push_struct(scratch.arena, &cv_list, &header);\r\n  str8_serial_push_cstr(scratch.arena, &cv_list, pdb_path);\r\n  \r\n  String8 cv_data = str8_serial_end(arena, &cv_list);\r\n  \r\n  scratch_end(scratch);\r\n  return cv_data;\r\n}\r\n\r\ninternal String8\r\npe_make_debug_header_rdi(Arena *arena, Guid guid, String8 rdi_path)\r\n{\r\n  Temp scratch = scratch_begin(&arena,1);\r\n  \r\n  PE_CvHeaderRDI header = {0};\r\n  header.magic          = PE_CODEVIEW_RDI_MAGIC;\r\n  header.guid           = guid;\r\n  \r\n  String8List list = {0};\r\n  str8_serial_begin(scratch.arena, &list);\r\n  str8_serial_push_struct(scratch.arena, &list, &header);\r\n  str8_serial_push_cstr(scratch.arena, &list, rdi_path);\r\n  \r\n  String8 cv_data = str8_serial_end(arena, &list);\r\n  \r\n  scratch_end(scratch);\r\n  return cv_data;\r\n}\r\n\r\n////////////////////////////////\r\n//~ Image Checksum\r\n\r\ninternal U32 \r\npe_compute_checksum(U8 *buffer, U64 buffer_size)\r\n{\r\n  // https://bytepointer.com/resources/microsoft_pe_checksum_algo_distilled.htm\r\n  U32 hash = 0;\r\n  for (U16 *ptr16 = (U16*)buffer, *opl16 = (U16*)(buffer + buffer_size);\r\n       ptr16 < opl16;\r\n       ptr16 += 1) {\r\n    hash += *ptr16;\r\n    hash = (hash >> 16) + (hash & 0xffff);\r\n  }\r\n  hash = (U16)(((hash >> 16) + hash) & 0xffff);\r\n  hash += buffer_size;\r\n  return hash;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal B32\r\npe_has_plus_header(COFF_MachineType machine)\r\n{\r\n  B32 has_plus_header = 0;\r\n  switch (machine) {\r\n    case COFF_MachineType_X86: {\r\n      has_plus_header = 0;\r\n    } break;\r\n    case COFF_MachineType_X64: {\r\n      has_plus_header = 1;\r\n    } break;\r\n  }\r\n  return has_plus_header;\r\n}\r\n\r\n////////////////////////////////\r\n\r\ninternal int\r\npe_pdata_is_before_x86_64(void *raw_a, void *raw_b)\r\n{\r\n  PE_IntelPdata *a = raw_a, *b = raw_b;\r\n  return a->voff_first < b->voff_first;\r\n}\r\n\r\ninternal void\r\npe_pdata_sort(COFF_MachineType machine, String8 raw_pdata)\r\n{\r\n  ProfBeginFunction();\r\n  switch (machine) {\r\n    case COFF_MachineType_Unknown: break;\r\n    case COFF_MachineType_X86:\r\n    case COFF_MachineType_X64: {\r\n      U64 count = raw_pdata.size / sizeof(PE_IntelPdata);\r\n      radsort((PE_IntelPdata *)raw_pdata.str, count, pe_pdata_is_before_x86_64);\r\n    } break;\r\n    default: { NotImplemented; } break;\r\n  }\r\n  ProfEnd();\r\n}\r\n"
  },
  {
    "path": "src/pe/pe.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef PE_H\r\n#define PE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: PE Format-Defined Types/Constants\r\n\r\n#pragma pack(push,1)\r\n\r\ntypedef struct PE_DosHeader PE_DosHeader;\r\nstruct PE_DosHeader\r\n{\r\n  U16 magic;\r\n  U16 last_page_size;\r\n  U16 page_count;\r\n  U16 reloc_count;\r\n  U16 paragraph_header_size;\r\n  U16 min_paragraph;\r\n  U16 max_paragraph;\r\n  U16 init_ss;\r\n  U16 init_sp;\r\n  U16 checksum;\r\n  U16 init_ip;\r\n  U16 init_cs;\r\n  U16 reloc_table_file_off;\r\n  U16 overlay_number;\r\n  U16 reserved[4];\r\n  U16 oem_id;\r\n  U16 oem_info;\r\n  U16 reserved2[10];\r\n  U32 coff_file_offset;\r\n};\r\n\r\ntypedef U16 PE_WindowsSubsystem;\r\nenum\r\n{\r\n  PE_WindowsSubsystem_UNKNOWN                  = 0,\r\n  PE_WindowsSubsystem_NATIVE                   = 1,\r\n  PE_WindowsSubsystem_WINDOWS_GUI              = 2,\r\n  PE_WindowsSubsystem_WINDOWS_CUI              = 3,\r\n  PE_WindowsSubsystem_OS2_CUI                  = 5,\r\n  PE_WindowsSubsystem_POSIX_CUI                = 7,\r\n  PE_WindowsSubsystem_NATIVE_WINDOWS           = 8,\r\n  PE_WindowsSubsystem_WINDOWS_CE_GUI           = 9,\r\n  PE_WindowsSubsystem_EFI_APPLICATION          = 10,\r\n  PE_WindowsSubsystem_EFI_BOOT_SERVICE_DRIVER  = 11,\r\n  PE_WindowsSubsystem_EFI_RUNTIME_DRIVER       = 12,\r\n  PE_WindowsSubsystem_EFI_ROM                  = 13,\r\n  PE_WindowsSubsystem_XBOX                     = 14,\r\n  PE_WindowsSubsystem_WINDOWS_BOOT_APPLICATION = 16,\r\n  PE_WindowsSubsystem_COUNT                    = 14\r\n};\r\n\r\ntypedef U16 PE_ImageFileCharacteristics;\r\nenum\r\n{\r\n  PE_ImageFileCharacteristic_STRIPPED                     = (1 << 0),\r\n  PE_ImageFileCharacteristic_EXE                          = (1 << 1),\r\n  PE_ImageFileCharacteristic_NUMS_STRIPPED                = (1 << 2),\r\n  PE_ImageFileCharacteristic_PE_STRIPPED                  = (1 << 3),\r\n  PE_ImageFileCharacteristic_AGGRESIVE_WS_TRIM            = (1 << 4),\r\n  PE_ImageFileCharacteristic_LARGE_ADDRESS_AWARE          = (1 << 5),\r\n  PE_ImageFileCharacteristic_UNUSED1                      = (1 << 6),\r\n  PE_ImageFileCharacteristic_BYTES_RESERVED_LO            = (1 << 7),\r\n  PE_ImageFileCharacteristic_32BIT_MACHINE                = (1 << 8),\r\n  PE_ImageFileCharacteristic_DEBUG_STRIPPED               = (1 << 9),\r\n  PE_ImageFileCharacteristic_FILE_REMOVABLE_RUN_FROM_SWAP = (1 << 10),\r\n  PE_ImageFileCharacteristic_NET_RUN_FROM_SWAP            = (1 << 11),\r\n  PE_ImageFileCharacteristic_FILE_SYSTEM                  = (1 << 12),\r\n  PE_ImageFileCharacteristic_FILE_DLL                     = (1 << 13),\r\n  PE_ImageFileCharacteristic_FILE_UP_SYSTEM_ONLY          = (1 << 14),\r\n  PE_ImageFileCharacteristic_BYTES_RESERVED_HI            = (1 << 15),\r\n};\r\n\r\ntypedef U16 PE_DllCharacteristics;\r\nenum\r\n{\r\n  PE_DllCharacteristic_HIGH_ENTROPY_VA       = (1 << 5),\r\n  PE_DllCharacteristic_DYNAMIC_BASE          = (1 << 6),\r\n  PE_DllCharacteristic_FORCE_INTEGRITY       = (1 << 7),\r\n  PE_DllCharacteristic_NX_COMPAT             = (1 << 8),\r\n  PE_DllCharacteristic_NO_ISOLATION          = (1 << 9),\r\n  PE_DllCharacteristic_NO_SEH                = (1 << 10),\r\n  PE_DllCharacteristic_NO_BIND               = (1 << 11),\r\n  PE_DllCharacteristic_APPCONTAINER          = (1 << 12),\r\n  PE_DllCharacteristic_WDM_DRIVER            = (1 << 13),\r\n  PE_DllCharacteristic_GUARD_CF              = (1 << 14),\r\n  PE_DllCharacteristic_TERMINAL_SERVER_AWARE = (1 << 15),\r\n};\r\n\r\ntypedef struct PE_OptionalHeader32 PE_OptionalHeader32;\r\nstruct PE_OptionalHeader32\r\n{\r\n  U16                   magic;\r\n  U8                    major_linker_version;\r\n  U8                    minor_linker_version;\r\n  U32                   sizeof_code;\r\n  U32                   sizeof_inited_data;\r\n  U32                   sizeof_uninited_data;\r\n  U32                   entry_point_va;\r\n  U32                   code_base;\r\n  U32                   data_base;\r\n  U32                   image_base;\r\n  U32                   section_alignment;\r\n  U32                   file_alignment;\r\n  U16                   major_os_ver;\r\n  U16                   minor_os_ver;\r\n  U16                   major_img_ver;\r\n  U16                   minor_img_ver;\r\n  U16                   major_subsystem_ver;\r\n  U16                   minor_subsystem_ver;\r\n  U32                   win32_version_value;\r\n  U32                   sizeof_image;\r\n  U32                   sizeof_headers;\r\n  U32                   check_sum;\r\n  PE_WindowsSubsystem   subsystem;\r\n  PE_DllCharacteristics dll_characteristics;\r\n  U32                   sizeof_stack_reserve;\r\n  U32                   sizeof_stack_commit;\r\n  U32                   sizeof_heap_reserve;\r\n  U32                   sizeof_heap_commit;\r\n  U32                   loader_flags;\r\n  U32                   data_dir_count;\r\n};\r\n\r\ntypedef struct PE_OptionalHeader32Plus PE_OptionalHeader32Plus;\r\nstruct PE_OptionalHeader32Plus\r\n{\r\n  U16                   magic;\r\n  U8                    major_linker_version;\r\n  U8                    minor_linker_version;\r\n  U32                   sizeof_code;\r\n  U32                   sizeof_inited_data;\r\n  U32                   sizeof_uninited_data;\r\n  U32                   entry_point_va;\r\n  U32                   code_base;\r\n  U64                   image_base;\r\n  U32                   section_alignment;\r\n  U32                   file_alignment;\r\n  U16                   major_os_ver;\r\n  U16                   minor_os_ver;\r\n  U16                   major_img_ver;\r\n  U16                   minor_img_ver;\r\n  U16                   major_subsystem_ver;\r\n  U16                   minor_subsystem_ver;\r\n  U32                   win32_version_value;\r\n  U32                   sizeof_image;\r\n  U32                   sizeof_headers;\r\n  U32                   check_sum;\r\n  PE_WindowsSubsystem   subsystem;\r\n  PE_DllCharacteristics dll_characteristics;\r\n  U64                   sizeof_stack_reserve;\r\n  U64                   sizeof_stack_commit;\r\n  U64                   sizeof_heap_reserve;\r\n  U64                   sizeof_heap_commit;\r\n  U32                   loader_flags;\r\n  U32                   data_dir_count;\r\n};\r\n\r\ntypedef enum PE_DataDirectoryIndex\r\n{\r\n  PE_DataDirectoryIndex_EXPORT,\r\n  PE_DataDirectoryIndex_IMPORT,\r\n  PE_DataDirectoryIndex_RESOURCES,\r\n  PE_DataDirectoryIndex_EXCEPTIONS,\r\n  PE_DataDirectoryIndex_CERT,\r\n  PE_DataDirectoryIndex_BASE_RELOC,\r\n  PE_DataDirectoryIndex_DEBUG,\r\n  PE_DataDirectoryIndex_ARCH,\r\n  PE_DataDirectoryIndex_GLOBAL_PTR,\r\n  PE_DataDirectoryIndex_TLS,\r\n  PE_DataDirectoryIndex_LOAD_CONFIG,\r\n  PE_DataDirectoryIndex_BOUND_IMPORT,\r\n  PE_DataDirectoryIndex_IMPORT_ADDR,\r\n  PE_DataDirectoryIndex_DELAY_IMPORT,\r\n  PE_DataDirectoryIndex_COM_DESCRIPTOR,\r\n  PE_DataDirectoryIndex_RESERVED,\r\n  PE_DataDirectoryIndex_COUNT = 16\r\n}\r\nPE_DataDirectoryIndex;\r\n\r\ntypedef struct PE_DataDirectory PE_DataDirectory;\r\nstruct PE_DataDirectory\r\n{\r\n  U32 virt_off;\r\n  U32 virt_size;\r\n};\r\n\r\ntypedef U32 PE_DebugDirectoryType;\r\nenum\r\n{\r\n  PE_DebugDirectoryType_UNKNOWN               = 0,\r\n  PE_DebugDirectoryType_COFF                  = 1,\r\n  PE_DebugDirectoryType_CODEVIEW              = 2,\r\n  PE_DebugDirectoryType_FPO                   = 3,\r\n  PE_DebugDirectoryType_MISC                  = 4,\r\n  PE_DebugDirectoryType_EXCEPTION             = 5,\r\n  PE_DebugDirectoryType_FIXUP                 = 6,\r\n  PE_DebugDirectoryType_OMAP_TO_SRC           = 7,\r\n  PE_DebugDirectoryType_OMAP_FROM_SRC         = 8,\r\n  PE_DebugDirectoryType_BORLAND               = 9,\r\n  PE_DebugDirectoryType_RESERVED10            = 10,\r\n  PE_DebugDirectoryType_CLSID                 = 11,\r\n  PE_DebugDirectoryType_VC_FEATURE            = 12,\r\n  PE_DebugDirectoryType_COFF_GROUP            = 13,\r\n  PE_DebugDirectoryType_ILTCG                 = 14,\r\n  PE_DebugDirectoryType_MPX                   = 15,\r\n  PE_DebugDirectoryType_REPRO                 = 16,\r\n  PE_DebugDirectoryType_EX_DLLCHARACTERISTICS = 20,\r\n  PE_DebugDirectoryType_COUNT                 = 18\r\n};\r\n\r\ntypedef U8 PE_FPOFlags;\r\nenum\r\n{\r\n  PE_FPOFlags_HAS_SEH    = 0x800,\r\n  PE_FPOFlags_USE_BP_REG = 0x1000,\r\n  PE_FPOFlags_RESERVED   = 0x2000,\r\n  PE_FPOFlags_COUNT      = 3\r\n};\r\n\r\ntypedef U16 PE_FPOEncoded;\r\nenum\r\n{\r\n  PE_FPOEncoded_PROLOG_SIZE_SHIFT     = 0,  PE_FPOEncoded_PROLOG_SIZE_MASK     = 0xff,\r\n  PE_FPOEncoded_SAVED_REGS_SIZE_SHIFT = 8,  PE_FPOEncoded_SAVED_REGS_SIZE_MASK = 0x7,\r\n  PE_FPOEncoded_FLAGS_SHIFT           = 11, PE_FPOEncoded_FLAGS_MASK           = 0x7,\r\n  PE_FPOEncoded_FRAME_TYPE_SHIFT      = 14, PE_FPOEncoded_FRAME_TYPE_MASK      = 0x3,\r\n};\r\n#define PE_FPOEncoded_Extract_PROLOG_SIZE(f)     (U8)(((f) >> PE_FPOEncoded_PROLOG_SIZE_SHIFT)     & PE_FPOEncoded_PROLOG_SIZE_MASK)\r\n#define PE_FPOEncoded_Extract_SAVED_REGS_SIZE(f) (U8)(((f) >> PE_FPOEncoded_SAVED_REGS_SIZE_SHIFT) & PE_FPOEncoded_SAVED_REGS_SIZE_MASK)\r\n#define PE_FPOEncoded_Extract_FLAGS(f)           (U8)(((f) >> PE_FPOEncoded_FLAGS_SHIFT)           & PE_FPOEncoded_FLAGS_MASK)\r\n#define PE_FPOEncoded_Extract_FRAME_TYPE(f)      (U8)(((f) >> PE_FPOEncoded_FRAME_TYPE_SHIFT)      & PE_FPOEncoded_FRAME_TYPE_MASK)\r\n\r\ntypedef U8 PE_FPOType;\r\nenum\r\n{\r\n  PE_FPOType_FPO   = 0,\r\n  PE_FPOType_TRAP  = 1,\r\n  PE_FPOType_TSS   = 2,\r\n  PE_FPOType_NOFPO = 3,\r\n  PE_FPOType_COUNT = 4\r\n};\r\n\r\n// winnt.h: FPO_DATA\r\ntypedef struct PE_DebugFPO PE_DebugFPO;\r\nstruct PE_DebugFPO\r\n{\r\n  U32 func_code_off;\r\n  U32 func_size;\r\n  U32 locals_size;\r\n  U16 params_size;\r\n  U16 flags;\r\n};\r\n\r\ntypedef U32 PE_DebugMiscType;\r\nenum\r\n{\r\n  PE_DebugMiscType_NULL,\r\n  PE_DebugMiscType_EXE_NAME,\r\n  PE_DebugMiscType_COUNT = 2\r\n};\r\n\r\n// winnt.h: IMAGE_DEBUG_MISC\r\ntypedef struct PE_DebugMisc PE_DebugMisc;\r\nstruct PE_DebugMisc\r\n{\r\n  PE_DebugMiscType data_type;\r\n  U32              size;\r\n  U8               unicode;\r\n  U8               pad[3];\r\n  //char name[];\r\n};\r\n\r\n// winnt.h: IMAGE_COFF_SYMBOLS_HEADER\r\ntypedef struct PE_DebugCoff PE_DebugCoff;\r\nstruct PE_DebugCoff\r\n{\r\n  U32 symbol_count;\r\n  U32 lva_to_first_symbol;\r\n  U32 line_number_count;\r\n  U32 lva_to_first_line_number;\r\n  U32 virt_off_to_first_byte_of_code;\r\n  U32 virt_off_to_last_byte_of_code;\r\n  U32 virt_off_to_first_byte_of_data;\r\n  U32 virt_off_to_last_byte_of_data;\r\n};\r\n\r\ntypedef struct PE_DebugDirectory PE_DebugDirectory;\r\nstruct PE_DebugDirectory\r\n{\r\n  U32                   characteristics;\r\n  COFF_TimeStamp        time_stamp;\r\n  U16                   major_ver;\r\n  U16                   minor_ver;\r\n  PE_DebugDirectoryType type;\r\n  U32                   size;\r\n  U32                   voff;\r\n  U32                   foff;\r\n};\r\n\r\ntypedef U32 PE_GlobalFlags;\r\nenum\r\n{\r\n  PE_GlobalFlags_STOP_ON_EXCEPTION          = (1 << 0),\r\n  PE_GlobalFlags_SHOW_LDR_SNAPS             = (1 << 1),\r\n  PE_GlobalFlags_DEBUG_INITIAL_COMMAND      = (1 << 2),\r\n  PE_GlobalFlags_STOP_ON_HUNG_GUI           = (1 << 3),\r\n  PE_GlobalFlags_HEAP_ENABLE_TAIL_CHECK     = (1 << 4),\r\n  PE_GlobalFlags_HEAP_ENABLE_FREE_CHECK     = (1 << 5),\r\n  PE_GlobalFlags_HEAP_VALIDATE_PARAMETERS   = (1 << 6),\r\n  PE_GlobalFlags_HEAP_VALIDATE_ALL          = (1 << 7),\r\n  PE_GlobalFlags_APPLICATION_VERIFIER       = (1 << 8),\r\n  PE_GlobalFlags_POOL_ENABLE_TAGGING        = (1 << 10),\r\n  PE_GlobalFlags_HEAP_ENABLE_TAGGING        = (1 << 11),\r\n  PE_GlobalFlags_STACK_TRACE_DB             = (1 << 12),\r\n  PE_GlobalFlags_KERNEL_STACK_TRACE_DB      = (1 << 13),\r\n  PE_GlobalFlags_MAINTAIN_OBJECT_TYPELIST   = (1 << 14),\r\n  PE_GlobalFlags_HEAP_ENABLE_TAG_BY_DLL     = (1 << 15),\r\n  PE_GlobalFlags_DISABLE_STACK_EXTENSION    = (1 << 16),\r\n  PE_GlobalFlags_ENABLE_CSRDEBUG            = (1 << 17),\r\n  PE_GlobalFlags_ENABLE_KDEBUG_SYMBOL_LOAD  = (1 << 18),\r\n  PE_GlobalFlags_DISABLE_PAGE_KERNEL_STACKS = (1 << 19),\r\n  PE_GlobalFlags_ENABLE_SYSTEM_CRIT_BREAKS  = (1 << 20),\r\n  PE_GlobalFlags_HEAP_DISABLE_COALESCING    = (1 << 21),\r\n  PE_GlobalFlags_ENABLE_CLOSE_EXCEPTIONS    = (1 << 22),\r\n  PE_GlobalFlags_ENABLE_EXCEPTION_LOGGING   = (1 << 23),\r\n  PE_GlobalFlags_ENABLE_HANDLE_TYPE_TAGGING = (1 << 24),\r\n  PE_GlobalFlags_HEAP_PAGE_ALLOCS           = (1 << 25),\r\n  PE_GlobalFlags_DEBUG_INITIAL_COMMAND_EX \t= (1 << 26),\r\n  PE_GlobalFlags_DISABLE_DBGPRINT           = (1 << 27),\r\n  PE_GlobalFlags_CRITSEC_EVENT_CREATION     = (1 << 28),\r\n  PE_GlobalFlags_LDR_TOP_DOWN               = (1 << 29),\r\n  PE_GlobalFlags_ENABLE_HANDLE_EXCEPTIONS   = (1 << 30),\r\n  PE_GlobalFlags_DISABLE_PROTDLLS           = (1 << 31),\r\n};\r\n\r\ntypedef U32 PE_LoadConfigGuardFlags;\r\nenum\r\n{\r\n  PE_LoadConfigGuardFlags_CF_INSTRUMENTED                    = (1 << 8),\r\n  PE_LoadConfigGuardFlags_CFW_INSTRUMENTED                   = (1 << 9),\r\n  PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_PRESENT          = (1 << 10),\r\n  PE_LoadConfigGuardFlags_SECURITY_COOKIE_UNUSED             = (1 << 11),\r\n  PE_LoadConfigGuardFlags_PROTECT_DELAYLOAD_IAT              = (1 << 12),\r\n  PE_LoadConfigGuardFlags_DELAYLOAD_IAT_IN_ITS_OWN_SECTION   = (1 << 13),\r\n  PE_LoadConfigGuardFlags_CF_EXPORT_SUPPRESSION_INFO_PRESENT = (1 << 14),\r\n  PE_LoadConfigGuardFlags_CF_ENABLE_EXPORT_SUPPRESSION       = (1 << 15),\r\n  PE_LoadConfigGuardFlags_CF_LONGJUMP_TABLE_PRESENT          = (1 << 16),\r\n  PE_LoadConfigGuardFlags_EH_CONTINUATION_TABLE_PRESENT      = (1 << 22),\r\n  PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT       = 28, PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_MASK = 0xf,\r\n};\r\n#define PE_LoadConfigGuardFlags_Extract_CF_FUNCTION_TABLE_SIZE(f) (U32)(((f) >> PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_SHIFT) & PE_LoadConfigGuardFlags_CF_FUNCTION_TABLE_SIZE_MASK)\r\n\r\ntypedef struct PE_LoadConfigCodeIntegrity PE_LoadConfigCodeIntegrity;\r\nstruct PE_LoadConfigCodeIntegrity\r\n{\r\n  U16 flags;\r\n  U16 catalog;\r\n  U32 catalog_offset;\r\n  U32 reserved;\r\n};\r\n\r\ntypedef struct PE_LoadConfig32 PE_LoadConfig32;\r\nstruct PE_LoadConfig32\r\n{\r\n  U32            size;\r\n  COFF_TimeStamp time_stamp;\r\n  U16            major_version;\r\n  U16            minor_version;\r\n  U32            global_flag_clear;\r\n  U32            global_flag_set;\r\n  U32            critical_section_timeout;\r\n  U32            decommit_free_block_threshold;\r\n  U32            decommit_total_free_threshold;\r\n  U32            lock_prefix_table;\r\n  U32            maximum_allocation_size;\r\n  U32            virtual_memory_threshold;\r\n  U32            process_affinity_mask;\r\n  U32            process_heap_flags;\r\n  U16            csd_version;\r\n  U16            reserved;\r\n  U32            edit_list;\r\n  U32            security_cookie;\r\n  U32            seh_handler_table;\r\n  U32            seh_handler_count;\r\n  \r\n  // msvc 2015\r\n  U32 guard_cf_check_func_ptr;\r\n  U32 guard_cf_dispatch_func_ptr;\r\n  U32 guard_cf_func_table;\r\n  U32 guard_cf_func_count;\r\n  U32 guard_flags;\r\n  \r\n  // msvc 2017\r\n  PE_LoadConfigCodeIntegrity code_integrity;\r\n  U32                        guard_address_taken_iat_entry_table;\r\n  U32                        guard_address_taken_iat_entry_count;\r\n  U32                        guard_long_jump_target_table;\r\n  U32                        guard_long_jump_target_count;\r\n  U32                        dynamic_value_reloc_table;\r\n  U32                        chpe_metadata_ptr;\r\n  U32                        guard_rf_failure_routine;\r\n  U32                        guard_rf_failure_routine_func_ptr;\r\n  U32                        dynamic_value_reloc_table_offset;\r\n  U16                        dynamic_value_reloc_table_section;\r\n  U16                        reserved2;\r\n  U32                        guard_rf_verify_stack_pointer_func_ptr;\r\n  U32                        hot_patch_table_offset;\r\n  \r\n  // msvc 2019\r\n  U32 reserved3;\r\n  U32 enclave_config_ptr;\r\n  U32 volatile_metadata_ptr;\r\n  U32 guard_eh_continue_table;\r\n  U32 guard_eh_continue_count;\r\n  U32 guard_xfg_check_func_ptr;\r\n  U32 guard_xfg_dispatch_func_ptr;\r\n  U32 guard_xfg_table_dispatch_func_ptr;\r\n  U32 cast_guard_os_determined_failure_mode;\r\n};\r\n\r\ntypedef struct PE_LoadConfig64 PE_LoadConfig64;\r\nstruct PE_LoadConfig64\r\n{\r\n  U32            size;\r\n  COFF_TimeStamp time_stamp;\r\n  U16            major_version;\r\n  U16            minor_version;\r\n  U32            global_flag_clear;\r\n  U32            global_flag_set;\r\n  U32            critical_section_timeout;\r\n  U64            decommit_free_block_threshold;\r\n  U64            decommit_total_free_threshold;\r\n  U64            lock_prefix_table;\r\n  U64            maximum_allocation_size;\r\n  U64            virtual_memory_threshold;\r\n  U64            process_affinity_mask;\r\n  U32            process_heap_flags;\r\n  U16            csd_version;\r\n  U16            reserved;\r\n  U64            edit_list;\r\n  U64            security_cookie;\r\n  U64            seh_handler_table;\r\n  U64            seh_handler_count;\r\n  \r\n  // msvc 2015\r\n  U64 guard_cf_check_func_ptr;\r\n  U64 guard_cf_dispatch_func_ptr;\r\n  U64 guard_cf_func_table;\r\n  U64 guard_cf_func_count;\r\n  U32 guard_flags;\r\n  \r\n  // msvc 2017\r\n  PE_LoadConfigCodeIntegrity code_integrity;\r\n  U64                        guard_address_taken_iat_entry_table;\r\n  U64                        guard_address_taken_iat_entry_count;\r\n  U64                        guard_long_jump_target_table;\r\n  U64                        guard_long_jump_target_count;\r\n  U64                        dynamic_value_reloc_table;\r\n  U64                        chpe_metadata_ptr;\r\n  U64                        guard_rf_failure_routine;\r\n  U64                        guard_rf_failure_routine_func_ptr;\r\n  U32                        dynamic_value_reloc_table_offset;\r\n  U16                        dynamic_value_reloc_table_section;\r\n  U16                        reserved2;\r\n  U64                        guard_rf_verify_stack_pointer_func_ptr;\r\n  U32                        hot_patch_table_offset;\r\n  \r\n  // msvc 2019\r\n  U32 reserved3;\r\n  U64 enclave_config_ptr;\r\n  U64 volatile_metadata_ptr;\r\n  U64 guard_eh_continue_table;\r\n  U64 guard_eh_continue_count;\r\n  U64 guard_xfg_check_func_ptr;\r\n  U64 guard_xfg_dispatch_func_ptr;\r\n  U64 guard_xfg_table_dispatch_func_ptr;\r\n  U64 cast_guard_os_determined_failure_mode;\r\n};\r\n\r\n// this is the \"MZ\" as a 16-bit short\r\n#define PE_DOS_MAGIC      0x5a4d\r\n#define PE_MAGIC          0x00004550u\r\n#define PE_PE32_MAGIC     0x010bu\r\n#define PE_PE32PLUS_MAGIC 0x020bu\r\ntypedef U16 PE_DosMagic;\r\n\r\ntypedef struct PE_MipsPdata PE_MipsPdata;\r\nstruct PE_MipsPdata\r\n{\r\n  U32 voff_first;\r\n  U32 voff_one_past_last;\r\n  U32 voff_exception_handler;\r\n  U32 voff_exception_handler_data;\r\n  U32 voff_one_past_prolog;\r\n};\r\n\r\ntypedef struct PE_ArmPdata PE_ArmPdata;\r\nstruct PE_ArmPdata\r\n{\r\n  U32 voff_first;\r\n  // NOTE(allen):\r\n  // bits    | meaning\r\n  // [0:7]   | prolog length\r\n  // [8:29]  | function length\r\n  // [30:30] | instructions_are_32bits (otherwise they are 16 bits)\r\n  // [31:31] | has_exception_handler\r\n  U32 combined;\r\n};\r\n\r\ntypedef struct PE_IntelPdata PE_IntelPdata;\r\nstruct PE_IntelPdata\r\n{\r\n  U32 voff_first;\r\n  U32 voff_one_past_last;\r\n  U32 voff_unwind_info;\r\n};\r\n\r\n#define PE_CODEVIEW_PDB20_MAGIC 0x3031424e\r\n#define PE_CODEVIEW_PDB70_MAGIC 0x53445352\r\n#define PE_CODEVIEW_RDI_MAGIC   '0IDR' \r\n\r\ntypedef struct PE_CvHeaderPDB20 PE_CvHeaderPDB20;\r\nstruct PE_CvHeaderPDB20\r\n{\r\n  U32            magic;\r\n  U32            offset;\r\n  COFF_TimeStamp time_stamp;\r\n  U32            age;\r\n  // file name packed after struct\r\n};\r\n\r\ntypedef struct PE_CvHeaderPDB70 PE_CvHeaderPDB70;\r\nstruct PE_CvHeaderPDB70\r\n{\r\n  U32  magic;\r\n  Guid guid;\r\n  U32  age;\r\n  // file name packed after struct\r\n};\r\n\r\ntypedef struct PE_CvHeaderRDI PE_CvHeaderRDI;\r\nstruct PE_CvHeaderRDI\r\n{\r\n  U32  magic;\r\n  Guid guid;\r\n  // file name packed after struct\r\n};\r\n\r\ntypedef struct PE_ImportEntry PE_ImportEntry;\r\nstruct PE_ImportEntry\r\n{\r\n  U32            lookup_table_voff;\r\n  COFF_TimeStamp time_stamp;\r\n  U32            forwarder_chain;\r\n  U32            name_voff;\r\n  U32            import_addr_table_voff;\r\n};\r\n\r\ntypedef struct PE_DelayedImportEntry PE_DelayedImportEntry;\r\nstruct PE_DelayedImportEntry\r\n{\r\n  // According to COFF/PE spec this field is unused and should be set zero,\r\n  // but when I compile mule with MSVC 2019 this is set to 1.\r\n  U32            attributes;\r\n  U32            name_voff;          // Name of the DLL\r\n  U32            module_handle_voff; // Place where module handle from LoadLibrary is stored\r\n  U32            iat_voff;\r\n  U32            name_table_voff;    // Array of hint/name or oridnals\r\n  U32            bound_table_voff;   // (Optional) Points to an array of PE_ThunkData\r\n  U32            unload_table_voff;  // (Optional) Copy of iat_voff\r\n  //  0 not bound\r\n  // -1 if bound and real timestamp located in bounded import directory\r\n  // Otherwise time when dll was bound\r\n  COFF_TimeStamp time_stamp;\r\n};\r\n\r\ntypedef struct PE_ExportTableHeader PE_ExportTableHeader;\r\nstruct PE_ExportTableHeader\r\n{\r\n  U32            flags;                       // must be zero\r\n  COFF_TimeStamp time_stamp;                  // time and date when export table was created\r\n  U16            major_ver;                   // table version, user can change major and minor version\r\n  U16            minor_ver;\r\n  U32            name_voff;                   // ASCII name of the dll\r\n  U32            ordinal_base;                // Starting oridnal number\r\n  U32            export_address_table_count;\r\n  U32            name_pointer_table_count;\r\n  U32            export_address_table_voff;\r\n  U32            name_pointer_table_voff;\r\n  U32            ordinal_table_voff;\r\n};\r\n\r\ntypedef struct PE_TLSHeader32 PE_TLSHeader32;\r\nstruct PE_TLSHeader32\r\n{\r\n  U32               raw_data_start;    // Range of initialized data that is copied for each thread from the image.\r\n  U32               raw_data_end;      // (Typically points to .tls section)\r\n  U32               index_address;     // Address where image loader places TLS slot index.\r\n  U32               callbacks_address; // Zero terminated list of callbacks used for initializing data with constructors.\r\n  U32               zero_fill_size;    // Amount of memory to fill with zeroes in TLS.\r\n  COFF_SectionFlags characteristics;   // COFF_SectionFlags but only align flags are used.\r\n};\r\n\r\ntypedef struct PE_TLSHeader64 PE_TLSHeader64;\r\nstruct PE_TLSHeader64\r\n{\r\n  U64               raw_data_start;    // Range of initialized data that is copied for each thread from the image.\r\n  U64               raw_data_end;      // (Typically points to .tls section)\r\n  U64               index_address;     // Address where image loader places TLS slot index.\r\n  U64               callbacks_address; // Zero terminated list of callbacks used for initializing data with constructors.\r\n  U32               zero_fill_size;    // Amount of memory to fill with zeroes in TLS.\r\n  COFF_SectionFlags characteristics;   // COFF_SectionFlags but only align flags are used.\r\n};\r\n\r\nglobal read_only U8 PE_RES_MAGIC[] =\r\n{\r\n  0x00, 0x00, 0x00, 0x00,\r\n  0x20, 0x00, 0x00, 0x00,\r\n  0xFF, 0xFF, 0x00, 0x00,\r\n  0xFF, 0xFF, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00,\r\n  0x00, 0x00, 0x00, 0x00\r\n};\r\n\r\ntypedef U32 PE_ResourceKind;\r\nenum\r\n{\r\n  PE_ResourceKind_CURSOR       = 0x1,\r\n  PE_ResourceKind_BITMAP       = 0x2,\r\n  PE_ResourceKind_ICON         = 0x3,\r\n  PE_ResourceKind_MENU         = 0x4,\r\n  PE_ResourceKind_DIALOG       = 0x5,\r\n  PE_ResourceKind_STRING       = 0x6,\r\n  PE_ResourceKind_FONTDIR      = 0x7,\r\n  PE_ResourceKind_FONT         = 0x8,\r\n  PE_ResourceKind_ACCELERATOR  = 0x9,\r\n  PE_ResourceKind_RCDATA       = 0xA,\r\n  PE_ResourceKind_MESSAGETABLE = 0xB,\r\n  PE_ResourceKind_GROUP_CURSOR = 0xC,\r\n  PE_ResourceKind_GROUP_ICON   = 0xE,\r\n  PE_ResourceKind_VERSION      = 0x10,\r\n  PE_ResourceKind_DLGINCLUDE   = 0x11,\r\n  PE_ResourceKind_PLUGPLAY     = 0x13,\r\n  PE_ResourceKind_VXD          = 0x14,\r\n  PE_ResourceKind_ANICURSOR    = 0x15,\r\n  PE_ResourceKind_ANIICON      = 0x16,\r\n  PE_ResourceKind_HTML         = 0x17,\r\n  PE_ResourceKind_MANIFEST     = 0x18,\r\n  PE_ResourceKind_BITMAP_NEW   = 0x2002,\r\n  PE_ResourceKind_MENU_NEW     = 0x2004,\r\n  PE_ResourceKind_DIALOG_NEW   = 0x2005,\r\n};\r\n\r\ntypedef enum PE_ResDataKind\r\n{\r\n  PE_ResDataKind_NULL,\r\n  PE_ResDataKind_DIR,\r\n  PE_ResDataKind_COFF_LEAF,\r\n  PE_ResDataKind_COFF_RESOURCE,\r\n}\r\nPE_ResDataKind;\r\n\r\ntypedef struct PE_ResourceHeader PE_ResourceHeader;\r\nstruct PE_ResourceHeader\r\n{\r\n  COFF_ResourceHeaderPrefix prefix;\r\n  U16                       type;\r\n  U16                       pad0;\r\n  U16                       name;\r\n  U16                       pad1;\r\n  U32                       data_version;\r\n  COFF_ResourceMemoryFlags  memory_flags;\r\n  U16                       language_id;\r\n  U32                       version;\r\n  U32                       characteristics;\r\n};\r\n\r\ntypedef U16 PE_BaseRelocKind;\r\nenum\r\n{\r\n  PE_BaseRelocKind_ABSOLUTE            = 0, // No reallocation is applied. Can be used as padding.\r\n  PE_BaseRelocKind_HIGH                = 1,\r\n  PE_BaseRelocKind_LOW                 = 2,\r\n  PE_BaseRelocKind_HIGHLOW             = 3,\r\n  PE_BaseRelocKind_HIGHADJ             = 4,\r\n  PE_BaseRelocKind_MIPS_JMPADDR        = 5,\r\n  PE_BaseRelocKind_ARM_MOV32           = 5,\r\n  PE_BaseRelocKind_RISCV_HIGH20        = 5,\r\n  // 6 is reserved\r\n  PE_BaseRelocKind_THUMB_MOV32         = 7,\r\n  PE_BaseRelocKind_RISCV_LOW12I        = 7,\r\n  PE_BaseRelocKind_RISCV_LOW12S        = 8,\r\n  PE_BaseRelocKind_LOONGARCH32_MARK_LA = 8,\r\n  PE_BaseRelocKind_LOONGARCH64_MARK_LA = 8,\r\n  PE_BaseRelocKind_MIPS_JMPADDR16      = 9,\r\n  PE_BaseRelocKind_DIR64               = 10,\r\n};\r\n#define PE_BaseRelocOffsetFromEntry(x) ((x) & 0x1fff)\r\n#define PE_BaseRelocKindFromEntry(x)   (((x) >> 12) & 0xf)\r\n#define PE_BaseRelocMake(k, off)       ((((U16)(k) & 0xf) << 12) | (U16)((off) & 0x1fff))\r\n\r\ntypedef U32 PE_UnwindOpCode;\r\nenum\r\n{\r\n  PE_UnwindOpCode_PUSH_NONVOL      = 0,\r\n  PE_UnwindOpCode_ALLOC_LARGE      = 1,\r\n  PE_UnwindOpCode_ALLOC_SMALL      = 2,\r\n  PE_UnwindOpCode_SET_FPREG        = 3,\r\n  PE_UnwindOpCode_SAVE_NONVOL      = 4,\r\n  PE_UnwindOpCode_SAVE_NONVOL_FAR  = 5,\r\n  PE_UnwindOpCode_EPILOG           = 6,\r\n  PE_UnwindOpCode_SPARE_CODE       = 7,\r\n  PE_UnwindOpCode_SAVE_XMM128      = 8,\r\n  PE_UnwindOpCode_SAVE_XMM128_FAR  = 9,\r\n  PE_UnwindOpCode_PUSH_MACHFRAME   = 10,\r\n};\r\n\r\ntypedef U8 PE_UnwindGprRegX64;\r\nenum\r\n{\r\n  PE_UnwindGprRegX64_RAX = 0,\r\n  PE_UnwindGprRegX64_RCX = 1,\r\n  PE_UnwindGprRegX64_RDX = 2,\r\n  PE_UnwindGprRegX64_RBX = 3,\r\n  PE_UnwindGprRegX64_RSP = 4,\r\n  PE_UnwindGprRegX64_RBP = 5,\r\n  PE_UnwindGprRegX64_RSI = 6,\r\n  PE_UnwindGprRegX64_RDI = 7,\r\n  PE_UnwindGprRegX64_R8  = 8,\r\n  PE_UnwindGprRegX64_R9  = 9,\r\n  PE_UnwindGprRegX64_R10 = 10,\r\n  PE_UnwindGprRegX64_R11 = 11,\r\n  PE_UnwindGprRegX64_R12 = 12,\r\n  PE_UnwindGprRegX64_R13 = 13,\r\n  PE_UnwindGprRegX64_R14 = 14,\r\n  PE_UnwindGprRegX64_R15 = 15,\r\n};\r\n\r\ntypedef U8 PE_UnwindInfoFlags;\r\nenum\r\n{\r\n  PE_UnwindInfoFlag_EHANDLER = (1<<0),\r\n  PE_UnwindInfoFlag_UHANDLER = (1<<1),\r\n  PE_UnwindInfoFlag_FHANDLER = 3,\r\n  PE_UnwindInfoFlag_CHAINED  = (1<<2),\r\n};\r\n\r\n#define PE_UNWIND_OPCODE_FROM_FLAGS(f) ((f)&0xF)\r\n#define PE_UNWIND_INFO_FROM_FLAGS(f) (((f) >> 4)&0xF)\r\n\r\ntypedef union PE_UnwindCode PE_UnwindCode;\r\nunion PE_UnwindCode\r\n{\r\n  struct\r\n  {\r\n    U8 off_in_prolog;\r\n    U8 flags;\r\n  };\r\n  U16 u16;\r\n};\r\n\r\n#define PE_UNWIND_INFO_VERSION_FROM_HDR(x) ((x)&0x7)\r\n#define PE_UNWIND_INFO_FLAGS_FROM_HDR(x)   (((x) >> 3)&0x1F)\r\n#define PE_UNWIND_INFO_REG_FROM_FRAME(x)   ((x)&0xF)\r\n#define PE_UNWIND_INFO_OFF_FROM_FRAME(x)   (((x) >> 4)&0xF)\r\n#define PE_UNWIND_INFO_GET_CODE_COUNT(x)   (((x)+1) & ~1)\r\n\r\ntypedef struct PE_UnwindInfo PE_UnwindInfo;\r\nstruct PE_UnwindInfo\r\n{\r\n  U8 header;\r\n  U8 prolog_size;\r\n  U8 codes_num;\r\n  U8 frame;\r\n};\r\n\r\n#pragma pack(pop)\r\n\r\n////////////////////////////////\r\n//~ rjf: DOS Program\r\n\r\n// generated from pe/dos_program.asm\r\nread_only global U8 pe_dos_program_data[] =\r\n{\r\n  0x0E, 0x1F, 0xBA, 0x0E, 0x00, 0xB4, 0x09, 0xCD, 0x21, 0xB8, 0x01, 0x4C, 0xCD, 0x21, 0x54, 0x68,\r\n  0x69, 0x73, 0x20, 0x70, 0x72, 0x6F, 0x67, 0x72, 0x61, 0x6D, 0x20, 0x63, 0x61, 0x6E, 0x6E, 0x6F,\r\n  0x74, 0x20, 0x62, 0x65, 0x20, 0x72, 0x75, 0x6E, 0x20, 0x69, 0x6E, 0x20, 0x44, 0x4F, 0x53, 0x20,\r\n  0x6D, 0x6F, 0x64, 0x65, 0x2E, 0x24, 0x00, 0x00\r\n};\r\nread_only global String8 pe_dos_program = {pe_dos_program_data, sizeof(pe_dos_program_data)};\r\n\r\n////////////////////////////////\r\n//~ rjf: Parsed Info Types\r\n\r\n//- rjf: relocation blocks\r\n\r\ntypedef struct PE_BaseRelocBlock PE_BaseRelocBlock;\r\nstruct PE_BaseRelocBlock\r\n{\r\n  U64  page_virt_off;\r\n  U64  entry_count;\r\n  U16 *entries;\r\n};\r\n\r\ntypedef struct PE_BaseRelocBlockNode PE_BaseRelocBlockNode;\r\nstruct PE_BaseRelocBlockNode\r\n{\r\n  PE_BaseRelocBlockNode *next;\r\n  PE_BaseRelocBlock      v;\r\n};\r\n\r\ntypedef struct PE_BaseRelocBlockList PE_BaseRelocBlockList;\r\nstruct PE_BaseRelocBlockList\r\n{\r\n  PE_BaseRelocBlockNode *first;\r\n  PE_BaseRelocBlockNode *last;\r\n  U64                    count;\r\n};\r\n\r\n//- rjf: resources\r\n\r\ntypedef struct PE_Resource PE_Resource;\r\nstruct PE_Resource\r\n{\r\n  COFF_ResourceID id;\r\n  PE_ResDataKind  kind;\r\n  union\r\n  {\r\n    COFF_ResourceDataEntry leaf;\r\n    struct PE_ResourceDir *dir;\r\n    struct\r\n    {\r\n      COFF_ResourceID          type;\r\n      U32                      data_version;\r\n      U32                      version;\r\n      COFF_ResourceMemoryFlags memory_flags;\r\n      String8                  data;\r\n    } coff_res;\r\n  } u;\r\n};\r\n\r\ntypedef struct PE_ResourceNode PE_ResourceNode;\r\nstruct PE_ResourceNode\r\n{\r\n  PE_ResourceNode *next;\r\n  PE_Resource      data;\r\n};\r\n\r\ntypedef struct PE_ResourceList PE_ResourceList;\r\nstruct PE_ResourceList\r\n{\r\n  PE_ResourceNode *first;\r\n  PE_ResourceNode *last;\r\n  U64              count;\r\n};\r\n\r\ntypedef struct PE_ResourceArray PE_ResourceArray;\r\nstruct PE_ResourceArray\r\n{\r\n  PE_Resource *v;\r\n  U64          count;\r\n};\r\n\r\ntypedef struct PE_ResourceDir PE_ResourceDir;\r\nstruct PE_ResourceDir\r\n{\r\n  U32             characteristics;\r\n  COFF_TimeStamp  time_stamp;\r\n  U16             major_version;\r\n  U16             minor_version;\r\n  PE_ResourceList named_list;\r\n  PE_ResourceList id_list;\r\n};\r\n\r\n//- exports & imports\r\n\r\ntypedef struct PE_ParsedExport PE_ParsedExport;\r\nstruct PE_ParsedExport\r\n{\r\n  String8 forwarder;\r\n  String8 name;\r\n  U64     voff;\r\n  U64     ordinal;\r\n};\r\n\r\ntypedef struct PE_ParsedExportTable PE_ParsedExportTable;\r\nstruct PE_ParsedExportTable\r\n{\r\n  U32              flags;\r\n  COFF_TimeStamp   time_stamp;\r\n  U16              major_ver;\r\n  U16              minor_ver;\r\n  U64              ordinal_base;\r\n  U64              export_count;\r\n  PE_ParsedExport *exports;\r\n};\r\n\r\ntypedef U32 PE_ParsedImportType;\r\nenum PE_ParsedImportTypeEnum\r\n{\r\n  PE_ParsedImport_Null,\r\n  PE_ParsedImport_Ordinal,\r\n  PE_ParsedImport_Name,\r\n};\r\n\r\ntypedef struct PE_ParsedImport PE_ParsedImport;\r\nstruct PE_ParsedImport\r\n{\r\n  PE_ParsedImportType type;\r\n  union\r\n  {\r\n    U16 ordinal;\r\n    struct\r\n    {\r\n      U64     hint;\r\n      String8 string;\r\n    } name;\r\n  } u;\r\n};\r\n\r\ntypedef struct PE_ParsedStaticDLLImport PE_ParsedStaticDLLImport;\r\nstruct PE_ParsedStaticDLLImport\r\n{\r\n  String8          name;\r\n  U64              import_address_table_voff;\r\n  U64              import_name_table_voff;\r\n  COFF_TimeStamp   time_stamp;\r\n  U64              forwarder_chain;\r\n  U64              import_count;\r\n  PE_ParsedImport *imports;\r\n};\r\n\r\ntypedef struct PE_ParsedStaticImportTable PE_ParsedStaticImportTable;\r\nstruct PE_ParsedStaticImportTable\r\n{\r\n  U64                       count;\r\n  PE_ParsedStaticDLLImport *v;\r\n};\r\n\r\ntypedef struct PE_ParsedDelayDLLImport PE_ParsedDelayDLLImport;\r\nstruct PE_ParsedDelayDLLImport\r\n{\r\n  U32              attributes;\r\n  String8          name;\r\n  U64              module_handle_voff;\r\n  U64              iat_voff;\r\n  U64              name_table_voff;\r\n  U64              bound_table_voff;\r\n  U64              unload_table_voff;\r\n  COFF_TimeStamp   time_stamp;\r\n  U64              bound_table_count;\r\n  U64             *bound_table;\r\n  U64              unload_table_count;\r\n  U64             *unload_table;\r\n  U64              import_count;\r\n  PE_ParsedImport *imports;\r\n};\r\n\r\ntypedef struct PE_ParsedDelayImportTable PE_ParsedDelayImportTable;\r\nstruct PE_ParsedDelayImportTable\r\n{\r\n  U64                      count;\r\n  PE_ParsedDelayDLLImport *v;\r\n};\r\n\r\ntypedef struct PE_ParsedTLS PE_ParsedTLS;\r\nstruct PE_ParsedTLS\r\n{\r\n  PE_TLSHeader64 header;\r\n  U64            callback_count;\r\n  U64           *callback_addrs;\r\n};\r\n\r\n////////////////////////////////\r\n// SEH Scope Table\r\n\r\ntypedef struct PE_HandlerScope PE_HandlerScope;\r\nstruct PE_HandlerScope\r\n{\r\n  U32 begin;\r\n  U32 end;\r\n  U32 handler;\r\n  U32 target;\r\n};\r\n\r\n//- rjf: bundle\r\n\r\ntypedef struct PE_BinInfo PE_BinInfo;\r\nstruct PE_BinInfo\r\n{\r\n  Arch                 arch;\r\n  U64                  image_base;\r\n  U64                  entry_point;\r\n  B32                  is_pe32;\r\n  PE_WindowsSubsystem  subsystem;\r\n  U32                 *check_sum;\r\n  U64                  virt_section_align;\r\n  U64                  file_section_align;\r\n  U64                  section_count;\r\n  U64                  symbol_count;\r\n  U64                  optional_header_off;\r\n  Rng1U64              section_table_range;\r\n  Rng1U64              symbol_table_range;\r\n  Rng1U64              string_table_range;\r\n  Rng1U64              data_dir_range;\r\n  Rng1U64             *data_dir_franges;\r\n  Rng1U64             *data_dir_vranges;\r\n  U32                  data_dir_count;\r\n  PE_TLSHeader64       tls_header;\r\n};\r\n\r\ntypedef struct PE_DebugInfo\r\n{\r\n  PE_DebugDirectory header;\r\n  U32 cv_magic;\r\n  PE_CvHeaderPDB20 cv_pdb20_header;\r\n  PE_CvHeaderPDB70 cv_pdb70_header;\r\n  PE_CvHeaderRDI cv_rdi_header;\r\n  String8 path;\r\n}\r\nPE_DebugInfo;\r\n\r\ntypedef struct PE_DebugInfoNode\r\n{\r\n  struct PE_DebugInfoNode *next;\r\n  PE_DebugInfo             v;\r\n} PE_DebugInfoNode;\r\n\r\ntypedef struct PE_DebugInfoList\r\n{\r\n  PE_DebugInfoNode *first;\r\n  PE_DebugInfoNode *last;\r\n  U64               count;\r\n} PE_DebugInfoList;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Enum Functions\r\n\r\ninternal U32                 pe_slot_count_from_unwind_op_code(PE_UnwindOpCode opcode);\r\ninternal PE_WindowsSubsystem pe_subsystem_from_string(String8 string);\r\n\r\ninternal String8 pe_string_from_subsystem(PE_WindowsSubsystem x);\r\ninternal String8 pe_string_from_unwind_gpr_x64(PE_UnwindGprRegX64 x);\r\ninternal String8 pe_string_from_data_directory_index(PE_DataDirectoryIndex x);\r\ninternal String8 pe_string_from_debug_directory_type(PE_DebugDirectoryType x);\r\ninternal String8 pe_string_from_fpo_type(PE_FPOType x);\r\ninternal String8 pe_string_from_misc_type(PE_DebugMiscType x);\r\ninternal String8 pe_resource_kind_to_string(PE_ResourceKind x);\r\n\r\ninternal String8 pe_string_from_fpo_flags(Arena *arena, PE_FPOFlags flags);\r\ninternal String8 pe_string_from_global_flags(Arena *arena, PE_GlobalFlags flags);\r\ninternal String8 pe_string_from_load_config_guard_flags(Arena *arena, PE_LoadConfigGuardFlags flags);\r\ninternal String8 pe_string_from_dll_characteristics(Arena *arena, PE_DllCharacteristics dll_chars);\r\n\r\n////////////////////////////////\r\n//~ rjf: Parser Functions\r\n\r\ninternal B32        pe_check_magic(String8 data);\r\ninternal PE_BinInfo pe_bin_info_from_data(Arena *arena, String8 data);\r\n\r\ninternal PE_DataDirectory *         pe_data_directory_from_idx(String8 file_data, PE_BinInfo pe, PE_DataDirectoryIndex dir_idx);\r\ninternal PE_DebugInfoList           pe_parse_debug_directory(Arena *arena, String8 raw_image, String8 raw_debug_dir);\r\ninternal PE_DebugInfoList           pe_debug_info_list_from_raw_debug_dir(Arena *arena, String8 raw_image, String8 raw_debug_dir);\r\ninternal PE_ParsedStaticImportTable pe_static_imports_from_data(Arena *arena, B32 is_pe32, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 dir_file_range);\r\ninternal PE_ParsedDelayImportTable  pe_delay_imports_from_data(Arena *arena, B32 is_pe32, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 dir_file_range);\r\ninternal PE_ParsedExportTable       pe_exports_from_data(Arena *arena, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 dir_file_range, Rng1U64 dir_virt_range);\r\ninternal PE_ParsedTLS               pe_tls_from_data(Arena *arena, COFF_MachineType machine, U64 image_base, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 tls_frange);\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal U64                   pe_pdata_off_from_voff__binary_search_x8664(String8 raw_data, U64 voff);\r\ninternal U64                   pe_foff_from_voff(String8 data, PE_BinInfo *bin, U64 voff);\r\ninternal PE_BaseRelocBlockList pe_base_reloc_block_list_from_data(Arena *arena, String8 raw_relocs);\r\ninternal Rng1U64               pe_tls_rng_from_bin_base_vaddr(String8 data, PE_BinInfo *bin, U64 base_vaddr);\r\ninternal String8Array          pe_get_entry_point_names(COFF_MachineType machine, PE_WindowsSubsystem subsystem, PE_ImageFileCharacteristics file_characteristics);\r\n\r\n////////////////////////////////\r\n//~ Resource Helpers\r\n\r\ninternal B32               pe_is_res(String8 data);\r\ninternal void              pe_resource_dir_push_res_file(Arena *arena, PE_ResourceDir *root_dir, String8 res_file);\r\ninternal PE_ResourceNode * pe_resource_dir_push_dir_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version);\r\ninternal PE_ResourceNode * pe_resource_dir_push_entry_node(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data);\r\ninternal PE_Resource *     pe_resource_dir_push_entry(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, COFF_ResourceID type, U32 data_version, U32 version, COFF_ResourceMemoryFlags memory_flags, String8 data);\r\ninternal PE_Resource *     pe_resource_dir_push_dir(Arena *arena, PE_ResourceDir *dir, COFF_ResourceID id, U32 characteristics, COFF_TimeStamp time_stamp, U16 major_version, U16 minor_version);\r\ninternal PE_ResourceNode * pe_resource_dir_search_node(PE_ResourceDir *dir, COFF_ResourceID id);\r\ninternal PE_Resource *     pe_resource_dir_search(PE_ResourceDir *dir, COFF_ResourceID id);\r\ninternal PE_ResourceArray  pe_resource_list_to_array(Arena *arena, PE_ResourceList *list);\r\ninternal PE_ResourceDir *  pe_resource_table_from_directory_data(Arena *arena, String8 data);\r\n\r\ninternal String8 pe_make_manifest_resource(Arena *arena, U32 resource_id, String8 manifest_data);\r\n\r\n////////////////////////////////\r\n//~ Debug Directory\r\n\r\ninternal String8 pe_make_debug_header_pdb70(Arena *arena, Guid guid, U32 age, String8 pdb_path);\r\ninternal String8 pe_make_debug_header_rdi(Arena *arena, Guid guid, String8 rdi_path);\r\n\r\n////////////////////////////////\r\n//~ Image Checksum\r\n\r\ninternal U32 pe_compute_checksum(U8 *buffer, U64 buffer_size);\r\n\r\n////////////////////////////////\r\n\r\ninternal void pe_pdata_sort(COFF_MachineType machine, String8 raw_pdata);\r\n\r\n#endif // PE_H\r\n"
  },
  {
    "path": "src/pe/pe_make_debug_dir.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8\npe_make_debug_directory_pdb_obj(Arena *arena, COFF_MachineType machine, Guid guid, U32 age, COFF_TimeStamp time_stamp, String8 path)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(COFF_TimeStamp_Max, machine);\n\n  String8          debug_data   = pe_make_debug_header_pdb70(obj_writer->arena, guid, age, path);\n  COFF_ObjSection *debug_sect   = coff_obj_writer_push_section(obj_writer, str8_lit(\".RAD_LINK_PE_DEBUG_DATA\"), PE_DEBUG_DIR_SECTION_FLAGS, debug_data);\n  COFF_ObjSymbol  *debug_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"PDB_DEBUG_HEADER_70\"), 0, debug_sect);\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"RAD_LINK_PE_DEBUG_PDB\"), 0, debug_sect);\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"RAD_LINK_PE_DEBUG_GUID_PDB\"), OffsetOf(PE_CvHeaderPDB70, guid), debug_sect);\n\n  PE_DebugDirectory *dir = push_array(obj_writer->arena, PE_DebugDirectory, 1);\n  dir->time_stamp        = time_stamp;\n  dir->type              = PE_DebugDirectoryType_CODEVIEW;\n  dir->size              = debug_data.size;\n  COFF_ObjSection *debug_dir_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".RAD_LINK_PE_DEBUG_DIR\"), PE_DEBUG_DIR_SECTION_FLAGS, str8_struct(dir));\n  coff_obj_writer_section_push_reloc_voff(obj_writer, debug_dir_sect, OffsetOf(PE_DebugDirectory, voff), debug_symbol);\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  return obj;\n}\n\ninternal String8\npe_make_debug_directory_rdi_obj(Arena *arena, COFF_MachineType machine, Guid guid, U32 age, COFF_TimeStamp time_stamp, String8 path)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(COFF_TimeStamp_Max, machine);\n\n  String8          debug_data   = pe_make_debug_header_rdi(obj_writer->arena, guid, path);\n  COFF_ObjSection *debug_sect   = coff_obj_writer_push_section(obj_writer, str8_lit(\".RAD_LINK_PE_DEBUG_DATA\"), PE_DEBUG_DIR_SECTION_FLAGS, debug_data);\n  COFF_ObjSymbol  *debug_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"PDB_DEBUG_HEADER_RDI\"), 0, debug_sect);\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"RAD_LINK_PE_DEBUG_RDI\"), 0, debug_sect);\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"RAD_LINK_PE_DEBUG_GUID_RDI\"), OffsetOf(PE_CvHeaderRDI, guid), debug_sect);\n\n  PE_DebugDirectory *dir = push_array(obj_writer->arena, PE_DebugDirectory, 1);\n  dir->time_stamp = time_stamp;\n  dir->type       = PE_DebugDirectoryType_CODEVIEW;\n  dir->size       = debug_data.size;\n  COFF_ObjSection *dir_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".RAD_LINK_PE_DEBUG_DIR\"), PE_DEBUG_DIR_SECTION_FLAGS, str8_struct(dir));\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dir_sect, OffsetOf(PE_DebugDirectory, voff), debug_symbol);\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  return obj;\n}\n\n"
  },
  {
    "path": "src/pe/pe_make_debug_dir.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef PE_MAKE_DEBUG_DIR_H\n#define PE_MAKE_DEBUG_DIR_H\n\ninternal String8 pe_make_debug_directory_pdb_obj(Arena *arena, COFF_MachineType machine, Guid guid, U32 age, COFF_TimeStamp time_stamp, String8 path);\ninternal String8 pe_make_debug_directory_rdi_obj(Arena *arena, COFF_MachineType machine, Guid guid, U32 age, COFF_TimeStamp time_stamp, String8 path);\n\n#endif // PE_MAKE_DEBUG_DIR_H\n\n"
  },
  {
    "path": "src/pe/pe_make_export_table.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal String8\npe_name_from_export_parse(PE_ExportParse *exp)\n{\n  String8 name;\n  if (exp->is_forwarder) {\n    name = exp->alias;\n  } else if (exp->alias.size) {\n    name = exp->alias;\n  } else {\n    name = exp->name;\n  }\n  return name;\n}\n\ninternal U16\npe_hint_or_ordinal_from_export_parse(PE_ExportParse *exp)\n{\n  U16 hint_or_ordinal = max_U16;\n  if (exp->import_by == COFF_ImportBy_Ordinal) {\n    hint_or_ordinal = exp->ordinal;\n  } else if (exp->import_by == COFF_ImportBy_Name) {\n    hint_or_ordinal = exp->hint;\n  } else {\n    NotImplemented;\n  }\n  return hint_or_ordinal;\n}\n\ninternal PE_ExportParsePtrArray\npe_array_from_export_list(Arena *arena, PE_ExportParseList list)\n{\n  PE_ExportParsePtrArray result = {0};\n  result.v = push_array_no_zero(arena, PE_ExportParse *, list.count);\n  for (PE_ExportParseNode *exp = list.first; exp != 0; exp = exp->next) {\n    result.v[result.count++] = &exp->data;\n  }\n  return result;\n}\n\ninternal void\npe_export_parse_list_push_node(PE_ExportParseList *list, PE_ExportParseNode *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal PE_ExportParseNode *\npe_export_parse_list_push(Arena *arena, PE_ExportParseList *list, PE_ExportParse data)\n{\n  PE_ExportParseNode *node = push_array(arena, PE_ExportParseNode, 1);\n  node->data = data;\n  pe_export_parse_list_push_node(list, node);\n  return node;\n}\n\ninternal void\npe_export_parse_list_concat_in_place(PE_ExportParseList *list, PE_ExportParseList *to_concat)\n{\n  if (to_concat->count) {\n    if (list->count) {\n      list->last->next = to_concat->first;\n      list->last = to_concat->last;\n    } else {\n      list->first = to_concat->first;\n      list->last = to_concat->last;\n    }\n    list->count += to_concat->count;\n    MemoryZeroStruct(to_concat);\n  }\n}\n\ninternal int\npe_named_export_is_before(void *raw_a, void *raw_b)\n{\n  PE_ExportParse *a = *(PE_ExportParse **)raw_a;\n  PE_ExportParse *b = *(PE_ExportParse **)raw_b;\n  int cmp = str8_compar_case_sensitive(&a->name, &b->name);\n  return cmp < 0;\n}\n\ninternal int\npe_ordinal_export_is_before(void *raw_a, void *raw_b)\n{\n  PE_ExportParse *a = raw_a;\n  PE_ExportParse *b = raw_b;\n  return a->ordinal < b->ordinal;\n}\n\ninternal PE_FinalizedExports\npe_finalize_export_list(Arena *arena, PE_ExportParseList export_list)\n{\n  PE_ExportParsePtrArray named_exports = {0};\n  PE_ExportParsePtrArray ordinal_exports = {0};\n  PE_ExportParsePtrArray forwarder_exports = {0};\n  {\n    // group exports based on flags\n    PE_ExportParseList named_exports_list = {0};\n    PE_ExportParseList ordinal_exports_list = {0};\n    PE_ExportParseList forwarder_exports_list = {0};\n    for (PE_ExportParseNode *exp_n = export_list.first, *exp_n_next; exp_n != 0; exp_n = exp_n_next) {\n      exp_n_next = exp_n->next;\n      if (exp_n->data.is_forwarder) {\n        pe_export_parse_list_push_node(&forwarder_exports_list, exp_n);\n      } else if (exp_n->data.is_noname_present) {\n        AssertAlways(exp_n->data.is_ordinal_assigned);\n        pe_export_parse_list_push_node(&ordinal_exports_list, exp_n);\n      } else {\n        pe_export_parse_list_push_node(&named_exports_list, exp_n);\n      }\n    }\n\n    // list -> array\n    named_exports = pe_array_from_export_list(arena, named_exports_list);\n    forwarder_exports = pe_array_from_export_list(arena, forwarder_exports_list);\n    ordinal_exports = pe_array_from_export_list(arena, ordinal_exports_list);\n\n    // sort exports\n    radsort(named_exports.v, named_exports.count, pe_named_export_is_before);\n    radsort(ordinal_exports.v, ordinal_exports.count, pe_ordinal_export_is_before);\n    radsort(forwarder_exports.v, forwarder_exports.count, pe_named_export_is_before);\n\n    MemoryZeroStruct(&export_list);\n    pe_export_parse_list_concat_in_place(&export_list, &named_exports_list);\n    pe_export_parse_list_concat_in_place(&export_list, &forwarder_exports_list);\n    pe_export_parse_list_concat_in_place(&export_list, &ordinal_exports_list);\n  }\n\n  // compute max ordinal and used ordinal flag array\n  U64 ordinal_low = max_U64;\n  B8 *is_ordinal_used = push_array(arena, B8, max_U16);\n  for (PE_ExportParseNode *exp_n = export_list.first; exp_n != 0; exp_n = exp_n->next) {\n    PE_ExportParse *exp = &exp_n->data;\n    if (exp->is_ordinal_assigned) {\n      ordinal_low = Min(ordinal_low, exp->ordinal);\n      is_ordinal_used[exp->ordinal] = 1;\n    }\n  }\n  if (ordinal_low == max_U64) {\n    ordinal_low = 1;\n  }\n\n  // assign omitted ordinals\n  {\n    U16 last_ordinal = ordinal_low;\n    for (U64 exp_idx = 0; exp_idx < named_exports.count; exp_idx += 1) {\n      PE_ExportParse *exp = named_exports.v[exp_idx];\n      if (!exp->is_ordinal_assigned) {\n        for (; last_ordinal < max_U16 && is_ordinal_used[last_ordinal] != 0; last_ordinal += 1);\n        exp->ordinal            = last_ordinal;\n        exp->is_ordinal_assigned = 1;\n        is_ordinal_used[last_ordinal] = 1;\n      }\n    }\n    for (U64 exp_idx = 0; exp_idx < forwarder_exports.count; exp_idx += 1) {\n      PE_ExportParse *exp = forwarder_exports.v[exp_idx];\n      if (!exp->is_ordinal_assigned) {\n        for (; last_ordinal < max_U16 && is_ordinal_used[last_ordinal] != 0; last_ordinal += 1);\n        exp->ordinal            = last_ordinal;\n        exp->is_ordinal_assigned = 1;\n        is_ordinal_used[last_ordinal] = 1;\n      }\n    }\n    for (U64 exp_idx = 0; exp_idx < ordinal_exports.count; exp_idx += 1) {\n      PE_ExportParse *exp = ordinal_exports.v[exp_idx];\n      if (!exp->is_ordinal_assigned) {\n        exp->ordinal             = last_ordinal;\n        exp->is_ordinal_assigned = 1;\n        is_ordinal_used[last_ordinal] = 1;\n      }\n    }\n  }\n\n  // assign hints\n  {\n    U64 hint = 0;\n    for (U64 exp_idx = 0; exp_idx < named_exports.count; exp_idx += 1, hint += 1) {\n      named_exports.v[exp_idx]->hint = hint;\n    }\n    for (U64 exp_idx = 0; exp_idx < forwarder_exports.count; exp_idx += 1, hint += 1) {\n      forwarder_exports.v[exp_idx]->hint = hint;\n    }\n  }\n\n  PE_FinalizedExports result = {0};\n  result.ordinal_low = ordinal_low;\n  result.named_exports = named_exports;\n  result.forwarder_exports = forwarder_exports;\n  result.ordinal_exports = ordinal_exports;\n\n  return result;\n}\n\ninternal String8\npe_make_edata_obj(Arena               *arena,\n                  String8              image_name,\n                  COFF_TimeStamp       time_stamp,\n                  COFF_MachineType     machine,\n                  PE_FinalizedExports  finalized_exports)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n\n  // push sections\n  COFF_ObjSection *voff_table_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".edata$2\"), PE_EDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_zero());\n  COFF_ObjSection *name_voff_table_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".edata$3\"), PE_EDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_zero());\n  COFF_ObjSection *ordinal_table_sect   = coff_obj_writer_push_section(obj_writer, str8_lit(\".edata$4\"), PE_EDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_zero());\n  COFF_ObjSection *string_table_sect    = coff_obj_writer_push_section(obj_writer, str8_lit(\".edata$5\"), PE_EDATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_zero());\n  COFF_ObjSection *image_name_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".edata$6\"), PE_EDATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, push_cstr(obj_writer->arena, image_name));\n\n  ProfBegin(\"Virtual Offset Table\");\n  {\n    B8 *is_ordinal_bound = push_array(scratch.arena, B8, max_U16);\n\n    for (U64 arr_idx = 0; arr_idx < ArrayCount(finalized_exports.all); arr_idx += 1) {\n      for (U64 exp_idx = 0; exp_idx < finalized_exports.all[arr_idx].count; exp_idx += 1) {\n        PE_ExportParse *exp = finalized_exports.all[arr_idx].v[exp_idx];\n        if (is_ordinal_bound[exp->ordinal] == 0) {\n          // alloc only one slot per ordinal, so it's possible to map ordinal to a virtual offset\n          is_ordinal_bound[exp->ordinal] = 1;\n\n          // create slot for the ordinal virtual offset\n          U64  voff_offset = voff_table_sect->data.total_size;\n          U32 *voff        = push_array(obj_writer->arena, U32, 1);\n          str8_list_push(obj_writer->arena, &voff_table_sect->data, str8_struct(voff));\n\n          COFF_ObjSymbol *exp_symbol;\n          if (exp->is_forwarder) {\n            U64     forwarder_name_offset = string_table_sect->data.total_size;\n            String8 forwarder_name_cstr   = push_cstr(obj_writer->arena, exp->name);\n            str8_list_push(obj_writer->arena, &string_table_sect->data, forwarder_name_cstr);\n            // symbol to the name string\n            exp_symbol = coff_obj_writer_push_symbol_static(obj_writer, exp->name, forwarder_name_offset, string_table_sect);\n          } else {\n            // function or global var symbol\n            exp_symbol = coff_obj_writer_push_symbol_undef(obj_writer, exp->name);\n          }\n\n          U16 ordinal_nb = exp->ordinal - finalized_exports.ordinal_low;\n          coff_obj_writer_section_push_reloc_voff(obj_writer, voff_table_sect, ordinal_nb*sizeof(U32), exp_symbol);\n        }\n      }\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Named & Forwarder Exports\");\n  {\n    for (U64 arr_idx = 0; arr_idx < ArrayCount(finalized_exports.exports_with_names); arr_idx += 1) {\n      PE_ExportParsePtrArray exports = finalized_exports.exports_with_names[arr_idx];\n      for (U64 exp_idx = 0; exp_idx < exports.count; exp_idx += 1) {\n        PE_ExportParse *exp = exports.v[exp_idx];\n\n        String8 name = pe_name_from_export_parse(exp);\n\n        // store symbol name string\n        U64     export_name_offset = string_table_sect->data.total_size;\n        String8 export_name_cstr   = push_cstr(obj_writer->arena, name);\n        str8_list_push(obj_writer->arena, &string_table_sect->data, export_name_cstr);\n\n        // create symbol for the name string\n        String8         export_name_symbol_name = push_str8f(obj_writer->arena, \"%S\", name);\n        COFF_ObjSymbol *export_name_symbol      = coff_obj_writer_push_symbol_static(obj_writer, export_name_symbol_name, export_name_offset, string_table_sect);\n\n        // create slot for export virtual offset\n        U64 export_name_voff_offset = name_voff_table_sect->data.total_size;\n        U8 *export_name_voff        = push_array(obj_writer->arena, U8, sizeof(U32));\n        str8_list_push(obj_writer->arena, &name_voff_table_sect->data, str8_array(export_name_voff, sizeof(U32)));\n\n        // write string's virtual offset\n        coff_obj_writer_section_push_reloc_voff(obj_writer, name_voff_table_sect, export_name_voff_offset, export_name_symbol);\n\n        // create and store export's ordinal\n        U16 *ordinal = push_array(obj_writer->arena, U16, 1);\n        *ordinal = exp->ordinal - finalized_exports.ordinal_low;\n        str8_list_push(obj_writer->arena, &ordinal_table_sect->data, str8_struct(ordinal));\n      }\n    }\n  }\n  ProfEnd();\n\n  ProfBegin(\"Ordinal Exports\");\n  {\n    for (U64 exp_idx = 0; exp_idx < finalized_exports.ordinal_exports.count; exp_idx += 1) {\n      // create and store export's ordinal\n      PE_ExportParse *exp = finalized_exports.ordinal_exports.v[exp_idx];\n      U16 *ordinal = push_array(obj_writer->arena, U16, 1);\n      *ordinal = exp->ordinal - finalized_exports.ordinal_low;\n      str8_list_push(obj_writer->arena, &ordinal_table_sect->data, str8_struct(ordinal));\n    }\n  }\n  ProfEnd();\n\n  // fill out export table header\n  PE_ExportTableHeader *header       = push_array(obj_writer->arena, PE_ExportTableHeader, 1);\n  header->time_stamp                 = time_stamp;\n  header->ordinal_base               = safe_cast_u16(finalized_exports.ordinal_low);\n  header->export_address_table_count = safe_cast_u32(voff_table_sect->data.node_count);\n  header->name_pointer_table_count   = safe_cast_u32(name_voff_table_sect->data.node_count);\n\n  // push header field's symbols\n  COFF_ObjSymbol *image_name_symbol    = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"EXPORT_HEADER_NAME_VOFF\"),          0, image_name_sect);\n  COFF_ObjSymbol *address_table_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"EXPORT_HEADER_ADDRESS_TABLE_VOFF\"), 0, voff_table_sect);\n  COFF_ObjSymbol *name_table_symbol    = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"EXPORT_HEADER_NAME_POINTER_VOFF\"),  0, name_voff_table_sect);\n  COFF_ObjSymbol *ordinal_table_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"EXPORT_HEADER_ORDINAL_TABLE_VOFF\"), 0, ordinal_table_sect);\n\n  // push export table header section\n  COFF_ObjSection *header_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".edata$1\"), PE_EDATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_struct(header));\n  coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"EXPORT_TABLE_HEADER\"), 0, header_sect);\n\n  // patch export table header\n  coff_obj_writer_section_push_reloc_voff(obj_writer, header_sect, OffsetOf(PE_ExportTableHeader, name_voff),                 image_name_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, header_sect, OffsetOf(PE_ExportTableHeader, export_address_table_voff), address_table_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, header_sect, OffsetOf(PE_ExportTableHeader, name_pointer_table_voff),   name_table_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, header_sect, OffsetOf(PE_ExportTableHeader, ordinal_table_voff),        ordinal_table_symbol);\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  scratch_end(scratch);\n  return obj;\n}\n\ninternal String8\npe_make_import_lib(Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, String8 debug_symbols, PE_ExportParseList export_list)\n{\n  ProfBeginFunction();\n\n  COFF_LibWriter *lib_writer = coff_lib_writer_alloc();\n\n  // These objects appear in first three members of any lib that linker produces with /dll.\n  // Objects are used by MSVC linker to build import table.\n  String8 import_entry_obj = pe_make_import_entry_obj(lib_writer->arena, dll_name, time_stamp, machine, debug_symbols);\n  String8 null_import_descriptor_obj = pe_make_null_import_descriptor_obj(lib_writer->arena, time_stamp, machine, debug_symbols);\n  String8 null_thunk_data_obj = pe_make_null_thunk_data_obj(lib_writer->arena, dll_name, time_stamp, machine, debug_symbols);\n\n  // push import table nulls\n  coff_lib_writer_push_obj(lib_writer, dll_name, import_entry_obj);\n  coff_lib_writer_push_obj(lib_writer, dll_name, null_import_descriptor_obj);\n  coff_lib_writer_push_obj(lib_writer, dll_name, null_thunk_data_obj);\n\n  // push exports\n  for (PE_ExportParseNode *exp_n = export_list.first; exp_n != 0; exp_n = exp_n->next) {\n    PE_ExportParse *exp = &exp_n->data;\n    if (exp->is_private) {\n      continue;\n    }\n    String8 name = pe_name_from_export_parse(exp);\n    U16 hint_or_ordinal = pe_hint_or_ordinal_from_export_parse(exp);\n    coff_lib_writer_push_import(lib_writer, machine, time_stamp, dll_name, exp->import_by, name, hint_or_ordinal, exp->type);\n  }\n\n  // serialize lib\n  String8 lib = coff_lib_writer_serialize(arena, lib_writer, COFF_TimeStamp_Max, 0, /* emit second member: */ 1);\n  coff_lib_writer_release(&lib_writer);\n  \n  ProfEnd();\n  return lib;\n}\n"
  },
  {
    "path": "src/pe/pe_make_export_table.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef PE_MAKE_EXPORT_TABLE_H\n#define PE_MAKE_EXPORT_TABLE_H\n\ntypedef struct PE_ExportParse\n{\n  String8           obj_path;\n  String8           lib_path;\n  String8           name;\n  String8           alias;\n  COFF_ImportType   type;\n  COFF_ImportByType import_by;\n  U16               hint;\n  U16               ordinal;\n  B32               is_ordinal_assigned;\n  B32               is_noname_present;\n  B32               is_private;\n  B32               is_forwarder;\n} PE_ExportParse;\n\ntypedef struct PE_ExportParseNode\n{\n  PE_ExportParse             data;\n  struct PE_ExportParseNode *next;\n} PE_ExportParseNode;\n\ntypedef struct PE_ExportParseList\n{\n  U64                  count;\n  PE_ExportParseNode *first;\n  PE_ExportParseNode *last;\n} PE_ExportParseList;\n\ntypedef struct PE_ExportParsePtrArray\n{\n  U64               count;\n  PE_ExportParse **v;\n} PE_ExportParsePtrArray;\n\ntypedef struct PE_FinalizedExports\n{\n  U64 ordinal_low;\n  union {\n    struct {\n      PE_ExportParsePtrArray named_exports;\n      PE_ExportParsePtrArray forwarder_exports;\n      PE_ExportParsePtrArray ordinal_exports;\n    };\n    PE_ExportParsePtrArray exports_with_names[2];\n    PE_ExportParsePtrArray all[3];\n  };\n} PE_FinalizedExports;\n\n////////////////////////////////\n\ninternal PE_ExportParsePtrArray pe_array_from_export_list(Arena *arena, PE_ExportParseList list);\ninternal PE_ExportParseNode * pe_export_parse_list_push(Arena *arena, PE_ExportParseList *list, PE_ExportParse data);\ninternal String8 pe_make_import_lib(Arena *arena, COFF_MachineType machine, COFF_TimeStamp time_stamp, String8 dll_name, String8 debug_symbols, PE_ExportParseList export_list);\n\n#endif // COFF_EXPORT_TABLE_H\n"
  },
  {
    "path": "src/pe/pe_make_import_table.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal void\npe_make_import_header_list_push_node(PE_MakeImportList *list, PE_MakeImportNode *node)\n{\n  SLLQueuePush(list->first, list->last, node);\n  list->count += 1;\n}\n\ninternal PE_MakeImportNode *\npe_make_import_header_list_push(Arena *arena, PE_MakeImportList *list, PE_MakeImport v)\n{\n  PE_MakeImportNode *node = push_array(arena, PE_MakeImportNode, 1);\n  node->v = v;\n  pe_make_import_header_list_push_node(list, node);\n  return node;\n}\n\ninternal COFF_ObjSymbol *\npe_make_indirect_jump_thunk_x64(COFF_ObjWriter *obj_writer, COFF_ObjSection *code_sect, COFF_ObjSymbol *iat_symbol, String8 thunk_name)\n{\n  ProfBeginFunction();\n  \n  static U8 thunk[] = { 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00 }; // jmp [__imp_<FUNC_NAME>]\n  \n  // emit chunk\n  String8 jmp_data        = push_str8_copy(obj_writer->arena, str8_array_fixed(thunk));\n  U64     jmp_data_offset = code_sect->data.total_size;\n  str8_list_push(obj_writer->arena, &code_sect->data, jmp_data);\n  \n  // patch thunk with imports address\n  static const U64 JMP_OPERAND_OFFSET = 2;\n  coff_obj_writer_section_push_reloc(obj_writer, code_sect, jmp_data_offset + JMP_OPERAND_OFFSET, iat_symbol, COFF_Reloc_X64_Rel32); \n  \n  COFF_ObjSymbol *jmp_thunk_symbol = coff_obj_writer_push_symbol_extern_func(obj_writer, thunk_name, jmp_data_offset, code_sect);\n\n  ProfEnd();\n  return jmp_thunk_symbol;\n}\n\ninternal COFF_ObjSymbol *\npe_make_load_thunk_x64(COFF_ObjWriter *obj_writer, COFF_ObjSection *code_sect, COFF_ObjSymbol *imp_addr_ptr, COFF_ObjSymbol *tail_merge, String8 func_name)\n{\n  ProfBeginFunction();\n  \n  static U8 load_thunk[] = {\n    0x48, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00,  // lea rax, [__imp_<FUNC_NAME>]\n    0xE9, 0x00, 0x00, 0x00, 0x00               // jmp __tailMerge_<DLL_NAME>\n  };\n  \n  // emit load thunk chunk\n  U64     load_thunk_data_offset = code_sect->data.total_size;\n  String8 load_thunk_data        = push_str8_copy(obj_writer->arena, str8_array_fixed(load_thunk));\n  str8_list_push(obj_writer->arena, &code_sect->data, load_thunk_data);\n  \n  // patch lea with IAT entry\n  static const U64 LEA_OPERAND_OFFSET = 3;\n  coff_obj_writer_section_push_reloc(obj_writer, code_sect, load_thunk_data_offset + LEA_OPERAND_OFFSET, imp_addr_ptr, COFF_Reloc_X64_Rel32);\n  \n  // patch jmp __tailMerge_<DLL_NAME>\n  static const U64 JMP_OPERAND_OFFSET = 8;\n  coff_obj_writer_section_push_reloc(obj_writer, code_sect, load_thunk_data_offset + JMP_OPERAND_OFFSET, tail_merge, COFF_Reloc_X64_Rel32);\n\n  // emit symbol\n  String8         thunk_name        = push_str8f(obj_writer->arena, \"__imp_load_%S\", func_name);\n  COFF_ObjSymbol *load_thunk_symbol = coff_obj_writer_push_symbol_extern_func(obj_writer, thunk_name, load_thunk_data_offset, code_sect);\n  \n  ProfEnd();\n  return load_thunk_symbol;\n}\n\ninternal COFF_ObjSymbol *\npe_make_tail_merge_thunk_x64(COFF_ObjWriter *obj_writer, COFF_ObjSection *code_sect, String8 dll_name, String8 delay_load_helper_name, COFF_ObjSymbol *dll_import_descriptor)\n{\n  ProfBeginFunction();\n  \n  static U8 tail_merge[] = {\n    0x48, 0x89, 0x4C, 0x24, 0x08,                   // mov         qword ptr [rsp+8],rcx  \n    0x48, 0x89, 0x54, 0x24, 0x10,                   // mov         qword ptr [rsp+10h],rdx  \n    0x4C, 0x89, 0x44, 0x24, 0x18,                   // mov         qword ptr [rsp+18h],r8  \n    0x4C, 0x89, 0x4C, 0x24, 0x20,                   // mov         qword ptr [rsp+20h],r9  \n    0x48, 0x83, 0xEC, 0x68,                         // sub         rsp,68h  \n    0x66, 0x0F, 0x7F, 0x44, 0x24, 0x20,             // movdqa      xmmword ptr [rsp+20h],xmm0  \n    0x66, 0x0F, 0x7F, 0x4C, 0x24, 0x30,             // movdqa      xmmword ptr [rsp+30h],xmm1  \n    0x66, 0x0F, 0x7F, 0x54, 0x24, 0x40,             // movdqa      xmmword ptr [rsp+40h],xmm2  \n    0x66, 0x0F, 0x7F, 0x5C, 0x24, 0x50,             // movdqa      xmmword ptr [rsp+50h],xmm3  \n    0x48, 0x8B, 0xD0,                               // mov         rdx,rax  \n    0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00,       // lea         rcx,[__DELAY_IMPORT_DESCRIPTOR_<DLL_NAME>]  \n    0xE8, 0x00, 0x00, 0x00, 0x00,                   // call        __delayLoadHelper2\n    0x66, 0x0F, 0x6F, 0x44, 0x24, 0x20,             // movdqa      xmm0,xmmword ptr [rsp+20h]  \n    0x66, 0x0F, 0x6F, 0x4C, 0x24, 0x30,             // movdqa      xmm1,xmmword ptr [rsp+30h]  \n    0x66, 0x0F, 0x6F, 0x54, 0x24, 0x40,             // movdqa      xmm2,xmmword ptr [rsp+40h]  \n    0x66, 0x0F, 0x6F, 0x5C, 0x24, 0x50,             // movdqa      xmm3,xmmword ptr [rsp+50h]  \n    0x48, 0x8B, 0x4C, 0x24, 0x70,                   // mov         rcx,qword ptr [rsp+70h]  \n    0x48, 0x8B, 0x54, 0x24, 0x78,                   // mov         rdx,qword ptr [rsp+78h]  \n    0x4C, 0x8B, 0x84, 0x24, 0x80, 0x00, 0x00, 0x00, // mov         r8,qword ptr [rsp+80h]  \n    0x4C, 0x8B, 0x8C, 0x24, 0x88, 0x00, 0x00, 0x00, // mov         r9,qword ptr [rsp+88h]  \n    0x48, 0x83, 0xC4, 0x68,                         // add         rsp,68h  \n    0xFF, 0xE0,                                     // jmp         rax\n  };\n  \n  // emit tail merge chunk\n  String8 tail_merge_data = push_str8_copy(obj_writer->arena, str8_array_fixed(tail_merge));\n  U64     tail_merge_off  = code_sect->data.total_size;\n  str8_list_push(obj_writer->arena, &code_sect->data, tail_merge_data);\n  \n  // patch lea __DELAY_IMPORT_DESCRIPTOR_<DLL_NAME>\n  static const U64 LEA_OPERAND_OFFSET = 54;\n  coff_obj_writer_section_push_reloc(obj_writer, code_sect, tail_merge_off + LEA_OPERAND_OFFSET, dll_import_descriptor, COFF_Reloc_X64_Rel32);\n\n  COFF_ObjSymbol *delay_load_helper = coff_obj_writer_push_symbol_undef(obj_writer, delay_load_helper_name);\n  \n  // patch call __delayLoadHelper2\n  static const U64 CALL_OPERAND_OFFSET = 59;\n  coff_obj_writer_section_push_reloc(obj_writer, code_sect, tail_merge_off + CALL_OPERAND_OFFSET, delay_load_helper, COFF_Reloc_X64_Rel32);\n\n  // emit symbol\n  String8 tail_merge_name = push_str8f(obj_writer->arena, \"__tailMerge_%S\", dll_name);\n  COFF_ObjSymbol *tail_merge_symbol = coff_obj_writer_push_symbol_extern(obj_writer, tail_merge_name, tail_merge_off, code_sect);\n  \n  ProfEnd();\n  return tail_merge_symbol;\n}\n\ninternal String8\npe_make_import_entry_obj_delayed(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n  String8 dll_name_cstr = push_cstr(arena, dll_name);\n  PE_DelayedImportEntry *null_import_entry = push_array(obj_writer->arena, PE_DelayedImportEntry, 1);\n  COFF_ObjSection *debugs = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *didat2 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$2\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_struct(null_import_entry));\n  COFF_ObjSection *didat6 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$6\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, dll_name_cstr);\n  coff_obj_writer_push_symbol_extern(obj_writer, push_str8f(obj_writer->arena, \"__DELAY_IMPORT_DESCRIPTOR_%S\", dll_name), 0, didat2);\n  coff_obj_writer_push_symbol_sect(obj_writer, didat2->name, didat2);\n  coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"__NULL_DELAY_IMPORT_DESCRIPTOR\"));\n  coff_obj_writer_push_symbol_undef(obj_writer, push_str8f(obj_writer->arena, \"\\x7f%S_NULL_THUNK_DATA_DLA\", dll_name));\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\npe_make_null_import_descriptor_delayed(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n  PE_DelayedImportEntry *import_desc = push_array(obj_writer->arena, PE_DelayedImportEntry, 1);\n  COFF_ObjSection *debugs = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *didat3 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$3\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_struct(import_desc));\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"__NULL_DELAY_IMPORT_DESCRIPTOR\"), 0, didat3);\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\npe_make_null_thunk_data_obj_delayed(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n  String8 dll_name_cstr = push_cstr(obj_writer->arena, dll_name);\n  U64 import_size = coff_word_size_from_machine(machine);\n  String8 null_thunk = str8(push_array(obj_writer->arena, U8, import_size), import_size);\n  String8 null_lookup = str8(push_array(obj_writer->arena, U8, import_size), import_size);\n  COFF_ObjSection *debugs = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *didat4 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$4\"), PE_IDATA_SECTION_FLAGS|coff_section_flag_from_align_size(import_size), null_lookup);\n  COFF_ObjSection *didat5 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$5\"), PE_IDATA_SECTION_FLAGS|coff_section_flag_from_align_size(import_size), null_thunk);\n  COFF_ObjSection *didat8 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$8\"), PE_IDATA_SECTION_FLAGS|coff_section_flag_from_align_size(import_size), null_thunk);\n  COFF_ObjSection *didat9 = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$9\"), PE_IDATA_SECTION_FLAGS|coff_section_flag_from_align_size(import_size), null_thunk);\n  coff_obj_writer_push_symbol_extern(obj_writer, push_str8f(obj_writer->arena, \"\\x7f%S_NULL_THUNK_DATA_DLA\", dll_name), 0, didat5);\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\npe_make_import_entry_obj(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n  String8 dll_name_cstr = push_cstr(obj_writer->arena, dll_name);\n  PE_ImportEntry *null_import_entry = push_array(obj_writer->arena, PE_ImportEntry, 1);\n  COFF_ObjSection *debugs = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *idata2 = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$2\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_struct(null_import_entry));\n  COFF_ObjSection *idata6 = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$6\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, dll_name_cstr);\n  coff_obj_writer_push_symbol_extern(obj_writer, push_str8f(obj_writer->arena, \"__IMPORT_DESCRIPTOR_%S\", dll_name), 0, idata2);\n  coff_obj_writer_push_symbol_sect(obj_writer, idata2->name, idata2);\n\n  COFF_ObjSymbol *null_desc_undef = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"__NULL_IMPORT_DESCRIPTOR\"));\n  COFF_ObjSymbol *null_thunk_undef = coff_obj_writer_push_symbol_undef(obj_writer, push_str8f(arena, \"\\x7f%S_NULL_THUNK_DATA\", dll_name));\n\n  COFF_ObjSymbol *idata6_symbol = coff_obj_writer_push_symbol_static(obj_writer, idata6->name, 0, idata6);\n  COFF_ObjSymbol *idata4_symbol = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(\".idata$4\"), COFF_SectionFlag_MemWrite|COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData);\n  COFF_ObjSymbol *idata5_symbol = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(\".idata$5\"), COFF_SectionFlag_MemWrite|COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, idata2, OffsetOf(PE_ImportEntry, name_voff),              idata6_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, idata2, OffsetOf(PE_ImportEntry, lookup_table_voff),      idata4_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, idata2, OffsetOf(PE_ImportEntry, import_addr_table_voff), idata5_symbol);\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\npe_make_null_import_descriptor_obj(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n  PE_ImportEntry *import_desc = push_array(obj_writer->arena, PE_ImportEntry, 1);\n  COFF_ObjSection *debugs = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *idata3 = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$3\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_struct(import_desc));\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"__NULL_IMPORT_DESCRIPTOR\"), 0, idata3);\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\npe_make_null_thunk_data_obj(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols)\n{\n  ProfBeginFunction();\n\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n  U64 import_size = coff_word_size_from_machine(machine);\n  String8 null_lookup = str8(push_array(obj_writer->arena, U8, import_size), import_size);\n  String8 null_thunk = str8(push_array(obj_writer->arena, U8, import_size), import_size);\n  COFF_ObjSection *debugs = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *idata4 = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$4\"), PE_IDATA_SECTION_FLAGS|coff_section_flag_from_align_size(import_size), null_lookup);\n  COFF_ObjSection *idata5 = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$5\"), PE_IDATA_SECTION_FLAGS|coff_section_flag_from_align_size(import_size), null_thunk);\n  coff_obj_writer_push_symbol_extern(obj_writer, push_str8f(obj_writer->arena, \"\\x7f%S_NULL_THUNK_DATA\", dll_name), 0, idata5);\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n\n  ProfEnd();\n  return obj;\n}\n\ninternal String8\npe_make_import_dll_obj_static(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 dll_name, String8 debug_symbols, PE_MakeImportList import_headers)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n\n  U64 import_size = coff_word_size_from_machine(machine);\n  COFF_SectionFlags import_align = coff_section_flag_from_align_size(import_size);\n\n  PE_ImportEntry *impdesc = push_array(obj_writer->arena, PE_ImportEntry, 1);\n  String8 dll_name_cstr = push_cstr(obj_writer->arena, dll_name);\n\n  COFF_ObjSection *dll_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$2\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes,  str8_struct(impdesc));\n  COFF_ObjSection *ilt_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$4\"), PE_IDATA_SECTION_FLAGS|import_align,                  str8_zero());\n  COFF_ObjSection *iat_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$5\"), PE_IDATA_SECTION_FLAGS|import_align,                  str8_zero());\n  COFF_ObjSection *int_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$6\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes,  str8_zero());\n  COFF_ObjSection *dll_name_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".idata$7\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes,  dll_name_cstr);\n  COFF_ObjSection *code_sect     = coff_obj_writer_push_section(obj_writer, str8_lit(\".text$zz\"), PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes,   str8_zero());\n\n  COFF_ObjSymbol *ilt_symbol      = coff_obj_writer_push_symbol_static(obj_writer, ilt_sect->name,      0, ilt_sect);\n  COFF_ObjSymbol *iat_symbol      = coff_obj_writer_push_symbol_static(obj_writer, iat_sect->name,      0, iat_sect);\n  COFF_ObjSymbol *dll_name_symbol = coff_obj_writer_push_symbol_static(obj_writer, dll_name_sect->name, 0, dll_name_sect);\n\n  // patch import DLL header\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_ImportEntry, lookup_table_voff),      ilt_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_ImportEntry, name_voff),              dll_name_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_ImportEntry, import_addr_table_voff), iat_symbol);\n\n  for (PE_MakeImportNode *import_header_n = import_headers.first; import_header_n != 0; import_header_n = import_header_n->next) {\n    COFF_ParsedArchiveImportHeader import_header = coff_archive_import_from_data(import_header_n->v.header);\n\n    COFF_ObjSymbol *iat_symbol = 0;\n    switch (import_header.import_by) {\n    case COFF_ImportBy_Ordinal: {\n      String8 ordinal_data = coff_ordinal_data_from_hint(obj_writer->arena, import_header.machine, import_header.hint_or_ordinal);\n      String8 iat_symbol_name = push_str8f(obj_writer->arena, \"__imp_%S\", import_header.func_name);\n      iat_symbol = coff_obj_writer_push_symbol_extern(obj_writer, iat_symbol_name, iat_sect->data.total_size, iat_sect);\n      str8_list_push(obj_writer->arena, &ilt_sect->data, ordinal_data);\n      str8_list_push(obj_writer->arena, &iat_sect->data, ordinal_data);\n    } break;\n    case COFF_ImportBy_Name: {\n      // put together name look up entry\n      COFF_ObjSymbol *int_symbol = coff_obj_writer_push_symbol_static(obj_writer, int_sect->name, int_sect->data.total_size, int_sect);\n      String8 int_data = coff_make_import_lookup(obj_writer->arena, import_header.hint_or_ordinal, import_header.func_name);\n      str8_list_push(obj_writer->arena, &int_sect->data, int_data);\n\n      // in the file IAT mirrors ILT, dynamic linker later overwrites it with imported function addresses\n      String8 iat_symbol_name = push_str8f(obj_writer->arena, \"__imp_%S\", import_header.func_name);\n      iat_symbol = coff_obj_writer_push_symbol_extern(obj_writer, iat_symbol_name, iat_sect->data.total_size, iat_sect);\n\n      // patch IAT and ILT\n      coff_obj_writer_section_push_reloc_voff(obj_writer, ilt_sect, ilt_sect->data.total_size, int_symbol);\n      coff_obj_writer_section_push_reloc_voff(obj_writer, iat_sect, iat_sect->data.total_size, int_symbol);\n\n      U64 import_size  = coff_word_size_from_machine(import_header.machine);\n      U8 *import_entry = push_array(obj_writer->arena, U8, import_size);\n      str8_list_push(obj_writer->arena, &ilt_sect->data, str8_array(import_entry, import_size));\n      str8_list_push(obj_writer->arena, &iat_sect->data, str8_array(import_entry, import_size));\n    } break;\n    case COFF_ImportBy_Undecorate: { NotImplemented; } break;\n    case COFF_ImportBy_NameNoPrefix: { NotImplemented; } break;\n    default: { InvalidPath; } break;\n    }\n\n    // emit thunks\n    if (import_header_n->v.make_jump_thunk) {\n      if (import_header.type == COFF_ImportHeader_Code) {\n        switch (import_header.machine) {\n        case COFF_MachineType_Unknown: {} break;\n        case COFF_MachineType_X64: { pe_make_indirect_jump_thunk_x64(obj_writer, code_sect, iat_symbol, import_header.func_name); } break;\n        default: { NotImplemented; } break;\n        }\n      } else {\n        Assert(0 && \"unable to make a jump thunk for non-code target\");\n      }\n    }\n  }\n\n  str8_list_push(obj_writer->arena, &ilt_sect->data, str8(0, coff_word_size_from_machine(machine)));\n  str8_list_push(obj_writer->arena, &iat_sect->data, str8(0, coff_word_size_from_machine(machine)));\n\n  String8 dll_obj = coff_obj_writer_serialize(arena, obj_writer);\n\n  coff_obj_writer_release(&obj_writer);\n  return dll_obj;\n}\n\ninternal String8\npe_make_import_dll_obj_delayed(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 dll_name, String8 delay_load_helper_name, String8 debug_symbols, PE_MakeImportList import_headers, B32 emit_biat, B32 emit_uiat)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(time_stamp, machine);\n\n  // import descriptor\n  PE_DelayedImportEntry *impdesc = push_array(obj_writer->arena, PE_DelayedImportEntry, 1);\n  impdesc->attributes = 1;\n\n  // DLL name cstring\n  String8 dll_name_cstr = push_cstr(obj_writer->arena, dll_name);\n\n  // DLL handle\n  U64 handle_size = coff_word_size_from_machine(machine);\n  U8 *handle = push_array(obj_writer->arena, U8, handle_size);\n\n  // import align\n  U64 import_size = coff_word_size_from_machine(machine);\n  COFF_SectionFlags import_align = coff_section_flag_from_align_size(import_size);\n\n  // push sections\n  COFF_ObjSection *dll_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$2\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_struct(impdesc));\n  COFF_ObjSection *ilt_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$4\"), PE_IDATA_SECTION_FLAGS|import_align,                 str8_zero());\n  COFF_ObjSection *iat_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$5\"), PE_IDATA_SECTION_FLAGS|import_align,                 str8_zero());\n  COFF_ObjSection *int_sect      = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$6\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_zero());\n  COFF_ObjSection *dll_name_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$7\"), PE_IDATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, dll_name_cstr);\n  COFF_ObjSection *code_sect     = coff_obj_writer_push_section(obj_writer, str8_lit(\".text$\"),  PE_TEXT_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes,  str8_zero());\n  COFF_ObjSection *handle_sect   = coff_obj_writer_push_section(obj_writer, str8_lit(\".data$\"),  PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes,  str8_array(handle, handle_size));\n  COFF_ObjSection *debug_sect    = coff_obj_writer_push_section(obj_writer, str8_lit(\".debug$S\"), PE_DEBUG_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, debug_symbols);\n  COFF_ObjSection *biat_sect     = 0;\n  COFF_ObjSection *uiat_sect     = 0;\n\n  // sections symbols\n  COFF_ObjSymbol *dll_symbol      = coff_obj_writer_push_symbol_static(obj_writer, dll_sect->name,      0, dll_sect);\n  COFF_ObjSymbol *dll_name_symbol = coff_obj_writer_push_symbol_static(obj_writer, dll_name_sect->name, 0, dll_name_sect);\n  COFF_ObjSymbol *handle_symbol   = coff_obj_writer_push_symbol_static(obj_writer, handle_sect->name,   0, handle_sect);\n  COFF_ObjSymbol *iat_symbol      = coff_obj_writer_push_symbol_static(obj_writer, iat_sect->name,      0, iat_sect);\n  COFF_ObjSymbol *ilt_symbol      = coff_obj_writer_push_symbol_static(obj_writer, ilt_sect->name,      0, ilt_sect);\n\n  // patch virutal offsets in import header\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_DelayedImportEntry, name_voff),          dll_name_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_DelayedImportEntry, module_handle_voff), handle_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_DelayedImportEntry, iat_voff),           iat_symbol);\n  coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_DelayedImportEntry, name_table_voff),    ilt_symbol);\n\n  // patch BIAT virtual offset in import header\n  if (emit_biat) {\n    biat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$8\"), PE_IDATA_SECTION_FLAGS|import_align, str8_zero());\n    COFF_ObjSymbol *biat_symbol = coff_obj_writer_push_symbol_static(obj_writer, biat_sect->name, 0, biat_sect);\n    coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_DelayedImportEntry, bound_table_voff), biat_symbol);\n  }\n\n  // patch UIAT virtual offset in import header\n  if (emit_uiat) {\n    uiat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".didat$9\"), PE_IDATA_SECTION_FLAGS|import_align, str8_zero());\n    COFF_ObjSymbol *uiat_symbol = coff_obj_writer_push_symbol_static(obj_writer, uiat_sect->name, 0, uiat_sect);\n    coff_obj_writer_section_push_reloc_voff(obj_writer, dll_sect, OffsetOf(PE_DelayedImportEntry, unload_table_voff), uiat_symbol);\n  }\n  \n  // emit tail merge\n  COFF_ObjSymbol *tail_merge_symbol = 0;\n  switch (machine) {\n  case COFF_MachineType_Unknown: {} break;\n  case COFF_MachineType_X64:     { tail_merge_symbol = pe_make_tail_merge_thunk_x64(obj_writer, code_sect, dll_name, delay_load_helper_name, dll_symbol); } break;\n  default:                       { NotImplemented; } break;\n  }\n\n  for (PE_MakeImportNode *import_header_n = import_headers.first; import_header_n != 0; import_header_n = import_header_n->next) {\n    COFF_ParsedArchiveImportHeader import_header = coff_archive_import_from_data(import_header_n->v.header);\n\n    // emit thunks\n    COFF_ObjSymbol *load_thunk_symbol = 0;\n    if (import_header.type == COFF_ImportHeader_Code) {\n      switch (machine) {\n      case COFF_MachineType_Unknown: {} break;\n      case COFF_MachineType_X64: {\n        String8 iat_symbol_name = push_str8f(obj_writer->arena, \"__imp_%S\", import_header.func_name);\n        iat_symbol = coff_obj_writer_push_symbol_extern(obj_writer, iat_symbol_name, iat_sect->data.total_size, iat_sect);\n\n        if (import_header_n->v.make_jump_thunk) {\n          pe_make_indirect_jump_thunk_x64(obj_writer, code_sect, iat_symbol, import_header.func_name);\n        }\n\n        // emit load thunk\n        load_thunk_symbol = pe_make_load_thunk_x64(obj_writer, code_sect, iat_symbol, tail_merge_symbol, import_header.func_name);\n      } break;\n      default: { NotImplemented; } break;\n      }\n    }\n\n    switch (import_header.import_by) {\n    case COFF_ImportBy_Ordinal: {\n      String8 ordinal_data = coff_ordinal_data_from_hint(obj_writer->arena, import_header.machine, import_header.hint_or_ordinal);\n      str8_list_push(obj_writer->arena, &ilt_sect->data, ordinal_data);\n\n      // in the file IAT mirrors ILT, dynamic linker later overwrites it with imported function addresses.\n      U64 iat_offset = iat_sect->data.total_size;\n      str8_list_push(obj_writer->arena, &iat_sect->data, str8(0, import_size));\n\n      // patch-in thunk address\n      coff_obj_writer_section_push_reloc_addr(obj_writer, iat_sect, iat_offset, load_thunk_symbol);\n\n      if (emit_biat) {\n        U64 import_size = coff_word_size_from_machine(machine);\n        U64 biat_offset = biat_sect->data.total_size;\n        str8_list_push(obj_writer->arena, &biat_sect->data, str8(0,import_size));\n        coff_obj_writer_section_push_reloc_addr(obj_writer, biat_sect, biat_offset, load_thunk_symbol);\n      }\n      if (emit_uiat) {\n        U64 import_size = coff_word_size_from_machine(machine);\n        U64 uiat_offset = uiat_sect->data.total_size;\n        str8_list_push(obj_writer->arena, &biat_sect->data, str8(0,import_size));\n        coff_obj_writer_section_push_reloc_addr(obj_writer, uiat_sect, uiat_offset, load_thunk_symbol);\n      }\n    } break;\n    case COFF_ImportBy_Name: {\n      // put together name look up entry\n      String8 int_data = coff_make_import_lookup(obj_writer->arena, import_header.hint_or_ordinal, import_header.func_name);\n      U64 int_data_offset = int_sect->data.total_size;\n      str8_list_push(obj_writer->arena, &int_sect->data, int_data);\n\n      // create symbol for lookup chunk\n      String8 int_symbol_name = push_str8f(obj_writer->arena, \"%S.%S.name.delayed\", dll_name, import_header.func_name);\n      COFF_ObjSymbol *int_symbol = coff_obj_writer_push_symbol_static(obj_writer, int_symbol_name, int_data_offset, int_sect);\n\n      U64 import_size = coff_word_size_from_machine(machine);\n\n      // dynamic linker patches this voff on DLL load event\n      U64 ilt_data_offset = ilt_sect->data.total_size;\n      str8_list_push(obj_writer->arena, &ilt_sect->data, str8(0, import_size));\n\n      // patch-in ILT with import voff\n      coff_obj_writer_section_push_reloc_voff(obj_writer, ilt_sect, ilt_data_offset, int_symbol);\n\n      // in the file IAT mirrors ILT, dynamic linker later overwrites it with imported function addresses.\n      U64 iat_offset = iat_sect->data.total_size;\n      str8_list_push(obj_writer->arena, &iat_sect->data, str8(0, import_size));\n\n      // patch-in thunk address\n      coff_obj_writer_section_push_reloc_addr(obj_writer, iat_sect, iat_offset, load_thunk_symbol);\n\n      if (emit_biat) {\n        U64 biat_data_offset = biat_sect->data.total_size;\n        str8_list_push(obj_writer->arena, &biat_sect->data, str8(0, import_size));\n\n        // patch-in thunk address\n        coff_obj_writer_section_push_reloc_addr(obj_writer, biat_sect, biat_data_offset, load_thunk_symbol);\n      }\n\n      if (emit_uiat) {\n        U64 uiat_data_offset = uiat_sect->data.total_size;\n        str8_list_push(obj_writer->arena, &uiat_sect->data, str8(0, import_size));\n\n        // patch-in thunk address\n        coff_obj_writer_section_push_reloc_addr(obj_writer, uiat_sect, uiat_data_offset, load_thunk_symbol);\n      }\n    } break;\n    case COFF_ImportBy_Undecorate: { NotImplemented; } break;\n    case COFF_ImportBy_NameNoPrefix: { NotImplemented; } break;\n    }\n  }\n\n  str8_list_push(obj_writer->arena, &ilt_sect->data, str8(0, coff_word_size_from_machine(machine)));\n  str8_list_push(obj_writer->arena, &iat_sect->data, str8(0, coff_word_size_from_machine(machine)));\n  if (emit_biat) {\n    str8_list_push(obj_writer->arena, &biat_sect->data, str8(0, coff_word_size_from_machine(machine)));\n  }\n  if (emit_uiat) {\n    str8_list_push(obj_writer->arena, &uiat_sect->data, str8(0, coff_word_size_from_machine(machine)));\n  }\n\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n  return obj;\n}\n"
  },
  {
    "path": "src/pe/pe_make_import_table.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef PE_MAKE_IMPORT_TABLE_H\n#define PE_MAKE_IMPORT_TABLE_H\n\ntypedef struct PE_MakeImport\n{\n  String8 header;\n  B32     make_jump_thunk;\n} PE_MakeImport;\n\ntypedef struct PE_MakeImportNode\n{\n  PE_MakeImport             v;\n  struct PE_MakeImportNode *next;\n} PE_MakeImportNode;\n\ntypedef struct PE_MakeImportList\n{\n  U64                      count;\n  PE_MakeImportNode *first;\n  PE_MakeImportNode *last;\n} PE_MakeImportList;\n\n// -----------------------------------------------------------------------------\n\ninternal void                pe_make_import_header_list_push_node(PE_MakeImportList *list, PE_MakeImportNode *node);\ninternal PE_MakeImportNode * pe_make_import_header_list_push(Arena *arena, PE_MakeImportList *list, PE_MakeImport header);\n\ninternal COFF_ObjSymbol * pe_make_indirect_jump_thunk_x64(COFF_ObjWriter *obj_writer, COFF_ObjSection *code_sect, COFF_ObjSymbol *iat_symbol, String8 thunk_name);\ninternal COFF_ObjSymbol * pe_make_load_thunk_x64(COFF_ObjWriter *obj_writer, COFF_ObjSection *code_sect, COFF_ObjSymbol *imp_addr_ptr, COFF_ObjSymbol *tail_merge, String8 func_name);\ninternal COFF_ObjSymbol * pe_make_tail_merge_thunk_x64(COFF_ObjWriter *obj_writer, COFF_ObjSection *code_sect, String8 dll_name, String8 delay_load_helper_name, COFF_ObjSymbol *dll_import_descriptor);\n\ninternal String8 pe_make_import_dll_obj_static(Arena *arena, COFF_TimeStamp time_stmap, COFF_MachineType machine, String8 dll_name, String8 debug_symbols, PE_MakeImportList import_headers);\ninternal String8 pe_make_import_dll_obj_delayed(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 dll_name, String8 delay_load_helper_name, String8 debug_symbols, PE_MakeImportList import_headers, B32 emit_biat, B32 emit_uiat);\n\ninternal String8 pe_make_import_entry_obj_delayed(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols);\ninternal String8 pe_make_null_import_descriptor_delayed(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols);\ninternal String8 pe_make_null_thunk_data_delayed(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols);\n\ninternal String8 pe_make_import_entry_obj(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols);\ninternal String8 pe_make_null_import_descriptor_obj(Arena *arena, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols);\ninternal String8 pe_make_null_thunk_data_obj(Arena *arena, String8 dll_name, COFF_TimeStamp time_stamp, COFF_MachineType machine, String8 debug_symbols);\n\n#endif // PE_MAKE_IMPORT_TABLE_H\n"
  },
  {
    "path": "src/pe/pe_section_flags.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef PE_SECTION_FLAGS_H\n#define PE_SECTION_FLAGS_H\n\n#define PE_TEXT_SECTION_FLAGS      (COFF_SectionFlag_CntCode|COFF_SectionFlag_MemExecute|COFF_SectionFlag_MemRead)\n#define PE_DATA_SECTION_FLAGS      (COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite)\n#define PE_RDATA_SECTION_FLAGS     (COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead)\n#define PE_BSS_SECTION_FLAGS       (COFF_SectionFlag_CntUninitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite)\n#define PE_IDATA_SECTION_FLAGS     PE_DATA_SECTION_FLAGS\n#define PE_DEBUG_DIR_SECTION_FLAGS PE_RDATA_SECTION_FLAGS\n#define PE_RSRC_SECTION_FLAGS      PE_DATA_SECTION_FLAGS\n#define PE_RSRC1_SECTION_FLAGS     (PE_DATA_SECTION_FLAGS | COFF_SectionFlag_Align4Bytes)\n#define PE_RSRC2_SECTION_FLAGS     (PE_DATA_SECTION_FLAGS | COFF_SectionFlag_Align4Bytes)\n#define PE_XDATA_SECTION_FLAGS     PE_RDATA_SECTION_FLAGS\n#define PE_PDATA_SECTION_FLAGS     PE_RDATA_SECTION_FLAGS\n#define PE_EDATA_SECTION_FLAGS     PE_RDATA_SECTION_FLAGS\n#define PE_GFIDS_SECTION_FLAGS     PE_RDATA_SECTION_FLAGS\n#define PE_GIATS_SECTION_FLAGS     PE_RDATA_SECTION_FLAGS\n#define PE_GLJMP_SECTION_FLAGS     PE_RDATA_SECTION_FLAGS\n#define PE_GEHCONT_SECTION_FLAGS   PE_RDATA_SECTION_FLAGS\n#define PE_RELOC_SECTION_FLAGS     (PE_RDATA_SECTION_FLAGS | COFF_SectionFlag_MemDiscardable)\n#define PE_DEBUG_SECTION_FLAGS     (PE_RDATA_SECTION_FLAGS | COFF_SectionFlag_MemDiscardable)\n#define PE_TLS_SECTION_FLAGS       PE_DATA_SECTION_FLAGS\n\n#endif // PE_SECTION_FLAGS_H\n\n"
  },
  {
    "path": "src/radbin/generated/radbin.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 rb_file_format_display_name_table[10] =\r\n{\r\n{0},\r\nstr8_lit_comp(\"PDB\"),\r\nstr8_lit_comp(\"PE\"),\r\nstr8_lit_comp(\"COFF (OBJ)\"),\r\nstr8_lit_comp(\"COFF (Big OBJ)\"),\r\nstr8_lit_comp(\"COFF (Archive)\"),\r\nstr8_lit_comp(\"COFF (Thin Archive)\"),\r\nstr8_lit_comp(\"ELF32\"),\r\nstr8_lit_comp(\"ELF64\"),\r\nstr8_lit_comp(\"RDI\"),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/radbin/generated/radbin.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef RADBIN_META_H\r\n#define RADBIN_META_H\r\n\r\ntypedef enum RB_FileFormat\r\n{\r\nRB_FileFormat_Null,\r\nRB_FileFormat_PDB,\r\nRB_FileFormat_PE,\r\nRB_FileFormat_COFF_OBJ,\r\nRB_FileFormat_COFF_BigOBJ,\r\nRB_FileFormat_COFF_Archive,\r\nRB_FileFormat_COFF_ThinArchive,\r\nRB_FileFormat_ELF32,\r\nRB_FileFormat_ELF64,\r\nRB_FileFormat_RDI,\r\nRB_FileFormat_COUNT,\r\n} RB_FileFormat;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 rb_file_format_display_name_table[10];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // RADBIN_META_H\r\n"
  },
  {
    "path": "src/radbin/radbin.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"radbin/generated/radbin.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Entry Points\r\n\r\ninternal void\r\nrb_entry_point(CmdLine *cmdline)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  U64 threads_count = os_get_system_info()->logical_processor_count;\r\n  String8 threads_count_from_cmdline_string = cmd_line_string(cmdline, str8_lit(\"thread_count\"));\r\n  if(threads_count_from_cmdline_string.size != 0)\r\n  {\r\n    U64 threads_count_from_cmdline = 0;\r\n    if(try_u64_from_str8_c_rules(threads_count_from_cmdline_string, &threads_count_from_cmdline))\r\n    {\r\n      threads_count = threads_count_from_cmdline;\r\n    }\r\n  }\r\n  Thread *threads = push_array(scratch.arena, Thread, threads_count);\r\n  RB_ThreadParams *threads_params = push_array(scratch.arena, RB_ThreadParams, threads_count);\r\n  Barrier barrier = barrier_alloc(threads_count);\r\n  U64 broadcast_val = 0;\r\n  for EachIndex(idx, threads_count)\r\n  {\r\n    threads_params[idx].cmdline = cmdline;\r\n    threads_params[idx].lane_ctx.lane_idx         = idx;\r\n    threads_params[idx].lane_ctx.lane_count       = threads_count;\r\n    threads_params[idx].lane_ctx.barrier          = barrier;\r\n    threads_params[idx].lane_ctx.broadcast_memory = &broadcast_val;\r\n    threads[idx] = thread_launch(rb_thread_entry_point, &threads_params[idx]);\r\n  }\r\n  for EachIndex(idx, threads_count)\r\n  {\r\n    thread_join(threads[idx], max_U64);\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nrb_thread_entry_point(void *p)\r\n{\r\n  RB_ThreadParams *params = (RB_ThreadParams *)p;\r\n  CmdLine *cmdline = params->cmdline;\r\n  LaneCtx lctx = params->lane_ctx;\r\n  ThreadNameF(\"radbin_thread_%I64u\", lctx.lane_idx);\r\n  lane_ctx(lctx);\r\n  Arena *arena = arena_alloc();\r\n  Log *log = log_alloc();\r\n  log_select(log);\r\n  log_scope_begin();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: set up shared state\r\n  //\r\n  if(lane_idx() == 0)\r\n  {\r\n    rb_shared = push_array(arena, RB_Shared, 1);\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: analyze & load command line input files\r\n  //\r\n  ProfScope(\"analyze & load command line input files\") if(lane_idx() == 0)\r\n  {\r\n    String8List input_file_path_tasks = str8_list_copy(arena, &cmdline->inputs);\r\n    for(String8Node *n = input_file_path_tasks.first; n != 0; n = n->next)\r\n    {\r\n      //////////////////////////\r\n      //- rjf: do thin analysis of file\r\n      //\r\n      RB_FileFormat file_format = RB_FileFormat_Null;\r\n      RB_FileFormatFlags file_format_flags = 0;\r\n      ProfScope(\"do thin analysis of file\")\r\n      {\r\n        OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, n->string);\r\n        FileProperties props = os_properties_from_file(file);\r\n        \r\n        //- rjf: PDB magic -> PDB input\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          U8 msf20_magic_maybe[sizeof(msf_msf20_magic)] = {0};\r\n          os_file_read(file, r1u64(0, sizeof(msf20_magic_maybe)), msf20_magic_maybe);\r\n          if(MemoryMatch(msf20_magic_maybe, msf_msf20_magic, sizeof(msf20_magic_maybe)))\r\n          {\r\n            file_format = RB_FileFormat_PDB;\r\n          }\r\n        }\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          U8 msf70_magic_maybe[sizeof(msf_msf70_magic)] = {0};\r\n          os_file_read(file, r1u64(0, sizeof(msf70_magic_maybe)), msf70_magic_maybe);\r\n          if(MemoryMatch(msf70_magic_maybe, msf_msf70_magic, sizeof(msf70_magic_maybe)))\r\n          {\r\n            file_format = RB_FileFormat_PDB;\r\n          }\r\n        }\r\n        \r\n        //- rjf: PE magic -> PE input\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          PE_DosHeader dos_header_maybe = {0};\r\n          os_file_read_struct(file, 0, &dos_header_maybe);\r\n          if(dos_header_maybe.magic == PE_DOS_MAGIC)\r\n          {\r\n            U32 pe_magic_maybe = 0;\r\n            os_file_read_struct(file, dos_header_maybe.coff_file_offset, &pe_magic_maybe);\r\n            if(pe_magic_maybe == PE_MAGIC)\r\n            {\r\n              file_format = RB_FileFormat_PE;\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: COFF archive magic -> COFF archive input\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          U8 coff_archive_sig_maybe[sizeof(g_coff_archive_sig)] = {0};\r\n          os_file_read(file, r1u64(0, sizeof(coff_archive_sig_maybe)), coff_archive_sig_maybe);\r\n          if(MemoryMatch(coff_archive_sig_maybe, g_coff_archive_sig, sizeof(g_coff_archive_sig)))\r\n          {\r\n            file_format = RB_FileFormat_COFF_Archive;\r\n          }\r\n        }\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          U8 coff_thin_archive_sig_maybe[sizeof(g_coff_thin_archive_sig)] = {0};\r\n          os_file_read(file, r1u64(0, sizeof(coff_thin_archive_sig_maybe)), coff_thin_archive_sig_maybe);\r\n          if(MemoryMatch(coff_thin_archive_sig_maybe, g_coff_thin_archive_sig, sizeof(g_coff_thin_archive_sig)))\r\n          {\r\n            file_format = RB_FileFormat_COFF_ThinArchive;\r\n          }\r\n        }\r\n        \r\n        //- rjf: COFF obj magic -> COFF obj input\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          COFF_BigObjHeader header_maybe = {0};\r\n          os_file_read_struct(file, 0, &header_maybe);\r\n          if(header_maybe.sig1 == COFF_MachineType_Unknown &&\r\n             header_maybe.sig2 == max_U16 &&\r\n             header_maybe.version >= 2 &&\r\n             MemoryMatch(header_maybe.magic, g_coff_big_header_magic, sizeof(header_maybe.magic)))\r\n          {\r\n            file_format = RB_FileFormat_COFF_BigOBJ;\r\n          }\r\n        }\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          Temp scratch = scratch_begin(&arena, 1);\r\n          COFF_FileHeader header_maybe = {0};\r\n          os_file_read_struct(file, 0, &header_maybe);\r\n          U64 section_count = header_maybe.section_count;\r\n          U64 section_hdr_opl_off = sizeof(header_maybe) + section_count*sizeof(COFF_SectionHeader);\r\n          \r\n          // rjf: check if machine type is valid\r\n          B32 machine_type_is_valid = 0;\r\n          switch(header_maybe.machine)\r\n          {\r\n            case COFF_MachineType_Unknown:\r\n            case COFF_MachineType_X86:    case COFF_MachineType_X64:\r\n            case COFF_MachineType_Am33:   case COFF_MachineType_Arm:\r\n            case COFF_MachineType_Arm64:  case COFF_MachineType_ArmNt:\r\n            case COFF_MachineType_Ebc:    case COFF_MachineType_Ia64:\r\n            case COFF_MachineType_M32R:   case COFF_MachineType_Mips16:\r\n            case COFF_MachineType_MipsFpu:case COFF_MachineType_MipsFpu16:\r\n            case COFF_MachineType_PowerPc:case COFF_MachineType_PowerPcFp:\r\n            case COFF_MachineType_R4000:  case COFF_MachineType_RiscV32:\r\n            case COFF_MachineType_RiscV64:case COFF_MachineType_RiscV128:\r\n            case COFF_MachineType_Sh3:    case COFF_MachineType_Sh3Dsp:\r\n            case COFF_MachineType_Sh4:    case COFF_MachineType_Sh5:\r\n            case COFF_MachineType_Thumb:  case COFF_MachineType_WceMipsV2:\r\n            {\r\n              machine_type_is_valid = 1;\r\n            }break;\r\n          }\r\n          \r\n          // rjf: check if sections are valid\r\n          B32 sections_are_valid = 0;\r\n          if(machine_type_is_valid)\r\n          {\r\n            if(props.size >= section_hdr_opl_off)\r\n            {\r\n              COFF_SectionHeader *section_hdrs = push_array(scratch.arena, COFF_SectionHeader, section_count);\r\n              os_file_read(file, r1u64(sizeof(header_maybe), sizeof(header_maybe) + section_count*sizeof(COFF_SectionHeader)), section_hdrs);\r\n              B32 section_ranges_valid = 1;\r\n              for EachIndex(section_hdr_idx, section_count)\r\n              {\r\n                COFF_SectionHeader *hdr = &section_hdrs[section_hdr_idx];\r\n                if(!(hdr->flags & COFF_SectionFlag_CntUninitializedData))\r\n                {\r\n                  U64 min = hdr->foff;\r\n                  U64 max = min + hdr->fsize;\r\n                  if(hdr->fsize > 0 && !(section_hdr_opl_off <= min && min <= max && max <= props.size))\r\n                  {\r\n                    section_ranges_valid = 0;\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              sections_are_valid = section_ranges_valid;\r\n            }\r\n          }\r\n          \r\n          // rjf: check if symbol table is valid\r\n          B32 symbol_table_is_valid = 0;\r\n          if(sections_are_valid)\r\n          {\r\n            U64 symbol_table_off = header_maybe.symbol_table_foff;\r\n            U64 symbol_table_size = sizeof(COFF_Symbol16)*header_maybe.symbol_count;\r\n            U64 symbol_table_opl_off = symbol_table_off+symbol_table_size;\r\n            if(symbol_table_off == 0 && symbol_table_size == 0)\r\n            {\r\n              symbol_table_off = section_hdr_opl_off;\r\n              symbol_table_opl_off = section_hdr_opl_off;\r\n            }\r\n            symbol_table_is_valid = (section_hdr_opl_off <= symbol_table_off &&\r\n                                     symbol_table_off <= symbol_table_opl_off &&\r\n                                     symbol_table_opl_off <= props.size);\r\n          }\r\n          \r\n          // rjf: symbol table is valid -> is COFF OBJ\r\n          if(symbol_table_is_valid)\r\n          {\r\n            file_format = RB_FileFormat_COFF_OBJ;\r\n          }\r\n          \r\n          scratch_end(scratch);\r\n        }\r\n        \r\n        //- rjf: ELF magic -> ELF input\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          U8 identifier_maybe[ELF_Identifier_Max] = {0};\r\n          os_file_read(file, r1u64(0, sizeof(identifier_maybe)), identifier_maybe);\r\n          B32 is_elf_magic = (identifier_maybe[ELF_Identifier_Mag0] == 0x7f &&\r\n                              identifier_maybe[ELF_Identifier_Mag1] == 'E'  &&\r\n                              identifier_maybe[ELF_Identifier_Mag2] == 'L'  &&\r\n                              identifier_maybe[ELF_Identifier_Mag3] == 'F');\r\n          if(is_elf_magic)\r\n          {\r\n            file_format = ELF_HdrIs64Bit(identifier_maybe) ? RB_FileFormat_ELF64 : RB_FileFormat_ELF32;\r\n          }\r\n        }\r\n        \r\n        //- rjf: RDI magic -> RDI input\r\n        if(file_format == RB_FileFormat_Null)\r\n        {\r\n          RDI_Header rdi_header_maybe = {0};\r\n          os_file_read_struct(file, 0, &rdi_header_maybe);\r\n          if(rdi_header_maybe.magic == RDI_MAGIC_CONSTANT)\r\n          {\r\n            file_format = RB_FileFormat_RDI;\r\n          }\r\n        }\r\n        \r\n        os_file_close(file);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: log file recognition\r\n      //\r\n      if(file_format != RB_FileFormat_Null)\r\n      {\r\n        log_infof(\"%S recognized as %S\\n\", n->string, rb_file_format_display_name_table[file_format]);\r\n      }\r\n      else\r\n      {\r\n        log_infof(\"%S was not recognized as a supported format.\\n\", n->string);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: load recognized files\r\n      //\r\n      String8 file_data = {0};\r\n      if(file_format != RB_FileFormat_Null) ProfScope(\"load recognized file\")\r\n      {\r\n        file_data = os_data_from_file_path(arena, n->string);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: PE format => generate new implicit path tasks for PDBs\r\n      //\r\n      if(file_format == RB_FileFormat_PE) ProfScope(\"PE file => generate task for PDB\")\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        String8 file_path = n->string;\r\n        PE_BinInfo pe_bin_info = pe_bin_info_from_data(scratch.arena, file_data);\r\n        String8 raw_debug_dir = str8_substr(file_data, pe_bin_info.data_dir_franges[PE_DataDirectoryIndex_DEBUG]);\r\n        PE_DebugInfoList debug_dir = pe_debug_info_list_from_raw_debug_dir(scratch.arena, file_data, raw_debug_dir);\r\n        for(PE_DebugInfoNode *n = debug_dir.first; n != 0; n = n->next)\r\n        {\r\n          if(n->v.path.size != 0)\r\n          {\r\n            log_infof(\"Found reference to separate debug info file in %S (%S) at %S\\n\", file_path, rb_file_format_display_name_table[file_format], n->v.path);\r\n            str8_list_push(arena, &input_file_path_tasks, n->v.path);\r\n          }\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: ELF format => generate new implicit path tasks for debug files\r\n      //\r\n      if(file_format == RB_FileFormat_ELF32 ||\r\n         file_format == RB_FileFormat_ELF64)\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        ELF_Bin bin = elf_bin_from_data(scratch.arena, file_data);\r\n        ELF_GnuDebugLink debug_link = elf_gnu_debug_link_from_bin(file_data, &bin);\r\n        if(debug_link.path.size != 0)\r\n        {\r\n          log_infof(\"Found reference to separate debug info file in %S (%S) at %S\\n\", n->string, rb_file_format_display_name_table[file_format], debug_link.path);\r\n          str8_list_push(arena, &input_file_path_tasks, debug_link.path);\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: PE => check if contains DWARF\r\n      //\r\n      if(file_format == RB_FileFormat_PE)\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        PE_BinInfo pe_bin_info = pe_bin_info_from_data(scratch.arena, file_data);\r\n        String8 raw_section_table = str8_substr(file_data, pe_bin_info.section_table_range);\r\n        String8 string_table = str8_substr(file_data, pe_bin_info.string_table_range);\r\n        U64 section_count = raw_section_table.size / sizeof(COFF_SectionHeader);\r\n        COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_section_table.str;\r\n        if(dw_is_dwarf_present_coff_section_table(string_table, section_count, section_table))\r\n        {\r\n          log_infof(\"DWARF data detected in %S (%S)\\n\", n->string, rb_file_format_display_name_table[file_format]);\r\n          file_format_flags |= RB_FileFormatFlag_HasDWARF;\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: ELF => check if contains DWARF\r\n      //\r\n      if(file_format == RB_FileFormat_ELF32 ||\r\n         file_format == RB_FileFormat_ELF64)\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        ELF_Bin elf_bin = elf_bin_from_data(scratch.arena, file_data);\r\n        if(dw_is_dwarf_present_from_elf_bin(file_data, &elf_bin))\r\n        {\r\n          log_infof(\"DWARF data detected in %S (%S)\\n\", n->string, rb_file_format_display_name_table[file_format]);\r\n          file_format_flags |= RB_FileFormatFlag_HasDWARF;\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: push to list\r\n      //\r\n      {\r\n        RB_File *f = push_array(arena, RB_File, 1);\r\n        f->format       = file_format;\r\n        f->format_flags = file_format_flags;\r\n        f->path         = n->string;\r\n        f->data         = file_data;\r\n        RB_FileNode *file_n = push_array(arena, RB_FileNode, 1);\r\n        file_n->v = f;\r\n        SLLQueuePush(rb_shared->input_files.first, rb_shared->input_files.last, file_n);\r\n        rb_shared->input_files.count += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  RB_FileList input_files = rb_shared->input_files;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: bucket input files by format\r\n  //\r\n  ProfScope(\"bucket input files by format\") if(lane_idx() == 0)\r\n  {\r\n    for(RB_FileNode *n = input_files.first; n != 0; n = n->next)\r\n    {\r\n      RB_FileNode *file_n = push_array(arena, RB_FileNode, 1);\r\n      file_n->v = n->v;\r\n      SLLQueuePush(rb_shared->input_files_from_format_table[n->v->format].first, rb_shared->input_files_from_format_table[n->v->format].last, file_n);\r\n      rb_shared->input_files_from_format_table[n->v->format].count += 1;\r\n    }\r\n  }\r\n  lane_sync();\r\n  RB_FileList *input_files_from_format_table = rb_shared->input_files_from_format_table;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack which kind of output we're producing, and to where\r\n  //\r\n  typedef enum OutputKind\r\n  {\r\n    OutputKind_Null,\r\n    OutputKind_RDI,\r\n    OutputKind_Dump,\r\n    OutputKind_Breakpad,\r\n    OutputKind_COUNT\r\n  }\r\n  OutputKind;\r\n  struct\r\n  {\r\n    String8 arg;\r\n    String8 title;\r\n  }\r\n  output_kind_info[] =\r\n  {\r\n    {str8_lit_comp(\"\"),         str8_lit_comp(\"\")},\r\n    {str8_lit_comp(\"rdi\"),      str8_lit_comp(\"RAD Debug Info (.rdi) Conversion\")},\r\n    {str8_lit_comp(\"dump\"),     str8_lit_comp(\"Textual Dumping\")},\r\n    {str8_lit_comp(\"breakpad\"), str8_lit_comp(\"Breakpad Debug Info Conversion\")},\r\n  };\r\n  OutputKind output_kind = OutputKind_Null;\r\n  String8 output_path = cmd_line_string(cmdline, str8_lit(\"out\"));\r\n  {\r\n    //- rjf: user manually specified output kind\r\n    if(output_kind == OutputKind_Null)\r\n    {\r\n      for EachNonZeroEnumVal(OutputKind, k)\r\n      {\r\n        if(cmd_line_has_flag(cmdline, output_kind_info[k].arg))\r\n        {\r\n          log_infof(\"User specified --%S; performing `%S`\\n\", output_kind_info[k].arg, output_kind_info[k].title);\r\n          output_kind = k;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: we can infer from the user-specified output path\r\n    if(str8_match(str8_skip_last_dot(output_path), str8_lit(\"rdi\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      output_kind = OutputKind_RDI;\r\n      log_infof(\"Output path has .rdi extension; performing `%S`\\n\", output_kind_info[output_kind].title);\r\n    }\r\n    else if(str8_match(str8_skip_last_dot(output_path), str8_lit(\"dump\"), StringMatchFlag_CaseInsensitive) ||\r\n            str8_match(str8_skip_last_dot(output_path), str8_lit(\"txt\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      output_kind = OutputKind_Dump;\r\n      log_infof(\"Output path has .dump or .txt extension; performing `%S`\\n\", output_kind_info[output_kind].title);\r\n    }\r\n    else if(str8_match(str8_skip_last_dot(output_path), str8_lit(\"psym\"), StringMatchFlag_CaseInsensitive) ||\r\n            str8_match(str8_skip_last_dot(output_path), str8_lit(\"psyms\"), StringMatchFlag_CaseInsensitive))\r\n    {\r\n      output_kind = OutputKind_Breakpad;\r\n      log_infof(\"Output path has .psym or .psyms extension; performing `%S`\\n\", output_kind_info[output_kind].title);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: print help preamble\r\n  //\r\n  if(lane_idx() == 0)\r\n  {\r\n    if(output_kind == OutputKind_Null || cmdline->inputs.node_count == 0)\r\n    {\r\n      fprintf(stderr, \"%s\\n\", BUILD_TITLE);\r\n      fprintf(stderr, \"%s\\n\\n\", BUILD_VERSION_STRING_LITERAL);\r\n      if(output_kind != OutputKind_Null)\r\n      {\r\n        fprintf(stderr, \"%.*s Help\\n\", str8_varg(output_kind_info[output_kind].title));\r\n        fprintf(stderr, \"To see top-level options for radbin, run the binary with no arguments.\\n\\n\");\r\n      }\r\n      fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: perform operation based on output kind\r\n  //\r\n  String8List output_blobs = {0};\r\n  switch(output_kind)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: no output kind -> nothing to do. output help information to user\r\n    //\r\n    default:\r\n    case OutputKind_Null:\r\n    if(lane_idx() == 0)\r\n    {\r\n      fprintf(stderr, \"USAGE EXAMPLES\\n\\n\");\r\n      \r\n      fprintf(stderr, \"radbin --rdi program.exe\\n\");\r\n      fprintf(stderr, \"Find the debug info for `program.exe`, if any, and converts it to RDI.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"radbin program.pdb --out:program.rdi\\n\");\r\n      fprintf(stderr, \"Converts `program.pdb` to RDI, and stores it in `program.rdi`.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"radbin --dump program.rdi\\n\");\r\n      fprintf(stderr, \"Outputs the textual dump of the debug information stored in `program.rdi`.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n      \r\n      fprintf(stderr, \"DESCRIPTION\\n\\n\");\r\n      fprintf(stderr, \"This utility provides a number of operations relating to executable image and\\n\");\r\n      fprintf(stderr, \"debug information formats. It can convert debug information to the RAD Debug\\n\");\r\n      fprintf(stderr, \"Info (.rdi) format. It can also parse and dump textualized contents of several\\n\");\r\n      fprintf(stderr, \"formats, including PDB, PE, ELF, and RDI. It also supports converting debug\\n\");\r\n      fprintf(stderr, \"information to the textual Breakpad format.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n      \r\n      fprintf(stderr, \"ARGUMENTS\\n\\n\");\r\n      \r\n      fprintf(stderr, \"--rdi            Specifies that the utility should convert debug information\\n\");\r\n      fprintf(stderr, \"                 data to the RAD Debug Info (.rdi) format.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"--dump           Specifies that the utility should dump textualized contents of\\n\");\r\n      fprintf(stderr, \"                 all input files.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"--breakpad       Specifies that the utility should convert debug information\\n\");\r\n      fprintf(stderr, \"                 data to the textual Breakpad format.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"--out:<path>     Specifies the path to which output data should be written. If\\n\");\r\n      fprintf(stderr, \"                 not specified, the utility will choose a fallback. If dumping\\n\");\r\n      fprintf(stderr, \"                 textual contents, the utility will write to `stdout`. If\\n\");\r\n      fprintf(stderr, \"                 converting to another format, the utility will form a path by\\n\");\r\n      fprintf(stderr, \"                 changing the extension of input files accordingly.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"--deterministic  Turns off all sources of non-determinism in generated output,\\n\");\r\n      fprintf(stderr, \"                 like build names, versions, and dates.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"--verbose        Outputs all log information collected during execution.\\n\\n\");\r\n      \r\n      fprintf(stderr, \"There are also operation-specific arguments. To see them, run this binary with\\n\");\r\n      fprintf(stderr, \"the operation selected, with no additional inputs (e.g. `radbin --rdi`).\\n\\n\");\r\n    }break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: RDI, Breakpad -> conversion based on inputs\r\n    //\r\n    case OutputKind_RDI:\r\n    case OutputKind_Breakpad:\r\n    {\r\n      //- rjf: no inputs => help\r\n      if(lane_idx() == 0 && cmdline->inputs.node_count == 0) switch(output_kind)\r\n      {\r\n        default:\r\n        case OutputKind_RDI:\r\n        {\r\n          fprintf(stderr, \"ARGUMENTS\\n\\n\");\r\n          \r\n          fprintf(stderr, \"--compress                       Compresses the RDI file's contents.\\n\");\r\n          fprintf(stderr, \"\\n\");\r\n          fprintf(stderr, \"--only:<comma delimited names>   Specifies that only the named subsets of debug\\n\");\r\n          fprintf(stderr, \"                                 information should be generated. See below for\\n\");\r\n          fprintf(stderr, \"                                 a list of valid debug info subset names.\\n\");\r\n          fprintf(stderr, \"\\n\");\r\n          fprintf(stderr, \"--omit:<comma delimited names>   Specifies that the named subsets of debug\\n\");\r\n          fprintf(stderr, \"                                 information should not be generated. See below\\n\");\r\n          fprintf(stderr, \"                                 for a list of valid debug info subset names.\\n\");\r\n          fprintf(stderr, \"\\n\");\r\n          \r\n          fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n          \r\n          fprintf(stderr, \"RAD DEBUG INFO SUBSET NAMES\\n\\n\");\r\n#define X(name, name_lower) fprintf(stderr, \" - \" #name_lower \"\\n\");\r\n#define Y(name, name_lower) X(name, name_lower)\r\n          RDIM_Subset_XList\r\n#undef X\r\n#undef Y\r\n        }break;\r\n        case OutputKind_Breakpad:\r\n        {\r\n          fprintf(stderr, \"All input files specified on the command line will be dumped. The following\\n\");\r\n          fprintf(stderr, \"formats are currently supported: PE, COFF, RDI, and ELF\\n\\n\");\r\n        }\r\n      }\r\n      \r\n      //- rjf: unpack subset flags\r\n      RDIM_SubsetFlags subset_flags = 0xffffffff;\r\n      switch(output_kind)\r\n      {\r\n        default:{}break;\r\n        case OutputKind_RDI:\r\n        {\r\n          String8List only_names = cmd_line_strings(cmdline, str8_lit(\"only\"));\r\n          if(only_names.node_count != 0)\r\n          {\r\n            subset_flags = 0;\r\n          }\r\n          for(String8Node *n = only_names.first; n != 0; n = n->next)\r\n          {\r\n            if(0){}\r\n#define X(name, name_lower) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { subset_flags |= RDIM_SubsetFlag_##name; }\r\n#define Y(name, name_lower) X(name, name_lower)\r\n            RDIM_Subset_XList\r\n#undef X\r\n#undef Y\r\n          }\r\n          String8List omit_names = cmd_line_strings(cmdline, str8_lit(\"omit\"));\r\n          for(String8Node *n = omit_names.first; n != 0; n = n->next)\r\n          {\r\n            if(0){}\r\n#define X(name, name_lower) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { subset_flags &= ~RDIM_SubsetFlag_##name; }\r\n#define Y(name, name_lower) X(name, name_lower)\r\n            RDIM_Subset_XList\r\n#undef X\r\n#undef Y\r\n          }\r\n        }break;\r\n        case OutputKind_Breakpad:\r\n        {\r\n          subset_flags = (RDIM_SubsetFlag_Units|RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_Scopes|RDIM_SubsetFlag_LineInfo|RDIM_SubsetFlag_InlineLineInfo);\r\n        }break;\r\n      }\r\n      \r\n      //- rjf: convert inputs to RDI info\r\n      B32 convert_done = 0;\r\n      RDIM_BakeParams pdb_bake_params = {0};\r\n      RDIM_BakeParams dwarf_bake_params = {0};\r\n      {\r\n        //- rjf: PE inputs w/ DWARF, or ELF inputs => DWARF -> RDI conversion\r\n        B32 pe_w_dwarf = (input_files_from_format_table[RB_FileFormat_PE].count != 0 &&\r\n                          input_files_from_format_table[RB_FileFormat_PE].first->v->format_flags & RB_FileFormatFlag_HasDWARF);\r\n        B32 elf_w_dwarf = (input_files_from_format_table[RB_FileFormat_ELF32].count != 0 ||\r\n                           input_files_from_format_table[RB_FileFormat_ELF64].count != 0);\r\n        if(pe_w_dwarf || elf_w_dwarf)\r\n        {\r\n          convert_done = 1;\r\n          if(0){}\r\n          else if(pe_w_dwarf)  { log_infof(\"PEs w/ DWARF specified; converting DWARF data to RDI\\n\"); }\r\n          else if(elf_w_dwarf) { log_infof(\"ELFs specified; converting DWARF data to RDI\\n\"); }\r\n          \r\n          // rjf: convert\r\n          D2R_ConvertParams convert_params = {0};\r\n          {\r\n            B32 got_exe = 0;\r\n            B32 got_dbg = 0;\r\n            if(!got_exe && !got_dbg)\r\n            {\r\n              for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_PE].first; n != 0; n = n->next)\r\n              {\r\n                if(n->v->format_flags & RB_FileFormatFlag_HasDWARF)\r\n                {\r\n                  got_exe = 1;\r\n                  got_dbg = 1;\r\n                  convert_params.dbg_name = n->v->path;\r\n                  convert_params.dbg_data = n->v->data;\r\n                  convert_params.exe_name = n->v->path;\r\n                  convert_params.exe_data = n->v->data;\r\n                  convert_params.exe_kind = ExecutableImageKind_CoffPe;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            if(!got_exe)\r\n            {\r\n              for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next)\r\n              {\r\n                got_exe = 1;\r\n                convert_params.exe_name = n->v->path;\r\n                convert_params.exe_data = n->v->data;\r\n                convert_params.exe_kind = ExecutableImageKind_Elf32;\r\n                if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF))\r\n                {\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            if(!got_exe)\r\n            {\r\n              for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next)\r\n              {\r\n                got_exe = 1;\r\n                convert_params.exe_name = n->v->path;\r\n                convert_params.exe_data = n->v->data;\r\n                convert_params.exe_kind = ExecutableImageKind_Elf64;\r\n                if(!(n->v->format_flags & RB_FileFormatFlag_HasDWARF))\r\n                {\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            if(!got_dbg)\r\n            {\r\n              for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF32].first; n != 0; n = n->next)\r\n              {\r\n                if(n->v->format_flags & RB_FileFormatFlag_HasDWARF)\r\n                {\r\n                  got_dbg = 1;\r\n                  convert_params.dbg_name = n->v->path;\r\n                  convert_params.dbg_data = n->v->data;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            if(!got_dbg)\r\n            {\r\n              for(RB_FileNode *n = input_files_from_format_table[RB_FileFormat_ELF64].first; n != 0; n = n->next)\r\n              {\r\n                if(n->v->format_flags & RB_FileFormatFlag_HasDWARF)\r\n                {\r\n                  got_dbg = 1;\r\n                  convert_params.dbg_name = n->v->path;\r\n                  convert_params.dbg_data = n->v->data;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            convert_params.subset_flags   = subset_flags;\r\n            convert_params.deterministic  = cmd_line_has_flag(cmdline, str8_lit(\"deterministic\"));\r\n          }\r\n          ProfScope(\"convert\") dwarf_bake_params = d2r_convert(arena, &convert_params);\r\n        }\r\n        \r\n        //- rjf: PDB inputs => PDB -> RDI conversion\r\n        if(input_files_from_format_table[RB_FileFormat_PDB].count != 0)\r\n        {\r\n          convert_done = 1;\r\n          log_infof(\"PDBs specified; converting PDB data to RDI\\n\");\r\n          \r\n          // rjf: get EXE/PDB file data\r\n          RB_File *exe_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE]);\r\n          RB_File *pdb_file = rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PDB]);\r\n          String8 exe_path  = exe_file->path;\r\n          String8 pdb_path  = pdb_file->path;\r\n          String8 exe_data  = exe_file->data;\r\n          String8 pdb_data  = pdb_file->data;\r\n          \r\n          // rjf: convert\r\n          P2R_ConvertParams convert_params = {0};\r\n          {\r\n            convert_params.input_pdb_name = pdb_path;\r\n            convert_params.input_exe_name = exe_path;\r\n            convert_params.input_pdb_data = pdb_data;\r\n            convert_params.input_exe_data = exe_data;\r\n            convert_params.subset_flags   = subset_flags;\r\n            convert_params.deterministic  = cmd_line_has_flag(cmdline, str8_lit(\"deterministic\"));\r\n          }\r\n          ProfScope(\"convert\") pdb_bake_params = p2r_convert(arena, &convert_params);\r\n        }\r\n      }\r\n      lane_sync();\r\n      \r\n      //- rjf: join conversion artifacts\r\n      RDIM_BakeParams *bake_params = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        bake_params = push_array(arena, RDIM_BakeParams, 1);\r\n        rdim_bake_params_concat_in_place(bake_params, &pdb_bake_params);\r\n        rdim_bake_params_concat_in_place(bake_params, &dwarf_bake_params);\r\n      }\r\n      lane_sync_u64(&bake_params, 0);\r\n      \r\n      //- rjf: no output path? -> pick one based on input files\r\n      if(output_path.size == 0)\r\n      {\r\n        String8 output_path__noext = {0};\r\n        if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PDB])->path); }\r\n        if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_PE])->path); }\r\n        if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_ELF64])->path); }\r\n        if(output_path__noext.size == 0) { output_path__noext = str8_chop_last_dot(rb_file_list_first(&input_files_from_format_table[RB_FileFormat_ELF32])->path); }\r\n        switch(output_kind)\r\n        {\r\n          default:{}break;\r\n          case OutputKind_RDI:\r\n          {\r\n            output_path = push_str8f(arena, \"%S.rdi\", output_path__noext);\r\n          }break;\r\n          case OutputKind_Breakpad:\r\n          {\r\n            output_path = push_str8f(arena, \"%S.psym\", output_path__noext);\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      //- rjf: no viable input paths\r\n      if(!convert_done && cmdline->inputs.node_count != 0)\r\n      {\r\n        log_user_errorf(\"Could not load debug info from the specified inputs. You must provide either a valid PDB file or an executable image (PE, ELF) file with DWARF debug info.\");\r\n      }\r\n      \r\n      //- rjf: bake\r\n      RDIM_BakeResults bake_results = {0};\r\n      ProfScope(\"bake\")\r\n      {\r\n        bake_results = rdim_bake(arena, bake_params);\r\n      }\r\n      \r\n      //- rjf: convert done => generate output\r\n      if(convert_done) switch(output_kind)\r\n      {\r\n        default:{}break;\r\n        \r\n        //- rjf: generate RDI blobs\r\n        case OutputKind_RDI:\r\n        {\r\n          // rjf: serialize\r\n          RDIM_SerializedSectionBundle *serialized_section_bundle = 0;\r\n          ProfScope(\"serialize\") if(lane_idx() == 0)\r\n          {\r\n            serialized_section_bundle = push_array(arena, RDIM_SerializedSectionBundle, 1);\r\n            serialized_section_bundle[0] = rdim_serialized_section_bundle_from_bake_results(&bake_results);\r\n          }\r\n          lane_sync_u64(&serialized_section_bundle, 0);\r\n          \r\n          // rjf: compress\r\n          RDIM_SerializedSectionBundle serialized_section_bundle__compressed = serialized_section_bundle[0];\r\n          if(cmd_line_has_flag(cmdline, str8_lit(\"compress\"))) ProfScope(\"compress\")\r\n          {\r\n            serialized_section_bundle__compressed = rdim_compress(arena, serialized_section_bundle);\r\n          }\r\n          \r\n          // rjf: serialize\r\n          String8List blobs = rdim_file_blobs_from_section_bundle(arena, &serialized_section_bundle__compressed);\r\n          str8_list_concat_in_place(&output_blobs, &blobs);\r\n        }break;\r\n        \r\n        //- rjf: generate breakpad text\r\n        case OutputKind_Breakpad:\r\n        {\r\n          //- rjf: set up shared state\r\n          typedef struct P2B_Shared P2B_Shared;\r\n          struct P2B_Shared\r\n          {\r\n            String8List dump;\r\n            String8List *lane_chunk_file_dumps;\r\n            String8List *lane_chunk_func_dumps;\r\n          };\r\n          local_persist P2B_Shared *p2b_shared = 0;\r\n          if(lane_idx() == 0)\r\n          {\r\n            p2b_shared = push_array(arena, P2B_Shared, 1);\r\n            p2b_shared->lane_chunk_file_dumps = push_array(arena, String8List, lane_count()*bake_params->src_files.chunk_count);\r\n            p2b_shared->lane_chunk_func_dumps = push_array(arena, String8List, lane_count()*bake_params->procedures.chunk_count);\r\n          }\r\n          lane_sync();\r\n          \r\n          //- rjf: dump MODULE record\r\n          if(lane_idx() == 0)\r\n          {\r\n            // rjf: pick name to identify module\r\n            String8 module_name_string = bake_params->top_level_info.exe_name;\r\n            if(module_name_string.size == 0 && input_files.first != 0)\r\n            {\r\n              module_name_string = input_files.first->v->path;\r\n            }\r\n            \r\n            // rjf: pick string for unique code\r\n            String8 unique_identifier_string = {0};\r\n            if(unique_identifier_string.size == 0 && bake_params->top_level_info.exe_hash != 0)\r\n            {\r\n              unique_identifier_string = str8f(arena, \"%I64x\", bake_params->top_level_info.exe_hash);\r\n            }\r\n            if(unique_identifier_string.size == 0)\r\n            {\r\n              Temp scratch = scratch_begin(&arena, 1);\r\n              String8 msf_data = input_files.first->v->data;\r\n              MSF_RawStreamTable *st = msf_raw_stream_table_from_data(scratch.arena, msf_data);\r\n              String8 info_data = msf_data_from_stream_number(scratch.arena, msf_data, st, PDB_FixedStream_Info);\r\n              PDB_Info *info = pdb_info_from_data(scratch.arena, info_data);\r\n              if(info != 0 && info_data.size >= sizeof(PDB_InfoHeader))\r\n              {\r\n                PDB_InfoHeader *info_header = (PDB_InfoHeader *)info_data.str;\r\n                Guid guid = info->auth_guid;\r\n                unique_identifier_string = str8f(arena, \"%08X%04X%04X%02X%02X%02X%02X%02X%02X%02X%02X%u\",\r\n                                                 guid.data1,\r\n                                                 guid.data2,\r\n                                                 guid.data3,\r\n                                                 guid.data4[0],\r\n                                                 guid.data4[1],\r\n                                                 guid.data4[2],\r\n                                                 guid.data4[3],\r\n                                                 guid.data4[4],\r\n                                                 guid.data4[5],\r\n                                                 guid.data4[6],\r\n                                                 guid.data4[7],\r\n                                                 info_header->age);\r\n              }\r\n              scratch_end(scratch);\r\n            }\r\n            \r\n            // rjf: push record\r\n            str8_list_pushf(arena, &p2b_shared->dump, \"MODULE windows x86_64 %S %S\\n\", unique_identifier_string, module_name_string);\r\n          }\r\n          \r\n          //- rjf: dump FILE records\r\n          ProfScope(\"dump FILE records\")\r\n          {\r\n            U64 chunk_idx = 0;\r\n            for EachNode(n, RDIM_SrcFileChunkNode, bake_params->src_files.first)\r\n            {\r\n              Rng1U64 range = lane_range(n->count);\r\n              for EachInRange(idx, range)\r\n              {\r\n                U64 file_idx = rdim_idx_from_src_file(&n->v[idx]);\r\n                String8 src_path = n->v[idx].path;\r\n                str8_list_pushf(arena, &p2b_shared->lane_chunk_file_dumps[lane_idx()*bake_params->src_files.chunk_count + chunk_idx], \"FILE %I64u %S\\n\", file_idx, src_path);\r\n              }\r\n              chunk_idx += 1;\r\n            }\r\n          }\r\n          \r\n          //- rjf: dump FUNC records\r\n          ProfScope(\"dump FUNC records\")\r\n          {\r\n            U64 chunk_idx = 0;\r\n            for EachNode(n, RDIM_SymbolChunkNode, bake_params->procedures.first)\r\n            {\r\n              String8List *out = &p2b_shared->lane_chunk_func_dumps[lane_idx()*bake_params->procedures.chunk_count + chunk_idx];\r\n              Rng1U64 range = lane_range(n->count);\r\n              for EachInRange(idx, range)\r\n              {\r\n                // NOTE(rjf): breakpad does not support multiple voff ranges per procedure.\r\n                RDIM_Symbol *proc = &n->v[idx];\r\n                RDIM_Scope *root_scope = proc->root_scope;\r\n                if(root_scope != 0 && root_scope->voff_ranges.first != 0)\r\n                {\r\n                  // rjf: dump function record\r\n                  RDIM_Rng1U64 voff_range = root_scope->voff_ranges.first->v;\r\n                  str8_list_pushf(arena, out, \"FUNC %I64x %I64x %I64x %S\\n\", voff_range.min, voff_range.max-voff_range.min, 0ull, proc->name);\r\n                  \r\n                  // rjf: dump function lines\r\n                  U64 unit_idx = rdi_vmap_idx_from_voff(bake_results.unit_vmap.vmap.vmap, bake_results.unit_vmap.vmap.count, voff_range.min);\r\n                  if(0 < unit_idx && unit_idx <= bake_results.units.units_count)\r\n                  {\r\n                    U32 line_table_idx = bake_results.units.units[unit_idx].line_table_idx;\r\n                    if(0 < line_table_idx && line_table_idx <= bake_results.line_tables.line_tables_count)\r\n                    {\r\n                      // rjf: unpack unit line info\r\n                      RDI_LineTable *line_table = &bake_results.line_tables.line_tables[line_table_idx];\r\n                      RDI_ParsedLineTable line_info =\r\n                      {\r\n                        bake_results.line_tables.line_table_voffs + line_table->voffs_base_idx,\r\n                        bake_results.line_tables.line_table_lines + line_table->lines_base_idx,\r\n                        0,\r\n                        line_table->lines_count,\r\n                        0\r\n                      };\r\n                      for(U64 voff = voff_range.min, last_voff = 0;\r\n                          voff < voff_range.max && voff > last_voff;)\r\n                      {\r\n                        RDI_U64 line_info_idx = rdi_line_info_idx_from_voff(&line_info, voff);\r\n                        if(line_info_idx < line_info.count)\r\n                        {\r\n                          RDI_Line *line = &line_info.lines[line_info_idx];\r\n                          U64 line_voff_min = line_info.voffs[line_info_idx];\r\n                          U64 line_voff_opl = line_info.voffs[line_info_idx+1];\r\n                          if(line->file_idx != 0)\r\n                          {\r\n                            str8_list_pushf(arena, out, \"%I64x %I64x %I64u %I64u\\n\",\r\n                                            line_voff_min,\r\n                                            line_voff_opl-line_voff_min,\r\n                                            (U64)line->line_num,\r\n                                            (U64)line->file_idx);\r\n                          }\r\n                          last_voff = voff;\r\n                          voff = line_voff_opl;\r\n                        }\r\n                        else\r\n                        {\r\n                          break;\r\n                        }\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              chunk_idx += 1;\r\n            }\r\n          }\r\n          \r\n          //- rjf: join\r\n          lane_sync();\r\n          if(lane_idx() == 0)\r\n          {\r\n            for EachIndex(chunk_idx, bake_params->src_files.chunk_count)\r\n            {\r\n              for EachIndex(ln_idx, lane_count())\r\n              {\r\n                str8_list_concat_in_place(&p2b_shared->dump, &p2b_shared->lane_chunk_file_dumps[ln_idx*bake_params->src_files.chunk_count + chunk_idx]);\r\n              }\r\n            }\r\n            for EachIndex(chunk_idx, bake_params->procedures.chunk_count)\r\n            {\r\n              for EachIndex(ln_idx, lane_count())\r\n              {\r\n                str8_list_concat_in_place(&p2b_shared->dump, &p2b_shared->lane_chunk_func_dumps[ln_idx*bake_params->procedures.chunk_count + chunk_idx]);\r\n              }\r\n            }\r\n          }\r\n          lane_sync();\r\n          output_blobs = p2b_shared->dump;\r\n        }break;\r\n      }\r\n    }break;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: dump -> textual dump of inputs\r\n    //\r\n    case OutputKind_Dump:\r\n    {\r\n      B32 deterministic = cmd_line_has_flag(cmdline, str8_lit(\"deterministic\"));\r\n      \r\n      //- rjf: no inputs => help\r\n      if(lane_idx() == 0 && cmdline->inputs.node_count == 0)\r\n      {\r\n        fprintf(stderr, \"All input files specified on the command line will be dumped. Currently, only\\n\");\r\n        fprintf(stderr, \"RDI files are supported.\\n\\n\");\r\n        \r\n        fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n        \r\n        fprintf(stderr, \"ARGUMENTS\\n\\n\");\r\n        \r\n        fprintf(stderr, \"--only:<comma delimited names>   Specifies that only the named subsets should\\n\");\r\n        fprintf(stderr, \"                                 be dumped. See below for a list of valid\\n\");\r\n        fprintf(stderr, \"                                 subset names.\\n\");\r\n        fprintf(stderr, \"\\n\");\r\n        fprintf(stderr, \"--omit:<comma delimited names>   Specifies that the named subsets should not\\n\");\r\n        fprintf(stderr, \"                                 be dumped. See below for a list of valid\\n\");\r\n        fprintf(stderr, \"                                 subset names.\\n\");\r\n        fprintf(stderr, \"\\n\");\r\n        \r\n        fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n        \r\n        fprintf(stderr, \"RAD DEBUG INFO SUBSET NAMES\\n\\n\");\r\n#define X(name, name_lower, title) fprintf(stderr, \" - \" #name_lower \"\\n\");\r\n        RDI_DumpSubset_XList\r\n#undef X\r\n        fprintf(stderr, \"\\n\");\r\n        \r\n        fprintf(stderr, \"-------------------------------------------------------------------------------\\n\\n\");\r\n        \r\n        fprintf(stderr, \"DWARF INFO SUBSET NAMES\\n\\n\");\r\n#define X(name, name_lower, title) fprintf(stderr, \" - \" #name_lower \"\\n\");\r\n        DW_DumpSubset_XList\r\n#undef X\r\n        fprintf(stderr, \"\\n\");\r\n      }\r\n      \r\n      //- rjf: unpack dump subset flags\r\n      RDI_DumpSubsetFlags rdi_dump_subset_flags = RDI_DumpSubsetFlag_All;\r\n      DW_DumpSubsetFlags  dw_dump_subset_flags  = DW_DumpSubsetFlag_All;\r\n      EH_DumpSubsetFlags  eh_dump_subset_flags  = EH_DumpSubsetFlag_All;\r\n      ELF_DumpSubsetFlags elf_dump_subset_flags = ELF_DumpSubsetFlag_All;\r\n      {\r\n        String8List only_names = cmd_line_strings(cmdline, str8_lit(\"only\"));\r\n        if(only_names.node_count != 0)\r\n        {\r\n          rdi_dump_subset_flags = 0;\r\n          dw_dump_subset_flags = 0;\r\n          eh_dump_subset_flags = 0;\r\n        }\r\n        for(String8Node *n = only_names.first; n != 0; n = n->next)\r\n        {\r\n          if(0){}\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { rdi_dump_subset_flags |= RDI_DumpSubsetFlag_##name; }\r\n          RDI_DumpSubset_XList\r\n#undef X\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { dw_dump_subset_flags |= DW_DumpSubsetFlag_##name; }\r\n          DW_DumpSubset_XList\r\n#undef X\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags |= EH_DumpSubsetFlag_##name; }\r\n          EH_DumpSubset_XList\r\n#undef X\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { elf_dump_subset_flags |= ELF_DumpSubsetFlag_##name; }\r\n          ELF_DumpSubset_XList\r\n#undef X\r\n        }\r\n        String8List omit_names = cmd_line_strings(cmdline, str8_lit(\"omit\"));\r\n        for(String8Node *n = omit_names.first; n != 0; n = n->next)\r\n        {\r\n          if(0){}\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { rdi_dump_subset_flags &= ~RDI_DumpSubsetFlag_##name; }\r\n          RDI_DumpSubset_XList\r\n#undef X\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { dw_dump_subset_flags &= ~DW_DumpSubsetFlag_##name; }\r\n          DW_DumpSubset_XList\r\n#undef X\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { eh_dump_subset_flags &= ~EH_DumpSubsetFlag_##name; }\r\n          EH_DumpSubset_XList\r\n#undef X\r\n#define X(name, name_lower, title) else if(str8_match(n->string, str8_lit(#name_lower), 0)) { elf_dump_subset_flags &= ~ELF_DumpSubsetFlag_##name; }\r\n          ELF_DumpSubset_XList\r\n#undef X\r\n        }\r\n      }\r\n      \r\n      //- rjf: dump input files in order\r\n      for(RB_FileNode *n = input_files.first; n != 0; n = n->next)\r\n      {\r\n        RB_File *f = n->v;\r\n        if(lane_idx() == 0)\r\n        {\r\n          str8_list_pushf(arena, &output_blobs, \"// %S (%S)\\n\\n\", deterministic ? str8_skip_last_slash(f->path) : f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit(\"Unsupported format\"));\r\n        }\r\n        lane_sync();\r\n        \r\n        //- rjf: unpack file parses\r\n        Arch       arch               = Arch_Null;\r\n        PE_BinInfo pe                 = {0};\r\n        ELF_Bin    elf                = {0};\r\n        DW_Input   dw                 = {0};\r\n        U64        eh_frame_hdr_vaddr = 0;\r\n        U64        eh_frame_vaddr     = 0;\r\n        String8    eh_frame_hdr       = {0};\r\n        String8    eh_frame           = {0};\r\n        {\r\n          if(f->format == RB_FileFormat_PE)\r\n          {\r\n            pe = pe_bin_info_from_data(arena, f->data);\r\n            arch = pe.arch;\r\n          }\r\n          if(f->format == RB_FileFormat_ELF32 ||\r\n             f->format == RB_FileFormat_ELF64)\r\n          {\r\n            elf = elf_bin_from_data(arena, f->data);\r\n            arch = arch_from_elf_machine(elf.hdr.e_machine);\r\n\r\n            for EachIndex(sect_idx, elf.hdr.e_shnum)\r\n            {\r\n              ELF_Shdr64 *shdr = &elf.shdrs.v[sect_idx];\r\n              String8 name = elf_name_from_shdr64(f->data, &elf, shdr);\r\n              if (str8_match(name, str8_lit(\".eh_frame_hdr\"), 0))\r\n              {\r\n                eh_frame_hdr = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size));\r\n                eh_frame_hdr_vaddr = shdr->sh_addr;\r\n\r\n              }\r\n              else if(str8_match(name, str8_lit(\".eh_frame\"), 0))\r\n              {\r\n                eh_frame = str8_substr(f->data, r1u64(shdr->sh_offset, shdr->sh_offset + shdr->sh_size));\r\n                eh_frame_vaddr = shdr->sh_addr;\r\n              }\r\n            }\r\n          }\r\n          if(f->format_flags & RB_FileFormatFlag_HasDWARF)\r\n          {\r\n            if(f->format == RB_FileFormat_PE)\r\n            {\r\n              String8             raw_sections  = str8_substr(f->data, pe.section_table_range);\r\n              U64                 section_count = raw_sections.size / sizeof(COFF_SectionHeader);\r\n              COFF_SectionHeader *section_table = (COFF_SectionHeader *)raw_sections.str;\r\n              String8 string_table = str8_substr(f->data, pe.string_table_range);\r\n              dw = dw_input_from_coff_section_table(arena, f->data, string_table, section_count, section_table);\r\n            }\r\n            else if(f->format == RB_FileFormat_ELF32 ||\r\n                    f->format == RB_FileFormat_ELF64)\r\n            {\r\n              dw = dw_input_from_elf_bin(arena, f->data, &elf);\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: dump file info based on format\r\n        switch(f->format)\r\n        {\r\n          default:{}break;\r\n          \r\n          //- rjf: PDB\r\n          case RB_FileFormat_PDB:\r\n          {\r\n            // TODO(rjf)\r\n          }break;\r\n          \r\n          //- rjf: PE\r\n          case RB_FileFormat_PE:\r\n          {\r\n            // TODO(rjf)\r\n          }break;\r\n          \r\n          //- rjf: COFF OBJ\r\n          case RB_FileFormat_COFF_OBJ:\r\n          {\r\n            // TODO(rjf)\r\n          }break;\r\n          \r\n          //- rjf: COFF big OBJ\r\n          case RB_FileFormat_COFF_BigOBJ:\r\n          {\r\n            // TODO(rjf)\r\n          }break;\r\n          \r\n          //- rjf: COFF archive\r\n          case RB_FileFormat_COFF_Archive:\r\n          case RB_FileFormat_COFF_ThinArchive:\r\n          {\r\n            // TODO(rjf)\r\n          }break;\r\n          \r\n          //- rjf: ELF\r\n          case RB_FileFormat_ELF32:\r\n          case RB_FileFormat_ELF64:\r\n          {\r\n            String8List elf_strings = elf_dump(arena, f->data, elf_dump_subset_flags);\r\n            str8_list_concat_in_place(&output_blobs, &elf_strings);\r\n          }break;\r\n          \r\n          //- rjf: RDI file\r\n          case RB_FileFormat_RDI:\r\n          {\r\n            RDI_Parsed rdi = {0};\r\n            RDI_ParseStatus rdi_status = rdi_parse(f->data.str, f->data.size, &rdi);\r\n            U64 decompressed_size = rdi_decompressed_size_from_parsed(&rdi);\r\n            if(decompressed_size > rdi.raw_data_size)\r\n            {\r\n              U8 *decompressed_data = push_array_no_zero(arena, U8, decompressed_size);\r\n              rdi_decompress_parsed(decompressed_data, decompressed_size, &rdi);\r\n              rdi_status = rdi_parse(decompressed_data, decompressed_size, &rdi);\r\n            }\r\n            switch(rdi_status)\r\n            {\r\n              default:{}break;\r\n              case RDI_ParseStatus_HeaderDoesNotMatch:      {log_user_errorf(\"RDI parse failure: header does not match\\n\");}break;\r\n              case RDI_ParseStatus_UnsupportedVersionNumber:{log_user_errorf(\"RDI parse failure: unsupported version\\n\");}break;\r\n              case RDI_ParseStatus_InvalidDataSecionLayout: {log_user_errorf(\"RDI parse failure: invalid data section layout\\n\");}break;\r\n              case RDI_ParseStatus_Good:\r\n              {\r\n                String8List dump = rdi_dump_list_from_parsed(arena, &rdi, rdi_dump_subset_flags);\r\n                if(lane_idx() == 0)\r\n                {\r\n                  str8_list_concat_in_place(&output_blobs, &dump);\r\n                }\r\n              }break;\r\n            }\r\n          }break;\r\n        }\r\n        \r\n        //- rjf: dump file extension info\r\n        if(f->format_flags & RB_FileFormatFlag_HasDWARF)\r\n        {\r\n          if(lane_idx() == 0)\r\n          {\r\n            str8_list_pushf(arena, &output_blobs, \"// %S (%S) (DWARF)\\n\\n\", deterministic ? str8_skip_last_slash(f->path) : f->path, f->format ? rb_file_format_display_name_table[f->format] : str8_lit(\"Unsupported format\"));\r\n          }\r\n          lane_sync();\r\n          {\r\n            String8List dump = dw_dump_list_from_sections(arena, &dw, arch, dw_dump_subset_flags);\r\n            if(lane_idx() == 0)\r\n            {\r\n              str8_list_concat_in_place(&output_blobs, &dump);\r\n            }\r\n          }\r\n        }\r\n\r\n        if(eh_dump_subset_flags)\r\n        {\r\n          if(lane_idx() == 0)\r\n          {\r\n            String8List dump = eh_dump_list_from_data(arena, arch, eh_frame_hdr_vaddr, eh_frame_vaddr, eh_frame_hdr, eh_frame, eh_dump_subset_flags);\r\n            str8_list_concat_in_place(&output_blobs, &dump);\r\n          }\r\n          lane_sync();\r\n        }\r\n      }\r\n    }break;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: write outputs\r\n  //\r\n  if(lane_idx() == 0)\r\n  {\r\n    if(output_path.size != 0) ProfScope(\"write outputs [file]\")\r\n    {\r\n      B32 is_written = os_write_data_list_to_file_path(output_path, output_blobs);\r\n      if(is_written)\r\n      {\r\n        log_infof(\"Results written to %S\", output_path);\r\n      }\r\n      else\r\n      {\r\n        log_user_errorf(\"ERROR: failed to write file %S\\n\", output_path);\r\n      }\r\n    }\r\n    else ProfScope(\"write outputs [stdout]\")\r\n    {\r\n      for(String8Node *n = output_blobs.first; n != 0; n = n->next)\r\n      {\r\n        for(U64 off = 0; off < n->string.size;)\r\n        {\r\n          U64 size_to_write = Min(n->string.size - off, GB(2));\r\n          fwrite(n->string.str + off, size_to_write, 1, stdout);\r\n          off += size_to_write;\r\n        }\r\n      }\r\n      log_info(str8_lit(\"Results written to stdout\"));\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: write info & errors\r\n  //\r\n  LogScopeResult log_scope = log_scope_end(arena);\r\n  if(lane_idx() == 0)\r\n  {\r\n    if(cmd_line_has_flag(cmdline, str8_lit(\"verbose\")) && log_scope.strings[LogMsgKind_Info].size != 0)\r\n    {\r\n      String8List lines = wrapped_lines_from_string(arena, log_scope.strings[LogMsgKind_Info], 80, 80, 0);\r\n      for(String8Node *n = lines.first; n != 0; n = n->next)\r\n      {\r\n        fprintf(stderr, \"%.*s\\n\", str8_varg(n->string));\r\n      }\r\n    }\r\n    if(log_scope.strings[LogMsgKind_UserError].size != 0)\r\n    {\r\n      String8List lines = wrapped_lines_from_string(arena, log_scope.strings[LogMsgKind_UserError], 80, 80, 0);\r\n      for(String8Node *n = lines.first; n != 0; n = n->next)\r\n      {\r\n        fprintf(stderr, \"%.*s\\n\", str8_varg(n->string));\r\n      }\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/radbin/radbin.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RADBIN_H\r\n#define RADBIN_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"radbin/generated/radbin.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Thread Parameters\r\n\r\ntypedef struct RB_ThreadParams RB_ThreadParams;\r\nstruct RB_ThreadParams\r\n{\r\n  CmdLine *cmdline;\r\n  LaneCtx lane_ctx;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: File Types\r\n\r\ntypedef U32 RB_FileFormatFlags;\r\nenum\r\n{\r\n  RB_FileFormatFlag_HasDWARF = (1<<0),\r\n};\r\n\r\ntypedef struct RB_File RB_File;\r\nstruct RB_File\r\n{\r\n  RB_FileFormat format;\r\n  RB_FileFormatFlags format_flags;\r\n  String8 path;\r\n  String8 data;\r\n};\r\n\r\ntypedef struct RB_FileNode RB_FileNode;\r\nstruct RB_FileNode\r\n{\r\n  RB_FileNode *next;\r\n  RB_File *v;\r\n};\r\n\r\ntypedef struct RB_FileList RB_FileList;\r\nstruct RB_FileList\r\n{\r\n  RB_FileNode *first;\r\n  RB_FileNode *last;\r\n  U64 count;\r\n};\r\n\r\nread_only global RB_File rb_file_nil = {0};\r\n#define rb_file_list_first(list) ((list)->first ? (list)->first->v : &rb_file_nil)\r\n\r\n////////////////////////////////\r\n//~ rjf: Cross-Thread State\r\n\r\ntypedef struct RB_Shared RB_Shared;\r\nstruct RB_Shared\r\n{\r\n  RB_FileList input_files;\r\n  RB_FileList input_files_from_format_table[RB_FileFormat_COUNT];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal RB_Shared *rb_shared = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Entry Points\r\n\r\ninternal void rb_entry_point(CmdLine *cmdline);\r\ninternal void rb_thread_entry_point(void *p);\r\n\r\n#endif //RADBIN_H\r\n"
  },
  {
    "path": "src/radbin/radbin.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n@table(name   display_name)\r\nRB_FileFormatTable:\r\n{\r\n  { PDB              \"PDB\" }\r\n  { PE               \"PE\" }\r\n  { COFF_OBJ         \"COFF (OBJ)\" }\r\n  { COFF_BigOBJ      \"COFF (Big OBJ)\" }\r\n  { COFF_Archive     \"COFF (Archive)\" }\r\n  { COFF_ThinArchive \"COFF (Thin Archive)\" }\r\n  { ELF32            \"ELF32\" }\r\n  { ELF64            \"ELF64\" }\r\n  { RDI              \"RDI\" }\r\n}\r\n\r\n@enum RB_FileFormat:\r\n{\r\n  Null,\r\n  @expand(RB_FileFormatTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@data(String8) rb_file_format_display_name_table:\r\n{\r\n  `{0}`,\r\n  @expand(RB_FileFormatTable a) `str8_lit_comp(\"$(a.display_name)\")`,\r\n}\r\n"
  },
  {
    "path": "src/radbin/radbin_main.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Build Options\r\n\r\n#define BUILD_TITLE \"Epic Games Tools (R) RAD CLI Binary Utility\"\r\n#define BUILD_CONSOLE_INTERFACE 1\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n//- rjf: [h]\r\n#include \"base/base_inc.h\"\r\n#include \"linker/hash_table.h\"\r\n#include \"os/os_inc.h\"\r\n#include \"rdi/rdi_local.h\"\r\n#include \"rdi_make/rdi_make_local.h\"\r\n#include \"coff/coff_inc.h\"\r\n#include \"pe/pe.h\"\r\n#include \"elf/elf.h\"\r\n#include \"gnu/gnu.h\"\r\n#include \"elf/elf_parse.h\"\r\n#include \"elf/elf_dump.h\"\r\n#include \"codeview/codeview.h\"\r\n#include \"codeview/codeview_parse.h\"\r\n#include \"dwarf/dwarf_inc.h\"\r\n#include \"msf/msf.h\"\r\n#include \"msf/msf_parse.h\"\r\n#include \"pdb/pdb.h\"\r\n#include \"pdb/pdb_parse.h\"\r\n#include \"pdb/pdb_stringize.h\"\r\n#include \"rdi_from_coff/rdi_from_coff.h\"\r\n#include \"rdi_from_elf/rdi_from_elf.h\"\r\n#include \"rdi_from_pdb/rdi_from_pdb.h\"\r\n#include \"rdi_from_dwarf/rdi_from_dwarf.h\"\r\n#include \"radbin/radbin.h\"\r\n\r\n//- rjf: [c]\r\n#include \"base/base_inc.c\"\r\n#include \"linker/hash_table.c\"\r\n#include \"os/os_inc.c\"\r\n#include \"rdi/rdi_local.c\"\r\n#include \"rdi_make/rdi_make_local.c\"\r\n#include \"coff/coff_inc.c\"\r\n#include \"pe/pe.c\"\r\n#include \"elf/elf.c\"\r\n#include \"gnu/gnu.c\"\r\n#include \"elf/elf_parse.c\"\r\n#include \"elf/elf_dump.c\"\r\n#include \"codeview/codeview.c\"\r\n#include \"codeview/codeview_parse.c\"\r\n#include \"dwarf/dwarf_inc.c\"\r\n#include \"msf/msf.c\"\r\n#include \"msf/msf_parse.c\"\r\n#include \"pdb/pdb.c\"\r\n#include \"pdb/pdb_parse.c\"\r\n#include \"pdb/pdb_stringize.c\"\r\n#include \"rdi_from_coff/rdi_from_coff.c\"\r\n#include \"rdi_from_elf/rdi_from_elf.c\"\r\n#include \"rdi_from_pdb/rdi_from_pdb.c\"\r\n#include \"rdi_from_dwarf/rdi_from_dwarf.c\"\r\n#include \"radbin/radbin.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Entry Point\r\n\r\ninternal void\r\nentry_point(CmdLine *cmdline)\r\n{\r\n  rb_entry_point(cmdline);\r\n}\r\n"
  },
  {
    "path": "src/raddbg/generated/raddbg.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 rd_tab_fast_path_view_name_table[25] =\r\n{\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"watch\"),\r\nstr8_lit_comp(\"text\"),\r\nstr8_lit_comp(\"text\"),\r\nstr8_lit_comp(\"disasm\"),\r\nstr8_lit_comp(\"memory\"),\r\nstr8_lit_comp(\"bitmap\"),\r\nstr8_lit_comp(\"color\"),\r\nstr8_lit_comp(\"geo3d\"),\r\n};\r\n\r\nString8 rd_tab_fast_path_query_name_table[25] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"query:locals\"),\r\nstr8_lit_comp(\"query:registers\"),\r\nstr8_lit_comp(\"query:globals\"),\r\nstr8_lit_comp(\"query:thread_locals\"),\r\nstr8_lit_comp(\"query:types\"),\r\nstr8_lit_comp(\"query:procedures\"),\r\nstr8_lit_comp(\"query:call_stack\"),\r\nstr8_lit_comp(\"query:targets\"),\r\nstr8_lit_comp(\"query:breakpoints\"),\r\nstr8_lit_comp(\"query:watch_pins\"),\r\nstr8_lit_comp(\"query:debug_infos\"),\r\nstr8_lit_comp(\"query:threads\"),\r\nstr8_lit_comp(\"query:processes\"),\r\nstr8_lit_comp(\"query:machines\"),\r\nstr8_lit_comp(\"query:modules\"),\r\nstr8_lit_comp(\"query:file_path_maps\"),\r\nstr8_lit_comp(\"query:type_views\"),\r\nstr8_lit_comp(\"query:output\"),\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"\"),\r\n};\r\n\r\nRD_VocabInfo rd_vocab_info_table[358] =\r\n{\r\n{str8_lit_comp(\"type_view\"), str8_lit_comp(\"type_views\"), str8_lit_comp(\"Type View\"), str8_lit_comp(\"Type Views\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"file_path_map\"), str8_lit_comp(\"file_path_maps\"), str8_lit_comp(\"File Path Map\"), str8_lit_comp(\"File Path Maps\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"watch_pin\"), str8_lit_comp(\"watch_pins\"), str8_lit_comp(\"Watch Pin\"), str8_lit_comp(\"Watch Pins\"), RD_IconKind_Pin},\r\n{str8_lit_comp(\"debug_info\"), str8_lit_comp(\"debug_infos\"), str8_lit_comp(\"Debug Info\"), str8_lit_comp(\"Debug Info\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"watch\"), str8_lit_comp(\"watches\"), str8_lit_comp(\"Watch\"), str8_lit_comp(\"Watches\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"view\"), str8_lit_comp(\"views\"), str8_lit_comp(\"View\"), str8_lit_comp(\"Views\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"breakpoint\"), str8_lit_comp(\"breakpoints\"), str8_lit_comp(\"Breakpoint\"), str8_lit_comp(\"Breakpoints\"), RD_IconKind_CircleFilled},\r\n{str8_lit_comp(\"condition\"), str8_lit_comp(\"conditions\"), str8_lit_comp(\"Condition\"), str8_lit_comp(\"Conditions\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"location\"), str8_lit_comp(\"locations\"), str8_lit_comp(\"Location\"), str8_lit_comp(\"Locations\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"source_location\"), str8_lit_comp(\"source_locations\"), str8_lit_comp(\"Source Location\"), str8_lit_comp(\"Source Locations\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"address_location\"), str8_lit_comp(\"address_locations\"), str8_lit_comp(\"Address Location\"), str8_lit_comp(\"Address Locations\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"target\"), str8_lit_comp(\"targets\"), str8_lit_comp(\"Target\"), str8_lit_comp(\"Targets\"), RD_IconKind_Target},\r\n{str8_lit_comp(\"color\"), str8_lit_comp(\"colors\"), str8_lit_comp(\"Color\"), str8_lit_comp(\"Colors\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"theme_color\"), str8_lit_comp(\"theme_colors\"), str8_lit_comp(\"Theme Color\"), str8_lit_comp(\"Theme Colors\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"executable\"), str8_lit_comp(\"executables\"), str8_lit_comp(\"Executable\"), str8_lit_comp(\"Executables\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"arguments\"), str8_lit_comp(\"arguments\"), str8_lit_comp(\"Arguments\"), str8_lit_comp(\"Arguments\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"exe\"), str8_lit_comp(\"exes\"), str8_lit_comp(\"Executable\"), str8_lit_comp(\"Executables\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"dbg\"), str8_lit_comp(\"dbgs\"), str8_lit_comp(\"Debug Info Path\"), str8_lit_comp(\"Debug Info Paths\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"vaddr_range\"), str8_lit_comp(\"vaddr_ranges\"), str8_lit_comp(\"Virtual Address Range\"), str8_lit_comp(\"Virtual Address Ranges\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"min\"), str8_lit_comp(\"mins\"), str8_lit_comp(\"Minimum\"), str8_lit_comp(\"Minimums\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"max\"), str8_lit_comp(\"maxs\"), str8_lit_comp(\"Maximum\"), str8_lit_comp(\"Maximums\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"working_directory\"), str8_lit_comp(\"working_directories\"), str8_lit_comp(\"Working Directory\"), str8_lit_comp(\"Working Directories\"), RD_IconKind_FolderClosedFilled},\r\n{str8_lit_comp(\"entry_point\"), str8_lit_comp(\"entry_points\"), str8_lit_comp(\"Entry Point\"), str8_lit_comp(\"Entry Points\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"stdout_path\"), str8_lit_comp(\"stdout_paths\"), str8_lit_comp(\"Standard Output Path\"), str8_lit_comp(\"Standard Output Paths\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"stderr_path\"), str8_lit_comp(\"stderr_paths\"), str8_lit_comp(\"Standard Error Path\"), str8_lit_comp(\"Standard Error Paths\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"stdin_path\"), str8_lit_comp(\"stdin_paths\"), str8_lit_comp(\"Standard Input Path\"), str8_lit_comp(\"Standard Input Paths\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"window\"), str8_lit_comp(\"windows\"), str8_lit_comp(\"Window\"), str8_lit_comp(\"Windows\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"panel\"), str8_lit_comp(\"panels\"), str8_lit_comp(\"Panel\"), str8_lit_comp(\"Panels\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"tab\"), str8_lit_comp(\"tabs\"), str8_lit_comp(\"Tab\"), str8_lit_comp(\"Tabs\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"recent_project\"), str8_lit_comp(\"recent_projects\"), str8_lit_comp(\"Recent Project\"), str8_lit_comp(\"Recent Projects\"), RD_IconKind_Briefcase},\r\n{str8_lit_comp(\"recent_file\"), str8_lit_comp(\"recent_files\"), str8_lit_comp(\"Recent File\"), str8_lit_comp(\"Recent Files\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"src\"), str8_lit_comp(\"srcs\"), str8_lit_comp(\"Source\"), str8_lit_comp(\"Sources\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"dst\"), str8_lit_comp(\"dsts\"), str8_lit_comp(\"Destination\"), str8_lit_comp(\"Destinations\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"source\"), str8_lit_comp(\"sources\"), str8_lit_comp(\"Source\"), str8_lit_comp(\"Sources\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"dest\"), str8_lit_comp(\"dests\"), str8_lit_comp(\"Destination\"), str8_lit_comp(\"Destinations\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"conversion_task\"), str8_lit_comp(\"conversion_tasks\"), str8_lit_comp(\"Conversion Task\"), str8_lit_comp(\"Conversion Tasks\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"conversion_fail\"), str8_lit_comp(\"conversion_fails\"), str8_lit_comp(\"Conversion Fail\"), str8_lit_comp(\"Conversion Fails\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"lang\"), str8_lit_comp(\"langs\"), str8_lit_comp(\"Language\"), str8_lit_comp(\"Languages\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"arch\"), str8_lit_comp(\"archs\"), str8_lit_comp(\"Architecture\"), str8_lit_comp(\"Architectures\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"expr\"), str8_lit_comp(\"exprs\"), str8_lit_comp(\"Expression\"), str8_lit_comp(\"Expressions\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"expression\"), str8_lit_comp(\"expressions\"), str8_lit_comp(\"Expression\"), str8_lit_comp(\"Expressions\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"size\"), str8_lit_comp(\"sizes\"), str8_lit_comp(\"Size\"), str8_lit_comp(\"Sizes\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"count\"), str8_lit_comp(\"counts\"), str8_lit_comp(\"Count\"), str8_lit_comp(\"Counts\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"bool\"), str8_lit_comp(\"bools\"), str8_lit_comp(\"Boolean\"), str8_lit_comp(\"Booleans\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"w\"), str8_lit_comp(\"ws\"), str8_lit_comp(\"Width\"), str8_lit_comp(\"Widths\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"h\"), str8_lit_comp(\"hs\"), str8_lit_comp(\"Height\"), str8_lit_comp(\"Heights\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"fmt\"), str8_lit_comp(\"fmts\"), str8_lit_comp(\"Format\"), str8_lit_comp(\"Formats\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"addresses\"), str8_lit_comp(\"addresses\"), str8_lit_comp(\"Addresses\"), str8_lit_comp(\"Addresses\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"code_bytes\"), str8_lit_comp(\"code_bytes\"), str8_lit_comp(\"Code Bytes\"), str8_lit_comp(\"Code Bytes\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"vtx\"), str8_lit_comp(\"vtxs\"), str8_lit_comp(\"Vertex Buffer\"), str8_lit_comp(\"Vertex Buffers\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"vtx_size\"), str8_lit_comp(\"vtx_sizes\"), str8_lit_comp(\"Vertex Buffer Size\"), str8_lit_comp(\"Vertex Buffer Sizes\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"label\"), str8_lit_comp(\"labels\"), str8_lit_comp(\"Label\"), str8_lit_comp(\"Labels\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"thread\"), str8_lit_comp(\"threads\"), str8_lit_comp(\"Thread\"), str8_lit_comp(\"Threads\"), RD_IconKind_Thread},\r\n{str8_lit_comp(\"threads\"), str8_lit_comp(\"\"), str8_lit_comp(\"Threads\"), str8_lit_comp(\"\"), RD_IconKind_Threads},\r\n{str8_lit_comp(\"process\"), str8_lit_comp(\"processes\"), str8_lit_comp(\"Process\"), str8_lit_comp(\"Processes\"), RD_IconKind_Scheduler},\r\n{str8_lit_comp(\"processes\"), str8_lit_comp(\"\"), str8_lit_comp(\"Processes\"), str8_lit_comp(\"\"), RD_IconKind_Scheduler},\r\n{str8_lit_comp(\"machine\"), str8_lit_comp(\"machines\"), str8_lit_comp(\"Machine\"), str8_lit_comp(\"Machines\"), RD_IconKind_Machine},\r\n{str8_lit_comp(\"module\"), str8_lit_comp(\"modules\"), str8_lit_comp(\"Module\"), str8_lit_comp(\"Modules\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"getting_started\"), str8_lit_comp(\"\"), str8_lit_comp(\"Getting Started\"), str8_lit_comp(\"\"), RD_IconKind_QuestionMark},\r\n{str8_lit_comp(\"disasm\"), str8_lit_comp(\"\"), str8_lit_comp(\"Disassembly\"), str8_lit_comp(\"\"), RD_IconKind_Glasses},\r\n{str8_lit_comp(\"text\"), str8_lit_comp(\"\"), str8_lit_comp(\"Text\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"type\"), str8_lit_comp(\"types\"), str8_lit_comp(\"Type\"), str8_lit_comp(\"Types\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"procedure\"), str8_lit_comp(\"procedures\"), str8_lit_comp(\"Procedure\"), str8_lit_comp(\"Procedures\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"global_variable\"), str8_lit_comp(\"global_variables\"), str8_lit_comp(\"Global Variable\"), str8_lit_comp(\"Global Variables\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"global\"), str8_lit_comp(\"globals\"), str8_lit_comp(\"Global\"), str8_lit_comp(\"Globals\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"thread_variable\"), str8_lit_comp(\"thread_variables\"), str8_lit_comp(\"Thread Variable\"), str8_lit_comp(\"Thread Variables\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"thread_local\"), str8_lit_comp(\"thread_locals\"), str8_lit_comp(\"Thread Local\"), str8_lit_comp(\"Thread Locals\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"call_stack\"), str8_lit_comp(\"call_stacks\"), str8_lit_comp(\"Call Stack\"), str8_lit_comp(\"Call Stacks\"), RD_IconKind_Thread},\r\n{str8_lit_comp(\"output\"), str8_lit_comp(\"outputs\"), str8_lit_comp(\"Output\"), str8_lit_comp(\"Outputs\"), RD_IconKind_List},\r\n{str8_lit_comp(\"scheduler\"), str8_lit_comp(\"schedulers\"), str8_lit_comp(\"Scheduler\"), str8_lit_comp(\"Schedulers\"), RD_IconKind_Scheduler},\r\n{str8_lit_comp(\"register\"), str8_lit_comp(\"registers\"), str8_lit_comp(\"Register\"), str8_lit_comp(\"Registers\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"local\"), str8_lit_comp(\"locals\"), str8_lit_comp(\"Local\"), str8_lit_comp(\"Locals\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"memory\"), str8_lit_comp(\"memories\"), str8_lit_comp(\"Memory\"), str8_lit_comp(\"Memories\"), RD_IconKind_Grid},\r\n{str8_lit_comp(\"hit_count\"), str8_lit_comp(\"hit_counts\"), str8_lit_comp(\"Hit Count\"), str8_lit_comp(\"Hit Counts\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"enabled\"), str8_lit_comp(\"\"), str8_lit_comp(\"Enabled\"), str8_lit_comp(\"Enabled\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"disabled\"), str8_lit_comp(\"\"), str8_lit_comp(\"Disabled\"), str8_lit_comp(\"Disabled\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"debug_subprocesses\"), str8_lit_comp(\"\"), str8_lit_comp(\"Debug Subprocesses\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"environment\"), str8_lit_comp(\"environments\"), str8_lit_comp(\"Environment\"), str8_lit_comp(\"Environments\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"frozen\"), str8_lit_comp(\"\"), str8_lit_comp(\"Frozen\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"id\"), str8_lit_comp(\"ids\"), str8_lit_comp(\"ID\"), str8_lit_comp(\"IDs\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"last_modified_time\"), str8_lit_comp(\"last_modified_times\"), str8_lit_comp(\"Last Modified Time\"), str8_lit_comp(\"Last Modified Times\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"creation_time\"), str8_lit_comp(\"creation_times\"), str8_lit_comp(\"Creation Time\"), str8_lit_comp(\"Creation Times\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"data\"), str8_lit_comp(\"datas\"), str8_lit_comp(\"Data\"), str8_lit_comp(\"Datas\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"unattached_processes\"), str8_lit_comp(\"\"), str8_lit_comp(\"Unattached Processes\"), str8_lit_comp(\"\"), RD_IconKind_Scheduler},\r\n{str8_lit_comp(\"user\"), str8_lit_comp(\"users\"), str8_lit_comp(\"User\"), str8_lit_comp(\"Users\"), RD_IconKind_Person},\r\n{str8_lit_comp(\"project\"), str8_lit_comp(\"projects\"), str8_lit_comp(\"Project\"), str8_lit_comp(\"Projects\"), RD_IconKind_Briefcase},\r\n{str8_lit_comp(\"recent_project\"), str8_lit_comp(\"recent_projects\"), str8_lit_comp(\"Recent Project\"), str8_lit_comp(\"Recent Projects\"), RD_IconKind_Briefcase},\r\n{str8_lit_comp(\"recent_file\"), str8_lit_comp(\"recent_files\"), str8_lit_comp(\"Recent File\"), str8_lit_comp(\"Recent Files\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"show_addresses\"), str8_lit_comp(\"\"), str8_lit_comp(\"Show Addresses\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"show_code_bytes\"), str8_lit_comp(\"\"), str8_lit_comp(\"Show Code Bytes\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"show_source_lines\"), str8_lit_comp(\"\"), str8_lit_comp(\"Show Source Lines\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"show_symbol_names\"), str8_lit_comp(\"\"), str8_lit_comp(\"Show Symbol Names\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"show_line_numbers\"), str8_lit_comp(\"\"), str8_lit_comp(\"Show Line Numbers\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"syntax\"), str8_lit_comp(\"syntaxes\"), str8_lit_comp(\"Syntax\"), str8_lit_comp(\"Syntaxes\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"num_columns\"), str8_lit_comp(\"\"), str8_lit_comp(\"Number of Columns\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"bytes_per_cell\"), str8_lit_comp(\"\"), str8_lit_comp(\"Bytes Per Cell\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"bitmap\"), str8_lit_comp(\"bitmaps\"), str8_lit_comp(\"Bitmap\"), str8_lit_comp(\"Bitmaps\"), RD_IconKind_Bitmap},\r\n{str8_lit_comp(\"geo3d\"), str8_lit_comp(\"\"), str8_lit_comp(\"Geometry (3D)\"), str8_lit_comp(\"\"), RD_IconKind_Cube},\r\n{str8_lit_comp(\"address_range_size\"), str8_lit_comp(\"address_range_sizes\"), str8_lit_comp(\"Address Range Size\"), str8_lit_comp(\"Address Range Sizes\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"break_on_read\"), str8_lit_comp(\"\"), str8_lit_comp(\"Break On Read\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"break_on_write\"), str8_lit_comp(\"\"), str8_lit_comp(\"Break On Write\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"break_on_execute\"), str8_lit_comp(\"\"), str8_lit_comp(\"Break On Execution\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"yaw\"), str8_lit_comp(\"\"), str8_lit_comp(\"Yaw\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"pitch\"), str8_lit_comp(\"\"), str8_lit_comp(\"Pitch\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"zoom\"), str8_lit_comp(\"\"), str8_lit_comp(\"Zoom\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"font_size\"), str8_lit_comp(\"\"), str8_lit_comp(\"Font Size\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"row_height\"), str8_lit_comp(\"\"), str8_lit_comp(\"Row Height\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"tab_height\"), str8_lit_comp(\"\"), str8_lit_comp(\"Tab Height\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"rgba\"), str8_lit_comp(\"\"), str8_lit_comp(\"RGBA\"), str8_lit_comp(\"\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"path\"), str8_lit_comp(\"\"), str8_lit_comp(\"Path\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"guid\"), str8_lit_comp(\"\"), str8_lit_comp(\"GUID\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"launch_and_run\"), str8_lit_comp(\"\"), str8_lit_comp(\"Launch and Run\"), str8_lit_comp(\"\"), RD_IconKind_Play},\r\n{str8_lit_comp(\"launch_and_step_into\"), str8_lit_comp(\"\"), str8_lit_comp(\"Launch and Step Into\"), str8_lit_comp(\"\"), RD_IconKind_PlayStepForward},\r\n{str8_lit_comp(\"kill\"), str8_lit_comp(\"\"), str8_lit_comp(\"Kill\"), str8_lit_comp(\"\"), RD_IconKind_X},\r\n{str8_lit_comp(\"kill_all\"), str8_lit_comp(\"\"), str8_lit_comp(\"Kill All\"), str8_lit_comp(\"\"), RD_IconKind_Stop},\r\n{str8_lit_comp(\"detach\"), str8_lit_comp(\"\"), str8_lit_comp(\"Detach\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"continue\"), str8_lit_comp(\"\"), str8_lit_comp(\"Continue\"), str8_lit_comp(\"\"), RD_IconKind_Play},\r\n{str8_lit_comp(\"step_into_inst\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Into (Assembly)\"), str8_lit_comp(\"\"), RD_IconKind_StepInto},\r\n{str8_lit_comp(\"step_over_inst\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Over (Assembly)\"), str8_lit_comp(\"\"), RD_IconKind_StepOver},\r\n{str8_lit_comp(\"step_into_line\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Into (Line)\"), str8_lit_comp(\"\"), RD_IconKind_StepInto},\r\n{str8_lit_comp(\"step_over_line\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Over (Line)\"), str8_lit_comp(\"\"), RD_IconKind_StepOver},\r\n{str8_lit_comp(\"step_out\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Out\"), str8_lit_comp(\"\"), RD_IconKind_StepOut},\r\n{str8_lit_comp(\"halt\"), str8_lit_comp(\"\"), str8_lit_comp(\"Halt\"), str8_lit_comp(\"\"), RD_IconKind_Pause},\r\n{str8_lit_comp(\"soft_halt_refresh\"), str8_lit_comp(\"\"), str8_lit_comp(\"Soft Halt Refresh\"), str8_lit_comp(\"\"), RD_IconKind_Refresh},\r\n{str8_lit_comp(\"set_thread_ip\"), str8_lit_comp(\"\"), str8_lit_comp(\"Set Thread IP\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"run_to_line\"), str8_lit_comp(\"\"), str8_lit_comp(\"Run To Line\"), str8_lit_comp(\"\"), RD_IconKind_Play},\r\n{str8_lit_comp(\"run\"), str8_lit_comp(\"\"), str8_lit_comp(\"Run\"), str8_lit_comp(\"\"), RD_IconKind_Play},\r\n{str8_lit_comp(\"restart\"), str8_lit_comp(\"\"), str8_lit_comp(\"Restart\"), str8_lit_comp(\"\"), RD_IconKind_Redo},\r\n{str8_lit_comp(\"step_into\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Into\"), str8_lit_comp(\"\"), RD_IconKind_StepInto},\r\n{str8_lit_comp(\"step_over\"), str8_lit_comp(\"\"), str8_lit_comp(\"Step Over\"), str8_lit_comp(\"\"), RD_IconKind_StepOver},\r\n{str8_lit_comp(\"freeze_thread\"), str8_lit_comp(\"\"), str8_lit_comp(\"Freeze Thread\"), str8_lit_comp(\"\"), RD_IconKind_Locked},\r\n{str8_lit_comp(\"thaw_thread\"), str8_lit_comp(\"\"), str8_lit_comp(\"Thaw Thread\"), str8_lit_comp(\"\"), RD_IconKind_Unlocked},\r\n{str8_lit_comp(\"freeze_process\"), str8_lit_comp(\"\"), str8_lit_comp(\"Freeze Process\"), str8_lit_comp(\"\"), RD_IconKind_Locked},\r\n{str8_lit_comp(\"thaw_process\"), str8_lit_comp(\"\"), str8_lit_comp(\"Thaw Process\"), str8_lit_comp(\"\"), RD_IconKind_Unlocked},\r\n{str8_lit_comp(\"freeze_machine\"), str8_lit_comp(\"\"), str8_lit_comp(\"Freeze Machine\"), str8_lit_comp(\"\"), RD_IconKind_Locked},\r\n{str8_lit_comp(\"thaw_machine\"), str8_lit_comp(\"\"), str8_lit_comp(\"Thaw Machine\"), str8_lit_comp(\"\"), RD_IconKind_Unlocked},\r\n{str8_lit_comp(\"freeze_local_machine\"), str8_lit_comp(\"\"), str8_lit_comp(\"Freeze Local Machine\"), str8_lit_comp(\"\"), RD_IconKind_Machine},\r\n{str8_lit_comp(\"thaw_local_machine\"), str8_lit_comp(\"\"), str8_lit_comp(\"Thaw Local Machine\"), str8_lit_comp(\"\"), RD_IconKind_Machine},\r\n{str8_lit_comp(\"freeze_entity\"), str8_lit_comp(\"\"), str8_lit_comp(\"Freeze Entity\"), str8_lit_comp(\"\"), RD_IconKind_Unlocked},\r\n{str8_lit_comp(\"thaw_entity\"), str8_lit_comp(\"\"), str8_lit_comp(\"Thaw Entity\"), str8_lit_comp(\"\"), RD_IconKind_Locked},\r\n{str8_lit_comp(\"set_entity_color\"), str8_lit_comp(\"\"), str8_lit_comp(\"Set Entity Color\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"set_entity_name\"), str8_lit_comp(\"\"), str8_lit_comp(\"Set Entity Name\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"attach\"), str8_lit_comp(\"\"), str8_lit_comp(\"Attach\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"exit\"), str8_lit_comp(\"\"), str8_lit_comp(\"Exit\"), str8_lit_comp(\"\"), RD_IconKind_X},\r\n{str8_lit_comp(\"open_palette\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open Palette\"), str8_lit_comp(\"\"), RD_IconKind_List},\r\n{str8_lit_comp(\"run_command\"), str8_lit_comp(\"\"), str8_lit_comp(\"Run Command\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"run_ext_driver_text_command\"), str8_lit_comp(\"\"), str8_lit_comp(\"Run External Driver Text Command\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"os_event\"), str8_lit_comp(\"\"), str8_lit_comp(\"OS Event\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"select_thread\"), str8_lit_comp(\"\"), str8_lit_comp(\"Select Thread\"), str8_lit_comp(\"\"), RD_IconKind_Thread},\r\n{str8_lit_comp(\"select_unwind\"), str8_lit_comp(\"\"), str8_lit_comp(\"Select Unwind\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"up_one_frame\"), str8_lit_comp(\"\"), str8_lit_comp(\"Up One Frame\"), str8_lit_comp(\"\"), RD_IconKind_UpArrow},\r\n{str8_lit_comp(\"down_one_frame\"), str8_lit_comp(\"\"), str8_lit_comp(\"Down One Frame\"), str8_lit_comp(\"\"), RD_IconKind_DownArrow},\r\n{str8_lit_comp(\"select_entity\"), str8_lit_comp(\"\"), str8_lit_comp(\"Select\"), str8_lit_comp(\"\"), RD_IconKind_RadioHollow},\r\n{str8_lit_comp(\"deselect_entity\"), str8_lit_comp(\"\"), str8_lit_comp(\"Deselect\"), str8_lit_comp(\"\"), RD_IconKind_RadioFilled},\r\n{str8_lit_comp(\"inc_window_font_size\"), str8_lit_comp(\"\"), str8_lit_comp(\"Increase Window Font Size\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"dec_window_font_size\"), str8_lit_comp(\"\"), str8_lit_comp(\"Decrease Window Font Size\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"inc_view_font_size\"), str8_lit_comp(\"\"), str8_lit_comp(\"Increase View Font Size\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"dec_view_font_size\"), str8_lit_comp(\"\"), str8_lit_comp(\"Decrease View Font Size\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"open_window\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open New Window\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"window_settings\"), str8_lit_comp(\"\"), str8_lit_comp(\"Window Settings\"), str8_lit_comp(\"\"), RD_IconKind_Gear},\r\n{str8_lit_comp(\"close_window\"), str8_lit_comp(\"\"), str8_lit_comp(\"Close Window\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"toggle_fullscreen\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Fullscreen\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"bring_to_front\"), str8_lit_comp(\"\"), str8_lit_comp(\"Bring To Front\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"popup_accept\"), str8_lit_comp(\"\"), str8_lit_comp(\"Popup Accept\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"popup_cancel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Popup Cancel\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"reset_to_default_bindings\"), str8_lit_comp(\"\"), str8_lit_comp(\"Reset To Default Bindings\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"reset_to_default_panels\"), str8_lit_comp(\"\"), str8_lit_comp(\"Reset To Default Panel Layout\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"reset_to_compact_panels\"), str8_lit_comp(\"\"), str8_lit_comp(\"Reset To Compact Panel Layout\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"reset_to_simple_panels\"), str8_lit_comp(\"\"), str8_lit_comp(\"Reset To Simple Panel Layout\"), str8_lit_comp(\"\"), RD_IconKind_Window},\r\n{str8_lit_comp(\"new_panel_left\"), str8_lit_comp(\"\"), str8_lit_comp(\"Split Panel Left\"), str8_lit_comp(\"\"), RD_IconKind_XSplit},\r\n{str8_lit_comp(\"new_panel_up\"), str8_lit_comp(\"\"), str8_lit_comp(\"Split Panel Up\"), str8_lit_comp(\"\"), RD_IconKind_YSplit},\r\n{str8_lit_comp(\"new_panel_right\"), str8_lit_comp(\"\"), str8_lit_comp(\"Split Panel Right\"), str8_lit_comp(\"\"), RD_IconKind_XSplit},\r\n{str8_lit_comp(\"new_panel_down\"), str8_lit_comp(\"\"), str8_lit_comp(\"Split Panel Down\"), str8_lit_comp(\"\"), RD_IconKind_YSplit},\r\n{str8_lit_comp(\"split_panel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Split Panel\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"rotate_panel_columns\"), str8_lit_comp(\"\"), str8_lit_comp(\"Rotate Panel Columns\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"next_panel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Next Panel\"), str8_lit_comp(\"\"), RD_IconKind_RightArrow},\r\n{str8_lit_comp(\"prev_panel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Previous Panel\"), str8_lit_comp(\"\"), RD_IconKind_LeftArrow},\r\n{str8_lit_comp(\"focus_panel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Panel\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"focus_panel_right\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Panel Right\"), str8_lit_comp(\"\"), RD_IconKind_RightArrow},\r\n{str8_lit_comp(\"focus_panel_left\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Panel Left\"), str8_lit_comp(\"\"), RD_IconKind_LeftArrow},\r\n{str8_lit_comp(\"focus_panel_up\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Panel Up\"), str8_lit_comp(\"\"), RD_IconKind_UpArrow},\r\n{str8_lit_comp(\"focus_panel_down\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Panel Down\"), str8_lit_comp(\"\"), RD_IconKind_DownArrow},\r\n{str8_lit_comp(\"undo\"), str8_lit_comp(\"\"), str8_lit_comp(\"Undo\"), str8_lit_comp(\"\"), RD_IconKind_Undo},\r\n{str8_lit_comp(\"redo\"), str8_lit_comp(\"\"), str8_lit_comp(\"Redo\"), str8_lit_comp(\"\"), RD_IconKind_Redo},\r\n{str8_lit_comp(\"go_back\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go Back\"), str8_lit_comp(\"\"), RD_IconKind_LeftArrow},\r\n{str8_lit_comp(\"go_forward\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go Forward\"), str8_lit_comp(\"\"), RD_IconKind_RightArrow},\r\n{str8_lit_comp(\"close_panel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Close Panel\"), str8_lit_comp(\"\"), RD_IconKind_ClosePanel},\r\n{str8_lit_comp(\"focus_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Tab\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"next_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Next Tab\"), str8_lit_comp(\"\"), RD_IconKind_RightArrow},\r\n{str8_lit_comp(\"prev_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Focus Previous Tab\"), str8_lit_comp(\"\"), RD_IconKind_LeftArrow},\r\n{str8_lit_comp(\"move_tab_right\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Tab Right\"), str8_lit_comp(\"\"), RD_IconKind_RightArrow},\r\n{str8_lit_comp(\"move_tab_left\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Tab Left\"), str8_lit_comp(\"\"), RD_IconKind_LeftArrow},\r\n{str8_lit_comp(\"open_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open New Tab\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"build_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Build Tab\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"duplicate_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Duplicate Tab\"), str8_lit_comp(\"\"), RD_IconKind_Duplicate},\r\n{str8_lit_comp(\"copy_tab_full_path\"), str8_lit_comp(\"\"), str8_lit_comp(\"Copy Full Path\"), str8_lit_comp(\"\"), RD_IconKind_Clipboard},\r\n{str8_lit_comp(\"close_tab\"), str8_lit_comp(\"\"), str8_lit_comp(\"Close Tab\"), str8_lit_comp(\"\"), RD_IconKind_X},\r\n{str8_lit_comp(\"move_view\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move View\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"tab_bar_top\"), str8_lit_comp(\"\"), str8_lit_comp(\"Anchor Tab Bar To Top\"), str8_lit_comp(\"\"), RD_IconKind_UpArrow},\r\n{str8_lit_comp(\"tab_bar_bottom\"), str8_lit_comp(\"\"), str8_lit_comp(\"Anchor Tab Bar To Bottom\"), str8_lit_comp(\"\"), RD_IconKind_DownArrow},\r\n{str8_lit_comp(\"tab_settings\"), str8_lit_comp(\"\"), str8_lit_comp(\"Tab Settings\"), str8_lit_comp(\"\"), RD_IconKind_Gear},\r\n{str8_lit_comp(\"set_current_path\"), str8_lit_comp(\"\"), str8_lit_comp(\"Set Current Path\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"open\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"switch\"), str8_lit_comp(\"\"), str8_lit_comp(\"Switch\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"switch_to_partner_file\"), str8_lit_comp(\"\"), str8_lit_comp(\"Switch To Partner File\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"record_file_in_project\"), str8_lit_comp(\"\"), str8_lit_comp(\"Record File In Project\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"show_file_in_explorer\"), str8_lit_comp(\"\"), str8_lit_comp(\"Show File In Explorer\"), str8_lit_comp(\"\"), RD_IconKind_FolderClosedFilled},\r\n{str8_lit_comp(\"go_to_disassembly\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go To Disassembly\"), str8_lit_comp(\"\"), RD_IconKind_Glasses},\r\n{str8_lit_comp(\"go_to_source\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go To Source\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"set_file_replacement_path\"), str8_lit_comp(\"\"), str8_lit_comp(\"Set File Replacement Path\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"new_user\"), str8_lit_comp(\"\"), str8_lit_comp(\"New User\"), str8_lit_comp(\"\"), RD_IconKind_Add},\r\n{str8_lit_comp(\"new_project\"), str8_lit_comp(\"\"), str8_lit_comp(\"New Project\"), str8_lit_comp(\"\"), RD_IconKind_Add},\r\n{str8_lit_comp(\"open_user\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open User\"), str8_lit_comp(\"\"), RD_IconKind_Person},\r\n{str8_lit_comp(\"open_project\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open Project\"), str8_lit_comp(\"\"), RD_IconKind_Briefcase},\r\n{str8_lit_comp(\"open_recent_project\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open Recent Project\"), str8_lit_comp(\"\"), RD_IconKind_Briefcase},\r\n{str8_lit_comp(\"save_user\"), str8_lit_comp(\"\"), str8_lit_comp(\"Save User\"), str8_lit_comp(\"\"), RD_IconKind_Save},\r\n{str8_lit_comp(\"save_project\"), str8_lit_comp(\"\"), str8_lit_comp(\"Save Project\"), str8_lit_comp(\"\"), RD_IconKind_Save},\r\n{str8_lit_comp(\"record_user_as_last_opened\"), str8_lit_comp(\"\"), str8_lit_comp(\"Record User As Last Opened\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"record_project_in_user\"), str8_lit_comp(\"\"), str8_lit_comp(\"Records Project In User\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"write_user_data\"), str8_lit_comp(\"\"), str8_lit_comp(\"Write User Data\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"write_project_data\"), str8_lit_comp(\"\"), str8_lit_comp(\"Write Project Data\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"user_settings\"), str8_lit_comp(\"\"), str8_lit_comp(\"User Settings\"), str8_lit_comp(\"\"), RD_IconKind_Gear},\r\n{str8_lit_comp(\"project_settings\"), str8_lit_comp(\"\"), str8_lit_comp(\"Project Settings\"), str8_lit_comp(\"\"), RD_IconKind_Gear},\r\n{str8_lit_comp(\"edit\"), str8_lit_comp(\"\"), str8_lit_comp(\"Edit\"), str8_lit_comp(\"\"), RD_IconKind_Pencil},\r\n{str8_lit_comp(\"accept\"), str8_lit_comp(\"\"), str8_lit_comp(\"Accept\"), str8_lit_comp(\"\"), RD_IconKind_CheckFilled},\r\n{str8_lit_comp(\"cancel\"), str8_lit_comp(\"\"), str8_lit_comp(\"Cancel\"), str8_lit_comp(\"\"), RD_IconKind_X},\r\n{str8_lit_comp(\"move_left\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Left\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_right\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Right\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_left_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Left Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_right_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Right Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_left_chunk\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Left Chunk\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_right_chunk\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Right Chunk\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_chunk\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Chunk\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_chunk\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Chunk\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_page\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Page\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_page\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Page\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_whole\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Whole\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_whole\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Whole\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_left_chunk_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Left Chunk Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_right_chunk_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Right Chunk Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_chunk_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Chunk Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_chunk_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Chunk Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_page_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Page Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_page_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Page Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_whole_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Whole Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_whole_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Whole Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_up_reorder\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Up Reorder\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_down_reorder\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Down Reorder\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_home\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Home\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_end\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move End\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_home_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Home Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_end_select\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move End Select\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"select_all\"), str8_lit_comp(\"\"), str8_lit_comp(\"Select All\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"delete_single\"), str8_lit_comp(\"\"), str8_lit_comp(\"Delete Single\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"delete_chunk\"), str8_lit_comp(\"\"), str8_lit_comp(\"Delete Chunk\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"backspace_single\"), str8_lit_comp(\"\"), str8_lit_comp(\"Backspace Single\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"backspace_chunk\"), str8_lit_comp(\"\"), str8_lit_comp(\"Backspace Chunk\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"copy\"), str8_lit_comp(\"\"), str8_lit_comp(\"Copy\"), str8_lit_comp(\"\"), RD_IconKind_Clipboard},\r\n{str8_lit_comp(\"cut\"), str8_lit_comp(\"\"), str8_lit_comp(\"Cut\"), str8_lit_comp(\"\"), RD_IconKind_Clipboard},\r\n{str8_lit_comp(\"paste\"), str8_lit_comp(\"\"), str8_lit_comp(\"Paste\"), str8_lit_comp(\"\"), RD_IconKind_Clipboard},\r\n{str8_lit_comp(\"insert_text\"), str8_lit_comp(\"\"), str8_lit_comp(\"Insert Text\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_next\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Next\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"move_prev\"), str8_lit_comp(\"\"), str8_lit_comp(\"Move Previous\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"goto_line\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go To Line\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"goto_address\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go To Address\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"center_cursor\"), str8_lit_comp(\"\"), str8_lit_comp(\"Center Cursor\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"contain_cursor\"), str8_lit_comp(\"\"), str8_lit_comp(\"Contain Cursor\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"find_next\"), str8_lit_comp(\"\"), str8_lit_comp(\"Find Next\"), str8_lit_comp(\"\"), RD_IconKind_Find},\r\n{str8_lit_comp(\"find_prev\"), str8_lit_comp(\"\"), str8_lit_comp(\"Find Previous\"), str8_lit_comp(\"\"), RD_IconKind_Find},\r\n{str8_lit_comp(\"find_thread\"), str8_lit_comp(\"\"), str8_lit_comp(\"Find Thread\"), str8_lit_comp(\"\"), RD_IconKind_Find},\r\n{str8_lit_comp(\"find_selected_thread\"), str8_lit_comp(\"\"), str8_lit_comp(\"Find Selected Thread\"), str8_lit_comp(\"\"), RD_IconKind_Find},\r\n{str8_lit_comp(\"goto_name\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go To Name\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"goto_name_at_cursor\"), str8_lit_comp(\"\"), str8_lit_comp(\"Go To Name At Cursor\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"toggle_watch_expr\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Watch Expression\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"toggle_watch_expr_at_cursor\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Watch Expression At Cursor\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"toggle_watch_expr_at_mouse\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Watch Expression At Mouse\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"enable_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Enable\"), str8_lit_comp(\"\"), RD_IconKind_CheckHollow},\r\n{str8_lit_comp(\"disable_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Disable\"), str8_lit_comp(\"\"), RD_IconKind_CheckFilled},\r\n{str8_lit_comp(\"select_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Select\"), str8_lit_comp(\"\"), RD_IconKind_RadioHollow},\r\n{str8_lit_comp(\"deselect_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Deselect\"), str8_lit_comp(\"\"), RD_IconKind_RadioFilled},\r\n{str8_lit_comp(\"remove_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Remove\"), str8_lit_comp(\"\"), RD_IconKind_Trash},\r\n{str8_lit_comp(\"name_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Name\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"condition_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Condition\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"duplicate_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Duplicate\"), str8_lit_comp(\"\"), RD_IconKind_Duplicate},\r\n{str8_lit_comp(\"relocate_cfg\"), str8_lit_comp(\"\"), str8_lit_comp(\"Relocate\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"save_cfg_to_project\"), str8_lit_comp(\"\"), str8_lit_comp(\"Save To Project\"), str8_lit_comp(\"\"), RD_IconKind_Briefcase},\r\n{str8_lit_comp(\"add_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Line Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_CircleFilled},\r\n{str8_lit_comp(\"add_address_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Address Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_CircleFilled},\r\n{str8_lit_comp(\"add_function_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Function Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_CircleFilled},\r\n{str8_lit_comp(\"toggle_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Line Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_CircleFilled},\r\n{str8_lit_comp(\"remove_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Remove Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_Trash},\r\n{str8_lit_comp(\"enable_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Enable Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_CheckFilled},\r\n{str8_lit_comp(\"disable_breakpoint\"), str8_lit_comp(\"\"), str8_lit_comp(\"Disable Breakpoint\"), str8_lit_comp(\"\"), RD_IconKind_CheckHollow},\r\n{str8_lit_comp(\"clear_breakpoints\"), str8_lit_comp(\"\"), str8_lit_comp(\"Clear Breakpoints\"), str8_lit_comp(\"\"), RD_IconKind_Trash},\r\n{str8_lit_comp(\"list_breakpoints\"), str8_lit_comp(\"\"), str8_lit_comp(\"List Breakpoints\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"clear_output\"), str8_lit_comp(\"\"), str8_lit_comp(\"Clear Output\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"add_watch_pin\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Watch Pin\"), str8_lit_comp(\"\"), RD_IconKind_Pin},\r\n{str8_lit_comp(\"toggle_watch_pin\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Watch Pin\"), str8_lit_comp(\"\"), RD_IconKind_Pin},\r\n{str8_lit_comp(\"load_debug_info\"), str8_lit_comp(\"\"), str8_lit_comp(\"Load Debug Info\"), str8_lit_comp(\"\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"unload_debug_info\"), str8_lit_comp(\"\"), str8_lit_comp(\"Unload Debug Info\"), str8_lit_comp(\"\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"add_type_view\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Type View\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"add_file_path_map\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add File Path Map\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"edit_user_theme\"), str8_lit_comp(\"\"), str8_lit_comp(\"Edit User Theme\"), str8_lit_comp(\"\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"edit_project_theme\"), str8_lit_comp(\"\"), str8_lit_comp(\"Edit Project Theme\"), str8_lit_comp(\"\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"add_theme_color\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Theme Color\"), str8_lit_comp(\"\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"fork_theme\"), str8_lit_comp(\"\"), str8_lit_comp(\"Fork Theme\"), str8_lit_comp(\"\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"save_theme\"), str8_lit_comp(\"\"), str8_lit_comp(\"Save Theme\"), str8_lit_comp(\"\"), RD_IconKind_Save},\r\n{str8_lit_comp(\"save_and_set_theme\"), str8_lit_comp(\"\"), str8_lit_comp(\"Save And Set Theme\"), str8_lit_comp(\"\"), RD_IconKind_Save},\r\n{str8_lit_comp(\"set_next_statement\"), str8_lit_comp(\"\"), str8_lit_comp(\"Set Next Statement\"), str8_lit_comp(\"\"), RD_IconKind_RightArrow},\r\n{str8_lit_comp(\"add_target\"), str8_lit_comp(\"\"), str8_lit_comp(\"Add Target\"), str8_lit_comp(\"\"), RD_IconKind_Target},\r\n{str8_lit_comp(\"select_target\"), str8_lit_comp(\"\"), str8_lit_comp(\"Select Target\"), str8_lit_comp(\"\"), RD_IconKind_Target},\r\n{str8_lit_comp(\"enable_target\"), str8_lit_comp(\"\"), str8_lit_comp(\"Enable Target\"), str8_lit_comp(\"\"), RD_IconKind_CheckFilled},\r\n{str8_lit_comp(\"disable_target\"), str8_lit_comp(\"\"), str8_lit_comp(\"Disable Target\"), str8_lit_comp(\"\"), RD_IconKind_CheckHollow},\r\n{str8_lit_comp(\"remove_target\"), str8_lit_comp(\"\"), str8_lit_comp(\"Remove Target\"), str8_lit_comp(\"\"), RD_IconKind_Trash},\r\n{str8_lit_comp(\"register_as_jit_debugger\"), str8_lit_comp(\"\"), str8_lit_comp(\"Register As Just-In-Time (JIT) Debugger\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"find_code_location\"), str8_lit_comp(\"\"), str8_lit_comp(\"Find Code Location\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"search\"), str8_lit_comp(\"\"), str8_lit_comp(\"Search\"), str8_lit_comp(\"\"), RD_IconKind_Find},\r\n{str8_lit_comp(\"search_backwards\"), str8_lit_comp(\"\"), str8_lit_comp(\"Search Backwards\"), str8_lit_comp(\"\"), RD_IconKind_Find},\r\n{str8_lit_comp(\"pick_file\"), str8_lit_comp(\"\"), str8_lit_comp(\"Pick File\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"pick_folder\"), str8_lit_comp(\"\"), str8_lit_comp(\"Pick Folder\"), str8_lit_comp(\"\"), RD_IconKind_FolderOpenFilled},\r\n{str8_lit_comp(\"pick_file_or_folder\"), str8_lit_comp(\"\"), str8_lit_comp(\"Pick File/Folder\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"push_query\"), str8_lit_comp(\"\"), str8_lit_comp(\"Push Query\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"complete_query\"), str8_lit_comp(\"\"), str8_lit_comp(\"Complete Query\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"cancel_query\"), str8_lit_comp(\"\"), str8_lit_comp(\"Cancel Query\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"update_query\"), str8_lit_comp(\"\"), str8_lit_comp(\"Update Query\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"open_event_buffer\"), str8_lit_comp(\"\"), str8_lit_comp(\"Open Event Buffer\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"close_event_buffer\"), str8_lit_comp(\"\"), str8_lit_comp(\"Close Event Buffer\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"toggle_dev_menu\"), str8_lit_comp(\"\"), str8_lit_comp(\"Toggle Developer Menu\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"log_marker\"), str8_lit_comp(\"\"), str8_lit_comp(\"Log Marker\"), str8_lit_comp(\"\"), RD_IconKind_Null},\r\n{str8_lit_comp(\"watches\"), str8_lit_comp(\"\"), str8_lit_comp(\"Watch\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"locals\"), str8_lit_comp(\"\"), str8_lit_comp(\"Locals\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"registers\"), str8_lit_comp(\"\"), str8_lit_comp(\"Registers\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"globals\"), str8_lit_comp(\"\"), str8_lit_comp(\"Globals\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"thread_locals\"), str8_lit_comp(\"\"), str8_lit_comp(\"Thread Locals\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"types\"), str8_lit_comp(\"\"), str8_lit_comp(\"Types\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"procedures\"), str8_lit_comp(\"\"), str8_lit_comp(\"Procedures\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"call_stack\"), str8_lit_comp(\"\"), str8_lit_comp(\"Call Stack\"), str8_lit_comp(\"\"), RD_IconKind_Thread},\r\n{str8_lit_comp(\"targets\"), str8_lit_comp(\"\"), str8_lit_comp(\"Targets\"), str8_lit_comp(\"\"), RD_IconKind_Target},\r\n{str8_lit_comp(\"breakpoints\"), str8_lit_comp(\"\"), str8_lit_comp(\"Breakpoints\"), str8_lit_comp(\"\"), RD_IconKind_CircleFilled},\r\n{str8_lit_comp(\"watch_pins\"), str8_lit_comp(\"\"), str8_lit_comp(\"Watch Pins\"), str8_lit_comp(\"\"), RD_IconKind_Pin},\r\n{str8_lit_comp(\"debug_infos\"), str8_lit_comp(\"\"), str8_lit_comp(\"Debug Info\"), str8_lit_comp(\"\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"threads\"), str8_lit_comp(\"\"), str8_lit_comp(\"Threads\"), str8_lit_comp(\"\"), RD_IconKind_Threads},\r\n{str8_lit_comp(\"processes\"), str8_lit_comp(\"\"), str8_lit_comp(\"Processes\"), str8_lit_comp(\"\"), RD_IconKind_Scheduler},\r\n{str8_lit_comp(\"machines\"), str8_lit_comp(\"\"), str8_lit_comp(\"Machines\"), str8_lit_comp(\"\"), RD_IconKind_Machine},\r\n{str8_lit_comp(\"modules\"), str8_lit_comp(\"\"), str8_lit_comp(\"Modules\"), str8_lit_comp(\"\"), RD_IconKind_Module},\r\n{str8_lit_comp(\"file_path_maps\"), str8_lit_comp(\"\"), str8_lit_comp(\"File Path Map\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"type_views\"), str8_lit_comp(\"\"), str8_lit_comp(\"Type Views\"), str8_lit_comp(\"\"), RD_IconKind_Binoculars},\r\n{str8_lit_comp(\"output\"), str8_lit_comp(\"\"), str8_lit_comp(\"Output\"), str8_lit_comp(\"\"), RD_IconKind_List},\r\n{str8_lit_comp(\"text\"), str8_lit_comp(\"\"), str8_lit_comp(\"Text\"), str8_lit_comp(\"\"), RD_IconKind_FileOutline},\r\n{str8_lit_comp(\"disasm\"), str8_lit_comp(\"\"), str8_lit_comp(\"Disassembly\"), str8_lit_comp(\"\"), RD_IconKind_Glasses},\r\n{str8_lit_comp(\"memory\"), str8_lit_comp(\"\"), str8_lit_comp(\"Memory\"), str8_lit_comp(\"\"), RD_IconKind_Grid},\r\n{str8_lit_comp(\"bitmap\"), str8_lit_comp(\"\"), str8_lit_comp(\"Bitmap\"), str8_lit_comp(\"\"), RD_IconKind_Bitmap},\r\n{str8_lit_comp(\"color\"), str8_lit_comp(\"\"), str8_lit_comp(\"Color\"), str8_lit_comp(\"\"), RD_IconKind_Palette},\r\n{str8_lit_comp(\"geo3d\"), str8_lit_comp(\"\"), str8_lit_comp(\"Geometry (3D)\"), str8_lit_comp(\"\"), RD_IconKind_Cube},\r\n};\r\n\r\nRD_NameSchemaInfo rd_name_schema_info_table[26] =\r\n{\r\n{str8_lit_comp(\"user\"), str8_lit_comp(\"@expand_commands(edit_user_theme) x:\\n{\\n  //- rjf: animations\\n  @display_name('Animations') @description(\\\"Enables animations.\\\")\\n  @default(1) 'animations': bool,\\n  @display_name('Scrolling Animations') @description(\\\"Enables scrolling animations.\\\")\\n  @expand_if(\\\"$.animations\\\") @default(1) 'scrolling_animations': bool,\\n  @display_name('Tooltip Animations') @description(\\\"Enables tooltip animations.\\\")\\n  @expand_if(\\\"$.animations\\\") @default(1) 'tooltip_animations': bool,\\n  @display_name('Menu Animations') @description(\\\"Enables menu animations.\\\")\\n  @expand_if(\\\"$.animations\\\") @default(1) 'menu_animations': bool,\\n\\n  //- rjf: fonts\\n  @display_name('UI Font') @description(\\\"The name of, or path to, the font used when displaying non-code UI elements.\\\")\\n  @default('') 'main_font': string,\\n  @display_name('Code Font') @description(\\\"The name of, or path to, the font used when displaying code.\\\")\\n  @default('') 'code_font': string,\\n\\n  //- rjf: theme\\n  @default(\\\"Default (Dark)\\\") @display_name('User Theme')\\n  @description(\\\"The user's theme, which describes all colors used throughout the UI.\\\")\\n  'theme': string,\\n  @no_expand @display_name('User Theme')\\n  'theme_colors': query,\\n\\n  //- rjf: autocompletion\\n  @display_name('Autocompletion Lister') @description(\\\"Enables the autocompletion lister while typing expressions.\\\") @default(1)\\n  'autocompletion_lister': bool,\\n  @display_name('View Call Argument Helper') @description(\\\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\\\") @default(1)\\n  'view_call_argument_helper': bool,\\n\\n  //- rjf: scope decorations\\n  @default(1) @display_name('Cursor Scope Lines') @description(\\\"Controls whether or not scopes containing the cursor in text views are drawn.\\\")\\n  'cursor_scope_lines': bool,\\n\\n  //- rjf: cursor decorations\\n  @default(1) @display_name('Cursor Trail') @description(\\\"Controls whether or not a movement trail of the cursor is drawn.\\\")\\n  'cursor_trail': bool,\\n\\n  //- rjf: thread & breakpoint decorations\\n  @default(1) @display_name('Thread Lines') @description(\\\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\\\")\\n  'thread_lines': bool,\\n  @default(1) @display_name('Thread Glow') @description(\\\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\\\")\\n  'thread_glow': bool,\\n  @default(1) @display_name('Breakpoint Lines') @description(\\\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\\\")\\n  'breakpoint_lines': bool,\\n  @default(1) @display_name('Breakpoint Glow') @description(\\\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\\\")\\n  'breakpoint_glow': bool,\\n\\n  //- rjf: occluding background settings\\n  @default(0) @display_name('Opaque Backgrounds') @description(\\\"Controls whether or not all floating background colors are forced to be fully opaque.\\\")\\n  'opaque_backgrounds': bool,\\n  @default(1) @display_name('Background Blur') @description(\\\"Controls whether or not occluded regions behind floating elements are blurred.\\\")\\n  'background_blur': bool,\\n\\n  //- rjf: appearance settings\\n  @default(1) @display_name('Drop Shadows') @description(\\\"Controls whether or not drop shadows are drawn.\\\")\\n  'drop_shadows': bool,\\n  @default(1.f) @display_name('Rounded Corner Amount') @description(\\\"Controls the degree to which UI corners are rounded.\\\")\\n  'rounded_corner_amount': @range[0, 1] f32,\\n\\n  //- rjf: code formatting settings\\n  @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\\n\\n  //- rjf: windows style menu bar\\n  @default(1) @display_name('Focus Menu Bar With Alt') @description(\\\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\\\")\\n  'focus_menu_bar_with_alt': bool,\\n\\n  //- rjf: native filesystem dialogues\\n  @default(0) @display_name('Use Native File System Dialog') @description(\\\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\\\")\\n  'use_native_file_system_dialog': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"project\"), str8_lit_comp(\"@expand_commands(edit_project_theme) x:\\n{\\n  @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\\n\\n  //- rjf: visualizers\\n  @display_name('Use Default C++ STL Type Visualizers') @description(\\\"Enables the built-in type views for C++ STL types.\\\")\\n  @default(1) use_default_stl_type_views: bool,\\n  @display_name('Use Default Unreal Engine Type Visualizers') @description(\\\"Enables the built-in type views for Unreal Engine types.\\\")\\n  @default(1) use_default_ue_type_views: bool,\\n\\n  //- rjf: theme\\n  @default(\\\"None\\\") @display_name('Project Theme') @description(\\\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\\\")\\n  'theme': string,\\n  @no_expand @display_name('Project Theme') @description(\\\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\\\")\\n  'theme_colors': query,\\n\\n  //- rjf: exception settings\\n  @default(1) @display_name(\\\"Break On Win32 Control-C Exceptions\\\") @description(\\\"Code: 0x40010005\\\")\\n  win32_ctrl_c: bool;\\n  @default(1) @display_name(\\\"Break On Win32 Control-Break Exceptions\\\") @description(\\\"Code: 0x40010008\\\")\\n  win32_ctrl_break: bool;\\n  @default(0) @display_name(\\\"Break On Win32 WinRT Originate Error Exceptions\\\") @description(\\\"Code: 0x40080201\\\")\\n  win32_win_rt_originate_error: bool;\\n  @default(0) @display_name(\\\"Break On Win32 WinRT Transform Error Exceptions\\\") @description(\\\"Code: 0x40080202\\\")\\n  win32_win_rt_transform_error: bool;\\n  @default(0) @display_name(\\\"Break On Win32 RPC Call Cancelled Exceptions\\\") @description(\\\"Code: 0x0000071a\\\")\\n  win32_rpc_call_cancelled: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Data Type Misalignment Exceptions\\\") @description(\\\"Code: 0x80000002\\\")\\n  win32_datatype_misalignment: bool;\\n  @default(1) @display_name(\\\"Break On Win32 Access Violation Exceptions\\\") @description(\\\"Code: 0xc0000005\\\")\\n  win32_access_violation: bool;\\n  @default(0) @display_name(\\\"Break On Win32 In Page Error Exceptions\\\") @description(\\\"Code: 0xc0000006\\\")\\n  win32_in_page_error: bool;\\n  @default(1) @display_name(\\\"Break On Win32 Invalid Handle Specified Exceptions\\\") @description(\\\"Code: 0xc0000008\\\")\\n  win32_invalid_handle: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Not Enough Quota Exceptions\\\") @description(\\\"Code: 0xc0000017\\\")\\n  win32_not_enough_quota: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Illegal Instruction Exceptions\\\") @description(\\\"Code: 0xc000001d\\\")\\n  win32_illegal_instruction: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Cannot Continue From Exception Exceptions\\\") @description(\\\"Code: 0xc0000025\\\")\\n  win32_cannot_continue_exception: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\\\") @description(\\\"Code: 0xc0000026\\\")\\n  win32_invalid_exception_disposition: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Array Bounds Exceeded Exceptions\\\") @description(\\\"Code: 0xc000008c\\\")\\n  win32_array_bounds_exceeded: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Denormal Operand Exceptions\\\") @description(\\\"Code: 0xc000008d\\\")\\n  win32_floating_point_denormal_operand: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Division By Zero Exceptions\\\") @description(\\\"Code: 0xc000008e\\\")\\n  win32_floating_point_division_by_zero: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Inexact Result Exceptions\\\") @description(\\\"Code: 0xc000008f\\\")\\n  win32_floating_point_inexact_result: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Invalid Operation Exceptions\\\") @description(\\\"Code: 0xc0000090\\\")\\n  win32_floating_point_invalid_operation: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Overflow Exceptions\\\") @description(\\\"Code: 0xc0000091\\\")\\n  win32_floating_point_overflow: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Stack Check Exceptions\\\") @description(\\\"Code: 0xc0000092\\\")\\n  win32_floating_point_stack_check: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating-Point Underflow Exceptions\\\") @description(\\\"Code: 0xc0000093\\\")\\n  win32_floating_point_underflow: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Integer Division By Zero Exceptions\\\") @description(\\\"Code: 0xc0000094\\\")\\n  win32_integer_division_by_zero: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Integer Overflow Exceptions\\\") @description(\\\"Code: 0xc0000095\\\")\\n  win32_integer_overflow: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Privileged Instruction Exceptions\\\") @description(\\\"Code: 0xc0000096\\\")\\n  win32_privileged_instruction: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Stack Overflow Exceptions\\\") @description(\\\"Code: 0xc00000fd\\\")\\n  win32_stack_overflow: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Unable To Locate DLL Exceptions\\\") @description(\\\"Code: 0xc0000135\\\")\\n  win32_unable_to_locate_dll: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Ordinal Not Found Exceptions\\\") @description(\\\"Code: 0xc0000138\\\")\\n  win32_ordinal_not_found: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Entry Point Not Found Exceptions\\\") @description(\\\"Code: 0xc0000139\\\")\\n  win32_entry_point_not_found: bool;\\n  @default(0) @display_name(\\\"Break On Win32 DLL Initialization Failed Exceptions\\\") @description(\\\"Code: 0xc0000142\\\")\\n  win32_dll_initialization_failed: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\\\") @description(\\\"Code: 0xc00002b4\\\")\\n  win32_floating_point_sse_multiple_faults: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\\\") @description(\\\"Code: 0xc00002b5\\\")\\n  win32_floating_point_sse_multiple_traps: bool;\\n  @default(1) @display_name(\\\"Break On Win32 Assertion Failed Exceptions\\\") @description(\\\"Code: 0xc0000420\\\")\\n  win32_assertion_failed: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Module Not Found Exceptions\\\") @description(\\\"Code: 0xc06d007e\\\")\\n  win32_module_not_found: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Procedure Not Found Exceptions\\\") @description(\\\"Code: 0xc06d007f\\\")\\n  win32_procedure_not_found: bool;\\n  @default(1) @display_name(\\\"Break On Win32 Sanitizer Error Detected Exceptions\\\") @description(\\\"Code: 0xe073616e\\\")\\n  win32_sanitizer_error_detected: bool;\\n  @default(0) @display_name(\\\"Break On Win32 Sanitizer Raw Access Violation Exceptions\\\") @description(\\\"Code: 0xe0736171\\\")\\n  win32_sanitizer_raw_access_violation: bool;\\n  @default(1) @display_name(\\\"Break On Win32 DirectX Debug Layer Exceptions\\\") @description(\\\"Code: 0x0000087a\\\")\\n  win32_directx_debug_layer: bool;\\n}\\n\")},\r\n{str8_lit_comp(\"theme_color\"), str8_lit_comp(\"@collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\\n@row_commands(duplicate_cfg, remove_cfg)\\nx:\\n{\\n  @display_name('Tags') tags: string,\\n  @display_name('Value') value: @color @hex u32,\\n}\\n\")},\r\n{str8_lit_comp(\"window\"), str8_lit_comp(\"x:\\n{\\n  //- rjf: text rasterization settings\\n  @default(1) @display_name('Smooth UI Text') @description(\\\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\\\")\\n  'smooth_ui_text': bool,\\n  @default(1) @display_name('Hint UI Text') @description(\\\"Controls whether or not UI text is hinted, for better text readability at small sizes.\\\")\\n  'hint_ui_text': bool,\\n  @default(0) @display_name('Smooth Code Text') @description(\\\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\\\")\\n  'smooth_code_text': bool,\\n  @default(1) @display_name('Hint Code Text') @description(\\\"Controls whether or not code text is hinted, for better text readability at small sizes.\\\")\\n  'hint_code_text': bool,\\n  @default(11) @display_name('Window Font Size') @description(\\\"Controls the window's default font size. Does not apply to tabs with their own font size set.\\\")\\n  'font_size': @range[6, 72] u64,\\n\\n  //- rjf: size settings\\n  @default(3.f) @display_name('Window Row Height') @description(\\\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\\\")\\n  'row_height': @range[1.75f, 5.f] f32,\\n  @default(3.f) @description(\\\"Controls the height of tabs, in multiples of the font size.\\\")\\n  'tab_height': @range[1.75f, 5.f] f32,\\n\\n  //- rjf: theme settings\\n  @default(1) @display_name('Use Project Theme') @description(\\\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\\\")\\n  'use_project_theme': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"tab\"), str8_lit_comp(\"@row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\\nx:\\n{\\n  @override @display_name('Tab Font Size') @description(\\\"Controls the tab's font size.\\\") @no_callee_helper\\n  'font_size': @range[6, 72] u64,\\n}\\n\")},\r\n{str8_lit_comp(\"watch\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n  @override @display_name('Tab Row Height') @description(\\\"Controls the tab's row height, in multiples of the font size.\\\")\\n  'row_height': @range[1.75f, 5.f] f32,\\n  'label': code_string,\\n  @description(\\\"The root expression which is evaluated to produce the watch window.\\\")\\n  'expression': expr_string,\\n  @no_expand 'watches': query,\\n}\\n\")},\r\n{str8_lit_comp(\"list\"), str8_lit_comp(\"x:\\n{\\n  @description(\\\"An expression describing the first node in the list.\\\")\\n  'expression': expr_string,\\n  @order(0) @description(\\\"The name of the member which encodes the link to the next node.\\\")\\n  'member_name': code_string,\\n}\\n\")},\r\n{str8_lit_comp(\"text\"), str8_lit_comp(\"@inherit(tab) @expand_commands(@output clear_output) x:\\n{\\n  @description(\\\"An expression to describe data which should be viewed as text or code.\\\")\\n  'expression': expr_string,\\n  @description(\\\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\\\")\\n  'lang': code_string,\\n  @default(1) @description(\\\"Controls whether or not line numbers are shown.\\\")\\n  'show_line_numbers':bool,\\n  @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\\\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\\\")\\n  'line_wrapping': bool,\\n  @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\\\"Scrolls to the bottom if the text is changed.\\\")\\n  'scroll_to_bottom_on_change': bool,\\n  @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\\\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\\\")\\n  'auto': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"disasm\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n  @description(\\\"An expression to describe the base address or offset of the disassembly.\\\")\\n  'expression': expr_string,\\n  'arch':        code_string,\\n  'syntax':      code_string,\\n  'size':        expr_string,\\n  @no_callee_helper @default(1) @description(\\\"Controls whether or not addresses are shown in the disassembly text.\\\")\\n  'show_addresses':    bool,\\n  @no_callee_helper @default(0) @description(\\\"Controls whether or not code bytes are shown in the disassembly text.\\\")\\n  'show_code_bytes':   bool,\\n  @no_callee_helper @default(1) @description(\\\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\\\")\\n  'show_source_lines': bool,\\n  @no_callee_helper @default(1) @description(\\\"Controls whether or not disassembly text is decorated with symbol names.\\\")\\n  'show_symbol_names': bool,\\n  @no_callee_helper @default(1) @description(\\\"Controls whether or not line numbers are shown.\\\")\\n  'show_line_numbers': bool,\\n\\n}\\n\")},\r\n{str8_lit_comp(\"memory\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n  @description(\\\"An expression which refers to the base address of data which should be viewed as memory.\\\")\\n  'expression': expr_string,\\n  @display_name(\\\"Address Range Size\\\") @description(\\\"The number of bytes of the viewed memory range.\\\")\\n  'size': expr_string,\\n  @display_name(\\\"Cursor Address\\\") @description(\\\"The address of the cursor.\\\")\\n  'cursor': expr_string,\\n  @display_name(\\\"Cursor Size\\\") @description(\\\"The size, in bytes, of the cursor.\\\")\\n  'cursor_size': @range[1, 16] u64,\\n  @default(16) @description(\\\"The number of columns to build before building new rows.\\\")\\n  'num_columns': @range[1, 64] u64,\\n  @default(1) @display_name(\\\"Track Mark To Cursor\\\") @description(\\\"Ensures that the mark always follows the cursor, if the cursor value is updated.\\\")\\n  'track_mark_to_cursor': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"bitmap\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n  @description(\\\"An expression which refers to the base address of data which should be viewed as a bitmap.\\\")\\n  'expression': expr_string,\\n  @description(\\\"An expression describing the width of the bitmap, in pixels.\\\") @order(0) 'w': u64,\\n  @description(\\\"An expression describing the height of the bitmap, in pixels.\\\") @order(1) 'h': u64,\\n  @display_name(\\\"Bitmap Format\\\") @description(\\\"The pixel format that the bitmap data should be interpreted as being within.\\\")\\n  'fmt': code_string,\\n}\\n\")},\r\n{str8_lit_comp(\"color\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n  @display_name(\\\"Value\\\") @description(\\\"An expression to describe the value or location of the color.\\\")\\n  'expression': expr_string,\\n}\\n\")},\r\n{str8_lit_comp(\"geo3d\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n  @display_name(\\\"Expression\\\") @description(\\\"An expression to describe the base address of the index buffer.\\\")\\n  'expression': expr_string,\\n  'count': expr_string,\\n  'vtx': expr_string,\\n  'vtx_size': expr_string,\\n  'yaw': @range[0, 1] f32,\\n  'pitch': @range[-0.5, 0] f32,\\n  'zoom': @range[0, 100] f32,\\n}\\n\")},\r\n{str8_lit_comp(\"getting_started\"), str8_lit_comp(\"@inherit(tab) x:\\n{\\n}\\n\")},\r\n{str8_lit_comp(\"target\"), str8_lit_comp(\"@row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\\n@collection_commands(add_target)\\nx:\\n{\\n  'label':              code_string,\\n  'executable':         path,\\n  'arguments':          string,\\n  'working_directory':  path,\\n  'entry_point':        expr_string,\\n  'stdout_path':        @no_relativize path,\\n  'stderr_path':        @no_relativize path,\\n  'stdin_path':         @no_relativize path,\\n  'environment':        query,\\n  'debug_subprocesses': bool,\\n  @no_revert @no_expand @default(0) 'enabled': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"breakpoint\"), str8_lit_comp(\"@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\\n@collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\\nx:\\n{\\n  'label':            code_string,\\n  'condition':        expr_string,\\n  'source_location':  path_pt,\\n  'address_location': expr_string,\\n  'hit_count':        u64,\\n  'address_range_size': @or(0, 1, 2, 4, 8) u64,\\n  'break_on_write':   bool,\\n  'break_on_read':    bool,\\n  'break_on_execute': bool,\\n  @no_revert @no_expand @default(1) 'enabled': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"watch_pin\"), str8_lit_comp(\"@row_commands(duplicate_cfg, remove_cfg)\\n@collection_commands(add_watch_pin, toggle_watch_pin)\\nx:\\n{\\n  'expression':       expr_string,\\n  'source_location':  path_pt,\\n  'address_location': expr_string,\\n}\\n\")},\r\n{str8_lit_comp(\"debug_info\"), str8_lit_comp(\"@row_commands(enable_cfg, duplicate_cfg, remove_cfg)\\n@collection_commands(load_debug_info)\\nx:\\n{\\n  'path': @no_relativize path,\\n  @query 'guid': string,\\n  @no_revert @no_expand @default(1) 'enabled': bool,\\n}\\n\")},\r\n{str8_lit_comp(\"file_path_map\"), str8_lit_comp(\"@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}\")},\r\n{str8_lit_comp(\"type_view\"), str8_lit_comp(\"@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}\")},\r\n{str8_lit_comp(\"recent_project\"), str8_lit_comp(\"x:{'path':path}\")},\r\n{str8_lit_comp(\"recent_file\"), str8_lit_comp(\"x:{'path':path}\")},\r\n{str8_lit_comp(\"machine\"), str8_lit_comp(\"x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':query, 'processes':query}\")},\r\n{str8_lit_comp(\"process\"), str8_lit_comp(\"x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':query, 'threads':query}\")},\r\n{str8_lit_comp(\"module\"), str8_lit_comp(\"x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}\")},\r\n{str8_lit_comp(\"thread\"), str8_lit_comp(\"x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}\")},\r\n};\r\n\r\nString8 rd_reg_slot_code_name_table[48] =\r\n{\r\n{0},\r\nstr8_lit_comp(\"machine\"),\r\nstr8_lit_comp(\"module\"),\r\nstr8_lit_comp(\"process\"),\r\nstr8_lit_comp(\"thread\"),\r\nstr8_lit_comp(\"ctrl_entity\"),\r\nstr8_lit_comp(\"window\"),\r\nstr8_lit_comp(\"panel\"),\r\nstr8_lit_comp(\"tab\"),\r\nstr8_lit_comp(\"view\"),\r\nstr8_lit_comp(\"prev_tab\"),\r\nstr8_lit_comp(\"dst_panel\"),\r\nstr8_lit_comp(\"cfg\"),\r\nstr8_lit_comp(\"cfg_list\"),\r\nstr8_lit_comp(\"eval_space\"),\r\nstr8_lit_comp(\"unwind_count\"),\r\nstr8_lit_comp(\"inline_depth\"),\r\nstr8_lit_comp(\"file_path\"),\r\nstr8_lit_comp(\"cursor\"),\r\nstr8_lit_comp(\"mark\"),\r\nstr8_lit_comp(\"text_key\"),\r\nstr8_lit_comp(\"lang_kind\"),\r\nstr8_lit_comp(\"lines\"),\r\nstr8_lit_comp(\"dbgi_key\"),\r\nstr8_lit_comp(\"vaddr\"),\r\nstr8_lit_comp(\"voff\"),\r\nstr8_lit_comp(\"vaddr_range\"),\r\nstr8_lit_comp(\"voff_range\"),\r\nstr8_lit_comp(\"expr\"),\r\nstr8_lit_comp(\"ui_key\"),\r\nstr8_lit_comp(\"src_ui_key\"),\r\nstr8_lit_comp(\"off_px\"),\r\nstr8_lit_comp(\"reg_slot\"),\r\nstr8_lit_comp(\"pid\"),\r\nstr8_lit_comp(\"force_confirm\"),\r\nstr8_lit_comp(\"force_focus\"),\r\nstr8_lit_comp(\"prefer_disasm\"),\r\nstr8_lit_comp(\"no_rich_tooltip\"),\r\nstr8_lit_comp(\"do_implicit_root\"),\r\nstr8_lit_comp(\"do_lister\"),\r\nstr8_lit_comp(\"do_big_rows\"),\r\nstr8_lit_comp(\"all_windows\"),\r\nstr8_lit_comp(\"non_graphical\"),\r\nstr8_lit_comp(\"prefer_new_tab\"),\r\nstr8_lit_comp(\"dir2\"),\r\nstr8_lit_comp(\"string\"),\r\nstr8_lit_comp(\"cmd_name\"),\r\nstr8_lit_comp(\"os_event\"),\r\n};\r\n\r\nRng1U64 rd_reg_slot_range_table[48] =\r\n{\r\n{0},\r\n{OffsetOf(RD_Regs, machine), OffsetOf(RD_Regs, machine) + sizeof(CTRL_Handle)},\r\n{OffsetOf(RD_Regs, module), OffsetOf(RD_Regs, module) + sizeof(CTRL_Handle)},\r\n{OffsetOf(RD_Regs, process), OffsetOf(RD_Regs, process) + sizeof(CTRL_Handle)},\r\n{OffsetOf(RD_Regs, thread), OffsetOf(RD_Regs, thread) + sizeof(CTRL_Handle)},\r\n{OffsetOf(RD_Regs, ctrl_entity), OffsetOf(RD_Regs, ctrl_entity) + sizeof(CTRL_Handle)},\r\n{OffsetOf(RD_Regs, window), OffsetOf(RD_Regs, window) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, panel), OffsetOf(RD_Regs, panel) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, tab), OffsetOf(RD_Regs, tab) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, view), OffsetOf(RD_Regs, view) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, prev_tab), OffsetOf(RD_Regs, prev_tab) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, dst_panel), OffsetOf(RD_Regs, dst_panel) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, cfg), OffsetOf(RD_Regs, cfg) + sizeof(CFG_ID)},\r\n{OffsetOf(RD_Regs, cfg_list), OffsetOf(RD_Regs, cfg_list) + sizeof(CFG_IDList)},\r\n{OffsetOf(RD_Regs, eval_space), OffsetOf(RD_Regs, eval_space) + sizeof(E_Space)},\r\n{OffsetOf(RD_Regs, unwind_count), OffsetOf(RD_Regs, unwind_count) + sizeof(U64)},\r\n{OffsetOf(RD_Regs, inline_depth), OffsetOf(RD_Regs, inline_depth) + sizeof(U64)},\r\n{OffsetOf(RD_Regs, file_path), OffsetOf(RD_Regs, file_path) + sizeof(String8)},\r\n{OffsetOf(RD_Regs, cursor), OffsetOf(RD_Regs, cursor) + sizeof(TxtPt)},\r\n{OffsetOf(RD_Regs, mark), OffsetOf(RD_Regs, mark) + sizeof(TxtPt)},\r\n{OffsetOf(RD_Regs, text_key), OffsetOf(RD_Regs, text_key) + sizeof(C_Key)},\r\n{OffsetOf(RD_Regs, lang_kind), OffsetOf(RD_Regs, lang_kind) + sizeof(TXT_LangKind)},\r\n{OffsetOf(RD_Regs, lines), OffsetOf(RD_Regs, lines) + sizeof(D_LineList)},\r\n{OffsetOf(RD_Regs, dbgi_key), OffsetOf(RD_Regs, dbgi_key) + sizeof(DI_Key)},\r\n{OffsetOf(RD_Regs, vaddr), OffsetOf(RD_Regs, vaddr) + sizeof(U64)},\r\n{OffsetOf(RD_Regs, voff), OffsetOf(RD_Regs, voff) + sizeof(U64)},\r\n{OffsetOf(RD_Regs, vaddr_range), OffsetOf(RD_Regs, vaddr_range) + sizeof(Rng1U64)},\r\n{OffsetOf(RD_Regs, voff_range), OffsetOf(RD_Regs, voff_range) + sizeof(Rng1U64)},\r\n{OffsetOf(RD_Regs, expr), OffsetOf(RD_Regs, expr) + sizeof(String8)},\r\n{OffsetOf(RD_Regs, ui_key), OffsetOf(RD_Regs, ui_key) + sizeof(UI_Key)},\r\n{OffsetOf(RD_Regs, src_ui_key), OffsetOf(RD_Regs, src_ui_key) + sizeof(UI_Key)},\r\n{OffsetOf(RD_Regs, off_px), OffsetOf(RD_Regs, off_px) + sizeof(Vec2F32)},\r\n{OffsetOf(RD_Regs, reg_slot), OffsetOf(RD_Regs, reg_slot) + sizeof(RD_RegSlot)},\r\n{OffsetOf(RD_Regs, pid), OffsetOf(RD_Regs, pid) + sizeof(U32)},\r\n{OffsetOf(RD_Regs, force_confirm), OffsetOf(RD_Regs, force_confirm) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, force_focus), OffsetOf(RD_Regs, force_focus) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, prefer_disasm), OffsetOf(RD_Regs, prefer_disasm) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, no_rich_tooltip), OffsetOf(RD_Regs, no_rich_tooltip) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, do_implicit_root), OffsetOf(RD_Regs, do_implicit_root) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, do_lister), OffsetOf(RD_Regs, do_lister) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, do_big_rows), OffsetOf(RD_Regs, do_big_rows) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, all_windows), OffsetOf(RD_Regs, all_windows) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, non_graphical), OffsetOf(RD_Regs, non_graphical) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, prefer_new_tab), OffsetOf(RD_Regs, prefer_new_tab) + sizeof(B32)},\r\n{OffsetOf(RD_Regs, dir2), OffsetOf(RD_Regs, dir2) + sizeof(Dir2)},\r\n{OffsetOf(RD_Regs, string), OffsetOf(RD_Regs, string) + sizeof(String8)},\r\n{OffsetOf(RD_Regs, cmd_name), OffsetOf(RD_Regs, cmd_name) + sizeof(String8)},\r\n{OffsetOf(RD_Regs, os_event), OffsetOf(RD_Regs, os_event) + sizeof(OS_Event *)},\r\n};\r\n\r\nRD_CmdKindInfo rd_cmd_kind_info_table[248] =\r\n{\r\n{0},\r\n{ str8_lit_comp(\"launch_and_run\"), str8_lit_comp(\"Starts debugging a new instance of a target, then runs.\"), str8_lit_comp(\"launch,start,run,target\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:targets\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"launch_and_step_into\"), str8_lit_comp(\"Starts debugging a new instance of a target, then stops at the program's entry point.\"), str8_lit_comp(\"launch,start,entry,point\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:targets\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"kill\"), str8_lit_comp(\"Kills the specified existing attached process(es).\"), str8_lit_comp(\"stop,kill\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(\"query:processes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Process}},\r\n{ str8_lit_comp(\"kill_all\"), str8_lit_comp(\"Kills all attached processes.\"), str8_lit_comp(\"stop,kill,all\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"detach\"), str8_lit_comp(\"Detaches the specified attached process(es).\"), str8_lit_comp(\"detach\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(\"query:processes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Process}},\r\n{ str8_lit_comp(\"continue\"), str8_lit_comp(\"Continues executing all attached processes.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_into_inst\"), str8_lit_comp(\"Performs a step that goes into calls, at the instruction level.\"), str8_lit_comp(\"single,step,thread\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_over_inst\"), str8_lit_comp(\"Performs a step that skips calls, at the instruction level.\"), str8_lit_comp(\"single,step,thread\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_into_line\"), str8_lit_comp(\"Performs a step that goes into calls, at the source code line level.\"), str8_lit_comp(\"step,thread\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_over_line\"), str8_lit_comp(\"Performs a step that skips calls, at the source code line level.\"), str8_lit_comp(\"step,thread\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_out\"), str8_lit_comp(\"Runs to the end of the current function and exits it.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"halt\"), str8_lit_comp(\"Halts all attached processes.\"), str8_lit_comp(\"pause\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"soft_halt_refresh\"), str8_lit_comp(\"Interrupts all attached processes to collect data, and then resumes them.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"set_thread_ip\"), str8_lit_comp(\"Sets the specified thread's instruction pointer at the specified address.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"run_to_line\"), str8_lit_comp(\"Runs until a particular source line is hit.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$text_pt,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"run\"), str8_lit_comp(\"Runs all targets after starting them if they have not been started yet.\"), str8_lit_comp(\"play\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"restart\"), str8_lit_comp(\"Kills all attached processes, then launches all active targets.\"), str8_lit_comp(\"restart,retry\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_into\"), str8_lit_comp(\"Steps once, possibly into function calls, for either source lines or instructions (whichever is selected).\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"step_over\"), str8_lit_comp(\"Steps once, always over function calls, for either source lines or instructions.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"freeze_thread\"), str8_lit_comp(\"Freezes the passed thread.\"), str8_lit_comp(\"callstack,unwind\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(\"query:threads\"), str8_lit_comp(\"\"), CTRL_EntityKind_Thread}},\r\n{ str8_lit_comp(\"thaw_thread\"), str8_lit_comp(\"Thaws the passed thread.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(\"query:threads\"), str8_lit_comp(\"\"), CTRL_EntityKind_Thread}},\r\n{ str8_lit_comp(\"freeze_process\"), str8_lit_comp(\"Freezes the passed process.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(\"query:processes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Process}},\r\n{ str8_lit_comp(\"thaw_process\"), str8_lit_comp(\"Thaws the passed process.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Process, str8_lit_comp(\"query:processes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Process}},\r\n{ str8_lit_comp(\"freeze_machine\"), str8_lit_comp(\"Freezes the passed machine.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp(\"query:machines\"), str8_lit_comp(\"\"), CTRL_EntityKind_Machine}},\r\n{ str8_lit_comp(\"thaw_machine\"), str8_lit_comp(\"Thaws the passed machine.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Machine, str8_lit_comp(\"query:machines\"), str8_lit_comp(\"\"), CTRL_EntityKind_Machine}},\r\n{ str8_lit_comp(\"freeze_local_machine\"), str8_lit_comp(\"Freezes the local machine.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"thaw_local_machine\"), str8_lit_comp(\"Thaws the local machine.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"freeze_entity\"), str8_lit_comp(\"Freezes an entity.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"thaw_entity\"), str8_lit_comp(\"Thaws an entity.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"set_entity_color\"), str8_lit_comp(\"Sets the passed entity's color.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"set_entity_name\"), str8_lit_comp(\"Sets the passed entity's name.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"attach\"), str8_lit_comp(\"Attaches to a process that is already running on the local machine.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_PID, str8_lit_comp(\"query:unattached_processes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"exit\"), str8_lit_comp(\"Exits the debugger.\"), str8_lit_comp(\"quit,close,abort\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_palette\"), str8_lit_comp(\"Opens the palette.\"), str8_lit_comp(\"help,cmd,lister\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"run_command\"), str8_lit_comp(\"Runs a command from the command palette.\"), str8_lit_comp(\"help,cmd\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp(\"query:commands\"), str8_lit_comp(\"commands\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"run_ext_driver_text_command\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"os_event\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"select_thread\"), str8_lit_comp(\"Selects a thread.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(\"query:threads\"), str8_lit_comp(\"\"), CTRL_EntityKind_Thread}},\r\n{ str8_lit_comp(\"select_unwind\"), str8_lit_comp(\"Selects an unwind frame number for the selected thread.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"query:call_stack\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"up_one_frame\"), str8_lit_comp(\"Selects the call stack frame above the currently selected.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"down_one_frame\"), str8_lit_comp(\"Selects the call stack frame below the currently selected.\"), str8_lit_comp(\"callstack,unwind\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"select_entity\"), str8_lit_comp(\"Selects a control entity.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"deselect_entity\"), str8_lit_comp(\"Deselects a control entity.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"inc_window_font_size\"), str8_lit_comp(\"Increases the window's font size by one point.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"dec_window_font_size\"), str8_lit_comp(\"Decreases the window's font size by one point.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"inc_view_font_size\"), str8_lit_comp(\"Increases the view's font size by one point.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"dec_view_font_size\"), str8_lit_comp(\"Decreases the view's font size by one point.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_window\"), str8_lit_comp(\"Opens a new window.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"window_settings\"), str8_lit_comp(\"Opens settings for a window.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"close_window\"), str8_lit_comp(\"Closes an opened window.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_fullscreen\"), str8_lit_comp(\"Toggles fullscreen view on the active window.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"bring_to_front\"), str8_lit_comp(\"Brings all windows to the front, and focuses the most recently focused window.\"), str8_lit_comp(\"top\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"popup_accept\"), str8_lit_comp(\"Accepts the active popup prompt.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"popup_cancel\"), str8_lit_comp(\"Cancels the active popup prompt.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"reset_to_default_bindings\"), str8_lit_comp(\"Resets all keybindings to their defaults.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"reset_to_default_panels\"), str8_lit_comp(\"Resets the window to the default panel layout.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"reset_to_compact_panels\"), str8_lit_comp(\"Resets the window to the compact panel layout.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"reset_to_simple_panels\"), str8_lit_comp(\"Resets the window to the simple panel layout.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"new_panel_left\"), str8_lit_comp(\"Creates a new panel to the left of the active panel.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"new_panel_up\"), str8_lit_comp(\"Creates a new panel at the top of the active panel.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"new_panel_right\"), str8_lit_comp(\"Creates a new panel to the right of the active panel.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"new_panel_down\"), str8_lit_comp(\"Creates a new panel at the bottom of the active panel.\"), str8_lit_comp(\"panel\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"split_panel\"), str8_lit_comp(\"Creates a new panel in a given direction, and moves a tab to it, if specified.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"rotate_panel_columns\"), str8_lit_comp(\"Rotates all panels at the closest column level of the panel hierarchy.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"next_panel\"), str8_lit_comp(\"Cycles the active panel forward.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"prev_panel\"), str8_lit_comp(\"Cycles the active panel backwards.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"focus_panel\"), str8_lit_comp(\"Focuses a new panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"focus_panel_right\"), str8_lit_comp(\"Focuses a panel rightward of the currently focused panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"focus_panel_left\"), str8_lit_comp(\"Focuses a panel leftward of the currently focused panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"focus_panel_up\"), str8_lit_comp(\"Focuses a panel upward of the currently focused panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"focus_panel_down\"), str8_lit_comp(\"Focuses a panel downward of the currently focused panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"undo\"), str8_lit_comp(\"Undoes the previous action.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"redo\"), str8_lit_comp(\"Redoes the first previously undone action.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"go_back\"), str8_lit_comp(\"Returns to the previously selected panel and tab in recorded history.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"go_forward\"), str8_lit_comp(\"Returns to the next selected panel and tab in recorded history.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"close_panel\"), str8_lit_comp(\"Closes the currently active panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"focus_tab\"), str8_lit_comp(\"Focuses the passed tab within its containing panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"next_tab\"), str8_lit_comp(\"Focuses the next tab on the active panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"prev_tab\"), str8_lit_comp(\"Focuses the previous tab on the active panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_tab_right\"), str8_lit_comp(\"Moves the selected tab right one slot.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_tab_left\"), str8_lit_comp(\"Moves the selected tab left one slot.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_tab\"), str8_lit_comp(\"Opens a new tab.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_CmdName, str8_lit_comp(\"query:tab_commands\"), str8_lit_comp(\"commands\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"build_tab\"), str8_lit_comp(\"Opens a new tab with the parameterized view specification.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"duplicate_tab\"), str8_lit_comp(\"Duplicates a tab.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"copy_tab_full_path\"), str8_lit_comp(\"Copies the full path of the file being viewed by this tab.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"close_tab\"), str8_lit_comp(\"Closes the currently opened tab.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Tab, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_view\"), str8_lit_comp(\"Moves a view to a new panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"tab_bar_top\"), str8_lit_comp(\"Anchors a panel's tab bar to the top of the panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"tab_bar_bottom\"), str8_lit_comp(\"Anchors a panel's tab bar to the bottom of the panel.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$tab,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"tab_settings\"), str8_lit_comp(\"Opens settings for a tab.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"set_current_path\"), str8_lit_comp(\"Sets the debugger's current path, which is used as a starting point when browsing for files.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open\"), str8_lit_comp(\"Opens a file.\"), str8_lit_comp(\"code,source,file\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"switch\"), str8_lit_comp(\"Switches to a recent file.\"), str8_lit_comp(\"code,source,file\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:recent_files, query:source_files\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"switch_to_partner_file\"), str8_lit_comp(\"Switches to the focused file's partner; or from header to implementation or vice versa.\"), str8_lit_comp(\"code,source,file\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"record_file_in_project\"), str8_lit_comp(\"Records the passed file path as a recent file in the currently loaded project.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"show_file_in_explorer\"), str8_lit_comp(\"Opens the operating system's file explorer and shows the selected file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$file,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"go_to_disassembly\"), str8_lit_comp(\"Goes to the disassembly, if any, for a given source code line.\"), str8_lit_comp(\"code,source,disassembly,disasm\"), str8_lit_comp(\"$text_pt,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"go_to_source\"), str8_lit_comp(\"Goes to the source code, if any, for a given disassembly line.\"), str8_lit_comp(\"code,source,disassembly,disasm\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"set_file_replacement_path\"), str8_lit_comp(\"Sets the path which should be used as the replacement for the passed file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"new_user\"), str8_lit_comp(\"Creates a new user file, and sets the current user path as that file's path.\"), str8_lit_comp(\"new,user,project,layout\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"new_project\"), str8_lit_comp(\"Creates a new project file, and sets the current project path as that file's path.\"), str8_lit_comp(\"new,user,project,layout\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_user\"), str8_lit_comp(\"Opens a user file path, immediately loading it, and begins autosaving to it.\"), str8_lit_comp(\"load,user,project,layout\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_project\"), str8_lit_comp(\"Opens a project file path, immediately loading it, and begins autosaving to it.\"), str8_lit_comp(\"project,project,session\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_recent_project\"), str8_lit_comp(\"Opens a recently used project file.\"), str8_lit_comp(\"project,project,session\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:recent_projects\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"save_user\"), str8_lit_comp(\"Saves user data to a file, and sets the current user path as that path.\"), str8_lit_comp(\"load,user,project,layout\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"save_project\"), str8_lit_comp(\"Saves project data to a file, and sets the current project path as that path.\"), str8_lit_comp(\"project,project,session\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"record_user_as_last_opened\"), str8_lit_comp(\"Records a file path as the last opened user.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"record_project_in_user\"), str8_lit_comp(\"Records a file path as a recent project in user data.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"write_user_data\"), str8_lit_comp(\"Writes user data to the active user file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"write_project_data\"), str8_lit_comp(\"Writes project data to the active project file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"user_settings\"), str8_lit_comp(\"Opens user settings.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"project_settings\"), str8_lit_comp(\"Opens project settings.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"edit\"), str8_lit_comp(\"Edits the current selection.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"accept\"), str8_lit_comp(\"Accepts current changes, or answers prompts in the affirmative.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"cancel\"), str8_lit_comp(\"Rejects current changes, exits temporary menus, or answers prompts in the negative.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_left\"), str8_lit_comp(\"Moves the cursor or selection left.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_right\"), str8_lit_comp(\"Moves the cursor or selection right.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up\"), str8_lit_comp(\"Moves the cursor or selection up.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down\"), str8_lit_comp(\"Moves the cursor or selection down.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_left_select\"), str8_lit_comp(\"Moves the cursor or selection left, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_right_select\"), str8_lit_comp(\"Moves the cursor or selection right, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_select\"), str8_lit_comp(\"Moves the cursor or selection up, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_select\"), str8_lit_comp(\"Moves the cursor or selection down, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_left_chunk\"), str8_lit_comp(\"Moves the cursor or selection left one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_right_chunk\"), str8_lit_comp(\"Moves the cursor or selection right one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_chunk\"), str8_lit_comp(\"Moves the cursor or selection up one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_chunk\"), str8_lit_comp(\"Moves the cursor or selection down one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_page\"), str8_lit_comp(\"Moves the cursor or selection up one page.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_page\"), str8_lit_comp(\"Moves the cursor or selection down one page.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_whole\"), str8_lit_comp(\"Moves the cursor or selection to the beginning of the relevant content.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_whole\"), str8_lit_comp(\"Moves the cursor or selection to the end of the relevant content.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_left_chunk_select\"), str8_lit_comp(\"Moves the cursor or selection left one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_right_chunk_select\"), str8_lit_comp(\"Moves the cursor or selection right one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_chunk_select\"), str8_lit_comp(\"Moves the cursor or selection up one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_chunk_select\"), str8_lit_comp(\"Moves the cursor or selection down one chunk.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_page_select\"), str8_lit_comp(\"Moves the cursor or selection up one page, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_page_select\"), str8_lit_comp(\"Moves the cursor or selection down one page, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_whole_select\"), str8_lit_comp(\"Moves the cursor or selection to the beginning of the relevant content, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_whole_select\"), str8_lit_comp(\"Moves the cursor or selection to the end of the relevant content, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_up_reorder\"), str8_lit_comp(\"Moves the cursor or selection up, while swapping the currently selected element with that upward.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_down_reorder\"), str8_lit_comp(\"Moves the cursor or selection down, while swapping the currently selected element with that downward.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_home\"), str8_lit_comp(\"Moves the cursor to the beginning of the line.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_end\"), str8_lit_comp(\"Moves the cursor to the end of the line.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_home_select\"), str8_lit_comp(\"Moves the cursor to the beginning of the line, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_end_select\"), str8_lit_comp(\"Moves the cursor to the end of the line, while selecting.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"select_all\"), str8_lit_comp(\"Selects everything possible.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"delete_single\"), str8_lit_comp(\"Deletes a single element to the right of the cursor, or the active selection.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"delete_chunk\"), str8_lit_comp(\"Deletes a chunk to the right of the cursor, or the active selection.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"backspace_single\"), str8_lit_comp(\"Deletes a single element to the left of the cursor, or the active selection.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"backspace_chunk\"), str8_lit_comp(\"Deletes a chunk to the left of the cursor, or the active selection.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"copy\"), str8_lit_comp(\"Copies the active selection to the clipboard.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$text_rng,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*1), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"cut\"), str8_lit_comp(\"Copies the active selection to the clipboard, then deletes it.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"paste\"), str8_lit_comp(\"Pastes the current contents of the clipboard.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"insert_text\"), str8_lit_comp(\"Inserts the text that was used to cause this command.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_next\"), str8_lit_comp(\"Moves the cursor or selection to the next element.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"move_prev\"), str8_lit_comp(\"Moves the cursor or selection to the previous element.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"goto_line\"), str8_lit_comp(\"Jumps to a line number in the current code file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Cursor, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"goto_address\"), str8_lit_comp(\"Jumps to an address in the current memory or disassembly view.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_Vaddr, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"center_cursor\"), str8_lit_comp(\"Snaps the current code view to center the cursor.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"contain_cursor\"), str8_lit_comp(\"Snaps the current code view to contain the cursor.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"find_next\"), str8_lit_comp(\"Searches the current code file forward (from the cursor) for the last searched string.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"find_prev\"), str8_lit_comp(\"Searches the current code file backwards (from the cursor) for the last searched string.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"find_thread\"), str8_lit_comp(\"Jumps to the passed thread in either source code, disassembly, or both if they're already open.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Thread, str8_lit_comp(\"query:threads\"), str8_lit_comp(\"\"), CTRL_EntityKind_Thread}},\r\n{ str8_lit_comp(\"find_selected_thread\"), str8_lit_comp(\"Jumps to the selected thread in either source code, disassembly, or both if they're already open.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"goto_name\"), str8_lit_comp(\"Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$text_pt,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(\"query:procedures\"), str8_lit_comp(\"symbol_lister\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"goto_name_at_cursor\"), str8_lit_comp(\"Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_watch_expr\"), str8_lit_comp(\"Adds or removes an expression to an opened watch view.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$text_pt,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_watch_expr_at_cursor\"), str8_lit_comp(\"Adds or removes the expression that the cursor or selection is currently over to an opened watch view.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_watch_expr_at_mouse\"), str8_lit_comp(\"Adds or removes the expression that the mouse is currently over to an opened watch view.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"enable_cfg\"), str8_lit_comp(\"Enables a config tree.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"disable_cfg\"), str8_lit_comp(\"Disables a config tree.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"select_cfg\"), str8_lit_comp(\"Selects a config tree, disabling all others of the same kind.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"deselect_cfg\"), str8_lit_comp(\"Deselects a config tree.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"remove_cfg\"), str8_lit_comp(\"Removes a config tree.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"name_cfg\"), str8_lit_comp(\"Equips a config tree with a label.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"condition_cfg\"), str8_lit_comp(\"Equips a config tree with a condition string.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"duplicate_cfg\"), str8_lit_comp(\"Duplicates a config tree.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"relocate_cfg\"), str8_lit_comp(\"Relocates a config tree.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"save_cfg_to_project\"), str8_lit_comp(\"Saves the config tree to the project.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_breakpoint\"), str8_lit_comp(\"Places a breakpoint at a given location (file path and line number, address, or symbol name).\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_address_breakpoint\"), str8_lit_comp(\"Places a breakpoint on the specified address.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$breakpoints,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_function_breakpoint\"), str8_lit_comp(\"Places a breakpoint on the first address of the specified function.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$breakpoints,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(\"query:procedures\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_breakpoint\"), str8_lit_comp(\"Places or removes a breakpoint at a given location (file path and line number, address, or symbol name).\"), str8_lit_comp(\"\"), str8_lit_comp(\"$text_pt,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"remove_breakpoint\"), str8_lit_comp(\"Removes an existing breakpoint.\"), str8_lit_comp(\"delete\"), str8_lit_comp(\"$breakpoints,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:breakpoints\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"enable_breakpoint\"), str8_lit_comp(\"Enables a breakpoint.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:breakpoints\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"disable_breakpoint\"), str8_lit_comp(\"Disables a breakpoint.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:breakpoints\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"clear_breakpoints\"), str8_lit_comp(\"Removes all breakpoints.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"list_breakpoints\"), str8_lit_comp(\"Lists all breakpoints.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"clear_output\"), str8_lit_comp(\"Clears all output.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_watch_pin\"), str8_lit_comp(\"Places a watch pin at a given location (file path and line number or address).\"), str8_lit_comp(\"\"), str8_lit_comp(\"$watch_pins,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_watch_pin\"), str8_lit_comp(\"Places or removes a watch pin at a given location (file path and line number or address).\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Expr, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"load_debug_info\"), str8_lit_comp(\"Loads a debug info file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$debug_infos,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"unload_debug_info\"), str8_lit_comp(\"Unloads a debug info file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$debug_infos,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:debug_infos\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_type_view\"), str8_lit_comp(\"Adds a new type view.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_file_path_map\"), str8_lit_comp(\"Adds a new file path map.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"edit_user_theme\"), str8_lit_comp(\"Edits the current user's theme.\"), str8_lit_comp(\"color\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(\"query:themes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"edit_project_theme\"), str8_lit_comp(\"Edits the current project's theme.\"), str8_lit_comp(\"color\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_String, str8_lit_comp(\"query:themes\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_theme_color\"), str8_lit_comp(\"Adds a new theme color.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"fork_theme\"), str8_lit_comp(\"Imports all colors from the current theme so they can be individually edited.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"save_theme\"), str8_lit_comp(\"Saves all theme colors to a new theme file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"save_and_set_theme\"), str8_lit_comp(\"Saves all theme colors to a new theme file, and then sets that theme as the selected theme.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"set_next_statement\"), str8_lit_comp(\"Sets the selected thread's instruction pointer to the cursor's position.\"), str8_lit_comp(\"\"), str8_lit_comp(\"$text_pt,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*1)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"add_target\"), str8_lit_comp(\"Adds a new target.\"), str8_lit_comp(\"application,executable,debug\"), str8_lit_comp(\"$targets,\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"select_target\"), str8_lit_comp(\"Selects a target.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:targets\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"enable_target\"), str8_lit_comp(\"Enables a target, in addition to all targets currently enabled.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:targets\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"disable_target\"), str8_lit_comp(\"Disables a target.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:targets\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"remove_target\"), str8_lit_comp(\"Removes a target.\"), str8_lit_comp(\"delete\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_Cfg, str8_lit_comp(\"query:targets\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"register_as_jit_debugger\"), str8_lit_comp(\"Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"find_code_location\"), str8_lit_comp(\"Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"search\"), str8_lit_comp(\"Begins searching within the active interface.\"), str8_lit_comp(\"sort,search,filter,find\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"search_backwards\"), str8_lit_comp(\"Begins searching backwards within the active interface.\"), str8_lit_comp(\"sort,search,filter,find\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*1)|(RD_QueryFlag_KeepOldInput*1)|(RD_QueryFlag_SelectOldInput*1)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*1), RD_RegSlot_String, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"pick_file\"), str8_lit_comp(\"Opens the file browser to pick a file.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"pick_folder\"), str8_lit_comp(\"Opens the file browser to pick a folder.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"pick_file_or_folder\"), str8_lit_comp(\"Opens the file browser to pick a file or folder.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*1)|(RD_QueryFlag_AllowFolders*1)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*1)|(RD_QueryFlag_Required*1), RD_RegSlot_FilePath, str8_lit_comp(\"folder:\\\"$input\\\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"push_query\"), str8_lit_comp(\"Opens a new temporary query interface.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"complete_query\"), str8_lit_comp(\"Completes and closes a query.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"cancel_query\"), str8_lit_comp(\"Closes a query.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"update_query\"), str8_lit_comp(\"Updates a query input.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*0)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"open_event_buffer\"), str8_lit_comp(\"Opens a new event buffer, to which debugger events will be written, for external processing.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"close_event_buffer\"), str8_lit_comp(\"Closes an existing event buffer.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*0)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Cfg, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"toggle_dev_menu\"), str8_lit_comp(\"Opens and closes the developer menu.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"log_marker\"), str8_lit_comp(\"Logs a marker in the application log, to denote specific points in time within the log.\"), str8_lit_comp(\"\"), str8_lit_comp(\"\"), (RD_CmdKindFlag_ListInUI*1)|(RD_CmdKindFlag_ListInIPCDocs*1)|(RD_CmdKindFlag_ListInTextPt*0)|(RD_CmdKindFlag_ListInTextRng*0), {(RD_QueryFlag_AllowFiles*0)|(RD_QueryFlag_AllowFolders*0)|(RD_QueryFlag_CodeInput*0)|(RD_QueryFlag_KeepOldInput*0)|(RD_QueryFlag_SelectOldInput*0)|(RD_QueryFlag_Floating*0)|(RD_QueryFlag_Required*0), RD_RegSlot_Null, str8_lit_comp(\"\"), str8_lit_comp(\"\"), CTRL_EntityKind_Null}},\r\n{ str8_lit_comp(\"watches\"), str8_lit_comp(\"Opens a Watch tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"locals\"), str8_lit_comp(\"Opens a Locals tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"registers\"), str8_lit_comp(\"Opens a Registers tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"globals\"), str8_lit_comp(\"Opens a Globals tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"thread_locals\"), str8_lit_comp(\"Opens a Thread Locals tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"types\"), str8_lit_comp(\"Opens a Types tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"procedures\"), str8_lit_comp(\"Opens a Procedures tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"call_stack\"), str8_lit_comp(\"Opens a Call Stack tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"targets\"), str8_lit_comp(\"Opens a Targets tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"breakpoints\"), str8_lit_comp(\"Opens a Breakpoints tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"watch_pins\"), str8_lit_comp(\"Opens a Watch Pins tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"debug_infos\"), str8_lit_comp(\"Opens a Debug Info tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"threads\"), str8_lit_comp(\"Opens a Threads tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"processes\"), str8_lit_comp(\"Opens a Processes tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"machines\"), str8_lit_comp(\"Opens a Machines tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"modules\"), str8_lit_comp(\"Opens a Modules tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"file_path_maps\"), str8_lit_comp(\"Opens a File Path Map tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"type_views\"), str8_lit_comp(\"Opens a Type Views tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"output\"), str8_lit_comp(\"Opens a Output tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"text\"), str8_lit_comp(\"Opens a Text tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"disasm\"), str8_lit_comp(\"Opens a Disassembly tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"memory\"), str8_lit_comp(\"Opens a Memory tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"bitmap\"), str8_lit_comp(\"Opens a Bitmap tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"color\"), str8_lit_comp(\"Opens a Color tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n{ str8_lit_comp(\"geo3d\"), str8_lit_comp(\"Opens a Geometry (3D) tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab},\r\n};\r\n\r\nstruct {String8 string; CFG_Binding binding;} rd_default_binding_table[116] =\r\n{\r\n{str8_lit_comp(\"kill_all\"), {OS_Key_F5, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"step_into_inst\"), {OS_Key_F11, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"step_over_inst\"), {OS_Key_F10, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"step_out\"), {OS_Key_F11, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"halt\"), {OS_Key_X, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"halt\"), {OS_Key_Pause, 0   }},\r\n{str8_lit_comp(\"run\"), {OS_Key_F5, 0   }},\r\n{str8_lit_comp(\"restart\"), {OS_Key_F5, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"step_into\"), {OS_Key_F11, 0   }},\r\n{str8_lit_comp(\"step_over\"), {OS_Key_F10, 0   }},\r\n{str8_lit_comp(\"run_to_line\"), {OS_Key_F10, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"set_next_statement\"), {OS_Key_F10, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"inc_window_font_size\"), {OS_Key_Equal, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"dec_window_font_size\"), {OS_Key_Minus, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"window\"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"toggle_fullscreen\"), {OS_Key_Return, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"new_panel_right\"), {OS_Key_P, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"new_panel_down\"), {OS_Key_Minus, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"rotate_panel_columns\"), {OS_Key_2, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"next_panel\"), {OS_Key_Comma, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"prev_panel\"), {OS_Key_Comma, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"focus_panel_right\"), {OS_Key_Right, 0 |OS_Modifier_Ctrl  |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"focus_panel_left\"), {OS_Key_Left, 0 |OS_Modifier_Ctrl  |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"focus_panel_up\"), {OS_Key_Up, 0 |OS_Modifier_Ctrl  |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"focus_panel_down\"), {OS_Key_Down, 0 |OS_Modifier_Ctrl  |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"undo\"), {OS_Key_Z, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"redo\"), {OS_Key_Y, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"go_back\"), {OS_Key_Left, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"go_forward\"), {OS_Key_Right, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"close_panel\"), {OS_Key_P, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"next_tab\"), {OS_Key_PageDown, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"prev_tab\"), {OS_Key_PageUp, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"next_tab\"), {OS_Key_Tab, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"prev_tab\"), {OS_Key_Tab, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_tab_right\"), {OS_Key_PageDown, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_tab_left\"), {OS_Key_PageUp, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"close_tab\"), {OS_Key_W, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"tab_bar_top\"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"tab_bar_bottom\"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"open_tab\"), {OS_Key_T, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"open\"), {OS_Key_O, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"switch\"), {OS_Key_I, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"switch_to_partner_file\"), {OS_Key_O, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"open_user\"), {OS_Key_N, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"open_project\"), {OS_Key_N, 0 |OS_Modifier_Ctrl  |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"open_user\"), {OS_Key_O, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"open_project\"), {OS_Key_O, 0 |OS_Modifier_Ctrl  |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"save_user\"), {OS_Key_S, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"save_project\"), {OS_Key_S, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"edit\"), {OS_Key_F2, 0   }},\r\n{str8_lit_comp(\"accept\"), {OS_Key_Return, 0   }},\r\n{str8_lit_comp(\"accept\"), {OS_Key_Space, 0   }},\r\n{str8_lit_comp(\"cancel\"), {OS_Key_Esc, 0   }},\r\n{str8_lit_comp(\"move_left\"), {OS_Key_Left, 0   }},\r\n{str8_lit_comp(\"move_right\"), {OS_Key_Right, 0   }},\r\n{str8_lit_comp(\"move_up\"), {OS_Key_Up, 0   }},\r\n{str8_lit_comp(\"move_down\"), {OS_Key_Down, 0   }},\r\n{str8_lit_comp(\"move_left_select\"), {OS_Key_Left, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_right_select\"), {OS_Key_Right, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_up_select\"), {OS_Key_Up, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_down_select\"), {OS_Key_Down, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_left_chunk\"), {OS_Key_Left, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"move_right_chunk\"), {OS_Key_Right, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"move_up_chunk\"), {OS_Key_Up, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"move_down_chunk\"), {OS_Key_Down, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"move_up_page\"), {OS_Key_PageUp, 0   }},\r\n{str8_lit_comp(\"move_down_page\"), {OS_Key_PageDown, 0   }},\r\n{str8_lit_comp(\"move_up_whole\"), {OS_Key_Home, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"move_down_whole\"), {OS_Key_End, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"move_left_chunk_select\"), {OS_Key_Left, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_right_chunk_select\"), {OS_Key_Right, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_up_chunk_select\"), {OS_Key_Up, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_down_chunk_select\"), {OS_Key_Down, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_up_page_select\"), {OS_Key_PageUp, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_down_page_select\"), {OS_Key_PageDown, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_up_whole_select\"), {OS_Key_Home, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_down_whole_select\"), {OS_Key_End, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_up_reorder\"), {OS_Key_Up, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"move_down_reorder\"), {OS_Key_Down, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"move_home\"), {OS_Key_Home, 0   }},\r\n{str8_lit_comp(\"move_end\"), {OS_Key_End, 0   }},\r\n{str8_lit_comp(\"move_home_select\"), {OS_Key_Home, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"move_end_select\"), {OS_Key_End, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"select_all\"), {OS_Key_A, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"delete_single\"), {OS_Key_Delete, 0   }},\r\n{str8_lit_comp(\"delete_chunk\"), {OS_Key_Delete, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"backspace_single\"), {OS_Key_Backspace, 0   }},\r\n{str8_lit_comp(\"backspace_chunk\"), {OS_Key_Backspace, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"copy\"), {OS_Key_C, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"copy\"), {OS_Key_Insert, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"cut\"), {OS_Key_X, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"paste\"), {OS_Key_V, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"paste\"), {OS_Key_Insert, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"insert_text\"), {OS_Key_Null, 0   }},\r\n{str8_lit_comp(\"move_next\"), {OS_Key_Tab, 0   }},\r\n{str8_lit_comp(\"move_prev\"), {OS_Key_Tab, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"goto_line\"), {OS_Key_G, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"goto_address\"), {OS_Key_G, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"search\"), {OS_Key_F, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"search_backwards\"), {OS_Key_R, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"find_next\"), {OS_Key_F3, 0   }},\r\n{str8_lit_comp(\"find_prev\"), {OS_Key_F3, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"find_selected_thread\"), {OS_Key_F4, 0   }},\r\n{str8_lit_comp(\"goto_name\"), {OS_Key_J, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"goto_name_at_cursor\"), {OS_Key_F12, 0   }},\r\n{str8_lit_comp(\"toggle_watch_expr_at_cursor\"), {OS_Key_W, 0   |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"toggle_watch_expr_at_mouse\"), {OS_Key_D, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"toggle_watch_pin\"), {OS_Key_F9, 0 |OS_Modifier_Ctrl  }},\r\n{str8_lit_comp(\"toggle_breakpoint\"), {OS_Key_F9, 0   }},\r\n{str8_lit_comp(\"add_address_breakpoint\"), {OS_Key_F9, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"add_function_breakpoint\"), {OS_Key_F9, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"attach\"), {OS_Key_F6, 0  |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"open_palette\"), {OS_Key_F1, 0   }},\r\n{str8_lit_comp(\"open_palette\"), {OS_Key_P, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift }},\r\n{str8_lit_comp(\"log_marker\"), {OS_Key_M, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n{str8_lit_comp(\"toggle_dev_menu\"), {OS_Key_D, 0 |OS_Modifier_Ctrl |OS_Modifier_Shift |OS_Modifier_Alt}},\r\n};\r\n\r\nString8 rd_binding_version_remap_old_name_table[8] =\r\n{\r\nstr8_lit_comp(\"commands\"),\r\nstr8_lit_comp(\"load_user\"),\r\nstr8_lit_comp(\"load_profile\"),\r\nstr8_lit_comp(\"load_project\"),\r\nstr8_lit_comp(\"open_profile\"),\r\nstr8_lit_comp(\"address_breakpoint\"),\r\nstr8_lit_comp(\"function_breakpoint\"),\r\nstr8_lit_comp(\"toggle_breakpoint_cursor\"),\r\n};\r\n\r\nString8 rd_binding_version_remap_new_name_table[8] =\r\n{\r\nstr8_lit_comp(\"run_command\"),\r\nstr8_lit_comp(\"open_user\"),\r\nstr8_lit_comp(\"open_profile\"),\r\nstr8_lit_comp(\"open_project\"),\r\nstr8_lit_comp(\"open_project\"),\r\nstr8_lit_comp(\"add_address_breakpoint\"),\r\nstr8_lit_comp(\"add_function_breakpoint\"),\r\nstr8_lit_comp(\"toggle_breakpoint\"),\r\n};\r\n\r\nString8 rd_icon_kind_text_table[75] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"b\"),\r\nstr8_lit_comp(\"c\"),\r\nstr8_lit_comp(\"B\"),\r\nstr8_lit_comp(\"C\"),\r\nstr8_lit_comp(\"f\"),\r\nstr8_lit_comp(\"F\"),\r\nstr8_lit_comp(\"g\"),\r\nstr8_lit_comp(\"h\"),\r\nstr8_lit_comp(\"r\"),\r\nstr8_lit_comp(\"s\"),\r\nstr8_lit_comp(\"i\"),\r\nstr8_lit_comp(\"w\"),\r\nstr8_lit_comp(\"W\"),\r\nstr8_lit_comp(\"k\"),\r\nstr8_lit_comp(\"K\"),\r\nstr8_lit_comp(\"L\"),\r\nstr8_lit_comp(\"R\"),\r\nstr8_lit_comp(\"U\"),\r\nstr8_lit_comp(\"D\"),\r\nstr8_lit_comp(\"G\"),\r\nstr8_lit_comp(\"P\"),\r\nstr8_lit_comp(\"3\"),\r\nstr8_lit_comp(\"p\"),\r\nstr8_lit_comp(\"O\"),\r\nstr8_lit_comp(\"o\"),\r\nstr8_lit_comp(\"!\"),\r\nstr8_lit_comp(\"1\"),\r\nstr8_lit_comp(\"V\"),\r\nstr8_lit_comp(\"<\"),\r\nstr8_lit_comp(\">\"),\r\nstr8_lit_comp(\"^\"),\r\nstr8_lit_comp(\"v\"),\r\nstr8_lit_comp(\"9\"),\r\nstr8_lit_comp(\"0\"),\r\nstr8_lit_comp(\"7\"),\r\nstr8_lit_comp(\"8\"),\r\nstr8_lit_comp(\"+\"),\r\nstr8_lit_comp(\"-\"),\r\nstr8_lit_comp(\"'\"),\r\nstr8_lit_comp(\"\\\"\"),\r\nstr8_lit_comp(\"M\"),\r\nstr8_lit_comp(\".\"),\r\nstr8_lit_comp(\"x\"),\r\nstr8_lit_comp(\"q\"),\r\nstr8_lit_comp(\"j\"),\r\nstr8_lit_comp(\"u\"),\r\nstr8_lit_comp(\"m\"),\r\nstr8_lit_comp(\"n\"),\r\nstr8_lit_comp(\"l\"),\r\nstr8_lit_comp(\"a\"),\r\nstr8_lit_comp(\"z\"),\r\nstr8_lit_comp(\"y\"),\r\nstr8_lit_comp(\"X\"),\r\nstr8_lit_comp(\"Y\"),\r\nstr8_lit_comp(\"S\"),\r\nstr8_lit_comp(\"T\"),\r\nstr8_lit_comp(\"Z\"),\r\nstr8_lit_comp(\"d\"),\r\nstr8_lit_comp(\"N\"),\r\nstr8_lit_comp(\"E\"),\r\nstr8_lit_comp(\"H\"),\r\nstr8_lit_comp(\"e\"),\r\nstr8_lit_comp(\"I\"),\r\nstr8_lit_comp(\"J\"),\r\nstr8_lit_comp(\"A\"),\r\nstr8_lit_comp(\"?\"),\r\nstr8_lit_comp(\"4\"),\r\nstr8_lit_comp(\"5\"),\r\nstr8_lit_comp(\"6\"),\r\nstr8_lit_comp(\"&\"),\r\nstr8_lit_comp(\"*\"),\r\nstr8_lit_comp(\"(\"),\r\nstr8_lit_comp(\")\"),\r\nstr8_lit_comp(\"#\"),\r\n};\r\n\r\nString8 rd_code_color_slot_name_table[14] =\r\n{\r\nstr8_lit_comp(\"code_default\"),\r\nstr8_lit_comp(\"code_symbol\"),\r\nstr8_lit_comp(\"code_type\"),\r\nstr8_lit_comp(\"code_local\"),\r\nstr8_lit_comp(\"code_register\"),\r\nstr8_lit_comp(\"code_keyword\"),\r\nstr8_lit_comp(\"code_delimiter_or_operator\"),\r\nstr8_lit_comp(\"code_numeric\"),\r\nstr8_lit_comp(\"code_numeric_alt_digit_group\"),\r\nstr8_lit_comp(\"code_string\"),\r\nstr8_lit_comp(\"code_meta\"),\r\nstr8_lit_comp(\"code_comment\"),\r\nstr8_lit_comp(\"code_line_numbers\"),\r\nstr8_lit_comp(\"code_line_numbers_selected\"),\r\n};\r\n\r\nString8 rd_theme_preset_display_string_table[11] =\r\n{\r\nstr8_lit_comp(\"Default (Dark)\"),\r\nstr8_lit_comp(\"Default (Light)\"),\r\nstr8_lit_comp(\"VS (Dark)\"),\r\nstr8_lit_comp(\"VS (Light)\"),\r\nstr8_lit_comp(\"Solarized (Dark)\"),\r\nstr8_lit_comp(\"Solarized (Light)\"),\r\nstr8_lit_comp(\"Handmade Hero\"),\r\nstr8_lit_comp(\"Naysayer\"),\r\nstr8_lit_comp(\"4coder\"),\r\nstr8_lit_comp(\"Grove\"),\r\nstr8_lit_comp(\"Far Manager\"),\r\n};\r\n\r\nString8 rd_theme_preset_code_string_table[11] =\r\n{\r\nstr8_lit_comp(\"default_dark\"),\r\nstr8_lit_comp(\"default_light\"),\r\nstr8_lit_comp(\"vs_dark\"),\r\nstr8_lit_comp(\"vs_light\"),\r\nstr8_lit_comp(\"solarized_dark\"),\r\nstr8_lit_comp(\"solarized_light\"),\r\nstr8_lit_comp(\"handmade_hero\"),\r\nstr8_lit_comp(\"naysayer\"),\r\nstr8_lit_comp(\"four_coder\"),\r\nstr8_lit_comp(\"grove\"),\r\nstr8_lit_comp(\"far_manager\"),\r\n};\r\n\r\nString8 rd_theme_preset_cfg_string_table[11] =\r\n{\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color: {tags:\\\"background\\\",                             value: 0x1b1b1bff }\\n  theme_color: {tags:\\\"alt background\\\",                         value: 0x222222ff }\\n  theme_color: {tags:\\\"pop background\\\",                         value: 0x355b6eff }\\n  theme_color: {tags:\\\"fresh background\\\",                       value: 0x31393dff }\\n  theme_color: {tags:\\\"match background\\\",                       value: 0x31393dff }\\n  theme_color: {tags:\\\"border\\\",                                 value: 0x404040ff }\\n  theme_color: {tags:\\\"text\\\",                                   value: 0xe5e5e5ff }\\n  theme_color: {tags:\\\"weak text\\\",                              value: 0xa4a4a4ff }\\n  theme_color: {tags:\\\"good text\\\",                              value: 0x32a852ff }\\n  theme_color: {tags:\\\"neutral text\\\",                           value: 0x3a90bbff }\\n  theme_color: {tags:\\\"bad text\\\",                               value: 0xcf5242ff }\\n  theme_color: {tags:\\\"hover\\\",                                  value: 0xffffffff }\\n  theme_color: {tags:\\\"focus overlay\\\",                          value: 0xfda20012 }\\n  theme_color: {tags:\\\"focus border\\\",                           value: 0xfda200ff }\\n  theme_color: {tags:\\\"cursor\\\",                                 value: 0x8aff00ff }\\n  theme_color: {tags:\\\"selection\\\",                              value: 0x99ccff0f }\\n  theme_color: {tags:\\\"inactive background\\\",                    value: 0x0000002f }\\n  theme_color: {tags:\\\"drop_shadow\\\",                            value: 0x0000007f }\\n  theme_color: {tags:\\\"good_pop background\\\",                    value: 0x2c5b36ff }\\n  theme_color: {tags:\\\"good_pop border\\\",                        value: 0x568761ff }\\n  theme_color: {tags:\\\"good_pop hover\\\",                         value: 0xe3f5d3ff }\\n  theme_color: {tags:\\\"good_pop weak text\\\",                     value: 0xe3f5d3ff }\\n  theme_color: {tags:\\\"bad_pop background\\\",                     value: 0x803425ff }\\n  theme_color: {tags:\\\"bad_pop hover\\\",                          value: 0xff825cff }\\n  theme_color: {tags:\\\"code_default\\\",                           value: 0xcbcbcbff }\\n  theme_color: {tags:\\\"code_symbol\\\",                            value: 0x42a2cfff }\\n  theme_color: {tags:\\\"code_type\\\",                              value: 0xfec746ff }\\n  theme_color: {tags:\\\"code_local\\\",                             value: 0x98bc80ff }\\n  theme_color: {tags:\\\"code_register\\\",                          value: 0xb7afd5ff }\\n  theme_color: {tags:\\\"code_keyword\\\",                           value: 0xb38d4cff }\\n  theme_color: {tags:\\\"code_delimiter_or_operator\\\",             value: 0x767676ff }\\n  theme_color: {tags:\\\"code_numeric\\\",                           value: 0x98abb1ff }\\n  theme_color: {tags:\\\"code_numeric_alt_digit_group\\\",           value: 0x738287ff }\\n  theme_color: {tags:\\\"code_string\\\",                            value: 0x98abb1ff }\\n  theme_color: {tags:\\\"code_meta\\\",                              value: 0xd96759ff }\\n  theme_color: {tags:\\\"code_comment\\\",                           value: 0x717171ff }\\n  theme_color: {tags:\\\"line_info_0\\\",                            value: 0x4f3022ff }\\n  theme_color: {tags:\\\"line_info_1\\\",                            value: 0x4f3e15ff }\\n  theme_color: {tags:\\\"line_info_2\\\",                            value: 0x434e2aff }\\n  theme_color: {tags:\\\"line_info_3\\\",                            value: 0x36241fff }\\n  theme_color: {tags:\\\"line_info_4\\\",                            value: 0x4f3022ff }\\n  theme_color: {tags:\\\"line_info_5\\\",                            value: 0x4f3e15ff }\\n  theme_color: {tags:\\\"line_info_6\\\",                            value: 0x434e2aff }\\n  theme_color: {tags:\\\"line_info_7\\\",                            value: 0x36241fff }\\n  theme_color: {tags:\\\"thread_0\\\",                               value: 0xffcb7fff }\\n  theme_color: {tags:\\\"thread_1\\\",                               value: 0xb2ff65ff }\\n  theme_color: {tags:\\\"thread_2\\\",                               value: 0xff99e5ff }\\n  theme_color: {tags:\\\"thread_3\\\",                               value: 0x6598ffff }\\n  theme_color: {tags:\\\"thread_4\\\",                               value: 0x65ffcbff }\\n  theme_color: {tags:\\\"thread_5\\\",                               value: 0xff9819ff }\\n  theme_color: {tags:\\\"thread_6\\\",                               value: 0x9932ffff }\\n  theme_color: {tags:\\\"thread_7\\\",                               value: 0x65ff4cff }\\n  theme_color: {tags:\\\"thread_unwound\\\",                         value: 0xb2ccd8ff }\\n  theme_color: {tags:\\\"thread_error\\\",                           value: 0xb23219ff }\\n  theme_color: {tags:\\\"breakpoint\\\",                             value: 0xa72911ff }\\n  theme_color: {tags:\\\"floating background\\\",                    value: 0x1b1b1baf }\\n  theme_color: {tags:\\\"floating background alt\\\",                value: 0x0000005f }\\n  theme_color: {tags:\\\"floating background fresh\\\",              value: 0x31393d5f }\\n  theme_color: {tags:\\\"floating border\\\",                        value: 0xbfbfbf1f }\\n  theme_color: {tags:\\\"floating scroll_bar background\\\",         value: 0x3b3b3b5f }\\n  theme_color: {tags:\\\"floating scroll_bar border\\\",             value: 0x5f5f5f5f }\\n  theme_color: {tags:\\\"menu_bar background\\\",                    value: 0x2b3740ff }\\n  theme_color: {tags:\\\"menu_bar border\\\",                        value: 0x3e4c57ff }\\n  theme_color: {tags:\\\"scroll_bar background\\\",                  value: 0x2b2b2bff }\\n  theme_color: {tags:\\\"scroll_bar border\\\",                      value: 0x3f3f3fff }\\n  theme_color: {tags:\\\"implicit background\\\",                    value: 0x00000000 }\\n  theme_color: {tags:\\\"implicit border\\\",                        value: 0x00000000 }\\n  theme_color: {tags:\\\"hollow background\\\",                      value: 0x00000000 }\\n  theme_color: {tags:\\\"hollow border\\\",                          value: 0xffffff1f }\\n  theme_color: {tags:\\\"tab background\\\",                         value: 0x6f5135ff }\\n  theme_color: {tags:\\\"tab border\\\",                             value: 0x8a6e54ff }\\n  theme_color: {tags:\\\"tab inactive background\\\",                value: 0x2b3740ff }\\n  theme_color: {tags:\\\"tab inactive border\\\",                    value: 0x3e4c57ff }\\n  theme_color: {tags:\\\"tab auto background\\\",                    value: 0x693847ff }\\n  theme_color: {tags:\\\"tab auto border\\\",                        value: 0x9e6274ff }\\n  theme_color: {tags:\\\"tab auto inactive background\\\",           value: 0x2f2633ff }\\n  theme_color: {tags:\\\"tab auto inactive border\\\",               value: 0x685073ff }\\n  theme_color: {tags:\\\"drop_site background\\\",                   value: 0xffffff05 }\\n  theme_color: {tags:\\\"drop_site border\\\",                       value: 0xffffff0f }\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{  tags: background  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"alt background\\\"  , value: 0xf8f8f8ff }\\n  theme_color:{  tags: \\\"pop background\\\"  , value: 0xcbe4f2ff }\\n  theme_color:{  tags: \\\"menu_bar pop background\\\"  , value: 0x5aabd9ff }\\n  theme_color:{  tags: \\\"fresh background\\\"  , value: 0xeaddceff }\\n  theme_color:{  tags: \\\"match background\\\"  , value: 0xc1e9c4ff }\\n  theme_color:{  tags: border  , value: 0xcbcbcbff }\\n  theme_color:{  tags: text  , value: 0xff }\\n  theme_color:{  tags: \\\"weak text\\\"  , value: 0x727272ff }\\n  theme_color:{  tags: \\\"good text\\\"  , value: 0x217538ff }\\n  theme_color:{  tags: \\\"neutral text\\\"  , value: 0x1a5b7cff }\\n  theme_color:{  tags: \\\"bad text\\\"  , value: 0x972717ff }\\n  theme_color:{  tags: hover  , value: 0xff }\\n  theme_color:{  tags: \\\"focus overlay\\\"  , value: 0x67ff4b }\\n  theme_color:{  tags: \\\"focus border\\\"  , value: 0x67ffff }\\n  theme_color:{  tags: cursor  , value: 0xff }\\n  theme_color:{  tags: selection  , value: 0x283d5166 }\\n  theme_color:{  tags: \\\"inactive background\\\"  , value: 0x8 }\\n  theme_color:{  tags: drop_shadow  , value: 0xb }\\n  theme_color:{  tags: \\\"good_pop background\\\"  , value: 0x90c09aff }\\n  theme_color:{  tags: \\\"good_pop border\\\"  , value: 0x1e7231ff }\\n  theme_color:{  tags: \\\"good_pop hover\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"good_pop weak text\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"good_pop text\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"bad_pop background\\\"  , value: 0xa93620ff }\\n  theme_color:{  tags: \\\"bad_pop text\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"bad_pop text weak\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"menu_bar bad_pop background\\\"  , value: 0xff2a00ff }\\n  theme_color:{  tags: \\\"menu_bar bad_pop text\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"bad_pop hover\\\"  , value: 0xff825cff }\\n  theme_color:{  tags: code_default  , value: 0x80808ff }\\n  theme_color:{  tags: code_symbol  , value: 0x4ac3ff }\\n  theme_color:{  tags: code_type  , value: 0xf46200ff }\\n  theme_color:{  tags: code_local  , value: 0x317c00ff }\\n  theme_color:{  tags: code_register  , value: 0x9a00ffff }\\n  theme_color:{  tags: code_keyword  , value: 0xff0600ff }\\n  theme_color:{  tags: code_delimiter_or_operator  , value: 0x8a8a8aff }\\n  theme_color:{  tags: code_numeric  , value: 0x7d49ff }\\n  theme_color:{  tags: code_numeric_alt_digit_group  , value: 0xb56aff }\\n  theme_color:{  tags: code_string  , value: 0x63549fff }\\n  theme_color:{  tags: code_meta  , value: 0xd96759ff }\\n  theme_color:{  tags: code_comment  , value: 0x717171ff }\\n  theme_color:{  tags: line_info_0  , value: 0xe6d5cdff }\\n  theme_color:{  tags: line_info_1  , value: 0xdbcfb2ff }\\n  theme_color:{  tags: line_info_2  , value: 0xddeac1ff }\\n  theme_color:{  tags: line_info_3  , value: 0xddc4bdff }\\n  theme_color:{  tags: line_info_4  , value: 0xba917eff }\\n  theme_color:{  tags: thread_0  , value: 0xffa700ff }\\n  theme_color:{  tags: thread_1  , value: 0xb41fff }\\n  theme_color:{  tags: thread_2  , value: 0xff99e5ff }\\n  theme_color:{  tags: thread_3  , value: 0x6598ffff }\\n  theme_color:{  tags: thread_4  , value: 0x65ffcbff }\\n  theme_color:{  tags: thread_5  , value: 0xff9819ff }\\n  theme_color:{  tags: thread_6  , value: 0x9932ffff }\\n  theme_color:{  tags: thread_7  , value: 0x65ff4cff }\\n  theme_color:{  tags: thread_unwound  , value: 0xb2ccd8ff }\\n  theme_color:{  tags: thread_error  , value: 0xb23219ff }\\n  theme_color:{  tags: breakpoint  , value: 0xff2800ff }\\n  theme_color:{  tags: \\\"floating background\\\"  , value: 0xffffffc7 }\\n  theme_color:{  tags: \\\"floating background alt\\\"  , value: 0x23 }\\n  theme_color:{  tags: \\\"floating background fresh\\\"  , value: 0xeaddceff }\\n  theme_color:{  tags: \\\"floating border\\\"  , value: 0x88888884 }\\n  theme_color:{  tags: \\\"scroll_bar background\\\"  , value: 0xe9e9e9ff }\\n  theme_color:{  tags: \\\"scroll_bar border\\\"  , value: 0x5f5f5f5f }\\n  theme_color:{  tags: \\\"floating scroll_bar background\\\"  , value: 0xe9e9e9ff }\\n  theme_color:{  tags: \\\"floating scroll_bar border\\\"  , value: 0x5f5f5f5f }\\n  theme_color:{  tags: \\\"menu_bar background\\\"  , value: 0x2b6b9aff }\\n  theme_color:{  tags: \\\"menu_bar border\\\"  , value: 0x4d }\\n  theme_color:{  tags: \\\"menu_bar text\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"menu_bar text weak\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"good menu_bar text\\\"  , value: 0x70db8dff }\\n  theme_color:{  tags: \\\"bad menu_bar text\\\"  , value: 0xffa79bff }\\n  theme_color:{  tags: \\\"neutral menu_bar text\\\"  , value: 0xc4dbe7ff }\\n  theme_color:{  tags: \\\"implicit background\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"implicit border\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"hollow background\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"hollow border\\\"  , value: 0xffffff1f }\\n  theme_color:{  tags: \\\"tab text\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"tab text weak\\\"  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"tab background\\\"  , value: 0xb67e48ff }\\n  theme_color:{  tags: \\\"tab border\\\"  , value: 0x875b31ff }\\n  theme_color:{  tags: \\\"tab inactive background\\\"  , value: 0xcacacaff }\\n  theme_color:{  tags: \\\"tab inactive border\\\"  , value: 0xb5b5b5ff }\\n  theme_color:{  tags: \\\"tab auto background\\\"  , value: 0xc41c69ff }\\n  theme_color:{  tags: \\\"tab auto border\\\"  , value: 0x981039ff }\\n  theme_color:{  tags: \\\"tab auto inactive background\\\"  , value: 0x9b88a3ff }\\n  theme_color:{  tags: \\\"tab auto inactive border\\\"  , value: 0x373737ff }\\n  theme_color:{  tags: \\\"drop_site background\\\"  , value: 0xffffff05 }\\n  theme_color:{  tags: \\\"drop_site border\\\"  , value: 0xffffff0f }\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{  tags: background  , value: 0x1f1f1fff }\\n  theme_color:{  tags: \\\"alt background\\\"  , value: 0x222222ff }\\n  theme_color:{  tags: \\\"pop background\\\"  , value: 0x383167ff }\\n  theme_color:{  tags: \\\"fresh background\\\"  , value: 0x31393dff }\\n  theme_color:{  tags: \\\"match background\\\"  , value: 0x31393dff }\\n  theme_color:{  tags: border  , value: 0x404040ff }\\n  theme_color:{  tags: text  , value: 0xe5e5e5ff }\\n  theme_color:{  tags: \\\"weak text\\\"  , value: 0xa4a4a4ff }\\n  theme_color:{  tags: \\\"good text\\\"  , value: 0x32a852ff }\\n  theme_color:{  tags: \\\"neutral text\\\"  , value: 0x3a90bbff }\\n  theme_color:{  tags: \\\"bad text\\\"  , value: 0xcf5242ff }\\n  theme_color:{  tags: hover  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"focus overlay\\\"  , value: 0x7160e81e }\\n  theme_color:{  tags: \\\"focus border\\\"  , value: 0x7160e8ff }\\n  theme_color:{  tags: cursor  , value: 0x8aff00ff }\\n  theme_color:{  tags: selection  , value: 0x99ccff0f }\\n  theme_color:{  tags: \\\"inactive background\\\"  , value: 0x0000002f }\\n  theme_color:{  tags: drop_shadow  , value: 0x0000007f }\\n  theme_color:{  tags: \\\"good_pop background\\\"  , value: 0x2c5b36ff }\\n  theme_color:{  tags: \\\"good_pop border\\\"  , value: 0x568761ff }\\n  theme_color:{  tags: \\\"good_pop hover\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"good_pop weak text\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"bad_pop background\\\"  , value: 0x803425ff }\\n  theme_color:{  tags: \\\"bad_pop hover\\\"  , value: 0xff825cff }\\n  theme_color:{  tags: code_default  , value: 0xe0e0e0ff }\\n  theme_color:{  tags: code_symbol  , value: 0xdcdcaaff }\\n  theme_color:{  tags: code_type  , value: 0x4ec9b0ff }\\n  theme_color:{  tags: code_local  , value: 0x9cdcfeff }\\n  theme_color:{  tags: code_register  , value: 0xb7afd5ff }\\n  theme_color:{  tags: code_keyword  , value: 0x569cd6ff }\\n  theme_color:{  tags: code_delimiter_or_operator  , value: 0x767676ff }\\n  theme_color:{  tags: code_numeric  , value: 0xb5cea8ff }\\n  theme_color:{  tags: code_numeric_alt_digit_group  , value: 0x7c986dff }\\n  theme_color:{  tags: code_string  , value: 0xd69d85ff }\\n  theme_color:{  tags: code_meta  , value: 0x9b9b9bff }\\n  theme_color:{  tags: code_comment  , value: 0x51a644ff }\\n  theme_color:{  tags: line_info_0  , value: 0x4f3022ff }\\n  theme_color:{  tags: line_info_1  , value: 0x4f3e15ff }\\n  theme_color:{  tags: line_info_2  , value: 0x434e2aff }\\n  theme_color:{  tags: line_info_3  , value: 0x36241fff }\\n  theme_color:{  tags: line_info_4  , value: 0x4f3022ff }\\n  theme_color:{  tags: line_info_5  , value: 0x4f3e15ff }\\n  theme_color:{  tags: line_info_6  , value: 0x434e2aff }\\n  theme_color:{  tags: line_info_7  , value: 0x36241fff }\\n  theme_color:{  tags: thread_0  , value: 0xffdc48ff }\\n  theme_color:{  tags: thread_1  , value: 0xb2ff65ff }\\n  theme_color:{  tags: thread_2  , value: 0xff99e5ff }\\n  theme_color:{  tags: thread_3  , value: 0x6598ffff }\\n  theme_color:{  tags: thread_4  , value: 0x65ffcbff }\\n  theme_color:{  tags: thread_5  , value: 0xff9819ff }\\n  theme_color:{  tags: thread_6  , value: 0x9932ffff }\\n  theme_color:{  tags: thread_7  , value: 0x65ff4cff }\\n  theme_color:{  tags: thread_unwound  , value: 0xb2ccd8ff }\\n  theme_color:{  tags: thread_error  , value: 0xb23219ff }\\n  theme_color:{  tags: breakpoint  , value: 0xa72911ff }\\n  theme_color:{  tags: \\\"floating background\\\"  , value: 0x1b1b1baf }\\n  theme_color:{  tags: \\\"floating background alt\\\"  , value: 0x0000005f }\\n  theme_color:{  tags: \\\"floating background fresh\\\"  , value: 0x31393d5f }\\n  theme_color:{  tags: \\\"floating border\\\"  , value: 0xbfbfbf1f }\\n  theme_color:{  tags: \\\"floating scroll_bar background\\\"  , value: 0x3b3b3b5f }\\n  theme_color:{  tags: \\\"floating scroll_bar border\\\"  , value: 0x5f5f5f5f }\\n  theme_color:{  tags: \\\"scroll_bar background\\\"  , value: 0x2b2b2bff }\\n  theme_color:{  tags: \\\"scroll_bar border\\\"  , value: 0x3f3f3fff }\\n  theme_color:{  tags: \\\"implicit background\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"implicit border\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"hollow background\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"hollow border\\\"  , value: 0xffffff1f }\\n  theme_color:{  tags: \\\"tab background\\\"  , value: 0x333333ff }\\n  theme_color:{  tags: \\\"tab border\\\"  , value: 0x7160e8ff }\\n  theme_color:{  tags: \\\"tab inactive background\\\"  , value: 0x171717ff }\\n  theme_color:{  tags: \\\"tab inactive border\\\"  , value: 0x3e4c57ff }\\n  theme_color:{  tags: \\\"tab auto background\\\"  , value: 0x3f386dff }\\n  theme_color:{  tags: \\\"tab auto border\\\"  , value: 0x7160e8ff }\\n  theme_color:{  tags: \\\"tab auto inactive background\\\"  , value: 0x2f2633ff }\\n  theme_color:{  tags: \\\"tab auto inactive border\\\"  , value: 0x685073ff }\\n  theme_color:{  tags: \\\"drop_site background\\\"  , value: 0xffffff05 }\\n  theme_color:{  tags: \\\"drop_site border\\\"  , value: 0xffffff0f }\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background, value: 0xffffffff}\\n  theme_color:{tags: \\\"alt background\\\", value: 0xefefefff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0xe3eaf2ff}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0xeccbbeff}\\n  theme_color:{tags: \\\"match background\\\", value: 0xedcbf9ff}\\n  theme_color:{tags: border, value: 0xe7e7e7ff}\\n  theme_color:{tags: text, value: 0xff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0x353535ff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x32a852ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x3a90bbff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xcf5242ff}\\n  theme_color:{tags: hover, value: 0xa7ffff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0x8eff3f}\\n  theme_color:{tags: \\\"focus border\\\", value: 0x8effff}\\n  theme_color:{tags: cursor, value: 0xff}\\n  theme_color:{tags: selection, value: 0x56aaff77}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x17}\\n  theme_color:{tags: drop_shadow, value: 0xe7b27}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0x21a43dff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0x21a43dff}\\n  theme_color:{tags: \\\"good_pop hover\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"good_pop weak text\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"good_pop text\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0xcb3f23ff}\\n  theme_color:{tags: \\\"bad_pop text\\\", value: 0xffcdc4ff}\\n  theme_color:{tags: \\\"bad_pop text weak\\\", value: 0xffcdc4ff}\\n  theme_color:{tags: \\\"bad_pop hover\\\", value: 0xff825cff}\\n  theme_color:{tags: code_default, value: 0x000000ff}\\n  theme_color:{tags: code_symbol, value: 0x74531fff}\\n  theme_color:{tags: code_type, value: 0x2b91afff}\\n  theme_color:{tags: code_local, value: 0x1f377fff}\\n  theme_color:{tags: code_register, value: 0x8a1bffff}\\n  theme_color:{tags: code_keyword, value: 0x0000ffff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\\n  theme_color:{tags: code_numeric, value: 0xff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\\n  theme_color:{tags: code_string, value: 0xa61515ff}\\n  theme_color:{tags: code_meta, value: 0x808080ff}\\n  theme_color:{tags: code_comment, value: 0x008000ff}\\n  theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\\n  theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\\n  theme_color:{tags: line_info_2, value: 0x99abc5ff}\\n  theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\\n  theme_color:{tags: thread_0, value: 0xffb141ff}\\n  theme_color:{tags: thread_1, value: 0x66c407ff}\\n  theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\\n  theme_color:{tags: thread_error, value: 0xff2900ff}\\n  theme_color:{tags: breakpoint, value: 0xff2800ff}\\n  theme_color:{tags: \\\"floating background\\\", value: 0xffffffff}\\n  theme_color:{tags: \\\"floating background alt\\\", value: 0x11}\\n  theme_color:{tags: \\\"floating background fresh\\\", value: 0xa0c2d318}\\n  theme_color:{tags: \\\"floating border\\\", value: 0x50}\\n  theme_color:{tags: \\\"floating scroll_bar background\\\", value: 0x3b3b3b5f}\\n  theme_color:{tags: \\\"floating scroll_bar border\\\", value: 0x5f5f5f5f}\\n  theme_color:{tags: \\\"menu_bar background\\\", value: 0xccd5f0ff}\\n  theme_color:{tags: \\\"menu_bar border\\\", value: 0xbabdc3ff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0xe4e4e4ff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0xf5cc84ff}\\n  theme_color:{tags: \\\"tab border\\\", value: 0xae7718ff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value: 0x3b4f81ff}\\n  theme_color:{tags: \\\"tab inactive text\\\", value: 0xffffffff}\\n  theme_color:{tags: \\\"tab inactive border\\\", value: 0x3b4f81ff}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0xe99595ff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0xff6262ff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0xac6060ff}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0xff6262ff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0xffffff05}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0xa7ffff}\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background, value: 0x002a35ff}\\n  theme_color:{tags: \\\"alt background\\\", value: 0x053542ff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0x355b6eff}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0x31393dff}\\n  theme_color:{tags: \\\"match background\\\", value: 0x31393dff}\\n  theme_color:{tags: border, value: 0x65166ff}\\n  theme_color:{tags: text, value: 0xeee8d5ff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0x93a1a1ff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x32a852ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x3a90bbff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xcf5242ff}\\n  theme_color:{tags: hover, value: 0xca4b16ff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0xca4b151f}\\n  theme_color:{tags: \\\"focus border\\\", value: 0xca4b16ff}\\n  theme_color:{tags: cursor, value: 0xca4b16ff}\\n  theme_color:{tags: selection, value: 0x99ccff0f}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x0000002f}\\n  theme_color:{tags: drop_shadow, value: 0x0000007f}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0x5f8700ff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0x5f8700ff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0x810000ff}\\n  theme_color:{tags: code_default, value: 0x839496ff}\\n  theme_color:{tags: code_symbol, value: 0xb3880eff}\\n  theme_color:{tags: code_type, value: 0xb3880eff}\\n  theme_color:{tags: code_local, value: 0xeee8d5ff}\\n  theme_color:{tags: code_register, value: 0xeee8d5ff}\\n  theme_color:{tags: code_keyword, value: 0x849804ff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\\n  theme_color:{tags: code_numeric, value: 0x2aa198ff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\\n  theme_color:{tags: code_string, value: 0x2aa198ff}\\n  theme_color:{tags: code_meta, value: 0xca4b16ff}\\n  theme_color:{tags: code_comment, value: 0x586e75ff}\\n  theme_color:{tags: line_info_0, value: 0x4f3022ff}\\n  theme_color:{tags: line_info_1, value: 0x4f3e15ff}\\n  theme_color:{tags: line_info_2, value: 0x434e2aff}\\n  theme_color:{tags: line_info_3, value: 0x36241fff}\\n  theme_color:{tags: thread_0, value: 0xffcb7fff}\\n  theme_color:{tags: thread_1, value: 0xb2ff65ff}\\n  theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\\n  theme_color:{tags: thread_error, value: 0xb23219ff}\\n  theme_color:{tags: breakpoint, value: 0xa72911ff}\\n  theme_color:{tags: \\\"floating background\\\", value: 0x2a3574}\\n  theme_color:{tags: \\\"floating background alt\\\", value: 0x4f}\\n  theme_color:{tags: \\\"floating background fresh\\\", value: 0x31393d5f}\\n  theme_color:{tags: \\\"floating scroll_bar background\\\", value: 0x53542ff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0x53542ff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0x586e75ff}\\n  theme_color:{tags: \\\"tab border\\\", value: 0x90abb3ff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value: 0x0}\\n  theme_color:{tags: \\\"tab inactive border\\\", value: 0x33494fff}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0x565ed2ff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0xa2a6dfff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0x595fbcff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0xffffff05}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0xffffff0f}\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background, value: 0xfdf6e3ff}\\n  theme_color:{tags: \\\"alt background\\\", value: 0xeee8d5ff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0x29a19890}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0xf7d38dff}\\n  theme_color:{tags: \\\"match background\\\", value: 0xdcddddff}\\n  theme_color:{tags: border, value: 0xd1ccbdff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0x93a1a1ff}\\n  theme_color:{tags: text, value: 0x657b83ff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x32a852ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x3a90bbff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xcf5242ff}\\n  theme_color:{tags: hover, value: 0xca4b16ff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0xca4b1454}\\n  theme_color:{tags: \\\"focus border\\\", value: 0xca4b16ff}\\n  theme_color:{tags: cursor, value: 0xca4b16ff}\\n  theme_color:{tags: selection, value: 0x8594a264}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x14}\\n  theme_color:{tags: drop_shadow, value: 0x3a}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0xd1e99aff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0xd1e99aff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0xd26c6cff}\\n  theme_color:{tags: \\\"bad_pop border\\\", value: 0xd26c6cff}\\n  theme_color:{tags: \\\"bad_pop weak text\\\", value: 0xffffffff}\\n  theme_color:{tags: \\\"bad_pop text\\\", value: 0xffffffff}\\n  theme_color:{tags: code_default, value: 0x839496ff}\\n  theme_color:{tags: code_symbol, value: 0xb3880eff}\\n  theme_color:{tags: code_type, value: 0xb3880eff}\\n  theme_color:{tags: code_local, value: 0x657b83ff}\\n  theme_color:{tags: code_register, value: 0x947298ff}\\n  theme_color:{tags: code_keyword, value: 0x849804ff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\\n  theme_color:{tags: code_numeric, value: 0x2aa198ff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\\n  theme_color:{tags: code_string, value: 0x2aa198ff}\\n  theme_color:{tags: code_meta, value: 0xca4b16ff}\\n  theme_color:{tags: code_comment, value: 0x586e75ff}\\n  theme_color:{tags: line_info_0, value: 0xeee1dbff}\\n  theme_color:{tags: line_info_1, value: 0xe5d5b1ff}\\n  theme_color:{tags: line_info_2, value: 0xd9e8b6ff}\\n  theme_color:{tags: line_info_3, value: 0xf5d5ccff}\\n  theme_color:{tags: thread_0, value: 0xffa100ff}\\n  theme_color:{tags: thread_1, value: 0x6edd00ff}\\n  theme_color:{tags: thread_unwound, value: 0x708f9eff}\\n  theme_color:{tags: thread_error, value: 0xff5231ff}\\n  theme_color:{tags: breakpoint, value: 0xff411dff}\\n  theme_color:{tags: \\\"floating background\\\", value: 0xfdf6e3b1}\\n  theme_color:{tags: \\\"floating background alt\\\", value: 0x22}\\n  theme_color:{tags: \\\"floating background fresh\\\", value: 0xf7d38dff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0xeee6d0ff}\\n  theme_color:{tags: \\\"scroll_bar floating background\\\", value: 0xd5ccb5ff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0xfdf6e3ff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value: 0xe0d6bbff}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0xf5cfe1ff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0xa2a6dfff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0xc8a5b5ff}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0x595fbcff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0x29a19890}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0x81ddd690}\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background, value: 0x0c0c0cff}\\n  theme_color:{tags: \\\"alt background\\\", value: 0x161616ff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0x355b6eff}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0x31393dff}\\n  theme_color:{tags: \\\"match background\\\", value: 0x31393dff}\\n  theme_color:{tags: border, value: 0x404040ff}\\n  theme_color:{tags: text, value: 0xcac1b6ff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0xa08563ff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x32a852ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x3a90bbff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xcf5242ff}\\n  theme_color:{tags: hover, value: 0xffffffff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0x7485971e}\\n  theme_color:{tags: \\\"focus border\\\", value: 0x5e6b79ff}\\n  theme_color:{tags: cursor, value: 0x00ee00ff}\\n  theme_color:{tags: selection, value: 0x99ccff0f}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x0000002f}\\n  theme_color:{tags: drop_shadow, value: 0x0000007f}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0x2c5b36ff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0x568761ff}\\n  theme_color:{tags: \\\"good_pop hover\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"good_pop weak text\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0x803425ff}\\n  theme_color:{tags: \\\"bad_pop hover\\\", value: 0xff825cff}\\n  theme_color:{tags: code_default, value: 0xa08563ff}\\n  theme_color:{tags: code_symbol, value: 0xcc5735ff}\\n  theme_color:{tags: code_type, value: 0xd8a51cff}\\n  theme_color:{tags: code_local, value: 0xd6b995ff}\\n  theme_color:{tags: code_register, value: 0xc04047ff}\\n  theme_color:{tags: code_keyword, value: 0xac7b0aff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0x907553ff}\\n  theme_color:{tags: code_numeric, value: 0x6b8e23ff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0x4f681cff}\\n  theme_color:{tags: code_string, value: 0x6b8e23ff}\\n  theme_color:{tags: code_meta, value: 0xdab98fff}\\n  theme_color:{tags: code_comment, value: 0x686868ff}\\n  theme_color:{tags: line_info_0, value: 0x4f3022ff}\\n  theme_color:{tags: line_info_1, value: 0x4f3e15ff}\\n  theme_color:{tags: line_info_2, value: 0x434e2aff}\\n  theme_color:{tags: line_info_3, value: 0x36241fff}\\n  theme_color:{tags: thread_0, value: 0xffcb7fff}\\n  theme_color:{tags: thread_1, value: 0xb2ff65ff}\\n  theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\\n  theme_color:{tags: thread_error, value: 0xb23219ff}\\n  theme_color:{tags: breakpoint, value: 0xa72911ff}\\n  theme_color:{tags: \\\"floating background\\\", value: 0x18181980}\\n  theme_color:{tags: \\\"floating background alt\\\", value: 0x0000005f}\\n  theme_color:{tags: \\\"floating background fresh\\\", value: 0x31393d5f}\\n  theme_color:{tags: \\\"floating border\\\", value: 0xbfbfbf1f}\\n  theme_color:{tags: \\\"floating scroll_bar background\\\", value: 0x3b3b3b5f}\\n  theme_color:{tags: \\\"floating scroll_bar border\\\", value: 0x5f5f5f5f}\\n  theme_color:{tags: \\\"menu_bar background\\\", value: 0x1f1f27ff}\\n  theme_color:{tags: \\\"menu_bar border\\\", value: 0x3d3d47ff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0x2b2b2bff}\\n  theme_color:{tags: \\\"scroll_bar border\\\", value: 0x3f3f3fff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0x1f1f27ff}\\n  theme_color:{tags: \\\"tab border\\\", value: 0x3d3d47ff}\\n  theme_color:{tags: \\\"tab text\\\", value: 0xca9301ff}\\n  theme_color:{tags: \\\"tab text weak\\\", value: 0x8c690eff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value: 0x171718ff}\\n  theme_color:{tags: \\\"tab inactive border\\\", value: 0x1f1f27ff}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0x243b38ff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0x478980ff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0x102623ff}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0x1e5850ff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0xffffff05}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0xffffff0f}\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background, value: 0x042327ff}\\n  theme_color:{tags: \\\"alt background\\\", value: 0x11b1fff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0x355b6eff}\\n  theme_color:{tags: \\\"pop text\\\", value: 0xbad7e6ff}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0x31393dff}\\n  theme_color:{tags: \\\"match background\\\", value: 0x31393dff}\\n  theme_color:{tags: border, value: 0x334d50ff}\\n  theme_color:{tags: text, value: 0xdad3beff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0xb0a688ff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x32a852ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x3a90bbff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xcf5242ff}\\n  theme_color:{tags: \\\"menu_bar good text\\\", value: 0x2a8242ff}\\n  theme_color:{tags: \\\"menu_bar neutral text\\\", value: 0x5681ff}\\n  theme_color:{tags: \\\"menu_bar bad text\\\", value: 0xa21200ff}\\n  theme_color:{tags: \\\"menu_bar weak text\\\", value: 0x313131ff}\\n  theme_color:{tags: \\\"menu_bar bad_pop text weak\\\", value: 0xffffffff}\\n  theme_color:{tags: hover, value: 0xffffffff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0x86e08e20}\\n  theme_color:{tags: \\\"focus border\\\", value: 0x86e08fff}\\n  theme_color:{tags: cursor, value: 0x86e08fff}\\n  theme_color:{tags: selection, value: 0x99ccff0f}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x0000002f}\\n  theme_color:{tags: drop_shadow, value: 0x0000007f}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0x2c5b36ff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0x568761ff}\\n  theme_color:{tags: \\\"good_pop hover\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"good_pop weak text\\\", value: 0xe3f5d3ff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0x803425ff}\\n  theme_color:{tags: \\\"bad_pop hover\\\", value: 0xff825cff}\\n  theme_color:{tags: code_default, value: 0xbdb395ff}\\n  theme_color:{tags: code_symbol, value: 0xcbe0f5ff}\\n  theme_color:{tags: code_type, value: 0xcbe0f5ff}\\n  theme_color:{tags: code_local, value: 0xd9cfb3ff}\\n  theme_color:{tags: code_register, value: 0xb7afd5ff}\\n  theme_color:{tags: code_keyword, value: 0x9de3c0ff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\\n  theme_color:{tags: code_numeric, value: 0x2ca198ff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0x217770ff}\\n  theme_color:{tags: code_string, value: 0x2ca198ff}\\n  theme_color:{tags: code_meta, value: 0xB0FFB0ff}\\n  theme_color:{tags: code_comment, value: 0x31b72cff}\\n  theme_color:{tags: line_info_0, value: 0x4f3022ff}\\n  theme_color:{tags: line_info_1, value: 0x4f3e15ff}\\n  theme_color:{tags: line_info_2, value: 0x434e2aff}\\n  theme_color:{tags: line_info_3, value: 0x36241fff}\\n  theme_color:{tags: thread_0, value: 0xffcb7fff}\\n  theme_color:{tags: thread_1, value: 0xb2ff65ff}\\n  theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\\n  theme_color:{tags: thread_error, value: 0xb23219ff}\\n  theme_color:{tags: breakpoint, value: 0xa72911ff}\\n  theme_color:{tags: \\\"floating background\\\", value: 0x3232792}\\n  theme_color:{tags: \\\"floating background alt\\\", value: 0x0000005f}\\n  theme_color:{tags: \\\"floating background fresh\\\", value: 0x31393d5f}\\n  theme_color:{tags: \\\"floating scroll_bar background\\\", value: 0xe363bff}\\n  theme_color:{tags: \\\"menu_bar background\\\", value: 0xb59e7aff}\\n  theme_color:{tags: \\\"menu_bar text\\\", value: 0xff}\\n  theme_color:{tags: \\\"menu_bar border\\\", value: 0x947d5aff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0xe363bff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0x13533aff}\\n  theme_color:{tags: \\\"tab border\\\", value: 0x6c9182ff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value: 0x0}\\n  theme_color:{tags: \\\"tab inactive border\\\", value: 0x947d5a6c}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0x5b3939ff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0x875c5cff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0x251b1bff}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0x563d3dff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0xffffff05}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0xffffff0f}\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background,value: 0xc0c0cff}\\n  theme_color:{tags: \\\"alt background\\\", value: 0x131313ff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0x4c00ff}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0x4c00ff}\\n  theme_color:{tags: \\\"match background\\\", value: 0x4c00ff}\\n  theme_color:{tags: border, value: 0x272727ff}\\n  theme_color:{tags: text, value: 0x90b080ff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0x6b845fff}\\n  theme_color:{tags: \\\"menu_bar background\\\", value: 0x888888ff}\\n  theme_color:{tags: \\\"menu_bar text\\\", value: 0x20202ff}\\n  theme_color:{tags: \\\"menu_bar text weak\\\", value: 0x525252ff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x32a852ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x3a90bbff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xcf5242ff}\\n  theme_color:{tags: hover, value: 0xee00ff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0xee0012}\\n  theme_color:{tags: \\\"focus border\\\", value: 0x00ee00ff}\\n  theme_color:{tags: cursor, value: 0x00ee00ff}\\n  theme_color:{tags: selection, value: 0x99ccff0f}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x0000002f}\\n  theme_color:{tags: drop_shadow, value: 0x0000007f}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0x4900ff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0x4900ff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0x430b00ff}\\n  theme_color:{tags: code_default, value: 0x90b080ff}\\n  theme_color:{tags: code_symbol, value: 0xbfd9b2ff}\\n  theme_color:{tags: code_type, value: 0xbfd9b2ff}\\n  theme_color:{tags: code_local, value: 0xbfd9b2ff}\\n  theme_color:{tags: code_register, value: 0xb84cffff}\\n  theme_color:{tags: code_keyword, value: 0xd08f1fff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0x90b080ff}\\n  theme_color:{tags: code_numeric, value: 0x50ff2fff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0x30af18ff}\\n  theme_color:{tags: code_string, value: 0x50ff2fff}\\n  theme_color:{tags: code_meta, value: 0x90b080ff}\\n  theme_color:{tags: code_comment, value: 0x1f90f0ff}\\n  theme_color:{tags: line_info_0, value: 0xa253dff}\\n  theme_color:{tags: line_info_1, value: 0x9103dff}\\n  theme_color:{tags: line_info_2, value: 0x1e083dff}\\n  theme_color:{tags: line_info_3, value: 0x1e083dff}\\n  theme_color:{tags: thread_0, value: 0xd08f1fff}\\n  theme_color:{tags: thread_1, value: 0x1ea5d0ff}\\n  theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\\n  theme_color:{tags: thread_error, value: 0xb23219ff}\\n  theme_color:{tags: breakpoint, value: 0xa72911ff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0x1d1d1dff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0x15490cff}\\n  theme_color:{tags: \\\"tab border\\\", value: 0x15490cff}\\n  theme_color:{tags: \\\"tab text\\\", value: 0x90b080ff}\\n  theme_color:{tags: \\\"tab text weak\\\", value: 0x90b080ff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value: 0x21321eff}\\n  theme_color:{tags: \\\"tab inactive border\\\", value: 0x21321eff}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0x674f3eff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0x674f3eff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0x47382eff}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0x47382eff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0xffffff05}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0xffffff0f}\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{  tags: background  , value: 0x1b1f22ff }\\n  theme_color:{  tags: \\\"alt background\\\"  , value: 0x232929ff }\\n  theme_color:{  tags: \\\"pop background\\\"  , value: 0x2f4838ff }\\n  theme_color:{  tags: \\\"fresh background\\\"  , value: 0x31393dff }\\n  theme_color:{  tags: \\\"match background\\\"  , value: 0x31393dff }\\n  theme_color:{  tags: border  , value: 0x485347ff }\\n  theme_color:{  tags: text  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"weak text\\\"  , value: 0xa2a2a2ff }\\n  theme_color:{  tags: \\\"good text\\\"  , value: 0x32a852ff }\\n  theme_color:{  tags: \\\"neutral text\\\"  , value: 0x3a90bbff }\\n  theme_color:{  tags: \\\"bad text\\\"  , value: 0xcf5242ff }\\n  theme_color:{  tags: hover  , value: 0xffffffff }\\n  theme_color:{  tags: \\\"focus overlay\\\"  , value: 0xfda20012 }\\n  theme_color:{  tags: \\\"focus border\\\"  , value: 0xfda200ff }\\n  theme_color:{  tags: cursor  , value: 0x8aff00ff }\\n  theme_color:{  tags: selection  , value: 0x99ccff0f }\\n  theme_color:{  tags: \\\"inactive background\\\"  , value: 0x0 }\\n  theme_color:{  tags: drop_shadow  , value: 0x0000007f }\\n  theme_color:{  tags: \\\"good_pop background\\\"  , value: 0x2c5b36ff }\\n  theme_color:{  tags: \\\"good_pop border\\\"  , value: 0x568761ff }\\n  theme_color:{  tags: \\\"good_pop hover\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"good_pop weak text\\\"  , value: 0xe3f5d3ff }\\n  theme_color:{  tags: \\\"bad_pop background\\\"  , value: 0x803425ff }\\n  theme_color:{  tags: \\\"bad_pop hover\\\"  , value: 0xff825cff }\\n  theme_color:{  tags: code_default  , value: 0xad8b69ff }\\n  theme_color:{  tags: code_symbol  , value: 0x87ad6aff }\\n  theme_color:{  tags: code_type  , value: 0xb67474ff }\\n  theme_color:{  tags: code_local  , value: 0xe9bf95ff }\\n  theme_color:{  tags: code_register  , value: 0xa688b2ff }\\n  theme_color:{  tags: code_keyword  , value: 0xe49e17ff }\\n  theme_color:{  tags: code_delimiter_or_operator  , value: 0x795e43ff }\\n  theme_color:{  tags: code_numeric  , value: 0x98b19eff }\\n  theme_color:{  tags: code_numeric_alt_digit_group  , value: 0x688b71ff }\\n  theme_color:{  tags: code_string  , value: 0x98b19eff }\\n  theme_color:{  tags: code_meta  , value: 0xad5979ff }\\n  theme_color:{  tags: code_comment  , value: 0x52675dff }\\n  theme_color:{  tags: line_info_0  , value: 0x4f3022ff }\\n  theme_color:{  tags: line_info_1  , value: 0x4f3e15ff }\\n  theme_color:{  tags: line_info_2  , value: 0x434e2aff }\\n  theme_color:{  tags: line_info_3  , value: 0x36241fff }\\n  theme_color:{  tags: line_info_4  , value: 0x4f3022ff }\\n  theme_color:{  tags: line_info_5  , value: 0x4f3e15ff }\\n  theme_color:{  tags: line_info_6  , value: 0x434e2aff }\\n  theme_color:{  tags: line_info_7  , value: 0x36241fff }\\n  theme_color:{  tags: thread_0  , value: 0xffc258ff }\\n  theme_color:{  tags: thread_1  , value: 0x82d331ff }\\n  theme_color:{  tags: thread_2  , value: 0xff99e5ff }\\n  theme_color:{  tags: thread_3  , value: 0x6598ffff }\\n  theme_color:{  tags: thread_4  , value: 0x65ffcbff }\\n  theme_color:{  tags: thread_5  , value: 0xff9819ff }\\n  theme_color:{  tags: thread_6  , value: 0x9932ffff }\\n  theme_color:{  tags: thread_7  , value: 0x65ff4cff }\\n  theme_color:{  tags: thread_unwound  , value: 0xb2ccd8ff }\\n  theme_color:{  tags: thread_error  , value: 0xb23219ff }\\n  theme_color:{  tags: breakpoint  , value: 0xa72911ff }\\n  theme_color:{  tags: \\\"floating background\\\"  , value: 0x1b1f2276 }\\n  theme_color:{  tags: \\\"floating background alt\\\"  , value: 0x0000005f }\\n  theme_color:{  tags: \\\"floating background fresh\\\"  , value: 0x31393d5f }\\n  theme_color:{  tags: \\\"floating border\\\"  , value: 0xbfbfbf1f }\\n  theme_color:{  tags: \\\"floating scroll_bar background\\\"  , value: 0x3b3b3b5f }\\n  theme_color:{  tags: \\\"floating scroll_bar border\\\"  , value: 0x5f5f5f5f }\\n  theme_color:{  tags: \\\"menu_bar background\\\"  , value: 0x243d32ff }\\n  theme_color:{  tags: \\\"menu_bar border\\\"  , value: 0x597b63ff }\\n  theme_color:{  tags: \\\"scroll_bar background\\\"  , value: 0x232929ff }\\n  theme_color:{  tags: \\\"scroll_bar border\\\"  , value: 0x3c4a3fff }\\n  theme_color:{  tags: \\\"implicit background\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"implicit border\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"hollow background\\\"  , value: 0x00000000 }\\n  theme_color:{  tags: \\\"hollow border\\\"  , value: 0xffffff1f }\\n  theme_color:{  tags: \\\"tab background\\\"  , value: 0x243d32ff }\\n  theme_color:{  tags: \\\"tab border\\\"  , value: 0x597b63ff }\\n  theme_color:{  tags: \\\"tab inactive background\\\"  , value: 0x30383eff }\\n  theme_color:{  tags: \\\"tab inactive border\\\"  , value: 0x6b7680ff }\\n  theme_color:{  tags: \\\"tab auto background\\\"  , value: 0x30636dff }\\n  theme_color:{  tags: \\\"tab auto border\\\"  , value: 0x768f94ff }\\n  theme_color:{  tags: \\\"tab auto inactive background\\\"  , value: 0x2f2633ff }\\n  theme_color:{  tags: \\\"tab auto inactive border\\\"  , value: 0x685073ff }\\n  theme_color:{  tags: \\\"drop_site background\\\"  , value: 0xffffff05 }\\n  theme_color:{  tags: \\\"drop_site border\\\"  , value: 0xffffff0f }\\n}\\n\"),\r\nstr8_lit_comp(\"theme:\\n{\\n  theme_color:{tags: background, value: 0x000080ff}\\n  theme_color:{tags: \\\"pop background\\\", value: 0x8080ff}\\n  theme_color:{tags: \\\"fresh background\\\", value: 0x31393dff}\\n  theme_color:{tags: \\\"match background\\\", value: 0x31393dff}\\n  theme_color:{tags: border, value: 0x8080ff}\\n  theme_color:{tags: text, value: 0xffffffff}\\n  theme_color:{tags: \\\"weak text\\\", value: 0xffffffff}\\n  theme_color:{tags: \\\"good text\\\", value: 0x00ff00ff}\\n  theme_color:{tags: \\\"neutral text\\\", value: 0x00ffffff}\\n  theme_color:{tags: \\\"bad text\\\", value: 0xff0000ff}\\n  theme_color:{tags: hover, value: 0xffffffff}\\n  theme_color:{tags: \\\"focus overlay\\\", value: 0xffff0012}\\n  theme_color:{tags: \\\"focus border\\\", value: 0xffff00ff}\\n  theme_color:{tags: cursor, value: 0xffff00ff}\\n  theme_color:{tags: selection, value: 0xffff0018}\\n  theme_color:{tags: \\\"inactive background\\\", value: 0x0000002f}\\n  theme_color:{tags: drop_shadow, value: 0x0000007f}\\n  theme_color:{tags: \\\"good_pop background\\\", value: 0x6c17ff}\\n  theme_color:{tags: \\\"good_pop border\\\", value: 0x6c17ff}\\n  theme_color:{tags: \\\"bad_pop background\\\", value: 0xff0000ff}\\n  theme_color:{tags: code_default, value: 0xffffffff}\\n  theme_color:{tags: code_symbol, value: 0xffffff}\\n  theme_color:{tags: code_type, value: 0x00ff00ff}\\n  theme_color:{tags: code_local, value: 0x00ffffff}\\n  theme_color:{tags: code_register, value: 0xff00ffff}\\n  theme_color:{tags: code_keyword, value: 0xffffffff}\\n  theme_color:{tags: code_delimiter_or_operator, value: 0xffffffff}\\n  theme_color:{tags: code_numeric, value: 0xffff00ff}\\n  theme_color:{tags: code_numeric_alt_digit_group, value: 0xffff00ff}\\n  theme_color:{tags: code_string, value: 0xffff00ff}\\n  theme_color:{tags: code_meta, value: 0xff0000ff}\\n  theme_color:{tags: code_comment, value: 0x008080ff}\\n  theme_color:{tags: line_info_0, value: 0x8080ff}\\n  theme_color:{tags: line_info_1, value: 0x800080ff}\\n  theme_color:{tags: line_info_2, value: 0x800000ff}\\n  theme_color:{tags: line_info_3, value: 0x08000ff}\\n  theme_color:{tags: thread_0, value: 0xffff00ff}\\n  theme_color:{tags: thread_1, value: 0x00ff00ff}\\n  theme_color:{tags: thread_unwound, value: 0x00ffffff}\\n  theme_color:{tags: thread_error, value: 0xff0000ff}\\n  theme_color:{tags: breakpoint, value: 0xff0000ff}\\n  theme_color:{tags: \\\"menu_bar background\\\", value: 0x008080ff}\\n  theme_color:{tags: \\\"menu_bar border\\\", value: 0x8080ff}\\n  theme_color:{tags: \\\"scroll_bar background\\\", value: 0x008080ff}\\n  theme_color:{tags: \\\"implicit background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"implicit border\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow background\\\", value: 0x00000000}\\n  theme_color:{tags: \\\"hollow border\\\", value: 0xffffff1f}\\n  theme_color:{tags: \\\"tab background\\\", value: 0x8080ff}\\n  theme_color:{tags: \\\"tab border\\\", value: 0x8080ff}\\n  theme_color:{tags: \\\"tab inactive background\\\", value:0}\\n  theme_color:{tags: \\\"tab auto background\\\", value: 0x800000ff}\\n  theme_color:{tags: \\\"tab auto border\\\", value: 0x8080ff}\\n  theme_color:{tags: \\\"tab auto inactive background\\\", value: 0x300000ff}\\n  theme_color:{tags: \\\"tab auto inactive border\\\", value: 0x8080ff}\\n  theme_color:{tags: \\\"drop_site background\\\", value: 0x80ff}\\n  theme_color:{tags: \\\"drop_site border\\\", value: 0xffffff}\\n}\\n\"),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/raddbg/generated/raddbg.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef RADDBG_META_H\r\n#define RADDBG_META_H\r\n\r\ntypedef enum RD_RegSlot\r\n{\r\nRD_RegSlot_Null,\r\nRD_RegSlot_Machine,\r\nRD_RegSlot_Module,\r\nRD_RegSlot_Process,\r\nRD_RegSlot_Thread,\r\nRD_RegSlot_CtrlEntity,\r\nRD_RegSlot_Window,\r\nRD_RegSlot_Panel,\r\nRD_RegSlot_Tab,\r\nRD_RegSlot_View,\r\nRD_RegSlot_PrevTab,\r\nRD_RegSlot_DstPanel,\r\nRD_RegSlot_Cfg,\r\nRD_RegSlot_CfgList,\r\nRD_RegSlot_EvalSpace,\r\nRD_RegSlot_UnwindCount,\r\nRD_RegSlot_InlineDepth,\r\nRD_RegSlot_FilePath,\r\nRD_RegSlot_Cursor,\r\nRD_RegSlot_Mark,\r\nRD_RegSlot_TextKey,\r\nRD_RegSlot_LangKind,\r\nRD_RegSlot_Lines,\r\nRD_RegSlot_DbgiKey,\r\nRD_RegSlot_Vaddr,\r\nRD_RegSlot_Voff,\r\nRD_RegSlot_VaddrRange,\r\nRD_RegSlot_VoffRange,\r\nRD_RegSlot_Expr,\r\nRD_RegSlot_UIKey,\r\nRD_RegSlot_SrcUIKey,\r\nRD_RegSlot_OffPx,\r\nRD_RegSlot_RegSlot,\r\nRD_RegSlot_PID,\r\nRD_RegSlot_ForceConfirm,\r\nRD_RegSlot_ForceFocus,\r\nRD_RegSlot_PreferDisasm,\r\nRD_RegSlot_NoRichTooltip,\r\nRD_RegSlot_DoImplicitRoot,\r\nRD_RegSlot_DoLister,\r\nRD_RegSlot_DoBigRows,\r\nRD_RegSlot_AllWindows,\r\nRD_RegSlot_NonGraphical,\r\nRD_RegSlot_PreferNewTab,\r\nRD_RegSlot_Dir2,\r\nRD_RegSlot_String,\r\nRD_RegSlot_CmdName,\r\nRD_RegSlot_OSEvent,\r\nRD_RegSlot_COUNT,\r\n} RD_RegSlot;\r\n\r\ntypedef enum RD_CmdKind\r\n{\r\nRD_CmdKind_Null,\r\nRD_CmdKind_LaunchAndRun,\r\nRD_CmdKind_LaunchAndStepInto,\r\nRD_CmdKind_Kill,\r\nRD_CmdKind_KillAll,\r\nRD_CmdKind_Detach,\r\nRD_CmdKind_Continue,\r\nRD_CmdKind_StepIntoInst,\r\nRD_CmdKind_StepOverInst,\r\nRD_CmdKind_StepIntoLine,\r\nRD_CmdKind_StepOverLine,\r\nRD_CmdKind_StepOut,\r\nRD_CmdKind_Halt,\r\nRD_CmdKind_SoftHaltRefresh,\r\nRD_CmdKind_SetThreadIP,\r\nRD_CmdKind_RunToLine,\r\nRD_CmdKind_Run,\r\nRD_CmdKind_Restart,\r\nRD_CmdKind_StepInto,\r\nRD_CmdKind_StepOver,\r\nRD_CmdKind_FreezeThread,\r\nRD_CmdKind_ThawThread,\r\nRD_CmdKind_FreezeProcess,\r\nRD_CmdKind_ThawProcess,\r\nRD_CmdKind_FreezeMachine,\r\nRD_CmdKind_ThawMachine,\r\nRD_CmdKind_FreezeLocalMachine,\r\nRD_CmdKind_ThawLocalMachine,\r\nRD_CmdKind_FreezeEntity,\r\nRD_CmdKind_ThawEntity,\r\nRD_CmdKind_SetEntityColor,\r\nRD_CmdKind_SetEntityName,\r\nRD_CmdKind_Attach,\r\nRD_CmdKind_Exit,\r\nRD_CmdKind_OpenPalette,\r\nRD_CmdKind_RunCommand,\r\nRD_CmdKind_RunExternalDriverTextCommand,\r\nRD_CmdKind_OSEvent,\r\nRD_CmdKind_SelectThread,\r\nRD_CmdKind_SelectUnwind,\r\nRD_CmdKind_UpOneFrame,\r\nRD_CmdKind_DownOneFrame,\r\nRD_CmdKind_SelectEntity,\r\nRD_CmdKind_DeselectEntity,\r\nRD_CmdKind_IncWindowFontSize,\r\nRD_CmdKind_DecWindowFontSize,\r\nRD_CmdKind_IncViewFontSize,\r\nRD_CmdKind_DecViewFontSize,\r\nRD_CmdKind_OpenWindow,\r\nRD_CmdKind_WindowSettings,\r\nRD_CmdKind_CloseWindow,\r\nRD_CmdKind_ToggleFullscreen,\r\nRD_CmdKind_BringToFront,\r\nRD_CmdKind_PopupAccept,\r\nRD_CmdKind_PopupCancel,\r\nRD_CmdKind_ResetToDefaultBindings,\r\nRD_CmdKind_ResetToDefaultPanels,\r\nRD_CmdKind_ResetToCompactPanels,\r\nRD_CmdKind_ResetToSimplePanels,\r\nRD_CmdKind_NewPanelLeft,\r\nRD_CmdKind_NewPanelUp,\r\nRD_CmdKind_NewPanelRight,\r\nRD_CmdKind_NewPanelDown,\r\nRD_CmdKind_SplitPanel,\r\nRD_CmdKind_RotatePanelColumns,\r\nRD_CmdKind_NextPanel,\r\nRD_CmdKind_PrevPanel,\r\nRD_CmdKind_FocusPanel,\r\nRD_CmdKind_FocusPanelRight,\r\nRD_CmdKind_FocusPanelLeft,\r\nRD_CmdKind_FocusPanelUp,\r\nRD_CmdKind_FocusPanelDown,\r\nRD_CmdKind_Undo,\r\nRD_CmdKind_Redo,\r\nRD_CmdKind_GoBack,\r\nRD_CmdKind_GoForward,\r\nRD_CmdKind_ClosePanel,\r\nRD_CmdKind_FocusTab,\r\nRD_CmdKind_NextTab,\r\nRD_CmdKind_PrevTab,\r\nRD_CmdKind_MoveTabRight,\r\nRD_CmdKind_MoveTabLeft,\r\nRD_CmdKind_OpenTab,\r\nRD_CmdKind_BuildTab,\r\nRD_CmdKind_DuplicateTab,\r\nRD_CmdKind_CopyTabFullPath,\r\nRD_CmdKind_CloseTab,\r\nRD_CmdKind_MoveView,\r\nRD_CmdKind_TabBarTop,\r\nRD_CmdKind_TabBarBottom,\r\nRD_CmdKind_TabSettings,\r\nRD_CmdKind_SetCurrentPath,\r\nRD_CmdKind_Open,\r\nRD_CmdKind_Switch,\r\nRD_CmdKind_SwitchToPartnerFile,\r\nRD_CmdKind_RecordFileInProject,\r\nRD_CmdKind_ShowFileInExplorer,\r\nRD_CmdKind_GoToDisassembly,\r\nRD_CmdKind_GoToSource,\r\nRD_CmdKind_SetFileReplacementPath,\r\nRD_CmdKind_NewUser,\r\nRD_CmdKind_NewProject,\r\nRD_CmdKind_OpenUser,\r\nRD_CmdKind_OpenProject,\r\nRD_CmdKind_OpenRecentProject,\r\nRD_CmdKind_SaveUser,\r\nRD_CmdKind_SaveProject,\r\nRD_CmdKind_RecordUserAsLastOpened,\r\nRD_CmdKind_RecordProjectInUser,\r\nRD_CmdKind_WriteUserData,\r\nRD_CmdKind_WriteProjectData,\r\nRD_CmdKind_UserSettings,\r\nRD_CmdKind_ProjectSettings,\r\nRD_CmdKind_Edit,\r\nRD_CmdKind_Accept,\r\nRD_CmdKind_Cancel,\r\nRD_CmdKind_MoveLeft,\r\nRD_CmdKind_MoveRight,\r\nRD_CmdKind_MoveUp,\r\nRD_CmdKind_MoveDown,\r\nRD_CmdKind_MoveLeftSelect,\r\nRD_CmdKind_MoveRightSelect,\r\nRD_CmdKind_MoveUpSelect,\r\nRD_CmdKind_MoveDownSelect,\r\nRD_CmdKind_MoveLeftChunk,\r\nRD_CmdKind_MoveRightChunk,\r\nRD_CmdKind_MoveUpChunk,\r\nRD_CmdKind_MoveDownChunk,\r\nRD_CmdKind_MoveUpPage,\r\nRD_CmdKind_MoveDownPage,\r\nRD_CmdKind_MoveUpWhole,\r\nRD_CmdKind_MoveDownWhole,\r\nRD_CmdKind_MoveLeftChunkSelect,\r\nRD_CmdKind_MoveRightChunkSelect,\r\nRD_CmdKind_MoveUpChunkSelect,\r\nRD_CmdKind_MoveDownChunkSelect,\r\nRD_CmdKind_MoveUpPageSelect,\r\nRD_CmdKind_MoveDownPageSelect,\r\nRD_CmdKind_MoveUpWholeSelect,\r\nRD_CmdKind_MoveDownWholeSelect,\r\nRD_CmdKind_MoveUpReorder,\r\nRD_CmdKind_MoveDownReorder,\r\nRD_CmdKind_MoveHome,\r\nRD_CmdKind_MoveEnd,\r\nRD_CmdKind_MoveHomeSelect,\r\nRD_CmdKind_MoveEndSelect,\r\nRD_CmdKind_SelectAll,\r\nRD_CmdKind_DeleteSingle,\r\nRD_CmdKind_DeleteChunk,\r\nRD_CmdKind_BackspaceSingle,\r\nRD_CmdKind_BackspaceChunk,\r\nRD_CmdKind_Copy,\r\nRD_CmdKind_Cut,\r\nRD_CmdKind_Paste,\r\nRD_CmdKind_InsertText,\r\nRD_CmdKind_MoveNext,\r\nRD_CmdKind_MovePrev,\r\nRD_CmdKind_GoToLine,\r\nRD_CmdKind_GoToAddress,\r\nRD_CmdKind_CenterCursor,\r\nRD_CmdKind_ContainCursor,\r\nRD_CmdKind_FindNext,\r\nRD_CmdKind_FindPrev,\r\nRD_CmdKind_FindThread,\r\nRD_CmdKind_FindSelectedThread,\r\nRD_CmdKind_GoToName,\r\nRD_CmdKind_GoToNameAtCursor,\r\nRD_CmdKind_ToggleWatchExpression,\r\nRD_CmdKind_ToggleWatchExpressionAtCursor,\r\nRD_CmdKind_ToggleWatchExpressionAtMouse,\r\nRD_CmdKind_EnableCfg,\r\nRD_CmdKind_DisableCfg,\r\nRD_CmdKind_SelectCfg,\r\nRD_CmdKind_DeselectCfg,\r\nRD_CmdKind_RemoveCfg,\r\nRD_CmdKind_NameCfg,\r\nRD_CmdKind_ConditionCfg,\r\nRD_CmdKind_DuplicateCfg,\r\nRD_CmdKind_RelocateCfg,\r\nRD_CmdKind_SaveToProject,\r\nRD_CmdKind_AddBreakpoint,\r\nRD_CmdKind_AddAddressBreakpoint,\r\nRD_CmdKind_AddFunctionBreakpoint,\r\nRD_CmdKind_ToggleBreakpoint,\r\nRD_CmdKind_RemoveBreakpoint,\r\nRD_CmdKind_EnableBreakpoint,\r\nRD_CmdKind_DisableBreakpoint,\r\nRD_CmdKind_ClearBreakpoints,\r\nRD_CmdKind_ListBreakpoints,\r\nRD_CmdKind_ClearOutput,\r\nRD_CmdKind_AddWatchPin,\r\nRD_CmdKind_ToggleWatchPin,\r\nRD_CmdKind_LoadDebugInfo,\r\nRD_CmdKind_UnloadDebugInfo,\r\nRD_CmdKind_AddTypeView,\r\nRD_CmdKind_AddFilePathMap,\r\nRD_CmdKind_EditUserTheme,\r\nRD_CmdKind_EditProjectTheme,\r\nRD_CmdKind_AddThemeColor,\r\nRD_CmdKind_ForkTheme,\r\nRD_CmdKind_SaveTheme,\r\nRD_CmdKind_SaveAndSetTheme,\r\nRD_CmdKind_SetNextStatement,\r\nRD_CmdKind_AddTarget,\r\nRD_CmdKind_SelectTarget,\r\nRD_CmdKind_EnableTarget,\r\nRD_CmdKind_DisableTarget,\r\nRD_CmdKind_RemoveTarget,\r\nRD_CmdKind_RegisterAsJITDebugger,\r\nRD_CmdKind_FindCodeLocation,\r\nRD_CmdKind_Search,\r\nRD_CmdKind_SearchBackwards,\r\nRD_CmdKind_PickFile,\r\nRD_CmdKind_PickFolder,\r\nRD_CmdKind_PickFileOrFolder,\r\nRD_CmdKind_PushQuery,\r\nRD_CmdKind_CompleteQuery,\r\nRD_CmdKind_CancelQuery,\r\nRD_CmdKind_UpdateQuery,\r\nRD_CmdKind_OpenEventBuffer,\r\nRD_CmdKind_CloseEventBuffer,\r\nRD_CmdKind_ToggleDevMenu,\r\nRD_CmdKind_LogMarker,\r\nRD_CmdKind_OpenWatch,\r\nRD_CmdKind_OpenLocals,\r\nRD_CmdKind_OpenRegisters,\r\nRD_CmdKind_OpenGlobals,\r\nRD_CmdKind_OpenThreadLocals,\r\nRD_CmdKind_OpenTypes,\r\nRD_CmdKind_OpenProcedures,\r\nRD_CmdKind_OpenCallStack,\r\nRD_CmdKind_OpenTargets,\r\nRD_CmdKind_OpenBreakpoints,\r\nRD_CmdKind_OpenWatchPins,\r\nRD_CmdKind_OpenDebugInfos,\r\nRD_CmdKind_OpenThreads,\r\nRD_CmdKind_OpenProcesses,\r\nRD_CmdKind_OpenMachines,\r\nRD_CmdKind_OpenModules,\r\nRD_CmdKind_OpenFilePathMaps,\r\nRD_CmdKind_OpenTypeViews,\r\nRD_CmdKind_OpenOutput,\r\nRD_CmdKind_OpenText,\r\nRD_CmdKind_OpenDisasm,\r\nRD_CmdKind_OpenMemory,\r\nRD_CmdKind_OpenBitmap,\r\nRD_CmdKind_OpenColor,\r\nRD_CmdKind_OpenGeo3D,\r\nRD_CmdKind_COUNT,\r\nRD_CmdKind_FirstTabFastPathCmd = RD_CmdKind_OpenWatch,\r\n} RD_CmdKind;\r\n\r\ntypedef enum RD_IconKind\r\n{\r\nRD_IconKind_Null,\r\nRD_IconKind_FolderOpenOutline,\r\nRD_IconKind_FolderClosedOutline,\r\nRD_IconKind_FolderOpenFilled,\r\nRD_IconKind_FolderClosedFilled,\r\nRD_IconKind_FileOutline,\r\nRD_IconKind_FileFilled,\r\nRD_IconKind_Play,\r\nRD_IconKind_PlayStepForward,\r\nRD_IconKind_Pause,\r\nRD_IconKind_Stop,\r\nRD_IconKind_Info,\r\nRD_IconKind_WarningSmall,\r\nRD_IconKind_WarningBig,\r\nRD_IconKind_Unlocked,\r\nRD_IconKind_Locked,\r\nRD_IconKind_LeftArrow,\r\nRD_IconKind_RightArrow,\r\nRD_IconKind_UpArrow,\r\nRD_IconKind_DownArrow,\r\nRD_IconKind_Gear,\r\nRD_IconKind_Pencil,\r\nRD_IconKind_Trash,\r\nRD_IconKind_Pin,\r\nRD_IconKind_RadioHollow,\r\nRD_IconKind_RadioFilled,\r\nRD_IconKind_CheckHollow,\r\nRD_IconKind_CheckFilled,\r\nRD_IconKind_Check,\r\nRD_IconKind_LeftCaret,\r\nRD_IconKind_RightCaret,\r\nRD_IconKind_UpCaret,\r\nRD_IconKind_DownCaret,\r\nRD_IconKind_UpScroll,\r\nRD_IconKind_DownScroll,\r\nRD_IconKind_LeftScroll,\r\nRD_IconKind_RightScroll,\r\nRD_IconKind_Add,\r\nRD_IconKind_Minus,\r\nRD_IconKind_Thread,\r\nRD_IconKind_Threads,\r\nRD_IconKind_Machine,\r\nRD_IconKind_CircleFilled,\r\nRD_IconKind_X,\r\nRD_IconKind_Refresh,\r\nRD_IconKind_Undo,\r\nRD_IconKind_Redo,\r\nRD_IconKind_Save,\r\nRD_IconKind_Window,\r\nRD_IconKind_Target,\r\nRD_IconKind_Clipboard,\r\nRD_IconKind_Scheduler,\r\nRD_IconKind_Module,\r\nRD_IconKind_XSplit,\r\nRD_IconKind_YSplit,\r\nRD_IconKind_ClosePanel,\r\nRD_IconKind_StepInto,\r\nRD_IconKind_StepOver,\r\nRD_IconKind_StepOut,\r\nRD_IconKind_Find,\r\nRD_IconKind_Palette,\r\nRD_IconKind_Thumbnails,\r\nRD_IconKind_Glasses,\r\nRD_IconKind_Binoculars,\r\nRD_IconKind_List,\r\nRD_IconKind_Grid,\r\nRD_IconKind_QuestionMark,\r\nRD_IconKind_Person,\r\nRD_IconKind_Briefcase,\r\nRD_IconKind_Dot,\r\nRD_IconKind_Bitmap,\r\nRD_IconKind_Cube,\r\nRD_IconKind_WindowRestore,\r\nRD_IconKind_WindowMinimize,\r\nRD_IconKind_Duplicate,\r\nRD_IconKind_COUNT,\r\n} RD_IconKind;\r\n\r\ntypedef enum RD_CodeColorSlot\r\n{\r\nRD_CodeColorSlot_CodeDefault,\r\nRD_CodeColorSlot_CodeSymbol,\r\nRD_CodeColorSlot_CodeType,\r\nRD_CodeColorSlot_CodeLocal,\r\nRD_CodeColorSlot_CodeRegister,\r\nRD_CodeColorSlot_CodeKeyword,\r\nRD_CodeColorSlot_CodeDelimiterOperator,\r\nRD_CodeColorSlot_CodeNumeric,\r\nRD_CodeColorSlot_CodeNumericAltDigitGroup,\r\nRD_CodeColorSlot_CodeString,\r\nRD_CodeColorSlot_CodeMeta,\r\nRD_CodeColorSlot_CodeComment,\r\nRD_CodeColorSlot_CodeLineNumbers,\r\nRD_CodeColorSlot_CodeLineNumbersSelected,\r\nRD_CodeColorSlot_COUNT,\r\n} RD_CodeColorSlot;\r\n\r\ntypedef enum RD_ThemePreset\r\n{\r\nRD_ThemePreset_DefaultDark,\r\nRD_ThemePreset_DefaultLight,\r\nRD_ThemePreset_VSDark,\r\nRD_ThemePreset_VSLight,\r\nRD_ThemePreset_SolarizedDark,\r\nRD_ThemePreset_SolarizedLight,\r\nRD_ThemePreset_HandmadeHero,\r\nRD_ThemePreset_Naysayer,\r\nRD_ThemePreset_FourCoder,\r\nRD_ThemePreset_Grove,\r\nRD_ThemePreset_FarManager,\r\nRD_ThemePreset_COUNT,\r\n} RD_ThemePreset;\r\n\r\ntypedef struct RD_VocabInfo RD_VocabInfo;\r\nstruct RD_VocabInfo\r\n{\r\nString8 code_name;\r\nString8 code_name_plural;\r\nString8 display_name;\r\nString8 display_name_plural;\r\nRD_IconKind icon_kind;\r\n};\r\n\r\ntypedef struct RD_NameSchemaInfo RD_NameSchemaInfo;\r\nstruct RD_NameSchemaInfo\r\n{\r\nString8 name;\r\nString8 schema;\r\n};\r\n\r\ntypedef struct RD_Regs RD_Regs;\r\nstruct RD_Regs\r\n{\r\nCTRL_Handle machine;\r\nCTRL_Handle module;\r\nCTRL_Handle process;\r\nCTRL_Handle thread;\r\nCTRL_Handle ctrl_entity;\r\nCFG_ID window;\r\nCFG_ID panel;\r\nCFG_ID tab;\r\nCFG_ID view;\r\nCFG_ID prev_tab;\r\nCFG_ID dst_panel;\r\nCFG_ID cfg;\r\nCFG_IDList cfg_list;\r\nE_Space eval_space;\r\nU64 unwind_count;\r\nU64 inline_depth;\r\nString8 file_path;\r\nTxtPt cursor;\r\nTxtPt mark;\r\nC_Key text_key;\r\nTXT_LangKind lang_kind;\r\nD_LineList lines;\r\nDI_Key dbgi_key;\r\nU64 vaddr;\r\nU64 voff;\r\nRng1U64 vaddr_range;\r\nRng1U64 voff_range;\r\nString8 expr;\r\nUI_Key ui_key;\r\nUI_Key src_ui_key;\r\nVec2F32 off_px;\r\nRD_RegSlot reg_slot;\r\nU32 pid;\r\nB32 force_confirm;\r\nB32 force_focus;\r\nB32 prefer_disasm;\r\nB32 no_rich_tooltip;\r\nB32 do_implicit_root;\r\nB32 do_lister;\r\nB32 do_big_rows;\r\nB32 all_windows;\r\nB32 non_graphical;\r\nB32 prefer_new_tab;\r\nDir2 dir2;\r\nString8 string;\r\nString8 cmd_name;\r\nOS_Event * os_event;\r\n};\r\n\r\ntypedef struct RD_Query RD_Query;\r\nstruct RD_Query\r\n{\r\nRD_QueryFlags flags;\r\nRD_RegSlot slot;\r\nString8 expr;\r\nString8 view_name;\r\nCTRL_EntityKind ctrl_entity_kind;\r\n};\r\n\r\ntypedef struct RD_CmdKindInfo RD_CmdKindInfo;\r\nstruct RD_CmdKindInfo\r\n{\r\nString8 string;\r\nString8 description;\r\nString8 search_tags;\r\nString8 ctx_filter;\r\nRD_CmdKindFlags flags;\r\nRD_Query query;\r\n};\r\n\r\n#define RD_FixedTabXList \\\r\nY(watches, watch, \"\")\\\r\nX(locals) \\\r\nX(registers) \\\r\nX(globals) \\\r\nX(thread_locals) \\\r\nX(types) \\\r\nX(procedures) \\\r\nX(call_stack) \\\r\nX(targets) \\\r\nX(breakpoints) \\\r\nX(watch_pins) \\\r\nX(debug_infos) \\\r\nX(threads) \\\r\nX(processes) \\\r\nX(machines) \\\r\nX(modules) \\\r\nX(file_path_maps) \\\r\nX(type_views) \\\r\nY(output, text, \"query:output\")\\\r\nY(text, text, \"\")\\\r\nY(disasm, disasm, \"\")\\\r\nY(memory, memory, \"\")\\\r\nY(bitmap, bitmap, \"\")\\\r\nY(color, color, \"\")\\\r\nY(geo3d, geo3d, \"\")\\\r\nZ(getting_started)\\\r\n\r\n#define rd_regs_lit_init_top \\\r\n.machine = rd_regs()->machine,\\\r\n.module = rd_regs()->module,\\\r\n.process = rd_regs()->process,\\\r\n.thread = rd_regs()->thread,\\\r\n.ctrl_entity = rd_regs()->ctrl_entity,\\\r\n.window = rd_regs()->window,\\\r\n.panel = rd_regs()->panel,\\\r\n.tab = rd_regs()->tab,\\\r\n.view = rd_regs()->view,\\\r\n.prev_tab = rd_regs()->prev_tab,\\\r\n.dst_panel = rd_regs()->dst_panel,\\\r\n.cfg = rd_regs()->cfg,\\\r\n.cfg_list = rd_regs()->cfg_list,\\\r\n.eval_space = rd_regs()->eval_space,\\\r\n.unwind_count = rd_regs()->unwind_count,\\\r\n.inline_depth = rd_regs()->inline_depth,\\\r\n.file_path = rd_regs()->file_path,\\\r\n.cursor = rd_regs()->cursor,\\\r\n.mark = rd_regs()->mark,\\\r\n.text_key = rd_regs()->text_key,\\\r\n.lang_kind = rd_regs()->lang_kind,\\\r\n.lines = rd_regs()->lines,\\\r\n.dbgi_key = rd_regs()->dbgi_key,\\\r\n.vaddr = rd_regs()->vaddr,\\\r\n.voff = rd_regs()->voff,\\\r\n.vaddr_range = rd_regs()->vaddr_range,\\\r\n.voff_range = rd_regs()->voff_range,\\\r\n.expr = rd_regs()->expr,\\\r\n.ui_key = rd_regs()->ui_key,\\\r\n.src_ui_key = rd_regs()->src_ui_key,\\\r\n.off_px = rd_regs()->off_px,\\\r\n.reg_slot = rd_regs()->reg_slot,\\\r\n.pid = rd_regs()->pid,\\\r\n.force_confirm = rd_regs()->force_confirm,\\\r\n.force_focus = rd_regs()->force_focus,\\\r\n.prefer_disasm = rd_regs()->prefer_disasm,\\\r\n.no_rich_tooltip = rd_regs()->no_rich_tooltip,\\\r\n.do_implicit_root = rd_regs()->do_implicit_root,\\\r\n.do_lister = rd_regs()->do_lister,\\\r\n.do_big_rows = rd_regs()->do_big_rows,\\\r\n.all_windows = rd_regs()->all_windows,\\\r\n.non_graphical = rd_regs()->non_graphical,\\\r\n.prefer_new_tab = rd_regs()->prefer_new_tab,\\\r\n.dir2 = rd_regs()->dir2,\\\r\n.string = rd_regs()->string,\\\r\n.cmd_name = rd_regs()->cmd_name,\\\r\n.os_event = rd_regs()->os_event,\\\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 rd_tab_fast_path_view_name_table[25];\r\nextern String8 rd_tab_fast_path_query_name_table[25];\r\nextern RD_VocabInfo rd_vocab_info_table[358];\r\nextern RD_NameSchemaInfo rd_name_schema_info_table[26];\r\nextern String8 rd_reg_slot_code_name_table[48];\r\nextern Rng1U64 rd_reg_slot_range_table[48];\r\nextern String8 rd_binding_version_remap_old_name_table[8];\r\nextern String8 rd_binding_version_remap_new_name_table[8];\r\nextern String8 rd_icon_kind_text_table[75];\r\nextern String8 rd_code_color_slot_name_table[14];\r\nextern String8 rd_theme_preset_display_string_table[11];\r\nextern String8 rd_theme_preset_code_string_table[11];\r\nextern String8 rd_theme_preset_cfg_string_table[11];\r\nread_only global U8 rd_icon_font_bytes__data[] =\r\n{\r\n0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x80,0x00,0x03,0x00,0x70,0x47,0x53,0x55,0x42,0x20,0x8b,0x25,0x7a,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x54,0x4f,0x53,0x2f,0x32,0x56,0x43,0x62,0x25,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0xa3,0x60,0xa4,0x23,0x00,0x00,0x01,0xb0,0x00,0x00,0x06,0x12,0x63,0x76,0x74,0x20,\r\n0x0e,0x1f,0x06,0xf3,0x00,0x00,0x51,0x34,0x00,0x00,0x00,0x38,0x66,0x70,0x67,0x6d,0x62,0x31,0xfb,0x7b,0x00,0x00,0x51,0x6c,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70,0x00,0x00,0x00,0x10,0x00,0x00,0x51,0x2c,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x71,0xda,0x4c,0xc8,0x00,0x00,0x07,0xc4,0x00,0x00,0x40,0x90,0x68,0x65,0x61,0x64,\r\n0x2b,0xeb,0xd3,0xaf,0x00,0x00,0x48,0x54,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,0x07,0xc2,0x04,0x27,0x00,0x00,0x48,0x8c,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,0x06,0x4b,0xff,0xca,0x00,0x00,0x48,0xb0,0x00,0x00,0x01,0x44,0x6c,0x6f,0x63,0x61,0x71,0xa6,0x82,0xac,0x00,0x00,0x49,0xf4,0x00,0x00,0x00,0xa4,0x6d,0x61,0x78,0x70,\r\n0x01,0xe8,0x0f,0x19,0x00,0x00,0x4a,0x98,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,0xcd,0x9d,0x1c,0x1d,0x00,0x00,0x4a,0xb8,0x00,0x00,0x02,0xcd,0x70,0x6f,0x73,0x74,0x77,0x9e,0x36,0x3b,0x00,0x00,0x4d,0x88,0x00,0x00,0x03,0xa2,0x70,0x72,0x65,0x70,0xeb,0x48,0xca,0x9d,0x00,0x00,0x5f,0x78,0x00,0x00,0x00,0xa7,0x00,0x01,0x00,0x00,\r\n0x00,0x0a,0x00,0x30,0x00,0x3e,0x00,0x02,0x44,0x46,0x4c,0x54,0x00,0x0e,0x6c,0x61,0x74,0x6e,0x00,0x1a,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x6c,0x69,0x67,0x61,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x04,\r\n0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x04,0x03,0x3d,0x01,0x90,0x00,0x05,0x00,0x00,0x02,0x7a,0x02,0xbc,0x00,0x00,0x00,0x8c,0x02,0x7a,0x02,0xbc,0x00,0x00,0x01,0xe0,0x00,0x31,0x01,0x02,0x00,0x00,0x02,0x00,0x05,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x66,0x45,0x64,0x00,0xc0,0x00,0x21,0x00,0x7d,0x03,0x52,0xff,0x6a,0x00,0x5a,0x03,0xac,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x04,\r\n0x00,0x00,0x02,0x42,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x3c,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x2c,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x42,0x00,0x04,0x01,0x10,0x00,0x00,0x00,0x18,0x00,0x10,0x00,0x03,0x00,0x08,0x00,0x23,0x00,0x2b,0x00,0x2e,0x00,0x31,0x00,0x39,0x00,0x3c,0x00,0x5b,0x00,0x5e,0x00,0x73,0x00,0x7b,0x00,0x7d,\r\n0xff,0xff,0x00,0x00,0x00,0x21,0x00,0x26,0x00,0x2d,0x00,0x30,0x00,0x33,0x00,0x3c,0x00,0x3e,0x00,0x5d,0x00,0x61,0x00,0x75,0x00,0x7d,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x1c,0x00,0x26,0x00,0x28,0x00,0x2a,0x00,0x36,\r\n0x00,0x36,0x00,0x70,0x00,0x72,0x00,0x96,0x00,0xa2,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,\r\n0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x39,0x00,0x3a,\r\n0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,0x00,0x4d,0x00,0x4e,0x00,0x4f,0x00,0x50,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x00,0x00,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x0a,0x0b,0x00,0x0c,0x0d,0x00,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x00,0x00,0x15,0x00,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,\r\n0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0x00,0x34,0x35,0x00,0x00,0x36,0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x00,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x00,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x03,0xd0,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x50,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x05,0x00,0x00,\r\n0x00,0x28,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x2e,0x00,0x00,\r\n0x00,0x2e,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x35,0x00,0x00,\r\n0x00,0x10,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x15,0x00,0x00,\r\n0x00,0x3e,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x19,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x43,0x00,0x00,\r\n0x00,0x43,0x00,0x00,0x00,0x1b,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,\r\n0x00,0x20,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x25,0x00,0x00,\r\n0x00,0x4e,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x50,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x53,0x00,0x00,\r\n0x00,0x53,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x2e,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x57,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x58,0x00,0x00,\r\n0x00,0x30,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x31,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x35,0x00,0x00,\r\n0x00,0x61,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x39,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x66,0x00,0x00,\r\n0x00,0x66,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00,\r\n0x00,0x40,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x45,0x00,0x00,\r\n0x00,0x71,0x00,0x00,0x00,0x71,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x72,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x77,0x00,0x00,\r\n0x00,0x77,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x79,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7d,0x00,0x00,\r\n0x00,0x50,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x25,0x40,0x22,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x13,0x00,0x4e,0x02,0x00,0x1e,0x1b,0x16,0x13,0x0a,0x07,0x00,0x0f,0x02,0x0f,0x05,0x07,0x16,0x2b,0x01,0x21,0x22,0x06,0x07,0x11,0x14,\r\n0x16,0x17,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x17,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x71,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x34,0x7c,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x02,0xc3,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,\r\n0xd0,0x25,0x34,0x59,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x5e,0x01,0x60,0x00,0x06,0x00,0x00,0xff,0xba,0x02,0x80,0x03,0x02,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x39,0x00,0x42,0x00,0x4b,0x00,0x54,0x40,0x51,0x39,0x30,0x2f,0x26,0x0d,0x0c,0x03,0x02,0x08,0x02,0x04,0x01,0x4c,0x08,0x0c,0x02,0x04,0x0b,0x01,0x02,0x03,0x04,\r\n0x02,0x69,0x09,0x01,0x05,0x05,0x01,0x61,0x07,0x01,0x01,0x01,0x13,0x4d,0x0d,0x0a,0x02,0x03,0x03,0x00,0x61,0x06,0x01,0x00,0x00,0x11,0x00,0x4e,0x44,0x43,0x1e,0x1d,0x48,0x47,0x43,0x4b,0x44,0x4b,0x41,0x40,0x3d,0x3c,0x35,0x34,0x2b,0x2a,0x22,0x21,0x1d,0x25,0x1e,0x25,0x13,0x14,0x19,0x17,0x0e,0x07,0x1a,0x2b,0x13,0x14,0x07,0x11,\r\n0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,0x03,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x36,0x03,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x01,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,0x15,0x14,0x07,0x27,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,\r\n0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0xf0,0x48,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x32,0x2a,0x38,0x28,0x28,0x38,0x2a,0x46,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x01,0xdc,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x48,0x74,0x28,0x38,0x2a,0x2a,0x38,0x28,0x44,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x02,0x8a,0x4c,0x22,0xfe,\r\n0x86,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0xfd,0x76,0x1e,0x28,0x28,0x3a,0x28,0x28,0x02,0x30,0x28,0x3a,0x28,0x28,0x3a,0x28,0xfe,0x5c,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,0x22,0x6e,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x46,0x28,0x3a,0x28,\r\n0x28,0x3a,0x28,0x00,0x00,0x05,0x00,0x00,0xff,0x6a,0x03,0xe8,0x03,0x52,0x00,0x1f,0x00,0x22,0x00,0x25,0x00,0x33,0x00,0x3c,0x00,0x70,0x40,0x6d,0x23,0x01,0x00,0x06,0x1d,0x01,0x09,0x00,0x27,0x20,0x02,0x07,0x05,0x03,0x4c,0x00,0x03,0x00,0x06,0x00,0x03,0x06,0x67,0x0c,0x01,0x00,0x00,0x09,0x05,0x00,0x09,0x67,0x00,0x05,0x00,0x07,\r\n0x04,0x05,0x07,0x67,0x00,0x04,0x00,0x0a,0x08,0x04,0x0a,0x67,0x00,0x08,0x00,0x02,0x0b,0x08,0x02,0x67,0x0d,0x01,0x0b,0x01,0x01,0x0b,0x57,0x0d,0x01,0x0b,0x0b,0x01,0x5f,0x00,0x01,0x0b,0x01,0x4f,0x34,0x34,0x01,0x00,0x34,0x3c,0x34,0x3c,0x3b,0x39,0x36,0x35,0x30,0x2f,0x2e,0x2c,0x29,0x28,0x25,0x24,0x22,0x21,0x1a,0x17,0x0e,0x0c,\r\n0x09,0x06,0x00,0x1f,0x01,0x1e,0x0e,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x35,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x3f,0x01,0x3e,0x01,0x3b,0x01,0x32,0x16,0x17,0x15,0x36,0x33,0x0f,0x01,0x33,0x01,0x07,0x33,0x17,0x37,0x35,0x23,0x15,0x14,0x06,0x07,0x23,0x11,0x21,0x35,0x34,0x36,0x01,0x11,\r\n0x23,0x15,0x14,0x06,0x27,0x23,0x11,0x03,0xb2,0x17,0x1e,0x01,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0xfe,0xd1,0x17,0x1e,0x01,0x16,0x10,0xe4,0x0f,0x36,0x16,0xe8,0x17,0x1e,0x01,0x26,0x21,0x47,0xa7,0xa7,0xfe,0x9b,0xa7,0xa7,0x6d,0xb0,0xd6,0x1e,0x17,0xe9,0x01,0x1e,0x16,0x02,0x26,0xd7,0x1e,0x17,0xe8,0x02,0x7c,0x20,0x16,0xfd,0x5a,\r\n0x17,0x1e,0x01,0x20,0x16,0xa0,0x20,0x16,0x01,0x77,0x16,0x36,0x0f,0xe4,0x10,0x16,0x20,0x16,0xb7,0x17,0x77,0xa7,0x01,0x7d,0xa7,0xc2,0xb0,0xe9,0xe9,0x16,0x1e,0x01,0xfe,0x9b,0x8f,0x16,0x36,0xfe,0x4e,0x02,0x83,0xe8,0x16,0x20,0x01,0xfe,0x9a,0x00,0x00,0x04,0xff,0xff,0xff,0xb1,0x04,0x2f,0x03,0x0b,0x00,0x08,0x00,0x0f,0x00,0x1f,\r\n0x00,0x2f,0x00,0x52,0x40,0x4f,0x1d,0x14,0x02,0x01,0x03,0x0f,0x01,0x00,0x01,0x0e,0x0d,0x0c,0x09,0x04,0x02,0x00,0x1c,0x15,0x02,0x04,0x02,0x04,0x4c,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x69,0x07,0x01,0x03,0x03,0x06,0x5f,0x00,0x06,0x06,0x13,0x4d,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,\r\n0x11,0x05,0x4e,0x11,0x10,0x2e,0x2b,0x26,0x23,0x19,0x17,0x10,0x1f,0x11,0x1f,0x13,0x13,0x12,0x08,0x07,0x19,0x2b,0x01,0x14,0x0e,0x01,0x26,0x34,0x36,0x1e,0x01,0x01,0x15,0x21,0x35,0x37,0x17,0x01,0x25,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x37,0x21,0x32,0x36,0x27,0x11,0x34,0x26,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x11,\r\n0x34,0x36,0x37,0x21,0x32,0x16,0x01,0x65,0x3e,0x5a,0x3e,0x3e,0x5a,0x3e,0x02,0x3c,0xfc,0xee,0xb2,0x5a,0x01,0x1d,0x01,0x1e,0xfc,0x83,0x07,0x0a,0x01,0x0c,0x06,0x03,0x7d,0x07,0x0c,0x01,0x0a,0x51,0x34,0x25,0xfc,0x83,0x24,0x36,0x01,0x34,0x25,0x03,0x7d,0x25,0x34,0x02,0x11,0x2d,0x3e,0x02,0x42,0x56,0x42,0x04,0x3a,0xfe,0xfa,0xfa,\r\n0x6b,0xb3,0x59,0x01,0x1d,0xa1,0x0a,0x08,0xfd,0x5a,0x07,0x0c,0x01,0x0a,0x08,0x02,0xa6,0x08,0x0a,0x12,0xfd,0x5a,0x25,0x34,0x01,0x36,0x24,0x02,0xa6,0x25,0x34,0x01,0x36,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xba,0x00,0xf0,0x03,0x02,0x00,0x13,0x00,0x1c,0x00,0x25,0x00,0x39,0x40,0x36,0x13,0x0a,0x09,0x00,0x04,0x05,0x02,0x01,\r\n0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x13,0x4d,0x06,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x11,0x00,0x4e,0x1e,0x1d,0x22,0x21,0x1d,0x25,0x1e,0x25,0x13,0x17,0x19,0x14,0x07,0x07,0x1a,0x2b,0x37,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x11,0x26,0x35,0x34,0x36,0x32,0x16,\r\n0x15,0x14,0x07,0x27,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0xa8,0x48,0x46,0x64,0x46,0x48,0x48,0x46,0x64,0x46,0x48,0x74,0x28,0x38,0x2a,0x2a,0x38,0x28,0x44,0x1c,0x2a,0x2a,0x38,0x28,0x28,0xa2,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x01,0x7a,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,\r\n0x22,0x6e,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x46,0x28,0x3a,0x28,0x28,0x3a,0x28,0x00,0x03,0xff,0xff,0xff,0x6a,0x04,0x78,0x03,0x52,0x00,0x03,0x00,0x0c,0x00,0x26,0x00,0x38,0x40,0x35,0x00,0x08,0x00,0x03,0x04,0x08,0x03,0x67,0x07,0x01,0x04,0x00,0x01,0x02,0x04,0x01,0x67,0x00,0x02,0x00,0x05,0x00,0x02,0x05,0x67,0x00,0x00,0x06,\r\n0x06,0x00,0x57,0x00,0x00,0x00,0x06,0x60,0x00,0x06,0x00,0x06,0x50,0x33,0x25,0x33,0x26,0x21,0x11,0x11,0x11,0x10,0x09,0x07,0x1f,0x2b,0x17,0x21,0x11,0x29,0x02,0x11,0x21,0x15,0x33,0x32,0x16,0x15,0x01,0x11,0x14,0x06,0x23,0x21,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x33,0x21,0x35,0x34,0x36,0x33,0x21,0x32,0x16,\r\n0x8f,0x01,0xac,0xfe,0x54,0x02,0x3b,0x01,0x1e,0xfe,0x53,0x36,0x25,0x34,0x01,0xad,0x34,0x25,0xfe,0xac,0x34,0x25,0xfd,0xe8,0x24,0x36,0x01,0x34,0x25,0x01,0x54,0x34,0x25,0x02,0x18,0x24,0x36,0x07,0x01,0x1e,0x01,0xac,0x8f,0x34,0x25,0x01,0x1e,0xfd,0xe8,0x25,0x34,0xc5,0x25,0x34,0x34,0x25,0x02,0x18,0x25,0x34,0xc5,0x25,0x34,0x34,\r\n0x00,0x01,0xff,0xff,0xff,0xb1,0x03,0xe8,0x00,0xcf,0x00,0x0f,0x00,0x13,0x40,0x10,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x11,0x00,0x4e,0x35,0x33,0x02,0x07,0x18,0x2b,0x25,0x15,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0xe8,0x34,0x25,0xfc,0xca,0x24,0x36,0x01,0x34,0x25,0x03,0x36,0x25,0x34,\r\n0x76,0x6b,0x25,0x34,0x01,0x36,0x24,0x6b,0x25,0x34,0x34,0x00,0x00,0x03,0x00,0x00,0xff,0x6a,0x03,0xa1,0x03,0x0b,0x00,0x03,0x00,0x07,0x00,0x1f,0x00,0x1f,0x40,0x1c,0x07,0x06,0x05,0x03,0x02,0x01,0x00,0x07,0x00,0x01,0x01,0x4c,0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x13,0x00,0x4e,0x1b,0x1e,0x02,0x07,0x18,0x2b,0x05,0x25,0x11,\r\n0x05,0x27,0x2d,0x01,0x0d,0x01,0x11,0x14,0x06,0x07,0x05,0x06,0x22,0x27,0x25,0x2e,0x01,0x35,0x11,0x34,0x36,0x37,0x25,0x36,0x32,0x17,0x05,0x1e,0x01,0x01,0xf4,0x01,0x65,0xfe,0x9b,0x24,0x01,0x86,0xfe,0x7a,0xfe,0x7b,0x03,0x56,0x14,0x12,0xfe,0x77,0x0f,0x26,0x0f,0xfe,0x77,0x11,0x14,0x1a,0x15,0x01,0x89,0x0c,0x18,0x0d,0x01,0x89,\r\n0x15,0x1a,0x3b,0xc3,0x01,0x63,0x82,0x3f,0x8d,0x8e,0x8e,0x01,0xfe,0x54,0x14,0x22,0x09,0xd6,0x09,0x09,0xd6,0x0a,0x20,0x15,0x01,0xac,0x17,0x24,0x08,0x8f,0x05,0x05,0x8f,0x08,0x24,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x44,0x02,0x80,0x00,0x13,0x00,0x31,0x40,0x2e,0x00,0x05,0x00,0x02,0x05,0x59,0x04,0x06,0x02,0x00,0x03,0x01,\r\n0x01,0x02,0x00,0x01,0x67,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x05,0x02,0x51,0x01,0x00,0x11,0x10,0x0e,0x0c,0x0b,0x09,0x07,0x06,0x04,0x02,0x00,0x13,0x01,0x13,0x07,0x07,0x16,0x2b,0x01,0x32,0x14,0x2b,0x01,0x15,0x14,0x22,0x3d,0x01,0x23,0x22,0x34,0x3b,0x01,0x35,0x34,0x32,0x1d,0x01,0x02,0x26,0x1e,0x1e,0xd2,0x64,0xd2,0x1e,0x1e,\r\n0xd2,0x64,0x01,0x90,0x64,0xd2,0x1e,0x1e,0xd2,0x64,0xd2,0x1e,0x1e,0xd2,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x44,0x01,0x90,0x00,0x07,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x01,0x00,0x05,0x02,0x00,0x07,0x01,0x06,0x03,0x07,0x16,0x2b,0x01,0x32,\r\n0x14,0x23,0x21,0x22,0x34,0x33,0x02,0x26,0x1e,0x1e,0xfd,0xf8,0x1e,0x1e,0x01,0x90,0x64,0x64,0x00,0x00,0x00,0x01,0xff,0xfd,0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x0c,0x00,0x13,0x40,0x10,0x00,0x01,0x01,0x13,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x15,0x13,0x02,0x07,0x18,0x2b,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,\r\n0x01,0x03,0x59,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xf4,0xba,0x7e,0x01,0x5e,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x3c,0x01,0xed,0x00,0x0e,0x00,0x1e,0x40,0x1b,0x00,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,\r\n0x00,0x51,0x35,0x14,0x02,0x07,0x18,0x2b,0x01,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x26,0x34,0x36,0x33,0x21,0x32,0x16,0x02,0x3b,0x0a,0xfa,0x0b,0x1c,0x0b,0xfa,0x0b,0x16,0x0e,0x01,0xf4,0x0e,0x16,0x01,0xc9,0x0e,0x0b,0xfa,0x0b,0x0b,0xfa,0x0b,0x1c,0x16,0x16,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0xa0,0x03,0x0b,0x00,0x2d,\r\n0x00,0x42,0x00,0x48,0x40,0x45,0x3b,0x01,0x04,0x06,0x25,0x01,0x05,0x04,0x02,0x4c,0x00,0x07,0x01,0x02,0x01,0x07,0x02,0x80,0x00,0x06,0x02,0x04,0x02,0x06,0x04,0x80,0x00,0x04,0x05,0x02,0x04,0x05,0x7e,0x00,0x05,0x03,0x02,0x05,0x03,0x7e,0x00,0x03,0x00,0x00,0x03,0x00,0x64,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x13,0x02,0x4e,\r\n0x14,0x17,0x15,0x27,0x35,0x39,0x35,0x33,0x08,0x07,0x1e,0x2b,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x17,0x1e,0x01,0x0f,0x01,0x06,0x23,0x27,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x3d,0x01,0x34,0x3f,0x01,0x36,0x33,0x32,0x17,0x16,0x13,0x01,0x06,0x22,0x2f,0x01,\r\n0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x01,0x36,0x32,0x1f,0x01,0x16,0x14,0x03,0x12,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x23,0x1e,0x09,0x03,0x07,0x1b,0x06,0x07,0x05,0x0d,0x0c,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x05,0x24,0x06,0x07,0x03,0x04,0x0b,0x81,0xfe,0x39,0x0d,0x24,0x0e,0xf0,0x0e,\r\n0x0e,0x3d,0x0e,0x24,0x0e,0x93,0x01,0x69,0x0d,0x24,0x0e,0x3e,0x0d,0x01,0x4b,0xb1,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x5e,0x01,0x0e,0x04,0x13,0x06,0x1c,0x05,0x01,0x03,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x8d,0x08,0x05,0x23,0x06,0x02,0x04,0x01,0x05,0xfe,0x3a,0x0e,0x0e,0xf0,0x0d,0x24,0x0e,0x3e,0x0d,0x0d,0x93,0x01,\r\n0x69,0x0d,0x0d,0x3d,0x0e,0x24,0x00,0x00,0x00,0x06,0x00,0x00,0xff,0xb1,0x03,0x12,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3b,0x00,0x43,0x00,0x67,0x00,0x5d,0x40,0x5a,0x57,0x45,0x02,0x06,0x08,0x29,0x21,0x19,0x11,0x09,0x01,0x06,0x00,0x01,0x02,0x4c,0x00,0x09,0x0e,0x08,0x0e,0x09,0x08,0x80,0x0f,0x0d,0x02,0x08,0x0c,0x0a,\r\n0x02,0x06,0x01,0x08,0x06,0x68,0x05,0x03,0x02,0x01,0x04,0x02,0x02,0x00,0x07,0x01,0x00,0x69,0x00,0x0e,0x0e,0x13,0x4d,0x00,0x07,0x07,0x0b,0x5f,0x00,0x0b,0x0b,0x11,0x0b,0x4e,0x65,0x64,0x61,0x5e,0x5b,0x59,0x53,0x52,0x4f,0x4c,0x49,0x47,0x41,0x3f,0x14,0x24,0x14,0x26,0x26,0x26,0x26,0x26,0x23,0x10,0x07,0x1f,0x2b,0x01,0x11,0x14,\r\n0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x13,0x11,0x21,0x11,0x14,0x1e,0x01,0x33,0x21,0x32,0x3e,0x01,0x01,0x33,0x27,0x26,0x27,0x23,0x06,\r\n0x07,0x05,0x15,0x14,0x06,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x37,0x3e,0x01,0x37,0x33,0x32,0x16,0x1f,0x01,0x33,0x32,0x16,0x01,0x1e,0x0a,0x08,0x24,0x08,0x0a,0x0a,0x08,0x24,0x08,0x0a,0x8f,0x0a,0x08,0x24,0x08,0x0a,0x0a,0x08,0x24,0x08,0x0a,0x8e,0x0a,0x07,0x24,\r\n0x08,0x0a,0x0a,0x08,0x24,0x07,0x0a,0x48,0xfe,0x0c,0x08,0x08,0x02,0x01,0xd0,0x02,0x08,0x08,0xfe,0x89,0xfa,0x1b,0x04,0x05,0xb1,0x06,0x04,0x01,0xeb,0x0a,0x08,0x36,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x35,0x08,0x0a,0x0a,0x08,0xac,0x27,0x09,0x2c,0x16,0xb2,0x17,0x2a,0x09,0x27,0xad,0x08,0x0a,0x01,0xb7,0xfe,0xbf,0x08,0x0a,0x0a,\r\n0x08,0x01,0x41,0x08,0x0a,0x0a,0x08,0xfe,0xbf,0x08,0x0a,0x0a,0x08,0x01,0x41,0x08,0x0a,0x0a,0x08,0xfe,0xbf,0x08,0x0a,0x0a,0x08,0x01,0x41,0x08,0x0a,0x0a,0xfe,0x64,0x02,0x11,0xfd,0xef,0x0c,0x14,0x0a,0x0a,0x14,0x02,0x65,0x41,0x05,0x01,0x01,0x05,0x53,0x24,0x08,0x0a,0xfd,0xef,0x2e,0x44,0x42,0x2e,0x02,0x13,0x0a,0x08,0x24,0x08,\r\n0x0a,0x5d,0x15,0x1c,0x01,0x1e,0x14,0x5d,0x0a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0x9c,0x03,0xac,0x03,0x20,0x00,0x2a,0x00,0x34,0x40,0x09,0x20,0x1e,0x16,0x12,0x04,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x00,0x01,0x01,0x10,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x1b,0x40,0x0b,0x00,0x00,0x00,0x01,0x61,0x00,\r\n0x01,0x01,0x10,0x00,0x4e,0x59,0xb5,0x1b,0x1a,0x13,0x02,0x07,0x17,0x2b,0x25,0x16,0x1d,0x01,0x21,0x35,0x34,0x37,0x3e,0x01,0x35,0x34,0x26,0x27,0x2e,0x03,0x27,0x34,0x36,0x3f,0x01,0x26,0x27,0x26,0x36,0x32,0x16,0x0f,0x01,0x16,0x15,0x0e,0x03,0x07,0x0e,0x01,0x15,0x14,0x16,0x02,0xe0,0xcc,0xfc,0x54,0xcc,0x5e,0x44,0x2c,0x0a,0x02,\r\n0x0e,0x0e,0x0e,0x02,0x0a,0x04,0x04,0x08,0x04,0x04,0x5a,0xe0,0x5c,0x06,0x0c,0x12,0x02,0x0e,0x0e,0x0e,0x02,0x08,0x2e,0x46,0x80,0x48,0x32,0x6a,0x6a,0x32,0x48,0x22,0x46,0x3c,0x16,0x36,0x2e,0x0c,0x0c,0x04,0x1e,0x1c,0x10,0x14,0x02,0x04,0x32,0x26,0x36,0x74,0x74,0x36,0x58,0x08,0x22,0x1c,0x1e,0x04,0x0c,0x0c,0x30,0x34,0x16,0x3c,\r\n0x46,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xb6,0x03,0xe8,0x03,0x08,0x00,0x18,0x00,0x20,0x00,0x2d,0x00,0x94,0xb5,0x25,0x01,0x09,0x0b,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x30,0x0d,0x01,0x0b,0x08,0x09,0x08,0x0b,0x72,0x0c,0x01,0x05,0x00,0x01,0x05,0x57,0x06,0x03,0x02,0x01,0x04,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x07,\r\n0x07,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x0a,0x01,0x08,0x08,0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x1b,0x40,0x31,0x0d,0x01,0x0b,0x08,0x09,0x08,0x0b,0x09,0x80,0x0c,0x01,0x05,0x00,0x01,0x05,0x57,0x06,0x03,0x02,0x01,0x04,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x07,0x07,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x0a,0x01,0x08,0x08,\r\n0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x59,0x40,0x1e,0x21,0x21,0x00,0x00,0x21,0x2d,0x21,0x2d,0x2c,0x2b,0x29,0x26,0x23,0x22,0x20,0x1d,0x1b,0x1a,0x00,0x18,0x00,0x18,0x12,0x24,0x35,0x22,0x11,0x0e,0x07,0x1b,0x2b,0x01,0x15,0x21,0x13,0x36,0x3b,0x01,0x36,0x3f,0x01,0x3e,0x01,0x3b,0x01,0x32,0x16,0x17,0x16,0x17,0x33,0x32,0x17,\r\n0x13,0x21,0x35,0x03,0x07,0x21,0x27,0x26,0x2b,0x01,0x22,0x13,0x35,0x21,0x06,0x07,0x06,0x23,0x21,0x22,0x35,0x27,0x21,0x15,0x01,0xc8,0xfe,0x38,0x0a,0x04,0x60,0xa0,0x10,0x15,0x17,0x0e,0x12,0x1c,0xde,0x1a,0x14,0x0c,0x12,0x2a,0xa0,0x60,0x04,0x0a,0xfe,0x3a,0xa4,0x1c,0x01,0x24,0x1c,0x0e,0x1c,0x98,0x1c,0x96,0x01,0xae,0x06,0x04,\r\n0x06,0x54,0xfd,0x12,0x5a,0x0a,0x01,0xae,0x01,0x46,0x64,0x01,0x24,0x6c,0x1a,0x29,0x2d,0x1a,0x0c,0x0e,0x18,0x20,0x50,0x6c,0xfe,0xdc,0x64,0x01,0x62,0x36,0x36,0x1a,0xfd,0x8a,0x64,0x58,0x4e,0x54,0x54,0xa6,0x64,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xdc,0x01,0xcc,0x00,0x08,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,\r\n0x01,0x00,0x59,0x02,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x01,0x00,0x05,0x04,0x00,0x08,0x01,0x08,0x03,0x07,0x16,0x2b,0x13,0x32,0x16,0x14,0x06,0x22,0x26,0x34,0x36,0x6e,0x2e,0x40,0x40,0x5c,0x40,0x40,0x01,0xcc,0x40,0x5a,0x42,0x42,0x5a,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x67,0x02,0x7c,0x00,0x0d,\r\n0x00,0x1e,0x40,0x1b,0x00,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x17,0x13,0x02,0x07,0x18,0x2b,0x01,0x11,0x14,0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x16,0x01,0x65,0x14,0x20,0x09,0xfa,0x0a,0x0a,0xfa,0x0b,0x1c,0x18,0x02,0x58,0xfe,0x0c,0x0e,0x16,\r\n0x0b,0xfa,0x0b,0x1c,0x0b,0xfa,0x0b,0x16,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x41,0x02,0x7d,0x00,0x0e,0x00,0x0a,0xb7,0x00,0x00,0x00,0x76,0x14,0x01,0x07,0x17,0x2b,0x01,0x14,0x0f,0x01,0x06,0x22,0x26,0x35,0x11,0x34,0x3e,0x01,0x1f,0x01,0x16,0x01,0x41,0x0a,0xfa,0x0b,0x1c,0x16,0x16,0x1c,0x0b,0xfa,0x0a,0x01,0x5e,0x0e,0x0b,0xfa,\r\n0x0b,0x16,0x0e,0x01,0xf4,0x0f,0x14,0x02,0x0c,0xfa,0x0a,0x00,0x00,0x01,0xff,0xff,0x00,0x00,0x02,0x3b,0x01,0xc9,0x00,0x0e,0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x15,0x32,0x02,0x07,0x18,0x2b,0x25,0x14,0x06,0x27,0x21,0x22,0x2e,0x01,0x3f,0x01,0x36,0x32,0x1f,0x01,\r\n0x16,0x02,0x3b,0x14,0x0f,0xfe,0x0c,0x0f,0x14,0x02,0x0c,0xfa,0x0a,0x1e,0x0a,0xfa,0x0a,0xab,0x0e,0x16,0x01,0x14,0x1e,0x0b,0xfa,0x0a,0x0a,0xfa,0x0b,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x5e,0x02,0x51,0x00,0x15,0x00,0x1e,0x40,0x1b,0x03,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,\r\n0x61,0x00,0x00,0x01,0x00,0x51,0x17,0x19,0x02,0x07,0x18,0x2b,0x01,0x14,0x0f,0x01,0x17,0x16,0x14,0x0f,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x37,0x01,0x36,0x32,0x1f,0x01,0x16,0x01,0x5e,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x0e,0x06,0xfe,0xfc,0x06,0x06,0x01,0x04,0x05,0x10,0x04,0x1c,0x06,0x02,0x22,0x07,0x05,0xdc,0xdb,0x06,0x0e,\r\n0x06,0x1c,0x05,0x05,0x01,0x05,0x05,0x0e,0x06,0x01,0x04,0x06,0x06,0x1c,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x4c,0x02,0x51,0x00,0x15,0x00,0x1e,0x40,0x1b,0x0b,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1c,0x14,0x02,0x07,0x18,0x2b,0x01,0x14,0x07,0x01,\r\n0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x27,0x26,0x34,0x3f,0x01,0x36,0x32,0x17,0x01,0x16,0x01,0x4c,0x05,0xfe,0xfb,0x05,0x0e,0x06,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x10,0x04,0x01,0x05,0x05,0x01,0x3a,0x07,0x05,0xfe,0xfb,0x05,0x05,0x1c,0x06,0x0e,0x06,0xdb,0xdc,0x05,0x0e,0x06,0x1c,0x06,0x06,0xfe,0xfc,0x05,0x00,\r\n0x00,0x03,0xff,0xfc,0xff,0x90,0x03,0x9a,0x03,0x2c,0x00,0x08,0x00,0x16,0x00,0x3f,0x00,0x83,0x40,0x0b,0x38,0x36,0x02,0x03,0x05,0x13,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x24,0x50,0x58,0x40,0x24,0x00,0x05,0x06,0x03,0x06,0x05,0x03,0x80,0x00,0x06,0x00,0x03,0x02,0x06,0x03,0x69,0x08,0x01,0x02,0x00,0x01,0x02,0x01,0x66,0x00,0x04,\r\n0x04,0x00,0x61,0x07,0x01,0x00,0x00,0x12,0x04,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x06,0x03,0x06,0x05,0x03,0x80,0x07,0x01,0x00,0x00,0x04,0x06,0x00,0x04,0x69,0x00,0x06,0x00,0x03,0x02,0x06,0x03,0x69,0x08,0x01,0x02,0x01,0x01,0x02,0x59,0x08,0x01,0x02,0x02,0x01,0x62,0x00,0x01,0x02,0x01,0x52,0x59,0x40,0x19,0x0a,0x09,0x01,0x00,0x27,\r\n0x26,0x22,0x20,0x1d,0x1b,0x11,0x0e,0x09,0x16,0x0a,0x16,0x05,0x04,0x00,0x08,0x01,0x08,0x09,0x07,0x16,0x2b,0x01,0x36,0x00,0x12,0x00,0x04,0x00,0x02,0x00,0x13,0x32,0x36,0x35,0x36,0x26,0x2b,0x01,0x22,0x06,0x07,0x14,0x16,0x17,0x13,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x07,0x15,0x33,0x35,0x34,0x37,0x36,0x32,0x17,0x16,0x15,\r\n0x14,0x07,0x06,0x0f,0x01,0x06,0x0f,0x01,0x06,0x07,0x06,0x07,0x15,0x33,0x35,0x34,0x37,0x36,0x3f,0x01,0x36,0x01,0xc6,0xbe,0x01,0x10,0x06,0xfe,0xf6,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0c,0xbc,0x1e,0x26,0x02,0x26,0x1e,0x02,0x1c,0x26,0x02,0x26,0x1c,0xa8,0x1a,0x6a,0x52,0x40,0x28,0x44,0x04,0x6e,0x10,0x10,0x4e,0x0c,0x10,0x10,0x08,\r\n0x0c,0x16,0x0a,0x0a,0x15,0x0b,0x06,0x0e,0x04,0x6c,0x04,0x06,0x16,0x1c,0x2e,0x03,0x2a,0x02,0xfe,0xf8,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0a,0x01,0x7c,0x01,0x12,0xfd,0x1e,0x26,0x1c,0x1e,0x26,0x24,0x1c,0x1e,0x26,0x02,0x01,0x48,0x22,0x2c,0x4e,0x4c,0x1a,0x2a,0x68,0x04,0x04,0x1a,0x1c,0x18,0x14,0x14,0x18,0x12,0x16,0x0c,0x08,0x0f,\r\n0x07,0x08,0x11,0x09,0x08,0x14,0x3a,0x08,0x04,0x0c,0x10,0x14,0x10,0x12,0x22,0x00,0x00,0x02,0x00,0x00,0xff,0xbd,0x03,0x4d,0x03,0x0b,0x00,0x08,0x00,0x1d,0x00,0x3a,0xb5,0x00,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x29,0x50,0x58,0x40,0x10,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x13,0x4d,0x00,0x01,0x01,0x11,0x01,0x4e,0x1b,0x40,\r\n0x10,0x00,0x01,0x00,0x01,0x86,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x13,0x00,0x4e,0x59,0xb5,0x38,0x1a,0x12,0x03,0x07,0x19,0x2b,0x13,0x34,0x26,0x0e,0x01,0x1e,0x02,0x36,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x2e,0x01,0x3d,0x01,0x34,0x36,0x37,0x33,0x32,0x16,0x17,0x01,0x16,0xfa,0x2a,0x3a,0x2c,0x02,0x28,0x3e,0x26,0x02,\r\n0x55,0x14,0xfe,0xee,0x16,0x3b,0x14,0xfe,0x71,0x15,0x1e,0x2a,0x1d,0xe9,0x1d,0x48,0x15,0x01,0x8f,0x14,0x02,0x58,0x1e,0x2a,0x02,0x26,0x40,0x24,0x06,0x30,0xfe,0xd9,0x1e,0x15,0xfe,0xee,0x15,0x15,0x01,0x8f,0x15,0x48,0x1d,0xe8,0x1d,0x2a,0x01,0x1e,0x15,0xfe,0x71,0x15,0x00,0x0d,0x00,0x00,0xff,0xea,0x03,0xca,0x02,0xd2,0x00,0x03,\r\n0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0xa9,0x40,0xa6,0x18,0x12,0x0c,0x03,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x20,0x19,0x13,0x1d,0x0d,0x05,0x07,0x03,0x00,0x07,0x03,0x7e,0x17,0x11,0x0b,0x03,0x05,0x02,0x04,0x02,0x05,0x04,0x80,0x16,0x10,\r\n0x0a,0x03,0x04,0x01,0x02,0x04,0x01,0x7e,0x00,0x00,0x14,0x1e,0x0f,0x08,0x1b,0x05,0x03,0x02,0x00,0x03,0x67,0x1f,0x15,0x0e,0x1c,0x09,0x05,0x02,0x05,0x01,0x02,0x58,0x1f,0x15,0x0e,0x1c,0x09,0x05,0x02,0x02,0x01,0x5f,0x1a,0x01,0x01,0x02,0x01,0x4f,0x30,0x30,0x28,0x28,0x1c,0x1c,0x18,0x18,0x10,0x10,0x04,0x04,0x00,0x00,0x30,0x33,\r\n0x30,0x33,0x32,0x31,0x2f,0x2e,0x2d,0x2c,0x28,0x2b,0x28,0x2b,0x2a,0x29,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x17,0x16,0x15,0x14,0x10,0x13,0x10,0x13,0x12,0x11,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x21,\r\n0x07,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x13,0x23,0x15,0x33,0x17,0x35,0x23,0x1d,0x01,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x05,0x15,0x33,0x35,0x03,0x33,0x35,0x23,0x13,0x23,0x15,0x33,0x17,0x35,0x23,0x1d,0x01,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x03,0xca,0xfe,0x3d,0x9f,0x9f,0x9f,0x9f,0x9f,\r\n0x9f,0x9f,0xe1,0x9e,0x9e,0x9e,0x9e,0x9e,0xfd,0x5b,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0x9e,0xe1,0x9d,0x9d,0x9d,0x9d,0x9d,0x16,0x02,0xe8,0xfd,0x18,0x01,0xc4,0x9f,0x9f,0xfe,0x80,0x9d,0x01,0xc4,0x9e,0xe2,0x9f,0x9f,0xe1,0x9d,0x01,0x26,0x9e,0x9e,0x43,0x9f,0x9f,0xfe,0x80,0x9d,0x01,0xc4,0x9e,0xe2,0x9f,0x9f,0xe1,0x9d,0x01,0x26,0x9e,\r\n0x9e,0x00,0x00,0x00,0x00,0x02,0xff,0xff,0xff,0xf9,0x04,0x19,0x03,0x0b,0x00,0x12,0x00,0x29,0x00,0x20,0x40,0x1d,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x00,0x63,0x00,0x03,0x03,0x13,0x03,0x4e,0x23,0x3a,0x23,0x36,0x35,0x05,0x07,0x1b,0x2b,0x01,0x14,0x0f,0x01,0x0e,0x01,0x23,0x21,0x22,0x2e,0x01,0x3f,\r\n0x01,0x3e,0x01,0x33,0x21,0x32,0x16,0x27,0x15,0x21,0x22,0x06,0x0f,0x02,0x27,0x26,0x37,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x04,0x19,0x12,0xbb,0x18,0x56,0x26,0xfd,0xa1,0x13,0x1c,0x01,0x11,0xbc,0x18,0x56,0x25,0x02,0x5f,0x13,0x1e,0xc0,0xfe,0x30,0x35,0x72,0x23,0xbc,0x02,0x01,0x01,0x01,0x4a,0x33,0xb3,\r\n0x33,0x4a,0x01,0x2f,0x34,0x48,0x01,0x3f,0x11,0x14,0xdd,0x1c,0x28,0x0e,0x22,0x14,0xdd,0x1c,0x28,0x0e,0xaf,0x5a,0x34,0x29,0xdd,0x03,0x07,0x05,0x02,0x02,0x18,0x33,0x4a,0x4a,0x33,0x12,0x4a,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf9,0x03,0xa1,0x03,0x0b,0x00,0x14,0x00,0x16,0x40,0x13,0x00,0x02,0x00,0x00,0x02,0x00,0x64,0x00,\r\n0x01,0x01,0x13,0x01,0x4e,0x23,0x35,0x33,0x03,0x07,0x19,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x03,0xa1,0x4a,0x33,0xfd,0x59,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x77,0x33,0x4a,0x01,0xff,0xfe,0x77,0x33,0x4a,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33,\r\n0x12,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf2,0x02,0xf8,0x02,0xcc,0x00,0x06,0x00,0x1d,0x40,0x1a,0x01,0x01,0x00,0x49,0x00,0x01,0x00,0x01,0x85,0x03,0x02,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x12,0x04,0x07,0x18,0x2b,0x09,0x02,0x33,0x11,0x21,0x11,0x02,0xf8,0xfe,0x84,0xfe,0x84,0xc0,0x01,0x78,0x01,0x6e,\r\n0xfe,0x84,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0x00,0x02,0xff,0xf7,0xff,0xe2,0x03,0xdb,0x03,0x12,0x00,0x17,0x00,0x20,0x00,0x26,0x40,0x23,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x19,0x18,0x1d,0x1c,0x18,0x20,0x19,0x20,0x2f,0x04,0x07,0x17,0x2b,0x01,0x1e,\r\n0x01,0x06,0x07,0x06,0x26,0x06,0x07,0x06,0x1e,0x01,0x07,0x0e,0x02,0x23,0x22,0x26,0x37,0x3e,0x01,0x37,0x24,0x03,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x03,0x59,0x48,0x3a,0x12,0x1a,0x10,0x4c,0x54,0x26,0x1e,0x12,0x32,0x02,0x02,0x44,0xb8,0x7c,0xba,0xd2,0x0a,0x08,0xc0,0x78,0x01,0x22,0x48,0x1e,0x2c,0x2c,0x3e,0x2c,0x2c,0x02,\r\n0x6e,0x30,0x7c,0x54,0x06,0x04,0x1c,0x08,0x2a,0x2e,0x3a,0x48,0x0e,0x1a,0x4a,0x4a,0xca,0x90,0x76,0xea,0x22,0x54,0xfd,0x8a,0x2c,0x40,0x2a,0x2a,0x40,0x2c,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x6a,0x03,0x59,0x03,0x52,0x00,0x06,0x00,0x18,0x00,0x33,0x40,0x30,0x01,0x01,0x00,0x03,0x01,0x4c,0x00,0x03,0x00,0x03,0x85,0x04,0x01,0x00,\r\n0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x18,0x16,0x11,0x0e,0x0b,0x09,0x00,0x06,0x00,0x06,0x05,0x07,0x16,0x2b,0x01,0x11,0x16,0x1f,0x01,0x16,0x17,0x05,0x14,0x16,0x17,0x21,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x21,0x02,0x3b,0x0d,0x08,\r\n0xe3,0x08,0x08,0xfe,0xb1,0x20,0x16,0x01,0x2f,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x01,0xbe,0x02,0x34,0x01,0x08,0x08,0x08,0xe4,0x07,0x0d,0x12,0x16,0x1e,0x01,0xfd,0xb3,0x17,0x1e,0x01,0x20,0x16,0x03,0x7c,0x17,0x1e,0x01,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x08,0x00,0x6a,0x00,0x45,\r\n0x40,0x42,0x65,0x59,0x4c,0x41,0x04,0x00,0x04,0x3b,0x0a,0x02,0x01,0x00,0x34,0x28,0x1b,0x10,0x04,0x03,0x01,0x03,0x4c,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x69,0x00,0x00,0x00,0x05,0x5f,0x00,0x05,0x05,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x5c,0x5b,0x53,0x51,0x49,0x48,0x2b,0x2a,0x22,0x20,0x13,\r\n0x12,0x07,0x07,0x18,0x2b,0x01,0x34,0x26,0x22,0x0e,0x01,0x16,0x32,0x36,0x25,0x15,0x14,0x06,0x0f,0x01,0x06,0x07,0x16,0x17,0x16,0x14,0x07,0x0e,0x01,0x27,0x22,0x2f,0x01,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x26,0x35,0x27,0x26,0x27,0x07,0x06,0x22,0x27,0x26,0x27,0x26,0x34,0x37,0x3e,0x01,0x37,0x26,0x2f,0x01,0x2e,0x01,0x27,\r\n0x35,0x34,0x36,0x3f,0x01,0x36,0x37,0x26,0x27,0x26,0x34,0x37,0x3e,0x01,0x33,0x32,0x1f,0x01,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x16,0x1f,0x01,0x16,0x17,0x37,0x36,0x32,0x17,0x16,0x17,0x16,0x14,0x07,0x0e,0x01,0x07,0x16,0x1f,0x01,0x1e,0x01,0x02,0x3b,0x52,0x78,0x52,0x02,0x56,0x74,0x56,0x01,0x1c,0x08,0x07,0x68,0x0a,0x0b,\r\n0x13,0x28,0x06,0x05,0x0f,0x50,0x0d,0x07,0x07,0x4d,0x19,0x1a,0x09,0x07,0x04,0x10,0x7c,0x08,0x0c,0x10,0x1b,0x17,0x4f,0x06,0x10,0x06,0x46,0x16,0x04,0x05,0x08,0x28,0x0a,0x0f,0x08,0x66,0x07,0x08,0x01,0x0a,0x05,0x68,0x08,0x0e,0x17,0x25,0x06,0x05,0x0f,0x50,0x0d,0x07,0x08,0x4d,0x18,0x1a,0x09,0x08,0x03,0x11,0x7c,0x07,0x0c,0x01,\r\n0x0f,0x1c,0x17,0x4f,0x05,0x0f,0x07,0x48,0x14,0x04,0x04,0x09,0x28,0x0a,0x0f,0x08,0x66,0x07,0x0a,0x01,0x5e,0x3b,0x54,0x54,0x76,0x54,0x54,0x78,0x7c,0x07,0x0c,0x01,0x10,0x1e,0x15,0x1b,0x32,0x06,0x0e,0x06,0x15,0x50,0x01,0x05,0x3c,0x0d,0x08,0x4c,0x1c,0x10,0x0a,0x07,0x67,0x09,0x0c,0x3c,0x05,0x06,0x40,0x1e,0x05,0x0e,0x06,0x0c,\r\n0x32,0x0f,0x1c,0x1b,0x0f,0x01,0x0c,0x07,0x7c,0x07,0x0c,0x01,0x10,0x19,0x1a,0x20,0x2d,0x07,0x0c,0x07,0x14,0x50,0x05,0x3c,0x0d,0x08,0x4c,0x1c,0x10,0x0a,0x07,0x67,0x09,0x0b,0x3b,0x05,0x05,0x43,0x1c,0x05,0x0e,0x06,0x0c,0x32,0x0f,0x1c,0x1a,0x10,0x01,0x0c,0x00,0x00,0x00,0x09,0x00,0x00,0xff,0xf9,0x03,0xe8,0x03,0x0b,0x00,0x0f,\r\n0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x5f,0x00,0x6f,0x00,0x7f,0x00,0x8f,0x00,0x47,0x40,0x44,0x0f,0x09,0x02,0x03,0x0e,0x08,0x02,0x02,0x01,0x03,0x02,0x67,0x0b,0x05,0x02,0x01,0x0a,0x04,0x02,0x00,0x01,0x00,0x63,0x10,0x0c,0x02,0x06,0x06,0x07,0x5f,0x11,0x0d,0x02,0x07,0x07,0x13,0x06,0x4e,0x8e,0x8b,0x86,0x83,0x7e,0x7b,\r\n0x76,0x73,0x6e,0x6b,0x66,0x63,0x5e,0x5b,0x56,0x53,0x4e,0x4b,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x35,0x33,0x12,0x07,0x1f,0x2b,0x25,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x13,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x07,0x23,0x22,\r\n0x26,0x27,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x27,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x17,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,\r\n0x26,0x27,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x37,0x33,0x32,0x16,0x13,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x1e,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,\r\n0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0xfe,0x9c,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0xfe,0x9c,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,\r\n0x17,0x1e,0x01,0x66,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0x01,0x20,0x16,0xb2,0x16,0x20,0x20,0x16,0xb2,0x17,0x1e,0x9a,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x01,0x06,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0xfe,0xcd,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x02,\r\n0x24,0x6b,0x16,0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0xfe,0xcc,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0xfe,0xcd,0x6c,0x16,0x1e,0x01,0x20,0x15,0x6c,0x16,0x20,0x01,0x1e,0x02,0x24,0x6b,0x16,0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0xfe,0xcc,0x6b,0x16,0x20,0x01,0x1e,0x17,0x6b,0x17,0x1e,0x01,0x20,0x01,0x08,0x6b,0x16,\r\n0x20,0x20,0x16,0x6b,0x16,0x20,0x20,0x00,0x00,0x05,0x00,0x00,0xff,0x6a,0x03,0xe8,0x03,0x52,0x00,0x10,0x00,0x14,0x00,0x25,0x00,0x2f,0x00,0x39,0x00,0x65,0x40,0x62,0x33,0x29,0x02,0x07,0x08,0x21,0x01,0x05,0x02,0x1d,0x15,0x0d,0x0c,0x04,0x00,0x05,0x03,0x4c,0x04,0x01,0x05,0x01,0x4b,0x0a,0x01,0x08,0x09,0x01,0x07,0x01,0x08,0x07,\r\n0x67,0x00,0x02,0x05,0x01,0x02,0x57,0x06,0x0c,0x03,0x0b,0x04,0x01,0x00,0x05,0x00,0x01,0x05,0x69,0x06,0x0c,0x03,0x0b,0x04,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x00,0x00,0x37,0x35,0x32,0x31,0x2d,0x2b,0x28,0x27,0x24,0x22,0x1f,0x1e,0x1b,0x19,0x11,0x14,0x11,0x14,0x13,0x12,0x00,0x10,0x00,0x0f,0x37,0x0d,\r\n0x07,0x17,0x2b,0x01,0x11,0x14,0x06,0x07,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x13,0x36,0x33,0x21,0x11,0x23,0x11,0x01,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x22,0x26,0x27,0x11,0x33,0x32,0x17,0x25,0x15,0x23,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x05,0x15,0x23,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x89,0x16,\r\n0x0e,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x8b,0x04,0x0d,0x01,0x9f,0x8e,0x02,0x3b,0x16,0x0e,0xfe,0xe3,0x0f,0x14,0x01,0x0f,0x14,0x01,0xed,0x0d,0x04,0xfe,0x3e,0xc5,0x0a,0x08,0xa1,0x08,0x0a,0x01,0x77,0xc5,0x0a,0x08,0xa1,0x08,0x0a,0x02,0x9f,0xfe,0x54,0x0f,0x14,0x01,0xfe,0xbf,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x01,0xe8,0x0c,\r\n0xfe,0x78,0x01,0x88,0xfe,0x0c,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x41,0x16,0x0e,0x01,0xac,0x0c,0xad,0x7d,0x7d,0x08,0x0a,0x0a,0x08,0x7d,0x7d,0x08,0x0a,0x0a,0x00,0x08,0xff,0xff,0xff,0xf8,0x03,0xe9,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x5f,0x00,0x6f,0x00,0x7f,0x00,0x6f,0x40,0x6c,0x79,0x78,\r\n0x71,0x49,0x48,0x41,0x06,0x08,0x09,0x69,0x61,0x60,0x29,0x21,0x20,0x06,0x04,0x05,0x59,0x58,0x51,0x50,0x19,0x18,0x11,0x10,0x08,0x02,0x03,0x39,0x38,0x31,0x09,0x08,0x01,0x06,0x00,0x01,0x04,0x4c,0x0d,0x01,0x05,0x0c,0x01,0x04,0x03,0x05,0x04,0x67,0x0b,0x01,0x03,0x0a,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,0x06,0x01,0x00,\r\n0x01,0x00,0x63,0x0e,0x01,0x08,0x08,0x09,0x5f,0x0f,0x01,0x09,0x09,0x13,0x08,0x4e,0x7d,0x7b,0x75,0x73,0x6d,0x6b,0x65,0x64,0x5d,0x5b,0x55,0x54,0x4d,0x4c,0x26,0x26,0x17,0x26,0x17,0x17,0x17,0x17,0x14,0x10,0x07,0x1f,0x2b,0x37,0x15,0x14,0x06,0x27,0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x27,0x15,0x14,0x06,0x27,\r\n0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x17,0x33,0x32,0x16,0x27,0x15,0x14,0x06,0x07,0x23,0x22,0x26,0x37,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x01,0x15,0x14,0x06,0x27,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x37,0x35,0x34,0x36,0x37,0x33,0x32,0x16,0x01,0x15,0x14,0x06,0x27,\r\n0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x17,0x21,0x32,0x16,0x27,0x15,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x27,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x8f,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,\r\n0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x03,0x58,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0xfc,0xa6,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x03,0x58,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x01,0x0a,0x08,0xfd,0x12,0x07,\r\n0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x01,0x0a,0x08,0xfd,0x12,0x07,0x0a,0x01,0x0c,0x06,0x02,0xee,0x07,0x0c,0x76,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0xd0,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0xce,0x6b,0x07,0x0a,0x01,0x0c,0x06,0x6b,0x08,0x0a,0x0a,0xfe,0x4c,0x6b,0x07,0x0c,0x01,0x0a,\r\n0x08,0x6b,0x07,0x0a,0x01,0x0c,0x02,0x7d,0x6b,0x08,0x0a,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0xfe,0x4d,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0xce,0x6b,0x07,0x0a,0x01,0x0c,0x06,0x6b,0x08,0x0a,0x0a,0xcf,0x6b,0x08,0x0a,0x0a,0x08,0x6b,0x07,0x0a,0x01,0x0c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x02,0x83,\r\n0x03,0x0b,0x00,0x07,0x00,0x1f,0x00,0x20,0x40,0x1d,0x05,0x03,0x02,0x00,0x00,0x02,0x00,0x02,0x63,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x13,0x01,0x4e,0x23,0x13,0x25,0x36,0x13,0x10,0x06,0x07,0x1c,0x2b,0x13,0x21,0x35,0x34,0x26,0x0e,0x01,0x17,0x05,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x17,0x33,0x35,0x34,\r\n0x36,0x32,0x16,0x07,0x15,0x33,0x32,0x16,0xb3,0x01,0x1d,0x54,0x76,0x54,0x01,0x01,0xd0,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0x20,0x16,0x11,0x94,0xcc,0x96,0x02,0x12,0x17,0x1e,0x01,0xa5,0x6c,0x3b,0x54,0x02,0x50,0x3d,0xa1,0xfe,0xbe,0x16,0x1e,0x01,0x20,0x15,0x01,0x42,0x16,0x20,0x01,0x6c,0x66,0x94,0x94,0x66,0x6c,0x1e,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0xff,0xe2,0x02,0xda,0x02,0xda,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x01,0x00,0x01,0x4c,0x00,0x01,0x00,0x4a,0x05,0x01,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x11,0x11,0x02,0x07,0x18,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x01,0x01,0x7a,0x01,0x60,0xfe,\r\n0xa0,0xfe,0x86,0x02,0xda,0xbe,0xfe,0x86,0xc0,0x01,0x7c,0x00,0x00,0x02,0xff,0xff,0xff,0xb1,0x04,0x2f,0x03,0x52,0x00,0x0f,0x00,0x2f,0x00,0x2e,0x40,0x2b,0x09,0x01,0x02,0x01,0x00,0x20,0x01,0x03,0x02,0x02,0x4c,0x00,0x05,0x00,0x00,0x01,0x05,0x00,0x67,0x00,0x01,0x04,0x01,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x03,0x11,0x03,0x4e,\r\n0x35,0x26,0x36,0x26,0x26,0x14,0x06,0x07,0x1c,0x2b,0x01,0x11,0x34,0x26,0x27,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x14,0x1e,0x01,0x17,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x34,0x3e,0x01,0x35,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0xe8,0x0a,0x08,0xfc,0x83,\r\n0x07,0x0a,0x01,0x0c,0x06,0x03,0x7d,0x07,0x0c,0x46,0x34,0x25,0xfe,0xd1,0x12,0x10,0x01,0x14,0x0f,0xfe,0xe2,0x0f,0x14,0x01,0x12,0x12,0xfe,0xd0,0x24,0x36,0x01,0x34,0x25,0x03,0x7d,0x25,0x34,0x01,0x28,0x01,0xd1,0x07,0x0a,0x01,0x0c,0x06,0xfe,0x2f,0x07,0x0a,0x0a,0x01,0xd8,0xfd,0xa1,0x25,0x34,0x01,0x14,0x2e,0x22,0x07,0x0e,0x16,\r\n0x16,0x0e,0x08,0x22,0x2c,0x15,0x36,0x24,0x02,0x5f,0x25,0x34,0x34,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xe1,0x02,0xf8,0x02,0xdb,0x00,0x21,0x00,0x31,0x00,0x2f,0x40,0x2c,0x11,0x06,0x02,0x00,0x03,0x01,0x4c,0x00,0x01,0x00,0x01,0x86,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x69,0x00,0x03,0x00,0x00,0x03,0x59,0x00,0x03,0x03,0x00,\r\n0x61,0x00,0x00,0x03,0x00,0x51,0x15,0x2b,0x1d,0x25,0x22,0x05,0x07,0x1b,0x2b,0x01,0x0e,0x01,0x23,0x22,0x26,0x27,0x0f,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x3f,0x02,0x2e,0x01,0x35,0x34,0x37,0x3e,0x01,0x32,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x25,0x1e,0x01,0x33,0x32,0x3e,0x01,0x34,0x2e,0x01,0x22,0x0e,0x01,0x15,0x14,0x16,\r\n0x02,0xa8,0x29,0x66,0x36,0x31,0x5d,0x28,0x33,0x82,0x15,0x18,0x1e,0x2d,0x0f,0x81,0x7e,0x20,0x22,0x27,0x25,0x80,0x95,0x40,0x3f,0x26,0x26,0x14,0x14,0xfe,0x99,0x19,0x40,0x21,0x2d,0x4f,0x2e,0x2f,0x4e,0x5b,0x4f,0x2f,0x1a,0x01,0x00,0x29,0x2a,0x22,0x20,0x7d,0x82,0x0f,0x2f,0x1e,0x1a,0x13,0x82,0x33,0x26,0x5e,0x32,0x4b,0x40,0x3f,\r\n0x4b,0x27,0x25,0x3f,0x41,0x4a,0x38,0x32,0x34,0x24,0x18,0x1a,0x2e,0x4f,0x5d,0x4e,0x2e,0x2f,0x4e,0x2d,0x22,0x40,0x00,0x00,0x00,0x02,0xff,0xfd,0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x0c,0x00,0x19,0x00,0x28,0x40,0x25,0x04,0x01,0x00,0x00,0x03,0x61,0x00,0x03,0x03,0x13,0x4d,0x00,0x01,0x01,0x02,0x61,0x00,0x02,0x02,0x11,0x02,0x4e,\r\n0x01,0x00,0x17,0x16,0x11,0x10,0x07,0x06,0x00,0x0c,0x01,0x0c,0x05,0x07,0x16,0x2b,0x01,0x22,0x0e,0x02,0x1e,0x01,0x32,0x3e,0x01,0x2e,0x02,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,0x01,0x01,0xad,0x53,0x8c,0x50,0x02,0x54,0x88,0xaa,0x86,0x56,0x04,0x4e,0x8e,0x01,0x5b,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xf4,\r\n0xba,0x7e,0x02,0x8e,0x52,0x8c,0xa4,0x8c,0x52,0x52,0x8c,0xa4,0x8c,0x52,0xfe,0xd0,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0xb1,0x03,0x4d,0x02,0xff,0x00,0x06,0x00,0x14,0x00,0x19,0x00,0x24,0x00,0xe3,0x40,0x17,0x1e,0x01,0x02,0x05,0x1d,0x16,0x0e,0x07,0x04,0x03,0x02,0x19,0x03,0x02,\r\n0x03,0x00,0x03,0x01,0x01,0x01,0x00,0x04,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x26,0x00,0x02,0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x00,0x03,0x70,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x72,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x4b,0xb0,0x12,0x50,0x58,0x40,0x27,0x00,0x02,\r\n0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x05,0x03,0x00,0x7e,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x72,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x4b,0xb0,0x29,0x50,0x58,0x40,0x28,0x00,0x02,0x05,0x03,0x05,0x02,0x03,0x80,0x00,0x03,0x00,0x05,0x03,0x00,0x7e,0x06,0x01,0x01,0x00,\r\n0x04,0x00,0x01,0x04,0x80,0x00,0x05,0x05,0x13,0x4d,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x1b,0x40,0x23,0x00,0x05,0x02,0x05,0x85,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x00,0x03,0x85,0x06,0x01,0x01,0x00,0x04,0x00,0x01,0x04,0x80,0x00,0x00,0x00,0x04,0x60,0x00,0x04,0x04,0x11,0x04,0x4e,0x59,0x59,0x59,0x40,0x12,\r\n0x00,0x00,0x21,0x20,0x18,0x17,0x10,0x0f,0x09,0x08,0x00,0x06,0x00,0x06,0x14,0x07,0x07,0x17,0x2b,0x17,0x37,0x27,0x07,0x15,0x33,0x15,0x01,0x34,0x23,0x22,0x07,0x01,0x06,0x15,0x14,0x33,0x32,0x37,0x01,0x36,0x27,0x17,0x01,0x23,0x35,0x01,0x14,0x0f,0x01,0x27,0x37,0x36,0x32,0x1f,0x01,0x16,0xcb,0x32,0x83,0x33,0x48,0x01,0x5f,0x0c,\r\n0x05,0x04,0xfe,0xd1,0x04,0x0d,0x05,0x04,0x01,0x2f,0x03,0x1e,0xe8,0xfe,0x30,0xe8,0x03,0x4d,0x14,0x5d,0xe8,0x5d,0x14,0x3b,0x16,0x83,0x14,0x07,0x33,0x83,0x33,0x3c,0x47,0x02,0x06,0x0c,0x04,0xfe,0xd2,0x04,0x06,0x0c,0x04,0x01,0x2e,0x04,0x71,0xe8,0xfe,0x2f,0xe9,0x01,0x9a,0x1d,0x15,0x5d,0xe9,0x5c,0x15,0x15,0x83,0x16,0x00,0x00,\r\n0x00,0x05,0xff,0xff,0xff,0xf9,0x03,0x59,0x02,0xc4,0x00,0x08,0x00,0x11,0x00,0x21,0x00,0x2b,0x00,0x41,0x00,0x8e,0x40,0x0f,0x13,0x01,0x01,0x04,0x09,0x00,0x02,0x00,0x01,0x1b,0x01,0x05,0x00,0x03,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x03,0x01,0x01,0x04,0x00,0x04,0x01,0x00,0x80,0x02,0x01,0x00,0x05,0x08,0x00,0x70,0x00,0x09,\r\n0x00,0x07,0x06,0x09,0x07,0x67,0x00,0x06,0x00,0x04,0x01,0x06,0x04,0x67,0x00,0x05,0x08,0x08,0x05,0x58,0x00,0x05,0x05,0x08,0x60,0x00,0x08,0x05,0x08,0x50,0x1b,0x40,0x31,0x03,0x01,0x01,0x04,0x00,0x04,0x01,0x00,0x80,0x02,0x01,0x00,0x05,0x04,0x00,0x05,0x7e,0x00,0x09,0x00,0x07,0x06,0x09,0x07,0x67,0x00,0x06,0x00,0x04,0x01,0x06,\r\n0x04,0x67,0x00,0x05,0x08,0x08,0x05,0x58,0x00,0x05,0x05,0x08,0x60,0x00,0x08,0x05,0x08,0x50,0x59,0x40,0x0e,0x3d,0x3a,0x37,0x23,0x13,0x26,0x25,0x13,0x14,0x13,0x12,0x0a,0x07,0x1f,0x2b,0x25,0x14,0x06,0x22,0x26,0x3e,0x01,0x1e,0x01,0x17,0x14,0x06,0x22,0x26,0x3e,0x01,0x1e,0x01,0x17,0x35,0x34,0x26,0x27,0x21,0x22,0x06,0x07,0x15,\r\n0x14,0x16,0x17,0x21,0x32,0x36,0x01,0x21,0x03,0x2e,0x01,0x23,0x21,0x22,0x06,0x07,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x35,0x34,0x37,0x13,0x3e,0x01,0x17,0x21,0x32,0x16,0x17,0x13,0x16,0x02,0x44,0x1a,0x24,0x1c,0x02,0x18,0x28,0x16,0x91,0x1a,0x24,0x1c,0x02,0x18,0x28,0x16,0x41,0x0c,0x06,0xfd,0x59,0x07,0x0a,0x01,0x0c,\r\n0x06,0x02,0xa7,0x07,0x0a,0xfd,0x52,0x02,0x93,0x58,0x02,0x0e,0x07,0xfe,0x4b,0x07,0x0e,0x02,0x02,0x9e,0x34,0x25,0xfd,0x59,0x24,0x36,0x01,0x09,0x6e,0x09,0x34,0x1e,0x01,0xb5,0x1f,0x32,0x0a,0x6e,0x09,0xab,0x12,0x1a,0x1a,0x24,0x1c,0x02,0x18,0x14,0x12,0x1a,0x1a,0x24,0x1c,0x02,0x18,0x6d,0xb3,0x07,0x0a,0x01,0x0c,0x06,0xb3,0x07,\r\n0x0a,0x01,0x0c,0x01,0x12,0x01,0x0d,0x07,0x0a,0x0a,0x07,0xfe,0x9a,0xb3,0x25,0x34,0x34,0x25,0xb3,0x0e,0x1c,0x01,0x52,0x1d,0x26,0x01,0x24,0x1e,0xfe,0xae,0x1c,0x00,0x00,0x01,0x00,0x00,0xff,0xe2,0x02,0xda,0x02,0xda,0x00,0x06,0x00,0x26,0x40,0x23,0x01,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x4a,0x02,0x01,0x00,0x49,0x00,0x01,\r\n0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x13,0x02,0x07,0x18,0x2b,0x09,0x02,0x35,0x21,0x11,0x21,0x01,0x5e,0x01,0x7c,0xfe,0x84,0xfe,0xa2,0x01,0x5e,0x02,0xda,0xfe,0x84,0xfe,0x84,0xc0,0x01,0x7a,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xab,0x03,0x6b,0x03,0x20,0x00,0x0f,0x00,0x13,0x00,0x1f,\r\n0x00,0x38,0x40,0x35,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x0b,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x00,0x5f,0x04,0x01,0x00,0x00,0x10,0x4d,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x11,0x01,0x4e,0x01,0x00,0x13,0x12,0x11,0x10,0x09,0x06,0x00,0x0f,0x01,0x0e,0x05,0x07,0x16,0x2b,0x13,0x22,0x06,0x15,0x11,0x14,\r\n0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x21,0x11,0x21,0x01,0x07,0x17,0x07,0x17,0x37,0x17,0x37,0x27,0x37,0x27,0x07,0x87,0x0c,0x11,0x11,0x0c,0x02,0xc6,0x0c,0x11,0x11,0x0c,0xfd,0x58,0x02,0x8b,0xfd,0x75,0x01,0x87,0x2d,0x52,0x52,0x2d,0x53,0x52,0x2e,0x53,0x53,0x2e,0x52,0x03,0x1f,0x12,0x0c,0xfc,0xc8,0x0c,0x11,\r\n0x11,0x0c,0x03,0x38,0x0c,0x12,0x3b,0xfd,0x02,0x02,0xcb,0x2e,0x52,0x53,0x2d,0x52,0x52,0x2d,0x53,0x52,0x2e,0x52,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x84,0x03,0x8f,0x03,0x33,0x00,0x02,0x00,0x10,0x00,0x3c,0x00,0x68,0x01,0x4d,0x40,0x0b,0x01,0x01,0x0a,0x02,0x62,0x36,0x02,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x36,\r\n0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x72,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,0x4b,0xb0,0x13,0x50,0x58,0x40,0x3c,0x12,0x01,\r\n0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x70,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,0x4b,0xb0,0x16,0x50,0x58,\r\n0x40,0x3d,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x0e,0x05,0x02,0x02,0x0a,0x0a,0x02,0x59,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x03,0x4e,0x1b,\r\n0x40,0x44,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x00,0x03,0x04,0x0a,0x03,0x57,0x0e,0x05,0x02,0x02,0x0f,0x01,0x0a,0x06,0x02,0x0a,0x69,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x69,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,\r\n0x0b,0x01,0x08,0x09,0x08,0x51,0x59,0x59,0x59,0x40,0x2d,0x04,0x03,0x00,0x00,0x68,0x66,0x5e,0x5c,0x5b,0x59,0x4d,0x4b,0x4a,0x48,0x3f,0x3d,0x3c,0x3a,0x32,0x30,0x2f,0x2d,0x21,0x1f,0x1e,0x1c,0x13,0x11,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x03,0x10,0x04,0x0f,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x01,0x07,0x27,0x25,0x22,0x06,0x1d,\r\n0x01,0x33,0x35,0x21,0x15,0x33,0x35,0x34,0x26,0x23,0x13,0x33,0x32,0x16,0x1d,0x01,0x14,0x16,0x17,0x16,0x17,0x16,0x3b,0x01,0x15,0x23,0x22,0x07,0x06,0x07,0x06,0x07,0x06,0x1d,0x01,0x14,0x0e,0x02,0x2b,0x01,0x35,0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,\r\n0x01,0x2b,0x01,0x35,0x33,0x32,0x36,0x37,0x36,0x37,0x36,0x3d,0x01,0x34,0x37,0x3e,0x02,0x3b,0x01,0x15,0x23,0x22,0x1d,0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x02,0x90,0x63,0x64,0xfe,0xcd,0x0d,0x13,0x3f,0x01,0x58,0x3f,0x12,0x0d,0x55,0x1b,0x47,0x45,0x07,0x0b,0x09,0x12,0x0e,0x1c,0x0f,0x0f,0x1a,0x12,0x0f,0x0c,0x08,0x05,\r\n0x03,0x0f,0x22,0x34,0x27,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa8,0x1b,0x47,0x44,0x04,0x04,0x0b,0x09,0x23,0x18,0x10,0x10,0x1c,0x20,0x0a,0x08,0x05,0x04,0x07,0x07,0x23,0x33,0x27,0x1b,0x15,0x55,0x4e,0x4e,0x55,0x15,0x02,0xb1,0xac,0xac,0x82,0x12,0x0d,0xe7,0xc7,0x2e,0x4e,0x0d,0x12,0xfe,0xfa,0x42,0x44,0x54,0x14,0x1b,0x09,0x0a,\r\n0x05,0x05,0x33,0x05,0x03,0x0a,0x08,0x0f,0x0d,0x14,0x80,0x1d,0x33,0x23,0x13,0x34,0x52,0x7f,0x5a,0x0a,0x09,0x5c,0x54,0x54,0xfd,0x8a,0x43,0x43,0x7e,0x0e,0x12,0x0e,0x0a,0x09,0x0b,0x33,0x08,0x09,0x08,0x0f,0x14,0x0d,0x57,0x21,0x16,0x19,0x24,0x12,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0xff,0xf2,0x02,0xf8,0x02,0xcc,0x00,0x06,0x00,0x17,0x40,0x14,0x06,0x01,0x00,0x4a,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x11,0x11,0x10,0x03,0x07,0x19,0x2b,0x01,0x23,0x11,0x21,0x11,0x23,0x01,0x02,0xf8,0xc0,0xfe,0x88,0xc0,0x01,0x7c,0x01,0x50,0xfe,0xa2,0x01,0x5e,0x01,0x7c,0x00,0x01,0x00,0x00,0x00,0x00,0x03,0xa5,\r\n0x02,0x98,0x00,0x15,0x00,0x1d,0x40,0x1a,0x0f,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x14,0x17,0x14,0x03,0x07,0x19,0x2b,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x01,0x36,0x32,0x1f,0x01,0x16,0x03,0xa5,0x10,0xfe,0x20,0x10,0x2c,\r\n0x10,0xfe,0xea,0x0f,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0x01,0x6e,0x10,0x2c,0x10,0x4c,0x10,0x02,0x16,0x16,0x10,0xfe,0x20,0x0f,0x0f,0x01,0x16,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa5,0x01,0x6f,0x10,0x10,0x4c,0x0f,0x00,0x03,0xff,0xf5,0xff,0xb1,0x03,0xf3,0x03,0x52,0x00,0x0f,0x00,0x21,0x00,0x33,0x00,0x33,0x40,0x30,0x1b,0x11,0x02,0x03,\r\n0x02,0x09,0x01,0x02,0x01,0x00,0x02,0x4c,0x00,0x05,0x00,0x02,0x03,0x05,0x02,0x67,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x67,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x11,0x04,0x4e,0x17,0x38,0x27,0x27,0x26,0x23,0x06,0x07,0x1c,0x2b,0x25,0x35,0x34,0x26,0x2b,0x01,0x22,0x06,0x1d,0x01,0x14,0x16,0x17,0x33,0x32,0x36,0x27,0x13,0x34,\r\n0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x17,0x14,0x16,0x37,0x33,0x32,0x36,0x03,0x01,0x16,0x07,0x0e,0x01,0x07,0x21,0x22,0x26,0x27,0x26,0x37,0x01,0x3e,0x01,0x32,0x16,0x02,0x3b,0x0a,0x07,0x6c,0x07,0x0a,0x0a,0x07,0x6c,0x07,0x0a,0x01,0x0a,0x05,0x07,0x07,0x7a,0x06,0x08,0x05,0x09,0x0c,0x07,0x67,0x08,0x0c,0x08,0x01,0xac,0x14,\r\n0x15,0x09,0x22,0x12,0xfc,0xa6,0x12,0x22,0x09,0x15,0x14,0x01,0xad,0x09,0x22,0x26,0x22,0x53,0x6a,0x08,0x0a,0x0a,0x08,0x6a,0x08,0x0a,0x01,0x0c,0xd7,0x01,0x01,0x06,0x04,0x06,0x06,0x04,0x08,0xff,0x05,0x08,0x01,0x06,0x02,0x10,0xfc,0xee,0x23,0x23,0x11,0x12,0x01,0x14,0x10,0x23,0x23,0x03,0x12,0x11,0x14,0x14,0x00,0x04,0x00,0x00,\r\n0xff,0x79,0x03,0xd1,0x03,0x3c,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x36,0x40,0x33,0x07,0x01,0x05,0x03,0x01,0x01,0x05,0x01,0x63,0x06,0x01,0x04,0x04,0x00,0x5f,0x09,0x02,0x08,0x03,0x00,0x00,0x12,0x04,0x4e,0x11,0x10,0x01,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x19,0x16,0x10,0x1f,0x11,0x1e,0x09,0x06,0x00,0x0f,\r\n0x01,0x0e,0x0a,0x07,0x16,0x2b,0x13,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x33,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x05,0x21,0x11,0x21,0x01,0x21,0x11,0x21,0x38,0x0d,0x13,0x13,0x0d,0x01,0x7c,0x0d,0x12,0x12,0x0d,0x80,0x0d,0x12,0x12,0x0d,0x01,0x7d,\r\n0x0d,0x12,0x12,0x0d,0xfc,0xa6,0x01,0x3e,0xfe,0xc2,0x01,0xfc,0x01,0x3e,0xfe,0xc2,0x03,0x3b,0x12,0x0d,0xfc,0x7d,0x0d,0x12,0x12,0x0d,0x03,0x83,0x0d,0x12,0x12,0x0d,0xfc,0x7d,0x0d,0x12,0x12,0x0d,0x03,0x83,0x0d,0x12,0x3e,0xfc,0xbb,0x03,0x45,0xfc,0xbb,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x7e,0x03,0xd6,0x03,0x37,0x00,0x0f,\r\n0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x3d,0x40,0x3a,0x00,0x04,0x00,0x01,0x02,0x04,0x01,0x67,0x00,0x02,0x09,0x01,0x07,0x06,0x02,0x07,0x67,0x00,0x06,0x00,0x03,0x06,0x03,0x63,0x08,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x12,0x05,0x4e,0x24,0x24,0x20,0x20,0x24,0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x14,0x35,0x35,0x35,\r\n0x32,0x0a,0x07,0x1b,0x2b,0x01,0x34,0x26,0x23,0x21,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x15,0x34,0x26,0x23,0x21,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x03,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x03,0xd5,0x12,0x0d,0xfc,0x7d,0x0d,0x13,0x13,0x0d,0x03,0x83,0x0d,0x12,0x12,0x0d,0xfc,0x7d,0x0d,\r\n0x13,0x13,0x0d,0x03,0x83,0x0d,0x12,0x3f,0xfc,0xbc,0x03,0x44,0xfc,0xbc,0x03,0x17,0x0d,0x12,0x12,0x0d,0xfe,0x84,0x0d,0x12,0x12,0x0d,0x80,0x0d,0x12,0x12,0x0d,0xfe,0x83,0x0d,0x12,0x12,0x0d,0x03,0x5a,0xfe,0xc2,0x01,0x3e,0xfe,0x04,0xfe,0xc1,0x01,0x3f,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x89,0x03,0xdc,0x03,0x38,0x00,0x02,\r\n0x00,0x10,0x00,0x39,0x00,0x62,0x01,0x0d,0x40,0x0b,0x01,0x01,0x06,0x0a,0x5c,0x33,0x02,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x1c,0x50,0x58,0x40,0x38,0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x02,0x80,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,\r\n0x01,0x09,0x0b,0x01,0x08,0x09,0x08,0x65,0x0f,0x01,0x0a,0x0a,0x03,0x5f,0x00,0x03,0x03,0x13,0x0a,0x4e,0x1b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x3f,0x12,0x01,0x01,0x03,0x01,0x85,0x04,0x11,0x02,0x00,0x03,0x02,0x03,0x00,0x02,0x80,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x00,0x03,0x0f,0x01,0x0a,0x06,0x03,0x0a,0x69,0x0d,0x01,\r\n0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,0x0b,0x01,0x08,0x09,0x08,0x51,0x1b,0x40,0x45,0x12,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x03,0x00,0x03,0x04,0x00,0x80,0x11,0x01,0x00,0x02,0x03,0x00,0x02,0x7e,0x0e,0x05,0x02,0x02,0x0a,0x03,0x02,0x0a,0x7e,0x00,0x03,0x0f,\r\n0x01,0x0a,0x06,0x03,0x0a,0x69,0x0d,0x01,0x06,0x0c,0x01,0x07,0x09,0x06,0x07,0x6a,0x10,0x01,0x09,0x08,0x08,0x09,0x59,0x10,0x01,0x09,0x09,0x08,0x61,0x0b,0x01,0x08,0x09,0x08,0x51,0x59,0x59,0x40,0x2d,0x04,0x03,0x00,0x00,0x62,0x60,0x58,0x56,0x55,0x53,0x4a,0x48,0x47,0x45,0x3c,0x3a,0x39,0x37,0x2f,0x2d,0x2c,0x2a,0x1f,0x1d,0x1c,\r\n0x1a,0x13,0x11,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x03,0x10,0x04,0x0f,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x01,0x07,0x27,0x25,0x22,0x06,0x1d,0x01,0x33,0x35,0x21,0x15,0x33,0x35,0x34,0x26,0x23,0x01,0x33,0x32,0x16,0x1d,0x01,0x14,0x1e,0x02,0x3b,0x01,0x15,0x23,0x22,0x07,0x0e,0x02,0x1d,0x01,0x14,0x07,0x0e,0x02,0x2b,0x01,0x35,\r\n0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,0x01,0x2b,0x01,0x35,0x33,0x32,0x3e,0x02,0x3d,0x01,0x34,0x3e,0x02,0x3b,0x01,0x15,0x23,0x22,0x1d,0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x03,0xdc,0x63,0x64,0xfd,0x31,0x0d,0x13,0x3f,0x02,0xf4,0x3f,0x12,\r\n0x0d,0xfe,0xb9,0x1b,0x47,0x45,0x07,0x16,0x22,0x18,0x10,0x10,0x16,0x16,0x10,0x14,0x07,0x08,0x06,0x21,0x38,0x25,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa8,0x1b,0x47,0x44,0x04,0x04,0x0b,0x09,0x23,0x18,0x10,0x10,0x1c,0x1f,0x15,0x07,0x0f,0x21,0x34,0x27,0x1b,0x15,0x55,0x4d,0x4e,0x54,0x15,0x02,0x85,0xad,0xad,0xb3,0x12,0x0d,0xe7,\r\n0xc7,0x6d,0x8d,0x0d,0x12,0xfe,0xfa,0x42,0x44,0x54,0x14,0x1b,0x13,0x0a,0x33,0x04,0x04,0x12,0x1c,0x14,0x80,0x1d,0x1a,0x19,0x23,0x13,0x34,0x52,0x7f,0x5a,0x0a,0x09,0x5c,0x54,0x54,0xfd,0x8a,0x43,0x43,0x7e,0x0e,0x12,0x0e,0x0a,0x09,0x0b,0x33,0x08,0x13,0x1a,0x14,0x57,0x20,0x30,0x23,0x13,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,\r\n0x54,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x23,0x00,0x33,0x00,0x43,0x00,0x44,0x40,0x41,0x18,0x01,0x03,0x04,0x13,0x01,0x02,0x00,0x03,0x06,0x01,0x01,0x00,0x03,0x4c,0x05,0x01,0x03,0x02,0x01,0x00,0x01,0x03,0x00,0x67,0x00,0x04,0x00,0x01,0x07,0x04,0x01,0x69,0x00,0x07,0x00,0x08,0x07,0x08,0x63,\r\n0x00,0x06,0x06,0x09,0x5f,0x00,0x09,0x09,0x13,0x06,0x4e,0x42,0x3f,0x35,0x35,0x36,0x14,0x23,0x26,0x14,0x23,0x23,0x0a,0x07,0x1f,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3d,0x01,0x23,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x35,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x33,0x32,0x16,0x13,0x11,\r\n0x34,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x83,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x47,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,\r\n0x01,0xd0,0x25,0x34,0x48,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x01,0x94,0x24,0x08,0x0a,0xc4,0x08,0x0a,0x0a,0x08,0xc4,0x0a,0x08,0x24,0x07,0x0a,0xc5,0x08,0x0a,0x0a,0x08,0xc5,0x0a,0xfe,0xff,0x01,0xd0,0x25,0x34,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x01,0xf4,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,\r\n0x42,0x5e,0x01,0x60,0x00,0x03,0x00,0x00,0xff,0xf9,0x03,0x13,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x2d,0x40,0x2a,0x09,0x01,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x00,0x02,0x02,0x05,0x5f,0x00,0x05,0x05,0x13,0x02,0x4e,0x35,0x35,0x35,0x36,0x26,0x23,0x06,\r\n0x07,0x1c,0x2b,0x01,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x3d,0x01,0x34,0x36,0x33,0x21,0x32,0x16,0x13,0x11,0x34,0x26,0x23,0x21,0x22,0x06,0x07,0x11,0x14,0x16,0x17,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0x83,0x0a,0x08,0xfe,0x30,0x08,0x0a,0x0a,0x08,0x01,0xd0,0x08,\r\n0x0a,0x47,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x24,0x01,0xd0,0x25,0x34,0x48,0x5e,0x43,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,0x60,0x01,0x94,0x24,0x08,0x0a,0x0a,0x08,0x24,0x07,0x0a,0x0a,0xfe,0xff,0x01,0xd0,0x25,0x34,0x34,0x25,0xfe,0x30,0x25,0x34,0x01,0x36,0x01,0xf4,0xfe,0x30,0x43,0x5e,0x5e,0x43,0x01,0xd0,0x42,\r\n0x5e,0x01,0x60,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x01,0xd4,0x00,0x15,0x00,0x21,0xb1,0x06,0x64,0x44,0x40,0x16,0x07,0x01,0x00,0x02,0x01,0x4c,0x00,0x02,0x00,0x02,0x85,0x01,0x01,0x00,0x00,0x76,0x17,0x14,0x14,0x03,0x07,0x19,0x2b,0xb1,0x06,0x00,0x44,0x25,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x07,0x06,0x22,0x2f,0x01,\r\n0x26,0x34,0x37,0x01,0x36,0x32,0x17,0x01,0x16,0x02,0x58,0x06,0x1c,0x05,0x0e,0x06,0xdc,0xdb,0x05,0x10,0x04,0x1c,0x06,0x06,0x01,0x04,0x05,0x0e,0x06,0x01,0x04,0x06,0xbd,0x07,0x05,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x0e,0x06,0x01,0x04,0x06,0x06,0xfe,0xfc,0x05,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xff,0x89,0x03,0x42,\r\n0x03,0x33,0x00,0x0f,0x00,0x19,0x00,0x33,0x00,0x3f,0x00,0x4b,0x00,0x57,0x00,0x8c,0x40,0x89,0x56,0x01,0x0c,0x0d,0x44,0x01,0x0a,0x0b,0x3e,0x01,0x08,0x09,0x03,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x0d,0x03,0x05,0x0d,0x7e,0x00,0x0b,0x0c,0x0a,0x0c,0x0b,0x0a,0x80,0x00,0x0a,0x09,0x0c,0x0a,0x09,0x7e,0x00,0x09,\r\n0x08,0x0c,0x09,0x08,0x7e,0x10,0x01,0x08,0x07,0x0c,0x08,0x07,0x7e,0x00,0x0d,0x11,0x01,0x0c,0x0b,0x0d,0x0c,0x67,0x00,0x07,0x00,0x01,0x07,0x01,0x64,0x06,0x04,0x0f,0x03,0x03,0x03,0x00,0x5f,0x0e,0x01,0x00,0x00,0x12,0x03,0x4e,0x4e,0x4c,0x36,0x34,0x10,0x10,0x01,0x00,0x54,0x52,0x4c,0x57,0x4e,0x57,0x48,0x45,0x42,0x40,0x3c,0x3a,\r\n0x34,0x3f,0x36,0x3f,0x32,0x2f,0x2a,0x28,0x25,0x22,0x1f,0x1d,0x10,0x19,0x10,0x19,0x16,0x13,0x09,0x06,0x00,0x0f,0x01,0x0e,0x12,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x17,0x15,0x14,0x16,0x3b,0x01,0x32,0x36,0x3d,0x01,0x13,0x11,0x34,0x26,0x07,0x23,0x15,0x14,0x06,0x07,\r\n0x23,0x22,0x26,0x37,0x35,0x23,0x22,0x06,0x17,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x27,0x21,0x22,0x35,0x34,0x36,0x37,0x21,0x32,0x16,0x07,0x14,0x27,0x21,0x22,0x26,0x37,0x34,0x33,0x21,0x32,0x15,0x14,0x06,0x27,0x21,0x22,0x35,0x34,0x36,0x17,0x21,0x32,0x16,0x07,0x14,0x02,0xa6,0x41,0x5a,0x01,0x5c,0x40,0xfd,0xf6,0x41,0x5a,0x01,\r\n0x5c,0x40,0x68,0x20,0x15,0xd0,0x16,0x1e,0x9c,0x1e,0x15,0x35,0x3c,0x2c,0xd0,0x2b,0x3e,0x01,0x35,0x15,0x20,0x01,0x1e,0x16,0x02,0x0a,0x15,0x1e,0x68,0xfe,0x60,0x1a,0x0e,0x0c,0x01,0xa0,0x0b,0x10,0x01,0x1a,0xfe,0x60,0x0b,0x10,0x01,0x1a,0x01,0xa0,0x1a,0x0e,0x0c,0xfe,0x60,0x1a,0x0e,0x0c,0x01,0xa0,0x0b,0x10,0x01,0x03,0x33,0x5c,\r\n0x40,0xfd,0x8f,0x41,0x5c,0x5c,0x41,0x02,0x71,0x41,0x5a,0x01,0x68,0x34,0x15,0x20,0x20,0x15,0x34,0xfd,0x5b,0x02,0x71,0x15,0x20,0x01,0x34,0x2b,0x3c,0x01,0x3e,0x2a,0x34,0x1e,0x16,0xfd,0x8f,0x15,0x20,0x20,0x49,0x19,0x0c,0x0e,0x01,0x10,0x0b,0x19,0x9d,0x0e,0x0c,0x19,0x19,0x0b,0x10,0x9d,0x19,0x0b,0x10,0x01,0x0e,0x0c,0x19,0x00,\r\n0x00,0x03,0x00,0x00,0xff,0xf9,0x04,0x29,0x03,0x0b,0x00,0x11,0x00,0x27,0x00,0x45,0x00,0x4b,0x40,0x48,0x24,0x01,0x01,0x00,0x01,0x4c,0x00,0x07,0x04,0x03,0x04,0x07,0x03,0x80,0x00,0x03,0x02,0x04,0x03,0x02,0x7e,0x08,0x09,0x02,0x02,0x00,0x00,0x01,0x02,0x00,0x68,0x00,0x01,0x00,0x05,0x01,0x05,0x63,0x00,0x04,0x04,0x06,0x5f,0x00,\r\n0x06,0x06,0x13,0x04,0x4e,0x13,0x12,0x42,0x40,0x3d,0x3b,0x38,0x35,0x30,0x2d,0x21,0x1e,0x19,0x16,0x12,0x27,0x13,0x27,0x36,0x31,0x0a,0x07,0x18,0x2b,0x01,0x34,0x23,0x21,0x22,0x06,0x0f,0x01,0x06,0x15,0x14,0x33,0x21,0x32,0x36,0x3f,0x01,0x36,0x25,0x21,0x35,0x34,0x26,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x26,0x07,0x23,0x22,0x06,\r\n0x15,0x11,0x37,0x3e,0x01,0x05,0x14,0x0f,0x01,0x0e,0x01,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x17,0x15,0x33,0x32,0x16,0x17,0x16,0x03,0xe2,0x1e,0xfd,0xa1,0x16,0x34,0x0d,0xa4,0x0b,0x1e,0x02,0x5f,0x17,0x32,0x0f,0xa4,0x0a,0xfd,0x83,0x01,0xad,0x20,0x16,0xfe,0xbf,0x17,0x1e,0x01,\r\n0x1e,0x17,0xb3,0x16,0x20,0x8f,0x19,0x50,0x02,0xea,0x19,0xa5,0x18,0x52,0x25,0xfd,0xa1,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x2f,0x34,0x48,0x01,0x6b,0x1e,0x34,0x0b,0x08,0x01,0x4b,0x13,0x18,0x11,0xcb,0x0d,0x09,0x14,0x1a,0x10,0xcb,0x0c,0x64,0x5a,0x16,0x20,0x01,0x20,0x16,0x24,0x16,0x20,0x01,0x1e,0x17,0xfe,0x24,0xaf,0x1e,\r\n0x26,0x5a,0x23,0x20,0xcb,0x1e,0x26,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33,0x12,0x4a,0x33,0x5a,0x1a,0x1b,0x11,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xf9,0x03,0xa1,0x03,0x0b,0x00,0x17,0x00,0x2c,0x00,0x26,0x40,0x23,0x00,0x05,0x00,0x00,0x02,0x05,0x00,0x67,0x00,0x02,0x00,0x03,0x02,0x03,0x63,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,\r\n0x04,0x13,0x01,0x4e,0x23,0x35,0x35,0x35,0x35,0x33,0x06,0x07,0x1c,0x2b,0x25,0x11,0x34,0x26,0x07,0x21,0x22,0x26,0x27,0x35,0x34,0x26,0x07,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x1d,0x01,0x21,0x32,0x16,0x03,0x59,0x1e,0x17,0xfe,\r\n0x77,0x17,0x1e,0x01,0x1e,0x17,0xb3,0x16,0x20,0x20,0x16,0x02,0xa7,0x16,0x20,0x47,0x4a,0x33,0xfd,0x59,0x33,0x4a,0x4a,0x33,0xb3,0x33,0x4a,0x01,0x77,0x33,0x4a,0x76,0x01,0x89,0x16,0x20,0x01,0x20,0x16,0x24,0x16,0x20,0x01,0x1e,0x17,0xfd,0xe8,0x16,0x20,0x20,0x01,0x9f,0xfe,0x77,0x33,0x4a,0x4a,0x33,0x02,0x18,0x33,0x4a,0x4a,0x33,\r\n0x12,0x4a,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0xb8,0x03,0x94,0x03,0x1f,0x00,0x02,0x00,0x10,0x00,0x39,0x00,0x66,0x01,0x0d,0x40,0x0b,0x60,0x33,0x02,0x07,0x06,0x01,0x01,0x02,0x07,0x02,0x4c,0x4b,0xb0,0x13,0x50,0x58,0x40,0x38,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x00,0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,\r\n0x06,0x07,0x69,0x0b,0x08,0x12,0x04,0x11,0x05,0x00,0x01,0x09,0x00,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x1b,0x4b,0xb0,0x1b,0x50,0x58,0x40,0x3f,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x12,0x04,0x11,0x03,0x00,0x08,0x01,0x08,0x00,0x01,0x80,0x00,\r\n0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,0x06,0x07,0x69,0x0b,0x01,0x08,0x00,0x09,0x08,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x1b,0x40,0x45,0x00,0x02,0x07,0x09,0x07,0x02,0x09,0x80,0x11,0x01,0x00,0x08,0x04,0x08,0x00,0x04,0x80,0x12,\r\n0x01,0x04,0x01,0x08,0x04,0x01,0x7e,0x00,0x03,0x01,0x03,0x86,0x0d,0x01,0x06,0x0c,0x01,0x07,0x02,0x06,0x07,0x69,0x0b,0x01,0x08,0x00,0x09,0x08,0x59,0x10,0x01,0x09,0x00,0x01,0x03,0x09,0x01,0x67,0x0f,0x01,0x0a,0x0a,0x05,0x61,0x0e,0x01,0x05,0x05,0x10,0x0a,0x4e,0x59,0x59,0x40,0x2d,0x03,0x03,0x00,0x00,0x66,0x64,0x5c,0x5a,0x59,\r\n0x57,0x4a,0x48,0x47,0x45,0x3c,0x3a,0x39,0x37,0x2f,0x2d,0x2c,0x2a,0x20,0x1e,0x1d,0x1b,0x13,0x11,0x03,0x10,0x03,0x10,0x0d,0x0a,0x07,0x06,0x05,0x04,0x00,0x02,0x00,0x02,0x13,0x07,0x16,0x2b,0x25,0x37,0x17,0x07,0x15,0x21,0x35,0x23,0x15,0x14,0x16,0x33,0x21,0x32,0x36,0x3d,0x01,0x01,0x33,0x32,0x16,0x1d,0x01,0x14,0x17,0x1e,0x02,\r\n0x3b,0x01,0x15,0x23,0x22,0x0e,0x02,0x1d,0x01,0x14,0x07,0x0e,0x02,0x2b,0x01,0x35,0x33,0x32,0x3d,0x01,0x34,0x37,0x26,0x3d,0x01,0x34,0x2b,0x01,0x03,0x23,0x22,0x26,0x3d,0x01,0x34,0x27,0x26,0x27,0x2e,0x01,0x2b,0x01,0x35,0x33,0x32,0x3e,0x01,0x37,0x36,0x3d,0x01,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x15,0x23,0x22,0x1d,\r\n0x01,0x14,0x07,0x16,0x1d,0x01,0x14,0x3b,0x01,0x02,0xcd,0x64,0x63,0x82,0xfe,0xa7,0x3e,0x12,0x0d,0x01,0x97,0x0d,0x13,0xfe,0xa0,0x1c,0x47,0x44,0x04,0x05,0x11,0x25,0x18,0x10,0x10,0x1c,0x20,0x14,0x07,0x07,0x07,0x22,0x35,0x26,0x1c,0x16,0x55,0x4d,0x4e,0x54,0x16,0xa7,0x1b,0x48,0x44,0x04,0x05,0x09,0x0a,0x23,0x18,0x0f,0x0f,0x1d,\r\n0x20,0x13,0x03,0x04,0x07,0x08,0x10,0x10,0x1b,0x1b,0x27,0x1b,0x16,0x55,0x4d,0x4e,0x54,0x16,0x6a,0xac,0xac,0x09,0x6a,0xb3,0xd3,0x0d,0x12,0x12,0x0d,0x8a,0x02,0xbe,0x42,0x44,0x54,0x14,0x0c,0x10,0x10,0x0c,0x33,0x08,0x14,0x19,0x15,0x80,0x21,0x16,0x19,0x23,0x12,0x33,0x52,0x7f,0x59,0x0b,0x09,0x5c,0x54,0x54,0xfd,0x8b,0x42,0x43,\r\n0x7e,0x14,0x0c,0x10,0x08,0x0b,0x09,0x33,0x09,0x12,0x0e,0x0c,0x15,0x56,0x1a,0x1e,0x18,0x12,0x10,0x0b,0x09,0x33,0x53,0x55,0x59,0x0c,0x07,0x5d,0x7d,0x54,0x00,0x00,0x00,0x03,0xff,0xfe,0x00,0x00,0x03,0xe8,0x02,0x60,0x00,0x20,0x00,0x24,0x00,0x28,0x00,0x36,0x40,0x33,0x00,0x00,0x08,0x06,0x07,0x03,0x04,0x03,0x00,0x04,0x67,0x05,\r\n0x01,0x03,0x01,0x01,0x03,0x57,0x05,0x01,0x03,0x03,0x01,0x5f,0x02,0x01,0x01,0x03,0x01,0x4f,0x25,0x25,0x21,0x21,0x25,0x28,0x25,0x28,0x27,0x26,0x21,0x24,0x21,0x24,0x14,0x27,0x2a,0x18,0x09,0x07,0x1a,0x2b,0x11,0x26,0x37,0x25,0x36,0x17,0x16,0x0f,0x01,0x21,0x27,0x26,0x37,0x36,0x17,0x05,0x16,0x07,0x03,0x06,0x23,0x21,0x26,0x2f,\r\n0x01,0x26,0x0f,0x01,0x06,0x23,0x21,0x26,0x27,0x37,0x17,0x21,0x37,0x33,0x17,0x21,0x37,0x02,0x0a,0x01,0x68,0x1d,0x0c,0x0b,0x19,0xe3,0x02,0x92,0xe4,0x19,0x0b,0x0e,0x1d,0x01,0x6a,0x0b,0x02,0x1b,0x08,0x19,0xfe,0xc7,0x19,0x06,0x31,0x27,0x35,0x32,0x06,0x1a,0xfe,0xc8,0x1b,0x04,0x27,0x13,0x01,0x04,0x2b,0xdd,0x29,0x01,0x03,0x14,\r\n0x01,0x82,0x0d,0x0c,0xba,0x0b,0x1b,0x21,0x0c,0x68,0x68,0x10,0x1d,0x1b,0x0b,0xba,0x0c,0x0d,0xff,0x00,0x1e,0x02,0x18,0xdf,0x19,0x18,0xe0,0x1a,0x02,0x1c,0xe2,0xbd,0xbd,0xbd,0xbd,0x00,0x00,0x03,0x00,0x00,0xff,0x6a,0x03,0x59,0x03,0x52,0x00,0x13,0x00,0x1a,0x00,0x23,0x00,0x39,0x40,0x36,0x14,0x01,0x02,0x04,0x01,0x4c,0x00,0x01,\r\n0x00,0x04,0x02,0x01,0x04,0x67,0x00,0x02,0x00,0x03,0x05,0x02,0x03,0x67,0x06,0x01,0x05,0x00,0x00,0x05,0x57,0x06,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,0x00,0x4f,0x1b,0x1b,0x1b,0x23,0x1b,0x23,0x13,0x26,0x14,0x35,0x36,0x07,0x07,0x1b,0x2b,0x01,0x1e,0x01,0x15,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x37,0x21,\r\n0x32,0x16,0x17,0x07,0x15,0x33,0x26,0x2f,0x01,0x26,0x13,0x11,0x23,0x22,0x26,0x27,0x35,0x21,0x11,0x03,0x33,0x10,0x16,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x01,0xf4,0x16,0x36,0x0f,0x4a,0xd2,0x05,0x07,0xaf,0x06,0xc6,0xe8,0x17,0x1e,0x01,0xfe,0x53,0x02,0x7e,0x10,0x34,0x18,0xfd,0x7e,0x17,0x1e,0x01,0x20,0x16,0x03,0x7c,\r\n0x17,0x1e,0x01,0x16,0x10,0x26,0xd2,0x11,0x06,0xaf,0x07,0xfc,0xb0,0x02,0x3c,0x20,0x15,0xe9,0xfc,0xa6,0x00,0x01,0x00,0x00,0xff,0xaa,0x03,0x11,0x03,0x13,0x00,0x0b,0x00,0x06,0xb3,0x07,0x02,0x01,0x32,0x2b,0x09,0x01,0x06,0x26,0x35,0x11,0x34,0x36,0x17,0x01,0x16,0x14,0x03,0x04,0xfd,0x1b,0x0d,0x12,0x12,0x0d,0x02,0xe5,0x0d,0x01,\r\n0x4d,0xfe,0x64,0x07,0x0a,0x0f,0x03,0x36,0x0e,0x0c,0x08,0xfe,0x64,0x07,0x14,0x00,0x00,0x01,0xff,0xff,0xff,0xae,0x02,0x3c,0x03,0x0f,0x00,0x1d,0x00,0x1b,0x40,0x18,0x1b,0x1a,0x12,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x13,0x4d,0x00,0x01,0x01,0x11,0x01,0x4e,0x35,0x3d,0x02,0x07,0x18,0x2b,0x17,0x06,0x26,0x37,0x11,0x34,0x36,\r\n0x17,0x01,0x16,0x17,0x11,0x34,0x36,0x3b,0x01,0x32,0x16,0x07,0x11,0x14,0x06,0x2b,0x01,0x22,0x26,0x37,0x11,0x06,0x07,0x19,0x0a,0x10,0x01,0x0e,0x0b,0x01,0x8c,0x05,0x03,0x14,0x0f,0x48,0x0e,0x16,0x01,0x14,0x0f,0x48,0x0e,0x16,0x01,0x03,0x05,0x47,0x0b,0x06,0x0f,0x03,0x36,0x0e,0x08,0x0c,0xfe,0x74,0x05,0x05,0x01,0x7a,0x0e,0x16,\r\n0x16,0x0e,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x01,0x7b,0x06,0x05,0x00,0x03,0xff,0xfc,0xff,0x90,0x03,0x9a,0x03,0x2c,0x00,0x08,0x00,0x13,0x00,0x29,0x00,0xa7,0x40,0x0d,0x0c,0x01,0x03,0x02,0x23,0x22,0x18,0x17,0x04,0x05,0x07,0x02,0x4c,0x4b,0xb0,0x24,0x50,0x58,0x40,0x32,0x00,0x03,0x02,0x06,0x02,0x03,0x06,0x80,0x00,0x06,0x07,0x02,\r\n0x06,0x07,0x7e,0x00,0x07,0x05,0x02,0x07,0x05,0x7e,0x00,0x05,0x04,0x02,0x05,0x04,0x7e,0x0a,0x01,0x04,0x00,0x01,0x04,0x01,0x66,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x12,0x02,0x4e,0x1b,0x40,0x39,0x00,0x03,0x02,0x06,0x02,0x03,0x06,0x80,0x00,0x06,0x07,0x02,0x06,0x07,0x7e,0x00,0x07,0x05,0x02,0x07,0x05,0x7e,0x00,\r\n0x05,0x04,0x02,0x05,0x04,0x7e,0x08,0x01,0x00,0x09,0x01,0x02,0x03,0x00,0x02,0x69,0x0a,0x01,0x04,0x01,0x01,0x04,0x59,0x0a,0x01,0x04,0x04,0x01,0x62,0x00,0x01,0x04,0x01,0x52,0x59,0x40,0x1f,0x15,0x14,0x0a,0x09,0x01,0x00,0x26,0x24,0x20,0x1e,0x1b,0x19,0x14,0x29,0x15,0x29,0x10,0x0e,0x09,0x13,0x0a,0x13,0x05,0x04,0x00,0x08,0x01,\r\n0x08,0x0b,0x07,0x16,0x2b,0x01,0x36,0x00,0x12,0x00,0x04,0x00,0x02,0x00,0x17,0x22,0x06,0x15,0x06,0x16,0x33,0x32,0x36,0x35,0x34,0x03,0x32,0x36,0x37,0x27,0x06,0x23,0x22,0x3f,0x01,0x36,0x23,0x22,0x06,0x07,0x17,0x36,0x33,0x32,0x0f,0x01,0x06,0x01,0xc6,0xbe,0x01,0x10,0x06,0xfe,0xf6,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0c,0xf2,0x2a,\r\n0x2e,0x02,0x22,0x20,0x26,0x2e,0xb4,0x1e,0x6c,0x34,0x12,0x30,0x18,0x0e,0x0a,0x2a,0x1a,0x30,0x1e,0x76,0x38,0x10,0x34,0x16,0x0c,0x0c,0x24,0x1a,0x03,0x2a,0x02,0xfe,0xf8,0xfe,0x84,0xfe,0xee,0x06,0x01,0x0a,0x01,0x7c,0x01,0x12,0x96,0x30,0x1a,0x1c,0x20,0x2c,0x20,0x3a,0xfd,0xae,0x34,0x34,0x18,0x24,0x26,0xa0,0x60,0x3a,0x2e,0x1a,\r\n0x22,0x22,0x98,0x68,0x00,0x01,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x31,0x00,0x3b,0x40,0x38,0x2a,0x01,0x03,0x05,0x25,0x1d,0x02,0x04,0x03,0x02,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x03,0x03,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x02,0x02,0x00,0x61,0x00,0x00,0x00,\r\n0x11,0x00,0x4e,0x29,0x35,0x17,0x23,0x17,0x24,0x06,0x07,0x1c,0x2b,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x34,0x3f,0x01,0x36,0x16,0x17,0x1e,0x01,0x33,0x32,0x3e,0x03,0x2e,0x02,0x22,0x06,0x07,0x17,0x16,0x06,0x2b,0x01,0x22,0x26,0x27,0x35,0x34,0x36,0x1f,0x01,0x3e,0x01,0x33,0x32,0x1e,0x02,0x03,0x59,0x44,0x72,0xa0,0x56,\r\n0x60,0xae,0x3c,0x04,0x05,0x4c,0x06,0x11,0x04,0x29,0x76,0x43,0x3a,0x68,0x50,0x2a,0x02,0x2e,0x4c,0x6c,0x6f,0x64,0x28,0x4d,0x11,0x13,0x17,0xfa,0x0f,0x14,0x01,0x2c,0x11,0x48,0x3c,0x9a,0x52,0x57,0x9e,0x74,0x42,0x01,0x5e,0x57,0x9e,0x74,0x44,0x52,0x49,0x06,0x0e,0x04,0x4d,0x05,0x01,0x06,0x35,0x3a,0x2e,0x4c,0x6a,0x74,0x6a,0x4c,\r\n0x2e,0x28,0x25,0x4d,0x10,0x2d,0x16,0x0e,0xfa,0x18,0x13,0x12,0x48,0x39,0x3e,0x44,0x74,0x9e,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf9,0x02,0x83,0x03,0x53,0x00,0x23,0x00,0x3a,0x40,0x37,0x00,0x04,0x05,0x00,0x05,0x04,0x00,0x80,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x02,0x06,0x02,0x00,0x01,0x01,0x00,0x59,0x02,0x06,0x02,0x00,\r\n0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x01,0x00,0x20,0x1f,0x1b,0x18,0x14,0x13,0x10,0x0e,0x09,0x06,0x00,0x23,0x01,0x23,0x07,0x07,0x16,0x2b,0x01,0x32,0x16,0x17,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x17,0x33,0x35,0x34,0x36,0x1e,0x01,0x07,0x14,0x06,0x2b,0x01,0x22,0x26,0x35,0x34,0x26,0x22,0x06,0x17,0x15,\r\n0x02,0x4d,0x17,0x1e,0x01,0x20,0x16,0xfd,0xe9,0x17,0x1e,0x01,0x20,0x16,0x11,0x94,0xcc,0x96,0x02,0x14,0x0f,0x24,0x0e,0x16,0x54,0x76,0x54,0x01,0x01,0xa5,0x1e,0x17,0xfe,0xbe,0x16,0x1e,0x01,0x20,0x15,0x01,0x42,0x16,0x20,0x01,0xb3,0x67,0x94,0x02,0x90,0x69,0x0e,0x16,0x16,0x0e,0x3b,0x54,0x54,0x3b,0xb3,0x00,0x00,0x08,0x00,0x00,\r\n0xff,0x9f,0x03,0x8f,0x03,0x1d,0x00,0x04,0x00,0x09,0x00,0x0e,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x2b,0x00,0x33,0x00,0x41,0x40,0x3e,0x21,0x20,0x15,0x14,0x0e,0x01,0x06,0x00,0x4a,0x31,0x30,0x25,0x24,0x10,0x09,0x06,0x01,0x49,0x05,0x04,0x02,0x08,0x04,0x00,0x01,0x00,0x85,0x07,0x06,0x09,0x03,0x04,0x01,0x01,0x76,0x0f,0x0f,0x00,\r\n0x00,0x2d,0x2c,0x29,0x28,0x1d,0x1c,0x19,0x18,0x0f,0x13,0x0f,0x13,0x0b,0x0a,0x06,0x05,0x00,0x04,0x00,0x04,0x0a,0x07,0x16,0x2b,0x01,0x35,0x1e,0x01,0x17,0x07,0x33,0x0e,0x01,0x07,0x03,0x23,0x3e,0x01,0x37,0x11,0x15,0x2e,0x01,0x27,0x01,0x35,0x1e,0x01,0x17,0x23,0x2e,0x01,0x01,0x23,0x3e,0x01,0x37,0x15,0x0e,0x01,0x01,0x15,0x2e,\r\n0x01,0x27,0x33,0x1e,0x01,0x01,0x33,0x0e,0x01,0x07,0x35,0x3e,0x01,0x02,0x09,0x3c,0x56,0x10,0xa2,0xa2,0x10,0x56,0x3c,0x71,0xa2,0x10,0x56,0x3c,0x3c,0x56,0x10,0x01,0x13,0x98,0xda,0x14,0x71,0x12,0x9a,0xfe,0x11,0x71,0x13,0xda,0x99,0x6a,0x98,0x01,0x02,0x9a,0xd8,0x14,0x71,0x12,0x9a,0x01,0xef,0x71,0x15,0xd8,0x99,0x69,0x9a,0x01,\r\n0x97,0xa2,0x10,0x58,0x3a,0x71,0x3b,0x58,0x0f,0x01,0x13,0x3b,0x56,0x11,0xfe,0xed,0xa2,0x10,0x56,0x3c,0x01,0x86,0x71,0x13,0xda,0x99,0x6b,0x98,0xfe,0xfd,0x98,0xda,0x14,0x71,0x12,0x98,0xfe,0x0f,0x72,0x13,0xdc,0x98,0x6b,0x98,0x01,0x03,0x99,0xda,0x14,0x72,0x12,0x98,0x00,0x04,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x03,\r\n0x00,0x21,0x00,0x31,0x00,0x45,0x00,0x53,0x40,0x50,0x2b,0x2a,0x23,0x22,0x04,0x08,0x04,0x01,0x4c,0x0d,0x01,0x04,0x06,0x01,0x08,0x02,0x4b,0x00,0x08,0x04,0x03,0x04,0x08,0x03,0x80,0x00,0x03,0x06,0x04,0x03,0x06,0x7e,0x00,0x06,0x00,0x01,0x00,0x06,0x01,0x68,0x07,0x01,0x04,0x04,0x0a,0x5f,0x00,0x0a,0x0a,0x13,0x4d,0x05,0x02,0x02,\r\n0x00,0x00,0x09,0x5f,0x00,0x09,0x09,0x11,0x09,0x4e,0x40,0x3d,0x38,0x35,0x17,0x26,0x33,0x11,0x13,0x3b,0x11,0x11,0x10,0x0b,0x07,0x1f,0x2b,0x17,0x21,0x35,0x21,0x05,0x33,0x11,0x34,0x26,0x2f,0x01,0x2e,0x01,0x07,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x35,0x23,0x11,0x33,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x07,0x03,0x35,0x34,\r\n0x26,0x2b,0x01,0x22,0x06,0x17,0x15,0x14,0x16,0x37,0x33,0x32,0x36,0x05,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x1f,0x01,0x1e,0x01,0xd6,0x01,0xad,0xfe,0x53,0x01,0xf4,0x48,0x0c,0x05,0x9d,0x05,0x1c,0x08,0x1e,0x17,0xfe,0xbe,0x16,0x1e,0x01,0x48,0x48,0x20,0x15,0x01,0xd1,0x16,0x20,0x01,0xd6,\r\n0x0a,0x08,0x6b,0x07,0x0c,0x01,0x0a,0x08,0x6b,0x07,0x0c,0x01,0x64,0x1e,0x17,0xfd,0x12,0x17,0x1e,0x01,0x20,0x16,0x02,0x05,0x17,0x36,0x0f,0x9c,0x10,0x16,0x07,0xd6,0xd6,0x01,0xf4,0x08,0x1a,0x07,0x9c,0x06,0x0c,0x01,0xe8,0x16,0x20,0x20,0x16,0xe8,0xfd,0x36,0xe8,0x16,0x20,0x20,0x16,0x01,0x1e,0xb2,0x08,0x0a,0x0a,0x08,0xb2,0x07,\r\n0x0c,0x01,0x0a,0x0a,0xfd,0xfa,0x16,0x20,0x20,0x16,0x02,0xee,0x16,0x20,0x18,0x0e,0x9d,0x0f,0x36,0x00,0x00,0x02,0xff,0xff,0xff,0xb1,0x03,0xe8,0x03,0x0b,0x00,0x03,0x00,0x13,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x03,0x5f,0x00,0x03,0x03,0x13,0x4d,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x35,0x34,0x11,0x10,0x04,\r\n0x07,0x1a,0x2b,0x37,0x21,0x11,0x21,0x25,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x37,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x8f,0x02,0xca,0xfd,0x36,0x03,0x59,0x34,0x25,0xfc,0xca,0x24,0x36,0x01,0x34,0x25,0x03,0x36,0x25,0x34,0x40,0x01,0xad,0xc4,0xfd,0x5a,0x25,0x34,0x01,0x36,0x24,0x02,0xa6,0x25,0x34,0x01,0x36,0x00,0x03,0xff,0xfd,\r\n0xff,0xb1,0x03,0x5f,0x03,0x0b,0x00,0x08,0x00,0x15,0x00,0x22,0x00,0x32,0x40,0x2f,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x69,0x06,0x01,0x02,0x02,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x03,0x03,0x04,0x61,0x00,0x04,0x04,0x11,0x04,0x4e,0x0a,0x09,0x20,0x1f,0x1a,0x19,0x10,0x0f,0x09,0x15,0x0a,0x15,0x13,0x12,0x07,0x07,0x18,0x2b,\r\n0x01,0x14,0x06,0x22,0x2e,0x01,0x36,0x32,0x16,0x27,0x22,0x0e,0x02,0x1e,0x01,0x32,0x3e,0x01,0x2e,0x02,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x32,0x1e,0x01,0x02,0x3b,0x52,0x78,0x52,0x02,0x56,0x74,0x56,0x90,0x53,0x8c,0x50,0x02,0x54,0x88,0xaa,0x86,0x56,0x04,0x4e,0x8e,0x01,0x5b,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,\r\n0xf4,0xba,0x7e,0x01,0x5e,0x3b,0x54,0x54,0x76,0x54,0x54,0xf5,0x52,0x8c,0xa4,0x8c,0x52,0x52,0x8c,0xa4,0x8c,0x52,0xfe,0xd0,0x75,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x6a,0x02,0x83,0x03,0x0b,0x00,0x0b,0x00,0x2e,0x00,0x35,0x40,0x32,0x07,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x03,0x02,\r\n0x03,0x86,0x09,0x05,0x02,0x01,0x04,0x01,0x02,0x03,0x01,0x02,0x67,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x00,0x07,0x07,0x13,0x00,0x4e,0x2d,0x2c,0x13,0x33,0x11,0x14,0x22,0x33,0x15,0x15,0x13,0x0a,0x07,0x1f,0x2b,0x01,0x35,0x34,0x26,0x22,0x06,0x1d,0x01,0x14,0x16,0x32,0x36,0x05,0x14,0x06,0x27,0x23,0x03,0x0e,0x01,0x07,0x23,0x22,\r\n0x27,0x03,0x23,0x22,0x26,0x27,0x34,0x36,0x33,0x11,0x22,0x2e,0x01,0x36,0x37,0x21,0x32,0x16,0x14,0x06,0x27,0x11,0x32,0x16,0x01,0x0c,0x0a,0x10,0x0a,0x0a,0x10,0x0a,0x01,0x77,0x16,0x0e,0xef,0x1d,0x01,0x0a,0x06,0x01,0x0f,0x02,0x2b,0xe1,0x0f,0x14,0x01,0x58,0x37,0x1d,0x2a,0x02,0x2e,0x1b,0x01,0x65,0x1d,0x2a,0x2a,0x1d,0x37,0x58,\r\n0x01,0x70,0xfa,0x08,0x0a,0x0a,0x08,0xfa,0x08,0x0a,0x0a,0xbd,0x0e,0x16,0x01,0xfe,0xf2,0x07,0x08,0x01,0x0f,0x01,0x0f,0x14,0x0f,0x45,0x6e,0x01,0x1e,0x2a,0x3a,0x2a,0x01,0x2c,0x38,0x2c,0x01,0xfe,0xe2,0x6e,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5b,0x03,0x0b,0x00,0x24,0x00,0x47,0x00,0x4b,0x40,0x48,0x43,0x25,0x02,0x06,0x09,0x2f,\r\n0x01,0x05,0x06,0x17,0x01,0x03,0x02,0x08,0x01,0x01,0x03,0x04,0x4c,0x00,0x09,0x07,0x01,0x05,0x02,0x09,0x05,0x67,0x04,0x01,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x06,0x06,0x08,0x61,0x00,0x08,0x08,0x13,0x4d,0x00,0x03,0x03,0x00,0x61,0x00,0x00,0x00,0x11,0x00,0x4e,0x46,0x45,0x26,0x25,0x25,0x36,0x25,0x26,0x35,0x14,0x24,0x0a,\r\n0x07,0x1f,0x2b,0x01,0x14,0x15,0x0e,0x01,0x23,0x22,0x26,0x27,0x07,0x06,0x22,0x26,0x3d,0x01,0x34,0x36,0x3b,0x01,0x32,0x16,0x06,0x0f,0x01,0x1e,0x01,0x37,0x32,0x36,0x37,0x36,0x37,0x36,0x3b,0x01,0x32,0x16,0x13,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x36,0x3f,0x01,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x06,0x2b,0x01,0x22,0x26,0x37,\r\n0x35,0x3e,0x01,0x33,0x32,0x16,0x17,0x37,0x36,0x32,0x16,0x03,0x4b,0x24,0xe4,0x99,0x51,0x98,0x3c,0x48,0x0b,0x1c,0x16,0x16,0x0e,0xfa,0x0e,0x16,0x02,0x09,0x4d,0x28,0x64,0x37,0x4a,0x82,0x27,0x06,0x18,0x04,0x0c,0x6b,0x08,0x0a,0x0e,0x14,0x10,0xfa,0x0e,0x16,0x02,0x09,0x4d,0x52,0x70,0x4b,0x82,0x27,0x06,0x17,0x05,0x0c,0x6f,0x07,\r\n0x0c,0x01,0x24,0xe6,0x99,0x51,0x9a,0x3c,0x48,0x0b,0x1c,0x18,0x01,0x05,0x03,0x01,0x96,0xba,0x3e,0x39,0x48,0x0b,0x16,0x0e,0xfa,0x0e,0x16,0x16,0x1c,0x0b,0x4d,0x24,0x2a,0x01,0x4a,0x3e,0x0a,0x38,0x0d,0x0c,0x01,0xb8,0xfa,0x0e,0x16,0x16,0x1c,0x0b,0x4d,0x4d,0x4a,0x3e,0x0a,0x38,0x0d,0x0c,0x06,0x04,0x96,0xba,0x3e,0x39,0x48,0x0b,\r\n0x16,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x20,0x40,0x1d,0x18,0x10,0x08,0x00,0x04,0x00,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x13,0x4d,0x02,0x01,0x00,0x00,0x11,0x00,0x4e,0x35,0x35,0x35,0x33,0x04,0x07,0x1a,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,\r\n0x33,0x21,0x32,0x16,0x05,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x03,0x59,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x0f,0x16,0xfe,0x0b,0x14,0x10,0xfe,0xe3,0x0f,0x14,0x01,0x16,0x0e,0x01,0x1d,0x0f,0x16,0x02,0xe7,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x0e,\r\n0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x00,0x00,0x01,0x00,0x00,0xff,0xb1,0x03,0x5a,0x03,0x0b,0x00,0x0f,0x00,0x1a,0x40,0x17,0x08,0x00,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x13,0x4d,0x00,0x00,0x00,0x11,0x00,0x4e,0x35,0x33,0x02,0x07,0x18,0x2b,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x27,0x11,0x34,0x36,\r\n0x33,0x21,0x32,0x16,0x03,0x59,0x14,0x10,0xfc,0xef,0x0f,0x14,0x01,0x16,0x0e,0x03,0x11,0x0f,0x16,0x02,0xe7,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x16,0x00,0x01,0xff,0xfe,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x30,0x00,0x3a,0x40,0x37,0x2d,0x01,0x01,0x05,0x09,0x01,0x00,0x01,0x02,0x4c,0x00,0x00,0x01,0x03,0x01,0x00,\r\n0x03,0x80,0x00,0x03,0x02,0x01,0x03,0x02,0x7e,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x13,0x4d,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x11,0x04,0x4e,0x27,0x27,0x13,0x27,0x24,0x33,0x06,0x07,0x1c,0x2b,0x01,0x15,0x14,0x06,0x2b,0x01,0x22,0x26,0x3f,0x01,0x26,0x23,0x22,0x0e,0x02,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x3e,0x01,\r\n0x1f,0x01,0x1e,0x01,0x07,0x0e,0x01,0x07,0x22,0x2e,0x02,0x3e,0x03,0x33,0x32,0x16,0x17,0x37,0x36,0x16,0x03,0x59,0x14,0x10,0xfa,0x17,0x13,0x11,0x4d,0x52,0x70,0x3a,0x6a,0x4c,0x2e,0x2e,0x4c,0x6a,0x3a,0x42,0x76,0x29,0x04,0x11,0x06,0x4c,0x05,0x02,0x06,0x3c,0xae,0x5f,0x57,0xa0,0x70,0x48,0x04,0x40,0x78,0x98,0x5b,0x52,0x98,0x3d,\r\n0x48,0x11,0x2c,0x02,0xc3,0xfa,0x0e,0x16,0x2d,0x10,0x4d,0x4d,0x2e,0x4c,0x6a,0x74,0x6a,0x4c,0x2e,0x3a,0x35,0x06,0x01,0x05,0x4d,0x04,0x0e,0x06,0x4a,0x50,0x01,0x44,0x74,0x9e,0xae,0x9e,0x74,0x44,0x3e,0x39,0x48,0x12,0x13,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x01,0xe6,0x00,0x15,0x00,0x19,0x40,0x16,0x0f,0x01,0x00,0x01,\r\n0x01,0x4c,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x14,0x17,0x14,0x03,0x07,0x19,0x2b,0x01,0x14,0x07,0x01,0x06,0x22,0x27,0x01,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x37,0x36,0x32,0x1f,0x01,0x16,0x02,0x58,0x06,0xfe,0xfc,0x05,0x10,0x04,0xfe,0xfc,0x06,0x06,0x1c,0x05,0x0e,0x06,0xdb,0xdc,0x05,0x10,0x04,0x1c,0x06,\r\n0x01,0xb7,0x07,0x05,0xfe,0xfb,0x05,0x05,0x01,0x05,0x05,0x0e,0x06,0x1c,0x06,0x06,0xdb,0xdb,0x06,0x06,0x1c,0x05,0x00,0x00,0x00,0x03,0xff,0xfd,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x0c,0x00,0x1c,0x00,0x2e,0x00,0x41,0x40,0x3e,0x28,0x1e,0x02,0x05,0x04,0x16,0x15,0x0e,0x03,0x03,0x02,0x02,0x4c,0x00,0x05,0x00,0x02,0x03,0x05,0x02,\r\n0x67,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x13,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x11,0x01,0x4e,0x01,0x00,0x2c,0x2a,0x23,0x21,0x1a,0x18,0x12,0x10,0x07,0x06,0x00,0x0c,0x01,0x0c,0x07,0x07,0x16,0x2b,0x01,0x32,0x1e,0x01,0x14,0x0e,0x01,0x22,0x2e,0x02,0x3e,0x01,0x13,0x35,0x34,0x26,0x2b,0x01,0x22,0x06,0x07,\r\n0x15,0x14,0x16,0x17,0x33,0x32,0x36,0x27,0x13,0x34,0x27,0x26,0x2b,0x01,0x22,0x07,0x06,0x15,0x13,0x14,0x16,0x3b,0x01,0x32,0x36,0x01,0xad,0x74,0xc6,0x72,0x72,0xc6,0xe8,0xc8,0x6e,0x06,0x7a,0xbc,0xc1,0x0a,0x07,0x6b,0x08,0x0a,0x01,0x0c,0x07,0x6b,0x07,0x0a,0x01,0x0a,0x06,0x05,0x08,0x7b,0x08,0x05,0x06,0x0a,0x0a,0x09,0x67,0x08,\r\n0x0a,0x03,0x0b,0x74,0xc4,0xea,0xc4,0x74,0x74,0xc4,0xea,0xc4,0x74,0xfd,0x48,0x6a,0x08,0x0a,0x0a,0x08,0x6a,0x08,0x0a,0x01,0x0c,0xc7,0x01,0x5a,0x07,0x03,0x05,0x05,0x03,0x07,0xfe,0xa6,0x06,0x08,0x08,0x00,0x00,0x01,0x00,0x00,0xff,0xef,0x02,0xd4,0x02,0x86,0x00,0x24,0x00,0x26,0x40,0x23,0x22,0x19,0x10,0x07,0x04,0x00,0x02,0x01,\r\n0x4c,0x03,0x01,0x02,0x00,0x00,0x02,0x59,0x03,0x01,0x02,0x02,0x00,0x61,0x01,0x01,0x00,0x02,0x00,0x51,0x14,0x1c,0x14,0x14,0x04,0x07,0x1a,0x2b,0x25,0x14,0x0f,0x01,0x06,0x22,0x2f,0x01,0x07,0x06,0x22,0x2f,0x01,0x26,0x34,0x3f,0x01,0x27,0x26,0x34,0x3f,0x01,0x36,0x32,0x1f,0x01,0x37,0x36,0x32,0x1f,0x01,0x16,0x14,0x0f,0x01,0x17,\r\n0x16,0x02,0xd4,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa4,0xa4,0x10,0x10,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x0f,0x0f,0xa4,0xa4,0x0f,0x70,0x16,0x10,0x4c,0x0f,0x0f,0xa5,0xa5,0x0f,0x0f,0x4c,0x10,0x2c,0x10,0xa4,0xa4,0x10,0x2c,0x10,0x4c,0x10,0x10,0xa4,0xa4,0x10,0x10,0x4c,0x0f,0x2e,\r\n0x0f,0xa4,0xa4,0x0f,0x00,0x03,0x00,0x00,0xff,0xb1,0x03,0xc5,0x03,0x0b,0x00,0x0c,0x00,0x1c,0x00,0x2c,0x00,0x34,0x40,0x31,0x25,0x1d,0x02,0x04,0x05,0x00,0x01,0x01,0x00,0x02,0x4c,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x67,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,\r\n0x35,0x35,0x35,0x35,0x24,0x32,0x06,0x07,0x1c,0x2b,0x01,0x34,0x26,0x07,0x23,0x22,0x0e,0x01,0x16,0x17,0x33,0x32,0x36,0x25,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x37,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x02,0x5f,0x14,0x10,0x8e,0x0f,0x14,0x02,0x18,\r\n0x0d,0x8e,0x0f,0x16,0x01,0x41,0x16,0x0e,0xfc,0xee,0x0e,0x16,0x16,0x0e,0x03,0x12,0x0e,0x16,0x23,0x14,0x0f,0xfc,0xa6,0x0e,0x16,0x01,0x14,0x0f,0x03,0x5a,0x0e,0x16,0x01,0x82,0x0e,0x16,0x01,0x14,0x1e,0x14,0x01,0x16,0x79,0xfd,0xe8,0x0e,0x16,0x16,0x0e,0x02,0x18,0x0e,0x16,0x16,0xec,0x8f,0x0e,0x16,0x16,0x0e,0x8f,0x0e,0x16,0x16,\r\n0x00,0x05,0x00,0x00,0xff,0x88,0x03,0xac,0x03,0x34,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x5e,0x00,0x67,0x00,0x61,0x40,0x5e,0x3c,0x33,0x02,0x05,0x0a,0x1a,0x0f,0x02,0x01,0x05,0x2b,0x22,0x19,0x10,0x09,0x00,0x06,0x08,0x01,0x03,0x4c,0x07,0x01,0x05,0x03,0x01,0x01,0x08,0x05,0x01,0x67,0x00,0x0a,0x0f,0x0c,0x02,0x08,0x09,0x0a,0x08,\r\n0x69,0x10,0x0e,0x0d,0x03,0x09,0x04,0x02,0x02,0x00,0x09,0x00,0x65,0x00,0x0b,0x0b,0x06,0x61,0x00,0x06,0x06,0x12,0x0b,0x4e,0x60,0x5f,0x64,0x63,0x5f,0x67,0x60,0x67,0x5d,0x5c,0x59,0x58,0x54,0x53,0x50,0x4f,0x4b,0x4a,0x15,0x36,0x16,0x37,0x18,0x36,0x16,0x36,0x14,0x11,0x07,0x1f,0x2b,0x25,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,\r\n0x37,0x35,0x34,0x2b,0x01,0x22,0x27,0x15,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x35,0x06,0x2b,0x01,0x22,0x0e,0x01,0x1d,0x01,0x16,0x15,0x14,0x06,0x22,0x26,0x35,0x34,0x37,0x35,0x34,0x36,0x3b,0x01,0x32,0x3d,0x01,0x26,0x35,0x34,0x36,0x32,0x16,0x15,0x14,0x07,0x15,0x14,0x3b,0x01,0x32,0x16,0x15,0x05,0x34,0x26,0x22,0x06,\r\n0x14,0x16,0x32,0x36,0x13,0x14,0x16,0x32,0x36,0x34,0x26,0x22,0x06,0x13,0x34,0x26,0x22,0x06,0x14,0x16,0x32,0x36,0x05,0x32,0x36,0x34,0x26,0x22,0x06,0x14,0x16,0x03,0x64,0x48,0x46,0x64,0x46,0x48,0x4c,0x64,0x2c,0x22,0x48,0x46,0x64,0x46,0x48,0x1e,0x2e,0x64,0x22,0x26,0x06,0x48,0x46,0x64,0x46,0x48,0x56,0x58,0x64,0x4c,0x48,0x46,\r\n0x64,0x46,0x48,0x4e,0x64,0x56,0x56,0xfd,0x5a,0x2a,0x38,0x28,0x28,0x38,0x2a,0xd4,0x28,0x38,0x2a,0x2a,0x38,0x28,0x8a,0x2a,0x38,0x28,0x28,0x38,0x2a,0x01,0x18,0x1c,0x2a,0x2a,0x38,0x28,0x28,0x70,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x72,0x4e,0x0c,0xcc,0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0xcc,0x0c,0x26,0x1c,0x0c,0x72,\r\n0x22,0x4e,0x32,0x46,0x46,0x32,0x4e,0x22,0x72,0x40,0x6c,0x34,0x8c,0x22,0x4c,0x32,0x46,0x46,0x32,0x4c,0x22,0x8c,0x34,0x6c,0x40,0xe2,0x1e,0x28,0x28,0x3a,0x28,0x28,0x02,0xd8,0x1c,0x28,0x28,0x3a,0x28,0x28,0xfd,0x26,0x1e,0x28,0x28,0x3a,0x28,0x28,0x28,0x28,0x3a,0x28,0x28,0x3a,0x28,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x59,\r\n0x03,0x0b,0x00,0x23,0x00,0x33,0x00,0x3e,0x40,0x3b,0x0d,0x01,0x00,0x01,0x1f,0x01,0x04,0x03,0x02,0x4c,0x02,0x01,0x00,0x01,0x03,0x01,0x00,0x03,0x80,0x05,0x01,0x03,0x04,0x01,0x03,0x04,0x7e,0x00,0x01,0x01,0x07,0x5f,0x00,0x07,0x07,0x13,0x4d,0x00,0x04,0x04,0x06,0x60,0x00,0x06,0x06,0x11,0x06,0x4e,0x35,0x35,0x23,0x33,0x16,0x23,\r\n0x24,0x23,0x08,0x07,0x1e,0x2b,0x01,0x35,0x34,0x26,0x07,0x23,0x35,0x34,0x26,0x27,0x23,0x22,0x06,0x07,0x15,0x23,0x22,0x06,0x07,0x15,0x14,0x16,0x37,0x33,0x15,0x14,0x16,0x3b,0x01,0x32,0x36,0x37,0x35,0x33,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0xca,0x14,0x0f,0xb3,0x16,\r\n0x0e,0x47,0x0f,0x14,0x01,0xb2,0x0f,0x14,0x01,0x16,0x0e,0xb2,0x16,0x0e,0x47,0x0f,0x14,0x01,0xb3,0x0e,0x16,0x8e,0x5e,0x43,0xfd,0xe9,0x43,0x5e,0x5e,0x43,0x02,0x17,0x43,0x5e,0x01,0x3a,0x48,0x0e,0x16,0x01,0xb3,0x0f,0x14,0x01,0x16,0x0e,0xb3,0x14,0x0f,0x48,0x0e,0x16,0x01,0xb3,0x0e,0x16,0x16,0x0e,0xb3,0x14,0x01,0x3f,0xfd,0xe8,\r\n0x42,0x5e,0x01,0x60,0x41,0x02,0x18,0x42,0x5e,0x01,0x60,0x00,0x00,0x02,0x00,0x00,0xff,0xb1,0x03,0x59,0x03,0x0b,0x00,0x0f,0x00,0x1f,0x00,0x1f,0x40,0x1c,0x00,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x13,0x4d,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x11,0x02,0x4e,0x35,0x35,0x26,0x33,0x04,0x07,0x1a,0x2b,0x01,0x35,0x34,0x26,0x07,\r\n0x21,0x22,0x06,0x07,0x15,0x14,0x16,0x37,0x21,0x32,0x36,0x13,0x11,0x14,0x06,0x07,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x37,0x21,0x32,0x16,0x02,0xca,0x14,0x0f,0xfe,0x0c,0x0f,0x14,0x01,0x16,0x0e,0x01,0xf4,0x0e,0x16,0x8e,0x5e,0x43,0xfd,0xe9,0x43,0x5e,0x5e,0x43,0x02,0x17,0x43,0x5e,0x01,0x3a,0x48,0x0e,0x16,0x01,0x14,0x0f,0x48,\r\n0x0e,0x16,0x01,0x14,0x01,0x3f,0xfd,0xe8,0x42,0x5e,0x01,0x60,0x41,0x02,0x18,0x42,0x5e,0x01,0x60,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x07,0xb3,0xdb,0xee,0x5f,0x0f,0x3c,0xf5,0x00,0x0f,0x03,0xe8,0x00,0x00,0x00,0x00,0xe4,0x2d,0xc8,0x06,0x00,0x00,0x00,0x00,0xe4,0x2d,0xc8,0x07,0xff,0xf5,0xff,0x6a,0x04,0x78,0x03,0x53,\r\n0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0x52,0xff,0x6a,0x00,0x00,0x04,0x76,0xff,0xf5,0xff,0xf5,0x04,0x78,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x03,0xe8,0x00,0x00,0x03,0x11,0x00,0x00,0x02,0x80,0x00,0x00,0x03,0xe8,0x00,0x00,\r\n0x04,0x2f,0xff,0xff,0x00,0xf0,0x00,0x00,0x04,0x76,0xff,0xff,0x03,0xe8,0xff,0xff,0x03,0xe8,0x00,0x00,0x02,0x44,0x00,0x00,0x02,0x44,0x00,0x00,0x03,0x59,0xff,0xfd,0x02,0x3b,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0x11,0x00,0x00,0x03,0xac,0x00,0x00,0x03,0xe8,0x00,0x00,0x00,0xdc,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,\r\n0x02,0x3b,0xff,0xff,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,0x03,0x98,0xff,0xfc,0x03,0x59,0x00,0x00,0x03,0xca,0x00,0x00,0x04,0x2f,0xff,0xff,0x03,0xa0,0x00,0x00,0x02,0xf8,0x00,0x00,0x03,0xd4,0xff,0xf7,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0xff,0xff,0x02,0x82,0x00,0x00,\r\n0x02,0xda,0x00,0x00,0x04,0x2f,0xff,0xff,0x02,0xf8,0x00,0x00,0x03,0x59,0xff,0xfd,0x03,0x59,0x00,0x00,0x03,0x59,0xff,0xff,0x02,0xda,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x02,0xf8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0xff,0xf5,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0x11,0x00,0x00,\r\n0x03,0x11,0x00,0x00,0x02,0x82,0x00,0x00,0x03,0x42,0x00,0x00,0x04,0x2f,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xe7,0xff,0xfe,0x03,0x59,0x00,0x00,0x03,0x11,0x00,0x00,0x02,0x3b,0xff,0xff,0x03,0x98,0xff,0xfc,0x03,0x59,0x00,0x00,0x02,0x82,0x00,0x00,0x03,0xa0,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0xe8,0xff,0xff,\r\n0x03,0x59,0xff,0xfd,0x02,0x82,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0xff,0xfe,0x02,0x82,0x00,0x00,0x03,0x59,0xff,0xfd,0x03,0x11,0x00,0x00,0x03,0xe8,0x00,0x00,0x03,0xac,0x00,0x00,0x03,0x59,0x00,0x00,0x03,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0xe0,0x01,0x76,0x01,0xf0,\r\n0x02,0x46,0x02,0x9e,0x02,0xc4,0x03,0x10,0x03,0x46,0x03,0x68,0x03,0x8c,0x03,0xb8,0x04,0x42,0x05,0x04,0x05,0x60,0x05,0xf4,0x06,0x18,0x06,0x42,0x06,0x64,0x06,0x8e,0x06,0xc6,0x06,0xfe,0x07,0xa6,0x07,0xf8,0x08,0xa0,0x08,0xf2,0x09,0x20,0x09,0x42,0x09,0x8e,0x09,0xd6,0x0a,0x98,0x0b,0x82,0x0c,0x0e,0x0c,0xfa,0x0d,0x3e,0x0d,0x64,\r\n0x0d,0xc6,0x0e,0x2a,0x0e,0x6c,0x0f,0x1e,0x0f,0xce,0x0f,0xf6,0x10,0x4a,0x11,0x7c,0x11,0x9a,0x11,0xd2,0x12,0x3c,0x12,0x98,0x12,0xf8,0x14,0x00,0x14,0x80,0x14,0xe0,0x15,0x1a,0x15,0xde,0x16,0x6a,0x16,0xc0,0x17,0xce,0x18,0x30,0x18,0x88,0x18,0xa6,0x18,0xe4,0x19,0x80,0x19,0xe8,0x1a,0x3c,0x1a,0xb8,0x1b,0x48,0x1b,0x7c,0x1b,0xd0,\r\n0x1c,0x32,0x1c,0xc0,0x1d,0x04,0x1d,0x2e,0x1d,0x94,0x1d,0xca,0x1e,0x32,0x1e,0x80,0x1e,0xde,0x1f,0x9a,0x20,0x04,0x20,0x48,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x90,0x00,0x0d,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x42,0x00,0x7b,0x00,0x8d,0x00,0x00,0x00,0xba,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0xde,0x00,0x01,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x35,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x07,0x00,0x3d,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x08,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x00,\r\n0x00,0x05,0x00,0x0b,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x08,0x00,0x5f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x2b,0x00,0x67,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x13,0x00,0x92,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x6a,0x00,0xa5,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x10,\r\n0x01,0x0f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,0x01,0x1f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x10,0x01,0x2d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x10,0x01,0x3d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x16,0x01,0x4d,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x10,0x01,0x63,0x00,0x03,\r\n0x00,0x01,0x04,0x09,0x00,0x0a,0x00,0x56,0x01,0x73,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x26,0x01,0xc9,0x43,0x6f,0x70,0x79,0x72,0x69,0x67,0x68,0x74,0x20,0x28,0x43,0x29,0x20,0x32,0x30,0x32,0x35,0x20,0x62,0x79,0x20,0x6f,0x72,0x69,0x67,0x69,0x6e,0x61,0x6c,0x20,0x61,0x75,0x74,0x68,0x6f,0x72,0x73,0x20,0x40,0x20,0x66,\r\n0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x2e,0x63,0x6f,0x6d,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x52,0x65,0x67,0x75,0x6c,0x61,0x72,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x56,0x65,0x72,0x73,0x69,0x6f,0x6e,0x20,0x31,0x2e,0x30,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x47,0x65,0x6e,\r\n0x65,0x72,0x61,0x74,0x65,0x64,0x20,0x62,0x79,0x20,0x73,0x76,0x67,0x32,0x74,0x74,0x66,0x20,0x66,0x72,0x6f,0x6d,0x20,0x46,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x20,0x70,0x72,0x6f,0x6a,0x65,0x63,0x74,0x2e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x66,0x6f,0x6e,0x74,0x65,0x6c,0x6c,0x6f,0x2e,0x63,0x6f,0x6d,0x00,0x43,0x00,0x6f,0x00,\r\n0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x28,0x00,0x43,0x00,0x29,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x32,0x00,0x35,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x69,0x00,0x6e,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x61,0x00,0x75,0x00,0x74,0x00,\r\n0x68,0x00,0x6f,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x40,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,\r\n0x61,0x00,0x72,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x31,0x00,0x2e,0x00,0x30,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,\r\n0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x47,0x00,0x65,0x00,0x6e,0x00,0x65,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x73,0x00,0x76,0x00,0x67,0x00,0x32,0x00,0x74,0x00,0x74,0x00,0x66,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x46,0x00,\r\n0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x2e,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x2e,0x00,\r\n0x63,0x00,0x6f,0x00,0x6d,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x51,0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c,\r\n0x01,0x0d,0x01,0x0e,0x01,0x0f,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0x13,0x01,0x14,0x01,0x15,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x01,0x25,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x01,0x2c,\r\n0x01,0x2d,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x01,0x32,0x01,0x33,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x01,0x38,0x01,0x39,0x01,0x3a,0x01,0x3b,0x01,0x3c,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x01,0x42,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4c,\r\n0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x51,0x01,0x52,0x00,0x0b,0x63,0x68,0x65,0x63,0x6b,0x2d,0x65,0x6d,0x70,0x74,0x79,0x0d,0x66,0x6c,0x6f,0x77,0x2d,0x70,0x61,0x72,0x61,0x6c,0x6c,0x65,0x6c,0x04,0x64,0x6f,0x63,0x73,0x07,0x70,0x69,0x63,0x74,0x75,0x72,0x65,0x09,0x66,0x6c,0x6f,0x77,0x2d,0x6c,0x69,0x6e,0x65,0x0e,0x77,\r\n0x69,0x6e,0x64,0x6f,0x77,0x2d,0x72,0x65,0x73,0x74,0x6f,0x72,0x65,0x0f,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x6d,0x69,0x6e,0x69,0x6d,0x69,0x7a,0x65,0x04,0x63,0x75,0x62,0x65,0x04,0x70,0x6c,0x75,0x73,0x05,0x6d,0x69,0x6e,0x75,0x73,0x06,0x63,0x69,0x72,0x63,0x6c,0x65,0x08,0x64,0x6f,0x77,0x6e,0x2d,0x64,0x69,0x72,0x05,0x63,0x68,\r\n0x65,0x63,0x6b,0x0b,0x74,0x72,0x61,0x73,0x68,0x2d,0x65,0x6d,0x70,0x74,0x79,0x04,0x75,0x73,0x65,0x72,0x09,0x62,0x72,0x69,0x65,0x66,0x63,0x61,0x73,0x65,0x03,0x64,0x6f,0x74,0x08,0x6c,0x65,0x66,0x74,0x2d,0x64,0x69,0x72,0x09,0x72,0x69,0x67,0x68,0x74,0x2d,0x64,0x69,0x72,0x06,0x75,0x70,0x2d,0x64,0x69,0x72,0x0a,0x61,0x6e,0x67,\r\n0x6c,0x65,0x2d,0x6c,0x65,0x66,0x74,0x0b,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x72,0x69,0x67,0x68,0x74,0x0c,0x68,0x65,0x6c,0x70,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x03,0x74,0x61,0x67,0x04,0x67,0x72,0x69,0x64,0x0b,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6f,0x70,0x65,0x6e,0x06,0x66,0x6f,0x6c,0x64,0x65,0x72,0x09,0x64,0x6f,0x77,\r\n0x6e,0x2d,0x62,0x6f,0x6c,0x64,0x07,0x70,0x61,0x6c,0x65,0x74,0x74,0x65,0x07,0x64,0x6f,0x63,0x2d,0x69,0x6e,0x76,0x03,0x63,0x6f,0x67,0x02,0x74,0x68,0x0a,0x62,0x69,0x6e,0x6f,0x63,0x75,0x6c,0x61,0x72,0x73,0x04,0x6c,0x69,0x73,0x74,0x04,0x6c,0x6f,0x63,0x6b,0x09,0x6c,0x65,0x66,0x74,0x2d,0x62,0x6f,0x6c,0x64,0x07,0x64,0x65,0x73,\r\n0x6b,0x74,0x6f,0x70,0x06,0x73,0x65,0x61,0x72,0x63,0x68,0x0c,0x63,0x69,0x72,0x63,0x6c,0x65,0x2d,0x65,0x6d,0x70,0x74,0x79,0x06,0x70,0x65,0x6e,0x63,0x69,0x6c,0x03,0x68,0x64,0x64,0x0a,0x72,0x69,0x67,0x68,0x74,0x2d,0x62,0x6f,0x6c,0x64,0x0b,0x63,0x6c,0x6f,0x73,0x65,0x5f,0x70,0x61,0x6e,0x65,0x6c,0x08,0x73,0x74,0x65,0x70,0x69,\r\n0x6e,0x74,0x6f,0x07,0x75,0x70,0x2d,0x62,0x6f,0x6c,0x64,0x02,0x6f,0x6b,0x09,0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x6f,0x6e,0x10,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x5f,0x73,0x70,0x6c,0x69,0x74,0x0e,0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x5f,0x73,0x70,0x6c,0x69,0x74,0x08,0x73,0x74,0x65,0x70,0x6f,0x76,0x65,\r\n0x72,0x10,0x70,0x6c,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x2d,0x61,0x6c,0x74,0x11,0x6d,0x69,0x6e,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x2d,0x61,0x6c,0x74,0x08,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x75,0x70,0x09,0x63,0x6c,0x69,0x70,0x62,0x6f,0x61,0x72,0x64,0x11,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x6f,\r\n0x70,0x65,0x6e,0x2d,0x65,0x6d,0x70,0x74,0x79,0x0c,0x66,0x6f,0x6c,0x64,0x65,0x72,0x2d,0x65,0x6d,0x70,0x74,0x79,0x07,0x73,0x74,0x65,0x70,0x6f,0x75,0x74,0x07,0x67,0x6c,0x61,0x73,0x73,0x65,0x73,0x03,0x64,0x6f,0x63,0x04,0x70,0x6c,0x61,0x79,0x06,0x74,0x6f,0x2d,0x65,0x6e,0x64,0x0c,0x69,0x6e,0x66,0x6f,0x2d,0x63,0x69,0x72,0x63,\r\n0x6c,0x65,0x64,0x03,0x63,0x63,0x77,0x0d,0x6c,0x6f,0x63,0x6b,0x2d,0x6f,0x70,0x65,0x6e,0x2d,0x61,0x6c,0x74,0x06,0x74,0x61,0x72,0x67,0x65,0x74,0x06,0x66,0x6c,0x6f,0x70,0x70,0x79,0x0f,0x77,0x69,0x6e,0x64,0x6f,0x77,0x2d,0x6d,0x61,0x78,0x69,0x6d,0x69,0x7a,0x65,0x0b,0x64,0x6f,0x74,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x03,\r\n0x70,0x69,0x6e,0x09,0x61,0x72,0x72,0x6f,0x77,0x73,0x2d,0x63,0x77,0x05,0x70,0x61,0x75,0x73,0x65,0x04,0x73,0x74,0x6f,0x70,0x02,0x63,0x77,0x0a,0x61,0x6e,0x67,0x6c,0x65,0x2d,0x64,0x6f,0x77,0x6e,0x11,0x61,0x74,0x74,0x65,0x6e,0x74,0x69,0x6f,0x6e,0x2d,0x63,0x69,0x72,0x63,0x6c,0x65,0x64,0x06,0x63,0x61,0x6e,0x63,0x65,0x6c,0x03,\r\n0x62,0x6f,0x78,0x09,0x66,0x6c,0x6f,0x77,0x2d,0x74,0x72,0x65,0x65,0x0c,0x70,0x6c,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x0d,0x6d,0x69,0x6e,0x75,0x73,0x2d,0x73,0x71,0x75,0x61,0x72,0x65,0x64,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x7e,0x01,0x1e,0x00,0x7d,0x00,0x7d,0x01,0x1e,0x03,0x18,0xff,0xb1,0x03,0x38,0x03,0x0b,0xff,0xb1,0xff,0xb1,0x03,0x18,0xff,0xb1,0x03,0x38,0x03,0x0b,0xff,0xb1,0xff,0xb1,0xb0,0x00,0x2c,0x20,0xb0,0x00,0x55,0x58,0x45,0x59,0x20,0x20,0x4b,0xb8,0x00,0x0e,0x51,0x4b,0xb0,0x06,\r\n0x53,0x5a,0x58,0xb0,0x34,0x1b,0xb0,0x28,0x59,0x60,0x66,0x20,0x8a,0x55,0x58,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x62,0x1b,0x21,0x21,0xb0,0x00,0x59,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x01,0x2c,0xb0,0x20,0x60,0x66,0x2d,0xb0,0x02,0x2c,0x23,0x21,0x23,0x21,0x2d,0xb0,\r\n0x03,0x2c,0x20,0x64,0xb3,0x03,0x14,0x15,0x00,0x42,0x43,0xb0,0x13,0x43,0x20,0x60,0x60,0x42,0xb1,0x02,0x14,0x43,0x42,0xb1,0x25,0x03,0x43,0xb0,0x02,0x43,0x54,0x78,0x20,0xb0,0x0c,0x23,0xb0,0x02,0x43,0x43,0x61,0x64,0xb0,0x04,0x50,0x78,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb0,0x21,0x65,0x1c,0x21,0xb0,0x02,0x43,0x43,0xb2,0x0e,\r\n0x15,0x01,0x42,0x1c,0x20,0xb0,0x02,0x43,0x23,0x42,0xb2,0x13,0x01,0x13,0x43,0x60,0x42,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb2,0x16,0x01,0x02,0x43,0x60,0x42,0x2d,0xb0,0x04,0x2c,0xb0,0x03,0x2b,0xb0,0x15,0x43,0x58,0x23,0x21,0x23,0x21,0xb0,0x16,0x43,0x43,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x1b,0x20,0x64,0x20,0xb0,0xc0,0x50,\r\n0xb0,0x04,0x26,0x5a,0xb2,0x28,0x01,0x0d,0x43,0x45,0x63,0x45,0xb0,0x06,0x45,0x58,0x21,0xb0,0x03,0x25,0x59,0x52,0x5b,0x58,0x21,0x23,0x21,0x1b,0x8a,0x58,0x20,0xb0,0x50,0x50,0x58,0x21,0xb0,0x40,0x59,0x1b,0x20,0xb0,0x38,0x50,0x58,0x21,0xb0,0x38,0x59,0x59,0x20,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x61,0x64,0xb0,0x28,0x50,0x58,\r\n0x21,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x20,0xb0,0x30,0x50,0x58,0x21,0xb0,0x30,0x59,0x1b,0x20,0xb0,0xc0,0x50,0x58,0x20,0x66,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x0a,0x50,0x58,0x60,0x1b,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x0a,0x60,0x1b,0x20,0xb0,0x36,0x50,0x58,0x21,0xb0,0x36,0x60,0x1b,0x60,0x59,0x59,0x59,0x1b,0xb0,0x02,0x25,\r\n0xb0,0x0c,0x43,0x63,0xb0,0x00,0x52,0x58,0xb0,0x00,0x4b,0xb0,0x0a,0x50,0x58,0x21,0xb0,0x0c,0x43,0x1b,0x4b,0xb0,0x1e,0x50,0x58,0x21,0xb0,0x1e,0x4b,0x61,0xb8,0x10,0x00,0x63,0xb0,0x0c,0x43,0x63,0xb8,0x05,0x00,0x62,0x59,0x59,0x64,0x61,0x59,0xb0,0x01,0x2b,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x59,0x20,0x64,0xb0,0x16,\r\n0x43,0x23,0x42,0x59,0x2d,0xb0,0x05,0x2c,0x20,0x45,0x20,0xb0,0x04,0x25,0x61,0x64,0x20,0xb0,0x07,0x43,0x50,0x58,0xb0,0x07,0x23,0x42,0xb0,0x08,0x23,0x42,0x1b,0x21,0x21,0x59,0xb0,0x01,0x60,0x2d,0xb0,0x06,0x2c,0x23,0x21,0x23,0x21,0xb0,0x03,0x2b,0x20,0x64,0xb1,0x07,0x62,0x42,0x20,0xb0,0x08,0x23,0x42,0xb0,0x06,0x45,0x58,0x1b,\r\n0xb1,0x01,0x0d,0x43,0x45,0x63,0xb1,0x01,0x0d,0x43,0xb0,0x01,0x60,0x45,0x63,0xb0,0x05,0x2a,0x21,0x20,0xb0,0x08,0x43,0x20,0x8a,0x20,0x8a,0xb0,0x01,0x2b,0xb1,0x30,0x05,0x25,0xb0,0x04,0x26,0x51,0x58,0x60,0x50,0x1b,0x61,0x52,0x59,0x58,0x23,0x59,0x21,0x59,0x20,0xb0,0x40,0x53,0x58,0xb0,0x01,0x2b,0x1b,0x21,0xb0,0x40,0x59,0x23,\r\n0xb0,0x00,0x50,0x58,0x65,0x59,0x2d,0xb0,0x07,0x2c,0xb0,0x09,0x43,0x2b,0xb2,0x00,0x02,0x00,0x43,0x60,0x42,0x2d,0xb0,0x08,0x2c,0xb0,0x09,0x23,0x42,0x23,0x20,0xb0,0x00,0x23,0x42,0x61,0xb0,0x02,0x62,0x66,0xb0,0x01,0x63,0xb0,0x01,0x60,0xb0,0x07,0x2a,0x2d,0xb0,0x09,0x2c,0x20,0x20,0x45,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,\r\n0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0a,0x2c,0xb2,0x09,0x0e,0x00,0x43,0x45,0x42,0x2a,0x21,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0b,0x2c,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0c,0x2c,0x20,0x20,0x45,0x20,0xb0,\r\n0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,0x23,0x61,0x20,0x64,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x00,0x1b,0xb0,0x30,0x50,0x58,0xb0,0x20,0x1b,0xb0,0x40,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0d,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,\r\n0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,0x23,0x61,0x20,0x64,0xb0,0x24,0x50,0x58,0xb0,0x00,0x1b,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0e,0x2c,0x20,0xb0,0x00,0x23,0x42,0xb3,0x0d,0x0c,0x00,0x03,0x45,0x50,0x58,0x21,0x1b,0x23,0x21,\r\n0x59,0x2a,0x21,0x2d,0xb0,0x0f,0x2c,0xb1,0x02,0x02,0x45,0xb0,0x64,0x61,0x44,0x2d,0xb0,0x10,0x2c,0xb0,0x01,0x60,0x20,0x20,0xb0,0x0f,0x43,0x4a,0xb0,0x00,0x50,0x58,0x20,0xb0,0x0f,0x23,0x42,0x59,0xb0,0x10,0x43,0x4a,0xb0,0x00,0x52,0x58,0x20,0xb0,0x10,0x23,0x42,0x59,0x2d,0xb0,0x11,0x2c,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,\r\n0x20,0xb8,0x04,0x00,0x63,0x8a,0x23,0x61,0xb0,0x11,0x43,0x60,0x20,0x8a,0x60,0x20,0xb0,0x11,0x23,0x42,0x23,0x2d,0xb0,0x12,0x2c,0x4b,0x54,0x58,0xb1,0x04,0x64,0x44,0x59,0x24,0xb0,0x0d,0x65,0x23,0x78,0x2d,0xb0,0x13,0x2c,0x4b,0x51,0x58,0x4b,0x53,0x58,0xb1,0x04,0x64,0x44,0x59,0x1b,0x21,0x59,0x24,0xb0,0x13,0x65,0x23,0x78,0x2d,\r\n0xb0,0x14,0x2c,0xb1,0x00,0x12,0x43,0x55,0x58,0xb1,0x12,0x12,0x43,0xb0,0x01,0x61,0x42,0xb0,0x11,0x2b,0x59,0xb0,0x00,0x43,0xb0,0x02,0x25,0x42,0xb1,0x0f,0x02,0x25,0x42,0xb1,0x10,0x02,0x25,0x42,0xb0,0x01,0x16,0x23,0x20,0xb0,0x03,0x25,0x50,0x58,0xb1,0x01,0x00,0x43,0x60,0xb0,0x04,0x25,0x42,0x8a,0x8a,0x20,0x8a,0x23,0x61,0xb0,\r\n0x10,0x2a,0x21,0x23,0xb0,0x01,0x61,0x20,0x8a,0x23,0x61,0xb0,0x10,0x2a,0x21,0x1b,0xb1,0x01,0x00,0x43,0x60,0xb0,0x02,0x25,0x42,0xb0,0x02,0x25,0x61,0xb0,0x10,0x2a,0x21,0x59,0xb0,0x0f,0x43,0x47,0xb0,0x10,0x43,0x47,0x60,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x20,0xb0,0x0e,0x43,0x63,\r\n0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb1,0x00,0x00,0x13,0x23,0x44,0xb0,0x01,0x43,0xb0,0x00,0x3e,0xb2,0x01,0x01,0x01,0x43,0x60,0x42,0x2d,0xb0,0x15,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x01,0x60,\r\n0x42,0x20,0x60,0xb7,0x18,0x18,0x01,0x00,0x11,0x00,0x13,0x00,0x42,0x42,0x42,0x8a,0x60,0x20,0xb0,0x14,0x23,0x42,0xb0,0x01,0x61,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x16,0x2c,0xb1,0x00,0x15,0x2b,0x2d,0xb0,0x17,0x2c,0xb1,0x01,0x15,0x2b,0x2d,0xb0,0x18,0x2c,0xb1,0x02,0x15,0x2b,0x2d,0xb0,0x19,0x2c,0xb1,\r\n0x03,0x15,0x2b,0x2d,0xb0,0x1a,0x2c,0xb1,0x04,0x15,0x2b,0x2d,0xb0,0x1b,0x2c,0xb1,0x05,0x15,0x2b,0x2d,0xb0,0x1c,0x2c,0xb1,0x06,0x15,0x2b,0x2d,0xb0,0x1d,0x2c,0xb1,0x07,0x15,0x2b,0x2d,0xb0,0x1e,0x2c,0xb1,0x08,0x15,0x2b,0x2d,0xb0,0x1f,0x2c,0xb1,0x09,0x15,0x2b,0x2d,0xb0,0x2b,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,\r\n0xb0,0x06,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x5d,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2c,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x16,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x71,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2d,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x26,0x60,0x4b,0x54,0x58,\r\n0x23,0x20,0x2e,0xb0,0x01,0x72,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x20,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x01,0x60,0x42,0x20,0x60,0xb0,0x01,0x61,0xb5,0x18,0x18,0x01,0x00,0x11,0x00,0x42,0x42,0x8a,0x60,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,\r\n0x1b,0x22,0x59,0x2d,0xb0,0x21,0x2c,0xb1,0x00,0x20,0x2b,0x2d,0xb0,0x22,0x2c,0xb1,0x01,0x20,0x2b,0x2d,0xb0,0x23,0x2c,0xb1,0x02,0x20,0x2b,0x2d,0xb0,0x24,0x2c,0xb1,0x03,0x20,0x2b,0x2d,0xb0,0x25,0x2c,0xb1,0x04,0x20,0x2b,0x2d,0xb0,0x26,0x2c,0xb1,0x05,0x20,0x2b,0x2d,0xb0,0x27,0x2c,0xb1,0x06,0x20,0x2b,0x2d,0xb0,0x28,0x2c,0xb1,\r\n0x07,0x20,0x2b,0x2d,0xb0,0x29,0x2c,0xb1,0x08,0x20,0x2b,0x2d,0xb0,0x2a,0x2c,0xb1,0x09,0x20,0x2b,0x2d,0xb0,0x2e,0x2c,0x20,0x3c,0xb0,0x01,0x60,0x2d,0xb0,0x2f,0x2c,0x20,0x60,0xb0,0x18,0x60,0x20,0x43,0x23,0xb0,0x01,0x60,0x43,0xb0,0x02,0x25,0x61,0xb0,0x01,0x60,0xb0,0x2e,0x2a,0x21,0x2d,0xb0,0x30,0x2c,0xb0,0x2f,0x2b,0xb0,0x2f,\r\n0x2a,0x2d,0xb0,0x31,0x2c,0x20,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x23,0x20,0x8a,0x55,0x58,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,\r\n0x63,0x60,0x23,0x61,0x38,0x1b,0x21,0x59,0x2d,0xb0,0x32,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x33,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x16,0xb0,\r\n0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x34,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0xb0,0x35,0x2c,0x00,0xb1,0x0e,0x07,0x45,0x42,0xb0,0x01,0x45,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,\r\n0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x00,0x16,0xb4,0x00,0x00,0x00,0x00,0x00,0x44,0x3e,0x23,0x38,0xb1,0x34,0x01,0x15,0x2a,0x21,0x2d,0xb0,0x36,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,\r\n0x63,0x60,0xb0,0x00,0x43,0x61,0x38,0x2d,0xb0,0x37,0x2c,0x2e,0x17,0x3c,0x2d,0xb0,0x38,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0xb0,0x01,0x43,0x63,0x38,0x2d,0xb0,0x39,0x2c,0xb1,0x02,0x00,0x16,0x25,0x20,\r\n0x2e,0x20,0x47,0xb0,0x00,0x23,0x42,0xb0,0x02,0x25,0x49,0x8a,0x8a,0x47,0x23,0x47,0x23,0x61,0x20,0x58,0x62,0x1b,0x21,0x59,0xb0,0x01,0x23,0x42,0xb2,0x38,0x01,0x01,0x15,0x14,0x2a,0x2d,0xb0,0x3a,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,\r\n0x2b,0x65,0x8a,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x3b,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,\r\n0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0xb0,0x0a,0x43,0x20,0x8a,0x23,0x47,0x23,0x47,0x23,0x61,0x23,0x46,0x60,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,\r\n0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x1b,0x23,0xb0,0x0a,0x43,0x46,0xb0,0x02,0x25,0xb0,0x0a,0x43,0x47,0x23,0x47,0x23,0x61,0x60,0x20,0xb0,0x06,0x43,0xb0,\r\n0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x06,0x43,0x60,0xb0,0x01,0x2b,0xb0,0x05,0x25,0x61,0xb0,0x05,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x04,0x26,0x61,0x20,0xb0,0x04,0x25,0x60,0x64,0x23,0xb0,\r\n0x03,0x25,0x60,0x64,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x59,0x2d,0xb0,0x3c,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0x20,0x20,0xb0,0x05,0x26,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x23,0x3c,0x38,0x2d,0xb0,0x3d,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x23,\r\n0x42,0x20,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x2d,0xb0,0x3e,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x03,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x00,0x54,0x58,0x2e,0x20,0x3c,0x23,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x05,0x25,0xb0,0x04,0x25,0x47,\r\n0x23,0x47,0x23,0x61,0xb0,0x06,0x25,0xb0,0x05,0x25,0x49,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x20,0x58,0x62,0x1b,0x21,0x59,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x23,0x21,0x59,0x2d,0xb0,0x3f,0x2c,0xb0,\r\n0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x43,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0x60,0xb0,0x20,0x60,0x66,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x40,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,\r\n0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x41,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x42,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,\r\n0x59,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x43,0x2c,0xb0,0x3a,0x2b,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x44,0x2c,\r\n0xb0,0x3b,0x2b,0x8a,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x8a,0x38,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x45,0x2c,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x26,0x20,0x20,0x20,0x46,0x23,\r\n0x47,0x61,0xb0,0x0c,0x23,0x42,0x2e,0x47,0x23,0x47,0x23,0x61,0xb0,0x0b,0x43,0x2b,0x23,0x20,0x3c,0x20,0x2e,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x46,0x2c,0xb1,0x0a,0x04,0x25,0x42,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,\r\n0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0x47,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,\r\n0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0xb0,0x02,0x25,0x46,0x61,0x38,0x23,0x20,0x3c,0x23,0x38,0x1b,0x21,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x21,0x59,0xb1,\r\n0x30,0x01,0x14,0x2b,0x2d,0xb0,0x47,0x2c,0xb1,0x00,0x3a,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x48,0x2c,0xb1,0x00,0x3b,0x2b,0x21,0x23,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x49,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,\r\n0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4a,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4b,0x2c,0xb1,0x00,0x01,0x14,0x13,0xb0,0x37,0x2a,0x2d,0xb0,0x4c,0x2c,0xb0,0x39,0x2a,0x2d,0xb0,0x4d,0x2c,0xb0,0x00,0x16,0x45,0x23,0x20,0x2e,0x20,\r\n0x46,0x8a,0x23,0x61,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x4e,0x2c,0xb0,0x0a,0x23,0x42,0xb0,0x4d,0x2b,0x2d,0xb0,0x4f,0x2c,0xb2,0x00,0x00,0x46,0x2b,0x2d,0xb0,0x50,0x2c,0xb2,0x00,0x01,0x46,0x2b,0x2d,0xb0,0x51,0x2c,0xb2,0x01,0x00,0x46,0x2b,0x2d,0xb0,0x52,0x2c,0xb2,0x01,0x01,0x46,0x2b,0x2d,0xb0,0x53,0x2c,0xb2,0x00,0x00,\r\n0x47,0x2b,0x2d,0xb0,0x54,0x2c,0xb2,0x00,0x01,0x47,0x2b,0x2d,0xb0,0x55,0x2c,0xb2,0x01,0x00,0x47,0x2b,0x2d,0xb0,0x56,0x2c,0xb2,0x01,0x01,0x47,0x2b,0x2d,0xb0,0x57,0x2c,0xb3,0x00,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x58,0x2c,0xb3,0x00,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x59,0x2c,0xb3,0x01,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x5a,0x2c,0xb3,\r\n0x01,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x5b,0x2c,0xb3,0x00,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5c,0x2c,0xb3,0x00,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5d,0x2c,0xb3,0x01,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5e,0x2c,0xb3,0x01,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5f,0x2c,0xb2,0x00,0x00,0x45,0x2b,0x2d,0xb0,0x60,0x2c,0xb2,0x00,0x01,0x45,0x2b,0x2d,\r\n0xb0,0x61,0x2c,0xb2,0x01,0x00,0x45,0x2b,0x2d,0xb0,0x62,0x2c,0xb2,0x01,0x01,0x45,0x2b,0x2d,0xb0,0x63,0x2c,0xb2,0x00,0x00,0x48,0x2b,0x2d,0xb0,0x64,0x2c,0xb2,0x00,0x01,0x48,0x2b,0x2d,0xb0,0x65,0x2c,0xb2,0x01,0x00,0x48,0x2b,0x2d,0xb0,0x66,0x2c,0xb2,0x01,0x01,0x48,0x2b,0x2d,0xb0,0x67,0x2c,0xb3,0x00,0x00,0x00,0x44,0x2b,0x2d,\r\n0xb0,0x68,0x2c,0xb3,0x00,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x69,0x2c,0xb3,0x01,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x6a,0x2c,0xb3,0x01,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x6b,0x2c,0xb3,0x00,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6c,0x2c,0xb3,0x00,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6d,0x2c,0xb3,0x01,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6e,0x2c,0xb3,\r\n0x01,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6f,0x2c,0xb1,0x00,0x3c,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x70,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x71,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x72,0x2c,0xb0,0x00,0x16,0xb1,0x00,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x73,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,\r\n0x40,0x2b,0x2d,0xb0,0x74,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x75,0x2c,0xb0,0x00,0x16,0xb1,0x01,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x76,0x2c,0xb1,0x00,0x3d,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x77,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x78,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,\r\n0xb0,0x79,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7a,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7b,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x7c,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7d,0x2c,0xb1,0x00,0x3e,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x7e,0x2c,0xb1,0x00,0x3e,\r\n0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7f,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x80,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x81,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x82,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x83,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x84,0x2c,0xb1,\r\n0x00,0x3f,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x85,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x86,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x87,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x88,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x89,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x41,0x2b,\r\n0x2d,0xb0,0x8a,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x8b,0x2c,0xb2,0x0b,0x00,0x03,0x45,0x50,0x58,0xb0,0x06,0x1b,0xb2,0x04,0x02,0x03,0x45,0x58,0x23,0x21,0x1b,0x21,0x59,0x59,0x42,0x2b,0xb0,0x08,0x65,0xb0,0x03,0x24,0x50,0x78,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x2d,0x00,0x4b,0xb8,0x00,0xc8,0x52,0x58,0xb1,\r\n0x01,0x01,0x8e,0x59,0xb0,0x01,0xb9,0x08,0x00,0x08,0x00,0x63,0x70,0xb1,0x00,0x07,0x42,0xb2,0x19,0x01,0x00,0x2a,0xb1,0x00,0x07,0x42,0xb3,0x0d,0x09,0x01,0x0a,0x2a,0xb1,0x00,0x07,0x42,0xb3,0x16,0x06,0x01,0x0a,0x2a,0xb1,0x00,0x08,0x42,0xba,0x03,0x80,0x00,0x01,0x00,0x0b,0x2a,0xb1,0x00,0x09,0x42,0xba,0x00,0x80,0x00,0x01,0x00,\r\n0x0b,0x2a,0xb9,0x00,0x03,0x00,0x00,0x44,0xb1,0x24,0x01,0x88,0x51,0x58,0xb0,0x40,0x88,0x58,0xb9,0x00,0x03,0x00,0x64,0x44,0xb1,0x28,0x01,0x88,0x51,0x58,0xb8,0x08,0x00,0x88,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x1b,0xb1,0x27,0x01,0x88,0x51,0x58,0xba,0x08,0x80,0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00,\r\n0x00,0x44,0x59,0x59,0x59,0x59,0x59,0xb3,0x10,0x06,0x01,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00,0x44,0x44,0x00,\r\n};\r\n\r\nread_only global String8 rd_icon_font_bytes = {rd_icon_font_bytes__data, sizeof(rd_icon_font_bytes__data)};\r\nread_only global U8 rd_default_main_font_bytes__data[] =\r\n{\r\n0x00,0x01,0x00,0x00,0x00,0x18,0x01,0x00,0x00,0x04,0x00,0x80,0x44,0x53,0x49,0x47,0x63,0xbc,0x04,0x48,0x00,0x0c,0x94,0x20,0x00,0x00,0x23,0xa0,0x47,0x44,0x45,0x46,0xb9,0xab,0xc5,0xc1,0x00,0x0c,0xb7,0xc0,0x00,0x00,0x03,0x58,0x47,0x50,0x4f,0x53,0x5b,0xad,0x7e,0xc2,0x00,0x0c,0xbb,0x18,0x00,0x01,0x4c,0xc8,0x47,0x53,0x55,0x42,\r\n0x62,0x6c,0x1b,0xf3,0x00,0x0e,0x07,0xe0,0x00,0x00,0x8d,0x2e,0x4c,0x54,0x53,0x48,0x69,0x2b,0xe4,0xa7,0x00,0x00,0x55,0xe8,0x00,0x00,0x14,0xe4,0x4d,0x45,0x52,0x47,0x00,0x16,0x00,0x01,0x00,0x0e,0x95,0x10,0x00,0x00,0x00,0x0c,0x4f,0x53,0x2f,0x32,0x5f,0x62,0x3d,0x91,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x60,0x56,0x44,0x4d,0x58,\r\n0x76,0x58,0x7d,0xd3,0x00,0x00,0x6a,0xcc,0x00,0x00,0x05,0xe0,0x63,0x6d,0x61,0x70,0x33,0x66,0x8a,0xbf,0x00,0x01,0xd3,0xd8,0x00,0x00,0x1c,0xe4,0x63,0x76,0x74,0x20,0x82,0x03,0x5d,0xdb,0x00,0x02,0x03,0x58,0x00,0x00,0x0a,0x22,0x66,0x70,0x67,0x6d,0x49,0x44,0xd8,0x67,0x00,0x01,0xf0,0xbc,0x00,0x00,0x0a,0x5c,0x67,0x61,0x73,0x70,\r\n0x00,0x1b,0x00,0x23,0x00,0x0c,0x94,0x10,0x00,0x00,0x00,0x10,0x67,0x6c,0x79,0x66,0x2b,0xa3,0xa5,0xc9,0x00,0x02,0x61,0x00,0x00,0x09,0x4b,0xfc,0x68,0x64,0x6d,0x78,0xf0,0x92,0x4d,0xb8,0x00,0x00,0x70,0xac,0x00,0x01,0x63,0x2c,0x68,0x65,0x61,0x64,0xf3,0x00,0x6d,0x9b,0x00,0x00,0x01,0x8c,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,\r\n0x14,0x0e,0x1d,0xa4,0x00,0x00,0x01,0xc4,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,0x5e,0x06,0x4f,0x2c,0x00,0x00,0x02,0x68,0x00,0x00,0x53,0x80,0x6b,0x65,0x72,0x6e,0xcc,0xce,0xe6,0xda,0x00,0x0b,0xac,0xfc,0x00,0x00,0xc2,0x6a,0x6c,0x6f,0x63,0x61,0x5a,0x85,0x46,0xd0,0x00,0x02,0x0d,0x7c,0x00,0x00,0x53,0x84,0x6d,0x61,0x78,0x70,\r\n0x1a,0xb0,0x0d,0xea,0x00,0x00,0x01,0xe8,0x00,0x00,0x00,0x20,0x6d,0x65,0x74,0x61,0x4d,0x44,0xb7,0xb7,0x00,0x0e,0x95,0x1c,0x00,0x00,0x00,0x80,0x6e,0x61,0x6d,0x65,0x4e,0xc3,0x16,0xb3,0x00,0x0c,0x6f,0x68,0x00,0x00,0x24,0x88,0x70,0x6f,0x73,0x74,0xff,0x51,0x00,0x77,0x00,0x0c,0x93,0xf0,0x00,0x00,0x00,0x20,0x70,0x72,0x65,0x70,\r\n0x93,0xee,0x1e,0xb9,0x00,0x01,0xfb,0x18,0x00,0x00,0x08,0x40,0x00,0x01,0x00,0x00,0x00,0x05,0x9e,0xb8,0xa0,0x2c,0x85,0x86,0x5f,0x0f,0x3c,0xf5,0x00,0x1b,0x08,0x00,0x00,0x00,0x00,0x00,0xaf,0xf5,0x3c,0xaf,0x00,0x00,0x00,0x00,0xd8,0x6f,0x46,0x1c,0xfb,0x6b,0xfc,0xb6,0x0f,0xfe,0x0a,0x63,0x00,0x00,0x00,0x09,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x08,0xa2,0xfd,0xfe,0x00,0x00,0x0f,0xf4,0xfb,0x6b,0xfa,0xd1,0x0f,0xfe,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x01,0x00,0x00,0x14,0xe0,0x02,0xb9,0x00,0x20,0x00,0xa3,0x00,0x07,0x00,0x02,0x00,0x10,0x00,0x2f,0x00,0x86,0x00,0x00,\r\n0x05,0x0e,0x0a,0x5c,0x00,0x04,0x00,0x01,0x00,0x03,0x04,0x4f,0x01,0x90,0x00,0x05,0x00,0x08,0x05,0x9a,0x05,0x33,0x00,0x00,0x01,0x1b,0x05,0x9a,0x05,0x33,0x00,0x00,0x03,0xd1,0x00,0x66,0x02,0x12,0x08,0x05,0x02,0x0b,0x05,0x02,0x04,0x02,0x04,0x02,0x02,0x03,0xe4,0x00,0x2e,0xff,0xc0,0x00,0xe4,0x7f,0x00,0x00,0x00,0x09,0x00,0x00,\r\n0x00,0x00,0x4d,0x53,0x20,0x20,0x00,0x40,0x00,0x0d,0xff,0xfd,0x05,0xd3,0xfe,0x51,0x01,0x0d,0x08,0xa2,0x02,0x02,0x20,0x00,0x01,0xff,0x00,0x00,0x00,0x00,0x04,0x00,0x05,0x9a,0x00,0x00,0x00,0x20,0x00,0x17,0x05,0x2a,0x00,0xa6,0x00,0x00,0x00,0x00,0x00,0xc7,0x00,0x00,0x02,0x31,0x00,0x00,0x02,0x46,0x00,0xb4,0x03,0x23,0x00,0xa3,\r\n0x04,0xba,0x00,0x21,0x04,0x50,0x00,0xa2,0x06,0x8c,0x00,0x50,0x06,0x67,0x00,0x77,0x01,0xd7,0x00,0xa3,0x02,0x6a,0x00,0x8c,0x02,0x6a,0x00,0x16,0x03,0x56,0x00,0x4c,0x05,0x79,0x00,0xe8,0x01,0xbc,0x00,0x27,0x03,0x33,0x00,0x90,0x01,0xbc,0x00,0x70,0x03,0x1e,0xff,0xe4,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0xe4,0x04,0x50,0x00,0x6d,\r\n0x04,0x50,0x00,0x7b,0x04,0x50,0x00,0x0e,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x50,0x00,0x62,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x01,0xbc,0x00,0x70,0x01,0xbc,0x00,0x27,0x05,0x79,0x01,0x10,0x05,0x79,0x00,0xe8,0x05,0x79,0x01,0x10,0x03,0x96,0x00,0x83,0x07,0xa4,0x00,0xac,0x05,0x29,0x00,0x16,0x04,0x96,0x00,0xbc,\r\n0x04,0xf4,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x03,0xe8,0x00,0xbc,0x05,0x7d,0x00,0x5e,0x05,0xae,0x00,0xbc,0x02,0x21,0x00,0xbc,0x02,0xdb,0x00,0x14,0x04,0xa4,0x00,0xbc,0x03,0xc4,0x00,0xbc,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x06,0x08,0x00,0x5e,0x04,0x7b,0x00,0xbc,0x06,0x08,0x00,0x5e,0x04,0xc9,0x00,0xbc,\r\n0x04,0x40,0x00,0x79,0x04,0x31,0x00,0x29,0x05,0x7f,0x00,0xaa,0x04,0xf8,0x00,0x12,0x07,0x79,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x04,0x6c,0x00,0x12,0x04,0x90,0x00,0x21,0x02,0x6a,0x00,0xc8,0x03,0x08,0xff,0xe6,0x02,0x6a,0x00,0x35,0x05,0x79,0x00,0xe6,0x03,0x52,0x00,0x00,0x02,0x25,0x00,0x52,0x04,0x12,0x00,0x5a,0x04,0xb4,0x00,0xa6,\r\n0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x60,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x04,0x87,0x00,0xa6,0x01,0xf0,0x00,0x90,0x01,0xf0,0xff,0x3a,0x03,0xfa,0x00,0xa6,0x01,0xf0,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xb0,0x00,0x60,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0x60,0x02,0xc8,0x00,0xa6,\r\n0x03,0x65,0x00,0x68,0x02,0xb6,0x00,0x2b,0x04,0x87,0x00,0x90,0x03,0xd5,0x00,0x0e,0x05,0xc8,0x00,0x18,0x03,0xac,0x00,0x1a,0x03,0xdf,0x00,0x0e,0x03,0x9e,0x00,0x21,0x02,0x6a,0x00,0x5c,0x01,0xea,0x00,0xac,0x02,0x6a,0x00,0x42,0x05,0x79,0x00,0xd1,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x04,0xf4,0x00,0x5e,0x04,0x0c,0x00,0xbc,\r\n0x05,0xfc,0x00,0xbc,0x06,0x08,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x04,0x12,0x00,0x5a,0x03,0xb2,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x04,0x2f,0x00,0x60,0x01,0xf0,0x00,0x58,0x01,0xf0,0xff,0xec,\r\n0x01,0xf0,0xff,0xd3,0x01,0xf0,0xff,0xc9,0x04,0x87,0x00,0xa6,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0x90,0x03,0x00,0x00,0x30,0x03,0x04,0x00,0x6c,0x04,0x50,0x00,0xb8,0x04,0x50,0x00,0x6a,\r\n0x03,0x96,0x00,0x83,0x03,0x40,0x00,0xa4,0x03,0xaa,0x00,0x54,0x04,0x5a,0x00,0xa6,0x03,0x33,0x00,0x90,0x07,0x1f,0x01,0x38,0x07,0x1f,0x00,0xa2,0x06,0x2f,0x00,0x4c,0x02,0x42,0x00,0x87,0x03,0x50,0x00,0x7d,0x05,0x7b,0x00,0xe8,0x06,0xe2,0x00,0x0a,0x06,0x08,0x00,0x5e,0x06,0x89,0x00,0x52,0x05,0x79,0x00,0xe8,0x05,0x7b,0x00,0xe8,\r\n0x05,0x7b,0x00,0xe8,0x04,0x50,0x00,0x44,0x04,0x9e,0x00,0xa6,0x04,0x48,0x00,0x4e,0x04,0xef,0x00,0x33,0x06,0x08,0x00,0xbc,0x04,0x51,0x00,0xbe,0x03,0x23,0x00,0x52,0x03,0x72,0x00,0x4e,0x06,0x0a,0x00,0x64,0x06,0xa8,0x00,0x5a,0x04,0xb0,0x00,0x31,0x03,0x96,0x00,0x8f,0x02,0x31,0x00,0x00,0x02,0x46,0x00,0xb4,0x05,0x79,0x00,0xe8,\r\n0x05,0x33,0x00,0x7b,0x04,0x50,0x00,0x5e,0x05,0x7b,0x00,0xd1,0x05,0x28,0x00,0x33,0x04,0x0c,0x00,0x5c,0x04,0x0c,0x00,0x5a,0x05,0xdd,0x00,0x8c,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x06,0x08,0x00,0x5e,0x07,0x72,0x00,0x5e,0x07,0x6c,0x00,0x60,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x03,0x04,0x00,0x6a,0x03,0x04,0x00,0x6e,\r\n0x01,0xd5,0x00,0x6a,0x01,0xd5,0x00,0x6e,0x05,0x79,0x00,0xe8,0x04,0xab,0x00,0x6c,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x01,0x62,0xfe,0xc8,0x04,0x50,0x00,0x66,0x02,0x87,0x00,0x5c,0x02,0x87,0x00,0x5c,0x04,0x70,0x00,0x35,0x04,0x70,0x00,0x35,0x03,0x00,0x00,0x30,0x01,0xbc,0x00,0x70,0x01,0xd5,0x00,0x58,0x03,0x04,0x00,0x58,\r\n0x09,0xae,0x00,0x50,0x05,0x29,0x00,0x16,0x04,0x0c,0x00,0xbc,0x05,0x29,0x00,0x16,0x04,0x0c,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x02,0x21,0x00,0x78,0x02,0x21,0xff,0xfc,0x02,0x21,0xff,0xf1,0x02,0x21,0x00,0x1b,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,\r\n0x01,0xf0,0x00,0xa6,0x02,0xf8,0x00,0x5c,0x02,0xb2,0x00,0x23,0x02,0x7b,0x00,0x3e,0x02,0x6e,0x00,0x25,0x01,0x9c,0x00,0x6c,0x02,0x3e,0x00,0x52,0x01,0xa4,0x00,0x33,0x02,0x98,0x00,0x40,0x01,0x7b,0x00,0x3e,0x02,0xf8,0x00,0x66,0x03,0xc4,0x00,0x21,0x02,0x31,0x00,0x16,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x90,0x00,0x21,\r\n0x03,0x9e,0x00,0x21,0x01,0xea,0x00,0xac,0x05,0x9c,0x00,0x1c,0x04,0x79,0x00,0x60,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x05,0x79,0x00,0xe8,0x05,0x79,0x01,0x0c,0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x07,0x72,0x00,0x50,0x07,0x40,0x00,0x50,0x07,0x9e,0x00,0x81,\r\n0x03,0xe8,0x00,0x1c,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x02,0x21,0x00,0xad,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x03,0x52,0x00,0x00,0x01,0xbc,0x00,0x70,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,\r\n0x04,0x12,0x00,0x5a,0x05,0x9c,0x00,0xbc,0x05,0x65,0x00,0x60,0x05,0x9c,0x00,0x1c,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x8e,0x03,0xc4,0x00,0xbc,0x02,0x75,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x02,0x85,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,\r\n0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0x97,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x03,0x85,0x00,0x2b,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,\r\n0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x03,0xc6,0x00,0xbc,0x06,0x08,0x00,0x5e,0x06,0x08,0x00,0x60,0x04,0xea,0x00,0x5a,0x04,0xac,0x00,0x5c,0x03,0x81,0x00,0x52,0x04,0x99,0x00,0x61,0x03,0xe6,0x00,0x22,0x05,0x98,0x00,0x60,0x03,0x52,0x00,0x00,\r\n0x03,0xd7,0x00,0xb4,0x03,0x23,0x00,0x6e,0x08,0xe2,0x00,0xbc,0x04,0xfc,0x00,0xbc,0x03,0xf6,0x00,0x90,0x04,0xd9,0xff,0xd7,0x01,0xd5,0x00,0x82,0x03,0x04,0x00,0x8d,0x06,0x6e,0x00,0x96,0x02,0x96,0x00,0x0e,0x04,0xd5,0x00,0x92,0x02,0xd5,0x00,0x83,0x02,0xd5,0x00,0x83,0x04,0xd5,0x00,0xb2,0x02,0xd5,0x00,0x70,0x05,0x29,0x00,0x16,\r\n0x04,0x12,0x00,0x5a,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,\r\n0x04,0xb6,0x00,0x60,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0x1c,0x04,0x87,0x00,0x1e,0x02,0x21,0xff,0xd0,0x01,0xf0,0xff,0xad,0x02,0x21,0x00,0x13,0x01,0xf0,0xff,0xef,0x02,0x21,0xff,0xfe,0x01,0xf0,0xff,0xdb,0x02,0x21,0x00,0x50,0x01,0xf0,0x00,0x37,0x02,0xdb,0x00,0x14,0x01,0xf0,0xff,0x3a,0x04,0xa4,0x00,0xbc,\r\n0x03,0xfa,0x00,0xa6,0x03,0xfa,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x27,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,\r\n0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x01,0xee,0x00,0xa6,0x05,0x29,0x00,0x16,\r\n0x04,0x12,0x00,0x5a,0x06,0xe2,0x00,0x0a,0x06,0xa8,0x00,0x5a,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x31,0x01,0xbc,0x00,0x70,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x01,0xd5,0x00,0x6e,0x03,0x52,0x00,0x00,\r\n0x04,0x50,0x00,0x6a,0x04,0xcd,0x00,0x55,0x07,0x60,0x00,0x50,0x07,0x60,0x00,0x81,0x07,0x6e,0x00,0x8c,0x07,0x23,0x00,0xa2,0x03,0x1e,0x00,0xdb,0x03,0x1e,0x00,0xdb,0x01,0xbc,0x00,0x27,0x02,0x2e,0x00,0xce,0x02,0x2e,0xff,0xda,0x05,0x29,0x00,0x16,0x04,0x90,0xff,0xc5,0x06,0x31,0xff,0xc5,0x03,0x07,0xff,0xc6,0x06,0x68,0xff,0xd1,\r\n0x05,0x56,0xff,0xb3,0x06,0x9c,0xff,0xd1,0x02,0x22,0xff,0xb2,0x05,0x29,0x00,0x16,0x04,0x96,0x00,0xbc,0x04,0x0c,0x00,0xbc,0x04,0x90,0x00,0x21,0x05,0xae,0x00,0xbc,0x02,0x21,0x00,0xbc,0x04,0xa4,0x00,0xbc,0x05,0x08,0x00,0x18,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x04,0x14,0x00,0x3a,0x06,0x08,0x00,0x5e,0x05,0xb4,0x00,0xbc,\r\n0x04,0x7b,0x00,0xbc,0x04,0x21,0x00,0x2e,0x04,0x31,0x00,0x29,0x04,0x6c,0x00,0x12,0x04,0xb8,0x00,0x1a,0x06,0x35,0x00,0x88,0x06,0x0a,0x00,0x64,0x02,0x21,0xff,0xf1,0x04,0x6c,0x00,0x12,0x04,0xea,0x00,0x5a,0x03,0x81,0x00,0x52,0x04,0x9a,0x00,0x82,0x02,0x22,0x00,0xa6,0x04,0x6c,0x00,0x14,0x04,0x62,0x00,0xa7,0x04,0x27,0x00,0x05,\r\n0x03,0x89,0x00,0x4c,0x04,0x9a,0x00,0x82,0x04,0xb1,0x00,0x61,0x02,0x22,0x00,0xa6,0x04,0x31,0x00,0xa6,0x03,0xfc,0xff,0xfe,0x04,0x9e,0x00,0xa7,0x04,0x35,0x00,0x0c,0x03,0x8f,0x00,0x4d,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0xa1,0x03,0xaf,0x00,0x57,0x04,0x6c,0x00,0x14,0x04,0x4e,0x00,0x0c,0x06,0x00,0x00,0x98,0x06,0x77,0x00,0x77,\r\n0x02,0x22,0xff,0xed,0x04,0x6c,0x00,0x14,0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x14,0x06,0x77,0x00,0x77,0x04,0x0c,0x00,0xbc,0x05,0x9a,0x00,0x29,0x03,0xc6,0x00,0xbc,0x04,0xf0,0x00,0x5e,0x04,0x40,0x00,0x79,0x02,0x21,0xff,0xf1,0x07,0xd9,0x00,0x10,0x07,0xde,0x00,0xbc,0x05,0xc8,0x00,0x29,0x04,0xa4,0x00,0xbc,0x04,0x8a,0x00,0x3c,\r\n0x05,0xab,0x00,0xbc,0x05,0x29,0x00,0x16,0x04,0x93,0x00,0xbc,0x04,0x96,0x00,0xbc,0x03,0xc6,0x00,0xbc,0x05,0x8c,0x00,0x0f,0x04,0x0c,0x00,0xbc,0x06,0xef,0xff,0xea,0x04,0x52,0x00,0x60,0x05,0xfe,0x00,0xbc,0x05,0xfe,0x00,0xbc,0x04,0xa4,0x00,0xbc,0x05,0x62,0x00,0x10,0x07,0x2f,0x00,0xbc,0x05,0xae,0x00,0xbc,0x06,0x08,0x00,0x5e,\r\n0x05,0xb4,0x00,0xbc,0x04,0x7b,0x00,0xbc,0x04,0xf4,0x00,0x5e,0x04,0x31,0x00,0x29,0x04,0x8a,0x00,0x3c,0x05,0xd0,0x00,0x5e,0x04,0xb8,0x00,0x1a,0x05,0xf0,0x00,0xbc,0x05,0x4a,0x00,0xa6,0x07,0x98,0x00,0xbc,0x07,0xd7,0x00,0xbc,0x05,0xa5,0x00,0x29,0x06,0x44,0x00,0xbc,0x04,0x9c,0x00,0xbc,0x04,0xee,0x00,0x68,0x08,0x26,0x00,0xbc,\r\n0x04,0xba,0x00,0x3d,0x04,0x12,0x00,0x5a,0x04,0xa2,0x00,0x77,0x04,0x3d,0x00,0xa6,0x03,0x10,0x00,0xa6,0x04,0x60,0x00,0x12,0x04,0x2f,0x00,0x60,0x05,0xf8,0x00,0x04,0x03,0x91,0x00,0x50,0x04,0xa6,0x00,0xa6,0x04,0xa6,0x00,0xa6,0x03,0xfa,0x00,0xa6,0x04,0x37,0x00,0x10,0x05,0x9e,0x00,0xa6,0x04,0x9e,0x00,0xa6,0x04,0xb0,0x00,0x60,\r\n0x04,0x9e,0x00,0xa6,0x04,0xb4,0x00,0xa6,0x03,0xb2,0x00,0x60,0x03,0x48,0x00,0x1e,0x03,0xdf,0x00,0x0e,0x05,0x7d,0x00,0x60,0x03,0xac,0x00,0x1a,0x04,0xcd,0x00,0xa6,0x04,0x85,0x00,0x98,0x06,0x66,0x00,0xa6,0x06,0x98,0x00,0xa6,0x04,0xba,0x00,0x1e,0x05,0xad,0x00,0xa6,0x04,0x08,0x00,0xa6,0x03,0xb2,0x00,0x5a,0x06,0x81,0x00,0xa6,\r\n0x04,0x06,0x00,0x3e,0x04,0x2f,0x00,0x60,0x04,0x9e,0x00,0x27,0x03,0x10,0x00,0xa6,0x03,0xb2,0x00,0x60,0x03,0x65,0x00,0x68,0x01,0xf0,0xff,0xd3,0x06,0x52,0x00,0x10,0x06,0x74,0x00,0xa6,0x04,0x8a,0x00,0x27,0x03,0xfa,0x00,0xa6,0x03,0xdf,0x00,0x0e,0x04,0x9e,0x00,0xa6,0x03,0xc0,0x00,0xbc,0x03,0x20,0x00,0xa6,0x08,0x00,0x00,0x00,\r\n0x08,0xfa,0x00,0xbc,0x05,0x04,0x00,0x11,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x01,0xf0,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x72,0x00,0x64,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x02,0x6e,0x00,0xab,0x02,0xaa,0x00,0xf2,\r\n0x02,0x25,0x00,0x66,0x02,0x25,0x00,0x64,0x03,0xd3,0x00,0x42,0x03,0xd3,0x00,0x42,0x03,0xd3,0x00,0x6c,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0x25,0x02,0x6e,0x00,0x38,0x02,0x6e,0x00,0x25,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0xab,0x03,0xd3,0x00,0xa9,0x02,0x6e,0x00,0x25,0x02,0x6e,0x00,0x38,0x02,0x6e,0x00,0x25,0x03,0xd3,0x00,0xa9,\r\n0x03,0xd3,0x00,0x6c,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0xff,0xe8,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,\r\n0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,\r\n0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0x0e,0x04,0x2f,0x00,0x0c,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x02,0x21,0x00,0x9a,0x01,0xf0,0x00,0x88,0x02,0x21,0x00,0xb2,0x01,0xf0,0x00,0x90,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,\r\n0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x30,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,\r\n0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x06,0x1a,0x00,0x5e,0x04,0xc7,0x00,0x60,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,\r\n0x04,0xb4,0x00,0x90,0x05,0xaa,0x00,0xaa,0x04,0xb4,0x00,0x90,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x02,0x21,0x00,0xbc,\r\n0x02,0xdb,0x00,0x14,0x01,0xf0,0x00,0x90,0x01,0xf0,0xff,0x3a,0x04,0x1e,0x00,0x29,0x03,0x48,0x00,0x1e,0x07,0x48,0xff,0xea,0x06,0x3e,0x00,0x04,0x04,0xe6,0x00,0xbc,0x04,0x3e,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x03,0xf6,0x00,0xa6,0x05,0xf0,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x6c,0x00,0x12,\r\n0x03,0xdf,0x00,0x0e,0x05,0x04,0x00,0x1a,0x03,0xf2,0x00,0x1a,0x05,0x3e,0x00,0xa6,0x04,0x85,0x00,0x98,0x05,0x4a,0x00,0xa6,0x04,0x87,0x00,0xa6,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x02,0x6e,0x00,0x3e,0x03,0x50,0x00,0x7d,\r\n0x03,0x50,0x00,0x7d,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x03,0xd3,0x00,0xa9,0x02,0x25,0x00,0x14,0x02,0x25,0x00,0x14,0x02,0x6e,0x00,0x1e,0x02,0x6e,0x00,0x1e,0x02,0x6e,0x00,0x14,0x02,0x6e,0x00,0x14,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x04,0x96,0x00,0xbc,\r\n0x04,0xb4,0x00,0xa6,0x04,0x96,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x96,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0xf4,0x00,0x5e,0x03,0xb2,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,0x04,0xb6,0x00,0x60,0x05,0x9c,0x00,0xbc,\r\n0x04,0xb6,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x03,0xe8,0x00,0xbc,0x02,0x81,0x00,0x35,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0xae,0x00,0xbc,\r\n0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xae,0x00,0xa0,0x04,0x87,0x00,0x8c,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x02,0x21,0xff,0xcf,0x01,0xf0,0xff,0xb9,0x02,0x21,0xff,0xf2,0x01,0xf0,0xff,0xd4,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0xbc,\r\n0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x03,0xc4,0x00,0xbc,0x01,0xf0,0x00,0x95,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xfa,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xfc,0x03,0xc4,0x00,0xbc,0x01,0xf0,0xff,0xdf,0x07,0x2f,0x00,0xbc,0x06,0xe4,0x00,0xa6,0x07,0x2f,0x00,0xbc,0x06,0xe4,0x00,0xa6,0x07,0x2f,0x00,0xbc,\r\n0x06,0xe4,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,\r\n0x04,0xb0,0x00,0x60,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,\r\n0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x7f,0x00,0xaa,\r\n0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0xf8,0x00,0x12,0x03,0xd5,0x00,0x0e,0x04,0xf8,0x00,0x12,0x03,0xd5,0x00,0x0e,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x07,0x79,0x00,0x1a,\r\n0x05,0xc8,0x00,0x18,0x04,0xb8,0x00,0x1a,0x03,0xac,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x03,0xac,0x00,0x1a,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0x87,0x00,0xa6,0x02,0xb6,0x00,0x2b,0x05,0xc8,0x00,0x18,\r\n0x03,0xdf,0x00,0x0e,0x04,0x12,0x00,0x5a,0x01,0xee,0x00,0x4e,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0xee,0xff,0xbc,0x05,0xee,0xff,0xbe,0x05,0xee,0xff,0xbc,\r\n0x05,0xee,0xff,0xbe,0x05,0xee,0xff,0xbc,0x05,0xee,0xff,0xbc,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x04,0x90,0xff,0xbd,0x04,0x90,0xff,0xbe,0x05,0xb2,0xff,0xbc,0x05,0xb2,0xff,0xc0,0x05,0xb2,0xff,0xbd,0x05,0xb2,0xff,0xbf,0x04,0x9a,0x00,0x82,\r\n0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x06,0x30,0xff,0xbd,0x06,0x30,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xc0,0x07,0x56,0xff,0xbd,0x07,0x56,0xff,0xbf,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbc,0x02,0x22,0x00,0x94,\r\n0x02,0x22,0x00,0x6e,0x02,0x22,0xff,0xdd,0x02,0x22,0xff,0xb3,0x02,0x22,0x00,0x1b,0x02,0x22,0xff,0xea,0x02,0x22,0xff,0xc0,0x02,0x22,0xff,0xc0,0x03,0x06,0xff,0xbd,0x03,0x06,0xff,0xbe,0x03,0xf8,0xff,0xbd,0x03,0xf8,0xff,0xc0,0x04,0x2a,0xff,0xbc,0x04,0x34,0xff,0xbf,0x04,0x2a,0xff,0xbd,0x04,0x2a,0xff,0xbd,0x04,0xb0,0x00,0x60,\r\n0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x06,0x6e,0xff,0xbd,0x06,0x6e,0xff,0xbe,0x07,0xa0,0xff,0xbc,0x07,0xa0,0xff,0xbe,0x07,0xa0,0xff,0xbc,0x07,0xa0,0xff,0xbe,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,\r\n0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x05,0x56,0xff,0xbe,0x06,0x8c,0xff,0xc0,0x06,0x8c,0xff,0xbf,0x06,0x8c,0xff,0xbc,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xbd,\r\n0x06,0x9c,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xc0,0x07,0xa6,0xff,0xbd,0x07,0xa6,0xff,0xbf,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbc,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x03,0x81,0x00,0x52,0x03,0x81,0x00,0x52,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x02,0x22,0x00,0x34,0x02,0x22,0x00,0xa6,0x04,0xb0,0x00,0x60,\r\n0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0xee,0xff,0xbd,\r\n0x05,0xee,0xff,0xc1,0x05,0xee,0xff,0xbd,0x05,0xee,0xff,0xbf,0x05,0xee,0xff,0xbd,0x05,0xee,0xff,0xbc,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x04,0x9a,0x00,0x82,0x06,0x31,0xff,0xbc,0x06,0x30,0xff,0xbe,0x07,0x56,0xff,0xbc,\r\n0x07,0x56,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbe,0x07,0x56,0xff,0xbc,0x07,0x56,0xff,0xbc,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xbc,0x06,0x9c,0xff,0xbe,0x07,0xa6,0xff,0xbc,\r\n0x07,0xa6,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbe,0x07,0xa6,0xff,0xbc,0x07,0xa6,0xff,0xbc,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x16,0x05,0x29,0xff,0xfb,0x05,0x29,0x00,0x16,\r\n0x05,0x29,0x00,0x16,0x04,0xb0,0x01,0xe4,0x04,0xb0,0x01,0xba,0x04,0xb0,0x01,0xe4,0x04,0xb0,0x01,0x40,0x04,0xb0,0x01,0x33,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x9a,0x00,0x83,0x04,0x90,0xff,0xac,0x04,0x90,0xff,0xc4,0x06,0x31,0xff,0xac,0x06,0x31,0xff,0xc4,0x05,0xae,0x00,0xbc,\r\n0x04,0xb0,0x01,0x4a,0x04,0xb0,0x01,0x42,0x04,0xb0,0x01,0x33,0x02,0x22,0xff,0xec,0x02,0x22,0xff,0xfa,0x02,0x22,0xff,0xb2,0x02,0x22,0xff,0xb2,0x02,0x22,0xff,0xdf,0x02,0x22,0xff,0xd5,0x02,0x21,0xff,0xfe,0x02,0x21,0x00,0x12,0x02,0xe8,0xff,0xae,0x03,0x07,0xff,0xc6,0x04,0xb0,0x01,0x44,0x04,0xb0,0x01,0x38,0x04,0xb0,0x01,0x33,\r\n0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0xb0,0x00,0xa1,0x04,0xb0,0x00,0xa1,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x12,0x04,0x6c,0x00,0x12,0x05,0x56,0xff,0x96,0x05,0x56,0xff,0xb2,0x05,0x04,0xff,0xbe,0x04,0xb0,0x01,0x02,0x04,0xb0,0x01,0x02,0x04,0xb0,0x01,0xd1,\r\n0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x77,0x00,0x77,0x06,0x9c,0xff,0xac,0x06,0x9c,0xff,0xd1,0x06,0xb3,0xff,0xac,0x06,0x9c,0xff,0xd1,0x06,0x0a,0x00,0x64,0x04,0xb0,0x01,0xd1,0x04,0xb0,0x01,0xe2,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x02,0x00,0x00,0xfe,0x58,\r\n0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x9e,0x00,0x00,0xfe,0xdd,0x00,0x00,0xff,0x33,0x00,0x00,0xfe,0xdd,0x00,0x00,0xfe,0xe8,0x00,0x00,0xff,0xcb,0x00,0x00,0xff,0x58,0x00,0x00,0xfe,0xdd,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x8c,0x00,0x00,0xff,0x8c,0x00,0x00,0xff,0x8c,0x00,0x00,0x00,0x2f,0x00,0x00,0xff,0x3e,\r\n0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x48,0x00,0x00,0xff,0x48,0x00,0x00,0xff,0x16,0x00,0x00,0xff,0x52,0x00,0x00,0xff,0xa6,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x4c,0x00,0x00,0xff,0x03,0x00,0x00,0xff,0x1a,0x00,0x00,0xff,0x1a,0x00,0x00,0xfe,0xdd,0x00,0x00,0xff,0x35,0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x56,\r\n0x00,0x00,0xff,0x5d,0x00,0x00,0xff,0xcb,0x00,0x00,0xfe,0x9c,0x00,0x00,0xfe,0xb1,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xe9,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x05,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x02,0x00,0x00,0xfe,0x58,0x00,0x00,0xfe,0x66,\r\n0x00,0x00,0xfe,0x70,0x00,0x00,0xff,0xa6,0x00,0x00,0xfe,0x9c,0x00,0x00,0xff,0x44,0x00,0x00,0xfe,0xa5,0x00,0x00,0xff,0x30,0x00,0x00,0xff,0x9e,0x00,0x00,0xfe,0x57,0x00,0x00,0xfe,0x70,0x00,0x00,0x00,0x0a,0x00,0x00,0xfe,0xc0,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xaa,0x00,0x00,0xff,0x64,0x00,0x00,0xfe,0x9c,0x00,0x00,0xfe,0x2a,\r\n0x00,0x00,0xff,0x58,0x00,0x00,0xff,0x4c,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xc0,0x00,0x00,0xfe,0xa8,0x00,0x00,0xff,0x5c,0x00,0x00,0xfd,0x0e,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfd,0xaf,0x04,0xb4,0x00,0x21,0x04,0xe8,0xff,0xac,0x04,0x93,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x04,0x9e,0x00,0x33,0x04,0xb4,0x00,0x21,\r\n0x04,0xf6,0x00,0x6a,0x04,0xf6,0x00,0x5e,0x03,0xba,0x00,0x60,0x05,0x9c,0x00,0x1c,0x05,0xee,0xff,0xac,0x04,0x94,0x00,0x5c,0x04,0xb4,0x00,0x60,0x04,0xbc,0x00,0x60,0x04,0x0e,0x00,0x5a,0x04,0x54,0x00,0x70,0x03,0xe8,0xff,0x9a,0x05,0x89,0x00,0x5e,0x04,0xf8,0x00,0x12,0x06,0xfe,0x00,0xa6,0x02,0x4e,0x00,0xb8,0x02,0x3a,0x00,0x29,\r\n0x04,0xa4,0x00,0xbc,0x03,0xfc,0x00,0xa6,0x01,0xf0,0x00,0x14,0x03,0xfc,0xff,0xfe,0x07,0x23,0x00,0xb8,0x05,0xfc,0xff,0x9a,0x04,0x9a,0x00,0x83,0x06,0x08,0x00,0x5e,0x07,0xc0,0x00,0x5e,0x06,0x52,0x00,0x60,0x04,0xcf,0xff,0xac,0x04,0xb4,0x00,0xa6,0x04,0x9c,0x00,0xbc,0x04,0x40,0x00,0x62,0x03,0x65,0x00,0x56,0x04,0x21,0x00,0x2d,\r\n0x02,0x5e,0xff,0x83,0x02,0xb8,0x00,0x2b,0x04,0x33,0xff,0xcd,0x02,0xb8,0x00,0x2b,0x04,0x33,0x00,0x27,0x06,0x0a,0x00,0x62,0x05,0xb2,0x00,0xb8,0x04,0x8e,0x00,0x0f,0x04,0x23,0x00,0x0e,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x04,0xe2,0x00,0x0a,0x04,0xe2,0x00,0x5e,0x03,0x89,0x00,0x1e,0x03,0x46,0x00,0x0a,0x04,0x50,0x00,0x60,\r\n0x04,0x50,0x00,0x74,0x03,0x0a,0x00,0x48,0x03,0x27,0x00,0x1e,0x04,0x5e,0x00,0xa6,0x01,0xea,0x00,0xac,0x03,0x10,0x00,0xac,0x03,0xa6,0x00,0x33,0x02,0x46,0x00,0xb4,0x09,0xe8,0x00,0xbc,0x09,0x1c,0x00,0xbc,0x08,0x33,0x00,0x60,0x06,0xd9,0x00,0xbc,0x05,0xc2,0x00,0xbc,0x04,0x01,0x00,0xa6,0x08,0x94,0x00,0xbc,0x07,0xbe,0x00,0xbc,\r\n0x06,0x77,0x00,0xa6,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x02,0x21,0xff,0xf7,0x01,0xf0,0xff,0xdf,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,\r\n0x04,0x87,0x00,0x90,0x04,0x2f,0x00,0x52,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x06,0xe2,0x00,0x0a,0x06,0xa0,0x00,0x52,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,\r\n0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xe2,0x00,0x0a,0x03,0x89,0xff,0xdd,0x01,0xf0,0xff,0x3a,0x09,0xe8,0x00,0xbc,0x09,0x1c,0x00,0xbc,0x08,0x33,0x00,0x60,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0xfe,0x00,0xbc,0x05,0x83,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,\r\n0x05,0x29,0x00,0x16,0x04,0x0a,0x00,0x52,0x04,0x0c,0x00,0x9e,0x04,0x2f,0x00,0x60,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x02,0x21,0xff,0x86,0x01,0xf0,0xff,0x6e,0x02,0x21,0xff,0xf8,0x01,0xf0,0xff,0xe6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x9a,0x00,0xa0,0x02,0xc8,0x00,0x04,\r\n0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0x9a,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x05,0x7f,0x00,0xaa,0x04,0x87,0x00,0x90,0x04,0x08,0x00,0x10,0x03,0x70,0x00,0x1e,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xdf,0x00,0xbc,0x04,0xb8,0x00,0x3e,0x04,0x89,0x00,0x48,0x04,0x90,0x00,0x21,0x03,0x9e,0x00,0x21,0x05,0x29,0x00,0x16,\r\n0x04,0x0a,0x00,0x52,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x04,0xb0,0x01,0x33,0x04,0x0a,0x01,0x08,0x04,0x87,0x01,0x1c,0x04,0x87,0x01,0x1c,0x04,0xb0,0x01,0x23,\r\n0x04,0x0a,0x00,0x90,0x04,0xb6,0x00,0x60,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0xa6,0x03,0xba,0x00,0x5a,0x03,0xba,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x52,0x04,0xe6,0x00,0x50,0x03,0x4e,0x00,0x60,0x03,0x4e,0x00,0x5a,0x04,0x0e,0x00,0x5a,0x04,0x68,0x00,0x60,0x02,0x38,0xff,0x81,0x04,0xb6,0x00,0x60,\r\n0x04,0xb6,0x00,0x60,0x04,0x3c,0x00,0x60,0x03,0xd5,0x00,0x0e,0x03,0xa8,0x00,0x0a,0x04,0x87,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0xa6,0x02,0x18,0x00,0x0a,0x02,0x3a,0x00,0x94,0x02,0x90,0x00,0x4c,0x02,0x3e,0xff,0xec,0x03,0x02,0xff,0xec,0x01,0xee,0x00,0xa6,0x04,0xd3,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x06,0xe4,0x00,0xa6,\r\n0x06,0xe4,0x00,0xa6,0x04,0x72,0xff,0x96,0x04,0x72,0x00,0xa6,0x04,0xb0,0x00,0xa6,0x04,0xb0,0x00,0x60,0x05,0x96,0x00,0x60,0x05,0xc4,0x00,0x60,0x05,0x1a,0x00,0x60,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0x0c,0x02,0xc8,0x00,0xa6,0x02,0xc8,0x00,0xa6,0x02,0xae,0x00,0x90,0x02,0xae,0x00,0x0c,0x03,0xa2,0x00,0xa6,\r\n0x03,0xa2,0x00,0xa6,0x03,0x2f,0x00,0x68,0x01,0xfa,0xff,0x92,0x02,0x10,0xff,0x9e,0x02,0x4e,0xff,0xa6,0x02,0x44,0xff,0x44,0x02,0xb8,0x00,0x38,0x02,0xb8,0x00,0x2b,0x04,0xcb,0x00,0x21,0x04,0xc2,0x00,0x60,0x04,0x77,0x00,0x90,0x03,0xd5,0x00,0x0c,0x05,0xc8,0x00,0x18,0x03,0xdf,0x00,0x0c,0x03,0x56,0x00,0x0a,0x03,0x9e,0x00,0x21,\r\n0x04,0x18,0x00,0x21,0x03,0x89,0xff,0xdd,0x03,0x89,0xff,0xea,0x02,0xec,0x00,0x1c,0x02,0xec,0x00,0x04,0x02,0xec,0x00,0x00,0x03,0xba,0x00,0x60,0x04,0xf2,0x00,0x60,0x03,0xdf,0x00,0xa6,0x04,0x62,0x00,0x5c,0x04,0x3c,0x00,0x60,0x04,0x87,0x00,0xa6,0x01,0xee,0xff,0x18,0x03,0xfc,0x00,0x04,0x03,0x14,0x00,0xa6,0x04,0xb6,0x00,0x60,\r\n0x02,0xec,0x00,0x1c,0x02,0xec,0x00,0x04,0x07,0x54,0x00,0x60,0x07,0x98,0x00,0x60,0x07,0xcf,0x00,0x60,0x04,0xe8,0x00,0x2b,0x03,0xcf,0x00,0x2b,0x05,0xbe,0x00,0x2b,0x06,0x58,0x00,0x35,0x04,0xa4,0x00,0x98,0x04,0x8e,0x00,0xa6,0x03,0xf4,0x00,0x31,0x03,0xf4,0x00,0x74,0x04,0x62,0x00,0xa6,0x04,0xba,0x00,0x14,0x04,0x85,0x00,0x12,\r\n0x05,0x6c,0xff,0xb1,0x04,0x85,0x00,0x12,0x05,0x1a,0x00,0x60,0x06,0x6a,0x00,0x00,0x04,0x90,0x00,0x00,0x05,0x9e,0x00,0x56,0x04,0xb0,0x00,0x60,0x04,0xa8,0x00,0x5e,0x03,0xa4,0x00,0x60,0x03,0xfc,0x00,0xbc,0x03,0x9c,0x00,0x90,0x04,0xc4,0x00,0x48,0x04,0x04,0x00,0x33,0x04,0xe4,0x00,0x00,0x03,0xf2,0xff,0x7b,0x07,0x23,0x00,0xb8,\r\n0x06,0xe4,0x00,0xa6,0x04,0xd5,0x00,0x33,0x04,0x14,0x00,0x33,0x05,0x16,0x00,0x00,0x04,0x44,0xff,0xec,0x04,0xe2,0x00,0x48,0x03,0xae,0x00,0x3e,0x04,0xc4,0x00,0x14,0x03,0xe2,0x00,0x14,0x05,0x4c,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0x85,0x00,0x0a,0x03,0x44,0x00,0x00,0x04,0x90,0x00,0x00,0x04,0xa8,0x00,0xa2,0x03,0xb2,0x00,0x60,\r\n0x01,0xf0,0xff,0x3a,0x06,0x08,0x00,0x5e,0x03,0xbc,0x00,0x60,0x03,0xbc,0x00,0x60,0x06,0xe8,0x00,0x1e,0x05,0x6c,0x00,0x1e,0x05,0x2b,0x00,0x29,0x04,0xa4,0x00,0x29,0x07,0x44,0x00,0xbc,0x05,0xb8,0x00,0xa6,0x05,0x52,0x00,0x16,0x03,0xfe,0x00,0x0c,0x06,0xfc,0x00,0xbc,0x05,0x87,0x00,0xa6,0x05,0xd3,0x00,0x29,0x04,0x85,0x00,0x1e,\r\n0x07,0x70,0x00,0xbc,0x05,0xfe,0x00,0xa6,0x04,0x52,0x00,0x31,0x03,0x99,0x00,0x21,0x06,0x44,0x00,0x66,0x06,0x14,0x00,0x66,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x05,0xc2,0x00,0x12,0x04,0xa0,0x00,0x0e,0x05,0xc2,0x00,0x12,0x04,0xa0,0x00,0x0e,0x0a,0x7f,0x00,0x5e,0x08,0xf2,0x00,0x58,0x06,0x9c,0x00,0x5e,0x05,0x33,0x00,0x60,\r\n0x09,0x08,0x00,0x5e,0x07,0x27,0x00,0x60,0x06,0xe8,0x00,0x1e,0x05,0x6c,0x00,0x1e,0x04,0xb4,0x00,0x5e,0x03,0x81,0x00,0x60,0x04,0x00,0x00,0x2d,0x03,0x27,0x00,0x52,0x03,0x4c,0x00,0x5e,0x00,0x00,0xff,0x90,0x00,0x00,0xff,0x86,0x07,0xe2,0x00,0x21,0x07,0x98,0x00,0x35,0x04,0x9c,0x00,0x29,0x04,0x0c,0x00,0x2d,0x04,0x7c,0x00,0xbc,\r\n0x04,0xb5,0x00,0xa6,0x04,0x8c,0x00,0xbc,0x04,0x04,0x00,0xa6,0x04,0x52,0x00,0x60,0x03,0xa2,0x00,0x58,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x27,0x05,0xae,0x00,0x29,0x04,0xa6,0x00,0x1e,0x06,0xb8,0x00,0xbc,0x05,0x4e,0x00,0xa6,0x08,0x16,0x00,0xbc,0x06,0xb0,0x00,0xa6,0x05,0xc6,0x00,0x5e,0x04,0x74,0x00,0x60,0x04,0xf4,0x00,0x5e,\r\n0x03,0xb2,0x00,0x60,0x04,0x35,0x00,0x29,0x03,0x48,0x00,0x1e,0x06,0xfa,0x00,0x29,0x05,0x79,0x00,0x1e,0x05,0x7f,0x00,0xa6,0x04,0xb4,0x00,0x98,0x06,0xae,0x00,0x29,0x05,0x10,0x00,0x29,0x06,0xae,0x00,0x29,0x05,0x10,0x00,0x29,0x02,0x21,0x00,0xbc,0x06,0xef,0xff,0xea,0x05,0xf8,0x00,0x04,0x04,0xa4,0x00,0xbe,0x04,0x0c,0x00,0xa6,\r\n0x05,0xae,0x00,0xbc,0x04,0x9e,0x00,0xa6,0x05,0x3e,0x00,0xa6,0x04,0x85,0x00,0x98,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x05,0x29,0x00,0x16,0x04,0x12,0x00,0x5a,0x06,0xe2,0x00,0x0a,0x06,0xa8,0x00,0x5a,0x04,0x0c,0x00,0xbc,0x04,0x2f,0x00,0x60,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,0x05,0xc4,0x00,0x56,0x04,0x2f,0x00,0x52,\r\n0x06,0xef,0xff,0xea,0x05,0xf8,0x00,0x04,0x04,0x52,0x00,0x60,0x03,0x91,0x00,0x50,0x04,0x2f,0x00,0x52,0x03,0x89,0xff,0xdd,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x04,0xee,0x00,0x68,0x03,0xb2,0x00,0x5a,\r\n0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x04,0x8a,0x00,0x3c,0x03,0xdf,0x00,0x0e,0x05,0x4a,0x00,0xa6,0x04,0x85,0x00,0x98,0x06,0x44,0x00,0xbc,0x05,0xad,0x00,0xa6,0x04,0x8e,0x00,0x56,0x04,0xb6,0x00,0x60,0x06,0xd3,0x00,0x64,0x06,0xe2,0x00,0x60,0x06,0x70,0x00,0x29,0x05,0xc6,0x00,0x1e,\r\n0x04,0x77,0x00,0x29,0x03,0xcb,0x00,0x1e,0x07,0x3e,0x00,0x18,0x06,0x5e,0x00,0x14,0x07,0xea,0x00,0xbc,0x06,0xcb,0x00,0xa6,0x05,0xb8,0x00,0x5e,0x04,0x3e,0x00,0x60,0x05,0x66,0x00,0x29,0x04,0xc8,0x00,0x1e,0x04,0xb0,0x01,0x33,0x04,0x87,0x01,0x1c,0x04,0x87,0x01,0x1c,0x04,0x0a,0x01,0x08,0x04,0xb0,0x01,0x23,0x02,0xaa,0xff,0x8c,\r\n0x00,0x00,0xff,0x27,0x00,0x00,0xff,0x21,0x00,0x00,0xff,0xcb,0x00,0x00,0xff,0x04,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0x14,0x00,0x00,0xff,0x2b,0x00,0x00,0xfe,0x96,0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x6a,0x00,0x00,0xff,0x10,0x00,0x00,0xff,0x23,0x01,0xd5,0x00,0x72,0x01,0xd5,0x00,0x72,0x04,0xb0,0x01,0xba,\r\n0x02,0xb0,0x00,0x66,0x02,0xb0,0x00,0x66,0x01,0x4e,0xff,0xbe,0x01,0xb2,0x00,0x66,0x01,0xb2,0x00,0x0a,0x01,0xb2,0x00,0x0a,0x02,0x3e,0x00,0x66,0x03,0x2d,0x00,0x14,0x02,0x3a,0x00,0x0a,0x01,0xd5,0x00,0x82,0x03,0x04,0x00,0x8d,0x01,0xc7,0x00,0x6a,0x01,0xc7,0x00,0x6e,0x01,0xc7,0x00,0x6e,0x02,0xaa,0x00,0xfb,0x02,0xaa,0x00,0xfb,\r\n0x01,0xba,0x00,0x14,0x01,0xba,0x00,0x0a,0x04,0xac,0x00,0x72,0x04,0xac,0x00,0x70,0x04,0xac,0x00,0x66,0x04,0xac,0x00,0x66,0x02,0xaa,0x01,0x20,0x02,0x42,0x00,0x87,0x02,0x25,0x00,0x52,0x02,0xaa,0x01,0x20,0x02,0x7b,0x00,0x3e,0x02,0x25,0x00,0x52,0x02,0x42,0x00,0x87,0x02,0x39,0x00,0xb6,0x02,0x39,0x00,0xb6,0x02,0xaa,0x00,0xfb,\r\n0x02,0xaa,0x00,0xfb,0x02,0xaa,0x00,0xa0,0x02,0xaa,0x00,0xa0,0x02,0xaa,0x00,0xa0,0x02,0x7b,0x00,0x3e,0x02,0xaa,0x00,0x79,0x02,0xb0,0x00,0x48,0x02,0x56,0x00,0x0a,0x01,0x4c,0x00,0x66,0x01,0xf0,0x00,0x3e,0x02,0x42,0x00,0x14,0x01,0xba,0x00,0x0a,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,0x03,0x10,0x00,0x96,\r\n0x03,0x10,0x00,0x96,0x02,0xaa,0x00,0x62,0x02,0xaa,0x00,0x62,0x02,0xaa,0x00,0x3c,0x03,0x52,0x00,0x00,0x02,0xaa,0x00,0x6e,0x01,0xf0,0xff,0x3a,0x02,0x18,0x00,0x0a,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,0x04,0x57,0x00,0x43,\r\n0x04,0x57,0x00,0x43,0x03,0x10,0x00,0x43,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x04,0x57,0x00,0x25,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,\r\n0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x03,0x10,0x00,0x1a,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,\r\n0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,\r\n0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x03,0x10,0x00,0x26,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,\r\n0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x04,0x57,0x00,0x26,0x03,0x10,0x00,0x26,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,0x04,0x57,0x00,0x23,\r\n0x03,0x10,0x00,0x23,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x04,0x57,0x00,0x4b,0x03,0x10,0x00,0x4b,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,\r\n0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x04,0x57,0x00,0x42,0x03,0x10,0x00,0x42,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x04,0x57,0x00,0x1a,0x03,0x10,0x00,0x1a,0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,\r\n0x04,0x57,0x00,0x24,0x04,0x57,0x00,0x24,0x03,0x10,0x00,0x24,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x04,0x57,0x00,0x2f,0x03,0x10,0x00,0x2f,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x04,0x57,0x00,0x4e,0x03,0x10,0x00,0x4e,0x04,0x57,0x00,0x96,\r\n0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x04,0x57,0x00,0x96,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x54,0x00,0x00,0xff,0x54,0x00,0x00,0xfd,0xa7,0x00,0x00,0xff,0x68,0x05,0x27,0x00,0x60,0x02,0x60,0x00,0xa6,0x05,0x0e,0x00,0xa6,0x02,0xb6,0x00,0x2b,0x04,0xbc,0xff,0xdb,0x04,0xbc,0xff,0xdb,0x02,0xaa,0x00,0x85,0x02,0xaa,0x00,0x85,\r\n0x02,0xaa,0x00,0xc8,0x02,0xaa,0x00,0xc8,0x02,0xaa,0x00,0x87,0x02,0x25,0x00,0x52,0x02,0x98,0x00,0x28,0x02,0x98,0x00,0x28,0x02,0xb2,0x00,0x23,0x02,0x39,0x00,0xad,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0x00,0x98,0x02,0xaa,0xff,0xf0,0x02,0xaa,0xff,0xf2,0x02,0xaa,0x00,0x3a,0x00,0x00,0xff,0x74,\r\n0x00,0x00,0xff,0xa6,0x00,0x00,0xfe,0xee,0x00,0x00,0xff,0x30,0x00,0x00,0xff,0x74,0x00,0x00,0xff,0x74,0x00,0x00,0xfe,0xa1,0x00,0x00,0xff,0xa6,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfc,0xe6,0x04,0x7b,0x00,0xbc,0x04,0xb4,0x00,0xa6,0x03,0xc0,0x00,0x0a,0x05,0x4a,0x00,0x00,0x06,0xa2,0x00,0x52,0x03,0xdf,0x00,0x3e,\r\n0x03,0xb2,0x00,0x60,0x04,0x66,0x00,0xa6,0x04,0x70,0x00,0x3c,0x03,0x56,0x00,0xa6,0x03,0x4c,0x00,0x5a,0x01,0xee,0x00,0x8e,0x02,0x62,0x00,0x14,0x03,0xfa,0x00,0xa6,0x03,0x23,0x00,0x42,0x05,0x9e,0x00,0xa6,0x04,0xa6,0x00,0xa6,0x04,0xb0,0x00,0x60,0x03,0xcd,0x00,0x5a,0x04,0xf2,0x00,0x60,0x04,0xf2,0x00,0x60,0x04,0xf2,0x00,0x4c,\r\n0x07,0x70,0x00,0x52,0x04,0x4a,0x00,0x60,0x04,0xc2,0x00,0x60,0x04,0xc2,0x00,0x60,0x03,0xb2,0x00,0xa6,0x03,0xa2,0x00,0x1e,0x03,0xa2,0x00,0x1e,0x03,0x48,0x00,0x1e,0x04,0x46,0x00,0x90,0x04,0x89,0x00,0x66,0x05,0xbe,0x00,0x3e,0x04,0x89,0x00,0x66,0x03,0xd5,0x00,0x0e,0x05,0xc8,0x00,0x18,0x03,0x9e,0x00,0x21,0x03,0x58,0x00,0x50,\r\n0x03,0x4a,0x00,0x50,0x04,0x3a,0x00,0x14,0x03,0x10,0x00,0xa6,0x03,0xc0,0x00,0x0a,0x04,0x9e,0x00,0xa6,0x03,0xb2,0x00,0xa6,0x04,0xba,0x00,0x60,0x04,0x7d,0x00,0x0a,0x02,0xe2,0x00,0x0a,0x03,0xe6,0xff,0xf6,0x02,0xc6,0x00,0x7b,0x02,0xdb,0x00,0x23,0x03,0x46,0x00,0x7b,0x02,0x72,0x00,0x7b,0x02,0x72,0x00,0x48,0x03,0x46,0x00,0x3e,\r\n0x03,0x64,0x00,0x7b,0x01,0x79,0x00,0x7b,0x01,0xd3,0x00,0x0a,0x02,0xd5,0x00,0x7b,0x02,0x44,0x00,0x7b,0x04,0x31,0x00,0x7b,0x03,0x81,0x00,0x7b,0x03,0x81,0x00,0x7b,0x03,0x68,0x00,0x3e,0x03,0x0c,0x00,0x3e,0x02,0xb6,0x00,0x7b,0x02,0xc2,0x00,0x7b,0x02,0x52,0x00,0x0a,0x03,0x50,0x00,0x74,0x04,0x35,0x00,0x10,0x02,0x85,0x00,0x3e,\r\n0x02,0x85,0x00,0x66,0x02,0xc6,0x00,0x3e,0x03,0xdf,0x00,0x48,0x02,0xc6,0x00,0x66,0x02,0xc6,0x00,0x3e,0x02,0x7d,0x00,0x3e,0x02,0x7d,0x00,0x48,0x02,0x1c,0x00,0x3e,0x02,0x1c,0x00,0x42,0x02,0xc6,0x00,0x3e,0x01,0x4e,0x00,0x58,0x02,0x6a,0x00,0x66,0x03,0xfa,0x00,0x66,0x02,0xb0,0x00,0x66,0x02,0xbc,0x00,0x3e,0x02,0x29,0x00,0x3e,\r\n0x02,0xbc,0x00,0x3e,0x02,0xbc,0x00,0x3e,0x02,0xbe,0x00,0x66,0x01,0x9c,0x00,0x0a,0x02,0xa6,0x00,0x5c,0x02,0x9c,0x00,0x3e,0x03,0xfa,0x00,0x60,0x02,0x40,0x00,0x0a,0x02,0x8e,0x00,0x14,0x02,0xac,0x00,0x60,0x02,0x56,0xff,0xec,0x02,0xbc,0x00,0x3e,0x03,0x44,0x00,0x3e,0x02,0x62,0xff,0xf6,0x01,0x4e,0x00,0x58,0x01,0xb2,0x00,0x66,\r\n0x02,0xa6,0x00,0x5c,0x02,0x40,0x00,0x0a,0x02,0xac,0x00,0x60,0x02,0x56,0xff,0xec,0x02,0xc6,0x00,0x66,0x03,0x44,0x00,0x3e,0x02,0x62,0xff,0xf6,0x04,0xa6,0x00,0xfc,0x01,0x4e,0x00,0x58,0x02,0xc6,0x00,0x66,0x04,0x57,0x00,0x42,0x07,0x04,0x00,0x8f,0x04,0xfe,0x00,0x74,0x04,0x50,0x00,0x76,0x04,0x50,0x00,0x76,0x06,0xe4,0x00,0xa6,\r\n0x05,0x2a,0x00,0x23,0x06,0xda,0x00,0xbc,0x05,0xf4,0x00,0x14,0x04,0x37,0x00,0x64,0x04,0xb6,0x00,0x60,0x04,0x00,0x00,0x2a,0x03,0x96,0x00,0x29,0x09,0x00,0x00,0x2c,0x03,0xa4,0x00,0x30,0x04,0xb5,0x00,0x26,0x07,0x1f,0x00,0xa2,0x07,0x7a,0x00,0x60,0x07,0x7a,0x00,0x60,0x05,0x06,0x00,0x16,0x05,0x29,0x00,0x16,0x04,0xf4,0x00,0x16,\r\n0x03,0xb2,0x00,0x21,0x03,0xc4,0x00,0x12,0x04,0x31,0xff,0xef,0x03,0x65,0x00,0x68,0x03,0x9e,0x00,0x21,0x04,0x16,0x00,0x30,0x01,0x9c,0x00,0x6c,0x00,0x00,0xff,0x2b,0x00,0x00,0xfe,0xbd,0x00,0x00,0xff,0x60,0x00,0x00,0xfc,0xe6,0x04,0xb0,0x00,0x21,0x04,0xf4,0x00,0x68,0x04,0xf4,0x00,0x5e,0x04,0xf4,0x00,0x68,0x03,0xc6,0x00,0xbc,\r\n0x03,0x10,0x00,0xa6,0x04,0xb4,0xff,0xbb,0x04,0xb6,0x00,0x60,0x02,0x81,0xff,0xf8,0x06,0xe4,0xff,0xc0,0x04,0x87,0xff,0xc0,0x04,0xb4,0xff,0xbb,0x02,0xc8,0xff,0xbb,0x02,0xae,0xff,0xa5,0x03,0xb5,0x00,0x27,0x02,0xb6,0xff,0xef,0x03,0x9e,0x00,0x21,0x04,0xb6,0x00,0xa6,0x03,0xb1,0x00,0x7a,0x04,0x9f,0x00,0x60,0x07,0x3d,0x00,0x16,\r\n0x05,0x2e,0x00,0x16,0x02,0x90,0x00,0x4a,0x02,0x22,0xff,0xfb,0x04,0xb4,0x00,0x22,0x04,0x46,0x00,0x22,0x04,0xc2,0x00,0x14,0x04,0xb4,0x00,0xa6,0x04,0xb6,0x00,0x60,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x03,0xfa,0x00,0xa6,0x01,0xf0,0x00,0x5c,0x06,0xe4,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xb4,0x00,0xa6,0x02,0xc8,0x00,0x5c,\r\n0x03,0x65,0x00,0x68,0x03,0x76,0xff,0x92,0x03,0xd5,0x00,0x0e,0x03,0xac,0x00,0x1a,0x03,0x9e,0x00,0x21,0x04,0x12,0x00,0x5a,0x04,0xb6,0x00,0x60,0x04,0xb6,0x00,0x60,0x04,0x2f,0x00,0x60,0x03,0x81,0x00,0x52,0x03,0x91,0x00,0x50,0x05,0xe0,0x00,0x52,0x01,0xf0,0x00,0x90,0x03,0xba,0x00,0x5a,0x01,0xfa,0xff,0x92,0x04,0x87,0x00,0x90,\r\n0x03,0x89,0xff,0xdd,0x02,0xc6,0x00,0x66,0x02,0x22,0x00,0x3e,0x02,0x26,0x00,0x3d,0x02,0xbd,0x00,0x3e,0x02,0x1c,0x00,0x42,0x01,0x77,0x00,0x0a,0x01,0x4e,0xff,0xdd,0x02,0xc6,0x00,0x3e,0x02,0xa6,0x00,0x5c,0x01,0x4e,0x00,0x0f,0x01,0x74,0x00,0x66,0x01,0x62,0x00,0x11,0x01,0x62,0x00,0x11,0x01,0x4e,0xff,0x87,0x01,0x74,0x00,0x66,\r\n0x01,0x4c,0x00,0x31,0x01,0xcb,0x00,0x66,0x03,0xfa,0x00,0x66,0x03,0xfa,0x00,0x60,0x02,0xb0,0xff,0xbc,0x02,0xb0,0x00,0x66,0x02,0xd0,0x00,0x66,0x02,0xb0,0x00,0x3e,0x02,0xef,0x00,0x3e,0x01,0xd8,0x00,0x42,0x01,0x4e,0xff,0xc9,0x01,0x9c,0x00,0x0a,0x02,0xa6,0x00,0x05,0x02,0xbd,0x00,0x3e,0x02,0xa2,0x00,0x5c,0x02,0x93,0x00,0x5c,\r\n0x02,0x40,0x00,0x0b,0x02,0x17,0x00,0x1a,0x02,0x17,0x00,0x1a,0x02,0x5b,0x00,0x1a,0x02,0x12,0xff,0xfb,0x02,0xbd,0x00,0x3e,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xdd,0x01,0xbc,0x00,0x70,0x02,0x85,0x00,0x3e,0x02,0x7d,0x00,0x3e,0x02,0xbc,0x00,0x3e,0x02,0x23,0x00,0x12,0x02,0x7d,0x00,0x48,\r\n0x04,0x51,0x00,0x54,0x04,0x51,0x00,0x0c,0x04,0x51,0x00,0x69,0x04,0x51,0x00,0x56,0x02,0xaa,0x00,0x42,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x50,0x00,0x00,0xff,0x29,0x03,0xb5,0x00,0x27,0x02,0x7b,0x00,0x3e,0x02,0x23,0x00,0x12,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,\r\n0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x04,0xea,0x00,0x5a,0x02,0x22,0xff,0xf9,0x02,0x22,0x00,0x02,0x02,0x22,0xff,0xfc,0x02,0x22,0xff,0xe5,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x02,0x22,0xff,0xee,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,\r\n0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x02,0x22,0xff,0xd3,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x04,0x6c,0x00,0x14,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,\r\n0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x0a,0xa0,0x00,0xb4,0x04,0x51,0x00,0xbc,0x02,0xee,0x00,0x48,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x01,0x60,0x00,0x5b,\r\n0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x48,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x02,0xee,0x00,0x48,\r\n0x02,0xcf,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xcf,0x00,0x2f,0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0xee,0x00,0x5d,0x02,0x6a,0x00,0xcc,0x02,0x6a,0x00,0x64,0x06,0x46,0x00,0xbc,0x05,0x0d,0x00,0xa6,\r\n0x05,0xaa,0x00,0x10,0x04,0x9f,0x00,0x10,0x05,0xf8,0x00,0xbc,0x05,0x06,0x00,0xa6,0x07,0x78,0x00,0xbc,0x06,0x06,0x00,0xa6,0x04,0x50,0x00,0x5a,0x03,0x04,0x00,0x6e,0x04,0x1d,0x00,0x8d,0x05,0x79,0x00,0xe8,0x04,0x47,0x00,0x5e,0x06,0x8e,0x00,0xbc,0x05,0x9e,0x00,0xa6,0x00,0x00,0xff,0xdc,0x00,0x00,0xff,0x25,0x00,0x00,0xff,0xdc,\r\n0x00,0x00,0xfe,0x51,0x02,0x01,0x00,0xab,0x02,0x01,0x00,0x49,0x02,0x01,0xff,0xa2,0x02,0x01,0x00,0x49,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,\r\n0x08,0x04,0xff,0xba,0x03,0x56,0x00,0xb9,0x02,0x01,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xad,0x00,0x2b,0x03,0x57,0x00,0x62,0x04,0x02,0x00,0x4f,0x04,0x02,0xff,0xef,0x04,0xad,0xff,0xf4,0x04,0xad,0x00,0x49,0x04,0x02,0x00,0x22,0x08,0x04,0xff,0xba,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,\r\n0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x65,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x05,0x2a,0x00,0xa6,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xae,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x53,0x05,0x58,0x00,0x67,0x04,0x02,0x00,0xa1,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x9a,\r\n0x04,0x02,0x00,0xa1,0x06,0xae,0x00,0x9a,0x02,0x01,0x00,0x6f,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x04,0xad,0x00,0x49,0x04,0xad,0x00,0x49,0x04,0xad,0xff,0xa2,0x06,0xae,0x00,0x82,0x02,0x01,0x00,0x00,0x04,0xad,0xff,0xa2,0x02,0x01,0x00,0x6f,\r\n0x04,0x02,0x00,0xab,0x03,0x57,0x00,0x5a,0x02,0x01,0xff,0xa2,0x02,0x01,0x00,0x49,0x04,0x02,0x00,0x00,0x02,0x01,0x00,0x49,0x06,0x03,0x00,0x82,0x02,0x01,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0x02,0x00,0x52,\r\n0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x0a,0xb1,0x00,0x9b,0x0a,0xb1,0x00,0x9b,0x06,0xae,0x00,0x19,0x06,0xae,0x00,0x19,0x04,0x02,0x00,0x65,0x04,0x02,0x00,0x65,0x01,0x56,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x06,0xae,0x00,0xab,0x05,0x58,0x00,0x9b,\r\n0x04,0xad,0x00,0x39,0x05,0x58,0x00,0x9b,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0x00,0x06,0x03,0x00,0x9a,0x06,0x03,0x00,0x9a,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0x33,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xd4,0x00,0x00,0x00,0x45,0x04,0xad,0x00,0x52,0x02,0x01,0x00,0x52,\r\n0x05,0x2a,0x00,0xa6,0x00,0x00,0xff,0xa2,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x02,0xac,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x03,0x57,0x00,0x00,\r\n0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0xa1,0x04,0x02,0x00,0xab,0x03,0x56,0x00,0xb9,0x02,0x01,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xad,0x00,0x2b,0x04,0x02,0x00,0x2b,0x04,0xae,0x00,0x72,0x04,0x02,0x00,0x2f,\r\n0x04,0xad,0xff,0xf4,0x04,0xad,0x00,0x49,0x04,0x02,0x00,0x22,0x05,0x58,0x00,0x9b,0x05,0x2a,0x00,0xa6,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x05,0x58,0x00,0x9b,0x04,0x02,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xab,0x07,0x59,0x00,0x72,\r\n0x02,0xac,0x00,0x72,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x02,0x01,0x00,0x2d,0x04,0xae,0x00,0x7c,0x03,0x1d,0x00,0x42,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x08,0x04,0x00,0xa1,0x04,0x02,0x00,0x57,0x00,0x00,0x00,0xc4,0x00,0x00,0xff,0x17,0x00,0x00,0x00,0x10,\r\n0x05,0x2a,0x00,0xa6,0x00,0x00,0xff,0xc2,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x05,0x2a,0x00,0xa6,0x06,0x03,0x00,0x9b,0x05,0x2a,0x00,0xa6,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x02,0x01,0xff,0x97,0x02,0x01,0xff,0x97,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,0x02,0x01,0xff,0xc2,\r\n0x03,0x57,0x00,0xab,0x03,0x57,0x00,0xab,0x04,0x02,0x00,0x00,0x04,0x02,0xff,0xe7,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,\r\n0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,\r\n0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0x02,0x00,0x00,\r\n0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,\r\n0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,\r\n0x06,0x03,0x00,0x9b,0x08,0xaf,0x00,0x19,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,\r\n0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,\r\n0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x04,0x58,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x06,0xae,0x00,0x32,\r\n0x07,0x58,0x00,0x1e,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x00,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x00,0x00,0xff,0xa8,0x00,0x00,0xff,0xb7,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x1d,0x00,0x00,0xff,0x2b,0x08,0xfc,0x00,0x2d,0x08,0xad,0x01,0x46,\r\n0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x16,0x00,0x00,0xff,0x2b,0x00,0x00,0xff,0xc9,0x02,0x01,0x00,0x4d,0x03,0x57,0x00,0x21,0x00,0x00,0xff,0x82,0x00,0x00,0x00,0x32,0x04,0xcd,0x00,0x64,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x16,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,\r\n0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x03,0x57,0x00,0x5a,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xc2,0x04,0xad,0xff,0xc2,0x04,0xad,0x00,0x34,0x04,0xad,0x00,0x34,0x04,0xad,0x00,0x3a,0x04,0xad,0x00,0x3a,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,\r\n0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x65,0x04,0x02,0x00,0x52,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x02,0xfe,0x00,0x00,0x04,0xad,0xff,0x97,0x04,0xad,0xff,0x97,0x04,0xc1,0x00,0x66,0x09,0xd0,0x00,0x73,0x06,0xa8,0x00,0x73,\r\n0x04,0x40,0x00,0x49,0x0c,0x2d,0x00,0x73,0x08,0xaf,0x00,0x49,0x02,0xac,0x00,0x46,0x04,0xad,0x00,0x32,0x00,0x00,0xff,0xc9,0x00,0x00,0xff,0xe9,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x88,0x00,0x00,0xff,0xc4,0x00,0x00,0x00,0xc4,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x32,0x00,0x00,0xff,0xc6,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,\r\n0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x06,0x03,0x00,0x53,0x05,0x58,0x00,0x67,0x05,0x58,0xff,0xba,0x04,0x02,0xff,0xba,0x00,0x00,0xfe,0x93,0x00,0x00,0xfe,0xa9,0x00,0x00,0xfe,0x91,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x0a,0x05,0x00,0xa1,0x0c,0x06,0x00,0x9b,0x00,0x00,0xff,0xd4,\r\n0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0x6c,0x00,0x00,0xff,0xd4,0x04,0xad,0x00,0x35,0x04,0x02,0x00,0x65,0x00,0x00,0xff,0xe7,0x00,0x00,0xff,0xdf,0x00,0x00,0xff,0xdf,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x3d,0x00,0x00,0x00,0x05,0x07,0x59,0x00,0xab,0x03,0x56,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,\r\n0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,\r\n0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x65,0x04,0xad,0x00,0x65,0x04,0xae,0xff,0xba,\r\n0x04,0xad,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,\r\n0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,\r\n0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x05,0x2a,0x00,0xa6,0x04,0xad,0x00,0x52,0x04,0xad,0x00,0x52,0x00,0x00,0xff,0x1a,0x04,0x00,0xff,0x1a,0x04,0x00,0x01,0x9f,0x04,0x00,0x01,0xb3,0x02,0xf4,0x00,0x14,0x04,0x96,0x00,0x1c,0x05,0x7f,0x00,0x1e,0x05,0x07,0x00,0x18,0x04,0x0c,0x00,0x8b,0x04,0x2f,0x00,0x60,0x02,0xdb,0x00,0x14,\r\n0x01,0xf0,0xff,0x3a,0x06,0x01,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xc9,0x00,0x1c,0x02,0xc8,0x00,0x1c,0x04,0x6c,0x00,0x12,0x03,0xdf,0x00,0x0e,0x03,0xcd,0x00,0x5a,0x03,0xb2,0x00,0x60,0x03,0xcd,0x00,0x5a,0x01,0xf0,0x00,0xa6,0x04,0x1e,0x00,0x29,0x03,0x48,0x00,0x1e,0x04,0xf4,0x00,0x1a,0x03,0xe0,0x00,0x1a,0x04,0xb8,0x00,0x1a,\r\n0x03,0xac,0x00,0x1a,0x04,0x54,0x00,0x70,0x03,0x81,0x00,0x52,0x05,0x62,0x00,0x10,0x04,0x37,0x00,0x10,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0xdb,0x05,0xed,0x00,0x35,0x03,0x9c,0x00,0x48,\r\n0x03,0xcd,0x00,0x5a,0x03,0xc4,0x00,0x1c,0x02,0x4a,0x00,0x14,0x04,0x19,0x00,0x27,0x04,0x7b,0x00,0x1c,0x04,0xc9,0x00,0xbc,0x04,0x12,0x00,0x5a,0x02,0xb6,0xff,0xb5,0x05,0xf0,0x00,0xbc,0x04,0xb3,0x00,0xa6,0x05,0x1c,0x00,0xbc,0x04,0x4a,0x00,0xa6,0x04,0xf5,0x00,0x21,0x03,0xfb,0x00,0x21,0x04,0x8d,0x00,0x4b,0x04,0x1f,0x00,0xbc,\r\n0x03,0x2b,0x00,0xa6,0x05,0x98,0x00,0x60,0x02,0xf7,0x00,0xaf,0x03,0x4f,0x00,0xaf,0x03,0x5a,0x00,0xaf,0x03,0xde,0x00,0x75,0x04,0xc9,0x00,0x75,0x04,0xc9,0x00,0x75,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x02,0xaa,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x55,0x00,0x00,0x04,0x50,0x00,0x00,\r\n0x01,0xbc,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,\r\n0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xa1,0x07,0x6c,0x00,0x79,0x03,0x64,0x00,0x3f,0x06,0x08,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0xf5,0x00,0xb0,0x00,0x00,0xfc,0x8c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x60,0x00,0x4a,0x07,0x60,0x00,0x8d,0x06,0xe7,0x00,0x96,0x03,0xc7,0x00,0x96,0x06,0xe7,0x00,0xe7,0x03,0xc7,0x00,0x96,0x06,0xe5,0x00,0x96,0x05,0x28,0x00,0x33,0x05,0x78,0x00,0xe6,0x05,0x9d,0x00,0xe6,0x05,0x92,0x00,0xe6,0x06,0x1e,0x00,0xe6,\r\n0x06,0xe4,0x00,0xa5,0x08,0x00,0x00,0xa5,0x06,0xe4,0x00,0x50,0x06,0xe4,0x00,0xa5,0x06,0xe4,0x00,0x50,0x06,0xe4,0x00,0xa5,0x06,0xe4,0x00,0x8c,0x06,0xe4,0x02,0x0d,0x06,0xe4,0x00,0xa5,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0x5e,0x05,0x7a,0x00,0xcd,0x05,0xe8,0x00,0x5e,0x04,0xa0,0x00,0x0e,0x08,0x7e,0x00,0x1a,\r\n0x06,0x9d,0x00,0x18,0x03,0xc7,0x00,0x96,0x03,0xc7,0x00,0x96,0x02,0x46,0x00,0xb4,0x02,0x46,0x00,0xb4,0x02,0x46,0x00,0xb4,0x02,0xf8,0x00,0x63,0x01,0xbc,0x00,0x70,0x04,0x82,0x00,0xe8,0x01,0xd7,0x00,0x94,0x01,0xd7,0x00,0xa3,0x06,0xae,0x03,0x9b,0x05,0x10,0x02,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xa5,0x00,0x00,0xff,0xcd,0x03,0x33,0x00,0x4b,0x00,0x00,0xfe,0xd2,0x01,0x9d,0x00,0x94,0x00,0x00,0x02,0x00,0x00,0x00,0xfd,0x3c,0x01,0xbc,0x00,0x70,\r\n0x00,0x00,0xff,0x9c,0x00,0x00,0xff,0x9c,0x05,0x18,0x00,0xa5,0x04,0x90,0x00,0x50,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x02,0x25,0x00,0xbe,0x02,0xb2,0x00,0x31,0x05,0x65,0x00,0xbe,0x05,0x72,0x00,0xa0,0x02,0x25,0x00,0xbe,0x04,0x78,0x00,0x2f,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x8d,0x00,0xbe,\r\n0x05,0x65,0x00,0xa4,0x02,0x25,0x00,0xbe,0x03,0x32,0x00,0x67,0x05,0x68,0x00,0x96,0x04,0xd6,0x00,0x59,0x04,0xe4,0x00,0x6c,0x05,0x0c,0x00,0x96,0x04,0x85,0x00,0x1e,0x04,0xaf,0x00,0x4b,0x05,0x4f,0x00,0x42,0x04,0x79,0x00,0x2f,0x06,0x47,0x00,0x6e,0x05,0xcf,0x00,0x34,0x04,0x2e,0x00,0xbe,0x04,0x2e,0x00,0xbe,0x04,0x2e,0x00,0xbe,\r\n0x01,0xd5,0x00,0x6e,0x03,0x04,0x00,0x6e,0x04,0x78,0x00,0x2f,0x04,0x78,0x00,0x2f,0x04,0x68,0xff,0x51,0x04,0x68,0xff,0x51,0x04,0x53,0x00,0xbe,0x04,0xd6,0x00,0x59,0x05,0x18,0x00,0xa5,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x8d,0x00,0xbe,0x04,0x79,0x00,0x2f,0x05,0xcf,0x00,0x34,\r\n0x04,0x6a,0x00,0x5f,0x06,0x47,0x00,0x6e,0x06,0x47,0x00,0x61,0x06,0x47,0x00,0x6e,0x06,0x47,0x00,0x61,0x05,0x18,0x00,0xa5,0x05,0x18,0x00,0xa5,0x05,0x18,0x00,0xa5,0x04,0x90,0x00,0x50,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x02,0x6b,0xff,0xfb,0x02,0xda,0xff,0xfa,0x05,0x72,0x00,0xa0,0x02,0x6b,0xff,0xfb,\r\n0x04,0x78,0x00,0x2f,0x04,0x5c,0x00,0x4e,0x04,0x68,0x00,0x59,0x05,0x65,0x00,0xa4,0x03,0x32,0x00,0x67,0x05,0x68,0x00,0x96,0x04,0xe4,0x00,0x6c,0x05,0x0c,0x00,0x96,0x04,0xaf,0x00,0x4b,0x05,0x4f,0x00,0x42,0x04,0x79,0x00,0x2f,0x06,0x47,0x00,0x6e,0x05,0xcf,0x00,0x34,0x02,0x25,0x00,0xb5,0x04,0x90,0x00,0x50,0x04,0x5c,0x00,0x4e,\r\n0x05,0x0c,0x00,0x96,0x05,0x38,0x00,0x59,0x09,0x9a,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x18,0x00,0xa5,0x04,0x68,0x00,0x59,0x05,0x38,0x00,0x59,0x05,0x52,0x00,0x59,0x05,0x38,0x00,0x59,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x15,0x00,0x00,0xff,0x73,0x00,0x00,0xff,0xa1,0x00,0x00,0xff,0x49,0x00,0x00,0xff,0x45,0x00,0x00,0xff,0x61,\r\n0x00,0x00,0xfe,0xab,0x00,0x00,0xfe,0x26,0x00,0x00,0x00,0x64,0x00,0x00,0xff,0x42,0x00,0x00,0xff,0x45,0x00,0x00,0x00,0x64,0x00,0x00,0xfe,0xe1,0x00,0x00,0xfe,0x06,0x00,0x00,0xff,0x17,0x00,0x00,0xff,0x5b,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x6a,0x00,0x00,0xff,0x4b,0x00,0x00,0xff,0x45,0x00,0x00,0xfe,0xe1,0x00,0x00,0xff,0x68,\r\n0x00,0x00,0xff,0x45,0x00,0x00,0xff,0x17,0x00,0x00,0xff,0x43,0x00,0x00,0xff,0x4b,0x00,0x00,0xff,0x6a,0x00,0x00,0x00,0x64,0x00,0x00,0xfd,0x87,0x00,0x00,0xff,0x29,0x00,0x00,0xff,0xa4,0x03,0x32,0x00,0xab,0x02,0x25,0x00,0xb6,0x00,0x00,0xfe,0xb2,0x06,0x08,0x00,0x5e,0x05,0x22,0x00,0x33,0x05,0x55,0x00,0x64,0x05,0xa6,0x00,0x5a,\r\n0x04,0x68,0x00,0x64,0x05,0x55,0x00,0x64,0x05,0xf6,0x00,0x32,0x06,0x19,0x00,0x5e,0x03,0xc4,0x00,0x20,0x05,0x08,0x00,0x8c,0x05,0xf6,0x00,0x32,0x05,0xe2,0x00,0x5c,0x05,0x4a,0x00,0xc9,0x06,0x08,0x00,0x5e,0x06,0x7f,0x00,0x32,0x06,0x36,0x00,0x32,0x05,0x55,0x00,0x64,0x04,0x68,0x00,0xb0,0x04,0x7b,0x00,0xbc,0x06,0x08,0x00,0x5e,\r\n0x05,0xa6,0x00,0x5a,0x04,0x94,0x00,0x32,0x05,0x7f,0x00,0xaa,0x05,0x6b,0x00,0xa6,0x05,0x4a,0x00,0xa6,0x05,0x6b,0x00,0xc9,0x05,0x7d,0x00,0x5e,0x05,0xe2,0x00,0x5c,0x04,0x9c,0x00,0xbc,0x05,0x19,0x00,0x64,0x05,0x6b,0x00,0xc9,0x05,0x3b,0x00,0x32,0x06,0x31,0x00,0x32,0x05,0x0e,0x00,0xc9,0x04,0xf4,0x00,0x5e,0x05,0x22,0x00,0x33,\r\n0x05,0x5a,0x00,0x96,0x06,0x8c,0x00,0x52,0x03,0xf8,0x00,0x60,0x04,0xb0,0x00,0x60,0x04,0xb0,0x00,0x60,0x07,0x00,0x00,0x60,0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x60,0x06,0x2c,0x00,0x3c,0x07,0x21,0x00,0x60,0x04,0xe1,0x00,0x60,0x04,0x51,0x00,0x60,0x08,0x66,0x00,0x60,0x04,0x88,0x00,0x60,0x04,0x88,0x00,0x60,0x06,0x0e,0x00,0x60,\r\n0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x3f,0x06,0x0e,0x00,0x60,0x04,0x7d,0x00,0x9a,0x06,0x08,0x00,0x5e,0x06,0x82,0x00,0x60,0x06,0xff,0x00,0x40,0x04,0x51,0x00,0x60,0x06,0x2e,0x00,0x60,0x04,0x51,0x00,0x60,0x05,0x3b,0x00,0x32,0x04,0x58,0x00,0xa6,0x04,0xeb,0x00,0x60,0x04,0x88,0x00,0x60,0x05,0x0d,0x00,0x32,0x04,0x50,0x00,0x50,\r\n0x04,0xd6,0x00,0xae,0x06,0x27,0x00,0x21,0x04,0x53,0x00,0x60,0x04,0xf5,0x00,0x60,0x05,0x4f,0x00,0x32,0x04,0x51,0x00,0x5e,0x04,0x51,0x00,0x60,0x04,0xc4,0x00,0x52,0x07,0xa8,0x00,0x60,0x04,0x51,0x00,0x60,0x04,0x51,0x00,0x5f,0x04,0xb0,0x00,0x60,0x04,0xb1,0x00,0x40,0x03,0x64,0x00,0x70,0x02,0xa8,0x00,0x32,0x04,0x75,0x00,0x28,\r\n0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x28,0x04,0x48,0x00,0x30,0x04,0x75,0x00,0x28,0x07,0x10,0x00,0x28,0x04,0x75,0xff,0x3f,0x07,0x13,0x00,0x5b,0x03,0xf4,0x00,0x28,0x04,0x75,0x00,0x59,0x07,0x17,0x00,0x31,0x05,0x51,0x00,0x30,0x04,0x75,0x00,0x31,0x07,0x13,0x00,0x5b,0x05,0xf2,0x00,0x28,0x05,0xf2,0x00,0x28,0x07,0x0c,0x00,0x59,\r\n0x04,0x9c,0x00,0x59,0x04,0x75,0x00,0x42,0x07,0x13,0x00,0x5b,0x07,0x13,0x00,0x5b,0x04,0x72,0x00,0x71,0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x28,0x04,0x75,0x00,0x5b,0x04,0x75,0x00,0x2f,0x04,0x75,0x00,0x42,0x07,0x0c,0x00,0x59,0x07,0x10,0x00,0x3f,0x04,0xb0,0x00,0x21,0x04,0x75,0x00,0x42,0x04,0x89,0xff,0x8a,0x07,0x17,0x00,0x31,\r\n0x04,0xc5,0x00,0x2f,0x04,0x56,0x00,0x35,0x04,0x75,0x00,0x46,0x04,0x75,0x00,0x28,0x07,0x0c,0x00,0x59,0x06,0x3a,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x05,0x86,0x00,0x5e,0x05,0x94,0x00,0x78,0x05,0x7f,0x00,0xaa,0x05,0xa8,0x00,0x64,0x04,0xff,0x00,0xbc,0x05,0x7f,0x00,0xaa,0x06,0x3f,0x00,0xaa,0x05,0x86,0x00,0x5e,0x05,0x33,0x00,0xaa,\r\n0x04,0x58,0x00,0xbc,0x06,0x53,0x00,0xbc,0x05,0x62,0x00,0x5e,0x05,0x7f,0x00,0xaa,0x04,0x90,0x00,0x21,0x05,0x54,0x00,0x5e,0x05,0x94,0x00,0x78,0x05,0xf6,0x00,0x62,0x05,0xc6,0x00,0xaa,0x04,0xab,0x00,0x5e,0x05,0x94,0xff,0xf6,0x05,0x54,0x00,0x5e,0x05,0xcf,0x00,0xaa,0x05,0x54,0x00,0x5e,0x06,0x33,0x00,0x82,0x05,0x9a,0x00,0x64,\r\n0x05,0xc6,0x00,0xaa,0x05,0xcf,0x00,0xaa,0x05,0x7a,0x00,0x5e,0x05,0x19,0x00,0x64,0x05,0x9d,0x00,0xaa,0x05,0x6f,0x00,0x90,0x05,0xc6,0x00,0xaa,0x06,0x56,0x00,0x5e,0x05,0x3f,0x00,0x14,0x06,0x08,0x00,0x5e,0x05,0xcb,0x00,0x86,0x00,0xca,0x00,0x00,0x00,0xe1,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x92,0x00,0x00,0x01,0x35,0x00,0x00,\r\n0x02,0x29,0x00,0x00,0x02,0xce,0x00,0x00,0x06,0xe4,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0xf2,0x00,0x60,0x04,0xc3,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0xec,0x00,0x60,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0xa6,0x05,0x2b,0x00,0xa6,0x04,0xca,0x00,0x5e,0x04,0x87,0x00,0xa6,0x02,0x76,0x00,0xa6,0x06,0xb1,0x00,0xa6,0x04,0xb0,0x00,0x60,\r\n0x04,0x87,0x00,0x90,0x04,0x87,0x00,0xa6,0x04,0x57,0x00,0x60,0x04,0xd4,0x00,0xa6,0x04,0x18,0x00,0x60,0x04,0xa5,0x00,0x90,0x02,0x26,0xff,0x70,0x04,0xb0,0xff,0xf6,0x04,0x26,0x00,0x60,0x04,0x87,0x00,0xa6,0x03,0x4c,0x00,0x60,0x06,0xe4,0x00,0x90,0x04,0x64,0x00,0x60,0x04,0x87,0x00,0xa6,0x04,0x87,0x00,0x90,0x04,0xbe,0x00,0x90,\r\n0x06,0xa6,0x00,0x8f,0x04,0x87,0x00,0xa6,0x04,0xb6,0x00,0x60,0x03,0x26,0x00,0xa6,0x06,0xa6,0x00,0x8f,0x04,0xb4,0x00,0x00,0x04,0xb0,0x00,0x60,0x05,0x7f,0x00,0x60,0x05,0x72,0x00,0x90,0x01,0xbc,0x00,0x70,0x02,0x42,0x00,0x2a,0x09,0x0e,0x00,0x90,0x08,0xf8,0x00,0x90,0x08,0xf8,0x00,0x90,0x09,0x0e,0x00,0x90,0x0b,0x67,0x00,0x90,\r\n0x04,0x50,0x00,0x83,0x04,0x50,0x00,0x37,0x01,0xf0,0x00,0x90,0x04,0x50,0x00,0x5c,0x03,0x1e,0x00,0x79,0x04,0x50,0x00,0x99,0x04,0x50,0x00,0x7b,0x04,0x7d,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x1e,0x00,0x45,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x5c,0x04,0x50,0x00,0xe8,0x04,0x50,0x00,0x99,\r\n0x04,0x50,0x00,0x7b,0x04,0x50,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x50,0x00,0x60,0x04,0x50,0x00,0x5a,0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x56,0x03,0x1e,0x00,0x53,0x04,0x50,0x00,0x6d,0x04,0x50,0x00,0x7b,0x04,0x7d,0x00,0x32,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6f,0x04,0x1e,0x00,0x45,0x04,0x50,0x00,0x5a,\r\n0x04,0x50,0x00,0x5e,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0xa8,0x04,0x50,0x00,0x60,0x04,0x50,0x00,0x83,0x04,0x50,0x00,0x0e,0x04,0x50,0x00,0xa4,0x04,0x50,0x00,0x6e,0x04,0x50,0x00,0x56,0x04,0x50,0x00,0x64,0x04,0x50,0x00,0x5e,0x02,0xee,0x00,0x48,0x02,0xee,0x00,0x50,0x02,0xee,0x00,0x68,0x02,0xee,0x00,0x81,0x02,0xee,0x00,0x2f,\r\n0x02,0xee,0x00,0x7b,0x02,0xee,0x00,0x49,0x02,0xee,0x00,0x4d,0x02,0xee,0x00,0x41,0x02,0xee,0x00,0x49,0x04,0x04,0x00,0x00,0x03,0xec,0x00,0xb0,0x04,0x0f,0x00,0x58,0x04,0xac,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x5b,0x00,0xb0,0x04,0x94,0x00,0x58,0x04,0xe9,0x00,0xb0,0x02,0x04,0x00,0xb0,0x02,0x81,0x00,0x11,0x03,0xec,0x00,0xb0,\r\n0x03,0x4c,0x00,0xb0,0x06,0x12,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x04,0xed,0x00,0x58,0x03,0xe0,0x00,0xb0,0x04,0xed,0x00,0x58,0x03,0xf8,0x00,0xb0,0x03,0x5d,0x00,0x68,0x03,0x85,0x00,0x19,0x04,0xc2,0x00,0x9c,0x04,0x15,0x00,0x00,0x06,0x69,0x00,0x05,0x04,0x02,0x00,0x1e,0x03,0xbb,0x00,0x14,0x03,0xdb,0x00,0x29,0x05,0x9f,0xff,0xf8,\r\n0x06,0x31,0x00,0x58,0x03,0x4c,0x00,0x38,0x05,0x01,0x00,0x41,0x03,0xe0,0x00,0xb0,0x04,0xac,0x00,0x2d,0x04,0x33,0x00,0xa6,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x0f,0x00,0x58,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,\r\n0x03,0x70,0x00,0xb0,0x02,0x04,0xff,0xfc,0x02,0x04,0x00,0x87,0x02,0x04,0xff,0xe9,0x02,0x04,0xff,0xe0,0x05,0x2a,0x00,0xb0,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x03,0xbb,0x00,0x14,\r\n0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x0f,0x00,0x58,0x04,0x0f,0x00,0x58,0x04,0x94,0x00,0x58,0x04,0xac,0x00,0xb0,0x04,0xac,0x00,0x2d,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x03,0x70,0x00,0xb0,0x04,0x94,0x00,0x58,0x04,0x94,0x00,0x58,0x04,0x0f,0x00,0x58,\r\n0x04,0xe9,0x00,0xb0,0x04,0xe9,0x00,0x2d,0x02,0x04,0xff,0xc3,0x02,0x04,0x00,0x04,0x02,0x04,0xff,0xf1,0x02,0x04,0x00,0x3f,0x02,0x04,0x00,0xa0,0x04,0x85,0x00,0xb0,0x02,0x81,0x00,0x11,0x03,0xec,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x03,0x4c,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x05,0x2a,0x00,0xb0,\r\n0x05,0x2a,0x00,0xb0,0x05,0x38,0x00,0xb0,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x04,0xed,0x00,0x58,0x03,0xf8,0x00,0xb0,0x03,0xf8,0x00,0xb0,0x03,0xf8,0x00,0xb0,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x5d,0x00,0x68,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,0x03,0x85,0x00,0x19,\r\n0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x04,0xc2,0x00,0x9c,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x06,0x69,0x00,0x05,0x03,0xbb,0x00,0x14,0x03,0xbb,0x00,0x14,0x03,0xbb,0x00,0x14,0x03,0xdb,0x00,0x29,0x03,0xdb,0x00,0x29,0x03,0xdb,0x00,0x29,\r\n0x04,0x04,0x00,0x00,0x05,0x9f,0xff,0xf8,0x05,0x01,0x00,0x41,0x04,0x04,0x00,0x00,0x03,0xec,0x00,0xb0,0x03,0x22,0x00,0x9c,0x04,0x4a,0x00,0x2a,0x03,0x70,0x00,0xb0,0x03,0xdb,0x00,0x29,0x04,0xe9,0x00,0xb0,0x04,0xed,0x00,0x58,0x02,0x04,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x15,0x00,0x00,0x06,0x12,0x00,0xb0,0x05,0x2a,0x00,0xb0,\r\n0x03,0x95,0x00,0x49,0x04,0xed,0x00,0x58,0x04,0xe7,0x00,0xb0,0x03,0xe0,0x00,0xb0,0x03,0xac,0x00,0x30,0x03,0x85,0x00,0x19,0x03,0xbb,0x00,0x14,0x05,0x02,0x00,0x50,0x04,0x02,0x00,0x1e,0x05,0x40,0x00,0x7d,0x05,0x10,0x00,0x58,0x04,0x04,0x00,0x00,0x03,0x70,0x00,0xb0,0x04,0xe9,0x00,0xb0,0x02,0x04,0x00,0x87,0x04,0xed,0x00,0x58,\r\n0x03,0xbb,0x00,0x14,0x05,0x10,0x00,0x58,0x02,0x04,0xff,0xe0,0x03,0xbb,0x00,0x14,0x03,0x70,0x00,0xb0,0x04,0x8d,0x00,0x22,0x03,0x36,0x00,0xb0,0x04,0x19,0x00,0x58,0x03,0x5d,0x00,0x68,0x02,0x04,0x00,0xb0,0x02,0x04,0xff,0xe0,0x02,0x81,0x00,0x11,0x06,0x80,0x00,0x0d,0x06,0x94,0x00,0xb0,0x04,0xe1,0x00,0x22,0x03,0xec,0x00,0xb0,\r\n0x03,0xf4,0x00,0x36,0x04,0xdf,0x00,0xb0,0x04,0x04,0x00,0x00,0x03,0xe7,0x00,0xb0,0x03,0xec,0x00,0xb0,0x03,0x36,0x00,0xb0,0x04,0xaf,0x00,0x12,0x03,0x70,0x00,0xb0,0x05,0xe7,0x00,0x00,0x03,0x88,0x00,0x50,0x05,0x2a,0x00,0xb0,0x05,0x2a,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x8a,0x00,0x0d,0x06,0x12,0x00,0xb0,0x04,0xe9,0x00,0xb0,\r\n0x04,0xed,0x00,0x58,0x04,0xe7,0x00,0xb0,0x03,0xe0,0x00,0xb0,0x04,0x0f,0x00,0x58,0x03,0x85,0x00,0x19,0x03,0xf4,0x00,0x36,0x05,0x02,0x00,0x50,0x04,0x02,0x00,0x1e,0x05,0x11,0x00,0xb0,0x04,0x60,0x00,0x7d,0x06,0x73,0x00,0xb0,0x06,0xa4,0x00,0xb0,0x04,0x89,0x00,0x22,0x05,0xa1,0x00,0xb0,0x03,0xec,0x00,0xb0,0x04,0x1e,0x00,0x54,\r\n0x06,0xe0,0x00,0xb0,0x03,0xe9,0x00,0x12,0x03,0x31,0x00,0xb0,0x04,0xa5,0x00,0x35,0x04,0xa7,0x00,0x35,0x04,0xfa,0x00,0x35,0x07,0x1e,0x00,0x35,0x07,0x1e,0x00,0x35,0x05,0x45,0x00,0x57,0x04,0x0f,0x00,0x58,0x04,0x94,0x00,0x58,0x03,0x5d,0x00,0x68,0x04,0x96,0x00,0xbc,0x04,0x7b,0x00,0xbc,0x04,0x7b,0x00,0x52,0x05,0x9c,0x00,0xbc,\r\n0x04,0x31,0x00,0x29,0x04,0x31,0x00,0x27,0x05,0x7d,0x00,0x5e,0x04,0xa4,0x00,0xbc,0x04,0xa4,0x00,0x02,0x02,0xdb,0x00,0x14,0x04,0xf4,0x00,0x5e,0x04,0xf4,0x00,0x68,0x04,0x90,0x00,0x21,0x03,0xe8,0x00,0xbc,0x03,0xe8,0x00,0x54,0x07,0x2f,0x00,0xbc,0x05,0xfc,0x00,0xbc,0x03,0xc4,0x00,0xbc,0x04,0x40,0x00,0x79,0x04,0xc9,0x00,0xbc,\r\n0x04,0xc9,0x00,0x09,0x04,0xf8,0x00,0x12,0x04,0xf8,0x00,0x12,0x05,0xae,0x00,0xbc,0x05,0x7d,0x00,0x91,0x02,0xdb,0x00,0xb0,0x07,0x79,0x00,0x1a,0x04,0xb8,0x00,0x1a,0x04,0x6c,0x00,0x12,0x04,0x96,0x00,0x67,0x05,0x29,0x00,0x16,0x05,0x29,0x00,0x17,0x04,0x0c,0x00,0xbc,0x04,0x0c,0x00,0x58,0x02,0x21,0x00,0xbc,0x06,0x08,0x00,0x5e,\r\n0x05,0x7f,0x00,0xaa,0x05,0x7f,0x00,0xaa,0x03,0xc4,0x00,0x20,0x05,0x9c,0x00,0x5e,0x01,0xbc,0x00,0x70,0x01,0xbc,0x00,0x27,0x03,0x78,0x00,0x70,0x03,0x78,0x00,0x70,0x01,0xbc,0x00,0x27,0x01,0xbc,0x00,0x70,0x04,0xef,0x00,0x90,0x03,0x33,0x00,0x90,0x02,0x21,0x00,0x30,0x06,0x08,0x00,0x5e,0x05,0xa6,0x00,0x77,0x02,0x46,0x00,0xb4,\r\n0x01,0xbc,0x00,0x5c,0x01,0xbc,0x00,0x5e,0x03,0x96,0x00,0x83,0x03,0x04,0x00,0x6f,0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x6f,0x01,0xd5,0x00,0x74,0x01,0xd5,0x00,0x62,0x03,0x04,0x00,0x68,0x05,0x65,0x00,0x60,0x03,0xc4,0x00,0xbc,0x02,0x75,0x00,0xa6,0x04,0xd9,0xff,0xe4,0x05,0x7d,0x00,0x5e,0x04,0xb6,0x00,0x60,0x04,0xa4,0x00,0xbc,\r\n0x03,0xfa,0x00,0xa6,0x05,0xfc,0x00,0xbc,0x04,0x87,0x00,0xa6,0x04,0xc9,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x03,0x85,0x00,0x2b,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x68,0x01,0xbc,0x00,0x5e,0x01,0xd5,0x00,0x74,0x03,0x1f,0x01,0x3d,0x04,0x31,0x00,0x29,0x02,0xb6,0x00,0x2b,0x05,0x58,0xff,0xba,0x05,0x58,0xff,0xba,0x05,0x58,0xff,0xba,\r\n0x07,0x59,0x00,0x1e,0x06,0x03,0x00,0x7c,0x07,0x59,0x00,0x7c,0x02,0x01,0x00,0x76,0x00,0x00,0xff,0xc8,0x00,0x00,0x00,0x43,0x00,0x00,0x00,0x37,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x37,0x02,0x01,0x00,0x70,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,\r\n0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb0,0x00,0x9b,\r\n0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,\r\n0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x06,0xae,0x00,0xab,\r\n0x04,0x02,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0xff,0xba,0x06,0x03,0x00,0x53,0x04,0x02,0xff,0xba,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd8,0x00,0x00,0xff,0xd4,0x00,0x00,0xff,0xd4,\r\n0x00,0x00,0xff,0x6c,0x00,0x00,0x00,0x05,0x00,0x00,0xff,0xf8,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x02,0x01,0x00,0x4f,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0x01,0x00,0x49,0x04,0x02,0x00,0x00,0x04,0x02,0xff,0xe7,\r\n0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,\r\n0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,\r\n0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x08,0x04,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x08,0x04,0x00,0xab,\r\n0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x08,0xaf,0x00,0x19,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,\r\n0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,\r\n0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,\r\n0x02,0xac,0xff,0xba,0x05,0x58,0xff,0xba,0x04,0x02,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x57,0x04,0x02,0x00,0x57,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,\r\n0x04,0x02,0x00,0x00,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x00,0x00,0x00,0x81,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,\r\n0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x03,0x57,0x00,0x00,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x08,0x04,0x00,0xab,\r\n0x08,0x04,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x39,0x04,0xad,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,\r\n0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x03,0x57,0x00,0x00,0x03,0x57,0x00,0x00,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,\r\n0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x02,0xac,0x00,0x17,0x02,0xac,0x00,0x17,0x02,0xac,0x00,0x16,0x02,0xac,0x00,0x16,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0x03,0x00,0x9a,0x06,0xae,0x00,0x9a,\r\n0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x17,0x04,0xad,0x00,0x17,0x04,0xad,0x00,0x16,0x04,0xad,0x00,0x16,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x07,0x59,0x00,0x72,0x02,0xac,0x00,0x72,0x04,0xae,0x00,0x7e,0x05,0x58,0x00,0x7e,0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,\r\n0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x09,0x5a,0x00,0x9b,0x09,0x5a,0x00,0x9b,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0xab,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x02,0x01,0x00,0xa4,0x02,0x01,0x00,0x03,0x02,0x01,0x00,0xa4,0x02,0x01,0x00,0x03,0x02,0x01,0x00,0x03,0x02,0x01,0xff,0x62,\r\n0x02,0x01,0x00,0x03,0x02,0x01,0xff,0xc6,0x00,0x00,0xff,0x97,0x00,0x00,0x00,0x00,0x02,0x01,0x00,0x89,0x02,0x01,0x00,0x60,0x02,0xac,0x00,0x1e,0x02,0x01,0x00,0x3c,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x16,0x00,0x00,0x00,0x30,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xa2,0x02,0xac,0x00,0x49,0x02,0xac,0x00,0x72,0x02,0xac,0x00,0x72,\r\n0x02,0xac,0xff,0x97,0x02,0xac,0xff,0xc2,0x02,0xac,0x00,0x34,0x02,0xac,0x00,0x3a,0x03,0x57,0x00,0x17,0x03,0x57,0x00,0x16,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,\r\n0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x06,0x03,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,\r\n0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x07,0x59,0xff,0xc8,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,\r\n0x02,0x01,0xfd,0xa6,0x02,0x01,0xfd,0xa6,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,0x03,0x57,0x00,0x39,\r\n0x03,0x57,0x00,0x39,0x05,0x58,0x00,0x82,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x06,0x03,0x00,0x1e,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x04,0xad,0x00,0x72,\r\n0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x04,0xad,0x00,0x72,0x06,0xae,0x00,0x72,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x05,0x58,0x00,0x9a,0x02,0x01,0xff,0xf1,0x02,0x01,0xff,0xea,0x04,0x02,0x00,0xa1,0x03,0x57,0x00,0x39,0x04,0xa9,0x00,0x64,0x05,0x19,0x00,0x65,\r\n0x04,0x90,0x00,0x21,0x04,0x51,0x00,0x5f,0x04,0x70,0x00,0x0a,0x04,0xb0,0x00,0x60,0x04,0x51,0xff,0xe6,0x04,0x55,0x00,0x2d,0x04,0x50,0x00,0x72,0x04,0x50,0x00,0xa1,0x04,0x50,0x00,0xc2,0x04,0x50,0x01,0x1f,0x04,0x50,0x00,0xf7,0x04,0x50,0x01,0x08,0x04,0x50,0x00,0xe1,0x04,0x50,0x00,0xa1,0x04,0x50,0x00,0xa9,0x04,0x50,0x00,0xbc,\r\n0x04,0x26,0x00,0x76,0x03,0xb0,0x00,0x8a,0x04,0x61,0x00,0x6d,0x04,0x32,0x00,0x76,0x04,0xb4,0x00,0x6c,0x04,0xe2,0x00,0x97,0x04,0xe7,0x00,0x90,0x05,0x40,0x00,0x76,0x04,0xa3,0x00,0x80,0x04,0x87,0x00,0x76,0x05,0x35,0x00,0x96,0x04,0x1e,0x00,0x64,0x05,0x59,0x00,0x78,0x06,0x0d,0x00,0x82,0x05,0x1d,0x00,0x8c,0x05,0xfa,0x00,0x96,\r\n0x06,0xa1,0x00,0x64,0x05,0x18,0x00,0x87,0x06,0x1c,0x00,0x78,0x05,0x81,0x00,0x96,0x04,0x84,0x00,0x98,0x04,0x84,0x01,0x00,0x04,0x84,0x00,0x5d,0x04,0x84,0x00,0x6b,0x04,0x84,0x00,0x94,0x04,0x84,0x00,0x59,0x04,0x84,0x00,0x7d,0x04,0x84,0x00,0xbf,0x04,0x84,0x00,0x2b,0x04,0x84,0x00,0x2b,0x04,0x3e,0x00,0x76,0x03,0xb2,0x00,0x2d,\r\n0x04,0x52,0x00,0x7c,0x04,0xd7,0x00,0x0f,0x04,0xce,0x00,0x0a,0x05,0x44,0x00,0x16,0x04,0x94,0x00,0x41,0x05,0x2c,0x00,0x36,0x04,0x99,0x00,0x80,0x04,0xc2,0x00,0x7d,0x04,0xd1,0x00,0x82,0x04,0x15,0x00,0x82,0x04,0x15,0x00,0x96,0x06,0x00,0x00,0x82,0x05,0x6f,0x00,0x64,0x05,0x87,0x00,0x64,0x05,0x64,0x00,0x64,0x05,0x6f,0x00,0x64,\r\n0x04,0xbe,0x00,0xb4,0x04,0xa6,0x00,0x82,0x04,0xa5,0x00,0x77,0x05,0xe4,0x00,0x50,0x06,0x2c,0x00,0x50,0x06,0x03,0x00,0x8c,0x06,0x1b,0x00,0x50,0x07,0x62,0x00,0x8c,0x07,0x62,0x00,0x50,0x05,0x9b,0x00,0x50,0x07,0x62,0x00,0x32,0x07,0x62,0x00,0x50,0x05,0xde,0x00,0x72,0x06,0xfc,0x00,0x74,0x06,0xc4,0x00,0x60,0x04,0x74,0x00,0x58,\r\n0x06,0x24,0x00,0x73,0x06,0xcc,0x00,0x5d,0x06,0x1a,0x00,0x73,0x04,0xc0,0x00,0x70,0x06,0xce,0x00,0x74,0x05,0xe8,0x00,0x73,0x05,0x87,0x00,0x82,0x05,0x9d,0x00,0x82,0x04,0xd6,0x00,0x64,0x05,0x25,0x00,0x82,0x05,0xf8,0x00,0x6e,0x06,0x5a,0x00,0x82,0x05,0x93,0x00,0x64,0x04,0xee,0x00,0x6e,0x05,0xa7,0x00,0x82,0x04,0xa8,0x00,0x82,\r\n0x04,0x46,0x00,0x5d,0x07,0x60,0x00,0x00,0x07,0x58,0x00,0x64,0x07,0x5d,0x00,0x64,0x06,0x96,0x00,0x61,0x07,0x62,0x00,0x61,0x07,0x62,0x00,0x64,0x05,0x78,0x00,0x46,0x07,0x62,0x00,0x64,0x07,0x62,0x00,0x61,0x05,0xad,0x00,0x82,0x06,0x25,0x00,0x82,0x06,0x44,0x00,0xb4,0x05,0xf5,0x00,0x82,0x05,0xcd,0x00,0x82,0x05,0xcd,0x00,0x82,\r\n0x05,0x29,0x00,0x50,0x07,0x0c,0x00,0x82,0x06,0x1e,0x00,0x82,0x06,0x9d,0x00,0x82,0x05,0xb7,0x00,0x78,0x05,0xb3,0x00,0x78,0x04,0xa2,0x00,0x78,0x05,0xe9,0x00,0x50,0x05,0x89,0x00,0x78,0x05,0x89,0x00,0x78,0x06,0xd0,0x00,0x78,0x06,0x10,0x00,0x64,0x05,0xcb,0x00,0x70,0x07,0x2d,0x00,0x78,0x04,0x56,0x00,0x78,0x04,0x10,0x00,0x64,\r\n0x04,0x78,0x00,0x78,0x04,0x4b,0x00,0x78,0x04,0xe5,0x00,0x78,0x04,0xff,0x00,0x78,0x05,0x94,0x00,0x78,0x05,0xde,0x00,0x64,0x04,0xa0,0x00,0x78,0x04,0x8e,0x00,0x78,0x04,0x84,0x00,0x80,0x04,0x5d,0x00,0x7f,0x04,0x8b,0x00,0x3a,0x04,0x5d,0x00,0x7f,0x04,0x5d,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x9f,0x00,0x80,\r\n0x04,0x84,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x8b,0x00,0x80,0x04,0x11,0x00,0x66,0x04,0x3c,0x00,0x80,0x04,0xb8,0x00,0x66,0x04,0xf5,0x00,0x66,0x04,0xd3,0x00,0x80,0x04,0xd3,0x00,0x80,0x03,0xaa,0x00,0x67,0x04,0x84,0x00,0x80,0x04,0x84,0x00,0x80,0x04,0xb4,0x00,0xa0,0x04,0xd9,0x00,0x8c,0x06,0x1f,0x00,0x64,0x06,0xbe,0x00,0xa0,\r\n0x05,0x3c,0x00,0xa0,0x05,0x3c,0x00,0xa0,0x05,0x01,0x00,0x7b,0x06,0x25,0x00,0xa0,0x05,0x1a,0x00,0xa0,0x05,0x78,0x00,0xe9,0x04,0x1a,0x00,0x84,0x03,0xcc,0x00,0x69,0x04,0xb5,0x00,0x84,0x04,0x80,0x00,0x84,0x03,0xc9,0x00,0x84,0x03,0xf3,0x00,0x84,0x04,0x61,0x00,0x84,0x04,0x6c,0x00,0x84,0x03,0xdb,0x00,0x70,0x03,0xb7,0x00,0x84,\r\n0x05,0x02,0x00,0x60,0x03,0xa4,0x00,0x50,0x04,0x5c,0x00,0x2d,0x03,0xf6,0x00,0x50,0x04,0x62,0x00,0x60,0x06,0x3f,0x00,0x60,0x04,0x81,0x00,0x77,0x06,0x9e,0x00,0x60,0x04,0x4a,0x00,0x0a,0x04,0x85,0x00,0x60,0x04,0x8f,0x00,0x60,0x05,0xf2,0x00,0x82,0x02,0x81,0x00,0xf0,0x06,0x51,0x00,0x64,0x05,0x7c,0x00,0x64,0x05,0xbe,0x00,0xb4,\r\n0x05,0x48,0x00,0xb4,0x04,0x7c,0x00,0x64,0x06,0x01,0x00,0x00,0x04,0xd0,0x00,0x82,0x06,0x41,0x00,0x64,0x04,0xd5,0x00,0x67,0x04,0xd5,0x00,0x84,0x04,0xd5,0x00,0x67,0x04,0xd5,0x00,0x3f,0x04,0xd5,0x00,0x6b,0x04,0xd5,0x00,0x5c,0x04,0x9f,0x00,0xd6,0x04,0xd5,0x00,0x59,0x04,0xd5,0x00,0x7b,0x04,0xd5,0x00,0x8b,0x02,0x21,0x00,0x30,\r\n0x02,0x21,0xff,0xd0,0x02,0x21,0xff,0xf9,0x02,0x21,0xff,0x86,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0xff,0xfd,0x03,0x89,0xff,0xbe,0x03,0x9f,0xff,0xbd,0x03,0x98,0xff,0xc1,0x03,0x9f,0xff,0xbe,0x03,0xb9,0xff,0xc0,0x03,0x9f,0xff,0xbe,0x02,0x79,0xff,0xbf,0x02,0x7b,0xff,0xbe,0x02,0x21,0xff,0xfe,0x02,0x21,0xff,0xf2,\r\n0x02,0x21,0xff,0xf2,0x02,0x21,0xff,0xf2,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x30,0x04,0xfc,0x00,0x30,0x02,0x21,0xff,0xd1,0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x1c,0x02,0x7b,0xff,0xc7,0x02,0x7b,0xff,0xc7,0x02,0x21,0xff,0xf3,0x02,0x21,0xff,0xf8,0x02,0x21,0x00,0x12,0x02,0x5d,0xff,0xaf,\r\n0x02,0x21,0x00,0x30,0x02,0x21,0x00,0x14,0x02,0x21,0xff,0xff,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x03,0xe8,0x00,0x93,0x05,0xee,0x00,0x48,0x05,0xcd,0x00,0x6c,0x03,0xe8,0x00,0x60,0x03,0x40,0x00,0x77,0x03,0xe8,0x00,0x3e,0x04,0x2f,0x00,0x96,0x04,0x78,0x00,0x2e,0x03,0xe8,0x00,0x5c,\r\n0x06,0xbf,0x00,0x73,0x06,0x92,0x00,0x73,0x06,0xe7,0x00,0x75,0x03,0x8a,0x00,0x19,0x08,0x0c,0x00,0xaa,0x03,0xe8,0x00,0x60,0x06,0xaf,0x00,0x73,0x06,0xaf,0x00,0x75,0x06,0xbb,0x00,0x82,0x06,0x77,0x00,0x93,0x04,0x86,0x00,0x69,0x03,0xe8,0x00,0x6b,0x03,0xe8,0x00,0x6b,0x06,0x3e,0x00,0x96,0x04,0xae,0x00,0x20,0x06,0x35,0x00,0xaa,\r\n0x05,0x65,0x00,0x12,0x04,0x45,0x00,0x57,0x03,0xa0,0x00,0x26,0x03,0x40,0x00,0x25,0x08,0x27,0x00,0x28,0x03,0x4c,0x00,0x2b,0x04,0x44,0x00,0x22,0x03,0xe9,0x00,0x4c,0x03,0xe9,0x00,0x0b,0x03,0xe9,0x00,0x5f,0x03,0xe9,0x00,0x4e,0x03,0xe9,0x00,0xaa,0x0a,0xe5,0x00,0x8c,0x06,0xaf,0x00,0x6e,0x06,0xaf,0x00,0x80,0x03,0x6e,0x00,0xb2,\r\n0x02,0x03,0x00,0xb2,0x03,0xa5,0x00,0x53,0x01,0xe5,0x00,0x2b,0x03,0xb3,0x00,0xa6,0x01,0xe5,0x00,0x7a,0x01,0xe5,0x00,0x7a,0x01,0xe5,0x00,0x2b,0x03,0xd7,0x00,0x00,0x04,0xae,0x00,0x6a,0x04,0xae,0x00,0x68,0x04,0x5f,0x00,0x00,0x03,0x04,0x00,0x6f,0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x6f,0x01,0xd5,0x00,0x74,0x01,0xd5,0x00,0x62,\r\n0x03,0x04,0x00,0x68,0x01,0xd5,0x00,0x74,0x03,0x4c,0x00,0x90,0x06,0xe4,0x00,0x8d,0x01,0xbc,0x00,0x70,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x07,0x38,0x00,0xbc,0x04,0xad,0x00,0xab,0x04,0xad,0x00,0xab,0x06,0xae,0x00,0xa1,0x06,0xae,0x00,0xa1,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,\r\n0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x06,0xae,0x00,0x00,0x09,0x5a,0x00,0x9a,0x09,0x5a,0x00,0x9a,0x05,0x58,0xff,0xba,0x09,0x5a,0x00,0x9a,0x09,0x5a,0x00,0x9a,0x05,0x58,0xff,0xba,0x00,0x00,0xff,0x0e,0x00,0x00,0xff,0x36,0x00,0x00,0xff,0x72,0x00,0x00,0xfe,0xfc,0x00,0x00,0xfe,0x84,0x00,0x00,0xff,0x46,\r\n0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x20,0x00,0x00,0xfe,0xec,0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x04,0x00,0x00,0xff,0x2c,0x00,0x00,0xff,0x15,0x00,0x00,0xff,0x40,0x00,0x00,0xff,0x3e,0x00,0x00,0xff,0x23,0x00,0x00,0xff,0x06,0x00,0x00,0xff,0x2f,0x00,0x00,0xfe,0xba,0x00,0x00,0xfe,0x93,0x00,0x00,0xff,0x04,0x00,0x00,0xfe,0x94,\r\n0x00,0x00,0xff,0x36,0x00,0x00,0xff,0x21,0x00,0x00,0xff,0x27,0x00,0x00,0xff,0x18,0x00,0x00,0xfe,0xf7,0x00,0x00,0xfe,0xa2,0x00,0x00,0xfe,0xc2,0x00,0x00,0xff,0x07,0x00,0x00,0xfe,0xee,0x00,0x00,0xfe,0xb2,0x04,0xa9,0x00,0x21,0x03,0xc1,0x00,0x21,0x04,0xa9,0x00,0x21,0x03,0xc1,0x00,0x21,0x04,0x40,0x00,0x77,0x03,0x65,0x00,0x70,\r\n0x02,0xd9,0x00,0xbc,0x02,0xc9,0x00,0xa6,0x05,0x7f,0x00,0xaa,0x04,0x61,0x00,0x7d,0x05,0xbb,0x00,0x48,0x03,0x72,0x00,0x19,0x09,0x08,0x00,0x5e,0x07,0x26,0x00,0x60,0x04,0xbe,0xff,0xf3,0x04,0x6d,0x00,0x32,0x07,0x5f,0x00,0x33,0x06,0x55,0x00,0x1c,0x06,0xc1,0x00,0xbb,0x05,0xfe,0x00,0xa6,0x08,0x26,0x00,0x60,0x06,0x81,0x00,0x63,\r\n0x07,0x67,0x00,0xbc,0x06,0x30,0x00,0xa6,0x05,0x29,0x00,0x16,0x03,0xd1,0x00,0x0a,0x05,0xd3,0x00,0x29,0x04,0xb1,0x00,0x1e,0x07,0x67,0x00,0xbc,0x05,0xda,0x00,0xa6,0x06,0x03,0x00,0x1e,0x04,0xdf,0x00,0x05,0x05,0xf0,0x00,0x3e,0x04,0xcd,0x00,0x3e,0x06,0xe8,0x00,0x0f,0x05,0x51,0x00,0x12,0x07,0x05,0x00,0x10,0x05,0x57,0x00,0x10,\r\n0x08,0xd3,0x00,0xbc,0x06,0xbe,0x00,0xa6,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x09,0xb6,0x00,0x5e,0x07,0x1e,0x00,0x60,0x06,0x55,0x00,0x7e,0x00,0x00,0xfe,0xc2,0x07,0xe2,0x00,0x6f,0x07,0xe2,0x01,0x13,0x07,0xe2,0x00,0x26,0x03,0xd1,0x00,0x7d,0x00,0x00,0xfe,0x9c,0x00,0x00,0xff,0x33,\r\n0x04,0xa6,0x00,0xfc,0x04,0x01,0x01,0x33,0x05,0x98,0x00,0x0f,0x04,0x76,0x00,0x12,0x04,0x40,0x00,0x79,0x03,0x65,0x00,0x67,0x08,0x9c,0x00,0x60,0x07,0x3b,0x00,0x50,0x07,0x8f,0x00,0xa6,0x06,0xe1,0x00,0x98,0x05,0xbe,0x00,0x0f,0x04,0xa4,0x00,0x12,0x05,0x96,0x00,0x29,0x04,0xb0,0x00,0x1e,0x04,0x31,0x00,0x29,0x03,0x48,0x00,0x1e,\r\n0x05,0xeb,0x00,0xae,0x04,0xc7,0x00,0x8f,0x04,0x31,0x00,0x29,0x03,0x48,0x00,0x1e,0x06,0x8e,0x00,0x29,0x05,0x54,0x00,0x1e,0x05,0x4a,0x00,0xa6,0x04,0x87,0x00,0xa6,0x07,0xd1,0x00,0xbc,0x06,0x8f,0x00,0xa6,0x04,0x50,0x00,0x2b,0x04,0x99,0x00,0x32,0x05,0xdc,0x00,0xe7,0x05,0xdc,0x00,0xe7,0x06,0x78,0x00,0x00,0x03,0x96,0x00,0x83,\r\n0x01,0x9a,0x00,0x00,0x03,0xac,0x00,0xac,0x05,0x7a,0x00,0x5e,0x03,0x73,0x00,0x30,0x08,0x00,0x00,0xe6,0x08,0x00,0x00,0xe6,0x01,0xf0,0x00,0x37,0x00,0x00,0xfd,0x33,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,\r\n0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x07,0xd1,0x00,0x00,0x03,0x33,0x00,0x90,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x08,0xfc,0x00,0x32,0x04,0x50,0x00,0x53,0x04,0xb0,0x00,0xbb,0x04,0xb0,0x01,0x01,\r\n0x04,0xb0,0x00,0xaf,0x04,0xb0,0x00,0xc2,0x04,0xb0,0x00,0x6a,0x04,0xb0,0x00,0x64,0x04,0xb0,0x00,0x39,0x04,0xb0,0x00,0x2e,0x04,0xb0,0x00,0x79,0x04,0xb0,0x00,0x81,0x06,0x04,0x00,0xfd,0x06,0x04,0x01,0x70,0x06,0x04,0x00,0xb9,0x06,0x04,0x00,0x7d,0x06,0x04,0x00,0xff,0x06,0x04,0x00,0x8c,0x06,0x04,0x00,0x1f,0x06,0x04,0x00,0xf5,\r\n0x06,0x04,0x00,0x3a,0x06,0x04,0x00,0xaf,0x04,0xc4,0x00,0xb7,0x04,0xc4,0x01,0x2a,0x04,0xc4,0x00,0x7d,0x04,0xc4,0x00,0x8b,0x04,0xc4,0x00,0xb4,0x04,0xc4,0x00,0x79,0x04,0xc4,0x00,0x9d,0x04,0xc4,0x00,0xdf,0x04,0xc4,0x00,0x4b,0x04,0xc4,0x00,0x4b,0x05,0x14,0x00,0xe1,0x05,0x14,0x00,0xdc,0x05,0x14,0x00,0xa6,0x05,0x14,0x00,0x68,\r\n0x05,0x14,0x00,0x2d,0x05,0x14,0x00,0x0c,0x05,0x14,0x00,0x68,0x05,0x14,0x00,0x4d,0x05,0x14,0x00,0xab,0x05,0x14,0x00,0x7d,0x05,0x28,0x00,0xad,0x05,0x28,0x01,0x15,0x05,0x28,0x01,0x15,0x05,0x28,0x00,0x2f,0x05,0x28,0x00,0x40,0x05,0x28,0x00,0x34,0x05,0x28,0x00,0x55,0x05,0x28,0x00,0x4f,0x05,0x28,0x00,0xc1,0x05,0x28,0x00,0xdc,\r\n0x07,0x44,0x01,0xbd,0x07,0x44,0x01,0x00,0x07,0x44,0x00,0xd2,0x07,0x44,0x00,0xff,0x07,0x44,0x00,0xf8,0x07,0x44,0x00,0x5c,0x07,0x44,0x00,0x27,0x07,0x44,0x01,0x1a,0x07,0x44,0x00,0x48,0x07,0x44,0x00,0x23,0x06,0x68,0x00,0xbf,0x06,0x68,0x00,0x34,0x06,0x68,0x00,0x45,0x06,0x68,0x01,0x78,0x06,0x68,0x00,0x9e,0x06,0x68,0x00,0x36,\r\n0x06,0x68,0x00,0x99,0x06,0x68,0x01,0x4a,0x06,0x68,0x00,0x28,0x06,0x68,0x00,0x99,0x05,0xdc,0x00,0xac,0x05,0xdc,0x00,0xa1,0x05,0xdc,0x00,0xf6,0x05,0xdc,0x00,0xdd,0x05,0xdc,0x00,0x60,0x05,0xdc,0x00,0x43,0x05,0xdc,0x00,0x7e,0x05,0xdc,0x00,0xd6,0x05,0xdc,0x00,0x8d,0x05,0xdc,0x01,0x0d,0x07,0x1c,0x01,0xc8,0x07,0x1c,0x00,0x24,\r\n0x07,0x1c,0x00,0x37,0x07,0x1c,0x00,0x32,0x07,0x1c,0x00,0x7e,0x07,0x1c,0x00,0x37,0x07,0x1c,0x00,0x46,0x07,0x1c,0x01,0x25,0x07,0x1c,0x00,0x4b,0x07,0x1c,0x00,0x3d,0x06,0x68,0x00,0xdf,0x06,0x68,0x00,0xa3,0x06,0x68,0x00,0xc6,0x06,0x68,0x00,0xbb,0x06,0x68,0x00,0xcf,0x06,0x68,0x00,0xcf,0x06,0x68,0x01,0x08,0x06,0x68,0x00,0x35,\r\n0x06,0x68,0x00,0xa7,0x06,0x68,0x00,0x67,0x06,0x68,0x00,0xd0,0x06,0x68,0x00,0xd2,0x06,0x68,0x01,0x47,0x06,0x68,0x00,0xa3,0x06,0x68,0x00,0xdd,0x06,0x68,0x00,0xdd,0x06,0x68,0x00,0x44,0x06,0x68,0x00,0x9a,0x06,0x68,0x00,0xb9,0x06,0x68,0x00,0x15,0x05,0x78,0x01,0x09,0x05,0x78,0x01,0x22,0x05,0x78,0x00,0xf8,0x05,0x78,0x01,0x0e,\r\n0x05,0x78,0x00,0xb7,0x05,0x78,0x00,0x78,0x05,0x78,0x00,0x6c,0x05,0x78,0x00,0x3b,0x05,0x78,0x00,0xcb,0x05,0x78,0x00,0xe3,0x04,0x10,0x00,0x47,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x5a,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x44,0x04,0x10,0x00,0x30,0x04,0x10,0x00,0x47,0x04,0x10,0x00,0x44,\r\n0x04,0x88,0x00,0x80,0x04,0x88,0x00,0xa3,0x04,0x88,0x00,0x9b,0x04,0x88,0x00,0x5d,0x04,0x88,0x00,0x31,0x04,0x88,0x00,0x57,0x04,0x88,0x00,0x57,0x04,0x88,0x00,0xd7,0x04,0x88,0x00,0x83,0x04,0x88,0x00,0x83,0x06,0x04,0x01,0x48,0x06,0x04,0x01,0x21,0x06,0x04,0x00,0x74,0x06,0x04,0x00,0x43,0x06,0x04,0x00,0xf0,0x06,0x04,0x00,0xd6,\r\n0x06,0x04,0x01,0x0f,0x06,0x04,0x00,0x8f,0x06,0x04,0x01,0x0b,0x06,0x04,0x01,0x20,0x04,0x4c,0x00,0x9d,0x04,0x4c,0x00,0xb6,0x04,0x4c,0x00,0x36,0x04,0x4c,0x00,0x5a,0x04,0x4c,0x00,0xc5,0x04,0x4c,0x00,0xab,0x04,0x4c,0x00,0x79,0x04,0x4c,0x00,0x74,0x04,0x4c,0x00,0xa8,0x04,0x4c,0x00,0xce,0x05,0xc8,0x00,0xc3,0x05,0xc8,0x01,0x6a,\r\n0x05,0xc8,0x01,0x08,0x05,0xc8,0x01,0x20,0x05,0xc8,0x01,0x21,0x05,0xc8,0x00,0x3c,0x05,0xc8,0x01,0x05,0x05,0xc8,0x00,0x50,0x05,0xc8,0x00,0xc9,0x05,0xc8,0x01,0x01,0x05,0xc8,0x00,0xd6,0x06,0x04,0x00,0x8b,0x06,0x04,0x02,0xb1,0x06,0x04,0x00,0x1f,0x06,0x04,0x00,0xb7,0x06,0x04,0x00,0xd7,0x06,0x04,0x00,0xf9,0x06,0x04,0x01,0x37,\r\n0x06,0x04,0x00,0x33,0x06,0x04,0x01,0x1c,0x06,0x04,0x00,0x45,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x9c,0x00,0x00,0xfe,0xe6,0x00,0x00,0xff,0x9c,0x03,0x82,0x00,0x31,0x03,0xd9,0x00,0x20,0x05,0x6c,0x00,0xb8,0x05,0xcf,0x00,0x34,0x02,0x39,0x00,0x6d,0x01,0xac,0x00,0x5a,0x02,0x39,0x00,0x5b,\r\n0x01,0xac,0x00,0x4e,0x05,0xae,0x00,0xbc,0x04,0x87,0x00,0xa6,0x05,0xf1,0x00,0x29,0x05,0x05,0x00,0x2b,0x04,0x6b,0x00,0x66,0x03,0xc5,0x00,0x26,0x04,0x45,0x00,0x51,0x03,0xda,0x00,0x21,0x04,0xba,0x00,0x51,0x04,0x90,0x00,0x21,0x03,0x5b,0x00,0xb0,0x03,0x5d,0x00,0x68,0x09,0x08,0x00,0x16,0x06,0x8b,0x00,0x5a,0x09,0x39,0x00,0x16,\r\n0x07,0x16,0x00,0x5a,0x07,0xe4,0x00,0x16,0x06,0xc3,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x07,0x36,0x00,0x16,0x05,0x44,0x00,0x5a,0x04,0xf4,0x00,0x68,0x03,0xb2,0x00,0x50,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x27,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x04,0xa4,0x00,0x12,\r\n0x03,0xfa,0x00,0x27,0x04,0x5b,0x00,0xbc,0x02,0x82,0x00,0xa6,0x03,0xc4,0x00,0x12,0x01,0xf0,0x00,0x1e,0x06,0x08,0x00,0x00,0x04,0xb0,0x00,0x00,0x06,0xdf,0x00,0x5e,0x05,0x64,0x00,0x60,0x0a,0xa5,0x00,0x5e,0x07,0xf8,0x00,0x60,0x04,0x7b,0x00,0x19,0x04,0xb4,0x00,0x1e,0x05,0x83,0x00,0x1e,0x05,0xa6,0x00,0x05,0x06,0x79,0x00,0x0a,\r\n0x06,0xe5,0x00,0x05,0x06,0x08,0x00,0x5e,0x04,0xb6,0x00,0x60,0x07,0xd4,0x00,0x5e,0x06,0x42,0x00,0x60,0x04,0x5c,0x00,0x1e,0x03,0x2e,0x00,0x0f,0x04,0x79,0x00,0x3d,0x03,0xee,0x00,0x0f,0x04,0xf8,0x00,0x12,0x03,0xd5,0xff,0xe8,0x07,0x79,0x00,0x1a,0x05,0xc8,0x00,0x18,0x04,0xea,0x00,0x55,0x04,0x2d,0x00,0x3e,0x04,0x7b,0x00,0x12,\r\n0x04,0xb4,0x00,0x27,0x04,0x7b,0x00,0x12,0x04,0xb4,0x00,0x27,0x03,0xd9,0x00,0xbc,0x03,0x32,0x00,0xa6,0x03,0xcd,0x00,0x60,0x03,0x19,0x00,0x1e,0x03,0xc8,0x00,0x14,0x02,0xf2,0xff,0x76,0x04,0x24,0x00,0x38,0x04,0x2a,0x00,0x43,0x02,0x69,0x00,0x28,0x05,0x65,0x00,0x60,0x02,0x9f,0x00,0xa6,0x07,0xa9,0x00,0xa6,0x05,0x4d,0x00,0xa6,\r\n0x02,0xc8,0x00,0xa6,0x04,0xa7,0x00,0xa6,0x04,0xea,0x00,0x2b,0x03,0xb0,0xff,0xec,0x06,0x08,0x00,0x0f,0x04,0x79,0x00,0x60,0x03,0x08,0x00,0xbc,0x02,0xc8,0x00,0xa6,0x04,0xa4,0x00,0x5a,0x04,0xa4,0x00,0x59,0x04,0x9f,0x00,0x60,0x03,0xc4,0x00,0x20,0x01,0xf0,0x00,0xa6,0x06,0x15,0x00,0xbc,0x04,0xc9,0x00,0xa6,0x02,0xf4,0x00,0xbc,\r\n0x02,0xc8,0x00,0xa6,0x04,0xfa,0x00,0x5e,0x03,0xac,0x00,0x60,0x05,0xae,0x00,0xbc,0x03,0x17,0xff,0xe5,0x06,0x3d,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x04,0xf4,0x00,0x00,0x03,0xb2,0x00,0x00,0x05,0x7d,0x00,0x01,0x04,0xb6,0x00,0x00,0x04,0xa4,0x00,0x12,0x03,0xfa,0x00,0x26,0x05,0xfc,0x00,0x12,0x04,0x87,0x00,0x19,0x04,0xc9,0x00,0x12,\r\n0x02,0xc8,0x00,0x23,0x04,0x40,0x00,0x45,0x03,0x65,0x00,0x60,0x06,0x00,0xff,0xac,0x03,0x64,0x00,0x19,0x04,0x3e,0x00,0x3e,0x06,0xe4,0x00,0x90,0x03,0xe8,0x00,0x54,0x04,0x7b,0x00,0x52,0x07,0x2f,0x00,0xbd,0x02,0x21,0x00,0xbc,0x09,0x2b,0x00,0x1a,0x07,0x25,0x00,0x50,0x07,0x31,0x00,0x50,0x09,0x76,0x00,0x4a,0x07,0x11,0x00,0x50,\r\n0x07,0x53,0x00,0x8d,0x07,0x53,0x00,0x81,0x07,0x07,0x00,0x2f,0x07,0x17,0x00,0x50,0x07,0x60,0x00,0x7b,0x04,0x21,0x00,0x50,0x03,0xc4,0x00,0xbc,0x04,0xf4,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x07,0x2f,0x00,0xbc,0x05,0x9c,0x00,0x1a,0x07,0x8c,0x00,0x1a,0x01,0xf0,0x00,0xa6,0x03,0xb2,0x00,0x60,0x04,0xb6,0x00,0x60,0x06,0xe4,0x00,0xa6,\r\n0x08,0x3c,0x00,0x5e,0x05,0x9c,0x00,0xbc,0x08,0x3c,0x00,0x5e,0x04,0xf4,0x00,0x68,0x04,0xf4,0x00,0x5e,0x06,0x5c,0x01,0x05,0x05,0x9c,0x00,0xbc,0x09,0x18,0x00,0x5e,0x07,0x60,0x00,0x48,0x04,0x27,0x00,0x00,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x04,0xad,0x00,0x7e,0x04,0xad,0x00,0x7e,\r\n0x04,0xad,0xff,0xba,0x04,0xad,0xff,0xba,0x06,0xae,0x00,0x19,0x06,0xae,0xff,0xba,0x06,0xae,0xff,0xba,0x06,0xae,0x00,0x19,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x05,0x58,0x00,0x9b,0x02,0xac,0xff,0xba,\r\n0x02,0xac,0xff,0xba,0x05,0x58,0x00,0x9b,0x04,0xad,0x00,0x39,0x04,0xae,0xff,0xba,0x04,0xad,0xff,0xba,0x04,0xad,0x00,0x39,0x06,0x03,0x00,0x82,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x82,0x06,0x03,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x06,0xae,0x00,0x9a,0x03,0x57,0xff,0xa6,0x03,0x57,0xff,0xa6,\r\n0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x1c,0x00,0x02,0x04,0x1c,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xbf,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0x00,0x0c,0x66,0x00,0x73,\r\n0x04,0x1f,0x00,0xbc,0x03,0x2b,0x00,0xa6,0x04,0x83,0x00,0x50,0x04,0x38,0x00,0x50,0x05,0xfe,0x00,0xbc,0x04,0xa6,0x00,0xa6,0x04,0xa4,0x00,0xbc,0x07,0x02,0x00,0x10,0x05,0x5a,0x00,0x10,0x05,0xfe,0x00,0xbc,0x06,0x04,0x00,0xa6,0x06,0xa5,0x00,0x3d,0x06,0x8a,0x00,0x3e,0x04,0xa4,0x00,0xbc,0x03,0xfa,0x00,0xa6,0x08,0x09,0x00,0x10,\r\n0x06,0x73,0x00,0x10,0x08,0x57,0x00,0xbc,0x06,0xda,0x00,0xa6,0x05,0x7d,0x00,0xa6,0x04,0xb4,0x00,0x98,0x02,0x81,0x00,0x35,0x02,0x81,0x00,0x35,0x04,0xac,0x00,0x5c,0x05,0x2c,0x00,0xbc,0x03,0x44,0x00,0x1e,0x04,0xcc,0x00,0x81,0x04,0x21,0x00,0x77,0x04,0xa2,0x00,0x06,0x03,0xdf,0xff,0xbd,0x05,0xea,0x00,0xbc,0x06,0x68,0x00,0x60,\r\n0x03,0x34,0x00,0x78,0x04,0xb0,0x00,0x60,0x03,0x70,0x00,0x49,0x01,0xae,0x00,0x06,0x02,0xf7,0x00,0x1c,0x04,0x40,0x00,0x79,0x04,0x68,0x00,0x21,0x01,0xbb,0x00,0x70,0x01,0xbc,0x00,0x70,0x01,0x78,0x00,0x27,0x01,0xbc,0x00,0x6f,0x03,0x00,0x00,0x30,0x03,0x00,0x01,0x2e,0x03,0x00,0x00,0x30,0x03,0x96,0x00,0x83,0x0b,0xe8,0x00,0x00,\r\n0x0f,0xf4,0x00,0x00,0x02,0xb7,0x00,0x25,0x03,0x4c,0x00,0x5b,0x01,0x11,0xff,0xda,0x02,0x21,0xff,0xf7,0x03,0x1b,0x00,0x0c,0x03,0x72,0x00,0x5b,0x02,0x89,0x00,0x5a,0x03,0xf3,0x00,0x1e,0x04,0x38,0x00,0x5c,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x64,0x03,0x0f,0x00,0x96,\r\n0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0x0f,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x03,0xc3,0x00,0x96,0x0a,0xa0,0x00,0xb4,0x04,0x50,0x00,0x40,0x06,0x18,0x00,0x32,0x07,0x57,0x00,0x26,0x07,0x2f,0x00,0xbc,0x05,0x29,0x00,0x16,0x03,0xb2,0x00,0x60,\r\n0x04,0x87,0x00,0xa6,0x05,0xc2,0x00,0x6e,0x05,0xe0,0x00,0x75,0x03,0xe8,0xff,0x9a,0x02,0x81,0x00,0x35,0x05,0x4a,0x00,0x5e,0x04,0x26,0x00,0x60,0x05,0x72,0x00,0x5e,0x04,0x70,0x00,0x60,0x05,0x4a,0x00,0x5e,0x04,0x43,0x00,0x60,0x04,0x52,0x00,0x60,0x05,0xf3,0x00,0x5e,0x04,0xbd,0x00,0x28,0x04,0xa4,0x00,0x02,0x04,0x31,0x00,0x29,\r\n0x05,0xfe,0x00,0x32,0x04,0xea,0xff,0xf9,0x06,0xa8,0x00,0x5a,0x03,0xa4,0x00,0x64,0x04,0x2f,0x00,0x13,0x05,0x10,0x00,0x29,0x02,0x81,0x00,0x35,0x04,0xb6,0x00,0x60,0x02,0xb7,0x00,0x00,0x02,0xc7,0x00,0x23,0x01,0xf0,0xff,0xf6,0x07,0x04,0x00,0xa6,0x04,0xa8,0x00,0xa6,0x04,0x87,0x00,0xa6,0x04,0x2d,0x00,0x64,0x04,0x2d,0x00,0x54,\r\n0x04,0xb0,0x00,0x80,0x07,0x6c,0x00,0x60,0x07,0x6c,0x00,0x60,0x07,0x8d,0x00,0x60,0x07,0xf8,0x00,0x60,0x07,0xf8,0x00,0x60,0x04,0x61,0x00,0x7d,0x03,0xff,0x00,0xb0,0x02,0x42,0x00,0xa6,0x04,0x01,0x00,0xa6,0x03,0xaa,0x00,0x1c,0x04,0xde,0x00,0x1c,0x03,0xa3,0x00,0x3c,0x05,0x57,0x00,0x3c,0x01,0xfa,0xff,0x92,0x04,0x87,0x00,0x90,\r\n0x04,0xcb,0x00,0x21,0x06,0xe4,0x00,0xa6,0x06,0xe4,0x00,0xa6,0x04,0xeb,0x00,0x0e,0x04,0x4e,0x00,0x0c,0x04,0x9c,0x00,0x0c,0x04,0x4e,0x00,0x0c,0x04,0x2c,0x00,0x1a,0x03,0xac,0xff,0x1f,0x04,0x2c,0xff,0x1f,0x03,0xac,0xfe,0xc8,0x03,0xdf,0x00,0x0e,0x02,0x6e,0x00,0x25,0x02,0xb2,0x00,0x64,0x01,0xf4,0x00,0x00,0x01,0xbf,0x00,0x00,\r\n0x02,0xe4,0x00,0x00,0x04,0xa0,0x00,0x60,0x05,0x10,0x00,0x58,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0xcf,0x02,0x58,0x00,0xcf,\r\n0x02,0x58,0x00,0x8b,0x02,0x8a,0x00,0x0c,0x02,0x8a,0x00,0x0c,0x00,0x00,0xff,0xd4,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x02,0x01,0x00,0x05,0x02,0x01,0x00,0x05,0x0d,0x74,0x00,0x52,0x07,0xf5,0x00,0x32,0x06,0xf9,0x00,0x32,0x08,0x63,0x00,0x32,0x02,0x4e,0x00,0x29,0x02,0x4e,0xff,0xba,0x02,0x9e,0x00,0x05,\r\n0x03,0x2a,0x00,0x9a,0x02,0x0c,0x00,0x05,0x02,0x26,0x00,0x15,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x21,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x29,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xf8,0x02,0x4e,0xff,0xba,0x02,0x4e,0x00,0x69,0x02,0x4e,0xff,0xba,0x02,0x4e,0xff,0xba,0x00,0x00,0xff,0xe7,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,\r\n0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0x12,0x00,0xc4,0x04,0x02,0x00,0x52,0x04,0x02,0x00,0x52,0x0a,0xb1,0x00,0x9b,0x08,0x04,0xff,0xba,0x08,0x04,0xff,0xba,0x0a,0xb0,0x00,0x9b,0x07,0x59,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x04,0x02,0x00,0xab,0x04,0x02,0x00,0xab,0x03,0x57,0x00,0x00,\r\n0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x8c,0x00,0x00,0xfe,0x45,0x02,0xdb,0x00,0x14,0x05,0xfa,0x00,0xbc,0x04,0xcd,0x00,0xa6,0x05,0xae,0xff,0x98,0x04,0x9e,0xff,0x5c,0x0a,0x08,0x00,0x0f,0x08,0x46,0x00,0x12,0x05,0x8c,0x00,0x0f,0x04,0x60,0x00,0x12,0x05,0x9e,0x00,0x10,0x04,0x65,0x00,0x10,0x0a,0xa5,0x00,0x5e,0x07,0xf8,0x00,0x60,\r\n0x06,0x08,0x00,0x5e,0x04,0xb0,0x00,0x60,0x03,0x1b,0x00,0x0c,0x02,0x89,0x00,0x5a,0x04,0xf2,0x00,0x28,0x00,0x00,0xff,0x38,0x05,0x76,0x00,0x50,0x04,0x50,0x00,0xbc,0x02,0xb0,0x00,0x66,0x02,0x6a,0x00,0x66,0x01,0x4c,0x00,0x66,0x03,0xfa,0x00,0x66,0x02,0xb0,0x00,0x66,0x02,0xbe,0x00,0x66,0x02,0x09,0x00,0x3c,0x01,0x9c,0x00,0x0a,\r\n0x03,0xb1,0x00,0x1e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x02,0xed,0x00,0x6e,0x01,0xbc,0x00,0x70,0x04,0x31,0x00,0x29,0x03,0x68,0x00,0x20,0x04,0xb8,0x00,0x1a,0x04,0x96,0x00,0xbc,0x04,0x62,0x00,0xa7,0x07,0xb2,0x00,0x5a,\r\n0x06,0x77,0x00,0x77,0x06,0x74,0x00,0xa6,0x06,0x50,0x00,0xa6,0x06,0x89,0x00,0x60,0x07,0x8a,0x00,0x90,0x05,0x03,0x00,0x35,0x05,0x7c,0x00,0x68,0x04,0xcf,0x00,0x50,0x03,0x25,0x00,0x50,0x07,0x6e,0x00,0x3c,0x09,0x01,0x00,0x54,0x03,0x85,0x00,0x74,0x09,0x3d,0xff,0xf8,0x04,0x02,0x00,0x65,0x06,0xae,0x00,0xab,0x07,0x59,0x00,0xab,\r\n0x07,0x59,0x00,0xab,0x07,0x59,0x00,0xab,0x03,0x57,0x00,0x00,0x06,0x03,0x00,0x9a,0x08,0x04,0x00,0xab,0x06,0x03,0x00,0x9b,0x05,0x58,0x00,0x9b,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0x32,0x00,0x00,0xfc,0xe6,0x00,0x00,0xfb,0x6b,0x00,0x00,0xfb,0x9b,\r\n0x00,0x00,0xfc,0x00,0x00,0x00,0xfd,0x71,0x00,0x00,0xfd,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xfe,0x04,0x64,0x00,0xdc,0x00,0x00,0xfe,0xd4,0x04,0xad,0x00,0x65,0x04,0xad,0xff,0xba,0x04,0xae,0xff,0xba,0x06,0xae,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,\r\n0x07,0x59,0x00,0xab,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x07,0x59,0x00,0xab,0x03,0xf1,0xff,0xba,0x03,0xf1,0xff,0xba,0x00,0x00,0xfe,0x84,0x03,0x57,0x00,0x00,0x06,0xae,0x00,0x9a,0x02,0xac,0xff,0xba,0x02,0xac,0xff,0xba,0x08,0x04,0x00,0xab,0x04,0x02,0xff,0xba,0x04,0x02,0xff,0xba,0x06,0x03,0x00,0x9b,0x04,0x02,0xff,0xba,\r\n0x04,0x02,0xff,0xba,0x05,0x58,0x00,0x9b,0x02,0x58,0x00,0xab,0x02,0x58,0x00,0xd4,0x02,0x58,0x00,0x66,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x7f,0x02,0x58,0x00,0x4f,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x53,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x59,0x02,0x58,0x00,0x2b,\r\n0x02,0x58,0x00,0x4d,0x0c,0x05,0x00,0xa1,0x0c,0x05,0x00,0xa1,0x07,0x0a,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0a,0x00,0x73,0x07,0x0a,0x00,0x73,0x03,0x4d,0x00,0xf2,0x03,0x4d,0x01,0x2f,0x03,0x4d,0x00,0x76,0x03,0x4d,0x00,0x25,0x03,0x4d,0x00,0xab,0x03,0x4d,0x00,0x62,0x03,0x4d,0x00,0x42,0x03,0x4d,0x00,0x1c,\r\n0x03,0x4d,0x00,0x1d,0x03,0x4d,0x00,0x3c,0x03,0x4d,0x00,0x69,0x03,0x4d,0x00,0x3c,0x03,0x4d,0x00,0x6f,0x03,0x4d,0x00,0x41,0x03,0x4d,0x00,0x6b,0x03,0x57,0x00,0x39,0x05,0x58,0x00,0x9a,0x04,0xf1,0x00,0x55,0x05,0x26,0x00,0x78,0x05,0x30,0x00,0x78,0x07,0x1a,0x00,0x82,0x05,0x27,0x00,0x64,0x05,0x0b,0x00,0x6e,0x06,0x62,0x00,0x28,\r\n0x07,0xce,0x00,0x82,0x05,0x34,0x00,0x82,0x05,0x0b,0x00,0x6e,0x08,0x8a,0x00,0x82,0x05,0x14,0x00,0x82,0x05,0x14,0x00,0xa0,0x07,0x7a,0x00,0x82,0x05,0x0b,0x00,0x6e,0x05,0x63,0x00,0x64,0x06,0x52,0x00,0x82,0x05,0x1a,0x00,0xa0,0x06,0x28,0x00,0x6e,0x06,0xc3,0x00,0x0a,0x07,0x4d,0x00,0x55,0x05,0x1d,0x00,0x5a,0x06,0x24,0x00,0x82,\r\n0x05,0x31,0x00,0x6e,0x05,0x93,0x00,0x32,0x04,0xf8,0x00,0xa0,0x05,0x95,0x00,0x82,0x05,0x00,0x00,0x6e,0x05,0x45,0x00,0x50,0x05,0x7b,0x00,0x32,0x05,0x00,0x00,0xa0,0x06,0x3a,0x00,0x50,0x04,0xc8,0x00,0x50,0x05,0x4e,0x00,0x82,0x06,0x48,0x00,0x64,0x04,0xf2,0x00,0x64,0x05,0x01,0x00,0x64,0x04,0x8d,0x00,0x6e,0x06,0x47,0x00,0x6e,\r\n0x05,0x23,0x00,0x76,0x05,0x31,0x00,0xa0,0x05,0x30,0x00,0x78,0x05,0x96,0x00,0x82,0x03,0x93,0x00,0x00,0x04,0x39,0x00,0x00,0x05,0x23,0x00,0x62,0x06,0x48,0x00,0x64,0x06,0x36,0x00,0x78,0x04,0x56,0x00,0xbe,0x00,0x00,0x14,0xe0,0x19,0x01,0x25,0x01,0x01,0x01,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0c,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x01,0x0c,0x2c,0x01,0x01,0x24,0x01,0x01,0x01,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x09,0x22,0x27,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x2e,0x01,0x0c,0x2e,0x0c,0x01,0x01,0x0c,0x01,0x0d,0x0c,0x0c,0x0c,\r\n0x2e,0x01,0x01,0x01,0x0c,0x19,0x0c,0x01,0x01,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x03,0x0c,0x09,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x23,0x01,0x2a,0x2a,0x01,0x01,0x24,0x1c,0x01,0x0c,0x2a,\r\n0x01,0x1c,0x1c,0x01,0x0c,0x0f,0x01,0x01,0x01,0x01,0x01,0x0c,0x04,0x0c,0x01,0x01,0x01,0x01,0x1f,0x01,0x1c,0x27,0x01,0x01,0x0e,0x01,0x01,0x0c,0x01,0x08,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x0c,0x1b,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x09,\r\n0x09,0x09,0x01,0x01,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0e,0x01,0x01,0x01,0x16,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x01,0x01,0x01,0x10,0x10,0x01,0x01,0x01,0x01,0x2c,0x2e,0x01,0x01,0x01,0x0d,0x01,0x0d,0x01,0x2e,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x01,0x16,0x01,0x16,0x01,0x01,0x0e,0x24,0x0c,0x01,0x15,0x29,0x0d,0x01,0x01,0x01,0x01,0x05,0x0c,0x01,0x19,0x01,0x01,0x12,0x19,0x19,0x19,0x19,0x19,0x01,0x01,0x0d,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x2c,\r\n0x2e,0x2c,0x2e,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x0c,0x0c,0x01,0x01,0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x27,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x04,0x0c,0x0c,0x0c,0x27,0x0c,0x27,0x0c,0x27,0x0c,0x0c,0x01,\r\n0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x03,0x01,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x0e,0x0c,0x01,0x0c,0x24,0x01,0x0c,0x01,0x0c,0x01,0x1b,0x01,0x0c,0x0c,0x01,0x01,0x04,0x0e,0x01,0x01,0x0c,0x0c,0x27,0x0c,0x01,\r\n0x0e,0x0d,0x01,0x0c,0x0c,0x0c,0x0d,0x01,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x0d,0x0d,0x07,0x07,0x01,0x1b,0x01,0x01,0x0c,0x01,0x01,0x0d,0x01,0x01,0x0c,0x01,0x22,0x20,0x0e,0x1a,0x01,0x1f,0x01,0x2c,0x01,0x22,0x01,0x0c,0x01,0x0c,0x0d,0x01,0x0e,0x26,0x26,0x26,0x0c,0x26,0x0d,\r\n0x0e,0x0c,0x0e,0x0c,0x01,0x01,0x01,0x2c,0x01,0x0e,0x0c,0x0e,0x26,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x0e,0x0c,0x01,0x01,0x01,0x0e,0x2d,0x0c,0x0c,0x01,0x0e,0x01,0x01,0x01,0x2e,0x01,0x01,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x0c,0x25,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x25,0x0c,\r\n0x25,0x0c,0x25,0x0c,0x25,0x0c,0x25,0x09,0x0c,0x09,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x07,0x26,0x01,0x24,0x01,0x01,0x23,0x01,0x28,0x01,0x29,0x22,0x01,0x02,0x22,0x0e,0x0c,0x0e,0x0c,0x0e,0x01,0x02,0x01,0x0c,0x20,0x0c,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,\r\n0x01,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x0d,0x01,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x2c,0x2e,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,\r\n0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x0d,0x01,0x0d,0x03,0x0c,0x03,0x0c,0x03,0x0c,0x03,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x0c,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x22,0x19,0x22,0x19,0x27,0x0c,0x27,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x16,0x01,0x16,0x01,0x16,0x0c,0x01,0x0c,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x22,0x22,\r\n0x22,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x2a,0x02,0x02,0x19,0x01,0x19,0x19,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,\r\n0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x0d,0x0d,0x0d,0x0d,0x0d,0x01,0x01,0x29,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x1e,0x01,0x01,0x01,0x01,0x0d,0x01,0x01,0x22,0x05,0x01,0x01,0x01,0x04,0x01,0x04,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x32,0x1a,0x15,0x1a,0x15,0x01,0x22,0x25,0x01,0x01,0x16,0x0a,0x0a,0x01,0x01,0x01,0x01,0x1a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x13,0x15,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x2c,0x2e,0x01,0x0c,\r\n0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x01,0x13,0x15,0x2c,0x2e,0x01,0x01,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x09,0x0c,0x09,0x0c,0x01,0x01,0x01,0x0c,0x30,0x01,0x01,0x01,0x16,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x2e,0x01,0x2e,0x2d,0x2d,0x2e,0x2e,0x01,0x29,0x01,0x01,0x01,0x01,0x0a,0x2e,0x2e,0x01,0x19,0x01,0x01,0x01,0x01,0x16,0x01,0x28,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x03,0x01,0x01,0x1f,0x1a,0x1a,0x01,0x01,0x01,0x19,0x01,0x01,\r\n0x01,0x16,0x2b,0x01,0x01,0x1b,0x1b,0x1b,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x04,0x01,0x2e,0x1b,0x1b,0x07,0x0b,0x16,0x17,0x01,0x01,0x01,0x01,0x25,0x02,0x02,0x01,0x22,0x01,0x2e,0x01,0x1e,0x01,0x01,0x01,0x01,0x07,0x01,0x04,0x2a,0x01,0x01,0x01,0x02,0x01,0x01,0x19,0x01,0x01,0x01,0x0a,0x1a,0x01,0x01,0x26,0x01,0x01,0x01,0x01,\r\n0x07,0x01,0x01,0x01,0x01,0x01,0x0c,0x2e,0x01,0x01,0x01,0x01,0x01,0x08,0x05,0x01,0x01,0x01,0x01,0x07,0x01,0x0b,0x1f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x01,0x1f,0x01,0x01,0x0c,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0b,0x01,0x01,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x26,0x01,0x01,0x2f,0x01,0x0a,\r\n0x2d,0x01,0x01,0x01,0x01,0x2c,0x01,0x09,0x01,0x01,0x10,0x01,0x10,0x01,0x0d,0x0e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x04,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x0e,0x0d,0x26,0x01,0x01,0x07,0x26,0x07,0x26,0x0c,0x0c,0x01,0x0c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x0c,0x1f,0x01,0x25,0x2e,0x01,0x01,\r\n0x01,0x0a,0x01,0x01,0x26,0x01,0x30,0x01,0x01,0x22,0x15,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,\r\n0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,\r\n0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x30,0x01,0x30,0x30,0x30,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2f,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0d,0x26,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x0c,0x16,0x01,0x01,0x01,0x0c,0x01,0x0e,0x01,0x22,0x01,0x2c,0x29,0x01,0x24,0x01,0x01,\r\n0x01,0x01,0x2f,0x14,0x01,0x19,0x1f,0x01,0x01,0x01,0x1c,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x25,0x01,0x01,0x01,0x02,0x01,0x14,0x01,0x14,0x14,0x01,0x01,0x01,0x01,0x02,0x01,0x25,0x01,0x01,0x14,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x26,0x01,0x01,0x30,0x01,0x05,0x01,\r\n0x01,0x01,0x19,0x01,0x01,0x26,0x2e,0x01,0x01,0x01,0x01,0x01,0x2a,0x18,0x18,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x16,0x2f,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x0d,0x01,0x01,0x01,0x0c,0x2e,0x0c,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x16,0x2e,0x01,0x01,0x01,0x01,0x28,0x01,0x01,0x01,0x01,0x0c,0x2e,0x0c,0x2e,0x0c,0x01,0x0d,0x0c,\r\n0x0c,0x01,0x01,0x01,0x19,0x01,0x16,0x01,0x2e,0x2e,0x01,0x01,0x26,0x01,0x01,0x2d,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x25,0x1f,0x01,0x01,0x01,0x01,0x01,0x1b,0x1b,0x01,0x01,0x01,0x1e,0x02,0x02,0x01,0x01,0x1c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x2d,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x14,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x0c,0x0c,0x0c,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x01,\r\n0x01,0x01,0x10,0x10,0x01,0x10,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x10,0x01,0x10,0x10,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x0d,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x2c,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x30,0x01,0x01,0x01,0x01,0x01,0x19,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x19,0x19,0x19,0x19,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,\r\n0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x05,0x01,0x01,0x01,0x0c,0x04,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x30,0x01,0x01,\r\n0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x01,0x30,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x01,0x01,0x24,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,\r\n0x01,0x01,0x01,0x0d,0x01,0x1b,0x26,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x29,0x13,0x01,0x01,0x04,0x1e,0x01,0x01,0x06,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x08,0x2f,0x01,0x2e,0x27,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x13,0x01,0x13,0x01,0x27,0x32,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x1b,0x13,0x13,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x10,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x2f,0x01,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x01,0x08,0x2b,0x17,0x17,0x17,0x19,0x01,0x12,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,\r\n0x01,0x2b,0x01,0x08,0x08,0x08,0x08,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x01,0x08,0x01,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x08,0x2b,0x01,0x01,0x01,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0xfd,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x20,0x01,0x09,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x09,0x01,0x20,0x01,0x2c,0x01,0x01,0x01,0x01,0x28,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x18,0x01,0x01,0x1f,0x10,\r\n0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x01,0x0c,0x01,0x28,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x2f,0x01,0x24,0x24,0x24,0x0f,0x24,0x30,0x24,0x0e,0x02,0x24,0x17,0x01,0x24,0x0e,0x26,0x26,0x16,0x01,0x24,0x0e,0x0e,0x01,0x24,0x24,0x24,0x24,0x24,0x16,0x30,0x01,0x24,\r\n0x01,0x17,0x01,0x01,0x24,0x24,0x16,0x01,0x09,0x16,0x27,0x09,0x01,0x0d,0x09,0x11,0x16,0x1f,0x01,0x01,0x1b,0x09,0x01,0x01,0x27,0x01,0x0a,0x01,0x27,0x01,0x2b,0x01,0x15,0x01,0x0a,0x2b,0x01,0x01,0x01,0x01,0x0a,0x01,0x11,0x01,0x01,0x06,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x0c,0x30,0x01,0x2b,0x01,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x0c,0x01,0x04,0x01,0x2e,0x30,0x04,0x01,0x0c,0x09,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x02,0x2d,0x01,0x01,0x31,0x01,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x15,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x2d,0x2d,0x2d,0x2d,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x1d,0x1d,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x01,0x01,0x01,0x01,0x31,0x01,0x19,0x31,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x1e,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x16,0x01,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x01,0x01,0x01,0x32,0x01,0x01,0x01,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x24,0x0d,0x01,0x01,0x0c,0x01,0x01,0x03,0x01,\r\n0x01,0x01,0x01,0x22,0x22,0x01,0x2c,0x24,0x27,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x09,0x09,0x01,0x01,0x0c,0x0c,0x01,0x01,0x0c,0x0c,0x01,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x19,0x19,0x01,0x01,0x01,0x01,0x01,0x2c,0x2e,0x01,0x0c,0x03,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x01,0x01,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x30,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x2c,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x01,0x0c,0x01,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x16,0x01,0x01,0x0a,0x01,0x01,0x01,0x01,0x01,0x23,0x01,0x28,0x01,0x03,0x01,0x01,0x25,0x01,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x01,0x01,0x14,0x01,0x01,0x01,0x01,0x15,0x01,0x01,0x31,0x31,0x01,0x01,0x01,0x18,0x01,0x01,0x26,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x05,\r\n0x01,0x2d,0x1d,0x0b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x03,0x12,0x01,0x2c,0x01,0x07,0x01,0x01,0x01,0x2d,0x01,0x01,0x01,0x32,0x01,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x01,0x16,0x01,0x1b,0x01,0x29,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x23,0x01,0x01,0x12,0x01,0x01,0x0d,0x27,0x01,0x01,0x25,0x20,0x01,0x17,0x01,0x01,0x17,\r\n0x17,0x01,0x20,0x17,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x0d,0x20,0x20,0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x1e,0x32,0x01,0x15,0x01,0x01,0x01,0x02,0x16,0x01,0x1d,0x01,0x01,0x01,0x01,0x02,0x01,0x11,0x01,0x01,0x01,0x01,0x01,0x26,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x01,0x01,0x19,0x19,0x19,0x19,0x19,0x19,0x01,0x19,0x19,\r\n0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0b,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x12,0x01,0x11,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,\r\n0x30,0x01,0x01,0x01,0x01,0x01,0x1b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x01,0x01,0x01,0x01,0x01,0x14,0x29,0x14,0x14,0x14,0x01,0x30,0x30,0x2c,0x01,0x01,0x19,0x19,0x19,0x01,0x19,0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x07,0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x09,0x16,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x01,0x07,0x01,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x0c,0x01,\r\n0x01,0x01,0x01,0x24,0x01,0x01,0x01,0x01,0x08,0x01,0x25,0x01,0x01,0x01,0x01,0x17,0x01,0x01,0x26,0x01,0x06,0x1b,0x01,0x01,0x01,0x1b,0x01,0x1a,0x01,0x01,0x01,0x01,0x01,0x01,0x1a,0x25,0x01,0x01,0x25,0x01,0x20,0x01,0x17,0x1a,0x01,0x15,0x2c,0x2c,0x23,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x17,0x17,0x17,0x17,0x17,\r\n0x17,0x17,0x17,0x17,0x17,0x01,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,\r\n0x27,0x27,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x32,\r\n0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x32,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x14,0x01,0x01,0x01,0x22,0x01,0x01,0x2d,0x01,0x01,0x01,0x01,0x26,0x2b,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x02,0x01,0x02,0x2e,0x01,0x01,0x01,0x01,0x01,0x28,0x18,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x2e,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x19,0x27,0x01,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1d,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x24,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x31,0x01,0x01,0x01,0x01,0x01,0x01,0x17,0x1a,0x01,0x01,0x01,0x2c,0x2e,0x01,0x02,0x03,\r\n0x01,0x01,0x01,0x01,0x01,0x01,0x2f,0x22,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x06,0x01,0x1f,0x07,0x07,0x01,0x17,0x01,0x01,0x01,0x0d,0x01,0x01,0x01,0x01,0x01,0x01,0x2e,0x0d,0x12,0x01,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x1b,0x2c,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x25,0x25,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1f,0x01,0x01,0x01,0x13,0x07,0x26,0x01,0x01,0x01,0x07,0x01,0x01,0x01,0x01,\r\n0x02,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x02,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x01,0x0c,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x01,0x20,0x01,0x0d,0x01,0x01,0x01,0x01,0x07,0x24,0x04,0x01,0x01,0x10,0x0c,0x2e,0x01,0x25,0x01,0x01,0x07,0x01,0x01,0x01,0x01,0x08,0x08,0x0a,0x01,0x01,0x16,0x10,0x01,0x01,0x0d,0x01,0x01,0x01,0x03,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2f,\r\n0x2c,0x11,0x01,0x01,0x10,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x22,0x01,0x01,0x20,0x01,0x01,0x01,0x19,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,\r\n0x01,0x01,0x01,0x01,0x01,0x24,0x03,0x01,0x01,0x01,0x01,0x01,0x20,0x01,0x01,0x0b,0x01,0x01,0x01,0x01,0x0a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x0c,0x01,0x1c,0x01,0x01,0x01,0x01,0x0d,0x2d,0x01,0x2a,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,\r\n0x01,0x2c,0x2c,0x2c,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x30,0x01,0x01,0x01,0x2c,0x01,0x01,0x2c,0x01,0x01,0x2c,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,\r\n0x1e,0x1e,0x1e,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x32,0x01,0x18,0x30,0x01,0x01,0x18,0x26,0x01,0x01,0x18,0x18,0x01,0x01,0x1e,0x01,0x2b,0x01,0x01,0x1d,0x30,0x01,0x22,0x31,0x01,0x01,0x1c,0x01,0x01,0x2f,0x01,0x08,0x01,0x01,\r\n0x1e,0x08,0x08,0x30,0x01,0x01,0x01,0x01,0x08,0x08,0x01,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x01,0x01,0x01,0x01,0x00,0x0c,0x00,0xf8,0x08,0xff,0x00,0x08,0x00,0x09,0xff,0xfe,0x00,0x09,0x00,0x0a,0xff,0xfe,0x00,0x0a,0x00,0x0a,0xff,0xfe,0x00,0x0b,0x00,0x0b,0xff,0xfe,0x00,0x0c,0x00,0x0c,0xff,0xfd,0x00,0x0d,0x00,0x0e,0xff,0xfd,\r\n0x00,0x0e,0x00,0x0f,0xff,0xfc,0x00,0x0f,0x00,0x10,0xff,0xfc,0x00,0x10,0x00,0x11,0xff,0xfc,0x00,0x11,0x00,0x12,0xff,0xfb,0x00,0x12,0x00,0x14,0xff,0xfb,0x00,0x13,0x00,0x14,0xff,0xfb,0x00,0x14,0x00,0x17,0xff,0xfb,0x00,0x15,0x00,0x18,0xff,0xfa,0x00,0x16,0x00,0x18,0xff,0xfa,0x00,0x17,0x00,0x19,0xff,0xfa,0x00,0x18,0x00,0x1a,\r\n0xff,0xfa,0x00,0x19,0x00,0x1c,0xff,0xf9,0x00,0x1a,0x00,0x1d,0xff,0xf9,0x00,0x1b,0x00,0x1e,0xff,0xf9,0x00,0x1c,0x00,0x1f,0xff,0xf9,0x00,0x1d,0x00,0x20,0xff,0xf8,0x00,0x1e,0x00,0x21,0xff,0xf8,0x00,0x1f,0x00,0x22,0xff,0xf8,0x00,0x20,0x00,0x24,0xff,0xf7,0x00,0x21,0x00,0x24,0xff,0xf7,0x00,0x22,0x00,0x25,0xff,0xf7,0x00,0x23,\r\n0x00,0x26,0xff,0xf7,0x00,0x24,0x00,0x27,0xff,0xf7,0x00,0x25,0x00,0x28,0xff,0xf6,0x00,0x26,0x00,0x29,0xff,0xf6,0x00,0x27,0x00,0x2a,0xff,0xf6,0x00,0x28,0x00,0x2b,0xff,0xf5,0x00,0x29,0x00,0x2c,0xff,0xf5,0x00,0x2a,0x00,0x2e,0xff,0xf5,0x00,0x2b,0x00,0x2f,0xff,0xf4,0x00,0x2c,0x00,0x30,0xff,0xf4,0x00,0x2d,0x00,0x31,0xff,0xf4,\r\n0x00,0x2e,0x00,0x32,0xff,0xf4,0x00,0x2f,0x00,0x32,0xff,0xf4,0x00,0x30,0x00,0x34,0xff,0xf3,0x00,0x31,0x00,0x35,0xff,0xf3,0x00,0x32,0x00,0x36,0xff,0xf3,0x00,0x33,0x00,0x37,0xff,0xf3,0x00,0x34,0x00,0x38,0xff,0xf2,0x00,0x35,0x00,0x39,0xff,0xf2,0x00,0x36,0x00,0x3a,0xff,0xf2,0x00,0x37,0x00,0x3c,0xff,0xf2,0x00,0x38,0x00,0x3c,\r\n0xff,0xf2,0x00,0x39,0x00,0x3d,0xff,0xf1,0x00,0x3a,0x00,0x3e,0xff,0xf1,0x00,0x3b,0x00,0x3f,0xff,0xf1,0x00,0x3c,0x00,0x41,0xff,0xf0,0x00,0x3d,0x00,0x42,0xff,0xf0,0x00,0x3e,0x00,0x44,0xff,0xf0,0x00,0x3f,0x00,0x45,0xff,0xf0,0x00,0x40,0x00,0x45,0xff,0xef,0x00,0x41,0x00,0x46,0xff,0xef,0x00,0x42,0x00,0x47,0xff,0xef,0x00,0x43,\r\n0x00,0x48,0xff,0xef,0x00,0x44,0x00,0x49,0xff,0xee,0x00,0x45,0x00,0x4a,0xff,0xee,0x00,0x46,0x00,0x4b,0xff,0xee,0x00,0x47,0x00,0x4c,0xff,0xee,0x00,0x48,0x00,0x4d,0xff,0xed,0x00,0x49,0x00,0x4f,0xff,0xed,0x00,0x4a,0x00,0x50,0xff,0xed,0x00,0x4b,0x00,0x51,0xff,0xed,0x00,0x4c,0x00,0x51,0xff,0xec,0x00,0x4d,0x00,0x52,0xff,0xec,\r\n0x00,0x4e,0x00,0x54,0xff,0xec,0x00,0x4f,0x00,0x55,0xff,0xec,0x00,0x50,0x00,0x56,0xff,0xec,0x00,0x51,0x00,0x57,0xff,0xeb,0x00,0x52,0x00,0x58,0xff,0xeb,0x00,0x53,0x00,0x59,0xff,0xeb,0x00,0x54,0x00,0x5a,0xff,0xea,0x00,0x55,0x00,0x5b,0xff,0xea,0x00,0x56,0x00,0x5c,0xff,0xea,0x00,0x57,0x00,0x5e,0xff,0xea,0x00,0x58,0x00,0x5e,\r\n0xff,0xea,0x00,0x59,0x00,0x5f,0xff,0xe9,0x00,0x5a,0x00,0x61,0xff,0xe9,0x00,0x5b,0x00,0x61,0xff,0xe9,0x00,0x5c,0x00,0x63,0xff,0xe8,0x00,0x5d,0x00,0x64,0xff,0xe8,0x00,0x5e,0x00,0x65,0xff,0xe8,0x00,0x5f,0x00,0x66,0xff,0xe7,0x00,0x60,0x00,0x67,0xff,0xe7,0x00,0x61,0x00,0x69,0xff,0xe7,0x00,0x62,0x00,0x69,0xff,0xe7,0x00,0x63,\r\n0x00,0x6a,0xff,0xe7,0x00,0x64,0x00,0x6b,0xff,0xe6,0x00,0x65,0x00,0x6d,0xff,0xe6,0x00,0x66,0x00,0x6e,0xff,0xe6,0x00,0x67,0x00,0x6f,0xff,0xe6,0x00,0x68,0x00,0x70,0xff,0xe5,0x00,0x69,0x00,0x71,0xff,0xe5,0x00,0x6a,0x00,0x72,0xff,0xe5,0x00,0x6b,0x00,0x73,0xff,0xe5,0x00,0x6c,0x00,0x75,0xff,0xe4,0x00,0x6d,0x00,0x76,0xff,0xe4,\r\n0x00,0x6e,0x00,0x76,0xff,0xe4,0x00,0x6f,0x00,0x77,0xff,0xe4,0x00,0x70,0x00,0x79,0xff,0xe4,0x00,0x71,0x00,0x79,0xff,0xe3,0x00,0x72,0x00,0x7b,0xff,0xe3,0x00,0x73,0x00,0x7b,0xff,0xe3,0x00,0x74,0x00,0x7c,0xff,0xe3,0x00,0x75,0x00,0x7d,0xff,0xe2,0x00,0x76,0x00,0x7e,0xff,0xe2,0x00,0x77,0x00,0x80,0xff,0xe2,0x00,0x78,0x00,0x80,\r\n0xff,0xe1,0x00,0x79,0x00,0x82,0xff,0xe1,0x00,0x7a,0x00,0x82,0xff,0xe1,0x00,0x7b,0x00,0x84,0xff,0xe1,0x00,0x7c,0x00,0x85,0xff,0xe1,0x00,0x7d,0x00,0x86,0xff,0xe0,0x00,0x7e,0x00,0x87,0xff,0xe0,0x00,0x7f,0x00,0x88,0xff,0xe0,0x00,0x80,0x00,0x89,0xff,0xdf,0x00,0x81,0x00,0x8a,0xff,0xdf,0x00,0x82,0x00,0x8c,0xff,0xdf,0x00,0x83,\r\n0x00,0x8d,0xff,0xdf,0x00,0x84,0x00,0x8e,0xff,0xde,0x00,0x85,0x00,0x8e,0xff,0xdf,0x00,0x86,0x00,0x8f,0xff,0xde,0x00,0x87,0x00,0x90,0xff,0xde,0x00,0x88,0x00,0x92,0xff,0xde,0x00,0x89,0x00,0x93,0xff,0xdd,0x00,0x8a,0x00,0x94,0xff,0xdd,0x00,0x8b,0x00,0x95,0xff,0xdd,0x00,0x8c,0x00,0x96,0xff,0xdc,0x00,0x8d,0x00,0x97,0xff,0xdc,\r\n0x00,0x8e,0x00,0x99,0xff,0xdc,0x00,0x8f,0x00,0x9a,0xff,0xdc,0x00,0x90,0x00,0x9a,0xff,0xdb,0x00,0x91,0x00,0x9b,0xff,0xdb,0x00,0x92,0x00,0x9c,0xff,0xdb,0x00,0x93,0x00,0x9e,0xff,0xdb,0x00,0x94,0x00,0x9f,0xff,0xda,0x00,0x95,0x00,0xa0,0xff,0xda,0x00,0x96,0x00,0xa1,0xff,0xda,0x00,0x97,0x00,0xa2,0xff,0xda,0x00,0x98,0x00,0xa3,\r\n0xff,0xd9,0x00,0x99,0x00,0xa4,0xff,0xd9,0x00,0x9a,0x00,0xa5,0xff,0xd9,0x00,0x9b,0x00,0xa6,0xff,0xd9,0x00,0x9c,0x00,0xa7,0xff,0xd8,0x00,0x9d,0x00,0xa8,0xff,0xd8,0x00,0x9e,0x00,0xa9,0xff,0xd8,0x00,0x9f,0x00,0xab,0xff,0xd8,0x00,0xa0,0x00,0xab,0xff,0xd7,0x00,0xa1,0x00,0xad,0xff,0xd7,0x00,0xa2,0x00,0xae,0xff,0xd7,0x00,0xa3,\r\n0x00,0xaf,0xff,0xd7,0x00,0xa4,0x00,0xb1,0xff,0xd6,0x00,0xa5,0x00,0xb1,0xff,0xd6,0x00,0xa6,0x00,0xb2,0xff,0xd6,0x00,0xa7,0x00,0xb3,0xff,0xd6,0x00,0xa8,0x00,0xb3,0xff,0xd5,0x00,0xa9,0x00,0xb6,0xff,0xd5,0x00,0xaa,0x00,0xb7,0xff,0xd5,0x00,0xab,0x00,0xb8,0xff,0xd5,0x00,0xac,0x00,0xb8,0xff,0xd4,0x00,0xad,0x00,0xb9,0xff,0xd4,\r\n0x00,0xae,0x00,0xba,0xff,0xd4,0x00,0xaf,0x00,0xbb,0xff,0xd3,0x00,0xb0,0x00,0xbe,0xff,0xd3,0x00,0xb1,0x00,0xbe,0xff,0xd3,0x00,0xb2,0x00,0xbf,0xff,0xd3,0x00,0xb3,0x00,0xc0,0xff,0xd3,0x00,0xb4,0x00,0xc1,0xff,0xd2,0x00,0xb5,0x00,0xc2,0xff,0xd2,0x00,0xb6,0x00,0xc3,0xff,0xd2,0x00,0xb7,0x00,0xc5,0xff,0xd2,0x00,0xb8,0x00,0xc5,\r\n0xff,0xd1,0x00,0xb9,0x00,0xc6,0xff,0xd1,0x00,0xba,0x00,0xc8,0xff,0xd1,0x00,0xbb,0x00,0xc9,0xff,0xd1,0x00,0xbc,0x00,0xca,0xff,0xd0,0x00,0xbd,0x00,0xcb,0xff,0xd0,0x00,0xbe,0x00,0xcb,0xff,0xd0,0x00,0xbf,0x00,0xcd,0xff,0xd0,0x00,0xc0,0x00,0xcd,0xff,0xcf,0x00,0xc1,0x00,0xcf,0xff,0xcf,0x00,0xc2,0x00,0xd0,0xff,0xcf,0x00,0xc3,\r\n0x00,0xd0,0xff,0xcf,0x00,0xc4,0x00,0xd1,0xff,0xce,0x00,0xc5,0x00,0xd3,0xff,0xce,0x00,0xc6,0x00,0xd4,0xff,0xce,0x00,0xc7,0x00,0xd5,0xff,0xce,0x00,0xc8,0x00,0xd6,0xff,0xcd,0x00,0xc9,0x00,0xd7,0xff,0xcd,0x00,0xca,0x00,0xd8,0xff,0xcd,0x00,0xcb,0x00,0xd9,0xff,0xcd,0x00,0xcc,0x00,0xda,0xff,0xcc,0x00,0xcd,0x00,0xdc,0xff,0xcc,\r\n0x00,0xce,0x00,0xdc,0xff,0xcc,0x00,0xcf,0x00,0xdd,0xff,0xcc,0x00,0xd0,0x00,0xde,0xff,0xcb,0x00,0xd1,0x00,0xe0,0xff,0xcb,0x00,0xd2,0x00,0xe1,0xff,0xcb,0x00,0xd3,0x00,0xe2,0xff,0xcb,0x00,0xd4,0x00,0xe3,0xff,0xca,0x00,0xd5,0x00,0xe4,0xff,0xca,0x00,0xd6,0x00,0xe5,0xff,0xca,0x00,0xd7,0x00,0xe6,0xff,0xca,0x00,0xd8,0x00,0xe7,\r\n0xff,0xc9,0x00,0xd9,0x00,0xe8,0xff,0xc9,0x00,0xda,0x00,0xea,0xff,0xc9,0x00,0xdb,0x00,0xeb,0xff,0xc9,0x00,0xdc,0x00,0xeb,0xff,0xc8,0x00,0xdd,0x00,0xed,0xff,0xc8,0x00,0xde,0x00,0xee,0xff,0xc8,0x00,0xdf,0x00,0xee,0xff,0xc8,0x00,0xe0,0x00,0xf0,0xff,0xc7,0x00,0xe1,0x00,0xf1,0xff,0xc7,0x00,0xe2,0x00,0xf3,0xff,0xc6,0x00,0xe3,\r\n0x00,0xf3,0xff,0xc6,0x00,0xe4,0x00,0xf4,0xff,0xc6,0x00,0xe5,0x00,0xf5,0xff,0xc6,0x00,0xe6,0x00,0xf6,0xff,0xc6,0x00,0xe7,0x00,0xf8,0xff,0xc6,0x00,0xe8,0x00,0xf8,0xff,0xc5,0x00,0xe9,0x00,0xfa,0xff,0xc5,0x00,0xea,0x00,0xfb,0xff,0xc5,0x00,0xeb,0x00,0xfb,0xff,0xc5,0x00,0xec,0x00,0xfd,0xff,0xc4,0x00,0xed,0x00,0xfd,0xff,0xc4,\r\n0x00,0xee,0x00,0xff,0xff,0xc4,0x00,0xef,0x01,0x01,0xff,0xc4,0x00,0xf0,0x01,0x01,0xff,0xc3,0x00,0xf1,0x01,0x03,0xff,0xc3,0x00,0xf2,0x01,0x03,0xff,0xc3,0x00,0xf3,0x01,0x04,0xff,0xc3,0x00,0xf4,0x01,0x05,0xff,0xc2,0x00,0xf5,0x01,0x07,0xff,0xc2,0x00,0xf6,0x01,0x08,0xff,0xc2,0x00,0xf7,0x01,0x09,0xff,0xc2,0x00,0xf8,0x01,0x0a,\r\n0xff,0xc1,0x00,0xf9,0x01,0x0b,0xff,0xc1,0x00,0xfa,0x01,0x0c,0xff,0xc1,0x00,0xfb,0x01,0x0d,0xff,0xc1,0x00,0xfc,0x01,0x0f,0xff,0xc0,0x00,0xfd,0x01,0x10,0xff,0xc0,0x00,0xfe,0x01,0x10,0xff,0xc0,0x00,0xff,0x01,0x11,0xff,0xc0,0x00,0x00,0x00,0x11,0x00,0x00,0x14,0xe4,0x0b,0x16,0x07,0x00,0x01,0x03,0x03,0x04,0x07,0x06,0x09,0x09,\r\n0x03,0x03,0x03,0x05,0x08,0x03,0x04,0x03,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x08,0x08,0x08,0x05,0x0b,0x07,0x06,0x07,0x08,0x06,0x06,0x08,0x08,0x03,0x04,0x06,0x05,0x0a,0x08,0x09,0x06,0x08,0x07,0x06,0x06,0x08,0x07,0x0b,0x06,0x05,0x06,0x03,0x04,0x03,0x08,0x05,0x03,0x06,0x07,0x05,0x07,0x06,0x04,\r\n0x07,0x07,0x03,0x03,0x06,0x03,0x09,0x07,0x07,0x07,0x07,0x04,0x05,0x04,0x07,0x05,0x09,0x05,0x05,0x05,0x03,0x03,0x03,0x08,0x07,0x07,0x07,0x06,0x08,0x09,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x04,0x06,0x06,0x05,0x04,0x05,0x06,\r\n0x04,0x0a,0x0a,0x09,0x03,0x05,0x08,0x09,0x09,0x09,0x08,0x08,0x08,0x06,0x07,0x06,0x07,0x08,0x06,0x04,0x05,0x09,0x09,0x07,0x05,0x03,0x03,0x08,0x07,0x06,0x08,0x07,0x06,0x06,0x09,0x07,0x07,0x09,0x0a,0x0a,0x06,0x0b,0x04,0x04,0x03,0x03,0x08,0x06,0x05,0x05,0x02,0x06,0x03,0x03,0x06,0x06,0x04,0x03,0x03,0x04,0x0d,0x07,0x06,0x07,\r\n0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x09,0x09,0x08,0x08,0x08,0x03,0x04,0x04,0x03,0x03,0x02,0x03,0x02,0x04,0x02,0x04,0x05,0x03,0x06,0x05,0x06,0x05,0x03,0x08,0x07,0x05,0x05,0x06,0x07,0x08,0x08,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x05,0x08,0x07,0x03,0x06,0x05,0x07,0x05,0x07,0x05,0x07,0x05,0x03,0x07,0x06,0x07,0x06,0x08,0x07,0x08,\r\n0x06,0x06,0x06,0x06,0x05,0x03,0x05,0x03,0x05,0x03,0x08,0x07,0x08,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x04,0x06,0x05,0x08,0x07,0x08,0x07,0x06,0x05,0x06,0x05,0x05,0x08,0x07,0x07,0x07,0x05,0x07,0x05,0x09,0x05,0x05,0x04,0x0c,0x07,0x06,0x07,0x03,0x04,0x09,0x04,0x07,0x04,0x04,0x07,0x04,0x07,0x06,0x07,0x05,0x07,\r\n0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x06,0x06,0x06,0x05,0x03,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x06,0x05,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x0b,0x09,0x05,0x05,0x03,0x07,0x06,0x09,0x09,0x09,\r\n0x07,0x03,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x05,0x05,0x03,0x05,0x06,0x07,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x03,0x03,0x03,0x07,0x06,0x09,0x04,0x09,0x07,0x09,0x03,0x07,0x06,0x06,0x06,0x08,0x03,0x06,0x07,0x0a,0x08,0x06,0x09,0x08,0x06,0x06,0x06,0x05,0x06,0x09,0x09,0x03,0x05,0x07,0x05,0x07,0x03,0x07,0x06,0x06,0x05,0x07,0x07,0x03,\r\n0x06,0x05,0x07,0x06,0x05,0x07,0x07,0x05,0x07,0x06,0x09,0x09,0x03,0x07,0x07,0x07,0x09,0x06,0x08,0x05,0x07,0x06,0x03,0x0b,0x0b,0x08,0x06,0x06,0x08,0x07,0x06,0x06,0x05,0x08,0x06,0x0b,0x06,0x08,0x08,0x06,0x07,0x0a,0x08,0x09,0x08,0x06,0x07,0x06,0x06,0x07,0x06,0x08,0x07,0x0b,0x0b,0x08,0x09,0x06,0x07,0x0b,0x07,0x06,0x07,0x06,\r\n0x05,0x06,0x06,0x09,0x05,0x07,0x07,0x06,0x06,0x08,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x09,0x05,0x07,0x07,0x09,0x09,0x07,0x08,0x06,0x05,0x09,0x06,0x06,0x07,0x05,0x05,0x05,0x03,0x09,0x09,0x07,0x06,0x05,0x07,0x05,0x04,0x0b,0x0c,0x07,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x06,0x09,0x07,0x08,0x07,0x03,0x04,0x03,0x03,0x05,0x05,\r\n0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x03,0x03,0x03,0x05,0x05,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,\r\n0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x04,0x06,0x06,0x08,0x07,0x03,0x04,0x03,0x03,0x06,0x05,0x0b,0x09,0x07,0x06,0x06,0x05,0x08,0x07,0x05,0x05,0x05,0x05,0x07,0x05,0x07,\r\n0x07,0x07,0x07,0x08,0x06,0x08,0x07,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,0x07,0x06,0x06,0x07,0x06,0x07,0x06,0x07,0x07,0x05,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,\r\n0x07,0x08,0x07,0x08,0x07,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x03,0x05,0x03,0x05,0x03,0x05,0x03,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x06,0x07,0x06,0x07,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x05,0x06,0x05,0x06,\r\n0x05,0x06,0x05,0x06,0x04,0x06,0x04,0x06,0x04,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x05,0x07,0x05,0x0b,0x09,0x0b,0x09,0x06,0x05,0x06,0x05,0x05,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x07,0x04,0x09,0x05,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x05,\r\n0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x05,0x05,0x07,0x07,0x03,0x03,0x07,0x07,0x07,0x07,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x09,0x09,0x08,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x06,0x06,0x06,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x07,0x07,0x05,0x05,0x07,0x07,0x07,0x06,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x05,0x08,0x08,0x06,0x06,0x07,0x06,0x06,0x05,0x08,0x07,0x0a,0x03,0x03,0x06,0x05,0x03,0x05,\r\n0x0a,0x08,0x06,0x08,0x0b,0x09,0x07,0x06,0x06,0x06,0x05,0x06,0x03,0x04,0x06,0x04,0x06,0x08,0x08,0x06,0x06,0x06,0x05,0x07,0x07,0x05,0x05,0x06,0x06,0x04,0x04,0x06,0x03,0x04,0x05,0x03,0x0e,0x0d,0x0b,0x09,0x08,0x06,0x0c,0x0b,0x09,0x07,0x06,0x03,0x03,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x07,0x06,\r\n0x07,0x06,0x09,0x09,0x08,0x06,0x08,0x07,0x06,0x06,0x08,0x06,0x08,0x06,0x07,0x05,0x03,0x0e,0x0d,0x0b,0x08,0x07,0x0b,0x08,0x08,0x07,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x06,0x04,0x07,0x04,0x08,0x07,0x08,0x07,0x06,0x05,0x08,0x07,0x08,0x06,0x06,0x06,0x05,0x07,0x06,0x09,0x07,0x09,\r\n0x07,0x09,0x07,0x09,0x07,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x07,0x05,0x05,0x06,0x06,0x03,0x06,0x07,0x06,0x05,0x05,0x06,0x06,0x06,0x03,0x03,0x04,0x03,0x04,0x03,0x07,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x08,0x08,0x07,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x03,0x03,\r\n0x03,0x03,0x04,0x04,0x07,0x07,0x06,0x05,0x08,0x05,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x04,0x05,0x07,0x05,0x06,0x06,0x06,0x03,0x05,0x04,0x06,0x04,0x04,0x0a,0x0a,0x0b,0x07,0x05,0x08,0x09,0x06,0x06,0x05,0x05,0x06,0x07,0x06,0x07,0x06,0x07,0x09,0x06,0x08,0x06,0x06,0x05,0x05,0x05,0x07,0x06,0x07,0x05,0x0a,0x09,0x07,0x06,0x07,\r\n0x06,0x07,0x05,0x07,0x05,0x07,0x06,0x06,0x04,0x06,0x06,0x05,0x03,0x08,0x05,0x05,0x0a,0x07,0x07,0x06,0x0a,0x08,0x07,0x05,0x0a,0x08,0x08,0x06,0x0a,0x08,0x06,0x05,0x09,0x08,0x08,0x06,0x08,0x06,0x08,0x06,0x0e,0x0c,0x09,0x07,0x0c,0x0a,0x0a,0x07,0x06,0x05,0x06,0x04,0x05,0x00,0x00,0x0b,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x05,0x06,0x05,0x08,0x06,0x09,0x07,0x0b,0x09,0x08,0x06,0x07,0x05,0x06,0x05,0x0a,0x08,0x08,0x06,0x09,0x07,0x09,0x07,0x03,0x0b,0x09,0x06,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x09,0x09,0x06,0x06,0x08,0x06,0x08,0x06,0x0b,0x09,0x06,0x05,0x06,0x05,0x08,0x07,0x08,0x07,0x09,0x07,0x08,0x07,0x07,0x05,0x06,0x05,0x06,0x05,\r\n0x06,0x05,0x07,0x07,0x09,0x08,0x06,0x07,0x09,0x09,0x09,0x08,0x06,0x05,0x0a,0x09,0x0b,0x09,0x08,0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x06,0x04,0x04,0x02,0x02,0x02,0x02,0x03,0x04,0x03,0x03,0x04,0x02,0x02,0x02,0x04,0x04,0x02,0x02,0x06,0x06,\r\n0x06,0x06,0x04,0x03,0x03,0x04,0x03,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x03,0x02,0x03,0x03,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,\r\n0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,\r\n0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x07,0x04,0x07,0x07,0x04,0x04,0x04,0x04,0x04,0x03,\r\n0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x07,0x09,0x05,0x05,0x06,0x06,0x05,0x05,0x03,0x03,0x06,0x04,0x08,0x07,0x07,0x05,0x07,0x07,0x07,0x0a,0x06,0x07,0x07,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x06,0x05,0x09,0x05,0x05,0x05,0x06,0x05,0x05,\r\n0x07,0x05,0x07,0x06,0x04,0x05,0x04,0x04,0x05,0x03,0x03,0x05,0x05,0x02,0x03,0x04,0x03,0x06,0x05,0x05,0x05,0x04,0x04,0x04,0x03,0x05,0x06,0x03,0x03,0x04,0x05,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x02,0x03,0x05,0x04,0x04,0x03,0x04,0x04,0x04,0x02,0x04,0x04,0x05,0x03,0x04,0x04,0x03,0x04,0x04,0x03,0x02,0x02,0x04,0x03,0x04,0x03,\r\n0x04,0x04,0x03,0x06,0x02,0x04,0x06,0x0a,0x07,0x06,0x06,0x09,0x07,0x09,0x08,0x06,0x06,0x06,0x05,0x0c,0x05,0x06,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x02,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x05,0x04,0x07,0x07,0x04,0x09,0x06,0x07,0x04,0x04,0x05,0x04,0x05,0x06,0x05,0x06,0x0a,0x07,0x04,0x03,0x06,\r\n0x06,0x07,0x07,0x07,0x04,0x07,0x06,0x03,0x09,0x07,0x07,0x04,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x05,0x05,0x08,0x03,0x05,0x03,0x07,0x05,0x04,0x03,0x03,0x04,0x03,0x02,0x02,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x03,\r\n0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x05,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x0f,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x09,0x07,0x08,0x06,0x08,0x07,0x0a,0x08,0x06,0x04,0x06,0x08,0x06,0x09,0x08,0x00,0x00,0x00,0x00,0x03,0x03,0x03,\r\n0x03,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x0b,0x05,0x03,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x0b,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x04,0x06,0x04,0x08,0x07,0x06,0x04,0x09,0x06,0x09,0x03,0x04,0x06,0x06,0x07,0x07,0x07,0x06,0x06,0x06,0x09,0x03,0x06,0x03,0x06,0x05,0x03,0x03,\r\n0x06,0x03,0x08,0x03,0x0a,0x06,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0d,0x0f,0x0f,0x09,0x09,0x06,0x06,0x02,0x0b,0x08,0x09,0x07,0x06,0x07,0x06,0x06,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x03,0x07,0x00,0x07,0x07,0x07,0x04,0x06,0x06,0x0a,0x04,0x0a,0x04,0x06,0x07,0x06,0x05,0x0a,0x06,0x0a,0x06,\r\n0x08,0x09,0x04,0x06,0x06,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x0a,0x04,0x06,0x05,0x07,0x06,0x04,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x03,0x06,0x04,0x0b,0x06,0x06,0x07,0x07,0x0b,0x06,0x00,0x00,0x00,0x07,0x00,0x07,0x07,0x07,0x07,0x08,0x07,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,\r\n0x08,0x09,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x06,0x06,0x06,0x06,0x0b,0x0b,\r\n0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x08,0x08,0x0c,0x0b,0x0a,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x07,0x04,0x07,0x04,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x0a,0x08,0x09,0x04,\r\n0x06,0x08,0x09,0x08,0x09,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x07,0x00,0x00,0x00,0x0d,0x09,0x0f,0x0b,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x04,0x06,0x06,0x07,0x0e,0x09,0x06,0x11,0x0c,0x04,\r\n0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x05,0x08,0x07,0x07,0x06,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x0e,0x11,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x05,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x0d,\r\n0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0a,0x06,0x06,0x0a,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x07,0x04,0x04,0x05,0x05,0x0d,0x09,0x07,0x06,0x06,0x00,0x06,0x06,0x06,0x04,0x06,0x08,0x07,0x06,0x06,0x04,0x03,0x08,0x06,0x07,\r\n0x04,0x06,0x05,0x05,0x05,0x05,0x03,0x06,0x05,0x07,0x05,0x06,0x05,0x06,0x05,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x05,0x05,0x03,0x06,0x06,0x07,0x06,0x04,0x08,0x06,0x07,0x06,0x07,0x05,0x06,0x06,0x04,0x08,0x04,0x05,0x05,0x05,0x07,0x07,0x06,0x0b,0x06,0x0b,0x04,0x03,0x02,0x06,0x02,0x01,0x00,0x02,\r\n0x02,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0a,0x05,0x08,0x07,0x0b,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x09,0x05,0x09,0x05,0x09,0x07,0x08,0x08,0x08,0x08,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x06,0x0c,0x09,0x05,0x05,0x03,\r\n0x03,0x03,0x04,0x03,0x06,0x03,0x03,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x02,0x00,0x00,0x03,0x00,0x00,0x07,0x06,0x05,0x05,0x07,0x03,0x04,0x07,0x07,0x03,0x06,0x06,0x06,0x08,0x07,0x03,0x04,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x06,0x09,0x08,0x06,0x06,0x06,0x03,0x04,0x06,0x06,\r\n0x06,0x06,0x06,0x07,0x07,0x05,0x07,0x06,0x06,0x08,0x06,0x08,0x06,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x06,0x05,0x05,0x07,0x03,0x04,0x07,0x03,0x06,0x06,0x06,0x07,0x04,0x07,0x07,0x07,0x06,0x07,0x06,0x09,0x08,0x03,0x06,0x06,0x07,0x07,0x0d,0x00,0x07,0x06,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x03,0x00,0x08,0x07,0x07,0x08,0x06,0x07,0x08,0x08,0x05,0x07,0x08,0x08,0x07,0x08,0x09,0x09,0x07,0x06,0x06,0x08,0x08,0x06,0x08,0x07,0x07,0x07,0x08,0x08,0x06,0x07,0x07,0x07,0x09,0x07,0x07,0x07,0x07,0x09,0x05,0x06,\r\n0x06,0x0a,0x06,0x06,0x08,0x0a,0x07,0x06,0x0c,0x06,0x06,0x08,0x06,0x06,0x08,0x06,0x08,0x09,0x0a,0x06,0x09,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x08,0x06,0x07,0x07,0x06,0x06,0x07,0x0b,0x06,0x06,0x06,0x06,0x05,0x04,0x06,0x06,0x06,0x06,0x06,0x0a,0x06,0x0a,0x05,0x06,0x0a,0x07,0x06,0x0a,0x08,0x08,0x0a,0x06,0x06,0x0a,0x0a,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x07,0x06,0x06,0x06,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x09,0x08,0x07,0x06,0x09,0x07,0x08,0x06,0x07,0x08,0x08,0x08,0x06,0x08,0x07,0x08,0x07,0x09,0x08,0x08,0x08,0x08,0x07,0x08,0x07,0x08,0x09,0x07,0x08,0x08,0x01,0x01,0x02,0x02,0x02,0x03,0x04,0x09,0x06,\r\n0x07,0x07,0x06,0x07,0x06,0x06,0x07,0x07,0x06,0x03,0x09,0x06,0x06,0x07,0x06,0x07,0x06,0x06,0x03,0x06,0x06,0x07,0x05,0x09,0x06,0x06,0x07,0x07,0x09,0x06,0x06,0x04,0x09,0x06,0x07,0x08,0x07,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x10,0x06,0x06,0x03,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x06,0x06,0x06,0x06,0x04,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x03,0x03,0x05,0x05,0x08,0x07,0x07,0x05,0x07,0x05,0x05,0x05,0x07,0x06,0x09,0x06,0x05,0x05,0x08,0x09,0x05,0x07,0x05,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x06,0x03,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x08,0x07,0x06,0x05,0x04,0x06,0x05,0x05,0x07,0x07,0x03,0x05,0x06,0x08,0x07,0x05,0x07,0x07,0x05,0x05,0x05,0x05,0x07,0x06,0x07,0x07,0x06,0x05,0x07,0x03,0x07,0x05,0x07,0x03,0x05,\r\n0x05,0x06,0x04,0x06,0x05,0x03,0x03,0x03,0x09,0x09,0x07,0x05,0x05,0x07,0x06,0x05,0x05,0x04,0x06,0x05,0x08,0x05,0x07,0x07,0x05,0x06,0x08,0x07,0x07,0x07,0x05,0x06,0x05,0x05,0x07,0x06,0x07,0x06,0x09,0x09,0x06,0x08,0x05,0x06,0x09,0x05,0x04,0x06,0x06,0x07,0x0a,0x0a,0x07,0x06,0x06,0x05,0x06,0x06,0x06,0x08,0x06,0x06,0x08,0x06,\r\n0x06,0x04,0x07,0x07,0x06,0x06,0x05,0x0a,0x08,0x05,0x06,0x07,0x07,0x07,0x07,0x08,0x08,0x04,0x0b,0x06,0x05,0x06,0x07,0x07,0x06,0x06,0x03,0x09,0x08,0x08,0x05,0x08,0x03,0x03,0x05,0x05,0x03,0x03,0x07,0x04,0x03,0x09,0x08,0x03,0x02,0x02,0x05,0x04,0x04,0x03,0x03,0x03,0x04,0x07,0x05,0x03,0x07,0x08,0x07,0x06,0x06,0x08,0x07,0x07,\r\n0x04,0x05,0x06,0x05,0x02,0x03,0x04,0x06,0x04,0x07,0x07,0x07,0x0a,0x08,0x0a,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x08,0x09,0x04,0x04,0x06,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x06,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x06,0x06,0x0a,0x0a,0x06,0x06,0x08,0x09,0x04,\r\n0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x0b,0x08,0x09,0x06,0x06,0x06,0x07,0x04,0x07,0x08,0x06,0x06,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0a,0x04,0x08,0x06,0x06,0x03,0x06,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0f,0x0b,0x0f,0x0b,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x06,0x06,0x08,0x06,0x06,0x0a,0x06,0x0c,0x0b,0x0a,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x07,\r\n0x07,0x07,0x07,0x07,0x04,0x07,0x07,0x04,0x04,0x07,0x04,0x07,0x04,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x00,0x0d,0x09,0x0f,0x0b,0x0a,0x06,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x05,0x0d,0x09,0x0b,0x0b,0x0a,0x0a,0x0a,\r\n0x06,0x06,0x06,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x0d,0x09,0x06,0x07,0x06,0x06,0x06,0x07,0x06,0x06,0x0d,0x0d,0x09,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x08,0x09,0x04,0x04,0x06,0x06,0x06,0x06,0x0a,0x04,0x0a,0x04,0x06,0x07,0x06,0x06,0x0d,0x0d,0x09,0x09,0x0d,0x0d,\r\n0x09,0x09,0x09,0x09,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x07,0x07,0x07,0x03,0x03,0x06,0x05,0x06,0x07,0x06,0x06,0x06,0x07,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x07,0x07,0x07,0x06,0x06,0x07,0x06,0x07,0x08,0x07,0x08,0x09,0x07,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x07,0x07,0x07,0x06,0x07,0x06,0x07,0x07,0x06,0x06,0x08,0x07,0x08,0x07,0x07,0x07,0x06,0x06,0x08,\r\n0x08,0x08,0x08,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x0a,0x09,0x06,0x08,0x09,0x08,0x07,0x09,0x08,0x08,0x08,0x07,0x07,0x08,0x09,0x08,0x07,0x08,0x06,0x06,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x08,0x09,0x08,0x08,0x08,0x07,0x0a,0x08,0x09,0x08,0x08,0x06,0x08,0x08,0x08,0x09,0x08,0x08,0x0a,0x06,0x06,0x06,0x06,0x07,0x07,\r\n0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x05,0x06,0x06,0x06,0x07,0x08,0x09,0x07,0x07,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x06,0x05,0x05,0x06,0x06,0x05,0x05,0x07,0x05,0x06,0x05,0x06,0x09,0x06,0x09,0x06,0x06,0x06,0x08,0x03,0x09,0x08,0x08,0x07,0x06,0x08,0x07,\r\n0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x0a,0x0a,0x0a,0x0a,0x05,0x08,0x08,0x05,0x04,0x05,0x06,0x06,0x05,0x09,0x09,0x09,0x05,\r\n0x0b,0x05,0x09,0x09,0x09,0x09,0x06,0x05,0x05,0x09,0x06,0x09,0x07,0x06,0x05,0x04,0x0b,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x0f,0x09,0x09,0x05,0x03,0x05,0x03,0x05,0x03,0x03,0x03,0x05,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x05,0x09,0x03,0x0a,0x0a,0x0a,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x0d,0x0d,0x07,0x0d,0x0d,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x06,0x05,0x06,0x05,0x04,0x04,0x08,0x06,0x08,0x05,0x0c,0x0a,0x07,0x06,0x0a,0x09,0x09,0x08,0x0b,0x09,0x0a,0x09,0x07,0x05,\r\n0x08,0x06,0x0a,0x08,0x08,0x07,0x08,0x07,0x0a,0x07,0x0a,0x07,0x0c,0x09,0x08,0x06,0x08,0x06,0x0d,0x0a,0x09,0x00,0x0b,0x0b,0x0b,0x05,0x00,0x00,0x06,0x06,0x08,0x06,0x06,0x05,0x0c,0x0a,0x0a,0x09,0x08,0x06,0x08,0x06,0x06,0x05,0x08,0x07,0x06,0x05,0x09,0x07,0x07,0x06,0x0b,0x09,0x06,0x06,0x08,0x08,0x09,0x05,0x02,0x05,0x08,0x05,\r\n0x0b,0x0b,0x03,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x04,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x07,0x08,0x03,0x02,0x03,0x02,0x08,0x06,0x08,0x07,0x06,0x05,0x06,0x05,0x07,0x06,0x05,0x05,0x0c,0x09,0x0d,0x0a,0x0b,0x09,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x07,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x03,0x05,\r\n0x03,0x08,0x06,0x09,0x07,0x0f,0x0b,0x06,0x06,0x08,0x08,0x09,0x09,0x08,0x06,0x0b,0x09,0x06,0x04,0x06,0x05,0x07,0x05,0x0a,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x05,0x04,0x05,0x04,0x05,0x04,0x06,0x06,0x03,0x07,0x04,0x0b,0x07,0x04,0x06,0x07,0x05,0x08,0x06,0x04,0x04,0x06,0x06,0x06,0x05,0x03,0x08,0x07,0x04,0x04,0x07,0x05,0x08,\r\n0x04,0x09,0x07,0x07,0x05,0x08,0x06,0x06,0x05,0x08,0x06,0x07,0x04,0x06,0x05,0x08,0x05,0x06,0x09,0x05,0x06,0x0a,0x03,0x0d,0x0a,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x05,0x07,0x08,0x0a,0x08,0x0a,0x03,0x05,0x07,0x09,0x0b,0x08,0x0b,0x07,0x07,0x09,0x08,0x0d,0x0a,0x06,0x0a,0x04,0x0a,0x04,0x06,0x06,0x06,0x06,0x09,0x09,\r\n0x09,0x09,0x0b,0x06,0x06,0x0b,0x08,0x06,0x06,0x08,0x07,0x04,0x04,0x07,0x06,0x06,0x06,0x06,0x08,0x04,0x04,0x09,0x08,0x04,0x04,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x06,0x04,0x06,0x06,\r\n0x08,0x07,0x06,0x0a,0x07,0x08,0x08,0x09,0x09,0x06,0x05,0x0b,0x09,0x0b,0x09,0x08,0x06,0x03,0x03,0x06,0x07,0x04,0x07,0x06,0x06,0x05,0x08,0x09,0x04,0x06,0x05,0x02,0x04,0x06,0x06,0x02,0x02,0x02,0x02,0x04,0x04,0x04,0x05,0x10,0x16,0x04,0x05,0x01,0x03,0x04,0x05,0x03,0x05,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r\n0x05,0x05,0x05,0x05,0x05,0x0f,0x06,0x08,0x0a,0x0a,0x07,0x05,0x07,0x08,0x08,0x05,0x03,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x08,0x07,0x06,0x06,0x08,0x07,0x09,0x05,0x06,0x07,0x04,0x06,0x04,0x04,0x03,0x0a,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x06,0x03,0x06,0x05,0x07,0x05,0x07,0x03,0x06,0x07,0x09,0x09,0x07,\r\n0x06,0x06,0x06,0x06,0x05,0x06,0x05,0x05,0x03,0x04,0x03,0x02,0x04,0x06,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x03,0x03,0x03,0x03,0x03,0x13,0x0b,0x0a,0x0c,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x0a,0x04,0x04,0x0a,0x03,0x06,\r\n0x06,0x0f,0x0b,0x0b,0x0f,0x0a,0x06,0x06,0x0a,0x06,0x06,0x05,0x05,0x00,0x00,0x04,0x08,0x07,0x08,0x06,0x0e,0x0b,0x08,0x06,0x08,0x06,0x0f,0x0b,0x08,0x06,0x04,0x03,0x07,0x00,0x08,0x06,0x04,0x03,0x02,0x05,0x04,0x04,0x03,0x02,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x06,0x06,0x06,0x0b,0x09,0x09,0x09,0x09,\r\n0x0a,0x07,0x08,0x07,0x04,0x0a,0x0c,0x05,0x0d,0x06,0x09,0x0a,0x0a,0x0a,0x05,0x08,0x0b,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x06,0x06,0x09,0x06,0x06,0x0a,0x04,0x04,0x0a,0x04,0x04,0x0a,0x05,0x05,0x00,0x05,0x09,0x04,0x04,0x0b,0x06,0x06,0x08,0x06,0x06,0x07,0x03,0x03,\r\n0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x11,0x11,0x0a,0x00,0x00,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x0a,0x07,0x07,0x09,0x0b,0x07,0x07,0x0c,0x07,0x07,0x0a,0x07,0x07,0x09,0x07,0x08,0x09,0x0a,0x07,0x08,0x07,0x08,0x07,0x08,\r\n0x07,0x07,0x08,0x07,0x09,0x07,0x07,0x09,0x07,0x07,0x06,0x09,0x07,0x07,0x07,0x08,0x05,0x06,0x07,0x09,0x09,0x06,0x00,0x00,0x0c,0x18,0x08,0x00,0x01,0x03,0x03,0x05,0x07,0x06,0x0a,0x0a,0x03,0x04,0x04,0x05,0x08,0x03,0x05,0x03,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x08,0x08,0x08,0x05,0x0b,0x08,0x07,\r\n0x08,0x08,0x06,0x06,0x08,0x09,0x03,0x04,0x07,0x06,0x0b,0x09,0x09,0x07,0x09,0x07,0x06,0x06,0x08,0x07,0x0b,0x07,0x07,0x07,0x04,0x05,0x04,0x08,0x05,0x03,0x06,0x07,0x06,0x07,0x06,0x04,0x07,0x07,0x03,0x03,0x06,0x03,0x0b,0x07,0x07,0x07,0x07,0x04,0x05,0x04,0x07,0x06,0x09,0x06,0x06,0x05,0x04,0x03,0x04,0x08,0x08,0x08,0x08,0x06,\r\n0x09,0x09,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x06,0x06,0x05,0x05,0x06,0x07,0x05,0x0b,0x0b,0x09,0x03,0x05,0x08,0x0a,0x09,0x0a,0x08,0x08,0x08,0x06,0x07,0x06,0x07,0x09,0x06,0x05,0x05,0x09,0x0a,0x07,0x05,0x03,0x03,0x08,\r\n0x08,0x06,0x08,0x08,0x06,0x06,0x09,0x08,0x08,0x09,0x0b,0x0b,0x06,0x0c,0x05,0x05,0x03,0x03,0x08,0x07,0x06,0x07,0x02,0x06,0x04,0x04,0x07,0x07,0x05,0x03,0x03,0x05,0x0f,0x08,0x06,0x08,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x09,0x09,0x08,0x08,0x08,0x03,0x04,0x04,0x04,0x04,0x02,0x03,0x02,0x04,0x02,0x04,0x06,0x03,0x06,0x05,0x07,\r\n0x05,0x03,0x08,0x07,0x07,0x06,0x07,0x07,0x08,0x08,0x04,0x04,0x04,0x0b,0x0b,0x0b,0x06,0x08,0x07,0x03,0x06,0x05,0x08,0x06,0x08,0x06,0x07,0x05,0x03,0x08,0x06,0x08,0x06,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x03,0x06,0x04,0x06,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x04,0x06,0x05,0x08,0x07,\r\n0x08,0x07,0x07,0x05,0x07,0x05,0x06,0x09,0x09,0x07,0x07,0x05,0x07,0x06,0x09,0x05,0x06,0x05,0x0d,0x07,0x06,0x07,0x03,0x05,0x0a,0x04,0x07,0x04,0x04,0x07,0x04,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x03,0x07,\r\n0x06,0x06,0x06,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x06,0x05,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x0b,0x09,0x07,0x06,0x03,0x08,0x06,0x0a,0x0a,0x09,0x07,0x03,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x07,0x06,0x03,0x05,0x06,0x07,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x03,0x03,0x03,0x08,0x07,0x09,0x05,0x0a,\r\n0x08,0x0a,0x03,0x08,0x07,0x06,0x07,0x09,0x03,0x07,0x08,0x0b,0x09,0x06,0x09,0x09,0x07,0x06,0x06,0x07,0x07,0x09,0x09,0x03,0x07,0x07,0x05,0x07,0x03,0x07,0x07,0x06,0x05,0x07,0x07,0x03,0x06,0x06,0x07,0x06,0x05,0x07,0x07,0x06,0x07,0x06,0x09,0x0b,0x03,0x07,0x07,0x07,0x0b,0x06,0x08,0x06,0x07,0x06,0x03,0x0c,0x0c,0x09,0x07,0x07,\r\n0x09,0x08,0x07,0x07,0x06,0x08,0x06,0x0b,0x07,0x09,0x09,0x07,0x08,0x0b,0x09,0x09,0x09,0x07,0x08,0x06,0x07,0x09,0x07,0x09,0x08,0x0b,0x0c,0x08,0x09,0x07,0x07,0x0c,0x07,0x06,0x07,0x06,0x05,0x06,0x06,0x09,0x05,0x07,0x07,0x06,0x07,0x09,0x07,0x07,0x07,0x07,0x06,0x05,0x06,0x09,0x06,0x07,0x07,0x0b,0x0b,0x07,0x09,0x06,0x06,0x0a,\r\n0x06,0x06,0x07,0x05,0x06,0x05,0x03,0x09,0x0a,0x07,0x06,0x06,0x07,0x06,0x05,0x0c,0x0d,0x08,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x07,0x09,0x07,0x08,0x07,0x04,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,\r\n0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,\r\n0x07,0x08,0x07,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x04,0x06,0x06,0x09,0x07,0x03,0x04,0x03,0x03,0x06,0x05,0x0c,0x09,0x07,0x06,0x07,0x06,0x09,0x07,0x07,0x06,0x07,0x06,0x08,0x06,0x08,0x07,0x08,0x07,0x09,0x06,0x09,0x07,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x06,0x07,\r\n0x07,0x07,0x07,0x07,0x07,0x08,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x07,0x06,0x07,0x06,0x07,0x06,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x04,0x06,0x04,0x06,0x04,0x06,0x04,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x06,0x07,0x06,0x0b,0x09,0x0b,\r\n0x09,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x05,0x07,0x05,0x07,0x05,0x07,0x04,0x09,0x06,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x03,\r\n0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x05,0x05,0x07,0x07,0x03,0x03,0x07,\r\n0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,\r\n0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x07,0x07,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x08,0x09,0x07,0x07,0x07,0x06,0x07,0x06,0x08,0x07,0x0a,0x03,0x03,0x07,0x06,0x03,0x06,0x0b,0x09,0x07,0x09,0x0c,0x09,0x07,0x07,0x07,0x06,0x05,0x06,0x04,0x04,0x06,0x04,0x06,0x09,0x09,0x07,0x06,0x07,0x05,0x07,0x07,0x05,0x05,0x06,\r\n0x06,0x05,0x05,0x07,0x03,0x05,0x05,0x03,0x0f,0x0e,0x0c,0x0a,0x09,0x06,0x0d,0x0c,0x0a,0x08,0x06,0x03,0x03,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x06,0x08,0x06,0x08,0x06,0x0a,0x0a,0x08,0x07,0x08,0x07,0x07,0x06,0x09,0x07,0x09,0x07,0x07,0x05,0x03,0x0f,0x0e,0x0c,0x08,0x07,0x0c,0x08,0x09,0x07,0x08,0x06,\r\n0x08,0x06,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x08,0x07,0x08,0x07,0x06,0x05,0x09,0x07,0x09,0x07,0x07,0x07,0x05,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x07,0x05,0x05,0x06,0x07,0x03,0x07,\r\n0x07,0x06,0x06,0x05,0x07,0x07,0x07,0x03,0x03,0x04,0x03,0x05,0x03,0x07,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x08,0x09,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x04,0x04,0x07,0x07,0x07,0x06,0x09,0x06,0x05,0x05,0x06,0x05,0x05,0x04,0x04,0x04,0x06,0x07,0x06,0x07,0x06,0x07,0x03,0x06,0x05,0x07,\r\n0x04,0x04,0x0b,0x0b,0x0c,0x07,0x06,0x09,0x0a,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x08,0x07,0x08,0x0a,0x07,0x08,0x07,0x07,0x05,0x06,0x05,0x07,0x06,0x07,0x06,0x0b,0x0a,0x07,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x08,0x07,0x07,0x05,0x07,0x07,0x06,0x03,0x09,0x06,0x06,0x0a,0x08,0x08,0x07,0x0b,0x09,0x08,0x06,0x0a,0x08,0x09,0x07,\r\n0x0b,0x09,0x06,0x05,0x09,0x09,0x09,0x07,0x09,0x07,0x09,0x07,0x10,0x0d,0x0a,0x08,0x0e,0x0b,0x0a,0x08,0x07,0x05,0x06,0x05,0x05,0x00,0x00,0x0c,0x0b,0x07,0x06,0x07,0x07,0x07,0x06,0x06,0x05,0x07,0x06,0x09,0x07,0x0a,0x08,0x0c,0x0a,0x09,0x07,0x07,0x06,0x06,0x05,0x0a,0x08,0x08,0x07,0x0a,0x08,0x0a,0x08,0x03,0x0b,0x09,0x07,0x06,\r\n0x09,0x07,0x08,0x07,0x08,0x06,0x08,0x06,0x0a,0x0a,0x06,0x06,0x09,0x06,0x09,0x06,0x0b,0x09,0x07,0x05,0x06,0x05,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x08,0x07,0x09,0x09,0x07,0x07,0x0a,0x0a,0x0a,0x09,0x07,0x06,0x0b,0x0a,0x0c,0x0a,0x09,0x06,0x08,0x07,0x07,0x07,0x07,0x06,0x07,0x04,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x07,0x04,0x04,0x02,0x03,0x03,0x03,0x03,0x05,0x03,0x03,0x05,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x04,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x03,0x03,0x03,0x05,0x05,0x05,0x05,\r\n0x05,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,\r\n0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,\r\n0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x08,0x04,0x07,0x07,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x06,0x08,0x0a,0x06,\r\n0x06,0x07,0x07,0x05,0x05,0x03,0x04,0x06,0x05,0x09,0x07,0x07,0x06,0x07,0x07,0x07,0x0b,0x06,0x07,0x07,0x06,0x05,0x05,0x05,0x06,0x07,0x09,0x07,0x06,0x09,0x05,0x05,0x05,0x06,0x05,0x06,0x07,0x06,0x07,0x07,0x04,0x06,0x04,0x04,0x05,0x04,0x04,0x05,0x05,0x02,0x03,0x04,0x03,0x06,0x05,0x05,0x05,0x05,0x04,0x04,0x03,0x05,0x06,0x04,\r\n0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x02,0x04,0x06,0x04,0x04,0x03,0x04,0x04,0x04,0x02,0x04,0x04,0x06,0x03,0x04,0x04,0x04,0x04,0x05,0x04,0x02,0x03,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x07,0x02,0x04,0x07,0x0b,0x07,0x06,0x06,0x0a,0x08,0x0a,0x09,0x06,0x07,0x06,0x05,0x0e,0x05,0x07,0x0b,0x0b,0x0b,0x08,0x08,0x08,\r\n0x06,0x06,0x06,0x05,0x05,0x06,0x02,0x00,0x00,0x00,0x00,0x07,0x07,0x08,0x07,0x06,0x05,0x07,0x07,0x04,0x0a,0x07,0x07,0x04,0x04,0x06,0x04,0x05,0x07,0x06,0x07,0x0b,0x08,0x04,0x03,0x07,0x06,0x07,0x07,0x07,0x04,0x07,0x06,0x03,0x0b,0x07,0x07,0x04,0x05,0x05,0x06,0x06,0x05,0x06,0x07,0x07,0x06,0x05,0x05,0x09,0x03,0x06,0x03,0x07,\r\n0x05,0x04,0x03,0x03,0x04,0x03,0x02,0x02,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x06,0x04,0x04,0x04,0x04,0x04,0x03,0x02,0x02,0x04,0x04,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x04,0x06,0x06,0x06,0x06,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0x03,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x08,0x09,0x07,0x09,0x08,0x0b,0x09,0x06,0x05,0x06,0x08,0x06,0x0a,0x08,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x05,0x03,0x06,0x07,0x05,0x06,0x06,0x07,0x07,0x06,0x0c,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x06,0x06,0x08,0x06,0x06,0x06,0x04,0x07,0x04,0x09,0x08,0x06,0x04,0x0a,0x06,0x0a,0x03,0x04,0x07,0x07,0x08,0x08,0x08,0x07,0x07,0x07,0x0a,0x03,0x07,0x03,0x06,0x05,0x03,0x03,0x06,0x03,0x09,0x03,0x0b,0x06,0x0b,0x0b,0x07,0x07,0x07,0x06,0x06,0x05,0x05,0x0e,0x0e,0x10,0x10,0x0a,0x0a,0x06,0x06,0x02,0x0c,0x09,0x0a,0x08,\r\n0x07,0x08,0x06,0x06,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x03,0x08,0x00,0x08,0x08,0x08,0x04,0x06,0x06,0x0b,0x04,0x0b,0x04,0x07,0x08,0x07,0x05,0x0b,0x06,0x0b,0x06,0x09,0x0a,0x04,0x06,0x06,0x05,0x03,0x06,0x07,0x06,0x07,0x06,0x07,0x07,0x06,0x08,0x08,0x0b,0x04,0x06,0x05,0x08,0x06,0x04,0x06,0x06,0x06,0x0b,\r\n0x04,0x0b,0x04,0x03,0x07,0x05,0x0c,0x06,0x06,0x08,0x08,0x0c,0x06,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x09,0x08,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x09,0x0a,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x06,0x07,0x07,0x07,0x0c,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0c,0x06,0x06,0x09,0x09,0x0d,0x0c,0x0b,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0b,0x06,0x0b,0x06,0x0b,\r\n0x06,0x0b,0x06,0x0b,0x06,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x08,0x04,0x08,0x04,0x07,0x08,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0b,0x09,0x0a,0x04,0x06,0x09,0x0a,0x09,0x0a,0x00,0x00,0x00,0x00,0x00,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x07,0x00,0x00,0x00,0x0e,0x0a,\r\n0x10,0x0c,0x06,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x0b,0x0b,0x04,0x07,0x07,0x07,0x0f,0x0a,0x06,0x12,0x0d,0x04,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x05,0x05,0x09,0x08,0x08,0x06,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x0f,0x12,0x00,\r\n0x00,0x00,0x00,0x00,0x07,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x08,0x07,0x06,0x06,0x05,0x0e,0x0a,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x0c,0x06,0x06,0x0c,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,0x0b,0x06,0x06,\r\n0x07,0x07,0x07,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x08,0x04,0x04,0x05,0x05,0x0e,0x0a,0x08,0x07,0x07,0x00,0x06,0x06,0x06,0x04,0x07,0x08,0x08,0x06,0x06,0x04,0x03,0x09,0x07,0x07,0x04,0x07,0x06,0x06,0x06,0x06,0x03,0x06,0x05,0x07,0x06,0x07,0x06,0x07,0x05,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x05,\r\n0x06,0x06,0x03,0x06,0x07,0x07,0x06,0x04,0x09,0x07,0x08,0x06,0x07,0x06,0x07,0x06,0x05,0x08,0x04,0x05,0x05,0x06,0x07,0x07,0x06,0x0c,0x06,0x0c,0x04,0x03,0x02,0x06,0x03,0x02,0x00,0x02,0x03,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x05,0x09,0x07,0x0b,0x09,0x07,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x0b,0x0b,0x0a,0x06,0x0a,0x06,0x0a,0x08,0x08,0x08,0x08,0x09,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x09,0x07,0x0d,0x0a,0x06,0x06,0x03,0x03,0x03,0x04,0x03,0x07,0x03,0x03,0x0a,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x02,0x00,0x00,0x03,\r\n0x00,0x00,0x08,0x07,0x05,0x06,0x08,0x03,0x04,0x08,0x08,0x03,0x07,0x07,0x07,0x08,0x08,0x03,0x05,0x08,0x07,0x07,0x08,0x07,0x07,0x08,0x07,0x09,0x09,0x06,0x06,0x06,0x03,0x05,0x07,0x07,0x07,0x07,0x06,0x07,0x08,0x06,0x08,0x07,0x07,0x08,0x07,0x09,0x07,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x07,0x05,0x06,0x08,0x04,0x04,0x08,0x04,\r\n0x07,0x07,0x07,0x08,0x05,0x08,0x07,0x08,0x07,0x08,0x07,0x09,0x09,0x03,0x07,0x07,0x08,0x08,0x0e,0x00,0x08,0x07,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x09,0x08,0x08,0x08,\r\n0x07,0x08,0x09,0x09,0x06,0x08,0x09,0x09,0x08,0x09,0x0a,0x09,0x08,0x07,0x07,0x09,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x08,0x08,0x08,0x09,0x08,0x07,0x08,0x08,0x0a,0x06,0x07,0x07,0x0b,0x06,0x06,0x09,0x0b,0x07,0x06,0x0d,0x07,0x07,0x09,0x06,0x06,0x09,0x07,0x09,0x0a,0x0b,0x06,0x09,0x06,0x08,0x07,0x07,0x07,0x08,0x06,\r\n0x07,0x09,0x06,0x07,0x08,0x06,0x06,0x07,0x0b,0x06,0x06,0x07,0x07,0x05,0x04,0x07,0x07,0x07,0x06,0x07,0x0b,0x07,0x0b,0x06,0x07,0x0b,0x08,0x07,0x0b,0x09,0x09,0x0b,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x07,0x07,0x07,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x08,\r\n0x07,0x09,0x08,0x08,0x07,0x08,0x08,0x09,0x09,0x07,0x08,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x08,0x08,0x08,0x09,0x0a,0x08,0x09,0x09,0x01,0x01,0x02,0x02,0x02,0x03,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x04,0x0a,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x03,0x07,0x06,0x07,0x05,0x0a,0x07,0x07,0x07,0x07,\r\n0x0a,0x07,0x07,0x05,0x0a,0x07,0x07,0x08,0x08,0x03,0x03,0x0e,0x0d,0x0d,0x0e,0x11,0x06,0x06,0x03,0x06,0x05,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x07,0x05,0x05,0x07,0x07,0x03,0x04,0x06,0x05,0x09,0x08,0x07,0x06,0x07,0x06,0x05,0x05,0x07,0x06,0x0a,0x06,0x06,0x06,0x08,0x09,0x05,0x08,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x03,0x03,0x03,0x03,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r\n0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x06,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x07,0x04,0x06,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x06,0x08,0x08,0x06,0x06,0x05,0x06,0x05,0x06,0x07,0x07,0x03,0x06,0x06,0x09,0x08,0x05,0x07,0x07,0x06,0x06,0x05,0x06,0x08,0x06,0x08,0x08,0x06,0x05,0x07,0x03,0x07,0x06,0x08,0x03,0x06,0x05,0x07,0x05,0x06,0x05,0x03,0x03,0x04,0x0a,0x0a,0x07,0x06,0x06,0x07,0x06,0x06,0x06,0x05,0x07,0x05,0x09,0x05,0x08,0x08,0x06,0x07,0x09,0x07,\r\n0x07,0x07,0x06,0x06,0x05,0x06,0x08,0x06,0x08,0x07,0x0a,0x0a,0x07,0x08,0x06,0x06,0x0a,0x06,0x05,0x07,0x07,0x07,0x0b,0x0b,0x08,0x06,0x07,0x05,0x07,0x07,0x07,0x08,0x06,0x06,0x08,0x07,0x07,0x04,0x08,0x07,0x07,0x06,0x06,0x0b,0x09,0x06,0x06,0x07,0x07,0x07,0x07,0x09,0x08,0x04,0x0b,0x07,0x07,0x07,0x08,0x08,0x06,0x06,0x03,0x09,\r\n0x08,0x08,0x06,0x08,0x03,0x03,0x05,0x05,0x03,0x03,0x07,0x05,0x03,0x09,0x08,0x03,0x03,0x03,0x05,0x05,0x05,0x03,0x03,0x03,0x05,0x08,0x06,0x04,0x07,0x08,0x07,0x07,0x06,0x09,0x07,0x07,0x04,0x05,0x06,0x05,0x03,0x03,0x05,0x06,0x04,0x08,0x08,0x08,0x0b,0x09,0x0b,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x09,0x0a,0x04,0x04,0x06,0x04,\r\n0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x06,0x06,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x06,0x0b,0x0b,0x06,0x06,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x0c,0x09,0x0a,0x06,0x07,0x07,0x08,0x04,0x08,0x09,0x06,0x06,0x04,0x04,0x04,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0b,0x04,0x09,0x06,0x06,0x03,0x06,0x06,0x06,0x06,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x10,0x0c,0x10,0x0c,0x0a,0x0a,0x0a,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x06,0x06,0x09,0x06,0x06,0x0b,0x06,0x0d,0x0c,0x0b,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x08,0x08,0x08,0x08,0x08,0x04,0x08,0x08,0x04,0x04,0x08,0x04,0x08,0x04,0x08,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,\r\n0x06,0x04,0x04,0x04,0x04,0x00,0x0e,0x0a,0x10,0x0c,0x0b,0x06,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x0b,0x04,0x07,0x07,0x06,0x06,0x05,0x0e,0x0a,0x0c,0x0c,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x08,0x04,0x08,0x04,0x08,0x04,0x0e,0x0a,0x07,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x0e,0x0e,0x0a,0x0a,0x05,0x05,0x07,0x07,\r\n0x07,0x07,0x04,0x04,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x09,0x0a,0x04,0x04,0x07,0x07,0x07,0x07,0x0b,0x04,0x0b,0x04,0x07,0x08,0x07,0x07,0x0e,0x0e,0x0a,0x0a,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x0a,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x04,0x04,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,\r\n0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x08,0x08,0x03,0x03,0x06,0x05,0x07,0x08,0x07,0x06,0x07,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x06,0x07,0x07,0x07,0x08,0x07,0x07,0x08,0x06,0x08,0x09,0x08,0x09,\r\n0x0a,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x06,0x06,0x09,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x0a,0x0a,0x07,0x09,0x0a,0x09,0x07,0x0a,0x09,0x08,0x08,0x07,0x08,0x09,0x0a,0x08,0x07,0x08,0x07,\r\n0x06,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0b,0x09,0x0a,0x09,0x09,0x07,0x09,0x08,0x08,0x0a,0x09,0x09,0x0b,0x07,0x06,0x07,0x06,0x07,0x08,0x08,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x09,0x0a,\r\n0x08,0x08,0x08,0x09,0x08,0x08,0x06,0x06,0x07,0x07,0x06,0x06,0x07,0x07,0x06,0x06,0x08,0x05,0x07,0x06,0x07,0x09,0x07,0x0a,0x06,0x07,0x07,0x09,0x04,0x09,0x08,0x09,0x08,0x07,0x09,0x07,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x06,0x05,0x04,0x04,0x03,0x03,\r\n0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x0b,0x0b,0x0b,0x0b,0x06,0x09,0x09,0x06,0x05,0x06,0x06,0x07,0x06,0x0a,0x0a,0x0a,0x05,0x0c,0x06,0x0a,0x0a,0x0a,0x0a,0x07,0x06,0x06,0x09,0x07,0x09,0x08,0x06,0x05,0x05,0x0c,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x10,0x0a,0x0a,0x05,\r\n0x03,0x05,0x03,0x06,0x03,0x03,0x03,0x06,0x07,0x07,0x07,0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x0a,0x03,0x0b,0x0b,0x0b,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x08,0x0e,0x0e,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x06,0x07,0x06,0x06,0x05,0x04,0x04,0x08,0x07,0x09,0x05,0x0e,0x0b,0x07,0x07,0x0b,0x0a,0x0a,0x09,0x0c,0x0a,0x0b,0x09,0x08,0x06,0x09,0x07,0x0b,0x09,0x09,0x07,0x09,0x07,0x0a,0x08,0x0b,0x08,0x0d,0x0a,0x09,0x07,0x09,0x07,0x0f,0x0b,0x0a,0x00,0x0c,0x0c,0x0c,0x06,0x00,0x00,\r\n0x07,0x06,0x08,0x07,0x06,0x05,0x0d,0x0b,0x0b,0x0a,0x09,0x07,0x08,0x07,0x06,0x05,0x09,0x07,0x06,0x05,0x0a,0x08,0x08,0x07,0x0c,0x0a,0x06,0x07,0x09,0x09,0x0a,0x05,0x02,0x06,0x08,0x05,0x0c,0x0c,0x03,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x05,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x07,0x07,\r\n0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x06,0x08,0x09,0x03,0x03,0x03,\r\n0x03,0x09,0x07,0x09,0x08,0x07,0x06,0x06,0x06,0x07,0x07,0x05,0x05,0x0e,0x0a,0x0e,0x0b,0x0c,0x0a,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x06,0x03,0x09,0x07,0x0a,0x08,0x10,0x0c,0x07,0x07,0x08,0x08,0x0a,0x0a,0x09,0x07,0x0c,0x09,0x07,0x05,0x07,0x06,0x07,0x06,0x0b,0x09,0x07,0x06,0x07,\r\n0x07,0x07,0x07,0x06,0x05,0x06,0x05,0x06,0x04,0x06,0x06,0x04,0x08,0x04,0x0b,0x08,0x04,0x07,0x07,0x06,0x09,0x07,0x05,0x04,0x07,0x07,0x07,0x06,0x03,0x09,0x07,0x04,0x04,0x07,0x06,0x09,0x05,0x09,0x07,0x07,0x06,0x08,0x07,0x07,0x06,0x09,0x07,0x07,0x04,0x06,0x05,0x09,0x05,0x06,0x0a,0x06,0x07,0x0b,0x03,0x0e,0x0b,0x0b,0x0e,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x08,0x08,0x0b,0x08,0x0b,0x03,0x06,0x07,0x0b,0x0c,0x08,0x0c,0x07,0x07,0x0a,0x08,0x0e,0x0b,0x06,0x0b,0x04,0x0b,0x04,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0c,0x06,0x06,0x0c,0x09,0x06,0x06,0x09,0x08,0x04,0x04,0x08,0x07,0x07,0x07,0x07,0x09,0x04,0x04,0x0a,0x09,0x04,0x04,0x0a,0x05,0x05,\r\n0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x06,0x05,0x07,0x06,0x09,0x07,0x07,0x0b,0x08,0x09,0x09,0x0a,0x0a,0x07,0x06,0x0c,0x0a,0x0d,0x0a,0x08,0x07,0x04,0x04,0x07,0x08,0x05,0x07,0x06,0x07,0x06,0x09,0x0a,\r\n0x05,0x07,0x05,0x03,0x04,0x06,0x07,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x12,0x18,0x04,0x05,0x02,0x03,0x05,0x05,0x04,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x10,0x06,0x09,0x0b,0x0b,0x08,0x06,0x07,0x09,0x09,0x06,0x04,0x08,0x06,0x08,0x07,0x08,0x06,0x07,0x09,0x07,0x07,0x06,\r\n0x09,0x07,0x0a,0x05,0x06,0x08,0x04,0x07,0x04,0x04,0x03,0x0b,0x07,0x07,0x06,0x06,0x07,0x0b,0x0b,0x0b,0x0c,0x0c,0x07,0x06,0x03,0x06,0x06,0x07,0x05,0x08,0x03,0x07,0x07,0x0a,0x0a,0x07,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x04,0x07,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x04,0x00,0x03,0x03,0x03,0x03,0x03,0x14,0x0c,0x0a,0x0d,0x03,0x03,0x04,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x0b,0x04,0x04,0x0b,0x03,0x06,0x06,0x10,0x0c,0x0c,0x10,0x0b,0x06,0x06,0x0b,0x06,0x06,0x05,0x05,0x00,0x00,0x04,0x09,0x07,0x09,0x07,0x0f,0x0c,0x08,0x07,0x08,0x07,0x10,0x0c,\r\n0x09,0x07,0x05,0x04,0x07,0x00,0x08,0x06,0x04,0x04,0x02,0x06,0x04,0x04,0x03,0x02,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x06,0x05,0x07,0x07,0x07,0x0c,0x0b,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x07,0x05,0x0b,0x0e,0x05,0x0e,0x06,0x0a,0x0b,0x0b,0x0b,0x05,0x09,0x0c,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x07,0x07,0x0a,0x06,0x06,0x0b,0x04,0x04,0x0b,0x04,0x04,0x0b,0x06,0x06,0x00,0x05,0x0a,0x04,0x04,0x0c,0x06,0x06,0x09,0x06,0x06,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x12,0x12,0x0b,0x00,0x00,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,\r\n0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x07,0x08,0x08,0x0b,0x08,0x08,0x0a,0x0c,0x08,0x08,0x0d,0x08,0x08,0x0b,0x08,0x08,0x09,0x08,0x09,0x0a,0x0b,0x08,0x09,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x07,0x08,0x09,0x07,0x08,0x07,0x09,0x08,0x08,0x08,0x08,0x05,0x06,0x08,0x09,0x09,0x07,0x00,0x00,0x0d,0x1a,0x08,0x00,\r\n0x01,0x04,0x04,0x05,0x08,0x07,0x0b,0x0a,0x03,0x04,0x04,0x05,0x09,0x03,0x05,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x09,0x09,0x09,0x06,0x0c,0x08,0x07,0x08,0x09,0x07,0x06,0x09,0x09,0x03,0x05,0x08,0x06,0x0c,0x0a,0x0a,0x07,0x0a,0x08,0x07,0x07,0x09,0x08,0x0c,0x08,0x07,0x07,0x04,0x05,0x04,0x09,\r\n0x05,0x03,0x07,0x08,0x06,0x08,0x07,0x04,0x08,0x07,0x03,0x03,0x06,0x03,0x0b,0x07,0x08,0x08,0x08,0x05,0x06,0x04,0x07,0x06,0x09,0x06,0x06,0x06,0x04,0x03,0x04,0x09,0x08,0x08,0x08,0x07,0x0a,0x0a,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,\r\n0x05,0x05,0x07,0x07,0x06,0x05,0x06,0x07,0x05,0x0c,0x0c,0x0a,0x04,0x05,0x09,0x0b,0x0a,0x0b,0x09,0x09,0x09,0x07,0x08,0x07,0x08,0x0a,0x07,0x05,0x06,0x0a,0x0b,0x08,0x06,0x04,0x04,0x09,0x08,0x07,0x09,0x08,0x07,0x07,0x09,0x08,0x08,0x0a,0x0c,0x0c,0x07,0x0d,0x05,0x05,0x03,0x03,0x09,0x08,0x06,0x07,0x02,0x07,0x04,0x04,0x07,0x07,\r\n0x05,0x03,0x03,0x05,0x10,0x08,0x07,0x08,0x07,0x07,0x03,0x03,0x03,0x03,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x03,0x05,0x04,0x04,0x04,0x03,0x04,0x03,0x04,0x02,0x05,0x06,0x03,0x07,0x06,0x07,0x06,0x03,0x09,0x07,0x07,0x06,0x07,0x08,0x09,0x09,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x06,0x09,0x08,0x03,0x07,0x06,0x08,0x06,0x08,0x06,0x08,0x05,\r\n0x03,0x08,0x07,0x08,0x07,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x06,0x03,0x06,0x04,0x06,0x04,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x08,0x05,0x08,0x05,0x07,0x06,0x07,0x04,0x07,0x06,0x09,0x07,0x09,0x07,0x07,0x06,0x07,0x06,0x06,0x0a,0x09,0x08,0x08,0x06,0x07,0x06,0x09,0x05,0x06,0x05,0x0e,0x08,0x06,0x08,0x03,0x05,0x0a,0x04,0x08,0x05,\r\n0x05,0x08,0x05,0x08,0x07,0x08,0x06,0x08,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x03,0x08,0x06,0x06,0x06,0x03,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x0a,0x08,0x08,0x05,0x07,0x06,0x07,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x0c,0x09,\r\n0x07,0x06,0x03,0x08,0x07,0x0b,0x0b,0x0a,0x08,0x03,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x07,0x06,0x03,0x05,0x07,0x08,0x0c,0x0c,0x0c,0x0c,0x05,0x05,0x03,0x04,0x04,0x08,0x07,0x0a,0x05,0x0a,0x09,0x0b,0x03,0x08,0x07,0x07,0x07,0x09,0x03,0x08,0x08,0x0c,0x0a,0x07,0x0a,0x09,0x07,0x07,0x07,0x07,0x08,0x0b,0x0a,0x03,0x07,0x08,0x06,0x07,\r\n0x03,0x07,0x07,0x07,0x06,0x07,0x08,0x03,0x07,0x06,0x07,0x07,0x06,0x08,0x08,0x06,0x07,0x07,0x09,0x0b,0x03,0x07,0x08,0x07,0x0b,0x07,0x09,0x06,0x08,0x07,0x03,0x0d,0x0d,0x09,0x08,0x07,0x09,0x08,0x07,0x07,0x06,0x09,0x07,0x0b,0x07,0x0a,0x0a,0x08,0x09,0x0c,0x09,0x0a,0x09,0x07,0x08,0x07,0x07,0x09,0x08,0x0a,0x09,0x0d,0x0e,0x09,\r\n0x0a,0x07,0x08,0x0d,0x08,0x07,0x08,0x07,0x05,0x07,0x07,0x09,0x06,0x07,0x07,0x06,0x07,0x09,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x09,0x06,0x07,0x07,0x0b,0x0b,0x08,0x09,0x07,0x06,0x0b,0x07,0x07,0x07,0x05,0x06,0x06,0x03,0x0b,0x0b,0x07,0x06,0x06,0x07,0x06,0x05,0x0d,0x0f,0x08,0x05,0x05,0x05,0x05,0x03,0x07,0x06,0x07,0x0a,0x08,\r\n0x09,0x08,0x04,0x04,0x03,0x03,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,\r\n0x03,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x07,0x07,0x0a,0x07,0x03,0x05,0x03,0x03,0x07,0x05,0x0c,0x0a,0x08,0x07,0x08,0x06,0x0a,\r\n0x07,0x07,0x07,0x07,0x07,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x0a,0x08,0x04,0x04,0x04,0x04,0x05,0x05,0x06,0x06,0x06,0x06,0x03,0x03,0x04,0x04,0x04,0x04,0x07,0x07,0x08,0x07,0x07,0x08,0x07,0x08,0x07,0x08,0x08,0x06,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,\r\n0x04,0x09,0x08,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x03,0x03,0x03,0x03,0x08,0x06,0x08,0x06,0x08,0x06,0x06,0x03,0x06,0x03,0x06,0x03,0x06,0x03,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x07,0x08,0x07,0x08,0x08,0x05,0x08,0x05,0x08,0x05,0x08,\r\n0x05,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x07,0x04,0x07,0x04,0x07,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x06,0x08,0x06,0x0c,0x09,0x0c,0x09,0x08,0x06,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x07,0x04,0x09,0x06,0x07,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x07,\r\n0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x06,0x06,0x07,0x07,0x03,0x03,0x08,0x08,0x07,0x07,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x09,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,\r\n0x05,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x08,0x08,0x07,0x07,0x07,0x07,0x09,0x09,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x06,0x09,0x0a,0x07,0x08,0x08,0x07,0x07,0x06,0x09,\r\n0x08,0x0b,0x04,0x04,0x08,0x06,0x03,0x06,0x0c,0x0a,0x07,0x0a,0x0d,0x0a,0x08,0x08,0x07,0x07,0x06,0x07,0x04,0x04,0x07,0x04,0x07,0x0a,0x09,0x07,0x07,0x07,0x06,0x08,0x08,0x06,0x05,0x07,0x07,0x05,0x05,0x07,0x03,0x05,0x06,0x04,0x10,0x0f,0x0d,0x0b,0x09,0x07,0x0e,0x0d,0x0b,0x08,0x07,0x03,0x03,0x0a,0x08,0x09,0x07,0x09,0x07,0x09,\r\n0x07,0x09,0x07,0x09,0x07,0x07,0x08,0x07,0x08,0x07,0x0b,0x0b,0x09,0x08,0x09,0x08,0x08,0x06,0x0a,0x08,0x0a,0x08,0x08,0x06,0x03,0x10,0x0f,0x0d,0x09,0x08,0x0d,0x09,0x0a,0x07,0x08,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x0a,0x08,0x0a,0x08,0x07,0x05,0x08,0x05,0x09,0x07,0x09,0x07,0x07,0x06,0x09,0x07,0x0a,0x08,\r\n0x07,0x07,0x06,0x08,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x07,0x06,0x08,0x07,0x07,0x07,0x08,0x07,0x08,0x08,0x08,0x06,0x06,0x08,0x08,0x07,0x08,0x05,0x05,0x07,0x07,0x04,0x08,0x08,0x07,0x06,0x06,0x07,0x07,0x07,0x03,0x04,0x04,0x04,0x05,0x03,0x08,0x0b,0x0b,0x0b,0x07,0x07,0x08,0x08,0x09,0x09,0x08,0x05,0x05,0x05,0x05,\r\n0x05,0x04,0x04,0x06,0x06,0x05,0x03,0x03,0x04,0x04,0x04,0x04,0x08,0x08,0x07,0x06,0x09,0x06,0x05,0x06,0x07,0x06,0x06,0x05,0x05,0x05,0x06,0x08,0x06,0x07,0x07,0x07,0x03,0x06,0x05,0x08,0x05,0x05,0x0c,0x0c,0x0d,0x08,0x06,0x09,0x0a,0x08,0x07,0x06,0x06,0x07,0x08,0x07,0x09,0x07,0x08,0x0a,0x07,0x09,0x08,0x08,0x06,0x06,0x06,0x08,\r\n0x07,0x08,0x06,0x0c,0x0b,0x08,0x07,0x08,0x07,0x08,0x06,0x08,0x06,0x09,0x08,0x07,0x05,0x07,0x08,0x06,0x03,0x0a,0x06,0x06,0x0b,0x09,0x08,0x08,0x0c,0x09,0x09,0x06,0x0b,0x09,0x09,0x07,0x0c,0x0a,0x07,0x06,0x0a,0x0a,0x0a,0x08,0x09,0x08,0x09,0x08,0x11,0x0f,0x0b,0x08,0x0f,0x0c,0x0b,0x09,0x08,0x06,0x07,0x05,0x05,0x00,0x00,0x0d,\r\n0x0c,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x06,0x08,0x06,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x09,0x07,0x08,0x06,0x07,0x05,0x0b,0x09,0x09,0x08,0x0b,0x08,0x0b,0x08,0x03,0x0b,0x09,0x08,0x07,0x09,0x08,0x09,0x07,0x08,0x07,0x08,0x07,0x0b,0x0b,0x07,0x07,0x09,0x07,0x09,0x07,0x0b,0x09,0x07,0x06,0x07,0x06,0x0a,0x07,0x0a,0x07,0x0a,0x08,\r\n0x0a,0x08,0x08,0x06,0x07,0x06,0x07,0x06,0x07,0x06,0x09,0x07,0x0a,0x09,0x07,0x08,0x0b,0x0b,0x0a,0x09,0x07,0x06,0x0c,0x0a,0x0d,0x0b,0x09,0x07,0x09,0x08,0x08,0x07,0x07,0x07,0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x08,0x04,0x04,0x02,0x03,0x03,0x03,0x04,0x05,0x04,0x03,0x05,0x03,\r\n0x03,0x03,0x04,0x04,0x03,0x03,0x08,0x08,0x08,0x08,0x04,0x04,0x03,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x02,0x03,0x04,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x05,0x04,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,\r\n0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,\r\n0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x08,0x04,\r\n0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x06,0x09,0x0b,0x06,0x06,0x07,0x07,0x05,0x05,0x03,0x04,0x06,0x05,0x09,0x07,0x08,0x06,0x08,0x08,0x08,0x0c,0x07,0x08,0x08,0x06,0x06,0x06,0x05,0x07,0x07,0x09,0x07,\r\n0x06,0x09,0x06,0x05,0x05,0x07,0x05,0x06,0x07,0x06,0x08,0x07,0x05,0x06,0x05,0x05,0x05,0x04,0x04,0x05,0x06,0x02,0x03,0x05,0x04,0x07,0x06,0x06,0x06,0x05,0x04,0x04,0x04,0x05,0x07,0x04,0x04,0x05,0x06,0x05,0x05,0x04,0x04,0x03,0x03,0x05,0x02,0x04,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x03,0x04,0x04,0x06,0x04,0x04,0x04,0x04,0x04,\r\n0x05,0x04,0x02,0x03,0x04,0x04,0x04,0x04,0x05,0x05,0x04,0x08,0x02,0x05,0x07,0x0b,0x08,0x07,0x07,0x0b,0x08,0x0b,0x0a,0x07,0x08,0x07,0x06,0x0f,0x06,0x08,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x06,0x06,0x07,0x06,0x06,0x07,0x03,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x06,0x05,0x08,0x08,0x04,0x0b,0x07,0x08,0x05,0x04,0x06,0x04,0x06,\r\n0x08,0x06,0x08,0x0c,0x08,0x04,0x03,0x08,0x07,0x08,0x08,0x08,0x04,0x08,0x06,0x03,0x0b,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x07,0x08,0x08,0x07,0x06,0x06,0x0a,0x03,0x06,0x03,0x07,0x06,0x05,0x03,0x03,0x04,0x03,0x02,0x02,0x05,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x03,0x06,0x06,0x04,0x04,0x05,0x04,0x05,0x03,0x02,0x03,\r\n0x04,0x04,0x04,0x04,0x04,0x03,0x03,0x04,0x03,0x04,0x00,0x00,0x00,0x00,0x03,0x04,0x04,0x04,0x03,0x04,0x07,0x07,0x07,0x07,0x04,0x00,0x00,0x00,0x00,0x06,0x04,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,0x03,0x03,0x07,0x07,0x07,0x07,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x02,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x0a,0x08,0x09,0x08,0x0a,0x08,0x0c,0x0a,0x07,0x05,0x07,0x09,0x07,0x0b,\r\n0x09,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0d,0x05,0x03,0x07,0x08,0x05,0x07,0x07,0x08,0x08,0x07,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x08,0x07,0x07,0x07,0x04,0x08,0x04,0x0a,0x09,0x07,0x04,0x0b,0x07,0x0b,0x03,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x0b,0x03,0x08,0x03,0x07,0x05,0x03,0x03,0x07,0x03,0x0a,0x03,0x0c,0x07,0x0c,0x0c,0x08,0x08,0x08,0x07,0x07,0x05,0x05,0x0f,0x0f,0x11,0x11,0x0b,0x0b,0x07,0x07,0x02,0x0d,0x0a,0x0b,0x09,0x08,0x09,0x07,0x07,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x03,0x08,0x00,0x08,0x08,0x08,0x04,0x07,0x07,0x0c,0x04,0x0c,0x04,\r\n0x08,0x09,0x08,0x05,0x0c,0x07,0x0c,0x07,0x0a,0x0b,0x04,0x07,0x07,0x05,0x03,0x07,0x08,0x07,0x08,0x07,0x08,0x08,0x07,0x09,0x08,0x0c,0x04,0x07,0x05,0x09,0x07,0x04,0x07,0x07,0x07,0x0c,0x04,0x0c,0x04,0x03,0x08,0x05,0x0d,0x07,0x07,0x08,0x08,0x0d,0x07,0x00,0x00,0x00,0x08,0x00,0x08,0x08,0x08,0x08,0x0a,0x08,0x00,0x00,0x03,0x03,\r\n0x03,0x03,0x03,0x03,0x05,0x05,0x07,0x07,0x0a,0x0b,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x07,0x05,0x05,0x05,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,\r\n0x0d,0x0b,0x07,0x08,0x08,0x08,0x0d,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0a,0x0a,0x0e,0x0d,0x0c,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x09,0x04,0x09,0x04,0x07,0x09,0x08,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x07,0x0b,0x0c,0x0a,0x0b,0x04,0x07,0x0a,0x0b,0x0a,0x0b,0x00,0x00,0x00,0x00,0x00,0x0f,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x05,0x00,0x00,0x08,0x00,0x00,0x00,0x0f,0x0b,0x11,0x0d,0x07,0x08,0x08,0x08,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0c,0x0c,0x05,0x08,\r\n0x08,0x08,0x10,0x0b,0x07,0x14,0x0e,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x05,0x05,0x0a,0x09,0x09,0x07,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x10,0x14,0x00,0x00,0x00,0x00,0x00,0x08,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,\r\n0x08,0x08,0x09,0x08,0x07,0x07,0x05,0x0f,0x0b,0x07,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x0d,0x07,0x07,0x0d,0x07,0x07,0x0c,0x07,0x07,0x0c,0x07,0x07,0x0c,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x04,0x09,0x04,0x09,0x04,0x09,0x09,0x04,0x04,0x05,0x05,0x0f,0x0b,0x08,0x08,0x08,0x00,0x07,0x07,0x07,0x05,0x07,0x09,\r\n0x08,0x07,0x07,0x05,0x03,0x0a,0x08,0x08,0x05,0x07,0x06,0x06,0x06,0x06,0x03,0x07,0x05,0x08,0x06,0x08,0x06,0x07,0x06,0x09,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x06,0x06,0x04,0x07,0x07,0x08,0x07,0x04,0x0a,0x08,0x08,0x07,0x08,0x06,0x07,0x07,0x05,0x09,0x05,0x05,0x05,0x06,0x08,0x08,0x07,0x0d,0x07,0x0d,\r\n0x04,0x03,0x02,0x07,0x03,0x02,0x00,0x02,0x03,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0c,0x06,0x0a,0x08,0x0c,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0b,0x06,0x0b,0x06,0x0b,0x08,0x09,0x09,0x09,0x0a,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,\r\n0x09,0x0a,0x08,0x0e,0x0b,0x06,0x06,0x04,0x04,0x04,0x05,0x03,0x07,0x03,0x03,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x08,0x07,0x06,0x06,0x09,0x03,0x04,0x09,0x09,0x03,0x07,0x07,0x07,0x09,0x09,0x03,0x05,0x09,0x08,0x08,0x08,0x07,0x08,0x09,0x07,0x0a,\r\n0x09,0x07,0x07,0x07,0x03,0x05,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x06,0x09,0x07,0x07,0x09,0x07,0x09,0x07,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x06,0x06,0x09,0x04,0x05,0x09,0x04,0x07,0x07,0x07,0x09,0x05,0x09,0x08,0x08,0x08,0x09,0x07,0x0a,0x09,0x03,0x07,0x07,0x08,0x08,0x10,0x00,0x08,0x07,0x08,0x08,0x08,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x03,0x00,0x0a,0x08,0x09,0x09,0x07,0x09,0x0a,0x0a,0x06,0x08,0x0a,0x0a,0x09,0x0a,0x0b,0x0a,0x09,0x07,0x07,0x0a,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x0a,0x07,0x08,0x09,0x09,\r\n0x0a,0x08,0x08,0x08,0x09,0x0b,0x06,0x08,0x08,0x0b,0x07,0x07,0x0a,0x0c,0x08,0x07,0x0e,0x07,0x07,0x0a,0x07,0x07,0x0a,0x07,0x0a,0x0b,0x0b,0x07,0x0a,0x07,0x09,0x07,0x08,0x07,0x08,0x07,0x08,0x0a,0x07,0x08,0x09,0x07,0x07,0x08,0x0c,0x07,0x07,0x08,0x08,0x06,0x04,0x07,0x07,0x07,0x07,0x07,0x0b,0x07,0x0c,0x06,0x07,0x0c,0x09,0x07,\r\n0x0c,0x0a,0x0a,0x0b,0x07,0x07,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x08,0x07,0x07,0x0c,0x08,0x07,0x07,0x07,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x0a,0x09,0x08,0x07,0x0a,0x09,0x09,0x07,0x09,0x09,0x0a,0x09,0x08,0x09,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0a,0x09,0x01,\r\n0x01,0x02,0x03,0x02,0x04,0x05,0x0b,0x07,0x08,0x08,0x07,0x08,0x07,0x07,0x08,0x08,0x07,0x04,0x0b,0x08,0x07,0x07,0x07,0x08,0x07,0x08,0x03,0x08,0x07,0x07,0x05,0x0b,0x07,0x07,0x07,0x08,0x0b,0x07,0x08,0x05,0x0b,0x08,0x08,0x09,0x09,0x03,0x04,0x0f,0x0f,0x0f,0x0f,0x13,0x07,0x07,0x03,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x06,0x07,0x08,0x06,0x05,0x07,0x08,0x03,0x04,0x06,0x05,0x0a,0x08,0x08,0x06,0x08,0x06,0x05,0x06,0x08,0x07,0x0a,\r\n0x07,0x06,0x06,0x09,0x0a,0x05,0x08,0x06,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x03,0x03,0x03,0x03,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x07,0x04,0x06,0x05,0x05,\r\n0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x09,0x08,0x07,0x06,0x05,0x07,0x06,0x06,0x08,0x08,0x03,0x06,0x07,0x0a,0x08,0x06,0x08,0x08,0x06,0x06,0x06,0x06,0x08,0x07,0x09,0x08,0x07,\r\n0x06,0x08,0x03,0x08,0x06,0x08,0x03,0x06,0x06,0x07,0x05,0x07,0x05,0x03,0x03,0x04,0x0b,0x0b,0x08,0x06,0x06,0x08,0x07,0x06,0x06,0x05,0x08,0x06,0x0a,0x06,0x08,0x08,0x06,0x07,0x0a,0x08,0x08,0x08,0x06,0x07,0x06,0x06,0x08,0x07,0x08,0x07,0x0a,0x0b,0x07,0x09,0x06,0x07,0x0b,0x06,0x05,0x08,0x08,0x08,0x0c,0x0c,0x09,0x07,0x07,0x05,\r\n0x07,0x07,0x07,0x09,0x07,0x07,0x09,0x08,0x08,0x05,0x08,0x08,0x07,0x06,0x06,0x0c,0x0a,0x06,0x07,0x08,0x08,0x08,0x08,0x09,0x09,0x05,0x0c,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x03,0x0a,0x09,0x09,0x06,0x09,0x03,0x03,0x06,0x06,0x03,0x03,0x08,0x05,0x03,0x0a,0x09,0x04,0x03,0x03,0x06,0x05,0x05,0x03,0x03,0x03,0x05,0x09,0x06,0x04,\r\n0x08,0x09,0x08,0x08,0x06,0x0a,0x07,0x08,0x05,0x06,0x07,0x06,0x03,0x03,0x05,0x07,0x04,0x09,0x09,0x09,0x0c,0x0a,0x0c,0x03,0x00,0x00,0x00,0x00,0x00,0x03,0x0a,0x0b,0x04,0x04,0x07,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x07,0x07,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x07,\r\n0x07,0x0c,0x0c,0x07,0x07,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0d,0x0a,0x0b,0x07,0x08,0x08,0x09,0x04,0x09,0x0a,0x07,0x07,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0c,0x04,0x0a,0x07,0x07,0x03,0x07,0x07,0x07,0x07,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,\r\n0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x11,0x0d,0x11,0x0d,0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x07,0x07,0x0a,0x07,0x07,0x0c,0x07,0x0e,0x0d,0x0c,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0c,0x07,0x0c,0x07,0x0c,\r\n0x07,0x0c,0x07,0x0c,0x07,0x0c,0x07,0x09,0x09,0x09,0x09,0x09,0x04,0x09,0x09,0x04,0x04,0x09,0x04,0x09,0x04,0x09,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0x00,0x0f,0x0b,0x11,0x0d,0x0c,0x07,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x0c,0x04,0x08,0x08,0x07,0x07,\r\n0x05,0x0f,0x0b,0x0d,0x0d,0x0c,0x0c,0x0c,0x08,0x08,0x08,0x08,0x09,0x04,0x09,0x04,0x09,0x04,0x0f,0x0b,0x08,0x09,0x08,0x08,0x08,0x09,0x08,0x08,0x0f,0x0f,0x0b,0x0b,0x05,0x05,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x0a,0x0b,0x04,0x04,0x08,0x08,0x08,0x08,0x0c,0x04,0x0c,0x04,0x08,0x09,\r\n0x08,0x08,0x0f,0x0f,0x0b,0x0b,0x0f,0x0f,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x03,0x03,0x04,0x03,0x00,0x00,0x00,0x0b,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x09,0x09,0x03,0x03,\r\n0x07,0x05,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x08,0x08,0x08,0x09,0x08,0x07,0x08,0x07,0x09,0x0a,0x08,0x0a,0x0b,0x08,0x0a,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x08,0x08,0x09,0x07,0x08,0x07,0x08,0x08,0x07,0x07,0x0a,\r\n0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x09,0x0c,0x0c,0x0a,0x0b,0x0b,0x07,0x0a,0x0b,0x0a,0x08,0x0b,0x0a,0x09,0x09,0x08,0x08,0x0a,0x0a,0x09,0x08,0x09,0x08,0x07,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x09,0x0c,0x0c,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0b,0x0a,0x0b,0x09,0x09,0x08,0x0a,0x09,0x09,0x0b,0x0a,\r\n0x09,0x0c,0x07,0x07,0x07,0x07,0x08,0x08,0x09,0x0a,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x06,0x07,0x07,0x08,0x08,0x0a,0x0b,0x09,0x09,0x08,0x0a,0x08,0x09,0x07,0x06,0x08,0x07,0x06,0x06,0x07,0x07,0x06,0x06,0x08,0x06,0x07,0x06,0x07,0x0a,0x07,0x0b,0x07,0x07,0x07,0x0a,\r\n0x04,0x0a,0x09,0x09,0x09,0x07,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x04,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x08,0x03,0x03,0x03,0x04,0x04,0x03,0x03,0x03,0x04,0x03,0x03,0x03,0x0c,0x0c,0x0c,0x0c,0x06,0x0a,0x09,0x06,0x05,\r\n0x06,0x07,0x07,0x06,0x0b,0x0b,0x0b,0x06,0x0d,0x06,0x0b,0x0b,0x0b,0x0b,0x07,0x06,0x06,0x0a,0x08,0x0a,0x09,0x07,0x06,0x05,0x0d,0x05,0x07,0x06,0x06,0x06,0x06,0x06,0x12,0x0b,0x0b,0x06,0x03,0x06,0x03,0x06,0x03,0x03,0x03,0x06,0x08,0x08,0x07,0x05,0x05,0x03,0x03,0x03,0x05,0x03,0x05,0x0b,0x03,0x0c,0x0c,0x0c,0x08,0x08,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x09,0x0f,0x0f,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x08,0x06,0x07,0x06,0x05,0x05,0x09,0x07,0x09,0x06,0x0f,0x0c,0x08,0x07,0x0c,0x0a,\r\n0x0b,0x0a,0x0d,0x0b,0x0c,0x0a,0x08,0x06,0x09,0x08,0x0c,0x0a,0x0a,0x08,0x0a,0x08,0x0b,0x09,0x0b,0x09,0x0e,0x0b,0x0a,0x08,0x0a,0x08,0x10,0x0c,0x0a,0x00,0x0d,0x0d,0x0d,0x06,0x00,0x00,0x08,0x07,0x09,0x07,0x07,0x06,0x0e,0x0c,0x0c,0x0b,0x09,0x08,0x09,0x08,0x07,0x05,0x0a,0x08,0x07,0x05,0x0b,0x09,0x09,0x07,0x0d,0x0b,0x07,0x07,\r\n0x0a,0x0a,0x0b,0x06,0x03,0x06,0x09,0x06,0x0d,0x0d,0x03,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x05,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x09,0x09,0x04,0x03,0x04,0x03,0x09,0x07,0x0a,0x08,0x07,0x06,0x07,0x06,0x08,0x07,0x05,0x05,0x0f,0x0b,0x0f,0x0c,0x0d,0x0b,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x08,0x06,0x08,\r\n0x06,0x08,0x06,0x08,0x06,0x07,0x04,0x06,0x03,0x0a,0x08,0x0b,0x09,0x11,0x0d,0x07,0x08,0x09,0x09,0x0b,0x0b,0x0a,0x08,0x0d,0x0a,0x07,0x05,0x07,0x06,0x08,0x06,0x0c,0x09,0x08,0x07,0x07,0x08,0x07,0x08,0x06,0x05,0x06,0x05,0x06,0x05,0x07,0x07,0x04,0x09,0x04,0x0c,0x09,0x05,0x08,0x08,0x06,0x0a,0x07,0x05,0x05,0x08,0x08,0x08,0x06,\r\n0x03,0x0a,0x08,0x05,0x05,0x08,0x06,0x09,0x05,0x0a,0x08,0x08,0x06,0x09,0x08,0x08,0x06,0x0a,0x07,0x08,0x05,0x07,0x06,0x0a,0x06,0x07,0x0b,0x06,0x07,0x0c,0x03,0x0f,0x0c,0x0c,0x0f,0x0b,0x0c,0x0c,0x0b,0x0c,0x0c,0x07,0x06,0x08,0x09,0x0c,0x09,0x0c,0x03,0x06,0x08,0x0b,0x0d,0x09,0x0d,0x08,0x08,0x0a,0x09,0x0f,0x0c,0x07,0x0c,0x04,\r\n0x0c,0x04,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0d,0x07,0x07,0x0d,0x0a,0x07,0x07,0x0a,0x09,0x04,0x04,0x09,0x08,0x08,0x08,0x08,0x0a,0x04,0x04,0x0b,0x0a,0x04,0x04,0x0b,0x05,0x05,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x14,0x07,0x05,0x07,0x07,0x0a,0x07,0x08,0x0b,0x09,0x0a,0x0a,0x0b,0x0b,0x08,0x06,0x0d,0x0a,0x0e,0x0b,0x09,0x08,0x04,0x04,0x08,0x08,0x05,0x08,0x07,0x08,0x06,0x0a,0x0a,0x05,0x08,0x06,0x03,0x05,0x07,0x07,0x03,0x03,0x02,0x03,0x05,0x05,0x05,0x06,0x13,0x1a,0x04,0x05,0x02,0x03,0x05,0x06,0x04,0x06,0x07,0x05,0x05,\r\n0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x11,0x07,0x0a,0x0c,0x0c,0x08,0x06,0x07,0x09,0x0a,0x06,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x0a,0x08,0x08,0x07,0x0a,0x08,0x0b,0x06,0x07,0x08,0x04,0x08,0x04,0x05,0x03,0x0b,0x08,0x07,0x07,0x07,0x08,0x0c,0x0c,0x0c,0x0d,0x0d,0x07,0x07,0x04,0x07,0x06,0x08,\r\n0x06,0x09,0x03,0x07,0x08,0x0b,0x0b,0x08,0x07,0x07,0x07,0x07,0x06,0x07,0x06,0x06,0x04,0x04,0x03,0x03,0x05,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x04,0x04,0x04,0x03,0x03,0x16,0x0d,0x0b,0x0e,0x04,0x04,0x04,0x05,0x03,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x00,0x0c,0x04,0x04,0x0c,0x03,0x07,0x07,0x11,0x0d,0x0d,0x11,0x0c,0x07,0x07,0x0c,0x07,0x07,0x05,0x05,0x00,0x00,0x05,0x0a,0x08,0x09,0x08,0x10,0x0d,0x09,0x07,0x09,0x07,0x11,0x0d,0x0a,0x08,0x05,0x04,0x08,0x00,0x09,0x07,0x04,0x04,0x02,0x06,0x04,0x04,0x03,0x03,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x07,0x06,\r\n0x08,0x07,0x07,0x0d,0x0b,0x0a,0x0a,0x0b,0x0c,0x08,0x09,0x08,0x05,0x0c,0x0f,0x06,0x0f,0x07,0x0b,0x0c,0x0c,0x0c,0x05,0x0a,0x0d,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x08,0x08,0x08,0x0b,0x07,0x07,0x0c,0x04,0x04,0x0c,0x04,0x04,0x0c,0x06,0x06,0x00,0x05,0x0b,0x04,0x04,0x0d,\r\n0x07,0x07,0x0a,0x07,0x07,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x14,0x14,0x0b,0x00,0x00,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x08,0x08,0x08,0x0c,0x08,0x08,0x0a,0x0d,0x08,0x08,0x0e,0x08,0x08,0x0c,0x08,0x09,0x0a,0x08,0x0a,\r\n0x0b,0x0c,0x08,0x0a,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0a,0x08,0x09,0x0a,0x08,0x08,0x07,0x0a,0x08,0x08,0x08,0x09,0x06,0x07,0x08,0x0a,0x0a,0x07,0x00,0x00,0x0f,0x1e,0x0a,0x00,0x01,0x04,0x04,0x06,0x09,0x08,0x0c,0x0c,0x03,0x05,0x05,0x06,0x0a,0x03,0x06,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x03,\r\n0x03,0x0a,0x0a,0x0a,0x07,0x0e,0x0a,0x09,0x09,0x0b,0x08,0x07,0x0a,0x0b,0x04,0x05,0x09,0x07,0x0d,0x0b,0x0b,0x08,0x0b,0x09,0x08,0x08,0x0a,0x09,0x0e,0x09,0x08,0x09,0x05,0x06,0x05,0x0a,0x06,0x04,0x08,0x09,0x07,0x09,0x08,0x05,0x09,0x08,0x04,0x04,0x07,0x04,0x0d,0x08,0x09,0x09,0x09,0x05,0x06,0x05,0x08,0x07,0x0b,0x07,0x07,0x07,\r\n0x05,0x04,0x05,0x0a,0x0a,0x0a,0x09,0x08,0x0b,0x0b,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x08,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x06,0x06,0x08,0x08,0x07,0x06,0x07,0x08,0x06,0x0d,0x0d,0x0c,0x04,0x06,0x0a,0x0d,0x0b,0x0c,0x0a,0x0a,0x0a,0x08,0x09,0x08,0x09,0x0b,0x08,0x06,\r\n0x06,0x0b,0x0c,0x09,0x07,0x04,0x04,0x0a,0x0a,0x08,0x0a,0x0a,0x08,0x08,0x0b,0x0a,0x0a,0x0b,0x0e,0x0e,0x08,0x0f,0x06,0x06,0x03,0x03,0x0a,0x09,0x07,0x08,0x03,0x08,0x05,0x05,0x08,0x08,0x06,0x03,0x03,0x06,0x12,0x0a,0x08,0x0a,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x04,0x06,0x05,0x05,0x05,0x03,0x04,0x03,\r\n0x05,0x03,0x06,0x07,0x04,0x08,0x06,0x09,0x07,0x04,0x0b,0x08,0x08,0x07,0x08,0x09,0x0a,0x0a,0x05,0x06,0x06,0x0e,0x0e,0x0e,0x07,0x0a,0x09,0x04,0x08,0x06,0x09,0x07,0x09,0x07,0x09,0x06,0x03,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0b,0x08,0x08,0x08,0x08,0x07,0x04,0x07,0x05,0x07,0x05,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x09,0x05,0x09,0x05,\r\n0x08,0x06,0x08,0x05,0x08,0x07,0x0a,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x07,0x0b,0x0b,0x09,0x09,0x07,0x09,0x07,0x0a,0x06,0x07,0x06,0x11,0x09,0x07,0x09,0x03,0x06,0x0c,0x05,0x09,0x05,0x05,0x09,0x05,0x0a,0x08,0x09,0x07,0x09,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0b,0x08,0x0b,0x08,0x04,0x04,0x04,\r\n0x04,0x04,0x04,0x04,0x04,0x05,0x04,0x09,0x07,0x07,0x07,0x04,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x09,0x05,0x08,0x06,0x08,0x05,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0e,0x0b,0x08,0x07,0x04,0x0a,0x08,0x0d,0x0c,0x0b,0x09,0x03,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x08,0x07,0x03,0x06,0x08,0x09,0x0e,0x0e,0x0e,0x0d,0x06,0x06,\r\n0x03,0x04,0x04,0x0a,0x09,0x0c,0x06,0x0c,0x0a,0x0c,0x04,0x0a,0x09,0x08,0x09,0x0b,0x04,0x09,0x09,0x0d,0x0b,0x08,0x0b,0x0b,0x08,0x08,0x08,0x08,0x09,0x0c,0x0b,0x04,0x08,0x09,0x07,0x09,0x04,0x08,0x08,0x08,0x07,0x09,0x09,0x04,0x08,0x07,0x09,0x08,0x07,0x09,0x09,0x07,0x08,0x08,0x0b,0x0c,0x04,0x08,0x09,0x08,0x0c,0x08,0x0b,0x07,\r\n0x09,0x08,0x04,0x0f,0x0f,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x07,0x0a,0x08,0x0d,0x08,0x0b,0x0b,0x09,0x0a,0x0d,0x0b,0x0b,0x0b,0x08,0x09,0x08,0x09,0x0b,0x09,0x0b,0x0a,0x0e,0x0f,0x0b,0x0c,0x09,0x09,0x0f,0x09,0x08,0x09,0x08,0x06,0x08,0x08,0x0b,0x07,0x09,0x09,0x07,0x08,0x0b,0x09,0x09,0x09,0x09,0x07,0x06,0x07,0x0a,0x07,0x09,\r\n0x08,0x0c,0x0c,0x09,0x0b,0x08,0x07,0x0c,0x08,0x08,0x09,0x06,0x07,0x06,0x04,0x0c,0x0c,0x09,0x07,0x07,0x09,0x07,0x06,0x0f,0x11,0x09,0x05,0x06,0x06,0x06,0x04,0x08,0x06,0x08,0x0b,0x09,0x0b,0x09,0x05,0x05,0x04,0x04,0x07,0x07,0x07,0x07,0x05,0x05,0x05,0x07,0x05,0x07,0x05,0x05,0x05,0x07,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,\r\n0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x08,0x0a,\r\n0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x07,0x08,0x07,0x08,0x07,0x08,0x05,0x08,0x08,0x0b,0x09,0x04,0x05,0x04,0x04,0x08,0x06,0x0e,0x0c,0x09,0x08,0x09,0x07,0x0b,0x09,0x08,0x07,0x08,0x07,0x09,0x07,0x0a,0x08,0x0a,0x08,0x0b,0x08,0x0b,0x09,0x05,0x05,0x05,0x05,0x06,0x06,0x07,0x07,0x07,0x07,0x04,0x04,0x05,\r\n0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x05,0x0a,0x09,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x04,0x04,0x04,0x04,0x09,0x07,0x09,0x07,0x09,0x07,0x07,0x04,0x07,0x04,0x07,\r\n0x04,0x07,0x04,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x09,0x08,0x09,0x09,0x05,0x09,0x05,0x09,0x05,0x09,0x05,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x05,0x08,0x05,0x08,0x05,0x08,0x05,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,\r\n0x08,0x09,0x07,0x09,0x07,0x0e,0x0b,0x0e,0x0b,0x09,0x07,0x09,0x07,0x08,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x0b,0x07,0x08,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,\r\n0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x07,0x07,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,\r\n0x09,0x07,0x07,0x09,0x09,0x04,0x04,0x09,0x09,0x08,0x08,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x06,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x09,0x09,0x08,0x08,0x08,0x08,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,\r\n0x0c,0x0b,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x0b,0x0b,0x09,0x09,0x09,0x08,0x08,0x07,0x0a,0x09,0x0d,0x04,0x04,0x09,0x07,0x04,0x07,0x0d,0x0b,0x09,0x0b,0x0f,0x0c,0x09,0x09,0x09,0x08,0x06,0x08,0x04,0x05,0x08,0x05,0x08,0x0b,0x0b,0x09,\r\n0x08,0x09,0x07,0x09,0x09,0x07,0x06,0x08,0x08,0x06,0x06,0x08,0x04,0x06,0x07,0x04,0x13,0x11,0x0f,0x0d,0x0b,0x08,0x10,0x0f,0x0c,0x0a,0x08,0x04,0x04,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x0a,0x08,0x0a,0x08,0x0d,0x0c,0x0a,0x09,0x0a,0x09,0x09,0x07,0x0b,0x09,0x0b,0x09,0x09,0x07,0x04,0x13,0x11,0x0f,\r\n0x0a,0x09,0x0f,0x0a,0x0b,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0b,0x09,0x0b,0x09,0x09,0x05,0x09,0x05,0x0a,0x08,0x0a,0x08,0x08,0x06,0x0b,0x08,0x0b,0x09,0x09,0x09,0x07,0x0a,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x07,0x09,0x08,0x08,0x08,0x09,0x08,0x09,0x09,0x09,0x07,0x07,0x09,0x09,\r\n0x08,0x09,0x06,0x06,0x08,0x08,0x04,0x09,0x09,0x08,0x07,0x07,0x08,0x08,0x08,0x04,0x04,0x05,0x04,0x06,0x04,0x09,0x0d,0x0d,0x0d,0x08,0x08,0x09,0x09,0x0a,0x0b,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x06,0x04,0x04,0x04,0x04,0x05,0x05,0x09,0x09,0x08,0x07,0x0b,0x07,0x06,0x07,0x08,0x07,0x07,0x05,0x05,0x05,0x07,0x09,\r\n0x07,0x08,0x08,0x08,0x04,0x07,0x06,0x09,0x05,0x05,0x0e,0x0e,0x0f,0x09,0x07,0x0b,0x0c,0x09,0x09,0x07,0x07,0x08,0x09,0x08,0x0a,0x08,0x0a,0x0c,0x09,0x0b,0x09,0x09,0x07,0x07,0x07,0x09,0x08,0x09,0x07,0x0d,0x0d,0x09,0x08,0x0a,0x08,0x09,0x07,0x09,0x07,0x0a,0x09,0x08,0x06,0x09,0x09,0x07,0x04,0x0b,0x07,0x07,0x0d,0x0a,0x0a,0x09,\r\n0x0e,0x0b,0x0a,0x07,0x0d,0x0a,0x0b,0x08,0x0e,0x0b,0x08,0x07,0x0c,0x0b,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x14,0x11,0x0c,0x0a,0x11,0x0d,0x0d,0x0a,0x09,0x07,0x08,0x06,0x06,0x00,0x00,0x0f,0x0e,0x09,0x08,0x08,0x09,0x09,0x08,0x08,0x07,0x09,0x07,0x0b,0x09,0x0d,0x0a,0x0f,0x0d,0x0b,0x08,0x09,0x07,0x08,0x06,0x0d,0x0a,0x0a,0x09,0x0d,\r\n0x0a,0x0d,0x0a,0x04,0x0d,0x0b,0x09,0x08,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0d,0x0c,0x08,0x08,0x0b,0x08,0x0b,0x08,0x0d,0x0b,0x08,0x07,0x08,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x0a,0x08,0x0c,0x0b,0x09,0x09,0x0d,0x0d,0x0c,0x0b,0x08,0x07,0x0e,0x0c,0x0f,0x0d,0x0b,0x08,\r\n0x0a,0x09,0x09,0x08,0x08,0x08,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x09,0x05,0x05,0x02,0x03,0x03,0x03,0x04,0x06,0x04,0x03,0x06,0x03,0x03,0x03,0x05,0x05,0x03,0x03,0x09,0x09,0x09,0x09,0x05,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x04,\r\n0x02,0x04,0x04,0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,\r\n0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,\r\n0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x09,0x05,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x08,0x09,0x07,0x0a,0x0c,0x07,0x07,0x08,0x08,0x06,0x06,0x04,0x04,0x07,0x06,0x0b,0x09,0x09,0x07,0x09,0x09,0x09,0x0e,0x08,0x09,0x09,0x07,0x07,0x07,0x06,0x08,0x09,0x0b,0x09,0x07,0x0b,0x07,0x06,0x06,0x08,0x06,0x07,0x09,0x07,0x09,0x08,0x05,0x07,0x05,0x05,0x06,0x05,0x05,0x06,0x06,0x03,0x03,0x05,0x04,0x08,0x07,0x07,\r\n0x06,0x06,0x05,0x05,0x04,0x06,0x08,0x05,0x05,0x05,0x07,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x02,0x05,0x07,0x05,0x05,0x04,0x05,0x05,0x05,0x03,0x05,0x05,0x07,0x04,0x05,0x05,0x04,0x05,0x06,0x04,0x02,0x03,0x05,0x04,0x05,0x04,0x05,0x06,0x04,0x09,0x02,0x05,0x08,0x0d,0x09,0x08,0x08,0x0d,0x0a,0x0d,0x0b,0x08,0x09,0x08,0x07,0x11,\r\n0x07,0x09,0x0d,0x0e,0x0e,0x09,0x0a,0x09,0x07,0x07,0x08,0x06,0x07,0x08,0x03,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x07,0x06,0x09,0x09,0x05,0x0d,0x08,0x09,0x05,0x05,0x07,0x05,0x07,0x09,0x07,0x09,0x0e,0x0a,0x05,0x04,0x09,0x08,0x09,0x09,0x09,0x05,0x09,0x07,0x04,0x0d,0x08,0x09,0x05,0x06,0x06,0x07,0x07,0x07,0x08,0x09,0x09,\r\n0x08,0x07,0x07,0x0b,0x04,0x07,0x04,0x08,0x07,0x05,0x04,0x04,0x05,0x04,0x03,0x02,0x05,0x05,0x02,0x03,0x03,0x03,0x02,0x03,0x02,0x03,0x07,0x07,0x05,0x05,0x05,0x05,0x06,0x03,0x02,0x03,0x05,0x05,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x05,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x04,0x05,0x08,0x08,0x08,0x08,0x05,0x00,0x00,0x00,\r\n0x00,0x07,0x05,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x08,0x08,0x08,0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0x06,0x06,0x05,0x06,0x05,0x06,0x06,0x06,\r\n0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x05,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0e,0x0b,0x08,0x06,0x08,0x0a,0x08,0x0c,0x0b,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0f,0x06,0x04,0x08,0x09,0x06,0x08,0x08,\r\n0x09,0x09,0x08,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x0a,0x08,0x08,0x08,0x05,0x09,0x05,0x0b,0x0a,0x08,0x05,0x0d,0x08,0x0d,0x04,0x05,0x09,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0d,0x04,0x09,0x04,0x08,0x06,0x04,0x04,0x08,0x04,0x0b,0x04,0x0e,0x08,0x0e,0x0e,0x09,0x09,0x09,0x08,0x08,0x06,0x06,0x12,0x12,0x14,0x14,0x0d,\r\n0x0d,0x08,0x08,0x03,0x0f,0x0b,0x0d,0x0a,0x09,0x0a,0x08,0x08,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x0a,0x00,0x0a,0x0a,0x0a,0x05,0x08,0x08,0x0e,0x05,0x0e,0x05,0x09,0x0a,0x09,0x06,0x0e,0x08,0x0e,0x08,0x0b,0x0d,0x05,0x08,0x08,0x06,0x04,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0a,0x0a,0x0e,0x05,0x08,\r\n0x06,0x0a,0x08,0x05,0x08,0x08,0x08,0x0e,0x05,0x0e,0x05,0x04,0x09,0x06,0x0f,0x08,0x08,0x0a,0x0a,0x0f,0x08,0x00,0x00,0x00,0x0a,0x00,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x08,0x0b,0x0d,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x08,0x06,0x06,0x06,0x12,0x0d,0x12,0x0d,0x12,0x0d,0x14,0x0f,0x14,0x0f,0x0d,0x08,0x09,0x09,0x09,0x0f,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0b,0x0b,0x10,0x0f,0x0e,0x08,0x0d,0x08,0x0d,\r\n0x08,0x0d,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x0a,0x05,0x0a,0x05,0x08,0x0a,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0e,0x0b,0x0d,0x05,0x08,0x0b,0x0d,0x0b,0x0d,0x00,0x00,0x00,0x00,0x00,0x11,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x06,\r\n0x00,0x00,0x09,0x00,0x00,0x00,0x12,0x0d,0x14,0x0f,0x08,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x0e,0x0e,0x06,0x09,0x09,0x09,0x12,0x0c,0x08,0x17,0x10,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x06,0x06,0x0b,0x0a,0x0a,0x08,0x00,0x00,\r\n0x00,0x05,0x05,0x05,0x05,0x13,0x17,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x0a,0x09,0x08,0x08,0x06,0x12,0x0d,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0e,\r\n0x08,0x08,0x0e,0x08,0x08,0x0e,0x08,0x08,0x09,0x09,0x09,0x09,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x0a,0x05,0x05,0x06,0x06,0x12,0x0d,0x0a,0x09,0x09,0x00,0x08,0x08,0x08,0x06,0x09,0x0a,0x09,0x08,0x08,0x05,0x04,0x0b,0x09,0x09,0x05,0x08,0x07,0x07,0x07,0x07,0x04,0x08,0x06,0x09,0x07,0x09,0x07,0x08,0x07,0x0a,0x08,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x07,0x07,0x04,0x08,0x08,0x09,0x08,0x05,0x0b,0x09,0x0a,0x08,0x09,0x07,0x09,0x08,0x06,0x0a,0x06,0x06,0x06,0x07,0x09,0x09,0x08,0x0f,0x08,0x0f,0x05,0x04,0x03,0x08,0x03,0x02,0x00,0x02,0x03,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0e,0x06,0x0b,\r\n0x09,0x0e,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0d,0x07,0x0d,0x07,0x0d,0x0a,0x0a,0x0b,0x0a,0x0b,0x0d,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0b,0x09,0x10,0x0c,0x07,0x07,0x04,0x04,0x04,0x06,0x03,0x08,0x03,0x03,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x0a,0x09,0x07,0x07,0x0a,0x04,0x05,0x0a,0x0a,0x04,0x08,0x08,0x08,0x0a,0x0a,0x04,0x06,0x0a,0x09,0x09,0x09,0x08,0x09,0x0a,0x08,0x0c,0x0b,0x08,0x08,0x08,0x03,0x06,0x08,0x08,0x08,0x08,0x08,0x09,0x0a,0x07,0x0a,0x08,0x08,0x0a,0x08,0x0b,0x08,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,\r\n0x09,0x07,0x07,0x0a,0x05,0x05,0x0a,0x05,0x08,0x08,0x08,0x0a,0x06,0x0a,0x09,0x09,0x09,0x0a,0x08,0x0c,0x0b,0x04,0x09,0x08,0x09,0x0a,0x12,0x00,0x0a,0x08,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x06,0x04,0x00,0x0b,0x0a,0x0a,0x0b,0x08,0x0a,0x0b,0x0b,0x07,0x09,0x0b,0x0b,0x0a,0x0b,0x0c,0x0c,0x0a,0x08,0x08,0x0b,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x09,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x0a,0x0a,0x0c,0x07,0x09,0x09,0x0d,0x08,0x08,0x0c,0x0d,0x09,0x08,0x10,0x09,0x09,0x0b,0x08,0x08,0x0b,0x08,0x0b,0x0c,0x0d,0x08,\r\n0x0c,0x08,0x0a,0x08,0x09,0x09,0x09,0x08,0x09,0x0c,0x08,0x09,0x0a,0x08,0x08,0x09,0x0e,0x08,0x08,0x09,0x09,0x06,0x05,0x08,0x08,0x08,0x08,0x08,0x0d,0x08,0x0d,0x07,0x08,0x0d,0x0a,0x08,0x0d,0x0b,0x0b,0x0d,0x09,0x08,0x0d,0x0d,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x09,0x08,0x09,0x0d,0x09,0x08,0x08,0x08,0x0d,0x0c,0x0a,0x0a,\r\n0x0a,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0a,0x08,0x0c,0x0a,0x0a,0x09,0x0a,0x0a,0x0b,0x0b,0x09,0x0a,0x0a,0x0b,0x0a,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0a,0x0b,0x0c,0x0a,0x0b,0x0b,0x01,0x02,0x02,0x03,0x02,0x04,0x05,0x0d,0x08,0x09,0x09,0x08,0x09,0x08,0x08,0x0a,0x09,0x08,0x05,0x0d,0x09,0x08,0x08,0x08,0x09,0x08,0x09,0x04,0x09,\r\n0x08,0x08,0x06,0x0d,0x08,0x08,0x08,0x09,0x0c,0x08,0x09,0x06,0x0c,0x09,0x09,0x0a,0x0a,0x03,0x04,0x11,0x11,0x11,0x11,0x15,0x08,0x08,0x04,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x07,0x08,0x09,0x06,0x06,0x09,0x09,0x04,0x05,0x07,0x06,0x0b,0x0a,0x09,0x07,0x09,0x07,0x06,0x07,0x09,0x08,0x0c,0x08,0x07,0x07,0x0b,0x0c,0x06,0x09,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x06,0x06,0x04,0x04,0x04,0x04,0x0a,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x08,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x08,0x05,0x07,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x07,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,\r\n0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x0b,0x09,0x08,0x07,0x06,0x08,0x06,0x07,0x09,0x09,0x04,0x07,0x08,0x0b,0x0a,0x07,0x09,0x09,0x07,0x07,0x07,0x07,0x09,0x08,0x0a,0x0a,0x08,0x06,0x09,0x04,0x09,0x07,0x0a,0x04,0x07,0x06,0x09,0x06,0x08,0x06,0x04,0x04,0x05,0x0c,0x0c,0x09,0x07,0x07,0x09,0x08,0x07,0x07,0x06,0x09,0x06,\r\n0x0b,0x07,0x0a,0x0a,0x07,0x09,0x0b,0x09,0x09,0x09,0x07,0x08,0x07,0x07,0x09,0x08,0x0a,0x08,0x0c,0x0c,0x09,0x0b,0x07,0x08,0x0d,0x07,0x06,0x09,0x09,0x09,0x0d,0x0d,0x0a,0x08,0x09,0x06,0x09,0x08,0x08,0x0b,0x08,0x08,0x0a,0x09,0x09,0x05,0x09,0x09,0x09,0x07,0x07,0x0d,0x0b,0x07,0x08,0x09,0x09,0x09,0x09,0x0b,0x0a,0x05,0x0e,0x09,\r\n0x08,0x09,0x0a,0x0a,0x08,0x08,0x04,0x0b,0x0a,0x0a,0x07,0x0b,0x03,0x03,0x07,0x07,0x03,0x03,0x09,0x06,0x04,0x0b,0x0b,0x04,0x03,0x03,0x07,0x06,0x06,0x03,0x03,0x03,0x06,0x0a,0x07,0x05,0x09,0x0a,0x09,0x09,0x07,0x0b,0x08,0x09,0x05,0x07,0x08,0x06,0x03,0x03,0x06,0x08,0x05,0x0a,0x0a,0x0a,0x0e,0x0b,0x0e,0x04,0x00,0x00,0x00,0x00,\r\n0x00,0x04,0x0b,0x0d,0x05,0x05,0x08,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x08,0x08,0x12,0x0d,0x12,0x0d,0x14,0x0f,0x14,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x08,0x08,0x0e,0x0e,0x08,0x08,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0f,0x0b,0x0d,0x08,0x09,0x09,0x0a,0x05,0x0a,0x0b,0x08,\r\n0x08,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e,0x05,0x0b,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x12,0x0d,0x12,0x0d,0x12,0x0d,\r\n0x14,0x0f,0x14,0x0f,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0b,0x08,0x08,0x0b,0x08,0x08,0x0e,0x08,0x10,0x0f,0x0e,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x0a,0x0a,0x05,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x08,0x09,0x08,0x08,0x08,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x00,0x12,0x0d,0x14,0x0f,0x0e,0x08,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x0e,0x05,0x09,0x09,0x08,0x08,0x06,0x12,0x0d,0x0f,0x0f,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x09,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x12,0x0d,0x09,0x0a,0x09,0x09,0x09,0x0a,0x09,0x09,\r\n0x12,0x12,0x0d,0x0d,0x06,0x06,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x0b,0x0d,0x05,0x05,0x09,0x09,0x09,0x09,0x0e,0x05,0x0e,0x05,0x09,0x0a,0x09,0x09,0x12,0x12,0x0d,0x0d,0x12,0x12,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x05,0x04,\r\n0x00,0x00,0x00,0x0d,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0d,0x09,0x0d,0x09,0x0d,0x09,0x0d,0x0a,0x0a,0x0a,0x04,0x04,0x08,0x06,0x09,0x0a,0x09,0x08,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x09,0x09,0x09,0x0a,\r\n0x09,0x08,0x0a,0x08,0x0a,0x0b,0x0a,0x0b,0x0c,0x0a,0x0b,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x09,0x09,0x0a,0x09,0x0a,0x09,0x09,0x09,0x08,0x08,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0b,0x0c,0x0b,0x0b,0x0e,0x0e,0x0b,0x0e,0x0e,0x0b,0x0d,0x0d,0x08,0x0c,0x0d,0x0b,0x09,0x0d,0x0b,0x0a,0x0b,\r\n0x09,0x0a,0x0b,0x0c,0x0a,0x09,0x0b,0x09,0x08,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0a,0x0e,0x0e,0x0b,0x0c,0x0c,0x0b,0x0b,0x0b,0x0a,0x0d,0x0b,0x0c,0x0b,0x0b,0x09,0x0b,0x0a,0x0a,0x0d,0x0b,0x0b,0x0d,0x08,0x08,0x08,0x08,0x09,0x09,0x0a,0x0b,0x09,0x09,0x08,0x08,0x09,0x08,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x08,0x08,0x09,0x09,0x09,\r\n0x09,0x07,0x08,0x08,0x09,0x09,0x0b,0x0d,0x0a,0x0a,0x09,0x0c,0x0a,0x0a,0x08,0x07,0x09,0x08,0x07,0x07,0x08,0x08,0x07,0x07,0x09,0x07,0x08,0x07,0x08,0x0c,0x08,0x0c,0x08,0x08,0x09,0x0b,0x05,0x0c,0x0a,0x0b,0x0a,0x08,0x0b,0x09,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,\r\n0x07,0x07,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x04,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0e,0x0e,0x0e,0x0e,0x07,0x0b,0x0b,0x07,0x06,0x07,0x08,0x08,0x07,0x0d,0x0c,0x0d,0x07,0x0f,0x07,0x0d,0x0d,0x0d,0x0c,0x08,0x07,0x07,0x0c,0x09,0x0c,0x0a,0x08,0x07,0x06,0x0f,0x06,0x08,0x07,\r\n0x07,0x07,0x07,0x07,0x14,0x0d,0x0d,0x06,0x04,0x07,0x04,0x07,0x04,0x04,0x04,0x07,0x09,0x09,0x08,0x06,0x06,0x03,0x03,0x03,0x06,0x03,0x06,0x0d,0x03,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x12,0x12,0x0a,0x12,0x12,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x07,0x09,0x07,0x08,0x06,0x05,0x05,0x0a,0x08,0x0b,0x06,0x11,0x0d,0x09,0x08,0x0e,0x0c,0x0d,0x0b,0x0f,0x0c,0x0e,0x0c,0x0a,0x07,0x0b,0x09,0x0e,0x0b,0x0b,0x09,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x11,0x0d,0x0b,0x09,0x0b,0x09,0x12,0x0d,\r\n0x0c,0x00,0x0f,0x0f,0x0f,0x07,0x00,0x00,0x09,0x08,0x0a,0x08,0x08,0x06,0x10,0x0e,0x0e,0x0d,0x0b,0x09,0x0a,0x09,0x08,0x06,0x0b,0x09,0x08,0x06,0x0c,0x0a,0x0a,0x08,0x0f,0x0c,0x08,0x09,0x0b,0x0b,0x0c,0x07,0x03,0x07,0x0a,0x06,0x0f,0x0f,0x04,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x06,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x07,0x07,0x0a,0x0b,0x04,0x03,0x04,0x03,0x0b,0x08,0x0b,0x09,0x08,0x07,0x08,0x07,0x09,0x09,0x06,0x06,0x11,0x0c,0x11,0x0d,0x0f,0x0d,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x07,0x04,0x0b,0x09,0x0d,0x0a,0x14,0x0f,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0b,0x09,0x0f,0x0c,0x08,0x06,0x08,\r\n0x07,0x09,0x07,0x0e,0x0b,0x09,0x08,0x08,0x09,0x08,0x09,0x07,0x06,0x07,0x06,0x07,0x06,0x08,0x08,0x05,0x0a,0x05,0x0e,0x0a,0x05,0x09,0x09,0x07,0x0b,0x08,0x06,0x05,0x09,0x09,0x09,0x07,0x04,0x0b,0x09,0x06,0x05,0x09,0x07,0x0b,0x06,0x0c,0x09,0x09,0x07,0x0a,0x09,0x09,0x07,0x0b,0x08,0x09,0x05,0x08,0x06,0x0b,0x06,0x08,0x0d,0x07,\r\n0x08,0x0d,0x04,0x11,0x0d,0x0d,0x12,0x0d,0x0e,0x0e,0x0d,0x0d,0x0e,0x08,0x07,0x09,0x0b,0x0d,0x0b,0x0e,0x04,0x07,0x09,0x0d,0x0f,0x0b,0x0f,0x09,0x09,0x0c,0x0b,0x11,0x0e,0x08,0x0e,0x05,0x0e,0x05,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0f,0x08,0x08,0x0f,0x0b,0x08,0x08,0x0b,0x0a,0x05,0x05,0x0a,0x09,0x09,0x09,0x09,0x0b,0x05,\r\n0x05,0x0d,0x0b,0x05,0x05,0x0d,0x06,0x06,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x08,0x06,0x08,0x08,0x0b,0x09,0x09,0x0d,0x0a,0x0b,0x0b,0x0c,0x0c,0x09,0x07,0x0f,0x0c,0x10,0x0d,0x0a,0x09,0x05,0x05,0x09,\r\n0x0a,0x06,0x09,0x08,0x09,0x07,0x0b,0x0c,0x06,0x09,0x06,0x03,0x06,0x08,0x08,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x07,0x16,0x1e,0x05,0x06,0x02,0x04,0x06,0x06,0x05,0x07,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x14,0x08,0x0b,0x0e,0x0d,0x0a,0x07,0x08,0x0b,0x0b,0x07,0x05,0x0a,0x08,0x0a,\r\n0x08,0x0a,0x08,0x08,0x0b,0x09,0x09,0x08,0x0b,0x09,0x0c,0x07,0x08,0x0a,0x05,0x09,0x05,0x05,0x04,0x0d,0x09,0x08,0x08,0x08,0x09,0x0e,0x0e,0x0e,0x0f,0x0f,0x08,0x08,0x04,0x08,0x07,0x09,0x07,0x0a,0x04,0x08,0x09,0x0d,0x0d,0x09,0x08,0x09,0x08,0x08,0x07,0x08,0x07,0x07,0x05,0x05,0x04,0x03,0x05,0x09,0x0a,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x05,0x00,0x04,0x04,0x04,0x04,0x04,0x19,0x0f,0x0d,0x10,0x04,0x04,0x05,0x06,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x0e,0x05,0x05,0x0e,0x04,0x08,0x08,0x14,0x0f,0x0f,0x14,0x0e,0x08,0x08,0x0e,0x08,0x08,0x06,0x06,0x00,0x00,0x05,0x0b,0x09,0x0b,0x09,\r\n0x13,0x10,0x0a,0x08,0x0b,0x08,0x14,0x0f,0x0b,0x09,0x06,0x05,0x09,0x00,0x0a,0x08,0x05,0x05,0x02,0x07,0x05,0x05,0x04,0x03,0x07,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x08,0x06,0x09,0x09,0x08,0x0e,0x0c,0x0c,0x0c,0x0c,0x0e,0x09,0x0a,0x09,0x06,0x0e,0x11,0x07,0x11,0x08,0x0d,0x0e,0x0e,0x0e,0x06,0x0b,0x0f,0x0b,0x0a,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0x09,0x09,0x0d,0x08,0x08,0x0e,0x05,0x05,0x0e,0x05,0x05,0x0e,0x07,0x07,0x00,0x06,0x0d,0x05,0x05,0x0f,0x08,0x08,0x0b,0x08,0x08,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x17,0x17,0x0d,0x00,0x00,0x0d,0x0d,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x09,0x0a,0x0a,0x0d,0x0a,0x09,0x0c,0x0f,0x0a,0x09,0x10,0x0a,0x0a,0x0e,0x09,0x0a,0x0c,0x0a,0x0c,0x0d,0x0e,0x0a,0x0c,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x09,0x0c,0x09,0x0a,0x0c,0x09,0x09,0x09,0x0c,0x0a,0x0a,0x0a,0x0a,0x07,0x08,0x0a,0x0c,\r\n0x0c,0x08,0x00,0x00,0x10,0x20,0x0a,0x00,0x02,0x04,0x05,0x06,0x09,0x09,0x0d,0x0d,0x04,0x05,0x05,0x07,0x0b,0x03,0x06,0x03,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x03,0x03,0x0b,0x0b,0x0b,0x07,0x0f,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x0b,0x0b,0x04,0x06,0x09,0x08,0x0e,0x0c,0x0c,0x09,0x0c,0x0a,0x09,0x08,0x0b,0x0a,\r\n0x0f,0x09,0x09,0x09,0x05,0x06,0x05,0x0b,0x07,0x04,0x08,0x09,0x07,0x09,0x08,0x05,0x09,0x09,0x04,0x04,0x08,0x04,0x0e,0x09,0x09,0x09,0x09,0x06,0x07,0x05,0x09,0x08,0x0c,0x07,0x08,0x07,0x05,0x04,0x05,0x0b,0x0a,0x0a,0x0a,0x08,0x0c,0x0c,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x09,0x09,0x07,0x07,0x07,0x09,0x06,0x0e,0x0e,0x0c,0x05,0x07,0x0b,0x0e,0x0c,0x0d,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x0c,0x09,0x06,0x07,0x0c,0x0d,0x09,0x07,0x04,0x05,0x0b,0x0a,0x09,0x0b,0x0a,0x08,0x08,0x0c,0x0a,0x0a,0x0c,0x0f,0x0f,0x08,0x10,0x06,0x06,0x04,0x04,0x0b,0x09,\r\n0x08,0x09,0x03,0x09,0x05,0x05,0x09,0x09,0x06,0x03,0x04,0x06,0x13,0x0a,0x08,0x0a,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x04,0x06,0x05,0x05,0x05,0x03,0x04,0x03,0x05,0x03,0x06,0x08,0x04,0x09,0x07,0x09,0x07,0x04,0x0b,0x09,0x09,0x08,0x09,0x09,0x0b,0x0b,0x06,0x06,0x06,0x0f,0x0f,0x0f,0x08,0x0b,0x09,0x04,\r\n0x09,0x07,0x0a,0x07,0x0a,0x07,0x09,0x07,0x03,0x0a,0x08,0x0a,0x08,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x04,0x08,0x05,0x08,0x05,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x06,0x0a,0x06,0x09,0x07,0x08,0x05,0x08,0x07,0x0b,0x09,0x0b,0x09,0x09,0x07,0x09,0x07,0x08,0x0c,0x0c,0x0a,0x09,0x07,0x09,0x08,0x0b,0x07,0x08,0x06,0x12,0x0a,\r\n0x08,0x0a,0x04,0x06,0x0d,0x05,0x0a,0x06,0x06,0x0a,0x06,0x0a,0x08,0x0a,0x07,0x0a,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x09,0x08,0x08,0x08,0x04,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x06,0x09,0x07,0x08,0x05,0x0b,0x09,\r\n0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0f,0x0c,0x09,0x08,0x04,0x0a,0x08,0x0e,0x0d,0x0c,0x09,0x03,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x09,0x08,0x04,0x07,0x09,0x0a,0x0f,0x0f,0x0f,0x0e,0x06,0x06,0x03,0x04,0x04,0x0a,0x09,0x0c,0x06,0x0d,0x0b,0x0d,0x04,0x0a,0x09,0x08,0x09,0x0b,0x04,0x09,0x0a,0x0e,0x0c,0x08,0x0c,0x0b,0x09,0x08,0x08,0x09,\r\n0x09,0x0c,0x0c,0x04,0x09,0x0a,0x07,0x09,0x04,0x09,0x09,0x08,0x07,0x09,0x09,0x04,0x08,0x08,0x09,0x08,0x07,0x09,0x09,0x07,0x09,0x09,0x0c,0x0d,0x04,0x09,0x09,0x09,0x0d,0x08,0x0b,0x08,0x0a,0x09,0x04,0x10,0x10,0x0c,0x09,0x09,0x0b,0x0a,0x09,0x09,0x08,0x0b,0x08,0x0e,0x09,0x0c,0x0c,0x09,0x0b,0x0e,0x0b,0x0c,0x0b,0x09,0x0a,0x08,\r\n0x09,0x0c,0x09,0x0c,0x0b,0x0f,0x10,0x0b,0x0d,0x09,0x0a,0x10,0x09,0x08,0x09,0x08,0x06,0x09,0x08,0x0c,0x07,0x09,0x09,0x08,0x08,0x0b,0x09,0x09,0x09,0x09,0x07,0x07,0x08,0x0b,0x07,0x0a,0x09,0x0d,0x0d,0x09,0x0b,0x08,0x07,0x0d,0x08,0x08,0x09,0x06,0x07,0x07,0x04,0x0d,0x0d,0x09,0x08,0x08,0x09,0x08,0x06,0x10,0x12,0x0a,0x06,0x06,\r\n0x06,0x06,0x04,0x09,0x07,0x09,0x0c,0x0a,0x0b,0x09,0x05,0x05,0x04,0x04,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x08,0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x08,0x09,0x08,0x09,0x08,0x08,0x05,0x08,0x08,0x0c,0x09,0x04,0x06,0x04,0x04,0x08,\r\n0x07,0x0f,0x0c,0x0a,0x08,0x09,0x08,0x0c,0x0a,0x09,0x08,0x09,0x08,0x0a,0x08,0x0a,0x09,0x0b,0x09,0x0c,0x08,0x0c,0x09,0x05,0x05,0x05,0x05,0x07,0x07,0x08,0x08,0x08,0x08,0x04,0x04,0x05,0x05,0x05,0x05,0x08,0x08,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x08,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x04,0x04,0x04,0x04,0x09,0x08,0x09,0x08,0x09,0x08,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x09,0x09,0x09,\r\n0x09,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x08,0x05,0x08,0x05,0x08,0x05,0x08,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0f,0x0c,0x0f,0x0c,0x09,0x07,0x09,0x07,0x09,0x08,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x05,0x0c,0x08,0x08,0x04,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x07,0x07,0x09,0x09,0x04,0x04,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x09,0x09,0x09,0x04,\r\n0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0a,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x09,0x09,0x09,0x09,0x0a,0x0a,0x07,0x0b,\r\n0x0c,0x09,0x09,0x09,0x08,0x09,0x08,0x0b,0x0a,0x0e,0x05,0x04,0x09,0x08,0x04,0x08,0x0e,0x0c,0x09,0x0c,0x10,0x0d,0x0a,0x09,0x09,0x09,0x07,0x08,0x05,0x05,0x08,0x05,0x08,0x0c,0x0b,0x09,0x08,0x09,0x07,0x0a,0x0a,0x07,0x07,0x09,0x09,0x06,0x06,0x09,0x04,0x06,0x07,0x05,0x14,0x12,0x10,0x0e,0x0c,0x08,0x11,0x0f,0x0d,0x0a,0x08,0x04,\r\n0x04,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x08,0x0a,0x08,0x0a,0x08,0x0e,0x0d,0x0b,0x09,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0c,0x09,0x0a,0x07,0x04,0x14,0x12,0x10,0x0b,0x09,0x10,0x0b,0x0c,0x09,0x0a,0x08,0x0a,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x0c,0x09,0x0c,0x09,0x09,0x06,0x0a,0x06,0x0b,0x09,\r\n0x0b,0x09,0x08,0x07,0x0b,0x09,0x0c,0x09,0x09,0x09,0x07,0x0a,0x08,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x09,0x08,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x07,0x07,0x09,0x09,0x08,0x0a,0x07,0x07,0x08,0x09,0x04,0x09,0x09,0x08,0x08,0x07,0x09,0x09,0x09,0x04,0x04,0x05,0x04,0x06,0x04,0x0a,0x0e,0x0e,0x0e,0x09,0x09,0x09,\r\n0x09,0x0b,0x0c,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x07,0x07,0x06,0x04,0x04,0x05,0x05,0x05,0x05,0x0a,0x0a,0x09,0x08,0x0c,0x08,0x07,0x07,0x08,0x07,0x07,0x06,0x06,0x06,0x07,0x0a,0x08,0x09,0x08,0x09,0x04,0x08,0x06,0x09,0x06,0x06,0x0f,0x0f,0x10,0x0a,0x08,0x0b,0x0d,0x09,0x09,0x08,0x08,0x09,0x09,0x09,0x0b,0x09,0x0a,0x0d,\r\n0x09,0x0b,0x09,0x09,0x07,0x08,0x07,0x0a,0x08,0x0a,0x08,0x0e,0x0e,0x0a,0x08,0x0a,0x09,0x0a,0x07,0x0a,0x08,0x0b,0x09,0x09,0x07,0x09,0x09,0x07,0x04,0x0c,0x07,0x07,0x0e,0x0b,0x0a,0x09,0x0f,0x0b,0x0b,0x08,0x0e,0x0b,0x0c,0x09,0x0f,0x0c,0x09,0x07,0x0d,0x0c,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x15,0x12,0x0d,0x0a,0x12,0x0e,0x0e,0x0b,\r\n0x09,0x07,0x08,0x06,0x07,0x00,0x00,0x10,0x0f,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x07,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x10,0x0d,0x0c,0x09,0x0a,0x07,0x08,0x07,0x0e,0x0b,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x04,0x0e,0x0c,0x09,0x08,0x0b,0x09,0x0a,0x09,0x0a,0x08,0x0a,0x08,0x0e,0x0d,0x08,0x08,0x0c,0x08,0x0c,0x08,0x0e,0x0c,0x09,0x07,\r\n0x08,0x07,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0c,0x09,0x0a,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x0b,0x09,0x0d,0x0b,0x09,0x09,0x0e,0x0e,0x0d,0x0c,0x09,0x08,0x0e,0x0d,0x10,0x0e,0x0b,0x08,0x0b,0x0a,0x09,0x09,0x09,0x08,0x09,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x09,0x05,0x05,0x03,0x03,\r\n0x03,0x03,0x04,0x06,0x04,0x04,0x06,0x04,0x04,0x04,0x05,0x05,0x03,0x03,0x09,0x09,0x09,0x09,0x05,0x05,0x04,0x05,0x05,0x04,0x05,0x04,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x03,0x04,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x05,0x07,0x05,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,\r\n0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x00,\r\n0x00,0x00,0x00,0x00,0x0a,0x05,0x0a,0x05,0x09,0x09,0x05,0x05,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,0x08,0x0b,0x0d,0x08,0x07,0x09,0x09,0x07,0x07,0x04,0x05,0x08,0x06,0x0b,0x09,0x09,0x08,0x0a,0x0a,0x0a,0x0f,0x09,0x0a,0x0a,\r\n0x07,0x07,0x07,0x07,0x09,0x09,0x0b,0x09,0x08,0x0c,0x07,0x07,0x07,0x08,0x06,0x08,0x09,0x07,0x09,0x09,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x07,0x07,0x03,0x04,0x06,0x05,0x08,0x07,0x07,0x07,0x06,0x05,0x06,0x05,0x07,0x08,0x05,0x05,0x06,0x08,0x06,0x06,0x05,0x05,0x04,0x04,0x06,0x03,0x05,0x08,0x05,0x05,0x04,0x05,0x05,0x05,0x03,\r\n0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x03,0x03,0x05,0x05,0x05,0x05,0x06,0x07,0x05,0x09,0x03,0x06,0x09,0x0e,0x0a,0x09,0x09,0x0e,0x0a,0x0e,0x0c,0x08,0x09,0x08,0x07,0x12,0x07,0x09,0x0e,0x0f,0x0f,0x0a,0x0a,0x0a,0x07,0x08,0x08,0x07,0x07,0x08,0x03,0x00,0x00,0x00,0x00,0x09,0x0a,0x0a,0x0a,0x08,0x06,0x09,0x09,0x05,\r\n0x0e,0x09,0x09,0x06,0x05,0x07,0x05,0x07,0x09,0x07,0x09,0x0e,0x0a,0x05,0x04,0x09,0x09,0x0a,0x09,0x09,0x05,0x09,0x08,0x04,0x0e,0x09,0x09,0x06,0x07,0x07,0x08,0x07,0x07,0x08,0x09,0x09,0x08,0x07,0x07,0x0c,0x04,0x07,0x04,0x09,0x07,0x06,0x04,0x04,0x05,0x04,0x03,0x03,0x06,0x05,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x08,0x08,\r\n0x05,0x05,0x06,0x05,0x06,0x04,0x03,0x03,0x05,0x05,0x05,0x05,0x05,0x04,0x04,0x05,0x04,0x05,0x00,0x00,0x00,0x00,0x03,0x05,0x05,0x05,0x04,0x05,0x09,0x09,0x09,0x09,0x05,0x00,0x00,0x00,0x00,0x07,0x05,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x04,0x04,0x04,0x04,0x09,0x09,0x09,0x09,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0a,0x0b,0x09,0x0c,0x0a,\r\n0x0f,0x0c,0x09,0x06,0x08,0x0b,0x09,0x0d,0x0b,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x0d,0x0d,0x10,0x07,0x04,0x08,0x09,0x07,0x08,0x08,0x09,0x09,0x08,0x10,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x0a,0x08,0x08,0x08,0x05,0x09,0x05,0x0c,0x0b,0x08,0x05,0x0d,0x08,0x0d,0x04,0x05,\r\n0x09,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0d,0x04,0x09,0x04,0x08,0x07,0x04,0x04,0x08,0x04,0x0c,0x04,0x0f,0x08,0x0f,0x0f,0x09,0x09,0x09,0x08,0x08,0x07,0x07,0x13,0x13,0x15,0x15,0x0d,0x0d,0x08,0x08,0x03,0x10,0x0c,0x0d,0x0b,0x09,0x0b,0x08,0x08,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x04,0x0a,0x00,0x0a,0x0a,\r\n0x0a,0x05,0x08,0x08,0x0f,0x05,0x0f,0x05,0x09,0x0b,0x09,0x07,0x0f,0x08,0x0f,0x08,0x0c,0x0d,0x05,0x08,0x08,0x07,0x04,0x08,0x09,0x08,0x09,0x08,0x09,0x09,0x08,0x0b,0x0a,0x0f,0x05,0x08,0x07,0x0b,0x08,0x05,0x08,0x08,0x08,0x0f,0x05,0x0f,0x05,0x04,0x09,0x06,0x10,0x08,0x08,0x0a,0x0a,0x10,0x08,0x00,0x00,0x00,0x0a,0x00,0x0a,0x0a,\r\n0x0a,0x0a,0x0c,0x0a,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x08,0x08,0x0c,0x0d,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x13,\r\n0x0d,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,0x08,0x09,0x09,0x09,0x10,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x08,0x08,0x10,0x08,0x08,0x0c,0x0c,0x11,0x10,0x0f,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x0b,0x05,0x0b,0x05,\r\n0x09,0x0b,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0f,0x0c,0x0d,0x05,0x08,0x0c,0x0d,0x0c,0x0d,0x00,0x00,0x00,0x00,0x00,0x12,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x13,0x0d,0x15,0x10,0x08,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x08,0x0f,0x0f,0x06,0x09,0x09,0x0a,0x14,0x0d,0x09,0x18,0x11,0x05,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x07,0x07,0x0c,0x0b,0x0b,0x08,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x14,0x18,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x07,0x0f,0x05,0x0f,0x05,0x0f,0x05,\r\n0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x0b,0x09,0x08,0x08,0x07,0x13,0x0d,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x10,0x08,0x08,0x10,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x0f,0x08,0x08,0x09,0x09,0x09,0x09,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x0b,0x05,0x05,0x07,0x07,0x13,0x0d,0x0a,0x09,\r\n0x09,0x00,0x08,0x08,0x08,0x06,0x09,0x0b,0x0a,0x08,0x08,0x06,0x04,0x0c,0x09,0x0a,0x06,0x09,0x08,0x08,0x07,0x08,0x04,0x08,0x07,0x0a,0x08,0x09,0x07,0x09,0x07,0x0b,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x07,0x08,0x08,0x05,0x08,0x09,0x0a,0x08,0x05,0x0c,0x09,0x0a,0x09,0x0a,0x08,0x09,0x08,0x06,0x0b,0x06,0x07,\r\n0x07,0x08,0x0a,0x0a,0x08,0x10,0x08,0x10,0x05,0x04,0x03,0x09,0x03,0x02,0x00,0x02,0x04,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x0f,0x07,0x0c,0x09,0x0f,0x0c,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0e,0x08,0x0e,0x08,0x0e,0x0a,0x0b,0x0b,0x0b,0x0c,0x0e,0x10,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0c,0x09,0x11,0x0d,0x08,0x08,0x05,0x05,0x05,0x06,0x03,0x09,0x04,0x04,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x03,0x00,0x00,0x03,0x00,0x00,0x0a,0x09,0x07,0x08,0x0b,0x04,0x05,0x0b,0x0b,0x04,0x09,0x09,0x09,0x0b,0x0b,0x04,0x06,0x0b,\r\n0x0a,0x0a,0x0a,0x09,0x09,0x0b,0x09,0x0d,0x0c,0x08,0x08,0x08,0x04,0x06,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x08,0x0b,0x09,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x09,0x07,0x08,0x0b,0x05,0x06,0x0b,0x05,0x09,0x09,0x09,0x0b,0x06,0x0b,0x0a,0x0a,0x09,0x0b,0x09,0x0d,0x0c,0x04,0x09,0x09,0x0a,0x0a,0x13,0x00,\r\n0x0a,0x09,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x04,0x00,0x0c,0x0a,0x0b,0x0b,0x09,0x0b,0x0c,0x0c,0x08,0x0a,0x0c,0x0c,0x0b,0x0c,0x0d,0x0c,0x0b,0x09,0x09,0x0c,0x0b,0x09,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0c,0x09,0x0a,0x0b,0x0a,0x0c,0x0a,0x0a,0x0a,0x0b,0x0d,0x08,0x09,0x09,0x0e,0x09,0x09,0x0c,0x0e,0x0a,0x09,0x11,0x09,0x09,0x0c,0x09,0x09,0x0c,0x09,0x0c,0x0d,0x0e,0x09,0x0c,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x0c,0x09,0x0a,0x0b,0x09,0x09,0x0a,0x0f,0x09,0x09,0x09,0x09,0x07,0x05,0x09,0x09,0x09,0x09,0x09,\r\n0x0e,0x09,0x0e,0x08,0x09,0x0e,0x0b,0x09,0x0e,0x0c,0x0c,0x0e,0x09,0x09,0x0e,0x0e,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x09,0x09,0x09,0x0e,0x0a,0x09,0x09,0x09,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0d,0x0b,0x0a,0x09,0x0d,0x0b,0x0b,0x09,0x0b,0x0b,0x0c,0x0c,0x09,0x0b,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0b,0x0a,\r\n0x0b,0x0b,0x0c,0x0d,0x0b,0x0c,0x0c,0x02,0x02,0x02,0x03,0x02,0x04,0x06,0x0e,0x09,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x09,0x05,0x0d,0x09,0x09,0x09,0x09,0x0a,0x08,0x09,0x04,0x09,0x08,0x09,0x07,0x0e,0x09,0x09,0x09,0x09,0x0d,0x09,0x09,0x06,0x0d,0x09,0x09,0x0b,0x0b,0x03,0x05,0x12,0x12,0x12,0x12,0x17,0x09,0x09,0x04,0x09,\r\n0x06,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x09,0x07,0x07,0x09,0x0a,0x04,0x05,0x08,0x07,0x0c,0x0a,0x0a,\r\n0x08,0x0a,0x08,0x07,0x07,0x0a,0x08,0x0d,0x08,0x07,0x08,0x0b,0x0c,0x07,0x0a,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x04,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x08,0x0a,0x0a,0x04,0x04,\r\n0x04,0x04,0x04,0x09,0x05,0x08,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x0b,0x0a,0x08,0x08,0x06,0x09,0x07,0x08,0x0a,0x0a,0x04,0x08,0x08,0x0c,0x0a,0x07,0x0a,0x0a,0x08,\r\n0x07,0x07,0x07,0x0a,0x08,0x0b,0x0a,0x08,0x07,0x0a,0x04,0x0a,0x07,0x0a,0x04,0x07,0x07,0x09,0x06,0x08,0x07,0x04,0x04,0x05,0x0d,0x0d,0x0a,0x08,0x08,0x0a,0x08,0x08,0x08,0x06,0x09,0x07,0x0c,0x07,0x0a,0x0a,0x08,0x09,0x0c,0x0a,0x0a,0x0a,0x08,0x08,0x07,0x08,0x0a,0x08,0x0a,0x09,0x0d,0x0d,0x09,0x0b,0x08,0x08,0x0e,0x08,0x06,0x09,\r\n0x09,0x0a,0x0e,0x0e,0x0b,0x08,0x09,0x07,0x09,0x09,0x09,0x0b,0x08,0x08,0x0b,0x09,0x09,0x06,0x0a,0x0a,0x09,0x08,0x08,0x0e,0x0c,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x06,0x0f,0x09,0x09,0x09,0x0a,0x0a,0x08,0x08,0x04,0x0c,0x0b,0x0b,0x08,0x0b,0x03,0x03,0x07,0x07,0x03,0x03,0x0a,0x06,0x04,0x0c,0x0b,0x05,0x03,0x03,0x07,0x06,\r\n0x06,0x04,0x04,0x04,0x06,0x0b,0x08,0x05,0x0a,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0a,0x06,0x07,0x09,0x07,0x03,0x04,0x06,0x08,0x05,0x0b,0x0b,0x0b,0x0f,0x0c,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x0c,0x0d,0x05,0x05,0x08,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x08,0x08,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,\r\n0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x08,0x08,0x0f,0x0f,0x08,0x08,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x10,0x0c,0x0d,0x08,0x09,0x09,0x0b,0x05,0x0b,0x0c,0x08,0x08,0x05,0x05,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0f,0x05,0x0c,0x08,0x08,0x04,0x08,0x08,0x08,0x08,0x0f,0x05,\r\n0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x15,0x10,0x15,0x10,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x08,0x08,0x0c,0x08,0x08,0x0f,0x08,0x11,0x10,0x0f,0x08,0x0d,0x08,0x0d,\r\n0x08,0x0d,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x0b,0x0b,0x05,0x05,0x0b,0x05,0x0b,0x05,0x0b,0x08,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x08,0x05,0x05,0x05,0x05,0x00,0x13,0x0d,0x15,0x10,0x0f,0x08,0x0f,0x05,0x0f,0x05,0x0f,0x05,0x0f,0x05,\r\n0x0f,0x05,0x0f,0x05,0x09,0x09,0x08,0x08,0x07,0x13,0x0d,0x10,0x10,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x0b,0x05,0x0b,0x05,0x0b,0x05,0x13,0x0d,0x09,0x0b,0x09,0x09,0x09,0x0b,0x09,0x09,0x13,0x13,0x0d,0x0d,0x07,0x07,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x0c,0x0d,0x05,0x05,0x09,0x09,\r\n0x09,0x09,0x0f,0x05,0x0f,0x05,0x09,0x0b,0x09,0x09,0x13,0x13,0x0d,0x0d,0x13,0x13,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x04,0x04,0x05,0x04,0x00,0x00,0x00,0x0d,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0d,0x09,0x0d,0x09,\r\n0x0d,0x09,0x0d,0x0b,0x0b,0x0b,0x04,0x04,0x08,0x07,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x08,0x09,0x0a,0x0a,0x0b,0x09,0x09,0x0a,0x08,0x0b,0x0c,0x0a,0x0c,0x0d,0x0a,0x0c,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x07,0x09,0x0a,0x0a,0x0b,\r\n0x09,0x0a,0x09,0x0a,0x0a,0x08,0x08,0x0c,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0b,0x0f,0x0f,0x0c,0x0e,0x0e,0x09,0x0c,0x0e,0x0c,0x0a,0x0e,0x0c,0x0b,0x0b,0x0a,0x0a,0x0c,0x0d,0x0b,0x0a,0x0b,0x09,0x09,0x0f,0x0f,0x0f,0x0d,0x0f,0x0f,0x0b,0x0f,0x0f,0x0b,0x0c,0x0d,0x0c,0x0c,0x0c,0x0a,0x0e,0x0c,0x0d,\r\n0x0b,0x0b,0x09,0x0c,0x0b,0x0b,0x0e,0x0c,0x0c,0x0e,0x09,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x09,0x0a,0x0a,0x0a,0x07,0x09,0x09,0x09,0x0a,0x0c,0x0d,0x0a,0x0a,0x0a,0x0c,0x0a,0x0b,0x08,0x08,0x09,0x09,0x08,0x08,0x09,0x09,0x08,0x07,0x0a,0x07,0x09,0x08,\r\n0x09,0x0d,0x09,0x0d,0x09,0x09,0x09,0x0c,0x05,0x0d,0x0b,0x0b,0x0b,0x09,0x0c,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x0a,0x04,0x04,0x04,0x05,0x05,0x04,0x04,0x04,0x05,0x04,0x04,0x04,0x0e,\r\n0x0e,0x0e,0x0e,0x08,0x0c,0x0c,0x08,0x07,0x08,0x08,0x09,0x08,0x0e,0x0d,0x0e,0x07,0x10,0x08,0x0d,0x0d,0x0d,0x0d,0x09,0x08,0x08,0x0c,0x09,0x0c,0x0b,0x09,0x07,0x07,0x10,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x16,0x0d,0x0d,0x07,0x04,0x07,0x04,0x07,0x04,0x04,0x04,0x08,0x09,0x09,0x09,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x07,0x0e,\r\n0x03,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x13,0x13,0x0b,0x13,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x08,0x09,0x08,0x09,0x07,0x06,0x06,0x0b,0x09,\r\n0x0b,0x07,0x12,0x0e,0x09,0x09,0x0f,0x0d,0x0e,0x0c,0x10,0x0d,0x0f,0x0c,0x0a,0x08,0x0c,0x09,0x0f,0x0c,0x0c,0x0a,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x12,0x0d,0x0c,0x09,0x0c,0x09,0x13,0x0e,0x0d,0x00,0x10,0x10,0x10,0x08,0x00,0x00,0x09,0x08,0x0b,0x09,0x09,0x07,0x11,0x0e,0x0f,0x0e,0x0b,0x09,0x0b,0x09,0x08,0x07,0x0c,0x0a,0x08,0x07,\r\n0x0d,0x0b,0x0b,0x09,0x10,0x0d,0x09,0x09,0x0c,0x0c,0x0d,0x07,0x03,0x07,0x0b,0x07,0x10,0x10,0x04,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x0b,0x0c,0x04,0x03,0x04,0x03,0x0b,0x09,0x0c,0x0a,0x09,0x08,0x09,0x08,0x09,0x09,0x07,0x07,0x12,0x0d,0x12,0x0e,0x10,0x0e,0x0e,\r\n0x0b,0x0e,0x0b,0x0e,0x0b,0x0a,0x07,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x05,0x08,0x04,0x0c,0x09,0x0e,0x0b,0x15,0x10,0x09,0x09,0x0b,0x0b,0x0d,0x0e,0x0c,0x09,0x10,0x0d,0x09,0x06,0x09,0x08,0x0a,0x08,0x0f,0x0c,0x0a,0x08,0x09,0x09,0x09,0x09,0x08,0x06,0x08,0x06,0x08,0x06,0x08,0x08,0x05,0x0b,0x05,0x0f,0x0b,0x06,0x09,0x0a,0x07,\r\n0x0c,0x09,0x06,0x06,0x09,0x09,0x09,0x08,0x04,0x0c,0x0a,0x06,0x06,0x0a,0x07,0x0b,0x06,0x0c,0x0a,0x0a,0x07,0x0b,0x09,0x09,0x08,0x0c,0x09,0x0a,0x06,0x09,0x07,0x0c,0x07,0x08,0x0e,0x08,0x09,0x0e,0x04,0x12,0x0e,0x0e,0x13,0x0e,0x0f,0x0f,0x0e,0x0e,0x0f,0x08,0x08,0x0a,0x0b,0x0e,0x0b,0x0f,0x04,0x07,0x09,0x0e,0x10,0x0b,0x10,0x0a,\r\n0x0a,0x0d,0x0b,0x12,0x0f,0x08,0x0f,0x05,0x0f,0x05,0x09,0x09,0x09,0x09,0x0d,0x0d,0x0d,0x0d,0x10,0x08,0x08,0x10,0x0c,0x08,0x08,0x0c,0x0b,0x05,0x05,0x0b,0x09,0x09,0x09,0x09,0x0c,0x05,0x05,0x0d,0x0c,0x05,0x05,0x0d,0x07,0x07,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x06,0x09,0x08,0x0c,0x09,0x09,0x0e,0x0b,0x0c,0x0c,0x0d,0x0d,0x09,0x08,0x10,0x0d,0x11,0x0e,0x0b,0x09,0x05,0x05,0x09,0x0a,0x07,0x0a,0x08,0x09,0x08,0x0c,0x0d,0x06,0x09,0x07,0x03,0x06,0x09,0x09,0x03,0x03,0x03,0x03,0x06,0x06,0x06,0x07,0x18,0x20,0x05,0x07,0x02,\r\n0x04,0x06,0x07,0x05,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x08,0x08,0x15,0x09,0x0c,0x0f,0x0e,0x0a,0x07,0x09,0x0c,0x0c,0x08,0x05,0x0b,0x08,0x0b,0x09,0x0b,0x09,0x09,0x0c,0x09,0x09,0x08,0x0c,0x0a,0x0d,0x07,0x08,0x0a,0x05,0x09,0x05,0x06,0x04,0x0e,0x09,0x09,0x08,0x08,0x09,0x0f,0x0f,0x0f,\r\n0x10,0x10,0x09,0x08,0x05,0x08,0x07,0x0a,0x07,0x0b,0x04,0x09,0x0a,0x0e,0x0e,0x0a,0x09,0x09,0x09,0x08,0x07,0x08,0x07,0x08,0x05,0x05,0x04,0x04,0x06,0x09,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x05,0x05,0x05,0x04,0x04,0x1b,0x10,0x0e,0x11,0x05,0x05,0x05,0x06,0x04,0x04,0x05,\r\n0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x0f,0x05,0x05,0x0f,0x04,0x08,0x08,0x15,0x10,0x10,0x15,0x0f,0x08,0x08,0x0f,0x08,0x08,0x07,0x07,0x00,0x00,0x06,0x0c,0x0a,0x0b,0x09,0x14,0x11,0x0b,0x09,0x0b,0x09,0x15,0x10,0x0c,0x09,0x06,0x05,0x0a,0x00,0x0b,0x09,0x05,0x05,0x03,0x08,0x05,0x05,0x04,0x03,0x07,0x06,0x06,0x06,\r\n0x06,0x06,0x06,0x06,0x06,0x03,0x08,0x07,0x09,0x09,0x09,0x0f,0x0d,0x0d,0x0d,0x0d,0x0f,0x0a,0x0b,0x0a,0x06,0x0f,0x12,0x07,0x12,0x08,0x0d,0x0f,0x0f,0x0f,0x07,0x0c,0x10,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x09,0x09,0x09,0x0d,0x08,0x08,0x0f,0x05,0x05,0x0f,0x05,0x05,0x0f,\r\n0x08,0x08,0x00,0x07,0x0d,0x05,0x05,0x10,0x08,0x08,0x0c,0x08,0x08,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x18,0x18,0x0e,0x00,0x00,0x0e,0x0e,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0a,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x10,0x0a,0x0a,0x11,\r\n0x0a,0x0a,0x0f,0x0a,0x0b,0x0d,0x0a,0x0c,0x0e,0x0f,0x0a,0x0c,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0c,0x0a,0x0b,0x0d,0x0a,0x0a,0x09,0x0d,0x0a,0x0a,0x0a,0x0b,0x07,0x08,0x0a,0x0d,0x0c,0x09,0x00,0x00,0x11,0x22,0x0b,0x00,0x02,0x05,0x05,0x07,0x0a,0x09,0x0e,0x0e,0x04,0x05,0x05,0x07,0x0c,0x04,0x07,0x04,0x07,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x04,0x04,0x0c,0x0c,0x0c,0x08,0x10,0x0b,0x0a,0x0b,0x0c,0x09,0x08,0x0c,0x0c,0x05,0x06,0x0a,0x08,0x0f,0x0d,0x0d,0x0a,0x0d,0x0a,0x09,0x09,0x0c,0x0b,0x10,0x0a,0x09,0x0a,0x05,0x06,0x05,0x0c,0x07,0x05,0x09,0x0a,0x08,0x0a,0x09,0x05,0x0a,0x0a,0x04,0x04,0x08,0x04,0x0f,0x0a,0x0a,0x0a,0x0a,0x06,\r\n0x07,0x06,0x0a,0x08,0x0c,0x08,0x08,0x08,0x05,0x04,0x05,0x0c,0x0b,0x0b,0x0b,0x09,0x0d,0x0d,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x04,0x04,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x09,0x09,0x08,0x07,0x08,0x09,0x07,0x0f,0x0f,0x0d,0x05,0x07,0x0c,0x0f,0x0d,0x0e,0x0c,0x0c,\r\n0x0c,0x09,0x0a,0x09,0x0a,0x0d,0x09,0x07,0x07,0x0d,0x0e,0x0a,0x08,0x05,0x05,0x0c,0x0b,0x09,0x0c,0x0b,0x09,0x09,0x0c,0x0b,0x0b,0x0d,0x10,0x10,0x09,0x11,0x06,0x06,0x04,0x04,0x0c,0x0a,0x08,0x09,0x03,0x09,0x05,0x05,0x09,0x09,0x06,0x04,0x04,0x06,0x15,0x0b,0x09,0x0b,0x09,0x09,0x05,0x05,0x05,0x05,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,\r\n0x04,0x06,0x06,0x05,0x05,0x03,0x05,0x03,0x06,0x03,0x06,0x08,0x05,0x09,0x07,0x0a,0x08,0x04,0x0c,0x0a,0x09,0x08,0x0a,0x0a,0x0c,0x0c,0x06,0x06,0x06,0x10,0x0f,0x10,0x08,0x0c,0x0a,0x05,0x09,0x07,0x0b,0x08,0x0b,0x08,0x0a,0x07,0x04,0x0b,0x09,0x0b,0x09,0x0c,0x0b,0x0c,0x09,0x09,0x09,0x09,0x08,0x04,0x08,0x05,0x08,0x05,0x0d,0x0a,\r\n0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x06,0x09,0x07,0x0c,0x0a,0x0c,0x0a,0x0a,0x08,0x0a,0x08,0x08,0x0d,0x0d,0x0a,0x0a,0x07,0x0a,0x08,0x0c,0x07,0x08,0x07,0x13,0x0b,0x08,0x0a,0x04,0x06,0x0e,0x06,0x0a,0x06,0x06,0x0a,0x06,0x0b,0x09,0x0b,0x08,0x0b,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,\r\n0x0a,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x0a,0x08,0x08,0x08,0x04,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x09,0x07,0x09,0x06,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x10,0x0c,0x09,0x08,0x04,0x0b,0x09,0x0f,0x0e,0x0d,0x0a,0x04,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x09,0x08,0x04,0x07,\r\n0x09,0x0a,0x10,0x10,0x10,0x0f,0x07,0x07,0x04,0x05,0x05,0x0b,0x0a,0x0d,0x06,0x0e,0x0b,0x0e,0x05,0x0b,0x0a,0x09,0x0a,0x0c,0x05,0x0a,0x0b,0x0f,0x0d,0x09,0x0d,0x0c,0x0a,0x09,0x09,0x09,0x0a,0x0d,0x0d,0x05,0x09,0x0a,0x07,0x0a,0x05,0x09,0x09,0x09,0x08,0x0a,0x0a,0x05,0x09,0x08,0x0a,0x09,0x08,0x0a,0x0a,0x08,0x09,0x09,0x0d,0x0e,\r\n0x05,0x09,0x0a,0x09,0x0e,0x09,0x0c,0x08,0x0b,0x09,0x05,0x11,0x11,0x0c,0x0a,0x0a,0x0c,0x0b,0x0a,0x0a,0x08,0x0c,0x09,0x0f,0x09,0x0d,0x0d,0x0a,0x0b,0x0f,0x0c,0x0d,0x0c,0x0a,0x0b,0x09,0x0a,0x0c,0x0a,0x0d,0x0b,0x10,0x11,0x0c,0x0d,0x0a,0x0a,0x11,0x0a,0x09,0x0a,0x09,0x07,0x09,0x09,0x0d,0x08,0x0a,0x0a,0x08,0x09,0x0c,0x0a,0x0a,\r\n0x0a,0x0a,0x08,0x07,0x08,0x0c,0x08,0x0a,0x0a,0x0e,0x0e,0x0a,0x0c,0x09,0x08,0x0e,0x09,0x09,0x0a,0x07,0x08,0x07,0x04,0x0d,0x0e,0x0a,0x08,0x08,0x0a,0x08,0x07,0x11,0x13,0x0b,0x06,0x06,0x06,0x06,0x04,0x09,0x07,0x09,0x0d,0x0a,0x0c,0x0a,0x05,0x06,0x05,0x05,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x08,0x05,0x05,0x05,0x08,\r\n0x08,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x04,0x05,0x04,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,\r\n0x0a,0x0d,0x0a,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x06,0x09,0x09,0x0d,0x0a,0x05,0x06,0x04,0x04,0x09,0x07,0x0f,0x0d,0x0a,0x09,0x0a,0x08,0x0d,0x0a,0x09,0x08,0x09,0x08,0x0b,0x08,0x0b,0x0a,0x0b,0x0a,0x0c,0x09,0x0d,0x0a,0x05,0x05,0x05,0x05,0x07,\r\n0x07,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x08,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x08,0x05,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x05,0x04,0x05,0x04,0x0a,0x08,0x0a,\r\n0x08,0x0a,0x08,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x07,0x09,0x06,0x09,0x06,0x09,0x06,0x09,0x06,0x0c,\r\n0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x08,0x0b,0x08,0x10,0x0c,0x10,0x0c,0x0a,0x08,0x0a,0x08,0x09,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x06,0x0c,0x08,0x09,0x04,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x08,0x08,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x0a,0x0a,0x07,0x07,0x0a,0x0a,0x05,0x05,0x0a,0x0a,0x09,0x09,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,\r\n0x10,0x10,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0c,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0x06,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x08,0x0c,0x0d,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0c,0x0b,0x0f,0x05,0x05,0x0a,0x08,0x04,0x08,0x0f,0x0d,0x0a,0x0d,0x10,0x0d,0x0a,0x0a,0x0a,0x09,0x07,0x09,\r\n0x05,0x06,0x09,0x06,0x09,0x0d,0x0c,0x0a,0x09,0x0a,0x08,0x0a,0x0a,0x08,0x07,0x09,0x09,0x06,0x07,0x09,0x04,0x07,0x08,0x05,0x15,0x13,0x11,0x0f,0x0c,0x09,0x12,0x10,0x0e,0x0b,0x09,0x05,0x04,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x09,0x0b,0x09,0x0b,0x09,0x0f,0x0e,0x0c,0x0a,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,\r\n0x0d,0x0a,0x0a,0x08,0x04,0x15,0x13,0x11,0x0c,0x0a,0x11,0x0c,0x0d,0x0a,0x0b,0x09,0x0b,0x09,0x09,0x09,0x09,0x09,0x05,0x04,0x05,0x04,0x0d,0x0a,0x0d,0x0a,0x0a,0x06,0x0a,0x06,0x0c,0x0a,0x0c,0x0a,0x09,0x07,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x08,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x09,0x08,0x0a,0x09,0x0a,0x0a,0x0a,\r\n0x09,0x0a,0x0a,0x0a,0x08,0x08,0x0a,0x0a,0x09,0x0a,0x07,0x07,0x09,0x09,0x05,0x0a,0x0a,0x09,0x08,0x08,0x0a,0x0a,0x0a,0x04,0x05,0x05,0x05,0x06,0x04,0x0a,0x0f,0x0f,0x0f,0x09,0x09,0x0a,0x0a,0x0c,0x0c,0x0b,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x07,0x04,0x04,0x05,0x05,0x06,0x06,0x0a,0x0a,0x09,0x08,0x0c,0x08,0x07,0x08,\r\n0x09,0x08,0x08,0x06,0x06,0x06,0x08,0x0b,0x08,0x09,0x09,0x0a,0x04,0x08,0x07,0x0a,0x06,0x06,0x10,0x10,0x11,0x0a,0x08,0x0c,0x0d,0x0a,0x0a,0x08,0x08,0x09,0x0a,0x0a,0x0c,0x0a,0x0b,0x0e,0x0a,0x0c,0x0a,0x0a,0x08,0x08,0x08,0x0a,0x09,0x0a,0x08,0x0f,0x0f,0x0a,0x09,0x0b,0x09,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0a,0x07,0x0a,0x0a,0x08,\r\n0x04,0x0d,0x08,0x08,0x0f,0x0c,0x0b,0x0a,0x0f,0x0c,0x0b,0x08,0x0f,0x0c,0x0c,0x0a,0x10,0x0d,0x09,0x08,0x0d,0x0d,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x16,0x13,0x0e,0x0b,0x13,0x0f,0x0f,0x0c,0x0a,0x07,0x09,0x07,0x07,0x00,0x00,0x11,0x10,0x0a,0x09,0x0a,0x0a,0x0a,0x09,0x09,0x08,0x0a,0x08,0x0c,0x0a,0x0e,0x0b,0x11,0x0e,0x0c,0x09,0x0b,\r\n0x08,0x09,0x07,0x0f,0x0c,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x05,0x0f,0x0d,0x0a,0x09,0x0c,0x0a,0x0b,0x0a,0x0b,0x09,0x0b,0x09,0x0f,0x0e,0x09,0x09,0x0c,0x09,0x0c,0x09,0x0f,0x0d,0x09,0x08,0x09,0x08,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0b,0x0a,0x0d,0x0c,0x0a,0x0a,0x0f,0x0f,0x0e,0x0c,\r\n0x09,0x08,0x0f,0x0e,0x11,0x0e,0x0c,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x0a,0x06,0x06,0x03,0x04,0x04,0x04,0x05,0x07,0x05,0x04,0x06,0x04,0x04,0x04,0x06,0x06,0x04,0x04,0x0a,0x0a,0x0a,0x0a,0x06,0x05,0x05,0x06,0x05,0x05,0x05,0x05,0x05,0x06,\r\n0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x05,0x03,0x04,0x05,0x04,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x04,0x04,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x0b,0x05,0x0b,0x06,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x08,0x0b,0x0e,0x08,0x08,0x09,0x09,0x07,0x07,0x04,0x05,0x08,0x07,0x0c,0x0a,0x0a,0x08,0x0b,0x0b,0x0b,0x10,0x09,0x0a,0x0a,0x08,0x08,0x08,0x07,0x09,0x0a,0x0c,0x0a,0x08,0x0c,0x08,0x07,0x07,0x09,0x07,0x08,0x0a,0x08,0x0a,0x0a,0x06,0x08,0x06,0x06,0x07,0x05,0x05,0x07,\r\n0x07,0x03,0x04,0x06,0x05,0x09,0x07,0x07,0x07,0x06,0x06,0x06,0x05,0x07,0x09,0x05,0x05,0x06,0x08,0x06,0x06,0x05,0x05,0x04,0x04,0x06,0x03,0x05,0x08,0x06,0x06,0x05,0x06,0x06,0x06,0x03,0x06,0x06,0x08,0x05,0x05,0x06,0x05,0x06,0x07,0x05,0x03,0x04,0x06,0x05,0x06,0x05,0x06,0x07,0x05,0x0a,0x03,0x06,0x09,0x0f,0x0b,0x09,0x09,0x0f,\r\n0x0b,0x0f,0x0d,0x09,0x0a,0x09,0x08,0x13,0x08,0x0a,0x0f,0x10,0x10,0x0b,0x0b,0x0b,0x08,0x08,0x09,0x07,0x08,0x09,0x03,0x00,0x00,0x00,0x00,0x0a,0x0b,0x0b,0x0b,0x08,0x07,0x0a,0x0a,0x05,0x0f,0x0a,0x0a,0x06,0x06,0x08,0x06,0x08,0x0a,0x08,0x0a,0x0f,0x0b,0x05,0x05,0x0a,0x09,0x0a,0x0a,0x0a,0x05,0x0a,0x08,0x04,0x0f,0x0a,0x0a,0x06,\r\n0x07,0x07,0x08,0x08,0x08,0x09,0x0a,0x0a,0x09,0x07,0x08,0x0c,0x04,0x08,0x04,0x0a,0x08,0x06,0x05,0x05,0x06,0x04,0x03,0x03,0x06,0x06,0x03,0x03,0x03,0x03,0x03,0x03,0x03,0x04,0x08,0x08,0x06,0x06,0x06,0x06,0x06,0x04,0x03,0x03,0x06,0x06,0x06,0x05,0x05,0x04,0x04,0x05,0x04,0x06,0x00,0x00,0x00,0x00,0x04,0x05,0x05,0x06,0x05,0x05,\r\n0x09,0x09,0x09,0x09,0x06,0x00,0x00,0x00,0x00,0x08,0x05,0x05,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x03,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x05,0x05,0x0d,0x0b,0x0c,0x0a,0x0d,0x0b,0x10,0x0d,0x09,0x06,0x09,0x0c,0x09,0x0e,0x0c,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x04,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,\r\n0x11,0x07,0x04,0x09,0x0a,0x07,0x09,0x09,0x0a,0x0a,0x09,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x0b,0x09,0x09,0x09,0x06,0x0a,0x06,0x0d,0x0b,0x09,0x06,0x0e,0x09,0x0e,0x04,0x06,0x0a,0x0a,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0e,0x04,0x0a,0x04,0x09,0x07,0x04,0x04,0x09,0x04,0x0d,0x04,0x10,0x09,0x10,0x10,0x0a,0x0a,0x0a,0x09,\r\n0x09,0x07,0x07,0x14,0x14,0x17,0x17,0x0e,0x0e,0x09,0x09,0x03,0x11,0x0d,0x0e,0x0b,0x0a,0x0b,0x09,0x09,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x04,0x0b,0x00,0x0b,0x0b,0x0b,0x06,0x09,0x09,0x10,0x06,0x10,0x06,0x0a,0x0b,0x0a,0x07,0x10,0x09,0x10,0x09,0x0d,0x0e,0x06,0x09,0x09,0x07,0x04,0x09,0x0a,0x09,0x0a,0x09,\r\n0x0a,0x0a,0x09,0x0b,0x0b,0x10,0x06,0x09,0x07,0x0b,0x09,0x06,0x09,0x09,0x09,0x10,0x06,0x10,0x06,0x04,0x0a,0x07,0x11,0x09,0x09,0x0b,0x0b,0x11,0x09,0x00,0x00,0x00,0x0b,0x00,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x07,0x07,0x09,0x09,0x0d,0x0e,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,\r\n0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,0x09,0x07,0x07,0x07,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x09,0x0a,0x0a,0x0a,0x11,0x11,0x09,0x09,0x11,0x09,0x09,0x11,0x09,0x09,0x11,0x09,0x09,0x0d,\r\n0x0d,0x12,0x11,0x10,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x0b,0x06,0x0b,0x06,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x10,0x0d,0x0e,0x06,0x09,0x0d,0x0e,0x0d,0x0e,0x00,0x00,0x00,0x00,0x00,0x13,0x12,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x07,0x00,0x00,0x0a,0x00,0x00,0x00,0x14,0x0e,0x17,0x11,0x09,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x10,0x10,0x06,0x0a,0x0a,0x0a,0x15,0x0e,0x09,0x1a,0x12,0x06,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x09,\r\n0x07,0x07,0x0d,0x0b,0x0b,0x09,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x15,0x1a,0x00,0x00,0x00,0x00,0x00,0x0a,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x09,0x09,0x07,0x14,0x0e,0x09,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,\r\n0x0a,0x11,0x09,0x09,0x11,0x09,0x09,0x10,0x09,0x09,0x10,0x09,0x09,0x10,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x0b,0x06,0x06,0x07,0x07,0x14,0x0e,0x0b,0x0a,0x0a,0x00,0x09,0x09,0x09,0x06,0x0a,0x0c,0x0b,0x09,0x09,0x06,0x04,0x0d,0x0a,0x0a,0x06,0x09,0x08,0x08,0x08,0x08,0x04,0x09,0x07,0x0b,0x08,0x0a,\r\n0x08,0x09,0x07,0x0b,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x08,0x08,0x08,0x05,0x09,0x0a,0x0a,0x09,0x06,0x0d,0x0a,0x0b,0x09,0x0b,0x08,0x0a,0x09,0x07,0x0c,0x06,0x07,0x07,0x08,0x0a,0x0a,0x09,0x11,0x09,0x11,0x06,0x04,0x03,0x09,0x04,0x02,0x00,0x02,0x04,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x07,0x07,0x07,0x09,0x09,0x10,0x07,0x0d,0x0a,0x10,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x0f,0x08,0x0f,0x08,0x0f,0x0b,0x0c,0x0c,0x0c,0x0d,0x0f,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0d,0x0a,0x12,0x0e,0x08,0x08,0x05,0x05,0x05,0x06,0x04,0x0a,0x04,0x04,0x0e,0x0b,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x03,0x00,0x00,0x04,0x00,0x00,0x0b,0x0a,0x07,0x08,0x0c,0x05,0x06,0x0b,0x0c,0x05,0x0a,0x09,0x09,0x0c,0x0b,0x05,0x07,0x0b,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x0a,0x0d,0x0c,0x09,0x09,0x09,0x04,0x06,0x0a,0x0a,0x09,0x09,0x09,0x0a,0x0b,0x08,0x0c,0x09,0x09,0x0c,0x0a,0x0c,\r\n0x09,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0a,0x07,0x08,0x0c,0x05,0x06,0x0c,0x05,0x0a,0x09,0x09,0x0b,0x07,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0d,0x0c,0x05,0x0a,0x09,0x0b,0x0b,0x14,0x00,0x0b,0x09,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x05,0x00,0x0d,0x0b,0x0b,0x0c,0x09,0x0b,0x0d,0x0d,0x08,0x0b,0x0d,0x0d,0x0b,0x0d,0x0e,0x0d,0x0b,0x09,0x0a,0x0d,0x0c,0x0a,0x0c,0x0c,0x0b,0x0c,0x0c,0x0d,0x0a,0x0b,0x0c,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0e,0x08,0x0a,0x0a,0x0f,0x09,0x09,0x0d,0x0f,0x0a,0x09,0x12,0x0a,0x0a,0x0d,\r\n0x09,0x09,0x0d,0x0a,0x0d,0x0e,0x0f,0x09,0x0d,0x09,0x0b,0x09,0x0a,0x0a,0x0b,0x09,0x0a,0x0d,0x09,0x0b,0x0b,0x09,0x09,0x0a,0x10,0x09,0x09,0x0a,0x0a,0x07,0x06,0x09,0x09,0x09,0x09,0x09,0x0f,0x09,0x0f,0x08,0x09,0x0f,0x0b,0x09,0x0f,0x0d,0x0d,0x0f,0x0a,0x09,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x0a,0x09,0x0a,0x0f,\r\n0x0a,0x09,0x09,0x09,0x0f,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0d,0x0c,0x0b,0x09,0x0d,0x0b,0x0c,0x0a,0x0b,0x0c,0x0d,0x0c,0x0a,0x0c,0x0b,0x0c,0x0b,0x0d,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0d,0x0b,0x0d,0x0c,0x02,0x02,0x03,0x03,0x03,0x05,0x06,0x0f,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x05,0x0e,0x0a,\r\n0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x05,0x0a,0x09,0x0a,0x07,0x0f,0x09,0x0a,0x0a,0x0a,0x0e,0x0a,0x0a,0x07,0x0e,0x0a,0x0a,0x0c,0x0c,0x04,0x05,0x13,0x13,0x13,0x13,0x18,0x09,0x09,0x04,0x09,0x07,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x08,0x09,0x0a,0x07,0x07,0x0a,0x0a,0x04,0x05,0x08,0x07,0x0d,0x0b,0x0a,0x08,0x0a,0x08,0x07,0x07,0x0a,0x09,0x0e,0x09,0x08,0x08,0x0c,0x0d,0x07,0x0b,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x07,\r\n0x07,0x04,0x04,0x04,0x04,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x09,0x0a,0x0a,0x04,0x04,0x04,0x04,0x04,0x0a,0x05,0x08,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x0c,0x0b,0x09,0x08,0x07,0x09,0x07,0x08,0x0a,0x0a,0x04,0x08,0x09,0x0d,0x0b,0x08,0x0a,0x0a,0x08,0x08,0x07,0x08,0x0b,0x09,0x0b,0x0b,0x09,0x07,0x0a,0x04,0x0a,0x08,0x0b,0x04,0x08,0x07,0x0a,0x07,0x09,0x07,0x04,0x04,0x05,0x0e,0x0e,0x0a,0x08,\r\n0x08,0x0a,0x09,0x08,0x08,0x07,0x0a,0x07,0x0d,0x08,0x0b,0x0b,0x08,0x0a,0x0d,0x0a,0x0a,0x0a,0x08,0x09,0x07,0x08,0x0b,0x09,0x0b,0x09,0x0e,0x0e,0x0a,0x0c,0x08,0x09,0x0f,0x08,0x07,0x0a,0x0a,0x0b,0x0f,0x0f,0x0b,0x09,0x0a,0x07,0x0a,0x0a,0x0a,0x0c,0x09,0x09,0x0c,0x0a,0x0a,0x06,0x0b,0x0b,0x0a,0x08,0x08,0x0f,0x0d,0x08,0x09,0x0a,\r\n0x0a,0x0b,0x0b,0x0c,0x0c,0x06,0x10,0x0a,0x09,0x0a,0x0b,0x0b,0x09,0x09,0x05,0x0d,0x0c,0x0c,0x08,0x0c,0x04,0x04,0x07,0x07,0x04,0x04,0x0a,0x07,0x05,0x0d,0x0c,0x05,0x04,0x04,0x08,0x06,0x06,0x04,0x04,0x04,0x06,0x0b,0x08,0x05,0x0a,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,0x0a,0x06,0x07,0x09,0x07,0x04,0x04,0x07,0x09,0x06,0x0b,0x0b,0x0b,\r\n0x10,0x0d,0x10,0x04,0x00,0x00,0x00,0x00,0x00,0x04,0x0d,0x0e,0x06,0x06,0x09,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x09,0x09,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x10,0x09,0x09,0x10,0x10,0x09,0x09,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x11,0x0d,0x0e,\r\n0x09,0x0a,0x0a,0x0b,0x06,0x0b,0x0d,0x09,0x09,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x06,0x0d,0x09,0x09,0x04,0x09,0x09,0x09,0x09,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x17,0x11,0x17,0x11,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x09,0x0d,0x09,0x09,0x10,0x09,0x12,0x11,0x10,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x0b,0x0b,0x06,0x06,0x0b,0x06,0x0b,\r\n0x06,0x0b,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x09,0x06,0x06,0x06,0x06,0x00,0x14,0x0e,0x17,0x11,0x10,0x09,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x10,0x06,0x0a,0x0a,0x09,0x09,0x07,0x14,0x0e,0x11,0x11,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x0a,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x14,0x0e,\r\n0x0a,0x0b,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x14,0x14,0x0e,0x0e,0x07,0x07,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0d,0x0e,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x10,0x06,0x10,0x06,0x0a,0x0b,0x0a,0x0a,0x14,0x14,0x0e,0x0e,0x14,0x14,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x04,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x00,0x00,0x04,0x04,0x06,0x04,0x00,0x00,0x00,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,\r\n0x04,0x04,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0e,0x0a,0x0e,0x0a,0x0e,0x0a,0x0e,0x0b,0x0b,0x0b,0x04,0x04,0x09,0x07,0x0a,0x0b,0x0a,0x09,0x09,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x08,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0a,0x0a,0x0b,0x09,0x0b,0x0d,0x0b,0x0d,0x0e,0x0b,0x0d,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x08,0x09,0x0a,0x0a,0x0b,0x0a,0x0b,0x0a,0x0a,0x0a,0x09,0x09,0x0d,0x0c,0x0c,0x0b,0x0c,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x0c,0x10,0x10,0x0c,0x0f,0x0e,0x09,\r\n0x0d,0x0e,0x0d,0x0a,0x0e,0x0d,0x0c,0x0c,0x0a,0x0b,0x0d,0x0e,0x0c,0x0a,0x0c,0x0a,0x09,0x10,0x10,0x10,0x0e,0x10,0x10,0x0c,0x10,0x10,0x0c,0x0d,0x0d,0x0d,0x0c,0x0c,0x0b,0x0f,0x0d,0x0e,0x0c,0x0c,0x0a,0x0d,0x0c,0x0c,0x0e,0x0d,0x0c,0x0f,0x09,0x09,0x0a,0x09,0x0a,0x0b,0x0c,0x0c,0x0a,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x09,0x09,0x0a,0x0b,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x0a,0x0d,0x0e,0x0b,0x0b,0x0b,0x0d,0x0b,0x0c,0x09,0x08,0x0a,0x0a,0x08,0x08,0x09,0x09,0x08,0x08,0x0b,0x08,0x09,0x08,0x09,0x0d,0x0a,0x0e,0x09,0x0a,0x0a,0x0d,0x05,0x0d,0x0c,0x0c,0x0b,0x0a,0x0d,0x0a,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,\r\n0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0f,0x0f,0x0f,0x0f,0x08,0x0d,0x0c,0x08,0x07,0x08,0x09,0x0a,0x08,0x0e,0x0e,0x0f,0x08,0x11,0x08,0x0e,0x0e,0x0e,0x0e,0x0a,0x08,0x08,0x0d,0x0a,0x0d,\r\n0x0b,0x09,0x08,0x07,0x11,0x07,0x09,0x08,0x08,0x08,0x08,0x08,0x17,0x0e,0x0e,0x07,0x04,0x08,0x04,0x08,0x04,0x04,0x04,0x08,0x0a,0x0a,0x09,0x06,0x06,0x04,0x04,0x04,0x06,0x04,0x07,0x0f,0x04,0x0f,0x0f,0x0f,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x0b,0x14,0x14,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x08,0x0a,0x08,0x09,0x07,0x06,0x06,0x0c,0x09,0x0c,0x07,0x13,0x0f,0x0a,0x09,0x10,0x0d,0x0e,0x0d,0x11,0x0e,0x10,0x0d,0x0b,0x08,0x0c,0x0a,0x10,0x0c,0x0d,0x0a,0x0d,0x0a,0x0f,0x0b,0x0f,0x0b,\r\n0x13,0x0e,0x0d,0x0a,0x0d,0x0a,0x15,0x0f,0x0d,0x00,0x11,0x11,0x11,0x08,0x00,0x00,0x0a,0x09,0x0c,0x09,0x09,0x07,0x12,0x0f,0x10,0x0f,0x0c,0x0a,0x0c,0x0a,0x09,0x07,0x0d,0x0a,0x09,0x07,0x0e,0x0b,0x0b,0x0a,0x11,0x0e,0x09,0x0a,0x0c,0x0c,0x0e,0x08,0x03,0x08,0x0c,0x07,0x11,0x11,0x04,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x07,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,\r\n0x0d,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x08,0x0c,0x0c,0x05,0x04,0x05,0x04,0x0c,0x0a,0x0d,0x0b,0x09,0x08,0x09,0x08,0x0a,0x0a,0x07,0x07,0x13,0x0e,0x14,0x0f,0x11,0x0e,0x0f,0x0b,0x0f,0x0b,0x0f,0x0b,0x0b,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x09,0x05,0x08,0x04,0x0d,0x0a,0x0f,0x0b,0x17,0x11,0x0a,0x0a,0x0c,0x0c,0x0e,\r\n0x0f,0x0d,0x0a,0x11,0x0d,0x09,0x07,0x0a,0x08,0x0b,0x08,0x10,0x0c,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x08,0x07,0x08,0x07,0x08,0x06,0x09,0x09,0x05,0x0b,0x06,0x10,0x0b,0x06,0x0a,0x0a,0x08,0x0d,0x0a,0x06,0x06,0x0a,0x0a,0x0a,0x08,0x04,0x0d,0x0a,0x06,0x06,0x0b,0x08,0x0c,0x07,0x0d,0x0a,0x0b,0x08,0x0c,0x0a,0x0a,0x08,0x0d,0x0a,0x0a,\r\n0x06,0x09,0x07,0x0d,0x07,0x09,0x0f,0x08,0x0a,0x0f,0x05,0x13,0x0f,0x0f,0x14,0x0f,0x10,0x10,0x0f,0x0f,0x10,0x09,0x08,0x0b,0x0c,0x0f,0x0c,0x10,0x04,0x08,0x0a,0x0f,0x12,0x0c,0x12,0x0b,0x0b,0x0e,0x0c,0x13,0x10,0x09,0x10,0x06,0x10,0x06,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x11,0x09,0x09,0x11,0x0d,0x09,0x09,0x0d,0x0b,0x06,\r\n0x06,0x0b,0x0a,0x0a,0x0a,0x0a,0x0d,0x06,0x06,0x0e,0x0d,0x06,0x06,0x0e,0x07,0x07,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x09,0x07,0x0a,0x09,0x0d,0x0a,0x0a,0x0f,0x0b,0x0d,0x0d,0x0e,0x0e,0x0a,0x08,0x11,\r\n0x0e,0x12,0x0f,0x0c,0x0a,0x05,0x05,0x0a,0x0b,0x07,0x0a,0x09,0x0a,0x08,0x0d,0x0e,0x07,0x0a,0x07,0x04,0x06,0x09,0x09,0x04,0x04,0x03,0x04,0x06,0x06,0x06,0x08,0x19,0x22,0x06,0x07,0x02,0x05,0x07,0x07,0x05,0x08,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x17,0x09,0x0d,0x10,0x0f,0x0b,0x08,\r\n0x0a,0x0c,0x0c,0x08,0x05,0x0b,0x09,0x0c,0x09,0x0b,0x09,0x09,0x0d,0x0a,0x0a,0x09,0x0d,0x0a,0x0e,0x08,0x09,0x0b,0x05,0x0a,0x06,0x06,0x04,0x0f,0x0a,0x0a,0x09,0x09,0x0a,0x10,0x10,0x10,0x11,0x11,0x09,0x08,0x05,0x09,0x08,0x0a,0x08,0x0b,0x04,0x0a,0x0a,0x0f,0x0f,0x0a,0x09,0x0a,0x09,0x09,0x08,0x09,0x08,0x08,0x05,0x06,0x04,0x04,\r\n0x06,0x0a,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x05,0x05,0x05,0x04,0x04,0x1d,0x11,0x0f,0x12,0x05,0x05,0x06,0x07,0x04,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x10,0x06,0x06,0x10,0x04,0x09,0x09,0x17,0x11,0x11,0x17,0x10,0x09,0x09,0x10,0x09,0x09,0x07,\r\n0x07,0x00,0x00,0x06,0x0d,0x0a,0x0c,0x0a,0x15,0x12,0x0c,0x09,0x0c,0x09,0x17,0x11,0x0d,0x0a,0x07,0x05,0x0b,0x00,0x0c,0x09,0x06,0x05,0x03,0x08,0x06,0x06,0x04,0x03,0x08,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x04,0x09,0x07,0x0a,0x0a,0x09,0x10,0x0e,0x0e,0x0d,0x0e,0x10,0x0b,0x0c,0x0a,0x07,0x10,0x13,0x07,0x14,0x09,0x0e,0x10,\r\n0x10,0x10,0x07,0x0d,0x11,0x0d,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x0a,0x0a,0x0a,0x0e,0x09,0x09,0x10,0x06,0x06,0x10,0x06,0x06,0x10,0x08,0x08,0x00,0x07,0x0e,0x06,0x06,0x11,0x09,0x09,0x0d,0x09,0x09,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,\r\n0x05,0x1a,0x1a,0x0f,0x00,0x00,0x0f,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0f,0x0b,0x0b,0x0e,0x11,0x0b,0x0b,0x12,0x0b,0x0b,0x10,0x0b,0x0b,0x0d,0x0b,0x0d,0x0e,0x10,0x0b,0x0d,0x0b,0x0c,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0d,0x0a,0x0b,0x0d,0x0b,0x0b,0x0a,0x0d,\r\n0x0b,0x0b,0x0b,0x0c,0x08,0x09,0x0b,0x0d,0x0d,0x09,0x00,0x00,0x13,0x26,0x0c,0x00,0x02,0x05,0x05,0x07,0x0b,0x0a,0x10,0x0f,0x04,0x06,0x06,0x08,0x0d,0x04,0x08,0x04,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x04,0x04,0x0d,0x0d,0x0d,0x09,0x12,0x0c,0x0b,0x0c,0x0d,0x0a,0x09,0x0d,0x0d,0x05,0x07,0x0b,0x09,0x11,0x0e,\r\n0x0e,0x0b,0x0e,0x0b,0x0a,0x0a,0x0d,0x0c,0x12,0x0b,0x0b,0x0b,0x06,0x07,0x06,0x0d,0x08,0x05,0x0a,0x0b,0x09,0x0b,0x0a,0x06,0x0b,0x0b,0x05,0x05,0x09,0x05,0x10,0x0b,0x0b,0x0b,0x0b,0x07,0x08,0x06,0x0b,0x09,0x0e,0x09,0x09,0x09,0x06,0x05,0x06,0x0d,0x0c,0x0c,0x0c,0x0a,0x0e,0x0e,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,\r\n0x0a,0x0a,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x0a,0x0a,0x09,0x08,0x09,0x0a,0x08,0x11,0x11,0x0f,0x05,0x08,0x0d,0x10,0x0e,0x10,0x0d,0x0d,0x0d,0x0a,0x0b,0x0a,0x0c,0x0e,0x0a,0x07,0x08,0x0e,0x10,0x0b,0x09,0x05,0x05,0x0d,0x0c,0x0a,0x0d,0x0c,0x0a,0x0a,0x0e,0x0c,0x0c,0x0e,0x12,0x12,\r\n0x0a,0x13,0x07,0x07,0x04,0x04,0x0d,0x0b,0x09,0x0b,0x03,0x0a,0x06,0x06,0x0b,0x0b,0x07,0x04,0x04,0x07,0x17,0x0c,0x0a,0x0c,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x05,0x07,0x06,0x06,0x06,0x04,0x05,0x04,0x06,0x04,0x07,0x09,0x05,0x0a,0x08,0x0b,0x09,0x05,0x0d,0x0b,0x0b,0x09,0x0b,0x0b,0x0d,0x0d,0x07,0x07,\r\n0x07,0x12,0x11,0x12,0x09,0x0d,0x0b,0x05,0x0a,0x08,0x0c,0x09,0x0c,0x09,0x0b,0x08,0x04,0x0c,0x0a,0x0c,0x0a,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x09,0x05,0x09,0x06,0x09,0x06,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x07,0x0b,0x07,0x0a,0x08,0x0a,0x06,0x0a,0x08,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0b,0x09,0x09,0x0e,0x0e,0x0c,0x0b,0x08,\r\n0x0b,0x09,0x0d,0x08,0x09,0x07,0x15,0x0c,0x09,0x0c,0x04,0x07,0x0f,0x06,0x0b,0x07,0x07,0x0b,0x07,0x0c,0x0a,0x0c,0x09,0x0c,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x05,0x0b,0x09,0x09,0x09,0x05,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,\r\n0x0b,0x07,0x0a,0x08,0x0a,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x12,0x0e,0x0b,0x09,0x05,0x0c,0x0a,0x10,0x10,0x0e,0x0b,0x04,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0b,0x09,0x04,0x08,0x0a,0x0b,0x12,0x12,0x12,0x11,0x07,0x07,0x04,0x05,0x05,0x0c,0x0b,0x0f,0x07,0x0f,0x0d,0x10,0x05,0x0c,0x0b,0x0a,0x0b,0x0d,0x05,0x0b,0x0c,0x11,\r\n0x0e,0x0a,0x0e,0x0e,0x0b,0x0a,0x0a,0x0b,0x0b,0x0f,0x0e,0x05,0x0b,0x0c,0x08,0x0b,0x05,0x0b,0x0a,0x0a,0x08,0x0b,0x0b,0x05,0x0a,0x09,0x0b,0x0a,0x08,0x0b,0x0b,0x09,0x0b,0x0a,0x0e,0x0f,0x05,0x0b,0x0b,0x0b,0x0f,0x0a,0x0d,0x09,0x0c,0x0a,0x05,0x13,0x13,0x0e,0x0b,0x0b,0x0d,0x0c,0x0b,0x0b,0x09,0x0d,0x0a,0x10,0x0a,0x0e,0x0e,0x0b,\r\n0x0d,0x11,0x0d,0x0e,0x0e,0x0b,0x0c,0x0a,0x0b,0x0e,0x0b,0x0e,0x0d,0x12,0x13,0x0d,0x0f,0x0b,0x0c,0x13,0x0b,0x0a,0x0b,0x0a,0x07,0x0a,0x0a,0x0e,0x08,0x0b,0x0b,0x09,0x0a,0x0d,0x0b,0x0b,0x0b,0x0b,0x09,0x08,0x09,0x0d,0x09,0x0b,0x0b,0x0f,0x10,0x0b,0x0d,0x0a,0x09,0x0f,0x0a,0x0a,0x0b,0x07,0x09,0x08,0x05,0x0f,0x0f,0x0b,0x09,0x09,\r\n0x0b,0x09,0x07,0x13,0x15,0x0c,0x07,0x07,0x07,0x07,0x05,0x0a,0x08,0x0b,0x0e,0x0b,0x0d,0x0b,0x06,0x06,0x05,0x05,0x09,0x09,0x09,0x09,0x06,0x06,0x06,0x09,0x06,0x09,0x06,0x06,0x06,0x09,0x09,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x06,0x0a,\r\n0x0a,0x0e,0x0b,0x05,0x07,0x05,0x05,0x0a,0x08,0x11,0x0f,0x0c,0x0a,0x0b,0x09,0x0e,0x0b,0x0b,0x09,0x0b,0x09,0x0c,0x09,0x0c,0x0b,0x0d,0x0b,0x0e,0x0a,0x0e,0x0b,0x06,0x06,0x06,0x06,0x08,0x08,0x09,0x09,0x09,0x09,0x05,0x05,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x09,0x0d,0x0b,0x0d,0x0b,0x0d,\r\n0x0b,0x0d,0x0b,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x05,0x05,0x05,0x05,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x09,0x05,0x09,0x05,0x09,0x05,0x09,0x05,0x11,0x10,0x11,0x10,0x11,0x10,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,\r\n0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0a,0x06,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0c,0x09,0x0c,0x09,0x12,0x0e,0x12,0x0e,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,\r\n0x09,0x0b,0x06,0x0e,0x09,0x0a,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x09,0x09,0x0a,\r\n0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x08,0x08,0x0b,0x0b,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x0f,0x0f,0x0d,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x0c,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x10,0x0e,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,\r\n0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x09,0x0d,0x0e,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x0d,0x0c,0x11,0x05,0x05,0x0b,0x09,0x05,0x09,0x11,0x0e,0x0b,0x0e,0x12,0x0f,0x0b,0x0b,0x0b,0x0a,0x08,0x0a,0x06,0x06,0x0a,0x06,0x0a,0x0e,0x0e,0x0b,0x0a,0x0b,0x09,0x0c,0x0c,0x08,0x08,0x0a,0x0a,0x07,0x07,0x0a,0x05,0x07,0x09,0x05,0x18,0x16,0x13,0x10,\r\n0x0e,0x0a,0x14,0x12,0x0f,0x0c,0x0a,0x05,0x05,0x0e,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0d,0x0b,0x0a,0x0c,0x0a,0x0c,0x0a,0x10,0x10,0x0d,0x0b,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0e,0x0b,0x0c,0x08,0x05,0x18,0x16,0x13,0x0d,0x0b,0x13,0x0d,0x0e,0x0b,0x0c,0x0a,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x05,0x05,0x05,0x05,0x0e,0x0b,\r\n0x0e,0x0b,0x0b,0x07,0x0b,0x07,0x0d,0x0b,0x0d,0x0b,0x0a,0x08,0x0d,0x0b,0x0e,0x0b,0x0b,0x0b,0x09,0x0c,0x0a,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x09,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x09,0x09,0x0b,0x0b,0x0a,0x0c,0x08,0x08,0x0a,0x0a,0x05,0x0b,0x0b,0x0a,0x09,0x09,0x0b,0x0b,0x0b,0x05,0x05,0x06,0x05,0x07,\r\n0x05,0x0b,0x10,0x10,0x10,0x0b,0x0b,0x0b,0x0b,0x0d,0x0e,0x0c,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x09,0x09,0x08,0x05,0x05,0x05,0x05,0x06,0x06,0x0b,0x0b,0x0b,0x09,0x0e,0x09,0x08,0x09,0x0a,0x08,0x08,0x07,0x07,0x07,0x09,0x0c,0x09,0x0a,0x0a,0x0b,0x05,0x09,0x07,0x0b,0x07,0x07,0x11,0x12,0x13,0x0c,0x09,0x0e,0x0f,0x0b,0x0b,0x09,\r\n0x09,0x0a,0x0b,0x0b,0x0d,0x0b,0x0c,0x0f,0x0b,0x0d,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x0a,0x0c,0x09,0x11,0x10,0x0b,0x0a,0x0c,0x0a,0x0c,0x09,0x0b,0x09,0x0d,0x0b,0x0b,0x08,0x0b,0x0b,0x09,0x05,0x0e,0x09,0x09,0x10,0x0d,0x0c,0x0b,0x11,0x0e,0x0d,0x09,0x11,0x0d,0x0e,0x0b,0x12,0x0e,0x0a,0x09,0x0f,0x0e,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,\r\n0x19,0x15,0x10,0x0c,0x15,0x11,0x10,0x0d,0x0b,0x08,0x0a,0x07,0x08,0x00,0x00,0x13,0x12,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0a,0x09,0x0b,0x09,0x0d,0x0b,0x10,0x0d,0x13,0x10,0x0e,0x0b,0x0c,0x09,0x0a,0x08,0x11,0x0d,0x0d,0x0b,0x10,0x0c,0x10,0x0c,0x05,0x10,0x0e,0x0b,0x0a,0x0d,0x0b,0x0c,0x0b,0x0c,0x0a,0x0c,0x0a,0x10,0x10,0x0a,0x0a,\r\n0x0e,0x0a,0x0e,0x0a,0x10,0x0e,0x0a,0x08,0x0a,0x08,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0d,0x0b,0x0f,0x0d,0x0b,0x0b,0x10,0x10,0x0f,0x0e,0x0b,0x09,0x11,0x0f,0x13,0x10,0x0e,0x0a,0x0d,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x04,0x04,0x0b,0x06,0x06,0x03,0x04,0x04,0x04,0x05,0x08,0x05,0x04,0x07,0x04,0x04,0x04,0x06,0x06,0x04,0x04,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x05,0x06,0x06,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x03,0x05,0x05,0x04,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x06,0x08,0x06,0x05,0x05,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x07,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x0c,0x06,0x0c,0x06,0x0b,0x0b,0x06,0x06,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x09,0x0d,0x10,0x09,0x09,0x0a,0x0b,0x08,0x08,0x05,0x06,0x09,0x07,0x0d,0x0b,0x0b,\r\n0x09,0x0c,0x0c,0x0c,0x12,0x0a,0x0b,0x0b,0x09,0x09,0x09,0x08,0x0a,0x0b,0x0e,0x0b,0x09,0x0e,0x09,0x08,0x08,0x0a,0x07,0x09,0x0b,0x09,0x0b,0x0b,0x07,0x09,0x07,0x07,0x08,0x06,0x06,0x08,0x08,0x04,0x04,0x07,0x05,0x0a,0x08,0x08,0x08,0x07,0x06,0x07,0x06,0x08,0x0a,0x06,0x06,0x07,0x09,0x07,0x07,0x06,0x06,0x05,0x05,0x07,0x03,0x06,\r\n0x09,0x06,0x07,0x05,0x07,0x07,0x07,0x04,0x06,0x06,0x09,0x05,0x06,0x06,0x06,0x07,0x08,0x06,0x03,0x04,0x06,0x05,0x06,0x06,0x07,0x08,0x06,0x0b,0x03,0x07,0x0a,0x11,0x0c,0x0a,0x0a,0x10,0x0c,0x10,0x0e,0x0a,0x0b,0x0a,0x09,0x15,0x09,0x0b,0x11,0x12,0x12,0x0c,0x0c,0x0c,0x09,0x09,0x0a,0x08,0x09,0x0a,0x04,0x00,0x00,0x00,0x00,0x0b,\r\n0x0c,0x0c,0x0c,0x09,0x07,0x0b,0x0b,0x06,0x10,0x0b,0x0b,0x07,0x06,0x09,0x06,0x09,0x0b,0x09,0x0b,0x11,0x0c,0x06,0x05,0x0b,0x0a,0x0b,0x0b,0x0b,0x06,0x0b,0x09,0x05,0x10,0x0b,0x0b,0x07,0x08,0x08,0x09,0x09,0x09,0x0a,0x0b,0x0b,0x0a,0x08,0x08,0x0e,0x05,0x09,0x05,0x0b,0x08,0x07,0x05,0x05,0x07,0x05,0x03,0x03,0x07,0x06,0x03,0x03,\r\n0x03,0x03,0x03,0x03,0x03,0x04,0x09,0x09,0x06,0x06,0x07,0x06,0x07,0x04,0x03,0x04,0x06,0x07,0x06,0x06,0x05,0x05,0x05,0x06,0x05,0x07,0x00,0x00,0x00,0x00,0x04,0x06,0x06,0x07,0x05,0x06,0x0a,0x0a,0x0a,0x0a,0x06,0x00,0x00,0x00,0x00,0x09,0x06,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x0b,0x0b,0x0b,0x0b,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x06,0x06,0x0f,0x0c,0x0d,0x0b,0x0e,0x0c,0x12,0x0e,0x0a,0x07,0x0a,0x0d,0x0a,0x10,0x0d,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x06,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x13,0x08,0x05,0x0a,0x0b,0x08,0x0a,0x0a,0x0b,0x0b,0x0a,0x13,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0c,0x0a,0x0a,0x0a,0x06,0x0b,0x06,0x0e,\r\n0x0d,0x0a,0x06,0x10,0x0a,0x10,0x05,0x06,0x0b,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x10,0x05,0x0b,0x05,0x0a,0x08,0x05,0x05,0x0a,0x05,0x0e,0x05,0x11,0x0a,0x11,0x11,0x0b,0x0b,0x0b,0x0a,0x0a,0x08,0x08,0x16,0x16,0x19,0x19,0x10,0x10,0x0a,0x0a,0x03,0x13,0x0e,0x10,0x0d,0x0b,0x0d,0x0a,0x0a,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x0b,0x05,0x0c,0x00,0x0c,0x0c,0x0c,0x06,0x0a,0x0a,0x11,0x06,0x11,0x06,0x0b,0x0d,0x0b,0x08,0x11,0x0a,0x11,0x0a,0x0e,0x10,0x06,0x0a,0x0a,0x08,0x05,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0a,0x0d,0x0c,0x11,0x06,0x0a,0x08,0x0d,0x0a,0x06,0x0a,0x0a,0x0a,0x11,0x06,0x11,0x06,0x05,0x0b,0x07,0x13,0x0a,0x0a,0x0c,0x0c,0x13,\r\n0x0a,0x00,0x00,0x00,0x0c,0x00,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x0a,0x0a,0x0e,0x10,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x08,0x08,0x08,0x0a,0x08,0x08,0x08,0x16,0x10,0x16,0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x0a,0x0b,0x0b,0x0b,0x13,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x0e,0x0e,0x15,0x13,0x11,0x0a,0x10,0x0a,0x10,0x0a,0x10,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x0d,\r\n0x06,0x0d,0x06,0x0d,0x0d,0x06,0x0d,0x06,0x0a,0x0d,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x0e,0x10,0x06,0x0a,0x0e,0x10,0x0e,0x10,0x00,0x00,0x00,0x00,0x00,0x15,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x08,0x00,0x00,0x0b,0x00,0x00,0x00,0x16,0x10,0x19,0x13,0x0a,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x11,0x11,0x07,0x0b,0x0b,0x0b,0x17,0x10,0x0a,0x1d,0x15,0x06,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x08,0x08,0x0e,0x0d,0x0d,0x0a,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x18,0x1d,0x00,0x00,0x00,0x00,0x00,0x0b,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x11,0x08,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0d,0x0b,0x0a,0x0a,0x08,0x16,0x10,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x13,0x0a,0x0a,0x13,0x0a,0x0a,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x0d,0x0d,\r\n0x06,0x06,0x08,0x08,0x16,0x10,0x0c,0x0b,0x0b,0x00,0x0a,0x0a,0x0a,0x07,0x0b,0x0d,0x0c,0x0a,0x0a,0x07,0x05,0x0e,0x0b,0x0b,0x07,0x0b,0x09,0x09,0x09,0x09,0x05,0x0a,0x08,0x0c,0x09,0x0b,0x09,0x0a,0x08,0x0d,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x09,0x09,0x09,0x05,0x0a,0x0b,0x0b,0x0a,0x06,0x0e,0x0b,0x0c,0x0a,\r\n0x0c,0x09,0x0b,0x0a,0x08,0x0d,0x07,0x08,0x08,0x09,0x0b,0x0b,0x0a,0x13,0x0a,0x13,0x06,0x05,0x03,0x0a,0x04,0x02,0x00,0x03,0x04,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x12,0x08,0x0e,0x0b,0x12,0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x12,0x10,0x09,0x10,0x09,0x10,0x0c,\r\n0x0d,0x0d,0x0d,0x0f,0x10,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0e,0x0b,0x14,0x10,0x09,0x09,0x05,0x05,0x05,0x07,0x04,0x0b,0x04,0x04,0x10,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x0c,0x0b,0x08,0x09,0x0d,0x05,0x06,0x0d,0x0d,0x05,\r\n0x0b,0x0a,0x0a,0x0d,0x0d,0x05,0x08,0x0d,0x0b,0x0c,0x0c,0x0b,0x0b,0x0d,0x0b,0x0f,0x0e,0x0a,0x0a,0x0a,0x04,0x07,0x0b,0x0b,0x0a,0x0a,0x0a,0x0b,0x0c,0x09,0x0d,0x0a,0x0a,0x0d,0x0b,0x0e,0x0a,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0b,0x08,0x09,0x0d,0x06,0x07,0x0d,0x06,0x0b,0x0a,0x0a,0x0d,0x08,0x0d,0x0c,0x0c,0x0b,0x0d,0x0b,0x0f,\r\n0x0e,0x05,0x0b,0x0a,0x0c,0x0c,0x17,0x00,0x0c,0x0a,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x05,0x00,0x0e,0x0c,0x0d,0x0d,0x0a,0x0d,0x0e,0x0e,0x09,0x0c,0x0e,0x0e,0x0d,0x0e,0x0f,0x0f,\r\n0x0d,0x0a,0x0b,0x0e,0x0d,0x0b,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0b,0x0c,0x0d,0x0c,0x0f,0x0c,0x0c,0x0c,0x0d,0x10,0x09,0x0b,0x0b,0x11,0x0a,0x0a,0x0f,0x11,0x0c,0x0a,0x14,0x0b,0x0b,0x0e,0x0a,0x0a,0x0e,0x0b,0x0e,0x0f,0x11,0x0a,0x0f,0x0a,0x0c,0x0a,0x0c,0x0b,0x0c,0x0a,0x0b,0x0f,0x0a,0x0c,0x0d,0x0a,0x0a,0x0b,0x12,0x0a,0x0a,0x0b,\r\n0x0b,0x08,0x06,0x0b,0x0b,0x0b,0x0a,0x0b,0x11,0x0b,0x11,0x09,0x0b,0x11,0x0d,0x0b,0x11,0x0e,0x0e,0x11,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x0b,0x0a,0x0b,0x0b,0x11,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0f,0x0d,0x0c,0x0a,0x0f,0x0d,0x0d,0x0b,0x0d,0x0d,0x0e,0x0e,0x0b,0x0d,0x0d,\r\n0x0e,0x0d,0x0f,0x0d,0x0e,0x0e,0x0d,0x0c,0x0d,0x0d,0x0e,0x0f,0x0c,0x0e,0x0e,0x02,0x02,0x03,0x04,0x03,0x05,0x07,0x10,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0b,0x0c,0x0b,0x0b,0x06,0x10,0x0b,0x0b,0x0b,0x0a,0x0b,0x0a,0x0b,0x05,0x0b,0x0a,0x0b,0x08,0x10,0x0a,0x0b,0x0b,0x0b,0x10,0x0b,0x0b,0x07,0x10,0x0b,0x0b,0x0d,0x0d,0x04,0x05,0x16,\r\n0x15,0x15,0x16,0x1b,0x0a,0x0a,0x05,0x0a,0x07,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x0a,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x09,0x0a,0x0b,0x08,0x08,0x0b,\r\n0x0c,0x05,0x06,0x09,0x08,0x0e,0x0c,0x0c,0x09,0x0c,0x09,0x08,0x08,0x0b,0x0a,0x0f,0x0a,0x09,0x09,0x0d,0x0f,0x08,0x0c,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x08,0x08,0x05,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,\r\n0x08,0x0b,0x0b,0x0a,0x0c,0x0c,0x05,0x05,0x05,0x05,0x05,0x0b,0x06,0x09,0x08,0x08,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0d,0x0c,0x0a,0x09,0x07,0x0a,0x08,0x09,0x0c,0x0c,0x05,\r\n0x09,0x0a,0x0e,0x0c,0x09,0x0c,0x0c,0x09,0x09,0x08,0x09,0x0c,0x0a,0x0c,0x0c,0x0a,0x08,0x0c,0x05,0x0c,0x09,0x0c,0x05,0x09,0x08,0x0b,0x08,0x0a,0x08,0x05,0x05,0x06,0x0f,0x10,0x0c,0x09,0x09,0x0c,0x0a,0x09,0x09,0x08,0x0b,0x08,0x0e,0x08,0x0c,0x0c,0x09,0x0b,0x0e,0x0c,0x0c,0x0c,0x09,0x0a,0x08,0x09,0x0c,0x0a,0x0c,0x0a,0x0f,0x10,\r\n0x0b,0x0d,0x09,0x0a,0x10,0x09,0x08,0x0b,0x0b,0x0c,0x11,0x11,0x0d,0x0a,0x0b,0x08,0x0b,0x0b,0x0b,0x0d,0x0a,0x0a,0x0d,0x0b,0x0b,0x07,0x0c,0x0c,0x0b,0x09,0x09,0x11,0x0e,0x09,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x07,0x12,0x0b,0x0b,0x0b,0x0c,0x0c,0x0a,0x0a,0x05,0x0e,0x0d,0x0d,0x09,0x0d,0x04,0x04,0x08,0x08,0x04,0x04,0x0c,0x08,\r\n0x05,0x0e,0x0d,0x05,0x04,0x04,0x09,0x07,0x07,0x04,0x04,0x04,0x07,0x0d,0x09,0x06,0x0c,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0b,0x07,0x08,0x0a,0x08,0x04,0x04,0x07,0x0a,0x06,0x0d,0x0d,0x0d,0x11,0x0e,0x11,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x0e,0x10,0x06,0x06,0x0a,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0a,0x0a,0x16,\r\n0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x0a,0x0a,0x11,0x11,0x0a,0x0a,0x0e,0x10,0x06,0x06,0x0e,0x10,0x06,0x06,0x0e,0x10,0x06,0x06,0x13,0x0e,0x10,0x0a,0x0b,0x0b,0x0d,0x06,0x0d,0x0e,0x0a,0x0a,0x06,0x06,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x11,0x06,0x0e,0x0a,\r\n0x0a,0x05,0x0a,0x0a,0x0a,0x0a,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x16,0x10,0x16,0x10,0x16,0x10,0x19,0x13,0x19,0x13,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x0e,0x0a,0x0a,0x0e,0x0a,0x0a,0x11,\r\n0x0a,0x15,0x13,0x11,0x0a,0x10,0x0a,0x10,0x0a,0x10,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x0d,0x0d,0x06,0x06,0x0d,0x06,0x0d,0x06,0x0d,0x0a,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x0a,0x06,0x06,0x06,0x06,0x00,0x16,0x10,0x19,0x13,0x11,0x0a,\r\n0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0a,0x0a,0x08,0x16,0x10,0x13,0x13,0x11,0x11,0x11,0x0b,0x0b,0x0b,0x0b,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x16,0x10,0x0b,0x0d,0x0b,0x0b,0x0b,0x0d,0x0b,0x0b,0x16,0x16,0x10,0x10,0x08,0x08,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x06,0x06,0x0e,0x10,0x06,0x06,0x0e,0x10,\r\n0x06,0x06,0x0e,0x10,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x11,0x06,0x11,0x06,0x0b,0x0d,0x0b,0x0b,0x16,0x16,0x10,0x10,0x16,0x16,0x10,0x10,0x10,0x10,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0x06,0x05,0x00,0x00,0x00,0x10,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0d,0x0d,0x0d,\r\n0x0d,0x0d,0x0d,0x0b,0x10,0x0b,0x10,0x0b,0x10,0x0b,0x10,0x0d,0x0d,0x0d,0x05,0x05,0x0a,0x08,0x0b,0x0c,0x0b,0x0a,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0c,0x0a,0x0d,0x0e,0x0c,0x0e,0x10,0x0c,0x0f,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x0b,0x0a,0x09,0x0a,0x0c,0x0b,0x0d,0x0b,0x0c,0x0b,0x0b,0x0b,0x0a,0x0a,0x0e,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x0f,0x0e,0x0f,0x12,0x12,0x0d,0x12,0x12,0x0e,0x11,0x10,0x0b,0x0f,0x10,0x0e,0x0b,0x10,0x0e,0x0d,0x0d,0x0b,0x0c,0x0e,0x0f,0x0d,0x0c,0x0d,0x0b,0x0a,0x12,0x11,0x11,0x10,0x12,0x12,0x0d,0x12,0x12,0x0d,0x0f,\r\n0x0f,0x0e,0x0e,0x0e,0x0c,0x11,0x0f,0x10,0x0e,0x0e,0x0b,0x0e,0x0d,0x0d,0x10,0x0e,0x0e,0x11,0x0a,0x0a,0x0b,0x0a,0x0c,0x0c,0x0d,0x0e,0x0b,0x0b,0x0b,0x0a,0x0b,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0b,0x0c,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x0c,0x0f,0x10,0x0c,0x0c,0x0c,0x0f,0x0c,0x0d,0x0a,0x09,0x0b,0x0b,0x09,0x09,\r\n0x0a,0x0b,0x09,0x09,0x0c,0x09,0x0a,0x09,0x0a,0x0f,0x0b,0x10,0x0a,0x0b,0x0b,0x0e,0x06,0x0f,0x0d,0x0e,0x0d,0x0b,0x0e,0x0b,0x0f,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x08,0x09,0x09,0x09,0x09,0x09,0x06,0x06,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x0c,0x05,0x05,0x05,0x06,0x06,\r\n0x05,0x05,0x05,0x06,0x05,0x05,0x05,0x11,0x11,0x11,0x11,0x09,0x0e,0x0e,0x09,0x08,0x09,0x0a,0x0b,0x09,0x10,0x10,0x10,0x08,0x13,0x09,0x10,0x10,0x10,0x0f,0x0b,0x09,0x09,0x0f,0x0b,0x0f,0x0d,0x0a,0x09,0x08,0x13,0x08,0x0a,0x09,0x09,0x09,0x09,0x09,0x1a,0x10,0x10,0x08,0x05,0x09,0x05,0x09,0x05,0x05,0x05,0x09,0x0b,0x0b,0x0a,0x07,\r\n0x07,0x04,0x04,0x04,0x07,0x04,0x08,0x10,0x04,0x11,0x11,0x11,0x0b,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x0d,0x16,0x16,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x09,\r\n0x0b,0x09,0x0a,0x08,0x07,0x07,0x0d,0x0a,0x0e,0x08,0x15,0x11,0x0b,0x0b,0x12,0x0f,0x10,0x0e,0x13,0x0f,0x12,0x0f,0x0c,0x09,0x0e,0x0b,0x12,0x0e,0x0e,0x0c,0x0e,0x0b,0x10,0x0d,0x11,0x0d,0x15,0x10,0x0e,0x0b,0x0e,0x0b,0x17,0x11,0x0f,0x00,0x13,0x13,0x13,0x09,0x00,0x00,0x0b,0x0a,0x0d,0x0b,0x0a,0x08,0x14,0x11,0x12,0x10,0x0e,0x0b,\r\n0x0d,0x0b,0x0a,0x08,0x0e,0x0b,0x0a,0x08,0x10,0x0d,0x0d,0x0b,0x13,0x10,0x0a,0x0b,0x0e,0x0e,0x0f,0x09,0x04,0x09,0x0d,0x08,0x13,0x13,0x05,0x00,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x08,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x09,0x0d,0x0e,0x05,0x04,0x05,0x04,0x0d,0x0b,0x0e,0x0c,0x0b,0x09,0x0a,0x09,0x0b,0x0b,0x08,\r\n0x08,0x15,0x10,0x16,0x11,0x13,0x10,0x11,0x0d,0x11,0x0d,0x11,0x0d,0x0c,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0a,0x06,0x09,0x05,0x0e,0x0b,0x10,0x0d,0x19,0x13,0x0b,0x0b,0x0d,0x0d,0x0f,0x10,0x0e,0x0b,0x13,0x0f,0x0a,0x08,0x0b,0x09,0x0c,0x09,0x12,0x0e,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x09,0x08,0x09,0x07,0x09,0x07,0x0a,0x0a,0x06,\r\n0x0d,0x06,0x12,0x0d,0x07,0x0b,0x0c,0x09,0x0e,0x0b,0x07,0x07,0x0b,0x0b,0x0b,0x09,0x05,0x0e,0x0b,0x07,0x07,0x0c,0x09,0x0d,0x07,0x0f,0x0b,0x0c,0x09,0x0d,0x0b,0x0b,0x09,0x0e,0x0b,0x0b,0x07,0x0a,0x08,0x0e,0x08,0x0a,0x10,0x09,0x0b,0x11,0x05,0x16,0x11,0x11,0x16,0x11,0x11,0x11,0x11,0x11,0x12,0x0a,0x09,0x0c,0x0d,0x11,0x0d,0x12,\r\n0x05,0x09,0x0b,0x10,0x14,0x0d,0x14,0x0c,0x0c,0x0f,0x0d,0x16,0x12,0x0a,0x11,0x06,0x11,0x06,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x10,0x10,0x13,0x0a,0x0a,0x13,0x0e,0x0a,0x0a,0x0e,0x0d,0x06,0x06,0x0d,0x0b,0x0b,0x0b,0x0b,0x0e,0x06,0x06,0x10,0x0e,0x06,0x06,0x10,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0a,0x08,0x0b,0x0a,0x0e,0x0b,0x0b,0x11,0x0d,0x0e,0x0e,0x10,0x10,0x0b,0x09,0x13,0x0f,0x14,0x10,0x0d,0x0b,0x06,0x06,0x0b,0x0c,0x08,0x0b,0x0a,0x0b,0x09,0x0e,0x0f,0x08,0x0b,0x08,0x04,0x07,0x0a,0x0a,0x04,0x04,0x03,0x04,0x07,\r\n0x07,0x07,0x09,0x1c,0x26,0x06,0x08,0x03,0x05,0x07,0x08,0x06,0x09,0x0a,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x09,0x09,0x19,0x0a,0x0e,0x11,0x11,0x0c,0x09,0x0b,0x0e,0x0e,0x09,0x06,0x0d,0x0a,0x0d,0x0b,0x0d,0x0a,0x0a,0x0e,0x0b,0x0b,0x0a,0x0e,0x0c,0x10,0x09,0x0a,0x0c,0x06,0x0b,0x06,0x07,0x05,0x11,\r\n0x0b,0x0b,0x0a,0x0a,0x0b,0x12,0x12,0x12,0x13,0x13,0x0a,0x09,0x05,0x0a,0x09,0x0c,0x09,0x0d,0x05,0x0b,0x0b,0x10,0x10,0x0c,0x0a,0x0b,0x0a,0x0a,0x09,0x0a,0x09,0x09,0x06,0x06,0x05,0x04,0x07,0x0b,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x05,0x05,0x05,0x05,0x05,0x20,0x13,0x11,\r\n0x14,0x05,0x05,0x06,0x08,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x11,0x06,0x06,0x11,0x05,0x0a,0x0a,0x19,0x13,0x13,0x19,0x11,0x0a,0x0a,0x11,0x0a,0x0a,0x08,0x08,0x00,0x00,0x07,0x0e,0x0b,0x0d,0x0b,0x18,0x14,0x0d,0x0a,0x0d,0x0a,0x19,0x13,0x0e,0x0b,0x07,0x06,0x0c,0x00,0x0d,0x0a,0x06,0x06,0x03,0x09,\r\n0x06,0x07,0x05,0x04,0x09,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x04,0x0a,0x08,0x0b,0x0b,0x0a,0x12,0x0f,0x0f,0x0f,0x10,0x12,0x0c,0x0d,0x0b,0x07,0x12,0x15,0x08,0x16,0x0a,0x10,0x11,0x11,0x11,0x08,0x0e,0x13,0x0e,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x0b,0x0b,0x0b,0x10,0x0a,\r\n0x0a,0x11,0x06,0x06,0x11,0x06,0x06,0x11,0x09,0x09,0x00,0x08,0x10,0x06,0x06,0x13,0x0a,0x0a,0x0e,0x0a,0x0a,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x1d,0x1d,0x11,0x00,0x00,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0c,0x0c,0x0c,\r\n0x11,0x0c,0x0c,0x0f,0x13,0x0c,0x0c,0x14,0x0c,0x0c,0x12,0x0c,0x0d,0x0f,0x0c,0x0f,0x10,0x11,0x0c,0x0f,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0d,0x0c,0x0f,0x0b,0x0d,0x0f,0x0c,0x0c,0x0b,0x0f,0x0c,0x0c,0x0c,0x0d,0x08,0x0a,0x0c,0x0f,0x0f,0x0a,0x00,0x00,0x15,0x2a,0x0e,0x00,0x02,0x06,0x06,0x08,0x0c,0x0b,0x11,0x11,0x05,0x06,0x06,0x09,\r\n0x0e,0x05,0x08,0x05,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x0e,0x0e,0x0e,0x09,0x14,0x0e,0x0c,0x0d,0x0f,0x0b,0x0a,0x0e,0x0f,0x06,0x08,0x0c,0x0a,0x13,0x10,0x10,0x0c,0x10,0x0d,0x0b,0x0b,0x0e,0x0d,0x14,0x0c,0x0c,0x0c,0x06,0x08,0x06,0x0e,0x09,0x06,0x0b,0x0c,0x0a,0x0c,0x0b,0x07,0x0c,0x0c,0x05,0x05,\r\n0x0a,0x05,0x12,0x0c,0x0c,0x0c,0x0c,0x07,0x09,0x07,0x0c,0x0a,0x0f,0x0a,0x0a,0x0a,0x06,0x05,0x06,0x0e,0x0e,0x0e,0x0d,0x0b,0x10,0x10,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x05,0x05,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x0b,0x0b,0x09,0x09,0x0a,0x0b,0x08,0x13,0x13,0x10,\r\n0x06,0x09,0x0e,0x12,0x10,0x11,0x0e,0x0e,0x0e,0x0b,0x0c,0x0b,0x0d,0x10,0x0b,0x08,0x09,0x10,0x11,0x0c,0x09,0x06,0x06,0x0e,0x0e,0x0b,0x0e,0x0e,0x0b,0x0b,0x0f,0x0e,0x0e,0x10,0x14,0x13,0x0b,0x15,0x08,0x08,0x05,0x05,0x0e,0x0c,0x0a,0x0c,0x04,0x0b,0x07,0x07,0x0c,0x0c,0x08,0x05,0x05,0x08,0x19,0x0e,0x0b,0x0e,0x0b,0x0b,0x06,0x06,\r\n0x06,0x06,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x05,0x08,0x07,0x07,0x06,0x04,0x06,0x04,0x07,0x04,0x08,0x0a,0x06,0x0b,0x09,0x0c,0x0a,0x05,0x0f,0x0c,0x0c,0x0a,0x0c,0x0c,0x0e,0x0e,0x07,0x08,0x08,0x14,0x13,0x14,0x0a,0x0e,0x0c,0x06,0x0b,0x09,0x0d,0x0a,0x0d,0x0a,0x0c,0x09,0x05,0x0e,0x0b,0x0e,0x0b,0x0f,0x0e,0x0f,0x0b,0x0b,0x0b,0x0b,\r\n0x0a,0x05,0x0a,0x06,0x0a,0x07,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x07,0x0d,0x07,0x0b,0x09,0x0b,0x07,0x0b,0x09,0x0e,0x0c,0x0e,0x0c,0x0c,0x0a,0x0c,0x0a,0x0a,0x10,0x10,0x0d,0x0c,0x09,0x0c,0x0a,0x0f,0x09,0x0a,0x08,0x17,0x0d,0x0a,0x0d,0x05,0x08,0x11,0x07,0x0d,0x07,0x07,0x0d,0x07,0x0e,0x0b,0x0d,0x0a,0x0d,0x0a,0x0b,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x06,0x05,0x06,0x05,0x06,0x05,0x06,0x05,0x08,0x05,0x0c,0x0a,0x0a,0x0a,0x05,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x07,0x0b,0x09,0x0b,0x07,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x14,0x0f,0x0c,0x0a,0x05,0x0e,0x0b,0x12,0x11,0x10,0x0c,0x05,0x14,0x0f,\r\n0x14,0x0f,0x14,0x0f,0x0c,0x0a,0x05,0x09,0x0b,0x0d,0x13,0x13,0x14,0x13,0x08,0x08,0x05,0x06,0x06,0x0e,0x0c,0x10,0x08,0x11,0x0e,0x11,0x06,0x0e,0x0c,0x0b,0x0c,0x0f,0x06,0x0c,0x0d,0x13,0x10,0x0b,0x10,0x0f,0x0c,0x0b,0x0b,0x0c,0x0c,0x10,0x10,0x06,0x0c,0x0d,0x09,0x0c,0x06,0x0c,0x0c,0x0b,0x09,0x0c,0x0c,0x06,0x0b,0x0a,0x0c,0x0b,\r\n0x09,0x0c,0x0c,0x0a,0x0c,0x0b,0x10,0x11,0x06,0x0c,0x0c,0x0c,0x11,0x0b,0x0f,0x0a,0x0d,0x0b,0x06,0x15,0x15,0x0f,0x0c,0x0c,0x0f,0x0e,0x0c,0x0c,0x0a,0x0f,0x0b,0x12,0x0b,0x10,0x10,0x0c,0x0e,0x13,0x0f,0x10,0x0f,0x0c,0x0d,0x0b,0x0c,0x0f,0x0c,0x10,0x0e,0x14,0x15,0x0f,0x10,0x0c,0x0d,0x15,0x0c,0x0b,0x0c,0x0b,0x08,0x0b,0x0b,0x10,\r\n0x09,0x0c,0x0c,0x0a,0x0b,0x0f,0x0c,0x0c,0x0c,0x0c,0x0a,0x09,0x0a,0x0e,0x0a,0x0d,0x0c,0x11,0x11,0x0c,0x0f,0x0b,0x0a,0x11,0x0b,0x0b,0x0c,0x08,0x0a,0x09,0x05,0x11,0x11,0x0c,0x0a,0x0a,0x0c,0x0a,0x08,0x15,0x18,0x0d,0x07,0x08,0x08,0x08,0x05,0x0b,0x09,0x0c,0x10,0x0d,0x0f,0x0c,0x06,0x07,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x06,0x06,\r\n0x06,0x0a,0x06,0x0a,0x06,0x06,0x06,0x0a,0x0a,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x06,0x05,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,\r\n0x0c,0x10,0x0c,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x0e,0x0c,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x07,0x0b,0x0b,0x10,0x0c,0x06,0x08,0x05,0x05,0x0b,0x09,0x13,0x10,0x0d,0x0b,0x0c,0x0a,0x10,0x0d,0x0c,0x0a,0x0c,0x0a,0x0d,0x0a,0x0e,0x0c,0x0e,0x0c,0x0f,\r\n0x0b,0x10,0x0c,0x06,0x06,0x06,0x06,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x0b,0x0e,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0a,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x07,0x0e,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,\r\n0x0c,0x06,0x05,0x06,0x05,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x0a,0x05,0x13,0x12,0x13,0x12,0x13,0x12,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,0x09,0x0b,\r\n0x07,0x0b,0x07,0x0b,0x07,0x0b,0x07,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0d,0x0a,0x0d,0x0a,0x14,0x0f,0x14,0x0f,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x07,0x0f,0x0a,0x0b,0x05,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x14,0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x0d,0x0d,0x09,0x09,0x0c,0x0c,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x0f,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x08,0x08,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0e,0x0e,0x0d,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x10,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0a,0x0f,0x10,0x0c,0x0c,0x0c,0x0b,0x0b,0x0a,0x0f,0x0d,0x12,0x06,0x06,0x0c,0x0a,0x05,0x0a,0x13,0x10,0x0c,0x10,\r\n0x14,0x11,0x0d,0x0c,0x0c,0x0b,0x09,0x0b,0x06,0x07,0x0b,0x07,0x0b,0x10,0x0f,0x0c,0x0b,0x0c,0x0a,0x0d,0x0d,0x09,0x09,0x0b,0x0b,0x08,0x08,0x0b,0x05,0x08,0x0a,0x06,0x1a,0x18,0x16,0x12,0x0f,0x0b,0x17,0x14,0x11,0x0e,0x0b,0x06,0x05,0x10,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0b,0x0e,0x0b,0x0e,0x0b,0x12,0x11,\r\n0x0e,0x0c,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x10,0x0c,0x0d,0x09,0x05,0x1a,0x18,0x16,0x0e,0x0c,0x15,0x0e,0x10,0x0c,0x0e,0x0b,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x05,0x06,0x05,0x10,0x0c,0x10,0x0c,0x0c,0x07,0x0d,0x07,0x0e,0x0c,0x0e,0x0c,0x0b,0x09,0x0f,0x0c,0x0f,0x0c,0x0c,0x0c,0x0a,0x0e,0x0b,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,\r\n0x0c,0x0c,0x0a,0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0b,0x0d,0x09,0x09,0x0b,0x0c,0x06,0x0c,0x0c,0x0b,0x0a,0x0a,0x0c,0x0c,0x0c,0x06,0x06,0x07,0x06,0x08,0x05,0x0d,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0d,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x08,0x05,0x05,0x06,0x06,0x07,0x07,\r\n0x0d,0x0c,0x0c,0x0a,0x0f,0x0a,0x09,0x0a,0x0b,0x09,0x09,0x08,0x08,0x08,0x0a,0x0d,0x0a,0x0c,0x0b,0x0c,0x05,0x0a,0x08,0x0c,0x08,0x08,0x13,0x14,0x15,0x0d,0x0a,0x0f,0x11,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0c,0x0e,0x0c,0x0d,0x11,0x0c,0x0f,0x0c,0x0c,0x0a,0x0a,0x09,0x0d,0x0b,0x0d,0x0a,0x13,0x12,0x0d,0x0b,0x0d,0x0b,0x0d,0x0a,0x0d,\r\n0x0a,0x0e,0x0c,0x0c,0x09,0x0c,0x0c,0x0a,0x05,0x10,0x0a,0x0a,0x12,0x0e,0x0e,0x0c,0x13,0x0f,0x0e,0x0a,0x12,0x0f,0x0f,0x0c,0x14,0x10,0x0b,0x09,0x10,0x10,0x10,0x0c,0x0f,0x0c,0x0f,0x0c,0x1c,0x17,0x11,0x0e,0x18,0x13,0x12,0x0e,0x0c,0x09,0x0b,0x08,0x09,0x00,0x00,0x15,0x14,0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0b,0x0a,0x0c,0x0a,0x0f,\r\n0x0c,0x12,0x0e,0x15,0x12,0x0f,0x0c,0x0d,0x0a,0x0b,0x09,0x12,0x0e,0x0e,0x0c,0x12,0x0d,0x12,0x0d,0x06,0x12,0x10,0x0c,0x0b,0x0f,0x0c,0x0e,0x0c,0x0e,0x0b,0x0e,0x0b,0x12,0x11,0x0b,0x0b,0x0f,0x0b,0x0f,0x0b,0x12,0x10,0x0b,0x09,0x0b,0x09,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x10,0x0c,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0e,0x0c,\r\n0x10,0x0f,0x0c,0x0c,0x12,0x12,0x11,0x0f,0x0c,0x0a,0x13,0x11,0x15,0x12,0x0f,0x0b,0x0e,0x0d,0x0c,0x0c,0x0c,0x0b,0x0c,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x05,0x0c,0x07,0x07,0x03,0x04,0x04,0x04,0x06,0x08,0x06,0x05,0x08,0x05,0x05,0x05,0x07,0x07,0x05,0x05,0x0c,0x0c,0x0c,0x0c,0x07,0x06,\r\n0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x06,0x03,0x05,0x06,0x05,0x08,0x08,0x08,0x08,0x08,0x07,0x07,0x07,0x09,0x07,0x05,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x0d,0x07,0x0c,0x0c,0x07,0x07,0x07,0x07,0x07,0x06,0x07,0x07,0x07,0x06,\r\n0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0a,0x0e,0x11,0x0a,0x0a,0x0c,0x0c,0x09,0x09,0x05,0x06,0x0a,0x08,0x0f,0x0c,0x0c,0x0a,0x0d,0x0d,0x0d,0x14,0x0b,0x0c,0x0c,0x0a,0x0a,0x0a,0x09,0x0b,0x0c,0x0f,0x0c,0x0a,0x0f,0x0a,0x09,0x09,0x0b,0x08,0x0a,0x0c,0x0a,0x0c,0x0c,\r\n0x08,0x0a,0x07,0x08,0x09,0x06,0x06,0x09,0x09,0x04,0x05,0x07,0x06,0x0b,0x09,0x09,0x09,0x08,0x07,0x07,0x06,0x09,0x0b,0x07,0x07,0x07,0x0a,0x07,0x07,0x07,0x07,0x06,0x06,0x07,0x03,0x06,0x0a,0x07,0x07,0x06,0x07,0x07,0x07,0x04,0x07,0x07,0x0a,0x06,0x07,0x07,0x06,0x07,0x09,0x06,0x03,0x04,0x07,0x06,0x07,0x06,0x07,0x09,0x06,0x0c,\r\n0x03,0x07,0x0b,0x12,0x0d,0x0b,0x0b,0x12,0x0e,0x12,0x10,0x0b,0x0c,0x0b,0x09,0x18,0x0a,0x0c,0x13,0x14,0x14,0x0d,0x0e,0x0d,0x0a,0x0a,0x0b,0x09,0x0a,0x0b,0x04,0x00,0x00,0x00,0x00,0x0c,0x0d,0x0d,0x0d,0x0a,0x08,0x0c,0x0c,0x07,0x12,0x0c,0x0c,0x07,0x07,0x0a,0x07,0x0a,0x0c,0x0a,0x0c,0x13,0x0e,0x07,0x06,0x0c,0x0b,0x0c,0x0c,0x0c,\r\n0x07,0x0c,0x0a,0x05,0x12,0x0c,0x0c,0x07,0x09,0x09,0x0a,0x0a,0x0a,0x0b,0x0c,0x0c,0x0b,0x09,0x09,0x0f,0x05,0x0a,0x05,0x0c,0x09,0x07,0x06,0x06,0x07,0x06,0x04,0x03,0x07,0x07,0x03,0x04,0x04,0x04,0x03,0x04,0x03,0x05,0x0a,0x0a,0x07,0x07,0x07,0x07,0x08,0x05,0x03,0x04,0x07,0x07,0x07,0x07,0x06,0x05,0x05,0x06,0x05,0x07,0x00,0x00,\r\n0x00,0x00,0x05,0x07,0x07,0x07,0x06,0x07,0x0b,0x0b,0x0b,0x0b,0x07,0x00,0x00,0x00,0x00,0x0a,0x07,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x06,0x06,0x06,0x06,0x0c,0x0c,0x0c,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0b,0x08,\r\n0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x04,0x08,0x08,0x07,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x08,0x07,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x06,0x10,0x0d,0x0f,0x0c,0x10,0x0d,0x14,0x10,0x0b,0x08,0x0b,0x0e,0x0b,0x11,0x0f,0x00,0x00,0x00,0x00,0x05,0x05,0x05,0x05,0x07,0x07,0x07,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x12,0x12,0x15,0x09,0x05,0x0b,0x0c,0x09,0x0b,0x0b,0x0c,0x0c,0x0b,0x15,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0e,0x0b,0x0b,0x0b,0x07,0x0c,0x07,0x10,0x0e,0x0b,0x07,0x12,0x0b,0x12,0x05,0x07,0x0c,0x0c,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x12,0x05,0x0c,0x05,0x0b,0x09,0x05,0x05,0x0b,0x05,0x10,0x05,\r\n0x13,0x0b,0x13,0x13,0x0c,0x0c,0x0c,0x0b,0x0b,0x09,0x09,0x19,0x19,0x1c,0x1c,0x12,0x12,0x0b,0x0b,0x04,0x15,0x10,0x12,0x0e,0x0c,0x0e,0x0b,0x0b,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x05,0x0e,0x00,0x0e,0x0e,0x0e,0x07,0x0b,0x0b,0x13,0x07,0x13,0x07,0x0c,0x0e,0x0c,0x09,0x13,0x0b,0x13,0x0b,0x10,0x12,0x07,0x0b,\r\n0x0b,0x09,0x05,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0b,0x0e,0x0e,0x13,0x07,0x0b,0x09,0x0e,0x0b,0x07,0x0b,0x0b,0x0b,0x13,0x07,0x13,0x07,0x05,0x0c,0x08,0x15,0x0b,0x0b,0x0e,0x0e,0x15,0x0b,0x00,0x00,0x00,0x0e,0x00,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x00,0x00,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x0b,0x0b,0x10,0x12,0x13,0x07,\r\n0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x09,0x09,0x09,0x19,0x12,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x0b,0x0c,0x0c,0x0c,0x15,0x15,0x0b,0x0b,0x15,0x0b,\r\n0x0b,0x15,0x0b,0x0b,0x15,0x0b,0x0b,0x10,0x10,0x17,0x15,0x13,0x0b,0x12,0x0b,0x12,0x0b,0x12,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0e,0x07,0x0e,0x07,0x0b,0x0e,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x13,0x10,0x12,0x07,0x0b,0x10,0x12,0x10,\r\n0x12,0x00,0x00,0x00,0x00,0x00,0x18,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x09,0x00,0x00,0x0d,0x00,0x00,0x00,0x19,0x12,0x1c,0x15,0x0b,0x0c,0x0c,0x0c,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x13,0x13,0x08,0x0c,0x0c,0x0c,0x1a,0x11,0x0b,0x20,0x17,0x07,0x0c,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x09,0x09,0x10,0x0e,0x0e,0x0b,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x1a,0x20,0x00,0x00,0x00,0x00,0x00,0x0c,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x09,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0e,0x0c,0x0b,0x0b,0x09,0x19,0x12,0x0b,0x0c,0x0c,\r\n0x0c,0x0b,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x15,0x0b,0x0b,0x15,0x0b,0x0b,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0e,0x07,0x07,0x09,0x09,0x19,0x12,0x0e,0x0c,0x0c,0x00,0x0b,0x0b,0x0b,0x08,0x0c,0x0e,0x0d,0x0b,0x0b,0x08,0x05,0x10,0x0c,0x0d,0x07,0x0c,0x0a,0x0a,\r\n0x0a,0x0a,0x05,0x0b,0x09,0x0d,0x0a,0x0c,0x0a,0x0b,0x09,0x0e,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x09,0x0a,0x0a,0x06,0x0b,0x0c,0x0d,0x0b,0x07,0x10,0x0c,0x0d,0x0b,0x0d,0x0a,0x0c,0x0b,0x08,0x0f,0x08,0x09,0x09,0x0a,0x0d,0x0d,0x0b,0x15,0x0b,0x15,0x07,0x05,0x04,0x0b,0x05,0x03,0x00,0x03,0x05,0x00,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x13,0x09,0x10,0x0c,0x14,0x0f,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13,0x12,0x0a,0x12,0x0a,0x12,0x0e,0x0e,0x0f,0x0f,0x10,0x12,0x15,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x10,0x0c,0x16,0x11,0x0a,0x0a,0x06,0x06,0x06,0x08,0x05,\r\n0x0c,0x05,0x05,0x12,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x04,0x00,0x00,0x05,0x00,0x00,0x0d,0x0c,0x09,0x0a,0x0e,0x06,0x07,0x0e,0x0e,0x06,0x0c,0x0b,0x0c,0x0f,0x0e,0x06,0x08,0x0e,0x0d,0x0d,0x0d,0x0c,0x0c,0x0e,0x0c,0x10,0x0f,0x0b,0x0b,0x0b,0x05,0x08,0x0c,0x0c,0x0c,0x0c,0x0b,0x0d,\r\n0x0d,0x0a,0x0e,0x0b,0x0c,0x0f,0x0c,0x0f,0x0c,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0c,0x09,0x0a,0x0e,0x06,0x07,0x0e,0x06,0x0c,0x0b,0x0c,0x0e,0x08,0x0e,0x0d,0x0d,0x0c,0x0e,0x0c,0x10,0x0f,0x06,0x0c,0x0b,0x0d,0x0e,0x19,0x00,0x0d,0x0c,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x06,0x00,0x10,0x0d,0x0e,0x0f,0x0c,0x0e,0x10,0x10,0x0a,0x0d,0x10,0x0f,0x0e,0x10,0x11,0x10,0x0e,0x0c,0x0c,0x10,0x0f,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0c,0x0d,0x0e,0x0e,0x10,0x0d,0x0d,0x0d,0x0e,0x11,0x0a,0x0c,0x0c,0x12,0x0b,0x0b,\r\n0x10,0x13,0x0d,0x0b,0x16,0x0c,0x0c,0x10,0x0b,0x0b,0x10,0x0c,0x10,0x11,0x12,0x0b,0x10,0x0b,0x0e,0x0b,0x0d,0x0c,0x0d,0x0b,0x0d,0x10,0x0b,0x0d,0x0e,0x0b,0x0b,0x0d,0x14,0x0b,0x0b,0x0c,0x0c,0x09,0x07,0x0c,0x0c,0x0c,0x0b,0x0c,0x13,0x0c,0x13,0x0a,0x0c,0x13,0x0e,0x0c,0x13,0x10,0x10,0x13,0x0c,0x0c,0x13,0x13,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x13,0x13,0x0c,0x0c,0x0c,0x13,0x0d,0x0b,0x0c,0x0c,0x13,0x10,0x0e,0x0f,0x0f,0x0e,0x0f,0x0d,0x0e,0x10,0x0f,0x0e,0x0b,0x11,0x0e,0x0e,0x0c,0x0e,0x0f,0x10,0x0f,0x0c,0x0f,0x0e,0x0f,0x0e,0x10,0x0f,0x0f,0x0f,0x0e,0x0d,0x0f,0x0e,0x0f,0x11,0x0e,0x10,0x0f,0x02,0x02,0x03,0x04,0x03,0x06,0x07,0x12,0x0c,0x0d,0x0d,0x0c,0x0d,\r\n0x0c,0x0c,0x0e,0x0d,0x0c,0x06,0x12,0x0c,0x0c,0x0c,0x0b,0x0d,0x0b,0x0c,0x06,0x0c,0x0b,0x0c,0x09,0x12,0x0c,0x0c,0x0c,0x0c,0x11,0x0c,0x0c,0x08,0x11,0x0c,0x0c,0x0e,0x0e,0x05,0x06,0x18,0x18,0x18,0x18,0x1e,0x0b,0x0b,0x05,0x0b,0x08,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x08,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0a,0x0b,0x0c,0x09,0x09,0x0c,0x0d,0x05,0x07,0x0a,0x09,0x10,0x0e,0x0d,0x0a,0x0d,0x0a,0x09,0x09,0x0c,0x0b,0x11,0x0b,0x0a,0x0a,0x0f,0x10,0x09,0x0d,0x0a,0x0c,0x0b,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x09,0x05,0x05,0x05,0x05,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x0c,0x0c,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0b,0x0d,0x0d,0x05,0x05,0x05,0x05,0x05,0x0c,0x07,0x0a,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0a,0x0a,0x0a,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0b,0x0f,0x0d,0x0b,0x0a,0x08,0x0b,0x09,0x0a,0x0d,0x0d,0x05,0x0a,0x0b,0x10,0x0e,0x09,0x0d,0x0d,0x0a,0x0a,0x09,0x0a,0x0d,0x0b,0x0e,0x0d,0x0b,0x09,0x0d,0x05,0x0d,0x0a,0x0d,0x05,0x0a,0x09,0x0c,0x08,0x0b,\r\n0x09,0x05,0x05,0x07,0x11,0x11,0x0d,0x0a,0x0a,0x0d,0x0b,0x0a,0x0a,0x08,0x0c,0x09,0x10,0x09,0x0e,0x0e,0x0a,0x0c,0x10,0x0d,0x0d,0x0d,0x0a,0x0b,0x09,0x0a,0x0d,0x0b,0x0d,0x0b,0x11,0x11,0x0c,0x0f,0x0a,0x0b,0x12,0x0a,0x08,0x0c,0x0c,0x0d,0x13,0x13,0x0e,0x0b,0x0c,0x09,0x0c,0x0c,0x0c,0x0f,0x0b,0x0b,0x0e,0x0c,0x0c,0x08,0x0d,0x0d,\r\n0x0c,0x0a,0x0a,0x13,0x10,0x0a,0x0b,0x0d,0x0d,0x0d,0x0d,0x0f,0x0e,0x08,0x14,0x0c,0x0c,0x0c,0x0e,0x0e,0x0b,0x0b,0x06,0x10,0x0e,0x0e,0x0a,0x0f,0x05,0x05,0x09,0x09,0x05,0x05,0x0d,0x08,0x06,0x10,0x0f,0x06,0x05,0x05,0x09,0x08,0x08,0x05,0x05,0x05,0x08,0x0e,0x0a,0x06,0x0d,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x0d,0x07,0x09,0x0b,0x09,\r\n0x05,0x05,0x08,0x0b,0x07,0x0e,0x0e,0x0e,0x13,0x10,0x13,0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x10,0x12,0x07,0x07,0x0b,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0b,0x0b,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x0b,0x0b,0x13,0x13,0x0b,0x0b,0x10,0x12,0x07,0x07,0x10,0x12,0x07,\r\n0x07,0x10,0x12,0x07,0x07,0x15,0x10,0x12,0x0b,0x0c,0x0c,0x0e,0x07,0x0e,0x10,0x0b,0x0b,0x07,0x07,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x13,0x07,0x10,0x0b,0x0b,0x05,0x0b,0x0b,0x0b,0x0b,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x19,0x12,0x19,0x12,0x19,0x12,0x1c,0x15,0x1c,0x15,0x12,0x12,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x10,0x0b,0x0b,0x10,0x0b,0x0b,0x13,0x0b,0x17,0x15,0x13,0x0b,0x12,0x0b,0x12,0x0b,0x12,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x13,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x07,0x0e,0x0e,0x07,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x0b,0x0c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x0b,0x07,0x07,0x07,0x07,0x00,0x19,0x12,0x1c,0x15,0x13,0x0b,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0b,0x0b,0x09,0x19,0x12,0x15,0x15,0x13,0x13,0x13,0x0c,0x0c,0x0c,0x0c,\r\n0x0e,0x07,0x0e,0x07,0x0e,0x07,0x19,0x12,0x0c,0x0e,0x0c,0x0c,0x0c,0x0e,0x0c,0x0c,0x19,0x19,0x12,0x12,0x09,0x09,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x10,0x12,0x07,0x07,0x10,0x12,0x07,0x07,0x10,0x12,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x13,0x07,0x13,0x07,0x0c,0x0e,0x0c,0x0c,0x19,0x19,0x12,0x12,0x19,0x19,0x12,0x12,0x12,0x12,\r\n0x0b,0x0b,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x00,0x00,0x05,0x05,0x07,0x05,0x00,0x00,0x00,0x12,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x09,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x05,0x05,\r\n0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x12,0x0c,0x12,0x0c,0x12,0x0c,0x12,0x0e,0x0e,0x0e,0x05,0x05,0x0b,0x09,0x0c,0x0d,0x0c,0x0b,0x0c,0x0c,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0c,0x0b,0x0c,0x0d,0x0d,0x0e,0x0c,0x0c,0x0e,0x0b,0x0e,0x10,0x0d,0x10,0x11,0x0d,0x10,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0a,0x0b,0x0d,0x0d,0x0e,0x0c,0x0e,0x0c,0x0c,0x0d,0x0b,0x0b,0x10,0x0e,0x0f,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x10,0x10,0x10,0x13,\r\n0x13,0x0f,0x13,0x13,0x0f,0x12,0x12,0x0c,0x10,0x12,0x10,0x0c,0x12,0x10,0x0f,0x0f,0x0d,0x0e,0x10,0x11,0x0f,0x0d,0x0f,0x0c,0x0b,0x13,0x13,0x13,0x11,0x13,0x13,0x0e,0x13,0x13,0x0f,0x10,0x10,0x10,0x0f,0x0f,0x0e,0x13,0x10,0x11,0x0f,0x0f,0x0c,0x10,0x0f,0x0f,0x12,0x10,0x0f,0x13,0x0b,0x0b,0x0c,0x0b,0x0d,0x0d,0x0f,0x0f,0x0c,0x0c,\r\n0x0c,0x0b,0x0c,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0c,0x0d,0x0d,0x0d,0x0a,0x0c,0x0c,0x0c,0x0d,0x10,0x12,0x0e,0x0e,0x0d,0x10,0x0d,0x0e,0x0b,0x0a,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0a,0x0a,0x0d,0x0a,0x0b,0x0a,0x0c,0x10,0x0c,0x11,0x0b,0x0c,0x0c,0x10,0x07,0x11,0x0e,0x0f,0x0e,0x0c,0x10,0x0d,0x10,0x0d,0x0d,0x0d,\r\n0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x0a,0x09,0x0a,0x0a,0x0a,0x06,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x13,0x13,0x13,0x13,0x0a,0x10,0x0f,0x0a,0x09,0x0a,0x0b,0x0c,0x0a,0x12,0x11,0x12,0x09,0x15,0x0a,0x12,0x12,\r\n0x12,0x11,0x0c,0x0a,0x0a,0x10,0x0c,0x10,0x0e,0x0b,0x0a,0x09,0x15,0x09,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x1d,0x12,0x12,0x09,0x05,0x0a,0x05,0x0a,0x05,0x05,0x05,0x0a,0x0c,0x0c,0x0b,0x08,0x08,0x05,0x05,0x05,0x08,0x05,0x09,0x12,0x05,0x13,0x13,0x13,0x0c,0x0c,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x0e,0x19,\r\n0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0a,0x0c,0x0a,0x0b,0x09,0x07,0x07,0x0e,0x0c,0x0f,0x09,0x18,0x13,0x0c,0x0c,0x13,0x11,0x12,0x10,0x15,0x11,0x13,0x10,0x0e,0x0a,0x0f,0x0c,0x13,0x0f,\r\n0x10,0x0d,0x10,0x0d,0x12,0x0e,0x12,0x0e,0x17,0x12,0x10,0x0c,0x10,0x0c,0x19,0x13,0x11,0x00,0x15,0x15,0x15,0x0a,0x00,0x00,0x0c,0x0b,0x0f,0x0c,0x0b,0x09,0x17,0x13,0x14,0x12,0x0f,0x0c,0x0f,0x0c,0x0b,0x09,0x10,0x0d,0x0b,0x09,0x11,0x0e,0x0e,0x0c,0x15,0x11,0x0b,0x0c,0x0f,0x0f,0x11,0x09,0x04,0x0a,0x0e,0x09,0x15,0x15,0x05,0x00,\r\n0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x08,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0a,0x0e,0x0f,0x06,0x04,0x06,0x04,0x0f,0x0c,0x10,0x0d,0x0c,0x0a,0x0b,0x0a,0x0c,0x0c,0x09,0x09,0x18,0x11,0x18,0x13,0x15,0x12,0x13,0x0e,0x13,0x0e,0x13,0x0e,0x0d,0x0a,0x0c,0x0a,0x0c,0x0a,0x0c,0x0a,0x0b,0x07,0x0a,0x05,0x10,0x0c,0x12,\r\n0x0e,0x1c,0x15,0x0c,0x0c,0x0e,0x0f,0x11,0x12,0x10,0x0c,0x15,0x10,0x0b,0x08,0x0c,0x0a,0x0d,0x0a,0x14,0x0f,0x0d,0x0b,0x0c,0x0c,0x0c,0x0c,0x0a,0x08,0x0a,0x08,0x0a,0x08,0x0b,0x0b,0x06,0x0e,0x07,0x14,0x0e,0x07,0x0c,0x0d,0x0a,0x10,0x0c,0x08,0x07,0x0c,0x0c,0x0c,0x0a,0x05,0x10,0x0d,0x08,0x07,0x0d,0x0a,0x0f,0x08,0x10,0x0d,0x0d,\r\n0x0a,0x0e,0x0c,0x0c,0x0a,0x10,0x0c,0x0d,0x07,0x0b,0x09,0x10,0x09,0x0b,0x12,0x0a,0x0c,0x13,0x06,0x18,0x13,0x13,0x19,0x13,0x13,0x13,0x12,0x13,0x13,0x0b,0x0a,0x0d,0x0f,0x13,0x0f,0x14,0x05,0x0a,0x0c,0x12,0x16,0x0f,0x16,0x0d,0x0d,0x11,0x0f,0x18,0x13,0x0b,0x13,0x07,0x13,0x07,0x0c,0x0c,0x0c,0x0c,0x12,0x12,0x12,0x12,0x15,0x0b,\r\n0x0b,0x15,0x10,0x0b,0x0b,0x10,0x0e,0x07,0x07,0x0e,0x0c,0x0c,0x0c,0x0c,0x10,0x07,0x07,0x12,0x10,0x07,0x07,0x12,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x21,0x0b,0x08,0x0c,0x0b,0x10,0x0c,0x0c,0x12,\r\n0x0e,0x10,0x10,0x11,0x11,0x0c,0x0a,0x15,0x11,0x16,0x12,0x0e,0x0c,0x07,0x07,0x0c,0x0e,0x09,0x0d,0x0b,0x0c,0x0a,0x10,0x11,0x08,0x0c,0x09,0x04,0x08,0x0b,0x0c,0x05,0x05,0x04,0x05,0x08,0x08,0x08,0x09,0x1f,0x2a,0x07,0x09,0x03,0x06,0x08,0x09,0x07,0x0a,0x0b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x1c,0x0b,0x10,0x13,0x13,0x0e,0x0a,0x0c,0x0f,0x0f,0x0a,0x07,0x0e,0x0b,0x0e,0x0c,0x0e,0x0b,0x0b,0x10,0x0c,0x0c,0x0b,0x10,0x0d,0x11,0x0a,0x0b,0x0d,0x07,0x0c,0x07,0x07,0x05,0x12,0x0c,0x0c,0x0b,0x0b,0x0c,0x13,0x13,0x14,0x15,0x15,0x0c,0x0a,0x06,0x0b,0x0a,0x0d,0x0a,0x0e,0x05,0x0c,0x0d,0x12,0x12,0x0d,0x0b,0x0c,0x0b,0x0b,\r\n0x0a,0x0b,0x0a,0x0a,0x06,0x07,0x05,0x05,0x08,0x0c,0x0d,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x07,0x07,0x00,0x06,0x06,0x06,0x05,0x05,0x23,0x15,0x12,0x16,0x06,0x06,0x07,0x08,0x05,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x13,0x07,0x07,0x13,0x05,0x0b,0x0b,0x1c,0x15,0x15,\r\n0x1c,0x13,0x0b,0x0b,0x13,0x0b,0x0b,0x09,0x09,0x00,0x00,0x08,0x10,0x0d,0x0f,0x0c,0x1a,0x16,0x0f,0x0b,0x0f,0x0c,0x1c,0x15,0x10,0x0c,0x08,0x07,0x0d,0x00,0x0e,0x0b,0x07,0x06,0x03,0x0a,0x07,0x07,0x05,0x04,0x0a,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x05,0x0b,0x09,0x0c,0x0c,0x0c,0x14,0x11,0x11,0x11,0x11,0x14,0x0d,0x0e,0x0d,\r\n0x08,0x14,0x18,0x09,0x18,0x0b,0x12,0x13,0x13,0x13,0x09,0x10,0x15,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x0c,0x0c,0x0c,0x12,0x0b,0x0b,0x13,0x07,0x07,0x13,0x07,0x07,0x13,0x0a,0x0a,0x00,0x09,0x12,0x07,0x07,0x15,0x0b,0x0b,0x10,0x0b,0x0b,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x20,0x20,0x12,0x00,0x00,0x12,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0d,0x0e,0x0e,0x13,0x0e,0x0d,0x11,0x14,0x0e,0x0d,0x16,0x0d,0x0d,0x14,0x0d,0x0e,0x11,0x0d,0x10,0x12,0x13,0x0d,0x10,0x0e,0x0f,0x0d,0x0f,0x0d,0x0e,0x0e,0x0d,\r\n0x10,0x0d,0x0e,0x10,0x0d,0x0d,0x0c,0x10,0x0d,0x0e,0x0e,0x0f,0x09,0x0b,0x0d,0x10,0x10,0x0b,0x00,0x00,0x18,0x30,0x10,0x00,0x02,0x07,0x07,0x09,0x0e,0x0d,0x14,0x13,0x06,0x07,0x07,0x0a,0x10,0x05,0x0a,0x05,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x05,0x05,0x10,0x10,0x10,0x0b,0x17,0x0f,0x0e,0x0f,0x11,0x0c,0x0c,\r\n0x10,0x11,0x06,0x09,0x0e,0x0b,0x16,0x12,0x12,0x0d,0x12,0x0e,0x0d,0x0d,0x10,0x0f,0x16,0x0e,0x0d,0x0e,0x07,0x09,0x07,0x10,0x0a,0x06,0x0c,0x0e,0x0b,0x0e,0x0d,0x08,0x0e,0x0e,0x06,0x06,0x0c,0x06,0x15,0x0e,0x0e,0x0e,0x0e,0x08,0x0a,0x08,0x0e,0x0c,0x11,0x0b,0x0c,0x0b,0x07,0x06,0x07,0x10,0x0f,0x0f,0x0f,0x0c,0x12,0x12,0x10,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x0d,0x0d,0x0b,0x0a,0x0b,0x0d,0x0a,0x15,0x15,0x13,0x07,0x0a,0x10,0x15,0x12,0x14,0x10,0x10,0x10,0x0d,0x0e,0x0d,0x0f,0x12,0x0d,0x09,0x0a,0x12,0x14,0x0e,0x0b,0x07,0x07,0x10,0x10,0x0d,0x10,0x0f,\r\n0x0c,0x0c,0x12,0x0f,0x0f,0x12,0x16,0x16,0x0c,0x18,0x09,0x09,0x06,0x06,0x10,0x0e,0x0c,0x0d,0x04,0x0d,0x08,0x08,0x0d,0x0d,0x09,0x05,0x06,0x09,0x1d,0x0f,0x0c,0x0f,0x0c,0x0c,0x06,0x06,0x06,0x06,0x12,0x12,0x12,0x10,0x10,0x10,0x06,0x09,0x08,0x07,0x07,0x05,0x07,0x05,0x08,0x04,0x09,0x0b,0x07,0x0d,0x0a,0x0e,0x0b,0x06,0x11,0x0d,\r\n0x0d,0x0c,0x0d,0x0e,0x10,0x10,0x08,0x09,0x09,0x16,0x16,0x17,0x0c,0x10,0x0e,0x06,0x0d,0x0a,0x0f,0x0b,0x0f,0x0b,0x0e,0x0a,0x05,0x0f,0x0c,0x0f,0x0c,0x11,0x10,0x11,0x0c,0x0d,0x0c,0x0d,0x0b,0x06,0x0b,0x07,0x0b,0x08,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0e,0x08,0x0d,0x0a,0x0d,0x08,0x0d,0x0b,0x10,0x0e,0x10,0x0e,0x0e,0x0b,\r\n0x0e,0x0b,0x0b,0x12,0x12,0x0f,0x0e,0x0b,0x0e,0x0c,0x11,0x0a,0x0c,0x09,0x1b,0x0f,0x0c,0x0f,0x06,0x09,0x13,0x08,0x0f,0x09,0x09,0x0f,0x09,0x0f,0x0c,0x0f,0x0b,0x0f,0x0b,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x06,0x0e,0x0c,0x0c,0x0b,0x06,\r\n0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0d,0x0a,0x0d,0x08,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x16,0x11,0x0d,0x0c,0x06,0x0f,0x0c,0x15,0x14,0x12,0x0e,0x05,0x16,0x11,0x16,0x11,0x16,0x11,0x0d,0x0c,0x06,0x0a,0x0d,0x0e,0x16,0x16,0x16,0x15,0x09,0x09,0x05,0x07,0x07,0x0f,0x0e,0x13,0x09,0x13,0x10,0x14,0x06,0x0f,\r\n0x0e,0x0c,0x0e,0x11,0x06,0x0e,0x0f,0x16,0x12,0x0c,0x12,0x11,0x0d,0x0c,0x0d,0x0d,0x0e,0x13,0x12,0x06,0x0d,0x0f,0x0b,0x0e,0x06,0x0d,0x0d,0x0c,0x0b,0x0e,0x0e,0x06,0x0d,0x0c,0x0e,0x0d,0x0b,0x0e,0x0e,0x0b,0x0d,0x0d,0x12,0x13,0x06,0x0d,0x0e,0x0d,0x13,0x0c,0x11,0x0b,0x0f,0x0d,0x06,0x18,0x18,0x11,0x0e,0x0e,0x11,0x0f,0x0e,0x0e,\r\n0x0b,0x11,0x0c,0x15,0x0d,0x12,0x12,0x0e,0x10,0x16,0x11,0x12,0x11,0x0d,0x0f,0x0d,0x0e,0x11,0x0e,0x12,0x10,0x17,0x18,0x11,0x13,0x0e,0x0f,0x18,0x0e,0x0c,0x0e,0x0d,0x09,0x0d,0x0d,0x12,0x0b,0x0e,0x0e,0x0c,0x0d,0x11,0x0e,0x0e,0x0e,0x0e,0x0b,0x0a,0x0c,0x10,0x0b,0x0e,0x0e,0x13,0x14,0x0e,0x11,0x0c,0x0b,0x14,0x0c,0x0d,0x0e,0x09,\r\n0x0b,0x0a,0x06,0x13,0x13,0x0e,0x0c,0x0c,0x0e,0x0b,0x09,0x18,0x1b,0x0f,0x08,0x09,0x09,0x09,0x06,0x0d,0x0a,0x0d,0x12,0x0e,0x11,0x0e,0x07,0x08,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x0b,0x07,0x07,0x07,0x0b,0x0b,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,\r\n0x0c,0x0f,0x0c,0x0f,0x0c,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x06,0x06,0x06,0x06,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x10,0x0e,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0d,\r\n0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x08,0x0c,0x0d,0x12,0x0e,0x06,0x09,0x06,0x06,0x0c,0x0a,0x16,0x13,0x0f,0x0d,0x0e,0x0c,0x12,0x0e,0x0d,0x0c,0x0d,0x0c,0x0f,0x0c,0x10,0x0e,0x10,0x0e,0x11,0x0d,0x12,0x0e,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x06,0x06,0x07,0x07,0x07,0x07,0x0c,0x0d,0x0f,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0f,0x0b,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x08,0x10,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x06,0x06,0x06,0x06,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x0b,0x06,0x16,0x15,0x16,0x15,0x16,0x15,0x12,0x0e,0x12,\r\n0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0d,0x0e,0x0d,0x0e,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0e,0x08,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x0a,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x0d,0x08,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0f,0x0c,0x0f,0x0c,0x16,0x11,0x16,0x11,0x0e,0x0b,0x0e,\r\n0x0b,0x0d,0x0c,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x08,0x11,0x0c,0x0c,0x06,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x06,0x06,0x06,0x06,0x06,\r\n0x06,0x06,0x06,0x09,0x09,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x17,0x17,0x17,0x17,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x14,0x14,0x14,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0b,0x0b,0x0e,0x0e,0x06,0x06,0x0e,0x0e,0x0d,0x0d,0x13,\r\n0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x11,0x0e,0x0e,0x0e,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x09,0x09,0x0e,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x0f,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x12,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0f,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0b,0x11,0x12,0x0e,0x0e,0x0e,0x0c,0x0d,0x0c,0x11,0x0f,0x15,0x07,0x07,0x0e,0x0c,0x06,0x0c,0x15,0x12,0x0e,0x12,0x17,0x13,0x0e,0x0e,0x0e,0x0d,0x0a,0x0c,0x07,0x08,0x0d,0x08,0x0d,0x12,0x11,0x0e,0x0c,0x0e,0x0b,0x0f,0x0f,0x0b,0x0a,0x0d,0x0d,0x09,0x09,0x0d,\r\n0x06,0x09,0x0b,0x07,0x1e,0x1b,0x19,0x15,0x11,0x0c,0x1a,0x17,0x13,0x0f,0x0c,0x06,0x06,0x12,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0d,0x0f,0x0c,0x0f,0x0c,0x15,0x14,0x10,0x0e,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x12,0x0e,0x0f,0x0b,0x06,0x1e,0x1b,0x19,0x10,0x0e,0x18,0x11,0x12,0x0e,0x0f,0x0c,0x0f,0x0c,0x0c,0x0d,\r\n0x0c,0x0d,0x06,0x06,0x06,0x06,0x12,0x0e,0x12,0x0e,0x0e,0x08,0x0e,0x08,0x10,0x0e,0x10,0x0e,0x0c,0x0a,0x11,0x0e,0x12,0x0e,0x0e,0x0e,0x0b,0x0f,0x0c,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0d,0x0c,0x0e,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0b,0x0b,0x0e,0x0e,0x0d,0x0f,0x0a,0x0a,0x0c,0x0d,0x07,0x0e,0x0e,0x0d,0x0c,0x0b,\r\n0x0e,0x0e,0x0e,0x06,0x07,0x08,0x07,0x09,0x06,0x0e,0x15,0x15,0x15,0x0d,0x0d,0x0e,0x0e,0x11,0x11,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0a,0x06,0x06,0x07,0x07,0x08,0x08,0x0e,0x0e,0x0d,0x0c,0x11,0x0c,0x0a,0x0b,0x0c,0x0b,0x0b,0x09,0x09,0x09,0x0b,0x0f,0x0c,0x0d,0x0d,0x0e,0x06,0x0c,0x09,0x0e,0x09,0x09,0x16,0x17,\r\n0x17,0x0f,0x0b,0x11,0x13,0x0e,0x0e,0x0c,0x0c,0x0d,0x0e,0x0e,0x10,0x0e,0x0f,0x13,0x0e,0x11,0x0e,0x0e,0x0b,0x0c,0x0b,0x0e,0x0c,0x0f,0x0c,0x15,0x15,0x0f,0x0c,0x0f,0x0d,0x0f,0x0b,0x0e,0x0c,0x10,0x0e,0x0e,0x0a,0x0e,0x0e,0x0b,0x06,0x12,0x0b,0x0b,0x15,0x10,0x10,0x0e,0x16,0x11,0x10,0x0c,0x15,0x11,0x11,0x0e,0x16,0x12,0x0d,0x0b,\r\n0x13,0x12,0x12,0x0e,0x11,0x0e,0x11,0x0e,0x1f,0x1b,0x14,0x10,0x1b,0x15,0x15,0x10,0x0e,0x0b,0x0c,0x09,0x0a,0x00,0x00,0x18,0x17,0x0e,0x0c,0x0d,0x0e,0x0e,0x0c,0x0d,0x0b,0x0e,0x0c,0x11,0x0e,0x14,0x10,0x18,0x14,0x11,0x0d,0x0f,0x0b,0x0d,0x0a,0x15,0x10,0x10,0x0e,0x14,0x0f,0x14,0x0f,0x06,0x15,0x12,0x0e,0x0c,0x11,0x0e,0x10,0x0e,\r\n0x0f,0x0c,0x0f,0x0c,0x15,0x14,0x0c,0x0d,0x11,0x0d,0x11,0x0d,0x15,0x12,0x0d,0x0b,0x0d,0x0b,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x0f,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x10,0x0e,0x13,0x11,0x0e,0x0e,0x14,0x15,0x13,0x11,0x0d,0x0b,0x16,0x13,0x18,0x14,0x11,0x0d,0x10,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x08,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x0e,0x08,0x08,0x04,0x05,0x05,0x05,0x07,0x0a,0x07,0x06,0x09,0x05,0x05,0x05,0x08,0x08,0x05,0x05,0x0e,0x0e,0x0e,0x0e,0x08,0x07,0x06,0x08,0x07,0x06,0x07,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x07,0x08,0x08,0x07,0x04,0x06,0x07,0x05,0x09,0x09,0x09,0x09,0x09,0x08,0x08,0x08,\r\n0x0a,0x08,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,\r\n0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,\r\n0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x00,0x00,0x00,0x00,0x00,0x0f,0x07,0x0f,0x08,0x0e,0x0e,0x08,0x08,0x08,0x08,0x08,0x06,0x08,0x08,0x08,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x0b,0x10,0x14,0x0c,0x0b,0x0d,0x0d,0x0a,\r\n0x0a,0x06,0x07,0x0c,0x09,0x11,0x0e,0x0e,0x0b,0x0f,0x0f,0x0f,0x16,0x0d,0x0e,0x0e,0x0b,0x0b,0x0b,0x0a,0x0d,0x0e,0x11,0x0e,0x0c,0x11,0x0b,0x0a,0x0a,0x0d,0x09,0x0b,0x0e,0x0b,0x0e,0x0d,0x09,0x0c,0x08,0x09,0x0a,0x07,0x07,0x0a,0x0a,0x04,0x05,0x09,0x07,0x0d,0x0b,0x0b,0x0a,0x09,0x08,0x08,0x07,0x0a,0x0d,0x08,0x08,0x08,0x0c,0x08,\r\n0x08,0x07,0x07,0x06,0x06,0x08,0x04,0x07,0x0c,0x08,0x08,0x06,0x08,0x08,0x08,0x05,0x08,0x08,0x0c,0x07,0x08,0x08,0x07,0x08,0x0a,0x07,0x04,0x05,0x08,0x07,0x08,0x07,0x08,0x0a,0x07,0x0e,0x04,0x08,0x0d,0x15,0x0f,0x0d,0x0d,0x15,0x10,0x15,0x12,0x0d,0x0e,0x0c,0x0b,0x1b,0x0b,0x0e,0x15,0x16,0x16,0x0f,0x0f,0x0f,0x0b,0x0b,0x0d,0x0a,\r\n0x0b,0x0c,0x05,0x00,0x00,0x00,0x00,0x0e,0x0f,0x0f,0x0f,0x0b,0x09,0x0e,0x0e,0x08,0x15,0x0e,0x0e,0x08,0x08,0x0b,0x08,0x0b,0x0e,0x0b,0x0e,0x16,0x10,0x08,0x06,0x0e,0x0d,0x0e,0x0e,0x0e,0x08,0x0e,0x0c,0x06,0x15,0x0e,0x0e,0x08,0x0a,0x0a,0x0c,0x0b,0x0b,0x0c,0x0e,0x0e,0x0d,0x0b,0x0b,0x12,0x06,0x0b,0x06,0x0e,0x0b,0x08,0x06,0x06,\r\n0x08,0x06,0x04,0x04,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x05,0x0c,0x0c,0x08,0x08,0x08,0x08,0x09,0x06,0x04,0x05,0x08,0x08,0x08,0x08,0x07,0x06,0x06,0x07,0x06,0x08,0x00,0x00,0x00,0x00,0x05,0x08,0x07,0x08,0x06,0x07,0x0d,0x0d,0x0d,0x0d,0x08,0x00,0x00,0x00,0x00,0x0b,0x07,0x06,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x06,0x06,0x06,0x06,0x0d,0x0d,0x0d,0x0d,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x04,0x09,0x09,0x08,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x09,0x08,0x09,0x09,0x08,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x07,0x07,0x13,0x0f,0x11,0x0e,0x12,0x0f,0x16,0x12,0x0d,0x09,0x0c,0x10,0x0d,0x14,0x11,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x06,0x08,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x18,0x0a,0x06,0x0c,0x0e,0x0a,0x0c,0x0c,0x0e,0x0e,0x0c,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,\r\n0x10,0x0c,0x0c,0x0c,0x08,0x0e,0x08,0x12,0x10,0x0c,0x08,0x14,0x0c,0x14,0x06,0x08,0x0e,0x0e,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x14,0x06,0x0e,0x06,0x0c,0x0a,0x06,0x06,0x0c,0x06,0x12,0x06,0x16,0x0c,0x16,0x16,0x0e,0x0e,0x0e,0x0c,0x0c,0x0a,0x0a,0x1c,0x1c,0x20,0x20,0x14,0x14,0x0c,0x0c,0x04,0x18,0x12,0x14,0x10,0x0e,0x10,0x0c,0x0c,\r\n0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x06,0x10,0x00,0x10,0x10,0x10,0x08,0x0c,0x0c,0x16,0x08,0x16,0x08,0x0e,0x10,0x0e,0x0a,0x16,0x0c,0x16,0x0c,0x12,0x14,0x08,0x0c,0x0c,0x0a,0x06,0x0c,0x0e,0x0c,0x0e,0x0c,0x0e,0x0e,0x0c,0x10,0x10,0x16,0x08,0x0c,0x0a,0x10,0x0c,0x08,0x0c,0x0c,0x0c,0x16,0x08,0x16,0x08,0x06,\r\n0x0e,0x09,0x18,0x0c,0x0c,0x10,0x10,0x18,0x0c,0x00,0x00,0x00,0x10,0x00,0x10,0x10,0x10,0x10,0x12,0x10,0x00,0x00,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0c,0x0c,0x12,0x14,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0c,0x0a,0x0a,0x0a,0x1c,0x14,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x0c,0x0e,0x0e,0x0e,0x18,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x12,0x12,0x1a,0x18,0x16,0x0c,0x14,0x0c,0x14,0x0c,0x14,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,\r\n0x0c,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0x10,0x08,0x0d,0x10,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x14,0x16,0x12,0x14,0x08,0x0c,0x12,0x14,0x12,0x14,0x00,0x00,0x00,0x00,0x00,0x1b,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x0a,0x00,0x00,0x0e,0x00,0x00,0x00,0x1c,0x14,0x20,0x18,0x0c,0x0e,\r\n0x0e,0x0e,0x0a,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x16,0x16,0x09,0x0e,0x0e,0x0e,0x1d,0x14,0x0d,0x25,0x1a,0x08,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0a,0x0a,0x12,0x10,0x10,0x0c,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x1e,0x24,0x00,0x00,0x00,0x00,0x00,\r\n0x0e,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x0a,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x10,0x0e,0x0c,0x0c,0x0a,0x1c,0x14,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x18,0x0c,0x0c,0x18,0x0c,0x0c,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,\r\n0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x10,0x08,0x08,0x0a,0x0a,0x1c,0x14,0x10,0x0e,0x0e,0x00,0x0c,0x0c,0x0c,0x09,0x0e,0x10,0x0f,0x0c,0x0d,0x09,0x06,0x12,0x0e,0x0e,0x08,0x0d,0x0c,0x0b,0x0b,0x0b,0x06,0x0c,0x0a,0x0f,0x0c,0x0e,0x0b,0x0d,0x0b,0x10,0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0b,0x0b,0x0b,0x07,0x0c,\r\n0x0d,0x0e,0x0c,0x08,0x12,0x0e,0x0f,0x0d,0x0f,0x0c,0x0e,0x0c,0x0a,0x11,0x09,0x0a,0x0a,0x0c,0x0e,0x0e,0x0c,0x18,0x0c,0x18,0x08,0x06,0x04,0x0d,0x05,0x03,0x00,0x03,0x05,0x00,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x16,0x0a,0x12,0x0e,0x16,0x11,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x16,0x16,0x15,0x0b,0x15,0x0b,0x15,0x0f,0x10,0x11,0x11,0x12,0x15,0x18,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x10,0x10,0x10,0x10,0x12,0x0e,0x19,0x14,0x0b,0x0b,0x07,0x07,0x07,0x09,0x05,0x0e,0x06,0x06,0x14,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00,0x05,0x00,0x00,0x05,0x00,0x00,0x0f,0x0e,\r\n0x0b,0x0c,0x10,0x06,0x08,0x10,0x10,0x06,0x0d,0x0d,0x0d,0x11,0x10,0x06,0x0a,0x10,0x0f,0x0f,0x0f,0x0e,0x0e,0x10,0x0d,0x13,0x11,0x0d,0x0d,0x0d,0x06,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x0c,0x10,0x0d,0x0d,0x11,0x0d,0x11,0x0d,0x13,0x13,0x13,0x13,0x0f,0x0f,0x0f,0x0e,0x0b,0x0c,0x10,0x07,0x09,0x10,0x07,0x0d,0x0d,0x0d,0x10,\r\n0x0a,0x10,0x0f,0x0f,0x0e,0x10,0x0d,0x13,0x11,0x06,0x0e,0x0d,0x0f,0x10,0x1d,0x00,0x0f,0x0d,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x06,0x00,0x12,0x0f,0x10,0x11,0x0d,0x10,0x12,0x12,\r\n0x0b,0x0f,0x12,0x12,0x10,0x12,0x13,0x13,0x10,0x0d,0x0d,0x12,0x11,0x0e,0x10,0x10,0x10,0x10,0x10,0x12,0x0e,0x0f,0x10,0x10,0x13,0x0f,0x0f,0x0f,0x10,0x14,0x0c,0x0e,0x0e,0x15,0x0d,0x0d,0x13,0x15,0x0f,0x0d,0x19,0x0e,0x0e,0x12,0x0d,0x0d,0x12,0x0d,0x12,0x14,0x15,0x0d,0x13,0x0d,0x10,0x0d,0x0f,0x0e,0x0f,0x0d,0x0f,0x12,0x0d,0x0f,\r\n0x10,0x0d,0x0d,0x0e,0x17,0x0d,0x0d,0x0e,0x0e,0x0a,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x0d,0x15,0x0c,0x0d,0x15,0x10,0x0d,0x15,0x12,0x12,0x15,0x0e,0x0d,0x15,0x15,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x0e,0x0d,0x0e,0x15,0x0e,0x0d,0x0d,0x0d,0x15,0x13,0x10,0x11,0x11,0x10,0x11,0x0f,0x10,0x13,0x11,0x10,0x0d,0x13,0x10,0x10,\r\n0x0e,0x10,0x11,0x12,0x11,0x0e,0x11,0x10,0x11,0x10,0x13,0x11,0x11,0x11,0x10,0x0f,0x11,0x10,0x11,0x13,0x10,0x12,0x11,0x02,0x03,0x04,0x05,0x04,0x06,0x08,0x15,0x0e,0x0f,0x0e,0x0e,0x0f,0x0e,0x0e,0x10,0x0e,0x0e,0x07,0x14,0x0e,0x0e,0x0e,0x0d,0x0e,0x0c,0x0e,0x06,0x0e,0x0c,0x0e,0x0a,0x15,0x0d,0x0e,0x0e,0x0e,0x14,0x0e,0x0e,0x09,\r\n0x14,0x0e,0x0e,0x10,0x10,0x05,0x07,0x1b,0x1b,0x1b,0x1b,0x22,0x0d,0x0d,0x06,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x0c,0x0c,0x0c,0x0e,0x0a,0x0a,0x0e,0x0f,0x06,0x08,0x0c,0x0a,0x12,0x10,0x0f,0x0c,0x0f,0x0c,0x0a,0x0b,0x0e,0x0c,0x13,0x0c,0x0b,0x0c,0x11,0x13,0x0a,0x0f,0x0c,0x0e,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x06,0x06,0x06,0x06,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x0e,0x0e,0x0b,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0e,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x0c,0x0f,0x0f,0x06,0x06,0x06,0x06,0x06,0x0e,0x08,0x0c,0x0a,0x0a,0x0a,0x0a,0x10,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0a,0x0a,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x11,0x0f,0x0c,\r\n0x0c,0x09,0x0d,0x0a,0x0c,0x0f,0x0f,0x06,0x0c,0x0c,0x12,0x10,0x0b,0x0f,0x0f,0x0c,0x0b,0x0b,0x0b,0x0f,0x0c,0x10,0x0f,0x0c,0x0a,0x0f,0x06,0x0f,0x0b,0x0f,0x06,0x0b,0x0a,0x0e,0x0a,0x0c,0x0a,0x06,0x06,0x08,0x14,0x14,0x0f,0x0c,0x0c,0x0f,0x0c,0x0c,0x0c,0x0a,0x0e,0x0a,0x12,0x0b,0x10,0x10,0x0c,0x0e,0x12,0x0f,0x0f,0x0f,0x0c,0x0c,\r\n0x0b,0x0c,0x0f,0x0c,0x0f,0x0d,0x13,0x14,0x0e,0x11,0x0c,0x0c,0x15,0x0c,0x0a,0x0e,0x0e,0x0f,0x15,0x15,0x10,0x0c,0x0e,0x0a,0x0e,0x0d,0x0d,0x11,0x0d,0x0d,0x10,0x0e,0x0e,0x09,0x0f,0x0f,0x0e,0x0c,0x0c,0x16,0x12,0x0b,0x0d,0x0e,0x0e,0x0f,0x0f,0x11,0x10,0x09,0x16,0x0e,0x0d,0x0e,0x0f,0x0f,0x0c,0x0c,0x06,0x12,0x10,0x10,0x0b,0x11,\r\n0x05,0x05,0x0a,0x0a,0x05,0x05,0x0f,0x0a,0x06,0x12,0x11,0x07,0x05,0x05,0x0b,0x09,0x09,0x06,0x06,0x06,0x09,0x10,0x0b,0x07,0x0f,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x0e,0x08,0x0b,0x0d,0x0a,0x05,0x06,0x09,0x0d,0x08,0x10,0x10,0x10,0x16,0x12,0x16,0x06,0x00,0x00,0x00,0x00,0x00,0x06,0x12,0x14,0x08,0x08,0x0c,0x08,0x16,0x08,0x16,0x08,\r\n0x16,0x08,0x0e,0x0e,0x0e,0x0c,0x0c,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x14,0x14,0x14,0x14,0x14,0x16,0x16,0x0c,0x0c,0x16,0x16,0x0c,0x0c,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x18,0x12,0x14,0x0c,0x0e,0x0e,0x10,0x08,0x10,0x12,0x0c,0x0c,0x08,0x08,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x06,0x16,0x08,0x12,0x0c,0x0c,0x06,0x0c,0x0c,0x0c,0x0c,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1c,0x14,0x1c,0x14,0x1c,0x14,0x20,0x18,0x20,0x18,0x14,0x14,0x14,0x18,0x18,0x18,0x18,0x18,\r\n0x18,0x12,0x0c,0x0c,0x12,0x0c,0x0c,0x16,0x0c,0x1a,0x18,0x16,0x0c,0x14,0x0c,0x14,0x0c,0x14,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x16,0x0c,0x10,0x10,0x10,0x10,0x10,0x08,0x10,0x10,0x08,0x08,0x10,0x08,0x10,0x08,0x10,0x0c,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x08,0x08,0x0c,0x08,0x08,0x08,\r\n0x08,0x00,0x1c,0x14,0x20,0x18,0x16,0x0c,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0c,0x0c,0x0a,0x1c,0x14,0x18,0x18,0x16,0x16,0x16,0x0e,0x0e,0x0e,0x0e,0x10,0x08,0x10,0x08,0x10,0x08,0x1c,0x14,0x0e,0x10,0x0e,0x0e,0x0e,0x10,0x0e,0x0e,0x1c,0x1c,0x14,0x14,0x0a,0x0a,0x0e,0x0e,0x0e,0x0e,0x08,0x08,\r\n0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x12,0x14,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x16,0x08,0x16,0x08,0x0e,0x10,0x0e,0x0e,0x1c,0x1c,0x14,0x14,0x1c,0x1c,0x14,0x14,0x14,0x14,0x0c,0x0c,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x00,0x00,0x06,0x06,0x08,0x06,0x00,0x00,0x00,0x14,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,\r\n0x0a,0x0a,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x10,0x10,\r\n0x10,0x10,0x10,0x10,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x14,0x0e,0x14,0x0e,0x14,0x0e,0x14,0x10,0x10,0x10,0x06,0x06,0x0c,0x0a,0x0e,0x0f,0x0e,0x0d,0x0d,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0b,0x0d,0x0d,0x0e,0x0f,0x0f,0x10,0x0e,0x0e,0x10,0x0c,0x10,0x12,0x0f,0x12,0x14,0x0f,0x12,0x11,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0b,0x0d,0x0f,0x0e,0x10,0x0e,0x10,0x0e,0x0e,0x0e,0x0c,0x0c,0x12,0x10,0x11,0x10,0x10,0x0e,0x0e,0x0e,0x12,0x13,0x12,0x12,0x16,0x16,0x11,0x16,0x16,0x12,0x15,0x14,0x0d,0x12,0x14,0x12,0x0e,0x14,0x12,0x11,0x11,0x0f,0x0f,0x12,0x13,0x11,0x0f,0x11,0x0e,0x0d,0x16,0x16,0x16,\r\n0x14,0x16,0x16,0x10,0x16,0x16,0x11,0x12,0x13,0x12,0x11,0x11,0x0f,0x15,0x12,0x14,0x11,0x11,0x0e,0x12,0x11,0x11,0x14,0x12,0x11,0x16,0x0d,0x0c,0x0d,0x0d,0x0f,0x0f,0x11,0x12,0x0e,0x0e,0x0e,0x0d,0x0e,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0d,0x0e,0x0f,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0f,0x12,0x14,0x10,0x10,0x0f,0x12,\r\n0x0f,0x10,0x0c,0x0b,0x0e,0x0e,0x0b,0x0c,0x0d,0x0d,0x0c,0x0b,0x0f,0x0b,0x0d,0x0c,0x0d,0x13,0x0e,0x14,0x0d,0x0e,0x0e,0x12,0x08,0x13,0x10,0x11,0x10,0x0d,0x12,0x0e,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x06,0x06,0x06,0x06,0x06,0x06,0x06,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x07,0x07,0x06,0x06,0x06,0x06,0x06,0x06,\r\n0x06,0x06,0x0f,0x06,0x06,0x06,0x07,0x07,0x06,0x06,0x06,0x07,0x06,0x06,0x06,0x16,0x16,0x16,0x16,0x0c,0x12,0x11,0x0c,0x0a,0x0c,0x0d,0x0d,0x0c,0x14,0x14,0x15,0x0b,0x18,0x0c,0x14,0x14,0x14,0x13,0x0e,0x0c,0x0c,0x13,0x0e,0x13,0x10,0x0d,0x0b,0x0a,0x18,0x0a,0x0d,0x0c,0x0c,0x0c,0x0c,0x0c,0x21,0x14,0x14,0x0a,0x06,0x0b,0x06,0x0b,\r\n0x06,0x06,0x06,0x0c,0x0e,0x0e,0x0d,0x09,0x09,0x06,0x06,0x06,0x09,0x06,0x0a,0x15,0x05,0x16,0x16,0x16,0x0e,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1c,0x1c,0x10,0x1c,0x1c,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0b,0x0e,0x0b,0x0d,0x0a,0x09,0x08,0x10,0x0d,0x11,0x0a,0x1b,0x15,0x0e,0x0d,0x16,0x13,0x14,0x12,0x18,0x14,0x16,0x13,0x0f,0x0b,0x11,0x0e,0x16,0x12,0x12,0x0f,0x12,0x0e,0x15,0x10,0x15,0x10,0x1a,0x14,0x12,0x0e,0x12,0x0e,0x1d,0x15,0x13,0x00,0x18,0x18,0x18,0x0b,0x00,0x00,0x0e,0x0c,0x11,0x0d,\r\n0x0d,0x0a,0x1a,0x16,0x17,0x15,0x11,0x0e,0x11,0x0e,0x0d,0x0a,0x12,0x0e,0x0d,0x0a,0x14,0x10,0x10,0x0e,0x17,0x14,0x0d,0x0e,0x12,0x12,0x13,0x0b,0x05,0x0b,0x10,0x0a,0x18,0x18,0x06,0x00,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,\r\n0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0c,0x10,0x11,0x07,0x05,0x07,0x05,0x11,0x0e,0x12,\r\n0x0f,0x0d,0x0b,0x0d,0x0c,0x0e,0x0e,0x0a,0x0a,0x1b,0x14,0x1c,0x15,0x18,0x14,0x16,0x10,0x16,0x10,0x16,0x10,0x0f,0x0b,0x0e,0x0c,0x0e,0x0c,0x0e,0x0c,0x0d,0x08,0x0b,0x06,0x12,0x0e,0x15,0x10,0x20,0x18,0x0d,0x0e,0x11,0x11,0x13,0x15,0x12,0x0e,0x17,0x13,0x0d,0x0a,0x0d,0x0c,0x0f,0x0c,0x16,0x11,0x0f,0x0d,0x0d,0x0e,0x0d,0x0e,0x0c,\r\n0x0a,0x0b,0x09,0x0b,0x09,0x0c,0x0d,0x07,0x10,0x08,0x17,0x10,0x08,0x0e,0x0f,0x0b,0x12,0x0d,0x09,0x08,0x0e,0x0e,0x0e,0x0b,0x06,0x12,0x0e,0x09,0x08,0x0f,0x0b,0x11,0x09,0x13,0x0e,0x0f,0x0b,0x10,0x0e,0x0e,0x0c,0x12,0x0e,0x0e,0x08,0x0d,0x0a,0x12,0x0a,0x0d,0x15,0x0c,0x0d,0x16,0x06,0x1c,0x15,0x16,0x1c,0x15,0x16,0x16,0x15,0x15,\r\n0x16,0x0c,0x0b,0x0f,0x11,0x16,0x11,0x17,0x06,0x0b,0x0e,0x15,0x19,0x11,0x19,0x0f,0x0f,0x13,0x11,0x1b,0x16,0x0c,0x16,0x08,0x16,0x08,0x0e,0x0e,0x0e,0x0e,0x14,0x14,0x14,0x14,0x18,0x0c,0x0c,0x18,0x12,0x0c,0x0c,0x12,0x10,0x08,0x08,0x10,0x0e,0x0e,0x0e,0x0e,0x12,0x08,0x08,0x14,0x12,0x08,0x08,0x14,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x0c,0x0a,0x0e,0x0d,0x12,0x0e,0x0e,0x15,0x10,0x12,0x12,0x14,0x14,0x0e,0x0c,0x18,0x13,0x19,0x15,0x10,0x0e,0x08,0x08,0x0e,0x10,0x0a,0x0e,0x0c,0x0e,0x0c,0x12,0x13,0x0a,0x0e,0x0a,0x05,\r\n0x09,0x0d,0x0d,0x05,0x05,0x04,0x05,0x09,0x09,0x09,0x0b,0x24,0x30,0x08,0x0a,0x03,0x06,0x09,0x0a,0x08,0x0c,0x0d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x20,0x0d,0x12,0x16,0x16,0x0f,0x0b,0x0e,0x11,0x12,0x0c,0x08,0x10,0x0c,0x10,0x0d,0x10,0x0d,0x0d,0x12,0x0e,0x0e,0x0d,0x12,0x0f,0x14,0x0b,\r\n0x0d,0x0f,0x08,0x0e,0x08,0x08,0x06,0x15,0x0e,0x0e,0x0d,0x0d,0x0e,0x16,0x16,0x17,0x18,0x18,0x0d,0x0c,0x07,0x0c,0x0b,0x0f,0x0b,0x10,0x06,0x0e,0x0e,0x15,0x15,0x0f,0x0d,0x0e,0x0d,0x0d,0x0b,0x0d,0x0b,0x0c,0x07,0x08,0x06,0x05,0x09,0x0e,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x08,0x08,0x00,\r\n0x07,0x07,0x07,0x06,0x06,0x28,0x18,0x15,0x19,0x07,0x07,0x08,0x0a,0x06,0x06,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x16,0x08,0x08,0x16,0x06,0x0c,0x0c,0x20,0x18,0x18,0x20,0x16,0x0c,0x0c,0x16,0x0c,0x0c,0x0a,0x0a,0x00,0x00,0x09,0x12,0x0e,0x11,0x0e,0x1e,0x19,0x11,0x0d,0x11,0x0d,0x20,0x18,0x12,0x0e,0x09,0x08,\r\n0x0f,0x00,0x10,0x0d,0x08,0x07,0x04,0x0c,0x08,0x08,0x06,0x05,0x0b,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x05,0x0d,0x0a,0x0e,0x0e,0x0d,0x17,0x13,0x13,0x13,0x14,0x17,0x0f,0x10,0x0e,0x09,0x16,0x1b,0x0b,0x1c,0x0c,0x14,0x16,0x16,0x16,0x0a,0x12,0x18,0x12,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x0d,0x00,0x0e,0x0e,0x0e,0x14,0x0c,0x0c,0x16,0x08,0x08,0x16,0x08,0x08,0x16,0x0c,0x0c,0x00,0x0a,0x14,0x08,0x08,0x18,0x0c,0x0c,0x12,0x0c,0x0c,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x24,0x24,0x15,0x00,0x00,0x15,0x15,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x10,0x0f,0x0f,0x10,0x15,0x0f,0x0f,0x13,0x17,0x10,0x0f,0x1a,0x0f,0x0f,0x16,0x0f,0x10,0x13,0x0f,0x12,0x14,0x16,0x0f,0x12,0x10,0x11,0x0f,0x11,0x0f,0x10,0x10,0x0f,0x13,0x0e,0x10,0x13,0x0f,0x0f,0x0e,0x13,0x0f,0x10,0x10,0x11,0x0b,0x0d,0x0f,0x13,0x13,0x0d,0x00,0x00,0x1b,0x36,0x11,0x00,0x03,0x07,0x08,0x0b,\r\n0x10,0x0f,0x16,0x16,0x06,0x08,0x08,0x0b,0x12,0x06,0x0b,0x06,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x06,0x06,0x12,0x12,0x12,0x0c,0x1a,0x11,0x0f,0x11,0x13,0x0e,0x0d,0x13,0x13,0x07,0x0a,0x10,0x0d,0x18,0x14,0x14,0x0f,0x14,0x10,0x0e,0x0e,0x13,0x11,0x19,0x10,0x0f,0x0f,0x08,0x0a,0x08,0x12,0x0b,0x07,0x0e,0x10,\r\n0x0c,0x10,0x0e,0x08,0x10,0x0f,0x07,0x07,0x0d,0x07,0x17,0x0f,0x10,0x10,0x10,0x09,0x0b,0x09,0x0f,0x0d,0x14,0x0c,0x0d,0x0c,0x08,0x06,0x08,0x12,0x11,0x11,0x11,0x0e,0x14,0x14,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x0f,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0f,0x0f,\r\n0x0c,0x0b,0x0c,0x0f,0x0b,0x18,0x18,0x15,0x08,0x0b,0x13,0x17,0x14,0x16,0x12,0x13,0x13,0x0f,0x10,0x0e,0x11,0x14,0x0f,0x0b,0x0c,0x14,0x16,0x10,0x0c,0x07,0x08,0x12,0x12,0x0f,0x13,0x11,0x0e,0x0e,0x14,0x11,0x11,0x14,0x19,0x19,0x0e,0x1b,0x0a,0x0a,0x06,0x06,0x12,0x10,0x0d,0x0f,0x05,0x0f,0x09,0x09,0x0f,0x0f,0x0a,0x06,0x06,0x0a,\r\n0x21,0x11,0x0e,0x11,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x14,0x14,0x13,0x13,0x13,0x07,0x0a,0x09,0x08,0x08,0x05,0x08,0x06,0x09,0x05,0x0a,0x0d,0x07,0x0e,0x0b,0x0f,0x0c,0x06,0x13,0x0f,0x0f,0x0d,0x0f,0x10,0x12,0x12,0x09,0x0a,0x0a,0x19,0x18,0x1a,0x0d,0x13,0x10,0x07,0x0e,0x0b,0x11,0x0c,0x11,0x0c,0x10,0x0b,0x06,0x11,0x0e,0x11,\r\n0x0e,0x13,0x12,0x13,0x0e,0x0e,0x0e,0x0e,0x0d,0x07,0x0d,0x08,0x0d,0x09,0x14,0x0f,0x14,0x0f,0x14,0x10,0x10,0x09,0x10,0x09,0x0e,0x0b,0x0e,0x09,0x0e,0x0c,0x13,0x0f,0x13,0x0f,0x0f,0x0c,0x0f,0x0c,0x0d,0x14,0x14,0x11,0x10,0x0c,0x10,0x0d,0x13,0x0b,0x0d,0x0b,0x1e,0x11,0x0d,0x10,0x06,0x0a,0x16,0x09,0x10,0x0a,0x0a,0x10,0x0a,0x11,\r\n0x0e,0x11,0x0c,0x11,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x0f,0x13,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x07,0x10,0x0d,0x0d,0x0d,0x07,0x14,0x0f,0x14,0x0f,0x14,0x10,0x14,0x10,0x10,0x09,0x0e,0x0b,0x0e,0x09,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x19,0x14,0x0f,0x0d,0x07,0x11,\r\n0x0e,0x17,0x16,0x14,0x10,0x06,0x19,0x14,0x19,0x14,0x19,0x14,0x0f,0x0d,0x06,0x0b,0x0f,0x10,0x19,0x19,0x19,0x18,0x0b,0x0b,0x06,0x07,0x07,0x11,0x0f,0x15,0x0a,0x16,0x12,0x16,0x07,0x11,0x0f,0x0e,0x0f,0x13,0x07,0x10,0x11,0x18,0x14,0x0e,0x14,0x13,0x0f,0x0e,0x0e,0x0f,0x10,0x15,0x14,0x07,0x0f,0x11,0x0c,0x10,0x07,0x0f,0x0f,0x0e,\r\n0x0c,0x10,0x10,0x07,0x0e,0x0d,0x10,0x0e,0x0c,0x10,0x10,0x0c,0x0f,0x0f,0x14,0x16,0x07,0x0f,0x10,0x0f,0x16,0x0e,0x13,0x0d,0x11,0x0e,0x07,0x1a,0x1b,0x14,0x10,0x0f,0x13,0x11,0x0f,0x0f,0x0d,0x13,0x0e,0x17,0x0f,0x14,0x14,0x10,0x12,0x18,0x13,0x14,0x13,0x0f,0x11,0x0e,0x0f,0x14,0x10,0x14,0x12,0x1a,0x1a,0x13,0x15,0x10,0x11,0x1c,\r\n0x10,0x0e,0x10,0x0e,0x0a,0x0f,0x0e,0x14,0x0c,0x10,0x10,0x0d,0x0e,0x13,0x10,0x10,0x10,0x10,0x0c,0x0b,0x0d,0x13,0x0c,0x10,0x0f,0x16,0x16,0x10,0x13,0x0e,0x0c,0x16,0x0e,0x0e,0x10,0x0a,0x0c,0x0b,0x07,0x15,0x16,0x0f,0x0d,0x0d,0x10,0x0d,0x0b,0x1b,0x1e,0x11,0x09,0x0a,0x0a,0x0a,0x07,0x0e,0x0b,0x0f,0x15,0x10,0x13,0x10,0x08,0x09,\r\n0x07,0x07,0x0d,0x0d,0x0d,0x0d,0x08,0x08,0x08,0x0d,0x08,0x0d,0x08,0x08,0x08,0x0d,0x0d,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x10,0x14,\r\n0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x13,0x0f,0x13,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x0f,0x0d,0x0f,0x0d,0x0f,0x0d,0x0e,0x09,0x0e,0x0e,0x14,0x10,0x07,0x0a,0x07,0x07,0x0e,0x0b,0x19,0x15,0x11,0x0e,0x10,0x0d,0x14,0x10,0x0f,0x0d,0x0f,\r\n0x0d,0x11,0x0d,0x12,0x0f,0x12,0x0f,0x13,0x0e,0x14,0x10,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x07,0x07,0x08,0x08,0x08,0x08,0x0e,0x0e,0x11,0x0e,0x0f,0x10,0x0f,0x10,0x0f,0x10,0x11,0x0c,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x13,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x08,0x13,0x10,0x13,\r\n0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x07,0x07,0x07,0x07,0x10,0x0d,0x10,0x0d,0x10,0x0d,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x0d,0x07,0x18,0x17,0x18,0x17,0x18,0x17,0x14,0x0f,0x14,0x0f,0x14,0x0f,0x14,0x0f,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x10,0x0f,0x10,0x10,0x09,0x10,0x09,0x10,0x09,0x10,0x09,0x0e,0x0b,0x0e,\r\n0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x0b,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x0e,0x09,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x11,0x0d,0x11,0x0d,0x19,0x14,0x19,0x14,0x10,0x0c,0x10,0x0c,0x0f,0x0d,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x09,0x14,0x0d,0x0e,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,\r\n0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x0f,0x0f,0x12,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x0c,0x0c,0x10,0x10,0x07,0x07,0x10,0x10,0x0f,0x0f,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x19,\r\n0x19,0x19,0x19,0x19,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x15,0x15,0x13,0x10,0x10,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0a,0x0a,0x10,0x10,0x10,\r\n0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x0f,0x0f,0x0f,0x0f,0x12,0x12,0x11,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x16,0x14,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11,0x0f,0x10,0x10,0x10,0x11,0x11,0x0d,0x13,0x14,0x0f,0x10,0x10,0x0e,0x0f,0x0d,0x13,0x11,0x18,0x08,0x08,\r\n0x10,0x0d,0x07,0x0d,0x18,0x14,0x10,0x14,0x1a,0x15,0x10,0x10,0x10,0x0e,0x0b,0x0e,0x08,0x09,0x0e,0x09,0x0e,0x14,0x13,0x0f,0x0e,0x0f,0x0c,0x10,0x10,0x0c,0x0b,0x0f,0x0f,0x0a,0x0b,0x0f,0x06,0x0a,0x0c,0x08,0x21,0x1f,0x1c,0x17,0x13,0x0e,0x1d,0x1a,0x16,0x11,0x0e,0x07,0x07,0x14,0x10,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,\r\n0x0f,0x0e,0x11,0x0e,0x11,0x0e,0x17,0x16,0x13,0x10,0x13,0x10,0x10,0x0d,0x14,0x10,0x14,0x10,0x10,0x0c,0x07,0x21,0x1f,0x1c,0x13,0x10,0x1b,0x13,0x14,0x0f,0x11,0x0e,0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x07,0x07,0x07,0x07,0x14,0x10,0x14,0x10,0x10,0x09,0x10,0x09,0x13,0x0f,0x13,0x0f,0x0e,0x0c,0x13,0x0f,0x14,0x10,0x0f,0x0f,0x0c,0x11,\r\n0x0e,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x0d,0x10,0x0e,0x0f,0x0f,0x10,0x0e,0x10,0x10,0x10,0x0d,0x0d,0x10,0x10,0x0e,0x11,0x0b,0x0b,0x0e,0x0f,0x07,0x10,0x10,0x0e,0x0d,0x0c,0x0f,0x0f,0x0f,0x07,0x08,0x09,0x08,0x0a,0x07,0x10,0x17,0x17,0x17,0x0f,0x0f,0x10,0x10,0x13,0x13,0x11,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,\r\n0x0c,0x0b,0x07,0x07,0x08,0x08,0x09,0x09,0x10,0x10,0x0f,0x0d,0x14,0x0d,0x0b,0x0c,0x0e,0x0c,0x0c,0x0a,0x0a,0x0a,0x0d,0x11,0x0d,0x0f,0x0e,0x0f,0x07,0x0d,0x0a,0x10,0x0a,0x0a,0x19,0x1a,0x1a,0x11,0x0d,0x13,0x15,0x10,0x0f,0x0d,0x0d,0x0f,0x10,0x0f,0x12,0x0f,0x11,0x16,0x0f,0x13,0x10,0x10,0x0c,0x0d,0x0c,0x10,0x0e,0x11,0x0d,0x18,\r\n0x17,0x10,0x0e,0x11,0x0e,0x10,0x0c,0x10,0x0d,0x12,0x10,0x0f,0x0b,0x0f,0x10,0x0c,0x07,0x14,0x0d,0x0d,0x17,0x12,0x11,0x10,0x19,0x13,0x12,0x0d,0x18,0x13,0x14,0x0f,0x19,0x14,0x0f,0x0c,0x15,0x15,0x14,0x10,0x13,0x10,0x13,0x10,0x23,0x1e,0x16,0x12,0x1e,0x18,0x17,0x12,0x10,0x0c,0x0e,0x0b,0x0b,0x00,0x00,0x1b,0x1a,0x10,0x0e,0x0f,\r\n0x10,0x0f,0x0e,0x0f,0x0c,0x10,0x0d,0x13,0x10,0x17,0x12,0x1b,0x17,0x13,0x0f,0x11,0x0c,0x0e,0x0b,0x18,0x12,0x13,0x10,0x17,0x11,0x17,0x11,0x07,0x17,0x14,0x10,0x0e,0x13,0x10,0x12,0x0f,0x11,0x0e,0x11,0x0e,0x17,0x16,0x0e,0x0e,0x13,0x0e,0x13,0x0e,0x17,0x14,0x0f,0x0c,0x0e,0x0c,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x11,0x0c,\r\n0x0f,0x0d,0x0f,0x0d,0x0f,0x0d,0x12,0x0f,0x15,0x13,0x0f,0x10,0x17,0x17,0x16,0x13,0x0f,0x0d,0x18,0x15,0x1b,0x17,0x13,0x0e,0x12,0x10,0x10,0x0f,0x0f,0x0e,0x10,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x10,0x09,0x09,0x04,0x06,0x06,0x06,0x08,0x0b,0x08,0x06,0x0a,0x06,0x06,0x06,0x09,0x09,\r\n0x06,0x06,0x10,0x10,0x10,0x10,0x09,0x08,0x07,0x09,0x08,0x07,0x08,0x08,0x08,0x09,0x09,0x09,0x09,0x09,0x08,0x09,0x09,0x08,0x04,0x07,0x08,0x06,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x09,0x09,0x0b,0x09,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,\r\n0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x11,0x08,0x11,0x09,0x10,0x10,0x09,0x09,\r\n0x09,0x09,0x09,0x07,0x09,0x09,0x09,0x08,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x10,0x0d,0x12,0x16,0x0d,0x0c,0x0f,0x0f,0x0b,0x0b,0x07,0x08,0x0d,0x0b,0x13,0x10,0x10,0x0d,0x11,0x11,0x11,0x19,0x0e,0x10,0x10,0x0c,0x0c,0x0c,0x0b,0x0e,0x0f,0x13,0x0f,0x0d,0x14,0x0c,0x0b,\r\n0x0b,0x0e,0x0a,0x0d,0x10,0x0c,0x10,0x0f,0x0a,0x0d,0x09,0x0a,0x0b,0x08,0x08,0x0b,0x0b,0x05,0x06,0x0a,0x08,0x0e,0x0c,0x0c,0x0c,0x0a,0x09,0x09,0x08,0x0b,0x0e,0x09,0x09,0x09,0x0d,0x09,0x09,0x08,0x08,0x07,0x07,0x09,0x04,0x08,0x0d,0x09,0x09,0x07,0x09,0x09,0x09,0x05,0x09,0x09,0x0d,0x08,0x09,0x09,0x08,0x09,0x0b,0x08,0x04,0x06,\r\n0x09,0x08,0x09,0x08,0x09,0x0b,0x08,0x10,0x04,0x09,0x0f,0x18,0x11,0x0f,0x0f,0x17,0x11,0x17,0x14,0x0e,0x10,0x0e,0x0c,0x1e,0x0c,0x10,0x18,0x19,0x19,0x11,0x11,0x11,0x0c,0x0d,0x0e,0x0b,0x0c,0x0e,0x05,0x00,0x00,0x00,0x00,0x10,0x11,0x11,0x11,0x0d,0x0a,0x10,0x10,0x08,0x17,0x0f,0x10,0x09,0x09,0x0d,0x09,0x0c,0x10,0x0c,0x10,0x18,\r\n0x11,0x09,0x07,0x10,0x0e,0x10,0x10,0x10,0x08,0x10,0x0d,0x07,0x17,0x0f,0x10,0x09,0x0b,0x0c,0x0d,0x0c,0x0c,0x0e,0x10,0x10,0x0e,0x0c,0x0c,0x14,0x07,0x0d,0x07,0x0f,0x0c,0x09,0x07,0x07,0x09,0x07,0x05,0x04,0x09,0x09,0x04,0x05,0x05,0x05,0x04,0x05,0x04,0x06,0x0d,0x0d,0x09,0x09,0x0a,0x09,0x0a,0x06,0x04,0x05,0x09,0x09,0x09,0x09,\r\n0x08,0x07,0x07,0x08,0x07,0x09,0x00,0x00,0x00,0x00,0x06,0x09,0x08,0x09,0x07,0x08,0x0f,0x0f,0x0f,0x0f,0x09,0x00,0x00,0x00,0x00,0x0d,0x08,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x07,0x07,0x0f,0x0f,0x0f,0x0f,0x24,0x24,0x24,0x24,\r\n0x24,0x24,0x24,0x24,0x24,0x24,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x05,0x0a,0x0a,0x09,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x0a,0x09,0x0a,0x0a,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x08,0x15,0x11,0x13,0x10,0x14,0x11,0x19,0x14,0x0f,0x0a,0x0e,0x12,0x0e,0x16,0x13,0x00,0x00,0x00,\r\n0x00,0x07,0x07,0x07,0x07,0x09,0x09,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x17,0x17,0x1b,0x0b,0x07,0x0e,0x10,0x0b,0x0e,0x0e,0x10,0x10,0x0e,0x1b,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x11,0x0e,0x0e,0x0e,0x09,0x10,0x09,0x14,0x12,0x0e,0x09,0x17,0x0e,0x17,0x07,0x09,0x10,0x10,0x11,0x11,0x11,0x10,0x10,0x10,0x17,0x07,0x10,0x07,\r\n0x0e,0x0b,0x07,0x07,0x0e,0x07,0x14,0x07,0x19,0x0e,0x19,0x19,0x10,0x10,0x10,0x0e,0x0e,0x0b,0x0b,0x20,0x20,0x24,0x24,0x17,0x17,0x0e,0x0e,0x05,0x1b,0x14,0x17,0x12,0x10,0x12,0x0e,0x0e,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x07,0x11,0x00,0x11,0x11,0x11,0x09,0x0e,0x0e,0x19,0x09,0x19,0x09,0x10,0x12,0x10,0x0b,\r\n0x19,0x0e,0x19,0x0e,0x14,0x17,0x09,0x0e,0x0e,0x0b,0x07,0x0e,0x10,0x0e,0x10,0x0e,0x10,0x10,0x0e,0x12,0x11,0x19,0x09,0x0e,0x0b,0x12,0x0e,0x09,0x0e,0x0e,0x0e,0x19,0x09,0x19,0x09,0x07,0x10,0x0b,0x1b,0x0e,0x0e,0x11,0x11,0x1b,0x0e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x11,0x14,0x11,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,\r\n0x0b,0x0b,0x0e,0x0e,0x14,0x17,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0b,0x0e,0x0b,0x0b,0x0b,0x20,0x17,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x0e,0x10,\r\n0x10,0x10,0x1b,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x14,0x14,0x1d,0x1b,0x19,0x0e,0x17,0x0e,0x17,0x0e,0x17,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x12,0x09,0x12,0x09,0x0f,0x12,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x17,\r\n0x19,0x14,0x17,0x09,0x0e,0x14,0x17,0x14,0x17,0x00,0x00,0x00,0x00,0x00,0x1e,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0b,0x00,0x00,0x10,0x00,0x00,0x00,0x20,0x17,0x24,0x1b,0x0e,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x19,0x19,0x0a,0x10,0x10,0x10,0x21,0x16,\r\n0x0e,0x29,0x1d,0x09,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0e,0x0b,0x0b,0x14,0x12,0x12,0x0e,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x22,0x29,0x00,0x00,0x00,0x00,0x00,0x10,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x10,0x12,0x10,\r\n0x0e,0x0e,0x0b,0x20,0x17,0x0e,0x10,0x10,0x10,0x0e,0x10,0x10,0x10,0x0e,0x10,0x10,0x10,0x1b,0x0e,0x0e,0x1b,0x0e,0x0e,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x10,0x10,0x10,0x10,0x12,0x09,0x12,0x09,0x12,0x09,0x12,0x12,0x09,0x09,0x0b,0x0b,0x20,0x17,0x11,0x10,0x10,0x00,0x0e,0x0e,0x0e,0x0a,0x0f,0x13,0x11,0x0e,0x0e,0x0a,\r\n0x07,0x14,0x10,0x10,0x09,0x0f,0x0d,0x0d,0x0c,0x0d,0x07,0x0e,0x0b,0x11,0x0d,0x10,0x0c,0x0f,0x0c,0x12,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0c,0x0d,0x0d,0x08,0x0e,0x0f,0x10,0x0e,0x09,0x14,0x10,0x11,0x0e,0x11,0x0d,0x0f,0x0e,0x0b,0x13,0x0a,0x0b,0x0b,0x0d,0x10,0x10,0x0e,0x1b,0x0e,0x1b,0x09,0x07,0x05,0x0f,\r\n0x06,0x03,0x00,0x04,0x06,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x19,0x0b,0x14,0x10,0x19,0x14,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x17,0x0d,0x17,0x0d,0x17,0x11,0x12,0x13,0x13,0x15,0x17,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x12,0x14,0x10,0x1d,\r\n0x16,0x0d,0x0d,0x08,0x08,0x08,0x0a,0x06,0x0f,0x06,0x06,0x17,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x00,0x05,0x00,0x00,0x06,0x00,0x00,0x11,0x0f,0x0c,0x0d,0x12,0x07,0x09,0x12,0x12,0x07,0x0f,0x0f,0x0f,0x13,0x12,0x07,0x0b,0x12,0x10,0x11,0x11,0x0f,0x10,0x12,0x0f,0x15,0x14,0x0e,0x0e,0x0e,\r\n0x06,0x0a,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x11,0x0d,0x12,0x0f,0x0f,0x13,0x0f,0x14,0x0f,0x15,0x15,0x15,0x15,0x11,0x11,0x11,0x0f,0x0c,0x0d,0x12,0x08,0x0a,0x12,0x08,0x0f,0x0f,0x0f,0x12,0x0b,0x12,0x11,0x11,0x10,0x12,0x0f,0x15,0x14,0x07,0x0f,0x0f,0x11,0x12,0x20,0x00,0x11,0x0f,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x07,0x00,0x14,0x11,0x12,0x13,0x0f,0x12,0x14,0x15,0x0d,0x11,0x14,0x14,0x12,0x14,0x16,0x15,0x12,0x0f,0x0f,0x14,0x13,0x0f,0x13,0x12,0x12,0x12,0x13,0x14,0x10,0x11,0x12,0x12,0x15,0x11,0x11,0x11,\r\n0x12,0x16,0x0d,0x10,0x10,0x18,0x0f,0x0f,0x15,0x18,0x10,0x0f,0x1c,0x0f,0x0f,0x14,0x0f,0x0f,0x14,0x0f,0x14,0x16,0x18,0x0f,0x15,0x0f,0x12,0x0f,0x11,0x0f,0x11,0x0f,0x10,0x15,0x0f,0x11,0x12,0x0f,0x0f,0x10,0x1a,0x0f,0x0f,0x10,0x10,0x0b,0x09,0x0f,0x0f,0x0f,0x0e,0x0f,0x18,0x0f,0x18,0x0d,0x0f,0x18,0x12,0x0f,0x18,0x14,0x14,0x18,\r\n0x10,0x0f,0x18,0x18,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x18,0x18,0x10,0x0f,0x0f,0x18,0x10,0x0f,0x0f,0x0f,0x18,0x15,0x13,0x13,0x13,0x13,0x13,0x11,0x13,0x15,0x13,0x12,0x0f,0x15,0x12,0x13,0x0f,0x12,0x13,0x14,0x13,0x10,0x13,0x12,0x14,0x12,0x15,0x13,0x13,0x14,0x12,0x11,0x13,0x12,0x13,0x15,0x12,0x14,0x14,0x03,0x03,0x04,0x05,0x04,\r\n0x07,0x09,0x17,0x0f,0x11,0x10,0x0f,0x11,0x0f,0x0f,0x11,0x10,0x0f,0x08,0x17,0x10,0x0f,0x0f,0x0f,0x10,0x0e,0x10,0x07,0x10,0x0e,0x0f,0x0b,0x17,0x0f,0x0f,0x0f,0x10,0x16,0x0f,0x10,0x0b,0x16,0x10,0x10,0x13,0x12,0x06,0x08,0x1f,0x1e,0x1e,0x1f,0x26,0x0f,0x0f,0x07,0x0f,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0d,0x0e,0x10,0x0c,0x0b,0x0f,0x11,0x07,0x08,0x0d,0x0b,0x14,0x11,0x11,0x0d,0x11,0x0d,0x0b,0x0c,0x10,0x0e,0x16,0x0e,0x0d,0x0d,0x13,\r\n0x15,0x0b,0x11,0x0d,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x10,0x10,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0e,0x11,0x11,0x07,0x07,0x07,0x07,0x07,0x0f,0x08,0x0d,0x0b,0x0b,0x0b,0x0b,0x11,0x11,\r\n0x11,0x12,0x11,0x11,0x11,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0e,0x13,0x11,0x0e,0x0d,0x0b,0x0e,0x0c,0x0d,0x11,0x11,0x07,0x0d,0x0e,0x14,0x11,0x0c,0x11,0x11,0x0d,0x0c,0x0c,0x0d,0x11,0x0e,0x12,0x11,0x0e,0x0c,0x11,0x07,0x11,\r\n0x0d,0x11,0x07,0x0d,0x0c,0x0f,0x0b,0x0e,0x0b,0x07,0x07,0x08,0x16,0x16,0x10,0x0d,0x0d,0x10,0x0e,0x0d,0x0d,0x0b,0x10,0x0c,0x14,0x0c,0x11,0x11,0x0d,0x0f,0x14,0x11,0x11,0x11,0x0d,0x0e,0x0c,0x0d,0x11,0x0e,0x11,0x0f,0x16,0x16,0x0f,0x13,0x0d,0x0e,0x17,0x0d,0x0b,0x10,0x10,0x11,0x18,0x18,0x12,0x0e,0x0f,0x0b,0x0f,0x0f,0x0f,0x13,\r\n0x0e,0x0e,0x13,0x10,0x10,0x0a,0x11,0x11,0x0f,0x0d,0x0d,0x18,0x14,0x0d,0x0e,0x10,0x10,0x11,0x11,0x13,0x13,0x0a,0x19,0x10,0x0f,0x0f,0x11,0x11,0x0e,0x0e,0x07,0x14,0x13,0x13,0x0d,0x13,0x06,0x06,0x0c,0x0c,0x06,0x06,0x11,0x0b,0x07,0x14,0x13,0x08,0x06,0x06,0x0c,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x12,0x0d,0x08,0x10,0x13,0x10,0x10,\r\n0x0d,0x14,0x0f,0x10,0x09,0x0c,0x0e,0x0b,0x06,0x06,0x0b,0x0e,0x09,0x12,0x12,0x12,0x19,0x14,0x19,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x14,0x17,0x09,0x09,0x0e,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x10,0x0e,0x0e,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x19,0x19,0x0e,0x0e,0x19,0x19,0x0e,\r\n0x0e,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x1b,0x14,0x17,0x0e,0x10,0x10,0x12,0x09,0x12,0x14,0x0e,0x0e,0x09,0x09,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x19,0x09,0x14,0x0e,0x0e,0x07,0x0e,0x0e,0x0e,0x0e,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,\r\n0x19,0x09,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x20,0x17,0x20,0x17,0x20,0x17,0x24,0x1b,0x24,0x1b,0x17,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x14,0x0e,0x0e,0x14,0x0e,0x0e,0x19,0x0e,0x1d,0x1b,0x19,0x0e,0x17,0x0e,0x17,0x0e,0x17,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,0x0e,0x19,\r\n0x0e,0x19,0x0e,0x12,0x12,0x12,0x12,0x12,0x09,0x12,0x12,0x09,0x09,0x12,0x09,0x12,0x09,0x12,0x0e,0x10,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x0e,0x09,0x09,0x09,0x09,0x00,0x20,0x17,0x24,0x1b,0x19,0x0e,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x19,0x09,0x10,0x10,0x0e,0x0e,0x0b,0x20,0x17,0x1b,\r\n0x1b,0x19,0x19,0x19,0x10,0x10,0x10,0x10,0x12,0x09,0x12,0x09,0x12,0x09,0x20,0x17,0x10,0x12,0x10,0x10,0x10,0x12,0x10,0x10,0x20,0x20,0x17,0x17,0x0b,0x0b,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x14,0x17,0x09,0x09,0x10,0x10,0x10,0x10,0x19,0x09,0x19,0x09,0x10,0x12,0x10,0x10,0x20,0x20,\r\n0x17,0x17,0x20,0x20,0x17,0x17,0x17,0x17,0x0e,0x0e,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x09,0x07,0x00,0x00,0x00,0x17,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0b,0x0b,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x19,0x19,0x19,0x19,\r\n0x19,0x19,0x19,0x19,0x19,0x19,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x14,0x12,0x12,0x12,0x12,0x12,0x12,0x10,0x17,0x10,0x17,0x10,0x17,0x10,0x17,0x12,0x12,0x12,0x07,0x07,0x0e,0x0b,0x10,0x11,\r\n0x0f,0x0f,0x0f,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0c,0x0f,0x0e,0x10,0x10,0x11,0x12,0x10,0x0f,0x12,0x0e,0x12,0x14,0x11,0x14,0x16,0x11,0x15,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0c,0x0f,0x10,0x10,0x12,0x0f,0x11,0x10,0x10,0x10,0x0e,0x0e,0x14,0x12,0x13,0x12,0x12,\r\n0x10,0x10,0x10,0x14,0x15,0x14,0x15,0x19,0x19,0x13,0x19,0x19,0x14,0x18,0x17,0x0f,0x15,0x17,0x15,0x10,0x17,0x14,0x13,0x13,0x10,0x11,0x14,0x15,0x13,0x11,0x13,0x10,0x0e,0x19,0x19,0x19,0x16,0x19,0x19,0x12,0x19,0x19,0x13,0x15,0x15,0x14,0x14,0x14,0x11,0x18,0x15,0x16,0x13,0x13,0x10,0x14,0x13,0x13,0x17,0x14,0x14,0x18,0x0f,0x0e,\r\n0x0f,0x0e,0x11,0x11,0x13,0x14,0x10,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x0f,0x0f,0x0f,0x0e,0x0e,0x10,0x11,0x10,0x10,0x0c,0x0f,0x0f,0x10,0x10,0x15,0x17,0x12,0x12,0x11,0x15,0x11,0x12,0x0e,0x0d,0x10,0x0f,0x0d,0x0d,0x0f,0x0f,0x0d,0x0d,0x11,0x0c,0x0f,0x0d,0x0f,0x15,0x0f,0x16,0x0e,0x0f,0x0f,0x14,0x08,0x15,0x13,0x13,\r\n0x12,0x0f,0x14,0x10,0x15,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0d,0x0c,0x08,0x08,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x11,0x07,0x07,0x07,0x08,0x08,0x07,0x07,0x07,0x08,0x07,0x07,0x07,0x18,0x18,0x18,0x18,0x0d,0x14,0x14,0x0d,0x0b,0x0d,0x0e,0x0f,0x0d,\r\n0x17,0x16,0x17,0x0c,0x1b,0x0d,0x17,0x17,0x17,0x16,0x0f,0x0d,0x0d,0x15,0x10,0x15,0x12,0x0e,0x0c,0x0b,0x1c,0x0b,0x0e,0x0d,0x0d,0x0d,0x0d,0x0d,0x25,0x17,0x17,0x0c,0x07,0x0c,0x06,0x0c,0x06,0x06,0x06,0x0d,0x10,0x10,0x0f,0x0a,0x0a,0x06,0x06,0x06,0x0a,0x06,0x0b,0x17,0x06,0x18,0x18,0x18,0x10,0x10,0x17,0x17,0x17,0x17,0x17,0x17,\r\n0x17,0x17,0x17,0x17,0x20,0x20,0x12,0x20,0x20,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x0d,0x10,0x0d,0x0e,0x0b,0x0a,0x09,0x13,0x0f,0x13,0x0c,0x1e,0x18,0x10,0x0f,0x19,0x15,0x17,0x14,0x1c,0x16,\r\n0x19,0x15,0x11,0x0d,0x14,0x10,0x19,0x14,0x14,0x10,0x14,0x10,0x17,0x12,0x18,0x12,0x1e,0x17,0x14,0x10,0x14,0x10,0x21,0x18,0x15,0x00,0x1b,0x1b,0x1b,0x0d,0x00,0x00,0x10,0x0e,0x13,0x0f,0x0e,0x0b,0x1d,0x18,0x1a,0x17,0x13,0x10,0x13,0x10,0x0e,0x0b,0x14,0x10,0x0e,0x0b,0x16,0x12,0x12,0x0f,0x1a,0x16,0x0f,0x10,0x14,0x14,0x16,0x0c,\r\n0x05,0x0c,0x12,0x0c,0x1b,0x1b,0x07,0x00,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0b,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,\r\n0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x14,\r\n0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0d,0x12,0x14,0x08,0x06,0x08,0x06,0x13,0x0f,0x14,0x11,0x0f,0x0d,0x0e,0x0d,0x10,0x0f,0x0b,0x0b,0x1e,0x16,0x1f,0x18,0x1b,0x17,0x18,0x12,0x18,0x12,0x18,0x12,0x11,0x0c,0x10,0x0d,0x10,0x0d,0x10,\r\n0x0d,0x0f,0x08,0x0d,0x07,0x14,0x10,0x17,0x12,0x24,0x1b,0x0f,0x10,0x13,0x13,0x16,0x17,0x14,0x10,0x1a,0x15,0x0f,0x0b,0x0f,0x0d,0x11,0x0d,0x19,0x14,0x11,0x0e,0x0f,0x10,0x0f,0x10,0x0d,0x0b,0x0d,0x0a,0x0d,0x0a,0x0e,0x0e,0x08,0x12,0x09,0x1a,0x12,0x09,0x10,0x11,0x0c,0x14,0x0f,0x0a,0x09,0x10,0x10,0x10,0x0d,0x07,0x15,0x10,0x0a,\r\n0x09,0x11,0x0c,0x13,0x0a,0x15,0x10,0x11,0x0c,0x13,0x10,0x10,0x0d,0x14,0x0f,0x10,0x09,0x0e,0x0b,0x14,0x0b,0x0e,0x17,0x0d,0x0f,0x18,0x07,0x1f,0x18,0x18,0x20,0x18,0x19,0x19,0x18,0x18,0x19,0x0e,0x0d,0x11,0x13,0x18,0x13,0x19,0x07,0x0c,0x10,0x17,0x1c,0x13,0x1c,0x11,0x11,0x15,0x13,0x1f,0x19,0x0e,0x19,0x09,0x19,0x09,0x10,0x10,\r\n0x10,0x10,0x17,0x17,0x17,0x17,0x1b,0x0e,0x0e,0x1b,0x14,0x0e,0x0e,0x14,0x12,0x09,0x09,0x12,0x10,0x10,0x10,0x10,0x14,0x09,0x09,0x17,0x14,0x09,0x09,0x17,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,\r\n0x0e,0x0b,0x0f,0x0e,0x14,0x10,0x10,0x18,0x12,0x14,0x14,0x16,0x16,0x10,0x0d,0x1b,0x16,0x1c,0x17,0x13,0x10,0x08,0x08,0x10,0x11,0x0b,0x10,0x0e,0x10,0x0d,0x14,0x16,0x0b,0x10,0x0c,0x06,0x0a,0x0e,0x0f,0x06,0x06,0x05,0x06,0x0a,0x0a,0x0a,0x0c,0x28,0x36,0x09,0x0b,0x04,0x07,0x0a,0x0c,0x09,0x0d,0x0e,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0d,0x0d,0x0d,0x24,0x0f,0x15,0x19,0x18,0x11,0x0c,0x0f,0x13,0x14,0x0d,0x08,0x12,0x0e,0x12,0x0f,0x12,0x0e,0x0f,0x14,0x10,0x10,0x0e,0x14,0x11,0x16,0x0c,0x0e,0x11,0x08,0x10,0x09,0x09,0x07,0x18,0x10,0x0f,0x0e,0x0e,0x10,0x19,0x19,0x19,0x1b,0x1b,0x0f,0x0d,0x08,0x0e,0x0c,0x10,0x0c,0x12,0x07,0x0f,\r\n0x10,0x17,0x17,0x11,0x0f,0x10,0x0f,0x0e,0x0c,0x0e,0x0c,0x0d,0x08,0x09,0x07,0x06,0x0a,0x10,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x09,0x09,0x00,0x08,0x08,0x08,0x07,0x07,0x2d,0x1b,0x18,0x1c,0x08,0x08,0x09,0x0b,0x07,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x19,0x09,\r\n0x09,0x19,0x07,0x0e,0x0e,0x24,0x1b,0x1b,0x24,0x19,0x0e,0x0e,0x19,0x0e,0x0e,0x0b,0x0b,0x00,0x00,0x0a,0x14,0x10,0x13,0x10,0x22,0x1c,0x13,0x0f,0x13,0x0f,0x24,0x1b,0x14,0x10,0x0a,0x09,0x11,0x00,0x12,0x0f,0x09,0x08,0x04,0x0d,0x09,0x09,0x07,0x05,0x0c,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x06,0x0e,0x0c,0x10,0x0f,0x0f,0x1a,\r\n0x16,0x16,0x15,0x16,0x19,0x11,0x13,0x10,0x0b,0x19,0x1e,0x0c,0x1f,0x0e,0x17,0x19,0x19,0x19,0x0b,0x14,0x1b,0x14,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x10,0x10,0x10,0x17,0x0e,0x0e,0x19,0x09,0x09,0x19,0x09,0x09,0x19,0x0d,0x0d,0x00,0x0b,0x17,0x09,0x09,0x1b,0x0e,0x0e,0x14,0x0e,\r\n0x0e,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x29,0x29,0x18,0x00,0x00,0x18,0x18,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x11,0x11,0x12,0x18,0x11,0x11,0x16,0x1a,0x12,0x11,0x1d,0x11,0x11,0x19,0x11,0x12,0x15,0x11,0x15,0x17,0x19,0x11,0x15,\r\n0x12,0x13,0x11,0x13,0x11,0x12,0x13,0x11,0x15,0x10,0x12,0x15,0x11,0x11,0x0f,0x15,0x11,0x12,0x12,0x13,0x0c,0x0e,0x11,0x15,0x15,0x0f,0x00,0x00,0x1d,0x3a,0x13,0x00,0x03,0x08,0x08,0x0b,0x11,0x10,0x18,0x17,0x07,0x09,0x09,0x0c,0x14,0x06,0x0c,0x06,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x06,0x06,0x14,0x14,0x14,\r\n0x0d,0x1c,0x13,0x11,0x12,0x14,0x0f,0x0e,0x14,0x15,0x08,0x0a,0x11,0x0e,0x1a,0x16,0x16,0x10,0x16,0x11,0x0f,0x0f,0x14,0x12,0x1b,0x11,0x10,0x11,0x09,0x0b,0x09,0x14,0x0c,0x08,0x0f,0x11,0x0d,0x11,0x0f,0x09,0x11,0x10,0x07,0x07,0x0e,0x07,0x19,0x10,0x11,0x11,0x11,0x0a,0x0c,0x0a,0x10,0x0e,0x15,0x0d,0x0e,0x0d,0x09,0x07,0x09,0x14,\r\n0x13,0x13,0x12,0x0f,0x16,0x16,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0f,0x0f,0x0f,0x0f,0x07,0x07,0x07,0x07,0x10,0x11,0x11,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x0b,0x0b,0x10,0x10,0x0d,0x0c,0x0d,0x10,0x0c,0x1a,0x1a,0x16,0x08,0x0c,0x14,0x19,0x16,0x18,0x14,0x14,0x14,0x10,0x11,0x10,0x12,0x16,0x10,0x0b,0x0c,0x16,0x18,0x11,\r\n0x0d,0x08,0x08,0x14,0x13,0x10,0x14,0x13,0x0f,0x0f,0x15,0x13,0x13,0x16,0x1b,0x1b,0x0f,0x1d,0x0b,0x0b,0x07,0x07,0x14,0x11,0x0e,0x10,0x05,0x10,0x09,0x09,0x10,0x10,0x0b,0x06,0x07,0x0b,0x23,0x13,0x0f,0x13,0x0f,0x0f,0x08,0x08,0x08,0x08,0x16,0x16,0x16,0x14,0x14,0x14,0x07,0x0b,0x0a,0x09,0x09,0x06,0x08,0x06,0x09,0x05,0x0b,0x0e,\r\n0x08,0x0f,0x0c,0x11,0x0d,0x07,0x14,0x10,0x10,0x0e,0x10,0x11,0x14,0x14,0x0a,0x0b,0x0b,0x1b,0x1a,0x1c,0x0e,0x14,0x11,0x08,0x0f,0x0c,0x12,0x0d,0x12,0x0d,0x11,0x0c,0x06,0x13,0x0f,0x13,0x0f,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0e,0x07,0x0e,0x09,0x0e,0x09,0x16,0x10,0x16,0x10,0x16,0x11,0x11,0x0a,0x11,0x0a,0x0f,0x0c,0x0f,0x0a,\r\n0x0f,0x0d,0x14,0x10,0x14,0x10,0x11,0x0d,0x11,0x0d,0x0e,0x16,0x16,0x12,0x11,0x0d,0x11,0x0e,0x14,0x0c,0x0e,0x0b,0x20,0x12,0x0e,0x12,0x07,0x0b,0x17,0x09,0x12,0x0a,0x0a,0x12,0x0a,0x13,0x0f,0x12,0x0d,0x12,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x14,0x11,0x14,0x11,0x14,0x11,0x15,0x10,0x15,0x10,0x08,0x07,0x08,0x07,0x08,0x07,0x08,\r\n0x07,0x0a,0x07,0x11,0x0e,0x0e,0x0e,0x07,0x16,0x10,0x16,0x10,0x16,0x11,0x16,0x11,0x11,0x0a,0x0f,0x0c,0x0f,0x0a,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x1b,0x15,0x10,0x0e,0x07,0x13,0x0f,0x19,0x18,0x16,0x11,0x06,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x10,0x0e,0x07,0x0c,0x10,0x11,0x1b,0x1b,0x1b,0x1a,0x0b,0x0b,0x06,0x08,0x08,0x13,\r\n0x11,0x16,0x0b,0x17,0x13,0x18,0x08,0x13,0x11,0x0f,0x11,0x15,0x08,0x11,0x12,0x1a,0x16,0x0f,0x16,0x15,0x10,0x0f,0x0f,0x10,0x11,0x17,0x16,0x08,0x10,0x12,0x0d,0x11,0x08,0x10,0x10,0x0f,0x0d,0x11,0x11,0x08,0x0f,0x0e,0x11,0x0f,0x0d,0x11,0x11,0x0d,0x10,0x10,0x16,0x17,0x08,0x10,0x11,0x10,0x17,0x0f,0x14,0x0e,0x12,0x0f,0x08,0x1c,\r\n0x1d,0x15,0x11,0x10,0x15,0x13,0x11,0x11,0x0e,0x14,0x0f,0x19,0x10,0x16,0x16,0x11,0x14,0x1a,0x15,0x16,0x15,0x10,0x12,0x0f,0x10,0x15,0x11,0x16,0x13,0x1c,0x1c,0x14,0x17,0x11,0x12,0x1e,0x11,0x0f,0x11,0x0f,0x0b,0x10,0x0f,0x16,0x0d,0x11,0x11,0x0e,0x0f,0x14,0x11,0x11,0x11,0x11,0x0d,0x0c,0x0e,0x14,0x0d,0x11,0x10,0x17,0x18,0x11,\r\n0x15,0x0f,0x0d,0x18,0x0f,0x0f,0x11,0x0b,0x0d,0x0c,0x07,0x17,0x17,0x10,0x0e,0x0e,0x11,0x0e,0x0b,0x1d,0x21,0x12,0x0a,0x0b,0x0b,0x0b,0x07,0x0f,0x0c,0x10,0x16,0x11,0x15,0x11,0x09,0x0a,0x08,0x08,0x0e,0x0e,0x0e,0x0e,0x09,0x09,0x09,0x0e,0x09,0x0e,0x09,0x09,0x09,0x0e,0x0e,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,\r\n0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x07,0x08,0x07,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x14,0x10,0x14,0x10,0x15,0x11,0x15,\r\n0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x0f,0x0a,0x0f,0x0f,0x16,0x11,0x08,0x0a,0x07,0x07,0x0f,0x0c,0x1a,0x17,0x12,0x0f,0x11,0x0e,0x16,0x11,0x10,0x0e,0x10,0x0e,0x12,0x0e,0x13,0x10,0x13,0x10,0x15,0x0f,0x16,0x11,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x09,0x09,0x09,0x09,0x0f,\r\n0x0f,0x13,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x0d,0x14,0x11,0x14,0x11,0x14,0x11,0x14,0x11,0x14,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x09,0x14,0x11,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x08,0x07,0x08,0x07,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x0e,0x07,0x1a,\r\n0x19,0x1a,0x19,0x1a,0x19,0x16,0x10,0x16,0x10,0x16,0x10,0x16,0x10,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x10,0x11,0x10,0x11,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x11,0x0a,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0c,0x0f,0x0a,0x0f,0x0a,0x0f,0x0a,0x0f,0x0a,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x12,0x0e,0x12,\r\n0x0e,0x1b,0x15,0x1b,0x15,0x11,0x0d,0x11,0x0d,0x10,0x0e,0x11,0x0d,0x11,0x0d,0x11,0x0d,0x10,0x0a,0x15,0x0e,0x0f,0x07,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x15,0x15,0x15,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x1b,0x1b,0x1b,\r\n0x1b,0x1b,0x1b,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x1c,0x1c,0x1c,0x1c,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x13,0x18,0x18,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x12,0x12,0x0d,0x0d,0x11,\r\n0x11,0x08,0x08,0x11,0x11,0x10,0x10,0x17,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x16,0x16,0x16,0x16,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x12,0x12,0x12,0x12,0x12,0x12,0x12,\r\n0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x15,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0b,0x0b,0x11,0x11,0x11,0x10,0x10,0x10,0x10,0x11,0x11,0x10,0x10,0x10,0x10,0x13,0x13,0x12,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x16,0x11,0x11,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x12,0x0e,0x14,0x16,0x11,0x11,0x11,0x0f,0x10,0x0e,0x14,0x12,0x19,0x08,0x08,0x11,0x0e,0x07,0x0e,0x1a,0x16,0x11,0x16,0x1c,0x17,0x11,0x11,0x11,0x0f,0x0c,0x0f,0x09,0x0a,0x0f,0x0a,0x0f,0x16,0x15,0x11,0x0f,0x11,0x0d,0x12,\r\n0x12,0x0d,0x0c,0x10,0x10,0x0b,0x0b,0x10,0x07,0x0b,0x0d,0x08,0x24,0x21,0x1e,0x19,0x15,0x0f,0x1f,0x1c,0x17,0x13,0x0f,0x08,0x07,0x16,0x11,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x0f,0x13,0x0f,0x13,0x0f,0x19,0x18,0x14,0x11,0x14,0x11,0x11,0x0e,0x16,0x11,0x16,0x11,0x12,0x0d,0x07,0x24,0x21,0x1e,0x14,0x11,0x1d,0x14,\r\n0x16,0x10,0x13,0x0f,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x08,0x07,0x08,0x07,0x16,0x11,0x16,0x11,0x11,0x0a,0x11,0x0a,0x14,0x10,0x14,0x10,0x0f,0x0c,0x15,0x10,0x15,0x11,0x10,0x11,0x0d,0x13,0x0f,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x10,0x0e,0x11,0x0f,0x10,0x10,0x11,0x0f,0x11,0x11,0x11,0x0e,0x0e,0x11,0x11,0x0f,0x12,0x0c,0x0c,\r\n0x0f,0x10,0x08,0x11,0x11,0x0f,0x0e,0x0d,0x10,0x10,0x10,0x08,0x08,0x09,0x08,0x0b,0x07,0x11,0x19,0x19,0x19,0x10,0x10,0x11,0x11,0x14,0x15,0x13,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0c,0x07,0x07,0x08,0x08,0x0a,0x0a,0x11,0x11,0x10,0x0e,0x15,0x0e,0x0c,0x0d,0x0f,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x12,0x0e,0x10,0x0f,0x10,\r\n0x07,0x0e,0x0b,0x11,0x0b,0x0b,0x1b,0x1c,0x1c,0x12,0x0e,0x15,0x17,0x11,0x11,0x0e,0x0e,0x10,0x11,0x10,0x14,0x10,0x13,0x17,0x11,0x14,0x11,0x11,0x0d,0x0e,0x0d,0x11,0x0f,0x12,0x0e,0x1a,0x19,0x12,0x0f,0x12,0x0f,0x12,0x0d,0x11,0x0e,0x13,0x11,0x10,0x0c,0x11,0x11,0x0d,0x07,0x16,0x0e,0x0e,0x19,0x14,0x13,0x11,0x1a,0x15,0x13,0x0e,\r\n0x19,0x14,0x15,0x10,0x1b,0x16,0x10,0x0d,0x17,0x16,0x16,0x11,0x15,0x11,0x15,0x11,0x26,0x20,0x18,0x13,0x21,0x1a,0x19,0x14,0x11,0x0d,0x0f,0x0b,0x0c,0x00,0x00,0x1d,0x1c,0x11,0x0f,0x10,0x11,0x10,0x0f,0x10,0x0d,0x11,0x0e,0x15,0x11,0x18,0x13,0x1d,0x18,0x15,0x10,0x12,0x0d,0x0f,0x0c,0x19,0x14,0x14,0x11,0x18,0x12,0x18,0x12,0x08,\r\n0x19,0x16,0x11,0x0f,0x15,0x11,0x13,0x10,0x13,0x0f,0x13,0x0f,0x19,0x18,0x0f,0x0f,0x15,0x0f,0x15,0x0f,0x19,0x16,0x10,0x0d,0x0f,0x0d,0x16,0x11,0x16,0x11,0x16,0x11,0x16,0x11,0x12,0x0d,0x10,0x0e,0x10,0x0e,0x10,0x0e,0x13,0x10,0x17,0x15,0x11,0x11,0x19,0x19,0x17,0x15,0x10,0x0e,0x1a,0x17,0x1d,0x19,0x15,0x0f,0x14,0x11,0x11,0x10,\r\n0x10,0x0f,0x11,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x11,0x0a,0x0a,0x05,0x06,0x06,0x06,0x08,0x0c,0x08,0x07,0x0b,0x06,0x06,0x06,0x0a,0x0a,0x06,0x06,0x11,0x11,0x11,0x11,0x0a,0x08,0x08,0x0a,0x09,0x08,0x08,0x08,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x09,0x0a,0x0a,0x08,0x05,0x07,0x08,0x06,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0a,0x0a,0x0c,0x0a,0x07,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,\r\n0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,\r\n0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x13,0x09,0x12,0x0a,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x0a,0x08,0x09,0x09,0x0a,0x08,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x11,\r\n0x0e,0x13,0x18,0x0e,0x0d,0x10,0x10,0x0c,0x0c,0x07,0x09,0x0e,0x0b,0x14,0x11,0x11,0x0e,0x12,0x12,0x12,0x1b,0x10,0x11,0x11,0x0d,0x0d,0x0d,0x0c,0x0f,0x10,0x15,0x10,0x0e,0x15,0x0d,0x0c,0x0c,0x0f,0x0b,0x0e,0x11,0x0d,0x11,0x10,0x0a,0x0e,0x0a,0x0a,0x0c,0x09,0x09,0x0c,0x0c,0x05,0x07,0x0a,0x08,0x0f,0x0d,0x0d,0x0c,0x0b,0x0a,0x0a,\r\n0x08,0x0c,0x0f,0x09,0x09,0x0a,0x0e,0x0a,0x0a,0x09,0x09,0x08,0x08,0x0a,0x05,0x09,0x0e,0x0a,0x0a,0x08,0x0a,0x0a,0x0a,0x06,0x0a,0x09,0x0e,0x08,0x09,0x0a,0x08,0x0a,0x0c,0x09,0x05,0x06,0x0a,0x08,0x0a,0x08,0x0a,0x0c,0x09,0x11,0x05,0x0a,0x10,0x19,0x12,0x10,0x10,0x19,0x13,0x19,0x16,0x0f,0x11,0x0f,0x0d,0x21,0x0d,0x11,0x1a,0x1b,\r\n0x1b,0x12,0x13,0x12,0x0d,0x0e,0x0f,0x0c,0x0d,0x0f,0x06,0x00,0x00,0x00,0x00,0x11,0x12,0x12,0x12,0x0e,0x0b,0x11,0x11,0x09,0x19,0x10,0x11,0x0a,0x0a,0x0d,0x0a,0x0d,0x11,0x0d,0x11,0x1a,0x13,0x09,0x08,0x11,0x0f,0x11,0x11,0x11,0x09,0x11,0x0e,0x07,0x19,0x10,0x11,0x0a,0x0c,0x0d,0x0e,0x0d,0x0d,0x0f,0x11,0x11,0x0f,0x0d,0x0d,0x15,\r\n0x07,0x0e,0x07,0x10,0x0d,0x0a,0x08,0x08,0x0a,0x08,0x05,0x05,0x0a,0x0a,0x05,0x05,0x05,0x05,0x05,0x05,0x05,0x07,0x0e,0x0e,0x0a,0x0a,0x0a,0x0a,0x0b,0x07,0x05,0x06,0x0a,0x0a,0x0a,0x09,0x08,0x08,0x08,0x09,0x08,0x0a,0x00,0x00,0x00,0x00,0x06,0x09,0x09,0x0a,0x08,0x09,0x10,0x10,0x10,0x10,0x0a,0x00,0x00,0x00,0x00,0x0d,0x09,0x08,\r\n0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x08,0x08,0x10,0x10,0x10,0x10,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x10,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x05,0x0b,0x0b,0x0a,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x09,0x09,0x0b,0x0a,0x0b,0x0b,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x17,0x12,0x15,0x11,0x16,0x12,0x1b,0x16,0x10,0x0b,0x0f,0x14,0x10,0x18,0x14,0x00,0x00,0x00,0x00,0x07,0x07,0x07,0x07,0x0a,0x0a,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x18,0x18,0x1d,0x0c,0x07,0x0f,0x11,0x0c,0x0f,0x0f,0x11,0x11,0x0f,0x1d,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x13,0x0f,0x0f,0x0f,0x0a,0x11,0x0a,0x16,0x13,0x0f,0x0a,0x18,0x0f,0x18,0x07,0x0a,0x11,0x11,0x13,0x13,0x13,0x11,0x11,0x11,0x18,0x07,0x11,0x07,0x0f,0x0c,0x07,0x07,0x0f,0x07,0x16,0x07,0x1b,0x0f,0x1b,0x1b,0x11,0x11,0x11,0x0f,0x0f,0x0c,0x0c,0x22,0x22,0x27,0x27,0x18,0x18,0x0f,0x0f,0x05,\r\n0x1d,0x16,0x18,0x13,0x11,0x13,0x0f,0x0f,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x07,0x13,0x00,0x13,0x13,0x13,0x0a,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x11,0x13,0x11,0x0c,0x1b,0x0f,0x1b,0x0f,0x16,0x18,0x0a,0x0f,0x0f,0x0c,0x07,0x0f,0x11,0x0f,0x11,0x0f,0x11,0x11,0x0f,0x13,0x13,0x1b,0x0a,0x0f,0x0c,0x13,0x0f,0x0a,\r\n0x0f,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x07,0x11,0x0b,0x1d,0x0f,0x0f,0x13,0x13,0x1d,0x0f,0x00,0x00,0x00,0x13,0x00,0x13,0x13,0x13,0x13,0x16,0x13,0x00,0x00,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0f,0x0f,0x16,0x18,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0f,0x0c,0x0c,0x0c,0x22,0x18,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,0x18,0x0f,0x11,0x11,0x11,0x1d,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x16,0x16,0x1f,0x1d,0x1b,0x0f,0x18,0x0f,0x18,0x0f,0x18,0x0f,0x1b,\r\n0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x13,0x0a,0x13,0x0a,0x10,0x13,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x18,0x1b,0x16,0x18,0x0a,0x0f,0x16,0x18,0x16,0x18,0x00,0x00,0x00,0x00,0x00,0x21,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0c,0x00,0x00,0x11,0x00,\r\n0x00,0x00,0x22,0x18,0x27,0x1d,0x0f,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x1b,0x1b,0x0b,0x11,0x11,0x11,0x24,0x18,0x0f,0x2c,0x1f,0x0a,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0f,0x0c,0x0c,0x16,0x13,0x13,0x0f,0x00,0x00,0x00,0x0a,0x0a,0x0a,\r\n0x0a,0x24,0x2c,0x00,0x00,0x00,0x00,0x00,0x11,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x13,0x11,0x0f,0x0f,0x0c,0x22,0x18,0x0f,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x1d,0x0f,0x0f,0x1d,0x0f,0x0f,0x1b,0x0f,0x0f,0x1b,0x0f,\r\n0x0f,0x1b,0x0f,0x0f,0x11,0x11,0x11,0x11,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x13,0x0a,0x0a,0x0c,0x0c,0x22,0x18,0x13,0x11,0x11,0x00,0x0f,0x0f,0x0f,0x0b,0x11,0x14,0x12,0x0f,0x0f,0x0a,0x07,0x16,0x11,0x11,0x0a,0x10,0x0e,0x0e,0x0d,0x0e,0x07,0x0f,0x0c,0x12,0x0e,0x11,0x0d,0x10,0x0d,0x14,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x15,0x0d,0x0e,0x0e,0x08,0x0f,0x10,0x11,0x0f,0x0a,0x16,0x11,0x13,0x10,0x12,0x0e,0x11,0x0f,0x0b,0x14,0x0b,0x0c,0x0c,0x0e,0x11,0x11,0x0f,0x1d,0x0f,0x1d,0x0a,0x07,0x05,0x10,0x06,0x04,0x00,0x04,0x06,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x1b,0x0c,0x16,0x11,0x1b,0x15,0x12,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x1b,0x19,0x0e,0x19,0x0e,0x19,0x13,0x14,0x14,0x14,0x16,0x19,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x14,0x15,0x11,0x1f,0x18,0x0e,0x0e,0x08,0x08,0x08,0x0b,0x06,0x10,0x07,0x07,0x18,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,\r\n0x06,0x00,0x00,0x06,0x00,0x00,0x12,0x11,0x0d,0x0e,0x14,0x08,0x0a,0x14,0x14,0x08,0x10,0x10,0x10,0x14,0x14,0x08,0x0c,0x14,0x12,0x12,0x12,0x10,0x11,0x13,0x10,0x17,0x15,0x0f,0x0f,0x0f,0x07,0x0b,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x0e,0x14,0x10,0x10,0x14,0x10,0x15,0x10,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x11,0x0d,0x0e,0x14,\r\n0x09,0x0a,0x14,0x09,0x10,0x10,0x10,0x14,0x0c,0x14,0x12,0x12,0x11,0x13,0x10,0x17,0x15,0x08,0x11,0x10,0x12,0x13,0x23,0x00,0x12,0x10,0x13,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x08,0x00,\r\n0x16,0x13,0x13,0x14,0x10,0x13,0x16,0x16,0x0e,0x12,0x16,0x15,0x13,0x16,0x18,0x17,0x13,0x10,0x10,0x16,0x14,0x11,0x14,0x14,0x13,0x14,0x14,0x15,0x11,0x12,0x14,0x13,0x16,0x12,0x12,0x13,0x13,0x18,0x0e,0x11,0x11,0x19,0x10,0x10,0x16,0x1a,0x12,0x10,0x1e,0x10,0x10,0x16,0x10,0x10,0x16,0x10,0x16,0x18,0x19,0x10,0x16,0x10,0x13,0x10,\r\n0x12,0x10,0x12,0x10,0x12,0x16,0x10,0x12,0x13,0x10,0x10,0x11,0x1c,0x10,0x10,0x11,0x11,0x0c,0x0a,0x10,0x10,0x10,0x10,0x10,0x1a,0x10,0x1a,0x0e,0x10,0x1a,0x13,0x10,0x1a,0x16,0x16,0x1a,0x11,0x10,0x1a,0x1a,0x10,0x10,0x10,0x10,0x10,0x10,0x1a,0x1a,0x11,0x10,0x10,0x1a,0x11,0x10,0x10,0x10,0x1a,0x17,0x14,0x14,0x14,0x14,0x15,0x12,\r\n0x14,0x17,0x14,0x13,0x10,0x17,0x14,0x14,0x11,0x13,0x14,0x16,0x15,0x11,0x14,0x13,0x15,0x13,0x16,0x14,0x15,0x15,0x14,0x12,0x14,0x14,0x15,0x17,0x13,0x16,0x15,0x03,0x03,0x04,0x06,0x04,0x08,0x0a,0x19,0x10,0x12,0x11,0x10,0x12,0x10,0x10,0x13,0x11,0x10,0x09,0x18,0x11,0x10,0x10,0x10,0x12,0x0f,0x11,0x08,0x11,0x0f,0x10,0x0c,0x19,\r\n0x10,0x10,0x10,0x11,0x18,0x10,0x11,0x0b,0x18,0x11,0x11,0x14,0x14,0x06,0x08,0x21,0x21,0x21,0x21,0x29,0x10,0x10,0x07,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x10,0x10,0x10,0x10,0x10,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0e,0x0f,0x11,0x0c,0x0c,0x11,0x12,0x07,0x09,0x0e,0x0c,0x16,0x13,0x12,0x0e,0x12,0x0e,0x0c,0x0d,0x11,0x0f,0x17,0x0f,0x0e,0x0e,0x14,0x16,0x0c,0x12,0x0e,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0c,0x0c,0x0c,0x07,0x07,0x07,0x07,0x13,0x12,0x12,0x12,0x12,0x12,0x11,\r\n0x11,0x11,0x11,0x0e,0x0f,0x0f,0x0f,0x0f,0x0f,0x11,0x11,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x0f,0x12,0x12,0x07,0x07,0x07,0x07,0x07,0x10,0x09,0x0e,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0f,0x14,0x12,0x0f,0x0e,0x0b,0x10,0x0c,0x0e,0x12,0x12,0x07,0x0e,0x0f,0x16,0x13,0x0d,0x12,0x12,0x0e,0x0d,0x0d,0x0e,0x12,0x0f,0x13,0x12,0x0f,0x0c,0x12,0x07,0x12,0x0e,0x12,0x07,0x0e,0x0c,0x11,0x0c,0x0f,0x0c,0x07,0x07,0x09,0x18,0x18,0x12,0x0e,0x0e,0x12,0x0f,0x0e,0x0e,0x0c,0x11,0x0c,0x15,0x0d,0x13,0x13,\r\n0x0e,0x10,0x16,0x12,0x12,0x12,0x0e,0x0f,0x0d,0x0e,0x12,0x0f,0x12,0x10,0x17,0x18,0x10,0x14,0x0e,0x0f,0x19,0x0e,0x0c,0x11,0x11,0x12,0x1a,0x1a,0x13,0x0f,0x11,0x0c,0x11,0x10,0x10,0x14,0x0f,0x0f,0x14,0x11,0x11,0x0a,0x12,0x12,0x11,0x0e,0x0e,0x1a,0x16,0x0e,0x0f,0x11,0x11,0x12,0x12,0x15,0x14,0x0a,0x1b,0x11,0x10,0x11,0x13,0x13,\r\n0x0f,0x0f,0x08,0x16,0x14,0x14,0x0e,0x14,0x06,0x06,0x0d,0x0d,0x06,0x06,0x12,0x0c,0x08,0x16,0x14,0x08,0x06,0x06,0x0d,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x14,0x0e,0x09,0x12,0x14,0x11,0x11,0x0e,0x16,0x10,0x11,0x0a,0x0d,0x0f,0x0c,0x06,0x07,0x0b,0x0f,0x0a,0x13,0x13,0x13,0x1b,0x16,0x1b,0x07,0x00,0x00,0x00,0x00,0x00,0x07,0x16,0x18,\r\n0x0a,0x0a,0x0f,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x0f,0x0f,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,0x18,0x18,0x18,0x18,0x18,0x18,0x1b,0x1b,0x0f,0x0f,0x1b,0x1b,0x0f,0x0f,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x1d,0x16,0x18,0x0f,0x11,0x11,0x13,0x0a,0x13,0x16,0x0f,0x0f,0x0a,0x0a,0x0a,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1b,0x0a,0x16,0x0f,0x0f,0x07,0x0f,0x0f,0x0f,0x0f,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x22,0x18,0x22,0x18,0x22,0x18,0x27,0x1d,0x27,0x1d,\r\n0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x16,0x0f,0x0f,0x16,0x0f,0x0f,0x1b,0x0f,0x1f,0x1d,0x1b,0x0f,0x18,0x0f,0x18,0x0f,0x18,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x1b,0x0f,0x13,0x13,0x13,0x13,0x13,0x0a,0x13,0x13,0x0a,0x0a,0x13,0x0a,0x13,0x0a,0x13,0x0f,0x11,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x0f,0x0a,0x0a,0x0f,0x0a,0x0a,0x0a,0x0a,0x00,0x22,0x18,0x27,0x1d,0x1b,0x0f,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x0f,0x0f,0x0c,0x22,0x18,0x1d,0x1d,0x1b,0x1b,0x1b,0x11,0x11,0x11,0x11,0x13,0x0a,0x13,0x0a,0x13,0x0a,0x22,0x18,0x11,0x13,0x11,0x11,0x11,0x13,0x11,0x11,0x22,0x22,0x18,0x18,\r\n0x0c,0x0c,0x11,0x11,0x11,0x11,0x0a,0x0a,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x16,0x18,0x0a,0x0a,0x11,0x11,0x11,0x11,0x1b,0x0a,0x1b,0x0a,0x11,0x13,0x11,0x11,0x22,0x22,0x18,0x18,0x22,0x22,0x18,0x18,0x18,0x18,0x0f,0x0f,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x00,0x00,0x07,0x07,0x0a,0x07,0x00,0x00,0x00,0x18,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x18,0x11,0x18,0x11,0x18,0x11,0x18,0x13,0x13,0x13,0x07,0x07,0x0f,0x0c,0x11,0x12,0x11,0x10,0x10,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0d,0x10,0x0f,0x11,0x12,0x12,0x13,0x11,0x10,0x13,0x0f,\r\n0x13,0x16,0x13,0x16,0x18,0x12,0x16,0x14,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x0d,0x10,0x12,0x11,0x13,0x11,0x13,0x11,0x11,0x11,0x0f,0x0f,0x16,0x14,0x14,0x14,0x14,0x11,0x11,0x11,0x15,0x16,0x16,0x16,0x1b,0x1b,0x14,0x1b,0x1b,0x15,0x19,0x19,0x10,0x16,0x19,0x16,0x11,0x19,0x15,0x14,0x14,0x12,0x13,0x16,0x17,\r\n0x14,0x12,0x14,0x11,0x0f,0x1b,0x1b,0x1b,0x18,0x1b,0x1b,0x14,0x1b,0x1b,0x15,0x16,0x17,0x16,0x15,0x15,0x13,0x1a,0x16,0x18,0x15,0x15,0x11,0x15,0x14,0x14,0x19,0x16,0x15,0x1a,0x10,0x0f,0x10,0x10,0x12,0x12,0x14,0x15,0x11,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x10,0x10,0x10,0x0f,0x0f,0x11,0x12,0x11,0x11,0x0d,0x10,0x10,\r\n0x11,0x12,0x16,0x18,0x13,0x13,0x12,0x16,0x13,0x14,0x0f,0x0e,0x11,0x10,0x0e,0x0e,0x10,0x10,0x0e,0x0d,0x12,0x0d,0x10,0x0e,0x10,0x17,0x10,0x18,0x10,0x10,0x11,0x16,0x09,0x17,0x14,0x15,0x13,0x10,0x16,0x11,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x12,0x12,0x12,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0e,0x0d,\r\n0x09,0x09,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x12,0x08,0x08,0x08,0x09,0x09,0x08,0x08,0x08,0x09,0x08,0x08,0x08,0x1a,0x1a,0x1a,0x1a,0x0e,0x16,0x15,0x0e,0x0c,0x0e,0x0f,0x10,0x0e,0x18,0x18,0x19,0x0d,0x1d,0x0e,0x18,0x18,0x18,0x17,0x10,0x0e,0x0e,0x17,0x11,0x17,0x14,0x0f,0x0d,0x0c,0x1e,0x0c,0x0f,0x0e,0x0e,0x0e,0x0e,0x0e,\r\n0x28,0x18,0x18,0x0c,0x07,0x0d,0x07,0x0d,0x07,0x07,0x07,0x0e,0x11,0x11,0x10,0x0b,0x0b,0x07,0x07,0x07,0x0b,0x07,0x0c,0x19,0x06,0x1a,0x1a,0x1a,0x11,0x11,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x22,0x22,0x13,0x22,0x22,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0e,0x11,0x0e,0x0f,0x0c,0x0a,0x0a,0x14,0x10,0x15,0x0c,0x21,0x1a,0x11,0x10,0x1b,0x17,0x18,0x16,0x1e,0x18,0x1b,0x16,0x13,0x0e,0x15,0x11,0x1b,0x15,0x16,0x12,0x16,0x11,0x19,0x13,0x19,0x13,0x20,0x18,0x16,0x11,0x16,0x11,0x23,0x1a,0x17,0x00,0x1d,0x1d,\r\n0x1d,0x0e,0x00,0x00,0x11,0x0f,0x14,0x10,0x0f,0x0c,0x1f,0x1a,0x1b,0x19,0x15,0x11,0x14,0x11,0x0f,0x0c,0x15,0x11,0x0f,0x0c,0x18,0x13,0x13,0x10,0x1c,0x18,0x10,0x11,0x15,0x15,0x17,0x0d,0x06,0x0d,0x14,0x0d,0x1d,0x1d,0x07,0x00,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0c,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,\r\n0x21,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,\r\n0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x0e,0x14,\r\n0x15,0x08,0x06,0x08,0x06,0x15,0x10,0x16,0x12,0x10,0x0e,0x0f,0x0e,0x11,0x11,0x0c,0x0c,0x21,0x18,0x21,0x1a,0x1d,0x19,0x1a,0x13,0x1a,0x13,0x1a,0x13,0x12,0x0d,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x10,0x09,0x0e,0x07,0x16,0x11,0x19,0x14,0x27,0x1d,0x10,0x11,0x14,0x14,0x17,0x19,0x16,0x11,0x1c,0x17,0x10,0x0c,0x10,0x0e,0x12,0x0e,0x1b,\r\n0x15,0x12,0x0f,0x10,0x11,0x10,0x11,0x0e,0x0c,0x0e,0x0b,0x0e,0x0b,0x0f,0x0f,0x09,0x14,0x0a,0x1c,0x13,0x0a,0x11,0x12,0x0d,0x16,0x10,0x0b,0x0a,0x11,0x11,0x11,0x0e,0x07,0x16,0x11,0x0b,0x0a,0x12,0x0d,0x15,0x0b,0x17,0x11,0x12,0x0d,0x14,0x11,0x11,0x0e,0x16,0x10,0x11,0x0a,0x0f,0x0c,0x16,0x0c,0x0f,0x19,0x0e,0x10,0x1a,0x08,0x21,\r\n0x1a,0x1a,0x22,0x1a,0x1b,0x1b,0x19,0x1a,0x1b,0x0f,0x0e,0x12,0x14,0x1a,0x14,0x1b,0x07,0x0d,0x11,0x19,0x1e,0x14,0x1e,0x12,0x12,0x17,0x14,0x21,0x1b,0x0f,0x1b,0x0a,0x1b,0x0a,0x11,0x11,0x11,0x11,0x18,0x18,0x18,0x18,0x1d,0x0f,0x0f,0x1d,0x16,0x0f,0x0f,0x16,0x13,0x0a,0x0a,0x13,0x11,0x11,0x11,0x11,0x16,0x0a,0x0a,0x18,0x16,0x0a,\r\n0x0a,0x18,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2d,0x0f,0x0b,0x10,0x0f,0x16,0x11,0x11,0x19,0x13,0x16,0x16,0x18,0x18,0x11,0x0e,0x1d,0x17,0x1e,0x19,0x14,0x11,0x09,0x09,0x11,0x13,0x0c,0x11,0x0f,\r\n0x11,0x0e,0x15,0x17,0x0c,0x11,0x0c,0x06,0x0b,0x0f,0x10,0x06,0x06,0x05,0x06,0x0b,0x0b,0x0b,0x0d,0x2b,0x3a,0x0a,0x0c,0x04,0x08,0x0b,0x0c,0x09,0x0e,0x0f,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x0e,0x0e,0x27,0x10,0x16,0x1b,0x1a,0x13,0x0d,0x10,0x15,0x15,0x0e,0x09,0x13,0x0f,0x14,0x10,0x13,0x0f,0x10,\r\n0x16,0x11,0x11,0x0f,0x16,0x12,0x18,0x0d,0x0f,0x12,0x09,0x11,0x0a,0x0a,0x07,0x19,0x11,0x10,0x0f,0x0f,0x11,0x1b,0x1b,0x1b,0x1d,0x1d,0x10,0x0e,0x08,0x0f,0x0d,0x12,0x0d,0x13,0x07,0x10,0x11,0x19,0x19,0x12,0x10,0x11,0x10,0x0f,0x0d,0x0f,0x0d,0x0e,0x09,0x0a,0x07,0x06,0x0a,0x11,0x12,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x08,0x08,0x08,0x07,0x07,0x31,0x1d,0x19,0x1e,0x08,0x08,0x09,0x0b,0x07,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x1b,0x0a,0x0a,0x1b,0x08,0x0f,0x0f,0x27,0x1d,0x1d,0x27,0x1b,0x0f,0x0f,0x1b,0x0f,0x0f,0x0c,0x0c,0x00,0x00,0x0a,0x16,0x11,0x15,0x11,0x24,0x1e,0x14,0x10,\r\n0x14,0x10,0x27,0x1d,0x16,0x11,0x0b,0x09,0x12,0x00,0x14,0x10,0x0a,0x09,0x05,0x0e,0x0a,0x0a,0x07,0x06,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x06,0x0f,0x0c,0x11,0x11,0x10,0x1c,0x17,0x17,0x17,0x18,0x1b,0x12,0x14,0x11,0x0b,0x1b,0x21,0x0d,0x21,0x0f,0x18,0x1b,0x1b,0x1b,0x0c,0x16,0x1d,0x16,0x13,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x11,0x11,0x11,0x18,0x0f,0x0f,0x1b,0x0a,0x0a,0x1b,0x0a,0x0a,0x1b,0x0e,0x0e,0x00,0x0c,0x18,0x0a,0x0a,0x1d,0x0f,0x0f,0x16,0x0f,0x0f,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x2c,0x2c,0x1a,0x00,0x00,0x1a,0x1a,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x12,0x13,0x13,0x1a,0x13,0x12,0x17,0x1c,0x13,0x12,0x1f,0x12,0x12,0x1b,0x12,0x14,0x17,0x13,0x16,0x19,0x1a,0x13,0x16,0x13,0x14,0x12,0x14,0x12,0x13,0x14,0x12,0x17,0x11,0x13,0x17,0x12,0x12,0x11,0x17,0x13,0x13,0x13,0x14,0x0d,0x0f,0x13,0x17,0x17,0x10,0x00,0x00,\r\n0x20,0x40,0x15,0x00,0x03,0x09,0x09,0x0d,0x13,0x11,0x1a,0x1a,0x07,0x0a,0x0a,0x0d,0x16,0x07,0x0d,0x07,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x16,0x16,0x16,0x0e,0x1f,0x15,0x12,0x14,0x16,0x10,0x10,0x16,0x17,0x09,0x0b,0x13,0x0f,0x1d,0x18,0x18,0x12,0x18,0x13,0x11,0x11,0x16,0x14,0x1e,0x13,0x12,0x12,\r\n0x0a,0x0c,0x0a,0x16,0x0d,0x09,0x10,0x13,0x0f,0x13,0x11,0x0a,0x13,0x12,0x08,0x08,0x10,0x08,0x1c,0x12,0x13,0x13,0x13,0x0b,0x0e,0x0b,0x12,0x0f,0x17,0x0f,0x0f,0x0e,0x0a,0x08,0x0a,0x16,0x15,0x15,0x14,0x10,0x18,0x18,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x0f,0x11,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x12,0x13,0x13,0x13,0x13,0x13,\r\n0x12,0x12,0x12,0x12,0x0c,0x0c,0x11,0x11,0x0e,0x0d,0x0f,0x11,0x0d,0x1c,0x1c,0x19,0x09,0x0d,0x16,0x1c,0x18,0x1a,0x16,0x16,0x16,0x11,0x12,0x11,0x14,0x18,0x11,0x0d,0x0e,0x18,0x1b,0x13,0x0e,0x09,0x09,0x16,0x15,0x11,0x16,0x15,0x10,0x10,0x17,0x15,0x15,0x18,0x1e,0x1e,0x10,0x20,0x0c,0x0c,0x07,0x07,0x16,0x13,0x0f,0x12,0x06,0x11,\r\n0x0a,0x0a,0x12,0x12,0x0c,0x07,0x07,0x0c,0x27,0x15,0x10,0x15,0x10,0x10,0x09,0x09,0x09,0x09,0x18,0x18,0x18,0x16,0x16,0x16,0x08,0x0c,0x0b,0x0a,0x0a,0x06,0x09,0x07,0x0a,0x06,0x0c,0x0f,0x09,0x11,0x0e,0x12,0x0e,0x08,0x16,0x12,0x12,0x0f,0x12,0x13,0x16,0x16,0x0b,0x0c,0x0c,0x1e,0x1d,0x1e,0x10,0x16,0x13,0x09,0x11,0x0e,0x14,0x0f,\r\n0x14,0x0f,0x13,0x0d,0x07,0x15,0x10,0x15,0x10,0x16,0x16,0x16,0x10,0x11,0x10,0x11,0x0f,0x08,0x0f,0x0a,0x0f,0x0a,0x18,0x12,0x18,0x12,0x18,0x13,0x13,0x0b,0x13,0x0b,0x11,0x0e,0x11,0x0b,0x11,0x0e,0x16,0x12,0x16,0x12,0x12,0x0e,0x12,0x0e,0x0f,0x18,0x18,0x14,0x13,0x0e,0x12,0x10,0x16,0x0d,0x0f,0x0d,0x24,0x14,0x10,0x13,0x07,0x0c,\r\n0x1a,0x0a,0x13,0x0b,0x0b,0x13,0x0b,0x15,0x10,0x14,0x0f,0x14,0x0f,0x10,0x11,0x10,0x11,0x10,0x11,0x16,0x13,0x16,0x13,0x16,0x13,0x17,0x12,0x17,0x12,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x0b,0x08,0x13,0x10,0x10,0x0f,0x08,0x18,0x12,0x18,0x12,0x18,0x13,0x18,0x13,0x13,0x0b,0x11,0x0e,0x11,0x0b,0x16,0x12,0x16,0x12,0x16,0x12,\r\n0x16,0x12,0x1e,0x17,0x12,0x0f,0x08,0x15,0x10,0x1c,0x1b,0x18,0x13,0x07,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x12,0x0f,0x07,0x0d,0x11,0x13,0x1e,0x1e,0x1e,0x1d,0x0c,0x0c,0x07,0x09,0x09,0x15,0x12,0x19,0x0c,0x1a,0x15,0x1a,0x09,0x15,0x12,0x10,0x12,0x17,0x09,0x13,0x14,0x1d,0x18,0x10,0x18,0x17,0x12,0x11,0x11,0x12,0x13,0x19,0x18,0x09,\r\n0x12,0x14,0x0e,0x12,0x09,0x12,0x12,0x11,0x0e,0x12,0x13,0x09,0x11,0x10,0x12,0x11,0x0e,0x13,0x13,0x0f,0x12,0x11,0x18,0x1a,0x09,0x12,0x13,0x12,0x1a,0x10,0x16,0x0f,0x14,0x11,0x09,0x1f,0x1f,0x17,0x13,0x12,0x17,0x15,0x12,0x12,0x0f,0x16,0x10,0x1c,0x11,0x18,0x18,0x13,0x16,0x1d,0x17,0x18,0x17,0x12,0x14,0x11,0x12,0x17,0x13,0x18,\r\n0x15,0x1e,0x1f,0x17,0x19,0x12,0x14,0x21,0x13,0x10,0x13,0x11,0x0c,0x12,0x11,0x18,0x0e,0x13,0x13,0x10,0x11,0x16,0x12,0x13,0x12,0x13,0x0f,0x0d,0x0f,0x16,0x0f,0x13,0x12,0x1a,0x1a,0x13,0x17,0x10,0x0f,0x1a,0x10,0x11,0x12,0x0c,0x0f,0x0e,0x08,0x19,0x1a,0x12,0x10,0x0f,0x12,0x0f,0x0d,0x20,0x24,0x14,0x0b,0x0c,0x0c,0x0c,0x08,0x11,\r\n0x0e,0x12,0x18,0x13,0x17,0x13,0x0a,0x0b,0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x0a,0x0f,0x0a,0x0f,0x0a,0x0a,0x0a,0x0f,0x0f,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x15,0x10,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,0x11,0x10,\r\n0x11,0x09,0x08,0x09,0x08,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x16,0x12,0x16,0x12,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x12,0x0f,0x12,0x0f,0x12,0x0f,0x11,0x0b,0x10,0x11,0x18,0x13,0x09,0x0b,0x08,0x08,0x10,0x0d,0x1d,0x19,0x14,\r\n0x11,0x13,0x10,0x18,0x13,0x12,0x0f,0x12,0x0f,0x14,0x10,0x15,0x12,0x15,0x12,0x17,0x11,0x18,0x13,0x0a,0x0a,0x0a,0x0a,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x15,0x10,0x12,0x13,0x12,0x13,0x12,0x13,0x14,0x0f,0x16,0x13,0x16,0x13,0x16,0x13,0x16,0x13,0x16,0x13,0x10,0x11,0x10,0x11,0x10,0x11,0x10,\r\n0x11,0x10,0x11,0x10,0x0a,0x16,0x13,0x17,0x12,0x17,0x12,0x17,0x12,0x17,0x12,0x17,0x12,0x09,0x08,0x09,0x08,0x13,0x10,0x13,0x10,0x13,0x10,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x0f,0x08,0x1d,0x1c,0x1d,0x1c,0x1d,0x1c,0x18,0x12,0x18,0x12,0x18,0x12,0x18,0x12,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x12,0x13,0x12,0x13,0x13,0x0b,0x13,\r\n0x0b,0x13,0x0b,0x13,0x0b,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0e,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x14,0x0f,0x14,0x0f,0x1e,0x17,0x1e,0x17,0x13,0x0f,0x13,0x0f,0x12,0x0f,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0b,0x17,0x0f,0x10,0x08,0x14,0x14,0x14,0x14,0x14,\r\n0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x17,0x17,0x17,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x10,0x10,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1f,\r\n0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x14,0x14,0x0e,0x0e,0x12,0x12,0x09,0x09,0x13,0x13,0x12,0x12,0x1a,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x12,0x12,0x12,\r\n0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x17,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x0c,0x0c,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x13,0x13,0x12,0x12,0x12,0x12,0x15,0x15,0x14,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1a,0x18,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x14,0x12,0x13,0x12,0x13,0x14,0x14,0x0f,0x16,0x18,0x12,0x13,0x13,\r\n0x10,0x11,0x10,0x16,0x14,0x1c,0x09,0x09,0x13,0x10,0x08,0x10,0x1d,0x18,0x12,0x18,0x1f,0x19,0x13,0x13,0x12,0x11,0x0e,0x11,0x09,0x0b,0x11,0x0b,0x11,0x18,0x17,0x12,0x11,0x12,0x0e,0x14,0x14,0x0e,0x0d,0x11,0x11,0x0c,0x0d,0x11,0x08,0x0c,0x0f,0x09,0x28,0x24,0x21,0x1b,0x17,0x10,0x22,0x1f,0x1a,0x15,0x10,0x09,0x08,0x18,0x13,0x16,\r\n0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x11,0x15,0x10,0x15,0x10,0x1c,0x1b,0x16,0x13,0x16,0x13,0x13,0x10,0x18,0x13,0x18,0x13,0x14,0x0e,0x08,0x28,0x24,0x21,0x16,0x13,0x20,0x16,0x18,0x12,0x15,0x10,0x15,0x10,0x10,0x11,0x10,0x11,0x09,0x08,0x09,0x08,0x18,0x13,0x18,0x13,0x12,0x0b,0x13,0x0b,0x16,0x12,0x16,0x12,0x10,0x0e,\r\n0x17,0x12,0x17,0x13,0x12,0x12,0x0e,0x15,0x10,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x12,0x0f,0x13,0x10,0x12,0x12,0x13,0x10,0x13,0x13,0x13,0x0f,0x0f,0x13,0x13,0x11,0x14,0x0d,0x0d,0x10,0x12,0x09,0x13,0x13,0x11,0x0f,0x0f,0x12,0x12,0x12,0x08,0x09,0x0a,0x09,0x0c,0x08,0x13,0x1c,0x1c,0x1c,0x12,0x12,0x13,0x13,0x16,0x17,0x14,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0d,0x08,0x08,0x09,0x09,0x0b,0x0b,0x13,0x13,0x12,0x0f,0x17,0x0f,0x0d,0x0e,0x10,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x14,0x0f,0x12,0x11,0x12,0x08,0x10,0x0c,0x13,0x0c,0x0c,0x1d,0x1e,0x1f,0x14,0x0f,0x17,0x19,0x13,0x12,0x10,0x10,0x12,0x13,0x12,0x16,0x12,0x14,0x1a,0x12,0x16,0x13,0x13,\r\n0x0f,0x10,0x0e,0x13,0x10,0x14,0x10,0x1d,0x1c,0x13,0x10,0x14,0x11,0x14,0x0f,0x13,0x10,0x15,0x13,0x12,0x0d,0x12,0x13,0x0f,0x08,0x18,0x0f,0x0f,0x1c,0x16,0x15,0x13,0x1d,0x17,0x15,0x10,0x1c,0x16,0x17,0x12,0x1e,0x18,0x11,0x0e,0x19,0x18,0x18,0x13,0x17,0x13,0x17,0x13,0x2a,0x24,0x1a,0x15,0x24,0x1d,0x1c,0x16,0x13,0x0e,0x10,0x0d,\r\n0x0d,0x00,0x00,0x20,0x1e,0x12,0x10,0x12,0x13,0x12,0x10,0x11,0x0f,0x13,0x10,0x17,0x13,0x1b,0x15,0x20,0x1b,0x17,0x12,0x14,0x0f,0x11,0x0d,0x1c,0x16,0x16,0x13,0x1b,0x14,0x1b,0x14,0x09,0x1c,0x18,0x13,0x10,0x17,0x12,0x15,0x12,0x15,0x10,0x15,0x10,0x1c,0x1b,0x10,0x11,0x17,0x11,0x17,0x11,0x1c,0x18,0x11,0x0e,0x11,0x0e,0x18,0x13,\r\n0x18,0x13,0x18,0x13,0x18,0x13,0x14,0x0f,0x12,0x0f,0x12,0x0f,0x12,0x0f,0x15,0x12,0x19,0x17,0x12,0x13,0x1b,0x1c,0x1a,0x17,0x12,0x0f,0x1d,0x19,0x20,0x1b,0x17,0x11,0x16,0x13,0x13,0x12,0x12,0x10,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x07,0x13,0x0b,0x0b,0x05,0x07,0x07,0x07,0x09,0x0d,\r\n0x09,0x07,0x0c,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x13,0x13,0x13,0x13,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0a,0x0b,0x0b,0x09,0x05,0x08,0x09,0x07,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0b,0x0b,0x0d,0x0b,0x08,0x08,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,\r\n0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,\r\n0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,\r\n0x15,0x0a,0x14,0x0b,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0a,0x0a,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x0f,0x15,0x1b,0x0f,0x0f,0x12,0x12,0x0d,0x0d,0x08,0x0a,0x10,0x0d,0x16,0x13,0x13,0x0f,0x14,0x14,0x14,0x1e,0x11,0x13,0x13,0x0f,0x0f,0x0f,0x0d,\r\n0x11,0x12,0x17,0x12,0x0f,0x17,0x0e,0x0d,0x0d,0x11,0x0c,0x0f,0x12,0x0f,0x13,0x12,0x0c,0x10,0x0b,0x0b,0x0d,0x0a,0x0a,0x0d,0x0e,0x06,0x07,0x0b,0x09,0x11,0x0e,0x0e,0x0e,0x0c,0x0b,0x0b,0x09,0x0d,0x11,0x0a,0x0a,0x0b,0x0f,0x0b,0x0b,0x0a,0x0a,0x08,0x08,0x0b,0x05,0x0a,0x10,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x06,0x0b,0x0a,0x10,0x09,\r\n0x0a,0x0b,0x09,0x0b,0x0d,0x0a,0x05,0x07,0x0b,0x09,0x0b,0x09,0x0b,0x0d,0x0a,0x13,0x05,0x0b,0x11,0x1c,0x14,0x11,0x11,0x1c,0x15,0x1b,0x18,0x11,0x13,0x10,0x0e,0x24,0x0f,0x13,0x1c,0x1e,0x1e,0x14,0x15,0x14,0x0f,0x0f,0x11,0x0e,0x0e,0x10,0x06,0x00,0x00,0x00,0x00,0x13,0x14,0x14,0x14,0x0f,0x0c,0x13,0x13,0x0a,0x1c,0x12,0x13,0x0b,\r\n0x0b,0x0f,0x0b,0x0e,0x13,0x0f,0x12,0x1d,0x15,0x0a,0x09,0x13,0x11,0x13,0x13,0x13,0x0a,0x13,0x10,0x08,0x1c,0x12,0x13,0x0b,0x0e,0x0e,0x0f,0x0f,0x0e,0x10,0x13,0x13,0x11,0x0e,0x0e,0x18,0x08,0x0f,0x08,0x12,0x0e,0x0b,0x09,0x09,0x0b,0x08,0x06,0x05,0x0b,0x0b,0x05,0x06,0x06,0x06,0x05,0x06,0x05,0x07,0x10,0x10,0x0b,0x0b,0x0b,0x0b,\r\n0x0c,0x07,0x05,0x06,0x0b,0x0b,0x0b,0x0a,0x09,0x08,0x08,0x09,0x08,0x0b,0x00,0x00,0x00,0x00,0x07,0x0a,0x0a,0x0b,0x09,0x0a,0x11,0x11,0x11,0x11,0x0b,0x00,0x00,0x00,0x00,0x0f,0x0a,0x09,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,\r\n0x12,0x12,0x12,0x12,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x06,0x0c,0x0c,0x0b,0x0c,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0b,0x0c,0x0c,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x19,0x14,0x17,0x12,0x18,0x14,0x1e,0x18,0x11,0x0c,\r\n0x10,0x16,0x11,0x1a,0x16,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x1b,0x1b,0x20,0x0d,0x08,0x10,0x13,0x0d,0x10,0x10,0x13,0x13,0x10,0x20,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x15,0x10,0x10,0x10,0x0b,0x13,0x0b,0x18,0x15,0x10,0x0b,0x1b,0x10,0x1b,0x08,0x0b,0x13,0x13,0x15,0x15,\r\n0x15,0x13,0x13,0x13,0x1b,0x08,0x13,0x08,0x10,0x0d,0x08,0x08,0x10,0x08,0x18,0x08,0x1d,0x10,0x1d,0x1d,0x13,0x13,0x13,0x10,0x10,0x0d,0x0d,0x25,0x25,0x2b,0x2b,0x1b,0x1b,0x10,0x10,0x05,0x20,0x18,0x1b,0x15,0x13,0x15,0x10,0x10,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x08,0x15,0x00,0x15,0x15,0x15,0x0b,0x10,0x10,\r\n0x1d,0x0b,0x1d,0x0b,0x13,0x15,0x13,0x0d,0x1d,0x10,0x1d,0x10,0x18,0x1b,0x0b,0x10,0x10,0x0d,0x08,0x10,0x13,0x10,0x13,0x10,0x13,0x13,0x10,0x15,0x15,0x1d,0x0b,0x10,0x0d,0x15,0x10,0x0b,0x10,0x10,0x10,0x1d,0x0b,0x1d,0x0b,0x08,0x13,0x0c,0x20,0x10,0x10,0x15,0x15,0x20,0x10,0x00,0x00,0x00,0x15,0x00,0x15,0x15,0x15,0x15,0x18,0x15,\r\n0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x10,0x10,0x18,0x1b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x15,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x10,0x0d,0x0d,0x0d,0x25,0x1b,0x25,0x1b,0x25,\r\n0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x10,0x13,0x13,0x13,0x20,0x20,0x10,0x10,0x20,0x10,0x10,0x20,0x10,0x10,0x20,0x10,0x10,0x18,0x18,0x23,0x20,0x1d,0x10,0x1b,0x10,0x1b,0x10,0x1b,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x15,0x0b,0x15,0x0b,0x11,0x15,0x13,0x10,\r\n0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1b,0x1d,0x18,0x1b,0x0b,0x10,0x18,0x1b,0x18,0x1b,0x00,0x00,0x00,0x00,0x00,0x24,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0d,0x00,0x00,0x13,0x00,0x00,0x00,0x25,0x1b,0x2b,0x20,0x10,0x13,0x13,0x13,0x0d,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,\r\n0x1d,0x1d,0x0c,0x13,0x13,0x13,0x27,0x1b,0x11,0x31,0x23,0x0b,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x0d,0x0d,0x18,0x15,0x15,0x10,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x28,0x30,0x00,0x00,0x00,0x00,0x00,0x13,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,\r\n0x1d,0x0b,0x13,0x13,0x13,0x13,0x15,0x13,0x10,0x10,0x0d,0x25,0x1b,0x10,0x13,0x13,0x13,0x10,0x13,0x13,0x13,0x10,0x13,0x13,0x13,0x20,0x10,0x10,0x20,0x10,0x10,0x1d,0x10,0x10,0x1d,0x10,0x10,0x1d,0x10,0x10,0x13,0x13,0x13,0x13,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x15,0x0b,0x0b,0x0d,0x0d,0x25,0x1b,0x15,0x13,0x13,0x00,0x10,0x10,\r\n0x10,0x0c,0x12,0x16,0x14,0x10,0x11,0x0b,0x08,0x18,0x13,0x13,0x0b,0x12,0x0f,0x0f,0x0f,0x0f,0x08,0x10,0x0d,0x14,0x10,0x13,0x0f,0x11,0x0e,0x16,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0e,0x0f,0x0f,0x09,0x10,0x12,0x13,0x10,0x0b,0x18,0x13,0x14,0x11,0x14,0x10,0x12,0x10,0x0d,0x16,0x0c,0x0d,0x0d,0x0f,0x13,0x13,\r\n0x10,0x20,0x10,0x20,0x0b,0x08,0x05,0x11,0x07,0x04,0x00,0x04,0x07,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x1e,0x0e,0x18,0x13,0x1e,0x17,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1c,0x0f,0x1c,0x0f,0x1c,0x15,0x16,0x16,0x16,0x18,0x1c,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,\r\n0x1c,0x16,0x16,0x16,0x16,0x18,0x13,0x22,0x1a,0x0f,0x0f,0x09,0x09,0x09,0x0c,0x07,0x12,0x07,0x07,0x1b,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x06,0x00,0x00,0x07,0x00,0x00,0x14,0x12,0x0e,0x0f,0x16,0x09,0x0b,0x16,0x16,0x09,0x12,0x11,0x12,0x16,0x16,0x09,0x0d,0x16,0x13,0x14,0x14,0x12,\r\n0x13,0x15,0x12,0x19,0x17,0x11,0x11,0x11,0x07,0x0c,0x12,0x12,0x12,0x12,0x11,0x13,0x14,0x0f,0x16,0x11,0x12,0x16,0x12,0x17,0x12,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x12,0x0e,0x0f,0x16,0x0a,0x0b,0x16,0x0a,0x12,0x11,0x12,0x16,0x0d,0x16,0x14,0x14,0x13,0x15,0x12,0x19,0x17,0x09,0x12,0x11,0x14,0x15,0x26,0x00,0x14,0x12,0x15,0x15,\r\n0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x18,0x15,0x15,0x17,0x12,0x15,0x18,0x18,0x0f,0x14,0x18,0x18,0x15,0x18,0x1a,0x19,0x15,0x12,0x12,0x18,0x17,0x12,0x16,0x16,0x15,0x16,0x16,0x18,\r\n0x12,0x14,0x16,0x15,0x19,0x14,0x14,0x15,0x15,0x1a,0x10,0x13,0x13,0x1c,0x11,0x11,0x19,0x1d,0x14,0x11,0x22,0x12,0x12,0x18,0x11,0x11,0x18,0x12,0x18,0x1a,0x1c,0x11,0x19,0x11,0x15,0x11,0x14,0x12,0x14,0x11,0x13,0x19,0x11,0x14,0x15,0x11,0x11,0x13,0x1f,0x11,0x11,0x13,0x13,0x0e,0x0b,0x12,0x12,0x12,0x11,0x12,0x1c,0x12,0x1c,0x10,\r\n0x12,0x1c,0x15,0x12,0x1c,0x18,0x18,0x1c,0x12,0x12,0x1c,0x1c,0x12,0x12,0x12,0x12,0x12,0x12,0x1c,0x1c,0x13,0x12,0x12,0x1c,0x13,0x11,0x12,0x12,0x1c,0x19,0x16,0x16,0x16,0x16,0x17,0x14,0x16,0x19,0x16,0x15,0x11,0x19,0x16,0x16,0x12,0x15,0x16,0x18,0x17,0x13,0x16,0x15,0x17,0x15,0x19,0x16,0x17,0x17,0x16,0x14,0x16,0x16,0x17,0x19,\r\n0x15,0x18,0x17,0x03,0x04,0x05,0x06,0x05,0x09,0x0b,0x1c,0x12,0x14,0x13,0x12,0x14,0x12,0x12,0x15,0x13,0x12,0x0a,0x1b,0x13,0x12,0x12,0x11,0x13,0x10,0x13,0x09,0x13,0x11,0x12,0x0d,0x1c,0x12,0x12,0x12,0x13,0x1b,0x12,0x13,0x0d,0x1b,0x13,0x13,0x16,0x16,0x07,0x09,0x24,0x24,0x24,0x24,0x2e,0x11,0x11,0x08,0x11,0x0c,0x11,0x11,0x12,\r\n0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x11,0x11,0x12,0x11,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x10,0x10,0x10,0x13,0x0e,0x0d,0x12,0x14,0x08,0x0a,0x10,0x0d,0x18,0x15,0x14,0x10,0x14,0x10,0x0d,\r\n0x0e,0x13,0x10,0x1a,0x10,0x0f,0x0f,0x16,0x19,0x0d,0x14,0x10,0x13,0x11,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,0x08,0x15,0x14,0x14,0x14,0x14,0x14,0x13,0x13,0x13,0x13,0x0f,0x10,0x10,0x10,0x10,0x10,0x12,0x13,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x10,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x12,\r\n0x0a,0x10,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x14,0x14,0x14,0x10,0x10,0x10,0x0d,0x0d,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x16,0x14,0x10,0x10,0x0d,0x11,0x0e,0x0f,0x14,0x14,0x08,0x10,0x10,0x18,0x15,0x0e,0x14,0x14,0x10,0x0f,0x0e,0x0f,0x14,\r\n0x10,0x15,0x14,0x10,0x0e,0x14,0x08,0x14,0x0f,0x14,0x08,0x0f,0x0e,0x12,0x0d,0x10,0x0d,0x08,0x08,0x0a,0x1a,0x1a,0x14,0x10,0x10,0x13,0x10,0x10,0x10,0x0d,0x13,0x0e,0x18,0x0e,0x15,0x15,0x10,0x12,0x18,0x14,0x14,0x14,0x10,0x10,0x0e,0x10,0x14,0x10,0x14,0x12,0x1a,0x1b,0x12,0x17,0x10,0x10,0x1c,0x10,0x0d,0x13,0x13,0x14,0x1c,0x1c,\r\n0x15,0x10,0x12,0x0d,0x12,0x12,0x12,0x16,0x11,0x11,0x16,0x13,0x13,0x0b,0x14,0x14,0x12,0x10,0x10,0x1d,0x18,0x0f,0x11,0x13,0x13,0x14,0x14,0x17,0x16,0x0b,0x1e,0x13,0x12,0x12,0x15,0x15,0x10,0x10,0x09,0x18,0x16,0x16,0x0f,0x16,0x07,0x07,0x0e,0x0e,0x07,0x07,0x14,0x0d,0x09,0x18,0x17,0x09,0x07,0x07,0x0e,0x0c,0x0c,0x07,0x07,0x07,\r\n0x0c,0x16,0x0f,0x0a,0x13,0x16,0x13,0x13,0x10,0x18,0x12,0x13,0x0b,0x0e,0x11,0x0e,0x07,0x07,0x0c,0x11,0x0b,0x15,0x15,0x15,0x1d,0x18,0x1d,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x18,0x1b,0x0b,0x0b,0x10,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x10,0x10,0x25,0x1b,0x25,0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x1b,0x1b,0x1b,0x1b,\r\n0x1b,0x1d,0x1d,0x10,0x10,0x1d,0x1d,0x10,0x10,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x20,0x18,0x1b,0x10,0x13,0x13,0x15,0x0b,0x15,0x18,0x10,0x10,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1d,0x0b,0x18,0x10,0x10,0x08,0x10,0x10,0x10,0x10,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,\r\n0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x25,0x1b,0x25,0x1b,0x25,0x1b,0x2b,0x20,0x2b,0x20,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,0x20,0x18,0x10,0x10,0x18,0x10,0x10,0x1d,0x10,0x23,0x20,0x1d,0x10,0x1b,0x10,0x1b,0x10,0x1b,0x10,0x1d,\r\n0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x1d,0x10,0x15,0x15,0x15,0x15,0x15,0x0b,0x15,0x15,0x0b,0x0b,0x15,0x0b,0x15,0x0b,0x15,0x10,0x13,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x0b,0x0b,0x10,0x0b,0x0b,0x0b,0x0b,0x00,0x25,0x1b,0x2b,0x20,0x1d,0x10,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,0x1d,0x0b,\r\n0x13,0x13,0x10,0x10,0x0d,0x25,0x1b,0x20,0x20,0x1d,0x1d,0x1d,0x13,0x13,0x13,0x13,0x15,0x0b,0x15,0x0b,0x15,0x0b,0x25,0x1b,0x13,0x15,0x13,0x13,0x13,0x15,0x13,0x13,0x25,0x25,0x1b,0x1b,0x0d,0x0d,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x18,0x1b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x1d,0x0b,\r\n0x1d,0x0b,0x13,0x15,0x13,0x13,0x25,0x25,0x1b,0x1b,0x25,0x25,0x1b,0x1b,0x1b,0x1b,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x08,0x08,0x0b,0x08,0x00,0x00,0x00,0x1b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0d,0x0d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,\r\n0x18,0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x1b,0x13,0x1b,0x13,0x1b,0x13,0x1b,0x15,\r\n0x15,0x15,0x08,0x08,0x10,0x0d,0x13,0x14,0x12,0x11,0x12,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x12,0x11,0x13,0x14,0x14,0x15,0x13,0x12,0x15,0x10,0x15,0x18,0x14,0x18,0x1b,0x14,0x18,0x16,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x0f,0x11,0x13,0x13,0x15,0x12,0x15,0x12,0x13,\r\n0x13,0x10,0x10,0x18,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x18,0x19,0x18,0x18,0x1e,0x1e,0x16,0x1e,0x1e,0x17,0x1c,0x1b,0x12,0x19,0x1b,0x18,0x13,0x1b,0x18,0x16,0x16,0x13,0x15,0x18,0x19,0x16,0x14,0x17,0x13,0x11,0x1e,0x1d,0x1d,0x1a,0x1e,0x1e,0x16,0x1e,0x1e,0x17,0x19,0x19,0x18,0x17,0x17,0x15,0x1c,0x18,0x1a,0x17,0x17,0x13,0x18,\r\n0x16,0x16,0x1b,0x18,0x17,0x1d,0x11,0x10,0x12,0x11,0x14,0x14,0x16,0x17,0x13,0x12,0x12,0x11,0x12,0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x10,0x11,0x13,0x14,0x13,0x13,0x0f,0x12,0x12,0x13,0x13,0x18,0x1b,0x15,0x15,0x14,0x19,0x14,0x16,0x10,0x0f,0x13,0x12,0x0f,0x10,0x12,0x12,0x0f,0x0f,0x14,0x0f,0x11,0x10,0x12,0x19,0x12,0x1a,\r\n0x11,0x12,0x12,0x18,0x0a,0x19,0x16,0x17,0x15,0x12,0x18,0x13,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0e,0x0e,0x0e,0x0e,0x0f,0x0e,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x14,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x1d,0x1d,0x1d,0x1d,0x10,\r\n0x18,0x17,0x10,0x0d,0x10,0x11,0x12,0x10,0x1b,0x1a,0x1c,0x0e,0x20,0x10,0x1b,0x1b,0x1b,0x1a,0x12,0x10,0x10,0x19,0x13,0x19,0x16,0x11,0x0f,0x0d,0x21,0x0d,0x11,0x10,0x10,0x10,0x10,0x10,0x2c,0x1b,0x1b,0x0e,0x08,0x0f,0x08,0x0f,0x08,0x08,0x08,0x0f,0x13,0x13,0x11,0x0c,0x0c,0x07,0x07,0x07,0x0c,0x07,0x0d,0x1c,0x07,0x1d,0x1d,0x1d,\r\n0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x15,0x25,0x25,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0f,0x13,0x0f,0x11,0x0e,0x0b,0x0b,0x16,0x12,0x17,0x0e,0x24,0x1d,\r\n0x13,0x12,0x1d,0x19,0x1b,0x18,0x21,0x1a,0x1e,0x19,0x15,0x0f,0x17,0x13,0x1e,0x17,0x18,0x13,0x18,0x13,0x1c,0x15,0x1c,0x15,0x23,0x1b,0x18,0x13,0x18,0x13,0x27,0x1c,0x19,0x00,0x20,0x20,0x20,0x0f,0x00,0x00,0x13,0x10,0x16,0x12,0x11,0x0e,0x22,0x1d,0x1e,0x1c,0x17,0x13,0x16,0x13,0x11,0x0d,0x18,0x13,0x11,0x0d,0x1a,0x15,0x15,0x12,\r\n0x1f,0x1a,0x11,0x12,0x17,0x17,0x1a,0x0e,0x06,0x0f,0x16,0x0e,0x20,0x20,0x08,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0d,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,0x13,\r\n0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,\r\n0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x0f,0x16,0x17,0x09,0x07,0x09,0x07,0x17,0x12,0x18,0x14,0x12,0x0f,0x11,0x0f,0x13,0x12,0x0d,0x0d,0x24,0x1a,0x25,0x1c,0x20,0x1b,0x1d,0x15,0x1d,0x15,0x1d,\r\n0x15,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x11,0x0a,0x0f,0x08,0x18,0x13,0x1b,0x16,0x2b,0x20,0x12,0x13,0x16,0x17,0x1a,0x1c,0x18,0x13,0x1f,0x19,0x11,0x0d,0x12,0x10,0x14,0x0f,0x1e,0x17,0x14,0x11,0x12,0x13,0x12,0x13,0x0f,0x0d,0x0f,0x0c,0x0f,0x0c,0x11,0x11,0x0a,0x16,0x0a,0x1f,0x15,0x0b,0x13,0x14,0x0f,0x18,0x12,0x0c,0x0b,\r\n0x13,0x13,0x12,0x0f,0x08,0x18,0x13,0x0c,0x0b,0x14,0x0f,0x17,0x0c,0x19,0x13,0x14,0x0f,0x16,0x13,0x13,0x10,0x18,0x12,0x13,0x0b,0x11,0x0e,0x18,0x0e,0x11,0x1c,0x10,0x12,0x1d,0x09,0x25,0x1d,0x1d,0x26,0x1c,0x1d,0x1d,0x1c,0x1c,0x1e,0x11,0x0f,0x14,0x16,0x1d,0x16,0x1e,0x08,0x0f,0x13,0x1c,0x21,0x16,0x21,0x14,0x14,0x19,0x16,0x24,\r\n0x1e,0x11,0x1d,0x0b,0x1d,0x0b,0x13,0x13,0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x20,0x10,0x10,0x20,0x18,0x10,0x10,0x18,0x15,0x0b,0x0b,0x15,0x13,0x13,0x13,0x13,0x18,0x0b,0x0b,0x1b,0x18,0x0b,0x0b,0x1b,0x0d,0x0d,0x10,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x32,0x10,0x0d,0x12,0x11,0x18,0x13,0x13,0x1c,0x15,0x18,0x18,0x1b,0x1a,0x13,0x10,0x20,0x1a,0x21,0x1b,0x16,0x13,0x0a,0x0a,0x13,0x15,0x0d,0x13,0x11,0x13,0x0f,0x18,0x1a,0x0d,0x13,0x0e,0x07,0x0c,0x11,0x12,0x07,0x07,0x06,0x07,0x0c,0x0c,0x0c,0x0e,0x30,0x40,0x0b,0x0d,0x04,0x09,0x0c,0x0e,0x0a,\r\n0x10,0x11,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x0f,0x0f,0x2b,0x11,0x18,0x1d,0x1d,0x15,0x0f,0x12,0x17,0x18,0x10,0x0a,0x15,0x11,0x16,0x12,0x15,0x11,0x11,0x18,0x13,0x13,0x11,0x18,0x14,0x1b,0x0f,0x11,0x14,0x0a,0x13,0x0b,0x0b,0x08,0x1c,0x13,0x12,0x11,0x11,0x13,0x1e,0x1e,0x1e,0x20,0x20,0x12,0x10,\r\n0x09,0x10,0x0f,0x13,0x0f,0x15,0x08,0x12,0x13,0x1c,0x1c,0x14,0x11,0x12,0x11,0x11,0x0f,0x11,0x0f,0x0f,0x0a,0x0b,0x08,0x07,0x0c,0x13,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0a,0x0a,0x00,0x09,0x09,0x09,0x08,0x08,0x36,0x20,0x1c,0x22,0x09,0x09,0x0a,0x0d,0x08,0x09,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x09,0x09,0x09,0x00,0x1d,0x0b,0x0b,0x1d,0x08,0x10,0x10,0x2b,0x20,0x20,0x2b,0x1d,0x10,0x10,0x1d,0x10,0x10,0x0d,0x0d,0x00,0x00,0x0b,0x18,0x13,0x17,0x12,0x28,0x21,0x16,0x12,0x16,0x12,0x2b,0x20,0x18,0x13,0x0c,0x0a,0x14,0x00,0x16,0x11,0x0b,0x0a,0x05,0x10,0x0b,0x0b,0x08,0x06,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x07,0x11,0x0e,0x13,0x12,0x12,0x1f,0x1a,0x1a,0x19,0x1a,0x1e,0x14,0x16,0x13,0x0d,0x1e,0x24,0x0e,0x25,0x10,0x1b,0x1d,0x1d,0x1d,0x0d,0x18,0x20,0x18,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x13,0x13,0x13,0x1b,0x10,0x10,0x1d,0x0b,0x0b,0x1d,0x0b,0x0b,0x1d,0x10,0x10,0x00,0x0d,\r\n0x1b,0x0b,0x0b,0x20,0x10,0x10,0x18,0x10,0x10,0x15,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x30,0x30,0x1c,0x00,0x00,0x1c,0x1c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x14,0x15,0x15,0x1c,0x15,0x14,0x1a,0x1f,0x15,0x14,0x22,0x14,0x14,0x1e,0x14,\r\n0x16,0x19,0x14,0x19,0x1b,0x1d,0x14,0x19,0x15,0x16,0x14,0x16,0x14,0x15,0x16,0x14,0x19,0x13,0x15,0x19,0x14,0x14,0x12,0x19,0x15,0x15,0x15,0x16,0x0e,0x11,0x15,0x19,0x19,0x11,0x00,0x00,0x21,0x42,0x15,0x00,0x03,0x09,0x09,0x0d,0x14,0x12,0x1b,0x1a,0x08,0x0a,0x0a,0x0e,0x17,0x07,0x0d,0x07,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,\r\n0x12,0x12,0x12,0x07,0x07,0x17,0x17,0x17,0x0f,0x20,0x15,0x13,0x14,0x17,0x11,0x10,0x17,0x17,0x09,0x0c,0x13,0x10,0x1e,0x19,0x19,0x12,0x19,0x14,0x12,0x11,0x17,0x15,0x1f,0x13,0x12,0x13,0x0a,0x0d,0x0a,0x17,0x0e,0x09,0x11,0x13,0x0f,0x13,0x11,0x0a,0x13,0x13,0x08,0x08,0x10,0x08,0x1c,0x13,0x13,0x13,0x13,0x0b,0x0e,0x0b,0x13,0x10,\r\n0x18,0x0f,0x10,0x0f,0x0a,0x08,0x0a,0x17,0x15,0x15,0x14,0x11,0x19,0x19,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x11,0x11,0x11,0x11,0x08,0x08,0x08,0x08,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0c,0x0c,0x12,0x12,0x0f,0x0d,0x0f,0x12,0x0d,0x1d,0x1d,0x1a,0x09,0x0e,0x17,0x1c,0x19,0x1b,0x17,0x17,0x17,0x12,0x13,0x12,\r\n0x14,0x19,0x12,0x0d,0x0e,0x19,0x1b,0x13,0x0f,0x09,0x09,0x17,0x15,0x12,0x17,0x15,0x11,0x11,0x18,0x15,0x15,0x19,0x1f,0x1f,0x11,0x21,0x0c,0x0c,0x08,0x08,0x17,0x13,0x10,0x12,0x06,0x12,0x0a,0x0a,0x12,0x12,0x0c,0x07,0x08,0x0c,0x28,0x15,0x11,0x15,0x11,0x11,0x09,0x09,0x09,0x09,0x19,0x19,0x19,0x17,0x17,0x17,0x08,0x0c,0x0b,0x0a,\r\n0x0a,0x07,0x09,0x07,0x0b,0x06,0x0c,0x10,0x09,0x12,0x0e,0x13,0x0f,0x08,0x17,0x12,0x12,0x10,0x12,0x13,0x17,0x17,0x0c,0x0c,0x0c,0x1f,0x1e,0x1f,0x10,0x17,0x13,0x09,0x12,0x0e,0x14,0x0f,0x14,0x0f,0x13,0x0e,0x07,0x15,0x11,0x15,0x11,0x17,0x16,0x17,0x11,0x11,0x11,0x11,0x10,0x08,0x10,0x0a,0x10,0x0a,0x19,0x13,0x19,0x13,0x19,0x13,\r\n0x14,0x0b,0x14,0x0b,0x12,0x0e,0x11,0x0b,0x11,0x0f,0x17,0x13,0x17,0x13,0x13,0x0f,0x13,0x0f,0x10,0x19,0x19,0x14,0x13,0x0e,0x13,0x10,0x17,0x0e,0x10,0x0d,0x25,0x15,0x10,0x14,0x08,0x0c,0x1b,0x0b,0x14,0x0c,0x0c,0x14,0x0c,0x15,0x11,0x14,0x0f,0x14,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,\r\n0x13,0x09,0x08,0x09,0x08,0x09,0x08,0x09,0x08,0x0c,0x08,0x13,0x10,0x10,0x10,0x08,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x14,0x0b,0x12,0x0e,0x11,0x0b,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x1f,0x18,0x12,0x10,0x08,0x15,0x11,0x1c,0x1b,0x19,0x13,0x07,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x12,0x10,0x08,0x0e,0x12,0x14,0x1e,0x1e,\r\n0x1f,0x1d,0x0d,0x0d,0x07,0x09,0x09,0x15,0x13,0x1a,0x0c,0x1a,0x16,0x1b,0x09,0x15,0x13,0x11,0x13,0x17,0x09,0x13,0x15,0x1e,0x19,0x11,0x19,0x18,0x12,0x11,0x11,0x12,0x13,0x1a,0x19,0x09,0x12,0x14,0x0e,0x13,0x09,0x12,0x12,0x11,0x0f,0x13,0x13,0x09,0x11,0x10,0x13,0x11,0x0f,0x13,0x13,0x0f,0x12,0x12,0x19,0x1b,0x09,0x12,0x13,0x12,\r\n0x1b,0x11,0x17,0x10,0x14,0x12,0x09,0x20,0x20,0x18,0x13,0x13,0x17,0x15,0x13,0x13,0x10,0x17,0x11,0x1d,0x12,0x19,0x19,0x13,0x16,0x1e,0x17,0x19,0x18,0x12,0x14,0x11,0x13,0x18,0x13,0x19,0x16,0x1f,0x20,0x17,0x1a,0x13,0x14,0x22,0x14,0x11,0x13,0x11,0x0d,0x12,0x11,0x19,0x0f,0x13,0x13,0x10,0x11,0x17,0x13,0x13,0x13,0x13,0x0f,0x0e,\r\n0x10,0x17,0x0f,0x14,0x13,0x1a,0x1b,0x14,0x17,0x11,0x0f,0x1b,0x11,0x11,0x13,0x0d,0x0f,0x0e,0x08,0x1a,0x1b,0x13,0x10,0x10,0x13,0x0f,0x0d,0x21,0x25,0x15,0x0c,0x0c,0x0c,0x0c,0x08,0x12,0x0e,0x12,0x19,0x14,0x17,0x13,0x0a,0x0b,0x09,0x09,0x10,0x10,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x0a,0x10,0x0a,0x0a,0x0a,0x10,0x10,0x15,0x11,0x15,\r\n0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x08,0x09,0x08,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x14,0x19,0x14,0x19,0x14,0x19,0x14,0x19,\r\n0x14,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x12,0x10,0x12,0x10,0x12,0x10,0x11,0x0b,0x11,0x11,0x19,0x13,0x09,0x0c,0x08,0x08,0x11,0x0e,0x1e,0x1a,0x14,0x12,0x13,0x10,0x19,0x14,0x12,0x10,0x12,0x10,0x15,0x10,0x16,0x13,0x16,0x13,0x18,0x11,0x19,0x13,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x10,0x10,0x10,\r\n0x10,0x09,0x09,0x0a,0x0a,0x0a,0x0a,0x11,0x11,0x15,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x14,0x0f,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x0a,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x09,0x08,0x09,0x08,0x13,0x10,0x13,0x10,0x13,0x10,0x10,\r\n0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x1e,0x1c,0x1e,0x1c,0x1e,0x1c,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x12,0x13,0x12,0x13,0x14,0x0b,0x14,0x0b,0x14,0x0b,0x14,0x0b,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x12,0x0e,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x11,0x0b,0x17,0x13,0x17,0x13,0x17,\r\n0x13,0x17,0x13,0x17,0x13,0x15,0x10,0x15,0x10,0x1f,0x18,0x1f,0x18,0x13,0x0f,0x13,0x0f,0x12,0x10,0x13,0x0f,0x13,0x0f,0x13,0x0f,0x13,0x0b,0x18,0x10,0x11,0x08,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,\r\n0x13,0x13,0x13,0x1a,0x1a,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x10,0x10,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,\r\n0x20,0x20,0x20,0x14,0x14,0x0e,0x0e,0x13,0x13,0x09,0x09,0x13,0x13,0x12,0x12,0x1b,0x1b,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x20,0x20,0x20,0x20,0x20,\r\n0x20,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1a,0x1a,0x17,0x13,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0c,0x0c,0x13,0x13,0x13,0x12,0x12,0x12,0x12,0x13,0x13,0x12,0x12,0x12,0x12,0x16,0x16,0x15,0x13,0x13,0x13,0x1b,0x1b,0x1b,0x1b,\r\n0x1b,0x1b,0x1b,0x1c,0x1b,0x19,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x14,0x13,0x13,0x13,0x13,0x14,0x14,0x0f,0x17,0x18,0x13,0x13,0x14,0x11,0x12,0x10,0x17,0x15,0x1d,0x0a,0x09,0x13,0x10,0x08,0x10,0x1d,0x19,0x13,0x19,0x20,0x1a,0x14,0x13,0x13,0x12,0x0e,0x11,0x0a,0x0b,0x11,0x0b,\r\n0x11,0x19,0x18,0x13,0x11,0x13,0x0f,0x14,0x14,0x0f,0x0e,0x12,0x12,0x0d,0x0d,0x12,0x08,0x0d,0x0f,0x09,0x29,0x26,0x22,0x1c,0x18,0x11,0x23,0x20,0x1b,0x15,0x11,0x09,0x08,0x19,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x17,0x13,0x11,0x15,0x11,0x15,0x11,0x1c,0x1b,0x17,0x13,0x17,0x13,0x13,0x10,0x19,0x13,0x19,0x13,0x14,0x0f,\r\n0x08,0x29,0x26,0x22,0x17,0x13,0x21,0x17,0x19,0x13,0x15,0x11,0x15,0x11,0x11,0x11,0x11,0x11,0x09,0x08,0x09,0x08,0x19,0x13,0x19,0x13,0x13,0x0b,0x14,0x0b,0x17,0x13,0x17,0x13,0x11,0x0e,0x17,0x13,0x18,0x13,0x13,0x13,0x0f,0x15,0x11,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x12,0x10,0x13,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,\r\n0x0f,0x0f,0x13,0x13,0x11,0x14,0x0e,0x0e,0x11,0x12,0x09,0x13,0x13,0x11,0x10,0x0f,0x13,0x13,0x13,0x09,0x09,0x0b,0x09,0x0c,0x08,0x14,0x1c,0x1c,0x1c,0x12,0x12,0x13,0x13,0x17,0x18,0x15,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x0d,0x08,0x09,0x0a,0x09,0x0b,0x0b,0x14,0x14,0x12,0x10,0x18,0x10,0x0e,0x0f,0x11,0x0f,0x0f,0x0c,\r\n0x0c,0x0c,0x0f,0x14,0x10,0x12,0x11,0x13,0x08,0x10,0x0d,0x13,0x0c,0x0c,0x1e,0x1f,0x20,0x14,0x10,0x18,0x1a,0x13,0x13,0x10,0x10,0x12,0x14,0x13,0x16,0x13,0x15,0x1a,0x13,0x17,0x13,0x13,0x0f,0x10,0x0f,0x14,0x11,0x14,0x10,0x1d,0x1c,0x14,0x11,0x15,0x12,0x14,0x0f,0x14,0x10,0x16,0x13,0x13,0x0d,0x13,0x13,0x0f,0x08,0x19,0x0f,0x0f,\r\n0x1c,0x16,0x15,0x13,0x1e,0x18,0x16,0x10,0x1d,0x17,0x18,0x13,0x1f,0x19,0x12,0x0f,0x1a,0x19,0x19,0x13,0x18,0x13,0x18,0x13,0x2b,0x25,0x1b,0x15,0x25,0x1e,0x1c,0x16,0x13,0x0e,0x11,0x0d,0x0e,0x00,0x00,0x21,0x1f,0x13,0x11,0x13,0x13,0x13,0x11,0x12,0x0f,0x13,0x10,0x17,0x13,0x1c,0x16,0x21,0x1c,0x18,0x12,0x14,0x0f,0x11,0x0e,0x1d,\r\n0x17,0x17,0x13,0x1c,0x15,0x1c,0x15,0x09,0x1d,0x19,0x13,0x11,0x17,0x13,0x16,0x13,0x15,0x11,0x15,0x11,0x1c,0x1b,0x11,0x11,0x18,0x11,0x18,0x11,0x1d,0x19,0x12,0x0f,0x11,0x0f,0x19,0x13,0x19,0x13,0x19,0x13,0x19,0x13,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x16,0x13,0x1a,0x17,0x13,0x13,0x1c,0x1c,0x1b,0x18,0x12,0x10,0x1e,0x1a,\r\n0x21,0x1c,0x18,0x12,0x16,0x14,0x13,0x13,0x13,0x11,0x13,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x13,0x0b,0x0b,0x05,0x07,0x07,0x07,0x09,0x0d,0x09,0x08,0x0c,0x07,0x07,0x07,0x0b,0x0b,0x07,0x07,0x13,0x13,0x13,0x13,0x0b,0x09,0x09,0x0b,0x0a,0x09,0x09,0x09,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0a,0x0b,0x0b,0x0a,0x05,0x08,0x09,0x07,0x0d,0x0d,0x0d,0x0d,0x0d,0x0b,0x0b,0x0b,0x0e,0x0b,0x08,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,\r\n0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x12,0x12,\r\n0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x12,0x12,0x00,0x00,0x00,0x00,0x00,0x15,0x0a,0x15,0x0b,0x14,0x14,0x0b,0x0b,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x13,0x0f,0x16,0x1b,0x10,0x0f,0x12,0x12,0x0e,0x0e,0x08,0x0a,0x10,0x0d,0x17,0x13,0x13,0x10,0x14,0x14,0x14,0x1f,0x12,0x14,0x14,0x0f,0x0f,0x0f,0x0e,0x12,0x13,0x18,0x13,0x10,0x18,0x0f,0x0e,0x0e,0x11,0x0d,0x0f,0x13,0x0f,0x14,0x13,0x0c,0x10,0x0b,0x0c,0x0e,0x0a,0x0a,0x0e,0x0e,0x06,0x08,0x0c,\r\n0x09,0x11,0x0e,0x0e,0x0e,0x0d,0x0b,0x0b,0x0a,0x0e,0x11,0x0a,0x0a,0x0b,0x10,0x0b,0x0b,0x0a,0x0a,0x09,0x09,0x0b,0x05,0x0a,0x10,0x0b,0x0b,0x09,0x0b,0x0b,0x0b,0x07,0x0b,0x0b,0x10,0x09,0x0b,0x0b,0x0a,0x0b,0x0d,0x0a,0x05,0x07,0x0b,0x09,0x0b,0x0a,0x0b,0x0d,0x0a,0x13,0x05,0x0b,0x12,0x1d,0x15,0x12,0x12,0x1c,0x15,0x1c,0x19,0x11,\r\n0x13,0x11,0x0f,0x25,0x0f,0x13,0x1d,0x1f,0x1f,0x15,0x15,0x14,0x0f,0x10,0x11,0x0e,0x0f,0x11,0x07,0x00,0x00,0x00,0x00,0x13,0x14,0x14,0x14,0x10,0x0d,0x13,0x13,0x0a,0x1c,0x13,0x13,0x0b,0x0b,0x0f,0x0b,0x0f,0x13,0x0f,0x13,0x1e,0x15,0x0b,0x09,0x13,0x12,0x14,0x13,0x13,0x0a,0x13,0x10,0x08,0x1c,0x13,0x13,0x0b,0x0e,0x0e,0x10,0x0f,\r\n0x0f,0x11,0x13,0x13,0x11,0x0e,0x0f,0x18,0x08,0x0f,0x08,0x13,0x0f,0x0b,0x09,0x09,0x0b,0x09,0x06,0x05,0x0b,0x0b,0x05,0x06,0x06,0x06,0x05,0x06,0x05,0x07,0x10,0x10,0x0b,0x0b,0x0c,0x0b,0x0c,0x08,0x05,0x07,0x0b,0x0b,0x0b,0x0b,0x09,0x09,0x09,0x0a,0x09,0x0b,0x00,0x00,0x00,0x00,0x07,0x0a,0x0a,0x0b,0x09,0x0a,0x12,0x12,0x12,0x12,\r\n0x0b,0x00,0x00,0x00,0x00,0x0f,0x0a,0x09,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x09,0x09,0x09,0x09,0x12,0x12,0x12,0x12,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x06,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0a,0x1a,0x15,0x17,0x13,0x19,0x15,0x1f,0x19,0x12,0x0c,0x11,0x17,0x12,0x1b,0x17,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x1c,0x1c,0x21,0x0e,0x08,0x11,\r\n0x13,0x0e,0x11,0x11,0x13,0x13,0x11,0x21,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x15,0x11,0x11,0x11,0x0b,0x13,0x0b,0x19,0x16,0x11,0x0b,0x1c,0x11,0x1c,0x08,0x0b,0x13,0x13,0x15,0x15,0x15,0x13,0x13,0x13,0x1c,0x08,0x13,0x08,0x11,0x0e,0x08,0x08,0x11,0x08,0x19,0x08,0x1e,0x11,0x1e,0x1e,0x13,0x13,0x13,0x11,0x11,0x0e,0x0e,0x27,\r\n0x27,0x2c,0x2c,0x1c,0x1c,0x11,0x11,0x06,0x21,0x19,0x1c,0x16,0x13,0x16,0x11,0x11,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x08,0x15,0x00,0x15,0x15,0x15,0x0b,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x13,0x16,0x13,0x0e,0x1e,0x11,0x1e,0x11,0x19,0x1c,0x0b,0x11,0x11,0x0e,0x08,0x11,0x13,0x11,0x13,0x11,0x13,0x13,0x11,0x16,\r\n0x15,0x1e,0x0b,0x11,0x0e,0x16,0x11,0x0b,0x11,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x08,0x13,0x0d,0x21,0x11,0x11,0x15,0x15,0x21,0x11,0x00,0x00,0x00,0x15,0x00,0x15,0x15,0x15,0x15,0x19,0x15,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x0e,0x11,0x11,0x19,0x1c,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,\r\n0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x11,0x0e,0x0e,0x0e,0x27,0x1c,0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x11,0x13,0x13,0x13,0x21,0x21,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x21,0x11,0x11,0x19,0x19,0x24,0x21,0x1e,\r\n0x11,0x1c,0x11,0x1c,0x11,0x1c,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x16,0x0b,0x16,0x0b,0x12,0x16,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1c,0x1e,0x19,0x1c,0x0b,0x11,0x19,0x1c,0x19,0x1c,0x00,0x00,0x00,0x00,0x00,0x25,0x24,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x08,0x0e,0x00,0x00,0x14,0x00,0x00,0x00,0x27,0x1c,0x2c,0x21,0x11,0x13,0x13,0x13,0x0e,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x1e,0x1e,0x0c,0x13,0x13,0x14,0x28,0x1b,0x12,0x32,0x24,0x0b,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x11,0x0e,0x0e,0x19,0x16,\r\n0x16,0x11,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x29,0x32,0x00,0x00,0x00,0x00,0x00,0x13,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x0e,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x16,0x13,0x11,0x11,0x0e,0x27,0x1c,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x21,0x11,0x11,\r\n0x21,0x11,0x11,0x1e,0x11,0x11,0x1e,0x11,0x11,0x1e,0x11,0x11,0x13,0x13,0x13,0x13,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x16,0x0b,0x0b,0x0e,0x0e,0x27,0x1c,0x15,0x13,0x13,0x00,0x11,0x11,0x11,0x0c,0x13,0x17,0x15,0x11,0x11,0x0c,0x08,0x19,0x13,0x14,0x0b,0x12,0x10,0x10,0x0f,0x10,0x08,0x11,0x0e,0x14,0x10,0x13,0x0f,0x12,0x0e,0x16,\r\n0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x0f,0x10,0x10,0x09,0x11,0x12,0x14,0x11,0x0b,0x19,0x13,0x15,0x12,0x14,0x10,0x13,0x11,0x0d,0x17,0x0c,0x0e,0x0e,0x10,0x14,0x14,0x11,0x21,0x11,0x21,0x0b,0x08,0x06,0x12,0x07,0x04,0x00,0x05,0x07,0x00,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,\r\n0x11,0x1f,0x0e,0x19,0x13,0x1f,0x18,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x1e,0x1c,0x10,0x1c,0x10,0x1c,0x15,0x17,0x17,0x17,0x19,0x1c,0x21,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x17,0x17,0x17,0x17,0x18,0x13,0x23,0x1b,0x10,0x10,0x09,0x09,0x09,0x0c,0x07,0x13,0x08,0x08,0x1c,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x00,0x07,0x00,0x00,0x07,0x00,0x00,0x15,0x13,0x0e,0x10,0x16,0x09,0x0b,0x16,0x16,0x09,0x12,0x12,0x12,0x17,0x16,0x09,0x0d,0x16,0x14,0x14,0x15,0x13,0x13,0x16,0x12,0x1a,0x18,0x11,0x11,0x11,0x08,0x0c,0x12,0x12,0x12,0x12,0x12,0x14,0x15,0x10,0x16,0x12,0x12,0x17,0x12,0x18,0x12,0x1a,0x1a,0x1a,\r\n0x1a,0x15,0x15,0x15,0x13,0x0e,0x10,0x16,0x0a,0x0c,0x16,0x0a,0x12,0x12,0x12,0x16,0x0d,0x16,0x14,0x15,0x13,0x16,0x12,0x1a,0x18,0x09,0x13,0x12,0x15,0x16,0x28,0x00,0x15,0x12,0x16,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x0d,0x09,0x00,0x19,0x15,0x16,0x17,0x12,0x16,0x19,0x19,0x10,0x15,0x19,0x18,0x16,0x19,0x1b,0x1a,0x16,0x12,0x12,0x19,0x17,0x13,0x17,0x16,0x16,0x16,0x17,0x18,0x13,0x15,0x16,0x16,0x1a,0x15,0x14,0x15,0x16,0x1b,0x10,0x13,0x13,0x1d,0x12,0x12,0x19,0x1d,0x14,0x12,0x23,0x13,0x13,0x19,0x12,0x12,0x19,0x13,\r\n0x19,0x1b,0x1d,0x12,0x19,0x12,0x16,0x12,0x14,0x13,0x15,0x12,0x14,0x19,0x12,0x14,0x16,0x12,0x12,0x14,0x20,0x12,0x12,0x13,0x13,0x0e,0x0b,0x12,0x12,0x12,0x12,0x12,0x1d,0x12,0x1d,0x10,0x12,0x1d,0x16,0x12,0x1d,0x19,0x19,0x1d,0x13,0x12,0x1d,0x1d,0x12,0x12,0x12,0x12,0x12,0x12,0x1d,0x1d,0x13,0x12,0x13,0x1d,0x14,0x12,0x12,0x12,\r\n0x1d,0x1a,0x17,0x17,0x17,0x17,0x17,0x15,0x17,0x1a,0x17,0x15,0x12,0x1a,0x16,0x17,0x13,0x16,0x17,0x19,0x18,0x13,0x17,0x16,0x18,0x16,0x1a,0x17,0x18,0x18,0x17,0x15,0x17,0x16,0x18,0x1a,0x16,0x19,0x18,0x03,0x04,0x05,0x06,0x05,0x09,0x0c,0x1c,0x13,0x14,0x14,0x13,0x14,0x13,0x13,0x15,0x14,0x13,0x0a,0x1c,0x13,0x13,0x13,0x12,0x14,\r\n0x11,0x13,0x09,0x13,0x11,0x13,0x0e,0x1c,0x12,0x13,0x13,0x14,0x1b,0x13,0x13,0x0d,0x1b,0x13,0x13,0x17,0x16,0x07,0x09,0x25,0x25,0x25,0x25,0x2f,0x12,0x12,0x08,0x12,0x0d,0x12,0x12,0x13,0x12,0x12,0x11,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0d,0x12,0x12,0x13,0x12,0x12,0x11,0x12,0x12,0x12,0x12,0x12,\r\n0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x10,0x11,0x13,0x0e,0x0e,0x13,0x14,0x08,0x0a,0x10,0x0e,0x19,0x15,0x14,0x10,0x14,0x10,0x0e,0x0f,0x14,0x11,0x1a,0x11,0x0f,0x10,0x17,0x1a,0x0e,0x15,0x10,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x0e,0x0e,0x08,0x08,0x08,\r\n0x08,0x15,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0f,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x11,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x13,0x0a,0x10,0x0e,0x0e,0x0e,0x0e,0x15,0x15,0x15,0x16,0x14,0x14,0x14,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x0e,0x0f,0x0f,0x0f,0x0f,0x14,0x14,0x14,0x14,\r\n0x14,0x14,0x1a,0x1a,0x1a,0x1a,0x0f,0x0f,0x0f,0x10,0x10,0x10,0x11,0x17,0x15,0x11,0x10,0x0d,0x12,0x0e,0x10,0x14,0x14,0x08,0x10,0x11,0x19,0x15,0x0f,0x14,0x14,0x10,0x0f,0x0f,0x0f,0x15,0x11,0x16,0x15,0x11,0x0e,0x14,0x08,0x14,0x0f,0x15,0x08,0x0f,0x0e,0x13,0x0d,0x11,0x0e,0x08,0x08,0x0a,0x1b,0x1b,0x14,0x10,0x10,0x14,0x11,0x10,\r\n0x10,0x0d,0x13,0x0e,0x18,0x0f,0x15,0x15,0x10,0x13,0x19,0x14,0x14,0x14,0x10,0x11,0x0f,0x10,0x15,0x11,0x15,0x12,0x1b,0x1b,0x13,0x17,0x10,0x11,0x1c,0x10,0x0d,0x13,0x13,0x15,0x1d,0x1d,0x16,0x11,0x13,0x0e,0x13,0x12,0x12,0x17,0x11,0x11,0x17,0x13,0x13,0x0c,0x14,0x14,0x13,0x10,0x10,0x1e,0x19,0x10,0x12,0x14,0x14,0x15,0x15,0x17,\r\n0x17,0x0c,0x1f,0x13,0x12,0x13,0x15,0x15,0x11,0x11,0x09,0x19,0x17,0x17,0x10,0x17,0x07,0x07,0x0e,0x0e,0x07,0x07,0x14,0x0d,0x09,0x19,0x17,0x09,0x07,0x07,0x0f,0x0c,0x0c,0x08,0x08,0x08,0x0c,0x16,0x10,0x0a,0x14,0x17,0x13,0x13,0x10,0x19,0x13,0x14,0x0b,0x0f,0x12,0x0e,0x07,0x08,0x0d,0x11,0x0b,0x16,0x16,0x16,0x1e,0x19,0x1e,0x08,\r\n0x00,0x00,0x00,0x00,0x00,0x08,0x19,0x1c,0x0b,0x0b,0x11,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x11,0x11,0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x11,0x11,0x1e,0x1e,0x11,0x11,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x21,0x19,0x1c,0x11,0x13,0x13,0x16,\r\n0x0b,0x16,0x19,0x11,0x11,0x0b,0x0b,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x1e,0x0b,0x19,0x11,0x11,0x08,0x11,0x11,0x11,0x11,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x27,0x1c,\r\n0x27,0x1c,0x27,0x1c,0x2c,0x21,0x2c,0x21,0x1c,0x1c,0x1c,0x21,0x21,0x21,0x21,0x21,0x21,0x19,0x11,0x11,0x19,0x11,0x11,0x1e,0x11,0x24,0x21,0x1e,0x11,0x1c,0x11,0x1c,0x11,0x1c,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x16,0x16,0x16,0x16,0x16,0x0b,0x16,0x16,0x0b,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x11,0x13,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x0b,0x11,0x0b,0x0b,0x0b,0x0b,0x00,0x27,0x1c,0x2c,0x21,0x1e,0x11,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x11,0x11,0x0e,0x27,0x1c,0x21,0x21,0x1e,0x1e,0x1e,0x13,0x13,0x13,0x13,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x27,0x1c,0x13,0x16,0x13,0x13,\r\n0x13,0x16,0x13,0x13,0x27,0x27,0x1c,0x1c,0x0e,0x0e,0x13,0x13,0x13,0x13,0x0b,0x0b,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x19,0x1c,0x0b,0x0b,0x13,0x13,0x13,0x13,0x1e,0x0b,0x1e,0x0b,0x13,0x16,0x13,0x13,0x27,0x27,0x1c,0x1c,0x27,0x27,0x1c,0x1c,0x1c,0x1c,0x11,0x11,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,\r\n0x08,0x08,0x0b,0x08,0x00,0x00,0x00,0x1c,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x19,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x1c,0x13,0x1c,0x13,0x1c,0x13,0x1c,0x16,0x16,0x16,0x08,0x08,0x11,0x0e,0x13,0x15,0x13,0x12,0x12,0x13,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x11,0x0f,0x12,0x11,\r\n0x13,0x14,0x14,0x16,0x13,0x13,0x15,0x11,0x16,0x19,0x15,0x19,0x1b,0x15,0x19,0x17,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x0f,0x12,0x14,0x14,0x16,0x13,0x15,0x13,0x14,0x14,0x11,0x11,0x19,0x16,0x17,0x16,0x16,0x14,0x13,0x13,0x18,0x19,0x19,0x19,0x1e,0x1e,0x17,0x1e,0x1e,0x18,0x1d,0x1c,0x12,0x19,0x1c,0x19,0x14,\r\n0x1c,0x18,0x17,0x17,0x14,0x15,0x19,0x1a,0x17,0x14,0x17,0x13,0x12,0x1e,0x1e,0x1e,0x1b,0x1e,0x1e,0x17,0x1e,0x1e,0x17,0x19,0x1a,0x19,0x18,0x18,0x15,0x1d,0x19,0x1b,0x18,0x18,0x13,0x18,0x17,0x17,0x1c,0x19,0x18,0x1e,0x12,0x11,0x12,0x12,0x14,0x15,0x17,0x18,0x13,0x13,0x13,0x12,0x13,0x12,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x11,\r\n0x11,0x13,0x14,0x14,0x14,0x0f,0x13,0x13,0x13,0x14,0x19,0x1c,0x16,0x16,0x15,0x19,0x15,0x17,0x11,0x10,0x13,0x13,0x10,0x10,0x12,0x12,0x10,0x0f,0x15,0x0f,0x12,0x10,0x12,0x1a,0x13,0x1b,0x12,0x13,0x13,0x19,0x0a,0x1a,0x17,0x18,0x16,0x13,0x19,0x14,0x1a,0x14,0x14,0x14,0x14,0x14,0x14,0x13,0x14,0x14,0x14,0x09,0x09,0x09,0x09,0x09,\r\n0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0a,0x0a,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x15,0x09,0x09,0x09,0x0a,0x0a,0x09,0x09,0x09,0x0a,0x09,0x09,0x09,0x1e,0x1e,0x1e,0x1e,0x10,0x18,0x18,0x10,0x0d,0x10,0x11,0x12,0x10,0x1c,0x1b,0x1c,0x0f,0x21,0x10,0x1c,0x1c,0x1c,0x1b,0x13,0x10,0x10,0x1a,0x13,0x1a,0x16,0x12,0x0f,0x0d,\r\n0x22,0x0e,0x12,0x10,0x10,0x10,0x10,0x10,0x2d,0x1c,0x1c,0x0e,0x08,0x0f,0x08,0x0f,0x08,0x08,0x08,0x10,0x13,0x13,0x12,0x0c,0x0c,0x08,0x08,0x08,0x0c,0x08,0x0e,0x1c,0x07,0x1e,0x1e,0x1e,0x13,0x13,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x27,0x27,0x16,0x27,0x27,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x0f,0x13,0x0f,0x12,0x0e,0x0c,0x0b,0x17,0x12,0x18,0x0e,0x25,0x1d,0x14,0x12,0x1e,0x1a,0x1c,0x19,0x22,0x1b,0x1f,0x1a,0x15,0x10,0x18,0x13,0x1f,0x18,0x19,0x14,0x19,0x14,0x1c,0x16,0x1d,0x16,0x24,0x1c,0x19,0x13,\r\n0x19,0x13,0x28,0x1d,0x1a,0x00,0x21,0x21,0x21,0x10,0x00,0x00,0x13,0x11,0x17,0x12,0x12,0x0e,0x24,0x1e,0x1f,0x1c,0x18,0x13,0x17,0x13,0x11,0x0e,0x18,0x14,0x11,0x0e,0x1b,0x16,0x16,0x13,0x20,0x1b,0x12,0x13,0x18,0x18,0x1b,0x0f,0x07,0x0f,0x17,0x0e,0x21,0x21,0x08,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0d,\r\n0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x12,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1e,0x1e,0x1e,0x1e,\r\n0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,\r\n0x17,0x17,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x0e,0x10,0x16,0x18,0x09,0x07,0x09,0x07,0x17,0x13,0x19,0x15,0x12,0x10,0x12,0x10,0x14,0x13,0x0e,0x0e,0x25,0x1b,0x26,0x1d,0x21,0x1c,0x1e,0x16,0x1e,0x16,0x1e,0x16,0x14,0x0f,0x13,0x10,0x13,0x10,0x13,0x10,0x12,0x0a,0x10,0x08,0x19,0x13,0x1c,0x16,0x2c,0x21,0x12,0x13,0x17,0x17,0x1b,0x1c,0x19,0x13,0x20,\r\n0x1a,0x12,0x0d,0x12,0x10,0x15,0x10,0x1f,0x18,0x14,0x11,0x12,0x13,0x12,0x13,0x10,0x0d,0x10,0x0d,0x10,0x0c,0x11,0x11,0x0a,0x16,0x0b,0x20,0x16,0x0b,0x13,0x14,0x0f,0x19,0x12,0x0d,0x0b,0x13,0x13,0x13,0x10,0x08,0x19,0x14,0x0c,0x0b,0x15,0x0f,0x17,0x0d,0x1a,0x14,0x14,0x0f,0x17,0x13,0x13,0x10,0x19,0x13,0x14,0x0b,0x12,0x0e,0x19,\r\n0x0e,0x12,0x1c,0x10,0x12,0x1e,0x09,0x26,0x1d,0x1e,0x27,0x1d,0x1e,0x1e,0x1d,0x1d,0x1e,0x11,0x10,0x14,0x17,0x1e,0x17,0x1f,0x08,0x0f,0x13,0x1c,0x22,0x17,0x22,0x14,0x14,0x1a,0x17,0x26,0x1e,0x11,0x1e,0x0b,0x1e,0x0b,0x13,0x13,0x13,0x13,0x1c,0x1c,0x1c,0x1c,0x21,0x11,0x11,0x21,0x19,0x11,0x11,0x19,0x16,0x0b,0x0b,0x16,0x13,0x13,\r\n0x13,0x13,0x19,0x0b,0x0b,0x1c,0x19,0x0b,0x0b,0x1c,0x0e,0x0e,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x11,0x0d,0x13,0x11,0x19,0x13,0x13,0x1d,0x16,0x19,0x19,0x1b,0x1b,0x13,0x10,0x21,0x1b,0x22,0x1c,0x17,\r\n0x13,0x0a,0x0a,0x13,0x15,0x0d,0x14,0x11,0x13,0x10,0x18,0x1a,0x0d,0x13,0x0e,0x07,0x0c,0x12,0x12,0x07,0x07,0x06,0x07,0x0c,0x0c,0x0c,0x0f,0x31,0x42,0x0b,0x0e,0x04,0x09,0x0d,0x0e,0x0a,0x10,0x11,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x10,0x10,0x10,0x10,0x10,0x2c,0x12,0x19,0x1e,0x1e,0x15,0x0f,0x13,0x18,0x18,0x10,\r\n0x0a,0x16,0x11,0x16,0x12,0x16,0x12,0x12,0x19,0x14,0x13,0x11,0x19,0x14,0x1b,0x0f,0x11,0x15,0x0a,0x13,0x0b,0x0b,0x08,0x1d,0x13,0x13,0x11,0x11,0x13,0x1f,0x1f,0x1f,0x21,0x21,0x12,0x10,0x09,0x11,0x0f,0x14,0x0f,0x16,0x08,0x13,0x14,0x1c,0x1c,0x14,0x12,0x13,0x12,0x11,0x0f,0x11,0x0f,0x10,0x0a,0x0b,0x08,0x07,0x0c,0x13,0x15,0x0a,\r\n0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x0a,0x0a,0x0a,0x08,0x08,0x38,0x21,0x1d,0x23,0x0a,0x0a,0x0b,0x0d,0x08,0x09,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x00,0x1e,0x0b,0x0b,0x1e,0x09,0x11,0x11,0x2c,0x21,0x21,0x2c,0x1e,0x11,0x11,0x1e,0x11,0x11,0x0e,0x0e,0x00,0x00,0x0c,\r\n0x19,0x14,0x17,0x13,0x29,0x22,0x17,0x12,0x17,0x12,0x2c,0x21,0x19,0x13,0x0d,0x0a,0x14,0x00,0x17,0x12,0x0b,0x0a,0x05,0x10,0x0b,0x0b,0x08,0x07,0x0f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x07,0x11,0x0e,0x13,0x13,0x12,0x20,0x1b,0x1b,0x1a,0x1b,0x1f,0x15,0x17,0x14,0x0d,0x1f,0x25,0x0f,0x26,0x11,0x1c,0x1e,0x1e,0x1e,0x0e,0x19,\r\n0x21,0x19,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x13,0x13,0x13,0x1c,0x11,0x11,0x1e,0x0b,0x0b,0x1e,0x0b,0x0b,0x1e,0x10,0x10,0x00,0x0e,0x1c,0x0b,0x0b,0x21,0x11,0x11,0x19,0x11,0x11,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x32,0x32,0x1d,\r\n0x00,0x00,0x1d,0x1d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x16,0x14,0x15,0x15,0x1d,0x15,0x15,0x1a,0x20,0x15,0x15,0x23,0x15,0x15,0x1f,0x15,0x16,0x1a,0x15,0x19,0x1c,0x1e,0x15,0x19,0x15,0x17,0x15,0x17,0x15,0x16,0x17,0x15,0x1a,0x14,0x16,0x1a,0x14,0x15,0x13,0x1a,0x15,0x15,0x15,0x17,\r\n0x0f,0x11,0x15,0x1a,0x1a,0x12,0x00,0x00,0x25,0x4a,0x18,0x00,0x04,0x0a,0x0b,0x0f,0x16,0x14,0x1e,0x1e,0x09,0x0b,0x0b,0x0f,0x19,0x08,0x0f,0x08,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x08,0x08,0x19,0x19,0x19,0x11,0x23,0x18,0x15,0x17,0x1a,0x13,0x12,0x19,0x1a,0x0a,0x0d,0x15,0x11,0x21,0x1c,0x1c,0x15,0x1c,0x16,\r\n0x14,0x13,0x19,0x17,0x23,0x16,0x14,0x15,0x0b,0x0e,0x0b,0x19,0x0f,0x0a,0x13,0x16,0x11,0x16,0x13,0x0c,0x16,0x15,0x09,0x09,0x12,0x09,0x20,0x15,0x16,0x16,0x16,0x0d,0x10,0x0d,0x15,0x12,0x1b,0x11,0x12,0x11,0x0b,0x09,0x0b,0x19,0x18,0x18,0x17,0x13,0x1c,0x1c,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x11,0x13,0x13,0x13,0x13,0x09,0x09,\r\n0x09,0x09,0x15,0x16,0x16,0x16,0x16,0x16,0x15,0x15,0x15,0x15,0x0e,0x0e,0x14,0x14,0x11,0x0f,0x11,0x14,0x0f,0x21,0x21,0x1d,0x0a,0x0f,0x19,0x20,0x1c,0x1e,0x19,0x19,0x19,0x14,0x15,0x14,0x17,0x1c,0x14,0x0f,0x10,0x1c,0x1f,0x16,0x11,0x0a,0x0b,0x19,0x18,0x14,0x19,0x18,0x13,0x13,0x1b,0x18,0x18,0x1c,0x22,0x22,0x13,0x25,0x0e,0x0e,\r\n0x08,0x08,0x19,0x16,0x12,0x14,0x06,0x14,0x0c,0x0c,0x15,0x15,0x0e,0x08,0x08,0x0e,0x2d,0x18,0x13,0x18,0x13,0x13,0x0a,0x0a,0x0a,0x0a,0x1c,0x1c,0x1c,0x19,0x19,0x19,0x09,0x0e,0x0c,0x0b,0x0b,0x07,0x0a,0x08,0x0c,0x07,0x0e,0x11,0x0a,0x14,0x10,0x15,0x11,0x09,0x1a,0x15,0x14,0x12,0x15,0x16,0x19,0x19,0x0d,0x0e,0x0e,0x22,0x22,0x23,\r\n0x12,0x19,0x16,0x0a,0x14,0x10,0x17,0x11,0x17,0x11,0x16,0x0f,0x08,0x18,0x13,0x18,0x13,0x1a,0x19,0x1a,0x13,0x13,0x13,0x13,0x11,0x09,0x11,0x0b,0x11,0x0c,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x16,0x0d,0x16,0x0d,0x14,0x10,0x13,0x0d,0x13,0x10,0x19,0x15,0x19,0x15,0x15,0x11,0x15,0x11,0x11,0x1c,0x1c,0x17,0x16,0x10,0x15,0x12,0x1a,0x0f,\r\n0x12,0x0f,0x29,0x17,0x12,0x16,0x08,0x0e,0x1e,0x0c,0x16,0x0d,0x0d,0x16,0x0d,0x18,0x13,0x17,0x11,0x17,0x11,0x13,0x13,0x13,0x13,0x13,0x13,0x19,0x16,0x19,0x16,0x19,0x16,0x1a,0x15,0x1a,0x15,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0a,0x09,0x0d,0x09,0x15,0x12,0x12,0x11,0x09,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x1c,0x16,0x16,0x0d,0x14,0x10,\r\n0x13,0x0d,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x23,0x1b,0x14,0x12,0x09,0x18,0x13,0x20,0x1f,0x1c,0x16,0x08,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x14,0x12,0x08,0x0f,0x14,0x16,0x22,0x22,0x22,0x21,0x0e,0x0e,0x08,0x0a,0x0a,0x18,0x15,0x1d,0x0e,0x1e,0x19,0x1f,0x0a,0x18,0x15,0x13,0x15,0x1a,0x0a,0x15,0x17,0x21,0x1c,0x13,0x1c,0x1a,\r\n0x15,0x13,0x13,0x14,0x16,0x1d,0x1c,0x0a,0x14,0x17,0x10,0x15,0x0a,0x14,0x14,0x13,0x10,0x15,0x16,0x0a,0x13,0x12,0x15,0x13,0x10,0x16,0x16,0x11,0x14,0x14,0x1c,0x1e,0x0a,0x14,0x16,0x14,0x1e,0x13,0x1a,0x11,0x17,0x14,0x0a,0x24,0x24,0x1b,0x15,0x15,0x1a,0x18,0x15,0x15,0x11,0x1a,0x13,0x20,0x14,0x1c,0x1c,0x15,0x19,0x21,0x1a,0x1c,\r\n0x1a,0x15,0x17,0x13,0x15,0x1b,0x16,0x1b,0x18,0x23,0x24,0x1a,0x1d,0x15,0x17,0x26,0x16,0x13,0x15,0x14,0x0e,0x14,0x13,0x1c,0x11,0x16,0x16,0x12,0x14,0x1a,0x15,0x16,0x15,0x16,0x11,0x0f,0x12,0x19,0x11,0x16,0x15,0x1e,0x1f,0x16,0x1a,0x13,0x11,0x1e,0x13,0x13,0x15,0x0e,0x11,0x10,0x09,0x1d,0x1e,0x15,0x12,0x12,0x15,0x11,0x0e,0x25,\r\n0x2a,0x17,0x0d,0x0e,0x0e,0x0e,0x09,0x14,0x10,0x15,0x1c,0x16,0x1a,0x16,0x0b,0x0c,0x0a,0x0a,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x12,0x0b,0x12,0x0b,0x0b,0x0b,0x12,0x12,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,\r\n0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0a,0x09,0x0a,0x09,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x19,0x15,0x19,0x15,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x14,0x12,0x14,0x12,0x14,0x12,0x13,0x0d,0x13,0x13,0x1c,0x16,0x0a,\r\n0x0d,0x09,0x09,0x13,0x0f,0x22,0x1d,0x17,0x14,0x15,0x12,0x1b,0x16,0x14,0x12,0x14,0x12,0x17,0x12,0x18,0x15,0x18,0x15,0x1b,0x13,0x1c,0x16,0x0b,0x0b,0x0b,0x0b,0x0f,0x0f,0x12,0x12,0x12,0x12,0x0a,0x0a,0x0b,0x0b,0x0b,0x0b,0x13,0x13,0x18,0x13,0x15,0x16,0x15,0x16,0x15,0x16,0x17,0x11,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1a,\r\n0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x12,0x0c,0x19,0x16,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x1a,0x15,0x0a,0x09,0x0a,0x09,0x15,0x12,0x15,0x12,0x15,0x12,0x11,0x09,0x11,0x09,0x11,0x09,0x11,0x09,0x21,0x20,0x21,0x20,0x21,0x20,0x1c,0x15,0x1c,0x15,0x1c,0x15,0x1c,0x15,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,\r\n0x16,0x15,0x16,0x15,0x16,0x16,0x0d,0x16,0x0d,0x16,0x0d,0x16,0x0d,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x14,0x10,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x13,0x0d,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x17,0x12,0x17,0x12,0x23,0x1b,0x23,0x1b,0x16,0x11,0x16,0x11,0x14,0x12,0x15,0x11,0x15,0x11,0x15,0x11,0x15,0x0d,0x1b,\r\n0x12,0x13,0x09,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x10,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x1a,0x1a,0x1a,0x1a,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x22,0x22,0x22,0x22,0x22,0x22,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0e,0x0e,0x12,0x12,0x13,0x13,0x13,0x13,0x16,\r\n0x16,0x16,0x16,0x16,0x16,0x1e,0x1e,0x23,0x23,0x23,0x23,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x19,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x23,0x23,0x23,0x23,0x23,0x23,0x17,0x17,0x10,0x10,0x15,0x15,0x0a,0x0a,0x16,0x16,0x14,0x14,0x1e,0x1e,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x1b,\r\n0x1b,0x1b,0x1b,0x1b,0x1b,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x22,0x22,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x23,0x23,0x23,0x23,0x23,0x23,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x16,0x16,0x16,0x16,0x16,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x1a,\r\n0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0d,0x0e,0x16,0x16,0x16,0x14,0x14,0x14,0x14,0x16,0x16,0x14,0x14,0x14,0x14,0x19,0x19,0x17,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x1e,0x1f,0x1f,0x1f,0x1f,0x1c,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x17,0x15,0x16,0x15,0x16,\r\n0x17,0x17,0x11,0x1a,0x1b,0x15,0x16,0x16,0x13,0x14,0x12,0x1a,0x17,0x20,0x0b,0x0a,0x15,0x12,0x09,0x12,0x21,0x1c,0x15,0x1c,0x24,0x1d,0x16,0x16,0x15,0x14,0x10,0x13,0x0b,0x0d,0x13,0x0d,0x13,0x1c,0x1a,0x15,0x13,0x15,0x11,0x17,0x17,0x10,0x0f,0x14,0x14,0x0e,0x0f,0x14,0x09,0x0e,0x11,0x0b,0x2e,0x2a,0x26,0x20,0x1b,0x13,0x28,0x24,\r\n0x1e,0x18,0x13,0x0a,0x09,0x1c,0x16,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x19,0x15,0x13,0x18,0x13,0x18,0x13,0x20,0x1f,0x19,0x16,0x19,0x16,0x15,0x12,0x1c,0x16,0x1c,0x16,0x17,0x10,0x09,0x2e,0x2a,0x26,0x19,0x16,0x25,0x19,0x1c,0x15,0x18,0x13,0x18,0x13,0x13,0x13,0x13,0x13,0x0a,0x09,0x0a,0x09,0x1c,0x16,0x1c,0x16,0x15,0x0d,\r\n0x16,0x0d,0x19,0x15,0x19,0x15,0x13,0x10,0x1a,0x15,0x1b,0x16,0x15,0x15,0x11,0x18,0x13,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x14,0x12,0x16,0x13,0x15,0x15,0x16,0x13,0x16,0x16,0x16,0x11,0x11,0x16,0x16,0x13,0x17,0x0f,0x0f,0x13,0x14,0x0a,0x16,0x16,0x14,0x12,0x11,0x15,0x15,0x15,0x0a,0x0a,0x0c,0x0a,0x0e,0x09,0x16,0x20,0x20,\r\n0x20,0x15,0x15,0x16,0x16,0x1a,0x1b,0x18,0x0d,0x0d,0x0d,0x0d,0x0d,0x0c,0x0c,0x11,0x11,0x0f,0x09,0x0a,0x0b,0x0a,0x0d,0x0d,0x16,0x16,0x15,0x12,0x1b,0x12,0x0f,0x11,0x13,0x10,0x10,0x0e,0x0e,0x0e,0x11,0x17,0x12,0x14,0x14,0x15,0x09,0x12,0x0e,0x16,0x0e,0x0e,0x22,0x23,0x24,0x17,0x12,0x1b,0x1d,0x15,0x15,0x12,0x12,0x14,0x16,0x15,\r\n0x19,0x15,0x18,0x1e,0x15,0x1a,0x16,0x16,0x11,0x12,0x11,0x16,0x13,0x17,0x12,0x21,0x20,0x16,0x13,0x18,0x14,0x17,0x11,0x16,0x12,0x19,0x16,0x15,0x0f,0x15,0x16,0x11,0x09,0x1c,0x11,0x11,0x20,0x19,0x18,0x15,0x22,0x1a,0x19,0x12,0x20,0x1a,0x1b,0x15,0x22,0x1c,0x14,0x11,0x1d,0x1c,0x1c,0x16,0x1b,0x15,0x1b,0x15,0x31,0x29,0x1f,0x18,\r\n0x2a,0x21,0x20,0x19,0x16,0x10,0x13,0x0f,0x0f,0x00,0x00,0x24,0x23,0x15,0x13,0x15,0x16,0x15,0x13,0x14,0x11,0x15,0x12,0x1a,0x16,0x1f,0x19,0x25,0x1f,0x1b,0x15,0x17,0x11,0x13,0x0f,0x20,0x19,0x19,0x16,0x1f,0x17,0x1f,0x17,0x0a,0x20,0x1c,0x15,0x13,0x1a,0x15,0x18,0x15,0x18,0x13,0x18,0x13,0x20,0x1f,0x13,0x13,0x1b,0x13,0x1b,0x13,\r\n0x20,0x1c,0x14,0x11,0x13,0x10,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x1c,0x16,0x17,0x11,0x15,0x12,0x15,0x12,0x15,0x12,0x18,0x15,0x1d,0x1a,0x15,0x16,0x20,0x20,0x1e,0x1b,0x15,0x12,0x22,0x1d,0x25,0x1f,0x1a,0x14,0x19,0x16,0x16,0x15,0x15,0x13,0x16,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x16,\r\n0x0c,0x0c,0x06,0x08,0x08,0x08,0x0a,0x0f,0x0a,0x08,0x0e,0x08,0x08,0x08,0x0c,0x0c,0x08,0x08,0x16,0x16,0x16,0x16,0x0c,0x0a,0x0a,0x0c,0x0b,0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0b,0x0c,0x0c,0x0b,0x06,0x09,0x0a,0x08,0x0e,0x0e,0x0e,0x0e,0x0e,0x0c,0x0c,0x0c,0x0f,0x0c,0x09,0x0a,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,\r\n0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,\r\n0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,\r\n0x14,0x14,0x14,0x00,0x00,0x00,0x00,0x00,0x18,0x0b,0x17,0x0d,0x16,0x16,0x0c,0x0c,0x0c,0x0c,0x0c,0x0a,0x0c,0x0c,0x0c,0x0a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x16,0x11,0x18,0x1f,0x12,0x11,0x14,0x15,0x0f,0x0f,0x09,0x0b,0x12,0x0f,0x1a,0x16,0x16,0x12,0x17,0x17,0x17,\r\n0x22,0x14,0x16,0x16,0x11,0x11,0x11,0x0f,0x14,0x15,0x1b,0x15,0x12,0x1b,0x11,0x0f,0x0f,0x14,0x0e,0x11,0x15,0x11,0x16,0x15,0x0d,0x12,0x0d,0x0d,0x0f,0x0b,0x0b,0x0f,0x10,0x07,0x08,0x0d,0x0a,0x13,0x10,0x10,0x10,0x0e,0x0d,0x0d,0x0b,0x0f,0x13,0x0c,0x0c,0x0d,0x12,0x0d,0x0d,0x0c,0x0c,0x0a,0x0a,0x0d,0x06,0x0b,0x12,0x0c,0x0d,0x0a,\r\n0x0d,0x0d,0x0d,0x07,0x0c,0x0c,0x12,0x0a,0x0c,0x0c,0x0b,0x0d,0x0f,0x0b,0x06,0x08,0x0c,0x0a,0x0c,0x0b,0x0d,0x0f,0x0b,0x16,0x06,0x0d,0x14,0x20,0x17,0x14,0x14,0x20,0x18,0x20,0x1c,0x14,0x16,0x13,0x11,0x2a,0x11,0x16,0x21,0x23,0x23,0x17,0x18,0x17,0x11,0x11,0x13,0x10,0x11,0x13,0x07,0x00,0x00,0x00,0x00,0x16,0x17,0x17,0x17,0x11,\r\n0x0e,0x16,0x16,0x0c,0x20,0x15,0x16,0x0d,0x0c,0x11,0x0d,0x11,0x16,0x11,0x15,0x21,0x18,0x0c,0x0a,0x16,0x14,0x16,0x16,0x16,0x0c,0x16,0x12,0x09,0x20,0x15,0x16,0x0d,0x10,0x10,0x12,0x11,0x11,0x13,0x16,0x16,0x13,0x10,0x11,0x1b,0x09,0x11,0x09,0x15,0x10,0x0d,0x0a,0x0a,0x0d,0x0a,0x07,0x06,0x0d,0x0c,0x06,0x07,0x06,0x06,0x06,0x07,\r\n0x06,0x08,0x12,0x12,0x0c,0x0c,0x0d,0x0c,0x0e,0x09,0x06,0x07,0x0c,0x0d,0x0c,0x0c,0x0a,0x0a,0x0a,0x0b,0x0a,0x0d,0x00,0x00,0x00,0x00,0x08,0x0c,0x0c,0x0d,0x0a,0x0c,0x14,0x14,0x14,0x14,0x0c,0x00,0x00,0x00,0x00,0x11,0x0b,0x0a,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x14,0x14,0x14,0x14,\r\n0x14,0x14,0x14,0x14,0x0a,0x0a,0x0a,0x0a,0x14,0x14,0x14,0x14,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x06,0x0e,0x0e,0x0d,0x0e,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x0e,0x0d,0x0e,0x0e,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0b,0x1d,0x17,\r\n0x1a,0x15,0x1c,0x17,0x23,0x1c,0x14,0x0e,0x13,0x19,0x14,0x1e,0x1a,0x00,0x00,0x00,0x00,0x09,0x09,0x09,0x09,0x0c,0x0c,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x1f,0x1f,0x25,0x0f,0x09,0x13,0x16,0x0f,0x13,0x13,0x16,0x16,0x13,0x25,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x18,0x13,0x13,0x13,0x0c,0x16,0x0c,0x1c,0x19,0x13,0x0c,0x1f,\r\n0x13,0x1f,0x09,0x0c,0x16,0x16,0x18,0x18,0x18,0x16,0x16,0x16,0x1f,0x09,0x16,0x09,0x13,0x0f,0x09,0x09,0x13,0x09,0x1c,0x09,0x22,0x13,0x22,0x22,0x16,0x16,0x16,0x13,0x13,0x0f,0x0f,0x2b,0x2b,0x31,0x31,0x1f,0x1f,0x13,0x13,0x06,0x25,0x1c,0x1f,0x19,0x16,0x19,0x13,0x13,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x09,\r\n0x18,0x00,0x18,0x18,0x18,0x0c,0x13,0x13,0x22,0x0c,0x22,0x0c,0x16,0x19,0x16,0x0f,0x22,0x13,0x22,0x13,0x1c,0x1f,0x0c,0x13,0x13,0x0f,0x09,0x13,0x16,0x13,0x16,0x13,0x16,0x16,0x13,0x19,0x18,0x22,0x0c,0x13,0x0f,0x19,0x13,0x0c,0x13,0x13,0x13,0x22,0x0c,0x22,0x0c,0x09,0x16,0x0e,0x25,0x13,0x13,0x18,0x18,0x25,0x13,0x00,0x00,0x00,\r\n0x18,0x00,0x18,0x18,0x18,0x18,0x1c,0x18,0x00,0x00,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x13,0x13,0x1c,0x1f,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x19,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0f,0x0f,0x0f,0x13,\r\n0x0f,0x0f,0x0f,0x2b,0x1f,0x2b,0x1f,0x2b,0x1f,0x31,0x25,0x31,0x25,0x1f,0x13,0x16,0x16,0x16,0x25,0x25,0x13,0x13,0x25,0x13,0x13,0x25,0x13,0x13,0x25,0x13,0x13,0x1c,0x1c,0x28,0x25,0x22,0x13,0x1f,0x13,0x1f,0x13,0x1f,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,\r\n0x19,0x0c,0x19,0x0c,0x14,0x19,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1f,0x22,0x1c,0x1f,0x0c,0x13,0x1c,0x1f,0x1c,0x1f,0x00,0x00,0x00,0x00,0x00,0x2a,0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x0f,0x00,0x00,0x16,0x00,0x00,0x00,0x2b,0x1f,0x31,0x25,0x13,0x16,0x16,0x16,0x0f,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,\r\n0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x22,0x22,0x0e,0x16,0x16,0x16,0x2d,0x1f,0x14,0x38,0x28,0x0c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x13,0x13,0x0f,0x0f,0x1c,0x19,0x19,0x13,0x00,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x2e,0x38,0x00,0x00,0x00,0x00,0x00,0x16,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x0f,0x22,0x0c,\r\n0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x19,0x16,0x13,0x13,0x0f,0x2b,0x1f,0x13,0x16,0x16,0x16,0x13,0x16,0x16,0x16,0x13,0x16,0x16,0x16,0x25,0x13,0x13,0x25,0x13,0x13,0x22,0x13,0x13,0x22,0x13,0x13,0x22,0x13,0x13,0x16,0x16,0x16,0x16,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x19,0x0c,0x0c,0x0f,0x0f,\r\n0x2b,0x1f,0x18,0x16,0x16,0x00,0x13,0x13,0x13,0x0e,0x15,0x19,0x17,0x13,0x13,0x0d,0x09,0x1c,0x16,0x16,0x0d,0x14,0x12,0x12,0x11,0x12,0x09,0x13,0x0f,0x17,0x12,0x16,0x11,0x14,0x10,0x19,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x11,0x12,0x11,0x0b,0x13,0x15,0x16,0x13,0x0d,0x1b,0x16,0x18,0x14,0x17,0x12,0x15,0x13,\r\n0x0f,0x1a,0x0e,0x0f,0x10,0x12,0x16,0x16,0x13,0x25,0x13,0x25,0x0c,0x09,0x06,0x14,0x08,0x05,0x00,0x05,0x08,0x00,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x22,0x10,0x1c,0x16,0x23,0x1b,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x22,0x20,0x11,0x20,0x11,0x20,0x18,0x19,0x1a,0x1a,0x1c,\r\n0x20,0x25,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x19,0x19,0x19,0x19,0x1b,0x15,0x27,0x1f,0x11,0x11,0x0b,0x0b,0x0b,0x0e,0x08,0x15,0x09,0x09,0x1f,0x17,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x07,0x00,0x00,0x08,0x00,0x00,0x18,0x15,0x10,0x12,0x19,0x0a,0x0c,0x19,0x19,0x0a,0x15,0x14,0x14,0x1a,\r\n0x19,0x0a,0x0f,0x19,0x16,0x17,0x17,0x15,0x16,0x19,0x15,0x1d,0x1b,0x13,0x13,0x13,0x08,0x0e,0x15,0x15,0x14,0x14,0x14,0x16,0x18,0x12,0x19,0x14,0x14,0x1a,0x15,0x1b,0x14,0x1d,0x1d,0x1d,0x1d,0x18,0x18,0x18,0x15,0x10,0x12,0x19,0x0b,0x0d,0x19,0x0b,0x15,0x14,0x14,0x19,0x0f,0x19,0x17,0x17,0x16,0x19,0x15,0x1d,0x1b,0x0a,0x15,0x14,\r\n0x17,0x18,0x2c,0x00,0x18,0x14,0x18,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x0a,0x00,0x1c,0x18,0x19,0x1a,0x14,0x19,0x1c,0x1c,0x11,0x17,0x1c,0x1b,0x18,0x1c,0x1e,0x1d,0x19,0x14,0x15,0x1c,\r\n0x1a,0x15,0x19,0x19,0x18,0x19,0x19,0x1b,0x15,0x18,0x19,0x18,0x1d,0x17,0x17,0x18,0x19,0x1e,0x12,0x16,0x16,0x20,0x14,0x14,0x1d,0x21,0x17,0x14,0x27,0x15,0x15,0x1c,0x14,0x14,0x1c,0x15,0x1c,0x1e,0x20,0x14,0x1d,0x14,0x18,0x14,0x17,0x15,0x17,0x14,0x16,0x1c,0x14,0x17,0x19,0x14,0x14,0x16,0x23,0x14,0x14,0x16,0x16,0x10,0x0c,0x15,\r\n0x15,0x15,0x14,0x15,0x21,0x15,0x21,0x12,0x15,0x21,0x19,0x15,0x21,0x1c,0x1c,0x21,0x15,0x15,0x21,0x21,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x21,0x16,0x15,0x15,0x21,0x16,0x14,0x15,0x15,0x21,0x1d,0x19,0x1a,0x1a,0x19,0x1a,0x17,0x19,0x1d,0x1a,0x18,0x14,0x1d,0x19,0x19,0x15,0x19,0x1a,0x1c,0x1b,0x16,0x1a,0x19,0x1b,0x19,0x1d,0x1a,\r\n0x1b,0x1b,0x19,0x18,0x1a,0x19,0x1b,0x1d,0x18,0x1c,0x1b,0x04,0x04,0x06,0x07,0x06,0x0a,0x0d,0x20,0x15,0x17,0x16,0x15,0x17,0x15,0x15,0x18,0x16,0x15,0x0b,0x1f,0x16,0x15,0x15,0x14,0x16,0x13,0x15,0x0a,0x16,0x13,0x15,0x0f,0x20,0x14,0x15,0x15,0x16,0x1f,0x15,0x16,0x0f,0x1f,0x16,0x16,0x19,0x19,0x08,0x0a,0x2a,0x29,0x29,0x2a,0x35,\r\n0x14,0x14,0x09,0x14,0x0e,0x14,0x14,0x15,0x14,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x14,0x14,0x15,0x14,0x14,0x13,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x13,0x12,0x13,0x16,0x10,0x10,0x15,0x17,0x09,0x0c,0x12,\r\n0x0f,0x1c,0x18,0x17,0x12,0x17,0x12,0x10,0x10,0x16,0x13,0x1e,0x13,0x11,0x12,0x1a,0x1d,0x0f,0x17,0x12,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x10,0x10,0x10,0x10,0x09,0x09,0x09,0x09,0x18,0x17,0x17,0x17,0x17,0x17,0x16,0x16,0x16,0x16,0x11,0x13,0x13,0x13,0x13,0x13,0x15,0x16,0x16,0x10,0x10,0x10,0x10,0x10,0x15,0x15,0x13,\r\n0x17,0x17,0x09,0x09,0x09,0x09,0x09,0x15,0x0c,0x12,0x0f,0x0f,0x0f,0x0f,0x18,0x18,0x18,0x18,0x17,0x17,0x17,0x12,0x12,0x12,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x16,0x16,0x16,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x11,0x11,0x11,0x12,0x12,0x12,0x13,0x1a,0x17,0x13,0x12,0x0e,0x14,0x10,0x12,0x17,0x17,0x09,0x12,0x13,0x1c,0x18,\r\n0x11,0x17,0x17,0x12,0x11,0x10,0x11,0x17,0x13,0x18,0x17,0x13,0x10,0x17,0x09,0x17,0x11,0x17,0x09,0x11,0x10,0x15,0x0f,0x13,0x10,0x09,0x09,0x0c,0x1e,0x1e,0x17,0x12,0x12,0x17,0x13,0x12,0x12,0x0f,0x16,0x10,0x1b,0x10,0x18,0x18,0x12,0x15,0x1c,0x17,0x17,0x17,0x12,0x13,0x10,0x12,0x17,0x13,0x17,0x14,0x1e,0x1f,0x15,0x1a,0x12,0x13,\r\n0x20,0x12,0x0f,0x15,0x16,0x17,0x21,0x21,0x18,0x13,0x15,0x10,0x15,0x15,0x15,0x1a,0x13,0x13,0x19,0x15,0x15,0x0d,0x17,0x17,0x15,0x12,0x12,0x21,0x1c,0x11,0x14,0x16,0x16,0x17,0x17,0x1a,0x19,0x0d,0x23,0x16,0x14,0x15,0x18,0x18,0x13,0x13,0x0a,0x1c,0x19,0x19,0x11,0x1a,0x08,0x08,0x10,0x10,0x08,0x08,0x17,0x0f,0x0a,0x1c,0x1a,0x0b,\r\n0x08,0x08,0x11,0x0e,0x0e,0x08,0x08,0x08,0x0e,0x19,0x11,0x0b,0x16,0x19,0x16,0x15,0x12,0x1c,0x15,0x16,0x0d,0x10,0x14,0x10,0x08,0x08,0x0e,0x13,0x0d,0x19,0x19,0x19,0x22,0x1c,0x22,0x09,0x00,0x00,0x00,0x00,0x00,0x09,0x1c,0x1f,0x0c,0x0c,0x13,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x13,0x13,0x2b,0x1f,0x2b,0x1f,0x31,\r\n0x25,0x31,0x25,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x22,0x22,0x13,0x13,0x22,0x22,0x13,0x13,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x25,0x1c,0x1f,0x13,0x16,0x16,0x19,0x0c,0x19,0x1c,0x13,0x13,0x0c,0x0c,0x0c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0x22,0x0c,0x1c,0x13,0x13,0x09,0x13,0x13,\r\n0x13,0x13,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x2b,0x1f,0x2b,0x1f,0x2b,0x1f,0x31,0x25,0x31,0x25,0x1f,0x1f,0x1f,0x25,0x25,0x25,0x25,0x25,0x25,0x1c,0x13,0x13,0x1c,0x13,0x13,0x22,0x13,0x28,0x25,0x22,\r\n0x13,0x1f,0x13,0x1f,0x13,0x1f,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x22,0x13,0x19,0x19,0x19,0x19,0x19,0x0c,0x19,0x19,0x0c,0x0c,0x19,0x0c,0x19,0x0c,0x19,0x13,0x16,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x0c,0x0c,0x13,0x0c,0x0c,0x0c,0x0c,0x00,0x2b,0x1f,0x31,0x25,0x22,0x13,0x22,0x0c,0x22,0x0c,\r\n0x22,0x0c,0x22,0x0c,0x22,0x0c,0x22,0x0c,0x16,0x16,0x13,0x13,0x0f,0x2b,0x1f,0x25,0x25,0x22,0x22,0x22,0x16,0x16,0x16,0x16,0x19,0x0c,0x19,0x0c,0x19,0x0c,0x2b,0x1f,0x16,0x19,0x16,0x16,0x16,0x19,0x16,0x16,0x2b,0x2b,0x1f,0x1f,0x0f,0x0f,0x16,0x16,0x16,0x16,0x0c,0x0c,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,0x0c,0x0c,0x1c,0x1f,\r\n0x0c,0x0c,0x16,0x16,0x16,0x16,0x22,0x0c,0x22,0x0c,0x16,0x19,0x16,0x16,0x2b,0x2b,0x1f,0x1f,0x2b,0x2b,0x1f,0x1f,0x1f,0x1f,0x13,0x13,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x00,0x00,0x09,0x09,0x0c,0x09,0x00,0x00,0x00,0x1f,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,\r\n0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x09,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x19,0x19,0x19,0x19,0x19,0x19,0x16,\r\n0x1f,0x16,0x1f,0x16,0x1f,0x16,0x1f,0x19,0x19,0x19,0x09,0x09,0x13,0x0f,0x16,0x18,0x15,0x14,0x15,0x16,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x13,0x11,0x14,0x13,0x16,0x17,0x17,0x18,0x15,0x15,0x18,0x13,0x19,0x1c,0x18,0x1c,0x1f,0x18,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x14,0x11,\r\n0x14,0x16,0x16,0x18,0x15,0x18,0x15,0x16,0x16,0x13,0x13,0x1c,0x19,0x1a,0x19,0x19,0x16,0x16,0x15,0x1b,0x1d,0x1c,0x1c,0x22,0x22,0x1a,0x22,0x22,0x1b,0x20,0x1f,0x15,0x1c,0x1f,0x1c,0x16,0x1f,0x1b,0x1a,0x1a,0x16,0x18,0x1c,0x1d,0x1a,0x17,0x1a,0x16,0x14,0x22,0x22,0x22,0x1e,0x22,0x22,0x19,0x22,0x22,0x1a,0x1c,0x1d,0x1c,0x1b,0x1b,\r\n0x18,0x21,0x1c,0x1f,0x1a,0x1a,0x15,0x1b,0x1a,0x1a,0x20,0x1c,0x1b,0x21,0x14,0x13,0x15,0x14,0x17,0x17,0x1a,0x1b,0x15,0x15,0x15,0x14,0x15,0x14,0x14,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x14,0x16,0x17,0x16,0x16,0x11,0x15,0x15,0x16,0x16,0x1c,0x1f,0x18,0x18,0x17,0x1c,0x18,0x19,0x13,0x12,0x16,0x15,0x12,0x12,0x14,0x14,0x12,0x11,\r\n0x17,0x11,0x14,0x12,0x14,0x1d,0x15,0x1f,0x14,0x15,0x15,0x1c,0x0c,0x1d,0x19,0x1b,0x18,0x15,0x1c,0x16,0x1d,0x16,0x16,0x16,0x16,0x16,0x16,0x15,0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x10,0x11,0x11,0x11,0x11,0x11,0x0b,0x0b,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x0a,0x17,0x0a,0x0a,0x0a,0x0b,0x0b,0x0a,0x0a,0x0a,0x0b,\r\n0x0a,0x0a,0x0a,0x21,0x21,0x21,0x21,0x12,0x1b,0x1b,0x12,0x0f,0x12,0x13,0x15,0x12,0x1f,0x1e,0x20,0x10,0x25,0x12,0x1f,0x1f,0x1f,0x1e,0x15,0x12,0x12,0x1d,0x16,0x1d,0x19,0x14,0x11,0x0f,0x26,0x0f,0x14,0x12,0x12,0x12,0x12,0x12,0x32,0x1f,0x1f,0x10,0x09,0x11,0x09,0x11,0x09,0x09,0x09,0x12,0x16,0x16,0x14,0x0e,0x0e,0x08,0x08,0x08,\r\n0x0e,0x08,0x0f,0x20,0x08,0x21,0x21,0x21,0x16,0x16,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x2b,0x2b,0x19,0x2b,0x2b,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x11,0x16,0x11,0x14,0x10,\r\n0x0d,0x0d,0x19,0x14,0x1b,0x10,0x2a,0x21,0x16,0x14,0x22,0x1d,0x1f,0x1c,0x26,0x1e,0x22,0x1d,0x18,0x12,0x1b,0x16,0x22,0x1b,0x1c,0x17,0x1b,0x16,0x20,0x19,0x20,0x19,0x29,0x1f,0x1c,0x16,0x1c,0x16,0x2d,0x21,0x1d,0x00,0x24,0x24,0x24,0x12,0x00,0x00,0x16,0x13,0x1a,0x15,0x14,0x10,0x28,0x21,0x23,0x20,0x1b,0x15,0x1a,0x16,0x13,0x0f,\r\n0x1b,0x16,0x13,0x0f,0x1e,0x19,0x18,0x15,0x24,0x1e,0x14,0x15,0x1b,0x1b,0x1e,0x11,0x07,0x11,0x19,0x10,0x25,0x25,0x09,0x00,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x0f,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x14,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,\r\n0x1c,0x1c,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x21,0x21,\r\n0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,\r\n0x1c,0x1c,0x1c,0x1c,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x14,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x12,0x19,0x1b,0x0a,0x08,0x0a,0x08,0x1a,0x15,0x1b,0x17,0x14,0x11,0x14,0x12,0x16,0x15,0x10,0x10,0x2a,0x1e,0x2b,\r\n0x21,0x25,0x1f,0x21,0x18,0x21,0x18,0x21,0x18,0x17,0x11,0x15,0x12,0x15,0x12,0x15,0x12,0x14,0x0c,0x11,0x09,0x1c,0x16,0x20,0x19,0x31,0x25,0x15,0x16,0x19,0x1a,0x1e,0x20,0x1c,0x16,0x24,0x1d,0x14,0x0f,0x15,0x12,0x17,0x12,0x23,0x1b,0x17,0x13,0x15,0x16,0x15,0x16,0x12,0x0f,0x12,0x0e,0x11,0x0e,0x13,0x13,0x0b,0x19,0x0c,0x23,0x19,\r\n0x0d,0x16,0x17,0x11,0x1c,0x15,0x0e,0x0d,0x15,0x15,0x15,0x11,0x09,0x1c,0x16,0x0e,0x0d,0x17,0x11,0x1a,0x0e,0x1d,0x16,0x17,0x11,0x19,0x16,0x15,0x12,0x1c,0x15,0x16,0x0d,0x14,0x10,0x1c,0x10,0x14,0x20,0x12,0x15,0x21,0x0a,0x2a,0x21,0x21,0x2c,0x21,0x22,0x22,0x21,0x21,0x22,0x13,0x11,0x17,0x1a,0x21,0x1a,0x23,0x09,0x11,0x16,0x20,\r\n0x26,0x1a,0x26,0x17,0x17,0x1d,0x1a,0x2a,0x22,0x13,0x22,0x0c,0x22,0x0c,0x16,0x16,0x16,0x16,0x1f,0x1f,0x1f,0x1f,0x25,0x13,0x13,0x25,0x1c,0x13,0x13,0x1c,0x19,0x0c,0x0c,0x19,0x16,0x16,0x16,0x16,0x1c,0x0c,0x0c,0x1f,0x1c,0x0c,0x0c,0x1f,0x0f,0x0f,0x13,0x13,0x13,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x39,0x13,0x0f,0x15,0x14,0x1c,0x16,0x15,0x20,0x19,0x1c,0x1c,0x1f,0x1e,0x15,0x12,0x25,0x1e,0x27,0x20,0x19,0x16,0x0c,0x0c,0x16,0x18,0x0f,0x16,0x13,0x15,0x12,0x1b,0x1e,0x0f,0x16,0x10,0x08,0x0e,0x14,0x14,0x08,0x08,0x07,0x08,0x0e,0x0e,0x0e,0x11,0x37,\r\n0x4a,0x0d,0x0f,0x05,0x0a,0x0e,0x10,0x0c,0x12,0x14,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x31,0x14,0x1c,0x22,0x21,0x18,0x11,0x15,0x1b,0x1b,0x12,0x0c,0x18,0x13,0x19,0x15,0x18,0x14,0x14,0x1c,0x16,0x15,0x13,0x1c,0x17,0x1f,0x11,0x13,0x17,0x0c,0x16,0x0d,0x0d,0x09,0x20,0x16,0x15,0x13,0x13,\r\n0x16,0x22,0x22,0x23,0x25,0x25,0x14,0x12,0x0a,0x13,0x11,0x17,0x11,0x19,0x09,0x15,0x16,0x20,0x20,0x17,0x14,0x15,0x14,0x13,0x11,0x13,0x11,0x12,0x0b,0x0c,0x09,0x08,0x0d,0x15,0x17,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0c,0x0c,0x00,0x0b,0x0b,0x0b,0x09,0x09,0x3e,0x25,0x20,0x27,0x0b,0x0b,0x0c,\r\n0x0f,0x09,0x0a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x22,0x0c,0x0c,0x22,0x0a,0x13,0x13,0x31,0x25,0x25,0x31,0x22,0x13,0x13,0x22,0x13,0x13,0x0f,0x0f,0x00,0x00,0x0d,0x1c,0x16,0x1a,0x15,0x2e,0x26,0x1a,0x14,0x1a,0x14,0x31,0x25,0x1c,0x16,0x0e,0x0c,0x17,0x00,0x19,0x14,0x0c,0x0b,0x06,0x12,0x0c,0x0d,0x09,0x07,\r\n0x11,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x08,0x13,0x10,0x16,0x15,0x14,0x24,0x1e,0x1e,0x1d,0x1e,0x23,0x17,0x19,0x16,0x0f,0x22,0x2a,0x10,0x2b,0x13,0x1f,0x22,0x22,0x22,0x0f,0x1c,0x25,0x1c,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x16,0x16,0x16,0x1f,0x13,0x13,0x22,0x0c,0x0c,\r\n0x22,0x0c,0x0c,0x22,0x12,0x12,0x00,0x0f,0x1f,0x0c,0x0c,0x25,0x13,0x13,0x1c,0x13,0x13,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x38,0x38,0x21,0x00,0x00,0x21,0x21,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x19,0x17,0x18,0x18,0x21,0x18,0x17,0x1e,\r\n0x24,0x18,0x17,0x28,0x17,0x17,0x23,0x17,0x19,0x1d,0x18,0x1c,0x1f,0x22,0x18,0x1c,0x18,0x1a,0x17,0x1a,0x17,0x18,0x19,0x17,0x1d,0x16,0x19,0x1d,0x17,0x17,0x15,0x1d,0x18,0x18,0x18,0x1a,0x11,0x14,0x18,0x1d,0x1d,0x14,0x00,0x00,0x2a,0x54,0x1b,0x00,0x04,0x0c,0x0c,0x10,0x19,0x17,0x22,0x22,0x0a,0x0d,0x0d,0x12,0x1d,0x09,0x11,0x09,\r\n0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x09,0x09,0x1d,0x1d,0x1d,0x13,0x28,0x1b,0x18,0x1a,0x1d,0x15,0x15,0x1d,0x1e,0x0b,0x0f,0x18,0x14,0x26,0x1f,0x20,0x18,0x20,0x19,0x16,0x16,0x1d,0x1a,0x27,0x19,0x17,0x18,0x0d,0x10,0x0d,0x1d,0x11,0x0b,0x15,0x19,0x13,0x19,0x16,0x0d,0x19,0x18,0x0a,0x0a,0x15,0x0a,0x24,0x18,\r\n0x19,0x19,0x19,0x0f,0x12,0x0e,0x18,0x14,0x1e,0x13,0x14,0x13,0x0d,0x0a,0x0d,0x1d,0x1b,0x1b,0x1a,0x15,0x1f,0x20,0x1d,0x15,0x15,0x15,0x15,0x15,0x15,0x13,0x16,0x16,0x16,0x16,0x0a,0x0a,0x0a,0x0a,0x18,0x19,0x19,0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x10,0x10,0x17,0x17,0x13,0x11,0x13,0x17,0x11,0x25,0x25,0x20,0x0c,0x11,0x1d,0x24,\r\n0x20,0x22,0x1d,0x1d,0x1d,0x17,0x18,0x16,0x1a,0x20,0x17,0x10,0x12,0x20,0x23,0x19,0x13,0x0c,0x0c,0x1d,0x1b,0x17,0x1d,0x1b,0x15,0x15,0x1f,0x1b,0x1b,0x20,0x27,0x27,0x15,0x2a,0x10,0x10,0x0a,0x0a,0x1d,0x19,0x14,0x17,0x07,0x17,0x0d,0x0d,0x17,0x17,0x10,0x09,0x0a,0x10,0x33,0x1b,0x15,0x1b,0x15,0x15,0x0b,0x0b,0x0b,0x0b,0x20,0x20,\r\n0x20,0x1d,0x1d,0x1d,0x0a,0x10,0x0e,0x0d,0x0d,0x08,0x0c,0x09,0x0e,0x08,0x10,0x14,0x0c,0x16,0x12,0x18,0x13,0x0a,0x1d,0x17,0x17,0x14,0x18,0x19,0x1d,0x1d,0x0f,0x0f,0x0f,0x27,0x26,0x28,0x15,0x1d,0x19,0x0b,0x16,0x12,0x1a,0x13,0x1a,0x13,0x19,0x11,0x09,0x1b,0x15,0x1b,0x15,0x1d,0x1c,0x1d,0x15,0x16,0x15,0x16,0x14,0x0a,0x14,0x0d,\r\n0x14,0x0d,0x1f,0x18,0x1f,0x18,0x20,0x19,0x19,0x0f,0x19,0x0f,0x16,0x12,0x16,0x0e,0x16,0x12,0x1d,0x18,0x1d,0x18,0x18,0x13,0x18,0x13,0x14,0x20,0x20,0x1a,0x19,0x12,0x18,0x14,0x1d,0x11,0x14,0x10,0x2f,0x1a,0x15,0x19,0x0a,0x10,0x22,0x0e,0x19,0x0f,0x0f,0x19,0x0f,0x1b,0x15,0x1a,0x13,0x1a,0x13,0x15,0x16,0x15,0x16,0x15,0x16,0x1d,\r\n0x19,0x1d,0x19,0x1d,0x19,0x1e,0x18,0x1e,0x18,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0b,0x0a,0x0f,0x0a,0x18,0x15,0x15,0x14,0x0a,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x19,0x0f,0x16,0x12,0x16,0x0e,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x27,0x1e,0x17,0x14,0x0a,0x1b,0x15,0x24,0x23,0x20,0x19,0x09,0x27,0x1e,0x27,0x1e,0x27,0x1e,\r\n0x17,0x14,0x0a,0x11,0x17,0x19,0x27,0x27,0x27,0x25,0x10,0x10,0x09,0x0b,0x0b,0x1b,0x18,0x21,0x10,0x22,0x1c,0x23,0x0b,0x1b,0x18,0x15,0x18,0x1e,0x0b,0x18,0x1a,0x26,0x1f,0x15,0x20,0x1e,0x18,0x16,0x16,0x17,0x19,0x21,0x20,0x0b,0x17,0x1a,0x12,0x18,0x0b,0x17,0x17,0x16,0x13,0x18,0x19,0x0b,0x16,0x15,0x18,0x16,0x13,0x19,0x19,0x13,\r\n0x17,0x17,0x20,0x22,0x0b,0x17,0x19,0x17,0x22,0x15,0x1d,0x14,0x1a,0x16,0x0b,0x29,0x29,0x1e,0x18,0x18,0x1e,0x1b,0x18,0x18,0x14,0x1d,0x15,0x24,0x17,0x1f,0x1f,0x18,0x1c,0x26,0x1e,0x20,0x1e,0x18,0x1a,0x16,0x18,0x1f,0x19,0x1f,0x1c,0x28,0x29,0x1e,0x21,0x18,0x1a,0x2b,0x19,0x15,0x18,0x16,0x10,0x17,0x16,0x1f,0x13,0x18,0x18,0x15,\r\n0x16,0x1d,0x18,0x19,0x18,0x19,0x13,0x11,0x14,0x1d,0x13,0x19,0x18,0x22,0x23,0x19,0x1e,0x15,0x13,0x22,0x15,0x16,0x18,0x10,0x13,0x12,0x0a,0x21,0x22,0x18,0x15,0x14,0x18,0x14,0x10,0x2a,0x2f,0x1a,0x0f,0x0f,0x0f,0x0f,0x0a,0x16,0x12,0x17,0x20,0x19,0x1e,0x19,0x0d,0x0e,0x0b,0x0b,0x14,0x14,0x14,0x14,0x0d,0x0d,0x0d,0x14,0x0d,0x14,\r\n0x0d,0x0d,0x0d,0x14,0x14,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0a,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,\r\n0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x1d,0x18,0x1d,0x18,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x1e,0x19,0x17,0x14,0x17,0x14,0x17,0x14,0x16,0x0e,0x15,0x16,0x1f,0x18,0x0b,0x0f,0x0a,0x0a,0x16,0x11,0x26,0x21,0x1a,0x16,0x18,0x15,0x1f,0x19,0x17,0x14,0x17,0x14,0x1a,0x15,0x1c,0x18,0x1c,0x18,0x1e,0x16,0x20,0x19,0x0d,\r\n0x0d,0x0d,0x0d,0x11,0x11,0x14,0x14,0x14,0x14,0x0b,0x0b,0x0d,0x0d,0x0d,0x0d,0x15,0x16,0x1b,0x15,0x18,0x19,0x18,0x19,0x18,0x19,0x1a,0x13,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x16,0x15,0x0d,0x1d,0x19,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x1e,0x18,0x0b,0x0a,0x0b,\r\n0x0a,0x18,0x15,0x18,0x15,0x18,0x15,0x14,0x0a,0x14,0x0a,0x14,0x0a,0x14,0x0a,0x26,0x24,0x26,0x24,0x26,0x24,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x18,0x19,0x18,0x19,0x19,0x0f,0x19,0x0f,0x19,0x0f,0x19,0x0f,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x12,0x16,0x0e,0x16,0x0e,0x16,\r\n0x0e,0x16,0x0e,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1a,0x14,0x1a,0x14,0x27,0x1e,0x27,0x1e,0x19,0x13,0x19,0x13,0x17,0x14,0x18,0x13,0x18,0x13,0x18,0x13,0x18,0x0e,0x1e,0x14,0x15,0x0a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x12,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x1e,\r\n0x1e,0x1e,0x1e,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x10,0x10,0x15,0x15,0x16,0x16,0x16,0x16,0x19,0x19,0x19,0x19,0x19,0x19,0x22,0x22,0x28,0x28,0x28,0x28,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1c,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,\r\n0x22,0x22,0x22,0x23,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x1a,0x1a,0x12,0x12,0x18,0x18,0x0b,0x0b,0x19,0x19,0x17,0x17,0x22,0x22,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x21,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x22,0x22,0x22,0x22,0x22,0x22,0x22,\r\n0x22,0x23,0x23,0x28,0x28,0x28,0x28,0x28,0x28,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x19,0x19,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x21,0x21,0x1e,0x19,0x19,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0f,0x10,0x19,0x19,0x19,0x17,0x17,0x17,0x17,0x19,0x19,0x17,0x17,0x17,0x17,0x1c,0x1c,\r\n0x1a,0x19,0x19,0x19,0x22,0x22,0x22,0x22,0x22,0x23,0x23,0x23,0x23,0x20,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x1a,0x18,0x19,0x18,0x19,0x1a,0x1a,0x14,0x1d,0x1f,0x18,0x19,0x19,0x15,0x17,0x15,0x1d,0x1a,0x25,0x0c,0x0c,0x18,0x15,0x0a,0x15,0x25,0x1f,0x18,0x20,0x29,0x21,0x19,0x19,\r\n0x18,0x16,0x12,0x16,0x0c,0x0e,0x16,0x0e,0x16,0x20,0x1e,0x18,0x16,0x18,0x13,0x1a,0x1a,0x13,0x11,0x17,0x17,0x10,0x11,0x17,0x0a,0x10,0x13,0x0c,0x34,0x30,0x2b,0x24,0x1e,0x15,0x2d,0x29,0x22,0x1b,0x15,0x0b,0x0a,0x20,0x19,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x1d,0x18,0x16,0x1b,0x15,0x1b,0x15,0x24,0x23,0x1d,0x19,0x1d,0x19,\r\n0x18,0x15,0x20,0x19,0x20,0x19,0x1a,0x13,0x0a,0x34,0x30,0x2b,0x1d,0x19,0x2a,0x1d,0x1f,0x18,0x1b,0x15,0x1b,0x15,0x15,0x16,0x15,0x16,0x0b,0x0a,0x0b,0x0a,0x20,0x19,0x20,0x19,0x18,0x0f,0x19,0x0f,0x1d,0x18,0x1d,0x18,0x15,0x12,0x1e,0x18,0x1f,0x19,0x18,0x18,0x13,0x1b,0x15,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x17,0x14,0x19,\r\n0x15,0x18,0x18,0x19,0x15,0x19,0x19,0x19,0x14,0x14,0x19,0x19,0x16,0x1a,0x11,0x11,0x15,0x17,0x0c,0x19,0x19,0x16,0x14,0x13,0x18,0x18,0x18,0x0b,0x0c,0x0d,0x0c,0x10,0x0a,0x19,0x24,0x24,0x24,0x17,0x17,0x19,0x19,0x1d,0x1e,0x1b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0e,0x13,0x13,0x11,0x0a,0x0b,0x0c,0x0c,0x0e,0x0e,0x19,0x19,0x17,0x14,\r\n0x1e,0x14,0x12,0x13,0x16,0x13,0x13,0x0f,0x0f,0x0f,0x14,0x1a,0x14,0x17,0x16,0x18,0x0a,0x15,0x10,0x19,0x0f,0x0f,0x26,0x28,0x29,0x1a,0x14,0x1e,0x21,0x18,0x18,0x15,0x15,0x17,0x19,0x18,0x1c,0x18,0x1b,0x22,0x18,0x1d,0x19,0x18,0x13,0x15,0x13,0x19,0x15,0x1a,0x15,0x25,0x24,0x19,0x15,0x1b,0x16,0x1a,0x13,0x19,0x14,0x1c,0x19,0x18,\r\n0x11,0x18,0x18,0x13,0x0a,0x20,0x14,0x14,0x24,0x1c,0x1b,0x18,0x26,0x1e,0x1c,0x15,0x25,0x1d,0x1f,0x18,0x27,0x1f,0x17,0x13,0x21,0x20,0x20,0x19,0x1e,0x18,0x1e,0x18,0x37,0x2f,0x23,0x1b,0x2f,0x26,0x24,0x1c,0x19,0x12,0x15,0x11,0x11,0x00,0x00,0x29,0x28,0x18,0x15,0x18,0x19,0x18,0x15,0x17,0x13,0x18,0x15,0x1e,0x18,0x23,0x1c,0x2a,\r\n0x23,0x1e,0x17,0x1a,0x13,0x16,0x11,0x25,0x1d,0x1d,0x19,0x23,0x1b,0x23,0x1b,0x0b,0x24,0x1f,0x18,0x15,0x1e,0x18,0x1c,0x18,0x1b,0x15,0x1b,0x15,0x24,0x23,0x15,0x16,0x1e,0x16,0x1e,0x16,0x24,0x1f,0x17,0x13,0x16,0x13,0x1f,0x18,0x1f,0x18,0x20,0x19,0x20,0x19,0x1a,0x13,0x18,0x14,0x18,0x14,0x18,0x14,0x1c,0x18,0x21,0x1e,0x18,0x19,\r\n0x24,0x24,0x22,0x1e,0x17,0x14,0x26,0x21,0x2a,0x24,0x1e,0x16,0x1c,0x19,0x19,0x18,0x18,0x15,0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x0a,0x19,0x0e,0x0e,0x07,0x09,0x09,0x09,0x0c,0x11,0x0c,0x0a,0x10,0x09,0x09,0x09,0x0e,0x0e,0x09,0x09,0x19,0x19,0x19,0x19,0x0e,0x0c,0x0b,0x0e,0x0d,0x0b,\r\n0x0c,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x0e,0x0d,0x0e,0x0e,0x0c,0x07,0x0a,0x0c,0x09,0x10,0x10,0x10,0x10,0x10,0x0e,0x0e,0x0e,0x11,0x0e,0x0a,0x0b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,\r\n0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,\r\n0x10,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x17,0x17,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1b,0x0e,0x19,0x19,0x0e,0x0e,0x0e,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x0c,0x0e,0x0e,0x0e,0x0e,\r\n0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x19,0x14,0x1c,0x23,0x14,0x13,0x17,0x17,0x12,0x11,0x0a,0x0d,0x15,0x10,0x1d,0x18,0x19,0x14,0x1a,0x1a,0x1a,0x27,0x17,0x19,0x19,0x13,0x13,0x13,0x11,0x16,0x18,0x1e,0x18,0x14,0x1e,0x13,0x12,0x11,0x16,0x10,0x14,0x18,0x13,0x19,0x18,0x0f,0x14,0x0f,0x0f,\r\n0x11,0x0d,0x0d,0x11,0x12,0x08,0x0a,0x0f,0x0c,0x16,0x12,0x12,0x12,0x10,0x0e,0x0e,0x0c,0x11,0x16,0x0d,0x0d,0x0f,0x14,0x0f,0x0f,0x0d,0x0d,0x0b,0x0b,0x0f,0x07,0x0d,0x15,0x0e,0x0e,0x0b,0x0e,0x0e,0x0e,0x08,0x0e,0x0e,0x15,0x0c,0x0d,0x0e,0x0c,0x0e,0x11,0x0d,0x07,0x09,0x0e,0x0c,0x0e,0x0c,0x0f,0x11,0x0d,0x18,0x07,0x0f,0x17,0x25,\r\n0x1a,0x17,0x17,0x24,0x1b,0x24,0x1f,0x16,0x19,0x15,0x13,0x2f,0x13,0x19,0x25,0x27,0x27,0x1a,0x1b,0x1a,0x13,0x14,0x16,0x12,0x13,0x15,0x08,0x00,0x00,0x00,0x00,0x19,0x1a,0x1a,0x1a,0x14,0x10,0x19,0x19,0x0d,0x24,0x18,0x19,0x0f,0x0e,0x13,0x0e,0x13,0x19,0x13,0x18,0x26,0x1b,0x0d,0x0b,0x19,0x16,0x19,0x19,0x19,0x0d,0x19,0x15,0x0a,\r\n0x24,0x18,0x19,0x0f,0x12,0x12,0x14,0x13,0x13,0x15,0x19,0x19,0x16,0x12,0x13,0x1f,0x0a,0x14,0x0a,0x18,0x13,0x0f,0x0b,0x0b,0x0e,0x0b,0x08,0x07,0x0f,0x0e,0x07,0x08,0x07,0x07,0x07,0x08,0x07,0x09,0x15,0x15,0x0e,0x0e,0x0f,0x0e,0x0f,0x0a,0x07,0x08,0x0e,0x0e,0x0e,0x0e,0x0c,0x0b,0x0b,0x0c,0x0b,0x0e,0x00,0x00,0x00,0x00,0x09,0x0d,\r\n0x0d,0x0e,0x0b,0x0d,0x17,0x17,0x17,0x17,0x0e,0x00,0x00,0x00,0x00,0x13,0x0d,0x0b,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0b,0x0b,0x0b,0x0b,0x17,0x17,0x17,0x17,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,\r\n0x0f,0x0d,0x0d,0x07,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0d,0x0d,0x21,0x1b,0x1e,0x18,0x1f,0x1a,0x27,0x20,0x17,0x10,0x16,0x1d,0x16,0x22,0x1d,0x00,0x00,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x0e,0x0e,0x0e,0x19,0x19,0x19,0x19,\r\n0x19,0x19,0x23,0x23,0x2a,0x12,0x0b,0x15,0x19,0x12,0x15,0x15,0x19,0x19,0x15,0x2a,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x1b,0x15,0x15,0x15,0x0e,0x19,0x0e,0x20,0x1c,0x15,0x0e,0x23,0x15,0x23,0x0b,0x0e,0x19,0x19,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x23,0x0b,0x19,0x0b,0x15,0x12,0x0b,0x0b,0x15,0x0b,0x20,0x0b,0x27,0x15,0x27,0x27,\r\n0x19,0x19,0x19,0x15,0x15,0x12,0x12,0x31,0x31,0x38,0x38,0x23,0x23,0x15,0x15,0x07,0x2a,0x20,0x23,0x1c,0x19,0x1c,0x15,0x15,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x0b,0x1b,0x00,0x1b,0x1b,0x1b,0x0e,0x15,0x15,0x27,0x0e,0x27,0x0e,0x19,0x1c,0x19,0x12,0x27,0x15,0x27,0x15,0x20,0x23,0x0e,0x15,0x15,0x12,0x0b,0x15,\r\n0x19,0x15,0x19,0x15,0x19,0x19,0x15,0x1c,0x1b,0x27,0x0e,0x15,0x12,0x1c,0x15,0x0e,0x15,0x15,0x15,0x27,0x0e,0x27,0x0e,0x0b,0x19,0x10,0x2a,0x15,0x15,0x1b,0x1b,0x2a,0x15,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1b,0x1b,0x1b,0x20,0x1b,0x00,0x00,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x15,0x15,0x20,0x23,0x27,0x0e,0x27,0x0e,0x27,0x0e,\r\n0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x12,0x12,0x12,0x15,0x12,0x12,0x12,0x31,0x23,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x15,0x19,0x19,0x19,0x2a,0x2a,0x15,0x15,0x2a,0x15,0x15,0x2a,0x15,0x15,\r\n0x2a,0x15,0x15,0x20,0x20,0x2e,0x2a,0x27,0x15,0x23,0x15,0x23,0x15,0x23,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x1c,0x0e,0x1c,0x0e,0x17,0x1c,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x23,0x27,0x20,0x23,0x0e,0x15,0x20,0x23,0x20,0x23,0x00,0x00,0x00,\r\n0x00,0x00,0x2f,0x2e,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x12,0x00,0x00,0x19,0x00,0x00,0x00,0x31,0x23,0x38,0x2a,0x15,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x27,0x27,0x10,0x19,0x19,0x19,0x34,0x23,0x16,0x40,0x2e,0x0e,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x15,0x15,0x12,0x12,0x20,0x1c,0x1c,0x15,0x00,0x00,0x00,0x0e,0x0e,0x0e,0x0e,0x35,0x3f,0x00,0x00,0x00,0x00,0x00,0x19,0x15,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x12,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x1c,0x19,0x15,0x15,0x12,0x31,0x23,0x15,0x19,0x19,0x19,0x15,0x19,0x19,\r\n0x19,0x15,0x19,0x19,0x19,0x2a,0x15,0x15,0x2a,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,0x27,0x15,0x15,0x19,0x19,0x19,0x19,0x1c,0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x1c,0x0e,0x0e,0x12,0x12,0x31,0x23,0x1b,0x19,0x19,0x00,0x15,0x15,0x15,0x10,0x18,0x1d,0x1a,0x15,0x16,0x0f,0x0a,0x20,0x19,0x19,0x0f,0x17,0x14,0x14,0x13,0x14,0x0a,0x16,\r\n0x11,0x1a,0x14,0x19,0x13,0x17,0x12,0x1c,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x13,0x14,0x14,0x0c,0x16,0x18,0x19,0x15,0x0e,0x1f,0x19,0x1b,0x17,0x1a,0x15,0x18,0x16,0x11,0x1d,0x10,0x11,0x12,0x14,0x19,0x19,0x15,0x2a,0x15,0x2a,0x0e,0x0b,0x07,0x17,0x09,0x05,0x00,0x06,0x09,0x00,0x12,0x12,0x12,0x12,0x12,0x12,\r\n0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x15,0x15,0x27,0x12,0x20,0x19,0x27,0x1e,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x27,0x24,0x14,0x24,0x14,0x24,0x1b,0x1d,0x1d,0x1d,0x20,0x24,0x2a,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1d,0x1f,0x18,0x2d,0x23,0x14,0x14,0x0c,0x0c,0x0c,0x10,0x09,0x18,0x0a,0x0a,0x23,\r\n0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x00,0x08,0x00,0x00,0x09,0x00,0x00,0x1b,0x18,0x12,0x14,0x1c,0x0b,0x0e,0x1c,0x1d,0x0b,0x17,0x17,0x17,0x1d,0x1c,0x0b,0x11,0x1c,0x19,0x1a,0x1b,0x18,0x19,0x1c,0x17,0x21,0x1f,0x16,0x16,0x16,0x0a,0x10,0x17,0x17,0x17,0x17,0x17,0x19,0x1b,0x14,0x1c,0x17,\r\n0x17,0x1d,0x17,0x1f,0x17,0x21,0x21,0x21,0x21,0x1b,0x1b,0x1b,0x18,0x12,0x14,0x1c,0x0d,0x0f,0x1d,0x0d,0x17,0x17,0x17,0x1c,0x11,0x1c,0x1a,0x1b,0x19,0x1c,0x17,0x21,0x1f,0x0b,0x18,0x17,0x1b,0x1b,0x32,0x00,0x1b,0x17,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x0b,0x00,0x20,0x1b,0x1c,0x1e,0x17,0x1c,0x1f,0x20,0x14,0x1a,0x1f,0x1f,0x1c,0x20,0x22,0x21,0x1c,0x17,0x18,0x20,0x1e,0x18,0x1d,0x1c,0x1c,0x1c,0x1d,0x1f,0x18,0x1b,0x1c,0x1b,0x21,0x1b,0x1a,0x1b,0x1c,0x22,0x15,0x19,0x19,0x25,0x17,0x17,0x20,0x25,0x1a,0x17,\r\n0x2c,0x18,0x18,0x20,0x17,0x17,0x20,0x18,0x20,0x22,0x25,0x17,0x20,0x17,0x1b,0x17,0x1a,0x18,0x1b,0x17,0x19,0x20,0x17,0x1a,0x1c,0x17,0x17,0x19,0x28,0x17,0x17,0x19,0x19,0x12,0x0e,0x17,0x17,0x17,0x16,0x17,0x25,0x17,0x25,0x15,0x17,0x25,0x1c,0x17,0x25,0x1f,0x1f,0x25,0x18,0x17,0x25,0x25,0x17,0x17,0x17,0x17,0x17,0x17,0x25,0x25,\r\n0x19,0x17,0x18,0x25,0x19,0x17,0x17,0x17,0x25,0x21,0x1d,0x1d,0x1d,0x1d,0x1e,0x1a,0x1d,0x21,0x1d,0x1b,0x17,0x21,0x1c,0x1d,0x18,0x1c,0x1d,0x1f,0x1e,0x19,0x1d,0x1c,0x1f,0x1c,0x21,0x1d,0x1e,0x1f,0x1d,0x1b,0x1d,0x1d,0x1e,0x21,0x1c,0x20,0x1e,0x04,0x05,0x06,0x08,0x06,0x0b,0x0f,0x24,0x18,0x1a,0x19,0x18,0x1a,0x18,0x18,0x1b,0x19,\r\n0x18,0x0d,0x23,0x19,0x18,0x18,0x17,0x19,0x16,0x18,0x0b,0x19,0x16,0x18,0x11,0x24,0x17,0x18,0x18,0x19,0x23,0x18,0x19,0x11,0x23,0x19,0x19,0x1d,0x1d,0x09,0x0c,0x30,0x2f,0x2f,0x30,0x3c,0x17,0x17,0x0a,0x17,0x10,0x17,0x17,0x18,0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x10,0x17,0x17,0x18,\r\n0x17,0x17,0x16,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x15,0x15,0x15,0x19,0x12,0x12,0x18,0x1a,0x0b,0x0d,0x15,0x11,0x20,0x1b,0x1a,0x14,0x1a,0x15,0x12,0x12,0x19,0x15,0x22,0x15,0x14,0x14,0x1e,0x21,0x11,0x1a,0x14,0x19,0x16,0x15,0x15,0x15,0x15,0x15,0x15,\r\n0x15,0x12,0x12,0x12,0x12,0x0b,0x0b,0x0b,0x0b,0x1b,0x1a,0x1a,0x1a,0x1a,0x1a,0x19,0x19,0x19,0x19,0x14,0x15,0x15,0x15,0x15,0x15,0x18,0x19,0x19,0x12,0x12,0x12,0x12,0x12,0x18,0x18,0x15,0x1a,0x1a,0x0b,0x0b,0x0b,0x0b,0x0b,0x18,0x0d,0x15,0x11,0x11,0x11,0x11,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x15,0x15,0x15,0x12,0x12,0x12,0x12,\r\n0x12,0x12,0x12,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x22,0x22,0x22,0x22,0x14,0x14,0x14,0x14,0x14,0x14,0x15,0x1e,0x1a,0x15,0x15,0x10,0x17,0x12,0x14,0x1a,0x1a,0x0b,0x15,0x15,0x20,0x1b,0x13,0x1a,0x1a,0x14,0x13,0x12,0x14,0x1a,0x15,0x1c,0x1b,0x15,0x12,0x1a,0x0b,0x1a,0x14,0x1b,0x0b,0x14,0x12,0x18,0x11,0x16,0x12,0x0b,0x0b,0x0d,\r\n0x22,0x23,0x1a,0x15,0x15,0x1a,0x15,0x14,0x15,0x11,0x19,0x12,0x1f,0x13,0x1b,0x1b,0x15,0x18,0x20,0x1a,0x1a,0x1a,0x14,0x15,0x12,0x15,0x1a,0x15,0x1b,0x17,0x22,0x23,0x18,0x1e,0x15,0x16,0x24,0x15,0x11,0x18,0x18,0x1a,0x25,0x25,0x1c,0x15,0x18,0x12,0x18,0x18,0x18,0x1d,0x16,0x16,0x1d,0x18,0x18,0x0f,0x1a,0x1a,0x18,0x15,0x15,0x26,\r\n0x1f,0x14,0x16,0x19,0x19,0x1a,0x1a,0x1e,0x1d,0x0f,0x27,0x19,0x17,0x18,0x1b,0x1b,0x15,0x15,0x0b,0x20,0x1d,0x1d,0x14,0x1d,0x09,0x09,0x12,0x12,0x09,0x09,0x1a,0x11,0x0b,0x20,0x1e,0x0c,0x09,0x09,0x13,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x1c,0x14,0x0d,0x19,0x1d,0x19,0x18,0x15,0x1f,0x18,0x19,0x0f,0x12,0x16,0x12,0x09,0x0a,0x10,0x16,\r\n0x0e,0x1c,0x1c,0x1c,0x27,0x20,0x27,0x0b,0x00,0x00,0x00,0x00,0x00,0x0b,0x20,0x23,0x0e,0x0e,0x15,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x15,0x15,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x23,0x23,0x23,0x23,0x23,0x27,0x27,0x15,0x15,0x27,0x27,0x15,0x15,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,\r\n0x0e,0x2a,0x20,0x23,0x15,0x19,0x19,0x1c,0x0e,0x1c,0x20,0x15,0x15,0x0e,0x0e,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x27,0x0e,0x20,0x15,0x15,0x0b,0x15,0x15,0x15,0x15,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,\r\n0x15,0x15,0x15,0x15,0x15,0x15,0x31,0x23,0x31,0x23,0x31,0x23,0x38,0x2a,0x38,0x2a,0x23,0x23,0x23,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x20,0x15,0x15,0x20,0x15,0x15,0x27,0x15,0x2e,0x2a,0x27,0x15,0x23,0x15,0x23,0x15,0x23,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x27,0x15,0x1c,0x1c,0x1c,0x1c,0x1c,0x0e,0x1c,0x1c,0x0e,\r\n0x0e,0x1c,0x0e,0x1c,0x0e,0x1c,0x15,0x19,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x0e,0x0e,0x15,0x0e,0x0e,0x0e,0x0e,0x00,0x31,0x23,0x38,0x2a,0x27,0x15,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x27,0x0e,0x19,0x19,0x15,0x15,0x12,0x31,0x23,0x2a,0x2a,0x27,0x27,0x27,0x19,0x19,0x19,0x19,0x1c,0x0e,0x1c,0x0e,\r\n0x1c,0x0e,0x31,0x23,0x19,0x1c,0x19,0x19,0x19,0x1c,0x19,0x19,0x31,0x31,0x23,0x23,0x12,0x12,0x19,0x19,0x19,0x19,0x0e,0x0e,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x20,0x23,0x0e,0x0e,0x19,0x19,0x19,0x19,0x27,0x0e,0x27,0x0e,0x19,0x1c,0x19,0x19,0x31,0x31,0x23,0x23,0x31,0x31,0x23,0x23,0x23,0x23,0x15,0x15,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x00,0x00,0x0b,0x0b,0x0e,0x0b,0x00,0x00,0x00,0x23,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x12,0x12,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x27,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,\r\n0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x20,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x19,0x23,0x19,0x23,0x19,0x23,0x19,0x23,0x1c,0x1c,0x1c,0x0b,0x0b,0x15,0x12,0x18,0x1b,0x18,0x17,0x17,0x19,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,\r\n0x17,0x17,0x17,0x17,0x16,0x13,0x17,0x16,0x19,0x1a,0x1a,0x1c,0x18,0x18,0x1b,0x16,0x1c,0x20,0x1b,0x1f,0x23,0x1b,0x20,0x1d,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x16,0x13,0x17,0x19,0x19,0x1c,0x18,0x1b,0x18,0x19,0x19,0x15,0x15,0x20,0x1d,0x1d,0x1c,0x1d,0x19,0x18,0x18,0x1f,0x20,0x20,0x20,0x27,0x27,0x1d,0x27,0x27,\r\n0x1f,0x25,0x24,0x17,0x20,0x24,0x20,0x19,0x24,0x1f,0x1d,0x1d,0x19,0x1b,0x1f,0x21,0x1d,0x1a,0x1e,0x18,0x16,0x27,0x27,0x27,0x23,0x27,0x27,0x1d,0x27,0x27,0x1e,0x20,0x21,0x1f,0x1e,0x1e,0x1b,0x25,0x20,0x23,0x1e,0x1e,0x18,0x1f,0x1d,0x1d,0x24,0x20,0x1e,0x26,0x17,0x15,0x17,0x17,0x1a,0x1a,0x1d,0x1f,0x18,0x18,0x18,0x17,0x18,0x17,\r\n0x17,0x18,0x18,0x18,0x18,0x18,0x18,0x15,0x16,0x19,0x1a,0x19,0x19,0x13,0x18,0x18,0x19,0x19,0x20,0x23,0x1b,0x1b,0x1a,0x20,0x1b,0x1d,0x16,0x14,0x19,0x18,0x14,0x15,0x17,0x17,0x14,0x14,0x1a,0x13,0x17,0x15,0x17,0x21,0x18,0x23,0x17,0x18,0x18,0x1f,0x0d,0x21,0x1d,0x1e,0x1c,0x18,0x20,0x19,0x21,0x19,0x19,0x19,0x19,0x19,0x19,0x18,\r\n0x19,0x19,0x19,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x13,0x13,0x13,0x13,0x14,0x13,0x0d,0x0d,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x0b,0x1a,0x0b,0x0b,0x0b,0x0d,0x0d,0x0b,0x0b,0x0b,0x0c,0x0b,0x0b,0x0b,0x26,0x26,0x26,0x26,0x15,0x1f,0x1e,0x15,0x11,0x15,0x16,0x17,0x15,0x23,0x23,0x24,0x13,0x2a,0x15,0x23,0x23,0x23,0x22,0x18,0x15,\r\n0x15,0x21,0x19,0x21,0x1c,0x16,0x13,0x11,0x2b,0x11,0x16,0x15,0x15,0x15,0x15,0x15,0x39,0x23,0x23,0x12,0x0b,0x13,0x0a,0x13,0x0a,0x0a,0x0a,0x14,0x19,0x19,0x17,0x10,0x10,0x0a,0x0a,0x0a,0x10,0x0a,0x11,0x24,0x09,0x26,0x26,0x26,0x19,0x19,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x31,0x31,0x1c,0x31,0x31,0x1c,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x14,0x18,0x14,0x16,0x12,0x0f,0x0f,0x1d,0x17,0x1e,0x12,0x2f,0x26,0x19,0x17,0x27,0x21,0x23,0x1f,0x2b,0x22,0x27,0x20,0x1b,0x14,0x1f,0x19,0x27,0x1f,0x20,0x1a,0x1f,0x19,\r\n0x24,0x1c,0x25,0x1c,0x2e,0x23,0x20,0x19,0x20,0x19,0x33,0x25,0x21,0x00,0x29,0x29,0x29,0x14,0x00,0x00,0x18,0x15,0x1d,0x17,0x16,0x12,0x2d,0x26,0x28,0x24,0x1e,0x18,0x1d,0x19,0x16,0x11,0x1f,0x19,0x16,0x11,0x22,0x1c,0x1c,0x18,0x29,0x22,0x17,0x18,0x1f,0x1f,0x22,0x13,0x08,0x13,0x1d,0x12,0x2a,0x2a,0x0a,0x00,0x29,0x29,0x29,0x29,\r\n0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x11,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x17,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,\r\n0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,\r\n0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x20,0x20,0x20,\r\n0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x14,0x1c,0x1f,0x0c,0x09,0x0c,0x09,0x1e,0x18,0x1f,0x1a,0x17,0x14,0x16,0x14,0x19,0x18,0x12,0x12,0x2f,0x22,0x30,0x25,0x29,0x24,0x26,0x1c,0x26,0x1c,0x26,0x1c,0x1a,0x13,0x18,0x15,0x18,0x15,0x18,0x15,0x17,0x0d,0x14,0x0a,0x20,0x19,0x24,0x1c,0x38,0x2a,0x18,\r\n0x19,0x1d,0x1e,0x22,0x24,0x20,0x19,0x29,0x21,0x17,0x11,0x17,0x15,0x1a,0x14,0x27,0x1e,0x1a,0x16,0x18,0x19,0x18,0x19,0x14,0x11,0x14,0x10,0x14,0x0f,0x16,0x16,0x0d,0x1c,0x0e,0x28,0x1c,0x0f,0x18,0x1a,0x13,0x20,0x17,0x10,0x0f,0x18,0x18,0x18,0x14,0x0a,0x20,0x19,0x10,0x0f,0x1a,0x13,0x1e,0x10,0x21,0x19,0x1a,0x13,0x1d,0x19,0x18,\r\n0x15,0x1f,0x18,0x19,0x0f,0x16,0x12,0x20,0x12,0x16,0x24,0x15,0x18,0x26,0x0b,0x30,0x26,0x26,0x32,0x25,0x26,0x26,0x25,0x25,0x27,0x16,0x14,0x1a,0x1d,0x26,0x1d,0x28,0x0a,0x13,0x19,0x24,0x2b,0x1d,0x2b,0x1a,0x1a,0x21,0x1d,0x30,0x27,0x16,0x27,0x0e,0x27,0x0e,0x19,0x19,0x19,0x19,0x23,0x23,0x23,0x23,0x2a,0x15,0x15,0x2a,0x20,0x15,\r\n0x15,0x20,0x1c,0x0e,0x0e,0x1c,0x19,0x19,0x19,0x19,0x20,0x0e,0x0e,0x23,0x20,0x0e,0x0e,0x23,0x12,0x12,0x15,0x15,0x16,0x16,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x16,0x11,0x18,0x16,0x1f,0x18,0x18,0x25,0x1c,0x1f,0x20,0x23,\r\n0x22,0x18,0x15,0x2a,0x22,0x2c,0x24,0x1d,0x19,0x0d,0x0d,0x19,0x1b,0x11,0x19,0x16,0x18,0x14,0x1f,0x22,0x11,0x19,0x12,0x09,0x10,0x16,0x17,0x09,0x09,0x08,0x09,0x10,0x10,0x10,0x13,0x3f,0x54,0x0e,0x11,0x06,0x0b,0x10,0x12,0x0d,0x15,0x16,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x14,0x14,0x14,0x14,0x14,0x38,0x17,0x20,\r\n0x27,0x26,0x1b,0x13,0x18,0x1e,0x1f,0x15,0x0d,0x1c,0x16,0x1d,0x17,0x1c,0x16,0x17,0x1f,0x19,0x18,0x16,0x1f,0x1a,0x23,0x13,0x16,0x1b,0x0d,0x19,0x0e,0x0f,0x0a,0x25,0x18,0x18,0x16,0x16,0x19,0x27,0x27,0x28,0x2a,0x2a,0x17,0x15,0x0c,0x15,0x13,0x1a,0x13,0x1c,0x0a,0x18,0x19,0x24,0x24,0x1a,0x17,0x18,0x17,0x16,0x13,0x16,0x13,0x14,\r\n0x0d,0x0e,0x0a,0x09,0x0f,0x18,0x1b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0d,0x0d,0x00,0x0c,0x0c,0x0c,0x0b,0x0b,0x47,0x2a,0x25,0x2c,0x0c,0x0c,0x0e,0x11,0x0b,0x0b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x27,0x0e,0x0e,0x27,0x0b,0x15,0x15,0x38,0x2a,0x2a,0x38,0x27,0x15,0x15,\r\n0x27,0x15,0x15,0x12,0x12,0x00,0x00,0x0f,0x1f,0x19,0x1e,0x18,0x35,0x2b,0x1d,0x17,0x1d,0x17,0x38,0x2a,0x20,0x19,0x10,0x0d,0x1a,0x00,0x1d,0x17,0x0e,0x0d,0x07,0x15,0x0e,0x0e,0x0b,0x08,0x13,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x09,0x16,0x12,0x19,0x18,0x17,0x28,0x22,0x22,0x21,0x22,0x28,0x1a,0x1d,0x19,0x11,0x27,0x2f,0x12,\r\n0x31,0x15,0x23,0x27,0x27,0x27,0x12,0x20,0x2a,0x20,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x00,0x19,0x19,0x19,0x23,0x15,0x15,0x27,0x0e,0x0e,0x27,0x0e,0x0e,0x27,0x15,0x15,0x00,0x12,0x23,0x0e,0x0e,0x2a,0x15,0x15,0x20,0x15,0x15,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x0c,0x3f,0x3f,0x25,0x00,0x00,0x25,0x25,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x1c,0x1a,0x1b,0x1b,0x25,0x1b,0x1a,0x22,0x29,0x1b,0x1a,0x2d,0x1b,0x1b,0x27,0x1a,0x1c,0x21,0x1b,0x20,0x24,0x26,0x1b,0x20,0x1b,0x1d,0x1a,0x1d,0x1a,0x1c,0x1d,0x1a,0x21,0x19,0x1c,0x21,\r\n0x1a,0x1a,0x18,0x21,0x1b,0x1b,0x1b,0x1d,0x13,0x16,0x1b,0x21,0x21,0x17,0x00,0x00,0x2e,0x5c,0x1e,0x00,0x04,0x0d,0x0d,0x12,0x1b,0x19,0x26,0x25,0x0b,0x0e,0x0e,0x13,0x1f,0x0a,0x12,0x0a,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0a,0x0a,0x1f,0x1f,0x1f,0x15,0x2c,0x1e,0x1a,0x1c,0x20,0x17,0x16,0x20,0x21,0x0c,0x10,\r\n0x1b,0x16,0x29,0x22,0x23,0x1a,0x23,0x1c,0x18,0x18,0x20,0x1d,0x2b,0x1b,0x19,0x1a,0x0e,0x11,0x0e,0x1f,0x13,0x0c,0x17,0x1b,0x15,0x1b,0x18,0x0e,0x1b,0x1a,0x0b,0x0b,0x17,0x0b,0x28,0x1a,0x1b,0x1b,0x1b,0x10,0x14,0x10,0x1a,0x16,0x21,0x15,0x16,0x15,0x0e,0x0b,0x0e,0x1f,0x1e,0x1e,0x1c,0x17,0x22,0x23,0x20,0x17,0x17,0x17,0x17,0x17,\r\n0x17,0x15,0x18,0x18,0x18,0x18,0x0b,0x0b,0x0b,0x0b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,0x1a,0x1a,0x11,0x11,0x19,0x19,0x15,0x13,0x15,0x19,0x12,0x29,0x29,0x24,0x0d,0x13,0x20,0x28,0x23,0x26,0x1f,0x20,0x20,0x19,0x1b,0x19,0x1c,0x23,0x19,0x12,0x14,0x23,0x26,0x1b,0x15,0x0d,0x0d,0x1f,0x1e,0x19,0x20,0x1e,0x17,0x17,0x22,0x1e,\r\n0x1e,0x23,0x2b,0x2b,0x17,0x2e,0x11,0x11,0x0b,0x0b,0x1f,0x1b,0x16,0x19,0x08,0x19,0x0f,0x0f,0x1a,0x1a,0x11,0x0a,0x0b,0x11,0x38,0x1e,0x17,0x1e,0x17,0x17,0x0c,0x0c,0x0c,0x0c,0x23,0x23,0x23,0x20,0x20,0x20,0x0b,0x11,0x10,0x0e,0x0e,0x09,0x0d,0x09,0x0f,0x09,0x11,0x16,0x0d,0x18,0x14,0x1a,0x15,0x0b,0x20,0x1a,0x19,0x16,0x1a,0x1b,\r\n0x1f,0x1f,0x10,0x11,0x11,0x2b,0x2a,0x2c,0x16,0x20,0x1b,0x0c,0x18,0x14,0x1c,0x15,0x1c,0x15,0x1b,0x13,0x0a,0x1e,0x17,0x1e,0x17,0x20,0x1f,0x20,0x17,0x18,0x17,0x18,0x16,0x0b,0x16,0x0e,0x16,0x0e,0x22,0x1a,0x22,0x1a,0x23,0x1b,0x1c,0x10,0x1c,0x10,0x18,0x14,0x18,0x10,0x18,0x14,0x20,0x1a,0x20,0x1a,0x1a,0x15,0x1a,0x15,0x16,0x23,\r\n0x23,0x1c,0x1b,0x14,0x1a,0x16,0x20,0x13,0x16,0x12,0x33,0x1d,0x17,0x1c,0x0b,0x11,0x25,0x0f,0x1c,0x10,0x10,0x1c,0x10,0x1e,0x17,0x1c,0x15,0x1c,0x15,0x17,0x18,0x17,0x18,0x17,0x18,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x21,0x1a,0x21,0x1a,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x0c,0x0b,0x10,0x0b,0x1b,0x17,0x17,0x16,0x0b,0x22,0x1a,0x22,0x1a,\r\n0x23,0x1b,0x23,0x1b,0x1c,0x10,0x18,0x14,0x18,0x10,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x2b,0x21,0x19,0x16,0x0b,0x1e,0x17,0x28,0x26,0x23,0x1b,0x0a,0x2b,0x21,0x2b,0x21,0x2b,0x21,0x19,0x16,0x0b,0x13,0x19,0x1c,0x2a,0x2a,0x2b,0x29,0x12,0x12,0x0a,0x0d,0x0d,0x1e,0x1a,0x24,0x11,0x25,0x1f,0x26,0x0c,0x1e,0x1a,0x17,0x1a,0x21,\r\n0x0c,0x1b,0x1d,0x29,0x22,0x17,0x23,0x21,0x1a,0x18,0x18,0x19,0x1b,0x24,0x23,0x0c,0x19,0x1c,0x14,0x1a,0x0c,0x19,0x19,0x18,0x14,0x1a,0x1b,0x0c,0x18,0x17,0x1b,0x18,0x14,0x1b,0x1b,0x15,0x19,0x19,0x23,0x25,0x0c,0x19,0x1b,0x19,0x25,0x17,0x20,0x16,0x1c,0x18,0x0c,0x2d,0x2d,0x21,0x1b,0x1a,0x21,0x1e,0x1a,0x1a,0x16,0x20,0x17,0x28,\r\n0x19,0x22,0x22,0x1b,0x1f,0x29,0x21,0x23,0x21,0x1a,0x1c,0x18,0x1a,0x21,0x1b,0x22,0x1e,0x2c,0x2d,0x20,0x24,0x1b,0x1c,0x2f,0x1b,0x17,0x1b,0x18,0x12,0x19,0x18,0x22,0x15,0x1b,0x1b,0x17,0x18,0x20,0x1b,0x1b,0x1b,0x1b,0x15,0x13,0x16,0x20,0x15,0x1c,0x1a,0x25,0x26,0x1b,0x21,0x17,0x15,0x25,0x17,0x18,0x1b,0x12,0x15,0x14,0x0b,0x24,\r\n0x25,0x1a,0x17,0x16,0x1b,0x16,0x12,0x2e,0x34,0x1d,0x10,0x11,0x11,0x11,0x0b,0x18,0x14,0x1a,0x23,0x1b,0x21,0x1b,0x0e,0x0f,0x0c,0x0c,0x16,0x16,0x16,0x16,0x0e,0x0e,0x0e,0x16,0x0e,0x16,0x0e,0x0e,0x0e,0x16,0x16,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,0x17,0x1e,\r\n0x17,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x0c,0x0b,0x0c,0x0b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x20,0x1a,0x20,0x1a,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x21,0x1b,0x19,0x16,0x19,0x16,0x19,\r\n0x16,0x18,0x10,0x17,0x18,0x22,0x1b,0x0c,0x10,0x0b,0x0b,0x18,0x13,0x2a,0x24,0x1c,0x18,0x1b,0x17,0x22,0x1c,0x19,0x16,0x19,0x16,0x1d,0x17,0x1e,0x1a,0x1e,0x1a,0x21,0x18,0x23,0x1b,0x0e,0x0e,0x0e,0x0e,0x13,0x13,0x16,0x16,0x16,0x16,0x0c,0x0c,0x0e,0x0e,0x0e,0x0e,0x17,0x18,0x1e,0x17,0x1a,0x1b,0x1a,0x1b,0x1a,0x1b,0x1c,0x15,0x20,\r\n0x1b,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x20,0x1b,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x17,0x18,0x16,0x0e,0x20,0x1b,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x21,0x1a,0x0c,0x0b,0x0c,0x0b,0x1b,0x17,0x1b,0x17,0x1b,0x17,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x16,0x0b,0x29,0x28,0x29,0x28,0x29,0x28,0x22,0x1a,0x22,0x1a,0x22,0x1a,0x22,\r\n0x1a,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x1a,0x1b,0x1a,0x1b,0x1c,0x10,0x1c,0x10,0x1c,0x10,0x1c,0x10,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x14,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x10,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x1d,0x16,0x1d,0x16,0x2b,0x21,0x2b,0x21,0x1b,0x15,0x1b,0x15,0x19,0x16,0x1a,\r\n0x15,0x1a,0x15,0x1a,0x15,0x1a,0x10,0x21,0x16,0x17,0x0b,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x22,0x22,0x22,0x22,0x22,0x22,0x14,0x14,0x14,0x14,0x14,0x14,0x1a,0x1a,0x21,0x21,0x21,0x21,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,\r\n0x11,0x17,0x17,0x18,0x18,0x18,0x18,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x2c,0x2c,0x2c,0x2c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1f,0x26,0x26,0x26,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x1c,0x1c,0x14,0x14,0x1a,0x1a,0x0c,0x0c,0x1b,0x1b,0x19,0x19,0x25,0x25,0x1c,0x1c,0x1c,\r\n0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x22,0x22,0x22,0x22,0x22,0x22,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1e,0x1e,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x1a,\r\n0x1a,0x1a,0x1a,0x1a,0x1a,0x24,0x24,0x21,0x1b,0x1b,0x1b,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x11,0x11,0x1b,0x1b,0x1b,0x19,0x19,0x19,0x19,0x1b,0x1b,0x19,0x19,0x19,0x19,0x1f,0x1f,0x1d,0x1b,0x1b,0x1b,0x25,0x25,0x25,0x25,0x25,0x26,0x26,0x27,0x26,0x23,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x1b,0x1c,0x1a,0x1b,0x1b,0x1b,0x1d,0x1d,0x15,0x20,0x22,0x1a,0x1b,0x1b,0x17,0x19,0x16,0x20,0x1d,0x28,0x0d,0x0d,0x1b,0x17,0x0b,0x17,0x29,0x22,0x1a,0x23,0x2d,0x24,0x1c,0x1b,0x1b,0x18,0x14,0x18,0x0e,0x10,0x18,0x10,0x18,0x23,0x21,0x1a,0x18,0x1a,0x15,0x1c,0x1c,0x14,0x13,0x19,0x19,0x11,0x12,0x19,0x0b,0x12,0x15,0x0d,\r\n0x39,0x34,0x2f,0x27,0x21,0x17,0x31,0x2d,0x25,0x1e,0x17,0x0c,0x0b,0x23,0x1b,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x20,0x1a,0x18,0x1e,0x17,0x1e,0x17,0x28,0x26,0x20,0x1b,0x20,0x1b,0x1b,0x17,0x23,0x1b,0x23,0x1b,0x1c,0x14,0x0b,0x39,0x34,0x2f,0x20,0x1b,0x2e,0x20,0x22,0x1a,0x1e,0x17,0x1e,0x17,0x17,0x18,0x17,0x18,0x0c,0x0b,\r\n0x0c,0x0b,0x23,0x1b,0x23,0x1b,0x1a,0x10,0x1c,0x10,0x20,0x1a,0x20,0x1a,0x17,0x14,0x21,0x1a,0x22,0x1b,0x1a,0x1a,0x15,0x1e,0x17,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x23,0x1b,0x19,0x16,0x1b,0x17,0x1a,0x1a,0x1b,0x17,0x1b,0x1b,0x1b,0x15,0x15,0x1b,0x1b,0x18,0x1c,0x13,0x13,0x17,0x19,0x0d,0x1b,0x1b,0x18,0x16,0x15,0x1a,0x1a,0x1a,0x0c,\r\n0x0d,0x0f,0x0d,0x11,0x0b,0x1c,0x28,0x28,0x28,0x1a,0x1a,0x1b,0x1b,0x20,0x21,0x1d,0x10,0x10,0x10,0x10,0x10,0x0f,0x0f,0x15,0x15,0x12,0x0b,0x0c,0x0d,0x0d,0x10,0x10,0x1c,0x1b,0x1a,0x16,0x21,0x16,0x13,0x15,0x18,0x14,0x14,0x11,0x11,0x11,0x15,0x1c,0x16,0x19,0x18,0x1a,0x0b,0x17,0x12,0x1b,0x11,0x11,0x2a,0x2c,0x2d,0x1c,0x16,0x21,\r\n0x24,0x1b,0x1a,0x17,0x17,0x19,0x1b,0x1a,0x1f,0x1a,0x1d,0x25,0x1a,0x20,0x1b,0x1b,0x15,0x17,0x15,0x1b,0x17,0x1c,0x17,0x29,0x28,0x1c,0x17,0x1d,0x19,0x1c,0x15,0x1b,0x16,0x1e,0x1b,0x1a,0x13,0x1a,0x1b,0x15,0x0b,0x23,0x15,0x15,0x28,0x1f,0x1e,0x1b,0x2a,0x21,0x1f,0x17,0x28,0x20,0x21,0x1a,0x2b,0x22,0x19,0x15,0x24,0x23,0x23,0x1b,\r\n0x21,0x1b,0x21,0x1b,0x3c,0x33,0x26,0x1e,0x34,0x29,0x28,0x1f,0x1b,0x14,0x17,0x12,0x13,0x00,0x00,0x2d,0x2c,0x1b,0x17,0x1a,0x1b,0x1a,0x17,0x19,0x15,0x1b,0x17,0x21,0x1b,0x27,0x1f,0x2f,0x26,0x21,0x1a,0x1c,0x15,0x18,0x13,0x28,0x1f,0x20,0x1b,0x26,0x1d,0x26,0x1d,0x0c,0x28,0x22,0x1b,0x17,0x21,0x1b,0x1e,0x1a,0x1e,0x17,0x1e,0x17,\r\n0x28,0x26,0x17,0x18,0x21,0x18,0x21,0x18,0x28,0x22,0x19,0x15,0x18,0x14,0x22,0x1b,0x22,0x1b,0x23,0x1b,0x23,0x1b,0x1c,0x15,0x1a,0x16,0x1a,0x16,0x1a,0x16,0x1e,0x1a,0x24,0x21,0x1a,0x1b,0x27,0x28,0x25,0x21,0x1a,0x16,0x2a,0x25,0x2e,0x27,0x21,0x18,0x1f,0x1c,0x1b,0x1a,0x1a,0x17,0x1b,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x1b,0x0f,0x0f,0x08,0x0a,0x0a,0x0a,0x0d,0x12,0x0d,0x0b,0x11,0x0a,0x0a,0x0a,0x0f,0x0f,0x0a,0x0a,0x1b,0x1b,0x1b,0x1b,0x0f,0x0d,0x0c,0x0f,0x0e,0x0c,0x0d,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0e,0x0f,0x0f,0x0d,0x07,0x0b,0x0d,0x0a,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x0f,0x13,0x0f,0x0b,0x0c,\r\n0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,\r\n0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x19,\r\n0x12,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x19,0x19,0x00,0x00,0x00,0x00,0x00,0x1e,0x0e,0x1d,0x10,0x1b,0x1b,0x0f,0x0f,0x0f,0x0f,0x0f,0x0c,0x0f,0x0f,0x10,0x0d,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x1b,0x16,0x1e,0x26,0x16,0x15,0x19,0x1a,0x13,0x13,0x0b,0x0e,0x17,\r\n0x12,0x20,0x1b,0x1b,0x16,0x1c,0x1c,0x1c,0x2b,0x19,0x1b,0x1b,0x15,0x15,0x15,0x13,0x19,0x1a,0x21,0x1a,0x16,0x21,0x15,0x13,0x13,0x18,0x12,0x16,0x1b,0x15,0x1b,0x1a,0x11,0x16,0x10,0x10,0x13,0x0e,0x0e,0x13,0x14,0x08,0x0a,0x10,0x0d,0x18,0x14,0x14,0x14,0x12,0x10,0x10,0x0d,0x13,0x18,0x0e,0x0e,0x10,0x16,0x10,0x10,0x0e,0x0e,0x0c,\r\n0x0c,0x10,0x08,0x0e,0x17,0x0f,0x10,0x0c,0x10,0x10,0x10,0x09,0x0f,0x0f,0x17,0x0d,0x0f,0x0f,0x0d,0x10,0x13,0x0e,0x08,0x0a,0x0f,0x0d,0x0f,0x0d,0x10,0x13,0x0e,0x1b,0x08,0x10,0x19,0x28,0x1d,0x19,0x19,0x28,0x1e,0x27,0x22,0x18,0x1b,0x17,0x15,0x34,0x15,0x1b,0x29,0x2b,0x2b,0x1d,0x1e,0x1c,0x15,0x16,0x18,0x14,0x15,0x18,0x09,0x00,\r\n0x00,0x00,0x00,0x1b,0x1c,0x1c,0x1c,0x16,0x12,0x1b,0x1b,0x0e,0x28,0x1a,0x1b,0x10,0x0f,0x15,0x10,0x15,0x1b,0x15,0x1b,0x2a,0x1e,0x0f,0x0c,0x1b,0x19,0x1b,0x1b,0x1b,0x0e,0x1b,0x17,0x0b,0x28,0x1a,0x1b,0x10,0x14,0x14,0x16,0x15,0x15,0x17,0x1b,0x1b,0x18,0x14,0x15,0x22,0x0b,0x15,0x0b,0x1a,0x14,0x10,0x0c,0x0c,0x10,0x0c,0x08,0x08,\r\n0x10,0x0f,0x08,0x08,0x08,0x08,0x08,0x08,0x07,0x0a,0x17,0x17,0x0f,0x0f,0x10,0x0f,0x11,0x0b,0x08,0x09,0x0f,0x10,0x0f,0x0f,0x0d,0x0c,0x0c,0x0e,0x0c,0x10,0x00,0x00,0x00,0x00,0x0a,0x0e,0x0e,0x10,0x0c,0x0e,0x19,0x19,0x19,0x19,0x0f,0x00,0x00,0x00,0x00,0x15,0x0e,0x0c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,\r\n0x0c,0x0c,0x0c,0x0c,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x0c,0x0c,0x0c,0x0c,0x19,0x19,0x19,0x19,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x19,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x08,0x11,0x11,0x10,0x11,0x10,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0e,0x0e,0x11,0x10,0x11,0x11,0x10,0x11,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x0e,0x0e,0x24,0x1d,0x21,0x1b,0x22,0x1d,0x2b,0x23,0x19,0x11,0x18,0x1f,0x19,0x26,0x20,0x00,0x00,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0f,0x0f,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x2e,0x13,0x0c,0x17,0x1b,0x13,0x17,0x17,0x1b,0x1b,0x17,0x2e,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x1e,0x17,0x17,0x17,\r\n0x0f,0x1b,0x0f,0x23,0x1f,0x17,0x0f,0x26,0x17,0x26,0x0c,0x0f,0x1b,0x1b,0x1e,0x1e,0x1e,0x1b,0x1b,0x1b,0x26,0x0c,0x1b,0x0c,0x17,0x13,0x0c,0x0c,0x17,0x0c,0x23,0x0c,0x2a,0x17,0x2a,0x2a,0x1b,0x1b,0x1b,0x17,0x17,0x13,0x13,0x36,0x36,0x3d,0x3d,0x26,0x26,0x17,0x17,0x08,0x2e,0x23,0x26,0x1f,0x1b,0x1f,0x17,0x17,0x23,0x23,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x0c,0x1e,0x00,0x1e,0x1e,0x1e,0x0f,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x1b,0x1f,0x1b,0x13,0x2a,0x17,0x2a,0x17,0x23,0x26,0x0f,0x17,0x17,0x13,0x0c,0x17,0x1b,0x17,0x1b,0x17,0x1b,0x1b,0x17,0x1f,0x1e,0x2a,0x0f,0x17,0x13,0x1f,0x17,0x0f,0x17,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x0c,0x1b,0x12,0x2e,0x17,\r\n0x17,0x1e,0x1e,0x2e,0x17,0x00,0x00,0x00,0x1e,0x00,0x1e,0x1e,0x1e,0x1e,0x23,0x1e,0x00,0x00,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x17,0x17,0x23,0x26,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1f,0x1b,0x17,0x17,0x17,0x17,\r\n0x17,0x17,0x17,0x17,0x13,0x13,0x13,0x17,0x13,0x13,0x13,0x36,0x26,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x17,0x1b,0x1b,0x1b,0x2e,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2e,0x17,0x17,0x23,0x23,0x32,0x2e,0x2a,0x17,0x26,0x17,0x26,0x17,0x26,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x1f,0x0f,0x1f,\r\n0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x1f,0x0f,0x1f,0x0f,0x19,0x1f,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x26,0x2a,0x23,0x26,0x0f,0x17,0x23,0x26,0x23,0x26,0x00,0x00,0x00,0x00,0x00,0x34,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x13,0x00,0x00,0x1c,0x00,0x00,0x00,0x36,0x26,0x3d,0x2e,0x17,0x1b,0x1b,0x1b,0x13,0x1b,\r\n0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x2a,0x2a,0x11,0x1b,0x1b,0x1b,0x38,0x26,0x18,0x46,0x32,0x0f,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x17,0x17,0x13,0x13,0x23,0x1f,0x1f,0x17,0x00,0x00,0x00,0x0f,0x0f,0x0f,0x0f,0x3a,0x45,0x00,0x00,0x00,0x00,0x00,0x1b,0x17,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x2a,0x13,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1f,0x1b,0x17,0x17,0x13,0x36,0x26,0x17,0x1b,0x1b,0x1b,0x17,0x1b,0x1b,0x1b,0x17,0x1b,0x1b,0x1b,0x2e,0x17,0x17,0x2e,0x17,0x17,0x2a,0x17,0x17,0x2a,0x17,0x17,0x2a,0x17,0x17,0x1b,0x1b,0x1b,0x1b,0x1f,0x0f,0x1f,0x0f,\r\n0x1f,0x0f,0x1f,0x1f,0x0f,0x0f,0x13,0x13,0x36,0x26,0x1e,0x1b,0x1b,0x00,0x17,0x17,0x17,0x11,0x1a,0x20,0x1d,0x17,0x18,0x10,0x0b,0x23,0x1b,0x1c,0x10,0x19,0x16,0x16,0x15,0x16,0x0b,0x18,0x13,0x1c,0x16,0x1b,0x15,0x19,0x14,0x1f,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x22,0x15,0x16,0x16,0x0d,0x18,0x1a,0x1c,0x17,0x10,\r\n0x22,0x1b,0x1d,0x19,0x1d,0x17,0x1a,0x18,0x12,0x20,0x11,0x13,0x13,0x16,0x1c,0x1c,0x17,0x2e,0x17,0x2e,0x0f,0x0c,0x08,0x19,0x0a,0x06,0x00,0x06,0x0a,0x00,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x17,0x17,0x2b,0x14,0x23,0x1b,0x2b,0x21,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x2a,0x28,0x16,\r\n0x28,0x16,0x28,0x1e,0x1f,0x20,0x20,0x23,0x28,0x2e,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x1f,0x1f,0x1f,0x1f,0x22,0x1b,0x31,0x26,0x16,0x16,0x0d,0x0d,0x0d,0x11,0x0a,0x1a,0x0b,0x0b,0x26,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x00,0x09,0x00,0x00,0x0a,0x00,0x00,0x1d,0x1a,0x14,0x16,0x1f,0x0c,\r\n0x10,0x1f,0x1f,0x0c,0x1a,0x19,0x19,0x20,0x1f,0x0c,0x12,0x1f,0x1c,0x1c,0x1d,0x1a,0x1b,0x1f,0x1a,0x24,0x21,0x18,0x18,0x18,0x0b,0x11,0x1a,0x1a,0x19,0x19,0x19,0x1c,0x1d,0x16,0x1f,0x19,0x19,0x20,0x1a,0x21,0x19,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1a,0x14,0x16,0x1f,0x0e,0x10,0x1f,0x0e,0x1a,0x19,0x19,0x1f,0x12,0x1f,0x1c,0x1d,\r\n0x1b,0x1f,0x1a,0x24,0x21,0x0c,0x1a,0x19,0x1d,0x1e,0x37,0x00,0x1d,0x19,0x1e,0x1e,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x0c,0x00,0x23,0x1e,0x1f,0x20,0x19,0x1f,0x22,0x23,0x16,0x1d,0x22,0x22,\r\n0x1e,0x23,0x25,0x24,0x1f,0x19,0x1a,0x23,0x20,0x1a,0x20,0x1f,0x1e,0x1f,0x20,0x22,0x1b,0x1d,0x1f,0x1e,0x24,0x1d,0x1c,0x1e,0x1f,0x26,0x17,0x1b,0x1b,0x28,0x19,0x19,0x23,0x29,0x1c,0x19,0x30,0x1a,0x1a,0x23,0x19,0x19,0x23,0x1a,0x23,0x25,0x28,0x19,0x24,0x19,0x1e,0x19,0x1c,0x1a,0x1d,0x19,0x1c,0x23,0x19,0x1d,0x1f,0x19,0x19,0x1b,\r\n0x2c,0x19,0x19,0x1b,0x1b,0x14,0x0f,0x1a,0x1a,0x1a,0x19,0x1a,0x29,0x1a,0x29,0x17,0x1a,0x29,0x1f,0x1a,0x29,0x22,0x22,0x29,0x1b,0x1a,0x29,0x29,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x29,0x29,0x1b,0x1a,0x1a,0x29,0x1b,0x19,0x1a,0x1a,0x29,0x24,0x20,0x20,0x20,0x20,0x21,0x1d,0x20,0x24,0x20,0x1e,0x19,0x24,0x1f,0x20,0x1a,0x1f,0x20,0x22,\r\n0x21,0x1b,0x20,0x1f,0x21,0x1f,0x24,0x20,0x21,0x21,0x1f,0x1d,0x20,0x1f,0x21,0x24,0x1e,0x23,0x21,0x05,0x05,0x07,0x09,0x07,0x0c,0x10,0x28,0x1a,0x1c,0x1b,0x1a,0x1c,0x1a,0x1a,0x1e,0x1c,0x1a,0x0e,0x26,0x1b,0x1a,0x1a,0x19,0x1c,0x18,0x1b,0x0c,0x1b,0x18,0x1a,0x13,0x28,0x19,0x1a,0x1a,0x1b,0x26,0x1a,0x1b,0x12,0x26,0x1b,0x1b,0x20,\r\n0x1f,0x0a,0x0d,0x34,0x34,0x34,0x34,0x42,0x19,0x19,0x0b,0x19,0x12,0x19,0x19,0x1a,0x19,0x19,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x12,0x19,0x19,0x1a,0x19,0x19,0x18,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x17,\r\n0x1b,0x14,0x13,0x1a,0x1c,0x0c,0x0e,0x17,0x13,0x23,0x1e,0x1c,0x16,0x1c,0x17,0x13,0x14,0x1b,0x17,0x25,0x17,0x15,0x16,0x20,0x24,0x13,0x1d,0x16,0x1b,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x14,0x14,0x14,0x14,0x0c,0x0c,0x0c,0x0c,0x1e,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x1b,0x1b,0x1b,0x15,0x17,0x17,0x17,0x17,0x17,0x1a,0x1b,0x1b,\r\n0x14,0x14,0x14,0x14,0x14,0x1a,0x1a,0x17,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1a,0x0e,0x17,0x13,0x13,0x13,0x13,0x1e,0x1e,0x1e,0x1e,0x1c,0x1c,0x1c,0x17,0x17,0x17,0x13,0x13,0x13,0x13,0x14,0x14,0x14,0x14,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x25,0x25,0x25,0x25,0x15,0x15,0x15,0x16,0x16,0x16,0x17,0x20,0x1d,0x17,0x17,0x12,0x19,0x14,\r\n0x16,0x1c,0x1c,0x0c,0x17,0x17,0x23,0x1e,0x15,0x1c,0x1c,0x16,0x15,0x14,0x15,0x1d,0x17,0x1e,0x1d,0x17,0x14,0x1c,0x0c,0x1c,0x15,0x1d,0x0c,0x15,0x14,0x1a,0x12,0x18,0x13,0x0c,0x0c,0x0e,0x25,0x26,0x1c,0x17,0x17,0x1c,0x17,0x16,0x17,0x12,0x1b,0x14,0x22,0x14,0x1e,0x1e,0x17,0x1a,0x23,0x1c,0x1c,0x1c,0x16,0x17,0x14,0x17,0x1d,0x17,\r\n0x1d,0x19,0x25,0x26,0x1a,0x20,0x17,0x18,0x28,0x16,0x12,0x1b,0x1b,0x1d,0x29,0x29,0x1e,0x17,0x1a,0x13,0x1a,0x1a,0x1a,0x20,0x18,0x18,0x20,0x1b,0x1b,0x10,0x1c,0x1c,0x1a,0x16,0x16,0x29,0x22,0x16,0x18,0x1c,0x1c,0x1d,0x1d,0x21,0x20,0x10,0x2b,0x1b,0x19,0x1a,0x1e,0x1e,0x17,0x17,0x0c,0x23,0x20,0x20,0x16,0x20,0x0a,0x0a,0x14,0x14,\r\n0x0a,0x0a,0x1c,0x12,0x0c,0x23,0x20,0x0d,0x0a,0x0a,0x15,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x1f,0x16,0x0e,0x1c,0x20,0x1b,0x1b,0x17,0x22,0x1a,0x1c,0x10,0x14,0x18,0x14,0x0a,0x0b,0x12,0x18,0x10,0x1f,0x1f,0x1f,0x2a,0x23,0x2a,0x0c,0x00,0x00,0x00,0x00,0x00,0x0c,0x23,0x26,0x0f,0x0f,0x17,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,\r\n0x1b,0x17,0x17,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x26,0x26,0x26,0x26,0x26,0x2a,0x2a,0x17,0x17,0x2a,0x2a,0x17,0x17,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x2e,0x23,0x26,0x17,0x1b,0x1b,0x1f,0x0f,0x1f,0x23,0x17,0x17,0x0f,0x0f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,\r\n0x2a,0x0f,0x23,0x17,0x17,0x0c,0x17,0x17,0x17,0x17,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x36,0x26,0x36,0x26,0x36,0x26,0x3d,0x2e,0x3d,0x2e,0x26,0x26,0x26,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x23,0x17,0x17,\r\n0x23,0x17,0x17,0x2a,0x17,0x32,0x2e,0x2a,0x17,0x26,0x17,0x26,0x17,0x26,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x2a,0x17,0x1f,0x1f,0x1f,0x1f,0x1f,0x0f,0x1f,0x1f,0x0f,0x0f,0x1f,0x0f,0x1f,0x0f,0x1f,0x17,0x1b,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x0f,0x0f,0x17,0x0f,0x0f,0x0f,0x0f,0x00,0x36,0x26,\r\n0x3d,0x2e,0x2a,0x17,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x17,0x17,0x13,0x36,0x26,0x2e,0x2e,0x2a,0x2a,0x2a,0x1b,0x1b,0x1b,0x1b,0x1f,0x0f,0x1f,0x0f,0x1f,0x0f,0x36,0x26,0x1b,0x1f,0x1b,0x1b,0x1b,0x1f,0x1b,0x1b,0x36,0x36,0x26,0x26,0x13,0x13,0x1b,0x1b,0x1b,0x1b,0x0f,0x0f,0x0f,0x0f,0x23,0x26,\r\n0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x23,0x26,0x0f,0x0f,0x1b,0x1b,0x1b,0x1b,0x2a,0x0f,0x2a,0x0f,0x1b,0x1f,0x1b,0x1b,0x36,0x36,0x26,0x26,0x36,0x36,0x26,0x26,0x26,0x26,0x17,0x17,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x00,0x00,0x0c,0x0c,0x0f,0x0c,0x00,0x00,0x00,0x26,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x13,0x13,0x23,0x23,\r\n0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,\r\n0x23,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1b,0x26,0x1b,0x26,0x1b,0x26,0x1b,0x26,0x1f,0x1f,0x1f,0x0c,0x0c,0x17,0x13,0x1b,0x1d,0x1a,0x19,0x1a,0x1b,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x18,0x15,0x19,0x18,0x1b,0x1c,0x1c,0x1e,0x1b,0x1a,0x1e,0x18,0x1f,0x23,0x1d,0x22,0x26,0x1d,0x23,0x20,0x1a,0x1a,0x1a,0x1a,\r\n0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x18,0x15,0x19,0x1c,0x1c,0x1e,0x1a,0x1e,0x1a,0x1b,0x1c,0x17,0x17,0x23,0x1f,0x20,0x1f,0x1f,0x1b,0x1b,0x1b,0x22,0x23,0x23,0x23,0x2a,0x2a,0x20,0x2a,0x2a,0x22,0x28,0x27,0x1a,0x23,0x27,0x23,0x1b,0x27,0x22,0x20,0x20,0x1c,0x1e,0x22,0x25,0x20,0x1c,0x21,0x1b,0x19,0x2a,0x2a,0x2a,0x26,0x2a,0x2a,0x1f,\r\n0x2a,0x2a,0x21,0x23,0x24,0x22,0x21,0x21,0x1e,0x29,0x23,0x26,0x21,0x21,0x1b,0x22,0x20,0x20,0x27,0x23,0x21,0x29,0x19,0x17,0x1a,0x19,0x1c,0x1d,0x20,0x22,0x1b,0x1a,0x1a,0x19,0x1a,0x19,0x19,0x1a,0x1a,0x1b,0x1a,0x1a,0x1a,0x17,0x18,0x1b,0x1d,0x1c,0x1c,0x15,0x1a,0x1a,0x1b,0x1c,0x23,0x27,0x1e,0x1e,0x1d,0x23,0x1d,0x1f,0x18,0x16,\r\n0x1b,0x1a,0x16,0x17,0x19,0x19,0x16,0x15,0x1d,0x15,0x19,0x17,0x19,0x24,0x1a,0x26,0x19,0x1a,0x1a,0x22,0x0e,0x24,0x20,0x21,0x1e,0x1a,0x23,0x1c,0x24,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x1c,0x1c,0x1c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x14,0x15,0x15,0x15,0x15,0x15,0x0e,0x0e,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x0c,0x1d,0x0c,\r\n0x0c,0x0c,0x0e,0x0e,0x0c,0x0c,0x0c,0x0e,0x0c,0x0c,0x0c,0x2a,0x2a,0x2a,0x2a,0x16,0x22,0x21,0x16,0x13,0x16,0x18,0x1a,0x16,0x27,0x26,0x28,0x14,0x2e,0x16,0x26,0x26,0x27,0x25,0x1a,0x16,0x16,0x24,0x1b,0x24,0x1f,0x19,0x15,0x13,0x2f,0x13,0x19,0x16,0x16,0x16,0x16,0x16,0x3f,0x26,0x26,0x14,0x0c,0x15,0x0b,0x15,0x0b,0x0b,0x0b,0x16,\r\n0x1b,0x1b,0x19,0x11,0x11,0x0b,0x0b,0x0b,0x11,0x0b,0x13,0x28,0x0a,0x2a,0x2a,0x2a,0x1b,0x1b,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x36,0x36,0x1f,0x36,0x36,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x1b,0x16,0x1b,0x16,0x18,0x14,0x10,0x10,0x20,0x19,0x21,0x14,0x34,0x29,0x1b,0x19,0x2a,0x24,0x27,0x22,0x2f,0x25,0x2b,0x24,0x1e,0x16,0x21,0x1b,0x2b,0x22,0x23,0x1c,0x22,0x1c,0x28,0x1f,0x28,0x1f,0x33,0x27,0x23,0x1b,0x23,0x1b,0x38,0x29,0x24,0x00,0x2d,0x2d,0x2d,0x16,0x00,0x00,0x1b,0x17,0x20,0x1a,0x18,0x14,0x32,0x2a,\r\n0x2b,0x28,0x21,0x1b,0x20,0x1b,0x18,0x13,0x22,0x1b,0x18,0x13,0x26,0x1f,0x1e,0x1a,0x2d,0x26,0x19,0x1a,0x22,0x22,0x25,0x15,0x09,0x15,0x1f,0x14,0x2e,0x2e,0x0b,0x00,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x12,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x34,0x19,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,\r\n0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x22,0x22,0x22,0x22,\r\n0x22,0x22,0x22,0x22,0x22,0x22,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x29,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,0x1a,\r\n0x1a,0x1a,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x23,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x16,0x1f,0x21,0x0d,0x0a,0x0d,0x0a,0x21,0x1a,0x22,0x1d,0x19,0x16,0x19,\r\n0x16,0x1b,0x1a,0x13,0x13,0x34,0x26,0x35,0x29,0x2d,0x27,0x29,0x1e,0x29,0x1e,0x29,0x1e,0x1c,0x15,0x1b,0x17,0x1b,0x17,0x1b,0x17,0x19,0x0e,0x16,0x0b,0x23,0x1b,0x28,0x1f,0x3d,0x2e,0x1a,0x1b,0x20,0x20,0x25,0x28,0x23,0x1b,0x2d,0x24,0x19,0x12,0x1a,0x17,0x1d,0x16,0x2b,0x21,0x1c,0x18,0x1a,0x1b,0x1a,0x1b,0x16,0x12,0x16,0x12,0x16,\r\n0x11,0x18,0x18,0x0e,0x1f,0x0f,0x2c,0x1e,0x10,0x1b,0x1c,0x15,0x23,0x1a,0x11,0x10,0x1b,0x1b,0x1b,0x16,0x0b,0x23,0x1c,0x11,0x10,0x1d,0x15,0x21,0x12,0x24,0x1c,0x1c,0x15,0x20,0x1b,0x1b,0x17,0x22,0x1a,0x1c,0x10,0x18,0x14,0x23,0x14,0x18,0x28,0x16,0x1a,0x29,0x0c,0x35,0x29,0x29,0x36,0x29,0x2a,0x2a,0x28,0x29,0x2a,0x18,0x16,0x1c,\r\n0x20,0x29,0x20,0x2b,0x0b,0x15,0x1b,0x28,0x2f,0x20,0x2f,0x1c,0x1c,0x25,0x20,0x34,0x2a,0x18,0x2a,0x0f,0x2a,0x0f,0x1b,0x1b,0x1b,0x1b,0x26,0x26,0x26,0x26,0x2e,0x17,0x17,0x2e,0x23,0x17,0x17,0x23,0x1f,0x0f,0x0f,0x1f,0x1b,0x1b,0x1b,0x1b,0x23,0x0f,0x0f,0x26,0x23,0x0f,0x0f,0x26,0x13,0x13,0x17,0x17,0x18,0x18,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x47,0x18,0x12,0x1a,0x18,0x22,0x1b,0x1b,0x28,0x1f,0x22,0x23,0x26,0x26,0x1b,0x17,0x2e,0x25,0x30,0x27,0x20,0x1b,0x0e,0x0e,0x1b,0x1e,0x13,0x1c,0x18,0x1b,0x16,0x22,0x25,0x12,0x1b,0x14,0x0a,0x11,0x18,0x19,0x0a,\r\n0x0a,0x08,0x0a,0x11,0x11,0x11,0x15,0x44,0x5c,0x10,0x13,0x06,0x0c,0x12,0x14,0x0f,0x17,0x18,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x16,0x16,0x16,0x16,0x16,0x3d,0x19,0x23,0x2a,0x29,0x1e,0x15,0x1a,0x21,0x22,0x16,0x0e,0x1e,0x18,0x1f,0x1a,0x1e,0x19,0x19,0x22,0x1b,0x1b,0x18,0x22,0x1c,0x26,0x15,0x18,0x1d,0x0e,0x1b,\r\n0x10,0x10,0x0b,0x28,0x1b,0x1a,0x18,0x18,0x1b,0x2b,0x2b,0x2b,0x2e,0x2e,0x19,0x17,0x0d,0x17,0x15,0x1c,0x15,0x1f,0x0b,0x1a,0x1c,0x28,0x28,0x1c,0x19,0x1b,0x19,0x18,0x15,0x18,0x15,0x16,0x0e,0x10,0x0b,0x0a,0x11,0x1b,0x1d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0f,0x0f,0x00,0x0d,0x0d,0x0d,0x0c,\r\n0x0c,0x4d,0x2e,0x28,0x30,0x0d,0x0d,0x0f,0x12,0x0c,0x0c,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x00,0x2a,0x0f,0x0f,0x2a,0x0c,0x17,0x17,0x3d,0x2e,0x2e,0x3d,0x2a,0x17,0x17,0x2a,0x17,0x17,0x13,0x13,0x00,0x00,0x10,0x22,0x1c,0x21,0x1b,0x3a,0x30,0x20,0x19,0x20,0x19,0x3d,0x2e,0x23,0x1b,0x12,0x0f,0x1c,0x00,0x1f,0x19,\r\n0x0f,0x0e,0x07,0x17,0x0f,0x10,0x0c,0x09,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0a,0x18,0x14,0x1b,0x1a,0x19,0x2c,0x25,0x25,0x24,0x26,0x2b,0x1d,0x20,0x1c,0x12,0x2b,0x34,0x14,0x35,0x17,0x26,0x2a,0x2a,0x2a,0x13,0x23,0x2e,0x23,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x00,0x1b,\r\n0x1b,0x1b,0x26,0x17,0x17,0x2a,0x0f,0x0f,0x2a,0x0f,0x0f,0x2a,0x17,0x17,0x00,0x13,0x26,0x0f,0x0f,0x2e,0x17,0x17,0x23,0x17,0x17,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x45,0x45,0x28,0x00,0x00,0x28,0x28,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,\r\n0x1f,0x1c,0x1e,0x1e,0x29,0x1e,0x1d,0x25,0x2d,0x1e,0x1d,0x31,0x1d,0x1d,0x2b,0x1d,0x1f,0x24,0x1d,0x23,0x27,0x2a,0x1d,0x23,0x1e,0x20,0x1d,0x20,0x1d,0x1e,0x20,0x1d,0x24,0x1c,0x1f,0x24,0x1c,0x1d,0x1a,0x24,0x1e,0x1e,0x1e,0x20,0x15,0x18,0x1e,0x24,0x24,0x19,0x00,0x00,0x32,0x64,0x20,0x00,0x05,0x0e,0x0e,0x14,0x1e,0x1b,0x29,0x28,\r\n0x0c,0x0f,0x0f,0x15,0x22,0x0b,0x14,0x0b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x0b,0x0b,0x22,0x22,0x22,0x16,0x30,0x20,0x1d,0x1f,0x23,0x19,0x18,0x22,0x24,0x0d,0x12,0x1d,0x18,0x2d,0x25,0x26,0x1c,0x26,0x1e,0x1b,0x1a,0x22,0x1f,0x2f,0x1e,0x1c,0x1d,0x0f,0x13,0x0f,0x22,0x15,0x0d,0x19,0x1d,0x17,0x1d,0x1a,0x10,\r\n0x1d,0x1c,0x0c,0x0c,0x19,0x0c,0x2b,0x1c,0x1d,0x1d,0x1d,0x11,0x15,0x11,0x1c,0x18,0x24,0x17,0x18,0x17,0x0f,0x0c,0x0f,0x22,0x20,0x20,0x1f,0x19,0x25,0x26,0x22,0x19,0x19,0x19,0x19,0x19,0x19,0x17,0x1a,0x1a,0x1a,0x1a,0x0c,0x0c,0x0c,0x0c,0x1c,0x1d,0x1d,0x1d,0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x13,0x13,0x1b,0x1b,0x16,0x14,0x17,0x1b,\r\n0x14,0x2d,0x2d,0x27,0x0e,0x15,0x22,0x2b,0x26,0x29,0x22,0x22,0x22,0x1b,0x1d,0x1b,0x1f,0x26,0x1b,0x14,0x16,0x26,0x2a,0x1d,0x16,0x0e,0x0e,0x22,0x21,0x1b,0x22,0x20,0x19,0x19,0x25,0x20,0x20,0x26,0x2f,0x2e,0x19,0x32,0x13,0x13,0x0b,0x0b,0x22,0x1d,0x18,0x1c,0x09,0x1b,0x10,0x10,0x1c,0x1c,0x13,0x0b,0x0b,0x13,0x3d,0x20,0x19,0x20,\r\n0x19,0x19,0x0d,0x0d,0x0d,0x0d,0x26,0x26,0x26,0x22,0x22,0x22,0x0c,0x13,0x11,0x10,0x0f,0x0a,0x0e,0x0a,0x10,0x09,0x13,0x18,0x0e,0x1b,0x15,0x1d,0x17,0x0c,0x23,0x1c,0x1c,0x18,0x1c,0x1d,0x22,0x22,0x12,0x12,0x12,0x2f,0x2d,0x30,0x18,0x22,0x1d,0x0d,0x1b,0x15,0x1f,0x17,0x1f,0x17,0x1d,0x15,0x0b,0x20,0x19,0x20,0x19,0x23,0x22,0x23,\r\n0x19,0x1a,0x19,0x1a,0x18,0x0c,0x18,0x0f,0x18,0x10,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x1e,0x11,0x1e,0x11,0x1b,0x15,0x1a,0x11,0x1a,0x16,0x22,0x1c,0x22,0x1c,0x1d,0x17,0x1d,0x17,0x18,0x26,0x26,0x1f,0x1d,0x16,0x1d,0x18,0x23,0x15,0x18,0x14,0x38,0x1f,0x19,0x1e,0x0b,0x13,0x28,0x10,0x1e,0x12,0x12,0x1e,0x12,0x20,0x19,0x1f,0x17,0x1f,\r\n0x17,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x22,0x1d,0x22,0x1d,0x22,0x1d,0x24,0x1c,0x24,0x1c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x0d,0x0c,0x12,0x0c,0x1d,0x19,0x19,0x18,0x0c,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x26,0x1d,0x1e,0x11,0x1b,0x15,0x1a,0x11,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x2f,0x24,0x1c,0x18,0x0c,0x20,0x19,0x2b,0x2a,0x26,\r\n0x1d,0x0b,0x2f,0x24,0x2f,0x24,0x2f,0x24,0x1c,0x18,0x0b,0x15,0x1b,0x1e,0x2e,0x2e,0x2e,0x2d,0x13,0x13,0x0b,0x0e,0x0e,0x20,0x1d,0x27,0x13,0x28,0x21,0x29,0x0d,0x20,0x1d,0x19,0x1d,0x24,0x0d,0x1d,0x1f,0x2d,0x25,0x19,0x26,0x24,0x1c,0x1a,0x1a,0x1c,0x1e,0x27,0x26,0x0d,0x1c,0x1f,0x16,0x1d,0x0d,0x1c,0x1b,0x1a,0x16,0x1d,0x1d,0x0d,\r\n0x1a,0x19,0x1d,0x1a,0x16,0x1d,0x1d,0x17,0x1c,0x1b,0x26,0x28,0x0d,0x1c,0x1d,0x1c,0x28,0x19,0x23,0x18,0x1f,0x1b,0x0d,0x31,0x31,0x24,0x1d,0x1c,0x23,0x20,0x1d,0x1d,0x18,0x23,0x19,0x2b,0x1b,0x25,0x25,0x1d,0x22,0x2d,0x24,0x26,0x24,0x1c,0x1f,0x1a,0x1c,0x24,0x1e,0x25,0x21,0x2f,0x31,0x23,0x27,0x1d,0x1f,0x33,0x1e,0x19,0x1d,0x1a,\r\n0x13,0x1b,0x1a,0x25,0x16,0x1d,0x1d,0x19,0x1a,0x23,0x1d,0x1d,0x1d,0x1d,0x17,0x15,0x18,0x22,0x17,0x1e,0x1c,0x28,0x29,0x1e,0x23,0x19,0x17,0x29,0x19,0x1a,0x1d,0x13,0x17,0x15,0x0c,0x28,0x28,0x1c,0x19,0x18,0x1d,0x17,0x14,0x32,0x38,0x1f,0x12,0x12,0x12,0x12,0x0c,0x1b,0x15,0x1c,0x26,0x1e,0x23,0x1d,0x0f,0x11,0x0d,0x0d,0x18,0x18,\r\n0x18,0x18,0x0f,0x0f,0x0f,0x18,0x0f,0x18,0x0f,0x0f,0x0f,0x18,0x18,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x20,0x19,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x0d,0x0c,0x0d,0x0c,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,\r\n0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x26,0x1e,0x22,0x1c,0x22,0x1c,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x1c,0x18,0x1c,0x18,0x1c,0x18,0x1a,0x11,0x19,0x1a,0x25,0x1d,0x0d,0x12,0x0c,0x0c,0x1a,0x15,0x2e,0x27,0x1f,0x1b,0x1d,0x19,0x25,0x1e,0x1c,0x18,0x1c,0x18,0x1f,0x19,0x21,\r\n0x1c,0x21,0x1c,0x24,0x1a,0x26,0x1d,0x0f,0x0f,0x0f,0x0f,0x15,0x15,0x18,0x18,0x18,0x18,0x0d,0x0d,0x0f,0x0f,0x0f,0x0f,0x19,0x1a,0x20,0x19,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1f,0x17,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x23,0x1d,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x19,0x1a,0x18,0x10,0x22,0x1d,0x24,0x1c,0x24,0x1c,0x24,\r\n0x1c,0x24,0x1c,0x24,0x1c,0x0d,0x0c,0x0d,0x0c,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x18,0x0c,0x18,0x0c,0x18,0x0c,0x18,0x0c,0x2d,0x2b,0x2d,0x2b,0x2d,0x2b,0x25,0x1c,0x25,0x1c,0x25,0x1c,0x25,0x1c,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x26,0x1d,0x1c,0x1d,0x1c,0x1d,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1e,0x11,0x1b,0x15,0x1b,0x15,0x1b,0x15,0x1b,\r\n0x15,0x1b,0x15,0x1a,0x11,0x1a,0x11,0x1a,0x11,0x1a,0x11,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x1f,0x18,0x1f,0x18,0x2f,0x24,0x2f,0x24,0x1e,0x17,0x1e,0x17,0x1c,0x18,0x1d,0x17,0x1d,0x17,0x1d,0x17,0x1c,0x11,0x24,0x18,0x19,0x0c,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x25,0x25,0x25,0x25,0x25,0x25,0x16,\r\n0x16,0x16,0x16,0x16,0x16,0x1d,0x1d,0x24,0x24,0x24,0x24,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x13,0x13,0x19,0x19,0x1a,0x1a,0x1a,0x1a,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x28,0x28,0x30,0x30,0x30,0x30,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x21,\r\n0x29,0x29,0x29,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x30,0x30,0x30,0x30,0x30,0x30,0x1f,0x1f,0x16,0x16,0x1d,0x1d,0x0d,0x0d,0x1d,0x1d,0x1c,0x1c,0x28,0x28,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x25,0x25,0x25,0x25,0x25,0x25,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x2e,0x2e,0x2e,0x2e,0x2e,\r\n0x2e,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x30,0x30,0x30,0x30,0x30,0x30,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x20,0x20,0x20,0x20,0x20,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x27,0x27,0x24,0x1d,0x1d,0x1d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x12,0x13,0x1d,0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,\r\n0x1d,0x1d,0x1c,0x1c,0x1c,0x1c,0x21,0x21,0x1f,0x1d,0x1d,0x1d,0x28,0x28,0x28,0x28,0x28,0x29,0x29,0x2a,0x29,0x26,0x1d,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x1f,0x1d,0x1d,0x1d,0x1d,0x1f,0x1f,0x17,0x23,0x25,0x1d,0x1d,0x1e,0x19,0x1b,0x18,0x23,0x1f,0x2c,0x0e,0x0e,0x1d,0x19,0x0c,0x19,\r\n0x2d,0x25,0x1d,0x26,0x30,0x28,0x1e,0x1d,0x1d,0x1b,0x15,0x1a,0x0f,0x11,0x1a,0x11,0x1a,0x26,0x24,0x1c,0x1a,0x1d,0x17,0x1f,0x1f,0x16,0x14,0x1b,0x1b,0x13,0x14,0x1b,0x0c,0x13,0x17,0x0e,0x3e,0x39,0x33,0x2b,0x24,0x19,0x36,0x30,0x28,0x20,0x19,0x0d,0x0c,0x26,0x1d,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x22,0x1c,0x1a,0x20,0x19,\r\n0x20,0x19,0x2b,0x29,0x22,0x1d,0x22,0x1d,0x1d,0x19,0x26,0x1d,0x26,0x1d,0x1f,0x16,0x0c,0x3e,0x39,0x33,0x22,0x1d,0x32,0x22,0x25,0x1c,0x20,0x19,0x20,0x19,0x19,0x1a,0x19,0x1a,0x0d,0x0c,0x0d,0x0c,0x26,0x1d,0x26,0x1d,0x1d,0x11,0x1e,0x11,0x22,0x1c,0x22,0x1c,0x19,0x15,0x24,0x1c,0x25,0x1e,0x1c,0x1d,0x17,0x20,0x19,0x26,0x1d,0x26,\r\n0x1d,0x26,0x1d,0x26,0x1d,0x1c,0x18,0x1d,0x19,0x1c,0x1c,0x1d,0x19,0x1d,0x1d,0x1d,0x17,0x17,0x1d,0x1d,0x1a,0x1f,0x15,0x15,0x19,0x1c,0x0e,0x1d,0x1d,0x1a,0x18,0x17,0x1c,0x1c,0x1c,0x0d,0x0e,0x10,0x0e,0x13,0x0c,0x1e,0x2b,0x2b,0x2b,0x1c,0x1c,0x1d,0x1d,0x23,0x24,0x20,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x17,0x14,0x0c,0x0d,\r\n0x0e,0x0e,0x11,0x11,0x1e,0x1e,0x1c,0x18,0x24,0x18,0x15,0x17,0x1a,0x16,0x16,0x12,0x12,0x12,0x17,0x1f,0x18,0x1b,0x1a,0x1c,0x0c,0x19,0x13,0x1d,0x12,0x12,0x2e,0x2f,0x31,0x1f,0x18,0x24,0x28,0x1d,0x1c,0x19,0x19,0x1b,0x1e,0x1c,0x22,0x1c,0x20,0x28,0x1d,0x23,0x1d,0x1d,0x17,0x19,0x17,0x1e,0x19,0x1f,0x19,0x2d,0x2b,0x1e,0x19,0x20,\r\n0x1b,0x1f,0x17,0x1e,0x18,0x21,0x1d,0x1c,0x14,0x1d,0x1d,0x17,0x0c,0x26,0x17,0x17,0x2b,0x22,0x20,0x1d,0x2d,0x24,0x21,0x19,0x2c,0x23,0x24,0x1c,0x2e,0x25,0x1b,0x16,0x27,0x26,0x26,0x1d,0x24,0x1d,0x24,0x1d,0x42,0x38,0x29,0x21,0x38,0x2d,0x2b,0x22,0x1d,0x16,0x19,0x14,0x15,0x00,0x00,0x31,0x2f,0x1d,0x19,0x1c,0x1d,0x1c,0x19,0x1b,\r\n0x17,0x1d,0x19,0x24,0x1d,0x2a,0x21,0x33,0x2a,0x24,0x1c,0x1f,0x17,0x1a,0x15,0x2c,0x22,0x22,0x1d,0x2a,0x20,0x2a,0x20,0x0d,0x2b,0x25,0x1d,0x19,0x24,0x1d,0x21,0x1c,0x20,0x19,0x20,0x19,0x2b,0x2a,0x19,0x1a,0x24,0x1a,0x24,0x1a,0x2b,0x25,0x1b,0x16,0x1a,0x16,0x25,0x1d,0x25,0x1d,0x26,0x1d,0x26,0x1d,0x1f,0x17,0x1c,0x18,0x1c,0x18,\r\n0x1c,0x18,0x21,0x1c,0x27,0x23,0x1c,0x1d,0x2b,0x2b,0x28,0x24,0x1c,0x18,0x2d,0x28,0x31,0x2a,0x24,0x1b,0x22,0x1e,0x1d,0x1c,0x1c,0x19,0x1d,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0b,0x0b,0x1d,0x11,0x11,0x08,0x0b,0x0b,0x0b,0x0e,0x14,0x0e,0x0b,0x13,0x0b,0x0b,0x0b,0x11,0x11,0x0b,0x0b,0x1d,0x1d,\r\n0x1d,0x1d,0x11,0x0e,0x0d,0x11,0x10,0x0d,0x0e,0x0e,0x0e,0x11,0x11,0x11,0x11,0x11,0x10,0x11,0x11,0x0f,0x08,0x0c,0x0e,0x0b,0x13,0x13,0x13,0x13,0x13,0x11,0x11,0x11,0x15,0x11,0x0c,0x0d,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,\r\n0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,\r\n0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1b,0x1b,0x00,0x00,0x00,0x00,0x00,0x20,0x0f,0x20,0x11,0x1e,0x1e,0x11,0x11,0x11,0x11,0x11,0x0d,\r\n0x10,0x10,0x11,0x0e,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x1d,0x17,0x21,0x29,0x18,0x17,0x1b,0x1c,0x15,0x15,0x0c,0x0f,0x19,0x14,0x23,0x1d,0x1d,0x18,0x1f,0x1f,0x1f,0x2e,0x1b,0x1e,0x1e,0x17,0x17,0x17,0x15,0x1b,0x1c,0x24,0x1c,0x18,0x24,0x17,0x15,0x15,0x1a,0x13,0x17,\r\n0x1d,0x17,0x1e,0x1c,0x12,0x18,0x11,0x12,0x14,0x0f,0x0f,0x14,0x15,0x09,0x0b,0x12,0x0e,0x1a,0x16,0x16,0x15,0x13,0x11,0x11,0x0f,0x15,0x1a,0x10,0x10,0x11,0x18,0x11,0x11,0x10,0x10,0x0d,0x0d,0x11,0x08,0x0f,0x19,0x11,0x11,0x0e,0x11,0x11,0x11,0x0a,0x11,0x10,0x19,0x0e,0x10,0x11,0x0f,0x11,0x14,0x0f,0x08,0x0b,0x11,0x0e,0x11,0x0f,\r\n0x11,0x14,0x0f,0x1d,0x08,0x11,0x1b,0x2c,0x1f,0x1b,0x1b,0x2b,0x20,0x2b,0x25,0x1a,0x1d,0x19,0x16,0x38,0x17,0x1d,0x2d,0x2f,0x2f,0x1f,0x20,0x1f,0x17,0x18,0x1a,0x15,0x17,0x1a,0x0a,0x00,0x00,0x00,0x00,0x1d,0x1f,0x1f,0x1f,0x18,0x13,0x1d,0x1d,0x10,0x2b,0x1c,0x1d,0x11,0x11,0x17,0x11,0x17,0x1d,0x17,0x1d,0x2d,0x20,0x10,0x0d,0x1d,\r\n0x1b,0x1e,0x1d,0x1d,0x10,0x1d,0x19,0x0c,0x2b,0x1c,0x1d,0x11,0x15,0x16,0x18,0x17,0x17,0x19,0x1d,0x1d,0x1a,0x16,0x16,0x25,0x0c,0x17,0x0c,0x1c,0x16,0x11,0x0d,0x0d,0x11,0x0d,0x09,0x08,0x11,0x11,0x08,0x09,0x09,0x09,0x08,0x09,0x08,0x0b,0x19,0x19,0x11,0x11,0x12,0x11,0x12,0x0c,0x08,0x0a,0x11,0x11,0x10,0x10,0x0e,0x0d,0x0d,0x0f,\r\n0x0d,0x11,0x00,0x00,0x00,0x00,0x0b,0x10,0x10,0x11,0x0d,0x10,0x1b,0x1b,0x1b,0x1b,0x11,0x00,0x00,0x00,0x00,0x17,0x10,0x0d,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x0d,0x0d,0x0d,0x0d,0x1c,0x1c,0x1c,0x1c,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,\r\n0x42,0x42,0x1b,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x09,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0f,0x0f,0x27,0x20,0x23,0x1d,0x25,0x1f,0x2f,0x26,0x1b,0x13,0x1a,0x22,0x1b,0x29,0x23,0x00,0x00,0x00,0x00,0x0d,0x0d,0x0d,\r\n0x0d,0x11,0x11,0x11,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x2a,0x2a,0x32,0x15,0x0d,0x19,0x1d,0x15,0x19,0x19,0x1d,0x1d,0x19,0x32,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x19,0x20,0x19,0x19,0x19,0x11,0x1d,0x11,0x26,0x21,0x19,0x11,0x2a,0x19,0x2a,0x0d,0x11,0x1d,0x1d,0x20,0x20,0x20,0x1d,0x1d,0x1d,0x2a,0x0d,0x1d,0x0d,0x19,0x15,0x0d,0x0d,\r\n0x19,0x0d,0x26,0x0d,0x2e,0x19,0x2e,0x2e,0x1d,0x1d,0x1d,0x19,0x19,0x15,0x15,0x3a,0x3a,0x43,0x43,0x2a,0x2a,0x19,0x19,0x08,0x32,0x26,0x2a,0x21,0x1d,0x21,0x19,0x19,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x0d,0x20,0x00,0x20,0x20,0x20,0x11,0x19,0x19,0x2e,0x11,0x2e,0x11,0x1d,0x21,0x1d,0x15,0x2e,0x19,0x2e,0x19,\r\n0x26,0x2a,0x11,0x19,0x19,0x15,0x0d,0x19,0x1d,0x19,0x1d,0x19,0x1d,0x1d,0x19,0x21,0x20,0x2e,0x11,0x19,0x15,0x21,0x19,0x11,0x19,0x19,0x19,0x2e,0x11,0x2e,0x11,0x0d,0x1d,0x13,0x32,0x19,0x19,0x20,0x20,0x32,0x19,0x00,0x00,0x00,0x20,0x00,0x20,0x20,0x20,0x20,0x26,0x20,0x00,0x00,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x19,0x19,\r\n0x26,0x2a,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x21,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,0x19,0x15,0x15,0x15,0x3a,0x2a,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x19,0x1d,0x1d,0x1d,0x32,0x32,\r\n0x19,0x19,0x32,0x19,0x19,0x32,0x19,0x19,0x32,0x19,0x19,0x26,0x26,0x36,0x32,0x2e,0x19,0x2a,0x19,0x2a,0x19,0x2a,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x21,0x11,0x21,0x11,0x1b,0x21,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x2a,0x2e,0x26,0x2a,0x11,\r\n0x19,0x26,0x2a,0x26,0x2a,0x00,0x00,0x00,0x00,0x00,0x38,0x36,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x15,0x00,0x00,0x1e,0x00,0x00,0x00,0x3a,0x2a,0x43,0x32,0x19,0x1d,0x1d,0x1d,0x15,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x2e,0x2e,0x13,0x1d,0x1d,0x1e,0x3d,0x2a,0x1b,0x4c,0x36,0x11,\r\n0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x19,0x15,0x15,0x26,0x21,0x21,0x19,0x00,0x00,0x00,0x11,0x11,0x11,0x11,0x3f,0x4b,0x00,0x00,0x00,0x00,0x00,0x1d,0x19,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x15,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x21,0x1d,0x19,0x19,0x15,0x3a,\r\n0x2a,0x19,0x1d,0x1d,0x1d,0x19,0x1d,0x1d,0x1d,0x19,0x1d,0x1d,0x1d,0x32,0x19,0x19,0x32,0x19,0x19,0x2e,0x19,0x19,0x2e,0x19,0x19,0x2e,0x19,0x19,0x1d,0x1d,0x1d,0x1d,0x21,0x11,0x21,0x11,0x21,0x11,0x21,0x21,0x11,0x11,0x15,0x15,0x3a,0x2a,0x20,0x1d,0x1d,0x00,0x19,0x19,0x19,0x12,0x1d,0x22,0x1f,0x19,0x1a,0x12,0x0c,0x26,0x1d,0x1e,\r\n0x11,0x1c,0x18,0x18,0x17,0x18,0x0c,0x1a,0x15,0x1f,0x18,0x1e,0x17,0x1b,0x16,0x22,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x25,0x17,0x18,0x18,0x0e,0x1a,0x1c,0x1e,0x19,0x11,0x25,0x1d,0x20,0x1b,0x1f,0x19,0x1c,0x1a,0x14,0x23,0x13,0x15,0x15,0x18,0x1e,0x1e,0x19,0x32,0x19,0x32,0x11,0x0d,0x08,0x1b,0x0b,0x06,0x00,0x07,\r\n0x0b,0x00,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x19,0x19,0x2e,0x15,0x26,0x1d,0x2f,0x24,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x2e,0x2b,0x18,0x2b,0x18,0x2b,0x20,0x22,0x23,0x23,0x26,0x2b,0x32,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x22,0x22,0x22,0x22,0x25,0x1d,0x35,0x29,0x18,0x18,0x0e,\r\n0x0e,0x0e,0x13,0x0b,0x1c,0x0c,0x0c,0x2a,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x00,0x0a,0x00,0x00,0x0b,0x00,0x00,0x20,0x1d,0x16,0x18,0x22,0x0d,0x11,0x22,0x22,0x0d,0x1c,0x1b,0x1c,0x23,0x22,0x0d,0x14,0x22,0x1e,0x1f,0x20,0x1c,0x1d,0x21,0x1c,0x27,0x24,0x1a,0x1a,0x1a,0x0b,0x13,0x1c,0x1c,\r\n0x1c,0x1c,0x1b,0x1e,0x20,0x18,0x22,0x1b,0x1c,0x23,0x1c,0x24,0x1c,0x27,0x27,0x27,0x27,0x20,0x20,0x20,0x1d,0x16,0x18,0x22,0x0f,0x12,0x22,0x0f,0x1c,0x1b,0x1c,0x22,0x14,0x22,0x1f,0x20,0x1d,0x21,0x1c,0x27,0x24,0x0d,0x1d,0x1b,0x20,0x21,0x3c,0x00,0x20,0x1c,0x21,0x21,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x0d,0x00,0x26,0x20,0x21,0x23,0x1c,0x21,0x25,0x26,0x18,0x1f,0x25,0x25,0x21,0x26,0x29,0x27,0x21,0x1c,0x1c,0x26,0x23,0x1d,0x22,0x22,0x21,0x22,0x22,0x25,0x1d,0x20,0x22,0x21,0x27,0x20,0x1f,0x20,0x21,0x29,0x19,0x1d,\r\n0x1d,0x2c,0x1b,0x1b,0x27,0x2d,0x1f,0x1b,0x34,0x1c,0x1c,0x26,0x1b,0x1b,0x26,0x1c,0x26,0x29,0x2c,0x1b,0x27,0x1b,0x21,0x1b,0x1f,0x1c,0x20,0x1b,0x1e,0x26,0x1b,0x1f,0x21,0x1b,0x1b,0x1e,0x30,0x1b,0x1b,0x1d,0x1d,0x15,0x11,0x1c,0x1c,0x1c,0x1b,0x1c,0x2c,0x1c,0x2c,0x19,0x1c,0x2c,0x21,0x1c,0x2c,0x25,0x25,0x2c,0x1d,0x1c,0x2c,0x2c,\r\n0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x2c,0x2c,0x1d,0x1c,0x1c,0x2c,0x1e,0x1b,0x1c,0x1c,0x2c,0x27,0x22,0x23,0x23,0x22,0x23,0x1f,0x22,0x27,0x23,0x21,0x1b,0x28,0x22,0x22,0x1d,0x21,0x23,0x25,0x24,0x1d,0x23,0x21,0x24,0x21,0x27,0x23,0x24,0x24,0x22,0x20,0x23,0x22,0x24,0x28,0x21,0x26,0x24,0x05,0x06,0x08,0x0a,0x08,0x0e,0x12,0x2b,0x1c,\r\n0x1f,0x1e,0x1c,0x1f,0x1c,0x1c,0x20,0x1e,0x1c,0x0f,0x2a,0x1d,0x1c,0x1c,0x1b,0x1e,0x1a,0x1d,0x0d,0x1d,0x1a,0x1c,0x15,0x2b,0x1b,0x1c,0x1c,0x1e,0x2a,0x1c,0x1d,0x14,0x2a,0x1d,0x1d,0x22,0x22,0x0b,0x0e,0x39,0x38,0x38,0x39,0x47,0x1b,0x1b,0x0c,0x1b,0x13,0x1b,0x1b,0x1c,0x1b,0x1b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,\r\n0x1b,0x1b,0x1b,0x1b,0x13,0x1b,0x1b,0x1c,0x1b,0x1b,0x1a,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x19,0x19,0x19,0x1d,0x15,0x15,0x1d,0x1f,0x0d,0x10,0x19,0x15,0x26,0x20,0x1f,0x18,0x1f,0x19,0x15,0x16,0x1e,0x1a,0x28,0x19,0x17,0x18,0x23,0x27,0x15,0x1f,0x18,\r\n0x1d,0x1a,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x15,0x15,0x15,0x15,0x0d,0x0d,0x0d,0x0d,0x20,0x1f,0x1f,0x1f,0x1f,0x1f,0x1e,0x1e,0x1e,0x1e,0x17,0x19,0x19,0x19,0x19,0x19,0x1d,0x1d,0x1d,0x15,0x15,0x15,0x15,0x15,0x1d,0x1d,0x19,0x1f,0x1f,0x0d,0x0d,0x0d,0x0d,0x0d,0x1c,0x10,0x19,0x15,0x15,0x15,0x15,0x20,0x20,0x20,0x21,0x1f,0x1f,\r\n0x1f,0x19,0x19,0x19,0x15,0x15,0x15,0x15,0x16,0x16,0x16,0x16,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x28,0x28,0x28,0x28,0x17,0x17,0x17,0x18,0x18,0x18,0x19,0x23,0x1f,0x19,0x19,0x14,0x1b,0x15,0x18,0x1f,0x1f,0x0d,0x19,0x1a,0x26,0x20,0x16,0x1f,0x1f,0x18,0x17,0x16,0x17,0x1f,0x19,0x21,0x20,0x19,0x15,0x1f,0x0d,0x1f,0x17,0x20,0x0d,0x17,\r\n0x15,0x1c,0x14,0x1a,0x15,0x0d,0x0d,0x10,0x29,0x29,0x1f,0x19,0x19,0x1e,0x19,0x18,0x19,0x14,0x1d,0x15,0x25,0x16,0x20,0x20,0x19,0x1c,0x26,0x1f,0x1f,0x1f,0x18,0x19,0x16,0x19,0x1f,0x19,0x20,0x1b,0x28,0x2a,0x1c,0x23,0x19,0x1a,0x2b,0x18,0x14,0x1d,0x1d,0x1f,0x2c,0x2c,0x21,0x19,0x1d,0x15,0x1d,0x1c,0x1c,0x23,0x1a,0x1a,0x22,0x1d,\r\n0x1d,0x12,0x1f,0x1f,0x1d,0x18,0x18,0x2d,0x25,0x18,0x1b,0x1e,0x1e,0x1f,0x1f,0x24,0x22,0x12,0x2f,0x1e,0x1c,0x1d,0x20,0x20,0x19,0x19,0x0d,0x26,0x22,0x22,0x18,0x23,0x0b,0x0b,0x16,0x16,0x0b,0x0b,0x1f,0x14,0x0d,0x26,0x23,0x0e,0x0b,0x0b,0x16,0x13,0x13,0x0b,0x0b,0x0b,0x13,0x22,0x18,0x0f,0x1e,0x22,0x1d,0x1d,0x19,0x25,0x1c,0x1e,\r\n0x11,0x16,0x1b,0x15,0x0b,0x0b,0x14,0x1a,0x11,0x21,0x21,0x21,0x2e,0x26,0x2e,0x0d,0x00,0x00,0x00,0x00,0x00,0x0d,0x26,0x2a,0x11,0x11,0x19,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x19,0x19,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2e,0x2e,0x19,0x19,0x2e,0x2e,0x19,0x19,0x26,0x2a,0x11,\r\n0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x32,0x26,0x2a,0x19,0x1d,0x1d,0x21,0x11,0x21,0x26,0x19,0x19,0x11,0x11,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x2e,0x11,0x26,0x19,0x19,0x0d,0x19,0x19,0x19,0x19,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,\r\n0x1d,0x1d,0x1d,0x1d,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x3a,0x2a,0x3a,0x2a,0x3a,0x2a,0x43,0x32,0x43,0x32,0x2a,0x2a,0x2a,0x32,0x32,0x32,0x32,0x32,0x32,0x26,0x19,0x19,0x26,0x19,0x19,0x2e,0x19,0x36,0x32,0x2e,0x19,0x2a,0x19,0x2a,0x19,0x2a,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x2e,0x19,0x21,\r\n0x21,0x21,0x21,0x21,0x11,0x21,0x21,0x11,0x11,0x21,0x11,0x21,0x11,0x21,0x19,0x1d,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x11,0x11,0x19,0x11,0x11,0x11,0x11,0x00,0x3a,0x2a,0x43,0x32,0x2e,0x19,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x19,0x19,0x15,0x3a,0x2a,0x32,0x32,0x2e,0x2e,0x2e,\r\n0x1d,0x1d,0x1d,0x1d,0x21,0x11,0x21,0x11,0x21,0x11,0x3a,0x2a,0x1d,0x21,0x1d,0x1d,0x1d,0x21,0x1d,0x1d,0x3a,0x3a,0x2a,0x2a,0x15,0x15,0x1d,0x1d,0x1d,0x1d,0x11,0x11,0x11,0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x26,0x2a,0x11,0x11,0x1d,0x1d,0x1d,0x1d,0x2e,0x11,0x2e,0x11,0x1d,0x21,0x1d,0x1d,0x3a,0x3a,0x2a,0x2a,0x3a,0x3a,\r\n0x2a,0x2a,0x2a,0x2a,0x19,0x19,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x00,0x00,0x0d,0x0d,0x11,0x0d,0x00,0x00,0x00,0x2a,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x15,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,0x2e,\r\n0x2e,0x2e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x21,0x21,0x21,0x21,0x21,0x21,0x26,0x21,0x21,0x21,0x21,0x21,0x21,0x1d,0x2a,0x1d,0x2a,0x1d,0x2a,0x1d,0x2a,0x21,0x21,0x21,0x0d,0x0d,0x19,0x15,0x1d,0x20,0x1d,0x1b,0x1c,0x1d,\r\n0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1a,0x17,0x1b,0x1a,0x1d,0x1f,0x1f,0x21,0x1d,0x1c,0x21,0x1a,0x21,0x26,0x20,0x25,0x29,0x20,0x26,0x22,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1b,0x17,0x1b,0x1e,0x1e,0x21,0x1d,0x20,0x1d,0x1e,0x1e,0x1a,0x1a,0x26,0x22,0x23,0x22,0x22,0x1e,0x1d,0x1d,0x25,\r\n0x27,0x26,0x26,0x2e,0x2e,0x23,0x2e,0x2e,0x25,0x2c,0x2a,0x1c,0x26,0x2a,0x26,0x1e,0x2b,0x25,0x23,0x23,0x1e,0x20,0x25,0x28,0x23,0x1f,0x23,0x1d,0x1b,0x2e,0x2e,0x2e,0x29,0x2e,0x2e,0x22,0x2e,0x2e,0x23,0x26,0x27,0x25,0x24,0x24,0x20,0x2c,0x26,0x29,0x24,0x24,0x1d,0x25,0x23,0x23,0x2b,0x26,0x24,0x2d,0x1b,0x19,0x1c,0x1b,0x1f,0x1f,\r\n0x23,0x25,0x1d,0x1c,0x1c,0x1b,0x1c,0x1b,0x1b,0x1c,0x1c,0x1d,0x1c,0x1c,0x1c,0x19,0x1a,0x1e,0x1f,0x1e,0x1e,0x17,0x1c,0x1c,0x1d,0x1e,0x26,0x2a,0x21,0x21,0x1f,0x26,0x20,0x22,0x1a,0x18,0x1d,0x1c,0x18,0x19,0x1b,0x1c,0x18,0x17,0x1f,0x17,0x1b,0x19,0x1b,0x27,0x1c,0x29,0x1b,0x1c,0x1c,0x25,0x10,0x27,0x22,0x24,0x21,0x1c,0x26,0x1e,\r\n0x27,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1d,0x1e,0x1e,0x1e,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x16,0x17,0x16,0x17,0x17,0x17,0x0f,0x10,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x0d,0x1f,0x0d,0x0d,0x0d,0x10,0x10,0x0d,0x0d,0x0d,0x0f,0x0d,0x0d,0x0d,0x2d,0x2d,0x2d,0x2d,0x18,0x25,0x24,0x18,0x14,0x18,0x1a,0x1c,0x18,0x2a,0x29,0x2b,0x16,\r\n0x32,0x18,0x2a,0x2a,0x2a,0x28,0x1c,0x18,0x18,0x27,0x1d,0x27,0x22,0x1b,0x17,0x14,0x33,0x15,0x1b,0x18,0x18,0x18,0x18,0x18,0x44,0x2a,0x2a,0x15,0x0d,0x17,0x0c,0x17,0x0c,0x0c,0x0c,0x18,0x1d,0x1d,0x1b,0x13,0x13,0x0b,0x0b,0x0b,0x13,0x0b,0x15,0x2b,0x0b,0x2d,0x2d,0x2d,0x1d,0x1d,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,0x2a,\r\n0x3a,0x3a,0x21,0x3a,0x3a,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1d,0x17,0x1d,0x17,0x1b,0x15,0x12,0x11,0x22,0x1b,0x24,0x16,0x38,0x2d,0x1e,0x1c,0x2e,0x28,0x2a,0x25,0x33,0x29,0x2e,0x27,0x20,0x18,\r\n0x24,0x1d,0x2e,0x25,0x26,0x1e,0x25,0x1e,0x2b,0x21,0x2c,0x21,0x37,0x2a,0x26,0x1d,0x26,0x1d,0x3d,0x2c,0x28,0x00,0x31,0x31,0x31,0x18,0x00,0x00,0x1d,0x19,0x23,0x1c,0x1b,0x15,0x36,0x2d,0x2f,0x2b,0x24,0x1d,0x23,0x1d,0x1a,0x15,0x25,0x1e,0x1a,0x15,0x29,0x21,0x21,0x1c,0x31,0x29,0x1b,0x1d,0x25,0x25,0x28,0x16,0x0a,0x17,0x22,0x16,\r\n0x32,0x32,0x0c,0x00,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x31,0x14,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x38,0x1b,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x1d,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x1e,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,\r\n0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x2d,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x25,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x2c,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,\r\n0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x28,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x19,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x1c,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x1b,0x24,0x24,0x24,0x24,0x24,0x24,\r\n0x24,0x24,0x24,0x24,0x24,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0x18,0x22,0x24,0x0e,0x0a,0x0e,0x0a,0x24,0x1c,0x25,0x1f,0x1c,0x18,0x1b,0x18,0x1e,0x1d,0x15,0x15,0x38,0x29,0x3a,0x2c,0x31,0x2a,0x2d,0x21,0x2d,0x21,0x2d,0x21,0x1f,0x17,0x1d,0x19,0x1d,0x19,0x1d,0x19,0x1b,0x10,0x18,\r\n0x0c,0x26,0x1d,0x2b,0x22,0x43,0x32,0x1c,0x1d,0x22,0x23,0x28,0x2b,0x26,0x1d,0x31,0x27,0x1b,0x14,0x1c,0x19,0x1f,0x18,0x2f,0x24,0x1f,0x1a,0x1c,0x1d,0x1c,0x1d,0x18,0x14,0x18,0x13,0x18,0x12,0x1a,0x1a,0x0f,0x22,0x10,0x30,0x21,0x11,0x1d,0x1f,0x17,0x26,0x1c,0x13,0x11,0x1d,0x1d,0x1d,0x18,0x0c,0x26,0x1e,0x12,0x11,0x1f,0x17,0x24,\r\n0x13,0x27,0x1e,0x1f,0x17,0x22,0x1d,0x1d,0x19,0x25,0x1c,0x1e,0x11,0x1b,0x15,0x26,0x15,0x1b,0x2b,0x18,0x1c,0x2d,0x0d,0x39,0x2d,0x2d,0x3b,0x2c,0x2e,0x2e,0x2c,0x2c,0x2e,0x1a,0x18,0x1f,0x23,0x2d,0x23,0x2f,0x0c,0x17,0x1d,0x2b,0x33,0x23,0x33,0x1f,0x1f,0x28,0x23,0x39,0x2e,0x1a,0x2e,0x11,0x2e,0x11,0x1d,0x1d,0x1d,0x1d,0x2a,0x2a,\r\n0x2a,0x2a,0x32,0x19,0x19,0x32,0x26,0x19,0x19,0x26,0x21,0x11,0x11,0x21,0x1d,0x1d,0x1d,0x1d,0x26,0x11,0x11,0x2a,0x26,0x11,0x11,0x2a,0x15,0x15,0x19,0x19,0x1a,0x1a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4d,0x1a,0x14,0x1c,0x1a,\r\n0x25,0x1d,0x1d,0x2c,0x21,0x25,0x26,0x2a,0x29,0x1d,0x19,0x32,0x28,0x34,0x2b,0x22,0x1d,0x10,0x10,0x1d,0x20,0x14,0x1e,0x1a,0x1d,0x18,0x25,0x28,0x14,0x1d,0x15,0x0b,0x13,0x1b,0x1c,0x0b,0x0b,0x09,0x0b,0x13,0x13,0x13,0x16,0x4a,0x64,0x11,0x15,0x07,0x0d,0x13,0x16,0x10,0x19,0x1a,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,0x13,\r\n0x18,0x18,0x18,0x18,0x18,0x42,0x1b,0x26,0x2e,0x2d,0x20,0x17,0x1c,0x24,0x25,0x18,0x10,0x21,0x1a,0x22,0x1c,0x21,0x1b,0x1b,0x25,0x1e,0x1d,0x1a,0x25,0x1f,0x2a,0x17,0x1a,0x20,0x10,0x1d,0x11,0x11,0x0c,0x2c,0x1d,0x1c,0x1a,0x1a,0x1d,0x2e,0x2e,0x2f,0x32,0x32,0x1b,0x19,0x0e,0x19,0x17,0x1e,0x17,0x21,0x0c,0x1c,0x1e,0x2b,0x2b,0x1f,\r\n0x1b,0x1d,0x1b,0x1a,0x17,0x1a,0x17,0x18,0x0f,0x11,0x0c,0x0b,0x12,0x1d,0x20,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x10,0x10,0x00,0x0e,0x0e,0x0e,0x0d,0x0d,0x54,0x32,0x2c,0x34,0x0e,0x0e,0x10,0x14,0x0d,0x0d,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x0e,0x00,0x2e,0x11,0x11,0x2e,0x0d,0x19,\r\n0x19,0x43,0x32,0x32,0x43,0x2e,0x19,0x19,0x2e,0x19,0x19,0x15,0x15,0x00,0x00,0x12,0x25,0x1e,0x24,0x1d,0x3f,0x34,0x23,0x1b,0x23,0x1b,0x43,0x32,0x26,0x1d,0x13,0x10,0x1f,0x00,0x22,0x1b,0x11,0x0f,0x08,0x19,0x11,0x11,0x0d,0x0a,0x17,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x12,0x0b,0x1a,0x15,0x1e,0x1d,0x1b,0x30,0x28,0x28,0x27,0x29,\r\n0x2f,0x1f,0x22,0x1e,0x14,0x2e,0x38,0x16,0x3a,0x19,0x2a,0x2e,0x2e,0x2e,0x15,0x26,0x32,0x26,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x00,0x1d,0x1d,0x1d,0x2a,0x19,0x19,0x2e,0x11,0x11,0x2e,0x11,0x11,0x2e,0x19,0x19,0x00,0x15,0x2a,0x11,0x11,0x32,0x19,0x19,0x26,0x19,0x19,0x21,0x0f,0x0f,\r\n0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x4b,0x4b,0x2c,0x00,0x00,0x2c,0x2c,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x15,0x21,0x1f,0x20,0x20,0x2c,0x20,0x20,0x28,0x31,0x21,0x20,0x35,0x20,0x20,0x2f,0x20,0x22,0x28,0x20,0x26,0x2a,0x2e,0x20,0x26,0x20,0x23,0x1f,0x23,\r\n0x1f,0x21,0x22,0x1f,0x27,0x1e,0x21,0x27,0x1f,0x1f,0x1c,0x27,0x20,0x20,0x20,0x23,0x16,0x1a,0x20,0x27,0x27,0x1b,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x14,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x04,0x1c,0xd0,0x00,0x00,0x01,0x42,0x01,0x00,0x00,0x07,0x00,0x42,0x00,0x0d,0x00,0x7e,0x03,0x77,\r\n0x03,0x7f,0x03,0x8a,0x03,0x8c,0x03,0xa1,0x05,0x2f,0x05,0x56,0x05,0x5f,0x05,0x87,0x05,0x8a,0x05,0x8f,0x05,0xc7,0x05,0xea,0x05,0xf4,0x06,0x1c,0x06,0xff,0x07,0x7f,0x07,0xc9,0x08,0xb4,0x08,0xbd,0x08,0xff,0x09,0x6f,0x09,0xef,0x09,0xf3,0x0a,0x6f,0x0a,0xef,0x0a,0xf1,0x0b,0x6f,0x0b,0xef,0x0b,0xf9,0x0c,0x6f,0x0c,0xef,0x0d,0x6f,\r\n0x0e,0x3f,0x0e,0x59,0x0e,0xd9,0x0f,0x29,0x10,0x49,0x10,0xc5,0x10,0xc7,0x10,0xcd,0x10,0xff,0x17,0xdb,0x17,0xe9,0x18,0x19,0x19,0xda,0x1c,0xbf,0x1d,0xca,0x1f,0x15,0x1f,0x1d,0x1f,0x45,0x1f,0x4d,0x1f,0x57,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x7d,0x1f,0xb4,0x1f,0xc4,0x1f,0xd3,0x1f,0xdb,0x1f,0xef,0x1f,0xf4,0x1f,0xfe,0x20,0x22,\r\n0x20,0x26,0x20,0x30,0x20,0x34,0x20,0x3a,0x20,0x3e,0x20,0x44,0x20,0x5f,0x20,0x71,0x20,0x8e,0x20,0x9c,0x20,0xbf,0x20,0xe3,0x20,0xf0,0x21,0x05,0x21,0x13,0x21,0x17,0x21,0x22,0x21,0x26,0x21,0x2e,0x21,0x33,0x21,0x4e,0x21,0x5f,0x21,0x6f,0x21,0x89,0x21,0x94,0x21,0x97,0x21,0x99,0x22,0x02,0x22,0x06,0x22,0x0f,0x22,0x12,0x22,0x15,\r\n0x22,0x1a,0x22,0x1f,0x22,0x29,0x22,0x2b,0x22,0x34,0x22,0x36,0x22,0x48,0x22,0x61,0x22,0x65,0x22,0xf2,0x24,0xff,0x25,0xa1,0x25,0xac,0x25,0xb2,0x25,0xba,0x25,0xbc,0x25,0xc4,0x25,0xcc,0x25,0xcf,0x25,0xd9,0x25,0xe6,0x26,0x61,0x26,0x63,0x26,0x66,0x26,0x6f,0x27,0x7f,0x2c,0x7f,0x2d,0x25,0x2d,0x27,0x2d,0x2d,0x2d,0xff,0x2e,0x17,\r\n0x2e,0x3b,0xa4,0xff,0xa6,0x29,0xa6,0x9f,0xa7,0xae,0xa7,0xb7,0xa7,0xff,0xab,0x65,0xfb,0x06,0xfb,0x17,0xfb,0x36,0xfb,0x3c,0xfb,0x3e,0xfb,0x41,0xfb,0x44,0xfb,0xc1,0xfb,0xff,0xfc,0x63,0xfc,0xf4,0xfd,0x3f,0xfd,0xf2,0xfd,0xf4,0xfd,0xfd,0xfe,0x23,0xfe,0x58,0xfe,0x74,0xfe,0xfc,0xfe,0xff,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x0d,\r\n0x00,0x20,0x00,0xa0,0x03,0x7a,0x03,0x84,0x03,0x8c,0x03,0x8e,0x03,0xa3,0x05,0x31,0x05,0x59,0x05,0x61,0x05,0x89,0x05,0x8d,0x05,0x91,0x05,0xd0,0x05,0xef,0x06,0x00,0x06,0x1e,0x07,0x50,0x07,0xc0,0x08,0xa0,0x08,0xb6,0x08,0xd4,0x09,0x66,0x09,0xe6,0x09,0xf2,0x0a,0x66,0x0a,0xe6,0x0a,0xf1,0x0b,0x66,0x0b,0xe6,0x0b,0xf9,0x0c,0x66,\r\n0x0c,0xe6,0x0d,0x66,0x0e,0x3f,0x0e,0x50,0x0e,0xd0,0x0f,0x20,0x10,0x40,0x10,0xa0,0x10,0xc7,0x10,0xcd,0x10,0xd0,0x17,0xdb,0x17,0xe0,0x18,0x10,0x19,0xd0,0x1c,0x90,0x1d,0x00,0x1d,0xfe,0x1f,0x18,0x1f,0x20,0x1f,0x48,0x1f,0x50,0x1f,0x59,0x1f,0x5b,0x1f,0x5d,0x1f,0x5f,0x1f,0x80,0x1f,0xb6,0x1f,0xc6,0x1f,0xd6,0x1f,0xdd,0x1f,0xf2,\r\n0x1f,0xf6,0x20,0x00,0x20,0x26,0x20,0x28,0x20,0x32,0x20,0x39,0x20,0x3c,0x20,0x44,0x20,0x5e,0x20,0x70,0x20,0x74,0x20,0x90,0x20,0xa0,0x20,0xe3,0x20,0xf0,0x21,0x05,0x21,0x13,0x21,0x16,0x21,0x22,0x21,0x26,0x21,0x2e,0x21,0x33,0x21,0x4d,0x21,0x50,0x21,0x6c,0x21,0x7a,0x21,0x90,0x21,0x97,0x21,0x99,0x22,0x02,0x22,0x06,0x22,0x0f,\r\n0x22,0x11,0x22,0x15,0x22,0x19,0x22,0x1e,0x22,0x29,0x22,0x2b,0x22,0x34,0x22,0x36,0x22,0x48,0x22,0x60,0x22,0x64,0x22,0xf2,0x24,0xff,0x25,0xa0,0x25,0xaa,0x25,0xb2,0x25,0xba,0x25,0xbc,0x25,0xc4,0x25,0xca,0x25,0xcf,0x25,0xd8,0x25,0xe6,0x26,0x60,0x26,0x63,0x26,0x65,0x26,0x6f,0x27,0x76,0x2c,0x60,0x2d,0x00,0x2d,0x27,0x2d,0x2d,\r\n0x2d,0xe0,0x2e,0x17,0x2e,0x32,0xa4,0xd0,0xa6,0x20,0xa6,0x40,0xa7,0x00,0xa7,0xb0,0xa7,0xf7,0xab,0x30,0xfb,0x00,0xfb,0x13,0xfb,0x1d,0xfb,0x38,0xfb,0x3e,0xfb,0x40,0xfb,0x43,0xfb,0x46,0xfb,0xd3,0xfc,0x5e,0xfc,0xf2,0xfd,0x3c,0xfd,0xf2,0xfd,0xf4,0xfd,0xfa,0xfe,0x20,0xfe,0x58,0xfe,0x70,0xfe,0x76,0xfe,0xff,0xff,0xfc,0xff,0xff,\r\n0xff,0xf5,0xff,0xe3,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x19,0x00,0x00,0x00,0x00,0x07,0x2a,0x07,0x28,0x07,0x27,0x07,0x26,0x00,0x00,0x00,0x00,0x05,0x98,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x0c,0x00,0x00,0x0b,0x9f,0x00,0x00,0x06,0x70,0x05,0xfa,0x0a,0x5b,0x05,0x84,0x05,0x0e,0x09,0x5e,0x04,0x98,0x04,0x22,0x08,0x57,\r\n0x03,0xac,0x03,0x36,0x02,0xc0,0xfa,0x4d,0x01,0xe0,0x01,0x6a,0x01,0x24,0x00,0x0e,0xfb,0x42,0xfe,0xfe,0xfe,0xf9,0x00,0x00,0xfc,0x76,0xf8,0x82,0xf8,0x5c,0xf6,0xa6,0xf8,0x1f,0x00,0x00,0x00,0x00,0xe4,0x77,0xe4,0x75,0xe4,0x73,0xe4,0x71,0xe4,0x70,0xe4,0x6f,0xe4,0x6e,0xe4,0x6d,0xe4,0x6b,0xe4,0x6a,0xe4,0x69,0xe4,0x67,0xe4,0x66,\r\n0xe4,0x64,0xe4,0x63,0x00,0x00,0xe0,0x86,0x00,0x00,0x00,0x00,0xe0,0x85,0x00,0x00,0xe0,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xaa,0xea,0x32,0xe0,0x39,0xe0,0x2c,0x00,0x00,0xdf,0x6b,0xdf,0x79,0xe0,0x69,0xf3,0x1f,0xe9,0x97,0x00,0x00,0xf1,0x80,0x00,0x00,0xe9,0x9c,0xef,0xeb,0xef,0xea,0xde,0x97,0xe9,0x2b,\r\n0xde,0x8c,0x00,0x00,0xde,0xa7,0x00,0x00,0x00,0x00,0xe9,0x0a,0xde,0x71,0xe9,0x00,0xee,0xc4,0xde,0x60,0x00,0x00,0xde,0x31,0xe8,0x43,0xe3,0x83,0x00,0x00,0x00,0x00,0xe5,0x86,0xe5,0x7f,0xe5,0x7e,0xe5,0x77,0x00,0x00,0xdb,0x74,0xe5,0x65,0xdb,0x5e,0x00,0x00,0xe4,0xdd,0xe4,0xdc,0xeb,0x1a,0x00,0x00,0x00,0x00,0xdf,0x35,0xe2,0xa3,\r\n0xe2,0x9e,0xe3,0x30,0xda,0x43,0xe5,0x3b,0x68,0xf2,0x6a,0x61,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x9e,0x00,0x00,0x10,0x6c,0x10,0x6b,0x10,0x6a,0x10,0x69,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xf8,0x00,0x00,0x0c,0x71,0x15,0xfb,0x00,0x00,0x09,0x1a,0x14,0xa7,0x15,0x83,0x00,0x00,0x0c,0x0c,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x3e,0x06,0xec,0x06,0xf6,0x00,0x00,0x07,0x00,0x07,0x26,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x36,0x0a,0x3a,0x00,0x00,0x0a,0xa4,0x0a,0xae,0x0a,0xe6,0x0c,0xa8,0x00,0x00,0x0d,0x04,0x00,0x00,0x0d,0x2a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0d,0xac,0x0f,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x11,0x50,0x00,0x00,0x11,0x92,0x11,0xa2,0x00,0x00,0x11,0xa4,0x00,0x00,0x11,0xa6,0x11,0xa8,0x11,0xaa,0x11,0xde,0x11,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x24,0x00,0x00,0x12,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x12,0x52,0x00,0x00,0x12,0x52,0x12,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x4c,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x48,0x12,0x4a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x40,0x12,0x52,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x80,0x13,0x3e,0x14,0x9a,0x14,0xa8,0x14,0xb8,0x15,0x22,0x00,0x00,0x15,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x15,0x56,0x16,0x4c,0x16,0xa4,0x00,0x00,0x16,0xac,0x00,0x00,0x00,0x00,0x16,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xae,0x00,0x00,\r\n0x17,0xb8,0x00,0x00,0x00,0xa3,0x00,0xa4,0x00,0x84,0x00,0x85,0x02,0x3f,0x00,0x97,0x00,0xe7,0x00,0x86,0x00,0x8f,0x00,0x8c,0x00,0x9d,0x00,0xaa,0x00,0xa5,0x00,0x8a,0x00,0x8b,0x01,0x01,0x00,0x83,0x00,0x94,0x08,0x96,0x08,0x97,0x00,0x8e,0x00,0x98,0x00,0x88,0x00,0xc3,0x00,0xdd,0x08,0x98,0x00,0x9e,0x00,0xab,0x00,0xf4,0x00,0xf3,\r\n0x00,0xf5,0x00,0xa2,0x00,0xad,0x00,0xc9,0x00,0xc7,0x00,0xae,0x00,0x62,0x00,0x63,0x00,0x91,0x00,0x64,0x00,0xcb,0x00,0x65,0x00,0xc8,0x00,0xca,0x00,0xcf,0x00,0xcc,0x00,0xcd,0x00,0xce,0x00,0xe8,0x00,0x66,0x00,0xd2,0x00,0xd0,0x00,0xd1,0x00,0xaf,0x00,0x67,0x00,0xef,0x00,0x92,0x00,0xd5,0x00,0xd3,0x00,0xd4,0x00,0x68,0x00,0xea,\r\n0x00,0xec,0x00,0x89,0x00,0x6a,0x00,0x69,0x00,0x6b,0x00,0x6d,0x00,0x6c,0x00,0x6e,0x00,0xa0,0x00,0x6f,0x00,0x71,0x00,0x70,0x00,0x72,0x00,0x73,0x00,0x75,0x00,0x74,0x00,0x76,0x00,0x77,0x00,0xe9,0x00,0x78,0x00,0x7a,0x00,0x79,0x00,0x7b,0x00,0x7d,0x00,0x7c,0x00,0xb8,0x00,0xa1,0x00,0x7f,0x00,0x7e,0x00,0x80,0x00,0x81,0x00,0xeb,\r\n0x00,0xed,0x00,0xba,0x01,0x45,0x01,0x46,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x00,0xfc,0x00,0xfd,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x00,0xfe,0x00,0xff,0x01,0x07,0x01,0x08,0x01,0x09,0x01,0x00,0x01,0x4b,0x01,0x4c,0x01,0x4d,0x01,0x4e,0x01,0x4f,0x01,0x50,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x01,0x51,0x01,0x52,\r\n0x00,0xf7,0x00,0xf8,0x01,0x53,0x01,0x54,0x01,0x55,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x5a,0x01,0x5b,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x00,0xf9,0x00,0xd6,0x01,0x39,0x01,0x3a,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x01,0x0e,0x01,0x0f,0x01,0x68,0x01,0x69,0x01,0x10,\r\n0x01,0x11,0x01,0x12,0x01,0x13,0x00,0xe1,0x00,0xe2,0x01,0x14,0x01,0x15,0x01,0x6a,0x01,0x6b,0x01,0x16,0x01,0x17,0x01,0x3b,0x01,0x6c,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,0x01,0x18,0x01,0x19,0x00,0xb0,0x00,0xb1,0x01,0x1a,0x01,0x1b,0x01,0x72,0x01,0x73,0x01,0x1c,0x01,0x1d,0x01,0x1e,0x01,0x1f,0x01,0x74,0x01,0x75,\r\n0x00,0xfa,0x00,0xfb,0x00,0xe3,0x00,0xe4,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x7a,0x01,0x7b,0x01,0x7c,0x01,0x7d,0x01,0x24,0x01,0x25,0x01,0x26,0x01,0x27,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x00,0xbb,0x01,0x28,0x01,0x29,0x01,0x2a,0x01,0x2b,0x00,0xe5,\r\n0x00,0xe6,0x01,0x84,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,0x02,0xcd,0x04,0xbf,0x04,0xc0,0x00,0xa7,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc7,0x04,0xc8,0x04,0xc9,0x04,0xca,0x04,0xcb,\r\n0x04,0xcc,0x04,0xcd,0x02,0x40,0x02,0x41,0x04,0xce,0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x02,0x42,0x02,0x43,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,0x04,0xe7,\r\n0x04,0xe8,0x04,0xe9,0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x04,0xee,0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,0x05,0x07,\r\n0x05,0x08,0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88,\r\n0x01,0x89,0x01,0x8a,0x05,0x24,0x05,0x25,0x05,0x26,0x05,0x27,0x05,0x28,0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x02,0x3d,0x02,0x3e,0x02,0xaf,0x02,0xb0,0x05,0x3c,0x05,0x3d,\r\n0x05,0x3e,0x05,0x3f,0x05,0x40,0x07,0x3e,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,0x02,0xe1,0x02,0xe2,0x05,0x47,0x05,0x48,0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,0x05,0x4f,0x05,0x50,0x07,0x3f,0x07,0x40,0x07,0x41,0x06,0xac,0x07,0xe1,0x07,0xe2,0x07,0xe4,0x07,0xe5,0x07,0xe6,0x07,0xe7,\r\n0x07,0xe8,0x07,0xe9,0x07,0xea,0x07,0xeb,0x0a,0xbf,0x0a,0xc0,0x0a,0xc1,0x0a,0xc2,0x0a,0xc3,0x0a,0xc4,0x0a,0xc5,0x0a,0xc6,0x0a,0xc7,0x0a,0xc8,0x0a,0xc9,0x0a,0xca,0x0a,0xcb,0x0a,0xcc,0x05,0x56,0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,0x02,0xce,0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62,\r\n0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,0x05,0x67,0x05,0x68,0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82,\r\n0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,0x05,0x87,0x05,0x88,0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2,\r\n0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,0x05,0xa7,0x05,0xa8,0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x07,0x42,0x07,0x43,0x06,0x76,0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c,0x06,0x7d,0x06,0x7e,0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83,\r\n0x06,0x84,0x06,0x85,0x06,0x86,0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x00,0xd7,0x00,0xe0,0x06,0x8c,0x00,0xd9,0x06,0x8d,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x00,0xda,0x00,0xdb,0x00,0xdc,0x00,0xdf,0x00,0xd8,0x00,0xde,\r\n0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x07,0x44,0x07,0x45,0x07,0x46,0x07,0x47,0x07,0x48,0x07,0x49,0x07,0x4a,0x07,0x4b,0x07,0x4c,0x07,0x4d,0x07,0x4e,0x07,0x4f,0x07,0x50,0x07,0x51,0x07,0x52,\r\n0x07,0x53,0x07,0x54,0x02,0x46,0x02,0x47,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,0x04,0x67,0x04,0x68,0x02,0x44,0x04,0x69,0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c,\r\n0x04,0x7d,0x04,0x7e,0x04,0x7f,0x04,0x80,0x04,0x81,0x02,0x45,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,0x04,0x87,0x04,0x88,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b,\r\n0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,0x04,0xa7,0x04,0xa8,0x04,0xa9,0x04,0xaa,0x04,0xab,0x04,0xac,0x07,0x39,0x07,0x55,0x07,0x56,0x07,0x57,0x07,0x58,0x07,0x59,0x07,0x5a,0x07,0x5b,0x07,0x5c,0x07,0xec,0x07,0xed,0x07,0xee,0x07,0xef,0x07,0xf0,0x07,0x5d,\r\n0x07,0x5e,0x07,0x5f,0x04,0xad,0x04,0xae,0x04,0xaf,0x06,0x66,0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x13,0x46,0x13,0x47,0x13,0x48,0x13,0x49,0x06,0x73,0x06,0x74,0x13,0x4a,0x13,0x4b,0x06,0x75,0x0a,0xcd,0x0a,0xce,0x0a,0xcf,0x01,0x9e,0x14,0x19,\r\n0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0x8b,0x01,0xa2,0x01,0xa3,0x01,0xa4,0x01,0xa6,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0x2c,0x00,0xa9,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0x2d,0x01,0xae,0x01,0xaf,0x01,0xb0,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0x2e,0x01,0xba,\r\n0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x01,0xc3,0x01,0x2f,0x01,0xc4,0x01,0xc5,0x01,0x30,0x01,0x31,0x01,0xc6,0x01,0xc7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x01,0xcd,0x01,0xce,0x01,0xcf,0x02,0x37,0x01,0xd0,0x01,0xd1,0x01,0x32,0x01,0x33,0x01,0xd2,0x01,0x34,0x01,0xd3,\r\n0x01,0xd4,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,0x01,0xd9,0x01,0xda,0x13,0x4c,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,0x05,0xc7,0x05,0xc8,0x05,0xc9,0x05,0xca,\r\n0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,0x05,0xd7,0x05,0xd8,0x05,0xd9,0x07,0x60,0x07,0x61,0x08,0xc0,0x08,0xc1,0x08,0xc2,0x07,0xf1,0x07,0xf2,0x07,0xf3,0x07,0xf4,0x02,0xb1,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x02,0xb5,0x01,0xe0,\r\n0x02,0xb6,0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x02,0xb3,0x01,0xe5,0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe9,0x01,0xea,0x01,0xeb,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x01,0xf0,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x01,0xf6,0x01,0xf7,0x01,0xf8,0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd,0x01,0xfe,\r\n0x01,0xff,0x02,0x00,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d,0x02,0x1e,\r\n0x02,0x1f,0x02,0x20,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0xb2,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0xb7,0x02,0x2c,0x02,0xb8,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0xb4,0x02,0x31,0x02,0x32,0x05,0xda,0x05,0xdb,0x05,0xdc,0x05,0xdd,0x05,0xde,0x05,0xdf,0x05,0xe0,0x05,0xe1,\r\n0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc,0x05,0xfd,0x05,0xfe,0x05,0xff,0x06,0x00,0x0b,0x1c,\r\n0x06,0x01,0x06,0x02,0x08,0xb4,0x08,0xb5,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,0x02,0x33,0x02,0x34,0x02,0xb9,0x02,0xba,0x06,0x07,0x06,0x08,0x02,0xbb,0x02,0xbc,0x06,0x09,0x06,0x0a,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x02,0xc1,0x02,0xc2,0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12,\r\n0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,0x06,0x17,0x06,0x18,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x06,0x1d,0x06,0x1e,0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x08,0xb6,0x08,0xb7,0x06,0x26,\r\n0x06,0x27,0x08,0xb8,0x08,0xb9,0x06,0x28,0x06,0x29,0x08,0xba,0x08,0xbb,0x0a,0xd0,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c,0x06,0x3d,0x06,0x3e,0x06,0x3f,0x06,0x40,0x06,0x41,\r\n0x02,0xcf,0x02,0xd0,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x07,0xf5,0x07,0xf6,0x06,0x4e,0x06,0x4f,0x0a,0xd1,0x0a,0xd2,0x0a,0xd3,0x0a,0xd4,0x0a,0xd5,0x0a,0xd6,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,0x06,0x57,\r\n0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c,0x06,0x5d,0x06,0x5e,0x06,0x5f,0x0a,0xd7,0x0a,0xd8,0x0a,0xd9,0x0a,0xda,0x13,0x4d,0x13,0x4e,0x13,0x4f,0x13,0x50,0x13,0x51,0x13,0x52,0x0b,0x1d,0x0b,0x1e,0x0b,0x1f,0x0b,0x20,0x13,0x53,0x13,0x54,0x13,0x55,0x13,0x56,0x13,0x57,0x13,0x58,0x14,0x1a,0x14,0x1b,0x13,0x59,0x13,0x5a,\r\n0x14,0x1c,0x14,0x1d,0x14,0x1e,0x14,0x1f,0x14,0x20,0x14,0x21,0x14,0x22,0x14,0x23,0x11,0x8a,0x11,0x8b,0x0f,0xc4,0x0b,0xbf,0x0b,0xc0,0x0b,0xc1,0x0b,0xc2,0x0b,0xc3,0x0b,0xc4,0x0b,0xc5,0x0b,0xc6,0x0b,0xc7,0x0b,0xc8,0x0b,0xc9,0x0b,0xca,0x0b,0xcb,0x0b,0xcc,0x0b,0xcd,0x0b,0xce,0x0b,0xcf,0x0b,0xd0,0x0b,0xd1,0x0b,0xd2,0x0b,0xd3,\r\n0x0b,0xd4,0x0b,0xd5,0x0b,0xd6,0x0b,0xd7,0x0b,0xd8,0x0b,0xd9,0x0b,0xda,0x0b,0xdb,0x0b,0xdc,0x0b,0xdd,0x0b,0x53,0x0b,0x54,0x0b,0x55,0x0b,0x56,0x0b,0x57,0x0b,0x58,0x0b,0x59,0x0b,0x5a,0x0b,0x5b,0x0b,0x5c,0x0b,0xde,0x0b,0x5d,0x0b,0x5e,0x0b,0x5f,0x0b,0x60,0x0b,0x61,0x0b,0x62,0x0b,0x63,0x0b,0x64,0x0b,0x65,0x0b,0x66,0x0b,0x67,\r\n0x0b,0xdf,0x0b,0xb9,0x14,0xdf,0x0b,0x83,0x0b,0x84,0x0b,0x85,0x0b,0x86,0x0b,0x87,0x0a,0x44,0x0a,0x45,0x0a,0x46,0x0a,0x47,0x13,0x45,0x14,0x03,0x0e,0x13,0x0e,0x14,0x0e,0x16,0x0e,0x17,0x0e,0x18,0x0a,0x6a,0x08,0xf8,0x0a,0x49,0x0a,0x48,0x0a,0x4a,0x0a,0x4b,0x0a,0x4c,0x0a,0x4d,0x0a,0x4e,0x0a,0x4f,0x0a,0x53,0x0e,0x1a,0x0e,0x1b,\r\n0x0e,0x1c,0x0e,0x1d,0x0e,0x1e,0x09,0x05,0x13,0x92,0x0a,0x6b,0x09,0x06,0x0e,0x20,0x09,0x07,0x09,0x08,0x09,0x09,0x09,0x0a,0x09,0x0b,0x09,0x0c,0x09,0x0d,0x09,0x0e,0x09,0x0f,0x09,0x10,0x09,0x11,0x09,0x12,0x09,0x13,0x09,0x14,0x09,0x15,0x09,0x16,0x09,0x17,0x09,0x18,0x09,0x19,0x09,0x1a,0x09,0x1b,0x09,0x1c,0x09,0x1d,0x09,0x1e,\r\n0x09,0x1f,0x09,0x20,0x0e,0x3f,0x0e,0x43,0x0e,0x47,0x0e,0x4b,0x0e,0x4f,0x09,0x21,0x09,0x22,0x09,0x23,0x09,0x24,0x09,0x25,0x09,0x26,0x09,0x27,0x09,0x28,0x09,0x29,0x09,0x2a,0x09,0x2b,0x09,0x2c,0x09,0x2d,0x09,0x2e,0x09,0x2f,0x09,0x30,0x09,0x31,0x09,0x32,0x09,0x33,0x09,0x37,0x09,0x7e,0x09,0x7f,0x0a,0x50,0x0a,0x51,0x0a,0x52,\r\n0x0a,0x6c,0x0a,0x6d,0x0a,0x6e,0x0a,0x6f,0x0a,0x70,0x0a,0x71,0x09,0x77,0x08,0xd7,0x08,0xd8,0x08,0xd9,0x08,0xda,0x08,0xdb,0x08,0xdc,0x08,0xdd,0x08,0xde,0x08,0xdf,0x08,0xe0,0x09,0x6a,0x09,0x03,0x0e,0x6d,0x09,0x6b,0x09,0x3e,0x09,0x7c,0x09,0x73,0x09,0x80,0x09,0x82,0x09,0x84,0x0e,0x73,0x09,0x86,0x09,0x88,0x09,0x89,0x09,0x8a,\r\n0x09,0x5b,0x09,0x8c,0x09,0x8e,0x09,0x90,0x09,0x92,0x09,0x40,0x09,0x94,0x09,0x96,0x09,0x98,0x09,0x9b,0x09,0x9e,0x09,0xa1,0x09,0xa4,0x09,0x42,0x09,0xa7,0x09,0x5d,0x09,0xaa,0x09,0xab,0x09,0xac,0x09,0xad,0x09,0xae,0x09,0xaf,0x09,0xb0,0x09,0xb1,0x09,0x5e,0x09,0xb2,0x09,0xb3,0x09,0xb4,0x09,0xb5,0x09,0xb6,0x09,0xb7,0x09,0x45,\r\n0x09,0xb8,0x09,0xb9,0x09,0xbb,0x09,0xbd,0x09,0xbf,0x09,0xc1,0x09,0xc3,0x09,0xc4,0x09,0xc8,0x09,0xc9,0x09,0xcc,0x09,0x6c,0x09,0xcf,0x09,0xd2,0x09,0xd5,0x09,0xd6,0x09,0x46,0x09,0xd7,0x09,0xd9,0x09,0xdb,0x09,0xdd,0x09,0xdf,0x09,0x48,0x09,0xe1,0x09,0xe3,0x09,0xe5,0x09,0xe7,0x09,0xe9,0x09,0xeb,0x09,0xed,0x09,0xef,0x09,0xf1,\r\n0x09,0xf3,0x09,0x5f,0x09,0xf5,0x09,0xf6,0x09,0xf8,0x08,0xf1,0x09,0xfa,0x09,0x4e,0x09,0x60,0x09,0x63,0x09,0x64,0x09,0xfd,0x09,0xfe,0x09,0xff,0x0a,0x00,0x0a,0x01,0x0a,0x02,0x0a,0x03,0x0a,0x04,0x09,0x4a,0x0a,0x05,0x0a,0x07,0x0a,0x0a,0x0a,0x0b,0x0a,0x0d,0x09,0x65,0x09,0x67,0x09,0x69,0x0b,0x19,0x09,0x74,0x0a,0x0f,0x0a,0x10,\r\n0x09,0x75,0x0a,0x11,0x0a,0x12,0x0a,0x13,0x0a,0x14,0x0a,0x15,0x0a,0x16,0x0a,0x17,0x0a,0x18,0x0a,0x19,0x0a,0x1a,0x0a,0x1b,0x0a,0x1c,0x0a,0x1d,0x0a,0x1e,0x0a,0x1f,0x0a,0x20,0x0a,0x21,0x0a,0x22,0x0e,0xeb,0x0a,0x23,0x0a,0x54,0x0a,0x56,0x09,0x4f,0x09,0x50,0x09,0x51,0x09,0x52,0x09,0x53,0x09,0x54,0x09,0x55,0x09,0x56,0x09,0x57,\r\n0x09,0x58,0x0a,0x24,0x0a,0x26,0x0a,0x28,0x0a,0x2c,0x0a,0x2d,0x0a,0x58,0x0a,0x72,0x0a,0x74,0x0a,0x76,0x0a,0x78,0x0a,0x7a,0x0a,0x7c,0x0a,0x7e,0x0a,0x80,0x0a,0x83,0x0a,0x86,0x0a,0x87,0x0a,0x88,0x0a,0x89,0x0a,0x8b,0x0a,0x8f,0x0a,0x93,0x0a,0x97,0x0a,0x9a,0x0a,0x9d,0x0a,0xa0,0x0a,0xa3,0x0a,0xa6,0x0a,0xa8,0x0a,0xaa,0x0a,0xac,\r\n0x0a,0xae,0x0a,0xb0,0x0a,0xb4,0x0a,0xb5,0x0a,0xb6,0x0f,0x16,0x0f,0x1a,0x0f,0x1e,0x0f,0x22,0x0f,0x24,0x0f,0x28,0x0f,0x2a,0x0f,0x2c,0x0f,0x30,0x0f,0x34,0x0f,0x38,0x0f,0x3a,0x0f,0x3c,0x0f,0x3e,0x0f,0x40,0x0f,0x44,0x0f,0x48,0x0f,0x4c,0x13,0x02,0x14,0x04,0x13,0x04,0x13,0x08,0x13,0x0c,0x13,0x10,0x13,0x14,0x13,0x18,0x13,0x1c,\r\n0x13,0x20,0x13,0x24,0x13,0x26,0x13,0x28,0x14,0x08,0x14,0x09,0x14,0x0b,0x14,0x0f,0x14,0x13,0x14,0x15,0x14,0x53,0x14,0x54,0x14,0x5d,0x14,0x5e,0x14,0x5f,0x14,0x60,0x14,0x61,0x14,0x62,0x14,0x63,0x14,0x64,0x14,0x65,0x14,0x66,0x14,0x67,0x14,0x68,0x14,0x69,0x14,0x6a,0x14,0x6b,0x14,0x6c,0x13,0x2a,0x13,0x2b,0x13,0x2c,0x13,0x2d,\r\n0x13,0x2e,0x13,0x2f,0x13,0x30,0x13,0x31,0x13,0x32,0x13,0x33,0x13,0x34,0x13,0x35,0x13,0x36,0x13,0x37,0x13,0x38,0x13,0x39,0x13,0x3a,0x13,0x3b,0x13,0x3c,0x13,0x3d,0x13,0x3e,0x13,0x3f,0x13,0x40,0x13,0x41,0x13,0x42,0x13,0x43,0x13,0x44,0x14,0x17,0x0c,0x08,0x0c,0x09,0x0c,0x0a,0x0c,0x0b,0x0c,0x0c,0x0c,0x0d,0x0c,0x0e,0x0c,0x0f,\r\n0x0c,0x10,0x0c,0x11,0x0c,0x12,0x0c,0x13,0x0c,0x14,0x0c,0x15,0x0c,0x16,0x0c,0x17,0x0c,0x18,0x0c,0x19,0x0c,0x1a,0x0c,0x1b,0x0c,0x1c,0x0c,0x1d,0x0c,0x1e,0x0c,0x1f,0x0c,0x20,0x0c,0x21,0x0c,0x22,0x0c,0x23,0x0c,0x24,0x0c,0x25,0x0c,0x26,0x0c,0x27,0x0c,0x28,0x0c,0x29,0x0c,0x2a,0x0c,0x2b,0x0c,0x2c,0x0c,0x2d,0x0c,0x2e,0x0c,0x2f,\r\n0x0c,0x30,0x0c,0x31,0x0c,0x32,0x0c,0x33,0x0c,0x34,0x0f,0xc7,0x0f,0xc8,0x0f,0xc9,0x07,0x62,0x07,0x63,0x07,0x64,0x07,0x65,0x07,0x66,0x07,0x67,0x07,0x68,0x07,0x69,0x07,0x6a,0x07,0x6b,0x07,0x6c,0x07,0x6d,0x07,0x6e,0x07,0x6f,0x07,0x70,0x07,0x71,0x07,0x72,0x07,0x73,0x07,0x74,0x07,0x75,0x07,0x76,0x07,0x77,0x07,0x78,0x07,0x79,\r\n0x07,0x7a,0x07,0x7b,0x07,0x7c,0x07,0x7d,0x07,0x7e,0x07,0x7f,0x07,0x80,0x07,0x81,0x07,0x82,0x07,0x83,0x07,0x84,0x07,0x85,0x07,0x86,0x07,0x87,0x07,0x88,0x07,0x89,0x07,0x8a,0x07,0x8b,0x07,0x8c,0x07,0x8d,0x07,0x8e,0x07,0x8f,0x07,0x90,0x07,0x91,0x07,0x92,0x07,0x93,0x07,0x94,0x07,0x95,0x07,0x96,0x07,0x97,0x07,0x98,0x07,0x99,\r\n0x07,0x9a,0x07,0x9b,0x07,0x9c,0x07,0x9d,0x07,0x9e,0x07,0x9f,0x07,0xa0,0x07,0xa1,0x07,0xa2,0x07,0xa3,0x07,0xa4,0x07,0xa5,0x07,0xa6,0x07,0xa7,0x07,0xa8,0x07,0xa9,0x07,0xaa,0x07,0xab,0x07,0xac,0x07,0xad,0x07,0xae,0x07,0xaf,0x07,0xb0,0x07,0xb1,0x07,0xb2,0x07,0xb3,0x07,0xb4,0x07,0xb5,0x07,0xb6,0x07,0xb7,0x07,0xb8,0x07,0xb9,\r\n0x07,0xba,0x07,0xbb,0x07,0xbc,0x07,0xbd,0x07,0xbe,0x07,0xbf,0x07,0xc0,0x07,0xc1,0x07,0xc2,0x07,0xc3,0x07,0xc4,0x07,0xc5,0x07,0xc6,0x07,0xc7,0x07,0xc8,0x07,0xc9,0x07,0xca,0x07,0xcb,0x07,0xcc,0x07,0xd1,0x07,0xf7,0x07,0xf8,0x07,0xf9,0x07,0xfa,0x07,0xfb,0x07,0xfc,0x07,0xfd,0x07,0xfe,0x07,0xff,0x08,0x00,0x08,0x01,0x08,0x02,\r\n0x08,0x03,0x08,0x04,0x08,0x05,0x08,0x07,0x08,0x08,0x08,0x09,0x08,0x0a,0x08,0x0b,0x08,0x0c,0x08,0x0d,0x08,0x0e,0x08,0x0f,0x08,0x10,0x08,0x11,0x08,0x12,0x08,0x13,0x08,0x14,0x08,0x15,0x08,0x16,0x08,0x17,0x08,0x18,0x08,0x19,0x08,0x1a,0x08,0x1b,0x08,0x1c,0x08,0x1d,0x08,0x1e,0x08,0x1f,0x08,0x20,0x08,0x21,0x08,0x22,0x08,0x23,\r\n0x08,0x24,0x08,0x25,0x08,0x26,0x08,0x27,0x08,0x28,0x08,0x29,0x08,0x2a,0x08,0x2b,0x08,0x2c,0x08,0x2d,0x08,0x2e,0x08,0x2f,0x08,0x30,0x08,0x31,0x08,0x32,0x08,0x33,0x08,0x34,0x08,0x35,0x08,0x36,0x08,0x37,0x08,0x38,0x08,0x39,0x08,0x3a,0x08,0x3b,0x08,0x3c,0x08,0x3d,0x08,0x3e,0x08,0x3f,0x08,0x40,0x08,0x41,0x08,0x42,0x08,0x43,\r\n0x08,0x44,0x08,0x45,0x08,0x46,0x08,0x47,0x08,0x48,0x08,0x49,0x08,0x4a,0x08,0x4b,0x08,0x4c,0x08,0x4d,0x08,0x4e,0x08,0x4f,0x0a,0xdb,0x0a,0xdc,0x0a,0xdd,0x0a,0xde,0x0a,0xdf,0x0a,0xe0,0x0a,0xe1,0x0a,0xe2,0x0a,0xe3,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed,\r\n0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02,0xfb,0x02,0xfc,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d,\r\n0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x1a,0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d,\r\n0x03,0x2e,0x03,0x2f,0x03,0x30,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a,0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x03,0x4c,0x03,0x4d,\r\n0x03,0x4e,0x03,0x4f,0x03,0x50,0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03,0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x01,0x8c,0x01,0x8d,0x01,0x8e,0x01,0x8f,0x01,0x90,0x01,0x91,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,0x03,0x67,\r\n0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70,0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x13,0x5b,0x13,0x5c,0x0b,0x21,0x13,0x5d,0x02,0x57,0x02,0x58,0x02,0x59,0x02,0x5a,0x02,0x5b,0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02,0x61,\r\n0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,0x02,0x79,0x02,0x7a,0x02,0x7b,0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,0x02,0x81,\r\n0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x9a,0x02,0x9b,0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,0x02,0xa1,\r\n0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x01,0x92,0x01,0x93,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,0x13,0x5e,0x13,0x5f,0x13,0x60,0x13,0x61,0x13,0x62,0x13,0x63,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83,\r\n0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x03,0x8e,0x0a,0xfe,0x0a,0xff,0x0b,0x00,0x0b,0x01,0x0b,0x02,0x0b,0x03,0x0b,0x04,0x0b,0x05,0x0b,0x06,0x11,0x86,0x0b,0x07,0x0b,0x08,0x08,0xc3,0x08,0xc4,0x08,0xc5,0x08,0xc6,0x00,0x10,0x11,0x99,0x08,0xbc,0x00,0xb2,0x00,0xb3,\r\n0x02,0x35,0x11,0x87,0x01,0x35,0x00,0xb6,0x00,0xb7,0x00,0xc4,0x01,0x94,0x00,0xb4,0x00,0xb5,0x00,0xc5,0x08,0xbd,0x00,0x82,0x00,0xc2,0x00,0x87,0x0b,0x23,0x0b,0x24,0x0b,0x25,0x0b,0x26,0x0b,0x27,0x0b,0x28,0x0b,0x29,0x0b,0x09,0x00,0xc6,0x01,0x3c,0x01,0x3d,0x08,0xbe,0x01,0x36,0x11,0x85,0x01,0x95,0x08,0x50,0x0b,0x0a,0x08,0x99,\r\n0x08,0x95,0x08,0x9a,0x08,0x9b,0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0xa0,0x08,0xa1,0x08,0xa2,0x08,0xa3,0x08,0xa4,0x01,0x37,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,0x08,0xab,0x08,0xac,0x08,0xad,0x08,0xae,0x08,0xaf,0x08,0xb0,0x08,0xb1,0x08,0xb2,0x08,0xb3,0x08,0x51,0x08,0x52,0x08,0x53,0x08,0x54,\r\n0x08,0x55,0x14,0x2e,0x14,0x2f,0x14,0x30,0x14,0x31,0x14,0x32,0x14,0x33,0x14,0x34,0x14,0x35,0x07,0xd2,0x07,0xd3,0x07,0xd4,0x00,0xf6,0x01,0x96,0x07,0xd5,0x07,0xd6,0x01,0x38,0x07,0xd7,0x07,0xd8,0x07,0xd9,0x07,0xda,0x00,0xbd,0x07,0xdb,0x07,0xdc,0x07,0xdd,0x07,0xde,0x07,0xdf,0x08,0x56,0x08,0x57,0x08,0x58,0x08,0x59,0x11,0x80,\r\n0x11,0x81,0x0c,0xb7,0x0c,0xb6,0x11,0xa3,0x14,0x2a,0x13,0x91,0x13,0x90,0x14,0x2c,0x14,0x2d,0x02,0x36,0x07,0xe0,0x12,0xe2,0x12,0xe3,0x12,0xe4,0x0b,0x2a,0x0b,0x2b,0x12,0xe5,0x12,0xe6,0x12,0xe7,0x12,0xe8,0x12,0xe9,0x12,0xea,0x01,0x98,0x01,0x99,0x01,0x9a,0x01,0x9b,0x12,0xeb,0x12,0xf0,0x12,0xf1,0x12,0xf2,0x12,0xf3,0x12,0xf4,\r\n0x12,0xf5,0x12,0xf6,0x12,0xf7,0x12,0xf8,0x12,0xf9,0x0a,0xe6,0x12,0xfa,0x12,0xfb,0x12,0xfc,0x12,0xfd,0x12,0xfe,0x00,0x9a,0x00,0xee,0x01,0x02,0x00,0xa6,0x00,0x93,0x0b,0x32,0x00,0x90,0x08,0xbf,0x0b,0x36,0x01,0x40,0x01,0x41,0x01,0x42,0x0b,0x37,0x00,0xb9,0x0b,0x3c,0x0a,0x43,0x0b,0x3f,0x11,0x88,0x08,0x83,0x08,0x84,0x08,0x85,\r\n0x08,0x86,0x08,0x87,0x08,0x88,0x08,0x89,0x08,0x8a,0x08,0x8b,0x13,0x8f,0x0a,0xe7,0x0a,0xe8,0x0a,0xe9,0x0a,0xea,0x0a,0xeb,0x0a,0xec,0x0a,0xed,0x0a,0xee,0x0a,0xef,0x0a,0xf0,0x0a,0xf1,0x0a,0xf2,0x0a,0xf3,0x0b,0x43,0x13,0x93,0x13,0x94,0x13,0x64,0x0b,0x44,0x0b,0x45,0x0b,0x46,0x0a,0xf4,0x0a,0xf5,0x0a,0xf6,0x0a,0xf7,0x13,0x65,\r\n0x13,0x66,0x13,0x67,0x13,0x68,0x13,0x69,0x13,0x6a,0x13,0x6b,0x13,0x6c,0x11,0x30,0x11,0x31,0x11,0x32,0x11,0x33,0x11,0x34,0x11,0x35,0x11,0x36,0x11,0x37,0x11,0x38,0x11,0x39,0x11,0x3a,0x11,0x3b,0x11,0x3c,0x11,0x3d,0x11,0x3e,0x11,0x3f,0x11,0x40,0x11,0x41,0x11,0x42,0x11,0x43,0x11,0x44,0x11,0x45,0x11,0x46,0x11,0x47,0x11,0x48,\r\n0x11,0x49,0x11,0x4a,0x11,0x4b,0x11,0x4c,0x11,0x4d,0x11,0x4e,0x11,0x4f,0x11,0x50,0x11,0x51,0x11,0x52,0x11,0x53,0x11,0x54,0x11,0x55,0x11,0x56,0x11,0x57,0x11,0x58,0x11,0x59,0x11,0x5a,0x11,0x5b,0x11,0x5c,0x11,0x5d,0x11,0x5e,0x11,0x5f,0x11,0x60,0x11,0x61,0x11,0x62,0x11,0x63,0x13,0x77,0x13,0x78,0x13,0x79,0x13,0x7a,0x13,0x7b,\r\n0x13,0x7c,0x13,0x7d,0x13,0x7e,0x11,0x64,0x11,0x65,0x11,0x66,0x11,0x67,0x11,0x68,0x11,0x69,0x11,0x6a,0x11,0x6b,0x11,0x6c,0x11,0x6d,0x11,0x6e,0x11,0x6f,0x11,0x70,0x11,0x71,0x11,0x72,0x11,0x73,0x11,0x74,0x11,0x75,0x11,0x76,0x11,0x77,0x11,0x78,0x11,0x79,0x11,0x7a,0x11,0x7b,0x11,0x7c,0x11,0x7d,0x11,0x7e,0x11,0x7f,0x14,0x24,\r\n0x14,0x25,0x14,0x26,0x14,0x27,0x14,0x28,0x14,0x29,0x14,0x36,0x13,0x7f,0x14,0x37,0x14,0x38,0x14,0x39,0x14,0x3a,0x14,0x3b,0x14,0x3c,0x14,0x3d,0x14,0x3e,0x13,0x80,0x13,0x81,0x13,0x82,0x13,0x83,0x13,0x84,0x13,0x85,0x13,0x86,0x13,0x87,0x13,0x88,0x13,0x89,0x13,0x8a,0x13,0x8b,0x13,0x8c,0x13,0x8d,0x13,0x8e,0x0a,0xf8,0x0a,0xf9,\r\n0x0a,0xfa,0x0a,0xfb,0x0b,0x47,0x0b,0x48,0x0b,0x49,0x0b,0x4a,0x0b,0x4b,0x0a,0xfc,0x0a,0xfd,0x12,0x63,0x12,0x64,0x12,0x65,0x12,0x66,0x12,0x67,0x12,0x68,0x12,0x69,0x12,0x6a,0x12,0x6b,0x12,0x6c,0x12,0x6d,0x12,0x6e,0x12,0x6f,0x12,0x70,0x12,0x71,0x12,0x72,0x12,0x73,0x12,0x74,0x12,0x75,0x12,0x76,0x12,0x77,0x12,0x78,0x12,0x79,\r\n0x12,0x7a,0x12,0x7b,0x12,0x7c,0x12,0x7d,0x12,0x7e,0x12,0x7f,0x12,0x80,0x12,0x81,0x12,0x82,0x12,0x83,0x12,0x84,0x12,0x85,0x12,0x86,0x12,0x87,0x12,0x88,0x12,0x89,0x12,0x8a,0x12,0x8b,0x12,0x8c,0x12,0x8d,0x12,0x8e,0x12,0x8f,0x12,0x90,0x12,0x91,0x12,0x92,0x12,0x93,0x12,0x94,0x12,0x95,0x12,0x96,0x12,0x97,0x12,0x98,0x12,0x99,\r\n0x12,0x9a,0x12,0x9b,0x12,0x9c,0x12,0x9d,0x12,0x9e,0x12,0x9f,0x12,0xa0,0x12,0xa1,0x12,0xa2,0x12,0xa3,0x12,0xa4,0x12,0xa5,0x12,0xa6,0x12,0xa7,0x12,0xa8,0x12,0xa9,0x12,0xaa,0x12,0xab,0x12,0xac,0x12,0xad,0x12,0xae,0x12,0xaf,0x12,0xb0,0x12,0xb1,0x12,0xb2,0x12,0xb3,0x12,0xb4,0x12,0xb5,0x12,0xb6,0x12,0xb7,0x12,0xb8,0x12,0xb9,\r\n0x12,0xba,0x12,0xbb,0x12,0xbc,0x12,0xbd,0x12,0xbe,0x12,0xbf,0x12,0xc0,0x12,0xc1,0x12,0xc2,0x12,0xc3,0x12,0xc4,0x12,0xc5,0x12,0xc6,0x12,0xc7,0x12,0xc8,0x0b,0x4c,0x0b,0x4d,0x0b,0x4e,0x0b,0x4f,0x0b,0x50,0x12,0xc9,0x12,0xca,0x14,0x3f,0x12,0xcb,0x12,0xcc,0x12,0xcd,0x12,0xce,0x13,0x95,0x13,0x96,0x13,0x97,0x13,0x98,0x13,0x99,\r\n0x13,0x9a,0x13,0x9b,0x13,0x9c,0x13,0x9d,0x13,0x9e,0x13,0x9f,0x13,0xa0,0x12,0xcf,0x12,0xd0,0x12,0xd1,0x12,0xd2,0x12,0xd3,0x12,0xd4,0x12,0xd5,0x12,0xd6,0x12,0xd7,0x12,0xd8,0x12,0xd9,0x13,0xa1,0x13,0xa2,0x13,0xa3,0x14,0x40,0x13,0xa4,0x13,0xa5,0x14,0x41,0x14,0x42,0x14,0x43,0x14,0x44,0x14,0x45,0x14,0x46,0x13,0xa6,0x12,0xda,\r\n0x12,0xdb,0x12,0xdc,0x12,0xdd,0x12,0xde,0x12,0xdf,0x12,0xe0,0x12,0xe1,0x13,0xa7,0x13,0xa8,0x13,0xa9,0x13,0xaa,0x13,0xab,0x13,0xac,0x13,0xad,0x13,0xae,0x13,0xaf,0x13,0xb0,0x13,0xb1,0x13,0xb2,0x13,0xb3,0x13,0xb4,0x13,0xb5,0x13,0xb6,0x13,0xb7,0x13,0xb8,0x13,0xb9,0x13,0xba,0x13,0xbb,0x13,0xbc,0x13,0xbd,0x13,0xbe,0x13,0xbf,\r\n0x13,0xc0,0x13,0xc1,0x13,0xc2,0x13,0xc3,0x13,0xc4,0x13,0xc5,0x13,0xc6,0x13,0xc7,0x13,0xc8,0x13,0xc9,0x13,0xca,0x13,0xcb,0x13,0xcc,0x13,0xcd,0x13,0xce,0x13,0xcf,0x13,0xd0,0x13,0xd1,0x13,0xd2,0x13,0xd3,0x13,0xd4,0x13,0xd5,0x13,0xd6,0x14,0x47,0x14,0x48,0x14,0x49,0x14,0x4a,0x13,0xd7,0x13,0xd8,0x0d,0xbb,0x00,0xc0,0x00,0xc1,\r\n0x0d,0xbc,0x0d,0xbd,0x14,0x4b,0x14,0x4c,0x0b,0xe0,0x0b,0xe1,0x0b,0x8c,0x0b,0x8d,0x0b,0x8e,0x0b,0x8f,0x0b,0x90,0x0b,0x91,0x0b,0x92,0x0b,0x93,0x0b,0x94,0x0b,0x95,0x0b,0x96,0x0b,0x97,0x0b,0x98,0x0b,0x99,0x0b,0x9a,0x0b,0x9b,0x0b,0x9c,0x0b,0x9d,0x0b,0x9e,0x0b,0x9f,0x0b,0xa0,0x0b,0xa1,0x0b,0xa2,0x0b,0xa3,0x0b,0xae,0x0b,0xaf,\r\n0x0b,0xb0,0x0b,0xb1,0x0b,0xb2,0x0b,0xb3,0x0b,0xb4,0x0b,0xb5,0x0b,0xb6,0x0b,0xb7,0x09,0x80,0x09,0x81,0x09,0x8e,0x0e,0x7c,0x09,0x8f,0x0e,0x7d,0x09,0x40,0x0e,0x82,0x09,0x41,0x0e,0x83,0x09,0x96,0x0e,0x86,0x09,0x97,0x0e,0x87,0x09,0x8c,0x0e,0x7a,0x09,0x8d,0x0e,0x7b,0x09,0x94,0x0e,0x84,0x09,0x95,0x0e,0x85,0x09,0x5b,0x0e,0x78,\r\n0x09,0x5c,0x0e,0x79,0x09,0x6c,0x0e,0xa8,0x09,0x6d,0x09,0x6e,0x09,0xd2,0x0e,0xaa,0x09,0xd3,0x09,0xd4,0x09,0xa1,0x09,0xa2,0x09,0xa3,0x0e,0x8b,0x09,0x9e,0x09,0x9f,0x09,0xa0,0x0e,0x8a,0x09,0x42,0x09,0x43,0x09,0x44,0x0e,0x8d,0x09,0xa7,0x09,0xa8,0x09,0xa9,0x0e,0x8e,0x09,0xae,0x0e,0x94,0x09,0xad,0x0e,0x93,0x09,0xaf,0x0e,0x95,\r\n0x09,0x5d,0x0e,0x8f,0x09,0x45,0x0b,0x0e,0x09,0x5e,0x0b,0x0f,0x09,0x46,0x0e,0xb1,0x09,0x47,0x0e,0xb2,0x09,0x48,0x0e,0xbd,0x09,0x49,0x0e,0xbe,0x09,0xe7,0x0e,0xc5,0x09,0xe8,0x0e,0xc6,0x09,0xe3,0x0e,0xc1,0x09,0xe4,0x0e,0xc2,0x09,0x5f,0x0e,0xcf,0x09,0xf5,0x0e,0xd0,0x0e,0xd1,0x0e,0xd2,0x09,0x4e,0x09,0x4d,0x09,0x60,0x09,0x72,\r\n0x09,0x61,0x09,0x62,0x08,0xf1,0x08,0xf2,0x0e,0xd7,0x0e,0xd8,0x09,0x65,0x09,0x66,0x09,0x67,0x09,0x68,0x13,0xd9,0x13,0xda,0x13,0xdb,0x13,0xdc,0x13,0xdd,0x13,0xde,0x13,0xdf,0x13,0xe0,0x13,0xe1,0x13,0xe2,0x13,0xe3,0x13,0xe4,0x13,0xe5,0x13,0xe6,0x13,0xe7,0x13,0xe8,0x09,0xdd,0x0e,0xb9,0x09,0xde,0x0e,0xba,0x0a,0x00,0x0e,0xdf,\r\n0x09,0xff,0x0e,0xde,0x0a,0x01,0x0e,0xe0,0x09,0x89,0x0a,0x04,0x0e,0xe3,0x09,0xfe,0x0e,0xdd,0x0a,0x02,0x0e,0xe1,0x0a,0x0b,0x0a,0x0c,0x0e,0xe7,0x0e,0xe8,0x0e,0x5f,0x0e,0x60,0x10,0xfe,0x10,0xff,0x11,0x00,0x11,0x01,0x11,0x02,0x11,0x03,0x11,0x04,0x11,0x05,0x11,0x06,0x11,0x07,0x11,0x08,0x11,0x09,0x11,0x0a,0x11,0x0b,0x11,0x0c,\r\n0x11,0x0d,0x11,0x0e,0x11,0x0f,0x09,0x4a,0x09,0x4b,0x09,0x4c,0x0e,0xe4,0x0a,0x68,0x0a,0x69,0x0a,0x65,0x0a,0x66,0x0a,0x67,0x13,0xe9,0x13,0xed,0x13,0xee,0x00,0x0b,0x00,0x0c,0x13,0xf0,0x13,0xf1,0x0a,0x64,0x13,0xf2,0x13,0xf8,0x13,0xf9,0x13,0xfa,0x13,0xfb,0x13,0xfc,0x13,0xfd,0x13,0xfe,0x13,0xff,0x14,0x00,0x14,0x01,0x09,0x07,\r\n0x09,0x08,0x08,0xc9,0x09,0x09,0x08,0xc8,0x09,0x0a,0x0e,0x24,0x09,0x0b,0x08,0xca,0x09,0x0c,0x09,0x02,0x08,0xf9,0x0e,0x25,0x09,0x0d,0x08,0xc7,0x09,0x0e,0x0e,0x26,0x08,0xcb,0x0e,0x27,0x09,0x0f,0x08,0xf6,0x09,0x10,0x0e,0x28,0x08,0xcc,0x0e,0x29,0x09,0x11,0x0e,0x2a,0x08,0xcd,0x0e,0x2b,0x09,0x12,0x08,0xcf,0x08,0xce,0x0e,0x2c,\r\n0x09,0x13,0x08,0xd1,0x08,0xd0,0x0e,0x2d,0x09,0x14,0x08,0xd3,0x08,0xd2,0x0e,0x2e,0x09,0x15,0x0e,0x2f,0x09,0x16,0x0e,0x30,0x09,0x17,0x0b,0x0c,0x09,0x18,0x0b,0x0d,0x09,0x19,0x0e,0x31,0x08,0xd4,0x0e,0x32,0x09,0x1a,0x0e,0x33,0x08,0xd5,0x0e,0x34,0x09,0x1b,0x0e,0x35,0x08,0xd6,0x0e,0x36,0x09,0x1c,0x0e,0x37,0x08,0xe1,0x0e,0x38,\r\n0x09,0x1d,0x0e,0x39,0x0e,0x3a,0x0e,0x3b,0x09,0x1e,0x0e,0x3c,0x0e,0x3d,0x0e,0x3e,0x09,0x1f,0x08,0xe4,0x08,0xe2,0x08,0xe3,0x09,0x20,0x08,0xe7,0x08,0xe5,0x08,0xe6,0x09,0x22,0x0e,0x53,0x08,0xe8,0x08,0xe9,0x09,0x23,0x0e,0x54,0x08,0xeb,0x08,0xec,0x09,0x24,0x0e,0x55,0x08,0xed,0x0e,0x56,0x09,0x25,0x09,0x59,0x08,0xee,0x09,0x3f,\r\n0x09,0x26,0x0e,0x57,0x08,0xef,0x0e,0x58,0x09,0x27,0x0e,0x59,0x08,0xf0,0x0e,0x5a,0x09,0x28,0x08,0xf3,0x0e,0x5b,0x0e,0x5d,0x09,0x29,0x0e,0x5e,0x09,0x2a,0x08,0xf7,0x09,0x2b,0x08,0xf5,0x08,0xf4,0x0e,0x61,0x09,0x01,0x09,0x04,0x08,0xff,0x09,0x00,0x09,0x34,0x09,0x35,0x08,0xfa,0x08,0xfb,0x0b,0xb8,0x0b,0x1b,0x40,0x55,0x85,0x64,\r\n0x5b,0x5a,0x59,0x54,0x52,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,\r\n0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x45,0x6a,0xb0,0x19,0x43,0x60,0xb0,0x0c,0x23,0x44,0x23,0x10,0x20,0xb0,0x0c,0x4e,0xf0,0x4d,0x2f,0xb0,0x00,0x12,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,\r\n0xb0,0x05,0x2b,0xb0,0x00,0x13,0x4b,0xb0,0x14,0x50,0x58,0xb1,0x00,0x40,0x38,0x59,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x4e,0xb0,0x03,0x25,0x10,0xf2,0x21,0xb0,0x00,0x12,0x4d,0x1b,0x20,0x45,0xb0,0x04,0x25,0xb0,0x04,0x25,0x23,0x4a,0x61,0x64,0xb0,0x28,0x52,0x58,0x21,\r\n0x23,0x10,0xd6,0x1b,0xb0,0x03,0x25,0x10,0xf2,0x21,0xb0,0x00,0x12,0x59,0x59,0x2d,0x2c,0xb0,0x1a,0x43,0x58,0x21,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,0xb0,0x03,0x25,0xb0,0x03,0x25,0x4a,0x61,0x20,0x64,0xb0,0x10,0x50,0x58,0x21,0x21,0x21,0x1b,0xb0,0x03,0x25,0xb0,0x03,0x25,0x49,0xb0,0x00,0x50,0x58,0xb0,0x00,0x50,0x58,\r\n0xb8,0xff,0xe2,0x38,0x21,0x1b,0xb0,0x00,0x38,0x21,0x59,0x1b,0xb0,0x00,0x52,0x58,0xb0,0x1e,0x38,0x21,0x1b,0xb0,0x00,0x38,0x21,0x59,0x59,0x59,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x2b,0xb0,0x00,0x13,0x4b,0xb0,0x14,0x50,0x58,0xb9,0x00,0x00,0xff,0xc0,0x38,0x59,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,\r\n0x2f,0x59,0x2d,0x2c,0x4e,0x01,0x8a,0x10,0xb1,0x0c,0x19,0x43,0x44,0xb0,0x00,0x14,0xb1,0x00,0x0c,0xe2,0xb0,0x00,0x15,0xb9,0x00,0x00,0xff,0xf0,0x38,0x00,0xb0,0x00,0x3c,0xb0,0x28,0x2b,0xb0,0x02,0x25,0x10,0xb0,0x00,0x3c,0x2d,0x2c,0x01,0x18,0xb0,0x00,0x2f,0xb0,0x01,0x14,0xf2,0xb0,0x01,0x13,0xb0,0x01,0x15,0x4d,0xb0,0x00,0x12,\r\n0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x2b,0xb0,0x00,0x13,0xb9,0x00,0x00,0xff,0xe0,0x38,0xb0,0x06,0x2b,0x1b,0x21,0x23,0x11,0x20,0x33,0x2f,0x59,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0x45,0x64,0x6a,0x23,0x45,0x64,0x69,0xb0,0x19,0x43,0x64,0x60,0x60,0xb0,0x0c,0x23,0x44,0x23,0x10,0x20,0xb0,0x0c,0xf0,0x2f,0xb0,\r\n0x00,0x12,0x1b,0x21,0x21,0x20,0x8a,0x20,0x8a,0x52,0x58,0x11,0x33,0x1b,0x21,0x21,0x59,0x59,0x2d,0x2c,0x01,0x4b,0xb0,0xc8,0x51,0x58,0xb1,0x0b,0x0a,0x43,0x23,0x43,0x65,0x0a,0x59,0x2d,0x2c,0x00,0x4b,0xb0,0xc8,0x51,0x58,0x00,0xb1,0x0a,0x0b,0x43,0x23,0x43,0x0b,0x59,0x2d,0x2c,0x00,0xb0,0x0c,0x23,0x70,0xb1,0x01,0x0c,0x3e,0x01,\r\n0xb0,0x0c,0x23,0x70,0xb1,0x02,0x0c,0x45,0x3a,0xb1,0x02,0x00,0x08,0x0d,0x2d,0x2c,0xb0,0x12,0x2b,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x6a,0xb0,0x40,0x8b,0x60,0xb0,0x02,0x25,0x23,0x44,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x13,0x2b,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x6a,0xb8,0xff,0xc0,0x8c,0x60,0xb0,0x02,0x25,0x23,0x44,\r\n0x21,0x21,0x21,0x2d,0x2c,0xb0,0x00,0xb0,0x12,0x2b,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x00,0xb0,0x13,0x2b,0x21,0x21,0x21,0x2d,0x2c,0x01,0x4b,0xb0,0xc8,0x51,0x58,0xb0,0x06,0x43,0xb0,0x07,0x43,0x65,0x0a,0x59,0x2d,0x2c,0x20,0x69,0xb0,0x40,0x61,0xb0,0x00,0x8b,0x20,0xb1,0x2c,0xc0,0x8a,0x8c,0xb8,0x10,0x00,0x62,0x60,0x2b,0x0c,0x64,\r\n0x23,0x64,0x61,0x5c,0x58,0xb0,0x03,0x61,0x59,0x2d,0x2c,0xb1,0x00,0x03,0x25,0x45,0x68,0x54,0xb0,0x1c,0x4b,0x50,0x5a,0x58,0xb0,0x03,0x25,0x45,0xb0,0x03,0x25,0x45,0x60,0x68,0x20,0xb0,0x04,0x25,0x23,0x44,0xb0,0x04,0x25,0x23,0x44,0x1b,0xb0,0x03,0x25,0x20,0x45,0x68,0x20,0x8a,0x23,0x44,0xb0,0x03,0x25,0x45,0x68,0x60,0xb0,0x03,\r\n0x25,0x23,0x44,0x59,0x2d,0x2c,0xb0,0x03,0x25,0x20,0x45,0x68,0x20,0x8a,0x23,0x44,0xb0,0x03,0x25,0x45,0x64,0x68,0x65,0x60,0xb0,0x04,0x25,0xb0,0x01,0x60,0x23,0x44,0x2d,0x2c,0xb0,0x09,0x43,0x58,0x87,0x21,0xc0,0x1b,0xb0,0x12,0x43,0x58,0x87,0x45,0xb0,0x11,0x2b,0xb0,0x0d,0x23,0x44,0xb0,0x0d,0x7a,0xe4,0x1b,0x03,0x8a,0x45,0x18,\r\n0x69,0x20,0xb0,0x0d,0x23,0x44,0x8a,0x8a,0x87,0x20,0xb0,0xa0,0x51,0x58,0xb0,0x11,0x2b,0xb0,0x0d,0x23,0x44,0xb0,0x0d,0x7a,0xe4,0x1b,0x21,0xb0,0x0d,0x7a,0xe4,0x59,0x59,0x59,0x18,0x2d,0x2c,0x20,0x8a,0x45,0x23,0x45,0x68,0x60,0x44,0x2d,0x2c,0x45,0x6a,0x42,0x2d,0x2c,0x01,0x18,0x2f,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,\r\n0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0x23,0x45,0x64,0x69,0xb0,0x40,0x8b,0x61,0x20,0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x19,0x43,0x60,0xb0,0x0c,0x23,0x44,0x21,0x8a,0x10,0xb0,0x0c,0xf6,0x21,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x01,0xb0,0x18,0x43,0x58,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,\r\n0x64,0x60,0x6a,0xb0,0x03,0x25,0x45,0x6a,0x61,0x20,0xb0,0x04,0x25,0x45,0x6a,0x20,0x8a,0x8b,0x65,0xb0,0x04,0x25,0x23,0x44,0x8c,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x1b,0x20,0x45,0x6a,0x44,0x20,0x45,0x6a,0x44,0x59,0x2d,0x2c,0x01,0x20,0x45,0xb0,0x00,0x55,0xb0,0x18,0x43,0x5a,0x58,0x45,0x68,0x23,0x45,0x69,0xb0,0x40,0x8b,0x61,\r\n0x20,0xb0,0x80,0x62,0x6a,0x20,0x8a,0x23,0x61,0x20,0xb0,0x03,0x25,0x8b,0x65,0xb0,0x04,0x25,0x23,0x44,0x8c,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x1b,0x21,0x21,0xb0,0x19,0x2b,0x59,0x2d,0x2c,0x01,0x8a,0x8a,0x45,0x64,0x23,0x45,0x64,0x61,0x64,0x42,0x2d,0x2c,0xb0,0x04,0x25,0xb0,0x04,0x25,0xb0,0x19,0x2b,0xb0,0x18,0x43,0x58,0xb0,\r\n0x04,0x25,0xb0,0x04,0x25,0xb0,0x03,0x25,0xb0,0x1b,0x2b,0x01,0xb0,0x02,0x25,0x43,0xb0,0x40,0x54,0xb0,0x02,0x25,0x43,0xb0,0x00,0x54,0x5a,0x58,0xb0,0x03,0x25,0x20,0x45,0xb0,0x40,0x61,0x44,0x59,0xb0,0x02,0x25,0x43,0xb0,0x00,0x54,0xb0,0x02,0x25,0x43,0xb0,0x40,0x54,0x5a,0x58,0xb0,0x04,0x25,0x20,0x45,0xb0,0x40,0x60,0x44,0x59,\r\n0x59,0x21,0x21,0x21,0x21,0x2d,0x2c,0xb0,0x03,0x25,0x20,0xb0,0x07,0x25,0x87,0x05,0x2e,0x23,0x20,0x8a,0xb0,0x04,0x25,0xb0,0x07,0x25,0xb0,0x14,0x2b,0x10,0x21,0xc4,0x21,0x2d,0x2c,0xc0,0x2d,0x2c,0x4b,0x52,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x58,0x3d,0xed,0x18,0x1b,0xed,0x59,0x2d,0x2c,0x4b,0x50,0x58,\r\n0x45,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x01,0x18,0x4b,0x52,0x58,0x8a,0x2f,0xed,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0xb0,0x03,0x25,0x45,0x68,0xb0,0x03,0x25,0x45,0x68,0xb0,0x03,0x25,0x60,0x54,0x58,0x21,0x21,0x21,0x1b,0xb0,0x02,0x25,0x45,0x68,0x60,0xb0,0x03,0x25,0x23,0x44,0x21,0x21,0x59,\r\n0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x58,0x3d,0xcd,0x18,0x1b,0xcd,0x59,0x2d,0x2c,0x46,0x23,0x46,0x60,0x8a,0x8a,0x46,0x23,0x20,0x46,0x8a,0x60,0x8a,0x61,0xb8,0xff,0x80,0x62,0x23,0x20,0x10,0x23,0x8a,0xb1,0x0c,0x0c,0x8a,0x70,0x45,0x60,0x20,0xb0,0x00,0x50,0x58,0xb0,0x01,0x61,0xb8,0xff,0xba,0x8b,0x1b,0xb0,0x46,\r\n0x8c,0x59,0xb0,0x10,0x60,0x68,0x01,0x3a,0x2d,0x2c,0x20,0x45,0xb0,0x03,0x25,0x46,0x52,0x4b,0xb0,0x13,0x51,0x5b,0x58,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x1b,0x21,0x11,0x59,0x2d,0x2c,0x20,0x45,0xb0,0x03,0x25,0x46,0x50,0x58,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,\r\n0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x1b,0x21,0x11,0x59,0x2d,0x2c,0x00,0x4b,0xb0,0xc8,0x51,0x58,0x00,0xb0,0x07,0x43,0xb0,0x06,0x43,0x0b,0x59,0x2d,0x2c,0x8a,0x10,0xec,0x2d,0x2c,0xb0,0x0c,0x43,0x58,0x21,0x1b,0x20,0x46,0xb0,0x00,0x52,0x58,0xb8,0xff,0xf0,0x38,0x1b,0xb0,0x10,0x38,0x59,0x59,0x2d,0x2c,0x20,0xb0,0x00,0x55,0x58,\r\n0xb8,0x10,0x00,0x63,0xb0,0x03,0x25,0x45,0x64,0xb0,0x03,0x25,0x45,0x64,0x61,0xb0,0x00,0x53,0x58,0xb0,0x02,0x1b,0xb0,0x40,0x61,0xb0,0x03,0x59,0x25,0x45,0x69,0x53,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x1b,0x21,0xb0,0x02,0x25,0x45,0xb0,0x02,0x25,0x45,0x61,0x64,0xb0,0x28,0x51,0x58,0x45,0x44,0x1b,0x21,0x21,0x59,0x59,0x2d,0x2c,\r\n0x21,0x21,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x40,0x00,0x62,0x2d,0x2c,0x21,0xb0,0x80,0x51,0x58,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x20,0x00,0x62,0x1b,0xb2,0x00,0x40,0x2f,0x2b,0x59,0xb0,0x02,0x60,0x2d,0x2c,0x21,0xb0,0xc0,0x51,0x58,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x15,0x55,0x62,0x1b,0xb2,0x00,0x80,0x2f,0x2b,0x59,0xb0,0x02,0x60,0x2d,\r\n0x2c,0x0c,0x64,0x23,0x64,0x8b,0xb8,0x40,0x00,0x62,0x60,0x23,0x21,0x2d,0x2c,0x18,0x4b,0x53,0x58,0xb0,0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0x23,0x45,0x64,0x69,0xb0,0x40,0x8b,0x61,0x20,0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x0c,0x23,0x44,0x21,0x8a,0x10,0xb0,0x0c,0xf6,0x21,0x1b,0x21,0x8a,0x11,0x23,\r\n0x12,0x20,0x39,0x2f,0x59,0x2d,0x2c,0xb0,0x02,0x25,0xb0,0x02,0x25,0x49,0x64,0xb0,0xc0,0x54,0x58,0xb8,0xff,0xf8,0x38,0xb0,0x08,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x13,0x43,0x58,0x03,0x1b,0x02,0x59,0x2d,0x2c,0xb0,0x13,0x43,0x58,0x02,0x1b,0x03,0x59,0x2d,0x2c,0xb0,0x0a,0x2b,0x23,0x10,0x20,0x3c,0xb0,0x17,0x2b,0x2d,0x2c,\r\n0xb0,0x02,0x25,0xb8,0xff,0xf0,0x38,0xb0,0x28,0x2b,0x8a,0x10,0x23,0x20,0xd0,0x23,0xb0,0x10,0x2b,0xb0,0x05,0x43,0x58,0xc0,0x1b,0x3c,0x59,0x20,0x10,0x11,0xb0,0x00,0x12,0x01,0x2d,0x2c,0xb0,0x48,0x2b,0x2d,0x2c,0x01,0xb0,0x02,0x25,0x10,0xd0,0x23,0xc9,0x01,0xb0,0x01,0x13,0xb0,0x00,0x14,0x10,0xb0,0x01,0x3c,0xb0,0x01,0x16,0x2d,\r\n0x2c,0x01,0xb0,0x00,0x13,0xb0,0x01,0xb0,0x03,0x25,0x49,0xb0,0x03,0x17,0x38,0xb0,0x01,0x13,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x18,0x4b,0x53,0x58,0xb0,0x04,0x25,0xb0,0x04,0x25,0x49,0x64,0xb0,0x03,0x25,0xb0,0x03,0x25,0x49,0x64,0x68,0xb0,0x40,0x8b,0x61,0x20,\r\n0xb0,0x80,0x62,0x6a,0xb0,0x02,0x25,0xb0,0x02,0x25,0x61,0x8c,0xb0,0x0c,0x23,0x44,0x21,0xb0,0x04,0x25,0x10,0x23,0xb0,0x0c,0xf6,0x1b,0xb0,0x04,0x25,0xb0,0x04,0x25,0x11,0x12,0x23,0x20,0x39,0x2f,0x59,0xcc,0x21,0x21,0x2d,0x2c,0x01,0x18,0xb0,0x18,0x43,0x58,0xb0,0x05,0x25,0x46,0x23,0x45,0x64,0x61,0x1b,0x21,0xb0,0x04,0x25,0xb0,\r\n0x04,0x25,0x4a,0x59,0xb0,0x0e,0x23,0x44,0x23,0x10,0xb0,0x0e,0xec,0x23,0x10,0xb0,0x0e,0xec,0x2d,0x2c,0xb0,0x1b,0x43,0x58,0x20,0xb0,0x01,0x60,0x45,0xb0,0x00,0x51,0x58,0x20,0xb0,0x01,0x60,0x20,0x45,0x20,0x68,0xb0,0x00,0x55,0x58,0xb0,0x20,0x60,0x44,0x21,0x1b,0x21,0x21,0x21,0x59,0x1b,0x20,0xb0,0x01,0x60,0x20,0x45,0x20,0x68,\r\n0xb0,0x00,0x55,0x58,0xb8,0xff,0xe0,0x60,0x44,0xb0,0x1c,0x4b,0x50,0x58,0x20,0x45,0xb0,0x20,0x60,0x44,0x1b,0x21,0x59,0x1b,0x21,0x21,0x21,0x59,0x59,0x1b,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x25,0x46,0x20,0x68,0x61,0xb0,0x03,0x25,0xb0,0x03,0x25,0x3f,0x23,0x21,0x38,0x2d,0x2c,0x46,0x23,0x46,0x60,0x8a,0x8a,0x46,0x23,0x20,0x46,0x8a,\r\n0x60,0x8a,0x61,0xb8,0xff,0x80,0x62,0x23,0x20,0x10,0x23,0x8a,0xb1,0x0c,0x0c,0x8a,0x70,0x45,0x60,0x20,0xb0,0x00,0x50,0x58,0xb0,0x01,0x61,0xb8,0xff,0x80,0x8b,0x1b,0xb0,0x81,0x8c,0x59,0x68,0x3a,0x2d,0x2c,0xb0,0x40,0x2a,0x21,0x2d,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0x4b,0x53,0x23,0x4b,0x51,0x5a,\r\n0x58,0x38,0x1b,0x21,0x21,0x59,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x49,0xb0,0x0e,0x23,0x44,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,\r\n0x21,0x59,0x2d,0x2c,0x4b,0x54,0x58,0x20,0x45,0x8a,0x60,0x44,0x1b,0x21,0x21,0x59,0x2d,0x2c,0x4b,0x53,0x23,0x4b,0x51,0x5a,0x58,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x00,0x21,0x4b,0x54,0x58,0x38,0x1b,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x46,0x2b,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,\r\n0x54,0x58,0xb0,0x47,0x2b,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x48,0x2b,0x1b,0x21,0x21,0x21,0x21,0x59,0x2d,0x2c,0xb0,0x02,0x43,0x54,0x58,0xb0,0x49,0x2b,0x1b,0x21,0x21,0x21,0x59,0x2d,0x2c,0x00,0xb0,0x02,0x25,0x20,0x11,0x49,0xb0,0x00,0x51,0x58,0xb8,0xff,0xc0,0x38,0x1b,0x21,0x59,0x2d,0x2c,0x00,\r\n0xb0,0x02,0x25,0x20,0x11,0x49,0xb0,0x00,0x53,0x58,0xb0,0x40,0x38,0x1b,0x21,0x59,0x2d,0x2c,0x4b,0x52,0x58,0x7d,0x1b,0x7a,0x59,0x2d,0x2c,0xb1,0x02,0x01,0x42,0xb1,0x23,0x01,0x88,0x51,0xb1,0x40,0x01,0x88,0x53,0x5a,0x58,0xb1,0x02,0x00,0x42,0xb9,0x10,0x00,0x00,0x20,0x88,0x54,0x58,0xb2,0x02,0x01,0x02,0x43,0x60,0x42,0x59,0xb1,\r\n0x24,0x01,0x88,0x51,0x58,0xb9,0x20,0x00,0x00,0x40,0x88,0x54,0x58,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb1,0x24,0x01,0x88,0x54,0x58,0xb2,0x02,0x20,0x02,0x43,0x60,0x42,0x00,0x4b,0x01,0x4b,0x52,0x58,0xb2,0x02,0x08,0x02,0x43,0x60,0x42,0x59,0x1b,0xb9,0x40,0x00,0x00,0x80,0x88,0x54,0x58,0xb2,0x02,0x04,0x02,0x43,0x60,0x42,0x59,\r\n0xb9,0x40,0x00,0x00,0x80,0x63,0xb8,0x01,0x00,0x88,0x54,0x58,0xb2,0x02,0x08,0x02,0x43,0x60,0x42,0x59,0xb9,0x40,0x00,0x01,0x00,0x63,0xb8,0x02,0x00,0x88,0x54,0x58,0xb2,0x02,0x10,0x02,0x43,0x60,0x42,0x59,0xb1,0x26,0x01,0x88,0x51,0x58,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x54,0x58,0xb2,0x02,0x40,0x02,0x43,0x60,\r\n0x42,0x59,0xb9,0x40,0x00,0x04,0x00,0x63,0xb8,0x08,0x00,0x88,0x54,0x58,0xb2,0x02,0x80,0x02,0x43,0x60,0x42,0x59,0x59,0x59,0x59,0x59,0x59,0xb1,0x00,0x02,0x43,0x54,0x58,0x40,0x0a,0x05,0x40,0x08,0x40,0x09,0x40,0x0c,0x02,0x0d,0x02,0x1b,0xb1,0x01,0x02,0x43,0x54,0x58,0xb2,0x05,0x40,0x08,0xba,0x01,0x00,0x00,0x09,0x01,0x00,0xb3,\r\n0x0c,0x01,0x0d,0x01,0x1b,0xb1,0x80,0x02,0x43,0x52,0x58,0xb2,0x05,0x40,0x08,0xb8,0x01,0x80,0xb1,0x09,0x40,0x1b,0xb2,0x05,0x40,0x08,0xba,0x01,0x80,0x00,0x09,0x01,0x40,0x59,0xb9,0x40,0x00,0x00,0x80,0x88,0x55,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x55,0x5a,0x58,0xb3,0x0c,0x00,0x0d,0x01,0x1b,0xb3,0x0c,0x00,0x0d,\r\n0x01,0x59,0x59,0x59,0x42,0x42,0x42,0x42,0x42,0x2d,0x2c,0xb0,0x80,0xb0,0x02,0x43,0x50,0xb0,0x01,0xb0,0x02,0x43,0x54,0x5b,0xb0,0x10,0x4b,0x51,0x5a,0x58,0x21,0x23,0x10,0xb0,0x20,0x1a,0xc9,0x1b,0x8a,0x10,0xed,0x59,0x2d,0x2c,0xb0,0x59,0x2b,0x2d,0x2c,0x8a,0x10,0xe5,0x2d,0x2c,0x20,0x45,0x69,0x44,0x2d,0x2c,0xb1,0x25,0x01,0x88,\r\n0x50,0x58,0xb9,0x40,0x00,0x02,0x00,0x63,0xb8,0x04,0x00,0x88,0x54,0x5c,0xb0,0x14,0x4b,0x52,0x5b,0x1b,0xb0,0x01,0x59,0x2d,0xb9,0x00,0x20,0x01,0x3e,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x3c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x34,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x32,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,\r\n0x2f,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x2e,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x2c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x0c,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x04,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x03,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb8,0x01,0x01,0x40,0xfb,0x09,0x18,0x01,0x4a,0x20,0xff,0x09,\r\n0x18,0x01,0x4a,0x20,0xfe,0x09,0x18,0x01,0x4a,0x20,0xfc,0x09,0x18,0x01,0x4a,0x20,0xf3,0x09,0x18,0x01,0x4a,0x20,0xf1,0x09,0x18,0x01,0x4a,0x20,0xf0,0x09,0x18,0x01,0x4a,0x20,0xef,0x09,0x18,0x01,0x4a,0x20,0xed,0x09,0x18,0x01,0x4a,0x20,0xea,0x09,0x18,0x01,0x4a,0x20,0xdc,0x09,0x18,0x01,0x4a,0x20,0xda,0x09,0x18,0x01,0x4a,0x20,\r\n0xd8,0x09,0x18,0x01,0x4a,0x20,0xd3,0x09,0x18,0x01,0x4a,0x20,0xcd,0x09,0x18,0x01,0x4a,0x20,0xcc,0x09,0x18,0x01,0x4a,0x20,0xca,0x09,0x18,0x01,0x4a,0x20,0xc9,0x09,0x18,0x01,0x4a,0x20,0xc8,0x09,0x18,0x01,0x4a,0x20,0xc6,0x09,0x18,0x01,0x4a,0x20,0xc4,0x09,0x18,0x01,0x4a,0x20,0xc2,0x09,0x18,0x01,0x4a,0x20,0xc0,0x09,0x18,0x01,\r\n0x4a,0x20,0xbd,0x09,0x18,0x01,0x4a,0x20,0xb4,0x09,0x18,0x01,0x4a,0x20,0xb1,0x09,0x18,0x01,0x4a,0x20,0xaf,0x09,0x18,0x01,0x4a,0x20,0x8c,0x09,0x18,0x01,0x4a,0x20,0x8b,0x09,0x18,0x01,0x4a,0x20,0x8a,0x09,0x18,0x01,0x4a,0x20,0x89,0x09,0x18,0x01,0x4a,0x20,0x38,0x09,0x18,0x01,0x4a,0x20,0x37,0x09,0x18,0x01,0x4a,0x20,0x84,0x09,\r\n0x18,0x01,0x4a,0x20,0x83,0x09,0x18,0x01,0x4a,0x20,0x7f,0x09,0x18,0x01,0x4a,0x20,0x7e,0x09,0x18,0x01,0x4a,0x20,0x7d,0x09,0x18,0x01,0x4a,0x20,0x62,0x09,0x18,0x01,0x4a,0x20,0x50,0x09,0x18,0x01,0x4a,0x20,0x48,0x09,0x18,0x01,0x4a,0x20,0x0e,0x09,0x18,0x01,0x4a,0x2f,0xbe,0x04,0xed,0x00,0x01,0x00,0x4f,0x04,0xec,0x00,0x01,0x00,\r\n0x40,0x04,0xeb,0x40,0x61,0x09,0x0d,0x39,0xdf,0xe0,0x16,0x17,0x1c,0xd4,0xd5,0x16,0x17,0x1c,0x7b,0x7c,0x16,0x1b,0x7b,0x7c,0x19,0xd1,0xd2,0x16,0x17,0x1c,0x76,0x77,0x16,0x17,0x1c,0x6d,0x70,0x16,0x17,0x1c,0x6c,0x6f,0x16,0x17,0x1c,0x6b,0x6e,0x16,0x1b,0x6b,0x6e,0x7f,0x72,0x1a,0x74,0x75,0x14,0x15,0x1c,0x67,0x6a,0x14,0x15,0x1c,\r\n0x66,0x69,0x14,0x15,0x1c,0x65,0x68,0x14,0x1b,0x65,0x68,0x85,0x71,0x1a,0x19,0x73,0x16,0x7a,0x43,0x19,0x21,0x79,0x43,0x19,0x21,0x3b,0x39,0x00,0x2b,0x3a,0x39,0x00,0x2b,0x39,0x95,0x48,0x1f,0x2f,0xbc,0x04,0xe6,0x00,0x2f,0x05,0x03,0x00,0x02,0x05,0x03,0xb3,0x13,0xff,0x1f,0xe0,0xbe,0x04,0xf7,0x00,0x01,0x00,0xe0,0x04,0xf7,0x00,\r\n0x01,0x00,0x20,0x04,0xf0,0xb3,0x0d,0x11,0x39,0x40,0xb8,0x04,0xea,0xb2,0x0b,0x14,0x39,0xb9,0xff,0xc0,0x04,0xef,0xb3,0x1b,0x22,0x39,0x3f,0x41,0x0d,0x04,0xf4,0x00,0x01,0x00,0x8f,0x04,0xf3,0x00,0x01,0x00,0x30,0x04,0xf3,0x00,0x01,0x00,0x30,0x04,0xef,0x00,0x01,0x00,0x40,0x04,0xe8,0xb3,0x0b,0x10,0x39,0x30,0xbd,0x01,0x55,0x00,\r\n0x01,0x00,0x80,0x01,0x55,0x00,0x01,0x01,0x54,0xb3,0x95,0x24,0x1f,0x3f,0xbf,0x01,0x42,0x00,0x01,0x00,0x0f,0x01,0x41,0x00,0xa0,0x01,0x41,0x00,0x02,0xff,0xe0,0xb4,0xf1,0x29,0x2b,0x39,0x40,0xb8,0x01,0x40,0xb3,0x3d,0x43,0x39,0x40,0xb8,0x01,0x40,0xb3,0x24,0x28,0x39,0x40,0xb8,0x01,0x3f,0xb3,0x2c,0x2f,0x39,0x40,0xb8,0x01,0x3f,\r\n0xb3,0x17,0x1c,0x39,0x40,0xb8,0x01,0x3d,0x40,0x16,0x26,0x2b,0x39,0xe6,0xe7,0x03,0x2b,0x40,0xe7,0x2c,0x2e,0x39,0x40,0xe7,0x1b,0x1c,0x39,0x40,0x54,0x1f,0x1f,0x39,0xb8,0xff,0xc0,0x40,0x16,0xcb,0x23,0x23,0x39,0x40,0xd9,0x29,0x2a,0x39,0x53,0x52,0x02,0x2b,0x52,0xe2,0x02,0x2b,0x20,0xb0,0x0b,0x0d,0x39,0xb9,0x01,0x02,0x01,0x01,\r\n0x40,0x1b,0x02,0x2b,0xfd,0xfc,0x0a,0x2b,0xfb,0xaf,0x05,0x2b,0xf2,0xe2,0x02,0x2b,0xc3,0xc5,0x02,0x2b,0x40,0xda,0x17,0x19,0x39,0xdb,0xe2,0x02,0x2b,0xb8,0xff,0xc0,0xb3,0xe2,0x30,0x31,0x39,0xb8,0xff,0xc0,0x40,0x11,0xe2,0x1d,0x1e,0x39,0x40,0xd6,0x17,0x17,0x39,0xeb,0xbe,0x02,0x2b,0xbe,0x9a,0x02,0x2b,0xb8,0x01,0x84,0xb2,0x99,\r\n0x0a,0x2b,0xb8,0x01,0x81,0xb2,0x99,0x0a,0x2b,0xb8,0x01,0x80,0xb2,0x99,0x0a,0x2b,0xb8,0x01,0x7f,0x40,0x0f,0x99,0x0a,0x2b,0x9b,0x99,0x0a,0x2b,0x99,0x9a,0x02,0x2b,0x9a,0x95,0x05,0x2b,0xb8,0xff,0xe0,0xb7,0xee,0x14,0x16,0x39,0x92,0x91,0x03,0x2b,0xb8,0xff,0xe0,0x40,0x0c,0xf4,0x13,0x16,0x39,0xec,0x95,0x04,0x2b,0x91,0x95,0x24,\r\n0x1f,0xb8,0xff,0xe0,0x40,0x0b,0x63,0x18,0x19,0x39,0x66,0x63,0x01,0x96,0x95,0x02,0x2b,0xb8,0xff,0xe0,0x40,0x0c,0x95,0x25,0x28,0x39,0x38,0x37,0x00,0x2b,0x37,0x84,0xff,0x1f,0xb8,0x01,0x01,0xb6,0x7d,0x02,0x2b,0xfc,0xdb,0x0a,0x2b,0xb9,0x01,0x3e,0x01,0x3c,0xb2,0x02,0x2b,0x40,0xb8,0x01,0x3c,0xb2,0x1f,0x24,0x39,0xb8,0x01,0x2f,\r\n0xb2,0x7d,0x03,0x2b,0xb8,0x01,0x2e,0xb3,0x84,0x03,0x2b,0xd0,0xb8,0x01,0x2c,0xb5,0x01,0x40,0xd8,0x17,0x19,0x39,0xb8,0xff,0xc0,0x40,0x09,0xc4,0x22,0x25,0x39,0x40,0xc2,0x17,0x17,0x39,0xb8,0xff,0xc0,0xb3,0xc0,0x1a,0x1b,0x39,0xb8,0xff,0xc0,0xb7,0xc0,0x10,0x12,0x39,0xcd,0xcc,0x03,0x2b,0xb8,0xff,0xc0,0xb7,0xc9,0x23,0x23,0x39,\r\n0xca,0xc8,0x03,0x2b,0xb8,0xff,0xc0,0x40,0x16,0xf0,0x0b,0x0d,0x39,0xea,0x7e,0x02,0x2b,0x30,0x62,0x0c,0x0c,0x06,0x43,0xb1,0xaf,0x02,0x2b,0xaf,0x7e,0x02,0x2b,0xb8,0xff,0xc0,0xb3,0xd3,0x0f,0x12,0x39,0xb8,0xff,0xc0,0xb3,0xbd,0x27,0x28,0x39,0xbc,0x01,0x86,0x00,0x89,0x01,0x00,0x00,0x2b,0x01,0x85,0xb2,0x8a,0x0a,0x2b,0xb8,0xff,\r\n0xc0,0x40,0x1c,0x8c,0x1e,0x1e,0x39,0x89,0x8a,0x04,0x2b,0x8a,0x84,0x0a,0x2b,0x8b,0x84,0x03,0x2b,0x81,0x7f,0x01,0x2b,0x7d,0x7e,0x04,0x2b,0x7e,0x84,0x03,0x2b,0xb8,0xff,0xe0,0x40,0x41,0x62,0x18,0x19,0x39,0x62,0x84,0x01,0x2b,0x88,0x84,0x01,0x2b,0x87,0x84,0x01,0x2b,0x85,0x84,0x01,0x2b,0x83,0x84,0x04,0x2b,0xe9,0x84,0xf9,0x84,\r\n0x02,0x69,0x84,0x01,0x27,0x84,0x01,0x1b,0x37,0x15,0x18,0x36,0x15,0x15,0x35,0x15,0x12,0x34,0x15,0x0f,0x33,0x15,0x0c,0x32,0x15,0x09,0x31,0x15,0x06,0x30,0x15,0x03,0x2f,0x15,0x00,0x2e,0x15,0x41,0x26,0x01,0x4a,0x01,0x4b,0x00,0x15,0x00,0x50,0x01,0x4c,0x00,0x01,0x00,0x70,0x01,0x4a,0x00,0x01,0x01,0x3a,0x01,0x3b,0x00,0x0f,0x01,\r\n0x38,0x01,0x39,0x00,0x0e,0x01,0x36,0x01,0x37,0x00,0x0e,0x00,0x0b,0x01,0x38,0x00,0x3b,0x01,0x38,0x00,0x4b,0x01,0x38,0x00,0xcb,0x01,0x38,0x00,0x04,0x00,0x0b,0x01,0x36,0x00,0x3b,0x01,0x36,0x00,0x5b,0x01,0x36,0x00,0x03,0x00,0x10,0x01,0x3a,0x00,0x01,0x01,0x06,0xb2,0x03,0xff,0x1f,0x41,0x21,0x01,0x0a,0x01,0x0b,0x00,0x0f,0x01,\r\n0x08,0x01,0x09,0x00,0x0e,0x01,0x06,0x01,0x07,0x00,0x0e,0x00,0x6b,0x01,0x08,0x00,0x01,0x00,0x0b,0x01,0x08,0x00,0x3b,0x01,0x08,0x00,0x4b,0x01,0x08,0x00,0xbb,0x01,0x08,0x00,0xeb,0x01,0x08,0x00,0xfb,0x01,0x08,0x00,0x06,0x00,0x0b,0x01,0x0a,0x00,0x5b,0x01,0x0a,0x00,0x8b,0x01,0x0a,0x00,0x03,0x01,0x06,0x40,0x22,0x03,0xff,0x1f,\r\n0x26,0x27,0x0e,0x28,0x27,0x0f,0x35,0x36,0x0e,0x33,0x36,0x0f,0x2a,0x2b,0x0e,0x2c,0x2b,0x0f,0x22,0x23,0x0e,0x24,0x23,0x0f,0x1e,0x1f,0x0e,0x20,0x1f,0x0f,0x00,0xbf,0x01,0x31,0x00,0x10,0x01,0x31,0x00,0x20,0x01,0x31,0x00,0x03,0x00,0x00,0x01,0x30,0x40,0x80,0x01,0x70,0x2a,0xe0,0x2a,0x02,0x00,0x3c,0x01,0x10,0x24,0x40,0x24,0x70,\r\n0x24,0xa0,0x24,0x04,0x0f,0x10,0x11,0x0c,0x09,0x0a,0x0b,0x0c,0x06,0x07,0x08,0x0c,0x03,0x04,0x05,0x0c,0x00,0x01,0x02,0x0c,0x26,0x06,0x1c,0x1f,0x06,0x03,0x18,0x1f,0x0f,0x03,0x3f,0x03,0xdf,0x03,0x03,0x9f,0x00,0xdf,0x00,0x02,0x0f,0x17,0x1f,0x17,0x2f,0x17,0x03,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x1b,0x01,0x1d,0x0d,0x18,0x07,\r\n0x1a,0x0d,0x15,0x10,0x17,0x0d,0x12,0x04,0x14,0x0d,0x2f,0x1b,0x01,0x2c,0x3c,0x2a,0x3c,0x28,0x3c,0x26,0x3c,0x24,0x3c,0x22,0x3c,0x20,0x3c,0x1e,0x3c,0x1b,0x3c,0x18,0x3c,0x15,0x3c,0x12,0x3c,0x0f,0x3c,0x09,0x3c,0x06,0x3c,0x03,0x3c,0x00,0x3c,0x50,0x33,0x54,0x01,0xb0,0x12,0x4b,0x00,0x4b,0x54,0x42,0xb0,0x13,0x01,0x4b,0x00,0x4b,\r\n0x53,0x42,0xb0,0x33,0x2b,0x4b,0xb8,0x03,0x20,0x52,0xb0,0x32,0x2b,0x4b,0xb0,0x09,0x50,0x5b,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb0,0x33,0x2b,0xb0,0x02,0x88,0xb8,0x01,0x00,0x54,0xb0,0x04,0x88,0xb8,0x02,0x00,0x54,0xb0,0x12,0x43,0x5a,0x5b,0x58,0xb8,0x01,0x19,0xb1,0x01,0x01,0x8e,0x85,0x1b,0xb9,0x00,0x01,0x01,0x00,0xb0,0x4b,0x60,\r\n0x85,0x8d,0x59,0x2b,0x2b,0x1d,0xb0,0x64,0x4b,0x53,0x58,0xb0,0x80,0x1d,0x59,0xb0,0x32,0x4b,0x53,0x58,0xb0,0x90,0x1d,0x59,0x00,0x4b,0xb0,0x32,0x51,0xb0,0x1b,0x23,0x42,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x73,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0xb1,0x28,0x26,0x45,0xb0,0x2a,0x45,0x61,0xb0,0x2c,0x45,0x60,0x44,0x2b,0x2b,0x2b,0x73,0x73,0x74,0xb8,0x01,0x06,0x45,0x69,0xb8,0x01,0x0a,0x45,0x69,0x61,0xb8,0x01,0x0a,0x23,0x44,0xb8,0x01,0x08,0x45,0x69,0xb8,0x01,0x0a,0x45,0x60,0xb8,0x01,0x08,0x23,\r\n0x44,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x73,0xb8,0x01,0x3a,0x45,0x69,0xb8,0x01,0x38,0x45,0x69,0x60,0xb8,0x01,0x38,0x23,0x44,0xb8,0x01,0x3a,0x45,0x69,0xb8,0x01,0x36,0x45,0x69,0x60,0xb8,0x01,0x36,0x23,0x44,0x2b,0x2b,0x2b,0x73,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x01,0x73,0x74,0x75,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x2b,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0x2b,0x73,0x74,0x2b,0x73,0x73,0x73,0x73,0x2b,0x2b,0x2b,0x73,0x74,0x2b,0x73,0x2b,0x2b,0x2b,0x2b,0x2b,0xb0,0x18,0xb0,0x3f,0x4b,0x53,0x42,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x73,0x73,0xb1,\r\n0x09,0x32,0x2b,0x4b,0xb0,0x50,0x52,0x42,0x4b,0xb0,0x08,0x52,0x4b,0xb0,0x08,0x50,0x5b,0xb0,0x1a,0x23,0x42,0x4b,0xb0,0xc8,0x52,0x4b,0xb0,0x36,0x50,0x5b,0xb0,0x0c,0x23,0x42,0xb1,0x00,0x02,0x43,0x54,0xb1,0x02,0x02,0x43,0x54,0xb1,0x06,0x02,0x43,0x54,0x5b,0x5b,0x58,0x41,0x15,0x01,0x3e,0x00,0x64,0x01,0x3c,0x00,0x64,0x01,0x34,\r\n0x00,0x64,0x01,0x32,0x00,0x64,0x01,0x2f,0x00,0x64,0x01,0x2e,0x00,0x64,0x01,0x2c,0x00,0x64,0x01,0x0c,0x00,0x64,0x01,0x04,0x00,0x64,0x01,0x03,0x00,0x64,0x01,0x01,0x40,0x4f,0x64,0xff,0x64,0xfe,0x64,0xfc,0x64,0xf3,0x64,0xf1,0x64,0xf0,0x64,0xef,0x64,0xed,0x64,0xea,0x64,0xdc,0x64,0xda,0x64,0xd8,0x64,0xd3,0x64,0xcd,0x64,0xcc,\r\n0x64,0xca,0x64,0xc9,0x64,0xc8,0x64,0xc6,0x64,0xc4,0x64,0xc2,0x64,0xc0,0x64,0xbd,0x64,0xb4,0x64,0xb1,0x64,0xaf,0x64,0x8c,0x64,0x8b,0x64,0x8a,0x64,0x89,0x64,0x84,0x64,0x83,0x64,0x7f,0x64,0x7e,0x64,0x7d,0x64,0x62,0x64,0x50,0x64,0x48,0x64,0x0e,0x64,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x59,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x05,0xec,0x00,0x16,0x00,0x00,0x05,0x9a,0x00,0x18,0x00,0x00,0x05,0x9a,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0xff,0xe8,\r\n0xff,0x89,0x00,0x00,0xff,0xe8,0xff,0x89,0x00,0x00,0xff,0xe8,0xfe,0x4e,0xfe,0x29,0xff,0xf5,0x00,0x00,0x05,0x9a,0x00,0x00,0xfe,0xba,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xcd,0xff,0xed,0x05,0xa1,0x00,0x0d,0x02,0x48,0xff,0xeb,0x03,0x59,0x00,0x0d,0x00,0x00,0xff,0xeb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0xff,0xed,0x04,0x33,0x00,0x12,0x00,0xa4,0x00,0xab,0x00,0x8b,0x00,0x81,0x00,0x77,0xfe,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x71,0x00,0x80,\r\n0x00,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0xd6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x00,0xa8,0x00,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x00,0xa4,0x00,0x9b,0x00,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x97,0x00,0x8c,0x00,0x00,\r\n0x00,0x00,0x00,0x8a,0x00,0x83,0x00,0x00,0x00,0x00,0x00,0x94,0x00,0x8a,0x00,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xe0,0x00,0xa0,0x00,0xe4,0x01,0xbe,\r\n0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x86,0x00,0x86,0x00,0x00,0x00,0xc5,0x00,0xc3,0x00,0x81,0x00,0x4a,0x00,0x5a,0x00,0x51,0x05,0xdb,0x05,0xdb,0x00,0x86,0x00,0x58,0x00,0x90,0x00,0x58,0x00,0x8a,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xcf,\r\n0x00,0x00,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x78,0x00,0x77,0x00,0x7a,0x00,0x61,0x00,0x7a,0x00,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x81,0x00,0x6b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x6d,0x00,0x00,0x00,0x00,0x00,0x92,0x00,0x81,0x00,0x92,0x00,0x8b,0x00,0xa0,0x00,0x97,0x01,0xd3,0x00,0x4c,0x00,0x74,0x00,0x64,\r\n0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x23,0x00,0xc9,0x00,0x6a,0x00,0x6d,0x00,0x4c,0x00,0x61,0x00,0x69,0x00,0xc8,0x00,0xa2,0x00,0x80,0x00,0x7e,0x00,0x6b,0x05,0x9a,0x00,0x11,0x02,0x24,0x00,0x11,0x03,0x00,0xff,0xef,0x00,0x81,0x00,0x67,0x00,0x71,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x00,0x63,0x00,0x96,0x00,0xc0,0xfe,0xbc,0xfe,0xf2,0x00,0x64,0x00,0x64,\r\n0x00,0x76,0x00,0x7c,0x02,0xf6,0x00,0x0d,0x02,0x00,0x00,0x0d,0x04,0x96,0xff,0xf3,0x00,0x54,0x00,0x46,0x00,0x6a,0x00,0x6b,0x00,0x4c,0x07,0x69,0xfe,0x31,0x00,0xe4,0x00,0xbc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0xcd,0x00,0x11,0x06,0xa0,0x00,0x00,0xff,0xed,0xfe,0x00,0x00,0xaa,0x00,0xb6,0x00,0x6c,0x00,0x00,\r\n0x00,0xaa,0x00,0xb8,0x00,0x6c,0x00,0xbb,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0xfe,0x63,0xfd,0x6d,\r\n0xfd,0x76,0xff,0x82,0xff,0x83,0x05,0xe9,0x05,0xe3,0x04,0xbe,0x04,0xec,0x03,0x64,0x04,0x19,0x00,0x6e,0x00,0x7f,0x00,0x8c,0x00,0x9b,0x00,0xa7,0x00,0x6e,0x00,0x7f,0x00,0x91,0x00,0xa0,0x00,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x83,0x00,0xbc,0x00,0x94,0x00,0x94,0xff,0x85,0xff,0xae,0x00,0x52,0x00,0x29,0x06,0x14,0x00,0xae,0x00,0x46,0x00,0x46,0xfe,0x58,\r\n0x05,0x60,0x00,0x8f,0x00,0x85,0x00,0x85,0x00,0x5c,0x00,0x54,0x00,0x46,0x00,0xa7,0x00,0x98,0x00,0x58,0x00,0xe1,0x00,0x9e,0x00,0x4b,0x00,0x69,0x00,0xb4,0xff,0xe8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x9c,0x00,0x64,0x00,0xe1,0x00,0x5a,0x00,0x4b,0x00,0x00,0x05,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0xbe,0x00,0x00,0x01,0x0a,0x00,0x00,0x02,0x3e,0x00,0x00,0x03,0x84,0x00,0x00,0x04,0xd2,0x00,0x00,0x06,0xca,0x00,0x00,0x06,0xf2,0x00,0x00,0x07,0x66,0x00,0x00,0x07,0xe2,0x00,0x00,0x08,0x8e,0x00,0x00,0x09,0x08,0x00,0x00,0x09,0x6a,\r\n0x00,0x00,0x09,0xa2,0x00,0x00,0x09,0xea,0x00,0x00,0x0a,0x22,0x00,0x00,0x0a,0xa6,0x00,0x00,0x0a,0xf8,0x00,0x00,0x0b,0xb0,0x00,0x00,0x0c,0x9c,0x00,0x00,0x0d,0x28,0x00,0x00,0x0d,0xe8,0x00,0x00,0x0e,0xc4,0x00,0x00,0x0f,0x3a,0x00,0x00,0x10,0x66,0x00,0x00,0x11,0x42,0x00,0x00,0x11,0xca,0x00,0x00,0x12,0x6a,0x00,0x00,0x12,0xda,\r\n0x00,0x00,0x13,0x36,0x00,0x00,0x13,0xa6,0x00,0x00,0x14,0x80,0x00,0x00,0x15,0xfc,0x00,0x00,0x17,0x10,0x00,0x00,0x18,0x52,0x00,0x00,0x19,0x3e,0x00,0x00,0x1a,0x18,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0x4c,0x00,0x00,0x1c,0x58,0x00,0x00,0x1d,0x00,0x00,0x00,0x1d,0x28,0x00,0x00,0x1d,0xc6,0x00,0x00,0x1e,0xa4,0x00,0x00,0x1f,0x4a,\r\n0x00,0x00,0x20,0x64,0x00,0x00,0x21,0x58,0x00,0x00,0x22,0x42,0x00,0x00,0x23,0x18,0x00,0x00,0x23,0xd0,0x00,0x00,0x25,0x02,0x00,0x00,0x26,0x66,0x00,0x00,0x27,0x0a,0x00,0x00,0x27,0xbc,0x00,0x00,0x28,0xbe,0x00,0x00,0x2a,0x6c,0x00,0x00,0x2b,0x84,0x00,0x00,0x2c,0x28,0x00,0x00,0x2c,0xfe,0x00,0x00,0x2d,0x5c,0x00,0x00,0x2d,0x90,\r\n0x00,0x00,0x2d,0xea,0x00,0x00,0x2e,0x3a,0x00,0x00,0x2e,0x64,0x00,0x00,0x2e,0x9c,0x00,0x00,0x2f,0xaa,0x00,0x00,0x30,0xa2,0x00,0x00,0x31,0x70,0x00,0x00,0x32,0x66,0x00,0x00,0x33,0x6e,0x00,0x00,0x34,0x38,0x00,0x00,0x35,0x74,0x00,0x00,0x36,0x46,0x00,0x00,0x36,0xce,0x00,0x00,0x37,0x8a,0x00,0x00,0x38,0x5a,0x00,0x00,0x38,0xac,\r\n0x00,0x00,0x39,0xe8,0x00,0x00,0x3a,0xba,0x00,0x00,0x3b,0x98,0x00,0x00,0x3c,0x90,0x00,0x00,0x3d,0x82,0x00,0x00,0x3e,0x16,0x00,0x00,0x3f,0x38,0x00,0x00,0x3f,0xfa,0x00,0x00,0x40,0xd6,0x00,0x00,0x41,0x8a,0x00,0x00,0x42,0xc4,0x00,0x00,0x43,0xf8,0x00,0x00,0x44,0xe4,0x00,0x00,0x45,0xb8,0x00,0x00,0x46,0x6c,0x00,0x00,0x46,0x9a,\r\n0x00,0x00,0x47,0x54,0x00,0x00,0x47,0xde,0x00,0x00,0x48,0x1a,0x00,0x00,0x49,0xee,0x00,0x00,0x4a,0x06,0x00,0x00,0x4a,0x34,0x00,0x00,0x4a,0x62,0x00,0x00,0x4a,0x98,0x00,0x00,0x4a,0xca,0x00,0x00,0x4a,0xf8,0x00,0x00,0x4b,0x26,0x00,0x00,0x4b,0x56,0x00,0x00,0x4b,0x88,0x00,0x00,0x4b,0xb8,0x00,0x00,0x4b,0xec,0x00,0x00,0x4c,0x04,\r\n0x00,0x00,0x4c,0x32,0x00,0x00,0x4c,0x60,0x00,0x00,0x4c,0x90,0x00,0x00,0x4c,0xc2,0x00,0x00,0x4c,0xee,0x00,0x00,0x4d,0x1a,0x00,0x00,0x4d,0x4a,0x00,0x00,0x4d,0x7e,0x00,0x00,0x4d,0xae,0x00,0x00,0x4d,0xde,0x00,0x00,0x4e,0x0c,0x00,0x00,0x4e,0x3a,0x00,0x00,0x4e,0x6c,0x00,0x00,0x4e,0x9a,0x00,0x00,0x4e,0xca,0x00,0x00,0x4e,0xf8,\r\n0x00,0x00,0x4f,0x26,0x00,0x00,0x4f,0x58,0x00,0x00,0x4f,0xc8,0x00,0x00,0x50,0x4e,0x00,0x00,0x51,0x30,0x00,0x00,0x51,0xec,0x00,0x00,0x53,0x48,0x00,0x00,0x53,0x8e,0x00,0x00,0x54,0x42,0x00,0x00,0x55,0x52,0x00,0x00,0x55,0x62,0x00,0x00,0x56,0x80,0x00,0x00,0x57,0xa2,0x00,0x00,0x58,0x6e,0x00,0x00,0x58,0xa0,0x00,0x00,0x59,0x16,\r\n0x00,0x00,0x59,0xec,0x00,0x00,0x5a,0xee,0x00,0x00,0x5c,0x78,0x00,0x00,0x5d,0x82,0x00,0x00,0x5e,0x1e,0x00,0x00,0x5e,0xb4,0x00,0x00,0x5f,0x4c,0x00,0x00,0x60,0x4a,0x00,0x00,0x60,0xf2,0x00,0x00,0x61,0xd2,0x00,0x00,0x62,0x52,0x00,0x00,0x62,0xb4,0x00,0x00,0x63,0x3c,0x00,0x00,0x64,0x0a,0x00,0x00,0x64,0x82,0x00,0x00,0x65,0xb6,\r\n0x00,0x00,0x67,0x24,0x00,0x00,0x68,0x74,0x00,0x00,0x69,0x4c,0x00,0x00,0x69,0x4c,0x00,0x00,0x69,0xc4,0x00,0x00,0x6a,0x10,0x00,0x00,0x6a,0x82,0x00,0x00,0x6b,0x68,0x00,0x00,0x6c,0x7e,0x00,0x00,0x6c,0xfc,0x00,0x00,0x6d,0x66,0x00,0x00,0x6d,0xd0,0x00,0x00,0x6e,0x90,0x00,0x00,0x6e,0xbe,0x00,0x00,0x6e,0xee,0x00,0x00,0x6f,0x1c,\r\n0x00,0x00,0x70,0x4e,0x00,0x00,0x71,0xe0,0x00,0x00,0x72,0x0a,0x00,0x00,0x72,0x34,0x00,0x00,0x72,0x82,0x00,0x00,0x72,0xd0,0x00,0x00,0x73,0x06,0x00,0x00,0x73,0x38,0x00,0x00,0x73,0xda,0x00,0x00,0x74,0x3c,0x00,0x00,0x74,0x6c,0x00,0x00,0x74,0xa0,0x00,0x00,0x74,0xce,0x00,0x00,0x76,0x0e,0x00,0x00,0x76,0x50,0x00,0x00,0x76,0x92,\r\n0x00,0x00,0x77,0xae,0x00,0x00,0x78,0xa0,0x00,0x00,0x79,0x54,0x00,0x00,0x79,0x96,0x00,0x00,0x79,0xde,0x00,0x00,0x7a,0x56,0x00,0x00,0x7c,0x38,0x00,0x00,0x7c,0x68,0x00,0x00,0x7c,0x98,0x00,0x00,0x7c,0xc8,0x00,0x00,0x7c,0xfa,0x00,0x00,0x7d,0x2a,0x00,0x00,0x7d,0x58,0x00,0x00,0x7d,0x86,0x00,0x00,0x7d,0xb8,0x00,0x00,0x7d,0xe6,\r\n0x00,0x00,0x7e,0x14,0x00,0x00,0x7e,0x42,0x00,0x00,0x7e,0x70,0x00,0x00,0x7e,0x9e,0x00,0x00,0x7e,0xcc,0x00,0x00,0x7e,0xfc,0x00,0x00,0x7f,0x46,0x00,0x00,0x7f,0x86,0x00,0x00,0x80,0x16,0x00,0x00,0x80,0x42,0x00,0x00,0x80,0xa4,0x00,0x00,0x80,0xe2,0x00,0x00,0x81,0x7c,0x00,0x00,0x82,0x16,0x00,0x00,0x82,0x8e,0x00,0x00,0x82,0xe4,\r\n0x00,0x00,0x83,0x26,0x00,0x00,0x84,0x22,0x00,0x00,0x84,0xb6,0x00,0x00,0x84,0xe4,0x00,0x00,0x85,0x10,0x00,0x00,0x85,0x3e,0x00,0x00,0x85,0x6a,0x00,0x00,0x85,0xb2,0x00,0x00,0x86,0xb4,0x00,0x00,0x88,0x30,0x00,0x00,0x88,0x5e,0x00,0x00,0x88,0x8c,0x00,0x00,0x89,0x50,0x00,0x00,0x8a,0x4a,0x00,0x00,0x8a,0x96,0x00,0x00,0x8a,0xf6,\r\n0x00,0x00,0x8b,0x40,0x00,0x00,0x8b,0xd8,0x00,0x00,0x8c,0x94,0x00,0x00,0x8c,0xbe,0x00,0x00,0x8c,0xea,0x00,0x00,0x8d,0x16,0x00,0x00,0x8d,0xd4,0x00,0x00,0x8e,0x04,0x00,0x00,0x8e,0x32,0x00,0x00,0x8e,0x60,0x00,0x00,0x8e,0x78,0x00,0x00,0x8e,0x90,0x00,0x00,0x8e,0xbe,0x00,0x00,0x8e,0xec,0x00,0x00,0x8f,0x1a,0x00,0x00,0x8f,0x48,\r\n0x00,0x00,0x90,0x80,0x00,0x00,0x90,0xac,0x00,0x00,0x90,0xbc,0x00,0x00,0x90,0xec,0x00,0x00,0x91,0x1c,0x00,0x00,0x91,0x34,0x00,0x00,0x91,0x4c,0x00,0x00,0x91,0x7a,0x00,0x00,0x91,0xa6,0x00,0x00,0x91,0xb6,0x00,0x00,0x91,0xce,0x00,0x00,0x91,0xe6,0x00,0x00,0x92,0x16,0x00,0x00,0x92,0x44,0x00,0x00,0x92,0x72,0x00,0x00,0x92,0xa2,\r\n0x00,0x00,0x92,0xd0,0x00,0x00,0x92,0xfc,0x00,0x00,0x93,0x24,0x00,0x00,0x93,0x4a,0x00,0x00,0x93,0x78,0x00,0x00,0x93,0xa8,0x00,0x00,0x93,0xd8,0x00,0x00,0x94,0x06,0x00,0x00,0x94,0x3a,0x00,0x00,0x94,0x6c,0x00,0x00,0x94,0x8e,0x00,0x00,0x94,0xbc,0x00,0x00,0x94,0xde,0x00,0x00,0x95,0x0a,0x00,0x00,0x95,0x2c,0x00,0x00,0x95,0x4e,\r\n0x00,0x00,0x95,0x74,0x00,0x00,0x95,0x8c,0x00,0x00,0x95,0xba,0x00,0x00,0x96,0x82,0x00,0x00,0x96,0xc0,0x00,0x00,0x96,0xf2,0x00,0x00,0x97,0x52,0x00,0x00,0x97,0x86,0x00,0x00,0x97,0xb6,0x00,0x00,0x97,0xe4,0x00,0x00,0x98,0x14,0x00,0x00,0x98,0x42,0x00,0x00,0x98,0xb0,0x00,0x00,0x99,0xd6,0x00,0x00,0x9b,0x46,0x00,0x00,0x9c,0xc6,\r\n0x00,0x00,0x9e,0x22,0x00,0x00,0x9f,0x28,0x00,0x00,0x9f,0xf6,0x00,0x00,0xa0,0xb2,0x00,0x00,0xa2,0x28,0x00,0x00,0xa2,0x7c,0x00,0x00,0xa2,0x94,0x00,0x00,0xa2,0xfc,0x00,0x00,0xa4,0x9a,0x00,0x00,0xa4,0xc2,0x00,0x00,0xa5,0x12,0x00,0x00,0xa5,0x44,0x00,0x00,0xa5,0x7a,0x00,0x00,0xa5,0xe0,0x00,0x00,0xa6,0xd6,0x00,0x00,0xa7,0x86,\r\n0x00,0x00,0xa7,0xea,0x00,0x00,0xa8,0x2c,0x00,0x00,0xa8,0x98,0x00,0x00,0xa8,0xf2,0x00,0x00,0xa9,0x86,0x00,0x00,0xa9,0xb4,0x00,0x00,0xa9,0xe2,0x00,0x00,0xaa,0x10,0x00,0x00,0xaa,0x40,0x00,0x00,0xaa,0x6e,0x00,0x00,0xaa,0x9c,0x00,0x00,0xaa,0xca,0x00,0x00,0xaa,0xf8,0x00,0x00,0xab,0x26,0x00,0x00,0xab,0x56,0x00,0x00,0xab,0x86,\r\n0x00,0x00,0xab,0xb4,0x00,0x00,0xab,0xe2,0x00,0x00,0xac,0x10,0x00,0x00,0xac,0x3e,0x00,0x00,0xac,0x6c,0x00,0x00,0xac,0x92,0x00,0x00,0xad,0xd0,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x30,0x00,0x00,0xaf,0x18,0x00,0x00,0xb0,0x24,0x00,0x00,0xb0,0x52,0x00,0x00,0xb0,0x80,0x00,0x00,0xb0,0xae,0x00,0x00,0xb0,0xdc,0x00,0x00,0xb1,0x0a,\r\n0x00,0x00,0xb1,0x38,0x00,0x00,0xb1,0x5c,0x00,0x00,0xb1,0x80,0x00,0x00,0xb1,0xae,0x00,0x00,0xb1,0xd0,0x00,0x00,0xb1,0xf6,0x00,0x00,0xb2,0x1c,0x00,0x00,0xb2,0xb8,0x00,0x00,0xb2,0xd0,0x00,0x00,0xb2,0xe8,0x00,0x00,0xb3,0x10,0x00,0x00,0xb3,0x36,0x00,0x00,0xb4,0x4a,0x00,0x00,0xb5,0x38,0x00,0x00,0xb5,0x66,0x00,0x00,0xb5,0x94,\r\n0x00,0x00,0xb5,0xc2,0x00,0x00,0xb5,0xf0,0x00,0x00,0xb6,0x08,0x00,0x00,0xb6,0x2c,0x00,0x00,0xb6,0x4e,0x00,0x00,0xb6,0x6e,0x00,0x00,0xb7,0x4a,0x00,0x00,0xb8,0x38,0x00,0x00,0xb8,0x66,0x00,0x00,0xb8,0x94,0x00,0x00,0xb8,0xc2,0x00,0x00,0xb8,0xf2,0x00,0x00,0xb9,0x22,0x00,0x00,0xb9,0x52,0x00,0x00,0xb9,0x6a,0x00,0x00,0xb9,0x82,\r\n0x00,0x00,0xb9,0xb0,0x00,0x00,0xb9,0xe0,0x00,0x00,0xba,0x0e,0x00,0x00,0xba,0x3c,0x00,0x00,0xba,0xa6,0x00,0x00,0xbc,0x2c,0x00,0x00,0xbc,0x82,0x00,0x00,0xbc,0xb0,0x00,0x00,0xbc,0xde,0x00,0x00,0xbd,0x0c,0x00,0x00,0xbd,0x3c,0x00,0x00,0xbd,0x7e,0x00,0x00,0xbd,0xae,0x00,0x00,0xbd,0xde,0x00,0x00,0xbe,0x10,0x00,0x00,0xbe,0x3e,\r\n0x00,0x00,0xbe,0x72,0x00,0x00,0xbe,0xa6,0x00,0x00,0xbe,0xda,0x00,0x00,0xbf,0x0a,0x00,0x00,0xbf,0x42,0x00,0x00,0xbf,0x6e,0x00,0x00,0xc0,0x66,0x00,0x00,0xc1,0x16,0x00,0x00,0xc1,0x44,0x00,0x00,0xc1,0x72,0x00,0x00,0xc1,0xa0,0x00,0x00,0xc1,0xce,0x00,0x00,0xc2,0x02,0x00,0x00,0xc2,0x36,0x00,0x00,0xc2,0x46,0x00,0x00,0xc2,0x72,\r\n0x00,0x00,0xc2,0xf8,0x00,0x00,0xc3,0x24,0x00,0x00,0xc3,0x54,0x00,0x00,0xc3,0x84,0x00,0x00,0xc3,0xa8,0x00,0x00,0xc3,0xd4,0x00,0x00,0xc4,0x04,0x00,0x00,0xc4,0x34,0x00,0x00,0xc4,0x6a,0x00,0x00,0xc4,0x7a,0x00,0x00,0xc4,0x8a,0x00,0x00,0xc4,0x9a,0x00,0x00,0xc4,0xaa,0x00,0x00,0xc4,0xba,0x00,0x00,0xc4,0xca,0x00,0x00,0xc4,0xda,\r\n0x00,0x00,0xc5,0x6e,0x00,0x00,0xc5,0x7e,0x00,0x00,0xc5,0x8e,0x00,0x00,0xc6,0x18,0x00,0x00,0xc6,0x28,0x00,0x00,0xc6,0xbc,0x00,0x00,0xc6,0xcc,0x00,0x00,0xc7,0x62,0x00,0x00,0xc7,0x72,0x00,0x00,0xc7,0x82,0x00,0x00,0xc7,0x92,0x00,0x00,0xc8,0xb4,0x00,0x00,0xc8,0xc4,0x00,0x00,0xc8,0xf6,0x00,0x00,0xc9,0x2a,0x00,0x00,0xc9,0x58,\r\n0x00,0x00,0xc9,0x86,0x00,0x00,0xc9,0xb4,0x00,0x00,0xc9,0xe2,0x00,0x00,0xca,0x1a,0x00,0x00,0xcb,0x52,0x00,0x00,0xcc,0x3e,0x00,0x00,0xcc,0xfc,0x00,0x00,0xcd,0xc0,0x00,0x00,0xce,0xea,0x00,0x00,0xcf,0x60,0x00,0x00,0xd0,0x4a,0x00,0x00,0xd0,0xe6,0x00,0x00,0xd1,0xde,0x00,0x00,0xd2,0x80,0x00,0x00,0xd3,0xbe,0x00,0x00,0xd3,0xce,\r\n0x00,0x00,0xd4,0xac,0x00,0x00,0xd5,0x98,0x00,0x00,0xd6,0x96,0x00,0x00,0xd7,0x8e,0x00,0x00,0xd8,0xd4,0x00,0x00,0xda,0x1e,0x00,0x00,0xda,0x50,0x00,0x00,0xda,0x84,0x00,0x00,0xda,0xb4,0x00,0x00,0xda,0xe2,0x00,0x00,0xdb,0x10,0x00,0x00,0xdb,0x42,0x00,0x00,0xdc,0x4c,0x00,0x00,0xdc,0x7e,0x00,0x00,0xdd,0x70,0x00,0x00,0xdd,0x80,\r\n0x00,0x00,0xdd,0xb2,0x00,0x00,0xde,0xe2,0x00,0x00,0xdf,0xf2,0x00,0x00,0xe0,0xf8,0x00,0x00,0xe1,0x2a,0x00,0x00,0xe1,0x58,0x00,0x00,0xe2,0x3a,0x00,0x00,0xe2,0x4a,0x00,0x00,0xe3,0x32,0x00,0x00,0xe3,0x42,0x00,0x00,0xe3,0x52,0x00,0x00,0xe4,0x70,0x00,0x00,0xe4,0x80,0x00,0x00,0xe5,0x9e,0x00,0x00,0xe6,0xdc,0x00,0x00,0xe7,0xc4,\r\n0x00,0x00,0xe7,0xf2,0x00,0x00,0xe8,0x02,0x00,0x00,0xe8,0xbc,0x00,0x00,0xe8,0xcc,0x00,0x00,0xe8,0xdc,0x00,0x00,0xe8,0xec,0x00,0x00,0xe8,0xfc,0x00,0x00,0xe9,0x0c,0x00,0x00,0xe9,0x1c,0x00,0x00,0xe9,0x2c,0x00,0x00,0xe9,0xd4,0x00,0x00,0xeb,0x50,0x00,0x00,0xeb,0x60,0x00,0x00,0xec,0x44,0x00,0x00,0xed,0x02,0x00,0x00,0xed,0xd8,\r\n0x00,0x00,0xef,0x12,0x00,0x00,0xef,0xf4,0x00,0x00,0xf0,0xf6,0x00,0x00,0xf1,0xc0,0x00,0x00,0xf2,0xd2,0x00,0x00,0xf4,0x1c,0x00,0x00,0xf5,0x22,0x00,0x00,0xf5,0x32,0x00,0x00,0xf6,0x46,0x00,0x00,0xf7,0x42,0x00,0x00,0xf7,0xaa,0x00,0x00,0xf8,0xac,0x00,0x00,0xf8,0xbc,0x00,0x00,0xf9,0xd6,0x00,0x00,0xfa,0xde,0x00,0x00,0xfb,0xa8,\r\n0x00,0x00,0xfb,0xd4,0x00,0x00,0xfb,0xe4,0x00,0x00,0xfc,0xb2,0x00,0x00,0xfd,0xac,0x00,0x00,0xfe,0x44,0x00,0x00,0xfe,0x54,0x00,0x00,0xfe,0xd8,0x00,0x00,0xfe,0xe8,0x00,0x00,0xfe,0xf8,0x00,0x00,0xff,0x66,0x00,0x00,0xff,0x76,0x00,0x01,0x00,0xd8,0x00,0x01,0x00,0xe8,0x00,0x01,0x01,0xac,0x00,0x01,0x02,0x4a,0x00,0x01,0x03,0x26,\r\n0x00,0x01,0x04,0x54,0x00,0x01,0x05,0x16,0x00,0x01,0x06,0x12,0x00,0x01,0x06,0xc4,0x00,0x01,0x07,0xae,0x00,0x01,0x08,0xc8,0x00,0x01,0x09,0xc8,0x00,0x01,0x09,0xf8,0x00,0x01,0x0b,0x1c,0x00,0x01,0x0b,0x4a,0x00,0x01,0x0c,0x24,0x00,0x01,0x0c,0x34,0x00,0x01,0x0c,0x66,0x00,0x01,0x0d,0x98,0x00,0x01,0x0e,0xa4,0x00,0x01,0x0f,0xa6,\r\n0x00,0x01,0x0f,0xd4,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x11,0x68,0x00,0x01,0x11,0xf0,0x00,0x01,0x12,0x00,0x00,0x01,0x13,0x64,0x00,0x01,0x14,0x6c,0x00,0x01,0x14,0xf8,0x00,0x01,0x15,0x9a,0x00,0x01,0x15,0xf4,0x00,0x01,0x17,0x08,0x00,0x01,0x17,0x18,0x00,0x01,0x17,0x2e,0x00,0x01,0x17,0x44,0x00,0x01,0x18,0x2a,\r\n0x00,0x01,0x19,0x62,0x00,0x01,0x1a,0x6c,0x00,0x01,0x1b,0x42,0x00,0x01,0x1c,0x28,0x00,0x01,0x1c,0x8c,0x00,0x01,0x1c,0xce,0x00,0x01,0x1c,0xf6,0x00,0x01,0x1d,0x1e,0x00,0x01,0x1d,0x7c,0x00,0x01,0x1d,0xe2,0x00,0x01,0x1e,0x76,0x00,0x01,0x1f,0x08,0x00,0x01,0x1f,0x78,0x00,0x01,0x1f,0xe8,0x00,0x01,0x20,0xa2,0x00,0x01,0x21,0x50,\r\n0x00,0x01,0x21,0xc6,0x00,0x01,0x22,0x68,0x00,0x01,0x22,0xde,0x00,0x01,0x23,0x56,0x00,0x01,0x24,0x1a,0x00,0x01,0x24,0xd4,0x00,0x01,0x25,0x82,0x00,0x01,0x25,0xa8,0x00,0x01,0x25,0xd0,0x00,0x01,0x26,0x00,0x00,0x01,0x26,0x2e,0x00,0x01,0x26,0x62,0x00,0x01,0x26,0x94,0x00,0x01,0x26,0xc8,0x00,0x01,0x26,0xf8,0x00,0x01,0x27,0x2c,\r\n0x00,0x01,0x27,0x60,0x00,0x01,0x27,0x94,0x00,0x01,0x27,0xc4,0x00,0x01,0x28,0x04,0x00,0x01,0x28,0x42,0x00,0x01,0x28,0x76,0x00,0x01,0x28,0xa8,0x00,0x01,0x28,0xdc,0x00,0x01,0x29,0x0e,0x00,0x01,0x29,0x54,0x00,0x01,0x29,0x88,0x00,0x01,0x29,0xba,0x00,0x01,0x29,0xea,0x00,0x01,0x2a,0x28,0x00,0x01,0x2a,0x66,0x00,0x01,0x2a,0x8c,\r\n0x00,0x01,0x2a,0xb2,0x00,0x01,0x2a,0xe0,0x00,0x01,0x2b,0x0e,0x00,0x01,0x2b,0x40,0x00,0x01,0x2b,0x6e,0x00,0x01,0x2b,0xa0,0x00,0x01,0x2b,0xd4,0x00,0x01,0x2c,0x06,0x00,0x01,0x2c,0x36,0x00,0x01,0x2c,0x68,0x00,0x01,0x2c,0x9a,0x00,0x01,0x2c,0xcc,0x00,0x01,0x2c,0xfc,0x00,0x01,0x2d,0x3c,0x00,0x01,0x2d,0x7a,0x00,0x01,0x2d,0xa8,\r\n0x00,0x01,0x2d,0xd4,0x00,0x01,0x2d,0xf8,0x00,0x01,0x2e,0x1e,0x00,0x01,0x2e,0x46,0x00,0x01,0x2e,0x6c,0x00,0x01,0x2e,0x9c,0x00,0x01,0x2e,0xcc,0x00,0x01,0x2e,0xfe,0x00,0x01,0x2f,0x30,0x00,0x01,0x2f,0x62,0x00,0x01,0x2f,0x94,0x00,0x01,0x2f,0xc8,0x00,0x01,0x2f,0xfc,0x00,0x01,0x30,0x2e,0x00,0x01,0x30,0x60,0x00,0x01,0x30,0x9e,\r\n0x00,0x01,0x30,0xde,0x00,0x01,0x31,0x0c,0x00,0x01,0x31,0x3c,0x00,0x01,0x31,0x6a,0x00,0x01,0x31,0x9a,0x00,0x01,0x31,0xc8,0x00,0x01,0x31,0xf8,0x00,0x01,0x32,0x26,0x00,0x01,0x32,0x54,0x00,0x01,0x32,0x7a,0x00,0x01,0x32,0xa0,0x00,0x01,0x32,0xc6,0x00,0x01,0x32,0xee,0x00,0x01,0x33,0x1c,0x00,0x01,0x33,0x4a,0x00,0x01,0x33,0x78,\r\n0x00,0x01,0x33,0xa6,0x00,0x01,0x33,0xd4,0x00,0x01,0x34,0x02,0x00,0x01,0x34,0x32,0x00,0x01,0x34,0x62,0x00,0x01,0x34,0x90,0x00,0x01,0x34,0xbe,0x00,0x01,0x34,0xe4,0x00,0x01,0x35,0x0a,0x00,0x01,0x35,0x30,0x00,0x01,0x35,0x58,0x00,0x01,0x35,0x86,0x00,0x01,0x35,0xb4,0x00,0x01,0x35,0xe2,0x00,0x01,0x36,0x12,0x00,0x01,0x36,0x38,\r\n0x00,0x01,0x36,0x5e,0x00,0x01,0x36,0x8e,0x00,0x01,0x36,0xbe,0x00,0x01,0x36,0xee,0x00,0x01,0x37,0x1e,0x00,0x01,0x37,0x2e,0x00,0x01,0x37,0x3e,0x00,0x01,0x37,0x4e,0x00,0x01,0x37,0x5e,0x00,0x01,0x37,0xee,0x00,0x01,0x38,0x82,0x00,0x01,0x39,0xaa,0x00,0x01,0x3a,0xb0,0x00,0x01,0x3b,0x86,0x00,0x01,0x3c,0x44,0x00,0x01,0x3d,0x44,\r\n0x00,0x01,0x3e,0x0e,0x00,0x01,0x3f,0x00,0x00,0x01,0x3f,0xd6,0x00,0x01,0x3f,0xe6,0x00,0x01,0x40,0x8a,0x00,0x01,0x41,0x58,0x00,0x01,0x42,0x02,0x00,0x01,0x42,0xc8,0x00,0x01,0x43,0x84,0x00,0x01,0x44,0x72,0x00,0x01,0x45,0x4a,0x00,0x01,0x45,0xf6,0x00,0x01,0x46,0x06,0x00,0x01,0x46,0xe0,0x00,0x01,0x47,0x8e,0x00,0x01,0x48,0x60,\r\n0x00,0x01,0x49,0x2a,0x00,0x01,0x49,0x80,0x00,0x01,0x49,0xce,0x00,0x01,0x4a,0x22,0x00,0x01,0x4a,0x6e,0x00,0x01,0x4b,0x0c,0x00,0x01,0x4b,0xa0,0x00,0x01,0x4c,0x3e,0x00,0x01,0x4c,0xc6,0x00,0x01,0x4d,0xa8,0x00,0x01,0x4e,0x62,0x00,0x01,0x4e,0xba,0x00,0x01,0x4f,0x12,0x00,0x01,0x4f,0x88,0x00,0x01,0x4f,0xf4,0x00,0x01,0x50,0x88,\r\n0x00,0x01,0x51,0x12,0x00,0x01,0x51,0x2a,0x00,0x01,0x51,0x42,0x00,0x01,0x51,0x84,0x00,0x01,0x51,0xc6,0x00,0x01,0x51,0xf6,0x00,0x01,0x52,0x24,0x00,0x01,0x52,0x58,0x00,0x01,0x52,0x8c,0x00,0x01,0x52,0xc0,0x00,0x01,0x52,0xf2,0x00,0x01,0x53,0x1c,0x00,0x01,0x53,0x46,0x00,0x01,0x53,0x76,0x00,0x01,0x53,0xa6,0x00,0x01,0x53,0xda,\r\n0x00,0x01,0x54,0x0c,0x00,0x01,0x54,0x40,0x00,0x01,0x54,0x72,0x00,0x01,0x54,0xa2,0x00,0x01,0x54,0xd0,0x00,0x01,0x55,0x00,0x00,0x01,0x55,0x2e,0x00,0x01,0x55,0x60,0x00,0x01,0x55,0x92,0x00,0x01,0x55,0xc4,0x00,0x01,0x55,0xf6,0x00,0x01,0x56,0x24,0x00,0x01,0x56,0x52,0x00,0x01,0x56,0x82,0x00,0x01,0x56,0xb0,0x00,0x01,0x56,0xe8,\r\n0x00,0x01,0x57,0x1e,0x00,0x01,0x57,0x4e,0x00,0x01,0x57,0x7c,0x00,0x01,0x57,0xaa,0x00,0x01,0x57,0xd8,0x00,0x01,0x58,0x08,0x00,0x01,0x58,0x36,0x00,0x01,0x58,0x68,0x00,0x01,0x58,0x9c,0x00,0x01,0x58,0xce,0x00,0x01,0x59,0x00,0x00,0x01,0x59,0x16,0x00,0x01,0x59,0x2c,0x00,0x01,0x59,0x5a,0x00,0x01,0x59,0x88,0x00,0x01,0x59,0xae,\r\n0x00,0x01,0x59,0xd4,0x00,0x01,0x5a,0x0a,0x00,0x01,0x5a,0x40,0x00,0x01,0x5a,0x70,0x00,0x01,0x5a,0x9e,0x00,0x01,0x5a,0xd2,0x00,0x01,0x5b,0x06,0x00,0x01,0x5b,0x3a,0x00,0x01,0x5b,0x6e,0x00,0x01,0x5b,0xa2,0x00,0x01,0x5b,0xd2,0x00,0x01,0x5c,0x20,0x00,0x01,0x5c,0x6a,0x00,0x01,0x5c,0x9c,0x00,0x01,0x5c,0xce,0x00,0x01,0x5c,0xfc,\r\n0x00,0x01,0x5d,0x2a,0x00,0x01,0x5d,0x42,0x00,0x01,0x5d,0x70,0x00,0x01,0x5d,0x88,0x00,0x01,0x5d,0xb8,0x00,0x01,0x5d,0xd0,0x00,0x01,0x5d,0xf6,0x00,0x01,0x5e,0x26,0x00,0x01,0x5e,0x54,0x00,0x01,0x5e,0x7c,0x00,0x01,0x5e,0xa2,0x00,0x01,0x5e,0xda,0x00,0x01,0x5f,0x10,0x00,0x01,0x5f,0x3e,0x00,0x01,0x5f,0x6c,0x00,0x01,0x5f,0x9e,\r\n0x00,0x01,0x5f,0xce,0x00,0x01,0x60,0x04,0x00,0x01,0x60,0x38,0x00,0x01,0x60,0x6a,0x00,0x01,0x60,0x9c,0x00,0x01,0x60,0xce,0x00,0x01,0x61,0x02,0x00,0x01,0x61,0x32,0x00,0x01,0x61,0x62,0x00,0x01,0x61,0x92,0x00,0x01,0x61,0xc2,0x00,0x01,0x61,0xe4,0x00,0x01,0x62,0x14,0x00,0x01,0x62,0x2c,0x00,0x01,0x62,0x42,0x00,0x01,0x62,0x6c,\r\n0x00,0x01,0x62,0xac,0x00,0x01,0x62,0xd8,0x00,0x01,0x63,0x0e,0x00,0x01,0x63,0x30,0x00,0x01,0x63,0x52,0x00,0x01,0x63,0x6a,0x00,0x01,0x63,0x80,0x00,0x01,0x63,0xa4,0x00,0x01,0x63,0xc8,0x00,0x01,0x63,0xec,0x00,0x01,0x64,0x10,0x00,0x01,0x64,0x3a,0x00,0x01,0x64,0x64,0x00,0x01,0x64,0x92,0x00,0x01,0x64,0xc6,0x00,0x01,0x64,0xec,\r\n0x00,0x01,0x65,0x10,0x00,0x01,0x65,0x46,0x00,0x01,0x65,0x7c,0x00,0x01,0x65,0xaa,0x00,0x01,0x65,0xd8,0x00,0x01,0x66,0x14,0x00,0x01,0x66,0x50,0x00,0x01,0x66,0x80,0x00,0x01,0x66,0xb0,0x00,0x01,0x66,0xe0,0x00,0x01,0x67,0x10,0x00,0x01,0x67,0x42,0x00,0x01,0x67,0x72,0x00,0x01,0x67,0xa8,0x00,0x01,0x67,0xe0,0x00,0x01,0x68,0x0e,\r\n0x00,0x01,0x68,0x3c,0x00,0x01,0x68,0x62,0x00,0x01,0x68,0x8a,0x00,0x01,0x68,0xb8,0x00,0x01,0x68,0xe6,0x00,0x01,0x69,0x0c,0x00,0x01,0x69,0x32,0x00,0x01,0x69,0x60,0x00,0x01,0x69,0x8e,0x00,0x01,0x69,0xc0,0x00,0x01,0x69,0xf0,0x00,0x01,0x6a,0x20,0x00,0x01,0x6a,0x50,0x00,0x01,0x6a,0x7e,0x00,0x01,0x6a,0xaa,0x00,0x01,0x6a,0xd0,\r\n0x00,0x01,0x6a,0xf6,0x00,0x01,0x6b,0x2c,0x00,0x01,0x6b,0x62,0x00,0x01,0x6b,0x98,0x00,0x01,0x6b,0xce,0x00,0x01,0x6c,0x00,0x00,0x01,0x6c,0x34,0x00,0x01,0x6c,0x62,0x00,0x01,0x6c,0x92,0x00,0x01,0x6c,0xbe,0x00,0x01,0x6c,0xec,0x00,0x01,0x6d,0x1e,0x00,0x01,0x6d,0x50,0x00,0x01,0x6d,0x80,0x00,0x01,0x6d,0xb2,0x00,0x01,0x6d,0xe4,\r\n0x00,0x01,0x6e,0x16,0x00,0x01,0x6e,0x46,0x00,0x01,0x6e,0x76,0x00,0x01,0x6e,0xac,0x00,0x01,0x6e,0xe2,0x00,0x01,0x6f,0x18,0x00,0x01,0x6f,0x4e,0x00,0x01,0x6f,0x84,0x00,0x01,0x6f,0xba,0x00,0x01,0x6f,0xe6,0x00,0x01,0x70,0x12,0x00,0x01,0x70,0x42,0x00,0x01,0x70,0x74,0x00,0x01,0x70,0xa4,0x00,0x01,0x70,0xd4,0x00,0x01,0x71,0x06,\r\n0x00,0x01,0x71,0x38,0x00,0x01,0x71,0x6e,0x00,0x01,0x71,0xa4,0x00,0x01,0x71,0xda,0x00,0x01,0x72,0x10,0x00,0x01,0x72,0x3c,0x00,0x01,0x72,0x6a,0x00,0x01,0x72,0x9c,0x00,0x01,0x72,0xce,0x00,0x01,0x72,0xfe,0x00,0x01,0x73,0x2e,0x00,0x01,0x73,0x60,0x00,0x01,0x73,0x92,0x00,0x01,0x73,0xc4,0x00,0x01,0x73,0xf6,0x00,0x01,0x74,0x2c,\r\n0x00,0x01,0x74,0x62,0x00,0x01,0x74,0x98,0x00,0x01,0x74,0xce,0x00,0x01,0x75,0x04,0x00,0x01,0x75,0x3a,0x00,0x01,0x75,0x6a,0x00,0x01,0x75,0x9a,0x00,0x01,0x75,0xce,0x00,0x01,0x76,0x02,0x00,0x01,0x76,0x36,0x00,0x01,0x76,0x6a,0x00,0x01,0x76,0x9e,0x00,0x01,0x76,0xd2,0x00,0x01,0x76,0xf6,0x00,0x01,0x77,0x1a,0x00,0x01,0x77,0x40,\r\n0x00,0x01,0x77,0x66,0x00,0x01,0x77,0x8c,0x00,0x01,0x77,0xb2,0x00,0x01,0x77,0xd8,0x00,0x01,0x77,0xfe,0x00,0x01,0x78,0x2a,0x00,0x01,0x78,0x58,0x00,0x01,0x78,0x8a,0x00,0x01,0x78,0xbc,0x00,0x01,0x78,0xec,0x00,0x01,0x79,0x1e,0x00,0x01,0x79,0x4e,0x00,0x01,0x79,0x7e,0x00,0x01,0x79,0xb4,0x00,0x01,0x79,0xea,0x00,0x01,0x7a,0x20,\r\n0x00,0x01,0x7a,0x54,0x00,0x01,0x7a,0x82,0x00,0x01,0x7a,0xb0,0x00,0x01,0x7a,0xe2,0x00,0x01,0x7b,0x14,0x00,0x01,0x7b,0x46,0x00,0x01,0x7b,0x78,0x00,0x01,0x7b,0xaa,0x00,0x01,0x7b,0xdc,0x00,0x01,0x7c,0x0e,0x00,0x01,0x7c,0x44,0x00,0x01,0x7c,0x7a,0x00,0x01,0x7c,0xb0,0x00,0x01,0x7c,0xde,0x00,0x01,0x7d,0x0e,0x00,0x01,0x7d,0x42,\r\n0x00,0x01,0x7d,0x76,0x00,0x01,0x7d,0xa8,0x00,0x01,0x7d,0xda,0x00,0x01,0x7e,0x0e,0x00,0x01,0x7e,0x42,0x00,0x01,0x7e,0x74,0x00,0x01,0x7e,0xa6,0x00,0x01,0x7e,0xdc,0x00,0x01,0x7f,0x12,0x00,0x01,0x7f,0x48,0x00,0x01,0x7f,0x7c,0x00,0x01,0x7f,0xb0,0x00,0x01,0x7f,0xe4,0x00,0x01,0x80,0x12,0x00,0x01,0x80,0x3e,0x00,0x01,0x80,0x6c,\r\n0x00,0x01,0x80,0x98,0x00,0x01,0x80,0xc6,0x00,0x01,0x80,0xf2,0x00,0x01,0x81,0x22,0x00,0x01,0x81,0x52,0x00,0x01,0x81,0x80,0x00,0x01,0x81,0xac,0x00,0x01,0x81,0xda,0x00,0x01,0x82,0x08,0x00,0x01,0x82,0x38,0x00,0x01,0x82,0x66,0x00,0x01,0x82,0xa0,0x00,0x01,0x82,0xdc,0x00,0x01,0x83,0x1c,0x00,0x01,0x83,0x5c,0x00,0x01,0x83,0x9a,\r\n0x00,0x01,0x83,0xda,0x00,0x01,0x84,0x1a,0x00,0x01,0x84,0x5a,0x00,0x01,0x84,0x9c,0x00,0x01,0x84,0xde,0x00,0x01,0x85,0x26,0x00,0x01,0x85,0x6e,0x00,0x01,0x85,0xb8,0x00,0x01,0x86,0x00,0x00,0x01,0x86,0x48,0x00,0x01,0x86,0x90,0x00,0x01,0x86,0xcc,0x00,0x01,0x87,0x0a,0x00,0x01,0x87,0x4c,0x00,0x01,0x87,0x8e,0x00,0x01,0x87,0xce,\r\n0x00,0x01,0x88,0x0e,0x00,0x01,0x88,0x50,0x00,0x01,0x88,0x92,0x00,0x01,0x88,0xd8,0x00,0x01,0x89,0x1e,0x00,0x01,0x89,0x68,0x00,0x01,0x89,0xb2,0x00,0x01,0x89,0xfc,0x00,0x01,0x8a,0x46,0x00,0x01,0x8a,0x90,0x00,0x01,0x8a,0xda,0x00,0x01,0x8b,0x18,0x00,0x01,0x8b,0x58,0x00,0x01,0x8b,0x9c,0x00,0x01,0x8b,0xe0,0x00,0x01,0x8c,0x22,\r\n0x00,0x01,0x8c,0x64,0x00,0x01,0x8c,0xa8,0x00,0x01,0x8c,0xec,0x00,0x01,0x8d,0x32,0x00,0x01,0x8d,0x78,0x00,0x01,0x8d,0xc2,0x00,0x01,0x8e,0x0c,0x00,0x01,0x8e,0x56,0x00,0x01,0x8e,0x9e,0x00,0x01,0x8e,0xe6,0x00,0x01,0x8f,0x2e,0x00,0x01,0x8f,0x5e,0x00,0x01,0x8f,0x8e,0x00,0x01,0x8f,0xca,0x00,0x01,0x8f,0xee,0x00,0x01,0x90,0x28,\r\n0x00,0x01,0x90,0x56,0x00,0x01,0x90,0x92,0x00,0x01,0x90,0xc0,0x00,0x01,0x90,0xee,0x00,0x01,0x91,0x1e,0x00,0x01,0x91,0x4e,0x00,0x01,0x91,0x74,0x00,0x01,0x91,0xca,0x00,0x01,0x92,0x1c,0x00,0x01,0x92,0x78,0x00,0x01,0x92,0xc2,0x00,0x01,0x93,0x64,0x00,0x01,0x93,0xa4,0x00,0x01,0x93,0xcc,0x00,0x01,0x94,0x0a,0x00,0x01,0x94,0x36,\r\n0x00,0x01,0x94,0x76,0x00,0x01,0x94,0xa8,0x00,0x01,0x94,0xda,0x00,0x01,0x95,0x0c,0x00,0x01,0x95,0x3e,0x00,0x01,0x95,0x64,0x00,0x01,0x95,0xd2,0x00,0x01,0x96,0x4a,0x00,0x01,0x96,0xec,0x00,0x01,0x97,0x1c,0x00,0x01,0x97,0x4c,0x00,0x01,0x97,0x84,0x00,0x01,0x97,0xbc,0x00,0x01,0x97,0xec,0x00,0x01,0x98,0x24,0x00,0x01,0x98,0x52,\r\n0x00,0x01,0x98,0x80,0x00,0x01,0x98,0xb0,0x00,0x01,0x98,0xe0,0x00,0x01,0x99,0x54,0x00,0x01,0x99,0xca,0x00,0x01,0x9a,0x6c,0x00,0x01,0x9a,0x9c,0x00,0x01,0x9a,0xcc,0x00,0x01,0x9b,0x02,0x00,0x01,0x9b,0x38,0x00,0x01,0x9b,0x66,0x00,0x01,0x9b,0x94,0x00,0x01,0x9b,0xc2,0x00,0x01,0x9b,0xf8,0x00,0x01,0x9c,0x26,0x00,0x01,0x9c,0x54,\r\n0x00,0x01,0x9c,0x86,0x00,0x01,0x9c,0xb8,0x00,0x01,0x9c,0xea,0x00,0x01,0x9d,0x70,0x00,0x01,0x9d,0xf8,0x00,0x01,0x9e,0x24,0x00,0x01,0x9e,0x64,0x00,0x01,0x9e,0x8a,0x00,0x01,0x9e,0xc8,0x00,0x01,0x9e,0xf6,0x00,0x01,0x9f,0x34,0x00,0x01,0x9f,0x64,0x00,0x01,0x9f,0x94,0x00,0x01,0x9f,0xc6,0x00,0x01,0x9f,0xf8,0x00,0x01,0xa0,0x1e,\r\n0x00,0x01,0xa0,0x4c,0x00,0x01,0xa0,0xa6,0x00,0x01,0xa0,0xde,0x00,0x01,0xa1,0x3c,0x00,0x01,0xa1,0x64,0x00,0x01,0xa1,0x8c,0x00,0x01,0xa1,0xdc,0x00,0x01,0xa2,0x16,0x00,0x01,0xa2,0x7c,0x00,0x01,0xa2,0xf0,0x00,0x01,0xa3,0x46,0x00,0x01,0xa3,0x7c,0x00,0x01,0xa3,0xa4,0x00,0x01,0xa3,0xe4,0x00,0x01,0xa4,0x3c,0x00,0x01,0xa4,0xb2,\r\n0x00,0x01,0xa4,0xfc,0x00,0x01,0xa5,0x56,0x00,0x01,0xa5,0xb2,0x00,0x01,0xa6,0x0c,0x00,0x01,0xa6,0x68,0x00,0x01,0xa6,0x9a,0x00,0x01,0xa6,0xce,0x00,0x01,0xa7,0x1a,0x00,0x01,0xa7,0x6a,0x00,0x01,0xa7,0x9e,0x00,0x01,0xa7,0xdc,0x00,0x01,0xa8,0x2e,0x00,0x01,0xa8,0x72,0x00,0x01,0xa8,0xb6,0x00,0x01,0xa9,0x16,0x00,0x01,0xa9,0x28,\r\n0x00,0x01,0xa9,0x64,0x00,0x01,0xa9,0xa2,0x00,0x01,0xaa,0x08,0x00,0x01,0xaa,0x1a,0x00,0x01,0xaa,0x82,0x00,0x01,0xaa,0x94,0x00,0x01,0xaa,0xa6,0x00,0x01,0xaa,0xd6,0x00,0x01,0xab,0x1c,0x00,0x01,0xab,0x9e,0x00,0x01,0xab,0xdc,0x00,0x01,0xac,0x1a,0x00,0x01,0xac,0x74,0x00,0x01,0xac,0x86,0x00,0x01,0xac,0xe6,0x00,0x01,0xac,0xf8,\r\n0x00,0x01,0xad,0x20,0x00,0x01,0xad,0x32,0x00,0x01,0xad,0x90,0x00,0x01,0xad,0xb8,0x00,0x01,0xad,0xca,0x00,0x01,0xae,0x14,0x00,0x01,0xae,0x5e,0x00,0x01,0xae,0xb2,0x00,0x01,0xae,0xfa,0x00,0x01,0xaf,0x44,0x00,0x01,0xaf,0xd2,0x00,0x01,0xb0,0x0e,0x00,0x01,0xb0,0x6e,0x00,0x01,0xb0,0xb0,0x00,0x01,0xb0,0xda,0x00,0x01,0xb1,0x06,\r\n0x00,0x01,0xb1,0x18,0x00,0x01,0xb1,0x78,0x00,0x01,0xb2,0x00,0x00,0x01,0xb2,0x50,0x00,0x01,0xb2,0x90,0x00,0x01,0xb2,0xc8,0x00,0x01,0xb3,0x10,0x00,0x01,0xb3,0x40,0x00,0x01,0xb3,0xcc,0x00,0x01,0xb4,0x80,0x00,0x01,0xb5,0x20,0x00,0x01,0xb5,0x80,0x00,0x01,0xb5,0xb8,0x00,0x01,0xb6,0x20,0x00,0x01,0xb6,0x66,0x00,0x01,0xb6,0xaa,\r\n0x00,0x01,0xb7,0x62,0x00,0x01,0xb8,0x2c,0x00,0x01,0xb8,0xa2,0x00,0x01,0xb9,0x3a,0x00,0x01,0xb9,0xb0,0x00,0x01,0xba,0x48,0x00,0x01,0xba,0xba,0x00,0x01,0xbb,0x6e,0x00,0x01,0xbc,0x1e,0x00,0x01,0xbc,0xb8,0x00,0x01,0xbd,0x46,0x00,0x01,0xbd,0xba,0x00,0x01,0xbe,0x50,0x00,0x01,0xbf,0x0c,0x00,0x01,0xbf,0x6e,0x00,0x01,0xc0,0x20,\r\n0x00,0x01,0xc0,0x94,0x00,0x01,0xc1,0x76,0x00,0x01,0xc1,0xfa,0x00,0x01,0xc2,0xa4,0x00,0x01,0xc2,0xec,0x00,0x01,0xc3,0x54,0x00,0x01,0xc3,0xd4,0x00,0x01,0xc4,0x50,0x00,0x01,0xc4,0xb8,0x00,0x01,0xc5,0x8a,0x00,0x01,0xc6,0x2a,0x00,0x01,0xc6,0xb6,0x00,0x01,0xc7,0x30,0x00,0x01,0xc7,0xd8,0x00,0x01,0xc8,0x88,0x00,0x01,0xc9,0x2e,\r\n0x00,0x01,0xc9,0xcc,0x00,0x01,0xca,0x7a,0x00,0x01,0xcb,0x16,0x00,0x01,0xcb,0xe8,0x00,0x01,0xcc,0xae,0x00,0x01,0xcd,0x1e,0x00,0x01,0xcd,0xbc,0x00,0x01,0xce,0x56,0x00,0x01,0xce,0xc0,0x00,0x01,0xcf,0x4a,0x00,0x01,0xcf,0xb8,0x00,0x01,0xd0,0x62,0x00,0x01,0xd0,0xe0,0x00,0x01,0xd1,0x5c,0x00,0x01,0xd1,0xf0,0x00,0x01,0xd2,0x92,\r\n0x00,0x01,0xd3,0x32,0x00,0x01,0xd3,0xd0,0x00,0x01,0xd4,0x6c,0x00,0x01,0xd4,0xfe,0x00,0x01,0xd5,0xc2,0x00,0x01,0xd6,0x8a,0x00,0x01,0xd7,0x26,0x00,0x01,0xd7,0xbc,0x00,0x01,0xd8,0x5c,0x00,0x01,0xd8,0xd6,0x00,0x01,0xd9,0x00,0x00,0x01,0xd9,0x4e,0x00,0x01,0xd9,0xe4,0x00,0x01,0xd9,0xf4,0x00,0x01,0xda,0x2a,0x00,0x01,0xda,0x60,\r\n0x00,0x01,0xda,0x96,0x00,0x01,0xda,0xbe,0x00,0x01,0xda,0xe8,0x00,0x01,0xdb,0x00,0x00,0x01,0xdb,0x28,0x00,0x01,0xdb,0x52,0x00,0x01,0xdb,0x7c,0x00,0x01,0xdb,0xac,0x00,0x01,0xdb,0xd8,0x00,0x01,0xdc,0x06,0x00,0x01,0xdc,0x34,0x00,0x01,0xdc,0x62,0x00,0x01,0xdc,0x90,0x00,0x01,0xdc,0xbe,0x00,0x01,0xdc,0xec,0x00,0x01,0xdd,0x22,\r\n0x00,0x01,0xdd,0x56,0x00,0x01,0xdd,0x8c,0x00,0x01,0xdd,0xc0,0x00,0x01,0xdd,0xfa,0x00,0x01,0xde,0x2e,0x00,0x01,0xde,0x66,0x00,0x01,0xde,0x9a,0x00,0x01,0xdf,0x3a,0x00,0x01,0xdf,0x72,0x00,0x01,0xdf,0xa6,0x00,0x01,0xdf,0xd8,0x00,0x01,0xe0,0x08,0x00,0x01,0xe0,0x38,0x00,0x01,0xe0,0x66,0x00,0x01,0xe1,0x38,0x00,0x01,0xe2,0x3a,\r\n0x00,0x01,0xe2,0x68,0x00,0x01,0xe2,0x96,0x00,0x01,0xe2,0xc6,0x00,0x01,0xe2,0xf6,0x00,0x01,0xe3,0xd0,0x00,0x01,0xe4,0x92,0x00,0x01,0xe4,0xc0,0x00,0x01,0xe4,0xee,0x00,0x01,0xe5,0x1e,0x00,0x01,0xe5,0x4c,0x00,0x01,0xe5,0x7a,0x00,0x01,0xe5,0xa2,0x00,0x01,0xe5,0xca,0x00,0x01,0xe5,0xf2,0x00,0x01,0xe6,0x20,0x00,0x01,0xe6,0x4e,\r\n0x00,0x01,0xe6,0xe0,0x00,0x01,0xe7,0x62,0x00,0x01,0xe7,0x92,0x00,0x01,0xe7,0xc2,0x00,0x01,0xe7,0xf6,0x00,0x01,0xe8,0x2a,0x00,0x01,0xe8,0x58,0x00,0x01,0xe8,0x84,0x00,0x01,0xe8,0xb8,0x00,0x01,0xe8,0xec,0x00,0x01,0xe9,0x1c,0x00,0x01,0xe9,0x4a,0x00,0x01,0xe9,0x7e,0x00,0x01,0xe9,0xb2,0x00,0x01,0xe9,0xe0,0x00,0x01,0xea,0x0e,\r\n0x00,0x01,0xea,0x42,0x00,0x01,0xea,0x76,0x00,0x01,0xea,0xa4,0x00,0x01,0xea,0xd0,0x00,0x01,0xea,0xf4,0x00,0x01,0xeb,0x28,0x00,0x01,0xeb,0x4a,0x00,0x01,0xeb,0x78,0x00,0x01,0xeb,0xac,0x00,0x01,0xeb,0xe0,0x00,0x01,0xec,0x0e,0x00,0x01,0xec,0x3a,0x00,0x01,0xed,0x02,0x00,0x01,0xed,0xc2,0x00,0x01,0xed,0xf0,0x00,0x01,0xee,0x20,\r\n0x00,0x01,0xee,0x90,0x00,0x01,0xef,0x72,0x00,0x01,0xf0,0x48,0x00,0x01,0xf0,0xb8,0x00,0x01,0xf1,0x2c,0x00,0x01,0xf1,0x5a,0x00,0x01,0xf1,0x88,0x00,0x01,0xf1,0xbe,0x00,0x01,0xf1,0xf2,0x00,0x01,0xf2,0x24,0x00,0x01,0xf2,0x54,0x00,0x01,0xf2,0x82,0x00,0x01,0xf2,0xb0,0x00,0x01,0xf2,0xe2,0x00,0x01,0xf3,0x12,0x00,0x01,0xf3,0x40,\r\n0x00,0x01,0xf3,0x6e,0x00,0x01,0xf3,0xfa,0x00,0x01,0xf4,0x5a,0x00,0x01,0xf4,0xf6,0x00,0x01,0xf5,0x88,0x00,0x01,0xf6,0x10,0x00,0x01,0xf6,0xbe,0x00,0x01,0xf7,0x62,0x00,0x01,0xf8,0x06,0x00,0x01,0xf8,0xb4,0x00,0x01,0xf9,0x20,0x00,0x01,0xf9,0xea,0x00,0x01,0xfa,0x98,0x00,0x01,0xfb,0x46,0x00,0x01,0xfb,0xe6,0x00,0x01,0xfc,0xda,\r\n0x00,0x01,0xfd,0x82,0x00,0x01,0xfe,0x2c,0x00,0x01,0xff,0x1e,0x00,0x01,0xff,0xce,0x00,0x02,0x00,0x5c,0x00,0x02,0x01,0x30,0x00,0x02,0x01,0x40,0x00,0x02,0x01,0xd4,0x00,0x02,0x02,0x46,0x00,0x02,0x02,0xdc,0x00,0x02,0x03,0x42,0x00,0x02,0x03,0xca,0x00,0x02,0x04,0x76,0x00,0x02,0x05,0x16,0x00,0x02,0x05,0x5e,0x00,0x02,0x05,0xbc,\r\n0x00,0x02,0x06,0x66,0x00,0x02,0x07,0x04,0x00,0x02,0x07,0x58,0x00,0x02,0x08,0x0e,0x00,0x02,0x08,0xb2,0x00,0x02,0x09,0x5a,0x00,0x02,0x0a,0x22,0x00,0x02,0x0a,0xa8,0x00,0x02,0x0b,0x2c,0x00,0x02,0x0b,0x98,0x00,0x02,0x0c,0x2a,0x00,0x02,0x0c,0xd6,0x00,0x02,0x0d,0x8a,0x00,0x02,0x0e,0x44,0x00,0x02,0x0e,0x98,0x00,0x02,0x0e,0xec,\r\n0x00,0x02,0x0f,0x68,0x00,0x02,0x0f,0xc2,0x00,0x02,0x10,0x3e,0x00,0x02,0x10,0x8a,0x00,0x02,0x10,0xd6,0x00,0x02,0x11,0x66,0x00,0x02,0x12,0x04,0x00,0x02,0x12,0xda,0x00,0x02,0x13,0x4c,0x00,0x02,0x13,0xf6,0x00,0x02,0x14,0x5c,0x00,0x02,0x15,0x32,0x00,0x02,0x15,0xa6,0x00,0x02,0x16,0x1a,0x00,0x02,0x16,0xc4,0x00,0x02,0x17,0x56,\r\n0x00,0x02,0x17,0xce,0x00,0x02,0x18,0x20,0x00,0x02,0x18,0xbe,0x00,0x02,0x19,0x36,0x00,0x02,0x19,0xa4,0x00,0x02,0x1a,0x28,0x00,0x02,0x1b,0x06,0x00,0x02,0x1b,0x9c,0x00,0x02,0x1c,0xbe,0x00,0x02,0x1d,0x38,0x00,0x02,0x1d,0xba,0x00,0x02,0x1e,0x3a,0x00,0x02,0x1e,0xb0,0x00,0x02,0x1f,0x6c,0x00,0x02,0x20,0x02,0x00,0x02,0x20,0xb2,\r\n0x00,0x02,0x21,0x80,0x00,0x02,0x21,0xe4,0x00,0x02,0x22,0xca,0x00,0x02,0x23,0x2e,0x00,0x02,0x23,0x66,0x00,0x02,0x24,0x14,0x00,0x02,0x24,0xc4,0x00,0x02,0x25,0x72,0x00,0x02,0x26,0x3a,0x00,0x02,0x27,0x50,0x00,0x02,0x28,0xca,0x00,0x02,0x29,0xa0,0x00,0x02,0x2a,0x68,0x00,0x02,0x2b,0x74,0x00,0x02,0x2c,0x4c,0x00,0x02,0x2c,0xf4,\r\n0x00,0x02,0x2d,0x56,0x00,0x02,0x2e,0x36,0x00,0x02,0x2e,0xac,0x00,0x02,0x2f,0x56,0x00,0x02,0x30,0x5e,0x00,0x02,0x31,0x02,0x00,0x02,0x31,0x32,0x00,0x02,0x31,0x66,0x00,0x02,0x32,0x1e,0x00,0x02,0x32,0xfe,0x00,0x02,0x34,0x18,0x00,0x02,0x34,0xb6,0x00,0x02,0x35,0x4e,0x00,0x02,0x36,0x10,0x00,0x02,0x36,0xc8,0x00,0x02,0x37,0x3e,\r\n0x00,0x02,0x37,0xa0,0x00,0x02,0x38,0x02,0x00,0x02,0x38,0xd0,0x00,0x02,0x39,0xc4,0x00,0x02,0x3a,0xa8,0x00,0x02,0x3b,0xba,0x00,0x02,0x3c,0xc8,0x00,0x02,0x3d,0x58,0x00,0x02,0x3d,0xea,0x00,0x02,0x3e,0xb2,0x00,0x02,0x40,0x00,0x00,0x02,0x40,0xd4,0x00,0x02,0x41,0xb8,0x00,0x02,0x42,0xf4,0x00,0x02,0x43,0xd0,0x00,0x02,0x44,0xce,\r\n0x00,0x02,0x45,0xd2,0x00,0x02,0x46,0x4c,0x00,0x02,0x46,0xd6,0x00,0x02,0x47,0xba,0x00,0x02,0x48,0x70,0x00,0x02,0x48,0x80,0x00,0x02,0x48,0x90,0x00,0x02,0x48,0xa0,0x00,0x02,0x49,0x1c,0x00,0x02,0x49,0x96,0x00,0x02,0x4a,0x52,0x00,0x02,0x4a,0xf6,0x00,0x02,0x4b,0x92,0x00,0x02,0x4c,0x2c,0x00,0x02,0x4c,0xfa,0x00,0x02,0x4d,0xc8,\r\n0x00,0x02,0x4e,0x80,0x00,0x02,0x4f,0x38,0x00,0x02,0x50,0x42,0x00,0x02,0x51,0x58,0x00,0x02,0x52,0x78,0x00,0x02,0x53,0x64,0x00,0x02,0x54,0x86,0x00,0x02,0x55,0xb0,0x00,0x02,0x56,0xe0,0x00,0x02,0x58,0x0e,0x00,0x02,0x58,0xa4,0x00,0x02,0x59,0x40,0x00,0x02,0x5a,0x18,0x00,0x02,0x5a,0xee,0x00,0x02,0x5b,0x6c,0x00,0x02,0x5b,0xec,\r\n0x00,0x02,0x5c,0x20,0x00,0x02,0x5c,0x54,0x00,0x02,0x5d,0x9c,0x00,0x02,0x5e,0xbc,0x00,0x02,0x5f,0xa4,0x00,0x02,0x60,0x72,0x00,0x02,0x61,0xbc,0x00,0x02,0x62,0xf2,0x00,0x02,0x63,0x14,0x00,0x02,0x63,0x44,0x00,0x02,0x63,0xca,0x00,0x02,0x64,0x42,0x00,0x02,0x65,0x62,0x00,0x02,0x65,0xb6,0x00,0x02,0x66,0x08,0x00,0x02,0x66,0x1a,\r\n0x00,0x02,0x66,0x2c,0x00,0x02,0x68,0x1a,0x00,0x02,0x69,0x42,0x00,0x02,0x69,0xda,0x00,0x02,0x6a,0x6e,0x00,0x02,0x6b,0x40,0x00,0x02,0x6c,0x2e,0x00,0x02,0x6c,0xc4,0x00,0x02,0x6d,0x56,0x00,0x02,0x6e,0x58,0x00,0x02,0x6f,0x4a,0x00,0x02,0x6f,0xee,0x00,0x02,0x70,0x82,0x00,0x02,0x71,0x0c,0x00,0x02,0x71,0x8a,0x00,0x02,0x71,0xfc,\r\n0x00,0x02,0x72,0x6e,0x00,0x02,0x73,0x12,0x00,0x02,0x73,0xb0,0x00,0x02,0x74,0xda,0x00,0x02,0x75,0xf8,0x00,0x02,0x76,0xc0,0x00,0x02,0x77,0x78,0x00,0x02,0x77,0xea,0x00,0x02,0x78,0x5c,0x00,0x02,0x78,0xe8,0x00,0x02,0x79,0x74,0x00,0x02,0x79,0xf6,0x00,0x02,0x7a,0x76,0x00,0x02,0x7b,0x4a,0x00,0x02,0x7c,0x1e,0x00,0x02,0x7c,0x34,\r\n0x00,0x02,0x7c,0x4a,0x00,0x02,0x7c,0x5a,0x00,0x02,0x7c,0x88,0x00,0x02,0x7c,0xb6,0x00,0x02,0x7d,0x56,0x00,0x02,0x7d,0xf2,0x00,0x02,0x7e,0x84,0x00,0x02,0x7f,0x12,0x00,0x02,0x7f,0x8c,0x00,0x02,0x80,0x0a,0x00,0x02,0x80,0x2c,0x00,0x02,0x80,0x4e,0x00,0x02,0x80,0x82,0x00,0x02,0x80,0xb2,0x00,0x02,0x80,0xc2,0x00,0x02,0x80,0xd2,\r\n0x00,0x02,0x81,0x00,0x00,0x02,0x81,0x2e,0x00,0x02,0x81,0xd0,0x00,0x02,0x81,0xe0,0x00,0x02,0x82,0x14,0x00,0x02,0x82,0x44,0x00,0x02,0x82,0x76,0x00,0x02,0x82,0xaa,0x00,0x02,0x82,0xde,0x00,0x02,0x83,0x10,0x00,0x02,0x83,0x9c,0x00,0x02,0x83,0xac,0x00,0x02,0x83,0xda,0x00,0x02,0x84,0x08,0x00,0x02,0x84,0x3a,0x00,0x02,0x84,0x6c,\r\n0x00,0x02,0x84,0x9e,0x00,0x02,0x84,0xd0,0x00,0x02,0x85,0x02,0x00,0x02,0x85,0x34,0x00,0x02,0x85,0x68,0x00,0x02,0x85,0x9a,0x00,0x02,0x85,0xc8,0x00,0x02,0x85,0xf6,0x00,0x02,0x86,0x28,0x00,0x02,0x86,0x58,0x00,0x02,0x86,0x8a,0x00,0x02,0x86,0xbc,0x00,0x02,0x86,0xee,0x00,0x02,0x87,0x22,0x00,0x02,0x87,0x54,0x00,0x02,0x87,0x88,\r\n0x00,0x02,0x87,0xee,0x00,0x02,0x87,0xfe,0x00,0x02,0x88,0xa6,0x00,0x02,0x89,0x5c,0x00,0x02,0x8a,0x18,0x00,0x02,0x8a,0xcc,0x00,0x02,0x8b,0x7a,0x00,0x02,0x8c,0x22,0x00,0x02,0x8c,0xba,0x00,0x02,0x8d,0x5a,0x00,0x02,0x8d,0xea,0x00,0x02,0x8e,0x7c,0x00,0x02,0x8f,0x20,0x00,0x02,0x8f,0xb8,0x00,0x02,0x90,0x38,0x00,0x02,0x90,0xb6,\r\n0x00,0x02,0x91,0x46,0x00,0x02,0x92,0x10,0x00,0x02,0x92,0xb0,0x00,0x02,0x93,0x1e,0x00,0x02,0x93,0xa6,0x00,0x02,0x94,0x08,0x00,0x02,0x94,0xc8,0x00,0x02,0x95,0x7e,0x00,0x02,0x95,0xec,0x00,0x02,0x96,0x5c,0x00,0x02,0x96,0xc6,0x00,0x02,0x97,0x34,0x00,0x02,0x97,0xc8,0x00,0x02,0x98,0x34,0x00,0x02,0x98,0xdc,0x00,0x02,0x99,0x40,\r\n0x00,0x02,0x99,0xb8,0x00,0x02,0x9a,0x48,0x00,0x02,0x9a,0xb0,0x00,0x02,0x9a,0xda,0x00,0x02,0x9b,0x16,0x00,0x02,0x9b,0x66,0x00,0x02,0x9b,0xd8,0x00,0x02,0x9c,0x74,0x00,0x02,0x9c,0xec,0x00,0x02,0x9d,0x4e,0x00,0x02,0x9d,0xb2,0x00,0x02,0x9e,0x36,0x00,0x02,0x9e,0xd0,0x00,0x02,0x9f,0x4c,0x00,0x02,0x9f,0xbe,0x00,0x02,0x9f,0xf4,\r\n0x00,0x02,0xa0,0x48,0x00,0x02,0xa0,0x7c,0x00,0x02,0xa0,0x8c,0x00,0x02,0xa0,0xbe,0x00,0x02,0xa1,0x0a,0x00,0x02,0xa1,0x56,0x00,0x02,0xa1,0xca,0x00,0x02,0xa2,0x40,0x00,0x02,0xa2,0x9e,0x00,0x02,0xa2,0xfc,0x00,0x02,0xa3,0x46,0x00,0x02,0xa3,0x94,0x00,0x02,0xa3,0xc0,0x00,0x02,0xa3,0xd0,0x00,0x02,0xa3,0xe0,0x00,0x02,0xa4,0x10,\r\n0x00,0x02,0xa4,0x3e,0x00,0x02,0xa4,0x50,0x00,0x02,0xa4,0x62,0x00,0x02,0xa4,0xaa,0x00,0x02,0xa4,0xda,0x00,0x02,0xa4,0xec,0x00,0x02,0xa4,0xfe,0x00,0x02,0xa5,0x42,0x00,0x02,0xa5,0x84,0x00,0x02,0xa5,0xd6,0x00,0x02,0xa6,0x02,0x00,0x02,0xa6,0x70,0x00,0x02,0xa6,0xee,0x00,0x02,0xa7,0x96,0x00,0x02,0xa7,0xc6,0x00,0x02,0xa8,0x7a,\r\n0x00,0x02,0xa8,0xdc,0x00,0x02,0xa8,0xec,0x00,0x02,0xa9,0x24,0x00,0x02,0xa9,0x66,0x00,0x02,0xa9,0xa8,0x00,0x02,0xa9,0xea,0x00,0x02,0xaa,0x22,0x00,0x02,0xaa,0x52,0x00,0x02,0xaa,0x92,0x00,0x02,0xaa,0xd2,0x00,0x02,0xab,0x1c,0x00,0x02,0xab,0x7a,0x00,0x02,0xab,0xe4,0x00,0x02,0xac,0x3e,0x00,0x02,0xac,0xb6,0x00,0x02,0xad,0x3c,\r\n0x00,0x02,0xad,0xac,0x00,0x02,0xae,0x0e,0x00,0x02,0xae,0x94,0x00,0x02,0xae,0xf4,0x00,0x02,0xaf,0x5e,0x00,0x02,0xaf,0xd2,0x00,0x02,0xb0,0x42,0x00,0x02,0xb0,0xa0,0x00,0x02,0xb1,0x46,0x00,0x02,0xb1,0xde,0x00,0x02,0xb2,0x4a,0x00,0x02,0xb2,0xd8,0x00,0x02,0xb3,0x32,0x00,0x02,0xb3,0xa0,0x00,0x02,0xb4,0x4a,0x00,0x02,0xb4,0xf0,\r\n0x00,0x02,0xb5,0x86,0x00,0x02,0xb5,0xf6,0x00,0x02,0xb6,0x78,0x00,0x02,0xb6,0xdc,0x00,0x02,0xb7,0x88,0x00,0x02,0xb8,0x46,0x00,0x02,0xb8,0xf2,0x00,0x02,0xb9,0x84,0x00,0x02,0xb9,0xe2,0x00,0x02,0xba,0x4e,0x00,0x02,0xba,0xa4,0x00,0x02,0xbb,0x26,0x00,0x02,0xbb,0xa4,0x00,0x02,0xbc,0x2a,0x00,0x02,0xbc,0xb6,0x00,0x02,0xbd,0x10,\r\n0x00,0x02,0xbd,0x7c,0x00,0x02,0xbd,0xec,0x00,0x02,0xbe,0x5a,0x00,0x02,0xbe,0xca,0x00,0x02,0xbf,0x4e,0x00,0x02,0xbf,0xde,0x00,0x02,0xc0,0x44,0x00,0x02,0xc0,0xbe,0x00,0x02,0xc1,0x3a,0x00,0x02,0xc1,0xb2,0x00,0x02,0xc2,0x58,0x00,0x02,0xc2,0xf0,0x00,0x02,0xc3,0x80,0x00,0x02,0xc3,0xde,0x00,0x02,0xc4,0x7c,0x00,0x02,0xc4,0xf8,\r\n0x00,0x02,0xc5,0x8a,0x00,0x02,0xc6,0x2e,0x00,0x02,0xc6,0xd8,0x00,0x02,0xc7,0x70,0x00,0x02,0xc7,0xcc,0x00,0x02,0xc8,0x20,0x00,0x02,0xc8,0x88,0x00,0x02,0xc9,0x2e,0x00,0x02,0xc9,0xd8,0x00,0x02,0xca,0xa2,0x00,0x02,0xcb,0x48,0x00,0x02,0xcb,0xaa,0x00,0x02,0xcc,0x0a,0x00,0x02,0xcc,0x98,0x00,0x02,0xcd,0x1e,0x00,0x02,0xcd,0xac,\r\n0x00,0x02,0xce,0x0c,0x00,0x02,0xce,0x70,0x00,0x02,0xce,0xda,0x00,0x02,0xcf,0x42,0x00,0x02,0xcf,0xaa,0x00,0x02,0xd0,0x22,0x00,0x02,0xd0,0xaa,0x00,0x02,0xd1,0x3e,0x00,0x02,0xd1,0xaa,0x00,0x02,0xd2,0x12,0x00,0x02,0xd2,0x76,0x00,0x02,0xd3,0x22,0x00,0x02,0xd3,0xe2,0x00,0x02,0xd4,0x90,0x00,0x02,0xd5,0x1e,0x00,0x02,0xd5,0x7c,\r\n0x00,0x02,0xd5,0xe8,0x00,0x02,0xd6,0x58,0x00,0x02,0xd6,0xfc,0x00,0x02,0xd7,0xa2,0x00,0x02,0xd8,0x66,0x00,0x02,0xd9,0x08,0x00,0x02,0xd9,0x6c,0x00,0x02,0xd9,0xfc,0x00,0x02,0xda,0x6e,0x00,0x02,0xdb,0x06,0x00,0x02,0xdb,0x84,0x00,0x02,0xdb,0xfe,0x00,0x02,0xdc,0x6a,0x00,0x02,0xdc,0xf8,0x00,0x02,0xdd,0x54,0x00,0x02,0xdd,0xb2,\r\n0x00,0x02,0xde,0x38,0x00,0x02,0xde,0xb4,0x00,0x02,0xdf,0x1c,0x00,0x02,0xdf,0x80,0x00,0x02,0xdf,0xd4,0x00,0x02,0xe0,0x42,0x00,0x02,0xe0,0xaa,0x00,0x02,0xe1,0x28,0x00,0x02,0xe1,0x9e,0x00,0x02,0xe2,0x18,0x00,0x02,0xe2,0x98,0x00,0x02,0xe2,0xf4,0x00,0x02,0xe3,0x5a,0x00,0x02,0xe3,0xbe,0x00,0x02,0xe4,0x5e,0x00,0x02,0xe5,0x00,\r\n0x00,0x02,0xe5,0xbe,0x00,0x02,0xe6,0x6e,0x00,0x02,0xe6,0xca,0x00,0x02,0xe7,0x42,0x00,0x02,0xe7,0xa0,0x00,0x02,0xe8,0x2a,0x00,0x02,0xe8,0xc2,0x00,0x02,0xe9,0x50,0x00,0x02,0xe9,0xb6,0x00,0x02,0xea,0x14,0x00,0x02,0xea,0xa2,0x00,0x02,0xeb,0x14,0x00,0x02,0xeb,0xae,0x00,0x02,0xec,0x42,0x00,0x02,0xec,0xb2,0x00,0x02,0xed,0x22,\r\n0x00,0x02,0xed,0x9a,0x00,0x02,0xed,0xf8,0x00,0x02,0xee,0x58,0x00,0x02,0xee,0xd2,0x00,0x02,0xef,0x2c,0x00,0x02,0xef,0x8c,0x00,0x02,0xef,0xe6,0x00,0x02,0xf0,0x42,0x00,0x02,0xf0,0xaa,0x00,0x02,0xf0,0xaa,0x00,0x02,0xf0,0xfa,0x00,0x02,0xf1,0x4e,0x00,0x02,0xf1,0xa0,0x00,0x02,0xf1,0xf0,0x00,0x02,0xf3,0xf0,0x00,0x02,0xf5,0x5c,\r\n0x00,0x02,0xf7,0x10,0x00,0x02,0xf8,0xba,0x00,0x02,0xf9,0x3e,0x00,0x02,0xf9,0xde,0x00,0x02,0xfa,0x1a,0x00,0x02,0xfa,0x56,0x00,0x02,0xfa,0x8c,0x00,0x02,0xfa,0xc2,0x00,0x02,0xfb,0x3c,0x00,0x02,0xfb,0x4e,0x00,0x02,0xfb,0x60,0x00,0x02,0xfb,0x72,0x00,0x02,0xfb,0x84,0x00,0x02,0xfb,0x96,0x00,0x02,0xfb,0xd2,0x00,0x02,0xfc,0x0a,\r\n0x00,0x02,0xfc,0x44,0x00,0x02,0xfc,0x7c,0x00,0x02,0xfc,0xd2,0x00,0x02,0xfd,0x1a,0x00,0x02,0xfd,0x92,0x00,0x02,0xfd,0xd0,0x00,0x02,0xfe,0x1a,0x00,0x02,0xfe,0x9a,0x00,0x02,0xff,0x72,0x00,0x02,0xff,0x84,0x00,0x02,0xff,0x96,0x00,0x03,0x00,0x08,0x00,0x03,0x00,0x54,0x00,0x03,0x00,0xa8,0x00,0x03,0x00,0xdc,0x00,0x03,0x01,0x10,\r\n0x00,0x03,0x01,0x20,0x00,0x03,0x01,0x30,0x00,0x03,0x01,0xb0,0x00,0x03,0x02,0x5c,0x00,0x03,0x03,0x6e,0x00,0x03,0x04,0x24,0x00,0x03,0x04,0x34,0x00,0x03,0x04,0x90,0x00,0x03,0x05,0x1e,0x00,0x03,0x05,0x80,0x00,0x03,0x06,0x20,0x00,0x03,0x06,0x7c,0x00,0x03,0x06,0xc6,0x00,0x03,0x06,0xd6,0x00,0x03,0x07,0x50,0x00,0x03,0x07,0x60,\r\n0x00,0x03,0x07,0x70,0x00,0x03,0x07,0x80,0x00,0x03,0x07,0xfa,0x00,0x03,0x08,0x6e,0x00,0x03,0x08,0xde,0x00,0x03,0x09,0xd6,0x00,0x03,0x0a,0xc6,0x00,0x03,0x0b,0x84,0x00,0x03,0x0b,0xd6,0x00,0x03,0x0c,0x28,0x00,0x03,0x0c,0x8e,0x00,0x03,0x0d,0x20,0x00,0x03,0x0d,0xac,0x00,0x03,0x0d,0xbc,0x00,0x03,0x0e,0x10,0x00,0x03,0x0e,0x76,\r\n0x00,0x03,0x0f,0x3e,0x00,0x03,0x0f,0xda,0x00,0x03,0x0f,0xea,0x00,0x03,0x0f,0xfa,0x00,0x03,0x10,0x0a,0x00,0x03,0x10,0x94,0x00,0x03,0x11,0x44,0x00,0x03,0x11,0xd4,0x00,0x03,0x11,0xe4,0x00,0x03,0x12,0x30,0x00,0x03,0x12,0x40,0x00,0x03,0x12,0x50,0x00,0x03,0x12,0xe6,0x00,0x03,0x13,0x4e,0x00,0x03,0x13,0xe0,0x00,0x03,0x14,0xa2,\r\n0x00,0x03,0x15,0x4c,0x00,0x03,0x16,0x12,0x00,0x03,0x16,0x7c,0x00,0x03,0x16,0xf0,0x00,0x03,0x17,0x62,0x00,0x03,0x18,0x00,0x00,0x03,0x18,0x7a,0x00,0x03,0x18,0xaa,0x00,0x03,0x18,0xfc,0x00,0x03,0x19,0x5e,0x00,0x03,0x19,0xa2,0x00,0x03,0x1a,0x28,0x00,0x03,0x1a,0x96,0x00,0x03,0x1b,0x04,0x00,0x03,0x1b,0x7e,0x00,0x03,0x1c,0x4c,\r\n0x00,0x03,0x1c,0xbc,0x00,0x03,0x1d,0x50,0x00,0x03,0x1d,0xa2,0x00,0x03,0x1e,0x02,0x00,0x03,0x1e,0x7c,0x00,0x03,0x1f,0x36,0x00,0x03,0x1f,0xf0,0x00,0x03,0x20,0x84,0x00,0x03,0x21,0xb8,0x00,0x03,0x22,0x4c,0x00,0x03,0x22,0xe2,0x00,0x03,0x23,0x7c,0x00,0x03,0x24,0x12,0x00,0x03,0x24,0xc4,0x00,0x03,0x25,0x6e,0x00,0x03,0x26,0x24,\r\n0x00,0x03,0x26,0x74,0x00,0x03,0x26,0xd6,0x00,0x03,0x27,0x86,0x00,0x03,0x28,0x14,0x00,0x03,0x28,0x8e,0x00,0x03,0x29,0x00,0x00,0x03,0x29,0x58,0x00,0x03,0x29,0xb0,0x00,0x03,0x2a,0x42,0x00,0x03,0x2a,0xc4,0x00,0x03,0x2b,0x34,0x00,0x03,0x2b,0x9e,0x00,0x03,0x2c,0x5c,0x00,0x03,0x2c,0xac,0x00,0x03,0x2d,0x4c,0x00,0x03,0x2e,0x1c,\r\n0x00,0x03,0x2e,0x96,0x00,0x03,0x2f,0x46,0x00,0x03,0x30,0x04,0x00,0x03,0x30,0xa0,0x00,0x03,0x30,0xb2,0x00,0x03,0x30,0xc4,0x00,0x03,0x30,0xd6,0x00,0x03,0x30,0xe8,0x00,0x03,0x30,0xfa,0x00,0x03,0x31,0x0c,0x00,0x03,0x31,0x1e,0x00,0x03,0x31,0x30,0x00,0x03,0x31,0x42,0x00,0x03,0x31,0x8a,0x00,0x03,0x31,0xdc,0x00,0x03,0x32,0x5c,\r\n0x00,0x03,0x32,0xb4,0x00,0x03,0x34,0x10,0x00,0x03,0x34,0xde,0x00,0x03,0x36,0x48,0x00,0x03,0x37,0x56,0x00,0x03,0x38,0x70,0x00,0x03,0x39,0xa2,0x00,0x03,0x3b,0x12,0x00,0x03,0x3d,0x2e,0x00,0x03,0x3d,0xe0,0x00,0x03,0x3e,0xd2,0x00,0x03,0x3f,0x6e,0x00,0x03,0x40,0x32,0x00,0x03,0x42,0x44,0x00,0x03,0x43,0x82,0x00,0x03,0x44,0x9e,\r\n0x00,0x03,0x45,0xc8,0x00,0x03,0x46,0xb0,0x00,0x03,0x47,0x98,0x00,0x03,0x47,0xd0,0x00,0x03,0x47,0xe6,0x00,0x03,0x47,0xfc,0x00,0x03,0x48,0x14,0x00,0x03,0x48,0x2c,0x00,0x03,0x48,0x42,0x00,0x03,0x49,0x44,0x00,0x03,0x49,0xbe,0x00,0x03,0x4a,0x3a,0x00,0x03,0x4a,0x4a,0x00,0x03,0x4a,0x90,0x00,0x03,0x4b,0x58,0x00,0x03,0x4b,0x92,\r\n0x00,0x03,0x4b,0xa4,0x00,0x03,0x4b,0xce,0x00,0x03,0x4c,0x4c,0x00,0x03,0x4c,0x7c,0x00,0x03,0x4c,0xac,0x00,0x03,0x4c,0xfe,0x00,0x03,0x4d,0x50,0x00,0x03,0x4d,0x7a,0x00,0x03,0x4d,0xa6,0x00,0x03,0x4d,0xca,0x00,0x03,0x4f,0x2c,0x00,0x03,0x50,0x20,0x00,0x03,0x50,0x4c,0x00,0x03,0x50,0x78,0x00,0x03,0x50,0xa4,0x00,0x03,0x50,0xba,\r\n0x00,0x03,0x50,0xe8,0x00,0x03,0x51,0x16,0x00,0x03,0x51,0xcc,0x00,0x03,0x52,0x38,0x00,0x03,0x53,0x38,0x00,0x03,0x53,0x56,0x00,0x03,0x53,0x7e,0x00,0x03,0x53,0xae,0x00,0x03,0x53,0xde,0x00,0x03,0x54,0xb0,0x00,0x03,0x55,0x42,0x00,0x03,0x56,0x1c,0x00,0x03,0x56,0x34,0x00,0x03,0x56,0x58,0x00,0x03,0x56,0x7c,0x00,0x03,0x56,0xba,\r\n0x00,0x03,0x56,0xde,0x00,0x03,0x57,0x02,0x00,0x03,0x57,0x26,0x00,0x03,0x57,0x4a,0x00,0x03,0x57,0x62,0x00,0x03,0x57,0x86,0x00,0x03,0x57,0xba,0x00,0x03,0x57,0xf8,0x00,0x03,0x58,0x2c,0x00,0x03,0x58,0x50,0x00,0x03,0x58,0x74,0x00,0x03,0x58,0x98,0x00,0x03,0x58,0xbc,0x00,0x03,0x58,0xe0,0x00,0x03,0x59,0x04,0x00,0x03,0x59,0x28,\r\n0x00,0x03,0x59,0x4c,0x00,0x03,0x59,0x80,0x00,0x03,0x59,0xa4,0x00,0x03,0x59,0xc8,0x00,0x03,0x5a,0x4e,0x00,0x03,0x5a,0x72,0x00,0x03,0x5b,0x30,0x00,0x03,0x5b,0xca,0x00,0x03,0x5c,0x42,0x00,0x03,0x5d,0x0e,0x00,0x03,0x5d,0xec,0x00,0x03,0x5e,0x96,0x00,0x03,0x5f,0x0a,0x00,0x03,0x5f,0x92,0x00,0x03,0x5f,0xa2,0x00,0x03,0x60,0x0e,\r\n0x00,0x03,0x60,0x94,0x00,0x03,0x60,0xe0,0x00,0x03,0x61,0x3a,0x00,0x03,0x61,0xba,0x00,0x03,0x62,0x74,0x00,0x03,0x62,0xbc,0x00,0x03,0x63,0x28,0x00,0x03,0x63,0x6a,0x00,0x03,0x64,0x3c,0x00,0x03,0x64,0xea,0x00,0x03,0x65,0x74,0x00,0x03,0x66,0x00,0x00,0x03,0x66,0x6c,0x00,0x03,0x67,0x10,0x00,0x03,0x67,0xe6,0x00,0x03,0x68,0xae,\r\n0x00,0x03,0x69,0x20,0x00,0x03,0x69,0xc6,0x00,0x03,0x6a,0x72,0x00,0x03,0x6b,0x10,0x00,0x03,0x6b,0x6a,0x00,0x03,0x6b,0xe4,0x00,0x03,0x6c,0x30,0x00,0x03,0x6c,0x92,0x00,0x03,0x6d,0x26,0x00,0x03,0x6d,0xda,0x00,0x03,0x6e,0x74,0x00,0x03,0x6f,0x0a,0x00,0x03,0x6f,0x8e,0x00,0x03,0x70,0x12,0x00,0x03,0x70,0xd6,0x00,0x03,0x71,0x3c,\r\n0x00,0x03,0x71,0x66,0x00,0x03,0x71,0x78,0x00,0x03,0x71,0x8a,0x00,0x03,0x71,0x9c,0x00,0x03,0x71,0xae,0x00,0x03,0x71,0xc0,0x00,0x03,0x72,0x78,0x00,0x03,0x73,0x84,0x00,0x03,0x74,0xd6,0x00,0x03,0x75,0x98,0x00,0x03,0x75,0xe6,0x00,0x03,0x76,0x26,0x00,0x03,0x76,0x64,0x00,0x03,0x76,0xa2,0x00,0x03,0x76,0xe0,0x00,0x03,0x77,0x42,\r\n0x00,0x03,0x77,0x6a,0x00,0x03,0x77,0xb6,0x00,0x03,0x77,0xe8,0x00,0x03,0x78,0x1a,0x00,0x03,0x78,0x4c,0x00,0x03,0x78,0x7e,0x00,0x03,0x78,0xbc,0x00,0x03,0x78,0xfa,0x00,0x03,0x79,0x38,0x00,0x03,0x79,0x76,0x00,0x03,0x79,0xa8,0x00,0x03,0x79,0xda,0x00,0x03,0x7a,0x0c,0x00,0x03,0x7a,0x3e,0x00,0x03,0x7a,0x7c,0x00,0x03,0x7a,0xba,\r\n0x00,0x03,0x7a,0xf8,0x00,0x03,0x7b,0x36,0x00,0x03,0x7b,0x68,0x00,0x03,0x7b,0x9a,0x00,0x03,0x7b,0xcc,0x00,0x03,0x7b,0xfe,0x00,0x03,0x7c,0x3c,0x00,0x03,0x7c,0x7a,0x00,0x03,0x7c,0xb8,0x00,0x03,0x7c,0xf6,0x00,0x03,0x7d,0x4a,0x00,0x03,0x7d,0x9e,0x00,0x03,0x7d,0xfc,0x00,0x03,0x7e,0x5a,0x00,0x03,0x7e,0xb0,0x00,0x03,0x7f,0x06,\r\n0x00,0x03,0x7f,0x62,0x00,0x03,0x7f,0xbe,0x00,0x03,0x80,0x70,0x00,0x03,0x81,0x08,0x00,0x03,0x81,0xfa,0x00,0x03,0x83,0x00,0x00,0x03,0x83,0xe8,0x00,0x03,0x84,0xea,0x00,0x03,0x85,0xe4,0x00,0x03,0x86,0x8c,0x00,0x03,0x88,0x02,0x00,0x03,0x88,0xfc,0x00,0x03,0x89,0xec,0x00,0x03,0x8a,0x50,0x00,0x03,0x8b,0x26,0x00,0x03,0x8c,0x02,\r\n0x00,0x03,0x8c,0x46,0x00,0x03,0x8c,0x7c,0x00,0x03,0x8c,0xc4,0x00,0x03,0x8d,0x0a,0x00,0x03,0x8d,0x50,0x00,0x03,0x8d,0xa6,0x00,0x03,0x8d,0xb8,0x00,0x03,0x8d,0xca,0x00,0x03,0x8d,0xdc,0x00,0x03,0x8d,0xee,0x00,0x03,0x8e,0x00,0x00,0x03,0x8e,0x12,0x00,0x03,0x8e,0x24,0x00,0x03,0x8e,0x36,0x00,0x03,0x8e,0x48,0x00,0x03,0x8e,0x5a,\r\n0x00,0x03,0x8e,0x6c,0x00,0x03,0x8e,0x7e,0x00,0x03,0x8e,0x90,0x00,0x03,0x8e,0xa2,0x00,0x03,0x8e,0xb4,0x00,0x03,0x8e,0xd6,0x00,0x03,0x8e,0xf6,0x00,0x03,0x8f,0x16,0x00,0x03,0x8f,0x36,0x00,0x03,0x8f,0x58,0x00,0x03,0x8f,0x78,0x00,0x03,0x8f,0x9a,0x00,0x03,0x8f,0xba,0x00,0x03,0x8f,0xe0,0x00,0x03,0x90,0x02,0x00,0x03,0x90,0x22,\r\n0x00,0x03,0x90,0x42,0x00,0x03,0x90,0x64,0x00,0x03,0x90,0x84,0x00,0x03,0x90,0xa4,0x00,0x03,0x91,0x94,0x00,0x03,0x92,0x46,0x00,0x03,0x92,0xfa,0x00,0x03,0x93,0x74,0x00,0x03,0x93,0xfc,0x00,0x03,0x94,0x82,0x00,0x03,0x95,0x1a,0x00,0x03,0x95,0x9e,0x00,0x03,0x95,0xc8,0x00,0x03,0x96,0x10,0x00,0x03,0x96,0x6a,0x00,0x03,0x96,0xe2,\r\n0x00,0x03,0x97,0x52,0x00,0x03,0x98,0x02,0x00,0x03,0x98,0x82,0x00,0x03,0x98,0xae,0x00,0x03,0x99,0x2e,0x00,0x03,0x99,0x8e,0x00,0x03,0x99,0xf0,0x00,0x03,0x9a,0x40,0x00,0x03,0x9a,0x56,0x00,0x03,0x9a,0x6c,0x00,0x03,0x9a,0x82,0x00,0x03,0x9a,0x9a,0x00,0x03,0x9a,0xb2,0x00,0x03,0x9a,0xca,0x00,0x03,0x9a,0xe2,0x00,0x03,0x9a,0xfa,\r\n0x00,0x03,0x9b,0x98,0x00,0x03,0x9c,0xa6,0x00,0x03,0x9c,0xbe,0x00,0x03,0x9c,0xd6,0x00,0x03,0x9d,0xe8,0x00,0x03,0x9e,0x00,0x00,0x03,0x9f,0x24,0x00,0x03,0x9f,0x78,0x00,0x03,0x9f,0xca,0x00,0x03,0xa0,0x2c,0x00,0x03,0xa1,0x2a,0x00,0x03,0xa1,0xf4,0x00,0x03,0xa2,0x9e,0x00,0x03,0xa3,0x06,0x00,0x03,0xa3,0x68,0x00,0x03,0xa3,0xd6,\r\n0x00,0x03,0xa4,0xa6,0x00,0x03,0xa4,0xbe,0x00,0x03,0xa5,0x74,0x00,0x03,0xa6,0x5e,0x00,0x03,0xa7,0x8e,0x00,0x03,0xa7,0xa6,0x00,0x03,0xa7,0xbe,0x00,0x03,0xa7,0xd6,0x00,0x03,0xa7,0xee,0x00,0x03,0xa8,0x06,0x00,0x03,0xa8,0x16,0x00,0x03,0xa8,0x2e,0x00,0x03,0xa8,0x46,0x00,0x03,0xa8,0xde,0x00,0x03,0xa9,0x44,0x00,0x03,0xaa,0x10,\r\n0x00,0x03,0xaa,0x28,0x00,0x03,0xaa,0x38,0x00,0x03,0xab,0x76,0x00,0x03,0xac,0x34,0x00,0x03,0xac,0x4c,0x00,0x03,0xac,0x64,0x00,0x03,0xac,0x7c,0x00,0x03,0xad,0x7e,0x00,0x03,0xad,0xdc,0x00,0x03,0xae,0x00,0x00,0x03,0xae,0x18,0x00,0x03,0xae,0x30,0x00,0x03,0xae,0x40,0x00,0x03,0xae,0x50,0x00,0x03,0xae,0x60,0x00,0x03,0xae,0x7e,\r\n0x00,0x03,0xae,0x9c,0x00,0x03,0xae,0xc6,0x00,0x03,0xae,0xea,0x00,0x03,0xaf,0x28,0x00,0x03,0xaf,0x52,0x00,0x03,0xaf,0x6a,0x00,0x03,0xb0,0x52,0x00,0x03,0xb0,0xea,0x00,0x03,0xb1,0x00,0x00,0x03,0xb1,0x16,0x00,0x03,0xb1,0x3a,0x00,0x03,0xb1,0x50,0x00,0x03,0xb1,0x68,0x00,0x03,0xb1,0x96,0x00,0x03,0xb1,0xae,0x00,0x03,0xb1,0xc6,\r\n0x00,0x03,0xb1,0xde,0x00,0x03,0xb1,0xf6,0x00,0x03,0xb2,0x0e,0x00,0x03,0xb2,0xdc,0x00,0x03,0xb2,0xf4,0x00,0x03,0xb3,0x6a,0x00,0x03,0xb3,0x82,0x00,0x03,0xb3,0xfa,0x00,0x03,0xb4,0x12,0x00,0x03,0xb5,0x5a,0x00,0x03,0xb5,0x72,0x00,0x03,0xb6,0xb4,0x00,0x03,0xb6,0xcc,0x00,0x03,0xb7,0xa2,0x00,0x03,0xb7,0xba,0x00,0x03,0xb8,0xaa,\r\n0x00,0x03,0xb8,0xc2,0x00,0x03,0xb8,0xfc,0x00,0x03,0xb9,0x14,0x00,0x03,0xb9,0x2c,0x00,0x03,0xba,0x64,0x00,0x03,0xba,0xe4,0x00,0x03,0xbb,0xc6,0x00,0x03,0xbb,0xde,0x00,0x03,0xbc,0x92,0x00,0x03,0xbd,0x74,0x00,0x03,0xbe,0x48,0x00,0x03,0xbe,0x60,0x00,0x03,0xbe,0xa4,0x00,0x03,0xbf,0x76,0x00,0x03,0xbf,0xba,0x00,0x03,0xbf,0xe6,\r\n0x00,0x03,0xc0,0xae,0x00,0x03,0xc0,0xd8,0x00,0x03,0xc1,0xba,0x00,0x03,0xc2,0x42,0x00,0x03,0xc2,0x60,0x00,0x03,0xc2,0x7e,0x00,0x03,0xc2,0x8e,0x00,0x03,0xc3,0x04,0x00,0x03,0xc3,0x14,0x00,0x03,0xc3,0x24,0x00,0x03,0xc3,0x34,0x00,0x03,0xc3,0xb6,0x00,0x03,0xc4,0x84,0x00,0x03,0xc5,0x7c,0x00,0x03,0xc6,0x18,0x00,0x03,0xc6,0x9a,\r\n0x00,0x03,0xc6,0xb2,0x00,0x03,0xc6,0xca,0x00,0x03,0xc7,0xf2,0x00,0x03,0xc9,0x62,0x00,0x03,0xc9,0x7a,0x00,0x03,0xc9,0x92,0x00,0x03,0xca,0x66,0x00,0x03,0xca,0x76,0x00,0x03,0xca,0x8e,0x00,0x03,0xca,0xa4,0x00,0x03,0xca,0xb4,0x00,0x03,0xca,0xc4,0x00,0x03,0xca,0xdc,0x00,0x03,0xca,0xf4,0x00,0x03,0xcb,0x18,0x00,0x03,0xcb,0x28,\r\n0x00,0x03,0xcb,0x38,0x00,0x03,0xcb,0x48,0x00,0x03,0xcb,0x58,0x00,0x03,0xcc,0x3e,0x00,0x03,0xcd,0x2e,0x00,0x03,0xcd,0xea,0x00,0x03,0xcd,0xfa,0x00,0x03,0xce,0x0a,0x00,0x03,0xce,0x1a,0x00,0x03,0xce,0xc6,0x00,0x03,0xce,0xd6,0x00,0x03,0xce,0xee,0x00,0x03,0xcf,0x06,0x00,0x03,0xcf,0x1e,0x00,0x03,0xcf,0x36,0x00,0x03,0xcf,0xcc,\r\n0x00,0x03,0xcf,0xdc,0x00,0x03,0xcf,0xf2,0x00,0x03,0xd0,0xc6,0x00,0x03,0xd0,0xea,0x00,0x03,0xd1,0x02,0x00,0x03,0xd1,0x9e,0x00,0x03,0xd2,0x2a,0x00,0x03,0xd2,0x4e,0x00,0x03,0xd2,0x66,0x00,0x03,0xd2,0x94,0x00,0x03,0xd3,0x00,0x00,0x03,0xd3,0x48,0x00,0x03,0xd3,0x60,0x00,0x03,0xd3,0x78,0x00,0x03,0xd3,0x90,0x00,0x03,0xd3,0xa0,\r\n0x00,0x03,0xd3,0xb0,0x00,0x03,0xd5,0xda,0x00,0x03,0xd6,0x5c,0x00,0x03,0xd6,0x8c,0x00,0x03,0xd8,0x0e,0x00,0x03,0xd8,0x7e,0x00,0x03,0xd8,0x8e,0x00,0x03,0xd9,0x40,0x00,0x03,0xd9,0x50,0x00,0x03,0xd9,0x60,0x00,0x03,0xd9,0x70,0x00,0x03,0xd9,0x80,0x00,0x03,0xda,0x94,0x00,0x03,0xda,0xa4,0x00,0x03,0xdb,0x20,0x00,0x03,0xdb,0xa2,\r\n0x00,0x03,0xdb,0xb8,0x00,0x03,0xdb,0xce,0x00,0x03,0xdb,0xf2,0x00,0x03,0xdc,0x16,0x00,0x03,0xdc,0x2c,0x00,0x03,0xdc,0x42,0x00,0x03,0xdc,0x66,0x00,0x03,0xdc,0x92,0x00,0x03,0xdc,0xaa,0x00,0x03,0xdc,0xca,0x00,0x03,0xdc,0xe2,0x00,0x03,0xdc,0xfa,0x00,0x03,0xdd,0x12,0x00,0x03,0xdd,0x2a,0x00,0x03,0xdd,0x42,0x00,0x03,0xdd,0x5a,\r\n0x00,0x03,0xdd,0x88,0x00,0x03,0xdd,0xb6,0x00,0x03,0xdd,0xce,0x00,0x03,0xdd,0xe6,0x00,0x03,0xdd,0xfe,0x00,0x03,0xde,0x16,0x00,0x03,0xde,0x2e,0x00,0x03,0xde,0x46,0x00,0x03,0xde,0x5e,0x00,0x03,0xde,0x76,0x00,0x03,0xde,0x9a,0x00,0x03,0xde,0xb2,0x00,0x03,0xde,0xca,0x00,0x03,0xde,0xe2,0x00,0x03,0xde,0xfa,0x00,0x03,0xdf,0x12,\r\n0x00,0x03,0xdf,0x2a,0x00,0x03,0xdf,0x50,0x00,0x03,0xdf,0x76,0x00,0x03,0xdf,0x8e,0x00,0x03,0xdf,0xa6,0x00,0x03,0xdf,0xbe,0x00,0x03,0xdf,0xd6,0x00,0x03,0xe1,0x1a,0x00,0x03,0xe2,0x80,0x00,0x03,0xe2,0x98,0x00,0x03,0xe2,0xbe,0x00,0x03,0xe2,0xd6,0x00,0x03,0xe2,0xf6,0x00,0x03,0xe3,0x0e,0x00,0x03,0xe3,0x26,0x00,0x03,0xe3,0x3e,\r\n0x00,0x03,0xe3,0x56,0x00,0x03,0xe3,0x6e,0x00,0x03,0xe3,0x86,0x00,0x03,0xe3,0x9e,0x00,0x03,0xe3,0xb6,0x00,0x03,0xe3,0xda,0x00,0x03,0xe3,0xf8,0x00,0x03,0xe4,0x10,0x00,0x03,0xe4,0x28,0x00,0x03,0xe4,0x48,0x00,0x03,0xe4,0x68,0x00,0x03,0xe4,0x80,0x00,0x03,0xe4,0x98,0x00,0x03,0xe4,0xb8,0x00,0x03,0xe4,0xd8,0x00,0x03,0xe4,0xf0,\r\n0x00,0x03,0xe5,0x08,0x00,0x03,0xe5,0x20,0x00,0x03,0xe5,0x38,0x00,0x03,0xe5,0x50,0x00,0x03,0xe5,0x68,0x00,0x03,0xe5,0x80,0x00,0x03,0xe5,0x98,0x00,0x03,0xe5,0xb0,0x00,0x03,0xe6,0xca,0x00,0x03,0xe6,0xe2,0x00,0x03,0xe6,0xfa,0x00,0x03,0xe7,0x12,0x00,0x03,0xe7,0x32,0x00,0x03,0xe7,0x52,0x00,0x03,0xe7,0x72,0x00,0x03,0xe7,0x8a,\r\n0x00,0x03,0xe7,0xa2,0x00,0x03,0xe7,0xba,0x00,0x03,0xe7,0xd2,0x00,0x03,0xe7,0xea,0x00,0x03,0xe8,0x02,0x00,0x03,0xe8,0x1a,0x00,0x03,0xe8,0x32,0x00,0x03,0xe9,0x24,0x00,0x03,0xea,0x2a,0x00,0x03,0xea,0x42,0x00,0x03,0xea,0x5a,0x00,0x03,0xea,0x72,0x00,0x03,0xea,0x8a,0x00,0x03,0xea,0xa2,0x00,0x03,0xea,0xba,0x00,0x03,0xea,0xd2,\r\n0x00,0x03,0xea,0xea,0x00,0x03,0xeb,0x0a,0x00,0x03,0xeb,0x28,0x00,0x03,0xeb,0x56,0x00,0x03,0xeb,0x82,0x00,0x03,0xeb,0xa2,0x00,0x03,0xeb,0xc0,0x00,0x03,0xeb,0xe0,0x00,0x03,0xeb,0xfe,0x00,0x03,0xec,0x34,0x00,0x03,0xec,0x68,0x00,0x03,0xec,0x80,0x00,0x03,0xec,0x98,0x00,0x03,0xec,0xb0,0x00,0x03,0xec,0xc8,0x00,0x03,0xec,0xf0,\r\n0x00,0x03,0xed,0x18,0x00,0x03,0xed,0xfe,0x00,0x03,0xee,0x16,0x00,0x03,0xee,0x38,0x00,0x03,0xee,0x58,0x00,0x03,0xee,0x70,0x00,0x03,0xee,0x92,0x00,0x03,0xee,0xb2,0x00,0x03,0xee,0xca,0x00,0x03,0xee,0xe2,0x00,0x03,0xee,0xfa,0x00,0x03,0xef,0x12,0x00,0x03,0xef,0x32,0x00,0x03,0xef,0x48,0x00,0x03,0xf0,0x5e,0x00,0x03,0xf0,0x82,\r\n0x00,0x03,0xf0,0xa8,0x00,0x03,0xf0,0xc0,0x00,0x03,0xf0,0xe4,0x00,0x03,0xf0,0xfc,0x00,0x03,0xf1,0x14,0x00,0x03,0xf1,0xe8,0x00,0x03,0xf2,0xfc,0x00,0x03,0xf3,0x14,0x00,0x03,0xf3,0x2c,0x00,0x03,0xf3,0x4c,0x00,0x03,0xf3,0x64,0x00,0x03,0xf3,0x7e,0x00,0x03,0xf3,0xa0,0x00,0x03,0xf3,0xba,0x00,0x03,0xf3,0xd2,0x00,0x03,0xf5,0x4e,\r\n0x00,0x03,0xf6,0x0e,0x00,0x03,0xf6,0xd0,0x00,0x03,0xf7,0x2c,0x00,0x03,0xf8,0x42,0x00,0x03,0xf9,0xc4,0x00,0x03,0xfb,0x5e,0x00,0x03,0xfb,0xd0,0x00,0x03,0xfc,0x46,0x00,0x03,0xfc,0xc8,0x00,0x03,0xfd,0x94,0x00,0x03,0xfe,0xae,0x00,0x03,0xff,0x2c,0x00,0x03,0xff,0xf8,0x00,0x04,0x00,0x0a,0x00,0x04,0x00,0x92,0x00,0x04,0x01,0x2c,\r\n0x00,0x04,0x02,0x62,0x00,0x04,0x02,0xb4,0x00,0x04,0x02,0xfe,0x00,0x04,0x03,0xca,0x00,0x04,0x03,0xea,0x00,0x04,0x04,0x0a,0x00,0x04,0x04,0x2a,0x00,0x04,0x04,0x4a,0x00,0x04,0x04,0x6a,0x00,0x04,0x04,0x8a,0x00,0x04,0x04,0xaa,0x00,0x04,0x04,0xca,0x00,0x04,0x04,0xe2,0x00,0x04,0x04,0xfa,0x00,0x04,0x05,0x26,0x00,0x04,0x05,0x52,\r\n0x00,0x04,0x05,0x70,0x00,0x04,0x05,0x8e,0x00,0x04,0x05,0xae,0x00,0x04,0x05,0xce,0x00,0x04,0x05,0xee,0x00,0x04,0x06,0x0e,0x00,0x04,0x06,0x2e,0x00,0x04,0x06,0x4e,0x00,0x04,0x06,0x7e,0x00,0x04,0x06,0xae,0x00,0x04,0x06,0xce,0x00,0x04,0x06,0xee,0x00,0x04,0x07,0xb0,0x00,0x04,0x08,0x12,0x00,0x04,0x08,0x2a,0x00,0x04,0x08,0x42,\r\n0x00,0x04,0x08,0x6e,0x00,0x04,0x08,0x8c,0x00,0x04,0x08,0xaa,0x00,0x04,0x0b,0x1c,0x00,0x04,0x0b,0x66,0x00,0x04,0x0c,0x5e,0x00,0x04,0x0c,0xf4,0x00,0x04,0x0d,0xd6,0x00,0x04,0x0e,0x96,0x00,0x04,0x0e,0xda,0x00,0x04,0x10,0x3e,0x00,0x04,0x11,0x0a,0x00,0x04,0x11,0xda,0x00,0x04,0x12,0xa4,0x00,0x04,0x13,0xdc,0x00,0x04,0x14,0x86,\r\n0x00,0x04,0x14,0xb6,0x00,0x04,0x15,0x7c,0x00,0x04,0x15,0xfe,0x00,0x04,0x16,0x28,0x00,0x04,0x16,0x4c,0x00,0x04,0x16,0x70,0x00,0x04,0x16,0x88,0x00,0x04,0x16,0xa0,0x00,0x04,0x16,0xb8,0x00,0x04,0x16,0xdc,0x00,0x04,0x17,0x00,0x00,0x04,0x17,0x24,0x00,0x04,0x18,0x08,0x00,0x04,0x18,0xa0,0x00,0x04,0x19,0x52,0x00,0x04,0x19,0x6a,\r\n0x00,0x04,0x19,0x82,0x00,0x04,0x19,0xaa,0x00,0x04,0x19,0xc2,0x00,0x04,0x19,0xda,0x00,0x04,0x1b,0x8a,0x00,0x04,0x1c,0x82,0x00,0x04,0x1e,0x16,0x00,0x04,0x1f,0x10,0x00,0x04,0x20,0xae,0x00,0x04,0x21,0xbc,0x00,0x04,0x22,0xd0,0x00,0x04,0x23,0x76,0x00,0x04,0x23,0xa6,0x00,0x04,0x23,0xe0,0x00,0x04,0x24,0x1a,0x00,0x04,0x24,0x5c,\r\n0x00,0x04,0x25,0x26,0x00,0x04,0x25,0x90,0x00,0x04,0x25,0xa8,0x00,0x04,0x25,0xc0,0x00,0x04,0x25,0xe0,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x18,0x00,0x04,0x26,0x30,0x00,0x04,0x26,0x50,0x00,0x04,0x26,0x70,0x00,0x04,0x26,0x90,0x00,0x04,0x26,0xb0,0x00,0x04,0x26,0xd4,0x00,0x04,0x26,0xf8,0x00,0x04,0x27,0x10,0x00,0x04,0x27,0x28,\r\n0x00,0x04,0x27,0x40,0x00,0x04,0x27,0x58,0x00,0x04,0x27,0x70,0x00,0x04,0x28,0x98,0x00,0x04,0x29,0xfc,0x00,0x04,0x2a,0x14,0x00,0x04,0x2a,0x34,0x00,0x04,0x2a,0x58,0x00,0x04,0x2a,0x70,0x00,0x04,0x2a,0x88,0x00,0x04,0x2a,0xa0,0x00,0x04,0x2a,0xb8,0x00,0x04,0x2a,0xd0,0x00,0x04,0x2a,0xe8,0x00,0x04,0x2b,0x00,0x00,0x04,0x2b,0x18,\r\n0x00,0x04,0x2b,0x30,0x00,0x04,0x2b,0x48,0x00,0x04,0x2b,0x60,0x00,0x04,0x2b,0x78,0x00,0x04,0x2b,0x90,0x00,0x04,0x2b,0xa8,0x00,0x04,0x2b,0xc0,0x00,0x04,0x2b,0xd8,0x00,0x04,0x2b,0xf0,0x00,0x04,0x2c,0x08,0x00,0x04,0x2c,0x20,0x00,0x04,0x2c,0x38,0x00,0x04,0x2c,0x50,0x00,0x04,0x2c,0x68,0x00,0x04,0x2c,0x80,0x00,0x04,0x2c,0x98,\r\n0x00,0x04,0x2c,0xb0,0x00,0x04,0x2c,0xc8,0x00,0x04,0x2c,0xe0,0x00,0x04,0x2c,0xf8,0x00,0x04,0x2d,0x10,0x00,0x04,0x2d,0x28,0x00,0x04,0x2d,0x40,0x00,0x04,0x2d,0x58,0x00,0x04,0x2d,0x70,0x00,0x04,0x2d,0x88,0x00,0x04,0x2d,0xaa,0x00,0x04,0x2d,0xca,0x00,0x04,0x2d,0xea,0x00,0x04,0x2e,0x16,0x00,0x04,0x2e,0x42,0x00,0x04,0x2e,0x78,\r\n0x00,0x04,0x2e,0x90,0x00,0x04,0x2e,0xa8,0x00,0x04,0x2e,0xbe,0x00,0x04,0x2e,0xd4,0x00,0x04,0x2e,0xec,0x00,0x04,0x2f,0x04,0x00,0x04,0x2f,0x1c,0x00,0x04,0x2f,0x34,0x00,0x04,0x2f,0x44,0x00,0x04,0x2f,0x64,0x00,0x04,0x2f,0x84,0x00,0x04,0x2f,0xc0,0x00,0x04,0x2f,0xfc,0x00,0x04,0x30,0x32,0x00,0x04,0x30,0x68,0x00,0x04,0x30,0xf6,\r\n0x00,0x04,0x31,0xf0,0x00,0x04,0x32,0x88,0x00,0x04,0x32,0x98,0x00,0x04,0x32,0xce,0x00,0x04,0x32,0xf2,0x00,0x04,0x33,0xaa,0x00,0x04,0x34,0x86,0x00,0x04,0x35,0x44,0x00,0x04,0x35,0xf8,0x00,0x04,0x37,0x28,0x00,0x04,0x37,0xb4,0x00,0x04,0x38,0x7c,0x00,0x04,0x39,0x56,0x00,0x04,0x39,0x66,0x00,0x04,0x39,0x9c,0x00,0x04,0x39,0xd2,\r\n0x00,0x04,0x39,0xe2,0x00,0x04,0x3a,0x06,0x00,0x04,0x3a,0x2a,0x00,0x04,0x3a,0x42,0x00,0x04,0x3a,0x5a,0x00,0x04,0x3b,0x5e,0x00,0x04,0x3c,0x10,0x00,0x04,0x3c,0x20,0x00,0x04,0x3c,0x30,0x00,0x04,0x3c,0x54,0x00,0x04,0x3c,0x78,0x00,0x04,0x3c,0x90,0x00,0x04,0x3c,0xa8,0x00,0x04,0x3c,0xcc,0x00,0x04,0x3c,0xf2,0x00,0x04,0x3d,0x12,\r\n0x00,0x04,0x3d,0x32,0x00,0x04,0x3d,0x44,0x00,0x04,0x3d,0x78,0x00,0x04,0x3d,0xe2,0x00,0x04,0x3f,0x42,0x00,0x04,0x3f,0x9a,0x00,0x04,0x3f,0xaa,0x00,0x04,0x40,0x76,0x00,0x04,0x41,0x02,0x00,0x04,0x41,0x1a,0x00,0x04,0x41,0xc4,0x00,0x04,0x41,0xe8,0x00,0x04,0x42,0x0c,0x00,0x04,0x42,0x30,0x00,0x04,0x42,0x40,0x00,0x04,0x42,0x64,\r\n0x00,0x04,0x42,0x7c,0x00,0x04,0x42,0x94,0x00,0x04,0x42,0xac,0x00,0x04,0x42,0xc4,0x00,0x04,0x43,0xb4,0x00,0x04,0x43,0xfc,0x00,0x04,0x44,0x44,0x00,0x04,0x44,0xe0,0x00,0x04,0x45,0x3e,0x00,0x04,0x45,0xba,0x00,0x04,0x46,0x1c,0x00,0x04,0x46,0x54,0x00,0x04,0x46,0xa6,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,\r\n0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x46,0xfa,0x00,0x04,0x47,0x98,0x00,0x04,0x47,0xb0,0x00,0x04,0x47,0xc8,0x00,0x04,0x47,0xe0,\r\n0x00,0x04,0x47,0xf8,0x00,0x04,0x48,0x10,0x00,0x04,0x48,0x28,0x00,0x04,0x48,0x4c,0x00,0x04,0x48,0x6a,0x00,0x04,0x48,0x82,0x00,0x04,0x48,0x9a,0x00,0x04,0x48,0xb2,0x00,0x04,0x48,0xca,0x00,0x04,0x48,0xda,0x00,0x04,0x48,0xea,0x00,0x04,0x49,0xb8,0x00,0x04,0x4a,0x20,0x00,0x04,0x4a,0x30,0x00,0x04,0x4a,0x40,0x00,0x04,0x4a,0x50,\r\n0x00,0x04,0x4a,0x60,0x00,0x04,0x4b,0x4e,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x60,0x00,0x04,0x4b,0x8a,0x00,0x04,0x4b,0xb4,0x00,0x04,0x4b,0xfe,0x00,0x04,0x4c,0x3c,0x00,0x04,0x4c,0x82,0x00,0x04,0x4c,0xc2,\r\n0x00,0x04,0x4d,0x24,0x00,0x04,0x4d,0x34,0x00,0x04,0x4d,0x66,0x00,0x04,0x4d,0xd6,0x00,0x04,0x4e,0xac,0x00,0x04,0x4f,0x30,0x00,0x04,0x4f,0x58,0x00,0x04,0x4f,0x80,0x00,0x04,0x4f,0xa8,0x00,0x04,0x4f,0xd0,0x00,0x04,0x4f,0xf8,0x00,0x04,0x50,0x20,0x00,0x04,0x50,0xc0,0x00,0x04,0x51,0x2a,0x00,0x04,0x51,0xd8,0x00,0x04,0x52,0x74,\r\n0x00,0x04,0x53,0x2a,0x00,0x04,0x53,0x9e,0x00,0x04,0x53,0xcc,0x00,0x04,0x54,0x80,0x00,0x04,0x54,0x90,0x00,0x04,0x55,0x78,0x00,0x04,0x56,0x5c,0x00,0x04,0x56,0x98,0x00,0x04,0x56,0xd4,0x00,0x04,0x57,0x32,0x00,0x04,0x57,0x8e,0x00,0x04,0x57,0xee,0x00,0x04,0x58,0x2a,0x00,0x04,0x58,0x3a,0x00,0x04,0x58,0x7c,0x00,0x04,0x58,0xb6,\r\n0x00,0x04,0x58,0xc6,0x00,0x04,0x58,0xec,0x00,0x04,0x59,0x12,0x00,0x04,0x59,0x8c,0x00,0x04,0x5a,0x38,0x00,0x04,0x5a,0xca,0x00,0x04,0x5b,0x6c,0x00,0x04,0x5b,0xb4,0x00,0x04,0x5c,0x30,0x00,0x04,0x5c,0xe2,0x00,0x04,0x5d,0x0e,0x00,0x04,0x5d,0x4a,0x00,0x04,0x5d,0x8e,0x00,0x04,0x5e,0x34,0x00,0x04,0x5e,0x76,0x00,0x04,0x5e,0xa0,\r\n0x00,0x04,0x5e,0xd0,0x00,0x04,0x5e,0xf8,0x00,0x04,0x5f,0x26,0x00,0x04,0x5f,0x6a,0x00,0x04,0x5f,0xae,0x00,0x04,0x60,0x30,0x00,0x04,0x60,0x74,0x00,0x04,0x60,0xba,0x00,0x04,0x61,0x84,0x00,0x04,0x62,0x2a,0x00,0x04,0x62,0xe0,0x00,0x04,0x63,0x52,0x00,0x04,0x63,0xe4,0x00,0x04,0x64,0x14,0x00,0x04,0x64,0xa4,0x00,0x04,0x65,0x1e,\r\n0x00,0x04,0x65,0xd4,0x00,0x04,0x66,0x02,0x00,0x04,0x66,0x6c,0x00,0x04,0x67,0x16,0x00,0x04,0x67,0xd6,0x00,0x04,0x68,0x5c,0x00,0x04,0x69,0x3c,0x00,0x04,0x69,0x6e,0x00,0x04,0x69,0xf2,0x00,0x04,0x6a,0x9a,0x00,0x04,0x6b,0x26,0x00,0x04,0x6b,0xbc,0x00,0x04,0x6c,0x86,0x00,0x04,0x6d,0x3e,0x00,0x04,0x6d,0xda,0x00,0x04,0x6e,0xaa,\r\n0x00,0x04,0x6f,0x12,0x00,0x04,0x70,0x04,0x00,0x04,0x70,0xce,0x00,0x04,0x70,0xe6,0x00,0x04,0x70,0xfe,0x00,0x04,0x71,0x16,0x00,0x04,0x71,0x44,0x00,0x04,0x71,0x90,0x00,0x04,0x71,0xa8,0x00,0x04,0x71,0xc0,0x00,0x04,0x71,0xd6,0x00,0x04,0x71,0xf4,0x00,0x04,0x72,0x5a,0x00,0x04,0x72,0xe0,0x00,0x04,0x72,0xf0,0x00,0x04,0x73,0x00,\r\n0x00,0x04,0x73,0x10,0x00,0x04,0x73,0x20,0x00,0x04,0x73,0x30,0x00,0x04,0x73,0x40,0x00,0x04,0x73,0x50,0x00,0x04,0x73,0x60,0x00,0x04,0x73,0xa0,0x00,0x04,0x73,0xb8,0x00,0x04,0x73,0xd0,0x00,0x04,0x73,0xf0,0x00,0x04,0x74,0x10,0x00,0x04,0x74,0x28,0x00,0x04,0x74,0x40,0x00,0x04,0x74,0x58,0x00,0x04,0x74,0x70,0x00,0x04,0x74,0x88,\r\n0x00,0x04,0x74,0xa0,0x00,0x04,0x74,0xb8,0x00,0x04,0x74,0xce,0x00,0x04,0x74,0xe4,0x00,0x04,0x74,0xfc,0x00,0x04,0x75,0x14,0x00,0x04,0x75,0x2c,0x00,0x04,0x75,0x44,0x00,0x04,0x75,0x5c,0x00,0x04,0x75,0x74,0x00,0x04,0x75,0x8c,0x00,0x04,0x75,0xa4,0x00,0x04,0x75,0xbc,0x00,0x04,0x75,0xd4,0x00,0x04,0x75,0xec,0x00,0x04,0x76,0x04,\r\n0x00,0x04,0x76,0x1c,0x00,0x04,0x76,0x34,0x00,0x04,0x76,0x4c,0x00,0x04,0x76,0x64,0x00,0x04,0x76,0x7c,0x00,0x04,0x76,0x94,0x00,0x04,0x76,0xac,0x00,0x04,0x77,0x4e,0x00,0x04,0x79,0x8e,0x00,0x04,0x79,0xcc,0x00,0x04,0x79,0xf6,0x00,0x04,0x7a,0x06,0x00,0x04,0x7a,0x1e,0x00,0x04,0x7a,0x36,0x00,0x04,0x7a,0x4e,0x00,0x04,0x7a,0xc2,\r\n0x00,0x04,0x7b,0x6c,0x00,0x04,0x7b,0xc2,0x00,0x04,0x7c,0x38,0x00,0x04,0x7c,0xc4,0x00,0x04,0x7d,0x04,0x00,0x04,0x7d,0x30,0x00,0x04,0x7d,0xea,0x00,0x04,0x7e,0x2a,0x00,0x04,0x7e,0x8a,0x00,0x04,0x7e,0xfc,0x00,0x04,0x7f,0x3c,0x00,0x04,0x7f,0x7c,0x00,0x04,0x7f,0xee,0x00,0x04,0x80,0xd4,0x00,0x04,0x81,0x50,0x00,0x04,0x81,0xb8,\r\n0x00,0x04,0x82,0x30,0x00,0x04,0x82,0x64,0x00,0x04,0x82,0xc4,0x00,0x04,0x83,0x04,0x00,0x04,0x83,0x76,0x00,0x04,0x83,0xcc,0x00,0x04,0x84,0x0c,0x00,0x04,0x84,0x86,0x00,0x04,0x84,0x96,0x00,0x04,0x84,0xe6,0x00,0x04,0x85,0x18,0x00,0x04,0x85,0x58,0x00,0x04,0x86,0x14,0x00,0x04,0x86,0x78,0x00,0x04,0x86,0x88,0x00,0x04,0x87,0x06,\r\n0x00,0x04,0x87,0x1e,0x00,0x04,0x87,0x66,0x00,0x04,0x88,0x4c,0x00,0x04,0x88,0xf0,0x00,0x04,0x89,0x9a,0x00,0x04,0x8a,0x92,0x00,0x04,0x8b,0x26,0x00,0x04,0x8b,0xe8,0x00,0x04,0x8c,0xa6,0x00,0x04,0x8d,0x6a,0x00,0x04,0x8d,0xa2,0x00,0x04,0x8e,0x72,0x00,0x04,0x8f,0x44,0x00,0x04,0x90,0x30,0x00,0x04,0x90,0xbc,0x00,0x04,0x92,0x1a,\r\n0x00,0x04,0x92,0x9e,0x00,0x04,0x93,0x30,0x00,0x04,0x93,0xe4,0x00,0x04,0x94,0x76,0x00,0x04,0x95,0x16,0x00,0x04,0x96,0x70,0x00,0x04,0x97,0x68,0x00,0x04,0x97,0xe8,0x00,0x04,0x98,0x56,0x00,0x04,0x98,0xd0,0x00,0x04,0x99,0x92,0x00,0x04,0x9a,0x12,0x00,0x04,0x9a,0xfa,0x00,0x04,0x9b,0xd6,0x00,0x04,0x9c,0x8a,0x00,0x04,0x9d,0xc4,\r\n0x00,0x04,0x9e,0x52,0x00,0x04,0x9f,0x02,0x00,0x04,0x9f,0x98,0x00,0x04,0xa0,0x2e,0x00,0x04,0xa0,0xe4,0x00,0x04,0xa1,0x66,0x00,0x04,0xa1,0xea,0x00,0x04,0xa2,0xe4,0x00,0x04,0xa3,0xc0,0x00,0x04,0xa4,0xbe,0x00,0x04,0xa6,0x06,0x00,0x04,0xa7,0xe6,0x00,0x04,0xa8,0xd0,0x00,0x04,0xaa,0x1e,0x00,0x04,0xab,0x34,0x00,0x04,0xac,0xb0,\r\n0x00,0x04,0xad,0x90,0x00,0x04,0xae,0x9e,0x00,0x04,0xb1,0x10,0x00,0x04,0xb2,0x16,0x00,0x04,0xb3,0x1a,0x00,0x04,0xb4,0x7e,0x00,0x04,0xb5,0xc2,0x00,0x04,0xb6,0xd6,0x00,0x04,0xb8,0xb0,0x00,0x04,0xb9,0x70,0x00,0x04,0xbb,0x5c,0x00,0x04,0xbd,0x34,0x00,0x04,0xbf,0x22,0x00,0x04,0xc0,0x4c,0x00,0x04,0xc1,0xf0,0x00,0x04,0xc3,0x60,\r\n0x00,0x04,0xc4,0xa0,0x00,0x04,0xc5,0x9a,0x00,0x04,0xc6,0xf4,0x00,0x04,0xc7,0xcc,0x00,0x04,0xc9,0x6e,0x00,0x04,0xcb,0x30,0x00,0x04,0xcc,0x28,0x00,0x04,0xce,0x26,0x00,0x04,0xcf,0x78,0x00,0x04,0xd1,0x0a,0x00,0x04,0xd2,0x8c,0x00,0x04,0xd3,0xa4,0x00,0x04,0xd5,0x42,0x00,0x04,0xd6,0x64,0x00,0x04,0xd7,0xf0,0x00,0x04,0xd9,0x3c,\r\n0x00,0x04,0xda,0x58,0x00,0x04,0xdb,0xb2,0x00,0x04,0xdc,0xda,0x00,0x04,0xdd,0x7c,0x00,0x04,0xde,0x6a,0x00,0x04,0xdf,0x8c,0x00,0x04,0xe0,0xb2,0x00,0x04,0xe2,0x08,0x00,0x04,0xe3,0xbe,0x00,0x04,0xe4,0xbe,0x00,0x04,0xe6,0x0e,0x00,0x04,0xe7,0x6e,0x00,0x04,0xe9,0x48,0x00,0x04,0xe9,0xfc,0x00,0x04,0xeb,0x40,0x00,0x04,0xec,0xe8,\r\n0x00,0x04,0xee,0x6c,0x00,0x04,0xef,0xaa,0x00,0x04,0xf1,0x0c,0x00,0x04,0xf2,0x3a,0x00,0x04,0xf3,0x6a,0x00,0x04,0xf4,0xe6,0x00,0x04,0xf5,0xe2,0x00,0x04,0xf7,0x42,0x00,0x04,0xf8,0xc6,0x00,0x04,0xfa,0xc8,0x00,0x04,0xfc,0x22,0x00,0x04,0xfd,0x16,0x00,0x04,0xfe,0x04,0x00,0x04,0xff,0x1c,0x00,0x05,0x00,0x54,0x00,0x05,0x01,0x9c,\r\n0x00,0x05,0x03,0x02,0x00,0x05,0x04,0x58,0x00,0x05,0x05,0xf8,0x00,0x05,0x07,0x50,0x00,0x05,0x08,0x46,0x00,0x05,0x09,0xaa,0x00,0x05,0x0a,0xb2,0x00,0x05,0x0b,0x62,0x00,0x05,0x0c,0x98,0x00,0x05,0x0d,0x88,0x00,0x05,0x0f,0x2a,0x00,0x05,0x10,0x08,0x00,0x05,0x10,0xc4,0x00,0x05,0x11,0xa0,0x00,0x05,0x12,0x42,0x00,0x05,0x12,0xe8,\r\n0x00,0x05,0x13,0xee,0x00,0x05,0x14,0x5e,0x00,0x05,0x14,0xe0,0x00,0x05,0x16,0x2a,0x00,0x05,0x16,0xfe,0x00,0x05,0x17,0xb0,0x00,0x05,0x18,0x04,0x00,0x05,0x18,0xc0,0x00,0x05,0x1a,0x34,0x00,0x05,0x1a,0xca,0x00,0x05,0x1b,0xa8,0x00,0x05,0x1d,0x26,0x00,0x05,0x1d,0xb8,0x00,0x05,0x1e,0x9a,0x00,0x05,0x1f,0x2e,0x00,0x05,0x20,0x76,\r\n0x00,0x05,0x21,0x06,0x00,0x05,0x22,0x18,0x00,0x05,0x22,0xa6,0x00,0x05,0x23,0xae,0x00,0x05,0x24,0x5e,0x00,0x05,0x25,0xc4,0x00,0x05,0x26,0x6e,0x00,0x05,0x26,0xfe,0x00,0x05,0x27,0x96,0x00,0x05,0x28,0xf2,0x00,0x05,0x29,0x78,0x00,0x05,0x2a,0xd4,0x00,0x05,0x2b,0x7e,0x00,0x05,0x2c,0x88,0x00,0x05,0x2d,0xae,0x00,0x05,0x2e,0x98,\r\n0x00,0x05,0x2f,0xba,0x00,0x05,0x30,0x3a,0x00,0x05,0x30,0x94,0x00,0x05,0x30,0xd4,0x00,0x05,0x31,0x44,0x00,0x05,0x31,0x90,0x00,0x05,0x32,0xae,0x00,0x05,0x32,0xfe,0x00,0x05,0x33,0xee,0x00,0x05,0x34,0x92,0x00,0x05,0x35,0x6a,0x00,0x05,0x36,0x0e,0x00,0x05,0x36,0xb8,0x00,0x05,0x37,0x80,0x00,0x05,0x37,0xd0,0x00,0x05,0x38,0x6e,\r\n0x00,0x05,0x39,0x96,0x00,0x05,0x3a,0x5a,0x00,0x05,0x3a,0xe4,0x00,0x05,0x3b,0x1e,0x00,0x05,0x3b,0xf6,0x00,0x05,0x3d,0x38,0x00,0x05,0x3d,0xae,0x00,0x05,0x3e,0x82,0x00,0x05,0x3f,0xa2,0x00,0x05,0x40,0x3e,0x00,0x05,0x41,0x46,0x00,0x05,0x41,0xc8,0x00,0x05,0x42,0x08,0x00,0x05,0x42,0x88,0x00,0x05,0x43,0x7a,0x00,0x05,0x44,0x4e,\r\n0x00,0x05,0x45,0x3a,0x00,0x05,0x45,0xf6,0x00,0x05,0x47,0x36,0x00,0x05,0x47,0xda,0x00,0x05,0x48,0xba,0x00,0x05,0x49,0x40,0x00,0x05,0x4a,0x02,0x00,0x05,0x4a,0x92,0x00,0x05,0x4b,0xaa,0x00,0x05,0x4b,0xe4,0x00,0x05,0x4c,0xaa,0x00,0x05,0x4d,0x7a,0x00,0x05,0x4e,0x54,0x00,0x05,0x4f,0x90,0x00,0x05,0x50,0x14,0x00,0x05,0x50,0x96,\r\n0x00,0x05,0x50,0xf4,0x00,0x05,0x51,0xd8,0x00,0x05,0x52,0xde,0x00,0x05,0x53,0xca,0x00,0x05,0x54,0xbe,0x00,0x05,0x55,0xda,0x00,0x05,0x56,0xb6,0x00,0x05,0x57,0x24,0x00,0x05,0x57,0x34,0x00,0x05,0x57,0xac,0x00,0x05,0x58,0x04,0x00,0x05,0x58,0xa2,0x00,0x05,0x59,0x60,0x00,0x05,0x59,0xde,0x00,0x05,0x5a,0x80,0x00,0x05,0x5b,0x4c,\r\n0x00,0x05,0x5b,0xb6,0x00,0x05,0x5c,0xce,0x00,0x05,0x5d,0x96,0x00,0x05,0x5d,0xa6,0x00,0x05,0x5d,0xfe,0x00,0x05,0x5e,0x0e,0x00,0x05,0x5e,0x1e,0x00,0x05,0x5e,0x2e,0x00,0x05,0x5e,0x3e,0x00,0x05,0x5e,0x4e,0x00,0x05,0x5e,0x5e,0x00,0x05,0x5e,0x6e,0x00,0x05,0x5e,0x7e,0x00,0x05,0x5e,0xfa,0x00,0x05,0x5f,0x58,0x00,0x05,0x60,0x02,\r\n0x00,0x05,0x60,0xd0,0x00,0x05,0x61,0x4c,0x00,0x05,0x61,0xf6,0x00,0x05,0x62,0xc2,0x00,0x05,0x63,0x2e,0x00,0x05,0x64,0x46,0x00,0x05,0x65,0x10,0x00,0x05,0x65,0xe4,0x00,0x05,0x66,0x8e,0x00,0x05,0x67,0x82,0x00,0x05,0x68,0xcc,0x00,0x05,0x69,0x9e,0x00,0x05,0x6a,0x9e,0x00,0x05,0x6b,0xbc,0x00,0x05,0x6c,0xa0,0x00,0x05,0x6e,0x1c,\r\n0x00,0x05,0x6f,0x50,0x00,0x05,0x6f,0xb4,0x00,0x05,0x6f,0xd0,0x00,0x05,0x6f,0xec,0x00,0x05,0x70,0x08,0x00,0x05,0x70,0x26,0x00,0x05,0x70,0x42,0x00,0x05,0x71,0x0c,0x00,0x05,0x71,0x28,0x00,0x05,0x71,0x48,0x00,0x05,0x72,0x18,0x00,0x05,0x72,0x90,0x00,0x05,0x73,0x46,0x00,0x05,0x73,0xba,0x00,0x05,0x74,0x2a,0x00,0x05,0x74,0x96,\r\n0x00,0x05,0x74,0xec,0x00,0x05,0x75,0x82,0x00,0x05,0x75,0xd8,0x00,0x05,0x76,0x00,0x00,0x05,0x76,0x52,0x00,0x05,0x76,0xcc,0x00,0x05,0x77,0x02,0x00,0x05,0x77,0x94,0x00,0x05,0x78,0x02,0x00,0x05,0x78,0x88,0x00,0x05,0x78,0xfa,0x00,0x05,0x79,0x98,0x00,0x05,0x7a,0x36,0x00,0x05,0x7a,0xf6,0x00,0x05,0x7b,0x3a,0x00,0x05,0x7b,0x9c,\r\n0x00,0x05,0x7b,0xee,0x00,0x05,0x7c,0x80,0x00,0x05,0x7c,0xf0,0x00,0x05,0x7d,0x50,0x00,0x05,0x7d,0xa6,0x00,0x05,0x7e,0x4c,0x00,0x05,0x7f,0x26,0x00,0x05,0x7f,0x92,0x00,0x05,0x80,0x5c,0x00,0x05,0x80,0xda,0x00,0x05,0x81,0x74,0x00,0x05,0x82,0x50,0x00,0x05,0x82,0x74,0x00,0x05,0x82,0x98,0x00,0x05,0x82,0xbc,0x00,0x05,0x82,0xe0,\r\n0x00,0x05,0x83,0x04,0x00,0x05,0x83,0x28,0x00,0x05,0x83,0x40,0x00,0x05,0x83,0x62,0x00,0x05,0x83,0x86,0x00,0x05,0x83,0xa8,0x00,0x05,0x83,0xcc,0x00,0x05,0x83,0xee,0x00,0x05,0x84,0x10,0x00,0x05,0x84,0x32,0x00,0x05,0x84,0x58,0x00,0x05,0x84,0x7c,0x00,0x05,0x84,0xa0,0x00,0x05,0x84,0xc4,0x00,0x05,0x84,0xe8,0x00,0x05,0x85,0x0c,\r\n0x00,0x05,0x85,0x32,0x00,0x05,0x85,0x56,0x00,0x05,0x85,0x7a,0x00,0x05,0x85,0x9e,0x00,0x05,0x85,0xc4,0x00,0x05,0x85,0xe8,0x00,0x05,0x86,0x0c,0x00,0x05,0x86,0x30,0x00,0x05,0x86,0x48,0x00,0x05,0x86,0x6c,0x00,0x05,0x86,0x90,0x00,0x05,0x86,0xb4,0x00,0x05,0x86,0xd8,0x00,0x05,0x86,0xe8,0x00,0x05,0x87,0x0c,0x00,0x05,0x87,0x30,\r\n0x00,0x05,0x87,0x54,0x00,0x05,0x87,0x6c,0x00,0x05,0x87,0x8e,0x00,0x05,0x87,0xb2,0x00,0x05,0x87,0xca,0x00,0x05,0x87,0xee,0x00,0x05,0x88,0x12,0x00,0x05,0x88,0xa4,0x00,0x05,0x88,0xc6,0x00,0x05,0x88,0xe8,0x00,0x05,0x89,0x0a,0x00,0x05,0x89,0x20,0x00,0x05,0x89,0x42,0x00,0x05,0x89,0x5a,0x00,0x05,0x89,0x7c,0x00,0x05,0x89,0x94,\r\n0x00,0x05,0x89,0xb6,0x00,0x05,0x89,0xcc,0x00,0x05,0x89,0xe4,0x00,0x05,0x89,0xfc,0x00,0x05,0x8a,0x20,0x00,0x05,0x8a,0x38,0x00,0x05,0x8a,0x5c,0x00,0x05,0x8b,0x04,0x00,0x05,0x8b,0x28,0x00,0x05,0x8b,0x4c,0x00,0x05,0x8b,0x72,0x00,0x05,0x8b,0x96,0x00,0x05,0x8b,0xae,0x00,0x05,0x8b,0xd2,0x00,0x05,0x8b,0xf6,0x00,0x05,0x8c,0x18,\r\n0x00,0x05,0x8c,0x30,0x00,0x05,0x8c,0x52,0x00,0x05,0x8c,0x6a,0x00,0x05,0x8c,0x80,0x00,0x05,0x8c,0xa2,0x00,0x05,0x8d,0x1c,0x00,0x05,0x8d,0x40,0x00,0x05,0x8d,0x64,0x00,0x05,0x8d,0x88,0x00,0x05,0x8d,0xae,0x00,0x05,0x8d,0xd4,0x00,0x05,0x8d,0xec,0x00,0x05,0x8e,0x10,0x00,0x05,0x8e,0x34,0x00,0x05,0x8e,0x58,0x00,0x05,0x8e,0x7e,\r\n0x00,0x05,0x8e,0xa0,0x00,0x05,0x8e,0xc4,0x00,0x05,0x8e,0xe6,0x00,0x05,0x8f,0x0a,0x00,0x05,0x8f,0x2e,0x00,0x05,0x8f,0x52,0x00,0x05,0x8f,0x9e,0x00,0x05,0x8f,0xc2,0x00,0x05,0x8f,0xe6,0x00,0x05,0x8f,0xf6,0x00,0x05,0x90,0x06,0x00,0x05,0x90,0x40,0x00,0x05,0x90,0xa6,0x00,0x05,0x90,0xb6,0x00,0x05,0x90,0xc6,0x00,0x05,0x90,0xd6,\r\n0x00,0x05,0x91,0x7c,0x00,0x05,0x91,0x8c,0x00,0x05,0x91,0x9c,0x00,0x05,0x91,0xfa,0x00,0x05,0x92,0x0a,0x00,0x05,0x92,0x1a,0x00,0x05,0x92,0x82,0x00,0x05,0x92,0x92,0x00,0x05,0x92,0xd2,0x00,0x05,0x92,0xe2,0x00,0x05,0x93,0x4e,0x00,0x05,0x93,0x5e,0x00,0x05,0x93,0x6e,0x00,0x05,0x94,0x4e,0x00,0x05,0x94,0x5e,0x00,0x05,0x94,0xe8,\r\n0x00,0x05,0x95,0x8e,0x00,0x05,0x95,0xb2,0x00,0x05,0x95,0xd6,0x00,0x05,0x95,0xfa,0x00,0x05,0x96,0x1c,0x00,0x05,0x96,0x40,0x00,0x05,0x96,0x64,0x00,0x05,0x96,0x88,0x00,0x05,0x96,0xae,0x00,0x05,0x96,0xd2,0x00,0x05,0x96,0xf6,0x00,0x05,0x97,0x8c,0x00,0x05,0x97,0xb0,0x00,0x05,0x98,0x36,0x00,0x05,0x98,0x46,0x00,0x05,0x98,0x56,\r\n0x00,0x05,0x98,0x7c,0x00,0x05,0x98,0x8c,0x00,0x05,0x99,0x5c,0x00,0x05,0x9a,0x0a,0x00,0x05,0x9a,0x7e,0x00,0x05,0x9a,0xa2,0x00,0x05,0x9a,0xc6,0x00,0x05,0x9b,0x24,0x00,0x05,0x9b,0x34,0x00,0x05,0x9b,0xba,0x00,0x05,0x9b,0xca,0x00,0x05,0x9b,0xda,0x00,0x05,0x9c,0x78,0x00,0x05,0x9c,0x88,0x00,0x05,0x9d,0x0c,0x00,0x05,0x9d,0xc6,\r\n0x00,0x05,0x9e,0x38,0x00,0x05,0x9e,0x5c,0x00,0x05,0x9e,0x6c,0x00,0x05,0x9e,0xf0,0x00,0x05,0x9f,0x00,0x00,0x05,0x9f,0x10,0x00,0x05,0x9f,0x20,0x00,0x05,0x9f,0x30,0x00,0x05,0x9f,0x40,0x00,0x05,0x9f,0x50,0x00,0x05,0x9f,0x60,0x00,0x05,0x9f,0xdc,0x00,0x05,0x9f,0xec,0x00,0x05,0x9f,0xfc,0x00,0x05,0xa0,0x56,0x00,0x05,0xa0,0xc8,\r\n0x00,0x05,0xa1,0x26,0x00,0x05,0xa1,0x9a,0x00,0x05,0xa2,0x20,0x00,0x05,0xa2,0xae,0x00,0x05,0xa3,0x20,0x00,0x05,0xa3,0xa6,0x00,0x05,0xa4,0x66,0x00,0x05,0xa5,0x1a,0x00,0x05,0xa5,0x5e,0x00,0x05,0xa5,0xee,0x00,0x05,0xa6,0x78,0x00,0x05,0xa7,0x4c,0x00,0x05,0xa8,0x3e,0x00,0x05,0xa9,0x24,0x00,0x05,0xaa,0xb0,0x00,0x05,0xaa,0xd4,\r\n0x00,0x05,0xaa,0xf8,0x00,0x05,0xab,0x0e,0x00,0x05,0xab,0x1e,0x00,0x05,0xab,0x2e,0x00,0x05,0xab,0x4e,0x00,0x05,0xab,0x5e,0x00,0x05,0xab,0x6e,0x00,0x05,0xab,0x8e,0x00,0x05,0xab,0x9e,0x00,0x05,0xab,0xae,0x00,0x05,0xab,0xcc,0x00,0x05,0xab,0xdc,0x00,0x05,0xab,0xec,0x00,0x05,0xac,0x0a,0x00,0x05,0xac,0x1a,0x00,0x05,0xac,0x2a,\r\n0x00,0x05,0xac,0x48,0x00,0x05,0xac,0x58,0x00,0x05,0xac,0x68,0x00,0x05,0xac,0x78,0x00,0x05,0xac,0x88,0x00,0x05,0xac,0x98,0x00,0x05,0xac,0xb8,0x00,0x05,0xac,0xd6,0x00,0x05,0xac,0xe6,0x00,0x05,0xac,0xf6,0x00,0x05,0xad,0x14,0x00,0x05,0xad,0x32,0x00,0x05,0xad,0x42,0x00,0x05,0xad,0x52,0x00,0x05,0xad,0x62,0x00,0x05,0xad,0x84,\r\n0x00,0x05,0xad,0x94,0x00,0x05,0xad,0xb4,0x00,0x05,0xad,0xc4,0x00,0x05,0xad,0xe2,0x00,0x05,0xad,0xf2,0x00,0x05,0xae,0x02,0x00,0x05,0xae,0x12,0x00,0x05,0xae,0x30,0x00,0x05,0xae,0x4e,0x00,0x05,0xae,0x6e,0x00,0x05,0xae,0x7e,0x00,0x05,0xae,0x8e,0x00,0x05,0xae,0xa6,0x00,0x05,0xae,0xbe,0x00,0x05,0xae,0xce,0x00,0x05,0xae,0xde,\r\n0x00,0x05,0xae,0xf6,0x00,0x05,0xaf,0x0e,0x00,0x05,0xaf,0x9c,0x00,0x05,0xb0,0xde,0x00,0x05,0xb2,0x14,0x00,0x05,0xb2,0x84,0x00,0x05,0xb2,0xe0,0x00,0x05,0xb3,0x7c,0x00,0x05,0xb4,0x44,0x00,0x05,0xb4,0xf6,0x00,0x05,0xb5,0xa2,0x00,0x05,0xb6,0x02,0x00,0x05,0xb6,0x5c,0x00,0x05,0xb6,0xbc,0x00,0x05,0xb7,0x64,0x00,0x05,0xb7,0x92,\r\n0x00,0x05,0xb7,0xc2,0x00,0x05,0xb7,0xf0,0x00,0x05,0xb8,0x20,0x00,0x05,0xb8,0x38,0x00,0x05,0xb8,0x6a,0x00,0x05,0xb8,0x82,0x00,0x05,0xb8,0x9a,0x00,0x05,0xb8,0xb2,0x00,0x05,0xb8,0xca,0x00,0x05,0xb8,0xe2,0x00,0x05,0xb8,0xf8,0x00,0x05,0xb9,0x28,0x00,0x05,0xb9,0x3e,0x00,0x05,0xb9,0x54,0x00,0x05,0xb9,0x64,0x00,0x05,0xb9,0xc2,\r\n0x00,0x05,0xba,0x16,0x00,0x05,0xba,0x2c,0x00,0x05,0xba,0x42,0x00,0x05,0xbb,0x5c,0x00,0x05,0xbc,0x64,0x00,0x05,0xbd,0x4c,0x00,0x05,0xbe,0x84,0x00,0x05,0xbf,0x26,0x00,0x05,0xbf,0xe0,0x00,0x05,0xc0,0x0c,0x00,0x05,0xc0,0xc2,0x00,0x05,0xc1,0x3a,0x00,0x05,0xc1,0x60,0x00,0x05,0xc2,0x26,0x00,0x05,0xc2,0x4c,0x00,0x05,0xc2,0x64,\r\n0x00,0x05,0xc2,0x7c,0x00,0x05,0xc2,0x94,0x00,0x05,0xc2,0xac,0x00,0x05,0xc2,0xc4,0x00,0x05,0xc2,0xe8,0x00,0x05,0xc3,0x0c,0x00,0x05,0xc3,0x24,0x00,0x05,0xc3,0x3c,0x00,0x05,0xc3,0x54,0x00,0x05,0xc3,0x6c,0x00,0x05,0xc3,0x84,0x00,0x05,0xc3,0x9c,0x00,0x05,0xc3,0xb4,0x00,0x05,0xc4,0x88,0x00,0x05,0xc4,0xa0,0x00,0x05,0xc5,0x36,\r\n0x00,0x05,0xc5,0x4e,0x00,0x05,0xc6,0xbe,0x00,0x05,0xc7,0xf2,0x00,0x05,0xc8,0x0a,0x00,0x05,0xc8,0x22,0x00,0x05,0xc9,0xa0,0x00,0x05,0xca,0xec,0x00,0x05,0xcb,0x04,0x00,0x05,0xcb,0x1c,0x00,0x05,0xcc,0x1c,0x00,0x05,0xcd,0x00,0x00,0x05,0xce,0x08,0x00,0x05,0xce,0x20,0x00,0x05,0xce,0x38,0x00,0x05,0xce,0x50,0x00,0x05,0xce,0x68,\r\n0x00,0x05,0xce,0x80,0x00,0x05,0xce,0x98,0x00,0x05,0xce,0xb0,0x00,0x05,0xce,0xc8,0x00,0x05,0xce,0xe0,0x00,0x05,0xce,0xf8,0x00,0x05,0xcf,0x10,0x00,0x05,0xcf,0x28,0x00,0x05,0xcf,0x4c,0x00,0x05,0xcf,0x6c,0x00,0x05,0xcf,0x8c,0x00,0x05,0xcf,0xa4,0x00,0x05,0xcf,0xbc,0x00,0x05,0xcf,0xdc,0x00,0x05,0xcf,0xfc,0x00,0x05,0xd0,0x14,\r\n0x00,0x05,0xd0,0x2c,0x00,0x05,0xd0,0x4c,0x00,0x05,0xd0,0x6c,0x00,0x05,0xd0,0x84,0x00,0x05,0xd0,0x9c,0x00,0x05,0xd1,0xe0,0x00,0x05,0xd2,0x8e,0x00,0x05,0xd3,0x98,0x00,0x05,0xd4,0x7c,0x00,0x05,0xd4,0x94,0x00,0x05,0xd4,0xac,0x00,0x05,0xd5,0xf4,0x00,0x05,0xd7,0x38,0x00,0x05,0xd8,0x62,0x00,0x05,0xd9,0x5a,0x00,0x05,0xd9,0x6a,\r\n0x00,0x05,0xd9,0x7a,0x00,0x05,0xd9,0x92,0x00,0x05,0xda,0x94,0x00,0x05,0xdb,0xa4,0x00,0x05,0xdd,0x8c,0x00,0x05,0xde,0x7e,0x00,0x05,0xdf,0xc0,0x00,0x05,0xe0,0x5a,0x00,0x05,0xe1,0x94,0x00,0x05,0xe2,0x3e,0x00,0x05,0xe3,0x32,0x00,0x05,0xe3,0xd8,0x00,0x05,0xe4,0x68,0x00,0x05,0xe4,0x78,0x00,0x05,0xe5,0x3a,0x00,0x05,0xe5,0x9e,\r\n0x00,0x05,0xe6,0xb8,0x00,0x05,0xe6,0xc8,0x00,0x05,0xe6,0xd8,0x00,0x05,0xe6,0xea,0x00,0x05,0xe7,0x0e,0x00,0x05,0xe7,0x3e,0x00,0x05,0xe7,0x62,0x00,0x05,0xe7,0x8e,0x00,0x05,0xe7,0xa6,0x00,0x05,0xe7,0xbe,0x00,0x05,0xe7,0xd6,0x00,0x05,0xe7,0xee,0x00,0x05,0xe8,0x06,0x00,0x05,0xe8,0x1e,0x00,0x05,0xe8,0x3e,0x00,0x05,0xe8,0x5e,\r\n0x00,0x05,0xe8,0x76,0x00,0x05,0xe8,0x8e,0x00,0x05,0xe8,0xa6,0x00,0x05,0xe8,0xbe,0x00,0x05,0xe8,0xd6,0x00,0x05,0xe8,0xee,0x00,0x05,0xe9,0x06,0x00,0x05,0xe9,0x1e,0x00,0x05,0xe9,0x42,0x00,0x05,0xe9,0x5a,0x00,0x05,0xe9,0x72,0x00,0x05,0xe9,0x8a,0x00,0x05,0xe9,0xa2,0x00,0x05,0xe9,0xba,0x00,0x05,0xe9,0xd2,0x00,0x05,0xe9,0xea,\r\n0x00,0x05,0xea,0x02,0x00,0x05,0xea,0x1a,0x00,0x05,0xea,0x3a,0x00,0x05,0xea,0x52,0x00,0x05,0xea,0x6a,0x00,0x05,0xea,0x82,0x00,0x05,0xea,0x9a,0x00,0x05,0xea,0xb2,0x00,0x05,0xea,0xd2,0x00,0x05,0xea,0xf2,0x00,0x05,0xeb,0x0a,0x00,0x05,0xeb,0x22,0x00,0x05,0xeb,0x42,0x00,0x05,0xeb,0x62,0x00,0x05,0xeb,0x7a,0x00,0x05,0xeb,0x92,\r\n0x00,0x05,0xeb,0xaa,0x00,0x05,0xeb,0xc2,0x00,0x05,0xeb,0xda,0x00,0x05,0xeb,0xf2,0x00,0x05,0xec,0x0a,0x00,0x05,0xed,0x52,0x00,0x05,0xed,0x6a,0x00,0x05,0xed,0x8a,0x00,0x05,0xed,0xa2,0x00,0x05,0xed,0xba,0x00,0x05,0xed,0xd2,0x00,0x05,0xed,0xea,0x00,0x05,0xee,0x02,0x00,0x05,0xee,0x1a,0x00,0x05,0xee,0x32,0x00,0x05,0xee,0x4a,\r\n0x00,0x05,0xee,0x62,0x00,0x05,0xef,0x6a,0x00,0x05,0xef,0x7a,0x00,0x05,0xf0,0x94,0x00,0x05,0xf1,0xca,0x00,0x05,0xf1,0xe2,0x00,0x05,0xf1,0xfa,0x00,0x05,0xf2,0x12,0x00,0x05,0xf2,0x2a,0x00,0x05,0xf2,0x42,0x00,0x05,0xf2,0x5a,0x00,0x05,0xf2,0x72,0x00,0x05,0xf2,0x8a,0x00,0x05,0xf2,0xa2,0x00,0x05,0xf2,0xb8,0x00,0x05,0xf2,0xd8,\r\n0x00,0x05,0xf2,0xf6,0x00,0x05,0xf3,0x24,0x00,0x05,0xf3,0x50,0x00,0x05,0xf3,0x70,0x00,0x05,0xf3,0x8e,0x00,0x05,0xf3,0xae,0x00,0x05,0xf3,0xcc,0x00,0x05,0xf4,0x02,0x00,0x05,0xf4,0x36,0x00,0x05,0xf4,0x4e,0x00,0x05,0xf4,0x66,0x00,0x05,0xf4,0x8e,0x00,0x05,0xf5,0x9a,0x00,0x05,0xf6,0xa4,0x00,0x05,0xf6,0xc4,0x00,0x05,0xf7,0x8c,\r\n0x00,0x05,0xf7,0xa4,0x00,0x05,0xf7,0xbc,0x00,0x05,0xf7,0xd4,0x00,0x05,0xf9,0x26,0x00,0x05,0xf9,0x46,0x00,0x05,0xf9,0x5e,0x00,0x05,0xf9,0x76,0x00,0x05,0xf9,0x86,0x00,0x05,0xf9,0x96,0x00,0x05,0xf9,0xb6,0x00,0x05,0xf9,0xce,0x00,0x05,0xf9,0xe6,0x00,0x05,0xf9,0xfc,0x00,0x05,0xfb,0x1e,0x00,0x05,0xfb,0x42,0x00,0x05,0xfb,0x68,\r\n0x00,0x05,0xfb,0x80,0x00,0x05,0xfb,0xa4,0x00,0x05,0xfb,0xbc,0x00,0x05,0xfb,0xd4,0x00,0x05,0xfb,0xec,0x00,0x05,0xfc,0x0c,0x00,0x05,0xfc,0x24,0x00,0x05,0xfc,0x3c,0x00,0x05,0xfc,0x54,0x00,0x05,0xfc,0x6c,0x00,0x05,0xfc,0x84,0x00,0x05,0xfc,0xde,0x00,0x05,0xfc,0xfe,0x00,0x05,0xfd,0x1e,0x00,0x05,0xfd,0x3e,0x00,0x05,0xfd,0x5e,\r\n0x00,0x05,0xfd,0x76,0x00,0x05,0xfd,0x96,0x00,0x05,0xfd,0xb6,0x00,0x05,0xfd,0xd6,0x00,0x05,0xfd,0xee,0x00,0x05,0xfe,0x06,0x00,0x05,0xfe,0x26,0x00,0x05,0xfe,0x46,0x00,0x05,0xfe,0x66,0x00,0x05,0xfe,0x86,0x00,0x05,0xfe,0xaa,0x00,0x05,0xfe,0xce,0x00,0x05,0xfe,0xe6,0x00,0x05,0xfe,0xfe,0x00,0x05,0xff,0x16,0x00,0x05,0xff,0x2e,\r\n0x00,0x05,0xff,0x4e,0x00,0x05,0xff,0x72,0x00,0x05,0xff,0x8a,0x00,0x05,0xff,0xa2,0x00,0x05,0xff,0xba,0x00,0x05,0xff,0xd2,0x00,0x05,0xff,0xea,0x00,0x06,0x00,0x02,0x00,0x06,0x00,0x1a,0x00,0x06,0x00,0x32,0x00,0x06,0x00,0x4a,0x00,0x06,0x00,0x62,0x00,0x06,0x00,0x7a,0x00,0x06,0x00,0x92,0x00,0x06,0x01,0xbe,0x00,0x06,0x01,0xde,\r\n0x00,0x06,0x01,0xfe,0x00,0x06,0x02,0x2a,0x00,0x06,0x02,0x56,0x00,0x06,0x02,0x8c,0x00,0x06,0x02,0xa4,0x00,0x06,0x02,0xbc,0x00,0x06,0x04,0x04,0x00,0x06,0x05,0x88,0x00,0x06,0x05,0xa0,0x00,0x06,0x05,0xb8,0x00,0x06,0x07,0x4a,0x00,0x06,0x09,0x18,0x00,0x06,0x0a,0x9e,0x00,0x06,0x0c,0x5c,0x00,0x06,0x0c,0x8a,0x00,0x06,0x0c,0xb8,\r\n0x00,0x06,0x0c,0xe6,0x00,0x06,0x0d,0x14,0x00,0x06,0x0d,0x42,0x00,0x06,0x0d,0x70,0x00,0x06,0x0d,0x88,0x00,0x06,0x0d,0xa0,0x00,0x06,0x0d,0xb8,0x00,0x06,0x0d,0xd0,0x00,0x06,0x0d,0xe8,0x00,0x06,0x0e,0x00,0x00,0x06,0x0e,0x18,0x00,0x06,0x0e,0x30,0x00,0x06,0x0e,0x54,0x00,0x06,0x0e,0x7c,0x00,0x06,0x0e,0xa8,0x00,0x06,0x0e,0xd4,\r\n0x00,0x06,0x0e,0xf8,0x00,0x06,0x0f,0x20,0x00,0x06,0x0f,0x4c,0x00,0x06,0x0f,0x78,0x00,0x06,0x0f,0x9e,0x00,0x06,0x0f,0xc2,0x00,0x06,0x0f,0xe6,0x00,0x06,0x10,0x0a,0x00,0x06,0x10,0x24,0x00,0x06,0x10,0x3e,0x00,0x06,0x10,0x58,0x00,0x06,0x10,0x72,0x00,0x06,0x10,0x9a,0x00,0x06,0x10,0xbe,0x00,0x06,0x10,0xe6,0x00,0x06,0x11,0x0a,\r\n0x00,0x06,0x12,0x42,0x00,0x06,0x13,0xbc,0x00,0x06,0x13,0xe0,0x00,0x06,0x14,0x04,0x00,0x06,0x14,0x28,0x00,0x06,0x14,0x4c,0x00,0x06,0x14,0x70,0x00,0x06,0x14,0x94,0x00,0x06,0x14,0xac,0x00,0x06,0x14,0xc4,0x00,0x06,0x14,0xdc,0x00,0x06,0x14,0xf4,0x00,0x06,0x15,0x0c,0x00,0x06,0x15,0x24,0x00,0x06,0x15,0x3c,0x00,0x06,0x15,0x54,\r\n0x00,0x06,0x15,0x86,0x00,0x06,0x15,0xd2,0x00,0x06,0x16,0x1a,0x00,0x06,0x16,0x8a,0x00,0x06,0x16,0xf2,0x00,0x06,0x17,0x56,0x00,0x06,0x17,0xd0,0x00,0x06,0x18,0x8c,0x00,0x06,0x19,0x34,0x00,0x06,0x19,0x60,0x00,0x06,0x19,0xd0,0x00,0x06,0x1a,0x48,0x00,0x06,0x1a,0x74,0x00,0x06,0x1a,0xbc,0x00,0x06,0x1b,0x08,0x00,0x06,0x1b,0xde,\r\n0x00,0x06,0x1c,0x78,0x00,0x06,0x1d,0x76,0x00,0x06,0x1d,0x98,0x00,0x06,0x1d,0xae,0x00,0x06,0x1d,0xc4,0x00,0x06,0x1d,0xee,0x00,0x06,0x1e,0x04,0x00,0x06,0x1e,0x28,0x00,0x06,0x1e,0x3e,0x00,0x06,0x1e,0x56,0x00,0x06,0x1e,0x7a,0x00,0x06,0x1e,0x9e,0x00,0x06,0x1f,0x82,0x00,0x06,0x20,0x96,0x00,0x06,0x20,0xae,0x00,0x06,0x20,0xc6,\r\n0x00,0x06,0x20,0xe6,0x00,0x06,0x21,0x06,0x00,0x06,0x21,0x1e,0x00,0x06,0x21,0x36,0x00,0x06,0x21,0x56,0x00,0x06,0x21,0x76,0x00,0x06,0x21,0x96,0x00,0x06,0x21,0xb6,0x00,0x06,0x21,0xce,0x00,0x06,0x21,0xe6,0x00,0x06,0x21,0xfe,0x00,0x06,0x22,0x16,0x00,0x06,0x22,0x44,0x00,0x06,0x22,0x72,0x00,0x06,0x22,0x96,0x00,0x06,0x22,0xba,\r\n0x00,0x06,0x22,0xd2,0x00,0x06,0x22,0xea,0x00,0x06,0x23,0xec,0x00,0x06,0x25,0x12,0x00,0x06,0x25,0x2a,0x00,0x06,0x25,0x42,0x00,0x06,0x25,0x5a,0x00,0x06,0x25,0x72,0x00,0x06,0x25,0x8a,0x00,0x06,0x25,0xa2,0x00,0x06,0x25,0xc2,0x00,0x06,0x25,0xe2,0x00,0x06,0x26,0x42,0x00,0x06,0x26,0xc8,0x00,0x06,0x26,0xde,0x00,0x06,0x26,0xf4,\r\n0x00,0x06,0x27,0x0c,0x00,0x06,0x27,0x24,0x00,0x06,0x27,0x4c,0x00,0x06,0x27,0x74,0x00,0x06,0x27,0x8c,0x00,0x06,0x27,0xa4,0x00,0x06,0x27,0xbc,0x00,0x06,0x27,0xd4,0x00,0x06,0x28,0x68,0x00,0x06,0x28,0x80,0x00,0x06,0x28,0x98,0x00,0x06,0x28,0xb0,0x00,0x06,0x28,0xc8,0x00,0x06,0x28,0xe0,0x00,0x06,0x29,0x04,0x00,0x06,0x29,0x24,\r\n0x00,0x06,0x29,0x3c,0x00,0x06,0x29,0x54,0x00,0x06,0x29,0x6c,0x00,0x06,0x29,0x84,0x00,0x06,0x29,0x9c,0x00,0x06,0x29,0xb4,0x00,0x06,0x29,0xe2,0x00,0x06,0x2a,0x06,0x00,0x06,0x2a,0x2a,0x00,0x06,0x2a,0x42,0x00,0x06,0x2a,0x5a,0x00,0x06,0x2b,0x30,0x00,0x06,0x2b,0x48,0x00,0x06,0x2b,0x60,0x00,0x06,0x2c,0x54,0x00,0x06,0x2c,0x6c,\r\n0x00,0x06,0x2c,0x84,0x00,0x06,0x2c,0xac,0x00,0x06,0x2c,0xd4,0x00,0x06,0x2c,0xf8,0x00,0x06,0x2d,0xc4,0x00,0x06,0x2e,0x52,0x00,0x06,0x2e,0xe0,0x00,0x06,0x2e,0xf8,0x00,0x06,0x2f,0x10,0x00,0x06,0x2f,0x34,0x00,0x06,0x2f,0x58,0x00,0x06,0x2f,0x7c,0x00,0x06,0x2f,0xa0,0x00,0x06,0x2f,0xb0,0x00,0x06,0x2f,0xc8,0x00,0x06,0x2f,0xe0,\r\n0x00,0x06,0x30,0x2c,0x00,0x06,0x30,0xa6,0x00,0x06,0x31,0x7a,0x00,0x06,0x31,0x92,0x00,0x06,0x32,0x5e,0x00,0x06,0x33,0xde,0x00,0x06,0x34,0xa2,0x00,0x06,0x35,0xf2,0x00,0x06,0x37,0x50,0x00,0x06,0x38,0x28,0x00,0x06,0x39,0x6a,0x00,0x06,0x39,0xde,0x00,0x06,0x3a,0x5a,0x00,0x06,0x3a,0xe2,0x00,0x06,0x3b,0x60,0x00,0x06,0x3b,0xd8,\r\n0x00,0x06,0x3c,0x58,0x00,0x06,0x3c,0xc0,0x00,0x06,0x3d,0x30,0x00,0x06,0x3d,0x9e,0x00,0x06,0x3e,0x18,0x00,0x06,0x3e,0xae,0x00,0x06,0x3f,0x26,0x00,0x06,0x3f,0xec,0x00,0x06,0x40,0x96,0x00,0x06,0x41,0x80,0x00,0x06,0x42,0x66,0x00,0x06,0x43,0x28,0x00,0x06,0x44,0x24,0x00,0x06,0x44,0xf2,0x00,0x06,0x45,0x76,0x00,0x06,0x46,0x2e,\r\n0x00,0x06,0x46,0xb2,0x00,0x06,0x47,0x5a,0x00,0x06,0x48,0x2a,0x00,0x06,0x48,0xd6,0x00,0x06,0x49,0xc6,0x00,0x06,0x4a,0xc0,0x00,0x06,0x4b,0xa6,0x00,0x06,0x4c,0x7a,0x00,0x06,0x4d,0xa0,0x00,0x06,0x4e,0xb8,0x00,0x06,0x4f,0x2e,0x00,0x06,0x4f,0xc4,0x00,0x06,0x50,0x7a,0x00,0x06,0x51,0x64,0x00,0x06,0x52,0x40,0x00,0x06,0x52,0xde,\r\n0x00,0x06,0x53,0xc8,0x00,0x06,0x54,0x5a,0x00,0x06,0x54,0xe8,0x00,0x06,0x55,0xa4,0x00,0x06,0x56,0x1e,0x00,0x06,0x56,0xc2,0x00,0x06,0x57,0x8e,0x00,0x06,0x58,0x6a,0x00,0x06,0x59,0x28,0x00,0x06,0x59,0xda,0x00,0x06,0x5a,0xe6,0x00,0x06,0x5b,0xbe,0x00,0x06,0x5c,0x3e,0x00,0x06,0x5c,0xf6,0x00,0x06,0x5d,0x74,0x00,0x06,0x5e,0x1c,\r\n0x00,0x06,0x5e,0xce,0x00,0x06,0x5f,0xb8,0x00,0x06,0x60,0x86,0x00,0x06,0x61,0xae,0x00,0x06,0x62,0x92,0x00,0x06,0x63,0x7e,0x00,0x06,0x63,0xb4,0x00,0x06,0x64,0x46,0x00,0x06,0x64,0xc2,0x00,0x06,0x65,0xa8,0x00,0x06,0x66,0xae,0x00,0x06,0x67,0x64,0x00,0x06,0x68,0x2c,0x00,0x06,0x69,0x40,0x00,0x06,0x6a,0x72,0x00,0x06,0x6b,0x30,\r\n0x00,0x06,0x6c,0x6a,0x00,0x06,0x6d,0xd4,0x00,0x06,0x6e,0x64,0x00,0x06,0x6f,0x08,0x00,0x06,0x6f,0xd2,0x00,0x06,0x70,0x9c,0x00,0x06,0x71,0xa0,0x00,0x06,0x72,0xde,0x00,0x06,0x73,0x72,0x00,0x06,0x74,0x4c,0x00,0x06,0x74,0xfa,0x00,0x06,0x75,0x8e,0x00,0x06,0x76,0x1e,0x00,0x06,0x76,0xbc,0x00,0x06,0x77,0x76,0x00,0x06,0x78,0x9c,\r\n0x00,0x06,0x79,0xc0,0x00,0x06,0x7b,0x2a,0x00,0x06,0x7c,0x0c,0x00,0x06,0x7c,0xc2,0x00,0x06,0x7d,0xb2,0x00,0x06,0x7e,0xb4,0x00,0x06,0x7f,0x2e,0x00,0x06,0x7f,0xd4,0x00,0x06,0x80,0x7c,0x00,0x06,0x81,0x5a,0x00,0x06,0x82,0x82,0x00,0x06,0x83,0xce,0x00,0x06,0x84,0xf2,0x00,0x06,0x85,0xd2,0x00,0x06,0x86,0xc0,0x00,0x06,0x88,0x22,\r\n0x00,0x06,0x88,0x9e,0x00,0x06,0x89,0x9e,0x00,0x06,0x8a,0xdc,0x00,0x06,0x8b,0xf4,0x00,0x06,0x8d,0x42,0x00,0x06,0x8e,0xea,0x00,0x06,0x8f,0xe6,0x00,0x06,0x91,0x2a,0x00,0x06,0x92,0x82,0x00,0x06,0x93,0xc2,0x00,0x06,0x94,0x4c,0x00,0x06,0x95,0x4e,0x00,0x06,0x96,0x3c,0x00,0x06,0x97,0xc8,0x00,0x06,0x99,0x3c,0x00,0x06,0x9b,0x16,\r\n0x00,0x06,0x9c,0xdc,0x00,0x06,0x9e,0x20,0x00,0x06,0xa0,0x10,0x00,0x06,0xa1,0x2e,0x00,0x06,0xa1,0xa8,0x00,0x06,0xa2,0x44,0x00,0x06,0xa2,0xee,0x00,0x06,0xa3,0xe6,0x00,0x06,0xa4,0x90,0x00,0x06,0xa5,0x24,0x00,0x06,0xa5,0xec,0x00,0x06,0xa6,0xb8,0x00,0x06,0xa7,0x38,0x00,0x06,0xa7,0xec,0x00,0x06,0xa8,0x66,0x00,0x06,0xa8,0xf2,\r\n0x00,0x06,0xa9,0x54,0x00,0x06,0xaa,0x04,0x00,0x06,0xaa,0xb0,0x00,0x06,0xab,0xa2,0x00,0x06,0xac,0xba,0x00,0x06,0xad,0x8e,0x00,0x06,0xae,0x4a,0x00,0x06,0xaf,0x66,0x00,0x06,0xaf,0xe4,0x00,0x06,0xb0,0x40,0x00,0x06,0xb0,0xd8,0x00,0x06,0xb1,0x46,0x00,0x06,0xb1,0xac,0x00,0x06,0xb2,0x40,0x00,0x06,0xb2,0xd6,0x00,0x06,0xb3,0x2a,\r\n0x00,0x06,0xb4,0x1e,0x00,0x06,0xb5,0x10,0x00,0x06,0xb5,0x92,0x00,0x06,0xb6,0x6e,0x00,0x06,0xb7,0xdc,0x00,0x06,0xb8,0xc8,0x00,0x06,0xb9,0xe6,0x00,0x06,0xbb,0x7e,0x00,0x06,0xbc,0x9e,0x00,0x06,0xbd,0xca,0x00,0x06,0xbe,0xf6,0x00,0x06,0xc0,0x34,0x00,0x06,0xc0,0xb8,0x00,0x06,0xc1,0x84,0x00,0x06,0xc2,0x8a,0x00,0x06,0xc3,0xbe,\r\n0x00,0x06,0xc4,0x62,0x00,0x06,0xc5,0x48,0x00,0x06,0xc6,0x4a,0x00,0x06,0xc7,0x48,0x00,0x06,0xc8,0x20,0x00,0x06,0xc9,0x02,0x00,0x06,0xc9,0x7c,0x00,0x06,0xc9,0xec,0x00,0x06,0xca,0xb6,0x00,0x06,0xcb,0x68,0x00,0x06,0xcc,0x1e,0x00,0x06,0xcd,0x0a,0x00,0x06,0xcd,0xf0,0x00,0x06,0xce,0xe0,0x00,0x06,0xcf,0x48,0x00,0x06,0xd0,0x06,\r\n0x00,0x06,0xd0,0xbc,0x00,0x06,0xd1,0xc8,0x00,0x06,0xd1,0xf2,0x00,0x06,0xd3,0x3c,0x00,0x06,0xd4,0x46,0x00,0x06,0xd4,0xea,0x00,0x06,0xd5,0x96,0x00,0x06,0xd6,0x70,0x00,0x06,0xd7,0x4a,0x00,0x06,0xd8,0x6a,0x00,0x06,0xd9,0xb0,0x00,0x06,0xda,0x42,0x00,0x06,0xda,0xec,0x00,0x06,0xdb,0xc6,0x00,0x06,0xdc,0xaa,0x00,0x06,0xdd,0x6e,\r\n0x00,0x06,0xde,0x6e,0x00,0x06,0xdf,0x10,0x00,0x06,0xdf,0xa8,0x00,0x06,0xe0,0x40,0x00,0x06,0xe0,0xb6,0x00,0x06,0xe0,0xc6,0x00,0x06,0xe0,0xec,0x00,0x06,0xe1,0x1a,0x00,0x06,0xe1,0x4e,0x00,0x06,0xe1,0x5e,0x00,0x06,0xe1,0x8e,0x00,0x06,0xe1,0xbc,0x00,0x06,0xe1,0xf2,0x00,0x06,0xe2,0x28,0x00,0x06,0xe2,0x5e,0x00,0x06,0xe2,0x94,\r\n0x00,0x06,0xe2,0xca,0x00,0x06,0xe3,0x00,0x00,0x06,0xe3,0x2e,0x00,0x06,0xe3,0x5c,0x00,0x06,0xe3,0x8a,0x00,0x06,0xe3,0xbc,0x00,0x06,0xe3,0xee,0x00,0x06,0xe4,0x20,0x00,0x06,0xe4,0x30,0x00,0x06,0xe4,0x54,0x00,0x06,0xe4,0x64,0x00,0x06,0xe4,0x92,0x00,0x06,0xe4,0xaa,0x00,0x06,0xe4,0xd8,0x00,0x06,0xe4,0xfc,0x00,0x06,0xe5,0x2c,\r\n0x00,0x06,0xe5,0x5a,0x00,0x06,0xe5,0x88,0x00,0x06,0xe5,0xbe,0x00,0x06,0xe5,0xec,0x00,0x06,0xe6,0x1a,0x00,0x06,0xe6,0x48,0x00,0x06,0xe6,0x76,0x00,0x06,0xe6,0xa4,0x00,0x06,0xe6,0xd2,0x00,0x06,0xe8,0x96,0x00,0x06,0xea,0x76,0x00,0x06,0xec,0x72,0x00,0x06,0xee,0x4e,0x00,0x06,0xef,0x2e,0x00,0x06,0xf0,0x3c,0x00,0x06,0xf1,0xda,\r\n0x00,0x06,0xf2,0x78,0x00,0x06,0xf3,0x62,0x00,0x06,0xf4,0x36,0x00,0x06,0xf4,0xaa,0x00,0x06,0xf5,0x16,0x00,0x06,0xf5,0xe0,0x00,0x06,0xf6,0xcc,0x00,0x06,0xf7,0xc0,0x00,0x06,0xf9,0x00,0x00,0x06,0xf9,0x86,0x00,0x06,0xfa,0xe8,0x00,0x06,0xfb,0xce,0x00,0x06,0xfd,0x0c,0x00,0x06,0xfe,0xa2,0x00,0x07,0x00,0x16,0x00,0x07,0x01,0x4c,\r\n0x00,0x07,0x02,0x24,0x00,0x07,0x03,0x26,0x00,0x07,0x04,0x1a,0x00,0x07,0x05,0x08,0x00,0x07,0x06,0x42,0x00,0x07,0x07,0xa8,0x00,0x07,0x08,0xea,0x00,0x07,0x09,0xe4,0x00,0x07,0x0a,0x7e,0x00,0x07,0x0b,0x2c,0x00,0x07,0x0d,0x52,0x00,0x07,0x0e,0x90,0x00,0x07,0x0f,0xa8,0x00,0x07,0x10,0xa4,0x00,0x07,0x11,0x64,0x00,0x07,0x12,0x8a,\r\n0x00,0x07,0x13,0x32,0x00,0x07,0x14,0x3a,0x00,0x07,0x15,0xcc,0x00,0x07,0x16,0xda,0x00,0x07,0x18,0x22,0x00,0x07,0x18,0x6a,0x00,0x07,0x18,0x98,0x00,0x07,0x18,0xee,0x00,0x07,0x19,0x1a,0x00,0x07,0x19,0x44,0x00,0x07,0x19,0x7c,0x00,0x07,0x19,0xde,0x00,0x07,0x1a,0x34,0x00,0x07,0x1a,0x5e,0x00,0x07,0x1a,0xa6,0x00,0x07,0x1a,0xee,\r\n0x00,0x07,0x1b,0x1a,0x00,0x07,0x1b,0xcc,0x00,0x07,0x1c,0x78,0x00,0x07,0x1c,0xd8,0x00,0x07,0x1d,0x32,0x00,0x07,0x1d,0x92,0x00,0x07,0x1e,0x3a,0x00,0x07,0x1e,0x98,0x00,0x07,0x1f,0x42,0x00,0x07,0x20,0x52,0x00,0x07,0x20,0x64,0x00,0x07,0x23,0xe8,0x00,0x07,0x27,0x46,0x00,0x07,0x2a,0xd6,0x00,0x07,0x2b,0x02,0x00,0x07,0x2b,0x2e,\r\n0x00,0x07,0x2b,0x5a,0x00,0x07,0x2b,0x86,0x00,0x07,0x2b,0xb2,0x00,0x07,0x2b,0xde,0x00,0x07,0x2c,0x16,0x00,0x07,0x2c,0x4e,0x00,0x07,0x2c,0x84,0x00,0x07,0x2c,0xba,0x00,0x07,0x2c,0xee,0x00,0x07,0x2d,0x22,0x00,0x07,0x2d,0x56,0x00,0x07,0x2d,0x8a,0x00,0x07,0x2d,0xbe,0x00,0x07,0x2d,0xea,0x00,0x07,0x2e,0x16,0x00,0x07,0x2e,0x42,\r\n0x00,0x07,0x2e,0xe0,0x00,0x07,0x2f,0x62,0x00,0x07,0x2f,0x98,0x00,0x07,0x30,0x0a,0x00,0x07,0x30,0x80,0x00,0x07,0x31,0x16,0x00,0x07,0x31,0x70,0x00,0x07,0x31,0xc4,0x00,0x07,0x32,0x1e,0x00,0x07,0x32,0x72,0x00,0x07,0x32,0xd4,0x00,0x07,0x33,0x16,0x00,0x07,0x33,0x9e,0x00,0x07,0x33,0xfe,0x00,0x07,0x34,0x3e,0x00,0x07,0x34,0x9a,\r\n0x00,0x07,0x34,0xf2,0x00,0x07,0x35,0x4a,0x00,0x07,0x35,0xa2,0x00,0x07,0x36,0x12,0x00,0x07,0x36,0xd0,0x00,0x07,0x37,0x4a,0x00,0x07,0x37,0xe0,0x00,0x07,0x38,0x5a,0x00,0x07,0x38,0xee,0x00,0x07,0x39,0x88,0x00,0x07,0x3a,0x10,0x00,0x07,0x3a,0x9c,0x00,0x07,0x3b,0x6a,0x00,0x07,0x3b,0xfc,0x00,0x07,0x3c,0xa2,0x00,0x07,0x3d,0x6a,\r\n0x00,0x07,0x3e,0x1c,0x00,0x07,0x3e,0xc6,0x00,0x07,0x3f,0xac,0x00,0x07,0x40,0x8c,0x00,0x07,0x41,0x2c,0x00,0x07,0x41,0xbc,0x00,0x07,0x42,0x16,0x00,0x07,0x42,0x72,0x00,0x07,0x43,0x16,0x00,0x07,0x43,0xae,0x00,0x07,0x44,0xac,0x00,0x07,0x45,0x58,0x00,0x07,0x46,0x46,0x00,0x07,0x47,0x0a,0x00,0x07,0x47,0x96,0x00,0x07,0x48,0x1a,\r\n0x00,0x07,0x48,0xb2,0x00,0x07,0x49,0x48,0x00,0x07,0x49,0xf6,0x00,0x07,0x4a,0xa0,0x00,0x07,0x4b,0x50,0x00,0x07,0x4b,0xe8,0x00,0x07,0x4c,0x8e,0x00,0x07,0x4d,0x66,0x00,0x07,0x4d,0xe4,0x00,0x07,0x4e,0x5a,0x00,0x07,0x4f,0x4e,0x00,0x07,0x50,0x40,0x00,0x07,0x50,0xea,0x00,0x07,0x51,0x94,0x00,0x07,0x52,0x22,0x00,0x07,0x52,0xb0,\r\n0x00,0x07,0x53,0x0a,0x00,0x07,0x53,0x64,0x00,0x07,0x53,0xf4,0x00,0x07,0x54,0x80,0x00,0x07,0x54,0xfa,0x00,0x07,0x55,0x60,0x00,0x07,0x56,0x0e,0x00,0x07,0x56,0x9c,0x00,0x07,0x57,0x4e,0x00,0x07,0x57,0xee,0x00,0x07,0x58,0xca,0x00,0x07,0x59,0x94,0x00,0x07,0x5a,0xd0,0x00,0x07,0x5b,0xf8,0x00,0x07,0x5f,0x70,0x00,0x07,0x5f,0xbc,\r\n0x00,0x07,0x61,0x1e,0x00,0x07,0x61,0x9c,0x00,0x07,0x62,0xf2,0x00,0x07,0x63,0xa8,0x00,0x07,0x63,0xee,0x00,0x07,0x64,0x54,0x00,0x07,0x64,0x9a,0x00,0x07,0x65,0x00,0x00,0x07,0x65,0x9a,0x00,0x07,0x66,0x2e,0x00,0x07,0x66,0xbe,0x00,0x07,0x67,0x50,0x00,0x07,0x68,0x5e,0x00,0x07,0x69,0x64,0x00,0x07,0x69,0xfe,0x00,0x07,0x6a,0x9e,\r\n0x00,0x07,0x6b,0x7c,0x00,0x07,0x6c,0x60,0x00,0x07,0x6c,0xfa,0x00,0x07,0x6d,0x90,0x00,0x07,0x6d,0xf0,0x00,0x07,0x6e,0x50,0x00,0x07,0x6f,0x04,0x00,0x07,0x6f,0xb4,0x00,0x07,0x70,0x26,0x00,0x07,0x70,0x94,0x00,0x07,0x71,0x10,0x00,0x07,0x71,0x88,0x00,0x07,0x72,0x04,0x00,0x07,0x72,0x88,0x00,0x07,0x73,0x5a,0x00,0x07,0x74,0x24,\r\n0x00,0x07,0x74,0xc4,0x00,0x07,0x76,0x6c,0x00,0x07,0x76,0xaa,0x00,0x07,0x76,0xec,0x00,0x07,0x77,0x6e,0x00,0x07,0x78,0x3c,0x00,0x07,0x78,0x3c,0x00,0x07,0x78,0x54,0x00,0x07,0x79,0x28,0x00,0x07,0x79,0xb4,0x00,0x07,0x7b,0x6e,0x00,0x07,0x7d,0x2a,0x00,0x07,0x7d,0x4e,0x00,0x07,0x7d,0x78,0x00,0x07,0x7e,0x02,0x00,0x07,0x7e,0x74,\r\n0x00,0x07,0x7e,0xf6,0x00,0x07,0x7f,0xaa,0x00,0x07,0x80,0x04,0x00,0x07,0x80,0x8e,0x00,0x07,0x81,0x4c,0x00,0x07,0x81,0x92,0x00,0x07,0x82,0x84,0x00,0x07,0x83,0x42,0x00,0x07,0x83,0xba,0x00,0x07,0x83,0xca,0x00,0x07,0x85,0x86,0x00,0x07,0x87,0x42,0x00,0x07,0x89,0x66,0x00,0x07,0x8b,0x76,0x00,0x07,0x8d,0x72,0x00,0x07,0x8f,0x3e,\r\n0x00,0x07,0x91,0x0c,0x00,0x07,0x92,0xda,0x00,0x07,0x94,0xf4,0x00,0x07,0x95,0xc6,0x00,0x07,0x96,0x1e,0x00,0x07,0x96,0x9a,0x00,0x07,0x97,0x08,0x00,0x07,0x97,0x92,0x00,0x07,0x98,0x28,0x00,0x07,0x98,0xa0,0x00,0x07,0x99,0x3a,0x00,0x07,0x99,0xbc,0x00,0x07,0x9a,0x10,0x00,0x07,0x9a,0x86,0x00,0x07,0x9a,0xea,0x00,0x07,0x9b,0x5c,\r\n0x00,0x07,0x9b,0xe8,0x00,0x07,0x9c,0x5c,0x00,0x07,0x9d,0x06,0x00,0x07,0x9d,0xa6,0x00,0x07,0x9e,0x32,0x00,0x07,0x9e,0xc2,0x00,0x07,0x9f,0x78,0x00,0x07,0xa0,0x2a,0x00,0x07,0xa0,0x76,0x00,0x07,0xa0,0xd6,0x00,0x07,0xa1,0x3e,0x00,0x07,0xa1,0xc0,0x00,0x07,0xa2,0x4a,0x00,0x07,0xa2,0xa0,0x00,0x07,0xa3,0x22,0x00,0x07,0xa3,0x74,\r\n0x00,0x07,0xa3,0xc6,0x00,0x07,0xa4,0x38,0x00,0x07,0xa4,0x8c,0x00,0x07,0xa4,0xf4,0x00,0x07,0xa5,0x6a,0x00,0x07,0xa5,0xec,0x00,0x07,0xa6,0x52,0x00,0x07,0xa6,0xba,0x00,0x07,0xa7,0x56,0x00,0x07,0xa7,0xda,0x00,0x07,0xa8,0x28,0x00,0x07,0xa8,0x88,0x00,0x07,0xa8,0xe4,0x00,0x07,0xa9,0x52,0x00,0x07,0xa9,0xc6,0x00,0x07,0xaa,0x58,\r\n0x00,0x07,0xaa,0xd2,0x00,0x07,0xab,0x8a,0x00,0x07,0xac,0x18,0x00,0x07,0xac,0xb4,0x00,0x07,0xac,0xd4,0x00,0x07,0xad,0x2a,0x00,0x07,0xad,0x86,0x00,0x07,0xae,0x14,0x00,0x07,0xae,0xb8,0x00,0x07,0xaf,0x1c,0x00,0x07,0xaf,0x94,0x00,0x07,0xb0,0x46,0x00,0x07,0xb0,0xfe,0x00,0x07,0xb1,0x7a,0x00,0x07,0xb2,0x3c,0x00,0x07,0xb3,0x16,\r\n0x00,0x07,0xb3,0x82,0x00,0x07,0xb3,0xe8,0x00,0x07,0xb4,0x6c,0x00,0x07,0xb4,0xe4,0x00,0x07,0xb5,0x82,0x00,0x07,0xb6,0x42,0x00,0x07,0xb6,0x9e,0x00,0x07,0xb7,0x24,0x00,0x07,0xb7,0x90,0x00,0x07,0xb7,0xec,0x00,0x07,0xb8,0x58,0x00,0x07,0xb8,0xc0,0x00,0x07,0xb9,0x36,0x00,0x07,0xb9,0xe2,0x00,0x07,0xba,0x94,0x00,0x07,0xbb,0x66,\r\n0x00,0x07,0xbb,0xe4,0x00,0x07,0xbc,0x58,0x00,0x07,0xbc,0xf0,0x00,0x07,0xbd,0x82,0x00,0x07,0xbd,0xda,0x00,0x07,0xbe,0x4a,0x00,0x07,0xbe,0xb4,0x00,0x07,0xbf,0x42,0x00,0x07,0xbf,0xfe,0x00,0x07,0xc0,0xda,0x00,0x07,0xc1,0x94,0x00,0x07,0xc2,0x2c,0x00,0x07,0xc2,0xc2,0x00,0x07,0xc3,0xa0,0x00,0x07,0xc3,0xfc,0x00,0x07,0xc4,0x9e,\r\n0x00,0x07,0xc5,0x6c,0x00,0x07,0xc6,0x12,0x00,0x07,0xc6,0xdc,0x00,0x07,0xc7,0xda,0x00,0x07,0xc8,0x72,0x00,0x07,0xc9,0x3c,0x00,0x07,0xca,0x16,0x00,0x07,0xca,0xdc,0x00,0x07,0xcb,0x46,0x00,0x07,0xcb,0xe6,0x00,0x07,0xcc,0x7a,0x00,0x07,0xcd,0x7e,0x00,0x07,0xce,0x68,0x00,0x07,0xcf,0x88,0x00,0x07,0xd0,0xa2,0x00,0x07,0xd1,0x60,\r\n0x00,0x07,0xd2,0xaa,0x00,0x07,0xd3,0x64,0x00,0x07,0xd3,0xc0,0x00,0x07,0xd4,0x26,0x00,0x07,0xd4,0x98,0x00,0x07,0xd5,0x2c,0x00,0x07,0xd5,0xa2,0x00,0x07,0xd5,0xfc,0x00,0x07,0xd6,0x86,0x00,0x07,0xd7,0x0c,0x00,0x07,0xd7,0x5c,0x00,0x07,0xd7,0xd2,0x00,0x07,0xd8,0x2a,0x00,0x07,0xd8,0x82,0x00,0x07,0xd8,0xc0,0x00,0x07,0xd9,0x28,\r\n0x00,0x07,0xd9,0x90,0x00,0x07,0xda,0x26,0x00,0x07,0xda,0xce,0x00,0x07,0xdb,0x60,0x00,0x07,0xdb,0xd4,0x00,0x07,0xdc,0x7e,0x00,0x07,0xdc,0xd8,0x00,0x07,0xdd,0x08,0x00,0x07,0xdd,0x6e,0x00,0x07,0xdd,0xb0,0x00,0x07,0xdd,0xe0,0x00,0x07,0xde,0x3e,0x00,0x07,0xde,0x9e,0x00,0x07,0xde,0xc8,0x00,0x07,0xdf,0x64,0x00,0x07,0xdf,0xfc,\r\n0x00,0x07,0xe0,0x58,0x00,0x07,0xe0,0xde,0x00,0x07,0xe1,0xc6,0x00,0x07,0xe2,0x54,0x00,0x07,0xe3,0x04,0x00,0x07,0xe3,0xfa,0x00,0x07,0xe4,0xa4,0x00,0x07,0xe5,0x5a,0x00,0x07,0xe6,0x1a,0x00,0x07,0xe6,0xd4,0x00,0x07,0xe7,0x38,0x00,0x07,0xe7,0xc6,0x00,0x07,0xe8,0x7e,0x00,0x07,0xe9,0x66,0x00,0x07,0xe9,0xde,0x00,0x07,0xea,0x7a,\r\n0x00,0x07,0xeb,0x32,0x00,0x07,0xeb,0xe6,0x00,0x07,0xec,0x7e,0x00,0x07,0xed,0x20,0x00,0x07,0xed,0x76,0x00,0x07,0xed,0xc0,0x00,0x07,0xee,0x3a,0x00,0x07,0xee,0xac,0x00,0x07,0xef,0x1c,0x00,0x07,0xef,0xae,0x00,0x07,0xf0,0x44,0x00,0x07,0xf0,0xd6,0x00,0x07,0xf1,0x14,0x00,0x07,0xf1,0x86,0x00,0x07,0xf1,0xf0,0x00,0x07,0xf2,0xa0,\r\n0x00,0x07,0xf2,0xb8,0x00,0x07,0xf3,0x82,0x00,0x07,0xf4,0x1e,0x00,0x07,0xf4,0x66,0x00,0x07,0xf4,0xc8,0x00,0x07,0xf5,0x44,0x00,0x07,0xf5,0xc6,0x00,0x07,0xf6,0x78,0x00,0x07,0xf7,0x3c,0x00,0x07,0xf7,0x5c,0x00,0x07,0xf7,0x80,0x00,0x07,0xf7,0xa4,0x00,0x07,0xf7,0xb4,0x00,0x07,0xf7,0xce,0x00,0x07,0xf7,0xde,0x00,0x07,0xf7,0xf6,\r\n0x00,0x07,0xf8,0x0e,0x00,0x07,0xf8,0x26,0x00,0x07,0xf8,0x3e,0x00,0x07,0xf8,0xe2,0x00,0x07,0xf9,0x6e,0x00,0x07,0xf9,0xc0,0x00,0x07,0xfa,0x14,0x00,0x07,0xfa,0x96,0x00,0x07,0xfb,0x18,0x00,0x07,0xfb,0xe0,0x00,0x07,0xfc,0xb4,0x00,0x07,0xfd,0x74,0x00,0x07,0xfe,0x36,0x00,0x07,0xfe,0xd4,0x00,0x07,0xff,0x68,0x00,0x08,0x00,0x3e,\r\n0x00,0x08,0x01,0x08,0x00,0x08,0x01,0x5a,0x00,0x08,0x01,0xf4,0x00,0x08,0x02,0xd2,0x00,0x08,0x03,0xf6,0x00,0x08,0x04,0xd6,0x00,0x08,0x05,0xce,0x00,0x08,0x06,0x6e,0x00,0x08,0x07,0x4e,0x00,0x08,0x07,0xe8,0x00,0x08,0x08,0xaa,0x00,0x08,0x09,0x68,0x00,0x08,0x0a,0x42,0x00,0x08,0x0b,0x0c,0x00,0x08,0x0b,0xf8,0x00,0x08,0x0c,0xa2,\r\n0x00,0x08,0x0d,0x40,0x00,0x08,0x0d,0xda,0x00,0x08,0x0e,0x66,0x00,0x08,0x0f,0x06,0x00,0x08,0x0f,0x92,0x00,0x08,0x10,0x54,0x00,0x08,0x11,0x0c,0x00,0x08,0x11,0x62,0x00,0x08,0x11,0xb4,0x00,0x08,0x12,0x0e,0x00,0x08,0x12,0x62,0x00,0x08,0x13,0x1e,0x00,0x08,0x13,0xc4,0x00,0x08,0x14,0xa6,0x00,0x08,0x15,0x72,0x00,0x08,0x16,0x6a,\r\n0x00,0x08,0x17,0x3c,0x00,0x08,0x17,0xdc,0x00,0x08,0x18,0x98,0x00,0x08,0x19,0x38,0x00,0x08,0x19,0xe8,0x00,0x08,0x1a,0xac,0x00,0x08,0x1b,0x86,0x00,0x08,0x1c,0x62,0x00,0x08,0x1d,0x20,0x00,0x08,0x1e,0x26,0x00,0x08,0x1f,0x12,0x00,0x08,0x1f,0xa2,0x00,0x08,0x20,0x2e,0x00,0x08,0x20,0xda,0x00,0x08,0x21,0x82,0x00,0x08,0x22,0x12,\r\n0x00,0x08,0x22,0xaa,0x00,0x08,0x23,0x94,0x00,0x08,0x24,0x74,0x00,0x08,0x25,0x4c,0x00,0x08,0x26,0x24,0x00,0x08,0x26,0xd4,0x00,0x08,0x27,0x92,0x00,0x08,0x28,0x2e,0x00,0x08,0x28,0xe8,0x00,0x08,0x29,0x40,0x00,0x08,0x29,0x94,0x00,0x08,0x2a,0x4a,0x00,0x08,0x2b,0x04,0x00,0x08,0x2b,0xb2,0x00,0x08,0x2c,0x60,0x00,0x08,0x2d,0x0e,\r\n0x00,0x08,0x2d,0xba,0x00,0x08,0x2e,0x68,0x00,0x08,0x2f,0x2a,0x00,0x08,0x2f,0x8a,0x00,0x08,0x30,0x60,0x00,0x08,0x30,0xfc,0x00,0x08,0x31,0x86,0x00,0x08,0x32,0x52,0x00,0x08,0x33,0x20,0x00,0x08,0x33,0xfa,0x00,0x08,0x34,0x8e,0x00,0x08,0x35,0x2c,0x00,0x08,0x35,0xa0,0x00,0x08,0x36,0x10,0x00,0x08,0x36,0xe6,0x00,0x08,0x37,0xba,\r\n0x00,0x08,0x38,0x80,0x00,0x08,0x38,0xba,0x00,0x08,0x38,0xea,0x00,0x08,0x39,0x7c,0x00,0x08,0x3a,0x06,0x00,0x08,0x3a,0x64,0x00,0x08,0x3a,0xc0,0x00,0x08,0x3b,0x56,0x00,0x08,0x3b,0xd0,0x00,0x08,0x3c,0x20,0x00,0x08,0x3c,0xfa,0x00,0x08,0x3d,0x8c,0x00,0x08,0x3e,0x08,0x00,0x08,0x3e,0xaa,0x00,0x08,0x3f,0x34,0x00,0x08,0x40,0x22,\r\n0x00,0x08,0x41,0x1a,0x00,0x08,0x41,0xe2,0x00,0x08,0x42,0x96,0x00,0x08,0x43,0x7a,0x00,0x08,0x44,0x30,0x00,0x08,0x45,0x20,0x00,0x08,0x45,0xb8,0x00,0x08,0x46,0x96,0x00,0x08,0x47,0x70,0x00,0x08,0x47,0xf4,0x00,0x08,0x48,0x9c,0x00,0x08,0x49,0xa6,0x00,0x08,0x4a,0x40,0x00,0x08,0x4a,0x94,0x00,0x08,0x4b,0x02,0x00,0x08,0x4b,0x9c,\r\n0x00,0x08,0x4b,0xce,0x00,0x08,0x4c,0xa8,0x00,0x08,0x4c,0xd2,0x00,0x08,0x4c,0xfe,0x00,0x08,0x4d,0x36,0x00,0x08,0x4d,0x60,0x00,0x08,0x4d,0x8a,0x00,0x08,0x4d,0xb4,0x00,0x08,0x4d,0xde,0x00,0x08,0x4e,0x0a,0x00,0x08,0x4e,0x36,0x00,0x08,0x4e,0x4e,0x00,0x08,0x4e,0x5e,0x00,0x08,0x4e,0x6e,0x00,0x08,0x4e,0x7e,0x00,0x08,0x4e,0x8e,\r\n0x00,0x08,0x4e,0xa6,0x00,0x08,0x4e,0xc6,0x00,0x08,0x4e,0xd6,0x00,0x08,0x4e,0xe6,0x00,0x08,0x4e,0xf6,0x00,0x08,0x4f,0x06,0x00,0x08,0x4f,0xaa,0x00,0x08,0x50,0x6e,0x00,0x08,0x51,0xc8,0x00,0x08,0x52,0x4e,0x00,0x08,0x52,0xec,0x00,0x08,0x53,0x44,0x00,0x08,0x54,0x5c,0x00,0x08,0x56,0x3a,0x00,0x08,0x56,0x64,0x00,0x08,0x56,0x8e,\r\n0x00,0x08,0x57,0x2e,0x00,0x08,0x57,0xa2,0x00,0x08,0x58,0x2c,0x00,0x08,0x58,0x8a,0x00,0x08,0x59,0x3e,0x00,0x08,0x5a,0x14,0x00,0x08,0x5a,0xaa,0x00,0x08,0x5b,0x62,0x00,0x08,0x5c,0x16,0x00,0x08,0x5c,0xd0,0x00,0x08,0x5d,0xa0,0x00,0x08,0x5e,0x6c,0x00,0x08,0x5f,0x6c,0x00,0x08,0x60,0x3a,0x00,0x08,0x61,0x24,0x00,0x08,0x62,0x40,\r\n0x00,0x08,0x63,0x1e,0x00,0x08,0x63,0xe0,0x00,0x08,0x64,0xc0,0x00,0x08,0x65,0x9c,0x00,0x08,0x66,0x1e,0x00,0x08,0x66,0x8c,0x00,0x08,0x67,0x10,0x00,0x08,0x67,0xac,0x00,0x08,0x68,0x70,0x00,0x08,0x69,0x26,0x00,0x08,0x69,0xfc,0x00,0x08,0x6a,0xd6,0x00,0x08,0x6b,0xc0,0x00,0x08,0x6c,0x5e,0x00,0x08,0x6d,0x12,0x00,0x08,0x6e,0x22,\r\n0x00,0x08,0x6e,0xd8,0x00,0x08,0x6f,0x42,0x00,0x08,0x6f,0xc2,0x00,0x08,0x70,0x9e,0x00,0x08,0x71,0x44,0x00,0x08,0x72,0x00,0x00,0x08,0x72,0xa8,0x00,0x08,0x73,0x58,0x00,0x08,0x74,0x4c,0x00,0x08,0x75,0x34,0x00,0x08,0x75,0x88,0x00,0x08,0x76,0x2c,0x00,0x08,0x76,0x80,0x00,0x08,0x77,0x1a,0x00,0x08,0x78,0x46,0x00,0x08,0x78,0xe0,\r\n0x00,0x08,0x78,0xfa,0x00,0x08,0x79,0x20,0x00,0x08,0x79,0xa8,0x00,0x08,0x79,0xc2,0x00,0x08,0x79,0xe8,0x00,0x08,0x7a,0x70,0x00,0x08,0x7a,0x9e,0x00,0x08,0x7b,0xb2,0x00,0x08,0x7b,0xe0,0x00,0x08,0x7c,0x7a,0x00,0x08,0x7c,0xe2,0x00,0x08,0x7d,0x08,0x00,0x08,0x7d,0x2e,0x00,0x08,0x7d,0x52,0x00,0x08,0x7d,0x78,0x00,0x08,0x7d,0x9c,\r\n0x00,0x08,0x7d,0xc2,0x00,0x08,0x7d,0xfe,0x00,0x08,0x7e,0x46,0x00,0x08,0x7e,0x78,0x00,0x08,0x7f,0x14,0x00,0x08,0x7f,0xfc,0x00,0x08,0x80,0x22,0x00,0x08,0x80,0x48,0x00,0x08,0x80,0x78,0x00,0x08,0x80,0xa6,0x00,0x08,0x80,0xb6,0x00,0x08,0x80,0xc6,0x00,0x08,0x81,0x14,0x00,0x08,0x81,0xa4,0x00,0x08,0x82,0x1e,0x00,0x08,0x82,0x7e,\r\n0x00,0x08,0x83,0x0e,0x00,0x08,0x83,0x9e,0x00,0x08,0x84,0x46,0x00,0x08,0x84,0xa4,0x00,0x08,0x84,0xf2,0x00,0x08,0x85,0x7c,0x00,0x08,0x85,0xfe,0x00,0x08,0x86,0x6c,0x00,0x08,0x86,0xe0,0x00,0x08,0x87,0x28,0x00,0x08,0x87,0x6a,0x00,0x08,0x87,0xbc,0x00,0x08,0x88,0x06,0x00,0x08,0x88,0xa8,0x00,0x08,0x88,0xd4,0x00,0x08,0x89,0x12,\r\n0x00,0x08,0x89,0x84,0x00,0x08,0x89,0xf6,0x00,0x08,0x8a,0x7e,0x00,0x08,0x8b,0x08,0x00,0x08,0x8b,0x90,0x00,0x08,0x8c,0x38,0x00,0x08,0x8c,0xa4,0x00,0x08,0x8d,0x54,0x00,0x08,0x8d,0x84,0x00,0x08,0x8d,0xd4,0x00,0x08,0x8e,0x04,0x00,0x08,0x8e,0xd0,0x00,0x08,0x8f,0x2e,0x00,0x08,0x8f,0x7a,0x00,0x08,0x8f,0xba,0x00,0x08,0x8f,0xd8,\r\n0x00,0x08,0x90,0x28,0x00,0x08,0x90,0x56,0x00,0x08,0x90,0x86,0x00,0x08,0x90,0xc0,0x00,0x08,0x91,0x4a,0x00,0x08,0x91,0x66,0x00,0x08,0x91,0x82,0x00,0x08,0x91,0xe2,0x00,0x08,0x92,0x10,0x00,0x08,0x92,0x66,0x00,0x08,0x92,0xb4,0x00,0x08,0x92,0xfe,0x00,0x08,0x93,0x52,0x00,0x08,0x93,0x98,0x00,0x08,0x94,0x1e,0x00,0x08,0x94,0x94,\r\n0x00,0x08,0x94,0xe0,0x00,0x08,0x95,0x2e,0x00,0x08,0x95,0x7c,0x00,0x08,0x95,0xca,0x00,0x08,0x96,0x18,0x00,0x08,0x96,0x66,0x00,0x08,0x96,0xb4,0x00,0x08,0x97,0x02,0x00,0x08,0x97,0x50,0x00,0x08,0x97,0x9e,0x00,0x08,0x97,0xc0,0x00,0x08,0x97,0xe6,0x00,0x08,0x98,0x0c,0x00,0x08,0x98,0x32,0x00,0x08,0x98,0x52,0x00,0x08,0x99,0x8c,\r\n0x00,0x08,0x9a,0x5c,0x00,0x08,0x9b,0x26,0x00,0x08,0x9c,0xa0,0x00,0x08,0x9d,0x40,0x00,0x08,0x9d,0xa4,0x00,0x08,0x9d,0xbc,0x00,0x08,0x9d,0xd4,0x00,0x08,0x9e,0xa8,0x00,0x08,0x9f,0x86,0x00,0x08,0x9f,0xf0,0x00,0x08,0xa0,0x76,0x00,0x08,0xa1,0x46,0x00,0x08,0xa2,0x16,0x00,0x08,0xa2,0xd6,0x00,0x08,0xa3,0x98,0x00,0x08,0xa4,0x34,\r\n0x00,0x08,0xa4,0xd0,0x00,0x08,0xa4,0xe0,0x00,0x08,0xa5,0xa4,0x00,0x08,0xa6,0x5c,0x00,0x08,0xa6,0xb8,0x00,0x08,0xa6,0xec,0x00,0x08,0xa7,0x0e,0x00,0x08,0xa7,0xec,0x00,0x08,0xa8,0xee,0x00,0x08,0xa9,0x9a,0x00,0x08,0xaa,0x4c,0x00,0x08,0xaa,0xfc,0x00,0x08,0xab,0x0c,0x00,0x08,0xac,0x2e,0x00,0x08,0xac,0xda,0x00,0x08,0xac,0xfa,\r\n0x00,0x08,0xad,0x92,0x00,0x08,0xae,0x8a,0x00,0x08,0xaf,0x44,0x00,0x08,0xb0,0x2e,0x00,0x08,0xb0,0xd0,0x00,0x08,0xb1,0x98,0x00,0x08,0xb2,0x50,0x00,0x08,0xb3,0x2c,0x00,0x08,0xb4,0x50,0x00,0x08,0xb5,0x4c,0x00,0x08,0xb6,0x22,0x00,0x08,0xb7,0x38,0x00,0x08,0xb7,0x90,0x00,0x08,0xb8,0x46,0x00,0x08,0xb8,0x8c,0x00,0x08,0xb9,0x06,\r\n0x00,0x08,0xb9,0xbe,0x00,0x08,0xba,0x9e,0x00,0x08,0xbb,0x02,0x00,0x08,0xbb,0xb0,0x00,0x08,0xbb,0xc0,0x00,0x08,0xbc,0x18,0x00,0x08,0xbc,0xa0,0x00,0x08,0xbd,0x70,0x00,0x08,0xbe,0x40,0x00,0x08,0xbe,0xc0,0x00,0x08,0xbe,0xd0,0x00,0x08,0xbf,0xb4,0x00,0x08,0xc0,0x46,0x00,0x08,0xc1,0x26,0x00,0x08,0xc1,0x9a,0x00,0x08,0xc2,0x7e,\r\n0x00,0x08,0xc3,0x1a,0x00,0x08,0xc3,0x82,0x00,0x08,0xc3,0xfe,0x00,0x08,0xc4,0x74,0x00,0x08,0xc5,0x16,0x00,0x08,0xc5,0xc2,0x00,0x08,0xc6,0x46,0x00,0x08,0xc6,0xd8,0x00,0x08,0xc6,0xe8,0x00,0x08,0xc6,0xfa,0x00,0x08,0xc7,0x0c,0x00,0x08,0xc7,0x1e,0x00,0x08,0xc7,0x30,0x00,0x08,0xc7,0x42,0x00,0x08,0xc7,0x54,0x00,0x08,0xc7,0x66,\r\n0x00,0x08,0xc7,0x78,0x00,0x08,0xc7,0x8a,0x00,0x08,0xc7,0x9c,0x00,0x08,0xc7,0xac,0x00,0x08,0xc7,0xbe,0x00,0x08,0xc7,0xd0,0x00,0x08,0xc7,0xe0,0x00,0x08,0xc7,0xf2,0x00,0x08,0xc8,0x04,0x00,0x08,0xc8,0x16,0x00,0x08,0xc8,0x2e,0x00,0x08,0xc8,0x46,0x00,0x08,0xc8,0x5e,0x00,0x08,0xc8,0x74,0x00,0x08,0xc8,0x8a,0x00,0x08,0xca,0x64,\r\n0x00,0x08,0xd0,0x7e,0x00,0x08,0xd2,0xb4,0x00,0x08,0xd9,0xd8,0x00,0x08,0xd9,0xea,0x00,0x08,0xda,0x02,0x00,0x08,0xda,0x14,0x00,0x08,0xda,0x64,0x00,0x08,0xda,0x74,0x00,0x08,0xda,0x86,0x00,0x08,0xda,0x9e,0x00,0x08,0xda,0xb0,0x00,0x08,0xda,0xc8,0x00,0x08,0xda,0xd8,0x00,0x08,0xda,0xee,0x00,0x08,0xdb,0x00,0x00,0x08,0xdb,0x18,\r\n0x00,0x08,0xdb,0x2a,0x00,0x08,0xdb,0x42,0x00,0x08,0xdb,0x76,0x00,0x08,0xdb,0xe0,0x00,0x08,0xdc,0x00,0x00,0x08,0xdc,0x20,0x00,0x08,0xdc,0x40,0x00,0x08,0xdc,0x60,0x00,0x08,0xdc,0x72,0x00,0x08,0xdc,0x8a,0x00,0x08,0xdc,0xa2,0x00,0x08,0xdc,0xba,0x00,0x08,0xdc,0xd2,0x00,0x08,0xdc,0xea,0x00,0x08,0xdd,0x02,0x00,0x08,0xdd,0x1a,\r\n0x00,0x08,0xdd,0x32,0x00,0x08,0xdd,0x4a,0x00,0x08,0xdd,0x62,0x00,0x08,0xdd,0xf4,0x00,0x08,0xde,0x98,0x00,0x08,0xde,0xb8,0x00,0x08,0xde,0xd8,0x00,0x08,0xdf,0x32,0x00,0x08,0xdf,0x5a,0x00,0x08,0xdf,0x6a,0x00,0x08,0xdf,0x82,0x00,0x08,0xdf,0x9a,0x00,0x08,0xdf,0xfe,0x00,0x08,0xe0,0x68,0x00,0x08,0xe1,0x3a,0x00,0x08,0xe1,0xe8,\r\n0x00,0x08,0xe2,0x86,0x00,0x08,0xe3,0x22,0x00,0x08,0xe3,0x3a,0x00,0x08,0xe3,0x52,0x00,0x08,0xe3,0x62,0x00,0x08,0xe3,0x72,0x00,0x08,0xe4,0x36,0x00,0x08,0xe4,0xe0,0x00,0x08,0xe4,0xf0,0x00,0x08,0xe5,0x00,0x00,0x08,0xe6,0x9c,0x00,0x08,0xe6,0xc6,0x00,0x08,0xe7,0x9c,0x00,0x08,0xe8,0x80,0x00,0x08,0xe8,0xd2,0x00,0x08,0xe8,0xe4,\r\n0x00,0x08,0xe9,0x06,0x00,0x08,0xe9,0x18,0x00,0x08,0xe9,0x6c,0x00,0x08,0xe9,0x7e,0x00,0x08,0xea,0x14,0x00,0x08,0xea,0x26,0x00,0x08,0xea,0xde,0x00,0x08,0xeb,0x30,0x00,0x08,0xeb,0x96,0x00,0x08,0xeb,0xea,0x00,0x08,0xec,0x50,0x00,0x08,0xec,0xa2,0x00,0x08,0xed,0x08,0x00,0x08,0xed,0x5a,0x00,0x08,0xed,0xc0,0x00,0x08,0xed,0xd0,\r\n0x00,0x08,0xee,0x14,0x00,0x08,0xee,0xbe,0x00,0x08,0xee,0xce,0x00,0x08,0xef,0x72,0x00,0x08,0xef,0x82,0x00,0x08,0xf0,0x60,0x00,0x08,0xf0,0x70,0x00,0x08,0xf0,0xe0,0x00,0x08,0xf1,0x84,0x00,0x08,0xf2,0x52,0x00,0x08,0xf3,0x0a,0x00,0x08,0xf3,0xa2,0x00,0x08,0xf4,0x72,0x00,0x08,0xf4,0xb6,0x00,0x08,0xf5,0x92,0x00,0x08,0xf6,0xe4,\r\n0x00,0x08,0xf8,0x9a,0x00,0x08,0xf9,0xc2,0x00,0x08,0xfb,0x6a,0x00,0x08,0xfb,0x82,0x00,0x08,0xfb,0x9a,0x00,0x08,0xfb,0xba,0x00,0x08,0xfb,0xda,0x00,0x08,0xfb,0xf2,0x00,0x08,0xfc,0x0a,0x00,0x08,0xfc,0x2a,0x00,0x08,0xfc,0x3a,0x00,0x08,0xfc,0x4a,0x00,0x08,0xfc,0x5a,0x00,0x08,0xfd,0xb0,0x00,0x08,0xfe,0x98,0x00,0x08,0xff,0x4a,\r\n0x00,0x09,0x00,0x2a,0x00,0x09,0x00,0xb8,0x00,0x09,0x00,0xca,0x00,0x09,0x02,0x4a,0x00,0x09,0x04,0x28,0x00,0x09,0x05,0xf4,0x00,0x09,0x07,0x6a,0x00,0x09,0x08,0x98,0x00,0x09,0x0a,0x78,0x00,0x09,0x0b,0x12,0x00,0x09,0x0b,0xd4,0x00,0x09,0x0c,0x8e,0x00,0x09,0x0c,0xa0,0x00,0x09,0x0c,0xbc,0x00,0x09,0x0c,0xd4,0x00,0x09,0x0c,0xec,\r\n0x00,0x09,0x0d,0x04,0x00,0x09,0x0d,0x1c,0x00,0x09,0x0d,0x34,0x00,0x09,0x0d,0x54,0x00,0x09,0x0d,0x74,0x00,0x09,0x0d,0x94,0x00,0x09,0x0d,0xb4,0x00,0x09,0x0d,0xd4,0x00,0x09,0x0d,0xf4,0x00,0x09,0x0e,0x0c,0x00,0x09,0x0f,0x08,0x00,0x09,0x0f,0xe2,0x00,0x09,0x10,0x80,0x00,0x09,0x10,0x98,0x00,0x09,0x10,0xb8,0x00,0x09,0x10,0xd8,\r\n0x00,0x09,0x10,0xf8,0x00,0x09,0x11,0x08,0x00,0x09,0x11,0x20,0x00,0x09,0x11,0x38,0x00,0x09,0x11,0x48,0x00,0x09,0x11,0x60,0x00,0x09,0x11,0x78,0x00,0x09,0x11,0x88,0x00,0x09,0x11,0xd2,0x00,0x09,0x12,0x0c,0x00,0x09,0x12,0x4e,0x00,0x09,0x13,0x00,0x00,0x09,0x13,0x92,0x00,0x09,0x14,0x14,0x00,0x09,0x14,0x5e,0x00,0x09,0x14,0xb0,\r\n0x00,0x09,0x15,0x02,0x00,0x09,0x15,0x9a,0x00,0x09,0x16,0x2a,0x00,0x09,0x16,0xd4,0x00,0x09,0x17,0x66,0x00,0x09,0x17,0xea,0x00,0x09,0x18,0x2e,0x00,0x09,0x1a,0x76,0x00,0x09,0x1c,0x24,0x00,0x09,0x1c,0x68,0x00,0x09,0x1c,0x98,0x00,0x09,0x1c,0xc8,0x00,0x09,0x1c,0xd8,0x00,0x09,0x1c,0xe8,0x00,0x09,0x1d,0x32,0x00,0x09,0x1d,0x6e,\r\n0x00,0x09,0x1d,0xb2,0x00,0x09,0x1e,0x72,0x00,0x09,0x1f,0x06,0x00,0x09,0x1f,0x86,0x00,0x09,0x1f,0xd4,0x00,0x09,0x20,0x2e,0x00,0x09,0x20,0x8a,0x00,0x09,0x21,0x32,0x00,0x09,0x21,0xd2,0x00,0x09,0x22,0x8a,0x00,0x09,0x23,0x1c,0x00,0x09,0x23,0xa4,0x00,0x09,0x23,0xee,0x00,0x09,0x24,0x06,0x00,0x09,0x24,0x26,0x00,0x09,0x24,0xbe,\r\n0x00,0x09,0x25,0x8e,0x00,0x09,0x26,0x66,0x00,0x09,0x27,0x7e,0x00,0x09,0x28,0x24,0x00,0x09,0x28,0xf6,0x00,0x09,0x29,0xdc,0x00,0x09,0x2a,0xa8,0x00,0x09,0x2b,0x2a,0x00,0x09,0x2b,0xe8,0x00,0x09,0x2d,0x1c,0x00,0x09,0x2d,0xde,0x00,0x09,0x2e,0xbc,0x00,0x09,0x2f,0x8a,0x00,0x09,0x30,0x5a,0x00,0x09,0x31,0x46,0x00,0x09,0x32,0x6a,\r\n0x00,0x09,0x32,0xf4,0x00,0x09,0x34,0x44,0x00,0x09,0x35,0x52,0x00,0x09,0x36,0x94,0x00,0x09,0x37,0x42,0x00,0x09,0x38,0x46,0x00,0x09,0x39,0x0a,0x00,0x09,0x3a,0x26,0x00,0x09,0x3a,0xf8,0x00,0x09,0x3b,0xcc,0x00,0x09,0x3c,0x52,0x00,0x09,0x3d,0x76,0x00,0x09,0x3e,0x9e,0x00,0x09,0x3f,0x20,0x00,0x09,0x40,0x62,0x00,0x09,0x41,0x64,\r\n0x00,0x09,0x42,0x74,0x00,0x09,0x43,0x46,0x00,0x09,0x44,0x02,0x00,0x09,0x44,0xe6,0x00,0x09,0x45,0xdc,0x00,0x09,0x46,0xa4,0x00,0x09,0x47,0x60,0x00,0x09,0x48,0x26,0x00,0x09,0x48,0xfe,0x00,0x09,0x49,0x8e,0x00,0x09,0x49,0x8e,0x00,0x09,0x49,0x8e,0x00,0x09,0x4a,0x4a,0x00,0x09,0x4b,0x1e,0x00,0x09,0x4b,0xac,0x00,0x09,0x4b,0xfc,\r\n0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0b,0x07,0x01,0x03,0x04,0x00,0x03,0x05,0x05,0x09,0x04,0x00,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x00,0x2f,0xcd,0x3f,0xcd,0x31,0x30,0x33,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0xa6,0x03,0xde,0xfc,0xb6,0x02,0xb6,0xfd,0x4a,0x05,0x76,0xfa,0x8a,0x94,\r\n0x04,0x4e,0x00,0x02,0x00,0xb4,0xff,0xee,0x01,0x92,0x05,0x9a,0x00,0x03,0x00,0x0f,0x00,0x3f,0x40,0x20,0x03,0x03,0x02,0x0a,0x40,0x04,0x0a,0xb0,0x5b,0x04,0x13,0x01,0x02,0x00,0x7d,0x1f,0x03,0x2f,0x03,0x02,0x03,0x0d,0xaf,0x7f,0x07,0x01,0x10,0x07,0x20,0x07,0x02,0x07,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x07,0x2f,0x2b,0x72,0x5d,\r\n0xe1,0xd4,0x72,0xe1,0x39,0x39,0x00,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x77,0x13,0x87,0x12,0x58,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x05,0x9a,0xfb,0xfa,0x04,0x06,0xfa,0x54,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x02,\r\n0x00,0xa3,0x03,0xdb,0x02,0x80,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x14,0x0f,0x04,0x1f,0x04,0x2f,0x04,0xbf,0x04,0xcf,0x04,0x05,0x04,0x04,0x09,0x03,0x06,0x02,0x07,0x03,0x03,0x00,0x3f,0x33,0xcd,0x32,0x01,0x2f,0x12,0x39,0x2f,0x5d,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x34,0x91,0x01,0xdd,0x91,0x05,\r\n0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x00,0x02,0x00,0x21,0x00,0x7b,0x04,0x8e,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0xbf,0x40,0x6b,0x0f,0x17,0x01,0x00,0x06,0x01,0x10,0x06,0x1b,0x02,0x03,0x06,0x07,0x1a,0x07,0x18,0x1c,0x1f,0x09,0x08,0x19,0x08,0x17,0x1d,0x1e,0x0a,0x0b,0x16,0x0b,0x14,0x11,0x10,0x0d,0x0c,0x15,0x0c,\r\n0x09,0x0d,0x10,0x1f,0x04,0x06,0x03,0x06,0x03,0xe2,0x59,0x11,0x14,0x17,0x1d,0x04,0x02,0x1b,0x1b,0x02,0xe2,0x59,0x1b,0x06,0x1b,0x06,0x1a,0x0b,0x00,0x07,0x10,0x07,0x02,0x09,0x07,0x07,0x21,0x16,0x1a,0x03,0x04,0x00,0x00,0x19,0x1a,0x0e,0x07,0x0f,0x08,0x01,0x0c,0x03,0x08,0x08,0x21,0x0c,0x0c,0x16,0x42,0x12,0x0e,0x0e,0x15,0x16,\r\n0x0b,0x60,0x0c,0x70,0x0c,0x02,0x0c,0x2f,0x5d,0x33,0xcd,0x32,0x33,0x2f,0xc6,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0xe1,0x32,0x32,0x2f,0xc6,0x00,0x3f,0xc4,0x12,0x39,0x2f,0x5e,0x5d,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x17,0x39,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,\r\n0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x01,0x5f,0x5e,0x5d,0x5d,0x01,0x07,0x21,0x03,0x21,0x07,0x21,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x21,0x37,0x21,0x13,0x21,0x37,0x21,0x13,0x33,0x03,0x33,0x13,0x33,0x03,0x07,0x23,0x03,0x33,0x04,0x8e,0x17,0xfe,0xfb,0x3f,0x01,\r\n0x19,0x1b,0xfe,0xed,0x58,0x7e,0x56,0xfa,0x54,0x7d,0x54,0xfe,0xfa,0x14,0x01,0x09,0x3d,0xfe,0xeb,0x15,0x01,0x15,0x54,0x7e,0x54,0xfc,0x56,0x7b,0x54,0x91,0xfc,0x42,0xfe,0x04,0x08,0x6a,0xfe,0xd4,0x6a,0xfe,0x73,0x01,0x8d,0xfe,0x73,0x01,0x8d,0x6a,0x01,0x2c,0x6a,0x01,0x92,0xfe,0x6e,0x01,0x92,0xfe,0x6e,0x6a,0xfe,0xd4,0x00,0x03,\r\n0x00,0xa2,0xff,0x2f,0x03,0xd1,0x06,0x50,0x00,0x1e,0x00,0x25,0x00,0x2a,0x00,0xc1,0x40,0x1b,0x09,0x26,0x01,0x06,0x1f,0x01,0x0a,0x1d,0x01,0x05,0x15,0x01,0x03,0x00,0x0e,0x01,0x0f,0x05,0x01,0x10,0x05,0x2a,0x20,0x0c,0x00,0x4d,0x25,0xb8,0xff,0xe0,0xb3,0x0c,0x00,0x4d,0x15,0xb8,0xff,0xd0,0x40,0x56,0x0c,0x00,0x4d,0x05,0x30,0x0c,\r\n0x00,0x4d,0x1f,0x19,0x09,0x26,0x0a,0x03,0x13,0x16,0x16,0x20,0x18,0x13,0x18,0x9a,0x59,0x10,0x12,0x40,0x13,0x06,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x09,0x03,0x06,0x06,0x27,0x09,0x03,0x09,0x9a,0x59,0x00,0x02,0x03,0x18,0x09,0x10,0x13,0x19,0x1f,0x27,0x06,0x01,0x8c,0x02,0x02,0x1c,0x0d,0x16,0x40,0x0c,0x11,0x00,0x4c,0x16,0x16,\r\n0x1c,0x89,0x7f,0x29,0x01,0x2f,0x29,0x01,0x29,0x05,0x23,0x89,0x20,0x0d,0x01,0x0d,0x2f,0x5d,0xe1,0xc4,0xd4,0x5d,0x5d,0xf1,0xc0,0x2f,0x2b,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x00,0x3f,0xcd,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x1a,0xcd,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x11,0x12,0x39,0x39,0x12,\r\n0x39,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x25,0x15,0x23,0x35,0x22,0x27,0x35,0x16,0x16,0x33,0x11,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x01,0x11,0x06,0x06,0x15,0x14,0x16,0x13,0x11,0x36,0x35,0x34,0x02,0x68,0x68,0xd5,\r\n0x85,0x3a,0xc9,0x57,0xdc,0x82,0xc6,0x98,0x68,0xc4,0x4b,0x66,0xa9,0xd0,0x99,0xbf,0xfe,0xee,0x54,0x62,0x50,0xce,0xc1,0x08,0xd9,0xd1,0x56,0xae,0x33,0x45,0x02,0x00,0x6a,0xb3,0x7a,0x91,0xd3,0x15,0xb4,0xb0,0x06,0x32,0xaa,0x50,0x06,0xfd,0xf0,0x63,0xb9,0x76,0x8e,0xc1,0x03,0x19,0x01,0xd2,0x11,0x73,0x52,0x56,0x6e,0xfe,0xe4,0xfe,\r\n0x3c,0x2a,0xa6,0x8a,0x00,0x05,0x00,0x50,0xff,0xea,0x06,0x40,0x05,0xb0,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,0x00,0x33,0x00,0xaf,0x40,0x32,0x19,0x18,0x03,0x22,0x28,0x52,0x59,0x22,0x0e,0x1c,0x1c,0x2e,0x52,0x59,0x1c,0x13,0x06,0x00,0x42,0x00,0x12,0x52,0x59,0x00,0x06,0x06,0x0c,0x52,0x59,0x06,0x04,0x3f,0x18,0x4f,0x18,0x02,\r\n0x1a,0x18,0x1a,0x18,0x25,0x03,0x1f,0xbd,0x2b,0x0c,0x0d,0x06,0x4d,0x2b,0xb8,0xff,0xf9,0xb6,0x0b,0x06,0x4d,0x2b,0x31,0xbd,0x25,0xb8,0xff,0xe0,0x40,0x14,0x0d,0x06,0x4d,0x25,0x18,0x0c,0x06,0x4d,0x25,0x09,0x0b,0x06,0x4d,0x25,0x25,0x35,0x03,0x09,0xbd,0x15,0xb8,0xff,0xec,0x40,0x16,0x0d,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,\r\n0x0f,0xbd,0x03,0x1c,0x0d,0x06,0x4d,0x03,0x1c,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,\r\n0x10,0xe4,0x2b,0x00,0x18,0x3f,0x2f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x94,0x94,\r\n0xb0,0xba,0x9e,0x99,0xa9,0xbd,0x8b,0x5f,0x6e,0x6c,0x5d,0x5e,0x6a,0x69,0x03,0x57,0xfc,0x68,0x8f,0x03,0x97,0x26,0x94,0xb0,0xbc,0x9c,0x98,0xaa,0xbd,0x8b,0x60,0x6d,0x6c,0x5d,0x5e,0x6a,0x69,0x02,0xcb,0xc3,0xa3,0xb2,0xcd,0xbe,0xac,0xac,0xcf,0x02,0x77,0x8d,0x7b,0x79,0x87,0x8c,0x7c,0x79,0x87,0x58,0xfa,0x5c,0x05,0xa4,0xfa,0x50,\r\n0xc4,0xa2,0xb2,0xcf,0xc0,0xad,0xab,0xcf,0x02,0x76,0x8c,0x7c,0x77,0x87,0x8d,0x7b,0x7a,0x84,0x00,0x03,0x00,0x77,0xff,0xe9,0x06,0x3e,0x05,0xb2,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0xd7,0x40,0x1c,0x58,0x4f,0x01,0x5c,0x4c,0x01,0x03,0x59,0x4b,0x01,0x5d,0x4a,0x01,0x50,0x37,0x01,0x52,0x36,0x01,0x5b,0x0d,0x01,0x4a,0x40,0x0b,0x00,\r\n0x4d,0x51,0xb8,0xff,0xe8,0x40,0x0c,0x0b,0x00,0x4d,0x1d,0x4d,0x01,0x02,0x1f,0x01,0x0b,0x04,0x10,0xb8,0xff,0xe0,0x40,0x5c,0x0b,0x00,0x4d,0x05,0x49,0x4e,0x12,0x04,0x0a,0x2f,0x38,0x29,0x24,0x65,0x2f,0x05,0x1c,0x44,0x1c,0x5d,0x96,0x59,0x1c,0x04,0x0a,0x44,0x95,0x59,0x0a,0x13,0x00,0x3d,0xec,0x59,0x00,0x13,0x3a,0x49,0x01,0x38,\r\n0x05,0x33,0x0f,0x29,0x49,0x2c,0x53,0x12,0x4e,0x65,0x24,0x04,0x21,0x17,0x33,0xef,0x2c,0x21,0xef,0x58,0x60,0xef,0x17,0x17,0x58,0x2c,0x03,0x0f,0x70,0x40,0x01,0x40,0x40,0x69,0x53,0x08,0x0d,0x06,0x4d,0x53,0x08,0x0c,0x06,0x4d,0x53,0x08,0x0b,0x06,0x4d,0x53,0x83,0x0f,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x12,0x17,0x39,\r\n0x2f,0xe1,0x2f,0xe1,0x2f,0xe1,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x2f,0x11,0x17,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x2b,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5f,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x27,\r\n0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x17,0x36,0x12,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,\r\n0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x05,0xa5,0x39,0x57,0x4a,0x45,0x26,0x28,0x69,0x80,0x98,0x59,0x6c,0xb4,0x80,0x47,0xae,0x9f,0x1e,0x3c,0x2f,0x1d,0x39,0x64,0x88,0x4f,0x4e,0x81,0x5d,0x34,0x89,0x89,0x45,0x70,0x5f,0x52,0x28,0x51,0x52,0x09,0x08,0x9f,0x08,0x03,0x02,0x26,0x40,0x55,0x2f,0x23,\r\n0x3a,0x3b,0x3f,0x28,0x1e,0x3e,0x21,0x24,0x4f,0xfc,0x93,0x4c,0x80,0x6c,0x58,0x24,0x3d,0x67,0x69,0x77,0x4e,0x3f,0x6a,0x4d,0x2c,0x32,0x57,0x74,0x01,0x3d,0x25,0x39,0x46,0x22,0x62,0x75,0x01,0x19,0x2d,0x3c,0x22,0x7e,0x7c,0x17,0x1f,0x39,0x52,0x34,0x2b,0x50,0x3e,0x25,0x36,0x69,0x9a,0x64,0x99,0xd9,0x45,0x16,0x3b,0x4b,0x5b,0x36,\r\n0x4f,0x7a,0x54,0x2b,0x2b,0x50,0x70,0x45,0x78,0x9f,0x38,0x1b,0x4e,0x60,0x6e,0x3b,0x71,0x01,0x10,0x95,0x26,0x43,0x21,0x21,0x3b,0x29,0x5b,0xb8,0xad,0x9c,0x41,0x30,0x47,0x30,0x17,0x10,0x0c,0x98,0x0e,0x0e,0x8e,0x21,0x37,0x49,0x28,0x5f,0x87,0x62,0x46,0x1e,0x19,0x3d,0x53,0x6e,0x4a,0x44,0x68,0x45,0x23,0x03,0xfd,0x32,0x46,0x2e,\r\n0x15,0x6a,0x5b,0x29,0x48,0x3e,0x30,0x11,0x2c,0x75,0x00,0x01,0x00,0xa3,0x03,0xdb,0x01,0x34,0x05,0x9a,0x00,0x03,0x00,0x0c,0xb3,0x03,0x02,0x03,0x03,0x00,0x3f,0xcd,0x01,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x01,0x34,0x91,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x00,0x01,0x00,0x8c,0xfe,0xba,0x02,0x56,0x05,0x9a,0x00,0x09,0x00,0x41,\r\n0x40,0x2b,0x05,0x10,0x0b,0x01,0x4d,0x01,0x10,0x0b,0x01,0x4d,0x38,0x02,0x01,0x06,0x03,0x00,0x20,0x05,0xea,0x06,0x01,0xea,0x00,0x00,0x0b,0x08,0x08,0x0c,0x06,0x4d,0x08,0x10,0x0b,0x06,0x4d,0x08,0xea,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x2b,\r\n0x2b,0x01,0x23,0x00,0x11,0x10,0x01,0x33,0x00,0x11,0x10,0x02,0x54,0x92,0xfe,0xca,0x01,0x36,0x94,0xfe,0xc6,0xfe,0xba,0x01,0x62,0x02,0x07,0x02,0x09,0x01,0x6e,0xfe,0x84,0xfe,0x07,0xfe,0x0b,0x00,0x00,0x01,0x00,0x16,0xfe,0xba,0x01,0xe2,0x05,0x9a,0x00,0x09,0x00,0x4a,0xb9,0x00,0x06,0xff,0xf0,0xb3,0x0b,0x01,0x4d,0x00,0xb8,0xff,\r\n0xf0,0x40,0x0b,0x0b,0x01,0x4d,0x37,0x09,0x01,0x06,0x03,0x00,0x20,0x03,0xb8,0xff,0xf0,0xb5,0x0b,0x06,0x4d,0x03,0xea,0x08,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x08,0x08,0x0b,0x01,0x06,0xea,0x05,0x00,0xea,0x01,0x2f,0xe1,0xd6,0xe1,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x2b,0x2b,0x13,0x23,\r\n0x00,0x11,0x10,0x01,0x33,0x00,0x11,0x10,0xaa,0x92,0x01,0x38,0xfe,0xc6,0x94,0x01,0x38,0xfe,0xba,0x01,0x76,0x01,0xf5,0x01,0xf9,0x01,0x7c,0xfe,0x92,0xfd,0xf7,0xfd,0xf9,0x00,0x00,0x01,0x00,0x4c,0x02,0xd9,0x03,0x0c,0x05,0x9a,0x00,0x0e,0x00,0x67,0x40,0x31,0x03,0x04,0x01,0x10,0x03,0x03,0x05,0x08,0x0a,0x0d,0x0e,0x00,0x04,0x08,\r\n0x09,0x09,0x08,0x53,0x59,0x0f,0x09,0x01,0x10,0x03,0x09,0x0c,0x03,0x02,0x02,0x00,0x0e,0x0c,0x06,0x06,0x0b,0x08,0x0b,0x08,0x42,0x08,0x04,0x0a,0x0d,0x03,0x01,0x0d,0x0c,0x48,0x0b,0xb8,0xff,0xf8,0xb5,0x0d,0x06,0x4d,0x07,0x0a,0x0b,0x2f,0x33,0x33,0x2b,0xed,0x32,0x32,0x17,0x39,0xc4,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x10,0xe4,\r\n0x39,0x2f,0x00,0x3f,0xc4,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x10,0xd4,0xc4,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x05,0x17,0x07,0x03,0x03,0x27,0x37,0x25,0x37,0x05,0x03,0x33,0x03,0x25,0x03,0x0c,0xfe,0xee,0xbe,0x6e,0x9c,0x9e,0x6e,0xbe,0xfe,0xec,0x2d,0x01,0x06,0x17,0x8a,0x17,0x01,0x07,0x04,0x50,0x38,0xf3,0x4c,0x01,\r\n0x09,0xfe,0xf7,0x4c,0xf3,0x38,0x7d,0x63,0x01,0x30,0xfe,0xd0,0x63,0x00,0x00,0x01,0x00,0xe8,0x00,0x7f,0x04,0x94,0x04,0x2b,0x00,0x0b,0x00,0x49,0x40,0x21,0x03,0x0e,0x04,0x08,0x0e,0x07,0x40,0x0a,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x0f,0x07,0x01,0x0d,0x03,0x07,0x00,0x0e,0x01,0x04,0x05,0x42,0x05,0x0a,0x07,0x01,0xbd,0x04,0xb8,\r\n0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0xe1,0x39,0x39,0xcd,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x94,0xfe,0x6c,0x85,0xfe,0x6d,0x01,0x93,0x85,0x01,0x94,0x02,0x12,0xfe,\r\n0x6d,0x01,0x93,0x86,0x01,0x93,0xfe,0x6d,0x00,0x01,0x00,0x27,0xfe,0xf8,0x01,0x3c,0x00,0xe4,0x00,0x03,0x00,0x45,0x40,0x1d,0x39,0x03,0x01,0x39,0x00,0x01,0x02,0x40,0x03,0xb2,0x04,0x00,0x20,0x0c,0x06,0x4d,0x00,0x28,0x0b,0x06,0x4d,0x00,0x80,0x02,0x40,0x11,0x19,0x48,0x02,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xea,\r\n0xb6,0x0b,0x06,0x4d,0x02,0x2f,0x05,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0x1a,0xcd,0x2b,0x2b,0x00,0x10,0xf6,0x1a,0xcd,0x31,0x30,0x01,0x5d,0x5d,0x25,0x03,0x23,0x13,0x01,0x3c,0xa0,0x75,0x75,0xe4,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x00,0x90,0x01,0xfa,0x02,0xb2,0x02,0x7b,0x00,0x03,0x00,0x1c,0x40,0x10,0x02,0x01,0x53,0x59,0x4f,0x02,\r\n0x01,0x02,0x20,0x00,0x01,0x00,0x20,0x01,0x01,0x01,0x2f,0x5d,0x2f,0x5d,0x00,0x2f,0x5d,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0xb2,0xfd,0xde,0x02,0x22,0x01,0xfa,0x81,0x00,0x00,0x01,0x00,0x70,0xff,0xea,0x01,0x50,0x00,0xcb,0x00,0x0b,0x00,0x1c,0x40,0x11,0x00,0x06,0xb0,0x5b,0x00,0x13,0x09,0xaf,0x1f,0x03,0x2f,0x03,0x02,0x03,\r\n0x2f,0x0d,0x01,0x5d,0x2f,0x71,0xe1,0x00,0x3f,0x2b,0x31,0x30,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x16,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x00,0x01,0xff,0xe4,0xff,0x12,0x03,0x2d,0x05,0x9a,0x00,0x03,0x00,0x19,0x40,0x0d,0x77,0x01,0x01,0x00,0x10,0x0b,\r\n0x00,0x4d,0x01,0x00,0x03,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x2f,0x31,0x30,0x01,0x2b,0x5d,0x01,0x01,0x23,0x01,0x03,0x2d,0xfd,0x50,0x99,0x02,0xae,0x05,0x9a,0xf9,0x78,0x06,0x88,0x00,0x02,0x00,0x56,0xff,0xe7,0x03,0xfc,0x05,0xb2,0x00,0x10,0x00,0x18,0x00,0x29,0x40,0x15,0x00,0x89,0x11,0x11,0x1a,0x15,0x89,0x40,0x0a,0x0f,0x13,0x9a,\r\n0x59,0x0f,0x07,0x05,0x17,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x20,0x03,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x03,0xfc,0x41,0x7b,0xb3,0x72,0x6c,0xa9,0x74,0x3c,0x3f,0x7a,\r\n0xb5,0x75,0x01,0xc3,0xa8,0xfe,0xdd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x02,0xd3,0xb4,0xfe,0xea,0xbf,0x63,0x5f,0xb6,0x01,0x09,0xab,0xbc,0x01,0x20,0xc3,0x63,0xfd,0x11,0x02,0x64,0xfd,0x91,0xfd,0xbb,0x00,0x01,0x00,0xe4,0x00,0x00,0x02,0xd4,0x05,0xba,0x00,0x0e,0x00,0x1d,0x40,0x0d,0x0d,0x07,0x00,0x8a,0x01,0x08,0x07,0x07,0x01,0x0d,\r\n0x07,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0xc6,0x33,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0xd4,0xa4,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x3e,0x04,0xd7,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x03,0xe2,\r\n0x05,0xb2,0x00,0x2a,0x00,0x3c,0x40,0x1e,0x1e,0x13,0x89,0x0a,0x21,0x00,0x00,0x2c,0x1d,0x89,0x40,0x21,0x00,0x1d,0x0e,0x20,0x1d,0x99,0x59,0x20,0x18,0x0a,0x0a,0x05,0x0e,0x05,0x9a,0x59,0x0e,0x07,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x32,\r\n0x31,0x30,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x21,0x15,0x21,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x03,0x04,0x29,0x47,0x60,0x38,0x30,0x5c,0x57,0x51,0x23,0x45,0xab,0x7b,0x58,0x96,0x6e,0x3f,0x27,0x4f,0x78,0x51,0x65,0x83,0x4d,0x1f,0x02,0xca,\r\n0xfc,0x8b,0x28,0x5c,0x95,0x6c,0x4e,0x69,0x40,0x1b,0x04,0x22,0x42,0x62,0x41,0x20,0x1a,0x2e,0x40,0x27,0xb0,0x43,0x47,0x33,0x62,0x90,0x5d,0x55,0x8a,0x7a,0x70,0x3a,0x48,0x66,0x59,0x59,0x3a,0x93,0x47,0x5c,0x8c,0x7e,0x7e,0x4f,0x38,0x66,0x66,0x69,0x00,0x01,0x00,0x7b,0xff,0xe7,0x03,0xb9,0x05,0xb2,0x00,0x29,0x00,0x72,0x40,0x41,\r\n0x16,0x89,0x1a,0x13,0x24,0x03,0x08,0x22,0x22,0x08,0x00,0x89,0x40,0x0f,0x0f,0x2b,0x08,0x19,0x1a,0x01,0x0f,0x1a,0x01,0x0b,0x03,0x1a,0x1a,0x18,0x1d,0x18,0x9a,0x59,0x24,0x12,0x13,0x13,0x12,0x9a,0x59,0x13,0x13,0x0a,0x1d,0x07,0x36,0x08,0x01,0x00,0x08,0x10,0x08,0x20,0x08,0x03,0x09,0x03,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,\r\n0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x3f,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,\r\n0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb9,0x49,0x85,0xba,0x70,0xcd,0x79,0x91,0xbb,0x4b,0x79,0x57,0x2f,0xfe,0x70,0x77,0x71,0x01,0x62,0xfe,0xf2,0x98,0x85,0x89,0xbd,0x5a,0x92,0x68,0x39,0xfe,0xe2,0x49,0x7c,0x5a,0x33,0x01,0x96,0x61,0x9f,0x71,0x3e,0x4e,\r\n0xb0,0x72,0x26,0x48,0x66,0x40,0x01,0x19,0x8b,0x01,0x08,0xf4,0x66,0x9f,0x52,0x32,0x5a,0x7e,0x4c,0xfe,0xe5,0x51,0x04,0x08,0x37,0x58,0x77,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x0e,0x00,0x15,0x00,0x3e,0x40,0x1e,0x03,0x01,0x05,0x8a,0x06,0x40,0x10,0x0e,0x06,0x06,0x0f,0x17,0x08,0x04,0x08,0x0f,0x08,0x9a,\r\n0x59,0x09,0x01,0x11,0x0e,0x0f,0x0f,0x06,0x0e,0x06,0x06,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x12,0x39,0x39,0x11,0x33,0x33,0x1a,0x10,0xfd,0x32,0xc6,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x52,0xb8,0xb8,\r\n0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,0x24,0x01,0xe9,0x4b,0x86,0x79,0x6e,0x05,0x9a,0xfc,0x4d,0x96,0xfe,0xaf,0x01,0x51,0x8e,0x6a,0xf1,0xf8,0xf7,0x71,0xfc,0x4d,0x02,0xbe,0x83,0xce,0xa8,0x88,0x00,0x00,0x01,0x00,0xa4,0xff,0xe7,0x03,0xc9,0x05,0x9a,0x00,0x23,0x00,0x52,0x40,0x2c,0x1c,0x8a,0x1a,0x17,0x17,0x08,0x00,0x89,\r\n0x40,0x0f,0x0f,0x25,0x08,0x1f,0x12,0x9a,0x59,0x1f,0x1f,0x0a,0x18,0x18,0x1b,0x99,0x59,0x18,0x06,0x12,0x08,0x01,0x00,0x08,0x01,0x0b,0x03,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x5d,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x01,0x18,0x2f,0x12,0x39,0x2f,0x1a,\r\n0xed,0x11,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,\r\n0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x01,0xb6,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x46,0x40,0x24,0x12,0x0a,0x00,0x89,0x21,0x21,\r\n0x36,0x2b,0x19,0x89,0x40,0x0a,0x1c,0x26,0x9a,0x59,0x1a,0x1c,0x1c,0x30,0x0f,0x12,0x12,0x14,0x0f,0x14,0x9a,0x59,0x0f,0x07,0x05,0x30,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x11,0x12,0x39,0x2f,0x39,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,\r\n0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,\r\n0x3b,0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,\r\n0x2f,0x54,0x75,0x00,0x00,0x01,0x00,0x62,0x00,0x00,0x03,0xf2,0x05,0x9a,0x00,0x12,0x00,0x2d,0xb9,0x00,0x07,0x01,0x86,0x40,0x12,0x40,0x0f,0x08,0x08,0x00,0x10,0x00,0x00,0x10,0x11,0x11,0x10,0x99,0x59,0x11,0x06,0x08,0x18,0x00,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x2f,0x12,0x39,0x2f,0x39,0x1a,0xed,0x31,0x30,0x01,\r\n0x0e,0x03,0x02,0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,0x37,0x21,0x35,0x21,0x03,0xf2,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x05,0x3b,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x00,0x03,0x00,0x5a,0xff,0xe9,\r\n0x03,0xfc,0x05,0xb2,0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x5b,0x40,0x2f,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x40,0x00,0x15,0x05,0x33,0x3d,0x3d,0x33,0x9a,0x59,0x3d,0x3d,0x29,0x0d,0x1f,0x29,0x99,0x59,0x1f,0x19,0x0d,0x47,0x9a,0x59,0x0d,0x07,0x00,0x3f,0x2b,\r\n0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,\r\n0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,\r\n0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,\r\n0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xff,0xe7,0x03,0xec,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x46,0x40,0x24,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,\r\n0x2b,0x89,0x40,0x17,0x12,0x30,0x99,0x59,0x0f,0x12,0x12,0x26,0x05,0x1c,0x26,0x9a,0x59,0x1c,0x07,0x08,0x08,0x0a,0x05,0x0a,0x9a,0x59,0x05,0x19,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x39,0x2b,0x01,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,\r\n0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,0x4e,0x96,0xd8,0x8a,0x8e,0x6c,0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,\r\n0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x03,0x23,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,0xb0,0x7f,0x46,0x57,0xa7,0xf4,0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,\r\n0x63,0x00,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x3c,0x40,0x16,0x06,0x00,0xb0,0x5b,0x06,0x10,0x0c,0x12,0xb0,0x5b,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,\r\n0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,\r\n0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x02,0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,0x00,0x0b,0x00,0x0f,0x00,0x63,0x40,0x16,0x0f,0x0f,0x01,0x0f,0x0c,0x01,0x0c,0x05,0x06,0x00,0xb0,0x5b,0x06,0x10,0x0e,0x40,0x0f,0xb2,0x10,0x09,0xaf,0x03,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xec,0x40,0x11,0x0b,\r\n0x06,0x4d,0x03,0x0c,0x20,0x0c,0x06,0x4d,0x0c,0x28,0x0b,0x06,0x4d,0x0c,0x80,0x0e,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x0e,0xb8,0xff,0xea,0xb6,0x0b,0x06,0x4d,0x0e,0x2f,0x11,0x01,0x5d,0x2f,0x2b,0x2b,0x1a,0xcd,0x2b,0x2b,0x2f,0x2b,0x2b,0xe1,0x00,0x10,0xf6,0x1a,0xcd,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x13,0x22,0x26,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x03,0x23,0x13,0xe2,0x2f,0x41,0x41,0x2f,0x2e,0x42,0x42,0x2c,0xa0,0x75,0x75,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfd,0xac,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x01,0x10,0x00,0x7f,0x04,0x6c,0x04,0x4c,0x00,0x07,0x00,0x43,0x40,0x0c,0x78,0x01,0x01,0x07,0x10,0x0b,\r\n0x00,0x4d,0x02,0x01,0x00,0x00,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x00,0x4d,0x70,0x03,0x01,0x03,0x03,0x00,0x04,0x00,0xb8,0xff,0xe0,0xb5,0x0c,0x06,0x4d,0x00,0x05,0x01,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x01,0x2f,0x2b,0x33,0x2f,0x2b,0xc4,0x00,0x2f,0x33,0x2f,0x5d,0x2b,0x12,0x39,0x39,0x31,0x30,0x2b,0x5d,0x25,0x01,0x35,0x01,0x15,\r\n0x01,0x15,0x01,0x04,0x6c,0xfc,0xa4,0x03,0x5c,0xfd,0x7e,0x02,0x82,0x7f,0x01,0xb0,0x3b,0x01,0xe2,0x96,0xfe,0x9c,0x04,0xfe,0xc6,0x00,0x00,0x02,0x00,0xe8,0x01,0x3e,0x04,0x94,0x03,0x6c,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x0f,0x06,0x05,0xbe,0x59,0x06,0x02,0x02,0x01,0xbe,0x59,0x02,0x01,0x00,0x05,0x04,0xb8,0xff,0xe0,0xb4,0x0c,\r\n0x06,0x4d,0x04,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2f,0x2b,0x12,0x39,0x39,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0x02,0xe8,0x84,0xfd,0xd2,0x84,0x00,0x00,0x01,0x01,0x10,0x00,0x7f,0x04,0x6c,0x04,0x4c,\r\n0x00,0x07,0x00,0x43,0x40,0x0c,0x78,0x00,0x01,0x02,0x10,0x0b,0x00,0x4d,0x07,0x00,0x01,0x01,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x00,0x4d,0x70,0x06,0x01,0x06,0x06,0x01,0x04,0x00,0xb8,0xff,0xe0,0xb5,0x0c,0x06,0x4d,0x00,0x05,0x02,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x02,0x2f,0x2b,0xc4,0x2f,0x2b,0x33,0x00,0x2f,0x33,0x2f,0x5d,0x2b,\r\n0x12,0x39,0x39,0x31,0x30,0x2b,0x5d,0x01,0x01,0x35,0x01,0x35,0x01,0x35,0x01,0x04,0x6c,0xfc,0xa4,0x02,0x84,0xfd,0x7c,0x03,0x5c,0x02,0x2f,0xfe,0x50,0x95,0x01,0x38,0x06,0x01,0x64,0x96,0xfe,0x1e,0x00,0x02,0x00,0x83,0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x23,0x00,0x33,0x00,0x46,0x40,0x26,0x00,0x12,0x01,0x10,0x05,0x11,0x0f,0x14,\r\n0x0f,0x95,0x59,0x14,0x04,0x00,0x2c,0x24,0x2c,0xb0,0x5b,0x24,0x13,0x20,0xef,0x03,0x30,0xaf,0x7f,0x28,0x01,0x28,0x28,0x11,0x19,0x84,0x0a,0x0a,0x35,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0xe1,0xd4,0xe1,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x26,0x26,0x35,\r\n0x34,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x15,0x14,0x16,0x17,0x03,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x01,0x4f,0x09,0x0e,0x33,0x4c,0x5a,0x4c,0x33,0x25,0x40,0x54,0x2f,0xa9,0x7c,0x99,0xa4,0x4c,0x86,0x65,0x3a,0x34,0x4f,0x5c,\r\n0x4f,0x34,0x16,0x0b,0x47,0x2c,0x22,0x21,0x21,0x21,0x2d,0x2d,0x21,0x21,0x21,0x22,0x01,0x8e,0x1a,0x53,0x29,0x40,0x67,0x5a,0x53,0x55,0x5d,0x38,0x30,0x4a,0x32,0x19,0x85,0xb0,0x60,0x28,0x4f,0x76,0x4e,0x4a,0x74,0x61,0x54,0x53,0x5a,0x36,0x2e,0x4b,0x1a,0xfe,0x60,0x20,0x20,0x2e,0x2f,0x1f,0x21,0x21,0x1f,0x2f,0x2e,0x20,0x20,0x00,\r\n0x00,0x02,0x00,0xac,0xff,0x44,0x06,0xfc,0x05,0xae,0x00,0x32,0x00,0x3d,0x00,0xb9,0x40,0x10,0x0a,0x27,0x01,0x0a,0x32,0x01,0x03,0x00,0x1b,0x01,0x0f,0x19,0x01,0x10,0x05,0x1e,0xb8,0xff,0xc0,0x40,0x0f,0x0b,0x0c,0x00,0x4c,0x1c,0x40,0x0b,0x00,0x4d,0x18,0x40,0x0c,0x00,0x4d,0x16,0xb8,0xff,0xc0,0x40,0x4b,0x0c,0x00,0x4d,0x04,0x18,\r\n0x0b,0x00,0x4d,0x0d,0x00,0x03,0x09,0x09,0x33,0x4c,0x59,0x09,0x0f,0x31,0x14,0x03,0x39,0x03,0x39,0x4c,0x59,0x0f,0x03,0x0f,0x03,0x25,0x2b,0x2b,0x1a,0x4c,0x59,0x2b,0x04,0x00,0x22,0x10,0x22,0x02,0x0d,0x03,0x22,0x20,0x25,0x20,0x4c,0x59,0x25,0x00,0x0d,0x0f,0x10,0x12,0x05,0x3c,0x3c,0x2e,0x36,0x48,0x06,0x22,0x06,0x22,0x06,0x28,\r\n0x17,0x48,0x2e,0x1d,0x48,0x28,0x2f,0xe1,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x12,0x39,0x2f,0x17,0x33,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x10,0xc4,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x00,0x5d,0x01,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x37,0x33,0x02,0x15,0x14,0x33,0x32,0x36,0x35,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x37,0x15,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x02,0x23,0x22,0x03,0x22,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x8c,0x05,0x49,0xd6,0x89,0xa7,0xe7,0xbc,0x48,0x71,0x10,0x04,0x02,0x08,0x7d,0x2f,0x77,0x6c,0x8f,0xfe,0xa4,0xfe,0xcc,0xfe,0xd7,0xfe,0x7c,0x01,0x71,0x01,0x39,0xf7,0xaf,0xad,0xfe,0xfd,0xfe,0x94,0xfe,0x43,0x01,0xd3,0x01,0x6b,0x01,0x54,0x01,0xbe,0xeb,0xa9,0xdb,0xb4,0x7c,0x99,0x67,0x56,\r\n0x7c,0x91,0x01,0xa4,0xee,0xca,0xab,0xe2,0x01,0x2b,0x4a,0x38,0x1c,0x57,0xfd,0xd9,0x0a,0xcf,0xea,0xba,0x01,0x13,0x01,0x5c,0xfe,0x60,0xfe,0xc8,0xfe,0xcd,0xfe,0x87,0x52,0x7c,0x4a,0x01,0xb7,0x01,0x63,0x01,0x6e,0x01,0xe2,0xfe,0x6c,0xfe,0xbb,0xee,0xfe,0xcf,0x03,0x0e,0xec,0xaf,0x76,0x88,0xf7,0xcc,0xd6,0x00,0x00,0x02,0x00,0x16,\r\n0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0xd0,0x40,0x2c,0x07,0x07,0x01,0x08,0x06,0x01,0x09,0x10,0x0c,0x00,0x4d,0x02,0x08,0x09,0x0a,0x0b,0x01,0x0b,0x0d,0x0e,0x0f,0x03,0x04,0x0c,0x03,0x04,0x01,0x0c,0x01,0x01,0x10,0x03,0x01,0x10,0x0c,0x00,0x4d,0x04,0x18,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,\r\n0x01,0x4c,0x0c,0xb8,0xff,0xc0,0xb4,0x0b,0x0d,0x01,0x4c,0x0b,0xb8,0xff,0xc0,0x40,0x39,0x0b,0x0d,0x01,0x4c,0x0e,0x0d,0x09,0x0a,0x04,0x05,0x0b,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x40,0x12,0x16,0x48,0x0c,0x06,0x40,0x08,0x0f,0x02,0x03,0x0f,0x03,0x91,0x59,0x0f,0x0f,0x06,0x03,0x01,0x05,0x08,0x0f,0x0c,0x0b,0x03,0x02,0x0e,0x09,0x0d,\r\n0x0a,0x0a,0x05,0x77,0x05,0x01,0x78,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x00,0x2f,0x2f,0x3f,0x39,0x2f,0x2b,0x00,0x10,0x18,0xc4,0x10,0xc4,0x1a,0x10,0xdd,0x2b,0x2b,0xc4,0x12,0x17,0x39,0x31,0x30,\r\n0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x87,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x05,0xc0,0xc0,0x01,0x2b,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x9f,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x01,\r\n0x92,0xfe,0x6e,0x05,0x9a,0xfc,0x8f,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x00,0x00,0x03,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0xdc,0x40,0x0c,0x09,0x0d,0x01,0x06,0x0b,0x01,0x03,0x04,0x01,0x10,0x03,0x04,0xb8,0xff,0xe8,0x40,0x2e,0x0b,0x00,0x4d,0x08,0x18,0x11,0x11,0x18,0x91,0x59,0x11,\r\n0x11,0x19,0x01,0x00,0x19,0x91,0x59,0x00,0x12,0x01,0x10,0x91,0x59,0x01,0x03,0x09,0x19,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x7d,0x1d,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x1d,0xb8,0xff,0xf0,0x40,0x2f,0x0b,0x06,0x4d,0x1d,0x1d,0x05,0x06,0x0c,\r\n0x06,0x4d,0x05,0x7d,0x7f,0x15,0x01,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x15,0x21,0x11,0x19,0x08,0x0d,0x06,0x4d,0x19,0x08,0x0c,0x06,0x4d,0x19,0x08,0x0b,0x06,0x4d,0x19,0x7e,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x00,\r\n0x21,0x40,0x0b,0x00,0x4d,0x2b,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x2b,0x00,0x5f,0x5e,0x5d,0x5d,0x5d,0x33,0x11,\r\n0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0xbc,0x01,0x98,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,0xf8,0xc9,0xfa,0xac,0x8a,0x9e,0xfe,0xed,0xc1,0xe4,0x94,0xa3,0xfe,0xa6,0x05,0x9a,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,\r\n0x94,0xb8,0xe4,0x05,0x02,0xfe,0x31,0x85,0x79,0xd1,0xfd,0x9a,0xfd,0xfc,0x8c,0x7a,0xfe,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x00,0x15,0x00,0x99,0x40,0x0f,0x45,0x0a,0x01,0x49,0x00,0x01,0x4a,0x03,0x01,0x0f,0x17,0x01,0x0c,0x03,0x09,0xb8,0xff,0xc0,0x40,0x0c,0x0c,0x00,0x4d,0x03,0x18,0x0b,0x00,0x4d,0x0a,0x0b,\r\n0x00,0x15,0xb8,0xff,0xc0,0x40,0x43,0x0b,0x00,0x4d,0x15,0x15,0x13,0x02,0x13,0x91,0x59,0x02,0x13,0x00,0x0b,0x01,0x0c,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x00,0x0b,0x30,0x0b,0x0d,0x01,0x4c,0x3f,0x0b,0x01,0x0b,0x0b,0x17,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,\r\n0x08,0x0c,0x06,0x4d,0x05,0x13,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x33,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x33,0x11,0x33,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x00,0x11,0x10,\r\n0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x04,0x8c,0x9f,0xed,0xfe,0xce,0xfe,0x90,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0xd8,0x9e,0x3c,0x54,0x01,0x8a,0x01,0x40,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,0x00,0x02,\r\n0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x97,0x40,0x26,0x00,0x03,0x01,0x00,0x03,0x01,0x10,0x05,0x00,0x09,0x91,0x59,0x00,0x12,0x01,0x08,0x91,0x59,0x01,0x03,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7d,0x0d,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,\r\n0xf0,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xea,0x40,0x18,0x0b,0x06,0x4d,0x0d,0x0d,0x11,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7e,0x00,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0b,\r\n0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0xbc,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0xd6,\r\n0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x05,0x9a,0xfd,0x45,0xfe,0xb4,0xfe,0x6d,0x05,0x02,0xfb,0x96,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x00,0x0b,0x00,0x70,0x40,0x34,0x06,0x09,0x91,0x59,0x06,0x02,0x01,0x06,0x91,0x2b,0x30,0x06,0x0a,0x02,0x01,0x0a,0x91,0x59,0x01,0x12,0x02,0x05,0x91,0x59,\r\n0x02,0x03,0x04,0x08,0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x7e,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,\r\n0x33,0x33,0x2f,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0xb4,0xfd,0x08,0x02,0xd8,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0x05,0x9a,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0x94,\r\n0x05,0x9a,0x00,0x09,0x00,0x67,0x40,0x2c,0x02,0x05,0x91,0x59,0x0f,0x02,0x01,0x0b,0x03,0x02,0x02,0x08,0x07,0x12,0x08,0x01,0x91,0x59,0x08,0x03,0x04,0x04,0x00,0x00,0x0b,0x02,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf6,0xb3,\r\n0x0c,0x06,0x4d,0x07,0xb8,0xff,0xf6,0xb6,0x0b,0x06,0x4d,0x07,0x2f,0x0b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x94,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0xa8,\r\n0x02,0xd8,0x05,0x02,0xfe,0x10,0x97,0xfd,0x85,0x05,0x9a,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xec,0x05,0xb2,0x00,0x19,0x00,0xae,0x40,0x09,0x00,0x0a,0x01,0x0f,0x04,0x01,0x10,0x05,0x09,0xb8,0xff,0xc0,0x40,0x3b,0x0c,0x00,0x4d,0x18,0x17,0x91,0x59,0x18,0x18,0x08,0x00,0x15,0x13,0x02,0x13,0x91,0x59,0x02,0x13,0x0f,0x0b,0x1f,\r\n0x0b,0x02,0x0a,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x17,0x17,0x15,0x10,0x0b,0x0b,0x00,0x04,0x0d,0x06,0x4d,0x00,0x04,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x15,0xb8,0xff,0xee,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xee,0x40,0x22,0x0b,0x06,0x4d,0x15,0x15,0x1b,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,\r\n0x06,0x4d,0x10,0x7d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x33,0x12,0x39,0x18,0x2f,0x2b,\r\n0x31,0x30,0x00,0x2b,0x5f,0x5e,0x5d,0x5d,0x25,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x21,0x35,0x21,0x04,0xec,0xd8,0xfe,0xf8,0xfe,0xcd,0xfe,0x85,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc6,0x01,0xe2,0x62,\r\n0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xf0,0xfe,0xc9,0x43,0x01,0x92,0x98,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x00,0x0b,0x00,0x79,0x40,0x48,0x08,0x03,0x91,0x59,0x08,0x06,0x05,0x08,0x91,0x2b,0x30,0x01,0x12,0x05,0x12,0x0a,0x03,0x06,0x03,0x09,0x00,0x06,0x0d,0x06,\r\n0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x0d,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,\r\n0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,\r\n0x00,0x01,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x00,0x03,0x00,0x10,0xb6,0x00,0x7e,0x01,0x01,0x12,0x02,0x03,0x00,0x3f,0x3f,0x01,0x2f,0xe1,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x64,0xa8,0xa8,0x05,0x9a,0x00,0x01,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x00,0x0c,0x00,0x6d,0x40,0x17,0x00,0x09,0x01,0x00,0x01,0x01,0x0f,0x09,\r\n0x01,0x10,0x05,0x06,0x06,0x08,0x03,0x08,0x91,0x59,0x03,0x13,0x0b,0x03,0x05,0xb8,0xff,0xf0,0x40,0x1c,0x0d,0x06,0x4d,0x05,0x05,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x0a,0x18,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x0a,\r\n0x0a,0x0e,0x0d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x02,0x2b,0xd8,0xb5,0x54,0x36,0x36,0x56,0xe3,0xa8,0x02,0x02,0xff,0xfe,0xe5,0x18,\r\n0xa6,0x27,0x01,0x81,0x03,0x9a,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x10,0x00,0x9c,0x40,0x1c,0x7d,0x0e,0x01,0x29,0x0e,0x39,0x0e,0x02,0x7e,0x01,0x01,0x2a,0x01,0x3a,0x01,0x02,0x10,0x18,0x0c,0x0d,0x01,0x4c,0x10,0x10,0x0b,0x01,0x4d,0x0e,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x18,\r\n0x0b,0x0d,0x01,0x4c,0x0a,0x0e,0x10,0x01,0x05,0x05,0x08,0x07,0x12,0x08,0x03,0x0e,0x0f,0x0f,0x01,0x10,0x70,0x00,0x01,0x00,0xb8,0xff,0xe8,0x40,0x19,0x0d,0x06,0x4d,0x00,0x00,0x12,0x0a,0x05,0x06,0x0d,0x06,0x4d,0x05,0x06,0x0c,0x06,0x4d,0x05,0x06,0x0b,0x06,0x4d,0x05,0x7e,0x07,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,\r\n0xf8,0x40,0x09,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x11,0x33,0x2f,0x2b,0x5d,0x39,0x33,0x33,0x2f,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,\r\n0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x05,0x00,0x86,0x40,0x09,0x01,0x04,0x91,0x59,0x01,0x12,0x02,0x03,0x05,0xb8,0xff,0xf0,\r\n0xb3,0x10,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x05,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x05,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x05,0xb8,0xff,0xc0,0x40,0x18,0x0a,0x1f,0x48,0x05,0x05,0x07,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,\r\n0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf2,0x40,0x09,0x0c,0x06,0x4d,0x01,0x05,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x03,0xa4,\r\n0xfd,0x18,0xa8,0x02,0x40,0x05,0x9a,0xfa,0xfe,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x00,0x1b,0x00,0xba,0x40,0x15,0x7a,0x1a,0x01,0x75,0x13,0x01,0x26,0x13,0x36,0x13,0x02,0x72,0x16,0x01,0x16,0x18,0x0b,0x0d,0x01,0x4c,0x0d,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xe8,0x40,0x37,0x0b,0x0d,0x01,\r\n0x4c,0x16,0x1a,0x01,0x05,0x09,0x0d,0x06,0x12,0x11,0x12,0x12,0x03,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x1a,0x08,0x0d,0x06,0x4d,0x1a,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x01,0x06,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0xb5,0x0b,0x06,0x4d,0x01,0x1d,0x13,0xb8,0xff,\r\n0xf8,0x40,0x17,0x0d,0x06,0x4d,0x13,0x0d,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x7e,0x11,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x11,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x2b,0x12,0x39,0x2b,0x2b,0x2f,0x2b,0x5d,0x33,0x2b,0xe9,0x2b,0x2b,\r\n0x2b,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x06,0x72,0xa7,0x0e,0x04,0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x15,0x16,0x04,0x08,0xa2,0xde,\r\n0x01,0xb8,0x33,0x0f,0x06,0x2b,0x1a,0x01,0xc1,0xd2,0x03,0xc2,0x72,0xa5,0x61,0x2a,0xfb,0xb2,0x04,0x46,0x30,0x63,0x56,0xc3,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x73,0x39,0x76,0x3a,0x03,0xe4,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x00,0x13,0x00,0xad,0x40,0x0d,0x77,0x0c,0x01,0x72,0x0b,0x01,0x78,0x02,0x01,0x7d,0x01,0x01,\r\n0x0b,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x00,0x4d,0x0f,0x08,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xf8,0x40,0x2f,0x0b,0x0d,0x01,0x4c,0x0e,0x12,0x01,0x05,0x04,0x09,0x0a,0x03,0x09,0x01,0x0f,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x11,0x01,0x11,0x18,0x0d,0x06,0x4d,0x11,0x11,0x08,\r\n0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x11,0x15,0x0b,0x05,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x7e,0x09,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,\r\n0x39,0x32,0x12,0x39,0x2b,0x2b,0x2f,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x39,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x05,0x40,0xce,0xfd,0x1e,0x1c,0x12,0x06,0x08,0xa8,0xda,0x02,0xce,\r\n0x2d,0x0d,0x04,0x0a,0xa8,0x04,0x77,0x2b,0x2f,0x2e,0x97,0xfb,0xf4,0x05,0x9a,0xfb,0x9b,0x46,0x1a,0x3e,0x95,0x03,0xf2,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x81,0x40,0x1e,0x00,0x12,0x91,0x59,0x00,0x13,0x06,0x0c,0x91,0x59,0x06,0x04,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,\r\n0x09,0x06,0x0b,0x06,0x4d,0x09,0x7d,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xea,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x15,0x30,0x15,0x02,0x15,0x15,0x19,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,\r\n0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,\r\n0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xfe,0xd4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x05,0x32,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,\r\n0x36,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x90,0x40,0x29,0x46,0x06,0x01,0x02,0x0f,0x01,0x0c,0x04,0x0c,0x00,0x91,0x59,0x0c,0x0c,0x03,0x02,0x12,0x03,0x0b,0x91,0x59,0x03,0x03,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7d,0x10,0xb8,0xff,0xe8,\r\n0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x10,0x10,0x0b,0x06,0x4d,0x10,0x10,0x14,0x0c,0x01,0x06,0x0d,0x06,0x4d,0x01,0x06,0x0c,0x06,0x4d,0x01,0x06,0x0b,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x02,0x04,0x0b,0x06,0x4d,0x02,0x2f,0x2b,\r\n0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x01,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0x01,0x8a,0xe6,0xfd,0xfe,0xe7,0xef,0xbd,\r\n0xb0,0xae,0xb7,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0xe0,0xcc,0xcc,0xfe,0xfc,0x02,0xe4,0xfd,0xb4,0x9f,0x91,0x01,0x1c,0x00,0x02,0x00,0x5e,0xff,0x3f,0x06,0x25,0x05,0xb2,0x00,0x14,0x00,0x24,0x00,0x36,0x40,0x1a,0x13,0x10,0x04,0x11,0x0c,0x0c,0x21,0x19,0x04,0x13,0x10,0x00,0x08,0x08,0x15,0x91,0x59,0x08,0x04,0x00,0x1d,0x91,\r\n0x59,0x12,0x00,0x13,0x00,0x3f,0xc6,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x33,0x2f,0x33,0x10,0xc6,0x12,0x39,0x39,0x31,0x30,0x05,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x07,0x01,0x21,0x25,0x06,0x03,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x11,\r\n0x10,0x27,0x26,0x02,0xfe,0xfe,0xd0,0xb9,0xb7,0xbb,0xbc,0x01,0x41,0x01,0x28,0xb6,0xb6,0xba,0x2c,0x32,0x01,0x93,0xfe,0xcf,0xfe,0xf2,0x6a,0x72,0xe2,0x8d,0x8d,0x89,0x8a,0xdd,0xec,0x88,0x88,0x84,0x84,0x18,0xc9,0xc9,0x01,0x42,0x01,0x5b,0xcd,0xce,0xc8,0xc8,0xfe,0xbd,0xfe,0xa1,0xcc,0x31,0x23,0xfe,0xdf,0xca,0x21,0x05,0x32,0xa3,\r\n0xa3,0xfe,0xf7,0xfe,0xf8,0xa3,0xa1,0x9a,0x9a,0x01,0x15,0x01,0x1d,0x9a,0x9b,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0xc0,0x05,0x9a,0x00,0x1c,0x00,0x27,0x00,0xbb,0x40,0x3a,0x45,0x0f,0x01,0x03,0x40,0x0e,0x01,0x0f,0x02,0x01,0x0c,0x05,0x17,0x1e,0x08,0x08,0x1e,0x91,0x59,0x08,0x08,0x0a,0x1d,0x0b,0x1d,0x91,0x59,0x0b,0x03,0x01,\r\n0x0a,0x17,0x09,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x24,0x7d,0x11,0x79,0x02,0x01,0x7a,0x01,0x01,0x02,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x26,0x0b,0x0d,0x01,0x4c,0x01,0x1c,0x02,0x11,0x04,0x70,0x00,0x01,0x00,0x08,0x0d,0x06,0x4d,0x00,0x29,0x1e,0x09,0x06,\r\n0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7e,0x0a,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x10,0xc6,0x2b,0x5d,0x17,0x32,0x2b,0x2b,0x5d,0x5d,0x2f,0xe1,0x2b,0x2b,0x2b,\r\n0x12,0x39,0x00,0x2f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x5d,0x5f,0x5d,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x04,0xc0,0xc8,0xf0,\r\n0x21,0x3e,0x41,0x4b,0x2f,0x8a,0xa8,0x01,0xac,0x5e,0x9f,0x75,0x42,0x2d,0x53,0x75,0x49,0x24,0x35,0x30,0x2f,0x1d,0xfd,0xb1,0xe4,0x3f,0x6b,0x4e,0x2c,0x95,0x8d,0x01,0x92,0x38,0x4f,0x32,0x17,0xfd,0x9e,0x05,0x9a,0x2f,0x60,0x8f,0x60,0x4b,0x7d,0x62,0x45,0x13,0x04,0x10,0x29,0x38,0x47,0x2f,0x03,0x53,0xfd,0xf8,0x26,0x47,0x67,0x40,\r\n0x73,0x81,0x00,0x01,0x00,0x79,0xff,0xe8,0x03,0xde,0x05,0xb2,0x00,0x35,0x00,0xd2,0x40,0x15,0x4b,0x35,0x01,0x4a,0x2e,0x01,0x46,0x25,0x01,0x44,0x1a,0x01,0x46,0x15,0x01,0x34,0x18,0x0c,0x00,0x4d,0x2a,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x28,0xb8,0xff,0xf0,0xb3,0x0c,0x00,0x4d,0x19,0xb8,0xff,0xe8,0x40,0x56,0x0c,0x00,0x4d,0x11,\r\n0x18,0x0c,0x00,0x4d,0x09,0x2c,0x13,0x22,0x04,0x18,0x31,0x1a,0x00,0x01,0x00,0x1b,0x01,0x0c,0x03,0x1b,0x18,0x40,0x18,0x1d,0x91,0x59,0x18,0x04,0x00,0x01,0x01,0x0b,0x03,0x01,0x31,0x31,0x06,0x91,0x59,0x31,0x13,0x1b,0x1b,0x2c,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0x08,0x0b,0x06,0x4d,0x22,0x7d,0x13,0x13,0x01,\r\n0x2c,0x08,0x0d,0x06,0x4d,0x2c,0x08,0x0c,0x06,0x4d,0x2c,0x08,0x0b,0x06,0x4d,0x2c,0x7d,0x09,0xb8,0xff,0xf0,0x40,0x0f,0x0b,0x06,0x4d,0x20,0x09,0x01,0x09,0x09,0x37,0x01,0x08,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,\r\n0x10,0xc4,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x11,0x33,0x32,0x11,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x37,0x35,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,\r\n0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x79,0x22,0x5f,0x69,0x6a,0x2d,0x9b,0x99,0x33,0x5a,0x7b,0x47,0x4b,0x82,0x60,0x37,0x56,0x8c,0xb3,0x5d,0xd4,0x61,0x7f,0xc7,0x37,0x6e,0x56,0x36,0x29,0x50,0x73,0x4b,0x4d,0x8a,0x68,0x3d,0x53,0x8d,0xb8,0x66,0x22,0x64,0x68,0x5d,0x3a,0xc6,0x1e,0x30,0x21,0x12,0x73,0x6c,\r\n0x3a,0x56,0x47,0x41,0x24,0x26,0x4e,0x5e,0x77,0x50,0x62,0x91,0x5e,0x2e,0x33,0xbd,0x58,0x17,0x34,0x52,0x3b,0x37,0x50,0x42,0x3e,0x25,0x26,0x54,0x66,0x7c,0x50,0x6a,0x93,0x5c,0x29,0x0b,0x15,0x1f,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x07,0x00,0x7e,0x40,0x0b,0x03,0x12,0x01,0x05,0x06,0x05,0x91,0x59,0x06,0x03,\r\n0x05,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x28,0x0b,0x06,0x4d,0x00,0x05,0x00,0x0e,0x02,0x03,0x05,0x42,0xcf,0x05,0x01,0x05,0x05,0x08,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0x04,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x03,0x03,\r\n0x09,0x08,0x09,0x40,0x0c,0x00,0x4d,0x09,0xb8,0xff,0xc0,0xb2,0x0b,0x00,0x4d,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xe2,0x18,0x2f,0x2e,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xa8,0xfe,\r\n0x63,0x03,0xe3,0x05,0x02,0xfa,0xfe,0x05,0x02,0x98,0x00,0x01,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x05,0x9a,0x00,0x0d,0x00,0x7a,0x40,0x31,0x02,0x0a,0x12,0x0a,0x02,0x02,0x08,0x12,0x08,0x02,0x0b,0x04,0x02,0x09,0x91,0x59,0x02,0x13,0x0c,0x03,0x05,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,\r\n0x7e,0x7f,0x0b,0x01,0x0b,0x0c,0x0d,0x06,0x4d,0x0b,0x0b,0xb8,0xff,0xfa,0x40,0x17,0x0c,0x06,0x4d,0x0b,0x0f,0x07,0x06,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x7e,0x04,0xb8,0xff,0xfe,0x40,0x09,0x0d,0x06,0x4d,0x04,0x04,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2b,0x2f,\r\n0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x3f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x00,0x01,0x00,0x12,\r\n0x00,0x00,0x04,0xe6,0x05,0x9a,0x00,0x0b,0x00,0xc8,0x40,0x0a,0x7b,0x0b,0x01,0x74,0x04,0x01,0x78,0x02,0x01,0x0b,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x0b,0xb8,0xff,0xe0,0xb3,0x0d,0x01,0x4d,0x0b,0xb8,0xff,0xe0,0x40,0x22,0x0b,0x01,0x4d,0x04,0x30,0x0c,0x01,0x4d,0x04,0x20,0x0d,0x01,0x4d,0x04,0x20,0x0b,0x01,0x4d,0x39,0x0b,0x01,\r\n0x36,0x04,0x01,0x74,0x07,0x01,0x07,0x28,0x0b,0x0d,0x01,0x4c,0x07,0xb8,0xff,0xf0,0x40,0x19,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x0b,0x07,0x02,0x03,0x03,0x02,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0x40,0x11,0x0b,0x06,0x4d,0x0b,0x28,0x00,0x01,0x00,\r\n0x08,0x0c,0x0d,0x01,0x4c,0x00,0x00,0x0d,0x04,0xb8,0xff,0xf8,0x40,0x0f,0x0d,0x06,0x4d,0x04,0x04,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x03,0xb8,0xff,0xf8,0xb7,0x0c,0x0d,0x01,0x4c,0x27,0x03,0x01,0x03,0x2f,0x5d,0x2b,0x33,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x2b,0x5d,0x32,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2b,\r\n0x2b,0x2b,0x2b,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0xe6,0xfd,0xed,0xb9,0xfd,0xf8,0xbb,0x01,0x8d,0x13,0x0a,0x04,0x08,0x19,0x01,0x95,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfb,0x8f,0x37,0x48,0x3c,0x45,0x04,0x6f,0x00,0x00,0x01,\r\n0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x00,0x1b,0x01,0x41,0x40,0x20,0x7b,0x1b,0x01,0x79,0x1a,0x01,0x76,0x14,0x01,0x76,0x0d,0x01,0x73,0x0c,0x01,0x75,0x09,0x01,0x7b,0x02,0x01,0x1b,0x20,0x0c,0x00,0x4d,0x1a,0x20,0x0c,0x00,0x4d,0x14,0xb8,0xff,0xe8,0x40,0x09,0x0b,0x00,0x4d,0x13,0x18,0x0b,0x00,0x4d,0x0d,0xb8,0xff,0xe0,0xb3,\r\n0x0c,0x00,0x4d,0x0c,0xb8,0xff,0xe0,0x40,0x0a,0x0c,0x00,0x4d,0x0a,0x08,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x00,0x4d,0x08,0x10,0x0b,0x00,0x4d,0x02,0x10,0x0b,0x00,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x1b,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x1b,0xb8,0xff,0xe0,0xb3,\r\n0x0d,0x01,0x4d,0x1b,0xb8,0xff,0xe8,0x40,0x13,0x0b,0x01,0x4d,0x0c,0x30,0x0c,0x01,0x4d,0x0c,0x20,0x0d,0x01,0x4d,0x0c,0x18,0x0b,0x01,0x4d,0x05,0xb8,0xff,0xc8,0x40,0x22,0x0b,0x0d,0x01,0x4c,0x17,0x38,0x0b,0x0d,0x01,0x4c,0x0f,0x38,0x0b,0x0d,0x01,0x4c,0x17,0x40,0x0b,0x0c,0x00,0x4c,0x0f,0x40,0x0b,0x0c,0x00,0x4c,0x05,0x10,0x0d,\r\n0x06,0x4d,0x17,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xf0,0x40,0x1d,0x0d,0x06,0x4d,0x00,0x01,0x05,0x0f,0x13,0x17,0x06,0x0a,0x0b,0x03,0x0a,0x14,0x13,0x06,0x01,0x02,0x17,0x09,0x0a,0x0f,0x17,0x20,0x0b,0x00,0x4d,0x0f,0xb8,0xff,0xe0,0xb3,0x0b,0x00,0x4d,0x17,0xb8,0xff,0xe0,0x40,0x14,0x0c,0x00,0x4d,0x0f,0x20,0x0c,\r\n0x00,0x4d,0x0f,0x06,0x17,0x03,0x0b,0x00,0x00,0x1d,0x0b,0x2f,0x1d,0x01,0x5d,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x07,0x60,0xfe,0x6b,0xc5,0xfe,0xd9,0x13,0x04,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x13,0x05,0x05,\r\n0x05,0x1a,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x04,0x17,0x01,0x25,0x05,0x9a,0xfa,0x66,0x04,0x18,0x43,0x4f,0x4a,0x46,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x35,0x5b,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x34,0x56,0x04,0x50,0x00,0x01,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x00,0x15,0x00,0xc0,0x40,0x19,0x7b,0x13,0x01,0x7a,\r\n0x12,0x01,0x75,0x0d,0x01,0x74,0x0c,0x01,0x74,0x08,0x01,0x75,0x07,0x01,0x79,0x02,0x01,0x7b,0x01,0x01,0x13,0xb8,0xff,0xe0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0c,0x20,0x0b,0x0d,0x01,0x4c,0x08,0x20,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x13,0x08,0x0c,0x00,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,0x0c,\r\n0x00,0x4d,0x0a,0x10,0x0b,0x00,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x0f,0x0c,0x00,0x4d,0x01,0x08,0x0c,0x00,0x4d,0x0f,0x18,0x0b,0x0d,0x01,0x4c,0x05,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x0f,0xb8,0xff,0xf0,0x40,0x1f,0x0d,0x06,0x4d,0x05,0x10,0x0d,0x06,0x4d,0x01,0x05,0x0f,0x13,0x04,0x09,0x0b,0x03,0x09,0x15,0x0a,0x0b,0x14,0x00,\r\n0x10,0x0b,0x00,0x4d,0x00,0x00,0x17,0x0b,0x09,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,0x09,0x2f,0x2b,0xc6,0x11,0x33,0x2f,0x2b,0xc6,0x11,0x39,0x39,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,\r\n0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x04,0x9a,0xcd,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xe0,0xfe,0x46,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,0x3d,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0xd1,0x02,0xc9,0xfe,0x08,0x32,0x32,0x42,0x26,\r\n0x01,0xf4,0xfd,0x39,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x0d,0x00,0x65,0x40,0x21,0x73,0x06,0x01,0x04,0x09,0x01,0x01,0x05,0x03,0x12,0x0d,0x03,0x05,0x03,0x09,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xfe,\r\n0x40,0x16,0x0b,0x06,0x4d,0x03,0x03,0x05,0x0d,0x7d,0x00,0x00,0x0f,0x06,0x18,0x0b,0x0d,0x01,0x4c,0x06,0x05,0x20,0x0f,0x01,0x5d,0x2f,0x33,0x2b,0x11,0x33,0x2f,0xe9,0x11,0x39,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x39,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xcd,0x33,0x31,0x30,0x01,0x5d,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x16,\r\n0x17,0x33,0x36,0x37,0x01,0x04,0x60,0xfe,0x27,0xa8,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x0a,0x1c,0x01,0x50,0x05,0x9a,0xfc,0x78,0xfd,0xee,0x02,0x0e,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x22,0x36,0x02,0x88,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x09,0x00,0xa6,0x40,0x0e,0x0c,0x06,0x01,0x04,0x01,0x01,0x10,0x01,\r\n0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xe0,0x40,0x31,0x0b,0x0d,0x01,0x4c,0x35,0x00,0x45,0x00,0x02,0x03,0x00,0x13,0x00,0x23,0x00,0x03,0x3a,0x05,0x4a,0x05,0x02,0x0c,0x05,0x1c,0x05,0x2c,0x05,0x03,0x17,0x03,0x05,0x01,0x04,0x04,0x01,0x91,0x59,0x04,0x12,0x00,0x08,0x07,0x08,0x07,0x91,0x59,0x08,0x03,0x06,0xb8,0xff,0xf8,0x40,\r\n0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x2b,0x2b,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xb8,0x03,0x34,0xfb,0xd1,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x26,0x98,0x2f,0x04,0xd3,0x98,0x00,0x00,0x01,\r\n0x00,0xc8,0xfe,0xba,0x02,0x38,0x05,0x9a,0x00,0x07,0x00,0x39,0x40,0x11,0x02,0x05,0xd9,0x59,0x02,0x03,0x01,0x06,0xd9,0x59,0x01,0x20,0x04,0x00,0x06,0xea,0x01,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xe8,0x40,0x09,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0xdd,0xc4,0x00,0x3f,0x2b,0x00,\r\n0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x23,0x11,0x33,0x02,0x38,0xfe,0x90,0x01,0x70,0xde,0xde,0xfe,0xba,0x06,0xe0,0x77,0xfa,0x0e,0x00,0x01,0xff,0xe6,0xff,0x10,0x03,0x1e,0x05,0x9a,0x00,0x03,0x00,0x19,0x40,0x0d,0x78,0x01,0x01,0x00,0x08,0x0b,0x00,0x4d,0x00,0x02,0x03,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x2f,0x31,0x30,\r\n0x01,0x2b,0x5d,0x05,0x23,0x01,0x33,0x03,0x1e,0x97,0xfd,0x5f,0x9b,0xf0,0x06,0x8a,0x00,0x01,0x00,0x35,0xfe,0xba,0x01,0xa4,0x05,0x9a,0x00,0x07,0x00,0x35,0x40,0x1b,0x06,0x05,0xd9,0x59,0x06,0x03,0x01,0x02,0xd9,0x59,0x01,0x20,0x05,0x01,0x00,0xea,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xee,0xb3,0x0b,\r\n0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xdd,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x01,0xa4,0xfe,0x91,0xdd,0xdd,0x01,0x6f,0xfe,0xba,0x77,0x05,0xf2,0x77,0x00,0x00,0x01,0x00,0xe6,0x02,0x70,0x04,0x96,0x05,0xb2,0x00,0x07,0x00,0x26,0x40,0x16,0x79,0x06,0x01,0x79,0x01,0x01,\r\n0x07,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x05,0x03,0x07,0x04,0x2f,0x00,0x01,0x00,0x05,0x2f,0x2f,0x5d,0x00,0x3f,0x33,0x2f,0xc4,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x01,0x23,0x01,0x23,0x01,0x23,0x01,0x33,0x04,0x96,0x96,0xfe,0xb4,0x06,0xfe,0xcb,0x93,0x01,0xa6,0x41,0x02,0x70,0x02,0x6b,0xfd,0x95,0x03,0x42,0x00,0x01,0x00,0x00,0xfe,0xd7,\r\n0x03,0x52,0xff,0x4e,0x00,0x03,0x00,0x0f,0xb6,0x01,0x02,0xd9,0x59,0x01,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0xfe,0xd7,0x77,0x00,0x01,0x00,0x52,0x04,0xc2,0x01,0xd7,0x06,0x0a,0x00,0x03,0x00,0x1c,0xb7,0x77,0x03,0x01,0x03,0x80,0x01,0x00,0x02,0xb8,0xff,0xc0,0xb3,0x0d,\r\n0x10,0x48,0x02,0x2f,0x2b,0xcd,0x00,0x2f,0x1a,0xcd,0x31,0x30,0x01,0x5d,0x01,0x23,0x01,0x33,0x01,0xd7,0x7f,0xfe,0xfa,0xa8,0x04,0xc2,0x01,0x48,0x00,0x02,0x00,0x5a,0xff,0xe8,0x03,0x83,0x04,0x18,0x00,0x14,0x00,0x1f,0x00,0xaa,0x40,0x52,0x06,0x10,0x01,0x00,0x09,0x01,0x10,0x04,0x06,0x18,0x0b,0x0c,0x00,0x4c,0x0b,0x15,0x96,0x59,\r\n0x0b,0x10,0x0d,0x06,0x4d,0x0b,0x0b,0x1c,0x12,0x01,0x15,0x03,0x1c,0x05,0x1c,0x95,0x59,0x05,0x16,0x0f,0x40,0x09,0x0c,0x48,0x0f,0x0f,0x0d,0x12,0x0d,0x95,0x59,0x12,0x10,0x20,0x0f,0x30,0x0f,0x02,0x0f,0x0b,0x1f,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0x02,0x0d,0x06,0x4d,0x01,\r\n0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xee,0x40,0x17,0x0b,0x06,0x4d,0x01,0x01,0x21,0x0f,0x19,0x83,0x08,0x0c,0x0c,0x06,0x4d,0x08,0x04,0x0b,0x06,0x4d,0x2f,0x08,0x01,0x08,0x2f,0x5d,0x2b,0x2b,0xe9,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x33,0x2f,0x5d,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,\r\n0x2b,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x31,0x30,0x00,0x2b,0x5f,0x5e,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x03,0x83,0xa4,0x04,0x6b,0xd0,0x99,0xad,0x01,0x52,\r\n0x01,0x33,0xd3,0xb9,0x95,0x97,0xc5,0x01,0x69,0xa4,0xf7,0x72,0x74,0x6b,0x59,0x7a,0x9f,0xa0,0xb8,0xa2,0x86,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xfe,0x82,0x94,0x22,0x10,0x51,0x67,0x4b,0x5f,0xab,0x83,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,\r\n0x06,0x03,0x15,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x07,0x1b,0x09,0x1b,0x95,0x59,0x09,0x10,0x04,0x00,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,\r\n0x18,0x1f,0x06,0x02,0x12,0x06,0x0d,0x06,0x4d,0x12,0x06,0x0c,0x06,0x4d,0x12,0x06,0x0b,0x06,0x4d,0x12,0x84,0x03,0xb8,0xff,0xf8,0x40,0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,\r\n0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x15,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,\r\n0xcb,0x6c,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0x94,0x05,0xec,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x00,0x15,0x00,0x85,0x40,0x5b,0x58,0x03,0x01,0x09,0x0f,0x19,0x0f,0x02,0x0b,0x00,0x15,0x01,0x0c,0x03,\r\n0x15,0x15,0x13,0x02,0x13,0x95,0x59,0x02,0x16,0x0b,0x0b,0x0d,0x08,0x0d,0x95,0x59,0x08,0x10,0x00,0x20,0x0c,0x01,0x4d,0x00,0x00,0x0b,0x0c,0x0c,0x06,0x4d,0x0b,0x02,0x0b,0x06,0x4d,0x70,0x0b,0x01,0x0b,0x20,0x0c,0x01,0x4d,0x0b,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x83,0x05,0x14,0x0d,\r\n0x06,0x4d,0x05,0x0c,0x0c,0x06,0x4d,0x05,0x23,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x2f,0x2b,0x5d,0x2b,0x2b,0x33,0x2f,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x5e,0x5d,0x01,0x5d,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,\r\n0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x60,0x76,0xa2,0xdb,0xfe,0xf3,0x01,0x22,0xf2,0x87,0x67,0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x86,0x76,0x2f,0x47,0x01,0x1d,0xe3,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0xb4,0xd0,0x59,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9b,\r\n0x40,0x38,0x0f,0x06,0x01,0x10,0x06,0x1c,0x18,0x0b,0x0c,0x00,0x4c,0x02,0x1b,0x05,0x1b,0x95,0x59,0x05,0x16,0x01,0x15,0x0e,0x15,0x0b,0x15,0x95,0x59,0x0b,0x10,0x0f,0x00,0x11,0x0d,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,\r\n0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x18,0x06,0x0d,0x06,0x4d,0x18,0x06,0x0c,0x06,0x4d,0x18,0x06,0x0b,0x06,0x4d,0x18,0x83,0x08,0x10,0x0d,0x06,0x4d,0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,\r\n0xe9,0x2b,0x2b,0x2b,0x33,0x33,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,\r\n0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfb,0xe3,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xdd,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0xaf,0xb5,0x0f,0x07,0x01,0x10,0x06,0x06,0xb8,0xff,0xc0,\r\n0x40,0x2d,0x0b,0x0e,0x48,0x06,0x06,0x01,0x04,0x19,0x01,0x95,0x59,0x19,0x19,0x04,0x0f,0x09,0x04,0x95,0x59,0x09,0x16,0x0f,0x16,0x95,0x59,0x0f,0x10,0x7f,0x07,0x01,0x07,0x16,0x0c,0x06,0x4d,0x07,0x20,0x0c,0x01,0x4d,0x07,0x07,0x00,0x83,0x13,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x13,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x13,\r\n0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x13,0xb8,0xff,0xe8,0x40,0x28,0x0b,0x06,0x4d,0x13,0x13,0x1b,0x19,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x83,0x0c,0x10,0x0d,0x06,0x4d,0x0c,0x10,0x0c,0x06,0x4d,0x0c,0x1d,0x0b,0x06,0x4d,0x0c,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,\r\n0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x32,0x2f,0x2b,0x2b,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x03,\r\n0xdd,0xfd,0x2d,0x04,0xb0,0x9a,0xad,0x91,0x87,0xde,0xd9,0xf8,0x01,0x0f,0xc9,0xc9,0xdc,0xa8,0x01,0x87,0x78,0x74,0xa2,0x13,0x01,0xd7,0xab,0xba,0x72,0x9a,0x62,0x01,0x17,0xfd,0xef,0x01,0x2d,0xfe,0xfc,0xe7,0x35,0x8e,0x9e,0xa6,0x86,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x14,0x00,0x8a,0xb9,0x00,0x10,0xff,\r\n0xc0,0x40,0x3a,0x0b,0x00,0x4d,0x0a,0x15,0x00,0x00,0x02,0x08,0x0c,0x05,0x0d,0x0d,0x0c,0x95,0x59,0x0d,0x0f,0x12,0x02,0x95,0x59,0x12,0x01,0x07,0x07,0x00,0x0c,0x0c,0x06,0x4d,0x2f,0x00,0x01,0x00,0x0c,0x00,0x0c,0x05,0x0e,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,\r\n0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xe6,0x40,0x0a,0x0b,0x06,0x4d,0x0a,0x0a,0x16,0x15,0x2f,0x16,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x33,0x2f,0x2f,0x5d,0x2b,0x33,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x11,0x33,0x12,0x39,\r\n0x18,0x2f,0x3f,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x02,0xa0,0x30,0x3d,0xac,0xf0,0xf0,0xa3,0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x10,\r\n0x04,0x18,0x00,0x18,0x00,0x25,0x00,0xca,0x40,0x10,0x0a,0x04,0x01,0x03,0x0f,0x0e,0x01,0x10,0x06,0x24,0x18,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe0,0xb4,0x0b,0x0c,0x00,0x4c,0x05,0xb8,0xff,0xc0,0x40,0x3a,0x0b,0x0f,0x48,0x05,0x05,0x07,0x02,0x07,0x95,0x59,0x02,0x1c,0x0a,0x23,0x0d,0x23,0x95,0x59,0x0d,0x16,0x17,0x0f,0x15,0x1d,\r\n0x13,0x1d,0x95,0x59,0x13,0x10,0x04,0x15,0x19,0x16,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x09,0x05,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf0,0x40,0x2b,0x0b,0x06,0x4d,0x09,0x09,0x27,0x04,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,\r\n0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x10,0x10,0x0d,0x06,0x4d,0x10,0x0e,0x0c,0x06,0x4d,0x10,0x1a,0x0b,0x06,0x4d,0x10,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x17,0x33,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,\r\n0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5f,0x5d,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xfd,0xe4,0xbe,0x8e,0xad,0x9d,\r\n0x01,0x7a,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xa4,0xa4,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x52,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x11,0xe6,0x01,0x05,0x01,0x34,0xa6,0x8e,0xfd,0xcf,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x11,\r\n0x00,0x96,0x40,0x28,0x02,0x10,0x01,0x02,0x10,0x01,0x10,0x04,0x01,0x15,0x09,0x15,0x0c,0x04,0x0f,0x04,0x95,0x59,0x0f,0x10,0x0a,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,\r\n0x1e,0x0b,0x06,0x4d,0x01,0x01,0x13,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,\r\n0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x05,\r\n0xec,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x02,0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x00,0x0b,0x00,0x0f,0x00,0x4e,0x40,0x23,0x00,0x06,0x63,0x5b,0x00,0x0e,0x0f,0x0d,0x09,0x62,0x03,0x0d,0x0c,0x03,0x62,0xff,0x30,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x84,0x0d,0xb8,0xff,0xfe,0xb3,0x0c,\r\n0x06,0x4d,0x0d,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x0d,0x0d,0x11,0x10,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x3f,0xc6,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0xfa,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x23,0xa4,0xa4,0x05,\r\n0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xfa,0xfc,0x04,0x00,0x00,0x00,0x02,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x00,0x0c,0x00,0x18,0x00,0x6b,0x40,0x34,0x02,0x02,0x01,0x10,0x04,0x0d,0x13,0x63,0x5b,0x0d,0x0b,0x0f,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,0x1c,0x16,0x62,0x10,0x0a,0x00,0x10,0x62,0xff,0x30,0x06,0x00,\r\n0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0a,0x01,0x0a,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x0a,0x0a,0x1a,0x19,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0xc6,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,\r\n0x3f,0xc6,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0xa4,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x03,0xf0,0x01,\r\n0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x0c,0x00,0x9b,0x40,0x10,0x7a,0x0c,0x01,0x77,0x0b,0x01,0x79,0x02,0x01,0x7d,0x0a,0x01,0x7e,0x01,0x01,0x0c,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x00,0x4d,0x01,0x10,0x0b,0x00,0x4d,0x00,0xb8,0xff,0xf0,0x40,0x22,0x0c,0x00,0x4d,\r\n0x09,0x02,0x0a,0x05,0x01,0x15,0x05,0x15,0x0a,0x0f,0x06,0x00,0x0a,0x0b,0x0b,0x01,0x70,0x00,0x01,0x00,0x14,0x0b,0x06,0x4d,0x00,0x40,0x0b,0x01,0x4d,0x00,0x0c,0xb8,0xff,0xe8,0x40,0x1c,0x0d,0x06,0x4d,0x0c,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,\r\n0xb8,0xff,0xff,0xb6,0x0b,0x06,0x4d,0x05,0x2f,0x0e,0x01,0x5d,0x2f,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x2b,0x2f,0x2b,0x2b,0x5d,0x33,0x33,0x2f,0x33,0x00,0x3f,0x3f,0x3f,0x3f,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,\r\n0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x05,0xec,0xfc,0x3f,0x01,0xd5,0xfe,0x12,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x00,0x03,0x00,0x3a,0x40,0x16,0x01,0x15,0x02,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,\r\n0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x01,0x01,0x05,0x04,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x4a,0xa4,0xa4,0x05,0xec,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0x54,0x04,0x18,0x00,0x1f,0x00,0xdd,0xb6,0x49,0x0c,0x01,0x49,0x04,\r\n0x01,0x1e,0xb8,0xff,0xe8,0xb7,0x0b,0x00,0x4d,0x0f,0x21,0x01,0x03,0x1c,0xb8,0xff,0xd0,0x40,0x2c,0x0c,0x00,0x4d,0x02,0x16,0x01,0x0c,0x04,0x05,0x15,0x16,0x1b,0x04,0x0d,0x18,0x0d,0x95,0x59,0x1d,0x18,0x10,0x13,0x0f,0x0a,0x01,0x12,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,\r\n0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xec,0x40,0x1c,0x0b,0x06,0x4d,0x01,0x0e,0x0a,0x12,0x0a,0x42,0x14,0x11,0x06,0x0d,0x06,0x4d,0x11,0x06,0x0c,0x06,0x4d,0x11,0x06,0x0b,0x06,0x4d,0x11,0x84,0x12,0xb8,0xff,0xfa,0x40,0x31,0x0c,0x06,0x4d,0x12,0x0e,0x0b,0x06,0x4d,0x12,0x1b,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,\r\n0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x84,0x0a,0x0a,0x04,0x0d,0x06,0x4d,0x0a,0x40,0x0d,0x01,0x4d,0x0f,0x0a,0x01,0x0c,0x03,0x20,0x21,0x0a,0x84,0x30,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x39,0x18,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,\r\n0x2f,0x33,0x33,0x3f,0x3f,0x33,0x2b,0x11,0x00,0x17,0x33,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x2b,0x5d,0x5d,0x21,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x06,0x54,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,\r\n0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0x02,0x4c,0xaa,0x98,0xc0,0x86,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb5,0x91,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x96,0x40,0x28,0x02,0x11,0x01,0x02,0x10,0x01,0x10,0x04,\r\n0x01,0x15,0x09,0x15,0x0a,0x0f,0x0c,0x04,0x0f,0x04,0x95,0x59,0x0f,0x10,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0c,0x08,0x06,0x0d,0x06,\r\n0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x14,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,\r\n0x18,0x3f,0x3f,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0x00,0x02,0x00,0x60,0xff,0xe8,\r\n0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x89,0x40,0x23,0x19,0x40,0x0b,0x02,0x4d,0x00,0x12,0x95,0x59,0x00,0x16,0x06,0x0c,0x95,0x59,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x20,\r\n0x15,0x30,0x15,0x02,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,\r\n0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,\r\n0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,0x06,0x03,0x1b,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x04,0x0f,0x06,0x1b,0x09,0x1b,0x95,\r\n0x59,0x09,0x10,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,0x18,0x1f,0x06,0x12,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,\r\n0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,\r\n0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x70,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x05,0xd7,0xb4,0xcc,0xfe,\r\n0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x10,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x95,0x40,0x35,0x1c,0x18,0x0b,0x0c,0x00,0x4c,0x01,0x1b,0x03,0x1b,0x05,0x1b,0x95,0x59,0x05,0x16,0x0f,0x0f,0x0d,0x15,0x0b,0x15,0x95,0x59,0x0b,0x10,0x0d,0x11,0x0e,0x03,\r\n0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x18,0x06,0x0d,0x06,0x4d,0x18,0x06,0x0c,0x06,0x4d,0x18,0x06,0x0b,0x06,0x4d,0x18,0x83,0x08,0x10,0x0d,0x06,0x4d,\r\n0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x17,0x33,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x2b,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,\r\n0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x6b,0xf3,0xc1,0xe9,0x01,0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xa4,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0xfe,0x29,0x02,0x87,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfd,0xcd,0x95,0x7e,0xae,0xdb,0xc7,0xb1,\r\n0xc9,0xc5,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x10,0x00,0x59,0xb9,0x00,0x0c,0xff,0xe8,0x40,0x27,0x0b,0x0c,0x00,0x4c,0x07,0x15,0x08,0x0f,0x00,0x00,0x0a,0x02,0x0e,0x10,0x70,0x00,0x01,0x00,0x00,0x12,0x0a,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x84,0x07,0xb8,0xff,\r\n0xf3,0x40,0x0e,0x0d,0x06,0x4d,0x07,0x04,0x0c,0x06,0x4d,0x07,0x05,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x2f,0x5d,0x00,0x3f,0xcd,0x32,0x32,0x2f,0x3f,0x3f,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,\r\n0xa4,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfd,0xf6,0x04,0x00,0xd3,0x6c,0x79,0x0e,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x03,0x0f,0x04,0x18,0x00,0x2e,0x00,0xa1,0x40,0x19,0x07,0x26,0x01,0x03,0x16,0x01,0x03,0x09,0x0c,0x01,0x09,0x09,0x01,0x0f,0x00,0x01,0x10,0x04,0x2b,0x10,0x0b,0x0c,0x00,0x4c,0x12,0xb8,\r\n0xff,0xf0,0x40,0x35,0x0b,0x0c,0x00,0x4c,0x0a,0x38,0x0b,0x0c,0x00,0x4c,0x05,0x28,0x0f,0x1e,0x04,0x14,0x2d,0x17,0x19,0x14,0x19,0x95,0x59,0x14,0x10,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x0b,0x03,0x01,0x03,0x2d,0x03,0x95,0x59,0x2d,0x16,0x17,0x17,0x28,0x1e,0x83,0x0f,0x0f,0x00,0x28,0x83,0x05,0xb8,0xff,0xe0,0x40,0x16,0x0b,0x06,\r\n0x4d,0x20,0x05,0x30,0x05,0x02,0x05,0x05,0x30,0x00,0x10,0x0d,0x06,0x4d,0x00,0x1c,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x11,0x39,0x2f,0x5d,0x2b,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x17,0x39,0x2b,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,\r\n0x5d,0x5d,0x5f,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x68,0x86,0xa1,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x42,0x6e,0x8d,0x4b,0x85,0x69,0x71,0x93,0x2e,\r\n0x4a,0x35,0x1d,0x1d,0x38,0x50,0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x92,0x50,0x9e,0x25,0xb0,0x63,0x90,0x29,0x39,0x2c,0x23,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x6f,0x4b,0x26,0x2e,0xa6,0x4a,0x15,0x26,0x35,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5a,0x3e,0x4c,0x70,0x4a,0x24,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,\r\n0x05,0x2f,0x00,0x14,0x00,0x7c,0x40,0x3b,0x03,0x18,0x0b,0x0c,0x00,0x4c,0x14,0x14,0x12,0x02,0x12,0x95,0x59,0x02,0x16,0x0a,0x0a,0x07,0x0e,0x06,0x0b,0x07,0x07,0x06,0x95,0x59,0x07,0x0f,0x00,0x00,0x0d,0x40,0x0b,0x00,0x4d,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,\r\n0x0f,0x84,0x04,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xee,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x32,0x2f,0x2f,0x2b,0x33,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x11,0x33,0x11,0x33,0x18,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x31,\r\n0x30,0x2b,0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3e,0x2d,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,\r\n0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0xa1,0x40,0x36,0x49,0x06,0x01,0x49,0x06,0x01,0x03,0x0d,0x10,0x0b,0x0c,0x00,0x4c,0x0f,0x03,0x01,0x0c,0x06,0x01,0x15,0x03,0x0c,0x05,0x0c,0x95,0x59,0x05,0x16,0x10,0x0f,0x08,0x0f,0x01,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0f,0x01,0x0f,\r\n0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0x40,0x2a,0x0b,0x06,0x4d,0x0f,0x0f,0x13,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0a,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x02,0x0b,0x06,0x4d,0x07,0x2f,0x13,0x01,0x5d,\r\n0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x00,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,\r\n0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x0e,0x00,0x00,0x03,0xcb,0x04,0x00,0x00,0x0b,0x00,0x7b,0x40,0x0d,0x79,0x0b,0x01,0x79,0x02,0x01,0x77,0x01,0x01,0x76,0x04,0x01,0x0b,0xb8,0xff,0xe0,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x04,0x20,0x0b,0x0d,\r\n0x01,0x4c,0x02,0xb8,0xff,0xf4,0x40,0x19,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x76,0x07,0x01,0x07,0x30,0x0b,0x0d,0x01,0x4c,0x0b,0x07,0x03,0x02,0x15,0x03,0x0f,0x0b,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x0b,0x00,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x0d,0x04,0x0c,0x0b,0x06,0x4d,0x04,0x03,0xb8,0xff,0xf0,0xb3,0x0c,0x00,\r\n0x4d,0x03,0x2f,0x2b,0x33,0x2b,0x11,0x33,0x2f,0x2b,0x32,0x2b,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x5d,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x03,0xcb,0xfe,0x68,0xa1,0xfe,0x7c,0xb4,0x01,0x04,0x1d,0x07,0x04,0x0a,0x16,0x01,0x10,0x04,0x00,0xfc,0x00,\r\n0x04,0x00,0xfd,0x18,0x52,0x3d,0x4d,0x3e,0x02,0xec,0x00,0x01,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x00,0x1b,0x00,0xd2,0x40,0x16,0x78,0x1b,0x01,0x77,0x14,0x01,0x76,0x0c,0x01,0x7b,0x0a,0x01,0x74,0x01,0x01,0x38,0x09,0x01,0x37,0x0c,0x01,0x1b,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x13,0xb8,0xff,0xfe,0xb3,0x0b,0x06,0x4d,0x0a,\r\n0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x02,0xb8,0xff,0xfa,0x40,0x18,0x0b,0x06,0x4d,0x14,0x02,0x0b,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x08,0xb8,0xff,0xc0,0xb3,0x0b,0x00,0x4d,0x14,0xb8,0xff,0xf0,0x40,0x09,0x0b,0x00,0x4d,0x13,0x18,0x0b,0x00,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,\r\n0x0b,0x00,0x4d,0x09,0x10,0x0b,0x00,0x4d,0x1b,0xb8,0xff,0xe0,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x0c,0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xd0,0x40,0x23,0x0b,0x0d,0x01,0x4c,0x17,0x30,0x0b,0x0d,0x01,0x4c,0x0f,0x30,0x0b,0x0d,0x01,0x4c,0x02,0x06,0x0f,0x17,0x13,0x1b,0x00,0x07,0x0a,0x0b,0x0f,0x0a,0x00,0x00,0x1d,0x0b,0x2f,0x1d,\r\n0x01,0x5d,0x2f,0x11,0x33,0x2f,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x01,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,\r\n0x16,0x17,0x33,0x36,0x37,0x13,0x05,0xb0,0xfe,0xcd,0xaa,0xd3,0x0c,0x04,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x0a,0x04,0x08,0x03,0x0f,0xec,0x96,0xd4,0x0a,0x05,0x08,0x02,0x0f,0xd0,0x04,0x00,0xfc,0x00,0x02,0xdd,0x2a,0x35,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,0xfe,0x23,0x39,0x2c,0x32,0x03,0x00,0xfc,0xfc,0x25,0x37,0x27,\r\n0x35,0x03,0x04,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x13,0x00,0xe0,0x40,0x13,0x7b,0x13,0x01,0x73,0x0e,0x01,0x79,0x0c,0x01,0x74,0x0a,0x01,0x7b,0x03,0x01,0x75,0x01,0x01,0x13,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0c,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0a,0x08,0x0b,\r\n0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0x40,0x13,0x0c,0x06,0x4d,0x02,0x10,0x0c,0x06,0x4d,0x01,0x10,0x0c,0x06,0x4d,0x00,0x10,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,\r\n0x13,0xb8,0xff,0xf0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0e,0x10,0x0b,0x0d,0x01,0x4c,0x0a,0x10,0x0b,0x0d,0x01,0x4c,0x03,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x11,0x18,0x0b,0x01,0x4d,0x06,0xb8,0xff,0xe8,0x40,0x15,0x0b,0x01,0x4d,0x03,0x06,0x11,0x13,0x04,0x0b,0x0d,0x0f,0x0b,0x00,0x02,0x0d,0x0b,0x02,0x02,0x15,0x0b,0x15,\r\n0xb8,0xff,0xc0,0xb2,0x0c,0x00,0x4d,0x2b,0x2f,0x11,0x33,0x2f,0x11,0x33,0x11,0x33,0x00,0x2f,0x3f,0x12,0x17,0x39,0x2b,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x01,0x33,\r\n0x13,0x16,0x17,0x33,0x01,0x03,0x92,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x13,0x1a,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x16,0x15,0x04,0x01,0x00,0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x09,0x45,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x27,0x29,0x01,0xae,0x00,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x03,0xd5,\r\n0x04,0x00,0x00,0x14,0x00,0x9b,0x40,0x0a,0x0d,0x14,0x01,0x00,0x0d,0x01,0x06,0x02,0x01,0x14,0xb8,0xff,0xe0,0x40,0x2c,0x0b,0x0d,0x01,0x4c,0x0d,0x20,0x0b,0x0d,0x01,0x4c,0x02,0x20,0x0b,0x00,0x4d,0x02,0x10,0x01,0x10,0x04,0x00,0x0f,0x0c,0x0f,0x10,0x30,0x0b,0x0d,0x01,0x4c,0x10,0x01,0x0b,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,\r\n0x1c,0x06,0x0b,0xb8,0xff,0xf4,0x40,0x0e,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,0x06,0x0b,0x03,0x0c,0x14,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x14,0x00,0x10,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x16,0x0d,0x0c,0x0b,0x06,0x4d,0x0d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x00,0x4d,0x0c,0x2f,0x2b,0x33,0x2b,0x11,0x33,0x2f,0x2b,0x32,\r\n0x2b,0x12,0x17,0x39,0x2b,0x2b,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2f,0x33,0x33,0x2b,0x3f,0x3f,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x2b,0x2b,0x5d,0x5d,0x5d,0x01,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x03,0xd5,0xfe,0x29,0x7e,0xe4,0x40,0x2b,0x35,0x2c,\r\n0x7c,0x3e,0x52,0xfe,0x70,0xb6,0x01,0x15,0x05,0x10,0x06,0x05,0x0f,0x01,0x23,0x04,0x00,0xfb,0x5c,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x0f,0x3f,0x18,0x34,0x03,0x16,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x00,0x09,0x00,0xa5,0x40,0x0e,0x0a,0x06,0x01,0x06,0x01,0x01,0x10,0x01,0x18,0x0b,0x0d,0x01,\r\n0x4c,0x06,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x40,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x35,0x00,0x45,0x00,0x02,0x03,0x00,0x13,0x00,0x23,0x00,0x03,\r\n0x3a,0x05,0x4a,0x05,0x02,0x0c,0x05,0x1c,0x05,0x2c,0x05,0x03,0x17,0x03,0x05,0x01,0x04,0x04,0x01,0x95,0x59,0x04,0x15,0x00,0x08,0x07,0x08,0x07,0x95,0x59,0x08,0x0f,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,\r\n0x12,0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x03,0x70,0xfd,0xa2,0x02,0x58,0xfc,0xb7,0x02,0x5e,0xfd,0xdb,0x03,0x16,0x03,0xd1,0xfc,0xbb,0x8c,0x33,0x03,0x41,0x8c,0x00,0x01,0x00,0x5c,0xfe,0xba,0x02,0x2b,\r\n0x05,0x9a,0x00,0x18,0x00,0x5f,0x40,0x2c,0x11,0x05,0x06,0x06,0x05,0x52,0x59,0x06,0x0b,0x00,0x06,0x4c,0x14,0x30,0x0b,0x0c,0x53,0x59,0x0b,0x03,0x00,0x18,0x53,0x59,0x00,0x20,0x12,0x15,0x05,0x0c,0x18,0x18,0x15,0x05,0x0f,0x08,0x15,0xea,0x02,0x18,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xdc,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf7,0xb3,\r\n0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0x2b,0xe1,0x39,0x39,0xce,0x10,0xc2,0x2f,0x32,0x11,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x24,0x11,0x11,0x34,0x27,0x35,0x36,0x35,0x11,0x10,0x25,0x15,0x06,0x15,0x11,0x14,0x07,0x15,0x16,0x15,0x11,0x14,0x16,0x17,0x02,0x2b,\r\n0xfe,0xcd,0x9c,0x9c,0x01,0x33,0x9f,0x96,0x96,0x47,0x58,0xfe,0xba,0x04,0x01,0x32,0x01,0x2c,0xca,0x0a,0x74,0x0a,0xce,0x01,0x24,0x01,0x36,0x04,0x80,0x04,0xc2,0xfe,0xdb,0xd2,0x30,0x04,0x2d,0xd3,0xfe,0xdf,0x6f,0x5f,0x02,0x00,0x00,0x01,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x13,0x40,0x09,0x03,0x00,0x1c,0x00,\r\n0xea,0x90,0x01,0x01,0x01,0x2f,0x5d,0xe1,0x00,0x3f,0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0xfe,0x1e,0x08,0x00,0x00,0x00,0x01,0x00,0x42,0xfe,0xba,0x02,0x10,0x05,0x9a,0x00,0x18,0x00,0x66,0x40,0x26,0x0c,0x00,0x18,0x18,0x00,0x52,0x59,0x18,0x13,0x05,0x18,0x4c,0x14,0x30,0x13,0x12,0x53,0x59,0x13,0x03,0x05,0x06,\r\n0x53,0x59,0x05,0x20,0x0c,0x09,0x00,0x00,0x03,0x12,0x06,0x16,0x0f,0x03,0xea,0x09,0xb8,0xff,0xe0,0x40,0x0f,0x0d,0x06,0x4d,0x50,0x09,0x01,0x3f,0x09,0x01,0x09,0x20,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x5d,0x5d,0x2b,0xe1,0x39,0x39,0xc6,0x32,0x10,0xca,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,\r\n0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x06,0x15,0x11,0x10,0x05,0x35,0x36,0x36,0x35,0x11,0x34,0x37,0x35,0x26,0x35,0x11,0x34,0x27,0x35,0x04,0x11,0x11,0x14,0x17,0x02,0x10,0x9c,0xfe,0xce,0x57,0x49,0x95,0x95,0xa0,0x01,0x32,0x9c,0x01,0xf0,0x0a,0xca,0xfe,0xd4,0xfe,0xce,0x04,0x7e,0x02,0x60,\r\n0x6e,0x01,0x21,0xd3,0x2d,0x04,0x30,0xd2,0x01,0x25,0xc2,0x04,0x80,0x04,0xfe,0xca,0xfe,0xdc,0xce,0x0a,0x00,0x01,0x00,0xd1,0x01,0xb8,0x04,0xaa,0x02,0xee,0x00,0x14,0x00,0x44,0xb9,0x00,0x01,0xff,0xe0,0x40,0x23,0x09,0x0c,0x48,0x0b,0x20,0x09,0x0c,0x48,0x09,0x03,0x03,0x11,0xbe,0x59,0x03,0x07,0x40,0x0d,0x07,0xbe,0x59,0x14,0x0d,\r\n0x14,0xbd,0x00,0x09,0xbd,0x0a,0x15,0x16,0x0a,0x00,0xff,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xc4,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x31,0x30,0x01,0x2b,0x2b,0x01,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x04,0xaa,0x07,0x93,0x7e,\r\n0x6d,0x9c,0x61,0x3e,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x02,0xee,0x94,0xa2,0x6d,0x43,0xb0,0x8f,0xa7,0x58,0x5a,0x62,0x50,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xe2,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe6,0x01,0x5b,0x00,0x22,0xb7,0x03,0x70,0x1f,0x01,0x02,0x7f,0x1f,\r\n0x01,0xb8,0xff,0xf3,0x40,0x0a,0x1f,0x19,0x06,0x07,0x3e,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x5d,0x35,0x5d,0x35,0x00,0x03,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xcd,0x00,0x10,0x00,0x1b,0x00,0x23,0x01,0x5d,0x40,0x18,0x76,0x22,0x01,0x79,0x1d,0x01,0x74,0x0c,0x01,0x7b,0x0a,0x01,0x7b,0x07,0x01,0x77,0x06,0x01,\r\n0x10,0x06,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x09,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x09,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x06,0xb8,0xff,0xfa,0x40,0x2c,0x0b,0x06,0x4d,0x1d,0x08,0x0c,0x00,0x4d,0x02,0x08,0x0c,0x00,0x4d,0x1d,0x1c,0x02,0x01,0x20,0x01,0x22,0x23,0x03,0x04,0x20,0x04,\r\n0x73,0x04,0x01,0x7c,0x01,0x01,0x10,0x08,0x0b,0x0c,0x00,0x4c,0x04,0x18,0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0xb4,0x0b,0x0d,0x01,0x4c,0x20,0xb8,0xff,0xc0,0xb4,0x0b,0x0d,0x01,0x4c,0x1f,0xb8,0xff,0xc0,0x40,0x1e,0x0b,0x0d,0x01,0x4c,0x10,0x20,0x0b,0x0d,0x01,0x4c,0x06,0x20,0x0b,0x0d,0x01,0x4c,0x00,0x16,0x01,0x09,0x03,0x1d,\r\n0x1e,0x1f,0x21,0x22,0x05,0x05,0x20,0x20,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x20,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x20,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x20,0x20,0x12,0x16,0x48,0x20,0x00,0x16,0x1c,0x02,0x91,0x59,0x1c,0x1c,0x16,0x00,0x0b,0x11,0xc5,0x59,0x0b,0x10,0x06,0x16,0x03,0x04,0x00,0x12,0x19,0xc4,0x0e,0x40,\r\n0x09,0x0c,0x48,0x0e,0x14,0xc4,0x08,0xb8,0xff,0xc0,0x40,0x12,0x0c,0x00,0x4d,0x08,0x08,0x1c,0x23,0x06,0x10,0x04,0x05,0x77,0x05,0x01,0x79,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x25,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x39,0x2f,0x2b,0xe9,\r\n0xd4,0x2b,0xe9,0x00,0x3f,0xc4,0x3f,0xcd,0x39,0xc4,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x2b,0x2b,0x2b,0x2b,0x11,0x12,0x17,0x39,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x0e,0xc0,0x10,0x87,0x05,0xc0,0xc0,0x0e,0xc0,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x11,0x65,0x78,0x5c,0x58,0x70,0x60,0x6e,0x32,0x40,\r\n0x72,0x30,0x42,0x42,0xc9,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x62,0x34,0x70,0x59,0x6e,0x6d,0x54,0x70,0x36,0x01,0x15,0x3f,0x30,0x72,0x42,0x30,0x31,0x3e,0xfb,0xae,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x00,0xff,0xff,0x00,0x5e,0xfe,0x50,0x04,0x8c,0x05,0xb2,0x02,0x26,0x00,0x26,0x00,0x00,0x00,0x07,\r\n0x00,0xdd,0x02,0x39,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x65,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x17,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x38,0x0e,0x0c,0x02,0x03,0x3e,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x0b,0x02,0x26,\r\n0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0xb5,0x01,0x59,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x14,0x0b,0x12,0x25,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe0,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x66,0x01,0x59,0x00,0x1b,0x40,0x10,0x03,0x70,\r\n0x27,0x01,0x02,0x00,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x5d,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x06,0xe4,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x1d,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x1d,0x17,0x05,0x0d,0x25,0x02,0x01,0x1a,0x05,\r\n0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe9,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x12,0x22,0x20,0x10,0x00,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,\r\n0x06,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xcb,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x11,0x22,0x20,0x10,0x0b,0x25,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x0e,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x96,0x00,0x00,0x00,0x16,\r\n0xb9,0x00,0x02,0xff,0xec,0x40,0x09,0x24,0x20,0x0f,0x14,0x25,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x87,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe2,0x40,0x0a,0x2f,0x29,0x0f,0x14,0x25,0x03,0x02,0x2c,0x11,0x26,\r\n0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xb2,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xa8,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xeb,0x40,0x09,0x2a,0x20,0x0f,0x14,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,\r\n0x06,0x1c,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xe9,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe9,0x40,0x0a,0x23,0x29,0x0f,0x14,0x25,0x03,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x00,0xdd,\r\n0x01,0x83,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x0f,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x27,0x1b,0x1d,0x0c,0x12,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,\r\n0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xfe,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x09,0x1d,0x1b,0x0c,0x12,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0e,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xb8,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf7,0x40,\r\n0x09,0x1f,0x20,0x16,0x0f,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x87,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x88,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x29,0x23,0x0c,0x12,0x25,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,\r\n0x35,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x01,0xdd,0x06,0x0a,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0x8e,0xd1,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xec,0x00,0x00,0x01,0x71,0x06,0x0a,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,\r\n0x00,0x43,0x9a,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x05,0x04,0x02,0x03,0x25,0x01,0x05,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x07,0x06,0x0e,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0x77,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x08,0x04,0x02,0x03,0x25,\r\n0x01,0x08,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc9,0x00,0x00,0x02,0x10,0x05,0x87,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x4c,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf4,0x40,0x0a,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,\r\n0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xb2,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xe8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1d,0x13,0x0a,0x12,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,\r\n0x00,0x8e,0x01,0x42,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe4,0x40,0x09,0x19,0x19,0x0c,0x06,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x14,0x19,0x19,0x03,0x09,\r\n0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0e,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1d,0x1e,0x03,0x09,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,\r\n0x04,0x50,0x05,0x87,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xb2,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd8,\r\n0x00,0xff,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x22,0x18,0x03,0x09,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x3c,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfb,0x40,0x09,0x14,0x12,0x09,0x11,0x25,\r\n0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xea,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x17,0x14,0x12,0x08,0x10,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,\r\n0x06,0x0e,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xc6,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x16,0x12,0x08,0x11,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0x87,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xa0,0x00,0x00,0x00,0x17,\r\n0x40,0x0d,0x02,0x01,0x07,0x21,0x1b,0x08,0x11,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x0b,0x00,0x36,0x40,0x1b,0x0b,0x01,0x09,0x06,0x40,0x04,0x00,0x08,0x10,0x08,0x02,0x0a,0x03,0x08,0x00,0x05,0x06,0x05,0x91,0x59,0x0b,0x06,0x06,0x03,\r\n0x08,0x03,0x03,0x00,0x2f,0x3f,0x12,0x39,0x2f,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x1a,0xce,0xdd,0x32,0xce,0x31,0x30,0x01,0x25,0x03,0x23,0x03,0x05,0x35,0x05,0x03,0x33,0x03,0x25,0x02,0xd8,0xfe,0xfa,0x28,0x4c,0x28,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x01,0x2e,0x03,0x7d,0x1e,0xfd,0x4a,0x02,0xb6,0x1e,\r\n0x96,0x14,0x01,0x9a,0xfe,0x66,0x14,0x00,0x00,0x02,0x00,0x6c,0x03,0x81,0x02,0x96,0x05,0xaa,0x00,0x0b,0x00,0x17,0x00,0x38,0x40,0x21,0x00,0x12,0xd8,0x59,0x00,0x0e,0x06,0x06,0x0c,0xd8,0x59,0x06,0x04,0x03,0x09,0x42,0x15,0xd8,0x09,0x0f,0xd8,0x03,0x0f,0x09,0x01,0x17,0x03,0x18,0x19,0x03,0x09,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,\r\n0x10,0xe1,0x10,0xe1,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x81,0x73,0xa2,0xa0,0x73,0x74,0xa3,0xa2,0x73,0x41,0x5c,0x5a,0x41,0x41,0x5e,0x5c,0x03,0x81,0xa3,0x74,0x73,0x9f,0xa0,\r\n0x72,0x74,0xa3,0x01,0xb4,0x5c,0x41,0x43,0x5f,0x60,0x42,0x42,0x5b,0x00,0x00,0x02,0x00,0xb8,0xff,0xcf,0x03,0xb8,0x05,0x85,0x00,0x16,0x00,0x1d,0x00,0x7f,0x40,0x42,0x05,0x10,0x01,0x03,0x0f,0x00,0x01,0x10,0x05,0x16,0x16,0x17,0x14,0x02,0x14,0x9a,0x59,0x05,0x02,0x02,0x11,0x12,0x11,0x02,0x0c,0x03,0x11,0x11,0x18,0x13,0x0e,0x13,\r\n0x99,0x59,0x0b,0x0e,0x02,0x0e,0x02,0x0c,0x04,0x1e,0x0c,0x0b,0x0e,0x14,0x17,0x04,0x02,0xdc,0x70,0x05,0x01,0x02,0x05,0x01,0x05,0x05,0x08,0x11,0x00,0x00,0x1f,0x1b,0x89,0x08,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x08,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x5d,0xe1,0x17,0x39,0x00,0x2f,0x10,0xc6,0x11,0x39,0x39,\r\n0x2f,0x2f,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x11,0x33,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x02,0x35,0x34,0x12,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x05,0x11,0x06,0x06,0x15,0x14,0x16,0x03,0xb8,0x60,0x7d,0x7d,\r\n0xc1,0xe5,0xe5,0xc1,0x7d,0x7b,0x62,0x65,0x78,0x7a,0x63,0xfe,0xa6,0x77,0x87,0x88,0xd1,0x3b,0x0a,0xbd,0xbf,0x16,0x01,0x16,0xcf,0xdb,0x01,0x27,0x25,0xd5,0xcb,0x02,0x31,0xac,0x47,0x07,0xfc,0xef,0x0c,0x4a,0x4b,0x02,0xf9,0x1f,0xcd,0x96,0x96,0xc6,0x00,0x01,0x00,0x6a,0x00,0x00,0x03,0xee,0x05,0xb2,0x00,0x1b,0x00,0x6a,0x40,0x39,\r\n0x02,0x0e,0x01,0x03,0x00,0x12,0x01,0x10,0x05,0x17,0x14,0x05,0x08,0x08,0x05,0x9a,0x59,0x08,0x08,0x1b,0x0f,0x0c,0x40,0x0c,0x11,0x9a,0x59,0x0c,0x04,0x02,0x00,0x1b,0x00,0x1b,0x9a,0x59,0x00,0x12,0x15,0x15,0x18,0x7f,0x0e,0x01,0x0e,0x00,0x1a,0x02,0x06,0x14,0x08,0x18,0x8a,0x20,0x04,0x01,0x04,0x2f,0x5d,0xe1,0x39,0x39,0xc6,0xc6,\r\n0x32,0x2f,0xc4,0x5d,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5f,0x5d,0x21,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,\r\n0x15,0x14,0x07,0x21,0x03,0xee,0xfc,0x7c,0xda,0xc5,0xc5,0xda,0xad,0x75,0x60,0x64,0x6f,0xe5,0x01,0x28,0xfe,0xd8,0xc1,0x02,0xc7,0x87,0x45,0xf4,0xbb,0x8d,0xfe,0xbc,0xf0,0x29,0x9b,0x39,0xfe,0xcd,0xec,0x8d,0x9c,0xf2,0x61,0x00,0x00,0x02,0x00,0x83,0xff,0xbe,0x03,0x27,0x05,0xd3,0x00,0x26,0x00,0x30,0x00,0xcf,0x40,0x1b,0x24,0x22,\r\n0x01,0x23,0x1b,0x01,0x2c,0x0f,0x01,0x2b,0x07,0x01,0x2c,0x30,0x01,0x25,0x2b,0x01,0x25,0x26,0x01,0x11,0x20,0x0c,0x00,0x4d,0x23,0xb8,0xff,0xe0,0xb3,0x0c,0x00,0x4d,0x17,0xb8,0xff,0xf0,0x40,0x5d,0x0b,0x0c,0x00,0x4c,0x03,0x10,0x0b,0x0c,0x00,0x4c,0x2c,0x00,0x0a,0x27,0x14,0x05,0x19,0x00,0x08,0x01,0x0e,0x03,0x08,0x08,0x0a,0x05,\r\n0x0a,0x9a,0x59,0x05,0x00,0x1c,0x10,0x1c,0x02,0x0f,0x03,0x1c,0x1c,0x1e,0x19,0x1e,0x9a,0x59,0x19,0x2c,0x00,0x02,0x29,0x27,0x14,0x2e,0x16,0x0d,0x7e,0x02,0x1c,0x40,0x0b,0x10,0x01,0x4c,0x02,0x40,0x0c,0x10,0x01,0x4c,0x1c,0x02,0x1c,0x02,0x2e,0x7e,0x25,0x40,0x0b,0x0c,0x01,0x4c,0x25,0x25,0x32,0x12,0x20,0x7e,0x16,0x08,0x16,0x08,\r\n0x29,0x7e,0x12,0x2f,0xe1,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x39,0x39,0x2f,0x2f,0x2b,0x2b,0x10,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x2b,0x2b,\r\n0x2b,0x2b,0x01,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x01,0x06,0x15,0x14,0x16,0x17,0x36,0x35,0x34,0x26,0x02,0x92,0x5a,0xc8,\r\n0x9b,0x83,0x6c,0x82,0x78,0x54,0x5c,0x47,0x91,0xe9,0x93,0x6a,0xbb,0x99,0x82,0x59,0x65,0x7a,0xa8,0x51,0xa3,0xdf,0xfe,0x67,0x65,0x71,0x8d,0x58,0x69,0x01,0xa0,0x4a,0x70,0x84,0xa4,0x38,0x9e,0x4a,0x4f,0x3c,0x35,0x49,0x4d,0x7a,0xc3,0xa3,0x51,0x53,0x8c,0x7f,0xa4,0x2b,0x9e,0x3e,0x90,0x37,0x5a,0x4e,0x6b,0xba,0xaa,0x01,0x7f,0x33,\r\n0x6c,0x48,0x6d,0x3f,0x44,0x68,0x48,0x65,0x00,0x01,0x00,0xa4,0x01,0x98,0x02,0x9c,0x03,0x90,0x00,0x0b,0x00,0x19,0x40,0x0c,0x00,0x0e,0x40,0x06,0x03,0x09,0x42,0x09,0x20,0x03,0x01,0x03,0x2f,0x5d,0xcd,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xa2,0x68,0x96,0x96,\r\n0x68,0x68,0x92,0x92,0x01,0x98,0x92,0x68,0x67,0x97,0x96,0x68,0x68,0x92,0x00,0x01,0x00,0x54,0x00,0x00,0x03,0x42,0x05,0x9a,0x00,0x0f,0x00,0x7c,0x40,0x38,0x08,0x08,0x0f,0x02,0x04,0x00,0x0f,0x00,0xe2,0x59,0x0f,0x03,0x06,0x02,0x12,0x00,0x00,0x02,0x10,0x0d,0x06,0x4d,0x02,0x8c,0x03,0x18,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,\r\n0x03,0x26,0x0b,0x06,0x4d,0x2f,0x03,0x01,0x03,0x06,0x10,0x0d,0x06,0x4d,0x06,0x8c,0x08,0x03,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x08,0xb8,0xff,0xec,0xb4,0x0b,0x06,0x4d,0x08,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x0b,0x2f,0x2b,0x2b,0xdd,0x2b,0x2b,0x2b,0xe1,0x2b,\r\n0xd4,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0xca,0x2f,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x42,0x80,0x6a,0x9e,0x6c,0x6c,0x8e,0x95,0x6b,0x01,0xee,0x05,0x33,0xfa,0xcd,0x05,0x33,0xfa,0xcd,0x03,0x87,0x98,0x73,\r\n0x75,0x93,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x14,0x06,0x02,0x00,0x25,0x00,0xa2,0x40,0x09,0x0f,0x22,0x01,0x00,0x11,0x01,0x10,0x05,0x20,0xb8,0xff,0xe0,0xb4,0x0b,0x0c,0x00,0x4c,0x1a,0xb8,0xff,0xe8,0x40,0x32,0x0b,0x00,0x4d,0x1f,0x09,0x0a,0x0a,0x09,0x96,0x59,0x18,0x24,0x0a,0x95,0x14,0x30,0x18,0x10,0x95,0x59,0x18,0x01,0x01,\r\n0x03,0x24,0x03,0x95,0x59,0x24,0x16,0x14,0x15,0x1f,0x1b,0x09,0x00,0x00,0x13,0x0d,0x83,0x1b,0x10,0x0c,0x06,0x4d,0x1b,0x1b,0x06,0x83,0x21,0xb8,0xff,0xe8,0x40,0x16,0x0c,0x06,0x4d,0x21,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x84,0x14,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x14,0x06,\r\n0x0b,0x06,0x4d,0x14,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2f,0x2b,0xe1,0x39,0x2f,0x2b,0xe1,0x11,0x39,0x2f,0xc4,0x11,0x39,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x2b,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x35,0x36,0x36,0x35,\r\n0x34,0x26,0x23,0x22,0x11,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x04,0x11,0x14,0x06,0x23,0x22,0x01,0xcd,0x4b,0x5f,0x6d,0x88,0xc8,0xb2,0x76,0x98,0x6e,0x61,0xe7,0xa4,0xdc,0xba,0xa6,0xc6,0x96,0x78,0x01,0x7a,0xde,0xb7,0x65,0x02,0xa0,0x30,0x93,0x7c,0x96,0xbb,0x14,0x82,0x14,0xa6,0x72,0x6c,0x77,0xfe,\r\n0xcb,0xfb,0xbe,0x04,0x5a,0xc0,0xe8,0xbe,0x9c,0x7f,0xca,0x27,0x05,0x4b,0xfe,0xa1,0xb1,0xf0,0xff,0xff,0x00,0x90,0x01,0xfa,0x02,0xb2,0x02,0x7b,0x02,0x06,0x00,0x10,0x00,0x00,0x00,0x04,0x01,0x38,0x00,0xff,0x05,0xe7,0x05,0xae,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x32,0x00,0x79,0x40,0x40,0x09,0xc6,0x15,0x2a,0x18,0x50,0x19,0x1a,\r\n0x19,0x27,0x24,0x50,0x2f,0x2c,0x1e,0x50,0x1f,0x15,0x19,0x2f,0x1f,0x1f,0x2f,0x19,0x15,0x04,0x34,0x0f,0xc6,0x40,0x03,0x28,0x2c,0x1d,0x2c,0x1d,0x51,0x59,0x2c,0x2c,0x20,0x1f,0x20,0x2b,0x52,0x59,0x20,0x20,0x0c,0x06,0x0c,0xc7,0x59,0x06,0x28,0x19,0x1f,0x1f,0x12,0x00,0x12,0xc7,0x59,0x00,0x00,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,\r\n0x33,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x1a,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x33,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x25,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x00,0x15,0x14,\r\n0x00,0x33,0x32,0x00,0x35,0x34,0x00,0x13,0x23,0x27,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x17,0x01,0x15,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x90,0xf9,0xfe,0xa1,0x01,0x5f,0xf9,0xf8,0x01,0x5f,0xfe,0xa1,0xf7,0xd2,0xfe,0xd7,0x01,0x29,0xd2,0xd1,0x01,0x27,0xfe,0xd9,0x51,0x8a,0x53,0x3f,0x49,\r\n0x34,0x75,0xd7,0x85,0x91,0x66,0x5b,0x3f,0x3f,0xfe,0xcb,0x5e,0x9e,0x55,0x5c,0xff,0x01,0x5e,0xf9,0xf9,0x01,0x5f,0xfe,0xa1,0xf9,0xf9,0xfe,0xa2,0x04,0x51,0xfe,0xd8,0xd2,0xd1,0xfe,0xd8,0x01,0x28,0xd1,0xd2,0x01,0x28,0xfc,0x8f,0xb7,0x8a,0xfe,0xbf,0x02,0xfb,0x70,0x60,0x4e,0x6f,0x13,0x03,0x0e,0x7f,0x01,0xcd,0xf5,0x7b,0x47,0x33,\r\n0x00,0x03,0x00,0xa2,0xff,0xdf,0x06,0x7d,0x05,0xbb,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x7b,0xb9,0x00,0x12,0xff,0xe8,0x40,0x46,0x0c,0x00,0x4d,0x0c,0x18,0x0c,0x00,0x4d,0x22,0x0f,0x2d,0x01,0x0f,0x03,0x2d,0x2d,0x15,0x28,0xca,0x1d,0x1d,0x15,0x0f,0xc9,0x03,0x15,0xc9,0x40,0x09,0xc6,0x03,0x1a,0x2b,0x53,0x59,0x0f,0x1a,0x1f,0x1a,\r\n0x2f,0x1a,0x03,0x0f,0x03,0x1a,0x1a,0x25,0x12,0x20,0x25,0x53,0x59,0x20,0x20,0x0c,0x12,0x06,0x0c,0xcb,0x59,0x00,0x12,0xcb,0x59,0x06,0x00,0xc7,0x59,0x06,0x04,0x00,0x3f,0x2b,0x2b,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x01,0x18,0x2f,0xf0,0x1a,0xe9,0x10,0xe9,0x11,0x39,0x2f,\r\n0xe1,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0xc6,0x00,0x2b,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x06,0x23,0x22,0x24,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x90,0xfe,0xc9,0xfe,\r\n0x49,0x01,0xb7,0x01,0x37,0x01,0x36,0x01,0xb7,0xfe,0x49,0xfe,0xca,0xfe,0xee,0xfe,0x7c,0x01,0x84,0x01,0x12,0x01,0x12,0x01,0x83,0xfe,0x7d,0x03,0x69,0x8f,0xc0,0xfe,0xfc,0x01,0x0a,0xd5,0x79,0x60,0x56,0x8f,0x8d,0xb7,0xbb,0x90,0x84,0x5e,0x21,0x01,0xb7,0x01,0x37,0x01,0x37,0x01,0xb7,0xfe,0x49,0xfe,0xc9,0xfe,0xc9,0xfe,0x49,0x05,\r\n0x84,0xfe,0x7c,0xfe,0xee,0xfe,0xee,0xfe,0x7d,0x01,0x83,0x01,0x12,0x01,0x12,0x01,0x84,0xfb,0xe6,0x45,0xfa,0xbc,0xda,0x01,0x04,0x35,0x96,0x48,0xb4,0x98,0x94,0xb2,0x4e,0x00,0x00,0x02,0x00,0x4c,0x03,0x04,0x05,0x74,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x79,0x40,0x49,0x0f,0x0c,0x01,0x10,0x04,0x0d,0x28,0x0b,0x0c,0x00,0x4c,0x0c,\r\n0x28,0x0b,0x0c,0x00,0x4c,0x02,0x07,0x0c,0x03,0x16,0x01,0x05,0x09,0x03,0x13,0x11,0x15,0x16,0x15,0x54,0x59,0x0e,0x0a,0x16,0x03,0x0e,0x00,0x50,0x50,0x01,0x01,0x0f,0x01,0x01,0x0b,0x01,0x01,0x0b,0x08,0x50,0x0f,0x09,0x01,0x10,0x03,0x09,0x09,0x13,0x10,0x0e,0x12,0x50,0x13,0x13,0x15,0x42,0x15,0x20,0x13,0x01,0x13,0x2f,0x5d,0xc6,\r\n0x2b,0x01,0x10,0xf1,0xe2,0x11,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0xe1,0x32,0x33,0x2f,0x5e,0x5d,0x5d,0xe1,0x33,0x00,0x3f,0x33,0x33,0x2b,0x11,0x00,0x33,0x18,0x2f,0x17,0x33,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x01,0x23,0x11,0x23,0x03,0x23,0x03,0x23,0x11,0x23,0x11,0x33,0x13,0x33,0x13,0x33,0x05,0x23,0x11,0x23,0x11,\r\n0x23,0x35,0x21,0x05,0x74,0x6c,0x04,0xdb,0x3b,0xd6,0x04,0x66,0x7f,0xe1,0x04,0xe4,0x7e,0xfc,0xe6,0xd1,0x6f,0xce,0x02,0x0e,0x03,0x04,0x01,0xde,0xfe,0x22,0x01,0xde,0xfe,0x22,0x02,0x96,0xfe,0x10,0x01,0xf0,0x62,0xfd,0xcc,0x02,0x34,0x62,0x00,0x01,0x00,0x87,0x04,0xc2,0x02,0x0c,0x06,0x0a,0x00,0x03,0x00,0x13,0xb7,0x78,0x03,0x01,\r\n0x03,0x02,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x5d,0x01,0x01,0x23,0x13,0x02,0x0c,0xfe,0xfa,0x7f,0xdf,0x06,0x0a,0xfe,0xb8,0x01,0x48,0x00,0x00,0x02,0x00,0x7d,0x04,0xc2,0x02,0xc4,0x05,0x87,0x00,0x0b,0x00,0x17,0x00,0x2a,0x40,0x16,0x06,0x00,0x12,0xc1,0x0c,0x09,0xc0,0x03,0x0f,0xc0,0x10,0x15,0x01,0x0f,\r\n0x03,0x01,0x15,0x03,0x15,0x03,0x19,0x18,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x62,0x28,0x3a,0x38,0x28,0x2a,0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x39,\r\n0x29,0x29,0x3c,0x3a,0x04,0xc2,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x3b,0x28,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x01,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xa4,0x00,0x13,0x00,0x89,0x40,0x3b,0x0e,0x11,0x12,0x01,0x02,0x0d,0x02,0x0b,0x08,0x07,0x04,0x03,0x0c,0x03,0x04,0x40,0x12,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x07,0x0b,\r\n0x40,0x11,0x0e,0x08,0x0b,0x0b,0x08,0xbe,0x59,0x0c,0x40,0x0b,0x01,0x02,0x04,0x07,0x08,0x0b,0x0c,0x0e,0x11,0x12,0x0a,0x03,0x0d,0x03,0x0d,0x03,0x10,0x09,0x00,0x05,0x00,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x14,0x15,0x05,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x2b,0x11,0x12,0x39,0x39,0x39,\r\n0x39,0x18,0x2f,0x2f,0x12,0x17,0x39,0x00,0x2f,0x1a,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xdd,0x31,0x30,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x01,0x21,0x03,0x23,0x13,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x13,0x33,0x03,0x21,0x15,0x21,0x03,\r\n0x21,0x04,0x94,0xfd,0xda,0xa3,0x8d,0xa4,0xfa,0x01,0x3f,0x95,0xfe,0x2c,0x02,0x1a,0x9e,0x8d,0x9f,0x01,0x06,0xfe,0xb6,0x98,0x01,0xe2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x84,0x01,0x26,0x84,0x01,0x38,0xfe,0xc8,0x84,0xfe,0xda,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x06,0x83,0x05,0x9a,0x00,0x0f,0x00,0x13,0x00,0xb3,0x40,0x0e,0x13,0x03,\r\n0x04,0x12,0x04,0x02,0x12,0x01,0x00,0x04,0x01,0x10,0x04,0x12,0xb8,0xff,0xf0,0x40,0x21,0x0c,0x00,0x4d,0x0c,0x08,0x00,0x00,0x15,0x01,0x12,0x06,0x06,0x05,0x11,0x09,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x01,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,\r\n0x4d,0x01,0xb8,0xff,0xd6,0x40,0x2b,0x0b,0x06,0x4d,0x01,0x01,0x15,0x04,0x05,0x13,0x03,0x91,0x59,0x13,0x13,0x07,0x00,0x0b,0x0c,0x91,0x59,0x0b,0x07,0x00,0x0b,0x91,0x2b,0x30,0x12,0x08,0x07,0x08,0x91,0x59,0x07,0x03,0x05,0x00,0x00,0x0f,0x91,0x59,0x00,0x12,0x00,0x3f,0x2b,0x00,0x10,0x18,0xc4,0x3f,0x2b,0x11,0x00,0x33,0x2b,0x00,\r\n0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x01,0x18,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xc4,0xc4,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,\r\n0x11,0x23,0x01,0x06,0x83,0xfd,0x09,0xfe,0x02,0xc1,0xc3,0x02,0xbc,0x03,0x9c,0xfd,0xd1,0x02,0x07,0xfd,0xf9,0x02,0x50,0xfd,0x09,0x5f,0xfe,0xa6,0x01,0x92,0xfe,0x6e,0x05,0x9a,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x01,0x91,0x02,0xd9,0xfd,0x27,0x00,0x03,0x00,0x5e,0xff,0xcd,0x05,0xaa,0x05,0xd3,0x00,0x13,0x00,0x1b,0x00,0x23,0x01,0x03,\r\n0x40,0x0a,0x57,0x09,0x01,0x57,0x0e,0x01,0x58,0x0d,0x01,0x1d,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0b,0x00,0x4d,0x0c,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x0a,0xb8,0xff,0xf0,0x40,0x21,0x0b,0x00,0x4d,0x14,0x1d,0x22,0x19,0x01,0x02,0x0b,0x0c,0x02,0x0c,0x02,0x05,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,\r\n0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x22,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x22,0xb8,0xff,0xea,0x40,0x0b,0x0b,0x06,0x4d,0x00,0x22,0x10,0x22,0x02,0x0b,0x03,0x22,0xb8,0xff,0xf8,0x40,0x4b,0x0b,0x06,0x4d,0x22,0x22,0x25,0x19,0x06,0x0d,0x06,0x4d,0x19,0x06,0x0c,0x06,0x4d,\r\n0x19,0x06,0x0b,0x06,0x4d,0x19,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x0c,0x0b,0x08,0x02,0x01,0x12,0x40,0x14,0x1b,0x1c,0x1d,0x04,0x1f,0x16,0x00,0x03,0x0a,0x0d,0x04,0x12,0x08,0x08,0x16,0x91,0x59,0x08,0x04,0x12,0x1f,0x91,0x59,0x12,0x13,0x2f,0x25,0x01,0x5d,0x00,0x3f,0x2b,0x00,\r\n0x18,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x11,0x12,0x17,0x39,0x1a,0x18,0x10,0xce,0x32,0x10,0xce,0x32,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x2b,0x01,0x5d,\r\n0x5d,0x00,0x5d,0x25,0x07,0x27,0x37,0x26,0x11,0x10,0x00,0x21,0x32,0x17,0x37,0x17,0x07,0x16,0x11,0x10,0x00,0x21,0x20,0x01,0x26,0x23,0x22,0x00,0x11,0x14,0x17,0x01,0x01,0x16,0x33,0x32,0x00,0x11,0x10,0x01,0x44,0x98,0x4e,0x9e,0x9e,0x01,0x75,0x01,0x43,0xea,0xa8,0x87,0x4e,0x8b,0xb8,0xfe,0x8c,0xfe,0xc8,0xfe,0xf6,0x02,0x4e,0x7e,\r\n0xba,0xe3,0xfe,0xe7,0x62,0x03,0x15,0xfd,0x2b,0x83,0xcb,0xec,0x01,0x10,0x83,0xb6,0x41,0xbf,0xc3,0x01,0x2c,0x01,0x57,0x01,0x9f,0x81,0xa2,0x3f,0xa6,0xc8,0xfe,0xb9,0xfe,0xa1,0xfe,0x68,0x04,0xcc,0x66,0xfe,0xb8,0xfe,0xf9,0xdf,0x96,0x03,0x14,0xfc,0x9e,0x89,0x01,0x35,0x01,0x14,0x01,0x04,0x00,0x03,0x00,0x52,0x00,0xcf,0x06,0x3a,\r\n0x03,0xd9,0x00,0x13,0x00,0x1d,0x00,0x27,0x00,0x8e,0x40,0x15,0x57,0x25,0x01,0x57,0x21,0x01,0x58,0x1b,0x01,0x58,0x17,0x01,0x14,0x00,0x23,0x1e,0x0a,0x05,0x19,0xbd,0x0f,0xb8,0xff,0xe0,0x40,0x0c,0x0c,0x06,0x4d,0x00,0x0f,0x01,0x0f,0x0f,0x29,0x23,0xbd,0x05,0xb8,0xff,0xe0,0x40,0x11,0x0c,0x06,0x4d,0x0f,0x05,0x1f,0x05,0x02,0x0b,\r\n0x03,0x05,0x00,0x40,0x0c,0x00,0x4d,0x0a,0xb8,0xff,0xe0,0x40,0x1a,0x0c,0x00,0x4d,0x1e,0x26,0x14,0x00,0x0c,0x16,0x12,0x02,0x26,0x02,0x26,0xeb,0x59,0x02,0x1c,0x0c,0x20,0x08,0x08,0x20,0xeb,0x59,0x08,0x00,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x11,0x39,0x39,0x12,0x39,0x2b,0x2b,0x01,0x18,\r\n0x2f,0x5f,0x5e,0x5d,0x2b,0xe1,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x13,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x12,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x01,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,\r\n0x03,0x44,0xa8,0xd6,0xa5,0xcf,0xd8,0x9c,0xec,0x96,0xa4,0xd8,0xa6,0xd0,0xd8,0x9e,0xe2,0x5d,0x83,0xbc,0x6d,0x83,0x88,0x68,0xad,0xfe,0xef,0x84,0xbc,0x6e,0x83,0x87,0x6a,0xb0,0x01,0xe2,0xfe,0xed,0xd5,0xac,0xa2,0xe7,0xfe,0xef,0x01,0x11,0xd5,0xac,0xa1,0xe8,0x01,0x85,0xfe,0xfc,0x91,0x77,0x70,0x94,0xfe,0xfa,0x01,0x06,0x96,0x76,\r\n0x6e,0x92,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xa4,0x00,0x0b,0x00,0x0f,0x00,0x5d,0x40,0x2e,0x03,0x0e,0x04,0x08,0x0e,0x07,0x40,0x0a,0x01,0x04,0x07,0x07,0x04,0xbe,0x59,0x0f,0x07,0x1f,0x07,0xaf,0x07,0x03,0x0d,0x03,0x07,0x0f,0x0c,0x0f,0xbe,0x59,0x0c,0x12,0x0f,0x00,0x0e,0x0a,0x07,0x01,0xbd,0x04,0x04,0x05,0x42,0x0e,\r\n0x05,0x04,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0xcd,0x32,0x2b,0x01,0x10,0xf1,0x39,0x39,0xe1,0x32,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x11,0x21,0x35,0x21,0x04,\r\n0x94,0xfe,0x6c,0x83,0xfe,0x6b,0x01,0x95,0x83,0x01,0x94,0xfc,0x54,0x03,0xac,0x02,0x8c,0xfe,0x6c,0x01,0x94,0x84,0x01,0x94,0xfe,0x6c,0xfc,0xf0,0x85,0x00,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xcb,0x00,0x07,0x00,0x0b,0x00,0x5c,0x40,0x0b,0x08,0x01,0x01,0x07,0x10,0x0b,0x00,0x4d,0x02,0x01,0x00,0xb8,0xff,0xc0,0x40,0x15,\r\n0x0c,0x00,0x4d,0x00,0x03,0x01,0x10,0x03,0x03,0x03,0x00,0x0a,0x09,0x0a,0xbe,0x59,0x09,0x12,0x03,0x07,0x08,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x08,0x05,0x01,0x09,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x09,0x40,0x0c,0x00,0x4d,0x09,0x2f,0x2b,0x2b,0xc4,0x32,0x2f,0x2b,0xc4,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x32,0x2f,\r\n0x5f,0x5e,0x5d,0x2b,0x39,0x39,0x31,0x30,0x2b,0x5d,0x25,0x01,0x35,0x01,0x15,0x01,0x15,0x01,0x13,0x21,0x35,0x21,0x04,0x6c,0xfc,0xa4,0x03,0x5c,0xfd,0x7e,0x02,0x82,0x28,0xfc,0x54,0x03,0xac,0xfe,0x01,0xb2,0x3a,0x01,0xe1,0x96,0xfe,0x9e,0x04,0xfe,0xc7,0xfe,0x6a,0x85,0x00,0x02,0x00,0xe8,0x00,0x00,0x04,0x94,0x04,0xcd,0x00,0x07,\r\n0x00,0x0b,0x00,0x5c,0x40,0x10,0x08,0x00,0x01,0x02,0x10,0x0b,0x00,0x4d,0x07,0x00,0x00,0x06,0x01,0x10,0x03,0x01,0xb8,0xff,0xc0,0x40,0x10,0x0c,0x00,0x4d,0x06,0x06,0x01,0x0a,0x09,0x0a,0xbe,0x59,0x09,0x12,0x04,0x00,0x08,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x08,0x05,0x01,0x09,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x09,0x40,\r\n0x0c,0x00,0x4d,0x09,0x2f,0x2b,0x2b,0xd4,0xc4,0x2f,0x2b,0xc4,0x32,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x32,0x2f,0x2b,0x5f,0x5e,0x5d,0x39,0x39,0x31,0x30,0x2b,0x5d,0x01,0x01,0x35,0x01,0x35,0x01,0x35,0x01,0x13,0x21,0x35,0x21,0x04,0x6c,0xfc,0xa4,0x02,0x84,0xfd,0x7c,0x03,0x5c,0x28,0xfc,0x54,0x03,0xac,0x02,0xb2,0xfe,0x4e,0x98,\r\n0x01,0x35,0x06,0x01,0x65,0x95,0xfe,0x1f,0xfd,0x14,0x85,0x00,0x00,0x01,0x00,0x44,0x00,0x00,0x04,0x12,0x05,0x9a,0x00,0x1b,0x00,0x9d,0x40,0x4f,0x0f,0x1b,0x01,0x00,0x14,0x01,0x10,0x05,0x01,0x08,0x0b,0x00,0x4d,0x01,0x04,0x00,0x04,0x12,0x0f,0x13,0x0f,0x04,0x01,0x0f,0x17,0x12,0x12,0x0f,0x9a,0x59,0x08,0x05,0x0b,0x0e,0x0e,0x0b,\r\n0x9a,0x59,0x04,0x01,0x0f,0x12,0x0e,0x12,0x0e,0x09,0x14,0x00,0x03,0x09,0x12,0x03,0x03,0x07,0x0e,0x09,0x0a,0x0c,0x42,0x10,0x0c,0x0c,0x0a,0x13,0x00,0x0e,0x09,0x0a,0x13,0x42,0x13,0x13,0x05,0x0e,0x17,0x03,0x09,0x7e,0x0a,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x20,0x0a,0x01,0x0a,0x2f,0x5d,0x2b,0xe1,0x17,0x39,0x33,0x2f,0x2b,0x01,\r\n0x10,0xe0,0x11,0x12,0x39,0x18,0x2f,0xc4,0x2b,0x01,0x10,0xf2,0xc2,0x18,0x2f,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x00,0x33,0x12,0x39,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x01,0x2b,0x5f,0x5e,0x5d,0x5d,0x01,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,\r\n0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x04,0x12,0xfe,0x9c,0x01,0x1d,0xfe,0xb2,0x01,0x4e,0xfe,0xb2,0xa4,0xfe,0xa8,0x01,0x58,0xfe,0xa8,0x01,0x23,0xfe,0xa0,0xc0,0xfa,0x1c,0x13,0x04,0x0d,0x24,0xfc,0x05,0x9a,0xfd,0x70,0x8b,0xcf,0x8b,0xfe,0xdb,0x01,0x25,0x8b,0xcf,0x8b,\r\n0x02,0x90,0xfd,0xfe,0x3a,0x35,0x2a,0x4b,0x01,0xfc,0x00,0x01,0x00,0xa6,0xfe,0x74,0x04,0x18,0x04,0x00,0x00,0x18,0x00,0x5d,0x40,0x13,0x0f,0x08,0x01,0x10,0x05,0x03,0x14,0x00,0x89,0x01,0x01,0x17,0x8a,0x14,0x10,0x0d,0x06,0x4d,0x14,0xb8,0xff,0xfa,0xb7,0x0b,0x06,0x4d,0x14,0x0e,0x0a,0x8a,0x0b,0xb8,0xff,0xf8,0x40,0x16,0x0d,0x06,\r\n0x4d,0x0b,0x0c,0x16,0x0f,0x0b,0x08,0x04,0x11,0x06,0x11,0x99,0x59,0x06,0x16,0x00,0x15,0x2f,0x1a,0x01,0x5d,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x2f,0x3f,0xc4,0x01,0x2f,0x2b,0xe1,0x32,0x2f,0x2b,0x2b,0xe1,0x39,0x2f,0xe1,0x12,0x39,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x21,0x23,0x26,0x35,0x23,0x06,0x23,0x22,0x27,0x23,0x11,\r\n0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x04,0x18,0xaa,0x17,0x05,0x54,0xc3,0xa7,0x47,0x04,0xa3,0xa3,0x8a,0x6f,0x79,0x97,0xa6,0x48,0x60,0xbf,0x7b,0xfe,0x10,0x05,0x8c,0xfd,0x8e,0x7f,0x96,0xac,0x91,0x02,0x4a,0xfd,0x09,0xbc,0x00,0x02,0x00,0x4e,0xff,0xe8,0x04,0x04,0x05,0xd1,0x00,0x16,0x00,0x21,\r\n0x00,0x6e,0x40,0x0f,0x06,0x1a,0x01,0x0f,0x02,0x01,0x10,0x04,0x05,0x05,0x12,0x17,0x0b,0x8a,0x01,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x01,0x01,0x23,0x1c,0x89,0x12,0xb8,0xff,0xe8,0x40,0x20,0x0c,0x06,0x4d,0x12,0x17,0x01,0x19,0x15,0x19,0x9a,0x59,0x15,0x10,0x0f,0x05,0x01,0x0d,0x03,0x05,0x05,0x03,0x08,0x03,0x9a,0x59,0x08,\r\n0x0f,0x1f,0x9a,0x59,0x0f,0x13,0x00,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x33,0x01,0x18,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x33,0x12,0x39,0x19,0x2f,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x01,0x33,0x12,0x21,0x22,0x07,0x37,0x36,0x33,0x32,0x12,0x11,0x14,0x02,0x00,0x23,\r\n0x22,0x26,0x35,0x10,0x00,0x33,0x32,0x13,0x26,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x03,0x5e,0x04,0x1a,0xfe,0xdc,0x7b,0x7b,0x27,0x77,0x81,0xc2,0xc1,0x82,0xfe,0xf2,0xb8,0xa6,0xc8,0x01,0x27,0xe3,0xb2,0x48,0x3a,0xac,0xa0,0xd6,0x71,0x61,0x97,0xd8,0x03,0x68,0x01,0xdc,0x50,0x9c,0x41,0xfe,0xf8,0xfe,0xdd,0xdd,0xfe,0x20,\r\n0xfe,0xff,0xd5,0xb5,0x01,0x10,0x01,0x8e,0xfe,0xa4,0xd1,0xfe,0xc6,0xd2,0x7a,0x8d,0x01,0x3f,0x00,0x01,0x00,0x33,0xfe,0x2b,0x04,0xba,0x05,0x9a,0x00,0x0b,0x00,0x46,0x40,0x25,0x03,0x0a,0x01,0x04,0x09,0x01,0x03,0x08,0x01,0x10,0x03,0x06,0x00,0x00,0x0d,0x08,0x04,0x0a,0x02,0x04,0x06,0x07,0x06,0x07,0x91,0x59,0x06,0x03,0x02,0x00,\r\n0x0b,0x00,0x0b,0x91,0x59,0x00,0x1b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0x33,0xc6,0x32,0x12,0x39,0x2f,0xc4,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x01,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x04,0xba,0xfb,0x79,0x02,0xa4,0xfd,0x81,0x04,0x3a,0xfc,0xbc,0x02,0x52,\r\n0xfd,0x8f,0x03,0x8b,0xfe,0x2b,0x4e,0x03,0x73,0x03,0x54,0x5a,0x9a,0xfc,0xf0,0xfc,0xd4,0x00,0x00,0x01,0x00,0xbc,0xfe,0x2b,0x05,0x52,0x05,0x9a,0x00,0x07,0x00,0x3b,0x40,0x0d,0x00,0x7e,0x01,0x18,0x0d,0x06,0x4d,0x01,0x01,0x09,0x04,0x7e,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf8,0x40,0x0d,0x0c,0x06,0x4d,0x05,\r\n0x07,0x02,0x91,0x59,0x07,0x03,0x04,0x00,0x1b,0x00,0x3f,0xc4,0x3f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x05,0x52,0xa8,0xfc,0xba,0xa8,0x04,0x96,0xfe,0x2b,0x06,0xd5,0xf9,0x2b,0x07,0x6f,0x00,0x00,0x01,0x00,0xbe,0xfe,0x1a,0x03,0x94,0x06,0x02,0x00,0x15,\r\n0x00,0x43,0x40,0x0a,0x00,0x0e,0x05,0x8a,0x0f,0x0f,0x0b,0x42,0x0b,0x0f,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xe0,0x40,0x13,0x0b,0x06,0x4d,0x0f,0x0f,0x17,0x16,0x13,0x02,0x9a,0x59,0x13,0x01,0x08,0x0d,0x9a,0x59,0x08,0x1c,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x2b,0x2b,0xc6,0x2b,0x01,\r\n0x10,0xf1,0xe2,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x03,0x94,0x30,0x3f,0xaa,0xbb,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0xbb,0x8a,0x4c,0x2c,0x05,0x5c,0x1b,0xd9,0xfa,0xd6,0x9e,0xbc,0x13,0x93,0x1a,0xd9,0x05,0x27,0xa0,0xbc,0x12,0x00,0x02,0x00,0x52,\r\n0x02,0xba,0x02,0xb0,0x05,0xb0,0x00,0x15,0x00,0x1f,0x00,0x6e,0x40,0x42,0x00,0x13,0x01,0x0f,0x06,0x01,0x10,0x05,0x0b,0x16,0x54,0x59,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x09,0x03,0x0b,0x0b,0x12,0x1c,0x00,0x24,0x02,0x1c,0x05,0x1c,0x54,0x59,0x05,0x25,0x0f,0x30,0x0d,0x11,0x48,0x0f,0x0f,0x0d,0x12,0x0d,0x52,0x59,0x12,0x04,0x0b,\r\n0x02,0x1f,0xc2,0xc0,0x00,0x01,0xd0,0x00,0x01,0x00,0x21,0x0f,0x0f,0x19,0xc2,0x08,0x2f,0xe1,0x39,0x2f,0x10,0xde,0x5d,0x71,0xe1,0x32,0x32,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x01,0x23,0x35,0x23,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x07,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x02,0xb0,0x81,0x04,0x4f,0x98,0x6d,0x85,0xf8,0xe5,0x97,0x88,0x76,0x6f,0x9b,0x7e,0x8e,0x81,0xb4,0xa8,0x4d,0x40,0x52,0x7d,0x02,0xcd,0x64,0x77,0x77,0x5d,0xca,0x21,0x1f,0xa8,0x56,0x80,0x46,0x90,\r\n0x82,0x6b,0x19,0x17,0x6f,0x33,0x40,0x7a,0x55,0x00,0x00,0x02,0x00,0x4e,0x02,0xb8,0x03,0x23,0x05,0xae,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x1a,0x00,0x12,0x52,0x59,0x00,0x25,0x06,0x0c,0x52,0x59,0x06,0x04,0x15,0xc8,0x90,0x09,0xb0,0x09,0xc0,0x09,0x03,0x09,0x19,0x0f,0xc8,0x03,0x2f,0xe1,0x10,0xde,0x71,0xe1,0x00,0x3f,0x2b,0x00,\r\n0x18,0x3f,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xb4,0xa7,0xbf,0xcd,0xa9,0xa3,0xbc,0xc7,0xa0,0x6a,0x7d,0x77,0x6e,0x69,0x7b,0x79,0x02,0xb8,0xc9,0xac,0xb5,0xcc,0xc7,0xab,0xb2,0xd2,0x02,0x88,0x90,0x7f,0x7c,0x8c,0x8f,0x7b,\r\n0x7e,0x8f,0x00,0x01,0x00,0x64,0x00,0x00,0x05,0xa9,0x05,0xb2,0x00,0x1b,0x00,0xc9,0x40,0x0c,0x59,0x19,0x01,0x59,0x11,0x01,0x10,0x10,0x0c,0x00,0x4d,0x1a,0xb8,0xff,0xf0,0x40,0x27,0x0c,0x00,0x4d,0x0c,0x08,0x0c,0x00,0x4d,0x02,0x08,0x0c,0x00,0x4d,0x1a,0x18,0x02,0x10,0x12,0x0c,0x02,0x0c,0x02,0x04,0x0a,0x1b,0x1b,0x18,0x08,0x0d,\r\n0x06,0x4d,0x18,0x08,0x0c,0x06,0x4d,0x18,0x7d,0x04,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xdc,0x40,0x40,0x0b,0x06,0x4d,0x00,0x04,0x10,0x04,0x02,0x0b,0x03,0x04,0x04,0x1d,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x7d,0x0f,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,\r\n0x0c,0x06,0x4d,0x12,0x12,0x0b,0x06,0x4d,0x12,0x15,0x07,0x99,0x59,0x15,0x04,0x02,0x0c,0x0e,0x10,0x04,0x00,0x1b,0x00,0x1b,0x99,0x59,0x00,0x12,0x2f,0x1d,0x01,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x3f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0x2b,0xc4,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,\r\n0x2b,0xc1,0x2f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x00,0x2b,0x2b,0x01,0x2b,0x2b,0x00,0x5d,0x5d,0x21,0x21,0x35,0x24,0x11,0x34,0x00,0x23,0x22,0x00,0x15,0x10,0x01,0x15,0x21,0x35,0x05,0x24,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x05,0x25,0x05,0xa9,0xfd,0xf9,0x01,0x59,0xfe,0xea,0xdb,0xde,0xfe,\r\n0xe6,0x01,0x5a,0xfd,0xf8,0x01,0x5c,0xfe,0xa4,0x01,0x72,0x01,0x2e,0x01,0x35,0x01,0x70,0xfe,0xa5,0x01,0x5b,0x93,0xff,0x01,0x7a,0xf5,0x01,0x1d,0xfe,0xe4,0xf5,0xfe,0x86,0xff,0x00,0x93,0x94,0x01,0xeb,0x01,0x93,0x01,0x39,0x01,0x68,0xfe,0x9b,0xfe,0xc5,0xfe,0x6e,0xed,0x01,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0x56,0x04,0x18,\r\n0x00,0x23,0x00,0x2a,0x00,0x35,0x00,0xcd,0x40,0x21,0x56,0x19,0x01,0x51,0x12,0x01,0x59,0x07,0x01,0x58,0x1f,0x01,0x58,0x0a,0x01,0x0f,0x40,0x0b,0x00,0x4d,0x5f,0x07,0x01,0x07,0x07,0x00,0x83,0x24,0x08,0x0c,0x06,0x4d,0x24,0xb8,0xff,0xc0,0x40,0x59,0x0b,0x0c,0x00,0x4c,0x24,0x24,0x37,0x0b,0x14,0x1d,0x2a,0x04,0x01,0x84,0x2b,0x2b,\r\n0x37,0x11,0x00,0x18,0x01,0x18,0x18,0x30,0x83,0x11,0x10,0x0c,0x06,0x4d,0x0f,0x11,0x01,0x0b,0x03,0x11,0x2c,0x14,0x00,0x24,0x24,0x00,0x95,0x59,0x24,0x24,0x04,0x18,0x40,0x09,0x0c,0x48,0x18,0x18,0x16,0x1b,0x16,0x20,0x1e,0x27,0x20,0x27,0x95,0x59,0x20,0x10,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x0c,0x03,0x06,0x06,0x01,0x0b,0x33,\r\n0x0e,0x09,0x04,0x09,0x04,0x95,0x59,0x09,0x16,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x12,0x39,0x39,0x18,0x2f,0x33,0x2f,0x2b,0x11,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0xe1,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0xe1,0x17,\r\n0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x32,0x2f,0x5d,0x30,0x31,0x00,0x2b,0x01,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,\r\n0x07,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x56,0xfd,0x2b,0x03,0xb0,0x99,0xb1,0x90,0x84,0xe2,0xfe,0xf2,0x71,0x04,0x91,0xf2,0x99,0xaf,0x01,0x7f,0x01,0x06,0xd7,0xaf,0x9b,0x94,0xc8,0xe8,0x44,0x04,0x74,0xf0,0xca,0xde,0xa8,0x02,0x85,0x77,0x74,0xa6,0x13,0xa4,0xcb,0x8b,0x89,0x6a,0x5a,0x77,0xa4,0x01,0xd7,0xab,\r\n0xba,0x72,0x9a,0x62,0xe5,0xe5,0xa1,0x87,0x01,0x2c,0x18,0x10,0x01,0x2a,0x7a,0xa4,0x60,0xc8,0xc8,0xfe,0xfb,0xe8,0x37,0x90,0x9c,0xa4,0x88,0xc8,0x3f,0x0c,0x08,0x52,0x5f,0x49,0x59,0xa9,0x00,0x03,0x00,0x31,0xff,0xae,0x04,0x96,0x04,0x66,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0xd4,0xb6,0x58,0x1c,0x01,0x57,0x1b,0x01,0x1d,0xb8,0xff,\r\n0xf0,0x40,0x2b,0x0b,0x0c,0x00,0x4c,0x1d,0x14,0x22,0x19,0x0b,0x08,0x12,0x01,0x04,0x03,0x0d,0x13,0x00,0x00,0x03,0x06,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x06,0x0b,0x06,0x4d,0x03,0x83,0x00,0x22,0x10,0x22,0x02,0x0b,0x03,0x22,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x22,0xb8,0xff,\r\n0xde,0x40,0x47,0x0b,0x06,0x4d,0x22,0x22,0x25,0x19,0x07,0x0d,0x06,0x4d,0x19,0x0a,0x0c,0x06,0x4d,0x19,0x83,0x09,0x0a,0x0d,0x11,0x0d,0x06,0x4d,0x0d,0x0c,0x0c,0x06,0x4d,0x0d,0x19,0x0b,0x06,0x4d,0x0d,0x14,0x1b,0x1c,0x1d,0x04,0x1f,0x16,0x01,0x08,0x0b,0x12,0x04,0x10,0x0a,0x09,0x06,0x00,0x13,0x10,0x40,0x10,0x16,0x95,0x59,0x10,\r\n0x10,0x06,0x1f,0x95,0x59,0x06,0x16,0x2f,0x25,0x01,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x32,0x10,0xce,0x32,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x01,0x2f,0x2b,0x2b,0x2b,0xce,0x32,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0xf1,0x2b,0x2b,0x2b,0xca,0x2f,0x32,0x11,0x12,0x17,0x39,\r\n0x11,0x12,0x39,0x39,0x31,0x30,0x00,0x2b,0x5d,0x5d,0x01,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x10,0x00,0x33,0x32,0x17,0x37,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x96,0xa8,0x62,0xfe,0xea,0xe8,0xc0,0x7e,0x91,0x52,0x95,0x66,0x01,0x1c,0xf0,0xb8,0x7c,\r\n0xa2,0xfe,0xf3,0x4f,0x88,0x9f,0xb7,0x32,0x02,0x41,0xfe,0x04,0x57,0x86,0xa3,0xab,0x04,0x18,0xb4,0x8a,0xd0,0xfc,0xfe,0xda,0x66,0xa0,0x4e,0xa4,0x89,0xcb,0x01,0x02,0x01,0x22,0x62,0xb0,0xfe,0xde,0x4a,0xd7,0xbd,0x84,0x5c,0x01,0xcc,0xfd,0xd8,0x4c,0xd0,0xbe,0x86,0x00,0x00,0x02,0x00,0x8f,0xfe,0x52,0x03,0x3d,0x04,0x16,0x00,0x23,\r\n0x00,0x33,0x00,0x45,0x40,0x25,0x0f,0x12,0x01,0x10,0x05,0x11,0x0f,0x14,0x0f,0x95,0x59,0x14,0x00,0x2c,0x24,0x2c,0xb0,0x5b,0x24,0x10,0x20,0xef,0x03,0x30,0xaf,0x70,0x28,0x01,0x28,0x28,0x11,0x19,0x84,0x0a,0x0a,0x34,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0xe1,0xd4,0xe1,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2f,0x2b,\r\n0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x01,0x16,0x16,0x15,0x14,0x0e,0x04,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x27,0x13,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x02,0x71,0x09,0x0e,0x33,0x4c,0x5a,0x4c,0x33,0x25,0x40,\r\n0x54,0x2f,0xa9,0x7c,0x99,0xa4,0x4c,0x86,0x64,0x3b,0x34,0x4f,0x5c,0x4f,0x34,0x16,0x0b,0x47,0x2c,0x22,0x21,0x21,0x21,0x2d,0x2d,0x21,0x21,0x21,0x22,0x02,0x76,0x1a,0x53,0x29,0x40,0x67,0x5a,0x53,0x55,0x5d,0x38,0x30,0x4a,0x32,0x19,0x85,0xb0,0x60,0x28,0x4f,0x76,0x4e,0x4a,0x74,0x61,0x54,0x53,0x5a,0x36,0x2e,0x4b,0x1a,0x01,0xa0,\r\n0x20,0x1f,0x2f,0x2e,0x20,0x21,0x21,0x20,0x2e,0x2f,0x1f,0x20,0x00,0x02,0x00,0xb4,0xfe,0x6a,0x01,0x92,0x04,0x16,0x00,0x0b,0x00,0x0f,0x00,0x3d,0x40,0x12,0x0d,0x0c,0x0e,0x0f,0xff,0x3a,0x0c,0x7d,0x0d,0x0d,0x09,0xaf,0x0f,0x03,0x01,0x10,0x03,0x03,0xb8,0xff,0xe8,0x40,0x0e,0x0d,0x06,0x4d,0x03,0x0e,0x00,0x40,0x06,0x00,0xb0,0x5b,\r\n0x06,0x10,0x0c,0x00,0x2f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xce,0x01,0x2f,0x2b,0x5f,0x5e,0x5d,0xe1,0x39,0x2f,0xe1,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x13,0x33,0x01,0x23,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x2b,0xac,0x13,0x86,0x03,0x3a,0x40,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x40,\r\n0xfb,0x30,0x04,0x06,0x00,0x01,0x00,0xe8,0x00,0xfe,0x04,0x94,0x03,0x31,0x00,0x05,0x00,0x2c,0xb2,0x01,0xbd,0x00,0xb8,0xff,0xc8,0xb4,0x0c,0x06,0x4d,0x00,0x03,0xb8,0xff,0xe0,0x40,0x0b,0x0c,0x06,0x4d,0x03,0x00,0x03,0x04,0x03,0xbe,0x59,0x04,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x01,0x2f,0x2b,0x2f,0x2b,0xe1,0x31,0x30,0x25,0x23,\r\n0x11,0x21,0x35,0x21,0x04,0x94,0x84,0xfc,0xd8,0x03,0xac,0xfe,0x01,0xae,0x85,0x00,0x00,0x01,0x00,0x7b,0x00,0x00,0x04,0x5a,0x05,0xec,0x00,0x08,0x00,0x41,0x40,0x22,0x0a,0x03,0x01,0x0b,0x02,0x01,0x03,0x0f,0x01,0x01,0x10,0x05,0x01,0x02,0x00,0x03,0x03,0x04,0x08,0x00,0x04,0x07,0x01,0x05,0x04,0xd9,0x59,0x05,0x05,0x01,0x00,0x00,\r\n0x01,0x12,0x00,0x3f,0x3f,0x11,0x39,0x2f,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x5d,0x01,0x01,0x23,0x01,0x23,0x35,0x21,0x01,0x01,0x04,0x5a,0xfe,0x7b,0x71,0xfe,0xc1,0xaa,0x01,0x08,0x01,0x13,0x01,0x4e,0x05,0xec,0xfa,0x14,0x02,0xee,0x78,0xfd,0x6b,0x05,\r\n0x1b,0x00,0x00,0x01,0x00,0x5e,0xfe,0xea,0x03,0xb8,0x05,0x9a,0x00,0x1c,0x00,0x89,0x40,0x12,0x79,0x13,0x01,0x79,0x11,0x01,0x77,0x09,0x01,0x77,0x03,0x01,0x0a,0x30,0x0c,0x00,0x4d,0x04,0xb8,0xff,0xf0,0x40,0x3c,0x0c,0x00,0x4d,0x0f,0x06,0x01,0x09,0x06,0x06,0x04,0x08,0x05,0x04,0x03,0x09,0x13,0x16,0x17,0x09,0x04,0x12,0x00,0x14,\r\n0x20,0x14,0x30,0x14,0x03,0x0a,0x03,0x14,0x14,0x12,0x12,0x0d,0x1c,0x0d,0x08,0x05,0x13,0x16,0x16,0x13,0x95,0x59,0x16,0x16,0x1d,0x1a,0x1a,0x02,0x95,0x59,0x1a,0x03,0x0b,0x10,0x95,0x59,0x0b,0x00,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x01,0x18,0x2f,0x2f,0x12,0x39,0x11,0x33,\r\n0x2f,0x5f,0x5e,0x5d,0x11,0x17,0x33,0x11,0x17,0x33,0x11,0x33,0x2f,0x5e,0x5d,0x31,0x30,0x2b,0x00,0x2b,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x26,0x23,0x22,0x07,0x07,0x33,0x15,0x23,0x03,0x02,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x13,0x23,0x35,0x33,0x37,0x36,0x36,0x33,0x32,0x17,0x03,0xb8,0x30,0x3c,0x92,0x18,0x1f,0xa6,0xbb,0x5a,\r\n0x3a,0xfe,0xde,0x1f,0x3b,0x24,0x32,0x96,0x28,0x5b,0x67,0x7c,0x1c,0x11,0xaf,0x86,0x40,0x34,0x04,0xf2,0x1c,0xa0,0xd0,0x8a,0xfd,0x78,0xfe,0x5e,0x10,0x8f,0x15,0x01,0x24,0x02,0x7c,0x8a,0xdb,0x83,0x9e,0x13,0x00,0x02,0x00,0xd1,0x00,0xf0,0x04,0xaa,0x03,0xc0,0x00,0x14,0x00,0x29,0x00,0x97,0xb9,0x00,0x16,0xff,0xe0,0xb3,0x09,0x0c,\r\n0x48,0x01,0xb8,0xff,0xe0,0x40,0x3a,0x09,0x0c,0x48,0x20,0x20,0x09,0x0c,0x48,0x0b,0x20,0x09,0x0c,0x48,0x1e,0x18,0x18,0x26,0xbe,0x59,0x18,0x1c,0x40,0x22,0x1c,0xbe,0x59,0x15,0x00,0x22,0x01,0x0c,0x03,0x22,0x0d,0x09,0x03,0x03,0x11,0xbe,0x59,0x03,0x07,0x40,0x0d,0x07,0xbe,0x59,0x14,0x00,0x0d,0xa0,0x0d,0xb0,0x0d,0x03,0x0c,0x03,\r\n0x0d,0xb8,0xff,0xc0,0x40,0x14,0x0e,0x11,0x48,0x0d,0x29,0x15,0x14,0xbd,0x00,0x1f,0x1e,0x09,0xbd,0x0a,0x2a,0x2b,0x0a,0x00,0xff,0x3a,0x2b,0x01,0x10,0xe1,0x39,0x39,0x10,0xe1,0x39,0x39,0x00,0x18,0x2f,0x2b,0x5f,0x5e,0x5d,0xc4,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x10,0xd4,0x5f,0x5e,0x5d,0xc4,0x2b,0x00,0x1a,\r\n0x18,0x10,0xcc,0x2b,0x00,0x10,0x18,0xc4,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x01,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x13,0x06,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x04,0xaa,0x07,0x93,0x7e,0x6d,0x9c,\r\n0x61,0x3e,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x87,0x07,0x93,0x7e,0x6d,0x9c,0x5e,0x41,0x8c,0x06,0x87,0x05,0x95,0x7f,0x6a,0x81,0x84,0x41,0x3d,0x4a,0x02,0x03,0xc0,0x92,0xa2,0x6c,0x44,0xb0,0x90,0xa4,0x58,0x5a,0x62,0x50,0xfe,0x65,0x93,0xa2,0x6c,0x42,0xae,0x8f,0xa6,0x58,0x5b,0x64,0x4f,0x00,0x02,\r\n0x00,0x33,0x00,0x00,0x04,0xf8,0x05,0x9a,0x00,0x05,0x00,0x0d,0x00,0x3f,0x40,0x22,0x00,0x0d,0x01,0x00,0x0c,0x01,0x0f,0x07,0x01,0x0f,0x06,0x01,0x10,0x04,0x0d,0x06,0x02,0x05,0x05,0x0f,0x02,0x09,0x03,0x03,0x05,0x02,0x01,0x0d,0x01,0x0d,0x99,0x59,0x01,0x12,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x01,0x2f,0x12,\r\n0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x01,0x33,0x01,0x27,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x04,0xf8,0xfb,0x3b,0x02,0x09,0xae,0x02,0x0e,0xd7,0xfe,0x97,0x21,0x05,0x04,0x06,0x22,0xfe,0xa0,0x4c,0x05,0x4e,0xfa,0xb2,0x4c,0x03,0xc8,0x58,0x36,0x30,0x5e,0xfc,0x38,0x00,0x02,0x00,0x5c,\r\n0x00,0xc8,0x03,0xb4,0x03,0x70,0x00,0x05,0x00,0x0b,0x00,0x2b,0x40,0x15,0x06,0x0a,0x00,0x04,0x00,0x00,0x04,0xf0,0x05,0x02,0x08,0x80,0x0a,0x0a,0x06,0xf0,0x0b,0x0f,0x08,0x01,0x08,0x2f,0x5d,0x33,0xf1,0xc0,0x2f,0x1a,0x10,0xdc,0x32,0xf1,0xc2,0x2f,0x00,0x2f,0xc6,0x39,0x39,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x03,0x23,0x01,\r\n0x01,0x33,0x01,0x03,0xb2,0xa8,0xfe,0xd5,0x01,0x2b,0xaa,0xfe,0xcd,0x54,0xa6,0xfe,0xd5,0x01,0x2b,0xa6,0xfe,0xd1,0xc8,0x01,0x50,0x01,0x58,0xfe,0xa8,0xfe,0xb0,0x01,0x50,0x01,0x58,0xfe,0xa8,0x00,0x00,0x02,0x00,0x5a,0x00,0xc8,0x03,0xb4,0x03,0x70,0x00,0x05,0x00,0x0b,0x00,0x2b,0x40,0x17,0x07,0x0b,0x02,0x04,0x03,0x00,0xf0,0x04,\r\n0x02,0x80,0x09,0x06,0xf0,0x0a,0x50,0x08,0x70,0x08,0x02,0x2f,0x08,0x01,0x08,0x2f,0x5d,0x5d,0xc4,0xe1,0x32,0x1a,0xdc,0xc4,0xe1,0x32,0x00,0x2f,0xc4,0x39,0x39,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,0x03,0x01,0x23,0x01,0x01,0x33,0x03,0xb4,0xfe,0xd3,0xa5,0x01,0x2e,0xfe,0xd2,0xa5,0x58,0xfe,0xd5,0xaa,0x01,0x34,0xfe,0xcc,0xaa,\r\n0x02,0x1a,0xfe,0xae,0x01,0x52,0x01,0x56,0xfe,0xaa,0xfe,0xae,0x01,0x52,0x01,0x56,0x00,0x03,0x00,0x8c,0xff,0xee,0x05,0x52,0x00,0xcd,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x56,0xb2,0x03,0xaf,0x09,0xb8,0xff,0xfd,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfb,0x40,0x27,0x0b,0x06,0x4d,0x09,0x0e,0x15,0x0f,0x1b,0x42,0x21,0xaf,0x1b,0x1b,\r\n0x24,0x15,0xaf,0x0f,0x0f,0x25,0x24,0x0c,0x12,0x18,0x1e,0x04,0x00,0x06,0x00,0x06,0xb0,0x5b,0x00,0x13,0x40,0x25,0x01,0x2f,0x25,0x01,0x5d,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x11,0x12,0x01,0x39,0x18,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x31,0x30,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x04,0xe4,0x2e,0x3f,0x3f,0x2e,0x2d,0x41,0x41,0xfd,0xdd,0x2e,0x41,0x41,0x2e,0x2d,0x41,0x41,0xfd,0xdd,0x2e,0x3e,0x3e,0x2e,0x2d,0x41,0x40,0x12,0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,\r\n0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x40,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x66,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x1f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x23,0x11,0x10,0x06,0x07,0x3e,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x0b,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x2d,0x01,0x59,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x1a,0x10,0x06,0x07,0x25,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x0a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,\r\n0x00,0xd8,0x01,0xab,0x01,0x58,0x00,0x13,0x40,0x0b,0x02,0x0a,0x22,0x18,0x03,0x09,0x25,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x07,0x12,0x05,0xb2,0x00,0x18,0x00,0x23,0x00,0xb7,0x40,0x1d,0x06,0x18,0x0b,0x00,0x4d,0x14,0x11,0x00,0x00,0x25,0x13,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,\r\n0x0c,0x06,0x4d,0x17,0x08,0x0b,0x06,0x4d,0x17,0x7e,0x19,0xb8,0xff,0xd0,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0xff,0xd8,0x40,0x4f,0x0b,0x06,0x4d,0x00,0x19,0x01,0x0b,0x03,0x19,0x19,0x25,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x7d,0x08,0x10,0x0d,0x06,\r\n0x4d,0x08,0x10,0x0c,0x06,0x4d,0x08,0x18,0x0b,0x06,0x4d,0x08,0x14,0x15,0x91,0x59,0x14,0x10,0x00,0x14,0x91,0x2b,0x30,0x0b,0x1c,0x91,0x59,0x0b,0x04,0x10,0x11,0x91,0x59,0x10,0x03,0x05,0x22,0x91,0x59,0x05,0x13,0x00,0x18,0x91,0x59,0x00,0x12,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,\r\n0x18,0x2f,0x2b,0x01,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xc4,0xc4,0x31,0x30,0x2b,0x21,0x21,0x22,0x07,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x25,0x11,0x26,0x23,\r\n0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x07,0x12,0xfd,0x30,0x10,0x7a,0x62,0x54,0xfe,0xc8,0xfe,0x94,0x01,0x7b,0x01,0x45,0x5a,0x58,0x70,0x02,0x02,0xb0,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0xfd,0x08,0xa0,0x6c,0xe5,0xfe,0xe5,0x01,0x17,0xe3,0x74,0x0e,0x0a,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0x0a,0x0e,0x98,0xfe,0x23,0x97,\r\n0xfe,0x0a,0x08,0x04,0x5e,0x1c,0xfe,0xb4,0xfe,0xfd,0xfe,0xfe,0xfe,0xb6,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x21,0x04,0x18,0x00,0x1c,0x00,0x23,0x00,0x2f,0x00,0xfb,0xb3,0x58,0x07,0x01,0x0b,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x02,0xb8,0xff,0xe8,0x40,0x0d,0x0c,0x00,0x4d,0x06,0x40,0x0f,0x12,0x48,0x06,0x06,0x1c,0x83,0x1d,0xb8,\r\n0xff,0xc0,0xb3,0x0c,0x00,0x4d,0x1d,0xb8,0xff,0xd0,0xb3,0x0c,0x01,0x4d,0x1d,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1d,0xb8,0xff,0xee,0x40,0x1b,0x0b,0x06,0x4d,0x1d,0x40,0x0c,0x00,0x4d,0x00,0x1d,0x01,0x0b,0x1d,0x1d,0x31,0x0b,0x17,0x23,0x03,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x2d,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x2d,0xb8,\r\n0xff,0xc0,0x40,0x51,0x0c,0x00,0x4d,0x2d,0x2d,0x31,0x27,0x0a,0x0d,0x06,0x4d,0x27,0x0a,0x0c,0x06,0x4d,0x27,0x0a,0x0b,0x06,0x4d,0x27,0x83,0x11,0x10,0x0d,0x06,0x4d,0x11,0x0d,0x0c,0x06,0x4d,0x11,0x1f,0x0b,0x06,0x4d,0x11,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x0c,0x03,0x06,0x06,0x01,0x04,0x1d,0x00,0x95,0x59,0x1d,0x1d,0x04,0x17,\r\n0x24,0x14,0x20,0x19,0x19,0x20,0x95,0x59,0x19,0x10,0x0b,0x2a,0x0e,0x09,0x04,0x09,0x04,0x95,0x59,0x09,0x16,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x32,0x12,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,\r\n0x2f,0x2b,0x2b,0xe1,0x2b,0x17,0x39,0x12,0x39,0x2f,0x5e,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0xf1,0xc0,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x23,0x06,0x21,0x22,0x00,0x35,0x10,0x00,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x07,0x21,0xfd,0x2b,0x03,0xb1,0x9a,0xaf,0x90,0x88,0xdd,0xfe,0xf2,0x70,0x04,0x83,0xfe,0xe3,0xe5,0xfe,0xf3,0x01,0x1c,0xf0,0x01,0x26,0x6c,0x04,0x77,0x01,0x0a,0xc4,0xda,0xa8,0x02,0x86,0x74,0x78,0xa7,0x10,0xfe,0x10,0x9e,0xb8,0xb8,0x9c,0x9f,0xad,0xad,0x01,0xd7,0xab,0xba,\r\n0x72,0x9a,0x62,0xed,0xed,0x01,0x1e,0xec,0x01,0x02,0x01,0x24,0xeb,0xeb,0xfe,0xf9,0xe2,0x33,0x8e,0x9e,0xab,0x81,0x01,0x2c,0xd9,0xbf,0xb4,0xd0,0xcd,0xbd,0xc2,0xd0,0x00,0x01,0x00,0x00,0x01,0xfa,0x04,0x00,0x02,0x7b,0x00,0x03,0x00,0x0f,0xb6,0x02,0x01,0xeb,0x59,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,\r\n0x21,0x04,0x00,0xfc,0x00,0x04,0x00,0x01,0xfa,0x81,0x00,0x01,0x00,0x00,0x01,0xfa,0x08,0x00,0x02,0x7b,0x00,0x03,0x00,0x0f,0xb6,0x02,0x01,0xeb,0x59,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x08,0x00,0xf8,0x00,0x08,0x00,0x01,0xfa,0x81,0x00,0x02,0x00,0x6a,0x03,0xf4,0x02,0x9c,0x05,0xb2,0x00,0x03,\r\n0x00,0x07,0x00,0x23,0x40,0x13,0x03,0x02,0x06,0xb3,0x40,0x07,0x04,0x00,0xb4,0x02,0x04,0xb4,0x80,0x10,0x06,0x20,0x06,0x02,0x06,0x2f,0x5d,0x1a,0xe9,0xdc,0xe9,0x00,0x3f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x9c,0x6f,0x93,0x8d,0xbb,0x6c,0x96,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,\r\n0x01,0xbe,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x13,0x03,0x02,0x06,0xb3,0x40,0x07,0x04,0x00,0xb4,0x02,0x04,0xb4,0x80,0x10,0x06,0x20,0x06,0x02,0x06,0x2f,0x5d,0x1a,0xe9,0xdc,0xe9,0x00,0x3f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,\r\n0x76,0x6c,0x9a,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x01,0x00,0x6a,0x03,0xf4,0x01,0x6c,0x05,0xb2,0x00,0x03,0x00,0x18,0x40,0x0c,0x02,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0xaf,0x02,0x01,0x02,0x2f,0x5d,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x6c,0x6c,0x96,0x8c,0x05,\r\n0xb2,0xfe,0x42,0x01,0xbe,0x00,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x14,0x40,0x09,0x02,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0x02,0x2f,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x70,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0x00,0x00,0x03,0x00,0xe8,0x00,0x70,0x04,0x94,\r\n0x04,0x3a,0x00,0x0a,0x00,0x0e,0x00,0x19,0x00,0x4b,0x40,0x25,0x15,0x0f,0xd6,0x5b,0x15,0x15,0x0c,0x0d,0x0c,0xbe,0x59,0x0d,0x00,0x42,0x00,0x06,0xd6,0x5b,0x00,0x0f,0x0d,0x01,0x0d,0x03,0x0d,0x0b,0x0e,0x17,0x12,0x0c,0x42,0x0c,0x08,0x03,0x17,0xd3,0x12,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x12,0x2f,0x2b,0xe1,0x39,0x39,0xc6,0x2b,\r\n0x01,0x10,0xe2,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0xc6,0x2b,0x2b,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x06,0x01,0x21,0x35,0x21,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x06,0x02,0xc4,0x2c,0x3c,0x3a,0x2e,0x67,0x3d,0x01,0xa6,0xfc,0x54,0x03,0xac,0xfe,0x2c,0x2c,\r\n0x3e,0x3c,0x2e,0x65,0x3a,0x03,0x64,0x3d,0x2c,0x2d,0x40,0x6b,0x2f,0x3c,0xfe,0xae,0x86,0xfd,0xd8,0x3c,0x2b,0x2d,0x42,0x6d,0x2d,0x3c,0x00,0x02,0x00,0x6c,0x00,0x00,0x04,0x40,0x05,0x9a,0x00,0x05,0x00,0x09,0x00,0x28,0x40,0x11,0x03,0x08,0x06,0x00,0x00,0x01,0x05,0x03,0x01,0x12,0x08,0x06,0x03,0x00,0x00,0x0b,0x03,0x2f,0x12,0x39,\r\n0x2f,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x3d,0x2f,0x18,0xc4,0xc4,0x3d,0xc4,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,0x09,0x03,0x04,0x40,0xfe,0x3b,0x4c,0xfe,0x3d,0x01,0xc3,0x4c,0x01,0x3f,0xfe,0x9c,0xfe,0x9c,0x01,0x64,0x02,0xcd,0xfd,0x33,0x02,0xcb,0x02,0xcf,0xfd,0x33,0x02,0x3f,0xfd,0xc1,0xfd,0xbf,0xff,0xff,0x00,0x0e,\r\n0xfe,0x1e,0x03,0xd5,0x05,0x87,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x00,0x8f,0x4f,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x24,0x1e,0x0c,0x00,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x8f,\r\n0x00,0x95,0x01,0x5b,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0a,0x1d,0x17,0x05,0x00,0x25,0x02,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x01,0xfe,0xc8,0x00,0x00,0x02,0xb2,0x05,0x9a,0x00,0x03,0x00,0x0e,0xb5,0x00,0x03,0x02,0x12,0x00,0x02,0x2f,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x01,0x23,0x01,\r\n0x02,0xb2,0xfc,0xa6,0x90,0x03,0x5b,0x05,0x9a,0xfa,0x66,0x05,0x9a,0x00,0x00,0x01,0x00,0x66,0xff,0xe8,0x03,0xf6,0x05,0xb2,0x00,0x25,0x00,0xcb,0x40,0x0c,0x02,0x13,0x01,0x0b,0x00,0x01,0x02,0x22,0x01,0x10,0x04,0x0f,0xb8,0xff,0xe8,0x40,0x65,0x0b,0x00,0x4d,0x03,0x10,0x0b,0x0c,0x00,0x4c,0x13,0x14,0x00,0x25,0x21,0x1e,0x04,0x07,\r\n0x07,0x04,0x9a,0x59,0x07,0x0e,0x40,0x1c,0x19,0x0b,0x0e,0x0e,0x0b,0x9a,0x59,0x0f,0x0e,0x5f,0x0e,0x7f,0x0e,0x8f,0x0e,0x04,0x0b,0x03,0x0e,0x0e,0x11,0x23,0x00,0x14,0x10,0x14,0x02,0x0c,0x04,0x14,0x14,0x16,0x11,0x16,0x9a,0x59,0x11,0x07,0x00,0x25,0x10,0x25,0x02,0x0c,0x04,0x25,0x25,0x23,0x02,0x23,0x9a,0x59,0x02,0x19,0x1f,0x1a,\r\n0x14,0x00,0x00,0x27,0x19,0x1c,0x1e,0x21,0x04,0x1d,0x8a,0x09,0x0c,0x06,0x04,0x07,0x0b,0x0e,0x04,0x09,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x17,0x33,0xde,0xc4,0x10,0xe1,0x17,0x32,0x12,0x39,0x2f,0xd4,0xd6,0xc4,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,\r\n0x5d,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0x2b,0x11,0x12,0x00,0x39,0x39,0x11,0x33,0x11,0x33,0x30,0x31,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x03,0x23,0x35,0x33,0x26,0x35,0x34,0x37,0x23,0x35,0x33,0x36,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,\r\n0x07,0x21,0x15,0x21,0x06,0x17,0x21,0x15,0x21,0x12,0x21,0x32,0x37,0x03,0xf6,0x85,0x95,0xfe,0x55,0x52,0x79,0x6c,0x04,0x06,0x6e,0x83,0x33,0x01,0x1b,0xca,0x89,0x6c,0x72,0x8e,0x7d,0xc3,0x27,0x01,0xf1,0xfd,0xf9,0x08,0x07,0x02,0x08,0xfe,0x08,0x48,0x01,0x16,0x83,0x8d,0x32,0x4a,0x01,0xfa,0x8c,0x1f,0x2e,0x30,0x3c,0x8c,0xf0,0x01,\r\n0x0f,0x38,0xa2,0x4e,0xc9,0xaa,0x8c,0x63,0x56,0x8c,0xfe,0x92,0x57,0x00,0x00,0x01,0x00,0x5c,0x00,0xc8,0x02,0x2f,0x03,0x70,0x00,0x05,0x00,0x1c,0x40,0x0e,0x00,0x04,0x00,0x00,0x04,0xf0,0x05,0x20,0x02,0x01,0x0f,0x02,0x01,0x02,0x2f,0x5d,0x5d,0x33,0xf1,0xc2,0x2f,0x00,0x2f,0xc6,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x02,0x2d,\r\n0xa6,0xfe,0xd5,0x01,0x2b,0xa8,0xfe,0xcf,0xc8,0x01,0x50,0x01,0x58,0xfe,0xa8,0x00,0x00,0x01,0x00,0x5c,0x00,0xc8,0x02,0x2f,0x03,0x70,0x00,0x05,0x00,0x1c,0x40,0x0f,0x02,0x04,0x03,0x00,0xf0,0x04,0x50,0x02,0x70,0x02,0x02,0x0f,0x02,0x01,0x02,0x2f,0x5d,0x5d,0xc4,0xe1,0x32,0x00,0x2f,0xc6,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x33,\r\n0x02,0x2f,0xfe,0xd3,0xa6,0x01,0x30,0xfe,0xd0,0xa6,0x02,0x1a,0xfe,0xae,0x01,0x52,0x01,0x56,0x00,0x03,0x00,0x35,0x00,0x00,0x03,0xea,0x06,0x02,0x00,0x14,0x00,0x20,0x00,0x24,0x00,0xaf,0xb9,0x00,0x11,0xff,0xe8,0x40,0x3d,0x0b,0x00,0x4d,0x15,0x1b,0x63,0x59,0x15,0x23,0x12,0x02,0x95,0x59,0x12,0x01,0x05,0x08,0x23,0x03,0x0b,0x0e,\r\n0x0e,0x0b,0x95,0x59,0x0e,0x0f,0x09,0x21,0x15,0x1e,0x62,0x18,0x21,0x08,0x0d,0x06,0x4d,0x21,0x08,0x0c,0x06,0x4d,0x21,0x08,0x0b,0x06,0x4d,0x21,0x84,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0xb8,0xff,0xf1,0x40,0x1e,0x0b,0x06,0x4d,0x22,0x22,0x26,0x0a,0x06,0x00,0x0c,0x0e,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,\r\n0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xf4,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0xc6,0xd4,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xd4,0xe1,0x00,0x3f,0xc4,\r\n0x3f,0x2b,0x11,0x12,0x00,0x17,0x39,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x00,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0x02,0xa0,0x30,0x3d,0xac,0xf0,0xf0,0xa3,\r\n0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0xdd,0x2d,0x3e,0x3e,0x2d,0x2d,0x40,0x40,0x23,0xa4,0xa4,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0xec,0x3c,0x2e,0x2d,0x3e,0x3d,0x2e,0x2c,0x3e,0xfa,0xfc,0x04,0x00,0x00,0x00,0x02,0x00,0x35,0x00,0x00,0x03,0xcf,0x06,0x02,0x00,0x14,0x00,0x18,0x00,0xa4,0xb9,0x00,\r\n0x11,0xff,0xe8,0x40,0x37,0x0b,0x00,0x4d,0x08,0x05,0x0b,0x0e,0x0e,0x0b,0x95,0x59,0x0e,0x0f,0x12,0x02,0x95,0x59,0x12,0x01,0x18,0x00,0x09,0x15,0x15,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x84,0x70,0x16,0x01,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0xb8,0xff,0xf1,0x40,\r\n0x1e,0x0b,0x06,0x4d,0x16,0x16,0x1a,0x0a,0x06,0x00,0x0c,0x0e,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x0a,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xf4,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,\r\n0x39,0xc6,0xd4,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x23,0x11,0x33,0x02,0xa0,0x30,0x3d,0xac,\r\n0xf0,0xf0,0xa3,0xaf,0xaf,0xba,0x8b,0x4b,0x2c,0x01,0x2f,0xa2,0xa2,0x05,0x5c,0x1b,0xd9,0x9e,0x8c,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0xbb,0x12,0xfa,0x10,0x05,0xec,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x15,0x00,0x5a,0x40,0x2e,0x15,0x10,0x14,0x13,0x12,0x02,0x0e,0x06,0x0b,0x40,0x09,0x08,0x07,0x03,0x00,0x0d,\r\n0x10,0x0d,0x02,0x0a,0x03,0x0d,0x15,0x06,0x05,0x06,0x91,0x59,0x00,0x05,0x11,0x0a,0x0b,0x0a,0x91,0x59,0x10,0x0b,0x05,0x0b,0x05,0x0b,0x03,0x0d,0x03,0x03,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x2b,0x11,0x00,0x33,0x11,0x33,0x2b,0x11,0x00,0x33,0x01,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x33,0x33,0x33,0x1a,0xce,0x32,0xdd,\r\n0x32,0x32,0x32,0x32,0xce,0x32,0x31,0x30,0x01,0x25,0x13,0x23,0x13,0x05,0x35,0x05,0x37,0x27,0x05,0x35,0x05,0x03,0x33,0x03,0x25,0x15,0x25,0x07,0x17,0x25,0x02,0xd8,0xfe,0xd2,0x28,0x9c,0x28,0xfe,0xd2,0x01,0x06,0x3a,0x3a,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x01,0x2e,0xfe,0xfa,0x3a,0x3a,0x01,0x06,0x02,0x07,0x14,0xfe,0xca,0x01,\r\n0x36,0x14,0x96,0x1e,0xc0,0xc0,0x1e,0x96,0x14,0x01,0x36,0xfe,0xca,0x14,0x96,0x1e,0xc0,0xc0,0x1e,0x00,0x00,0x01,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x00,0x0b,0x00,0x15,0x40,0x0b,0x06,0x00,0xb0,0x5b,0x06,0x09,0xaf,0x03,0x2f,0x0d,0x01,0x5d,0x2f,0xe1,0x00,0x2f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,\r\n0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x01,0xfe,0x42,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x42,0x00,0x00,0x01,0x00,0x58,0xff,0x1c,0x01,0x5a,0x00,0xd9,0x00,0x03,0x00,0x2c,0x40,0x1c,0x00,0x10,0x10,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x03,0x10,0x10,0x00,0x4d,0x03,0x10,0x0c,0x00,0x4d,0x02,0xb3,0x40,0x03,0x00,0xb4,\r\n0x80,0x02,0x2f,0x1a,0xe9,0x00,0x2f,0x1a,0xed,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x25,0x03,0x23,0x13,0x01,0x5a,0x8d,0x75,0x6e,0xd9,0xfe,0x43,0x01,0xbd,0x00,0x02,0x00,0x58,0xff,0x1c,0x02,0x89,0x00,0xd9,0x00,0x03,0x00,0x07,0x00,0x4d,0x40,0x35,0x04,0x10,0x10,0x00,0x4d,0x04,0x10,0x0c,0x00,0x4d,0x07,0x10,0x10,0x00,0x4d,0x07,\r\n0x10,0x0c,0x00,0x4d,0x00,0x10,0x10,0x00,0x4d,0x00,0x10,0x0c,0x00,0x4d,0x03,0x10,0x10,0x00,0x4d,0x03,0x10,0x0c,0x00,0x4d,0x03,0x02,0x06,0xb3,0x40,0x07,0x00,0xb4,0x02,0x04,0xb4,0x80,0x06,0x2f,0x1a,0xe9,0xdc,0xe9,0x00,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x25,0x03,0x23,0x13,0x23,\r\n0x03,0x23,0x13,0x02,0x89,0x8b,0x77,0x6d,0x9a,0x8d,0x75,0x6e,0xd9,0xfe,0x43,0x01,0xbd,0xfe,0x43,0x01,0xbd,0x00,0x00,0x07,0x00,0x50,0xff,0xea,0x09,0x5e,0x05,0xb0,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,0x00,0x33,0x00,0x3f,0x00,0x4b,0x01,0x01,0x40,0x3c,0x18,0x03,0x1a,0x3a,0x40,0x52,0x59,0x3a,0x0e,0x34,0x34,0x46,0x52,0x59,\r\n0x34,0x1c,0x22,0x28,0x52,0x59,0x22,0x0e,0x1c,0x1c,0x2e,0x52,0x59,0x1c,0x13,0x1b,0x03,0x06,0x00,0x42,0x00,0x12,0x52,0x59,0x00,0x06,0x06,0x0c,0x52,0x59,0x06,0x04,0x1a,0x18,0x1a,0x18,0x3d,0x03,0x37,0xbd,0x43,0x10,0x0d,0x06,0x4d,0x43,0xb8,0xff,0xf4,0x40,0x0a,0x0b,0x06,0x4d,0x43,0x49,0xc8,0x1f,0x3d,0x01,0x3d,0xb8,0xff,0xf4,\r\n0xb3,0x0d,0x06,0x4d,0x3d,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x3d,0xb8,0xff,0xee,0x40,0x0e,0x0b,0x06,0x4d,0x3d,0x3d,0x03,0x1f,0xbd,0x2b,0x10,0x0d,0x06,0x4d,0x2b,0xb8,0xff,0xf4,0xb6,0x0b,0x06,0x4d,0x2b,0x31,0xc2,0x25,0xb8,0xff,0xe0,0x40,0x14,0x0d,0x06,0x4d,0x25,0x1c,0x0c,0x06,0x4d,0x25,0x07,0x0b,0x06,0x4d,0x25,0x25,0x4d,\r\n0x03,0x09,0xbd,0x15,0xb8,0xff,0xec,0x40,0x16,0x0d,0x06,0x4d,0x15,0x0c,0x0b,0x06,0x4d,0x15,0x0f,0xc8,0x03,0x1c,0x0d,0x06,0x4d,0x03,0x1c,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x39,0x2f,0x2b,\r\n0x2b,0x2b,0x5d,0xe1,0xd4,0x2b,0x2b,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x10,0x18,0xc4,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x18,0x2f,0x3f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x94,0x94,\r\n0xb0,0xba,0x9e,0x99,0xa9,0xbd,0x8b,0x5f,0x6e,0x6c,0x5d,0x5e,0x6a,0x69,0x03,0x59,0xfc,0x66,0x8f,0x03,0x99,0x03,0x42,0x94,0xb0,0xbd,0x9b,0x99,0xa9,0xbc,0x8c,0x60,0x6c,0x6b,0x5d,0x5f,0x6a,0x6a,0xfc,0x79,0x94,0xb0,0xbc,0x9c,0x98,0xaa,0xbd,0x8b,0x60,0x6d,0x6c,0x5d,0x5e,0x6a,0x69,0x02,0xcb,0xc3,0xa3,0xb2,0xcd,0xbe,0xac,0xac,\r\n0xcf,0x02,0x77,0x8d,0x7b,0x79,0x87,0x8c,0x7c,0x79,0x87,0x58,0xfa,0x5c,0x05,0xa4,0xfa,0x50,0xc4,0xa2,0xb1,0xd0,0xbf,0xae,0xab,0xcf,0x02,0x76,0x8d,0x7b,0x78,0x86,0x8d,0x7b,0x79,0x85,0xfd,0x8a,0xc4,0xa2,0xb2,0xcf,0xc0,0xad,0xab,0xcf,0x02,0x76,0x8c,0x7c,0x77,0x87,0x8d,0x7b,0x7a,0x84,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,\r\n0x07,0x69,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x0f,0x01,0x5b,0x00,0x16,0xb9,0x00,0x02,0xff,0xf1,0x40,0x09,0x12,0x12,0x0c,0x0b,0x25,0x02,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x6b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xab,0x01,0x5d,\r\n0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0e,0x0e,0x02,0x03,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x66,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x57,0x01,0x5c,0x00,0x16,0xb9,0x00,0x02,0xff,0xfa,0x40,0x09,0x11,0x13,0x06,0x07,0x25,0x02,0x12,\r\n0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe3,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x8b,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x21,0x0f,0x02,0x03,0x3e,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,\r\n0x03,0xb4,0x07,0x66,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xe8,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe9,0x40,0x09,0x0f,0x0d,0x02,0x03,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x78,0x00,0x00,0x01,0xfd,0x07,0x66,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xf1,\r\n0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfc,0x00,0x00,0x02,0x30,0x07,0x6b,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xa0,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x06,0x08,0x04,0x02,0x03,0x25,0x01,0x08,0x05,0x26,0x00,\r\n0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x1b,0x00,0x00,0x01,0xa0,\r\n0x07,0x66,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x43,0xff,0xc9,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x05,0x04,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xf8,0x01,0x5c,0x00,0x13,\r\n0x40,0x0b,0x02,0x1e,0x19,0x1b,0x0c,0x06,0x3e,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x6a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x97,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x05,0x1a,0x1a,0x03,0x09,0x25,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,\r\n0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x99,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x2c,0x19,0x18,0x03,0x09,0x25,0x02,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x65,0x02,0x26,0x00,0x38,0x00,0x00,\r\n0x01,0x07,0x00,0x8e,0x01,0xb4,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x2b,0x0f,0x11,0x05,0x0d,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x6b,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x4b,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x10,0x05,0x0d,\r\n0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x66,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x67,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xd1,0x40,0x09,0x11,0x0f,0x05,0x0d,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0xa6,\r\n0x00,0x00,0x01,0x4a,0x04,0x00,0x00,0x03,0x00,0x31,0x40,0x16,0x03,0x0f,0x00,0x15,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xfe,0xb6,0x0c,0x06,0x4d,0x01,0x01,0x05,0x04,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x21,0x23,0x11,0x33,0x01,\r\n0x4a,0xa4,0xa4,0x04,0x00,0x00,0x00,0x01,0x00,0x5c,0x04,0xc2,0x02,0x90,0x06,0x0e,0x00,0x06,0x00,0x1c,0xb3,0x00,0x00,0x08,0x04,0xb8,0xff,0xc0,0xb6,0x10,0x00,0x4d,0x04,0x05,0x80,0x03,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x2b,0x12,0x39,0x2f,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x02,0x90,0x7a,0xa4,0xa5,0x71,0xd7,0x85,0x04,\r\n0xc2,0xe6,0xe6,0x01,0x4c,0x00,0x00,0x01,0x00,0x23,0x04,0xb2,0x02,0xa4,0x05,0xb2,0x00,0x13,0x00,0x50,0x40,0x0f,0x0a,0x0c,0x01,0x03,0x00,0x02,0x01,0x10,0x05,0x0c,0x40,0x0c,0x00,0x4d,0x02,0xb8,0xff,0xc0,0x40,0x1b,0x0c,0x00,0x4d,0x13,0xc4,0x00,0x00,0x15,0x09,0xc4,0x40,0x0a,0x13,0x0d,0x0d,0x07,0xda,0x59,0x0d,0x11,0x40,0x03,\r\n0x11,0xda,0x59,0x09,0x03,0x00,0x2f,0xc6,0x2b,0x00,0x1a,0x18,0x10,0xcc,0x2b,0x00,0x18,0x10,0xc6,0x01,0x2f,0x1a,0xe9,0x12,0x39,0x2f,0xe9,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x5f,0x5d,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,\r\n0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x00,0x00,0x01,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x05,0x2f,0x00,0x03,0x00,0x11,0xb6,0x00,0x01,0x01,0x02,0xe2,0x59,0x01,0x00,0x2f,0x2b,0x01,0x18,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x04,\r\n0xc2,0x6d,0x00,0x01,0x00,0x25,0x04,0xc2,0x02,0x4a,0x05,0xbe,0x00,0x0c,0x00,0x2f,0x40,0x17,0x0c,0xc4,0x0f,0x00,0x01,0x0b,0x03,0x00,0x00,0x0e,0x07,0xc4,0x40,0x06,0x0c,0x06,0x03,0x80,0x03,0x09,0xdb,0x59,0x03,0x00,0x2f,0x2b,0x00,0x1a,0x18,0x10,0xdc,0xc4,0x01,0x2f,0x1a,0xe9,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0xe9,0x31,0x30,0x01,\r\n0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x02,0x4a,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0c,0xa0,0x44,0x61,0x0a,0x05,0xbe,0x71,0x8b,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0x00,0x6c,0x04,0xc2,0x01,0x31,0x05,0x85,0x00,0x0b,0x00,0x12,0xb7,0x09,0xc0,0x03,0x00,0x06,0xc1,0x5b,0x00,0x00,0x2f,0x2b,0x01,0x18,\r\n0x2f,0xe1,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xcf,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x04,0xc2,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x00,0x02,0x00,0x52,0x04,0x98,0x01,0xee,0x06,0x1c,0x00,0x0b,0x00,0x16,0x00,0x4f,0x40,0x31,0x04,0x0b,0x01,0x04,0x07,0x01,0x0b,0x05,0x01,0x0b,0x01,0x01,\r\n0x10,0x14,0xc4,0x40,0x00,0x09,0x50,0x09,0xa0,0x09,0xb0,0x09,0x04,0x1c,0x03,0x09,0xc0,0x0f,0xc4,0x40,0x03,0x06,0x0c,0xc5,0x59,0x06,0x40,0x09,0x0d,0x48,0x06,0x00,0x00,0x11,0xc5,0x59,0x00,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x2b,0x2b,0x01,0x18,0x2f,0x1a,0xe9,0x1a,0xdc,0x5f,0x5e,0x5d,0x1a,0xe9,0x31,0x30,0x5e,0x5d,0x5d,0x5d,\r\n0x5d,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x1c,0x57,0x73,0x76,0x5b,0x59,0x72,0x7a,0x58,0x30,0x40,0x70,0x32,0x42,0x42,0x04,0x98,0x69,0x55,0x5a,0x6c,0x6c,0x54,0x54,0x70,0x01,0x33,0x41,0x30,0x70,0x40,0x30,0x31,0x40,0x00,0x00,0x01,0x00,0x33,\r\n0xfe,0x50,0x01,0x87,0x00,0x00,0x00,0x12,0x00,0x5d,0x40,0x0c,0x03,0x12,0x01,0x03,0x00,0x01,0x01,0x10,0x05,0x09,0xc2,0x00,0xb8,0xff,0xc0,0x40,0x0d,0x0b,0x0f,0x48,0x00,0x10,0x05,0x40,0x0d,0x02,0x07,0xc5,0x59,0x02,0xb8,0xff,0xc0,0x40,0x1a,0x09,0x0f,0x48,0x02,0x10,0x0f,0x0b,0x1f,0x0b,0x2f,0x0b,0x03,0x09,0x03,0x10,0x0b,0xc3,\r\n0x59,0x10,0x40,0x0a,0x0e,0x48,0x10,0x0e,0x12,0x00,0x3f,0xc5,0x2b,0x2b,0x00,0x5f,0x5e,0x5d,0x18,0x10,0xc4,0x2b,0x2b,0x01,0x18,0x2f,0x1a,0xce,0xcd,0xd4,0x2b,0xe1,0x30,0x31,0x5f,0x5e,0x5d,0x5f,0x5d,0x01,0x14,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x33,0x15,0x32,0x16,0x01,0x87,0xfe,0xed,0x26,0x1b,\r\n0x2b,0x1b,0x8d,0x81,0x0a,0x1f,0x6c,0x58,0x67,0xff,0x00,0xb0,0x02,0x5a,0x06,0x5a,0x4e,0x04,0xb6,0x68,0x50,0x00,0x00,0x02,0x00,0x40,0x04,0xc2,0x02,0x87,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x4d,0x40,0x30,0x00,0x0e,0x02,0x28,0x0d,0x06,0x4d,0x02,0x18,0x0c,0x06,0x4d,0x02,0x18,0x0b,0x06,0x4d,0x02,0x30,0x0a,0x06,0x4d,0x02,0x30,\r\n0x09,0x06,0x4d,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x70,0x06,0x01,0x06,0x03,0x02,0x07,0x80,0x06,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0x5d,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0x2b,0x2b,0xe9,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x87,0xf5,0x61,0xd1,\r\n0x72,0xf0,0x60,0xce,0x06,0x00,0xfe,0xc2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x01,0x00,0x3e,0xfe,0x70,0x01,0x52,0x00,0x00,0x00,0x0e,0x00,0x24,0x40,0x12,0x0f,0x0b,0x01,0x10,0x04,0x00,0x06,0x06,0x02,0xc2,0x0c,0x09,0x04,0xe2,0x59,0x09,0x0e,0x12,0x00,0x3f,0x2f,0x2b,0x01,0x18,0x2f,0xf1,0xc2,0x2f,0xc6,0x31,0x30,0x5f,0x5e,0x5d,\r\n0x21,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x52,0x96,0x44,0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x9d,0x8d,0x52,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x7a,0x80,0x00,0x01,0x00,0x66,0x04,0xc2,0x02,0x98,0x06,0x0c,0x00,0x06,0x00,0x1c,0xb3,0x00,0x00,0x08,0x03,0xb8,0xff,0xc0,0xb6,0x10,0x00,0x4d,0x03,0x03,\r\n0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x2b,0x11,0x39,0x2f,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x02,0x98,0xd6,0x84,0xd8,0x73,0xa4,0xa4,0x06,0x0c,0xfe,0xb6,0x01,0x4a,0xe5,0xe5,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x0d,0x00,0xc5,0x40,0x16,0x0f,0x0a,0x01,0x00,0x04,0x01,0x10,0x05,0x0b,0x02,\r\n0x03,0x0a,0x03,0x08,0x05,0x04,0x09,0x04,0x0a,0x0a,0x0c,0x00,0xb8,0xff,0xf0,0xb3,0x10,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x00,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x00,0xb8,0xff,0xc0,0x40,\r\n0x1b,0x0a,0x1f,0x48,0x00,0x00,0x0f,0x03,0x08,0x05,0x0c,0x06,0x0d,0x06,0x4d,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x7e,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf2,0x40,0x19,0x0c,0x06,0x4d,0x01,0x06,0x0b,0x06,0x4d,0x01,0x04,0x03,0x0a,0x09,0x03,0x09,0x03,0x00,0x06,0x03,0x00,0x0d,0x91,0x59,\r\n0x00,0x12,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x01,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x31,0x30,0x10,0x87,0x04,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x21,0x11,0x07,0x35,0x37,0x11,\r\n0x33,0x11,0x25,0x15,0x05,0x11,0x21,0x03,0xa4,0xfd,0x18,0x9b,0x9b,0xa8,0x01,0x48,0xfe,0xb8,0x02,0x40,0x02,0x23,0x61,0x98,0x60,0x02,0xe0,0xfd,0x89,0xcb,0x9a,0xc8,0xfe,0x0c,0x00,0x01,0x00,0x16,0x00,0x00,0x02,0x12,0x05,0xec,0x00,0x0b,0x00,0x62,0x40,0x3c,0x0a,0x07,0x06,0x0b,0x06,0x04,0x01,0x05,0x00,0x00,0x00,0x02,0x05,0x0a,\r\n0x07,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x84,0x70,0x03,0x01,0x03,0x08,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x06,0x05,0x00,0x0b,0x0b,0x05,0x02,0x09,0x00,0x02,0x15,0x40,0x0d,0x01,0x5d,0x00,0x3f,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,\r\n0x2b,0x2b,0x39,0x39,0xc6,0x10,0xc2,0x2f,0x31,0x30,0x87,0x04,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x02,0x12,0xae,0xa4,0xaa,0xaa,0xa4,0xae,0x03,0x2b,0x7b,0xfd,0x50,0x02,0x42,0x77,0x9d,0x77,0x03,0x0d,0xfd,0x62,0x7a,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,\r\n0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xa2,0x01,0x5e,0x00,0x14,0xb4,0x01,0x38,0x05,0x26,0x01,0xb8,0xff,0xf4,0xb4,0x39,0x36,0x13,0x2c,0x25,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0c,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x06,0x00,0xe0,0x12,0x00,0x00,0x14,0xb4,0x01,0x31,0x11,\r\n0x26,0x01,0xb8,0xff,0xec,0xb4,0x32,0x2f,0x0f,0x16,0x25,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x67,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xec,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x05,0x0f,0x0f,0x08,0x09,0x25,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0c,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x06,0x00,0xe0,0x76,0x00,0x00,0x13,0x40,0x0b,0x01,0x0e,0x0f,0x0f,0x08,0x09,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x0f,0x01,0x00,0x04,0xca,\r\n0x05,0x00,0x0e,0x40,0x03,0x04,0x07,0x42,0x07,0x04,0x1c,0x00,0x3f,0xcd,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x01,0x2f,0xe1,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x33,0x11,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0x94,0x94,0x02,0xcb,0x03,0x53,0xf8,0x00,0x03,0x54,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x0b,0x00,0x17,\r\n0x00,0xaa,0x40,0x38,0x00,0x07,0x01,0x00,0x07,0x01,0x10,0x05,0x10,0x0d,0x01,0x04,0x04,0x01,0x91,0x59,0x04,0x05,0x00,0x04,0x91,0x2b,0x30,0x05,0x0c,0x91,0x59,0x05,0x03,0x00,0x11,0x91,0x59,0x00,0x12,0x0f,0x0f,0x00,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7d,0x15,0xb8,0xff,0xf0,0xb3,\r\n0x0d,0x06,0x4d,0x15,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x15,0xb8,0xff,0xea,0x40,0x1b,0x0b,0x06,0x4d,0x15,0x15,0x19,0x02,0x0d,0x04,0x11,0x06,0x0d,0x06,0x4d,0x11,0x06,0x0c,0x06,0x4d,0x11,0x06,0x0b,0x06,0x4d,0x11,0x7e,0x00,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,\r\n0x2b,0x2b,0x2b,0x39,0x39,0xce,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x21,0x15,0x21,0x11,0x33,0x20,\r\n0x00,0x11,0x10,0x21,0xbc,0xa0,0xa0,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0x01,0x50,0xfe,0xb0,0xd6,0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x02,0x81,0x9b,0x02,0x7e,0xfd,0x45,0xfe,0xb2,0xfe,0x6f,0x05,0x02,0xfe,0x1a,0x9b,0xfe,0x17,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x00,0x02,0x00,0x60,0xff,0xea,0x04,0x18,0x05,0xf4,0x00,0x1a,\r\n0x00,0x25,0x00,0xfa,0x40,0x17,0x00,0x0e,0x01,0x10,0x06,0x0b,0x0b,0x0a,0x06,0x06,0x07,0x05,0x0c,0x05,0x0e,0x0e,0x0f,0x03,0x03,0x02,0x04,0x0d,0x06,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x03,0xb8,0xff,0xc0,0xb3,0x0b,0x06,0x4d,0x03,0xb8,0xff,0xc0,0xb3,0x0a,0x06,0x4d,0x03,0xb8,0xff,0xc0,0x40,0x46,0x09,0x06,0x4d,0x05,0x04,0x30,\r\n0x09,0x12,0x48,0x04,0x04,0x19,0x0d,0x0c,0x09,0x00,0x01,0x1b,0x19,0x1b,0x95,0x59,0x19,0x10,0x13,0x21,0x95,0x59,0x13,0x16,0x0e,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0d,0x06,0x4d,0x0d,0x0d,0x10,0x05,0x01,0x24,0x0f,0x08,0x01,0x08,0x08,0x16,0x10,0x04,0x0d,0x06,0x4d,0x10,0x04,0x0c,0x06,0x4d,0x10,0x04,0x0b,0x06,0x4d,0x10,0x83,0x24,\r\n0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xe3,0x40,0x2a,0x0b,0x06,0x4d,0x24,0x24,0x27,0x1e,0x0a,0x0d,0x06,0x4d,0x1e,0x0a,0x0c,0x06,0x4d,0x1e,0x0a,0x0b,0x06,0x4d,0x1e,0x83,0x16,0x10,0x0d,0x06,0x4d,0x16,0x0c,0x0c,0x06,0x4d,0x16,0x15,0x0b,0x06,0x4d,0x16,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,\r\n0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x12,0x39,0xc6,0x11,0x39,0x2f,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0xc6,0x32,0x12,0x39,0x2f,0x2b,0x33,0x01,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x5f,0x5e,0x5d,0x01,0x37,\r\n0x26,0x27,0x05,0x27,0x25,0x26,0x27,0x33,0x16,0x17,0x25,0x17,0x05,0x00,0x11,0x14,0x00,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x07,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x12,0x04,0x5a,0x6c,0xfe,0xd5,0x33,0x01,0x0e,0x76,0x92,0xdd,0x4b,0x61,0x01,0x21,0x37,0xfe,0xf8,0x01,0x47,0xfe,0xfe,0xde,0xde,0xfa,0x01,\r\n0x04,0xdc,0x7b,0x75,0x94,0xaa,0xa6,0x94,0x8b,0xa3,0x03,0xc8,0x03,0xa2,0x68,0x97,0x62,0x83,0x69,0x60,0x34,0x54,0x90,0x5e,0x82,0xfe,0xcd,0xfe,0x2d,0xf0,0xfe,0xcc,0x01,0x18,0xf2,0xf3,0x01,0x2f,0x88,0xd9,0xbb,0xb5,0xd3,0xd8,0xb4,0x01,0x90,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x66,0x02,0x26,0x00,0x3c,0x00,0x00,\r\n0x01,0x07,0x00,0x8e,0x01,0x33,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x30,0x0f,0x11,0x05,0x00,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0a,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xee,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x33,0x16,0x18,0x0c,0x00,\r\n0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x7b,0x40,0x20,0x00,0x08,0x01,0x10,0x06,0x05,0x0d,0x91,0x59,0x00,0x05,0x10,0x05,0x02,0x0c,0x03,0x05,0x0c,0x0e,0x91,0x59,0x0c,0x05,0x0c,0x03,0x02,0x12,0x03,0x03,0x09,0x7d,0x12,0xb8,0xff,\r\n0xf0,0x40,0x1a,0x0d,0x06,0x4d,0x12,0x12,0x16,0x05,0x0e,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x02,0x04,0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,\r\n0x2b,0xe9,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2b,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x01,0x11,0x23,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xa8,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xad,0xb8,0xfe,0xb0,0x01,0x3e,0xfe,0xc2,\r\n0x05,0x9a,0xe2,0xdf,0xcd,0xcc,0xfe,0xfe,0x02,0xe3,0xfd,0xb4,0x9c,0x91,0x01,0x1f,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x10,0x00,0x1d,0x00,0x9c,0x40,0x2b,0x00,0x0a,0x01,0x10,0x06,0x03,0x1b,0x01,0x15,0x0f,0x15,0x95,0x59,0x0f,0x16,0x04,0x00,0x06,0x1b,0x09,0x1b,0x95,0x59,0x09,0x10,0x0c,0x06,0x0d,0x06,0x4d,\r\n0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x06,0x0b,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xe3,0x40,0x1a,0x0b,0x06,0x4d,0x18,0x18,0x1f,0x06,0x12,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,\r\n0x11,0x0d,0x06,0x4d,0x03,0x02,0x0c,0x06,0x4d,0x03,0x01,0x0b,0x06,0x4d,0x03,0x2f,0x1f,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,\r\n0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x70,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x07,0xc3,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,\r\n0x49,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x00,0x01,0x00,0xe8,0x02,0x12,0x04,0x94,0x02,0x98,0x00,0x03,0x00,0x30,0x40,0x0b,0x02,0x01,0xbe,0x59,0x0f,0x02,0x01,0x0d,0x03,0x02,0x00,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xe0,0x40,0x09,0x0c,0x06,0x4d,0x04,0x05,0x01,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x2b,0x00,\r\n0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0x02,0x12,0x86,0x00,0x00,0x01,0x01,0x0c,0x00,0xa4,0x04,0x6e,0x04,0x06,0x00,0x0b,0x00,0x1d,0xb6,0x0b,0x4f,0x05,0x01,0x05,0x02,0x08,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x08,0x19,0x2f,0x2b,0x18,0xc4,0x00,0x19,0x2f,0x5d,0x18,0xc4,0x31,\r\n0x30,0x01,0x07,0x01,0x01,0x27,0x01,0x01,0x37,0x01,0x01,0x17,0x01,0x04,0x6e,0x5e,0xfe,0xac,0xfe,0xae,0x5e,0x01,0x54,0xfe,0xac,0x5e,0x01,0x52,0x01,0x54,0x5e,0xfe,0xac,0x01,0x02,0x5e,0x01,0x54,0xfe,0xac,0x5e,0x01,0x52,0x01,0x54,0x5e,0xfe,0xac,0x01,0x54,0x5e,0xfe,0xac,0x00,0x00,0x01,0x00,0x50,0x02,0x48,0x01,0xc2,0x05,0xb0,\r\n0x00,0x0c,0x00,0x17,0x40,0x0a,0x0c,0xcc,0x04,0x00,0x0c,0x28,0x05,0x04,0x0b,0x27,0x00,0x3f,0xdd,0xcd,0x3f,0x01,0x2f,0xce,0xed,0x30,0x31,0x01,0x11,0x06,0x06,0x07,0x35,0x3e,0x03,0x37,0x33,0x11,0x01,0x40,0x39,0x78,0x3f,0x26,0x46,0x48,0x4c,0x2c,0x46,0x02,0x48,0x02,0xc2,0x2e,0x47,0x1b,0x87,0x0d,0x22,0x2b,0x35,0x20,0xfc,0x98,\r\n0x00,0x01,0x00,0x68,0x02,0x48,0x02,0x92,0x05,0xae,0x00,0x1f,0x00,0x3c,0x40,0x24,0x1f,0x16,0xcc,0x09,0x09,0x21,0x1d,0xcc,0x0e,0x02,0x0f,0x0e,0x2b,0x1d,0x3b,0x1d,0x4b,0x1d,0x9b,0x1d,0xab,0x1d,0xbb,0x1d,0x06,0x1d,0x09,0x01,0x0c,0xe6,0x11,0x27,0x1f,0xe6,0x01,0x28,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x5d,0xcc,0x32,0x01,\r\n0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x01,0x21,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x15,0x15,0x21,0x02,0x92,0xfd,0xd6,0x3b,0x59,0x68,0x59,0x3b,0x4b,0x3f,0x77,0x61,0x53,0x98,0x38,0x5e,0x44,0x26,0x39,0x56,0x64,0x56,0x39,0x01,0x93,0x02,0x48,0x52,\r\n0x3d,0x61,0x54,0x4b,0x50,0x5a,0x38,0x3a,0x40,0x66,0x95,0x4c,0x22,0x3f,0x58,0x37,0x4a,0x73,0x5c,0x48,0x3d,0x37,0x1c,0x0b,0x00,0x01,0x00,0x81,0x02,0x33,0x02,0x8e,0x05,0xae,0x00,0x20,0x00,0x61,0x40,0x35,0x00,0x16,0x01,0x10,0x05,0x19,0x09,0x0a,0x0a,0x09,0xe6,0x59,0x0a,0x0a,0x03,0x14,0x0f,0x11,0x1f,0x11,0x02,0x0f,0x03,0x11,\r\n0x0f,0x14,0x0f,0xe6,0x59,0x14,0x27,0x01,0x03,0x1f,0x03,0xe6,0x59,0x1f,0x29,0x19,0x0a,0x0d,0xcd,0x17,0x17,0x1c,0xcc,0x06,0x06,0x22,0x0a,0x11,0x00,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,\r\n0x00,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x81,0x67,0x72,0x50,0x5c,0xdb,0x54,0x50,0xc5,0x90,0x5e,0x5c,0x57,0x7e,0x71,0x86,0x91,0xb1,0xaa,0x8e,0x89,0x02,0x68,0x8e,\r\n0x4c,0x4b,0x40,0x8d,0x76,0x86,0x77,0x45,0x8b,0x33,0x77,0x60,0x97,0x36,0x04,0x2a,0xa0,0x75,0x94,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x06,0xd4,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x00,0xf1,0x04,0x42,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x11,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,\r\n0x00,0x50,0x00,0x00,0x06,0xaa,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x38,0x04,0x00,0xfd,0xb8,0x00,0x09,0xb3,0x03,0x02,0x14,0x2c,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x81,0x00,0x00,0x06,0xeb,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x06,\r\n0x00,0x00,0x01,0x07,0x02,0x38,0x04,0x41,0xfd,0xb8,0x00,0x09,0xb3,0x03,0x02,0x28,0x2c,0x00,0x3f,0x35,0x35,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x03,0x94,0x05,0x9a,0x00,0x11,0x00,0x80,0x40,0x3e,0x10,0x01,0x04,0x07,0x07,0x04,0x91,0x59,0x07,0x07,0x0c,0x02,0x0c,0x0f,0x91,0x59,0x0c,0x09,0x02,0x0c,0x91,0x2b,0x30,0x09,0x0a,0x91,\r\n0x59,0x09,0x03,0x02,0x12,0x0d,0x0d,0x09,0x09,0x13,0x03,0x00,0x00,0x07,0x0c,0x10,0x03,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x05,0x03,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf6,0x40,0x09,0x0c,0x06,0x4d,0x03,0x0a,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xce,0xf1,\r\n0x2b,0x2b,0x2b,0x17,0x39,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x58,0xf4,0xa8,0xa0,0xa0,0x02,0xd8,0xfd,0xd0,\r\n0x02,0x06,0xfd,0xfa,0xf4,0x01,0x16,0xfe,0xea,0x01,0x16,0x9c,0x03,0xe8,0x98,0xfe,0x10,0x97,0xc9,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x19,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xe2,0x01,0x5b,0x00,0x16,0xb9,0x00,0x01,0xff,0xda,0x40,0x09,0x1d,0x23,0x0d,0x08,0x25,0x01,0x1d,0x05,0x26,0x00,0x2b,\r\n0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0xbe,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x1a,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x17,0x2c,0x26,0x20,0x17,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xad,0x00,0x00,0x01,0x72,0x06,0xe2,0x02,0x26,0x00,0x2c,\r\n0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x41,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x0d,0x02,0x03,0x25,0x01,0x04,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xfe,0x50,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x76,0x00,0x00,0xff,0xff,0x00,0x68,0xfe,0x50,0x03,0x0f,\r\n0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x03,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x66,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xd5,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x3e,0x17,0x19,0x10,0x0b,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0a,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x23,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x24,0x17,0x19,0x10,0x0a,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x68,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xe0,\r\n0x01,0x86,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x36,0x1b,0x1b,0x10,0x0b,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0c,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc2,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0a,0x1b,0x1b,0x10,0x0b,0x25,0x01,0x18,0x11,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x98,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0xcb,0x40,0x55,0x0f,0x06,0x01,0x10,0x05,0x24,0x18,0x0c,0x00,0x4d,0x18,0x15,0x0f,0x12,0x12,0x0f,0x96,0x59,0x0f,0x12,0x1f,0x12,0x2f,0x12,0x03,0x09,0x03,0x12,0x12,0x0b,0x14,0x00,0x0d,0x1d,0x0b,0x1d,0x95,0x59,\r\n0x0b,0x10,0x02,0x23,0x05,0x23,0x95,0x59,0x05,0x16,0x00,0x15,0x10,0x10,0x01,0x08,0x17,0x17,0x0f,0x12,0x15,0x18,0x19,0x05,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x05,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x01,\r\n0x01,0x27,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x08,0x10,0x0d,0x06,0x4d,0x08,0x0e,0x0c,0x06,0x4d,0x08,0x1a,0x0b,0x06,0x4d,0x08,0x2f,0x27,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0x17,0x39,0xca,0x2f,0x11,0x12,0x39,\r\n0x2f,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x26,\r\n0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd0,0x63,0x04,0xfe,0xb5,0x01,0x4b,0xa4,0x88,0x88,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x88,0xac,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x01,0x40,0x86,0xb4,0xb4,0x86,0xfd,0x1d,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,\r\n0x00,0x01,0x00,0x00,0x05,0x74,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x10,0xb7,0x02,0x01,0xd9,0x59,0x02,0x00,0x00,0x01,0x2f,0x2f,0x00,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0xff,0xff,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x02,0x06,0x00,0xc3,0x00,0x00,0xff,0xff,0x00,0x16,\r\n0x00,0x00,0x05,0x12,0x07,0x1b,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x5a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xfb,0x40,0x09,0x13,0x19,0x06,0x07,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xda,\r\n0x00,0xdb,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf2,0x40,0x09,0x26,0x20,0x10,0x14,0x25,0x02,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0xfe,0x70,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x07,0x00,0xdf,0x03,0x79,0x00,0x00,0xff,0xff,0x00,0x5a,0xfe,0x70,0x03,0x83,0x04,0x18,0x02,0x26,\r\n0x00,0x44,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x00,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x07,0x68,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x2a,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x04,0x13,0x10,0x01,0x0d,0x25,0x02,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,\r\n0x05,0xb3,0x05,0xec,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x01,0x9c,0x03,0xb7,0x06,0x63,0x00,0x12,0x40,0x0a,0x02,0x21,0x00,0x02,0x82,0x20,0x20,0x10,0x10,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0xe8,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x70,0x03,0xb4,0x05,0x9a,\r\n0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x0f,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x70,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xa1,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x68,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xb1,0x01,0x5c,0x00,0x16,\r\n0xb9,0x00,0x01,0xff,0xf8,0x40,0x09,0x0f,0x0c,0x02,0x0b,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0c,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xb4,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1c,0x1b,0x16,0x0f,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,\r\n0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x07,0x66,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x4c,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x11,0x08,0x06,0x03,0x05,0x3e,0x01,0x08,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x8e,0x00,0x00,0x02,0x13,0x07,0xbb,0x02,0x26,0x00,0x4f,\r\n0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0x07,0x01,0xb1,0x00,0x16,0xb9,0x00,0x01,0xff,0xd5,0x40,0x09,0x06,0x05,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x01,0x9c,0x01,0x8d,0x06,0x11,0x00,0x14,0xb3,0x01,0x09,0x03,\r\n0x01,0xb8,0xff,0xe5,0xb4,0x06,0x06,0x05,0x05,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xc3,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xc7,0x06,0x5d,0x00,0x12,0x40,0x0a,0x01,0x07,0x00,0x01,0x58,0x06,0x06,0x03,0x03,0x25,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0xbc,\r\n0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x11,0xfd,0xd8,0x00,0x0e,0xb9,0x00,0x01,0xff,0x9e,0xb4,0x0f,0x0f,0x05,0x05,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x87,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x56,0xfd,0xd8,0x00,0x0b,0xb6,0x01,\r\n0x78,0x07,0x07,0x00,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x66,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xe2,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x15,0x17,0x0b,0x12,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,\r\n0x06,0x0a,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x38,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xec,0x40,0x09,0x14,0x16,0x04,0x0f,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x68,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x7e,0x01,0x5c,\r\n0x00,0x16,0xb9,0x00,0x01,0xff,0xe4,0x40,0x09,0x19,0x19,0x0b,0x12,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0c,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xda,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x08,0x18,0x18,0x0b,0x02,0x25,0x01,0x15,0x11,0x26,0x00,\r\n0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x5e,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0xe1,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfc,0x40,0x0a,0x1a,0x1a,0x06,0x06,0x25,0x03,0x02,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,\r\n0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x3f,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x06,0x1a,0x1a,0x06,0x06,0x25,0x03,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x07,0x66,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0x8e,\r\n0x01,0x5f,0x01,0x5c,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xbc,0x06,0x0a,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xa4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x20,0x13,0x12,0x09,0x09,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,\r\n0x00,0x00,0x04,0xc0,0x07,0x68,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xe3,0x01,0x5c,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x97,0x00,0x00,0x02,0xc9,0x06,0x0c,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x06,0x00,0xe0,0x31,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x13,0x12,0x08,0x10,0x25,0x01,\r\n0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x65,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x29,0x01,0x5b,0x00,0x08,0xb3,0x01,0x38,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0a,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x00,0x8e,\r\n0x00,0xbe,0x00,0x00,0x00,0x08,0xb3,0x01,0x31,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x29,0xfe,0x50,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xdd,0x01,0x75,0x00,0x00,0x00,0x0b,0xb6,0x01,0x16,0x16,0x0c,0x06,0x4d,0x16,0x11,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x50,0x02,0x9a,0x05,0x2f,0x02,0x26,\r\n0x00,0x57,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x13,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x07,0x68,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0x9d,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x03,0x0a,0x09,0x04,0x01,0x3e,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x2b,0xff,0xea,\r\n0x03,0xd3,0x05,0x72,0x00,0x14,0x00,0x18,0x00,0x71,0x40,0x31,0x18,0x80,0x17,0x07,0x14,0x14,0x12,0x95,0x02,0x16,0x0a,0x0a,0x0e,0x0b,0x06,0x95,0x40,0x07,0x0f,0x15,0x80,0x17,0x0c,0x00,0x00,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x84,0x04,0xb8,0xff,0xe6,\r\n0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xf2,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x32,0x33,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xd6,0x1a,0xcd,0x00,0x3f,0x1a,0xed,0x33,0x32,0x33,0x2f,0x3f,0xed,0x32,0x2f,0x10,0xd4,0x1a,0xcd,0x31,0x30,0x25,0x06,0x23,0x20,0x11,\r\n0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x01,0x03,0x23,0x13,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3e,0x2d,0x01,0x52,0xa6,0x7b,0x75,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x04,0xdc,0xfe,0xfc,0x01,\r\n0x04,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0xa3,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x8e,0x01,0x87,0x00,0x24,0xb1,0x02,0x01,0xb8,0xff,0xef,0x40,0x13,0x11,0x17,0x05,0x0d,0x25,0x02,0x01,0x00,0x0e,0x10,0x0e,0x20,0x0e,0x30,0x0e,0x04,0x0e,0x05,0x26,0x00,0x2b,0x5d,0x35,0x35,0x01,0x2b,0x35,0x35,\r\n0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x1c,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x18,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x15,0x1b,0x08,0x11,0x25,0x02,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x5c,0x02,0x26,0x00,0x38,\r\n0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x93,0x01,0x5c,0x00,0x45,0x40,0x12,0x01,0x10,0x0c,0x0d,0x06,0x4d,0x10,0x16,0x0c,0x06,0x4d,0x10,0x12,0x0b,0x06,0x4d,0x02,0x10,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xf2,0xb3,0x0c,0x06,0x4d,0x10,0xb8,0xff,0xf4,0x40,0x0e,0x0b,0x06,0x4d,0x05,0x10,0x10,0x05,0x0d,0x25,0x02,0x01,\r\n0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x2b,0x2b,0x2b,0x35,0x2b,0x2b,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x05,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfd,0x40,0x0a,0x14,0x14,0x08,0x11,0x25,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,\r\n0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x67,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x58,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfa,0x40,0x09,0x0b,0x0b,0x08,0x09,0x3e,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0a,\r\n0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xc7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x05,0x0b,0x0b,0x05,0x09,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x06,0xe1,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x83,0x01,0x5c,0x00,0x16,0xb9,0x00,\r\n0x01,0xff,0xed,0x40,0x09,0x0d,0x13,0x08,0x09,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x05,0x85,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x17,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x0d,0x13,0x08,0x09,0x25,0x01,0x0a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,\r\n0x35,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x05,0x00,0x4c,0x40,0x20,0x02,0x12,0x05,0x00,0x91,0x59,0x05,0x03,0x70,0x00,0x01,0x00,0x00,0x07,0x02,0x06,0x0d,0x06,0x4d,0x02,0x06,0x0c,0x06,0x4d,0x02,0x06,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf2,0x40,0x09,0x0c,\r\n0x06,0x4d,0x03,0x04,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0xa4,0xfd,0xc1,0xa9,0x02,0xe8,0x04,0xfe,0xfb,0x02,0x05,0x9a,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x1b,\r\n0x00,0xb0,0x40,0x18,0x1a,0x19,0x91,0x59,0x1a,0x06,0x00,0x1a,0x91,0x2b,0x30,0x06,0x0c,0x91,0x59,0x06,0x04,0x00,0x12,0x91,0x59,0x00,0x13,0x18,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xd0,0xb3,0x0b,0x06,0x4d,0x19,0xb8,0xff,0xe8,0x40,0x1b,0x0b,0x06,0x4d,0x0f,0x15,0x19,0x18,0xff,0x3a,0x09,0x06,0x0d,0x06,0x4d,0x09,\r\n0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x7d,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xee,0xb6,0x0c,0x06,0x4d,0x30,0x15,0x01,0x15,0xb8,0xff,0xe0,0x40,0x27,0x0b,0x06,0x4d,0x15,0x15,0x1d,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x03,0x10,0x0d,0x06,0x4d,\r\n0x03,0x10,0x0c,0x06,0x4d,0x03,0x18,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,\r\n0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x13,0x21,0x35,0x21,0x02,0xfe,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x29,0x01,0x6b,0xfe,0x8d,0xfe,0xd2,0xe1,0xfe,0xe7,0x01,0x12,0xdd,0xec,0x01,0x0f,0xfe,0xf9,0x1f,0xfd,0xe7,0x02,0x19,0x18,0x01,0x8f,0x01,0x45,0x01,0x57,0x01,0x9f,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,\r\n0x68,0x05,0x32,0xfe,0xba,0xfe,0xf8,0xfe,0xf6,0xfe,0xbd,0x01,0x34,0x01,0x16,0x01,0x18,0x01,0x39,0xfd,0x64,0x9c,0x00,0x03,0x00,0x60,0xff,0xf1,0x05,0xa7,0x05,0xa7,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0xf6,0x40,0x1a,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x91,0x59,0x1f,0x03,0x00,0x17,0x00,0x17,0x91,0x59,0x0e,0x00,0x0e,0x00,0x01,0x0d,\r\n0x04,0x01,0x13,0x24,0xb8,0xff,0xe8,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1b,0x7e,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0x40,0x25,0x0c,0x06,0x4d,0x12,0x20,\r\n0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x7e,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe8,0x40,0x1d,0x0b,0x06,0x4d,0x07,0x07,0x28,0x0b,0x0e,0x17,0x1f,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,\r\n0x7e,0x02,0xb8,0xff,0xfb,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xfd,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf8,0x40,0x0c,0x0b,0x06,0x4d,0x02,0x02,0x29,0x28,0x20,0x29,0x40,0x29,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,\r\n0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x25,0x15,0x23,0x35,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x52,0x9c,0x2b,0xf9,0xfe,0xce,0x01,0x31,0xfc,0x29,0x9c,0x2a,0xfc,0x01,0x2f,0xfe,0xcc,0xf5,0x2c,0x2c,0xb6,0xcf,0xd3,0xb4,0xc6,0x29,0xb3,0xd6,0xcf,0xb8,0xba,0xc9,0xc9,0x01,0x3c,0xfc,0xf6,0x01,0x2a,0x95,0x95,0xfe,0xd5,0xf5,0xfd,0xfe,0xc5,0x03,0xca,0xfc,0xcc,0xdc,0xc4,0xb9,0xdb,0xfc,0xcc,\r\n0x03,0x34,0xda,0xbb,0xc4,0xdb,0x00,0x02,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x04,0x18,0x00,0x19,0x00,0x26,0x01,0x02,0x40,0x0b,0x0d,0x14,0x01,0x10,0x04,0x25,0x10,0x10,0x00,0x4d,0x15,0xb8,0xff,0xf0,0xb3,0x10,0x00,0x4d,0x14,0xb8,0xff,0xd0,0xb3,0x10,0x00,0x4d,0x0e,0xb8,0xff,0xf0,0x40,0x0e,0x10,0x00,0x4d,0x08,0x10,0x10,0x00,0x4d,\r\n0x03,0x28,0x10,0x00,0x4d,0x25,0xb8,0xff,0xe8,0x40,0x36,0x0b,0x0c,0x00,0x4c,0x1f,0x18,0x0b,0x0c,0x00,0x4c,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x10,0x18,0x0b,0x0c,0x00,0x4c,0x05,0x11,0x14,0x1a,0x04,0x07,0x0d,0x13,0x12,0x0f,0x0d,0x1d,0x95,0x59,0x0d,0x10,0x02,0x17,0xec,0x59,0x02,0x15,0x07,0x23,0xec,0x59,0x07,0x16,0x75,0x11,0x01,\r\n0x1a,0xb8,0xff,0xe8,0xb4,0x09,0x15,0x01,0x4c,0x1a,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0x40,0x3d,0x0b,0x06,0x4d,0x14,0x11,0x0a,0x1a,0x05,0x00,0x1a,0x11,0x12,0x20,0x14,0x05,0x0a,0x12,0x83,0x13,0x70,0x00,0x01,0x00,0x00,0x28,0x20,0x08,0x0d,0x06,0x4d,0x20,0x08,0x0c,0x06,0x4d,0x20,0x08,0x0b,0x06,0x4d,0x20,\r\n0x83,0x0a,0x10,0x0d,0x06,0x4d,0x0a,0x10,0x0c,0x06,0x4d,0x0a,0x10,0x0b,0x06,0x4d,0x2f,0x0a,0x01,0x0a,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0xd4,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x11,0x39,0x39,0x2b,0x2b,0x2b,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,\r\n0x18,0x3f,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x5f,0x5e,0x5d,0x25,0x06,0x23,0x22,0x03,0x23,0x02,0x21,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x16,0x17,0x33,0x13,0x33,0x03,0x16,0x16,0x33,0x32,0x37,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x04,\r\n0xc5,0x35,0x2a,0x9a,0x36,0x04,0x94,0xfe,0xf6,0xba,0xe0,0x01,0x02,0xdc,0x7e,0xc6,0x33,0x04,0x55,0xac,0xc1,0x22,0x4c,0x3c,0x17,0x11,0xfe,0xa4,0x26,0x9c,0x6e,0x8e,0xa9,0x8f,0x79,0x6a,0xad,0x3a,0x05,0x0d,0x01,0x25,0xfe,0xcb,0x01,0x1f,0xdb,0xfa,0x01,0x3c,0x96,0x88,0x01,0x06,0xfe,0x0a,0xdb,0x9d,0x05,0x01,0x71,0xbe,0xca,0xf2,\r\n0xb2,0x9e,0xd6,0xb5,0xb0,0x00,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x53,0x05,0xfe,0x00,0x1c,0x00,0x27,0x00,0xdf,0x40,0x0c,0x0d,0x27,0x01,0x0d,0x1e,0x01,0x02,0x00,0x01,0x10,0x04,0x19,0xb8,0xff,0xc0,0x40,0x0a,0x0b,0x0c,0x00,0x4c,0x17,0x30,0x0b,0x00,0x4d,0x00,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe0,0x40,\r\n0x35,0x0c,0x00,0x4d,0x09,0x1b,0x22,0x1d,0x16,0x10,0x01,0x03,0x1b,0x03,0x95,0x59,0x1b,0x01,0x10,0x22,0x95,0x59,0x10,0x16,0x1d,0x16,0x25,0x18,0x01,0x01,0x0d,0x06,0x83,0x18,0x18,0x13,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x25,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x25,0xb8,0xff,\r\n0xf0,0xb3,0x0c,0x06,0x4d,0x25,0xb8,0xff,0xe0,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x25,0x30,0x25,0x02,0x25,0x25,0x29,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x83,0x13,0x10,0x0d,0x06,0x4d,0x13,0x10,0x0c,0x06,0x4d,0x13,0x10,0x0b,0x06,0x4d,0x13,0x2f,0x29,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,\r\n0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x11,0x12,0x39,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x12,0x39,0x39,0x11,0x12,0x39,0x2b,0x31,0x30,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x01,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,\r\n0x02,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x03,0x04,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xe7,0xa8,0xac,0x64,0x79,0x68,0x78,0xa2,0xba,0x61,0xfe,0xe6,0xef,0xdb,0xfe,0xed,0xd4,0xcb,0xee,0xd0,0xb6,0xa4,0xbd,0xfe,0x92,0xb5,0x96,0x9d,0xba,0x8f,0x05,0xbe,0xb7,0x65,0x45,\r\n0x3a,0x2f,0x69,0x49,0x63,0x9a,0xbf,0x6f,0xe9,0xfe,0xef,0x01,0x0b,0xd7,0x9b,0x01,0x02,0x58,0x93,0xa3,0x80,0x8a,0xfd,0x75,0x94,0xfe,0xeb,0x9d,0xb9,0xc0,0xa1,0x75,0xbf,0x00,0x00,0x01,0x00,0x52,0xff,0xe7,0x03,0x3b,0x04,0x19,0x00,0x25,0x00,0x9b,0x40,0x09,0x00,0x11,0x01,0x0f,0x00,0x01,0x10,0x04,0x0d,0xb8,0xff,0xe8,0x40,0x58,\r\n0x0b,0x0c,0x00,0x4c,0x08,0x1e,0x19,0x19,0x1e,0xec,0x59,0x19,0x0f,0x02,0x19,0xec,0x0c,0x30,0x12,0x14,0x0f,0x14,0x95,0x59,0x0f,0x10,0x00,0x25,0x01,0x0e,0x03,0x25,0x23,0x02,0x23,0x95,0x59,0x02,0x16,0x08,0x0c,0x1b,0x12,0x00,0x00,0x27,0x05,0x16,0x83,0x0c,0x20,0x08,0x0d,0x06,0x4d,0x20,0x08,0x0c,0x06,0x4d,0x20,0x08,0x0b,0x06,\r\n0x4d,0x20,0x83,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x10,0x0b,0x06,0x4d,0x2f,0x05,0x3f,0x05,0x02,0x05,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0xc4,0x11,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x00,0x18,0x2f,0x2b,\r\n0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x26,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0x3b,0x82,0xc3,0xc3,0xe1,0x8b,0x72,0x56,0x80,0xd5,0xb2,0x8f,0x7f,0x85,\r\n0x93,0xd7,0xa2,0x7d,0x49,0x2d,0x49,0x43,0xfe,0xd0,0x8d,0x80,0xa7,0x8f,0x16,0x2f,0xa5,0x89,0x5d,0x88,0x15,0x04,0x12,0x81,0x53,0x88,0x98,0x2d,0xa5,0x47,0x93,0x4b,0x5c,0x04,0x92,0x04,0xb2,0x4b,0x5b,0x49,0x00,0x02,0x00,0x61,0xff,0xe8,0x04,0x82,0x04,0x00,0x00,0x0c,0x00,0x17,0x00,0x7b,0x40,0x22,0x01,0x0e,0x0b,0x0e,0x96,0x59,\r\n0x0b,0x0f,0x06,0x13,0x95,0x59,0x06,0x16,0x00,0x00,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x83,0x16,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x16,0xb8,0xff,0xf0,0x40,0x2a,0x0b,0x06,0x4d,0x16,0x16,0x19,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x83,\r\n0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,0x10,0x0b,0x06,0x4d,0x09,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xca,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x01,0x21,0x16,0x15,0x14,0x02,0x23,0x22,0x00,0x35,0x10,0x21,0x21,\r\n0x05,0x23,0x20,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x04,0x82,0xff,0x00,0x8e,0xfc,0xd4,0xdb,0xfe,0xfc,0x02,0x09,0x02,0x18,0xfe,0x6c,0x76,0xfe,0x92,0xa9,0x8d,0x89,0x9f,0x03,0x7c,0xb6,0xdd,0xe3,0xfe,0xe2,0x01,0x1f,0xef,0x02,0x0a,0x84,0xfe,0x73,0xac,0xcf,0xd1,0xaf,0xdc,0x00,0x01,0x00,0x22,0xff,0xf4,0x03,0xc5,0x04,0x00,\r\n0x00,0x13,0x00,0x7a,0x40,0x43,0x53,0x10,0x01,0x00,0x0f,0x01,0x0b,0x03,0x0f,0x0d,0x00,0x13,0x00,0x96,0x59,0x13,0x0f,0x06,0x04,0x09,0x04,0xec,0x59,0x09,0x30,0x00,0x70,0x00,0x02,0x00,0x00,0x15,0x02,0x0f,0x0f,0x0b,0x14,0x06,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x0b,0x08,\r\n0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x0b,0x0b,0x15,0x14,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x5d,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x10,0x18,0xd4,0xc6,0x5f,0x5e,0x5d,0x31,0x30,0x5d,0x01,0x21,\r\n0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x23,0x22,0x07,0x35,0x36,0x33,0x21,0x03,0xc5,0xfe,0x79,0x74,0x36,0x36,0x42,0x48,0xf9,0x8d,0x72,0x7a,0x4c,0xa4,0x02,0xb3,0x03,0x7c,0xfd,0x96,0x8e,0x14,0x8e,0x16,0x01,0x20,0x02,0x68,0x58,0x94,0x48,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x38,0x04,0x18,0x00,0x1b,0x00,0x25,\r\n0x00,0xfe,0x40,0x0f,0x06,0x17,0x01,0x09,0x15,0x01,0x09,0x0e,0x01,0x0d,0x0c,0x01,0x10,0x03,0x1f,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x15,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x10,0xb8,0xff,0xc0,0x40,0x2a,0x0b,0x0c,0x00,0x4c,0x16,0x23,0x95,0x59,0x16,0x10,0x0d,0x0f,0x13,0x05,0x02,0x1c,0x02,0x1c,0x95,0x59,0x02,0x16,\r\n0x03,0x1c,0x19,0x08,0x0d,0x06,0x4d,0x19,0x08,0x0c,0x06,0x4d,0x19,0x08,0x0b,0x06,0x4d,0x20,0x83,0x19,0xb8,0xff,0xec,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0xff,0xe0,0x40,0x56,0x0b,0x06,0x4d,0x19,0x0e,0x02,0x05,0x0a,0x42,0x02,0x0d,0x01,0x0d,0x0d,0x05,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,\r\n0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x0f,0x83,0x50,0x0a,0x60,0x0a,0x02,0x0f,0x0a,0x01,0x0a,0x10,0x0d,0x06,0x4d,0x0a,0x10,0x0c,0x06,0x4d,0x0a,0x18,0x0b,0x06,0x4d,0x0a,0x0a,0x26,0x1c,0x13,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x10,0x0b,0x06,0x4d,0x02,0x84,0x05,0x05,0x27,0x26,0x2f,0x27,0x3f,0x27,0x02,0x5d,\r\n0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0x5d,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x3f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,\r\n0x05,0x06,0x27,0x11,0x23,0x11,0x06,0x27,0x22,0x00,0x35,0x10,0x37,0x33,0x06,0x11,0x14,0x16,0x33,0x33,0x11,0x10,0x21,0x32,0x12,0x15,0x14,0x00,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x03,0x36,0x04,0x1e,0x94,0x18,0x04,0xec,0xfe,0xe8,0xd2,0xc2,0xec,0xbf,0x9b,0x1e,0x01,0x12,0xbc,0xea,0xfe,0xe7,0xfe,0xf5,0x22,0x98,\r\n0xc2,0x93,0x67,0x82,0x18,0x04,0x04,0xfe,0x36,0x01,0xca,0x04,0x04,0x01,0x20,0xf6,0x01,0x3b,0xc7,0xd8,0xfe,0xd2,0xb8,0xce,0x02,0x95,0x01,0x0f,0xfe,0xd7,0xfb,0xe9,0xfe,0xdd,0x8c,0xd3,0xb5,0xb4,0xdc,0x81,0x00,0x02,0x00,0x00,0xfd,0xfe,0x03,0x52,0xff,0x62,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x1a,0x03,0x02,0xd9,0x59,0x0f,0x03,\r\n0x01,0x0c,0x03,0x03,0x07,0x40,0x07,0x06,0xd9,0x59,0x1f,0x07,0x2f,0x07,0x02,0x07,0x07,0x03,0x04,0x00,0x2f,0x32,0x2f,0x33,0x00,0x2f,0x5d,0x2b,0x00,0x1a,0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x2b,0x31,0x30,0x11,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x03,0x52,0xfc,0xae,0x03,0x52,0xfe,0xeb,0x77,0x77,0xed,0x77,0x77,0xff,0xff,0x00,0xb4,\r\n0xff,0xee,0x03,0x23,0x05,0x9a,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x07,0x00,0x04,0x01,0x91,0x00,0x00,0x00,0x01,0x00,0x6e,0x02,0xcd,0x02,0xc2,0x05,0xb0,0x00,0x12,0x00,0x2b,0x40,0x16,0x00,0x0b,0x24,0x04,0x0f,0x07,0x0f,0x52,0x59,0x07,0x04,0x03,0x03,0x0b,0xc2,0x0c,0x0c,0x14,0x04,0x00,0xc2,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,\r\n0xe1,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0xc4,0x31,0x30,0x13,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0xee,0x80,0x80,0x04,0x43,0x8f,0x78,0x86,0x82,0x97,0x4a,0x71,0x02,0xcd,0x02,0xcf,0x73,0x87,0x94,0x84,0xfe,0x35,0x01,0xc3,0xb0,0x79,0x55,0x00,0x00,0x04,0x00,0xbc,\r\n0xff,0xe8,0x08,0xa0,0x05,0x9a,0x00,0x09,0x00,0x10,0x00,0x25,0x00,0x45,0x00,0xd6,0x40,0x1e,0x2b,0x41,0x30,0x3b,0x04,0x33,0x44,0x36,0x38,0x33,0x38,0x95,0x59,0x33,0x1c,0x1d,0x40,0x1a,0x17,0x20,0x1d,0x1d,0x20,0x95,0x59,0x1d,0x1d,0x03,0x13,0x27,0xb8,0xff,0xc0,0x40,0x3e,0x0b,0x0e,0x48,0x27,0x29,0x44,0x29,0x95,0x59,0x44,0x16,\r\n0x25,0x23,0x13,0x23,0x95,0x59,0x13,0x16,0x0b,0x00,0x91,0x59,0x0b,0x0b,0x03,0x02,0x03,0x0a,0x91,0x59,0x03,0x03,0x02,0x12,0x36,0x36,0x41,0x83,0x2b,0x2b,0x47,0x27,0x3b,0x83,0x30,0x30,0x47,0x16,0x25,0x1f,0x1f,0x1d,0x1a,0x21,0x84,0x18,0x16,0x16,0x47,0x02,0x0e,0xb8,0xff,0xf8,0x40,0x11,0x0c,0x06,0x4d,0x06,0x7d,0x0e,0x0e,0x47,\r\n0x0b,0x01,0x08,0x0c,0x06,0x4d,0x01,0x7e,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0x2f,0x2b,0xe1,0x2b,0x32,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x12,0x39,0x2f,0xce,0xf1,0x39,0x39,0xc2,0x2f,0xc4,0x11,0x12,0x39,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x3f,\r\n0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0xc4,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x20,0x11,0x14,0x04,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x35,\r\n0x33,0x35,0x37,0x11,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x17,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x01,0x64,0xa8,0x01,0x38,0x01,0xce,0xfe,0xf8,0xeb,0x6b,0x5e,0x01,0x50,0xfe,0xc5,0x04,0x39,0x3a,0x5f,0x83,\r\n0x75,0x9b,0x9b,0xa4,0xed,0xed,0x83,0x3b,0x2f,0x44,0x79,0x89,0xa2,0x40,0xf6,0x6c,0xb8,0x92,0x82,0x4e,0x60,0x72,0x48,0x58,0x6c,0x5e,0x8d,0x4b,0xb0,0x9a,0xa2,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0xfe,0x54,0xd2,0xfe,0x02,0xe4,0xfd,0xb4,0x01,0x30,0x01,0x1c,0xfb,0x08,0x20,0x8e,0x9e,0x01,0xd0,0x8a,0xfa,0x36,0xfe,0xd0,0x8a,0xfe,0x4d,\r\n0xbf,0x22,0x71,0xb0,0x63,0x72,0x28,0x50,0x5c,0x3e,0x74,0x79,0x91,0x2e,0xa0,0x44,0x3f,0x32,0x39,0x2c,0x27,0x3f,0x70,0x4a,0x7d,0x8f,0xff,0xff,0x00,0xbc,0xff,0xe8,0x04,0x4e,0x05,0x9a,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x2d,0x02,0x23,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x02,0x32,0xb4,0x0a,0x10,0x02,0x03,0x25,0x01,\r\n0x2b,0x35,0xff,0xff,0x00,0x90,0xfe,0x1e,0x03,0x6c,0x05,0xd9,0x00,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,0x00,0x4d,0x02,0x06,0x00,0x00,0x00,0x36,0xb3,0x03,0x02,0x1a,0x1a,0xb8,0xff,0xee,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xfe,0x40,0x18,0x0c,0x06,0x4d,0x1a,0x0e,0x0b,0x06,0x4d,0x01,0x00,0x0d,0x0d,0x02,0x0c,0x06,0x4d,0x0d,0x02,\r\n0x0b,0x06,0x4d,0x2f,0x2a,0x01,0x5d,0x2b,0x2b,0x11,0x35,0x35,0x2b,0x2b,0x2b,0x11,0x35,0x35,0xff,0xff,0xff,0xd7,0x00,0x00,0x04,0x4a,0x05,0xb2,0x00,0x26,0x00,0x51,0x52,0x00,0x01,0x07,0x00,0xb7,0xff,0x69,0x00,0x00,0x00,0x17,0xb2,0x00,0x00,0x00,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xef,0xb2,0x0b,0x06,0x4d,0x2b,\r\n0x2b,0x11,0x35,0x00,0x00,0x01,0x00,0x82,0x03,0xdb,0x01,0x5e,0x05,0x9a,0x00,0x03,0x00,0x19,0xb9,0x00,0x01,0xff,0xe8,0x40,0x09,0x0e,0x12,0x48,0x01,0xb3,0x03,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0xed,0x31,0x30,0x01,0x2b,0x01,0x03,0x23,0x13,0x01,0x5e,0x68,0x74,0x56,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x02,0x00,0x8d,0x03,0xdb,\r\n0x02,0x84,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x3b,0xb9,0x00,0x01,0xff,0xe8,0xb3,0x0e,0x12,0x48,0x05,0xb8,0xff,0xe8,0x40,0x17,0x0e,0x12,0x48,0x05,0x01,0xb3,0x40,0x04,0x00,0x03,0x00,0x0e,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x00,0x06,0x01,0x06,0x2f,0x5d,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0xe1,0x00,0x3f,0xc4,0x1a,0xfd,0xc4,\r\n0x31,0x30,0x01,0x2b,0x2b,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x84,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x04,0x00,0x96,0xff,0xec,0x06,0x0e,0x05,0xae,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x2e,0x00,0x63,0x40,0x35,0x15,0x03,0x09,0x07,0x0c,0x07,0xe6,0x59,0x0c,0x24,\r\n0x00,0x02,0x12,0x02,0xe6,0x59,0x12,0x27,0x17,0x15,0x1f,0x25,0xe7,0x59,0x1f,0x19,0x19,0x2a,0xe7,0x59,0x19,0x2d,0x28,0xcc,0x1c,0x1c,0x15,0x15,0x22,0xcc,0x2d,0x2d,0x30,0x0f,0x17,0x17,0x0f,0x09,0x14,0x14,0x05,0xcc,0x0f,0x2f,0xe1,0x33,0x2f,0xc6,0x11,0x33,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x32,0x2f,0xe1,0x00,0x3f,0x2b,\r\n0x00,0x18,0x10,0xc4,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x30,0x31,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x17,0x25,0x01,0x23,0x01,0x03,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x02,0x03,0x22,0x06,0x15,\r\n0x14,0x33,0x32,0x36,0x35,0x34,0x02,0xf7,0x4f,0x5a,0x76,0x8f,0x9a,0x56,0x76,0x1f,0x66,0x5c,0x80,0x8e,0xe4,0xb8,0x72,0x49,0x02,0xdf,0xfb,0x33,0x93,0x04,0xcc,0xd6,0x8d,0x95,0xe0,0xa9,0x83,0x98,0xdd,0x41,0x6c,0x94,0xa0,0x68,0x8f,0x04,0xf7,0x43,0xc3,0x7f,0xbc,0x4f,0x8d,0x35,0x9f,0x87,0xbf,0x01,0x00,0x32,0x1e,0xfa,0x66,0x05,\r\n0x9a,0xfa,0x52,0xa4,0x84,0xb2,0x01,0x0a,0x9c,0x88,0xb5,0xfe,0xf5,0x02,0x76,0xd2,0x7d,0xb8,0xc6,0x86,0xbb,0x00,0x00,0x02,0x00,0x0e,0xff,0xe8,0x02,0x85,0x05,0xd3,0x00,0x17,0x00,0x20,0x00,0x4b,0x40,0x25,0x18,0x01,0x00,0x16,0x0a,0x05,0x00,0x20,0x17,0x17,0x05,0x13,0x05,0x1d,0xda,0x59,0x05,0x10,0x0e,0x13,0x0e,0xec,0x59,0x13,\r\n0x13,0x10,0x1b,0x48,0x08,0x08,0x22,0x00,0x18,0x01,0x0a,0x83,0x16,0x2f,0xe1,0x39,0x39,0xcd,0x12,0x39,0x2f,0xe1,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x1a,0x19,0xcd,0x12,0x39,0x39,0x11,0x39,0x39,0x31,0x30,0x13,0x37,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x01,0x11,0x14,0x16,0x33,\r\n0x32,0x37,0x15,0x06,0x23,0x22,0x35,0x35,0x07,0x13,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x0e,0xb2,0x7b,0x6f,0x64,0x77,0xfe,0xe3,0x1c,0x1e,0x30,0x96,0x70,0x71,0xc7,0x50,0xf8,0x6d,0x25,0x4c,0x1d,0x29,0x01,0xa6,0xec,0x01,0xc6,0xe2,0x99,0x87,0x68,0xc3,0xfe,0x79,0xfe,0x60,0x5a,0x29,0x6b,0xa2,0x58,0xf1,0xe1,0x62,0x02,0x2b,\r\n0xbb,0x71,0x35,0x76,0x3e,0xb6,0x00,0x02,0x00,0x92,0x00,0x00,0x04,0x42,0x03,0xb0,0x00,0x03,0x00,0x07,0x00,0x3a,0x40,0x0d,0x07,0xf1,0x01,0x0e,0x06,0xf1,0x40,0x02,0x12,0x03,0x02,0x42,0x06,0xb8,0xff,0xe0,0x40,0x14,0x0c,0x06,0x4d,0x06,0xf1,0x02,0x05,0x20,0x0c,0x06,0x4d,0x05,0xf1,0x03,0x08,0x09,0x03,0x02,0xff,0x3a,0x2b,0x01,\r\n0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x2b,0x00,0x18,0x3f,0x1a,0xed,0xfd,0xed,0x31,0x30,0x13,0x21,0x11,0x21,0x13,0x11,0x21,0x11,0x92,0x03,0xb0,0xfc,0x50,0x4b,0x03,0x19,0x03,0xb0,0xfc,0x50,0x03,0x64,0xfc,0xe8,0x03,0x18,0x00,0x01,0x00,0x83,0x01,0xbc,0x02,0x52,0x03,0x8c,0x00,0x03,0x00,0x25,0x40,0x16,0x02,0x0e,0x40,0x03,0x02,0x01,\r\n0x42,0x0f,0x01,0x1f,0x01,0x2f,0x01,0x03,0x09,0x03,0x04,0x05,0x02,0x01,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x11,0x21,0x11,0x02,0x52,0xfe,0x31,0x03,0x8c,0xfe,0x30,0x01,0xd0,0x00,0x00,0x02,0x00,0x83,0x01,0xbc,0x02,0x52,0x03,0x8c,0x00,0x03,0x00,0x07,0x00,0x41,0x40,0x2a,0x06,0xf1,\r\n0x02,0x0e,0x07,0xf1,0x40,0x01,0x03,0x02,0x42,0x02,0x20,0x0c,0x06,0x4d,0x06,0xf1,0x02,0x05,0x20,0x0c,0x06,0x4d,0x05,0xf1,0x03,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x09,0x03,0x08,0x09,0x03,0x02,0xff,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x2b,0x00,0x18,0x2f,0x1a,0xed,0xfd,0xed,0x31,0x30,0x13,0x21,0x11,\r\n0x21,0x13,0x11,0x21,0x11,0x83,0x01,0xcf,0xfe,0x31,0x4c,0x01,0x37,0x03,0x8c,0xfe,0x30,0x01,0x84,0xfe,0xc8,0x01,0x38,0x00,0x00,0x01,0x00,0xb2,0x00,0x89,0x04,0x23,0x03,0xfa,0x00,0x0b,0x00,0x25,0x40,0x15,0x03,0x0e,0x40,0x09,0x06,0x00,0x42,0x20,0x00,0x01,0x0f,0x06,0x01,0x09,0x03,0x0c,0x0d,0x06,0x00,0xff,0x3a,0x2b,0x01,0x5f,\r\n0x5e,0x5d,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x34,0x24,0x33,0x32,0x00,0x04,0x23,0xfe,0xff,0xb6,0xb8,0xfe,0xfe,0x01,0x06,0xb2,0xb7,0x01,0x02,0x02,0x42,0xb8,0xfe,0xff,0x01,0x01,0xb8,0xb9,0xff,0xfe,0xfc,0x00,0x00,0x02,0x00,0x70,0x01,0xaa,0x02,0x66,0x03,0xa0,0x00,0x0b,0x00,0x17,\r\n0x00,0x46,0x40,0x2d,0x0f,0xf1,0x03,0x0e,0x15,0xf1,0x40,0x09,0x00,0x20,0x0c,0x06,0x4d,0x06,0x00,0x42,0x12,0xf1,0x00,0x0c,0x20,0x0c,0x06,0x4d,0x0c,0xf1,0x06,0x0f,0x06,0x1f,0x06,0x02,0x0b,0x03,0x00,0x40,0x09,0x0c,0x48,0x18,0x19,0x06,0x00,0xff,0x3a,0x2b,0x01,0x2b,0x5f,0x5e,0x5d,0x10,0xe1,0x2b,0x10,0xe1,0x2b,0x01,0x2b,0x00,\r\n0x18,0x2f,0x1a,0xed,0xf4,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x66,0x92,0x69,0x67,0x94,0x92,0x69,0x67,0x94,0xfe,0x56,0x67,0x49,0x4a,0x64,0x66,0x4a,0x48,0x66,0x02,0xa6,0x6a,0x92,0x94,0x68,0x66,0x94,0x94,0x66,0x4a,0x66,\r\n0x66,0x4a,0x49,0x65,0x67,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0x8c,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x56,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x00,0x12,0x13,0x06,0x07,0x25,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x2f,0x02,0x26,\r\n0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xe6,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x22,0x23,0x10,0x14,0x25,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x07,0x6c,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x87,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x30,\r\n0x1a,0x16,0x10,0x0a,0x25,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x06,0x0e,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xb8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf9,0x40,0x09,0x1a,0x16,0x10,0x0a,0x25,0x01,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x06,0xe2,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x31,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x32,0x19,0x1f,0x10,0x0a,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x05,0x85,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,\r\n0x00,0xdb,0x01,0x84,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1d,0x19,0x1f,0x10,0x0a,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0x8b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfe,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x12,0x0d,0x0c,0x02,0x03,0x25,0x01,\r\n0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x2f,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfa,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x16,0x1c,0x1d,0x19,0x13,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,\r\n0x07,0x1c,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xf3,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x02,0x03,0x3e,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xf5,0x00,0x00,0x00,0x16,\r\n0xb9,0x00,0x02,0x01,0x1f,0x40,0x09,0x1a,0x1a,0x19,0x13,0x3e,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe2,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x57,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x0f,0x15,0x02,0x03,0x3e,0x01,0x0c,0x05,0x26,\r\n0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x85,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x71,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x08,0x1a,0x1a,0x0f,0x0f,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x6c,0x02,0x26,\r\n0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x95,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0x1d,0x1e,0x1a,0x10,0x0a,0x3e,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0e,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xd1,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0d,\r\n0x2a,0x26,0x20,0x17,0x3e,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x06,0xe2,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x4f,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x2f,0x1d,0x23,0x10,0x0a,0x3e,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0x85,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x70,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x26,0x26,0x13,0x13,0x3e,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0x85,0x04,0xec,0x05,0xb2,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x01,0x9c,\r\n0x01,0x79,0x00,0x00,0x00,0x0b,0xb6,0x01,0x3f,0x1c,0x1a,0x05,0x19,0x25,0x01,0x2b,0x35,0x00,0x00,0x03,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0xc6,0x00,0x18,0x00,0x25,0x00,0x29,0x00,0xbc,0xb6,0x24,0x18,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe0,0x40,0x0e,0x0b,0x0c,0x00,0x4c,0x28,0x26,0x26,0x19,0x10,0x28,0x80,0x26,0x13,0x05,0xb8,\r\n0xff,0xc0,0x40,0x31,0x0b,0x0f,0x48,0x05,0x05,0x07,0x95,0x02,0x1c,0x0a,0x23,0x95,0x0d,0x16,0x17,0x0f,0x15,0x1d,0x95,0x13,0x10,0x04,0x15,0x19,0x16,0x03,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x09,0x05,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf0,\r\n0x40,0x2b,0x0b,0x06,0x4d,0x09,0x09,0x2b,0x04,0x20,0x06,0x0d,0x06,0x4d,0x20,0x06,0x0c,0x06,0x4d,0x20,0x06,0x0b,0x06,0x4d,0x20,0x83,0x10,0x10,0x0d,0x06,0x4d,0x10,0x0e,0x0c,0x06,0x4d,0x10,0x1a,0x0b,0x06,0x4d,0x10,0x2f,0x2b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,\r\n0x2b,0x17,0x33,0x2f,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x2f,0x2b,0x10,0xde,0x1a,0xcd,0x11,0x12,0x01,0x39,0x2f,0xcd,0x31,0x30,0x00,0x2b,0x2b,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x13,0x33,0x03,0x04,0x10,0xfd,0xe4,0xc1,0x8b,0xae,0x9c,0x01,0x7a,0x04,0x74,0xec,0xbe,0xea,0xfb,0xda,0xd1,0x62,0x04,0xa4,0xa4,0xa4,0x7c,0x9a,0xaa,0xa6,0x87,0x8b,0xac,0xfe,0x6b,0xa6,0x7b,0x75,0x52,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x13,0xe4,0x01,0x05,0x01,0x34,0xa6,0x8e,\r\n0xfd,0xcf,0x97,0x79,0xaf,0xde,0xc6,0xaa,0xce,0xc3,0x03,0x8d,0x01,0x04,0xfe,0xfc,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x07,0x6a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x5e,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x10,0x0c,0x06,0x0b,0x3e,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0xbb,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x00,0x01,0xad,0x00,0x16,0xb9,0x00,0x01,0xff,0xf3,0x40,0x09,0x17,0x18,0x04,0x0f,0x3e,0x01,0x16,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x92,0x05,0x9a,0x00,0x13,0x00,0x17,0x00,0xa0,\r\n0x40,0x5d,0x06,0x09,0x0d,0x17,0x04,0x13,0x10,0x10,0x13,0x91,0x59,0x10,0x10,0x0f,0x16,0x16,0x02,0x91,0x59,0x16,0x0f,0x00,0x16,0x91,0x2b,0x30,0x0b,0x0f,0x03,0x04,0x00,0x12,0x0d,0x10,0x16,0x03,0x00,0x01,0x12,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,0x12,0x0d,0x06,0x4d,\r\n0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x19,0x09,0x0c,0x14,0x03,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7e,0x07,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,\r\n0x2b,0x2b,0xca,0x2f,0x11,0x12,0x17,0x39,0x00,0x3f,0xc4,0x3f,0xc4,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x21,0x15,0x21,0x35,0x04,0xf2,0xa8,0xfd,0x1a,0xa8,0xa0,0xa0,\r\n0xa8,0x02,0xe6,0xa8,0xa0,0xa0,0xfc,0x72,0x02,0xe6,0x02,0x8e,0xfd,0x72,0x04,0x04,0x98,0xfe,0xfe,0xfe,0xfe,0x98,0xdf,0xdf,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x1a,0x00,0xbd,0x40,0x40,0x00,0x19,0x01,0x03,0x02,0x18,0x01,0x10,0x04,0x0d,0x0a,0x13,0x10,0x10,0x13,0x96,0x59,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,\r\n0x09,0x03,0x10,0x10,0x0f,0x17,0x15,0x04,0x17,0x04,0x95,0x59,0x17,0x10,0x0f,0x00,0x08,0x00,0x15,0x12,0x12,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,\r\n0x01,0x01,0x1c,0x0d,0x10,0x13,0x03,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x0b,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x1c,0x01,0x5d,0x2f,0x2b,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,\r\n0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0xc4,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,\r\n0xa4,0xee,0x78,0xa4,0xa4,0x88,0x88,0xa4,0x01,0x4c,0xfe,0xb4,0x04,0x78,0xd8,0xa8,0xb2,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0xa4,0xc2,0xd6,0xcb,0xff,0xff,0xff,0xd0,0x00,0x00,0x02,0x51,0x07,0x0c,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xad,0x01,0x5a,0x00,0x13,0x40,0x0b,\r\n0x01,0x00,0x0e,0x04,0x02,0x03,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xad,0x00,0x00,0x02,0x2e,0x05,0xb2,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xd8,0x8a,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0e,0x04,0x02,0x03,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x13,0x00,0x00,0x02,0x0f,0x06,0x8b,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xd5,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xef,0x00,0x00,0x01,0xeb,0x05,0x2f,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,\r\n0x00,0xd9,0xb1,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x23,0x07,0x1a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xda,0xff,0xd9,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,\r\n0x07,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdb,0x00,0x00,0x02,0x00,0x05,0xbe,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xda,0xb6,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf5,0x40,0x09,0x0a,0x04,0x02,0x03,0x25,0x01,0x07,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x50,0xfe,0x70,0x01,0x64,\r\n0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x06,0x00,0xdf,0x12,0x00,0x00,0x0b,0xb6,0x01,0x00,0x04,0x04,0x00,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x37,0xfe,0x70,0x01,0x66,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x06,0x00,0xdf,0xf9,0x00,0x00,0x0b,0xb6,0x02,0x00,0x1e,0x10,0x0e,0x0f,0x25,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0xf2,0x07,0x6a,0x02,0x26,0x00,0x2d,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x62,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x13,0x0b,0x0c,0x3e,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x02,0x0f,0x06,0x0e,0x02,0x26,0x06,0xac,0x00,0x00,0x01,0x07,\r\n0x00,0xd7,0xff,0x7f,0x00,0x00,0x00,0x08,0xb3,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x85,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xea,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x14,0x11,0x06,0x01,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0x85,0x03,0xf8,0x05,0xec,\r\n0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0x87,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x10,0x0d,0x04,0x01,0x3e,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x0c,0x00,0x66,0x40,0x45,0x7a,0x0c,0x01,0x77,0x0b,0x01,0x79,0x02,0x01,0x7d,0x0a,0x01,0x7e,0x01,0x01,0x36,0x0c,0x01,0x2a,0x01,\r\n0x01,0x36,0x00,0x01,0x05,0x15,0x06,0x0f,0x0a,0x0b,0x0b,0x01,0x70,0x00,0x01,0x00,0x14,0x0b,0x06,0x4d,0x00,0x0c,0x08,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0x2f,0x0e,0x01,0x5d,0x2f,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x5d,0x33,0x33,0x2f,\r\n0x33,0x00,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x04,0x00,0xfe,0x2b,0x01,0xd5,0xfe,0x12,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x03,0xa4,\r\n0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0x96,0x00,0x00,0xff,0xff,0x00,0x27,0xfe,0x85,0x01,0x4a,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x01,0x9c,0xff,0x4c,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x01,0x9c,0x01,0x6a,0x00,0x00,\r\n0x00,0x0e,0xb9,0x00,0x01,0xff,0xea,0xb4,0x16,0x14,0x08,0x01,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x85,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0xb9,0x00,0x00,0x00,0x0b,0xb6,0x01,0x10,0x16,0x13,0x08,0x01,0x3e,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x5a,0x05,0x40,0x05,0x9a,\r\n0x00,0x1b,0x00,0xb8,0xb5,0x02,0x09,0x01,0x10,0x04,0x0c,0xb8,0xff,0xc0,0xb3,0x10,0x00,0x4d,0x0c,0xb8,0xff,0xe8,0x40,0x3d,0x0c,0x00,0x4d,0x02,0x20,0x10,0x00,0x4d,0x17,0x19,0x14,0x19,0x91,0x59,0x14,0x02,0x0c,0x1b,0x10,0x08,0x03,0x1b,0x07,0x12,0x16,0x16,0x12,0x1b,0x1b,0x0c,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,\r\n0x12,0x08,0x0b,0x06,0x4d,0x12,0x7e,0x7f,0x0f,0x01,0x0f,0x18,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x1a,0x0b,0x06,0x4d,0x0f,0x0f,0x1d,0x09,0x03,0x06,0x06,0x0d,0x06,0x4d,0x06,0x06,0x0c,0x06,0x4d,0x06,0x06,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0x40,\r\n0x09,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x39,0x33,0x2f,0x10,0xc0,0x2f,0x00,0x3f,0xc4,0x3f,0xc4,0x12,0x39,0x39,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x2b,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x26,0x27,0x23,\r\n0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x01,0x90,0x16,0x18,0x06,0x08,0xa8,0xda,0x02,0xce,0x02,0x38,0x04,0x0a,0xa8,0xfe,0x93,0x4c,0x3d,0x4e,0x3f,0xbd,0x04,0x77,0x20,0x3a,0x35,0x90,0xfb,0xf4,0x05,0x9a,0xfb,0xd6,0x02,0x66,0x48,0x94,0x03,0xb6,\r\n0xfa,0xa6,0xfe,0x1a,0x1f,0xa5,0x2c,0x01,0x0e,0x00,0x00,0x01,0x00,0xa6,0xfe,0x5a,0x03,0xf8,0x04,0x18,0x00,0x19,0x00,0x9c,0x40,0x2b,0x00,0x18,0x01,0x10,0x03,0x05,0x07,0x02,0x07,0x91,0x59,0x02,0x14,0x0c,0x17,0x0c,0x95,0x59,0x17,0x10,0x12,0x0f,0x11,0x15,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,\r\n0x06,0x4d,0x00,0x84,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x09,0x09,0x1b,0x13,0x10,0x06,0x0d,0x06,0x4d,0x10,0x06,0x0c,0x06,0x4d,0x10,0x06,0x0b,0x06,0x4d,0x10,0x84,0x11,0x02,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x11,\r\n0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x11,0x2f,0x1b,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc4,0x00,0x3f,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x5f,0x5e,0x5d,0x25,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,\r\n0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xfe,0x9a,0x4c,0x3e,0x4e,0x40,0xbe,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x75,0xdb,0x01,0x5a,0x1a,0xfe,0x40,0x1f,0xa5,0x2c,0x01,0x0e,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xfe,0x5a,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,\r\n0x06,0x8b,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xce,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x06,0x1a,0x1b,0x03,0x09,0x3e,0x02,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x2f,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x26,0x00,0x00,0x00,0x13,\r\n0x40,0x0b,0x02,0x0a,0x1a,0x1b,0x03,0x09,0x3e,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x1c,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xd7,0x01,0x5e,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x1b,0x0c,0x0c,0x3e,0x02,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,\r\n0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xbe,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x35,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x21,0x21,0x06,0x06,0x3e,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,\r\n0x00,0x07,0x01,0x9c,0x00,0xe4,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x85,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x06,0x01,0x9c,0x19,0x00,0x00,0x0b,0xb6,0x01,0x1f,0x14,0x14,0x06,0x06,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xd7,\r\n0x00,0xb1,0x01,0x5c,0x00,0x08,0xb3,0x01,0x3a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0e,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x06,0x00,0xd7,0x37,0x00,0x00,0x08,0xb3,0x01,0x30,0x11,0x26,0x00,0x2b,0x35,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x0f,0x00,0xa3,0x40,0x1a,0x0b,0x08,\r\n0x05,0x02,0x02,0x05,0x91,0x59,0x02,0x0f,0x06,0x02,0x91,0x2b,0x30,0x0c,0x00,0x0f,0x00,0x91,0x59,0x0f,0x03,0x06,0x12,0x0d,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x2f,0x0b,0x06,0x4d,0x04,0x0e,0x06,0x07,0x09,0x42,0x09,0x07,0x00,0x0e,0x06,0x07,0x0d,0x42,0x2f,0x0d,0x3f,0x0d,0xcf,0x0d,0x03,0x0d,0x0d,0x10,\r\n0x0b,0x02,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x7e,0x07,0x04,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x11,0x40,0x0c,0x00,0x4d,0x11,0xb8,0xff,0xc0,0xb2,0x0b,0x00,0x4d,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x5d,0x2b,0x01,\r\n0x10,0xe0,0x18,0x10,0xc6,0x2b,0x01,0x10,0xe2,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xf6,0xf6,0xa8,0xf9,0xf9,0xfe,0x63,0x03,0xe3,0x05,0x02,0xfe,0x1a,\r\n0x9b,0xfd,0x7f,0x02,0x81,0x9b,0x01,0xe6,0x98,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,0x05,0x2f,0x00,0x1e,0x00,0x93,0x40,0x45,0x0b,0x18,0x0b,0x0c,0x00,0x4c,0x1d,0x01,0x0d,0x10,0x10,0x0d,0x96,0x59,0x10,0x18,0x14,0x40,0x1c,0x19,0x11,0x14,0x14,0x11,0x95,0x59,0x14,0x0f,0x07,0x05,0x0a,0x05,0x95,0x59,0x0a,0x16,0x07,0x1e,\r\n0x2f,0x1b,0x01,0x1b,0x1b,0x02,0x0e,0x12,0x10,0x14,0x19,0x1d,0x04,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x0c,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xee,0xb6,0x0b,0x06,0x4d,0x0c,0x0c,0x20,0x1f,0x11,0x12,0x39,0x2f,0x2b,0x2b,\r\n0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0xdc,0xc6,0x10,0xc0,0x2f,0x5d,0xc6,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,0x18,0x10,0xcd,0xc6,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x01,0x23,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,\r\n0x35,0x36,0x37,0x37,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x77,0xf8,0x45,0x52,0x3c,0x2f,0x3a,0x5f,0xfe,0xf3,0xa3,0xa3,0xb0,0xb0,0x04,0x4e,0x52,0x01,0x02,0xfe,0xfe,0xf8,0x02,0x23,0xf0,0x67,0x58,0x22,0x8c,0x20,0x01,0x2c,0x01,0x0d,0x85,0xcc,0x8c,0xfa,0x02,0x19,0x1a,0xfe,0xd1,0x8c,0xcc,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,\r\n0x07,0x0e,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x5f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x03,0x18,0x0e,0x05,0x0d,0x25,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd6,0x00,0x00,0x00,0x13,\r\n0x40,0x0b,0x01,0x00,0x1c,0x12,0x08,0x11,0x25,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x06,0x8b,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x81,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x0d,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,\r\n0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0x2f,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xf9,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x14,0x15,0x08,0x11,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x1a,0x02,0x26,0x00,0x38,\r\n0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x84,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x14,0x0e,0x05,0x0d,0x25,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xbe,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xfd,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,\r\n0xfb,0x40,0x09,0x18,0x12,0x08,0x11,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xfe,0x70,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x10,0x00,0x00,0xff,0xff,0x00,0x90,0xfe,0x70,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x00,0x07,0x00,0xdf,0x02,0x90,\r\n0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x6a,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0xd7,0x02,0x5b,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x1e,0x13,0x14,0x25,0x01,0x20,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0e,0x02,0x26,0x00,0x5a,0x00,0x00,\r\n0x01,0x07,0x00,0xd7,0x01,0x80,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfb,0x40,0x09,0x1e,0x1e,0x13,0x14,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x69,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xc5,0x01,0x5b,0x00,0x13,0x40,0x0b,0x01,0x00,0x13,0x14,\r\n0x05,0x00,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0e,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x10,0x1a,0x1b,0x0c,0x00,0x25,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xa6,\r\n0x00,0x00,0x02,0x62,0x06,0x02,0x00,0x0c,0x00,0x39,0x40,0x23,0x00,0x02,0x0a,0x02,0x95,0x59,0x0a,0x01,0x05,0x15,0x2f,0x00,0x01,0x00,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x84,0x06,0x06,0x0e,0x0d,0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0xc4,0x5d,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,\r\n0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x62,0x2e,0x3e,0xac,0xa4,0xbd,0x89,0x4a,0x2c,0x05,0x5c,0x1b,0xd9,0xfb,0x62,0x04,0xa6,0xa1,0xbb,0x12,0x00,0x00,0x04,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x52,0x00,0x10,0x00,0x1b,0x00,0x23,0x00,0x27,0x00,0xfe,0x40,0x39,0x78,0x27,0x01,0x76,\r\n0x22,0x01,0x79,0x1d,0x01,0x74,0x0c,0x01,0x7b,0x0a,0x01,0x7b,0x07,0x01,0x77,0x06,0x01,0x02,0x08,0x0c,0x00,0x4d,0x1c,0x02,0x01,0x20,0x01,0x23,0x03,0x04,0x20,0x04,0x73,0x04,0x01,0x7c,0x01,0x01,0x20,0x30,0x0c,0x00,0x4d,0x00,0x16,0x01,0x90,0x27,0x01,0xa0,0x27,0x01,0x27,0xb8,0xff,0xc0,0xb3,0x1d,0x21,0x48,0x27,0xb8,0xff,0xc0,\r\n0x40,0x39,0x16,0x19,0x48,0x27,0xa0,0x26,0xd0,0x26,0xe0,0x26,0x03,0x10,0x26,0x20,0x26,0x30,0x26,0x80,0x26,0x90,0x26,0x05,0x26,0x0b,0x02,0x91,0x1c,0x1c,0x16,0x00,0x11,0xc5,0x0b,0x10,0x06,0x40,0x16,0x03,0x04,0x00,0x12,0x24,0x80,0x26,0x26,0x14,0x19,0xc4,0x0e,0x40,0x09,0x0c,0x48,0x0e,0x14,0xc4,0x08,0xb8,0xff,0xc0,0xb5,0x0c,\r\n0x00,0x4d,0x08,0x08,0x06,0xb8,0xff,0xf8,0x40,0x15,0x0c,0x00,0x4d,0x10,0x08,0x0c,0x00,0x4d,0x1c,0x23,0x06,0x10,0x04,0x05,0x77,0x05,0x01,0x79,0x00,0x01,0x05,0xb8,0xff,0xe8,0x40,0x0c,0x0c,0x00,0x4d,0x00,0x18,0x0c,0x00,0x4d,0x00,0x00,0x29,0x05,0x2f,0x11,0x33,0x2f,0x2b,0x2b,0x5d,0x5d,0x12,0x17,0x39,0x2b,0x2b,0x39,0x2f,0x2b,\r\n0xe9,0xd4,0x2b,0xe9,0x10,0xc0,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0x3f,0x1a,0xcd,0x39,0xd4,0xed,0x11,0x12,0x39,0x2f,0xed,0x10,0xd6,0x5d,0x72,0xcd,0x2b,0x2b,0x71,0x72,0x5d,0x2b,0x31,0x30,0x01,0x5d,0x5d,0x10,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x26,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x01,0x01,0x23,0x13,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x11,0x65,0x78,0x5c,0x58,0x70,0x60,0x6e,0x32,0x40,0x72,0x30,0x42,0x42,0xc9,0xe1,0x0b,0x0b,0x04,0x0a,0x0d,0xdf,0x02,\r\n0x04,0xfe,0xfa,0x7f,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x62,0x34,0x70,0x59,0x6e,0x6d,0x54,0x70,0x36,0x01,0x15,0x3f,0x30,0x72,0x42,0x30,0x31,0x3e,0xfb,0xae,0x02,0x63,0x1e,0x42,0x3d,0x23,0xfd,0x9d,0x06,0x29,0xfe,0xb8,0x01,0x48,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x07,0x66,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xdc,\r\n0x00,0xe9,0xff,0xc2,0x01,0x07,0x00,0x8e,0x01,0x0c,0x01,0x5c,0x00,0x33,0x40,0x25,0x04,0x0f,0x39,0x1f,0x39,0x3f,0x39,0x5f,0x39,0x90,0x39,0x05,0x20,0x39,0x5f,0x39,0x02,0x39,0x26,0x03,0x02,0x20,0x40,0x11,0x15,0x48,0x0f,0x20,0x01,0x10,0x20,0x4f,0x20,0xef,0x20,0x03,0x20,0x00,0x11,0x5d,0x71,0x2b,0x35,0x35,0x10,0xde,0x5d,0x5d,\r\n0x34,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x07,0x66,0x02,0x26,0x00,0x91,0x00,0x00,0x01,0x07,0x00,0x8e,0x03,0x30,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x17,0x16,0x15,0x11,0x09,0x25,0x02,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x06,0x56,0x06,0x0a,0x02,0x26,0x00,0xa0,0x00,0x00,\r\n0x01,0x07,0x00,0x8e,0x02,0x55,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x11,0x37,0x37,0x1e,0x1e,0x25,0x03,0x38,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xcd,0x05,0xaa,0x07,0x66,0x02,0x26,0x00,0x92,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xfa,0x01,0x5c,0x00,0x13,0x40,0x0b,0x03,0x20,0x25,0x27,0x16,0x08,\r\n0x25,0x03,0x26,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x31,0xff,0xae,0x04,0x96,0x06,0x0a,0x02,0x26,0x00,0xa1,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x58,0x00,0x00,0x00,0x16,0xb9,0x00,0x03,0xff,0xf9,0x40,0x09,0x25,0x25,0x16,0x10,0x3e,0x03,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x70,\r\n0x01,0xfe,0x01,0x50,0x02,0xdf,0x00,0x0b,0x00,0x15,0x40,0x0b,0x06,0x00,0xb0,0x5b,0x06,0x09,0xaf,0x03,0x2f,0x0d,0x01,0x5d,0x2f,0xe1,0x00,0x2f,0x2b,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x01,0xfe,0x42,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x42,0x00,0xff,0xff,\r\n0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x66,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x43,0x02,0xa0,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1f,0x1d,0x13,0x14,0x25,0x01,0x1d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0a,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,\r\n0x00,0x43,0x01,0xb5,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe7,0x40,0x09,0x1f,0x1d,0x13,0x14,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x07,0x66,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x96,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x5f,0x1d,0x01,0x00,0x1d,\r\n0x1f,0x13,0x14,0x25,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x0a,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x1d,0x1f,0x13,0x14,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x1a,0x00,0x00,0x07,0x60,0x06,0xe4,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0x8f,0x02,0x1c,0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf1,0x40,0x0a,0x31,0x1f,0x13,0x14,0x25,0x02,0x01,0x28,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x05,0x87,0x02,0x26,0x00,0x5a,\r\n0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x44,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xef,0x40,0x0a,0x31,0x1f,0x13,0x14,0x25,0x02,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x66,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xf6,0x01,0x5c,0x00,0x1a,\r\n0xb3,0x01,0x00,0x11,0x01,0xb8,0xff,0xe6,0x40,0x09,0x11,0x0f,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x5d,0x35,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x0a,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0x9e,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd6,0x40,0x09,0x18,0x16,0x0c,0x00,0x25,\r\n0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x1c,0x40,0x10,0x00,0xb3,0x40,0x03,0x04,0x00,0xb4,0x80,0x10,0x02,0x50,0x02,0x60,0x02,0x03,0x02,0x2f,0x5d,0x1a,0xe9,0x00,0x3f,0x1a,0xed,0x31,0x30,0x01,0x23,0x03,0x33,0x01,0x70,0x74,0x8e,0x94,0x03,0xf4,0x01,\r\n0xbe,0x00,0x00,0x01,0x00,0x00,0x05,0x74,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x10,0xb7,0x02,0x01,0xd9,0x59,0x02,0x00,0x03,0x02,0x2f,0x2f,0x00,0x3f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0x00,0x01,0x00,0x6a,0x00,0x00,0x03,0xee,0x05,0xb2,0x00,0x23,0x00,0x92,0x40,0x57,0x01,0x02,\r\n0x22,0x03,0x0b,0x0e,0x0e,0x0b,0x9a,0x59,0x00,0x0e,0x10,0x0e,0x20,0x0e,0x03,0x09,0x03,0x0e,0x12,0x40,0x21,0x1e,0x0f,0x12,0x12,0x0f,0x9a,0x59,0x0f,0x12,0x1f,0x12,0x02,0x09,0x03,0x12,0x12,0x16,0x06,0x19,0x1b,0x16,0x1b,0x9a,0x59,0x16,0x04,0x06,0x05,0x9a,0x59,0x06,0x12,0x00,0x1f,0x4f,0x18,0x01,0x18,0x06,0x06,0x25,0x0f,0x12,\r\n0x1e,0x21,0x04,0x01,0x08,0x0c,0x06,0x4d,0x01,0x8a,0x04,0x08,0x0b,0x10,0x0c,0x0b,0x10,0x0c,0x06,0x4d,0x0b,0x2f,0x2b,0xdd,0xc4,0x10,0xc6,0x32,0xe1,0x2b,0x17,0x39,0x12,0x39,0x2f,0xd4,0x5d,0xd4,0xc4,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x1a,\r\n0x18,0x10,0xcd,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x17,0x39,0x31,0x30,0x01,0x21,0x15,0x14,0x07,0x21,0x15,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x21,0x03,0x10,0xfe,0xd8,0xc1,0x02,0xc7,0xfc,0x7c,0xda,0xc5,0xc5,0xc5,0xc5,\r\n0xda,0xad,0x76,0x5f,0x63,0x70,0xe5,0x01,0x28,0xfe,0xd8,0x01,0x28,0x01,0xe8,0x09,0xf3,0x60,0x8c,0x87,0x47,0xf2,0x28,0x8c,0x88,0x8d,0x7d,0xbc,0xf0,0x29,0x9b,0x39,0xfe,0xcd,0x6b,0x8d,0x88,0x00,0x00,0x02,0x00,0x55,0xff,0xdd,0x04,0x78,0x04,0x48,0x00,0x12,0x00,0x19,0x00,0x53,0x40,0x2e,0x00,0x06,0x10,0x06,0x02,0x09,0x03,0x06,\r\n0x06,0x00,0x04,0x13,0x00,0xc3,0x59,0x13,0x13,0x10,0x04,0x10,0x16,0xc3,0x59,0x10,0x0a,0x04,0xc3,0x59,0x0a,0x19,0x07,0x40,0x10,0x1e,0x48,0x07,0x07,0x00,0xaf,0x13,0x13,0x1b,0x19,0x01,0xaf,0x0d,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,\r\n0x00,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x01,0x21,0x13,0x16,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x07,0x11,0x26,0x23,0x22,0x07,0x11,0x04,0x78,0xfc,0xc4,0x01,0x78,0xb0,0xff,0x8c,0x48,0x68,0xdb,0x8f,0xee,0xfe,0xdd,0x01,0x29,0xe4,0xd8,0x01,0x30,0xda,0x82,0xad,0xaf,0x76,0x02,0x12,\r\n0xfe,0x8e,0x79,0xf5,0x2a,0x98,0x7d,0x01,0x43,0xf2,0xfe,0x01,0x38,0xfe,0xe4,0xd0,0x01,0x29,0x7b,0x7b,0xfe,0xd7,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xe2,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x35,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x30,0x2d,0x00,0x3f,\r\n0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x07,0x2a,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x07,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x7d,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x44,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x8c,0xff,0xec,0x07,0x2c,0x05,0x9e,0x00,0x26,0x02,0x39,\r\n0x11,0x00,0x00,0x27,0x00,0xbc,0x03,0x09,0x00,0x00,0x01,0x07,0x02,0x3b,0x04,0x7f,0xfd,0xb8,0x00,0x0b,0xb4,0x04,0x03,0x02,0x48,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xa2,0xff,0xec,0x06,0xa5,0x05,0xa4,0x00,0x26,0x02,0x3a,0x55,0x00,0x00,0x27,0x00,0xbc,0x02,0x82,0x00,0x00,0x01,0x07,0x02,0x3b,0x03,0xf8,0xfd,0xb8,\r\n0x00,0x0b,0xb4,0x04,0x03,0x02,0x2e,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0x00,0x01,0x00,0xdb,0xfe,0x85,0x01,0xfc,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0xfc,0xa6,0x7b,0x75,0x77,0xfe,0xfc,0x01,\r\n0x04,0x00,0x00,0x01,0x00,0xdb,0xfe,0x85,0x01,0xfc,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0xfc,0xa6,0x7b,0x75,0x77,0xfe,0xfc,0x01,0x04,0x00,0xff,0xff,0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,\r\n0x02,0x06,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0xce,0x04,0x96,0x01,0xdb,0x06,0x01,0x00,0x03,0x00,0x0f,0xb5,0x01,0x00,0x01,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0xdb,0xaf,0x5e,0x66,0x06,0x01,0xfe,0x95,0x01,0x6b,0x00,0x03,0xff,0xda,0x04,0xa4,0x02,0x84,0x06,0x0f,0x00,0x03,0x00,0x0f,\r\n0x00,0x1b,0x00,0x2a,0x40,0x14,0x0a,0x04,0x16,0xc1,0x40,0x10,0x03,0x01,0x0d,0xc0,0x07,0x07,0x00,0x13,0xc0,0x19,0x19,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x33,0x2f,0xe1,0x11,0x33,0x2f,0xe1,0x00,0x2f,0xcd,0xd4,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xd6,0xaf,0x5d,0x65,0xf2,0x28,0x39,0x39,0x27,0x2a,0x3a,0x3a,0xfd,0xf2,0x28,0x3a,0x3a,0x28,0x29,0x3b,0x3a,0x06,0x0f,0xfe,0x95,0x01,0x6b,0xfe,0xb9,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,\r\n0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x01,0x9f,0xff,0x5f,0xff,0x99,0x00,0x12,0x40,0x0a,0x02,0x13,0x03,0x02,0x17,0x12,0x12,0x05,0x05,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc5,0x00,0x00,0x04,0x36,0x05,0x9a,0x00,0x27,0x00,0x28,0x00,0x82,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf7,0xff,0x99,0x00,0x14,\r\n0xb3,0x01,0x0f,0x03,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x02,0x02,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc5,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf7,0xff,0x99,0x00,0x14,0xb3,0x01,0x0f,0x03,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x06,0x06,0x3e,0x01,0x2b,\r\n0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xc6,0x00,0x00,0x02,0x4a,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xe6,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf8,0xff,0x99,0x00,0x07,0xb2,0x01,0x07,0x03,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xd1,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x01,0x9f,0xff,0x03,0xff,0x99,\r\n0x00,0x12,0x40,0x0a,0x02,0x1b,0x03,0x02,0x1a,0x18,0x18,0x03,0x03,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xb3,0x00,0x00,0x05,0x48,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe8,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xe5,0xff,0x99,0x00,0x14,0xb3,0x01,0x11,0x03,0x01,0xb8,0xff,0xc6,0xb4,0x0e,0x0e,0x05,0x05,0x3e,0x01,0x2b,\r\n0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xd1,0x00,0x00,0x06,0x3b,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x92,0x00,0x00,0x01,0x07,0x01,0x9f,0xff,0x03,0xff,0x99,0x00,0x14,0xb3,0x01,0x1f,0x03,0x01,0xb8,0xff,0xe8,0xb4,0x1c,0x1c,0x12,0x12,0x3e,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5c,0x06,0x0f,0x02,0x26,\r\n0x01,0xc9,0x00,0x00,0x01,0x06,0x01,0xa0,0xd8,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0b,0x0e,0x0e,0x05,0x05,0x3e,0x03,0x02,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,\r\n0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x02,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,\r\n0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x04,0xef,0x05,0x9a,0x00,0x0b,0x00,0x5f,0x40,0x18,0x77,0x09,0x01,0x71,0x08,0x01,0x76,0x07,0x01,0x79,0x02,0x01,0x7e,0x01,0x01,0x78,0x00,0x01,0x0a,0x08,0x0c,0x00,\r\n0x4d,0x07,0xb8,0xff,0xf0,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x02,0x10,0x0b,0x0c,0x00,0x4c,0x0b,0xb8,0xff,0xf8,0x40,0x0e,0x0c,0x00,0x4d,0x0b,0x03,0x00,0x12,0x00,0x18,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xe8,0xb7,0x0b,0x0c,0x00,0x4c,0x00,0x00,0x0d,0x09,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x00,0x3f,0x3f,0x31,0x30,0x01,0x2b,0x2b,0x2b,\r\n0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x04,0xef,0xbb,0xfe,0x6c,0x10,0x0c,0x04,0x0a,0x14,0xfe,0x6a,0xb4,0x02,0x0e,0xbe,0x04,0x7e,0x2f,0x47,0x3e,0x39,0xfb,0x83,0x05,0x9a,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,\r\n0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x00,0x31,0x00,0x00,0x00,0x03,0x00,0x3a,0x00,0x00,0x03,0xdb,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x52,0x40,0x32,0x06,0x05,0x91,0x59,0x06,0x02,0x09,0x06,0x91,0x2b,0x30,0x02,0x01,0xee,0x59,0x02,0x03,0x09,0x0a,0xee,0x59,0x09,0x12,0x0f,0x04,0x5f,0x04,0x02,0x0b,0x03,\r\n0x09,0x08,0x05,0x04,0xff,0x3a,0x30,0x01,0x70,0x01,0x02,0x00,0x01,0x00,0x01,0x0a,0x08,0x08,0x0d,0x09,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x01,0x5f,0x5e,0x5d,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0xc0,\r\n0xfc,0x94,0x03,0x6c,0x8a,0xfd,0xa9,0x02,0x57,0xa5,0xfc,0x5f,0x03,0xa1,0x04,0xfa,0xa0,0xfc,0xee,0x99,0xfc,0xdf,0xa2,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xfc,0x05,0x9a,0x00,0x07,0x00,0x6f,0x40,0x3c,0x07,0x02,0x91,0x59,0x07,0x03,0x04,0x00,\r\n0x12,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x12,0x0c,0x06,0x4d,0x01,0x01,0x09,0x04,0x06,0x0d,0x06,0x4d,0x04,0x06,0x0c,0x06,0x4d,0x04,0x06,0x0b,0x06,0x4d,0x04,0x7e,0x05,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,\r\n0x0c,0x06,0x4d,0x05,0xb8,0xff,0xfe,0xb3,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x04,0xfc,0xaa,0xfd,0x13,0xa9,0x04,0x40,0x04,0xfe,0xfb,0x02,0x05,0x9a,0x00,0xff,0xff,0x00,0xbc,\r\n0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x00,0x03,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x5e,0x40,0x0c,0x05,0x0a,0x01,0x04,0x08,0x01,0x0c,0x03,0x01,0x10,0x03,0x0a,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x08,0xb8,0xff,0xe8,0x40,0x22,0x0c,0x00,0x4d,0x03,0x18,0x0c,0x00,0x4d,0x04,0x07,0x06,\r\n0x06,0x07,0x91,0x59,0x06,0x03,0x02,0x00,0x0b,0x00,0x0b,0x91,0x59,0x00,0x12,0x07,0x00,0x00,0x0d,0x08,0x04,0x0a,0x02,0x2f,0x33,0xc6,0x32,0x12,0x39,0x2f,0xc4,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,\r\n0x21,0x01,0x01,0x21,0x03,0xf0,0xfc,0x3e,0x01,0xd1,0xfe,0x59,0x03,0x5a,0xfd,0x9b,0x01,0x7b,0xfe,0x5c,0x02,0xcc,0x4e,0x02,0x94,0x02,0x5e,0x5a,0x9b,0xfd,0xe9,0xfd,0xac,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,\r\n0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x88,0x00,0x00,0x05,0xae,0x05,0x9a,0x00,0x19,0x00,0xca,0xb9,0x00,0x16,0xff,0xc0,0xb3,0x0c,0x00,0x4d,0x03,0xb8,0xff,0xc0,0x40,0x1a,0x0c,0x00,0x4d,0x18,0x0e,0x0b,0x01,0x0b,0x01,0x91,0x59,0x0b,0x0b,0x0c,0x14,0x00,0x06,\r\n0x03,0x0c,0x12,0x07,0x08,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x04,0x7e,0x07,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xf4,0x40,0x40,0x0b,0x06,0x4d,0x07,0x0e,0x0c,0x0d,0x12,0x42,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,\r\n0x15,0x7e,0x12,0x0d,0x0c,0x06,0x4d,0x12,0x08,0x0d,0x06,0x4d,0x12,0x0d,0x0b,0x06,0x4d,0x12,0x12,0x1a,0x18,0x01,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x0d,0xb8,0xff,0xfb,0x40,0x0a,0x0b,0x06,0x4d,0x0d,0x0d,0x1b,0x1a,0x4f,0x1b,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,\r\n0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x2b,0x01,0x11,0x33,0x20,0x11,0x11,0x33,0x11,0x14,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x00,0x35,0x11,0x33,0x11,\r\n0x10,0x21,0x33,0x11,0x03,0x68,0x39,0x01,0x6a,0xa3,0xfe,0xe2,0xef,0x39,0x9b,0x39,0xf0,0xfe,0xe4,0xa2,0x01,0x6a,0x39,0x05,0x9a,0xfc,0x80,0x01,0x6e,0x02,0x12,0xfd,0xee,0xe3,0xfe,0xe1,0xfe,0x7a,0x01,0x86,0x01,0x1f,0xe3,0x02,0x12,0xfd,0xee,0xfe,0x92,0x03,0x80,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x05,0xa9,0x05,0xb2,0x02,0x06,\r\n0x00,0x9f,0x00,0x00,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,\r\n0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x95,0x01,0x5b,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfc,0x40,0x0a,0x1d,0x17,0x05,0x00,0x25,0x02,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x01,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x41,\r\n0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0e,0x29,0x27,0x0a,0x13,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x01,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x01,0x9f,0x00,0xe6,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x77,0x28,0x26,0x0c,0x11,0x25,0x01,0x28,0x11,0x26,0x00,\r\n0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x01,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x44,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x4b,0x17,0x15,0x07,0x02,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xff,0xf4,0x02,0x08,0x06,0x01,0x02,0x26,\r\n0x01,0xc9,0x00,0x00,0x01,0x06,0x01,0x9f,0xe1,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe7,0x40,0x09,0x0e,0x0d,0x05,0x06,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0f,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x01,0xa0,0x01,0x07,0x00,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,\r\n0xb8,0xff,0xd8,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0x02,0x00,0xa7,0xfe,0x1f,0x04,0x15,0x05,0xfc,0x00,0x14,0x00,0x25,0x00,0xc7,0xb5,0x02,0x1c,0x01,0x10,0x04,0x0f,0xb8,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x07,0xb8,0xff,0xe8,0x40,0x3e,0x0b,\r\n0x00,0x4d,0x0d,0x15,0x16,0x16,0x15,0x96,0x59,0x16,0x16,0x06,0x13,0x06,0x1b,0x95,0x59,0x06,0x01,0x00,0x1f,0x21,0x13,0x21,0x95,0x59,0x13,0x16,0x01,0x1c,0x0c,0x15,0x15,0x01,0x09,0x08,0x0c,0x06,0x4d,0x19,0x84,0x09,0x09,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x83,0x24,0xb8,0xff,0xf0,\r\n0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x24,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x24,0x24,0x27,0x1f,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x02,0xb8,0xff,0xfa,0x40,0x09,0x0c,0x06,0x4d,0x02,0x0a,0x0b,0x06,0x4d,0x02,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,\r\n0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0xe1,0x2b,0x11,0x39,0x2f,0x39,0x00,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x01,0x5f,0x5e,0x5d,0x25,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,\r\n0x16,0x15,0x14,0x06,0x23,0x22,0x13,0x35,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x11,0x16,0x33,0x32,0x36,0x35,0x10,0x01,0x49,0xa2,0xdc,0xb9,0xad,0xc7,0x99,0x7a,0xb5,0xc3,0xf2,0xc5,0x98,0x2b,0x7b,0x9f,0xd2,0x74,0x7c,0x8c,0x86,0x81,0x91,0x2e,0xfd,0xf1,0x06,0x3c,0xbf,0xe2,0xb5,0xa0,0x78,0xd1,0x27,0x04,0x1d,0xd7,0xa6,0xc1,\r\n0xf1,0x02,0xfe,0x83,0x11,0xad,0x6d,0xdd,0x9a,0x8c,0xfc,0x80,0x57,0x95,0x86,0x01,0x2f,0x00,0x00,0x01,0x00,0x05,0xfe,0x1f,0x03,0xe6,0x04,0x00,0x00,0x18,0x00,0x95,0xb3,0x7c,0x00,0x01,0x0c,0xb8,0xff,0xc0,0x40,0x1c,0x0b,0x0c,0x00,0x4c,0x00,0x05,0x0b,0x03,0x03,0x11,0x08,0x0f,0x03,0x1c,0x11,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,\r\n0x0b,0x06,0x4d,0x14,0x83,0x0f,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xe8,0x40,0x20,0x0b,0x06,0x4d,0x0f,0x0f,0x1a,0x05,0x09,0x08,0x08,0x19,0x0b,0x00,0x03,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x84,0x05,0x18,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,\r\n0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x05,0x05,0x1a,0x19,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0xc6,0x12,0x39,0x12,0x39,0x2f,0xcd,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0xc6,0x00,0x3f,0x3f,0xc4,0x12,0x17,0x39,0x31,0x30,0x2b,0x5d,0x05,0x10,0x07,0x23,0x36,0x11,0x26,0x02,0x27,0x33,0x12,\r\n0x13,0x33,0x36,0x12,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x02,0x06,0x07,0x02,0x37,0x04,0xaf,0x0f,0x28,0xec,0x7a,0xbc,0xf9,0x5e,0x04,0xa6,0x7d,0x0a,0xab,0x06,0x3c,0x7f,0x31,0x45,0xfe,0xc0,0x5c,0xa9,0x01,0x46,0xd7,0x02,0x59,0xc2,0xfe,0x44,0xfe,0x4b,0xf4,0x01,0x57,0xa4,0x3e,0x44,0x35,0x20,0x86,0xfe,0xfe,0xfd,0x47,0x00,0x01,\r\n0x00,0x4c,0xfe,0xcb,0x03,0x7f,0x05,0xec,0x00,0x17,0x00,0x69,0x40,0x41,0x0f,0x10,0x01,0x0f,0x07,0x01,0x10,0x06,0x13,0x06,0x0f,0x0b,0x0e,0x0b,0x96,0x59,0x0e,0x00,0x00,0x0c,0x0c,0x08,0x0b,0x0e,0x0e,0x16,0x01,0x16,0xed,0x03,0x03,0x19,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x11,0x83,0x08,\r\n0x18,0x0d,0x06,0x4d,0x08,0x20,0x0c,0x06,0x4d,0x08,0x18,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0xc6,0x10,0xc0,0x2f,0x32,0x12,0x39,0x2f,0x00,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x24,0x11,0x10,0x01,\r\n0x35,0x21,0x35,0x21,0x15,0x00,0x11,0x14,0x05,0x16,0x16,0x15,0x14,0x03,0x39,0xb3,0x62,0x7d,0x8a,0xfe,0x6b,0x02,0x54,0xfe,0x4c,0x02,0x5b,0xfd,0xaf,0x01,0x20,0xd3,0x96,0xfe,0xcb,0x4f,0x4d,0x44,0x3f,0x12,0x32,0x01,0x95,0x01,0xb2,0x01,0xee,0x04,0x85,0x87,0xfd,0xfb,0xfe,0x66,0xfa,0x2f,0x23,0x8b,0x6f,0x64,0x00,0x01,0x00,0x82,\r\n0xfe,0x6c,0x03,0xf8,0x04,0x18,0x00,0x14,0x00,0x7f,0x40,0x2a,0x02,0x13,0x01,0x02,0x13,0x01,0x10,0x04,0x10,0x04,0x12,0x04,0xec,0x59,0x12,0x10,0x0c,0x0f,0x08,0x15,0x00,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x83,0x7f,0x01,0x01,0x01,0xb8,0xff,0xfc,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,\r\n0xfa,0x40,0x22,0x0c,0x06,0x4d,0x01,0x01,0x16,0x0c,0x0f,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x09,0x04,0x0d,0x06,0x4d,0x09,0x2f,0x16,0x01,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x3f,0x3f,0x2b,0x11,0x00,\r\n0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa6,0xec,0x7c,0xa1,0xa3,0x24,0xa8,0x1c,0x04,0x6f,0xe5,0x01,0x5a,0xfe,0x6c,0x03,0xd0,0x01,0x47,0xb1,0x87,0xfd,0xb5,0x02,0xb6,0xea,0x60,0x4a,0x63,0xc5,0xfe,0x5e,\r\n0x00,0x03,0x00,0x61,0xff,0xe8,0x04,0x50,0x05,0xfe,0x00,0x0a,0x00,0x10,0x00,0x17,0x00,0xc7,0x40,0x10,0x09,0x16,0x01,0x06,0x14,0x01,0x03,0x00,0x0e,0x01,0x0f,0x0a,0x01,0x10,0x06,0x09,0xb8,0xff,0xe8,0xb3,0x0c,0x00,0x4d,0x15,0xb8,0xff,0xe8,0x40,0x33,0x0b,0x0c,0x00,0x4c,0x0d,0x18,0x0c,0x00,0x4d,0x0b,0x11,0x96,0x59,0x0b,0x06,\r\n0x00,0x0b,0x96,0x2b,0x30,0x06,0x0d,0x95,0x59,0x06,0x01,0x00,0x15,0x95,0x59,0x00,0x16,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x83,0x0b,0x11,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf0,0x40,0x30,0x0b,0x06,0x4d,0x20,0x11,0x30,0x11,\r\n0x02,0x11,0x11,0x19,0x10,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x00,\r\n0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x2b,0x00,0x18,0x2f,0x2b,0x00,0x2b,0x2b,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x05,0x22,0x00,0x11,0x10,0x00,0x33,0x20,0x11,0x10,0x00,0x13,0x02,0x21,0x22,0x02,0x07,0x05,0x21,0x12,0x12,0x33,0x32,0x12,0x02,0x4e,0xe9,0xfe,0xfc,0x01,0x0f,0xfe,0x01,0xe2,0xfe,0xf3,0x63,0x12,0xfe,\r\n0xc9,0x96,0xb4,0x0a,0x02,0x9e,0xfd,0x61,0x05,0xb2,0x9d,0x99,0xad,0x18,0x01,0x92,0x01,0x6c,0x01,0x7f,0x01,0x99,0xfd,0x01,0xfe,0x86,0xfe,0x63,0x03,0x5c,0x02,0x2e,0xfe,0xd1,0xff,0x84,0xfe,0xe1,0xfe,0xd3,0x01,0x31,0x00,0x01,0x00,0xa6,0xff,0xf4,0x02,0x08,0x04,0x00,0x00,0x0b,0x00,0x49,0x40,0x32,0x03,0x40,0x0b,0x0c,0x00,0x4c,\r\n0x05,0x0f,0x0b,0x09,0x02,0x09,0xec,0x59,0x02,0x0b,0x0b,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x84,0x04,0x0c,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x31,0x30,\r\n0x2b,0x25,0x06,0x23,0x22,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x08,0x3e,0x3b,0xe9,0xa3,0x65,0x2a,0x30,0x0a,0x16,0x01,0x15,0x02,0xf7,0xfd,0x0e,0x8a,0x12,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x13,0x04,0x0e,0x00,0x14,0x00,0xa1,0x40,0x15,0x09,0x03,0x01,0x0d,0x02,0x01,0x06,0x13,0x01,0x0d,0x01,0x01,0x10,0x04,0x03,0x18,\r\n0x0b,0x0c,0x00,0x4c,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x15,0x0b,0x06,0x4d,0x14,0x02,0x11,0x03,0x03,0x00,0x06,0x0c,0x11,0xec,0x59,0x0c,0x06,0x0f,0x04,0x00,0x15,0x14,0xb8,0xff,0xe0,0x40,0x21,0x0b,0x0c,0x00,0x4c,0x14,0x02,0x02,0x00,0x0e,0x0e,0x70,0x00,0x01,0x00,0x08,0x04,0x08,0x0d,0x06,0x4d,\r\n0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0xb8,0xff,0xfa,0x40,0x0e,0x0d,0x06,0x4d,0x05,0x06,0x0c,0x06,0x4d,0x05,0x06,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0x5d,0x33,0x2f,0x11,0x39,0x2f,0x33,0x2b,0x00,0x3f,0x33,0x3f,0xc4,0x2b,0x11,0x12,0x00,0x39,0x11,0x12,0x39,0x39,\r\n0x31,0x30,0x01,0x2b,0x2b,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x21,0x23,0x01,0x07,0x11,0x23,0x11,0x33,0x11,0x01,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x04,0x13,0xcb,0xfe,0x8e,0x8d,0xa3,0xa3,0x01,0x13,0x75,0x71,0x2e,0x48,0x22,0x1e,0x32,0x42,0x90,0x73,0x01,0xf4,0x98,0xfe,0xa4,0x04,0x00,0xfe,\r\n0x0e,0x01,0x38,0x85,0x43,0x07,0x91,0x08,0x9c,0x7d,0x00,0x01,0xff,0xfe,0x00,0x00,0x03,0xdf,0x05,0xee,0x00,0x10,0x00,0x5b,0x40,0x23,0x0b,0x02,0x01,0x07,0x10,0x01,0x08,0x05,0x01,0x06,0x03,0x01,0x03,0x0f,0x01,0x01,0x10,0x06,0x02,0x05,0x05,0x00,0x0d,0x0a,0x08,0x0d,0x08,0xec,0x59,0x0d,0x00,0x03,0x00,0x15,0x10,0xb8,0xff,0xe0,\r\n0x40,0x0e,0x0c,0x00,0x4d,0x0a,0x02,0x05,0x0a,0x10,0x04,0x11,0x00,0x00,0x12,0x04,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5f,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x01,0x01,0x23,0x01,0x27,0x26,0x23,0x22,0x07,0x35,0x36,\r\n0x33,0x32,0x16,0x17,0x03,0xdf,0xb1,0xfe,0xe9,0xfe,0x9c,0xb5,0x01,0xcf,0x43,0x35,0x67,0x36,0x44,0x40,0x42,0x70,0x8b,0x3e,0x03,0x3b,0xfc,0xc5,0x03,0xf8,0xc5,0x9b,0x13,0x9d,0x0c,0x7f,0xb2,0x00,0x00,0x01,0x00,0xa7,0xfe,0x1f,0x04,0x78,0x04,0x00,0x00,0x1d,0x00,0x9f,0x40,0x6e,0x0f,0x03,0x01,0x10,0x05,0x0e,0x18,0x0b,0x0c,0x00,\r\n0x4c,0x01,0x18,0x0b,0x0c,0x00,0x4c,0x11,0x08,0x0f,0x04,0x00,0x0d,0x02,0x0d,0x95,0x59,0x02,0x16,0x1a,0x15,0x95,0x59,0x1a,0x16,0x07,0x1c,0x17,0x17,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x84,0x00,0x7f,0x10,0x01,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,\r\n0x4d,0x10,0x10,0x1f,0x07,0x0a,0x0a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0x04,0x0d,0x06,0x4d,0x07,0x40,0x1f,0x01,0x2f,0x1f,0x01,0x5d,0x5d,0x2f,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0x33,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x3f,0x3f,\r\n0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0xc4,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x25,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x03,0x48,0x58,0xc7,0x9b,0x40,0x04,0xa3,0xa3,0x83,0x6c,0x74,0x86,0xa3,0x7a,\r\n0x17,0x11,0x35,0x2a,0x55,0x60,0x16,0xae,0xc6,0x7c,0xfd,0xbb,0x05,0xe1,0xfd,0x90,0x7a,0x9a,0xb0,0x8c,0x02,0x48,0xfd,0x2f,0xa6,0x05,0x89,0x0d,0x58,0x5e,0x00,0x01,0x00,0x0c,0x00,0x00,0x03,0xc6,0x04,0x00,0x00,0x0c,0x00,0x6b,0x40,0x0a,0x74,0x03,0x01,0x79,0x01,0x01,0x76,0x00,0x01,0x03,0xb8,0xff,0xf8,0x40,0x0c,0x0c,0x00,0x4d,\r\n0x03,0x09,0x0f,0x04,0x00,0x15,0x08,0x08,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x06,0x83,0x0b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x0d,0x0b,0x06,0x4d,0x0b,0x0b,0x0e,0x03,0x08,0x0b,0x06,0x4d,0x03,0x02,0x2f,0x33,0x2b,\r\n0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x00,0x3f,0x33,0x3f,0x33,0x31,0x30,0x01,0x2b,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x33,0x01,0x00,0x11,0x34,0x27,0x33,0x16,0x15,0x10,0x02,0x48,0xa4,0xfe,0x68,0xb5,0x01,0x4f,0x01,0x10,0x22,0xb1,0x17,0x04,0x00,0xfc,0x9c,0x01,0x57,0x01,0x3b,0x7a,0x58,0x46,0x74,0xfe,0x86,0x00,\r\n0x00,0x01,0x00,0x4d,0xfe,0xc4,0x03,0x76,0x05,0xed,0x00,0x2f,0x00,0xb3,0x40,0x28,0x0f,0x08,0x01,0x10,0x05,0x28,0x18,0x0b,0x0c,0x00,0x4c,0x0b,0x18,0x0b,0x0c,0x00,0x4c,0x0c,0x26,0x1f,0x1f,0x26,0x95,0x59,0x1f,0x1f,0x16,0x06,0x18,0x15,0x13,0x16,0x15,0x16,0x15,0x95,0x59,0x16,0x00,0x2b,0xb8,0xff,0xf0,0x40,0x1e,0x0f,0x16,0x48,\r\n0x2b,0x06,0x15,0x00,0x0c,0x23,0x12,0x18,0x15,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x83,0x0f,0x0f,0x09,0x23,0x18,0x18,0x2e,0x01,0x2e,0x84,0x03,0xb8,0xff,0xf8,0x40,0x27,0x0c,0x06,0x4d,0x03,0x03,0x31,0x29,0x08,0x0d,0x06,0x4d,0x29,0x08,0x0c,0x06,0x4d,0x29,0x08,0x0b,0x06,0x4d,0x29,0x83,0x09,0x18,0x0d,0x06,0x4d,0x09,0x20,0x0c,0x06,\r\n0x4d,0x09,0x20,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0xe1,0xc6,0x10,0xc0,0x2f,0xc6,0x12,0x39,0x2f,0xe1,0x2b,0xc6,0x12,0x39,0x12,0x39,0x00,0x2f,0x3f,0x33,0x2b,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x10,0xc4,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,\r\n0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x04,0x23,0x35,0x21,0x15,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x36,0x33,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x05,0x16,0x16,0x15,0x14,0x03,0x30,0xb3,0x61,0x5d,0xa2,0xc1,0xd1,0xa3,0x96,0x6b,0x73,0xc0,0xa4,0xfe,\r\n0xc0,0x26,0x02,0x5e,0xc7,0xee,0x58,0x89,0x2d,0x17,0x32,0x31,0x1d,0x30,0x41,0xaa,0xe3,0x01,0x1c,0xc9,0x9b,0xfe,0xc4,0x4e,0x53,0x3b,0x49,0x14,0x19,0xd7,0xad,0x84,0xce,0x37,0x1d,0x83,0x59,0x70,0xb2,0x27,0x07,0x05,0x86,0x89,0x1f,0xa5,0x73,0x47,0x62,0x28,0x03,0x03,0x96,0x03,0xa1,0x87,0xdb,0x2d,0x20,0x8b,0x76,0x69,0xff,0xff,\r\n0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,0x00,0x02,0x00,0xa1,0xfe,0x74,0x04,0x50,0x04,0x18,0x00,0x0e,0x00,0x1a,0x00,0x83,0x40,0x27,0x0f,0x06,0x01,0x10,0x06,0x07,0x17,0x95,0x59,0x07,0x10,0x0f,0x00,0x12,0x0d,0x12,0x95,0x59,0x0d,0x16,0x02,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,\r\n0x08,0x0b,0x06,0x4d,0x0a,0x83,0x14,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x14,0xb8,0xff,0xe8,0x40,0x19,0x0b,0x06,0x4d,0x14,0x14,0x1c,0x0f,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xfc,0x40,0x0c,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x2f,0x1c,0x01,0x5d,0x2f,\r\n0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x2f,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x25,0x23,0x11,0x23,0x11,0x34,0x12,0x33,0x32,0x00,0x15,0x10,0x02,0x23,0x22,0x03,0x16,0x16,0x33,0x20,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x48,0x04,0xa3,\r\n0xe6,0xde,0xdf,0x01,0x0c,0xf7,0xdd,0xc1,0x77,0x27,0xa4,0x59,0x01,0x3e,0xb2,0x8c,0x8f,0x95,0x63,0xfe,0x11,0x03,0x9a,0xf7,0x01,0x13,0xfe,0xda,0xe1,0xfe,0xfb,0xfe,0xdc,0x01,0x1b,0x3e,0x51,0x01,0x94,0xaa,0xda,0xc6,0xba,0x00,0x00,0x01,0x00,0x57,0xfe,0xc4,0x03,0x81,0x04,0x19,0x00,0x1c,0x00,0x8f,0x40,0x14,0x0f,0x07,0x01,0x10,\r\n0x04,0x13,0x30,0x0b,0x0c,0x00,0x4c,0x0f,0x11,0x0c,0x11,0x95,0x59,0x0c,0x10,0x18,0xb8,0xff,0xf0,0x40,0x0a,0x10,0x16,0x48,0x18,0x06,0x15,0x00,0x01,0x01,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x37,0x0c,0x06,0x4d,0x03,0xef,0x1b,0x10,0x0d,0x06,0x4d,0x1b,0x10,0x0c,0x06,0x4d,0x1b,0x0e,0x0e,0x1e,0x14,\r\n0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x83,0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,0x18,0x0b,0x06,0x4d,0x2f,0x09,0x01,0x09,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xd4,0x2b,0x2b,0xf1,0x2b,0x2b,0xc2,0x2f,0x00,0x2f,0x3f,0x33,0x2b,0x3f,0x2b,0x00,0x18,\r\n0x10,0xc6,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x10,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x15,0x14,0x1e,0x02,0x05,0x16,0x15,0x14,0x03,0x3b,0xb5,0x62,0x7b,0x84,0xc2,0xd0,0x01,0x2f,0xec,0x7f,0x65,0x72,0x81,0x99,0xc9,0x2e,0x58,0x3b,0x01,0x19,0xa6,0xfe,0xc4,0x4c,0x58,\r\n0x46,0x3f,0x11,0x19,0xe6,0xb2,0x01,0x18,0x01,0x52,0x34,0xa7,0x4f,0xfe,0xfa,0xc5,0x47,0x6c,0x45,0x12,0x4b,0x3e,0xb1,0x69,0x00,0x01,0x00,0x14,0xff,0xe6,0x04,0x0e,0x04,0x07,0x00,0x1c,0x00,0xa4,0xb7,0x0a,0x1a,0x01,0x05,0x09,0x01,0x10,0x09,0xb8,0xff,0xe0,0x40,0x2d,0x0b,0x0c,0x00,0x4c,0x13,0x0f,0x0f,0x03,0x01,0x16,0x03,0x03,\r\n0x40,0x24,0x28,0x48,0x03,0x40,0x08,0x0f,0x19,0x0e,0xec,0x59,0x19,0x16,0x13,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x84,0x11,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x11,0xb8,0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x11,0x11,0x1e,0x05,0x0c,0x08,0x0d,\r\n0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x1c,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x1c,0xb8,0xff,0xfa,0xb6,0x0b,0x06,0x4d,0x1c,0x2f,0x1e,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x1a,0xcd,0x2b,0x5f,\r\n0x5e,0x5d,0x3f,0x31,0x30,0x2b,0x01,0x5e,0x5d,0x5d,0x13,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x10,0x03,0x33,0x16,0x11,0x14,0x02,0x23,0x22,0x26,0x35,0xae,0x29,0x38,0x1a,0x1f,0x30,0x2f,0x7c,0x61,0x01,0x0d,0x7f,0x8d,0x93,0xb7,0x81,0xe8,0xc9,0xd0,0xdf,0x02,0xc7,0x5b,0x55,0x07,\r\n0x8a,0x0d,0x94,0xa5,0xfe,0xff,0xfe,0xab,0xb1,0xa1,0x01,0x2b,0x01,0x0b,0xfa,0xfe,0xcb,0xe3,0xfe,0xf8,0xec,0xde,0x00,0x01,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x00,0x1d,0x00,0x8c,0xb9,0x00,0x13,0xff,0xe8,0x40,0x4e,0x0b,0x0c,0x00,0x4c,0x09,0x08,0x10,0x00,0x4d,0x03,0x18,0x0b,0x0c,0x00,0x4c,0x18,0x18,0x19,0x06,0x06,0x05,\r\n0x07,0x17,0x07,0x15,0x15,0x14,0x09,0x09,0x0a,0x08,0x16,0x08,0x0d,0x16,0x01,0x02,0x07,0x01,0x10,0x04,0x0e,0x0c,0x11,0x0c,0xec,0x59,0x11,0x10,0x17,0x0f,0x1d,0x1b,0x02,0x1b,0xec,0x59,0x02,0x1c,0x08,0x1b,0x19,0x05,0x14,0x0a,0x05,0x0a,0x0e,0x16,0x17,0x17,0x00,0x00,0x1f,0x0e,0x07,0x0e,0x08,0x2f,0x33,0x33,0x2f,0x11,0x33,0x2f,\r\n0x32,0x2f,0x33,0x11,0x39,0x39,0x11,0x33,0x11,0x33,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x2b,0x2b,0x2b,0x01,0x06,0x23,0x22,0x26,0x27,0x03,0x01,0x23,0x01,0x03,0x26,0x23,0x22,0x07,0x35,\r\n0x36,0x33,0x32,0x16,0x17,0x13,0x01,0x33,0x01,0x13,0x16,0x33,0x32,0x37,0x04,0x46,0x2b,0x31,0x5a,0x82,0x4b,0x9f,0xfe,0xa1,0xb9,0x01,0xc6,0xae,0x42,0x48,0x30,0x28,0x22,0x49,0x56,0x6b,0x33,0x8c,0x01,0x11,0xb9,0xfe,0x89,0xec,0x44,0x48,0x25,0x29,0xfe,0x2a,0x09,0x86,0xac,0x01,0x6b,0xfd,0x6f,0x03,0x38,0x01,0x89,0x94,0x0e,0x9a,\r\n0x0a,0x5c,0x78,0xfe,0xb6,0x02,0x06,0xfd,0x58,0xfd,0xf4,0x96,0x10,0x00,0x00,0x01,0x00,0x98,0xfe,0x1e,0x05,0x68,0x05,0x33,0x00,0x1b,0x00,0xec,0xb9,0x00,0x18,0xff,0xc0,0xb4,0x0b,0x0c,0x00,0x4c,0x0f,0xb8,0xff,0xc0,0x40,0x15,0x0b,0x0c,0x00,0x4c,0x0d,0x1b,0x0f,0x14,0x12,0x07,0x04,0x15,0x04,0x15,0xec,0x59,0x04,0x16,0x05,0x1c,\r\n0x1a,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1a,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1a,0x83,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf0,0x40,0x40,0x0b,0x06,0x4d,0x1b,0x0e,0x04,0x07,0x0c,0x42,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,\r\n0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x0c,0x1c,0x15,0x12,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x18,0x0b,0x06,0x4d,0x04,0xef,0x07,0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x07,\r\n0xb8,0xff,0xfc,0x40,0x0d,0x0b,0x06,0x4d,0x07,0x07,0x1d,0x1c,0x40,0x1d,0x01,0x2f,0x1d,0x01,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,\r\n0x18,0x2f,0x3f,0x33,0x31,0x30,0x2b,0x2b,0x01,0x10,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x00,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x05,0x68,0xfe,0xe3,0xe9,0x18,0x94,0x18,0xeb,0xfe,0xe5,0xa6,0xc8,0x98,0x18,0x94,0x18,0x96,0xca,0xa6,0x02,0x2c,0xfe,0xf4,0xfe,0xc9,0xfe,0x35,\r\n0x01,0xcb,0x01,0x36,0x01,0x0d,0x01,0xd4,0xfe,0x2c,0xc4,0xef,0x04,0xba,0xfb,0x46,0xee,0xc5,0x01,0xd4,0x00,0x01,0x00,0x77,0xff,0xe9,0x06,0x00,0x04,0x00,0x00,0x21,0x00,0xe3,0x40,0x2a,0x0b,0x21,0x01,0x04,0x1f,0x01,0x0b,0x04,0x01,0x04,0x02,0x01,0x0d,0x00,0x01,0x10,0x04,0x12,0x12,0x20,0x09,0x1b,0x0f,0x00,0x0e,0x03,0x20,0x15,\r\n0x20,0x15,0xec,0x59,0x20,0x16,0x0d,0x1a,0x01,0x09,0x03,0x1a,0x1a,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x18,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x18,0x83,0x1d,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1d,0xb8,0xff,0xe8,0x40,0x4f,0x0b,0x06,0x4d,0x1d,0x0e,0x12,0x11,0x06,0x42,0x02,0x09,\r\n0x01,0x09,0x09,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x83,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x18,0x0b,0x06,0x4d,0x06,0x06,0x22,0x00,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x84,0x11,0x06,0x0c,0x06,0x4d,0x11,0x11,0x23,\r\n0x22,0x3f,0x23,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x5d,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc2,0x18,0x2f,0x5f,0x5e,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x33,0x18,0x3f,0xc4,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x31,0x30,\r\n0x01,0x5d,0x5d,0x5d,0x5d,0x25,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x13,0x33,0x02,0x15,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x34,0x03,0x33,0x12,0x11,0x14,0x06,0x23,0x22,0x03,0x3d,0x04,0x67,0xca,0xbd,0xd4,0x7e,0xb7,0x8f,0x7a,0x6d,0xe6,0xa4,0xe5,0x6b,0x7b,0x8e,0xb6,0x7f,0xd5,0xbf,0xca,0xa8,0xbf,\r\n0xff,0xe0,0x01,0x02,0x01,0x36,0xfe,0xc1,0xff,0x9f,0xaa,0x01,0x5a,0x01,0x1b,0xfe,0xe5,0xfe,0xa6,0xaa,0x9f,0xff,0x01,0x3f,0xfe,0xc9,0xfe,0xff,0xe1,0xfe,0xff,0xff,0xff,0xed,0xff,0xf4,0x02,0x34,0x05,0x77,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x70,0xff,0xf0,0x00,0x17,0x40,0x0d,0x02,0x01,0x19,0x1b,0x15,0x05,\r\n0x06,0x3e,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x77,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x96,0xff,0xf0,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd8,0x40,0x0a,0x2c,0x26,0x00,0x16,0x25,0x02,0x01,0x29,0x11,0x26,0x00,0x2b,0x35,0x35,\r\n0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x01,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x28,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf6,0x40,0x09,0x19,0x19,0x0c,0x0c,0x3e,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x01,0x02,0x26,\r\n0x01,0xd2,0x00,0x00,0x01,0x07,0x01,0x9f,0x01,0x0f,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x05,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xe9,0x06,0x00,0x06,0x01,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x01,0x9f,0x02,0x02,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1b,\r\n0x24,0x22,0x06,0x1d,0x25,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x06,0xe3,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x8b,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x21,0x0f,0x02,0x03,0x3e,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,\r\n0x35,0x00,0x00,0x01,0x00,0x29,0xff,0xee,0x05,0x1e,0x05,0x9a,0x00,0x1b,0x00,0xb6,0x40,0x2f,0x00,0x16,0x01,0x10,0x05,0x13,0x0a,0x91,0x59,0x13,0x13,0x10,0x0b,0x0d,0x11,0x10,0x11,0x91,0x59,0x10,0x03,0x01,0x03,0x1a,0x03,0x91,0x59,0x1a,0x13,0x0b,0x12,0x00,0x00,0x0b,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,0x0c,0x06,0x4d,0x17,0x7d,\r\n0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,0x06,0x06,0x1d,0x13,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x7e,0x0c,0x11,0x11,0x1d,0x0e,0xb8,0xff,0xe8,0x40,0x0a,0x0d,0x06,0x4d,0x0e,0x0c,0x20,0x0d,0x06,\r\n0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0c,0xb8,0xff,0xf0,0xb3,0x0b,0x06,0x4d,0x0c,0x2f,0x2b,0x2b,0x2b,0xc6,0x2b,0x12,0x39,0x2f,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x2b,\r\n0x31,0x30,0x00,0x5f,0x5e,0x5d,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x04,0x15,0x14,0x06,0x23,0x22,0x02,0xfe,0x42,0x5e,0x61,0x73,0xa9,0x98,0xf9,0xa8,0xfe,0x99,0x03,0xe3,0xfe,0x2c,0xfd,0xe2,0x01,0x07,0xc7,0xb5,0x5c,0x06,0x9a,0x21,0x8b,0x77,0x8b,0x9a,\r\n0xfd,0x5a,0x05,0x02,0x98,0x98,0xfe,0x38,0xe6,0xd1,0xc0,0xd5,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x07,0x66,0x02,0x26,0x01,0x2c,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x50,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x15,0x08,0x06,0x01,0x05,0x3e,0x01,0x00,0x08,0x01,0x08,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,\r\n0x00,0x5e,0xff,0xe8,0x04,0x85,0x05,0xb2,0x00,0x18,0x00,0x97,0x40,0x5f,0x55,0x0a,0x01,0x59,0x00,0x01,0x5a,0x03,0x01,0x03,0x0f,0x03,0x01,0x0b,0x05,0x10,0x13,0x91,0x59,0x10,0x08,0x02,0x10,0x91,0x2b,0x30,0x00,0x0b,0x01,0x0c,0x03,0x0b,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x04,0x00,0x18,0x01,0x0b,0x03,0x18,0x18,0x16,0x02,0x16,\r\n0x91,0x59,0x02,0x13,0x11,0x11,0x13,0x00,0x0a,0x0a,0x1a,0x10,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x7d,0x05,0x10,0x0d,0x06,0x4d,0x05,0x18,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x00,0x3f,0x2b,\r\n0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x01,0x5f,0x5d,0x00,0x5d,0x5d,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x15,0x21,0x16,0x00,0x33,0x32,0x37,0x04,0x85,0x9e,0xeb,\r\n0xfe,0xd1,0xfe,0x91,0x01,0x85,0x01,0x35,0xd6,0x97,0xa3,0xcc,0xd7,0xfe,0xeb,0x18,0x02,0x7a,0xfd,0x84,0x10,0x01,0x11,0xd7,0xe0,0x9d,0x3c,0x54,0x01,0x8b,0x01,0x3f,0x01,0x5b,0x01,0xa5,0x3b,0xb3,0x56,0xfe,0xed,0xf1,0x97,0xef,0xfe,0xef,0x60,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x05,0xb2,0x02,0x06,0x00,0x36,0x00,0x00,\r\n0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x38,0x06,0xe3,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x74,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x04,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x02,0x00,0x10,0xff,0xe9,0x07,0x77,0x05,0x9a,0x00,0x19,0x00,0x21,\r\n0x00,0xc0,0x40,0x49,0x0d,0x05,0x01,0x00,0x03,0x01,0x0b,0x17,0x01,0x0b,0x16,0x01,0x02,0x0d,0x01,0x10,0x04,0x12,0x14,0x0f,0x14,0x91,0x59,0x0f,0x13,0x00,0x1a,0x91,0x59,0x00,0x00,0x18,0x1b,0x18,0x0a,0x91,0x59,0x18,0x03,0x08,0x1b,0x91,0x59,0x08,0x12,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x18,0x18,0x08,0x11,0x04,0x08,0x0d,0x06,0x4d,\r\n0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7d,0x1f,0xb8,0xff,0xf0,0x40,0x23,0x0d,0x06,0x4d,0x1f,0x10,0x0b,0x06,0x4d,0x1f,0x1f,0x23,0x00,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x7e,0x08,0x18,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x0c,0x0c,0x06,0x4d,0x08,0x18,0x0b,\r\n0x06,0x4d,0x08,0x08,0x23,0x11,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x00,\r\n0x5d,0x5d,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x02,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x11,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x04,0xa4,0x01,0x10,0xd7,0xec,0xf8,0xd9,0xfe,0x56,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0xeb,\r\n0x96,0xa2,0xfe,0xc8,0x03,0x39,0xce,0xbf,0xc4,0xe8,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0xfd,0x08,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x7d,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0xb7,0x40,0x2f,0x0d,0x10,0x01,0x00,0x0e,0x01,0x10,0x04,0x13,0x0b,0x01,0x08,\r\n0x08,0x01,0x91,0x59,0x08,0x08,0x14,0x06,0x0a,0x03,0x00,0x14,0x91,0x59,0x03,0x00,0x12,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x18,0xb8,0xff,0xe8,0x40,0x3e,0x0d,0x06,0x4d,0x18,0x10,0x0b,0x06,0x4d,0x18,0x18,0x1c,0x0b,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,\r\n0x08,0x0b,0x06,0x4d,0x14,0x7e,0x00,0x20,0x0d,0x06,0x4d,0x00,0x18,0x0b,0x06,0x4d,0x00,0x00,0x1c,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x7e,0x04,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,\r\n0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0xc4,0x2b,0x00,0x18,0x3f,0xc4,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,\r\n0x36,0x35,0x10,0x21,0x04,0x02,0xfd,0x62,0xa8,0xa8,0x02,0x9e,0xa8,0x01,0x10,0xd5,0xee,0xf9,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x02,0xa0,0xfd,0x60,0x05,0x9a,0xfd,0x9e,0x02,0x62,0xfd,0xa0,0xce,0xc0,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0x4a,0x05,0x9a,0x00,0x11,0x00,0xc6,\r\n0x40,0x1c,0x02,0x10,0x01,0x02,0x10,0x01,0x10,0x04,0x0e,0x05,0x91,0x59,0x0e,0x0e,0x00,0x0b,0x08,0x0c,0x0b,0x0c,0x91,0x59,0x0b,0x03,0x06,0x00,0x12,0x0c,0xb8,0xff,0xf9,0xb3,0x0b,0x06,0x4d,0x09,0xb8,0xff,0xf9,0x40,0x15,0x0b,0x06,0x4d,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,\r\n0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x32,0x0b,0x06,0x4d,0x00,0x01,0x01,0x09,0x03,0x01,0x01,0x13,0x07,0x0c,0x0e,0x0e,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0x07,0x09,0x42,0x09,0x09,0x12,0x07,0x12,0x0d,0x06,\r\n0x4d,0x07,0x0d,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x01,0x10,0xf1,0x2b,0x2b,0x2b,0x32,0xe0,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xc4,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x2b,0x31,0x30,\r\n0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x21,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x20,0x11,0x05,0x4a,0xa8,0xfe,0xe3,0xfe,0xe9,0xa8,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x19,0x01,0xc3,0x01,0x85,0x01,0x27,0xfd,0x54,0x05,0x02,0x98,0x98,0xfe,0x3e,0xfe,0x45,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,\r\n0x07,0x66,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x8e,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x0f,0x12,0x12,0x09,0x0e,0x25,0x01,0x00,0x13,0x01,0x13,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x07,0x4f,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x07,0xcd,0x00,0x16,\r\n0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0d,0x1c,0x16,0x0d,0x00,0x25,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x04,0xf2,0x05,0x9a,0x00,0x0b,0x00,0xb2,0xb9,0x00,0x02,0x01,0x30,0x40,0x1b,0x07,0x0b,0x03,0x04,0x00,0x00,0x09,0x91,0x59,0x00,0x12,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,\r\n0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0xb8,0x01,0x2c,0xb6,0x04,0x04,0x10,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x08,0x09,0x04,0xb8,0x01,0x2c,0x40,0x1e,0xff,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x09,0x10,0x0d,0x06,0x4d,0x09,0x10,0x0c,0x06,0x4d,0x09,\r\n0xb8,0xff,0xf8,0x40,0x1b,0x0b,0x06,0x4d,0x7f,0x09,0x01,0x09,0x09,0x0d,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x05,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,\r\n0x2b,0x2b,0x2b,0x01,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x3f,0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xfe,0x30,0x9a,0xfe,0x34,0xa8,0x02,0xe6,0xa8,0xfe,0x80,0x01,0x80,0x05,0x9a,0xfa,0xfe,0x05,0x02,0x00,0xff,0xff,0x00,0x16,0x00,0x00,\r\n0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x9f,0x40,0x31,0x0d,0x0a,0x01,0x00,0x08,0x01,0x10,0x04,0x05,0x0d,0x91,0x59,0x05,0x05,0x0e,0x02,0x02,0x03,0x91,0x59,0x02,0x03,0x00,0x0e,0x91,0x59,0x00,0x12,0x03,0x03,0x0e,0x09,0x08,0x0d,0x06,0x4d,\r\n0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x7d,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x1e,0x0c,0x06,0x4d,0x12,0x10,0x0b,0x06,0x4d,0x12,0x12,0x16,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,\r\n0xb8,0xff,0xf6,0x40,0x09,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x33,0x11,0x21,0x15,0x21,0x11,0x21,\r\n0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x02,0xfe,0xfd,0xaa,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0x98,0xfe,0x38,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,\r\n0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x01,0x2c,0x00,0x00,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x05,0x9a,0x00,0x0d,0x00,0x13,0x00,0xcf,0xb7,0x0b,0x0f,0x91,0x59,0x0b,0x03,0x04,0x01,0xb8,0x01,0x30,0x40,0x22,0x0e,0x07,0x02,0x0c,0x02,0x0c,0x91,0x59,0x02,0x12,0x75,0x13,0x01,0x10,0x0a,0x0a,\r\n0x0e,0x07,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x18,0x0b,0x06,0x4d,0x0d,0xba,0x01,0x2c,0x00,0x02,0xff,0xee,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xe0,0x40,0x17,0x0b,0x06,0x4d,0x02,0x02,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,\r\n0x7e,0x0e,0xb8,0xff,0xf0,0x40,0x21,0x0d,0x06,0x4d,0x0e,0x18,0x0c,0x06,0x4d,0x0e,0x20,0x0b,0x06,0x4d,0x0e,0x0e,0x15,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,0x06,0xb8,0x01,0x2c,0xb2,0x03,0x13,0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x07,0x2f,\r\n0x2b,0x2b,0x33,0xd5,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x5d,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0xc4,0x3f,0x2b,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,0x11,0x33,0x21,\r\n0x11,0x21,0x06,0x02,0x07,0x05,0x48,0x9b,0xfb,0xfd,0x9b,0x6f,0x90,0xc9,0x0d,0x02,0xa3,0xc1,0xfe,0x97,0xfe,0x94,0x10,0xbc,0x73,0xfe,0x7f,0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x07,0x02,0xbf,0x01,0x3c,0xfa,0xfe,0x04,0x6a,0xf7,0xfd,0x6a,0xdd,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,0x00,0x28,0x00,0x00,\r\n0x00,0x01,0xff,0xea,0x00,0x00,0x07,0x02,0x05,0x9a,0x00,0x1d,0x00,0xb1,0xb9,0x00,0x1d,0xff,0xf0,0x40,0x72,0x0c,0x06,0x4d,0x0e,0x10,0x0c,0x06,0x4d,0x5c,0x1b,0x01,0x1a,0x1b,0x01,0x53,0x10,0x01,0x15,0x10,0x01,0x53,0x0c,0x01,0x05,0x0c,0x15,0x0c,0x02,0x5c,0x01,0x01,0x03,0x0d,0x01,0x1d,0x01,0x02,0x10,0x1a,0x01,0x10,0x11,0x01,\r\n0x0f,0x0b,0x1f,0x0b,0x02,0x0f,0x02,0x1f,0x02,0x02,0x0b,0x04,0x1b,0x10,0x16,0x03,0x0c,0x01,0x06,0x12,0x1d,0x00,0x06,0x0e,0x0d,0x07,0x1c,0x1c,0x00,0x20,0x0b,0x06,0x4d,0x00,0x0e,0x06,0x07,0x0d,0x42,0x0f,0x0d,0x0d,0x1e,0x16,0x15,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0x07,\r\n0x1f,0x1e,0x2f,0x1f,0x3f,0x1f,0x02,0x5d,0x11,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x11,0x33,0x2f,0xc6,0x2b,0x01,0x10,0xf0,0x2b,0xc2,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x31,0x30,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x2b,0x21,\r\n0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x07,0x02,0xe1,0xfd,0xcf,0x18,0x0d,0x05,0x9f,0x04,0x0f,0x16,0xfd,0xcf,0xe3,0x02,0x91,0xfd,0x9b,0xce,0x02,0x1a,0x16,0x0f,0x04,0x9f,0x05,0x0d,0x18,0x02,0x1a,0xcd,0xfd,0x9b,0x02,\r\n0x90,0x1c,0x16,0xfd,0x3e,0x02,0xc2,0x19,0x19,0xfd,0x70,0x02,0xe8,0x02,0xb2,0xfd,0x93,0x19,0x18,0x02,0x9e,0xfd,0x62,0x16,0x1b,0x02,0x6d,0xfd,0x4e,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x00,0x23,0x00,0xd7,0x40,0x13,0x09,0x20,0x01,0x06,0x1e,0x01,0x04,0x18,0x01,0x03,0x00,0x14,0x01,0x0f,0x00,0x01,0x10,0x05,\r\n0x14,0xb8,0xff,0xc0,0x40,0x3c,0x0c,0x00,0x4d,0x00,0x40,0x0c,0x00,0x4d,0x1c,0x09,0x0a,0x0a,0x09,0x92,0x59,0x0a,0x0a,0x03,0x16,0x0f,0x13,0x1f,0x13,0x2f,0x13,0x03,0x09,0x03,0x13,0x11,0x16,0x11,0x92,0x59,0x16,0x04,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x09,0x03,0x01,0x03,0x22,0x03,0x92,0x59,0x22,0x13,0x1b,0x1f,0x09,0x09,0x06,\r\n0x00,0x0e,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0e,0xb8,0xff,0xf8,0x40,0x19,0x0b,0x06,0x4d,0x0e,0x7d,0x19,0x19,0x1f,0x08,0x0d,0x06,0x4d,0x1f,0x08,0x0c,0x06,0x4d,0x1f,0x08,0x0b,0x06,0x4d,0x1f,0x7d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x0e,0x0b,0x06,0x4d,0x20,0x06,0x01,0x06,0x06,0x25,0x13,0x00,\r\n0x3f,0x25,0x01,0x5d,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5f,\r\n0x5d,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x60,0xa8,0xd5,0x9b,0xb7,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x9e,0xce,0xcc,0xea,0xfe,0xf0,0x94,0xae,0xfe,0xe8,\r\n0xf3,0xf3,0x3c,0xb6,0x7b,0x96,0x7f,0x01,0x14,0x8b,0x8a,0x7e,0x6c,0x82,0x71,0xaa,0x58,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xc5,0xe9,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x00,0x13,0x00,0xa1,0x40,0x12,0x7a,0x12,0x01,0x79,0x11,0x01,0x75,0x08,0x01,0x75,0x07,0x01,0x12,0x08,0x0b,0x00,0x4d,0x08,0xb8,0xff,\r\n0xf8,0x40,0x2c,0x0b,0x00,0x4d,0x0e,0x04,0x0b,0x13,0x03,0x09,0x00,0x12,0x12,0x04,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0x40,0x1a,0x0b,0x06,0x4d,0x01,0x01,0x15,0x08,0x0e,0x0c,0x08,0x0d,0x06,\r\n0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x09,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x09,0x04,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x39,0x33,0x00,0x3f,0x32,0x3f,0x33,\r\n0x39,0x39,0x31,0x30,0x01,0x2b,0x2b,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x14,0x07,0x33,0x36,0x37,0x01,0x33,0x05,0x40,0xa8,0x0a,0x06,0x13,0x1b,0xfd,0x1e,0xd0,0xa8,0x08,0x04,0x16,0x22,0x02,0xd0,0xd8,0x04,0x0c,0x8c,0x39,0x31,0x29,0xfb,0x89,0x05,0x9a,0xfc,0x0e,0xa2,0x31,0x2c,\r\n0x34,0x04,0x65,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x4e,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x07,0xcd,0x00,0xa8,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0a,0x1a,0x14,0x0a,0x13,0x25,0x01,0x17,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,\r\n0x00,0x00,0x00,0x01,0x00,0x10,0xff,0xe9,0x04,0xa4,0x05,0x9a,0x00,0x12,0x00,0x74,0x40,0x43,0x0d,0x10,0x01,0x0b,0x0f,0x01,0x02,0x06,0x01,0x10,0x04,0x07,0x18,0x0b,0x00,0x4d,0x12,0x02,0x91,0x59,0x12,0x03,0x0b,0x0d,0x08,0x0d,0x91,0x59,0x08,0x13,0x00,0x12,0x03,0x11,0x11,0x0b,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,\r\n0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x04,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0xb6,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0b,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x33,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x31,0x30,0x00,0x2b,0x01,0x5f,\r\n0x5e,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x02,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x04,0xa4,0xa8,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0x00,0xff,0xff,0x00,0xbc,\r\n0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xfc,0x05,0x9a,0x02,0x06,0x01,0xb5,0x00,0x00,0xff,0xff,0x00,0xbc,\r\n0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0xe7,0x04,0x96,0x05,0x9a,0x00,0x15,0x00,0x53,0x40,0x2e,0x0a,0x15,0x01,0x05,\r\n0x0e,0x01,0x03,0x03,0x10,0x0c,0x00,0x4d,0x00,0x10,0x01,0x10,0x05,0x10,0x0c,0x04,0x0e,0x00,0x03,0x07,0x09,0x04,0x09,0x91,0x59,0x04,0x13,0x76,0x11,0x01,0x11,0x0c,0x14,0x06,0x14,0x00,0x00,0x16,0x06,0x06,0x0e,0x0d,0x2f,0x33,0x33,0x2f,0x11,0x33,0x2f,0x32,0x11,0x12,0x39,0x39,0x5d,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x33,\r\n0x12,0x39,0x39,0x5f,0x5e,0x5d,0x31,0x30,0x2b,0x01,0x5f,0x5d,0x5d,0x01,0x01,0x02,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0x96,0xfe,0x45,0x76,0xdc,0x82,0x6b,0x48,0x56,0x50,0x51,0x88,0x4f,0xfe,0x1a,0xbf,0x01,0x58,0x09,0x1c,0x02,0x03,0x26,0x01,0x3f,0x05,0x9a,0xfc,\r\n0x17,0xfe,0xf6,0xc0,0x1f,0xaa,0x33,0x7d,0x9e,0x04,0x02,0xfd,0x02,0x13,0x4a,0x09,0x58,0x02,0xfa,0x00,0x00,0x03,0x00,0x5e,0x00,0x00,0x05,0x81,0x05,0xc2,0x00,0x15,0x00,0x1e,0x00,0x27,0x01,0x02,0xb9,0x00,0x13,0xff,0xe8,0x40,0x23,0x0c,0x00,0x4d,0x1f,0x03,0x00,0x17,0x00,0x17,0x91,0x59,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x91,0x59,\r\n0x0e,0x00,0x0e,0x00,0x01,0x0d,0x03,0x01,0x12,0x1b,0x18,0x0b,0x0c,0x00,0x4c,0x24,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x1b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x1b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x1b,0x7d,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x2a,\r\n0x0c,0x06,0x4d,0x12,0x20,0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x08,0x0b,0x06,0x4d,0x24,0x7d,0x07,0x18,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe0,0x40,0x1d,0x0b,0x06,0x4d,0x07,0x07,0x28,0x0b,0x0e,0x16,0x20,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,\r\n0x08,0x0c,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x01,0xef,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf5,0x40,0x0a,0x0b,0x06,0x4d,0x02,0x02,0x29,0x28,0x20,0x29,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,\r\n0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x2b,0x25,0x15,0x23,0x35,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x03,0x11,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x3e,0x9c,0x1b,0xf0,0xfe,0xc7,0x01,0x38,0xf3,0x19,0x9c,0x18,0xf6,0x01,0x35,0xfe,0xc7,0xf0,0x1a,0x1a,0xab,0xce,0xce,0xad,0xb4,0x19,0xaa,0xd1,0xce,0xab,0xbc,0xbc,0xbc,0x01,0x47,0xef,0xe4,0x01,0x38,0xb4,0xb4,0xfe,0xcd,0xe9,0xec,0xfe,0xb6,\r\n0x03,0xc5,0xfc,0xcf,0xe3,0xbd,0xb4,0xdd,0xfc,0xcf,0x03,0x31,0xe0,0xb1,0xbe,0xe2,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0xbc,0xfe,0x7f,0x05,0xb2,0x05,0x9a,0x00,0x0b,0x00,0xb4,0xb9,0x00,0x00,0x01,0x30,0x40,0x1c,0x05,0x09,0x03,0x07,0x02,0x0a,0x02,0x0a,0x91,0x59,0x02,\r\n0x12,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x10,0x0b,0x06,0x4d,0x0b,0xba,0x01,0x2c,0x00,0x02,0xff,0xe4,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xec,0x40,0x17,0x0b,0x06,0x4d,0x02,0x02,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x7e,\r\n0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xe0,0x40,0x1d,0x0c,0x06,0x4d,0x07,0x10,0x0b,0x06,0x4d,0x07,0x07,0x0d,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x03,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0xe1,0x2b,\r\n0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0xb2,0x9b,0xfb,0xa5,0xa8,0x02,0xe6,0xa8,0xc0,0xfe,0x7f,0x01,0x81,0x05,0x9a,0xfa,0xfe,\r\n0x05,0x02,0xfa,0xfe,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x10,0x00,0x85,0x40,0x34,0x0f,0x06,0x01,0x10,0x04,0x0e,0x02,0x0c,0x04,0x0c,0x91,0x59,0x04,0x04,0x00,0x09,0x10,0x03,0x00,0x12,0x02,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x7e,0x7f,0x0f,0x01,0x0f,0x20,0x0d,\r\n0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x18,0x0b,0x06,0x4d,0x0f,0x0f,0x12,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x7e,0x08,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x08,0x0c,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,\r\n0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x32,0x12,0x39,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0xa8,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0x02,0x85,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,\r\n0x8c,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0xd9,0x05,0x9a,0x00,0x0b,0x00,0xa7,0x40,0x0e,0x07,0x03,0x0b,0x03,0x05,0x00,0x09,0x00,0x09,0x91,0x59,0x00,0x12,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xf8,0x40,0x22,0x0b,0x06,0x4d,0x09,0x7e,0x00,0x12,0x0d,0x06,0x4d,0x00,\r\n0x0e,0x08,0x01,0x05,0x42,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x7e,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x28,0x0c,0x06,0x4d,0x01,0x01,0x0c,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x05,0x06,0x0d,0x06,0x4d,\r\n0x10,0x05,0x01,0x05,0x05,0x0d,0x0c,0x2f,0x0d,0x4f,0x0d,0x02,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf1,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x3f,0x33,0x33,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,\r\n0x21,0x11,0x33,0x06,0xd9,0xf9,0xe3,0xa8,0x02,0x13,0xa7,0x02,0x13,0xa8,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0x00,0x01,0x00,0xbc,0xfe,0x7f,0x07,0x9a,0x05,0x9a,0x00,0x0f,0x00,0xff,0xb9,0x00,0x01,0x01,0x30,0x40,0x1e,0x09,0x05,0x0d,0x03,0x0b,0x07,0x02,0x0e,0x02,0x0e,0x91,0x59,0x02,0x12,0x0f,0x08,0x0d,0x06,0x4d,\r\n0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x10,0x0b,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xe8,0xb5,0x0b,0x06,0x4d,0x02,0x02,0x0b,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0xb5,0x0b,0x06,0x4d,\r\n0x0b,0x7e,0x0e,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x0e,0xb8,0xff,0xf8,0x40,0x23,0x0c,0x06,0x4d,0x0e,0x06,0x0b,0x06,0x4d,0x0e,0x0e,0x0a,0x07,0x03,0x42,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x6f,0x03,0x01,0x03,0xb8,0xff,0xf0,0x40,0x18,0x0d,0x06,0x4d,0x03,0x03,0x10,0x0a,0x08,\r\n0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x7e,0x07,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf0,0x40,0x0f,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x4f,0x11,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,\r\n0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc1,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x07,0x9a,0x9b,0xf9,0xbd,0xa8,0x02,0x13,0xa8,0x02,0x12,\r\n0xa8,0xc1,0xfe,0x7f,0x01,0x81,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x00,0x02,0x00,0x29,0x00,0x00,0x05,0x42,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x98,0x40,0x29,0x0d,0x0a,0x01,0x00,0x08,0x01,0x10,0x04,0x05,0x0d,0x91,0x59,0x05,0x05,0x0e,0x04,0x04,0x01,0x91,0x59,0x04,0x03,0x00,0x0e,0x91,0x59,0x00,0x12,\r\n0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x7d,0x12,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x25,0x0c,0x06,0x4d,0x12,0x12,0x16,0x00,0x02,0x02,0x15,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x70,0x00,0x01,0x00,0x10,0x0d,0x06,0x4d,0x00,0xb8,\r\n0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xe0,0xb3,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x11,0x21,0x35,0x21,0x11,\r\n0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0xc6,0xfe,0x63,0x02,0x45,0x01,0x11,0xd5,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa3,0xfe,0xc8,0x05,0x00,0x9a,0xfd,0xa0,0xce,0xc0,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x00,0x03,0x00,0xbc,0x00,0x00,0x05,0x87,0x05,0x9a,0x00,0x03,\r\n0x00,0x0e,0x00,0x16,0x00,0xb0,0x40,0x44,0x0d,0x0c,0x01,0x00,0x0a,0x01,0x10,0x04,0x07,0x0f,0x91,0x59,0x07,0x07,0x10,0x02,0x05,0x03,0x01,0x04,0x04,0x10,0x91,0x59,0x04,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x7f,0x01,0x01,0x01,0x10,0x0d,0x06,0x4d,0x01,0x01,0x18,0x04,0x0b,\r\n0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x7d,0x14,0xb8,0xff,0xe8,0x40,0x1e,0x0d,0x06,0x4d,0x00,0x14,0x10,0x14,0x02,0x14,0x14,0x18,0x07,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x7e,0x04,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xfa,0xb3,0x0c,0x06,0x4d,0x04,0xb8,\r\n0xff,0xfd,0xb3,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x21,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x21,0x32,\r\n0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x05,0x87,0xa8,0xa8,0xfb,0x35,0xa8,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfd,0xa0,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,\r\n0x00,0x0a,0x00,0x12,0x00,0x87,0x40,0x29,0x0d,0x08,0x01,0x00,0x06,0x01,0x10,0x04,0x03,0x0b,0x91,0x59,0x03,0x03,0x0c,0x01,0x03,0x00,0x0c,0x91,0x59,0x00,0x12,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7d,0x10,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x10,0xb8,0xff,0xf8,0x40,0x1e,0x0c,0x06,\r\n0x4d,0x10,0x18,0x0b,0x06,0x4d,0x10,0x10,0x14,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,\r\n0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x5f,0x5e,0x5d,0x5d,0x33,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0xa8,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0xfd,0xa0,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,\r\n0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x90,0x05,0xb2,0x00,0x18,0x00,0xb9,0x40,0x14,0x02,0x0f,0x01,0x0d,0x00,0x01,0x02,0x16,0x01,0x02,0x12,0x01,0x10,0x04,0x16,0x10,0x0b,0x00,0x4d,0x0f,0xb8,0xff,0xc0,0x40,0x45,0x0c,0x00,0x4d,0x00,0x40,0x0c,0x00,0x4d,0x08,0x07,0x91,0x59,0x08,0x11,0x17,0x08,0x91,0x2b,0x30,0x00,0x0e,0x01,0x0c,\r\n0x03,0x0e,0x0e,0x0c,0x11,0x0c,0x91,0x59,0x11,0x04,0x00,0x01,0x01,0x0b,0x03,0x01,0x01,0x03,0x17,0x03,0x91,0x59,0x17,0x13,0x07,0x07,0x00,0x09,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x7d,0x06,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,\r\n0xe8,0x40,0x0b,0x0b,0x06,0x4d,0x20,0x06,0x01,0x06,0x06,0x1a,0x0e,0x00,0x2f,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x00,0x18,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x2b,0x01,\r\n0x5f,0x5e,0x5d,0x5d,0x00,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x00,0x37,0x21,0x35,0x21,0x26,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x68,0x9d,0xe1,0xd6,0x01,0x11,0x10,0xfd,0x85,0x02,0x79,0x1a,0xfe,0xf1,0xd9,0xcb,0xa6,0x9a,0xd7,0x01,0x35,0x01,0x82,0xfe,0x8d,0xfe,0xd1,0xe7,0x3c,0xa3,0x60,0x01,\r\n0x0f,0xf1,0x97,0xf5,0x01,0x0f,0x56,0xb0,0x3e,0xfe,0x61,0xfe,0xa5,0xfe,0xc1,0xfe,0x6f,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x07,0xc6,0x05,0xb2,0x00,0x12,0x00,0x1e,0x00,0xcf,0x40,0x2d,0x0a,0x13,0x91,0x59,0x0a,0x04,0x06,0x01,0x91,0x59,0x06,0x04,0x02,0x06,0x91,0x2b,0x30,0x04,0x03,0x10,0x19,0x91,0x59,0x10,0x13,0x02,0x12,0x0d,\r\n0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x7d,0x1c,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1c,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x1c,0xb8,0xff,0xe7,0x40,0x19,0x0b,0x06,0x4d,0x1c,0x1c,0x20,0x16,0x08,0x0d,0x06,0x4d,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x7d,0x07,0x00,0xb8,\r\n0xff,0xf0,0x40,0x26,0x0d,0x06,0x4d,0x00,0x04,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x20,0x00,0x01,0x00,0x00,0x20,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x03,0x03,0x0b,0x06,0x4d,0x03,\r\n0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x12,0x00,0x21,0x20,0x00,0x11,0x10,\r\n0x00,0x21,0x20,0x00,0x01,0x22,0x00,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x10,0x02,0x02,0xb2,0xfe,0xb2,0xa8,0xa8,0x01,0x54,0x1e,0x01,0x5e,0x01,0x18,0x01,0x21,0x01,0x59,0xfe,0x9e,0xfe,0xcf,0xfe,0xe2,0xfe,0xa5,0x02,0x8c,0xe3,0xfe,0xff,0xf4,0xdd,0xe6,0xfd,0xf3,0x02,0x9e,0xfd,0x62,0x05,0x9a,0xfd,0x9b,0x01,0x2c,0x01,0x51,0xfe,\r\n0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x01,0x7c,0x03,0xb6,0xfe,0xc8,0xfe,0xef,0xfe,0xe5,0xfe,0xc9,0x01,0x32,0x01,0x17,0x01,0x20,0x01,0x32,0x00,0x00,0x02,0x00,0x3d,0x00,0x00,0x03,0xfd,0x05,0x9a,0x00,0x14,0x00,0x1d,0x00,0xa6,0x40,0x6d,0x04,0x11,0x01,0x0b,0x0f,0x01,0x0d,0x0a,0x01,0x0f,0x09,0x01,0x02,0x07,0x01,0x10,0x04,0x06,\r\n0x18,0x0b,0x00,0x4d,0x0c,0x02,0x15,0x15,0x02,0x91,0x59,0x15,0x15,0x13,0x00,0x13,0x17,0x91,0x59,0x13,0x03,0x07,0x00,0x12,0x07,0x08,0x0b,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x09,0x0c,0x09,0x01,0x08,0x1a,0x08,0x0c,0x06,0x4d,0x1a,0x08,0x0b,0x06,0x4d,0x1a,0x7d,0x10,0x10,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,\r\n0x4d,0x00,0x08,0x0b,0x06,0x4d,0x15,0x00,0x7e,0x7f,0x01,0x01,0x01,0x18,0x0d,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x01,0x1f,0x07,0x08,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x33,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x39,0x11,0x33,0x2b,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,\r\n0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x21,0x23,0x11,0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x36,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0xfd,0xa8,0xd1,0x3c,0x5b,0x34,0xb4,0xc8,0xda,0x15,0x57,0x3a,0x8f,0x9f,0xff,\r\n0xcf,0x01,0xa0,0xa8,0xe9,0x8e,0x9d,0xa0,0x87,0x02,0x62,0x41,0x71,0xfe,0x50,0x01,0xdf,0x2f,0x69,0x16,0x04,0x1f,0xc8,0x8e,0xb7,0xdd,0xfd,0x60,0x02,0x08,0x86,0x7a,0x7a,0x8e,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x04,0x18,0x02,0x06,0x00,0x44,0x00,0x00,0x00,0x02,0x00,0x77,0xff,0xe8,0x04,0x40,0x05,0xf8,0x00,0x19,0x00,0x27,\r\n0x00,0x96,0x40,0x2c,0x1a,0x07,0x26,0x0a,0x26,0x95,0x59,0x0a,0x0a,0x20,0x00,0x00,0x01,0xec,0x59,0x00,0x01,0x10,0x20,0x95,0x59,0x10,0x16,0x00,0x00,0x1b,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x23,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x23,0xb8,0xff,0xe8,0x40,0x30,0x0b,0x06,0x4d,\r\n0x20,0x23,0x30,0x23,0x02,0x23,0x23,0x29,0x07,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x83,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x13,0x2f,0x29,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,\r\n0x2b,0x11,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x01,0x15,0x06,0x07,0x0e,0x02,0x07,0x33,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x02,0x11,0x34,0x12,0x36,0x36,0x37,0x36,0x01,0x15,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0xbe,0x29,\r\n0x5b,0xe1,0xb3,0x73,0x10,0x04,0x78,0xde,0xcb,0xf8,0xfe,0xfd,0xdb,0xec,0xff,0x5c,0xa3,0xc7,0xf2,0x60,0xfd,0x92,0x01,0x2e,0x56,0x75,0x4b,0x89,0xa9,0xad,0x93,0xce,0x05,0xf8,0x9a,0x1e,0x0f,0x22,0x3f,0xce,0xc6,0xae,0xfe,0xea,0xe4,0xeb,0xfe,0xe3,0x01,0x4f,0x01,0x37,0xf2,0x01,0x51,0xaa,0x40,0x2b,0x16,0xfc,0xbe,0x8e,0x50,0x9a,\r\n0x76,0x3a,0xcd,0xa0,0xb0,0xcf,0x00,0x03,0x00,0xa6,0x00,0x00,0x03,0xd1,0x04,0x00,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0xa5,0xb9,0x00,0x03,0xff,0xe8,0x40,0x33,0x0b,0x0c,0x00,0x4c,0x07,0x14,0x0e,0x0e,0x14,0x95,0x59,0x0e,0x0e,0x01,0x15,0x01,0x0d,0x95,0x59,0x01,0x0f,0x00,0x15,0x95,0x59,0x00,0x15,0x07,0x15,0x11,0x84,0x05,0x05,\r\n0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x84,0x18,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x18,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x20,0x18,0x30,0x18,0x02,0x18,0x18,0x1c,0x0e,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x84,0x00,0xb8,0xff,0xfc,\r\n0x40,0x0e,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc0,0x2f,0xe1,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x33,0x11,0x21,\r\n0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x11,0x21,0x32,0x35,0x34,0x23,0xa6,0x01,0xbe,0x97,0xaf,0xc4,0xeb,0xc1,0x8f,0xfe,0xc9,0xf6,0xc6,0xb2,0xfe,0xf6,0x01,0x1c,0xc7,0xdf,0x04,0x00,0x86,0x74,0xc7,0x2b,0x1e,0xcf,0x7d,0xaa,0x03,0x74,0xfe,0xe0,0x9a,0x86,0xfe,0x54,0xfe,0xc4,\r\n0xa1,0x9b,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xdf,0x04,0x00,0x00,0x05,0x00,0x47,0x40,0x20,0x05,0x00,0x95,0x59,0x05,0x0f,0x02,0x15,0x70,0x00,0x01,0x00,0x00,0x07,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xf8,0xb6,0x0b,0x06,\r\n0x4d,0x03,0x2f,0x07,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x5d,0x00,0x3f,0x3f,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x02,0xdf,0xfe,0x6b,0xa4,0x02,0x39,0x03,0x74,0xfc,0x8c,0x04,0x00,0x00,0x02,0x00,0x12,0xfe,0x8b,0x04,0x23,0x04,0x00,0x00,0x0c,0x00,0x11,0x00,0xba,0x40,0x0d,0x00,0x11,0x01,0x10,\r\n0x05,0x0a,0x0e,0x95,0x59,0x0a,0x0f,0x04,0x00,0xb8,0x01,0x31,0x40,0x1c,0x0d,0x07,0x02,0x0b,0x02,0x0b,0x95,0x59,0x02,0x15,0x0f,0x09,0x09,0x0d,0x07,0x0c,0x0c,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0xed,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf8,0x40,0x20,0x0b,\r\n0x06,0x4d,0x02,0x02,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0d,0x12,0x0d,0x06,0x4d,0x0d,0x0d,0x13,0x07,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0b,0x06,0x4d,0x06,0xb8,0x01,0x2c,0x40,0x0d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x03,0x11,0x11,0x07,0x30,0x13,\r\n0x01,0x5d,0x2f,0x33,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0xf1,0x2b,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0xc4,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x00,0x13,0x21,0x11,\r\n0x33,0x21,0x11,0x23,0x02,0x03,0x04,0x23,0x8b,0xfd,0x06,0x8c,0x5b,0x01,0x06,0x04,0x02,0x14,0x98,0xfe,0xc4,0xe3,0x1b,0xce,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x02,0x00,0x01,0x7a,0x01,0xfb,0xfc,0x8b,0x02,0xea,0xfe,0x62,0xfe,0xb4,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x04,0x18,0x02,0x06,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x04,\r\n0x00,0x00,0x05,0xf6,0x04,0x00,0x00,0x15,0x00,0xc5,0x40,0x21,0x0a,0x15,0x01,0x07,0x14,0x01,0x07,0x0b,0x01,0x0a,0x0a,0x01,0x09,0x07,0x01,0x09,0x02,0x01,0x0d,0x13,0x01,0x02,0x0c,0x01,0x01,0x08,0x01,0x0e,0x01,0x01,0x10,0x03,0x15,0xb8,0xff,0xf8,0x40,0x0b,0x0b,0x0c,0x00,0x4c,0x0a,0x08,0x0b,0x0c,0x00,0x4c,0x08,0xb8,0xff,0xe8,\r\n0x40,0x45,0x0c,0x00,0x4d,0x01,0x18,0x0c,0x00,0x4d,0x02,0x10,0x0c,0x00,0x4d,0x14,0x0b,0x10,0x0f,0x09,0x00,0x04,0x15,0x15,0x00,0x04,0x0a,0x05,0x09,0x14,0x14,0x00,0x18,0x0b,0x06,0x4d,0x00,0x0e,0x04,0x05,0x09,0x42,0x0b,0x09,0x08,0x0c,0x00,0x4d,0x09,0x09,0x16,0x10,0x0f,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,\r\n0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0xb8,0xff,0xfc,0x40,0x0a,0x0b,0x06,0x4d,0x05,0x40,0x17,0x01,0x2f,0x17,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0xc6,0x2b,0x01,0x10,0xf0,0x2b,0xc2,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x31,0x30,0x2b,0x01,0x2b,0x2b,\r\n0x2b,0x2b,0x5f,0x5e,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x05,0xf6,0xde,0xfe,0x36,0x04,0x9c,0x04,0xfe,0x35,0xdb,0x01,0xfc,0xfe,0x23,0xd1,0x01,0xb6,0x04,0x9c,0x04,0x01,0xb6,0xd3,0xfe,0x21,0x01,\r\n0xfa,0xfe,0x06,0x01,0xfa,0xfe,0x06,0x02,0x10,0x01,0xf0,0xfe,0x21,0x01,0xdf,0xfe,0x21,0x01,0xdf,0xfe,0x10,0x00,0x00,0x01,0x00,0x50,0xff,0xe7,0x03,0x3b,0x04,0x19,0x00,0x21,0x00,0xa7,0x40,0x09,0x05,0x12,0x01,0x0c,0x00,0x01,0x10,0x03,0x15,0xb8,0xff,0xe0,0x40,0x3a,0x0b,0x0c,0x00,0x4c,0x19,0x08,0x09,0x09,0x08,0x95,0x59,0x09,\r\n0x09,0x14,0x03,0x11,0x0f,0x14,0x0f,0x95,0x59,0x14,0x10,0x01,0x03,0x20,0x03,0x95,0x59,0x20,0x16,0x19,0x16,0x08,0x08,0x11,0x0c,0x84,0x16,0x16,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x84,0x05,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,\r\n0xf0,0x40,0x0d,0x0b,0x06,0x4d,0x20,0x05,0x30,0x05,0x02,0x05,0x05,0x23,0x11,0x00,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0xc4,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0xc0,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x2b,\r\n0x11,0x12,0x00,0x39,0x31,0x30,0x2b,0x5f,0x5e,0x5d,0x5d,0x37,0x35,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x50,0x86,0xb3,0x01,0x0f,0xfe,0xd7,0x65,0x60,0x01,0x05,0x78,0x68,0x95,0x96,0xaa,0x8e,0x01,0x76,\r\n0x6f,0x64,0x72,0x8a,0xe2,0xc6,0xd3,0x1d,0xa1,0x4b,0xac,0xaa,0x8b,0xa2,0x45,0x52,0x4b,0x99,0x3e,0xfe,0xed,0x59,0x81,0x15,0x05,0x09,0x88,0x68,0x8c,0xa6,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,0x00,0x0d,0x00,0x92,0x40,0x2d,0x7c,0x0c,0x01,0x79,0x0b,0x01,0x73,0x05,0x01,0x76,0x04,0x01,0x46,0x09,0x01,0x4a,0x02,0x01,\r\n0x09,0x02,0x08,0x0d,0x0f,0x05,0x00,0x15,0x0c,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x00,0xef,0x01,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf4,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xfa,0x40,0x29,0x0b,0x06,0x4d,0x01,0x01,0x0f,0x05,0x09,0x08,0x0d,0x06,0x4d,0x09,0x08,0x0c,0x06,\r\n0x4d,0x09,0x10,0x0b,0x06,0x4d,0x09,0xef,0x06,0x05,0x0d,0x06,0x4d,0x06,0x01,0x0b,0x06,0x4d,0x06,0x40,0x0f,0x01,0x2f,0x0f,0x01,0x5d,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x3f,0x33,0x39,0x39,0x5d,0x5d,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,\r\n0x11,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x36,0x37,0x01,0x33,0x04,0x00,0x94,0x16,0x2d,0xfe,0x27,0xaa,0x96,0x0c,0x28,0x01,0xe6,0xaa,0x03,0x31,0x2b,0x4e,0xfd,0x48,0x04,0x00,0xfc,0xd9,0x1d,0x46,0x02,0xc4,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x05,0xf2,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x06,0x07,0xcd,0x00,0x00,0x00,0x13,\r\n0x40,0x0b,0x01,0x0d,0x14,0x0e,0x07,0x0d,0x25,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,0x03,0x91,0x04,0x00,0x00,0x0e,0x00,0x96,0x40,0x27,0x00,0x04,0x01,0x10,0x06,0x05,0x20,0x0b,0x0c,0x00,0x4c,0x0e,\r\n0x02,0x95,0x59,0x0e,0x0f,0x09,0x0b,0x06,0x0b,0x95,0x59,0x06,0x00,0x15,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0xed,0x0d,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xf0,0x40,0x22,0x0b,0x06,0x4d,0x0d,0x0d,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,\r\n0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x08,0x0d,0x06,0x4d,0x01,0x0c,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x0a,0x0b,0x06,0x4d,0x01,0x01,0x10,0x08,0x3f,0x10,0x01,0x5d,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,\r\n0x31,0x30,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x03,0x91,0xa3,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0xf8,0x04,0x00,0x00,0x13,0x00,0xad,\r\n0x40,0x0a,0x79,0x12,0x01,0x77,0x0e,0x01,0x75,0x0d,0x01,0x0d,0xb8,0xff,0xf0,0x40,0x0a,0x0b,0x00,0x4d,0x06,0x10,0x0b,0x0c,0x00,0x4c,0x05,0xb8,0xff,0xf0,0x40,0x2f,0x0b,0x0c,0x00,0x4c,0x10,0x40,0x0c,0x00,0x4d,0x02,0x09,0x10,0x03,0x0d,0x13,0x0f,0x0a,0x05,0x00,0x15,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,\r\n0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x01,0x01,0x15,0x0d,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x12,0x0c,0x06,0x4d,0x0a,0x12,0x0b,0x06,0x4d,0x0a,0xed,0x0b,0xb8,0xff,0xfe,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xfc,0x40,0x0c,0x0c,0x06,0x4d,0x0b,0x07,0x0b,\r\n0x06,0x4d,0x0b,0x3f,0x15,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x32,0x3f,0x33,0x17,0x39,0x2b,0x31,0x30,0x01,0x2b,0x2b,0x2b,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,\r\n0x33,0x04,0xf8,0xa2,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,0x01,0x06,0xda,0x03,0x4c,0x40,0x7c,0xfd,0x70,0x02,0x90,0x35,0x87,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x49,0x81,0xc6,0x02,0xa0,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x0b,0x00,0x6a,0x40,0x22,0x09,0x02,0x95,0x59,\r\n0x09,0x09,0x07,0x0b,0x0f,0x04,0x00,0x15,0x09,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0xb8,0xff,0xfb,0x40,0x24,0x0b,0x06,0x4d,0x01,0x01,0x0d,0x08,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0x04,0x0d,0x06,0x4d,\r\n0x05,0x40,0x0d,0x01,0x2f,0x0d,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0x2b,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xf8,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x01,0xd1,0xfe,0x2f,0x04,0x00,\r\n0xfe,0x5c,0x01,0xa4,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x07,0x00,0x60,0x40,0x1e,0x07,0x02,0x95,0x59,0x07,0x0f,0x04,0x00,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,\r\n0x01,0x01,0xb8,0xff,0xfb,0x40,0x23,0x0b,0x06,0x4d,0x01,0x01,0x09,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x05,0x05,0x0d,0x06,0x4d,0x05,0x40,0x09,0x01,0x2f,0x09,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x32,0x3f,0x2b,\r\n0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x03,0xf8,0xa4,0xfd,0xf6,0xa4,0x03,0x52,0x03,0x74,0xfc,0x8c,0x04,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x06,0x00,0x53,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x29,\r\n0x04,0x00,0x00,0x07,0x00,0x47,0x40,0x2d,0x04,0x00,0x07,0x00,0x95,0x59,0x07,0x0f,0x02,0x15,0x00,0x0e,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0x03,0x05,0x42,0x1f,0x05,0x01,0x05,0x05,0x08,0x03,0x04,0x0d,0x06,0x4d,0x03,0x2f,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x01,0x10,0xf1,0x2b,\r\n0x2b,0x2b,0xe2,0x00,0x18,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x29,0xfe,0xcd,0xa4,0xfe,0xcc,0x03,0x0b,0x03,0x74,0xfc,0x8c,0x03,0x74,0x8c,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x02,0x06,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x60,0xfe,0x1e,0x05,0x1c,0x05,0xb2,\r\n0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0xe4,0x40,0x19,0x20,0x0b,0x16,0x0e,0x0e,0x16,0x95,0x59,0x0e,0x10,0x1f,0x03,0x00,0x17,0x00,0x17,0x95,0x59,0x00,0x16,0x0d,0x04,0x01,0x1c,0x24,0xb8,0xff,0xf0,0x40,0x1c,0x0b,0x0c,0x00,0x4c,0x1b,0x10,0x0b,0x0c,0x00,0x4c,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,0x06,0x4d,0x12,0x08,0x0b,0x06,\r\n0x4d,0x1b,0x83,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x12,0xb8,0xff,0xe8,0x40,0x43,0x0b,0x06,0x4d,0x12,0x0e,0x01,0x02,0x07,0x42,0x24,0x08,0x0d,0x06,0x4d,0x24,0x08,0x0c,0x06,0x4d,0x24,0x08,0x0b,0x06,0x4d,0x24,0x83,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x18,0x0b,\r\n0x06,0x4d,0x07,0x07,0x28,0x0c,0x0d,0x16,0x20,0x04,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0xed,0x02,0xb8,0xff,0xfb,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xfd,0x40,0x0c,0x0b,0x06,0x4d,0x2f,0x02,0x01,0x02,0x2f,0x29,0x3f,0x29,0x02,0x5d,0x2f,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x17,0x39,\r\n0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x3f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x05,0x11,0x23,0x11,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x00,0x15,0x14,\r\n0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x08,0x94,0x20,0xe0,0xfe,0xec,0x01,0x17,0xe5,0x18,0x94,0x16,0xe7,0x01,0x17,0xfe,0xee,0xdf,0x23,0x16,0x9c,0xba,0xb7,0x9a,0xaf,0x18,0x9a,0xba,0xbb,0x9d,0x18,0xfe,0x36,0x01,0xca,0x01,0x22,0xea,0xf9,0x01,0x2b,0x01,0x9a,\r\n0xfe,0x66,0xfe,0xd7,0xfb,0xea,0xfe,0xde,0x03,0xa6,0xfc,0xe4,0xd3,0xb5,0xbe,0xd6,0xfc,0xe4,0x03,0x1c,0xd7,0xbd,0xb3,0xd5,0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x02,0x06,0x00,0x5b,0x00,0x00,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x8f,0x04,0x00,0x00,0x0b,0x00,0x93,0xb9,0x00,0x01,0x01,0x31,0x40,0x17,0x05,0x09,0x0f,\r\n0x07,0x02,0x0a,0x02,0x0a,0x95,0x59,0x02,0x15,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x10,0x0b,0x06,0x4d,0x0b,0xba,0x01,0x2c,0x00,0x02,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf0,0x40,0x38,0x0b,0x06,0x4d,0x02,0x02,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x08,\r\n0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x07,0x0d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x03,0x08,0x0d,0x06,0x4d,0x03,0x04,0x0c,0x06,0x4d,0x03,0x40,0x0d,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xf1,0x2b,0x2b,0xc1,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x11,\r\n0x12,0x00,0x39,0x18,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x04,0x8f,0x8d,0xfc,0xa4,0xa4,0x02,0x0a,0xa4,0x97,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x03,0xdf,0x04,0x00,0x00,0x0f,0x00,0x67,0x40,0x46,0x0d,0x02,0x0b,0x04,\r\n0x0b,0xec,0x59,0x04,0x04,0x00,0x08,0x0f,0x0f,0x00,0x15,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x02,0x0f,0x84,0x7f,0x0e,0x01,0x0e,0x0e,0x11,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x07,0x05,0x0d,0x06,0x4d,0x07,0x05,0x0c,0x06,0x4d,0x07,0x2f,\r\n0x11,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0xe1,0x33,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x32,0x12,0x39,0x2f,0x2b,0x11,0x00,0x33,0x33,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x03,0xdf,0xa3,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0x01,0x9c,0x62,\r\n0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0x00,0x01,0x00,0xa6,0x00,0x00,0x05,0xc0,0x04,0x00,0x00,0x0b,0x00,0xad,0x40,0x1f,0x07,0x03,0x0b,0x0f,0x05,0x00,0x09,0x00,0x09,0x95,0x59,0x00,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x09,0x84,0x00,0xb8,0xff,0xf8,0x40,0x1b,0x0b,0x06,\r\n0x4d,0x00,0x0e,0x08,0x01,0x05,0x42,0x04,0x08,0x0d,0x06,0x4d,0x04,0x08,0x0c,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x22,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x01,0x0c,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,\r\n0x08,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xfc,0x40,0x0c,0x0b,0x06,0x4d,0x05,0x05,0x0d,0x0c,0x3f,0x0d,0x4f,0x0d,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf1,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,\r\n0x3f,0x33,0x33,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x05,0xc0,0xfa,0xe6,0xa4,0x01,0x98,0xa3,0x01,0x97,0xa4,0x04,0x00,0xfc,0x8c,0x03,0x74,0xfc,0x8c,0x03,0x74,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x06,0x5a,0x04,0x00,0x00,0x0f,0x00,0xf2,0xb9,0x00,0x01,0x01,0x31,0x40,0x1e,0x09,0x05,0x0d,0x0f,0x0b,\r\n0x07,0x02,0x0e,0x02,0x0e,0x95,0x59,0x02,0x15,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x10,0x0b,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x02,0xb8,0xff,0xf0,0x40,0x1c,0x0b,0x06,0x4d,0x02,0x02,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,\r\n0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0e,0x07,0x0d,0x06,0x4d,0x0e,0xb8,0xff,0xf9,0x40,0x1b,0x0b,0x06,0x4d,0x0e,0x0e,0x0a,0x07,0x03,0x42,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf8,0x40,0x32,0x0c,0x06,0x4d,0x03,0x08,\r\n0x0b,0x06,0x4d,0x03,0x03,0x10,0x0a,0x08,0x0d,0x06,0x4d,0x0a,0x08,0x0c,0x06,0x4d,0x0a,0x08,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0e,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x07,0x11,0x10,0x3f,0x11,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,\r\n0x2b,0x2b,0x2b,0x2b,0x01,0x10,0xf0,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc1,0x18,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x12,0x00,0x39,0x39,0x18,0x3f,0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x06,0x5a,0x8f,0xfa,0xdb,0xa4,0x01,0x97,0xa4,0x01,\r\n0x98,0xa4,0x99,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x04,0x64,0x04,0x00,0x00,0x0c,0x00,0x13,0x00,0x7e,0x40,0x26,0x05,0x0d,0x95,0x59,0x05,0x05,0x04,0x0e,0x04,0x01,0x95,0x59,0x04,0x0f,0x00,0x0e,0x95,0x59,0x00,0x15,0x09,0x08,0x0d,0x06,0x4d,0x09,\r\n0x08,0x0c,0x06,0x4d,0x09,0x08,0x0b,0x06,0x4d,0x09,0x83,0x11,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x11,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x06,0x4d,0x11,0x11,0x15,0x05,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x00,0x02,0x02,0x14,0x00,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x00,0x2f,0x2b,\r\n0x12,0x39,0x2f,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x56,0xfe,0xc8,0x01,0xdc,0x01,0x14,0x9d,0xb9,\r\n0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x03,0x74,0x8c,0xfe,0x77,0xa3,0x94,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x03,0x00,0xa6,0x00,0x00,0x05,0x06,0x04,0x00,0x00,0x03,0x00,0x0e,0x00,0x15,0x00,0xb0,0xb9,0x00,0x09,0xff,0xe8,0x40,0x2f,0x0b,0x00,0x4d,0x07,0x0f,0x95,0x59,0x07,0x07,0x10,0x02,0x05,0x0f,0x01,0x04,0x04,0x10,\r\n0x95,0x59,0x04,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x01,0x01,0x01,0x04,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf4,0x40,0x1c,0x0b,0x06,0x4d,0x01,0x01,0x17,0x04,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,0x0c,0x06,0x4d,0x0b,0x83,0x10,0x13,0x01,0x13,0x08,0x0d,0x06,0x4d,0x13,0xb8,\r\n0xff,0xf8,0x40,0x19,0x0c,0x06,0x4d,0x13,0x13,0x17,0x07,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0x08,0x0b,0x06,0x4d,0x10,0x84,0x04,0xb8,0xff,0xfc,0x40,0x09,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x2f,\r\n0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x21,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x05,0x06,0xa2,0xa2,0xfb,0xa0,0xa4,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,\r\n0x04,0x00,0xfc,0x00,0x04,0x00,0xfe,0x77,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0xb4,0x04,0x00,0x00,0x0a,0x00,0x11,0x00,0x74,0x40,0x21,0x03,0x0b,0x95,0x59,0x03,0x03,0x0c,0x01,0x0f,0x00,0x0c,0x95,0x59,0x00,0x15,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,\r\n0x06,0x4d,0x07,0x83,0x0f,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xf0,0x40,0x19,0x0d,0x06,0x4d,0x0f,0x0f,0x13,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x00,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x00,0x02,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,\r\n0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x12,0x39,0x2f,0x2b,0x31,0x30,0x33,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0xa4,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x04,0x00,0xfe,0x77,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,\r\n0xa2,0xb4,0xaa,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x04,0x18,0x00,0x18,0x00,0x99,0x40,0x09,0x00,0x16,0x01,0x00,0x12,0x01,0x10,0x05,0x05,0xb8,0xff,0xe8,0xb4,0x0b,0x0c,0x00,0x4c,0x09,0xb8,0xff,0xf0,0x40,0x36,0x0c,0x06,0x4d,0x09,0x06,0x95,0x59,0x09,0x09,0x03,0x11,0x0e,0x0c,0x11,0x0c,0x95,0x59,0x11,0x10,0x00,0x01,\r\n0x01,0x0c,0x03,0x01,0x03,0x17,0x03,0x95,0x59,0x17,0x16,0x07,0x07,0x00,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x83,0x09,0x06,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0x40,0x0d,0x0c,0x06,0x4d,0x20,0x06,0x30,0x06,0x02,0x06,0x06,0x1a,0x0e,0x00,0x2f,0xc4,0x12,0x39,0x2f,\r\n0x5d,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x11,0x12,0x39,0x2f,0x2b,0x01,0x2b,0x31,0x30,0x00,0x2b,0x01,0x5f,0x5e,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x11,\r\n0x14,0x00,0x23,0x22,0x5a,0x74,0x96,0x91,0xb3,0x08,0xfe,0x4c,0x01,0xb4,0x0c,0xb2,0x94,0x8f,0x69,0x6a,0x90,0xf4,0x01,0x06,0xfe,0xf3,0xe3,0x9d,0x2d,0x9b,0x56,0xb3,0x99,0x8c,0x98,0xac,0x4e,0xa2,0x36,0xfe,0xe3,0xfe,0xfd,0xf1,0xfe,0xe1,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0x1e,0x04,0x18,0x00,0x12,0x00,0x1a,0x00,0xb7,0x40,0x33,\r\n0x00,0x0b,0x01,0x10,0x06,0x0a,0x13,0x95,0x59,0x0a,0x10,0x10,0x17,0x95,0x59,0x10,0x16,0x06,0x01,0x95,0x59,0x06,0x06,0x03,0x04,0x0f,0x03,0x15,0x07,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x83,0x19,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x19,0xb8,0xff,0xe0,0x40,0x19,\r\n0x0b,0x06,0x4d,0x19,0x19,0x1c,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x83,0x07,0x00,0xb8,0xff,0xe0,0x40,0x19,0x0b,0x06,0x4d,0x00,0x00,0x1c,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x03,\r\n0x08,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x2b,0x00,0x18,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x36,0x24,0x33,\r\n0x32,0x12,0x11,0x14,0x00,0x23,0x22,0x02,0x01,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x02,0x6c,0xfe,0xde,0xa4,0xa4,0x01,0x24,0x1a,0x01,0x01,0xc9,0xdb,0xf1,0xfe,0xfe,0xe2,0xd5,0xef,0x01,0xce,0xfe,0xce,0x01,0x36,0x01,0x2f,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0xd2,0xea,0xfe,0xec,0xff,0x00,0xf9,0xfe,0xdd,0x01,0x01,0x02,0xa5,\r\n0xfe,0x70,0xfe,0x74,0x01,0x8c,0x01,0x90,0x00,0x02,0x00,0x3e,0x00,0x00,0x03,0x62,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0xae,0x40,0x5a,0x02,0x06,0x01,0x10,0x04,0x0a,0x02,0x12,0x02,0x12,0x95,0x59,0x02,0x02,0x11,0x00,0x11,0x13,0x95,0x59,0x11,0x0f,0x06,0x00,0x15,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x06,0x08,0x0b,\r\n0x06,0x4d,0x05,0x08,0x0a,0x08,0x01,0x07,0x16,0x08,0x0c,0x06,0x4d,0x16,0x08,0x0b,0x06,0x4d,0x16,0x83,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x0d,0x07,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0x0c,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb6,\r\n0x0b,0x06,0x4d,0x01,0x01,0x1a,0x07,0xb8,0xff,0xf0,0xb5,0x0c,0x06,0x4d,0x06,0x07,0x19,0x10,0xce,0x32,0x2b,0x11,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x11,0x12,0x39,0x39,0x11,0x33,0x2b,0x2b,0x2b,0x00,0x3f,0x33,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,\r\n0x31,0x30,0x01,0x5f,0x5e,0x5d,0x21,0x23,0x11,0x23,0x22,0x07,0x03,0x23,0x13,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x15,0x14,0x33,0x03,0x62,0xa4,0x89,0x63,0x51,0x85,0xbe,0xac,0x3c,0x55,0x78,0x7e,0xc5,0xb2,0x01,0x66,0xa4,0xc2,0xcf,0xc9,0x01,0xa8,0xa0,0xfe,0xf8,0x01,0x3c,0x6e,0x23,0x10,0x90,0x6c,\r\n0x88,0x9f,0xfe,0x31,0x01,0x43,0x9d,0xa6,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0x87,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x00,0x8f,0x7f,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x29,0x23,0x0c,0x12,0x3e,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x01,0x00,0x27,0xfe,0x62,0x04,0x14,\r\n0x05,0xec,0x00,0x21,0x00,0xbc,0x40,0x40,0x11,0x0e,0x17,0x14,0x14,0x17,0x96,0x59,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x09,0x03,0x14,0x14,0x13,0x1b,0x18,0x08,0x1b,0x08,0x95,0x59,0x1b,0x0f,0x13,0x00,0x01,0x03,0x20,0x03,0xec,0x59,0x20,0x0c,0x15,0x15,0x15,0x0c,0x00,0x00,0x0d,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,\r\n0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x83,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0x40,0x1d,0x0b,0x06,0x4d,0x06,0x06,0x23,0x11,0x14,0x17,0x03,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x84,0x0f,0x0d,0xb8,0xff,0xfc,0x40,0x0a,0x0b,\r\n0x06,0x4d,0x0d,0x40,0x23,0x01,0x2f,0x23,0x01,0x5d,0x5d,0x2f,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x10,0xc0,0x2f,0x00,0x3f,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,\r\n0x31,0x30,0x01,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x21,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x20,0x11,0x10,0x02,0x23,0x22,0x01,0xd5,0x43,0x3a,0x92,0x8a,0xfe,0xfa,0x76,0xa2,0xa4,0x85,0x85,0xa4,0x01,0x4e,0xfe,0xb2,0x04,0x69,0xd3,0x01,0x84,0xdb,0xe9,0x3a,0xfe,0x7b,\r\n0x9d,0x24,0x01,0x2b,0x01,0x64,0x01,0xef,0xbb,0x8a,0xfd,0xd3,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x8a,0xc2,0xfd,0x87,0xfe,0x5a,0xfe,0x83,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xdf,0x06,0x0a,0x02,0x26,0x02,0x0a,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0x94,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1b,0x08,0x06,0x04,0x05,0x3e,0x01,\r\n0x08,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x60,0x04,0x18,0x00,0x18,0x00,0x86,0xb9,0x00,0x14,0xff,0xf0,0x40,0x52,0x0b,0x0c,0x00,0x4c,0x03,0x08,0x10,0x00,0x4d,0x11,0x12,0x95,0x59,0x11,0x11,0x16,0x08,0x00,0x0b,0x01,0x0d,0x03,0x0b,0x0d,0x08,0x0d,0x95,0x59,0x08,0x10,0x00,0x18,0x01,\r\n0x0c,0x03,0x18,0x16,0x02,0x16,0x95,0x59,0x02,0x16,0x12,0x12,0x13,0x0b,0x00,0x30,0x00,0x01,0x00,0x1a,0x10,0x10,0x0c,0x06,0x4d,0x10,0x13,0x08,0x0d,0x06,0x4d,0x13,0x83,0x05,0x10,0x0d,0x06,0x4d,0x05,0x10,0x0c,0x06,0x4d,0x05,0x18,0x0b,0x06,0x4d,0x05,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x32,0x2b,0x11,0x33,0x5d,0x2f,0xc4,0x12,0x39,\r\n0x2f,0x00,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x3f,0x2b,0x00,0x18,0x10,0xc6,0x5f,0x5e,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x31,0x30,0x00,0x2b,0x2b,0x25,0x06,0x23,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x03,0x60,0x73,0x9f,0xe5,0xfe,0xf7,0x01,0x14,\r\n0xf2,0x89,0x67,0x64,0x92,0x93,0xb6,0x0d,0x01,0xb4,0xfe,0x4a,0x08,0xb2,0x94,0x92,0x78,0x2d,0x45,0x01,0x1b,0xef,0x01,0x02,0x01,0x24,0x32,0xa2,0x4a,0xb0,0x94,0x8c,0x97,0xb5,0x5b,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x04,0x18,0x02,0x06,0x00,0x56,0x00,0x00,0xff,0xff,0xff,0xd3,0x00,0x00,0x02,0x1a,0x05,0x87,0x02,0x26,\r\n0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x56,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x13,0x0d,0x02,0x03,0x25,0x02,0x01,0x10,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x00,0x02,0x00,0x10,0xff,0xf2,0x05,0xfc,0x04,0x00,0x00,0x15,0x00,0x1c,0x00,0xd5,0x40,0x34,0x00,0x03,0x01,0x10,0x06,0x04,0x18,0x0b,\r\n0x0c,0x00,0x4c,0x08,0x0a,0x05,0x0a,0x95,0x59,0x05,0x00,0x0e,0x16,0x95,0x59,0x0e,0x0e,0x0c,0x17,0x0c,0x02,0x95,0x59,0x0c,0x0f,0x00,0x17,0x95,0x59,0x00,0x15,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0xed,0x0c,0xb8,0xff,0xe8,0x40,0x19,0x0d,0x06,0x4d,0x0c,0x0c,0x00,0x07,0x12,0x08,0x0d,0x06,0x4d,0x12,0x08,0x0c,\r\n0x06,0x4d,0x12,0x08,0x0b,0x06,0x4d,0x12,0x83,0x1a,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1a,0xb8,0xff,0xfc,0x40,0x19,0x0c,0x06,0x4d,0x1a,0x1a,0x1e,0x0e,0x17,0x08,0x0d,0x06,0x4d,0x17,0x08,0x0c,0x06,0x4d,0x17,0x08,0x0b,0x06,0x4d,0x17,0x84,0x00,0xb8,0xff,0xfc,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,\r\n0xb8,0xff,0xf4,0x40,0x0a,0x0b,0x06,0x4d,0x00,0x00,0x1e,0x07,0x4f,0x1e,0x01,0x5d,0x2f,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x00,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc4,0x2b,\r\n0x00,0x18,0x10,0xc6,0x31,0x30,0x2b,0x01,0x5f,0x5e,0x5d,0x21,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x02,0xee,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x01,0x15,0x9d,0xb9,0xbb,0x8d,0xfe,0xdd,0xf6,0xcd,\r\n0xcf,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0xfe,0x77,0xa4,0x94,0x92,0xad,0x01,0xe9,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xa6,0x00,0x00,0x06,0x14,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0xb7,0x40,0x28,0x08,0x01,0x13,0x0b,0x0b,0x13,0x95,0x59,0x0b,0x0b,0x14,0x06,0x0a,0x0f,0x03,0x00,0x00,0x14,0x95,0x59,0x00,0x15,\r\n0x0f,0x04,0x0d,0x06,0x4d,0x0f,0x04,0x0c,0x06,0x4d,0x0f,0x04,0x0b,0x06,0x4d,0x0f,0x83,0x17,0xb8,0xff,0xf0,0x40,0x1a,0x0d,0x06,0x4d,0x17,0x17,0x1b,0x0b,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0x08,0x0b,0x06,0x4d,0x14,0x84,0x00,0xb8,0xff,0xf9,0x40,0x09,0x0d,0x06,0x4d,0x00,0x14,0x0c,0x06,0x4d,0x00,0xb8,\r\n0xff,0xf0,0x40,0x19,0x0b,0x06,0x4d,0x00,0x00,0x1b,0x07,0x03,0x08,0x0d,0x06,0x4d,0x03,0x08,0x0c,0x06,0x4d,0x03,0x08,0x0b,0x06,0x4d,0x03,0x84,0x04,0xb8,0xff,0xf8,0x40,0x0c,0x0d,0x06,0x4d,0x04,0x08,0x0b,0x06,0x4d,0x04,0x4f,0x1b,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,\r\n0x2b,0x39,0x39,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x06,0xfe,0x44,0xa4,0xa4,0x01,\r\n0xbc,0xa4,0x01,0x14,0xa1,0xb5,0xb8,0x8f,0xfe,0xdd,0xf6,0xcc,0xce,0x01,0xdd,0xfe,0x23,0x04,0x00,0xfe,0x6a,0x01,0x96,0xfe,0x6a,0x9e,0x92,0x93,0xa7,0x01,0xdd,0xfe,0xaf,0xae,0xa3,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xfe,0x05,0xec,0x00,0x19,0x00,0xb4,0x40,0x3f,0x02,0x18,0x01,0x02,0x18,0x01,0x10,0x04,0x0d,0x0a,0x13,0x10,\r\n0x10,0x13,0x96,0x59,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x09,0x03,0x10,0x10,0x0f,0x17,0x15,0x04,0x17,0x04,0x95,0x59,0x17,0x0f,0x0f,0x00,0x08,0x00,0x15,0x12,0x12,0x08,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,\r\n0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1d,0x0b,0x06,0x4d,0x01,0x01,0x1b,0x0d,0x10,0x13,0x03,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x0b,0x09,0xb8,0xff,0xfc,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x1b,0x01,0x5d,0x2f,0x2b,0xce,0xe1,0x2b,0x2b,0x2b,0x17,0x39,0x12,0x39,0x2f,0x2b,0x2b,0x2b,\r\n0xe1,0x2b,0x2b,0x2b,0x10,0xc0,0x2f,0x00,0x3f,0x33,0x3f,0x3f,0x2b,0x11,0x00,0x33,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x2b,0x11,0x12,0x00,0x39,0x39,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x20,0x11,\r\n0x03,0xfe,0xa4,0xec,0x7b,0xa3,0xa4,0x85,0x85,0xa4,0x01,0x4e,0xfe,0xb2,0x04,0x77,0xd9,0x01,0x5a,0x02,0x33,0x01,0x41,0xba,0x95,0xfd,0xdb,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x8c,0xc2,0xfe,0x5e,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0a,0x02,0x26,0x01,0x67,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1f,0x00,0x00,0x00,0x13,\r\n0x40,0x0b,0x01,0x00,0x0e,0x0e,0x07,0x0a,0x3e,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0xf2,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x07,0xcd,0xa0,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1b,0x15,0x0c,0x00,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,\r\n0x00,0x01,0x00,0xa6,0xfe,0x8b,0x03,0xf8,0x04,0x00,0x00,0x0b,0x00,0x9c,0xb3,0x07,0x0b,0x0f,0x02,0xb8,0x01,0x31,0x40,0x18,0x04,0x00,0x00,0x09,0x95,0x59,0x00,0x15,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0xbb,0x01,0x2c,0x00,0x04,0x00,0x04,0xff,0xf8,0xb5,0x0b,0x06,0x4d,0x08,0x09,0x04,\r\n0xb8,0x01,0x2c,0x40,0x17,0xff,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x09,0x01,0x09,0xb8,0xff,0xf8,0x40,0x23,0x0b,0x06,0x4d,0x09,0x09,0x0d,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x84,0x05,0x04,0x0d,0x06,0x4d,0x05,0x40,0x0d,\r\n0x01,0x2f,0x0d,0x01,0x5d,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x00,0x33,0x18,0x3f,0x3f,0x33,0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xf8,0xfe,0x9e,0x8e,0xfe,0x9e,0xa4,0x02,0x0a,\r\n0xa4,0xfe,0x8b,0x01,0x75,0x04,0x00,0xfc,0x8b,0x03,0x75,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa4,0x06,0xa2,0x00,0x07,0x00,0x75,0x40,0x19,0x05,0x00,0x91,0x59,0x06,0x05,0x03,0x02,0x12,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x05,0xb8,0x01,0x2c,0x40,0x09,0x70,0x00,0x01,0x00,0x08,0x0d,\r\n0x06,0x4d,0x00,0xb8,0xff,0xfa,0x40,0x18,0x0b,0x06,0x4d,0x00,0x00,0x09,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x7e,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x03,0x04,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,\r\n0x2f,0x2b,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xcd,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x03,0xa4,0xfd,0xc0,0xa8,0x02,0x58,0x90,0x05,0x02,0xfa,0xfe,0x05,0x9a,0x01,0x08,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xe6,0x05,0x0e,0x00,0x07,0x00,0x62,0x40,0x19,0x05,0x00,0x95,0x59,0x06,0x05,0x0f,0x02,\r\n0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x10,0x0b,0x06,0x4d,0x05,0xb8,0x01,0x2c,0x40,0x1d,0x70,0x00,0x01,0x00,0x18,0x0d,0x06,0x4d,0x00,0x00,0x09,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x03,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x03,0x12,0x0b,0x06,0x4d,\r\n0x03,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x33,0x2f,0x2b,0x5d,0xe1,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xcd,0x2b,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x02,0xe6,0xfe,0x64,0xa4,0x01,0xb0,0x90,0x03,0x74,0xfc,0x8c,0x04,0x00,0x01,0x0e,0xff,0xff,0x00,0x00,0x01,0xfa,0x08,0x00,0x02,0x7b,0x02,0x06,0x00,0xb3,0x00,0x00,\r\n0x00,0x04,0x00,0xbc,0x00,0x00,0x08,0x9a,0x05,0xae,0x00,0x0b,0x00,0x14,0x00,0x26,0x00,0x2a,0x00,0xd8,0x40,0x52,0x06,0x20,0x01,0x0a,0x16,0x01,0x04,0x0b,0x01,0x03,0x07,0x01,0x03,0x0f,0x05,0x01,0x0f,0x01,0x01,0x10,0x04,0x29,0x28,0x96,0x59,0x29,0x00,0x00,0x11,0x96,0x59,0x00,0x00,0x06,0x06,0x0c,0x96,0x59,0x06,0x04,0x20,0x26,\r\n0x03,0x1d,0x15,0x12,0x2a,0x29,0x2a,0x29,0x03,0x09,0x8b,0x13,0x13,0x2c,0x0f,0x8b,0x03,0x03,0x2c,0x1e,0x16,0x22,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x7e,0x24,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x24,0xb8,0xff,0xf0,0x40,0x1f,0x0c,0x06,0x4d,0x24,0x0a,0x0b,0x06,0x4d,0x24,0x24,0x2c,\r\n0x20,0x1a,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x7e,0x1e,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x1e,0xb8,0xff,0xfc,0x40,0x09,0x0c,0x06,0x4d,0x1e,0x04,0x0b,0x06,0x4d,0x1e,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x33,\r\n0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0x33,0x3f,0x33,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x2b,0x00,0x18,0x10,0xc6,0x2b,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x10,0x33,0x32,0x11,\r\n0x10,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x33,0x26,0x35,0x11,0x33,0x01,0x21,0x35,0x21,0x07,0x1c,0xaf,0xc3,0xcb,0xba,0xb0,0xbb,0xcb,0xa8,0x6c,0x79,0xe1,0xdd,0xfd,0x02,0xd1,0xfd,0x5f,0x20,0x0e,0x06,0x08,0xa8,0xdc,0x02,0xc6,0x04,0x08,0xa8,0x03,0x79,0xfd,0x4d,0x02,0xb3,0x02,0x5c,0xde,0xc4,0xd1,\r\n0xdf,0xda,0xc8,0xc6,0xea,0x02,0xcb,0x99,0x8c,0xfe,0xe2,0x01,0x20,0x01,0x23,0xfa,0xd9,0x04,0x70,0x37,0x21,0x2e,0x94,0xfb,0xfa,0x05,0x9a,0xfb,0x43,0x31,0xa0,0x03,0xec,0xfb,0xa4,0x84,0x00,0x01,0x00,0x11,0xff,0xf4,0x04,0xaf,0x04,0x00,0x00,0x1a,0x00,0xb2,0x40,0x36,0x00,0x18,0x01,0x0d,0x0a,0x01,0x10,0x04,0x16,0x00,0x14,0x0d,\r\n0x00,0x1a,0x00,0x95,0x59,0x1a,0x0f,0x06,0x04,0x09,0x04,0xec,0x59,0x09,0x10,0x15,0x00,0x00,0x02,0x06,0x06,0x02,0x08,0x0d,0x06,0x4d,0x02,0x08,0x0c,0x06,0x4d,0x02,0x08,0x0b,0x06,0x4d,0x02,0x84,0x7f,0x0b,0x01,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0x40,0x27,0x0b,\r\n0x06,0x4d,0x0b,0x0b,0x1c,0x13,0x16,0x16,0x1b,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x13,0x17,0x0d,0x06,0x4d,0x13,0x12,0x0c,0x06,0x4d,0x13,0xb8,0xff,0xe8,0xb3,0x0b,0x06,0x4d,0x13,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0xc6,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x2b,0x2b,\r\n0x2b,0x5d,0xf1,0x2b,0x2b,0x2b,0xc2,0x2f,0x10,0xc2,0x2f,0x00,0x3f,0xc4,0x2b,0x00,0x18,0x10,0xc6,0x3f,0x2b,0x11,0x00,0x33,0x33,0x18,0x10,0xc4,0x31,0x30,0x01,0x5f,0x5e,0x5d,0x00,0x5d,0x01,0x23,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x21,0x11,0x14,0x07,0x23,0x36,0x35,0x11,0x06,0x07,0x35,0x36,0x33,0x21,0x04,\r\n0xaf,0xde,0x65,0x22,0x36,0x3d,0x3d,0xe8,0xfe,0x7b,0x20,0xa7,0x24,0x7b,0x78,0x4b,0xaa,0x03,0xa9,0x03,0x7b,0xfd,0x95,0x8c,0x13,0x8c,0x17,0x01,0x15,0x02,0x72,0xfd,0x9d,0xc0,0x58,0x57,0xc1,0x02,0x63,0x03,0x56,0x96,0x48,0x00,0x00,0x02,0x00,0x2f,0x02,0x48,0x02,0xaa,0x05,0x9a,0x00,0x0c,0x00,0x11,0x00,0x4a,0x40,0x18,0x0c,0x0b,\r\n0x0b,0x02,0xcc,0x0d,0x06,0x09,0x16,0x09,0x02,0x09,0x03,0x03,0x13,0x11,0x4f,0x06,0x7f,0x06,0x02,0x06,0x04,0x01,0xb8,0x01,0x56,0x40,0x0f,0x0c,0x06,0x0f,0x0d,0x1f,0x0d,0x02,0x0d,0x0d,0x02,0x0e,0x0a,0x27,0x02,0x28,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x01,0x2f,0x5d,0x33,0x12,0x39,0x2f,0x33,0x5d,0x33,\r\n0xed,0x32,0x11,0x33,0x30,0x31,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x36,0x12,0x37,0x33,0x11,0x33,0x23,0x11,0x06,0x06,0x07,0x02,0xaa,0x6e,0x84,0xfe,0x77,0x69,0xba,0x4e,0x9c,0x6e,0xf2,0x3e,0x80,0x42,0x03,0x14,0xcc,0xcc,0x5c,0x79,0x01,0x13,0x9e,0xfd,0xe7,0x01,0x73,0x71,0xb3,0x4f,0x00,0x00,0x01,0x00,0x7b,0x02,0x33,0x02,0x8a,\r\n0x05,0x9e,0x00,0x24,0x00,0x37,0x40,0x1e,0x04,0x1c,0x14,0x1c,0x02,0x12,0x1e,0xcc,0x08,0x08,0x26,0x14,0xcc,0x01,0x0f,0x0a,0xe6,0x19,0x19,0x10,0x01,0x03,0xe6,0x00,0x23,0x29,0x12,0xe6,0x10,0x27,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x5d,0x13,0x35,0x16,\r\n0x33,0x32,0x3e,0x02,0x35,0x34,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x07,0x32,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x7e,0x71,0x57,0x2a,0x45,0x31,0x1a,0xcc,0x14,0x30,0x31,0x31,0x13,0x30,0x01,0xb7,0xfe,0xb5,0x19,0x07,0x15,0x17,0x16,0x06,0x40,0x74,0x56,0x33,0x36,0x5b,0x76,0x3f,0x7d,0x02,0x5e,\r\n0x92,0x46,0x18,0x2a,0x3b,0x23,0x98,0x01,0x03,0x03,0x01,0x01,0xc4,0x7c,0xc8,0x01,0x01,0x01,0x22,0x43,0x65,0x43,0x48,0x6b,0x47,0x23,0x00,0x01,0x00,0x4d,0x02,0x48,0x02,0xa0,0x05,0xa4,0x00,0x0a,0x00,0x2a,0x40,0x15,0x03,0x06,0x0a,0xcc,0x00,0x06,0x00,0x06,0x00,0x0c,0x1f,0x05,0x01,0x05,0x0a,0x28,0x07,0x03,0xe6,0x05,0x27,0x00,\r\n0x3f,0xed,0x32,0x3f,0x01,0x2f,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x30,0x31,0x13,0x36,0x12,0x37,0x21,0x35,0x21,0x15,0x06,0x02,0x07,0xb3,0x38,0x99,0x70,0xfe,0x59,0x02,0x53,0x79,0xaf,0x33,0x02,0x48,0xc6,0x01,0x75,0xab,0x76,0x35,0xb9,0xfe,0x6e,0xdc,0x00,0x03,0x00,0x41,0x02,0x34,0x02,0xad,0x05,0xae,0x00,0x23,\r\n0x00,0x31,0x00,0x45,0x00,0x53,0x40,0x30,0x15,0x05,0x08,0x3c,0xcc,0x12,0x12,0x1a,0xcc,0x60,0x2a,0x01,0x2a,0x2a,0x47,0x00,0x32,0xcc,0x08,0x08,0x24,0xcc,0x00,0x40,0x0a,0x0f,0x48,0x00,0x15,0x05,0x2f,0xe6,0x0f,0x37,0x1f,0x37,0x02,0x37,0x37,0x0d,0x27,0xe6,0x1f,0x29,0x41,0xe6,0x0d,0x27,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,\r\n0x5d,0xed,0x39,0x39,0x01,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x30,0x31,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x06,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x41,0x14,0x27,0x39,0x25,0x34,0x3c,0x27,0x47,0x63,0x3c,0x3d,0x63,0x46,0x27,0x3b,0x35,0x23,0x39,0x28,0x15,0x2c,0x51,0x73,0x46,0x46,0x72,0x51,0x2d,0x90,0x58,0x4e,0x4e,0x5c,0x17,0x2c,0x3f,0x28,0x4a,0x5c,0x20,0x14,0x24,0x31,0x1d,\r\n0x1d,0x32,0x25,0x15,0x14,0x25,0x32,0x1e,0x1f,0x32,0x22,0x13,0x03,0x32,0x21,0x41,0x3b,0x32,0x11,0x21,0x5d,0x38,0x31,0x55,0x3d,0x23,0x23,0x3e,0x54,0x31,0x39,0x5d,0x20,0x11,0x33,0x3b,0x41,0x20,0x3b,0x5e,0x42,0x23,0x23,0x42,0x5e,0x47,0x48,0x49,0x4b,0x46,0x20,0x38,0x29,0x17,0x51,0x01,0x3b,0x1a,0x2e,0x22,0x14,0x14,0x22,0x2e,\r\n0x1a,0x1b,0x2c,0x20,0x12,0x13,0x20,0x2d,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x04,0x00,0x02,0x06,0x00,0xd6,0x00,0x00,0xff,0xff,0x00,0x79,0xfe,0x85,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x06,0x01,0x9c,0x7b,0x00,0xff,0xff,0x00,0x68,0xfe,0x85,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,\r\n0x01,0x9c,0x09,0x00,0x00,0x02,0x00,0x64,0x01,0x02,0x04,0x0e,0x04,0xaa,0x00,0x1b,0x00,0x27,0x00,0x68,0x40,0x3b,0x02,0x06,0x09,0x0d,0x10,0x14,0x17,0x1b,0x08,0x04,0x12,0x01,0x07,0x04,0x40,0x22,0x04,0xbe,0x59,0x22,0x0e,0x12,0x12,0x1c,0xbe,0x59,0x15,0x0f,0x12,0x16,0x00,0x00,0x19,0x0e,0x08,0x0b,0x40,0x02,0x06,0x09,0x0d,0x10,\r\n0x14,0x17,0x1b,0x08,0x0b,0x19,0xbd,0x25,0x0b,0x25,0x42,0x25,0x25,0x29,0x1f,0xbd,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x11,0x17,0x39,0x1a,0x18,0x10,0xde,0xc4,0x10,0xca,0x2f,0xc4,0x00,0x2f,0xde,0xc4,0x2b,0x00,0x18,0x10,0xe4,0x2b,0x00,0x1a,0x18,0x10,0xde,0xc4,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x27,0x06,\r\n0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x07,0x16,0x15,0x14,0x07,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,0x0e,0x5c,0x89,0x69,0x86,0x88,0x68,0x8a,0x5c,0x8a,0x4c,0x4c,0x8a,0x5c,0x8a,0x6e,0x82,0x81,0x6c,0x8b,0x5c,0x89,0x4e,0x4e,0xfe,0xb5,0x74,\r\n0x9f,0xa1,0x72,0x71,0xa3,0xa6,0x01,0x62,0x60,0x8a,0x4c,0x4c,0x8a,0x60,0x86,0x71,0x7c,0x81,0x6c,0x88,0x60,0x89,0x4d,0x4d,0x89,0x60,0x88,0x70,0x7d,0x79,0x74,0x02,0x02,0xa2,0x71,0x71,0xa2,0xa2,0x71,0x71,0xa2,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x06,0x3e,0x00,0x19,0x00,0x25,0x00,0xb2,0xb9,0x00,0x0d,0xff,0xf0,0xb3,\r\n0x0b,0x00,0x4d,0x0a,0xb8,0xff,0xf0,0x40,0x14,0x0b,0x00,0x4d,0x06,0xc0,0x02,0xf2,0x0d,0x1a,0x91,0x0f,0x0d,0x12,0x18,0x04,0x20,0x91,0x12,0x13,0x0d,0xb8,0xff,0xe8,0x40,0x1e,0x0c,0x06,0x4d,0x06,0x06,0x04,0xc2,0x09,0x09,0x0d,0x00,0x15,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x23,\r\n0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x23,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x23,0xb8,0xff,0xf4,0x40,0x2a,0x0b,0x06,0x4d,0x23,0x23,0x27,0x1d,0x06,0x0d,0x06,0x4d,0x1d,0x06,0x0c,0x06,0x4d,0x1d,0x06,0x0b,0x06,0x4d,0x1d,0x7d,0x15,0x10,0x0d,0x06,0x4d,0x15,0x10,0x0c,0x06,0x4d,0x15,0x10,0x0b,0x06,0x4d,0x15,0x2f,0x27,0x01,0x5d,\r\n0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x32,0x2f,0xf1,0xc2,0x2f,0x2b,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0xed,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x2b,0x2b,0x01,0x16,0x33,0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x23,0x16,0x11,0x10,0x00,0x21,0x20,\r\n0x00,0x11,0x10,0x00,0x21,0x32,0x07,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x04,0x8f,0x30,0x20,0xd6,0x15,0x88,0x12,0x8c,0x7a,0x22,0x98,0xfe,0x8c,0xfe,0xc8,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0xd8,0xe4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x05,0x43,0x09,0x82,0x48,0x3a,0x36,0x50,0x6c,\r\n0x86,0xc2,0xfe,0xdb,0xfe,0xa1,0xfe,0x68,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0x98,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0xa9,0x04,0xfc,0x00,0x18,0x00,0x24,0x00,0x95,0x40,0x2b,0x00,0x80,0x14,0xf2,0x05,0x19,0x95,0x07,0x05,0x0a,0x10,0x10,\r\n0x1f,0x95,0x0a,0x16,0x00,0x00,0x17,0xc2,0x03,0x03,0x10,0x05,0x0d,0x07,0x06,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x83,0x22,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x22,0xb8,0xff,0xf7,0xb6,0x0c,0x06,0x4d,0x30,0x22,0x01,0x22,0xb8,0xff,0xe4,0x40,0x27,0x0b,0x06,0x4d,0x22,0x22,0x26,0x1c,0x0a,0x0d,\r\n0x06,0x4d,0x1c,0x0a,0x0c,0x06,0x4d,0x1c,0x0a,0x0b,0x06,0x4d,0x1c,0x83,0x0d,0x10,0x0d,0x06,0x4d,0x0d,0x0e,0x0c,0x06,0x4d,0x0d,0x19,0x0b,0x06,0x4d,0x0d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,\r\n0xed,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x33,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,0x10,0x86,0x13,0xdb,0x82,0xfe,0xeb,0xe9,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0x30,0x56,0x3d,0x6d,0x3b,\r\n0x4f,0xfe,0x3a,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x04,0xfc,0x38,0x50,0xc0,0x28,0x8d,0xfb,0xf5,0xfe,0xd9,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0x0e,0x0a,0x47,0x32,0x49,0xfe,0xcc,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x06,0x96,0x00,0x17,0x00,0x86,0x40,0x33,0x25,0x0a,0x35,0x0a,\r\n0x02,0x25,0x08,0x35,0x08,0x02,0x12,0x80,0x17,0xda,0x0c,0x0c,0x05,0x03,0x09,0x91,0x02,0x13,0x12,0x12,0x10,0xc2,0x15,0x15,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x0b,0x18,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xd8,0x40,0x18,0x0c,0x06,0x4d,0x0b,0x0b,0x19,0x07,0x08,0x0d,0x06,0x4d,0x07,\r\n0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7e,0x04,0xb8,0xff,0xfc,0x40,0x0c,0x0c,0x06,0x4d,0x04,0x04,0x0b,0x06,0x4d,0x04,0x30,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x33,0x10,0xfd,0x1a,0xcc,0x31,0x30,0x5d,0x5d,\r\n0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0x93,0x3c,0x4f,0x15,0x88,0x12,0xfb,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x47,0x31,0x4a,0x3a,0x38,0x50,\r\n0xd2,0x1f,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0xc7,0x04,0xfc,0x00,0x1b,0x00,0x92,0x40,0x32,0x06,0x40,0x10,0x00,0x4d,0x0d,0x10,0x0b,0x0c,0x00,0x4c,0x17,0x80,0x1b,0xf2,0x10,0x08,0x0f,0x02,0x0c,0x95,0x05,0x16,0x00,0x15,0x16,0x16,0x14,0xc2,0x19,0x19,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,\r\n0x00,0x84,0x02,0x0f,0xb8,0xff,0xe0,0x40,0x32,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,0x0f,0x08,0x0b,0x06,0x4d,0x7f,0x0f,0x01,0x0f,0x0f,0x1d,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x09,0x0c,0x06,0x4d,0x07,0x06,0x0b,0x06,0x4d,0x07,0x2f,0x1d,0x01,0x5d,0x2f,0x2b,0x2b,0xe1,\r\n0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xd4,0xfd,0x1a,0xcd,0x31,0x30,0x2b,0x2b,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x03,0xe2,\r\n0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x7a,0x3b,0x4f,0x14,0x86,0x13,0xe5,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x47,0x32,0x49,0x3a,0x38,0x50,0xc6,0x24,0x00,0x00,0x01,0x00,0xab,0x04,0xc2,0x01,0xc4,0x06,0x27,0x00,0x11,0x00,0x2b,0x40,0x16,0x0f,0xe2,0x40,0x02,0xc0,0x0b,0x40,0x08,\r\n0x09,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xd5,0x1a,0xcd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0xab,0x25,0x2b,0x58,0x71,0x4d,0x39,0x6c,0x70,0x5e,0x11,0x28,0x06,\r\n0x23,0x04,0x54,0x47,0x3d,0x54,0x07,0x32,0x73,0x4c,0x3f,0x08,0x00,0x01,0x00,0xf2,0xfe,0xc6,0x01,0xb8,0xff,0x89,0x00,0x0b,0x00,0x15,0x40,0x09,0x00,0xc1,0x06,0x09,0xc0,0x03,0x03,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x55,0x29,0x3a,0x3c,\r\n0x27,0x29,0x3a,0x3a,0xfe,0xc6,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x01,0x00,0x66,0x04,0xc2,0x01,0xc2,0x05,0xb8,0x00,0x03,0x00,0x0e,0xb4,0x03,0x01,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0xc2,0x7e,0xde,0xa8,0x04,0xc2,0xf6,0x00,0x01,0x00,0x64,0x04,0xc2,0x01,0xc0,0x05,0xb8,\r\n0x00,0x03,0x00,0x0e,0xb4,0x01,0x03,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x64,0xb4,0xa8,0xdc,0x04,0xc2,0xf6,0xf6,0x00,0x02,0x00,0x42,0x04,0xc2,0x03,0x90,0x06,0x50,0x00,0x03,0x00,0x0a,0x00,0x2e,0xb1,0x01,0x00,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x00,0x00,0x0a,0x04,0x02,0x80,0x00,\r\n0x00,0x80,0x04,0x90,0x04,0xa0,0x04,0x03,0x04,0xc0,0x08,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x39,0x2f,0x2b,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x07,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x34,0xb4,0xa8,0xdd,0x3d,0x79,0xa4,0xa6,0x71,0xd8,0x84,0x05,0x5a,0xf6,0xf6,0x98,0x94,0x94,0xfa,0x00,0x00,0x02,0x00,0x42,\r\n0x04,0xc2,0x03,0x90,0x06,0x50,0x00,0x03,0x00,0x0a,0x00,0x36,0xb1,0x03,0x00,0xb8,0xff,0xc0,0x40,0x1b,0x09,0x0c,0x48,0x00,0x00,0x06,0x80,0x07,0x80,0x07,0x90,0x07,0xa0,0x07,0x03,0x07,0xc0,0x04,0x40,0x0f,0x13,0x48,0x04,0x04,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0x1a,0xcc,0x5d,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0xcd,\r\n0x31,0x30,0x01,0x23,0x27,0x33,0x13,0x37,0x33,0x17,0x23,0x27,0x07,0x01,0x9e,0x7e,0xde,0xa8,0x73,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x05,0x5a,0xf6,0xfe,0x72,0xfa,0xfa,0x94,0x94,0x00,0x02,0x00,0x6c,0x04,0xc2,0x03,0x68,0x06,0xbe,0x00,0x11,0x00,0x18,0x00,0x45,0x40,0x26,0x0f,0xe2,0x40,0x02,0xc0,0x0b,0x40,0x08,0x09,0x09,0x17,0x16,\r\n0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x40,0x11,0x11,0x0b,0x0b,0x80,0x12,0x90,0x12,0xa0,0x12,0x03,0x12,0xc0,0x16,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0xc6,0xc6,0x1a,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xcd,0x39,0x2f,0xd5,0x1a,0xcd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,\r\n0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x50,0x24,0x2c,0x59,0x6f,0x4b,0x39,0x6d,0x71,0x5f,0x11,0x28,0x4e,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x06,0xba,0x04,0x53,0x48,0x3c,0x54,0x07,0x32,0x73,0x4b,0x40,0x08,0xfe,0x72,0x94,0x94,0xfa,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,\r\n0x00,0x12,0x00,0x19,0x00,0x41,0x40,0x23,0x12,0x07,0xda,0x0c,0x10,0xda,0x40,0x03,0x09,0x40,0x0d,0x10,0x48,0x09,0x19,0x80,0x13,0x13,0x00,0x17,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x1b,0x1a,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x10,0xc6,0x10,0xc4,0x00,0x2f,0x1a,0xdd,0xd6,0x2b,0xd6,\r\n0x1a,0xfd,0xdc,0xed,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x3b,0x79,0xa4,0xa6,0x70,0xd7,0x85,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,\r\n0x26,0x26,0x61,0xfd,0xde,0x94,0x94,0xfa,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x34,0x40,0x19,0x02,0x80,0x00,0x04,0x0a,0x0d,0xd9,0x40,0x07,0x02,0x80,0x00,0x00,0x0b,0x0f,0xf3,0x04,0x0b,0xf3,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x11,0x39,0x2f,0x1a,\r\n0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0xc4,0xd4,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x37,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xd7,0xb5,0xa7,0xdd,0xf4,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x05,0xaa,0xf6,0xf6,0x14,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0x38,0x04,0xc2,0x02,0x5c,\r\n0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x36,0x40,0x1a,0x03,0x80,0x01,0x0a,0x04,0x07,0xd9,0x40,0x0d,0x02,0x80,0x00,0x00,0x05,0x09,0xf3,0x0a,0x05,0xf3,0x04,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0xc4,0xd4,0x1a,0xcd,0x31,0x30,0x01,0x23,\r\n0x27,0x33,0x07,0x33,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x01,0xaa,0x7f,0xdd,0xa8,0xbe,0x66,0x10,0x9e,0xa2,0x0a,0x64,0x04,0x96,0x74,0x70,0x9c,0x05,0xaa,0xf6,0xe2,0x86,0x86,0x72,0x8a,0x8c,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x07,0x0a,0x00,0x11,0x00,0x1d,0x00,0x5e,0x40,0x37,0x0f,0xe2,0x40,0x00,0x02,0x10,\r\n0x02,0x20,0x02,0x03,0x02,0xc0,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x0b,0x08,0x09,0x09,0x1b,0x12,0x18,0x1b,0xd9,0x40,0x15,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x0b,0x18,0x1d,0xf3,0x12,0x19,0xf3,0x18,0x18,0x12,0x1f,0x1e,0x11,0x12,0x39,0x39,0x10,0xe1,0x10,0xe1,0x11,0x39,0x2f,0xc6,0xcd,0x1a,0xdc,\r\n0x5d,0x71,0xe1,0x00,0x2f,0x1a,0xfd,0xd4,0xc4,0x12,0x39,0x2f,0xd5,0xcd,0x5d,0x1a,0xdc,0x5d,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xcd,0x25,0x2a,0x5b,0x6f,0x50,0x36,0x6c,0x70,0x5e,0x11,0x28,\r\n0x01,0x7d,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x07,0x06,0x04,0x54,0x48,0x3c,0x54,0x07,0x31,0x72,0x4c,0x40,0x08,0xde,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x1e,0x00,0x50,0x40,0x2c,0x12,0x07,0xda,0x0c,0x10,0xda,0x03,0x0a,0x40,0x0d,0x11,0x48,\r\n0x0a,0x1e,0x19,0x1c,0xd9,0x16,0x1e,0xf3,0x13,0x13,0x00,0x12,0x1a,0xf3,0x19,0x19,0x09,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x20,0x1f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xfd,0xdc,0xc4,0xd6,0x2b,0xd4,0xfd,0xdc,0xed,0xc6,\r\n0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x34,0x0a,0x9d,0x6f,0x76,0x94,0x05,0x65,0x0a,0xa2,0x9c,0x12,0x06,0xe4,0x65,\r\n0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfe,0xda,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x01,0x00,0xab,0x04,0xc2,0x01,0xc4,0x06,0x27,0x00,0x11,0x00,0x3d,0xb3,0x0f,0xe2,0x40,0x02,0xb8,0xff,0xc0,0xb5,0x09,0x0c,0x48,0x02,0xc0,0x0b,0xb8,0xff,0xe8,0x40,0x14,0x09,0x0c,0x48,0x0b,0x40,0x08,0x09,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,\r\n0x01,0x05,0x80,0x08,0x11,0x0b,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xd5,0x1a,0xcd,0x2b,0x1a,0xdc,0x2b,0x1a,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0xab,0x25,0x2b,0x58,0x71,0x4d,0x39,0x6c,0x70,0x5e,0x11,0x28,0x06,0x23,0x04,0x54,0x47,0x3d,0x54,\r\n0x07,0x32,0x73,0x4c,0x3f,0x08,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x19,0x00,0x50,0xb3,0x00,0x07,0xda,0x0c,0xb8,0xff,0xc0,0x40,0x09,0x09,0x0c,0x48,0x0c,0x10,0xda,0x40,0x03,0x09,0xb8,0xff,0xc0,0x40,0x1a,0x09,0x0c,0x48,0x09,0x19,0x80,0x17,0x13,0x13,0x00,0x17,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,\r\n0x00,0x01,0x0a,0x00,0x0a,0x00,0x1b,0x1a,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x10,0xc6,0x10,0xc4,0x00,0x2f,0xc4,0x1a,0xdd,0xd6,0x2b,0xd6,0x1a,0xfd,0xdc,0x2b,0xed,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x23,0x27,0x07,0x23,0x37,0x33,\r\n0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x3b,0x79,0xa4,0xa6,0x70,0xd7,0x85,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfd,0xde,0x94,0x94,0xfa,0x00,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x3b,0xb3,0x02,0x00,0x04,0x0a,0xb8,0xff,0xc0,\r\n0x40,0x18,0x09,0x0c,0x48,0x0a,0x0d,0xd9,0x40,0x07,0x02,0x80,0x00,0x00,0x0b,0x0f,0xf3,0x04,0x0b,0xf3,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x11,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0x2b,0xc4,0xd4,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x37,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,\r\n0x33,0x32,0x37,0xd7,0xb5,0xa7,0xdd,0xf4,0x0a,0x9d,0x70,0x75,0x94,0x05,0x64,0x0b,0xa1,0x9d,0x12,0x05,0xaa,0xf6,0xf6,0x14,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x02,0x00,0x38,0x04,0xc2,0x02,0x5c,0x06,0xa0,0x00,0x03,0x00,0x0f,0x00,0x3d,0xb3,0x03,0x01,0x0a,0x04,0xb8,0xff,0xc0,0x40,0x19,0x09,0x0c,0x48,0x04,0x07,0xd9,0x40,0x0d,\r\n0x02,0x80,0x00,0x00,0x05,0x09,0xf3,0x0a,0x05,0xf3,0x04,0x0a,0x04,0x0a,0x04,0x11,0x10,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0xdc,0x2b,0xc4,0xd4,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x07,0x33,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x01,0xaa,0x7f,0xdd,0xa8,\r\n0xbe,0x66,0x10,0x9e,0xa2,0x0a,0x64,0x04,0x96,0x74,0x70,0x9c,0x05,0xaa,0xf6,0xe2,0x86,0x86,0x72,0x8a,0x8c,0x00,0x00,0x02,0x00,0x25,0x04,0xc2,0x02,0x4a,0x07,0x0a,0x00,0x11,0x00,0x1d,0x00,0x68,0x40,0x0d,0x0f,0xe2,0x10,0x02,0x20,0x02,0x30,0x02,0xf0,0x02,0x04,0x02,0x0b,0xb8,0xff,0xd8,0x40,0x0a,0x0d,0x10,0x48,0x0b,0x08,0x09,\r\n0x09,0x1b,0x12,0x18,0xb8,0xff,0xc0,0x40,0x21,0x09,0x0c,0x48,0x18,0x1b,0xd9,0x40,0x15,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x11,0x0b,0x0b,0x18,0x1d,0xf3,0x12,0x19,0xf3,0x18,0x18,0x12,0x1f,0x1e,0x11,0x12,0x39,0x39,0x10,0xe1,0x10,0xe1,0x11,0x39,0x2f,0xc6,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0x1a,0xfd,\r\n0xd4,0x2b,0xc4,0x12,0x39,0x2f,0xd5,0xcd,0x2b,0xd4,0x5d,0xed,0x31,0x30,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0xcd,0x25,0x2a,0x5b,0x6f,0x50,0x36,0x6c,0x70,0x5e,0x11,0x28,0x01,0x7d,0x0a,0x9d,0x70,0x75,0x94,0x05,\r\n0x64,0x0b,0xa1,0x9d,0x12,0x07,0x06,0x04,0x54,0x48,0x3c,0x54,0x07,0x31,0x72,0x4c,0x40,0x08,0xde,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x00,0x02,0x00,0xa9,0x04,0xc2,0x03,0x2a,0x06,0xe4,0x00,0x12,0x00,0x1e,0x00,0x5c,0xb3,0x12,0x07,0xda,0x0c,0xb8,0xff,0xc0,0xb7,0x09,0x0c,0x48,0x0c,0x10,0xda,0x03,0x0a,0xb8,0xff,0xc0,0x40,0x23,\r\n0x09,0x0c,0x48,0x0a,0x1e,0x19,0x1c,0xd9,0x16,0x1e,0xf3,0x13,0x13,0x00,0x12,0x1a,0xf3,0x19,0x19,0x09,0x0a,0x12,0xc4,0x00,0x09,0xc4,0x0f,0x00,0x01,0x0a,0x00,0x0a,0x00,0x20,0x1f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0xfd,0xdc,0xc4,0xd6,0x2b,0xd4,0xfd,\r\n0xdc,0x2b,0xed,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x37,0x03,0x2a,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x34,0x0a,0x9d,0x6f,0x76,0x94,0x05,0x65,0x0a,0xa2,0x9c,\r\n0x12,0x06,0xe4,0x65,0x75,0x25,0x25,0x5c,0xd7,0x26,0x26,0x61,0xfe,0xda,0x71,0x8b,0x8a,0x72,0x86,0x86,0x00,0x02,0x00,0x6c,0x04,0xc2,0x03,0x68,0x06,0xbe,0x00,0x11,0x00,0x18,0x00,0x5e,0x40,0x0c,0x0f,0xe2,0x0f,0x02,0x01,0x02,0x40,0x0d,0x10,0x48,0x02,0x0b,0xb8,0xff,0xe8,0xb6,0x09,0x0c,0x48,0x0b,0x40,0x08,0x09,0xb8,0xff,0xc0,\r\n0x40,0x21,0x09,0x0c,0x48,0x09,0x09,0x17,0x16,0x0d,0xc2,0x4f,0x05,0x01,0xcf,0x05,0x01,0x05,0x80,0x08,0x40,0x11,0x11,0x0b,0x0b,0x80,0x12,0x90,0x12,0xa0,0x12,0x03,0x12,0xc0,0x16,0x2f,0x1a,0xcc,0x5d,0x39,0x2f,0xc6,0xc6,0x1a,0xcd,0x1a,0xdc,0x5d,0x71,0xe1,0x00,0x2f,0xcd,0x39,0x2f,0x2b,0xd5,0x1a,0xcd,0x2b,0xdc,0x2b,0x5d,0xed,\r\n0x31,0x30,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x32,0x35,0x34,0x23,0x22,0x07,0x13,0x23,0x27,0x07,0x23,0x37,0x33,0x02,0x50,0x24,0x2c,0x59,0x6f,0x4b,0x39,0x6d,0x71,0x5f,0x11,0x28,0x4e,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x06,0xba,0x04,0x53,0x48,0x3c,0x54,0x07,0x32,0x73,0x4b,0x40,0x08,0xfe,0x72,0x94,0x94,\r\n0xfa,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x0b,0xb6,0x02,0x18,0x13,0x19,0x06,0x07,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x04,0x18,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,\r\n0x00,0x0e,0xb9,0x00,0x02,0xff,0xf7,0xb4,0x23,0x29,0x0f,0x00,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x85,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x7c,0x01,0x5e,0x00,0x16,0xb9,0x00,0x02,0xff,0xf2,0x40,0x09,0x1a,0x19,0x0b,0x0b,0x3e,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x27,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x44,0x00,0xf4,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0b,0x31,0x25,0x10,0x14,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xad,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,\r\n0x02,0x48,0x01,0x2e,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf4,0x40,0x0a,0x16,0x16,0x06,0x07,0x25,0x03,0x02,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0x52,0x06,0x50,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x48,0x00,0xc2,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,\r\n0x00,0x28,0x24,0x10,0x14,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xad,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x49,0x00,0x13,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf7,0x40,0x0a,0x15,0x16,0x06,0x07,0x25,0x03,0x02,0x1a,0x05,0x26,\r\n0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xe8,0xff,0xe8,0x03,0x83,0x06,0x50,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x49,0xa6,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x25,0x26,0x0d,0x12,0x25,0x03,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,\r\n0x08,0x1c,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x56,0x01,0x07,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,0x40,0x0a,0x27,0x28,0x06,0x07,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0xe9,0x06,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4a,\r\n0x00,0x81,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf3,0x40,0x0a,0x37,0x38,0x0d,0x12,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x3f,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x51,0x00,0xa3,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,\r\n0x40,0x0a,0x28,0x29,0x06,0x07,0x25,0x03,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xe4,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x4b,0x2f,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x05,0x38,0x39,0x0d,0x12,0x25,0x03,0x02,0x37,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,\r\n0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x07,0x6b,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0xd7,0x01,0x11,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x1e,0x40,0x0c,0x02,0x14,0x05,0x26,0x03,0x17,0x1a,0x20,0x05,0x00,0x3e,0x02,0xb8,0xff,0xf4,0xb4,0x14,0x10,0x06,0x07,0x3e,0x2b,0x35,0x2b,\r\n0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x06,0x0e,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0x97,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x24,0x11,0x26,0x03,0x29,0x2a,0x30,0x08,0x14,0x3e,0x02,0x1f,0x24,0x20,0x08,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,\r\n0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xfb,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x52,0x01,0x59,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x1a,0x14,0x06,0x07,0x25,0x03,0x02,0x17,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xa0,\r\n0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4c,0x00,0xe5,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x06,0x27,0x2d,0x0d,0x12,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0xfc,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x53,0x01,0x43,0x01,0x5c,\r\n0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfa,0x40,0x0a,0x14,0x1a,0x06,0x07,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0xa0,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4d,0x00,0xe5,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x1f,0x27,0x2d,0x0d,0x12,0x25,\r\n0x03,0x02,0x2d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x65,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x54,0x01,0x64,0x01,0x5b,0x00,0x2c,0xb1,0x03,0x02,0xb8,0xff,0xfb,0x40,0x1a,0x1a,0x19,0x06,0x07,0x25,0x03,0x6f,0x25,0x8f,0x25,0x02,0x02,0x20,0x25,0x30,0x25,\r\n0x50,0x25,0x60,0x25,0x80,0x25,0x05,0x25,0x05,0x26,0x00,0x2b,0x71,0x35,0x71,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x07,0x0a,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x02,0x4e,0x00,0xe5,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfc,0x40,0x0a,0x2a,0x29,0x0d,0x12,0x25,0x03,0x02,0x35,0x11,0x26,\r\n0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x08,0x3f,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x02,0x55,0x00,0xad,0x01,0x5b,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x1a,0x10,0x06,0x07,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,\r\n0x03,0x83,0x06,0xe4,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x02,0x4f,0x35,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x36,0x3c,0x0d,0x12,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0xc6,0x05,0x12,0x07,0x1a,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x00,0xda,0x01,0x5e,\r\n0x01,0x5c,0x01,0x07,0x02,0x45,0x01,0x56,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x13,0x05,0x26,0x03,0x17,0x20,0x26,0x05,0x00,0x3e,0x02,0x02,0x16,0x10,0x06,0x07,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xc6,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x00,0x27,0x00,0xda,0x00,0xdc,0x00,0x00,\r\n0x01,0x07,0x02,0x45,0x00,0xc2,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x23,0x11,0x26,0x03,0x29,0x30,0x36,0x08,0x14,0x3e,0x02,0x25,0x26,0x20,0x08,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xf3,0x00,0x00,0x00,0x0b,\r\n0xb6,0x01,0x10,0x0f,0x15,0x02,0x0b,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xf2,0x00,0x00,0x00,0x0b,0xb6,0x02,0x27,0x1d,0x23,0x19,0x13,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x83,0x02,0x26,0x00,0x28,\r\n0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x0d,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0c,0x1d,0x11,0x02,0x0b,0x3e,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x27,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x19,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x30,0x2b,0x1f,\r\n0x19,0x13,0x3e,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x0e,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xdc,0x01,0x5c,0x00,0x17,0x40,0x0e,0x01,0x07,0x16,0x0c,0x02,0x0b,0x3e,0x01,0x00,0x16,0x01,0x16,0x05,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xb2,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xc8,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0d,0x24,0x1a,0x0c,0x12,0x25,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x6f,0x07,0xab,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,\r\n0x02,0x48,0x00,0xdf,0x01,0x5b,0x00,0x17,0x40,0x0d,0x02,0x01,0x13,0x14,0x10,0x02,0x03,0x25,0x02,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x5a,0x06,0x50,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x48,0x00,0xca,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf0,\r\n0x40,0x0a,0x23,0x24,0x16,0x0f,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xb4,0x07,0xad,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x49,0xff,0xcc,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x19,0x10,0x13,0x02,0x03,0x25,0x02,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,\r\n0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0c,0xff,0xe8,0x03,0xdd,0x06,0x50,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x02,0x49,0xca,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x1f,0x20,0x16,0x0f,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x20,0x08,0x1a,\r\n0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x56,0x00,0xb8,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x15,0x22,0x1e,0x02,0x03,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x32,0x06,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0x4a,0x00,0xca,0x00,0x00,\r\n0x00,0x17,0x40,0x0d,0x03,0x02,0x19,0x31,0x32,0x16,0x0f,0x25,0x03,0x02,0x30,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x08,0x40,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0x51,0x00,0x4e,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x0f,0x23,0x1f,0x02,0x03,0x25,0x02,0x01,\r\n0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0xe4,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x02,0x4b,0x47,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x10,0x31,0x2d,0x19,0x13,0x25,0x03,0x02,0x31,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,\r\n0xfe,0xc6,0x03,0xb4,0x07,0x6b,0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xbf,0x01,0x5d,0x01,0x07,0x02,0x45,0x00,0xea,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x10,0x05,0x26,0x02,0x07,0x16,0x1c,0x01,0x00,0x3e,0x01,0xb8,0xff,0xfd,0xb4,0x10,0x0c,0x01,0x00,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x60,\r\n0xfe,0xc6,0x03,0xdd,0x06,0x0e,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xb4,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xef,0x00,0x00,0x00,0x1b,0x40,0x12,0x02,0x1e,0x11,0x26,0x03,0x26,0x24,0x2a,0x0c,0x12,0x3e,0x02,0x0c,0x1e,0x1a,0x0c,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x9a,0x00,0x00,\r\n0x01,0xb3,0x07,0x83,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x02,0x50,0xff,0xef,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0d,0x02,0x03,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x88,0x00,0x00,0x01,0xa1,0x06,0x27,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x02,0x44,0xdd,0x00,0x00,0x13,\r\n0x40,0x0b,0x01,0x00,0x0e,0x0d,0x02,0x03,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xb2,0xfe,0xc6,0x01,0x78,0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x06,0x02,0x45,0xc0,0x00,0x00,0x0b,0xb6,0x01,0x05,0x07,0x0d,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x01,0x66,\r\n0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x06,0x02,0x45,0xa3,0x00,0x00,0x0e,0xb9,0x00,0x02,0xff,0xfd,0xb4,0x13,0x19,0x03,0x09,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x05,0xaa,0x05,0xb2,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xa8,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0xff,0xf9,0xb4,0x1b,0x21,\r\n0x03,0x09,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x50,0x04,0x18,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x06,0x00,0x00,0x00,0x0b,0xb6,0x02,0x03,0x1b,0x21,0x03,0x09,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x83,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x50,\r\n0x01,0xf6,0x01,0x5c,0x00,0x16,0xb9,0x00,0x02,0xff,0xee,0x40,0x09,0x22,0x21,0x0c,0x06,0x3e,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x27,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x43,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe7,0x40,0x09,0x22,0x21,0x0c,\r\n0x06,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xad,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x48,0x01,0xb3,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1e,0x1e,0x0c,0x0c,0x25,0x03,0x02,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,\r\n0x00,0x60,0xff,0xe8,0x04,0x98,0x06,0x50,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x48,0x01,0x08,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x1e,0x1e,0x0c,0x0c,0x25,0x03,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xad,0x02,0x26,0x00,0x32,0x00,0x00,\r\n0x01,0x07,0x02,0x49,0x00,0x94,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x21,0x21,0x0c,0x06,0x25,0x03,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x30,0xff,0xe8,0x04,0x50,0x06,0x50,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0x49,0xee,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,\r\n0x40,0x0a,0x21,0x21,0x06,0x06,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x1a,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x56,0x01,0x78,0x01,0x5c,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xed,0x40,0x0a,0x2f,0x30,0x0c,0x06,0x25,0x03,0x02,0x2e,0x05,0x26,\r\n0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xbe,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0x4a,0x00,0xe5,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x2c,0x2c,0x06,0x06,0x25,0x03,0x02,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,\r\n0xff,0xe8,0x05,0xaa,0x08,0x40,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0x51,0x01,0x29,0x01,0x5c,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x2d,0x2d,0x0c,0x06,0x25,0x03,0x02,0x2f,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xe4,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,\r\n0x02,0x4b,0x70,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf5,0x40,0x0a,0x30,0x31,0x0c,0x06,0x25,0x03,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x05,0xaa,0x07,0x6b,0x02,0x26,0x00,0x32,0x00,0x00,0x00,0x27,0x00,0xd7,0x01,0xa4,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0xb0,0x00,0x00,\r\n0x00,0x1b,0x40,0x12,0x02,0x1c,0x05,0x26,0x03,0x01,0x22,0x28,0x03,0x09,0x3e,0x02,0x16,0x1c,0x18,0x03,0x09,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x50,0x06,0x0e,0x02,0x26,0x00,0x52,0x00,0x00,0x00,0x27,0x00,0xd7,0x00,0xf7,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xfe,0x00,0x00,0x00,0x1e,\r\n0xb4,0x02,0x1c,0x11,0x26,0x03,0xb8,0xff,0xfb,0x40,0x0c,0x22,0x28,0x03,0x09,0x3e,0x02,0x15,0x1c,0x18,0x03,0x09,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x07,0x67,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x0e,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x00,0x27,0x27,0x18,0x18,\r\n0x25,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x0a,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x61,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x26,0x26,0x10,0x10,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,\r\n0xff,0xe8,0x06,0x3a,0x07,0x67,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xc8,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x0a,0x27,0x27,0x18,0x18,0x25,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x0a,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x02,\r\n0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xfc,0x40,0x09,0x26,0x26,0x19,0x19,0x25,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,0x07,0x83,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x02,0x50,0x02,0x0c,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x00,0x30,0x2f,0x18,0x18,0x25,0x02,0x2f,0x05,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x06,0x27,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x45,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe9,0x40,0x09,0x2f,0x2e,0x19,0x10,0x25,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x06,0x3a,\r\n0x07,0x0e,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0xb0,0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x0f,0x30,0x26,0x15,0x0f,0x25,0x02,0x30,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0xa9,0x05,0xb2,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xf8,0x00,0x00,0x00,0x13,\r\n0x40,0x0b,0x02,0x03,0x2f,0x25,0x0d,0x07,0x3e,0x02,0x2f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0xc6,0x06,0x3a,0x06,0x3e,0x02,0x26,0x02,0x40,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xac,0x00,0x00,0x00,0x0b,0xb6,0x02,0x03,0x2c,0x2c,0x12,0x12,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0xc6,\r\n0x04,0xa9,0x04,0xfc,0x02,0x26,0x02,0x41,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x02,0x00,0x00,0x00,0x0b,0xb6,0x02,0x05,0x2b,0x2b,0x0a,0x0a,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xfe,0xc6,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x66,0x00,0x00,0x00,0x0b,0xb6,0x01,0x07,0x14,0x14,0x02,\r\n0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xd1,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xfb,0xb4,0x18,0x18,0x0c,0x0c,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x83,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,\r\n0x02,0x50,0x01,0x97,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1f,0x13,0x05,0x0d,0x3e,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x27,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x22,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x20,0x23,0x17,0x08,0x11,0x3e,0x01,\r\n0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x67,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xb8,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x19,0x19,0x06,0x0c,0x3e,0x01,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,\r\n0x06,0x0a,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x38,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x06,0x1d,0x1d,0x09,0x10,0x3e,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x67,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x7a,0x01,0x5d,0x00,0x13,\r\n0x40,0x0b,0x01,0x13,0x19,0x19,0x06,0x0c,0x3e,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x06,0x0a,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x23,0x1d,0x1c,0x09,0x10,0x3e,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,\r\n0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x83,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x9d,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe6,0x40,0x09,0x22,0x21,0x06,0x0c,0x3e,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x06,0x27,0x02,0x26,0x02,0x43,\r\n0x00,0x00,0x01,0x07,0x02,0x44,0x01,0x27,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x26,0x25,0x09,0x10,0x3e,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x07,0x0e,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x66,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x0a,\r\n0x22,0x18,0x06,0x0c,0x3e,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x04,0xc7,0x05,0xb2,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xdd,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x07,0x26,0x1c,0x08,0x1b,0x3e,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0xaa,0xfe,0xc6,0x05,0xd0,0x06,0x96,0x02,0x26,0x02,0x42,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x66,0x00,0x00,0x00,0x0b,0xb6,0x01,0x07,0x1e,0x1e,0x02,0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xfe,0xc6,0x04,0xc7,0x04,0xfc,0x02,0x26,0x02,0x43,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe5,0x00,0x00,0x00,0x0b,0xb6,0x01,\r\n0x00,0x1f,0x25,0x0a,0x01,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0xfe,0xc6,0x04,0x60,0x05,0x9a,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xdf,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x11,0x17,0x03,0x02,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x02,0x26,0x00,0x5c,0x00,0x00,\r\n0x01,0x07,0x02,0x45,0x01,0xc2,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xec,0xb4,0x15,0x1b,0x14,0x14,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x83,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x02,0x50,0x01,0x1a,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x18,0x1f,0x13,0x05,0x00,0x3e,0x01,0x18,0x05,0x26,0x00,\r\n0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x27,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x02,0x44,0x00,0xc9,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x26,0x1a,0x0c,0x00,0x3e,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x07,0x0e,0x02,0x26,\r\n0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xde,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x08,0x18,0x0e,0x05,0x00,0x3e,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0xb2,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x8b,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,\r\n0xfd,0x40,0x09,0x1f,0x15,0x0c,0x00,0x3e,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x29,0xfe,0x85,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x01,0x9c,0x00,0x93,0x00,0x00,0x00,0x0b,0xb6,0x01,0x1d,0x0b,0x0b,0x03,0x03,0x3e,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x85,0x02,0x81,\r\n0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x06,0x01,0x9c,0x2a,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xe7,0xb4,0x17,0x15,0x04,0x00,0x3e,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x67,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x0e,\r\n0x0c,0x02,0x0b,0x3e,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x0a,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xe5,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xd9,0x40,0x09,0x1c,0x1a,0x19,0x13,0x3e,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,\r\n0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x67,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xda,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x16,0x14,0x0b,0x01,0x3e,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x06,0x0a,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,\r\n0x00,0x43,0x00,0xde,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb4,0x40,0x09,0x11,0x0f,0x07,0x0d,0x3e,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,\r\n0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4c,0x00,0x00,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4d,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0xf6,0x05,0x9a,0x00,0x0d,0x00,0x5b,0x40,0x2c,0x05,0x08,0x91,0x02,0x0b,0x0b,0x07,0x01,0x91,0x0c,0x03,0x07,0x09,0x08,0x04,0x00,0x04,0x00,\r\n0x0f,0x02,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x7e,0x0b,0x08,0x08,0x0d,0x06,0x4d,0x08,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x08,0xb8,0xff,0xe0,0xb3,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x00,0x2f,0x3f,0xed,0x12,\r\n0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x03,0xf6,0xfd,0xc0,0x01,0x5a,0xfe,0xa6,0xa8,0xe5,0xe5,0x02,0xe8,0x05,0x02,0xfe,0x36,0x9a,0xfd,0x62,0x02,0x9e,0x9a,0x02,0x62,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x29,0x04,0x00,0x00,0x0d,0x00,0x5e,0x40,0x27,0x05,0x08,\r\n0x96,0x02,0x0b,0x0b,0x07,0x01,0x95,0x0c,0x0f,0x07,0x09,0x07,0x04,0x00,0x04,0x00,0x0f,0x02,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x0b,0x07,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0c,0x06,0x4d,0x07,0xb8,0xff,0xe4,0xb3,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,\r\n0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xc6,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x03,0x29,0xfe,0x6b,0x01,0x02,0xfe,0xfe,0xa4,0xd2,0xd2,0x02,0x39,0x03,0x74,0xfe,0xe2,0x85,0xfe,0x2f,0x01,0xd1,0x85,0x01,\r\n0xaa,0x00,0x00,0x01,0xff,0xea,0xfe,0x80,0x07,0x0a,0x05,0x9a,0x00,0x21,0x00,0xae,0x40,0x13,0x13,0x0d,0x1c,0x04,0x04,0x10,0x1f,0x10,0x0e,0x12,0x20,0x91,0x03,0x40,0x1d,0x17,0x12,0x03,0x01,0xb8,0x01,0x30,0xb3,0x09,0x03,0x0e,0x02,0xb8,0x01,0x2c,0x40,0x09,0x21,0x1d,0x1e,0x1e,0x08,0x20,0x03,0x02,0x21,0xb8,0xff,0xf8,0x40,0x26,\r\n0x0c,0x06,0x4d,0x21,0x0e,0x08,0x12,0x11,0x11,0x09,0x0e,0x0f,0x0f,0x09,0x42,0x0f,0x1f,0x18,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x7e,0x17,0x10,0x09,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xf4,0x40,0x11,0x0c,0x06,0x4d,0x09,0x13,0x0b,0x06,0x4d,0x09,0x09,0x23,0x22,0x2f,\r\n0x23,0x3f,0x23,0x02,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x33,0x10,0xe0,0x2b,0x11,0x33,0x33,0x11,0x39,0x2f,0x33,0x10,0xe1,0x00,0x2f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x1a,0x10,0xed,0x11,0x12,0x39,0x39,0x11,0x17,0x33,0x31,0x30,0x01,0x23,\r\n0x11,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x07,0x0a,0x99,0x50,0xfd,0xcf,0x18,0x0d,0x05,0x9f,0x04,0x0f,0x16,0xfd,0xcf,0xe3,0x02,0x91,0xfd,0x9b,0xce,0x02,0x1a,0x17,0x0e,0x04,0x9f,0x05,0x0d,0x18,0x02,0x1a,\r\n0xcd,0xfd,0x9b,0x02,0x0d,0x8b,0xfe,0x80,0x01,0x80,0x02,0x90,0x1c,0x16,0xfd,0x3e,0x02,0xc2,0x19,0x19,0xfd,0x70,0x02,0xe8,0x02,0xb2,0xfd,0x93,0x1b,0x16,0x02,0x9e,0xfd,0x62,0x16,0x1b,0x02,0x6d,0xfd,0x4e,0xfd,0xae,0x00,0x01,0x00,0x04,0xfe,0x8b,0x06,0x00,0x04,0x00,0x00,0x19,0x00,0xa4,0xb9,0x00,0x01,0x01,0x31,0x40,0x15,0x04,\r\n0x09,0x0f,0x14,0x04,0x0c,0x17,0x0c,0x07,0x15,0x0e,0x11,0x0f,0x18,0x96,0x03,0x40,0x0a,0x03,0x07,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x19,0xb8,0x01,0x2c,0x40,0x2c,0x02,0x15,0x16,0x16,0x06,0x18,0x03,0x02,0x02,0x19,0x0e,0x06,0x0e,0x0d,0x0d,0x07,0x0a,0x0b,0x0b,0x07,0x42,0x0b,0x17,0x12,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,\r\n0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x11,0x0c,0x07,0xb8,0xff,0xf0,0x40,0x11,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x0c,0x0b,0x06,0x4d,0x07,0x07,0x1a,0x1b,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x33,0x10,0xe0,0x32,0x2f,\r\n0x33,0x33,0x11,0x39,0x2f,0x33,0x10,0xe1,0x2b,0x00,0x2f,0x33,0x33,0x1a,0x10,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x33,0x06,0x00,0x8c,0x5c,0xfe,0x36,0x04,0x9c,0x04,0xfe,\r\n0x35,0xdb,0x01,0xfc,0xfe,0x23,0xd1,0x01,0xb6,0x04,0x9c,0x04,0x01,0xb6,0xd3,0xfe,0x21,0x01,0x81,0x87,0xfe,0x8b,0x01,0x75,0x01,0xfa,0xfe,0x06,0x01,0xfa,0xfe,0x06,0x02,0x10,0x01,0xf0,0xfe,0x21,0x01,0xdf,0xfe,0x21,0x01,0xdf,0xfe,0x10,0xfe,0x71,0x00,0x01,0x00,0xbc,0xfe,0x80,0x04,0xa8,0x05,0x9a,0x00,0x14,0x00,0x87,0xb9,0x00,\r\n0x01,0x01,0x30,0x40,0x1c,0x0f,0x04,0x12,0x12,0x08,0x10,0x0b,0x03,0x13,0x91,0x02,0x02,0x08,0x10,0x11,0x11,0x08,0x14,0x08,0x0d,0x06,0x4d,0x14,0x08,0x0c,0x06,0x4d,0x14,0xb8,0x01,0x2c,0xb2,0x13,0x03,0x02,0xb8,0xff,0xf8,0x40,0x1a,0x0d,0x06,0x4d,0x02,0x02,0x16,0x12,0x0b,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,\r\n0x08,0x0b,0x06,0x4d,0x08,0x7e,0x09,0xb8,0xff,0xf4,0xb3,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfc,0xb3,0x0b,0x06,0x4d,0x09,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x11,0x33,0x2f,0x2b,0x33,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x33,0x00,0x2f,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,\r\n0x33,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x04,0xa8,0x9a,0x50,0xfd,0xd0,0x1b,0x0b,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x0c,0x8c,0xfe,0x80,0x01,0x80,0x02,0x90,0x20,0x12,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,\r\n0x02,0x71,0xfd,0x4e,0xfd,0xae,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x00,0x04,0x00,0x00,0x10,0x00,0x7b,0xb9,0x00,0x01,0x01,0x31,0x40,0x1d,0x0f,0x96,0x03,0x0b,0x04,0x0e,0x0e,0x06,0x0c,0x09,0x0f,0x11,0x03,0x06,0x0c,0x0d,0x0d,0x06,0x10,0x08,0x0d,0x06,0x4d,0x10,0x08,0x0c,0x06,0x4d,0x10,0xb8,0x01,0x2c,0x40,0x19,0x0f,0x03,0x02,\r\n0x02,0x12,0x0e,0x09,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0xb8,0xff,0xf8,0x40,0x0e,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x11,0x39,0x2f,0x33,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x33,0x00,\r\n0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x33,0x04,0x00,0x8c,0x64,0xfe,0x3e,0x04,0xa4,0xa4,0x04,0x01,0xae,0xd9,0xfe,0x23,0x01,0x7f,0x89,0xfe,0x8b,0x01,0x75,0x01,0xea,0xfe,0x16,0x04,0x00,0xfe,0x2d,0x01,0xd3,\r\n0xfe,0x10,0xfe,0x71,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x18,0x00,0xaa,0x40,0x51,0x00,0x03,0x10,0x03,0x20,0x03,0x03,0x03,0x03,0x02,0x0a,0x0f,0x14,0x1f,0x14,0x2f,0x14,0x03,0x14,0x14,0x0d,0x15,0x12,0x11,0x0f,0x16,0x0f,0x11,0x16,0x0f,0x06,0x05,0x02,0x01,0x08,0x01,0x06,0x08,0x01,0x0f,0x08,0x18,0x18,0x0a,\r\n0x16,0x0d,0x03,0x01,0x0a,0x15,0x02,0x12,0x0f,0x05,0x01,0x05,0x05,0x00,0x16,0x17,0x17,0x01,0x19,0x00,0x29,0x00,0x02,0x0f,0x00,0x01,0x00,0x00,0x1a,0x08,0x0d,0x0f,0x18,0x04,0x0a,0x7e,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x2f,0x2b,0x2b,0x2b,0xe1,\r\n0x17,0x32,0x11,0x39,0x2f,0x5d,0x5d,0x33,0x39,0x2f,0x33,0x11,0x39,0x2f,0x5d,0x33,0xcd,0x32,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x11,0x12,0x01,0x39,0x10,0x87,0x04,0xc0,0xc0,0xc0,0x11,0x12,0x01,0x39,0x10,0x87,0x04,0xc0,0xc0,0xc0,0x11,0x00,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x31,0x30,0x21,0x23,0x01,0x11,\r\n0x23,0x11,0x27,0x26,0x35,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x37,0x11,0x33,0x15,0x01,0x33,0x01,0x04,0xa2,0xea,0xfe,0x58,0x4c,0x36,0x26,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x36,0x4c,0x01,0x96,0xd1,0xfd,0x99,0x01,0xf4,0xfe,0xf2,0x01,0x68,0x42,0x2f,0x03,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x3f,0x01,0x52,0xf8,0x01,\r\n0xd8,0xfd,0x50,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf4,0x04,0x00,0x00,0x14,0x00,0x81,0x40,0x4c,0x1f,0x04,0x01,0x50,0x04,0x60,0x04,0x02,0x04,0x04,0x02,0x08,0x5f,0x0f,0x6f,0x0f,0x02,0x0f,0x0f,0x0b,0x11,0x0e,0x0d,0x12,0x0d,0x05,0x02,0x01,0x06,0x01,0x0d,0x06,0x14,0x14,0x08,0x12,0x0b,0x0f,0x01,0x08,0x11,0x02,0x0e,0x05,\r\n0x05,0x00,0x12,0x38,0x13,0x48,0x13,0x02,0x13,0x13,0x01,0x0f,0x00,0xaf,0x00,0x02,0x39,0x00,0x49,0x00,0x02,0x00,0x00,0x16,0x06,0x0b,0x0d,0x14,0x04,0x08,0x84,0x09,0x2f,0xe1,0x17,0x32,0x11,0x39,0x2f,0x5d,0x5d,0x33,0x39,0x2f,0x5d,0x33,0x11,0x39,0x2f,0x33,0xcd,0x32,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x11,0x33,0x33,0x10,0x87,\r\n0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x11,0x00,0x39,0x2f,0x5d,0x11,0x12,0x39,0x2f,0x5d,0x5d,0x31,0x30,0x21,0x23,0x01,0x15,0x23,0x11,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x37,0x35,0x33,0x15,0x01,0x33,0x01,0x03,0xf4,0xe4,0xfe,0xe6,0x4c,0x5c,0x04,0xa4,0xa4,0x04,0x5c,0x4c,0x01,0x06,0xd9,0xfe,0x23,0x01,0x33,0xc1,0x01,0x13,0x65,\r\n0xfe,0x16,0x04,0x00,0xfe,0x2d,0x65,0xed,0x9b,0x01,0x1c,0xfe,0x10,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x05,0xb2,0x05,0x9a,0x00,0x0f,0x00,0xb7,0x40,0x0b,0x05,0x91,0x40,0x0a,0x09,0x06,0x0a,0x91,0x2b,0x30,0x01,0xb8,0x01,0x30,0x40,0x13,0x0e,0x91,0x03,0x0c,0x09,0x03,0x03,0x06,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x08,0x0c,0x06,0x4d,\r\n0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xe8,0x40,0x19,0x0c,0x06,0x4d,0x02,0x02,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x7e,0x0b,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xe0,0x40,0x1e,0x0c,0x06,0x4d,0x03,0x10,0x0b,0x06,0x4d,\r\n0x03,0x03,0x11,0x09,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x7e,0x07,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x07,0xb8,0xff,0xf7,0xb3,0x0c,0x06,0x4d,0x07,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x7d,0x2f,0x2b,0x2b,0xe1,\r\n0x2b,0x2b,0x00,0x18,0x2f,0x33,0x3f,0x33,0x10,0xed,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0xb2,0x9b,0xcd,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0xc0,0xfe,0x80,0x01,0x80,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xfe,0x00,\r\n0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x90,0x04,0x00,0x00,0x0f,0x00,0x9c,0xb9,0x00,0x01,0x01,0x31,0x40,0x13,0x0e,0x95,0x03,0x05,0x95,0x40,0x0a,0x09,0x06,0x0a,0x95,0x2b,0x30,0x0c,0x09,0x0f,0x03,0x06,0x02,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x02,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x0f,0xba,0x01,0x2c,0x00,0x02,0xff,0xf8,0x40,\r\n0x40,0x0d,0x06,0x4d,0x02,0x02,0x11,0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x84,0x0b,0x03,0x03,0x0d,0x06,0x4d,0x03,0x03,0x0b,0x06,0x4d,0x03,0x03,0x11,0x0a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x84,0x07,0x08,0x0d,0x06,0x4d,0x07,0x40,0x11,\r\n0x01,0x5d,0x2f,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x11,0x39,0x2f,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x11,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x00,0x2f,0x33,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x10,0xed,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x04,0x90,0x8e,0xae,0xfd,0xf6,\r\n0xa4,0xa4,0x02,0x0a,0xa4,0x98,0xfe,0x8b,0x01,0x75,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfc,0x8c,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x0e,0xfe,0x29,0x03,0xd5,0x04,0x00,0x00,0x0c,0x00,0x68,0x40,0x0c,0x03,0x1b,0x04,0x42,0x01,0x01,0x0d,0x0c,0x06,0x0f,\r\n0x0c,0x00,0xb8,0xff,0xf8,0x40,0x24,0x0c,0x06,0x4d,0x00,0x0e,0x01,0x06,0x05,0x04,0x05,0x42,0x05,0x08,0x01,0x08,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0x08,0x0b,0x06,0x4d,0x01,0x84,0x04,0x07,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xf4,0x40,0x0a,0x0c,0x06,0x4d,0x04,0x04,0x0e,0x0d,0x4f,0x0e,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,\r\n0x2b,0xe1,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0x11,0x01,0x33,0x10,0xe1,0x2b,0x32,0x00,0x18,0x3f,0x33,0x12,0x39,0x7d,0x2f,0x18,0xe5,0x3f,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x17,0x33,0x36,0x37,0x01,0x03,0xd5,0xfe,0x69,0xa4,0xfe,0x74,0xb6,0x01,0x0d,0x1d,0x02,0x0a,0x16,0x01,0x1b,0x04,0x00,0xfc,0x06,0xfe,0x23,0x01,\r\n0xdf,0x03,0xf8,0xfd,0x04,0x64,0x22,0x46,0x02,0xf8,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x14,0x00,0x7d,0x40,0x16,0x11,0x0d,0x07,0x04,0x97,0x40,0x0a,0x01,0x01,0x06,0x14,0x0d,0x03,0x06,0x11,0x10,0x05,0x06,0x03,0x03,0x14,0x00,0xb8,0xff,0xd8,0x40,0x23,0x0b,0x06,0x4d,0x00,0x0e,0x05,0x08,0x08,0x06,0x0d,0x0c,\r\n0x06,0x0c,0x42,0x0c,0x01,0x05,0x08,0x0d,0x06,0x4d,0x05,0x08,0x0c,0x06,0x4d,0x05,0x08,0x0b,0x06,0x4d,0x05,0x7e,0x0b,0x06,0xb8,0xff,0xf8,0x40,0x0a,0x0b,0x06,0x4d,0x06,0x06,0x16,0x15,0x20,0x16,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x10,0xe0,0x2b,0x32,\r\n0x39,0x2f,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0x33,0x1a,0xed,0x32,0x12,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x04,0x60,0xfe,0x27,0x01,0x52,0xfe,0xae,0xa8,0xfe,0xb7,0x01,0x49,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x0a,\r\n0x1c,0x01,0x50,0x05,0x9a,0xfc,0x72,0x85,0xfe,0x79,0x01,0x87,0x85,0x02,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x22,0x36,0x02,0x88,0x00,0x01,0x00,0x0e,0xfe,0x29,0x03,0xd5,0x04,0x00,0x00,0x12,0x00,0x60,0x40,0x35,0x04,0x1b,0x02,0x05,0x96,0x08,0x40,0x0c,0x0c,0x08,0x10,0x0a,0x0f,0x12,0x08,0x00,0x00,0x10,0x11,0x0e,0x02,0x07,0x07,0x05,\r\n0x0a,0x09,0x09,0x05,0x42,0x09,0x0d,0x0c,0x12,0x02,0x08,0x0d,0x06,0x4d,0x02,0x84,0x08,0x05,0x07,0x0d,0x06,0x4d,0x05,0x05,0x14,0x13,0x4f,0x14,0x01,0x5d,0x11,0x12,0x39,0x2f,0x2b,0x33,0xe1,0x2b,0x32,0x39,0x39,0x2f,0x2b,0x11,0x01,0x33,0x12,0x39,0x18,0x2f,0x10,0xe0,0x32,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x1a,\r\n0x10,0xed,0x32,0x3f,0x31,0x30,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x01,0x33,0x01,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x03,0x92,0xfe,0xac,0xa4,0xfe,0xb4,0x01,0x4c,0xfe,0x74,0xb6,0x01,0x0d,0x1d,0x02,0x0a,0x16,0x01,0x1b,0xaa,0xfe,0x69,0x85,0xfe,0xae,0x01,0x52,0x85,0x04,0x00,0xfd,0x04,0x64,0x22,0x46,0x02,0xf8,0xfc,\r\n0x00,0x00,0x00,0x01,0x00,0x1a,0xfe,0x80,0x04,0xc6,0x05,0x9a,0x00,0x19,0x00,0x5f,0xb9,0x00,0x01,0x01,0x30,0x40,0x20,0x06,0x11,0x17,0x03,0x0c,0x0c,0x0a,0x15,0x0e,0x03,0x18,0x91,0x03,0x1a,0x03,0x0a,0x06,0x0c,0x11,0x17,0x04,0x0d,0x15,0x16,0x0e,0x0d,0x16,0x0d,0x16,0x0d,0x0b,0x19,0xb8,0x01,0x2c,0x40,0x0d,0x18,0x03,0x03,0x02,\r\n0x10,0x0d,0x06,0x4d,0x02,0x02,0x1b,0x0a,0x0b,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x33,0x11,0x33,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x12,0x17,0x39,0x00,0x2f,0x33,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,\r\n0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x01,0x33,0x04,0xc6,0x98,0x61,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xe0,0xfe,0x46,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,0x3d,0x01,0x6b,0x8a,0xfe,0x80,0x01,0x80,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0xd1,0x02,0xc9,0xfe,0x08,0x32,0x32,0x42,\r\n0x26,0x01,0xf4,0xfd,0x39,0xfd,0xc3,0x00,0x00,0x01,0x00,0x1a,0xfe,0x8b,0x03,0xb4,0x04,0x00,0x00,0x17,0x00,0x5f,0xb9,0x00,0x01,0x01,0x31,0x40,0x20,0x06,0x11,0x15,0x03,0x0c,0x0c,0x0a,0x13,0x0e,0x0f,0x16,0x96,0x02,0x18,0x02,0x0a,0x06,0x0c,0x11,0x15,0x04,0x0d,0x13,0x14,0x0e,0x0d,0x14,0x0d,0x14,0x0d,0x0b,0x17,0xb8,0x01,0x2c,\r\n0x40,0x0d,0x16,0x03,0x03,0x02,0x08,0x0d,0x06,0x4d,0x02,0x02,0x19,0x0a,0x0b,0x2f,0x33,0x12,0x39,0x2f,0x2b,0x33,0x11,0x33,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x12,0x17,0x39,0x00,0x2f,0x33,0x33,0x10,0xed,0x3f,0x33,0x12,0x39,0x11,0x17,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,\r\n0x23,0x01,0x01,0x33,0x13,0x16,0x17,0x33,0x01,0x33,0x01,0x13,0x33,0x03,0xb4,0x8b,0x5c,0xc9,0x15,0x18,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x15,0x16,0x04,0x01,0x00,0xb5,0xfe,0xa8,0xfb,0x7f,0xfe,0x8b,0x01,0x75,0x01,0x4c,0x23,0x2b,0x09,0x45,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x26,0x2a,0x01,0xae,0xfd,\r\n0xfa,0xfe,0x87,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x17,0x00,0xa0,0x40,0x40,0x11,0x11,0x0c,0x0f,0x06,0x06,0x01,0x04,0x02,0x15,0x07,0x91,0x0f,0x15,0x15,0x13,0x16,0x0f,0x0f,0x01,0x16,0x0c,0x03,0x01,0x05,0x06,0x12,0x11,0x40,0x0c,0x15,0x11,0x7f,0x2b,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,\r\n0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x15,0x01,0x1e,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x18,0x0b,0x06,0x4d,0x01,0x01,0x19,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x7e,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x0b,0x0c,0x0b,0x06,0x4d,0x0b,0x2f,\r\n0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x1a,0x18,0x10,0xcd,0x33,0x32,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x10,0xed,0x11,0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x11,0x23,0x11,0x06,0x26,0x35,0x11,0x33,0x11,\r\n0x14,0x33,0x33,0x11,0x33,0x11,0x36,0x37,0x11,0x33,0x04,0x81,0xa8,0xa7,0x88,0x4c,0xce,0xea,0xa8,0xf6,0x1a,0x4c,0x86,0xa9,0xa8,0x02,0x85,0x58,0x17,0xfe,0xae,0x01,0x4a,0x0f,0xc3,0xbd,0x02,0x1b,0xfd,0xed,0xe7,0x01,0x6a,0xfe,0x9e,0x14,0x52,0x02,0x8c,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x03,0xdf,0x04,0x00,0x00,0x16,0x00,0x8e,\r\n0x40,0x5b,0x10,0x10,0x0b,0x0e,0x06,0x06,0x01,0x04,0x02,0x07,0x14,0x14,0x12,0x15,0x0e,0x95,0x07,0x07,0x01,0x15,0x0b,0x0f,0x01,0x05,0x06,0x11,0x10,0x40,0x0b,0x14,0x10,0x85,0x2b,0x30,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x84,0x14,0x01,0x01,0x18,0x0b,0x08,0x0d,0x06,0x4d,0x0b,0x08,\r\n0x0c,0x06,0x4d,0x0b,0x08,0x0b,0x06,0x4d,0x0b,0x84,0x0a,0x05,0x0d,0x06,0x4d,0x0a,0x05,0x0c,0x06,0x4d,0x0a,0x04,0x0b,0x06,0x4d,0x0a,0x2f,0x18,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x33,0xe1,0x2b,0x2b,0x2b,0x2b,0x01,0x1a,0x18,0x10,0xcd,0x33,0x32,0x00,0x2f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x39,\r\n0x39,0x2f,0x12,0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x15,0x23,0x35,0x04,0x11,0x11,0x33,0x11,0x14,0x33,0x33,0x11,0x33,0x11,0x36,0x37,0x11,0x33,0x03,0xdf,0xa3,0x76,0x66,0x4c,0xfe,0x84,0xa4,0xc2,0x16,0x4c,0x6e,0x6e,0xa3,0x01,0x9c,0x40,0x16,0xd4,0xca,0x1c,0x01,0x86,0x01,0x5a,0xfe,\r\n0xae,0xe1,0x01,0x25,0xfe,0xe5,0x14,0x38,0x01,0xdd,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x10,0x00,0x73,0x40,0x27,0x0b,0x06,0x04,0x91,0x0d,0x0d,0x07,0x0a,0x03,0x01,0x07,0x00,0x08,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x01,0x1e,0x0d,0x06,0x4d,0x01,0x08,0x0c,0x06,0x4d,\r\n0x01,0xb8,0xff,0xfc,0x40,0x19,0x0b,0x06,0x4d,0x01,0x01,0x12,0x0b,0x07,0x08,0x0d,0x06,0x4d,0x07,0x08,0x0c,0x06,0x4d,0x07,0x08,0x0b,0x06,0x4d,0x07,0x7e,0x08,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x08,0x0c,0x0b,0x06,0x4d,0x08,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x00,\r\n0x2f,0x33,0x3f,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x16,0x15,0x04,0x81,0xa8,0xf5,0xb4,0xe2,0xa8,0xa8,0xe4,0xc6,0xba,0xcf,0x02,0x12,0xe8,0x6e,0xfd,0x74,0x05,0x9a,0xfd,0x7a,0x7a,0xc2,0xb2,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,\r\n0x02,0x06,0x00,0x4b,0x00,0x00,0x00,0x02,0x00,0x56,0xff,0xe8,0x05,0x66,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x77,0x40,0x29,0x12,0x91,0x01,0x20,0x01,0x50,0x01,0x02,0x01,0x09,0x16,0x2f,0x06,0x01,0x06,0x06,0x04,0x91,0x09,0x04,0x16,0x91,0x0f,0x13,0x06,0x06,0x00,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x7d,0x01,\r\n0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x06,0x4d,0x12,0x12,0x1a,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x7d,0x00,0x10,0x0d,0x06,0x4d,0x00,0x08,0x0c,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0xe1,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x33,0xe1,0x2b,0x2b,0x11,0x39,0x2f,0x00,0x3f,0xed,\r\n0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x5d,0x2f,0xed,0x31,0x30,0x13,0x21,0x26,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x25,0x21,0x16,0x12,0x33,0x32,0x00,0x56,0x04,0x5e,0x11,0xfe,0xe5,0xda,0xd8,0x9c,0x9e,0xe2,0x01,0x3f,0x01,0x6d,0xfe,0x94,0xfe,0xd3,0xfe,0xd1,0xfe,0xb8,0x04,0x5e,0xfc,\r\n0x56,0x04,0xf2,0xcf,0xcf,0x01,0x02,0x03,0x1a,0xed,0x01,0x13,0x60,0xa4,0x54,0xfe,0x76,0xfe,0xa5,0xfe,0xbe,0xfe,0x5d,0x01,0x9f,0xfc,0xeb,0xfe,0xe7,0x01,0x18,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0x56,0x40,0x23,0x06,0x40,0x0b,0x0e,0x48,0x06,0x06,0x04,0x13,0x95,0x01,0x01,0x17,0x04,\r\n0x95,0x09,0x10,0x17,0x95,0x0f,0x16,0x80,0x06,0x90,0x06,0x02,0x06,0x06,0x0c,0x00,0x13,0x14,0x0c,0x83,0x01,0xb8,0xff,0xf8,0x40,0x0e,0x0d,0x06,0x4d,0x01,0x01,0x1b,0x14,0x83,0x00,0x10,0x0d,0x06,0x4d,0x00,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0xe1,0x12,0x39,0x11,0x12,0x39,0x2f,0x5d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,\r\n0x12,0x39,0x2f,0x2b,0x31,0x30,0x13,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x02,0x35,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x52,0x02,0xd3,0x04,0xb0,0x9a,0xae,0x90,0x86,0xdf,0xd9,0xf8,0xfe,0xf1,0xc8,0xcb,0xdb,0x02,0xd1,0xfd,0xd7,0x02,0x84,0x7a,0x74,0xa3,0x02,0x29,0xab,0xba,0x72,0x9a,\r\n0x62,0xfe,0xea,0xfe,0xf2,0xfe,0xd6,0x01,0x06,0xe5,0x35,0x8d,0x9f,0xa6,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x12,0x00,0x19,0x00,0x63,0x40,0x18,0x14,0x91,0x40,0x12,0x06,0x00,0x12,0x91,0x2b,0x30,0x0f,0x91,0x06,0x04,0x17,0x91,0x00,0x13,0x09,0x7d,0x12,0x0c,0x14,0x13,0xb8,0xff,0xf0,0xb3,0x0d,0x06,\r\n0x4d,0x13,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x13,0xb8,0xff,0xe0,0x40,0x18,0x0b,0x06,0x4d,0x13,0x13,0x1b,0x14,0x7d,0x03,0x10,0x0d,0x06,0x4d,0x03,0x10,0x0c,0x06,0x4d,0x03,0x18,0x0b,0x06,0x4d,0x03,0x2f,0x2b,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x12,0x39,0x39,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,\r\n0xed,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x00,0x23,0x22,0x00,0x07,0x05,0x21,0x16,0x00,0x33,0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xc0,0x12,0xfe,0xfd,0xd7,0xd0,0xfe,0xee,0x16,0x03,0xe4,0xfc,0x1c,0x15,0x01,0x0c,0xcb,0xdc,0x01,\r\n0x09,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x03,0x30,0xf5,0x01,0x0d,0xfe,0xe8,0xea,0x9b,0xea,0xfe,0xec,0x01,0x0b,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x6b,0x40,0x18,0x13,0x95,0x40,0x11,0x06,0x00,0x11,0x95,0x2b,0x30,0x0e,0x95,\r\n0x06,0x10,0x16,0x95,0x00,0x16,0x11,0x0c,0x13,0x09,0x83,0x12,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xf0,0xb6,0x0c,0x06,0x4d,0x30,0x12,0x01,0x12,0xb8,0xff,0xde,0x40,0x1b,0x0b,0x06,0x4d,0x12,0x12,0x19,0x13,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,\r\n0x2f,0x2b,0x2b,0x2b,0xe1,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x20,0x02,0x52,0xe4,0xfe,0xf2,0x01,0x1a,0xf0,0xe5,0x01,0x01,\r\n0xfe,0xeb,0x67,0x29,0xfe,0xe5,0x88,0xb1,0x17,0x02,0x98,0xfd,0x64,0x0a,0xb7,0x93,0x01,0x33,0x18,0x01,0x20,0xec,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x74,0x01,0x32,0xa0,0x92,0x8b,0xa3,0xbc,0x00,0x00,0x02,0x00,0x3e,0x06,0x1e,0x02,0x3a,0x07,0xcf,0x00,0x03,0x00,0x07,0x00,0x2d,0xb2,0x02,0x80,0x01,0xb8,0xff,\r\n0xc0,0x40,0x12,0x09,0x0c,0x48,0x01,0x06,0xe2,0x05,0x02,0x62,0x00,0x01,0x00,0x00,0x05,0x04,0x04,0x09,0x05,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0x21,0x35,0x21,0x01,0xaa,0x7f,0xdd,0xa8,0x01,0x44,0xfe,0x04,0x01,0xfc,0x06,0xd9,0xf6,0xfe,0x4f,0x6e,\r\n0x00,0x02,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x06,0x72,0x00,0x03,0x00,0x07,0x00,0x24,0x40,0x11,0x02,0x80,0x01,0x06,0xe2,0x05,0x02,0x62,0x00,0x01,0x00,0x00,0x05,0x04,0x04,0x09,0x05,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xde,0x1a,0xcd,0x31,0x30,0x01,0x23,0x27,0x33,0x01,0x21,0x35,0x21,0x01,0xaa,0x7f,0xdd,\r\n0xa8,0x01,0x44,0xfe,0x04,0x01,0xfc,0x05,0x7d,0xf5,0xfe,0x50,0x6d,0x00,0x00,0x02,0x00,0x3e,0x06,0x1e,0x02,0x3a,0x07,0xcf,0x00,0x03,0x00,0x07,0x00,0x2d,0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x12,0x09,0x0c,0x48,0x00,0x05,0xe2,0x04,0x02,0x6d,0x00,0x01,0x00,0x00,0x04,0x07,0x07,0x09,0x04,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,\r\n0x5d,0xcd,0x00,0x2f,0xfd,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x05,0x35,0x21,0x15,0xcd,0xb4,0xa8,0xdd,0xfe,0xf2,0x01,0xfc,0x06,0xd9,0xf6,0xf6,0xbb,0x6e,0x6e,0x00,0x02,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x06,0x72,0x00,0x03,0x00,0x07,0x00,0x24,0x40,0x11,0x01,0x80,0x00,0x05,0xe2,0x04,0x02,0x6d,0x00,0x01,0x00,0x00,\r\n0x04,0x07,0x07,0x09,0x04,0x2f,0x12,0x39,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0x00,0x2f,0xfd,0xde,0x1a,0xcd,0x31,0x30,0x13,0x37,0x33,0x07,0x05,0x35,0x21,0x15,0xcd,0xb4,0xa8,0xdd,0xfe,0xf2,0x01,0xfc,0x05,0x7d,0xf5,0xf5,0xbb,0x6d,0x6d,0x00,0x00,0x03,0x00,0x7d,0x06,0x1e,0x02,0xc4,0x07,0xd1,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x44,\r\n0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x20,0x09,0x0c,0x48,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x02,0x01,0x0f,0x03,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1c,0x1d,0x19,0x07,0x2b,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x5f,0x5e,0x5d,0x00,0x2f,0x33,0xed,0x32,0x39,0x2f,0x2b,\r\n0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x50,0xb4,0xa8,0xdd,0x93,0x28,0x3a,0x38,0x28,0x2a,0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x3b,0x27,0x29,0x3c,0x3a,0x06,0xdb,0xf6,0xf6,0xbd,0x39,0x2a,0x2a,0x39,0x3a,\r\n0x29,0x29,0x3a,0x3b,0x28,0x2a,0x39,0x3a,0x29,0x29,0x3a,0x00,0x00,0x03,0x00,0x7d,0x04,0xc2,0x02,0xc4,0x06,0x74,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x3b,0x40,0x1f,0x01,0x80,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x02,0x01,0x0f,0x03,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1c,0x1d,0x19,0x07,0x2b,0x3a,0x2b,\r\n0x01,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x5f,0x5e,0x5d,0x00,0x2f,0x33,0xed,0x32,0x39,0x2f,0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x50,0xb4,0xa8,0xdd,0x93,0x28,0x3a,0x38,0x28,0x2a,\r\n0x3a,0x38,0xfe,0x56,0x2a,0x3b,0x39,0x29,0x29,0x3c,0x3a,0x05,0x7f,0xf5,0xf5,0xbd,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x3b,0x28,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x02,0x00,0xa9,0x06,0x0c,0x03,0x2a,0x08,0x08,0x00,0x03,0x00,0x16,0x00,0x54,0xb9,0x00,0x01,0xff,0xc0,0x40,0x0f,0x09,0x0d,0x48,0x01,0x80,0x03,0x40,0x10,0x15,\r\n0x48,0x03,0x16,0x10,0xda,0x0b,0xb8,0xff,0xc0,0x40,0x1e,0x09,0x0c,0x48,0x0b,0x14,0xda,0x07,0x0d,0x02,0x20,0x0a,0x0d,0x48,0x02,0x5f,0x00,0x6f,0x00,0x02,0x00,0x00,0x0e,0x04,0xc4,0x16,0x16,0x18,0x0d,0xc4,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xcd,0x2b,0x00,0x2f,0xd6,0xed,0xdc,0x2b,0xfd,0xc6,0xd6,0x2b,0x1a,\r\n0xcd,0x2b,0x31,0x30,0x01,0x37,0x33,0x07,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x62,0xb4,0xa8,0xdc,0x01,0x48,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x07,0x12,0xf6,0xf6,0x1a,0x65,0x75,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0x00,0x02,\r\n0x00,0xa9,0x04,0xb2,0x03,0x2a,0x06,0xae,0x00,0x03,0x00,0x16,0x00,0x3e,0xb2,0x01,0x80,0x00,0xb8,0xff,0xc0,0x40,0x1d,0x09,0x0c,0x48,0x00,0x16,0x10,0xda,0x0b,0x14,0xda,0x07,0x0d,0x02,0x5f,0x00,0x6f,0x00,0x02,0x00,0x00,0x0e,0x04,0xc4,0x16,0x16,0x18,0x0d,0xc4,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xcd,0x00,\r\n0x2f,0xd6,0xed,0xdc,0xfd,0xc6,0xde,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x37,0x33,0x07,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x62,0xb4,0xa8,0xdc,0x01,0x48,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x05,0xb8,0xf6,0xf6,0x1a,0x65,0x75,0x25,\r\n0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x03,0x00,0xa9,0x06,0x0c,0x03,0x2a,0x08,0x02,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x66,0x40,0x10,0x06,0x12,0xc1,0x00,0x00,0x0c,0x10,0x0c,0x02,0x0c,0x03,0x0c,0x2a,0x24,0xda,0x1f,0xb8,0xff,0xc0,0x40,0x10,0x09,0x0c,0x48,0x1f,0x28,0xda,0x40,0x1b,0x21,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x03,0xb8,\r\n0xff,0xc0,0xb3,0x0a,0x0d,0x48,0x15,0xb8,0xff,0xc0,0x40,0x11,0x0a,0x0d,0x48,0x18,0x22,0x03,0x15,0x2b,0x3a,0x18,0xc4,0x2a,0x2a,0x2c,0x21,0xc4,0x22,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x2b,0x2b,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xd6,0x1a,0xed,0xdc,0x2b,0xfd,0xc6,0xd6,0x5f,0x5e,0x5d,0x32,0xed,0x32,0x31,0x30,0x01,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xab,0x29,0x3a,0x39,0x28,0x29,0x3c,0x3a,0xfe,0x56,0x28,0x3c,0x3a,0x28,0x2a,0x3a,0x38,0x01,0xd6,0x5d,0x55,0x43,\r\n0x56,0x57,0x29,0x58,0x5e,0xb6,0x3f,0x52,0x51,0x33,0x54,0x07,0x3e,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x46,0x65,0x75,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0x00,0x00,0x03,0x00,0xa9,0x04,0xb2,0x03,0x2a,0x06,0xa8,0x00,0x0b,0x00,0x17,0x00,0x2a,0x00,0x3f,0x40,0x22,0x06,0x12,0xc1,0x00,\r\n0x0c,0x2a,0x24,0xda,0x1f,0x28,0xda,0x40,0x1b,0x21,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x22,0x03,0x15,0x2b,0x3a,0x18,0xc4,0x2a,0x2a,0x2c,0x21,0xc4,0x22,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0xd6,0x1a,0xed,0xdc,0xfd,0xc6,0xde,0x32,0xed,0x32,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x02,0xab,0x29,0x3a,0x39,0x28,0x29,0x3c,0x3a,0xfe,0x56,0x28,0x3c,0x3a,0x28,0x2a,0x3a,0x38,0x01,0xd6,0x5d,0x55,0x43,0x56,0x57,0x29,0x58,0x5e,\r\n0xb6,0x3f,0x52,0x51,0x33,0x54,0x05,0xe4,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x38,0x2a,0x2a,0x38,0x39,0x29,0x2a,0x38,0x46,0x65,0x75,0x25,0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x02,0x00,0x14,0x06,0x1e,0x02,0x12,0x07,0x6a,0x00,0x0b,0x00,0x0f,0x00,0x1f,0x40,0x0e,0x06,0xc1,0x40,0x00,0x00,0x0e,0x80,0x0c,0x03,0xc0,0x09,0x09,\r\n0x0e,0x0c,0x2f,0xcd,0x39,0x2f,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x37,0x33,0x07,0x76,0x28,0x3a,0x39,0x29,0x28,0x3a,0x3a,0x17,0xb5,0xa8,0xde,0x06,0xa8,0x38,0x2a,0x29,0x37,0x37,0x29,0x28,0x3a,0x8a,0xf6,0xf6,0x00,0x02,0x00,0x14,0x04,0xc2,\r\n0x02,0x12,0x06,0x0e,0x00,0x0b,0x00,0x0f,0x00,0x1f,0x40,0x0e,0x06,0xc1,0x40,0x00,0x00,0x0e,0x80,0x0c,0x03,0xc0,0x09,0x09,0x0e,0x0c,0x2f,0xcd,0x39,0x2f,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x37,0x33,0x07,0x76,0x28,0x3a,0x39,0x29,0x28,0x3a,\r\n0x3a,0x17,0xb5,0xa8,0xde,0x05,0x4c,0x38,0x2a,0x29,0x37,0x37,0x29,0x29,0x39,0x8a,0xf6,0xf6,0x00,0x02,0x00,0x1e,0x06,0x1e,0x02,0x51,0x07,0xd7,0x00,0x0b,0x00,0x12,0x00,0x33,0xb3,0x06,0xc1,0x40,0x00,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x00,0x00,0x0f,0x80,0x0e,0x03,0xc0,0x09,0x0c,0x0f,0x09,0xc0,0x2b,0x30,0x0c,0x0c,0x14,\r\n0x0f,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x07,0x23,0x27,0x33,0x17,0x37,0x01,0x34,0x28,0x3a,0x39,0x29,0x29,0x39,0x39,0xf4,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x07,0x14,0x39,0x2a,0x28,0x38,0x37,0x29,\r\n0x29,0x3a,0x04,0xfa,0xfa,0x93,0x93,0x00,0x00,0x02,0x00,0x1e,0x04,0xc2,0x02,0x51,0x06,0x7b,0x00,0x0b,0x00,0x12,0x00,0x2a,0x40,0x15,0x06,0xc1,0x40,0x00,0x00,0x0f,0x80,0x0e,0x03,0xc0,0x09,0x0c,0x0f,0x09,0xc0,0x2b,0x30,0x0c,0x0c,0x14,0x0f,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,\r\n0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x07,0x23,0x27,0x33,0x17,0x37,0x01,0x34,0x28,0x3a,0x39,0x29,0x29,0x39,0x39,0xf4,0xd7,0x86,0xd6,0x70,0xa6,0xa4,0x05,0xb8,0x39,0x29,0x29,0x38,0x37,0x2a,0x28,0x3a,0x04,0xfa,0xfa,0x93,0x93,0x00,0x03,0x00,0x14,0x06,0x1e,0x02,0x5b,0x07,0x9e,0x00,0x0b,\r\n0x00,0x17,0x00,0x1b,0x00,0x39,0xb4,0x06,0x12,0xc1,0x00,0x0c,0xb8,0xff,0xc0,0x40,0x18,0x09,0x0c,0x48,0x0c,0x1a,0xe2,0x40,0x19,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x19,0x03,0x15,0x2b,0x3a,0x18,0x18,0x1d,0x19,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,0x18,0x2f,0x1a,0xfd,0xde,0x2b,0x32,0xed,0x32,0x31,0x30,0x01,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x21,0x35,0x21,0x01,0xf9,0x29,0x3a,0x39,0x28,0x29,0x3b,0x39,0xfe,0x56,0x2b,0x39,0x39,0x29,0x29,0x3b,0x39,0x01,0x99,0xfe,0x04,0x01,0xfc,0x06,0xd9,0x38,0x2b,0x2a,0x38,0x3a,0x28,0x2a,0x39,0x39,0x2a,0x29,\r\n0x39,0x3a,0x28,0x2a,0x39,0xbb,0x6e,0x00,0x00,0x03,0x00,0x14,0x04,0xc2,0x02,0x5b,0x06,0x42,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x30,0x40,0x19,0x06,0x12,0xc1,0x00,0x0c,0x1a,0xe2,0x40,0x19,0x09,0xc0,0x03,0x0f,0xc0,0x15,0x18,0x19,0x03,0x15,0x2b,0x3a,0x18,0x18,0x1d,0x19,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x00,\r\n0x18,0x2f,0x1a,0xfd,0xde,0x32,0xed,0x32,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x21,0x35,0x21,0x01,0xf9,0x29,0x3a,0x39,0x28,0x29,0x3b,0x39,0xfe,0x56,0x2a,0x3a,0x3a,0x28,0x29,0x3b,0x39,0x01,0x99,0xfe,0x04,0x01,0xfc,0x05,0x7d,\r\n0x38,0x2a,0x2a,0x39,0x3a,0x29,0x29,0x39,0x38,0x2a,0x2a,0x39,0x3a,0x29,0x29,0x39,0xbb,0x6d,0xff,0xff,0x00,0xbc,0xfe,0x50,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x8a,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x7d,\r\n0x00,0x00,0xff,0xff,0x00,0x16,0xfe,0x04,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x75,0xf9,0x6c,0x00,0x27,0x40,0x1a,0x03,0x02,0x00,0x13,0x19,0x06,0x07,0x25,0x03,0x02,0x16,0x40,0x09,0x0d,0x36,0x16,0x40,0x0a,0x0b,0x36,0x20,0x16,0x01,0x16,0x14,0x26,0x00,0x2b,0x5d,0x2b,0x2b,0x35,0x35,0x01,\r\n0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x05,0x03,0x83,0x04,0x18,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xe9,0xf9,0x6d,0x00,0x27,0x40,0x1a,0x03,0x02,0x1b,0x23,0x29,0x08,0x00,0x25,0x03,0x02,0x26,0x40,0x09,0x0d,0x36,0x26,0x40,0x0a,0x0b,0x36,0x20,0x26,0x01,0x26,0x17,0x26,0x00,0x2b,0x5d,0x2b,0x2b,0x35,\r\n0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x06,0xe2,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x47,0x01,0x5d,0x00,0x16,0xb9,0x00,0x03,0xff,0xc3,0x40,0x09,0x23,0x29,0x01,0x05,0x25,0x03,0x20,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,\r\n0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8b,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0xad,0x21,0x21,0x05,0x05,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0x2f,0x05,0x9a,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe1,0x00,0x00,0x00,0x1a,0xb9,0x00,\r\n0x03,0xff,0xc1,0x40,0x0c,0x23,0x29,0x00,0x0c,0x25,0x03,0x20,0x26,0x01,0x26,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x1a,0x00,0x00,0x00,0x1a,0xb9,0x00,0x02,0xff,0xf2,0x40,0x0c,0x21,0x27,0x03,0x0c,0x25,0x02,0x20,\r\n0x24,0x01,0x24,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1e,0x04,0x2f,0x05,0x9a,0x02,0x26,0x00,0x25,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5c,0x00,0x1a,0xb9,0x00,0x03,0xff,0xe3,0x40,0x0c,0x21,0x20,0x00,0x0c,0x25,0x03,0x20,0x22,0x01,0x22,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0xa6,0xff,0x1e,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x3f,0xfa,0x5c,0x00,0x17,0x40,0x0e,0x02,0x00,0x1f,0x1e,0x03,0x0c,0x25,0x02,0x20,0x20,0x01,0x20,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xfe,0x50,0x04,0x8c,0x07,0x67,0x02,0x26,0x00,0x26,\r\n0x00,0x00,0x00,0x27,0x00,0xdd,0x02,0x39,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0xf5,0x01,0x5d,0x00,0x08,0xb3,0x02,0x2a,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0x62,0x06,0x0a,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x27,0x00,0xdd,0x01,0x83,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x2f,0x00,0x00,0x00,0x08,0xb3,0x02,\r\n0x2a,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x06,0xe2,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xd2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xa3,0x40,0x09,0x13,0x19,0x01,0x04,0x25,0x02,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,\r\n0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x64,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0x29,0x40,0x09,0x27,0x27,0x0f,0x0f,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x54,0x00,0x00,0x00,0x1a,\r\n0xb9,0x00,0x02,0xff,0xac,0x40,0x0c,0x13,0x19,0x00,0x04,0x25,0x02,0x20,0x16,0x01,0x16,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0xc6,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x02,0x00,0x00,0x00,0x17,0x40,0x0e,0x02,0x1f,0x21,0x27,0x08,0x00,0x25,0x02,0x20,0x24,\r\n0x01,0x24,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1e,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x46,0xfa,0x5c,0x00,0x1a,0xb9,0x00,0x02,0xff,0x85,0x40,0x0c,0x11,0x10,0x00,0x04,0x25,0x02,0x20,0x12,0x01,0x12,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x60,0xff,0x1e,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5c,0x00,0x17,0x40,0x0e,0x02,0x20,0x1f,0x1e,0x08,0x00,0x25,0x02,0x20,0x20,0x01,0x20,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x85,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,\r\n0x00,0x00,0x01,0x07,0x01,0x9d,0x01,0x4a,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xb8,0x40,0x09,0x12,0x10,0x00,0x04,0x25,0x02,0x13,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x85,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x01,0x9d,0x00,0xdd,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x4b,\r\n0x21,0x1e,0x08,0x00,0x25,0x02,0x21,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3d,0x05,0x3e,0x05,0x9a,0x02,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x3f,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x02,0xff,0xb8,0x40,0x09,0x14,0x10,0x00,0x04,0x25,0x02,0x15,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x60,0xfe,0x3e,0x04,0x10,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe0,0xf9,0x7c,0x00,0x13,0x40,0x0b,0x02,0x1e,0x22,0x1e,0x08,0x00,0x25,0x02,0x23,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0xcf,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,\r\n0x02,0xd1,0x00,0xec,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x11,0x10,0x02,0x03,0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x72,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0xd2,0x00,0xe4,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x20,\r\n0x21,0x0c,0x12,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0xcf,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x02,0xd3,0x00,0xfd,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x11,0x13,0x02,0x0b,0x25,0x02,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,\r\n0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x06,0x72,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x02,0xd4,0x00,0xe4,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1f,0x21,0x0c,0x12,0x25,0x03,0x02,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3c,0x03,0xb4,0x05,0x9a,\r\n0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xd9,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x17,0x10,0x0c,0x01,0x00,0x25,0x01,0x11,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x3d,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xda,0xf9,0x7b,0x00,0x13,0x40,0x0b,\r\n0x02,0x32,0x1e,0x1a,0x0c,0x00,0x25,0x02,0x1f,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x9a,0x03,0xb4,0x05,0x9a,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd1,0xf9,0xe8,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x16,0x0c,0x01,0x00,0x25,0x01,0x1f,0x14,0x26,0x00,0x2b,0x35,0x01,\r\n0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x99,0x03,0xdd,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xe1,0xf9,0xe7,0x00,0x13,0x40,0x0b,0x02,0x26,0x24,0x1a,0x0c,0x00,0x25,0x02,0x2d,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x50,0x03,0xb4,0x07,0x1c,0x02,0x26,0x00,0x28,0x00,0x00,\r\n0x00,0x27,0x00,0xdd,0x01,0x8a,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xec,0x01,0x5e,0x00,0x16,0xb9,0x00,0x02,0xff,0xfb,0x40,0x09,0x25,0x1f,0x02,0x03,0x25,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xfe,0x50,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x00,0x27,0x00,0xdd,0x01,0x7d,0x00,0x00,\r\n0x01,0x07,0x00,0xda,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x06,0x33,0x2d,0x0c,0x12,0x25,0x03,0x30,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0x94,0x06,0xe2,0x02,0x26,0x00,0x29,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x4a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x0d,\r\n0x13,0x08,0x09,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0xe2,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x03,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x1e,0x1e,0x0a,0x09,0x25,0x01,0x15,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,\r\n0xff,0xe8,0x04,0xec,0x06,0x8c,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xda,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x80,0x1b,0x1a,0x05,0x0a,0x25,0x01,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x05,0x2f,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x17,\r\n0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x1b,0x27,0x26,0x10,0x18,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x06,0xe2,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x01,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xf8,0x40,0x09,0x0f,0x15,0x06,0x0b,0x25,0x01,0x0c,\r\n0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0xae,0x15,0x15,0x0b,0x0b,0x25,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xf2,0x05,0x9a,\r\n0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x8f,0x00,0x00,0x00,0x17,0x40,0x0e,0x01,0x0d,0x0f,0x15,0x05,0x00,0x25,0x01,0x20,0x12,0x01,0x12,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xe7,0x00,0x00,\r\n0x00,0x1a,0xb9,0x00,0x01,0xff,0xed,0x40,0x0c,0x15,0x1b,0x09,0x00,0x25,0x01,0x20,0x18,0x01,0x18,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x06,0xe4,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x38,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x1b,0x15,0x06,0x0b,0x25,\r\n0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0xe4,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe3,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x16,0x21,0x21,0x0b,0x0b,0x25,0x02,0x01,0x1e,0x02,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,\r\n0xff,0xff,0x00,0xa0,0xfe,0x50,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x00,0x06,0x00,0xdd,0x6d,0x00,0xff,0xff,0x00,0x8c,0xfe,0x50,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x00,0x06,0x00,0xdd,0x59,0x00,0xff,0xff,0x00,0xbc,0xfe,0x8c,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xda,\r\n0x01,0xa6,0xf9,0xca,0x00,0x13,0x40,0x0b,0x01,0x06,0x12,0x0c,0x05,0x00,0x25,0x01,0x12,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xfe,0x8c,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x27,0xf9,0xca,0x00,0x13,0x40,0x0b,0x01,0x0f,0x18,0x12,0x09,0x00,0x25,0x01,0x18,0x17,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xcf,0xfe,0x9c,0x02,0x50,0x05,0x9a,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xac,0xf9,0xea,0x00,0x0b,0xb6,0x01,0x00,0x0e,0x04,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xb9,0xfe,0x9c,0x02,0x3a,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,\r\n0x00,0xd8,0xff,0x96,0xf9,0xea,0x00,0x0b,0xb6,0x02,0x00,0x1a,0x10,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x07,0xd1,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x02,0xd5,0xff,0x75,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x05,0x17,0x11,0x02,0x03,0x25,0x03,0x02,0x01,0x14,0x05,0x26,0x00,\r\n0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0xff,0xd4,0x00,0x00,0x02,0x1b,0x06,0x74,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x02,0xd6,0xff,0x57,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x00,0x17,0x11,0x02,0x03,0x25,0x03,0x02,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,\r\n0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x07,0x65,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x62,0x01,0x5b,0x00,0x16,0xb9,0x00,0x01,0xff,0x8f,0x40,0x09,0x13,0x12,0x08,0x0f,0x25,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x67,0x02,0x26,0x00,0x4e,0x00,0x00,\r\n0x01,0x07,0x00,0x8e,0x00,0xe2,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x1f,0x0f,0x0f,0x07,0x07,0x25,0x01,0x0f,0x02,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x29,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xcf,0x40,0x0c,0x14,\r\n0x1a,0x07,0x00,0x25,0x01,0x20,0x17,0x01,0x17,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc8,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xce,0x40,0x0c,0x10,0x16,0x05,0x00,0x25,0x01,0x20,0x13,0x01,0x13,0x17,0x26,0x00,\r\n0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1c,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x4f,0xfa,0x5a,0x00,0x1a,0xb9,0x00,0x01,0xff,0xdc,0x40,0x0c,0x13,0x14,0x07,0x00,0x25,0x01,0x20,0x13,0x01,0x13,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,\r\n0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x00,0xfa,0x5a,0x00,0x1a,0xb9,0x00,0x01,0xff,0xed,0x40,0x0c,0x0f,0x10,0x05,0x00,0x25,0x01,0x20,0x0f,0x01,0x0f,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,\r\n0x02,0x45,0x00,0xcd,0x00,0x00,0x00,0x1a,0xb9,0x00,0x01,0xff,0xf2,0x40,0x0c,0x09,0x0f,0x01,0x00,0x25,0x01,0x20,0x0c,0x01,0x0c,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x95,0xfe,0xc6,0x01,0x5b,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x06,0x02,0x45,0xa3,0x00,0x00,0x17,0x40,0x0e,0x01,0x00,0x07,0x0d,\r\n0x01,0x00,0x25,0x01,0x20,0x0a,0x01,0x0a,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x03,0xa4,0x06,0x8c,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x27,0x00,0xd9,0x00,0xcf,0x01,0x5d,0x01,0x07,0x02,0x45,0x00,0xcd,0x00,0x00,0x00,0x2c,0xb9,0x00,0x02,0xff,0xf2,0xb5,0x0d,0x13,0x01,0x00,0x25,0x01,\r\n0xb8,0xff,0xdb,0x40,0x10,0x07,0x06,0x02,0x00,0x25,0x02,0x20,0x10,0x01,0x10,0x14,0x26,0x01,0x07,0x05,0x26,0x00,0x2b,0x35,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x2b,0x35,0xff,0xff,0xff,0xfa,0xfe,0xc6,0x01,0xf6,0x06,0x8c,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x27,0x00,0xd9,0xff,0xbc,0x01,0x5d,0x01,0x06,0x02,0x45,0xa2,0x00,0x00,0x29,\r\n0xb9,0x00,0x02,0xff,0xff,0x40,0x17,0x0b,0x11,0x01,0x00,0x3e,0x01,0x00,0x05,0x04,0x01,0x00,0x3e,0x02,0x20,0x0e,0x01,0x0e,0x17,0x26,0x01,0x05,0x02,0x26,0x00,0x2b,0x35,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1c,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfe,\r\n0xfa,0x5a,0x00,0x17,0x40,0x0e,0x01,0x0a,0x08,0x09,0x01,0x00,0x25,0x01,0x20,0x08,0x01,0x08,0x14,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfc,0xff,0x1c,0x01,0xf8,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xbe,0xfa,0x5a,0x00,0x17,0x40,0x0e,0x01,0x00,0x06,0x07,0x01,0x00,0x25,0x01,\r\n0x20,0x06,0x01,0x06,0x17,0x26,0x00,0x2b,0x5d,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x3d,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xbb,0xf9,0x7b,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x06,0x01,0x00,0x25,0x01,0x0b,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdf,\r\n0xfe,0x3e,0x02,0x13,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0x83,0xf9,0x7c,0x00,0x13,0x40,0x0b,0x01,0x00,0x08,0x04,0x01,0x00,0x25,0x01,0x09,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x07,0x67,0x02,0x26,0x00,0x30,0x00,0x00,0x00,0x07,0x00,0x8e,0x02,0x48,\r\n0x01,0x5d,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x06,0x0a,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x32,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x22,0x20,0x13,0x1f,0x25,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x06,0xe2,0x02,0x26,0x00,0x30,0x00,0x00,\r\n0x00,0x07,0x00,0xdb,0x02,0x78,0x01,0x5d,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x05,0x85,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0xac,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x23,0x29,0x13,0x1f,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x06,0x72,\r\n0x05,0x9a,0x02,0x26,0x00,0x30,0x00,0x00,0x00,0x07,0x02,0x45,0x01,0xf2,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x06,0x54,0x04,0x18,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x02,0x45,0x02,0x27,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x23,0x29,0x12,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0xe3,\r\n0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x27,0x01,0x5e,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x17,0x1d,0x0a,0x13,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0x85,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8a,0x00,0x00,0x00,0x13,\r\n0x40,0x0b,0x01,0x09,0x16,0x1c,0x0a,0x12,0x25,0x01,0x13,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0xa0,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,0xf7,0xb4,0x17,0x1d,0x09,0x00,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,\r\n0xfe,0xc6,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x04,0x00,0x00,0x00,0x0b,0xb6,0x01,0x0a,0x16,0x1c,0x0a,0x12,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0x1c,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xbf,0xfa,0x5a,0x00,0x1e,0xb9,0x00,0x01,0xff,\r\n0xfd,0xb6,0x16,0x17,0x0a,0x13,0x25,0x01,0x16,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x16,0x14,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x21,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x0e,0x15,0x16,0x0a,0x12,0x25,0x01,0x15,0xb8,\r\n0xff,0xc0,0xb5,0x09,0x0b,0x36,0x15,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x3c,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x91,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x09,0x18,0x14,0x0a,0x13,0x25,0x01,0x19,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0xa6,0xfe,0x3c,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xe2,0xf9,0x7a,0x00,0x13,0x40,0x0b,0x01,0x09,0x17,0x13,0x0a,0x12,0x25,0x01,0x18,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x08,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd7,\r\n0x01,0x1e,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x26,0x1c,0x03,0x09,0x25,0x03,0x02,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xae,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0xd8,0x6d,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x26,0x1c,0x03,0x09,0x25,\r\n0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x08,0x02,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd9,0x01,0x1b,0x00,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x00,0x3a,0x30,0x03,0x09,0x25,0x04,0x03,0x02,0x3a,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0xa8,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x02,0xda,0x73,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x04,0x3a,0x30,0x03,0x09,0x25,0x04,0x03,0x02,0x3a,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,\r\n0x07,0xcf,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd1,0x01,0xca,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1d,0x1c,0x03,0x09,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x72,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0xd2,0x01,0x1c,\r\n0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1d,0x1f,0x03,0x09,0x25,0x03,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xcf,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x02,0xd3,0x01,0xca,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1c,0x1f,0x03,0x09,0x25,\r\n0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x72,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x02,0xd4,0x01,0x13,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf7,0x40,0x0a,0x1d,0x1f,0x03,0x09,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x07,0x67,0x02,0x26,0x00,0x33,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,0xb9,0x40,0x09,0x15,0x13,0x03,0x07,0x25,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x06,0x0a,0x02,0x26,0x00,0x53,\r\n0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1b,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe7,0x40,0x09,0x20,0x1e,0x04,0x0c,0x25,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x06,0xe2,0x02,0x26,0x00,0x33,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x5c,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0xff,\r\n0xb8,0x40,0x09,0x16,0x1c,0x03,0x07,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0x85,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x9f,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf0,0x40,0x09,0x21,0x27,0x04,0x0c,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,\r\n0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x06,0xe2,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x87,0x01,0x5d,0x00,0x08,0xb3,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xbc,0x05,0x85,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xb6,0x00,0x00,0x00,0x16,0xb9,0x00,\r\n0x01,0xff,0xd3,0x40,0x09,0x14,0x1a,0x08,0x10,0x25,0x01,0x11,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x07,0x02,0x45,0x01,0x33,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x06,0x02,0x45,\r\n0x5a,0x00,0xff,0xff,0x00,0xbc,0xfe,0xc6,0x04,0xc0,0x06,0x8c,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x27,0x00,0xd9,0x01,0x23,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x33,0x00,0x00,0x00,0x08,0xb3,0x02,0x29,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0xa6,0xfe,0xc6,0x02,0xbc,0x05,0x2f,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x26,0x00,0xd9,\r\n0x6c,0x00,0x01,0x06,0x02,0x45,0x5a,0x00,0x00,0x22,0xb9,0x00,0x02,0xff,0xfe,0xb5,0x18,0x1e,0x08,0x10,0x3e,0x01,0xb8,0xff,0xf7,0x40,0x09,0x12,0x11,0x08,0x10,0x3e,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x2b,0x35,0xff,0xff,0x00,0xbc,0xff,0x1b,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x00,0xd9,\r\n0x01,0x5c,0xfa,0x59,0x00,0x11,0xb1,0x02,0x2a,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x2a,0x14,0x26,0x00,0x2b,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0xff,0x1d,0x02,0xc7,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x8d,0xfa,0x5b,0x00,0x1c,0x40,0x09,0x01,0x18,0x13,0x14,0x08,0x10,0x25,0x01,0x13,0xb8,0xff,0xc0,\r\n0xb5,0x09,0x0b,0x36,0x13,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x06,0xe2,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x83,0x01,0x5d,0x00,0x08,0xb3,0x01,0x36,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x05,0x85,0x02,0x26,0x00,0x56,0x00,0x00,\r\n0x01,0x07,0x00,0xdb,0x01,0x05,0x00,0x00,0x00,0x08,0xb3,0x01,0x2f,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x79,0xfe,0xc6,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x07,0x02,0x45,0x00,0xd3,0x00,0x00,0xff,0xff,0x00,0x68,0xfe,0xc6,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,0x02,0x45,0x72,0x00,\r\n0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0x6a,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x02,0xdb,0x01,0x5a,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x42,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x0e,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x02,0xdc,0x00,0xdb,0x00,0x00,0x00,0x0a,0xb4,0x02,\r\n0x01,0x3e,0x11,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,0x07,0xd7,0x02,0x26,0x00,0x36,0x00,0x00,0x01,0x07,0x02,0xdd,0x01,0x16,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x44,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x68,0xff,0xe8,0x03,0x0f,0x06,0x7b,0x02,0x26,0x00,0x56,0x00,0x00,0x01,0x07,0x02,0xde,\r\n0x00,0x8c,0x00,0x00,0x00,0x0a,0xb4,0x02,0x01,0x3d,0x11,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x79,0xfe,0xc6,0x03,0xde,0x06,0xe2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x27,0x00,0xdb,0x01,0x93,0x01,0x5d,0x01,0x07,0x02,0x45,0x01,0x0b,0x00,0x00,0x00,0x08,0xb3,0x01,0x36,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x68,0xfe,0xc6,\r\n0x03,0x0f,0x05,0x85,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x27,0x02,0x45,0x00,0x82,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xff,0x00,0x00,0x00,0x08,0xb3,0x01,0x3b,0x14,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x06,0xe2,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x4d,0x01,0x5d,0x00,0x13,0x40,0x0b,\r\n0x01,0x00,0x0b,0x11,0x06,0x07,0x25,0x01,0x08,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x55,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x5e,0x00,0xd0,0x00,0x19,0xb9,0x00,0x01,0xff,0xd6,0xb6,0x18,0x1e,0x07,0x14,0x25,0x01,0x15,0xb9,0x01,0x2d,0x00,0x0a,0x00,0x10,\r\n0xfe,0x34,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x29,0xfe,0xc6,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xc4,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0b,0x11,0x06,0x07,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0xc6,0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x06,0x02,0x45,\r\n0x13,0x00,0x00,0x0b,0xb6,0x01,0x12,0x18,0x1e,0x07,0x14,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x29,0xff,0x1c,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xe0,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x00,0x0a,0x0b,0x06,0x07,0x25,0x01,0x0a,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0a,0x14,0x26,0x00,\r\n0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x2b,0xff,0x1b,0x02,0x95,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x5b,0xfa,0x59,0x00,0x1c,0x40,0x09,0x01,0x41,0x17,0x18,0x07,0x14,0x25,0x01,0x17,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x17,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x29,\r\n0xfe,0x3d,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xa7,0xf9,0x7b,0x00,0x13,0x40,0x0b,0x01,0x03,0x0c,0x08,0x06,0x07,0x25,0x01,0x0d,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x2b,0xfe,0x3e,0x02,0x86,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xf6,\r\n0xf9,0x7c,0x00,0x13,0x40,0x0b,0x01,0x16,0x19,0x15,0x07,0x14,0x25,0x01,0x1a,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xfe,0xc3,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x17,0xfa,0x01,0x00,0x22,0xb1,0x02,0x01,0xb8,0xff,0xf8,0xb7,0x1d,0x17,0x05,0x0d,0x25,0x02,0x01,\r\n0x20,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x20,0x14,0x26,0x00,0x2b,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x90,0xfe,0xc4,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x7f,0xfa,0x02,0x00,0x22,0xb1,0x02,0x01,0xb8,0xff,0xe6,0xb7,0x21,0x1b,0x08,0x11,0x25,0x02,0x01,0x24,0xb8,0xff,0xc0,\r\n0xb5,0x09,0x0b,0x36,0x24,0x17,0x26,0x00,0x2b,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xaa,0xfe,0x9e,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x4c,0xf9,0xec,0x00,0x16,0xb9,0x00,0x01,0xff,0xf0,0x40,0x09,0x18,0x0e,0x05,0x0d,0x25,0x01,0x21,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x90,0xfe,0x9e,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xd3,0xf9,0xec,0x00,0x16,0xb9,0x00,0x01,0xff,0xfd,0x40,0x09,0x1c,0x12,0x08,0x11,0x25,0x01,0x25,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xfe,0x3d,0x04,0xd5,0x05,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,\r\n0x01,0x07,0x00,0xd7,0x01,0x42,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x01,0xff,0xf9,0x40,0x09,0x12,0x0e,0x05,0x0d,0x25,0x01,0x13,0x14,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x90,0xfe,0x3d,0x03,0xe2,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xbb,0xf9,0x7b,0x00,0x16,0xb9,0x00,0x01,0xff,0xf8,0x40,\r\n0x09,0x16,0x12,0x08,0x11,0x25,0x01,0x17,0x17,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x08,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x02,0xd7,0x00,0xdc,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x06,0x1c,0x12,0x05,0x0d,0x25,0x02,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,\r\n0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xae,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x02,0xd8,0x59,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x09,0x20,0x16,0x08,0x11,0x25,0x02,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x9e,0x02,0x26,0x00,0x38,\r\n0x00,0x00,0x01,0x07,0x02,0xdf,0x01,0x8c,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x04,0x1d,0x17,0x05,0x0d,0x25,0x03,0x02,0x01,0x27,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x42,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x02,0xe0,0x00,0xff,0x00,0x00,\r\n0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xfd,0x40,0x0b,0x21,0x1b,0x08,0x11,0x25,0x03,0x02,0x01,0x2b,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,0x07,0x0f,0x02,0x26,0x00,0x39,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x1d,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x04,0x16,0x0c,\r\n0x03,0x00,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xcb,0x05,0xb2,0x02,0x26,0x00,0x59,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x8c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x03,0x16,0x0c,0x03,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,\r\n0xfe,0xc6,0x04,0xe6,0x05,0x9a,0x02,0x26,0x00,0x39,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x29,0x00,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0f,0x15,0x03,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0xc6,0x03,0xcb,0x04,0x00,0x02,0x26,0x00,0x59,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0x92,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0xff,\r\n0xfb,0xb4,0x0f,0x15,0x03,0x00,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x06,0xe2,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0xfd,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0e,0x1f,0x25,0x0b,0x00,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,\r\n0x05,0x85,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x24,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0e,0x1f,0x25,0x0b,0x00,0x25,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0xfe,0xc6,0x07,0x60,0x05,0x9a,0x02,0x26,0x00,0x3a,0x00,0x00,0x01,0x07,0x02,0x45,0x02,0x75,0x00,0x00,0x00,0x0b,\r\n0xb6,0x01,0x0d,0x1f,0x25,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x18,0xfe,0xc6,0x05,0xb0,0x04,0x00,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x02,0x45,0x01,0x95,0x00,0x00,0x00,0x0b,0xb6,0x01,0x06,0x1f,0x25,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x06,0xe2,0x02,0x26,0x00,0x3b,\r\n0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x93,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x07,0x19,0x1f,0x09,0x00,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x05,0x85,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x0e,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x06,0x17,0x1d,\r\n0x0b,0x00,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x06,0xe4,0x02,0x26,0x00,0x3b,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xcd,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x13,0x25,0x1f,0x09,0x00,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,\r\n0xff,0xff,0x00,0x1a,0x00,0x00,0x03,0x92,0x05,0x87,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x06,0x00,0x8f,0x43,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x0d,0x23,0x1d,0x0b,0x00,0x25,0x02,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0xe2,0x02,0x26,0x00,0x3c,0x00,0x00,\r\n0x01,0x07,0x00,0xdb,0x01,0x67,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x11,0x17,0x05,0x00,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x85,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x1f,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,\r\n0x09,0x18,0x1e,0x0c,0x00,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x07,0x6b,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xdb,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x0f,0x0e,0x0a,0x05,0x09,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x21,0x00,0x00,0x03,0x70,0x06,0x0e,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x06,0x00,0xd7,0x6f,0x00,0x00,0x13,0x40,0x0b,0x01,0x1d,0x0e,0x0a,0x05,0x09,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xfe,0xc6,0x04,0x64,0x05,0x9a,0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0xfd,\r\n0x00,0x00,0x00,0x0b,0xb6,0x01,0x10,0x0d,0x13,0x05,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xfe,0xc6,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x02,0x45,0x00,0x87,0x00,0x00,0x00,0x0b,0xb6,0x01,0x14,0x0d,0x13,0x05,0x09,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x21,0xff,0x1c,0x04,0x64,0x05,0x9a,\r\n0x02,0x26,0x00,0x3d,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x0c,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x06,0x0c,0x0d,0x05,0x09,0x25,0x01,0x0c,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0c,0x14,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x21,0xff,0x1b,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xd9,\r\n0x00,0x9c,0xfa,0x59,0x00,0x1c,0x40,0x09,0x01,0x10,0x0c,0x0d,0x05,0x09,0x25,0x01,0x0c,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x0c,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0x1c,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1c,0xfa,0x5a,0x00,0x1c,0x40,0x09,0x01,0x09,\r\n0x14,0x15,0x0a,0x11,0x25,0x01,0x14,0xb8,0xff,0xc0,0xb5,0x09,0x0b,0x36,0x14,0x17,0x26,0x00,0x2b,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x57,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0xb8,0x00,0xd0,0x00,0x1b,0x40,0x0b,0x02,0x01,0x00,0x24,0x1e,0x07,0x14,0x25,0x02,0x01,0x15,0xb9,\r\n0x01,0x2d,0x00,0x0a,0x00,0x10,0xfe,0x34,0x34,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x06,0x1c,0x02,0x26,0x00,0x5a,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0xcc,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x08,0x1f,0x25,0x0b,0x00,0x25,0x02,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,\r\n0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x1c,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xcb,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,0x18,0x1e,0x0c,0x00,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x06,0x1f,0x02,0x26,\r\n0x00,0x44,0x00,0x00,0x01,0x07,0x06,0x84,0x00,0xc9,0xff,0xf0,0x00,0x13,0x40,0x0b,0x02,0x30,0x26,0x29,0x08,0x14,0x25,0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x4e,0x00,0x00,0x02,0x62,0x06,0xe2,0x02,0x26,0x01,0x84,0x00,0x00,0x01,0x07,0x00,0xdb,0xff,0xe2,0x01,0x5d,0x00,0x16,0xb9,0x00,0x01,0xff,\r\n0x2c,0x40,0x09,0x10,0x16,0x07,0x0c,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x29,0x29,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x2d,0x33,0x0a,0x13,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x61,0xe8,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xb3,0x40,0x09,0x2b,0x31,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x36,\r\n0x0c,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xde,0x40,0x0a,0x2d,0x34,0x0a,0x13,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x43,0xf2,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xc3,0x40,0x0a,0x2a,0x34,\r\n0x0a,0x13,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x37,0x37,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x2d,0x34,0x0a,0x13,0x25,0x03,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,\r\n0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x44,0x27,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf9,0x40,0x0a,0x2a,0x34,0x0a,0x13,0x25,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,\r\n0x00,0x00,0x01,0x06,0x04,0x38,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xd1,0x40,0x0a,0x2d,0x27,0x0a,0x13,0x25,0x03,0x02,0x33,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x45,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,\r\n0xff,0xd1,0x40,0x0a,0x2d,0x27,0x0a,0x13,0x25,0x03,0x02,0x36,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x27,0xfe,0x3f,0xff,0x7d,0x00,0x16,0xb4,0x02,0x19,0x04,0x19,0x02,0xb8,0xfe,0x04,0xb4,0x11,0x1c,0x05,0x00,0x25,0x01,\r\n0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x61,0xfe,0x44,0xff,0x7d,0x00,0x16,0xb4,0x02,0x17,0x04,0x17,0x02,0xb8,0xfe,0x08,0xb4,0x14,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0x9e,\r\n0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfe,0xd7,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,\r\n0x04,0x43,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x15,0x04,0x15,0x03,0x02,0xb8,0xfe,0xe5,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,\r\n0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfe,0xe7,0xb4,0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0xd7,0x05,0x9e,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x86,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x15,0x04,0x15,0x03,0x02,0xb8,0xff,0x00,0xb4,\r\n0x1d,0x1d,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xff,0x05,0xb4,0x10,0x10,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,\r\n0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x03,0x02,0x19,0x04,0x19,0x03,0x02,0xb8,0xfd,0x88,0xb4,0x16,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe7,\r\n0x03,0x3b,0x06,0x23,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x27,0xb2,0x00,0x00,0x13,0x40,0x0b,0x01,0x4d,0x2c,0x32,0x0c,0x11,0x25,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x23,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x61,0x82,0x00,0x00,0x13,0x40,0x0b,\r\n0x01,0x11,0x2a,0x30,0x0c,0x11,0x25,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x36,0x8b,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x21,0x2c,0x33,0x0c,0x11,0x25,0x02,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,\r\n0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x04,0x43,0xff,0x71,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x06,0x29,0x33,0x0c,0x11,0x25,0x02,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,\r\n0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x37,0xc4,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x5a,0x2c,0x33,0x0c,0x11,0x25,0x02,0x01,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x06,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x44,0xa8,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,\r\n0x3e,0x29,0x33,0x0c,0x11,0x25,0x02,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x04,0x35,0x05,0xa0,0x00,0x27,0x00,0x28,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xff,0x6b,0xb4,0x18,0x18,0x02,0x02,0x25,0x01,\r\n0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x04,0x35,0x05,0xa0,0x00,0x27,0x00,0x28,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x13,0x04,0x13,0x01,0xb8,0xfd,0x7b,0xb4,0x10,0x0c,0x02,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x05,0x5a,\r\n0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xff,0x76,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,\r\n0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,\r\n0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0xf5,0xb4,0x0d,0x19,0x02,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x05,0x5a,0x05,0x9e,0x00,0x27,0x00,0x28,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,\r\n0xa0,0xb4,0x19,0x19,0x02,0x02,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x27,0x1f,0x00,0x00,0x13,0x40,0x0b,0x01,0x3b,0x16,0x21,0x0c,0x14,0x25,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,\r\n0xfe,0x6c,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x61,0xdc,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xf7,0x40,0x09,0x19,0x15,0x0c,0x14,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x36,0xdd,0x00,\r\n0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf8,0x40,0x0a,0x16,0x22,0x0c,0x14,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x43,0xca,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe5,0x40,0x0a,0x18,0x22,0x0c,0x14,\r\n0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x37,0x29,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x44,0x16,0x22,0x0c,0x14,0x25,0x02,0x01,0x15,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,\r\n0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x44,0x08,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x24,0x18,0x22,0x0c,0x14,0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,\r\n0x04,0x38,0xdf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,0x1b,0x15,0x0c,0x14,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x45,0xdf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xfa,0x40,0x0a,\r\n0x1b,0x15,0x0c,0x14,0x25,0x02,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xff,0x6b,0xb4,0x18,0x18,0x06,0x06,0x25,0x01,0x2b,0x35,\r\n0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x13,0x04,0x13,0x01,0xb8,0xff,0x6e,0xb4,0x0c,0x0c,0x06,0x06,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0x9e,\r\n0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xff,0x76,0xb4,0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,\r\n0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,0xb6,0x02,\r\n0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x56,0xb4,0x0d,0x19,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x06,0x98,0x05,0x9e,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x11,0x04,0x11,0x02,0x01,0xb8,0xff,0xa0,0xb4,\r\n0x19,0x19,0x06,0x06,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0xb2,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x64,0xb4,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,\r\n0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x06,0x98,0x05,0xb2,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x15,0x04,0x15,0x02,0x01,0xb8,0xfc,0x64,0xb4,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x94,0xff,0xf4,\r\n0x02,0x08,0x06,0x23,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x27,0xfe,0xb0,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb2,0x40,0x09,0x0d,0x18,0x05,0x0b,0x25,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x6e,0xff,0xf4,0x02,0x08,0x06,0x23,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x61,0xfe,0x8c,\r\n0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x8d,0x40,0x09,0x10,0x0c,0x05,0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xdd,0xff,0xf4,0x02,0x08,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x93,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x94,0x40,0x0a,0x0d,0x19,0x05,0x0b,\r\n0x25,0x02,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xb3,0xff,0xf4,0x02,0x08,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x6f,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x70,0x40,0x0a,0x0f,0x19,0x05,0x0b,0x25,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0xff,0xff,0x00,0x1b,0xff,0xf4,0x02,0x47,0x06,0x06,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0xd9,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xda,0x40,0x0a,0x0d,0x19,0x05,0x0b,0x25,0x02,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xea,0xff,0xf4,0x02,0x2d,0x06,0x06,\r\n0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0xb2,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xb4,0x40,0x0a,0x0f,0x19,0x05,0x0b,0x25,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xc0,0xff,0xf4,0x02,0x0a,0x06,0x83,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8d,\r\n0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8e,0x40,0x0a,0x12,0x0c,0x05,0x0b,0x25,0x02,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xc0,0xff,0xf4,0x02,0x0a,0x06,0x83,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8d,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8e,0x40,0x0a,\r\n0x12,0x0c,0x05,0x0b,0x25,0x02,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x02,0x4a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x00,0xe6,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x07,0xb2,0x01,0x0d,0x03,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x02,0x48,0x05,0xa0,\r\n0x00,0x27,0x00,0x2c,0x00,0xe4,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x07,0xb2,0x01,0x0b,0x04,0x00,0x3f,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x3a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x01,0xd6,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x73,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,\r\n0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0x3a,0x05,0xa0,0x00,0x27,0x00,0x2c,0x01,0xd6,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0x00,0x00,0x03,0x6e,0x05,0xa0,0x00,0x27,0x00,0x2c,0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7a,0xff,0x9a,\r\n0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbf,0x00,0x00,0x03,0x77,0x05,0xa0,0x00,0x27,0x00,0x2c,0x02,0x13,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x9a,0x00,0x09,0xb3,0x02,0x01,0x14,0x03,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xb2,0x00,0x27,0x00,0x2c,\r\n0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8a,0xff,0x2f,0x00,0x09,0xb3,0x02,0x01,0x0d,0x04,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xb2,0x00,0x27,0x00,0x2c,0x02,0x0a,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8a,0xff,0x2f,0x00,0x09,0xb3,0x02,0x01,0x0d,0x04,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,\r\n0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x23,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x27,0x0a,0x00,0x00,0x13,0x40,0x0b,0x02,0x0b,0x19,0x24,0x03,0x09,0x25,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x23,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x61,0xd4,0x00,\r\n0x00,0x16,0xb9,0x00,0x02,0xff,0xd4,0x40,0x09,0x1c,0x18,0x03,0x09,0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x36,0xe9,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xe9,0x40,0x0a,0x19,0x25,0x03,0x09,0x25,0x03,0x02,0x18,\r\n0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x43,0xb9,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xb9,0x40,0x0a,0x1b,0x25,0x03,0x09,0x25,0x03,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,\r\n0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x37,0x21,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x21,0x19,0x25,0x03,0x09,0x25,0x03,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x44,\r\n0xfc,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xfd,0x40,0x0a,0x1b,0x25,0x03,0x09,0x25,0x03,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbd,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x02,0x21,0x04,0x21,0x02,0xb8,0xfc,\r\n0xc8,0xb4,0x19,0x24,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x06,0x10,0x05,0xb2,0x00,0x26,0x00,0x32,0x66,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x02,0x1f,0x04,0x1f,0x02,0xb8,0xfc,0xca,0xb4,0x1c,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,\r\n0xff,0xbc,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x21,0x04,0x21,0x03,0x02,0xb8,0xff,0xe2,0xb4,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,\r\n0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x1d,0x04,0x1d,0x03,0x02,0xb8,0xff,0xf0,0xb4,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x37,\r\n0xfe,0x7a,0xff,0x98,0x00,0x1a,0xb6,0x03,0x02,0x21,0x04,0x21,0x03,0x02,0xb8,0xfc,0x36,0xb4,0x19,0x25,0x03,0x09,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbe,0xff,0xe8,0x07,0x42,0x05,0xb2,0x00,0x27,0x00,0x32,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x86,0xff,0x98,0x00,0x18,0x40,0x0d,0x03,0x02,\r\n0x1d,0x04,0x1d,0x03,0x02,0x0b,0x25,0x25,0x03,0x03,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x23,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x27,0xed,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xed,0x40,0x09,0x23,0x29,0x00,0x16,0x25,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,\r\n0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x23,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x61,0x90,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x84,0x40,0x09,0x21,0x27,0x00,0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,\r\n0x01,0x06,0x04,0x36,0xae,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xa9,0x40,0x0a,0x23,0x2a,0x00,0x16,0x25,0x02,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x43,0xa5,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9f,\r\n0x40,0x0a,0x20,0x2a,0x00,0x16,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x37,0xee,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe9,0x40,0x0a,0x23,0x2a,0x00,0x16,0x25,0x02,0x01,0x1d,0x11,0x26,0x00,0x2b,\r\n0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x06,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x44,0xcf,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xca,0x40,0x0a,0x20,0x2a,0x00,0x16,0x25,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,\r\n0x06,0x83,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x38,0xb0,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xaa,0x40,0x0a,0x23,0x1d,0x00,0x16,0x25,0x02,0x01,0x29,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x83,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x45,0xaa,0x00,\r\n0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xa4,0x40,0x0a,0x23,0x1d,0x00,0x16,0x25,0x02,0x01,0x2c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x05,0x48,0x05,0xa0,0x00,0x27,0x00,0x3c,0x00,0xe8,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x15,0x04,0x15,0x01,0xb8,0xfd,\r\n0x13,0xb4,0x12,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x06,0x7d,0x05,0x9e,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x13,0x04,0x13,0x02,0x01,0xb8,0xff,0xb9,0xb4,0x1b,0x1b,0x05,0x05,0x25,0x01,0x2b,0x35,0x35,0x00,\r\n0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x06,0x7d,0x05,0x9e,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x13,0x04,0x13,0x02,0x01,0xb8,0xff,0xd3,0xb4,0x1b,0x1b,0x05,0x05,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,\r\n0x06,0x7d,0x05,0xb2,0x00,0x27,0x00,0x3c,0x02,0x1d,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x1a,0xb6,0x02,0x01,0x17,0x04,0x17,0x02,0x01,0xb8,0xfc,0x8b,0xb4,0x14,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,\r\n0x01,0x07,0x04,0x27,0x00,0xf7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x1a,0x28,0x2e,0x06,0x1d,0x25,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x61,0x00,0xca,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xe1,0x40,0x09,0x26,\r\n0x2c,0x06,0x1d,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x36,0x00,0xcc,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xea,0x40,0x0a,0x28,0x2f,0x06,0x1d,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x43,0x00,0xb3,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd0,0x40,0x0a,0x25,0x2f,0x06,0x1d,0x25,0x02,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,\r\n0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x37,0x01,0x27,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x45,0x28,0x2f,0x06,0x1d,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x44,0x00,0xf9,0x00,0x00,\r\n0x00,0x17,0x40,0x0d,0x02,0x01,0x17,0x25,0x2f,0x06,0x1d,0x25,0x02,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x38,0x00,0xd5,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf2,0x40,0x0a,0x28,0x22,0x06,0x1d,\r\n0x25,0x02,0x01,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x45,0x00,0xd5,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf2,0x40,0x0a,0x28,0x22,0x06,0x1d,0x25,0x02,0x01,0x31,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x93,0x00,0x00,0x01,0x07,0x04,0x27,0xfd,0xd9,0xff,0x7d,0x00,0x16,0xb4,0x01,0x25,0x04,0x25,0x01,0xb8,0xff,0xb1,0xb4,0x28,0x28,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x06,0x3c,0x05,0xb2,0x00,0x27,\r\n0x00,0x9f,0x00,0x93,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x01,0x23,0x04,0x23,0x01,0xb8,0xff,0xb4,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x72,0xff,0x98,\r\n0x00,0x1a,0xb6,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0xb8,0xff,0xd7,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xc0,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7c,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x21,0x04,0x21,0x02,0x01,\r\n0xb8,0xff,0xe7,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbd,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x98,0x00,0x1a,0xb6,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0xb8,0xff,0xe8,0xb4,0x29,0x29,0x12,0x12,0x25,0x01,\r\n0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbf,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x87,0xff,0x98,0x00,0x18,0x40,0x0d,0x02,0x01,0x21,0x04,0x21,0x02,0x01,0x00,0x29,0x29,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,\r\n0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x89,0xff,0x2f,0x00,0x18,0x40,0x0d,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0xff,0xbc,0x00,0x00,0x07,0x46,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9d,\r\n0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x89,0xff,0x2f,0x00,0x18,0x40,0x0d,0x02,0x01,0x25,0x04,0x25,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x35,0x00,0x11,0x3f,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x55,0xbe,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,\r\n0x8f,0x40,0x09,0x29,0x27,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x60,0x35,0x00,0x00,0x13,0x40,0x0b,0x02,0x06,0x29,0x27,0x0a,0x13,0x25,0x02,0x29,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x00,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x04,0x55,0xff,0x6c,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x28,0x26,0x0c,0x11,0x25,0x01,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x06,0x00,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x06,0x04,0x60,\r\n0xda,0x00,0x00,0x13,0x40,0x0b,0x01,0x6f,0x28,0x26,0x0c,0x11,0x25,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x00,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x55,0xbe,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd9,0x40,0x09,0x17,0x15,0x0c,0x14,0x25,0x01,0x16,0x11,0x26,\r\n0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x6c,0x03,0xf8,0x06,0x00,0x02,0x26,0x01,0xc7,0x00,0x00,0x01,0x06,0x04,0x60,0x40,0x00,0x00,0x13,0x40,0x0b,0x01,0x5b,0x17,0x15,0x0c,0x14,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x34,0xff,0xf4,0x02,0x08,0x06,0x00,0x02,0x26,0x01,0xc9,\r\n0x00,0x00,0x01,0x07,0x04,0x55,0xfe,0x63,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x64,0x40,0x09,0x0e,0x0c,0x05,0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0xff,0xf4,0x02,0x08,0x06,0x00,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0xdd,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,\r\n0xde,0x40,0x09,0x0e,0x0c,0x05,0x0b,0x25,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x55,0xd2,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xd2,0x40,0x09,0x1a,0x18,0x03,0x09,0x25,0x02,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,\r\n0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x60,0x24,0x00,0x00,0x13,0x40,0x0b,0x02,0x24,0x1a,0x18,0x03,0x09,0x25,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x00,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x55,\r\n0x8c,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x86,0x40,0x09,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x00,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x60,0x02,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xfc,0x40,0x09,0x1f,0x1d,0x00,0x16,0x25,0x01,0x1f,\r\n0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x55,0x00,0xaf,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xcc,0x40,0x09,0x24,0x22,0x06,0x1d,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,\r\n0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x01,0x01,0x07,0x04,0x60,0x01,0x1f,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x3c,0x24,0x22,0x06,0x1d,0x25,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x27,0x29,0x00,0x01,0x06,0x04,0x28,\r\n0x5c,0x00,0x00,0x1b,0x40,0x12,0x02,0x27,0x11,0x26,0x03,0x25,0x3c,0x36,0x0a,0x00,0x3e,0x02,0x00,0x2d,0x33,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x23,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x61,0xe9,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,\r\n0x02,0x28,0x11,0x26,0x03,0x25,0x3b,0x35,0x0a,0x00,0x3e,0x02,0xb8,0xff,0xb4,0xb4,0x2b,0x31,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x36,0x0c,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x27,0x11,\r\n0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xde,0xb4,0x2d,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x43,0xf4,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x28,0x11,\r\n0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xc5,0xb4,0x2a,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x37,0x38,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1f,0x40,0x14,0x03,0x02,0x27,0x11,\r\n0x26,0x04,0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0x0a,0x2d,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x06,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x44,0x26,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x28,0x11,0x26,0x04,\r\n0x25,0x3e,0x38,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xf8,0xb4,0x2a,0x34,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x38,0x00,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x33,0x11,0x26,0x04,\r\n0x25,0x45,0x3f,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xd1,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x83,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x45,0x00,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x22,0x40,0x0e,0x03,0x02,0x36,0x11,0x26,0x04,\r\n0x25,0x45,0x3f,0x0a,0x00,0x3e,0x03,0x02,0xb8,0xff,0xd1,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x04,0x29,0xfe,0x40,0xff,0x7d,0x01,0x07,0x04,0x28,0x00,0xa4,0x00,0x00,0x00,0x1f,0x40,0x0c,0x02,0x19,\r\n0x04,0x19,0x03,0x07,0x25,0x26,0x05,0x00,0x3e,0x02,0xb8,0xfe,0xd3,0xb4,0x1c,0x1c,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0xa0,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x27,0x04,0x61,0xfe,0x46,0xff,0x7d,0x01,0x07,0x04,0x28,0x00,0xa4,0x00,0x00,0x00,0x1f,0x40,0x0c,\r\n0x02,0x17,0x04,0x17,0x03,0x07,0x24,0x25,0x05,0x00,0x3e,0x02,0xb8,0xfe,0xcc,0xb4,0x1a,0x1a,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x73,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x75,0x00,0x00,\r\n0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x13,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xd8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xc1,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7d,0xff,0x97,\r\n0x01,0x07,0x04,0x28,0x01,0x84,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x15,0x04,0x15,0x04,0x22,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xe8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,\r\n0x00,0x27,0x04,0x37,0xfe,0x7b,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x50,0x00,0x00,0x00,0x25,0xb5,0x03,0x02,0x19,0x04,0x19,0x04,0xb8,0xff,0xee,0xb6,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xfe,0xe8,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbf,0xfe,0x40,0x05,0xd7,\r\n0x05,0x9d,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x87,0xff,0x97,0x01,0x07,0x04,0x28,0x01,0x69,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x15,0x04,0x15,0x04,0x07,0x27,0x28,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x01,0xb4,0x1d,0x1d,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,\r\n0xff,0xff,0xff,0xbd,0xfe,0x40,0x05,0xd7,0x05,0xb2,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x8a,0xff,0x2f,0x01,0x07,0x04,0x28,0x01,0x64,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x02,0x2e,0x2f,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x06,0xb4,0x10,0x10,0x06,0x06,0x3e,0x2b,0x35,0x35,\r\n0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x05,0xd7,0x05,0xb1,0x00,0x27,0x00,0x24,0x00,0xc5,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x2e,0x01,0x07,0x04,0x28,0x01,0x68,0x00,0x00,0x00,0x23,0x40,0x0e,0x03,0x02,0x19,0x04,0x19,0x04,0x06,0x2e,0x2f,0x05,0x00,0x3e,0x03,0x02,0xb8,0xff,0x05,0xb4,\r\n0x10,0x10,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x27,0x1f,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x15,0x11,0x26,0x02,0x01,0x2b,0x2b,0x08,0x08,0x3e,0x01,0x2e,0x1b,\r\n0x21,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x23,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x61,0xdd,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x16,0x11,0x26,0x02,0x01,0x2a,0x2a,0x08,0x08,0x3e,0x01,0xb8,0xff,0xe0,0xb4,0x19,0x1f,\r\n0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x36,0xde,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x15,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,0xe8,0xb4,0x1b,0x22,\r\n0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x43,0xca,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x16,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,0xd3,0xb4,\r\n0x18,0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x37,0x27,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x15,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0x31,0x1b,\r\n0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x06,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x44,0x08,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x16,0x11,0x26,0x03,0x01,0x2d,0x2d,0x08,0x08,0x3e,0x02,0x01,0x12,0x18,\r\n0x22,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x38,0xe0,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x21,0x11,0x26,0x03,0x01,0x34,0x34,0x08,0x08,0x3e,0x02,0x01,0xb8,0xff,\r\n0xe9,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x82,0xfe,0x40,0x03,0xf8,0x06,0x83,0x02,0x26,0x01,0xc7,0x00,0x00,0x00,0x26,0x04,0x45,0xdf,0x00,0x01,0x07,0x04,0x28,0xff,0x15,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x24,0x11,0x26,0x03,0x01,0x34,0x34,0x08,0x08,0x3e,0x02,0x01,\r\n0xb8,0xff,0xe8,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0xff,0xbc,0xfe,0x40,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x00,0x27,0x04,0x27,0xfd,0xd8,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x5d,0x00,0x00,0x00,0x21,0xb4,0x01,0x15,0x04,0x15,0x02,0xb8,0xff,0xfc,0xb5,\r\n0x21,0x22,0x05,0x00,0x3e,0x01,0xb8,0xff,0x6a,0xb4,0x18,0x18,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x05,0x73,0x05,0xa0,0x00,0x27,0x00,0x2b,0x00,0x81,0x00,0x00,0x00,0x27,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x5f,0x00,0x00,0x00,0x21,0xb4,0x01,0x13,0x04,\r\n0x13,0x02,0xb8,0xff,0xfe,0xb5,0x20,0x21,0x05,0x00,0x3e,0x01,0xb8,0xff,0x61,0xb4,0x16,0x16,0x06,0x06,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x97,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa5,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x72,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x84,0x00,0x00,\r\n0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x77,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x06,0x96,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa4,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7a,\r\n0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x83,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x11,0x04,0x11,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x86,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x97,0x05,0x9f,0x00,0x27,0x00,0x2b,\r\n0x01,0xa5,0x00,0x00,0x00,0x27,0x04,0x37,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x75,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xf0,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0x87,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,\r\n0xfe,0x40,0x06,0x96,0x05,0x9f,0x00,0x27,0x00,0x2b,0x01,0xa4,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x86,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0x83,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x11,0x04,0x11,0x03,0xb8,0xff,0xff,0xb6,0x23,0x24,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa1,0xb4,0x19,0x19,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,\r\n0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x98,0x05,0xb3,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0x85,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x2a,0x2b,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa4,0xb4,\r\n0x0c,0x0c,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x98,0x05,0xb3,0x00,0x27,0x00,0x2b,0x01,0xa6,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0x85,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x15,0x04,0x15,0x03,0xb8,0xff,0xff,0xb6,0x2a,\r\n0x2b,0x05,0x00,0x3e,0x02,0x01,0xb8,0xff,0xa4,0xb4,0x0c,0x0c,0x06,0x06,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x29,0x00,0xf7,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x22,\r\n0x11,0x26,0x02,0x0b,0x37,0x38,0x06,0x1d,0x3e,0x01,0x1a,0x28,0x2e,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x23,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x61,0x00,0xca,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x23,0x11,0x26,\r\n0x02,0x0b,0x36,0x37,0x06,0x1d,0x3e,0x01,0xb8,0xff,0xe1,0xb4,0x26,0x2c,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x36,0x00,0xcc,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x22,0x11,\r\n0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xea,0xb4,0x28,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x43,0x00,0xb3,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,\r\n0x02,0x01,0x23,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xd0,0xb4,0x25,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x37,0x01,0x27,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,\r\n0x00,0x1f,0x40,0x14,0x02,0x01,0x22,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0x45,0x28,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x06,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x44,0x00,0xfa,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,\r\n0x00,0x00,0x00,0x1f,0x40,0x14,0x02,0x01,0x23,0x11,0x26,0x03,0x0b,0x39,0x3a,0x06,0x1d,0x3e,0x02,0x01,0x18,0x25,0x2f,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x38,0x00,0xd5,0x00,0x00,0x01,0x07,0x04,0x28,\r\n0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x2e,0x11,0x26,0x03,0x0b,0x40,0x41,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xf2,0xb4,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x83,0x02,0x26,0x01,0xd5,0x00,0x01,0x00,0x27,0x04,0x45,0x00,0xd5,0x00,0x00,\r\n0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x22,0x40,0x0e,0x02,0x01,0x31,0x11,0x26,0x03,0x0b,0x40,0x41,0x06,0x1d,0x3e,0x02,0x01,0xb8,0xff,0xf2,0xb4,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x2b,0x35,0x35,0xff,0xff,0xff,0xbc,0xfe,0x40,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x93,0x00,0x00,0x00,0x27,\r\n0x04,0x27,0xfd,0xd8,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x9f,0x00,0x00,0x00,0x21,0xb4,0x01,0x25,0x04,0x25,0x02,0xb8,0xff,0xfd,0xb5,0x31,0x32,0x0e,0x00,0x3e,0x01,0xb8,0xff,0xb0,0xb4,0x28,0x28,0x12,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x06,0x3c,0x05,0xb2,0x00,0x27,0x00,0x9f,\r\n0x00,0x93,0x00,0x00,0x00,0x27,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x01,0x07,0x04,0x28,0x01,0x9f,0x00,0x00,0x00,0x21,0xb4,0x01,0x23,0x04,0x23,0x02,0xb8,0xff,0xfd,0xb5,0x30,0x31,0x0e,0x00,0x3e,0x01,0xb8,0xff,0xa7,0xb4,0x26,0x26,0x12,0x12,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x45,\r\n0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9c,0x00,0x00,0x00,0x27,0x04,0x36,0xfe,0x72,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa8,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0xb8,0xff,0xd8,0xb4,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,\r\n0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x07,0x44,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9b,0x00,0x00,0x00,0x27,0x04,0x43,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa7,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x21,0x04,0x21,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0xb8,0xff,0xe7,0xb4,0x29,0x29,0x12,0x12,\r\n0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x45,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9c,0x00,0x00,0x00,0x27,0x04,0x37,0xfe,0x7a,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa8,0x00,0x00,0x00,0x25,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0xb6,0x33,0x34,0x0e,0x00,0x3e,\r\n0x02,0x01,0xb8,0xff,0xe8,0xb4,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0xfe,0x40,0x07,0x44,0x05,0xb2,0x00,0x27,0x00,0x9f,0x01,0x9b,0x00,0x00,0x00,0x27,0x04,0x44,0xfe,0x86,0xff,0x99,0x01,0x07,0x04,0x28,0x02,0xa7,0x00,0x00,0x00,0x23,0xb5,0x02,0x01,0x21,0x04,0x21,\r\n0x03,0xb8,0xff,0xfd,0x40,0x0d,0x33,0x34,0x0e,0x00,0x3e,0x02,0x01,0x02,0x29,0x29,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x46,0x05,0xb3,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x00,0x27,0x04,0x38,0xfe,0x89,0xff,0x30,0x01,0x07,0x04,0x28,0x02,0xa9,0x00,0x00,\r\n0x00,0x23,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0x40,0x0d,0x3a,0x3b,0x0e,0x00,0x3e,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0xff,0xbc,0xfe,0x40,0x07,0x46,0x05,0xb3,0x00,0x27,0x00,0x9f,0x01,0x9d,0x00,0x00,0x00,0x27,0x04,0x45,0xfe,0x89,0xff,0x30,\r\n0x01,0x07,0x04,0x28,0x02,0xa9,0x00,0x00,0x00,0x23,0xb5,0x02,0x01,0x25,0x04,0x25,0x03,0xb8,0xff,0xfd,0x40,0x0d,0x3a,0x3b,0x0e,0x00,0x3e,0x02,0x01,0x05,0x1c,0x1c,0x12,0x12,0x3e,0x2b,0x35,0x35,0x2b,0x35,0x00,0x11,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0xbe,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,\r\n0x04,0x66,0x02,0x6a,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe3,0x40,0x09,0x2d,0x27,0x0a,0x13,0x25,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0x2f,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x68,0x00,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xe1,0x40,0x09,0x28,\r\n0x27,0x0a,0x13,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x55,0xbd,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,0x02,0x28,0x11,0x26,0x03,0x25,0x31,0x2b,0x0a,0x00,0x3e,0x02,0xb8,0xff,0x8e,0xb4,0x29,0x27,\r\n0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x04,0x18,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x28,0x5b,0x00,0x00,0x0b,0xb6,0x02,0x24,0x2d,0x27,0x0a,0x00,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x06,0x00,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,\r\n0x04,0x60,0x35,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1b,0x40,0x12,0x02,0x29,0x11,0x26,0x03,0x25,0x31,0x2b,0x0a,0x00,0x3e,0x02,0x06,0x29,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x05,0x94,0x02,0x26,0x01,0x2f,0x00,0x00,0x01,0x06,0x04,0x2a,0x0a,0x00,0x00,0x16,\r\n0xb9,0x00,0x02,0xff,0xdb,0x40,0x09,0x2d,0x27,0x0a,0x13,0x25,0x02,0x2d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x5a,0xfe,0x40,0x04,0xc5,0x05,0x94,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x26,0x04,0x2a,0x0a,0x00,0x01,0x06,0x04,0x28,0x5c,0x00,0x00,0x1e,0x40,0x0c,0x02,0x2d,0x11,0x26,0x03,0x25,0x39,0x33,0x0a,0x00,\r\n0x3e,0x02,0xb8,0xff,0xdb,0xb4,0x2d,0x27,0x0a,0x13,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x0a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x66,0x02,0x94,0x01,0x4c,0x00,0x13,0x40,0x0b,0x02,0x00,0x16,0x10,0x05,0x00,0x25,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0x79,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x96,0x01,0x4a,0x00,0x13,0x40,0x0b,0x02,0x00,0x12,0x13,0x05,0x00,0x25,0x02,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xfb,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,\r\n0x04,0x55,0xfe,0x2a,0xff,0x99,0x00,0x16,0xb4,0x02,0x12,0x03,0x12,0x02,0xb8,0xfd,0xee,0xb4,0x12,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0x5c,0xff,0x99,0x00,0x16,0xb4,0x02,0x13,0x03,0x13,0x02,0xb8,0xfe,\r\n0x20,0xb4,0x12,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x16,0xfe,0x40,0x05,0x12,0x05,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x28,0x00,0xa3,0x00,0x00,0x00,0x0b,0xb6,0x02,0x67,0x16,0x10,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x00,0x01,0x01,0xe4,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0e,\r\n0x00,0x1f,0xb5,0x03,0x03,0x00,0x09,0xfa,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xc4,0x39,0x2f,0x31,0x30,0x01,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x0a,0x26,0x68,0x10,0x30,0x3e,0x3a,0x2c,0x35,0x46,0x73,0x04,0x7b,0x3f,0x38,\r\n0x68,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x57,0xa8,0x00,0x01,0x01,0xba,0xfe,0x40,0x02,0xf6,0xff,0x89,0x00,0x0c,0x00,0x23,0x40,0x13,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,\r\n0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x02,0xf6,0x3c,0x56,0x4b,0x5f,0x7b,0x44,0x29,0x29,0xfe,0x90,0x50,0x53,0x46,0xb0,0xba,0x43,0x2a,0x00,0x00,0x01,0x01,0xe4,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0xfa,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03,\r\n0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x01,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x0a,0x26,0x68,0x10,0x30,0x3e,0x3a,0x2c,0x35,0x46,0x73,0x04,0x7b,0x3f,0x38,0x68,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x57,0xa8,0x00,0x01,0x01,0x40,0x04,0xa6,0x03,0x70,\r\n0x05,0x94,0x00,0x0b,0x00,0x1c,0x40,0x0d,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x33,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x03,0x70,0x6a,0x18,0x96,0x96,0x18,0x6a,0x0a,0x9a,0x74,0x74,0x9a,0x04,0xa6,0x8b,0x8b,0x6a,\r\n0x84,0x85,0x00,0x03,0x01,0x33,0x04,0x7f,0x03,0x7d,0x06,0x5a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x35,0x40,0x1b,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x12,0x0c,0x1e,0xc1,0x18,0x0f,0xc0,0x15,0x15,0x00,0x21,0xc0,0x1b,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x10,0xd6,0xe1,0x10,0xc2,0x2f,0xe1,0x00,0x2f,0xfd,0x39,\r\n0x39,0xde,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x1a,0x9e,0x6d,0x6c,0xa0,0x4c,0x28,0x38,0x39,0x27,0x2a,\r\n0x3b,0x3b,0xfe,0x56,0x29,0x3a,0x3a,0x29,0x29,0x3b,0x3b,0x05,0x8e,0x6c,0x6c,0x5f,0x6d,0x6e,0xfe,0x93,0x38,0x2b,0x29,0x39,0x3a,0x28,0x2a,0x39,0x38,0x2b,0x28,0x3a,0x3a,0x28,0x2a,0x39,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x06,0x00,0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x55,0xbe,0x00,0x01,0x07,0x04,0x28,0xff,0x14,\r\n0x00,0x00,0x00,0x20,0xb4,0x01,0x15,0x11,0x26,0x02,0xb8,0xff,0xff,0xb5,0x20,0x20,0x08,0x08,0x3e,0x01,0xb8,0xff,0xc6,0xb4,0x17,0x15,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x04,0x18,0x02,0x26,0x01,0xc7,0x01,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x0e,0xb9,0x00,\r\n0x01,0xff,0x2e,0xb4,0x1b,0x15,0x0c,0x14,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x06,0x00,0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x60,0x40,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x1e,0xb4,0x01,0x16,0x11,0x26,0x02,0xb8,0xff,0xff,0x40,0x0c,0x20,0x20,0x08,0x08,0x3e,0x01,0x48,0x17,0x15,\r\n0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x83,0xfe,0x6c,0x03,0xf9,0x05,0x94,0x02,0x26,0x01,0xc7,0x01,0x00,0x01,0x06,0x04,0x2a,0xf5,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x1b,0x15,0x0c,0x14,0x25,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x83,0xfe,0x40,0x03,0xf9,0x05,0x94,\r\n0x02,0x26,0x01,0xc7,0x01,0x00,0x00,0x26,0x04,0x2a,0xf5,0x00,0x01,0x07,0x04,0x28,0xff,0x14,0x00,0x00,0x00,0x20,0xb4,0x01,0x15,0x11,0x26,0x02,0xb8,0xff,0xff,0xb5,0x28,0x28,0x08,0x08,0x3e,0x01,0xb8,0xff,0xfd,0xb4,0x1b,0x15,0x09,0x14,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x04,0x37,0x05,0x9a,\r\n0x00,0x27,0x00,0x28,0x00,0x83,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xfd,0x78,0xb4,0x0e,0x0c,0x02,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc4,0x00,0x00,0x04,0x36,0x05,0x9a,0x00,0x27,0x00,0x28,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf3,\r\n0xff,0x99,0x00,0x16,0xb4,0x01,0x0f,0x03,0x0f,0x01,0xb8,0xff,0x94,0xb4,0x0c,0x0c,0x02,0x02,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xff,0x7c,0xb4,\r\n0x0c,0x0c,0x06,0x06,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xc4,0x00,0x00,0x05,0x74,0x05,0x9a,0x00,0x27,0x00,0x2b,0x00,0x82,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf3,0xff,0x99,0x00,0x16,0xb4,0x01,0x0f,0x03,0x0f,0x01,0xb8,0xfc,0xf2,0xb4,0x0e,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,\r\n0x00,0xbc,0xfe,0x40,0x04,0xf2,0x05,0x9a,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x04,0x28,0x00,0xdd,0x00,0x00,0x00,0x0b,0xb6,0x01,0x5e,0x12,0x0c,0x06,0x0b,0x25,0x01,0x2b,0x35,0x00,0x00,0x02,0x01,0x4a,0x04,0x92,0x03,0x66,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x30,0x40,0x0e,0x03,0x03,0x09,0x0e,0x00,0x0f,0x09,0xfa,0x0d,0x80,\r\n0x0f,0x0f,0x0b,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03,0x0b,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x10,0xc2,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x27,0x36,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x05,0x23,0x03,0x33,0x01,0x68,0x1e,0x5d,0x17,0x31,0x41,0x36,0x2c,0x77,0x01,\r\n0x41,0x5e,0xae,0xa6,0x04,0x92,0x3d,0x28,0x4f,0x36,0x2c,0x28,0x36,0x7a,0xa8,0x4e,0x01,0x6a,0x00,0x02,0x01,0x42,0x04,0x92,0x03,0x6e,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x37,0x40,0x13,0x10,0x18,0x09,0x0e,0x48,0x03,0x03,0x09,0x0f,0x00,0x10,0x09,0xfa,0x0d,0x80,0x0f,0x0f,0x0b,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x12,0x48,0x01,0x03,\r\n0x0b,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x10,0xc2,0x2f,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x2b,0x01,0x27,0x36,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x01,0x03,0x23,0x13,0x01,0x60,0x1e,0x5d,0x17,0x32,0x40,0x36,0x2c,0x76,0x01,0x52,0xb0,0x5e,0x66,0x04,0x92,0x3d,0x28,0x4f,0x36,0x2c,\r\n0x28,0x36,0x7a,0xa8,0x01,0x1c,0xfe,0x96,0x01,0x6a,0x00,0x02,0x01,0x33,0x04,0x77,0x03,0x7d,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x53,0x40,0x0d,0x0d,0x18,0x09,0x12,0x48,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x0f,0xb8,0x01,0x02,0x40,0x0d,0x0f,0x13,0x1f,0x13,0x02,0x13,0x40,0x13,0x18,0x48,0x13,0x0c,0x0d,0xb8,0xff,0xc0,0xb5,0x09,\r\n0x12,0x48,0x0d,0x0f,0x16,0xb8,0x01,0x01,0x40,0x09,0x11,0x11,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x2f,0xd4,0x2b,0x5d,0xed,0xd6,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x2b,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x27,0x36,0x37,0x22,0x35,0x34,\r\n0x33,0x32,0x16,0x15,0x14,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x19,0xa0,0x6c,0x6c,0xa0,0xfe,0xb4,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x05,0xb6,0x6d,0x6d,0x5f,0x6e,0x6e,0xfe,0x62,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0xff,0xff,0xff,0xec,0xff,0xf4,0x02,0x10,0x05,0xbe,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x66,\r\n0x00,0xfe,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa7,0x40,0x09,0x12,0x0c,0x05,0x0b,0x25,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfa,0xff,0xf4,0x02,0x08,0x05,0x2f,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x64,0x00,0xf8,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa1,0x40,0x09,0x0e,0x0f,0x05,\r\n0x0b,0x25,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5e,0x06,0x0e,0x00,0x26,0x01,0xc9,0x01,0x00,0x01,0x07,0x04,0x53,0xfe,0xb0,0x00,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xb0,0x40,0x0b,0x1f,0x19,0x05,0x0b,0x25,0x03,0x02,0x01,0x0d,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,\r\n0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xb2,0xff,0xf4,0x02,0x5e,0x06,0x0e,0x00,0x26,0x01,0xc9,0x01,0x00,0x01,0x07,0x04,0x54,0xfe,0xb0,0x00,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xb0,0x40,0x0b,0x1f,0x19,0x05,0x0b,0x25,0x03,0x02,0x01,0x0e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xdf,\r\n0xff,0xf4,0x02,0x0f,0x05,0x94,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x2a,0xfe,0x9f,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xa0,0x40,0x09,0x12,0x0c,0x05,0x0b,0x25,0x01,0x12,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xd5,0xff,0xf4,0x02,0x1f,0x06,0x5a,0x00,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,0x04,0x2b,\r\n0xfe,0xa2,0x00,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xa3,0x40,0x0b,0x12,0x21,0x05,0x0b,0x25,0x03,0x02,0x01,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x22,0x07,0x0a,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x66,0x01,0x10,0x01,0x4c,0x00,0x13,0x40,0x0b,\r\n0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,0x07,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x02,0x0e,0x06,0x79,0x00,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x64,0x01,0x10,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x06,0x07,0x02,0x03,0x25,0x01,0x05,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0xff,0xae,0x00,0x00,0x02,0x2c,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xc8,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdd,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0x5d,0xb7,0x06,0x04,0x02,0x03,0x25,0x01,0x07,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc6,0x00,0x00,0x02,0x4a,0x05,0x9a,0x00,0x27,0x00,0x2c,0x00,0xe6,\r\n0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xf5,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0x57,0xb7,0x06,0x04,0x02,0x03,0x25,0x01,0x07,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0x00,0x02,0x01,0x44,0x04,0x92,0x03,0x6c,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x35,0x40,0x1d,0x0b,0x0b,0x05,0x0e,0x01,0x0f,0x05,0xfa,0x0d,0x80,0x0f,0x40,0x09,0x0e,\r\n0x48,0x0f,0x0f,0x08,0x00,0x40,0x09,0x12,0x48,0x00,0x00,0x0b,0x08,0xaf,0x03,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x10,0xc2,0x2f,0x2b,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x07,0x26,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x16,0x05,0x23,0x03,0x33,0x02,0x1e,0x20,0xba,0x76,0x2c,0x36,0x40,0x32,0x18,\r\n0x01,0xaa,0x5c,0xb0,0xa8,0x04,0xcf,0x3d,0x50,0xaa,0x7a,0x35,0x29,0x2c,0x36,0x4f,0x61,0x01,0x6a,0x00,0x00,0x02,0x01,0x38,0x04,0x92,0x03,0x7b,0x06,0x06,0x00,0x0c,0x00,0x10,0x00,0x35,0x40,0x1d,0x0b,0x0b,0x05,0x0f,0x01,0x10,0x05,0xfa,0x0d,0x80,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x0f,0x08,0x00,0x40,0x09,0x12,0x48,0x00,0x00,0x0b,\r\n0x08,0xaf,0x03,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x10,0xc2,0x2f,0x5d,0x1a,0xcd,0x00,0x3f,0xc4,0xd4,0xc6,0x12,0x39,0x2f,0x31,0x30,0x01,0x07,0x26,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x16,0x01,0x03,0x23,0x13,0x02,0x12,0x1e,0xbc,0x76,0x2c,0x36,0x40,0x32,0x17,0x01,0xc6,0xb0,0x5f,0x67,0x04,0xcf,0x3d,0x52,0xa8,0x7a,0x36,\r\n0x28,0x2c,0x36,0x4f,0x01,0x09,0xfe,0x96,0x01,0x6a,0x00,0x02,0x01,0x33,0x04,0x77,0x03,0x7d,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x52,0x40,0x0d,0x0e,0x18,0x09,0x12,0x48,0x03,0xdb,0x40,0x09,0x80,0x00,0x06,0x0c,0xb8,0x01,0x02,0x40,0x15,0x0f,0x14,0x1f,0x14,0x02,0x14,0x40,0x13,0x18,0x48,0x14,0x0f,0x0e,0x40,0x09,0x12,0x48,0x0e,\r\n0x0e,0x0c,0x16,0xb8,0x01,0x01,0x40,0x09,0x11,0x11,0x06,0x00,0xfc,0x01,0x05,0xfc,0x06,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x2f,0xf1,0x39,0xc0,0x2f,0x2b,0x00,0x2f,0xd4,0x2b,0x5d,0xed,0xd6,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x2b,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x16,0x17,0x07,0x26,0x35,0x34,0x36,\r\n0x33,0x32,0x15,0x14,0x03,0x7d,0x69,0x2a,0x92,0x92,0x2a,0x69,0x19,0xa0,0x6c,0x6c,0xa0,0xfe,0xf8,0x06,0x54,0x14,0xb0,0x3e,0x30,0x5a,0x05,0xb6,0x6d,0x6d,0x5f,0x6e,0x6e,0xfe,0xe7,0x3a,0x16,0x35,0x25,0x91,0x30,0x41,0x52,0x50,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0xbe,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x04,0x66,\r\n0x02,0x08,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xaa,0x40,0x09,0x23,0x1d,0x00,0x16,0x25,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x2f,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x0e,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb0,0x40,0x09,0x1e,0x1d,0x00,\r\n0x16,0x25,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0e,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x53,0xc3,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xbd,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1e,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,\r\n0x35,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x0e,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x54,0xd6,0x0e,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xd0,0x40,0x0b,0x30,0x2a,0x00,0x16,0x25,0x03,0x02,0x01,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0xa1,0xfe,0x74,0x04,0x50,\r\n0x06,0x23,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x06,0x04,0x29,0x14,0x00,0x00,0x16,0xb9,0x00,0x02,0xff,0xf4,0x40,0x09,0x1c,0x27,0x04,0x0a,0x25,0x02,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa1,0xfe,0x74,0x04,0x50,0x06,0x23,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x06,0x04,0x61,0xd4,0x00,0x00,0x16,0xb9,0x00,\r\n0x02,0xff,0xb3,0x40,0x09,0x1f,0x1b,0x04,0x0a,0x25,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x05,0x94,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x2a,0xba,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xb4,0x40,0x09,0x23,0x1d,0x00,0x16,0x25,0x01,0x23,0x11,0x26,0x00,0x2b,0x35,0x01,\r\n0x2b,0x35,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x06,0x5a,0x02,0x26,0x01,0xd2,0x00,0x00,0x01,0x06,0x04,0x2b,0xa9,0x00,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xa4,0x40,0x0b,0x38,0x32,0x00,0x16,0x25,0x03,0x02,0x01,0x35,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,\r\n0x07,0x0a,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x04,0x66,0x02,0x37,0x01,0x4c,0x00,0x13,0x40,0x0b,0x01,0x00,0x14,0x0e,0x05,0x00,0x25,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0x81,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x04,0x64,0x02,0x38,0x01,0x52,0x00,0x13,\r\n0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x96,0x00,0x00,0x05,0x49,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe9,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xc5,0xff,0x99,0x00,0x16,0xb4,0x01,0x10,0x03,0x10,0x01,0xb8,0xfc,0xfb,0xb4,0x10,0x0e,0x05,0x00,0x25,0x01,\r\n0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xb2,0x00,0x00,0x05,0x49,0x05,0x9a,0x00,0x27,0x00,0x3c,0x00,0xe9,0x00,0x00,0x01,0x07,0x04,0x60,0xfd,0xe1,0xff,0x99,0x00,0x16,0xb4,0x01,0x0e,0x03,0x0e,0x01,0xb8,0xfd,0x17,0xb4,0x10,0x0e,0x05,0x00,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x04,0xb0,\r\n0x05,0xa0,0x00,0x27,0x00,0x33,0x00,0x87,0x00,0x00,0x01,0x07,0x04,0x61,0xfd,0xdc,0xff,0x7d,0x00,0x16,0xb4,0x02,0x1a,0x04,0x1a,0x02,0xb8,0xfd,0x3b,0xb4,0x17,0x13,0x03,0x07,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0x00,0x03,0x01,0x02,0x04,0x96,0x03,0xae,0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x2c,0x40,0x15,0x0a,0x04,\r\n0x16,0xc1,0x40,0x10,0x10,0x02,0x80,0x01,0x0d,0xc0,0x07,0x00,0x40,0x13,0xc0,0x19,0x00,0x80,0x02,0x2f,0x1a,0xcd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x03,0x33,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x14,0x06,0x02,0xc0,0x5e,0xb0,0xa8,0xf0,0x28,0x38,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x04,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,0x03,0x01,0x02,0x04,0x96,0x03,0xae,0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,\r\n0x00,0x2c,0x40,0x15,0x0a,0x04,0x16,0xc1,0x40,0x10,0x10,0x03,0x80,0x02,0x13,0xc0,0x19,0x02,0x40,0x0d,0xc0,0x07,0x00,0x80,0x02,0x2f,0x1a,0xdd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x00,0xb0,0x5e,0x66,0xf2,0x28,0x38,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x06,0x00,0xfe,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,0x01,0x01,0xd1,0x04,0x96,0x02,0xdf,\r\n0x06,0x00,0x00,0x03,0x00,0x11,0xb6,0x01,0x40,0x02,0x01,0x02,0x80,0x00,0x2f,0x1a,0xcd,0x00,0x3f,0x1a,0xcd,0x31,0x30,0x01,0x23,0x03,0x33,0x02,0xdf,0x5e,0xb0,0xa8,0x04,0x96,0x01,0x6a,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x55,0x00,0xb0,0x00,0x00,0x01,0x07,0x04,0x28,\r\n0x01,0x4f,0x00,0x00,0x00,0x1e,0x40,0x0c,0x01,0x23,0x11,0x26,0x02,0x0b,0x2c,0x2d,0x06,0x1d,0x3e,0x01,0xb8,0xff,0xcd,0xb4,0x24,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x04,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x0b,0xb6,0x01,\r\n0x0b,0x28,0x29,0x06,0x1d,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x06,0x00,0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x60,0x01,0x1f,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x24,0x11,0x26,0x02,0x0b,0x2c,0x2d,0x06,0x1d,0x3e,0x01,0x3c,0x24,0x22,0x06,0x1d,0x3e,\r\n0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xff,0xe9,0x06,0x00,0x05,0x94,0x02,0x26,0x01,0xd5,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0xeb,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x08,0x28,0x22,0x06,0x1d,0x25,0x01,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x77,0xfe,0x40,0x06,0x00,0x05,0x94,\r\n0x02,0x26,0x01,0xd5,0x00,0x00,0x00,0x27,0x04,0x2a,0x00,0xeb,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x4f,0x00,0x00,0x00,0x1b,0x40,0x12,0x01,0x28,0x11,0x26,0x02,0x0b,0x34,0x35,0x06,0x1d,0x3e,0x01,0x08,0x28,0x22,0x06,0x1d,0x3e,0x2b,0x35,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0xff,0xac,0xff,0xe8,0x06,0x11,0x05,0xb2,0x00,0x26,\r\n0x00,0x32,0x67,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x02,0x1a,0x03,0x1a,0x02,0xb8,0xfc,0xc8,0xb4,0x1a,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xd1,0xff,0xe8,0x06,0x11,0x05,0xb2,0x00,0x26,0x00,0x32,0x67,0x00,0x01,0x07,0x04,0x60,0xfe,0x00,0xff,0x99,0x00,0x16,0xb4,0x02,\r\n0x1b,0x03,0x1b,0x02,0xb8,0xfc,0xed,0xb4,0x1a,0x18,0x03,0x09,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xac,0x00,0x00,0x06,0x53,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0xaa,0x00,0x00,0x01,0x07,0x04,0x55,0xfd,0xdb,0xff,0x99,0x00,0x16,0xb4,0x01,0x1e,0x03,0x1e,0x01,0xb8,0xff,0xac,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,\r\n0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0xff,0xd1,0x00,0x00,0x06,0x3d,0x05,0xb2,0x00,0x27,0x00,0x9f,0x00,0x94,0x00,0x00,0x01,0x07,0x04,0x60,0xfe,0x00,0xff,0x99,0x00,0x16,0xb4,0x01,0x1f,0x03,0x1f,0x01,0xb8,0xff,0xe7,0xb4,0x1c,0x1c,0x12,0x12,0x25,0x01,0x2b,0x35,0x00,0x11,0x3f,0x35,0xff,0xff,0x00,0x64,0xfe,0x40,0x05,0xa9,\r\n0x05,0xb2,0x02,0x26,0x00,0x9f,0x00,0x00,0x01,0x07,0x04,0x28,0x01,0x0e,0x00,0x00,0x00,0x0b,0xb6,0x01,0x5e,0x22,0x1c,0x12,0x18,0x25,0x01,0x2b,0x35,0x00,0x00,0x01,0x01,0xd1,0x04,0x96,0x02,0xdf,0x06,0x00,0x00,0x03,0x00,0x11,0xb6,0x02,0x40,0x03,0x01,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x3f,0x1a,0xcd,0x31,0x30,0x01,0x03,0x23,\r\n0x13,0x02,0xdf,0xb0,0x5e,0x67,0x06,0x00,0xfe,0x96,0x01,0x6a,0x00,0x01,0x01,0xe2,0x04,0x7b,0x02,0xcf,0x06,0x23,0x00,0x0d,0x00,0x25,0x40,0x15,0x00,0x18,0x09,0x0d,0x48,0x0c,0x0c,0x01,0x07,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x0c,0x0a,0xaf,0x04,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xc4,0x39,0x2f,0x31,0x30,0x2b,0x01,\r\n0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x02,0xcf,0x29,0x53,0x71,0x45,0x35,0x2c,0x3a,0x6c,0x10,0x04,0xba,0x3f,0x28,0xa7,0x58,0x39,0x48,0x3a,0x2b,0x5d,0x07,0x68,0x00,0x00,0x01,0xfe,0xe8,0x04,0xc2,0x01,0x1a,0x06,0x0e,0x00,0x06,0x00,0x15,0xb7,0x00,0xc0,0x04,0x02,0x00,0x05,0x80,0x04,0x00,0x2f,0x1a,\r\n0xcd,0x39,0x39,0x01,0x2f,0x1a,0xcc,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x01,0x1a,0x78,0xa4,0xa6,0x70,0xd6,0x86,0x04,0xc2,0xe6,0xe6,0x01,0x4c,0x00,0x01,0xfe,0xc0,0x04,0xb2,0x01,0x42,0x05,0xb2,0x00,0x13,0x00,0x1e,0x40,0x0e,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x13,0x07,0xda,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,0xfd,\r\n0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,0x4a,0x36,0x53,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6a,0x82,0x34,0x2c,0x74,0x00,0x00,0x01,0xff,0x02,\r\n0x04,0xc2,0x00,0xfe,0x05,0x2f,0x00,0x03,0x00,0x0e,0xb4,0x00,0x01,0x02,0xe2,0x01,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x35,0x21,0xfe,0xfe,0x04,0x01,0xfc,0x04,0xc2,0x6d,0x00,0x01,0xfe,0x58,0x05,0x74,0x01,0xaa,0x05,0xec,0x00,0x03,0x00,0x0d,0xb4,0x02,0xda,0x01,0x00,0x01,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,\r\n0x21,0x35,0x21,0x01,0xaa,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0x00,0x01,0xfe,0xee,0x04,0xc2,0x01,0x12,0x05,0xbe,0x00,0x0c,0x00,0x1d,0x40,0x0d,0x0c,0xc4,0x00,0xc0,0x07,0xc4,0x06,0x0c,0x06,0x80,0x09,0xdb,0x03,0x00,0x2f,0xed,0x1a,0xdc,0xc4,0x01,0x2f,0xe1,0x1a,0xdc,0xe1,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,\r\n0x33,0x32,0x36,0x37,0x01,0x12,0x0a,0x9c,0x70,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x05,0xbe,0x70,0x8c,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0xff,0x9e,0x04,0xc2,0x00,0x62,0x05,0x85,0x00,0x0b,0x00,0x0f,0xb5,0x09,0xc0,0x03,0x06,0xc1,0x00,0x00,0x2f,0xed,0x01,0x2f,0xe1,0x31,0x30,0x11,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x04,0xc2,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x05,0x87,0x00,0x0b,0x00,0x17,0x00,0x1a,0x40,0x0c,0x06,0x00,0x12,0xc1,0x0c,0x09,0xc0,0x03,0x0f,0xc0,0x03,0x15,0x2f,0xc6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,\r\n0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x28,0x3a,0x38,0x28,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x04,0xc2,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x00,0x02,0xff,0x33,\r\n0x04,0x98,0x00,0xcf,0x06,0x1c,0x00,0x0b,0x00,0x16,0x00,0x2a,0x40,0x18,0x14,0xc4,0x30,0x09,0x80,0x09,0xd0,0x09,0xe0,0x09,0x04,0x09,0xc0,0x0f,0xc4,0x03,0x0c,0xc5,0x40,0x06,0xc0,0x11,0xc5,0x00,0x00,0x2f,0xed,0x1a,0xdc,0x1a,0xed,0x01,0x2f,0xe1,0x1a,0xdc,0x71,0xe1,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x59,0x72,0x76,0x5b,0x59,0x72,0x7a,0x57,0x31,0x3f,0x70,0x31,0x41,0x41,0x04,0x98,0x6b,0x53,0x58,0x6e,0x6c,0x54,0x54,0x70,0x01,0x33,0x41,0x30,0x70,0x40,0x30,0x31,0x40,0x00,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x2b,\r\n0x40,0x14,0x00,0x0e,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,0x06,0x04,0x42,0x04,0x06,0x03,0x02,0x07,0x80,0x06,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0xcd,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0xe9,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x01,0x25,0xf6,0x60,0xd1,0x73,0xef,0x61,0xcf,0x06,0x00,0xfe,0xc2,\r\n0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x01,0xfe,0xe8,0x04,0xc2,0x01,0x18,0x06,0x0c,0x00,0x06,0x00,0x11,0xb5,0x00,0xc0,0x03,0x03,0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x1a,0xcc,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x01,0x18,0xd4,0x86,0xd6,0x72,0xa4,0xa4,0x06,0x0c,0xfe,0xb6,0x01,0x4a,0xe5,0xe5,0x00,0x01,0xff,0xcb,\r\n0x04,0x96,0x00,0x35,0x06,0x00,0x00,0x03,0x00,0x0e,0xb5,0x01,0x02,0x01,0x00,0xfc,0x01,0x2f,0xe1,0x00,0x3f,0xcd,0x31,0x30,0x13,0x23,0x11,0x33,0x35,0x6a,0x6a,0x04,0x96,0x01,0x6a,0x00,0x00,0x02,0xff,0x58,0x04,0x96,0x00,0xa8,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0c,0x02,0x01,0x05,0x06,0x01,0x00,0xfc,0x01,0x01,0x04,\r\n0xfc,0x05,0x2f,0xf1,0xca,0x2f,0xe1,0x00,0x3f,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x23,0x11,0x33,0xa8,0x6a,0x6a,0xe6,0x6a,0x6a,0x04,0x96,0x01,0x6a,0xfe,0x96,0x01,0x6a,0x00,0x02,0xfe,0xdd,0x04,0xc2,0x01,0x25,0x06,0x00,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x17,0x00,0x0e,0x0f,0x02,0x01,0x10,0x03,0x02,0x06,0x80,\r\n0x06,0x04,0x42,0x60,0x04,0x01,0x04,0x06,0x07,0x04,0x03,0x80,0x00,0x00,0x2f,0x1a,0xcd,0x39,0x39,0x01,0x2f,0xcd,0x5d,0x2b,0x01,0x1a,0x18,0x10,0xdc,0x5f,0x5e,0x5d,0xe1,0x31,0x30,0x01,0x23,0x03,0x33,0x03,0x23,0x03,0x33,0x01,0x25,0x61,0xef,0x81,0x23,0x60,0xf6,0x85,0x04,0xc2,0x01,0x3e,0xfe,0xc2,0x01,0x3e,0x00,0x02,0xfe,0xee,\r\n0x04,0xc2,0x01,0x12,0x06,0x68,0x00,0x0b,0x00,0x18,0x00,0x26,0x40,0x13,0x06,0xc1,0x00,0x0c,0x12,0x15,0xdb,0x0f,0x0c,0xfc,0x18,0x18,0x09,0x12,0xfc,0x13,0x09,0xc0,0x03,0x2f,0xe1,0xde,0xe1,0x10,0xca,0x2f,0xe1,0x00,0x2f,0xfd,0xd4,0x32,0xd4,0xed,0x31,0x30,0x11,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x06,\r\n0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0xe9,0x0a,0x9c,0x70,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x05,0xa6,0x39,0x29,0x2a,0x36,0x37,0x29,0x28,0x3a,0x18,0x70,0x8c,0x8a,0x72,0x9b,0x54,0x47,0x00,0x00,0x01,0xfe,0xee,0x04,0xc2,0x01,0x12,0x05,0xbe,0x00,0x0c,0x00,0x18,\r\n0x40,0x0b,0x0a,0xdb,0x04,0x00,0x07,0x00,0xfc,0x01,0x06,0xfc,0x07,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x33,0xd4,0xed,0x31,0x30,0x01,0x23,0x26,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x12,0x66,0x09,0x61,0x44,0xa0,0x0c,0x64,0x04,0x95,0x75,0x71,0x9b,0x04,0xc2,0x48,0x54,0x9c,0x72,0x8a,0x8a,0x00,0x00,0x01,0xff,0x8c,\r\n0x04,0x7b,0x00,0x77,0x06,0x23,0x00,0x0d,0x00,0x27,0xb9,0x00,0x00,0xff,0xe8,0x40,0x13,0x09,0x0d,0x48,0x07,0xfb,0x02,0x0d,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x02,0x04,0xaf,0x0a,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xd4,0xed,0x31,0x30,0x2b,0x13,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x77,\r\n0x69,0x10,0x6e,0x3a,0x2c,0x35,0x45,0x71,0x53,0x05,0xe4,0x38,0x68,0x08,0x5d,0x2a,0x3a,0x47,0x3a,0x58,0xa7,0x28,0x00,0x01,0xff,0x8c,0x03,0xf8,0x00,0x77,0x05,0xa0,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x03,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,\r\n0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x4e,0x26,0x68,0x10,0x30,0x3c,0x38,0x2c,0x35,0x46,0x72,0x03,0xf8,0x40,0x36,0x69,0x01,0x39,0x2b,0x2a,0x3a,0x48,0x3a,0x57,0xa7,0x00,0x00,0x01,0xff,0x8c,0x03,0xf8,0x00,0x77,0x05,0xa0,0x00,0x0e,0x00,0x24,\r\n0x40,0x15,0x00,0x18,0x09,0x0d,0x48,0x01,0x0d,0xfb,0x07,0xfa,0x00,0x40,0x09,0x0d,0x48,0x00,0x00,0x0d,0x0a,0xaf,0x04,0x2f,0xf1,0x39,0xc2,0x2f,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x13,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x77,0x27,0x54,0x70,0x45,0x35,0x2c,0x38,0x3c,0x30,0x10,0x04,0x38,\r\n0x40,0x29,0xa6,0x57,0x3b,0x47,0x3a,0x2a,0x2b,0x39,0x01,0x69,0x00,0x01,0x00,0x2f,0x03,0xf8,0x01,0x1a,0x05,0xa0,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x03,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc6,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x13,\r\n0x27,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x56,0x27,0x69,0x10,0x30,0x3c,0x38,0x2c,0x35,0x45,0x70,0x03,0xf8,0x40,0x36,0x69,0x01,0x39,0x2b,0x2a,0x3a,0x47,0x3b,0x57,0xa6,0x00,0x00,0x01,0xff,0x3e,0xfe,0x42,0x00,0xc2,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x00,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,\r\n0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x13,0x23,0x01,0x33,0xc2,0x7e,0xfe,0xfa,0xa8,0xfe,0x42,0x01,0x47,0x00,0x01,0xff,0x3e,0xfe,0x42,0x00,0xc2,0xff,0x89,0x00,0x03,0x00,0x17,0x40,0x0c,0x02,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x17,\r\n0x01,0x23,0x13,0xc2,0xfe,0xfa,0x7e,0xde,0x77,0xfe,0xb9,0x01,0x47,0x00,0x00,0x01,0xff,0x48,0xfe,0x58,0x00,0xb8,0xff,0xc2,0x00,0x07,0x00,0x2a,0x40,0x17,0x01,0x0e,0x02,0xfd,0x05,0x40,0x05,0x06,0x42,0x05,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x05,0x02,0x04,0x2f,0xdd,0x32,0xe1,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,\r\n0x18,0x10,0xfd,0xed,0x31,0x30,0x13,0x23,0x35,0x21,0x35,0x21,0x35,0x33,0xb8,0x6a,0xfe,0xfa,0x01,0x06,0x6a,0xfe,0x58,0x7f,0x6d,0x7e,0x00,0x01,0xff,0x48,0xfe,0x58,0x00,0xb8,0xff,0xc2,0x00,0x07,0x00,0x2c,0x40,0x18,0x02,0x0e,0x01,0xfd,0x06,0x40,0x06,0x05,0x42,0x06,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x03,0xfc,0x01,0x01,\r\n0x06,0x07,0x2f,0xcd,0x32,0x10,0xe1,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,0x18,0x10,0xfd,0xed,0x31,0x30,0x13,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0xb8,0xfe,0xfa,0x6a,0x6a,0x01,0x06,0xfe,0xd7,0x7f,0x01,0x6a,0x7e,0x00,0x00,0x01,0xff,0x16,0x04,0x96,0x00,0xea,0x06,0x68,0x00,0x05,0x00,0x14,0x40,0x09,0x00,0x03,0xfd,0x04,0x01,0x00,\r\n0xfc,0x02,0x03,0x2f,0xdd,0xe1,0x00,0x3f,0xed,0xc4,0x31,0x30,0x13,0x23,0x11,0x21,0x35,0x21,0xea,0x6a,0xfe,0x96,0x01,0xd4,0x04,0x96,0x01,0x6a,0x68,0x00,0x00,0x01,0xff,0x52,0x04,0x96,0x00,0xae,0x06,0x0e,0x00,0x0b,0x00,0x12,0xb7,0x05,0x01,0xda,0x00,0x08,0xc2,0x03,0x00,0x2f,0xd4,0xe1,0x00,0x2f,0xed,0xc4,0x31,0x30,0x03,0x37,\r\n0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0xae,0x02,0xd5,0x15,0x88,0x12,0x8e,0x78,0x04,0x96,0x74,0x82,0x48,0x3a,0x37,0x50,0x6c,0x85,0x00,0x01,0xff,0xa6,0xfe,0x5c,0x00,0x5a,0xff,0xc8,0x00,0x0b,0x00,0x28,0x40,0x16,0x0b,0xcb,0x40,0x00,0xc0,0x07,0xcb,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x06,0x80,0x09,\r\n0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x5d,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x15,0x14,0x33,0x5a,0x4d,0x67,0x66,0x4e,0x5e,0x5e,0xfe,0x5c,0x69,0x4d,0x4d,0x69,0x5e,0x58,0x5a,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x07,0x00,0x22,0x40,0x10,0x05,0x00,\r\n0xfd,0x02,0x40,0x03,0x06,0x0e,0x05,0xfc,0x02,0x02,0x01,0x42,0x02,0x01,0x2f,0xcd,0x2b,0x01,0x10,0xf1,0xe1,0x00,0x18,0x2f,0x1a,0xdd,0xed,0x33,0x31,0x30,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xb4,0x7f,0x6d,0x7e,0xfe,0x56,0x6a,0x01,0x06,0xfe,0xfa,0x6a,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x07,0x00,0x22,\r\n0x40,0x10,0x04,0x02,0x06,0xfd,0x40,0x07,0x01,0x0e,0x02,0xfc,0x05,0x05,0x06,0x42,0x05,0x06,0x2f,0xcd,0x2b,0x01,0x10,0xf1,0xe1,0x00,0x18,0x2f,0x1a,0xfd,0x32,0xc6,0x31,0x30,0x17,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0xb6,0x7e,0x6d,0x7f,0x3a,0x6a,0xfe,0xfa,0x01,0x06,0x6a,0x00,0x00,0x01,0xff,0x4c,0xfe,0x5e,0x00,0xb6,0xff,0xc6,\r\n0x00,0x0b,0x00,0x38,0x40,0x1f,0x03,0x0e,0x0a,0x01,0x04,0xfd,0x07,0x0e,0x40,0x0f,0x08,0x1f,0x08,0x2f,0x08,0x03,0x09,0x03,0x08,0x00,0x0e,0x01,0x04,0x05,0x42,0x05,0x0a,0x07,0x01,0xfc,0x04,0x2f,0xe1,0x39,0x39,0xcd,0x2b,0x01,0x10,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xfd,0xfd,0x39,0x39,0xed,0x31,0x30,0x13,0x23,0x15,0x23,\r\n0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0xb6,0x7e,0x6d,0x7f,0x7f,0x6d,0x7e,0xfe,0xdd,0x7f,0x7f,0x6b,0x7e,0x7e,0xff,0xff,0xff,0x03,0xff,0x53,0x00,0xff,0xff,0xbf,0x00,0x07,0x06,0x9a,0xfe,0xc5,0xfd,0x5f,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x12,0xb7,0x08,0x91,0x03,0x0a,0x00,0x7e,0x0a,0x06,0x2f,\r\n0xd6,0xe1,0x00,0x2f,0xd4,0xed,0x31,0x30,0x37,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0xe6,0xb3,0x9f,0x42,0x38,0x33,0x3f,0xb2,0x35,0xbd,0xe2,0x14,0xa0,0x1d,0x01,0x08,0x00,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x15,0x40,0x09,0x03,0x91,0x08,0x00,0x05,0x05,0x01,0x7e,0x00,0x2f,0xf1,0xc2,\r\n0x2f,0x00,0x2f,0xd4,0xed,0x31,0x30,0x27,0x33,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0xe6,0xa8,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0x35,0xfe,0xf8,0x1d,0xa0,0x14,0xe2,0x00,0x02,0xfe,0xdd,0xfe,0xc4,0x01,0x25,0xff,0x89,0x00,0x0b,0x00,0x17,0x00,0x1a,0x40,0x0c,0x06,0x00,0x0c,0xc1,0x12,0x09,0xc0,0x03,0x0f,0xc0,0x03,0x15,\r\n0x2f,0xc6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x28,0x3a,0x38,0x28,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0xfe,0xc4,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,\r\n0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0xff,0xff,0xff,0x35,0xfe,0x7e,0x00,0xd1,0x00,0x02,0x00,0x07,0x00,0xdc,0xfe,0xe3,0xf9,0xe6,0x00,0x01,0xff,0x9c,0xfe,0x62,0x00,0x64,0xff,0x89,0x00,0x0b,0x00,0x3b,0xb5,0x01,0x18,0x09,0x12,0x48,0x00,0xb8,0xff,0xc0,0xb4,0x13,0x16,0x48,0x00,0x03,0xb8,0x01,0x02,0x40,0x09,0x0f,0x07,0x1f,\r\n0x07,0x2f,0x07,0x03,0x07,0x01,0xb8,0xff,0xc0,0xb5,0x09,0x12,0x48,0x01,0x03,0x0a,0xb9,0x01,0x01,0x00,0x05,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x2f,0x5d,0xfd,0xc4,0x2b,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x4a,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0xfe,0x62,0x36,0x16,0x3a,0x50,0x51,0x41,0x30,\r\n0x91,0x00,0xff,0xff,0xff,0x56,0xfe,0x50,0x00,0xaa,0x00,0x00,0x00,0x07,0x00,0xdd,0xff,0x23,0x00,0x00,0xff,0xff,0xff,0x5d,0xfe,0x70,0x00,0x71,0x00,0x00,0x00,0x07,0x00,0xdf,0xff,0x1f,0x00,0x00,0x00,0x01,0xff,0xcb,0xfe,0x1e,0x00,0x35,0xff,0x89,0x00,0x03,0x00,0x16,0x40,0x0c,0x01,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x00,\r\n0xfc,0x01,0x2f,0xe1,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x13,0x23,0x11,0x33,0x35,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0x00,0x00,0x01,0xfe,0x9c,0xfe,0x5c,0x01,0x64,0xff,0x89,0x00,0x07,0x00,0x22,0x40,0x13,0x00,0x05,0x80,0x03,0xfd,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x01,0x04,0xfc,0x05,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x5d,\r\n0xed,0x1a,0xcd,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x23,0x11,0x21,0x01,0x64,0x68,0xfe,0x08,0x68,0x02,0xc8,0xfe,0x5c,0xc5,0xc5,0x01,0x2d,0x00,0x01,0xfe,0xb1,0xfe,0xbc,0x01,0x4f,0xff,0x89,0x00,0x14,0x00,0x44,0x40,0x26,0x00,0x05,0x10,0x03,0x0a,0x12,0x03,0x0d,0xc5,0x40,0x07,0x80,0x0f,0x0a,0x1f,0x0a,0x2f,0x0a,0x03,0x09,\r\n0x03,0x0a,0x14,0xff,0x00,0x0e,0x10,0x0b,0xff,0x0a,0x0a,0x0f,0x42,0x0a,0x80,0x10,0xfe,0x0f,0x2f,0xe1,0x1a,0xcc,0x2b,0x01,0x10,0xe1,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xdc,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x33,0x14,0x33,0x32,0x35,0x33,0x14,\r\n0x33,0x32,0x35,0x01,0x4f,0x6a,0x57,0x5a,0x34,0x35,0x5b,0x57,0x68,0x61,0x5f,0x69,0x4c,0x6a,0x5e,0x77,0x59,0x74,0x44,0x44,0x72,0x5b,0x75,0x75,0x75,0x75,0x00,0x01,0xfe,0xe8,0xfe,0x40,0x01,0x18,0xff,0x89,0x00,0x06,0x00,0x1a,0x40,0x0d,0x00,0xc0,0x03,0x02,0x80,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x2f,0x5d,0x1a,0xcd,\r\n0x01,0x2f,0x1a,0xcc,0x31,0x30,0x05,0x03,0x23,0x03,0x33,0x17,0x37,0x01,0x18,0xd4,0x86,0xd6,0x72,0xa4,0xa4,0x77,0xfe,0xb7,0x01,0x49,0xe5,0xe5,0x00,0x01,0xfe,0xe8,0xfe,0x3e,0x01,0x1a,0xff,0x89,0x00,0x06,0x00,0x1a,0x40,0x0d,0x00,0xc0,0x04,0x04,0x80,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,\r\n0x1a,0xcc,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x01,0x1a,0x78,0xa4,0xa6,0x70,0xd6,0x86,0xfe,0x3e,0xe5,0xe5,0x01,0x4b,0x00,0x00,0x01,0xfe,0xee,0xfe,0x8e,0x01,0x12,0xff,0x89,0x00,0x0c,0x00,0x29,0x40,0x16,0x0c,0xc4,0x00,0xc0,0x07,0xc4,0x06,0x0c,0x06,0x09,0xdb,0x40,0x03,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,\r\n0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x10,0xc4,0x01,0x2f,0xe1,0x1a,0xdc,0xe1,0x31,0x30,0x05,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x01,0x12,0x0a,0x9b,0x71,0x75,0x95,0x04,0x64,0x0c,0xa0,0x44,0x61,0x09,0x77,0x72,0x89,0x89,0x72,0x9b,0x54,0x47,0xff,0xff,0xfe,0xe9,0xff,0x13,0x01,0x19,0x00,0x01,0x00,0x07,\r\n0x04,0x2a,0xfd,0xa9,0xfa,0x6d,0x00,0x01,0xfe,0xc0,0xfe,0x9e,0x01,0x42,0xff,0x9e,0x00,0x13,0x00,0x22,0x40,0x11,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x09,0x11,0xda,0x03,0x07,0xda,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xd4,0xfd,0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,\r\n0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,0x4a,0x36,0x53,0x62,0x69,0x85,0x34,0x2a,0x70,0x69,0x82,0x33,0x2d,0x75,0xff,0xff,0xff,0x05,0xff,0x51,0x01,0x01,0xff,0xbe,0x00,0x07,0x00,0xd9,0xfe,0xc7,0xfa,0x8f,0x00,0x01,0xfe,0x57,0xfe,0xd7,0x01,0xa9,\r\n0xff,0x4e,0x00,0x03,0x00,0x0d,0xb4,0x01,0xda,0x02,0x00,0x01,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x01,0xa9,0xfc,0xae,0x03,0x52,0xfe,0xd7,0x77,0xff,0xff,0xfe,0x57,0xfd,0xfe,0x01,0xa9,0xff,0x62,0x00,0x07,0x01,0x35,0xfe,0x57,0x00,0x00,0x00,0x01,0xfe,0xc0,0x01,0x9e,0x01,0x42,0x02,0x9e,0x00,0x13,0x00,0x1e,\r\n0x40,0x0e,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x13,0x07,0xda,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,0xfd,0xdc,0xed,0xc6,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x42,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x59,0x5e,0x61,0x56,0x41,0x54,\r\n0x4a,0x36,0x53,0x02,0x9e,0x69,0x85,0x34,0x2a,0x70,0x69,0x82,0x33,0x2d,0x75,0x00,0x00,0x01,0xff,0x02,0x01,0xe6,0x00,0xfe,0x02,0x52,0x00,0x03,0x00,0x0e,0xb4,0x00,0x01,0x02,0xe2,0x01,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x35,0x21,0xfe,0xfe,0x04,0x01,0xfc,0x01,0xe6,0x6c,0xff,0xff,0xfe,0x58,0xff,0xc5,0x01,0xaa,\r\n0x00,0x3d,0x00,0x07,0x01,0x95,0xfe,0x58,0xfa,0x51,0x00,0x01,0xfe,0x66,0x00,0x77,0x01,0x9c,0x03,0xc2,0x00,0x03,0x00,0x2a,0xb6,0x03,0x02,0x01,0x00,0x03,0x00,0x01,0xb8,0x01,0x00,0x40,0x0a,0x02,0x03,0x14,0x02,0x03,0x01,0x02,0x00,0x00,0x02,0x2f,0xcd,0x00,0x2f,0x2f,0xc1,0x87,0x05,0x2b,0x10,0x00,0xc1,0x87,0x05,0x7d,0x10,0xc4,\r\n0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x9c,0xfd,0x50,0x86,0x02,0xae,0x03,0xc2,0xfc,0xb5,0x03,0x4b,0x00,0x00,0x01,0xfe,0x70,0xff,0x12,0x01,0x92,0x05,0x9a,0x00,0x03,0x00,0x2b,0xb6,0x03,0x02,0x01,0x00,0x03,0x00,0x01,0xb8,0x01,0x00,0x40,0x0b,0x02,0x03,0x14,0x02,0x03,0x01,0x02,0x00,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0x2f,0xc1,\r\n0x87,0x05,0x2b,0x10,0x00,0xc1,0x87,0x05,0x7d,0x10,0xc4,0x31,0x30,0x01,0x01,0x23,0x01,0x01,0x92,0xfd,0x50,0x72,0x02,0xae,0x05,0x9a,0xf9,0x78,0x06,0x88,0x00,0x01,0xff,0xa6,0xfe,0x5c,0x00,0x5a,0xff,0xc8,0x00,0x0b,0x00,0x2a,0x40,0x17,0x01,0xcb,0x40,0x00,0xc0,0x05,0xcb,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x06,\r\n0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x5d,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0x5a,0x5e,0x5e,0x4f,0x65,0x67,0xfe,0x5c,0x5c,0x5a,0x58,0x5e,0x67,0x4f,0x4d,0x69,0x00,0x01,0xfe,0x9c,0xfe,0x5c,0x01,0x64,0xff,0x89,0x00,0x07,0x00,0x24,\r\n0x40,0x14,0x04,0xfd,0x40,0x01,0x80,0x06,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x07,0xfc,0x06,0x03,0xfc,0x02,0x2f,0xe1,0xd4,0xe1,0x00,0x2f,0x5d,0x33,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x21,0x35,0x33,0x01,0x64,0xfd,0x38,0x68,0x01,0xf8,0x68,0xfe,0x5c,0x01,0x2d,0xc5,0xc5,0x00,0x02,0xff,0x44,0xfe,0x10,\r\n0x00,0xbc,0xff,0x89,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x14,0x01,0xc4,0x2f,0x07,0x01,0x07,0x06,0xc4,0x02,0x40,0x09,0x0d,0x48,0x02,0x03,0xc4,0x05,0x06,0xc4,0x02,0x2f,0xe1,0xdd,0xe1,0x00,0x2f,0x2b,0xed,0xdd,0x5d,0xed,0x31,0x30,0x13,0x21,0x11,0x21,0x03,0x35,0x23,0x15,0xbc,0xfe,0x88,0x01,0x78,0x5a,0xc4,0xfe,0x10,0x01,0x79,\r\n0xfe,0xe1,0xc5,0xc5,0x00,0x01,0xfe,0xa5,0xfe,0xa8,0x01,0x5b,0xff,0x89,0x00,0x16,0x00,0x45,0x40,0x25,0x00,0x0d,0x0d,0x12,0x07,0x80,0x14,0x03,0x0a,0xc5,0x40,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x09,0x03,0x10,0x01,0xff,0x00,0x0e,0x06,0x0c,0xff,0x0d,0x0d,0x07,0x42,0x0d,0x80,0x06,0xfe,0x07,0x2f,0xe1,0x1a,0xce,0x2b,0x01,0x10,\r\n0xe1,0x10,0xf2,0xe1,0x00,0x18,0x2f,0x5f,0x5e,0x5d,0x1a,0xed,0x39,0x39,0x1a,0xcc,0x39,0x39,0x7c,0x2f,0x33,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x01,0x5b,0x62,0x11,0x4f,0x32,0x40,0x4e,0x41,0x32,0x4e,0x11,0x62,0x0b,0x6e,0x48,0x70,0x2a,\r\n0x28,0x72,0x46,0x70,0xfe,0xee,0x43,0x55,0x34,0x35,0x54,0x43,0x43,0x58,0x64,0x64,0x5a,0x00,0x00,0x01,0xff,0x30,0x04,0xc2,0x00,0xd2,0x06,0x65,0x00,0x0b,0x00,0x09,0xb1,0x07,0x04,0x19,0x2f,0x00,0x2f,0x31,0x30,0x13,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0xd2,0x85,0x85,0x4c,0x86,0x85,0x4b,0x85,0x85,0x4c,0x86,\r\n0x85,0x06,0x1a,0x86,0x84,0x4e,0x86,0x86,0x4c,0x85,0x85,0x4d,0x85,0x85,0x00,0x01,0xff,0x9e,0x05,0x08,0x00,0x62,0x07,0x1c,0x00,0x11,0x00,0x27,0x40,0x13,0x0a,0xc5,0x40,0x09,0xc0,0x01,0xc5,0x40,0x00,0x09,0x03,0xc4,0x10,0x00,0x80,0x0c,0xc4,0x07,0x00,0x2f,0xd4,0xe1,0x1a,0x10,0xdd,0xe1,0xc4,0x00,0x2f,0x1a,0xed,0x1a,0xdc,0x1a,\r\n0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x27,0x26,0x35,0x34,0x33,0x15,0x22,0x15,0x14,0x17,0x16,0x15,0x14,0x62,0x6e,0x35,0x35,0xc0,0x6a,0x35,0x35,0x05,0x08,0x5e,0x42,0x1c,0x42,0x41,0x36,0x9f,0x5e,0x41,0x1b,0x40,0x40,0x3a,0xa0,0x00,0x00,0x02,0xfe,0x57,0x05,0x74,0x01,0xa9,0x07,0x04,0x00,0x03,0x00,0x07,0x00,0x19,0x40,0x0b,\r\n0x02,0xda,0x01,0x06,0xda,0x05,0x07,0x06,0x01,0x00,0x01,0x2f,0x2f,0x12,0x39,0x39,0x00,0x2f,0xfd,0xd6,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x01,0xa9,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x06,0x8e,0x76,0xfe,0x70,0x78,0x00,0x00,0x01,0xfe,0x70,0x04,0xc2,0xff,0xf6,0x06,0x0a,0x00,0x03,0x00,0x0e,0xb4,0x03,\r\n0x80,0x01,0x02,0x00,0x2f,0xcd,0x00,0x2f,0x1a,0xcd,0x31,0x30,0x03,0x23,0x01,0x33,0x0a,0x7f,0xfe,0xf9,0xa8,0x04,0xc2,0x01,0x48,0x00,0x00,0x01,0x00,0x0a,0x04,0xc2,0x01,0x90,0x06,0x0a,0x00,0x03,0x00,0x0e,0xb4,0x03,0x02,0x00,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xcd,0x31,0x30,0x01,0x01,0x23,0x13,0x01,0x90,0xfe,0xf9,0x7f,0xe0,\r\n0x06,0x0a,0xfe,0xb8,0x01,0x48,0xff,0xff,0xfe,0xc0,0x04,0xb2,0x01,0x41,0x05,0xb2,0x00,0x07,0x00,0xd8,0xfe,0x9d,0x00,0x00,0x00,0x01,0xff,0x9c,0x04,0xc2,0x00,0x64,0x05,0xea,0x00,0x0b,0x00,0x33,0xb5,0x01,0x18,0x09,0x12,0x48,0x00,0xb8,0xff,0xc0,0xb4,0x13,0x16,0x48,0x00,0x03,0xb8,0x01,0x02,0xb2,0x07,0x00,0x01,0xb8,0xff,0xc0,\r\n0xb5,0x09,0x12,0x48,0x01,0x03,0x0a,0xb9,0x01,0x01,0x00,0x05,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x3f,0xfd,0xc4,0x2b,0x31,0x30,0x2b,0x03,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x4a,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x04,0xc2,0x36,0x16,0x3a,0x50,0x52,0x42,0x2f,0x91,0x00,0x00,0x03,0xfe,0xaa,0x04,0x96,0x01,0x56,\r\n0x06,0x00,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x2c,0x40,0x15,0x0a,0x04,0x16,0xc1,0x40,0x10,0x10,0x03,0x80,0x02,0x13,0xc0,0x19,0x02,0x40,0x0d,0xc0,0x07,0x00,0x80,0x02,0x2f,0x1a,0xdd,0xd4,0xe1,0x1a,0x10,0xde,0xe1,0x00,0x2f,0x1a,0xcd,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x13,0x03,0x23,0x13,0x13,0x22,0x26,0x35,0x34,0x36,\r\n0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xa8,0xb0,0x5e,0x66,0xf2,0x29,0x37,0x38,0x28,0x29,0x3b,0x3a,0xfd,0xf0,0x28,0x3a,0x3a,0x28,0x2a,0x3a,0x3a,0x06,0x00,0xfe,0x96,0x01,0x6a,0xfe,0xba,0x36,0x2a,0x2a,0x39,0x39,0x2a,0x28,0x38,0x37,0x29,0x2a,0x39,0x39,0x2a,0x28,0x38,0x00,\r\n0x00,0x01,0xff,0x64,0xfe,0x40,0x00,0x9c,0xff,0x89,0x00,0x0c,0x00,0x23,0x40,0x13,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x5d,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x13,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x9c,0x3b,\r\n0x55,0x4b,0x5d,0x78,0x46,0x27,0x29,0xfe,0x90,0x50,0x52,0x47,0xb0,0xba,0x43,0x2a,0x00,0x01,0xfe,0x9c,0x04,0xc2,0x01,0x64,0x05,0xf0,0x00,0x07,0x00,0x1b,0x40,0x0d,0x00,0x05,0x80,0x03,0xfd,0x06,0x00,0x00,0xfc,0x01,0x04,0xfc,0x05,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xed,0x1a,0xcd,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x23,0x11,\r\n0x21,0x01,0x64,0x68,0xfe,0x08,0x68,0x02,0xc8,0x04,0xc2,0xc5,0xc5,0x01,0x2e,0x00,0x00,0x02,0xfe,0x2a,0xfd,0xfe,0x01,0xd6,0xff,0xaa,0x00,0x03,0x00,0x07,0x00,0x10,0xb6,0x06,0x05,0x02,0x50,0x01,0x01,0x01,0x00,0x2f,0x5d,0xcd,0x2f,0xcd,0x31,0x30,0x05,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x01,0xd6,0xfc,0x54,0x03,0xac,0xfc,0x54,\r\n0x03,0xac,0xda,0x84,0xfe,0x54,0x84,0x00,0x00,0x02,0xff,0x58,0xfe,0x1e,0x00,0xa8,0xff,0x89,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x12,0x02,0x01,0x05,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x00,0xfc,0x01,0x01,0x04,0xfc,0x05,0x2f,0xf1,0xca,0x2f,0xe1,0x00,0x2f,0x5d,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x23,0x11,\r\n0x33,0xa8,0x6a,0x6a,0xe6,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0xfe,0x95,0x01,0x6b,0x00,0x00,0x01,0xff,0x4c,0xfe,0x56,0x00,0xb6,0xff,0xc6,0x00,0x05,0x00,0x12,0xb7,0x01,0x04,0xfd,0x05,0x01,0xfc,0x02,0x05,0x2f,0xd4,0xe1,0x00,0x2f,0xfd,0xc4,0x31,0x30,0x17,0x11,0x23,0x11,0x23,0x35,0xb6,0x6c,0xfe,0x3a,0xfe,0x90,0x01,0x06,0x6a,0x00,\r\n0x00,0x01,0xfe,0xc0,0x04,0xc4,0x01,0x40,0x06,0x74,0x00,0x19,0x00,0x3c,0x40,0x1d,0x05,0xc4,0x06,0x12,0xc4,0x13,0x0e,0x0b,0x09,0x10,0x18,0x01,0x03,0x16,0x0d,0x00,0x0c,0x19,0x06,0x0c,0x13,0x06,0x10,0xda,0x16,0x03,0xda,0x09,0x13,0x00,0x2f,0xd4,0xfd,0xdc,0xed,0xc4,0x10,0xc6,0x10,0xc6,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x11,\r\n0x12,0x39,0x39,0x01,0x2f,0xe1,0xd4,0xe1,0x31,0x30,0x13,0x07,0x16,0x33,0x32,0x35,0x33,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x37,0xa6,0x58,0x1e,0x1e,0x54,0x62,0x5f,0x53,0x3c,0x44,0x5a,0x5a,0x56,0x1e,0x1c,0x58,0x5e,0x60,0x56,0x3a,0x40,0x5c,0x06,0x3a,0x88,0x0a,0x74,0x68,\r\n0x85,0x21,0x8c,0x3a,0x84,0x0c,0x72,0x6e,0x7e,0x23,0x8f,0x00,0x00,0x03,0xfe,0xc0,0x04,0xc4,0x01,0x40,0x07,0x62,0x00,0x0b,0x00,0x1f,0x00,0x2b,0x00,0x35,0x40,0x1b,0x09,0x03,0x29,0xc0,0x23,0x23,0x16,0x1f,0xc4,0x0c,0x15,0xc4,0x16,0x06,0xc1,0x00,0x0c,0x13,0xda,0x19,0x1d,0xda,0x0f,0x16,0x26,0xc1,0x20,0x00,0x2f,0xfd,0xd6,0xd4,\r\n0xfd,0xdc,0xed,0xd4,0xd6,0xed,0x01,0x2f,0xe1,0xd4,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x39,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,\r\n0x28,0x3b,0x3c,0x27,0x29,0x3a,0x3a,0x01,0x18,0x5f,0x53,0x46,0x5c,0x4c,0x2a,0x58,0x5e,0x60,0x56,0x42,0x54,0x49,0x35,0x54,0xdf,0x29,0x3a,0x3c,0x27,0x29,0x3a,0x3a,0x06,0xa0,0x39,0x29,0x2a,0x36,0x37,0x29,0x29,0x39,0x0a,0x69,0x85,0x33,0x2b,0x70,0x6c,0x7f,0x33,0x2d,0x75,0xfe,0x2e,0x3a,0x29,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,\r\n0x00,0x02,0xfe,0xc0,0x04,0xb2,0x01,0x40,0x06,0xa0,0x00,0x12,0x00,0x25,0x00,0x34,0x40,0x1a,0x25,0x13,0x12,0xc4,0x00,0x1c,0x1d,0x09,0xc4,0x0a,0x00,0x07,0xda,0x0c,0x10,0xda,0x09,0x03,0x13,0x1a,0xda,0x1f,0x23,0xda,0x1d,0x16,0x00,0x2f,0xc4,0xfd,0xdc,0xed,0xd4,0xd6,0xc6,0xfd,0xdc,0xed,0xc4,0x01,0x2f,0xe1,0x39,0x39,0xd4,0xe1,\r\n0x39,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x13,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x01,0x40,0x5c,0x56,0x42,0x57,0x57,0x28,0x58,0x5e,0xb6,0x3e,0x52,0x52,0x32,0x54,0x62,0x5c,0x56,0x42,0x57,0x57,\r\n0x28,0x58,0x5e,0xb6,0x3e,0x52,0x52,0x32,0x54,0x06,0xa0,0x64,0x76,0x25,0x25,0x5c,0xd8,0x26,0x26,0x60,0xfe,0xfe,0x64,0x76,0x25,0x25,0x5c,0xd7,0x25,0x26,0x60,0x00,0x00,0x01,0xfe,0xa8,0xfe,0x6e,0x01,0x58,0xff,0xb6,0x00,0x09,0x00,0x35,0x40,0x1c,0x07,0x05,0x02,0x00,0x0e,0x09,0xfd,0x03,0x40,0x03,0x02,0x42,0x03,0x0f,0x02,0x1f,\r\n0x02,0x2f,0x02,0x03,0x02,0x04,0x03,0x09,0x08,0x06,0x09,0x01,0x2f,0xcd,0x2f,0xcd,0x11,0x39,0x39,0x00,0x2f,0x5d,0xcd,0x2b,0x00,0x1a,0x18,0x10,0xfd,0xed,0x11,0x39,0x39,0x31,0x30,0x03,0x27,0x37,0x15,0x21,0x35,0x17,0x07,0x35,0x21,0xa8,0xb0,0xb0,0x01,0x50,0xb0,0xb0,0xfe,0xb0,0xfe,0x6e,0xa4,0xa4,0x6e,0x6e,0xa4,0xa4,0x6f,0x00,\r\n0x00,0x01,0xff,0x5c,0xfe,0x5c,0x00,0xa4,0xff,0xdb,0x00,0x06,0x00,0x18,0x40,0x0a,0x00,0x04,0x02,0x03,0x04,0x04,0x05,0xfc,0x01,0x02,0x2f,0xdd,0xf1,0xc1,0x2f,0x00,0x2f,0xdd,0x32,0xc6,0x31,0x30,0x03,0x35,0x23,0x37,0x17,0x23,0x15,0x35,0x6f,0xa4,0xa4,0x6f,0xfe,0x5c,0xcf,0xb0,0xb0,0xcf,0x00,0x01,0xfd,0x0e,0x05,0xc2,0x02,0xf2,\r\n0x07,0x00,0x00,0x15,0x00,0x1d,0x40,0x0e,0x00,0x07,0xda,0x0e,0x12,0xda,0x03,0x0b,0x15,0xda,0x00,0x0a,0xda,0x0b,0x2f,0xe1,0x2f,0xe1,0x00,0x2f,0xd4,0xfd,0xd4,0xed,0xc4,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x25,0x24,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x05,0x04,0x33,0x32,0x36,0x35,0x02,0xf2,0x02,0xb6,0x86,0x92,0xfe,\r\n0xde,0xfe,0xde,0x90,0x58,0x71,0x77,0x02,0xb4,0x88,0x95,0x01,0x23,0x01,0x22,0x8c,0x57,0x72,0x07,0x00,0x86,0xb2,0x5b,0x5a,0x6b,0x50,0x88,0xb0,0x5b,0x5b,0x6c,0x50,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x07,0x40,0x00,0x09,0x00,0x16,0x40,0x09,0x03,0xda,0x08,0x00,0x06,0x01,0x00,0x05,0x06,0x2f,0x33,0x2f,0x32,0x00,0x2f,0xc4,\r\n0xd4,0xed,0x31,0x30,0x01,0x23,0x02,0x21,0x20,0x03,0x23,0x12,0x21,0x20,0x03,0x1a,0xa2,0xba,0xfe,0x41,0xfe,0x43,0xba,0xa2,0xf0,0x02,0x2a,0x02,0x2a,0x05,0xc2,0x01,0x02,0xfe,0xfe,0x01,0x7e,0x00,0x00,0x01,0xfd,0xaf,0xfe,0x6e,0x02,0x51,0xff,0xb6,0x00,0x06,0x00,0x22,0x40,0x12,0x04,0x05,0xfd,0x01,0x40,0x0f,0x02,0x1f,0x02,0x2f,\r\n0x02,0x03,0x02,0x01,0x05,0x80,0x03,0x00,0x2f,0x2f,0x1a,0xcd,0x32,0x00,0x2f,0x5d,0x1a,0xdd,0xfd,0xcd,0x31,0x30,0x05,0x21,0x35,0x17,0x07,0x35,0x21,0xfd,0xaf,0x03,0xf2,0xb0,0xb0,0xfc,0x0e,0xb8,0x6e,0xa4,0xa4,0x6f,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4c,0x40,0x2b,0x0d,0x0a,0x04,0x95,\r\n0x40,0x07,0x08,0x11,0x07,0x95,0x09,0x30,0x03,0x15,0x01,0x1d,0x95,0x17,0x16,0x0e,0x23,0x95,0x11,0x10,0x08,0x00,0x0b,0x0b,0x0a,0x14,0x83,0x20,0x20,0x27,0x02,0x0d,0x0a,0x07,0x04,0x19,0x84,0x05,0x03,0x2f,0xc6,0xe9,0x17,0x39,0x12,0x39,0x2f,0xe9,0x11,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x2b,0x00,0x18,0x2f,\r\n0x1a,0xed,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x85,0x85,0xa2,0xf8,0xf8,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,\r\n0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x04,0xb4,0x8c,0xac,0xac,0x8c,0xfe,0x98,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x03,0xff,0xac,0x00,0x00,0x04,0x81,0x05,0x9a,0x00,0x1b,0x00,0x23,0x00,0x2b,0x00,0x48,0x40,0x26,0x08,0x08,0x00,0x0d,0x14,0x24,0x91,0x1d,0x1d,0x0d,\r\n0x25,0x91,0x00,0x12,0x1c,0x01,0x91,0x0d,0x03,0x14,0x25,0x18,0x7d,0x29,0x29,0x11,0x7d,0x21,0x21,0x2d,0x00,0x05,0x7e,0x0a,0x1d,0x25,0x7e,0x00,0x2f,0xe9,0x32,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xe9,0x39,0x2f,0xe9,0x11,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x11,0x12,0x39,0x2f,0x31,0x30,0x21,0x11,0x23,0x22,\r\n0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x01,0x0e,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x96,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,0xf8,0xc9,0xfa,0xac,0x8a,\r\n0x9d,0xfe,0xee,0xc1,0xe4,0x94,0xa3,0xfe,0xa6,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0xe4,0x05,0x02,0xfe,0x31,0x85,0x79,0xd1,0xfd,0x9a,0xfd,0xfc,0x8c,0x7a,0xfe,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x0c,0x00,0x14,0x00,0x2e,0x40,0x18,0x0d,0x91,\r\n0x05,0x05,0x01,0x0e,0x91,0x00,0x12,0x04,0x91,0x01,0x03,0x02,0x02,0x09,0x7d,0x12,0x12,0x16,0x05,0x0e,0x7e,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,\r\n0x02,0xfe,0xfd,0xaa,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa2,0xfe,0xc9,0x05,0x9a,0x98,0xfe,0x38,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x12,0x00,0x1f,0x00,0x36,0x40,0x1d,0x08,0x00,0x0b,0x17,0x95,0x11,0x16,0x03,0x15,0x1d,0x95,0x0b,\r\n0x10,0x07,0x95,0x04,0x00,0x05,0x05,0x0e,0x83,0x1a,0x1a,0x21,0x14,0x01,0x08,0x84,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,\r\n0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x03,0x25,0xfd,0x7d,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x05,0xec,0x8c,0xfd,0xec,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x02,0x00,0x33,0x00,0x00,\r\n0x04,0x38,0x05,0xb2,0x00,0x0d,0x00,0x15,0x00,0x2b,0x40,0x16,0x0e,0x91,0x06,0x06,0x05,0x0f,0x91,0x00,0x12,0x03,0x05,0x04,0x0a,0x7d,0x13,0x13,0x17,0x02,0x06,0x0f,0x7e,0x00,0x2f,0xe1,0x32,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xcd,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x27,0x35,0x25,0x33,0x11,0x21,0x32,0x16,0x15,\r\n0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x89,0x01,0x1b,0x16,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,0xec,0x95,0xa0,0xfe,0xcb,0x04,0x81,0x77,0x16,0xa4,0xfd,0x86,0xcd,0xbf,0xc6,0xe6,0x02,0xa4,0xfd,0xf2,0x8e,0x7e,0x01,0x02,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0x54,0x05,0xec,0x00,0x13,0x00,0x20,0x00,0x33,\r\n0x40,0x1b,0x09,0x01,0x0c,0x18,0x95,0x12,0x16,0x03,0x15,0x1e,0x95,0x0c,0x10,0x06,0x08,0x00,0x0f,0x83,0x1b,0x1b,0x22,0x14,0x01,0x09,0x84,0x05,0x03,0x2f,0xc6,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xcd,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x27,0x35,0x25,0x33,0x11,0x33,0x36,0x33,\r\n0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4c,0x04,0xa2,0x85,0x01,0x10,0x17,0x04,0x79,0xe9,0xc5,0xe1,0xfb,0xda,0xc7,0x70,0xa4,0x80,0x94,0xac,0x9e,0x89,0x8f,0xae,0x94,0x94,0x04,0xc2,0x73,0x17,0xa0,0xfd,0x60,0xcc,0xfe,0xef,0xe9,0xff,0x00,0xfe,0xca,0x02,0x49,\r\n0x8f,0x7f,0xb1,0xe1,0xc5,0xaf,0xc7,0xc7,0x00,0x01,0x00,0x6a,0xff,0xe8,0x04,0x98,0x05,0xb2,0x00,0x15,0x00,0x22,0x40,0x11,0x01,0x03,0x91,0x14,0x13,0x0b,0x09,0x91,0x0e,0x04,0x11,0x7d,0x06,0x06,0x17,0x0b,0x00,0x2f,0x32,0x11,0x39,0x2f,0xe9,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x00,0x11,0x10,\r\n0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x6a,0x9a,0xba,0xf6,0x01,0x34,0xfe,0xe1,0xea,0xd8,0x9d,0x9f,0xed,0x01,0x31,0x01,0x71,0xfe,0x64,0xfe,0xc0,0xcc,0x23,0xb2,0x56,0x01,0x4b,0x01,0x13,0x01,0x07,0x01,0x36,0x60,0xa4,0x54,0xfe,0x76,0xfe,0xc0,0xfe,0xa8,0xfe,0x58,0x00,0x01,0x00,0x5e,0xff,0xe8,\r\n0x05,0x42,0x06,0x83,0x00,0x21,0x00,0x43,0x40,0x24,0x20,0x11,0x01,0x11,0x0f,0x91,0x14,0x13,0x21,0x92,0x00,0x02,0x92,0x1f,0x1a,0x1c,0x1a,0x07,0x09,0x91,0x1a,0x04,0x19,0x06,0x17,0x00,0x1c,0x7f,0x04,0x06,0x12,0x12,0x23,0x0c,0x7d,0x17,0x2f,0xe1,0x12,0x39,0x2f,0xd6,0xd6,0xe1,0xc6,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x11,0x39,\r\n0x10,0xd4,0xfd,0xd6,0xed,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x05,0x42,0x2a,0x24,0x71,0x0f,0x09,0xa5,0xb7,0xf1,0xfe,0xd2,0x01,0x1f,0xe9,0xd8,0x9e,0x9f,0xed,\r\n0xfe,0xce,0xfe,0x90,0x01,0x9c,0x01,0x3e,0x5c,0x5e,0x03,0x85,0x68,0x30,0x30,0x05,0xe4,0x14,0x9e,0x3c,0x58,0x06,0x5a,0xfe,0xb5,0xfe,0xed,0xfe,0xfa,0xfe,0xc9,0x60,0xa3,0x54,0x01,0x8a,0x01,0x40,0x01,0x57,0x01,0xa9,0x18,0x5f,0x8a,0x13,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x0e,0x04,0xd5,0x00,0x21,0x00,0x48,0x40,0x1d,0x30,0x11,\r\n0x01,0x11,0x11,0x0f,0x95,0x14,0x16,0x21,0x96,0x00,0x02,0x96,0x1f,0x1a,0x1c,0x1a,0x40,0x07,0x01,0x07,0x07,0x09,0x95,0x1a,0x10,0x00,0x1c,0xb8,0x01,0x03,0xb7,0x04,0x06,0x11,0x11,0x23,0x0c,0x83,0x17,0x2f,0xe1,0x12,0x39,0x2f,0xd6,0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x12,0x39,0x10,0xd4,0xfd,0xd6,0xed,0x3f,0xed,0x32,\r\n0x2f,0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x04,0x0e,0x23,0x20,0x65,0x08,0x06,0x93,0x7d,0x95,0xbb,0xbd,0x9f,0x86,0x76,0x76,0xa2,0xdd,0xfe,0xf5,0x01,0x1a,0xe0,0x4b,0x41,0x02,\r\n0x77,0x59,0x28,0x2e,0x04,0x42,0x12,0x8e,0x54,0x2e,0x04,0x4e,0xdf,0xb9,0xb4,0xd0,0x59,0x9c,0x47,0x01,0x1f,0xe5,0xef,0x01,0x3d,0x14,0x57,0x7a,0x13,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x0b,0x00,0x17,0x00,0x43,0x40,0x0a,0x10,0x0d,0x01,0x91,0x40,0x04,0x05,0x00,0x04,0x91,0xb8,0x01,0x00,0x40,0x17,0x30,\r\n0x11,0x91,0x00,0x12,0x0c,0x91,0x05,0x03,0x0f,0x0f,0x11,0x08,0x7d,0x15,0x15,0x19,0x0d,0x04,0x11,0x7e,0x02,0x00,0x2f,0xc6,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x21,\r\n0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0xbc,0xa0,0xa0,0x01,0x8c,0x02,0xf6,0xfe,0x5b,0xfe,0x9f,0xd4,0x01,0x50,0xfe,0xb0,0xd6,0x01,0x1a,0x01,0x3a,0xfd,0xb6,0x02,0x81,0x9b,0x02,0x7e,0xfd,0x45,0xfe,0xb2,0xfe,0x6f,0x05,0x02,0xfe,0x1a,0x9b,0xfe,0x17,0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x02,0xff,0xac,0x00,0x00,0x05,0x90,\r\n0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x2e,0x40,0x18,0x08,0x08,0x0d,0x15,0x91,0x00,0x12,0x14,0x01,0x91,0x0d,0x03,0x05,0x7e,0x0a,0x00,0x10,0x7d,0x19,0x19,0x1d,0x15,0x7e,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xd4,0xe1,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x21,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,\r\n0x35,0x34,0x36,0x33,0x21,0x20,0x11,0x10,0x00,0x21,0x03,0x11,0x33,0x20,0x00,0x11,0x10,0x21,0x01,0x0e,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x8a,0x02,0xf6,0xfe,0x5b,0xfe,0x9e,0xd3,0xd6,0x01,0x1a,0x01,0x39,0xfd,0xb7,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xfd,0x45,0xfe,0xb4,0xfe,0x6d,0x05,0x02,0xfb,0x96,\r\n0x01,0x2e,0x01,0x15,0x02,0x27,0x00,0x02,0x00,0x5c,0x00,0x00,0x03,0xd7,0x05,0x9a,0x00,0x0c,0x00,0x13,0x00,0x2c,0x40,0x17,0x0e,0x91,0x08,0x08,0x0c,0x0d,0x91,0x00,0x12,0x09,0x91,0x0c,0x03,0x00,0x7e,0x08,0x0d,0x0d,0x15,0x0a,0x11,0x7d,0x04,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,\r\n0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x24,0x33,0x33,0x11,0x21,0x35,0x21,0x03,0x11,0x23,0x20,0x11,0x10,0x21,0x03,0xd7,0xfe,0x5c,0xe5,0xf2,0x01,0x0a,0xe0,0xe9,0xfd,0xaa,0x02,0xfe,0xa8,0xe7,0xfe,0xc6,0x01,0x36,0xce,0xc2,0xc2,0xe6,0x01,0xc8,0x9a,0xfa,0xfa,0x02,0x0e,0xfe,0xf4,0xfe,0xfe,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,\r\n0x04,0x0e,0x05,0xec,0x00,0x12,0x00,0x1f,0x00,0x34,0x40,0x1c,0x0e,0x02,0x0b,0x1d,0x95,0x05,0x16,0x00,0x15,0x17,0x95,0x0b,0x10,0x0f,0x95,0x12,0x00,0x00,0x84,0x13,0x02,0x0e,0x0e,0x21,0x1a,0x83,0x10,0x08,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x21,0x23,\r\n0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x0e,0xa2,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xfd,0x7e,0x03,0x24,0xa2,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,\r\n0x32,0xa6,0x01,0xee,0x8c,0xfb,0xe3,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x5c,0x04,0x18,0x00,0x1a,0x00,0x26,0x00,0x44,0x40,0x25,0x00,0x0d,0x1b,0x03,0x06,0x16,0x10,0x09,0x01,0x09,0x0b,0x95,0x06,0x1c,0x21,0x95,0x16,0x10,0x1b,0x00,0x24,0x0d,0x83,0x03,0x03,0x13,0x08,0x08,0x13,0x19,\r\n0x83,0x1e,0x1e,0x28,0x24,0x83,0x13,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x11,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xfd,0xc6,0x5d,0x11,0x12,0x17,0x39,0x31,0x30,0x25,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x10,0x05,\r\n0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xdd,0x7b,0x56,0xd9,0xac,0xad,0x90,0x96,0xab,0xd9,0x58,0xc8,0xd3,0xb3,0x01,0x22,0xe4,0xdf,0x01,0x17,0xfe,0x00,0xc6,0x92,0xba,0x9c,0x9a,0xbc,0x81,0x48,0x53,0x7e,0x50,0x71,0x98,0x4c,0xac,0x6c,0x7f,0x34,0x5d,0x77,0x7e,0xf7,0x92,0xcf,0x01,0x11,0xfe,0xfc,0xc4,0xfe,\r\n0xd9,0x8f,0x6f,0xca,0x73,0x96,0xb2,0xb3,0x95,0x6e,0xbe,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x03,0x52,0x05,0x9a,0x00,0x0b,0x00,0x32,0x40,0x1b,0x04,0x91,0x40,0x07,0x0b,0x00,0x07,0x91,0x2b,0x30,0x03,0x91,0x00,0x12,0x08,0x91,0x0b,0x03,0x00,0x7e,0x07,0x03,0x03,0x0d,0x05,0x09,0x01,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,\r\n0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x52,0xfd,0x08,0x02,0x50,0xfd,0xfa,0x02,0x06,0xfd,0xd1,0x02,0xd7,0x98,0x01,0xe9,0x97,0x01,0xea,0x98,0x00,0x00,0x01,0x00,0x70,0xff,0xe8,0x03,0xf4,0x05,0xb2,0x00,0x23,0x00,0x49,0x40,0x28,0x08,0x1b,\r\n0x91,0x40,0x1a,0x0e,0x02,0x1a,0x91,0x09,0x30,0x20,0x23,0x01,0x23,0x21,0x91,0x02,0x13,0x11,0x13,0x91,0x0e,0x04,0x08,0x05,0x1b,0x1b,0x1e,0x10,0x00,0x00,0x25,0x05,0x16,0x7d,0x0b,0x1e,0x7d,0x05,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,\r\n0x1a,0xed,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x37,0x35,0x24,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0xf4,0xa6,0xcf,0xf5,0xfe,0xe6,0xa2,0x90,0xff,0x00,0x01,0x11,0xd9,0xb2,0x91,0x99,0xaf,0x8d,0xaa,0xcb,0xab,0x69,\r\n0x6b,0xfe,0x5d,0xbf,0xa5,0xc8,0xa7,0x35,0x4d,0xdd,0xb8,0x85,0xc4,0x26,0x06,0x50,0xed,0xa7,0xdc,0x46,0xaa,0x58,0x7e,0x6b,0x70,0x92,0x97,0xfe,0xf1,0x7d,0x8d,0x5c,0x00,0x01,0xff,0x9a,0xfe,0x96,0x03,0x94,0x05,0x9a,0x00,0x11,0x00,0x33,0x40,0x1b,0x05,0x91,0x40,0x02,0x10,0x12,0x02,0x91,0x09,0x30,0x0b,0x0d,0x91,0x08,0x01,0x91,\r\n0x10,0x03,0x03,0x11,0x11,0x13,0x02,0x06,0x7e,0x0b,0x0f,0x2f,0xc6,0xe1,0x32,0x12,0x39,0x2f,0xc4,0x00,0x3f,0xed,0x2f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x21,0x03,0x94,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0xfe,0xae,0x41,0x37,0x32,\r\n0x3e,0xb2,0x02,0xd8,0x05,0x02,0xfe,0x10,0x97,0xfd,0xba,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x05,0x65,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x85,0x06,0x83,0x00,0x25,0x00,0x63,0x40,0x37,0x12,0x91,0x40,0x15,0x1e,0x0f,0x15,0x91,0x08,0x30,0x16,0x11,0x0f,0x91,0x18,0x13,0x00,0x20,0x07,0x1e,0x02,0x92,0x23,0x1e,0x1f,0x07,0x2f,0x07,\r\n0x02,0x07,0x09,0x91,0x1e,0x04,0x1d,0x06,0x1b,0x00,0x20,0x7f,0x04,0x06,0x06,0x16,0x13,0x13,0x0c,0x16,0x7e,0x11,0x11,0x27,0x0c,0x7d,0x1b,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x10,0xc0,0x2f,0xd6,0xe1,0xc6,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x5d,0x10,0xd4,0xfd,0x11,0x12,0x39,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,\r\n0x2f,0x1a,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x21,0x35,0x21,0x11,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x05,0x85,0x29,0x24,0x72,0x0f,0x08,0xbf,0xd2,0xf6,0xfe,0xc8,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc6,0x01,0xe4,\r\n0xd8,0xfe,0xf6,0xfe,0xcd,0xfe,0x85,0x01,0xa5,0x01,0x43,0x79,0x76,0x03,0x86,0x67,0x30,0x30,0x05,0xe4,0x14,0xa8,0x48,0x54,0x06,0x6c,0xfe,0xb6,0xfe,0xf6,0xfe,0xf0,0xfe,0xc9,0x43,0x01,0x92,0x98,0xfd,0x76,0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x22,0x64,0x8f,0x13,0x00,0x00,0x02,0x00,0x12,0xfe,0x1e,0x04,0xe6,0x05,0x9a,\r\n0x00,0x17,0x00,0x1f,0x00,0x16,0x40,0x0a,0x1c,0x91,0x07,0x1c,0x00,0x0f,0x03,0x00,0x21,0x0f,0x2f,0x10,0xc6,0x00,0x3f,0x33,0x3f,0xed,0x31,0x30,0x01,0x01,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x01,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x04,0xe6,0xfd,0xfe,\r\n0x06,0x72,0x89,0x63,0x60,0x82,0x29,0x4d,0x08,0xfe,0x06,0xbb,0x01,0x8d,0x15,0x08,0x04,0x0d,0x14,0x01,0x95,0xfe,0x43,0x43,0x43,0x44,0x05,0x9a,0xfa,0xc8,0x0c,0xe4,0x6e,0x61,0x85,0x82,0x64,0x3d,0x75,0x9a,0x10,0x05,0x3a,0xfb,0xbc,0x3a,0x36,0x39,0x37,0x04,0x44,0xfa,0x3f,0x8d,0x44,0x58,0x58,0x44,0x00,0x01,0x00,0xa6,0xff,0xe8,\r\n0x06,0x87,0x05,0xec,0x00,0x20,0x00,0x45,0x40,0x27,0x04,0x01,0x07,0x0c,0x95,0x17,0x16,0x01,0x15,0x11,0x0f,0x1d,0x95,0x40,0x07,0x10,0x02,0x00,0x0a,0x84,0x19,0x00,0x0f,0x19,0x84,0x09,0x30,0x12,0x83,0x11,0x14,0x84,0x0f,0x0f,0x22,0x04,0x00,0x84,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0x2b,0x01,0x10,0xe1,0x00,0x18,\r\n0x3f,0x3f,0x1a,0xed,0x3f,0x3f,0x3f,0xed,0x11,0x12,0x39,0x31,0x30,0x21,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x15,0x10,0x33,0x32,0x36,0x35,0x10,0x03,0x33,0x12,0x11,0x14,0x02,0x23,0x20,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x4a,0xa4,0xa4,0x04,0x62,0xcb,0x01,0x50,0xf7,0x84,0x9e,0x90,0xb2,0x81,0xfe,0xcb,0xfe,\r\n0x69,0x69,0x7c,0x6c,0x8c,0x05,0xec,0xfd,0x72,0xba,0xfe,0x5f,0xaa,0xfe,0xaa,0xc2,0xa4,0x01,0x19,0x01,0x0a,0xfe,0xf6,0xfe,0xee,0xe5,0xfe,0xe9,0x01,0xda,0x8a,0xaa,0x98,0xb5,0x91,0x00,0x00,0x01,0x00,0xb8,0xff,0xee,0x02,0x25,0x05,0x9a,0x00,0x0b,0x00,0x1b,0x40,0x0d,0x0b,0x09,0x91,0x02,0x16,0x05,0x03,0x00,0x00,0x0d,0x06,0x7e,\r\n0x05,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x25,0x06,0x23,0x22,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x25,0x3c,0x3b,0xf6,0xa8,0x68,0x30,0x2d,0x04,0x16,0x01,0x22,0x04,0x8a,0xfb,0x7a,0x8f,0x15,0x00,0x01,0x00,0x29,0x00,0x00,0x02,0x10,0x05,0x9a,0x00,0x0b,0x00,0x3b,0x40,0x20,0x0a,0x01,0x04,0x91,\r\n0x40,0x07,0x08,0x03,0x07,0x91,0x14,0x30,0x03,0x12,0x08,0x03,0x0b,0x0a,0x06,0x07,0x40,0x0a,0x07,0x02,0x7e,0x03,0x0c,0x0d,0x03,0x7e,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x1a,0x18,0x10,0xcd,0x10,0xcd,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,\r\n0x33,0x02,0x10,0xa0,0xa8,0x9f,0x9f,0xa8,0xa0,0x02,0x8e,0xfd,0x72,0x02,0x8e,0x97,0x02,0x75,0xfd,0x8b,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0xb2,0x00,0x17,0x00,0x2e,0x40,0x18,0x0a,0x17,0x05,0x03,0x08,0x01,0x07,0x12,0x08,0x03,0x12,0x14,0x91,0x0f,0x04,0x17,0x06,0x12,0x00,0x19,0x09,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x10,\r\n0xd6,0xc6,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0x33,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x01,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x01,0x3c,0x8d,0x94,0x5c,0x38,0x37,0x38,0x3e,0x50,0x76,0xfe,0xc4,\r\n0x02,0x90,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x01,0xa4,0xbc,0x5a,0x1a,0x9c,0x1e,0x99,0xfe,0x65,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x15,0x00,0x31,0x40,0x1a,0x01,0x03,0x11,0x15,0x04,0x14,0x05,0x15,0x14,0x0f,0x0c,0x0e,0x95,0x09,0x01,0x15,0x04,0x14,0x00,0x17,0x0c,0x10,0x10,0x04,0x84,0x05,0x2f,0xe1,\r\n0x32,0x10,0xc6,0x10,0xd6,0xc6,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0xb3,0x8b,0x47,0x2f,0x37,0x35,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,\r\n0x14,0x04,0xb2,0x99,0xb7,0x12,0x94,0x1b,0xcf,0xfd,0x83,0x01,0xd5,0xfe,0x12,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x01,0xdb,0x05,0xec,0x00,0x0b,0x00,0x3b,0x40,0x20,0x0a,0x01,0x04,0x95,0x40,0x07,0x08,0x03,0x07,0x95,0x14,0x30,0x03,0x15,0x08,0x00,0x0b,0x0a,0x06,0x07,0x40,0x0a,0x07,0x02,0x84,0x03,0x0c,0x0d,0x03,0x84,0x08,0x30,\r\n0x2b,0x01,0x10,0xe1,0x39,0x39,0x1a,0x18,0x10,0xcd,0x10,0xcd,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x01,0xdb,0x91,0xa4,0x92,0x92,0xa4,0x91,0x02,0xc4,0xfd,0x3c,0x02,0xc4,0x8c,0x02,0x9c,0xfd,0x64,0x00,0x01,0xff,0xfe,0x00,0x00,0x03,0xdf,\r\n0x05,0xee,0x00,0x16,0x00,0x7c,0x40,0x44,0x16,0x12,0x00,0x06,0x05,0x02,0x07,0x15,0x07,0x13,0x12,0x00,0x09,0x05,0x02,0x08,0x14,0x08,0x16,0x13,0x12,0x00,0x12,0x09,0x06,0x05,0x02,0x05,0x06,0x08,0x09,0x13,0x15,0x16,0x06,0x07,0x14,0x10,0x07,0x07,0x05,0x05,0x02,0x0b,0x00,0x04,0x15,0x0d,0x0b,0x95,0x10,0x00,0x14,0x07,0x08,0x15,\r\n0x00,0x08,0x0d,0x0d,0x02,0x05,0x12,0x03,0x04,0x00,0x18,0x04,0x2f,0x10,0xc6,0x11,0x17,0x39,0x39,0x2f,0xc6,0x10,0xc6,0x11,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0x33,0x12,0x39,0x39,0x11,0x33,0x2f,0x10,0xc4,0x11,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,\r\n0x31,0x30,0x21,0x23,0x01,0x01,0x23,0x01,0x27,0x05,0x27,0x25,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x37,0x17,0x05,0x03,0xdf,0xb0,0xfe,0xe7,0xfe,0x9c,0xb4,0x01,0xcf,0x1b,0xfe,0xf2,0x3a,0x01,0x1f,0x35,0x66,0x3e,0x3c,0x3c,0x46,0x68,0x80,0x36,0xf4,0x3a,0xff,0x00,0x03,0x3c,0xfc,0xc4,0x03,0xf8,0x4c,0x84,0x71,0x8b,\r\n0x9c,0x12,0x99,0x0f,0x69,0x85,0x77,0x71,0x7d,0x00,0x00,0x01,0x00,0xb8,0xff,0xe8,0x06,0x66,0x05,0x9a,0x00,0x1e,0x00,0x45,0x40,0x27,0x02,0x07,0x15,0x1e,0x04,0x0c,0x19,0x05,0x11,0x91,0x40,0x09,0x13,0x00,0x12,0x0c,0x03,0x01,0x1e,0x7e,0x1d,0x0e,0x15,0x0c,0x15,0x42,0x0d,0x7e,0x0c,0x07,0x16,0x7e,0x15,0x1f,0x20,0x15,0x7e,0x08,\r\n0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x33,0x00,0x18,0x3f,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x66,0xa4,0x04,\r\n0x6c,0xd1,0xd7,0x48,0x72,0xe4,0xfe,0xac,0xa8,0x67,0x7d,0x67,0x91,0xa8,0xe2,0x6c,0x8c,0xa8,0xa2,0xba,0xd4,0xd4,0x01,0xc4,0x03,0xee,0xfc,0x26,0xa5,0x9c,0xbf,0x86,0x03,0xd6,0xfc,0x12,0xfe,0xd3,0xb5,0x90,0x03,0xd6,0x00,0x01,0xff,0x9a,0xfe,0x96,0x05,0x42,0x05,0x9a,0x00,0x1b,0x00,0x30,0x40,0x19,0x0d,0x0f,0x91,0x0a,0x04,0x16,\r\n0x1b,0x03,0x13,0x01,0x12,0x13,0x03,0x13,0x01,0x07,0x1b,0x7e,0x1a,0x1a,0x1d,0x0d,0x07,0x7e,0x12,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x16,0x17,0x33,\r\n0x26,0x35,0x11,0x33,0x05,0x42,0xd0,0xfd,0x1e,0x1c,0x12,0x06,0x08,0xfe,0xae,0x41,0x37,0x32,0x3e,0xb2,0xda,0x02,0xce,0x2d,0x0d,0x04,0x0a,0xaa,0x04,0x77,0x2b,0x2f,0x2e,0x97,0xfc,0x29,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x05,0x65,0xfb,0x9b,0x46,0x1a,0x3e,0x95,0x03,0xf2,0x00,0x00,0x01,0x00,0x83,0xfe,0x6c,0x03,0xf8,0x04,0x18,\r\n0x00,0x15,0x00,0x34,0x40,0x1b,0x0f,0x09,0x12,0x01,0x09,0x15,0x0c,0x0f,0x04,0x95,0x12,0x10,0x00,0x83,0x01,0x01,0x17,0x09,0x10,0x0d,0x08,0x84,0x09,0x0d,0x83,0x0c,0x09,0x2f,0xd6,0xe1,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x2f,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,\r\n0x11,0x23,0x11,0x34,0x27,0x33,0x16,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa6,0xec,0x7d,0x9f,0xa4,0x23,0xa8,0x1b,0x04,0x70,0xe4,0xa7,0xb3,0xfe,0x6c,0x03,0xd0,0x01,0x47,0xb1,0x86,0xfd,0xb4,0x02,0xb6,0xef,0x5b,0x47,0x67,0xc6,0xd6,0xcb,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x12,0x00,0x19,\r\n0x00,0x38,0xb7,0x14,0x91,0x40,0x12,0x06,0x00,0x12,0x91,0xb8,0x01,0x00,0x40,0x14,0x30,0x17,0x91,0x00,0x13,0x0f,0x91,0x06,0x04,0x12,0x0c,0x14,0x09,0x7d,0x13,0x13,0x1b,0x14,0x7d,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,\r\n0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x00,0x23,0x22,0x00,0x07,0x05,0x21,0x16,0x00,0x33,0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xc2,0x13,0xfe,0xfd,0xd8,0xd0,0xfe,0xee,0x16,0x03,0xe6,0xfc,0x1a,0x15,0x01,0x0c,0xcb,0xdc,0x01,0x0b,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,\r\n0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x03,0x30,0xf6,0x01,0x0c,0xfe,0xe8,0xea,0x9b,0xea,0xfe,0xec,0x01,0x0b,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x07,0x04,0x05,0xb2,0x00,0x15,0x00,0x20,0x00,0x3e,0x40,0x22,0x16,0x07,0x1f,0x91,0x09,0x13,0x00,0x12,0x02,0x06,0x17,0x03,0x19,0x04,0x91,0x13,0x15,0x19,0x91,0x0f,0x04,0x07,\r\n0x7e,0x16,0x16,0x0c,0x01,0x7e,0x00,0x00,0x22,0x1c,0x7d,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x33,0xd4,0xed,0x11,0x17,0x39,0x3f,0x3f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x11,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x11,0x26,0x23,\r\n0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x07,0x04,0xa8,0x76,0x82,0x36,0x4f,0xf9,0xe8,0xfe,0xce,0xfe,0x92,0x01,0x83,0x01,0x37,0x70,0xbe,0xbe,0x6c,0xd8,0xbc,0xfd,0x34,0xca,0x5e,0xe4,0xfe,0xe2,0x01,0x17,0xe5,0xa0,0x04,0xf4,0x19,0x09,0xfb,0x7e,0x7a,0x01,0x90,0x01,0x44,0x01,0x4c,0x01,0xaa,0x22,0x22,0x44,0xfb,0x0a,0x04,0x3e,0x20,\r\n0xfe,0xba,0xfe,0xf7,0xfe,0xf6,0xfe,0xbe,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0xac,0x04,0x18,0x00,0x15,0x00,0x20,0x00,0x3e,0x40,0x22,0x16,0x07,0x1f,0x95,0x09,0x16,0x00,0x15,0x02,0x06,0x17,0x03,0x19,0x04,0x95,0x13,0x15,0x19,0x95,0x0f,0x10,0x07,0x84,0x16,0x16,0x0c,0x00,0x84,0x01,0x01,0x22,0x1c,0x83,0x0c,0x2f,0xe1,0x12,0x39,\r\n0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x33,0xd4,0xed,0x11,0x17,0x39,0x3f,0x3f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x11,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x05,0xac,0xa4,0x64,0x5c,0x3e,0x3d,0xaf,0xb8,\r\n0xec,0xfe,0xe6,0x01,0x28,0xec,0x54,0x98,0x98,0x54,0xb2,0xae,0xfd,0x81,0x7f,0x46,0x9e,0xc2,0xc5,0xa7,0x6e,0x03,0x62,0x18,0x08,0xfc,0xec,0x56,0x01,0x1b,0xf3,0xfa,0x01,0x28,0x21,0x22,0x43,0xfc,0x80,0x02,0xd8,0x1e,0xd7,0xbd,0xb8,0xd0,0x00,0x02,0xff,0xac,0x00,0x00,0x04,0x7b,0x05,0x9a,0x00,0x16,0x00,0x1d,0x00,0x3c,0x40,0x1f,\r\n0x09,0x09,0x0f,0x02,0x00,0x91,0x18,0x18,0x0f,0x02,0x12,0x17,0x03,0x91,0x0f,0x03,0x13,0x7d,0x1b,0x1b,0x1f,0x02,0x09,0x09,0x07,0x7e,0x0c,0x18,0x01,0x7e,0x02,0x2f,0xe1,0x32,0xd4,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,\r\n0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0x01,0xb6,0xa8,0x18,0x51,0x59,0x14,0x9e,0x16,0xc3,0xa1,0x01,0x88,0xe6,0xfd,0xfe,0xe6,0xef,0xbc,0xb0,0x01,0x65,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x02,0x5d,0x4d,0x37,0x33,0x38,0x42,0x84,0xae,0xe1,0xcb,\r\n0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x01,0x30,0x01,0x1c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x54,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x3c,0x40,0x20,0x0f,0x01,0x18,0x12,0x03,0x1b,0x1e,0x95,0x18,0x16,0x24,0x95,0x12,0x10,0x0a,0x0c,0x95,0x07,0x01,0x0a,0x0a,0x02,0x15,0x83,0x21,0x21,0x28,0x1b,0x0e,0x02,0x84,0x03,0x2f,0xe1,\r\n0x32,0x32,0x12,0x39,0x2f,0xe1,0x10,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x3f,0x11,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,\r\n0x4e,0x04,0xa4,0xb2,0x8c,0x47,0x2f,0x37,0x35,0xa4,0x04,0x76,0xec,0xc5,0xdf,0xfa,0xd9,0xc9,0x6e,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0xfd,0x95,0x06,0x89,0x98,0xb8,0x12,0x94,0x1b,0xcf,0xfe,0xa4,0xcc,0xfe,0xef,0xe9,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7e,0xb2,0xe3,0xcc,0xab,0xc2,0xc6,0x00,0x02,0x00,0xbc,0xff,0x68,\r\n0x04,0x62,0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x40,0x40,0x22,0x11,0x05,0x91,0x40,0x15,0x0a,0x07,0x15,0x91,0x08,0x30,0x00,0x07,0x12,0x14,0x91,0x0a,0x08,0x03,0x10,0x15,0x01,0x00,0x00,0x0e,0x7d,0x19,0x19,0x1d,0x15,0x0a,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x12,0x39,0x00,0x3f,0xdd,0xed,0x3f,\r\n0x2f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x05,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x15,0x21,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x04,0x62,0xc8,0xc5,0x5d,0xa1,0x73,0xa8,0xa8,0x01,0x04,0xcd,0xe7,0xfe,0xc1,0x57,0x47,0xfd,0xe9,0xde,0x89,0xa1,0xfe,0xde,0x98,0x01,\r\n0xb6,0xce,0xfe,0x14,0x05,0x9a,0x98,0xcd,0xb0,0xfe,0xe0,0x4d,0x04,0x36,0x92,0x03,0x1e,0xfe,0x19,0x80,0x74,0xf3,0x00,0x01,0x00,0x62,0xff,0xe8,0x03,0xc7,0x05,0xb2,0x00,0x35,0x00,0x3e,0x40,0x23,0x0a,0x2d,0x14,0x23,0x04,0x05,0x30,0x1b,0x01,0x1b,0x19,0x91,0x1e,0x04,0x20,0x35,0x01,0x35,0x30,0x91,0x05,0x13,0x23,0xb1,0x14,0x1b,\r\n0x14,0x1b,0x0a,0x35,0x35,0x37,0x2d,0xb1,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x00,0x3f,0xed,0xc4,0x5d,0x3f,0xed,0xcd,0x5d,0x12,0x17,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,\r\n0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x03,0xc7,0x1c,0x5d,0x68,0x63,0x23,0x66,0xb8,0x8d,0x53,0x3d,0x68,0x8a,0x4d,0x4b,0x73,0x50,0x29,0x36,0x56,0x6d,0x38,0xc7,0x7f,0x62,0xd3,0x5d,0xb3,0x8c,0x56,0x37,0x60,0x82,0x4b,0x47,0x7b,0x5a,0x33,0x99,0x9b,0x2d,0x6a,0x69,0x5f,0x22,0x3a,0x13,0x1f,0x15,0x0b,0x29,\r\n0x5c,0x93,0x6a,0x50,0x7c,0x66,0x54,0x26,0x25,0x3e,0x42,0x50,0x37,0x3b,0x52,0x34,0x17,0x58,0xbd,0x33,0x2e,0x5e,0x91,0x62,0x50,0x77,0x5e,0x4e,0x26,0x24,0x41,0x47,0x56,0x3a,0x6c,0x73,0x12,0x21,0x30,0x1e,0x00,0x01,0x00,0x56,0xff,0xe8,0x02,0xfd,0x04,0x18,0x00,0x2e,0x00,0x43,0xb7,0x0b,0x20,0x07,0x2a,0x04,0x02,0x1b,0x2e,0xb8,\r\n0xff,0xc0,0x40,0x1b,0x0b,0x0e,0x48,0x2e,0x2e,0x2c,0x95,0x02,0x16,0x18,0x18,0x16,0x95,0x1b,0x10,0x11,0x83,0x20,0x20,0x18,0x00,0x00,0x30,0x18,0x2a,0x83,0x07,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x2f,0x2b,0x11,0x12,0x17,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,\r\n0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x33,0x32,0x37,0x02,0xfd,0x74,0x9e,0x4f,0x93,0x70,0x43,0x29,0x4c,0x6d,0x43,0x33,0x50,0x38,0x1d,0x1d,0x35,0x4a,0x2e,0x93,0x71,0x69,0x85,0x4b,0x8d,0x6e,0x42,0x23,0x45,0x67,0x44,0x31,\r\n0x55,0x3f,0x25,0xd8,0xa2,0x85,0x25,0x3d,0x24,0x4a,0x70,0x4c,0x3e,0x5a,0x45,0x37,0x1a,0x14,0x22,0x2a,0x36,0x28,0x20,0x35,0x26,0x15,0x4a,0xa6,0x2e,0x26,0x4b,0x6f,0x48,0x3b,0x58,0x45,0x37,0x1b,0x13,0x23,0x2c,0x39,0x29,0x90,0x63,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x03,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x38,0x40,0x1b,0x03,0x09,\r\n0x09,0x05,0x02,0x0a,0x91,0x01,0x12,0x04,0x08,0x91,0x05,0x03,0x08,0x04,0x0a,0x03,0x09,0x09,0x02,0x07,0x00,0x00,0x0d,0x04,0x02,0x2f,0xc6,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x33,0x32,0x11,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x12,0x39,0x19,0x2f,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,\r\n0x03,0xf0,0xfc,0x3d,0x01,0xd3,0xfe,0x58,0x03,0x5a,0xfd,0x9c,0x01,0x78,0xfe,0x5f,0x02,0xcb,0x4e,0x02,0x96,0x02,0x5c,0x5a,0x9a,0xfd,0xe8,0xfd,0xac,0x00,0x00,0x02,0xff,0x83,0xfe,0x1e,0x02,0x87,0x06,0x02,0x00,0x15,0x00,0x20,0x00,0x39,0x40,0x1f,0x15,0x13,0x95,0x02,0x1c,0x1f,0x95,0x40,0x07,0xc0,0x19,0x95,0x40,0x0d,0x01,0x15,\r\n0x04,0x16,0x04,0x1c,0x84,0x0a,0x11,0x84,0x04,0x21,0x22,0x04,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xd4,0xe1,0x11,0x33,0x10,0xc4,0x00,0x3f,0x1a,0xed,0x1a,0xdc,0x1a,0xed,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x37,0x01,0x35,0x34,\r\n0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x87,0x39,0x5c,0xfe,0xfc,0x39,0x43,0x65,0x8a,0x90,0x6c,0x80,0x91,0x91,0x38,0x2e,0xfe,0x67,0x71,0x2a,0x39,0x3e,0x31,0x35,0xfe,0x3e,0x20,0x01,0x34,0x04,0xe6,0x1c,0x87,0x67,0x68,0x90,0xab,0x95,0xfa,0xac,0xc4,0x21,0x05,0xf7,0x0d,0xa8,0x3c,0x2b,0x2c,0x3c,0x00,0x00,0x01,0x00,0x2b,\r\n0xfe,0x96,0x02,0x81,0x05,0x2f,0x00,0x1e,0x00,0x3e,0x40,0x22,0x06,0x08,0x95,0x03,0x1e,0x1c,0x95,0x0b,0x16,0x18,0x15,0x0e,0x95,0x14,0x11,0x0f,0x0b,0x40,0x13,0x16,0x48,0x0b,0x84,0x1e,0x17,0x17,0x18,0x06,0x15,0x11,0x18,0x84,0x0f,0x0e,0x2f,0xcd,0xe1,0x39,0x39,0xc4,0x10,0xc1,0x2f,0xd4,0xe1,0x2b,0x00,0x3f,0xcd,0xed,0x39,0x39,\r\n0x3f,0xfd,0xc6,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x36,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x99,0x7e,0x3c,0x34,0x34,0x3c,0x7e,0xfe,0xf3,0xb0,0xb0,0x4d,0x57,0x01,0x02,0xfe,0xfe,0x45,0x52,0x3c,0x2f,0x44,0x87,\r\n0x9f,0x18,0x92,0x1f,0x9f,0x28,0x01,0x2c,0x02,0x60,0x8c,0xfa,0x18,0x1d,0xfe,0xd1,0x8c,0xfd,0xbd,0x67,0x58,0x22,0x00,0x01,0xff,0xcd,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x11,0x00,0x2d,0x40,0x18,0x03,0x12,0x0a,0x04,0x01,0x91,0x40,0x11,0x03,0x08,0x7e,0x0d,0x0d,0x02,0x00,0x02,0x7e,0x03,0x12,0x13,0x03,0x7e,0x08,0x30,0x2b,0x01,\r\n0x10,0xe1,0x18,0xc4,0x10,0xc0,0x2f,0xe1,0x00,0x3f,0x1a,0xed,0x32,0xc4,0x3f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x21,0x04,0x0c,0xfe,0x62,0xa8,0x9b,0x5a,0x65,0x15,0x9d,0x17,0xc2,0xa2,0x02,0xdb,0x05,0x02,0xfa,0xfe,0x05,0x02,0x5c,0x4e,0x37,0x33,0x38,0x42,0x85,0xad,\r\n0x00,0x01,0x00,0x2b,0xff,0xea,0x02,0x81,0x06,0x02,0x00,0x1d,0x00,0x32,0x40,0x1a,0x1d,0x1b,0x95,0x02,0x16,0x0f,0x11,0x95,0x0c,0x01,0x17,0x14,0x05,0x95,0x08,0x0f,0x1d,0x0f,0x16,0x16,0x14,0x08,0x17,0x84,0x06,0x05,0x2f,0xcd,0xf1,0x39,0x39,0xc1,0x2f,0xc4,0xc4,0x00,0x3f,0xed,0x39,0x39,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,\r\n0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0x98,0x83,0x4a,0x41,0x3d,0x40,0x85,0x01,0x02,0xfe,0xfe,0x45,0x52,0x3c,0x2f,0x0a,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xc0,0x93,0xaf,0x1c,\r\n0x92,0x23,0xbf,0xb8,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x01,0x00,0x27,0xfe,0x96,0x04,0x0c,0x05,0x9a,0x00,0x0f,0x00,0x32,0x40,0x1a,0x06,0x04,0x91,0x09,0x01,0x0c,0x91,0x40,0x0e,0x03,0x06,0x06,0x02,0x00,0x0b,0x0d,0x0d,0x02,0x7e,0x0b,0x10,0x11,0x0b,0x7e,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc0,0x18,0x2f,0x10,0xc4,0x11,0x39,0x2f,\r\n0x00,0x3f,0x1a,0xed,0x32,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x21,0x11,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xaa,0x46,0x34,0x3a,0x4e,0xfe,0xbc,0xfe,0x61,0x03,0xe5,0x05,0x02,0xfb,0x33,0xfe,0xf8,0x17,0x94,0x1a,0x01,0x95,0x04,0xd7,0x98,0x00,0x00,0x01,0x00,0x62,0xff,0xe8,0x05,0xa8,\r\n0x05,0x9a,0x00,0x1b,0x00,0x42,0x40,0x24,0x09,0x91,0x17,0x13,0x04,0x0e,0x10,0x11,0x04,0x01,0x91,0x02,0x03,0x12,0x7d,0x0e,0x0e,0x0c,0x06,0x00,0x7e,0x04,0x04,0x0c,0x06,0x11,0x11,0x14,0x7d,0x0c,0x0c,0x1d,0x01,0x06,0x7d,0x1a,0x2f,0xe1,0x33,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x00,\r\n0x3f,0xed,0x17,0x39,0x3f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x15,0x04,0x11,0x14,0x00,0x33,0x32,0x00,0x35,0x10,0x01,0x35,0x21,0x15,0x21,0x04,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x01,0xbe,0xfe,0xa4,0x02,0x06,0xfe,0xa8,0x01,0x15,0xdd,0xe0,0x01,0x18,0xfe,0xa6,0x02,0x06,0xfe,0xa6,0x01,0x5c,0xfe,0x8e,0xfe,0xd0,0xfe,0xcd,\r\n0xfe,0x8f,0x05,0x06,0x94,0x94,0xfe,0xfe,0x86,0xf7,0xfe,0xe6,0x01,0x1c,0xf5,0x01,0x78,0x01,0x00,0x94,0x94,0xec,0xfe,0x6f,0xfe,0xca,0xfe,0x95,0x01,0x66,0x01,0x39,0x01,0x93,0x00,0x01,0x00,0xb8,0xff,0xe8,0x05,0x54,0x05,0xb2,0x00,0x16,0x00,0x2a,0x40,0x16,0x04,0x91,0x14,0x13,0x00,0x03,0x0b,0x09,0x91,0x0e,0x04,0x0b,0x0b,0x01,\r\n0x11,0x7d,0x07,0x07,0x18,0x01,0x7e,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xed,0x31,0x30,0x13,0x33,0x11,0x10,0x21,0x32,0x00,0x11,0x10,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x20,0x11,0xb8,0xa8,0x01,0x58,0xd9,0x01,0x17,0xfe,0xf8,0x48,0x40,0x4d,0x57,0xba,0xde,\r\n0xfe,0x81,0xfe,0xdb,0xfe,0x08,0x05,0x9a,0xfc,0xac,0xfe,0x39,0x01,0x91,0x01,0x25,0x01,0xe5,0x1c,0x9a,0x1a,0xfe,0xad,0xfe,0xe3,0xfe,0x99,0xfe,0x0d,0x02,0x56,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x04,0xd6,0x05,0xb2,0x00,0x15,0x00,0x2b,0x40,0x16,0x00,0x15,0x14,0x03,0x14,0x0c,0x11,0x7e,0x14,0x03,0x14,0x11,0x03,0x13,0x15,0x03,\r\n0x13,0x12,0x0e,0x91,0x09,0x03,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc6,0x12,0x39,0x10,0xcd,0x32,0x31,0x30,0x13,0x01,0x16,0x17,0x33,0x37,0x13,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x01,0x11,0x23,0x11,0x01,0xc1,0x01,0x50,0x1b,0x0c,0x02,0x23,0xc7,0x46,0x8e,0x6b,0x39,0x3a,0x2f,0x3a,0x5a,0x54,\r\n0xfe,0xd1,0xa8,0xfe,0x27,0x05,0x9a,0xfd,0x78,0x33,0x25,0x58,0x01,0x9a,0x91,0x75,0x18,0x9c,0x1c,0xaa,0xfd,0x9e,0xfd,0xf2,0x02,0x12,0x03,0x88,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x04,0x60,0x04,0x18,0x00,0x1c,0x00,0x2f,0x40,0x19,0x14,0x05,0x0f,0x0a,0x0c,0x95,0x07,0x1c,0x10,0x0f,0x00,0x02,0x95,0x1a,0x10,0x0a,0x05,0x0a,0x0f,0x14,\r\n0x04,0x10,0x00,0x1e,0x10,0x2f,0x10,0xc6,0x11,0x17,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xfd,0xc6,0x2f,0x33,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x12,0x33,0x32,0x17,0x04,0x60,0x2c,0x2c,0x66,0x42,0xfe,0x9e,0x7d,0xe5,\r\n0x42,0x29,0x33,0x2e,0x7c,0x3e,0x52,0xfe,0x70,0xb6,0x01,0x15,0x0a,0x0b,0x06,0x05,0x0f,0xc0,0x6d,0xd1,0x29,0x31,0x03,0x79,0x13,0xa8,0xfc,0x78,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x1c,0x32,0x1a,0x34,0x02,0x06,0x01,0x26,0x10,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x11,0x00,0x5a,0x40,0x2e,\r\n0x02,0x02,0x01,0x04,0x01,0x05,0x00,0x05,0x0b,0x0b,0x0a,0x0d,0x0a,0x09,0x0e,0x09,0x04,0x01,0x0a,0x91,0x40,0x0d,0x10,0x08,0x0d,0x91,0x14,0x30,0x09,0x05,0x91,0x08,0x12,0x00,0x0e,0x91,0x10,0x03,0x06,0x0e,0x00,0x00,0x13,0x05,0x0f,0x09,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x33,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2b,0x00,0x18,\r\n0x2f,0x1a,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x10,0x87,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x31,0x30,0x01,0x01,0x33,0x15,0x21,0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x01,0x21,0x35,0x21,0x04,0x64,0xfe,0x71,0xfc,0xfe,0x9d,0xfe,0xae,0x03,0x34,0xfb,0xd1,0x01,0x99,0xe3,0x01,0x4a,0x01,0x41,0xfd,0x00,\r\n0x04,0x02,0x05,0x72,0xfd,0xb3,0x97,0xfe,0x0a,0x98,0x2f,0x02,0x5f,0x97,0x01,0xdd,0x98,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x00,0x11,0x00,0x5a,0x40,0x2e,0x02,0x02,0x01,0x04,0x01,0x05,0x00,0x05,0x0b,0x0b,0x0a,0x0d,0x0a,0x09,0x0e,0x09,0x04,0x01,0x0a,0x95,0x40,0x0d,0x10,0x08,0x0d,0x95,0x14,0x30,0x09,0x05,\r\n0x95,0x08,0x15,0x00,0x0e,0x95,0x10,0x0f,0x06,0x0e,0x00,0x00,0x13,0x05,0x0f,0x09,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x33,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x10,0x87,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x31,0x30,0x01,0x01,0x33,0x15,0x21,0x03,\r\n0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0x70,0xfe,0xec,0xbc,0xfe,0xe0,0xe6,0x02,0x58,0xfc,0xb7,0x01,0x27,0xa8,0x01,0x0c,0xd3,0xfd,0xdb,0x03,0x16,0x03,0xd1,0xfe,0x83,0x8c,0xfe,0xc4,0x8c,0x33,0x01,0x95,0x8c,0x01,0x20,0x8c,0x00,0x00,0x01,0x00,0x0a,0xfe,0x1e,0x04,0x83,0x05,0x9a,0x00,0x18,0x00,0x44,\r\n0x40,0x24,0x0b,0x0a,0x91,0x40,0x11,0x0e,0x17,0x11,0x91,0x09,0x30,0x01,0x03,0x91,0x17,0x1c,0x10,0x0c,0x91,0x0e,0x03,0x11,0x0b,0x0b,0x06,0x00,0x0c,0x10,0x10,0x14,0x7d,0x06,0x06,0x1a,0x0d,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,\r\n0xed,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x24,0x35,0x34,0x24,0x21,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x04,0x00,0x15,0x10,0x00,0x21,0x22,0x0a,0xe0,0xde,0xe9,0x01,0x22,0xfe,0xd1,0xfe,0xf6,0x5c,0x01,0xf5,0xfc,0xf4,0x04,0x02,0xfe,0x02,0x01,0x11,0x01,0x47,0xfe,0x6f,0xfe,0xd4,0xe8,0xfe,0x89,0xb5,0x88,0xef,0xbf,0xcc,\r\n0xe2,0x4c,0x02,0xa4,0x98,0x4c,0xfd,0x52,0x17,0xfe,0xd0,0xef,0xff,0x00,0xfe,0xb4,0x00,0x01,0x00,0x5e,0xfe,0x1e,0x04,0xd7,0x05,0x9a,0x00,0x18,0x00,0x40,0x40,0x22,0x0e,0x0f,0x91,0x40,0x08,0x0a,0x02,0x08,0x91,0x09,0x30,0x18,0x16,0x91,0x02,0x1c,0x09,0x0d,0x91,0x0a,0x03,0x08,0x0e,0x0e,0x13,0x0c,0x18,0x18,0x1a,0x0d,0x09,0x13,\r\n0x7d,0x05,0x2f,0xe1,0xc4,0x32,0x12,0x39,0x2f,0xc6,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x20,0x00,0x11,0x34,0x00,0x25,0x01,0x35,0x21,0x15,0x21,0x01,0x15,0x23,0x20,0x04,0x15,0x14,0x04,0x33,0x32,0x37,0x04,0xd7,0xd5,0xfc,0xfe,0xd5,0xfe,0x83,0x01,\r\n0x4e,0x01,0x0a,0xfe,0x02,0x04,0x02,0xfc,0xf6,0x01,0xf4,0x5c,0xfe,0xf8,0xfe,0xce,0x01,0x22,0xe8,0xf0,0xcf,0xfe,0x89,0x6b,0x01,0x3e,0x01,0x02,0xeb,0x01,0x40,0x17,0x02,0xae,0x4c,0x98,0xfd,0x5c,0x4c,0xe5,0xc9,0xbf,0xef,0x7d,0x00,0x01,0x00,0x1e,0xfe,0x21,0x03,0xaa,0x04,0x00,0x00,0x18,0x00,0x3e,0x40,0x21,0x0e,0x0f,0x96,0x40,\r\n0x08,0x0a,0x02,0x08,0x96,0x09,0x30,0x18,0x16,0x95,0x02,0x1c,0x09,0x0d,0x95,0x0a,0x0f,0x08,0x0e,0x0e,0x13,0x0c,0x18,0x1a,0x0d,0x09,0x13,0x83,0x05,0x2f,0xe1,0xc4,0x32,0x10,0xd6,0xc6,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,\r\n0x37,0x01,0x35,0x21,0x15,0x21,0x01,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x03,0xaa,0x9a,0xca,0xf4,0xfe,0xcc,0xf7,0xcf,0xfe,0x76,0x03,0x2d,0xfd,0xc5,0x01,0x7a,0x54,0xc8,0xe4,0xda,0xaa,0xc4,0x9c,0xfe,0x72,0x51,0xf9,0xcc,0xb0,0xfb,0x1d,0x02,0x1f,0x33,0x8c,0xfd,0xec,0x33,0xab,0x96,0x8d,0xb3,0x62,0x00,0x00,0x01,\r\n0x00,0x0a,0xfe,0x1e,0x03,0x08,0x04,0x00,0x00,0x22,0x00,0x58,0x40,0x30,0x19,0x0b,0x06,0x1f,0x04,0x03,0x10,0x0f,0x96,0x40,0x16,0x13,0x03,0x16,0x96,0x08,0x30,0x00,0x21,0x95,0x03,0x1c,0x15,0x11,0x95,0x13,0x0f,0x16,0x11,0x15,0x10,0x10,0x0b,0x06,0x15,0x15,0x19,0x00,0x00,0x19,0x84,0x0b,0x0b,0x24,0x12,0x1f,0x83,0x06,0x2f,0xe1,\r\n0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x12,0x17,0x39,0x31,0x30,0x05,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x06,\r\n0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x02,0x9e,0x89,0xb9,0xa0,0xb2,0x01,0x38,0xa4,0x7e,0x9e,0x8e,0x52,0x01,0x1a,0xfe,0x0a,0x02,0xd8,0xfe,0xda,0x9e,0xae,0xa6,0xc4,0x93,0x59,0xb8,0xaa,0xfc,0x9e,0x48,0x7d,0x6f,0xc5,0x66,0x36,0x6d,0x59,0x5a,0x67,0x3d,0x01,0x45,0x8c,0x46,0xfe,0xae,0x12,0xa2,0x81,0x7e,0xaf,0x44,0x32,0x45,0x35,\r\n0x6c,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0xc2,0x05,0xb2,0x00,0x1b,0x00,0x6e,0x40,0x38,0x1a,0x01,0x02,0x18,0x02,0x0a,0x07,0x06,0x0d,0x06,0x01,0x1a,0x07,0x99,0x0a,0x0a,0x02,0x10,0x18,0x0d,0x15,0x06,0x02,0x99,0x05,0x18,0x12,0x10,0x9a,0x15,0x07,0x08,0x08,0x12,0x07,0x1a,0x01,0x18,0x02,0x0a,0x07,0x0d,0x06,0x00,0x00,0x18,\r\n0x04,0x04,0x18,0x8a,0x0d,0x0d,0x1d,0x12,0x02,0x06,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x10,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x32,0x12,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x01,0x21,\r\n0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x33,0x03,0xc2,0xfe,0xde,0xfe,0x85,0x02,0x9b,0xfc,0xa0,0x01,0x7f,0xfd,0x01,0x84,0x69,0x52,0x90,0x81,0xbe,0xb2,0xa2,0xe5,0xc0,0xdb,0x9f,0x9f,0x02,0x2b,0xfe,0x69,0x94,0x92,0x01,0x99,0x93,0x77,0x9d,\r\n0x55,0x78,0x88,0xa4,0xac,0x83,0xcf,0xb0,0xaf,0xc6,0x00,0x01,0x00,0x74,0xff,0xe8,0x03,0xc8,0x05,0x9a,0x00,0x1d,0x00,0x42,0x40,0x24,0x0d,0x14,0x09,0x9a,0x40,0x16,0x10,0x1c,0x16,0x9a,0x08,0x30,0x01,0x03,0x95,0x1c,0x16,0x13,0x0e,0x99,0x10,0x06,0x11,0x11,0x19,0x89,0x06,0x06,0x1f,0x0e,0x13,0x14,0x03,0x0d,0x0f,0x00,0x2f,0xc6,\r\n0xc4,0x17,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x23,0x13,0x23,0x35,0x21,0x15,0x21,0x03,0x36,0x33,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0xa4,0x93,0x98,0x99,0xb9,0xbe,0xb1,0x32,\r\n0x4d,0x5f,0x07,0x45,0x9e,0x03,0x13,0xfe,0x25,0x33,0x41,0x2c,0xe7,0xfb,0xfe,0xf1,0xec,0xbd,0x23,0xae,0x5f,0xad,0x8d,0x8e,0x9d,0x05,0x07,0x02,0x3b,0x94,0x94,0xfe,0x5c,0x04,0xe6,0xca,0xd0,0xfe,0x00,0x01,0x00,0x48,0xff,0xe8,0x02,0xcd,0x04,0x00,0x00,0x1b,0x00,0x42,0x40,0x24,0x0b,0x12,0x09,0x95,0x40,0x14,0x0e,0x1a,0x14,0x95,\r\n0x08,0x30,0x01,0x03,0x95,0x1a,0x16,0x11,0x0c,0x95,0x0e,0x0f,0x10,0x10,0x17,0x83,0x06,0x06,0x1d,0x0c,0x11,0x12,0x03,0x0b,0x0d,0x00,0x2f,0xc6,0xc4,0x17,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,\r\n0x22,0x07,0x13,0x23,0x35,0x21,0x15,0x21,0x07,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x5a,0x72,0x7a,0x64,0x7b,0x83,0x73,0x17,0xa6,0x3e,0x68,0x02,0x5c,0xfe,0xa2,0x28,0x32,0x14,0x9d,0xcc,0xd5,0xb2,0x9e,0x18,0xa6,0x4c,0x6c,0x57,0x54,0x65,0x08,0x01,0x8e,0x8c,0x8c,0xfd,0x02,0xa7,0x94,0x97,0xbf,0x00,0x00,0x01,0x00,0x1e,\r\n0xff,0xe8,0x02,0xe4,0x05,0x2f,0x00,0x20,0x00,0x41,0x40,0x21,0x1c,0x05,0x1f,0x0f,0x01,0x03,0x95,0x1f,0x16,0x11,0x15,0x12,0x0c,0x95,0x0f,0x0f,0x14,0x14,0x15,0x1c,0x83,0x05,0x05,0x22,0x12,0x0f,0x15,0x84,0x0c,0x01,0x01,0x0d,0x0c,0x2f,0xcd,0x39,0x2f,0x10,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x39,\r\n0x39,0xcd,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x35,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x70,0x76,0x95,0xc3,0x38,0x7d,0x92,0x5b,0x7e,0x7e,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x66,0x89,0x6f,0xc9,\r\n0xad,0x96,0x25,0xb0,0x63,0x90,0x2e,0x4b,0x3f,0x4c,0x9b,0x6d,0x66,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0x62,0x4b,0x5e,0x31,0x44,0x8c,0x5e,0x7f,0xa3,0x00,0x02,0x00,0xa6,0xfe,0x29,0x04,0x16,0x04,0x18,0x00,0x0c,0x00,0x15,0x00,0x2c,0x40,0x17,0x02,0x1b,0x05,0x07,0x0e,0x95,0x00,0x03,0x0f,0x14,0x95,0x07,0x10,0x0a,0x83,0x11,0x11,0x17,\r\n0x0e,0x05,0x01,0x84,0x02,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x12,0x39,0x3f,0x31,0x30,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x00,0x01,0x11,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x01,0x4a,0xa4,0xa4,0xac,0xc2,0x97,0xc7,0xfe,0x84,0xfe,0xb0,0xf2,0x01,0x32,0x70,0x5c,0x9e,\r\n0x2d,0xfe,0x56,0x05,0xd7,0x81,0x99,0xc4,0x92,0xdf,0xfe,0x72,0x02,0x80,0xfd,0x9b,0x61,0x01,0x34,0xad,0x5d,0x7a,0x00,0x01,0x00,0xac,0xfe,0x1e,0x01,0x40,0x06,0x1e,0x00,0x03,0x00,0x0f,0xb6,0x03,0xfa,0x00,0x1c,0x00,0xca,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x40,0x94,0x94,0xfe,0x1e,0x08,0x00,0x00,\r\n0x00,0x02,0x00,0xac,0xfe,0x1e,0x02,0x66,0x06,0x1e,0x00,0x03,0x00,0x07,0x00,0x25,0x40,0x12,0x02,0x01,0x06,0x05,0x1c,0x06,0xfa,0x00,0xca,0x01,0x01,0x09,0x04,0xca,0x00,0x05,0x01,0x05,0x2f,0x5d,0xe1,0x12,0x39,0x7c,0x2f,0xe1,0x00,0x18,0x3f,0x3f,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x02,0x66,0x93,\r\n0x93,0xfe,0xda,0x94,0x94,0xfe,0x1e,0x08,0x00,0xf8,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x33,0xfe,0x1e,0x03,0x72,0x06,0x1e,0x00,0x13,0x00,0x4f,0x40,0x2c,0x12,0x01,0x04,0x95,0x07,0x11,0x0e,0x0b,0x95,0x08,0x40,0x0c,0x03,0x08,0x07,0x08,0x3a,0x03,0x1c,0x0c,0xfa,0x10,0x09,0x00,0x05,0x08,0x0b,0x0e,0x11,0x04,0x02,0x00,0x03,0x05,\r\n0x05,0x02,0xca,0x03,0x14,0x15,0x03,0xca,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc0,0x18,0x2f,0x10,0xc4,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x39,0x39,0x10,0xed,0x39,0x39,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x03,\r\n0x72,0xfe,0xaa,0x93,0xfe,0xaa,0x01,0x56,0xfe,0xaa,0x01,0x56,0x93,0x01,0x56,0xfe,0xaa,0x01,0x56,0x01,0x46,0xfc,0xd8,0x03,0x28,0x8b,0x01,0x17,0x8a,0x02,0xac,0xfd,0x54,0x8a,0xfe,0xe9,0xff,0xff,0x00,0xb4,0xff,0xee,0x01,0x92,0x05,0x9a,0x02,0x06,0x00,0x04,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x09,0xbc,0x07,0x62,0x00,0x26,\r\n0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x3d,0x05,0x58,0x00,0x00,0x01,0x07,0x00,0xe0,0x06,0x43,0x01,0x56,0x00,0x13,0x40,0x0b,0x03,0x05,0x1f,0x1f,0x18,0x19,0x25,0x03,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x08,0xef,0x06,0x0c,0x00,0x26,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x5d,0x05,0x7f,\r\n0x00,0x00,0x01,0x07,0x00,0xe0,0x05,0xf5,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x0e,0x1f,0x1f,0x18,0x19,0x25,0x03,0x1c,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x08,0x05,0x06,0x0c,0x00,0x26,0x00,0x47,0x00,0x00,0x00,0x27,0x00,0x5d,0x04,0x95,0x00,0x00,0x01,0x07,0x00,0xe0,0x05,0x0c,0x00,0x00,\r\n0x00,0x13,0x40,0x0b,0x03,0x0e,0x2d,0x2d,0x26,0x27,0x25,0x03,0x2a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xff,0xe8,0x06,0x29,0x05,0x9a,0x00,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x2d,0x03,0xfe,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x02,0xed,0xb4,0x0c,0x12,0x02,0x05,0x25,0x01,0x2b,0x35,0xff,0xff,\r\n0x00,0xbc,0xfe,0x1e,0x05,0x39,0x05,0xd9,0x00,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x00,0x4d,0x03,0xd3,0x00,0x00,0x00,0x10,0xb1,0x02,0x01,0xb8,0x01,0xf3,0xb4,0x18,0x0f,0x02,0x05,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xa6,0xfe,0x1e,0x03,0x77,0x05,0xec,0x00,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x4d,0x02,0x11,0x00,0x00,\r\n0xff,0xff,0x00,0xbc,0xff,0xe8,0x07,0xe4,0x05,0x9a,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x2d,0x05,0xb9,0x00,0x00,0x00,0x0e,0xb9,0x00,0x01,0x03,0xda,0xb4,0x1a,0x20,0x0a,0x13,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0xfe,0x1e,0x07,0x34,0x05,0xd9,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x4d,0x05,0xce,0x00,0x00,\r\n0x00,0x10,0xb1,0x02,0x01,0xb8,0x03,0x20,0xb4,0x26,0x1d,0x0a,0x13,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xa6,0xfe,0x1e,0x05,0xed,0x05,0xd9,0x00,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x4d,0x04,0x87,0x00,0x00,0x00,0x10,0xb1,0x02,0x01,0xb8,0x02,0x88,0xb4,0x25,0x1c,0x0a,0x12,0x25,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,\r\n0x00,0x00,0x05,0x12,0x07,0x62,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x12,0x01,0x56,0x00,0x16,0xb9,0x00,0x02,0xff,0xfd,0x40,0x09,0x13,0x10,0x05,0x00,0x25,0x02,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x0c,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x00,0xe0,\r\n0x7f,0x00,0x00,0x13,0x40,0x0b,0x02,0x18,0x23,0x20,0x08,0x14,0x25,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf7,0x00,0x00,0x02,0x29,0x07,0x62,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x91,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x04,0x02,0x03,0x25,0x01,0x06,0x05,0x26,0x00,\r\n0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xdf,0x00,0x00,0x02,0x11,0x06,0x0c,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x79,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x07,0x04,0x02,0x03,0x25,0x01,0x06,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x62,0x02,0x26,\r\n0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x85,0x01,0x56,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x18,0x03,0x09,0x25,0x02,0x1a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x0c,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xd9,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,\r\n0x1b,0x18,0x03,0x09,0x25,0x02,0x1a,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x62,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x41,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x11,0x0e,0x05,0x0d,0x25,0x01,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,\r\n0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x0c,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0a,0x15,0x12,0x08,0x11,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x9a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x51,\r\n0x00,0x69,0x01,0x60,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x00,0x21,0x1b,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x3a,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x60,0xe9,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x07,\r\n0x25,0x1f,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x42,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x54,0x00,0x80,0x01,0x60,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x0a,0x21,0x0e,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,\r\n0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xe2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x05,0x54,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x10,0x25,0x12,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,\r\n0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x5a,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x05,0x53,0x00,0x80,0x01,0x60,0x00,0x1f,0x40,0x12,0x03,0x02,0x01,0x00,0x24,0x1e,0x05,0x0d,0x25,0x03,0x02,0x01,0x30,0x21,0x01,0x21,0x05,0x26,0x00,0x2b,0x71,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,\r\n0x03,0xe2,0x06,0xfa,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x61,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x07,0x28,0x22,0x08,0x11,0x25,0x03,0x02,0x01,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x08,0x42,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,\r\n0x06,0x62,0x00,0x6d,0x01,0x60,0x00,0x1e,0xb2,0x03,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0b,0x10,0x1b,0x05,0x0d,0x25,0x03,0x02,0x01,0x1e,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0xe2,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x06,0x62,0xee,0x00,0x00,0x1b,0x40,0x0f,\r\n0x03,0x02,0x01,0x00,0x14,0x1f,0x08,0x11,0x25,0x03,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x19,0x00,0x48,0x40,0x21,0x06,0x40,0x0b,0x0e,0x48,0x06,0x06,0x04,0x13,0x95,0x40,0x01,0x09,0x0f,0x01,0x95,0x08,0x30,0x17,0x95,\r\n0x0f,0x16,0x04,0x95,0x09,0x10,0x0c,0x83,0x01,0x13,0x13,0x1b,0x06,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x06,0x14,0x83,0x00,0x2f,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0xc5,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x2b,0x31,0x30,0x13,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,\r\n0x00,0x23,0x22,0x02,0x35,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x52,0x02,0xd3,0x05,0xae,0x9b,0xad,0x90,0x86,0xde,0xd9,0xf8,0xfe,0xf1,0xc8,0xcb,0xdb,0x02,0xd1,0xfd,0xd7,0x02,0x86,0x78,0x74,0xa2,0x02,0x29,0xab,0xba,0x72,0x9a,0x62,0xfe,0xe9,0xfd,0xf1,0xfe,0xd5,0x01,0x06,0xe5,0x35,0x8f,0x9d,0xa6,0xff,0xff,0x00,0x16,0x00,0x00,\r\n0x05,0x12,0x07,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x05,0x51,0x00,0x33,0x01,0x60,0x00,0x1e,0xb2,0x04,0x03,0x02,0xb8,0xff,0xf6,0x40,0x0b,0x23,0x1d,0x05,0x00,0x25,0x04,0x03,0x02,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x3a,0x00,0x26,0x00,0x44,\r\n0xf8,0x00,0x01,0x06,0x06,0x60,0xa3,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x14,0x33,0x2d,0x08,0x14,0x25,0x04,0x03,0x02,0x30,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x9a,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x05,0x52,0x00,0x90,0x01,0x65,0x00,0x17,\r\n0x40,0x0d,0x03,0x02,0x00,0x12,0x13,0x05,0x00,0x25,0x03,0x02,0x14,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x35,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x06,0x63,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x20,0x22,0x23,0x08,0x14,0x25,0x03,0x02,0x24,0x11,0x26,0x00,\r\n0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x06,0x8c,0x02,0x26,0x00,0x91,0x00,0x00,0x01,0x07,0x00,0xd9,0x03,0x5a,0x01,0x5d,0x00,0x16,0xb9,0x00,0x02,0x01,0x50,0x40,0x09,0x16,0x17,0x05,0x0f,0x25,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x06,0x4e,\r\n0x05,0x2f,0x00,0x26,0x00,0xa0,0xf8,0x00,0x01,0x07,0x00,0xd9,0x02,0x1a,0x00,0x00,0x00,0x13,0x40,0x0b,0x03,0x06,0x38,0x39,0x11,0x23,0x25,0x03,0x37,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x7d,0x05,0xb2,0x00,0x21,0x00,0x61,0x40,0x37,0x01,0x20,0x18,0x92,0x0f,0x1b,0x1f,0x1b,0x2f,0x1b,\r\n0x03,0x1b,0x1b,0x17,0x1c,0x91,0x1e,0x1e,0x0a,0x02,0x17,0x15,0x91,0x04,0x13,0x1f,0x0d,0x2f,0x0d,0x02,0x0d,0x0f,0x91,0x0a,0x04,0x00,0x00,0x1f,0x1a,0x1d,0x1d,0x1c,0x12,0x0d,0x0d,0x01,0x18,0x1f,0x7e,0x1c,0x1c,0x23,0x12,0x7d,0x07,0x2f,0xe9,0x12,0x39,0x2f,0xf9,0x39,0x39,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xc6,0x10,0xc0,0x2f,0x00,\r\n0x3f,0xfd,0xc6,0x5d,0x3f,0xed,0x32,0x32,0x11,0x39,0x2f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x15,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x05,0x7d,0x91,0xd8,0xfe,0xf8,0xfe,0xcd,0xfe,\r\n0x85,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x1e,0xf5,0xa8,0x7b,0xfe,0xc8,0x01,0x38,0xfe,0xc6,0x01,0xe2,0x91,0x01,0x31,0xcf,0x7a,0x01,0x8c,0x01,0x46,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xf0,0xfe,0xc9,0x43,0x6f,0x8b,0x98,0x98,0xfe,0xd0,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0xb6,\r\n0x04,0x18,0x00,0x22,0x00,0x2f,0x00,0x77,0x40,0x12,0x22,0x00,0x0f,0x0b,0x01,0x17,0x03,0x0b,0x95,0x40,0x0c,0x13,0x08,0x0c,0x95,0x08,0x30,0x06,0xb8,0xff,0xc0,0x40,0x2d,0x0b,0x0f,0x48,0x06,0x06,0x08,0x95,0x03,0x1c,0x1c,0x10,0x19,0x2d,0x95,0x13,0x1e,0x0f,0x27,0x95,0x19,0x10,0x21,0x01,0x1f,0x0d,0x0a,0x0f,0x06,0x22,0x22,0x1f,\r\n0x0c,0x0c,0x16,0x1f,0x84,0x23,0x1d,0x0f,0x0f,0x31,0x2a,0x83,0x06,0x16,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x12,0x39,0x2f,0x10,0xc2,0x2f,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x12,0x39,0x39,0x3f,0xed,0x32,0x2f,0x2b,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x5f,0x5e,0x5d,0x39,0x39,0x31,0x30,0x05,\r\n0x23,0x02,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x21,0x35,0x21,0x36,0x35,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x14,0x07,0x33,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xb6,0xdb,0x77,0xfe,0x90,0xbe,0x8e,0xad,0x9d,0xda,0x5d,0xfe,0xb4,0x01,0x83,0x0c,\r\n0x04,0x75,0xeb,0xbd,0xeb,0x01,0x00,0xd5,0xcf,0x64,0x04,0xa4,0x0c,0xb2,0xfe,0xb6,0xa5,0x7b,0x97,0xad,0xa7,0x86,0x8a,0xad,0xd1,0xfe,0xef,0x48,0xa4,0x60,0x85,0x8b,0x3d,0x45,0x99,0xc5,0x01,0x0c,0xd8,0xf5,0x01,0x2f,0xa6,0x8e,0xfc,0x52,0x50,0x48,0x02,0x3e,0x6e,0x7a,0xae,0xd6,0xba,0x9d,0xc5,0xc2,0xff,0xff,0x00,0x5e,0xff,0xe8,\r\n0x04,0xec,0x07,0x62,0x02,0x26,0x00,0x2a,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x5c,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x36,0x1d,0x1a,0x05,0x19,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0c,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc2,0x00,0x00,\r\n0x00,0x13,0x40,0x0b,0x02,0x09,0x29,0x26,0x10,0x18,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x07,0x62,0x02,0x26,0x00,0x2e,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xdd,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xad,0x40,0x09,0x14,0x11,0x08,0x00,0x25,0x01,0x13,0x05,0x26,\r\n0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x62,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0x81,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xb1,0x40,0x09,0x10,0x0d,0x06,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x02,0x00,0x5e,0xfe,0x70,0x05,0xaa,0x05,0xb2,\r\n0x00,0x19,0x00,0x25,0x00,0x50,0xb1,0x06,0x04,0xb8,0x01,0x05,0x40,0x0b,0x09,0x20,0x91,0x0e,0x00,0x13,0x1a,0x91,0x14,0x04,0x0e,0xb8,0x01,0x04,0xb5,0x00,0x00,0x02,0x06,0x06,0x02,0xb8,0x01,0x04,0x40,0x0f,0x0c,0x0c,0x19,0x0f,0x19,0x0f,0x11,0x17,0x7d,0x23,0x23,0x27,0x1d,0x7d,0x11,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,\r\n0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc2,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x33,0xed,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x48,0x80,0x44,\r\n0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x83,0xfe,0xe5,0xfe,0xac,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0xb9,0xfe,0xa7,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x14,0x7e,0x4d,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x6f,0x75,0x11,0x01,0x8d,0x01,0x34,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,0xfe,0xba,0xfe,0x6b,0x05,0x16,\r\n0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x02,0x00,0x60,0xfe,0x70,0x04,0x50,0x04,0x18,0x00,0x19,0x00,0x25,0x00,0x4c,0xb1,0x06,0x04,0xb8,0x01,0x05,0x40,0x0b,0x09,0x20,0x95,0x00,0x0e,0x16,0x1a,0x95,0x14,0x10,0x0e,0xb8,0x01,0x04,0xb3,0x00,0x06,0x06,0x02,0xb8,0x01,0x04,0x40,0x0f,\r\n0x0c,0x0c,0x19,0x0f,0x19,0x0f,0x11,0x17,0x83,0x23,0x23,0x27,0x1d,0x83,0x11,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0xd6,0xe1,0x00,0x3f,0xed,0x3f,0x33,0xed,0x2f,0xfd,0xc6,0x31,0x30,0x05,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x02,0x35,0x10,0x00,\r\n0x33,0x32,0x00,0x15,0x14,0x02,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xa2,0x81,0x43,0x1e,0x1a,0x1e,0x34,0x4c,0x5c,0x83,0xd0,0xf5,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xe6,0xfe,0xf4,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x14,0x80,0x4b,0x46,0x0d,0x6b,0x0d,0x50,0x46,0x6f,0x75,0x0e,0x01,0x1c,0xe0,0x01,0x02,\r\n0x01,0x22,0xfe,0xe6,0xfa,0xde,0xfe,0xdf,0x03,0x89,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0xff,0xff,0x00,0x5e,0xfe,0x70,0x05,0xaa,0x06,0x8c,0x02,0x26,0x05,0x14,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0xd2,0x01,0x5d,0x00,0x13,0x40,0x0b,0x02,0x0a,0x28,0x29,0x11,0x17,0x25,0x02,0x27,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0x00,0x60,0xfe,0x70,0x04,0x50,0x05,0x2f,0x02,0x26,0x05,0x15,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x26,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x0a,0x28,0x29,0x11,0x17,0x25,0x02,0x27,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0a,0xfe,0x1e,0x04,0x83,0x07,0x62,0x02,0x26,0x04,0xe1,0x00,0x00,0x01,0x07,\r\n0x00,0xe0,0x00,0x8b,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xc4,0x40,0x09,0x1c,0x19,0x01,0x14,0x25,0x01,0x1b,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xdd,0xfe,0x21,0x03,0x68,0x06,0x0c,0x00,0x26,0x05,0x97,0x00,0x00,0x01,0x06,0x00,0xe0,0xf8,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0xd5,0x40,0x09,0x1c,0x19,0x01,\r\n0x14,0x25,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0x3a,0xfe,0x1e,0x02,0x10,0x06,0x0c,0x02,0x26,0x06,0xac,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x78,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0xb5,0x10,0x0d,0x06,0x0c,0x25,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,\r\n0x09,0xbc,0x05,0x9a,0x00,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0x3d,0x05,0x58,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,0x9d,0xb4,0x15,0x19,0x01,0x04,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x08,0xf0,0x05,0x9a,0x00,0x26,0x00,0x27,0x00,0x00,0x01,0x07,0x00,0x5d,0x05,0x80,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,\r\n0x4b,0xb4,0x15,0x19,0x01,0x04,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x08,0x06,0x05,0xec,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0x5d,0x04,0x96,0x00,0x00,0x00,0x0e,0xb9,0x00,0x02,0x04,0x26,0xb4,0x23,0x27,0x08,0x10,0x25,0x01,0x2b,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x07,0x68,0x02,0x26,0x00,0x2a,\r\n0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x27,0x01,0x5e,0x00,0x13,0x40,0x0b,0x01,0xcb,0x1c,0x1a,0x05,0x19,0x25,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x06,0x0a,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x56,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x67,0x28,0x26,\r\n0x10,0x18,0x25,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbc,0xff,0xe8,0x07,0x79,0x05,0x9a,0x00,0x17,0x00,0x43,0x40,0x25,0x08,0x91,0x40,0x0d,0x0b,0x0a,0x0d,0x91,0x2b,0x30,0x13,0x91,0x03,0x13,0x0a,0x12,0x17,0x0f,0x10,0x0b,0x03,0x0e,0x0d,0x09,0x10,0x7e,0x07,0x07,0x0a,0x17,0x7e,0x16,0x16,0x19,\r\n0x09,0x7e,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x07,0x79,0xe8,0xcd,0xc9,0xda,0xfd,0x43,0xa8,\r\n0xa8,0x02,0xbd,0xa7,0x01,0x05,0x01,0x04,0xa8,0x01,0xac,0xd6,0xee,0xe5,0xd3,0xee,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfc,0x14,0xfe,0xd1,0x01,0x29,0x02,0x58,0x00,0x02,0x00,0xbc,0xfe,0x29,0x05,0x27,0x05,0xb2,0x00,0x0c,0x00,0x15,0x00,0x2e,0x40,0x18,0x05,0x00,0x07,0x02,0x1b,0x0e,0x91,0x00,0x03,0x03,0x14,0x91,0x07,0x04,\r\n0x0a,0x7d,0x11,0x11,0x17,0x0e,0x05,0x01,0x7e,0x02,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x2f,0xed,0x3f,0x11,0x12,0x39,0x31,0x30,0x05,0x11,0x23,0x11,0x33,0x15,0x36,0x21,0x32,0x12,0x15,0x10,0x00,0x01,0x11,0x24,0x00,0x11,0x34,0x26,0x23,0x22,0x01,0x64,0xa8,0xa8,0xeb,0x01,0x1d,0xc2,0xf9,0xfe,0x03,0xfe,\r\n0x3a,0x01,0x61,0x01,0xb2,0xa3,0x88,0xea,0x3a,0xfe,0x63,0x07,0x71,0xe2,0xfa,0xfe,0xf2,0xc7,0xfe,0xbf,0xfd,0xdb,0x03,0x7f,0xfc,0x78,0x91,0x01,0xc9,0x01,0x03,0x8e,0xbd,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x07,0x68,0x02,0x26,0x00,0x31,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x7d,0x01,0x5e,0x00,0x16,0xb9,0x00,0x01,0xff,\r\n0x93,0x40,0x09,0x16,0x14,0x0a,0x13,0x25,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x0a,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0xcb,0x00,0x00,0x00,0x16,0xb9,0x00,0x01,0xff,0x90,0x40,0x09,0x15,0x13,0x0a,0x12,0x25,0x01,0x14,0x11,0x26,0x00,0x2b,0x35,0x01,\r\n0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x5e,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x1d,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8a,0x40,0x0a,0x16,0x10,0x05,0x00,0x25,0x03,0x02,0x15,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x06,0x00,\r\n0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x07,0x04,0x6e,0x01,0xa1,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xbc,0x40,0x0a,0x26,0x20,0x08,0x14,0x25,0x03,0x02,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xf0,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0x00,\r\n0x01,0x5c,0x00,0x13,0x40,0x0b,0x02,0x00,0x17,0x10,0x05,0x00,0x25,0x02,0x17,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x05,0xbc,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x06,0x04,0x2a,0xae,0x28,0x00,0x13,0x40,0x0b,0x02,0x20,0x26,0x20,0x08,0x14,0x25,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,\r\n0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x9e,0x00,0x00,0x03,0xb4,0x07,0x5e,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc1,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x8a,0x40,0x0a,0x12,0x0c,0x02,0x0b,0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,\r\n0x06,0x00,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xbf,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xa2,0x40,0x0a,0x20,0x1a,0x0c,0x12,0x25,0x03,0x02,0x1f,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x18,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x2a,\r\n0xff,0xd3,0x01,0x84,0x00,0x16,0xb9,0x00,0x01,0xff,0xf3,0x40,0x09,0x12,0x0c,0x02,0x0b,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbc,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x06,0x04,0x2a,0xc0,0x28,0x00,0x16,0xb9,0x00,0x02,0xff,0xfa,0x40,0x09,0x20,0x1a,0x0c,0x12,0x25,\r\n0x02,0x20,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0x86,0x00,0x00,0x01,0xce,0x07,0x5e,0x02,0x26,0x00,0x2c,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0xa9,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x0a,0x04,0x02,0x03,0x25,0x02,0x01,0x09,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,\r\n0xff,0x6e,0x00,0x00,0x01,0xb6,0x06,0x00,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0x91,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x0a,0x04,0x02,0x03,0x25,0x02,0x01,0x09,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0xff,0xf8,0x00,0x00,0x02,0x28,0x07,0x18,0x02,0x26,0x00,0x2c,\r\n0x00,0x00,0x01,0x07,0x04,0x2a,0xfe,0xb8,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x0a,0x04,0x02,0x03,0x25,0x01,0x0a,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xe6,0x00,0x00,0x02,0x0a,0x05,0xbe,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x07,0x04,0x70,0x00,0xf8,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x0b,0x04,\r\n0x02,0x03,0x25,0x01,0x0b,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x5e,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x91,0x01,0x5e,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8e,0x40,0x0a,0x1e,0x18,0x03,0x09,0x25,0x03,0x02,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x00,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xe3,0x00,0x00,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0x8c,0x40,0x0a,0x1e,0x18,0x03,0x09,0x25,0x03,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x18,\r\n0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0xac,0x01,0x84,0x00,0x13,0x40,0x0b,0x02,0x00,0x1e,0x18,0x03,0x09,0x25,0x02,0x1e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xbc,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x04,0x2a,0x00,0x28,0x00,0x13,0x40,0x0b,0x02,0x00,\r\n0x1e,0x18,0x03,0x09,0x25,0x02,0x1e,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa0,0x00,0x00,0x04,0xc0,0x07,0x5e,0x00,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc3,0x01,0x5e,0x00,0x0a,0xb4,0x03,0x02,0x2d,0x05,0x26,0x00,0x2b,0x35,0x35,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0xbc,0x06,0x00,0x02,0x26,\r\n0x00,0x55,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0x27,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x77,0x40,0x0a,0x17,0x11,0x08,0x10,0x25,0x02,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x07,0x18,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x04,0x2a,0xff,0xfe,0x01,0x84,\r\n0x00,0x08,0xb3,0x02,0x2e,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x9a,0x00,0x00,0x02,0xca,0x05,0xbc,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x04,0x2a,0xff,0x5a,0x00,0x28,0x00,0x13,0x40,0x0b,0x01,0x00,0x17,0x11,0x08,0x10,0x25,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,\r\n0x07,0x5e,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x04,0x6e,0x02,0x54,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x96,0x40,0x0a,0x14,0x0e,0x05,0x0d,0x25,0x02,0x01,0x13,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x06,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x04,0x6e,\r\n0x01,0xd1,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x99,0x40,0x0a,0x18,0x12,0x08,0x11,0x25,0x02,0x01,0x17,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x07,0x18,0x02,0x26,0x00,0x38,0x00,0x00,0x01,0x07,0x04,0x2a,0x00,0x68,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x14,0x0e,\r\n0x05,0x0d,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x90,0xff,0xe8,0x03,0xe2,0x05,0xbc,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x06,0x04,0x2a,0xeb,0x28,0x00,0x13,0x40,0x0b,0x01,0x0a,0x18,0x12,0x08,0x11,0x25,0x01,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0x10,0xfe,0x21,\r\n0x03,0xcb,0x05,0xb2,0x00,0x24,0x00,0x53,0x40,0x2d,0x1d,0x0c,0x0f,0x09,0x01,0x1f,0x03,0x09,0x0b,0x91,0x40,0x0c,0x17,0x23,0x0c,0x91,0x08,0x30,0x01,0x03,0x91,0x23,0x1b,0x14,0x12,0x91,0x17,0x04,0x1d,0x1a,0x0b,0x0b,0x06,0x01,0x0f,0x7d,0x1a,0x1a,0x20,0x7d,0x06,0x06,0x26,0x14,0x01,0x2f,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,\r\n0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xfd,0xc6,0x5f,0x5e,0x5d,0x12,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x20,0x00,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x37,0x24,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x04,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x10,0x00,0x21,0x22,\r\n0x10,0x4c,0x66,0x01,0x00,0x01,0x58,0xe4,0xb7,0x5a,0x73,0x71,0x01,0xae,0xc2,0xa7,0xac,0xa2,0x9a,0xbe,0xf6,0x01,0x15,0xfe,0xd7,0xad,0xca,0xfe,0x47,0xfe,0xb4,0x67,0xfe,0x2f,0x9c,0x13,0x01,0x11,0xcf,0xa0,0xca,0x20,0x97,0x19,0x5f,0x01,0x09,0x83,0x9d,0x5a,0xa4,0x4e,0xec,0xc2,0xfe,0xe7,0x72,0x09,0x29,0xf9,0xb0,0xfe,0xf8,0xfe,\r\n0x8b,0x00,0x00,0x01,0x00,0x1e,0xfe,0x21,0x03,0x3e,0x04,0x18,0x00,0x25,0x00,0x51,0x40,0x2d,0x1e,0x0c,0x09,0x40,0x1f,0x22,0x48,0x09,0x0b,0x95,0x40,0x0c,0x18,0x24,0x0c,0x95,0x08,0x30,0x01,0x03,0x95,0x24,0x1c,0x15,0x13,0x95,0x18,0x10,0x1e,0x1b,0x0b,0x0b,0x06,0x01,0x10,0x84,0x1b,0x1b,0x21,0x83,0x06,0x06,0x27,0x01,0x15,0x2f,\r\n0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xfd,0xc6,0x2b,0x12,0x39,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x24,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,\r\n0x16,0x16,0x15,0x14,0x00,0x21,0x22,0x2f,0x42,0x55,0xcb,0x01,0x05,0xa4,0x8c,0x58,0x5e,0x60,0x9e,0xb0,0x93,0x89,0x96,0x8e,0x86,0xb0,0xc7,0xe7,0xe8,0x84,0xa0,0xfe,0xa4,0xfe,0xeb,0x61,0xfe,0x2d,0x91,0x12,0xc8,0x9e,0x7d,0x9a,0x1d,0x8c,0x12,0x1e,0x92,0x62,0x62,0x70,0x52,0x97,0x45,0xbd,0x97,0xc7,0x6d,0x07,0x1e,0xc7,0x8c,0xd9,\r\n0xfe,0xe2,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x07,0x62,0x02,0x26,0x00,0x2b,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x58,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x0c,0x06,0x0b,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x07,0x62,0x02,0x26,0x00,0x4b,0x00,0x00,\r\n0x01,0x07,0x00,0xe0,0x00,0x81,0x01,0x56,0x00,0x16,0xb9,0x00,0x01,0xff,0xb1,0x40,0x09,0x15,0x12,0x0a,0x11,0x25,0x01,0x14,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0xbc,0xfe,0x29,0x05,0x27,0x05,0xb2,0x00,0x12,0x00,0x2a,0x40,0x16,0x0c,0x09,0x0f,0x01,0x1b,0x09,0x12,0x0a,0x03,0x04,0x91,0x0f,0x04,0x00,0x7e,0x01,\r\n0x01,0x14,0x0c,0x08,0x7e,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x11,0x10,0x21,0x22,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x12,0x21,0x32,0x12,0x11,0x05,0x27,0xa8,0xfe,0x9f,0xc0,0xfa,0xa8,0xa8,0x06,0x9e,0x01,0x3e,0xe9,0xf8,0xfe,0x29,0x05,0x0c,0x01,0xe5,\r\n0xfe,0xe6,0xd5,0xfc,0xd5,0x05,0x9a,0xfe,0xfa,0x01,0x1e,0xfe,0xcd,0xfe,0xe3,0x00,0x00,0x02,0x00,0x3e,0xff,0xe8,0x04,0x81,0x05,0x9a,0x00,0x1e,0x00,0x2a,0x00,0x62,0x40,0x36,0x14,0x00,0x1f,0x91,0x40,0x0a,0x04,0x1a,0x0a,0x91,0x08,0x30,0x25,0x91,0x1a,0x13,0x10,0x04,0x03,0x14,0x00,0x12,0x02,0x10,0x7d,0x0f,0x0f,0x0d,0x7e,0x12,\r\n0x12,0x17,0x28,0x04,0x7d,0x8f,0x05,0x01,0x05,0x05,0x07,0x7e,0x02,0x02,0x22,0x1d,0x17,0x7d,0x28,0x28,0x2c,0x22,0x7d,0x1d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x5d,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0xe1,0x11,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,\r\n0x31,0x30,0x01,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x56,0xcd,0x37,0xac,0x3b,0xa4,0x89,0x8a,0xa6,0x3e,0xae,0x37,0xd1,0x86,0x97,0xfe,0xc8,0xef,\r\n0xf2,0xfe,0xd6,0x02,0x20,0x9e,0xd2,0xd8,0x98,0x9f,0xd4,0xda,0x03,0x60,0x6a,0xde,0x78,0x7a,0x70,0x7a,0x74,0x96,0x96,0x74,0x76,0x74,0x7c,0x76,0xce,0x7a,0x34,0xd6,0x8b,0xd7,0xfe,0xf4,0x01,0x01,0xd9,0x01,0x1e,0x2a,0xaf,0x95,0x95,0xb2,0xb1,0x96,0x95,0xaf,0x00,0x02,0x00,0x48,0xff,0xe8,0x04,0x42,0x05,0xec,0x00,0x1e,0x00,0x2a,\r\n0x00,0x54,0x40,0x2f,0x15,0x00,0x1f,0x95,0x40,0x0b,0x05,0x1a,0x0b,0x95,0x08,0x30,0x25,0x95,0x1a,0x16,0x11,0x05,0x00,0x11,0x84,0x10,0x10,0x01,0x10,0x10,0x0e,0x84,0x13,0x13,0x17,0x83,0x28,0x28,0x2c,0x1d,0x05,0x84,0x06,0x06,0x08,0x84,0x03,0x03,0x22,0x83,0x1d,0x2f,0xe1,0x39,0x2f,0xf1,0xc2,0x2f,0xe1,0x11,0x12,0x39,0x2f,0xe1,\r\n0x39,0x2f,0xf1,0xc2,0x2f,0x71,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x04,0x11,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x01,0x52,0x5f,0x6e,0x2b,0xa0,0x27,0x98,0x85,0x85,0x95,0x26,0x9f,0x2b,0xcc,0x01,0x0a,0xfe,0xd7,0xdb,0xdf,0xfe,0xe9,0x01,0xfe,0x92,0xc4,0xc8,0x8c,0x91,0xc5,0xc8,0x03,0x74,0x30,0xc6,0x7c,0x80,0x86,0x78,0x84,0x8e,0xae,0xaf,0x8d,0x84,0x78,0x86,0x80,0xf5,0x7d,0x7e,0xfe,0xdb,0xd7,0xfe,0xee,0x01,0x0b,0xda,0x01,0x26,0x36,\r\n0xbd,0x9d,0x9c,0xc1,0xc0,0x9d,0x99,0xc1,0x00,0x01,0x00,0x21,0xff,0x0c,0x04,0x7b,0x05,0x9a,0x00,0x11,0x00,0x30,0x40,0x18,0x01,0x07,0x0d,0x91,0x06,0x12,0x0c,0x08,0x91,0x0a,0x03,0x08,0x0c,0x10,0x01,0x01,0x03,0x7e,0x10,0x10,0x13,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc4,0x32,0x00,0x3f,0xed,0x39,\r\n0x3f,0xed,0x39,0x2f,0x31,0x30,0x05,0x23,0x36,0x35,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x04,0x5a,0xa4,0x27,0x91,0xfc,0xd5,0x03,0x41,0xfd,0x02,0x04,0x00,0xfc,0xb8,0x02,0x3c,0x01,0x23,0xf4,0x46,0x3c,0x72,0x2f,0x04,0xd3,0x98,0x28,0xfb,0x26,0xfc,0x47,0x00,0x01,0x00,0x21,0xff,0x1e,0x03,0x9e,\r\n0x04,0x00,0x00,0x11,0x00,0x33,0x40,0x1b,0x01,0x07,0x0d,0x95,0x06,0x15,0x0c,0x08,0x95,0x0a,0x0f,0x08,0x0c,0x10,0x01,0xa0,0x03,0xb0,0x03,0x02,0x03,0x10,0x10,0x13,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xdd,0x5d,0xc6,0x10,0xc4,0x32,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2f,0x31,0x30,0x05,0x23,0x36,0x35,0x34,0x23,0x21,\r\n0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x03,0x7f,0x95,0x22,0x85,0xfd,0x9a,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x01,0x80,0x01,0x0c,0xe2,0x40,0x38,0x6a,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0xe8,0x41,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xea,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xdb,\r\n0x01,0xc7,0x01,0x65,0x00,0x13,0x40,0x0b,0x02,0x00,0x13,0x19,0x05,0x00,0x25,0x02,0x10,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0x7b,0x05,0x85,0x00,0x26,0x00,0x44,0xf8,0x00,0x01,0x07,0x00,0xdb,0x01,0x38,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x20,0x23,0x29,0x08,0x14,0x25,0x02,0x20,0x11,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xa3,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x05,0x51,0x00,0xb0,0x01,0x69,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x03,0x2b,0x25,0x03,0x09,0x25,0x04,0x03,0x02,0x28,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,\r\n0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x3a,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x60,0x00,0x00,0x00,0x1b,0x40,0x0f,0x04,0x03,0x02,0x00,0x2b,0x25,0x03,0x09,0x25,0x04,0x03,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0xb7,0x02,0x26,0x00,0x32,\r\n0x00,0x00,0x01,0x07,0x05,0x55,0x00,0xaa,0x01,0x62,0x00,0x17,0x40,0x0d,0x03,0x02,0x09,0x22,0x18,0x03,0x09,0x25,0x03,0x02,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x55,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x64,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,\r\n0x0b,0x22,0x18,0x03,0x09,0x25,0x03,0x02,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xea,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x36,0x01,0x65,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x21,0x03,0x09,0x25,0x02,0x18,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,\r\n0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x85,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x8a,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x1b,0x21,0x03,0x09,0x25,0x02,0x18,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x07,0x9a,0x02,0x26,0x00,0x32,0x00,0x00,\r\n0x01,0x07,0x05,0x52,0x00,0xfe,0x01,0x65,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1a,0x1b,0x03,0x09,0x25,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x35,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x06,0x06,0x63,0x52,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x1a,\r\n0x1b,0x03,0x09,0x25,0x03,0x02,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x06,0x8c,0x02,0x26,0x00,0x3c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xfb,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x10,0x11,0x05,0x00,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x2f,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xb4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x17,0x18,0x0c,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x03,0x01,0x33,0x04,0xc2,0x03,0x7b,0x06,0x3a,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x32,\r\n0xb2,0x02,0xe2,0x01,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x01,0x04,0x0a,0x16,0xc1,0x10,0x00,0x01,0x00,0x01,0x13,0x0d,0xc0,0x07,0x13,0xc0,0x07,0x19,0x2f,0xc6,0xe1,0x10,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xfd,0x39,0x39,0xde,0x2b,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x56,0xfe,0x04,0x01,0xfc,0x3e,0x28,0x3a,0x39,0x27,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x05,0xcd,0x6d,0xfe,0x88,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x02,0x01,0x08,0x04,0xc2,\r\n0x03,0x04,0x06,0x35,0x00,0x03,0x00,0x0f,0x00,0x25,0xb2,0x02,0xe2,0x01,0xb8,0xff,0xc0,0x40,0x0e,0x09,0x0c,0x48,0x01,0x0a,0xc1,0x04,0x01,0x01,0x0d,0x00,0x0d,0xc0,0x07,0x2f,0xe1,0xc4,0x10,0xc0,0x2f,0x00,0x2f,0xfd,0xde,0x2b,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,\r\n0x04,0xfe,0x04,0x01,0xfc,0xfe,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x05,0xc8,0x6d,0xfe,0x8d,0x39,0x2a,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x64,0x06,0xfa,0x00,0x06,0x00,0x12,0x00,0x1e,0x00,0x37,0xb4,0x05,0x00,0x03,0x80,0x01,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0c,0x48,0x01,0x07,0x0d,0x19,0xc1,0x13,\r\n0x00,0x03,0x00,0x03,0x16,0x10,0xc0,0x0a,0x16,0xc0,0x0a,0x1c,0x2f,0xc6,0xe1,0x10,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xfd,0x39,0x39,0xd6,0x2b,0x1a,0xcd,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x17,0x37,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x03,0x5a,0xd5,0x85,0xd7,0x73,0xa4,0xa4,0x1e,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xfa,0xfe,0xb6,0x01,0x4a,0xe6,0xe6,0xfd,0xc8,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x77,0x06,0xe2,\r\n0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x35,0xb2,0x00,0x80,0x01,0xb8,0xff,0xc0,0x40,0x16,0x09,0x0c,0x48,0x01,0x04,0x0a,0x16,0xc1,0x40,0x10,0x00,0x80,0x02,0x02,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x07,0x19,0x2f,0xc6,0xe1,0x10,0xe1,0x12,0x39,0x2f,0x1a,0xcd,0x00,0x2f,0x1a,0xfd,0x39,0x39,0xd6,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x01,0x23,\r\n0x13,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x77,0xfe,0xf9,0x7e,0xdf,0x31,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xe2,0xfe,0xb8,0x01,0x48,0xfd,0xe0,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,\r\n0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x02,0x01,0x23,0x04,0xb2,0x03,0xa4,0x06,0x55,0x00,0x13,0x00,0x17,0x00,0x3c,0x40,0x17,0x14,0x15,0x14,0x15,0x0a,0x13,0xc4,0x00,0x09,0xc4,0x0a,0x17,0xe2,0x14,0x40,0x0d,0x12,0x48,0x14,0x13,0x07,0xda,0x0d,0xb8,0xff,0xc0,0xb7,0x09,0x0c,0x48,0x0d,0x11,0xda,0x09,0x03,0x00,0x2f,0xc6,\r\n0xfd,0xdc,0x2b,0xed,0xd6,0xd6,0x2b,0xed,0x01,0x2f,0xe1,0xd4,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x37,0x21,0x35,0x21,0x03,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x1a,0xfe,0x04,\r\n0x01,0xfc,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x36,0x6d,0x00,0x02,0x00,0x90,0xff,0xe8,0x03,0xb8,0x04,0x18,0x00,0x15,0x00,0x20,0x00,0x46,0xb9,0x00,0x04,0xff,0xc0,0x40,0x23,0x09,0x0c,0x48,0x04,0x04,0x02,0x0d,0x10,0x16,0x96,0x00,0x00,0x1d,0x02,0x95,0x08,0x16,0x0b,0x0f,0x1d,0x95,0x10,0x10,0x04,0x04,\r\n0x13,0x83,0x1a,0x1a,0x22,0x16,0x0c,0x00,0x84,0x0b,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x12,0x39,0x11,0x33,0x2f,0x2b,0x31,0x30,0x01,0x10,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x25,0x37,0x36,0x36,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x31,0xd5,0xba,0x94,0x37,0xcb,0x5a,0xfe,0x98,0xa3,0x05,0x6a,0xd0,0x99,0xad,0xfe,0xae,0xfe,0xcb,0xfa,0x6e,0x77,0x6a,0x5a,0x7c,0x9f,0x01,0x77,0xfe,0xfb,0x7e,0xa8,0x27,0x39,0x01,0x7e,0x02,0x9a,0xa0,0xb8,0xa2,0x86,0xfe,0xe1,0x2f,0x58,0x22,0x0f,0x51,0x68,0x4c,0x5e,0xad,0x81,0x00,0x02,\r\n0x00,0x60,0xff,0xe8,0x04,0x10,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x49,0x40,0x18,0x02,0x1b,0x95,0x05,0x16,0x01,0x15,0x0e,0x15,0x95,0x0b,0x10,0x0f,0x0f,0x11,0x0d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0x40,0x13,0x0c,0x06,0x4d,0x01,0x01,0x1f,0x18,0x08,0x0c,0x06,0x4d,0x18,0x83,0x08,0x0e,0x0c,0x06,0x4d,0x08,\r\n0x2f,0x2b,0xe9,0x2b,0x12,0x39,0x2f,0x2b,0xe9,0x2b,0x33,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,\r\n0xd3,0x60,0x04,0xa4,0xa4,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfd,0xcf,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x54,0x04,0x18,0x00,0x10,0x00,0x1d,0x00,0x49,0x40,0x16,0x03,0x15,0x01,0x15,0x95,0x0f,0x16,0x07,0x1b,0x95,0x09,0x10,\r\n0x04,0x0f,0x0c,0x06,0x0c,0x06,0x4d,0x0c,0x83,0x18,0xb8,0xff,0xec,0x40,0x15,0x0c,0x06,0x4d,0x18,0x18,0x1f,0x06,0x02,0x12,0x06,0x0c,0x06,0x4d,0x12,0x84,0x03,0x02,0x0c,0x06,0x4d,0x03,0x2f,0x2b,0xe9,0x2b,0x32,0x32,0x12,0x39,0x2f,0x2b,0xe9,0x2b,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x31,0x30,0x25,0x23,0x15,0x23,0x11,\r\n0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x4e,0x04,0xa4,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0x6c,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0x94,0x94,0x04,0x00,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,\r\n0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x56,0x06,0x02,0x00,0x1a,0x00,0x27,0x00,0x38,0x40,0x1e,0x10,0x01,0x13,0x1f,0x95,0x19,0x16,0x03,0x15,0x25,0x95,0x13,0x10,0x0a,0x0c,0x95,0x07,0x01,0x0a,0x0a,0x16,0x83,0x22,0x22,0x29,0x10,0x02,0x1c,0x83,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,\r\n0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x23,0x15,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0x50,0x04,0xa6,0xfd,0xdc,0x8a,0x7e,0x84,0x88,\r\n0x87,0xa8,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xca,0x6d,0xa5,0x7f,0x95,0xab,0x9f,0x88,0x8f,0xae,0x94,0x94,0x03,0xdd,0x01,0x14,0x01,0x11,0x37,0x98,0x44,0xa5,0xf3,0x93,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x02,0x49,0x8f,0x7f,0xb1,0xe5,0xca,0xaa,0xc3,0xc7,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x04,0x18,0x00,0x15,\r\n0x00,0x26,0x40,0x14,0x30,0x01,0x01,0x01,0x03,0x95,0x14,0x16,0x0b,0x09,0x95,0x0e,0x10,0x11,0x83,0x06,0x06,0x17,0x0b,0x00,0x2f,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x5c,0x78,\r\n0x84,0x99,0xc1,0xbd,0x9f,0x83,0x79,0x78,0x9e,0xdb,0x01,0x0f,0xfe,0xe7,0xed,0x8c,0x21,0xa5,0x54,0xdc,0xb8,0xb4,0xd4,0x54,0x9b,0x43,0xfe,0xe3,0xe5,0xfe,0xfe,0xd0,0x00,0x02,0x00,0x60,0xff,0x70,0x03,0xa0,0x04,0x18,0x00,0x1d,0x00,0x26,0x00,0x57,0x40,0x1e,0x14,0x12,0x20,0x0f,0x05,0x00,0x1c,0x0a,0x03,0x16,0x96,0x25,0x20,0x96,\r\n0x1c,0x16,0x0d,0x0f,0x95,0x0a,0x10,0x1e,0x14,0x23,0x12,0x00,0x05,0x19,0x07,0x02,0xb8,0x01,0x03,0x40,0x0c,0x03,0x07,0x0d,0x0d,0x19,0x84,0x23,0x23,0x28,0x12,0x83,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xd4,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xd6,0xed,0x2f,0x11,0x12,0x39,\r\n0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x25,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x01,0x68,0x1c,0x06,0x8c,0x0d,0x31,0x98,0x01,0x22,0xf2,0x87,0x67,0x72,0x82,0x9d,0xc9,0x46,\r\n0x8a,0xbc,0x76,0x96,0xbc,0x9a,0x7c,0x24,0x4c,0x60,0x55,0x63,0x7e,0x88,0x18,0x50,0x58,0x86,0x70,0x90,0xf2,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0x9c,0x64,0xb4,0x79,0x5c,0x66,0x87,0xb4,0x30,0x37,0x2e,0x56,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x21,0x05,0xec,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x19,0x17,0x95,0x02,\r\n0x1c,0x12,0x06,0x0f,0x24,0x95,0x09,0x16,0x1e,0x95,0x0f,0x10,0x14,0x00,0x19,0x19,0x15,0x84,0x1a,0x12,0x06,0x06,0x28,0x21,0x83,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x10,\r\n0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x41,0x42,0x92,0xa0,0x04,0x72,0xee,0xc2,0xe6,0x01,0x04,0xd6,0xcc,0x62,0x04,0xa4,0xa0,0x3c,0x35,0xfe,0x4b,0xa2,0x80,0x99,0xa9,0xa4,0x89,0x8a,0xad,0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x48,0xcc,\r\n0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xf9,0x86,0xc8,0x1a,0x03,0x13,0x87,0x7f,0xb1,0xe0,0xc2,0xac,0xce,0xcb,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x21,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x13,0x07,0x10,0x24,0x95,0x0a,0x16,0x05,0x15,0x1e,0x95,0x10,0x10,0x00,0x02,0x95,0x17,0x01,0x00,0x00,0x05,0x84,\r\n0x1a,0x13,0x06,0x06,0x28,0x21,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xa4,0x04,0x72,0xee,0xc2,0xe6,0x01,0x04,0xd6,0xcc,0x62,0x04,0xb4,0x8a,0x48,0x2f,0xfe,0x4b,0xa2,0x80,0x99,0xa9,0xa4,0x89,0x8a,0xad,0x05,0x5c,0x1b,0xcf,0xfb,0x58,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x01,0x42,0x99,0xb7,0x12,0xfb,0xe7,0x87,0x7f,0xb1,\r\n0xe0,0xc2,0xac,0xce,0xcb,0x00,0x00,0x02,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x00,0x12,0x00,0x18,0x00,0x4b,0xb9,0x00,0x01,0xff,0xc0,0x40,0x1f,0x0b,0x0e,0x48,0x01,0x01,0x03,0x07,0x95,0x40,0x18,0x0b,0x11,0x18,0x95,0x08,0x30,0x03,0x95,0x11,0x16,0x15,0x95,0x0b,0x10,0x0e,0x83,0x13,0x06,0x06,0x1a,0x01,0xb8,0xff,0xc0,0xb6,\r\n0x0e,0x12,0x48,0x01,0x18,0x83,0x07,0x2f,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x34,0x12,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x01,0x02,0x23,0x22,0x06,0x07,0x9a,0x9a,0xb4,0x97,0xa7,0x03,\r\n0xfd,0x29,0xeb,0xcd,0xcd,0xf8,0xfe,0xfb,0xd8,0xc2,0x01,0xf3,0x28,0xfb,0x7a,0x8a,0x02,0x42,0xa2,0x72,0xbd,0xa8,0x56,0xe0,0x01,0x0b,0xfe,0xe3,0xfb,0xf7,0xfe,0xdf,0x02,0x7a,0x01,0x2c,0xa1,0x8b,0x00,0x02,0x00,0x50,0xff,0xe8,0x05,0x16,0x04,0x18,0x00,0x1d,0x00,0x26,0x00,0x77,0x40,0x14,0x05,0x05,0x06,0x1e,0x1e,0x26,0x1f,0x04,\r\n0x1f,0x17,0x17,0x16,0x0e,0x0e,0x0f,0x0d,0x18,0x0d,0x1d,0x02,0xb8,0x01,0x04,0x40,0x2c,0x1b,0x1e,0x05,0x1f,0x04,0x18,0x04,0x0d,0x18,0x1f,0x04,0x15,0x22,0x95,0x0a,0x16,0x12,0x40,0x09,0x0e,0x48,0x12,0x10,0x95,0x15,0x10,0x1e,0x0e,0x25,0x17,0x05,0x07,0x12,0x00,0x00,0x07,0x83,0x25,0x25,0x28,0x12,0x1f,0x83,0x0d,0x2f,0xe1,0xc6,\r\n0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xed,0x12,0x17,0x39,0x2f,0x11,0x12,0x39,0x39,0xd6,0xed,0xc6,0x31,0x30,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x06,0x23,0x22,0x27,0x07,0x16,0x15,0x14,0x00,0x23,0x22,0x26,0x27,0x01,0x26,0x23,0x22,0x07,\r\n0x35,0x36,0x33,0x32,0x17,0x37,0x17,0x16,0x33,0x32,0x37,0x05,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x05,0x16,0x38,0x34,0x88,0x3c,0x3e,0x23,0xfe,0xf5,0xcc,0xbe,0xd9,0x0d,0x02,0x85,0x5b,0xa9,0xa4,0x99,0x9e,0xbe,0xf0,0x86,0xc3,0x21,0x22,0x4c,0x30,0x2e,0xfd,0xfc,0xfd,0xe8,0x0a,0x8b,0x6b,0x8f,0x9c,0x02,0x98,0x1f,0x8d,0x22,\r\n0x61,0x7f,0xf4,0xfe,0xd8,0xee,0xdc,0x01,0x60,0x7c,0x72,0x9a,0x62,0xb8,0x68,0x68,0x6a,0x22,0x84,0xfe,0xda,0x6c,0x90,0xd4,0xb8,0x56,0x00,0x01,0x00,0x60,0xff,0xe8,0x02,0xf4,0x04,0x18,0x00,0x22,0x00,0x45,0x40,0x25,0x07,0x1a,0x95,0x40,0x19,0x0d,0x02,0x19,0x95,0x0c,0x30,0x22,0x20,0x95,0x02,0x16,0x10,0x12,0x95,0x0d,0x10,0x07,\r\n0x05,0x1a,0x1a,0x1d,0x10,0x00,0x00,0x24,0x05,0x15,0x83,0x0a,0x1d,0x83,0x05,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x02,0xf4,0x72,0x98,0xba,0xd0,0xde,0xbb,0xc9,0xa4,0x82,0x67,0x6d,0x7c,0x5a,0x6d,0x8c,0x78,0x50,0x52,0xfe,0xdd,0x80,0x72,0x86,0x74,0x1a,0x32,0xa1,0x87,0xcf,0x37,0x04,0x40,0xa8,0x7d,0x99,0x2e,0x9a,0x3e,0x51,0x43,0x4c,0x58,0x8e,0xac,0x4e,0x5c,\r\n0x3e,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x02,0xee,0x04,0x18,0x00,0x21,0x00,0x4d,0x40,0x2a,0x1b,0x09,0x95,0x40,0x0a,0x15,0x20,0x0a,0x95,0x0c,0x30,0x70,0x01,0x01,0x01,0x03,0x95,0x20,0x16,0x12,0x10,0x95,0x15,0x10,0x1b,0x1d,0x09,0x0e,0x83,0x18,0x18,0x1d,0x09,0x09,0x00,0x1d,0x83,0x06,0x06,0x23,0x12,0x00,0x2f,0xc4,0x12,0x39,\r\n0x2f,0xe1,0x12,0x39,0x2f,0x10,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x5a,\r\n0x72,0x8e,0x6f,0x7d,0xfe,0xdf,0x54,0x50,0x79,0x8b,0xc9,0x76,0x72,0x73,0x81,0xa2,0xc1,0xb9,0xdc,0xdb,0xbb,0x8c,0x1a,0x9a,0x42,0x5f,0x4b,0xac,0x8e,0x59,0x4b,0x94,0x3c,0x98,0x2e,0x97,0x7b,0xa5,0x45,0x04,0x33,0xcb,0x88,0xaa,0x00,0x01,0x00,0x5a,0xff,0xe8,0x04,0x35,0x04,0x18,0x00,0x2c,0x00,0x72,0x40,0x3d,0x04,0x05,0x27,0x08,\r\n0x2c,0x02,0x96,0x2a,0x26,0x19,0x27,0x27,0x24,0x08,0x08,0x18,0x95,0x40,0x19,0x24,0x0d,0x19,0x95,0x0c,0x30,0x70,0x10,0x01,0x10,0x12,0x95,0x0d,0x16,0x21,0x1f,0x95,0x24,0x10,0x27,0x04,0x26,0x00,0x00,0x0a,0x08,0x0a,0x18,0x18,0x15,0x0f,0x1d,0x84,0x26,0x26,0x0a,0x83,0x15,0x15,0x2e,0x21,0x0f,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,\r\n0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x10,0xc2,0x2f,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x11,0x12,0x39,0x2f,0x12,0x39,0xd6,0xed,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x07,0x06,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,\r\n0x36,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x37,0x17,0x16,0x33,0x32,0x37,0x04,0x35,0x39,0x2f,0x7a,0x3d,0x54,0x54,0x5c,0xdc,0xdb,0xbb,0x8c,0x72,0x72,0x8e,0x6f,0x7d,0xfe,0xdf,0x54,0x52,0x73,0x8f,0xc9,0x76,0x72,0x73,0x81,0x01,0x1d,0x3d,0x86,0x20,0x27,0x4e,0x2a,0x2e,0x02,\r\n0x98,0x1f,0x79,0x56,0x56,0x2a,0x04,0x34,0xca,0x88,0xaa,0x32,0x9a,0x42,0x5f,0x4b,0xac,0x8e,0x5d,0x49,0x92,0x3c,0x98,0x2e,0xdc,0x8c,0x5e,0x74,0x22,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x0c,0x04,0x18,0x00,0x10,0x00,0x23,0x00,0x44,0x40,0x25,0x01,0x11,0x95,0x40,0x12,0x0c,0x06,0x12,0x95,0x0c,0x30,0x1e,0x95,0x06,0x16,0x18,\r\n0x95,0x0c,0x10,0x01,0x03,0x11,0x11,0x21,0x1b,0x15,0x84,0x0f,0x0f,0x03,0x83,0x21,0x21,0x25,0x1b,0x83,0x09,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,\r\n0x16,0x15,0x14,0x05,0x35,0x33,0x32,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x3a,0xd2,0xe8,0xc2,0xee,0xfe,0xec,0x01,0x26,0xee,0xa8,0xd2,0xfe,0x24,0x44,0xf4,0x7a,0x62,0xa4,0xc2,0xc2,0xa0,0x74,0x86,0xfe,0xf6,0x02,0x1c,0x04,0x30,0xca,0x87,0xaf,0x01,0x1a,0xf0,0xfc,0x01,0x2a,0x9b,0x7b,\r\n0xa2,0x98,0x8e,0xa0,0x43,0x55,0xd5,0xbf,0xb6,0xd2,0x60,0x4a,0xac,0x00,0x00,0x01,0xff,0x81,0xfe,0x1e,0x02,0x1c,0x04,0x00,0x00,0x14,0x00,0x4b,0x40,0x29,0x13,0x01,0x0d,0x95,0x40,0x10,0x11,0x05,0x10,0x95,0x08,0x30,0x08,0x0a,0x95,0x40,0x05,0x1c,0x11,0x0f,0x08,0x0c,0x13,0x10,0x0c,0x00,0x0e,0x02,0x0e,0x0c,0x42,0x0e,0x02,0x84,\r\n0x0c,0x15,0x16,0x0c,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xc6,0x2b,0x01,0x10,0xe2,0x12,0x39,0x39,0x18,0x10,0xc6,0x00,0x3f,0x3f,0x1a,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x02,0x1c,0xae,0xc3,\r\n0xad,0x48,0x35,0x3d,0x42,0xcb,0xaf,0xaf,0xa3,0xae,0x01,0xdb,0xfe,0x04,0xd6,0xeb,0x1a,0x99,0x27,0x01,0x31,0x02,0x00,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x02,0x00,0x60,0xfe,0x1e,0x05,0x21,0x06,0x02,0x00,0x21,0x00,0x2e,0x00,0x4a,0xb9,0x00,0x0a,0xff,0xc0,0x40,0x26,0x0b,0x0f,0x48,0x0a,0x0a,0x0c,0x95,0x07,0x1c,0x1b,0x0f,0x18,0x2c,\r\n0x95,0x12,0x16,0x26,0x95,0x18,0x10,0x00,0x02,0x95,0x1f,0x01,0x00,0x00,0x05,0x84,0x22,0x1b,0x0f,0x0f,0x30,0x0a,0x29,0x83,0x15,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x32,0x2f,0x2b,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x10,0x21,0x22,0x27,\r\n0x35,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xfd,0xe4,0xbe,0x8e,0xad,0x9d,0x01,0x7a,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xb4,0x8a,0x48,0x2f,\r\n0xfe,0x4b,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x05,0x5c,0x1b,0xcf,0xfb,0xaa,0xfd,0xcc,0x48,0xa4,0x60,0x01,0x92,0x70,0xc4,0x01,0x11,0xe6,0x01,0x05,0x01,0x34,0xa6,0x01,0x40,0x99,0xb7,0x12,0xfb,0xdf,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,0x04,0x18,0x02,0x06,0x00,0x4a,0x00,0x00,\r\n0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xcd,0x04,0x18,0x00,0x19,0x00,0x41,0x40,0x23,0x17,0x95,0x40,0x18,0x08,0x02,0x18,0x95,0x08,0x30,0x15,0x00,0x13,0x95,0x02,0x16,0x0b,0x0d,0x95,0x08,0x10,0x17,0x17,0x15,0x10,0x0b,0x0b,0x00,0x84,0x15,0x15,0x1b,0x10,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x00,\r\n0x3f,0xfd,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x03,0xcd,0xaf,0xb8,0xec,0xfe,0xe6,0x01,0x38,0xf6,0x9a,0x82,0x82,0xa3,0xa9,0xd4,0xc5,0xa7,0x6e,0x4b,0xdf,0x01,0x7f,\r\n0x3e,0x56,0x01,0x18,0xf0,0xf1,0x01,0x37,0x30,0x9c,0x42,0xe0,0xb4,0xb8,0xd0,0x26,0x01,0x04,0x8b,0x00,0x00,0x02,0x00,0x0e,0xfe,0x52,0x03,0xc6,0x04,0x00,0x00,0x11,0x00,0x19,0x00,0x16,0x40,0x0a,0x16,0x95,0x07,0x00,0x0f,0x0e,0x0f,0x00,0x1b,0x0e,0x2f,0x10,0xc6,0x00,0x3f,0x3f,0x2f,0xed,0x31,0x30,0x01,0x01,0x17,0x16,0x15,0x14,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x01,0x33,0x09,0x02,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x03,0xc6,0xfe,0x78,0x22,0x5e,0x7c,0x63,0x5f,0x78,0x62,0x22,0xfe,0x82,0xb2,0x01,0x26,0x01,0x2e,0xfe,0xd0,0x40,0x40,0x41,0x04,0x00,0xfc,0xa0,0x44,0xbc,0x68,0x63,0x83,0x83,0x63,0x5a,0xca,0x44,0x03,0x60,0xfd,0x42,0x02,0xbe,0xfc,\r\n0x10,0x8b,0x49,0x63,0x63,0x40,0x00,0x02,0x00,0x0a,0xff,0xe8,0x03,0x9e,0x04,0x18,0x00,0x1b,0x00,0x23,0x00,0x2a,0x40,0x17,0x20,0x95,0x09,0x16,0x00,0x12,0x19,0x02,0x10,0x95,0x15,0x10,0x0c,0x1e,0x22,0x06,0x0e,0x04,0x06,0x12,0x00,0x25,0x12,0x2f,0x10,0xc6,0x11,0x17,0x39,0x00,0x3f,0xfd,0x39,0x39,0xd6,0xc4,0x3f,0xed,0x31,0x30,\r\n0x01,0x26,0x23,0x22,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x17,0x01,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x03,0x9e,0x46,0x33,0x75,0x7d,0x95,0x85,0x74,0x6f,0x7e,0x92,0x82,0x73,0x3f,0x36,0x40,0x4a,0x9e,0xa3,0xa5,0x9e,0x48,0x3e,0xfe,0x37,0x58,0x58,\r\n0x58,0x03,0x60,0x2e,0xbf,0xef,0xca,0x88,0xa6,0xa4,0x86,0xd2,0xeb,0xbf,0x2c,0x96,0x20,0xce,0xce,0x20,0xfe,0x60,0xa3,0x97,0xac,0xac,0x92,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0x27,0x40,0x14,0x00,0x1b,0x11,0x02,0x08,0x0c,0x95,0x05,0x16,0x08,0x0f,0x11,0x84,0x02,0x10,0x10,0x13,0x09,0x84,0x08,\r\n0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x78,0xda,0xfe,0xa8,0xa3,0xeb,0x7a,0xa6,0xa4,0xfe,0x29,0x02,0x81,0xc2,0x01,0xa1,0x02,0x77,0xfd,0xb2,0xfe,0xc0,0xbb,0x8f,0x02,\r\n0x44,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x1b,0x00,0x32,0x40,0x1a,0x16,0x00,0x19,0x09,0x15,0x04,0x95,0x19,0x10,0x10,0x12,0x95,0x0d,0x01,0x10,0x10,0x16,0x00,0x84,0x01,0x01,0x1d,0x16,0x08,0x84,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x12,0x39,0x39,\r\n0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xfc,0xdb,0x8a,0x7e,0x84,0x88,0x87,0xa8,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x03,0xdd,0x01,0x14,0x01,0x11,\r\n0x37,0x98,0x44,0xa5,0xf3,0x89,0xc2,0xfe,0x5f,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x03,0xf8,0x06,0x02,0x00,0x24,0x00,0x40,0x40,0x22,0x06,0x08,0x95,0x03,0x1c,0x1f,0x22,0x12,0x15,0x0d,0x95,0x22,0x10,0x19,0x1b,0x95,0x16,0x01,0x19,0x19,0x1f,0x00,0x06,0x06,0x11,0x00,0x84,0x0a,0x0a,0x26,0x1f,0x11,0x84,0x12,0x2f,0xe1,0x32,0x12,\r\n0x39,0x2f,0xe1,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xbf,\r\n0xad,0x4c,0x36,0x3e,0x44,0xc8,0xee,0x78,0xa4,0xa4,0xfc,0xdb,0x8a,0x7e,0x84,0x88,0x87,0xa8,0x04,0x76,0xda,0x01,0x5a,0x04,0xe6,0xf8,0x1a,0x99,0x27,0x01,0x3e,0x02,0x66,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x03,0xdd,0x01,0x14,0x01,0x11,0x37,0x98,0x44,0xa5,0xf3,0x89,0xc2,0xfe,0x5f,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x0e,0x05,0xd9,\r\n0x00,0x0b,0x00,0x17,0x00,0x52,0x40,0x2f,0x16,0x0d,0x10,0x95,0x40,0x13,0x14,0x0f,0x13,0x95,0x0c,0x30,0x0f,0x15,0x06,0x63,0x40,0x00,0x14,0x0f,0x09,0x62,0x03,0x0f,0x0e,0x03,0x62,0xff,0x30,0x0c,0x0e,0x0e,0x0f,0x11,0x42,0x11,0x16,0x13,0x0e,0x84,0x0f,0x18,0x19,0x0f,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x2b,\r\n0x01,0x10,0xe2,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0xd6,0x1a,0xed,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x01,0x10,0x2c,0x40,0x40,0x2c,0x2e,0x3d,0x3d,0xd0,0xb0,0xa4,0xb0,0xb0,0xa4,0xb0,\r\n0x05,0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xfc,0xd7,0xfe,0x25,0x01,0xdb,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x00,0x01,0x00,0x94,0xff,0xea,0x02,0x2f,0x04,0x00,0x00,0x0b,0x00,0x19,0x40,0x0c,0x0b,0x09,0x95,0x02,0x16,0x05,0x0f,0x0b,0x0b,0x06,0x84,0x05,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x25,0x06,0x23,\r\n0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x02,0x2f,0x39,0x5c,0xfe,0xfa,0xa4,0x90,0x3c,0x2b,0x08,0x1e,0x01,0x28,0x02,0xee,0xfd,0x2f,0xbb,0x20,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x02,0x44,0x04,0x00,0x00,0x0b,0x00,0x33,0x40,0x1b,0x0a,0x02,0x95,0x01,0x15,0x09,0x05,0x95,0x06,0x0f,0x08,0x05,0x02,0x0b,0x0b,0x0a,0x02,0x40,\r\n0x0a,0x84,0x03,0x0c,0x0d,0x03,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x1a,0x18,0xcd,0x10,0xc1,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x02,0x44,0xfe,0x08,0xaa,0xaa,0x01,0xf8,0xaa,0xaa,0x8c,0x02,0xe8,0x8c,0x8c,0xfd,0x18,0x00,0x01,0xff,0xec,\r\n0x00,0x00,0x02,0x52,0x05,0xec,0x00,0x17,0x00,0x5c,0x40,0x33,0x13,0x10,0x15,0x0e,0x07,0x04,0x09,0x15,0x95,0x02,0x0c,0x91,0x0b,0x09,0x00,0x91,0x17,0x09,0x95,0x40,0x0e,0x11,0x06,0x0e,0x95,0x08,0x30,0x06,0x15,0x11,0x00,0x00,0x00,0x01,0x0e,0x03,0x00,0x00,0x05,0x0b,0x12,0x11,0x05,0x84,0x06,0x18,0x19,0x06,0x84,0x08,0x30,0x2b,\r\n0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x10,0xc2,0x2f,0x5f,0x5e,0x5d,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0xd4,0xed,0x10,0xd6,0xed,0xd4,0xed,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x16,0x33,0x32,0x37,0x02,0x52,\r\n0x44,0x58,0x23,0x29,0xa4,0x2e,0x17,0x4d,0x48,0x46,0x55,0x1d,0x22,0xa4,0x2e,0x24,0x4e,0x48,0x02,0xd9,0x39,0x0a,0xfd,0x56,0x02,0xd9,0x0d,0x46,0x95,0x3b,0x08,0x02,0x84,0xfd,0x4c,0x0d,0x45,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x02,0xee,0x05,0xec,0x00,0x11,0x00,0x19,0x00,0x4a,0x40,0x29,0x0d,0x12,0x15,0x96,0x40,0x0b,0x12,0x80,\r\n0x12,0x04,0x01,0x95,0x40,0x10,0x0e,0x03,0x10,0x95,0x08,0x30,0x03,0x15,0x0e,0x00,0x00,0x00,0x0d,0x10,0x12,0x03,0x02,0x84,0x0f,0x03,0x01,0x03,0x03,0x1b,0x17,0x84,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0xf1,0x17,0x39,0xc2,0x2f,0x00,0x3f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x1a,0x10,0xdc,0x1a,0xed,0x12,0x39,0x31,0x30,\r\n0x01,0x21,0x11,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x21,0x21,0x26,0x26,0x23,0x22,0x15,0x14,0x33,0x02,0xee,0xff,0x00,0xa4,0x42,0x88,0x94,0x75,0x59,0x56,0x3a,0xa4,0x01,0x00,0xfe,0x5c,0x04,0x49,0x32,0x4c,0x8b,0x02,0x87,0xfd,0x79,0x02,0x87,0x74,0x67,0x55,0x78,0x3b,0x01,0xf8,0xfd,0x26,0x44,\r\n0x5c,0x4a,0x56,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x02,0x5a,0x05,0xec,0x00,0x0c,0x00,0x24,0x40,0x13,0x0c,0x0a,0x95,0x40,0x02,0x1c,0x06,0x00,0x0c,0x0c,0x08,0x84,0x05,0x0d,0x0e,0x05,0x84,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc2,0x18,0x2f,0x00,0x3f,0x3f,0x1a,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,\r\n0x33,0x32,0x37,0x02,0x5a,0x40,0x43,0x93,0x9e,0xa4,0xa0,0x3c,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x06,0x80,0xf9,0x86,0xc8,0x1a,0x00,0x01,0x00,0xa6,0xfe,0x21,0x04,0xb2,0x05,0xec,0x00,0x1c,0x00,0x57,0x40,0x30,0x0b,0x0a,0x96,0x40,0x15,0x12,0x1b,0x15,0x96,0x08,0x30,0x10,0x01,0x01,0x01,0x03,0x95,0x1b,0x1c,0x0f,0x15,0x14,0x0c,0x95,\r\n0x12,0x0f,0x10,0x00,0x15,0x0b,0x0b,0x06,0x01,0x01,0x0e,0x0f,0x0c,0x14,0x14,0x18,0x83,0x06,0x06,0x1e,0x12,0x0e,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x11,0x39,0x2f,0x33,0x00,0x3f,0x3f,0xed,0x39,0x3f,0x3f,0xfd,0xc6,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x16,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x01,0x27,0xa5,0xb1,0xae,0xdf,0xdf,0xcd,0x52,0x01,0x80,0xfd,0xbe,0xa4,0xa4,0x03,0x2d,0xfe,0x77,0xd8,0xec,0xfe,0xbc,0xf7,0xb6,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x96,0xa5,0x33,0x02,0x14,0xfc,0x8c,\r\n0x05,0xec,0xfe,0x14,0x33,0xfd,0xe1,0x1a,0xeb,0xb3,0xcc,0xfe,0xf7,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,0x06,0x54,0x04,0x00,0x00,0x1f,0x00,0x45,0x40,0x25,0x02,0x08,0x0d,0x1a,0x05,0x12,0x95,0x40,0x0a,0x10,0x00,0x1e,0x16,0x0d,0x0f,0x1f,0x84,0x01,0x1e,0x0e,0x16,0x0d,0x16,0x42,0x0e,0x84,0x0d,0x08,0x17,0x84,0x16,0x20,0x21,0x16,\r\n0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x32,0xe1,0x00,0x18,0x3f,0x33,0x33,0x2f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,\r\n0x33,0x06,0x54,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x54,0x04,0x00,0x00,0x1f,0x00,0x46,\r\n0x40,0x26,0x02,0x08,0x0d,0x1a,0x05,0x12,0x95,0x40,0x0a,0x10,0x00,0x1b,0x1e,0x16,0x0d,0x0f,0x1f,0x84,0x01,0x1e,0x0e,0x16,0x0d,0x16,0x42,0x0e,0x84,0x0d,0x08,0x17,0x84,0x16,0x20,0x21,0x16,0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0x32,0xe1,0x00,0x18,0x3f,0x33,0x33,0x3f,0x3f,0x1a,0xed,0x39,\r\n0x39,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x54,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xfe,0x29,0x02,\r\n0x79,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x06,0x54,0x04,0x18,0x00,0x28,0x00,0x50,0x40,0x2d,0x26,0x28,0x95,0x23,0x1c,0x05,0x15,0x16,0x1b,0x04,0x0d,0x95,0x40,0x1d,0x18,0x10,0x13,0x0f,0x0a,0x12,0x26,0x26,\r\n0x09,0x20,0x84,0x01,0x0e,0x0a,0x12,0x0a,0x42,0x14,0x11,0x84,0x12,0x1b,0x09,0x84,0x0a,0x29,0x2a,0x0a,0x84,0x30,0x30,0x2b,0x01,0x10,0xe1,0x39,0x18,0x2f,0xe1,0x32,0x2b,0x01,0x10,0xf2,0xe1,0x12,0x39,0x18,0x2f,0x00,0x2f,0x33,0x3f,0x3f,0x33,0x1a,0xed,0x17,0x32,0x3f,0xfd,0xc6,0x31,0x30,0x00,0x11,0x11,0x34,0x26,0x23,0x22,0x06,\r\n0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x05,0xb0,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0xbf,0xad,0x4c,0x36,0x3e,0x44,0xfe,0xaa,0x01,\r\n0x3e,0x02,0x64,0xaa,0x98,0xc0,0x86,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb5,0x91,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0xfd,0x85,0xe6,0xf8,0x1a,0x99,0x27,0x00,0x00,0x01,0xff,0x96,0xfe,0x1e,0x03,0xf8,0x04,0x18,0x00,0x1a,0x00,0x35,0x40,0x1c,0x15,0x00,0x18,0x0e,0x10,0x95,0x0b,0x1c,0x00,0x15,0x13,0x0f,0x04,0x95,\r\n0x18,0x10,0x00,0x84,0x01,0x01,0x1c,0x12,0x15,0x08,0x0e,0x08,0x84,0x12,0x2f,0xe1,0xc6,0x11,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,\r\n0x03,0xf8,0xa4,0xec,0x7b,0xa3,0xb3,0x8b,0x48,0x2e,0x36,0x36,0xa4,0xa4,0x04,0x74,0xde,0x01,0x58,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0x24,0x99,0xb5,0x13,0x93,0x1a,0xcd,0x04,0x89,0xaa,0xc2,0xfe,0x5a,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x05,0x08,0x04,0x18,0x00,0x1a,0x00,0x31,0x40,0x1a,0x1a,0x18,0x95,0x02,0x1c,0x10,0x13,0x0d,\r\n0x15,0x0e,0x0f,0x08,0x95,0x13,0x10,0x1a,0x1a,0x16,0x84,0x05,0x05,0x1c,0x10,0x0c,0x84,0x0d,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x20,0x11,0x11,0x14,0x33,\r\n0x32,0x37,0x05,0x08,0x40,0x43,0x93,0x9e,0xec,0x7b,0xa3,0xa4,0xa4,0x04,0x74,0xde,0x01,0x58,0xa0,0x3c,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x02,0xdc,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xfe,0x5a,0xfd,0x00,0xc8,0x1a,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x0a,0x04,0x00,0x00,0x13,0x00,0x26,0x40,0x14,0x01,0x04,0x0f,0x13,\r\n0x04,0x0b,0x09,0x15,0x0b,0x0f,0x01,0x13,0x84,0x12,0x12,0x15,0x0b,0x08,0x84,0x09,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x04,0x0a,0x9c,0xfe,0x06,0x24,0x0c,0x04,0x04,0x9e,0xa4,0x01,\r\n0xf2,0x20,0x10,0x04,0x06,0xa0,0x02,0xd1,0x33,0x18,0x35,0x4d,0xfd,0x66,0x04,0x00,0xfd,0x40,0x2d,0x21,0x33,0x3f,0x02,0x9c,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x33,0x40,0x1c,0x13,0x95,0x40,0x11,0x06,0x00,0x11,0x95,0x1b,0x30,0x16,0x95,0x00,0x16,0x0e,0x95,0x06,0x10,0x09,0x83,\r\n0x0c,0x12,0x12,0x19,0x11,0x13,0x83,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x20,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,\r\n0xfe,0xeb,0x69,0x1e,0xfe,0xd8,0x8d,0xb1,0x12,0x02,0x98,0xfd,0x66,0x0a,0xb4,0x94,0x01,0x34,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x68,0x01,0x3e,0xa6,0x98,0x8c,0x9e,0xb4,0x00,0x00,0x02,0x00,0x60,0xff,0xea,0x05,0x60,0x04,0x16,0x00,0x13,0x00,0x1e,0x00,0x47,0x40,0x28,0x10,0x95,0x40,0x0f,\r\n0x0b,0x00,0x0f,0x95,0x1b,0x30,0x1d,0x96,0x02,0x16,0x13,0x95,0x00,0x15,0x0c,0x95,0x0b,0x0f,0x17,0x96,0x08,0x10,0x0e,0x12,0x84,0x14,0x14,0x05,0x0c,0x10,0x00,0x00,0x20,0x1a,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xe1,0x32,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,\r\n0x30,0x21,0x21,0x07,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x21,0x11,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x05,0x60,0xfd,0xd3,0xd7,0xeb,0xfe,0xef,0x01,0x1a,0xee,0x31,0x9a,0x02,0x15,0xfe,0x76,0x01,0x6f,0xfe,0x91,0x01,0xa2,0xfd,0xbc,0x60,0x52,0x9f,0xc1,0xba,0xa2,0x46,\r\n0x16,0x01,0x21,0xeb,0xf3,0x01,0x2d,0x16,0x8c,0xfe,0xd6,0x8c,0xfe,0xce,0x02,0xed,0x19,0xe1,0xb3,0xb4,0xdc,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x64,0x04,0x18,0x00,0x11,0x00,0x22,0x00,0x43,0x40,0x25,0x01,0x03,0x12,0x12,0x1b,0x16,0x0f,0x20,0x95,0x03,0x16,0x1b,0x95,0x40,0x09,0x10,0x18,0x84,0x0c,0x0e,0x13,0x12,0x06,0x42,\r\n0x00,0x13,0x84,0x12,0x23,0x24,0x12,0x84,0x08,0x30,0x1e,0x84,0x06,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x39,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x39,0x39,0x11,0x39,0x2f,0x12,0x39,0x31,0x30,0x25,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x06,0x23,0x22,0x26,0x03,0x33,0x15,0x10,0x33,\r\n0x32,0x11,0x34,0x26,0x23,0x22,0x00,0x15,0x10,0x33,0x32,0x11,0x02,0xdf,0x06,0x57,0xcc,0x9e,0xb8,0x01,0x65,0x01,0x2d,0x01,0x1c,0x01,0x56,0xc8,0xb0,0x6a,0x7b,0x75,0x9f,0xb9,0xd6,0xfa,0xe0,0xde,0xfe,0xfc,0xcf,0xbf,0xb2,0xca,0xeb,0xd5,0x01,0x17,0x01,0x59,0xfe,0xb6,0xfe,0xf0,0xe1,0xf5,0x5c,0x01,0xc2,0x5a,0xfe,0xc6,0x01,0x44,\r\n0xdf,0xf9,0xfe,0xfe,0xd8,0xfe,0xbe,0x01,0x3a,0x00,0x00,0x03,0x00,0x60,0xfe,0x29,0x04,0xba,0x05,0xec,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x48,0x40,0x2a,0x02,0x1b,0x13,0x00,0x19,0x95,0x03,0x16,0x12,0x0c,0x1a,0x95,0x40,0x09,0x10,0x0a,0x00,0x16,0x83,0x0f,0x0e,0x00,0x06,0x03,0x42,0x09,0x0c,0x13,0x19,0x04,0x00,0x84,0x03,0x20,\r\n0x21,0x03,0x84,0x08,0x30,0x1d,0x83,0x06,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x17,0x39,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x3f,0xed,0x39,0x39,0x3f,0x31,0x30,0x05,0x11,0x23,0x11,0x26,0x02,0x35,0x34,0x00,0x37,0x11,0x33,0x11,0x16,0x12,0x15,0x14,0x00,0x03,0x11,0x36,0x36,0x35,0x34,0x26,0x01,0x11,0x06,\r\n0x06,0x15,0x14,0x16,0x02,0xdf,0xa3,0xdd,0xff,0x01,0x04,0xd8,0xa3,0xdf,0xfc,0xfe,0xfe,0xd9,0x93,0xa0,0xa0,0xfe,0xca,0x91,0xa3,0xa3,0x18,0xfe,0x41,0x01,0xbf,0x11,0x01,0x22,0xdf,0xe7,0x01,0x20,0x17,0x01,0xd4,0xfe,0x2c,0x10,0xfe,0xe1,0xe5,0xe3,0xfe,0xdc,0x03,0x91,0xfc,0xe4,0x12,0xd0,0xac,0xab,0xd1,0xfc,0xf6,0x03,0x1c,0x12,\r\n0xd2,0xac,0xa6,0xd3,0x00,0x01,0x00,0x0c,0xff,0xee,0x02,0x23,0x04,0x00,0x00,0x0f,0x00,0x20,0x40,0x10,0x08,0x0a,0x95,0x05,0x16,0x00,0x15,0x0e,0x0f,0x02,0x0f,0x84,0x0e,0x0e,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,\r\n0x11,0x33,0x02,0x23,0xa4,0x04,0x53,0xba,0x40,0x22,0x2c,0x51,0x69,0x8d,0xa4,0xc8,0xda,0x0e,0xaa,0x21,0xc8,0xa9,0x02,0x0a,0x00,0x01,0x00,0x0c,0xff,0xee,0x02,0x23,0x05,0xec,0x00,0x0f,0x00,0x20,0x40,0x10,0x08,0x0a,0x95,0x05,0x16,0x00,0x15,0x0e,0x00,0x02,0x0f,0x84,0x0e,0x0e,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,\r\n0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x23,0xa4,0x04,0x53,0xba,0x40,0x22,0x2c,0x51,0x69,0x8d,0xa4,0xc8,0xda,0x0e,0xaa,0x21,0xc8,0xa9,0x03,0xf6,0x00,0x01,0x00,0x0c,0xfe,0x1e,0x03,0x33,0x04,0x00,0x00,0x18,0x00,0x2f,0x40,0x18,0x18,0x16,0x95,0x02,\r\n0x1c,0x07,0x09,0x12,0x0c,0x0e,0x95,0x09,0x16,0x12,0x0f,0x18,0x18,0x06,0x13,0x84,0x12,0x12,0x1a,0x0c,0x2f,0x12,0x39,0x2f,0xf1,0x33,0xc2,0x2f,0x00,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,\r\n0x32,0x37,0x03,0x33,0x40,0x43,0x92,0x9f,0x04,0x52,0xbb,0x40,0x22,0x2c,0x51,0x68,0x8e,0xa4,0x9f,0x3d,0x34,0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x58,0xd6,0x0e,0xaa,0x21,0xc7,0xaa,0x02,0x0a,0xfb,0x72,0xc8,0x1a,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x0f,0x00,0x23,0x40,0x11,0x07,0x1b,0x08,0x0f,0x00,0x00,0x0a,0x02,\r\n0x0d,0x10,0x00,0x00,0x11,0x0a,0x06,0x84,0x07,0x2f,0xe9,0x32,0x11,0x39,0x2f,0x00,0x3f,0xcd,0x32,0x32,0x2f,0x3f,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0xa4,0xa4,0x04,0x4a,0xc2,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfc,0x1f,0x05,0xd7,0xd3,\r\n0xe5,0x0e,0x00,0x01,0x00,0xa6,0xfe,0x1e,0x02,0xbc,0x04,0x12,0x00,0x19,0x00,0x2c,0x40,0x16,0x14,0x1a,0x17,0x0a,0x08,0x95,0x0d,0x1c,0x11,0x0f,0x00,0x02,0x17,0x10,0x0a,0x00,0x00,0x1b,0x13,0x06,0x84,0x10,0x2f,0xe1,0x32,0x11,0x39,0x2f,0xc6,0x00,0x3f,0xdd,0xc6,0x3f,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x31,0x30,0x01,0x26,0x23,0x22,\r\n0x06,0x15,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0xa0,0x3c,0x34,0x40,0x43,0x93,0x9e,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0xfd,0x68,0xc8,0x1a,0x8a,0x1c,0xaf,0x9f,0x04,0x94,0xd3,0x6c,0x79,0x0e,0x00,0x00,0x01,\r\n0x00,0x90,0x00,0x00,0x02,0xa2,0x04,0x18,0x00,0x0c,0x00,0x1b,0x40,0x0d,0x06,0x15,0x00,0x02,0x95,0x0a,0x10,0x00,0x00,0x0e,0x05,0x84,0x06,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x11,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0xa2,0x46,0x54,0xd7,0xa1,0xce,0xaa,0x56,0x44,0x03,0x68,\r\n0x26,0xfe,0xed,0xfd,0x85,0x02,0x7b,0xbd,0xe0,0x1e,0x00,0x01,0x00,0x0c,0xfe,0x29,0x02,0x1e,0x04,0x18,0x00,0x0c,0x00,0x1b,0x40,0x0d,0x00,0x1b,0x06,0x04,0x95,0x09,0x10,0x00,0x84,0x01,0x01,0x0e,0x06,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x23,0x11,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,\r\n0x02,0x1e,0xa1,0xd7,0x4c,0x4e,0x50,0x54,0xb0,0xbe,0xfe,0x29,0x04,0x4e,0x01,0x17,0x28,0x92,0x20,0xd2,0xc5,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x83,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x3e,0x40,0x20,0x0f,0x05,0x95,0x13,0x13,0x07,0x08,0x01,0x15,0x07,0x15,0x12,0x95,0x08,0x0f,0x03,0x10,0x10,0x0f,0x06,0x01,0x00,0x00,0x0c,\r\n0x84,0x16,0x16,0x1a,0x13,0x06,0x84,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x83,0xb8,\r\n0x75,0x3e,0x78,0x56,0xa4,0x01,0x52,0xa5,0xb7,0xea,0x53,0x39,0xfe,0x54,0x9a,0xcc,0xc4,0x01,0x14,0x92,0xfe,0x5a,0x04,0x00,0x98,0x84,0xda,0x31,0x04,0x21,0x7c,0x02,0x3c,0xfe,0xbd,0xa8,0x9b,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x83,0x04,0x00,0x00,0x12,0x00,0x1a,0x00,0x43,0x40,0x24,0x04,0x13,0x95,0x40,0x0d,0x0b,0x0a,0x0d,\r\n0x95,0x08,0x30,0x14,0x95,0x0a,0x15,0x00,0x0f,0x0b,0x0f,0x10,0x02,0x03,0x02,0x0d,0x12,0x00,0x00,0x06,0x84,0x17,0x17,0x1c,0x0d,0x14,0x84,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x03,0x06,0x07,0x15,0x16,0x15,\r\n0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x33,0x32,0x36,0x37,0x13,0x01,0x11,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x83,0x8d,0x33,0x55,0xe6,0xc7,0xae,0xfe,0xc7,0xa4,0x56,0x41,0x53,0x22,0x79,0xfe,0x7b,0x95,0xd1,0x6e,0x5e,0x04,0x00,0xfe,0xcb,0x71,0x29,0x04,0x2b,0xd7,0x88,0xa3,0x04,0x00,0xfe,0x5a,0x41,0x51,0x01,0x14,0xfd,0xcf,0xfe,\r\n0xbd,0x9d,0x4f,0x57,0x00,0x01,0x00,0x68,0xfe,0xb6,0x02,0xdb,0x04,0x18,0x00,0x2b,0x00,0x5d,0x40,0x0e,0x05,0x03,0x00,0x08,0x01,0x08,0x10,0x16,0x21,0x27,0x04,0x2a,0x19,0x0c,0xb8,0xff,0xc0,0x40,0x13,0x0b,0x0e,0x48,0x0c,0x0c,0x0e,0x95,0x2a,0x16,0x1c,0x1c,0x1e,0x95,0x19,0x10,0x05,0x05,0x27,0x00,0xb8,0x01,0x03,0x40,0x0d,0x0c,\r\n0x1c,0x1c,0x27,0x83,0x10,0x10,0x2d,0x0c,0x21,0x83,0x16,0x0c,0x2f,0xd6,0xe1,0x11,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x10,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x2f,0x2b,0x11,0x12,0x17,0x39,0x2f,0x5d,0xdd,0xc6,0x31,0x30,0x17,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x16,0x33,0x32,0x35,\r\n0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0xee,0x95,0x3b,0x3c,0x41,0x49,0x7b,0x8d,0x82,0x88,0xc3,0x56,0x7d,0x93,0x65,0xca,0x9f,0x7a,0x61,0x66,0x82,0x52,0x62,0x45,0x7e,0x94,0x72,0xc2,0xa9,0x41,0x02,0x27,0xaa,0x23,0x7b,0x1f,0x8f,\r\n0x83,0x01,0x0d,0x63,0x90,0x3c,0x4e,0x36,0x41,0x89,0x64,0x80,0xa8,0x2e,0xa6,0x4a,0x50,0x40,0x3e,0x4b,0x35,0x40,0x8c,0x62,0x82,0xa8,0x00,0x01,0xff,0x92,0xfe,0x1e,0x02,0x68,0x06,0x02,0x00,0x15,0x00,0x2d,0x40,0x18,0x0b,0x0d,0x95,0x08,0x1c,0x00,0x02,0x95,0x40,0x13,0x01,0x00,0x00,0x05,0x0a,0x05,0x84,0x0f,0x16,0x17,0x0f,0x84,\r\n0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xc4,0x10,0xc2,0x2f,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x68,0x32,0x3c,0xaa,0xb9,0x8f,0x4c,0x2a,0x32,0x3c,0xac,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfa,\r\n0xe7,0xa2,0xbf,0x13,0x93,0x1a,0xdf,0x05,0x17,0xa4,0xbe,0x12,0x00,0x01,0xff,0x9e,0xfe,0x1e,0x02,0x72,0x06,0x02,0x00,0x1d,0x00,0x53,0x40,0x2d,0x08,0x05,0x14,0x95,0x40,0x17,0x1b,0x0c,0x17,0x95,0x08,0x30,0x0f,0x11,0x95,0x0c,0x1c,0x00,0x02,0x95,0x40,0x1b,0x01,0x15,0x15,0x13,0x0f,0x06,0x06,0x09,0x00,0x00,0x09,0x0f,0x17,0x05,\r\n0x09,0x84,0x13,0x1e,0x1f,0x13,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0xc6,0x10,0xc0,0x2f,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x33,0x15,0x23,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,\r\n0x35,0x11,0x23,0x35,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x72,0x32,0x3a,0xac,0xb0,0xb0,0xb7,0x8f,0x4b,0x2b,0x32,0x3a,0xac,0xb0,0xb0,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfd,0xce,0x8b,0xfd,0xa4,0xa4,0xbd,0x13,0x93,0x1a,0xdf,0x02,0x52,0x8b,0x02,0x3a,0xa2,0xc0,0x12,0x00,0x01,0xff,0xa6,0xfe,0x1e,0x02,0x48,0x04,0x18,\r\n0x00,0x14,0x00,0x22,0x40,0x11,0x14,0x12,0x95,0x02,0x1c,0x09,0x07,0x95,0x0c,0x10,0x14,0x14,0x10,0x09,0x10,0x84,0x04,0x2f,0xe1,0xc6,0x10,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x37,0x02,0x48,0x3a,0x5c,0xfe,\r\n0xfa,0x9a,0x3a,0x32,0x40,0x3d,0x90,0x9d,0x92,0x38,0x2e,0xfe,0x3c,0x1e,0x01,0x28,0x03,0x82,0xc5,0x19,0x8c,0x18,0xae,0x9c,0xfc,0x95,0xbb,0x22,0x00,0x02,0xff,0x44,0xfe,0x1e,0x02,0x8e,0x06,0x02,0x00,0x1b,0x00,0x23,0x00,0x68,0xb7,0x15,0x05,0x07,0x13,0x1c,0x0a,0x1e,0x07,0xb8,0xff,0xc0,0x40,0x30,0x13,0x16,0x48,0x07,0x08,0x08,\r\n0x22,0x1e,0x96,0x0f,0x13,0x1f,0x13,0x02,0x09,0x03,0x13,0x22,0x96,0x0d,0x1c,0x00,0x02,0x95,0x40,0x19,0x01,0x1c,0x15,0x0a,0x05,0x10,0x07,0x00,0x00,0x05,0x20,0x84,0x10,0x05,0x84,0x15,0x24,0x25,0x15,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0xd4,0xe1,0x10,0xc2,0x2f,0xc6,0x11,0x12,0x39,0x11,0x33,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,\r\n0xed,0x2f,0x5f,0x5e,0x5d,0xed,0x11,0x39,0x2f,0xcd,0x2b,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x16,0x17,0x15,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x02,0x8e,0x32,0x3e,0xaa,0x7a,0x74,0x7a,\r\n0x80,0x10,0xa3,0x82,0x69,0x86,0xb4,0x91,0x27,0x21,0xb8,0x8d,0x4c,0x2c,0xfe,0x43,0x23,0x25,0xae,0x63,0x8e,0x05,0x5c,0x1b,0xdf,0xfb,0x2a,0x2c,0x54,0xa6,0x68,0x34,0x81,0x99,0x79,0x5d,0x6d,0x91,0x04,0x04,0xb2,0xa2,0xc0,0x12,0xf9,0x78,0x06,0x70,0x5a,0x00,0x00,0x01,0x00,0x38,0xfe,0xd1,0x02,0x8e,0x04,0x16,0x00,0x14,0x00,0x30,\r\n0x40,0x18,0x03,0x04,0x07,0x04,0x13,0x95,0x01,0x15,0x0d,0x0b,0x95,0x10,0x10,0x14,0x14,0x04,0x01,0x13,0x84,0x07,0x07,0x16,0x06,0x0d,0x2f,0x33,0x12,0x39,0x2f,0xf1,0x39,0x39,0xc1,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x31,0x30,0x21,0x23,0x15,0x07,0x11,0x21,0x35,0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,\r\n0x33,0x20,0x11,0x11,0x33,0x02,0x8e,0xb1,0xa1,0xfe,0xfc,0x01,0x04,0x48,0x52,0x3e,0x2c,0x39,0x60,0x01,0x0c,0xb1,0xfa,0x35,0x01,0x2f,0x8c,0x02,0x41,0x67,0x58,0x22,0x8c,0x20,0xfe,0xd4,0xfd,0xa2,0x00,0x01,0x00,0x2b,0xfe,0x1e,0x02,0x81,0x05,0x2f,0x00,0x14,0x00,0x2e,0x40,0x17,0x14,0x12,0x95,0x02,0x1c,0x0a,0x0e,0x0b,0x06,0x95,\r\n0x07,0x0f,0x00,0x00,0x0d,0x06,0x0d,0x06,0x0b,0x08,0x0f,0x84,0x04,0x2f,0xe9,0x33,0x32,0x33,0x32,0x2f,0x2f,0x33,0x2f,0x00,0x3f,0xed,0x33,0x32,0xc4,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x02,0x81,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,\r\n0x01,0x02,0xfe,0xfe,0x46,0x51,0x3b,0x30,0xfe,0x40,0x22,0x01,0x2e,0x04,0x28,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfb,0xf4,0x67,0x57,0x23,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0xa4,0x04,0x00,0x00,0x15,0x00,0x1d,0x00,0x4c,0x40,0x2b,0x01,0x10,0x14,0x18,0x04,0x0a,0x95,0x40,0x0d,0x0e,0x07,0x0d,0x95,0x08,0x30,0x13,0x04,0x0e,0x1b,0x95,\r\n0x07,0x16,0x02,0x15,0x0e,0x0f,0x00,0x01,0x01,0x04,0x17,0x03,0x13,0x84,0x12,0x12,0x1f,0x0c,0x18,0x0a,0x0f,0x84,0x0e,0x2f,0xe1,0x39,0x39,0xc6,0x12,0x39,0x2f,0xe1,0x17,0x39,0x10,0xcd,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x17,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,\r\n0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0x35,0x21,0x15,0x10,0x33,0x32,0x36,0x04,0xa4,0x98,0xa4,0x04,0x66,0xd5,0xfe,0x8f,0x97,0x97,0xa4,0x02,0x0c,0xa4,0x98,0xfe,0xc4,0xfd,0xf4,0xfa,0x78,0x9a,0x01,0xdb,0xfe,0x25,0xa2,0xba,0x01,0xb4,0x3f,0x8b,0x01,0x9a,0xfe,0x66,0x01,0x9a,0xfe,0x66,0xb4,0x29,0x25,\r\n0xfe,0xbc,0xb0,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x62,0x04,0x00,0x00,0x1b,0x00,0x38,0x40,0x1e,0x09,0x95,0x17,0x16,0x04,0x0e,0x11,0x03,0x10,0x0f,0x01,0x95,0x02,0x0f,0x12,0x0e,0x11,0x14,0x84,0x0c,0x0c,0x1d,0x1a,0x00,0x04,0x04,0x01,0x06,0x84,0x1a,0x2f,0xf1,0x33,0xc2,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x32,0xc6,0x32,\r\n0x00,0x3f,0xed,0x3f,0x17,0x32,0x3f,0xed,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x06,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x27,0x35,0x21,0x15,0x23,0x16,0x11,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x01,0x1c,0xbc,0x01,0x7f,0xdb,0xbd,0xa1,0xa6,0xb6,0xda,0x01,0x7e,0xb8,0xb8,0xfe,0xec,0xf2,0xed,0xfe,0xf1,0x03,0x74,0x8c,0x8e,0x64,\r\n0xfe,0xe6,0xaf,0xd3,0xcc,0xb6,0x01,0x1a,0x64,0x8e,0x8c,0x89,0xfe,0xfb,0xe3,0xfe,0xe5,0x01,0x16,0xe1,0x01,0x07,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0x16,0x04,0x18,0x00,0x17,0x00,0x2a,0x40,0x16,0x04,0x95,0x15,0x16,0x00,0x0f,0x0c,0x0a,0x95,0x0f,0x10,0x0c,0x0c,0x01,0x12,0x83,0x07,0x07,0x19,0x01,0x84,0x00,0x2f,0xe1,0x12,0x39,\r\n0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x3f,0xed,0x31,0x30,0x13,0x33,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x20,0x11,0x90,0xa3,0x01,0x0b,0x93,0x9f,0x60,0x56,0x3b,0x35,0x3e,0x4f,0x96,0xa9,0xff,0x00,0xe3,0xfe,0x5d,0x04,0x00,0xfd,0xb4,0xfe,0xbe,0xdb,\r\n0xc1,0xba,0xc8,0x1c,0x8a,0x1a,0xfe,0xe7,0xeb,0xfd,0xfe,0xd1,0x01,0xbe,0x00,0x01,0x00,0x0c,0x00,0x00,0x03,0xc8,0x04,0x00,0x00,0x0b,0x00,0x1d,0x40,0x0d,0x00,0x05,0x0a,0x09,0x15,0x0a,0x0f,0x01,0x00,0x00,0x0d,0x08,0x09,0x2f,0x33,0x11,0x33,0x2f,0x32,0x00,0x3f,0x3f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,\r\n0x07,0x01,0x23,0x01,0x33,0x03,0xc8,0xb4,0xfe,0xfc,0x1c,0x06,0x04,0x09,0x1b,0xfe,0xf2,0xac,0x01,0x96,0xa4,0x02,0xe8,0x51,0x3e,0x43,0x48,0xfd,0x14,0x04,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x00,0x1b,0x00,0x3c,0x40,0x20,0x00,0x04,0x09,0x0c,0x16,0x1a,0x06,0x12,0x11,0x15,0x12,0x0f,0x1b,0x1a,0x04,0x09,\r\n0x08,0x16,0x13,0x12,0x0c,0x16,0x04,0x0c,0x03,0x11,0x01,0x00,0x00,0x1d,0x10,0x11,0x2f,0x33,0x11,0x33,0x2f,0x32,0x12,0x17,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,\r\n0x17,0x33,0x36,0x37,0x13,0x33,0x05,0xb0,0xac,0xd3,0x0b,0x03,0x09,0x02,0x10,0xec,0x95,0xd5,0x0a,0x04,0x08,0x02,0x0e,0xd2,0xa2,0x01,0x36,0xa8,0xd2,0x0c,0x05,0x04,0x03,0x12,0xe5,0xa4,0x03,0x02,0x28,0x34,0x2c,0x32,0xfd,0x00,0x03,0x04,0x24,0x38,0x27,0x35,0xfc,0xfc,0x04,0x00,0xfd,0x23,0x2b,0x34,0x24,0x39,0x02,0xdf,0x00,0x01,\r\n0x00,0x0c,0x00,0x00,0x03,0xd1,0x05,0xec,0x00,0x14,0x00,0x2c,0x40,0x17,0x00,0x15,0x09,0x15,0x04,0x0a,0x14,0x0f,0x0f,0x0f,0x11,0x95,0x0c,0x00,0x0f,0x0a,0x0f,0x14,0x03,0x09,0x00,0x16,0x09,0x2f,0x10,0xc6,0x11,0x17,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x33,0x33,0x3f,0x3f,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,\r\n0x01,0x23,0x01,0x12,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x03,0xd1,0xb5,0xfe,0xea,0x02,0x10,0x06,0x06,0x11,0xfe,0xdf,0xaa,0x01,0xdc,0x7e,0xe4,0x3d,0x2b,0x34,0x2a,0x7f,0x3f,0x54,0x03,0x14,0x07,0x47,0x18,0x34,0xfc,0xea,0x04,0xae,0x01,0x3e,0x0d,0x93,0x12,0x98,0xc8,0x00,0x01,0x00,0x0a,0x00,0x00,0x03,0x4c,0x04,0x00,\r\n0x00,0x0d,0x00,0x30,0x40,0x1a,0x00,0x01,0x04,0x09,0x04,0x05,0x03,0x15,0x05,0x0f,0x09,0x01,0x00,0x04,0x40,0x05,0x05,0x01,0x84,0x04,0x0e,0x0f,0x04,0x84,0x08,0x30,0x2b,0x01,0x10,0xf1,0xc1,0x18,0x2f,0x1a,0x10,0xcd,0x12,0x39,0x00,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x13,0x16,0x17,0x33,0x36,\r\n0x37,0x13,0x03,0x4c,0xfe,0xb0,0xa4,0xfe,0xb2,0xb0,0xb8,0x29,0x11,0x04,0x18,0x20,0xbc,0x04,0x00,0xfd,0x77,0xfe,0x89,0x01,0x77,0x02,0x89,0xfe,0x7f,0x57,0x2e,0x46,0x3f,0x01,0x81,0x00,0x00,0x01,0x00,0x21,0xfe,0xfa,0x03,0xfe,0x04,0x00,0x00,0x16,0x00,0x36,0x40,0x0f,0x16,0x14,0x02,0x09,0x0f,0x95,0x08,0x15,0x0e,0x0a,0x95,0x0c,\r\n0x0f,0x16,0x05,0xb8,0x01,0x03,0x40,0x09,0x12,0x0a,0x0e,0x10,0x10,0x18,0x0b,0x0f,0x09,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xc6,0x32,0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x2f,0xdd,0xc6,0x31,0x30,0x05,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x06,0x15,0x14,0x33,0x32,0x37,0x03,\r\n0xfe,0x34,0x41,0x58,0x6b,0x09,0xfd,0x52,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x02,0x58,0x22,0x5a,0x2c,0x30,0xee,0x18,0x6f,0x51,0x22,0x24,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0x78,0x3d,0x69,0x1b,0x00,0x00,0x02,0x00,0x21,0xff,0x81,0x04,0x25,0x04,0x00,0x00,0x17,0x00,0x1e,0x00,0x7d,0x40,0x32,0x07,0x28,0x09,0x0d,0x48,0x04,\r\n0x1e,0x14,0x1e,0x02,0x34,0x0d,0x44,0x0d,0x02,0x06,0x0d,0x16,0x0d,0x26,0x0d,0x03,0x1d,0x96,0x40,0x11,0x0d,0x80,0x02,0x00,0x18,0x00,0x07,0x0d,0x95,0x06,0x15,0x0c,0x08,0x95,0x0a,0x0f,0x18,0x00,0x1b,0x02,0x0e,0x05,0x14,0x02,0xb8,0x01,0x03,0x40,0x0b,0x0f,0x03,0x01,0x03,0x03,0x14,0x0d,0x08,0x0c,0x0c,0x14,0xb8,0x01,0x03,0xb5,\r\n0x1b,0x1b,0x20,0x09,0x0d,0x07,0x2f,0x33,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x39,0x39,0x10,0xce,0x1a,0x10,0xdc,0x1a,0xed,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x00,0x2b,0x21,0x06,0x07,0x23,0x36,0x37,0x21,0x35,0x01,0x21,0x35,\r\n0x21,0x15,0x01,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x35,0x34,0x23,0x22,0x02,0x06,0x0f,0x03,0x8e,0x04,0x0d,0xfe,0xaa,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x90,0x3d,0xca,0x78,0x76,0x8e,0xac,0x9c,0xaa,0xac,0xb7,0x78,0x9a,0x46,0x39,0x48,0x37,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0x8f,0x9f,0x78,\r\n0x5c,0x6a,0x7c,0x8c,0x5a,0x54,0x00,0x01,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x00,0x18,0x00,0x44,0x40,0x24,0x0b,0x0a,0x96,0x40,0x11,0x0e,0x17,0x11,0x91,0x09,0x30,0x01,0x03,0x95,0x17,0x1c,0x10,0x0c,0x95,0x0e,0x0f,0x11,0x0b,0x0b,0x06,0x00,0x0c,0x10,0x10,0x14,0x83,0x06,0x06,0x1a,0x0d,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,\r\n0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x23,0xa5,0xb1,0xae,0xdf,0xde,0xce,0x52,0x01,0x80,0xfd,0xbe,0x03,0x2d,0xfe,\r\n0x77,0xda,0xea,0xfe,0xbc,0xf7,0xb6,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x95,0xa6,0x33,0x02,0x14,0x8c,0x33,0xfd,0xe1,0x1a,0xea,0xb4,0xcc,0xfe,0xf7,0x00,0x02,0xff,0xea,0xfe,0x21,0x03,0x8c,0x04,0x00,0x00,0x20,0x00,0x29,0x00,0xa0,0xb5,0x19,0x20,0x0b,0x01,0x4d,0x14,0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x01,0x4d,0x02,0x00,0x23,0x1e,0x0c,\r\n0x0a,0x20,0xb8,0xff,0xc0,0x40,0x47,0x12,0x16,0x48,0x20,0x00,0x04,0x23,0x95,0x0f,0x0a,0x1f,0x0a,0x02,0x09,0x03,0x0a,0x0a,0x04,0x13,0x12,0x96,0x40,0x19,0x40,0x09,0x0c,0x48,0x19,0x16,0x04,0x19,0x96,0x09,0x30,0x28,0x95,0x04,0x1c,0x18,0x14,0x95,0x16,0x0f,0x19,0x13,0x13,0x0e,0x07,0x14,0x18,0x18,0x1c,0x21,0x0c,0x0e,0x26,0x1e,\r\n0x02,0x1c,0x07,0x20,0x20,0x1c,0x83,0x0e,0x0e,0x2b,0x15,0x26,0x84,0x07,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x2b,0x1a,0xed,0x39,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0xed,0x10,0xd4,0xcd,\r\n0x2b,0x11,0x39,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x2b,0x2b,0x01,0x26,0x27,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x07,0x16,0x17,0x25,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x03,0x8c,0x55,0x64,0xa6,0xfe,0xfe,0x94,0xad,0xb0,\r\n0x8b,0xb3,0xc8,0x20,0xe1,0xcb,0x52,0x01,0x80,0xfd,0xbe,0x03,0x2d,0xfe,0x77,0xd6,0xee,0x43,0x3e,0x29,0xfe,0xc2,0xa8,0x81,0x4d,0x59,0xb4,0xab,0xfe,0x21,0x4f,0x46,0x95,0x7c,0x67,0x64,0x82,0x76,0x3e,0x46,0x92,0xa3,0x33,0x02,0x14,0x8c,0x33,0xfd,0xe1,0x1a,0xe7,0xb1,0x75,0x6b,0x2e,0x21,0x39,0x5c,0x32,0x28,0x5e,0x00,0x00,0x01,\r\n0x00,0x1c,0x00,0x00,0x02,0xe8,0x06,0x02,0x00,0x19,0x00,0x2a,0x40,0x15,0x13,0x08,0x10,0x01,0x15,0x0d,0x0b,0x95,0x10,0x01,0x00,0x84,0x01,0x01,0x0d,0x13,0x83,0x08,0x08,0x1b,0x0d,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x36,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x01,0x89,0xa3,0x4c,0x6e,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x50,0x3f,0x01,0xee,0x87,0xa2,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x83,0x6f,0x00,0x01,0x00,0x04,0x00,0x00,0x02,0xcf,\r\n0x06,0x02,0x00,0x19,0x00,0x2e,0x40,0x18,0x14,0x05,0x17,0x0d,0x15,0x4f,0x00,0x01,0x00,0x02,0x95,0x17,0x01,0x0c,0x84,0x0d,0x0d,0x14,0x00,0x00,0x1b,0x05,0x83,0x14,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0x12,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,\r\n0x11,0x23,0x11,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x02,0xcf,0x87,0x94,0x7a,0x90,0x32,0x72,0x70,0x48,0xa4,0x39,0x5c,0x7a,0x4f,0xf0,0xc0,0x94,0x87,0x05,0x29,0x4e,0x78,0x59,0x38,0x72,0x75,0x73,0xa2,0x84,0xfe,0x12,0x01,0xee,0x5f,0x82,0x5c,0x79,0x9f,0x5f,0x95,0xcb,0x3e,0x00,0x00,0x01,0x00,0x00,0xff,0xea,\r\n0x02,0xcb,0x05,0xec,0x00,0x19,0x00,0x30,0x40,0x19,0x15,0x06,0x18,0x0d,0x40,0x01,0x01,0x01,0x03,0x95,0x18,0x16,0x0d,0x00,0x0e,0x84,0x0d,0x0d,0x01,0x15,0x83,0x06,0x06,0x1b,0x01,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x5d,0x11,0x12,0x39,0x39,0x31,0x30,0x35,0x35,0x16,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x27,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x86,0x94,0x7a,0x91,0x3c,0x68,0x6f,0x4a,0xa4,0x3e,0x58,0x7a,0x4f,0xef,0xc2,0x93,0x27,0x9b,0x4e,0x76,0x5c,0x45,0x6e,0x6b,0x73,0xa0,0x87,0x01,0xee,0xfe,0x12,0x5e,0x88,0x58,0x77,0xa0,0x5f,0x97,0xc9,0x00,0x00,0x01,0x00,0x60,0xfe,0x21,\r\n0x03,0x60,0x04,0x18,0x00,0x13,0x00,0x2e,0x40,0x1b,0x10,0x13,0x20,0x13,0x30,0x13,0x03,0x13,0x11,0x95,0x02,0x1c,0x3f,0x0b,0x01,0x0b,0x0d,0x95,0x08,0x10,0x0b,0x13,0x13,0x15,0x0f,0x83,0x05,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x5d,0x31,0x30,0x01,0x06,0x23,0x22,0x02,0x11,0x10,0x00,0x33,0x32,\r\n0x17,0x15,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x03,0x60,0x84,0x9c,0xe8,0xf8,0x01,0x07,0xf7,0x87,0x7b,0x7e,0x84,0xfe,0xac,0x01,0x4a,0x8c,0x80,0xfe,0x77,0x56,0x01,0x7b,0x01,0x6c,0x01,0x7f,0x01,0x91,0x41,0xa4,0x5b,0xfd,0x86,0xfd,0x96,0x66,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x92,0x06,0x02,0x00,0x0b,0x00,0x15,0x00,0x21,\r\n0x00,0x3f,0x40,0x24,0x16,0x63,0x40,0x1c,0x06,0x00,0x1c,0x63,0x14,0x30,0x11,0x95,0x00,0x16,0x0c,0x95,0x40,0x06,0x01,0x1f,0x62,0x19,0x0f,0x14,0x19,0x62,0x08,0x30,0x09,0x83,0x14,0x14,0x23,0x0f,0x83,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,\r\n0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x03,0x22,0x02,0x11,0x10,0x21,0x32,0x12,0x11,0x10,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x74,0xfe,0xfe,0xfe,0xee,0x01,0x1b,0x01,0x04,0x01,0x02,0x01,0x11,0xfe,0xe6,0xff,0xb4,0xbd,0x01,0x71,0xb4,0xbd,0xfe,0x8f,0x2f,0x40,0x40,0x2f,\r\n0x2e,0x43,0x43,0x18,0x01,0x8c,0x01,0x76,0x01,0x7c,0x01,0x9c,0xfe,0x76,0xfe,0x86,0xfe,0x83,0xfe,0x67,0x05,0x8f,0xfe,0xb3,0xfe,0xc8,0xfd,0x80,0x01,0x4c,0x01,0x38,0x02,0x81,0xfd,0x0e,0x42,0x2f,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x00,0x03,0x00,0xa6,0x00,0x00,0x03,0x7f,0x04,0x00,0x00,0x0d,0x00,0x14,0x00,0x1b,0x00,0x40,0x40,0x23,\r\n0x08,0x15,0x95,0x40,0x0f,0x01,0x00,0x0f,0x95,0x09,0x30,0x16,0x95,0x00,0x15,0x0e,0x95,0x01,0x0f,0x08,0x0a,0x0f,0x12,0x83,0x05,0x05,0x0a,0x83,0x19,0x19,0x1d,0x0f,0x16,0x84,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x33,0x11,\r\n0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0x01,0x56,0xa4,0xb0,0xac,0xdb,0xca,0xaf,0xbc,0xa2,0xbe,0xb8,0xa8,0xba,0xd3,0xe3,0x04,0x00,0x85,0x79,0xac,0x35,0x05,0x27,0xca,0x89,0xa2,0x03,0x74,0xfe,0xe2,0x94,0x8a,0xfe,0x57,0xfe,0xc1,\r\n0x9d,0xa2,0x00,0x02,0x00,0x5c,0xff,0xe8,0x04,0x02,0x04,0x18,0x00,0x10,0x00,0x24,0x00,0x42,0x40,0x24,0x00,0x12,0x95,0x40,0x11,0x06,0x0c,0x11,0x95,0x0c,0x30,0x18,0x95,0x0c,0x16,0x1e,0x95,0x06,0x10,0x00,0x0f,0x12,0x12,0x15,0x09,0x83,0x1b,0x1b,0x26,0x0f,0x21,0x83,0x03,0x15,0x83,0x0f,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,\r\n0xe1,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x26,0x35,0x34,0x25,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x01,0x2f,0xbd,0xd9,0xb5,0xee,0x01,\r\n0x14,0xfe,0xe1,0xf3,0xc0,0xd4,0x02,0x10,0x56,0xfe,0xee,0x81,0x71,0xa6,0xbe,0xbf,0xa3,0x68,0x78,0x88,0x78,0x02,0x14,0x04,0x3d,0xa9,0x7e,0x9c,0xfe,0xe6,0xf4,0xf5,0xfe,0xd3,0x9e,0x8a,0xce,0x78,0x8e,0xaa,0x4f,0x5d,0xd2,0xc0,0xb9,0xd1,0x54,0x44,0x48,0x58,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x54,0x04,0xe2,0x00,0x27,0x00,0x57,\r\n0x40,0x1c,0x12,0x95,0x40,0x15,0x1e,0x18,0x15,0x95,0x08,0x30,0x16,0x11,0x0f,0x95,0x18,0x16,0x07,0x09,0x00,0x02,0x96,0x25,0x09,0x95,0x1e,0x10,0x00,0x22,0xb8,0x01,0x03,0x40,0x10,0x04,0x06,0x13,0x13,0x11,0x0c,0x06,0x06,0x16,0x84,0x11,0x11,0x29,0x0c,0x83,0x1b,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x10,\r\n0xd6,0xe1,0xc6,0x00,0x3f,0xed,0x2f,0xfd,0xc6,0x10,0xc6,0x3f,0xed,0x32,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x04,\r\n0x54,0x30,0x2a,0x5e,0x16,0x06,0x9c,0x8f,0xa8,0xd1,0xc5,0xa7,0x6e,0x4b,0xdf,0x01,0x7f,0xaf,0xb8,0xec,0xfe,0xe6,0x01,0x34,0xf5,0x51,0x49,0x05,0x70,0x56,0x3c,0x34,0x04,0x52,0x1a,0x76,0x42,0x68,0x06,0x48,0xe1,0xb3,0xb8,0xd0,0x26,0x01,0x04,0x8b,0xfe,0x17,0x56,0x01,0x18,0xf0,0xef,0x01,0x39,0x16,0x22,0x03,0x4c,0x6f,0x1a,0x00,\r\n0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xe2,0x04,0x00,0x00,0x0b,0x00,0x35,0x40,0x1c,0x03,0x95,0x40,0x08,0x06,0x05,0x08,0x95,0x0c,0x30,0x0b,0x00,0x06,0x05,0x15,0x06,0x0f,0x09,0x08,0x04,0x00,0x84,0x01,0x01,0x0d,0x04,0x84,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,\r\n0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0xe2,0xa4,0xfe,0x0c,0xa4,0xa4,0x01,0xf4,0xa4,0x01,0xc6,0xfe,0x3a,0x04,0x00,0xfe,0x52,0x01,0xae,0x00,0x00,0x03,0xff,0x18,0xfe,0x1e,0x02,0x38,0x05,0xd9,0x00,0x0b,0x00,0x1d,0x00,0x25,0x00,0x70,0xb7,0x1e,0x0e,0x0c,0x20,0x1b,0x18,0x16,0x1d,0xb8,\r\n0xff,0xc0,0x40,0x36,0x13,0x16,0x48,0x1d,0x0c,0x0c,0x10,0x20,0x96,0x0f,0x16,0x1f,0x16,0x02,0x09,0x03,0x16,0x24,0x96,0x10,0x1c,0x06,0x63,0x40,0x00,0x19,0x0f,0x09,0x62,0x03,0x18,0x1b,0x03,0x62,0xff,0x30,0x0c,0x0c,0x1b,0x0e,0x1b,0x22,0x84,0x13,0x1e,0x1b,0x84,0x18,0x26,0x27,0x18,0x84,0x08,0x30,0x2b,0x01,0x10,0xe1,0x33,0x18,\r\n0xd4,0xe1,0x12,0x39,0x10,0xc1,0x2f,0x2b,0x01,0x10,0xe1,0x00,0x18,0x3f,0xd6,0x1a,0xed,0x3f,0xed,0x2f,0x5f,0x5e,0x5d,0xed,0x12,0x39,0x2f,0xcd,0x2b,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x26,0x27,0x02,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,\r\n0x33,0x11,0x16,0x17,0x25,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0xfa,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x01,0x11,0x7c,0x7e,0x2d,0xfe,0xf7,0x68,0x88,0xb5,0x91,0x27,0x21,0xa4,0x7a,0x74,0xfe,0x6e,0x24,0x24,0xae,0x62,0x8f,0x05,0x04,0x3c,0x2e,0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0xf9,0x98,0x68,0x34,0xfe,0xe6,0x78,0x5e,0x6d,0x91,0x04,\r\n0x04,0x12,0xfb,0xc2,0x2c,0x54,0x26,0x06,0x70,0x5a,0x00,0x01,0x00,0x04,0xfe,0x14,0x03,0x56,0x04,0x00,0x00,0x0c,0x00,0x2a,0x40,0x16,0x00,0x1c,0x02,0x06,0x0a,0x03,0x07,0x05,0x15,0x0c,0x0f,0x07,0x0f,0x0c,0x84,0x06,0x02,0x0a,0x0a,0x0e,0x05,0x07,0x2f,0xc6,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x3f,\r\n0x31,0x30,0x01,0x23,0x11,0x23,0x01,0x23,0x01,0x01,0x33,0x01,0x33,0x11,0x33,0x03,0x56,0xa4,0x04,0xfe,0x52,0xd7,0x01,0xdb,0xfe,0x00,0xe6,0x01,0xc4,0x04,0xa4,0xfe,0x14,0x03,0xc1,0xfe,0x2b,0x01,0xee,0x02,0x12,0xfe,0x14,0x01,0xec,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xf8,0x04,0x00,0x00,0x05,0x00,0x19,0x40,0x0c,0x04,0x95,\r\n0x01,0x15,0x02,0x0f,0x00,0x00,0x07,0x04,0x84,0x01,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x02,0xf8,0xfd,0xae,0xa4,0x01,0xae,0x04,0x00,0xfc,0x8c,0x00,0x02,0x00,0x60,0xfe,0x29,0x05,0x21,0x06,0x02,0x00,0x19,0x00,0x26,0x00,0x38,0x40,0x1e,0x05,0x1b,0x13,0x07,0x10,0x24,0x95,0x0a,\r\n0x16,0x1e,0x95,0x10,0x10,0x00,0x02,0x95,0x17,0x01,0x00,0x00,0x05,0x84,0x1a,0x13,0x07,0x07,0x28,0x21,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,\r\n0x17,0x33,0x11,0x34,0x36,0x33,0x32,0x17,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x21,0x37,0x36,0xa4,0xa4,0x04,0x6e,0xee,0xc2,0xea,0xff,0xd6,0xd3,0x60,0x04,0xb4,0x8a,0x48,0x2f,0xfe,0x4b,0xa7,0x7b,0x98,0xaa,0xa7,0x84,0x8b,0xae,0x05,0x5c,0x1b,0xcf,0xf9,0x81,0x02,0x85,0xc6,0x01,0x12,0xee,0x01,\r\n0x00,0x01,0x30,0xa6,0x01,0x40,0x99,0xb7,0x12,0xfb,0xdb,0x9b,0x7b,0xad,0xde,0xc4,0xb3,0xc7,0xc2,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x02,0xe8,0x06,0x02,0x00,0x1f,0x00,0x50,0x40,0x2a,0x03,0x00,0x06,0x95,0x40,0x09,0x17,0x05,0x09,0x95,0x08,0x30,0x1a,0x0f,0x17,0x05,0x15,0x14,0x12,0x95,0x17,0x01,0x02,0x02,0x1a,0x04,0x07,0x07,\r\n0x14,0x09,0x00,0x04,0x84,0x05,0x05,0x14,0x1a,0x83,0x0f,0x0f,0x21,0x14,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x34,0x36,0x37,0x36,\r\n0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x89,0xc5,0xc5,0xa3,0xae,0xae,0x51,0x69,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x4e,0x41,0x02,0x04,0x8b,0xfe,0x87,0x01,0x79,0x8b,0x7a,0x9d,0x68,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,\r\n0x7b,0x4b,0x7d,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x02,0xcf,0x06,0x02,0x00,0x1f,0x00,0x4e,0x40,0x2a,0x0e,0x0b,0x11,0x95,0x40,0x14,0x1d,0x10,0x14,0x95,0x08,0x30,0x10,0x15,0x4f,0x00,0x01,0x00,0x02,0x95,0x1d,0x01,0x13,0x13,0x10,0x1a,0x0c,0x0c,0x00,0x14,0x0b,0x10,0x84,0x0f,0x0f,0x05,0x00,0x00,0x21,0x05,0x83,0x1a,0x2f,0xe1,\r\n0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,\r\n0x02,0xcf,0x87,0x94,0x7a,0x90,0x32,0x72,0x6b,0x4d,0xb0,0xb0,0xa4,0xc6,0xc6,0x41,0x54,0x7a,0x4f,0xf0,0xc0,0x94,0x87,0x05,0x29,0x4e,0x78,0x59,0x38,0x72,0x75,0x6e,0x9d,0x78,0x8b,0xfe,0x87,0x01,0x79,0x8b,0x54,0x80,0x53,0x79,0x9f,0x5f,0x95,0xcb,0x3e,0x00,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x27,0x05,0xec,0x00,0x15,0x00,0x22,\r\n0x00,0x25,0x00,0x4a,0x40,0x29,0x11,0x05,0x0e,0x20,0x95,0x08,0x16,0x25,0x01,0x95,0x04,0x15,0x00,0x23,0x95,0x14,0x0f,0x1a,0x95,0x0e,0x10,0x12,0x00,0x11,0x14,0x16,0x03,0x01,0x25,0x84,0x04,0x04,0x0b,0x23,0x00,0x03,0x03,0x27,0x1d,0x83,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0xc6,0x32,0x12,0x39,0x2f,0xe1,0x32,0x17,0x39,0x00,0x3f,0x3f,\r\n0xed,0x3f,0xed,0x39,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x21,0x11,0x07,0x27,0xfd,0x9f,0x02,0x58,0xfc,0x4e,0x04,0x72,0xee,0xc2,\r\n0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x17,0xfc,0x45,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0x02,0xc9,0xfd,0xdb,0x03,0xd1,0xfc,0xbb,0x8c,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0xfd,0xd7,0x87,0x7f,0xb1,0xdf,0xc3,0xac,0xce,0xcb,0x02,0x37,0xfd,0x0f,0x00,0x00,0x02,0x00,0x60,0xfe,0x21,\r\n0x07,0x77,0x05,0xec,0x00,0x29,0x00,0x36,0x00,0x72,0x40,0x40,0x0b,0x0a,0x96,0x40,0x22,0x1f,0x28,0x22,0x96,0x08,0x30,0x01,0x03,0x95,0x28,0x1c,0x1c,0x10,0x19,0x34,0x95,0x13,0x16,0x0e,0x15,0x21,0x0c,0x95,0x1f,0x0f,0x2e,0x95,0x19,0x10,0x1d,0x00,0x22,0x0b,0x0b,0x06,0x01,0x0c,0x21,0x21,0x25,0x01,0x01,0x1c,0x1f,0x2a,0x03,0x0e,\r\n0x84,0x0f,0x0f,0x16,0x25,0x83,0x06,0x06,0x38,0x31,0x83,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x17,0x39,0x39,0x2f,0x10,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x39,0x3f,0x3f,0xed,0x12,0x39,0x39,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x35,0x16,0x33,\r\n0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xee,0xa4,0xb2,0xae,0xdf,0xdf,0xcd,0x52,0x01,0x7f,0xfd,0xbe,\r\n0xa4,0x04,0x72,0xee,0xc2,0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x2e,0xfe,0x76,0xd7,0xec,0xfe,0xbd,0xf6,0xb6,0xfe,0xe4,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0xfe,0x72,0xa2,0x68,0xb6,0x90,0x95,0xa6,0x33,0x02,0x14,0xfc,0x8c,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0x33,0xfd,0xe1,0x1a,\r\n0xe9,0xb5,0xcc,0xfe,0xf7,0x03,0xb6,0x87,0x7f,0xb1,0xdf,0xc3,0xac,0xce,0xcb,0x00,0x00,0x04,0x00,0x60,0xff,0x81,0x07,0xdb,0x05,0xec,0x00,0x22,0x00,0x2f,0x00,0x32,0x00,0x39,0x00,0xcb,0xb9,0x00,0x30,0xff,0xd8,0x40,0x4e,0x0b,0x10,0x01,0x4c,0x19,0x18,0x0b,0x10,0x01,0x4c,0x04,0x39,0x14,0x39,0x24,0x39,0x03,0x34,0x19,0x44,0x19,\r\n0x02,0x06,0x19,0x16,0x19,0x26,0x19,0x03,0x09,0x13,0x07,0x10,0x2d,0x95,0x0a,0x16,0x02,0x00,0x00,0x32,0x33,0x03,0x06,0x19,0x38,0x96,0x40,0x1c,0x80,0x19,0x95,0x06,0x15,0x18,0x30,0x95,0x16,0x0f,0x27,0x95,0x40,0x10,0x10,0x14,0x00,0x30,0x18,0x18,0x1f,0x33,0x00,0x36,0x02,0x1a,0x05,0x1f,0x02,0xb8,0x01,0x03,0x40,0x0b,0x03,0x0f,\r\n0x03,0x1f,0x03,0x02,0x0a,0x03,0x32,0x1f,0x03,0xb8,0x01,0x03,0x40,0x11,0x08,0x30,0x19,0x13,0x16,0x23,0x03,0x32,0x84,0x06,0x06,0x1f,0x0d,0x30,0x18,0x18,0x1f,0xb8,0x01,0x03,0xb5,0x36,0x36,0x3b,0x2a,0x83,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x32,0x2b,0x01,0x5f,0x5e,0x5d,0x10,\r\n0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0xc0,0x18,0x2f,0x32,0x00,0x3f,0x3f,0x1a,0xed,0x3f,0xed,0x39,0x3f,0xfd,0x1a,0xdc,0x1a,0xed,0x11,0x12,0x17,0x39,0x10,0xce,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x5e,0x5d,0x5d,0x5d,0x2b,0x2b,0x21,0x06,0x07,0x23,0x36,0x37,0x21,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x10,0x00,0x33,\r\n0x32,0x17,0x33,0x11,0x33,0x11,0x21,0x15,0x01,0x33,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x21,0x11,0x25,0x33,0x32,0x35,0x34,0x23,0x22,0x05,0xba,0x0c,0x04,0x90,0x04,0x0f,0xfe,0x3f,0x04,0x72,0xee,0xc2,0xe6,0x01,0x02,0xd6,0xce,0x62,0x04,0xa4,0x03,0x17,\r\n0xfd,0x9f,0x92,0x86,0xf9,0x76,0x8e,0xac,0x9b,0xfc,0xd8,0xa4,0x80,0x98,0xa8,0xa4,0x89,0x8a,0xad,0x02,0xc9,0xfd,0xdb,0x01,0xd8,0xae,0xb4,0x75,0x9d,0x39,0x46,0x3b,0x44,0xb4,0xcc,0x01,0x16,0xe8,0x01,0x00,0x01,0x32,0xa8,0x02,0x7c,0xfe,0x14,0x2f,0xfc,0xbb,0x01,0x2e,0x78,0x5c,0x6b,0x7b,0x01,0xd7,0x87,0x7f,0xb1,0xdf,0xc3,0xac,\r\n0xce,0xcb,0x02,0x37,0xfd,0x0f,0x09,0x5a,0x54,0x00,0x00,0x02,0x00,0x2b,0xff,0xe8,0x04,0x94,0x05,0x2f,0x00,0x1d,0x00,0x2c,0x00,0x53,0x40,0x2d,0x11,0x17,0x25,0x2b,0x04,0x09,0x23,0x95,0x1a,0x16,0x05,0x06,0x1f,0x06,0x00,0x95,0x03,0x0f,0x0c,0x0e,0x95,0x09,0x10,0x1e,0x07,0x0c,0x11,0x83,0x2b,0x2b,0x17,0x1f,0x0c,0x0c,0x17,0x83,\r\n0x25,0x25,0x2e,0x02,0x1f,0x00,0x06,0x84,0x03,0x2f,0xe1,0x39,0x39,0xcd,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x23,0x11,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0xdb,0xb0,0xb0,0xa4,0x01,0x73,0x46,0x54,0x7c,0x60,0x64,0x85,0x52,0x60,0x47,0x7a,0x94,0x72,0xf1,0xef,0xfb,0xde,0x01,0x6d,0xc9,0x9f,0x9e,0x01,0x30,0x59,0x79,0x8a,0x6b,0x03,0x74,0x8c,0xfa,0x35,\r\n0xfe,0xd1,0x18,0x2e,0xa6,0x4a,0x4f,0x3f,0x3e,0x4b,0x33,0x40,0x8c,0x62,0x84,0xaa,0xcd,0xd7,0x01,0xe8,0xfe,0x24,0x9d,0x89,0xa0,0x39,0x4b,0x30,0x38,0x8b,0x69,0x48,0x00,0x02,0x00,0x2b,0xfe,0x1e,0x04,0x3e,0x06,0x02,0x00,0x22,0x00,0x2a,0x00,0x49,0x40,0x27,0x0b,0x0d,0x95,0x08,0x1c,0x23,0x29,0x95,0x12,0x16,0x1a,0x1b,0x25,0x1b,\r\n0x15,0x95,0x18,0x0f,0x00,0x02,0x95,0x20,0x01,0x00,0x00,0x04,0x84,0x0b,0x24,0x10,0x1c,0x1c,0x2c,0x25,0x15,0x1b,0x84,0x17,0x18,0x2f,0xcd,0xe1,0x39,0x39,0x12,0x39,0x2f,0x33,0x33,0xc4,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,\r\n0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x04,0x3e,0x32,0x3d,0xaa,0xb9,0x8f,0x4b,0x2c,0x32,0x3d,0xac,0x3a,0x5f,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x02,0xb8,0x8d,0x4c,0x2c,0xfe,0x43,0xfe,\r\n0xfe,0x46,0x51,0x3e,0x05,0x5c,0x1b,0xdf,0xfa,0xe7,0xa3,0xbe,0x13,0x93,0x1a,0xdf,0x81,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0xa0,0xa2,0xc0,0x12,0xfa,0xa6,0x02,0xde,0xfd,0xbf,0x67,0x58,0x00,0x00,0x02,0x00,0x2b,0xff,0xe8,0x05,0xaa,0x05,0x2f,0x00,0x2b,0x00,0x34,0x00,0x77,0x40,0x41,0x22,0x13,0x24,0x13,0x00,0x2a,\r\n0x18,0x33,0x96,0x0f,0x24,0x1f,0x24,0x02,0x24,0x24,0x18,0x2e,0x96,0x2a,0x16,0x11,0x95,0x02,0x16,0x0a,0x0b,0x0e,0x0b,0x05,0x95,0x08,0x0f,0x1b,0x1d,0x95,0x18,0x10,0x0c,0x2c,0x22,0x31,0x20,0x13,0x00,0x27,0x20,0x83,0x15,0x15,0x27,0x0e,0x1b,0x1b,0x27,0x84,0x31,0x31,0x36,0x0e,0x05,0x0b,0x84,0x07,0x08,0x2f,0xcd,0xe1,0x39,0x39,\r\n0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0xc4,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,\r\n0x33,0x32,0x37,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x03,0x18,0xa0,0x8a,0xfe,0xed,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x93,0x4a,0x66,0x58,0x01,0x22,0xf3,0x87,0x66,0x72,0x81,0x9e,0xc9,0x38,0xd2,\r\n0x86,0x75,0x93,0xbd,0x9b,0xba,0x02,0x54,0x70,0x54,0x66,0x78,0x60,0x52,0x6a,0x01,0x3d,0x02,0x4f,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xc1,0xc3,0x42,0x84,0xb0,0xfd,0x01,0x33,0x32,0xa8,0x50,0xe1,0xb7,0x81,0x61,0x96,0x7a,0x5b,0x67,0x86,0xc6,0x42,0x3a,0x2b,0x56,0x00,0x00,0x01,0x00,0x35,0xfe,0x1e,0x05,0xc8,0x06,0x02,0x00,0x2e,\r\n0x00,0x58,0x40,0x30,0x06,0x08,0x95,0x03,0x1c,0x28,0x2b,0x12,0x15,0x16,0x15,0x0d,0x95,0x2b,0x10,0x26,0x14,0x17,0x95,0x1a,0x0f,0x21,0x23,0x95,0x1e,0x01,0x06,0x06,0x0a,0x21,0x21,0x28,0x11,0x84,0x12,0x12,0x1a,0x00,0x84,0x0a,0x0a,0x30,0x17,0x14,0x26,0x84,0x19,0x1a,0x2f,0xcd,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,\r\n0xe1,0x32,0x39,0x2f,0x11,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x39,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x3f,0xfd,0xc6,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,\r\n0x15,0x21,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x05,0xc8,0xbe,0xae,0x4c,0x35,0x3d,0x44,0xc9,0xed,0x7c,0xa2,0xa3,0xf0,0xa3,0xaf,0xaf,0xbf,0x97,0x4f,0x33,0x3a,0x40,0xbb,0x01,0x93,0x04,0x74,0xdc,0xa8,0xb2,0x04,0xe7,0xf7,0x1a,0x99,0x27,0x01,0x3e,0x02,0x60,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x03,0x74,0xfc,0x8c,0x03,0x74,0x8c,0x92,\r\n0xa8,0xc8,0x16,0x94,0x1f,0xee,0x89,0xaa,0xc2,0xd8,0xce,0x00,0x00,0x01,0x00,0x98,0xff,0xe8,0x04,0x50,0x05,0xfc,0x00,0x24,0x00,0x3c,0x40,0x21,0x07,0x0d,0x18,0x1e,0x04,0x10,0x05,0x95,0x21,0x16,0x13,0x15,0x95,0x10,0x10,0x00,0x01,0x18,0x83,0x0d,0x0d,0x1e,0x00,0x13,0x13,0x1e,0x83,0x07,0x07,0x26,0x01,0x84,0x00,0x2f,0xe1,0x12,\r\n0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x33,0x11,0x14,0x16,0x33,0x20,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x98,0xa4,0x9f,0xa0,0x01,\r\n0x2d,0x58,0x79,0x8c,0x69,0xc8,0x9e,0x7c,0x61,0x65,0x84,0x52,0x61,0x47,0x7a,0x97,0x6f,0xf1,0xef,0xfb,0xdd,0x05,0xfc,0xfb,0x9c,0x9d,0x89,0xa0,0x39,0x4b,0x30,0x39,0x89,0x6a,0x81,0xa5,0x2e,0xa6,0x4a,0x4f,0x3f,0x3e,0x4b,0x33,0x41,0x8b,0x62,0x86,0xa8,0xcc,0xd8,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x60,0x05,0xec,0x00,0x08,\r\n0x00,0x0b,0x00,0x2b,0x40,0x16,0x0b,0x01,0x95,0x04,0x15,0x00,0x09,0x95,0x07,0x0f,0x05,0x00,0x09,0x00,0x03,0x03,0x0d,0x01,0x07,0x0b,0x84,0x04,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xc6,0x32,0x00,0x3f,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x07,0x21,0x11,0x04,0x60,0xfd,0xa0,0x02,\r\n0x58,0xfc,0x4e,0xa4,0x03,0x16,0xf2,0xfd,0xdc,0x03,0xd1,0xfc,0xbb,0x8c,0x05,0xec,0xfe,0x14,0x8c,0xfd,0x0f,0x00,0x00,0x02,0x00,0x31,0x00,0x00,0x03,0xc2,0x05,0x9a,0x00,0x1b,0x00,0x37,0x00,0x22,0x40,0x10,0x27,0x0e,0x40,0x26,0x12,0x0a,0x0b,0x42,0x0a,0x0b,0x03,0x00,0x1c,0x39,0x0b,0x27,0x2f,0x33,0x10,0xc6,0x32,0x00,0x3f,0xcd,\r\n0x2b,0x00,0x18,0x3f,0x1a,0xed,0x31,0x30,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x13,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,\r\n0x03,0xc2,0xb6,0x93,0x6b,0x09,0x05,0x04,0x03,0x0f,0x73,0x91,0xb5,0x8b,0x6b,0x09,0x03,0x05,0x02,0x10,0x76,0x8c,0x6c,0x08,0x04,0x04,0x01,0x10,0x67,0x82,0xb6,0x93,0x6b,0x09,0x05,0x04,0x03,0x0f,0x73,0x91,0xb5,0x8b,0x6b,0x09,0x03,0x05,0x02,0x10,0x76,0x8c,0x6c,0x08,0x04,0x04,0x01,0x10,0x67,0x05,0x9a,0xfd,0x78,0x01,0x90,0x21,\r\n0x3b,0x24,0x36,0xfe,0x6e,0x02,0x88,0xfe,0x5a,0x24,0x34,0x21,0x39,0x01,0xa4,0xfe,0x5a,0x20,0x38,0x16,0x42,0x01,0xa6,0xfc,0xed,0xfd,0x79,0x01,0x90,0x21,0x3b,0x24,0x36,0xfe,0x6e,0x02,0x87,0xfe,0x5b,0x24,0x35,0x21,0x3a,0x01,0xa3,0xfe,0x5b,0x20,0x39,0x17,0x42,0x01,0xa5,0x00,0x00,0x02,0x00,0x74,0x00,0x00,0x03,0x7f,0x05,0x9a,\r\n0x00,0x07,0x00,0x0f,0x00,0x37,0x40,0x1c,0x0b,0x96,0x0e,0x08,0x0d,0x12,0x00,0x05,0x03,0x96,0x06,0x03,0x01,0x00,0x08,0x09,0x05,0x04,0x0c,0x0d,0x08,0x7f,0x09,0x09,0x11,0x0c,0x7f,0x0d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0xcd,0x32,0x3f,0x33,0xdd,0xed,0x31,0x30,0x01,0x23,0x11,\r\n0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x03,0x7f,0x89,0xfe,0x06,0x88,0x03,0x0b,0x89,0xfe,0x06,0x88,0x03,0x0b,0x03,0xa2,0x01,0x74,0xfe,0x8c,0x01,0xf8,0xfa,0x66,0x01,0x74,0xfe,0x8c,0x01,0xf8,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x14,0x05,0xfc,0x00,0x13,0x00,0x23,0x00,0x3d,0x40,0x20,0x01,0x00,\r\n0x14,0x96,0x15,0x15,0x1f,0x1a,0x95,0x0e,0x01,0x1f,0xec,0x07,0x16,0x01,0x14,0x11,0x83,0x18,0x14,0x18,0x14,0x1d,0x04,0x83,0x22,0x22,0x25,0x1d,0x84,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x15,0x16,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x35,0x36,0x36,0x35,0x34,0x23,0x22,0x11,0x11,0x10,0x21,0x32,0x36,0x35,0x10,0x02,0x9e,0xb4,0xc2,0xf7,0xcd,0xcd,0xdd,0xda,0xbc,0xa6,0xc6,0x95,0xfe,0xdf,0x78,0x98,0xd1,0xe7,0x01,0x10,0x83,0x8f,0x03,0x38,0x05,0x1d,0xd8,0xa6,0xc3,0xed,0xfb,0xea,0x02,0x8d,\r\n0xbe,0xe4,0xb9,0x9b,0x7e,0xcc,0x78,0x82,0x14,0xa5,0x73,0xdc,0xfe,0xda,0xfd,0x87,0xfe,0xa6,0x90,0x87,0x01,0x30,0x00,0x02,0x00,0x14,0xff,0xe8,0x04,0xc4,0x06,0x02,0x00,0x2a,0x00,0x32,0x00,0x6b,0x40,0x3b,0x02,0x20,0x00,0x28,0x2b,0x00,0xec,0x2a,0x2b,0xec,0x20,0x20,0x1d,0x10,0x0e,0x95,0x13,0x10,0x2d,0x95,0x26,0x01,0x1d,0xec,\r\n0x05,0x16,0x30,0x84,0x23,0x40,0x0b,0x0e,0x48,0x23,0x23,0x2b,0x0c,0x2a,0x2a,0x28,0x02,0x28,0x08,0x20,0x2b,0x1a,0x84,0x08,0x16,0x84,0x0c,0x0c,0x10,0x28,0x84,0x2b,0x2b,0x34,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xd4,0xe1,0x11,0x39,0x11,0x12,0x39,0x10,0xca,0x2f,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x00,0x3f,0xed,0x3f,\r\n0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x06,0x07,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x13,0x26,0x00,0x35,0x34,0x36,0x33,0x20,0x13,0x36,0x37,0x05,0x02,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x04,0xc4,0x42,0x59,0x0b,0xfe,0xed,0xea,0xbe,0xdc,0x16,0x15,0x58,0x26,0x20,0x32,0x31,0x65,0x7a,0x15,0x16,0x89,0x75,0x9e,0xb5,0x09,0xeb,0xfe,0xda,0xad,0x87,0x01,0x70,0x13,0x4d,0x4c,0xfe,0xc3,0x0e,0xd3,0x3f,0x4f,0xc7,0x02,0xe6,0x19,0x0f,0xfe,0xa6,0xfe,0x84,0xdc,0xc1,0x55,0x81,0x81,0x3a,0x78,0x11,0x89,\r\n0x12,0x8a,0x6b,0x3f,0x81,0x81,0x50,0x84,0x97,0x01,0x29,0x01,0x12,0x08,0x01,0x18,0xd0,0x97,0xc9,0xfd,0x4a,0x0c,0x1f,0x35,0x02,0x35,0x71,0x5a,0x98,0xc9,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xb8,0x05,0xb2,0x00,0x16,0x00,0x4f,0x40,0x27,0x12,0x0d,0x14,0x03,0x05,0x02,0x08,0x05,0x0d,0x0d,0x0a,0x07,0x00,0x02,0x91,0x14,0x04,0x0a,\r\n0x03,0x07,0x00,0x12,0x00,0x03,0x03,0x18,0x05,0x0a,0x09,0x09,0x17,0x0e,0x0d,0x05,0x7e,0x08,0x08,0x18,0x17,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x11,0x33,0x33,0x2f,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x33,0x11,0x12,0x39,0x11,0x12,0x39,0x31,0x30,0x01,0x26,0x23,0x22,0x07,\r\n0x01,0x11,0x23,0x11,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x36,0x33,0x32,0x17,0x04,0xb8,0x2c,0x2c,0x52,0x60,0xfe,0xd9,0xa8,0xfe,0x33,0xbf,0x01,0x41,0x06,0x1d,0x03,0x08,0x1a,0xc7,0x4b,0x8c,0x5e,0x36,0x2c,0x05,0x06,0x14,0xbe,0xfd,0xb2,0xfd,0xf2,0x02,0x0e,0x03,0x8c,0xfd,0x78,0x0c,0x4c,0x1c,0x3c,0x01,0x8e,0x96,\r\n0x7c,0x14,0xff,0xff,0xff,0xb1,0x00,0x00,0x05,0xa0,0x05,0xb2,0x00,0x27,0x05,0xb5,0x00,0xe8,0x00,0x00,0x01,0x07,0x01,0x9f,0xfe,0xe3,0xff,0x99,0x00,0x14,0xb3,0x01,0x17,0x03,0x01,0xb8,0xff,0xc4,0xb4,0x17,0x17,0x09,0x09,0x25,0x01,0x2b,0x35,0x00,0x3f,0x35,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xb8,0x06,0xf7,0x02,0x26,0x05,0xb5,\r\n0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x96,0x01,0x70,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xd1,0x40,0x0a,0x26,0x20,0x09,0x16,0x25,0x02,0x01,0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x03,0x00,0x60,0xfe,0x29,0x04,0xba,0x05,0xec,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x45,0x40,0x25,0x0a,0x00,0x12,0x1a,0x95,0x0c,\r\n0x09,0x10,0x02,0x1b,0x13,0x19,0x95,0x40,0x00,0x03,0x16,0x0f,0x83,0x16,0x0e,0x00,0x1d,0x03,0x42,0x13,0x0c,0x00,0x84,0x19,0x09,0x03,0x03,0x21,0x1d,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x32,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x31,0x30,0x05,0x11,0x23,\r\n0x11,0x26,0x02,0x35,0x34,0x00,0x37,0x11,0x33,0x11,0x16,0x12,0x15,0x14,0x00,0x03,0x11,0x36,0x36,0x35,0x34,0x26,0x01,0x11,0x06,0x06,0x15,0x14,0x16,0x02,0xdf,0xa3,0xdd,0xff,0x01,0x04,0xd8,0xa3,0xdf,0xfc,0xfe,0xfe,0xd9,0x93,0xa0,0xa0,0xfe,0xca,0x91,0xa3,0xa3,0x18,0xfe,0x41,0x01,0xbf,0x11,0x01,0x22,0xdf,0xe7,0x01,0x20,0x17,\r\n0x01,0xd4,0xfe,0x2c,0x10,0xfe,0xe1,0xe5,0xe3,0xfe,0xdc,0x03,0x91,0xfc,0xe4,0x12,0xd0,0xac,0xab,0xd1,0xfc,0xf6,0x03,0x1c,0x12,0xd2,0xac,0xa6,0xd3,0x00,0x00,0x02,0x00,0x00,0xff,0xea,0x06,0x2d,0x04,0x00,0x00,0x16,0x00,0x28,0x00,0x69,0x40,0x38,0x08,0x0b,0x20,0x20,0x0b,0x0f,0x12,0x01,0x09,0x04,0x12,0x18,0x01,0x10,0x95,0x15,\r\n0x0f,0x24,0x1d,0xec,0x06,0x0b,0x16,0x17,0x83,0x01,0x01,0x03,0x18,0x83,0x10,0x0e,0x40,0x00,0x00,0x03,0x83,0x27,0x0e,0x22,0x1a,0x1f,0x42,0x09,0x08,0x22,0x84,0x1f,0x1f,0x2a,0x1a,0x83,0x0e,0x0e,0x2a,0x12,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x39,0x2b,0x01,0x10,0xf2,0xe1,0x32,0x18,0x2f,0x1a,0x10,0xdd,0xe1,0x10,\r\n0xc9,0x2f,0xe1,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x32,0x32,0x32,0x5f,0x5e,0x5d,0x11,0x39,0x2f,0x11,0x39,0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x22,0x07,0x35,0x36,0x33,0x21,0x05,0x21,0x06,0x15,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x15,0x10,0x33,0x32,0x36,0x35,0x34,\r\n0x06,0x2d,0xb6,0x83,0xd5,0xbf,0xcf,0x64,0x04,0x67,0xce,0xb9,0xd1,0x84,0x7e,0x76,0x6a,0x96,0x05,0x2d,0xfe,0xa0,0xfc,0xd1,0x88,0x7b,0x6d,0xe8,0xa1,0xe5,0x6c,0x7c,0x03,0x74,0xdc,0xda,0xda,0xfa,0xbe,0xbe,0xfb,0xd9,0xd5,0xe1,0x58,0x9c,0x48,0x8c,0xe6,0xd6,0x96,0xa9,0x01,0x5a,0xfc,0xfc,0xfe,0xa6,0xaa,0x95,0xd6,0x00,0x00,0x01,\r\n0x00,0x00,0xfe,0x96,0x04,0x90,0x04,0x18,0x00,0x33,0x00,0x83,0x40,0x28,0x06,0x08,0x95,0x40,0x03,0x34,0x80,0x11,0x29,0x27,0x15,0x29,0x15,0x17,0x2b,0x1f,0x1d,0x95,0x22,0x10,0x2b,0x0f,0x33,0x31,0x95,0x40,0x0c,0x16,0x17,0x29,0x11,0x2b,0x0f,0x27,0x15,0x25,0x17,0x06,0x06,0x0b,0xb8,0x01,0x2e,0x40,0x1a,0x33,0x2b,0x83,0x2c,0x2c,\r\n0x00,0x2e,0x84,0x0f,0x0e,0x33,0x17,0x83,0x18,0x18,0x1a,0x1f,0x1f,0x25,0x42,0x25,0x84,0x1a,0x1a,0x35,0x1f,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0xe1,0x2f,0xf0,0xe1,0x11,0x39,0x2f,0xe1,0x10,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x1a,0xed,0x32,0x3f,0x3f,0xed,0x32,0x11,\r\n0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x1a,0x10,0xdc,0x1a,0xed,0x32,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x35,0x26,0x26,0x35,0x34,0x37,0x06,0x07,0x06,0x07,0x06,0x07,0x23,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x37,0x36,0x37,0x33,0x02,0x15,0x14,0x16,\r\n0x33,0x32,0x37,0x04,0x90,0x98,0x7d,0x3f,0x34,0x34,0x3b,0x39,0x46,0x77,0x85,0x14,0x06,0xf1,0x94,0x56,0x14,0x27,0xac,0xb0,0x56,0x50,0x2a,0x26,0x32,0x3e,0x8a,0x9c,0x15,0x01,0x8d,0x54,0x14,0x28,0xac,0xb0,0x57,0x4f,0x2a,0x26,0x44,0x87,0x9f,0x18,0x92,0x1f,0x57,0x48,0x2a,0x10,0xdb,0xb0,0x69,0x6a,0x06,0xdb,0x87,0x62,0x35,0x59,\r\n0x01,0x72,0xf4,0x89,0x9f,0x15,0x89,0x16,0xde,0xbf,0x69,0x6a,0x01,0x65,0x65,0x35,0x59,0xfe,0x8e,0xf4,0x8c,0x9c,0x0f,0x00,0x00,0x02,0x00,0x56,0x00,0x00,0x05,0x48,0x05,0xb2,0x00,0x0e,0x00,0x1a,0x00,0x3c,0x40,0x1f,0x15,0x91,0x00,0x03,0x03,0x02,0x0f,0x91,0x40,0x09,0x04,0x02,0x0c,0x7d,0x18,0x0e,0x01,0x12,0x02,0x42,0x12,0x7d,\r\n0x06,0x06,0x1b,0x01,0x7e,0x02,0x02,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x3f,0x1a,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x26,0x00,0x35,0x34,0x00,0x21,0x20,0x00,0x15,0x14,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,\r\n0x23,0xa8,0xfc,0xfe,0xd7,0x01,0x63,0x01,0x18,0x01,0x1e,0x01,0x59,0xfe,0xd2,0xfe,0xb5,0xd2,0xf7,0xf8,0xd1,0xd2,0xf7,0xf7,0x01,0x64,0xfe,0x9c,0x01,0x64,0x17,0x01,0x29,0xdf,0xf1,0x01,0x3e,0xfe,0xcf,0xf1,0xde,0xfe,0xcc,0x03,0x9c,0xde,0xb3,0xb1,0xe0,0xde,0xb3,0xb1,0xe0,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x50,0x04,0x18,\r\n0x00,0x0e,0x00,0x1a,0x00,0x3a,0x40,0x1f,0x0f,0x95,0x09,0x10,0x02,0x1b,0x15,0x96,0x40,0x00,0x03,0x16,0x0c,0x83,0x18,0x0e,0x00,0x12,0x03,0x42,0x00,0x84,0x03,0x03,0x1c,0x12,0x83,0x06,0x06,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x3f,0x3f,0xed,0x31,0x30,\r\n0x05,0x11,0x23,0x11,0x26,0x02,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x02,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xaa,0xa4,0xc5,0xe1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xe2,0xfe,0xf0,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x14,0xfe,0x3d,0x01,0xc3,0x18,0x01,0x18,0xd8,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,\r\n0xdc,0xfe,0xe0,0x03,0x86,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x00,0x02,0x00,0x5e,0xfe,0xae,0x04,0xa8,0x06,0x60,0x00,0x20,0x00,0x21,0x00,0x4d,0xb9,0x00,0x0d,0xff,0xd8,0x40,0x0f,0x13,0x1d,0x48,0x01,0x22,0x80,0x11,0x16,0x1c,0x0b,0x07,0x22,0x21,0x04,0x1c,0xb8,0xff,0xf0,0x40,0x15,0x10,0x16,0x48,0x1c,0x06,0x13,0x1f,\r\n0x7e,0x01,0x03,0x03,0x08,0x13,0x7e,0x10,0x0e,0x0e,0x23,0x1a,0x7d,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0x33,0x2b,0x3f,0x12,0x39,0x39,0x12,0x39,0xc4,0x1a,0x10,0xce,0x31,0x30,0x2b,0x01,0x23,0x36,0x35,0x34,0x26,0x27,0x24,0x11,0x10,0x00,0x37,0x24,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,\r\n0x06,0x07,0x06,0x06,0x02,0x15,0x10,0x05,0x16,0x16,0x15,0x14,0x13,0x04,0x44,0xb4,0x4f,0x88,0xa3,0xfd,0xaa,0x01,0x15,0xfb,0x01,0x28,0x62,0x08,0x97,0x0d,0x84,0xca,0xca,0xdf,0x8f,0x01,0xcf,0xef,0xbb,0x21,0xfe,0xae,0x54,0x4c,0x3a,0x45,0x1b,0x62,0x02,0x68,0x01,0x13,0x01,0x79,0x47,0x3e,0x37,0x2f,0x1b,0x1c,0x24,0x28,0x5d,0x6c,\r\n0x2f,0x2d,0x6e,0xfe,0xfa,0xbf,0xfe,0x23,0x57,0x2d,0x80,0x77,0x5a,0x06,0xa8,0x00,0x00,0x02,0x00,0x60,0xfe,0xc4,0x03,0xa4,0x04,0xc6,0x00,0x1e,0x00,0x1f,0x00,0x4f,0xb9,0x00,0x17,0xff,0xd8,0x40,0x1f,0x13,0x1d,0x48,0x1b,0x01,0x10,0x10,0x16,0x48,0x01,0x15,0x15,0x20,0x1f,0x10,0x0c,0x20,0x80,0x06,0xec,0x11,0x15,0x0b,0x0c,0x0c,\r\n0x09,0x84,0x0e,0x0e,0x13,0x1d,0xb8,0x01,0x2e,0xb6,0x1a,0x18,0x18,0x21,0x04,0x83,0x13,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x11,0x33,0x00,0x3f,0xed,0x1a,0x10,0xce,0x3f,0x12,0x39,0x11,0x33,0x2b,0xc4,0x31,0x30,0x2b,0x01,0x0e,0x02,0x15,0x14,0x05,0x16,0x16,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x27,\r\n0x24,0x11,0x10,0x25,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x37,0x03,0x10,0xb1,0xe2,0x75,0x01,0x25,0xc4,0xa3,0x50,0xb4,0x62,0x73,0x8d,0xfe,0x6e,0x01,0x52,0xd4,0x7a,0x0a,0x98,0x0c,0x0a,0x03,0xbe,0x36,0x5f,0xc8,0x94,0xfd,0x3a,0x28,0x7d,0x76,0x5f,0x58,0x50,0x54,0x3f,0x40,0x19,0x48,0x01,0x70,0x01,0x9e,0x8e,0x41,0x38,\r\n0x33,0x1c,0x1a,0x24,0x25,0x85,0x20,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xa8,0x05,0x9a,0x00,0x11,0x00,0x38,0x40,0x0d,0x01,0x06,0x91,0x0d,0x0d,0x08,0x0c,0x91,0x09,0x03,0x08,0x01,0x10,0xb8,0x01,0x2c,0x40,0x0d,0xaf,0x03,0x01,0x03,0x03,0x08,0x0b,0x0b,0x13,0x0d,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,\r\n0x5d,0xe1,0xc6,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x23,0x36,0x35,0x34,0x23,0x21,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x21,0x32,0x15,0x14,0x03,0x70,0x8c,0x08,0x69,0xfe,0xe1,0xa8,0x02,0xec,0xfd,0xbc,0x01,0x25,0xf6,0x02,0x0e,0x1e,0x28,0x5a,0xfd,0x52,0x05,0x9a,0x98,0xfe,0x40,0xce,0x34,0x00,0x00,0x01,\r\n0x00,0x90,0xfe,0x29,0x03,0x54,0x04,0x18,0x00,0x0e,0x00,0x2a,0x40,0x15,0x07,0x95,0x04,0x04,0x0f,0x01,0x95,0x0d,0x10,0x09,0x1b,0x05,0x05,0x00,0x00,0x10,0x04,0x04,0x07,0x84,0x0a,0x2f,0xe1,0x32,0x11,0x12,0x39,0x2f,0x33,0x2f,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x23,0x20,0x11,0x15,0x21,0x15,0x21,0x11,0x23,\r\n0x11,0x34,0x12,0x33,0x33,0x03,0x54,0xee,0xfe,0xcd,0x01,0xf8,0xfe,0x08,0xa3,0xf4,0xe4,0xec,0x03,0x8e,0xfe,0xb0,0x4c,0x8c,0xfc,0xc3,0x04,0x02,0xea,0x01,0x03,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x04,0x7d,0x05,0x9a,0x00,0x07,0x00,0x36,0x40,0x1b,0x04,0x91,0x40,0x07,0x05,0x02,0x07,0x91,0x2b,0x30,0x05,0x03,0x02,0x03,0x00,0x02,\r\n0x07,0x06,0x04,0x02,0x00,0x06,0x04,0x00,0x00,0x09,0x04,0x2f,0x12,0x39,0x2f,0x10,0xcd,0x10,0xcd,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x01,0x23,0x13,0x21,0x01,0x33,0x03,0x04,0x7d,0xfe,0xdb,0xb4,0xf2,0xfc,0xb2,0x01,0x1c,0xb4,0xe9,0x03,0x25,0xfc,0xdb,0x02,0x8e,0x03,0x0c,\r\n0xfd,0x8b,0x00,0x01,0x00,0x33,0xfe,0x1e,0x03,0xd1,0x06,0x02,0x00,0x23,0x00,0x5e,0x40,0x32,0x12,0x95,0x40,0x23,0x1d,0x0b,0x23,0x95,0x2b,0x30,0x1a,0x18,0x95,0x1d,0x01,0x08,0x06,0x95,0x40,0x0b,0x1c,0x11,0x00,0x0e,0x08,0x08,0x00,0x03,0x84,0x0e,0x0e,0x00,0x1a,0x1a,0x15,0x12,0x12,0x20,0x42,0x23,0x12,0x20,0x84,0x15,0x15,0x00,\r\n0x00,0x25,0x12,0x24,0x10,0xce,0x11,0x39,0x2f,0x39,0x2f,0xe1,0x11,0x39,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0x10,0xf1,0xe1,0x11,0x39,0x2f,0x11,0x12,0x39,0x00,0x3f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x03,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x37,\r\n0x21,0x13,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x03,0x07,0x03,0xd1,0x5d,0x7a,0x41,0x39,0x2b,0x21,0x2c,0x38,0x74,0x92,0x81,0x21,0xfd,0x3b,0x5d,0x7a,0x41,0x39,0x2a,0x22,0x2c,0x38,0x74,0x92,0x81,0x21,0x02,0x56,0xfe,0xfc,0xfe,0xab,0x91,0x56,0x6c,0x14,0x89,0x17,0xb3,0x87,0xaa,0x01,0x6c,0x5d,\r\n0x01,0x04,0x01,0x55,0x90,0x5a,0x69,0x15,0x8a,0x16,0xb2,0x88,0xaa,0xfe,0x94,0x5c,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x85,0x05,0xb2,0x00,0x18,0x00,0x94,0x40,0x5c,0x5d,0x05,0x6d,0x05,0x7d,0x05,0x03,0x05,0x08,0x0a,0x0d,0x0e,0x04,0x0e,0x2c,0x04,0x5c,0x04,0x02,0x04,0x0e,0x01,0x5b,0x08,0x01,0x06,0x05,0x08,0x03,0x07,0x29,0x0d,\r\n0x01,0x29,0x0a,0x79,0x0a,0x89,0x0a,0x03,0x0b,0x0a,0x0d,0x03,0x0c,0x0a,0x07,0x01,0x05,0x0c,0x01,0x5f,0x0c,0x01,0x07,0x0c,0x07,0x0c,0x0f,0x01,0x11,0x0f,0x91,0x14,0x04,0x06,0x07,0x07,0x0b,0x0f,0x0c,0x01,0x0c,0x0c,0x3a,0x0e,0x01,0x0e,0x05,0x08,0x0a,0x0d,0x04,0x06,0x11,0x01,0x17,0x7d,0x03,0x03,0x1a,0x11,0x2f,0x12,0x39,0x2f,\r\n0xe1,0x33,0x12,0x17,0x39,0x5d,0x39,0x2f,0x5d,0x33,0x33,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x17,0x33,0x5d,0x5d,0x11,0x17,0x33,0x5d,0x11,0x39,0x39,0x5d,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x00,0x5d,0x21,0x23,0x12,0x11,0x34,0x27,0x01,0x27,0x01,0x26,0x27,0x01,0x27,0x01,\r\n0x26,0x23,0x22,0x07,0x35,0x36,0x21,0x20,0x00,0x11,0x10,0x03,0xfc,0xba,0x97,0x0e,0xfe,0x4d,0x54,0x01,0xe4,0x20,0x32,0xfd,0xfa,0x56,0x02,0x00,0x7c,0xb1,0xff,0xce,0xd2,0x01,0x03,0x01,0x3c,0x01,0x74,0x01,0x01,0x01,0x4d,0x58,0x5a,0xfe,0xae,0x6c,0x01,0x7c,0x60,0x4e,0xfe,0x6c,0x6c,0x01,0x92,0x6c,0xda,0xc2,0xb0,0xfe,0x1a,0xfe,\r\n0x94,0xfe,0xc4,0x00,0x00,0x01,0xff,0x7b,0xfe,0x29,0x03,0x77,0x06,0x02,0x00,0x14,0x00,0x8d,0x40,0x5a,0x05,0x08,0x0a,0x0d,0x0e,0x04,0x0e,0x06,0x08,0x05,0x03,0x07,0x66,0x0d,0x01,0x0a,0x0d,0x01,0x0a,0x0a,0x01,0x0b,0x0d,0x0a,0x03,0x0c,0x16,0x07,0x76,0x07,0x02,0x07,0x76,0x0c,0x01,0x1d,0x0c,0x01,0x0c,0x0b,0x0e,0x7b,0x0e,0x02,\r\n0x0c,0x04,0x2c,0x04,0x5c,0x04,0x6c,0x04,0xcc,0x04,0xdc,0x04,0x06,0x0e,0x0c,0x07,0x04,0x04,0x01,0x1b,0x0f,0xee,0x10,0x01,0x06,0x07,0x07,0x0b,0x0c,0x0c,0x04,0x0e,0x01,0x05,0x08,0x0a,0x0d,0x04,0x0f,0x13,0x84,0x03,0x03,0x16,0x15,0x0f,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x33,0x39,0x39,0x39,0x2f,0x33,0x33,0x2f,0x33,\r\n0x00,0x3f,0xed,0x3f,0x17,0x39,0x5d,0x5d,0x2f,0x5d,0x5d,0x2f,0x5d,0x11,0x17,0x33,0x5d,0x5d,0x5d,0x11,0x17,0x33,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x01,0x23,0x12,0x11,0x34,0x27,0x05,0x27,0x25,0x26,0x27,0x05,0x27,0x25,0x02,0x25,0x35,0x04,0x00,0x11,0x10,0x02,0xa4,0xbc,0xed,0x08,0xfe,0x2f,0x31,0x01,0xe7,0x1e,0x3e,\r\n0xfe,0x1a,0x30,0x01,0xd0,0xfa,0xfe,0x65,0x01,0xc2,0x02,0x3a,0xfe,0x29,0x01,0x4b,0x01,0x8a,0x4f,0x41,0xaa,0x82,0xb2,0x7c,0x7a,0xb2,0x81,0xac,0x01,0x88,0x4b,0xa6,0x58,0xfd,0x27,0xfe,0x2f,0xfe,0x94,0x00,0x00,0x01,0x00,0xb8,0xfe,0x1e,0x06,0x66,0x05,0x9a,0x00,0x2f,0x00,0x85,0x40,0x4b,0x3a,0x23,0x01,0x0c,0x91,0x00,0x07,0x10,\r\n0x07,0x02,0x09,0x03,0x07,0x03,0x0a,0x91,0x09,0x10,0x91,0x09,0x03,0x1c,0x0d,0x18,0x01,0x0d,0x04,0x18,0x14,0x1e,0x2a,0x22,0x91,0x40,0x16,0x1a,0x13,0x2e,0x26,0x1e,0x03,0x03,0x10,0x10,0x40,0x09,0x14,0x48,0x10,0x02,0x13,0x0a,0x18,0x27,0x26,0x0a,0x0a,0x1d,0x2f,0x7e,0x13,0x2e,0x0e,0x27,0x1e,0x26,0x42,0x27,0x7e,0x26,0x26,0x31,\r\n0x1e,0x7e,0x1d,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x11,0x39,0x18,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x2b,0x11,0x33,0x00,0x3f,0x33,0x33,0x3f,0x33,0x1a,0xed,0x32,0x12,0x39,0x39,0x5f,0x5e,0x5d,0x3f,0x33,0xed,0x10,0xed,0x10,0xdc,0x5f,0x5e,0x5d,0xed,0x31,0x30,0x01,0x5d,0x01,0x10,0x00,0x21,0x22,\r\n0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x37,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x66,0xfe,0xc1,0xfe,0xa4,0x47,0x7a,0x7a,0x30,0x68,0x56,0x56,0x70,0x38,0x72,0x71,0x50,0xf7,0xe5,0x0f,\r\n0x06,0x6d,0xca,0xd7,0x48,0x72,0xe4,0xfe,0xac,0xa8,0x67,0x7d,0x67,0x91,0xa8,0xe2,0x6c,0x8c,0xa8,0x01,0x29,0xfe,0x62,0xfe,0x93,0x0c,0x0b,0x17,0x96,0x19,0x0b,0x0c,0xe8,0xfc,0xb2,0xd4,0xd4,0x01,0xc4,0x03,0xee,0xfc,0x26,0xa5,0x9c,0xbf,0x86,0x03,0xd6,0xfc,0x12,0xfe,0xd3,0xb5,0x90,0x03,0xd6,0x00,0x00,0x01,0x00,0xa6,0xfe,0x1c,\r\n0x06,0x54,0x04,0x00,0x00,0x30,0x00,0x7d,0x40,0x49,0x0c,0x95,0x04,0x07,0x14,0x07,0x02,0x07,0x03,0x0a,0x95,0x09,0x10,0x95,0x09,0x42,0x03,0x1c,0x19,0x13,0x1b,0x2f,0x27,0x1f,0x0f,0x2b,0x23,0x95,0x40,0x16,0x1b,0x16,0x03,0x10,0x2d,0x10,0x01,0x02,0x0f,0x10,0x1f,0x10,0x02,0x09,0x03,0x10,0x40,0x0c,0x15,0x48,0x10,0x13,0x0a,0x0a,\r\n0x1e,0x30,0x84,0x13,0x2f,0x0e,0x28,0x1f,0x27,0x42,0x19,0x28,0x84,0x27,0x27,0x32,0x1f,0x84,0x1e,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x11,0x39,0x18,0x2f,0x12,0x39,0x2b,0x5f,0x5e,0x5d,0x5f,0x5d,0x11,0x33,0x00,0x3f,0x33,0x1a,0xed,0x32,0x3f,0x33,0x33,0x12,0x39,0x39,0x3f,0xe6,0xed,0x10,0xed,0x10,\r\n0xdc,0x5d,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x22,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x13,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x06,0x54,0xfe,0xc9,0xfe,0xa5,0x46,0x6f,0x6f,0x34,\r\n0x70,0x4a,0x56,0x6c,0x33,0x6c,0x6b,0x51,0xef,0xe8,0x0c,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0x01,0x5c,0xfe,0x3d,0xfe,0x85,0x0c,0x0b,0x19,0x8e,0x16,0x0b,0x0b,0xf5,0x01,0x03,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x02,0x77,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,\r\n0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0x00,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0x2f,0x05,0xb2,0x00,0x18,0x00,0x42,0x40,0x23,0x0b,0x09,0x1b,0x09,0x02,0x02,0x16,0x16,0x14,0x91,0x04,0x04,0x17,0x01,0x0d,0x0f,0x91,0x0a,0x04,0x17,0x03,0x01,0x0d,0x0d,0x16,0x11,0x00,0x7e,0x16,0x01,0x01,0x1a,0x11,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,\r\n0x33,0xe1,0x11,0x12,0x39,0x2f,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x31,0x30,0x01,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x00,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x14,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x2f,0xa8,0xbc,0xc3,0xd5,0xff,0x00,0xb4,0x98,0x40,0x3f,0x3d,0x3a,0xac,\r\n0xa9,0x94,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x06,0xd8,0xcf,0xfd,0x18,0x96,0x1a,0xfe,0xce,0x98,0xb4,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0x33,0xfe,0x29,0x03,0x85,0x04,0x18,0x00,0x18,0x00,0x42,0x40,0x26,0x0a,0x08,0x1a,0x08,0x02,0x0a,0x06,0x1a,0x06,0x02,0x01,0x1b,0x03,0x05,0x17,0x0c,0x0e,0x95,0x09,0x10,0x17,0x0f,0x13,0x95,\r\n0x05,0x16,0x0c,0x0c,0x10,0x18,0x84,0x01,0x17,0x17,0x1a,0x10,0x84,0x07,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x11,0x12,0x39,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x01,0x23,0x11,0x23,0x06,0x23,0x20,0x11,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,\r\n0x33,0x03,0x85,0xa3,0x05,0x71,0xd4,0xfe,0x9b,0x01,0x48,0x3a,0x35,0x34,0x35,0xaa,0x71,0x7c,0x7a,0xa4,0xa3,0xfe,0x29,0x02,0x73,0xb4,0x02,0x18,0x02,0x18,0x14,0x8d,0x17,0xfe,0x7a,0xd4,0xc2,0xbc,0x8e,0x02,0x44,0x00,0x00,0x01,0x00,0x00,0xfe,0x1e,0x04,0xb8,0x05,0x9a,0x00,0x22,0x00,0x5e,0x40,0x37,0x2b,0x10,0x3b,0x10,0x02,0x44,\r\n0x01,0x01,0x0b,0x91,0x00,0x06,0x10,0x06,0x02,0x06,0x02,0x09,0x91,0x08,0x0f,0x91,0x08,0x02,0x1c,0x1d,0x18,0x18,0x16,0x91,0x1f,0x1f,0x19,0x1c,0x03,0x19,0x02,0x0f,0x0f,0x40,0x09,0x12,0x48,0x0f,0x09,0x22,0x7e,0x13,0x13,0x24,0x1d,0x18,0x7e,0x1a,0x09,0x2f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2b,0x11,0x33,0x00,0x2f,\r\n0x3f,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x3f,0x33,0xed,0x10,0xed,0x10,0xdc,0x5d,0xed,0x31,0x30,0x01,0x5d,0x5d,0x25,0x10,0x21,0x22,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x12,0x15,0x04,0xb8,0xfd,0x71,0x45,0x77,0x77,\r\n0x38,0x68,0x56,0x56,0x70,0x36,0x73,0x72,0x50,0xf7,0xe8,0xaa,0x97,0xbf,0xac,0xa8,0xa8,0xb9,0xcd,0xd3,0xfb,0xec,0xfd,0x32,0x0c,0x0b,0x17,0x96,0x19,0x0b,0x0c,0x01,0x13,0x01,0x21,0xc8,0xb0,0xcf,0x71,0xfd,0x40,0x05,0x9a,0xfd,0xb6,0x78,0xfe,0xec,0xe5,0x00,0x00,0x02,0xff,0xec,0xff,0xe8,0x03,0xe8,0x04,0x18,0x00,0x26,0x00,0x2f,\r\n0x00,0xc5,0x40,0x59,0x1c,0x1d,0x16,0x1b,0x0d,0x0e,0x1a,0x0e,0x27,0x0c,0x28,0x18,0x17,0x1d,0x16,0x2f,0x19,0x2f,0x1c,0x17,0x1d,0x16,0x1d,0x27,0x0d,0x0c,0x28,0x0c,0x1d,0x21,0x15,0x0c,0x08,0x29,0x0e,0x0f,0x95,0x2e,0x2f,0x2e,0x25,0xec,0x04,0x00,0x04,0x10,0x04,0x02,0x2e,0x04,0x2e,0x04,0x08,0x28,0x29,0x95,0x16,0x19,0x1a,0x03,\r\n0x15,0x10,0x08,0xec,0x21,0x16,0x00,0x1d,0x16,0x1e,0x12,0x28,0x0c,0x0b,0x2c,0x0d,0x0e,0x1b,0x1c,0x04,0x1a,0x12,0x17,0x18,0x27,0x2f,0x04,0x2c,0x1a,0xb8,0x01,0x2e,0xb3,0x19,0x19,0x0b,0x2c,0xb8,0x01,0x2e,0x40,0x0b,0x12,0x12,0x01,0x1e,0x84,0x0b,0x0b,0x31,0x00,0x84,0x01,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,\r\n0x39,0x2f,0xe1,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0xed,0x3f,0x17,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x04,0xc0,0x08,0xc0,0x10,0x87,\r\n0xc0,0x04,0xc0,0x08,0xc0,0x31,0x30,0x33,0x23,0x36,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x37,0x33,0x06,0x07,0x16,0x15,0x14,0x02,0x23,0x22,0x27,0x26,0x23,0x22,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x8c,0xa0,0x13,0x85,0x68,0x65,0x6f,0x62,0x38,\r\n0x5e,0x8c,0x38,0xa6,0xbe,0x78,0xa2,0xb9,0x96,0xa6,0x8b,0x1d,0x15,0x9b,0x27,0x42,0x76,0xec,0xa6,0x82,0x70,0x56,0x22,0x48,0x02,0x14,0x62,0x7d,0x52,0x5e,0x87,0x8c,0x8f,0xa4,0x64,0x58,0xdc,0x9d,0x78,0x63,0xa8,0x83,0x68,0x71,0x99,0x6c,0x32,0x3a,0x6f,0x61,0x98,0xc0,0xd6,0xfe,0xce,0x6a,0x52,0x02,0x91,0x59,0x43,0x35,0x68,0x00,\r\n0x00,0x01,0x00,0x48,0xff,0xe8,0x04,0xae,0x05,0xb2,0x00,0x29,0x00,0x52,0x40,0x2e,0x03,0x28,0x13,0x28,0x02,0x0c,0x1c,0x06,0x23,0x04,0x03,0x29,0x29,0x19,0x26,0x13,0x13,0x03,0x0f,0x91,0x19,0x04,0x26,0x91,0x03,0x13,0x13,0x11,0x7e,0x16,0x1c,0x7d,0x0c,0x16,0x0c,0x16,0x0c,0x06,0x00,0x7e,0x29,0x29,0x2b,0x23,0x7d,0x06,0x2f,0xe1,\r\n0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x32,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x11,0x12,0x39,0x2f,0x11,0x17,0x39,0x31,0x30,0x5d,0x01,0x06,0x00,0x21,0x22,0x24,0x35,0x34,0x36,0x36,0x25,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x32,0x00,0x15,0x14,0x06,0x06,\r\n0x07,0x05,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x04,0xae,0x17,0xfe,0xb7,0xfe,0xf4,0xe9,0xfe,0xef,0x68,0xb4,0x01,0x4e,0xda,0xd0,0x78,0x9c,0x14,0xa4,0x16,0xa7,0x93,0xbf,0x01,0x41,0x3a,0x72,0x33,0xfe,0x73,0xd8,0xb4,0xa0,0xc0,0xf2,0x0c,0x02,0x0a,0xfe,0xfe,0xdc,0xfd,0xbb,0x78,0xaf,0x5c,0x4d,0x30,0x68,0x6a,0xa8,0x6c,0x25,\r\n0x2f,0x30,0x32,0x69,0x8d,0xff,0x00,0xaa,0x46,0x6c,0x4d,0x0c,0x61,0x46,0xb4,0x80,0xa3,0xd3,0xb8,0x00,0x00,0x01,0x00,0x3e,0xff,0xe8,0x03,0x90,0x04,0x18,0x00,0x27,0x00,0x6e,0x40,0x29,0x05,0x09,0x15,0x09,0x02,0x0b,0x09,0x24,0x1f,0x1e,0x03,0x20,0x27,0x30,0x27,0x02,0x27,0x27,0x19,0x24,0x13,0x40,0x09,0x0c,0x48,0x13,0x13,0x03,\r\n0x0f,0x95,0x19,0x10,0x24,0x95,0x03,0x16,0x1c,0x84,0x0c,0x13,0x11,0xb8,0x01,0x2e,0x40,0x0d,0x10,0x16,0x20,0x16,0x30,0x16,0x03,0x16,0x0c,0x16,0x0c,0x06,0x00,0xb8,0x01,0x2e,0xb5,0x27,0x27,0x29,0x21,0x84,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xe1,0x32,0x10,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,\r\n0x2f,0x2b,0x11,0x12,0x39,0x2f,0x5d,0x11,0x39,0x39,0x11,0x39,0x39,0x5d,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x04,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x90,0x0a,0xf6,0xd2,0xad,0xd3,0x4a,\r\n0x85,0xe1,0x97,0xa2,0x51,0x5d,0x21,0x98,0x1e,0x7c,0x6b,0x9d,0x01,0x05,0x6b,0xfe,0xa0,0x7c,0x7c,0x68,0x8c,0xa8,0x04,0x01,0xa0,0xd0,0xe8,0xb0,0x89,0x56,0x7e,0x47,0x34,0x23,0x44,0x41,0x78,0x46,0x29,0x31,0x31,0x37,0x53,0x6d,0xca,0x75,0x52,0x76,0x47,0x58,0x4b,0x50,0x65,0x9f,0x8f,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x04,0xb0,\r\n0x05,0xb2,0x00,0x1c,0x00,0x1f,0x00,0xce,0x40,0x7a,0x1d,0x1e,0x8d,0x1e,0xbd,0x1e,0x03,0x74,0x0f,0xe4,0x0f,0x02,0x1e,0x1b,0x1f,0x19,0x0f,0x02,0x10,0x1c,0x0e,0x1c,0x1e,0x1f,0x19,0x04,0x03,0x02,0x10,0x1d,0x05,0x1d,0x0f,0x03,0x02,0x10,0x02,0x1e,0x1b,0x1a,0x1f,0x19,0x1f,0x10,0x42,0x0e,0x72,0x0e,0x82,0x0e,0x02,0x16,0x0e,0x46,\r\n0x0e,0x56,0x0e,0x03,0x0e,0x1c,0x0c,0x19,0x42,0x05,0x76,0x05,0x01,0x05,0x04,0x1a,0x03,0x1b,0x1e,0x1d,0x07,0x1f,0x17,0x09,0x15,0x03,0x07,0x91,0x12,0x0c,0x04,0x1c,0x02,0x76,0x02,0x01,0x0f,0x02,0x1f,0x02,0x02,0x02,0x1f,0x91,0x01,0x10,0x19,0x19,0x1f,0x1f,0x02,0x15,0x0e,0x05,0x05,0x1d,0x1d,0x1c,0x09,0x15,0x09,0x15,0x09,0x02,\r\n0x1c,0x1c,0x21,0x02,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x12,0x39,0x11,0x33,0x11,0x12,0x39,0x12,0x39,0x11,0x33,0x00,0x2f,0xed,0x39,0x5d,0x5d,0x11,0x33,0x3f,0x33,0xed,0x17,0x32,0x11,0x17,0x39,0x5d,0x10,0xe4,0x11,0x12,0x39,0x5d,0x5d,0x10,0xe6,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0x0e,0xc0,\r\n0x10,0x87,0x08,0xc0,0x05,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x01,0x3d,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x21,0x21,0x35,0x01,0x27,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x07,0x01,0x27,0x01,0x01,0x04,0xb0,0xfb,0x64,0x01,0xf4,0x37,0x3b,0x46,0x2d,\r\n0x2c,0x2c,0x2b,0x37,0x5a,0x8a,0x51,0x52,0x8b,0x59,0x36,0x2c,0x2c,0x2c,0x2c,0x4a,0x3c,0x36,0x01,0xf6,0xee,0xfe,0x9e,0xfe,0x9e,0x31,0x03,0xc1,0x6a,0x72,0x4c,0x14,0x98,0x14,0x76,0x9c,0x9e,0x74,0x14,0x98,0x14,0x49,0x75,0x66,0xfc,0x3b,0x67,0x02,0xb4,0xfd,0x4c,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x03,0xcd,0x04,0x18,0x00,0x1a,\r\n0x00,0x1d,0x00,0x76,0x40,0x47,0x03,0x0e,0x33,0x0e,0x43,0x0e,0xd3,0x0e,0x04,0x0e,0x0b,0x19,0x03,0xcb,0x1c,0xdb,0x1c,0x02,0x8f,0x1c,0x01,0x14,0x1c,0x01,0x1c,0x03,0x1d,0x08,0x14,0x16,0x03,0x06,0x95,0x11,0x0b,0x10,0x1a,0x02,0x0b,0x02,0x2b,0x02,0x02,0x02,0x1d,0x95,0x01,0x19,0x03,0x1a,0x1d,0x14,0x02,0x1b,0x1a,0x08,0x0f,0x14,\r\n0x01,0x00,0x08,0x01,0x14,0x08,0x14,0x08,0x02,0x1a,0x1a,0x1f,0x02,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x12,0x39,0x11,0x12,0x39,0x12,0x39,0x39,0x00,0x2f,0xed,0x39,0x5d,0x11,0x33,0x3f,0x33,0xed,0x17,0x32,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x11,0x33,0x12,0x39,0x5d,0x31,0x30,0x21,0x21,0x35,0x01,0x27,0x26,\r\n0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x07,0x01,0x27,0x03,0x03,0x03,0xcd,0xfc,0x47,0x01,0x88,0x25,0x3b,0x40,0x21,0x21,0x20,0x2c,0x50,0x66,0x34,0x35,0x67,0x4f,0x2b,0x21,0x21,0x20,0x46,0x3c,0x22,0x01,0x8b,0xe3,0xfc,0xfc,0x23,0x02,0xba,0x44,0x6d,0x0f,0x8b,0x0e,0x48,\r\n0x5e,0x5f,0x47,0x0e,0x8b,0x0f,0x6d,0x3f,0xfd,0x41,0x69,0x01,0xc6,0xfe,0x3a,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0xee,0x06,0x04,0x00,0x1e,0x00,0x2a,0x00,0x74,0x40,0x34,0x33,0x18,0x43,0x18,0x53,0x18,0x03,0x0c,0x09,0x1c,0x09,0x2c,0x09,0x03,0x99,0x05,0x01,0x0b,0x13,0x1f,0x91,0x0d,0x0d,0x19,0x25,0x03,0x91,0x0f,0x1d,0x1f,\r\n0x1d,0x2f,0x1d,0x03,0x1d,0x19,0x01,0x91,0x00,0x07,0x91,0x00,0x42,0x19,0x01,0x25,0x91,0x13,0x13,0x1b,0x05,0x05,0xb8,0xff,0xc0,0x40,0x0e,0x0c,0x12,0x48,0x01,0x05,0x01,0x0a,0x10,0x7d,0x28,0x28,0x2c,0x0a,0x22,0xb9,0x01,0x2f,0x00,0x16,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2b,0x11,0x33,0x00,0x3f,0xed,0x3f,\r\n0xe6,0xed,0x10,0xed,0x10,0xdc,0x5d,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x15,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x06,0x03,0x33,0x36,0x21,0x32,0x00,0x15,0x14,0x00,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x04,\r\n0xc2,0x50,0x68,0x33,0x6a,0x6b,0x4a,0xc2,0xc7,0x15,0x09,0xa3,0x01,0x07,0xf6,0x01,0x2b,0xfe,0xb9,0xff,0xfe,0xe6,0xfe,0xd0,0x01,0x23,0x01,0x3d,0x44,0x6e,0x6d,0x35,0x60,0xfe,0x3e,0xb4,0xe2,0xd7,0xb9,0xb7,0xdd,0xd7,0x06,0x04,0x96,0x18,0x0a,0x0a,0xe7,0xfe,0xef,0xc8,0xfe,0xce,0xf0,0xf2,0xfe,0xc2,0x01,0x58,0x01,0x45,0x01,0xda,\r\n0x01,0xa3,0x0a,0x0a,0xfd,0xb4,0xd8,0xa5,0xbe,0xe8,0xe0,0xb1,0xb2,0xe0,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x06,0x06,0x00,0x1e,0x00,0x2c,0x00,0x75,0x40,0x2f,0x6b,0x1e,0x7b,0x1e,0x02,0x0c,0x09,0x1c,0x09,0x2c,0x09,0x8c,0x09,0x04,0x0b,0x1f,0x1f,0x2a,0x95,0x0d,0x0d,0x19,0x24,0x03,0x95,0x1d,0x40,0x09,0x0e,0x48,0x1d,0x19,\r\n0x01,0x95,0x00,0x42,0x07,0x95,0x19,0x01,0x24,0x95,0x13,0x16,0x1b,0x05,0x05,0xb8,0xff,0xc0,0x40,0x18,0x0f,0x24,0x48,0x0a,0x05,0x21,0x6f,0x01,0x7f,0x01,0x8f,0x01,0x03,0x01,0x01,0x16,0x10,0x83,0x27,0x27,0x2e,0x21,0x83,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x5d,0x12,0x39,0x39,0x2b,0x11,0x33,0x00,0x3f,0xed,0x3f,\r\n0xed,0xf6,0xed,0x10,0xdc,0x2b,0xed,0x11,0x12,0x39,0x2f,0xed,0x32,0x12,0x39,0x31,0x30,0x5d,0x5d,0x01,0x15,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x02,0x03,0x33,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x16,0x33,0x32,0x01,0x06,0x15,0x14,0x12,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,\r\n0x03,0xdb,0x38,0x4f,0x18,0x39,0x3a,0x2f,0xac,0xc6,0x1a,0x04,0x81,0xe1,0xdc,0x01,0x00,0xfe,0xe8,0xea,0xed,0xfe,0xff,0x01,0x21,0x01,0x21,0x20,0x45,0x45,0x1e,0x44,0xfd,0x5e,0x04,0xb1,0x9f,0xa0,0xb0,0xb3,0xa3,0x63,0xb3,0x06,0x06,0x8b,0x11,0x04,0x04,0xfe,0xfc,0xfe,0xfc,0xae,0xfe,0xe4,0xf8,0xf4,0xfe,0xd8,0x01,0x57,0x01,0x40,\r\n0x01,0xc1,0x01,0xc2,0x04,0x04,0xfc,0xcc,0x41,0x35,0xd8,0xfe,0xfa,0xcf,0xbd,0xc3,0xcd,0x71,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x7b,0x05,0x9a,0x00,0x13,0x00,0x36,0x40,0x17,0x09,0x01,0x04,0x91,0x12,0x0f,0x0f,0x03,0x10,0x03,0x03,0x12,0x01,0x7e,0x0f,0x04,0x04,0x0c,0x00,0x00,0x15,0x09,0x07,0xb9,0x01,0x2e,0x00,0x0c,0x2f,0xe1,\r\n0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0x33,0xe1,0x32,0x00,0x2f,0x3f,0x12,0x39,0x2f,0x33,0xfd,0x32,0xc6,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x21,0x33,0x11,0x33,0x11,0x21,0x04,0x7b,0xfe,0x33,0xa8,0xff,0x00,0x68,0x08,0x8e,0x0e,0x01,0x00,0xfc,0xa8,0x01,0xcd,0x04,0x00,0xfc,0x00,0x04,\r\n0x00,0x5a,0x28,0x1e,0x32,0x34,0xd2,0x01,0x02,0xfe,0xfe,0x00,0x00,0x01,0x00,0x00,0xfe,0x96,0x03,0x4e,0x05,0x2f,0x00,0x18,0x00,0x3a,0x40,0x1d,0x05,0xec,0x40,0x04,0x19,0x80,0x0e,0x09,0x16,0x01,0x09,0x95,0x17,0x14,0x0f,0x05,0x17,0x01,0x84,0x14,0x09,0x09,0x11,0x00,0x1a,0x0e,0x0c,0xed,0x11,0x2f,0xe1,0x32,0x10,0xc6,0x11,0x39,\r\n0x2f,0x33,0xe1,0x32,0xc6,0x00,0x3f,0x33,0xed,0x32,0xcd,0x10,0xc6,0x1a,0x10,0xde,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x10,0x05,0x35,0x36,0x36,0x35,0x11,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x33,0x33,0x35,0x37,0x11,0x21,0x03,0x4e,0xfe,0xc0,0xfe,0xa0,0x68,0x54,0x7a,0x60,0x06,0x8c,0x0a,0xf0,0x7a,0xa4,0x01,0x40,0x03,\r\n0x74,0xfc,0xd6,0xfe,0x90,0x44,0x9f,0x16,0x7e,0x7f,0x03,0x2c,0x53,0x21,0x1e,0x30,0x2e,0xc0,0xfa,0x35,0xfe,0xd1,0x00,0x01,0x00,0x00,0xff,0xe8,0x04,0x90,0x04,0x18,0x00,0x29,0x00,0x65,0x40,0x35,0x1d,0x0b,0x07,0x1f,0x1f,0x0b,0x0e,0x21,0x0f,0x15,0x13,0x95,0x18,0x10,0x29,0x27,0x95,0x40,0x02,0x16,0x0e,0x1f,0x07,0x21,0x05,0x1d,\r\n0x0b,0x1b,0x0d,0x21,0x83,0x22,0x22,0x29,0x24,0x84,0x05,0x0e,0x29,0x15,0x1b,0x42,0x0d,0x83,0x0e,0x0e,0x15,0x1b,0x84,0x10,0x10,0x2b,0x15,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x18,0x2f,0xf0,0xe1,0x11,0x39,0x2f,0xe1,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x2f,0x3f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x3f,\r\n0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x06,0x07,0x06,0x07,0x23,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x00,0x37,0x36,0x37,0x33,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x04,0x90,0x33,0x3f,0x88,0x9c,0x14,0x06,0xf1,0x94,0x56,0x14,0x27,\r\n0xac,0xb0,0x56,0x50,0x2a,0x26,0x32,0x3e,0x8a,0x9c,0x15,0x01,0x8d,0x54,0x14,0x28,0xac,0xb0,0x57,0x4f,0x2a,0x26,0x02,0x16,0xde,0xbf,0x69,0x6a,0x06,0xdb,0x87,0x62,0x35,0x59,0x01,0x72,0xf4,0x89,0x9f,0x15,0x89,0x16,0xde,0xbf,0x69,0x6a,0x01,0x65,0x65,0x35,0x59,0xfe,0x8e,0xf4,0x8c,0x9c,0x15,0x00,0x00,0x02,0x00,0xa2,0xfe,0x1e,\r\n0x04,0x50,0x04,0x18,0x00,0x19,0x00,0x25,0x00,0x39,0x40,0x20,0x05,0x03,0x15,0x03,0x02,0x22,0x95,0x12,0x10,0x00,0x1a,0x1a,0x1d,0x95,0x18,0x16,0x07,0x95,0x08,0x1c,0x07,0x07,0x0f,0x15,0x83,0x1f,0x1f,0x27,0x01,0x25,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x3f,0xed,\r\n0x31,0x30,0x5d,0x25,0x23,0x1e,0x02,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x24,0x02,0x11,0x11,0x34,0x12,0x33,0x32,0x00,0x15,0x10,0x02,0x23,0x22,0x03,0x16,0x16,0x33,0x20,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x48,0x04,0x09,0x76,0xd1,0xc7,0x78,0x43,0x40,0x7f,0xf2,0xfe,0xee,0xb1,0xf4,0xe1,0xd9,0x01,0x00,0xf8,0xdd,0xc1,0x76,\r\n0x26,0xa5,0x59,0x01,0x3e,0xa7,0x8f,0x90,0x9c,0x62,0x92,0xc0,0x56,0x04,0x02,0x08,0x8e,0x08,0x02,0x04,0x66,0x01,0x24,0x01,0x54,0x01,0x04,0xf4,0x01,0x16,0xfe,0xde,0xe6,0xfe,0xfc,0xfe,0xdc,0x01,0x1a,0x3d,0x53,0x01,0x96,0xb0,0xd6,0xcf,0xb3,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,\r\n0xff,0xff,0xff,0x3a,0xfe,0x1e,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4d,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x02,0xcf,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x5c,0x04,0x00,0x00,0x12,0x00,0x39,0x40,0x1e,0x0e,0x95,0x40,0x0d,0x08,0x00,0x0d,0x95,0x2b,0x30,0x09,0x95,0x08,0x0f,0x12,0x95,\r\n0x00,0x0c,0x08,0x0d,0x08,0x0d,0x08,0x0f,0x00,0x00,0x14,0x0f,0x83,0x04,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x00,0x2f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x33,0x15,0x23,0x20,0x03,0x21,0x15,0x21,0x12,0x21,0x33,0x03,0x5c,0xe3,0xf9,0xfe,0xe0,\r\n0x01,0x2d,0xff,0xc6,0xc9,0xfe,0xb6,0x33,0x02,0x1f,0xfd,0xdb,0x1b,0x01,0x68,0xd3,0x01,0x09,0xe3,0xf3,0x01,0x21,0x8c,0xfe,0xe0,0x8c,0xfe,0xc4,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x5c,0x04,0x00,0x00,0x12,0x00,0x37,0x40,0x1d,0x05,0x95,0x40,0x06,0x0b,0x00,0x06,0x95,0x2b,0x30,0x0a,0x95,0x0b,0x0f,0x01,0x95,0x00,0x0f,0x83,0x04,\r\n0x0a,0x05,0x0a,0x05,0x07,0x04,0x04,0x14,0x00,0x2f,0x11,0x39,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x00,0x2f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x33,0x35,0x33,0x20,0x13,0x21,0x35,0x21,0x02,0x21,0x23,0x35,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x60,0xd3,0x01,0x5d,0x24,0xfd,0xde,0x02,0x22,0x2a,0xfe,0xa9,\r\n0xc9,0xda,0xf8,0x01,0x20,0xfe,0xd4,0xff,0x8c,0x01,0x3c,0x8c,0x01,0x20,0x8c,0xfe,0xf7,0xe3,0xf4,0xfe,0xe0,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x06,0xca,0x05,0x9a,0x00,0x33,0x00,0x2b,0x40,0x15,0x32,0x10,0x15,0x25,0x7e,0x24,0x16,0x7e,0x15,0x15,0x07,0x24,0x24,0x35,0x08,0x7e,0x07,0x07,0x03,0x00,0x12,0x00,0x3f,0x3f,0x01,0x2f,\r\n0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x21,0x2e,0x05,0x27,0x33,0x1e,0x05,0x17,0x13,0x2e,0x03,0x27,0x33,0x1e,0x05,0x17,0x3e,0x05,0x37,0x33,0x0e,0x05,0x07,0x23,0x2e,0x03,0x27,0x03,0x01,0xe2,0x4d,0x75,0x5a,0x40,0x32,0x25,0x11,0xa8,0x10,0x26,0x2e,0x38,0x46,0x57,0x35,0xe0,0x15,0x21,0x1c,\r\n0x18,0x0c,0xa8,0x10,0x26,0x2e,0x38,0x46,0x57,0x35,0x35,0x57,0x46,0x38,0x2e,0x25,0x11,0xa8,0x11,0x25,0x32,0x40,0x5a,0x75,0x4d,0xa4,0x2b,0x4a,0x40,0x37,0x17,0xd5,0x95,0xf8,0xdd,0xd0,0xdc,0xf3,0x91,0x8a,0xe5,0xc7,0xb5,0xb5,0xbd,0x6d,0x02,0x3c,0x48,0x94,0x9f,0xb0,0x63,0x8a,0xe5,0xc7,0xb5,0xb5,0xbd,0x6d,0x6d,0xbd,0xb5,0xb5,\r\n0xc7,0xe5,0x8a,0x92,0xf2,0xdc,0xd0,0xde,0xf7,0x95,0x53,0x95,0x89,0x7f,0x3c,0xfd,0xd4,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x05,0x5e,0x04,0x00,0x00,0x14,0x00,0x4c,0x40,0x25,0x0d,0x03,0x02,0x0f,0x14,0x08,0x03,0x0d,0x02,0x0f,0x0f,0x02,0x0c,0x13,0x03,0x04,0x02,0x01,0x13,0x05,0x04,0x0c,0x13,0x0c,0x00,0x08,0x10,0x0f,0x0f,0x14,\r\n0x08,0x14,0x00,0x00,0x16,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x00,0x2f,0x17,0x33,0x3f,0x12,0x39,0x39,0x33,0x33,0x87,0x05,0xc0,0xc0,0x31,0x30,0x01,0x01,0x23,0x03,0x03,0x23,0x02,0x02,0x27,0x33,0x16,0x12,0x13,0x13,0x26,0x27,0x33,0x16,0x12,0x17,\r\n0x01,0x05,0x5e,0xfe,0xaa,0xa6,0xb8,0xb6,0x94,0xb5,0x72,0x1b,0xa8,0x1a,0x58,0x7c,0xaa,0x47,0x1b,0xac,0x20,0x77,0x75,0x01,0x08,0x04,0x00,0xfc,0x00,0x01,0xaa,0xfe,0x56,0x01,0x9b,0x01,0x76,0xef,0xcf,0xfe,0xce,0xfe,0xce,0x01,0x87,0xcb,0xe1,0xe2,0xfe,0xad,0xfe,0x03,0x33,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0xc6,0x05,0x9a,\r\n0x00,0x12,0x00,0x1a,0x00,0x45,0x40,0x23,0x0a,0x01,0x91,0x07,0x04,0x04,0x05,0x13,0x91,0x0b,0x0b,0x05,0x03,0x14,0x91,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x7d,0x18,0x18,0x1c,0x0b,0x07,0x14,0x7e,0x04,0x00,0x00,0x1c,0x1b,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,\r\n0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x4c,0xfe,0xdd,0x01,0x23,0xa8,0x01,0x5a,0xfe,0xa6,0x01,0x10,0xd4,0xee,0xf8,0xd8,0xfe,0xfe,0xeb,0x96,0xa1,0xfe,0xc9,0x04,0x74,\r\n0x9a,0x8c,0x8c,0x9a,0xfe,0xc6,0xcd,0xc1,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8d,0x7d,0x01,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0x4e,0x05,0xec,0x00,0x12,0x00,0x19,0x00,0x47,0x40,0x24,0x0a,0x01,0x96,0x07,0x04,0x04,0x06,0x0b,0x95,0x13,0x13,0x00,0x06,0x00,0x14,0x95,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x83,0x17,0x17,0x1b,0x0b,\r\n0x07,0x14,0x84,0x04,0x00,0x00,0x1b,0x1a,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x11,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,\r\n0x35,0x34,0x23,0x01,0x40,0xfe,0xe9,0x01,0x17,0xa4,0x01,0x38,0xfe,0xc8,0x01,0x12,0x9d,0xbb,0xbb,0x8d,0xfe,0xde,0xf5,0xcd,0xcf,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0xc5,0xa3,0x94,0x93,0xad,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x00,0x01,0x00,0xbc,0xff,0xe8,0x06,0xd9,0x05,0xb2,0x00,0x1f,0x00,0x5e,0x40,0x34,0x1a,0x17,0x06,0x91,\r\n0x40,0x0b,0x0a,0x08,0x0b,0x91,0x2b,0x30,0x30,0x12,0x01,0x12,0x12,0x14,0x91,0x0f,0x04,0x0a,0x03,0x20,0x1f,0x01,0x1f,0x1f,0x1d,0x91,0x02,0x13,0x08,0x19,0x19,0x17,0x12,0x1a,0x7d,0x0c,0x12,0x05,0x05,0x08,0x12,0x00,0x00,0x21,0x0b,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0xe1,0x11,0x39,0x39,\r\n0x2f,0x00,0x2f,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0x3f,0xed,0x32,0x2f,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x03,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x15,0x21,0x16,0x00,0x33,0x32,0x37,0x06,0xd9,0x9f,0xea,0xfe,0xde,0xfe,0x95,\r\n0x0f,0xfe,0xb0,0xa8,0xa8,0x01,0x52,0x1d,0x01,0x7e,0x01,0x1b,0xd6,0x97,0xa3,0xcc,0xd7,0xfe,0xeb,0x18,0x02,0x79,0xfd,0x85,0x10,0x01,0x11,0xd7,0xe0,0x9d,0x3c,0x54,0x01,0x69,0x01,0x2e,0xfd,0x81,0x05,0x9a,0xfd,0x7c,0x01,0x34,0x01,0x68,0x3b,0xb3,0x56,0xfe,0xed,0xf1,0x97,0xef,0xfe,0xed,0x60,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,\r\n0x05,0x66,0x04,0x18,0x00,0x1f,0x00,0x68,0x40,0x3a,0x17,0x1a,0x06,0x95,0x40,0x0b,0x0a,0x08,0x0b,0x95,0x2b,0x30,0x0a,0x0f,0x40,0x12,0x50,0x12,0x02,0x12,0x12,0x14,0x95,0x0f,0x10,0x30,0x1f,0x01,0x1f,0x1f,0x1d,0x95,0x02,0x16,0x08,0x17,0x12,0x1a,0x83,0x05,0x0c,0x12,0x05,0x18,0x12,0x18,0x12,0x00,0x05,0x05,0x08,0x00,0x00,0x21,\r\n0x0b,0x06,0x84,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xe1,0x11,0x39,0x00,0x2f,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x32,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x27,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x36,0x24,0x33,\r\n0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x05,0x66,0x72,0xa0,0xd6,0xfe,0xf9,0x0f,0xfe,0xe2,0xa4,0xa4,0x01,0x20,0x18,0x01,0x0e,0xdc,0x89,0x67,0x64,0x92,0x93,0xb6,0x0d,0x01,0xb4,0xfe,0x4a,0x08,0xb2,0x94,0x92,0x78,0x2d,0x45,0xfb,0xdb,0xfe,0x42,0x04,0x00,0xfe,0x4a,0xdb,0xf3,0x32,0xa2,\r\n0x4a,0xb0,0x94,0x8c,0x97,0xb5,0x5b,0x00,0x00,0x02,0x00,0x16,0x00,0x00,0x05,0x3c,0x05,0x9a,0x00,0x0b,0x00,0x14,0x00,0x66,0x40,0x37,0x0d,0x0c,0x02,0x0a,0x01,0x0a,0x0d,0x01,0x0a,0x13,0x12,0x07,0x08,0x0b,0x08,0x12,0x0b,0x08,0x02,0x03,0x06,0x07,0x0c,0x10,0x13,0x14,0x08,0x0b,0x0a,0x03,0x05,0x01,0x08,0x0a,0x0b,0x0f,0x10,0x14,\r\n0x05,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0x7e,0x05,0x05,0x16,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x00,0x18,0x2f,0x33,0x33,0x3f,0x33,0x17,0x39,0x11,0x12,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,\r\n0x03,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x17,0x05,0x3c,0xbb,0xfc,0x8f,0xa8,0x83,0xff,0x00,0xb5,0x02,0x3e,0xb6,0x3e,0x7d,0x12,0x0b,0x04,0x0a,0x17,0x7d,0x9c,0x02,0x8e,0xb7,0xfe,0x29,0x01,0xd3,0xb6,0xfd,0x77,0x05,0x9a,0xfd,0x91,0x01,0x45,0x2f,0x51,0x47,0x3b,0xfe,0xc3,0xd7,\r\n0x00,0x02,0x00,0x0c,0x00,0x00,0x03,0xf2,0x04,0x00,0x00,0x0b,0x00,0x14,0x00,0x68,0x40,0x37,0x0d,0x0c,0x02,0x0a,0x01,0x0a,0x0d,0x01,0x0a,0x13,0x12,0x07,0x08,0x0b,0x08,0x12,0x0b,0x02,0x03,0x06,0x07,0x0c,0x13,0x06,0x14,0x14,0x08,0x0b,0x0a,0x0f,0x05,0x01,0x08,0x0a,0x0b,0x0f,0x10,0x14,0x05,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,\r\n0x09,0x05,0x42,0x04,0x8b,0x05,0x05,0x16,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x00,0x18,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x2f,0x17,0x33,0x11,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,\r\n0x03,0x23,0x01,0x33,0x13,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x17,0x03,0xf2,0xb0,0x98,0x60,0x96,0x64,0x9c,0xa8,0x01,0xac,0xa2,0x18,0x4d,0x1b,0x08,0x04,0x0b,0x16,0x51,0x7a,0x01,0x8c,0x76,0xfe,0xea,0x01,0x16,0x78,0xfe,0x72,0x04,0x00,0xfe,0x1a,0xd2,0x4a,0x45,0x55,0x36,0xcd,0x8d,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x06,0xe6,\r\n0x05,0x9a,0x00,0x13,0x00,0x1c,0x00,0xa1,0x40,0x59,0x15,0x14,0x02,0x12,0x01,0x12,0x15,0x01,0x12,0x1b,0x1a,0x07,0x08,0x13,0x08,0x1a,0x13,0x08,0x11,0x0a,0x09,0x12,0x09,0x02,0x03,0x06,0x07,0x14,0x1b,0x1c,0x07,0x0c,0x12,0x0a,0x91,0x40,0x11,0x0f,0x0c,0x11,0x91,0x2b,0x30,0x12,0x13,0x17,0x18,0x04,0x0f,0x03,0x01,0x05,0x08,0x09,\r\n0x04,0x0c,0x13,0x17,0x12,0x18,0x17,0x18,0x1c,0x03,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0x7e,0x05,0x05,0x1e,0x0f,0x09,0x01,0x09,0x09,0x1e,0x10,0x0c,0x7e,0x0d,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x5d,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x00,0x18,0x2f,0x17,\r\n0x33,0x3f,0x17,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,0x01,0x23,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x13,0x03,0x26,\r\n0x27,0x23,0x06,0x07,0x03,0x17,0x06,0xe6,0xbb,0xfc,0x8f,0xa8,0x84,0xff,0x00,0xb4,0x01,0x0d,0xfe,0x97,0xa8,0xa8,0x01,0xa4,0xf6,0xb6,0x3e,0x7e,0x10,0x0c,0x04,0x0a,0x17,0x7d,0x9c,0x02,0x8e,0xb7,0xfe,0x29,0x01,0xd3,0xb6,0xfd,0x77,0x02,0x9e,0xfd,0x62,0x05,0x9a,0xfd,0x9b,0x02,0x65,0xfd,0x91,0x01,0x45,0x2a,0x56,0x47,0x3b,0xfe,\r\n0xc3,0xd7,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0x7b,0x04,0x00,0x00,0x13,0x00,0x1c,0x00,0xb0,0x40,0x50,0x11,0x0a,0x09,0x12,0x15,0x14,0x02,0x12,0x01,0x12,0x15,0x01,0x12,0x1b,0x1a,0x07,0x08,0x13,0x08,0x1a,0x13,0x08,0x02,0x03,0x06,0x07,0x14,0x1b,0x06,0x00,0x1c,0x01,0x13,0x03,0x1c,0x1c,0x0c,0x0f,0x0a,0x96,0x40,0x11,0x0f,0x0c,\r\n0x11,0x96,0x2b,0x30,0x12,0x13,0x17,0x18,0x04,0x0f,0x0f,0x01,0x05,0x08,0x09,0x04,0x0c,0x13,0x17,0x12,0x18,0x17,0x18,0x1c,0x03,0x05,0x01,0x00,0x0e,0x04,0x08,0x09,0x09,0x05,0x42,0x04,0xb8,0x01,0x2e,0x40,0x11,0x05,0x05,0x1e,0x2f,0x09,0x3f,0x09,0x4f,0x09,0x03,0x09,0x09,0x1e,0x10,0x0c,0x84,0x0d,0x2f,0xe1,0x32,0x11,0x39,0x2f,\r\n0x5d,0x12,0x39,0x2f,0xe1,0x2b,0x11,0x01,0x33,0x10,0xe0,0x32,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x00,0x18,0x2f,0x17,0x33,0x3f,0x17,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x39,0x2f,0x5f,0x5e,0x5d,0x17,0x33,0x11,0x12,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0x87,0xc0,0xc0,\r\n0x31,0x30,0x21,0x23,0x03,0x07,0x11,0x23,0x11,0x27,0x03,0x23,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x13,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x17,0x05,0x7b,0xb0,0x98,0x60,0x95,0x65,0x9b,0xa8,0xc2,0xfe,0xf2,0xa4,0xa4,0x01,0x46,0xb2,0xa2,0x18,0x4e,0x1b,0x07,0x05,0x0b,0x16,0x52,0x7c,0x01,0x8c,0x76,0xfe,0xea,0x01,\r\n0x16,0x78,0xfe,0x72,0x01,0xd5,0xfe,0x2b,0x04,0x00,0xfe,0x58,0x01,0xa8,0xfe,0x1a,0xd2,0x49,0x46,0x55,0x36,0xcd,0x8d,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x05,0xaa,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0xb3,0x40,0x30,0x10,0x03,0x0f,0x03,0x1a,0x19,0x06,0x13,0x06,0x1a,0x19,0x13,0x06,0x16,0x15,0x14,0x03,0x14,0x16,0x15,0x03,0x14,\r\n0x0d,0x0e,0x06,0x0d,0x18,0x10,0x03,0x17,0x17,0x0e,0x03,0x06,0x06,0x09,0x13,0x14,0x91,0x40,0x0f,0x0e,0x03,0x05,0x01,0x09,0x13,0x0f,0xb8,0xff,0xd8,0x40,0x14,0x0b,0x01,0x4d,0x0f,0x0f,0x00,0x03,0x14,0x00,0x0e,0x10,0x0e,0x02,0x09,0x03,0x0e,0x0e,0x06,0x0a,0x00,0xb8,0x01,0x2f,0xb6,0x01,0x0e,0x03,0x09,0x06,0x42,0x09,0xb8,0x01,\r\n0x2f,0x40,0x0b,0x0a,0x0a,0x1b,0x18,0x17,0x03,0x7e,0x06,0x06,0x1c,0x1b,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x2b,0x33,0x00,0x2f,0x33,0x33,0x3f,0x33,0x1a,0xed,0x32,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x17,0x33,0x87,\r\n0x05,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x06,0x02,0x03,0x23,0x12,0x12,0x37,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x01,0x16,0x17,0x33,0x36,0x37,0x05,0xaa,0xc0,0x32,0xfe,0x8a,0xa8,0xcb,0xcb,0x1a,\r\n0xc1,0x33,0xfd,0xe9,0xfe,0x62,0x04,0xa0,0xfe,0x52,0xea,0xf7,0xfe,0xb0,0xfd,0x9f,0x01,0x07,0x0d,0x16,0x02,0x10,0x16,0x02,0x0a,0x66,0xfd,0x90,0x02,0x72,0x39,0xfe,0xd3,0xfe,0xf4,0x01,0x50,0x01,0x67,0x45,0x02,0x9e,0xfd,0x60,0x48,0xfe,0x9a,0x03,0xb6,0xfe,0x52,0x22,0x36,0x35,0x23,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x04,0x66,\r\n0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x87,0x40,0x26,0x0f,0x0e,0x03,0x0e,0x0c,0x0d,0x06,0x0d,0x0f,0x42,0x0c,0x0c,0x08,0x16,0x16,0x0d,0x03,0x42,0x06,0x06,0x08,0x13,0x95,0x40,0x0e,0x0d,0x0f,0x05,0x01,0x08,0x12,0x13,0x0d,0x0e,0x0e,0x00,0x03,0x0d,0xb8,0xff,0xc0,0x40,0x16,0x0b,0x0f,0x48,0x0d,0x0d,0x06,0x09,0x00,0x83,0x01,0x0e,\r\n0x03,0x08,0x06,0x42,0x08,0x83,0x09,0x09,0x19,0x16,0x03,0xb8,0x01,0x2e,0xb6,0x10,0x06,0x01,0x06,0x06,0x1a,0x19,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x2b,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x2f,0x33,0x33,0x3f,0x32,0x1a,0xed,0x12,0x39,0x2f,0xe5,0x12,\r\n0x39,0x11,0x12,0x39,0x10,0xe5,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x04,0x03,0x23,0x36,0x12,0x37,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x13,0x16,0x17,0x36,0x37,0x04,0x66,0xae,0x21,0xfe,0xfd,0x9c,0xfe,0xf8,0x23,0xaf,0x29,0xb9,0xae,0xfe,0xc2,0x03,0xb5,0xfe,0xb8,0xab,0xb7,0xfe,0xd7,\r\n0xfe,0x6f,0xb5,0x04,0x0a,0x04,0x0c,0x01,0x64,0x4e,0xfe,0x4e,0x01,0xb4,0x4b,0xfe,0x97,0xf6,0x01,0x01,0x34,0x01,0xd5,0xfe,0x29,0x36,0xff,0x00,0x02,0x86,0xfe,0xdd,0x06,0x18,0x0a,0x14,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x48,0x05,0x9a,0x00,0x18,0x00,0x1f,0x00,0xa9,0x40,0x3f,0x0c,0x0a,0x13,0x0a,0x16,0x03,0x15,0x03,0x13,0x14,\r\n0x06,0x14,0x16,0x42,0x1c,0x1c,0x13,0x03,0x42,0x06,0x06,0x05,0x0c,0x91,0x40,0x13,0x11,0x0e,0x13,0x91,0x2b,0x30,0x1a,0x91,0x14,0x40,0x15,0x14,0x11,0x03,0x01,0x05,0x0a,0x03,0x0e,0x19,0x15,0x15,0x00,0x03,0x1a,0x00,0x14,0x10,0x14,0x02,0x0b,0x03,0x14,0x14,0x06,0x0a,0x00,0xb8,0x01,0x2f,0xb6,0x01,0x0e,0x03,0x09,0x06,0x42,0x09,\r\n0xb8,0x01,0x2f,0x40,0x13,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0a,0x0e,0x1d,0x1c,0x03,0x7e,0x06,0x06,0x21,0x12,0x0e,0x7e,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0x5d,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x17,0x33,0x3f,0x33,0x33,\r\n0x1a,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0xe5,0x12,0x39,0x10,0xe5,0x10,0x87,0x05,0xc0,0x10,0x87,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x06,0x02,0x03,0x23,0x12,0x25,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x21,0x01,0x16,0x12,0x01,0x21,0x01,0x17,0x33,0x36,0x37,0x07,0x48,0xc1,\r\n0x2f,0xfe,0x87,0xa7,0xcb,0xcb,0x1b,0xc1,0x54,0x01,0x34,0xfe,0x16,0xa8,0xa8,0x02,0x54,0xfe,0x8a,0x04,0xa0,0xfe,0x51,0xea,0xf8,0xfe,0xaf,0xfd,0xa0,0x01,0x06,0x24,0x02,0x10,0x16,0x02,0x09,0x67,0xfd,0x90,0x02,0x72,0x39,0xfe,0xd3,0xfe,0xf4,0x02,0x0e,0x92,0xfd,0x60,0x05,0x9a,0xfd,0xa2,0x02,0x5e,0xfd,0x60,0x48,0xfe,0x9c,0x03,\r\n0xb4,0xfe,0x52,0x58,0x35,0x23,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0xdf,0x04,0x00,0x00,0x17,0x00,0x1d,0x00,0xb8,0x40,0x4c,0x0b,0x09,0x12,0x09,0x15,0x03,0x14,0x03,0x12,0x13,0x06,0x15,0x05,0x1c,0x1c,0x13,0x03,0x42,0x06,0x06,0x05,0x0b,0x96,0x40,0x12,0x10,0x0d,0x12,0x96,0x2b,0x30,0x19,0x95,0x13,0x40,0x14,0x13,0x10,0x0f,0x01,\r\n0x05,0x09,0x03,0x0d,0x18,0x14,0x14,0x00,0x03,0x19,0x00,0x13,0x10,0x13,0x20,0x13,0x60,0x13,0x04,0x0d,0x03,0x13,0x13,0x06,0x09,0x00,0x83,0x01,0x0e,0x03,0x08,0x06,0x42,0x08,0x83,0x09,0xb8,0xff,0xc8,0x40,0x0e,0x0b,0x0c,0x01,0x4c,0x09,0x40,0x09,0x0c,0x48,0x09,0x09,0x0d,0x1c,0x03,0xb8,0x01,0x2e,0x40,0x0c,0x0f,0x06,0x1f,0x06,\r\n0x02,0x06,0x06,0x1f,0x11,0x0d,0x84,0x0e,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x11,0x12,0x39,0x18,0x2f,0x5f,0x5e,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x17,0x33,0x3f,0x33,0x33,0x1a,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0xe5,0x12,0x39,\r\n0x11,0x12,0x39,0x87,0x05,0xc0,0x10,0x87,0xc0,0x10,0x87,0xc0,0x31,0x30,0x21,0x23,0x02,0x25,0x11,0x23,0x11,0x04,0x03,0x23,0x12,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x01,0x21,0x01,0x16,0x16,0x01,0x21,0x13,0x16,0x17,0x37,0x05,0xdf,0xae,0x23,0xfe,0xfe,0x9c,0xfe,0xf7,0x21,0xae,0x3e,0xe2,0xfe,0x92,0xa4,0xa4,0x01,0xbc,0xfe,\r\n0xe4,0x03,0xb4,0xfe,0xb8,0xab,0xb6,0xfe,0xd9,0xfe,0x6e,0xb4,0x07,0x07,0x11,0x01,0x66,0x4c,0xfe,0x4e,0x01,0xb4,0x4d,0xfe,0x99,0x01,0x72,0x67,0xfe,0x27,0x04,0x00,0xfe,0x58,0x01,0xa8,0xfe,0x29,0x36,0xff,0x02,0x85,0xfe,0xdd,0x0b,0x13,0x1e,0x00,0x00,0x01,0x00,0x31,0xfe,0x66,0x03,0xe2,0x06,0xcb,0x00,0x43,0x00,0x75,0x40,0x41,\r\n0x32,0x7d,0x13,0x00,0x7d,0x01,0x2e,0x17,0x2c,0x7d,0x1b,0x13,0x01,0x1b,0x17,0x20,0x20,0x17,0x1b,0x01,0x13,0x05,0x45,0x3b,0x7e,0x09,0x03,0x9a,0x42,0x42,0x35,0x3e,0x0c,0x9a,0x39,0x39,0x35,0x2f,0x2e,0x16,0x9a,0x17,0x17,0x29,0x10,0x9a,0x35,0x27,0x26,0x0f,0x24,0x1f,0x24,0x02,0x24,0x20,0x1e,0x99,0x23,0x29,0x03,0x3e,0x9a,0x01,\r\n0x07,0x00,0x2f,0x33,0xed,0x3f,0x33,0xed,0x32,0xc4,0x5d,0x39,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x23,0x34,0x23,0x22,0x07,0x06,0x23,0x20,0x11,0x34,0x36,0x33,\r\n0x32,0x17,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x37,0x03,0x33,0x17,0x37,0x33,0x03,0x36,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0xd3,0xb7,0x4d,0x2c,0x6f,0x70,0x45,0xfe,\r\n0xb2,0xa6,0xa0,0x17,0x4b,0x4b,0x18,0x72,0x81,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x82,0xa2,0xb9,0x73,0xa4,0xa4,0x77,0xbd,0x58,0xea,0xfe,0xf0,0x94,0xae,0xdb,0xbd,0x18,0x58,0x58,0x18,0x93,0x56,0x4c,0x2b,0x7b,0x7b,0x4a,0xef,0xfe,0x66,0x4c,0x26,0x26,0x01,0x23,0x80,0x91,0x06,0x06,0x89,0x75,0x01,0x14,0x8b,0x8a,\r\n0x7e,0x6c,0x82,0x71,0xaa,0x48,0x0d,0x01,0x1c,0xe5,0xe5,0xfe,0xdd,0x0a,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xb4,0xe2,0x06,0x06,0x89,0x3f,0x50,0x25,0x25,0x00,0x01,0x00,0x21,0xfe,0x66,0x03,0x3c,0x05,0x35,0x00,0x42,0x00,0x79,0xb3,0x31,0x84,0x13,0x00,0xb8,0x01,0x2e,0x40,0x13,0x01,0x2d,0x17,0x2a,0x84,0x1a,0x13,0x01,\r\n0x1a,0x17,0x1f,0x1f,0x17,0x1a,0x01,0x13,0x05,0x44,0x3a,0xb8,0x01,0x2e,0x40,0x27,0x0a,0x03,0x96,0x41,0x41,0x34,0x3d,0x2e,0x2d,0x16,0x95,0x17,0x17,0x28,0x0d,0x96,0x38,0x38,0x28,0x11,0x96,0x34,0x15,0x1f,0x1d,0x95,0x0f,0x23,0x1f,0x23,0x02,0x23,0x22,0x28,0x0f,0x3d,0x95,0x01,0x07,0x00,0x2f,0x33,0xed,0x3f,0x33,0xc4,0x5d,0xed,\r\n0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x23,0x34,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x34,0x21,0x23,0x35,0x33,\r\n0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x37,0x03,0x33,0x17,0x37,0x33,0x03,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0x1e,0x95,0x3d,0x2e,0x55,0x55,0x38,0x82,0x99,0x9b,0x82,0x13,0x3b,0x3a,0x13,0xbf,0xfe,0xd6,0x64,0x60,0x01,\r\n0x04,0x77,0x67,0x96,0x96,0x81,0x71,0xb6,0x73,0xa4,0xa4,0x77,0xb9,0xf9,0x71,0x61,0x70,0x8c,0xb0,0xa4,0x14,0x45,0x45,0x12,0x86,0x4b,0x41,0x2c,0x55,0x55,0x44,0xc6,0xfe,0x66,0x50,0x28,0x28,0x99,0x82,0x71,0x9a,0x07,0x08,0xa1,0xaa,0x8a,0xa4,0x45,0x53,0x4c,0x99,0x2e,0x0b,0x01,0x17,0xe5,0xef,0xfe,0xd9,0x29,0xdf,0x5b,0x80,0x15,\r\n0x04,0x09,0x87,0x6a,0x89,0x97,0x07,0x07,0x85,0x42,0x51,0x25,0x25,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x05,0xc0,0x05,0x9a,0x00,0x19,0x00,0x3d,0x40,0x1e,0x14,0x11,0x91,0x04,0x07,0x07,0x06,0x18,0x12,0x0c,0x03,0x06,0x00,0x7e,0x17,0x17,0x1b,0x06,0x0c,0x0b,0x0b,0x1a,0x14,0x05,0x7e,0x11,0x06,0x06,0x1b,0x1a,0x11,0x12,0x39,0x2f,\r\n0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x14,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x20,0x03,0x03,0x33,0x13,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x20,0x11,0x11,0x33,0x05,0xc0,0xfe,0xe1,0xf1,0x39,0x9c,0x54,0xfe,0xd9,0x54,0xa6,0xa4,\r\n0xa0,0x1d,0x6b,0x6e,0x3b,0x9c,0x39,0x01,0x68,0xa8,0x03,0x87,0xdf,0xfe,0xdd,0xfe,0x7b,0x01,0x85,0x01,0x5f,0x02,0xb6,0xfd,0x5e,0x79,0x65,0x03,0x80,0xfc,0x80,0x01,0x6d,0x02,0x13,0x00,0x00,0x01,0x00,0x66,0xfe,0x1e,0x05,0x7b,0x05,0x33,0x00,0x1b,0x00,0x40,0x40,0x19,0x06,0x1c,0x13,0x13,0x1a,0x0d,0x0f,0x15,0x12,0x95,0x04,0x07,\r\n0x16,0x00,0x84,0x19,0x19,0x1d,0x06,0x0d,0x0c,0x0c,0x1c,0x14,0x05,0xb8,0x01,0x2e,0xb4,0x13,0x06,0x06,0x1d,0x1c,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x33,0x2f,0x3f,0x31,0x30,0x01,0x10,0x00,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x26,0x27,0x03,0x33,\r\n0x13,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x05,0x7b,0xfe,0xe4,0xe8,0x19,0x93,0x15,0xac,0xd4,0x3c,0x94,0xa6,0x94,0x2a,0x81,0x6f,0x11,0x93,0x19,0x96,0xca,0xa4,0x02,0x2d,0xfe,0xf4,0xfe,0xc9,0xfe,0x34,0x01,0xcc,0xca,0xf6,0x02,0x56,0xfd,0xaa,0xa9,0x88,0x04,0xba,0xfb,0x46,0xef,0xc3,0x01,0xd5,0x00,\r\n0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x19,0x00,0x27,0x00,0x48,0x40,0x25,0x12,0x18,0x91,0x40,0x22,0x1c,0x0e,0x25,0x0f,0x14,0x42,0x0c,0x1a,0x14,0x91,0x20,0x20,0x00,0x0f,0x91,0x06,0x04,0x25,0x91,0x00,0x13,0x22,0x1a,0x12,0x09,0x7d,0x0c,0x0c,0x29,0x12,0x7d,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,\r\n0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x7c,0x2f,0x18,0xed,0x33,0x32,0x2b,0x00,0x18,0x10,0xf6,0x32,0x1a,0xed,0x32,0x31,0x30,0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x13,0x26,0x24,0x23,0x22,0x00,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x17,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x05,0x16,0x00,0x33,\r\n0x32,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xbe,0x1a,0xfe,0xff,0xcf,0xd6,0xfe,0xea,0x0e,0xfc,0x46,0x3c,0x88,0x88,0x24,0x3d,0xfb,0xf0,0x52,0x3a,0x84,0x84,0x2e,0x2a,0xfe,0xf6,0x1a,0x01,0x09,0xc7,0xe4,0x01,0x0e,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,0xfe,0xbd,\r\n0xfe,0xa1,0xfe,0x68,0x03,0x52,0xe7,0xf9,0xfe,0xd8,0xf4,0x52,0x3a,0x3b,0x39,0x5a,0x3a,0x3a,0x56,0xe0,0xfe,0xf9,0x01,0x21,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x25,0x00,0x57,0x40,0x30,0x0b,0x25,0x1b,0x25,0x02,0x00,0x0f,0x10,0x0f,0x02,0x0c,0x03,0x11,0x17,0x95,0x40,0x21,0x1b,0x0e,0x24,\r\n0x0e,0x13,0x42,0x0c,0x13,0x95,0x19,0x1f,0x1f,0x00,0x0e,0x95,0x06,0x10,0x24,0x95,0x00,0x16,0x09,0x83,0x0c,0x19,0x19,0x27,0x11,0x21,0x83,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x7c,0x2f,0x33,0x18,0xed,0x32,0x2b,0x00,0x18,0x10,0xf6,0x32,0x1a,0xed,0x32,0x31,0x30,0x01,0x5f,0x5e,0x5d,\r\n0x5d,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x13,0x02,0x21,0x22,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x17,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x16,0x16,0x33,0x20,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0x69,0x22,0xfe,0xdc,0x8b,0xb5,0x12,0x8e,0x35,0x30,0x6c,0x6b,\r\n0x1e,0x22,0x8e,0x84,0x34,0x30,0x68,0x68,0x26,0x1e,0x9c,0x12,0xb4,0x8c,0x01,0x26,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x02,0x64,0x01,0x42,0xaa,0x9a,0x31,0x34,0x35,0x5a,0x33,0x35,0x34,0x38,0x9a,0xaa,0x00,0x01,0x00,0x12,0x00,0x00,0x05,0xb8,0x05,0xb2,0x00,0x13,0x00,0x31,0x40,0x17,0x01,0x03,\r\n0x91,0x12,0x04,0x09,0x03,0x0c,0x07,0x07,0x06,0x0c,0x0c,0x08,0x10,0x05,0x00,0x7e,0x01,0x01,0x15,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x39,0x19,0x2f,0x33,0x33,0x00,0x18,0x2f,0x33,0x3f,0x3f,0xfd,0xce,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x36,0x33,\r\n0x32,0x05,0xb8,0x9a,0x0c,0x47,0x41,0x2a,0xfe,0x77,0xbd,0xfd,0xf8,0xbb,0x01,0x8d,0x13,0x0a,0x04,0x07,0x1a,0x01,0x3b,0x3f,0xbb,0xd1,0x04,0xc0,0x63,0x7d,0xfb,0x5a,0x05,0x9a,0xfb,0x8f,0x37,0x48,0x32,0x4f,0x03,0xc7,0xc0,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x04,0x9a,0x04,0x18,0x00,0x13,0x00,0x34,0x40,0x11,0x01,0x03,0x95,0x12,\r\n0x10,0x09,0x0f,0x0c,0x07,0x07,0x06,0x0d,0x0d,0x08,0x10,0x05,0x00,0xb8,0x01,0x2e,0xb4,0x01,0x01,0x15,0x09,0x08,0x2f,0x33,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x39,0x19,0x2f,0x33,0x33,0x00,0x18,0x2f,0x33,0x3f,0x3f,0xfd,0xce,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,\r\n0x33,0x32,0x04,0x9a,0x96,0x08,0x42,0x37,0x31,0xfe,0xe8,0xa8,0xfe,0x7c,0xb4,0x01,0x04,0x1d,0x07,0x04,0x08,0x18,0xbf,0x47,0xaa,0xc6,0x03,0x3c,0x54,0x88,0xfc,0xf8,0x04,0x00,0xfd,0x18,0x52,0x3d,0x45,0x46,0x02,0x32,0xd2,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x05,0xb8,0x07,0x5c,0x02,0x26,0x05,0xee,0x00,0x00,0x01,0x07,0x04,0x6e,\r\n0x02,0x2f,0x01,0x5c,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x4b,0x40,0x0a,0x1a,0x14,0x08,0x00,0x25,0x02,0x01,0x19,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0x9a,0x06,0x00,0x02,0x26,0x05,0xef,0x00,0x00,0x01,0x07,0x04,0x6e,0x01,0xc1,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x6e,\r\n0x40,0x0a,0x1a,0x14,0x08,0x00,0x25,0x02,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x04,0x00,0x5e,0xfe,0x66,0x0a,0x7f,0x05,0xdb,0x00,0x0d,0x00,0x1b,0x00,0x30,0x00,0x31,0x00,0x8f,0x40,0x33,0x0e,0x91,0x08,0x0e,0x00,0x0f,0x91,0x07,0x0e,0x01,0x16,0x91,0x00,0x15,0x91,0x40,0x01,0x01,0x07,0x32,0x31,0x24,\r\n0x42,0x31,0x04,0x23,0x29,0x24,0x16,0x1d,0x1f,0x95,0x2f,0x10,0x26,0x0f,0x29,0x24,0x22,0x23,0x23,0x21,0x25,0x2e,0x20,0x06,0x20,0x01,0x20,0x26,0x1c,0xb8,0x01,0x2e,0x40,0x17,0x1d,0x1d,0x26,0x25,0x25,0x33,0x19,0x16,0x01,0x08,0x0f,0x01,0x0f,0x01,0x04,0x0b,0x7d,0x19,0x19,0x33,0x12,0x7d,0x04,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x11,\r\n0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x2f,0xe1,0x12,0x39,0x5d,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x39,0x00,0x3f,0x3f,0xfd,0xce,0x3f,0x33,0x2f,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x1a,0xed,0xdd,0xe6,0x10,0xf4,0xed,0x10,0xf4,0xe6,0x31,0x30,0x05,0x35,0x20,0x00,0x11,0x10,0x00,0x21,0x15,\r\n0x20,0x00,0x11,0x10,0x00,0x01,0x35,0x22,0x00,0x11,0x10,0x00,0x33,0x15,0x32,0x00,0x11,0x10,0x00,0x01,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x13,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x33,0x32,0x13,0x02,0xfe,0xfe,0xd0,0xfe,0x90,0x01,0x7f,0x01,0x33,0x01,0x37,0x01,0x63,0xfe,0x8e,0xfe,0xd8,0xe7,0xfe,0xe5,0x01,0x12,\r\n0xde,0xec,0x01,0x10,0xfe,0xfe,0x06,0x81,0x95,0x0a,0x40,0x3c,0x2d,0xfe,0x75,0xac,0x8f,0xfe,0x79,0xb4,0x01,0x04,0x1c,0x07,0x05,0x06,0x1a,0xaa,0x40,0xb2,0xc6,0x1b,0x42,0x52,0x01,0x93,0x01,0x43,0x01,0x52,0x01,0xa3,0x52,0xfe,0x76,0xfe,0xb7,0xfe,0xa2,0xfe,0x66,0x05,0x34,0x52,0xfe,0xb3,0xfe,0xfd,0xfe,0xf7,0xfe,0xbd,0x52,0x01,\r\n0x34,0x01,0x16,0x01,0x1a,0x01,0x38,0xfe,0x4a,0x54,0x88,0xfb,0x5e,0x01,0x82,0x04,0x18,0xfd,0x18,0x51,0x3e,0x36,0x55,0x02,0x32,0xd2,0x01,0x9a,0x00,0x03,0x00,0x58,0xfe,0x66,0x08,0xec,0x04,0x38,0x00,0x0d,0x00,0x1a,0x00,0x2f,0x00,0x83,0x40,0x2b,0x0e,0x95,0x08,0x0e,0x00,0x0f,0x95,0x07,0x0e,0x01,0x16,0x95,0x00,0x15,0x95,0x40,\r\n0x01,0x2e,0x23,0x42,0x22,0x29,0x23,0x16,0x1c,0x1e,0x95,0x2e,0x10,0x25,0x0f,0x29,0x23,0x2c,0x21,0x22,0x22,0x24,0x2c,0x20,0x20,0x25,0x1b,0xb8,0x01,0x2e,0x40,0x17,0x1c,0x1c,0x25,0x24,0x24,0x31,0x19,0x15,0x00,0x0e,0x07,0x00,0x07,0x00,0x04,0x0b,0x83,0x19,0x19,0x31,0x12,0x83,0x04,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,\r\n0x2f,0x2f,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x39,0x2f,0xe1,0x12,0x39,0x11,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x39,0x00,0x3f,0x3f,0xfd,0xce,0x3f,0x33,0x2f,0x2b,0x00,0x7d,0x2f,0x1a,0x18,0xed,0xdd,0xed,0x10,0xf4,0xed,0x10,0xf4,0xed,0x31,0x30,0x05,0x35,0x22,0x00,0x35,0x34,0x00,0x33,0x15,0x32,0x00,0x15,0x14,0x00,0x03,\r\n0x35,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x32,0x36,0x35,0x10,0x05,0x23,0x26,0x23,0x22,0x07,0x01,0x23,0x13,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x36,0x33,0x32,0x02,0x4e,0xe7,0xfe,0xf1,0x01,0x1a,0xea,0xeb,0x01,0x01,0xfe,0xeb,0xd7,0xa2,0xba,0xb3,0x9b,0xa1,0xb1,0x05,0x4c,0x96,0x08,0x42,0x3b,0x2d,0xfe,0x74,0xac,0x90,\r\n0xfe,0x78,0xb5,0x01,0x04,0x1c,0x07,0x04,0x07,0x19,0xaa,0x40,0xb2,0xc6,0x38,0x3e,0x01,0x20,0xec,0xfa,0x01,0x2c,0x3e,0xfe,0xe6,0xfa,0xf6,0xfe,0xd8,0x03,0xa6,0x3e,0xd3,0xc1,0xb8,0xce,0x3e,0xd0,0xbb,0x01,0x8f,0x32,0x54,0x88,0xfb,0x5e,0x01,0x82,0x04,0x18,0xfd,0x18,0x51,0x3e,0x36,0x55,0x02,0x32,0xd2,0x00,0x00,0x02,0x00,0x5e,\r\n0xff,0xb4,0x06,0x3e,0x05,0xec,0x00,0x13,0x00,0x26,0x00,0x5b,0x40,0x31,0x20,0x1e,0x16,0x18,0x0c,0x0a,0x02,0x04,0x14,0x18,0x91,0x0e,0x42,0x0a,0x04,0x22,0x1e,0x91,0x40,0x00,0x04,0x13,0x11,0x7d,0x25,0x0e,0x0e,0x1b,0x04,0x42,0x22,0x18,0x14,0x0a,0x00,0x00,0x0a,0x14,0x18,0x22,0x05,0x0e,0x1e,0x04,0x04,0x28,0x1b,0x7d,0x07,0x2f,\r\n0xe1,0x12,0x39,0x2f,0x33,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x33,0x1a,0xed,0x32,0x3f,0xe5,0xed,0x32,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x31,0x30,0x05,0x06,0x23,0x22,0x27,0x24,0x00,0x11,0x10,0x00,0x25,0x36,0x33,0x32,0x17,0x04,0x00,0x11,0x10,0x00,0x01,0x06,0x23,0x22,0x27,\r\n0x06,0x00,0x15,0x14,0x12,0x17,0x36,0x33,0x32,0x17,0x36,0x12,0x35,0x10,0x03,0xb0,0x26,0x42,0x42,0x27,0xfe,0xd0,0xfe,0xaf,0x01,0x53,0x01,0x39,0x25,0x49,0x48,0x24,0x01,0x2c,0x01,0x4e,0xfe,0xad,0xfe,0xd1,0x26,0x3e,0x3e,0x26,0xe5,0xfe,0xff,0xf5,0xdc,0x27,0x42,0x42,0x26,0xe5,0xf9,0x14,0x38,0x38,0x1b,0x01,0x7e,0x01,0x37,0x01,\r\n0x46,0x01,0x8b,0x1f,0x40,0x3e,0x1b,0xfe,0x82,0xfe,0xca,0xfe,0xb3,0xfe,0x76,0x05,0x0c,0x30,0x30,0x18,0xfe,0xc9,0xfa,0xf9,0xfe,0xcf,0x1c,0x37,0x37,0x1b,0x01,0x2a,0xfe,0x02,0x16,0x00,0x00,0x02,0x00,0x60,0xff,0xb0,0x04,0xd3,0x04,0x4e,0x00,0x11,0x00,0x21,0x00,0x59,0x40,0x31,0x0b,0x09,0x14,0x12,0x42,0x16,0x95,0x0d,0x09,0x10,\r\n0x02,0x04,0x1c,0x1e,0x1a,0x95,0x40,0x00,0x42,0x04,0x16,0x0f,0x83,0x20,0x0e,0x0d,0x18,0x04,0x42,0x1e,0x1a,0x16,0x12,0x09,0x00,0x00,0x09,0x12,0x16,0x1a,0x1e,0x06,0x0d,0x04,0x04,0x23,0x18,0x83,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x3f,0xe5,0x1a,0xfd,\r\n0x32,0xcd,0x10,0xcd,0x3f,0x33,0xfd,0xf5,0xcd,0x10,0xcd,0x31,0x30,0x05,0x06,0x23,0x22,0x27,0x26,0x02,0x35,0x10,0x25,0x36,0x33,0x32,0x17,0x04,0x11,0x14,0x02,0x03,0x06,0x23,0x22,0x27,0x04,0x11,0x10,0x05,0x36,0x33,0x32,0x17,0x24,0x11,0x10,0x03,0x0a,0x26,0x48,0x46,0x27,0xe3,0xec,0x01,0xdc,0x26,0x46,0x46,0x26,0x01,0xbf,0xf0,\r\n0xd1,0x26,0x44,0x46,0x26,0xfe,0xcc,0x01,0x29,0x27,0x44,0x44,0x26,0x01,0x25,0x10,0x40,0x3e,0x19,0x01,0x0f,0xde,0x01,0xe8,0x36,0x3c,0x3c,0x32,0xfe,0x24,0xde,0xfe,0xe9,0x03,0x74,0x37,0x3b,0x2f,0xfe,0xa2,0xfe,0xb2,0x31,0x37,0x37,0x2f,0x01,0x54,0x01,0x4e,0x00,0x03,0x00,0x5e,0xff,0xe8,0x08,0xaa,0x08,0x05,0x00,0x29,0x00,0x41,\r\n0x00,0x4d,0x00,0x5e,0x40,0x31,0x36,0x37,0x37,0x4c,0x47,0x2a,0x2a,0x47,0x20,0x0a,0x05,0x25,0x7d,0x1a,0x47,0x1a,0x47,0x1a,0x4f,0x10,0x7d,0x05,0x1d,0x91,0x22,0x04,0x42,0x42,0x08,0x49,0x49,0x2c,0x31,0x96,0x3c,0x3c,0x2a,0x96,0x37,0x2c,0x2c,0x0d,0x91,0x08,0x04,0x13,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0x33,0x2f,0x33,0xed,\r\n0x32,0x2f,0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0x3f,0xed,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x39,0x11,0x33,0x2f,0x11,0x33,0x33,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,\r\n0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x13,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x01,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x04,0x85,0xc2,0xcb,0xfe,0xd3,0xfe,0x93,0x01,0x66,0x01,0x32,0x9e,0x6e,0x6a,0xa4,0xdf,0xfe,0xf9,0x01,\r\n0x0e,0xf0,0xdd,0x9a,0x9a,0xdf,0xf0,0x01,0x0e,0xfe,0xfa,0xe0,0xa4,0x6a,0x6e,0x9e,0x01,0x31,0x01,0x67,0xfe,0x93,0xfe,0xd3,0xc8,0xc9,0x29,0x4a,0x85,0x78,0x6b,0x30,0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x40,0x76,0x77,0x79,0x43,0xfe,0x59,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x3e,0x56,0x01,0x8e,0x01,0x4c,0x01,0x4c,0x01,\r\n0xa4,0x2b,0xb2,0x45,0xfe,0xba,0xfe,0xf2,0xfe,0xeb,0xfe,0xce,0x60,0x60,0x01,0x31,0x01,0x16,0x01,0x0d,0x01,0x47,0x45,0xb2,0x2b,0xfe,0x5e,0xfe,0xb4,0xfe,0xb4,0xfe,0x70,0x07,0xa3,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0xfe,0x54,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0x00,0x03,0x00,0x60,\r\n0xff,0xe8,0x06,0xc6,0x06,0x9d,0x00,0x29,0x00,0x41,0x00,0x4d,0x00,0x5d,0x40,0x31,0x36,0x37,0x37,0x4c,0x47,0x2a,0x2a,0x47,0x0b,0x1f,0x05,0x25,0x83,0x1a,0x47,0x1a,0x47,0x1a,0x4f,0x10,0x83,0x05,0x42,0x42,0x08,0x49,0x49,0x2c,0x31,0x96,0x3c,0x3c,0x41,0x96,0x36,0x2c,0x00,0x1d,0xec,0x22,0x10,0x0d,0xec,0x08,0x10,0x13,0x95,0x02,\r\n0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x32,0x2f,0xed,0x11,0x33,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x39,0x11,0x33,0x2f,0x11,0x33,0x33,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,\r\n0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x13,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x01,0x27,0x36,0x37,0x22,0x35,0x34,0x33,0x32,0x16,0x15,0x14,0x03,0x96,0x96,0xac,0xe8,0xfe,0xf4,0x01,0x08,0xde,0x84,\r\n0x63,0x69,0x82,0x93,0xa7,0xbb,0xad,0xa2,0x82,0x81,0xa1,0xad,0xbb,0xa6,0x92,0x83,0x69,0x63,0x85,0xde,0x01,0x06,0xfe,0xf5,0xe8,0xa9,0xf1,0x29,0x4a,0x85,0x78,0x6b,0x30,0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x40,0x76,0x77,0x79,0x43,0xfe,0x59,0x16,0x56,0x06,0x60,0x5a,0x30,0x3e,0x42,0x5a,0x01,0x25,0xed,0xf0,0x01,0x2e,\r\n0x30,0xaa,0x49,0xd2,0xb9,0xb3,0xd5,0x63,0x63,0xd2,0xb6,0xb9,0xd2,0x49,0xaa,0x30,0xfe,0xd1,0xef,0xec,0xfe,0xda,0x06,0x3b,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0xfe,0x54,0x35,0x16,0x3a,0x50,0x52,0x41,0x30,0x91,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x06,0xca,0x06,0xdb,0x02,0x26,0x05,0xda,\r\n0x00,0x00,0x01,0x07,0x06,0x65,0x02,0x1f,0x01,0x0a,0x00,0x08,0xb3,0x01,0x3e,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x1e,0x00,0x00,0x05,0x5e,0x05,0x7f,0x02,0x26,0x05,0xdb,0x00,0x00,0x01,0x07,0x06,0x65,0x01,0x53,0xff,0xae,0x00,0x16,0xb9,0x00,0x01,0xff,0xea,0x40,0x09,0x20,0x15,0x08,0x00,0x25,0x01,0x1f,0x11,0x26,0x00,0x2b,\r\n0x35,0x01,0x2b,0x35,0x00,0x01,0x00,0x5e,0xfe,0x66,0x04,0x8c,0x05,0xb2,0x00,0x15,0x00,0x31,0x40,0x1a,0x30,0x00,0x01,0x00,0x00,0x02,0x91,0x13,0x04,0x0c,0x0a,0x08,0x91,0x0d,0x13,0x0a,0x7e,0x0d,0x0d,0x10,0x00,0x00,0x17,0x05,0x7d,0x10,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x2f,0x3f,0xed,0x32,0x2f,\r\n0x5d,0x31,0x30,0x01,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x11,0x23,0x11,0x24,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x04,0x8c,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0x20,0x2e,0xa8,0xfe,0xe8,0xfe,0xba,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x04,0xc4,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x04,0xfd,0xe3,0x01,0x82,\r\n0x16,0x01,0x85,0x01,0x2f,0x01,0x58,0x01,0xa8,0x3b,0x00,0x01,0x00,0x60,0xfe,0x66,0x03,0x62,0x04,0x18,0x00,0x15,0x00,0x2d,0x40,0x17,0x00,0x00,0x02,0x95,0x13,0x10,0x0c,0x0a,0x08,0x96,0x0d,0x16,0x0a,0x84,0x0d,0x0d,0x10,0x00,0x00,0x17,0x05,0x83,0x10,0x2f,0xe1,0x12,0x39,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x2f,0x3f,\r\n0xed,0x32,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x11,0x23,0x11,0x26,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x03,0x62,0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x1e,0x28,0xa2,0xc0,0xe8,0x01,0x22,0xf2,0x87,0x67,0x03,0x3e,0x50,0xe1,0xb7,0xb4,0xd0,0x09,0xfd,0xeb,0x01,0x88,0x15,0x01,0x17,0xce,0xfd,0x01,0x33,\r\n0x32,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x03,0xd5,0x05,0x9a,0x00,0x13,0x00,0xc8,0x40,0x6b,0x09,0x08,0x11,0x06,0x07,0x12,0x05,0x0a,0x05,0x0c,0x08,0x11,0x03,0x07,0x12,0x04,0x0b,0x04,0x0d,0x08,0x11,0x02,0x01,0x0e,0x01,0x13,0x07,0x12,0x10,0x08,0x11,0x00,0x0f,0x0f,0x0e,0x0e,0x00,0x04,0x0a,0x42,0x05,0x04,0x04,0x03,0x13,0x06,\r\n0x03,0x02,0x07,0x12,0x07,0x02,0x03,0x06,0x13,0x04,0x12,0x07,0x10,0x0d,0x0c,0x09,0x08,0x11,0x08,0x09,0x0c,0x0d,0x10,0x04,0x11,0x08,0x00,0x01,0x0f,0x0a,0x0b,0x05,0x40,0x04,0x05,0x0e,0x0f,0x05,0x0f,0x05,0x08,0x12,0x11,0x03,0x07,0x08,0x11,0x12,0x07,0x0b,0x0a,0x0e,0x08,0x12,0x00,0x42,0x00,0x12,0x12,0x15,0x08,0x2f,0x12,0x39,\r\n0x2f,0xce,0x2b,0x01,0x10,0xe2,0x32,0x33,0x11,0x33,0x00,0x18,0x2f,0x33,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x33,0x11,0x33,0x1a,0x10,0xcd,0x32,0x10,0xcd,0x32,0x11,0x12,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x17,0x39,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x01,0x33,0x2f,0x33,0x2b,0x01,0x10,0xe1,0x32,\r\n0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x07,0x25,0x03,0x05,0x07,0x25,0x03,0x23,0x13,0x25,0x37,0x05,0x13,0x25,0x37,0x05,0x13,0x33,0x03,0x03,0xd5,0x37,0xfe,0xe5,0x99,0x01,0x16,0x38,0xfe,0xec,0xac,0x91,0xc3,0xfe,0xf3,0x37,0x01,0x0a,0x9a,\r\n0xfe,0xfa,0x38,0x01,0x04,0xa1,0x93,0xba,0x03,0x6a,0x7a,0x7e,0xfe,0x9c,0x7c,0x7c,0x7c,0xfe,0x72,0x01,0xc4,0x78,0x7c,0x76,0x01,0x62,0x74,0x7e,0x75,0x01,0x79,0xfe,0x50,0x00,0x00,0x01,0x00,0x52,0x04,0xc2,0x02,0xd7,0x05,0xcb,0x00,0x11,0x00,0x18,0x40,0x0a,0x0b,0x08,0xe2,0x00,0x02,0x09,0x0e,0x00,0x0e,0x05,0x2f,0xcd,0xcd,0x10,\r\n0xcd,0x00,0x2f,0xdd,0xfd,0xcc,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x0a,0x0a,0x52,0x26,0x36,0x36,0x26,0x01,0x73,0x0b,0x4f,0x26,0x36,0x36,0x26,0x05,0x12,0x50,0x36,0x26,0x27,0x36,0x50,0x36,0x27,0x26,0x36,0x00,0x01,0x00,0x5e,0x04,0xc2,0x03,0x0a,0x05,0xbe,\r\n0x00,0x0f,0x00,0x1c,0x40,0x0d,0x0e,0x4c,0x03,0x09,0x99,0x00,0x08,0x00,0xc2,0x01,0x01,0x11,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x33,0xed,0xdc,0xed,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x06,0x23,0x23,0x35,0x33,0x32,0x37,0x36,0x33,0x32,0x03,0x0a,0x7a,0x32,0x64,0x32,0x61,0x61,0x42,0x66,0x50,0x3d,0x6a,0x69,0x4c,0x97,\r\n0x04,0xc2,0x88,0x44,0x44,0x9a,0x31,0x31,0xff,0xff,0xff,0x90,0x04,0x7b,0x00,0x7d,0x06,0x23,0x00,0x07,0x04,0x61,0xfd,0xae,0x00,0x00,0xff,0xff,0xff,0x86,0x04,0x7b,0x00,0x71,0x06,0x23,0x00,0x07,0x04,0x29,0xfd,0xa2,0x00,0x00,0x00,0x08,0x00,0x21,0xfe,0xcf,0x07,0xbc,0x05,0x5a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,\r\n0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0xd5,0x40,0x74,0x0d,0x11,0x19,0x03,0x1d,0x0f,0x1b,0xc3,0x15,0x21,0x21,0x09,0x39,0x3d,0x41,0x49,0x03,0x4d,0x3f,0x4b,0xc3,0x45,0x51,0x51,0x39,0x5d,0x55,0x59,0x57,0xc3,0x40,0x5d,0x0e,0x30,0x39,0x05,0x42,0x09,0xc3,0x03,0x01,0x05,0x2d,0x39,0xc3,0x27,0x33,0x40,0x24,0x2a,0x35,0x03,0x30,0x3c,\r\n0x0c,0xc4,0x3d,0x0d,0x0d,0x80,0x41,0x11,0xc4,0x42,0x12,0x0e,0x2a,0x30,0x18,0x42,0x48,0x18,0xc4,0x49,0x19,0x4d,0x1d,0xc4,0x4e,0x1e,0x1e,0x06,0x36,0x24,0xc4,0x25,0x25,0x80,0x29,0xc4,0x2a,0x0e,0x06,0x30,0x00,0x42,0x54,0x00,0xc4,0x55,0x01,0x59,0x05,0xc4,0x5a,0x06,0x06,0x61,0x36,0x30,0xc4,0x31,0x80,0x35,0xc4,0x36,0x2f,0xe1,\r\n0x1a,0xdc,0xe1,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0xdc,0x32,0xe1,0x32,0x2b,0x01,0x10,0xf2,0xe1,0x1a,0xc8,0x18,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0xdc,0x32,0xe1,0x32,0x2b,0x01,0x10,0xf2,0x32,0xe1,0x32,0x1a,0xc8,0x18,0x2f,0x32,0xe1,0x32,0x00,0x2f,0x17,0x33,0x1a,0xdc,0x32,0xed,0x32,0x2f,0x33,0xde,0xed,0x2b,0x00,\r\n0x18,0x10,0xf6,0x1a,0xfd,0xce,0x32,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0xce,0x17,0x32,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0xce,0x17,0x32,0x31,0x30,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,\r\n0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x01,0x23,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x04,0xa2,0x50,\r\n0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x02,0x8f,0x50,0x08,0x67,0x62,0x0e,0x52,0x08,0x6b,0x4f,0x52,0x6a,0xfa,0xfd,0x50,0x08,0x67,0x63,0x0d,0x52,0x08,0x6b,0x4f,0x52,0x6a,0x05,0x98,0x50,0x08,0x66,0x64,0x0c,0x52,0x07,0x6b,0x50,0x52,0x69,0xf9,0xe9,0x50,0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x05,0x8f,\r\n0x50,0x08,0x67,0x62,0x0e,0x52,0x08,0x6b,0x4f,0x52,0x6a,0xfa,0xfd,0x50,0x08,0x67,0x63,0x0d,0x52,0x08,0x6b,0x4f,0x52,0x6a,0x02,0x7e,0x50,0x08,0x68,0x64,0x0e,0x4f,0x07,0x6d,0x4f,0x52,0x68,0x04,0xa4,0x6a,0x6a,0x53,0x63,0x63,0xfe,0xaf,0x6a,0x6a,0x52,0x64,0x63,0x53,0x6a,0x6a,0x52,0x64,0x63,0xfd,0xc3,0x6b,0x6b,0x52,0x64,0x62,\r\n0x54,0x6b,0x6b,0x53,0x63,0x62,0xfd,0xc1,0x6b,0x6b,0x52,0x64,0x63,0x53,0x6b,0x6b,0x52,0x64,0x63,0xfe,0xab,0x6b,0x6b,0x53,0x63,0x63,0x00,0x08,0x00,0x35,0xfe,0x66,0x07,0x68,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x95,0x40,0x4d,0x4f,0x15,0x5f,0x15,0x02,0x15,0x17,0x19,\r\n0x1b,0x17,0x1b,0x17,0x1f,0x12,0x0b,0x09,0x40,0x07,0x50,0x07,0x02,0x07,0x05,0x09,0x05,0x09,0x05,0x0c,0x02,0x1e,0x2f,0x1f,0x01,0x1f,0x0c,0x03,0x02,0x12,0x10,0x0e,0x0c,0x14,0x16,0x08,0x0a,0x06,0x04,0x1a,0x18,0x1e,0x1c,0x00,0x02,0x16,0x0a,0x16,0x0a,0x11,0x02,0x18,0x04,0x18,0x04,0x1c,0x02,0x1c,0x02,0x0c,0x10,0x11,0x11,0x21,\r\n0x0d,0x0c,0x0c,0x21,0x20,0x11,0x12,0x39,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x10,0xcd,0x00,0x2f,0xcd,0xd6,0xdd,0xd6,0xcd,0x10,0xd6,0x5d,0xcd,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x5d,0x10,0xcd,0x11,\r\n0x12,0x39,0x39,0x2f,0x2f,0xcd,0x10,0xcd,0x5d,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x07,0x03,0x37,0x05,0x05,0x27,0x25,0x01,0x25,0x35,0x05,0x05,0x25,0x35,0x05,0x01,0x07,0x03,0x37,0x05,0x05,0x27,0x25,0x05,0x03,0x23,0x13,0x04,0x4c,0x5c,0x7c,0x76,0xfe,0x6a,0x58,0xa6,0x46,0x05,0x16,0xfe,0xc7,0x58,0x01,0x4d,0xfb,0x28,0xfe,0x9f,\r\n0x01,0x61,0x05,0xd2,0xfe,0xa0,0x01,0x60,0xfe,0xe0,0x46,0xb8,0x58,0xfc,0xdb,0xfe,0xb2,0x43,0x01,0x39,0x02,0x04,0x75,0x62,0x5c,0x05,0x9a,0xfe,0xa0,0x01,0x60,0xfe,0x10,0x58,0x01,0x4e,0x44,0xb1,0xb8,0x58,0xa6,0xfd,0x2d,0x74,0x63,0x5c,0x9e,0x5c,0x7b,0x74,0xfd,0x7a,0x44,0x01,0x3a,0x58,0x81,0xa6,0x46,0xb8,0xbf,0xfe,0xa0,0x01,\r\n0x60,0x00,0x00,0x02,0x00,0x29,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0x45,0x40,0x23,0x0a,0x01,0x91,0x07,0x04,0x04,0x05,0x13,0x91,0x0b,0x0b,0x05,0x03,0x14,0x91,0x00,0x02,0x00,0x09,0x09,0x14,0x0f,0x7d,0x18,0x18,0x1c,0x0b,0x07,0x14,0x7e,0x04,0x00,0x00,0x1c,0x1b,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x12,\r\n0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0xbc,0x93,0x93,0xa8,0xa2,0xa2,0x01,0x10,0xd6,0xee,0xfa,0xd8,0xfe,0xfe,\r\n0xec,0x95,0xa2,0xfe,0xc9,0x04,0x74,0x9a,0x8c,0x8c,0x9a,0xfe,0xc6,0xcf,0xbf,0xc6,0xe6,0x02,0xa2,0xfd,0xf6,0x8c,0x7e,0x01,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x03,0xb4,0x05,0xec,0x00,0x12,0x00,0x19,0x00,0x47,0x40,0x24,0x0a,0x01,0x96,0x07,0x04,0x04,0x06,0x0b,0x95,0x13,0x13,0x00,0x06,0x00,0x14,0x95,0x00,0x02,0x00,0x09,\r\n0x09,0x14,0x0f,0x83,0x17,0x17,0x1b,0x0b,0x07,0x14,0x84,0x04,0x00,0x00,0x1b,0x1a,0x11,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x11,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x10,0xc6,0x00,0x2f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x32,0x16,\r\n0x15,0x14,0x06,0x23,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0xa6,0x79,0x79,0xa4,0x81,0x81,0x01,0x14,0x9d,0xb9,0xba,0x8e,0xfe,0xde,0xf6,0xcc,0xce,0x04,0xd1,0x85,0x96,0x96,0x85,0xfd,0xa6,0xa4,0x93,0x94,0xac,0x01,0xea,0xfe,0xa2,0xb4,0xaa,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x75,0x40,0x3f,\r\n0x16,0x00,0x15,0x01,0x15,0x13,0x03,0x14,0x02,0x14,0x03,0x00,0x06,0x09,0x16,0x13,0x10,0x0f,0x01,0x02,0x06,0x14,0x0f,0x15,0x1f,0x15,0x2f,0x15,0x03,0x15,0x15,0x0f,0x06,0x91,0x10,0x10,0x08,0x0f,0x91,0x09,0x03,0x08,0x02,0x01,0x01,0x0d,0x07,0x15,0x00,0x14,0x01,0x14,0x14,0x10,0x0d,0x7d,0x18,0x18,0x1c,0x10,0x07,0x7e,0x08,0x2f,\r\n0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0x10,0xc6,0x32,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x01,0x17,0x07,0x27,0x06,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,\r\n0x15,0x14,0x01,0x11,0x33,0x32,0x37,0x27,0x37,0x17,0x36,0x35,0x10,0x21,0x03,0x81,0x75,0x73,0x7d,0x67,0x7e,0xbd,0xa8,0x01,0x8a,0xe6,0xfd,0xfd,0x3b,0xb0,0x52,0x46,0x66,0x72,0x6f,0x52,0xfe,0xb0,0x02,0x89,0xb0,0x4d,0xba,0x28,0xfd,0xe2,0x05,0x9a,0xe0,0xcc,0xe3,0x01,0xf7,0xfd,0xb4,0x15,0x97,0x4e,0xa4,0x4e,0x8c,0x01,0x1c,0x00,\r\n0x00,0x02,0x00,0xa6,0xfe,0x23,0x04,0x54,0x04,0x18,0x00,0x14,0x00,0x25,0x00,0x7c,0x40,0x44,0x18,0x00,0x17,0x01,0x17,0x15,0x03,0x16,0x02,0x16,0x03,0x00,0x05,0x10,0x18,0x15,0x24,0x1d,0x09,0x1c,0x01,0x02,0x05,0x16,0x17,0x40,0x09,0x0c,0x48,0x17,0x17,0x1d,0x24,0x95,0x05,0x16,0x0e,0x1d,0x95,0x10,0x10,0x0c,0x0f,0x02,0xdf,0x01,\r\n0x01,0x01,0x01,0x13,0x09,0x17,0x00,0x16,0x01,0x16,0x16,0x21,0x13,0x83,0x1a,0x1a,0x27,0x21,0x0c,0x09,0x84,0x0a,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0x5d,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0x2b,0x33,0x10,0xc6,0x32,0x3f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,\r\n0x39,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x31,0x30,0x25,0x17,0x07,0x27,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x05,0x27,0x37,0x17,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x03,0xae,0x70,0x72,0x72,0x52,0x67,0xd7,0x5c,0x04,0xa4,0xa4,0x04,0x74,\r\n0xee,0xc0,0xe4,0xfe,0x92,0x78,0x74,0x72,0x5a,0xa2,0x85,0x8d,0xb0,0xa6,0x80,0x42,0x56,0xa8,0x4e,0xaa,0x22,0xac,0xfd,0x8f,0x05,0xdd,0xb4,0xcc,0xfe,0xf2,0xe3,0xfe,0xc9,0x69,0xb1,0x4d,0xaa,0x71,0xd0,0xa9,0xc9,0xc9,0x98,0x8f,0x7f,0xad,0x00,0x01,0x00,0xbc,0xfe,0x66,0x04,0x33,0x05,0x9a,0x00,0x19,0x00,0x40,0x40,0x24,0x18,0x91,\r\n0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0b,0x0a,0x91,0x11,0x11,0x0b,0x10,0x91,0x0d,0x03,0x0b,0x0f,0x0f,0x0c,0x15,0x7d,0x06,0x06,0x1b,0x11,0x0b,0x7e,0x01,0x42,0x0c,0x2f,0xe2,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x10,0xde,0x32,0x5d,0xed,0x31,0x30,0x13,0x35,0x16,0x33,\r\n0x32,0x36,0x35,0x34,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x20,0x00,0x11,0x14,0x00,0x21,0x22,0xbe,0xa4,0x9a,0xbd,0xca,0xfe,0xdb,0x46,0xa8,0x02,0xd0,0xfd,0xd8,0x4a,0x01,0x27,0x01,0x5e,0xfe,0xd9,0xfe,0xf4,0xae,0xfe,0xb2,0xb8,0x6c,0xdf,0xcb,0xd5,0x01,0x25,0xfd,0x5e,0x05,0x9a,0x9a,0xfe,0x3a,0xfe,0x97,0xfe,\r\n0xdd,0xfd,0xfe,0xb5,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xaa,0x04,0x00,0x00,0x19,0x00,0x3f,0x40,0x23,0x18,0x95,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0b,0x0a,0x95,0x11,0x11,0x0b,0x10,0x95,0x0d,0x0f,0x0b,0x0e,0x0e,0x0c,0x15,0x83,0x06,0x06,0x1b,0x11,0x0b,0x84,0x01,0x0c,0x2f,0x33,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,\r\n0x39,0x2f,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x10,0xde,0x32,0x5d,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0xa6,0x75,0x8b,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0x02,0x76,0xfe,0x2e,0x42,0xf7,0x01,0x27,0xfe,0xe9,0xef,0x99,\r\n0xfe,0xa0,0xa0,0x4e,0xbb,0xa9,0xb9,0xd7,0xfe,0x1a,0x04,0x00,0x8c,0xff,0x00,0xfe,0xdd,0xf9,0xd7,0xfe,0xe5,0x00,0x00,0x01,0x00,0x60,0xfe,0xae,0x03,0xe2,0x05,0xb2,0x00,0x31,0x00,0x79,0x40,0x46,0x08,0x0a,0xe2,0x40,0x05,0x32,0x80,0x00,0x0e,0x26,0x2c,0x2b,0x18,0x92,0x1b,0x1b,0x26,0x00,0x11,0x10,0x11,0x20,0x11,0x03,0x11,0x13,\r\n0x92,0x0e,0x13,0x0f,0x23,0x1f,0x23,0x2f,0x23,0x03,0x23,0x21,0x92,0x26,0x04,0x08,0x02,0xc2,0x0c,0x00,0xc2,0x0e,0x0e,0x2f,0x10,0x2b,0x19,0x29,0x7d,0x1e,0x23,0x1e,0x19,0x19,0x1e,0x23,0x03,0x10,0x2f,0x7d,0x16,0x16,0x33,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,\r\n0xd6,0xe1,0xc6,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x5d,0x12,0x39,0x2f,0xed,0x39,0x39,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x05,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,\r\n0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x06,0x02,0x4c,0x35,0x5a,0x4c,0x47,0x38,0x32,0x30,0x44,0x2d,0xf1,0x84,0xa8,0xd5,0x9b,0xb7,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x91,0x7f,0xb4,0xaa,0x9e,0xce,0xcc,0xea,0xfe,0xf0,0x94,0xae,0xd8,0x10,0x56,0x40,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x3e,0x50,0x54,0xb6,\r\n0x7b,0x96,0x7f,0x01,0x14,0x8b,0x8a,0x7e,0x6c,0x82,0x71,0xaa,0x58,0xc2,0x9e,0xfe,0xe9,0x49,0x04,0x11,0xbc,0x8b,0xab,0xe1,0x00,0x01,0x00,0x58,0xfe,0xae,0x03,0x44,0x04,0x18,0x00,0x2e,0x00,0x70,0x40,0x3d,0x08,0x0a,0xe2,0x40,0x05,0x2f,0x80,0x00,0x0e,0x24,0x29,0x28,0x17,0x95,0x40,0x1a,0x24,0x0e,0x1a,0x95,0x2b,0x30,0x11,0x13,\r\n0x95,0x0e,0x16,0x21,0x1f,0x95,0x24,0x10,0x08,0x02,0xc2,0x0c,0x00,0xc2,0x0e,0x0e,0x2c,0x11,0x29,0x18,0x26,0x84,0x1c,0x21,0x1c,0x18,0x18,0x1c,0x21,0x03,0x11,0x2c,0x84,0x15,0x15,0x30,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe1,0x11,0x39,0x11,0x12,0x39,0x2f,0xe1,0xd6,0xe1,0xc6,0x00,0x3f,0xfd,0xc6,\r\n0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x05,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x35,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,\r\n0x16,0x16,0x15,0x14,0x06,0x02,0x00,0x33,0x5a,0x4b,0x48,0x38,0x32,0x30,0x44,0x2d,0xc9,0x66,0x86,0xb4,0x01,0x0e,0xfe,0xd7,0x65,0x60,0x01,0x05,0x77,0x68,0x96,0x96,0xaa,0x8e,0x01,0x76,0xd2,0x70,0x8c,0xac,0x12,0x53,0x41,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x3e,0x50,0x04,0x30,0xa2,0x4c,0xac,0xaa,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d,\r\n0xfe,0xee,0xbe,0x32,0x04,0x09,0x87,0x6a,0x77,0xa0,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x18,0x00,0x52,0x40,0x2a,0x08,0x11,0x96,0x0b,0x0e,0x0e,0x0d,0x13,0x04,0x18,0x04,0x18,0x01,0x18,0x06,0x16,0x0d,0x03,0x01,0x06,0x10,0x10,0x16,0x11,0x16,0x17,0x17,0x06,0x01,0x00,0x00,0x1a,0x19,0x09,0x0e,0x11,0x18,0x03,\r\n0x06,0x7e,0x0b,0x07,0x2f,0x33,0xe1,0x17,0x32,0xc6,0x11,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x12,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x12,0x39,0x5d,0x11,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x37,\r\n0x01,0x33,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1f,0x07,0x04,0xa8,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x25,0x0d,0xfd,0x3e,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x4d,0x40,0x27,0x0f,0x06,\r\n0x96,0x0c,0x09,0x09,0x0b,0x00,0x11,0x02,0x14,0x14,0x04,0x12,0x0f,0x01,0x04,0x0e,0x0e,0x12,0x0f,0x07,0x05,0x12,0x13,0x13,0x04,0x01,0x00,0x00,0x16,0x0c,0x0f,0x14,0x03,0x04,0x84,0x09,0x05,0x2f,0x33,0xe1,0x17,0x32,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x10,0xc6,0x11,0x12,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x11,0x39,0x11,0x33,\r\n0x33,0x3f,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x03,0xf8,0xe6,0xfe,0x3c,0x04,0xa4,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x01,0xec,0xfe,0x14,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,\r\n0xfe,0x12,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0xac,0x05,0x9a,0x00,0x12,0x00,0x42,0x40,0x20,0x0d,0x04,0x12,0x12,0x06,0x08,0x91,0x10,0x0b,0x03,0x01,0x06,0x10,0x11,0x11,0x06,0x01,0x00,0x00,0x14,0x07,0x09,0x09,0x13,0x12,0x0b,0x06,0x7e,0x07,0x07,0x14,0x13,0x11,0x12,0x39,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,\r\n0x33,0x12,0x39,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x05,0xac,0xea,0xfd,0xd6,0x1b,0x0b,0x04,0xa8,0xfe,0x63,0x02,0x45,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x20,0x12,0xfd,0x3e,\r\n0x05,0x00,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0xa4,0x04,0x00,0x00,0x0e,0x00,0x42,0x40,0x20,0x0b,0x02,0x0e,0x0e,0x04,0x06,0x95,0x0c,0x09,0x0f,0x01,0x04,0x0c,0x0d,0x0d,0x04,0x01,0x00,0x00,0x10,0x05,0x07,0x07,0x0f,0x0e,0x09,0x04,0x84,0x05,0x05,0x10,0x0f,0x11,0x12,0x39,0x2f,\r\n0xe1,0x32,0x32,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x01,0x33,0x01,0x04,0xa4,0xe4,0xfe,0x3e,0x04,0xa4,0xfe,0xc8,0x01,0xdc,0x04,0x01,0xae,0xd9,0xfe,0x23,0x01,0xea,0xfe,0x16,\r\n0x03,0x74,0x8c,0xfe,0x2d,0x01,0xd3,0xfe,0x10,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x06,0x90,0x05,0x9a,0x00,0x0d,0x00,0x3b,0x40,0x1f,0x05,0x91,0x40,0x0a,0x09,0x06,0x0a,0x91,0x2b,0x30,0x01,0x91,0x0c,0x0c,0x09,0x03,0x03,0x06,0x00,0x00,0x0f,0x02,0x7e,0x0b,0x03,0x03,0x0f,0x0a,0x06,0x7e,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,\r\n0xe1,0x11,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x10,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x06,0x90,0xfe,0x62,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0x02,0x46,0x05,0x00,0xfb,0x00,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,0x01,0x00,0xa6,\r\n0x00,0x00,0x05,0x2f,0x04,0x00,0x00,0x0d,0x00,0x3b,0x40,0x1f,0x05,0x95,0x40,0x0a,0x09,0x06,0x0a,0x95,0x2b,0x30,0x01,0x95,0x0c,0x0c,0x09,0x0f,0x03,0x06,0x00,0x00,0x0f,0x02,0x84,0x0b,0x03,0x03,0x0f,0x0a,0x05,0x84,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x11,0x39,0x2f,0x00,0x2f,0x33,0x3f,0x33,0x10,0xed,0x2b,0x00,0x18,\r\n0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x21,0x05,0x2f,0xfe,0xc9,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0x01,0xdb,0x03,0x74,0xfc,0x8c,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0x00,0x01,0x00,0xbc,0xfe,0x66,0x07,0xbe,0x05,0x9a,0x00,0x1b,0x00,0x45,0x40,0x27,0x0a,0x91,\r\n0x13,0x13,0x0c,0x0e,0x91,0x11,0x03,0x1a,0x91,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0c,0x0c,0x0f,0x13,0x0b,0x7e,0x01,0x42,0x0c,0x0c,0x10,0x17,0x7d,0x06,0x06,0x1d,0x0f,0x7e,0x10,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe2,0xe1,0x32,0x00,0x2f,0x33,0x10,0xde,0x32,0x5d,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,\r\n0x30,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x00,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x20,0x00,0x11,0x14,0x00,0x21,0x22,0x04,0x4c,0xa4,0x99,0xbc,0xcd,0xff,0x00,0xda,0x46,0xa8,0xfd,0x1a,0xa8,0x04,0x36,0x4a,0x01,0x26,0x01,0x5c,0xfe,0xd6,0xfe,0xfa,0xae,0xfe,0xb2,0xae,0x6c,0xe7,0xcd,0xd3,0x01,0x29,\r\n0xfd,0x5c,0x05,0x04,0xfa,0xfc,0x05,0x9a,0xfd,0x9e,0xfe,0x99,0xfe,0xdd,0xff,0xfe,0xb7,0x00,0x00,0x01,0x00,0xa6,0xfe,0x66,0x06,0x56,0x04,0x00,0x00,0x1b,0x00,0x44,0x40,0x26,0x0a,0x95,0x14,0x14,0x0c,0x0d,0x95,0x12,0x0f,0x1a,0x95,0x04,0x01,0x14,0x01,0x24,0x01,0x03,0x01,0x03,0x0c,0x0c,0x0f,0x13,0x0b,0x84,0x01,0x0c,0x0c,0x10,\r\n0x17,0x83,0x06,0x06,0x1d,0x0f,0x84,0x10,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x32,0x00,0x2f,0x33,0x10,0xde,0x32,0x5d,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,\r\n0x03,0x54,0x72,0x8e,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0xfd,0xf6,0xa4,0x03,0x52,0x42,0xf7,0x01,0x25,0xfe,0xeb,0xef,0x99,0xfe,0xa0,0xa4,0x4c,0xb6,0xa8,0xb9,0xd7,0xfe,0x1a,0x03,0x74,0xfc,0x8c,0x04,0x00,0xfe,0x74,0xfe,0xdb,0xf7,0xd5,0xfe,0xe3,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xb6,0x05,0xb2,0x00,0x3b,0x00,0x4f,0x00,0x4a,\r\n0x40,0x29,0x46,0x7d,0x21,0x1c,0x3a,0x2e,0x03,0x21,0x2b,0x7d,0x3c,0x21,0x0c,0x3c,0x3c,0x0c,0x21,0x03,0x51,0x15,0x7d,0x05,0x31,0x91,0x37,0x13,0x4b,0x1a,0x41,0x91,0x26,0x26,0x1a,0x10,0x91,0x0a,0x04,0x1a,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,\r\n0x2f,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x06,\r\n0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x02,0xff,0x8e,0xf6,0xb5,0x68,0x57,0xa9,0xf8,0xa0,0x24,0x23,0x0e,0x26,0x13,0x73,0xb5,0x7e,0x42,0x44,0x80,0xb6,0x72,0x41,0x3a,0x38,0x57,0x3b,0x1f,0x33,0x5e,0x89,0x55,0x5c,0x8a,0x5c,0x2f,0x76,0x62,0x18,0x32,0x1b,0x31,0x66,0x26,0x50,0x7a,0x42,0x74,\r\n0x35,0x78,0x01,0x33,0x18,0x2f,0x47,0x30,0x31,0x49,0x30,0x18,0x1c,0x35,0x4d,0x31,0x33,0x44,0x29,0x11,0x18,0x5f,0xb7,0x01,0x0f,0xaf,0xaa,0x01,0x17,0xc7,0x6e,0x08,0x99,0x04,0x05,0x53,0x9a,0xdb,0x87,0x81,0xd8,0x9c,0x58,0x0e,0x38,0x8b,0x9c,0xa6,0x52,0x86,0xd2,0x91,0x4c,0x4c,0x91,0xd2,0x86,0xc6,0xfe,0xd4,0x62,0x07,0x07,0x18,\r\n0x16,0x9b,0x28,0x1e,0x1b,0x3d,0x02,0xfb,0x5a,0x97,0x6f,0x3e,0x3c,0x6d,0x9a,0x5f,0x4f,0x96,0x87,0x71,0x29,0x2c,0x76,0x89,0x95,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x55,0x04,0x1a,0x00,0x38,0x00,0x48,0x00,0x54,0x40,0x31,0x1b,0x36,0x1e,0x28,0xef,0x39,0x43,0x84,0x1e,0x4f,0x39,0x01,0x39,0x0c,0x1e,0x1e,0x0c,0x39,0x03,0x4a,\r\n0x14,0x83,0x40,0x05,0x50,0x05,0x60,0x05,0x03,0x05,0x2e,0x95,0x34,0x16,0x46,0x19,0x3e,0x95,0x23,0x23,0x19,0x0f,0x95,0x0a,0x0f,0x19,0x95,0x00,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,\r\n0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x27,0x06,0x06,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,\r\n0x53,0x6a,0xb6,0x86,0x4d,0x43,0x7e,0xb4,0x71,0x1d,0x1a,0x19,0x1e,0x48,0x76,0x53,0x2d,0x2a,0x52,0x77,0x4d,0x1e,0x1c,0x44,0x4d,0x22,0x45,0x69,0x47,0x48,0x69,0x45,0x21,0x4d,0x42,0x0e,0x1d,0x10,0x23,0x4b,0x1c,0x39,0x5c,0x61,0x56,0x2a,0x5c,0x01,0x02,0x10,0x20,0x2c,0x1d,0x21,0x2f,0x1e,0x0e,0x44,0x3f,0x3d,0x35,0x18,0x44,0x85,\r\n0xc4,0x7f,0x7a,0xca,0x91,0x51,0x08,0x8d,0x09,0x3d,0x6b,0x92,0x54,0x57,0x91,0x6a,0x3b,0x03,0x4a,0xd5,0x86,0x44,0x84,0x69,0x41,0x3e,0x67,0x85,0x47,0x86,0xd4,0x4a,0x02,0x03,0x11,0x10,0x88,0x23,0x28,0x14,0x15,0x02,0x25,0x38,0x5b,0x41,0x24,0x28,0x44,0x5a,0x32,0x7e,0xb0,0x31,0x31,0xaf,0x00,0x01,0x00,0x5e,0xfe,0xae,0x04,0x8c,\r\n0x05,0xb2,0x00,0x23,0x00,0x52,0x40,0x2c,0x0a,0x0c,0xe2,0x40,0x07,0x10,0x80,0x02,0x10,0x16,0x30,0x19,0x01,0x19,0x19,0x1b,0x91,0x16,0x04,0x20,0x23,0x01,0x23,0x23,0x21,0x91,0x10,0x13,0x0a,0x0a,0x10,0x0e,0xc2,0x02,0x04,0x04,0x13,0x18,0x00,0x00,0x25,0x1e,0x7d,0x13,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0xf1,0x32,\r\n0xc2,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x25,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x24,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x37,0x04,0x8c,0x72,0xae,\r\n0x34,0x5a,0x4c,0x47,0x38,0x31,0x31,0x44,0x2d,0xfe,0xd1,0xfe,0x99,0x01,0x9e,0x01,0x3e,0xcc,0x86,0x9a,0xba,0xf7,0xfe,0xcd,0x01,0x1f,0xe9,0xd8,0x9e,0x3c,0x3c,0x12,0x54,0x40,0x4e,0x5e,0x16,0x6d,0x19,0x42,0x3e,0x50,0x04,0x01,0x89,0x01,0x3d,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,\r\n0x00,0x01,0x00,0x60,0xfe,0xae,0x03,0x62,0x04,0x18,0x00,0x23,0x00,0x4c,0x40,0x28,0x15,0x17,0xe2,0x40,0x12,0x24,0x80,0x0d,0x1b,0x21,0x00,0x00,0x02,0x95,0x21,0x10,0x30,0x0a,0x01,0x0a,0x0a,0x08,0x95,0x1b,0x16,0x15,0x15,0x1b,0x19,0xc2,0x0d,0x0f,0x0f,0x0a,0x1e,0x0b,0x00,0x05,0x83,0x1e,0x2f,0xe1,0x2f,0x33,0x11,0x12,0x39,0x2f,\r\n0x33,0xf1,0x32,0xc2,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x11,0x12,0x39,0x1a,0x10,0xdc,0x1a,0xfd,0xc6,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x27,0x26,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x03,0x62,\r\n0x72,0x82,0x9d,0xc9,0xbd,0x9f,0x86,0x76,0x58,0x72,0x32,0x59,0x4c,0x47,0x38,0x31,0x31,0x44,0x2e,0xc8,0xf4,0x01,0x22,0xf2,0x87,0x67,0x03,0x3e,0x50,0xe1,0xb7,0xb4,0xd0,0x59,0x9c,0x35,0x0e,0x54,0x3e,0x4f,0x5d,0x16,0x6d,0x19,0x42,0x40,0x50,0x0e,0x01,0x19,0xd7,0xfd,0x01,0x33,0x32,0x00,0x00,0x01,0x00,0x29,0xfe,0x80,0x04,0x0c,\r\n0x05,0x9a,0x00,0x0b,0x00,0x42,0xb9,0x00,0x05,0x01,0x30,0x40,0x14,0x01,0x08,0x91,0x0a,0x03,0x02,0x91,0x40,0x07,0x00,0x0e,0x02,0x09,0x07,0x42,0x09,0x09,0x07,0x0c,0x03,0xb8,0x01,0x2c,0xb7,0x06,0x06,0x02,0x7e,0x07,0x07,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,\r\n0x1a,0xed,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x04,0x0c,0xfe,0x62,0xc1,0x9b,0xce,0xfe,0x63,0x03,0xe3,0x05,0x02,0xfb,0x96,0xfd,0xe8,0x01,0x80,0x05,0x02,0x98,0x00,0x01,0x00,0x1e,0xfe,0x8a,0x03,0x29,0x04,0x00,0x00,0x0b,0x00,0x42,0xb9,0x00,0x05,0x01,0x31,0x40,0x14,0x01,\r\n0x08,0x95,0x0a,0x0f,0x02,0x95,0x40,0x07,0x00,0x0e,0x02,0x09,0x07,0x42,0x09,0x09,0x07,0x0c,0x03,0xb8,0x01,0x2c,0xb7,0x06,0x06,0x02,0x84,0x07,0x07,0x0d,0x0c,0x11,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,\r\n0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x29,0xfe,0xcd,0x98,0x8e,0xae,0xfe,0xcc,0x03,0x0b,0x03,0x74,0xfd,0x18,0xfd,0xfe,0x01,0x76,0x03,0x74,0x8c,0x00,0x01,0x00,0x29,0xfe,0x80,0x06,0xbc,0x05,0x9a,0x00,0x0f,0x00,0x50,0xb6,0x09,0x04,0x91,0x0c,0x07,0x03,0x01,0xb8,0x01,0x30,0x40,0x10,0x0e,0x0a,0x91,0x40,0x03,0x05,0x0e,0x03,0x0a,\r\n0x08,0x42,0x08,0x08,0x0b,0x0a,0x0f,0xb8,0x01,0x2c,0x40,0x0d,0x02,0x02,0x0e,0x7e,0x0b,0x0b,0x11,0x0a,0x7e,0x03,0x03,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,0x3f,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x21,\r\n0x35,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x06,0xbc,0x9b,0xfb,0xa5,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x02,0xe6,0xa8,0xc0,0xfe,0x80,0x01,0x80,0x05,0x02,0x98,0x98,0xfb,0x96,0x05,0x02,0xfa,0xfe,0x00,0x00,0x01,0x00,0x1e,0xfe,0x8b,0x05,0x3c,0x04,0x00,0x00,0x0f,0x00,0x50,0xb9,0x00,0x01,0x01,0x31,0x40,0x16,0x09,0x04,0x95,\r\n0x0c,0x06,0x0f,0x0e,0x0a,0x95,0x40,0x03,0x05,0x0e,0x03,0x0a,0x08,0x42,0x08,0x08,0x0b,0x0a,0x0f,0xb8,0x01,0x2c,0x40,0x0d,0x02,0x02,0x0e,0x84,0x0b,0x0b,0x11,0x0a,0x84,0x03,0x03,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,\r\n0x33,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x05,0x3c,0x8e,0xfc,0xa4,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x02,0x0a,0xa4,0x98,0xfe,0x8b,0x01,0x75,0x03,0x74,0x8c,0x8c,0xfd,0x18,0x03,0x74,0xfc,0x8c,0x00,0x00,0x01,0x00,0xa6,0xfe,0x80,0x05,0x42,0x05,0x9a,0x00,0x14,\r\n0x00,0x3d,0x40,0x0b,0x10,0x04,0x0e,0x91,0x06,0x06,0x03,0x11,0x0b,0x03,0x01,0xb8,0x01,0x30,0xb3,0x13,0x91,0x03,0x14,0xb8,0x01,0x2c,0x40,0x0b,0x02,0x02,0x12,0x7e,0x04,0x11,0x11,0x16,0x0b,0x7e,0x0a,0x2f,0xe1,0x11,0x39,0x2f,0x33,0xe1,0x32,0x2f,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x01,\r\n0x23,0x11,0x23,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x05,0x42,0x9c,0xcd,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0xc1,0xfe,0x80,0x01,0x80,0x02,0x85,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0xfa,0xfe,0x00,0x00,0x01,0x00,0x98,0xfe,0x8b,0x04,0x77,0x04,0x00,\r\n0x00,0x13,0x00,0x3d,0x40,0x0b,0x0f,0x04,0x0d,0xec,0x06,0x06,0x03,0x10,0x0a,0x0f,0x01,0xb8,0x01,0x31,0xb3,0x12,0x95,0x03,0x13,0xb8,0x01,0x2c,0x40,0x0b,0x02,0x02,0x11,0x84,0x04,0x0f,0x0f,0x15,0x0a,0x84,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x32,0x2f,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,\r\n0x30,0x01,0x23,0x11,0x23,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x04,0x77,0x8d,0xae,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0x98,0xfe,0x8b,0x01,0x75,0x01,0x9c,0x62,0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xfc,0x8c,0x00,0x02,0x00,0x29,0xff,0xe8,0x06,0x58,0x05,0xb2,\r\n0x00,0x1c,0x00,0x23,0x00,0x56,0x40,0x19,0x13,0x0c,0x18,0x01,0x91,0x40,0x23,0x1b,0x09,0x23,0x91,0x2b,0x30,0x20,0x91,0x1b,0x04,0x06,0x04,0x91,0x40,0x09,0x13,0x13,0x15,0xb8,0x01,0x2c,0x40,0x13,0x10,0x0c,0x80,0x06,0x06,0x0c,0x00,0x7d,0x1d,0x1d,0x25,0x0c,0x23,0x42,0x01,0x7d,0x18,0x42,0x0c,0x2f,0xe1,0xf1,0xe1,0x11,0x12,0x39,\r\n0x2f,0xe1,0x11,0x39,0x2f,0x1a,0x10,0xdd,0xe1,0x32,0x00,0x3f,0x1a,0xfd,0xc6,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x32,0xc4,0x31,0x30,0x01,0x21,0x16,0x00,0x33,0x20,0x37,0x15,0x06,0x21,0x20,0x00,0x03,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x33,0x12,0x00,0x21,0x20,0x03,0x26,0x02,0x23,0x22,0x00,0x07,\r\n0x06,0x58,0xfb,0xa2,0x10,0x01,0x1c,0xda,0x01,0x09,0xc2,0xc5,0xfe,0xe4,0xfe,0xda,0xfe,0x95,0x0f,0x1d,0x7c,0x88,0x27,0x8f,0x29,0x84,0x12,0x1d,0x01,0x6f,0x01,0x16,0x02,0x6a,0xb4,0x08,0xe7,0xc9,0xd0,0xfe,0xf6,0x16,0x02,0x7f,0xeb,0xfe,0xeb,0xa4,0xaa,0x91,0x01,0x6a,0x01,0x2d,0x8b,0x7d,0x5e,0x4a,0x47,0x52,0x80,0x01,0x30,0x01,\r\n0x6c,0xfd,0x64,0xed,0x01,0x17,0xfe,0xe4,0xe8,0x00,0x00,0x02,0x00,0x29,0xff,0xe8,0x04,0xc4,0x04,0x18,0x00,0x1e,0x00,0x25,0x00,0x5f,0x40,0x0e,0x13,0x0c,0x0c,0x01,0x95,0x18,0x25,0x25,0x04,0x22,0x95,0x1b,0x10,0x06,0xb8,0xff,0xc0,0x40,0x15,0x09,0x0e,0x48,0x06,0x06,0x04,0x95,0x09,0x16,0x18,0x00,0x0c,0x25,0x1f,0x01,0x06,0x06,\r\n0x00,0x0c,0x13,0x15,0xb8,0x01,0x2c,0x40,0x0a,0x10,0x0c,0x00,0x83,0x1f,0x1f,0x27,0x01,0x83,0x0c,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xdd,0xe1,0x32,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0xed,0x32,0x2f,0x2b,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xc4,0x31,0x30,0x01,0x21,0x16,0x16,0x33,0x32,0x37,\r\n0x15,0x06,0x23,0x22,0x02,0x27,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x33,0x36,0x24,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x04,0xc4,0xfd,0x2e,0x04,0xaf,0x9b,0xac,0x91,0x87,0xde,0xd0,0xf7,0x09,0x1b,0x77,0x8d,0x27,0x89,0x29,0x8a,0x14,0x1c,0x01,0x04,0xb0,0xca,0xdc,0xa8,0x01,0x85,0x7a,0x74,\r\n0xa2,0x12,0x01,0xd7,0xab,0xba,0x72,0x9a,0x62,0x01,0x04,0xeb,0x85,0x6f,0x55,0x4a,0x47,0x4a,0x77,0xc8,0xee,0xfe,0xfc,0xe7,0x35,0x8d,0x9f,0xa6,0x86,0x00,0xff,0xff,0x00,0x29,0xfe,0x80,0x06,0x58,0x05,0xb2,0x02,0x26,0x06,0x1d,0x00,0x00,0x00,0x06,0x0b,0x51,0x00,0x00,0xff,0xff,0x00,0x29,0xfe,0x8a,0x04,0xc4,0x04,0x18,0x02,0x26,\r\n0x06,0x1e,0x00,0x00,0x00,0x06,0x0b,0x52,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0xff,0xea,0x00,0x00,0x07,0x02,0x07,0x1a,0x02,0x26,0x01,0xed,0x00,0x00,0x01,0x07,0x00,0xda,0x02,0x3f,0x01,0x5c,0x00,0x13,0x40,0x0b,0x01,0x00,0x24,0x1e,0x0d,0x00,0x25,0x01,0x21,0x05,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xf6,0x05,0xbe,0x02,0x26,0x02,0x0d,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0xc7,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x00,0x1c,0x16,0x09,0x00,0x25,0x01,0x19,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x01,0x00,0xbe,0xfe,0x66,0x04,0x4c,0x05,0x9a,\r\n0x00,0x19,0x00,0x42,0x40,0x24,0x01,0x15,0x18,0x91,0x13,0x13,0x15,0x19,0x17,0x03,0x07,0x91,0x04,0x0a,0x14,0x0a,0x24,0x0a,0x03,0x0a,0x0c,0x15,0x19,0x00,0x00,0x04,0x7d,0x0f,0x0f,0x1b,0x01,0x18,0x14,0x7e,0x0a,0x15,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x00,0x2f,0xde,0x32,0x5d,0xed,0x3f,0x33,0x12,0x39,\r\n0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x01,0x16,0x00,0x11,0x14,0x00,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x00,0x23,0x23,0x11,0x23,0x11,0x33,0x11,0x01,0x04,0x4c,0xfd,0xce,0xfa,0x01,0x1d,0xfe,0xd6,0xfe,0xf9,0xae,0x94,0xa4,0x9a,0xbc,0xcd,0xfe,0xff,0xda,0x46,0xa6,0xa6,0x02,0x17,0x05,0x9a,0xfd,0x97,0x21,0xfe,0xa1,\r\n0xfe,0xfd,0xff,0xfe,0xb7,0x4c,0xae,0x6c,0xea,0xca,0xd6,0x01,0x26,0xfd,0x5c,0x05,0x9a,0xfd,0xa0,0x02,0x60,0x00,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xae,0x04,0x00,0x00,0x1a,0x00,0x42,0x40,0x24,0x01,0x14,0x19,0x95,0x13,0x13,0x14,0x1a,0x17,0x0f,0x07,0xec,0x04,0x0a,0x14,0x0a,0x24,0x0a,0x03,0x0a,0x0c,0x14,0x1a,0x00,0x00,0x04,\r\n0x83,0x0f,0x0f,0x1c,0x17,0x01,0x14,0x84,0x0a,0x15,0x2f,0x33,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x32,0x2f,0x33,0x00,0x2f,0xde,0x32,0x5d,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x01,0x16,0x12,0x15,0x14,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x33,0x11,0x33,\r\n0x01,0x03,0xae,0xfe,0x4c,0xc8,0xe6,0xfe,0xea,0xee,0x99,0x65,0x72,0x8e,0xa7,0xb5,0xda,0xbe,0x20,0xa4,0xa4,0x02,0x01,0x87,0x04,0x00,0xfe,0x6c,0x20,0xfe,0xe5,0xd9,0xd6,0xfe,0xe4,0x3a,0xa4,0x4c,0xb6,0xa8,0xb9,0xd7,0xfe,0x1a,0x04,0x00,0xfe,0x74,0x01,0x8c,0x00,0x01,0x00,0xbc,0xfe,0x66,0x04,0xf2,0x05,0x9a,0x00,0x18,0x00,0x40,\r\n0x40,0x22,0x0a,0x7e,0x18,0x07,0x18,0x11,0x18,0x11,0x18,0x1a,0x06,0x02,0x7e,0x03,0x11,0x13,0x92,0x0e,0x08,0x03,0x01,0x91,0x06,0x40,0x04,0x03,0x06,0x91,0x2b,0x30,0x04,0x03,0x03,0x12,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x3f,0x2f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xe1,0x31,0x30,\r\n0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x07,0x06,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x36,0x35,0x04,0x4a,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x95,0x94,0xfe,0xf8,0xae,0x94,0xa4,0x9a,0x5e,0x95,0x33,0x67,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfb,0x14,0xff,0xa4,0xa5,0x4c,0xae,0x6c,\r\n0x3a,0x3b,0x74,0xcb,0x00,0x01,0x00,0xa6,0xfe,0x66,0x03,0xf8,0x04,0x00,0x00,0x19,0x00,0x3a,0x40,0x1f,0x0a,0x84,0x07,0x12,0x03,0x19,0x19,0x1b,0x06,0x02,0x84,0x03,0x14,0x95,0x0f,0x08,0x0f,0x01,0x95,0x06,0x40,0x04,0x03,0x06,0x95,0x2b,0x30,0x04,0x0f,0x03,0x15,0x00,0x3f,0x3f,0x2b,0x00,0x1a,0x18,0x10,0xed,0x3f,0x2f,0xed,0x01,\r\n0x2f,0xe1,0x32,0x12,0x39,0x2f,0x12,0x39,0x33,0xe1,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x03,0x54,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x46,0x46,0x8b,0xef,0x9a,0x64,0x75,0x8b,0x54,0x83,0x5a,0x2f,0x01,0xd1,0xfe,0x2f,0x04,0x00,\r\n0xfe,0x5c,0x01,0xa4,0xfc,0x69,0x72,0xbc,0x47,0x8e,0x3a,0xa0,0x4e,0x31,0x5c,0x85,0x54,0x00,0x00,0x01,0x00,0xa6,0xfe,0x80,0x04,0x81,0x05,0x9a,0x00,0x14,0x00,0x38,0xb9,0x00,0x02,0x01,0x30,0x40,0x0f,0x10,0x91,0x08,0x08,0x01,0x13,0x0d,0x03,0x05,0x91,0x01,0x00,0x7e,0x12,0x01,0xb8,0x01,0x2c,0xb7,0x04,0x12,0x06,0x06,0x16,0x0e,\r\n0x7e,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xd6,0xe1,0x10,0xe1,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x3f,0x31,0x30,0x21,0x23,0x11,0x23,0x11,0x33,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0xd7,0x9c,0xcb,0xe5,0xc5,0xbc,0xcd,0xa8,0xf6,0xb2,0xe3,0xa8,0xfe,0x80,0x02,0x18,0x01,\r\n0xed,0x79,0xc3,0xb0,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0x00,0x01,0x00,0x98,0xfe,0x8a,0x03,0xdf,0x04,0x00,0x00,0x13,0x00,0x3d,0x40,0x0b,0x11,0x06,0x0f,0xec,0x08,0x08,0x01,0x12,0x0c,0x0f,0x02,0xb8,0x01,0x31,0xb3,0x05,0x95,0x01,0x01,0xb8,0x01,0x2c,0x40,0x0b,0x04,0x00,0x84,0x06,0x06,0x11,0x11,0x15,0x0c,0x84,0x0b,0x2f,\r\n0xe1,0x12,0x39,0x2f,0x33,0x10,0xe1,0xd6,0xe1,0x00,0x2f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x23,0x11,0x33,0x11,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x03,0xdf,0xb0,0x8b,0x98,0xb4,0x98,0xfe,0xa8,0xa4,0xc2,0x94,0xaa,0xa3,0xfe,0x8a,0x02,0x02,0x01,0x10,0x62,\r\n0x01,0x6c,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x07,0x19,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x55,0x01,0x5b,0x00,0x08,0xb3,0x02,0x13,0x05,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0xbe,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x00,0xda,\r\n0x00,0xc6,0x00,0x00,0x00,0x08,0xb3,0x02,0x23,0x11,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x06,0xe2,0x02,0x26,0x00,0x24,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xe6,0x01,0x5b,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xf2,0x40,0x0a,0x1f,0x19,0x05,0x00,0x25,0x03,0x02,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,\r\n0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x83,0x05,0x87,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x14,0x2f,0x29,0x08,0x14,0x25,0x03,0x02,0x2c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0a,0x00,0x00,0x06,0x83,0x05,0x9a,0x02,0x06,0x00,0x91,\r\n0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x06,0x56,0x04,0x18,0x02,0x06,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x07,0x1b,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x13,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x12,0x12,0x0c,0x02,0x0b,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,\r\n0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xdd,0x05,0xbe,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xe5,0x00,0x00,0x00,0x13,0x40,0x0b,0x02,0x00,0x20,0x1a,0x0c,0x12,0x25,0x02,0x1d,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x02,0x00,0x56,0xff,0xe8,0x05,0x66,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x3f,0x40,0x23,\r\n0x12,0x91,0x40,0x01,0x09,0x0f,0x01,0x91,0x2b,0x30,0x2f,0x06,0x01,0x06,0x06,0x04,0x91,0x09,0x04,0x16,0x91,0x0f,0x13,0x06,0x06,0x00,0x0c,0x7d,0x01,0x12,0x12,0x1a,0x13,0x7d,0x00,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x13,0x21,0x26,\r\n0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x25,0x21,0x16,0x12,0x33,0x32,0x00,0x56,0x04,0x5e,0x11,0xfe,0xe5,0xda,0xd8,0x9c,0x9e,0xe2,0x01,0x3f,0x01,0x6d,0xfe,0x94,0xfe,0xd3,0xfe,0xd1,0xfe,0xb8,0x04,0x5e,0xfc,0x56,0x04,0xf2,0xcf,0xcf,0x01,0x02,0x03,0x1a,0xed,0x01,0x13,0x60,0xa4,0x54,0xfe,\r\n0x76,0xfe,0xa5,0xfe,0xbe,0xfe,0x5d,0x01,0x9f,0xfc,0xeb,0xfe,0xe7,0x01,0x18,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0xcf,0x04,0x18,0x02,0x06,0x05,0x07,0x00,0x00,0xff,0xff,0x00,0x56,0xff,0xe8,0x05,0x66,0x06,0xe4,0x02,0x26,0x06,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x2a,0x01,0x5d,0x00,0x1a,0xb1,0x03,0x02,0xb8,0xff,0xec,\r\n0x40,0x0a,0x28,0x22,0x00,0x0c,0x25,0x03,0x02,0x25,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x52,0xff,0xe8,0x03,0xcf,0x05,0x87,0x02,0x26,0x05,0x07,0x00,0x00,0x01,0x06,0x00,0x8f,0x7a,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x0a,0x29,0x23,0x12,0x0c,0x25,0x03,0x02,0x26,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,\r\n0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xea,0x00,0x00,0x07,0x02,0x06,0xe4,0x02,0x26,0x01,0xed,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0xd6,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x2d,0x27,0x0d,0x00,0x25,0x02,0x01,0x2a,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x04,0x00,0x00,0x05,0xf6,0x05,0x87,\r\n0x02,0x26,0x02,0x0d,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x54,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0a,0x25,0x1f,0x09,0x00,0x25,0x02,0x01,0x22,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xe2,0x06,0xe4,0x02,0x26,0x01,0xee,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x61,\r\n0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xe0,0x40,0x0a,0x33,0x2d,0x01,0x1f,0x25,0x02,0x01,0x30,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0xe7,0x03,0x3b,0x05,0x87,0x02,0x26,0x02,0x0e,0x00,0x00,0x01,0x06,0x00,0x8f,0x11,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf6,0x40,0x0a,0x31,0x2b,\r\n0x12,0x16,0x25,0x02,0x01,0x2e,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x01,0x00,0x52,0xff,0xe8,0x03,0xd3,0x05,0x9a,0x00,0x16,0x00,0x3f,0x40,0x20,0x0f,0x96,0x09,0x09,0x15,0x0b,0x91,0x0c,0x03,0x01,0x03,0x91,0x15,0x13,0x0a,0x0f,0x0e,0x09,0x09,0x06,0x01,0x0e,0x0b,0x0e,0x0b,0x01,0x12,0x7d,0x06,0x06,0x18,0x01,\r\n0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x01,0x21,0x35,0x21,0x15,0x01,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0x52,0xa8,0xd5,0x9f,0xb3,0xfe,0xa1,0x91,0x01,0x8f,0xfd,0xaa,\r\n0x03,0x56,0xfe,0x7a,0xc0,0xd9,0xfe,0xee,0xf9,0xf2,0x3c,0xb6,0x7b,0xa4,0x83,0x01,0x1e,0x02,0x46,0x98,0x28,0xfd,0xc8,0xdc,0xb6,0xca,0xf6,0x00,0xff,0xff,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x02,0x06,0x05,0x97,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0x8c,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0xd9,\r\n0x01,0xd6,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x14,0x16,0x17,0x0a,0x13,0x25,0x01,0x15,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x05,0x2f,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x1e,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x07,0x10,0x11,0x07,0x0d,0x25,0x01,0x0f,0x11,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x06,0xe4,0x02,0x26,0x01,0xef,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x6f,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x11,0x23,0x1d,0x0a,0x13,0x25,0x02,0x01,0x20,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,\r\n0x04,0x00,0x05,0x87,0x02,0x26,0x02,0x0f,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xce,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x1b,0x1d,0x17,0x07,0x0d,0x25,0x02,0x01,0x1a,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe4,0x02,0x26,0x00,0x32,0x00,0x00,0x01,0x07,0x00,0x8f,\r\n0x01,0x67,0x01,0x5d,0x00,0x17,0x40,0x0d,0x03,0x02,0x03,0x27,0x21,0x03,0x09,0x25,0x03,0x02,0x24,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x87,0x02,0x26,0x00,0x52,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x03,0x02,0x00,0x27,0x21,0x03,\r\n0x09,0x25,0x03,0x02,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x06,0xe4,0x02,0x26,0x02,0xcf,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x67,0x01,0x5d,0x00,0x17,0x40,0x0d,0x04,0x03,0x03,0x29,0x23,0x03,0x09,0x25,0x04,0x03,0x26,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,\r\n0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0x87,0x02,0x26,0x02,0xd0,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xb7,0x00,0x00,0x00,0x17,0x40,0x0d,0x04,0x03,0x00,0x27,0x21,0x03,0x09,0x25,0x04,0x03,0x24,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x04,0x90,0x06,0xe4,0x02,0x26,\r\n0x02,0x04,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0x76,0x01,0x5d,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x9a,0x40,0x0a,0x28,0x22,0x0f,0x14,0x25,0x02,0x01,0x25,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x5a,0x05,0x87,0x02,0x26,0x02,0x24,0x00,0x00,0x01,0x06,0x00,0x8f,0xf0,0x00,0x00,0x1a,\r\n0xb1,0x02,0x01,0xb8,0xff,0xb6,0x40,0x0a,0x28,0x22,0x01,0x14,0x25,0x02,0x01,0x25,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x06,0x8c,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x32,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x05,0x17,0x16,0x0d,0x00,0x25,0x01,0x17,0x05,\r\n0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x2f,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xc4,0x00,0x00,0x00,0x13,0x40,0x0b,0x01,0x0f,0x17,0x18,0x0c,0x00,0x25,0x01,0x16,0x11,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x06,0xe4,\r\n0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xca,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x00,0x25,0x1f,0x0d,0x00,0x25,0x02,0x01,0x22,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x05,0x87,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x06,0x00,0x8f,0x50,0x00,0x00,0x17,\r\n0x40,0x0d,0x02,0x01,0x00,0x24,0x1e,0x0c,0x00,0x25,0x02,0x01,0x21,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x3c,0xff,0xe7,0x04,0x96,0x07,0x5c,0x02,0x26,0x01,0xfa,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x52,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x4c,0x1c,0x16,0x0d,0x00,0x25,0x02,0x01,0x1c,0x05,\r\n0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x0e,0xfe,0x1e,0x03,0xd5,0x06,0x00,0x02,0x26,0x00,0x5c,0x00,0x00,0x01,0x07,0x00,0xde,0x00,0xf0,0x00,0x00,0x00,0x17,0x40,0x0d,0x02,0x01,0x62,0x1b,0x15,0x0c,0x00,0x25,0x02,0x01,0x1b,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,\r\n0x00,0x00,0x04,0x81,0x06,0xe4,0x02,0x26,0x01,0xfe,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xf6,0x01,0x5d,0x00,0x17,0x40,0x0d,0x02,0x01,0x03,0x20,0x1a,0x08,0x10,0x25,0x02,0x01,0x1d,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x98,0x00,0x00,0x03,0xdf,0x05,0x87,0x02,0x26,0x02,0x1e,0x00,0x00,0x01,0x07,\r\n0x00,0x8f,0x00,0x92,0x00,0x00,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0xf7,0x40,0x0a,0x1f,0x19,0x07,0x0f,0x25,0x02,0x01,0x1c,0x11,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x87,0x06,0xe3,0x02,0x26,0x02,0x02,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x87,0x01,0x5c,0x00,0x17,0x40,0x0d,0x04,0x03,\r\n0x06,0x26,0x20,0x05,0x03,0x25,0x04,0x03,0x23,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x05,0x06,0x05,0x87,0x02,0x26,0x02,0x22,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x33,0x00,0x00,0x00,0x1a,0xb1,0x04,0x03,0xb8,0xff,0xfd,0x40,0x0a,0x25,0x1f,0x05,0x03,0x25,0x04,0x03,0x22,0x11,0x26,\r\n0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0x02,0x00,0x56,0x00,0x00,0x03,0xd1,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x24,0x40,0x12,0x0c,0x91,0x08,0x08,0x09,0x03,0x0b,0x91,0x00,0x00,0x7e,0x08,0x0b,0x0b,0x14,0x0f,0x7d,0x04,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0xed,0x3f,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x22,0x26,\r\n0x35,0x34,0x36,0x33,0x21,0x11,0x33,0x03,0x11,0x23,0x20,0x11,0x14,0x16,0x33,0x03,0xd1,0xfe,0x56,0xd8,0xf9,0xee,0xd4,0x01,0x11,0xa8,0xa8,0xeb,0xfe,0xc8,0xa3,0x95,0xe6,0xc6,0xc1,0xcd,0x02,0x60,0xfa,0xfe,0x02,0x0a,0xff,0x00,0x7d,0x8d,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x02,0x06,0x00,0x47,0x00,0x00,0x00,0x02,\r\n0x00,0x64,0xff,0xe8,0x06,0x58,0x05,0x9a,0x00,0x19,0x00,0x22,0x00,0x3a,0x40,0x1e,0x06,0x08,0x1b,0x91,0x18,0x0f,0x0f,0x11,0x03,0x15,0x20,0x91,0x03,0x08,0x13,0x06,0x12,0x7e,0x0f,0x1a,0x1a,0x0b,0x00,0x7e,0x17,0x17,0x24,0x1e,0x7d,0x0b,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x39,0x00,0x3f,0x33,0xed,0x32,0x3f,\r\n0x39,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x11,0x23,0x20,0x11,0x10,0x21,0x32,0x36,0x06,0x58,0xd1,0xbf,0x69,0xad,0x2b,0x73,0xed,0xd2,0xf1,0xf2,0xd1,0x01,0x11,0xa7,0x7f,0x6d,0xe5,0xa8,0xfc,\r\n0xe0,0xec,0xfe,0xc8,0x01,0x2a,0x63,0x97,0x01,0x92,0xc8,0xe2,0x63,0x5d,0xc0,0xeb,0xcb,0xc2,0xda,0x02,0x60,0xfb,0xf6,0x79,0x98,0x01,0x1f,0x01,0x9c,0xfe,0x38,0x01,0x30,0xfe,0xf2,0xfe,0xeb,0x82,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x70,0x05,0xec,0x00,0x1a,0x00,0x27,0x00,0x3f,0x40,0x21,0x19,0x19,0x0d,0x25,0x11,0x00,0x0f,0x1f,\r\n0x95,0x0d,0x10,0x16,0x05,0x25,0x95,0x03,0x07,0x16,0x05,0x13,0x84,0x11,0x1b,0x1b,0x0a,0x1a,0x83,0x19,0x19,0x29,0x22,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x39,0x00,0x3f,0x33,0xed,0x32,0x32,0x3f,0xed,0x32,0x3f,0x11,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x22,0x02,0x35,\r\n0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x70,0xca,0xb6,0xf4,0x4e,0x7c,0xfe,0xf1,0xd9,0xea,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x7e,0x64,0xd6,0xa8,0xfc,0xfc,0xa4,0x7e,0x96,0xac,0xa6,0x8a,0x89,0xab,0x01,0x83,0xbf,\r\n0xdc,0xe3,0xe3,0x01,0x14,0xec,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfb,0x95,0x75,0x9a,0x01,0x1a,0xa1,0x5e,0x97,0x7c,0xac,0xdc,0xc2,0xb2,0xcc,0xc6,0x00,0x01,0x00,0x29,0xff,0xe8,0x05,0xf6,0x05,0xb2,0x00,0x24,0x00,0x4b,0x40,0x27,0x1c,0x1b,0x08,0x91,0x0b,0x0b,0x03,0x23,0x23,0x20,0x13,0x11,0x91,0x16,0x04,0x20,0x91,0x03,0x13,0x1c,\r\n0x09,0x19,0x7d,0x0e,0x09,0x0e,0x09,0x13,0x1e,0x7d,0x06,0x06,0x13,0x24,0x7e,0x23,0x23,0x26,0x13,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x02,0x21,0x23,0x35,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x04,0x13,0x12,0x33,0x32,0x11,0x11,0x33,0x05,0xf6,0xd2,0xbe,0xb9,0xdd,0x05,0x09,0xfe,0x94,0x96,0x8a,0x9f,0xaf,0x92,0x7f,0xb3,0xab,0x9e,0xcf,0xcc,0xea,0xfe,0xf0,0x01,0x32,0x0f,0x0c,0xdf,0xe6,0xa8,0x01,0x92,0xc9,0xe1,0xeb,0xb9,0x01,\r\n0x14,0x8b,0x8c,0x7c,0x6d,0x81,0x71,0xaa,0x58,0xc3,0x9d,0xfe,0xe9,0x49,0x04,0x26,0xfe,0xce,0xfe,0xe9,0x01,0x1f,0x01,0x9c,0x00,0x01,0x00,0x1e,0xff,0xe8,0x05,0x56,0x04,0x18,0x00,0x22,0x00,0x4b,0x40,0x27,0x22,0x22,0x03,0x1a,0x19,0x09,0x95,0x0a,0x0a,0x1e,0x12,0x10,0x95,0x15,0x10,0x1e,0x95,0x03,0x16,0x1a,0x09,0x17,0x84,0x0d,\r\n0x09,0x0d,0x09,0x12,0x1c,0x84,0x05,0x05,0x12,0x22,0x83,0x21,0x21,0x24,0x12,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x20,0x03,0x26,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,\r\n0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,0x16,0x17,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0x56,0xcc,0xb5,0xfe,0xb7,0x3a,0x0e,0x7c,0x9f,0x65,0x61,0x01,0x04,0x77,0x68,0x96,0x96,0xaa,0x8e,0x01,0x77,0xd3,0xda,0x20,0x20,0xbf,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0x01,0x4b,0x52,0x43,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d,\r\n0xfe,0xee,0xbd,0x33,0x04,0x12,0xc2,0xcc,0x01,0x1a,0xa1,0x00,0x00,0x01,0x00,0x29,0xfe,0x80,0x04,0x3a,0x05,0xb2,0x00,0x1f,0x00,0x4e,0x40,0x0d,0x1a,0x19,0x07,0x91,0x08,0x08,0x03,0x11,0x0f,0x91,0x14,0x04,0x01,0xb8,0x01,0x30,0x40,0x0e,0x1e,0x91,0x03,0x1a,0x07,0x17,0x7d,0x0c,0x07,0x0c,0x07,0x03,0x11,0x1f,0xb8,0x01,0x2c,0xb7,\r\n0x02,0x02,0x1e,0x7e,0x03,0x03,0x21,0x11,0x2f,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x2f,0xed,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,\r\n0x10,0x05,0x15,0x16,0x16,0x15,0x15,0x33,0x04,0x3a,0x9c,0xcd,0xfe,0x85,0x96,0x8a,0x9f,0xaf,0x92,0x7f,0xb3,0xab,0x9e,0xcf,0xcc,0xea,0xfe,0xf0,0x93,0xaa,0xc1,0xfe,0x80,0x01,0x80,0x01,0x8c,0x01,0x14,0x8b,0x8c,0x7c,0x6d,0x81,0x71,0xaa,0x58,0xc3,0x9d,0xfe,0xe9,0x49,0x04,0x11,0xbb,0x8e,0xfc,0x00,0x00,0x01,0x00,0x1e,0xfe,0x8b,\r\n0x03,0x8e,0x04,0x18,0x00,0x1d,0x00,0x4e,0x40,0x0d,0x18,0x17,0x07,0x95,0x08,0x08,0x03,0x10,0x0e,0x95,0x13,0x10,0x01,0xb8,0x01,0x31,0x40,0x0e,0x1c,0x95,0x03,0x18,0x07,0x15,0x84,0x0b,0x07,0x0b,0x07,0x03,0x10,0x1d,0xb8,0x01,0x2c,0xb7,0x02,0x02,0x1c,0x84,0x03,0x03,0x1f,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x32,0x2f,0xe1,0x11,0x12,\r\n0x39,0x39,0x2f,0x2f,0xe1,0x11,0x39,0x00,0x2f,0xed,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x34,0x21,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x07,0x15,0x16,0x16,0x15,0x15,0x33,0x03,0x8e,0x8e,0xae,0xfe,0xd7,0x65,0x61,0x01,0x04,0x77,0x68,\r\n0x96,0x96,0xaa,0x8e,0x01,0x77,0xd3,0x71,0x8b,0x98,0xfe,0x8b,0x01,0x75,0x01,0x1c,0xac,0x8c,0xa2,0x44,0x54,0x4c,0x99,0x3d,0xfe,0xee,0xbd,0x33,0x04,0x09,0x87,0x6a,0x8c,0x00,0x00,0x01,0x00,0x18,0xff,0xe8,0x06,0xc2,0x05,0x9a,0x00,0x1c,0x00,0x3c,0x40,0x20,0x1c,0x1c,0x18,0x07,0x91,0x14,0x03,0x18,0x91,0x03,0x13,0x0e,0x10,0x91,\r\n0x0b,0x13,0x15,0x7e,0x06,0x06,0x1a,0x09,0x7e,0x12,0x00,0x7e,0x1a,0x12,0x1a,0x12,0x1e,0x0e,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xe1,0x10,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,\r\n0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x06,0xc2,0xd2,0xbd,0xba,0xdb,0xfe,0x2d,0xfe,0x97,0x28,0x22,0x1c,0x20,0xd7,0x03,0x1b,0x7e,0x71,0xe5,0xa8,0x01,0x9a,0xcb,0xe7,0xf2,0xb8,0x03,0x70,0xfd,0x36,0xfd,0xb6,0x0a,0x96,0x0b,0x01,0xae,0x03,0x69,0xfc,0x08,0x81,0xa2,0x01,0x21,0x01,0x9a,0x00,0x00,0x01,0x00,0x14,0xff,0xe8,\r\n0x05,0xee,0x04,0x00,0x00,0x1c,0x00,0x46,0x40,0x1a,0x1c,0x1c,0x18,0x07,0x95,0x14,0x0f,0x0e,0x10,0x95,0x0b,0x0b,0x1d,0x18,0x95,0x03,0x16,0x15,0x84,0x06,0x06,0x12,0x1c,0x83,0x1b,0x09,0xb8,0x01,0x2e,0xb6,0x12,0x1b,0x12,0x1b,0x12,0x1e,0x0e,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,\r\n0x12,0x39,0x7c,0x2f,0x18,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x05,0xee,0xcc,0xb6,0xb1,0xd3,0xfe,0xa4,0xfe,0xc6,0x25,0x19,0x15,0x25,0xa4,0x02,0x9a,0x77,0x67,0xdc,0xa8,\r\n0x01,0x83,0xbd,0xde,0xdd,0xb6,0x01,0xf9,0xfe,0x2a,0xfe,0x54,0x08,0x8b,0x0a,0x01,0x17,0x02,0x6e,0xfd,0x85,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x01,0x00,0xbc,0xff,0xe8,0x07,0x6e,0x05,0x9a,0x00,0x18,0x00,0x41,0x40,0x23,0x17,0x17,0x08,0x91,0x40,0x0d,0x0c,0x09,0x0d,0x91,0x2b,0x30,0x0f,0x0c,0x03,0x14,0x91,0x03,0x13,0x09,0x10,0x7e,\r\n0x0e,0x07,0x07,0x0a,0x00,0x7e,0x16,0x16,0x1a,0x0d,0x08,0x7e,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0x3f,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x33,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,\r\n0x11,0x33,0x07,0x6e,0xd3,0xbc,0xba,0xdb,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x7e,0x72,0xe4,0xa8,0x01,0x9a,0xcd,0xe5,0xf2,0xb8,0xfc,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfc,0x08,0x81,0xa2,0x01,0x21,0x01,0x9a,0x00,0x01,0x00,0xa6,0xff,0xe8,0x06,0x5a,0x04,0x00,0x00,0x18,0x00,0x44,0x40,0x24,0x17,0x17,0x03,0x08,0x95,0x40,\r\n0x0d,0x0c,0x09,0x0d,0x95,0x2b,0x30,0x0f,0x0c,0x0f,0x14,0x95,0x03,0x16,0x09,0x11,0x84,0x0e,0x07,0x07,0x0a,0x00,0x83,0x16,0x16,0x1a,0x0d,0x08,0x84,0x0a,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x2f,0x3f,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x7c,0x2f,0x31,0x30,0x01,0x14,0x06,0x23,\r\n0x22,0x26,0x35,0x35,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x06,0x5a,0xcc,0xb5,0xb1,0xd4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x78,0x67,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0xdc,0xb7,0x56,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfd,0x85,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x01,0x00,0x5e,\r\n0xff,0xe8,0x05,0x62,0x05,0xb2,0x00,0x1a,0x00,0x3e,0x40,0x22,0x18,0x91,0x19,0x19,0x09,0x14,0x1f,0x0c,0x2f,0x0c,0x02,0x0c,0x0c,0x0e,0x91,0x09,0x04,0x14,0x91,0x03,0x13,0x18,0x0c,0x18,0x0c,0x06,0x00,0x7e,0x17,0x17,0x1c,0x11,0x7d,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,\r\n0x5d,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x12,0x37,0x21,0x35,0x21,0x05,0x62,0xfe,0xb5,0xfe,0xdd,0xfe,0xc9,0xfe,0xa1,0x01,0xa5,0x01,0x43,0xea,0x9f,0xae,0xee,0xf1,0xfe,0xcc,0x01,0x07,0xe5,0xcc,0xf2,0x04,0xfe,0x46,\r\n0x02,0x60,0x02,0x8e,0xfe,0xd0,0xfe,0x8a,0x01,0x8a,0x01,0x48,0x01,0x4d,0x01,0xab,0x4c,0xba,0x6e,0xfe,0xb4,0xfe,0xf8,0xfe,0xef,0xfe,0xca,0x01,0x07,0xd8,0x98,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xf4,0x04,0x18,0x00,0x1a,0x00,0x40,0x40,0x24,0x18,0x95,0x19,0x19,0x09,0x14,0x3f,0x0c,0x4f,0x0c,0x5f,0x0c,0x03,0x0c,0x0c,0x0e,\r\n0x95,0x09,0x10,0x14,0x95,0x03,0x16,0x19,0x0c,0x19,0x0c,0x11,0x1a,0x83,0x17,0x17,0x1c,0x11,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x23,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x03,0xf4,0xe4,0xcc,0xd9,0xfe,0xf5,0x01,0x22,0xf2,0x9c,0x6b,0x77,0x96,0x9d,0xc9,0xb0,0x8e,0x7b,0x89,0x02,0xfe,0x98,0x02,0x10,0x01,0xd3,0xe3,0xfe,0xf8,0x01,0x1b,0xe5,0xfd,0x01,0x33,0x3f,0xa8,0x5d,0xe1,0xb7,0xaf,0xd5,0xa3,0x89,0x8b,0x00,0x00,0x01,0x00,0x29,0xff,0xe8,0x04,0xec,\r\n0x05,0x9a,0x00,0x14,0x00,0x3a,0x40,0x1e,0x13,0x13,0x10,0x0c,0x07,0x91,0x09,0x03,0x10,0x91,0x40,0x03,0x13,0x0b,0x0e,0x0d,0x08,0x06,0x42,0x0d,0x7e,0x06,0x06,0x08,0x00,0x7e,0x12,0x12,0x16,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe2,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x31,0x30,\r\n0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x11,0x33,0x04,0xec,0xd3,0xbd,0xba,0xdc,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x7f,0x71,0xe6,0xa8,0x01,0x9a,0xca,0xe8,0xf1,0xb9,0x03,0x70,0x98,0x98,0xfc,0xa0,0x80,0xa3,0x01,0x21,0x01,0x9a,0x00,0x00,0x01,0x00,0x1e,0xff,0xe8,0x04,0x58,\r\n0x04,0x00,0x00,0x14,0x00,0x3a,0x40,0x1e,0x13,0x13,0x10,0x0c,0x07,0x95,0x09,0x0f,0x10,0x95,0x40,0x03,0x16,0x0b,0x0e,0x0d,0x08,0x06,0x42,0x0d,0x84,0x06,0x06,0x08,0x00,0x83,0x12,0x12,0x16,0x08,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x2b,0x01,0x10,0xe2,0x00,0x18,0x3f,0x1a,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x31,0x30,\r\n0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x11,0x35,0x33,0x04,0x58,0xcc,0xb5,0xb2,0xd3,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x78,0x67,0xdb,0xa8,0x01,0x83,0xbf,0xdc,0xdd,0xb6,0x01,0xf9,0x8c,0x8c,0xfe,0x11,0x7f,0x94,0x01,0x1a,0xa1,0x00,0x03,0x01,0x33,0x04,0xc2,0x03,0x7b,0x06,0x3a,\r\n0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x36,0x40,0x1c,0x01,0xe2,0x40,0x02,0x80,0x0a,0x16,0xc1,0x40,0x04,0x10,0x01,0x00,0x01,0x00,0x13,0x0d,0xc0,0x07,0x13,0xc0,0x19,0x1d,0x1c,0x07,0x19,0x2b,0x3a,0x2b,0x01,0x10,0xe1,0x10,0xe1,0x11,0x39,0x39,0x18,0x2f,0x2f,0x00,0x2f,0x33,0x1a,0xfd,0x32,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x21,\r\n0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x56,0xfe,0x04,0x01,0xfc,0x3e,0x28,0x3a,0x39,0x27,0x2a,0x3b,0x39,0xfe,0x56,0x29,0x3c,0x39,0x2a,0x29,0x3b,0x39,0x05,0xcd,0x6d,0xfe,0x88,0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,\r\n0x2a,0x38,0x39,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x64,0x06,0xfa,0x00,0x06,0x00,0x12,0x00,0x1e,0x00,0x66,0x40,0x3d,0x06,0x70,0x03,0x01,0x03,0x80,0x09,0x05,0x19,0x05,0x02,0x09,0x05,0x02,0x40,0x09,0x10,0x48,0x02,0x02,0x0d,0x19,0xc1,0x40,0x07,0x13,0x00,0xe0,0x03,0x01,0x03,0x03,0x00,0x05,0x05,0x1c,0x10,0xc0,\r\n0x0a,0x16,0xc0,0x1c,0x00,0x1c,0x01,0x0f,0x0f,0x0a,0x1f,0x0a,0x2f,0x0a,0x03,0x10,0x03,0x20,0x1f,0x0a,0x1c,0x2b,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x5e,0x5d,0x10,0xe1,0x10,0xe1,0x12,0x39,0x3d,0x2f,0x33,0x33,0x18,0x2f,0x5d,0x2f,0x00,0x2f,0x33,0x1a,0xed,0x32,0x32,0x2f,0x2b,0x33,0x5e,0x5d,0x1a,0xcd,0x5d,0x32,0x31,0x30,0x01,0x03,\r\n0x23,0x03,0x33,0x17,0x37,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x5a,0xd5,0x85,0xd7,0x73,0xa4,0xa4,0x1e,0x28,0x3a,0x37,0x29,0x2a,0x3a,0x38,0xfe,0x55,0x29,0x3c,0x39,0x2a,0x29,0x3c,0x3a,0x06,0xfa,0xfe,0xb6,0x01,0x4a,0xe6,0xe6,0xfd,0xc8,\r\n0x38,0x2b,0x2a,0x38,0x39,0x29,0x29,0x3a,0x39,0x2a,0x29,0x39,0x39,0x29,0x29,0x3a,0x00,0x03,0x01,0x1c,0x04,0xc2,0x03,0x77,0x06,0xe2,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x44,0xb2,0x03,0x80,0x00,0xb8,0xff,0xc0,0x40,0x20,0x09,0x0c,0x48,0x00,0x00,0x0a,0x16,0xc1,0x04,0x10,0x02,0x40,0x00,0x00,0x19,0x0d,0xc0,0x07,0x13,0xc0,0x19,\r\n0x0f,0x07,0x01,0x10,0x03,0x1d,0x1c,0x07,0x19,0x2b,0x3a,0x2b,0x01,0x5f,0x5e,0x5d,0x10,0xe1,0x10,0xe1,0x12,0x39,0x18,0x2f,0x1a,0xcd,0x00,0x2f,0x33,0xed,0x32,0x32,0x2f,0x2b,0x1a,0xcd,0x31,0x30,0x01,0x23,0x01,0x33,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x02,0xa2,0x7f,0xfe,0xf9,0xa6,0x01,0x50,0x29,0x39,0x3b,0x29,0x2a,0x39,0x3c,0xfe,0x57,0x2a,0x39,0x3b,0x2a,0x27,0x39,0x3a,0x05,0x9a,0x01,0x48,0xfd,0xe0,0x3a,0x29,0x29,0x39,0x39,0x29,0x2a,0x39,0x3a,0x29,0x29,0x39,0x38,0x2a,0x2b,0x38,0x00,0x02,0x01,0x08,0x04,0xc2,0x03,0x04,0x06,0x35,0x00,0x03,0x00,0x0f,0x00,0x32,\r\n0x40,0x1a,0x01,0xe2,0x40,0x02,0x80,0x0a,0xc1,0x40,0x04,0x00,0x0e,0x0d,0x01,0x07,0x42,0x01,0x01,0x07,0xc0,0x0d,0x11,0x10,0x0d,0xc0,0x2b,0x30,0x2b,0x01,0x10,0xe1,0x32,0x18,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xfd,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x03,0x04,0xfe,0x04,0x01,0xfc,0xfe,0x28,0x3a,0x3a,0x28,0x29,0x39,0x39,0x05,0xc8,0x6d,0xfe,0x8d,0x39,0x2a,0x29,0x37,0x37,0x29,0x29,0x3a,0x00,0x00,0x02,0x01,0x23,0x04,0xb2,0x03,0xa4,0x06,0x55,0x00,0x13,0x00,0x17,0x00,0x3c,0x40,0x20,0x15,0xe2,0x40,0x16,0x80,0x13,0x0d,0xda,0x07,0x11,0xda,0x03,0x09,0x17,0x16,0x17,\r\n0x16,0x0a,0x00,0xc4,0x0f,0x13,0x01,0x13,0x13,0x19,0x09,0xc4,0x20,0x0a,0x01,0x0a,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x5d,0xe1,0x11,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xd6,0xed,0xdc,0xfd,0xc6,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x35,0x37,0x21,\r\n0x35,0x21,0x03,0xa4,0x60,0x52,0x47,0x5b,0x4d,0x2a,0x58,0x5e,0x60,0x56,0x41,0x54,0x4a,0x36,0x54,0x1a,0xfe,0x04,0x01,0xfc,0x05,0xb2,0x69,0x85,0x34,0x2b,0x71,0x6b,0x81,0x34,0x2c,0x74,0x36,0x6d,0x00,0x01,0xff,0x8c,0x05,0x0e,0x03,0x1e,0x05,0xd1,0x00,0x0b,0x00,0x32,0x40,0x19,0x0b,0xdb,0x04,0x08,0x40,0x05,0x01,0x09,0x03,0x03,\r\n0x00,0x0e,0x05,0x0b,0x06,0x42,0x08,0x40,0x0b,0x0c,0x0d,0x06,0x05,0x2b,0x3a,0x2b,0x01,0x18,0x2f,0x1a,0xcd,0x2b,0x01,0x10,0xf0,0xc1,0x18,0x2f,0x00,0x2f,0x33,0x33,0x1a,0xdd,0x32,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x23,0x07,0x23,0x27,0x03,0x1e,0x5a,0x22,0x30,0xdc,0x30,0x22,0x30,0xdc,0x30,0x22,0x5a,0x05,\r\n0xd1,0xc3,0x64,0x64,0x64,0x64,0xc3,0x00,0x00,0x02,0xff,0x27,0x04,0x89,0x00,0xbc,0x06,0xa2,0x00,0x14,0x00,0x1e,0x00,0x65,0x40,0x0d,0x02,0x09,0x12,0x09,0x22,0x09,0x03,0x03,0x05,0x0f,0x0f,0x0d,0x0b,0xba,0x01,0x3d,0x00,0x16,0xff,0xf0,0xb6,0x0c,0x0f,0x48,0x16,0x16,0x01,0x0d,0x41,0x0a,0x01,0x3d,0x00,0x12,0x01,0x39,0x00,0x1c,\r\n0x01,0x3d,0x00,0x40,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0xb3,0x0f,0x0f,0x08,0x14,0xb8,0x01,0x3c,0xb4,0x16,0x01,0x0b,0x80,0x1a,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0x1a,0xdc,0x32,0x32,0xe1,0x11,0x39,0x2f,0x00,0x3f,0x3f,0x1a,0xed,0x3f,0xed,0x11,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0x11,0x39,0x31,0x30,0x5d,0x13,0x23,0x35,\r\n0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x07,0x35,0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x36,0xbc,0x52,0x02,0x35,0x68,0x4d,0x57,0xaa,0x99,0x6a,0x5d,0x49,0x41,0x6d,0xb4,0x52,0x7c,0x43,0x30,0x62,0x3e,0x4f,0x04,0x96,0x50,0x5d,0x52,0x43,0x8f,0x17,0x17,0x81,0x3e,0x54,0x30,0xbe,\r\n0x7e,0x34,0x13,0x0a,0x2b,0x2d,0x56,0x57,0x00,0x02,0xff,0x21,0x04,0x89,0x00,0xdf,0x06,0xa2,0x00,0x11,0x00,0x17,0x00,0x68,0x40,0x14,0x02,0x01,0x12,0x01,0x22,0x01,0x03,0x0f,0x01,0x1f,0x01,0x2f,0x01,0x03,0x09,0x03,0x05,0x05,0x03,0x01,0xb8,0x01,0x3d,0xb4,0x40,0x17,0x0e,0x08,0x17,0xb8,0x01,0x3d,0xb2,0x2b,0x30,0x14,0xbe,0x01,\r\n0x3d,0x00,0x0e,0x01,0x39,0x00,0x03,0x01,0x3d,0x00,0x08,0x01,0x3b,0xb3,0x05,0x05,0x0b,0x11,0xb8,0x01,0x3c,0xb7,0x60,0x12,0xc0,0x12,0x02,0x12,0x17,0x01,0xb9,0x01,0x3c,0x00,0x0b,0x2f,0xe1,0x32,0xdd,0x71,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x39,0x2f,0x5f,0x5e,0x5d,0x31,0x30,0x5d,\r\n0x13,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x06,0x07,0xdf,0xfe,0x98,0x04,0xa1,0x57,0x49,0x42,0x70,0x6c,0x7d,0x87,0x64,0x64,0x6f,0x53,0x02,0x7e,0x3a,0x52,0x09,0x05,0x81,0xb2,0x39,0x4e,0x31,0x8c,0x7f,0x78,0x96,0x81,0x75,0x1a,0x96,0x52,0x44,0x00,0x00,0x02,\r\n0xff,0xcb,0x04,0x96,0x00,0x35,0x07,0x83,0x00,0x07,0x00,0x0b,0x00,0x41,0xb9,0x00,0x00,0x01,0x3f,0x40,0x09,0x40,0x04,0x80,0x00,0x0a,0x01,0x0c,0x03,0x0a,0xbc,0x01,0x38,0x00,0x09,0x01,0x3a,0x00,0x0b,0x01,0x3c,0xb3,0x0a,0x02,0x06,0x0a,0xb8,0x01,0x3c,0xb2,0x2b,0x30,0x02,0xb8,0x01,0x3e,0xb1,0x06,0x0d,0x10,0xd4,0xe1,0x2b,0x01,\r\n0x10,0xe1,0x00,0x18,0x3f,0x3f,0x5f,0x5e,0x5d,0x1a,0xdc,0x1a,0xed,0x31,0x30,0x11,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x03,0x23,0x11,0x33,0x35,0x35,0x35,0x0e,0x52,0x52,0x07,0x18,0x36,0x35,0x35,0x36,0xfd,0x7e,0x02,0x00,0x00,0x00,0x02,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa2,0x00,0x0b,0x00,0x15,0x00,0x29,0x41,0x0e,0x00,0x0c,\r\n0x01,0x3d,0x00,0x06,0x01,0x39,0x00,0x12,0x01,0x3d,0x00,0x00,0x01,0x3b,0x00,0x09,0x01,0x3c,0x00,0x14,0x00,0x0f,0x01,0x3c,0x00,0x03,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x02,0x72,0x88,0x8e,0x78,\r\n0x72,0x80,0x89,0x6f,0x4f,0x5d,0x5c,0x50,0xa4,0x04,0x89,0x90,0x77,0x7f,0x93,0x8e,0x7c,0x7b,0x94,0x01,0xd3,0x6a,0x5e,0x5a,0x6b,0xc7,0xc6,0x00,0x00,0x01,0xff,0x2b,0x04,0x89,0x00,0xd5,0x06,0x96,0x00,0x11,0x00,0x31,0xb1,0x10,0x09,0xb8,0x01,0x38,0xb2,0x0f,0x02,0x0c,0xbe,0x01,0x3d,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,\r\n0x11,0x01,0x3c,0xb2,0x01,0x10,0x09,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0xd4,0x32,0xe1,0x00,0x3f,0x3f,0xed,0x32,0x32,0x3f,0x33,0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0xd5,0x52,0x02,0x33,0x6a,0xb9,0x52,0x7d,0x3c,0x4d,0x52,0x04,0x96,0x52,0x5f,0xdb,0x01,0x32,0xfe,\r\n0xda,0xa1,0x57,0x48,0x01,0x28,0x00,0x01,0xff,0x2b,0x04,0x89,0x00,0xac,0x06,0xa2,0x00,0x15,0x00,0x2a,0xb1,0x00,0x02,0xbf,0x01,0x3d,0x00,0x13,0x01,0x39,0x00,0x0a,0x00,0x08,0x01,0x3d,0x00,0x0d,0x01,0x3b,0xb2,0x00,0x0a,0x05,0xb9,0x01,0x3c,0x00,0x10,0x2f,0xe1,0xc4,0x32,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x13,0x26,\r\n0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0xac,0x38,0x41,0x4f,0x65,0x5f,0x4f,0x43,0x3c,0x3d,0x51,0x6d,0x86,0x91,0x79,0x45,0x32,0x06,0x35,0x27,0x6f,0x5b,0x5a,0x69,0x2d,0x4e,0x25,0x8f,0x71,0x7e,0x9b,0x19,0x00,0x02,0xff,0x14,0x04,0x89,0x00,0xec,0x07,0x8c,0x00,0x10,\r\n0x00,0x1c,0x00,0x3e,0xb9,0x00,0x0f,0x01,0x36,0xb3,0x0d,0x03,0x05,0x15,0x41,0x0b,0x01,0x3d,0x00,0x0b,0x01,0x39,0x00,0x1a,0x01,0x3d,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,0x10,0x01,0x3c,0xb3,0x12,0x01,0x0f,0x17,0xb9,0x01,0x3c,0x00,0x08,0x2f,0xe1,0xd4,0x32,0x32,0xe1,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,\r\n0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x16,0x33,0x32,0x36,0xec,0x52,0x02,0x3a,0x76,0x60,0x74,0x80,0x6a,0x6a,0x30,0x02,0x52,0x52,0x53,0x3f,0xa0,0x54,0x44,0x45,0x55,0x04,0x96,0x58,0x65,0x8b,0x75,0x80,0x99,0x52,0x01,0x3c,0xfd,\r\n0xf1,0x4b,0x3f,0x55,0xce,0x59,0x66,0x64,0x00,0x01,0xff,0x2b,0x04,0x96,0x00,0xd5,0x07,0x8c,0x00,0x11,0x00,0x32,0xb9,0x00,0x0b,0x01,0x36,0xb2,0x0d,0x08,0x04,0xbf,0x01,0x3d,0x00,0x0f,0x01,0x39,0x00,0x01,0x00,0x08,0x01,0x3a,0x00,0x00,0x01,0x3c,0xb2,0x01,0x0b,0x08,0xb9,0x01,0x3c,0x00,0x09,0x2f,0xe1,0x32,0xd4,0xe1,0x00,0x3f,\r\n0x33,0x3f,0xed,0x12,0x39,0x3f,0x31,0x30,0x13,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0xd5,0x52,0x77,0x3d,0x52,0x52,0x52,0x02,0x3b,0x6d,0xae,0x04,0x96,0x01,0x26,0xa0,0x5c,0x48,0xfe,0xde,0x02,0xf6,0xfe,0xb6,0x60,0xd1,0x00,0x01,0xfe,0x96,0x04,0x96,0x01,0x6c,0x06,0xa2,0x00,0x1d,\r\n0x00,0x51,0xb4,0x04,0x15,0x19,0x03,0x0c,0xb8,0x01,0x3d,0xb2,0x40,0x1b,0x17,0xba,0x01,0x39,0x00,0x13,0x01,0x38,0xb2,0x08,0x00,0x10,0xba,0x01,0x3a,0x00,0x00,0x01,0x3c,0xb7,0x01,0x0e,0x08,0x10,0x09,0x42,0x19,0x08,0xb8,0x01,0x3c,0xb4,0x09,0x09,0x1e,0x13,0x10,0xb9,0x01,0x3c,0x00,0x11,0x2f,0xe1,0x32,0x11,0x39,0x2f,0xe1,0x39,\r\n0x2b,0x01,0x10,0xf2,0xe1,0x00,0x18,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x1a,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x01,0x6c,0x52,0x72,0x35,0x4a,0x52,0x75,0x35,0x45,0x52,0x52,0x02,0x36,0x67,\r\n0x71,0x20,0x3a,0x70,0xaa,0x04,0x96,0x01,0x26,0xa0,0x5e,0x44,0xfe,0xdc,0x01,0x30,0x96,0x59,0x49,0xfe,0xdc,0x02,0x00,0x50,0x5c,0x6a,0x6a,0xd1,0x00,0x01,0xff,0x9c,0x04,0x96,0x00,0xa8,0x06,0xa0,0x00,0x0f,0x00,0x2d,0xb3,0x0a,0x07,0x00,0x02,0xbe,0x01,0x40,0x00,0x0d,0x01,0x39,0x00,0x08,0x01,0x38,0x00,0x07,0x01,0x3a,0xb3,0x00,\r\n0x00,0x09,0x06,0xb9,0x01,0x3c,0x00,0x07,0x2f,0xf1,0x32,0xc2,0x2f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x12,0x39,0x31,0x30,0x13,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0xa8,0x16,0x2a,0x35,0x45,0x52,0x52,0x02,0x24,0x63,0x1d,0x14,0x06,0x44,0x10,0x64,0x54,0xfe,0xfa,0x02,0x00,0x69,0x73,0x08,0x00,\r\n0x00,0x01,0xff,0x6a,0x04,0x8c,0x00,0x96,0x07,0x2d,0x00,0x13,0x00,0x3a,0xb2,0x0a,0x0e,0x05,0x41,0x09,0x01,0x3d,0x00,0x0b,0x00,0x08,0x01,0x38,0x00,0x13,0x00,0x11,0x01,0x3d,0x00,0x02,0x01,0x3b,0xb6,0x13,0x0d,0x0d,0x0e,0x06,0x0b,0x0e,0xb8,0x01,0x3c,0xb1,0x08,0x05,0x2f,0x33,0xe1,0x32,0xcd,0x10,0xc1,0x2f,0x32,0x00,0x3f,0xed,\r\n0x32,0x3f,0x33,0xed,0x32,0xcd,0x31,0x30,0x13,0x06,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x96,0x1e,0x2e,0x88,0x58,0x58,0x52,0x82,0x82,0x4c,0x1f,0x17,0x04,0x9c,0x10,0x95,0x01,0x2f,0x46,0x7c,0x1b,0x97,0x46,0xfe,0xdf,0x5e,0x11,0x00,0x00,0x01,0xff,0x10,0x04,0x96,0x00,0xf0,\r\n0x06,0x96,0x00,0x0b,0x00,0x5b,0x40,0x0e,0x07,0x40,0x0e,0x11,0x48,0x07,0x18,0x09,0x0d,0x48,0x07,0x02,0x0b,0x04,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x40,0x25,0x00,0x0b,0x10,0x0b,0x20,0x0b,0x03,0x0b,0x00,0x0e,0x07,0x0f,0x04,0x1f,0x04,0x2f,0x04,0x03,0x09,0x05,0x04,0x03,0x03,0x07,0x42,0x03,0x01,0x18,0x09,0x0d,0x48,0x00,0x01,\r\n0x02,0x03,0x04,0x07,0x19,0x2f,0x17,0x33,0x2b,0x18,0x2f,0x2b,0x11,0x01,0x33,0x5f,0x5e,0x5d,0x10,0xe0,0x32,0x5d,0x00,0x18,0x3f,0x3f,0x33,0x12,0x39,0x2b,0x2b,0x31,0x30,0x13,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0xf0,0xcd,0x50,0xc3,0x5a,0x84,0x0c,0x04,0x02,0x05,0x0b,0x8a,0x06,0x96,0xfe,0x00,0x02,0x00,0xfe,\r\n0x8d,0x21,0x27,0x26,0x20,0x01,0x75,0x00,0x00,0x01,0xff,0x23,0x04,0x96,0x00,0xdd,0x06,0x96,0x00,0x14,0x00,0x1c,0xbb,0x00,0x0e,0x01,0x38,0x00,0x0a,0x01,0x3a,0x40,0x09,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x0b,0x2f,0xc4,0x5d,0x00,0x3f,0x3f,0x31,0x30,0x13,0x03,0x17,0x23,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x23,0x37,0x03,\r\n0x33,0x17,0x16,0x17,0x33,0x37,0x37,0xdd,0xac,0xaa,0x60,0x65,0x0f,0x07,0x02,0x07,0x0f,0x67,0x5e,0xae,0xa8,0x60,0x63,0x08,0x0e,0x02,0x16,0x69,0x06,0x96,0xfe,0xfe,0xfe,0xa6,0x19,0x0d,0x0e,0x18,0xa6,0xfc,0x01,0x04,0xae,0x0e,0x1c,0x2a,0xae,0x00,0x00,0x01,0x00,0x72,0x03,0xc6,0x01,0x62,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb4,0x02,\r\n0x03,0x03,0x00,0x02,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x62,0x7c,0x74,0x54,0x05,0x9a,0xfe,0x2c,0x01,0xd4,0x00,0x01,0x00,0x72,0xfd,0xfe,0x01,0x62,0xff,0xc6,0x00,0x03,0x00,0x20,0xb9,0x00,0x03,0xff,0xc0,0x40,0x0e,0x0e,0x11,0x48,0x03,0x03,0x04,0x1f,0x02,0x2f,0x02,0x02,0x02,0x00,0x02,0x2f,0xcd,0x00,\r\n0x2f,0x5d,0x12,0x39,0x2f,0x2b,0x31,0x30,0x05,0x03,0x23,0x13,0x01,0x62,0x54,0x9c,0x7e,0x3a,0xfe,0x38,0x01,0xc8,0x00,0x01,0x01,0xba,0xfe,0x40,0x02,0xf6,0xff,0x89,0x00,0x0c,0x00,0x21,0x40,0x11,0x0c,0x0a,0xc3,0x40,0x02,0x80,0x06,0x40,0x09,0x0d,0x48,0x06,0x00,0x00,0x07,0xc2,0x06,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0x2b,0x1a,0xdc,\r\n0x1a,0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x02,0xf6,0x3c,0x56,0x4b,0x5f,0x7b,0x44,0x29,0x29,0xfe,0x90,0x50,0x53,0x46,0xb0,0xba,0x43,0x2a,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x50,0x05,0xc4,0x00,0x11,0x00,0x36,0xbc,0x00,0x0a,0x01,0x07,0x00,0x09,0x00,0x01,0x01,0x0a,0xb2,\r\n0x0a,0x0c,0x04,0xbc,0x01,0x0d,0x00,0x0f,0x01,0x09,0x00,0x00,0x01,0x0c,0xb4,0x01,0x01,0x13,0x0c,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xe9,0x00,0x3f,0xed,0x32,0x32,0x3f,0x33,0x3f,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,\r\n0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x50,0x05,0xc4,0x00,0x1a,0x00,0x4d,0xb1,0x09,0x01,0xbd,0x01,0x0a,0x00,0x15,0x00,0x04,0x01,0x0d,0x00,0x18,0xff,0xc0,0xb3,0x09,0x0d,0x48,0x18,0xb8,0x01,0x09,0xb2,0x10,\r\n0x10,0x12,0xba,0x01,0x0d,0x00,0x0d,0x01,0x07,0xb3,0x10,0x10,0x08,0x00,0xb8,0x01,0x0c,0xb4,0x01,0x01,0x1c,0x15,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xe9,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x2b,0xed,0x32,0x3f,0x33,0x31,0x30,0x01,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x36,\r\n0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x39,0x45,0x80,0x96,0x87,0x3d,0x3c,0x3a,0x3d,0x9f,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x0a,0x88,0x98,0x18,0x68,0x1c,0xb2,0x46,0x67,0xe7,0x00,0x02,0xff,0xbe,0x01,0x98,0x00,0xf6,0x05,0xc4,0x00,0x07,\r\n0x00,0x13,0x00,0x38,0xb2,0x0d,0x0d,0x0f,0xb8,0x01,0x0d,0xb5,0x0a,0x12,0x04,0x00,0x40,0x12,0xb8,0x01,0x08,0x40,0x0b,0x02,0x06,0x0c,0x11,0x08,0x02,0x06,0xff,0x3a,0x0c,0x08,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xe9,0x33,0x2b,0x01,0x18,0x2f,0x2f,0x2f,0x00,0x3f,0x1a,0xde,0xcd,0x10,0xd4,0xed,0x32,0x2f,0x31,0x30,0x13,0x22,0x35,0x34,\r\n0x33,0x32,0x15,0x14,0x03,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0xa6,0x4e,0x50,0x4e,0x0e,0xda,0x2b,0x25,0x22,0x24,0x64,0x80,0x05,0x2d,0x4c,0x4b,0x4b,0x4c,0xfd,0x79,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x02,0x24,0x00,0x01,0x00,0x66,0x02,0x9a,0x01,0xa8,0x04,0xc8,0x00,0x0e,0x00,0x2d,0xbb,0x00,0x06,0x01,0x0a,0x00,\r\n0x07,0x01,0x08,0xb5,0x0e,0xda,0x00,0x09,0x00,0x02,0xbe,0x01,0x0e,0x00,0x0c,0x01,0x09,0x00,0x09,0x00,0x05,0x01,0x0c,0x00,0x06,0x2f,0xe9,0x32,0x00,0x3f,0xed,0x32,0x32,0x2f,0xed,0x3f,0x3f,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x01,0xa8,0x1e,0x26,0x7e,0x80,0x80,0x02,0x28,0x69,\r\n0x1b,0x14,0x04,0x46,0x12,0xb4,0xfe,0xf6,0x02,0x24,0x6c,0x76,0x08,0x00,0x00,0x01,0x00,0x0a,0x02,0x90,0x01,0x4c,0x04,0xbe,0x00,0x0e,0x00,0x31,0xb5,0x08,0x02,0x08,0x0a,0x52,0x05,0xbc,0x01,0x0b,0x00,0x01,0x01,0x0a,0x00,0x0d,0x01,0x08,0xb3,0x07,0x07,0x0c,0x00,0xb8,0x01,0x0c,0xb3,0x01,0x01,0x10,0x0f,0x11,0x12,0x39,0x2f,0xe9,\r\n0x33,0x33,0x2f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x2f,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x01,0x4c,0x7f,0x02,0x29,0x68,0x1c,0x14,0x1e,0x26,0x7f,0x7f,0x02,0x9a,0x6c,0x76,0x08,0x7a,0x12,0xb4,0x01,0x0a,0x00,0x01,0x00,0x0a,0x01,0x94,0x01,0xcf,0x04,0xbe,0x00,0x16,0x00,0x3e,\r\n0xb2,0x16,0x16,0x14,0xb8,0x01,0x0d,0xb7,0x02,0x08,0x0b,0x05,0x0b,0x0d,0x52,0x08,0xba,0x01,0x0b,0x00,0x10,0x01,0x08,0xb5,0x00,0x0a,0x00,0x0a,0x0f,0x12,0xb8,0x01,0x0c,0xb3,0x04,0x04,0x18,0x17,0x11,0x12,0x39,0x2f,0xe9,0x33,0x33,0x32,0x2f,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x32,0x2f,0x10,0xd4,0xed,0x32,0x2f,0x31,0x30,0x01,0x06,\r\n0x23,0x22,0x35,0x35,0x23,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0xcf,0x23,0x40,0x9f,0x02,0x29,0x68,0x1c,0x14,0x1e,0x26,0x7f,0x7f,0x4a,0x1e,0x1b,0x01,0xa6,0x12,0xbe,0xb4,0x76,0x08,0x7a,0x12,0xb4,0x01,0x0a,0xfd,0x9e,0x5e,0x10,0x00,0x02,0x00,0x66,0x02,0x9a,0x02,0x29,0x04,0xbe,\r\n0x00,0x10,0x00,0x17,0x00,0x4d,0xb1,0x03,0x11,0xb8,0x01,0x0d,0xb3,0x0c,0x0c,0x0a,0x12,0xbd,0x01,0x0d,0x00,0x09,0x01,0x0a,0x00,0x00,0x00,0x0a,0x01,0x08,0x40,0x09,0x01,0x0f,0x0f,0x12,0x10,0xc2,0x00,0x00,0x06,0xb8,0x01,0x0c,0xb5,0x15,0x15,0x19,0x04,0x0c,0x12,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe9,0x32,0x32,0x12,0x39,0x2f,0xe9,\r\n0x32,0x2f,0xe9,0x11,0x39,0x11,0x33,0x00,0x3f,0x33,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x07,0x06,0x07,0x15,0x16,0x15,0x14,0x23,0x23,0x11,0x33,0x15,0x33,0x32,0x37,0x37,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0x29,0x47,0x1a,0x36,0x7c,0xdf,0xc9,0x80,0x2a,0x3e,0x1c,0x3c,0xc0,0x43,0x67,0x61,0x04,0xbe,0xa2,0x3c,\r\n0x15,0x03,0x14,0x6e,0xac,0x02,0x24,0xd0,0x43,0x8d,0xfe,0xce,0x90,0x48,0x48,0x00,0x00,0x01,0x00,0x14,0x02,0x9a,0x03,0x18,0x04,0xbe,0x00,0x1b,0x00,0x17,0xbb,0x00,0x0a,0x01,0x0a,0x00,0x0b,0x01,0x08,0xb3,0x00,0x00,0x1d,0x0b,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x34,0x27,0x23,0x06,0x07,0x03,0x23,\r\n0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x03,0x18,0x8c,0x9c,0x4a,0x0c,0x04,0x04,0x09,0x51,0x9c,0x88,0x8a,0x48,0x03,0x05,0x04,0x02,0x0a,0x58,0x92,0x50,0x03,0x05,0x04,0x02,0x08,0x4a,0x04,0xbe,0xfd,0xdc,0x01,0x41,0x01,0x45,0x19,0x2b,0xfe,0xbd,0x02,0x24,0xfe,0x9e,0x10,0x36,0x20,\r\n0x28,0x01,0x60,0xfe,0x9e,0x0b,0x3b,0x20,0x26,0x01,0x62,0x00,0x00,0x01,0x00,0x0a,0x01,0x94,0x02,0x2f,0x04,0xbe,0x00,0x14,0x00,0x25,0xb2,0x06,0x06,0x08,0xb8,0x01,0x0d,0xb6,0x11,0x14,0x0b,0x01,0x04,0x03,0x0c,0xb8,0x01,0x08,0xb3,0x00,0x00,0x16,0x0c,0x2f,0x11,0x33,0x2f,0x00,0x3f,0xd4,0x17,0x39,0xed,0x32,0x2f,0x31,0x30,0x01,\r\n0x03,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x02,0x2f,0xeb,0x48,0xa2,0x22,0x26,0x1e,0x20,0x57,0x24,0x14,0xd5,0x8a,0x78,0x0a,0x06,0x05,0x09,0x09,0x79,0x04,0xbe,0xfd,0x94,0xbe,0x0c,0x6c,0x0e,0x60,0x38,0x02,0x28,0xfe,0xa0,0x1e,0x34,0x37,0x1b,0x01,0x60,0x00,0x00,0x01,\r\n0x00,0x82,0x03,0xdb,0x01,0x5e,0x05,0x9a,0x00,0x03,0x00,0x18,0xb7,0x02,0x03,0x03,0x03,0xbd,0x00,0x00,0x01,0xb9,0x01,0x34,0x00,0x02,0x2f,0xe9,0x32,0x2f,0xe9,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x5e,0x68,0x74,0x56,0x05,0x9a,0xfe,0x41,0x01,0xbf,0x00,0x00,0x02,0x00,0x8d,0x03,0xdb,0x02,0x84,0x05,0x9a,0x00,0x03,\r\n0x00,0x07,0x00,0x28,0x40,0x12,0x06,0x03,0x02,0x07,0x04,0x03,0x00,0x00,0x01,0x02,0x02,0x09,0x06,0x07,0x04,0x04,0x05,0x06,0x2f,0xcd,0x32,0x2f,0xcd,0x11,0x12,0x39,0x2f,0xcd,0x32,0x2f,0xcd,0x00,0x3f,0xc4,0x33,0x32,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0x84,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,\r\n0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x00,0x01,0x00,0x6a,0x03,0xf4,0x01,0x6c,0x05,0xb2,0x00,0x03,0x00,0x16,0x40,0x09,0x02,0x03,0x04,0x03,0x00,0x00,0x01,0x01,0x02,0x2f,0x33,0x11,0x33,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x03,0x23,0x13,0x01,0x6c,0x6c,0x96,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0x00,0xff,0xff,0x00,0x6e,\r\n0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x06,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x6e,0x03,0xf4,0x01,0x70,0x05,0xb2,0x00,0x03,0x00,0x16,0x40,0x09,0x01,0x02,0x04,0x01,0x00,0x00,0x03,0x03,0x02,0x2f,0x33,0x11,0x33,0x2f,0xcd,0x00,0x3f,0xcd,0x31,0x30,0x01,0x23,0x03,0x33,0x01,0x70,0x74,0x8e,0x94,0x03,0xf4,0x01,0xbe,0x00,0x00,0x01,\r\n0x00,0xfb,0x04,0xc2,0x01,0xaf,0x06,0x2f,0x00,0x0b,0x00,0x22,0x40,0x10,0x05,0xcb,0x40,0x06,0xc0,0x01,0xcb,0x40,0x00,0x00,0x06,0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x35,0x32,0x35,0x34,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0xfb,0x5e,0x5e,0x4e,0x66,0x66,\r\n0x04,0xc2,0x5c,0x5b,0x58,0x5e,0x68,0x4e,0x4e,0x69,0x00,0x01,0x00,0xfb,0x04,0xc2,0x01,0xaf,0x06,0x2f,0x00,0x0b,0x00,0x20,0x40,0x0f,0x07,0xcb,0x40,0x06,0xc0,0x0b,0xcb,0x40,0x00,0x00,0x06,0x80,0x09,0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x15,\r\n0x22,0x15,0x14,0x33,0x01,0xaf,0x4e,0x66,0x65,0x4f,0x5e,0x5e,0x04,0xc2,0x69,0x4e,0x4d,0x69,0x5e,0x58,0x5b,0x00,0x00,0x01,0x00,0x14,0x02,0x9a,0x01,0xb0,0x05,0xc4,0x00,0x15,0x00,0x2f,0xb1,0x0b,0x09,0xbe,0x01,0x0d,0x00,0x0e,0x01,0x07,0x00,0x01,0x01,0x0a,0x00,0x00,0x01,0x0c,0xb3,0x01,0x01,0x0b,0x11,0xb8,0x01,0x0c,0xb3,0x07,\r\n0x07,0x17,0x0b,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xed,0x32,0x31,0x30,0x13,0x23,0x11,0x34,0x36,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0xfc,0x7f,0x24,0x41,0x4d,0x87,0x4a,0x4a,0x4a,0x5a,0x73,0x85,0x6a,0x4a,0x02,0x9a,0x01,0x08,0x40,0x59,0x3c,0x49,0x36,\r\n0x64,0x2b,0x73,0x22,0x6e,0x58,0x62,0x60,0x44,0x56,0x00,0x01,0x00,0x0a,0x02,0x9a,0x01,0xa6,0x05,0xc4,0x00,0x15,0x00,0x2f,0xb1,0x00,0x02,0xbe,0x01,0x0d,0x00,0x13,0x01,0x07,0x00,0x0b,0x01,0x0a,0x00,0x09,0x01,0x0c,0xb6,0x0c,0x0c,0x10,0x00,0x00,0x17,0x04,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xe1,0x11,0x39,0x2f,0x12,0x39,0x2f,0xe1,\r\n0x00,0x3f,0x3f,0xed,0x32,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x14,0x17,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0xa6,0x48,0x52,0x80,0x4f,0x3a,0x29,0x80,0x50,0x64,0x8b,0x73,0x52,0x4c,0x05,0x2f,0x2b,0x5e,0x33,0x50,0x3a,0x58,0x45,0xfe,0xf8,0x01,0x06,0x4c,0x50,0x64,0x5a,0x58,0x72,0x22,\r\n0x00,0x01,0x00,0x72,0x00,0xe4,0x04,0x3c,0x04,0xc2,0x00,0x06,0x00,0x32,0x40,0x16,0x04,0x03,0x0e,0x05,0x20,0x06,0x00,0x05,0x00,0x42,0x00,0x00,0x02,0x01,0x05,0x05,0x01,0x04,0x00,0x00,0x08,0x07,0x11,0x12,0x39,0x2f,0x33,0xcd,0x39,0x00,0x19,0x2f,0x33,0x33,0x33,0x18,0x2f,0x2b,0x11,0x00,0x33,0x1a,0x19,0x10,0xed,0x32,0x31,0x30,\r\n0x25,0x01,0x35,0x01,0x17,0x01,0x01,0x04,0x3c,0xfc,0x36,0x03,0xc8,0x01,0xfc,0xff,0x03,0x00,0xe4,0x01,0x9b,0xa8,0x01,0x9b,0xb2,0xfe,0xc3,0xfe,0xc3,0x00,0x00,0x01,0x00,0x70,0x00,0xe4,0x04,0x3c,0x04,0xc2,0x00,0x06,0x00,0x32,0x40,0x17,0x04,0x05,0x0e,0x03,0x20,0x02,0x01,0x03,0x01,0x42,0x01,0x00,0x01,0x06,0x03,0x03,0x03,0x00,\r\n0x04,0x01,0x01,0x08,0x07,0x11,0x12,0x39,0x2f,0x33,0xcd,0x39,0x00,0x19,0x2f,0x17,0x33,0x18,0x2f,0x2b,0x11,0x00,0x33,0x1a,0x19,0x10,0xed,0x32,0x31,0x30,0x01,0x01,0x35,0x01,0x01,0x35,0x01,0x04,0x3a,0xfc,0x36,0x03,0x02,0xfc,0xfe,0x03,0xcc,0x02,0x7f,0xfe,0x65,0xb2,0x01,0x3d,0x01,0x3d,0xb2,0xfe,0x65,0x00,0x00,0x01,0x00,0x66,\r\n0x00,0xee,0x04,0x46,0x04,0xb8,0x00,0x06,0x00,0x23,0x40,0x0f,0x02,0x05,0x01,0x03,0x06,0x05,0x02,0x02,0x04,0x01,0x00,0x00,0x08,0x03,0x04,0x2f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x33,0x33,0x00,0x2f,0x33,0xcd,0x32,0x31,0x30,0x25,0x23,0x01,0x01,0x23,0x01,0x33,0x04,0x46,0xb2,0xfe,0xc2,0xfe,0xc2,0xb2,0x01,0x9c,0xa8,0xee,\r\n0x03,0x02,0xfc,0xfe,0x03,0xca,0x00,0x01,0x00,0x66,0x00,0xee,0x04,0x46,0x04,0xb8,0x00,0x06,0x00,0x23,0x40,0x0f,0x06,0x04,0x05,0x02,0x02,0x01,0x05,0x05,0x03,0x06,0x00,0x00,0x08,0x04,0x03,0x2f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x11,0x33,0x33,0x00,0x2f,0x33,0xcd,0x32,0x31,0x30,0x01,0x01,0x23,0x01,0x33,0x01,0x01,0x04,0x46,\r\n0xfe,0x64,0xa8,0xfe,0x64,0xb2,0x01,0x3e,0x01,0x3e,0x04,0xb8,0xfc,0x36,0x03,0xca,0xfc,0xfe,0x03,0x02,0x00,0x01,0x01,0x20,0x04,0x96,0x01,0x8a,0x06,0x00,0x00,0x03,0x00,0x11,0xb3,0x01,0x02,0x01,0x00,0xb9,0x01,0x32,0x00,0x01,0x2f,0xe1,0x00,0x3f,0xcd,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x8a,0x6a,0x6a,0x04,0x96,0x01,0x6a,0x00,\r\n0xff,0xff,0x00,0x87,0x04,0xc2,0x02,0x0c,0x06,0x0a,0x02,0x06,0x00,0x8e,0x00,0x00,0xff,0xff,0x00,0x52,0x04,0xc2,0x01,0xd7,0x06,0x0a,0x02,0x06,0x00,0x43,0x00,0x00,0x00,0x01,0x01,0x20,0xfe,0x1e,0x01,0x8a,0xff,0x89,0x00,0x03,0x00,0x15,0xb5,0x02,0x02,0x04,0x01,0x1c,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x00,0x3f,0x12,0x39,\r\n0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x8a,0x6a,0x6a,0xfe,0x1e,0x01,0x6b,0x00,0x00,0x01,0x00,0x3e,0xff,0x1c,0x02,0x3a,0xff,0x89,0x00,0x03,0x00,0x13,0xb7,0x01,0xe2,0x02,0x04,0x03,0x03,0x05,0x02,0x2f,0x12,0x39,0x2f,0x00,0x10,0xde,0xed,0x31,0x30,0x05,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0xe4,0x6d,0x00,0xff,0xff,\r\n0x00,0x52,0xfe,0x43,0x01,0xd7,0xff,0x8b,0x00,0x07,0x00,0x43,0x00,0x00,0xf9,0x81,0xff,0xff,0x00,0x87,0xfe,0x42,0x02,0x0c,0xff,0x8a,0x00,0x07,0x00,0x8e,0x00,0x00,0xf9,0x80,0x00,0x02,0x00,0xb6,0x00,0x00,0x01,0x83,0x04,0x25,0x00,0x03,0x00,0x07,0x00,0x1f,0x40,0x11,0x02,0x63,0x03,0x06,0x63,0x05,0x00,0x42,0x04,0x40,0x13,0x19,\r\n0x48,0x04,0x62,0x03,0x05,0x2f,0x33,0xf1,0x2b,0xe2,0x00,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x13,0x23,0x37,0x33,0x01,0x83,0x5a,0x19,0x5a,0xcc,0xcc,0x5a,0x18,0x04,0x25,0xcd,0xcd,0xfb,0xdb,0xcd,0x00,0x00,0x01,0x00,0xb6,0x01,0xc8,0x01,0x83,0x02,0x96,0x00,0x03,0x00,0x15,0x40,0x0b,0x03,0x63,0x02,0x00,0x40,0x13,\r\n0x19,0x48,0x00,0x62,0x03,0x2f,0xe1,0x2b,0x00,0x2f,0xed,0x31,0x30,0x01,0x07,0x23,0x27,0x01,0x83,0x58,0x1b,0x5a,0x02,0x96,0xce,0xce,0xff,0xff,0x00,0xfb,0x01,0x75,0x01,0xaf,0x02,0xe2,0x00,0x07,0x06,0x84,0x00,0x00,0xfc,0xb3,0xff,0xff,0x00,0xfb,0x01,0x75,0x01,0xaf,0x02,0xe2,0x00,0x07,0x06,0x85,0x00,0x00,0xfc,0xb3,0x00,0x01,\r\n0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xe6,0x00,0x07,0x00,0x22,0xb3,0x03,0xc0,0x05,0x02,0xb8,0x01,0x33,0xb5,0x00,0x06,0x06,0x05,0x01,0x05,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0xcd,0x10,0xc9,0x2f,0x00,0x2f,0xed,0x32,0x1a,0xcc,0x31,0x30,0x13,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xa0,0x7e,0x6e,0x7e,0x01,0x74,0x6b,0x01,0x07,0xfe,\r\n0xf9,0x6b,0x00,0x01,0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xe6,0x00,0x07,0x00,0x1f,0x40,0x0e,0x01,0x06,0xe2,0x40,0x07,0xc0,0x04,0x01,0x01,0x02,0x06,0x02,0x50,0x05,0x2f,0xe1,0xcd,0x10,0xc1,0x2f,0x00,0x2f,0x1a,0xdc,0x1a,0xed,0x32,0x31,0x30,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x02,0x0a,0x7e,0x6e,0x7e,0x02,0xe6,0x6b,0xfe,\r\n0xf9,0x01,0x07,0x6b,0x00,0x01,0x00,0xa0,0x01,0x74,0x02,0x0a,0x02,0xdd,0x00,0x0b,0x00,0x29,0x40,0x13,0x08,0x80,0x01,0x04,0xfd,0x40,0x0a,0x07,0x03,0x00,0x04,0x05,0x05,0x80,0x0a,0x01,0xfc,0x07,0x04,0x2f,0x33,0xf1,0x32,0x1a,0xc8,0x2f,0x10,0xcc,0x00,0x2f,0xde,0x32,0x1a,0xfd,0x32,0x1a,0xce,0x31,0x30,0x01,0x23,0x15,0x23,0x35,\r\n0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x02,0x0a,0x7e,0x6e,0x7e,0x7e,0x6e,0x7e,0x01,0xf4,0x80,0x80,0x6a,0x7f,0x7f,0x00,0x01,0x00,0x3e,0x01,0xf4,0x02,0x3a,0x02,0x60,0x00,0x03,0x00,0x11,0xb6,0x02,0xe2,0x01,0x00,0x00,0x05,0x01,0x2f,0x12,0x39,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x01,\r\n0xf4,0x6c,0x00,0x01,0x00,0x79,0x02,0x79,0x02,0x31,0x03,0xc8,0x00,0x0c,0x00,0x3d,0xb7,0x0c,0x0c,0x09,0x01,0x01,0x0b,0x06,0x04,0xb8,0x01,0x35,0x40,0x09,0x09,0x01,0x06,0x40,0x0b,0x0e,0x48,0x06,0x00,0xb8,0xff,0xc0,0x40,0x09,0x09,0x0d,0x48,0x00,0x00,0x01,0x06,0x03,0x0b,0x19,0x2f,0x17,0x33,0x18,0x2f,0x2b,0x2f,0x2b,0x19,0x2f,\r\n0x00,0x18,0x2f,0xed,0x32,0xcd,0x32,0x2f,0x11,0x39,0x2f,0x31,0x30,0x13,0x37,0x17,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x07,0x79,0xcb,0x20,0x27,0x4e,0x29,0x2f,0x39,0x30,0x7a,0x3c,0x54,0x02,0xf0,0xd8,0x5e,0x74,0x22,0x80,0x1f,0x79,0x56,0x00,0x01,0x00,0x48,0x03,0xa4,0x02,0x68,0x05,0xc4,0x00,0x0b,0x00,0x4a,0x40,0x16,\r\n0x00,0x01,0x04,0x03,0x03,0x06,0x09,0x0a,0x03,0x07,0x02,0x03,0x07,0x08,0x0b,0x05,0xe4,0x05,0xf4,0x05,0x02,0x05,0xb8,0xff,0xe0,0x40,0x15,0x2c,0x30,0x48,0x05,0x00,0x09,0x0a,0x03,0x01,0x04,0x06,0x07,0x03,0x03,0x01,0x02,0x03,0x05,0x0b,0x05,0x08,0x19,0x2f,0x17,0x33,0x11,0x17,0x33,0x11,0x17,0x33,0x00,0x2f,0x2b,0x5d,0x17,0x33,\r\n0x11,0x17,0x33,0x11,0x17,0x33,0x31,0x30,0x01,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x02,0x68,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0x03,0xf8,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0xbc,0x54,0xbc,0x00,0x02,0x00,0x0a,0x01,0xb8,0x02,0x4c,0x04,0xbe,0x00,0x11,0x00,0x19,0x00,0x4f,0x40,0x12,\r\n0x01,0x0d,0x10,0x12,0x04,0x11,0x0f,0x07,0x16,0x01,0x0d,0x10,0x12,0x04,0x04,0x0a,0x11,0x00,0xb8,0xff,0xc0,0x40,0x10,0x09,0x0c,0x48,0x00,0x00,0x04,0x0f,0x0e,0x40,0x09,0x0c,0x48,0x0e,0x0e,0x0a,0x04,0xbc,0x01,0x34,0x00,0x18,0x00,0x0a,0x01,0x34,0x00,0x14,0x2f,0xe1,0xde,0xe1,0x10,0xc2,0x2f,0x2b,0x32,0x10,0xc2,0x2f,0x2b,0x32,\r\n0x11,0x12,0x17,0x39,0x00,0x2f,0xcd,0xc4,0x32,0x17,0x39,0x31,0x30,0x01,0x03,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x03,0x33,0x13,0x13,0x03,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x02,0x4c,0xdc,0x19,0x3b,0x5c,0x43,0x45,0x52,0x3d,0x19,0xda,0x8a,0x95,0x99,0x99,0x29,0x29,0x29,0x04,0xbe,0xfe,0x50,0x28,0x5e,\r\n0x3c,0x3a,0x5a,0x52,0x3e,0x37,0x67,0x28,0x01,0xb0,0xfe,0xb9,0x01,0x47,0xfd,0xf6,0x44,0x22,0x34,0x34,0x22,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x00,0xe6,0x05,0xc4,0x00,0x03,0x00,0x16,0xbe,0x00,0x02,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x00,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x13,0x23,0x11,0x33,0xe6,0x80,\r\n0x80,0x02,0x9a,0x03,0x2a,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xbc,0x04,0xcf,0x00,0x1d,0x00,0x5d,0x40,0x17,0x25,0x17,0x01,0x17,0x15,0x03,0x0b,0x09,0x1b,0x09,0x2b,0x09,0x03,0x0b,0x07,0x1b,0x07,0x02,0x09,0x07,0x1c,0x10,0x12,0xbf,0x01,0x0d,0x00,0x0d,0x01,0x09,0x00,0x01,0x00,0x03,0x01,0x0d,0x00,0x1c,0x01,0x0b,0xb3,0x10,\r\n0x10,0x0a,0x19,0xb8,0x01,0x0c,0xb4,0x05,0x05,0x1f,0x01,0x14,0xb8,0x01,0x0c,0xb2,0x0a,0x0a,0x01,0x2f,0x33,0x10,0xe1,0x11,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x39,0x5d,0x5d,0x12,0x39,0x39,0x5d,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x3e,0x48,0x55,0x63,0x27,0x4a,0x8f,0x79,0x5d,0x47,0x43,0x42,0x4a,0x56,0x60,0x69,0x37,0x7f,0x66,0x4f,0x02,0xac,0x70,0x30,0x39,0x1b,0x21,0x1e,0x38,0x6c,0x4a,0x62,0x1d,0x6e,0x28,0x3d,0x31,0x27,0x2a,0x4e,0x30,0x46,0x60,0x00,0x01,0x00,0x14,0x02,0x9a,\r\n0x02,0x2d,0x04,0xbe,0x00,0x13,0x00,0x17,0xbb,0x00,0x0e,0x01,0x08,0x00,0x0a,0x01,0x0a,0xb3,0x02,0x02,0x15,0x0b,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x13,0x23,0x27,0x26,0x27,0x23,0x06,0x07,0x07,0x23,0x13,0x03,0x33,0x1f,0x02,0x33,0x37,0x02,0x2d,0xb9,0xb7,0x8f,0x62,0x02,0x15,0x05,0x08,0x0e,0x64,0x90,0xbd,\r\n0xae,0x8f,0x5e,0x01,0x14,0x04,0x7d,0x04,0xbe,0xfe,0xf0,0xfe,0xec,0xa4,0x02,0x2a,0x12,0x18,0xa6,0x01,0x0e,0x01,0x16,0xae,0x02,0x28,0xd8,0x00,0xff,0xff,0x00,0x0a,0x02,0x9a,0x01,0xa6,0x05,0xc4,0x02,0x06,0x06,0x87,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x05,0x00,0x1a,0x40,0x0b,0x01,0x03,0x04,0x04,\r\n0x03,0x03,0x00,0x01,0x01,0x07,0x06,0x11,0x12,0x39,0x2f,0xcd,0x33,0x2f,0x00,0x3f,0xcd,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0xe4,0x05,0x1e,0x9c,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x03,0x04,0x06,0x04,0x03,0x03,0x05,0x00,0x01,0x01,0x09,\r\n0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x3f,0x2f,0xcd,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x03,0xd5,0x9d,0x01,0x48,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x06,0x04,0x03,0x04,0x03,0x03,0x05,0x00,0x01,\r\n0x01,0x09,0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x2f,0xcd,0x3f,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x02,0x90,0x9b,0x02,0x8f,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x1e,0x40,0x0d,0x01,0x06,0x04,0x03,0x04,0x03,0x03,0x05,\r\n0x00,0x01,0x01,0x09,0x08,0x11,0x12,0x39,0x2f,0xcd,0x33,0x33,0x2f,0x00,0x2f,0xcd,0x3f,0x2f,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x01,0x48,0x9c,0x01,0x48,0x9c,0x03,0xd6,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x05,0x00,0x1a,0x40,0x0b,0x01,0x02,0x05,0x04,0x02,0x02,\r\n0x05,0x04,0x04,0x07,0x06,0x11,0x12,0x39,0x2f,0xcd,0x33,0x2f,0x00,0x3f,0x2f,0xcd,0x31,0x30,0x21,0x21,0x35,0x21,0x11,0x33,0x02,0x79,0xfe,0x1d,0x01,0x48,0x9c,0x9c,0x05,0x1e,0x00,0x01,0x00,0x62,0x00,0x00,0x02,0x48,0x03,0x70,0x00,0x05,0x00,0x10,0xb5,0x02,0x04,0x01,0x05,0x04,0x01,0x2f,0xcd,0x2f,0x00,0x2f,0xcd,0x2f,0x31,0x30,\r\n0x21,0x21,0x11,0x33,0x03,0x21,0x02,0x48,0xfe,0x1a,0x5e,0x02,0x01,0x8a,0x03,0x70,0xfc,0xee,0x00,0x01,0x00,0x62,0x00,0x00,0x02,0x48,0x03,0x70,0x00,0x07,0x00,0x19,0x40,0x0a,0x03,0x04,0x01,0x06,0x00,0x00,0x09,0x06,0x02,0x03,0x2f,0xcd,0x32,0x11,0x39,0x2f,0x00,0x2f,0xcd,0x2f,0x2f,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x33,0x03,\r\n0x21,0x02,0x48,0xfe,0x78,0x5e,0x5e,0x02,0x01,0x8a,0x01,0x89,0xfe,0x77,0x03,0x70,0xfe,0x78,0x00,0x01,0x00,0x3c,0xfe,0x40,0x02,0x6e,0xff,0x89,0x00,0x06,0x00,0x1c,0x40,0x0e,0x00,0x00,0x08,0x03,0x02,0x80,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,0x12,0x39,0x2f,0x31,0x30,0x05,0x03,0x23,0x03,\r\n0x33,0x17,0x37,0x02,0x6e,0xd6,0x84,0xd8,0x73,0xa4,0xa4,0x77,0xfe,0xb7,0x01,0x49,0xe5,0xe5,0x00,0x02,0x00,0x00,0x04,0x5c,0x03,0x52,0x05,0xec,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x13,0x05,0xd9,0x00,0x06,0x10,0x06,0x20,0x06,0x03,0x06,0x06,0x01,0xd9,0x02,0x00,0x04,0x01,0x00,0x05,0x2f,0xc4,0x33,0x32,0x00,0x3f,0xed,0x33,0x2f,\r\n0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x52,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x05,0x74,0x78,0xfe,0x70,0x77,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x0a,0x02,0x03,0x06,0x07,0x04,0x03,0xea,0x00,0x00,0x01,0xb8,0x01,0x34,0x40,0x09,0x02,0x02,0x09,\r\n0x06,0x07,0xea,0x04,0x04,0x05,0xb9,0x01,0x34,0x00,0x06,0x2f,0xe9,0x32,0x2f,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x32,0x2f,0xe9,0x00,0x3f,0xcd,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,0x76,0x6c,0x9a,0x8c,0x76,0x6f,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x01,0xff,0x3a,0xfe,0x1e,\r\n0x01,0x4a,0x04,0x00,0x00,0x0c,0x00,0x3a,0x40,0x19,0x0b,0x0f,0x06,0x06,0x08,0x03,0x08,0x95,0x59,0x03,0x1c,0x06,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x84,0x0a,0xb8,0xff,0xfe,0xb6,0x0c,0x06,0x4d,0x0a,0x0a,0x0e,0x0d,0x11,0x12,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0xc6,0x00,0x3f,0x2b,0x11,0x00,0x33,0x18,0x2f,0x3f,\r\n0x31,0x30,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0xa4,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x03,0xf0,0x00,0x01,0x00,0x0a,0x00,0x00,0x02,0x0e,0x04,0x00,0x00,0x0b,0x00,0x2d,0x40,0x17,0x01,0x0a,0x04,0x95,0x40,0x07,0x08,0x03,0x07,0x95,0x30,0x30,\r\n0x08,0x0f,0x03,0x00,0x00,0x09,0x08,0x02,0x84,0x05,0x03,0x2f,0xc6,0xf1,0x39,0x39,0xc2,0x2f,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x02,0x0e,0xb0,0xa4,0xb0,0xb0,0xa4,0xb0,0x01,0xdb,0xfe,0x25,0x01,0xdb,0x8b,0x01,0x9a,0xfe,0x66,0x00,0x01,\r\n0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4a,0x40,0x2e,0x74,0x06,0x84,0x06,0x02,0x36,0x06,0x46,0x06,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x34,0x07,0x44,0x07,0x54,0x07,0x74,0x07,0x84,0x07,0x94,0x07,0x06,0x07,0x02,0x04,0x06,0x08,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,\r\n0x39,0x2f,0x10,0xd4,0xcd,0x12,0x39,0x5d,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x03,0xd6,0x01,0x48,0x9c,0xfe,0xd6,0x01,0x2a,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,\r\n0x00,0x09,0x00,0x5a,0x40,0x39,0x24,0x03,0x01,0x16,0x03,0x01,0x94,0x06,0xa4,0x06,0x02,0x72,0x06,0x01,0x43,0x06,0x01,0x14,0x06,0x24,0x06,0x34,0x06,0x03,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x03,0x06,0x08,0x90,0x07,0xa0,0x07,0x02,0x84,0x07,0x01,0x70,0x07,0x01,0x07,0x02,0x02,0x01,0x08,0x01,0x00,\r\n0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xd4,0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x02,0x8f,0x02,0x8f,0x9c,0xfe,0x07,0x01,0xf9,0x00,0x01,0x00,0x96,\r\n0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x29,0x04,0x06,0x14,0x06,0x94,0x06,0xa4,0x06,0x04,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x00,0x04,0x10,0x04,0x02,0x04,0x03,0x06,0x09,0xa1,0x07,0x01,0x70,0x07,0x80,0x07,0x90,0x07,0x03,0x07,0x02,0x02,0x01,0x09,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x10,0xd4,\r\n0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x01,0x47,0x03,0xd7,0x9c,0xfd,0x37,0x02,0xc9,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x38,0x40,0x20,0xa6,0x05,0x01,0x02,\r\n0x05,0x03,0x01,0x06,0x08,0x0a,0x00,0x03,0x10,0x03,0x02,0x03,0x02,0x05,0x07,0xa0,0x06,0x01,0x91,0x06,0x01,0x70,0x06,0x80,0x06,0x02,0x06,0x01,0x00,0x2f,0x33,0x5d,0x5d,0x5d,0x2f,0xd4,0xcd,0x01,0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,\r\n0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x05,0x1e,0x9c,0xfc,0x4a,0x03,0xb6,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x56,0x40,0x33,0xb7,0x06,0x01,0x03,0x06,0x04,0xb6,0x07,0x01,0x99,0x07,0x01,0x07,0x02,0x08,0x0a,0x05,0x04,0xb7,0x04,0x01,0xa8,0x04,0x01,0x04,0x05,0x08,0x93,0x06,0x01,0x86,0x06,0x01,0x77,\r\n0x06,0x01,0x06,0x03,0x03,0x01,0xc6,0x02,0x01,0x48,0x02,0x58,0x02,0x02,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x5d,0x5d,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x5d,0x5d,0x12,0x39,0x39,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,\r\n0xfe,0x66,0x53,0x01,0x47,0x01,0x48,0x9c,0x05,0x0a,0xfe,0xcc,0x01,0x85,0x5f,0xfe,0xcc,0x01,0x34,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x18,0xaa,0x03,0x01,0x56,0x06,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,\r\n0x39,0x2f,0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x84,0x53,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0xb8,0x01,0x48,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,\r\n0x00,0x42,0x40,0x26,0x02,0x05,0x07,0x09,0x04,0x03,0xb6,0x03,0x01,0x03,0x04,0x06,0xc8,0x05,0x01,0x93,0x05,0x01,0x74,0x05,0x01,0x65,0x05,0x01,0x46,0x05,0x56,0x05,0x02,0x37,0x05,0x01,0x05,0x02,0x02,0x01,0x06,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,\r\n0xdd,0xc4,0x31,0x30,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x1e,0x53,0x02,0x8f,0x9c,0x02,0x8f,0x02,0xcc,0x5f,0xfd,0x8f,0x02,0x71,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x23,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0xb6,0x03,0x01,0x9b,0x03,0x01,0xa7,0x06,0x01,\r\n0x56,0x06,0x01,0x03,0x06,0x02,0xb6,0x04,0x01,0x04,0x05,0x08,0x07,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x66,0x53,\r\n0x01,0x9a,0xf5,0x9c,0x01,0x47,0x02,0x8f,0x01,0x85,0x5f,0xfe,0x7e,0xfe,0x0f,0x03,0x73,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x42,0x40,0x25,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0xb6,0x02,0x01,0x96,0x05,0x01,0x67,0x05,0x77,0x05,0x02,0x55,0x05,0x01,0x02,0x05,0x01,0xb6,0x03,0x01,0x03,\r\n0x04,0x07,0x90,0x06,0x01,0x06,0x01,0x00,0x2f,0x33,0x5d,0x2f,0xc4,0x32,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x66,0x53,0x01,0xae,0xe1,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0x6a,0xfd,0x5e,\r\n0x04,0x38,0x00,0x01,0x00,0x43,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0xb6,0x03,0x01,0x03,0x04,0x06,0x84,0x05,0x94,0x05,0x02,0x56,0x05,0x66,0x05,0x02,0x05,0x02,0x02,0x06,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x5d,0x33,\r\n0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x65,0x53,0x01,0x48,0x9c,0x03,0xd6,0x01,0x85,0x5f,0xfe,0xcc,0x01,0x34,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,0x40,0x4a,0x68,0x07,0x01,0x88,0x04,0x01,0x83,0x03,0x01,0x77,0x03,0x01,0x58,0x03,0x68,0x03,\r\n0x02,0x04,0x03,0x34,0x03,0x44,0x03,0x03,0x77,0x06,0x01,0x03,0x03,0x06,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0xc7,0x04,0x01,0x26,0x04,0x01,0x04,0x05,0x07,0x93,0x06,0xa3,0x06,0x02,0x02,0x83,0x06,0x01,0x74,0x06,0x01,0x27,0x06,0x01,0x06,0x03,0x03,0x01,0x7b,0x02,0x01,0x48,0x02,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0x33,0x5d,0x5d,\r\n0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5f,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x47,0x01,0x48,0x9c,0x04,0xc4,0xfd,0xcb,0x02,0xe4,\r\n0x47,0xfd,0xcb,0x02,0x35,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x40,0x86,0x03,0xc6,0x03,0xd6,0x03,0xe6,0x03,0x04,0x58,0x03,0x68,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x04,0x03,0x01,0x85,0x06,0x95,0x06,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0xb6,0x04,0x01,0x79,0x04,0x01,\r\n0x04,0x05,0x08,0xa2,0x06,0x01,0x74,0x06,0x94,0x06,0x02,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x01,0x01,0x37,\r\n0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x61,0x01,0x2e,0x9c,0x03,0xd6,0xfe,0xb9,0x02,0xe4,0x47,0xfd,0xa0,0x01,0x40,0x01,0x20,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3e,0x40,0x22,0x9c,0x03,0x01,0x79,0x03,0x89,0x03,0x02,0xa6,0x06,0x01,0x57,0x06,0x67,0x06,0x02,0x03,0x06,\r\n0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x7d,0x01,0x12,\r\n0x9c,0x02,0x8f,0x02,0xe4,0x47,0xfd,0x71,0x02,0x8f,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x37,0xa3,0x06,0x01,0x02,0x9a,0x02,0xaa,0x02,0x02,0x7b,0x02,0x8b,0x02,0x02,0x68,0x02,0x01,0x5b,0x02,0x01,0x4a,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x91,0x06,0x01,0x85,0x06,0x01,\r\n0x76,0x06,0x01,0x03,0x06,0x02,0x04,0x05,0x08,0x37,0x07,0x01,0x07,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x5d,0x10,0xc4,0x32,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,\r\n0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x67,0x01,0x97,0xf8,0x9c,0x01,0x47,0x01,0x48,0x02,0xe4,0x47,0xfd,0x40,0xf9,0x03,0xb9,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x34,0x40,0x1d,0x01,0x04,0x06,0x08,0x03,0x02,0x02,0x03,0x05,0x93,0x04,0xa3,0x04,0x02,0x02,0x80,0x04,0x01,0x73,0x04,0x01,0x64,0x04,0x01,\r\n0x56,0x04,0x01,0x04,0x00,0x00,0x2f,0x32,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x0a,0x67,0x02,0x8f,0x9c,0x05,0x73,0x47,0xfb,0x5b,0x04,0xa5,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x45,\r\n0x40,0x29,0x88,0x03,0x98,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0xd0,0x03,0x02,0x03,0x26,0x03,0x01,0x03,0x04,0x06,0x90,0x05,0xa0,0x05,0x02,0x72,0x05,0x82,0x05,0x02,0x63,0x05,0x01,0x05,0x02,0x02,0x01,0x06,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,\r\n0xc4,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x67,0x01,0x48,0x9c,0x02,0x8f,0x02,0xe4,0x47,0xfd,0xd5,0x02,0x2b,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x7a,0x40,0x4d,0x29,0x07,0x01,0x89,0x04,0xa9,0x04,0x02,0x75,0x03,0x85,0x03,0x02,0x68,0x03,0x01,\r\n0x45,0x03,0x01,0x36,0x03,0x01,0x2a,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x78,0x04,0x98,0x04,0x02,0x04,0x05,0x07,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,0x81,0x06,0x01,0x74,0x06,0x01,0x06,0x03,0x03,0x01,0x7b,0x02,0x01,0x1c,0x02,0x01,0x0b,0x02,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,\r\n0x33,0x5d,0x5d,0x5d,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x5f,0x5d,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x47,0x01,0x48,0x9c,0x04,0x6a,\r\n0xfc,0xdd,0x04,0x3c,0x37,0xfc,0xdd,0x03,0x23,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x75,0x40,0x49,0xa4,0x07,0x01,0x95,0x07,0x01,0x89,0x04,0x99,0x04,0xa9,0x04,0x03,0x78,0x04,0x01,0x85,0x02,0x01,0x76,0x02,0x01,0x84,0x03,0x01,0x35,0x03,0x45,0x03,0x75,0x03,0x03,0x03,0x06,0x03,0x16,0x03,0x02,\r\n0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x94,0x06,0xa4,0x06,0x02,0x83,0x06,0x01,0x02,0x70,0x06,0x01,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x5f,0x5d,0x5d,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,\r\n0x5d,0x5f,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x51,0x01,0x3e,0x9c,0x03,0xd6,0xfd,0x71,0x04,0x3c,0x37,0xfc,0xc5,0x02,0x89,0xb2,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x64,0x40,0x3b,\r\n0x36,0x03,0x46,0x03,0x02,0x17,0x03,0x01,0x04,0x03,0x01,0x91,0x06,0xa1,0x06,0x02,0xa9,0x04,0x01,0x9b,0x04,0x01,0x89,0x04,0x01,0x79,0x02,0x01,0x6c,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x72,0x06,0x82,0x06,0x02,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,\r\n0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x5d,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x71,0x01,0x1e,0x9c,0x02,0x8f,0xfe,0xb8,0x04,0x3c,0x37,\r\n0xfc,0x82,0x01,0x0d,0x02,0x71,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x25,0xa6,0x06,0x01,0x94,0x06,0x01,0x76,0x06,0x86,0x06,0x02,0xad,0x03,0x01,0x99,0x03,0x01,0x88,0x03,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x06,0x02,0x02,0x08,0x00,0x00,0x2f,0x2f,0x39,0x2f,\r\n0xcd,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0x96,0xf9,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfc,0x29,0x03,0xd7,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x03,0xc1,0x05,0xba,\r\n0x00,0x08,0x00,0x55,0x40,0x35,0x74,0x06,0x01,0x56,0x06,0x01,0xa5,0x05,0x01,0x57,0x05,0x01,0xaa,0x03,0x01,0x99,0x03,0x01,0x8a,0x03,0x01,0xab,0x02,0x01,0x9c,0x02,0x01,0x8a,0x02,0x01,0x68,0x02,0x78,0x02,0x02,0x39,0x02,0x49,0x02,0x02,0x01,0x06,0x08,0x0a,0x04,0x03,0x03,0x04,0x02,0x05,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,\r\n0x39,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x48,0x71,0x01,0xb4,0xdb,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfb,0xde,0xde,0x05,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,\r\n0x05,0xba,0x00,0x07,0x00,0x3b,0x40,0x20,0xa2,0x05,0x01,0x95,0x05,0x01,0x82,0x05,0x01,0x77,0x05,0x01,0xa9,0x03,0x01,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x03,0x04,0x06,0x05,0x02,0x02,0x06,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x67,0x01,0x48,0x9c,0x01,0x47,0x04,0x3c,0x37,0xfc,0xc9,0x03,0x37,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x7c,0x40,0x50,0x89,0x06,0x01,0x76,0x06,0x01,0xca,0x03,0x01,0x97,0x03,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x35,0x03,\r\n0x45,0x03,0x02,0x28,0x03,0x01,0x15,0x03,0x01,0x07,0x03,0x01,0x47,0x06,0x01,0x9b,0x04,0xab,0x04,0x02,0x89,0x04,0x01,0x7a,0x04,0x01,0x10,0x04,0x01,0x48,0x02,0x01,0x03,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x04,0x05,0x02,0x07,0xa3,0x06,0x01,0x02,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,\r\n0x5d,0x5f,0x5d,0x2f,0x33,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x76,0x01,0x4d,0x01,0x48,0x9c,0x04,0x10,0xfb,0xf0,\r\n0x05,0x8c,0x2e,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8c,0x40,0x59,0x8a,0x06,0x01,0x76,0x06,0x01,0xa8,0x04,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x58,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x28,0x03,0x01,0x15,0x03,0x01,0x03,0x07,0x03,0x01,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,\r\n0x82,0x06,0x01,0xaa,0x04,0x01,0x03,0x79,0x04,0x89,0x04,0x99,0x04,0x03,0x14,0x04,0x01,0x9a,0x02,0xaa,0x02,0x02,0x22,0x02,0x01,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x09,0x07,0x02,0x02,0x01,0x09,0x70,0x06,0x01,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,0x5d,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,\r\n0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x79,0x01,0x55,0x01,0x3d,0x9c,0x03,0xd6,0xfc,0x2a,0x05,0x8c,0x2e,\r\n0xfb,0xc9,0x03,0xb7,0x80,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x7a,0x40,0x4b,0x76,0x06,0x01,0x07,0x06,0x01,0x8a,0x03,0x01,0x74,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x03,0x06,0x03,0x16,0x03,0x02,0xa7,0x07,0x01,0x93,0x06,0xa3,0x06,0x02,0x02,0x82,0x06,0x01,0xab,0x04,0x01,0x9a,0x04,0x01,0x03,\r\n0x02,0x04,0x01,0x02,0x7b,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x07,0x02,0x02,0x00,0x08,0x70,0x06,0x01,0x54,0x06,0x01,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x5d,0x5d,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5f,0x5d,0x5f,\r\n0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x76,0x01,0x69,0x01,0x2c,0x9c,0x02,0x8f,0xfd,0x71,0x05,0x8c,0x2e,0xfb,0x90,0x02,0x6d,0x02,0x03,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x60,\r\n0x40,0x39,0xa6,0x06,0x01,0x94,0x06,0x01,0x97,0x05,0x01,0x36,0x03,0x46,0x03,0x02,0x17,0x03,0x01,0x06,0x03,0x01,0x90,0x06,0xa0,0x06,0x02,0x82,0x06,0x01,0x71,0x06,0x01,0xab,0x04,0x01,0x89,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x05,0x08,0x07,0x02,0x02,0x00,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,\r\n0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x3d,0x79,0x01,0x81,0x01,0x11,0x9c,0x01,0x47,0xfe,0xb9,0x05,0x8c,0x2e,0xfb,0x43,\r\n0x01,0x04,0x03,0xb9,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0x94,0x04,0x01,0x76,0x04,0x86,0x04,0x02,0xa6,0x03,0x01,0x97,0x03,0x01,0xa9,0x01,0x01,0x01,0x04,0x02,0x06,0x07,0x09,0x03,0x02,0x02,0x03,0x06,0x05,0x00,0x00,0x2f,0xcd,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,\r\n0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x3d,0x79,0x01,0xa1,0xf1,0x9c,0x05,0x8c,0x2e,0xfa,0xe2,0x05,0x1e,0x00,0x01,0x00,0x1a,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x46,0x40,0x29,0x78,0x01,0x01,0x03,0x07,0x01,0x01,0xa4,0x04,0x01,0x83,0x04,0x93,0x04,\r\n0x02,0x02,0xab,0x02,0x01,0x89,0x02,0x99,0x02,0x02,0x04,0x02,0x01,0x01,0x04,0x06,0x08,0x03,0x00,0x02,0x01,0x02,0x02,0x03,0x05,0x04,0x00,0x00,0x2f,0x32,0x2f,0xc4,0x32,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,\r\n0xfe,0x3c,0x74,0x01,0x50,0x9c,0x05,0x8c,0x2e,0xfb,0xdc,0x04,0x24,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x2c,0x40,0x15,0xab,0x06,0x01,0x58,0x06,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,\r\n0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb5,0x51,0x01,0x7e,0x02,0x01,0x05,0x1e,0xfe,0xb8,0x6b,0x01,0x79,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4f,0x40,0x2d,0x93,0x07,0x01,0x47,0x07,0x57,0x07,0x02,0xa6,0x05,0x01,0x9b,\r\n0x03,0x01,0x89,0x03,0x01,0x78,0x03,0x01,0xb6,0x02,0xc6,0x02,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x04,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb0,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x03,0xd6,0x01,0x34,0xfe,0xcc,0x6b,0x01,0x79,0xfe,0xcc,0x01,0x34,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4b,0x40,0x28,0xbb,0x07,0xcb,0x07,0x02,0x76,0x07,0x01,0x67,0x07,\r\n0x01,0xa6,0x05,0x01,0x9b,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,\r\n0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa5,0xfe,0xc0,0x48,0x01,0x9b,0x01,0x48,0x9c,0x02,0x8f,0x02,0x6a,0xfe,0xdd,0x6b,0x01,0x79,0xfd,0xc1,0x02,0x3f,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x54,0x40,0x2e,0x28,0x06,0x01,0x19,0x06,0x01,0x0b,0x06,0x01,0xcf,0x07,0x01,\r\n0xbb,0x07,0x01,0xa6,0x05,0x01,0xa9,0x03,0x01,0x9b,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x8e,0xfe,0xda,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x01,0x47,0x03,0x95,0xfe,0xfa,0x6b,0x01,0x79,0xfc,0xd3,0x03,0x2d,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x39,0x88,0x05,0x01,0x29,0x05,0x01,\r\n0x0b,0x05,0x01,0x79,0x02,0x89,0x02,0x02,0x38,0x02,0x48,0x02,0x68,0x02,0x03,0xed,0x06,0x01,0xdb,0x06,0x01,0xcf,0x06,0x01,0xa6,0x04,0x01,0xad,0x02,0x01,0x9b,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x07,0x04,0x03,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,\r\n0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x05,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x81,0xfe,0xe7,0x4b,0x01,0x9b,0x01,0x48,0x9c,0x04,0xce,0xf8,0x6b,0x01,0x79,0xfb,0xe6,0x04,0x1a,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,\r\n0x00,0x06,0x00,0x35,0x40,0x1c,0xa6,0x04,0x01,0x9b,0x02,0x01,0x8a,0x02,0x01,0x69,0x02,0x01,0x58,0x02,0x01,0x05,0x02,0x06,0x08,0x03,0x04,0x04,0x03,0x03,0x01,0x02,0x06,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,\r\n0x02,0x7a,0x9c,0xfe,0xaf,0x4b,0x01,0x9c,0x9c,0x05,0x14,0xfe,0xc2,0x6b,0x01,0x79,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x42,0x40,0x25,0x59,0x07,0x99,0x07,0x02,0x9a,0x06,0x01,0x88,0x06,0x01,0x79,0x06,0x01,0x38,0x06,0x48,0x06,0x02,0x18,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x04,0x05,0x03,\r\n0x03,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x05,0x00,0xfe,0xd6,0x9c,0x01,0x48,0x00,0x01,0x00,0x96,\r\n0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x24,0x38,0x03,0x48,0x03,0x02,0x92,0x07,0xa2,0x07,0x02,0x65,0x07,0x75,0x07,0x02,0x88,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x05,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x10,0xde,0xdd,\r\n0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x02,0x8f,0x01,0x47,0x9c,0xfe,0xd7,0x02,0x71,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x42,0x40,0x23,0x97,0x06,0xa7,0x06,\r\n0x02,0xa3,0x07,0x01,0x82,0x07,0x92,0x07,0x02,0x73,0x07,0x01,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x05,0x03,0x02,0x03,0x02,0x03,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,\r\n0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x01,0x47,0x02,0x8f,0x9c,0xfe,0x07,0x03,0x41,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x46,0x40,0x28,0x94,0x05,0xa4,0x05,0x02,0x76,0x05,0x01,0x38,0x01,0x48,0x01,0x02,0x03,0xa4,0x06,0x01,0x93,0x06,0x01,0x02,0x70,\r\n0x06,0x80,0x06,0x02,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5f,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,\r\n0xee,0x9c,0x03,0xd6,0x9c,0xfd,0x38,0x04,0x10,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x55,0x40,0x31,0x84,0x06,0x94,0x06,0x02,0x47,0x06,0x01,0x47,0x05,0x01,0x08,0x05,0x01,0x89,0x04,0xa9,0x04,0x02,0x9b,0x02,0x01,0x7a,0x02,0x01,0x69,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x06,\r\n0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x2e,\r\n0x01,0x61,0x9c,0x04,0xc4,0xfd,0xcb,0x01,0x9c,0x6f,0xfe,0xc0,0x02,0x60,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x36,0xba,0x07,0x01,0xb8,0x06,0x01,0x84,0x06,0x94,0x06,0xa4,0x06,0x03,0xa2,0x05,0x01,0x93,0x05,0x01,0x86,0x05,0x01,0x47,0x05,0x01,0x08,0x05,0x01,0x59,0x02,0x01,0x06,0x03,0x04,\r\n0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x02,0x07,0x02,0x03,0x02,0x03,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,0x32,0x11,0x33,0x01,0x2f,0x32,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,\r\n0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x51,0x01,0x4a,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0x01,0x9c,0x5e,0xfe,0xb6,0x01,0x47,0x01,0x34,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x37,0x40,0x1b,0xa3,0x05,0x01,0x86,0x05,0x01,0x08,0x05,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,\r\n0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x83,0x51,0x01,0x4a,0x01,0x48,0x9c,0x02,0x8f,0x01,0x9c,0x62,0xfe,\r\n0x9e,0x02,0x8f,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x51,0x40,0x31,0x72,0x05,0x92,0x05,0x02,0x64,0x05,0x01,0x56,0x05,0x01,0x44,0x05,0x01,0x35,0x05,0x01,0x27,0x05,0x01,0x64,0x04,0x74,0x04,0x02,0x46,0x04,0x01,0x88,0x03,0xa8,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x03,0x05,0x02,0x04,0x03,0x02,\r\n0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x1d,0x54,0x02,0x8f,0x9c,0x01,0x47,0x02,0xe4,0x65,0xfd,0x71,0x03,0xb9,0x00,0x00,0x01,\r\n0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4d,0x40,0x2c,0x54,0x06,0x94,0x06,0xa4,0x06,0x03,0x08,0x04,0x01,0xa9,0x02,0x01,0x9a,0x02,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0x05,0x02,0x04,0x03,0x84,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x02,0x03,0x02,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,\r\n0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x4b,0x01,0xb7,0xe1,0x9c,0x02,0x8f,0x01,0x9c,0x64,0xfe,0x4e,0xfe,0x55,0x04,0x88,0x00,0x00,0x01,0x00,0x42,0x00,0x00,\r\n0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x4f,0x40,0x30,0x94,0x05,0x01,0x75,0x05,0x01,0x46,0x05,0x56,0x05,0x66,0x05,0x03,0x56,0x04,0x76,0x04,0x02,0x47,0x04,0x01,0x08,0x04,0x01,0x88,0x03,0xa8,0x03,0x02,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,\r\n0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x48,0x01,0x54,0x9c,0x02,0x8f,0x01,0x9c,0x5d,0xfe,0xad,0x02,0x85,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,\r\n0x40,0x4a,0x86,0x06,0x01,0x77,0x06,0x01,0xc9,0x05,0x01,0x75,0x03,0x85,0x03,0xc5,0x03,0x03,0x68,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0x28,0x03,0x01,0xa2,0x06,0x01,0x94,0x06,0x01,0xdb,0x05,0xfb,0x05,0x02,0xcc,0x05,0x01,0xc0,0x02,0x01,0x9c,0x02,0x01,0x8b,0x02,0x01,0x78,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,\r\n0x06,0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x01,0x02,0x08,0x01,0x00,0x2f,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,\r\n0xc1,0x9c,0xfe,0xb9,0xfe,0x51,0x5d,0x01,0x48,0x01,0x51,0x9c,0x04,0x6a,0xfc,0xdd,0x03,0x47,0x3e,0xfd,0x77,0x03,0x77,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3d,0x85,0x06,0x01,0x76,0x06,0x01,0x85,0x03,0x01,0x74,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x29,0x03,0x01,0xa0,0x06,0x01,0x94,\r\n0x06,0x01,0xcb,0x05,0xdb,0x05,0x02,0x8e,0x02,0x01,0x7a,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x07,0x02,0x05,0x04,0x03,0x02,0x04,0x04,0x02,0x03,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x51,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0x03,0x47,0x3e,0xfd,0x71,0x02,0x8f,0xee,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5e,0x40,0x37,\r\n0x76,0x06,0x01,0x76,0x03,0x01,0x37,0x03,0x47,0x03,0x02,0xa4,0x06,0x01,0x93,0x06,0x01,0x84,0x06,0x01,0xcb,0x05,0xdb,0x05,0x02,0xa6,0x05,0x01,0x6c,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x07,0x02,0x05,0x04,0x03,0x02,0x04,0x04,0x02,0x03,0x03,0x08,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,\r\n0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x6b,0x01,0x2e,0x9c,0x02,0x8f,0xfe,0xb8,0x03,0x47,0x3e,0xfd,0x46,0x01,0x41,0x02,0x67,\r\n0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2f,0x40,0x15,0xa6,0x05,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,\r\n0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0x87,0x01,0x12,0x9c,0x01,0x47,0x03,0x4a,0x3b,0xfd,0x17,0x03,0xd7,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x71,0x40,0x46,0xa0,0x06,0x01,0x93,0x06,0x01,0x74,0x06,0x01,0x65,0x06,0x01,0x56,0x06,0x01,0xa1,0x05,0x01,\r\n0x90,0x05,0x01,0x85,0x05,0x01,0x44,0x05,0x01,0x36,0x05,0x01,0xdb,0x04,0x01,0xc9,0x04,0x01,0x96,0x04,0xa6,0x04,0x02,0x77,0x04,0x01,0x94,0x02,0x01,0x88,0x02,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x04,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,\r\n0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x37,0x01,0x17,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x5d,0x01,0xa1,0xf8,0x9c,0x01,0x47,0x03,0x47,0x3e,0xfc,0xe6,0xf8,0x05,0x00,0x00,0x01,0x00,0x2f,\r\n0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x54,0x40,0x32,0xfa,0x04,0x01,0xd9,0x04,0xe9,0x04,0x02,0x77,0x04,0x01,0xa2,0x05,0x01,0x91,0x05,0x01,0x80,0x05,0x01,0xcb,0x04,0x01,0xa7,0x04,0x01,0x94,0x04,0x01,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0xd0,0x03,0x02,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,\r\n0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x5d,0x01,0x52,0x9c,0x01,0x47,0x03,0x47,0x42,0xfd,0x77,0x03,0x73,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,\r\n0x05,0xba,0x00,0x08,0x00,0x62,0x40,0x3c,0x85,0x06,0x01,0x75,0x03,0x85,0x03,0x02,0x58,0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x94,0x06,0xa4,0x06,0x02,0x76,0x06,0x86,0x06,0x02,0x9b,0x02,0x01,0x8c,0x02,0x01,0x02,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x01,0x02,\r\n0x08,0x06,0x03,0x01,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x51,0x6a,0x01,0x3a,0x01,0x52,0x9c,0x04,0x10,\r\n0xfb,0xf0,0x05,0x10,0x2a,0xfc,0x49,0x04,0x37,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x72,0x40,0x47,0x85,0x06,0x01,0x76,0x06,0x01,0xd8,0x05,0x01,0x75,0x03,0x85,0x03,0x02,0x58,0x03,0x01,0x34,0x03,0x44,0x03,0x02,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0xa0,0x06,0x01,0x92,0x06,0x01,0x70,0x06,\r\n0x80,0x06,0x02,0xb9,0x05,0x01,0x7f,0x02,0x8f,0x02,0x02,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x44,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x05,0x10,0x24,0xfc,0x3a,0x03,0xcc,0x80,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x78,0x40,0x4c,0xa7,0x06,\r\n0x01,0x76,0x06,0x01,0xb8,0x05,0x01,0x8a,0x03,0x01,0x45,0x03,0x75,0x03,0x02,0x36,0x03,0x01,0x28,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0xa1,0x06,0x01,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x54,0x06,0x64,0x06,0x02,0x9e,0x02,0xae,0x02,0x02,0x8f,0x02,0x01,0x7d,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,\r\n0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,\r\n0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x5a,0x01,0x32,0x9c,0x02,0x8f,0xfd,0x71,0x05,0x10,0x2d,0xfc,0x19,0x02,0x6b,0x01,0xf9,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3e,0x57,0x06,0x01,0x76,0x05,0x01,0x79,0x03,0x89,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x07,0x03,0x17,0x03,0x02,0x92,0x06,0xa2,\r\n0x06,0x02,0x84,0x06,0x01,0x75,0x06,0x01,0x9a,0x04,0xaa,0x04,0x02,0x8a,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,\r\n0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x52,0x6a,0x01,0x7b,0x01,0x11,0x9c,0x01,0x47,0xfe,0xb9,0x05,0x10,0x2d,0xfb,0xc4,0x01,0x00,0x03,0xb9,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x34,0x40,0x1c,\r\n0x86,0x04,0xa6,0x04,0x02,0x77,0x04,0x01,0x98,0x01,0xa8,0x01,0x02,0x01,0x04,0x02,0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x05,0x00,0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x52,\r\n0x6a,0x01,0x9d,0xef,0x9c,0x05,0x10,0x2a,0xfb,0x62,0x05,0x1e,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x2e,0x40,0x18,0x01,0x04,0x06,0x08,0x03,0x04,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0xa3,0x04,0x01,0x02,0x80,0x04,0x90,0x04,0x02,0x04,0x00,0x00,0x2f,0x32,0x5d,0x5f,0x5d,0x2f,0x39,0x2f,0x33,0x01,0x2f,\r\n0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x51,0x6a,0x01,0x45,0x9c,0x05,0x10,0x27,0xfc,0x23,0x04,0x60,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x3e,0x40,0x24,0x8b,0x06,0x9b,0x06,0xab,0x06,0x03,0x59,0x06,0x69,0x06,0x02,0xa5,0x04,0x01,0x86,\r\n0x04,0x01,0x76,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x01,0x02,0x07,0x01,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb2,0x6a,0x01,0x5e,0x02,0x3d,\r\n0x05,0x1e,0xfd,0x71,0x50,0x02,0xdb,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x74,0x40,0x47,0xc9,0x06,0x01,0x46,0x06,0x01,0x37,0x06,0x01,0xa6,0x04,0x01,0x95,0x04,0x01,0xc9,0x07,0x01,0x94,0x07,0x01,0x47,0x07,0x57,0x07,0x02,0xc6,0x03,0x01,0xb7,0x03,0x01,0xac,0x03,0x01,0x8b,0x03,0x9b,0x03,0x02,\r\n0x7d,0x03,0x01,0x59,0x03,0x69,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x08,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x95,0x6a,0x01,0xb8,0x01,0x47,0x9c,0x03,0xd6,0x01,0x23,0xfd,0x99,0x4d,0x02,0xdb,0xfe,0xcc,0x01,0x34,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x78,0x40,0x4c,0xf9,0x06,\r\n0x01,0x76,0x06,0x86,0x06,0xc6,0x06,0x03,0x45,0x06,0x01,0x34,0x06,0x01,0x2a,0x06,0x01,0xc7,0x03,0x01,0x74,0x07,0x94,0x07,0x02,0x66,0x07,0x01,0x45,0x07,0x01,0xa6,0x05,0x01,0x87,0x05,0x01,0x66,0x05,0x01,0x57,0x05,0x01,0x9f,0x03,0xaf,0x03,0x02,0x8b,0x03,0x01,0x7d,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,\r\n0x06,0x08,0x05,0x04,0x07,0x02,0x02,0x01,0x08,0x01,0x00,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,\r\n0x9c,0xfe,0xb8,0xfe,0xb3,0x6a,0x01,0xb7,0x01,0x48,0x9c,0x02,0x8f,0x02,0x35,0xfd,0xcb,0x50,0x02,0xdb,0xfd,0xcb,0x02,0x35,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x98,0x40,0x63,0xf5,0x06,0x01,0xc6,0x06,0x01,0x84,0x06,0x01,0x75,0x06,0x01,0x59,0x06,0x01,0x36,0x06,0x46,0x06,0x02,0x2a,0x06,0x01,0xf5,\r\n0x03,0x01,0xc7,0x03,0x01,0x85,0x03,0x01,0x76,0x03,0x01,0xa6,0x07,0x01,0x90,0x07,0x01,0x74,0x07,0x84,0x07,0x02,0x6c,0x07,0x01,0x57,0x07,0x01,0x2b,0x07,0x01,0x94,0x05,0x01,0x66,0x05,0x86,0x05,0x02,0x54,0x05,0x01,0xad,0x03,0x01,0x7b,0x03,0x9b,0x03,0x02,0x69,0x03,0x01,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,\r\n0x08,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x08,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,\r\n0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa2,0xfe,0xc9,0x6a,0x01,0xb7,0x01,0x48,0x9c,0x01,0x47,0x03,0x57,0xfd,0xf9,0x48,0x02,0xdb,0xfc,0xdd,0x03,0x23,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x76,0x40,0x4b,0xc5,0x05,0x01,0x8b,0x05,0x01,0x7a,0x05,0x01,0x68,0x05,0x01,0x5a,0x05,\r\n0x01,0x36,0x05,0x46,0x05,0x02,0x2a,0x05,0x01,0xc6,0x02,0x01,0x8b,0x02,0x01,0x7a,0x02,0x01,0x59,0x02,0x01,0xc9,0x06,0x01,0x90,0x06,0x01,0x84,0x04,0x94,0x04,0x02,0x9f,0x02,0xaf,0x02,0x02,0x8b,0x02,0x01,0x7e,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x07,0x04,0x03,0x03,0x07,0x06,0x00,0x00,0x2f,0x32,\r\n0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x96,0xfe,0xd5,0x6a,0x01,0xb8,0x01,0x47,0x9c,0x04,0x81,0xfe,0x19,\r\n0x45,0x02,0xdb,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x3d,0x40,0x23,0x87,0x04,0x97,0x04,0x02,0xac,0x02,0x01,0x02,0x8f,0x02,0x9f,0x02,0x02,0x6d,0x02,0x7d,0x02,0x02,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x03,0x01,0x02,0x06,0x01,0x00,0x2f,0x2f,0x33,0x12,\r\n0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb2,0x6a,0x01,0xb8,0x9c,0x04,0xba,0xfd,0xd7,0x4e,0x02,0xdb,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x18,0x69,0x06,0x79,0x06,0x02,0x06,\r\n0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0xb8,0x54,0x01,0x7e,0x01,0x65,\r\n0x9c,0x03,0xd6,0xfe,0xbc,0x67,0x01,0x79,0x01,0x48,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5b,0x40,0x35,0xc9,0x07,0x01,0x65,0x07,0x75,0x07,0x02,0x47,0x07,0x01,0xb9,0x06,0x01,0x87,0x06,0x01,0x75,0x06,0x01,0x66,0x06,0x01,0xb9,0x05,0x01,0xa9,0x03,0x01,0x9b,0x02,0x01,0x06,0x03,0x05,0x02,0x07,0x09,\r\n0x0b,0x04,0x05,0x05,0x04,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0xc6,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,\r\n0xfe,0xb8,0xfe,0xb9,0x54,0x01,0x9b,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfe,0xc9,0x5a,0x01,0x8d,0xfe,0xb9,0x02,0x7b,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x53,0x40,0x2f,0xcc,0x07,0x01,0x02,0xbc,0x07,0x01,0xbb,0x06,0x01,0x96,0x06,0x01,0x89,0x03,0x01,0x58,0x03,0x68,0x03,0x78,0x03,0x03,0x03,\r\n0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,\r\n0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa5,0xfe,0xcc,0x54,0x01,0x9b,0x01,0x48,0x9c,0x01,0x47,0x02,0x8f,0xfe,0xc9,0x5a,0x01,0x9e,0xfd,0x9c,0x03,0x87,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x38,0x54,0x05,0x01,0x27,0x05,0x01,0x19,0x05,0x01,0xeb,0x06,0x01,0xdf,0x06,0x01,0xcd,0x06,0x01,\r\n0xa2,0x06,0x01,0x64,0x06,0x74,0x06,0x94,0x06,0x03,0x1f,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x8f,0xfe,0xe2,0x54,0x01,0x9c,0x01,0x47,0x9c,0x03,0xd6,0xfe,0xc9,0x5a,0x01,0xd2,0xfc,0x85,0x04,0x6a,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x38,0x40,0x1e,0xf6,0x04,0x01,0xc7,\r\n0x04,0x01,0x87,0x03,0xa7,0x03,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x54,\r\n0x01,0x9c,0x9c,0x03,0xd6,0xfe,0xd2,0x51,0x01,0x83,0x01,0x3e,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3a,0x40,0x1f,0x96,0x03,0xa6,0x03,0x02,0xa9,0x02,0x01,0x8b,0x02,0x9b,0x02,0x02,0x7c,0x02,0x01,0x02,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x04,0x06,0x03,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,\r\n0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x47,0x01,0x48,0x9c,0x04,0x88,0xfe,0x07,0x9c,0x02,0x8f,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3d,0x40,0x20,\r\n0x46,0x07,0x01,0x37,0x07,0x01,0x09,0x07,0x01,0x8b,0x02,0x01,0x09,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,\r\n0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0x9c,0x01,0x65,0x01,0x2a,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3b,0x40,0x1f,0xa6,0x07,0x01,0x95,0x07,0x01,0x46,0x07,0x01,0x34,0x07,0x01,0x78,0x02,0x01,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,\r\n0x04,0x05,0x03,0x02,0x03,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0x01,0x48,0x9c,0xfe,0xd6,\r\n0x03,0xb9,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3e,0x40,0x23,0x74,0x05,0x01,0x89,0x02,0x99,0x02,0xa9,0x02,0x03,0x78,0x02,0x01,0x94,0x06,0xa4,0x06,0x02,0x53,0x06,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,\r\n0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x13,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0xa1,0xee,0x9c,0x02,0x8f,0x9c,0xfe,0x07,0x04,0x88,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x49,0x40,0x28,0xa2,0x06,0x01,0x94,0x06,0x01,\r\n0x46,0x06,0x01,0x92,0x05,0xa2,0x05,0x02,0x74,0x05,0x01,0x65,0x05,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x06,0x03,0x05,0x04,0x03,0x04,0x03,0x04,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x1d,0x01,0x72,0x9c,0x04,0x74,0xfc,0xd3,0x01,0x9c,0x70,0xfe,0xd2,0x03,0x95,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x57,0x40,0x33,0xa0,0x06,0x01,0x92,0x06,0x01,0x44,0x06,0x74,0x06,0x84,0x06,0x03,0x92,\r\n0x05,0xa2,0x05,0x02,0x76,0x05,0x01,0x65,0x05,0x01,0x37,0x05,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x07,0x02,0x03,0x04,0x02,0x02,0x04,0x03,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x2e,0x01,0x61,0x9c,0x03,0xd6,0xfd,0x71,0x01,0x9c,0x70,0xfe,0xd3,0x02,0xba,0xda,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x61,0x40,0x3b,0xa2,0x06,0x01,0x93,0x06,0x01,\r\n0x87,0x06,0x01,0x64,0x06,0x74,0x06,0x02,0x46,0x06,0x01,0xa1,0x05,0x01,0x92,0x05,0x01,0x36,0x05,0x46,0x05,0x66,0x05,0x76,0x05,0x04,0xb7,0x02,0xd7,0x02,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x06,0x03,0x05,0x04,0x02,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,\r\n0x32,0x11,0x33,0x01,0x2f,0x32,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x51,0x01,0x3e,0x9c,0x02,0x8f,0xfe,0xb8,0x01,0x9c,0x70,0xfe,0xaa,0x01,0x42,0x02,0x7b,0x00,0x00,0x01,\r\n0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3e,0x40,0x20,0xa2,0x05,0x01,0x94,0x05,0x01,0x96,0x05,0x01,0x67,0x05,0x77,0x05,0x02,0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x05,0x04,0x03,0x04,0x03,0x04,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,\r\n0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9a,0xfe,0x83,0x54,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0x01,0x9c,0x61,0xfe,0x9f,0x03,0xd7,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x42,0x40,0x28,0x98,0x01,0xa8,0x01,0x02,0x36,\r\n0x04,0x46,0x04,0x56,0x04,0x03,0x27,0x04,0x01,0x46,0x03,0x01,0x37,0x03,0x01,0x68,0x02,0x78,0x02,0x88,0x02,0x03,0x01,0x04,0x06,0x08,0x03,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,\r\n0x33,0x03,0xc1,0x9c,0xfd,0x1d,0x54,0x02,0x8f,0x9c,0x02,0xe3,0x66,0xfd,0x71,0x05,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x3b,0x40,0x21,0x85,0x05,0x01,0x48,0x03,0x58,0x03,0x68,0x03,0x98,0x03,0xa8,0x03,0x05,0x02,0x05,0x07,0x09,0x04,0x00,0x03,0x01,0x03,0x05,0x02,0x04,0x03,0x02,0x03,0x02,\r\n0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x54,0x01,0x48,0x9c,0x01,0x47,0x01,0x9c,0x52,0xfe,0xb8,0x03,0xcd,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,\r\n0x00,0x08,0x00,0x7c,0x40,0x4f,0x8a,0x06,0x01,0x29,0x06,0x79,0x06,0x02,0xf9,0x03,0x01,0xc5,0x03,0x01,0x7b,0x03,0x8b,0x03,0x02,0x36,0x03,0x46,0x03,0x02,0x29,0x03,0x01,0x07,0x03,0x17,0x03,0x02,0x03,0x93,0x06,0xa3,0x06,0x02,0x02,0x81,0x06,0x01,0x70,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x87,0x05,0x01,0x03,0x9b,0x02,0x01,0x20,\r\n0x02,0x01,0x02,0x03,0x06,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x00,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x48,0x70,0x01,0x2c,0x01,0x63,0x9c,0x04,0x10,0xfb,0xf0,0x03,0x6e,0x49,0xfd,0x93,0x04,0x70,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8e,0x40,0x5c,0xc5,0x06,0x01,0x89,0x06,0x01,0x56,0x06,0x76,0x06,0x02,0x29,0x06,0x01,\r\n0xf9,0x03,0x01,0xc5,0x03,0x01,0x8b,0x03,0x01,0x36,0x03,0x46,0x03,0x76,0x03,0x03,0x29,0x03,0x01,0x17,0x03,0x01,0x03,0x07,0x03,0x01,0x77,0x07,0x01,0xa4,0x06,0x01,0x92,0x06,0x01,0x02,0x70,0x06,0x80,0x06,0x02,0x64,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0x86,0x05,0x01,0x8a,0x04,0x01,0x03,0x23,0x02,0x01,0x02,0x06,0x03,0x04,\r\n0x02,0x07,0x09,0x0b,0x05,0x04,0x04,0x02,0x04,0x02,0x00,0x09,0x03,0x00,0x00,0x2f,0xc4,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5f,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,\r\n0x11,0x01,0x01,0x37,0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x48,0x70,0x01,0x32,0x01,0x5d,0x9c,0x03,0xd6,0xfc,0x2a,0x03,0x6e,0x4c,0xfd,0x9c,0x03,0xee,0x76,0x00,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x7c,0x40,0x4f,0x76,0x06,0x86,0x06,0x02,0xf9,0x03,0x01,0x85,0x03,0xc5,0x03,0x02,0x74,\r\n0x03,0x01,0x35,0x03,0x45,0x03,0x02,0x07,0x03,0x17,0x03,0x02,0xa1,0x06,0x01,0x80,0x06,0x90,0x06,0x02,0x74,0x06,0x01,0x55,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0xae,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x7b,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,\r\n0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x49,0x70,0x01,0x47,\r\n0x01,0x48,0x9c,0x02,0x8f,0xfd,0x71,0x03,0x6e,0x52,0xfd,0x59,0x02,0xad,0x01,0xf4,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5c,0x40,0x36,0x57,0x06,0x01,0x07,0x03,0x17,0x03,0x37,0x03,0x47,0x03,0x04,0xa2,0x06,0x01,0x80,0x06,0x90,0x06,0x02,0x72,0x06,0x01,0xa2,0x05,0x01,0x94,0x05,0x01,0x89,0x02,0x01,\r\n0x03,0x06,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,\r\n0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x49,0x70,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0xfe,0xb9,0x03,0x6e,0x49,0xfd,0x2e,0x01,0x3a,0x03,0x9b,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x36,0x40,0x1e,0xa5,0x03,0x01,0x84,0x03,0x94,0x03,0x02,0x59,0x01,0x79,0x01,0xa9,0x01,0x03,0x01,0x04,0x02,\r\n0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x05,0x00,0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x21,0x21,0x01,0x37,0x01,0x33,0x11,0x33,0x03,0xc1,0xfe,0x1c,0xfe,0x49,0x70,0x01,0x91,0xfe,0x9c,0x03,0x6e,0x49,0xfc,0xe5,0x05,0x1e,0x00,0x01,0x00,0x26,\r\n0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x46,0x40,0x2c,0x84,0x03,0x94,0x03,0xa4,0x03,0x03,0x80,0x04,0x90,0x04,0xa0,0x04,0x03,0x72,0x04,0x01,0x64,0x04,0x01,0x46,0x04,0x01,0x64,0x03,0x74,0x03,0x84,0x03,0x03,0x01,0x04,0x06,0x08,0x00,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,\r\n0x2f,0x5d,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x48,0x70,0x01,0x48,0x9c,0x03,0x6e,0x4f,0xfd,0x57,0x04,0xa6,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x48,0x40,0x2b,0x9d,0x06,0xad,0x06,0x02,0x8b,0x06,0x01,\r\n0x79,0x06,0x01,0x94,0x04,0xa4,0x04,0x02,0x86,0x04,0x01,0x75,0x04,0x01,0x57,0x04,0x01,0x67,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x05,0x04,0x04,0x00,0x02,0x07,0x00,0x00,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,\r\n0x11,0x23,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xef,0xfe,0x60,0x73,0x01,0xba,0x01,0xe4,0x05,0x1e,0xfc,0x29,0x48,0x04,0x2b,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x72,0x40,0x48,0x36,0x06,0x01,0x07,0x06,0x17,0x06,0x02,0x96,0x03,0xa6,0x03,0x02,0x90,0x07,0x01,0x55,0x07,0x01,0x36,0x07,0x01,0xa4,0x05,\r\n0x01,0x92,0x05,0x01,0x74,0x05,0x84,0x05,0x02,0x8f,0x03,0x9f,0x03,0xaf,0x03,0x03,0x7d,0x03,0x01,0x4b,0x03,0x5b,0x03,0x6b,0x03,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,\r\n0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x25,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xef,0xfe,0x82,0x73,0x01,0xba,0x01,0x48,0x9c,0x03,0xd6,0xe3,0xfc,0x8e,0x41,0x04,0x32,0xfe,0xea,0x01,0x16,0x00,0x00,0x01,0x00,0x23,\r\n0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x74,0x40,0x4a,0x79,0x06,0x89,0x06,0x02,0x44,0x06,0x01,0x33,0x06,0x01,0x07,0x06,0x17,0x06,0x02,0x79,0x03,0x89,0x03,0x02,0x45,0x03,0x01,0x36,0x03,0x01,0x74,0x07,0xa4,0x07,0x02,0x45,0x07,0x55,0x07,0x65,0x07,0x03,0x94,0x05,0xa4,0x05,0x02,0x9f,0x03,0xaf,0x03,0x02,0x89,0x03,0x01,\r\n0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,\r\n0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcb,0xfe,0xa6,0x73,0x01,0xba,0x01,0x48,0x9c,0x02,0x8f,0x02,0x02,0xfc,0xb6,0x3b,0x04,0x38,0xfd,0xe9,0x02,0x17,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x92,0x40,0x5f,0xf9,0x06,0x01,0xca,0x06,0x01,0x75,0x06,0x85,0x06,0x02,0x36,0x06,0x46,\r\n0x06,0x02,0x07,0x06,0x17,0x06,0x02,0x76,0x03,0x86,0x03,0x02,0x90,0x07,0x01,0x72,0x07,0x82,0x07,0x02,0x2d,0x07,0x01,0x13,0x07,0x01,0x03,0x06,0x07,0x01,0xa7,0x05,0x01,0x95,0x05,0x01,0x86,0x05,0x01,0x77,0x05,0x01,0xac,0x03,0x01,0x02,0x8f,0x03,0x9f,0x03,0x02,0x6d,0x03,0x7d,0x03,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,\r\n0x05,0x5b,0x03,0x01,0x03,0x06,0x09,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x73,0x01,0xba,0x01,0x48,0x9c,0x01,0x47,0x03,0x05,0xfc,0xfb,0x3e,0x04,0x35,0xfc,0xdd,0x03,0x23,0x00,0x01,0x00,0x23,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x72,0x40,0x4b,0x07,0x05,0x01,0xf9,0x05,0x01,0x35,0x05,0x45,0x05,\r\n0x75,0x05,0x85,0x05,0xc5,0x05,0x05,0x28,0x05,0x01,0x07,0x05,0x17,0x05,0x02,0x76,0x02,0x86,0x02,0x02,0x84,0x06,0x01,0x92,0x04,0xa2,0x04,0x02,0x84,0x04,0x01,0x76,0x04,0x01,0xae,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x5d,0x02,0x7d,0x02,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x08,0x04,0x03,0x03,0x08,0x06,\r\n0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xae,0xfe,0xc3,0x73,0x01,0xbb,0x01,0x47,0x9c,0x04,0x37,0xfd,0x10,\r\n0x3e,0x04,0x35,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x3e,0x40,0x22,0x67,0x03,0x01,0xa3,0x04,0x01,0xae,0x02,0x01,0x03,0x8b,0x02,0x9b,0x02,0x02,0x7c,0x02,0x01,0x02,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x03,0x02,0x06,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,\r\n0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5f,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x73,0x01,0xbb,0x9c,0x04,0x74,0xfc,0xd3,0x38,0x04,0x3b,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x61,0x40,0x3a,0x92,0x06,0x01,0x76,\r\n0x06,0x86,0x06,0x02,0x67,0x06,0x01,0xa2,0x05,0x01,0x93,0x05,0x01,0x86,0x05,0x01,0x74,0x05,0x01,0xaf,0x03,0x01,0x99,0x03,0x01,0x8b,0x03,0x01,0x78,0x03,0x01,0x5b,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x05,0x04,0x06,0x03,0x04,0x03,0x04,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,\r\n0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x67,0x01,0xae,0x01,0x48,0x9c,0x04,0xf6,0xfe,0xe0,0xfd,0x71,0x51,0x02,0xbd,0x01,0x65,0x00,0x00,0x01,0x00,0x2f,\r\n0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x26,0xaf,0x06,0x01,0x9b,0x06,0x01,0x7a,0x06,0x8a,0x06,0x02,0x95,0x04,0x01,0x57,0x03,0x67,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,\r\n0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xee,0xfe,0x83,0x67,0x01,0xae,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0x4e,0x02,0xdd,0x01,0x48,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3d,0x49,0x06,\r\n0x01,0x38,0x06,0x01,0x07,0x06,0x01,0xa0,0x07,0x01,0x91,0x07,0x01,0x74,0x07,0x01,0x65,0x07,0x01,0x94,0x06,0xa4,0x06,0x02,0x99,0x03,0xa9,0x03,0x02,0x8a,0x03,0x01,0x78,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x07,0x02,0x06,0x03,0x04,0x02,0x03,0x03,0x02,0x04,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd2,0xfe,0x9f,0x67,0x01,0xae,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfd,0x71,0x41,\r\n0x03,0x19,0xfe,0xa8,0x02,0x71,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4b,0x40,0x2a,0x84,0x07,0xa4,0x07,0x02,0x76,0x07,0x01,0xa1,0x06,0x01,0x70,0x06,0x80,0x06,0x90,0x06,0x03,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,\r\n0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x67,0x01,0xae,0x01,0x48,0x9c,0x01,0x47,0x02,0x8f,0xfd,0x71,0x32,0x03,0x67,0xfd,\r\n0x5d,0x03,0x7d,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4b,0x40,0x2a,0xa6,0x06,0x01,0x74,0x06,0x84,0x06,0x02,0x93,0x05,0xa3,0x05,0x02,0x02,0x70,0x05,0x80,0x05,0x02,0x64,0x05,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,\r\n0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xa3,0xfe,0xce,0x67,0x01,0xaf,0x01,0x47,0x9c,0x03,0xd6,0xfd,0x71,0x41,0x03,0x9a,0xfc,0x4c,0x04,0x4c,0x00,0x01,\r\n0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x45,0x40,0x28,0x94,0x04,0xa4,0x04,0x02,0x86,0x04,0x01,0x9f,0x02,0xaf,0x02,0x02,0x8d,0x02,0x01,0x6a,0x02,0x7a,0x02,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,\r\n0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x35,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x67,0x01,0xaf,0x9c,0x03,0xd6,0xfd,0x71,0x44,0x03,0x7d,0xb2,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5f,0x40,0x39,0x92,0x06,0xa2,0x06,0x02,0x84,\r\n0x06,0x01,0x67,0x06,0x77,0x06,0x02,0x46,0x06,0x01,0x37,0x06,0x01,0xa6,0x05,0x01,0x94,0x05,0x01,0x58,0x03,0x01,0xaf,0x02,0x01,0x9d,0x02,0x01,0x8b,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x05,0x04,0x06,0x03,0x04,0x03,0x04,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,\r\n0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xff,0xfe,0x70,0x4b,0x01,0x7d,0x01,0x5d,0x9c,0x04,0x88,0xfe,0x07,0xfe,0xb8,0x73,0x01,0x40,0x02,0xc0,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,\r\n0x05,0xba,0x00,0x07,0x00,0x33,0x40,0x19,0xb9,0x05,0x01,0x65,0x05,0x01,0x56,0x05,0x01,0x02,0x05,0x07,0x09,0x03,0x04,0x05,0x02,0x04,0x03,0x02,0x03,0x02,0x03,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,\r\n0x33,0x03,0xc1,0x9c,0xfd,0x71,0x4b,0x02,0xda,0x9c,0x03,0xd6,0xfd,0x71,0x6d,0x02,0xdc,0x01,0x2a,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x30,0x40,0x16,0x88,0x06,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x05,0x04,0x06,0x02,0x04,0x02,0x04,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,\r\n0x2f,0x10,0xcd,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x4b,0x01,0x7e,0x01,0x5c,0x9c,0x02,0x8f,0xfe,0xb8,0x67,0x01,0x7d,0x02,0x8f,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x53,\r\n0x40,0x2f,0x84,0x07,0x01,0x56,0x07,0x01,0x47,0x07,0x01,0x84,0x06,0x01,0x77,0x06,0x01,0xb9,0x05,0x01,0x99,0x03,0xa9,0x03,0x02,0x03,0x06,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x05,0x04,0x06,0x03,0x02,0x04,0x03,0x03,0x04,0x02,0x03,0x09,0x00,0x00,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,\r\n0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x4b,0x01,0x92,0x01,0x48,0x9c,0x01,0x47,0x01,0x48,0xfe,0xb8,0x63,0x01,0x95,0xfe,0xb8,0x03,0xc3,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x03,0xc1,\r\n0x05,0xba,0x00,0x08,0x00,0x4d,0x40,0x2b,0xa2,0x06,0x01,0x94,0x06,0x01,0x85,0x06,0x01,0x57,0x06,0x01,0xa2,0x05,0x01,0x74,0x05,0x94,0x05,0x02,0xa4,0x04,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,\r\n0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0x9f,0xfe,0xd2,0x4b,0x01,0x93,0x01,0x47,0x9c,0x02,0x8f,0xfe,0xb8,0x70,0x01,0xa3,0xfd,0x9c,0x04,0xc4,0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,\r\n0x00,0x3f,0x40,0x23,0xe9,0x05,0x01,0xbb,0x05,0xcb,0x05,0x02,0xb9,0x04,0xe9,0x04,0x02,0x79,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x04,0x03,0x05,0x02,0x03,0x02,0x03,0x02,0x07,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,\r\n0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x4b,0x01,0x93,0x9c,0x02,0x8f,0xfe,0xb8,0x5a,0x01,0x94,0x02,0x85,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3a,0x40,0x1f,0x38,0x07,0x01,0x9b,0x06,0xab,0x06,0x02,0x9f,0x02,0x01,0x8b,0x02,0x01,0x7c,0x02,0x01,0x06,0x03,0x04,\r\n0x07,0x02,0x08,0x0a,0x04,0x06,0x03,0x03,0x02,0x08,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x47,0x01,0x48,0x9c,0x04,0x10,0xfd,0x37,0x9c,0x03,0xd7,0x00,\r\n0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x28,0x40,0x11,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x06,0x07,0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x35,0x33,\r\n0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x01,0x51,0x01,0x3e,0x9c,0x03,0xd6,0xfd,0x71,0x9c,0x03,0x39,0x9e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x41,0x40,0x23,0x65,0x07,0x01,0x37,0x07,0x01,0x18,0x07,0x01,0x7a,0x02,0x01,0x48,0x02,0x01,0x19,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,\r\n0x02,0x03,0x02,0x03,0x02,0x09,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,0xcd,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x02,0x8f,0xfe,0xb8,0x9c,0x01,0x66,\r\n0x02,0x71,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x3e,0x40,0x23,0x38,0x02,0x48,0x02,0x88,0x02,0x03,0xa2,0x06,0x01,0x93,0x06,0x01,0x65,0x06,0x75,0x06,0x02,0x56,0x06,0x01,0x02,0x05,0x03,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x02,0x08,0x06,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0xcd,0x01,0x2f,0x10,0xde,\r\n0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x01,0x65,0x01,0x2a,0x9c,0x01,0x47,0x9c,0xfe,0xd7,0x05,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4e,0x40,0x2d,0x68,0x06,0x78,0x06,0x02,0x46,\r\n0x05,0x01,0x28,0x03,0xc8,0x03,0x02,0xa2,0x06,0x01,0x94,0x06,0x01,0x99,0x04,0xa9,0x04,0x02,0xab,0x02,0x01,0x06,0x03,0x04,0x07,0x02,0x08,0x0a,0x05,0x04,0x05,0x04,0x04,0x00,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,\r\n0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x33,0x03,0xc1,0x9c,0xfe,0xb9,0xfe,0x64,0x54,0x01,0x11,0x01,0x7e,0x9c,0x04,0x10,0xfb,0xf0,0x01,0x9b,0x66,0xfe,0xfc,0x04,0xbd,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x23,0x46,0x05,0x01,0x28,0x03,0xc8,0x03,0x02,\r\n0x99,0x04,0xa9,0x04,0x02,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x05,0x04,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,\r\n0x01,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x1d,0x01,0x72,0x9c,0x03,0xd6,0xfc,0x2a,0x01,0x9b,0x66,0xfe,0xe7,0x04,0x5c,0x76,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x48,0x40,0x25,0x47,0x05,0x01,0x28,0x03,0x01,0x93,0x06,0x01,0xa9,0x04,0x01,0x98,0x04,0x01,0x06,0x03,0x04,\r\n0x02,0x07,0x09,0x0b,0x05,0x04,0x05,0x04,0x07,0x02,0x04,0x02,0x04,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,\r\n0x9c,0xfe,0xb8,0xfe,0x65,0x54,0x01,0x34,0x01,0x5b,0x9c,0x02,0x8f,0xfd,0x71,0x01,0x9b,0x66,0xfe,0xca,0x02,0xc4,0x02,0x2b,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x4d,0x40,0x2a,0xb9,0x07,0x01,0xb8,0x06,0x01,0x77,0x06,0x01,0x46,0x05,0x01,0x99,0x04,0xa9,0x04,0x02,0x8c,0x02,0x01,0x06,0x03,0x04,0x02,\r\n0x07,0x09,0x0b,0x05,0x04,0x07,0x02,0x05,0x04,0x02,0x04,0x02,0x04,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x37,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,\r\n0xfe,0xb8,0xfe,0x65,0x54,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0xfe,0xb9,0x01,0x9b,0x66,0xfe,0xb9,0x01,0x47,0x03,0xb9,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x32,0x40,0x18,0xa7,0x04,0x01,0xab,0x02,0x01,0x9a,0x02,0x01,0x01,0x04,0x02,0x05,0x07,0x09,0x03,0x02,0x03,0x02,0x02,0x00,0x07,0x04,0x00,\r\n0x00,0x2f,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x21,0x01,0x37,0x01,0x21,0x11,0x33,0x03,0xc1,0xfd,0xff,0xfe,0x82,0x54,0x01,0x48,0x01,0x47,0x9c,0x01,0xa4,0x5d,0xfe,0x9b,0x05,0x1e,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,\r\n0x00,0x41,0x40,0x27,0x84,0x04,0x01,0x65,0x04,0x01,0xa9,0x02,0x01,0x78,0x02,0x98,0x02,0x02,0x59,0x02,0x01,0x28,0x02,0x38,0x02,0x48,0x02,0x03,0x01,0x04,0x06,0x08,0x03,0x00,0x02,0x01,0x02,0x03,0x02,0x02,0x06,0x04,0x00,0x00,0x2f,0x32,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x21,0x23,0x01,0x37,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0x64,0x54,0x01,0x48,0x9c,0x01,0x9b,0x66,0xfe,0xb9,0x05,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x3c,0x40,0x24,0xab,0x06,0x01,0x89,0x06,0x99,0x06,0x02,0x58,0x06,0x78,0x06,0x02,0x96,0x04,0xa6,0x04,0x02,0x77,0x04,0x87,0x04,\r\n0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x04,0x05,0x02,0x07,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xcd,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x23,0x01,0x27,0x01,0x21,0x03,0xc1,0x9c,0xf1,0xfe,0x62,0x7c,0x01,0xc3,0x01,0xe4,0x05,0x1e,0xfa,0xe2,0x2e,0x05,0x8c,0x00,0x01,\r\n0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x6e,0x40,0x45,0x36,0x06,0x46,0x06,0x02,0x07,0x06,0x17,0x06,0x02,0xa6,0x03,0x01,0x57,0x03,0x01,0x91,0x07,0x01,0x55,0x07,0x01,0x36,0x07,0x46,0x07,0x02,0xa4,0x05,0x01,0x95,0x05,0x01,0x74,0x05,0x84,0x05,0x02,0xaf,0x03,0x01,0x8d,0x03,0x9d,0x03,0x02,0x7b,0x03,0x01,0x06,\r\n0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x25,0x01,0x27,\r\n0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xf1,0xfe,0x80,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x03,0xd6,0xf1,0xfb,0x39,0x2e,0x05,0x8c,0xfe,0xe0,0x01,0x20,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x70,0x40,0x48,0x79,0x06,0x89,0x06,0xc9,0x06,0x03,0x36,0x06,0x46,0x06,0x02,0x07,0x06,0x17,0x06,0x02,0x78,\r\n0x03,0x01,0x41,0x07,0x01,0x32,0x07,0x01,0xa2,0x05,0x01,0x84,0x05,0x94,0x05,0x02,0x76,0x05,0x01,0x9f,0x03,0xaf,0x03,0x02,0x5d,0x03,0x6d,0x03,0x7d,0x03,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x8d,0x03,0x01,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,\r\n0xc4,0x32,0x5d,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd8,0xfe,0x99,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x02,0x8f,0x01,0xed,0xfb,0x84,0x2e,0x05,0x8c,0xfd,0xdf,0x02,0x21,\r\n0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x8c,0x40,0x5b,0xf9,0x06,0x01,0xca,0x06,0x01,0x89,0x06,0x01,0x75,0x06,0x01,0x16,0x06,0x36,0x06,0x46,0x06,0x03,0x05,0x06,0x01,0x89,0x03,0x01,0x75,0x03,0x01,0x36,0x03,0x46,0x03,0x02,0xa4,0x07,0x01,0x72,0x07,0x01,0x2b,0x07,0x01,0x14,0x07,0x01,0x07,0x07,0x01,\r\n0x03,0xa5,0x05,0x01,0x86,0x05,0x96,0x05,0x02,0xac,0x03,0x01,0x02,0x8f,0x03,0x9f,0x03,0x02,0x5d,0x03,0x7d,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x03,0x06,0x09,0x07,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x10,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,\r\n0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xc7,0xfe,0xaa,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x01,0x47,0x02,0xf8,0xfb,0xc1,0x2e,0x05,0x8c,0xfc,0xd3,0x03,0x2d,0x00,0x01,\r\n0x00,0x1a,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x80,0x40,0x53,0xf9,0x05,0x01,0x8a,0x05,0xca,0x05,0x02,0x35,0x05,0x45,0x05,0x75,0x05,0x03,0x28,0x05,0x01,0x16,0x05,0x01,0x07,0x05,0x01,0xc9,0x02,0x01,0x88,0x02,0x01,0x76,0x02,0x01,0x94,0x06,0x01,0x47,0x06,0x01,0x15,0x06,0x01,0x03,0xa5,0x04,0x01,0x96,0x04,0x01,0x85,\r\n0x04,0x01,0x9b,0x02,0xab,0x02,0x02,0x8c,0x02,0x01,0x02,0x7f,0x02,0x01,0x5b,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x02,0x05,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0xc4,0x32,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,\r\n0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xb8,0xfe,0xb9,0x7c,0x01,0xc3,0x01,0x48,0x9c,0x04,0x10,0xfb,0xf0,0x2e,0x05,0x8c,0xfb,0xf0,0x04,0x10,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x06,0x00,0x36,0x40,0x1f,0x77,0x03,\r\n0x01,0x84,0x04,0x94,0x04,0xa4,0x04,0x03,0x8f,0x02,0x9f,0x02,0xaf,0x02,0x03,0x05,0x02,0x06,0x08,0x03,0x00,0x04,0x01,0x04,0x02,0x06,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x7c,0x01,\r\n0xc4,0x9c,0x04,0x24,0xfb,0xdc,0x2e,0x05,0x8c,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x49,0x40,0x2a,0xa5,0x06,0x01,0x86,0x06,0x96,0x06,0x02,0x57,0x06,0x01,0x6b,0x03,0x7b,0x03,0xab,0x03,0x03,0x59,0x03,0x01,0xab,0x02,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x06,0x03,0x03,0x00,0x02,\r\n0x08,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xdb,0xfe,0x4c,0x72,0x01,0xb9,0x01,0x48,0x9c,0x04,0xf6,0xfe,0xe0,0xfc,0x2a,0x32,0x03,0xf5,0x01,\r\n0x93,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x30,0x40,0x18,0x89,0x06,0x99,0x06,0xa9,0x06,0x03,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x02,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,\r\n0x21,0x23,0x11,0x23,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,0x9c,0xf9,0xfe,0x6a,0x72,0x01,0xb9,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x04,0x40,0x01,0x48,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x57,0x40,0x33,0xb8,0x07,0x01,0x64,0x07,0x74,0x07,0x02,0xa0,0x06,0x01,0x74,0x06,0x84,0x06,0x94,\r\n0x06,0x03,0x66,0x06,0x01,0xa2,0x05,0x01,0x84,0x05,0x94,0x05,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xe2,0xfe,0x8f,0x72,0x01,0xb9,0x01,0x48,0x9c,0x02,0x8f,0x01,0x47,0xfc,0x2a,0x32,0x04,0x99,0xfe,0x88,0x02,0x67,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x66,0x40,0x3c,0x79,0x06,0x01,0x46,0x06,0x01,\r\n0x15,0x06,0x35,0x06,0x02,0x03,0x07,0x06,0x01,0xa4,0x07,0x01,0x93,0x06,0xa3,0x06,0x02,0x02,0x80,0x06,0x01,0x74,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x87,0x05,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,\r\n0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x01,0x5d,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd9,0xfe,0x98,0x72,0x01,0xc3,0x01,0x3e,0x9c,0x01,0x47,0x02,0x8f,0xfc,0x2a,0x32,0x04,0xf8,0xfd,0x45,\r\n0x03,0x4b,0x00,0x01,0x00,0x24,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x5e,0x40,0x37,0x46,0x05,0x01,0x34,0x05,0x01,0x15,0x05,0x01,0x03,0xa6,0x06,0x01,0xa2,0x05,0x01,0x93,0x05,0x01,0x02,0x80,0x05,0x01,0x74,0x05,0x01,0xa4,0x04,0x01,0x92,0x04,0x01,0x74,0x04,0x84,0x04,0x02,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,\r\n0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5f,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,0xa5,0x72,0x01,\r\n0xcd,0x01,0x34,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x05,0x1c,0xfc,0x20,0x04,0x4c,0x00,0x00,0x01,0x00,0x24,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x3e,0x40,0x24,0x67,0x03,0x77,0x03,0x02,0x84,0x04,0x94,0x04,0xa4,0x04,0x03,0x8f,0x02,0x9f,0x02,0xaf,0x02,0x03,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,\r\n0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x35,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x72,0x01,0xba,0x9c,0x03,0xd6,0xfc,0x2a,0x32,0x05,0x26,0x62,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,\r\n0x00,0x06,0x00,0x39,0x40,0x21,0xa2,0x04,0x01,0x95,0x04,0x01,0xad,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x7b,0x02,0x01,0x59,0x02,0x69,0x02,0x02,0x05,0x02,0x06,0x08,0x03,0x04,0x02,0x06,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,\r\n0x01,0x27,0x01,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x67,0x02,0xf6,0x9c,0x04,0xa5,0xfb,0x5b,0x4f,0x05,0x6b,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x5d,0x40,0x38,0x96,0x06,0x01,0x87,0x06,0x01,0x94,0x05,0xa4,0x05,0x02,0x76,0x05,0x86,0x05,0x02,0xad,0x03,0x01,0x8b,0x03,0x9b,0x03,0x02,0x59,0x03,0x69,0x03,\r\n0x79,0x03,0x03,0x89,0x02,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,\r\n0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xf8,0xfe,0x69,0x67,0x01,0xae,0x01,0x48,0x9c,0x03,0xd6,0xfe,0xb9,0xfd,0x71,0x4f,0x02,0xab,0x01,0xaa,0x01,0x16,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x44,0x40,0x26,0xab,0x06,0x01,0x9e,0x06,0x01,0x8b,0x06,0x01,0x58,0x06,0x01,0xa5,0x04,\r\n0x01,0x75,0x03,0x01,0x67,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x03,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,0x11,0x33,0x03,0xc1,\r\n0x9c,0xfe,0xee,0xfe,0x83,0x67,0x01,0xa4,0x01,0x52,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x02,0xdc,0x02,0x8f,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x67,0x40,0x3d,0x83,0x07,0x01,0x03,0x67,0x07,0x01,0x56,0x07,0x01,0xa3,0x06,0x01,0x02,0x90,0x06,0x01,0x74,0x06,0x84,0x06,0x02,0x56,0x06,0x01,0xa6,0x05,0x01,\r\n0x94,0x05,0x01,0x76,0x05,0x86,0x05,0x02,0x68,0x03,0x01,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x02,0x06,0x03,0x02,0x03,0x02,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5f,0x5d,0x5d,0x5d,0x5f,0x5d,0x21,0x23,0x11,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xf0,0xfe,0x81,0x67,0x01,0xd1,0x01,0x25,0x9c,0x01,0x47,0x01,0x48,0xfd,0x71,0x4f,0x03,0x1f,0xfe,0x9d,0x03,0xaf,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x64,0x40,0x3d,0x36,0x05,\r\n0x46,0x05,0x02,0x27,0x02,0x01,0x54,0x06,0x84,0x06,0x02,0x15,0x06,0x01,0x07,0x06,0x01,0x03,0xa3,0x05,0x01,0x02,0x80,0x05,0x90,0x05,0x02,0x72,0x05,0x01,0x24,0x05,0x01,0x84,0x04,0x94,0x04,0x02,0xa9,0x02,0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,\r\n0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x5f,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,0xa5,0x67,0x01,0xc5,0x01,0x31,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x03,0x54,0xfd,0x85,0x04,\r\n0x92,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x48,0x40,0x29,0xa6,0x03,0x01,0xa3,0x05,0x01,0x02,0x80,0x05,0x90,0x05,0x02,0x74,0x05,0x01,0x66,0x05,0x01,0x9b,0x02,0x01,0x8a,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,\r\n0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5f,0x5d,0x01,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x67,0x01,0xaf,0x9c,0x02,0x8f,0xfd,0x71,0x4f,0x03,0x54,0x02,0x17,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x41,\r\n0x40,0x23,0xa2,0x06,0x01,0x96,0x06,0x01,0x57,0x06,0x67,0x06,0x02,0x9a,0x03,0x01,0x88,0x03,0x01,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x04,0x05,0x06,0x03,0x03,0x00,0x02,0x08,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x33,0x03,0xc1,0x9c,0xe1,0xfe,0x52,0x48,0x01,0x95,0x01,0x42,0x9c,0x04,0x38,0xfd,0x0f,0xfe,0xb9,0x7b,0x01,0x32,0x04,0x0d,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x47,0x40,0x26,0xa2,0x06,0x01,0x94,0x06,0x01,0x99,0x03,0xa9,0x03,0x02,0x58,0x03,0x68,\r\n0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x06,0x03,0x07,0x02,0x03,0x02,0x03,0x02,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x03,0x01,0x27,0x01,0x01,0x35,\r\n0x33,0x03,0xc1,0x9c,0xf5,0xfe,0x66,0x48,0x01,0x8f,0x01,0x48,0x9c,0x03,0xd6,0xfd,0x71,0xfe,0xb9,0x7b,0x01,0x2e,0x03,0x73,0x9e,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x07,0x00,0x35,0x40,0x1c,0x46,0x05,0x66,0x05,0x02,0xa6,0x04,0x01,0x97,0x04,0x01,0x6b,0x02,0x01,0x02,0x05,0x07,0x09,0x03,0x04,0x05,0x02,\r\n0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x48,0x02,0xd7,0x9c,0x02,0x8f,0xfd,0x71,0x7b,0x02,0xce,0x02,0x71,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,\r\n0x05,0xba,0x00,0x09,0x00,0x32,0x40,0x19,0xa9,0x06,0x01,0x96,0x03,0xa6,0x03,0x02,0x06,0x03,0x05,0x02,0x07,0x09,0x0b,0x04,0x05,0x07,0x03,0x03,0x00,0x09,0x05,0x04,0x00,0x00,0x2f,0xc4,0x32,0x2f,0x12,0x39,0x2f,0xcd,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x21,0x01,0x27,0x01,0x21,\r\n0x11,0x33,0x03,0xc1,0x9c,0xfe,0xe0,0xfe,0x91,0x48,0x01,0x99,0x01,0x3e,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x68,0x03,0xd7,0x00,0x01,0x00,0x4e,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x4b,0x40,0x2b,0x74,0x06,0x01,0x53,0x06,0x01,0x36,0x06,0x01,0xbb,0x05,0x01,0x74,0x05,0x01,0x87,0x04,0x97,0x04,0xa7,0x04,0x03,0x69,0x02,\r\n0x01,0x02,0x05,0x04,0x01,0x06,0x08,0x0a,0x03,0x04,0x05,0x02,0x02,0x00,0x08,0x04,0x03,0x06,0x00,0x00,0x2f,0x32,0xc4,0x32,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x01,0x01,0x27,0x01,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xcc,0xfe,\r\n0xa5,0x48,0x01,0xa7,0x01,0x30,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x7c,0xfe,0xcd,0x04,0xf6,0x00,0x01,0x00,0x4e,0x00,0x00,0x02,0x7a,0x05,0xba,0x00,0x07,0x00,0x31,0x40,0x19,0xb9,0x05,0x01,0x97,0x04,0xa7,0x04,0x02,0x02,0x05,0x07,0x09,0x03,0x00,0x04,0x01,0x04,0x05,0x02,0x02,0x00,0x07,0x04,0x03,0x00,0x00,0x2f,0xc4,0x32,0x2f,\r\n0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x11,0x33,0x02,0x7a,0x9c,0xfe,0xb8,0x48,0x01,0x90,0x9c,0x01,0x47,0xfe,0xb9,0x7b,0x01,0x86,0x03,0xb9,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x08,0x00,0x36,0x40,0x1d,0xa9,0x06,0x01,0x76,\r\n0x03,0x86,0x03,0x02,0xad,0x02,0x01,0x8f,0x02,0x9f,0x02,0x02,0x06,0x03,0x05,0x07,0x02,0x08,0x0a,0x05,0x02,0x08,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,\r\n0x47,0x01,0x48,0x9c,0x03,0xb6,0xfc,0x4a,0x9c,0x05,0x1e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2d,0x40,0x15,0x9b,0x02,0xab,0x02,0x02,0x06,0x03,0x04,0x07,0x02,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x05,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,\r\n0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x35,0x33,0x03,0xc1,0x9c,0xfe,0xfe,0xfe,0x73,0x01,0x47,0x01,0x48,0x9c,0x03,0xd6,0xfc,0x2a,0x9c,0x04,0xd0,0x4e,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x2f,0x40,0x16,0xaf,0x02,0x01,0x99,0x02,0x01,0x06,0x03,0x04,0x02,\r\n0x07,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x03,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xee,0xfe,0x5f,0x01,0x5b,0x01,0x34,0x9c,0x02,0x8f,0xfd,0x71,0x9c,0x03,0x61,0x01,\r\n0xbd,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x09,0x00,0x3b,0x40,0x1f,0x46,0x07,0x01,0x37,0x07,0x01,0x0b,0x07,0x01,0x8b,0x02,0x01,0x09,0x02,0x01,0x06,0x03,0x04,0x02,0x07,0x09,0x0b,0x04,0x07,0x02,0x02,0x00,0x09,0x06,0x03,0x00,0x00,0x2f,0xd4,0xcd,0x2f,0x12,0x39,0x2f,0x33,0x01,0x2f,0x10,0xde,0xdd,0xc4,\r\n0x12,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x21,0x35,0x21,0x01,0x11,0x33,0x03,0xc1,0x9c,0xfe,0xd6,0xfe,0x9b,0x01,0x47,0x01,0x48,0x9c,0x01,0x47,0xfe,0xb9,0x9c,0x01,0x65,0x03,0xb9,0x00,0x01,0xff,0x54,0x05,0xc2,0x02,0x6c,0x07,0x40,0x00,0x05,0x00,0x2c,0xb1,0x03,0x00,0xb8,0x01,0x35,0x40,0x16,\r\n0x05,0x04,0x01,0x02,0x01,0x12,0x01,0x22,0x01,0x52,0x01,0x04,0x01,0x02,0x18,0x1a,0x1e,0x48,0x00,0x03,0x84,0x02,0x2f,0xe1,0xc6,0x2b,0x39,0x5d,0x11,0x33,0x00,0x2f,0xed,0xc4,0x31,0x30,0x01,0x20,0x03,0x23,0x12,0x21,0x02,0x6c,0xfe,0x44,0xba,0xa2,0xf0,0x02,0x28,0x06,0xc4,0xfe,0xfe,0x01,0x7e,0x00,0x00,0x01,0xff,0x54,0x05,0xc2,\r\n0x02,0x6c,0x07,0x40,0x00,0x05,0x00,0x33,0xb2,0x00,0x80,0x03,0xb8,0x01,0x35,0x40,0x0f,0x04,0x05,0x02,0x0d,0x02,0x1d,0x02,0x2d,0x02,0x5d,0x02,0x04,0x02,0x03,0x01,0xb8,0xff,0xe8,0xb6,0x1a,0x1e,0x48,0x00,0x84,0x01,0x03,0x2f,0xd6,0xe1,0x2b,0x12,0x39,0x5d,0x11,0x33,0x00,0x2f,0xed,0x1a,0xcc,0x31,0x30,0x01,0x23,0x02,0x21,0x35,\r\n0x20,0x02,0x6c,0xa1,0xba,0xfe,0x43,0x02,0x28,0x05,0xc2,0x01,0x02,0x7c,0x00,0x01,0xfd,0xa7,0x05,0xc2,0x00,0xc0,0x06,0xfa,0x00,0x0b,0x00,0x22,0xb2,0x06,0x80,0x02,0xbb,0x01,0x35,0x00,0x09,0x00,0x00,0x01,0x35,0xb2,0x0b,0x0b,0x06,0xb9,0x01,0x34,0x00,0x05,0x2f,0xe1,0xc4,0x00,0x2f,0xed,0xd5,0xed,0x1a,0xcd,0x31,0x30,0x13,0x24,\r\n0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x05,0xc0,0xfe,0xb3,0x8d,0x58,0x70,0x77,0x01,0xb4,0x88,0x93,0x01,0x49,0x06,0x16,0x67,0x6b,0x50,0x88,0xb0,0x66,0x00,0x00,0x01,0xff,0x68,0x05,0xc8,0x02,0x32,0x07,0x00,0x00,0x0b,0x00,0x22,0xb2,0x05,0x80,0x02,0xbe,0x01,0x35,0x00,0x09,0x00,0x0b,0x01,0x35,0x00,0x00,0x00,0x06,0x01,\r\n0x34,0xb1,0x05,0x0b,0x2f,0xd4,0xe1,0x00,0x2f,0xfd,0xd5,0xed,0x1a,0xcc,0x31,0x30,0x03,0x04,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x27,0x98,0x01,0x00,0x8a,0x58,0x72,0x76,0x02,0xb6,0x86,0x8e,0xfe,0x06,0x94,0x50,0x6c,0x50,0x86,0xb2,0x4f,0x00,0x03,0x00,0x60,0xfe,0x1e,0x06,0x1c,0x05,0xec,0x00,0x22,0x00,0x2f,0x00,0x37,\r\n0x01,0x5d,0x40,0x2c,0x30,0x31,0x18,0x00,0x22,0x06,0x01,0x37,0x01,0x19,0x31,0x18,0x05,0x22,0x06,0x04,0x1a,0x04,0x30,0x19,0x31,0x18,0x31,0x05,0x00,0x22,0x06,0x22,0x0b,0x01,0x01,0xbb,0x01,0xcb,0x01,0xdb,0x01,0xfb,0x01,0x04,0x37,0x01,0x36,0x04,0xb8,0xff,0xe8,0x40,0x33,0x09,0x13,0x48,0x1a,0x04,0x03,0x1b,0x0a,0x18,0x01,0xea,\r\n0x18,0xfa,0x18,0x02,0x03,0x18,0x18,0x09,0x13,0x48,0x31,0x18,0x32,0x15,0x0d,0x06,0x01,0xed,0x06,0xfd,0x06,0x02,0x02,0x06,0x18,0x09,0x14,0x48,0x22,0x06,0x21,0x08,0x1b,0x96,0x36,0x36,0x38,0x32,0x95,0x21,0xb8,0xff,0xc0,0x40,0x4f,0x17,0x1c,0x48,0x21,0x21,0x38,0x03,0x1c,0x15,0x00,0x13,0x08,0x0b,0x27,0x95,0x11,0x10,0x2d,0x95,\r\n0x0b,0x16,0xb5,0x37,0x01,0x0b,0x37,0x01,0xfb,0x37,0x01,0x37,0x20,0x09,0x16,0x48,0x37,0x01,0x34,0x02,0x5b,0x1a,0x01,0x1a,0x40,0x09,0x1d,0x48,0x1a,0x04,0x1e,0x03,0xa0,0x31,0x01,0x0b,0x31,0x01,0xeb,0x31,0xfb,0x31,0x02,0x44,0x31,0x01,0x31,0x18,0x34,0x16,0xa0,0x22,0x01,0xc3,0x22,0x01,0x22,0x1e,0x23,0x02,0xba,0x01,0x2c,0x00,\r\n0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x23,0x34,0xb8,0x01,0x2c,0x40,0x14,0xa0,0x1e,0xd0,0x1e,0x02,0x1e,0x1e,0x16,0x84,0x15,0x06,0x07,0x15,0x03,0x23,0x23,0x39,0x2a,0x83,0x0e,0x2f,0xe1,0x12,0x39,0x2f,0x17,0x33,0x10,0xf1,0xc0,0x2f,0x5d,0xe1,0x11,0x39,0x2f,0x2b,0x2b,0xe1,0x11,\r\n0x12,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x71,0x5d,0x71,0x5d,0x11,0x12,0x39,0x39,0x2b,0x71,0x11,0x12,0x39,0x39,0x2b,0x5d,0x71,0x5d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x2b,0x5f,0x5d,0x71,0x11,0x12,0x39,0x39,0x2b,0x5f,0x5d,0x71,0x11,0x12,0x39,\r\n0x39,0x2b,0x11,0x39,0x39,0x5d,0x71,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x04,0x38,0x0f,0x02,0x91,0x07,0x27,0x58,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x13,0x67,0x97,0x6f,0x8c,0xa2,0x80,0x70,0xfe,0xe2,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0xab,0x01,0x02,0x3c,\r\n0x50,0x92,0x70,0x6a,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x9a,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfa,0x28,0x4e,0x41,0x7b,0x75,0x5c,0x5f,0x7e,0x03,0x7d,0x97,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0xc6,0xfd,0xd2,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x03,0x56,0x05,0xec,0x00,0x15,0x00,0x1d,0x01,0x0f,\r\n0x40,0x37,0x16,0x17,0x0b,0x00,0x15,0x06,0x01,0x1d,0x01,0x0c,0x17,0x0b,0x05,0x15,0x06,0x04,0x0d,0x04,0x16,0x0c,0x17,0x0b,0x17,0x05,0x00,0x15,0x06,0x15,0xbb,0x01,0xcb,0x01,0xdb,0x01,0x03,0x1d,0x01,0x1c,0x0d,0x0b,0x01,0xed,0x0b,0xfd,0x0b,0x02,0x0a,0x0b,0x01,0x0b,0x18,0x0e,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x1b,0x09,0x13,\r\n0x48,0x0d,0x06,0x01,0xed,0x06,0xfd,0x06,0x02,0x04,0x06,0x0b,0x0d,0x04,0x03,0x0e,0x96,0x1c,0x1c,0x1e,0x17,0x18,0x95,0x15,0x14,0xb8,0xff,0xc0,0x40,0x34,0x17,0x1c,0x48,0x14,0x14,0x1e,0x03,0x08,0x00,0x03,0x1c,0xa0,0x17,0x01,0x15,0x17,0x01,0x17,0x0b,0x1a,0x0a,0xa0,0x15,0x01,0xc3,0x15,0x01,0x15,0x06,0x11,0x07,0xb5,0x1d,0x01,\r\n0x1d,0x20,0x09,0x16,0x48,0x1d,0x01,0x1a,0x02,0x0d,0x40,0x09,0x1d,0x48,0x0d,0x04,0x11,0x02,0xba,0x01,0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x07,0x1a,0xb8,0x01,0x2c,0x40,0x0a,0xa0,0x11,0xd0,0x11,0x02,0x11,0x11,0x0a,0x84,0x07,0x2f,0xf1,0xc0,0x2f,0x5d,0xe1,0x12,0x39,\r\n0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x00,0x3f,0x3f,0x11,0x12,0x39,0x2f,0x2b,0x33,0xed,0x32,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x5d,0x71,0x2b,0x2b,0x5d,0x5d,0x71,0x12,0x39,0x39,0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,\r\n0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x01,0x70,0x0e,0x02,0x91,0x07,0x28,0x58,0xa4,0x12,0x67,0x97,0x72,0x8a,0xa4,0x7f,0x6f,0x1c,0x3b,\r\n0x50,0x91,0x6e,0x6b,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x05,0xd8,0xfa,0x28,0x4e,0x41,0x7b,0x76,0x5b,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x06,0x04,0x04,0x18,0x00,0x24,0x00,0x2c,0x01,0x33,0x40,0x4c,0x25,0x26,0x1a,0x00,0x24,0x06,0x01,0x2c,0x01,0x1b,0x26,0x1a,0x05,0x24,0x06,0x04,0x1c,0x04,\r\n0x25,0x1b,0x26,0x1a,0x26,0x05,0x00,0x24,0x06,0x24,0xb9,0x01,0xc9,0x01,0xd9,0x01,0x03,0x2c,0x01,0x03,0x2b,0x26,0x27,0x1a,0x0e,0x06,0x01,0xae,0x06,0xee,0x06,0xfe,0x06,0x03,0x02,0x24,0x06,0x23,0x0a,0x0d,0x1a,0x01,0xed,0x1a,0xfd,0x1a,0x02,0x0a,0x1a,0x5a,0x1a,0x02,0x1a,0x18,0x10,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x10,0x09,\r\n0x13,0x48,0x04,0x1a,0x1c,0x03,0x03,0x1d,0x96,0x2b,0x2b,0x2d,0x27,0x95,0x23,0xb8,0xff,0xc0,0x40,0x39,0x17,0x1c,0x48,0x23,0x23,0x2d,0x03,0x1c,0x13,0x0a,0x95,0x15,0x10,0x11,0x0f,0x0e,0xa0,0x26,0x01,0x15,0x26,0x01,0x26,0x1a,0x29,0x18,0xa0,0x24,0x01,0xc3,0x24,0x01,0x24,0x06,0x20,0x08,0xb5,0x2c,0x01,0x2c,0x20,0x09,0x16,0x48,\r\n0x2c,0x01,0x29,0x02,0x1c,0x40,0x09,0x1d,0x48,0x1c,0x04,0x20,0x02,0xba,0x01,0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x08,0x29,0xb8,0x01,0x2c,0x40,0x10,0xa0,0x20,0xd0,0x20,0x02,0x20,0x20,0x18,0x84,0x08,0x08,0x2e,0x11,0x0e,0x84,0x0f,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,\r\n0xc0,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x2b,0x2b,0xe1,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x2b,0x2b,0x5d,0x5d,0x71,0x11,0x12,0x39,0x39,0x5f,0x5d,0x71,0x11,\r\n0x12,0x39,0x11,0x12,0x39,0x39,0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x04,0x1e,0x0e,0x02,0x91,0x07,0x28,0x58,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x12,0x67,0x97,0x70,0x8c,0xa4,0x7e,0x70,0x1c,0x3b,0x51,0x90,0x6e,0x6b,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x02,0x34,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,\r\n0xd9,0xcd,0xfd,0xa2,0x4e,0x41,0x7b,0x75,0x5c,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x02,0x00,0x2b,0xfe,0x1e,0x03,0x8c,0x05,0x2f,0x00,0x1d,0x00,0x25,0x01,0x39,0x40,0x48,0x1e,0x13,0x1f,0x00,0x06,0x1d,0x01,0x25,0x01,0x14,0x13,0x1f,0x05,0x06,0x1d,0x04,0x15,0x04,0x1e,0x14,0x13,0x1f,0x13,0x05,0x00,0x06,0x1d,0x06,0xb9,0x01,\r\n0xc9,0x01,0xd9,0x01,0x03,0x25,0x01,0x03,0x24,0x0e,0x06,0x01,0xee,0x06,0xfe,0x06,0x02,0x02,0x1d,0x06,0x1c,0x08,0x1f,0x20,0x13,0x0d,0x13,0x01,0xed,0x13,0xfd,0x13,0x02,0x0a,0x13,0x01,0x13,0x18,0x0e,0x13,0x48,0x04,0xb8,0xff,0xe8,0x40,0x10,0x09,0x13,0x48,0x04,0x13,0x15,0x03,0x03,0x16,0x96,0x24,0x24,0x26,0x20,0x95,0x1c,0xb8,\r\n0xff,0xc0,0x40,0x3a,0x17,0x1c,0x48,0x1c,0x1c,0x26,0x03,0x1c,0x0d,0x0e,0x11,0x08,0x95,0x0e,0x0b,0x0f,0xb5,0x25,0x01,0x25,0x20,0x09,0x16,0x48,0x25,0x01,0x22,0x02,0x15,0x40,0x09,0x1d,0x48,0x15,0x04,0x19,0x03,0xa0,0x1f,0x01,0x15,0x1f,0x01,0x1f,0x13,0x22,0x12,0xa0,0x1d,0x01,0xc3,0x1d,0x01,0x1d,0x06,0x19,0x07,0x02,0xba,0x01,\r\n0x2c,0x00,0x03,0xff,0xc0,0xb3,0x17,0x25,0x48,0x03,0xb8,0xff,0xc0,0xb6,0x09,0x13,0x48,0x03,0x03,0x07,0x22,0xb8,0x01,0x2c,0x40,0x13,0xa0,0x19,0xd0,0x19,0x02,0x19,0x19,0x12,0x0f,0x0f,0x27,0x0e,0x0a,0x0b,0x0e,0x12,0x84,0x0b,0x07,0x2f,0x33,0xe1,0x32,0x10,0xcd,0x11,0x12,0x39,0x2f,0x10,0xc0,0x2f,0x5d,0xe1,0x12,0x39,0x2f,0x2b,\r\n0x2b,0xe1,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,0x11,0x12,0x39,0x39,0x2b,0x11,0x12,0x39,0x39,0x2b,0x5d,0x00,0x3f,0x33,0xed,0x32,0x10,0xcd,0x3f,0x12,0x39,0x2f,0x2b,0xed,0x11,0x39,0x2f,0xed,0x11,0x17,0x39,0x2b,0x2b,0x5d,0x5d,0x71,0x11,0x12,0x39,0x11,0x12,0x39,0x39,0x5f,0x5d,0x71,0x11,0x12,0x39,0x39,\r\n0x5d,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x0e,0xc0,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x01,\r\n0xa6,0x0e,0x02,0x92,0x08,0x27,0x58,0xb0,0xb0,0xa4,0x01,0x02,0xfe,0xfe,0x13,0x66,0x98,0x6f,0x8d,0xa4,0x80,0x6f,0x1c,0x3b,0x50,0x92,0x6e,0x6c,0xfe,0x85,0x40,0x27,0x66,0x64,0x78,0xb4,0x03,0x60,0x8c,0xfa,0x35,0xfe,0xd1,0x8c,0xfc,0xa0,0x4e,0x41,0x7b,0x75,0x5c,0x5e,0x7f,0xb8,0x2f,0x54,0x4c,0x00,0x00,0x01,0xff,0xdb,0xfe,0x23,\r\n0x04,0x16,0x04,0x18,0x00,0x19,0x00,0x31,0x40,0x1a,0x18,0x0f,0x0c,0x0a,0x95,0x0f,0x10,0x01,0x1c,0x03,0x14,0x95,0x05,0x16,0x19,0x84,0x01,0x18,0x18,0x1b,0x11,0x84,0x08,0x08,0x1b,0x0c,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x20,\r\n0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x04,0x16,0xa4,0x04,0x76,0xda,0xfe,0xa6,0x80,0x38,0x31,0x46,0x43,0x01,0x04,0xea,0x7a,0xa6,0xa4,0xfe,0x23,0x02,0x87,0xc2,0x01,0xa1,0x01,0x54,0xb1,0x1e,0x8c,0x1c,0xfe,0xd0,0xfe,0xca,0xfe,0xc0,0xbb,0x8f,0x02,0x44,0x00,0x00,0x01,\r\n0xff,0xdb,0xfe,0x1e,0x05,0x27,0x04,0x18,0x00,0x22,0x00,0x38,0x40,0x1e,0x22,0x20,0x95,0x02,0x1c,0x1c,0x0f,0x10,0x0e,0x95,0x13,0x10,0x07,0x18,0x95,0x09,0x16,0x22,0x1d,0x84,0x05,0x1c,0x1c,0x24,0x15,0x84,0x0c,0x0c,0x24,0x10,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0xe1,0xc4,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x3f,\r\n0xed,0x32,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x05,0x27,0x40,0x43,0x92,0xa0,0x04,0x76,0xda,0xfe,0xa6,0x80,0x38,0x31,0x46,0x43,0x01,0x04,0xea,0x7a,0xa6,0xa4,0xa0,0x3c,0x35,\r\n0xfe,0x3a,0x1c,0xaf,0x9f,0x01,0x3e,0xc2,0x01,0xa1,0x01,0x54,0xb1,0x1e,0x8c,0x1c,0xfe,0xd0,0xfe,0xca,0xfe,0xc0,0xbb,0x8f,0x02,0x44,0xfb,0x72,0xc8,0x1a,0x00,0x01,0x00,0x85,0xfe,0xa0,0x02,0x22,0xff,0xb8,0x00,0x06,0x00,0x19,0x40,0x0d,0x05,0x80,0x30,0x06,0x40,0x06,0x50,0x06,0x03,0x06,0x03,0xc0,0x06,0x2f,0x1a,0xcc,0x00,0x2f,\r\n0x5d,0x1a,0xcd,0x31,0x30,0x17,0x17,0x37,0x33,0x03,0x23,0x03,0xf0,0x64,0x64,0x6a,0xb4,0x34,0xb5,0x48,0xaa,0xaa,0xfe,0xe8,0x01,0x18,0x00,0x01,0x00,0x85,0xfe,0xa0,0x02,0x22,0xff,0xb8,0x00,0x06,0x00,0x19,0x40,0x0d,0x01,0x80,0x30,0x02,0x40,0x02,0x50,0x02,0x03,0x02,0x04,0xc0,0x01,0x2f,0x1a,0xcc,0x00,0x2f,0x5d,0x1a,0xcd,0x31,\r\n0x30,0x13,0x23,0x13,0x33,0x13,0x23,0x27,0xf0,0x6b,0xb5,0x34,0xb4,0x6a,0x64,0xfe,0xa0,0x01,0x18,0xfe,0xe8,0xaa,0x00,0x01,0x00,0xc8,0xfe,0x5e,0x01,0xe0,0xff,0xfb,0x00,0x06,0x00,0x12,0xb7,0x30,0x01,0x01,0x01,0x04,0x05,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xce,0x5d,0x31,0x30,0x01,0x15,0x25,0x35,0x25,0x15,0x07,0x01,0xe0,0xfe,\r\n0xe8,0x01,0x18,0xaa,0xfe,0xc8,0x6a,0xb4,0x34,0xb5,0x6b,0x64,0x00,0x01,0x00,0xc8,0xfe,0x5e,0x01,0xe0,0xff,0xfb,0x00,0x06,0x00,0x12,0xb7,0x30,0x06,0x01,0x06,0x03,0x05,0x80,0x02,0x2f,0x1a,0xcd,0x00,0x2f,0xce,0x5d,0x31,0x30,0x13,0x37,0x27,0x35,0x05,0x15,0x05,0xc8,0xaa,0xaa,0x01,0x18,0xfe,0xe8,0xfe,0xc8,0x64,0x64,0x6b,0xb5,\r\n0x34,0xb4,0x00,0x02,0x00,0x87,0xfe,0x2d,0x02,0x23,0xff,0xb2,0x00,0x0b,0x00,0x16,0x00,0x2f,0x40,0x1c,0x11,0xc5,0x40,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x8f,0x00,0x04,0x00,0x80,0x0c,0xc5,0x40,0x4f,0x06,0x01,0x06,0x09,0xc4,0x14,0x80,0x0f,0xc4,0x03,0x2f,0xe1,0x1a,0xdc,0xe1,0x00,0x2f,0x5d,0x1a,0xfd,0x1a,0xdc,0x5d,0x1a,0xed,0x31,\r\n0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x52,0x59,0x72,0x76,0x5b,0x59,0x72,0x7b,0x56,0x31,0x3f,0x70,0x31,0x41,0x41,0xfe,0x2d,0x6b,0x54,0x57,0x6f,0x6c,0x54,0x54,0x71,0x01,0x33,0x40,0x30,0x71,0x41,0x30,0x30,0x40,0x00,0xff,0xff,0x00,0x52,\r\n0x01,0x74,0x01,0xd7,0x02,0xbc,0x02,0x07,0x00,0x43,0x00,0x00,0xfc,0xb2,0xff,0xff,0x00,0x28,0x01,0x7f,0x02,0x70,0x02,0xbd,0x00,0x07,0x04,0x6e,0x01,0x4b,0xfc,0xbd,0xff,0xff,0x00,0x28,0x01,0x7f,0x02,0x6f,0x02,0xbd,0x00,0x07,0x00,0xde,0xff,0xe8,0xfc,0xbd,0xff,0xff,0x00,0x23,0x01,0x9e,0x02,0xa4,0x02,0x9e,0x00,0x07,0x00,0xd8,\r\n0x00,0x00,0xfc,0xec,0xff,0xff,0x00,0xad,0x01,0x8e,0x01,0x8d,0x05,0xba,0x00,0x07,0x00,0x1d,0x00,0x3d,0x01,0xa4,0x00,0x01,0x00,0x98,0x04,0x42,0x02,0x12,0x05,0xba,0x00,0x05,0x00,0x1b,0xb1,0x02,0x01,0xb8,0x01,0x33,0xb4,0x04,0x04,0x00,0x00,0x02,0xb9,0x01,0x32,0x00,0x03,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xfd,0xcd,0x31,0x30,0x01,\r\n0x21,0x11,0x23,0x11,0x21,0x02,0x12,0xfe,0xf0,0x6a,0x01,0x7a,0x05,0x52,0xfe,0xf0,0x01,0x78,0x00,0x01,0x00,0x98,0x04,0x42,0x02,0x12,0x05,0xba,0x00,0x05,0x00,0x19,0xb1,0x04,0x05,0xb8,0x01,0x33,0xb2,0x02,0x04,0x02,0xb8,0x01,0x32,0xb1,0x05,0x00,0x2f,0xdd,0xe1,0x00,0x3f,0xfd,0xcd,0x31,0x30,0x13,0x35,0x21,0x11,0x23,0x11,0x98,\r\n0x01,0x7a,0x6a,0x05,0x52,0x68,0xfe,0x88,0x01,0x10,0x00,0x01,0x00,0x98,0x00,0x00,0x02,0x12,0x01,0x79,0x00,0x05,0x00,0x1a,0xb1,0x04,0x05,0xb8,0x01,0x33,0xb3,0x02,0x00,0x00,0x05,0xb9,0x01,0x32,0x00,0x02,0x2f,0xf1,0xc1,0x2f,0x00,0x2f,0xfd,0xcd,0x31,0x30,0x25,0x15,0x21,0x11,0x33,0x11,0x02,0x12,0xfe,0x86,0x6a,0x68,0x68,0x01,\r\n0x79,0xfe,0xef,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x02,0x12,0x01,0x79,0x00,0x05,0x00,0x18,0xb1,0x02,0x00,0xbb,0x01,0x33,0x00,0x05,0x00,0x03,0x01,0x32,0xb1,0x01,0x05,0x2f,0xdd,0xe1,0x00,0x2f,0xfd,0xc6,0x31,0x30,0x37,0x21,0x11,0x33,0x11,0x21,0x98,0x01,0x10,0x6a,0xfe,0x86,0x68,0x01,0x11,0xfe,0x87,0x00,0x00,0x01,0xff,0xf0,\r\n0xfe,0x5c,0x02,0xba,0xff,0x89,0x00,0x07,0x00,0x31,0xb9,0x00,0x04,0x01,0x33,0x40,0x0d,0x40,0x01,0x80,0x06,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x07,0xb8,0x01,0x32,0xb3,0x06,0x06,0x09,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x2f,0x5d,0x33,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,\r\n0x21,0x35,0x33,0x02,0xba,0xfd,0x36,0x69,0x01,0xf8,0x69,0xfe,0x5c,0x01,0x2d,0xc5,0xc5,0x00,0x00,0x01,0xff,0xf2,0xfe,0x5c,0x02,0xba,0xff,0x89,0x00,0x05,0x00,0x27,0xb9,0x00,0x04,0x01,0x33,0x40,0x0e,0x40,0x01,0x80,0x0f,0x02,0x1f,0x02,0x2f,0x02,0x03,0x02,0x05,0x07,0x03,0xb9,0x01,0x32,0x00,0x02,0x2f,0xe1,0x10,0xc6,0x00,0x2f,\r\n0x5d,0x1a,0xdd,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x15,0x21,0x02,0xba,0xfd,0x38,0x68,0x02,0x60,0xfe,0x5c,0x01,0x2d,0xc5,0x00,0x00,0x01,0x00,0x3a,0xfe,0x5c,0x02,0x6e,0x00,0xa0,0x00,0x09,0x00,0x4b,0x40,0x2f,0x4f,0x02,0xcf,0x02,0x02,0x02,0x01,0x40,0x07,0xc0,0x07,0x02,0x07,0x01,0xdb,0x08,0x01,0x08,0x08,0x20,0x09,0x0c,\r\n0x48,0x08,0x05,0x02,0x42,0x4f,0x07,0x01,0x07,0x40,0x16,0x19,0x48,0x07,0x07,0x05,0x0f,0x09,0x1f,0x09,0x02,0x09,0x09,0x0b,0x05,0x2f,0x12,0x39,0x2f,0x5d,0x12,0x39,0x2f,0x2b,0x5d,0xe0,0x12,0x39,0x2b,0x11,0x33,0x00,0x2f,0xed,0xcd,0x5d,0x10,0xcd,0x5d,0x31,0x30,0x05,0x21,0x17,0x23,0x03,0x35,0x13,0x33,0x07,0x21,0x02,0x6e,0xfe,\r\n0x4a,0xa8,0x5e,0xc8,0xc6,0x5e,0xa6,0x01,0xb6,0xb0,0xf4,0x01,0x1b,0x0e,0x01,0x1b,0xf4,0x00,0x00,0x01,0xff,0x74,0x04,0xba,0x00,0x8c,0x06,0x58,0x00,0x06,0x00,0x1a,0x40,0x0b,0x02,0x00,0x06,0xc0,0x03,0x03,0x02,0x00,0x05,0x80,0x06,0x2f,0x1a,0xcd,0x00,0x3f,0x33,0x2f,0x1a,0xce,0x39,0x39,0x31,0x30,0x03,0x37,0x27,0x35,0x05,0x15,\r\n0x05,0x8c,0xaa,0xaa,0x01,0x18,0xfe,0xe8,0x05,0x25,0x65,0x64,0x6a,0xb5,0x33,0xb6,0x00,0x01,0xff,0xa6,0x04,0x98,0x00,0x5a,0x06,0x04,0x00,0x0b,0x00,0x20,0x40,0x0f,0x07,0xcb,0x40,0x06,0xc0,0x0b,0xcb,0x40,0x00,0x00,0x06,0x80,0x09,0xc9,0x03,0x2f,0xe1,0x1a,0xcc,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x13,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x15,0x14,0x33,0x5a,0x4d,0x67,0x66,0x4e,0x5e,0x5e,0x04,0x98,0x68,0x4e,0x4c,0x6a,0x5e,0x58,0x5a,0x00,0x02,0xfe,0xee,0x04,0xc2,0x01,0x12,0x06,0x68,0x00,0x0c,0x00,0x18,0x00,0x2f,0x40,0x18,0x0a,0xdb,0x04,0x01,0x06,0x06,0x0d,0xc1,0x40,0x13,0x00,0xc4,0x01,0x0e,0x10,0x06,0x16,0x42,0x06,0xc4,\r\n0x07,0x10,0xc0,0x16,0x2f,0xe1,0xd6,0xe1,0x2b,0x01,0x10,0xf2,0xe1,0x00,0x18,0x2f,0x1a,0xed,0x32,0x2f,0x33,0xde,0xed,0x31,0x30,0x01,0x23,0x26,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x05,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x01,0x12,0x66,0x09,0x61,0x44,0xa0,0x0c,0x64,0x04,0x95,0x75,0x71,0x9b,\r\n0xfe,0xf8,0x29,0x39,0x39,0x29,0x28,0x3a,0x38,0x05,0x6c,0x48,0x54,0x9c,0x72,0x8a,0x8a,0x59,0x39,0x29,0x29,0x38,0x38,0x29,0x28,0x3a,0x00,0x01,0xff,0x30,0xfd,0xfe,0x00,0xd2,0xff,0xa1,0x00,0x0b,0x00,0xa5,0x40,0x17,0x01,0x42,0x05,0x03,0x02,0x03,0x06,0x09,0x0b,0x00,0x03,0x08,0x56,0x06,0x01,0xd4,0x06,0xe4,0x06,0xf4,0x06,0x03,\r\n0x06,0xb8,0xff,0xe0,0x40,0x42,0x09,0x0c,0x48,0x59,0x08,0x01,0xdb,0x08,0xeb,0x08,0xfb,0x08,0x03,0x08,0x20,0x09,0x0c,0x48,0x08,0x06,0x04,0x0a,0x04,0x0f,0x07,0x1f,0x07,0x2f,0x07,0xcf,0x07,0x04,0x07,0x0a,0x42,0x02,0x00,0x0b,0x03,0x03,0x06,0x08,0x09,0x03,0x05,0x29,0x03,0x59,0x03,0x02,0x03,0x20,0x15,0x1a,0x48,0x03,0x20,0x09,\r\n0x0c,0x48,0x26,0x05,0x56,0x05,0x02,0x05,0xb8,0xff,0xe0,0xb3,0x15,0x1a,0x48,0x05,0xb8,0xff,0xe0,0x40,0x09,0x09,0x0c,0x48,0x05,0x03,0x07,0x01,0x04,0x04,0xb8,0xff,0xe0,0xb3,0x17,0x1b,0x48,0x04,0x19,0x2f,0x2b,0x17,0x33,0x2b,0x2b,0x71,0x2b,0x2b,0x71,0x11,0x17,0x33,0x11,0x17,0x33,0xe1,0x00,0x2f,0x5d,0x17,0x33,0x2b,0x5d,0x71,\r\n0x2b,0x5d,0x71,0x11,0x17,0x33,0x11,0x17,0x33,0x18,0xe5,0x31,0x30,0x17,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0xd2,0x85,0x85,0x4c,0x86,0x85,0x4b,0x85,0x85,0x4c,0x86,0x85,0xaa,0x86,0x84,0x4e,0x86,0x86,0x4c,0x85,0x85,0x4d,0x85,0x85,0x00,0xff,0xff,0xff,0x74,0xfe,0x5e,0x00,0x8c,0xff,0xfb,0x00,0x07,0x07,0x46,\r\n0xfe,0xac,0x00,0x00,0xff,0xff,0xff,0x74,0xfe,0x5e,0x00,0x8c,0xff,0xfb,0x00,0x07,0x07,0x47,0xfe,0xac,0x00,0x00,0x00,0x02,0xfe,0xa1,0xfe,0x5e,0x01,0x5f,0xff,0xfb,0x00,0x06,0x00,0x0d,0x00,0x35,0x40,0x1e,0x07,0x09,0x80,0x0f,0x0b,0x1f,0x0b,0x2f,0x0b,0x03,0x0b,0x0e,0x40,0x0f,0x06,0x1f,0x06,0x2f,0x06,0x03,0x06,0x03,0x0d,0xc0,\r\n0x0a,0x0a,0x02,0x06,0x80,0x05,0x2f,0x1a,0xcd,0x32,0x33,0x2f,0x1a,0xcc,0x00,0x2f,0xce,0x5d,0x1a,0x10,0xde,0x5d,0x1a,0xcd,0x32,0x31,0x30,0x01,0x37,0x27,0x35,0x05,0x15,0x05,0x25,0x27,0x07,0x23,0x13,0x33,0x13,0xfe,0xa1,0xaa,0xaa,0x01,0x19,0xfe,0xe7,0x02,0x53,0x64,0x64,0x6a,0xb5,0x33,0xb5,0xfe,0xc8,0x64,0x64,0x6b,0xb5,0x34,\r\n0xb4,0x2e,0xa9,0xa9,0x01,0x18,0xfe,0xe8,0x00,0x01,0xff,0xa6,0x04,0x98,0x00,0x5a,0x06,0x04,0x00,0x0b,0x00,0x22,0x40,0x10,0x05,0xcb,0x40,0x06,0xc0,0x01,0xcb,0x40,0x00,0x00,0x06,0x06,0x80,0x09,0xc9,0x03,0x2f,0xf1,0x1a,0xc8,0x2f,0x32,0x00,0x2f,0x1a,0xed,0x1a,0xde,0x1a,0xed,0x31,0x30,0x03,0x35,0x32,0x35,0x34,0x23,0x35,0x32,\r\n0x16,0x15,0x14,0x06,0x5a,0x5e,0x5e,0x4d,0x67,0x67,0x04,0x98,0x5c,0x5a,0x58,0x5e,0x69,0x4d,0x4e,0x68,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x07,0x40,0x00,0x09,0x00,0x23,0x40,0x11,0x09,0x05,0x07,0xda,0x40,0x02,0x00,0x84,0x09,0x0e,0x0a,0x05,0x0a,0x42,0x05,0x84,0x04,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x00,0x18,0x2f,0x1a,\r\n0xed,0xc4,0x32,0x31,0x30,0x01,0x02,0x21,0x20,0x03,0x33,0x12,0x21,0x20,0x13,0x03,0x1a,0xf0,0xfd,0xd6,0xfd,0xd6,0xf0,0xa2,0xba,0x01,0xbd,0x01,0xbf,0xba,0x07,0x40,0xfe,0x82,0x01,0x7e,0xfe,0xfe,0x01,0x02,0x00,0x01,0xfc,0xe6,0x05,0xc2,0x03,0x1a,0x06,0x58,0x00,0x03,0x00,0x19,0x40,0x0b,0x02,0x91,0x40,0x01,0x00,0x0e,0x04,0x04,\r\n0x01,0x42,0x01,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1a,0xf9,0xcc,0x06,0x34,0x05,0xc2,0x96,0x00,0x01,0xfc,0xe6,0xfe,0x70,0x03,0x1a,0xff,0x04,0x00,0x03,0x00,0x19,0x40,0x0b,0x01,0x91,0x40,0x02,0x03,0x0e,0x04,0x02,0x04,0x42,0x02,0x2f,0x2b,0x01,0x10,0xe2,0x00,0x18,0x2f,0x1a,\r\n0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1a,0xf9,0xcc,0x06,0x34,0xfe,0x70,0x94,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0xec,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x06,0x00,0xed,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x03,0xb6,0x04,0x00,0x00,0x07,0x00,0x0f,0x00,0x3c,\r\n0x40,0x1e,0x0a,0x07,0x01,0x02,0x08,0x0c,0x01,0x0c,0x0f,0x03,0x04,0x0c,0x04,0x08,0x95,0x02,0x02,0x01,0x07,0x0f,0x04,0x01,0x15,0x0f,0x08,0x05,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x00,0x3f,0x33,0x3f,0x12,0x39,0x2f,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x01,0x5d,0x21,0x23,0x03,0x21,\r\n0x03,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x03,0xb6,0xb4,0x58,0xfe,0x66,0x56,0xb0,0x01,0x75,0xc3,0x3b,0x87,0x02,0x12,0x07,0x05,0x10,0x88,0x01,0x02,0xfe,0xfe,0x04,0x00,0xfd,0x8e,0x01,0x8c,0x06,0x4e,0x1a,0x3a,0xfe,0x74,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0xe4,0x04,0x00,0x00,0x0f,0x00,0x13,0x00,0x5e,\r\n0x40,0x31,0x13,0x03,0x04,0x12,0x04,0x0c,0x95,0x40,0x0b,0x07,0x00,0x0b,0x95,0x1a,0x30,0x10,0x95,0x02,0x02,0x00,0x11,0x08,0x95,0x07,0x0f,0x04,0x0f,0x95,0x00,0x12,0x06,0x06,0x01,0x14,0x08,0x0c,0x00,0x00,0x15,0x10,0x0a,0x0e,0x84,0x01,0x01,0x15,0x14,0x04,0x05,0x2f,0x33,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x11,0x33,0x2f,0xc4,\r\n0xc4,0x11,0x12,0x39,0x2f,0x33,0x00,0x2f,0xed,0xc4,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x11,0x23,0x03,0x04,0xe4,0xfd,0xb6,0xfe,0xa2,0x82,0xba,0x02,0x23,0x02,0xaa,0xfe,0x6f,\r\n0x01,0x74,0xfe,0x8c,0x01,0xa8,0xfd,0xb6,0x1d,0xfa,0x01,0x02,0xfe,0xfe,0x04,0x00,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,0x01,0x02,0x01,0xe6,0xfe,0x1a,0x00,0x03,0x00,0x52,0xff,0xe8,0x06,0x50,0x04,0x18,0x00,0x23,0x00,0x2e,0x00,0x35,0x00,0x71,0x40,0x1d,0x16,0x40,0x0b,0x0e,0x48,0x16,0x16,0x14,0x24,0x00,0x11,0x95,0x2f,0x2f,0x0c,0x14,\r\n0x95,0x19,0x10,0x2b,0x95,0x1e,0x10,0x09,0x33,0x95,0x0c,0x16,0x04,0xb8,0xff,0xd0,0x40,0x1a,0x09,0x0c,0x48,0x04,0x02,0x95,0x07,0x16,0x05,0x05,0x21,0x83,0x28,0x28,0x37,0x00,0x09,0x1c,0x2f,0x04,0x24,0x83,0x11,0x11,0x37,0x17,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x17,0x30,0x83,0x0f,0x2f,0xe1,0xc4,0x2b,0x12,0x39,0x2f,0xe1,0x17,\r\n0x39,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x11,0x39,0x2f,0x2b,0x31,0x30,0x01,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x02,0x35,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x33,0x32,0x16,\r\n0x15,0x10,0x05,0x25,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x07,0x21,0x16,0x16,0x33,0x32,0x36,0x03,0xcb,0xd7,0xb1,0x9b,0x94,0xc8,0xee,0x42,0x04,0x73,0xf1,0xca,0xde,0x02,0xd3,0x03,0xb0,0x99,0xaf,0x90,0x84,0xe2,0x01,0x0a,0x77,0x04,0x8d,0xf6,0x99,0xaf,0xfe,0x81,0xfe,0xfa,0xcd,0x85,0x8d,0x6a,0x5a,0x78,0xa3,0xa6,\r\n0xfd,0xd5,0x02,0x85,0x77,0x74,0xa6,0x01,0x9c,0xfe,0xd6,0x7a,0xa4,0x60,0xc6,0xc6,0x01,0x05,0xe8,0x54,0xab,0xba,0x72,0x9a,0x62,0xe0,0xe0,0xa1,0x87,0xfe,0xd2,0x16,0x7d,0x0a,0x06,0x52,0x61,0x49,0x59,0xab,0x85,0xc0,0x90,0x9c,0xa4,0x00,0x00,0x03,0x00,0x3e,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x48,\r\n0x40,0x27,0x01,0x12,0x15,0x1c,0x04,0x08,0x95,0x0b,0x0b,0x1d,0x14,0x95,0x0c,0x0f,0x1d,0x95,0x07,0x15,0x12,0x01,0x19,0x83,0x10,0x10,0x03,0x20,0x00,0x00,0x03,0x83,0x20,0x20,0x25,0x15,0x0b,0x1d,0x84,0x09,0x07,0x2f,0xce,0xe1,0x39,0x39,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,\r\n0x12,0x39,0x2f,0xed,0x17,0x39,0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x33,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x26,0x23,0x03,0x92,0x7e,0x6b,0xc4,0xab,0xfe,0x96,0x68,0x68,0x01,0x5e,0x99,0xb5,0x60,0xa0,0xfd,0xb6,0xac,0x54,\r\n0x64,0xb8,0xac,0xba,0xd7,0x7b,0x64,0x01,0xcb,0x37,0x78,0x7f,0x9d,0x01,0xcb,0x8b,0x01,0xaa,0x8a,0x70,0x75,0x3b,0x01,0x1e,0xfe,0xe2,0x51,0x47,0x86,0xfe,0x57,0xfe,0xc1,0x99,0x4c,0x5a,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x04,0x06,0x04,0x00,0x00,0x07,\r\n0x00,0x0e,0x00,0x1f,0x40,0x10,0x08,0x95,0x01,0x0f,0x09,0x95,0x00,0x15,0x04,0x83,0x0c,0x0c,0x10,0x09,0x84,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x33,0x11,0x21,0x20,0x11,0x14,0x00,0x23,0x03,0x11,0x33,0x20,0x11,0x10,0x21,0xa6,0x01,0x40,0x02,0x20,0xfe,0xd5,0xfc,0x97,0x8f,0x01,0x89,0xfe,0x7b,\r\n0x04,0x00,0xfe,0x0a,0xeb,0xfe,0xe1,0x03,0x74,0xfd,0x18,0x01,0x7a,0x01,0x6e,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x04,0x10,0x04,0x00,0x00,0x0b,0x00,0x16,0x00,0x3f,0x40,0x22,0x10,0x0d,0x01,0x95,0x40,0x04,0x05,0x00,0x04,0x95,0x1a,0x30,0x0c,0x95,0x05,0x0f,0x11,0x95,0x00,0x15,0x0f,0x0f,0x11,0x08,0x83,0x14,0x14,0x18,0x0d,0x04,\r\n0x11,0x84,0x02,0x00,0x2f,0xc6,0xe1,0x39,0x39,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x11,0x14,0x00,0x23,0x03,0x11,0x33,0x15,0x23,0x11,0x33,0x20,0x11,0x10,0x21,0xb0,0x74,0x74,0x01,0x40,0x02,0x20,0xfe,0xd6,0xfc,\r\n0x98,0xec,0xec,0x90,0x01,0x88,0xfe,0x7c,0x01,0xba,0x8c,0x01,0xba,0xfe,0x0a,0xea,0xfe,0xe0,0x03,0x74,0xfe,0xd2,0x8c,0xfe,0xd2,0x01,0x7a,0x01,0x6e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x02,0xf0,0x04,0x00,0x00,0x0b,0x00,0x32,0x40,0x1b,0x08,0x95,0x40,0x07,0x03,0x00,0x07,0x95,0x1a,0x30,0x04,0x95,0x03,0x0f,0x0b,0x95,0x00,0x15,\r\n0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0x84,0x01,0x2f,0xe1,0x39,0x11,0x33,0x2f,0xc4,0xc4,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x02,0xf0,0xfd,0xb6,0x02,0x33,0xfe,0x6f,0x01,0x74,0xfe,0x8c,0x01,0xa8,0x04,0x00,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,\r\n0x00,0x01,0x00,0x5a,0xff,0xe8,0x02,0xec,0x04,0x18,0x00,0x22,0x00,0x3e,0x40,0x20,0x01,0x12,0x95,0x13,0x13,0x1e,0x0b,0x1b,0x19,0x95,0x1e,0x10,0x09,0x0b,0x95,0x06,0x16,0x00,0x21,0x12,0x0e,0x83,0x03,0x03,0x21,0x83,0x16,0x16,0x24,0x12,0x08,0x1b,0x2f,0xc6,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xfd,\r\n0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x10,0xbb,0xca,0xa3,0x82,0x68,0x6e,0x7c,0x5a,0x6d,0x8c,0x78,0x50,0x52,0x01,0x21,\r\n0x7e,0x72,0x86,0x74,0x72,0x98,0xb9,0xcf,0x01,0xea,0x04,0x40,0xa8,0x7d,0x99,0x2e,0x9a,0x3e,0x51,0x43,0x4b,0x59,0x8e,0xac,0x4d,0x5d,0x3e,0x96,0x32,0xa0,0x88,0xd0,0x00,0x02,0x00,0x8e,0xfe,0x27,0x01,0x64,0x04,0x00,0x00,0x03,0x00,0x0f,0x00,0x23,0x40,0x12,0x0a,0x63,0x04,0x1b,0x00,0x15,0x03,0x0f,0x0d,0x62,0x07,0x07,0x00,0x84,\r\n0x01,0x01,0x11,0x10,0x11,0x12,0x39,0x2f,0xe1,0x33,0x2f,0xe1,0x00,0x3f,0x3f,0x3f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x48,0xa2,0xa2,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x04,0x00,0xfa,0x27,0x3d,0x2e,0x2e,0x3c,0x3e,0x2c,0x2e,0x3d,0x00,0x00,0x01,0x00,0x14,\r\n0xff,0xec,0x01,0xd3,0x04,0x00,0x00,0x0b,0x00,0x1b,0x40,0x0d,0x0b,0x0f,0x05,0x07,0x95,0x02,0x16,0x09,0x84,0x00,0x00,0x0d,0x04,0x2f,0x11,0x33,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0x31,0x30,0x01,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x01,0xd3,0xfe,0xb9,0x40,0x38,0x32,0x3d,0xac,0xa4,0x01,0x72,0xfe,0x7a,0x14,\r\n0x94,0x1d,0x01,0x00,0x02,0x89,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x0d,0x00,0x45,0x40,0x23,0x0b,0x02,0x03,0x0a,0x03,0x08,0x05,0x04,0x09,0x0a,0x09,0x04,0x03,0x09,0x03,0x09,0x03,0x01,0x06,0x0f,0x0c,0x95,0x01,0x15,0x0a,0x0a,\r\n0x00,0x00,0x0f,0x08,0x05,0x0c,0x84,0x03,0x01,0x2f,0xce,0xe1,0x39,0x39,0x11,0x33,0x2f,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x87,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0x21,0x21,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x21,0x03,0x04,0xfd,0xa2,0x64,0x64,0xa2,0xf0,0xf0,\r\n0x01,0xbc,0x01,0x74,0x38,0x8a,0x3a,0x02,0x00,0xfe,0x5c,0x88,0x8e,0x87,0xfe,0xbd,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0xf8,0x04,0x00,0x02,0x06,0x02,0x13,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,0x02,0x06,0x02,0x0f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x02,0x06,0x00,0x52,0x00,0x00,\r\n0x00,0x01,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x00,0x15,0x00,0x34,0x40,0x1f,0x40,0x0b,0x50,0x0b,0x02,0x0b,0x0b,0x09,0x95,0x0e,0x10,0x4f,0x01,0x5f,0x01,0x6f,0x01,0x03,0x01,0x01,0x03,0x95,0x14,0x16,0x11,0x83,0x06,0x06,0x17,0x0b,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,\r\n0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x5a,0x6c,0x86,0xa6,0xd2,0xcd,0x9f,0x8e,0x70,0x7c,0x9a,0xe6,0x01,0x16,0xfe,0xcd,0xeb,0x84,0x18,0x9a,0x40,0xda,0xb8,0xb3,0xd7,0x46,0x95,0x3b,0xfe,0xde,0xea,0xef,0xfe,0xcb,0x00,0x02,0x00,0x60,0x00,0x08,\r\n0x04,0x92,0x03,0xf8,0x00,0x0b,0x00,0x17,0x00,0x1f,0x40,0x10,0x0c,0xf4,0x06,0x0f,0x12,0xf4,0x00,0x15,0x09,0xed,0x15,0x15,0x19,0x0f,0xed,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x25,0x22,0x00,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x02,0x79,0xf2,0xfe,0xd9,0x01,0x28,0xf1,0xf2,0x01,0x27,0xfe,0xd7,0xf2,0xb9,0xd2,0xd2,0xbd,0xb7,0xd4,0xd2,0x08,0x01,0x15,0xe5,0xe7,0x01,0x0f,0xfe,0xeb,0xe5,0xe5,0xfe,0xef,0x03,0x48,0xb6,0x9a,0xa2,0xae,0xb5,0x9b,0xa1,0xaf,0x00,0x00,0x01,0x00,0x60,0x00,0xb6,0x04,0x92,0x03,0xf8,0x00,0x15,0x00,0x29,0x40,0x14,0x0b,0x00,\r\n0x00,0x17,0x06,0xf4,0x11,0x0f,0x01,0x14,0xed,0x03,0x03,0x17,0x0e,0x0b,0x0b,0x09,0xed,0x0e,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0xc6,0x00,0x3f,0xed,0x12,0x39,0x2f,0xc4,0x31,0x30,0x25,0x23,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x04,0x50,0x92,0x48,0xd8,\r\n0xb5,0xb3,0xda,0x47,0x91,0x42,0x01,0x2f,0xec,0xec,0x01,0x2b,0xb6,0x7a,0xab,0xab,0xcc,0xd0,0xa7,0xa5,0x80,0x8e,0x9b,0xf0,0x01,0x29,0xfe,0xdf,0xe9,0xae,0x00,0x03,0x00,0x4c,0xff,0xe8,0x04,0xa6,0x04,0x18,0x00,0x13,0x00,0x1b,0x00,0x23,0x00,0x7d,0x40,0x47,0x15,0x15,0x16,0x14,0x14,0x1b,0x13,0x13,0x12,0x0c,0x0c,0x0d,0x0b,0x00,\r\n0x0b,0x1d,0x1d,0x1e,0x1c,0x1c,0x23,0x09,0x09,0x08,0x02,0x02,0x03,0x0a,0x01,0x0a,0x00,0x01,0x04,0x0a,0x0b,0x14,0x15,0x1c,0x1d,0x04,0x22,0x1a,0x02,0x09,0x0c,0x13,0x04,0x04,0x1a,0xf4,0x0e,0x0f,0x22,0xf4,0x04,0x15,0x01,0x00,0x00,0x11,0x0b,0x0a,0x07,0x11,0xed,0x17,0x17,0x25,0x1f,0xed,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,\r\n0xc6,0x32,0x10,0xc2,0x2f,0x32,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0xc6,0x32,0x10,0xc6,0x32,0x31,0x30,0x10,0x87,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x10,0x87,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x08,0xc0,0x25,0x07,0x27,0x06,0x23,0x22,0x00,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x00,0x15,0x14,\r\n0x07,0x01,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x01,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x04,0xa6,0x48,0x8b,0x8b,0xcf,0xf2,0xfe,0xd9,0x71,0x85,0x48,0x8a,0x8c,0xcf,0xf2,0x01,0x27,0x71,0xfd,0x77,0x02,0x18,0x56,0xd2,0xbd,0x82,0x01,0x65,0xfd,0xe8,0x56,0xd2,0xbd,0x81,0x33,0x4b,0x84,0x64,0x01,0x15,0xe5,0xc8,0x82,0x81,0x4b,0x84,\r\n0x64,0xfe,0xeb,0xe5,0xc8,0x82,0x02,0x6d,0xfd,0xfb,0x5a,0x8a,0xa1,0xaf,0xfd,0x8f,0x02,0x05,0x5a,0x8a,0xa2,0xae,0x00,0x03,0x00,0x52,0xff,0xe8,0x07,0x10,0x04,0x18,0x00,0x1c,0x00,0x28,0x00,0x2f,0x00,0x58,0x40,0x29,0x0d,0x40,0x0b,0x0e,0x48,0x0d,0x0d,0x0b,0x08,0x95,0x29,0x29,0x0b,0x03,0x10,0x0b,0x1d,0x95,0x15,0x10,0x2d,0x03,\r\n0x23,0x95,0x1b,0x16,0x18,0x83,0x26,0x26,0x31,0x00,0x12,0x29,0x03,0x20,0x83,0x08,0x08,0x31,0x0d,0xb8,0xff,0xc0,0xb6,0x0e,0x12,0x48,0x0d,0x2a,0x83,0x06,0x2f,0xe1,0xc4,0x2b,0x12,0x39,0x2f,0xe1,0x17,0x39,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x39,0x39,0x3f,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,\r\n0x25,0x23,0x06,0x21,0x22,0x02,0x35,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x00,0x15,0x10,0x00,0x23,0x20,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x21,0x16,0x16,0x33,0x32,0x36,0x03,0x72,0x04,0x76,0xfe,0xf6,0xc2,0xda,0x02,0xd3,0x03,0xb0,0x9b,0xad,0x90,0x88,\r\n0xda,0x01,0x10,0x71,0x04,0x83,0x01,0x1a,0xe5,0x01,0x0d,0xfe,0xe6,0xf0,0xfe,0xd9,0x01,0x35,0xa0,0xa9,0xab,0x9c,0x9f,0xb9,0xb9,0xfd,0x72,0xfd,0xd7,0x02,0x84,0x74,0x78,0xa6,0xd3,0xeb,0x01,0x05,0xe4,0x58,0xab,0xba,0x72,0x9a,0x62,0xed,0xed,0xfe,0xe4,0xee,0xfe,0xfc,0xfe,0xde,0x03,0xa6,0xcf,0xbb,0xc2,0xd0,0xd9,0xbf,0xb5,0xcf,\r\n0xfe,0x10,0x8e,0x9e,0xa9,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xea,0x04,0x00,0x00,0x1f,0x00,0x2b,0x00,0x3f,0x40,0x21,0x14,0x00,0x20,0x95,0x0a,0x0a,0x26,0x05,0x10,0x0f,0x26,0x95,0x1a,0x16,0x14,0x00,0x02,0x0d,0x84,0x12,0x12,0x17,0x83,0x29,0x29,0x2d,0x1d,0x07,0x84,0x02,0x23,0x83,0x1d,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,\r\n0x2f,0xf1,0xc0,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x01,0x40,0xa6,0x1c,0xa0,0x1c,0x7e,0x6d,0x6d,0x7e,0x1c,0xa2,0x1a,0xa8,0x68,0x7a,0xfe,0xcb,0xd1,0xf0,0x78,0x01,0x4d,0x82,0x9b,0xa0,0x7d,0x81,0x9c,0x9f,0x02,0x7f,0x4b,0xa4,0x46,0x4c,0x45,0x40,0x56,0x6b,0x6b,0x56,0x40,0x45,0x46,0x4c,0x9e,0x51,0x26,0x9f,0x66,0xa2,0xca,0xc1,0xa3,0x65,0xa5,0x27,0x78,0x67,0x66,0x78,0x7a,\r\n0x68,0x63,0x78,0x00,0x00,0x01,0x00,0x60,0x02,0x00,0x04,0x62,0x04,0x18,0x00,0x0d,0x00,0x1d,0x40,0x0e,0x07,0x00,0x04,0x95,0x0b,0x10,0x00,0x83,0x01,0x01,0x0f,0x07,0x83,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0xc4,0x32,0x31,0x30,0x01,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x00,0x33,0x32,0x00,0x04,0x62,0xa8,\r\n0xb9,0xa1,0x9f,0xb9,0xa8,0x01,0x1f,0xe9,0xe7,0x01,0x13,0x02,0x00,0xbc,0xd2,0xd8,0xb6,0xee,0x01,0x2a,0xfe,0xde,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x62,0x02,0x00,0x00,0x0d,0x00,0x1d,0x40,0x0e,0x0d,0x06,0x0a,0x95,0x03,0x16,0x00,0x83,0x0d,0x0d,0x0f,0x07,0x83,0x06,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0xd4,0xc4,0x31,\r\n0x30,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x04,0x62,0xfe,0xe1,0xe9,0xe6,0xfe,0xec,0xa8,0xb9,0xa1,0x9f,0xb9,0x02,0x00,0xef,0xfe,0xd7,0x01,0x22,0xf6,0xbc,0xd2,0xd8,0xb6,0x00,0x02,0x00,0xa6,0x00,0x00,0x03,0x52,0x04,0x00,0x00,0x0a,0x00,0x11,0x00,0x27,0x40,0x14,0x0c,0x95,0x00,0x00,0x01,0x0b,\r\n0x95,0x03,0x0f,0x01,0x15,0x07,0x83,0x0f,0x0f,0x13,0x0c,0x01,0x84,0x02,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x48,0xa2,0x01,0x33,0xb4,0xc5,0xd4,0xb8,0x7e,0x7e,0xe6,0xd9,0x01,0x70,\r\n0xfe,0x90,0x04,0x00,0xa1,0x99,0x98,0xbe,0x02,0x04,0xfe,0x88,0xc2,0xb6,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0xfc,0x04,0x00,0x00,0x12,0x00,0x1a,0x00,0x3b,0x40,0x1e,0x0b,0x02,0x95,0x13,0x13,0x00,0x14,0x95,0x12,0x0f,0x07,0x00,0x15,0x06,0x09,0x0b,0x09,0x08,0x13,0x00,0x84,0x01,0x01,0x1c,0x17,0x84,0x0e,0x0e,0x07,0x08,0x2f,0x33,\r\n0x33,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x39,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xc4,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x23,0x11,0x23,0x22,0x06,0x07,0x03,0x23,0x13,0x36,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x21,0x03,0x11,0x23,0x22,0x15,0x14,0x16,0x33,0x02,0xfc,0xa2,0x58,0x42,0x51,0x23,0x79,0xb5,0x8e,0x34,0x53,\r\n0xe5,0xc6,0xae,0x01,0x3a,0xa2,0x98,0xd0,0x6e,0x5e,0x01,0xa6,0x3f,0x53,0xfe,0xec,0x01,0x35,0x71,0x29,0x04,0x2b,0xd7,0x87,0xa4,0xfe,0x31,0x01,0x43,0x9d,0x4f,0x57,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0xfc,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x3b,0x40,0x1e,0x06,0x13,0x95,0x0f,0x0f,0x12,0x0b,0x11,0x0f,0x12,0x95,0x00,0x15,0x0c,\r\n0x09,0x09,0x06,0x0a,0x0f,0x00,0x84,0x12,0x12,0x1a,0x16,0x84,0x04,0x04,0x0b,0x0a,0x2f,0x33,0x33,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x12,0x39,0x39,0x11,0x33,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x37,0x35,0x26,0x27,0x03,0x33,0x13,0x16,0x33,0x33,0x11,0x33,0x03,0x11,0x23,\r\n0x22,0x15,0x14,0x33,0x02,0xfc,0xfe,0xae,0xa5,0xb7,0xea,0x53,0x39,0x8e,0xb9,0x75,0x3e,0x78,0x58,0xa2,0xa2,0x9c,0xcc,0xc4,0x98,0x84,0xda,0x31,0x04,0x21,0x7c,0x01,0x38,0xfe,0xec,0x92,0x01,0xa6,0xfc,0x8c,0x01,0x43,0xa8,0x9b,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0x29,0x04,0x00,0x02,0x06,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0x90,\r\n0xff,0xe8,0x03,0xb6,0x04,0x00,0x00,0x0d,0x00,0x1e,0x40,0x0f,0x06,0x0d,0x0f,0x09,0x95,0x02,0x16,0x0d,0x84,0x0c,0x0c,0x0f,0x06,0x84,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x33,0x31,0x30,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x11,0x11,0x33,0x03,0xb6,0xfe,0x64,0xfe,0x76,0xa1,0xf2,0xf1,0xa2,\r\n0x01,0xa6,0xfe,0x42,0x01,0xb2,0x02,0x66,0xfd,0xa2,0xfe,0xd0,0x01,0x2a,0x02,0x64,0x00,0x01,0x00,0x66,0x00,0x5a,0x04,0x38,0x03,0xac,0x00,0x12,0x00,0x2a,0x40,0x14,0x00,0xf4,0x01,0x01,0x13,0x0d,0x08,0xf4,0x09,0x0c,0x04,0x0b,0x0b,0x0f,0xed,0x04,0x04,0x14,0x08,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x33,0x00,0x2f,\r\n0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x37,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x23,0x66,0x02,0x0c,0x01,0x3a,0xad,0x88,0xfd,0xef,0x03,0xb8,0x80,0x9a,0xef,0xd5,0x5a,0xa4,0xf2,0x74,0xa6,0xa2,0xa2,0x04,0x6b,0xc2,0xb0,0xcf,0x00,0x03,0x00,0x3e,0x00,0x5a,0x05,0x6c,0x03,0xac,\r\n0x00,0x12,0x00,0x1e,0x00,0x2a,0x00,0x49,0x40,0x25,0x19,0x63,0x13,0x1f,0x63,0x25,0x13,0x25,0x13,0x09,0x00,0xf4,0x01,0x01,0x13,0x0d,0x08,0xf4,0x09,0x0c,0x04,0x0b,0x0b,0x0f,0xed,0x04,0x04,0x2c,0x08,0x00,0x00,0x2c,0x1c,0x16,0x28,0x62,0x22,0x2f,0xe1,0x39,0x39,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x33,0x00,\r\n0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0xed,0x10,0xed,0x31,0x30,0x25,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x9c,0x02,0x0c,\r\n0x01,0x3a,0xae,0x88,0xfd,0xf0,0x03,0xb8,0x81,0x99,0xed,0xd5,0xfc,0xf6,0x2a,0x38,0x38,0x2a,0x29,0x39,0x38,0x2a,0x2a,0x38,0x38,0x2a,0x29,0x39,0x38,0x5a,0xa4,0xf2,0x73,0xa7,0xa2,0xa2,0x04,0x6b,0xc2,0xb1,0xce,0x02,0x12,0x3b,0x28,0x29,0x3b,0x3b,0x29,0x29,0x3a,0xfe,0x80,0x38,0x28,0x29,0x3b,0x39,0x29,0x28,0x3a,0x00,0x00,0x01,\r\n0x00,0x66,0xff,0x2d,0x04,0x38,0x04,0xd7,0x00,0x1f,0x00,0x3e,0x40,0x1f,0x01,0xf4,0x40,0x00,0x0e,0x09,0x0a,0x12,0x42,0x15,0x11,0xf4,0x12,0x1b,0x09,0xf4,0x0a,0x14,0x14,0x1b,0x15,0x18,0x0d,0x1d,0xed,0x05,0x05,0x21,0x11,0x09,0x00,0x2f,0x32,0x32,0x11,0x39,0x2f,0xf1,0x39,0x39,0x33,0x33,0xc0,0x2f,0x00,0x2f,0xed,0x39,0xd6,0xed,\r\n0x32,0x2b,0x00,0x18,0x10,0xf6,0x1a,0xed,0x31,0x30,0x17,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x20,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x10,0x21,0x66,0x02,0x04,0xab,0x97,0xbc,0x8a,0xfe,0x00,0x02,0x19,0x01,0x2d,0xb4,0x92,0xfe,0x00,0x03,0xb8,0x8c,0xa6,0x76,\r\n0x60,0xd6,0xfe,0x47,0xd3,0xa2,0x6a,0x75,0x6f,0x93,0xa2,0xe6,0x70,0x8d,0xa2,0xa2,0x04,0x5b,0xbc,0x6f,0xab,0x27,0x61,0xd4,0xfe,0x89,0xff,0xff,0x00,0x0e,0x00,0x00,0x03,0xcb,0x04,0x00,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x02,0x06,0x00,0x5a,0x00,0x00,0xff,0xff,0x00,0x21,0x00,0x00,\r\n0x03,0x70,0x04,0x00,0x02,0x06,0x00,0x5d,0x00,0x00,0x00,0x01,0x00,0x50,0xff,0xe8,0x02,0xf8,0x04,0x00,0x00,0x17,0x00,0x3d,0x40,0x1f,0x0a,0x08,0x52,0x10,0x10,0x03,0x0f,0x0c,0x95,0x0d,0x0f,0x01,0x03,0x95,0x16,0x16,0x10,0x0a,0x0a,0x06,0x0c,0x0b,0x0f,0x0f,0x13,0x84,0x06,0x06,0x19,0x0c,0x00,0x2f,0xc4,0x12,0x39,0x2f,0xf1,0xc0,\r\n0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x39,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x21,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x50,0x6a,0x92,0x7a,0x8e,0xfe,0xdd,0x3d,0x01,0x06,0xfe,0x56,0x02,0x8b,0xfe,0xed,0x8e,0xa2,0xf0,\r\n0xc6,0x89,0x18,0x96,0x3c,0x66,0x59,0xc1,0x3d,0x01,0x45,0x8c,0x46,0xfe,0xac,0x13,0xa4,0x7c,0x92,0xb9,0x00,0x01,0x00,0x50,0xff,0xe8,0x02,0xfa,0x04,0x18,0x00,0x25,0x00,0x42,0x40,0x22,0x14,0x13,0x07,0x01,0x00,0x0c,0x1f,0x1c,0x1a,0x95,0x1f,0x10,0x09,0x07,0x95,0x0c,0x16,0x00,0x83,0x14,0x14,0x18,0x0f,0x09,0x09,0x22,0x83,0x18,\r\n0x18,0x27,0x1c,0x05,0x83,0x0f,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x10,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x01,0x15,0x06,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x35,0x36,0x37,0x36,0x35,0x34,0x23,0x22,\r\n0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x01,0xf8,0x2e,0x56,0x7e,0xe5,0x9b,0x76,0x7c,0xa5,0xb3,0xc8,0x9e,0x3a,0x2a,0x2e,0x55,0x7f,0xe6,0x9a,0x76,0x7c,0xa5,0xb3,0xc8,0x9e,0x3a,0x02,0x0a,0x54,0x1e,0x28,0x3a,0x4a,0x7a,0x4c,0x97,0x3f,0x8c,0x72,0x90,0x4a,0x1c,0x1a,0x54,0x1e,0x28,0x3a,0x4a,0x7a,0x4c,0x97,0x3f,0x8c,\r\n0x72,0x90,0x4a,0x1c,0x00,0x01,0x00,0x14,0xff,0xe8,0x04,0x25,0x04,0x18,0x00,0x1b,0x00,0x3b,0x40,0x1e,0x12,0x10,0x09,0x1b,0x0b,0x06,0x19,0x95,0x02,0x16,0x04,0x0d,0x17,0x03,0x0f,0x1b,0x0e,0x15,0x0f,0x40,0x0f,0x09,0x42,0x09,0x09,0x1c,0x0f,0x0f,0x1d,0x1c,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0x2b,0x01,0x1a,0x18,0x10,0xdd,0xe2,\r\n0x12,0x17,0x39,0x00,0x3f,0xfd,0x39,0x39,0xd6,0xc4,0x3f,0x31,0x30,0x25,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x04,0x25,0x61,0x82,0x99,0x8d,0x8c,0x94,0x81,0x67,0x6e,0x74,0x60,0x62,0xe9,0xb6,0x9c,0x9b,0xae,0xe7,0x63,0x64,0x71,\r\n0x6a,0x38,0x50,0x7a,0x7a,0x4d,0xa8,0x6b,0x54,0xe7,0xf5,0xa4,0xd2,0xcb,0xa5,0xfc,0xe6,0x54,0x67,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0xdf,0x04,0x00,0x02,0x06,0x02,0x0a,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x03,0xb6,0x04,0x00,0x00,0x0b,0x00,0x17,0x40,0x0a,0x04,0x0b,0x0f,0x00,0x09,0x15,0x00,0x00,0x0d,0x09,0x2f,0x11,\r\n0x33,0x2f,0x00,0x3f,0xc4,0x3f,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x03,0xb6,0xb2,0xfe,0xf2,0x02,0x12,0x05,0x05,0x10,0xfe,0xf2,0xb0,0x01,0x79,0xc1,0x03,0x14,0x06,0x4e,0x1b,0x39,0xfc,0xec,0x04,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x02,0x06,0x02,0x16,0x00,0x00,\r\n0xff,0xff,0x00,0xa6,0x00,0x00,0x03,0x52,0x04,0x00,0x02,0x06,0x07,0x7a,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x04,0x5a,0x04,0x00,0x00,0x13,0x00,0x4c,0x40,0x29,0x0c,0x05,0x0f,0x96,0x40,0x02,0x02,0x03,0x0e,0x09,0x13,0x0f,0x03,0x15,0x11,0x84,0x00,0x0e,0x03,0x0a,0x84,0x07,0x04,0x07,0x42,0x07,0x07,0x14,0x0f,0x0c,0x03,0x84,\r\n0x4f,0x04,0x5f,0x04,0x02,0x04,0x04,0x15,0x14,0x11,0x12,0x39,0x2f,0x5d,0xe1,0x39,0x39,0x12,0x39,0x2f,0x2b,0x01,0x10,0xe1,0x10,0xf0,0xe1,0x00,0x18,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x1a,0xed,0x39,0x39,0x31,0x30,0x01,0x10,0x05,0x11,0x23,0x11,0x24,0x11,0x11,0x33,0x11,0x14,0x05,0x11,0x33,0x11,0x24,0x35,0x11,0x33,0x04,0x5a,\r\n0xfe,0x54,0xa2,0xfe,0x54,0xa2,0x01,0x0a,0xa2,0x01,0x0a,0xa2,0x02,0x92,0xfe,0xa0,0x18,0xfe,0xe6,0x01,0x1a,0x12,0x01,0x60,0x01,0x74,0xfe,0x92,0xee,0x08,0x02,0x64,0xfd,0x9c,0x0c,0xea,0x01,0x6e,0x00,0x01,0x00,0x0a,0xff,0xf4,0x03,0xd7,0x04,0x00,0x00,0x10,0x00,0x2a,0x40,0x15,0x02,0x95,0x10,0x0f,0x09,0x0b,0x95,0x06,0x01,0x00,\r\n0x15,0x03,0x0f,0x0f,0x09,0x00,0x84,0x01,0x01,0x12,0x09,0x2f,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x00,0x3f,0x10,0xd4,0xfd,0xc6,0x3f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x11,0x21,0x03,0xd7,0xa2,0xfe,0x67,0x0d,0x94,0xa1,0x26,0x2a,0x20,0x1e,0x41,0x48,0x2b,0x02,0xdb,\r\n0x03,0x74,0xfd,0xb0,0xfe,0xd0,0x0c,0x8c,0x0d,0x7e,0x01,0x90,0x01,0x73,0x00,0x02,0x00,0x0a,0x02,0x9a,0x02,0xd7,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x4e,0x40,0x10,0x02,0x08,0x09,0x0a,0x0b,0x0c,0x01,0x0c,0x0d,0x0e,0x0f,0x03,0x04,0x0c,0x04,0x03,0xb8,0x01,0x0e,0xb2,0x0f,0x0f,0x06,0xbc,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x05,\r\n0x01,0x0a,0xb6,0x0f,0x08,0x05,0x00,0x00,0x11,0x05,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x00,0x3f,0x3f,0x3f,0x39,0x2f,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x05,0xc0,0x0e,0xc0,0xc0,0x05,0xc0,0xc0,0x01,0x23,0x27,0x21,0x07,0x23,0x01,0x33,0x13,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x02,0xd7,0x8f,0x44,\r\n0xfe,0xd5,0x3f,0x90,0x01,0x1d,0x97,0x24,0x63,0x03,0x0a,0x04,0x05,0x09,0x64,0x02,0x9a,0xbe,0xbe,0x03,0x00,0xfe,0x2e,0x01,0x22,0x0a,0x31,0x22,0x19,0xfe,0xde,0x00,0x00,0x02,0xff,0xf6,0x02,0x9a,0x03,0x9e,0x05,0x9a,0x00,0x0f,0x00,0x13,0x00,0x76,0xb5,0x13,0x03,0x04,0x12,0x04,0x0d,0xb8,0x01,0x0e,0xb4,0x40,0x0a,0x06,0x01,0x0a,\r\n0xb8,0x01,0x0e,0xb2,0xff,0x30,0x03,0xb8,0x01,0x0e,0xb3,0x13,0x13,0x06,0x0e,0xb8,0x01,0x0e,0xb2,0x01,0x01,0x05,0xbe,0x01,0x0a,0x00,0x09,0x01,0x0e,0x00,0x12,0x01,0x0e,0x00,0x06,0x01,0x06,0x40,0x09,0x03,0x04,0x12,0x13,0x04,0x05,0x10,0x0a,0x0e,0xb8,0x01,0x0c,0x40,0x09,0x01,0x01,0x05,0x08,0x0c,0x00,0x00,0x15,0x05,0x2f,0x12,\r\n0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xe1,0x39,0x39,0x12,0x17,0x39,0x00,0x3f,0xed,0xed,0x3f,0x33,0x10,0xed,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0x01,0x21,0x35,0x21,0x07,0x23,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x25,0x11,0x23,0x03,0x03,0x9e,0xfe,0x50,0xff,0x00,\r\n0x60,0x98,0x01,0xa2,0x01,0xf6,0xfe,0xe2,0x01,0x09,0xfe,0xf7,0x01,0x2e,0xfe,0x50,0x0f,0xb8,0x02,0x9a,0xbe,0xbe,0x03,0x00,0x71,0xd9,0x6c,0xda,0xbe,0x01,0x63,0xfe,0x9d,0x00,0x00,0x03,0x00,0x7b,0x02,0x9a,0x02,0x89,0x05,0x9a,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0x57,0xb1,0x07,0x14,0xb8,0x01,0x0e,0xb4,0x40,0x0e,0x01,0x00,0x0e,\r\n0xb8,0x01,0x0e,0xb2,0x32,0x30,0x15,0xbe,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x0d,0x01,0x0e,0x00,0x01,0x01,0x06,0xb3,0x06,0x09,0x0e,0x11,0xb8,0x01,0x0c,0xb2,0x04,0x04,0x09,0xb8,0x01,0x0c,0xb4,0x18,0x18,0x1c,0x0e,0x15,0xb9,0x01,0x0c,0x00,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x00,0x3f,0xed,\r\n0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x13,0x11,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x7b,0xe7,0x01,0x06,0x89,0xaa,0x99,0x84,0x6e,0x5a,0x8a,0x8c,0x58,0x6e,0x96,0xa0,0x02,0x9a,0x03,0x00,0xbf,0x7d,0x29,0x02,0x19,0x9f,\r\n0x68,0x79,0x02,0x8f,0xc9,0x66,0x63,0xfe,0xc7,0xe6,0x71,0x75,0x00,0x03,0x00,0x23,0x02,0x9a,0x02,0xb2,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x20,0x00,0x64,0xb5,0x01,0x11,0x14,0x1a,0x04,0x08,0xb8,0x01,0x0e,0xb4,0x40,0x0b,0x0c,0x07,0x0b,0xb8,0x01,0x0e,0xb2,0x32,0x30,0x1b,0xbe,0x01,0x0e,0x00,0x07,0x01,0x0a,0x00,0x13,0x01,0x0e,\r\n0x00,0x0c,0x01,0x06,0xb4,0x11,0x01,0x03,0x14,0x17,0xb8,0x01,0x0c,0xb5,0x0f,0x0f,0x03,0x00,0x00,0x03,0xb8,0x01,0x0c,0xb7,0x1e,0x1e,0x22,0x14,0x0b,0x1b,0x09,0x07,0x2f,0xc6,0xc1,0x39,0x39,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x10,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x17,0x39,\r\n0x31,0x30,0x01,0x23,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x20,0x15,0x14,0x07,0x33,0x25,0x15,0x33,0x32,0x35,0x34,0x23,0x03,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0xb2,0x6a,0x56,0x97,0x86,0xf1,0x6d,0x6d,0xe7,0x01,0x06,0x48,0x7d,0xfe,0x60,0x5a,0x8a,0x8c,0x58,0x6f,0x95,0x9f,0x03,0xf0,0x28,0x58,0x62,0x74,\r\n0x01,0x56,0x70,0x01,0x3a,0xbf,0x53,0x28,0xc9,0xc9,0x66,0x63,0xfe,0xc7,0xe6,0x6d,0x79,0x00,0x00,0x02,0x00,0x7b,0x02,0x9a,0x03,0x08,0x05,0x9a,0x00,0x07,0x00,0x0f,0x00,0x2d,0x41,0x0a,0x00,0x09,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x0e,0x00,0x01,0x01,0x06,0x00,0x04,0x01,0x0c,0xb3,0x0d,0x0d,0x11,0x09,0xb9,0x01,0x0c,\r\n0x00,0x00,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x11,0x33,0x20,0x11,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x7b,0xf1,0x01,0x9c,0xe2,0xc0,0x68,0x64,0x89,0x96,0xfe,0xe7,0x02,0x9a,0x03,0x00,0xfe,0x87,0xb1,0xd6,0x02,0x8f,0xfd,0xe1,0x90,0x84,0x01,0x0b,0x00,0x00,0x01,0x00,0x7b,\r\n0x02,0x9a,0x02,0x2b,0x05,0x9a,0x00,0x0b,0x00,0x43,0xb9,0x00,0x09,0x01,0x0e,0xb4,0x40,0x06,0x02,0x01,0x06,0xb8,0x01,0x0e,0xb2,0xff,0x30,0x0a,0xbe,0x01,0x0e,0x00,0x01,0x01,0x0a,0x00,0x05,0x01,0x0e,0x00,0x02,0x01,0x06,0xb6,0x04,0x08,0x00,0x00,0x0d,0x06,0x0a,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xc4,0xc4,\r\n0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2b,0xfe,0x50,0x01,0x9f,0xfe,0xe4,0x01,0x08,0xfe,0xf8,0x01,0x2d,0x02,0x9a,0x03,0x00,0x71,0xd7,0x70,0xd8,0x00,0x00,0x01,0x00,0x48,0x02,0x9a,0x01,0xf8,0x05,0x9a,0x00,0x0b,0x00,0x43,0xb9,0x00,\r\n0x04,0x01,0x0e,0xb4,0x40,0x07,0x0b,0x00,0x07,0xb8,0x01,0x0e,0xb2,0xff,0x30,0x03,0x41,0x09,0x01,0x0e,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x0e,0x00,0x0b,0x01,0x06,0x00,0x00,0x01,0x0c,0xb6,0x07,0x03,0x03,0x0d,0x09,0x05,0x01,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,\r\n0x30,0x01,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0xf8,0xfe,0x50,0x01,0x2c,0xfe,0xf8,0x01,0x08,0xfe,0xe4,0x01,0xa0,0x02,0x9a,0x70,0xd8,0x70,0xd7,0x71,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0xcb,0x05,0xaa,0x00,0x19,0x00,0x50,0xb9,0x00,0x17,0x01,0x0e,0xb5,0x18,0x18,0x08,0x15,0x00,0x13,0xba,0x01,0x0e,0x00,\r\n0x02,0x01,0x0b,0xb4,0xaf,0x0b,0x01,0x0b,0x0d,0xba,0x01,0x0e,0x00,0x08,0x01,0x07,0xb6,0x17,0x17,0x16,0x10,0x0b,0x0b,0x19,0xb8,0x01,0x0c,0xb3,0x16,0x16,0x1b,0x10,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xed,0x32,0x32,0x11,0x39,0x2f,0xed,0x31,0x30,\r\n0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x35,0x23,0x35,0x21,0x02,0xcb,0x75,0x96,0xb2,0xd0,0xe7,0xb8,0x77,0x5e,0x62,0x75,0x7a,0x9d,0x8d,0x77,0x49,0x37,0x9c,0x01,0x1f,0x02,0xcb,0x42,0xd0,0xb5,0xb7,0xe5,0x27,0x81,0x38,0xa2,0x82,0x85,0x97,0x1c,0xb2,0x72,\r\n0x00,0x01,0x00,0x7b,0x02,0x9a,0x02,0xea,0x05,0x9a,0x00,0x0b,0x00,0x49,0xb9,0x00,0x03,0x01,0x0e,0xb4,0x40,0x08,0x06,0x05,0x08,0xb8,0x01,0x0e,0xb5,0x32,0x30,0x0b,0x00,0x06,0x05,0xba,0x01,0x0a,0x00,0x06,0x01,0x06,0xb3,0x09,0x08,0x04,0x00,0xbb,0x01,0x0c,0x00,0x01,0x00,0x04,0x01,0x0c,0xb4,0x05,0x01,0x01,0x0d,0x05,0x2f,0x12,\r\n0x39,0x2f,0x10,0xe1,0x10,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x02,0xea,0x84,0xfe,0x98,0x83,0x83,0x01,0x68,0x84,0x02,0x9a,0x01,0x4e,0xfe,0xb2,0x03,0x00,0xfe,0xbe,0x01,0x42,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,\r\n0x00,0xfe,0x05,0x9a,0x00,0x03,0x00,0x16,0xbe,0x00,0x01,0x01,0x0a,0x00,0x02,0x01,0x06,0x00,0x00,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x00,0x3f,0x3f,0x31,0x30,0x13,0x23,0x11,0x33,0xfe,0x83,0x83,0x02,0x9a,0x03,0x00,0x00,0x00,0x01,0x00,0x0a,0x02,0x87,0x01,0x5e,0x05,0x9a,0x00,0x0c,0x00,0x23,0xb1,0x06,0x08,0xbe,0x01,0x0e,0x00,0x03,\r\n0x01,0x0b,0x00,0x0b,0x01,0x06,0x00,0x0c,0x01,0x0c,0xb3,0x0b,0x0b,0x0e,0x06,0x2f,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x01,0x5e,0x82,0x74,0x35,0x29,0x2a,0x2c,0x7b,0x83,0x03,0xaa,0x8a,0x99,0x15,0x78,0x1c,0xb6,0x01,0xec,0x00,0x01,0x00,0x7b,\r\n0x02,0x9a,0x02,0xc0,0x05,0x9a,0x00,0x10,0x00,0x21,0xbb,0x00,0x07,0x01,0x0a,0x00,0x08,0x01,0x06,0xb5,0x0f,0x00,0x12,0x10,0x0a,0x05,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xe1,0x32,0x32,0x10,0xd6,0xc6,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x03,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x13,0x33,0x01,0x02,0xc0,0xa8,0xe9,\r\n0x1f,0x0e,0x04,0x83,0x83,0x04,0x10,0x1d,0xe1,0x9c,0xfe,0xd7,0x02,0x9a,0x01,0x31,0x28,0x1d,0xfe,0x8a,0x03,0x00,0xfe,0x99,0x19,0x26,0x01,0x28,0xfe,0x8d,0x00,0x01,0x00,0x7b,0x02,0x9a,0x02,0x25,0x05,0x9a,0x00,0x05,0x00,0x22,0xbd,0x00,0x04,0x01,0x0e,0x00,0x01,0x01,0x0a,0x00,0x02,0x01,0x06,0xb3,0x00,0x00,0x07,0x04,0xb9,0x01,\r\n0x0c,0x00,0x01,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x21,0x02,0x25,0xfe,0x56,0x83,0x01,0x27,0x02,0x9a,0x03,0x00,0xfd,0x70,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0xb6,0x05,0x9a,0x00,0x1b,0x00,0x27,0xbe,0x00,0x11,0x01,0x0a,0x00,0x13,0x01,0x06,0x00,0x1a,0x00,0x00,0x01,0x0c,0xb4,\r\n0x01,0x01,0x1d,0x13,0x10,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x33,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x03,0xb6,0x83,0x07,0x05,0x07,0x10,0xd6,0x62,0xd8,0x0a,0x0e,0x04,\r\n0x04,0x7b,0xbd,0xc6,0x14,0x08,0x04,0x11,0x0f,0xc2,0xb6,0x02,0x9a,0x01,0xe9,0x3b,0x58,0x20,0x36,0xfd,0xda,0x02,0x20,0x18,0x46,0x40,0x6a,0xfe,0x2c,0x03,0x00,0xfe,0x08,0x32,0x2c,0x3e,0x24,0x01,0xf4,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0x06,0x05,0x9a,0x00,0x11,0x00,0x29,0xbb,0x00,0x08,0x01,0x0a,0x00,0x0a,0x01,0x06,0xb3,\r\n0x0a,0x01,0x07,0x11,0xb8,0x01,0x0c,0xb3,0x10,0x10,0x13,0x07,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x01,0x26,0x27,0x23,0x17,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x27,0x11,0x33,0x03,0x06,0x8d,0xfe,0xb2,0x15,0x1c,0x04,0x02,0x7d,0x93,0x01,0x48,0x15,0x1c,\r\n0x05,0x03,0x7d,0x02,0x9a,0x01,0xfc,0x1f,0x3d,0x6f,0xfe,0x17,0x03,0x00,0xfe,0x0e,0x1f,0x3d,0x6e,0x01,0xe0,0x00,0x00,0x01,0x00,0x7b,0x02,0x9a,0x03,0x06,0x05,0x9a,0x00,0x11,0x00,0x29,0xbb,0x00,0x07,0x01,0x0a,0x00,0x09,0x01,0x06,0xb3,0x10,0x07,0x0a,0x00,0xb8,0x01,0x0c,0xb3,0x01,0x01,0x13,0x0a,0xb9,0x01,0x0c,0x00,0x08,0x2f,\r\n0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x11,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x07,0x33,0x36,0x37,0x01,0x33,0x03,0x06,0x7d,0x03,0x05,0x0d,0x24,0xfe,0xb2,0x8d,0x7d,0x02,0x04,0x0e,0x23,0x01,0x47,0x94,0x02,0x9a,0x01,0xe9,0x6f,0x1e,0x3e,0xfe,0x04,0x03,0x00,0xfe,0x20,0x6e,0x1e,\r\n0x3e,0x01,0xf2,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x03,0x2b,0x05,0xaa,0x00,0x0b,0x00,0x17,0x00,0x2d,0x41,0x0a,0x00,0x12,0x01,0x0e,0x00,0x00,0x01,0x0b,0x00,0x0c,0x01,0x0e,0x00,0x06,0x01,0x07,0x00,0x09,0x01,0x0c,0xb3,0x15,0x15,0x19,0x0f,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,\r\n0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xae,0xa6,0xca,0xd3,0xa9,0xa7,0xca,0xd2,0xa3,0x6c,0x86,0x82,0x6c,0x6c,0x86,0x82,0x02,0x89,0xd9,0xb0,0xb7,0xe1,0xd8,0xb1,0xb5,0xe3,0x02,0xb1,0x9e,0x84,0x83,0x9b,0x9d,0x83,0x83,0x9d,0x00,0x02,\r\n0x00,0x3e,0x02,0x89,0x02,0xcf,0x05,0x9a,0x00,0x1b,0x00,0x27,0x00,0x5c,0xb2,0x12,0x00,0x1c,0xb8,0x01,0x0e,0xb3,0x09,0x09,0x04,0x22,0xbf,0x01,0x0e,0x00,0x17,0x01,0x0b,0x00,0x0e,0x00,0x04,0x01,0x06,0x00,0x0b,0x01,0x0c,0xb6,0x10,0x10,0x14,0x1a,0x05,0x05,0x07,0xb8,0x01,0x0c,0xb5,0x02,0x02,0x12,0x00,0x1a,0x14,0xb8,0x01,0x0c,\r\n0xb3,0x25,0x25,0x29,0x1f,0xb9,0x01,0x0c,0x00,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x39,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x31,0x30,0x13,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x15,0x14,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0xdd,0x75,0x19,0x7d,0x16,0x9d,0x9e,0x15,0x80,0x16,0x73,0x9e,0xba,0x92,0x92,0xb3,0x01,0x47,0x58,0x6d,0x6e,0x57,0x58,0x6f,0x73,0x04,0x7f,0x35,0x75,0x35,0x3c,0x2e,0x37,0x83,0x83,0x3b,0x2a,0x38,0x39,0x70,0x3a,0x3f,0xa2,0x7a,0x9b,0x96,\r\n0x79,0xa0,0x0a,0x59,0x4b,0x4a,0x5a,0x58,0x4c,0x48,0x5c,0x00,0x00,0x02,0x00,0x7b,0x02,0x9a,0x02,0x83,0x05,0x9a,0x00,0x09,0x00,0x10,0x00,0x35,0xb9,0x00,0x00,0x01,0x0e,0xb3,0x0b,0x0b,0x03,0x02,0xbe,0x01,0x0a,0x00,0x0a,0x01,0x0e,0x00,0x03,0x01,0x06,0x00,0x06,0x01,0x0c,0xb4,0x0e,0x0e,0x12,0x0b,0x01,0xb9,0x01,0x0c,0x00,0x02,\r\n0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x11,0x23,0x11,0x33,0x20,0x15,0x14,0x06,0x23,0x03,0x11,0x33,0x32,0x35,0x34,0x23,0xfe,0x83,0xef,0x01,0x19,0xa1,0x86,0x5e,0x54,0xaa,0xa4,0x03,0xa6,0xfe,0xf4,0x03,0x00,0xf2,0x71,0x91,0x01,0x83,0xfe,0xed,0x8e,0x85,0x00,0x02,0x00,0x7b,\r\n0x02,0x9a,0x02,0xa4,0x05,0x9a,0x00,0x11,0x00,0x18,0x00,0x42,0xb1,0x0f,0x05,0xb8,0x01,0x0e,0xb4,0x13,0x13,0x08,0x00,0x07,0xbc,0x01,0x0a,0x00,0x12,0x01,0x0e,0x00,0x08,0x01,0x06,0xb4,0x0f,0x13,0x00,0x00,0x0c,0xb8,0x01,0x0c,0xb4,0x16,0x16,0x1a,0x13,0x06,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,\r\n0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x23,0x27,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x17,0x01,0x15,0x33,0x32,0x35,0x34,0x23,0x02,0xa4,0x96,0x5c,0x2a,0x4a,0x40,0x83,0x01,0x00,0x7f,0x89,0xae,0x37,0x29,0xfe,0xc9,0x68,0x94,0x90,0x02,0x9a,0xd2,0x61,0xfe,\r\n0xcd,0x03,0x00,0x73,0x65,0xa8,0x22,0x02,0x16,0x59,0x01,0xa2,0xeb,0x78,0x73,0x00,0x00,0x01,0x00,0x0a,0x02,0x9a,0x02,0x48,0x05,0x9a,0x00,0x07,0x00,0x2d,0xbe,0x00,0x03,0x01,0x0a,0x00,0x01,0x00,0x04,0x01,0x0e,0x00,0x06,0x01,0x06,0xb4,0x00,0x03,0x05,0x05,0x02,0xb8,0x01,0x0c,0xb3,0x03,0x03,0x09,0x08,0x11,0x12,0x39,0x2f,0xf1,\r\n0xc0,0x2f,0x10,0xc4,0x00,0x3f,0xed,0x32,0x3f,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x02,0x48,0xde,0x82,0xde,0x02,0x3e,0x05,0x29,0xfd,0x71,0x02,0x8f,0x71,0x00,0x00,0x01,0x00,0x74,0x02,0x89,0x02,0xdb,0x05,0x9a,0x00,0x0d,0x00,0x2b,0x41,0x09,0x00,0x09,0x01,0x0e,0x00,0x02,0x01,0x0b,0x00,0x0d,0x00,0x05,0x01,0x06,\r\n0x00,0x0d,0x01,0x0c,0xb3,0x0c,0x0c,0x0f,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x33,0x3f,0xed,0x31,0x30,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x02,0xdb,0xfe,0xc5,0xfe,0xd4,0x84,0xb0,0xb0,0x83,0x03,0xd3,0xfe,0xb6,0x01,0x3f,0x01,0xd2,0xfe,0x35,0xd5,0xd5,0x01,\r\n0xcb,0x00,0x00,0x01,0x00,0x10,0x02,0x9a,0x04,0x25,0x05,0x9a,0x00,0x1b,0x00,0x15,0xbb,0x00,0x0a,0x01,0x0a,0x00,0x0b,0x01,0x06,0xb2,0x00,0x1d,0x0b,0x2f,0x10,0xc6,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,\r\n0x13,0x04,0x25,0xc7,0x9e,0x8f,0x0a,0x02,0x04,0x05,0x0a,0x95,0x9e,0xcf,0x92,0x85,0x09,0x03,0x07,0x02,0x0e,0x9c,0x88,0x8e,0x0a,0x04,0x06,0x02,0x0c,0x82,0x05,0x9a,0xfd,0x00,0x02,0x0e,0x25,0x2d,0x2c,0x24,0xfd,0xf0,0x03,0x00,0xfd,0xdf,0x26,0x2a,0x1f,0x31,0x02,0x21,0xfd,0xda,0x26,0x25,0x19,0x35,0x02,0x23,0x00,0x02,0x00,0x3e,\r\n0x02,0x89,0x02,0x1e,0x04,0xcf,0x00,0x14,0x00,0x1d,0x00,0x61,0x40,0x0c,0x02,0x05,0x16,0x0f,0x30,0x11,0x17,0x48,0x0f,0x0f,0x0d,0x16,0xb8,0x01,0x0d,0xb4,0x40,0x0b,0x12,0x05,0x0b,0xb8,0x01,0x0d,0xb2,0x30,0x30,0x1b,0x41,0x0b,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x0d,0x01,0x0d,0x00,0x12,0x01,0x09,0x00,0x00,\r\n0x01,0x0c,0xb6,0x16,0x0b,0x01,0x01,0x1f,0x0f,0x19,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0xc4,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x12,0x39,0x2f,0x2b,0x11,0x12,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,\r\n0x32,0x15,0x07,0x35,0x07,0x06,0x15,0x14,0x33,0x32,0x36,0x02,0x1e,0x7e,0x02,0x38,0x76,0x53,0x5f,0xc2,0xa0,0x6f,0x64,0x59,0x56,0x76,0xde,0x7e,0x79,0x6d,0x5e,0x3c,0x4c,0x02,0x9a,0x50,0x61,0x59,0x4b,0x9b,0x1c,0x16,0x72,0x3f,0x71,0x31,0xd7,0x81,0x2f,0x10,0x0e,0x4e,0x50,0x4e,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x48,0x04,0xcf,\r\n0x00,0x14,0x00,0x1d,0x00,0x61,0xb9,0x00,0x04,0xff,0xd0,0xb6,0x11,0x17,0x48,0x04,0x04,0x02,0x00,0xb8,0x01,0x0d,0x40,0x0c,0x15,0x5f,0x15,0x01,0x15,0x40,0x18,0x1b,0x48,0x15,0x0f,0x02,0x41,0x09,0x01,0x0d,0x00,0x07,0x01,0x0b,0x00,0x0a,0x01,0x08,0x00,0x1a,0x01,0x0d,0x00,0x0f,0x01,0x09,0xb2,0x04,0x04,0x12,0xb8,0x01,0x0c,0xb5,\r\n0x18,0x18,0x1f,0x15,0x00,0x0b,0xb9,0x01,0x0c,0x00,0x0a,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x11,0x39,0x2b,0x71,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x31,0x30,0x13,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x35,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x37,0x36,0x35,\r\n0x34,0x23,0x22,0x06,0x15,0xe6,0x6e,0x64,0x58,0x54,0x76,0xe0,0x80,0x02,0x37,0x77,0x52,0x60,0xc3,0x9f,0x78,0x6d,0x5f,0x3a,0x4c,0x03,0x5e,0x72,0x3f,0x71,0x31,0xd7,0x01,0x5e,0x50,0x61,0x5c,0x48,0x9b,0x1c,0x3e,0x10,0x0f,0x4d,0x50,0x4e,0x3e,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x60,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x41,\r\n0xb3,0x0e,0x02,0x0b,0x19,0x41,0x0d,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x10,0x01,0x08,0x00,0x15,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x00,0x01,0x0c,0xb5,0x11,0x0e,0x01,0x01,0x1d,0x17,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,\r\n0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0x7e,0x03,0x42,0x76,0x68,0x81,0x8e,0x6e,0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x90,0x8e,0x42,0x52,0x02,0x9a,0x50,0x61,0x97,0x80,0x84,0xab,0x54,0x43,0xfe,0xda,0x2e,0x46,\r\n0x5c,0xc2,0xb6,0x5e,0x00,0x03,0x00,0x48,0x02,0x89,0x03,0xa2,0x04,0xcf,0x00,0x22,0x00,0x2b,0x00,0x30,0x00,0xa9,0x40,0x09,0x1a,0x0a,0x0c,0x18,0x15,0x15,0x13,0x10,0x04,0xb8,0xff,0xd0,0xb6,0x11,0x17,0x48,0x04,0x04,0x02,0x00,0xb8,0x01,0x0d,0x40,0x0d,0x23,0x5f,0x23,0x01,0x23,0x40,0x18,0x1b,0x48,0x23,0x1d,0x02,0x10,0xb8,0x01,\r\n0x0d,0x40,0x0c,0x03,0x2d,0x13,0x2d,0x23,0x2d,0x03,0x2d,0x2d,0x13,0x0c,0x02,0xb8,0x01,0x0d,0xb2,0x07,0x07,0x2f,0xbc,0x01,0x0d,0x00,0x0c,0x01,0x0b,0x00,0x28,0x01,0x0d,0xb3,0x1d,0x1d,0x13,0x18,0xb8,0x01,0x09,0xb5,0x00,0x09,0x1a,0x2c,0x04,0x23,0xb8,0x01,0x0c,0xb6,0x11,0x11,0x20,0x10,0x04,0x04,0x20,0xb8,0x01,0x0c,0xb4,0x26,\r\n0x26,0x32,0x15,0x2d,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x17,0x39,0x00,0x3f,0xcd,0x33,0x10,0xed,0x3f,0xed,0x33,0x10,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x2b,0x71,0x2f,0xed,0x11,0x39,0x2f,0x2b,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x39,0x31,0x30,0x01,\r\n0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x35,0x21,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x37,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x07,0x23,0x16,0x33,0x32,0x02,0x40,0x6e,0x64,0x58,0x54,0x76,0x7e,0x32,0x04,0x48,0x6a,0x72,0x80,0x01,0x78,\r\n0x08,0x9c,0x5c,0x4e,0x4a,0x73,0x97,0x44,0x04,0x43,0x8a,0x58,0x6f,0xc3,0x9f,0x78,0x6d,0x5f,0x3a,0x4c,0x80,0xfe,0x02,0x7a,0x78,0x03,0x5e,0x72,0x3f,0x71,0x31,0x50,0x50,0x93,0x7a,0x43,0x8f,0x35,0x6f,0x2d,0x6b,0x6b,0x5e,0x46,0x9b,0x1c,0x3e,0x10,0x0f,0x4d,0x50,0x4e,0x3e,0x6b,0x8b,0x00,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x89,\r\n0x05,0xc4,0x00,0x10,0x00,0x1b,0x00,0x41,0xb3,0x06,0x01,0x09,0x15,0x41,0x0d,0x01,0x0d,0x00,0x0f,0x01,0x0b,0x00,0x03,0x01,0x0a,0x00,0x19,0x01,0x0d,0x00,0x09,0x01,0x09,0x00,0x04,0x01,0x06,0x00,0x0c,0x01,0x0c,0xb5,0x17,0x17,0x1d,0x12,0x06,0x02,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0x3f,\r\n0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x23,0x15,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x80,0x02,0x42,0x76,0x68,0x81,0x8f,0x6c,0x72,0x36,0x51,0x40,0x91,0x8d,0x43,0x52,0x02,0xdd,0x43,0x03,0x2a,0xfe,0xaa,0x61,\r\n0x97,0x80,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x60,0x05,0xc4,0x00,0x10,0x00,0x1b,0x00,0x41,0xb3,0x0e,0x02,0x0b,0x19,0x41,0x0d,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x15,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x10,0x01,0x06,0x00,0x10,0x01,0x0c,0xb5,0x12,0x02,\r\n0x0f,0x0f,0x1d,0x17,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x11,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0x7e,0x03,0x42,0x76,0x68,\r\n0x81,0x8e,0x6e,0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x92,0x8e,0x42,0x54,0x02,0x9a,0x50,0x61,0x97,0x80,0x84,0xab,0x54,0x01,0x49,0xfd,0xd4,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x35,0x04,0xcf,0x00,0x11,0x00,0x16,0x00,0x4e,0xb3,0x05,0x05,0x03,0x01,0xb8,0x01,0x0d,0x40,0x0b,0x0c,0x16,0x1c,0x16,\r\n0x2c,0x16,0x03,0x16,0x16,0x0e,0x03,0xbe,0x01,0x0d,0x00,0x08,0x01,0x0b,0x00,0x14,0x01,0x0d,0x00,0x0e,0x01,0x09,0xb2,0x05,0x05,0x00,0xb8,0x01,0x0c,0xb4,0x12,0x12,0x18,0x16,0x01,0xb9,0x01,0x0c,0x00,0x0b,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,\r\n0x01,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x07,0x02,0x35,0xfe,0x87,0x0a,0x9a,0x5c,0x4e,0x48,0x78,0x7e,0x8e,0x92,0x72,0x71,0x82,0x7b,0x02,0x78,0x78,0x0c,0x03,0x7f,0x8f,0x35,0x6f,0x2d,0x97,0x88,0x81,0xa6,0x91,0x7c,0x20,0x8a,0x8a,0x00,0x00,0x02,0x00,0x48,\r\n0x02,0x87,0x02,0x40,0x04,0xd1,0x00,0x11,0x00,0x16,0x00,0x4c,0xb3,0x05,0x05,0x03,0x00,0xb8,0x01,0x0d,0x40,0x0b,0x03,0x13,0x13,0x13,0x23,0x13,0x03,0x13,0x13,0x03,0x15,0x41,0x09,0x01,0x0d,0x00,0x0e,0x01,0x0b,0x00,0x03,0x01,0x0d,0x00,0x08,0x01,0x09,0x00,0x0b,0x01,0x0c,0xb5,0x01,0x12,0x12,0x18,0x05,0x13,0xb9,0x01,0x0c,0x00,\r\n0x00,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x33,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,0x13,0x21,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x05,0x23,0x16,0x33,0x32,0x48,0x01,0x78,0x09,0x9b,0x5c,0x4e,0x4a,0x77,0x7c,0x91,0x94,0x70,0x72,0x82,0x01,0x78,\r\n0xfe,0x02,0x7a,0x74,0x03,0xd9,0x91,0x35,0x6f,0x2d,0x99,0x88,0x81,0xa8,0x94,0x7b,0x1f,0x8d,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xdb,0x04,0xcf,0x00,0x1e,0x00,0x5b,0xb1,0x06,0x17,0xb8,0x01,0x0d,0xb4,0x40,0x16,0x0c,0x02,0x16,0xb8,0x01,0x0d,0xb3,0x30,0x30,0x1e,0x1c,0xbf,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0f,0x00,0x11,0x01,\r\n0x0d,0x00,0x0c,0x01,0x09,0x40,0x0b,0x06,0x04,0x17,0x17,0x1a,0x0f,0x00,0x00,0x20,0x04,0x13,0xbc,0x01,0x0c,0x00,0x09,0x00,0x1a,0x01,0x0c,0x00,0x04,0x2f,0xe1,0xd4,0xe1,0x11,0x12,0x39,0x2f,0xc4,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x35,\r\n0x34,0x37,0x35,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x15,0x14,0x33,0x32,0x37,0x01,0xdb,0x49,0x58,0xfc,0x7a,0x66,0x80,0x6e,0x4d,0x40,0x3e,0x49,0x71,0x8b,0x32,0x34,0x9e,0x88,0x55,0x3e,0x02,0xa4,0x1b,0xa4,0x6f,0x1c,0x04,0x20,0x59,0x48,0x52,0x17,0x68,0x1c,0x41,0x47,0x63,\r\n0x4c,0x49,0x1c,0x00,0x00,0x01,0x00,0x42,0x02,0x89,0x01,0xdf,0x04,0xcf,0x00,0x1e,0x00,0x54,0xb1,0x01,0x11,0xb8,0x01,0x0d,0xb5,0x10,0x10,0x16,0x06,0x09,0x0b,0xbf,0x01,0x0d,0x00,0x06,0x01,0x0b,0x00,0x18,0x00,0x16,0x01,0x0d,0x00,0x1b,0x01,0x09,0xb6,0x01,0x1d,0x11,0x11,0x14,0x18,0x0d,0xb8,0x01,0x0c,0xb2,0x03,0x03,0x1d,0xb8,\r\n0x01,0x0c,0xb4,0x14,0x14,0x20,0x09,0x18,0x2f,0xc6,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,\r\n0x36,0x33,0x32,0x15,0x14,0x01,0x64,0x67,0x81,0x6d,0x4d,0x40,0x3e,0x49,0x71,0x8c,0x30,0x32,0x9e,0x87,0x55,0x3e,0x49,0x59,0xfb,0x03,0xa0,0x04,0x1f,0x5a,0x49,0x51,0x17,0x68,0x1c,0x41,0x47,0x63,0x4c,0x49,0x1c,0x64,0x1b,0xa4,0x6f,0x00,0x00,0x02,0x00,0x3e,0x01,0x94,0x02,0x60,0x04,0xcf,0x00,0x18,0x00,0x23,0x00,0x4e,0xb3,0x05,\r\n0x05,0x0d,0x07,0xb8,0x01,0x0d,0xb5,0x02,0x02,0x15,0x0a,0x13,0x21,0x41,0x0b,0x01,0x0d,0x00,0x0d,0x01,0x0b,0x00,0x18,0x01,0x08,0x00,0x1d,0x01,0x0d,0x00,0x13,0x01,0x09,0x00,0x18,0x01,0x0c,0xb5,0x16,0x0a,0x19,0x19,0x25,0x1f,0xb8,0x01,0x0c,0xb1,0x05,0x10,0x2f,0xc4,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x00,0x3f,0xed,0x3f,0x3f,\r\n0xed,0x12,0x39,0x39,0xc4,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x01,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x03,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x36,0x02,0x60,0xfe,0xbe,0x62,0x4a,0x58,0x59,0xbf,0x03,0x42,0x76,0x68,0x81,0x8e,0x6e,\r\n0x70,0x35,0x03,0x7e,0x7e,0x52,0x40,0x90,0x8e,0x42,0x52,0x02,0xbc,0xfe,0xd8,0x22,0x79,0x31,0xbc,0x30,0x61,0x97,0x80,0x84,0xab,0x54,0x43,0xfe,0xda,0x2e,0x46,0x5c,0xc2,0xb6,0x5e,0x00,0x00,0x02,0x00,0x58,0x01,0x94,0x00,0xf6,0x04,0xbe,0x00,0x03,0x00,0x0b,0x00,0x22,0xb4,0x01,0x08,0x40,0x04,0x02,0xb8,0x01,0x08,0xb6,0x01,0x00,\r\n0x06,0x0a,0xff,0x3a,0x00,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xe1,0x2b,0x00,0x18,0x3f,0xd4,0x1a,0xdd,0xce,0x31,0x30,0x13,0x23,0x11,0x33,0x03,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0xe8,0x82,0x82,0x42,0x4e,0x50,0x4e,0x02,0x9a,0x02,0x24,0xfc,0xd6,0x4b,0x4c,0x4c,0x4b,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x56,0x05,0xc4,0x00,0x0c,\r\n0x00,0x2e,0xb5,0x03,0x08,0x0c,0x03,0x05,0x00,0xbc,0x01,0x0a,0x00,0x0b,0x01,0x08,0x00,0x06,0x01,0x07,0xb5,0x0b,0x00,0x0e,0x0c,0x08,0x03,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xe1,0x32,0x32,0x10,0xd6,0xc6,0x00,0x3f,0x3f,0x3f,0x33,0x17,0x39,0x31,0x30,0x01,0x23,0x03,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x37,0x33,0x03,0x02,0x56,0xa0,\r\n0xce,0x02,0x80,0x80,0x02,0xc2,0x9c,0xde,0x02,0x9a,0x01,0x0e,0xfe,0xf2,0x03,0x2a,0xfd,0xfc,0xfe,0xfe,0xfc,0x00,0x00,0x01,0x00,0x66,0x02,0x9a,0x03,0x9a,0x04,0xcf,0x00,0x1d,0x00,0x59,0xb6,0x01,0x09,0x14,0x19,0x04,0x17,0x11,0xba,0x01,0x0a,0x00,0x12,0x01,0x08,0xb2,0x1b,0x04,0x0c,0xbb,0x01,0x0d,0x00,0x40,0x00,0x17,0x01,0x09,\r\n0xb3,0x19,0x08,0x14,0x00,0xb8,0x01,0x0c,0xb7,0x01,0x0e,0x09,0x11,0x09,0x42,0x14,0x10,0xbb,0x01,0x0c,0x00,0x11,0x00,0x08,0x01,0x0c,0xb3,0x09,0x09,0x1f,0x1e,0x11,0x12,0x39,0x2f,0xe1,0x2f,0xe1,0x32,0x2b,0x01,0x10,0xf0,0xe1,0x11,0x12,0x39,0x00,0x18,0x3f,0x1a,0xed,0x39,0x39,0x3f,0x3f,0x12,0x17,0x39,0x31,0x30,0x01,0x23,0x11,\r\n0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x03,0x9a,0x80,0x68,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x02,0x9a,0x01,0x3b,0x8f,0x54,0x3f,0xfe,0xc9,0x01,0x3f,0x8b,0x52,0x45,0xfe,0xcd,0x02,\r\n0x24,0x52,0x63,0x6f,0x6f,0xe3,0x00,0x01,0x00,0x66,0x01,0x98,0x02,0x50,0x04,0xcf,0x00,0x19,0x00,0x40,0xb1,0x05,0x07,0x41,0x0a,0x01,0x0d,0x00,0x02,0x00,0x11,0x01,0x0a,0x00,0x12,0x01,0x08,0x00,0x0c,0x01,0x0d,0x00,0x17,0x01,0x09,0xb3,0x05,0x05,0x10,0x00,0xb8,0x01,0x0c,0xb4,0x09,0x09,0x1b,0x14,0x10,0xb9,0x01,0x0c,0x00,0x11,\r\n0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x3f,0xd4,0xfd,0xc6,0x31,0x30,0x01,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0xd9,0x2b,0x25,0x22,0x23,0x65,0x6d,0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,\r\n0xa6,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x01,0x33,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,0x00,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xcf,0x00,0x0b,0x00,0x17,0x00,0x2d,0x41,0x0a,0x00,0x12,0x01,0x0d,0x00,0x00,0x01,0x0b,0x00,0x0c,0x01,0x0d,0x00,0x06,0x01,0x09,0x00,0x09,0x01,0x0c,0xb3,0x15,0x15,0x19,0x0f,0xb9,\r\n0x01,0x0c,0x00,0x03,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x58,0x80,0x9a,0xa2,0x84,0x80,0x9b,0xa3,0x7e,0x49,0x57,0x58,0x48,0x49,0x57,0x57,0x02,0x89,0x9e,0x7f,0x87,0xa2,\r\n0x9f,0x7e,0x88,0xa1,0x01,0xdb,0x62,0x56,0x56,0x62,0x62,0x56,0x58,0x60,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xec,0x04,0xcf,0x00,0x15,0x00,0x2e,0xb1,0x01,0x03,0x41,0x0a,0x01,0x0d,0x00,0x14,0x01,0x0b,0x00,0x0b,0x00,0x09,0x01,0x0d,0x00,0x0e,0x01,0x09,0x00,0x11,0x01,0x0c,0xb4,0x06,0x06,0x17,0x0b,0x00,0x2f,0x32,0x11,0x39,0x2f,\r\n0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x3e,0x35,0x45,0x52,0x60,0x5a,0x50,0x49,0x39,0x45,0x56,0x7c,0x97,0xa4,0x88,0x50,0x02,0xa2,0x78,0x26,0x62,0x56,0x56,0x62,0x28,0x70,0x23,0x9f,0x80,0x8b,0x9c,0x00,\r\n0x00,0x01,0x00,0x3e,0x03,0xac,0x02,0x7f,0x04,0xcf,0x00,0x0d,0x00,0x26,0xb2,0x01,0x07,0x04,0xbc,0x01,0x0d,0x00,0x0b,0x01,0x09,0x00,0x00,0x01,0x0c,0xb3,0x01,0x01,0x0f,0x07,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,0x32,0x31,0x30,0x01,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,\r\n0x32,0x16,0x02,0x7f,0x81,0x57,0x49,0x49,0x57,0x80,0xa5,0x81,0x82,0x99,0x03,0xac,0x58,0x60,0x62,0x56,0x84,0x9f,0xa1,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0x7f,0x03,0xac,0x00,0x0d,0x00,0x26,0xb2,0x00,0x06,0x0a,0xbc,0x01,0x0d,0x00,0x03,0x01,0x0b,0x00,0x00,0x01,0x0c,0xb3,0x0d,0x0d,0x0f,0x07,0xb9,0x01,0x0c,0x00,0x06,0x2f,\r\n0xe1,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc4,0x32,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x02,0x7f,0xa5,0x82,0x80,0x9a,0x80,0x58,0x48,0x49,0x57,0x03,0xac,0x84,0x9f,0xa0,0x83,0x56,0x62,0x62,0x56,0x00,0x00,0x02,0x00,0x66,0x01,0xa4,0x02,0x89,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x3e,\r\n0xb4,0x03,0x06,0x00,0x09,0x15,0x41,0x0b,0x01,0x0d,0x00,0x0f,0x01,0x0b,0x00,0x04,0x01,0x08,0x00,0x19,0x01,0x0d,0x00,0x09,0x01,0x09,0x00,0x0c,0x01,0x0c,0xb5,0x17,0x17,0x1d,0x11,0x01,0x05,0xb9,0x01,0x0c,0x00,0x04,0x2f,0xe1,0x32,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,0x39,0xc4,0x31,0x30,0x13,0x23,\r\n0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x80,0x02,0x42,0x76,0x68,0x81,0x8f,0x6c,0x72,0x36,0x51,0x40,0x91,0x8d,0x43,0x52,0x02,0xdd,0xfe,0xc7,0x03,0x1a,0x50,0x61,0x97,0x80,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,\r\n0x60,0x00,0x00,0x01,0x00,0x0a,0x02,0x8e,0x01,0x68,0x05,0x62,0x00,0x13,0x00,0x45,0xb1,0x13,0x11,0xba,0x01,0x0d,0x00,0x02,0x01,0x0b,0xb4,0x0a,0x0b,0x0e,0x0b,0x05,0xba,0x01,0x0d,0x00,0x08,0x01,0x08,0xb7,0x0d,0x13,0x13,0x15,0x05,0x0e,0x05,0x0b,0xb8,0x01,0x0c,0x40,0x09,0x07,0x10,0x08,0x20,0x08,0x30,0x08,0x03,0x08,0x2f,0x5d,\r\n0xcd,0xe1,0x39,0x39,0x11,0x12,0x39,0x2f,0xc4,0x00,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x15,0x14,0x33,0x32,0x37,0x01,0x68,0x22,0x40,0xa0,0x5c,0x5c,0x80,0x82,0x82,0x49,0x1e,0x1b,0x02,0xa0,0x12,0xbe,0x01,0x08,0x6a,0x80,0x24,0xa4,\r\n0x6a,0xfe,0x5e,0x10,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x46,0x04,0xbe,0x00,0x11,0x00,0x36,0xb3,0x11,0x02,0x08,0x0c,0x41,0x0a,0x01,0x0d,0x00,0x05,0x01,0x0b,0x00,0x00,0x01,0x0a,0x00,0x08,0x01,0x08,0x00,0x02,0x00,0x11,0x01,0x0c,0xb3,0x10,0x10,0x13,0x09,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xc4,0x00,0x3f,\r\n0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x46,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x80,0x02,0x9a,0x56,0x67,0xe7,0x01,0x4e,0xfe,0xce,0x98,0x53,0x40,0x01,0x37,0x00,0x01,0x00,0x3e,0x02,0xb8,0x02,0x72,0x04,0xa2,0x00,0x12,\r\n0x00,0x2e,0x40,0x15,0x00,0x0e,0x40,0x01,0x09,0x0d,0x08,0x09,0x08,0x42,0x08,0x09,0x0c,0x00,0x09,0x0a,0x0f,0x04,0x04,0x14,0x09,0x2f,0x12,0x39,0x2f,0xdd,0xc4,0x12,0x39,0x39,0x00,0x2f,0xcd,0x2b,0x00,0x18,0x10,0xc4,0x10,0xd6,0x1a,0xed,0x31,0x30,0x13,0x35,0x21,0x32,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x15,0x23,0x15,0x16,0x15,\r\n0x14,0x06,0x23,0x3e,0x01,0x32,0x98,0x54,0x40,0xfe,0xca,0x02,0x24,0x4c,0x5c,0x7c,0x6a,0x02,0xb8,0x80,0x6c,0x38,0x47,0x7f,0x7f,0x02,0x3f,0x69,0x58,0x69,0x00,0x01,0x00,0x60,0x02,0x89,0x03,0x94,0x04,0xbe,0x00,0x1d,0x00,0x67,0x40,0x09,0x02,0x07,0x14,0x1d,0x04,0x0c,0x18,0x05,0x10,0xbf,0x01,0x0d,0x00,0x40,0x00,0x09,0x01,0x0b,\r\n0x00,0x00,0x01,0x0a,0x00,0x0c,0x01,0x08,0xb4,0x07,0x14,0x02,0x02,0x1d,0xb8,0x01,0x0c,0xb6,0x1c,0x0e,0x14,0x0c,0x14,0x42,0x0d,0xb8,0x01,0x0c,0xb6,0x00,0x0c,0x01,0x0b,0x03,0x0c,0x15,0xb8,0x01,0x0c,0xb3,0x14,0x1e,0x1f,0x14,0xb8,0x01,0x0c,0xb1,0x08,0x30,0x2b,0x01,0x10,0xe1,0x18,0x2f,0x5f,0x5e,0x5d,0xe1,0x2b,0x01,0x10,0xf0,\r\n0xe1,0xc1,0x18,0x2f,0x12,0x39,0x00,0x3f,0x3f,0x3f,0x1a,0xed,0x39,0x39,0x12,0x17,0x39,0x31,0x30,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0x94,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x7f,0x69,0x31,0x41,\r\n0x80,0x68,0x32,0x40,0x80,0x02,0x9a,0x52,0x63,0x6f,0x6f,0xe3,0x01,0x52,0xfe,0xc5,0x8f,0x54,0x3f,0x01,0x37,0xfe,0xc1,0x8b,0x52,0x46,0x01,0x32,0x00,0x01,0x00,0x0a,0x02,0x9a,0x02,0x35,0x04,0xbe,0x00,0x0b,0x00,0x1b,0xb3,0x07,0x00,0x03,0x02,0xba,0x01,0x0a,0x00,0x03,0x01,0x08,0xb2,0x00,0x0d,0x03,0x2f,0x10,0xc6,0x00,0x3f,0x3f,\r\n0x12,0x39,0x39,0x31,0x30,0x01,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x02,0x35,0xc9,0x9b,0xc7,0x8a,0x78,0x0f,0x03,0x05,0x04,0x11,0x78,0x04,0xbe,0xfd,0xdc,0x02,0x24,0xfe,0x8e,0x2f,0x25,0x22,0x32,0x01,0x72,0x00,0x01,0x00,0x14,0x02,0x89,0x02,0x79,0x04,0xcf,0x00,0x1b,0x00,0x4a,0x40,0x0b,0x17,0x0d,0x0b,0x04,\r\n0x06,0x12,0x1b,0x09,0x19,0x02,0x0b,0xbd,0x01,0x0d,0x00,0x40,0x00,0x06,0x01,0x0b,0x00,0x12,0x01,0x09,0x40,0x10,0x04,0x0d,0x17,0x03,0x0f,0x1b,0x0e,0x15,0x15,0x1d,0x0f,0x08,0x0f,0x42,0x08,0x0f,0x2f,0x2f,0x2b,0x11,0x12,0x01,0x39,0x18,0x2f,0xe2,0x12,0x17,0x39,0x00,0x3f,0x3f,0x1a,0xfd,0x39,0x39,0xd6,0xc4,0x11,0x12,0x39,0x12,\r\n0x39,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x02,0x79,0x3c,0x49,0x60,0x4e,0x4f,0x5b,0x46,0x42,0x43,0x3f,0x36,0x28,0x77,0x6e,0x5d,0x5c,0x6c,0x78,0x2a,0x36,0x41,0x40,0x02,0xb4,0x2b,0x3b,0x3b,0x2b,0x79,0x39,\r\n0x20,0x6b,0x85,0x57,0x74,0x71,0x56,0x84,0x6e,0x22,0x37,0x00,0x00,0x02,0x00,0x60,0x01,0xa4,0x02,0x74,0x05,0xc4,0x00,0x12,0x00,0x25,0x00,0x63,0xb3,0x02,0x11,0x0c,0x13,0xb8,0x01,0x0d,0xb4,0x40,0x14,0x06,0x11,0x14,0xb8,0x01,0x0d,0xb3,0x1e,0x30,0x1d,0x1f,0xbe,0x01,0x0d,0x00,0x11,0x01,0x0b,0x00,0x1a,0x01,0x0d,0x00,0x06,0x01,\r\n0x07,0xb6,0x0c,0x0e,0x13,0x13,0x22,0x1d,0x18,0xb8,0x01,0x0c,0xb2,0x09,0x09,0x0e,0xb8,0x01,0x0c,0xb4,0x22,0x22,0x27,0x1d,0x01,0xb9,0x01,0x0c,0x00,0x02,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0xe1,0x11,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0xfd,0xc6,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x39,0x10,0xc4,0x31,0x30,0x13,\r\n0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x15,0x11,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xdf,0x7f,0x8c,0x74,0x70,0x86,0x7f,0x9d,0x93,0x79,0x4a,0x09,0x1d,0x42,0x51,0x79,0x7f,0x3b,0x46,0x42,0x52,0x60,0x50,0x02,0xa6,0xfe,0xfe,\r\n0x03,0x14,0x7a,0x92,0x7c,0x5c,0x81,0x2f,0x04,0x2e,0x93,0x67,0x87,0x01,0x77,0x62,0x46,0x3a,0x7c,0xa2,0xfe,0x5a,0x22,0x46,0x3a,0x40,0x4c,0x00,0x00,0x01,0xff,0xec,0x01,0xa4,0x02,0x23,0x04,0xbe,0x00,0x13,0x00,0x36,0xb4,0x03,0x0a,0x05,0x07,0x00,0xbb,0x01,0x0a,0x00,0x10,0x00,0x07,0x01,0x08,0xb6,0x0a,0x00,0x05,0x07,0x07,0x00,\r\n0x0d,0xbc,0x01,0x0c,0x00,0x12,0x00,0x00,0x01,0x0c,0x00,0x05,0x2f,0xe1,0xd4,0xe1,0x10,0xc1,0x2f,0x11,0x12,0x39,0x00,0x3f,0x33,0x3f,0x11,0x39,0x39,0xcd,0x31,0x30,0x01,0x14,0x07,0x23,0x36,0x35,0x02,0x03,0x33,0x16,0x17,0x33,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x01,0x50,0x02,0x88,0x0b,0x48,0x9d,0x91,0x75,0x39,0x04,0x75,\r\n0x06,0x80,0x05,0x02,0x83,0xb3,0x2c,0x6e,0x94,0x01,0x06,0x01,0x12,0xda,0xc8,0xa5,0xb1,0x2a,0x22,0x20,0x21,0xe8,0x00,0x02,0x00,0x3e,0x02,0x89,0x02,0x7f,0x05,0xc4,0x00,0x17,0x00,0x21,0x00,0x4c,0x40,0x09,0x00,0x02,0x0d,0x10,0x18,0x1f,0x06,0x05,0x1d,0xbf,0x01,0x0d,0x00,0x13,0x01,0x0b,0x00,0x08,0x00,0x0a,0x01,0x0d,0x00,0x05,\r\n0x01,0x07,0xb3,0x08,0x08,0x10,0x0c,0xb8,0x01,0x0c,0xb2,0x02,0x16,0x10,0xb8,0x01,0x0c,0xb3,0x1f,0x1f,0x23,0x1a,0xb9,0x01,0x0c,0x00,0x16,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x10,0xd4,0xe1,0x10,0xc0,0x2f,0x00,0x3f,0xfd,0xc6,0x3f,0xed,0x12,0x17,0x39,0x31,0x30,0x13,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,\r\n0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x25,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0xee,0x4a,0x72,0x63,0x5f,0x60,0x5e,0x5b,0x5a,0x8f,0xcb,0xa2,0x83,0x81,0x9b,0x01,0x08,0x88,0x56,0x4a,0xa0,0x48,0x04,0xa0,0x37,0x4e,0x45,0x5a,0x2a,0x75,0x39,0x3b,0x25,0x58,0x7c,0x9c,0x72,0x93,0x8f,0x6f,0xa0,0x3b,0x54,0x80,\r\n0x48,0x52,0x9a,0x36,0x5d,0x00,0x00,0x02,0x00,0x3e,0x01,0xa4,0x03,0x06,0x04,0xcf,0x00,0x15,0x00,0x1d,0x00,0x61,0xb3,0x02,0x1c,0x00,0x0d,0x41,0x0a,0x01,0x0d,0x00,0x03,0x01,0x0b,0x00,0x09,0x01,0x08,0x00,0x19,0x01,0x0d,0x00,0x40,0x00,0x10,0x01,0x09,0xb4,0x09,0x09,0x0d,0x0b,0x16,0xb8,0x01,0x0c,0xb6,0x13,0x0e,0x01,0x06,0x02,\r\n0x42,0x0b,0xb8,0x01,0x0c,0xb3,0x06,0x1c,0x0d,0x01,0xb8,0x01,0x0c,0xb3,0x02,0x1e,0x1f,0x02,0xb8,0x01,0x0c,0xb1,0x08,0x30,0x2b,0x01,0x10,0xe1,0x39,0x39,0x18,0x2f,0xe1,0x2b,0x01,0x10,0xf0,0xe1,0x11,0x12,0x39,0x18,0x2f,0x00,0x3f,0x1a,0xed,0x3f,0x3f,0xed,0x39,0x39,0xcd,0x31,0x30,0x01,0x15,0x23,0x35,0x26,0x26,0x35,0x34,0x37,\r\n0x33,0x06,0x15,0x14,0x17,0x11,0x34,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x34,0x26,0x23,0x22,0x15,0x11,0x36,0x01,0xe2,0x80,0x8a,0x9a,0x56,0x86,0x5e,0xa6,0xba,0x68,0x82,0x9e,0x1f,0x3e,0x2f,0x38,0xa5,0x02,0x89,0xe5,0xe5,0x05,0x9c,0x86,0x8a,0x84,0x78,0x90,0xbc,0x06,0x01,0x24,0xb7,0x9b,0x82,0x84,0x9e,0x01,0x1e,0x54,0x62,0x48,\r\n0xfe,0xd8,0x08,0x00,0x00,0x01,0xff,0xf6,0x01,0x94,0x02,0x62,0x04,0xcf,0x00,0x1c,0x00,0x3c,0x40,0x0b,0x06,0x09,0x14,0x17,0x04,0x08,0x16,0x0e,0x0c,0x1c,0x1a,0xb8,0x01,0x0d,0xb3,0x02,0x08,0x11,0x16,0xbc,0x01,0x08,0x00,0x0c,0x01,0x0d,0x00,0x11,0x01,0x09,0xb4,0x16,0x00,0x1e,0x0e,0x08,0x2f,0xc6,0x10,0xd4,0xc4,0x00,0x3f,0xed,\r\n0x3f,0x10,0xd4,0xd4,0xfd,0xc6,0x10,0xc6,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x27,0x27,0x03,0x23,0x13,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x17,0x37,0x33,0x03,0x17,0x16,0x33,0x32,0x37,0x02,0x62,0x20,0x21,0x41,0x4c,0x28,0x47,0xa0,0x8f,0xf0,0x4e,0x29,0x2b,0x13,0x1b,0x1c,0x28,0x6a,0x34,0x3d,\r\n0x7d,0x8c,0xca,0x67,0x2f,0x2e,0x17,0x13,0x01,0x9e,0x0a,0x44,0x5b,0xa8,0xfe,0xc9,0x01,0xb4,0xb0,0x5c,0x0a,0x6c,0x09,0x7b,0x92,0xfc,0xfe,0x8e,0xe6,0x68,0x08,0x00,0xff,0xff,0x00,0x58,0xff,0x42,0x00,0xf6,0x02,0x6c,0x00,0x07,0x07,0xce,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x66,0xff,0x42,0x01,0xa8,0x01,0x70,0x00,0x07,0x06,0x79,\r\n0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x5c,0xff,0x31,0x02,0x46,0x01,0x66,0x00,0x07,0x07,0xba,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x0a,0xff,0x42,0x02,0x35,0x01,0x66,0x00,0x07,0x07,0xbd,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x60,0xfe,0x4c,0x02,0x74,0x02,0x6c,0x00,0x07,0x07,0xbf,0x00,0x00,0xfc,0xa8,0xff,0xff,0xff,0xec,0xfe,0x4c,\r\n0x02,0x23,0x01,0x66,0x00,0x07,0x07,0xc0,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x66,0xfe,0x4c,0x02,0x89,0x01,0x77,0x00,0x07,0x07,0xcf,0x00,0x00,0xfc,0xa8,0xff,0xff,0x00,0x3e,0xfe,0x4c,0x03,0x06,0x01,0x77,0x00,0x07,0x07,0xc2,0x00,0x00,0xfc,0xa8,0xff,0xff,0xff,0xf6,0xfe,0x3c,0x02,0x62,0x01,0x77,0x00,0x07,0x07,0xc3,0x00,0x00,\r\n0xfc,0xa8,0x00,0x01,0x00,0xfc,0x04,0xc2,0x03,0xc4,0x05,0xf2,0x00,0x0c,0x00,0x16,0x40,0x09,0x00,0x07,0x09,0xf2,0x03,0x00,0x0c,0x07,0x06,0x2f,0xcd,0xd4,0xcd,0x00,0x2f,0xfd,0xd6,0xc4,0x31,0x30,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x03,0xc4,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,\r\n0x0c,0x05,0xf2,0x8d,0xa3,0xa3,0x8d,0xbc,0x63,0x59,0x00,0x02,0x00,0x58,0x02,0x9a,0x00,0xf6,0x05,0xc4,0x00,0x07,0x00,0x0b,0x00,0x25,0xb3,0x04,0x00,0x40,0x0a,0xba,0x01,0x08,0x00,0x09,0x01,0x0a,0xb6,0x09,0x08,0x02,0x06,0xff,0x3a,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xe1,0x2b,0x00,0x18,0x3f,0x3f,0x1a,0xde,0xcd,0x31,0x30,0x13,\r\n0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x03,0x23,0x11,0x33,0xa6,0x4e,0x50,0x4e,0x0e,0x82,0x82,0x05,0x2d,0x4c,0x4b,0x4b,0x4c,0xfd,0x6d,0x02,0x24,0x00,0x02,0x00,0x66,0x01,0xa4,0x02,0x89,0x04,0xcf,0x00,0x0e,0x00,0x19,0x00,0x31,0xb1,0x02,0x13,0x41,0x09,0x01,0x0d,0x00,0x0d,0x01,0x0b,0x00,0x17,0x01,0x0d,0x00,0x07,0x01,0x09,0x00,\r\n0x0a,0x01,0x0c,0xb4,0x15,0x15,0x1b,0x0f,0x02,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xed,0x3f,0xed,0xc6,0x31,0x30,0x13,0x23,0x11,0x23,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0xe8,0x02,0x80,0x9a,0x7d,0x7a,0x92,0x8f,0x6c,\r\n0x72,0x36,0x51,0x40,0x91,0x91,0x40,0x51,0x02,0xdd,0xfe,0xc7,0x02,0x00,0x8b,0xa0,0x9a,0x7d,0x84,0xab,0x01,0x37,0x2e,0x46,0x5c,0xc2,0xb6,0x60,0x00,0x01,0x00,0x42,0x00,0x00,0x03,0xc1,0x05,0xba,0x00,0x06,0x00,0x33,0x40,0x1c,0x9d,0x02,0x01,0x5b,0x02,0x6b,0x02,0x7b,0x02,0x03,0x49,0x02,0x01,0x38,0x02,0x01,0x05,0x02,0x06,0x08,\r\n0x03,0x04,0x04,0x03,0x03,0x02,0x06,0x00,0x00,0x2f,0x2f,0x33,0x39,0x2f,0x33,0x01,0x2f,0x33,0x10,0xde,0xdd,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x01,0x27,0x01,0x33,0x03,0xc1,0x9c,0xfd,0x71,0x54,0x02,0xe3,0x9c,0x05,0x00,0xfd,0x8f,0x6a,0x02,0xc1,0x00,0x02,0x00,0x8f,0xff,0xe7,0x06,0xb2,0x04,0x19,0x00,0x20,\r\n0x00,0x27,0x00,0xe1,0x40,0x34,0x69,0x23,0x79,0x23,0x02,0xe6,0x1e,0xf6,0x1e,0x02,0x55,0x14,0x65,0x14,0x02,0xaa,0x0f,0x01,0xcf,0x26,0xdf,0x26,0x02,0x9b,0x26,0xfb,0x26,0x02,0x24,0x26,0x34,0x26,0x02,0x05,0x17,0x01,0x7e,0x0f,0x8e,0x0f,0x9e,0x0f,0x03,0x09,0x0f,0x19,0x0f,0x02,0x5b,0x0a,0x01,0x02,0xb8,0xff,0xe8,0x40,0x0e,0x13,\r\n0x16,0x48,0x24,0x02,0x34,0x02,0x44,0x02,0x03,0xe2,0x1b,0x01,0x1b,0xb8,0xff,0xe0,0xb3,0x19,0x1c,0x48,0x1b,0xb8,0xff,0xe0,0x40,0x51,0x0b,0x0e,0x48,0xcb,0x0b,0x01,0x5b,0x0b,0x01,0x1b,0x0b,0x1d,0x0e,0x27,0x95,0xe0,0x01,0xf0,0x01,0x02,0x01,0x01,0x09,0x24,0x95,0x1d,0x10,0x19,0x11,0x0f,0x07,0xec,0x00,0x06,0x10,0x06,0x02,0x06,\r\n0x04,0x95,0x09,0x16,0x15,0x95,0x0e,0x16,0x27,0x01,0x0b,0x03,0x1a,0x84,0x5f,0x19,0x7f,0x19,0x02,0x20,0x19,0xa0,0x19,0x02,0x19,0x19,0x11,0x06,0x40,0x0f,0x12,0x48,0x06,0x21,0x83,0x00,0x29,0x12,0x84,0x00,0x11,0x01,0x11,0x2f,0x5d,0xe1,0x10,0xde,0xe1,0xc6,0x2b,0x12,0x39,0x2f,0x5d,0x5d,0xe1,0x17,0x39,0x00,0x3f,0xed,0x3f,0xfd,\r\n0xd6,0x5d,0xed,0x3f,0xc4,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x11,0x12,0x39,0x39,0x5d,0x5d,0x2b,0x2b,0x5d,0x31,0x30,0x5d,0x2b,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x27,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,\r\n0x15,0x36,0x33,0x32,0x12,0x15,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0xb2,0xfd,0x2f,0x05,0xae,0x99,0xac,0x91,0x8a,0xc7,0xfe,0xd9,0x71,0x2a,0xba,0x8d,0xfe,0x7f,0xa4,0xfe,0x7c,0x90,0xa4,0x7d,0xbb,0xc2,0xd7,0xa8,0x02,0x86,0x78,0x71,0xa3,0x15,0x01,0xd7,0xae,0xb6,0x70,0x99,0x63,0xea,0x66,0x84,0x01,0xb5,0x02,0x64,0xfd,0xb6,\r\n0xfe,0xbd,0xb3,0x94,0x02,0x46,0x7b,0x94,0xfe,0xf8,0xe4,0x35,0x91,0x9a,0xa0,0x8b,0x00,0x01,0x00,0x74,0x00,0x00,0x04,0x8b,0x05,0xb4,0x00,0x27,0x00,0x57,0x40,0x2e,0x1d,0x91,0x02,0x02,0x1e,0x00,0x25,0x92,0x40,0x22,0x1e,0x00,0x22,0x92,0x28,0x30,0x21,0x92,0x1e,0x1e,0x0c,0x27,0x92,0x00,0x10,0x13,0x92,0x0c,0x04,0x0f,0x0f,0x1d,\r\n0x22,0x26,0x7e,0x01,0x01,0x07,0x24,0x20,0x00,0x00,0x29,0x18,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xc4,0xc4,0x12,0x39,0x2f,0xf1,0x32,0x33,0xc0,0x2f,0x31,0x00,0x3f,0xfd,0xc6,0x2f,0xed,0x12,0x39,0x2f,0xed,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x11,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,\r\n0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x04,0x8b,0xfd,0xb6,0x6b,0xab,0x77,0x40,0x49,0x8a,0xc5,0x7c,0x44,0x7d,0x34,0x39,0x80,0x42,0x55,0x86,0x5b,0x30,0x24,0x49,0x6e,0x4a,0x02,0x33,0xfe,0x6f,0x01,0x74,0xfe,0x8c,0x01,0xa8,0x01,0x7e,0x03,0x54,\r\n0x8d,0xb9,0x69,0x7a,0xce,0x95,0x53,0x19,0x19,0xac,0x28,0x26,0x3f,0x6d,0x93,0x53,0x4c,0x81,0x63,0x3f,0x0b,0x01,0xe8,0x8c,0xfe,0xd4,0x8c,0xfe,0xd0,0x00,0x00,0x03,0x00,0x76,0xff,0xb5,0x04,0x18,0x06,0x3d,0x00,0x2e,0x00,0x36,0x00,0x40,0x00,0x97,0x40,0x1d,0x23,0x1e,0x1b,0x1d,0x20,0x22,0x25,0x04,0x1b,0x0e,0x31,0x3b,0x3e,0x04,\r\n0x3f,0x15,0x01,0x15,0x10,0x92,0x1b,0x13,0x04,0x07,0x0a,0x2d,0x04,0x01,0x0b,0xb8,0xff,0xc0,0x40,0x3c,0x0c,0x0f,0x48,0x0b,0x37,0x0d,0x32,0x3a,0x3f,0x04,0x37,0x05,0x2e,0x37,0x92,0x01,0x32,0x3a,0x3f,0x0d,0x04,0x0b,0x31,0x3b,0x3e,0x0e,0x04,0x16,0x2f,0x2d,0x01,0x04,0x07,0x04,0x0b,0x25,0x22,0x20,0x1d,0x04,0x16,0x28,0x05,0x06,\r\n0x1e,0x03,0x1f,0x00,0x23,0x2e,0x03,0x24,0x28,0x0b,0x16,0x16,0x42,0x2f,0x7d,0x28,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x10,0xd4,0x17,0x32,0xc4,0x17,0x32,0x11,0x12,0x17,0x39,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x12,0x17,0x39,0x31,0x00,0x2f,0xed,0xcd,0x32,0x11,0x17,0x33,0x10,0xc4,0x2b,0x11,0x17,0x33,0x3f,0xfd,0xc6,0x5d,0x17,0x33,\r\n0x11,0x17,0x33,0x10,0xce,0x32,0x30,0x01,0x07,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x13,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x37,0x01,0x14,0x17,0x01,0x0e,0x03,0x01,0x22,0x06,0x07,0x01,0x16,0x16,\r\n0x17,0x01,0x26,0x03,0x36,0x2b,0x1a,0x2f,0x16,0x2b,0x73,0x31,0x10,0x20,0x11,0x3c,0x30,0xfe,0xa3,0x42,0x52,0x2f,0x4e,0x49,0x48,0x27,0x26,0x4a,0x50,0x57,0x34,0x5a,0x50,0x17,0x71,0x23,0x2a,0x27,0x33,0x71,0x4d,0x4c,0x54,0x52,0x91,0xc7,0x76,0x2d,0xfe,0x63,0x34,0x01,0x0b,0x48,0x76,0x54,0x2d,0x01,0xdf,0x0a,0x12,0x09,0xfe,0xc4,\r\n0x11,0x25,0x14,0x01,0x52,0x1c,0x06,0x3d,0x8b,0x02,0x02,0x8f,0xa2,0x04,0x0a,0x05,0xa5,0x1b,0x10,0xfb,0x82,0x1c,0x0a,0x14,0x1e,0x14,0x96,0x11,0x1a,0x12,0x09,0x18,0x4b,0x74,0x18,0x1e,0xaa,0x01,0x00,0x5e,0x01,0x00,0x9f,0x9a,0x01,0x03,0xc5,0x7f,0x15,0x95,0xfc,0x7f,0xa6,0x80,0x03,0x71,0x1d,0x6d,0x98,0xbd,0x01,0xfe,0x01,0x01,\r\n0xfb,0xf0,0x16,0x25,0x11,0x04,0x5b,0x03,0x00,0x01,0x00,0x76,0xff,0xe8,0x04,0x18,0x05,0xb2,0x00,0x3e,0x00,0x5e,0x40,0x16,0x38,0x37,0x3b,0x00,0x02,0x95,0x3b,0x35,0x35,0x1f,0x15,0x34,0x07,0x3f,0x0f,0x01,0x0f,0x0a,0x92,0x15,0x13,0x25,0xb8,0xff,0xc0,0x40,0x0c,0x0c,0x0f,0x48,0x25,0x2a,0x92,0x1f,0x04,0x38,0x00,0x37,0x07,0xb8,\r\n0x01,0x2e,0x40,0x0b,0x34,0x34,0x1a,0x00,0x25,0x10,0x10,0x40,0x2f,0x7d,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0x12,0x39,0x2f,0xe1,0x32,0x12,0x39,0x00,0x3f,0xfd,0xc6,0x2b,0x3f,0xfd,0xc6,0x5d,0x33,0x33,0x11,0x12,0x39,0x2f,0xd4,0xfd,0xc6,0x11,0x33,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x16,0x32,0x33,0x32,\r\n0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x04,0x18,0x27,0x48,0x5f,0x3f,0x3f,0x05,0x0c,0x06,0x2f,0x4e,0x49,0x48,0x27,0x26,0x4a,0x50,0x57,0x34,0x83,\r\n0xdc,0x9f,0x59,0x65,0xb1,0xf0,0x8b,0x2c,0x47,0x40,0x3d,0x21,0x27,0x42,0x40,0x43,0x27,0x69,0xaf,0x80,0x47,0x27,0x48,0x66,0x3f,0x92,0x04,0x20,0x80,0x50,0x1d,0x2b,0x10,0x03,0x1c,0x1e,0x59,0x58,0x9a,0xfe,0x86,0x01,0x0a,0x14,0x1e,0x14,0x96,0x11,0x1a,0x12,0x09,0x66,0xba,0x01,0x08,0xa2,0xac,0x01,0x1b,0xca,0x6f,0x05,0x0a,0x10,\r\n0x0b,0xa5,0x12,0x19,0x10,0x08,0x5b,0xa3,0xe3,0x89,0x63,0xae,0x8c,0x68,0x1e,0x03,0x18,0xbd,0x61,0x6c,0x07,0x06,0x00,0x01,0x00,0xa6,0xff,0x12,0x06,0x54,0x05,0x0c,0x00,0x2e,0x00,0x8c,0x40,0x48,0x10,0x13,0x16,0x03,0x12,0x26,0x2e,0x01,0x15,0x12,0x06,0x20,0x2d,0x2b,0x0f,0x0c,0x95,0x01,0x24,0x23,0x19,0x95,0x01,0x26,0x10,0x21,\r\n0x0f,0x2d,0x16,0x15,0x2e,0x15,0x2d,0x16,0x2e,0x15,0x13,0x10,0x0f,0x01,0x14,0x00,0x01,0x0f,0x10,0x13,0x04,0x14,0x2e,0x00,0x00,0x06,0x14,0x15,0x20,0x2b,0x2b,0x17,0x11,0x84,0x12,0x12,0x20,0x06,0x84,0x05,0x05,0x30,0x23,0x1f,0x84,0x20,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xf1,0x33,0xc1,0x2f,0x10,0xc6,0x32,0x10,\r\n0xc0,0x2f,0x32,0x12,0x00,0x17,0x39,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x11,0x12,0x00,0x39,0x39,0x10,0x87,0x05,0xc0,0xc0,0x31,0x00,0x3f,0x3f,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x33,0x33,0x2f,0x33,0x33,0xc6,0x10,0xcd,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x33,0x20,0x11,0x11,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x03,\r\n0x11,0x23,0x35,0x03,0x23,0x01,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x37,0x13,0x05,0x85,0x87,0x04,0x01,0x52,0xa4,0x11,0x32,0x5a,0x48,0x07,0x0d,0x07,0xe1,0xa4,0xf5,0x99,0x01,0x8e,0xe9,0x3f,0x5e,0x3d,0x1e,0xa4,0xa4,0x04,0x6e,0xd0,0x32,0x5d,0x4d,0x38,0x0e,0x3e,\r\n0x5f,0x9f,0x05,0x0c,0xf4,0xfe,0x5f,0xfd,0x89,0x02,0x4c,0x46,0x76,0x56,0x30,0x01,0x01,0xfe,0x69,0xfe,0x0b,0xcc,0xfe,0x46,0x02,0xd0,0x7e,0x01,0x2e,0x39,0x5c,0x75,0x3c,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1e,0x38,0x4e,0x30,0x73,0x34,0x01,0x21,0x00,0x00,0x05,0x00,0x23,0x00,0x00,0x05,0x0a,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0x23,\r\n0x00,0x29,0x00,0x31,0x00,0x98,0x40,0x5a,0x24,0x25,0x2a,0x2b,0x04,0x15,0x02,0x0f,0x13,0x29,0x03,0x0c,0x1c,0x20,0x03,0x17,0x92,0x18,0x0b,0x1f,0x23,0x03,0x04,0x08,0x2e,0x03,0x1b,0x92,0x2f,0x00,0x01,0x90,0x00,0xa0,0x00,0xc0,0x00,0xd0,0x00,0x04,0x00,0x00,0x02,0x11,0x15,0x06,0x02,0x03,0x12,0x21,0x22,0x2f,0x04,0x2a,0x11,0x29,\r\n0x1c,0x1f,0x04,0x04,0x03,0x24,0x1b,0x17,0x15,0x19,0x01,0x15,0x0c,0x08,0x0a,0x0e,0x25,0x1e,0x13,0x20,0x2a,0x03,0x14,0x03,0x15,0x11,0x06,0x7f,0x10,0x10,0x33,0x14,0x7f,0x15,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x33,0x11,0x33,0x11,0x17,0x33,0x32,0x32,0xc6,0x32,0x33,0x33,0x11,0x33,0x33,0x10,0xc6,0x32,0x11,0x12,0x17,0x39,0x11,0x12,\r\n0x17,0x39,0x31,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x2f,0x5d,0x5d,0xfd,0x17,0x33,0x17,0x32,0xd6,0xed,0x17,0x33,0x17,0x32,0x11,0x12,0x17,0x39,0x31,0x30,0x13,0x33,0x11,0x33,0x13,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x01,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x05,0x33,0x35,0x21,0x05,0x21,\r\n0x27,0x23,0x01,0x33,0x26,0x35,0x35,0x23,0x01,0x23,0x16,0x15,0x15,0x33,0x27,0x26,0x23,0x99,0xcb,0xf1,0x01,0x5f,0x97,0x9c,0x9c,0x9c,0x9c,0xc2,0xfe,0xfb,0xfe,0xac,0x97,0x99,0x99,0x99,0x02,0xde,0xd6,0xfe,0xe7,0xfe,0x95,0x01,0x0f,0x44,0xcb,0x02,0x88,0x03,0x07,0x92,0xfe,0x0c,0x05,0x07,0x85,0x60,0x1b,0x03,0xae,0x01,0xec,0xfe,\r\n0x14,0x01,0xec,0xfe,0x14,0x8d,0x88,0x8c,0xfd,0xf3,0x02,0x0d,0xfd,0xf3,0x02,0x0d,0x8c,0x88,0x88,0x88,0x88,0x88,0xfd,0xbc,0x31,0xa0,0x5f,0x02,0xbb,0x2e,0x94,0x58,0xc2,0x37,0x00,0x03,0x00,0xbc,0xff,0xe8,0x06,0x77,0x05,0x9a,0x00,0x16,0x00,0x21,0x00,0x54,0x00,0x84,0x40,0x12,0x2c,0x47,0x51,0x36,0x60,0x3a,0x70,0x3a,0x02,0x3a,\r\n0x3d,0x95,0x36,0x36,0x36,0x07,0x08,0x22,0xb8,0xff,0xc0,0x40,0x33,0x09,0x0e,0x48,0x22,0x25,0x95,0x51,0x16,0x14,0x13,0x18,0x91,0x05,0x05,0x08,0x01,0x07,0x17,0x91,0x08,0x03,0x22,0x31,0x3a,0x4c,0x42,0x7e,0x31,0x31,0x27,0x1e,0x13,0x13,0x0e,0x01,0x00,0x00,0x0e,0x7d,0x1e,0x1e,0x07,0x27,0x7e,0x4c,0x4c,0x56,0x18,0x06,0x7e,0x07,\r\n0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xf1,0xc2,0x2f,0x32,0x10,0xc1,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x10,0xc4,0x10,0xc6,0x31,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0xed,0x39,0x39,0x3f,0xfd,0xc6,0x2b,0x11,0x12,0x39,0x2f,0x2f,0xfd,0xc6,0x5d,0x11,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,\r\n0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,\r\n0x27,0x04,0x04,0xc8,0xb1,0x4e,0x8d,0x4c,0xa8,0x01,0x60,0x5e,0x9e,0x72,0x40,0x29,0x4e,0x72,0x4a,0x51,0x42,0xfe,0x3a,0x92,0x3f,0x6b,0x4e,0x2c,0x8f,0x8d,0x02,0x21,0x3e,0x81,0x44,0xb0,0x1d,0x31,0x40,0x23,0x49,0x61,0x3b,0x18,0x2e,0x57,0x7d,0x4f,0x39,0x73,0x2d,0x33,0x6e,0x3d,0x24,0x3d,0x2b,0x19,0x17,0x2b,0x3c,0x24,0x42,0x64,\r\n0x42,0x22,0x23,0x51,0x84,0x61,0x45,0x84,0x36,0x01,0xb0,0xb2,0xfd,0x9e,0x05,0x9a,0x2f,0x60,0x8f,0x60,0x4b,0x82,0x67,0x48,0x10,0x04,0x1e,0x8c,0x03,0x20,0xfd,0xf8,0x26,0x47,0x67,0x40,0x73,0x81,0xfb,0xcc,0x2a,0x31,0x6e,0x1f,0x2c,0x1f,0x18,0x0c,0x18,0x35,0x41,0x4d,0x2f,0x35,0x5c,0x46,0x28,0x14,0x12,0xa3,0x1f,0x20,0x0f,0x1c,\r\n0x28,0x19,0x21,0x2a,0x1d,0x16,0x0c,0x16,0x2f,0x3e,0x50,0x37,0x31,0x5e,0x4a,0x2d,0x1d,0x1b,0x00,0x07,0x00,0x14,0x00,0x00,0x05,0xe0,0x05,0x9a,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x33,0x00,0x3b,0x00,0x43,0x01,0x3f,0x40,0xb7,0x1a,0x1d,0x1e,0x01,0x02,0x19,0x02,0x17,0x26,0x25,0x3a,0x39,0x18,0x39,0x3b,0x24,0x27,0x16,\r\n0x15,0x34,0x15,0x04,0x29,0x2a,0x41,0x42,0x03,0x42,0x40,0x2b,0x28,0x05,0x06,0x3f,0x06,0x13,0x22,0x21,0x32,0x31,0x14,0x31,0x12,0x23,0x20,0x33,0x2c,0x11,0x2c,0x0f,0x0c,0x0b,0x08,0x07,0x10,0x07,0x2e,0x2f,0x36,0x37,0x04,0x07,0x10,0x01,0x05,0x33,0x3b,0x04,0x1e,0x20,0x24,0x28,0x04,0x09,0x92,0x0a,0x1d,0x23,0x27,0x2b,0x04,0x12,\r\n0x16,0x1a,0x40,0x41,0x05,0x0d,0x92,0x0e,0x0e,0x10,0x03,0x07,0x18,0x14,0x10,0x03,0x04,0x2a,0x41,0x03,0x3c,0x03,0x3b,0x24,0x27,0x16,0x04,0x15,0x37,0x3a,0x25,0x26,0x17,0x04,0x18,0x36,0x01,0x1e,0x1d,0x1a,0x04,0x19,0x02,0x05,0x28,0x2b,0x40,0x04,0x3d,0x06,0x32,0x21,0x22,0x13,0x04,0x14,0x2f,0x12,0x23,0x20,0x33,0x04,0x11,0x2e,\r\n0x08,0x0c,0x0f,0x03,0x10,0x07,0x15,0x14,0x06,0x1c,0x00,0x02,0x0d,0x09,0x07,0x11,0x10,0x07,0x18,0x19,0x03,0x36,0x37,0x19,0x04,0x02,0x02,0x45,0x07,0x11,0x10,0x06,0x2e,0x2f,0x10,0x04,0x07,0x2f,0x17,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x17,0x33,0x2f,0x33,0x11,0x33,0x33,0x10,0xc6,0x32,0x10,0xc6,0x32,0x10,0xcd,0x32,0x11,0x12,\r\n0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,0x31,0x00,0x3f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0xfd,0x17,0x33,0x17,0x32,0xd6,0xed,0x17,0x33,0x17,0x32,0x11,0x12,0x17,0x39,0x30,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x10,\r\n0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x31,0x30,0x01,0x21,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x21,0x35,0x33,0x27,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,\r\n0x33,0x13,0x21,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x21,0x33,0x37,0x23,0x05,0x33,0x37,0x23,0x05,0x33,0x27,0x23,0x03,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x05,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x03,0x23,0x06,0x07,0x07,0x33,0x27,0x26,0x05,0xe0,0xfe,0xf3,0x63,0xa2,0x63,0xe7,0x63,0xa1,0x67,0xfe,0xfb,0xe9,0x1a,0xcf,0xb3,\r\n0x5f,0x8f,0x5a,0x01,0x0d,0x5e,0x84,0x59,0x01,0x01,0x57,0x8d,0x5c,0xbe,0xd9,0x19,0xf1,0xfb,0xa5,0xa5,0x1a,0xd8,0x02,0x60,0x9e,0x18,0xcf,0xfe,0xed,0xb2,0x19,0x80,0xf7,0x0d,0x03,0x04,0x03,0x11,0x25,0x71,0x02,0x6d,0x0b,0x05,0x02,0x03,0x0f,0x23,0x6c,0xea,0x03,0x04,0x0d,0x14,0x4a,0x13,0x0d,0x02,0x10,0xfd,0xf0,0x02,0x10,0xfd,\r\n0xf0,0x02,0x10,0x8c,0x88,0x8d,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x01,0xe9,0xfe,0x17,0x8d,0x88,0x88,0x88,0x88,0x88,0x88,0xfe,0x2a,0x45,0x4b,0x35,0x5b,0xc2,0xca,0x39,0x4d,0x34,0x56,0xc6,0x02,0x9a,0x4a,0x46,0x69,0x67,0x43,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x03,0xd3,0x04,0x00,0x00,0x0f,0x00,0x1f,0x00,0x4a,0x40,0x23,\r\n0x19,0x01,0xbe,0x0e,0x0e,0x1f,0x0f,0x1e,0xbe,0x06,0x11,0x0f,0x00,0xcd,0x0f,0x0f,0x10,0x18,0xc2,0x19,0x19,0x10,0x06,0xc2,0x2f,0x07,0x3f,0x07,0x02,0x07,0x07,0x21,0x1f,0xcd,0x10,0xb8,0xff,0xc0,0xb3,0x0b,0x10,0x48,0x10,0x2f,0x2b,0xe1,0x12,0x39,0x2f,0x5d,0xe1,0x11,0x39,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x31,0x00,0x3f,0x33,0xfd,\r\n0xc6,0x2f,0x33,0x10,0xfd,0xc6,0x31,0x30,0x01,0x11,0x21,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x21,0x11,0x03,0x11,0x21,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x21,0x11,0x01,0xe0,0x01,0x07,0x31,0x3a,0x81,0x1a,0x38,0x57,0x3d,0xfe,0x75,0xfe,0x01,0x8b,0x3d,0x57,0x38,0x1a,0x81,0x3a,0x31,0xfe,0xf9,0x03,\r\n0x05,0xfd,0x7f,0x40,0x3b,0x03,0x01,0xfc,0xe4,0x2d,0x52,0x3f,0x26,0x03,0x05,0xfc,0xfb,0x04,0x00,0x25,0x3f,0x53,0x2d,0xfd,0xdf,0x02,0x07,0x3a,0x40,0xfc,0x84,0x00,0x00,0x03,0x00,0x60,0xfe,0xd7,0x04,0x98,0x05,0xec,0x00,0x1c,0x00,0x31,0x00,0x35,0x00,0x5b,0x40,0x33,0x33,0x96,0x34,0x05,0x01,0x02,0x2d,0x95,0x05,0x16,0x11,0x23,\r\n0x95,0x0f,0x10,0x1c,0x19,0x14,0x96,0x0f,0x15,0x1f,0x15,0x2f,0x15,0x03,0x15,0x17,0x00,0x11,0x03,0x0a,0x35,0x00,0x34,0x14,0x0a,0x1b,0x19,0x12,0x16,0x1d,0x03,0x01,0x84,0x00,0x00,0x37,0x28,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x17,0x32,0x33,0xc6,0x10,0xc4,0xc4,0x10,0xc6,0x12,0x39,0x39,0x31,0x00,0x3f,0xd6,0x5d,0xed,0x33,\r\n0x32,0x3f,0xed,0x33,0x3f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x13,0x21,0x35,0x21,0x04,0x10,0xa4,\r\n0x04,0x72,0xee,0x6c,0xa0,0x69,0x33,0x3b,0x75,0xb0,0x75,0xd0,0x63,0x04,0xfe,0xb5,0x01,0x4b,0xa4,0x88,0x88,0xa4,0x2c,0x4d,0x6a,0x3f,0x56,0x7a,0x4e,0x24,0x23,0x4a,0x73,0x50,0x47,0x73,0x51,0x2b,0x7b,0xfc,0xae,0x03,0x52,0xae,0xc6,0x52,0x8b,0xba,0x69,0x71,0xcc,0x99,0x5a,0xa6,0x01,0x40,0x86,0xb4,0xb4,0x86,0xfd,0x1d,0x97,0x3e,\r\n0x6c,0x50,0x2e,0x43,0x72,0x96,0x53,0x4c,0x8b,0x69,0x3e,0x39,0x60,0x7e,0xfd,0x4e,0x77,0x00,0x00,0x01,0x00,0x2a,0x00,0x00,0x03,0xfd,0x05,0x9a,0x00,0x19,0x00,0x44,0x40,0x22,0x19,0x06,0x16,0x10,0x0a,0x92,0x0b,0x0b,0x0d,0x01,0x08,0x14,0x0d,0x03,0x05,0x10,0x16,0x19,0x04,0x17,0x08,0x01,0x00,0x14,0x17,0x15,0x15,0x1b,0x0a,0x0f,\r\n0x0c,0x07,0x7e,0x08,0x2f,0xe1,0x33,0x32,0xc6,0x12,0x39,0x2f,0xc6,0x33,0xc6,0x32,0x11,0x12,0x17,0x39,0x31,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x2f,0xed,0x33,0x33,0x32,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x03,0xfd,\r\n0xdb,0xfe,0x6c,0x10,0x0e,0x08,0x04,0xa8,0x92,0x92,0xa8,0x04,0x08,0x16,0x08,0x01,0x96,0xc2,0xfe,0x36,0x01,0x70,0xfe,0x97,0x02,0x54,0x1a,0x1b,0x0e,0xfd,0x69,0x02,0x9e,0x8d,0x02,0x6f,0xfd,0x8f,0x0e,0x22,0x0c,0x02,0x35,0xfd,0x91,0x8d,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0x6c,0x05,0x9a,0x00,0x17,0x00,0x73,0x40,0x3b,0x08,0x05,\r\n0x09,0x04,0x0b,0x02,0x0a,0x03,0x0c,0x01,0x0d,0x00,0x16,0x0f,0x17,0x0e,0x0d,0x0a,0x09,0x04,0x50,0x03,0x01,0x03,0x00,0x0d,0x00,0x6f,0x17,0x7f,0x17,0x02,0x17,0x17,0x12,0x07,0x15,0x11,0x91,0x12,0x03,0x0a,0x0e,0x11,0x07,0x03,0x17,0x16,0x02,0x06,0x0f,0x0b,0x07,0x14,0x14,0x19,0x06,0x7e,0x07,0x2f,0xe1,0x12,0x39,0x2f,0x11,0x33,\r\n0x33,0x11,0x33,0x33,0xc6,0x32,0x10,0xd4,0xc6,0x32,0x31,0x00,0x3f,0xed,0x32,0x2f,0x12,0x39,0x2f,0x5d,0xcd,0xcd,0x10,0xd6,0x5d,0xcd,0xdd,0xcd,0x10,0xcd,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x07,0x15,0x37,0x15,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,\r\n0x21,0x35,0x21,0x15,0x21,0x11,0x37,0x03,0x08,0xea,0xea,0xea,0xa8,0xef,0xef,0xef,0xef,0xfe,0xb3,0x03,0x43,0xfe,0xb2,0xea,0x03,0xb5,0x85,0xcc,0x85,0x8e,0x85,0xfe,0x2a,0x01,0x76,0x87,0x8e,0x87,0xcc,0x87,0x8e,0x87,0x01,0xa4,0x98,0x98,0xfe,0xbc,0x85,0x00,0x00,0x05,0x00,0x2c,0xfe,0x9e,0x08,0xe2,0x06,0x77,0x00,0x3a,0x00,0x53,\r\n0x00,0x6a,0x00,0x7e,0x00,0x8e,0x00,0x84,0x40,0x4c,0x1e,0x3e,0x8c,0x0c,0x04,0x0f,0x19,0x29,0x32,0x24,0x36,0x4f,0xe2,0x2f,0x7a,0xe7,0x59,0x70,0x69,0x70,0x52,0x63,0x7f,0xdb,0x0f,0x19,0x1f,0x19,0x02,0x19,0x89,0x43,0xe2,0x07,0x63,0x07,0x89,0xdb,0x0f,0x0c,0x1e,0x24,0x2f,0x36,0x3e,0x4f,0x8c,0x08,0x00,0x14,0x32,0x33,0x33,0x00,\r\n0x29,0x2a,0x14,0x54,0x68,0x69,0x6b,0x04,0x6a,0x00,0xb1,0x4a,0x4a,0x14,0x75,0xea,0x5e,0x5e,0x90,0x84,0xf3,0x14,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0xc4,0x17,0x32,0x10,0xc4,0x32,0x10,0xc0,0x2f,0x32,0x11,0x12,0x17,0x39,0x31,0x00,0x2f,0xed,0x33,0x33,0x10,0xed,0x10,0xd4,0x5d,0xed,0x10,0xed,0xc6,0x10,0xd4,0xed,\r\n0x2f,0xed,0x33,0x32,0xcd,0xc4,0x11,0x12,0x17,0x39,0x31,0x30,0x01,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x12,0x37,0x36,0x36,0x37,0x0e,0x03,0x07,0x27,0x3e,0x03,0x37,0x36,0x36,0x37,0x17,0x06,0x06,0x07,0x1e,0x03,0x05,0x06,0x02,0x07,0x1e,0x03,\r\n0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x03,0x23,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x06,0x84,0x23,0x4d,0x78,\r\n0xaa,0xdf,0x8c,0x3b,0x66,0x58,0x4c,0x22,0x42,0x94,0x55,0x2e,0x4a,0x34,0x1d,0x23,0x3a,0x4b,0x28,0x26,0x44,0x3d,0x3a,0x1c,0x36,0x58,0x26,0x25,0x5e,0x3c,0x5a,0x9b,0x8a,0x7d,0x3d,0x34,0x45,0x9f,0xb2,0xc2,0x68,0x43,0xa1,0x61,0x37,0x47,0x6c,0x2c,0x8a,0xcf,0x8a,0x45,0xfc,0xcf,0x32,0x74,0x46,0x1e,0x3f,0x48,0x50,0x2e,0x69,0xa8,\r\n0x82,0x5e,0x3d,0x1d,0x3b,0x72,0xa9,0x6d,0x1b,0x31,0x2d,0x2e,0x02,0xf0,0x0f,0x2e,0x51,0x80,0x62,0x3d,0x66,0x4a,0x2a,0x2c,0x55,0x7b,0x4f,0x21,0x3f,0x36,0x2b,0x0d,0x8a,0xa3,0x01,0x64,0x12,0x25,0x39,0x27,0x2c,0x44,0x2f,0x18,0x14,0x25,0x35,0x21,0x35,0x49,0x2d,0x14,0xf9,0xfc,0x15,0x27,0x1e,0x12,0x12,0x1c,0x25,0x12,0x39,0x63,\r\n0x2c,0x32,0x5c,0x03,0x3c,0x59,0xc0,0xb8,0xa4,0x7d,0x49,0x14,0x22,0x2d,0x18,0x3f,0x3c,0x1c,0x33,0x47,0x2b,0x30,0x4a,0x31,0x1a,0x10,0x1c,0x25,0x15,0x5f,0x01,0x0d,0xab,0xa9,0xf9,0x5d,0x0a,0x35,0x49,0x58,0x2d,0x50,0x38,0x69,0x51,0x34,0x03,0x48,0x66,0x26,0x42,0x1f,0x49,0x30,0x0f,0x5f,0x9b,0xd4,0xb1,0xc4,0xfe,0xe4,0x60,0x15,\r\n0x24,0x1b,0x10,0x3f,0x6b,0x8e,0x9c,0xa1,0x4a,0x77,0xbb,0x85,0x4e,0x0a,0x2e,0x71,0x88,0xa3,0xfd,0xba,0x36,0x74,0x60,0x3f,0x25,0x47,0x68,0x43,0x48,0x7f,0x5f,0x36,0x10,0x1f,0x2c,0x1b,0xfe,0x29,0x02,0x7c,0x20,0x3e,0x30,0x1d,0x26,0x3f,0x51,0x2b,0x28,0x43,0x30,0x1a,0x31,0x47,0x52,0x15,0x0e,0x19,0x24,0x16,0x19,0x26,0x1a,0x0e,\r\n0x36,0x35,0x27,0x36,0x00,0x02,0x00,0x30,0xfe,0x52,0x03,0x6a,0x05,0xe2,0x00,0x3c,0x00,0x4e,0x00,0x5d,0x40,0x32,0x01,0x02,0x07,0x1b,0x35,0x3b,0x4a,0x07,0x00,0x11,0x2b,0x25,0x3a,0x00,0x42,0xcb,0x11,0x00,0x4a,0x07,0x3d,0x02,0x35,0x1b,0x16,0x02,0x3a,0x00,0x47,0x48,0x0c,0x0c,0x3d,0x00,0x28,0x28,0x30,0x3d,0xc4,0x16,0x30,0xc0,\r\n0x20,0x20,0x50,0x01,0x3b,0x3c,0x03,0x00,0x2f,0x17,0x32,0x11,0x39,0x2f,0xe1,0xd4,0xe1,0x10,0xc0,0x2f,0x11,0x12,0x39,0x2f,0xe1,0x10,0xc6,0x32,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x00,0x3f,0xed,0x2f,0xd6,0xd4,0xcd,0x11,0x12,0x17,0x39,0x31,0x30,0x33,0x13,0x13,0x36,0x37,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,\r\n0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x26,0x36,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x06,0x06,0x07,0x06,0x07,0x03,0x07,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x3e,0x03,0x30,0xfe,0x4c,0x11,0x13,0x11,0x28,0x16,0x26,0x4a,0x3a,0x23,0x20,0x3b,0x54,\r\n0x34,0x30,0x47,0x2f,0x17,0x10,0x1d,0x26,0x16,0x2f,0x62,0x50,0x32,0x3e,0x6e,0x96,0x57,0x0b,0x0b,0x01,0x08,0x0c,0x25,0x51,0x43,0x2c,0x17,0x29,0x35,0x1e,0x23,0x47,0x1c,0x21,0x1e,0x64,0x62,0x01,0xcd,0x0e,0x19,0x22,0x14,0x11,0x21,0x19,0x0f,0x41,0x32,0x0e,0x19,0x12,0x0b,0x02,0x23,0xfe,0xe4,0x37,0x40,0x37,0x90,0x51,0x4b,0x8e,\r\n0x8b,0x8a,0x47,0x3f,0x67,0x49,0x28,0x23,0x40,0x5b,0x38,0x22,0x69,0x85,0x99,0x52,0x54,0xad,0xbc,0xce,0x74,0x50,0x96,0x74,0x46,0x0c,0x09,0x06,0x10,0x03,0x09,0x3b,0x5a,0x78,0x47,0x56,0x9f,0x92,0x88,0x40,0x7d,0xe7,0x5b,0x6a,0x5d,0x01,0x50,0xf6,0x04,0xe1,0x30,0x41,0x28,0x11,0x13,0x29,0x41,0x2f,0x67,0xbf,0x60,0x3b,0x71,0x66,\r\n0x56,0x00,0x00,0x04,0x00,0x26,0x00,0x00,0x04,0x8e,0x05,0x9a,0x00,0x1f,0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x81,0x40,0x4a,0x2c,0x12,0x24,0x0f,0x1c,0x92,0x1d,0x40,0x09,0x0d,0x48,0x1d,0x1d,0x03,0x18,0x23,0x0a,0x2f,0x07,0x00,0x92,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x01,0x01,0x03,0x2d,0x91,0x18,0x18,0x03,0x19,0x2e,0x91,0x03,\r\n0x03,0x07,0x0a,0x0f,0x12,0x04,0x0c,0x22,0x25,0x2b,0x30,0x04,0x20,0x24,0x2d,0x2f,0x03,0x19,0x00,0x1c,0x1a,0x1e,0x02,0x1a,0x10,0x09,0x20,0x7d,0x0c,0x0c,0x35,0x19,0x7e,0x1a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0xc6,0x32,0x11,0x33,0x33,0x10,0xc6,0x32,0x11,0x17,0x33,0x11,0x17,0x33,0x11,0x17,0x33,0x31,0x00,0x3f,0xed,0x2f,0x12,0x39,\r\n0x2f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x33,0x33,0x32,0x32,0x11,0x12,0x39,0x2f,0x2b,0xed,0x33,0x33,0x32,0x32,0x31,0x30,0x13,0x35,0x33,0x11,0x21,0x32,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x23,0x0e,0x03,0x23,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x05,0x34,0x27,0x21,0x15,0x21,0x36,0x36,0x01,0x32,0x36,\r\n0x37,0x21,0x15,0x11,0x15,0x21,0x26,0x26,0x23,0x26,0x96,0x01,0x7c,0xa1,0xdb,0x2e,0xac,0x90,0x03,0x03,0x02,0x92,0xb7,0x1b,0x59,0x73,0x8d,0x50,0xaf,0xa8,0x96,0x96,0x02,0x95,0x03,0xfe,0x16,0x01,0xe8,0x02,0x03,0xfe,0xb9,0x67,0x87,0x26,0xfe,0x46,0x01,0xbe,0x23,0x7f,0x64,0x03,0xfd,0x8d,0x01,0x10,0x8b,0x85,0x8d,0x1b,0x1c,0x15,\r\n0x28,0x14,0x8c,0x42,0x69,0x49,0x27,0xfe,0x32,0x02,0xe9,0x8c,0x88,0x3f,0x21,0x1e,0x88,0x11,0x24,0xfe,0xbc,0x45,0x3e,0x83,0x02,0x9c,0x78,0x39,0x3f,0x00,0x00,0x04,0x00,0xa2,0xff,0xdf,0x06,0x7d,0x05,0xbb,0x00,0x1b,0x00,0x33,0x00,0x42,0x00,0x4f,0x00,0x52,0x40,0x2d,0x34,0x4c,0x0f,0x44,0x1f,0x44,0x02,0x44,0x44,0x37,0x36,0x36,\r\n0x28,0x43,0x4c,0x37,0x37,0x1c,0x28,0xcb,0x00,0xc7,0x1c,0xcb,0x0e,0x04,0x3d,0xbd,0x4a,0x4a,0x2d,0x44,0x35,0xc2,0x36,0x36,0x07,0x2d,0xc9,0x15,0x15,0x51,0x21,0xc9,0x07,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x31,0x00,0x3f,0xed,0xf4,0xed,0x11,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x2f,\r\n0x5d,0xed,0x31,0x30,0x05,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x03,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x03,0x90,0x67,0xbf,\r\n0xa7,0x89,0x62,0x36,0x36,0x62,0x8a,0xa6,0xbf,0x67,0x67,0xbe,0xa7,0x89,0x62,0x36,0x36,0x62,0x89,0xa6,0xbf,0x67,0x88,0xf1,0xb4,0x69,0x30,0x56,0x79,0x94,0xa8,0x5b,0x88,0xf1,0xb4,0x68,0x30,0x56,0x79,0x93,0xa9,0xdd,0x83,0x01,0x1d,0x53,0x84,0x5b,0x30,0x29,0x59,0x8c,0x64,0x8a,0x81,0x48,0x5f,0x37,0x16,0x1a,0x3a,0x5a,0x41,0x21,\r\n0x36,0x62,0x89,0xa7,0xbf,0x67,0x67,0xbf,0xa7,0x89,0x62,0x36,0x36,0x62,0x8a,0xa7,0xbf,0x66,0x66,0xbf,0xa7,0x8a,0x62,0x36,0x05,0x84,0x69,0xb4,0xf1,0x88,0x5b,0xa9,0x93,0x78,0x57,0x2f,0x68,0xb4,0xf1,0x88,0x5b,0xa8,0x93,0x79,0x57,0x30,0xfc,0xdb,0xfe,0xba,0x03,0xba,0x28,0x4d,0x71,0x4a,0x3a,0x74,0x5d,0x39,0x02,0x01,0xfe,0x71,\r\n0x23,0x3a,0x49,0x25,0x2d,0x49,0x33,0x1b,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x1a,0x05,0xec,0x00,0x1d,0x00,0x2b,0x00,0x39,0x00,0x41,0x40,0x24,0x11,0x00,0x36,0x95,0x16,0x10,0x22,0x95,0x0d,0x10,0x30,0x95,0x1c,0x16,0x28,0x95,0x07,0x16,0x03,0x12,0x2d,0x02,0x84,0x11,0x1e,0x03,0x03,0x0a,0x19,0x83,0x33,0x33,0x3b,0x25,0x83,0x0a,\r\n0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x31,0x30,0x25,0x23,0x15,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x04,0x14,0x04,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0xfe,0xf0,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0x55,0x51,0xa9,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,\r\n0x57,0x53,0x94,0x94,0xae,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x02,0x7a,0xfd,0x60,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0x01,0xd8,0xa6,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0x63,0x5e,0x01,0x0d,0x9e,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0x64,0x5e,0x00,0x00,0x03,0x00,0x60,0xfe,0x29,0x07,0x1a,0x04,0x18,0x00,0x1d,0x00,0x2b,0x00,0x39,\r\n0x00,0x42,0x40,0x25,0x11,0x0f,0x36,0x95,0x16,0x10,0x22,0x95,0x0d,0x10,0x30,0x95,0x1c,0x16,0x28,0x95,0x07,0x16,0x03,0x1b,0x12,0x2d,0x02,0x84,0x11,0x1e,0x03,0x03,0x0a,0x19,0x83,0x33,0x33,0x3b,0x25,0x83,0x0a,0x2f,0xe1,0x12,0x39,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x33,0xe1,0x32,0x32,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x3f,\r\n0xed,0x3f,0x31,0x30,0x25,0x23,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x01,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x04,0x14,\r\n0x04,0xa4,0x04,0x72,0xee,0xc1,0xe7,0x01,0x00,0xd5,0xd3,0x60,0x04,0xa4,0x04,0x79,0xe9,0xc5,0xdf,0xfa,0xd9,0xcb,0xfe,0xf0,0xa4,0x7e,0x96,0xac,0xa5,0x8b,0x89,0x55,0x51,0xa9,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0x57,0x53,0x94,0xfd,0x95,0x02,0x85,0xc6,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,\r\n0xfe,0xcb,0x01,0xd8,0xa6,0x7c,0xac,0xdc,0xc2,0xb1,0xcd,0x63,0x5e,0x01,0x0d,0x9e,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0x64,0x5e,0x00,0x01,0x00,0x16,0xff,0x6a,0x04,0xf0,0x06,0x30,0x00,0x03,0x00,0x18,0x40,0x0c,0x00,0x02,0xa0,0x03,0x01,0x0f,0x03,0x3f,0x03,0x02,0x03,0x02,0x00,0x2f,0x2f,0x5d,0x5d,0x01,0x2f,0xcd,0x31,0x30,0x01,0x01,\r\n0x23,0x01,0x04,0xf0,0xfb,0xca,0xa4,0x04,0x36,0x06,0x30,0xf9,0x3a,0x06,0xc6,0x00,0xff,0xff,0x00,0x16,0xff,0x6a,0x05,0x12,0x06,0x30,0x02,0x26,0x00,0x24,0x00,0x00,0x00,0x06,0x07,0xe3,0x00,0x00,0xff,0xff,0x00,0x16,0xff,0x6a,0x04,0xf0,0x06,0x30,0x02,0x26,0x00,0x26,0x00,0x00,0x00,0x06,0x07,0xe3,0x00,0x00,0xff,0xff,0x00,0x21,\r\n0xff,0x37,0x04,0x0b,0x04,0xd1,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x00,0xbc,0x01,0x59,0xff,0x37,0xff,0xff,0x00,0x12,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x26,0x00,0x2f,0x00,0x00,0x00,0x07,0x00,0xd9,0xff,0xd4,0xfd,0xf5,0xff,0xff,0xff,0xef,0xff,0x6a,0x04,0xc9,0x06,0x30,0x02,0x26,0x00,0x37,0x00,0x00,0x00,0x06,0x07,0xe3,\r\n0xd9,0x00,0x00,0x01,0x00,0x68,0xfe,0x92,0x03,0x0f,0x04,0x18,0x00,0x3c,0x00,0x57,0x40,0x31,0x3c,0x3a,0x95,0x02,0x0d,0x30,0x17,0x26,0x04,0x1c,0x36,0x1f,0x21,0x95,0x1c,0x10,0x08,0x36,0x20,0x09,0x30,0x09,0x40,0x09,0x03,0x09,0x0b,0x95,0x36,0x16,0x3c,0x3c,0x36,0x09,0x1f,0x1f,0x30,0x26,0x83,0x17,0x17,0x09,0x30,0x83,0x0d,0x0d,\r\n0x3e,0x06,0x09,0x2f,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x11,0x39,0x39,0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x11,0x39,0x3f,0xfd,0xc6,0x11,0x12,0x17,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,\r\n0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x07,0x06,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x02,0xc7,0x3a,0x5c,0x8c,0x46,0x3d,0x92,0x15,0x13,0x86,0xa1,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x42,0x6e,0x8d,0x4b,0x85,0x69,0x71,0x93,0x2e,0x4a,0x35,0x1d,0x1d,0x38,0x50,\r\n0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x49,0x40,0x44,0x27,0x16,0x30,0x3c,0x48,0x47,0xfe,0xb7,0x25,0xa4,0x90,0x4b,0x09,0x0b,0xb0,0x63,0x90,0x29,0x39,0x2c,0x23,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x6f,0x4b,0x26,0x2e,0xa6,0x4a,0x15,0x26,0x35,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5a,0x3e,0x4c,0x70,0x4a,0x12,0x0f,0x03,\r\n0x24,0x35,0x71,0x28,0x00,0x01,0x00,0x21,0xfe,0x92,0x03,0x70,0x04,0x00,0x00,0x13,0x00,0x30,0x40,0x19,0x13,0x11,0x95,0x02,0x0c,0x08,0x95,0x0a,0x0f,0x07,0x0d,0x96,0x06,0x13,0x09,0x08,0x09,0x0d,0x13,0x04,0x07,0x0c,0x0c,0x15,0x07,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x2f,0xed,0x39,0x3f,0xed,0x39,0x2f,0xfd,0xc6,\r\n0x31,0x30,0x01,0x06,0x23,0x22,0x00,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x17,0x16,0x33,0x32,0x37,0x03,0x6a,0x3a,0x5c,0x96,0xfe,0xcf,0xb2,0x3a,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0x97,0x85,0x81,0x88,0x46,0x48,0x47,0xfe,0xb7,0x25,0x01,0x6e,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xad,0x2b,0x97,0x9e,0x28,0x00,0x00,0x01,\r\n0x00,0x30,0x00,0x00,0x03,0xf6,0x06,0x02,0x00,0x19,0x00,0x29,0x40,0x14,0x13,0x08,0x10,0x01,0x0d,0x0b,0x95,0x10,0x01,0x00,0x84,0x01,0x01,0x0d,0x13,0x83,0x08,0x08,0x1b,0x0d,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x00,0x3f,0xfd,0xc6,0x2f,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,\r\n0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x04,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x02,0x47,0xa3,0x5d,0x88,0x82,0x45,0xc1,0xe1,0xd8,0xa6,0xa1,0xde,0x01,0x29,0x01,0x1e,0x61,0x9e,0x63,0x4d,0x01,0xee,0x87,0xa2,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x83,0x6f,0x00,0xff,0xff,0x00,0x6c,0x04,0xc2,\r\n0x01,0x31,0x05,0x85,0x02,0x06,0x00,0xdb,0x00,0x00,0x00,0x01,0xff,0x2b,0xfe,0x52,0x00,0xd4,0xff,0xe6,0x00,0x0e,0x00,0x0c,0xb3,0x05,0x0b,0x0c,0x0b,0x2f,0xcd,0x00,0x2f,0xc4,0x31,0x30,0x17,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x27,0x33,0x07,0x37,0xd4,0x9e,0x6b,0x4f,0x53,0x52,0x4f,0x6a,0x9d,0x1f,0x94,0x0f,0x61,\r\n0x0e,0x94,0xd7,0x23,0x7b,0x39,0x8c,0x8c,0x39,0x7b,0x23,0x5b,0x40,0xa2,0xa2,0x40,0x00,0x03,0xfe,0xbd,0xfe,0x5c,0x01,0x43,0xff,0xc8,0x00,0x1a,0x00,0x26,0x00,0x32,0x00,0x34,0x40,0x1d,0x0e,0x06,0xc3,0x40,0x27,0x0f,0x1b,0x1f,0x1b,0x2f,0x1b,0x03,0x1b,0x80,0x2d,0x21,0xc3,0x13,0x00,0x30,0xf1,0x11,0x2a,0x1e,0xf1,0x03,0x24,0xf1,\r\n0x2a,0x2f,0xfd,0xd4,0xed,0x10,0xd4,0xed,0x00,0x2f,0x33,0xed,0x32,0x1a,0xdc,0x5d,0x32,0x1a,0xed,0x32,0x31,0x30,0x17,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x32,0x17,0x16,0x17,0x36,0x37,0x36,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x23,0x32,0x36,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x8f,0x4b,0x69,0x69,0x4b,0x4b,0x35,0x08,0x07,0x07,0x09,0x34,0x4b,0x4b,0x69,0x69,0x96,0x34,0x09,0x07,0x07,0x08,0x35,0x4b,0x2c,0x3f,0x3f,0x2c,0x2c,0x3e,0x3e,0xf2,0x2c,0x3f,0x3f,0x2c,0x2c,0x3e,0x3e,0x38,0x6b,0x4b,0x4b,0x6b,0x36,0x08,0x0a,0x0a,0x08,0x36,0x6b,0x4b,0x4b,0x6b,0x35,\r\n0x09,0x09,0x09,0x09,0x35,0xfe,0xdd,0x40,0x2d,0x2c,0x40,0x40,0x2c,0x2d,0x40,0x40,0x2d,0x2c,0x40,0x40,0x2c,0x2d,0x40,0x00,0x00,0x01,0xff,0x60,0x04,0xba,0x00,0xa0,0x06,0x70,0x00,0x07,0x00,0x16,0x40,0x09,0x05,0x06,0xdb,0x40,0x01,0x03,0x07,0x80,0x03,0x2f,0x1a,0xcd,0x00,0x2f,0xc6,0x1a,0xfd,0xcd,0x31,0x30,0x13,0x23,0x37,0x23,\r\n0x13,0x33,0x07,0x33,0x5a,0x64,0x2d,0xc3,0x46,0x64,0x2d,0xc3,0x04,0xba,0xac,0x01,0x0a,0xac,0xff,0xff,0xfc,0xe6,0xfe,0x52,0x03,0x1a,0xff,0xd0,0x02,0x07,0x07,0x5d,0x00,0x00,0xf8,0x90,0xff,0xff,0x00,0x21,0xfe,0x74,0x04,0x50,0x04,0x18,0x02,0x26,0x01,0xd0,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xe3,0xfa,0x31,0x00,0x0f,0x40,0x09,\r\n0x02,0x10,0x1c,0x20,0x1c,0x40,0x1c,0x03,0x1c,0x00,0x11,0x5d,0x35,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x00,0x15,0x00,0x2c,0x40,0x17,0x0b,0x0a,0x08,0x91,0x0d,0x04,0x15,0x20,0x00,0x01,0x00,0x02,0x91,0x13,0x13,0x10,0x7d,0x05,0x05,0x17,0x0a,0x0a,0x00,0x2f,0x32,0x11,0x12,0x39,0x2f,0xe1,0x00,0x3f,0xfd,0xc6,\r\n0x5d,0x32,0x3f,0xfd,0xc6,0x32,0x31,0x30,0x37,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x27,0x68,0x9e,0xd8,0xe9,0x01,0x1f,0xfe,0xcd,0xf7,0xba,0x9a,0x86,0xcc,0x01,0x3e,0x01,0x9e,0xfe,0x90,0xfe,0xce,0xed,0x9f,0xdf,0x60,0x01,0x37,0x01,0x06,0x01,0x14,0x01,0x4a,0x56,\r\n0xb3,0x3b,0xfe,0x58,0xfe,0xa8,0xfe,0xc0,0xfe,0x76,0x54,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x26,0x00,0x26,0x00,0x00,0x01,0x07,0x00,0xdb,0x02,0x34,0xfd,0xb0,0x00,0x15,0x40,0x0e,0x01,0x1f,0x1c,0x01,0x0f,0x1c,0x5f,0x1c,0xcf,0x1c,0xff,0x1c,0x04,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0x68,\r\n0xff,0xe8,0x04,0x96,0x05,0xb2,0x02,0x26,0x07,0xf2,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x23,0xfd,0xb0,0x00,0x15,0x40,0x0e,0x01,0x1f,0x1c,0x01,0x0f,0x1c,0x5f,0x1c,0xcf,0x1c,0xff,0x1c,0x04,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0x00,0x01,0x00,0xbc,0xfe,0x80,0x03,0xa4,0x05,0x9a,0x00,0x09,0x00,0x26,0x40,0x13,0x01,0xee,0x08,0x03,\r\n0x02,0x91,0x06,0x05,0x00,0x00,0x0b,0x07,0x03,0x7f,0x06,0x06,0x02,0x7e,0x07,0x2f,0xf1,0xc1,0x2f,0xed,0x11,0x12,0x39,0x2f,0x00,0x2f,0x2f,0xed,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x03,0xa4,0xfd,0xc1,0x99,0x99,0xa9,0x02,0xe8,0x04,0xfe,0xfb,0x98,0xfd,0xea,0x01,0x80,0x05,0x9a,0x00,0x00,0x01,\r\n0x00,0xa6,0xfe,0x8b,0x02,0xdf,0x04,0x00,0x00,0x09,0x00,0x26,0x40,0x13,0x01,0x95,0x08,0x0f,0x02,0x96,0x06,0x05,0x00,0x00,0x0b,0x07,0x03,0xed,0x06,0x06,0x02,0x84,0x07,0x2f,0xf1,0xc1,0x2f,0xed,0x11,0x12,0x39,0x2f,0x00,0x2f,0x2f,0xed,0x3f,0xed,0x31,0x30,0x01,0x21,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x21,0x02,0xdf,0xfe,0x6b,\r\n0x8c,0x8c,0xa4,0x02,0x39,0x03,0x74,0xfd,0x0d,0xfe,0x0a,0x01,0x75,0x04,0x00,0x00,0xff,0xff,0xff,0xbb,0xff,0xe8,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x01,0x06,0x00,0xd8,0x98,0xc5,0x00,0x11,0x40,0x0b,0x02,0x10,0x2b,0x20,0x2b,0x70,0x2b,0xaf,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,\r\n0x04,0xff,0x05,0xec,0x02,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x00,0xd8,0x02,0x5b,0xff,0xc5,0x00,0x11,0x40,0x0b,0x02,0x10,0x2b,0x20,0x2b,0x70,0x2b,0xaf,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xf8,0x00,0x00,0x02,0xa0,0x06,0x02,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xd5,0xfc,0xb7,0x00,0x0a,\r\n0xb4,0x01,0x10,0x22,0x01,0x22,0x00,0x11,0x5d,0x35,0x00,0x03,0xff,0xc0,0x00,0x00,0x07,0x34,0x04,0x18,0x00,0x2c,0x00,0x36,0x00,0x3f,0x00,0xa3,0x40,0x2b,0x15,0x3e,0x0c,0x09,0x11,0x07,0x04,0x09,0x2c,0x28,0x02,0x96,0x23,0x28,0x35,0x37,0x2d,0x09,0x96,0x28,0x3e,0x3e,0x0b,0x02,0x19,0x01,0x0c,0x04,0x1e,0x31,0x19,0x03,0x3a,0x95,\r\n0x20,0x1b,0x10,0x16,0x0f,0x06,0x01,0x0b,0x27,0xb8,0x01,0x03,0x40,0x0f,0x40,0x28,0x28,0x22,0x2d,0x00,0x84,0x01,0x0e,0x06,0x06,0x0b,0x42,0x14,0x10,0xb8,0x01,0x03,0x40,0x1b,0x40,0x11,0x16,0x17,0x3e,0x03,0x0a,0x84,0x0b,0x37,0x1e,0x35,0x03,0x05,0x84,0x06,0x0f,0x06,0x01,0x0c,0x03,0x40,0x41,0x06,0x84,0x30,0x30,0x2b,0x01,0x5f,\r\n0x5e,0x5d,0x10,0xe1,0x17,0x39,0x18,0x2f,0xe1,0x17,0x39,0xd6,0x1a,0xed,0x33,0x2b,0x01,0x18,0x10,0xf4,0xf1,0x39,0x39,0xc0,0x2f,0x1a,0xed,0x00,0x2f,0x33,0x33,0x3f,0x3f,0x33,0xed,0x17,0x32,0x5f,0x5e,0x5d,0x12,0x39,0x2f,0xc4,0xed,0xd4,0x39,0x39,0x11,0x39,0xfd,0x11,0x39,0x11,0x39,0x39,0xc4,0x11,0x39,0x11,0x39,0x31,0x30,0x21,\r\n0x23,0x11,0x26,0x25,0x11,0x23,0x11,0x24,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x36,0x37,0x36,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x15,0x36,0x37,0x36,0x35,0x33,0x06,0x07,0x06,0x07,0x27,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x04,0x25,0x35,0x10,0x23,0x22,0x07,0x06,0x07,0x16,0x06,\r\n0x54,0xa4,0xb3,0xfe,0xd2,0xa4,0xfe,0xd1,0xb2,0xa4,0x21,0x16,0x38,0x77,0x02,0x5a,0x35,0x55,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0x01,0x52,0x1c,0x14,0x39,0x77,0x02,0x5b,0x34,0x4f,0xa4,0x69,0x7c,0x69,0x93,0x01,0x32,0xfe,0x2a,0xe9,0x6c,0x46,0x35,0x0d,0xb4,0x01,0x5a,0x05,0x42,0xfe,0x5f,0x01,0xc6,0x42,0x06,0xfd,0xf2,\r\n0x01,0xfb,0x0d,0x15,0x35,0x50,0x88,0x58,0x34,0x15,0x01,0x83,0xa2,0xba,0x75,0x5f,0xd4,0xfe,0x5f,0x8a,0x0c,0x13,0x36,0x50,0x86,0x59,0x33,0x16,0x6c,0x76,0xaa,0x98,0xc0,0x86,0x2a,0x43,0x68,0x1d,0x01,0x2e,0x5b,0x44,0x64,0x07,0x00,0x02,0xff,0xc0,0x00,0x00,0x04,0xdc,0x04,0x18,0x00,0x25,0x00,0x30,0x00,0x5f,0x40,0x1a,0x0e,0x06,\r\n0x02,0x13,0x25,0x96,0x1c,0x21,0x2f,0x28,0x09,0x96,0x21,0x12,0x12,0x08,0x16,0x2b,0x95,0x18,0x10,0x13,0x0f,0x01,0x08,0x20,0xb8,0x01,0x03,0x40,0x0b,0x21,0x21,0x1c,0x28,0x00,0x84,0x01,0x01,0x32,0x08,0x0d,0xb8,0x01,0x03,0xb7,0x0e,0x13,0x14,0x2f,0x03,0x07,0x84,0x08,0x2f,0xe1,0x17,0x39,0xd6,0xed,0x11,0x12,0x39,0x2f,0xf1,0x39,\r\n0x39,0xc0,0x2f,0xed,0x00,0x2f,0x33,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0xc4,0xed,0xd4,0x39,0x11,0x39,0xfd,0x11,0x39,0x39,0xc4,0x31,0x30,0x21,0x23,0x11,0x26,0x27,0x26,0x27,0x11,0x23,0x11,0x06,0x07,0x06,0x15,0x23,0x36,0x37,0x36,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x15,0x36,0x37,0x36,0x35,0x33,0x06,0x07,0x06,\r\n0x07,0x25,0x16,0x17,0x35,0x10,0x23,0x22,0x07,0x06,0x07,0x16,0x03,0xf8,0xa4,0x6c,0x9a,0x9a,0x6a,0xa4,0x27,0x1a,0x2e,0x77,0x02,0x50,0x3b,0x59,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x25,0x19,0x2f,0x77,0x02,0x51,0x3b,0x56,0xfe,0x59,0x9a,0x69,0xee,0x7b,0x51,0x3f,0x0e,0x6c,0x01,0x63,0x14,0x3d,0x3d,0x14,0xfd,0xfb,0x02,0x04,0x0d,0x1e,\r\n0x35,0x50,0x88,0x58,0x41,0x11,0x01,0x7a,0xaa,0xc2,0xd9,0xcd,0x91,0x0e,0x1d,0x36,0x50,0x86,0x59,0x41,0x12,0xd1,0x3d,0x14,0x68,0x01,0x46,0x5d,0x49,0x67,0x14,0x00,0xff,0xff,0xff,0xbb,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x98,0xf9,0xf2,0x00,0x11,0x40,0x0b,0x02,0x20,0x2b,0x5f,\r\n0x2b,0x70,0x2b,0xe0,0x2b,0x04,0x2b,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xbb,0x00,0x00,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x98,0xfc,0xc8,0x00,0x11,0x40,0x0b,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0xaf,0x1e,0x04,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0xff,0xa5,0x00,0x00,0x02,0xa2,\r\n0x04,0x18,0x02,0x26,0x05,0x83,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0x82,0xfc,0xc8,0x00,0x11,0x40,0x0b,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0xaf,0x1e,0x04,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x27,0xff,0xe8,0x03,0xac,0x04,0x18,0x00,0x26,0x00,0x56,0x28,0x00,0x00,0x06,0x08,0x5f,0x00,0x00,0xff,0xff,0xff,0xef,0xff,0xea,\r\n0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xcc,0xfc,0xc8,0x00,0x13,0x40,0x0d,0x01,0x10,0x1e,0x20,0x1e,0x70,0x1e,0x8f,0x1e,0xaf,0x1e,0x05,0x1e,0x00,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x5f,0xfc,0xc8,\r\n0x00,0x13,0x40,0x0d,0x01,0x10,0x17,0x20,0x17,0x70,0x17,0x8f,0x17,0xaf,0x17,0x05,0x17,0x00,0x11,0x5d,0x35,0x00,0x00,0x02,0x00,0xa6,0xfe,0x1e,0x04,0x56,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x44,0x40,0x26,0x0a,0x23,0x95,0x0d,0x0d,0x02,0x1d,0x05,0x40,0x0b,0x0f,0x48,0x05,0x07,0x95,0x02,0x10,0x16,0x1d,0x95,0x18,0x13,0x1c,0x05,\r\n0x05,0x09,0x10,0x83,0x20,0x20,0x27,0x09,0x84,0x19,0x84,0x17,0x84,0x18,0x2f,0xe1,0xe1,0xe1,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0x00,0x3f,0xc4,0xed,0x32,0x3f,0xfd,0xc6,0x2b,0x11,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x13,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x20,0x11,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,\r\n0x23,0x15,0x23,0x13,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xa6,0x02,0x1c,0xbe,0x8e,0xad,0x9d,0xfe,0x86,0x04,0x75,0xeb,0xbf,0xe9,0xfb,0xda,0xcf,0x64,0x04,0xa4,0xa4,0xa5,0x7b,0x98,0xac,0xa5,0x88,0x8a,0xad,0x01,0xe4,0x02,0x34,0x48,0xa4,0x60,0xfe,0x6e,0x70,0xc4,0xfe,0xef,0xe6,0xfe,0xfb,0xfe,0xcc,0xa6,\r\n0x8e,0x02,0x31,0x97,0x7a,0xae,0xdd,0xc7,0xab,0xcd,0xc4,0x00,0x00,0x01,0x00,0x7a,0x01,0xf6,0x03,0x37,0x05,0x9a,0x00,0x0b,0x00,0x3b,0x40,0x23,0x03,0x54,0x3f,0x08,0x4f,0x08,0x5f,0x08,0x8f,0x08,0x9f,0x08,0xaf,0x08,0x06,0x08,0x08,0x06,0x01,0x05,0x05,0x0c,0x0a,0x06,0x03,0x00,0x50,0x09,0x01,0x01,0x0d,0x08,0x04,0x50,0x05,0x2f,\r\n0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x33,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x03,0x37,0x6d,0xfe,0x1d,0x6d,0x6d,0x01,0xe3,0x6d,0x01,0xf6,0x01,0xa9,0xfe,0x57,0x03,0xa4,0xfe,0x67,0x01,0x99,0x00,0x00,0x02,0x00,0x60,0xfe,0x21,0x04,0x3f,\r\n0x04,0x00,0x00,0x26,0x00,0x3c,0x00,0x54,0x40,0x30,0x38,0x0e,0x00,0x07,0x00,0x24,0x10,0x24,0x40,0x24,0x50,0x24,0x04,0x24,0x24,0x07,0x2c,0x95,0x1a,0x1b,0x09,0x06,0x95,0x07,0x0f,0x0e,0x84,0x05,0x08,0x38,0x24,0x31,0x00,0x08,0x07,0x07,0x08,0x00,0x03,0x1f,0x15,0x83,0x31,0x31,0x3e,0x27,0x83,0x1f,0x2f,0xe1,0x12,0x39,0x2f,0xe1,\r\n0x11,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x12,0x39,0xe1,0x00,0x3f,0xed,0x39,0x3f,0xed,0x11,0x39,0x2f,0x5d,0x12,0x39,0x39,0x33,0x31,0x30,0x01,0x34,0x3e,0x02,0x37,0x21,0x35,0x21,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x03,0x14,0x1e,0x02,0x33,0x32,\r\n0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x27,0x0e,0x03,0x01,0xd9,0x1d,0x33,0x45,0x29,0xfe,0x40,0x03,0x2d,0x58,0x90,0x66,0x37,0x42,0x64,0x74,0x64,0x42,0x4f,0x8b,0xbf,0x70,0x5b,0xaa,0x83,0x4e,0x37,0x6a,0x9a,0x63,0x14,0x11,0xd1,0x31,0x54,0x70,0x3f,0x48,0x7f,0x5e,0x36,0x15,0x3a,0x67,0x51,0x21,0x19,0x6e,0x84,0x46,0x16,0x02,\r\n0x73,0x28,0x4d,0x43,0x37,0x12,0x8c,0x47,0x28,0x4f,0x4f,0x53,0x2d,0x32,0x4e,0x4c,0x53,0x6e,0x94,0x66,0x72,0xab,0x74,0x3a,0x37,0x6e,0xa5,0x6e,0x59,0x9b,0x85,0x70,0x2e,0x21,0x41,0xfd,0x87,0x4c,0x71,0x4b,0x25,0x27,0x4e,0x77,0x50,0x34,0x50,0x50,0x5c,0x3f,0x1a,0x17,0x36,0x6e,0x6e,0x6b,0xff,0xff,0x00,0x16,0xff,0xea,0x06,0xae,\r\n0x05,0xec,0x00,0x26,0x00,0x57,0x00,0x00,0x00,0x27,0x00,0x4b,0x02,0xb6,0x00,0x00,0x00,0x06,0x08,0x06,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x00,0x05,0x18,0x05,0x9a,0x00,0x03,0x00,0x09,0xb2,0x03,0x03,0x02,0x00,0x2f,0x3f,0x31,0x30,0x01,0x01,0x23,0x01,0x05,0x18,0xfb,0xa2,0xa4,0x04,0x5e,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xff,0xff,\r\n0x00,0x4a,0x00,0x00,0x02,0x46,0x04,0x00,0x02,0x26,0x05,0x6f,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x0c,0xfd,0x17,0x00,0x15,0x40,0x0e,0x01,0x0c,0x2f,0x0c,0x4f,0x0c,0x02,0xaf,0x0c,0xcf,0x0c,0xff,0x0c,0x03,0x00,0x5d,0x71,0x11,0x35,0x00,0xff,0xff,0xff,0xfb,0xff,0xf4,0x02,0x08,0x04,0x00,0x02,0x26,0x01,0xc9,0x00,0x00,0x01,0x07,\r\n0x00,0xd9,0xff,0xbd,0xfd,0x17,0x00,0x15,0x40,0x0e,0x01,0x2f,0x0e,0x4f,0x0e,0x02,0xaf,0x0e,0xcf,0x0e,0xff,0x0e,0x03,0x0e,0x00,0x11,0x5d,0x71,0x35,0x00,0x00,0x03,0x00,0x22,0xfe,0x29,0x04,0xd5,0x04,0x18,0x00,0x19,0x00,0x23,0x00,0x2c,0x00,0x4b,0x40,0x29,0x14,0x21,0x05,0xe2,0x11,0x2a,0x06,0x06,0x1c,0x0a,0x26,0x95,0x0d,0x10,\r\n0x08,0x0f,0x00,0x1c,0x95,0x18,0x16,0x03,0x1b,0x13,0x13,0x11,0x14,0x83,0x2b,0x20,0x20,0x2e,0x07,0x0a,0x2a,0x21,0x04,0x02,0x84,0x05,0x03,0x2f,0xc6,0xe1,0x17,0x39,0x12,0x39,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x23,0x11,0x23,0x11,\r\n0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x16,0x17,0x33,0x15,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x15,0x14,0x01,0x26,0x23,0x22,0x07,0x06,0x07,0x21,0x26,0x01,0x4e,0x04,0xa4,0x84,0x84,0xa4,0x04,0x79,0xe9,0xc6,0x6f,0x65,0x09,0x82,0x84,0x0f,0x6b,0x7d,0xd9,0xc7,0x1e,0x53,0x7f,\r\n0x95,0x54,0x45,0x0d,0xfd,0xa1,0x02,0x13,0x4f,0x87,0x8f,0x57,0x51,0x06,0x02,0x61,0x08,0x94,0xfd,0x95,0x03,0xaf,0x6d,0x01,0xbb,0xb4,0xcc,0x8a,0x7d,0xcc,0x6d,0xd1,0x85,0x9a,0xe2,0x58,0x72,0x5c,0x98,0x36,0x7f,0x02,0x0a,0x61,0x64,0x5d,0x88,0x91,0x00,0x02,0x00,0x22,0xff,0xe8,0x04,0x24,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0x3b,\r\n0x40,0x1e,0x01,0x17,0x08,0xe2,0x11,0x0d,0x09,0x09,0x0f,0x0b,0x0f,0x13,0x95,0x04,0x16,0x12,0x12,0x01,0x16,0x10,0x84,0x0f,0x0f,0x1b,0x09,0x17,0x07,0x0c,0x84,0x0b,0x2f,0xe1,0x39,0x39,0xc6,0x12,0x39,0x2f,0xf1,0x39,0x39,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0x33,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x01,0x23,0x15,0x10,0x21,\r\n0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x01,0x32,0x11,0x35,0x21,0x15,0x10,0x04,0x24,0x6e,0xfe,0x64,0xfe,0x76,0x6e,0x6e,0xa1,0x01,0xe3,0xa2,0x6e,0xfd,0xff,0xf1,0xfe,0x1d,0x01,0xd8,0x32,0xfe,0x42,0x01,0xb2,0x3e,0x6d,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xfe,0x2d,0x01,0x2a,0x3c,0x36,0xfe,\r\n0xd0,0x00,0x00,0x02,0x00,0x14,0xff,0xe8,0x04,0xae,0x04,0x00,0x00,0x1e,0x00,0x27,0x00,0x5e,0x40,0x31,0x12,0x26,0x1a,0xe2,0x0f,0x06,0x1d,0x1d,0x21,0x04,0x09,0x0d,0x03,0x01,0x95,0x0a,0x02,0x0f,0x21,0x95,0x16,0x16,0x0d,0x12,0x09,0x00,0x1a,0x04,0x09,0x04,0x12,0x1a,0x11,0x11,0x0c,0x0f,0x12,0x84,0x07,0x25,0x25,0x29,0x06,0x26,\r\n0x84,0x01,0x1d,0x07,0x1a,0x2f,0xcd,0x33,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0x32,0x32,0xc1,0x2f,0x11,0x12,0x39,0x39,0x2f,0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0xed,0x17,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x01,0x23,0x35,0x21,0x15,0x06,0x07,0x21,0x26,0x27,0x35,0x21,0x15,0x23,0x16,0x17,\r\n0x33,0x15,0x23,0x06,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x23,0x35,0x33,0x36,0x13,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x16,0x01,0x1c,0xbc,0x01,0x7f,0xba,0x1c,0x02,0xb0,0x1c,0xb9,0x01,0x7e,0xb8,0x95,0x1c,0x53,0x4c,0x04,0x86,0x8a,0xf2,0xed,0x88,0x85,0x02,0x4c,0x54,0x1e,0xdc,0x5f,0xa1,0xa6,0x5b,0x54,0x06,0xfd,0x47,0x07,0x03,\r\n0x74,0x8c,0x8e,0x55,0xd8,0xd8,0x55,0x8e,0x8c,0x6f,0xc0,0x6d,0xda,0x89,0x8d,0x8b,0x89,0xdc,0x6d,0xbe,0xfd,0xd8,0x69,0x66,0x5e,0xa2,0x9c,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x04,0x54,0x05,0xec,0x02,0x26,0x00,0x45,0x00,0x00,0x00,0x07,0x08,0x5b,0x03,0x05,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x96,0x04,0xa9,0x05,0xec,0x02,0x26,\r\n0x00,0x47,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0xd2,0x00,0x00,0x00,0x09,0xb3,0x02,0x2a,0x2a,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x35,0xfe,0x96,0x02,0xa0,0x06,0x02,0x02,0x26,0x00,0x49,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x49,0x00,0x00,0x00,0x09,0xb3,0x01,0x21,0x21,0x09,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,\r\n0xfe,0x1e,0x05,0xfc,0x04,0x18,0x02,0x26,0x00,0x4a,0x00,0x00,0x00,0x27,0x08,0x5d,0x05,0x25,0x00,0x00,0x01,0x07,0x08,0x60,0x03,0xc2,0xfb,0x74,0x00,0x1b,0x40,0x0c,0x02,0x32,0x32,0x33,0x02,0x26,0x26,0x36,0x03,0x35,0x35,0x18,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,\r\n0x03,0xf9,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0x22,0x00,0x00,0x00,0x09,0xb3,0x01,0x0d,0x0d,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5c,0xfe,0x96,0x01,0xe3,0x05,0xec,0x02,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x0c,0x00,0x00,0x00,0x09,0xb3,0x01,0x10,0x10,0x00,0x10,0x3c,0x12,\r\n0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x06,0xed,0x04,0x18,0x02,0x26,0x00,0x50,0x00,0x00,0x01,0x07,0x08,0x5d,0x06,0x16,0x00,0x00,0x00,0x09,0xb3,0x01,0x2c,0x2c,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x96,0x04,0x91,0x04,0x18,0x02,0x26,0x00,0x51,0x00,0x00,0x01,0x07,0x08,0x5d,0x03,0xba,0x00,0x00,0x00,0x09,\r\n0xb3,0x01,0x1f,0x1f,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0xa6,0xfe,0x29,0x04,0x54,0x04,0x18,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x08,0x5b,0x03,0x05,0x00,0x00,0xff,0xff,0x00,0x5c,0xfe,0x96,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x01,0x07,0x08,0x5d,0x01,0x0c,0x00,0x00,0x00,0x09,0xb3,0x01,0x1d,0x1d,\r\n0x06,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x68,0xfe,0x96,0x03,0xad,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x27,0x08,0x5d,0x02,0xd6,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0x73,0xfb,0x27,0x00,0x11,0xb7,0x02,0x3d,0x42,0x2d,0x01,0x30,0x30,0x3f,0x10,0x3c,0x12,0x34,0x00,0x10,0xf4,0x34,0x00,0xff,0xff,0xff,0x92,0xfe,0x1e,\r\n0x03,0x4b,0x06,0x02,0x00,0x26,0x05,0x88,0x00,0x00,0x00,0x27,0x08,0x5d,0x02,0x74,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0x11,0xfb,0x74,0x00,0x1b,0x40,0x0c,0x01,0x22,0x22,0x24,0x01,0x17,0x17,0x26,0x02,0x25,0x25,0x04,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x0e,0xfe,0x96,0x04,0x06,\r\n0x04,0x00,0x02,0x26,0x00,0x59,0x00,0x00,0x00,0x27,0x08,0x5d,0x03,0x2f,0x00,0x00,0x01,0x07,0x08,0x60,0x01,0xcc,0xfb,0x3f,0x00,0x12,0xb7,0x02,0x1a,0x1a,0x02,0x01,0x0c,0x0c,0x1c,0x10,0x3c,0x12,0x34,0x00,0x10,0x3c,0x12,0x34,0xff,0xff,0x00,0x1a,0xfe,0x96,0x03,0x92,0x04,0x00,0x02,0x26,0x00,0x5b,0x00,0x00,0x01,0x07,0x08,0x5d,\r\n0x02,0xbb,0x00,0x00,0x00,0x09,0xb3,0x01,0x14,0x14,0x02,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x21,0xfe,0x96,0x03,0x70,0x04,0x00,0x02,0x26,0x00,0x5d,0x00,0x00,0x01,0x07,0x08,0x5d,0x02,0x93,0x00,0x00,0x00,0x09,0xb3,0x01,0x0a,0x0a,0x03,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5a,0xfe,0x96,0x04,0x71,0x04,0x18,0x02,0x26,\r\n0x00,0x44,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0xc1,0x00,0x00,0x00,0x09,0xb3,0x02,0x20,0x20,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,0xfe,0x96,0x04,0xfe,0x04,0x18,0x02,0x26,0x05,0x57,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x4e,0x00,0x00,0x00,0x09,0xb3,0x02,0x1e,0x1e,0x00,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,\r\n0xfe,0x96,0x05,0x21,0x06,0x02,0x02,0x26,0x05,0x5d,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x4e,0x00,0x00,0x00,0x09,0xb3,0x02,0x27,0x27,0x05,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x60,0xfe,0xb4,0x04,0x84,0x04,0x18,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0xd4,0x00,0x1e,0x00,0x09,0xb3,0x02,0x1a,0x1a,0x06,0x10,\r\n0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x52,0xfe,0x96,0x04,0x29,0x04,0x19,0x02,0x26,0x01,0x31,0x00,0x00,0x01,0x07,0x08,0x5e,0x03,0x79,0x00,0x00,0x00,0x09,0xb3,0x01,0x26,0x26,0x25,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x50,0xfe,0x96,0x03,0x3b,0x04,0x19,0x02,0x26,0x02,0x0e,0x00,0x00,0x01,0x07,0x08,0x5e,0x01,0x27,0x00,0x00,\r\n0x00,0x09,0xb3,0x01,0x2d,0x2d,0x01,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x52,0xff,0xe8,0x05,0xe0,0x04,0x18,0x00,0x26,0x02,0xce,0x00,0x00,0x00,0x27,0x08,0x5e,0x05,0x30,0x01,0xf4,0x01,0x07,0x08,0x60,0x02,0x70,0xfc,0xdd,0x00,0x12,0xb7,0x02,0x1a,0x1a,0x00,0x03,0x29,0x29,0x00,0x00,0x10,0x3c,0x12,0x34,0x10,0x3c,0x12,0x34,\r\n0xff,0xff,0x00,0x90,0xfe,0x96,0x02,0xd1,0x05,0xd9,0x02,0x26,0x00,0x4c,0x00,0x00,0x01,0x07,0x08,0x5e,0x02,0x21,0x00,0x00,0x00,0x09,0xb3,0x02,0x1c,0x1c,0x0f,0x10,0x3c,0x12,0x34,0x00,0xff,0xff,0x00,0x5a,0xfe,0x96,0x03,0x5a,0x04,0x18,0x02,0x26,0x05,0x5a,0x00,0x00,0x01,0x07,0x08,0x5e,0x01,0x33,0x00,0x00,0x00,0x09,0xb3,0x01,\r\n0x21,0x21,0x01,0x10,0x3c,0x12,0x34,0x00,0x00,0x01,0xff,0x92,0xfe,0x1d,0x02,0x68,0x06,0x02,0x00,0x1f,0x00,0x28,0x40,0x15,0x17,0x95,0x09,0x0c,0x95,0x11,0x1c,0x02,0x95,0x1d,0x00,0x00,0x00,0x05,0x84,0x19,0x0e,0x09,0x83,0x15,0x19,0x2f,0xd6,0xe1,0xc4,0x10,0xf1,0xc2,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,\r\n0x23,0x22,0x15,0x11,0x14,0x07,0x06,0x07,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x02,0x68,0x32,0x3c,0xaa,0x5d,0x4c,0x7d,0x7f,0x3b,0x35,0x34,0x3d,0x7d,0x99,0x32,0x3c,0xac,0xb8,0x8e,0x4c,0x2a,0x05,0x5c,0x1b,0xdf,0xfc,0x71,0xa2,0x60,0x4d,0x0e,0x67,0x9d,\r\n0x1e,0x92,0x17,0xa0,0x8b,0x01,0x06,0x1a,0xdf,0x03,0x8d,0xa4,0xbe,0x12,0xff,0xff,0x00,0x90,0xfe,0x96,0x04,0xd0,0x04,0x00,0x02,0x26,0x00,0x58,0x00,0x00,0x01,0x07,0x08,0x5e,0x04,0x20,0x00,0x00,0x00,0x09,0xb3,0x01,0x13,0x13,0x00,0x10,0x3c,0x12,0x34,0x00,0x00,0x01,0xff,0xdd,0xfe,0x21,0x03,0x68,0x04,0x00,0x00,0x23,0x00,0x53,\r\n0x40,0x2f,0x09,0x96,0x11,0x11,0x0e,0x10,0x01,0x01,0x01,0x17,0x95,0x0f,0x03,0x1f,0x03,0x2f,0x03,0x03,0x03,0x10,0x0d,0x95,0x0e,0x0f,0x1d,0xec,0x21,0x1c,0x11,0x0c,0x0b,0x10,0x0b,0x10,0x0b,0x16,0x0e,0x14,0x83,0x06,0x06,0x25,0x0e,0x1f,0x19,0x83,0x01,0x2f,0xed,0xc4,0x2f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,\r\n0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x39,0x2f,0x5d,0xed,0xc6,0x5d,0x12,0x39,0x2f,0xed,0x31,0x30,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x23,0xa5,0xb1,0xae,0xdf,0xde,0xce,0x52,0x01,\r\n0x63,0xfd,0xdb,0x03,0x2d,0xfe,0x95,0xbc,0xea,0xfe,0xbc,0xf7,0x5f,0x58,0x7e,0x3c,0x34,0x34,0x3c,0x7f,0x98,0xb7,0x01,0x01,0x68,0x84,0x72,0x81,0x74,0x33,0x01,0x74,0x8c,0x33,0xfe,0x81,0x1a,0xb8,0xa0,0xae,0xd7,0x17,0x25,0x9d,0x1f,0x93,0x17,0x9f,0x00,0x02,0x00,0x66,0x02,0x89,0x02,0x88,0x04,0xcf,0x00,0x10,0x00,0x1b,0x00,0x48,\r\n0xb3,0x0e,0x02,0x05,0x13,0x41,0x0d,0x01,0x0d,0x00,0x0b,0x01,0x0b,0x00,0x10,0x01,0x0a,0x00,0x00,0x01,0x08,0x00,0x17,0x01,0x0d,0x00,0x05,0x01,0x09,0x00,0x08,0x01,0x0c,0x40,0x09,0x11,0x0e,0x01,0x15,0x15,0x1d,0x0f,0x02,0x1b,0xb9,0x01,0x0c,0x00,0x10,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0x11,0x33,0x33,0xed,0x00,0x3f,0xed,0x3f,\r\n0x3f,0x3f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x15,0x23,0x36,0x16,0x33,0x32,0x35,0x34,0x23,0x22,0x06,0x15,0x15,0x66,0x7e,0x03,0x35,0x70,0x6e,0x8e,0x81,0x68,0x76,0x42,0x03,0x7e,0x7e,0x52,0x42,0x8e,0x90,0x40,0x52,0x04,0xbe,0x43,0x54,0xab,0x84,0x80,0x97,\r\n0x61,0x50,0xb4,0x5e,0xb6,0xc2,0x5c,0x46,0x2e,0x00,0x00,0x01,0x00,0x3e,0x02,0x89,0x01,0xec,0x04,0xd1,0x00,0x15,0x00,0x32,0xb1,0x0b,0x0d,0xba,0x01,0x0d,0x00,0x08,0x01,0x09,0xb6,0xc0,0x15,0xd0,0x15,0x02,0x15,0x13,0xba,0x01,0x0d,0x00,0x02,0x01,0x0b,0xb3,0x0b,0x15,0x17,0x10,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x10,0xc6,0x32,\r\n0x00,0x3f,0xfd,0xc6,0x5d,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x01,0xec,0x42,0x5b,0x7b,0x96,0xa2,0x87,0x4b,0x3a,0x3a,0x42,0x50,0x60,0x5b,0x51,0x44,0x3c,0x02,0xb2,0x29,0x9b,0x7c,0x8a,0xa7,0x24,0x6c,0x2c,0x6c,0x58,0x56,0x66,\r\n0x31,0x00,0x00,0x02,0x00,0x3d,0x02,0x48,0x02,0x10,0x04,0xd1,0x00,0x1d,0x00,0x26,0x00,0x5b,0xb5,0x05,0x00,0x0a,0x1c,0x0d,0x0f,0xba,0x01,0x0d,0x00,0x0a,0x01,0x09,0x40,0x0d,0x25,0xbf,0x16,0x01,0x00,0x16,0x10,0x16,0x20,0x16,0x03,0x16,0x20,0xbb,0x01,0x0d,0x00,0x03,0x00,0x1c,0x01,0x0b,0x40,0x0f,0x03,0x05,0x00,0x03,0x03,0x19,\r\n0x07,0x1e,0x14,0x12,0x23,0x19,0x0d,0x28,0x12,0xb9,0x01,0x0c,0x00,0x07,0x2f,0xed,0x10,0xd4,0xd4,0xcd,0x11,0x39,0x39,0x11,0x12,0x17,0x39,0x2f,0x00,0x3f,0xc4,0xfd,0xd4,0x5d,0x5d,0xcd,0x3f,0xfd,0xc6,0x11,0x12,0x39,0x39,0x31,0x30,0x13,0x06,0x07,0x23,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0xdb,0x10,0x03,0x59,0x07,0x1c,0x55,0xa2,0x88,0x4b,0x3a,0x39,0x40,0x4f,0x64,0x21,0x4d,0x58,0x3d,0x4d,0x6d,0x54,0x45,0x0d,0x2d,0x24,0x1e,0x2f,0x3c,0x36,0x02,0x9e,0x27,0x2f,0x49,0x3d,0x4e,0x84,0x8a,0xa7,0x24,0x6c,0x2c,0x6d,\r\n0x59,0x4c,0x2a,0x4d,0x42,0x32,0x42,0x3f,0x71,0x13,0x0f,0x12,0x20,0x00,0x00,0x02,0x00,0x3e,0x02,0x8a,0x02,0x7f,0x05,0xd4,0x00,0x1c,0x00,0x27,0x00,0x62,0x40,0x10,0x16,0x14,0x17,0x02,0x1c,0x01,0x06,0x15,0x00,0x15,0x00,0x15,0x1a,0x06,0x09,0x1d,0xbe,0x01,0x0d,0x00,0x0f,0x01,0x09,0x00,0x23,0x01,0x0d,0x00,0x09,0x01,0x0b,0x40,\r\n0x10,0x01,0x1c,0x01,0x02,0x03,0x06,0x16,0x17,0x14,0x11,0x03,0x26,0x19,0x19,0x0c,0x06,0xb8,0x01,0x0c,0xb3,0x26,0x26,0x29,0x20,0xb9,0x01,0x0c,0x00,0x0c,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xc6,0x12,0x17,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0xc4,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x31,0x30,\r\n0x01,0x17,0x07,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x26,0x27,0x07,0x27,0x37,0x26,0x27,0x33,0x16,0x17,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x02,0x38,0x21,0x8a,0x22,0x22,0x6c,0x9d,0x86,0x86,0x98,0x9d,0x86,0x32,0x2c,0x02,0x28,0x2e,0xb6,0x1e,0x95,0x43,0x4f,0xa4,\r\n0x2a,0x2b,0x30,0x4d,0x58,0x56,0x4d,0x49,0x54,0x05,0xd4,0x47,0x37,0x26,0x2f,0x94,0xb8,0x83,0xa8,0x99,0x83,0x85,0xa5,0x16,0x02,0x40,0x32,0x48,0x49,0x3b,0x38,0x2e,0x17,0x26,0xfe,0xd1,0x64,0x57,0x53,0x62,0x64,0x53,0xb9,0x00,0x00,0x01,0x00,0x42,0x02,0x89,0x01,0xdf,0x04,0xcf,0x00,0x1e,0x00,0x55,0xb1,0x1d,0x0d,0xb8,0x01,0x0d,\r\n0x40,0x09,0x0e,0x0e,0x18,0x08,0xb0,0x15,0x01,0x15,0x13,0xbf,0x01,0x0d,0x00,0x18,0x01,0x09,0x00,0x06,0x00,0x08,0x01,0x0d,0x00,0x03,0x01,0x0b,0xb2,0x16,0x0e,0x1b,0xb8,0x01,0x0c,0xb6,0x11,0x0e,0x16,0x11,0x03,0x06,0x01,0xb8,0x01,0x0c,0xb3,0x0a,0x0a,0x20,0x06,0x2f,0x12,0x39,0x2f,0xed,0x12,0x17,0x39,0x2f,0xed,0x2f,0x2f,0x00,\r\n0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x71,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x00,0x15,0x14,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x01,0xdf,0xfb,0x59,0x49,0x3e,0x55,0x87,0x9e,0x32,0x30,0x8c,0x71,0x49,0x3e,0x40,0x4d,0x6d,\r\n0x81,0x67,0x03,0x9c,0x6f,0xa4,0x1b,0x64,0x1c,0x49,0x4c,0x63,0x47,0x41,0x1c,0x68,0x17,0x51,0x49,0x5a,0x1f,0x04,0x00,0x01,0x00,0x0a,0x02,0x9a,0x01,0x83,0x05,0xd3,0x00,0x14,0x00,0x33,0xb9,0x00,0x02,0x01,0x0d,0xb2,0x12,0x08,0x0c,0xbd,0x01,0x0d,0x00,0x05,0x00,0x0d,0x01,0x08,0x00,0x0a,0x01,0x0a,0x40,0x09,0x06,0x06,0x00,0x05,\r\n0x09,0xcd,0x0e,0x0c,0x0a,0x2f,0xc6,0x33,0xfd,0x32,0xc4,0x39,0x2f,0x00,0x3f,0x3f,0x33,0xed,0x32,0xd4,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x01,0x83,0x1b,0x22,0x60,0x82,0x82,0x80,0x5c,0x5c,0x79,0x62,0x2a,0x18,0x05,0x59,0x0f,0x61,0x49,0x6a,\r\n0xfe,0x46,0x01,0xba,0x6a,0x4d,0x62,0x66,0x0a,0x00,0x00,0x01,0xff,0xdd,0x01,0x94,0x01,0x56,0x04,0xbe,0x00,0x14,0x00,0x48,0x40,0x0b,0x0e,0x0c,0x0a,0xcd,0x09,0x06,0x06,0x00,0x05,0x09,0x09,0xba,0x01,0x08,0x00,0x02,0x01,0x0d,0x40,0x13,0x0f,0x12,0x1f,0x12,0x02,0x2f,0x12,0x3f,0x12,0x9f,0x12,0xaf,0x12,0xbf,0x12,0x05,0x12,0x0b,\r\n0x08,0xbb,0x01,0x0d,0x00,0x0e,0x00,0x05,0x01,0x0a,0x00,0x3f,0x33,0xed,0x32,0xd4,0x5d,0x71,0xed,0x3f,0x01,0x2f,0x33,0xc4,0x39,0x2f,0x10,0xfd,0xc6,0x33,0x31,0x30,0x03,0x16,0x33,0x32,0x35,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x1b,0x22,0x60,0x82,0x82,0x80,0x5c,0x5c,0x79,0x62,\r\n0x2a,0x18,0x02,0x0e,0x0f,0x61,0x58,0x6a,0x01,0x9c,0xfe,0x64,0x6a,0x5c,0x62,0x66,0x0a,0x00,0xff,0xff,0x00,0x3e,0x01,0x94,0x02,0x60,0x04,0xcf,0x02,0x06,0x07,0xaf,0x00,0x00,0x00,0x01,0x00,0x5c,0x01,0xa4,0x02,0x46,0x04,0xbe,0x00,0x11,0x00,0x30,0x41,0x0a,0x00,0x0c,0x01,0x0d,0x00,0x01,0x00,0x05,0x01,0x0b,0x00,0x10,0x00,0x08,\r\n0x01,0x08,0x00,0x11,0x01,0x0c,0xb4,0x01,0x10,0x10,0x13,0x09,0xb9,0x01,0x0c,0x00,0x08,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x33,0x3f,0xc6,0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x02,0x46,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x80,0x01,0xa4,\r\n0x01,0x4c,0x67,0xe7,0x01,0x4e,0xfe,0xce,0x98,0x53,0x40,0x01,0x37,0x00,0x00,0x02,0x00,0x0f,0x02,0x9a,0x01,0x3f,0x05,0xc4,0x00,0x0b,0x00,0x13,0x00,0x48,0x40,0x19,0x01,0x05,0x0a,0x1f,0x06,0x01,0x06,0x40,0x0c,0x10,0x48,0x06,0x06,0x08,0x03,0x0c,0x0f,0x10,0x1f,0x10,0x2f,0x10,0x03,0x10,0x08,0xba,0x01,0x08,0x00,0x03,0x01,0x0a,\r\n0xb3,0x0b,0x12,0x0a,0x02,0xb8,0x01,0x0c,0xb3,0x0e,0x06,0x07,0x03,0x2f,0xc4,0xc4,0xc4,0xfd,0x32,0xc4,0xc4,0x00,0x3f,0x3f,0xd4,0x5d,0xcd,0x11,0x12,0x39,0x2f,0x2b,0x71,0x33,0xcd,0x32,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x03,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x01,0x3f,0x57,0x82,0x57,0x57,\r\n0x82,0x57,0x99,0x4e,0x50,0x4e,0x03,0x91,0xf7,0xf7,0x56,0xd7,0xd7,0x01,0x46,0x4c,0x4b,0x4b,0x4c,0x00,0x00,0x01,0x00,0x66,0x02,0x8b,0x01,0x72,0x04,0xbe,0x00,0x0b,0x00,0x1f,0x41,0x0a,0x00,0x05,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0b,0x00,0x06,0x01,0x0c,0x00,0x05,0x2f,0xfd,0xc6,0x00,0x3f,0xed,0x3f,0x31,\r\n0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x72,0x25,0x3c,0xab,0x82,0x50,0x22,0x18,0x02,0x9b,0x10,0xb5,0x01,0x7e,0xfe,0x8a,0x52,0x12,0x00,0x01,0x00,0x11,0x02,0x9a,0x01,0x51,0x04,0xbe,0x00,0x0b,0x00,0x2e,0xb1,0x0b,0x07,0xbf,0x01,0x0d,0x00,0x08,0x01,0x08,0x00,0x01,0x00,0x04,0x01,0x0d,0x00,0x03,\r\n0x01,0x0a,0xb2,0x0a,0x01,0x00,0xb8,0x01,0x0c,0xb2,0x07,0x04,0x05,0x2f,0xcd,0x32,0xfd,0xcd,0x32,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x13,0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0xf2,0x5f,0xfe,0xc0,0x5f,0x5f,0x01,0x40,0x5f,0x02,0xf0,0x56,0x56,0x01,0x78,0x56,0x56,0x00,0x00,0x01,0x00,0x11,0x02,0x9a,\r\n0x01,0x51,0x04,0xbe,0x00,0x13,0x00,0x44,0x40,0x09,0x01,0x09,0xcb,0x12,0x0a,0x0a,0x06,0x11,0x0d,0xbf,0x01,0x0d,0x00,0x0e,0x01,0x08,0x00,0x02,0x00,0x06,0x01,0x0d,0x00,0x05,0x01,0x0a,0xb4,0x00,0x0f,0x03,0x12,0x02,0xb8,0x01,0x0c,0xb4,0x0e,0x0a,0x06,0x0b,0x07,0x2f,0x33,0xcd,0x32,0x32,0xfd,0x32,0xcd,0x32,0x32,0x00,0x3f,0xed,\r\n0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x01,0x49,0x57,0x5f,0xfe,0xc0,0x5f,0x57,0x57,0x5f,0x01,0x40,0x5f,0x57,0x03,0x91,0xa1,0x56,0x56,0xa1,0x56,0x81,0x56,0x56,0x81,0x00,0x00,0x03,0xff,0x87,0x01,0x94,\r\n0x01,0x6d,0x05,0xc4,0x00,0x11,0x00,0x19,0x00,0x21,0x00,0x51,0x40,0x1f,0x02,0x00,0x14,0x0f,0x0c,0x00,0x0a,0x18,0x00,0x18,0x40,0x04,0x50,0x04,0x02,0x2f,0x04,0x3f,0x04,0x02,0x04,0x1a,0x0f,0x1e,0x1f,0x1e,0x2f,0x1e,0x03,0x1e,0x0d,0xb8,0x01,0x0a,0xb3,0x11,0x20,0x02,0x0e,0xb8,0x01,0x0c,0xb5,0x1c,0x0d,0x16,0x07,0x12,0x0d,0x2f,\r\n0x33,0xd4,0xcd,0x10,0xc4,0xfd,0x32,0xc4,0xc6,0x00,0x3f,0xd4,0x5d,0xcd,0x2f,0x5d,0x5d,0xcd,0xc4,0x10,0xd4,0x11,0x39,0x39,0xcd,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x11,0x16,0x17,0x25,0x26,0x23,0x22,0x15,0x14,0x33,0x32,0x13,0x22,0x35,0x34,0x33,0x32,0x15,0x14,0x01,\r\n0x6d,0x45,0x47,0x23,0xb1,0x3a,0x4c,0x65,0x52,0x15,0x13,0x82,0x44,0x41,0xfe,0xf9,0x14,0x14,0x58,0x32,0x4b,0x43,0x4e,0x50,0x4e,0x01,0xcf,0x39,0x1c,0x90,0x42,0x33,0x3b,0x4f,0x02,0x02,0x2d,0xfd,0xbb,0x18,0x2e,0x0b,0x03,0x33,0x27,0x03,0x46,0x4c,0x4b,0x4b,0x4c,0x00,0x00,0x01,0x00,0x66,0x01,0x98,0x01,0x72,0x05,0xc4,0x00,0x0b,\r\n0x00,0x1b,0xbb,0x00,0x05,0x01,0x07,0x00,0x09,0x01,0x0d,0xb2,0x02,0x0b,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xfd,0xc6,0x00,0x2f,0xed,0x3f,0x31,0x30,0x01,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x01,0x72,0x25,0x3c,0xab,0x82,0x50,0x22,0x18,0x01,0xa8,0x10,0xb5,0x03,0x77,0xfc,0x91,0x52,0x12,0x00,0x01,0x00,0x31,\r\n0x01,0xcb,0x01,0x3d,0x05,0xc4,0x00,0x0e,0x00,0x38,0xbb,0x00,0x00,0x01,0x07,0x00,0x0b,0x01,0x0d,0xb3,0x50,0x06,0x01,0x06,0xb8,0xff,0xc0,0xb5,0x09,0x0c,0x48,0x06,0x02,0x0e,0xbf,0x01,0x0a,0x00,0x09,0x00,0x03,0x01,0x0c,0x00,0x0d,0x00,0x01,0x01,0x0c,0x00,0x00,0x2f,0xfd,0xd5,0xfd,0xc4,0x00,0x3f,0xd5,0xd4,0x2b,0x71,0xed,0x3f,\r\n0x31,0x30,0x13,0x33,0x11,0x33,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x23,0x66,0x80,0x57,0x64,0x63,0x25,0x20,0x1d,0x23,0x59,0x0a,0x6e,0x05,0xc4,0xfc,0xf3,0x6f,0x7d,0x0b,0x61,0x10,0x73,0x00,0x00,0x01,0x00,0x66,0x02,0x96,0x01,0xb4,0x04,0xc4,0x00,0x05,0x00,0x20,0xbb,0x00,0x02,0x01,0x06,0x00,0x04,0x01,0x0d,0xb5,\r\n0x01,0xff,0x00,0x00,0x07,0x04,0xb9,0x01,0x0c,0x00,0x01,0x2f,0xed,0x12,0x39,0x2f,0x00,0x3f,0xed,0x3f,0x31,0x30,0x01,0x21,0x11,0x33,0x13,0x33,0x01,0xb3,0xfe,0xb3,0x7f,0x01,0xce,0x02,0x96,0x02,0x2e,0xfe,0x3c,0x00,0x00,0x01,0x00,0x66,0x01,0x98,0x03,0x9a,0x04,0xcf,0x00,0x25,0x00,0x65,0xb9,0x00,0x24,0x01,0x0d,0x40,0x09,0x1f,\r\n0x1d,0x00,0x08,0x13,0x18,0x05,0x16,0x10,0xba,0x01,0x0a,0x00,0x11,0x01,0x08,0xb2,0x1a,0x03,0x0b,0xba,0x01,0x0d,0x00,0x16,0x01,0x09,0xb3,0x18,0x07,0x13,0x1d,0xb8,0x01,0x0c,0x40,0x0a,0x40,0x22,0x00,0x0e,0x08,0x10,0x08,0x42,0x13,0x0f,0xbb,0x01,0x0c,0x00,0x10,0x00,0x07,0x01,0x0c,0xb3,0x08,0x08,0x27,0x26,0x11,0x12,0x39,0x2f,\r\n0xed,0x2f,0xed,0x32,0x2b,0x01,0x18,0x10,0xf4,0xc6,0x1a,0xed,0x11,0x12,0x39,0x00,0x3f,0xed,0x39,0x39,0x3f,0x3f,0x12,0x17,0x39,0xd4,0xed,0x31,0x30,0x01,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x15,0x11,0x02,0x23,0x22,0x27,0x35,\r\n0x16,0x33,0x32,0x03,0x1a,0x68,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x01,0xd9,0x2b,0x25,0x22,0x23,0x65,0x02,0x9a,0x01,0x3b,0x8f,0x54,0x3f,0xfe,0xc9,0x01,0x3f,0x8b,0x52,0x45,0xfe,0xcd,0x02,0x24,0x52,0x63,0x6f,0x6f,0xe3,0xfe,0xba,0xfe,0xf2,0x10,0x68,0x14,0x00,0x00,0x01,0x00,0x60,\r\n0x01,0xa4,0x03,0x94,0x04,0xbe,0x00,0x1d,0x00,0x56,0xb4,0x07,0x18,0x02,0x03,0x10,0xb8,0x01,0x0d,0xb2,0x05,0x01,0x09,0xb8,0x01,0x0b,0xb2,0x1c,0x14,0x0c,0xb8,0x01,0x08,0xb3,0x07,0x01,0x14,0x1d,0xb8,0x01,0x0c,0x40,0x09,0x40,0x01,0x1c,0x0e,0x14,0x0c,0x14,0x42,0x0d,0xbb,0x01,0x0c,0x00,0x0c,0x00,0x15,0x01,0x0c,0xb3,0x14,0x14,\r\n0x1f,0x1e,0x11,0x12,0x39,0x2f,0xed,0x2f,0xed,0x2b,0x01,0x18,0x10,0xf4,0x32,0x1a,0xed,0x11,0x12,0x39,0x00,0x3f,0x33,0x33,0x3f,0xc6,0x33,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x11,0x23,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0x94,\r\n0x7e,0x02,0x38,0x72,0x77,0x28,0x3d,0x7c,0xb2,0x7f,0x69,0x31,0x41,0x80,0x68,0x32,0x40,0x80,0x01,0xa4,0x01,0x48,0x63,0x6f,0x6f,0xe3,0x01,0x52,0xfe,0xc5,0x8f,0x54,0x3f,0x01,0x37,0xfe,0xc1,0x8b,0x52,0x46,0x01,0x32,0x00,0x01,0xff,0xbc,0x01,0x98,0x02,0x50,0x04,0xcf,0x00,0x19,0x00,0x3e,0xb1,0x0c,0x16,0xbe,0x01,0x0d,0x00,0x0f,\r\n0x01,0x09,0x00,0x0a,0x01,0x08,0x00,0x07,0x01,0x0d,0xb3,0x02,0x00,0x09,0x13,0xba,0x01,0x0a,0x00,0x12,0x01,0x0c,0xb4,0x13,0x13,0x1b,0x0b,0x00,0xb8,0x01,0x0c,0xb1,0x05,0x09,0x2f,0xc6,0xed,0x32,0x12,0x39,0x2f,0xed,0x00,0x3f,0x33,0x33,0xd4,0xed,0x3f,0x3f,0xed,0x32,0x31,0x30,0x13,0x10,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,\r\n0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x06,0x15,0xe6,0xda,0x2b,0x25,0x22,0x23,0x65,0x80,0x02,0x3b,0x79,0xb4,0x7f,0x6d,0x39,0x45,0x02,0xa6,0xfe,0xf2,0x10,0x68,0x14,0x9e,0x02,0x24,0x56,0x67,0xe7,0xfe,0xb2,0x01,0x33,0x97,0x54,0x3f,0x00,0x01,0x00,0x66,0x01,0x98,0x02,0xfa,0x04,0xcf,0x00,0x19,\r\n0x00,0x3f,0xb1,0x14,0x0c,0xbe,0x01,0x0d,0x00,0x17,0x01,0x09,0x00,0x12,0x01,0x08,0x00,0x02,0x01,0x0d,0xb3,0x07,0x00,0x09,0x11,0xbb,0x01,0x0a,0x00,0x04,0x00,0x00,0x01,0x0c,0xb4,0x09,0x09,0x1b,0x13,0x10,0xb9,0x01,0x0c,0x00,0x11,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xc6,0x00,0x3f,0x33,0x33,0xd4,0xed,0x3f,0x3f,0xed,0x32,0x31,\r\n0x30,0x01,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x11,0x11,0x34,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x65,0x23,0x22,0x25,0x2b,0xd9,0x6d,0x39,0x45,0x80,0x80,0x02,0x3b,0x79,0xb4,0x02,0x9a,0x9e,0x14,0x68,0x10,0x01,0x0e,0x01,0x27,0x97,0x54,0x3f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,\r\n0x00,0x01,0x00,0x66,0x02,0x9a,0x02,0x6a,0x04,0xbe,0x00,0x13,0x00,0x26,0xbd,0x00,0x0a,0x01,0x08,0x00,0x09,0x01,0x0a,0x00,0x00,0x01,0x0c,0xb5,0x01,0x11,0x11,0x15,0x0b,0x08,0xb9,0x01,0x0c,0x00,0x09,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x00,0x3f,0x3f,0x31,0x30,0x01,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,\r\n0x13,0x16,0x17,0x33,0x26,0x35,0x11,0x33,0x02,0x6a,0x7f,0xea,0x14,0x07,0x02,0x02,0x80,0x84,0xe5,0x12,0x09,0x02,0x04,0x82,0x02,0x9a,0x01,0x4d,0x1c,0x0d,0x1d,0x2a,0xfe,0xd1,0x02,0x24,0xfe,0xbc,0x18,0x12,0x1c,0x22,0x01,0x30,0x00,0x03,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xcf,0x00,0x0b,0x00,0x14,0x00,0x1d,0x00,0x3f,0xb9,0x00,\r\n0x13,0x01,0x0d,0xb3,0x19,0x19,0x0e,0x15,0xbe,0x01,0x0d,0x00,0x06,0x01,0x09,0x00,0x0e,0x01,0x0d,0x00,0x00,0x01,0x0b,0xb3,0x1a,0x19,0x13,0x09,0xb8,0x01,0x0c,0xb3,0x12,0x12,0x1f,0x13,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x16,0x33,0x32,0x37,0x36,0x37,0x21,0x16,0x13,0x22,0x07,0x06,0x07,0x21,0x26,0x27,0x26,0x01,0x58,0x80,0x9a,0xa2,0x84,0x80,0x9b,0xa3,0xf2,0x2c,0x48,0x49,0x2b,0x21,0x08,0xfe,0xc5,0x08,0x96,0x49,0x2c,0x1d,0x0a,0x01,0x38,0x0a,0x1e,0x2b,0x02,0x89,0x9e,0x7f,0x87,0xa2,0x9f,0x7e,\r\n0x88,0xa1,0x97,0x2c,0x2c,0x21,0x40,0x40,0x01,0x23,0x2c,0x1e,0x36,0x37,0x1e,0x2b,0x00,0x03,0x00,0x3e,0x01,0xa4,0x02,0xb1,0x05,0xc4,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x54,0xb1,0x1c,0x26,0xb8,0x01,0x0d,0xb2,0x0c,0x0a,0x09,0xbb,0x01,0x09,0x00,0x1d,0x00,0x25,0x01,0x0d,0xb5,0x14,0x40,0x00,0x01,0x00,0x01,0xb8,0x01,0x0b,0xb2,\r\n0x0c,0x1d,0x15,0xb8,0x01,0x0c,0xb5,0x09,0x25,0x00,0x00,0x05,0x10,0xb8,0x01,0x0c,0xb3,0x18,0x18,0x29,0x21,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x00,0x3f,0xcd,0x5d,0x33,0xed,0x32,0x3f,0xcd,0x33,0xed,0x32,0x31,0x30,0x01,0x35,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,\r\n0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x13,0x36,0x35,0x34,0x27,0x26,0x27,0x11,0x36,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x06,0x01,0x36,0x6e,0x3d,0x4d,0x51,0x3d,0x6a,0x82,0x6e,0x3d,0x4e,0x52,0x3e,0x69,0x4c,0x2c,0x2c,0x1b,0x31,0x31,0xff,0x00,0x2b,0x2c,0x1b,0x31,0x31,0x01,0xa4,0xe8,0x0d,0x3f,0x4f,\r\n0x7f,0x87,0x51,0x3d,0x0f,0xfa,0xf8,0x0d,0x40,0x4f,0x7e,0x88,0x51,0x3d,0x0f,0xe9,0x01,0x81,0x31,0x56,0x58,0x30,0x1e,0x0b,0xfe,0x9d,0x0c,0x01,0x2d,0x31,0x56,0x56,0x31,0x1f,0x0c,0x01,0x63,0x0b,0x00,0x01,0x00,0x42,0x01,0xe2,0x01,0xa1,0x04,0xd1,0x00,0x2b,0x00,0x4f,0xb1,0x03,0x08,0xb8,0xff,0xc0,0x40,0x0b,0x0c,0x12,0x48,0x08,\r\n0x10,0x27,0x16,0x21,0x04,0x19,0x0e,0xbe,0x01,0x0d,0x00,0x2a,0x01,0x0b,0x00,0x1e,0x01,0x0d,0x00,0x19,0x01,0x09,0xb7,0x1b,0x21,0xcd,0x16,0x1b,0x16,0x0c,0x27,0xb8,0x01,0x0c,0xb5,0x10,0x10,0x2d,0x05,0x01,0x0c,0x2f,0xcd,0xc4,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0xed,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0xd4,0x2b,\r\n0xcd,0x31,0x30,0x13,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x97,0x4a,0x21,0x21,0x24,0x29,0x45,0x4f,0x3f,0x41,0x60,0x2b,0x3c,0x47,0x31,0x71,0x5a,\r\n0x44,0x36,0x31,0x3e,0x31,0x27,0x24,0x3d,0x48,0x37,0x6c,0x5f,0x24,0x02,0x92,0x12,0x53,0x13,0x4d,0x11,0x4e,0x47,0xa7,0x36,0x3b,0x20,0x29,0x1d,0x24,0x4c,0x37,0x45,0x5c,0x19,0x6f,0x29,0x23,0x18,0x21,0x27,0x1d,0x23,0x4e,0x36,0x47,0x5b,0x00,0x01,0xff,0xc9,0x01,0x94,0x01,0x83,0x05,0xd3,0x00,0x15,0x00,0x2d,0xbc,0x00,0x02,0x01,\r\n0x0d,0x00,0x13,0x00,0x0d,0x01,0x0d,0x40,0x0d,0x40,0x08,0x50,0x08,0x02,0x2f,0x08,0x3f,0x08,0x02,0x08,0x01,0x05,0xb8,0x01,0x0c,0xb1,0x0b,0x0f,0x2f,0xc6,0xfd,0xc6,0x00,0x2f,0x5d,0x5d,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x01,\r\n0x83,0x1b,0x22,0x60,0x79,0x62,0x2a,0x18,0x1b,0x22,0x60,0x79,0x62,0x2a,0x18,0x05,0x59,0x0f,0x61,0xfd,0x55,0x62,0x66,0x0a,0x70,0x0f,0x61,0x02,0xab,0x62,0x66,0x0a,0x00,0x01,0x00,0x0a,0x01,0xe2,0x01,0x68,0x05,0x62,0x00,0x1d,0x00,0x53,0xb1,0x08,0x03,0xb8,0xff,0xc0,0xb6,0x0c,0x11,0x48,0x03,0x0c,0x1d,0x1b,0xbb,0x01,0x0d,0x00,\r\n0x00,0x00,0x0c,0x01,0x0b,0xb4,0x14,0x15,0x18,0x15,0x0f,0xba,0x01,0x0d,0x00,0x12,0x01,0x08,0x40,0x0a,0x06,0x0a,0x17,0x1d,0x1d,0x1f,0x0f,0x18,0x0f,0x15,0xb8,0x01,0x0c,0xb1,0x11,0x12,0x2f,0xcd,0xed,0x39,0x39,0x11,0x12,0x39,0x2f,0xc4,0xcd,0xc4,0x00,0x3f,0xed,0x39,0x39,0x10,0xcd,0x3f,0x33,0xfd,0xc6,0x10,0xd4,0x2b,0xcd,0x31,\r\n0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0x23,0x22,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x15,0x33,0x15,0x23,0x15,0x14,0x33,0x32,0x37,0x01,0x68,0x4f,0x45,0x29,0x24,0x21,0x21,0x4a,0x0d,0xa0,0x5c,0x5c,0x80,0x82,0x82,0x49,0x1e,0x1b,0x02,0x77,0x47,0x4e,0x11,0x4d,0x13,0x53,0x0e,0xbe,0x01,0x08,0x6a,0x80,\r\n0x24,0xa4,0x6a,0xfe,0x5e,0x10,0x00,0x02,0x00,0x05,0x02,0x89,0x02,0x9d,0x04,0xbe,0x00,0x15,0x00,0x1d,0x00,0x59,0xb4,0x1b,0x1a,0x01,0x03,0x0a,0xb8,0x01,0x0d,0x40,0x09,0x14,0x10,0x5f,0x0d,0x01,0x0d,0x0d,0x12,0x0e,0xbf,0x01,0x08,0x00,0x04,0x00,0x16,0x01,0x0d,0x00,0x07,0x01,0x0b,0x00,0x03,0x01,0x0a,0xb5,0x15,0x1a,0x03,0x01,\r\n0x03,0x13,0xb8,0x01,0x0c,0xb5,0x12,0x12,0x1f,0x1c,0x0a,0x0f,0xb8,0x01,0x0c,0xb1,0x0c,0x0e,0x2f,0xc6,0xed,0x39,0x39,0x12,0x39,0x2f,0xfd,0x17,0x39,0xc6,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x33,0x39,0x2f,0x71,0x33,0x33,0xed,0x17,0x32,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x06,0x23,0x22,0x35,0x35,0x23,0x35,0x33,0x35,0x33,0x15,\r\n0x33,0x35,0x33,0x15,0x33,0x05,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x02,0x9d,0x57,0x80,0x02,0x3b,0x79,0xb4,0x57,0x57,0x7f,0xeb,0x80,0x57,0xfe,0xab,0x39,0x45,0xeb,0x03,0x91,0xf7,0x56,0x67,0xe7,0x21,0x56,0xd7,0xd7,0xd7,0xd7,0xf3,0x53,0x40,0x0a,0x05,0x98,0x00,0x01,0x00,0x3e,0x02,0x89,0x02,0x7f,0x04,0xbe,0x00,0x1b,0x00,0x4f,\r\n0xb4,0x04,0x0e,0x12,0x03,0x01,0xbf,0x01,0x0d,0x00,0x0f,0x00,0x02,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x17,0x01,0x0b,0x40,0x0c,0x12,0x14,0x0f,0x00,0x1a,0x03,0x0f,0x03,0x0c,0x06,0x10,0x14,0xb8,0x01,0x0c,0xb3,0x0c,0x0c,0x1d,0x06,0xb8,0x01,0x0c,0xb1,0x02,0x1a,0x2f,0xc4,0xed,0x12,0x39,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,\r\n0x12,0x39,0x2f,0x12,0x39,0x00,0x3f,0xed,0x3f,0x33,0xed,0x17,0x32,0x31,0x30,0x13,0x23,0x35,0x33,0x15,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0xad,0x6f,0xfa,0x7a,0x56,0x4b,0x4c,0x53,0x7a,0xfb,0x6e,0x6e,0x9b,0x89,0x84,0x99,0x04,0x54,0x6a,0x5b,0x31,\r\n0x83,0x5f,0x5c,0x59,0x62,0x83,0x31,0x5b,0x6a,0x41,0x74,0x7c,0x9a,0x97,0x7b,0x75,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x46,0x04,0xbe,0x00,0x0d,0x00,0x29,0xb1,0x0c,0x05,0xbe,0x01,0x08,0x00,0x09,0x01,0x0d,0x00,0x02,0x01,0x0b,0x00,0x0d,0x01,0x0c,0xb3,0x0c,0x0c,0x0f,0x06,0xb9,0x01,0x0c,0x00,0x05,0x2f,0xed,0x12,0x39,0x2f,0xed,\r\n0x00,0x3f,0xed,0x3f,0x33,0x31,0x30,0x01,0x14,0x23,0x22,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x02,0x46,0xfb,0xef,0x7f,0x76,0x75,0x80,0x03,0x79,0xf0,0xea,0x01,0x4b,0xfe,0xcf,0x99,0x95,0x01,0x35,0x00,0x00,0x01,0x00,0x5c,0x02,0x89,0x02,0x55,0x04,0xcf,0x00,0x17,0x00,0x33,0x41,0x0c,0x00,0x0a,0x01,0x0d,0x00,0x0f,\r\n0x00,0x00,0x01,0x08,0x00,0x04,0x01,0x0d,0x00,0x15,0x01,0x0b,0x00,0x0d,0x00,0x12,0x01,0x0c,0xb3,0x07,0x07,0x19,0x01,0xb9,0x01,0x0c,0x00,0x00,0x2f,0xed,0x12,0x39,0x2f,0xed,0xc4,0x00,0x3f,0xed,0x3f,0xd4,0xed,0x31,0x30,0x13,0x33,0x11,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x35,0x5c,0x7f,0x73,0x4d,0x39,0x1e,0x24,0x21,0x1e,0x23,0x2c,0x5e,0x55,0x86,0x89,0xea,0x04,0xbe,0xfe,0xc6,0x90,0x6b,0x56,0x63,0x4c,0x0f,0x6c,0x0e,0x99,0x7e,0x8a,0xa5,0xf3,0x00,0x01,0x00,0x0b,0x02,0x9a,0x02,0x36,0x04,0xbe,0x00,0x0b,0x00,0x17,0xbb,0x00,0x00,0x01,0x0a,0x00,0x01,0x01,0x08,0xb3,0x03,0x03,0x0d,0x00,\r\n0x2f,0x11,0x39,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x13,0x13,0x33,0x13,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x0b,0xc9,0x9b,0xc7,0x8a,0x78,0x0f,0x03,0x05,0x04,0x11,0x78,0x02,0x9a,0x02,0x24,0xfd,0xdc,0x01,0x72,0x2f,0x25,0x22,0x32,0xfe,0x8e,0x00,0x00,0x01,0x00,0x1a,0x02,0x9a,0x01,0xf5,0x04,0xbe,0x00,0x09,0x00,0x34,0xb1,0x05,\r\n0x01,0xbf,0x01,0x0d,0x00,0x04,0x01,0x0a,0x00,0x00,0x00,0x06,0x01,0x0d,0x00,0x09,0x01,0x08,0x40,0x0c,0x02,0x07,0x06,0x07,0x02,0x01,0x04,0x05,0x00,0x00,0x0b,0x05,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x23,0x35,0x21,0x01,0xf5,0xfe,0xe8,\r\n0x01,0x14,0xfe,0x29,0x01,0x18,0xf8,0x01,0xbb,0x04,0x86,0xfe,0x7e,0x6a,0x3a,0x01,0x80,0x6a,0x00,0x01,0x00,0x1a,0x01,0xe2,0x02,0x5a,0x04,0xbe,0x00,0x16,0x00,0x47,0xb1,0x04,0x09,0xb8,0xff,0xc0,0xb5,0x0c,0x10,0x48,0x09,0x10,0x16,0xbf,0x01,0x0d,0x00,0x0f,0x01,0x0a,0x00,0x15,0x00,0x11,0x01,0x0d,0x00,0x14,0x01,0x08,0x40,0x0f,\r\n0x06,0x0c,0x02,0x00,0x12,0x11,0x12,0x00,0x16,0x04,0x10,0x15,0x15,0x18,0x10,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0xd6,0xcd,0xc6,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0xd4,0x2b,0xcd,0x31,0x30,0x01,0x06,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x21,0x35,0x01,0x23,0x35,0x21,0x15,0x01,0x01,0xf1,\r\n0x23,0x4a,0x21,0x21,0x24,0x29,0x45,0x4f,0x04,0xfe,0x9d,0x01,0x18,0xf8,0x01,0xbb,0xfe,0xe8,0x03,0x04,0x41,0x43,0x53,0x13,0x4d,0x11,0x4e,0x47,0x11,0x12,0x3a,0x01,0x80,0x6a,0x38,0xfe,0x7e,0x00,0x00,0x02,0x00,0x1a,0x02,0x55,0x02,0x82,0x04,0xbe,0x00,0x17,0x00,0x1e,0x00,0x52,0xb6,0x1d,0x11,0x07,0x00,0x18,0x03,0x0d,0x41,0x09,\r\n0x01,0x0d,0x00,0x03,0x00,0x06,0x01,0x0a,0x00,0x0c,0x00,0x08,0x01,0x0d,0x00,0x0b,0x01,0x08,0x40,0x15,0x18,0x00,0x1b,0x02,0x0e,0x05,0x14,0x03,0x09,0x1b,0x14,0x08,0x09,0x0d,0x03,0x04,0x07,0x0c,0x0c,0x20,0x07,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0xd4,0xcd,0x2f,0x2f,0x12,0x39,0x39,0xcd,0x11,0x39,0x39,0x00,0x3f,0xed,0x39,0x3f,\r\n0xce,0xfd,0x17,0x39,0xd4,0xcd,0x31,0x30,0x01,0x06,0x07,0x23,0x36,0x37,0x23,0x35,0x01,0x23,0x35,0x21,0x15,0x01,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x36,0x35,0x34,0x23,0x22,0x01,0x4b,0x11,0x07,0x59,0x0b,0x0d,0xd8,0x01,0x18,0xf8,0x01,0xbb,0xfe,0xe8,0x3d,0x2b,0x72,0x44,0x45,0x42,0x60,0x58,0x48,0x54,\r\n0x51,0x2e,0x41,0x02,0x9a,0x26,0x1f,0x27,0x1e,0x3a,0x01,0x80,0x6a,0x38,0xfe,0x7e,0x4e,0x57,0x42,0x32,0x43,0x58,0x6a,0x02,0x2a,0x23,0x00,0x01,0xff,0xfb,0x01,0x94,0x01,0xf7,0x04,0xbe,0x00,0x18,0x00,0x4c,0xb1,0x0b,0x09,0xb8,0x01,0x0d,0xb6,0x11,0x11,0x03,0x10,0x0d,0xe2,0x0e,0xbb,0x01,0x08,0x00,0x01,0x00,0x03,0x01,0x0d,0x40,\r\n0x0d,0x17,0x11,0x0c,0x0f,0x0b,0x0b,0x0e,0x0f,0x0e,0x0f,0x0e,0x01,0x14,0xb8,0x01,0x0c,0xb3,0x06,0x06,0x1a,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0x00,0x2f,0xfd,0xc6,0x3f,0xed,0x39,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,\r\n0x37,0x21,0x35,0x21,0x15,0x03,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x05,0x5a,0x5a,0x5e,0x68,0x6c,0x65,0x28,0xa7,0xfe,0xec,0x01,0xc7,0xb3,0x55,0x7f,0xb2,0x8d,0x66,0x01,0xc0,0x76,0x38,0x4d,0x46,0x4a,0x44,0x3a,0xfb,0x6a,0x3a,0xfe,0xf7,0x0c,0x79,0x62,0x70,0x90,0x00,0x00,0x03,0x00,0x3e,0x02,0x89,0x02,0x7f,0x05,0xd3,0x00,0x0a,\r\n0x00,0x10,0x00,0x17,0x00,0x3f,0xb9,0x00,0x12,0x01,0x0d,0xb3,0x10,0x10,0x15,0x0d,0xbe,0x01,0x0d,0x00,0x06,0x01,0x07,0x00,0x15,0x01,0x0d,0x00,0x00,0x01,0x0b,0xb3,0x0b,0x10,0x12,0x08,0xb8,0x01,0x0c,0xb3,0x11,0x11,0x19,0x12,0xb9,0x01,0x0c,0x00,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x12,\r\n0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x13,0x02,0x23,0x22,0x06,0x07,0x05,0x21,0x16,0x16,0x33,0x32,0x36,0x01,0x58,0x85,0x95,0x9c,0x91,0x01,0x14,0x99,0x14,0x08,0x91,0x46,0x54,0x05,0x01,0x39,0xfe,0xc5,0x03,0x52,0x4a,0x48,0x51,0x02,0x89,0xd9,0xc5,0xcf,0xdd,0xfe,0x61,0xcc,0xdf,0x01,\r\n0xdd,0x01,0x02,0x8c,0x76,0x63,0x85,0x8a,0x8c,0x00,0x00,0x03,0xff,0x3e,0x04,0xba,0x00,0xc2,0x05,0xd3,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x27,0x40,0x11,0x00,0x07,0x40,0x0d,0x80,0x02,0x19,0x13,0x01,0x03,0x01,0x03,0x16,0x0a,0x04,0x10,0x16,0x2f,0xcd,0xd4,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xcd,0xc4,0x1a,0xdc,0x1a,0xcd,\r\n0xc4,0x31,0x30,0x03,0x05,0x07,0x25,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x6a,0x01,0x02,0x2e,0xfe,0xfe,0x01,0x5a,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0xfe,0xf2,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x05,0xd3,0xe7,0x32,0xe7,0x09,0x19,\r\n0x22,0x22,0x19,0x19,0x22,0x22,0xbc,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x00,0x03,0xff,0x3e,0x04,0xba,0x00,0xc2,0x05,0xd3,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x27,0x40,0x11,0x0d,0x40,0x03,0x07,0x80,0x01,0x13,0x19,0x00,0x02,0x00,0x02,0x04,0x10,0x16,0x0a,0x04,0x2f,0xcd,0xd4,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x00,0x2f,0xcd,0xc4,\r\n0x1a,0xdc,0xc4,0x1a,0xcd,0x31,0x30,0x13,0x05,0x27,0x25,0x05,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x05,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x98,0xfe,0xfe,0x2e,0x01,0x02,0xfe,0xd4,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x01,0x0e,0x22,0x19,0x19,0x22,0x22,0x19,0x19,0x22,0x05,0xa1,0xe7,\r\n0x32,0xe7,0x3b,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x8a,0x19,0x22,0x22,0x19,0x19,0x22,0x22,0x00,0x01,0xff,0x9c,0xfe,0x51,0x00,0x5b,0xff,0xc9,0x00,0x36,0x00,0x2c,0x40,0x15,0x30,0x1c,0x00,0x33,0x03,0x21,0x16,0x26,0x11,0x2b,0x0c,0x0c,0x11,0x16,0x1b,0x04,0x00,0x30,0x06,0x36,0x00,0x2f,0xcd,0xd4,0xcd,0x12,0x17,0x39,0x2f,0xcd,\r\n0x2f,0xcd,0x2f,0xcd,0x00,0x2f,0xcd,0xcd,0xc4,0x39,0x31,0x30,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x07,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x64,0x13,0x39,0x24,\r\n0x24,0x2b,0x0e,0x13,0x15,0x18,0x12,0x17,0x12,0x12,0x15,0x12,0x0f,0x17,0x1b,0x0b,0x01,0x1b,0x35,0x28,0x19,0x12,0x15,0x12,0x12,0x15,0x11,0x18,0x1d,0x18,0x11,0x0f,0x0f,0x18,0x04,0x87,0x2a,0x26,0x26,0x14,0x14,0x1d,0x0b,0x0c,0x13,0x08,0x07,0x0c,0x0f,0x17,0x11,0x10,0x15,0x12,0x10,0x0b,0x0b,0x0f,0x0c,0x08,0x04,0x0d,0x04,0x0c,\r\n0x15,0x10,0x0f,0x14,0x11,0x0f,0x0b,0x0a,0x11,0x12,0x15,0x0e,0x0f,0x17,0x14,0x13,0x0c,0x0a,0x0d,0x10,0x0b,0x00,0x00,0x01,0xfe,0xdd,0x04,0xd2,0x01,0x29,0x05,0xbc,0x00,0x19,0x00,0x19,0x40,0x0a,0x0d,0x40,0x0c,0x0c,0x19,0x80,0x05,0x14,0x0d,0x19,0x2f,0xc4,0x00,0x2f,0xcd,0x1a,0xcd,0x39,0x2f,0x1a,0xcd,0x31,0x30,0x03,0x14,0x1e,\r\n0x02,0x33,0x32,0x3e,0x04,0x33,0x17,0x22,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0xbe,0x0c,0x18,0x22,0x16,0x14,0x3a,0x43,0x48,0x44,0x3d,0x16,0x1b,0x19,0x40,0x47,0x4b,0x48,0x43,0x1b,0x29,0x45,0x31,0x1c,0x05,0x7b,0x10,0x29,0x26,0x1a,0x1b,0x28,0x2e,0x28,0x1b,0x29,0x1c,0x29,0x31,0x29,0x1c,0x36,0x4b,0x50,0x19,0xff,0xff,0x00,0x70,\r\n0xfe,0x3c,0x01,0x50,0x05,0xd1,0x02,0x27,0x00,0x11,0x00,0x00,0x00,0x8d,0x00,0x27,0x00,0x11,0x00,0x00,0xfe,0x52,0x00,0x27,0x00,0x11,0x00,0x00,0x02,0xca,0x00,0x07,0x00,0x11,0x00,0x00,0x05,0x06,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x1e,0x01,0x24,0x02,0x07,0x07,0xa5,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x35,\r\n0x01,0x24,0x02,0x07,0x07,0xab,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x3e,0xfe,0xde,0x02,0x7f,0x01,0x24,0x02,0x07,0x07,0xb4,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x12,0xfe,0xef,0x02,0x11,0x01,0x13,0x02,0x07,0x08,0x61,0x00,0x00,0xfc,0x55,0xff,0xff,0x00,0x48,0xfe,0xdc,0x02,0x40,0x01,0x26,0x02,0x07,0x07,0xac,0x00,0x00,0xfc,0x55,\r\n0x00,0x03,0x00,0x54,0xff,0x2f,0x03,0xf2,0x06,0x50,0x00,0x1c,0x00,0x27,0x00,0x2e,0x00,0x1f,0xb7,0x17,0x39,0x2d,0x28,0x22,0x2e,0x39,0x1c,0xb8,0x01,0x4d,0xb3,0x23,0x16,0x39,0x0f,0xb8,0x01,0x06,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0xed,0x31,0x30,0x05,0x23,0x37,0x2e,0x03,0x35,0x34,0x12,0x36,0x36,0x37,0x37,0x33,0x07,0x16,\r\n0x16,0x17,0x15,0x26,0x26,0x27,0x03,0x21,0x11,0x06,0x23,0x23,0x01,0x14,0x1e,0x02,0x17,0x13,0x0e,0x03,0x01,0x32,0x36,0x37,0x11,0x23,0x03,0x02,0x39,0x6d,0x13,0x64,0x95,0x62,0x30,0x43,0x83,0xc1,0x7f,0x11,0x6d,0x11,0x51,0x8e,0x39,0x3d,0x94,0x53,0x2e,0x01,0x65,0xb9,0xe1,0x0c,0xfe,0xb0,0x1b,0x39,0x5b,0x41,0x62,0x56,0x7f,0x54,\r\n0x29,0x01,0x67,0x43,0x7d,0x31,0xd4,0x28,0xd1,0xe2,0x15,0x6e,0xae,0xe9,0x8f,0xa5,0x01,0x07,0xbb,0x69,0x08,0xbe,0xbe,0x05,0x25,0x20,0xb0,0x2f,0x35,0x07,0xfd,0xe9,0xfd,0x94,0x7a,0x02,0xc0,0x70,0xb7,0x8a,0x5c,0x15,0x04,0x5e,0x0b,0x59,0x95,0xc9,0xfd,0x53,0x21,0x22,0x01,0x88,0xfe,0x35,0x00,0x03,0x00,0x0c,0x00,0x00,0x04,0x44,\r\n0x05,0x9a,0x00,0x17,0x00,0x1b,0x00,0x23,0x00,0x91,0x40,0x4d,0x06,0x03,0x02,0x17,0x16,0x07,0x16,0x23,0x22,0x21,0x1a,0x19,0x09,0x08,0x1c,0x08,0x1d,0x1e,0x1f,0x20,0x1b,0x18,0x0a,0x0b,0x1c,0x0b,0x14,0x11,0x10,0x0d,0x0c,0x15,0x0c,0x02,0x1b,0x11,0x92,0x17,0x20,0x14,0x06,0x0a,0x0d,0x92,0x03,0x18,0x00,0x10,0x10,0x10,0x80,0x10,\r\n0x03,0x10,0x10,0x14,0x1c,0x03,0x15,0x03,0x08,0x0c,0x01,0x05,0x13,0x0e,0x0e,0x15,0x16,0x1d,0x05,0x05,0x0c,0x07,0x07,0x25,0x0c,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x33,0x2f,0x33,0x00,0x2f,0x32,0x3f,0x17,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,\r\n0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x0e,0xc0,0xc0,0x05,0xc0,0x10,0x87,0xc0,0xc0,0xc0,0xc0,0x0e,0xc0,0xc0,0x10,0x87,0x05,0xc0,0xc0,0xc0,0xc0,0x01,0x15,0x23,0x17,0x33,0x15,0x23,0x13,0x23,0x03,0x21,0x03,0x23,0x13,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x13,0x01,0x21,0x27,0x21,0x13,0x23,0x06,0x07,0x03,0x33,0x03,0x26,0x04,\r\n0x2c,0xcd,0x39,0x94,0x68,0x80,0xba,0x76,0xfe,0x25,0x72,0xbb,0x7f,0x67,0x93,0x39,0xcc,0xf8,0xb5,0xad,0xb5,0xfe,0x2e,0x01,0x8a,0x34,0xfe,0xdd,0x92,0x03,0x08,0x0b,0x53,0xd1,0x55,0x09,0x03,0x5f,0x8d,0xb3,0x8d,0xfe,0x6e,0x01,0x92,0xfe,0x6e,0x01,0x92,0x8d,0xb3,0x8d,0x02,0x3b,0xfd,0xc5,0xfe,0xc0,0xb3,0x02,0x10,0x3d,0x23,0xfe,\r\n0xdd,0x01,0x23,0x1e,0x00,0x01,0x00,0x69,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x00,0x47,0x00,0x89,0xb1,0x01,0x2f,0xb8,0x01,0x05,0xb6,0x46,0x2f,0x30,0x01,0x30,0x09,0x26,0xb8,0x01,0x05,0x40,0x44,0x06,0xd0,0x27,0xe0,0x27,0x02,0x27,0x21,0x0e,0x35,0x44,0x27,0x30,0x06,0x3f,0x1c,0x3d,0x3c,0x3a,0x91,0x3f,0x04,0x17,0x00,0x16,0x10,0x16,\r\n0x20,0x16,0x03,0x16,0x11,0x91,0x1c,0x13,0x3c,0x09,0x06,0x01,0x46,0x04,0x44,0x0e,0x25,0x28,0x2e,0x31,0x3c,0x05,0x35,0x21,0x16,0x16,0x44,0x08,0x00,0x00,0x44,0x7d,0x35,0x35,0x49,0x48,0x30,0x27,0x0e,0x7d,0x21,0x2f,0xe1,0xc4,0x32,0x11,0x12,0x39,0x2f,0xf1,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x11,0x12,0x17,0x39,0x11,0x12,0x17,0x39,\r\n0x2f,0x00,0x3f,0xfd,0xc6,0x5d,0x32,0x3f,0xfd,0xc6,0x32,0x11,0x12,0x17,0x39,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0x33,0xed,0x32,0x31,0x30,0x01,0x23,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x21,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x23,0x35,0x33,\r\n0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x03,0xe2,0x6f,0x04,0x30,0x41,0x34,0x3a,0x01,0x52,0xfd,0xe2,0x24,0x1d,0x2d,0x33,0x99,0x9b,0x2d,0x6a,0x69,0x5f,0x22,0x1c,0x5d,0x68,0x64,0x22,0x66,0xb8,0x8d,0x53,0x1e,0x12,0x1a,\r\n0x54,0xc7,0x16,0x17,0x45,0x4d,0x2e,0x28,0xfe,0x24,0x02,0x80,0x19,0x0f,0x15,0x36,0x56,0x6e,0x37,0xc7,0x7f,0x61,0xd4,0x5d,0xb3,0x8c,0x56,0x1a,0x26,0x03,0x41,0x04,0x2f,0x27,0x1f,0x1f,0x6b,0x16,0x17,0x23,0x56,0x3a,0x6c,0x73,0x12,0x21,0x30,0x1e,0xc6,0x13,0x1f,0x15,0x0b,0x29,0x5c,0x93,0x6a,0x50,0x3e,0x25,0x21,0x6b,0x0f,0x0e,\r\n0x2a,0x26,0x17,0x14,0x6b,0x19,0x1e,0x28,0x37,0x3b,0x52,0x34,0x17,0x58,0xbd,0x33,0x2e,0x5e,0x91,0x62,0x4d,0x3a,0x00,0x02,0x00,0x56,0xff,0x2f,0x03,0xe6,0x06,0x50,0x00,0x18,0x00,0x21,0x00,0x4f,0x40,0x2d,0x13,0x20,0x15,0x91,0x0d,0x9f,0x0f,0xaf,0x0f,0x02,0x0f,0x10,0x04,0x20,0x18,0x01,0x18,0x1f,0x16,0x91,0x05,0x60,0x03,0x70,\r\n0x03,0x02,0x03,0x02,0x13,0x10,0x16,0x03,0x8c,0x0d,0x1f,0x04,0x04,0x09,0x13,0x00,0x00,0x23,0x1b,0x7e,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x00,0x3f,0xcd,0x5d,0x33,0xfd,0x32,0xc6,0x5d,0x3f,0xcd,0x5d,0x33,0xfd,0x32,0xc6,0x31,0x30,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x27,0x26,0x11,0x10,\r\n0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x01,0x06,0x11,0x10,0x17,0x16,0x17,0x11,0x06,0x03,0xe6,0x73,0xa7,0x68,0xe6,0x8d,0x9b,0xaf,0x8e,0xd1,0x68,0xad,0x6d,0x7d,0x9d,0xa4,0x76,0xfd,0x97,0x7f,0x77,0x5f,0x90,0x8a,0x3c,0x48,0x0a,0xbb,0xbb,0x11,0xb2,0xc5,0x01,0x40,0x01,0x58,0xd4,0xad,0x1f,0xa6,\r\n0x9e,0x01,0x3a,0xb3,0x55,0x01,0xfb,0x65,0x07,0x59,0x03,0x96,0xa5,0xfe,0xec,0xfe,0xfa,0x9c,0x7c,0x19,0x04,0x89,0x1f,0x00,0x00,0x02,0x00,0x42,0x00,0xc8,0x02,0x68,0x03,0x49,0x00,0x03,0x00,0x07,0x00,0x23,0x40,0x11,0x01,0x00,0x03,0x10,0x03,0x02,0x03,0x03,0x08,0x05,0x07,0x03,0x07,0x07,0x09,0x02,0x06,0x2f,0x33,0x12,0x39,0x2f,\r\n0x33,0x00,0x2f,0xcd,0x12,0x39,0x2f,0x5d,0xcd,0x31,0x30,0x01,0x05,0x35,0x25,0x35,0x05,0x35,0x25,0x02,0x68,0xfd,0xda,0x02,0x26,0xfd,0xda,0x02,0x26,0x01,0x9a,0xd2,0x83,0xd2,0xa9,0xd2,0x83,0xd2,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0xc1,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed,\r\n0x00,0x2f,0x2f,0xed,0x31,0x30,0x37,0x11,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0xc1,0xfe,0xfd,0x89,0x9f,0x17,0x93,0x1f,0x9d,0x01,0x03,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0x8f,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed,\r\n0x00,0x2f,0x2f,0xed,0x31,0x30,0x37,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0x8f,0xd1,0x89,0x9f,0x17,0x93,0x1f,0x9d,0xd1,0x00,0x01,0xff,0x50,0xfe,0x96,0x00,0xd7,0x00,0x35,0x00,0x0c,0x00,0x12,0xb7,0x09,0x95,0x04,0x00,0x00,0x84,0x07,0x0c,0x2f,0xc6,0xed,0x00,0x2f,\r\n0x2f,0xed,0x31,0x30,0x37,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x35,0xd7,0x98,0x7f,0x3c,0x34,0x34,0x3c,0x7e,0x35,0x77,0x89,0x9f,0x17,0x93,0x1f,0x9d,0x77,0x00,0x01,0xff,0x29,0xfe,0x96,0x00,0xb0,0x00,0x35,0x00,0x0c,0x00,0x12,0xb7,0x03,0x95,0x08,0x00,0x05,0x00,0x84,0x0c,0x2f,0xfd,0xc6,0x00,0x2f,0x2f,0xed,\r\n0x31,0x30,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x3e,0x7e,0x3c,0x34,0x34,0x3c,0x7f,0x98,0x35,0x77,0x9d,0x1f,0x93,0x17,0x9f,0x89,0x77,0x00,0x01,0x00,0x27,0x01,0x83,0x03,0xac,0x02,0x83,0x00,0x11,0x00,0x27,0x40,0x0c,0x09,0x0f,0x96,0x03,0x06,0x96,0x11,0x2f,0x0c,0x01,0x0c,0x00,0xbc,0x01,0x03,0x00,\r\n0x11,0x00,0x08,0x01,0x03,0x00,0x09,0x2f,0xed,0x2f,0xed,0x00,0x2f,0x5d,0xc6,0xfd,0xdc,0xed,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x24,0x23,0x22,0x15,0x23,0x34,0x36,0x33,0x32,0x04,0x33,0x32,0x35,0x03,0xac,0x60,0x7a,0x47,0xfe,0xc2,0x48,0x80,0x5e,0x60,0x7e,0x5f,0x01,0x34,0x36,0x7c,0x02,0x83,0x69,0x85,0x5f,0x71,0x6b,0x81,\r\n0x60,0x74,0x00,0x01,0x00,0x3e,0x04,0xc2,0x02,0x3a,0x05,0x4d,0x00,0x03,0x00,0x0d,0xb4,0x02,0x95,0x01,0x03,0x02,0x2f,0x2f,0x00,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x3a,0xfe,0x04,0x01,0xfc,0x04,0xc2,0x8b,0x00,0x01,0x00,0x12,0x02,0x9a,0x02,0x11,0x04,0xbe,0x00,0x0d,0x00,0x13,0xbb,0x00,0x07,0x01,0x0a,0x00,0x09,0x01,\r\n0x08,0xb1,0x02,0x07,0x2f,0x2f,0x00,0x3f,0x3f,0x31,0x30,0x01,0x03,0x13,0x23,0x27,0x23,0x07,0x23,0x13,0x03,0x33,0x17,0x33,0x37,0x02,0x11,0xbc,0xb8,0x91,0x6a,0x02,0x6e,0x90,0xbe,0xb6,0x92,0x67,0x02,0x6f,0x04,0xbe,0xfe,0xeb,0xfe,0xf1,0xb2,0xb2,0x01,0x0c,0x01,0x18,0xbd,0xbd,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,\r\n0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x36,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x38,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,\r\n0x01,0x07,0x04,0x37,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x39,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x43,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x38,\r\n0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x32,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x83,0x00,0x00,0x01,0x07,0x04,0x44,0x00,0x29,0x01,0x2c,0x00,0x10,0xb7,0x04,0x03,0x39,0x2a,0x02,0x28,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,\r\n0x00,0x5a,0xff,0xe8,0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x36,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x41,0x01,0x0f,0x41,0x10,0x41,0x02,0x41,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,\r\n0xff,0xe8,0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x37,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,\r\n0x04,0xc5,0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x43,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x04,0xc5,\r\n0x07,0x46,0x02,0x26,0x01,0x2f,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x83,0xff,0xcf,0x01,0x07,0x04,0x44,0x00,0x29,0x01,0x40,0x00,0x1b,0x40,0x10,0x04,0x03,0x2f,0x42,0x01,0x0f,0x42,0x10,0x42,0x02,0x42,0x27,0x02,0x2a,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xf9,0xff,0xf4,0x02,0x15,0x07,0x32,\r\n0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0xaf,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x02,0xff,0xf4,0x02,0x32,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,\r\n0x01,0x07,0x04,0x37,0xfe,0xc4,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0xff,0xfc,0xff,0xf4,0x02,0x24,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0xb8,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,\r\n0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0xff,0xe5,0xff,0xf4,0x02,0x28,0x07,0x32,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x64,0x01,0x00,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0xad,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x1e,0x0f,0x01,0x0c,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,\r\n0xff,0xee,0xff,0xf4,0x02,0x1a,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x36,0xfe,0xb4,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,\r\n0xff,0xf4,0x02,0x2d,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x37,0xfe,0xbf,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,0xff,0xf4,\r\n0x02,0x20,0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x43,0xfe,0xb4,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xee,0xff,0xf4,0x02,0x3a,\r\n0x07,0x46,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x66,0x01,0x00,0xff,0xcf,0x01,0x07,0x04,0x44,0xfe,0xbf,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x27,0x01,0x0f,0x27,0x10,0x27,0x02,0x27,0x0c,0x01,0x0f,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,\r\n0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x36,0xff,0xcc,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,\r\n0x01,0x07,0x04,0x37,0xff,0xd9,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x43,0xff,0xcd,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,\r\n0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x32,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0x00,0x01,0x07,0x04,0x44,0xff,0xd0,0x01,0x2c,0x00,0x10,0xb7,0x03,0x02,0x2f,0x20,0x01,0x1d,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x34,0x34,0xff,0xff,\r\n0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x36,0xff,0xc7,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,\r\n0xff,0xe6,0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x37,0xff,0xd0,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,\r\n0x04,0x0e,0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x43,0xff,0xc5,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,\r\n0x07,0x46,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x66,0x02,0x1b,0xff,0xcf,0x01,0x07,0x04,0x44,0xff,0xd0,0x01,0x40,0x00,0x1b,0x40,0x10,0x03,0x02,0x2f,0x38,0x01,0x0f,0x38,0x10,0x38,0x02,0x38,0x1d,0x01,0x20,0x11,0x26,0x00,0x2b,0x35,0x10,0xda,0x5d,0x5d,0x34,0x34,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,\r\n0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x64,0x00,0xf6,0x00,0xd2,0x01,0x07,0x02,0x46,0xff,0xc1,0x01,0x88,0x00,0x29,0x40,0x1a,0x04,0x0f,0x2b,0x3f,0x2b,0x8f,0x2b,0x03,0x2b,0x40,0x0d,0x15,0x36,0x2b,0x03,0x24,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x05,0x00,0x10,0xda,0x5d,\r\n0x34,0x34,0x10,0xda,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x64,0x00,0xf6,0x00,0xd2,0x01,0x07,0x02,0x47,0xff,0xf3,0x01,0x88,0x00,0x29,0x40,0x1a,0x04,0x0f,0x2b,0x3f,0x2b,0x8f,0x2b,0x03,0x2b,0x40,\r\n0x0d,0x15,0x36,0x2b,0x03,0x24,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x05,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x66,0x00,0xf6,0x00,0xaa,0x01,0x07,\r\n0x02,0x46,0xff,0x8f,0x01,0x88,0x00,0x33,0x40,0x22,0x04,0x4f,0x32,0x8f,0x32,0x02,0x32,0x40,0x0c,0x15,0x36,0x32,0x03,0x7f,0x27,0x8f,0x27,0x02,0x27,0x40,0x0d,0x11,0x36,0x27,0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x06,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0xff,0xd3,\r\n0xff,0xf4,0x02,0x1b,0x07,0x40,0x02,0x26,0x01,0xc9,0x00,0x00,0x00,0x27,0x04,0x68,0x00,0xf6,0xff,0xcf,0x00,0x27,0x04,0x66,0x00,0xf6,0x00,0xaa,0x01,0x07,0x02,0x47,0x00,0x19,0x01,0x88,0x00,0x33,0x40,0x22,0x04,0x4f,0x32,0x8f,0x32,0x02,0x32,0x40,0x0c,0x15,0x36,0x32,0x03,0x7f,0x27,0x8f,0x27,0x02,0x27,0x40,0x0d,0x11,0x36,0x27,\r\n0x12,0x02,0x01,0x70,0x0c,0x90,0x0c,0x02,0x0c,0x06,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0xd2,0x01,0x07,0x02,0x46,0x00,0xef,\r\n0x01,0x88,0x00,0x2b,0x40,0x1b,0x04,0x4f,0x3c,0x8f,0x3c,0x02,0x3c,0x40,0x0c,0x15,0x36,0x3c,0x03,0x00,0x35,0x01,0x35,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,\r\n0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x64,0x02,0x1b,0x00,0xd2,0x01,0x07,0x02,0x47,0x01,0x20,0x01,0x88,0x00,0x2b,0x40,0x1b,0x04,0x4f,0x3c,0x8f,0x3c,0x02,0x3c,0x40,0x0c,0x15,0x36,0x3c,0x03,0x00,0x35,0x01,0x35,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xda,0x5d,\r\n0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x66,0x02,0x1b,0x00,0xaa,0x01,0x07,0x02,0x46,0x00,0xd1,0x01,0x88,0x00,0x31,0x40,0x20,0x04,0x8f,0x45,0x01,0x45,0x40,0x0c,0x15,0x36,0x45,0x03,0x7f,0x38,0x8f,\r\n0x38,0x02,0x38,0x40,0x0e,0x11,0x36,0x38,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe6,0x04,0x0e,0x07,0x40,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x27,0x04,0x68,0x02,0x18,0xff,0xcf,0x00,0x27,0x04,0x66,0x02,0x1b,\r\n0x00,0xaa,0x01,0x07,0x02,0x47,0x01,0x48,0x01,0x88,0x00,0x31,0x40,0x20,0x04,0x8f,0x45,0x01,0x45,0x40,0x0c,0x15,0x36,0x45,0x03,0x7f,0x38,0x8f,0x38,0x02,0x38,0x40,0x0e,0x11,0x36,0x38,0x23,0x02,0x01,0x70,0x1d,0x90,0x1d,0x02,0x1d,0x14,0x00,0x10,0xda,0x5d,0x34,0x34,0x10,0xd2,0x2b,0x5d,0x34,0x11,0x2b,0x5d,0x35,0x00,0x00,0x03,\r\n0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x16,0x00,0x1e,0x00,0x39,0xbc,0x00,0x0f,0x01,0x43,0x00,0x19,0x00,0x1d,0x01,0x43,0xb5,0x14,0x19,0x14,0x06,0x00,0x17,0xb8,0x01,0x44,0xb2,0x11,0x07,0x1b,0xb8,0x01,0x44,0xb2,0x0c,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xe6,0x01,0x2f,\r\n0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x32,0x12,0x11,0x10,0x21,0x22,0x02,0x11,0x10,0x12,0x13,0x32,0x11,0x10,0x23,0x22,0x11,0x10,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x04,0x8e,0xe4,0xfe,0xfe,0x3e,0xeb,\r\n0xf9,0xef,0xec,0xe7,0xed,0xf1,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xff,0x00,0x01,0x7f,0x01,0x6c,0x02,0xdf,0xfe,0x7a,0xfe,0x84,0xfe,0xa6,0xfe,0x92,0x05,0x0d,0xfd,0xcd,0xfd,0xe2,0x02,0x14,0x02,0x3d,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x1a,0x00,0x32,\r\n0xb9,0x00,0x1a,0x01,0x43,0x40,0x11,0x13,0x19,0x19,0x00,0x06,0x00,0x1a,0x18,0x04,0x18,0x01,0x18,0x12,0x13,0x0c,0x07,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xde,0xce,0x33,0x5d,0x3f,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0xe6,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x23,\r\n0x0e,0x03,0x07,0x15,0x3e,0x03,0x37,0x11,0x33,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x05,0x15,0x7a,0x26,0x68,0x75,0x79,0x36,0x30,0x65,0x5b,0x49,0x13,0xe0,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x04,0xd2,0x21,0x45,0x3f,0x33,0x0f,0xce,\r\n0x0c,0x2a,0x30,0x31,0x13,0xfb,0x51,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x32,0x00,0x4e,0xb1,0x23,0x11,0xb8,0x01,0x43,0xb2,0x31,0x10,0x1b,0xb8,0x01,0x43,0x40,0x0c,0x27,0x31,0x27,0x31,0x27,0x00,0x08,0x00,0x12,0x27,0x20,0x10,0xb8,0x01,0x44,0xb3,0x31,0x18,0x23,0x25,0xb8,0x01,0x44,0xb3,0x22,\r\n0x20,0x07,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,0x41,0x00,0x3f,0x3f,0x3f,0x33,0xe6,0x32,0x3f,0xe6,0x12,0x39,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe6,0x32,0x10,0xe6,0x33,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x05,0x21,0x35,0x34,0x3e,0x06,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x15,0x14,0x0e,0x06,0x15,0x15,0x21,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x06,0x52,0xfd,0x88,0x36,0x58,0x70,0x75,0x70,0x58,0x36,0x41,0x71,0x96,0x54,0xde,0xa9,0xb0,0xc0,0xce,0x38,0x5b,0x74,0x7a,0x74,\r\n0x5b,0x38,0x03,0x74,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0x22,0x16,0x27,0x4a,0x4d,0x52,0x5f,0x6e,0x85,0x9f,0x60,0x5d,0x8c,0x5d,0x2f,0x83,0xde,0xa4,0xda,0x4b,0x7b,0x6b,0x61,0x61,0x66,0x76,0x8c,0x55,0x6b,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,\r\n0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x2d,0x00,0x73,0xb2,0x15,0x25,0x17,0xb8,0x01,0x43,0x40,0x09,0x21,0x1d,0x25,0x25,0x1d,0x21,0x03,0x0c,0x11,0xb8,0x01,0x43,0x40,0x09,0x28,0x0c,0x28,0x0c,0x06,0x00,0x15,0x1a,0x25,0xb8,0x01,0x44,0x40,0x0d,0x24,0x24,0x2b,0x80,0x1d,0x01,0x2b,0x1d,0x3b,0x1d,0x02,0x1d,0x1f,0xb8,0x01,0x44,0x40,\r\n0x09,0x1a,0x07,0x24,0x2d,0x34,0x2d,0x02,0x2d,0x2b,0xb8,0x01,0x44,0xb2,0x0e,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0xc6,0x5d,0x3f,0xe6,0xc6,0x5d,0x5d,0x12,0x39,0x2f,0xe6,0x11,0x39,0x01,0x2f,0xc4,0x39,0x39,0x2f,0x2f,0xe6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0xe6,0x11,0x39,0x31,0x30,0x13,0x10,0x00,\r\n0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x05,0x16,0x33,0x32,0x24,0x35,0x34,0x26,0x27,0x35,0x24,0x11,0x34,0x26,0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x15,0x14,0x21,0x23,0x15,0x33,0x20,0x15,0x14,0x06,0x23,0x22,0x27,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x03,0x0b,0x79,0xcc,\r\n0xe3,0x01,0x15,0xb7,0x9b,0x01,0x20,0xd9,0xb5,0xbc,0x8a,0x86,0x97,0xd2,0xfe,0xda,0x71,0x77,0x01,0x53,0x92,0x7b,0xb9,0x93,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xb3,0x4d,0xed,0xc1,0x8c,0xbb,0x0f,0x04,0x51,0x01,0x1b,0x96,0xc0,0x52,0xd2,0x67,0xda,0xd7,0xbd,0xe9,0x6a,0x90,0x74,0x00,\r\n0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x1c,0x00,0x27,0x00,0x4f,0xb3,0x10,0x11,0x11,0x1a,0xb8,0x01,0x43,0x40,0x0e,0x27,0x13,0x19,0x1d,0x17,0x19,0x17,0x19,0x17,0x00,0x08,0x00,0x1b,0x18,0xb8,0x01,0x44,0x40,0x0b,0x16,0x11,0x1d,0x1d,0x12,0x1a,0x18,0x22,0x12,0x07,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,\r\n0x41,0x00,0x3f,0x3f,0x3f,0x33,0x3f,0x12,0x39,0x2f,0x33,0x33,0xe6,0x32,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0xe6,0x32,0x11,0x33,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x01,0x23,0x11,0x21,0x02,0x00,0x07,0x15,0x21,0x11,0x33,0x11,0x33,0x25,0x3e,\r\n0x03,0x37,0x33,0x06,0x06,0x15,0x11,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x06,0x68,0xae,0xfe,0xfe,0xa4,0xfe,0xda,0x82,0x02,0x70,0xde,0xae,0xfc,0xde,0x35,0x6f,0x69,0x61,0x28,0x04,0x02,0x02,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,\r\n0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0x01,0x4c,0x03,0x66,0xfe,0xe0,0xfe,0x4e,0xa4,0xa7,0xfe,0x83,0x01,0x7d,0xb7,0x3b,0x95,0xa4,0xa8,0x4e,0x2a,0x49,0x21,0xfe,0x2a,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0f,0x00,0x34,0x00,0x50,0xb1,0x23,0x17,0xb8,0x01,0x43,0xb2,0x2d,\r\n0x34,0x21,0xb8,0x01,0x43,0x40,0x09,0x26,0x2d,0x26,0x2d,0x26,0x00,0x08,0x00,0x28,0xb8,0x01,0x44,0xb3,0x1c,0x1c,0x12,0x23,0xb8,0x01,0x44,0xb2,0x25,0x06,0x32,0xb8,0x01,0x44,0xb2,0x12,0x19,0x0c,0xba,0x01,0x42,0x00,0x04,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xe6,0x12,0x39,0x2f,0xe6,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,\r\n0x10,0xe6,0x33,0x10,0xe6,0x32,0x30,0x31,0x13,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x11,0x10,0x01,0x00,0x21,0x20,0x01,0x00,0x05,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x22,0x06,0x06,0x07,0x13,0x21,0x35,0x21,0x03,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0xb4,0x01,0x5b,0x01,0x5c,0x01,0xe5,\r\n0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,0xa5,0xfe,0x1b,0xfe,0x1b,0xfe,0xa4,0xfe,0xa5,0x03,0x22,0x62,0xc7,0x6d,0xba,0x87,0x4d,0x4c,0x83,0xb0,0x63,0x07,0x1b,0x1f,0x1c,0x09,0x1b,0x01,0xec,0xfd,0x5e,0x3c,0xa5,0x3c,0x4a,0x7f,0x5d,0x35,0x2c,0x4c,0x65,0x39,0x97,0x94,0x02,0xcd,0x01,0xe5,0x01,0x5b,0x01,0x5c,0xfe,0xa4,0xfe,\r\n0xa5,0xfe,0x1b,0xfe,0x1a,0xfe,0xa6,0xfe,0xa4,0x01,0x5c,0x01,0x5b,0xc5,0x3b,0x3f,0x77,0xab,0x6d,0x6f,0xa3,0x6a,0x34,0x01,0x02,0x01,0x01,0x72,0xc6,0xfc,0xff,0x0c,0x22,0x40,0x5d,0x3b,0x3e,0x62,0x44,0x23,0x5f,0x00,0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x22,0x00,0x2e,0x00,0x5a,0xb5,0x0c,0x2c,0x0c,\r\n0x2c,0x1d,0x17,0xbb,0x01,0x43,0x00,0x26,0x00,0x1d,0x01,0x43,0xb5,0x11,0x26,0x11,0x06,0x00,0x23,0xb8,0x01,0x44,0x40,0x0b,0x1a,0x1a,0x0e,0x29,0x22,0x20,0x09,0x12,0x48,0x22,0x20,0xb8,0x01,0x44,0xb2,0x0e,0x07,0x29,0xb8,0x01,0x44,0xb2,0x14,0x19,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xf6,0xcd,\r\n0x2b,0x11,0x12,0x39,0x2f,0xe6,0x01,0x2f,0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x11,0x39,0x39,0x2f,0x2f,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x26,0x23,0x20,0x00,0x11,0x10,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x23,0x34,0x12,0x33,0x32,0x17,0x01,0x32,0x16,0x15,0x14,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x36,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x05,0xf2,0x58,0x96,0xfe,0xf8,0xfe,0xbe,0xf6,0xd8,0xc4,0xfe,0xde,0xbc,0xad,0x61,0x03,0xc5,0xa4,0x7b,0x6f,0xfe,0x99,0x68,0x73,0x78,0x61,0x66,0x7c,0x7c,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,\r\n0xfd,0x49,0x02,0xb7,0x04,0xa1,0x29,0xfe,0x3e,0xfe,0x87,0xfe,0xc9,0xfe,0xa8,0x01,0x0b,0xd3,0xca,0xf1,0x8f,0xe0,0x01,0x23,0x39,0xfe,0x08,0x91,0x81,0x75,0x99,0xb0,0x7c,0x63,0x91,0x00,0x00,0x02,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x1a,0x00,0x3a,0xb2,0x0f,0x0c,0x15,0xb8,0x01,0x43,0x40,0x0e,0x14,0x0c,0x14,\r\n0x0d,0x0d,0x14,0x0c,0x03,0x00,0x06,0x00,0x15,0x18,0x0f,0xb8,0x01,0x44,0xb2,0x0d,0x06,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe6,0x11,0x33,0x30,0x31,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x01,0x21,0x15,0x21,0x06,0x0a,\r\n0x02,0x07,0x33,0x36,0x1a,0x02,0x37,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x06,0x78,0xfc,0x64,0x02,0x91,0x66,0x9c,0x75,0x55,0x1f,0xec,0x11,0x4e,0x80,0xb4,0x77,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x04,0xb2,0xc6,0xad,0xfe,0xbc,0xfe,\r\n0xce,0xfe,0xdc,0x8d,0x94,0x01,0x38,0x01,0x4c,0x01,0x60,0xbc,0x00,0x04,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x25,0x00,0x39,0x00,0x4d,0x00,0x59,0x00,0x71,0xb3,0x21,0x0f,0x1e,0x44,0xb8,0x01,0x43,0xb2,0x14,0x14,0x0a,0xbb,0x01,0x43,0x00,0x30,0x00,0x3a,0x01,0x43,0xb2,0x1e,0x1e,0x26,0xb8,0x01,0x43,0x40,0x0b,0x00,0x30,\r\n0x00,0x30,0x00,0x4e,0x54,0x4e,0x21,0x0f,0x2b,0xb8,0x01,0x44,0x40,0x09,0x60,0x49,0x70,0x49,0x02,0x49,0x49,0x51,0x57,0xbc,0x01,0x42,0x00,0x51,0x01,0x41,0x00,0x3f,0x01,0x44,0xb2,0x19,0x07,0x35,0xb8,0x01,0x44,0xb1,0x05,0x19,0x00,0x3f,0xe6,0x3f,0xe6,0x3f,0x3f,0x12,0x39,0x2f,0x5d,0xe6,0x39,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,\r\n0x2f,0x2f,0x10,0xe6,0x33,0x2f,0xe6,0x10,0xe6,0x32,0x2f,0xe6,0x12,0x39,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x0e,0x03,0x17,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x13,0x34,\r\n0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x76,0x47,0x7d,0xac,0x66,0x67,0xac,0x7c,0x44,0x1d,0x38,0x4f,0x32,0x24,0x3a,0x29,0x17,0x3e,0x6e,0x97,0x58,0x57,0x95,0x6f,0x3f,0x52,0x4d,0x32,0x51,0x39,0x1f,0xe8,0x24,0x40,0x57,0x34,0x37,\r\n0x59,0x3f,0x22,0x23,0x40,0x59,0x35,0x37,0x59,0x3e,0x21,0x2d,0x1c,0x33,0x48,0x2b,0x29,0x46,0x34,0x1d,0x1e,0x34,0x46,0x28,0x28,0x46,0x35,0x1f,0xfc,0x29,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x01,0x97,0x5f,0xa0,0x76,0x42,0x42,0x76,0xa0,0x5f,0x34,0x6c,0x65,0x55,0x1d,0x1b,0x43,0x4e,\r\n0x55,0x2c,0x4f,0x89,0x65,0x3a,0x39,0x65,0x89,0x50,0x5a,0x9e,0x35,0x1d,0x56,0x64,0x6c,0x26,0x35,0x5e,0x46,0x29,0x2b,0x48,0x5d,0x32,0x38,0x5e,0x43,0x26,0x25,0x43,0x5e,0x02,0xc3,0x28,0x47,0x35,0x1e,0x1d,0x33,0x48,0x2a,0x29,0x4a,0x3a,0x22,0x22,0x39,0x4b,0xfe,0xc7,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,\r\n0x02,0xb7,0x00,0x03,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0b,0x00,0x22,0x00,0x2e,0x00,0x5c,0xb5,0x0c,0x2c,0x0c,0x2c,0x1d,0x26,0xbb,0x01,0x43,0x00,0x17,0x00,0x11,0x01,0x43,0xb5,0x1d,0x1d,0x17,0x06,0x00,0x23,0xb8,0x01,0x44,0xb4,0x1a,0x1a,0x0e,0x29,0x22,0xb8,0xff,0xe0,0xb4,0x09,0x12,0x48,0x22,0x20,0xb8,0x01,0x44,\r\n0xb2,0x0e,0x19,0x29,0xb8,0x01,0x44,0xb2,0x14,0x07,0x09,0xba,0x01,0x42,0x00,0x03,0x01,0x41,0x00,0x3f,0x3f,0x3f,0xe6,0x3f,0xf6,0xcd,0x2b,0x11,0x12,0x39,0x2f,0xe6,0x01,0x2f,0xc4,0x39,0x39,0x2f,0xe6,0x2f,0xe6,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x05,0x16,0x33,0x20,\r\n0x00,0x11,0x10,0x02,0x23,0x22,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x33,0x14,0x02,0x23,0x22,0x27,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xb4,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x03,0x33,0x58,0x96,0x01,0x08,0x01,0x42,0xf6,0xd8,0xc4,0xfe,0xde,0xbc,0xad,0x61,\r\n0x03,0xc5,0xa4,0x7b,0x6f,0x01,0x67,0x68,0x73,0x78,0x61,0x66,0x7c,0x7c,0x02,0xcd,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0xd7,0x29,0x01,0xc2,0x01,0x79,0x01,0x37,0x01,0x58,0xfe,0xf5,0xd3,0xca,0xf1,0x8f,0xe0,0xfe,0xdd,0x39,0x01,0xf8,0x91,0x81,0x75,0x99,0xb0,0x7c,0x63,0x91,0x00,0x05,0x00,0xbc,\r\n0xff,0x2f,0x03,0xea,0x06,0x50,0x00,0x17,0x00,0x1e,0x00,0x22,0x00,0x26,0x00,0x2d,0x00,0x5d,0x40,0x34,0x1c,0x0d,0x1f,0x91,0x2c,0x24,0x24,0x20,0x2b,0x23,0x91,0x05,0x80,0x03,0x01,0x03,0x01,0x03,0x1d,0x20,0x91,0x14,0x16,0x00,0x09,0x7d,0x29,0x1d,0x1c,0x0c,0x2c,0x05,0x05,0x15,0x8c,0x21,0x25,0x02,0x03,0x16,0x29,0x16,0x00,0x10,\r\n0x7d,0x1a,0x1a,0x2f,0x24,0x20,0x7e,0x00,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x17,0x33,0xed,0x17,0x32,0x2f,0xe1,0x00,0x2f,0xc6,0x33,0xed,0x32,0x3f,0xc6,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x39,0x32,0x31,0x30,0x33,0x11,0x21,0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,\r\n0x14,0x07,0x06,0x07,0x15,0x23,0x35,0x37,0x36,0x35,0x34,0x27,0x11,0x36,0x01,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x13,0x36,0x35,0x34,0x27,0x11,0x36,0xbc,0x01,0x3a,0x68,0x93,0x5b,0x66,0x84,0x74,0x8a,0xa6,0x7a,0x6e,0xa4,0x68,0xfd,0x47,0xdc,0x5c,0xfe,0xaa,0x92,0x92,0x92,0xc6,0x46,0xa4,0x37,0x05,0x9a,0xb6,0xb7,0x09,0x51,0x5b,\r\n0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0x72,0x68,0x09,0xd2,0xd1,0xde,0x46,0x7a,0xd8,0x20,0xfe,0x05,0x0b,0x01,0xf6,0xfd,0xfc,0x02,0x04,0x02,0x66,0xfe,0x31,0x01,0xcf,0xfe,0x73,0x43,0x79,0xab,0x1f,0xfe,0x45,0x10,0x00,0x00,0x02,0x00,0x48,0x02,0x34,0x02,0xa5,0x05,0xae,0x00,0x0a,0x00,0x12,0x00,0x1f,0x40,0x10,0x0b,0xe6,\r\n0x06,0x27,0x0f,0xe6,0x00,0x29,0x08,0xcc,0x11,0x11,0x14,0x0d,0xcc,0x03,0x2f,0xed,0x12,0x39,0x2f,0xed,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x11,0x10,0x33,0x32,0x11,0x10,0x01,0x6d,0x8b,0x9a,0xa1,0x99,0x01,0x23,0xa3,0x87,0xa9,0xa6,0xa4,0x02,0x34,0xdb,0xd1,0xe5,\r\n0xe9,0xfe,0x47,0xdb,0xe6,0x03,0x03,0xfe,0xaf,0xfe,0xc6,0x01,0x40,0x01,0x4b,0x00,0x00,0x02,0x00,0x49,0x02,0x34,0x02,0xa6,0x05,0xae,0x00,0x26,0x00,0x36,0x00,0x3c,0x40,0x23,0x04,0x10,0x14,0x10,0x02,0x27,0xe6,0x04,0x10,0x14,0x10,0x02,0x10,0x10,0x31,0x06,0xe6,0x24,0x27,0x31,0xe6,0x1a,0x29,0x01,0x01,0x1f,0x15,0xcc,0x34,0x34,\r\n0x38,0x2c,0x0c,0xcc,0x1f,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x5d,0x31,0x30,0x01,0x15,0x2e,0x03,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x03,0x22,0x0e,\r\n0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x63,0x0e,0x28,0x2b,0x2c,0x12,0x39,0x55,0x21,0x1f,0x2d,0x04,0x1d,0x6e,0x4e,0x3c,0x5f,0x42,0x23,0x2d,0x4f,0x6b,0x3d,0x3f,0x72,0x56,0x32,0x38,0x65,0x8c,0x54,0x2b,0x52,0xc1,0x22,0x3c,0x2c,0x1a,0x15,0x29,0x3a,0x25,0x4b,0x55,0x4d,0x05,0x8b,0x81,0x09,0x10,0x0c,0x07,\r\n0x24,0x24,0x22,0x7f,0x61,0x32,0x41,0x27,0x47,0x63,0x3d,0x3d,0x68,0x4d,0x2b,0x31,0x63,0x99,0x67,0x75,0xb5,0x7c,0x40,0x12,0xfe,0x59,0x15,0x28,0x38,0x24,0x22,0x41,0x32,0x1e,0x5b,0x49,0x4e,0x5a,0x00,0x02,0x00,0x49,0x02,0x33,0x02,0xa6,0x05,0xae,0x00,0x27,0x00,0x39,0x00,0x3c,0x40,0x23,0x0b,0x0b,0x1b,0x0b,0x02,0x30,0xe6,0x0b,\r\n0x0b,0x1b,0x0b,0x02,0x0b,0x0b,0x1f,0x28,0xe6,0x15,0x27,0x00,0xe6,0x1f,0x29,0x23,0x23,0x10,0x1a,0xcc,0x35,0x06,0x06,0x3b,0x2d,0xcc,0x10,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0xed,0x5d,0x31,0x30,0x01,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x1e,0x03,0x13,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x34,0x42,0x5e,0x3c,0x1b,0x04,0x0d,0x2b,0x37,0x42,0x24,0x3c,0x61,0x46,0x26,0x2a,0x4d,0x6c,0x41,0x40,0x72,0x55,0x32,0x30,0x5d,0x8a,0x5b,0x30,0x61,0x26,0x13,\r\n0x2e,0x30,0x30,0x52,0x21,0x39,0x2a,0x18,0x52,0x45,0x20,0x3d,0x2f,0x1d,0x19,0x2c,0x3c,0x02,0xaa,0x33,0x5c,0x7e,0x4b,0x1c,0x2f,0x21,0x13,0x26,0x47,0x63,0x3c,0x3f,0x6a,0x4c,0x2a,0x33,0x65,0x96,0x64,0x69,0xb4,0x82,0x4a,0x17,0x16,0x7f,0x0b,0x13,0x0f,0x08,0x02,0x8e,0x17,0x2b,0x3f,0x28,0x4c,0x56,0x16,0x26,0x33,0x1d,0x2a,0x47,\r\n0x32,0x1c,0x00,0x01,0x00,0x5d,0x02,0xcb,0x02,0x91,0x04,0xff,0x00,0x0b,0x00,0x1b,0x40,0x10,0x04,0x7f,0x07,0x9f,0x07,0x02,0x3f,0x07,0xdf,0x07,0xff,0x07,0x03,0x07,0x02,0x03,0x2f,0xcd,0x00,0x2f,0x5d,0x71,0xcd,0x31,0x30,0x01,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x02,0x91,0xe8,0x64,0xe8,0xe8,0x64,0xe8,0x03,\r\n0xb3,0xe8,0xe8,0x64,0xe8,0xe8,0x00,0x01,0x00,0x5d,0x03,0xb3,0x02,0x91,0x04,0x17,0x00,0x03,0x00,0x1b,0x40,0x10,0x02,0x7f,0x01,0x9f,0x01,0x02,0x3f,0x01,0xdf,0x01,0xff,0x01,0x03,0x01,0x02,0x03,0x2f,0xcd,0x00,0x2f,0x5d,0x71,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x5d,0x02,0x34,0xfd,0xcc,0x04,0x17,0x64,0x00,0x00,0x02,0x00,0x5d,\r\n0x03,0x22,0x02,0x91,0x04,0xa8,0x00,0x03,0x00,0x07,0x00,0x21,0x40,0x11,0x03,0x40,0x00,0x80,0x07,0x0f,0x04,0x2f,0x04,0x3f,0x04,0x03,0x04,0x06,0x07,0x02,0x03,0x2f,0xcd,0x33,0x32,0x00,0x2f,0x5d,0xcd,0x1a,0xde,0x1a,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x5d,0x02,0x34,0xfd,0xcc,0x02,0x34,0xfd,0xcc,0x03,0x86,\r\n0x64,0x01,0x86,0x64,0x00,0x01,0x00,0xcc,0x01,0xce,0x02,0x06,0x05,0xee,0x00,0x09,0x00,0x1a,0x40,0x0d,0xdf,0x05,0x01,0x40,0x05,0x01,0x05,0x01,0x06,0x00,0x08,0xcd,0x03,0x2f,0xed,0xd4,0xc6,0x00,0x2f,0x2f,0x5d,0x5d,0x31,0x30,0x01,0x23,0x26,0x11,0x10,0x37,0x33,0x06,0x11,0x10,0x02,0x05,0x7f,0xba,0xba,0x80,0xbc,0x01,0xce,0xd4,\r\n0x01,0x38,0x01,0x38,0xdc,0xe4,0xfe,0xd1,0xfe,0xd3,0x00,0x01,0x00,0x64,0x01,0xce,0x01,0x9e,0x05,0xee,0x00,0x09,0x00,0x1a,0x40,0x0d,0xdf,0x03,0x01,0x40,0x03,0x01,0x03,0x09,0x09,0x03,0x06,0xcd,0x01,0x2f,0xfd,0xd4,0xc6,0x00,0x2f,0x2f,0x5d,0x5d,0x31,0x30,0x00,0x11,0x10,0x27,0x33,0x16,0x11,0x10,0x07,0x23,0x01,0x20,0xbc,0x80,\r\n0xba,0xba,0x7f,0x02,0xae,0x01,0x2d,0x01,0x2f,0xe4,0xdc,0xfe,0xc8,0xfe,0xc8,0xd4,0x00,0x02,0x00,0x5b,0x02,0xcd,0x01,0x05,0x06,0xeb,0x00,0x0b,0x00,0x0f,0x00,0x1c,0x40,0x0d,0x0d,0x24,0x00,0x40,0x06,0x80,0x0e,0x03,0x09,0x0c,0xc2,0x03,0x0d,0x2f,0xc4,0xfd,0xc4,0x00,0x3f,0x1a,0xdc,0x1a,0xcd,0x3f,0x31,0x30,0x13,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x23,0x11,0x33,0xaf,0x25,0x2f,0x2f,0x25,0x26,0x30,0x30,0x19,0x80,0x80,0x06,0x54,0x2b,0x21,0x1f,0x2c,0x2c,0x1f,0x20,0x2c,0xfc,0x79,0x02,0xcf,0x00,0xff,0xff,0x00,0x68,0x03,0x74,0x02,0x92,0x06,0xda,0x02,0x07,0x00,0xf1,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x81,0x03,0x5f,0x02,0x8e,\r\n0x06,0xda,0x02,0x07,0x00,0xf2,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x50,0x03,0x74,0x01,0xc2,0x06,0xdc,0x02,0x07,0x00,0xf0,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x48,0x03,0x60,0x02,0xa5,0x06,0xda,0x02,0x07,0x08,0x8d,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x2f,0x03,0x74,0x02,0xaa,0x06,0xc6,0x02,0x07,0x02,0x38,0x00,0x00,0x01,0x2c,\r\n0xff,0xff,0x00,0x7b,0x03,0x5f,0x02,0x8a,0x06,0xca,0x02,0x07,0x02,0x39,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x49,0x03,0x60,0x02,0xa6,0x06,0xda,0x02,0x07,0x08,0x8e,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x4d,0x03,0x74,0x02,0xa0,0x06,0xd0,0x02,0x07,0x02,0x3a,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x41,0x03,0x60,0x02,0xad,0x06,0xda,\r\n0x02,0x07,0x02,0x3b,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x49,0x03,0x5f,0x02,0xa6,0x06,0xda,0x02,0x07,0x08,0x8f,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x5d,0x03,0xf7,0x02,0x91,0x06,0x2b,0x02,0x07,0x08,0x90,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x5d,0x04,0xdf,0x02,0x91,0x05,0x43,0x02,0x07,0x08,0x91,0x00,0x00,0x01,0x2c,0xff,0xff,\r\n0x00,0x5d,0x04,0x4e,0x02,0x91,0x05,0xd4,0x02,0x07,0x08,0x92,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0xcc,0x02,0xfa,0x02,0x06,0x07,0x1a,0x02,0x07,0x08,0x93,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x64,0x02,0xfa,0x01,0x9e,0x07,0x1a,0x02,0x07,0x08,0x94,0x00,0x00,0x01,0x2c,0xff,0xff,0x00,0x48,0xfe,0xfa,0x02,0xa5,0x02,0x74,0x03,0x07,\r\n0x08,0x8d,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0x0e,0x01,0xc2,0x02,0x76,0x03,0x07,0x00,0xf0,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0x0e,0x02,0x92,0x02,0x74,\r\n0x03,0x07,0x00,0xf1,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x81,0xfe,0xf9,0x02,0x8e,0x02,0x74,0x03,0x07,0x00,0xf2,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x2f,0xff,0x0e,0x02,0xaa,0x02,0x60,\r\n0x03,0x07,0x02,0x38,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7b,0xfe,0xf9,0x02,0x8a,0x02,0x64,0x03,0x07,0x02,0x39,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0xfe,0xfa,0x02,0xa6,\r\n0x02,0x74,0x03,0x07,0x08,0x8e,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x4d,0xff,0x0e,0x02,0xa0,0x02,0x6a,0x03,0x07,0x02,0x3a,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x41,0xfe,0xfa,\r\n0x02,0xad,0x02,0x74,0x03,0x07,0x02,0x3b,0x00,0x00,0xfc,0xc6,0x00,0x11,0x40,0x09,0x02,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x49,0xfe,0xf9,0x02,0xa6,0x02,0x74,0x03,0x07,0x08,0x8f,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,\r\n0x35,0x35,0xff,0xff,0x00,0x5d,0xff,0x91,0x02,0x91,0x01,0xc5,0x03,0x07,0x08,0x90,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x5d,0x00,0x79,0x02,0x91,0x00,0xdd,0x03,0x07,0x08,0x91,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0x00,0x5d,0xff,0xe8,0x02,0x91,0x01,0x6e,0x03,0x07,0x08,0x92,0x00,0x00,0xfc,0xc6,0x00,0x0e,0xb7,0x01,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xcc,0xfe,0x94,0x02,0x06,0x02,0xb4,0x03,0x07,0x08,0x93,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,\r\n0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x64,0xfe,0x94,0x01,0x9e,0x02,0xb4,0x03,0x07,0x08,0x94,0x00,0x00,0xfc,0xc6,0x00,0x0c,0xb6,0x00,0x60,0x00,0x70,0x00,0x02,0x00,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0xbc,0xfe,0x7e,0x06,0x12,0x07,0x4e,0x00,0x17,0x00,0x24,0x00,0x77,0x40,0x16,0x24,0xc4,0x18,0x1e,0xc4,0x1f,0x1f,0x00,0x0c,0x0f,\r\n0x04,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7e,0x0e,0xb8,0xff,0xfe,0x40,0x17,0x0b,0x06,0x4d,0x0e,0x04,0x03,0x40,0x01,0x01,0x00,0x04,0x0c,0x06,0x4d,0x00,0x08,0x0b,0x06,0x4d,0x00,0x7e,0x16,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xdc,0x40,0x11,0x0b,0x06,0x4d,0x05,0x24,0x1e,0x80,0x21,0xda,0x1b,0x17,\r\n0x03,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xd6,0xed,0x1a,0xcc,0x32,0x01,0x2f,0x2b,0x2b,0x33,0xf1,0x2b,0x2b,0xc1,0x2f,0x1a,0xcd,0x39,0x2f,0x2b,0xe1,0x2b,0x2b,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x31,0x30,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x14,0x07,0x33,0x36,\r\n0x37,0x01,0x33,0x03,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x05,0x40,0xd2,0xb8,0xc1,0xab,0xac,0x0a,0x06,0x13,0x1b,0xfd,0x1e,0xd0,0xa8,0x08,0x04,0x16,0x22,0x02,0xd0,0xd8,0xd4,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,0x0c,0x96,0xfd,0xe8,0x01,0x82,0x04,0x0c,0x8c,0x39,0x31,0x29,0xfb,0x89,\r\n0x05,0x9a,0xfc,0x0e,0xa2,0x31,0x2c,0x34,0x04,0x65,0x01,0xb4,0x8d,0xa3,0xa3,0x8d,0xbc,0x63,0x59,0x00,0x00,0x02,0x00,0xa6,0xfe,0x8b,0x04,0xda,0x05,0xf2,0x00,0x11,0x00,0x1e,0x00,0x49,0x40,0x0a,0x1e,0xc4,0x12,0x18,0xc4,0x19,0x19,0x01,0x05,0x08,0xb8,0x01,0x2e,0xb6,0x07,0x00,0x11,0x0f,0x0f,0x40,0x0e,0xb8,0x01,0x2e,0x40,0x0f,\r\n0x0c,0x01,0x11,0x1e,0x18,0x80,0x1b,0xda,0x15,0x0d,0x0f,0x0e,0xec,0x01,0x15,0x00,0x3f,0xed,0x3f,0xd6,0xed,0x1a,0xcc,0x32,0x2f,0x01,0x2f,0x33,0xf1,0x1a,0xc9,0x2f,0xcd,0x39,0x2f,0xe1,0x32,0x12,0x39,0x2f,0xfd,0xd4,0xed,0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x11,0x33,0x11,0x36,0x37,0x01,0x33,0x11,0x33,0x03,0x23,0x13,\r\n0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x04,0x19,0xad,0x16,0x2d,0xfe,0x27,0xaa,0x96,0x0c,0x28,0x01,0xe6,0xaa,0xda,0xb0,0xb4,0x4e,0x0f,0xc5,0x94,0x98,0xbf,0x09,0xa2,0x0e,0xb2,0x50,0x68,0x0c,0x03,0x31,0x2b,0x4e,0xfd,0x48,0x04,0x00,0xfc,0xd9,0x1d,0x46,0x02,0xc4,0xfc,0x96,0xfd,0xf5,0x07,0x67,0x8d,0xa3,\r\n0xa3,0x8d,0xbc,0x63,0x59,0x00,0x00,0x01,0x00,0x10,0xfe,0x7e,0x05,0x76,0x05,0x9a,0x00,0x16,0x00,0x62,0x40,0x19,0x0b,0x18,0x0b,0x00,0x4d,0x04,0x03,0x01,0x01,0x00,0x08,0x0b,0x0d,0x06,0x4c,0x00,0x7e,0x07,0x15,0x05,0x28,0x0d,0x06,0x4d,0x05,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x05,0xb8,0xff,0xda,0x40,0x1a,0x0b,0x06,0x4d,0x20,\r\n0x05,0x01,0x05,0x15,0x05,0x15,0x18,0x0f,0x06,0x91,0x16,0x03,0x0f,0x11,0x91,0x0c,0x13,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xfd,0xc6,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x2b,0x2b,0x11,0x33,0xf1,0x2b,0xc1,0x2f,0xcd,0x39,0x31,0x30,0x00,0x2b,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x21,0x02,0x02,\r\n0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x12,0x13,0x21,0x04,0xa4,0xd2,0xb8,0xc1,0xab,0xac,0xfe,0x72,0x45,0x50,0x52,0x8c,0x62,0x4f,0x3a,0x33,0x3e,0x3e,0x6d,0x71,0x45,0x02,0xc2,0x96,0xfd,0xe8,0x01,0x82,0x05,0x02,0xfd,0xe2,0xfe,0x40,0xd4,0x67,0x15,0x9e,0x1d,0x94,0x02,0x6e,0x02,0x19,0x00,0x01,0x00,0x10,0xfe,0x8b,\r\n0x04,0x6c,0x04,0x00,0x00,0x12,0x00,0x36,0x40,0x1c,0x07,0xed,0x11,0x04,0x03,0x01,0x01,0x00,0x84,0x11,0x0d,0x05,0x05,0x14,0x0d,0x06,0x95,0x12,0x0f,0x0f,0x95,0x0a,0x15,0x00,0xec,0x05,0x15,0x03,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0xf1,0xc1,0x2f,0xcd,0x39,0x10,0xed,0x31,0x30,0x25,0x33,\r\n0x03,0x23,0x13,0x23,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x03,0x91,0xdb,0xb0,0xb4,0xa3,0xbd,0xee,0x29,0xc7,0xa8,0x33,0x25,0x23,0x29,0xdc,0x3f,0x02,0x1a,0x96,0xfd,0xf5,0x01,0x75,0x03,0x75,0xfe,0x0f,0xfe,0x6e,0x0e,0x8d,0x12,0x03,0x85,0x00,0x01,0x00,0xbc,0xfe,0x7e,0x05,0xc4,0x05,0x9a,0x00,0x0f,\r\n0x00,0x4c,0x40,0x17,0x02,0x06,0x91,0x40,0x0b,0x0a,0x07,0x0b,0x91,0x2b,0x30,0x0d,0x0a,0x03,0x0f,0x91,0x04,0x40,0x04,0x07,0x03,0x00,0x01,0xb8,0x01,0x2c,0x40,0x0e,0x02,0x80,0x00,0x00,0x0f,0x7e,0x0c,0x05,0x05,0x11,0x0b,0x07,0x7e,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0xc1,0x2f,0x1a,0xdd,0xe1,0x12,0x39,0x00,0x2f,0x33,\r\n0x1a,0x10,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x2f,0x31,0x30,0x25,0x03,0x23,0x13,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x05,0xc4,0xb8,0xc1,0xab,0xac,0xfd,0x1a,0xa8,0xa8,0x02,0xe6,0xa8,0x96,0xfd,0xe8,0x01,0x82,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xfc,0x00,0x01,0x00,0xa6,\r\n0xfe,0x8b,0x04,0xd3,0x04,0x00,0x00,0x0f,0x00,0x4a,0x40,0x14,0x06,0x95,0x40,0x0b,0x0a,0x07,0x0b,0x95,0x2b,0x30,0x0d,0x0a,0x0f,0x02,0x0f,0xec,0x04,0x04,0x07,0x01,0xb8,0x01,0x2c,0x40,0x10,0x02,0x03,0x00,0x00,0x03,0x03,0x0f,0x84,0x0c,0x05,0x05,0x11,0x0b,0x06,0x84,0x08,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x32,0x2f,0x33,\r\n0x2f,0x10,0xdd,0xe1,0x00,0x2f,0x33,0x10,0xed,0x2f,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x31,0x30,0x25,0x03,0x23,0x13,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0xd3,0xb0,0xb4,0xa3,0xbe,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x96,0xfd,0xf5,0x01,0x75,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,\r\n0xfc,0x96,0x00,0x01,0x00,0xbc,0xfe,0x7e,0x07,0x44,0x05,0x9a,0x00,0x1f,0x00,0x2b,0x40,0x15,0x04,0x03,0x01,0x01,0x00,0x7e,0x1e,0x05,0x05,0x21,0x17,0x14,0x7e,0x15,0x1f,0x03,0x00,0x91,0x05,0x12,0x03,0x00,0x2f,0x3f,0xed,0x3f,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0xc1,0x2f,0xcd,0x39,0x31,0x30,0x25,0x33,0x03,0x23,0x13,\r\n0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x06,0x72,0xd2,0xb8,0xc1,0xab,0xab,0x0e,0x04,0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x15,0x16,0x04,0x08,0xa2,0xde,0x01,0xb8,0x33,0x0f,0x06,0x2b,0x1a,0x01,0xc1,0xd2,0x96,0xfd,0xe8,0x01,0x82,\r\n0x03,0xc2,0x72,0xa5,0x61,0x2a,0xfb,0xb2,0x04,0x46,0x30,0x63,0x56,0xc3,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x73,0x39,0x76,0x3a,0x03,0xe4,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x05,0xd3,0x04,0x00,0x00,0x17,0x00,0x29,0x40,0x14,0x04,0x03,0x01,0x16,0x00,0x84,0x05,0x05,0x19,0x11,0x0e,0xed,0x0f,0x17,0x0f,0x00,0xec,0x05,0x15,0x03,0x00,0x2f,\r\n0x3f,0xed,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xe1,0x33,0xdd,0xcd,0x39,0x31,0x30,0x25,0x33,0x03,0x23,0x13,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,0x33,0x04,0xf8,0xdb,0xb0,0xb4,0xa3,0xbc,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,\r\n0x01,0x06,0xda,0x96,0xfd,0xf5,0x01,0x75,0x03,0x4c,0x40,0x7c,0xfd,0x70,0x02,0x90,0x35,0x87,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x49,0x81,0xc6,0x02,0xa0,0x00,0x00,0x01,0x00,0x5a,0x01,0xfa,0x03,0xf6,0x02,0x7b,0x00,0x03,0x00,0x0e,0xb4,0x03,0x02,0x01,0xeb,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0xf6,\r\n0xfc,0x64,0x03,0x9c,0x01,0xfa,0x81,0x00,0x00,0x02,0x00,0x6e,0x03,0xf4,0x02,0xa0,0x05,0xb2,0x00,0x03,0x00,0x07,0x00,0x1c,0x40,0x0e,0x05,0xb4,0x07,0x01,0xb4,0x03,0x06,0xb3,0x07,0x04,0x02,0xb3,0x03,0x04,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x13,0x23,0x03,0x21,0x13,0x23,0x03,0x01,0x04,0x6c,0x76,\r\n0x8c,0x01,0xc3,0x6f,0x76,0x8c,0x05,0xb2,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0x03,0x00,0x8d,0x03,0xdb,0x03,0x9d,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x20,0x40,0x0e,0x08,0x0a,0x04,0x06,0x00,0x02,0x0a,0x06,0x02,0xb3,0x0b,0x07,0x03,0x03,0x00,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x2f,0xcd,0x2f,0xcd,\r\n0x31,0x30,0x01,0x03,0x23,0x13,0x21,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x01,0x69,0x69,0x73,0x55,0x02,0xbb,0x6a,0x74,0x56,0x93,0x69,0x73,0x55,0x05,0x9a,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0xfe,0x41,0x01,0xbf,0x00,0x03,0x00,0xe8,0x00,0x69,0x04,0x94,0x04,0x3a,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x43,0x40,0x1b,0x02,0x01,\r\n0xbe,0x59,0x0a,0x02,0x0e,0x59,0x0a,0x09,0xbe,0x59,0x06,0x05,0xbe,0x59,0x0a,0x06,0x42,0x06,0x4f,0x0a,0x01,0x0a,0x03,0x0b,0x04,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x04,0x02,0x0a,0x05,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x05,0x2f,0x2b,0x33,0x33,0x2f,0x2b,0x33,0x33,0x00,0x2f,0x5d,0xc6,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x25,\r\n0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x04,0x94,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0x69,0x84,0x02,0xc9,0x84,0xfd,0xd9,0x84,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x03,0xdf,0x05,0xb2,0x00,0x15,0x00,0x1f,0x40,0x0f,0x0b,0x15,0x15,0x17,0x10,0x7d,0x05,0x0d,0x91,0x08,0x04,0x13,0x91,0x02,\r\n0x13,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe1,0x11,0x39,0x2f,0x33,0x31,0x30,0x25,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x03,0xdf,0x85,0xc7,0xff,0x00,0xfe,0xcb,0x01,0x5b,0x01,0x0b,0xab,0x70,0x7c,0x96,0xc7,0xf8,0xe7,0xbc,0xaf,0x7f,0x3c,0x54,0x01,0x8a,0x01,\r\n0x40,0x01,0x58,0x01,0xa8,0x3b,0xb3,0x56,0xfe,0xb6,0xfe,0xec,0xfe,0xfa,0xfe,0xc9,0x60,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x05,0xd2,0x05,0x9a,0x00,0x25,0x00,0x32,0x40,0x1a,0x0b,0x7e,0x09,0x0c,0x0c,0x27,0x00,0x23,0x7e,0x24,0x04,0x1e,0x10,0x03,0x25,0x18,0x18,0x24,0x25,0x03,0x24,0x12,0x0c,0x12,0x09,0x03,0x00,0x3f,0x3f,0x3f,\r\n0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x01,0x2f,0xe1,0x32,0x12,0x39,0x2f,0x33,0xe1,0x31,0x30,0x01,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x11,0x23,0x11,0x34,0x36,0x37,0x23,0x0e,0x03,0x07,0x01,0x23,0x01,0x2e,0x03,0x27,0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x01,0x95,0x01,0x74,0x19,0x21,0x08,0x06,0x0a,0x1d,0x1a,0x01,\r\n0x64,0xdc,0xa7,0x07,0x07,0x04,0x07,0x18,0x1b,0x16,0x05,0xfe,0x8f,0x52,0xfe,0x90,0x04,0x19,0x1a,0x17,0x05,0x04,0x04,0x04,0xa2,0x05,0x9a,0xfd,0x56,0x2d,0x4e,0x1d,0x1e,0x50,0x2e,0x02,0xa6,0xfa,0x66,0x03,0xc2,0x39,0x91,0x53,0x18,0x3b,0x37,0x2c,0x0b,0xfd,0x58,0x02,0xa6,0x0c,0x2d,0x37,0x3a,0x19,0x2b,0x92,0x62,0xfc,0x40,0x05,\r\n0x9a,0x00,0x00,0x01,0x00,0xa6,0xfe,0x2a,0x04,0xf8,0x04,0x00,0x00,0x13,0x00,0x32,0x40,0x1a,0x13,0x84,0x12,0x02,0x02,0x15,0x0d,0x09,0xed,0x0c,0x12,0x0f,0x10,0x09,0x02,0x03,0x0c,0x06,0x06,0x01,0x0c,0x0f,0x0b,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xe1,\r\n0x31,0x30,0x21,0x23,0x11,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x37,0x01,0x33,0x04,0xf8,0xa2,0x16,0x2e,0xff,0x00,0x93,0xfe,0xf8,0x15,0x2f,0x8d,0xd1,0x01,0x0e,0x1d,0x2d,0x49,0x01,0x06,0xda,0x03,0x4c,0x2c,0x54,0xfe,0x42,0x01,0xbe,0x24,0x5c,0xfa,0xde,0x05,0xd6,0xfe,0x33,0x32,0x59,0x89,0x01,\r\n0xcf,0x00,0x00,0x01,0xff,0xdc,0xfe,0x68,0x00,0x24,0x06,0xd6,0x00,0x03,0x00,0x11,0xb3,0x03,0x02,0x1b,0x01,0xb9,0x04,0xf1,0x00,0x02,0x2f,0xed,0x00,0x3f,0x2f,0x31,0x30,0x13,0x11,0x23,0x11,0x24,0x48,0x06,0xd6,0xf7,0x92,0x08,0x6e,0x00,0x00,0x01,0xff,0x25,0xfe,0x68,0x00,0xdb,0x06,0xd6,0x00,0x0e,0x00,0x44,0x40,0x0c,0x07,0x06,\r\n0x03,0x04,0x01,0x09,0x0a,0x0d,0x0c,0x08,0x0b,0x00,0xb8,0x04,0xf1,0x40,0x13,0x05,0x01,0x0a,0x09,0x07,0x0c,0x0d,0x08,0x0b,0x05,0x02,0x0e,0x05,0x04,0x03,0x06,0x07,0x01,0x1b,0x00,0x3f,0x2f,0x33,0xdc,0x32,0x17,0x39,0xc4,0x32,0x10,0xc4,0x32,0x01,0x2f,0x33,0xfd,0x32,0x39,0xde,0x32,0xc4,0x32,0x10,0xde,0x32,0xc4,0x32,0x31,0x30,\r\n0x13,0x23,0x11,0x07,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x24,0x48,0x86,0x31,0xab,0xab,0x31,0xaa,0xaa,0x31,0xab,0xab,0x31,0x86,0xfe,0x68,0x07,0x43,0x88,0x31,0xa9,0xa8,0x31,0xab,0xab,0x31,0xa8,0xa9,0x31,0x88,0x00,0x00,0x01,0xff,0xdc,0xfe,0x68,0x01,0xaf,0x06,0xd6,0x00,0x0a,0x00,0x30,0xb7,0x0a,0x09,0x03,\r\n0x08,0x00,0x01,0x02,0x07,0xb8,0x04,0xf1,0xb4,0x04,0x02,0x01,0x00,0x04,0xb8,0x04,0xf1,0xb4,0x08,0x09,0x0a,0x05,0x1b,0x00,0x3f,0x2f,0x33,0xdd,0xfd,0x39,0xcc,0x32,0x01,0x2f,0xed,0xde,0x32,0xcd,0x39,0x39,0xc4,0x32,0x31,0x30,0x01,0x07,0x27,0x37,0x21,0x11,0x23,0x11,0x21,0x27,0x37,0x01,0xaf,0xd9,0x31,0x89,0xfe,0xf6,0x48,0x01,\r\n0x52,0x89,0x31,0x05,0xff,0xd6,0x31,0x82,0xf8,0x8c,0x07,0xbb,0x82,0x31,0x00,0x01,0xfe,0x51,0xfe,0x68,0x00,0x24,0x06,0xd6,0x00,0x0a,0x00,0x32,0xb7,0x03,0x09,0x06,0x05,0x04,0x07,0x08,0x0a,0xb8,0x04,0xf1,0xb5,0x02,0x06,0x09,0x04,0x05,0x02,0xb8,0x04,0xf1,0xb4,0x09,0x08,0x07,0x00,0x1b,0x00,0x3f,0x2f,0x33,0xdd,0xfd,0xcc,0x32,\r\n0x12,0x39,0x01,0x2f,0xed,0xdc,0x32,0xc4,0x32,0xcd,0x39,0x39,0x31,0x30,0x13,0x23,0x11,0x21,0x17,0x07,0x27,0x37,0x17,0x07,0x21,0x24,0x48,0xfe,0xf6,0x89,0x31,0xd9,0xd9,0x31,0x89,0x01,0x52,0xfe,0x68,0x07,0x74,0x82,0x31,0xd6,0xd7,0x31,0x82,0x00,0x00,0x01,0x00,0xab,0xff,0xf2,0x02,0x01,0x05,0xec,0x00,0x0e,0x00,0x1b,0xb1,0x0e,\r\n0x09,0xb8,0x05,0x0a,0xb2,0x06,0x07,0x0e,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x01,0x2f,0xed,0xc4,0x31,0x30,0x05,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x02,0x01,0x14,0x66,0x7f,0x45,0x18,0x9c,0x0a,0x26,0x4a,0x40,0x0e,0x3e,0x66,0x82,0x45,0x04,0x8f,0xfb,0xac,0x42,0x60,0x3f,0x1e,0x00,\r\n0xff,0xff,0x00,0x49,0xff,0xf2,0x02,0x01,0x07,0xe9,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x00,0xff,0xff,0xff,0xa2,0xff,0xf2,0x02,0x65,0x07,0x30,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x37,0x00,0x00,0xff,0xff,0x00,0x49,0xfd,0xfe,0x02,0x01,0x05,0xec,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x7f,\r\n0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,\r\n0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xa3,0xff,0xa7,0x00,0x01,0xff,0xba,0xff,0xf2,\r\n0x04,0x7c,0x03,0x0f,0x00,0x28,0x00,0x2c,0x40,0x0a,0x0c,0x21,0x2a,0x15,0x21,0x0c,0x20,0x03,0x00,0x12,0xb8,0x04,0xff,0xb4,0x2f,0x19,0x01,0x19,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x12,0x17,0x39,0x01,0x2f,0x12,0x39,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,\r\n0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x0e,0x05,0x23,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x2b,0x73,0x92,0xb1,0xd0,0xf1,0x88,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,\r\n0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x0a,0x42,0x59,0x62,0x53,0x36,0x00,0x00,0x01,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x00,0x40,0x00,0x5c,0xb9,0x00,0x03,0x05,0x0b,0x40,0x0c,0x0f,0x00,0x0f,0x1c,0x0f,0x35,0x35,0x0f,0x1c,0x03,0x09,0x14,0xb8,0x05,0x0a,0xb3,0x25,0x09,0x03,\r\n0x0f,0xb8,0x04,0xfb,0xb5,0x40,0x39,0x2d,0x2d,0x20,0x32,0xbb,0x04,0xff,0x00,0x39,0x00,0x19,0x04,0xfc,0xb6,0x1f,0x20,0x2f,0x20,0x02,0x20,0x08,0xba,0x04,0xfb,0x00,0x09,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xe4,0x32,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,\r\n0x31,0x30,0x01,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x04,0x0c,0x22,0x40,0x1e,0x05,0x26,0x46,0x69,0x47,0x18,0x63,\r\n0x8f,0x5f,0x31,0x05,0x8d,0xc0,0x75,0x32,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x02,0x01,0x09,0x12,0x09,0x60,0x7e,0x49,0x1d,0xa7,0x3f,0x75,0xa6,0x67,0x33,0x6e,0x77,0x80,\r\n0x45,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,\r\n0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xda,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0x00,0x01,0xff,0xba,0xff,0xf2,0x05,0xf4,0x03,0x0f,0x00,0x42,0x00,0x60,0xb1,0x18,0x00,0xbb,0x05,0x0a,0x00,0x40,0x00,0x0d,0x05,0x0a,0x40,0x09,0x0a,0x21,0x33,0x40,0x0a,0x40,0x0a,0x44,0x36,0xb8,0x05,0x0a,0xb6,0x33,\r\n0x41,0x2f,0x35,0x01,0x35,0x26,0xba,0x05,0x03,0x00,0x1d,0x05,0x03,0xb7,0x3b,0x2e,0x2e,0x2d,0x2d,0x21,0x18,0x05,0xba,0x04,0xfb,0x00,0x12,0x05,0x03,0xb3,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0x3f,0xed,0x39,0x39,0x32,0x11,0x33,0x11,0x33,0x3f,0x3f,0x2f,0x5d,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,\r\n0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0xf3,0x0b,0x27,\r\n0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x39,0x5d,0x77,0x3f,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x21,0x64,0x77,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,\r\n0x37,0x6c,0x85,0x4a,0x19,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0x0b,0xc9,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,\r\n0x00,0x02,0xff,0xba,0xff,0xea,0x07,0x4b,0x03,0x3c,0x00,0x39,0x00,0x4b,0x00,0x52,0xb9,0x00,0x2a,0x05,0x0a,0x40,0x0d,0x3f,0x49,0x1e,0x1e,0x15,0x3f,0x3f,0x4d,0x16,0x15,0x00,0x15,0x31,0xba,0x05,0x03,0x00,0x44,0x04,0xfb,0x40,0x0f,0x2f,0x25,0x01,0x25,0x2f,0x15,0x01,0x15,0x49,0x49,0x3a,0x3a,0x1e,0x1e,0x0c,0xba,0x04,0xfb,0x00,\r\n0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x33,0x11,0x33,0x2f,0x2f,0x5d,0x2f,0x5d,0xed,0x3f,0x12,0x39,0x01,0x2f,0xcd,0x12,0x39,0x2f,0x12,0x39,0x10,0xcd,0x10,0xed,0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,\r\n0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x26,0x26,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x01,0x98,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x27,0x42,0x30,0x1c,0x0f,0x0d,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,\r\n0x65,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb3,0xff,0x00,0xaf,0x69,0x1b,0x23,0x2e,0x14,0x03,0x61,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x6d,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x18,0x27,0x33,0x1b,0x30,0x6e,0x3d,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,\r\n0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,0x2f,0x16,0x05,0x01,0x06,0x0d,0x0c,0x0f,0x31,0x23,0x26,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0x00,0x01,0x00,0xb9,0x01,0xac,0x02,0x89,0x03,0x7c,0x00,0x13,0x00,0x13,0xb6,0x0f,0x05,0x05,0x15,0x14,0x00,0x0a,0x00,0x2f,0xcd,0x11,0x12,0x01,\r\n0x39,0x2f,0xcd,0x31,0x30,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xa3,0x29,0x52,0x45,0x2a,0x2b,0x44,0x52,0x29,0x29,0x51,0x43,0x29,0x29,0x43,0x51,0x01,0xac,0x29,0x43,0x51,0x29,0x28,0x53,0x44,0x2b,0x2a,0x45,0x52,0x29,0x29,0x51,0x43,0x29,0x00,0x01,0x00,0x2b,0x00,0x00,0x01,0x56,\r\n0x05,0x9a,0x00,0x0f,0x00,0x19,0xbc,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x08,0x04,0xe6,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x3f,0x01,0x2f,0xed,0x31,0x30,0x13,0x1e,0x05,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x17,0x26,0x1f,0x18,0x0f,0x08,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0x62,0xad,0xa2,0x9f,0xaa,0xb9,0x6c,\r\n0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x01,0x00,0x2b,0x00,0x00,0x03,0x50,0x05,0x9a,0x00,0x0f,0x00,0x28,0xb5,0x03,0x0a,0x01,0x01,0x11,0x09,0xbd,0x05,0x0a,0x00,0x0a,0x00,0x09,0x04,0xe6,0x00,0x02,0x04,0xfb,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x31,0x30,\r\n0x13,0x21,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x2b,0x03,0x25,0xfd,0xa1,0x19,0x26,0x19,0x0d,0x9c,0x11,0x23,0x36,0x05,0x9a,0xa7,0x71,0xca,0xd0,0xe4,0x89,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x00,0x01,0x00,0x2b,0x00,0x00,0x04,0x1a,0x05,0x9a,0x00,0x38,0x00,0x5c,0xb3,0x1c,0x0d,0x32,0x1f,0xbb,\r\n0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x40,0x0d,0x0b,0x27,0x0b,0x1a,0x0b,0x1a,0x0b,0x3a,0x32,0x03,0x2b,0x2b,0x31,0xbb,0x05,0x0a,0x00,0x32,0x00,0x31,0x04,0xe6,0xb4,0x2b,0x2b,0x29,0x29,0x24,0xb8,0x04,0xfc,0xb7,0x06,0x15,0x1c,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x32,0x2f,0x33,0xed,0x32,0x2f,0x32,0x2f,0x3f,0x01,\r\n0x2f,0xed,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x27,0x1e,\r\n0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x15,0x24,0x0f,0x15,0x26,0x11,0x2a,0x3b,0x26,0x11,0x24,0x9d,0x24,0x1f,0x1d,0x34,0x17,0x2a,0x3b,0x26,0x11,0x24,0x9d,0x24,0x26,0x4a,0x6c,0x46,0x2d,0x67,0x3c,0x47,0x63,0x29,0x2b,0x0b,0x10,0x0b,0x06,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0x5b,0xa1,0x4c,0x05,0x04,0x1c,0x30,\r\n0x3f,0x24,0x54,0x4e,0x59,0x56,0x51,0x40,0x09,0x08,0x1c,0x30,0x3f,0x24,0x54,0x4e,0x59,0x56,0x3e,0x6b,0x4f,0x2d,0x18,0x1c,0x33,0x09,0x43,0x88,0x91,0x9f,0x5a,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x00,0x01,0x00,0x62,0xff,0xea,0x02,0xf5,0x05,0xb8,0x00,0x31,0x00,0x3f,0xb9,0x00,0x2c,0x05,0x0a,0xb2,0x21,0x21,\r\n0x07,0xb8,0x05,0x0a,0xb7,0x17,0x17,0x33,0x32,0x31,0x1c,0x12,0x27,0xb8,0x05,0x02,0xb7,0x2f,0x26,0x01,0x26,0x0f,0x10,0x10,0x0c,0xba,0x04,0xfb,0x00,0x12,0x05,0x03,0x00,0x3f,0xed,0x33,0x11,0x33,0x2f,0x5d,0xed,0x12,0x39,0x39,0x11,0x12,0x01,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x0e,0x05,0x15,0x14,0x1e,0x02,0x33,0x32,\r\n0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x02,0x67,0x54,0x76,0x50,0x2e,0x18,0x07,0x2b,0x47,0x58,0x2d,0x4b,0x79,0x3a,0x7e,0x8e,0x47,0x8b,0x70,0x45,0x1b,0x42,0x6f,0x54,0x50,0x6b,0x3f,0x1a,0x2c,0x6d,0xb6,0x8a,0x73,0x87,0x45,\r\n0x14,0x1f,0x52,0x90,0x72,0x03,0x13,0x4e,0x7f,0x67,0x50,0x3b,0x29,0x0c,0x2a,0x35,0x1d,0x0a,0x13,0x0f,0xa5,0x2c,0x1d,0x40,0x65,0x47,0x29,0x69,0x7e,0x93,0x53,0x25,0x44,0x45,0x49,0x2a,0x36,0x71,0x6f,0x69,0x2f,0xb0,0x24,0x46,0x3f,0x33,0x10,0x18,0x29,0x35,0x48,0x38,0x00,0x02,0x00,0x4f,0x00,0x9c,0x03,0xa9,0x04,0xd2,0x00,0x15,\r\n0x00,0x29,0x00,0x31,0xb9,0x00,0x1b,0x05,0x0a,0xb3,0x0f,0x0f,0x2a,0x05,0xbb,0x05,0x0a,0x00,0x25,0x00,0x0a,0x04,0xfb,0xb4,0x2f,0x20,0x01,0x20,0x16,0xb8,0x04,0xff,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,\r\n0x02,0x35,0x34,0x3e,0x04,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0xf4,0x47,0x9b,0x80,0x53,0x3d,0x72,0xa4,0x67,0x65,0x9b,0x6a,0x36,0x27,0x41,0x56,0x5e,0x5f,0x28,0x28,0x5c,0x4e,0x34,0x2a,0x48,0x5f,0x36,0x4a,0x6a,0x45,0x20,0x3b,0x56,0x62,0x04,0xd2,0x55,0xa5,0xf2,0x9c,0x60,0x9f,\r\n0x71,0x3e,0x38,0x66,0x90,0x59,0x69,0xb7,0x99,0x78,0x52,0x2c,0xa2,0x4a,0x85,0xbb,0x70,0x41,0x5c,0x3a,0x1a,0x22,0x3e,0x58,0x37,0x77,0xbd,0x83,0x45,0x00,0x00,0x01,0xff,0xef,0x00,0x00,0x03,0x92,0x05,0x9a,0x00,0x15,0x00,0x22,0xb1,0x15,0x0e,0xb8,0x05,0x0a,0xb2,0x00,0x09,0x0a,0xb8,0x04,0xfb,0xb4,0x2f,0x0d,0x01,0x0d,0x00,0xb8,\r\n0x04,0xe6,0x00,0x3f,0x2f,0x5d,0xed,0x01,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x2e,0x07,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x02,0xee,0x18,0x25,0x1c,0x15,0x0e,0x0b,0x07,0x06,0x03,0x03,0xfd,0x9b,0x02,0xfc,0x06,0x04,0x08,0x0d,0x14,0x21,0x31,0x22,0x66,0xa6,0x8e,0x7c,0x79,0x7b,0x8d,0xa4,0x65,0x53,0xa7,0xc6,0x8c,0xd7,\r\n0xb7,0xa6,0xb5,0xd5,0x8a,0x00,0x00,0x01,0xff,0xf4,0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x11,0x00,0x14,0xb1,0x04,0x0b,0xb8,0x04,0xe6,0xb4,0x07,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x3f,0x39,0x31,0x30,0x13,0x12,0x12,0x13,0x33,0x12,0x12,0x13,0x33,0x02,0x02,0x03,0x23,0x26,0x0a,0x02,0x27,0x93,0x65,0xae,0x4e,0x06,0x51,0xad,\r\n0x64,0x9e,0x80,0xd8,0x61,0x94,0x33,0x69,0x6d,0x73,0x3d,0x05,0x9a,0xfe,0xf0,0xfd,0xc1,0xfe,0xcb,0x01,0x36,0x02,0x3f,0x01,0x0f,0xfe,0x9f,0xfd,0x39,0xfe,0x8e,0xc2,0x01,0x71,0x01,0x64,0x01,0x59,0xaa,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x04,0x4f,0x05,0x9a,0x00,0x11,0x00,0x21,0x40,0x0d,0x11,0x00,0x00,0x13,0x07,0x08,0x04,0x2f,\r\n0x0d,0x01,0x0d,0x07,0x00,0xb8,0x04,0xe6,0x00,0x3f,0x32,0x2f,0x5d,0x39,0x01,0x2f,0x33,0x12,0x39,0x11,0x33,0x31,0x30,0x21,0x02,0x02,0x03,0x23,0x02,0x02,0x03,0x23,0x36,0x1a,0x02,0x37,0x33,0x12,0x12,0x13,0x03,0xb0,0x65,0xae,0x4e,0x06,0x51,0xad,0x64,0x9e,0x40,0x75,0x6d,0x66,0x31,0x94,0x66,0xd8,0x7b,0x01,0x10,0x02,0x3f,0x01,\r\n0x35,0xfe,0xca,0xfd,0xc1,0xfe,0xf1,0xb1,0x01,0x61,0x01,0x65,0x01,0x6a,0xb9,0xfe,0x7d,0xfd,0x3c,0xfe,0xad,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x03,0xdb,0x05,0xa8,0x00,0x1e,0x00,0x33,0x00,0x3a,0xb9,0x00,0x1a,0x05,0x0a,0xb4,0x06,0x1f,0x1f,0x35,0x2c,0xb8,0x05,0x0a,0xb2,0x0d,0x06,0x08,0xb8,0x04,0xfb,0xb4,0x2f,0x31,0x01,0x31,\r\n0x27,0xb8,0x04,0xfb,0xb4,0x2f,0x12,0x01,0x12,0x00,0xb8,0x04,0xe6,0x00,0x3f,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x23,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x01,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,\r\n0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x03,0xdb,0x9f,0x29,0x36,0x24,0x15,0x08,0x7e,0x78,0x50,0x8d,0x69,0x3e,0x33,0x60,0x8c,0x5a,0x58,0x8d,0x3c,0x20,0x26,0x16,0x0c,0x06,0x07,0x14,0x26,0x3e,0xfe,0xe5,0x04,0x08,0x0a,0x0e,0x0a,0x23,0x6f,0x45,0x2c,0x4b,0x37,0x20,0x28,0x46,0x61,0x39,0x30,0x67,0x61,0xbd,0xb1,0xa3,0x48,0x3b,\r\n0x34,0x61,0x8e,0x5a,0x50,0x9a,0x78,0x4a,0x51,0x5e,0x33,0x63,0x6d,0x7b,0x49,0x52,0xb5,0xcb,0xe2,0x02,0xd4,0x2a,0x42,0x38,0x32,0x1a,0x58,0x61,0x26,0x40,0x58,0x31,0x37,0x56,0x3c,0x1f,0x17,0x00,0xff,0xff,0xff,0xba,0xff,0xea,0x07,0x4b,0x04,0xb2,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x01,\r\n0xff,0xba,0xff,0xf2,0x04,0x3c,0x03,0x8a,0x00,0x2c,0x00,0x36,0xb9,0x00,0x24,0x05,0x0a,0xb5,0x13,0x13,0x2e,0x2d,0x1c,0x1f,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x18,0x01,0x18,0x00,0x2c,0x2c,0x29,0x29,0x0c,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0xed,\r\n0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x37,0x04,0x3c,0x78,0xd5,0xc9,0xc5,0x67,0xfa,0x23,0x23,0x23,0x23,0x01,0x71,0x01,0x3e,0x4e,0x2c,0x0f,0x45,0x82,0xbc,0x77,0x28,\r\n0x59,0x30,0x2e,0x63,0x36,0x3f,0x76,0x5c,0x37,0x16,0x36,0x5c,0x47,0x80,0xf9,0x8c,0xab,0x37,0x47,0x2a,0x11,0x34,0x20,0x20,0x33,0x06,0x33,0x63,0x5c,0x51,0x21,0x4f,0x8e,0x6b,0x3f,0x08,0x09,0xaa,0x08,0x0b,0x14,0x35,0x5a,0x45,0x21,0x4c,0x53,0x59,0x2e,0x19,0x54,0x42,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0xad,0x03,0x5e,0x00,0x29,\r\n0x00,0x38,0x00,0x47,0xb3,0x28,0x13,0x23,0x31,0xb8,0x05,0x0a,0xb3,0x16,0x16,0x39,0x23,0xb8,0x05,0x0a,0xb7,0x2a,0x05,0x13,0x28,0x34,0x04,0x01,0x2d,0xb8,0x04,0xff,0xb7,0x2f,0x1c,0x01,0x1c,0x10,0x0f,0x0f,0x00,0xbb,0x04,0xfb,0x00,0x08,0x00,0x01,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x01,\r\n0x2f,0xed,0x11,0x33,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x25,0x15,0x23,0x22,0x26,0x27,0x06,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x36,0x37,0x26,0x26,0x27,0x35,0x3e,0x03,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x16,0x16,0x17,0x3e,0x03,0x04,0xad,0x3e,0x87,\r\n0xef,0x6d,0x67,0xfe,0xf0,0xae,0x67,0x23,0x23,0x23,0x23,0x71,0x80,0xc7,0x4f,0x6a,0xad,0x45,0x2d,0x72,0x7e,0x85,0x3f,0x27,0x54,0x50,0x47,0x36,0x20,0x19,0x35,0x52,0x39,0xb8,0x7c,0x79,0x67,0x4c,0x9e,0x49,0x45,0xa7,0x69,0x34,0x49,0x2d,0x14,0x99,0xa7,0x4a,0x45,0x40,0x4f,0x34,0x20,0x20,0x33,0x2a,0x23,0x58,0xd0,0x70,0xad,0x07,\r\n0x12,0x0f,0x0b,0x05,0x10,0x1c,0x2d,0x41,0x2c,0x26,0x65,0x70,0x74,0x36,0x55,0x01,0xcb,0x33,0x2a,0x0f,0x08,0x0b,0x6a,0xb1,0x48,0x29,0x58,0x51,0x42,0x00,0x00,0x02,0x00,0x65,0xfd,0xff,0x04,0xad,0x03,0x95,0x00,0x3c,0x00,0x4a,0x00,0x63,0xb3,0x3a,0x23,0x1e,0x35,0xbb,0x05,0x0a,0x00,0x3d,0x00,0x44,0x05,0x0a,0xb2,0x28,0x28,0x0d,\r\n0xb8,0x05,0x0a,0x40,0x0e,0x1e,0x3d,0x1e,0x3d,0x1e,0x4c,0x4b,0x08,0x3a,0x23,0x46,0x04,0x02,0x40,0xb8,0x04,0xff,0xb5,0x2f,0x2e,0x01,0x2e,0x15,0x12,0xb8,0x04,0xfc,0xb7,0x16,0x1f,0x19,0x2f,0x19,0x02,0x19,0x00,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0xed,0x12,0x17,0x39,0x11,0x12,\r\n0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x27,0x35,0x3e,0x03,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,\r\n0x03,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x16,0x17,0x3e,0x03,0x04,0x98,0x15,0x3e,0x56,0xa3,0x98,0x8d,0x40,0x4d,0x68,0x40,0x1b,0x2e,0x63,0x9e,0x71,0x61,0xc7,0x64,0x6d,0xbf,0x64,0x98,0xd7,0x89,0x40,0x1c,0x48,0x7e,0x62,0x20,0x46,0x44,0x3e,0x16,0x2d,0x72,0x7f,0x85,0x3f,0x27,0x54,0x4f,0x48,0x35,0x20,0x1b,0x48,0x80,0x66,0x70,\r\n0xf2,0xb6,0x78,0x67,0x4c,0x9f,0x49,0x71,0x87,0x55,0x6e,0x40,0x18,0x99,0xa7,0x26,0x45,0x61,0x3b,0x20,0x46,0x4a,0x4f,0x28,0x40,0x72,0x55,0x32,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5b,0x36,0x69,0x69,0x67,0x33,0x22,0x58,0x5e,0x5d,0x26,0xa5,0x07,0x12,0x0f,0x0b,0x06,0x0f,0x1b,0x2c,0x3e,0x2a,0x23,0x5f,0x6b,0x6f,0x31,0x52,\r\n0x59,0x02,0x07,0x2f,0x29,0x0f,0x08,0x0d,0xb0,0x81,0x26,0x4d,0x44,0x36,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x02,0xff,0xff,\r\n0x00,0x65,0xfd,0xff,0x04,0xad,0x05,0x01,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x51,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,\r\n0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,\r\n0x0f,0x51,0x00,0xd5,0x04,0x74,0x00,0x01,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x00,0x21,0x00,0x33,0xb9,0x00,0x1a,0x05,0x0a,0x40,0x12,0x0c,0x0c,0x23,0x22,0x11,0x12,0x0c,0x1a,0x15,0x12,0x04,0x00,0x14,0x2f,0x13,0x01,0x13,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0x12,0x17,0x39,0x11,0x33,0x11,\r\n0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x23,0x23,0x23,0x01,0x28,0x61,0x80,0x4c,0x1e,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0x8b,0xe1,0x9e,0x56,0x0b,0x23,0x42,0x6d,0xa0,0x6f,0x0e,0x34,\r\n0x20,0x20,0x33,0x16,0x2a,0x3f,0x29,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x42,0x8a,0x97,0xa6,0x5d,0x1e,0x4a,0x4d,0x49,0x39,0x22,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x01,0xf2,0x05,0xec,0x00,0x16,0x00,0x20,0xb9,0x00,0x08,0x05,0x0a,0xb4,0x05,0x05,0x18,0x17,0x00,0xbb,0x04,0xfb,0x00,0x0f,0x05,0x03,0x00,0x06,\r\n0x00,0x2f,0x3f,0xed,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x0f,0x2a,0x48,0x39,0x04,0x99,0xfb,0x60,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,\r\n0x20,0x20,0x33,0x00,0x00,0x02,0xff,0xba,0xff,0xf2,0x03,0xf4,0x02,0xaf,0x00,0x23,0x00,0x33,0x00,0x39,0xb9,0x00,0x16,0x05,0x0a,0x40,0x0a,0x2a,0x2a,0x35,0x34,0x20,0x24,0x0c,0x03,0x11,0x1b,0xba,0x05,0x03,0x00,0x2f,0x04,0xfb,0xb5,0x2f,0x11,0x01,0x11,0x27,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,\r\n0xed,0x3f,0x12,0x17,0x39,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,\r\n0x3b,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x35,0x9a,0x5e,0x01,0x6e,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3f,0x2d,0x0e,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1a,0x2f,0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,\r\n0x50,0x43,0x01,0x13,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x53,0xff,0xf2,0x05,0x32,0x04,0x53,0x02,0x06,0x0e,0x5c,0x00,0x00,0x00,0x03,0x00,0x67,0xfd,0xff,0x05,0x58,\r\n0x03,0x56,0x00,0x2f,0x00,0x3f,0x00,0x4f,0x00,0x61,0xb1,0x3f,0x40,0xb8,0x05,0x0a,0xb7,0x00,0x0b,0x0b,0x00,0x00,0x50,0x24,0x17,0xb8,0x05,0x0a,0xb4,0x35,0x4a,0x4a,0x35,0x45,0xb8,0x04,0xfb,0xb6,0x1f,0x29,0x2f,0x29,0x02,0x29,0x3a,0xb8,0x04,0xfb,0x40,0x0c,0x2f,0x12,0x01,0x12,0x3f,0x30,0x30,0x1e,0x1e,0x1d,0x1d,0x0b,0xb8,0x04,\r\n0xfb,0xb2,0x40,0x20,0x00,0xb8,0x05,0x03,0x00,0x3f,0x32,0x32,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x27,0x1e,0x03,0x33,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x17,\r\n0x21,0x15,0x21,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x01,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x02,0x01,0x53,0x7d,0x5b,0x3c,0x13,0x20,0x2c,0x5a,0x65,0x73,0x45,0x15,0x41,0x4e,0x55,0x52,0x49,0x1c,0x2e,0x53,0x3f,0x25,0x17,\r\n0x27,0x34,0x1c,0x02,0x01,0x45,0xfe,0xc0,0x01,0x48,0x40,0x28,0x48,0x64,0x3d,0x26,0x55,0x56,0x50,0x3f,0x29,0x01,0x21,0x30,0x52,0x3a,0x21,0x11,0x1e,0x27,0x15,0x1a,0x48,0x48,0x3c,0x0e,0x0b,0x04,0x2e,0x45,0x52,0x29,0x21,0x2d,0x1c,0x0d,0x20,0x3d,0x58,0x38,0x0e,0x03,0x04,0x06,0x03,0xa9,0x05,0x07,0x04,0x02,0x85,0xcf,0x9c,0x6c,\r\n0x43,0x1e,0x45,0x6e,0x88,0x43,0x35,0x5b,0x4e,0x41,0x19,0x07,0xa7,0x06,0x2d,0x78,0x3e,0x34,0x60,0x4a,0x2c,0x14,0x2e,0x4b,0x6f,0x96,0x01,0x08,0x33,0x53,0x69,0x36,0x28,0x55,0x46,0x2c,0x47,0x87,0xc7,0x7f,0xa7,0x58,0x7d,0x50,0x26,0x16,0x22,0x2c,0x16,0x24,0x4b,0x3c,0x26,0x00,0x00,0x02,0x00,0xa1,0xff,0xf2,0x04,0x02,0x03,0xd7,\r\n0x00,0x1b,0x00,0x29,0x00,0x3f,0xb9,0x00,0x1c,0x05,0x0a,0xb4,0x16,0x16,0x2a,0x24,0x01,0xbb,0x05,0x0a,0x00,0x00,0x00,0x11,0x04,0xfb,0xb4,0x2f,0x21,0x01,0x21,0x07,0xbc,0x04,0xfb,0x00,0x08,0x05,0x03,0x00,0x25,0x04,0xfc,0xb4,0x1b,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xdd,0xed,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x33,0x11,\r\n0x33,0x2f,0xed,0x31,0x30,0x01,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x02,0xac,0x9c,0x0f,0x29,0x48,0x3a,0x16,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,\r\n0xfe,0x8b,0x24,0x3a,0x4f,0x2a,0x27,0x55,0x22,0x4c,0x88,0x66,0x3b,0x03,0xd7,0xfd,0xb5,0x3e,0x5c,0x3c,0x1d,0xa7,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0xfe,0x66,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x03,0x0f,0x02,0x26,\r\n0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x06,0xae,0x02,0x13,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x05,0x64,0x02,0x26,0x08,0xf3,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x29,0x04,0xb4,0x00,0x01,0x00,0x9a,\r\n0xff,0x02,0x06,0xae,0x02,0x13,0x00,0x44,0x00,0x4c,0xb9,0x00,0x36,0x05,0x0a,0xb2,0x0f,0x0f,0x14,0xb8,0x05,0x0a,0xb3,0x31,0x31,0x46,0x27,0xbb,0x05,0x0a,0x00,0x20,0x00,0x0c,0x04,0xff,0xb4,0x2f,0x3b,0x01,0x3b,0x1b,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x2c,0x01,0x2c,0x2f,0x24,0x01,0x24,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,\r\n0x3f,0xed,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,\r\n0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x06,0xae,0x16,0x43,0x67,0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,\r\n0x21,0x2a,0x3b,0x52,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0x00,0x01,\r\n0x00,0x6f,0xff,0xea,0x01,0x76,0x01,0xe7,0x00,0x12,0x00,0x1c,0xb1,0x09,0x0e,0xb8,0x05,0x0c,0xb5,0x05,0x05,0x14,0x13,0x08,0x00,0xb8,0x05,0x03,0x00,0x3f,0xcd,0x11,0x12,0x01,0x39,0x2f,0xed,0x39,0x31,0x30,0x17,0x22,0x2e,0x02,0x35,0x34,0x37,0x13,0x33,0x03,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0xf1,0x1b,0x2f,0x23,0x15,0x0a,0x6a,\r\n0x75,0x4b,0x64,0x02,0x03,0x15,0x24,0x30,0x16,0x15,0x24,0x2f,0x1b,0x15,0x1e,0x01,0x47,0xfe,0xe3,0x23,0x0e,0x18,0x0b,0x23,0x35,0x23,0x11,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x14,0x05,0x3e,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,\r\n0xff,0xff,0x00,0x52,0xff,0xea,0x03,0xf3,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x07,0x0f,0x8c,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x07,0x0f,0x8d,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,\r\n0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x49,0xff,0xea,0x03,0xf3,0x07,0x78,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,\r\n0x00,0x49,0xff,0xea,0x04,0xad,0x07,0x78,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,0xff,0xa2,0xff,0xea,0x03,0xf3,0x06,0xbf,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x02,0x2f,0x2d,\r\n0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x82,0xff,0x02,0x06,0xae,0x04,0x21,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x39,0xfc,0x38,0x00,0x0a,0xb4,0x01,0x2f,0x5b,0x01,0x5b,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x00,0xfe,0xea,0x01,0x77,0x00,0xe4,0x00,0x0f,0x00,0x0a,0xb2,0x02,0x0d,0x07,0x00,0x2f,0x2f,0xcd,\r\n0x30,0x31,0x15,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x36,0x2c,0x4a,0x41,0x2f,0x8c,0x2d,0x94,0x79,0x37,0x33,0x7b,0x0e,0x48,0x47,0x5e,0x80,0x79,0x6e,0x82,0x91,0x15,0xff,0xff,0xff,0xa2,0xff,0xea,0x04,0xad,0x06,0xbf,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,\r\n0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x02,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x6f,0xff,0xea,0x01,0x76,0x04,0x00,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x08,0xf8,0x00,0x00,0x02,0x19,0x00,0x02,0x00,0xab,0xff,0xee,0x03,0x57,0x05,0xb3,0x00,0x29,0x00,0x3d,0x00,0x3e,0xb5,0x00,0x2f,0x24,0x39,0x39,\r\n0x24,0xb8,0x05,0x0a,0xb3,0x05,0x05,0x3f,0x1d,0xbd,0x05,0x0a,0x00,0x0c,0x00,0x34,0x04,0xfe,0x00,0x2a,0x05,0x03,0xb2,0x14,0x15,0x18,0xb8,0x04,0xfc,0xb3,0x2f,0x11,0x01,0x11,0x00,0x2f,0x5d,0xfd,0xc2,0x32,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x10,0xc4,0x39,0x31,0x30,0x01,0x3e,0x03,0x35,0x34,0x2e,0x04,0x35,\r\n0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x03,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xf5,0x04,0x08,0x06,0x04,0x34,0x4e,0x5c,0x4e,0x34,0x3e,0x6c,0x91,0x53,0x48,0x91,0x45,0x3d,0x97,0x46,0x34,0x58,0x41,0x24,\r\n0x33,0x4c,0x58,0x4c,0x33,0x04,0x06,0x09,0x04,0x5a,0x15,0x28,0x1f,0x13,0x12,0x1f,0x28,0x16,0x16,0x28,0x1f,0x12,0x13,0x1f,0x28,0x01,0x8e,0x0c,0x22,0x26,0x25,0x0f,0x3c,0x5b,0x4e,0x4a,0x58,0x6f,0x4b,0x51,0x81,0x5a,0x30,0x23,0x2a,0xac,0x39,0x34,0x1b,0x32,0x48,0x2e,0x38,0x5b,0x53,0x51,0x5c,0x6c,0x44,0x13,0x2a,0x27,0x23,0x0c,\r\n0xfe,0x60,0x11,0x1d,0x28,0x18,0x17,0x29,0x1e,0x11,0x11,0x1e,0x29,0x17,0x18,0x28,0x1d,0x11,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0xe5,0x02,0xb4,0x00,0x1e,0x00,0x3a,0xb5,0x0c,0x00,0x0c,0x00,0x20,0x08,0xb8,0x05,0x0a,0xb3,0x16,0x1e,0x1e,0x03,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x1b,0x01,0x1b,0x10,0x10,0x0f,0x0f,0x0b,0xba,0x04,0xfb,\r\n0x00,0x0d,0x04,0xe6,0x00,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x2f,0x5d,0xed,0x33,0x2f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x27,0x33,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x02,0xac,0x1d,0x43,0x20,0x30,0x53,0x3d,0x24,0x7b,0x79,\r\n0xa9,0xfd,0x92,0x1d,0xa9,0x01,0x19,0x22,0x15,0x09,0x37,0x66,0x8f,0x58,0x1c,0x41,0x20,0x01,0xff,0x05,0x07,0x13,0x2a,0x42,0x30,0x5b,0x5e,0xa3,0x99,0x06,0x19,0x38,0x3b,0x39,0x19,0x45,0x72,0x52,0x2e,0x05,0x05,0x00,0xff,0xff,0xff,0xa2,0x00,0x00,0x02,0x65,0x07,0x30,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x37,0x00,0x00,\r\n0xff,0xff,0x00,0x49,0x00,0x00,0x01,0xa2,0x07,0xe9,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x3e,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xe4,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4d,0x01,0x4d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0xfd,0xfe,\r\n0x01,0xa2,0x05,0xec,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x7f,0x00,0x00,0xff,0xff,0x00,0x82,0xff,0x55,0x05,0x91,0x04,0xcc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0x39,0xfc,0xe3,0x00,0x01,0x00,0xab,0x00,0x00,0x01,0x47,0x05,0xec,0x00,0x03,0x00,0x15,0xbd,0x00,0x01,0x05,0x0a,0x00,0x00,0x00,0x02,0x04,\r\n0xe6,0x00,0x01,0x00,0x2f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x13,0x33,0x11,0x23,0xab,0x9c,0x9c,0x05,0xec,0xfa,0x14,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x05,0x5d,0x02,0x26,0x09,0x28,0x00,0x00,0x00,0x07,\r\n0x0f,0x51,0x01,0x01,0x04,0xad,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0x04,0x02,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,\r\n0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xc8,0xff,0xcf,0x00,0x01,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x40,0x40,0x0a,0x1d,0x00,0x31,0x03,0x16,0x0d,0x0d,0x33,0x26,0x05,0xb8,0x05,0x0a,0xb6,0x16,0x00,0x1d,0x31,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xff,0xb6,0x0e,0x1f,\r\n0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,\r\n0x32,0x1e,0x04,0x17,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,\r\n0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0x00,0x01,0x00,0x52,0xff,0xea,0x03,0x4a,0x03,0xba,0x00,0x19,\r\n0x00,0x24,0xb9,0x00,0x11,0x05,0x0a,0xb4,0x08,0x08,0x1b,0x1a,0x03,0xba,0x04,0xfb,0x00,0x16,0x05,0x03,0xb3,0x2f,0x0e,0x01,0x0e,0x00,0x2f,0x5d,0x3f,0xed,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x12,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x52,0x61,0xa6,\r\n0x39,0x4f,0x6c,0x42,0x1d,0x3b,0x60,0x7b,0x40,0xb9,0x9f,0x9c,0x48,0x7a,0xa0,0x57,0x3a,0x9a,0x4b,0xa9,0x0b,0x0b,0x15,0x2c,0x44,0x2f,0x49,0x9c,0x9f,0xa1,0x4e,0xb1,0xfe,0xbf,0x91,0x63,0x80,0x4c,0x1e,0x0c,0x0a,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x05,0x5d,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,\r\n0x04,0xad,0x00,0x01,0x00,0x00,0xfd,0xff,0x02,0x9e,0x02,0x5e,0x00,0x1a,0x00,0x26,0xb9,0x00,0x12,0x05,0x0a,0xb2,0x07,0x00,0x02,0xb8,0x04,0xfb,0x40,0x0b,0x1a,0x1f,0x17,0x2f,0x17,0x02,0x17,0x2f,0x0d,0x01,0x0d,0x00,0x2f,0x5d,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x11,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,\r\n0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1a,0x28,0x1c,0x0f,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0xfe,0xd1,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x41,0x8e,0x8f,0x8b,0x3e,0x8a,0xd4,0x90,0x4a,0x16,0x17,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,\r\n0x02,0x9e,0x04,0x07,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x03,0x0f,0x00,0x4d,0x00,0x74,0xb9,0x00,0x1b,0x05,0x0a,0xb2,0x18,0x26,0x0e,0xb8,0x05,0x0a,0xb3,0x0b,0x2f,0x2f,0x03,0xb8,0x05,0x0a,0x40,0x0a,0x4a,0x18,0x0b,0x4a,0x4a,0x0b,0x18,0x03,0x4f,0x40,\r\n0xb8,0x05,0x0a,0xb5,0x39,0x2f,0x3d,0x01,0x3d,0x45,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x34,0x2f,0x34,0x02,0x34,0x26,0x2f,0x13,0x06,0xbc,0x04,0xfb,0x00,0x2b,0x05,0x03,0x00,0x20,0x05,0x03,0x40,0x09,0x19,0x20,0x0d,0x01,0x0d,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xd4,0x5d,0xc6,0x3f,0x3f,0xed,0x32,0x39,0x39,0x2f,0x5d,0xed,0x2f,0x5d,\r\n0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,\r\n0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x04,0x80,0x08,0x0c,0x05,0x06,0x58,0x5e,0x22,0x3f,0x30,0x1d,0x9c,0x0b,0x27,0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x38,0x5d,0x78,0x3f,0x2c,0x4f,0x42,0x34,0x12,0x04,0x19,0x3f,0x44,0x46,0x1f,0x42,0x52,0x19,0x05,0x03,\r\n0x3d,0x80,0xcc,0x91,0x8a,0xb9,0x70,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x10,0x02,0x01,0x3f,0x70,0x38,0x42,0x3f,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x37,0x6c,0x85,0x4a,0x19,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x26,0x20,0x01,\r\n0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xbb,0x78,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x46,0x03,0x57,0x00,0x02,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x03,0x3c,0x00,0x42,0x00,0x56,\r\n0x00,0x57,0xb3,0x54,0x09,0x13,0x3c,0xbe,0x05,0x0a,0x00,0x48,0x00,0x1a,0x05,0x0a,0x00,0x13,0x00,0x4d,0x04,0xfb,0x40,0x0d,0x2f,0x37,0x01,0x37,0x2f,0x28,0x01,0x28,0x2f,0x17,0x01,0x17,0x1f,0xb8,0x04,0xfb,0x40,0x0c,0x1f,0x0e,0x2f,0x0e,0x02,0x0e,0x54,0x54,0x43,0x43,0x09,0x30,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,\r\n0x39,0x32,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x26,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,\r\n0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x27,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x07,0x93,0xa1,0xe7,0x9d,0x5e,0x18,0x1f,0x28,0x12,0x05,0x03,0x3d,0x81,0xcd,0x94,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x17,0x9a,0x0b,\r\n0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,0x65,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9b,0x3b,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x85,0x75,0x65,0x52,0x3f,0x15,0x5c,0xee,0x16,0x01,0x03,0x08,0x07,0x09,0x1d,0x15,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,\r\n0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xc5,0x6e,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,0x2f,0x16,0x05,0xa9,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x2a,0x49,0x63,0x71,0x7a,0x3c,0x02,0x01,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x04,0xb2,0x02,0x26,\r\n0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0xca,0x04,0x02,0x00,0x02,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x00,0x20,0x00,0x34,0x00,0x3a,0xb9,0x00,0x0d,0x05,0x0a,0xb2,0x26,0x32,0x01,0xb8,0x05,0x0a,0xb5,0x00,0x32,0x32,0x21,0x21,0x1d,0xb8,0x04,0xfb,0xb3,0x03,0x1a,0x01,0x14,0xba,0x05,0x03,0x00,0x2b,0x04,0xfb,0xb1,0x08,\r\n0x01,0x00,0x2f,0x2f,0xed,0x3f,0x12,0x39,0x39,0xed,0x32,0x11,0x33,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x33,0x11,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,\r\n0x01,0x55,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x5a,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x02,0x52,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x05,0xec,0xfc,0x1d,0x01,0x43,0x7a,0x5d,0x36,0x4f,0x88,0xb5,0x66,\r\n0x5d,0x80,0x55,0x2f,0x16,0x05,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,0x66,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0xff,0xff,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x02,0x26,0x09,0x1d,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0x00,0x01,0x00,0x65,0xfd,0xff,\r\n0x04,0x2d,0x04,0x2a,0x00,0x37,0x00,0x52,0xb4,0x29,0x00,0x16,0x39,0x31,0xb8,0x05,0x0a,0xb2,0x20,0x20,0x05,0xb8,0x05,0x0a,0xb4,0x16,0x28,0x29,0x29,0x2c,0xb8,0x04,0xfb,0x40,0x0d,0x25,0x00,0x34,0x1b,0x37,0x37,0x11,0x2f,0x25,0x01,0x25,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,\r\n0x32,0x2f,0x5d,0x12,0x39,0x2f,0x39,0x39,0x33,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,\r\n0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x37,0x03,0x5c,0xaf,0xe8,0x8b,0x39,0x2e,0x63,0x9e,0x71,0x61,0xc7,0x64,0x6d,0xbf,0x64,0x98,0xd7,0x89,0x40,0x14,0x31,0x53,0x3f,0x26,0x37,0x23,0x11,0x3d,0x72,0xa6,0x69,0x23,0x4f,0x2a,0x27,0x56,0x2a,0x36,0x65,0x4d,0x2f,0x37,0x33,0x51,0xd1,0x89,0x01,0x9a,0x2e,0x66,0x72,0x7d,0x45,0x40,\r\n0x72,0x55,0x32,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5b,0x31,0x64,0x65,0x64,0x30,0x24,0x51,0x55,0x56,0x29,0x4f,0x92,0x70,0x42,0x08,0x09,0xaa,0x08,0x0b,0x16,0x38,0x5d,0x46,0x4c,0x7f,0x2b,0x2d,0x52,0x24,0x00,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0x8f,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xe4,\r\n0x04,0xdf,0x00,0x01,0xff,0xba,0xff,0xf2,0x01,0x56,0x00,0x99,0x00,0x08,0x00,0x13,0xb2,0x08,0x04,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x01,0x2f,0xcd,0x31,0x30,0x05,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x01,0x56,0xfe,0xaa,0x23,0x23,0x23,0x23,0x01,0x56,0x0e,0x34,0x20,0x20,0x33,0x00,0xff,0xff,0x00,0xab,\r\n0xff,0xea,0x07,0x4b,0x05,0x24,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x50,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x04,0x79,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xd4,0x03,0xc9,0x00,0x02,0x00,0xab,0xff,0xea,0x05,0xf4,0x05,0xec,0x00,0x25,0x00,0x46,0x00,0x71,0xbf,0x00,0x13,0x05,\r\n0x0a,0x00,0x10,0x00,0x41,0x05,0x0b,0x00,0x28,0x00,0x39,0x05,0x0b,0x40,0x10,0x30,0x36,0x10,0x28,0x26,0x30,0x22,0x10,0x28,0x30,0x30,0x28,0x10,0x03,0x48,0x03,0xbe,0x05,0x0a,0x00,0x22,0x00,0x26,0x04,0xfd,0x00,0x46,0x00,0x36,0x04,0xfd,0x40,0x0a,0x28,0x41,0x30,0x39,0x04,0x1a,0x35,0x35,0x11,0x0b,0xba,0x04,0xfb,0x00,0x1a,0x05,\r\n0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x12,0x17,0x39,0xed,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,\r\n0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x35,0x34,0x26,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4e,0x7b,0xb1,0x7d,0x6d,0xa2,0x6c,0x36,0x9c,0x2d,0x52,0x71,0x88,0x9a,0x51,0x76,0xc2,0x9b,\r\n0x78,0x2c,0x3f,0x30,0x12,0x0b,0x01,0xe4,0xc5,0x1f,0x15,0x10,0x21,0x1b,0x11,0x2e,0x4f,0x69,0x3b,0x5e,0x54,0x21,0x17,0x0f,0x20,0x1a,0x10,0x25,0x4c,0x74,0x4f,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x0a,0x29,0x53,0x48,0x04,0x8b,0xfb,0x6e,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,\r\n0x3d,0x70,0x33,0x57,0x0b,0x47,0x12,0x16,0x0b,0x08,0x14,0x1b,0x27,0x1b,0x26,0x3e,0x2f,0x1f,0x08,0x5d,0x0c,0x2d,0x21,0x14,0x18,0x0b,0x08,0x12,0x1a,0x23,0x19,0x1f,0x3e,0x33,0x23,0x04,0x00,0x01,0x00,0x9b,0xfe,0xac,0x04,0x9e,0x05,0xec,0x00,0x1d,0x00,0x25,0xbf,0x00,0x03,0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,\r\n0x08,0x04,0xfb,0xb5,0x15,0x0f,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x38,0x81,\r\n0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0x28,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x00,0x02,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x00,0x26,0x00,0x38,0x00,0x41,0xb2,0x17,0x1b,0x05,0xbb,0x05,0x0a,0x00,0x2c,0x00,0x12,0x05,\r\n0x0a,0x40,0x0a,0x1b,0x2f,0x17,0x01,0x17,0x20,0x34,0x34,0x00,0x27,0xbd,0x04,0xfb,0x00,0x0f,0x00,0x0a,0x05,0x03,0x00,0x31,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x12,0x39,0x11,0x33,0x2f,0x5d,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,\r\n0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x02,0xac,0x4c,0x79,0x55,0x2e,0x23,0x47,0x69,0x45,0x31,0x66,0x61,0x59,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,\r\n0x49,0x44,0x3b,0x2e,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x02,0xb9,0x53,0x7d,0x91,0x3e,0x3b,0x6c,0x52,0x30,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x43,0x23,0x0b,0xfd,0xdf,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,\r\n0xad,0x05,0x0f,0x0d,0x09,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x03,0x5c,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x02,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x00,0x17,0x00,0x29,0x00,0x36,0xb9,0x00,0x06,0x05,0x0a,0xb6,0x20,0x20,0x10,0x2b,0x00,0x00,0x18,0xb8,0x05,0x0a,0xb4,0x10,\r\n0x15,0x25,0x01,0x1d,0xba,0x04,0xfb,0x00,0x0b,0x05,0x03,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x37,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x03,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,\r\n0x2e,0x02,0x27,0x0e,0x03,0x01,0x3f,0x60,0x76,0xa7,0x6a,0x31,0x30,0x5a,0x83,0x53,0x51,0x7c,0x54,0x2b,0x2a,0x43,0x56,0x2c,0x15,0x2d,0x13,0x1d,0x32,0x42,0x25,0x66,0x5c,0x12,0x2b,0x46,0x34,0x29,0x47,0x34,0x1d,0x03,0x4f,0x7f,0x4e,0x9f,0xa5,0xaa,0x59,0x4b,0x7b,0x59,0x30,0x2b,0x50,0x70,0x45,0x53,0x96,0x7f,0x65,0x23,0x11,0x22,\r\n0xfd,0xfb,0x2d,0x3e,0x28,0x12,0x58,0x4b,0x2e,0x5a,0x5c,0x5f,0x33,0x1d,0x52,0x60,0x6d,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x00,0x22,0x00,0x36,0x00,0x47,0xb2,0x23,0x23,0x1a,0xb8,0x05,0x0a,0xb3,0x08,0x08,0x38,0x2f,0xb8,0x05,0x0a,0xb2,0x0f,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x22,0x1f,0x1f,0x2f,0x1f,0x02,0x1f,\r\n0x2a,0xb8,0x04,0xfb,0xb5,0x2f,0x14,0x01,0x14,0x08,0x34,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,\r\n0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x6c,0xad,0x52,0x64,0x7b,0x45,0x1a,0x02,0x53,0x59,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x34,0x72,0xb6,0x82,0x5b,0xac,0x64,0x02,0xa9,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,\r\n0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xfe,0xf9,0x2c,0x23,0x42,0x68,0x82,0x41,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xed,0x84,0x74,0xd3,0xa2,0x60,0x26,0x2e,0x02,0x66,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0x01,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0x15,0x00,0x35,\r\n0x00,0x42,0xb2,0x09,0x05,0x2f,0xbb,0x05,0x0a,0x00,0x16,0x00,0x28,0x05,0x0a,0xb6,0x1d,0x16,0x1d,0x16,0x1d,0x37,0x0c,0xb8,0x05,0x0a,0xb2,0x05,0x28,0x23,0xbe,0x04,0xff,0x00,0x22,0x00,0x00,0x04,0xfb,0x00,0x11,0x04,0xe6,0x00,0x09,0x00,0x2f,0x3f,0xed,0x2f,0xed,0x2f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,\r\n0x11,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,\r\n0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,\r\n0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x00,0xff,0xff,0x00,0x9a,0xfd,0xfb,0x05,0x91,0x04,0x15,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x01,0xfe,0x00,0x00,0x02,0x00,0x05,0x06,0x7c,0x02,0x01,0x07,0x8d,0x00,0x03,0x00,0x07,0x00,0x1d,0xb4,0x05,0x01,0x04,0x00,0x02,0xbc,0x04,0xfd,0x00,0x01,0x00,0x06,0x04,0xfd,0x00,\r\n0x05,0x00,0x2f,0xfd,0xde,0xed,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0xd4,0x58,0x01,0x11,0x58,0x00,0x02,0xff,0x33,0x06,0x55,0x01,0xca,0x08,0x0e,0x00,0x23,0x00,0x31,0x00,0x3b,0xb2,0x20,0x13,0x1d,0xb8,0x05,0x0d,0xb5,0x24,0x23,0x23,0x24,\r\n0x11,0x2c,0xb8,0x05,0x0d,0xb4,0x13,0x0b,0x08,0x05,0x18,0xb8,0x04,0xfd,0xb3,0x27,0x20,0x2f,0x0e,0xb9,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0x32,0x39,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,\r\n0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x2f,0x21,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,0x10,0x0f,0x01,0x36,0x1f,0x31,0x3f,0x21,0x1f,0x3b,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,\r\n0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x06,0x55,0x22,0x22,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x45,0x45,0x26,0x3b,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x02,0x00,0x05,0xfe,0x60,0x02,0x01,0xff,0x71,\r\n0x00,0x03,0x00,0x07,0x00,0x1d,0xb4,0x05,0x01,0x04,0x00,0x02,0xbc,0x04,0xfd,0x00,0x01,0x00,0x06,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0xde,0xed,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0xfe,0xb8,0x58,0x01,0x11,0x58,0x00,0x01,0x00,0x05,0x06,0x7c,\r\n0x02,0x01,0x06,0xd4,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x02,0xb9,0x04,0xfd,0x00,0x01,0x00,0x2f,0xed,0x01,0x10,0xcd,0x31,0x30,0x13,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x06,0xd4,0x58,0x00,0x00,0x02,0xff,0xbf,0x06,0x55,0x01,0xca,0x08,0x0e,0x00,0x22,0x00,0x30,0x00,0x35,0xb2,0x1f,0x12,0x1c,0xb8,0x05,0x0d,0xb5,0x23,0x22,\r\n0x22,0x23,0x10,0x2b,0xbb,0x05,0x0d,0x00,0x12,0x00,0x17,0x04,0xfd,0xb3,0x26,0x1f,0x2e,0x0c,0xb9,0x04,0xfd,0x00,0x05,0x00,0x2f,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,\r\n0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x2d,0x23,0x18,0x30,0x15,0x39,0x67,0x30,0x12,0x32,0x5c,0x38,0x01,0x0b,0x06,0x01,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,\r\n0x23,0x1a,0x30,0x3c,0x06,0x55,0x22,0x22,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x01,0x00,0x05,0xff,0x19,0x02,0x01,0xff,0x71,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x02,\r\n0xb9,0x04,0xfd,0x00,0x01,0x00,0x2f,0xed,0x01,0x10,0xcd,0x31,0x30,0x17,0x21,0x15,0x21,0x05,0x01,0xfc,0xfe,0x04,0x8f,0x58,0x00,0x01,0xff,0xd4,0x06,0x76,0x02,0x33,0x07,0xa0,0x00,0x33,0x00,0x53,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x30,0x33,0x33,0x30,0x0a,0x21,0x25,0x25,0x2a,0xb8,0x05,0x0d,0xb4,0x21,0x24,0x24,0x21,\r\n0x1b,0xb8,0x05,0x0b,0x40,0x0b,0x12,0x15,0x15,0x12,0x16,0x25,0x25,0x33,0x0a,0x0d,0x06,0xb8,0x04,0xfd,0xb1,0x1e,0x2d,0x00,0x2f,0x33,0xed,0x32,0x39,0xce,0x32,0x11,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,\r\n0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x0e,0x02,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x06,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x03,\r\n0x02,0x02,0x26,0x2d,0x2c,0x23,0x02,0x61,0x01,0x01,0x22,0x2d,0x2f,0x25,0x04,0x02,0x07,0xa0,0x14,0x25,0x0e,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x1a,0x2c,0x0e,0x17,0x1d,0x13,0x0c,0x05,0x33,0x3f,0x3e,0x3b,0x14,0x2e,0x0f,0x07,0x15,0x16,0x16,0x08,0x3d,0x3d,0x3e,0x37,0x17,0x30,0x0e,0x00,0x02,0x00,0x45,0x06,0x76,\r\n0x01,0xc1,0x07,0xe9,0x00,0x13,0x00,0x1f,0x00,0x26,0x41,0x0c,0x00,0x05,0x05,0x0d,0x00,0x17,0x00,0x1d,0x05,0x0d,0x00,0x0f,0x00,0x00,0x04,0xfd,0x00,0x1a,0x00,0x14,0x04,0xfd,0x00,0x0a,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,\r\n0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x03,0x29,0x45,0x33,0x1d,0x1d,0x33,0x45,0x29,0x2a,0x46,0x32,0x1c,0x1c,0x33,0x45,0x2a,0x30,0x34,0x34,0x30,0x2f,0x35,0x35,0x07,0xe9,0x1d,0x32,0x44,0x27,0x27,0x44,0x31,0x1d,0x1d,0x31,0x44,0x27,0x27,0x44,0x32,0x1d,0xfe,0xe4,0x36,0x2c,0x2b,0x38,0x38,0x2b,0x2c,\r\n0x36,0x00,0xff,0xff,0x00,0x52,0xfd,0xfe,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7f,0x72,0x00,0xff,0xff,0x00,0x52,0xfd,0xfe,0x04,0xad,0x05,0xec,0x02,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7f,0x72,0x00,0xff,0xff,\r\n0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xa2,0x06,0x62,0x02,0x65,0x07,0x30,0x00,0x1b,0x00,0x20,0x40,0x0d,0x00,0x0e,0x0e,0x0d,0x0d,0x05,0x00,0x1b,0x1b,0x13,0x0a,0x18,0x05,0x00,0x2f,0xcd,0xd4,0xcd,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x23,\r\n0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x65,0x1a,0x31,0x2d,0x29,0x12,0x33,0x5c,0x56,0x54,0x2d,0x22,0x31,0x19,0x3e,0x1a,0x31,0x2d,0x29,0x12,0x33,0x5c,0x56,0x54,0x2c,0x23,0x31,0x19,0x06,0xb6,0x1b,0x21,0x12,0x06,0x1e,0x24,0x1e,0x16,0x16,0x46,0x1b,0x21,0x12,0x06,0x1e,\r\n0x24,0x1e,0x15,0x17,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x03,0x0f,0x00,0x1f,\r\n0x00,0x26,0xb1,0x0b,0x00,0xb8,0x05,0x0a,0xb7,0x1d,0x2f,0x1f,0x01,0x1f,0x0b,0x17,0x05,0xbb,0x04,0xfb,0x00,0x10,0x00,0x06,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x39,0x2f,0x5d,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,\r\n0x02,0x35,0x11,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x00,0x02,0xff,0xba,0xff,0xf2,0x03,0x49,0x03,0x62,\r\n0x00,0x24,0x00,0x38,0x00,0x31,0xb9,0x00,0x12,0x05,0x0a,0xb3,0x25,0x25,0x3a,0x31,0xb8,0x05,0x0a,0xb2,0x05,0x36,0x20,0xbc,0x04,0xfb,0x00,0x19,0x05,0x03,0x00,0x2c,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,\r\n0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,\r\n0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,\r\n0x4a,0x2a,0x18,0x4d,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0x02,0x03,0x62,0x00,0x2f,0x00,0x43,0x00,0x3e,0xb1,0x15,0x12,0xb8,0x05,0x0a,0xb4,0x30,0x30,0x05,0x19,0x3c,0xb8,0x05,0x0a,0xb5,0x05,0x1f,0x0a,0x41,0x2b,0x18,0xbd,0x04,0xfb,0x00,0x24,0x00,0x19,0x05,0x03,0x00,0x37,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,\r\n0x3f,0x33,0xed,0x32,0x32,0x12,0x39,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,\r\n0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,\r\n0x43,0x74,0x5b,0x21,0x19,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x00,0x01,0x00,0xab,\r\n0xff,0xea,0x06,0x9f,0x03,0x0f,0x00,0x25,0x00,0x2c,0xb9,0x00,0x13,0x05,0x0a,0xb3,0x10,0x10,0x27,0x03,0xbd,0x05,0x0a,0x00,0x22,0x00,0x0b,0x04,0xfb,0x00,0x1a,0x05,0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xc6,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,\r\n0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x62,0x09,0x11,0x1e,0x30,0x1d,0x5c,0x91,0xd2,0x93,0x80,0xc0,0x7f,0x3f,0x9c,0x33,0x5d,0x81,0x9a,0xaf,0x5d,0x86,0xde,0xb3,0x87,0x30,0x3f,0x30,0x12,0x0b,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,\r\n0x0a,0x29,0x53,0x48,0x01,0xae,0xfe,0x4b,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x03,0x15,0x2d,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x00,0x1f,0x00,0x26,0xb1,0x0b,0x00,0xb8,0x05,0x0a,0xb6,0x1d,0x1e,0x18,0x17,0x17,0x0b,0x05,0xbb,0x04,0xfb,0x00,0x10,0x00,0x06,0x05,0x03,0x00,0x3f,0x33,\r\n0xed,0x39,0x32,0x11,0x33,0x2f,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x61,0x74,0x1d,0x04,0x1b,0x43,0x48,0x49,0x22,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,\r\n0x38,0x25,0x9c,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x04,0x99,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,\r\n0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x74,0xb9,0x00,0x3b,0x05,0x0a,0xb2,0x3a,0x3a,0x39,0xb8,0x05,0x0a,0xb3,0x38,0x1d,0x38,0x32,0xb8,0x05,0x0a,0xb7,0x33,0x38,0x33,0x38,0x33,0x3f,0x26,0x05,0xbb,0x05,0x0a,0x00,0x16,\r\n0x00,0x3a,0x05,0x02,0xb2,0x3d,0x36,0x32,0xb8,0x05,0x02,0x40,0x0d,0x38,0x2f,0x35,0x3f,0x35,0x02,0x35,0x31,0x1d,0x00,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0x32,0xd6,0xed,0x01,0x2f,\r\n0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x05,0x23,\r\n0x35,0x33,0x03,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0x6a,0xb5,0xb5,0x01,0x42,0xb5,0xb5,0xa1,0xb5,0xb5,0x02,0x01,\r\n0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x64,0xb3,0xb3,0xb3,0xfe,0x3f,0xb3,0x00,0x00,0x05,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x03,0x00,0x07,\r\n0x00,0x0b,0x00,0x3d,0x00,0x4b,0x00,0x97,0xb1,0x19,0x3e,0xbb,0x05,0x0b,0x00,0x49,0x00,0x09,0x05,0x0a,0xb2,0x08,0x08,0x04,0xbb,0x05,0x0a,0x00,0x05,0x00,0x00,0x05,0x0a,0x40,0x0b,0x01,0x49,0x05,0x01,0x01,0x05,0x49,0x03,0x4d,0x32,0x11,0xbd,0x05,0x0a,0x00,0x22,0x00,0x41,0x04,0xfb,0x00,0x43,0x05,0x03,0xb6,0x3e,0x0c,0x29,0x3d,\r\n0x04,0x1d,0x2f,0xb8,0x04,0xff,0xb2,0x36,0x19,0x16,0xb8,0x04,0xfc,0x40,0x0c,0x1a,0x1f,0x1d,0x2f,0x1d,0x02,0x1d,0x07,0x06,0x06,0x02,0x08,0xb8,0x05,0x02,0xb7,0x0f,0x0b,0x1f,0x0b,0x02,0x0b,0x04,0x00,0xb8,0x05,0x02,0xb5,0x2f,0x02,0x3f,0x02,0x02,0x02,0x00,0x2f,0x5d,0xfd,0x32,0xde,0x5d,0xed,0x11,0x33,0x11,0x33,0x2f,0x5d,0x33,\r\n0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x13,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,\r\n0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x13,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x02,0x78,0xb5,0xb5,0x01,0x2e,0xb5,0xb5,0x97,0xb5,0xb5,0xfd,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,\r\n0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x2b,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x02,0xb3,0xb3,0xb3,0xfe,0x49,0xb3,0x02,0x50,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,\r\n0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfe,0x9a,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x00,0xfd,0xff,\r\n0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0x02,0x00,0x36,0x00,0x33,0xb2,0x1e,0x23,0x03,0xbb,0x05,0x0a,0x00,0x33,0x00,0x23,0x05,0x0a,0x40,0x09,0x15,0x1a,0x1e,0x1b,0x03,0x00,0x00,0x1c,0x0b,0xbb,0x04,0xfb,0x00,0x2b,0x05,0x03,0x00,\r\n0x1c,0x00,0x2f,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,\r\n0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4f,0x7b,0xb1,0x7c,0x4e,0x7e,0x67,0x51,0x20,0x25,0x32,0x1c,0x0c,0x57,0xa3,0xe8,0x91,0x03,0x4b,0xfd,0x66,0x8b,0xe1,0x9e,0x56,0x0f,0x31,0x5d,0x4f,0x57,0xef,0xa5,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x01,0x06,0x0a,0x09,\r\n0x0a,0x1d,0x26,0x2c,0x1a,0x4d,0x8b,0x86,0x85,0x47,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x42,0x8b,0x96,0xa6,0x5e,0x1f,0x56,0x59,0x50,0x19,0x1b,0x0e,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x02,0x06,0x08,0xed,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0x38,\r\n0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0x15,0x02,0x06,0x09,0x2a,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x02,0x13,0x02,0x06,\r\n0x08,0xf7,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x06,0x19,0x02,0x26,0x08,0xf3,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x3e,0xfe,0x30,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x06,0x12,0x02,0x26,\r\n0x09,0x28,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x16,0xfe,0x29,0x00,0x0a,0xb4,0x02,0x2f,0x40,0x01,0x40,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb9,0x01,0xac,0x02,0x89,0x03,0x7c,0x02,0x06,0x08,0xd7,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x01,0x56,0x05,0x9a,0x02,0x06,0x08,0xd8,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x03,0x50,\r\n0x05,0x9a,0x02,0x06,0x08,0xd9,0x00,0x00,0xff,0xff,0x00,0x2b,0x00,0x00,0x04,0x1a,0x05,0x9a,0x02,0x06,0x08,0xda,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x03,0x70,0x05,0xb7,0x00,0x36,0x00,0x4a,0xb5,0x1d,0x0b,0x38,0x29,0x02,0x2f,0xb8,0x05,0x0a,0x40,0x09,0x30,0x1e,0x1d,0x1d,0x13,0x02,0x03,0x07,0x2f,0xbb,0x04,0xe6,0x00,0x29,\r\n0x00,0x23,0x04,0xfb,0xb4,0x2f,0x18,0x01,0x18,0x0e,0xb8,0x04,0xfb,0xb7,0x2f,0x07,0x01,0x07,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x39,0x3f,0x12,0x17,0x39,0x11,0x33,0x01,0x2f,0xed,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x13,0x17,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,\r\n0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x07,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x02,0x27,0xcb,0x30,0x05,0x0e,0x3f,0x5f,0x7d,0x4b,0x20,0x49,0x24,0x23,0x45,0x23,0x43,0x77,0x5a,0x34,0x29,0x41,0x51,0x29,0x32,0x62,0x5b,0x50,0x1f,0x14,0x49,0x5c,0x6b,0x36,0x1e,0x3e,0x39,\r\n0x32,0x13,0x04,0x07,0x0c,0x07,0x04,0x9c,0x11,0x23,0x36,0x25,0x05,0x9a,0xd2,0x2f,0x56,0x42,0x28,0x08,0x09,0xa6,0x08,0x08,0x1b,0x30,0x43,0x28,0x23,0x33,0x21,0x0f,0x14,0x20,0x28,0x14,0xaa,0x11,0x26,0x21,0x15,0x08,0x10,0x19,0x11,0x03,0x38,0x71,0x7a,0x84,0x4a,0xfe,0x85,0x01,0x73,0x94,0xff,0xf8,0x01,0x03,0x99,0x00,0x00,0x02,\r\n0x00,0x72,0xff,0xe9,0x04,0x28,0x05,0x9a,0x00,0x1e,0x00,0x3f,0x00,0x46,0xbf,0x00,0x17,0x05,0x0a,0x00,0x2a,0x00,0x20,0x05,0x0a,0x00,0x1f,0x00,0x38,0x05,0x0a,0xb3,0x09,0x3d,0x3d,0x25,0xb8,0x04,0xfb,0xb7,0x1c,0x00,0x1c,0x20,0x20,0x10,0x04,0x1c,0xba,0x05,0x03,0x00,0x31,0x04,0xff,0xb3,0x2f,0x10,0x01,0x10,0x00,0x2f,0x5d,0xed,\r\n0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x10,0xed,0x32,0x2f,0x01,0x2f,0xed,0xd4,0xed,0xd6,0xed,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x03,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x15,0x14,0x1e,0x02,\r\n0x33,0x32,0x36,0x02,0x51,0x08,0x2a,0x66,0x3d,0x31,0x5f,0x4b,0x2f,0x2c,0x4b,0x62,0x6b,0x6e,0x31,0x30,0x6b,0x68,0x5e,0x48,0x2a,0x32,0x4f,0x64,0x31,0x3b,0x61,0x6c,0x86,0x0f,0x1f,0x2e,0x1f,0x1a,0x2f,0x23,0x15,0x1e,0x32,0x42,0x48,0x4a,0x21,0x21,0x48,0x46,0x3e,0x30,0x1c,0x14,0x23,0x2f,0x1c,0x36,0x41,0x7d,0x51,0x43,0x2c,0x70,\r\n0xbe,0x92,0x8e,0xfd,0xd6,0xac,0x78,0x40,0x3e,0x75,0xa6,0xd1,0xf7,0x8a,0x98,0xc7,0x76,0x30,0x43,0x01,0x39,0x2d,0x4b,0x37,0x1e,0x1a,0x46,0x7a,0x60,0x72,0xd1,0xb3,0x92,0x67,0x38,0x39,0x68,0x91,0xb1,0xcd,0x6e,0x5c,0x7c,0x4c,0x20,0x6a,0x00,0x01,0x00,0x2f,0xff,0xf5,0x03,0x65,0x05,0xa4,0x00,0x28,0x00,0x3d,0xb5,0x00,0x16,0x07,\r\n0x03,0x2a,0x1e,0xbb,0x05,0x0a,0x00,0x0d,0x00,0x08,0x04,0xfc,0x40,0x09,0x2f,0x23,0x01,0x23,0x00,0x28,0x28,0x03,0x19,0xb8,0x04,0xfb,0xb5,0x2f,0x12,0x01,0x12,0x04,0x03,0xb8,0x04,0xe6,0x00,0x3f,0x33,0x2f,0x5d,0xed,0x12,0x39,0x11,0x33,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x31,0x30,0x01,0x06,0x00,0x03,0x27,0x36,0x12,\r\n0x37,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x36,0x36,0x37,0x03,0x65,0xe1,0xfe,0x7d,0xac,0x26,0x5e,0xec,0x84,0x01,0x49,0x74,0x51,0x2b,0x3b,0x6e,0x9e,0x62,0x1d,0x47,0x23,0x20,0x4d,0x21,0x37,0x5f,0x46,0x28,0x21,0x3a,0x51,0x2f,0x45,0x4d,\r\n0x26,0x4a,0x27,0x03,0x0a,0x6e,0xfe,0x77,0xfe,0xe2,0xc2,0x9e,0x01,0x17,0x6b,0x04,0x0c,0x3b,0x5a,0x76,0x46,0x53,0x86,0x5f,0x34,0x05,0x05,0xab,0x05,0x07,0x17,0x31,0x4f,0x39,0x34,0x4e,0x35,0x1a,0x1b,0x17,0x2a,0x14,0xff,0xff,0xff,0xf4,0x00,0x00,0x03,0xfa,0x05,0x9a,0x02,0x06,0x08,0xde,0x00,0x00,0xff,0xff,0x00,0x49,0x00,0x00,\r\n0x04,0x4f,0x05,0x9a,0x02,0x06,0x08,0xdf,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x03,0xdb,0x05,0xa8,0x02,0x06,0x08,0xe0,0x00,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x00,0x28,0x00,0x36,0xb1,0x1b,0x10,0xb8,0x05,0x0a,0xb3,0x0d,0x0d,0x17,0x03,0xb8,0x05,0x0a,0xb2,0x25,0x17,0x08,0xb8,0x04,0xfb,0xb2,0x20,0x1b,\r\n0x15,0xba,0x04,0xfb,0x00,0x16,0x05,0x03,0xb1,0x0f,0x00,0x00,0x2f,0x2f,0x3f,0xed,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,\r\n0x37,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x0c,0x27,0x4a,0x3d,0x13,0x49,0x59,0x1c,0x04,0x11,0x4c,0x7f,0xb7,0x7c,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0xb0,0x43,0x61,0x40,0x1f,0xa7,0x28,0x26,0x5f,0x95,0x69,0x37,0x45,0x7f,\r\n0xb7,0x72,0x3f,0x83,0x4b,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xb9,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x57,0x02,0xad,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x06,0x32,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,\r\n0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc6,0x05,0xb9,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x9a,0x03,0x57,0x00,0x01,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x01,0xc1,\r\n0x00,0x20,0x00,0x34,0xb9,0x00,0x02,0x05,0x0a,0xb3,0x1d,0x1d,0x22,0x13,0xb8,0x05,0x0a,0x40,0x0a,0x0c,0x2f,0x20,0x01,0x20,0x2f,0x10,0x01,0x10,0x18,0xb8,0x04,0xfb,0xb5,0x1f,0x07,0x2f,0x07,0x02,0x07,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,\r\n0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x04,0x84,0x22,0x37,0x83,0xd6,0x9e,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0x01,0xc1,0xb9,0xa1,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,\r\n0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x02,0x06,0x09,0x28,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0x0a,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x06,0x0f,0x5a,0x00,0x00,0x00,0x01,0xff,0xba,0xfd,0xfa,0x04,0x02,0x02,0x01,0x00,0x32,0x00,0x48,\r\n0xb9,0x00,0x1e,0x05,0x0b,0x40,0x0a,0x13,0x09,0x09,0x13,0x13,0x24,0x19,0x28,0x28,0x0e,0xb8,0x05,0x0a,0xb5,0x03,0x24,0x19,0x28,0x18,0x00,0xbb,0x04,0xfb,0x00,0x19,0x00,0x2b,0x05,0x03,0xb7,0x2f,0x1f,0x01,0x1f,0x2f,0x09,0x01,0x09,0x00,0x2f,0x5d,0x2f,0x5d,0x3f,0x33,0xed,0x32,0x39,0x01,0x2f,0x2f,0x33,0xed,0x33,0x2f,0x11,0x12,\r\n0x39,0x2f,0x33,0x2f,0x10,0xed,0x31,0x30,0x37,0x32,0x36,0x37,0x3e,0x03,0x37,0x33,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x33,0x15,0x22,0x0e,0x02,0x15,0x15,0x2e,0x03,0x35,0x34,0x36,0x37,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x9b,0x30,0x3d,0x0e,0x09,0x10,0x1c,0x2e,0x27,0x97,0x2f,0x42,0x28,0x12,0x21,\r\n0x33,0x3e,0x1e,0x07,0x42,0x73,0xa2,0x68,0x57,0x81,0x54,0x2a,0x7c,0xa9,0x68,0x2d,0x07,0x06,0x04,0x1a,0x40,0x2d,0x74,0x23,0x23,0x23,0x23,0x99,0x0a,0x0e,0x09,0x26,0x4b,0x7a,0x5c,0x67,0xa8,0x8b,0x71,0x2e,0x45,0x59,0x38,0x1e,0x09,0x60,0xa9,0x7d,0x48,0xa7,0x3f,0x76,0xa9,0x6a,0x30,0x18,0x47,0x60,0x7b,0x4d,0x20,0x43,0x25,0x02,\r\n0x0c,0x0d,0x34,0x20,0x20,0x33,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x06,0x12,0x02,0x26,0x09,0x28,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x16,0xfe,0x29,0x00,0x0a,0xb4,0x02,0x2f,0x40,0x01,0x40,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x05,0x5d,0x02,0x26,0x09,0x28,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x01,\r\n0x04,0xad,0x00,0x01,0x00,0x72,0xff,0xea,0x06,0xe5,0x03,0x5b,0x00,0x2b,0x00,0x1f,0xb9,0x00,0x0a,0x05,0x0a,0xb6,0x21,0x00,0x2f,0x2b,0x01,0x2b,0x0f,0xba,0x04,0xfb,0x00,0x1a,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xcd,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,\r\n0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x37,0x03,0x4b,0x3a,0x72,0x69,0x60,0x28,0x24,0x3b,0x2a,0x17,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x27,0x43,0x5c,0x35,0x2e,0x62,0x63,0x60,0x2c,0x02,0xd3,0x30,0x4e,0x3f,0x34,0x16,0x14,0x25,0x25,0x28,\r\n0x18,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x37,0x5a,0x4c,0x43,0x20,0x1c,0x38,0x3c,0x43,0x27,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,\r\n0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x33,0x02,0xac,0x0d,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,\r\n0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,0x08,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0xff,0xff,0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x3e,0x02,0x26,0x09,0x65,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xab,\r\n0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x3d,0x02,0x26,0x09,0x66,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0x00,0x01,0x00,0x2d,0x00,0x00,0x01,0xab,0x00,0xbc,0x00,0x03,0x00,0x13,0xb2,0x03,0x02,0x02,0xba,0x04,0xfb,0x00,0x00,0x04,0xe6,0x00,\r\n0x3f,0xed,0x01,0x2f,0xcd,0x31,0x30,0x21,0x21,0x27,0x21,0x01,0xab,0xfe,0xaa,0x28,0x01,0x7e,0xbc,0x00,0x00,0x03,0x00,0x7c,0x00,0x00,0x04,0x18,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x34,0xbc,0x00,0x05,0x05,0x0c,0x00,0x04,0x00,0x01,0x05,0x0c,0xb5,0x00,0x2f,0x09,0x01,0x09,0x08,0xba,0x04,0xe6,0x00,0x06,0x04,0xfe,0xb4,\r\n0x2f,0x05,0x01,0x05,0x02,0xb9,0x04,0xfe,0x00,0x01,0x00,0x2f,0xed,0x2f,0x5d,0xed,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x05,0x01,0x33,0x01,0xc0,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0xfd,0x86,0x03,0x0d,0x8f,0xfc,0xf3,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0x5b,0x05,0x58,0xfa,0xa8,0x00,\r\n0x00,0x01,0x00,0x42,0x01,0xae,0x02,0xd9,0x04,0x25,0x00,0x0e,0x00,0x0c,0xb4,0x20,0x03,0x01,0x03,0x0c,0x00,0x2f,0xc4,0x5d,0x31,0x30,0x01,0x07,0x17,0x07,0x27,0x07,0x27,0x37,0x27,0x37,0x17,0x27,0x33,0x07,0x37,0x02,0xd9,0xf6,0xa6,0x7b,0x81,0x81,0x7b,0xa6,0xf5,0x2f,0xe7,0x16,0x97,0x16,0xe7,0x02,0xfe,0x37,0xbf,0x5a,0xdb,0xdb,\r\n0x5a,0xbf,0x37,0x8f,0x64,0xfc,0xfc,0x64,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x4b,0x06,0x3c,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x53,0x04,0xd7,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,\r\n0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0xa1,0xff,0xf2,0x07,0x4a,0x08,0x36,0x00,0x3a,0x00,0x48,0x00,0x4c,\r\n0x00,0x7a,0x00,0xdd,0xb9,0x00,0x0d,0x05,0x0a,0xb3,0x0a,0x66,0x66,0x69,0xb8,0x05,0x0d,0xb6,0x63,0x65,0x65,0x63,0x5a,0x5a,0x5d,0xb8,0x05,0x0d,0x40,0x09,0x4a,0x4b,0x4b,0x56,0x56,0x4a,0x59,0x59,0x49,0xb8,0x05,0x0b,0xb4,0x16,0x70,0x4a,0x4a,0x00,0xb8,0x05,0x0a,0xb3,0x38,0x4d,0x4d,0x50,0xb8,0x05,0x0b,0xb5,0x78,0x7a,0x7a,0x78,\r\n0x43,0x2d,0xb8,0x05,0x0a,0x40,0x0e,0x2c,0x0a,0x63,0x38,0x78,0x2c,0x2c,0x78,0x38,0x63,0x0a,0x05,0x7c,0x3b,0xbb,0x05,0x0a,0x00,0x26,0x00,0x21,0x04,0xfb,0xb6,0x2f,0x40,0x01,0x40,0x16,0x33,0x05,0xbb,0x04,0xfb,0x00,0x19,0x00,0x12,0x05,0x03,0x40,0x0b,0x70,0x60,0x6c,0x30,0x4c,0x01,0x4c,0x49,0x5a,0x53,0x60,0xb8,0x04,0xfd,0xb3,\r\n0x73,0x6c,0x0b,0x44,0xb8,0x04,0xfc,0x40,0x0a,0x2b,0x2f,0x2c,0x01,0x2c,0x3a,0x20,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xd6,0xd4,0x5d,0xdd,0xed,0x10,0xd4,0x32,0xfd,0x32,0xd6,0xde,0xcd,0x5d,0x11,0x12,0x39,0x3f,0x33,0xed,0x32,0x39,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x2f,\r\n0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x2f,0x39,0x39,0xed,0x33,0x2f,0x11,0x33,0x2f,0x33,0x2f,0x10,0xe4,0x32,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,\r\n0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x23,0x11,0x33,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x34,0x27,0x33,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x05,0x49,0x0c,0x26,0x46,0x39,0x25,0x42,0x31,0x1c,0x9c,0x3c,0x61,0x7b,0x3e,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1d,0x40,0x36,0x24,0x9c,\r\n0xfb,0xee,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x04,0x03,0x74,0x74,0xfe,0xf5,0x03,0x01,0x26,0x2d,0x2c,0x23,0x01,0x5f,0x01,0x22,0x2d,0x2f,0x25,0x03,0x5f,0x01,0x01,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x03,0x01,0x8c,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfb,0xce,\r\n0x65,0x86,0x4f,0x20,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xf4,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x04,0xd3,0x01,0x56,0xfe,0x57,0x1c,0x18,0x09,0x33,0x3f,0x3e,0x3b,0x0d,\r\n0x1c,0x0d,0x0e,0x1c,0x0b,0x3d,0x3d,0x3e,0x37,0x1f,0x1b,0x0c,0x18,0x08,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x21,0x18,0x00,0x01,0x00,0x57,0xff,0xaf,0x04,0x02,0x01,0xbb,0x00,0x1e,0x00,0x2a,0xbc,0x00,0x0d,0x05,0x0a,0x00,0x12,0x00,0x08,0x04,0xfb,0x40,0x09,0x2f,0x17,0x01,0x17,0x2f,0x0e,0x01,0x0e,0x1e,0xba,0x04,\r\n0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x33,0x04,0x02,0x0c,0x42,0x6c,0x60,0x56,0x55,0x58,0x32,0x2a,0x4d,0x3b,0x23,0x83,0x03,0x01,0x42,0x69,0x80,0x3f,0x3f,0x6b,\r\n0x60,0x58,0x56,0x58,0x31,0x0e,0x2b,0x40,0x4c,0x40,0x2b,0x23,0x4e,0x7c,0x58,0x20,0x16,0x1e,0x05,0x7e,0xb2,0x70,0x33,0x2b,0x40,0x4c,0x40,0x2b,0x00,0x01,0x00,0xc4,0x06,0x7c,0x01,0x42,0x08,0x04,0x00,0x03,0x00,0x15,0xbd,0x00,0x00,0x05,0x0b,0x00,0x01,0x00,0x00,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x01,\r\n0x23,0x11,0x33,0x01,0x42,0x7e,0x7e,0x06,0x7c,0x01,0x88,0x00,0x00,0x02,0xff,0x17,0x06,0x1d,0x02,0xee,0x08,0xde,0x00,0x53,0x00,0x65,0x00,0x6f,0xb5,0x09,0x26,0x61,0x03,0x47,0x1a,0xb8,0x05,0x0d,0xb2,0x59,0x2d,0x00,0xbb,0x05,0x0d,0x00,0x51,0x00,0x38,0x05,0x0d,0xb2,0x47,0x53,0x15,0xb8,0x05,0x01,0x40,0x11,0x5c,0x54,0x26,0x2d,\r\n0x54,0x1f,0x61,0x61,0x54,0x4c,0x4c,0x54,0x10,0x10,0x0a,0x03,0x54,0xb8,0x05,0x01,0x40,0x09,0x1f,0x35,0x35,0x30,0x30,0x29,0x29,0x1f,0x3b,0xb9,0x05,0x01,0x00,0x42,0x00,0x2f,0xfd,0xce,0x32,0x2f,0x32,0x2f,0x32,0x2f,0x10,0xfd,0x32,0xcc,0x33,0x2f,0x11,0x33,0x2f,0x11,0x33,0x2f,0x11,0x12,0x39,0x39,0x10,0xde,0xfd,0xc6,0x01,0x2f,\r\n0xed,0x2f,0xed,0x39,0x2f,0xed,0x11,0x17,0x39,0x31,0x30,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x01,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x61,0x0e,0x1a,0x1a,0x15,0x05,0x05,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,\r\n0x20,0x46,0x71,0x51,0x48,0x61,0x15,0x0a,0x14,0x06,0x01,0x12,0x31,0x1a,0x1f,0x28,0x0a,0x01,0x11,0x2c,0x16,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x40,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,0x3b,0x16,0x1d,0x10,0x0e,0x0c,0x58,0x01,0x9b,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,\r\n0x1d,0x1b,0x07,0x7e,0x2a,0x27,0x1c,0x1a,0x0b,0x2a,0x12,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x03,0x08,0x04,0x14,0x0b,0x18,0x13,0x17,0x14,0x19,0x12,0x01,0x0f,0x12,0x19,0x10,0x09,0x06,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x08,0x17,0x15,0x01,0x76,\r\n0xfe,0x4d,0x02,0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x00,0x01,0x00,0x10,0x06,0x71,0x01,0xbb,0x08,0xde,0x00,0x14,0x00,0x27,0xb9,0x00,0x0c,0x05,0x0d,0xb5,0x09,0x06,0x06,0x00,0x00,0x03,0xb8,0x05,0x01,0xb5,0x11,0x14,0x14,0x11,0x0b,0x05,0x00,0x2f,0xc4,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x01,0x2f,\r\n0xed,0x31,0x30,0x13,0x16,0x16,0x33,0x03,0x33,0x13,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x10,0x2e,0x51,0x27,0x99,0x5d,0x98,0x28,0x28,0x59,0x23,0x3d,0x53,0x30,0x2d,0x5e,0x30,0x06,0xe2,0x06,0x04,0x01,0xca,0xfe,0x37,0x02,0x1c,0x2a,0x01,0xbd,0xfe,0x22,0x34,0x3a,0x1b,0x06,0x04,0x06,0x00,0xff,0xff,\r\n0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xc2,0xfd,0xfe,0x01,0xa2,0xff,0x6b,0x00,0x28,0x00,0x3e,0xbc,0x00,0x1b,0x05,0x0d,0x00,0x0d,0x00,0x26,0x04,0xfd,0xb5,0x04,0x04,0x1f,0x14,0x14,0x12,0xb8,0x04,0xfd,0x40,0x0a,0x00,0x18,0x10,0x18,0x02,0x18,0x1f,0x09,0x09,0x1f,0xb8,0x04,0xfd,\r\n0xb3,0x1f,0x20,0x01,0x20,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x10,0xde,0x5d,0xed,0x32,0x2f,0x11,0x39,0x2f,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x07,\r\n0x3e,0x19,0x28,0x11,0x11,0x1d,0x1f,0x24,0x19,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x0d,0x1d,0x10,0x2d,0x3e,0x46,0x48,0x46,0xc7,0x31,0x40,0x2b,0x1e,0x0f,0x1f,0x2e,0xfe,0x06,0x56,0x15,0x10,0x0c,0x0f,0x0c,0x01,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x65,0x03,0x04,0x26,0x25,0x30,0x2d,0x61,0x0f,0x11,0x0f,0x28,\r\n0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x02,0xb7,0x00,0x30,0x00,0x44,0x00,0x5b,0xb2,0x31,0x31,0x14,0xbb,0x05,0x0a,0x00,0x00,0x00,0x3d,0x05,0x0a,0xb6,0x07,0x00,0x07,0x00,0x07,0x46,0x25,0xb8,0x05,0x0a,0xb3,0x1e,0x1e,0x13,0x2a,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x19,0x2f,0x19,0x02,0x19,0x22,0x22,0x02,0x38,0xb8,0x04,0xfb,0xb5,\r\n0x2f,0x0c,0x01,0x0c,0x00,0x42,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x33,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,\r\n0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0xad,0x50,0x5c,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x1b,0x28,0x1b,0x0e,0x4a,0x98,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,\r\n0x2b,0x64,0xa5,0x7a,0x67,0x93,0x64,0x3b,0x21,0x0b,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x17,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x2a,0x68,0x75,0x7f,0x40,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x1d,0x32,\r\n0x46,0x51,0x5b,0xd0,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0x06,0x7c,0x01,0xa2,0x07,0xe9,0x00,0x18,0x00,0x2f,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb6,0x11,0x0e,0x09,0x0a,0x18,0x18,0x16,\r\n0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,\r\n0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x07,0x7e,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0x01,0x00,0x49,0xfd,0xfe,0x01,0xa2,0xff,0x6b,0x00,0x18,0x00,0x34,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb3,0x11,0x18,0x18,0x16,0xb8,0x04,0xfd,0x40,0x0a,0x00,0x03,\r\n0x10,0x03,0x02,0x03,0x09,0x0d,0x0d,0x09,0xb8,0x04,0xfd,0xb3,0x1f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x10,0xde,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x73,0x0d,0x1d,0x10,0x2d,\r\n0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xff,0x00,0x03,0x04,0x26,0x27,0x5b,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0xff,0xff,0xff,0x97,0x00,0x00,0x01,0xf0,0x07,0xe8,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x00,0xff,0xff,0xff,0x97,0xff,0xf2,0x02,0x01,\r\n0x07,0xe8,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x00,0xff,0xff,0xff,0xc2,0x00,0x00,0x01,0xa2,0x07,0xe9,0x02,0x26,0x09,0x0d,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x7e,0x00,0x0a,0xb4,0x01,0x20,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xff,0xf2,0x02,0x01,0x07,0xe9,0x02,0x26,0x08,0xc7,\r\n0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x7e,0x00,0x0a,0xb4,0x01,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xfd,0xfe,0x01,0xa2,0x05,0xec,0x02,0x26,0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x77,0x00,0x00,0xff,0xff,0xff,0xc2,0xfd,0xfe,0x02,0x01,0x05,0xec,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x77,\r\n0x00,0x00,0xff,0xff,0x00,0xab,0x00,0x00,0x02,0xf8,0x05,0xec,0x00,0x26,0x09,0x0d,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0x00,0x0a,0xb4,0x01,0x20,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xf2,0x03,0x57,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x09,0x21,0x02,0x01,0x00,0x00,0x01,0x07,\r\n0x09,0x7e,0x01,0x56,0xfe,0x00,0x00,0x0a,0xb4,0x02,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0xa3,0x05,0x3e,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x09,0x7e,0x02,0x01,0xfd,0x55,0xff,0xff,0xff,0xe7,0xfd,0xff,0x03,0xa3,0x05,0x63,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,\r\n0xfd,0x55,0x00,0x07,0x09,0x30,0x00,0x28,0xfd,0x55,0xff,0xff,0x00,0x9a,0xff,0x55,0x06,0x4f,0x05,0xe9,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x09,0x7e,0x04,0xad,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xfa,0x05,0x3e,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x09,0x7e,0x05,0x58,0xfd,0x55,0xff,0xff,0x00,0xab,0xff,0xea,\r\n0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,\r\n0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xee,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x5b,0x02,0xad,0x00,0xef,0x01,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0x00,0x0c,0xb5,0x02,0x01,0x20,\r\n0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x01,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0x00,0x0c,0xb5,0x02,0x01,0x20,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,\r\n0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0x04,0x02,0xff,0xff,\r\n0xff,0xba,0xff,0xf2,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,\r\n0x0f,0x56,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0x8f,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfd,0xa6,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0x8f,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfd,0xa6,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x16,\r\n0x02,0x26,0x08,0xd0,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfd,0x2d,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0xf2,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0xf2,0x02,0x26,0x08,0xd1,\r\n0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x79,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xc8,0xff,0xb1,0xff,0xff,0x00,0x7e,0xfd,0xff,\r\n0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x96,0xff,0x75,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x02,0x26,0x09,0x13,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0xc8,\r\n0xff,0x26,0x00,0x0c,0xb5,0x02,0x01,0x20,0x34,0x01,0x34,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x03,0x54,0x02,0x26,0x08,0xd1,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0x91,0xff,0x14,0x00,0x0c,0xb5,0x02,0x01,0x20,0x43,0x01,0x43,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,\r\n0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x05,0xf2,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x05,0xf2,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x2a,0xff,0xff,\r\n0xff,0xba,0xff,0xf2,0x04,0x7c,0x05,0x79,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x03,0xb1,0x00,0x05,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x84,0xb1,0x3e,0x36,0xb8,0x05,0x0a,0xb4,0x37,0x3f,0x37,0x3a,0x32,0xb8,0x05,0x0a,0x40,0x0e,0x33,0x3b,0x33,\r\n0x1d,0x00,0x0d,0x03,0x37,0x33,0x37,0x33,0x43,0x26,0x05,0xb8,0x05,0x0a,0xb2,0x16,0x3e,0x3a,0xb8,0x04,0xfb,0x40,0x09,0x40,0x0f,0x3d,0x1f,0x3d,0x02,0x3d,0x36,0x32,0xb8,0x04,0xfb,0x40,0x0d,0x38,0x2f,0x35,0x3f,0x35,0x02,0x35,0x31,0x1d,0x00,0x03,0x11,0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,\r\n0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0x32,0xde,0x5d,0x32,0xed,0x32,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,\r\n0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,\r\n0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0x7e,0xb5,0xb5,0x01,0x1a,0xb5,0xb5,0xfe,0xe6,0xb5,0xb5,0x01,0x1a,0xb5,0xb5,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,\r\n0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x78,0xb3,0xb3,0xb3,0xfe,0x35,0xb3,0xb3,0xb3,0x00,0x04,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x42,0x00,0x46,0x00,0x4a,0x00,0x4e,0x00,0x90,0xb2,0x03,0x43,0x00,0xb8,0x05,0x0a,0xb4,0x01,0x44,0x01,0x4b,0x47,0xb8,0x05,0x0a,0x40,0x0e,\r\n0x48,0x4c,0x48,0x23,0x38,0x13,0x03,0x01,0x48,0x01,0x48,0x50,0x2c,0x0b,0xbd,0x05,0x0a,0x00,0x1c,0x00,0x3c,0x04,0xfb,0x00,0x3e,0x05,0x03,0xb6,0x06,0x38,0x23,0x37,0x04,0x17,0x29,0xb8,0x04,0xff,0xb2,0x30,0x13,0x10,0xb8,0x04,0xfc,0x40,0x09,0x14,0x1f,0x17,0x2f,0x17,0x02,0x17,0x47,0x43,0xb8,0x04,0xfb,0x40,0x09,0x49,0x0f,0x46,\r\n0x1f,0x46,0x02,0x46,0x4b,0x00,0xb8,0x04,0xfb,0xb4,0x4d,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0x33,0xfd,0x32,0xde,0x5d,0x32,0xed,0x32,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x39,0x31,0x30,0x25,0x23,\r\n0x35,0x33,0x26,0x26,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x07,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x27,0x11,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x35,0x23,0x35,\r\n0x33,0x03,0xa6,0xb5,0xa9,0x1d,0x2a,0x0f,0x9d,0xd5,0x81,0x37,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0x20,0x4b,0x24,0xc1,0x99,0x19,0x2f,0x84,0xc0,0x3f,0xb5,0xb5,0xfe,0xf0,\r\n0xb5,0xb5,0xb5,0xb5,0x34,0xb3,0x31,0x70,0x3e,0x35,0x72,0x7b,0x86,0x48,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x15,0x9f,0xb4,0xa7,0x7a,0x66,0xfe,0x4a,0xb3,0xb3,0xb3,0x65,0xb3,\r\n0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfe,0xf4,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x01,0x07,0x0f,0x5b,0x00,0xab,0x00,0xf5,0x00,0x0c,0xb5,0x02,0x01,0x20,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,\r\n0x00,0x52,0xfe,0xa6,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xfe,0xa6,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0xab,0xfe,0xab,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x05,0x5d,\r\n0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xa6,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0x04,0xad,0xff,0xff,\r\n0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x75,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc2,0x04,0xaf,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,\r\n0x0a,0x6d,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x31,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x90,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x4f,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xf2,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xe1,0x04,0x31,0x02,0x5e,\r\n0x00,0x26,0x09,0x17,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x09,0xf7,0x65,0x00,0x0a,0xb4,0x01,0x2f,0x1d,0x01,0x1d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x4f,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf2,0xfe,0x00,0x00,0x06,0x0f,0x50,0xce,0x05,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,\r\n0x04,0x07,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x04,0x07,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0x50,0x03,0x57,\r\n0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x05,0xf4,0x04,0x07,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x08,0xa0,0x03,0x0f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x50,0xfd,0xce,\r\n0xff,0xff,0xff,0xba,0xfd,0xc9,0x05,0xf4,0x03,0x0f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xa4,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x54,0x05,0x50,0xfd,0xce,0x00,0x07,0x0f,0x53,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xfd,0xc9,0x05,0xf4,\r\n0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xa4,0xfd,0xce,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x03,0x3c,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x51,0x06,0x3c,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x07,0x4b,0x03,0x3c,0x02,0x26,0x08,0xd6,0x00,0x00,\r\n0x00,0x07,0x0f,0x51,0x03,0x86,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x05,0xca,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x07,0x4b,0x05,0xca,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x1e,0x04,0x02,0xff,0xff,0x00,0x19,0xff,0xea,0x05,0xf5,\r\n0x05,0xec,0x02,0x26,0x09,0x1d,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xa7,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xe4,0x04,0xdf,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x06,0x42,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x7a,\r\n0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x04,0x02,0x00,0x02,0x00,0xab,0xff,0xea,0x07,0x4b,0x03,0x62,0x00,0x36,0x00,0x4a,0x00,0x4c,\r\n0xbc,0x00,0x23,0x05,0x0a,0x00,0x37,0x00,0x43,0x05,0x0a,0xb6,0x16,0x37,0x16,0x37,0x16,0x4c,0x03,0xb8,0x05,0x0a,0xb4,0x33,0x48,0x10,0x10,0x0d,0xb8,0x04,0xfb,0xb4,0x2a,0x00,0x00,0x1b,0x2a,0xba,0x05,0x03,0x00,0x3e,0x04,0xfb,0xb3,0x2f,0x1b,0x01,0x1b,0x00,0x2f,0x5d,0xed,0x3f,0x12,0x39,0x2f,0x10,0xed,0x32,0x2f,0x32,0x01,0x2f,\r\n0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,\r\n0x1e,0x02,0x17,0x36,0x36,0x01,0x62,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x3a,0x64,0x89,0x9d,0xac,0x55,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x05,0xe6,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2c,\r\n0x1a,0x18,0x42,0x73,0x5a,0x21,0x1d,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x60,0x84,0x57,0x30,0x17,0x05,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0xf2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,\r\n0x3c,0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x18,0x4d,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,\r\n0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x05,0x24,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x27,0x0f,0x50,0x04,0xd7,0x04,0x74,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,\r\n0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x0e,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x0e,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,\r\n0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x10,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x0e,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x0e,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,\r\n0x07,0x4b,0x06,0x3c,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x56,0x04,0xd7,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0xd5,\r\n0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x04,0x79,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xd4,0x03,0xc9,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x4b,0x05,0x91,0x02,0x26,0x09,0x7c,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xd4,0x03,0xc9,0x00,0x01,0x00,0x19,0xff,0xea,0x08,0x3d,0x04,0x19,0x00,0x3f,0x00,0x41,\r\n0xb9,0x00,0x2e,0x05,0x0a,0xb6,0x0f,0x0c,0x0c,0x0f,0x0f,0x41,0x23,0xbf,0x05,0x0a,0x00,0x18,0x00,0x07,0x04,0xfb,0x00,0x38,0x05,0x03,0x00,0x12,0x04,0xfb,0xb4,0x2f,0x29,0x01,0x29,0x1e,0xb8,0x04,0xfb,0xb3,0x2f,0x1d,0x01,0x1d,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,0x10,0xed,0x31,\r\n0x30,0x37,0x1e,0x05,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x27,0x19,0x25,0x83,0xaa,0xc8,0xd8,0xdd,0x69,0xa5,0xf9,0xc5,0x9e,0x4b,0x03,\r\n0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x18,0x4a,0x89,0x71,0x03,0xba,0x46,0x76,0x54,0x2f,0x0d,0x1d,0x2e,0x20,0x3a,0xb4,0xed,0xfe,0xdc,0xaa,0x46,0xb1,0xc0,0xc2,0xae,0x8f,0x2d,0xa9,0x05,0x07,0x06,0x03,0x02,0x01,0x02,0x04,0x08,0x06,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,\r\n0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2d,0x12,0x15,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x1c,0x41,0x40,0x3b,0x16,0x05,0x09,0x06,0x04,0x01,0x02,0x03,0x06,0x07,0x05,0x00,0x00,0x01,0xff,0xba,0xff,0xea,0x07,0x92,0x04,0x19,0x00,0x44,0x00,0x48,0xb9,0x00,0x29,0x05,0x0a,0xb3,0x1e,0x1e,0x45,0x34,0xb8,0x05,0x0a,0xb4,\r\n0x15,0x12,0x12,0x15,0x3e,0xba,0x05,0x03,0x00,0x18,0x04,0xfb,0xb4,0x2f,0x2f,0x01,0x2f,0x24,0xb8,0x04,0xfb,0xb5,0x2f,0x23,0x01,0x23,0x0d,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0x33,0x2f,0x10,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x17,0x23,0x22,0x26,0x35,0x34,\r\n0x36,0x33,0x33,0x32,0x16,0x16,0x04,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x32,0x32,0x23,0x23,0x23,0x23,0x3b,0x1e,0xa2,0xef,0x01,0x2e,\r\n0xab,0x9d,0xf6,0xc3,0x99,0x40,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,0x0d,0x1d,0x2e,0x20,0x34,0xb6,0xec,0xfe,0xe9,0x96,0x50,0xb3,0xb2,0xa8,0x8b,0x66,0x0e,0x34,0x20,0x20,0x33,0x03,0x03,0x02,0x03,0x05,0x07,0x05,0x0b,\r\n0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x1c,0x41,0x40,0x3b,0x16,0x05,0x08,0x07,0x04,0x01,0x02,0x02,0x02,0x01,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x5b,0x04,0xa6,\r\n0x05,0xb0,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x06,0xb3,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,\r\n0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x07,0xcb,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xcb,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,\r\n0x05,0xf4,0x05,0xec,0x02,0x26,0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x74,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x5b,0x04,0xa6,\r\n0x05,0xb0,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x27,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xc3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,\r\n0x01,0x07,0x0f,0x51,0x03,0x90,0x07,0x13,0x00,0x0c,0xb5,0x02,0x03,0x20,0x3e,0x01,0x3e,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xc3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x51,0x00,0x39,0x07,0x13,0x00,0x0c,0xb5,0x02,0x03,0x20,0x28,0x01,0x28,0x00,0x11,0x5d,\r\n0x35,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,\r\n0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x07,0x38,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x52,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x07,0x38,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,\r\n0x00,0xab,0xff,0xea,0x06,0xa2,0x08,0xbd,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x57,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x45,0x01,0x20,0x45,0x01,0x45,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x08,0xbd,0x02,0x26,\r\n0x08,0xed,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x00,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x30,0x01,0x20,0x30,0x01,0x30,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x70,0x08,0x0e,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0a,0x6d,0x03,0x48,0x00,0x32,\r\n0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x08,0x0e,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0x00,0x32,0xff,0xff,0x00,0x9b,0xfe,0xac,0x04,0xa5,0x07,0x67,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x48,0x06,0xb7,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf9,0x07,0x67,0x02,0x26,0x08,0xee,0x00,0x00,\r\n0x00,0x07,0x0f,0x50,0x00,0x9c,0x06,0xb7,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x46,0x08,0x7f,0x02,0x26,0x09,0x25,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x48,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x28,0x01,0x28,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9a,0x08,0x7f,0x02,0x26,0x08,0xee,0x00,0x00,\r\n0x01,0x07,0x0f,0x53,0x00,0x9c,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0x04,0x00,0x9b,0xfd,0xc4,0x04,0x9e,0x05,0xec,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29,0x00,0x65,0xbc,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x27,0x05,0x0c,0xb2,0x26,0x26,0x22,0xbb,0x05,0x0c,0x00,0x23,\r\n0x00,0x1e,0x05,0x0c,0x40,0x0a,0x1f,0x0d,0x23,0x1f,0x1f,0x23,0x0d,0x03,0x2b,0x03,0xbb,0x05,0x0a,0x00,0x1a,0x00,0x26,0x04,0xfb,0xb2,0x29,0x22,0x1e,0xb8,0x04,0xfb,0xb5,0x24,0x20,0x21,0x01,0x21,0x08,0xba,0x04,0xfb,0x00,0x15,0x05,0x03,0xb1,0x0e,0x00,0x00,0x2f,0x2f,0x3f,0xed,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0xed,0x01,0x2f,0xed,\r\n0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0x4e,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,\r\n0x93,0x5d,0x2b,0x9c,0x38,0x81,0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x01,0x9d,0xc9,0xc9,0x01,0x56,0xc9,0xc9,0xab,0xc9,0xc9,0x02,0xec,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x03,0x7e,0xfc,0x6e,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0xfb,0xf0,0xbd,0xbd,0xbd,0xfe,0x2b,0xbd,0x00,0xff,0xff,\r\n0xff,0xba,0xfd,0xc9,0x02,0x48,0x05,0xec,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x4a,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xfb,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,0x01,0x56,0x00,0x27,0x0f,0x50,0x01,0x9f,0x04,0x02,0x00,0x07,0x0f,0x50,0x01,0x9f,0xfe,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x01,0xf9,\r\n0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x05,0x0e,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x9f,0x02,0xac,0xff,0xff,0x00,0x9b,0xfe,0x55,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,\r\n0x01,0x56,0x00,0x27,0x0f,0x5b,0x01,0x9f,0x00,0x56,0x00,0x07,0x0f,0x50,0x01,0x9f,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0x05,0x01,0xf9,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x04,0x74,0x02,0x26,0x09,0x5f,\r\n0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x00,0x26,0x09,0x42,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,\r\n0x05,0x58,0x04,0xda,0x02,0x26,0x09,0x43,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0x56,0xfd,0xce,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x02,0x26,0x09,0x29,\r\n0x00,0x00,0x00,0x06,0x0f,0x5b,0x66,0x60,0x00,0x02,0x00,0x00,0xfd,0xfe,0x03,0x4b,0x03,0x1c,0x00,0x2a,0x00,0x3f,0x00,0x62,0xb2,0x08,0x20,0x35,0xb8,0x05,0x0a,0xb2,0x09,0x16,0x20,0xb8,0x05,0x0a,0xb7,0x0e,0x3d,0x3d,0x0e,0x0e,0x3a,0x11,0x08,0xb8,0x04,0xfd,0xb3,0x0b,0x0b,0x03,0x11,0xb8,0x04,0xfb,0x40,0x09,0x3d,0x2f,0x3a,0x3f,\r\n0x3a,0x02,0x3a,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x2a,0x1f,0x27,0x2f,0x27,0x02,0x27,0x30,0xb8,0x04,0xfb,0xb3,0x2f,0x1b,0x01,0x1b,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0x33,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,\r\n0x02,0x37,0x21,0x35,0x21,0x36,0x36,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x67,0xab,0x45,0x3e,0x60,0x48,0x33,0x11,0xfe,0x2a,0x01,0xf4,0x08,0x07,0x01,0x2f,0x58,\r\n0x29,0x42,0x7b,0x5e,0x39,0x30,0x55,0x75,0x45,0x42,0x7f,0x63,0x3d,0x13,0x2c,0x49,0x6e,0x96,0x62,0x58,0xad,0x58,0x02,0x98,0x0f,0x2a,0x32,0x35,0x1a,0x1c,0x37,0x2c,0x1b,0x20,0x3a,0x4e,0x2f,0x1b,0x4b,0x2a,0x02,0x09,0xfe,0xfa,0x2b,0x25,0x1b,0x31,0x43,0x28,0x6d,0x2b,0x58,0x2d,0x16,0x11,0x29,0x4f,0x72,0x48,0x41,0x8e,0x77,0x4d,\r\n0x4f,0x9e,0xee,0x9f,0x51,0xa2,0x96,0x83,0x61,0x37,0x2c,0x2a,0x03,0x34,0x33,0x55,0x3d,0x22,0x26,0x3d,0x4a,0x24,0x26,0x3c,0x29,0x16,0x0c,0x14,0x1d,0x33,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x31,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x0a,0x6d,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x63,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x09,0x30,0x00,0xe4,0xfd,0x55,0x00,0x0c,0xb5,0x03,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x59,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x09,0x73,0x00,0xe5,0xfd,0x55,\r\n0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x05,0x31,0x02,0x26,0x09,0x29,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x38,0x01,0x38,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x04,0x79,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x00,\r\n0xfd,0xff,0x03,0x49,0x05,0x91,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x03,0xc9,0x00,0x01,0x00,0x32,0xff,0x55,0x06,0x3d,0x04,0x15,0x00,0x37,0x00,0x3a,0xb2,0x0b,0x05,0x31,0xbb,0x05,0x0a,0x00,0x18,0x00,0x2a,0x05,0x0a,0x40,0x09,0x1f,0x25,0x18,0x1f,0x18,0x1f,0x39,0x08,0x0e,0xbd,0x05,0x0a,0x00,0x05,0x00,\r\n0x00,0x04,0xfb,0x00,0x13,0x04,0xe6,0x00,0x3f,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,\r\n0x04,0x15,0x14,0x0e,0x04,0x03,0x48,0x91,0xc4,0x78,0x34,0x0e,0x0e,0xfe,0xcf,0x01,0xeb,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xab,0x4c,0x81,0xad,0x60,0x38,0x72,0x39,0x39,0x72,0x61,0x58,0xaf,0x55,\r\n0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x00,0x00,0x01,0x00,0x1e,0xff,0x02,0x07,0x58,0x02,0x13,0x00,0x44,0x00,0x5a,0xb3,0x26,0x14,0x20,0x38,0xb8,0x05,0x0a,0xb2,0x0f,\r\n0x0f,0x14,0xb8,0x05,0x0a,0xb3,0x33,0x33,0x46,0x29,0xb8,0x05,0x0a,0x40,0x09,0x20,0x23,0x23,0x20,0x26,0x3d,0x23,0x23,0x0c,0xb8,0x04,0xff,0xb4,0x2f,0x3d,0x01,0x3d,0x1b,0xb8,0x04,0xfb,0xb4,0x2f,0x2e,0x01,0x2e,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,\r\n0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,\r\n0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x07,0x58,0x16,0x43,0x67,0x4f,0x3b,0x2e,0x25,0x12,0x17,0x29,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x97,0xcc,0x7d,0x35,0x04,0x04,0xfe,0xd0,0x01,0xe3,0x0e,0x12,0x23,0x5d,0xa0,0x7d,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x19,0x2c,0x40,\r\n0x66,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x4b,0x81,0xad,0x63,0x1f,0x49,0x23,0x39,0x72,0x5f,0x49,0x79,0x3f,0x4d,0x7d,0x5a,0x31,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x27,0x60,0x54,0x39,0xff,0xff,0x00,0x9a,\r\n0xff,0x55,0x05,0x91,0x05,0xdc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0x2c,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfc,0x50,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x6d,\r\n0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x49,0x04,0x79,0x02,0x26,0x09,0x29,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x9a,0xfd,0xc9,0x05,0x91,0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x00,0x07,0x0f,0x52,0x02,0x01,0xfd,0xce,0xff,0xff,\r\n0x00,0x9a,0xfd,0xc4,0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x01,0x07,0x0f,0x52,0x01,0xc8,0xfd,0xc9,0x00,0x08,0xb3,0x02,0x4a,0x14,0x26,0x00,0x2b,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc9,0x05,0x91,0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x00,0x07,0x0f,0x54,0x02,0x01,0xfd,0xce,0xff,0xff,0x00,0x9a,0xfd,0xc4,\r\n0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xc8,0xfd,0xc9,0x00,0x04,0xff,0xa8,0x06,0x1d,0x02,0x5f,0x08,0xde,0x00,0x46,0x00,0x56,0x00,0x5a,0x00,0x5e,0x00,0x7a,0xb9,0x00,0x5c,0x05,0x0d,0xb2,0x5b,0x5b,0x0e,0xb8,0x05,0x0d,0xb5,0x47,0x29,0x29,0x47,0x18,0x3f,0xbe,0x05,0x0d,0x00,0x3c,0x00,0x23,\r\n0x05,0x0d,0x00,0x32,0x00,0x57,0x05,0x0d,0xb2,0x58,0x58,0x51,0xb8,0x05,0x0d,0xb6,0x03,0x5d,0x5a,0x5b,0x57,0x3e,0x08,0xb8,0x05,0x01,0x40,0x0a,0x4c,0x43,0x18,0x13,0x54,0x46,0x46,0x37,0x37,0x43,0xb8,0x05,0x01,0xb4,0x13,0x1b,0x1b,0x13,0x26,0xb9,0x05,0x01,0x00,0x2d,0x00,0x2f,0xfd,0xce,0x32,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,\r\n0x32,0x11,0x39,0x10,0xd4,0xfd,0xcc,0xde,0x32,0xcd,0x32,0x01,0x2f,0xed,0x39,0x2f,0xed,0x2f,0xed,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x32,0x17,0x37,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x01,0x98,0x32,0x23,0x14,0x25,0x32,\r\n0x1e,0x1e,0x2f,0x19,0x11,0x1c,0x38,0x55,0x65,0x2e,0x17,0x27,0x30,0x0b,0x01,0x11,0x2c,0x16,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x40,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,0x3b,0x16,0x1d,0x10,0x0e,0x0c,0x58,0x10,0x1a,0x1a,0x21,0x2d,0x14,0x6e,0x0a,0x11,0x16,0x0c,0x09,0x11,0x0d,0x09,0x25,0x36,0x09,\r\n0x09,0x58,0x57,0x57,0x8f,0x57,0x57,0x07,0x2f,0x15,0x3a,0x1f,0x1b,0x36,0x2b,0x1c,0x1f,0x25,0x1a,0x46,0x2a,0x3b,0x3f,0x1e,0x05,0x17,0x15,0x19,0x12,0x01,0x0f,0x12,0x19,0x10,0x09,0x06,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x08,0x17,0x15,0x01,0x76,0xfe,0xa0,0x2f,0x22,0x01,0x40,0x10,0x24,0x1f,0x15,0x0c,\r\n0x12,0x17,0x0c,0x14,0x29,0x18,0x06,0x1b,0x01,0x06,0x56,0x56,0x56,0x00,0x00,0x02,0xff,0xb7,0x06,0x71,0x02,0x28,0x08,0x06,0x00,0x1f,0x00,0x2f,0x00,0x35,0xb9,0x00,0x12,0x05,0x0d,0xb6,0x26,0x1a,0x20,0x08,0x03,0x17,0x0d,0xb8,0x05,0x01,0xb2,0x2b,0x13,0x23,0xbb,0x05,0x01,0x00,0x17,0x00,0x03,0x05,0x01,0xb3,0x1f,0x1f,0x1d,0x17,\r\n0x00,0x2f,0x33,0x33,0x2f,0xed,0x10,0xfd,0x32,0xd6,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x31,0x30,0x03,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x49,0x0e,0x1c,0x0b,\r\n0x26,0x30,0x21,0x16,0x0d,0x0a,0x1f,0x30,0x45,0x32,0x37,0x50,0x33,0x18,0x19,0x32,0x4a,0x31,0x3f,0x67,0x24,0x20,0x57,0x31,0x16,0x16,0xfa,0x18,0x53,0x31,0x36,0x3e,0x0f,0x1f,0x2f,0x20,0x1d,0x2e,0x24,0x1a,0x06,0xdc,0x02,0x02,0x11,0x21,0x30,0x1e,0x19,0x3d,0x35,0x23,0x2c,0x43,0x4e,0x21,0x23,0x41,0x34,0x1f,0x32,0x23,0x30,0x25,\r\n0x03,0x9e,0x1d,0x1e,0x26,0x26,0x12,0x2c,0x26,0x19,0x16,0x26,0x34,0x00,0x00,0x02,0x00,0x37,0x06,0x1e,0x01,0x9b,0x08,0x4e,0x00,0x2b,0x00,0x2f,0x00,0x39,0xb1,0x19,0x2c,0xb8,0x05,0x0d,0xb2,0x2d,0x20,0x05,0xb8,0x05,0x0e,0xb4,0x13,0x2b,0x18,0x0e,0x24,0xb8,0x04,0xfd,0xb2,0x1e,0x00,0x2f,0xbc,0x04,0xfd,0x00,0x2c,0x00,0x08,0x05,\r\n0x01,0x00,0x0e,0x00,0x2f,0xfd,0xde,0xfd,0xd6,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x03,0x23,0x35,0x33,0x01,0x86,\r\n0x49,0x62,0x3c,0x19,0x3b,0x46,0x46,0x4e,0x29,0x48,0x23,0x38,0x4f,0x32,0x17,0x14,0x37,0x5f,0x4b,0x12,0x1d,0x1e,0x25,0x1b,0x35,0x23,0x14,0x2d,0x1a,0x1c,0x2b,0x24,0x20,0x24,0x2a,0x1d,0x50,0x57,0x57,0x07,0x93,0x12,0x29,0x2d,0x31,0x1a,0x29,0x38,0x1a,0x61,0x0e,0x0c,0x1e,0x33,0x42,0x23,0x1f,0x42,0x3f,0x39,0x17,0x03,0x06,0x0e,\r\n0x0c,0x08,0x0d,0x5f,0x06,0x07,0x0a,0x0f,0x13,0x10,0x0b,0x01,0xfe,0xc7,0x56,0x00,0x00,0x03,0x00,0x1d,0x06,0x70,0x01,0xec,0x08,0x17,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2d,0xbf,0x00,0x09,0x05,0x0a,0x00,0x08,0x00,0x00,0x05,0x0a,0x00,0x01,0x00,0x0b,0x04,0xff,0xb5,0x20,0x08,0x01,0x08,0x06,0x03,0xb8,0x04,0xff,0xb1,0x04,0x00,\r\n0x00,0x2f,0x32,0xfd,0x32,0xde,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0xbf,0xa2,0xa2,0x01,0x2d,0xa1,0xa1,0x96,0xa2,0xa2,0x06,0x70,0x9e,0x9e,0x9e,0x6b,0x9e,0x00,0x01,0xff,0x2b,0x06,0x1f,0x02,0xae,0x08,0x2f,0x00,0x43,0x00,0x60,0xb4,0x28,0x28,0x00,0x00,0x03,\r\n0xb8,0x05,0x0d,0xb2,0x40,0x21,0x0b,0xb8,0x05,0x0d,0xb6,0x08,0x40,0x08,0x40,0x08,0x18,0x38,0xbb,0x05,0x0d,0x00,0x32,0x00,0x18,0x05,0x0d,0x40,0x0b,0x15,0x21,0x28,0x10,0x1d,0x17,0x0a,0x0a,0x00,0x05,0x10,0xb8,0x05,0x01,0xb3,0x24,0x1d,0x35,0x3b,0xb9,0x04,0xfd,0x00,0x2d,0x00,0x2f,0xfd,0xc6,0xd4,0x32,0xfd,0x32,0xc4,0x32,0x11,\r\n0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x2f,0x32,0x2f,0x31,0x30,0x13,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,\r\n0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0xe0,0x03,0x05,0x02,0x03,0x3f,0x1d,0x26,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x59,0x1b,0x2b,0x38,0x1d,0x29,0x3e,0x11,0x01,0x14,0x3a,0x1a,0x1a,0x21,0x0a,0x02,0x02,0x19,0x37,0x56,0x3e,0x3f,0x54,0x32,\r\n0x15,0x0d,0x56,0x05,0x05,0x3b,0x44,0x28,0x38,0x23,0x10,0x07,0x07,0x07,0xbc,0x1a,0x2c,0x17,0x34,0x1e,0x2d,0x6d,0x50,0x1b,0x28,0x19,0x0c,0x06,0x11,0x1e,0x17,0xb8,0xd2,0x2d,0x3a,0x21,0x0c,0x17,0x1d,0x1e,0x16,0x0f,0x0e,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x33,0x3b,0x1b,0x29,0x16,0x41,0x35,0x12,0x28,0x41,0x2f,0x21,0x43,\r\n0x2f,0x00,0x00,0x04,0x00,0x2d,0xfe,0xd2,0x08,0xcf,0x06,0x97,0x00,0x20,0x00,0x48,0x00,0x5c,0x00,0x70,0x00,0x31,0x40,0x16,0x18,0x6c,0x6c,0x15,0x3d,0x62,0x62,0x38,0x42,0x1b,0x15,0x08,0x4e,0x4e,0x0d,0x29,0x58,0x58,0x2e,0x24,0x03,0x0d,0x00,0x2f,0x33,0xcd,0x32,0x32,0x2f,0xcd,0x11,0x33,0x2f,0xcd,0x2f,0x33,0xcd,0x32,0x32,0x2f,\r\n0xcd,0x11,0x33,0x2f,0xcd,0x30,0x31,0x25,0x06,0x04,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x24,0x27,0x24,0x11,0x10,0x25,0x36,0x25,0x36,0x36,0x33,0x32,0x16,0x17,0x04,0x17,0x04,0x11,0x10,0x05,0x16,0x04,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x36,0x24,0x37,0x36,0x12,0x35,0x10,0x25,0x26,0x25,0x0e,0x03,0x23,0x22,0x2e,0x02,\r\n0x27,0x06,0x04,0x07,0x04,0x11,0x10,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0xa1,0x7c,0xfe,0xcc,0xbe,0x08,0x22,0x2f,0x3a,0x20,0x20,0x3a,0x2f,0x22,0x08,0xfe,0x82,0xf7,0xfe,0xd5,0x01,0x2e,0xf1,0x01,\r\n0x83,0x12,0x60,0x3f,0x3e,0x5f,0x13,0x01,0x7a,0xf9,0x01,0x2c,0xf8,0xe8,0x6d,0x01,0x09,0xa1,0x09,0x22,0x2e,0x39,0x20,0x1f,0x3a,0x2e,0x22,0x09,0xa4,0x01,0x0a,0x6a,0x86,0x81,0xfe,0xfd,0xce,0xfe,0xb4,0x07,0x21,0x30,0x3b,0x21,0x21,0x3a,0x30,0x22,0x07,0x9f,0xfe,0xf9,0x6a,0xfe,0xef,0x03,0x5b,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,\r\n0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x41,0x61,0x72,0x13,0x1e,0x32,0x24,0x15,0x15,0x24,0x32,0x1d,0x24,0xc1,0xed,0x01,0x7c,0x01,0x96,0xf1,0xc1,0x27,0x38,0x48,0x47,0x37,0x21,0xc4,0xec,0xfe,0x83,0xfe,0x65,0xa5,0x55,0x63,0x11,0x1c,0x31,\r\n0x23,0x14,0x14,0x23,0x31,0x1c,0x11,0x5e,0x50,0x66,0x01,0x16,0xb7,0x01,0x72,0xc9,0x9f,0x23,0x1f,0x34,0x26,0x15,0x15,0x25,0x33,0x1e,0x11,0x65,0x53,0xd4,0xfe,0xa6,0xfe,0xa6,0xfe,0x2f,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x06,0x38,0x19,0x2d,0x21,0x13,0x13,0x21,0x2d,0x19,0x19,0x2d,0x21,\r\n0x13,0x13,0x21,0x2d,0x00,0x0a,0x01,0x46,0xfe,0xa4,0x07,0x66,0x06,0xc8,0x00,0x17,0x00,0x2b,0x00,0x34,0x00,0x3d,0x00,0x45,0x00,0x52,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x0c,0xb3,0x3d,0x12,0x31,0x06,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x34,0x3e,0x02,0x37,0x01,0x01,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x01,\r\n0x2e,0x03,0x25,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x01,0x32,0x16,0x17,0x13,0x27,0x07,0x13,0x36,0x01,0x03,0x06,0x06,0x23,0x22,0x27,0x03,0x17,0x13,0x16,0x16,0x17,0x25,0x26,0x26,0x27,0x01,0x14,0x16,0x17,0x25,0x26,0x26,0x35,0x34,0x37,0x25,0x06,0x06,0x05,0x14,0x06,0x07,0x05,0x36,0x35,\r\n0x34,0x26,0x27,0x05,0x16,0x01,0x26,0x26,0x27,0x05,0x16,0x16,0x17,0x01,0x06,0x06,0x07,0x13,0x36,0x36,0x37,0x01,0x36,0x36,0x37,0x03,0x06,0x06,0x07,0x01,0x46,0x42,0x78,0xa7,0x65,0x01,0x4a,0x01,0x4a,0x65,0xa7,0x78,0x42,0x43,0x78,0xa7,0x64,0xfe,0xb6,0xfe,0xb4,0x64,0xa6,0x78,0x42,0x01,0xf5,0x2c,0x4d,0x67,0x3b,0x3b,0x67,0x4d,\r\n0x2c,0x2c,0x4d,0x67,0x3b,0x3b,0x67,0x4d,0x2c,0x01,0x1b,0x20,0x3e,0x1d,0x72,0xed,0xee,0x73,0x3c,0x01,0x2c,0x73,0x1d,0x3d,0x20,0x41,0x3a,0x72,0xed,0xb3,0x38,0x58,0x1d,0x01,0x06,0x33,0xa7,0x6c,0xfc,0x3a,0x14,0x14,0x01,0x05,0x09,0x0a,0x14,0xfe,0xfa,0x14,0x14,0x04,0x32,0x0b,0x09,0x01,0x05,0x29,0x14,0x14,0xfe,0xfa,0x14,0xfd,\r\n0xc0,0x38,0x58,0x1d,0xfe,0xfb,0x33,0xa7,0x6c,0x02,0x80,0x1d,0x58,0x38,0x6c,0x6c,0xa7,0x33,0xfc,0x3a,0x1d,0x58,0x38,0x6c,0x6b,0xa8,0x33,0x02,0xb6,0x76,0xda,0xb8,0x91,0x2f,0x01,0x4a,0xfe,0xb5,0x2f,0x91,0xb8,0xd9,0x76,0x76,0xd9,0xb8,0x92,0x2e,0xfe,0xb5,0x01,0x4c,0x2e,0x91,0xb8,0xd9,0x76,0x3b,0x67,0x4d,0x2c,0x2c,0x4d,0x67,\r\n0x3b,0x3b,0x67,0x4d,0x2c,0x2c,0x4d,0x67,0x01,0x51,0x0b,0x09,0x01,0x16,0xee,0xee,0xfe,0xea,0x14,0xfb,0xe5,0x01,0x16,0x09,0x0a,0x14,0xfe,0xe9,0xed,0x04,0xdc,0x1d,0x58,0x38,0x6d,0x6c,0xa7,0x33,0xfd,0x9a,0x3d,0x74,0x36,0x6c,0x1d,0x3e,0x20,0x3f,0x3c,0x6c,0x36,0x74,0x3d,0x20,0x3e,0x1d,0x6c,0x6d,0x7a,0x3d,0x74,0x36,0x6d,0x3a,\r\n0xfe,0x5f,0x1d,0x58,0x38,0x6c,0x6c,0xa7,0x33,0x01,0xb2,0x38,0x58,0x1d,0xfe,0xfc,0x33,0xa6,0x6c,0x01,0xd3,0x38,0x58,0x1d,0x01,0x05,0x33,0xa7,0x6b,0x00,0x00,0x02,0x00,0x63,0x06,0x8f,0x01,0xa4,0x07,0xd0,0x00,0x0b,0x00,0x17,0x00,0x26,0x41,0x0c,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x00,0x05,0x00,\r\n0x00,0x12,0x00,0x0c,0x05,0x00,0x00,0x06,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x05,0x41,0x5e,0x5e,0x41,0x45,0x5d,0x5d,0x45,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0x07,0xd0,0x5d,\r\n0x45,0x41,0x5e,0x5e,0x41,0x45,0x5d,0xf6,0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0x02,0x00,0x63,0x06,0x7b,0x01,0xa4,0x08,0x1c,0x00,0x0b,0x00,0x19,0x00,0x24,0xbf,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x00,0x05,0x00,0xb2,0x12,0x0c,0x06,0xb8,0x01,0x4c,0x00,0x3f,0xdd,0xd6,0xed,0x01,0x2f,0xed,\r\n0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x01,0x02,0x4b,0x57,0x53,0x4f,0x4c,0x53,0x54,0x4e,0x30,0x21,0x22,0x2f,0x30,0x24,0x08,0x14,0x20,0x08,0x1c,0x67,0x69,0x66,0x6b,0x69,0x67,0x6a,0x67,0xfe,0xaa,0x3b,0x49,0x4b,0x3c,\r\n0x3b,0x4b,0x25,0x33,0x1f,0x0e,0x00,0x01,0x00,0x23,0x06,0x71,0x01,0xe3,0x07,0xb8,0x00,0x20,0x00,0x1d,0xb4,0x0b,0x12,0x1b,0x04,0x16,0xbc,0x04,0xfd,0x00,0x10,0x00,0x07,0x05,0x01,0x00,0x00,0x00,0x2f,0xfd,0xd6,0xed,0x01,0x2f,0xc4,0x39,0x39,0x31,0x30,0x13,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x36,0x37,0x35,0x2e,0x03,0x23,\r\n0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x07,0x0e,0x03,0x5f,0x0d,0x15,0x0d,0x0d,0x0e,0x1c,0x0d,0x54,0x90,0x39,0x12,0x1f,0x22,0x29,0x1d,0x32,0x24,0x13,0x2e,0x18,0x2b,0x3c,0x36,0x3b,0x2a,0x12,0x15,0x43,0x5c,0x76,0x06,0x71,0x01,0x02,0x67,0x02,0x02,0x34,0x23,0x03,0x06,0x0e,0x0c,0x08,0x0d,0x5f,0x06,0x07,0x16,0x1a,\r\n0x17,0x01,0x73,0x09,0x2e,0x30,0x25,0x00,0x00,0x02,0x00,0x16,0x06,0x1f,0x02,0x28,0x08,0x5e,0x00,0x20,0x00,0x30,0x00,0x40,0xb3,0x06,0x2c,0x03,0x10,0xb8,0x05,0x0d,0xb3,0x24,0x20,0x20,0x1d,0xb8,0x05,0x0d,0x40,0x0a,0x03,0x00,0x00,0x03,0x1a,0x06,0x2c,0x03,0x15,0x0b,0xbb,0x05,0x01,0x00,0x29,0x00,0x21,0x05,0x01,0xb1,0x15,0x20,\r\n0x00,0x2f,0xd6,0xfd,0xd6,0xed,0x11,0x17,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x13,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,\r\n0x03,0x1e,0x04,0x04,0x31,0x2b,0x12,0x41,0x48,0x44,0x15,0x33,0x4a,0x2f,0x16,0x16,0x2a,0x3f,0x29,0x1a,0x35,0x31,0x2e,0x13,0x2b,0x24,0x04,0x05,0xfa,0x27,0x34,0x0d,0x1b,0x2b,0x1e,0x35,0x50,0x14,0x16,0x2c,0x2b,0x2b,0x06,0x1f,0x1a,0x31,0x14,0x44,0x61,0x17,0x65,0x74,0x3b,0x10,0x2c,0x44,0x4f,0x23,0x24,0x40,0x30,0x1d,0x0b,0x0c,\r\n0x0b,0x3a,0x34,0x14,0x32,0x1a,0x01,0x12,0x1e,0x2b,0x13,0x2d,0x26,0x19,0x56,0x58,0x01,0x09,0x09,0x07,0x00,0x01,0xff,0x2b,0xfd,0xf5,0x02,0xae,0x00,0x05,0x00,0x43,0x00,0x66,0xb9,0x00,0x18,0x05,0x0d,0xb2,0x15,0x21,0x0b,0xb8,0x05,0x0d,0xb5,0x08,0x28,0x28,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x0a,0x40,0x15,0x08,0x40,0x40,0x08,\r\n0x15,0x03,0x17,0x38,0xb8,0x05,0x0d,0xb4,0x32,0x17,0x38,0x32,0x2d,0xb8,0x04,0xfd,0xb4,0x3b,0x21,0x28,0x24,0x1d,0xb8,0x04,0xfd,0xb6,0x05,0x10,0x16,0x09,0x09,0x35,0x00,0x00,0x2f,0x32,0x32,0x11,0x33,0xd4,0x32,0xed,0x32,0x39,0x39,0xd4,0xed,0x2f,0x2f,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x32,\r\n0x2f,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x17,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,\r\n0x02,0x35,0x34,0x26,0x27,0xe0,0x03,0x05,0x02,0x03,0x3f,0x1d,0x26,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x59,0x1b,0x2b,0x38,0x1d,0x29,0x3e,0x11,0x01,0x14,0x3a,0x1a,0x1a,0x21,0x0a,0x02,0x02,0x19,0x37,0x56,0x3e,0x3f,0x54,0x32,0x15,0x0d,0x56,0x05,0x05,0x3b,0x44,0x28,0x38,0x23,0x10,0x07,0x07,0x6e,0x1a,0x2c,0x17,0x34,\r\n0x1e,0x2d,0x6d,0x50,0x1b,0x28,0x19,0x0c,0x06,0x11,0x1e,0x17,0xb8,0xd2,0x2d,0x3a,0x21,0x0c,0x17,0x1d,0x1e,0x16,0x0f,0x0e,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x33,0x3b,0x1b,0x29,0x16,0x41,0x35,0x12,0x28,0x41,0x2f,0x21,0x43,0x2f,0x00,0x01,0xff,0xc9,0x06,0x71,0x02,0x3c,0x07,0x26,0x00,0x1b,0x00,0x28,0x40,0x0a,0x00,0x0e,\r\n0x0e,0x0d,0x0d,0x05,0x00,0x1b,0x1b,0x13,0xbc,0x05,0x01,0x00,0x0a,0x00,0x18,0x05,0x01,0x00,0x05,0x00,0x2f,0xed,0xdc,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x3c,0x18,0x2e,0x2a,0x26,\r\n0x10,0x30,0x4b,0x45,0x46,0x29,0x20,0x2d,0x17,0x3a,0x18,0x2d,0x2a,0x26,0x11,0x30,0x4c,0x45,0x44,0x29,0x21,0x2d,0x17,0x06,0xbf,0x19,0x1f,0x10,0x06,0x19,0x1d,0x19,0x15,0x14,0x41,0x19,0x1f,0x10,0x06,0x19,0x1d,0x19,0x13,0x16,0x00,0x02,0x00,0x4d,0x06,0x1f,0x01,0xb8,0x08,0x29,0x00,0x22,0x00,0x32,0x00,0x39,0xb1,0x13,0x2d,0xb8,\r\n0x05,0x0d,0xb4,0x0f,0x0f,0x33,0x23,0x1a,0xb8,0x05,0x0d,0xb2,0x08,0x03,0x14,0xb8,0x05,0x01,0xb2,0x28,0x08,0x30,0xbc,0x04,0xfd,0x00,0x0a,0x00,0x03,0x04,0xfd,0x00,0x1f,0x00,0x2f,0xfd,0xde,0xfd,0x39,0xde,0xed,0x01,0x2f,0x2f,0xed,0x33,0x11,0x33,0x2f,0xed,0x32,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,\r\n0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x4d,0x2c,0x45,0x21,0x29,0x32,0x1b,0x0a,0x01,0x21,0x28,0x1e,0x36,0x29,0x18,0x16,0x27,0x36,0x20,0x22,0x34,0x1a,0x1a,0x19,0x17,0x31,0x4f,0x38,0x26,0x49,\r\n0x2d,0x01,0x13,0x0c,0x15,0x1b,0x0f,0x0b,0x16,0x11,0x0b,0x2f,0x1c,0x10,0x1f,0x06,0x9c,0x11,0x0c,0x14,0x1f,0x28,0x14,0x0c,0x12,0x23,0x35,0x23,0x1e,0x42,0x36,0x24,0x25,0x25,0x26,0x69,0x3b,0x30,0x59,0x44,0x29,0x0e,0x11,0x01,0x0d,0x0d,0x2b,0x28,0x1d,0x0e,0x16,0x1c,0x0d,0x1d,0x1f,0x04,0xff,0xff,0x00,0x21,0x06,0x70,0x03,0x36,\r\n0x08,0x35,0x00,0x07,0x0a,0x1e,0x00,0x9f,0x00,0x00,0x00,0x01,0xff,0x82,0x06,0x70,0x02,0x97,0x08,0x35,0x00,0x23,0x00,0x1b,0xb9,0x00,0x08,0x05,0x0d,0xb4,0x1b,0x00,0x23,0x23,0x0b,0xb9,0x05,0x01,0x00,0x16,0x00,0x2f,0xed,0x32,0x2f,0x33,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,\r\n0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x36,0x36,0x37,0x01,0x02,0x20,0x38,0x33,0x31,0x19,0x2d,0x23,0x81,0x8b,0x38,0x77,0x72,0x66,0x27,0x34,0x7a,0x78,0x6c,0x27,0x63,0x86,0x51,0x22,0x13,0x23,0x2f,0x1b,0x2a,0x68,0x31,0x07,0xe3,0x1a,0x28,0x20,0x1b,0x0d,0x17,0x19,0x12,0x25,0x1b,0x04,0x06,0x08,0x05,\r\n0x65,0x06,0x09,0x07,0x03,0x15,0x29,0x3a,0x25,0x1e,0x2e,0x27,0x21,0x11,0x19,0x40,0x2a,0x00,0x00,0x02,0x00,0x32,0x06,0x71,0x01,0xd4,0x08,0x8c,0x00,0x1e,0x00,0x22,0x00,0x31,0xbc,0x00,0x1f,0x05,0x0b,0x00,0x20,0x00,0x03,0x05,0x0d,0xb3,0x1b,0x11,0x11,0x13,0xb8,0x05,0x0d,0xb5,0x0d,0x22,0x1f,0x1e,0x11,0x16,0xb9,0x05,0x01,0x00,\r\n0x08,0x00,0x2f,0xfd,0xc6,0xd6,0xd6,0xcd,0x01,0x2f,0xed,0x32,0x2f,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x01,0xc7,0x07,0x06,0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,\r\n0x05,0x58,0x09,0x31,0x3b,0x23,0x31,0x20,0x0e,0x07,0x06,0x31,0x73,0x73,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x35,0x2a,0x0f,0x22,0x37,0x27,0x1a,0x3d,0x26,0x38,0x71,0x00,0x00,0x04,0x00,0x64,0xff,0xe0,0x04,0x68,0x06,0xb4,0x00,0x17,0x00,0x2e,0x00,0x45,0x00,0x5b,0x00,0x14,\r\n0xb7,0x3a,0x23,0x0b,0x52,0x45,0x18,0x17,0x46,0x00,0x2f,0xcd,0xde,0xcd,0x2f,0x33,0xce,0x32,0x30,0x31,0x01,0x26,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x07,0x11,0x21,0x37,0x11,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x06,0x06,\r\n0x07,0x11,0x27,0x11,0x36,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x17,0x11,0x07,0x21,0x11,0x36,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x01,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x01,0x18,0x41,0x2b,0x23,0x25,0x13,0x24,0x33,0x21,0x01,0x77,0x01,0x75,0x40,0x4d,0x22,\r\n0x23,0x15,0x37,0x23,0xfd,0x64,0xbe,0x34,0x40,0x14,0x16,0x16,0x2a,0x26,0xf4,0xf2,0x24,0x2e,0x17,0x15,0x17,0x44,0x2d,0x44,0x39,0x4c,0x11,0x0e,0x10,0x21,0x19,0xc6,0xc6,0x1c,0x1e,0x0f,0x0e,0x0e,0x4a,0x3f,0x9a,0x01,0xcc,0x33,0x3f,0x0e,0x1a,0x1a,0x3c,0x33,0xfe,0xd5,0xfe,0xd3,0x33,0x3a,0x1c,0x1a,0x1e,0x60,0x02,0xa2,0x29,0x42,\r\n0x35,0x7c,0x42,0x32,0x56,0x4d,0x45,0x21,0x01,0x79,0xfe,0x8b,0x41,0x9f,0x60,0x41,0x7b,0x35,0x20,0x37,0x15,0xfd,0x3e,0xbe,0x02,0x6c,0x15,0x2f,0x19,0x1c,0x4e,0x2d,0x3c,0x5b,0x26,0xf5,0xf2,0x24,0x5e,0x40,0x2d,0x4c,0x1b,0x1d,0x2f,0x14,0xfd,0x96,0x44,0x02,0x52,0x1a,0x2d,0x16,0x12,0x37,0x22,0x30,0x45,0x19,0xc6,0xc8,0x1d,0x41,\r\n0x2c,0x21,0x39,0x12,0x13,0x33,0x14,0xfd,0xaa,0x9a,0x02,0x95,0x1e,0x35,0x17,0x28,0x5e,0x32,0x49,0x7f,0x33,0x01,0x2b,0xfe,0xd2,0x34,0x76,0x4d,0x33,0x60,0x27,0x2e,0x3d,0x00,0x00,0x02,0x00,0x10,0xfd,0xda,0x01,0xf7,0xff,0xc1,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x14,0x00,0x07,0x07,0x05,0x05,0x06,0x01,0x04,0x03,0x02,0x02,0x01,\r\n0x2f,0x03,0x01,0x03,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0x2f,0x5d,0x12,0x39,0x3d,0x2f,0x12,0x39,0x12,0x39,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x13,0x37,0x17,0x07,0x35,0x37,0x27,0x07,0x10,0xf4,0xf3,0xf4,0x8a,0x89,0x8a,0xfe,0xcd,0xf4,0xf4,0xf3,0x6a,0x89,0x89,0x89,0x00,0x02,0x00,0x10,0x06,0x35,0x01,0xf7,0x08,0x1c,0x00,0x03,\r\n0x00,0x07,0x00,0x22,0x40,0x0e,0x00,0x07,0x07,0x05,0x05,0x06,0x01,0x04,0x03,0x02,0x02,0x01,0x03,0x01,0x00,0x2f,0x2f,0x12,0x39,0x3d,0x2f,0x12,0x39,0x12,0x39,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x13,0x37,0x17,0x07,0x35,0x37,0x27,0x07,0x10,0xf4,0xf3,0xf4,0x8a,0x89,0x8a,0x07,0x28,0xf4,0xf4,0xf3,0x6a,0x89,0x89,0x89,0x00,0x02,\r\n0x00,0x16,0xfd,0xf5,0x02,0x28,0x00,0x34,0x00,0x20,0x00,0x30,0x00,0x40,0xb9,0x00,0x10,0x05,0x0d,0xb5,0x24,0x20,0x20,0x06,0x06,0x1d,0xb8,0x05,0x0d,0x40,0x09,0x03,0x00,0x00,0x03,0x1a,0x2c,0x0b,0x20,0x15,0xbb,0x04,0xfd,0x00,0x21,0x00,0x29,0x04,0xfd,0xb3,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xfd,0xd6,0xed,0x32,0x11,0x39,0x39,\r\n0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x2f,0xed,0x31,0x30,0x13,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x13,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x1e,0x04,0x04,0x31,0x2b,0x12,0x41,0x48,0x44,\r\n0x15,0x33,0x4a,0x2f,0x16,0x16,0x2a,0x3f,0x29,0x1a,0x35,0x31,0x2e,0x13,0x2b,0x24,0x04,0x05,0xfa,0x27,0x34,0x0d,0x1b,0x2b,0x1e,0x35,0x50,0x14,0x16,0x2c,0x2b,0x2b,0xfd,0xf5,0x1a,0x31,0x14,0x44,0x61,0x17,0x65,0x74,0x3b,0x10,0x2c,0x44,0x4f,0x23,0x24,0x40,0x30,0x1d,0x0b,0x0c,0x0b,0x3a,0x34,0x14,0x32,0x1a,0x01,0x12,0x1e,0x2b,\r\n0x13,0x2d,0x26,0x19,0x56,0x58,0x01,0x09,0x09,0x07,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x53,0x05,0x46,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xa4,\r\n0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0xf7,0x04,0xb2,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x27,0x0f,0x50,0x06,0x3c,0xfe,0xab,0x00,0x07,0x0f,0x50,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x07,0x4b,0x04,0xb2,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x27,0x0f,0x50,0x03,0x1e,\r\n0x04,0x02,0x00,0x07,0x0f,0x50,0x03,0x90,0xfe,0xab,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0x8f,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0xe4,0x04,0xdf,0x00,0x07,0x0f,0x50,0x01,0x8f,0xff,0xb1,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x05,0x2a,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x56,\r\n0x04,0x7a,0x00,0x07,0x0f,0x50,0x01,0x56,0xff,0x57,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x1d,0x04,0x34,0x00,0x07,0x0f,0x50,0x01,0x1d,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x56,\r\n0x04,0x02,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0xff,0xff,0x00,0x5a,0xfd,0xff,0x02,0xe5,0x02,0xb4,0x02,0x26,0x09,0x07,0x00,0x00,0x00,0x07,0x0f,0x5d,0x00,0xab,0x00,0x00,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x5d,0x01,0x99,0x00,0x00,0xff,0xff,0xff,0xc2,0xff,0xea,\r\n0x03,0xf3,0x07,0x77,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x02,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc2,0xff,0xea,0x04,0xad,0x07,0x77,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,\r\n0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x02,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x34,0xfd,0xfe,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,0x00,0x34,0xfd,0xfe,0x04,0xad,0x05,0xec,0x00,0x27,0x0f,0x8d,0x02,0xac,\r\n0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,0x00,0x3a,0xff,0xea,0x03,0xf3,0x05,0xec,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x3a,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,\r\n0x00,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xc5,0x08,0x0e,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x9d,0x00,0x32,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xc5,0x08,0x0e,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,\r\n0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x9d,0x00,0x32,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0xfa,0x07,0x67,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x9d,0x06,0xb7,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x07,0x67,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,\r\n0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x9d,0x06,0xb7,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x9b,0x08,0x7f,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x01,0x07,0x0f,0x53,0x02,0x9d,0x06,0xb7,0x00,0x0e,0xb6,0x04,0x03,0x02,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,\r\n0x00,0x52,0xff,0xea,0x04,0xad,0x08,0x7f,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x01,0x07,0x0f,0x53,0x02,0x9d,0x06,0xb7,0x00,0x0e,0xb6,0x04,0x03,0x02,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x9b,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,\r\n0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x9d,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x9d,0xfd,0xce,0x00,0x01,0x00,0x65,0x00,0x00,0x03,0xf8,0x05,0xa8,0x00,0x2b,0x00,0x40,0xb4,0x04,0x03,0x15,\r\n0x2d,0x1d,0xb8,0x05,0x0a,0xb2,0x0e,0x0e,0x14,0xb8,0x05,0x0a,0xb6,0x15,0x27,0x22,0x04,0x04,0x14,0x09,0xb8,0x04,0xfb,0xb7,0x22,0x00,0x00,0x2f,0x22,0x01,0x22,0x14,0xb8,0x04,0xe6,0x00,0x3f,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0xed,0x39,0x2f,0xed,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x06,0x02,0x07,\r\n0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x16,0x12,0x15,0x11,0x23,0x11,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x03,0xf8,0x48,0x6d,0x23,0x9a,0x11,0x38,0x4a,0x5b,0x33,0x1d,0x25,0x14,0x07,0x18,0x1e,0x18,0x9c,0x0d,0x12,0x17,0x12,0x0d,0x21,0x41,0x5f,0x3f,0x46,0x75,0x5c,0x3f,\r\n0x0f,0x05,0x1a,0x43,0x26,0x05,0x9a,0x6f,0xfe,0xfe,0x95,0x4a,0x83,0x62,0x39,0x11,0x1b,0x23,0x11,0x1d,0x72,0xbe,0xfe,0xec,0xc0,0xfe,0x85,0x01,0x73,0x88,0xd5,0xa4,0x7a,0x5c,0x44,0x1c,0x39,0x5d,0x43,0x25,0x3c,0x5d,0x6e,0x33,0x56,0x94,0x42,0x00,0x00,0x01,0x00,0x52,0x00,0x00,0x03,0x81,0x05,0x9a,0x00,0x12,0x00,0x20,0xb9,0x00,\r\n0x08,0x05,0x0a,0xb2,0x07,0x00,0x0f,0xba,0x04,0xfb,0x00,0x11,0x04,0xe6,0xb3,0x2f,0x08,0x01,0x08,0x00,0x2f,0x5d,0x3f,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x37,0x3e,0x04,0x12,0x37,0x33,0x06,0x02,0x0e,0x03,0x07,0x21,0x15,0x21,0x52,0x31,0x53,0x45,0x36,0x27,0x19,0x05,0x9c,0x07,0x19,0x23,0x2d,0x37,0x41,0x25,0x02,0x5c,0xfc,0xd1,\r\n0x42,0x5c,0xb1,0xba,0xcd,0xf3,0x01,0x20,0xb1,0xb4,0xfe,0xe2,0xe8,0xba,0xa2,0x92,0x4b,0xa7,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xcb,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xcb,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,\r\n0x06,0x03,0x00,0x01,0x00,0x00,0x01,0x87,0x02,0xfe,0x01,0xd9,0x00,0x03,0x00,0x10,0xb9,0x00,0x00,0x04,0xfd,0xb3,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0xfe,0xfd,0x02,0x02,0xfe,0x01,0x87,0x52,0x00,0xff,0xff,0xff,0x97,0xff,0xea,0x03,0xf3,0x07,0x77,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,\r\n0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x8f,0xff,0xff,0xff,0x97,0xff,0xea,0x04,0xad,0x07,0x77,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x0f,0x58,0x00,0x8f,0x00,0x10,0x00,0x66,0x00,0x5a,0x04,0x5b,0x04,0x4e,0x00,0x07,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x2f,\r\n0x00,0x37,0x00,0x3f,0x00,0x47,0x00,0x4f,0x00,0x57,0x00,0x5f,0x00,0x67,0x00,0x6f,0x00,0x77,0x00,0x7f,0x01,0x23,0xb9,0x00,0x18,0x05,0x0b,0xb2,0x1c,0x30,0x10,0xb8,0x05,0x0b,0xb4,0x34,0x14,0x14,0x40,0x00,0xb8,0x05,0x0b,0xb4,0x04,0x44,0x04,0x48,0x08,0xb8,0x05,0x0b,0xb4,0x0c,0x4c,0x0c,0x60,0x20,0xb8,0x05,0x0b,0xb4,0x24,0x64,\r\n0x24,0x70,0x28,0xb8,0x05,0x0b,0xb4,0x2c,0x74,0x2c,0x78,0x38,0xb8,0x05,0x0b,0xb4,0x3c,0x7c,0x3c,0x68,0x50,0xb8,0x05,0x0b,0x40,0x14,0x54,0x6c,0x54,0x1c,0x04,0x0c,0x24,0x2c,0x3c,0x54,0x54,0x3c,0x2c,0x24,0x0c,0x04,0x1c,0x07,0x81,0x58,0xb8,0x05,0x0b,0xb2,0x5c,0x2a,0x0a,0xb8,0x04,0xfd,0xb4,0x0e,0x2e,0x0e,0x3a,0x02,0xb8,0x04,\r\n0xfd,0xb4,0x06,0x3e,0x06,0x52,0x12,0xb8,0x04,0xfd,0xb4,0x16,0x56,0x16,0x5a,0x1a,0xb8,0x04,0xfd,0xb4,0x1e,0x5e,0x1e,0x6a,0x32,0xb8,0x04,0xfd,0xb4,0x36,0x6e,0x36,0x7a,0x42,0xb8,0x04,0xfd,0xb4,0x46,0x7e,0x46,0x72,0x4a,0xb8,0x04,0xfd,0x40,0x14,0x4e,0x76,0x4e,0x0e,0x06,0x16,0x1e,0x36,0x46,0x4e,0x4e,0x46,0x36,0x1e,0x16,0x06,\r\n0x0e,0x07,0x26,0x62,0xbb,0x04,0xfd,0x00,0x66,0x00,0x22,0x04,0xfd,0xb3,0x3f,0x26,0x01,0x26,0x00,0x2f,0x5d,0xed,0x2f,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,\r\n0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x32,0x2f,0x33,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x14,0x23,0x22,0x35,0x34,0x33,\r\n0x32,0x27,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x13,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x07,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,\r\n0x32,0x07,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x07,0x16,0x23,0x22,0x35,0x34,0x33,0x32,0x01,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x25,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x13,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x27,0x14,0x23,0x22,0x35,0x34,0x33,0x32,0x03,0xd4,0x30,0x34,0x34,0x30,0x94,\r\n0x30,0x34,0x34,0x30,0xf7,0x33,0x31,0x33,0x31,0x24,0x30,0x34,0x34,0x30,0xfe,0x37,0x32,0x32,0x32,0x32,0xad,0x33,0x31,0x31,0x33,0x02,0x52,0x33,0x31,0x31,0x33,0xfd,0x1a,0x32,0x32,0x32,0x32,0x02,0x83,0x30,0x34,0x34,0x30,0x94,0x30,0x34,0x34,0x30,0xfd,0xae,0x30,0x34,0x32,0x32,0x24,0x01,0x31,0x34,0x34,0x31,0x01,0xc7,0x32,0x32,\r\n0x32,0x32,0xfe,0x5c,0x32,0x32,0x32,0x32,0xf7,0x33,0x31,0x31,0x33,0x94,0x32,0x32,0x32,0x32,0x03,0x96,0x32,0x32,0x32,0x30,0x31,0x31,0x33,0xfe,0xd7,0x33,0x33,0x31,0xdf,0x32,0x32,0x32,0x01,0x97,0x33,0x33,0x31,0x56,0x31,0x31,0x33,0xfd,0x7b,0x31,0x31,0x33,0x01,0xbd,0x32,0x2f,0x35,0xfd,0x48,0x31,0x31,0x33,0x95,0x30,0x30,0x34,\r\n0x02,0x20,0x33,0x33,0x31,0xdf,0x32,0x32,0x32,0xfe,0x07,0x33,0x33,0x31,0xe8,0x31,0x31,0x33,0xfe,0xd9,0x34,0x30,0x34,0x2e,0x31,0x31,0x33,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x09,0x63,0x01,0xef,0x00,0x0f,0x00,0x10,0xb2,0x0e,0x0b,0x07,0xb9,0x04,0xfb,0x00,0x00,0x00,0x2f,0xfd,0xcd,0x33,0x30,0x31,0x05,0x21,0x22,0x26,0x27,0x27,\r\n0x37,0x21,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x33,0x09,0x63,0xf8,0x84,0x55,0xb2,0x51,0x1c,0x05,0x07,0x66,0x20,0x23,0x9d,0x25,0x1e,0xe8,0x0e,0x0e,0x0f,0x85,0x05,0x5a,0xa8,0x54,0x5a,0xa3,0x59,0x00,0x01,0x00,0x73,0xff,0xf1,0x08,0x39,0x01,0x60,0x00,0x4d,0x00,0x22,0xb1,0x2e,0x3d,0xb8,0x04,0xfb,0xb5,0x1d,0x00,0x10,0x18,0x06,\r\n0x22,0xb8,0x04,0xfb,0xb2,0x45,0x33,0x29,0x00,0x2f,0x33,0x33,0xfd,0x32,0x32,0xdc,0x32,0x32,0xed,0x32,0x30,0x31,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x1e,0x03,0x33,0x21,0x17,0x07,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,\r\n0x22,0x2e,0x02,0x27,0x2e,0x03,0x23,0x22,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x24,0x0a,0x0b,0x23,0x1b,0x16,0x2a,0x28,0x25,0x11,0x14,0x2e,0x34,0x3c,0x21,0x20,0x31,0x27,0x1f,0x0e,0x1e,0x30,0x22,0x12,0x29,0x2e,0x32,0x1a,0x36,0x74,0x87,0x9f,0x62,0x01,0x7a,0x05,0x1c,0x51,0xb2,0x55,0x35,0x60,0x8d,\r\n0x71,0x60,0x33,0x20,0x3c,0x38,0x33,0x18,0x21,0x33,0x29,0x20,0x0f,0x12,0x1c,0x1a,0x1b,0x12,0x1d,0x34,0x1d,0x16,0x32,0x3d,0x4c,0x30,0x33,0x48,0x2d,0x15,0x13,0x0f,0x01,0x48,0x1e,0x3b,0x16,0x26,0x20,0x10,0x1b,0x21,0x11,0x13,0x28,0x20,0x15,0x15,0x20,0x29,0x13,0x2a,0x32,0x10,0x26,0x3e,0x2f,0x1d,0x39,0x2c,0x1b,0x05,0x85,0x0f,\r\n0x0e,0x17,0x25,0x31,0x1b,0x2a,0x35,0x1d,0x0b,0x0f,0x1a,0x22,0x13,0x17,0x25,0x19,0x0e,0x28,0x1c,0x15,0x2d,0x25,0x18,0x1b,0x30,0x43,0x28,0x2a,0x52,0x25,0x00,0x02,0x00,0x49,0xff,0xf2,0x05,0xd0,0x02,0x6c,0x00,0x1c,0x00,0x2e,0x00,0x16,0xb9,0x00,0x15,0x04,0xfb,0xb2,0x22,0x2c,0x1c,0xb9,0x04,0xfb,0x00,0x0b,0x00,0x2f,0xfd,0x32,\r\n0xdc,0xed,0x30,0x31,0x25,0x17,0x07,0x06,0x06,0x23,0x23,0x2a,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x17,0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x05,0xcc,0x04,0x1c,0x51,0xb2,0x55,0x36,0x1c,0x5e,0x7b,0x95,0x52,0x82,0xc1,0x7f,0x3f,0x32,0x5a,0x7c,0x4a,0x3e,0x68,0x55,\r\n0x43,0x33,0x23,0x0b,0x9f,0x0b,0x2b,0x3f,0x53,0x34,0x20,0x43,0x38,0x24,0x20,0x42,0x66,0x47,0x30,0x52,0x99,0x06,0x84,0x0f,0x0e,0x05,0x2a,0x59,0x53,0x55,0x97,0x71,0x42,0x2d,0x4a,0x60,0x68,0x68,0x2c,0x36,0x6a,0x55,0x35,0x17,0x31,0x4c,0x35,0x24,0x28,0x13,0x03,0x01,0x00,0x02,0x00,0x73,0xff,0xed,0x0b,0xbf,0x02,0x6c,0x00,0x32,\r\n0x00,0x46,0x00,0x1c,0xb9,0x00,0x18,0x04,0xfb,0xb4,0x3d,0x42,0x11,0x09,0x00,0xb8,0x04,0xfb,0xb1,0x22,0x2c,0x00,0x2f,0x33,0xfd,0xcc,0x33,0x33,0xdc,0xed,0x30,0x31,0x25,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x26,0x26,0x27,\r\n0x23,0x06,0x06,0x23,0x21,0x22,0x26,0x27,0x27,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x07,0xab,0x2d,0x23,0x02,0x04,0x07,0x04,0x8a,0x0b,0x0e,0x04,0x03,0x0a,0x13,0x20,0x19,0x0f,0x2d,0x3d,0x4c,0x5b,0x6b,0x3d,0x45,0x65,0x43,0x20,0x36,0x78,0xc0,0x8a,0x7c,0xa4,0x24,0x11,0x21,\r\n0x0b,0x02,0x1e,0x53,0x2d,0xfa,0x41,0x55,0xb2,0x51,0x1c,0x05,0x09,0xab,0x4e,0x65,0x3c,0x17,0x18,0x29,0x37,0x1f,0x35,0x59,0x46,0x33,0x0f,0x0d,0x30,0x32,0x2d,0x99,0x2f,0x2d,0x0a,0x1d,0x21,0x22,0x0f,0x2a,0x4e,0x14,0x0d,0x18,0x13,0x0d,0x02,0x2c,0x68,0x67,0x60,0x4a,0x2c,0x3a,0x64,0x87,0x4d,0x63,0x6d,0x33,0x0a,0x05,0x0e,0x06,\r\n0x22,0x13,0x2a,0x1f,0x0e,0x0f,0x85,0x05,0x03,0x04,0x16,0x2f,0x2c,0x31,0x45,0x2d,0x15,0x36,0x55,0x6b,0x36,0x01,0x00,0x02,0x00,0x49,0xff,0xf0,0x08,0x3d,0x02,0x6c,0x00,0x1e,0x00,0x30,0x00,0x36,0xb4,0x1e,0x1f,0x1f,0x32,0x29,0xbb,0x05,0x0a,0x00,0x12,0x00,0x24,0x04,0xfb,0x40,0x0b,0x2f,0x17,0x01,0x17,0x2e,0x2e,0x1f,0x1f,0x1e,\r\n0x1e,0x00,0xb9,0x04,0xfb,0x00,0x07,0x00,0x2f,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x10,0xcd,0x30,0x31,0x25,0x32,0x36,0x37,0x07,0x06,0x06,0x23,0x21,0x22,0x06,0x22,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x17,0x23,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,\r\n0x02,0x33,0x32,0x36,0x06,0xfe,0x51,0x9c,0x52,0x21,0x23,0x80,0x55,0xfd,0x63,0x5c,0x8c,0x80,0x82,0x53,0x82,0xc1,0x7f,0x3f,0x32,0x5a,0x7c,0x4a,0x3e,0x68,0x55,0x43,0x33,0x23,0x0b,0x9f,0x0b,0x2a,0x40,0x54,0x33,0x20,0x43,0x38,0x24,0x20,0x42,0x66,0x47,0x30,0x53,0x99,0x08,0x0a,0xa9,0x05,0x0b,0x01,0x01,0x07,0x2a,0x5a,0x52,0x55,\r\n0x97,0x71,0x42,0x2d,0x4a,0x60,0x68,0x68,0x2c,0x36,0x6a,0x55,0x35,0x17,0x31,0x4c,0x35,0x24,0x28,0x13,0x03,0x01,0x00,0x01,0x00,0x46,0xfe,0xaa,0x02,0x1e,0x02,0x01,0x00,0x09,0x00,0x18,0x40,0x0a,0x00,0x06,0x06,0x0b,0x0a,0x09,0x2f,0x05,0x01,0x05,0x00,0x2f,0x5d,0xcd,0x11,0x12,0x01,0x39,0x2f,0xcd,0x31,0x30,0x01,0x0e,0x03,0x07,\r\n0x23,0x36,0x12,0x37,0x02,0x1e,0x2c,0x5a,0x56,0x51,0x23,0x88,0x46,0x9f,0x4f,0x02,0x01,0x5a,0xce,0xdb,0xe4,0x70,0xfb,0x01,0xb4,0xa8,0x00,0x02,0x00,0x32,0xfd,0xfe,0x04,0x2e,0x04,0x0c,0x00,0x45,0x00,0x58,0x00,0x6d,0xb2,0x45,0x26,0x13,0xb8,0x05,0x0a,0xb4,0x4b,0x4b,0x5a,0x2e,0x26,0xb8,0x05,0x0a,0xb3,0x09,0x05,0x05,0x3f,0xb8,\r\n0x05,0x0a,0xb7,0x2e,0x1b,0x23,0x55,0x09,0x04,0x18,0x0e,0xbc,0x04,0xfc,0x00,0x50,0x04,0xe6,0x00,0x00,0x04,0xfb,0xb5,0x42,0x2b,0x45,0x45,0x18,0x3a,0xb8,0x04,0xfb,0xb2,0x33,0x20,0x46,0xb8,0x04,0xfc,0x40,0x09,0x18,0x1f,0x1f,0x1f,0x18,0x2f,0x18,0x02,0x18,0x00,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x12,0x39,0x2f,0x39,\r\n0x39,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x39,0x2f,0x39,0xed,0x11,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x0e,0x03,0x15,0x14,0x16,0x17,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x37,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x15,0x16,0x16,0x03,0x5c,0xad,0xe9,0x8c,0x3b,0x08,0x07,0x05,0x3a,0x76,0x78,0x78,0x3d,0x4f,0x77,0x50,0x28,0x40,0x78,0xae,0x6e,0x6f,0xad,0x3f,0x03,0x10,0x1e,\r\n0x10,0x8c,0x1d,0x3b,0x1d,0x21,0x21,0x14,0x32,0x52,0x3f,0x4c,0x45,0x3d,0x72,0xa6,0x69,0x23,0x4f,0x2a,0x27,0x55,0x2b,0x36,0x65,0x4d,0x2f,0x37,0x33,0x51,0xd0,0x8a,0xfb,0x4b,0x72,0x4e,0x27,0x14,0x2c,0x45,0x30,0x2a,0x5c,0x62,0x6a,0x37,0x2d,0x86,0x01,0x9f,0x2e,0x68,0x73,0x7c,0x42,0x1d,0x33,0x1a,0x51,0x70,0x46,0x1f,0x2e,0x4f,\r\n0x68,0x39,0x49,0x87,0x69,0x3f,0x40,0x36,0x01,0x1b,0x39,0x20,0x3d,0x6b,0x30,0x36,0x78,0x40,0x2e,0x65,0x66,0x65,0x30,0x45,0xa3,0x4f,0x4c,0x8c,0x6a,0x40,0x08,0x09,0xaa,0x08,0x0b,0x15,0x34,0x57,0x43,0x48,0x71,0x28,0x2d,0x52,0x24,0xfc,0x55,0x26,0x3d,0x4d,0x26,0x1b,0x33,0x28,0x18,0x17,0x39,0x63,0x4c,0x02,0x2d,0x36,0x00,0x02,\r\n0xff,0xc9,0x06,0x37,0x02,0x29,0x07,0xeb,0x00,0x24,0x00,0x36,0x00,0x2e,0xbc,0x00,0x11,0x05,0x0d,0x00,0x2a,0x00,0x0c,0x05,0x01,0x40,0x09,0x2d,0x25,0x32,0x32,0x25,0x07,0x07,0x01,0x25,0xb8,0x05,0x01,0xb1,0x1f,0x16,0x00,0x2f,0xc6,0xfd,0xc4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd6,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x33,0x16,0x16,\r\n0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x16,0x32,0x32,0x17,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,0x20,0x46,0x71,\r\n0x51,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x01,0x44,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,0x1d,0x1b,0x07,0x56,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x04,0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x58,0x02,\r\n0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x01,0xff,0xe9,0x06,0x37,0x01,0xee,0x07,0xeb,0x00,0x2e,0x00,0x4a,0xb1,0x24,0x06,0xb8,0x05,0x0d,0xb4,0x00,0x27,0x27,0x09,0x1e,0xb8,0x05,0x0d,0x40,0x0b,0x18,0x1a,0x1a,0x18,0x09,0x24,0x09,0x0a,0x2e,0x2e,0x2c,0xb8,0x05,0x01,0xb5,0x03,0x09,0x23,0x23,0x1b,0x09,0xb8,0x05,\r\n0x01,0xb1,0x14,0x0a,0x00,0x2f,0xc6,0xfd,0xc4,0x33,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x11,0x12,0x39,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x39,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x17,\r\n0x1e,0x03,0x33,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0xbe,0x0e,0x1d,0x11,0x2e,0x40,0x92,0x48,0xcd,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x0a,0x51,0x06,0x09,0x02,0x02,0x08,0x12,0x20,0x1b,0x1d,0x12,0x17,0x1d,0x34,0x49,0x2c,0x20,0x22,0x07,0x7e,0x03,0x04,0x26,0x2c,0x5b,0x64,0x01,0x04,\r\n0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x27,0x18,0x2f,0x0b,0x0a,0x11,0x0c,0x06,0x1b,0x3b,0x1e,0x23,0x3b,0x2b,0x17,0x06,0x00,0x02,0x00,0x03,0x06,0x1f,0x02,0x20,0x08,0x00,0x00,0x1d,0x00,0x36,0x00,0x2c,0xbf,0x00,0x2e,0x05,0x0d,0x00,0x25,0x00,0x11,0x04,0xfd,0x00,0x18,0x00,0x20,0x04,0xfd,0x40,0x0a,0x33,0x1e,0x00,\r\n0x0c,0x14,0x1d,0x05,0x05,0x28,0x05,0x00,0x2f,0x2f,0x12,0x17,0x39,0x2f,0xfd,0xd4,0xed,0x01,0x2f,0xed,0x31,0x30,0x01,0x0e,0x03,0x07,0x23,0x3e,0x03,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x03,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,\r\n0x26,0x27,0x01,0x4a,0x49,0x5a,0x34,0x18,0x07,0x51,0x06,0x17,0x32,0x57,0x47,0x14,0x1c,0x1e,0x25,0x1c,0x18,0x2d,0x11,0x14,0x2e,0x17,0x2b,0x39,0x32,0x37,0x2b,0x65,0x38,0x26,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x0c,0x11,0x0c,0x06,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0x07,0x2f,0x12,0x29,0x2f,0x36,0x1e,0x1e,0x40,0x3f,0x3a,0x18,\r\n0x03,0x07,0x0e,0x0c,0x07,0x06,0x07,0x5f,0x06,0x07,0x15,0x1b,0x17,0x01,0xfe,0xee,0x11,0x17,0x29,0x37,0x21,0x3e,0x75,0x36,0x1d,0x3d,0x3e,0x3a,0x19,0x3c,0x5c,0x3e,0x20,0x09,0x0a,0x00,0x00,0x04,0xff,0x88,0x06,0x1f,0x02,0xb1,0x08,0xbb,0x00,0x24,0x00,0x36,0x00,0x4d,0x00,0x51,0x00,0x52,0xb2,0x41,0x45,0x4e,0xbb,0x05,0x0d,0x00,\r\n0x4f,0x00,0x45,0x05,0x0d,0xb2,0x3e,0x37,0x11,0xb8,0x05,0x0d,0xb3,0x2a,0x51,0x4e,0x0c,0xb8,0x05,0x01,0x40,0x09,0x2d,0x25,0x32,0x32,0x25,0x07,0x07,0x01,0x25,0xb8,0x05,0x01,0xb3,0x1f,0x16,0x41,0x39,0xb9,0x04,0xfd,0x00,0x4a,0x00,0x2f,0xfd,0xce,0xd4,0xce,0xfd,0xc4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd6,0xfd,0xd6,0xcd,0x01,0x2f,\r\n0xed,0x39,0x2f,0xed,0x2f,0xed,0x12,0x39,0x31,0x30,0x03,0x33,0x16,0x16,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x07,0x06,0x06,0x07,0x23,0x36,0x36,0x35,0x34,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x16,0x32,0x32,0x17,0x16,0x33,0x32,0x3e,0x02,\r\n0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0x23,0x35,0x33,0x58,0x51,0x06,0x09,0x02,0x04,0x13,0x1d,0x0c,0x2d,0x40,0x53,0x33,0x27,0x38,0x26,0x12,0x1e,0x42,0x69,0x4b,0x30,0x41,0x2c,0x1b,0x0c,0x03,0x05,0x0e,0x07,0x57,0x13,0x17,0x01,0x3c,0x2a,0x37,0x20,0x0d,0x30,0x22,0x1d,0x2f,0x26,0x1c,\r\n0x08,0x07,0x1a,0x1b,0x18,0xa0,0x36,0x28,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x17,0x18,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0x98,0x57,0x57,0x07,0x92,0x18,0x2f,0x0b,0x10,0x18,0x02,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x04,0x09,0x08,0x01,0x16,0x2b,0x11,0x33,0x63,0x33,0x2f,0x58,0x02,0x0e,0x1b,0x1a,\r\n0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x83,0x11,0x17,0x28,0x38,0x20,0x3f,0x74,0x37,0x39,0x7f,0x34,0x3c,0x5b,0x3e,0x20,0x09,0x0a,0x02,0x33,0x56,0x00,0x01,0xff,0xc4,0x06,0x71,0x02,0x22,0x07,0xb0,0x00,0x2a,0x00,0x31,0xb9,0x00,0x01,0x05,0x0d,0xb2,0x29,0x0c,0x1e,0xb8,0x05,0x0d,0xb5,0x1d,0x1e,0x18,0x15,0x15,0x24,0xb8,0x05,0x01,\r\n0xb5,0x06,0x14,0x14,0x11,0x06,0x00,0x00,0x2f,0x2f,0x33,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x02,\r\n0x22,0x1b,0x2b,0x38,0x1d,0x26,0x33,0x20,0x10,0x03,0x04,0x0b,0x22,0x35,0x4d,0x34,0x10,0x21,0x13,0x0c,0x17,0x2a,0x13,0x3f,0x4f,0x2d,0x10,0x59,0x04,0x0f,0x1c,0x18,0x10,0x1a,0x12,0x0a,0x07,0xb0,0xa7,0x2d,0x3b,0x23,0x0d,0x11,0x1f,0x2b,0x1a,0x19,0x2b,0x1f,0x12,0x02,0x02,0x66,0x02,0x02,0x15,0x29,0x3a,0x25,0x35,0x1b,0x28,0x19,\r\n0x0c,0x06,0x11,0x1e,0x17,0x8d,0x00,0x01,0x00,0xc4,0xfd,0xf6,0x01,0x42,0xff,0x7e,0x00,0x03,0x00,0x15,0xbd,0x00,0x00,0x05,0x0b,0x00,0x01,0x00,0x00,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x42,0x7e,0x7e,0xfd,0xf6,0x01,0x88,0x00,0x00,0x02,0xff,0xbf,0x06,0x73,0x01,0xca,0x08,0x2c,\r\n0x00,0x23,0x00,0x2f,0x00,0x35,0xb2,0x03,0x10,0x06,0xb8,0x05,0x0d,0xb5,0x24,0x00,0x00,0x24,0x14,0x2a,0xb8,0x05,0x0d,0xb3,0x10,0x03,0x23,0x1e,0xbc,0x04,0xfd,0x00,0x17,0x00,0x2d,0x04,0xfd,0x00,0x0b,0x00,0x2f,0xfd,0xd4,0xed,0x32,0x39,0x01,0x2f,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x06,0x06,0x07,0x16,\r\n0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x27,0x26,0x22,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x13,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x71,0x09,0x14,0x0b,0x39,0x48,0x1d,0x31,0x3e,0x21,0x26,0x3e,0x2c,0x18,0x17,0x1a,0x01,0x06,0x07,0x01,0x38,0x5c,\r\n0x32,0x12,0x30,0x66,0x3c,0x14,0x30,0x17,0x23,0x2d,0x39,0x3c,0x34,0x1d,0x1c,0x29,0x29,0x21,0x36,0x07,0xef,0x08,0x10,0x0b,0x1a,0x59,0x42,0x2a,0x3d,0x29,0x14,0x19,0x2b,0x3b,0x21,0x20,0x46,0x21,0x02,0x01,0x0f,0x0d,0x53,0x0e,0x0e,0x03,0x05,0x22,0x22,0xfe,0xec,0x2a,0x3a,0x10,0x1a,0x3d,0x1c,0x21,0x2d,0x23,0x00,0x01,0x00,0x32,\r\n0x06,0x71,0x01,0xd4,0x07,0xe3,0x00,0x1c,0x00,0x29,0xb2,0x11,0x11,0x13,0xb8,0x05,0x0d,0xb3,0x0d,0x0d,0x1d,0x03,0xb8,0x05,0x0d,0xb3,0x19,0x1c,0x11,0x16,0xb9,0x05,0x01,0x00,0x08,0x00,0x2f,0xfd,0xc6,0xc6,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0xc7,0x07,0x06,0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,0x05,0x58,0x09,0x30,0x3c,0x46,0x3c,0x07,0x06,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x36,0x29,0x40,0x4f,0x1a,0x3d,0x26,0x00,0xff,0xff,\r\n0xff,0xc6,0x06,0x7c,0x02,0x2c,0x08,0xde,0x01,0x07,0x0f,0x57,0x00,0x00,0x06,0x7c,0x00,0x15,0x40,0x0c,0x01,0x00,0x20,0x00,0x01,0x20,0x00,0x01,0x20,0x00,0x01,0x00,0x00,0x11,0x5d,0x5d,0x5d,0x35,0x35,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x03,0x4a,0x06,0x05,0x02,0x26,0x09,0x15,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xfe,0x29,\r\n0x00,0x0a,0xb4,0x01,0x2f,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x05,0x02,0x26,0x0e,0x2f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x1d,0xfe,0x29,0x00,0x0a,0xb4,0x01,0x2f,0x2b,0x01,0x2b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc2,0x04,0xaf,0x02,0x26,0x09,0x17,0x00,0x00,\r\n0x00,0x07,0x0a,0x6e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xaf,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x53,0xff,0xf2,0x05,0x32,0x06,0x40,0x02,0x26,0x0e,0x5c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0x01,0xfe,0x64,0xff,0xff,0x00,0x67,0xfd,0xff,0x05,0x58,\r\n0x05,0xaa,0x02,0x26,0x08,0xf2,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x73,0xfd,0xce,0x00,0x0a,0xb4,0x03,0x2f,0x56,0x01,0x56,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x87,0x06,0x40,0x02,0x26,0x0e,0x5b,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x56,0xfe,0x64,0x00,0x0a,0xb4,0x03,0x2f,0x57,0x01,0x57,0x00,0x11,0x5d,0x35,\r\n0xff,0xff,0xff,0xba,0xfd,0xff,0x04,0x02,0x05,0xaa,0x02,0x26,0x0e,0x5d,0x00,0x00,0x01,0x07,0x0a,0x6e,0x01,0x1d,0xfd,0xce,0x00,0x0a,0xb4,0x03,0x2f,0x4d,0x01,0x4d,0x00,0x11,0x5d,0x35,0x00,0x06,0xfe,0x93,0xfe,0x64,0x01,0x6d,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x1f,0x00,0x29,0x00,0x32,0x00,0x57,0xbc,0x00,0x20,0x05,\r\n0x0a,0x00,0x25,0x00,0x2f,0x05,0x0a,0xb2,0x2a,0x2a,0x16,0xbb,0x05,0x0a,0x00,0x1a,0x00,0x12,0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x31,0x10,0xb8,0x04,0xfc,0xb5,0x2c,0x12,0x0b,0x23,0x18,0x02,0xb8,0x04,0xfc,0xb6,0x27,0x1d,0x14,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0x33,0x33,0x33,0xed,0x32,0x32,0xd4,0x32,\r\n0x32,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0xed,0x39,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x14,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x16,0x17,0x14,0x23,\r\n0x22,0x26,0x35,0x34,0x33,0x32,0x01,0x6d,0x41,0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xbb,0x43,0x44,0x28,0x1c,0x1c,0x27,0xb6,0x28,0x1b,0x42,0x42,0x1c,0x27,0x5a,0x41,0x1c,0x28,0x44,0x41,0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x44,0x41,0x41,0x1c,0x28,0x28,0x1c,0x1b,0x26,0x41,\r\n0x44,0x28,0xd4,0x44,0x28,0x1c,0x41,0x00,0x00,0x04,0xfe,0xa9,0xfe,0x64,0x01,0x54,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x19,0x00,0x47,0xbc,0x00,0x16,0x05,0x0c,0x00,0x17,0x00,0x12,0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x12,0x0b,0xbb,0x04,0xfc,0x00,0x10,0x00,0x02,0x04,0xfc,0xb4,0x07,0x15,0x07,\r\n0x07,0x16,0xb8,0x04,0xfd,0xb4,0x14,0x2f,0x19,0x01,0x19,0x00,0x2f,0x5d,0x33,0xed,0x33,0x11,0x33,0x10,0xfd,0xd6,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x21,0x35,0x21,0x01,0x54,0x41,\r\n0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xbb,0xfe,0xf4,0x01,0x0c,0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x52,0x52,0x00,0x04,0xfe,0x91,0xfe,0x64,0x01,0x71,0xff,0xa4,0x00,0x08,0x00,0x11,0x00,0x15,0x00,0x1d,0x00,0x59,0xb9,0x00,0x18,0x05,0x0d,0xb4,0x19,0x19,0x1e,0x1b,0x12,0xb8,\r\n0x05,0x0d,0xb2,0x13,0x09,0x00,0xb8,0x05,0x0a,0xb3,0x0e,0x04,0x1a,0x16,0xb8,0x04,0xfd,0xb2,0x1d,0x15,0x02,0xb8,0x04,0xfc,0xb2,0x07,0x07,0x18,0xb8,0x04,0xfe,0xb6,0x14,0x2f,0x1d,0x01,0x1d,0x12,0x0b,0xb8,0x04,0xfc,0xb3,0x2f,0x10,0x01,0x10,0x00,0x2f,0x5d,0xed,0x32,0x2f,0x5d,0x33,0xe4,0x33,0x10,0xed,0x33,0x10,0xed,0x32,0x01,\r\n0x2f,0x33,0xed,0x32,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x14,0x23,0x22,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x23,0x22,0x26,0x35,0x34,0x33,0x32,0x07,0x23,0x11,0x33,0x07,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x01,0x71,0x41,0x44,0x28,0x1c,0x41,0x41,0x1c,0x28,0x44,0x41,0xe4,0x5c,0x5c,0xba,0x73,0x5c,0x73,0x01,0x42,\r\n0xa0,0x41,0x41,0x1c,0x28,0xfc,0x44,0x28,0x1c,0x41,0x85,0x01,0x40,0x54,0x85,0x85,0x54,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x08,0x0e,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0x00,0x32,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x07,0x67,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,\r\n0x06,0xb7,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x08,0x7f,0x02,0x26,0x09,0x3f,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x9c,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x2a,0x01,0x2a,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x05,0xec,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x4a,\r\n0xfd,0xce,0xff,0xff,0x00,0xa1,0xff,0xf2,0x09,0x4b,0x08,0x36,0x00,0x26,0x09,0x71,0x00,0x00,0x00,0x07,0x09,0x0d,0x08,0x04,0x00,0x00,0x00,0x05,0x00,0x9b,0xfd,0xff,0x0b,0x15,0x05,0xec,0x00,0x1d,0x00,0x37,0x00,0x52,0x00,0x56,0x00,0x5a,0x00,0xb2,0xb2,0x44,0x1a,0x4a,0xb8,0x05,0x0a,0xb2,0x3f,0x38,0x24,0xba,0x05,0x0a,0x00,0x58,\r\n0x05,0x0a,0xb6,0x21,0x57,0x57,0x21,0x54,0x54,0x53,0x41,0x09,0x05,0x0a,0x00,0x33,0x05,0x0a,0x00,0x30,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x03,0x05,0x0a,0x40,0x17,0x1a,0x3f,0x21,0x30,0x0d,0x1a,0x1a,0x0d,0x30,0x21,0x3f,0x05,0x5c,0x5b,0x5a,0x5a,0x08,0x55,0x55,0x08,0x08,0x59,0x56,0xb8,0x04,0xfb,0x40,0x0b,0x58,0x53,0x53,0x54,\r\n0x54,0x15,0x15,0x57,0x57,0x38,0x3a,0xb8,0x04,0xfb,0x40,0x0b,0x52,0x1f,0x4f,0x2f,0x4f,0x02,0x4f,0x44,0x33,0x32,0x1e,0xba,0x04,0xfb,0x00,0x29,0x05,0x03,0xb2,0x23,0x0e,0x00,0x00,0x2f,0x2f,0x2f,0x3f,0xed,0x2f,0x2f,0x2f,0x2f,0x5d,0x33,0xed,0x32,0x32,0x2f,0x32,0x2f,0x33,0x2f,0x32,0x2f,0x33,0xed,0x32,0x32,0x2f,0x33,0x2f,0x11,\r\n0x33,0x2f,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0xe4,0x33,0x2f,0x11,0x33,0x2f,0x10,0xe4,0xed,0x39,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x32,0x36,0x35,\r\n0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x4e,0x0b,0x0b,0x24,0x4e,0x7d,0x59,0x67,0x93,0x5d,0x2b,0x9c,0x38,0x81,0xd4,0x9d,\r\n0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x06,0x96,0x5d,0x5b,0x9c,0x37,0x5f,0x7e,0x47,0x44,0x65,0x48,0x2d,0x1a,0x0a,0x9c,0x09,0x23,0x45,0x01,0x67,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1a,0x28,0x1c,0x0f,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0xfe,0x48,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0xa6,0x48,0x7a,0x37,0x5f,0x84,\r\n0x51,0x24,0x31,0x6e,0xb3,0x81,0x04,0xc4,0xfb,0x28,0x8f,0xe4,0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0xfe,0xeb,0x68,0x70,0x01,0xa6,0xfe,0x53,0x6b,0x90,0x58,0x25,0x21,0x39,0x4c,0x57,0x5e,0x2e,0x04,0x79,0xfb,0xc2,0x40,0x69,0x4b,0x29,0xfe,0x40,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x41,0x8e,0x8f,0x8b,0x3e,\r\n0x8a,0xd4,0x90,0x4a,0x16,0x17,0x79,0xb5,0xb5,0xb5,0x00,0x02,0xff,0xd4,0x05,0x20,0x02,0x33,0x06,0xf2,0x00,0x2f,0x00,0x33,0x00,0x62,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb7,0x12,0x15,0x15,0x12,0x0a,\r\n0x29,0x06,0x31,0xb8,0x04,0xfd,0xb6,0x32,0x15,0x23,0x23,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0xdc,0x32,0x11,0x33,0xde,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,\r\n0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xbc,\r\n0x58,0x00,0x00,0x03,0xff,0xd4,0x05,0x20,0x02,0x33,0x07,0xfd,0x00,0x2f,0x00,0x53,0x00,0x61,0x00,0x85,0xb9,0x00,0x54,0x05,0x0d,0xb3,0x4d,0x00,0x00,0x03,0xb8,0x05,0x0d,0xb4,0x2c,0x2f,0x2f,0x2c,0x43,0xb8,0x05,0x0d,0x40,0x09,0x0a,0x41,0x1f,0x5c,0x5c,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,\r\n0xb8,0x05,0x0b,0xb4,0x12,0x15,0x15,0x12,0x48,0xb8,0x04,0xfd,0xb3,0x57,0x50,0x5f,0x3d,0xb8,0x04,0xfd,0x40,0x0a,0x36,0x33,0x33,0x36,0x15,0x00,0x23,0x0a,0x0d,0x06,0xb8,0x04,0xfd,0xb1,0x1c,0x29,0x00,0x2f,0x33,0xed,0x32,0x39,0xde,0x32,0x32,0xce,0x32,0x2f,0x10,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,\r\n0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x12,0x39,0x39,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,\r\n0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x5a,0x17,0x28,0x11,0x18,0x2f,0x14,0x3c,0x65,0x31,0x12,0x33,0x5a,0x39,0x01,0x0b,0x06,0x01,0x34,0x1e,0x31,0x3e,0x21,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,\r\n0x18,0x0f,0x23,0x1a,0x30,0x3a,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x1d,0x11,0x22,0x11,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x40,0x40,0x24,0x39,0x27,0x14,0x14,\r\n0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x1a,0x10,0x1a,0x3a,0x1a,0x0e,0x36,0x00,0x00,0x02,0xff,0xd4,0x05,0x28,0x02,0x33,0x06,0xfc,0x00,0x2f,0x00,0x33,0x00,0x63,0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,\r\n0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0d,0x12,0x15,0x15,0x12,0x0a,0x29,0x06,0x15,0x22,0x22,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb2,0x0d,0x06,0x31,0xb9,0x04,0xfd,0x00,0x32,0x00,0x2f,0xfd,0xd6,0x32,0xfd,0x32,0xcc,0x32,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,\r\n0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,\r\n0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x06,0xfc,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,\r\n0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xfe,0x84,0x58,0x00,0x00,0x03,0xff,0x6c,0x05,0x20,0x02,0x33,0x07,0xfd,0x00,0x2f,0x00,0x54,0x00,0x62,0x00,0x8b,0xb2,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb7,0x12,0x15,0x15,0x12,0x12,0x63,0x3b,0x55,0xb8,0x05,0x0d,0xb4,0x4e,0x3b,0x00,0x00,0x03,0xb8,0x05,0x0d,0xb4,0x2c,\r\n0x2f,0x2f,0x2c,0x44,0xb8,0x05,0x0d,0x40,0x09,0x0a,0x42,0x1f,0x5d,0x5d,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0x40,0x0a,0x1f,0x22,0x22,0x1f,0x3c,0x60,0x39,0x03,0x36,0x49,0xbb,0x04,0xfd,0x00,0x58,0x00,0x3f,0x04,0xfd,0xb6,0x36,0x16,0x00,0x22,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd4,0x32,\r\n0x32,0xd6,0xfd,0xd4,0xed,0x11,0x17,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x12,0x39,0x39,0xed,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,\r\n0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x5a,0x17,0x28,0x11,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,\r\n0x10,0x0f,0x01,0x36,0x1e,0x31,0x3f,0x20,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,0x2f,0x3b,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,\r\n0x2c,0x0d,0x1d,0x11,0x22,0x11,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x42,0x41,0x24,0x38,0x27,0x14,0x14,0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x19,0x11,0x1b,0x38,0x1b,0x0e,0x35,0x00,0x00,0x03,0xff,0xd4,0x05,0x28,0x02,0x33,0x07,0xab,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6b,\r\n0xb2,0x00,0x00,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,0xb8,0x05,0x0d,0xb6,0x1f,0x22,0x22,0x1f,0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0d,0x12,0x15,0x15,0x12,0x0a,0x29,0x06,0x15,0x23,0x23,0x00,0x1c,0x29,0xb8,0x04,0xfd,0xb2,0x0d,0x06,0x31,0xbc,0x04,0xfd,0x00,0x32,0x00,0x35,0x04,0xfd,0x00,\r\n0x36,0x00,0x2f,0xfd,0xd6,0xfd,0xd6,0x32,0xfd,0x32,0xcc,0x32,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,\r\n0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,\r\n0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x07,0xab,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0xfe,0x84,0x58,0x57,0x58,0x00,0x00,0x04,0x00,0x35,\r\n0xfd,0xf6,0x03,0xf2,0x05,0x28,0x00,0x27,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x58,0xbc,0x00,0x14,0x05,0x0a,0x00,0x28,0x00,0x3e,0x05,0x0b,0xb2,0x3f,0x3f,0x3a,0xbb,0x05,0x0c,0x00,0x3b,0x00,0x32,0x05,0x0a,0x40,0x0b,0x05,0x28,0x3b,0x05,0x05,0x3b,0x28,0x03,0x43,0x42,0x3a,0xb8,0x04,0xfb,0xb4,0x3d,0x3f,0x40,0x37,0x24,0xbd,0x04,\r\n0xfb,0x00,0x1b,0x05,0x03,0x00,0x2d,0x04,0xfb,0x00,0x0c,0x00,0x2f,0xed,0x3f,0xed,0x32,0xd6,0xcd,0x2f,0xed,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x31,0x30,0x25,0x2e,0x03,0x35,0x34,0x3e,0x04,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,\r\n0x16,0x33,0x32,0x36,0x37,0x25,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x03,0x23,0x11,0x33,0x02,0x4e,0x49,0x60,0x38,0x16,0x15,0x28,0x3a,0x47,0x54,0x2f,0x45,0x75,0x38,0x14,0x26,0x1d,0x11,0x3c,0x64,0x82,0x8e,0x8f,0x3e,0x39,0x52,0x41,0x36,0x1e,0x20,0x51,0x9e,0x47,0x49,0x77,\r\n0x21,0x01,0x09,0x22,0x38,0x4a,0x27,0x1d,0x37,0x2b,0x1b,0x18,0x42,0x73,0x5a,0x21,0x1d,0xab,0xc9,0xc9,0x23,0x7e,0x7e,0x9e,0x1d,0x45,0x4c,0x52,0x2b,0x2e,0x60,0x5b,0x50,0x3d,0x23,0x51,0x58,0x20,0x4a,0x54,0x5d,0x32,0x5e,0x82,0x56,0x30,0x17,0x05,0x02,0x04,0x06,0x04,0xa7,0x0a,0x08,0x07,0x04,0xc6,0x33,0x78,0x66,0x44,0x26,0x3c,\r\n0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x17,0x52,0x03,0x36,0xbd,0xf8,0xce,0x01,0x88,0x00,0x03,0x00,0x65,0xff,0xea,0x03,0x9d,0x03,0x6c,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3a,0xb9,0x00,0x21,0x05,0x0c,0xb4,0x13,0x1b,0x1b,0x24,0x15,0xbb,0x05,0x0c,0x00,0x0f,0x00,0x09,0x05,0x0c,0xb2,0x03,0x1e,0x12,0xbe,0x04,0xfe,0x00,0x18,0x00,\r\n0x0c,0x05,0x03,0x00,0x00,0x04,0xfe,0x00,0x06,0x00,0x2f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0xd4,0xed,0x11,0x33,0x2f,0xc4,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x02,0x00,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0xfd,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0xfd,0x79,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x02,0x8e,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfd,0x5c,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0xff,0xe7,0x06,0x7c,0x02,0x1f,0x06,0xe8,\r\n0x00,0x03,0x00,0x15,0xb2,0x01,0x00,0x02,0xb8,0x04,0xfd,0xb3,0x2f,0x01,0x01,0x01,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xcd,0x31,0x30,0x03,0x21,0x15,0x21,0x19,0x02,0x38,0xfd,0xc8,0x06,0xe8,0x6c,0x00,0x00,0x01,0xff,0xdf,0x06,0x7c,0x02,0x28,0x07,0xdc,0x00,0x06,0x00,0x15,0xb7,0x03,0x01,0x05,0x01,0x04,0x02,0x03,0x00,0x00,0x2f,0x32,\r\n0xcd,0x32,0x01,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x03,0x33,0x17,0x37,0x33,0x03,0xcb,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x06,0x7c,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x01,0xff,0xdf,0x06,0x7c,0x02,0x28,0x07,0xdc,0x00,0x06,0x00,0x15,0xb7,0x03,0x01,0x05,0x01,0x03,0x00,0x04,0x02,0x00,0x2f,0x33,0xcd,0x32,0x01,0x2f,0x2f,0x12,\r\n0x39,0x31,0x30,0x01,0x13,0x23,0x27,0x07,0x23,0x13,0x01,0x3c,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x07,0xdc,0xfe,0xa0,0xff,0xff,0x01,0x60,0x00,0x01,0x00,0x97,0xfe,0x92,0x01,0x6e,0xff,0x69,0x00,0x0b,0x00,0x15,0xbd,0x00,0x06,0x05,0x0c,0x00,0x00,0x00,0x09,0x04,0xfe,0x00,0x03,0x00,0x2f,0xed,0x01,0x10,0xed,0x31,0x30,0x13,0x34,0x36,\r\n0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x97,0x3d,0x2f,0x2f,0x3c,0x3c,0x2f,0x2f,0x3d,0xfe,0xfe,0x2f,0x3c,0x3c,0x2f,0x2f,0x3d,0x3d,0x00,0x00,0x02,0x00,0x3d,0x06,0x55,0x02,0x48,0x08,0x0e,0x00,0x23,0x00,0x2f,0x00,0x39,0xb4,0x14,0x2a,0x03,0x06,0x10,0xb8,0x05,0x0d,0xb3,0x2a,0x00,0x00,0x24,0xbb,0x05,0x0d,0x00,0x06,0x00,\r\n0x0b,0x04,0xfd,0xb3,0x2d,0x03,0x27,0x17,0xb8,0x04,0xfd,0xb3,0x20,0x1e,0x01,0x1e,0x00,0x2f,0x5d,0xfd,0x32,0x39,0xd4,0xed,0x01,0x2f,0xed,0x32,0x2f,0x2f,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x13,0x36,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x17,0x16,0x32,0x33,0x32,0x36,0x37,0x17,0x06,\r\n0x06,0x23,0x22,0x26,0x27,0x06,0x07,0x03,0x14,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x96,0x09,0x14,0x0b,0x39,0x48,0x1d,0x31,0x3e,0x21,0x26,0x3e,0x2c,0x18,0x17,0x1a,0x01,0x06,0x07,0x01,0x38,0x5c,0x32,0x12,0x30,0x66,0x3c,0x14,0x30,0x17,0x23,0x2d,0x39,0x3c,0x34,0x1d,0x1c,0x29,0x29,0x21,0x36,0x06,0x92,0x08,0x10,\r\n0x0b,0x1a,0x59,0x42,0x2a,0x3d,0x29,0x14,0x19,0x2b,0x3b,0x21,0x20,0x46,0x21,0x02,0x01,0x0f,0x0d,0x53,0x0e,0x0e,0x03,0x05,0x22,0x22,0x01,0x14,0x2a,0x3a,0x10,0x1a,0x3d,0x1c,0x21,0x2d,0x23,0x00,0x00,0x03,0x00,0x05,0x06,0x67,0x02,0x01,0x08,0x31,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x34,0xb9,0x00,0x08,0x05,0x0a,0xb3,0x00,0x09,\r\n0x01,0x04,0xb8,0x05,0x0a,0x40,0x0f,0x05,0x02,0x01,0x03,0x00,0x01,0x00,0x04,0x0b,0x08,0x07,0x20,0x04,0x01,0x04,0x00,0x2f,0x5d,0xdd,0xd4,0xcd,0x11,0x39,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x32,0x2f,0x33,0xed,0x31,0x30,0x13,0x01,0x15,0x01,0x25,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xa1,\r\n0xa1,0xfe,0xa5,0xa1,0xa1,0x06,0xd3,0x01,0x5e,0x6c,0xfe,0xa2,0x01,0x9d,0x8f,0x9d,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x55,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x22,0x03,0x0f,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x55,0x00,0x83,0xfe,0xab,\r\n0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x05,0xca,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,\r\n0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,\r\n0x00,0x27,0x0f,0x53,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x83,0xfd,0xce,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0xb2,0x02,0x26,0x09,0x3e,0x00,0x00,\r\n0x00,0x27,0x0f,0x51,0x02,0xad,0xfe,0xab,0x00,0x07,0x0f,0x50,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x81,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x83,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0x13,0x06,0x9f,0x03,0x0f,0x02,0x26,0x09,0x3e,0x00,0x00,\r\n0x01,0x07,0x0a,0x6e,0x02,0xad,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x2a,0x01,0x2a,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0x13,0x02,0xab,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0x83,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,\r\n0x05,0x5a,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0xad,0xfd,0x7e,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0xfd,0x7e,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xda,0x02,0x26,0x09,0x13,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x2a,\r\n0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xda,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x04,0x61,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x03,0xb1,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x03,0x54,0x00,0x31,0x00,0x35,0x00,0x39,\r\n0x00,0x3d,0x00,0x75,0xb9,0x00,0x3a,0x05,0x0a,0xb2,0x3b,0x3b,0x33,0xb8,0x05,0x0a,0xb3,0x32,0x1d,0x32,0x37,0xb8,0x05,0x0a,0xb7,0x36,0x32,0x36,0x32,0x36,0x3f,0x26,0x05,0xbb,0x05,0x0a,0x00,0x16,0x00,0x3c,0x04,0xfb,0xb5,0x2f,0x3b,0x01,0x3b,0x38,0x34,0xbb,0x04,0xfb,0x00,0x36,0x00,0x33,0x04,0xe6,0xb5,0x00,0x1d,0x31,0x03,0x11,\r\n0x23,0xb8,0x04,0xff,0xb2,0x2a,0x0d,0x0a,0xb8,0x04,0xfc,0xb6,0x0e,0x1f,0x11,0x2f,0x11,0x02,0x11,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0x33,0xed,0x32,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x04,0x06,0x06,0x15,0x14,\r\n0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,\r\n0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xf7,0xb5,0xb5,0xfe,0xbe,0xb5,0xb5,0xa1,0xb5,0xb5,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,\r\n0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x44,0xb3,0xb3,0xb3,0x01,0xc1,0xb3,0x00,0x05,0x00,0x7e,0xfd,0xff,0x05,0x58,0x03,0x54,0x00,0x0d,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x8b,0xb1,0x2b,0x40,0xbb,0x05,0x0a,0x00,0x1b,0x00,0x00,0x05,0x0b,0xb4,0x0b,0x41,0x41,0x0b,0x49,\r\n0xb8,0x05,0x0a,0xb2,0x48,0x48,0x45,0xb8,0x05,0x0a,0xb7,0x44,0x0b,0x44,0x0b,0x44,0x4d,0x34,0x13,0xbb,0x05,0x0a,0x00,0x24,0x00,0x4a,0x04,0xfb,0xb5,0x2f,0x49,0x01,0x49,0x46,0x42,0xbb,0x04,0xfb,0x00,0x44,0x00,0x41,0x04,0xe6,0xb5,0x0e,0x2b,0x3f,0x03,0x1f,0x31,0xb8,0x04,0xff,0xb2,0x38,0x1b,0x18,0xb8,0x04,0xfc,0xb7,0x1c,0x1f,\r\n0x1f,0x2f,0x1f,0x02,0x1f,0x03,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x3f,0x33,0xed,0x32,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x11,0x33,0x2f,0x10,0xed,0x39,0xe6,0x32,0x31,0x30,0x01,0x16,0x16,0x33,0x33,0x15,0x23,\r\n0x22,0x2e,0x02,0x27,0x36,0x36,0x27,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x13,0x33,0x15,0x23,0x04,0x57,0x06,0x74,0x68,0x1f,\r\n0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x2b,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xf7,0xb5,0xb5,0xfe,0xbe,0xb5,0xb5,0xa1,0xb5,0xb5,0x01,\r\n0x56,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0xb3,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x44,0xb3,0xb3,0xb3,0x01,0xc1,0xb3,0xff,0xff,0xff,0xba,\r\n0xfd,0xc9,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x03,0x4a,0x07,0x0f,0x02,0x26,0x09,0x15,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x07,0x0f,0x57,0x00,0xab,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0x13,0x03,0x4a,0x03,0xba,0x02,0x26,\r\n0x09,0x15,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x20,0x01,0x20,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x4e,0x02,0x5e,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x5c,0x00,0xc0,0xfc,0xfa,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,\r\n0x00,0x07,0x0f,0x56,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x05,0xa3,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,\r\n0x05,0x20,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x04,0xe4,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0xb2,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x04,0x02,\r\n0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xbb,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x06,0x38,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,\r\n0x00,0x07,0x0f,0x54,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0x04,0x02,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x06,0xbb,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0xe4,0x04,0xf3,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,\r\n0x06,0x38,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x70,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x3c,0x05,0xfc,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x1d,0x04,0x34,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0xca,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x04,0x02,\r\n0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x51,0x05,0x10,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,\r\n0x00,0x07,0x0f,0x51,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x4b,0x03,0x62,0x02,0x26,0x09,0xc8,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x10,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0e,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,\r\n0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0e,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0xb3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x90,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,\r\n0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x07,0xcb,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x07,0xcb,0x02,0x26,0x08,0xed,0x00,0x00,\r\n0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xcb,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,\r\n0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x04,0x79,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,\r\n0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0xf4,0x04,0x79,0x02,0x26,0x08,0xef,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0xf4,0x02,0xb9,0x02,0x26,0x09,0x26,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0xf4,0x02,0xaf,0x02,0x26,0x08,0xef,0x00,0x00,\r\n0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xfb,0x04,0xa6,0x04,0xb2,0x02,0x27,0x09,0x5f,0x00,0x00,0x01,0x56,0x00,0x27,0x0f,0x50,0x01,0x9f,0x04,0x02,0x00,0x07,0x0f,0x51,0x01,0x9f,0xfe,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x48,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,\r\n0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x06,0x64,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x07,0x0f,0x57,0x01,0x9f,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x07,0xba,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,\r\n0x04,0x02,0x01,0x07,0x0f,0x57,0x00,0x72,0x05,0x58,0x00,0x0a,0xb4,0x01,0x20,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x05,0x63,0x02,0x26,0x09,0x5f,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x01,0x07,0x0a,0x6d,0x01,0x9f,0xfd,0x87,0x00,0x0a,0xb4,0x01,0x20,0x22,0x01,0x22,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x06,0xb9,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0a,0x6d,0x00,0x9c,0xfe,0xdd,0x00,0x13,0x40,0x0a,0x02,0x2f,0x1c,0x01,0x1c,0x01,0x20,0x19,0x01,0x19,0x00,0x11,0x5d,0x35,0x11,0x5d,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x51,\r\n0x05,0xec,0x02,0x26,0x09,0x25,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0xc3,0x00,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0xc3,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xa5,0x05,0xec,0x02,0x26,0x08,0xee,0x00,0x00,0x00,0x06,0x0f,0x5c,0x17,0x00,0xff,0xff,\r\n0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x02,0x26,0x09,0x3f,0x00,0x00,0x00,0x06,0x0f,0x5c,0x17,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x1f,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x04,0xbc,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x07,0x09,0x7e,\r\n0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x1f,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0f,0x52,0x05,0x46,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x1f,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x84,0x05,0x76,0x02,0x06,\r\n0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xa6,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8c,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x5c,0x02,0x18,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0xad,0x05,0xec,0x00,0x26,0x0f,0x65,0x00,0x00,0x00,0x27,0x0f,0x8d,0x02,0xac,0x00,0x00,0x00,0x07,0x0f,0x5c,\r\n0x02,0x18,0x00,0x00,0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x00,0x00,0x0a,0x00,0x15,0x40,0x09,0x03,0x91,0x08,0x00,0x05,0x05,0x01,0x7e,0x00,0x2f,0xf1,0xc2,0x2f,0x00,0x2f,0xd4,0xed,0x31,0x30,0x23,0x33,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0xe6,0xa8,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0xd3,0x1d,0xa0,0x14,0xc5,\r\n0x00,0x01,0xff,0x1a,0xfe,0x96,0x00,0xe6,0x00,0x35,0x00,0x0a,0x00,0x12,0xb7,0x08,0x91,0x03,0x0a,0x00,0x7e,0x0a,0x06,0x2f,0xd6,0xe1,0x00,0x2f,0xd4,0xed,0x31,0x30,0x37,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0xe6,0xb3,0x9f,0x42,0x38,0x33,0x3f,0xb2,0x35,0xbd,0xe2,0x14,0xa0,0x1d,0x01,0x08,0x00,0x00,0x01,0x01,0x9f,\r\n0xfe,0x80,0x02,0x60,0x00,0x98,0x00,0x05,0x00,0x18,0xb9,0x00,0x01,0x01,0x2c,0xb5,0x04,0x00,0x91,0x05,0x22,0x03,0xb8,0x01,0x30,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0x9f,0xc1,0x9b,0x26,0x98,0xfd,0xe8,0x01,0x80,0x00,0x01,0x01,0xb3,0xfe,0x8a,0x02,0x4d,0x00,0x8b,0x00,0x05,0x00,0x18,\r\n0xb9,0x00,0x01,0x01,0x2c,0xb5,0x04,0x00,0x95,0x05,0x22,0x03,0xb8,0x01,0x31,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x33,0x11,0x23,0x11,0x23,0x01,0xb3,0x9a,0x8f,0x0b,0x8b,0xfd,0xff,0x01,0x76,0x00,0x01,0x00,0x14,0x00,0x8b,0x02,0xe8,0x05,0x30,0x00,0x1d,0x00,0x30,0x40,0x17,0x17,0xb1,0x0c,0x00,0xb1,0x05,0x0c,0x05,\r\n0x0c,0x05,0x04,0x01,0x01,0x1f,0x11,0x04,0x0f,0xbe,0x14,0x00,0x04,0xbe,0x03,0x00,0x2f,0xed,0x32,0x2f,0xed,0x01,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,0x15,0x21,0x35,0x33,0x34,0x37,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x07,0x06,0x07,0x06,0x01,0x89,0x01,0x2f,0xfd,0x5c,0xd2,0x26,0x26,0x6e,0x6a,0x38,0x97,0x7e,0x8f,0x82,0x84,0x9c,0xc2,0xea,0x4f,0x81,0x50,0x20,0x1f,0x01,0x20,0x95,0x95,0x84,0x50,0x51,0x6c,0x69,0x6e,0x3e,0x5f,0x80,0x4c,0x97,0x40,0xc8,0x98,0x5b,0x9f,0x7b,0x4d,0x42,0x40,0x00,0x00,0x03,0x00,0x1c,0x00,0x00,0x04,0x2f,0x05,0x9a,\r\n0x00,0x13,0x00,0x1f,0x00,0x27,0x00,0x84,0x40,0x0b,0x0c,0x19,0x10,0x06,0x0b,0x0d,0x06,0x4c,0x10,0x7d,0x1d,0xb8,0xff,0xf0,0x40,0x42,0x0b,0x0d,0x06,0x4c,0x1d,0x1d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x7d,0x25,0x08,0x0b,0x0c,0x06,0x4c,0x7f,0x25,0x01,0x25,0x25,0x29,0x00,0x29,0x40,0x0b,0x00,0x4d,0x21,0x17,0x17,0x15,0x19,0x7e,0x00,\r\n0x04,0x00,0x02,0x02,0x00,0x0c,0x14,0x91,0x21,0x18,0x01,0x91,0x04,0x15,0x04,0x21,0x04,0x21,0x04,0x19,0x20,0x91,0x05,0x03,0x19,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x39,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x2f,0x32,0x2b,0x11,0x12,0x39,0x2f,0x5d,\r\n0x2b,0xe9,0x2b,0x39,0x2f,0x2b,0xe9,0x2b,0x11,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x03,0x15,0x33,0x15,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0xbc,0xa0,0xa0,0x01,0x98,0xba,0xda,0x84,0x74,0x91,0xae,0xfe,\r\n0xf8,0xc9,0xfa,0xfc,0xfc,0xe4,0x94,0xa3,0xfe,0xa6,0xc1,0xac,0x8a,0x9e,0xfe,0xed,0x01,0x4f,0x98,0x03,0xb3,0xb6,0x92,0x7a,0xb4,0x26,0x04,0x11,0xb9,0x94,0xb8,0xe4,0x02,0x9c,0xb5,0x98,0xb7,0x8c,0x7a,0xfe,0x02,0x66,0xfe,0x31,0x85,0x79,0xd1,0x00,0x00,0x02,0x00,0x1e,0xff,0xe8,0x05,0x61,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x41,\r\n0x40,0x21,0x12,0x10,0x10,0x0e,0x7e,0x16,0x0d,0x0d,0x1b,0x17,0x0a,0x7e,0x09,0x07,0x07,0x05,0x09,0x0d,0x03,0x17,0x12,0x06,0x91,0x0f,0x0b,0x07,0x07,0x09,0x03,0x13,0x91,0x02,0x12,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x3f,0x01,0x2f,0x33,0x33,0x2f,0x10,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x32,0x31,\r\n0x30,0x01,0x10,0x21,0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x01,0x20,0x11,0x35,0x21,0x15,0x10,0x04,0xd5,0xfd,0xdf,0xfd,0xf6,0x8c,0x8c,0xa8,0x02,0xdb,0xa8,0x8c,0x8c,0xfd,0xf1,0x01,0x67,0xfd,0x25,0x02,0x44,0xfd,0xa4,0x02,0x45,0x57,0x98,0x02,0x7e,0xfd,0x82,0x02,0x7e,0xfd,0x82,0x98,\r\n0xfd,0xfb,0x01,0xaa,0x5b,0x4c,0xfe,0x47,0xff,0xff,0x00,0x18,0x00,0x00,0x04,0xef,0x05,0x9a,0x00,0x06,0x01,0xb0,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x70,0x03,0xb4,0x05,0xf8,0x02,0x26,0x00,0x28,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x1b,0x00,0x5e,0x00,0x1b,0x40,0x14,0x20,0x0e,0x30,0x0e,0x02,0x20,0x0d,0x30,0x0d,0x02,0x0f,0x0f,\r\n0x1f,0x0f,0x02,0x0f,0x0c,0x1f,0x0c,0x02,0x00,0x5d,0x5d,0x5d,0x5d,0x00,0xff,0xff,0x00,0x60,0xfe,0xb5,0x03,0xdd,0x05,0x3d,0x02,0x26,0x00,0x48,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x3a,0xff,0xa3,0x00,0x0a,0xb4,0x02,0x4f,0x1c,0x01,0x1c,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x14,0xff,0xe8,0x02,0xbd,0x05,0x9a,0x00,0x14,0x00,0x75,\r\n0x40,0x0d,0x79,0x09,0x01,0x76,0x09,0x01,0x76,0x01,0x01,0x13,0x13,0x11,0x05,0xb8,0xff,0xf0,0x40,0x18,0x0d,0x06,0x4d,0x05,0x05,0x00,0x08,0x0b,0x0d,0x06,0x4c,0x00,0x7e,0x0a,0x0e,0x0a,0x0c,0x0c,0x0a,0x18,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xf6,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0x40,0x15,0x0b,0x06,0x4d,0x0a,0x0a,0x16,0x15,\r\n0x14,0x0c,0x91,0x11,0x0d,0x0d,0x0f,0x03,0x06,0x06,0x08,0x91,0x03,0x13,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x2b,0x2b,0x2b,0x33,0x2f,0x11,0x33,0x10,0xe9,0x2b,0x32,0x2f,0x2b,0x32,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,\r\n0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x02,0x2b,0xd8,0xb5,0x54,0x36,0x36,0x56,0xe3,0xd8,0xd8,0xa8,0x92,0x92,0x02,0x02,0xff,0xfe,0xe5,0x18,0xa6,0x27,0x01,0x81,0x81,0x98,0x02,0x81,0xfd,0x7f,0x98,0x00,0x00,0x02,0xff,0x3a,0xfe,0x1e,0x01,0xd4,0x05,0xd9,0x00,0x14,0x00,0x20,0x00,0x7a,0x40,0x28,0x1e,0x62,0x18,0x0a,\r\n0x00,0x18,0x62,0xff,0x30,0x06,0x0a,0x12,0x12,0x11,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x0a,0x0e,0x0a,0x0c,0x0c,0x7f,0x0a,0x01,0x0a,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x0a,0xb8,0xff,0xfe,0x40,0x19,0x0b,0x06,0x4d,0x0a,0x0a,0x22,0x21,0x1b,0x63,0x15,0x0f,0x14,0x0c,0x95,0x11,\r\n0x0d,0x0d,0x0f,0x0f,0x06,0x06,0x08,0x95,0x03,0x1c,0x00,0x3f,0xed,0x32,0x2f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x10,0xde,0xed,0x11,0x12,0x01,0x39,0x2f,0x2b,0x2b,0x5d,0x33,0x2f,0x11,0x33,0x10,0xe1,0x2b,0x2b,0x2b,0x32,0x32,0x2f,0x10,0xc6,0x2b,0x01,0x10,0xe1,0x31,0x30,0x25,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,\r\n0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x4a,0xcb,0xbd,0x46,0x42,0x4a,0x42,0xe0,0x8a,0x8a,0xa4,0x8a,0x8a,0x50,0x2c,0x3e,0x3e,0x2c,0x2d,0x3f,0x3f,0x2b,0xfc,0xfe,0xef,0x20,0x99,0x2d,0x01,0x66,0x01,0x9d,0x87,0x01,0xcc,0xfe,0x34,0x87,0x03,0x57,0x3c,0x2e,\r\n0x2e,0x3d,0x3d,0x2e,0x2c,0x3e,0x00,0x02,0x00,0x5e,0xfe,0x96,0x06,0x3d,0x05,0xb2,0x00,0x1b,0x00,0x29,0x00,0x30,0x40,0x19,0x05,0x05,0x01,0x7e,0x25,0x1a,0x0b,0x0b,0x2b,0x1f,0x7d,0x13,0x1b,0x03,0x1c,0x91,0x16,0x04,0x22,0x91,0x10,0x13,0x03,0x91,0x08,0x00,0x2f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,\r\n0x33,0xed,0x32,0x2f,0x31,0x30,0x01,0x11,0x10,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x07,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x17,0x16,0x17,0x35,0x05,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x11,0x35,0x02,0x27,0x26,0x05,0x19,0xb2,0x3f,0x33,0x38,0x42,0x9f,0xb3,0x0c,0x0d,0xa2,0xfe,0xf1,0xfe,0xf6,\r\n0xfe,0xc1,0x01,0x45,0x01,0x19,0x01,0x02,0x9e,0x0b,0x0a,0xfe,0x54,0xc3,0xf4,0xed,0xbf,0xcc,0xeb,0x03,0x6f,0x72,0x05,0x9a,0xfa,0x9b,0xfe,0xf8,0x1d,0xa0,0x14,0xe2,0xbd,0xa0,0x11,0x10,0xcc,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xc8,0x0e,0x0f,0xcd,0x80,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x0e,0x01,\r\n0x12,0x97,0x9b,0x00,0x00,0x02,0x00,0x60,0xfe,0x96,0x05,0x34,0x04,0x18,0x00,0x1d,0x00,0x2e,0x00,0x2c,0x40,0x17,0x27,0x83,0x12,0x02,0x02,0x1c,0x84,0x1e,0x1a,0x0a,0x1a,0x0f,0x23,0x95,0x16,0x10,0x2b,0x95,0x0e,0x16,0x00,0xec,0x05,0x00,0x2f,0xed,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x2f,0xed,0x31,0x30,\r\n0x05,0x32,0x37,0x15,0x06,0x23,0x22,0x27,0x26,0x26,0x35,0x35,0x23,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x10,0x03,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0xc2,0x3e,0x34,0x39,0x41,0x9f,0x5a,0x2d,0x28,0x04,0x72,0xee,0xc1,0x74,0x73,0x80,\r\n0x80,0xd5,0xd3,0x60,0x04,0xa4,0xa4,0x52,0x53,0x7d,0x96,0x56,0x56,0x52,0x53,0x8b,0x89,0x55,0x56,0xd3,0x1d,0xa0,0x14,0x71,0x39,0x96,0x5f,0x79,0xc6,0x89,0x89,0xee,0xfd,0x9a,0x99,0xa6,0x8e,0xfc,0x35,0xfe,0xf8,0x02,0xa2,0x97,0x7d,0x55,0x56,0x6e,0x6e,0xc2,0xb1,0x67,0x66,0x63,0x64,0x00,0x00,0x02,0x00,0x1c,0x00,0x00,0x04,0xc0,\r\n0x05,0x9a,0x00,0x20,0x00,0x2b,0x00,0xb0,0x40,0x32,0x75,0x13,0x01,0x76,0x12,0x01,0x39,0x02,0x01,0x0e,0x1b,0x22,0x91,0x0b,0x08,0x08,0x0a,0x21,0x91,0x0f,0x03,0x01,0x0a,0x1b,0x09,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x28,0x7d,0x15,0x79,0x02,0x01,0x7a,0x01,0x01,0x02,0xb8,0xff,0xe8,0xb4,\r\n0x0b,0x0d,0x01,0x4c,0x01,0xb8,0xff,0xe8,0x40,0x28,0x0b,0x0d,0x01,0x4c,0x01,0x1c,0x02,0x15,0x04,0x70,0x00,0x01,0x00,0x08,0x0d,0x06,0x4d,0x00,0x2d,0x22,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x0e,0x0d,0x09,0x7e,0x0a,0xb8,0xff,0xf2,0xb3,0x0d,0x06,0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0c,0x06,\r\n0x4d,0x0a,0xb8,0xff,0xfa,0xb3,0x0b,0x06,0x4d,0x0a,0x2f,0x2b,0x2b,0x2b,0xe1,0x33,0x33,0x2b,0x2b,0x2b,0x32,0x10,0xc6,0x2b,0x5d,0x17,0x32,0x2b,0x2b,0x5d,0x5d,0x2f,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x00,0x2f,0x33,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x39,0x32,0x31,0x30,0x5d,0x01,0x5d,0x5d,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,\r\n0x23,0x11,0x23,0x35,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x04,0xc0,0xc8,0xf0,0x21,0x3e,0x41,0x4b,0x2f,0x8a,0xa8,0xa0,0xa0,0x01,0xac,0x5e,0x9f,0x75,0x42,0x2d,0x53,0x75,0x49,0x24,0x35,0x30,0x2f,0x1d,0xfd,0xb1,0xe4,0x3f,0x6b,0x4e,0x2c,\r\n0x95,0x8d,0x01,0x92,0x38,0x4f,0x32,0x17,0xfd,0x9e,0x02,0x62,0x98,0x02,0xa0,0x2f,0x60,0x8f,0x60,0x4b,0x7d,0x62,0x45,0x13,0x04,0x10,0x29,0x38,0x47,0x2f,0x03,0x53,0xfd,0xf8,0x26,0x47,0x67,0x40,0x73,0x81,0x00,0x01,0x00,0x1c,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x18,0x00,0x3f,0x40,0x1f,0x00,0x00,0x1a,0x11,0x06,0x0a,0x84,0x0b,\r\n0x0f,0x0b,0x0d,0x0d,0x0b,0x09,0x0c,0xec,0x06,0x0f,0x0f,0x0b,0x16,0x12,0x00,0x00,0x02,0x16,0x10,0x10,0x0f,0x0b,0x15,0x00,0x3f,0x3f,0x3f,0xcd,0x32,0x2f,0x32,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x15,0x21,0x11,\r\n0x23,0x11,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2b,0x51,0x69,0x8d,0x01,0x16,0xfe,0xea,0xa4,0x8a,0x8a,0xa4,0x04,0x23,0x90,0x59,0x40,0x22,0x03,0x5a,0x21,0xc6,0xab,0x23,0x98,0xfe,0xb1,0x01,0x4f,0x98,0x02,0x19,0xd3,0x6c,0x79,0x0e,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x00,0x11,\r\n0x00,0x19,0x00,0x68,0x40,0x34,0x18,0x10,0x14,0x11,0x11,0x00,0x0f,0x19,0x0e,0x14,0x14,0x07,0x04,0x01,0x00,0x06,0x7e,0x0c,0x09,0x07,0x07,0x0d,0x00,0x02,0x02,0x00,0x00,0x1b,0x0e,0x0d,0x0b,0x0b,0x0d,0x19,0x04,0x0a,0x91,0x0f,0x01,0x0b,0x0b,0x11,0x11,0x14,0x05,0x08,0x03,0x07,0x0d,0x03,0x07,0x12,0x00,0x3f,0x3f,0x12,0x17,0x39,\r\n0x33,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x11,0x33,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x03,0x33,0x15,0x23,0x03,0x11,0x23,0x11,0x03,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,0x01,0x16,\r\n0x17,0x33,0x36,0x37,0x37,0x21,0x04,0x60,0x8b,0x7a,0xc9,0xff,0xa8,0xfa,0xc9,0x7c,0x86,0xbf,0x83,0x01,0xd0,0x8a,0xfe,0x64,0x06,0x1d,0x03,0x0a,0x1c,0x78,0xfe,0xc9,0x05,0x9a,0xfe,0xf7,0x98,0xfe,0x19,0xfd,0xee,0x02,0x0e,0x01,0xeb,0x98,0x01,0x09,0xfe,0xf7,0x01,0x09,0xfd,0x78,0x0c,0x4c,0x22,0x36,0xe7,0x00,0x00,0x02,0x00,0x0e,\r\n0xfe,0x1e,0x03,0xd5,0x04,0x00,0x00,0x18,0x00,0x20,0x00,0x66,0x40,0x35,0x1f,0x17,0x18,0x18,0x00,0x20,0x16,0x1b,0x15,0x01,0x04,0x05,0x1b,0x0f,0x10,0x13,0x07,0x00,0x0a,0x0a,0x14,0x00,0x02,0x02,0x00,0x00,0x22,0x15,0x14,0x12,0x12,0x14,0x20,0x04,0x11,0x96,0x16,0x01,0x12,0x12,0x21,0x18,0x14,0x0f,0x1b,0x05,0x0f,0x0a,0x0a,0x0c,\r\n0x95,0x07,0x1c,0x00,0x3f,0xed,0x32,0x2f,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0x11,0x33,0x11,0x33,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x39,0x39,0x31,0x30,0x01,0x03,0x33,0x15,0x23,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,\r\n0x37,0x37,0x03,0x23,0x35,0x33,0x03,0x33,0x13,0x21,0x13,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x21,0x03,0xd5,0x8b,0x79,0xae,0xfe,0xe9,0x7e,0xe4,0x40,0x2b,0x35,0x2c,0x7c,0x3e,0x52,0xd3,0xae,0x79,0x88,0xb6,0x7a,0x01,0x6c,0x81,0xfe,0xae,0x05,0x10,0x06,0x05,0x0f,0x71,0xfe,0xf4,0x04,0x00,0xfe,0xa3,0x86,0xfd,0x3f,0xfe,0xc2,0x0d,\r\n0x93,0x12,0x94,0xc2,0x02,0x1b,0x86,0x01,0x5d,0xfe,0xa3,0x01,0x5d,0xfc,0xec,0x0f,0x3f,0x18,0x34,0x01,0x33,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x06,0x07,0x72,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x78,0xfc,0xe6,0x00,0x1b,\r\n0x40,0x14,0x01,0x0f,0x1c,0x1f,0x1c,0x02,0x3f,0x1c,0x6f,0x1c,0x70,0x1c,0x8f,0x1c,0xcf,0x1c,0xdf,0x1c,0x06,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x26,0x07,0x72,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0xb5,0xfc,0xe6,0x00,0x1b,0x40,0x14,0x01,0x0f,0x1c,0x1f,0x1c,0x02,0x3f,0x1c,\r\n0x6f,0x1c,0x70,0x1c,0x8f,0x1c,0xcf,0x1c,0xdf,0x1c,0x06,0x1c,0x00,0x11,0x5d,0x71,0x35,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x02,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0x29,0xfe,0x96,0x03,0xf6,0x05,0x9a,0x02,0x26,0x02,0xb9,0x00,0x00,0x01,0x07,0x08,0x5c,0x01,0x78,0x00,0x00,0x00,0x09,0xb3,0x01,0x1a,0x1a,\r\n0x06,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x1e,0xfe,0x96,0x03,0x29,0x04,0x00,0x02,0x26,0x02,0xba,0x00,0x00,0x01,0x07,0x08,0x5c,0x01,0x56,0x00,0x00,0x00,0x09,0xb3,0x01,0x1a,0x1a,0x06,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x1a,0xfe,0x96,0x04,0xda,0x05,0x9a,0x00,0x26,0x00,0x3b,0x00,0x00,0x00,0x07,0x08,0x5c,0x04,0x03,\r\n0x00,0x00,0xff,0xff,0x00,0x1a,0xfe,0x96,0x03,0xc6,0x04,0x00,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x07,0x08,0x5c,0x02,0xef,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x00,0x1b,0x00,0x9b,0xb9,0x00,0x16,0xff,0xe0,0x40,0x11,0x0b,0x0d,0x01,0x4c,0x0f,0x20,0x0b,0x0d,0x01,0x4c,0x08,0x20,0x0b,0x0d,0x01,0x4c,0x01,\r\n0xb8,0xff,0xe0,0x40,0x0a,0x0b,0x0d,0x01,0x4c,0x16,0x08,0x0c,0x00,0x4d,0x0f,0xb8,0xff,0xf8,0x40,0x09,0x0c,0x00,0x4d,0x0a,0x10,0x0b,0x00,0x4d,0x08,0xb8,0xff,0xf8,0x40,0x1d,0x0c,0x00,0x4d,0x01,0x08,0x0c,0x00,0x4d,0x0a,0x18,0x0d,0x1b,0x04,0x0e,0x19,0x19,0x17,0x00,0x10,0x0b,0x00,0x4d,0x00,0x00,0x1d,0x0b,0x0b,0x0e,0x09,0xb8,\r\n0xff,0xf0,0x40,0x16,0x0b,0x00,0x4d,0x09,0x1b,0x04,0x0b,0x91,0x18,0x12,0x2f,0x0c,0x01,0x0c,0x0c,0x08,0x16,0x0f,0x03,0x01,0x08,0x12,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0xc6,0x33,0x2f,0x11,0x33,0x2f,0x2b,0xc6,0x33,0x2f,0x11,0x17,0x39,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,\r\n0x2b,0x2b,0x2b,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x21,0x35,0x21,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x04,0x9a,0xcd,0xfe,0xb6,0x0f,0x12,0x04,0x0a,0x18,0xfe,0xac,0xce,0x01,0xb2,0xfe,0x66,0x01,0x94,0xfe,0x7a,0xce,0x01,0x25,0x1d,0x16,0x04,0x20,0x18,0x01,0x31,0xc1,0xfe,\r\n0x71,0x01,0x8b,0xfe,0x6d,0x02,0x25,0x19,0x2e,0x17,0x30,0xfd,0xdb,0x02,0x8d,0x98,0x02,0x75,0xfe,0x08,0x32,0x32,0x42,0x26,0x01,0xf4,0xfd,0x8b,0x98,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x03,0x92,0x04,0x00,0x00,0x19,0x00,0x4e,0x40,0x2f,0x0d,0x0a,0x18,0x01,0x04,0x02,0x09,0x02,0x00,0x17,0x09,0x0c,0x0b,0x0e,0x13,0x0d,0x19,0x96,\r\n0x0a,0x06,0x0f,0x00,0x1f,0x00,0x4f,0x00,0x5f,0x00,0x04,0x2f,0x00,0x3f,0x00,0x6f,0x00,0x7f,0x00,0x04,0x00,0x00,0x03,0x0f,0x16,0x15,0x08,0x03,0x0f,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x71,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x13,0x21,0x01,0x33,0x13,0x16,\r\n0x17,0x33,0x01,0x33,0x01,0x21,0x15,0x21,0x01,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x21,0x28,0x01,0x21,0xfe,0xe0,0xbf,0xc6,0x16,0x15,0x04,0x01,0x00,0xb5,0xfe,0xd4,0x01,0x1e,0xfe,0xe3,0x01,0x25,0xbf,0xc9,0x13,0x1a,0x04,0x05,0x2a,0xcd,0xbd,0x01,0x31,0xfe,0xdd,0x02,0x3d,0x01,0xc3,0xfe,0xa2,0x27,0x29,0x01,0xae,\r\n0xfe,0x3d,0x86,0xfe,0x49,0x01,0x4c,0x1f,0x2f,0x09,0x45,0xfe,0xb4,0x01,0xb7,0x00,0xff,0xff,0x00,0x70,0xff,0xe8,0x03,0xf4,0x05,0xb2,0x02,0x06,0x04,0xbf,0x00,0x00,0xff,0xff,0x00,0x52,0xff,0xe7,0x03,0x3b,0x04,0x19,0x02,0x06,0x01,0x31,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x96,0x04,0xa4,0x05,0x9a,0x02,0x26,0x01,0xf2,0x00,0x00,\r\n0x01,0x07,0x04,0x80,0x03,0xbe,0x00,0x00,0x00,0x09,0xb3,0x01,0x1d,0x1d,0x01,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x10,0xfe,0x96,0x03,0x92,0x04,0x00,0x02,0x26,0x02,0x12,0x00,0x00,0x01,0x07,0x04,0x80,0x02,0xac,0x00,0x00,0x00,0x09,0xb3,0x01,0x19,0x19,0x01,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x3e,0x04,0xc2,0x03,0x75,\r\n0x06,0x0a,0x00,0x26,0x00,0xd9,0x00,0x00,0x00,0x07,0x00,0x8e,0x01,0x69,0x00,0x00,0xff,0xff,0x00,0x3f,0x04,0xc2,0x03,0x75,0x06,0x0a,0x00,0x27,0x00,0xd9,0x01,0x3b,0x00,0x00,0x00,0x06,0x00,0x43,0xed,0x00,0xff,0xff,0x00,0x3e,0x03,0xe8,0x03,0x68,0x05,0x30,0x00,0x26,0x00,0xd9,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x91,0xff,0x26,\r\n0x00,0x0a,0xb3,0x01,0x06,0x06,0x02,0x00,0x10,0x3c,0x11,0x35,0xff,0xff,0x00,0x3f,0x03,0xe8,0x03,0x68,0x05,0x30,0x00,0x27,0x00,0xd9,0x01,0x2e,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xb8,0xff,0x26,0x00,0x0a,0xb3,0x01,0x07,0x07,0x02,0x00,0x10,0x3c,0x11,0x35,0xff,0xff,0x00,0x3f,0x04,0x83,0x03,0xd0,0x05,0xcb,0x00,0x26,0x00,0x43,\r\n0xed,0xc1,0x00,0x27,0x00,0x8e,0x00,0xbd,0xff,0xc1,0x00,0x07,0x00,0x43,0x01,0xf9,0xff,0xc1,0xff,0xff,0x00,0x3f,0x04,0x83,0x03,0xd0,0x05,0xcb,0x00,0x26,0x00,0x8e,0xb8,0xc1,0x00,0x27,0x00,0x43,0x00,0xf3,0xff,0xc1,0x00,0x07,0x00,0x8e,0x01,0xc4,0xff,0xc1,0xff,0xff,0x00,0x66,0xfd,0xfe,0x01,0xa8,0x00,0x2c,0x00,0x07,0x06,0x79,\r\n0x00,0x00,0xfb,0x64,0x00,0x01,0x00,0x77,0x04,0x09,0x02,0x30,0x06,0x83,0x00,0x06,0x00,0x0d,0xb3,0x00,0x01,0x03,0x00,0x00,0x2f,0xce,0x01,0x2f,0xcd,0x31,0x30,0x01,0x25,0x35,0x25,0x15,0x05,0x05,0x02,0x30,0xfe,0x47,0x01,0xb9,0xfe,0xb6,0x01,0x4a,0x04,0x09,0xdd,0xc0,0xdd,0x7c,0xc1,0xc1,0x00,0x02,0x00,0xdb,0xfe,0x05,0x04,0x57,\r\n0x00,0x1b,0x00,0x06,0x00,0x0d,0x00,0x2c,0x40,0x17,0x07,0x0a,0x05,0x40,0x06,0x80,0x0a,0x01,0x0a,0x80,0x30,0x09,0x40,0x09,0x02,0x09,0x09,0x03,0xc0,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x1a,0xce,0x33,0x2f,0x5d,0x1a,0xcd,0x5d,0x01,0x2f,0x1a,0xcd,0x2f,0xcc,0x31,0x30,0x13,0x37,0x27,0x35,0x05,0x15,0x05,0x01,0x03,0x23,0x03,0x33,\r\n0x17,0x37,0xdb,0xc8,0xc8,0x01,0x37,0xfe,0xc9,0x03,0x7c,0xab,0xc0,0xab,0x7c,0x8f,0x8f,0xfe,0x81,0x8f,0x8f,0x7c,0xab,0xc0,0xab,0x01,0x94,0xfe,0xc9,0x01,0x37,0xc8,0xc8,0x00,0x00,0x04,0x00,0x35,0xff,0xf5,0x05,0xae,0x05,0x9a,0x00,0x07,0x00,0x0a,0x00,0x40,0x00,0x44,0x00,0x8e,0x40,0x0f,0x08,0x02,0x01,0x09,0x01,0x0a,0x03,0x04,\r\n0x09,0x04,0x2c,0x13,0x3b,0x25,0x27,0xb8,0x01,0x0e,0x40,0x0c,0x0f,0x22,0x3f,0x22,0x5f,0x22,0x6f,0x22,0x04,0x22,0x0b,0x10,0xb8,0x01,0x0e,0xb3,0x3b,0x02,0x08,0x03,0xb8,0x01,0x0e,0xb7,0x0a,0x0a,0x06,0x05,0x43,0x44,0x09,0x06,0xbc,0x01,0x06,0x00,0x01,0x01,0x0a,0x00,0x05,0x01,0x0a,0xb3,0x41,0x43,0x0b,0x2c,0xb8,0x01,0x0c,0xb2,\r\n0x1d,0x25,0x36,0xb8,0x01,0x0c,0x40,0x09,0x13,0x13,0x46,0x0a,0x08,0x05,0x00,0x00,0x05,0x2f,0x33,0x2f,0x12,0x39,0x39,0x11,0x33,0x2f,0xed,0x32,0xd4,0xed,0x33,0x2f,0x2f,0x00,0x3f,0x3f,0x3f,0x33,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x33,0x32,0x2f,0xed,0x32,0x2f,0x5d,0xed,0x32,0x12,0x39,0x39,0x31,0x30,0x10,0x87,0x05,0xc0,0xc0,\r\n0x10,0x87,0xc0,0xc0,0x01,0x23,0x27,0x21,0x07,0x23,0x01,0x33,0x13,0x03,0x03,0x01,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x01,0x01,0x23,0x01,0x02,0xd3,0x83,\r\n0x49,0xfe,0xf7,0x46,0x83,0x01,0x17,0x6f,0x23,0x5d,0x5a,0x02,0xbe,0x17,0x36,0x37,0x34,0x15,0x3b,0x46,0x17,0x29,0x37,0x20,0x26,0x42,0x32,0x1c,0x2d,0x49,0x5d,0x30,0x6a,0x3e,0x59,0x57,0x18,0x2e,0x24,0x16,0x13,0x24,0x34,0x20,0x24,0x46,0x37,0x21,0x29,0x46,0x5e,0x35,0x1a,0x38,0x35,0x2f,0x11,0x01,0x4d,0xfc,0xa6,0x90,0x03,0x5b,\r\n0x02,0xc0,0xc2,0xc2,0x02,0xd9,0xfe,0x59,0x01,0x01,0xfe,0xff,0xfc,0xc8,0x14,0x1f,0x16,0x0c,0x2d,0x2b,0x17,0x23,0x1f,0x1d,0x10,0x14,0x27,0x32,0x3f,0x2b,0x35,0x4c,0x32,0x18,0x20,0x8b,0x3b,0x09,0x14,0x20,0x17,0x15,0x21,0x1d,0x1c,0x10,0x13,0x2b,0x35,0x40,0x29,0x38,0x4f,0x33,0x17,0x07,0x0d,0x12,0x0b,0x05,0x74,0xfa,0x66,0x05,\r\n0x9a,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x03,0x0c,0x04,0x01,0x00,0x09,0x00,0x2d,0x40,0x16,0x07,0x84,0x06,0x02,0x06,0x03,0x06,0x03,0x06,0x0b,0x00,0x02,0x95,0x05,0x05,0x06,0x01,0x95,0x08,0x15,0x06,0x0f,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x37,0x21,0x11,\r\n0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x48,0x02,0x21,0xfe,0x34,0x01,0xcc,0xa3,0xfd,0x3c,0x8a,0x01,0x5d,0x8c,0x01,0x8e,0xfb,0xff,0x00,0xff,0xff,0x00,0x5a,0xff,0xe8,0x03,0x6c,0x04,0x18,0x02,0x06,0x07,0x72,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x15,0x00,0x86,0xb9,0x00,0x15,0xff,0xf0,0xb3,0x10,0x06,\r\n0x4d,0x15,0xb8,0xff,0xf0,0xb4,0x0b,0x0d,0x06,0x4c,0x15,0xb8,0xff,0xe8,0xb3,0x0a,0x06,0x4d,0x15,0xb8,0xff,0xe0,0xb3,0x09,0x06,0x4d,0x15,0xb8,0xff,0xc0,0x40,0x32,0x0a,0x1f,0x48,0x15,0x15,0x17,0x01,0x0e,0x11,0x11,0x10,0x0c,0x14,0x7e,0x01,0x07,0x03,0x03,0x09,0x05,0x01,0x13,0x02,0x91,0x05,0x10,0x05,0x0f,0x06,0x91,0x09,0x0c,\r\n0x09,0x2f,0x09,0x6f,0x09,0x7f,0x09,0x03,0x05,0x09,0x05,0x09,0x0a,0x03,0x14,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x32,0x32,0x2f,0x33,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x31,0x30,0x21,0x21,\r\n0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x21,0x03,0xa4,0xfd,0x18,0xa0,0xa0,0xa0,0xa0,0xa8,0x01,0x2e,0xfe,0xd2,0x01,0x2e,0xfe,0xd2,0x02,0x40,0x01,0xda,0x98,0x9e,0x98,0x01,0xf2,0xfe,0x0e,0x98,0x9e,0x98,0xfe,0xbe,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x36,0x05,0xec,\r\n0x00,0x13,0x00,0x51,0x40,0x2d,0x08,0x03,0x03,0x01,0x0e,0x12,0x12,0x00,0x84,0x09,0x05,0x01,0x0f,0x07,0x96,0x08,0x0c,0x08,0x13,0x03,0x96,0x04,0x10,0x04,0x0f,0x08,0x1f,0x08,0x3f,0x08,0x03,0x6f,0x04,0x8f,0x04,0x02,0x08,0x04,0x08,0x04,0x01,0x0a,0x00,0x01,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,\r\n0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x21,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x01,0x77,0xa4,0xbf,0xbf,0xbf,0xbf,0xa4,0xbf,0xbf,0xbf,0xbf,0x01,0xe1,0x86,0x92,0x86,0x02,0x6d,0xfd,0x93,0x86,0x92,\r\n0x86,0x00,0xff,0xff,0x00,0x27,0x00,0x00,0x03,0xf9,0x05,0x9a,0x00,0x26,0x00,0x2f,0x55,0x00,0x00,0x07,0x00,0xd8,0x00,0x04,0xfd,0x66,0x00,0x02,0x00,0x1c,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x51,0x40,0x29,0x12,0x12,0x14,0x0b,0x7d,0x18,0x18,0x1c,0x02,0x10,0x14,0x14,0x00,0x01,0x7e,0x02,0x06,0x02,0x04,0x04,\r\n0x02,0x00,0x91,0x14,0x13,0x03,0x91,0x06,0x10,0x06,0x14,0x06,0x14,0x06,0x02,0x0f,0x91,0x07,0x03,0x02,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x01,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x11,0x23,0x11,0x23,\r\n0x35,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x15,0x21,0x15,0x21,0x15,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xa0,0xa0,0x01,0x8a,0xe6,0xfd,0xfe,0xe7,0xef,0xbd,0x01,0x24,0xfe,0xdc,0xb0,0xae,0xb7,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x03,0x8a,0x98,0x01,0x78,0xe0,0xcc,0xcc,0xfe,0xfc,0x02,0xe4,0xe0,0x98,0xd4,0x9f,\r\n0x91,0x01,0x1c,0x00,0xff,0xff,0x00,0xbc,0xfe,0x96,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x01,0x07,0x0a,0xbb,0x01,0xa2,0x00,0x00,0x00,0x09,0xb3,0x02,0x29,0x29,0x09,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0x5a,0xfe,0xb5,0x03,0x95,0x05,0x3d,0x02,0x26,0x00,0x44,0x00,0x00,0x01,0x07,0x04,0x96,0x02,0x03,0xff,0xa3,\r\n0x00,0x0a,0xb4,0x02,0x4f,0x1f,0x01,0x1f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xb5,0xff,0x12,0x02,0xd7,0x05,0x9a,0x02,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x04,0x96,0x01,0x45,0x00,0x00,0x00,0x0a,0xb4,0x01,0x4f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xbc,0xfe,0x80,0x05,0xb2,0x05,0x9a,0x02,0x06,0x02,0xc1,0x00,0x00,\r\n0xff,0xff,0x00,0xa6,0xfe,0x8a,0x04,0x92,0x05,0xec,0x00,0x26,0x00,0x4b,0x00,0x00,0x01,0x07,0x0a,0xbe,0x02,0x45,0x00,0x00,0x00,0x09,0xb3,0x01,0x12,0x12,0x00,0x10,0x3c,0x11,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x80,0x04,0xdd,0x05,0x9a,0x00,0x26,0x00,0x2e,0x00,0x00,0x00,0x07,0x0a,0xbd,0x02,0x7d,0x00,0x00,0xff,0xff,0x00,0xa6,\r\n0xfe,0x8a,0x04,0x0c,0x05,0xec,0x00,0x26,0x00,0x4e,0x00,0x00,0x00,0x07,0x0a,0xbe,0x01,0xbf,0x00,0x00,0xff,0xff,0x00,0x21,0xfe,0x80,0x04,0xb6,0x05,0x9a,0x00,0x26,0x00,0x3d,0x00,0x00,0x00,0x07,0x0a,0xbd,0x02,0x56,0x00,0x00,0xff,0xff,0x00,0x21,0xfe,0x8b,0x03,0xbd,0x04,0x00,0x00,0x26,0x00,0x5d,0x00,0x00,0x00,0x07,0x0a,0xbe,\r\n0x01,0x70,0x00,0x01,0x00,0x02,0x00,0x4b,0x00,0x00,0x04,0x3a,0x04,0x23,0x00,0x21,0x00,0x2d,0x00,0x5c,0x40,0x2e,0x0a,0xef,0x1c,0x1f,0x1b,0x00,0x1b,0x0f,0x2b,0x28,0x1a,0x13,0x13,0x19,0x22,0x22,0x00,0x18,0x19,0x19,0x2f,0x28,0xef,0x00,0x1e,0x1e,0x00,0x1f,0x2b,0x1e,0x25,0x1e,0x1c,0x0f,0x05,0x1d,0x1d,0x13,0x1b,0x15,0x18,0x0f,\r\n0x25,0x95,0x05,0x10,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x13,0x16,0x16,\r\n0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x23,0x01,0x07,0x27,0x37,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x95,0x26,0x41,0x53,0x2d,0x2c,0x52,0x3e,0x25,0x1d,0x37,0x50,0x32,0x9f,0x14,0x18,0x07,0x04,0x05,0x10,0x0b,0x01,0x10,0xad,0xfe,0x68,0x9a,0xfe,0xf9,0x7a,0x3c,0x7b,0x15,0x1c,0x01,0x31,0x26,\r\n0x24,0x1e,0x31,0x0f,0x10,0x3f,0x3b,0x03,0x3f,0x3c,0x56,0x37,0x1b,0x1a,0x33,0x4d,0x32,0x31,0x4f,0x43,0x3a,0x1d,0xfe,0xd2,0x26,0x42,0x1e,0x26,0x46,0x1f,0x02,0xec,0xfc,0x00,0x01,0xf6,0x41,0x7a,0x3e,0x31,0x68,0x43,0x24,0x2f,0x2f,0x35,0x24,0x3f,0x23,0x23,0x46,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x07,\r\n0x00,0x22,0x40,0x10,0x07,0x03,0x7e,0x04,0x01,0x01,0x04,0x02,0x91,0x07,0x07,0x04,0x05,0x03,0x04,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0xfa,0xfd,0x6a,0xa8,0xa8,0x03,0x25,0x97,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x00,0x00,0x01,0x00,0xa6,\r\n0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x00,0x22,0x40,0x10,0x07,0x03,0x84,0x04,0x00,0x00,0x04,0x02,0x95,0x07,0x07,0x04,0x05,0x0f,0x04,0x15,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x04,0xfe,0x46,0xa4,0xa4,0x02,0x5c,0x8b,0xfe,0x2f,0x04,\r\n0x00,0xfe,0x5c,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x05,0x38,0x04,0x18,0x00,0x15,0x00,0x1f,0x00,0x35,0xb9,0x00,0x1f,0x01,0x2e,0x40,0x18,0x0e,0x07,0x0e,0x07,0x04,0x13,0x83,0x1a,0x1a,0x21,0x09,0x83,0x04,0x1d,0x95,0x10,0x10,0x07,0x0f,0x16,0x0d,0x95,0x01,0x16,0x00,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,\r\n0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x05,0x23,0x22,0x00,0x35,0x10,0x37,0x33,0x06,0x11,0x14,0x16,0x33,0x33,0x11,0x10,0x21,0x32,0x12,0x15,0x14,0x00,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x15,0x03,0x36,0xd2,0xec,0xfe,0xe8,0xd2,0xc2,0xec,0xbf,0x9b,0x1e,0x01,0x12,0xbc,0xea,0xfe,0xe7,0xfe,0xf5,0x22,0x98,0xc2,\r\n0x93,0x67,0x82,0x18,0x01,0x20,0xf6,0x01,0x3b,0xc7,0xd8,0xfe,0xd2,0xb8,0xce,0x02,0x95,0x01,0x0f,0xfe,0xd7,0xfb,0xe9,0xfe,0xdd,0x8c,0xd3,0xb5,0xb4,0xdc,0x81,0x00,0x00,0x02,0x00,0xaf,0x03,0xf9,0x02,0x48,0x05,0xf5,0x00,0x03,0x00,0x0f,0x00,0x22,0xb3,0x0d,0xc0,0x07,0x01,0xb8,0x01,0x32,0x40,0x09,0x02,0x0a,0xc1,0x04,0x04,0x02,\r\n0x03,0x03,0x02,0x00,0x2f,0x33,0x2f,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x48,0x6d,0xc9,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x05,0xf5,0xfe,0x04,0x01,0xfc,0xfe,0xa0,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x00,0x00,0x02,\r\n0x00,0xaf,0x03,0xfd,0x02,0xa0,0x05,0xee,0x00,0x13,0x00,0x17,0x00,0x28,0x40,0x14,0x14,0x14,0x16,0x16,0x0c,0xc0,0x02,0x07,0xc1,0x0f,0x11,0x1f,0x11,0x02,0x11,0x11,0x15,0x17,0x17,0x15,0x00,0x2f,0x33,0x2f,0x11,0x33,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x33,0x2f,0x33,0x2f,0x31,0x30,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,\r\n0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x01,0x27,0x01,0xcc,0x1d,0x0f,0x19,0x24,0x15,0x15,0x24,0x1b,0x10,0x11,0x1b,0x25,0x13,0x12,0x24,0x01,0xc6,0xfe,0x99,0x4d,0x01,0x67,0x05,0x47,0x1d,0x29,0x13,0x24,0x1a,0x10,0x11,0x1c,0x23,0x13,0x14,0x23,0x1a,0x10,0x0f,0x2c,0xfe,0x98,0x4d,0x01,0x68,0x00,0x00,0x02,0x00,0xaf,0x04,0x2b,\r\n0x02,0xab,0x05,0xc4,0x00,0x03,0x00,0x0f,0x00,0x27,0x40,0x14,0x0a,0xc0,0x04,0x04,0x01,0x00,0x00,0x01,0x07,0xc1,0x0d,0x40,0x09,0x0e,0x48,0x0d,0x0d,0x02,0xe7,0x01,0x00,0x2f,0xed,0x33,0x2f,0x2b,0xed,0x01,0x2f,0x33,0x2f,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x25,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,\r\n0x26,0x02,0xab,0xfe,0x04,0x01,0xfc,0xfe,0xa0,0x39,0x2a,0x28,0x38,0x37,0x29,0x29,0x3a,0x04,0x2b,0x6d,0xc9,0x28,0x3b,0x3a,0x29,0x29,0x39,0x39,0x00,0x01,0x00,0x75,0x04,0xfe,0x03,0x69,0x06,0x58,0x00,0x05,0x00,0x18,0x40,0x0a,0x04,0xea,0x01,0x01,0x02,0x05,0x05,0x03,0xbe,0x02,0x00,0x2f,0xed,0x33,0x2f,0x01,0x2f,0x33,0x2f,0xed,\r\n0x31,0x30,0x01,0x11,0x21,0x35,0x21,0x35,0x03,0x69,0xfd,0x0c,0x02,0x5f,0x06,0x58,0xfe,0xa6,0x95,0xc5,0x00,0x01,0x00,0x75,0x04,0x7c,0x04,0x54,0x06,0x58,0x00,0x09,0x00,0x25,0x40,0x11,0x09,0xea,0x00,0x00,0x04,0x07,0x07,0x03,0xea,0x04,0x08,0x02,0xbe,0x05,0x05,0x00,0x04,0x00,0x2f,0x33,0x33,0x2f,0xed,0x32,0x01,0x2f,0xed,0x33,\r\n0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x21,0x11,0x02,0x23,0xfe,0xe7,0x95,0x03,0xdf,0xfe,0x64,0x04,0x7d,0x01,0x46,0xfe,0xb9,0x01,0xdc,0x95,0xfe,0xba,0x00,0x00,0x01,0x00,0x75,0x04,0x7c,0x04,0x54,0x06,0x58,0x00,0x09,0x00,0x27,0x40,0x12,0x00,0xea,0x09,0x09,0x05,0x02,0x02,0x06,0xea,0x05,\r\n0x01,0x07,0xbe,0x04,0x09,0x05,0x05,0x04,0x00,0x2f,0x33,0x2f,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x33,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x11,0x02,0xb8,0x01,0x9c,0xfc,0x21,0x95,0x01,0x19,0x06,0x57,0xfe,0xba,0x95,0x01,0xdc,0xfe,0xb9,0x01,0x46,0x00,0x00,0x01,0x00,0x00,0xfd,0xff,\r\n0x03,0x57,0x02,0x5e,0x00,0x23,0x00,0x34,0xb1,0x05,0x1f,0xb8,0x05,0x0a,0x40,0x09,0x16,0x1f,0x05,0x02,0x2f,0x1b,0x01,0x1b,0x11,0xb8,0x04,0xfb,0xb6,0x1f,0x0b,0x2f,0x0b,0x02,0x0b,0x00,0xba,0x04,0xfb,0x00,0x02,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x31,0x30,0x25,0x15,0x23,0x22,\r\n0x26,0x27,0x07,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x03,0x57,0x16,0x3f,0x4a,0x19,0x05,0x44,0x78,0xa5,0x61,0x33,0x6c,0x39,0x7c,0x59,0x55,0x74,0x45,0x1e,0x13,0x1f,0x29,0x16,0xa1,0x1d,0x2c,0x0e,0x06,0x1c,0x30,0x49,0x99,0xa7,0x24,0x21,0x01,\r\n0x8c,0xd5,0x8e,0x48,0x16,0x17,0xa5,0x27,0x3d,0x6c,0x92,0x56,0x4b,0x8e,0x88,0x83,0x3f,0x4b,0xa0,0x51,0x23,0x34,0x22,0x10,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0x07,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,\r\n0x00,0x07,0x0f,0x53,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0xb9,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xaf,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,\r\n0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x90,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0xf2,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xe1,0x04,0x31,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x09,0xf7,0x65,\r\n0x00,0x0a,0xb4,0x01,0x2f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xfb,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf2,0xfe,0x00,0x00,0x06,0x0f,0x50,0xce,0x05,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0x07,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9a,\r\n0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x1f,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9a,0x03,0x57,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x04,0xbc,0x02,0x26,0x0b,0x0c,\r\n0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0x9a,0xfc,0xd3,0xff,0xff,0x00,0xab,0xff,0xea,0x03,0x57,0x03,0xce,0x02,0x06,0x09,0x28,0x00,0x00,0xff,0xff,0x00,0xa1,0xff,0xf2,0x04,0x02,0x03,0xd7,0x02,0x06,0x08,0xf3,0x00,0x00,0x00,0x03,0x00,0x79,0xfe,0x1e,0x06,0xf3,0x06,0x02,0x00,0x13,0x00,0x37,0x00,0x3b,0x00,0x1f,0x40,0x0e,0x28,0x23,\r\n0x37,0x0a,0x00,0x23,0x00,0x23,0x00,0x38,0x3a,0x00,0x38,0x1b,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xd6,0xcd,0x11,0x33,0x31,0x30,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x13,0x26,0x26,0x35,0x34,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x15,0x36,0x33,0x32,0x1e,0x02,0x15,\r\n0x14,0x0e,0x04,0x15,0x14,0x16,0x17,0x13,0x09,0x02,0x03,0x91,0x16,0x26,0x1c,0x10,0x11,0x1d,0x25,0x15,0x16,0x26,0x1d,0x10,0x12,0x1d,0x26,0x5b,0x08,0x13,0x2b,0x40,0x4b,0x40,0x2b,0x34,0x57,0x72,0x3e,0x87,0x7c,0x67,0x89,0x24,0x40,0x30,0x1c,0x2a,0x3e,0x49,0x3e,0x2a,0x0c,0x0b,0x78,0xfc,0xc3,0x03,0x3d,0x03,0x3d,0x89,0x12,0x1d,\r\n0x25,0x14,0x15,0x26,0x1d,0x11,0x12,0x1d,0x26,0x14,0x16,0x26,0x1c,0x10,0x01,0x63,0x15,0x3d,0x25,0x2d,0x49,0x45,0x44,0x4f,0x5f,0x3d,0x40,0x60,0x40,0x21,0x54,0x9e,0x6d,0x12,0x24,0x35,0x22,0x2e,0x4d,0x46,0x43,0x4a,0x54,0x34,0x22,0x43,0x15,0xfd,0x44,0x03,0xf2,0x03,0xf2,0xfc,0x0e,0x00,0x00,0x01,0x00,0x3f,0x04,0xc1,0x03,0x26,\r\n0x05,0xba,0x00,0x17,0x00,0x1e,0x40,0x0e,0x0c,0x00,0x0d,0x07,0x96,0x12,0x12,0x17,0x96,0x0c,0x0f,0x02,0x01,0x02,0x00,0x2f,0x5d,0x33,0xed,0x32,0x2f,0xed,0x01,0x2f,0xc4,0xcd,0x31,0x30,0x01,0x15,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x03,0x26,0x29,0x3f,0x88,0x81,0x71,0x29,\r\n0x16,0x22,0x18,0x0c,0x80,0x18,0x33,0x53,0x3a,0x38,0x7e,0x7f,0x7d,0x37,0x05,0x40,0x7f,0x26,0x2e,0x26,0x13,0x21,0x2d,0x19,0x2f,0x5a,0x46,0x2a,0x26,0x2e,0x26,0x00,0xff,0xff,0x00,0x5e,0xff,0x3f,0x06,0x25,0x05,0xb2,0x02,0x06,0x00,0x34,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x29,0x04,0x10,0x04,0x18,0x02,0x06,0x00,0x54,0x00,0x00,\r\n0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x02,0x06,0x00,0x3a,0x00,0x00,0xff,0xff,0x00,0x18,0x00,0x00,0x05,0xb0,0x04,0x00,0x02,0x06,0x00,0x5a,0x00,0x00,0x00,0x01,0x00,0xb0,0xff,0xe8,0x04,0x9d,0x05,0xb1,0x00,0x36,0x00,0x57,0x40,0x2e,0x29,0x7d,0x16,0x2f,0x7d,0x0b,0x2c,0x11,0x16,0x01,0x11,0x16,0x0b,0x0b,0x16,0x11,\r\n0x01,0x04,0x38,0x1d,0x7e,0x1e,0x2c,0x10,0x11,0x11,0x10,0x92,0x59,0x11,0x11,0x06,0x24,0x34,0x06,0x91,0x59,0x34,0x13,0x24,0x19,0x91,0x59,0x24,0x04,0x1e,0x00,0x2f,0x3f,0x2b,0x00,0x18,0x3f,0x2b,0x11,0x12,0x00,0x39,0x18,0x2f,0x2b,0x11,0x12,0x00,0x39,0x01,0x18,0x2f,0xe1,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,\r\n0xe1,0x10,0xe1,0x31,0x30,0x25,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x04,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x01,0xf6,0x17,0x3a,0x3e,0x40,0x1d,0x3c,0x62,0x46,0x27,0x37,0x71,\r\n0xab,0x74,0x4c,0x7a,0x56,0x2f,0x84,0x77,0x8e,0x90,0xa8,0x4f,0x83,0xa8,0x59,0x5e,0x99,0x6d,0x3b,0x9c,0x98,0x01,0xaf,0x43,0x74,0x9e,0x5c,0x56,0x72,0x0d,0xad,0x0c,0x15,0x11,0x09,0x21,0x40,0x61,0x40,0x41,0x6e,0x54,0x34,0x07,0x7a,0x09,0x2b,0x45,0x61,0x3f,0x66,0x63,0x8d,0x9d,0xfc,0x0f,0x04,0x09,0x79,0xa2,0x63,0x2a,0x2f,0x57,\r\n0x78,0x4a,0x86,0xae,0x29,0x05,0x47,0xfe,0xb3,0x5b,0x93,0x66,0x37,0x16,0xff,0xff,0xfc,0x8c,0x04,0xa7,0xff,0x4c,0x07,0x68,0x00,0x07,0x00,0x0d,0xfc,0x40,0x01,0xce,0xff,0xff,0x00,0x4a,0xff,0xec,0x06,0xd9,0x05,0xb0,0x00,0x26,0x00,0xf0,0xfa,0x00,0x00,0x27,0x00,0xbc,0x03,0x03,0x00,0x00,0x01,0x07,0x00,0xf2,0x04,0x4b,0xfd,0xb9,\r\n0x00,0x07,0xb2,0x02,0x30,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x8d,0xff,0xec,0x06,0xd7,0x05,0xae,0x00,0x26,0x00,0xf1,0x25,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x00,0xf2,0x04,0x49,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x43,0x2d,0x00,0x3f,0x35,0x00,0x00,0x01,0x00,0x96,0x01,0x08,0x06,0x00,0x03,0xa4,0x00,0x09,\r\n0x00,0x1b,0x40,0x0c,0x09,0x08,0x01,0x07,0x03,0x04,0x02,0x05,0x04,0x00,0xbe,0x09,0x00,0x2f,0xed,0x01,0x2f,0x2f,0xcd,0x11,0x17,0x39,0x2f,0x31,0x30,0x01,0x21,0x17,0x15,0x01,0x35,0x01,0x15,0x07,0x21,0x06,0x00,0xfb,0x5a,0x7b,0xfe,0xc1,0x01,0x3f,0x7d,0x04,0xa8,0x02,0x12,0x76,0x94,0x01,0x4c,0x04,0x01,0x4c,0x94,0x78,0x00,0x01,\r\n0x00,0x96,0xff,0xf4,0x03,0x31,0x05,0x5e,0x00,0x09,0x00,0x10,0xb6,0x08,0x01,0x07,0x03,0x03,0x04,0x00,0x00,0x2f,0x2f,0xcd,0x17,0x39,0x31,0x30,0x05,0x11,0x07,0x23,0x01,0x33,0x01,0x23,0x27,0x11,0x01,0xa0,0x77,0x93,0x01,0x4b,0x04,0x01,0x4c,0x93,0x79,0x0c,0x04,0xa4,0x79,0x01,0x3f,0xfe,0xc1,0x7b,0xfb,0x5a,0x00,0x01,0x00,0xe7,\r\n0x01,0x08,0x06,0x52,0x03,0xa4,0x00,0x09,0x00,0x17,0x40,0x0a,0x01,0x02,0x08,0x03,0x07,0x05,0x00,0x09,0xbe,0x00,0x00,0x2f,0xed,0x01,0x2f,0x2f,0xcd,0x17,0x39,0x31,0x30,0x13,0x21,0x27,0x35,0x01,0x15,0x01,0x35,0x37,0x21,0xe7,0x04,0xa6,0x7b,0x01,0x40,0xfe,0xc0,0x79,0xfb,0x5c,0x02,0x98,0x78,0x94,0xfe,0xb4,0x04,0xfe,0xb4,0x94,\r\n0x76,0x00,0x00,0x01,0x00,0x96,0xff,0xf6,0x03,0x31,0x05,0x60,0x00,0x09,0x00,0x10,0xb6,0x09,0x01,0x02,0x08,0x03,0x06,0x05,0x00,0x2f,0xcd,0x17,0x39,0x2f,0x31,0x30,0x01,0x11,0x37,0x33,0x01,0x23,0x01,0x33,0x17,0x11,0x02,0x25,0x79,0x93,0xfe,0xb4,0x04,0xfe,0xb5,0x93,0x77,0x05,0x60,0xfb,0x58,0x7d,0xfe,0xc1,0x01,0x3f,0x7b,0x04,\r\n0xa6,0x00,0x00,0x01,0x00,0x96,0x01,0x08,0x06,0x50,0x03,0xa4,0x00,0x0f,0x00,0x1f,0x40,0x0f,0x01,0x0a,0x0b,0x03,0x00,0x0e,0x09,0x02,0x08,0x03,0x03,0x06,0x02,0xbe,0x09,0x00,0x2f,0xed,0x01,0x2f,0xcd,0x17,0x39,0x2f,0xcd,0x17,0x39,0x31,0x30,0x01,0x37,0x21,0x17,0x15,0x01,0x35,0x01,0x15,0x07,0x21,0x27,0x35,0x01,0x15,0x01,0x05,\r\n0x10,0x79,0xfb,0xd1,0x7b,0xfe,0xc1,0x01,0x3f,0x7d,0x04,0x33,0x7b,0x01,0x40,0xfe,0xc0,0x01,0x9c,0x76,0x76,0x94,0x01,0x4c,0x04,0x01,0x4c,0x94,0x78,0x78,0x94,0xfe,0xb4,0x04,0xfe,0xb4,0xff,0xff,0x00,0x33,0x00,0x00,0x04,0xf8,0x05,0x9a,0x02,0x06,0x00,0xa9,0x00,0x00,0x00,0x01,0x00,0xe6,0x00,0x00,0x04,0x92,0x03,0xac,0x00,0x05,\r\n0x00,0x13,0xb7,0x02,0xbd,0x05,0x03,0x02,0xbe,0x05,0x00,0x00,0x2f,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x31,0x30,0x13,0x33,0x11,0x21,0x15,0x21,0xe6,0x84,0x03,0x28,0xfc,0x54,0x03,0xac,0xfc,0xd7,0x83,0x00,0x01,0x00,0xe6,0x00,0x6a,0x04,0xb7,0x04,0x4f,0x00,0x19,0x00,0x1e,0x40,0x0d,0x13,0x14,0x14,0x1b,0x06,0x07,0x00,0x0d,0x14,0x10,\r\n0x07,0x01,0x07,0x00,0x2f,0x5d,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x12,0x39,0x2f,0xcd,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x02,0xc8,0x48,0x7f,0x5f,0x38,0x84,0x55,0x8a,0xb0,0x5a,0x5d,0xb0,0x88,0x53,0x84,0x3c,0x64,0x83,0x03,0xd1,0x31,0x65,0x9a,\r\n0x69,0xfe,0x32,0x01,0xcf,0x8a,0xc9,0x83,0x40,0x40,0x83,0xc9,0x8a,0xfe,0x31,0x01,0xce,0x66,0x99,0x67,0x33,0x00,0x00,0x03,0x00,0xe6,0x00,0x70,0x04,0xac,0x04,0x3a,0x00,0x13,0x00,0x27,0x00,0x3b,0x00,0x2e,0x40,0x17,0x37,0xaf,0x2d,0x23,0xaf,0x19,0x2d,0x19,0x2d,0x19,0x3d,0x0f,0xaf,0x05,0x28,0xb0,0x32,0x10,0x1e,0x0a,0xb0,0x14,\r\n0x00,0x00,0x2f,0x32,0xed,0x32,0x3f,0xed,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x31,0x30,0x25,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,\r\n0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x55,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x02,0xcf,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0xfe,0x76,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x70,0x12,0x1e,0x29,0x17,0x17,0x29,\r\n0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x02,0xe9,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x01,0x00,0xe6,0x00,0x6a,0x05,0x38,0x04,0x3b,0x00,0x1b,0x00,0x2e,0x40,0x16,0x15,0x0f,0x1a,0x13,\r\n0x16,0xea,0x08,0x05,0x0f,0xbe,0x0e,0x0e,0x07,0x1a,0xbe,0x1b,0x1b,0x16,0x06,0xbe,0x13,0x07,0x00,0x2f,0x33,0xed,0x32,0x32,0x2f,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0xed,0x32,0x2f,0x33,0x33,0x31,0x30,0x25,0x22,0x2e,0x02,0x27,0x23,0x35,0x33,0x3e,0x03,0x33,0x21,0x15,0x21,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x21,\r\n0x15,0x03,0xa8,0x6a,0xb3,0x87,0x53,0x0a,0xc1,0xc1,0x0c,0x5b,0x8a,0xb0,0x60,0x01,0x90,0xfe,0x80,0xad,0xc1,0x11,0x02,0xff,0xfd,0x01,0x11,0xcb,0xc1,0x01,0x62,0x6a,0x37,0x6b,0x9f,0x69,0x84,0x68,0x9d,0x69,0x35,0x84,0x8d,0x92,0x84,0x93,0x93,0x84,0x00,0x01,0x00,0xa5,0x00,0x00,0x06,0x3f,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb3,0x03,\r\n0x02,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x11,0x21,0xa5,0x05,0x9a,0xfa,0x66,0x05,0x9a,0xfa,0x66,0x00,0x01,0x00,0xa5,0x00,0x00,0x07,0x5b,0x04,0xac,0x00,0x03,0x00,0x0d,0xb3,0x03,0x02,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x11,0x21,0xa5,0x06,0xb6,0xf9,0x4a,0x04,0xac,0xfb,0x54,\r\n0x00,0x01,0x00,0x50,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x02,0x00,0x0d,0xb3,0x01,0x02,0x00,0x02,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x01,0x21,0x03,0x72,0x03,0x22,0xf9,0xbc,0x05,0x9a,0xfa,0x66,0x00,0x01,0x00,0xa5,0x01,0x61,0x06,0x3f,0x04,0x39,0x00,0x02,0x00,0x0d,0xb3,0x01,0x00,0x02,0x01,0x00,0x2f,0x2f,0x01,0x2f,\r\n0x2f,0x31,0x30,0x01,0x01,0x11,0x06,0x3f,0xfa,0x66,0x02,0xcd,0xfe,0x94,0x02,0xd8,0x00,0x01,0x00,0x50,0x00,0x00,0x06,0x94,0x05,0x9a,0x00,0x02,0x00,0x0d,0xb3,0x01,0x00,0x02,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x21,0x01,0x50,0x06,0x44,0xfc,0xde,0x05,0x9a,0xfa,0x66,0x00,0x00,0x01,0x00,0xa5,0x01,0x61,0x06,0x3f,\r\n0x04,0x39,0x00,0x02,0x00,0x0d,0xb3,0x01,0x02,0x01,0x00,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x11,0x01,0x06,0x3f,0xfa,0x66,0x04,0x39,0xfd,0x28,0x01,0x6c,0x00,0x02,0x00,0x8c,0xff,0xe7,0x06,0x58,0x05,0xb2,0x00,0x1b,0x00,0x33,0x00,0x15,0xb7,0x0e,0x28,0x1c,0x00,0x21,0x15,0x2f,0x07,0x00,0x2f,0xcd,0x2f,0xcd,0x01,0x2f,\r\n0xcd,0x2f,0xcd,0x31,0x30,0x13,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x04,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x8c,0x35,0x60,0x87,0xa5,0xbe,0x66,0x66,0xbe,0xa5,0x88,0x61,0x35,0x35,0x61,0x88,0xa5,0xbe,0x66,0x67,0xbd,0xa5,0x87,0x60,0x35,0x7c,0x61,\r\n0xa7,0xe1,0x80,0x55,0x9f,0x89,0x71,0x51,0x2c,0x2c,0x51,0x71,0x89,0x9f,0x55,0x80,0xe1,0xa7,0x61,0x02,0xcc,0x66,0xbe,0xa5,0x87,0x61,0x35,0x35,0x61,0x87,0xa5,0xbe,0x66,0x67,0xbd,0xa5,0x87,0x60,0x35,0x35,0x60,0x87,0xa5,0xbe,0x66,0x80,0xe1,0xa7,0x61,0x2c,0x50,0x70,0x8a,0x9e,0x55,0x55,0x9f,0x89,0x71,0x50,0x2c,0x61,0xa8,0xe1,\r\n0x00,0x02,0x02,0x0d,0x00,0x00,0x04,0xd7,0x05,0x9a,0x00,0x03,0x00,0x17,0x00,0x1a,0x40,0x0a,0x0e,0x02,0x04,0x03,0x13,0x09,0x13,0x09,0x03,0x00,0x00,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xcd,0xdd,0xcd,0x31,0x30,0x01,0x21,0x11,0x21,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x02,0x0d,\r\n0x02,0xca,0xfd,0x36,0x64,0x28,0x46,0x5d,0x36,0x35,0x5d,0x46,0x29,0x29,0x46,0x5d,0x35,0x36,0x5d,0x46,0x28,0x05,0x9a,0xfa,0x66,0x02,0xcd,0x35,0x5e,0x46,0x28,0x28,0x46,0x5e,0x35,0x35,0x5e,0x46,0x28,0x28,0x46,0x5e,0x00,0x03,0x00,0xa5,0x00,0x00,0x06,0x3f,0x05,0x9a,0x00,0x03,0x00,0x1d,0x00,0x31,0x00,0x1f,0x40,0x0d,0x1e,0x04,\r\n0x03,0x28,0x12,0x02,0x2d,0x0b,0x03,0x22,0x23,0x17,0x00,0x00,0x2f,0xdd,0xce,0x3f,0xdd,0xce,0x01,0x2f,0xdd,0xce,0x2f,0xdd,0xce,0x31,0x30,0x13,0x21,0x11,0x21,0x13,0x14,0x1e,0x04,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x17,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0xa5,\r\n0x05,0x9a,0xfa,0x66,0x64,0x2c,0x50,0x70,0x89,0x9d,0x55,0x55,0x9f,0x89,0x71,0x51,0x2c,0x61,0xa8,0xe2,0x80,0x55,0x9d,0x89,0x70,0x50,0x2c,0x67,0x51,0x8b,0xba,0x6a,0x6b,0xbc,0x8c,0x51,0x51,0x8c,0xbc,0x6b,0x6a,0xba,0x8b,0x51,0x05,0x9a,0xfa,0x66,0x02,0xcb,0x55,0x9d,0x89,0x70,0x50,0x2c,0x2c,0x50,0x70,0x89,0x9d,0x55,0x80,0xe2,\r\n0xa8,0x61,0x2c,0x51,0x71,0x89,0x9f,0x55,0x6b,0xbc,0x8c,0x51,0x51,0x8c,0xbc,0x6b,0x6a,0xbb,0x8b,0x50,0x50,0x8b,0xbb,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x05,0x1c,0x05,0xb2,0x00,0x2b,0x00,0x1e,0x40,0x0d,0x0f,0x1c,0x1c,0x07,0x24,0x07,0x0c,0x1f,0x1f,0x16,0x22,0x00,0x26,0x00,0x3f,0x3f,0x39,0x2f,0x33,0x01,0x2f,0x2f,0x12,0x39,\r\n0x2f,0xcd,0x31,0x30,0x01,0x1e,0x05,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x1e,0x03,0x17,0x15,0x21,0x35,0x3e,0x03,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x02,0xc1,0x2c,0x7b,0x86,0x84,0x69,0x41,0x34,0x55,0x6d,0x39,0x37,0x63,0x27,0x04,0x15,0x26,0x36,0x25,0xfd,0xee,0x25,0x36,0x26,0x15,0x04,0x27,0x63,\r\n0x37,0x39,0x6d,0x55,0x34,0x41,0x69,0x84,0x86,0x7b,0x2c,0x05,0xb2,0x34,0x6b,0x76,0x82,0x93,0xa6,0x5f,0x52,0x7e,0x55,0x2c,0x1c,0x20,0x22,0x4c,0x4c,0x4a,0x1f,0x4b,0x4b,0x1f,0x4a,0x4c,0x4c,0x22,0x20,0x1c,0x2c,0x55,0x7e,0x52,0x5f,0xa6,0x93,0x82,0x76,0x6c,0x33,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x05,0x1c,0x05,0x9a,0x00,0x38,\r\n0x00,0x1c,0x40,0x0b,0x32,0x06,0x06,0x10,0x28,0x10,0x2d,0x0b,0x0b,0x1c,0x00,0x00,0x2f,0x2f,0x39,0x2f,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x31,0x30,0x21,0x35,0x3e,0x03,0x35,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,\r\n0x23,0x22,0x2e,0x02,0x27,0x14,0x1e,0x02,0x17,0x15,0x01,0xb4,0x1c,0x36,0x2a,0x1a,0x13,0x25,0x2a,0x31,0x1f,0x41,0x73,0x55,0x31,0x2d,0x53,0x73,0x45,0x10,0x2d,0x52,0x72,0x46,0x46,0x72,0x52,0x2d,0x10,0x45,0x73,0x53,0x2d,0x31,0x55,0x73,0x41,0x1f,0x31,0x2a,0x25,0x13,0x19,0x2a,0x36,0x1d,0x4b,0x17,0x46,0x5c,0x72,0x44,0x0d,0x14,\r\n0x0f,0x08,0x2c,0x51,0x74,0x48,0x41,0x71,0x55,0x32,0x01,0x34,0x37,0x40,0x73,0x55,0x32,0x32,0x55,0x73,0x40,0x37,0x34,0x01,0x32,0x55,0x71,0x41,0x48,0x74,0x51,0x2c,0x08,0x0f,0x14,0x0d,0x44,0x72,0x5c,0x46,0x17,0x4b,0x00,0x01,0x00,0x5e,0x00,0x78,0x05,0x1c,0x05,0x23,0x00,0x23,0x00,0x0d,0xb3,0x05,0x14,0x19,0x0c,0x00,0x2f,0x2f,\r\n0x01,0x2f,0x2f,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x07,0x23,0x2e,0x05,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x3e,0x03,0x03,0xea,0x3b,0x6f,0x55,0x33,0x40,0x68,0x83,0x86,0x7d,0x2d,0x09,0x2d,0x7c,0x86,0x83,0x68,0x40,0x33,0x55,0x6f,0x3b,0x39,0x5b,0x49,0x37,0x14,0x09,0x14,0x38,0x49,0x5b,0x05,0x23,\r\n0x2b,0x57,0x84,0x5a,0x64,0xad,0x98,0x85,0x79,0x6f,0x35,0x35,0x6f,0x79,0x85,0x98,0xad,0x64,0x5a,0x84,0x57,0x2b,0x1e,0x33,0x41,0x22,0x22,0x41,0x33,0x1e,0x00,0x01,0x00,0xcd,0x00,0x00,0x04,0xae,0x05,0x9a,0x00,0x03,0x00,0x0d,0xb3,0x02,0x00,0x03,0x01,0x00,0x2f,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x13,0x09,0x02,0xcd,0x01,0xf0,0x01,\r\n0xf1,0xfe,0x0f,0x02,0xcc,0x02,0xce,0xfd,0x32,0xfd,0x34,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x2c,0x05,0xb2,0x00,0x16,0x00,0x2d,0x00,0x2d,0x40,0x17,0x13,0x12,0x7e,0x10,0x28,0x28,0x2f,0x1c,0x7d,0x05,0x13,0x10,0x03,0x17,0x91,0x0f,0x0a,0x04,0x21,0x91,0x14,0x00,0x13,0x00,0x3f,0x32,0xed,0x3f,0x33,0xed,0x3f,0x2f,0x01,0x2f,\r\n0xe1,0x12,0x39,0x2f,0x33,0xe1,0x33,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x11,0x23,0x35,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x11,0x34,0x2e,0x02,0x02,0xb9,0x86,0xde,0x9f,0x58,0x5c,0xaa,0xef,0x94,0x4e,0x80,0x66,0x4d,0x1c,0xa8,\r\n0xa8,0x40,0xe1,0x80,0x6c,0xad,0x7a,0x42,0x42,0x79,0xa9,0x66,0x33,0x67,0x5f,0x53,0x3d,0x23,0x3b,0x6e,0x99,0x18,0x6a,0xbf,0x01,0x0b,0xa0,0xac,0x01,0x18,0xc6,0x6c,0x21,0x39,0x4b,0x2a,0xb7,0xfa,0x66,0xd6,0x6d,0x81,0x05,0x32,0x56,0x9c,0xd9,0x84,0x84,0xd9,0x9a,0x55,0x13,0x2c,0x48,0x6a,0x90,0x5d,0x01,0x0d,0x6c,0xa2,0x6c,0x36,\r\n0xff,0xff,0x00,0x0e,0x00,0x00,0x04,0x9a,0x04,0x18,0x02,0x06,0x05,0xef,0x00,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x08,0x74,0x05,0xb2,0x00,0x2c,0x00,0x54,0x40,0x2b,0x25,0x24,0x1c,0x2c,0x01,0x00,0x19,0x15,0x14,0x06,0x0a,0x09,0x10,0x24,0x2c,0x19,0x06,0x10,0x10,0x06,0x19,0x2c,0x24,0x05,0x2e,0x0c,0x0b,0x27,0x92,0x40,0x25,0x80,\r\n0x21,0x04,0x14,0x05,0x0b,0x03,0x18,0x0f,0x01,0x0a,0x12,0x00,0x3f,0x33,0x33,0x33,0x3f,0x33,0x33,0x3f,0x1a,0xcc,0x1a,0xed,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,\r\n0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x13,0x3e,0x03,0x33,0x32,0x16,0x17,0x23,0x26,0x23,0x22,0x0e,0x02,0x07,0x05,0xcb,0xc5,0xfe,0xd9,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x14,0x04,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x05,0x16,0xe1,\r\n0x12,0x32,0x45,0x5c,0x3c,0x69,0x79,0x0b,0x9a,0x0c,0x47,0x16,0x23,0x1b,0x17,0x0b,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x35,0x55,0x03,0x54,0x46,0x68,0x44,0x22,0x79,0x79,0x63,0x16,0x29,0x3d,0x27,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x06,0x97,\r\n0x04,0x18,0x00,0x2c,0x00,0x54,0x40,0x2b,0x0a,0x09,0x11,0x15,0x14,0x06,0x01,0x00,0x19,0x1d,0x2c,0x26,0x25,0x11,0x06,0x19,0x2c,0x25,0x25,0x2c,0x19,0x06,0x11,0x05,0x2e,0x0c,0x0b,0x29,0x95,0x40,0x26,0x80,0x22,0x10,0x14,0x05,0x0b,0x0f,0x18,0x10,0x01,0x0a,0x15,0x00,0x3f,0x33,0x33,0x33,0x3f,0x33,0x33,0x3f,0x1a,0xcc,0x1a,0xed,\r\n0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x31,0x30,0x21,0x23,0x03,0x26,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x3e,0x03,0x33,0x32,0x16,0x17,0x23,0x26,\r\n0x26,0x23,0x22,0x06,0x07,0x04,0x7d,0xaa,0xd3,0x06,0x08,0x02,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x05,0x07,0x02,0x08,0x03,0x0f,0xec,0x96,0xd4,0x0b,0x04,0x08,0x01,0x09,0x07,0x9a,0x0d,0x26,0x38,0x4e,0x35,0x5b,0x6b,0x0b,0x96,0x04,0x23,0x1c,0x21,0x2a,0x14,0x02,0xdd,0x15,0x30,0x1a,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,\r\n0xfe,0x11,0x2e,0x1d,0x2d,0x31,0x03,0x00,0xfc,0xfc,0x26,0x36,0x14,0x2e,0x1a,0x02,0x46,0x32,0x4f,0x38,0x1d,0x6d,0x6f,0x2a,0x2a,0x3f,0x46,0x00,0x00,0x01,0x00,0x96,0x03,0x82,0x03,0x31,0x05,0xd3,0x00,0x09,0x00,0x0d,0xb3,0x09,0x00,0x00,0x04,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x01,0x11,0x07,0x23,0x01,0x33,0x01,0x23,0x27,\r\n0x11,0x01,0xa0,0x77,0x93,0x01,0x4b,0x04,0x01,0x4c,0x93,0x79,0x03,0x82,0x01,0x8b,0x79,0x01,0x3f,0xfe,0xc1,0x7b,0xfe,0x73,0x00,0x01,0x00,0x96,0x03,0x82,0x03,0x31,0x05,0xd3,0x00,0x09,0x00,0x0d,0xb3,0x00,0x09,0x04,0x09,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x01,0x11,0x37,0x33,0x01,0x23,0x01,0x33,0x17,0x11,0x02,0x25,0x79,\r\n0x93,0xfe,0xb4,0x04,0xfe,0xb5,0x93,0x77,0x05,0xd3,0xfe,0x73,0x7b,0xfe,0xc1,0x01,0x3f,0x79,0x01,0x8b,0x00,0x02,0x00,0xb4,0x03,0x83,0x01,0x92,0x06,0x89,0x00,0x03,0x00,0x0f,0x00,0x20,0x40,0x0f,0x00,0x03,0x03,0x0d,0x07,0x02,0x50,0x0a,0x01,0x0a,0x00,0x04,0x01,0x04,0x03,0x00,0x2f,0xd4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,\r\n0x2f,0xcd,0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x77,0x13,0x87,0x12,0x58,0x2e,0x41,0x41,0x2e,0x2d,0x42,0x42,0x06,0x89,0xfe,0x2d,0x01,0xd3,0xfc,0xfa,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x00,0x02,0x00,0xb4,0x03,0x83,0x01,0x92,0x06,0x89,0x00,0x03,0x00,0x0f,\r\n0x00,0x20,0x40,0x0f,0x03,0x00,0x00,0x07,0x0d,0x02,0x5f,0x0a,0x01,0x0a,0x00,0x03,0x01,0x03,0x04,0x00,0x2f,0xc4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x31,0x30,0x13,0x13,0x33,0x13,0x03,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xcb,0x12,0x87,0x13,0x54,0x2d,0x42,0x42,0x2d,0x2e,0x41,0x41,0x03,0x83,\r\n0x01,0xd3,0xfe,0x2d,0x03,0x06,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x02,0x00,0xb4,0x01,0xd5,0x01,0x92,0x04,0xdb,0x00,0x03,0x00,0x0f,0x00,0x23,0x40,0x0f,0x03,0x00,0x00,0x07,0x0d,0x01,0x5f,0x0a,0x01,0x0a,0x00,0x00,0x01,0x00,0x04,0xb8,0x01,0x3a,0x00,0x3f,0xc4,0x5d,0xdd,0x5d,0xce,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x31,\r\n0x30,0x13,0x13,0x33,0x13,0x03,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0xcb,0x12,0x87,0x13,0x54,0x2d,0x42,0x42,0x2d,0x2e,0x41,0x41,0x01,0xd5,0x01,0xd3,0xfe,0x2d,0x03,0x06,0x40,0x2e,0x2e,0x41,0x41,0x2e,0x2e,0x40,0x00,0x00,0x01,0x00,0x63,0xfe,0x3e,0x02,0x95,0xff,0x89,0x00,0x06,0x00,0x18,0x40,0x0c,0x00,0x04,\r\n0x04,0x80,0x0f,0x05,0x1f,0x05,0x2f,0x05,0x03,0x05,0x00,0x2f,0x5d,0x1a,0xcd,0x01,0x2f,0xc4,0x31,0x30,0x01,0x23,0x27,0x07,0x23,0x13,0x33,0x02,0x95,0x78,0xa4,0xa6,0x70,0xd6,0x86,0xfe,0x3e,0xe5,0xe5,0x01,0x4b,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x02,0x06,0x00,0x1d,0x00,0x00,0x00,0x02,0x00,0xe8,0x01,0x3e,\r\n0x03,0x9a,0x03,0x6c,0x00,0x03,0x00,0x07,0x00,0x1a,0x40,0x0b,0x00,0x01,0x04,0x05,0x04,0x05,0xbe,0x06,0x01,0xbe,0x02,0x00,0x2f,0xed,0xd6,0xed,0x01,0x2f,0x2f,0x11,0x39,0x39,0x31,0x30,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x9a,0xfd,0x4e,0x02,0xb2,0xfd,0x4e,0x02,0xb2,0x02,0xe8,0x84,0xfd,0xd2,0x84,0x00,0x01,0x00,0x94,\r\n0x02,0xc3,0x01,0x43,0x05,0x9a,0x00,0x03,0x00,0x1c,0x40,0x0e,0x00,0x7d,0x03,0x04,0x0d,0x06,0x4d,0x03,0x03,0x05,0x04,0x01,0x00,0x03,0x00,0x3f,0xcd,0x11,0x12,0x01,0x39,0x2f,0x2b,0xe1,0x31,0x30,0x01,0x03,0x23,0x03,0x01,0x43,0x1e,0x73,0x1e,0x05,0x9a,0xfd,0x29,0x02,0xd7,0x00,0xff,0xff,0x00,0xa3,0x03,0xdb,0x01,0x34,0x05,0x9a,\r\n0x02,0x06,0x00,0x0a,0x00,0x00,0x00,0x01,0x03,0x9b,0xfe,0x80,0x04,0x36,0x00,0x00,0x00,0x03,0x00,0x0d,0xb3,0x01,0x00,0x03,0x00,0x00,0x2f,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x21,0x33,0x11,0x23,0x03,0x9b,0x9b,0x9b,0xfe,0x80,0x00,0x00,0x01,0x02,0xd6,0xfe,0x8a,0x03,0x64,0x00,0x00,0x00,0x03,0x00,0x0d,0xb3,0x01,0x00,0x03,0x00,0x00,\r\n0x2f,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x21,0x33,0x11,0x23,0x02,0xd6,0x8e,0x8e,0xfe,0x8a,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x00,0xb9,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x2f,0xb9,0x00,0x00,0x01,0x51,0xb2,0x06,0x06,0x0c,0xb8,0x01,0x51,0xb3,0x12,0x12,0x19,0x03,0xbb,0x01,0x55,0x00,0x09,0x00,0x0f,0x01,0x55,0xb2,0x15,0x15,0x19,\r\n0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x01,0x33,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x35,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0x5a,0x2a,0x31,0x2f,0x2c,\r\n0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x05,0x00,0x00,0xfd,0xff,0x02,0xdd,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x00,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x35,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x14,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x10,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x33,0x29,0x2a,0x33,0x31,\r\n0x2a,0x2a,0x34,0xfe,0x67,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0xe2,\r\n0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x37,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0xb8,0x01,0x51,0xb7,0x06,0x1b,0x1a,0x18,0x1b,0x1b,0x09,0x0f,0xbb,0x01,0x55,0x00,0x15,0x00,0x03,0x01,0x55,0xb2,0x09,0x09,0x1d,0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xcd,0x01,0x2f,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,\r\n0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x21,0x35,0x21,0x02,0xdd,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xce,0xfe,0x50,0x01,0xb0,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,\r\n0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb1,0x66,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0xe1,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x1f,0x00,0x40,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0xb8,0x01,0x51,0x40,0x0c,0x06,0x1f,0x19,0x1e,0x1c,0x1c,0x1a,0x19,0x1f,0x1f,0x09,0x0f,0xbb,0x01,0x55,0x00,0x15,0x00,0x03,0x01,0x55,0xb2,\r\n0x09,0x09,0x21,0x11,0x00,0x33,0x2f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xdd,0xcd,0x33,0x01,0x2f,0xcd,0xdd,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x25,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x02,0xdd,0x33,0x29,\r\n0x2a,0x33,0x31,0x2a,0x2a,0x34,0x04,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xcf,0xa5,0x66,0xa5,0x01,0xb0,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xfe,0xce,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb1,0xdf,0xdf,0x66,0x00,0x00,0x01,0x00,0x00,0xff,0x04,0x00,0xb9,0xff,0xbb,0x00,0x0b,0x00,0x1d,0xb9,0x00,0x00,0x01,0x51,0xb3,\r\n0x06,0x06,0x0d,0x03,0xb8,0x01,0x55,0xb2,0x09,0x09,0x0d,0x11,0x00,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xed,0x30,0x31,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x02,0x00,0x00,0xff,0x04,0x01,0xd6,0xff,0xbb,0x00,0x0b,\r\n0x00,0x17,0x00,0x2f,0xbc,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x0c,0x01,0x51,0xb3,0x12,0x12,0x19,0x03,0xb8,0x01,0x55,0xb2,0x09,0x09,0x0f,0xb8,0x01,0x55,0xb2,0x15,0x15,0x19,0x11,0x00,0x33,0x2f,0xed,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,0xed,0x30,0x31,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,\r\n0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0xd6,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xe3,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x01,0xd6,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,\r\n0x00,0x45,0xb9,0x00,0x00,0x01,0x51,0xb3,0x06,0x06,0x1e,0x0c,0xbb,0x01,0x51,0x00,0x12,0x00,0x18,0x01,0x51,0xb3,0x1e,0x1e,0x25,0x03,0xbe,0x01,0x55,0x00,0x09,0x00,0x1b,0x01,0x55,0x00,0x21,0x00,0x0f,0x01,0x55,0xb4,0x15,0x15,0x21,0x21,0x25,0x11,0x00,0x33,0x2f,0x33,0x2f,0xed,0x10,0xfd,0xde,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,\r\n0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x37,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x48,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x8e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0xe3,\r\n0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xfe,0x5a,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0x00,0x00,0xff,0x38,0x01,0xb0,0xff,0x9e,0x00,0x03,0x00,0x11,0xb5,0x00,0x02,0x00,0x02,0x02,0x05,0x11,0x00,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x30,\r\n0x31,0x05,0x21,0x35,0x21,0x01,0xb0,0xfe,0x50,0x01,0xb0,0xc8,0x66,0x00,0x00,0x01,0x00,0x00,0xfe,0x59,0x01,0xb0,0xff,0x9e,0x00,0x07,0x00,0x1a,0x40,0x0a,0x07,0x01,0x06,0x04,0x02,0x01,0x04,0x06,0x06,0x09,0x11,0x00,0x33,0x2f,0xdd,0x32,0xcd,0x01,0x2f,0xcd,0xdd,0xcd,0x30,0x31,0x05,0x23,0x15,0x23,0x35,0x23,0x35,0x21,0x01,0xb0,\r\n0xa5,0x66,0xa5,0x01,0xb0,0xc8,0xdf,0xdf,0x66,0x00,0x00,0x01,0xff,0xa4,0x05,0x4e,0x00,0x5d,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5d,0x33,0x29,0x2a,0x33,\r\n0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0x00,0x00,0xfd,0xff,0x02,0x77,0xff,0xbb,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3d,0xbf,0x00,0x18,0x01,0x51,0x00,0x1e,0x00,0x0c,0x01,0x51,0x00,0x12,0x00,0x00,0x01,0x51,0xb3,0x06,0x06,0x25,0x1b,0xbe,0x01,0x55,0x00,0x21,0x00,0x0f,0x01,0x55,0x00,\r\n0x15,0x00,0x03,0x01,0x55,0xb2,0x09,0x09,0x25,0x11,0x00,0x33,0x2f,0xed,0xdc,0xed,0xdc,0xed,0x11,0x01,0x33,0x2f,0xfd,0xde,0xfd,0xde,0xed,0x30,0x31,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xdf,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xdf,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa1,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xaf,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xb0,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xff,0xa5,0x02,0x18,0x00,0x5e,0x02,0xcf,0x00,0x0b,\r\n0x00,0x15,0xbd,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x00,0x2f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x02,0x73,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0xcd,0xfe,0x09,0x00,0x33,0xff,0xb1,\r\n0x00,0x03,0x00,0x11,0xb5,0x03,0x02,0x00,0x03,0x03,0x05,0x11,0x00,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x13,0x23,0x11,0x33,0x33,0x66,0x66,0xfe,0x09,0x01,0xa8,0x00,0x01,0x00,0x4b,0x04,0x38,0x02,0xe8,0x04,0xcd,0x00,0x03,0x00,0x14,0xb5,0x03,0x05,0x02,0x04,0x01,0x03,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x11,0x01,0x33,0x11,0x33,\r\n0x30,0x31,0x01,0x21,0x37,0x21,0x02,0xd0,0xfd,0x7b,0x18,0x02,0x85,0x04,0x38,0x95,0x00,0x01,0xfe,0xd2,0x05,0x6b,0x01,0x31,0x05,0xd5,0x00,0x03,0x00,0x0d,0xb3,0x03,0x01,0x03,0x01,0x00,0x2f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x01,0x21,0x35,0x21,0x01,0x31,0xfd,0xa1,0x02,0x5f,0x05,0x6b,0x6a,0x00,0x01,0x00,0x94,0xff,0x9d,0x01,0x09,\r\n0x05,0x30,0x00,0x03,0x00,0x15,0xbd,0x00,0x03,0x01,0x50,0x00,0x02,0x00,0x03,0x01,0x4b,0x00,0x00,0x00,0x2f,0x3f,0x01,0x2f,0xed,0x30,0x31,0x05,0x23,0x11,0x33,0x01,0x09,0x75,0x75,0x63,0x05,0x93,0x00,0x01,0x02,0x00,0x05,0x4e,0x02,0xb9,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,\r\n0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x02,0xb9,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xfd,0x3c,0x05,0x4e,0xfd,0xf5,0x06,0x05,0x00,0x0b,0x00,0x17,0xbe,0x00,0x00,0x01,0x51,0x00,0x06,0x00,\r\n0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xfd,0xf5,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x36,0x40,0x12,\r\n0x00,0xb0,0x06,0x10,0x12,0xb0,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0xff,0x9c,0x05,0x77,0x00,0x67,0x06,0x40,0x00,0x0b,0x00,0x17,0xbe,0x00,\r\n0x00,0x01,0x51,0x00,0x06,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x67,0x38,0x2d,0x2e,0x38,0x36,0x2e,0x2e,0x39,0x05,0xdb,0x2e,0x36,0x34,0x30,0x2e,0x37,0x34,0x00,0x00,0x01,0xff,0x9c,0xfe,0x8d,0x00,0x67,0xff,0x56,0x00,0x0b,\r\n0x00,0x19,0xbc,0x00,0x00,0x01,0x51,0x00,0x06,0x00,0x03,0x01,0x57,0xb2,0x09,0x09,0x0d,0x11,0x00,0x33,0x2f,0xed,0x01,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x67,0x38,0x2d,0x2e,0x38,0x36,0x2e,0x2e,0x39,0xfe,0xf1,0x2e,0x36,0x34,0x30,0x2e,0x37,0x34,0x00,0x00,0x01,0x00,0xa5,0x00,0x00,\r\n0x04,0x9a,0x04,0xd4,0x00,0x28,0x00,0x51,0x40,0x0b,0x1e,0x28,0x17,0x00,0x15,0x08,0x16,0x01,0x01,0x00,0x23,0xb8,0x01,0x50,0xb7,0x20,0x20,0x0f,0x2a,0x17,0x16,0x16,0x0e,0xb8,0x01,0x50,0x40,0x0a,0x0f,0x15,0x08,0x1e,0x28,0x04,0x16,0x17,0x17,0x21,0xbb,0x01,0x4a,0x00,0x0f,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0x2f,0x33,\r\n0x17,0x39,0x01,0x2f,0xed,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0xed,0xc4,0x32,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x31,0x30,0x21,0x23,0x2e,0x05,0x27,0x0e,0x03,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x37,0x03,0x37,0x1e,0x03,0x17,0x16,0x17,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x07,0x04,0x9a,0xc5,0x2f,0x51,0x4b,0x4a,0x54,\r\n0x61,0x3c,0x28,0x32,0x1c,0x09,0xa9,0x17,0x34,0x52,0x3c,0xdb,0x8e,0x2d,0x5a,0x54,0x4e,0x22,0x4f,0x46,0xae,0xaa,0x21,0x41,0x61,0x41,0x45,0x75,0x6e,0x6c,0x77,0x88,0x53,0x27,0x4c,0x51,0x5d,0x38,0xfe,0x73,0x01,0x98,0x4c,0x77,0x68,0x5f,0x33,0x01,0x38,0x47,0x3c,0x79,0x74,0x6d,0x30,0x70,0x66,0x63,0xd5,0x01,0x5d,0xfe,0xc1,0x52,\r\n0x85,0x6d,0x5a,0x29,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x3c,0x04,0xde,0x00,0x24,0x00,0x38,0xb2,0x07,0x07,0x00,0xb8,0x01,0x50,0xb7,0x06,0x12,0x12,0x26,0x09,0x19,0x19,0x16,0x41,0x09,0x01,0x54,0x00,0x1a,0x00,0x1f,0x01,0x4b,0x00,0x06,0x00,0x0a,0x01,0x54,0x00,0x09,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,\r\n0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x07,0x21,0x07,0x21,0x37,0x21,0x32,0x3e,0x04,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xee,0x17,0x28,0x38,0x20,0x34,0x01,0x19,0x16,0xfc,0x2e,0x18,0x01,0xa6,0x44,0x62,0x44,0x29,0x17,0x07,0xc0,0xb0,0x69,\r\n0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,0x8f,0x4f,0x02,0x66,0x54,0x7b,0x5d,0x47,0x1f,0x32,0xa2,0xa2,0x33,0x52,0x65,0x64,0x59,0x1b,0x86,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x01,0x00,0x31,0x00,0x00,0x03,0x17,0x04,0xcd,0x00,0x25,0x00,0x43,0xb3,0x17,0x02,0x02,0x00,0xb8,0x01,0x50,\r\n0xb6,0x01,0x01,0x0b,0x27,0x1e,0x1e,0x0a,0xbb,0x01,0x50,0x00,0x0b,0x00,0x02,0x01,0x56,0xb3,0x17,0x17,0x00,0x1e,0xbd,0x01,0x54,0x00,0x1f,0x01,0x4a,0x00,0x0b,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x33,0x11,0x33,0x31,0x30,0x21,0x23,0x03,0x06,0x06,\r\n0x07,0x0e,0x03,0x07,0x23,0x36,0x37,0x3e,0x03,0x37,0x3e,0x03,0x37,0x03,0x2e,0x03,0x23,0x23,0x37,0x33,0x32,0x1e,0x02,0x17,0x03,0x17,0xa1,0x28,0x4d,0x7b,0x28,0x19,0x29,0x20,0x18,0x0a,0xa9,0x13,0x19,0x0b,0x18,0x1c,0x1f,0x10,0x24,0x54,0x61,0x6b,0x3a,0x1b,0x06,0x2a,0x44,0x5b,0x38,0xc5,0x16,0xaa,0x62,0x99,0x6d,0x3f,0x07,0x01,\r\n0xe0,0x14,0x4e,0x2f,0x1d,0x4f,0x59,0x5e,0x2c,0x4d,0x47,0x1e,0x41,0x3f,0x38,0x15,0x2f,0x45,0x35,0x29,0x13,0x01,0x0e,0x36,0x4c,0x31,0x17,0x91,0x24,0x51,0x84,0x60,0x00,0x01,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x00,0x14,0x00,0x2d,0xb1,0x04,0x14,0xb8,0x01,0x50,0x40,0x09,0x00,0x0c,0x00,0x0c,0x16,0x0a,0x0e,0x04,0x0a,0xbc,\r\n0x01,0x54,0x00,0x0b,0x01,0x4a,0x00,0x00,0x01,0x4d,0x00,0x3f,0x3f,0xed,0x32,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x31,0x30,0x21,0x11,0x34,0x36,0x37,0x22,0x0e,0x02,0x23,0x21,0x37,0x21,0x07,0x23,0x22,0x0e,0x02,0x15,0x11,0x02,0x2e,0x42,0x39,0x0c,0x26,0x27,0x23,0x0a,0xfd,0xfd,0x18,0x03,0x73,0x19,0x37,0x28,0x33,\r\n0x1e,0x0b,0x03,0x32,0x5b,0x81,0x30,0x02,0x02,0x02,0x95,0x95,0x29,0x3e,0x46,0x1e,0xfc,0x93,0x00,0x02,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x00,0x17,0x00,0x1b,0x00,0x38,0xb9,0x00,0x00,0x01,0x50,0xb3,0x01,0x01,0x1d,0x18,0xb8,0x01,0x50,0xb5,0x19,0x0c,0x0c,0x19,0x0c,0x07,0xb8,0x01,0x54,0xb2,0x1b,0x0d,0x12,0xbb,0x01,0x4b,\r\n0x00,0x19,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0xc4,0xed,0x32,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x01,0x23,0x11,0x37,0x04,0xc0,0xab,0x34,0x61,0x8d,0x59,0x3a,0x86,0x83,0x75,0x2a,0x13,0x30,0x73,\r\n0x7f,0x88,0x46,0x6e,0xbc,0x8c,0x4f,0xfc,0xae,0xa9,0xa9,0x02,0xea,0x65,0x88,0x52,0x22,0x0c,0x13,0x17,0x0a,0xa5,0x09,0x10,0x0d,0x08,0x36,0x77,0xba,0x84,0xfd,0x0d,0x02,0xc9,0x51,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x17,0xbe,0x00,0x00,0x01,0x50,0x00,0x01,0x00,0x00,0x01,0x4d,0x00,0x02,0x01,\r\n0x4a,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x04,0xcd,0x00,0x00,0x01,0x00,0x31,0x00,0x00,0x02,0x5f,0x04,0xcd,0x00,0x20,0x00,0x2a,0xb4,0x18,0x0c,0x00,0x00,0x06,0xb8,0x01,0x50,0xb4,0x1e,0x0d,0x13,0x00,0x1e,0xbc,0x01,0x54,0x00,0x1f,0x01,0x4a,0x00,0x0c,0x01,0x4d,0x00,0x3f,0x3f,0xed,\r\n0x32,0x01,0x2f,0x33,0xc6,0xed,0x32,0x2f,0x32,0x32,0x31,0x30,0x01,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x13,0x23,0x03,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x22,0x0e,0x02,0x23,0x23,0x37,0x21,0x02,0x5f,0x31,0x31,0x49,0x31,0x18,0x06,0x07,0x09,0x03,0x6f,0xb1,0x6f,0x02,0x07,0x06,0x04,0x09,0x1e,0x3b,0x31,0x18,0x3b,0x39,\r\n0x33,0x10,0x53,0x13,0x02,0x1b,0x04,0x38,0x1d,0x35,0x4a,0x2c,0x12,0x35,0x39,0x36,0x13,0xfd,0x59,0x02,0xb4,0x0e,0x29,0x31,0x34,0x17,0x1a,0x3c,0x3a,0x34,0x12,0x02,0x01,0x02,0x95,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x04,0xba,0x04,0xde,0x00,0x17,0x00,0x30,0xb9,0x00,0x00,0x01,0x50,0xb3,0x01,0x01,0x19,0x0b,0xb8,0x01,0x50,0xb2,\r\n0x0c,0x0a,0x07,0xbe,0x01,0x54,0x00,0x0d,0x00,0x12,0x01,0x4b,0x00,0x0c,0x00,0x00,0x01,0x4d,0x00,0x3f,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x04,0xba,0xab,0x34,0x60,0x8a,0x57,0x53,0xa4,0x3c,\r\n0xa9,0x30,0x7f,0x86,0x83,0x35,0x7f,0xc4,0x86,0x46,0x02,0xf8,0x63,0x82,0x4d,0x1e,0x14,0x0c,0xfb,0xd8,0x04,0xad,0x0a,0x12,0x0d,0x08,0x36,0x77,0xba,0x84,0x00,0x01,0x00,0xa0,0xff,0xed,0x05,0x01,0x04,0xdd,0x00,0x29,0x00,0x3e,0xb9,0x00,0x00,0x01,0x50,0xb6,0x17,0x20,0x17,0x20,0x17,0x2b,0x0d,0xb8,0x01,0x50,0xb2,0x0a,0x20,0x1d,\r\n0x41,0x0a,0x01,0x54,0x00,0x21,0x00,0x24,0x01,0x4b,0x00,0x0b,0x01,0x4a,0x00,0x12,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x34,\r\n0x2e,0x02,0x23,0x22,0x06,0x07,0x37,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x05,0x01,0x52,0x98,0xd8,0x86,0x7c,0xc7,0x8c,0x4a,0xaa,0x22,0x54,0x90,0x6d,0x67,0x99,0x66,0x33,0x26,0x47,0x63,0x3d,0x35,0x5e,0x30,0x15,0x2c,0x5d,0x41,0x52,0x95,0x72,0x43,0x02,0x56,0x87,0xe3,0xa3,0x5c,0x52,0x9d,0xe6,0x94,0x02,0x77,0xfd,0x96,0x54,0xaa,\r\n0x8a,0x56,0x49,0x7d,0xa5,0x5c,0x8f,0x4c,0x84,0x62,0x39,0x07,0x09,0x94,0x08,0x0b,0x47,0x86,0xc0,0x79,0x00,0x01,0x00,0xbe,0x02,0x27,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x14,0xb9,0x00,0x00,0x01,0x50,0xb2,0x01,0x00,0x02,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x01,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x02,0x27,\r\n0x02,0xa6,0x00,0x01,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x00,0x13,0x00,0x27,0xb9,0x00,0x00,0x01,0x50,0xb5,0x01,0x01,0x15,0x08,0x08,0x05,0xbd,0x01,0x54,0x00,0x09,0x00,0x0e,0x01,0x4b,0x00,0x00,0x01,0x4f,0x00,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x07,\r\n0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xcd,0xab,0xc0,0xb0,0x69,0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,0x8f,0x4f,0xfe,0x00,0x04,0xea,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x00,0x01,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x00,0x25,0x00,0x35,0xb9,0x00,0x00,0x01,0x50,0xb6,\r\n0x11,0x11,0x27,0x08,0x1b,0x1b,0x16,0x41,0x0a,0x01,0x54,0x00,0x1c,0x00,0x21,0x01,0x4b,0x00,0x09,0x00,0x0c,0x01,0x54,0x00,0x08,0x00,0x03,0x01,0x4e,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0x33,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x00,0x21,0x22,0x2e,0x02,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,\r\n0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x03,0xeb,0xfe,0xcb,0xfe,0xc4,0x28,0x53,0x4b,0x3d,0x12,0x15,0x2f,0x81,0x46,0x77,0xae,0x72,0x37,0x33,0x6e,0xab,0x78,0x1b,0x4d,0x53,0x51,0x20,0x14,0x1d,0x4a,0x4f,0x51,0x24,0x91,0xe2,0x9a,0x51,0x02,0x5f,0xfe,0xc7,0xfe,0xc7,0x07,0x0b,0x0d,0x07,0x8d,0x0a,\r\n0x12,0x38,0x75,0xb4,0x7d,0x76,0xb5,0x7b,0x40,0x04,0x07,0x0b,0x06,0x8f,0x08,0x0d,0x09,0x05,0x4b,0x9d,0xf1,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x00,0x2b,0x00,0x39,0xb9,0x00,0x00,0x01,0x50,0xb6,0x1d,0x0e,0x1d,0x0e,0x1d,0x2d,0x26,0x41,0x0c,0x01,0x50,0x00,0x23,0x00,0x23,0x01,0x54,0x00,0x26,0x01,0x4a,0x00,\r\n0x24,0x01,0x4c,0x00,0x0f,0x01,0x54,0x00,0x0e,0x01,0x4d,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x03,0x0e,0x03,0x07,0x0e,0x03,0x07,0x37,0x32,0x3e,0x02,0x37,0x3e,0x03,0x37,0x13,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x21,0x11,0x33,0x11,0x21,0x32,0x1e,0x02,\r\n0x03,0xeb,0x05,0x02,0x1c,0x06,0x1a,0x2d,0x41,0x2d,0x2f,0x7e,0x85,0x7e,0x2f,0x32,0x1a,0x48,0x4f,0x4f,0x1f,0x25,0x38,0x27,0x18,0x05,0x1b,0x01,0x05,0x22,0x3f,0x5a,0x37,0xfe,0x0a,0xa9,0x01,0x6e,0x56,0x8c,0x63,0x36,0x03,0x95,0x1c,0x3e,0x13,0xfe,0xe1,0x3b,0x76,0x6c,0x60,0x25,0x27,0x29,0x13,0x03,0x01,0x8e,0x03,0x0b,0x15,0x12,\r\n0x15,0x42,0x53,0x5f,0x31,0x01,0x1a,0x0a,0x38,0x19,0x30,0x4a,0x32,0x1a,0x02,0x68,0xfe,0x2d,0x2f,0x54,0x72,0x00,0x00,0x02,0x00,0xbe,0x00,0x00,0x04,0xe2,0x04,0xde,0x00,0x0b,0x00,0x16,0x00,0x36,0xb9,0x00,0x00,0x01,0x50,0xb3,0x0c,0x0c,0x18,0x16,0xb8,0x01,0x50,0xb2,0x02,0x15,0x12,0x41,0x09,0x01,0x54,0x00,0x03,0x00,0x06,0x01,\r\n0x4b,0x00,0x00,0x00,0x16,0x01,0x54,0x00,0x02,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x07,0x21,0x11,0x36,0x24,0x33,0x32,0x1e,0x02,0x15,0x03,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x04,0xe2,0x31,0xfc,0x0d,0x80,0x01,0x00,0x86,0x82,0xca,0x8a,0x48,0xab,0x37,\r\n0x69,0x96,0x60,0x6a,0x9c,0x34,0xa9,0xa9,0x04,0xac,0x17,0x1b,0x42,0x7e,0xb6,0x75,0xfd,0xaf,0x02,0x53,0x5b,0x80,0x52,0x26,0x14,0x0b,0xfc,0x79,0x00,0x01,0x00,0xa4,0xff,0xed,0x04,0xe8,0x04,0xe5,0x00,0x33,0x00,0x4b,0xb9,0x00,0x00,0x01,0x50,0x40,0x09,0x11,0x08,0x11,0x08,0x35,0x28,0x27,0x2b,0x22,0xb8,0x01,0x50,0xb2,0x23,0x21,\r\n0x19,0x41,0x0d,0x01,0x54,0x00,0x2b,0x00,0x2e,0x01,0x4a,0x00,0x27,0x00,0x28,0x01,0x4b,0x00,0x23,0x01,0x4d,0x00,0x0c,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x32,0xc6,0x32,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x16,0x16,\r\n0x33,0x32,0x3e,0x02,0x35,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x07,0x06,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x04,0xe8,0x31,0x60,0x8e,0x5c,0x35,0x62,0x26,0x2c,0x21,0x40,0x28,0x38,0x51,0x35,0x1a,0x0e,0x21,0x38,0x52,0x71,0x4a,0x2c,0x5f,0x57,0x4a,0x17,0x09,0x0f,\r\n0xa9,0x0a,0x17,0x94,0x16,0x1a,0x02,0x4a,0xba,0x75,0x7e,0xc1,0x83,0x43,0x01,0xb9,0x6f,0xab,0x75,0x3d,0x13,0x11,0x85,0x08,0x09,0x2a,0x4c,0x69,0x40,0xf8,0x30,0x64,0x5f,0x54,0x3e,0x25,0x15,0x29,0x3d,0x29,0x11,0x27,0x14,0xfc,0xaa,0x03,0xf5,0x2e,0x55,0x2d,0x40,0x20,0x54,0x3f,0x50,0x5c,0x52,0x94,0xcc,0x7a,0x00,0x01,0x00,0xbe,\r\n0xfd,0xff,0x01,0x67,0x04,0xcd,0x00,0x03,0x00,0x17,0xbe,0x00,0x00,0x01,0x50,0x00,0x01,0x00,0x00,0x01,0x4f,0x00,0x02,0x01,0x4a,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0xfd,0xff,0x06,0xce,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x02,0x87,0x04,0xde,0x00,0x19,0x00,0x33,0xb9,0x00,0x00,0x01,\r\n0x50,0x40,0x09,0x03,0x03,0x01,0x1b,0x0e,0x0e,0x01,0x0e,0x09,0xbf,0x01,0x54,0x00,0x0f,0x00,0x12,0x01,0x4b,0x00,0x02,0x01,0x54,0x00,0x01,0x01,0x4d,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x21,0x37,0x21,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x36,0x36,0x33,\r\n0x32,0x1e,0x04,0x15,0x02,0x87,0xfd,0xe0,0x13,0x01,0x62,0x0d,0x2b,0x52,0x44,0x0f,0x24,0x24,0x1f,0x08,0x18,0x1c,0x56,0x25,0x45,0x65,0x49,0x2f,0x1b,0x0b,0xa2,0x02,0x7b,0x41,0x6d,0x50,0x2c,0x02,0x03,0x04,0x02,0x94,0x06,0x08,0x22,0x3e,0x54,0x64,0x71,0x3a,0x00,0x02,0x00,0x96,0xff,0xed,0x04,0xf7,0x04,0xde,0x00,0x14,0x00,0x27,\r\n0x00,0x32,0xb9,0x00,0x00,0x01,0x50,0xb3,0x15,0x15,0x29,0x1e,0xb8,0x01,0x50,0xb2,0x0a,0x1d,0x1a,0xbf,0x01,0x54,0x00,0x0b,0x00,0x10,0x01,0x4b,0x00,0x23,0x01,0x54,0x00,0x05,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x3e,0x03,\r\n0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x04,0xf7,0x4f,0x96,0xd9,0x8a,0x89,0xca,0x85,0x41,0x3c,0x87,0x8f,0x92,0x45,0x8c,0xd5,0x8f,0x48,0xab,0x2f,0x63,0x9a,0x6b,0x63,0xc4,0x4f,0x22,0x55,0x90,0x6d,0x6f,0x9c,0x61,0x2d,0x02,0x56,0x82,0xe1,0xa7,0x5f,0x5b,0xa4,0xe3,\r\n0x87,0x02,0x59,0x09,0x11,0x0d,0x08,0x61,0xac,0xee,0x8d,0x68,0xb5,0x85,0x4d,0x10,0x0b,0xfe,0x39,0x54,0xaa,0x8a,0x56,0x55,0x86,0xa5,0x00,0x01,0x00,0x59,0xff,0x94,0x04,0x2b,0x04,0xcd,0x00,0x17,0x00,0x3a,0xb2,0x10,0x0d,0x00,0xb8,0x01,0x50,0xb5,0x0d,0x0e,0x15,0x15,0x19,0x0f,0xb8,0x01,0x51,0xb7,0x0e,0x08,0x08,0x0e,0x0d,0x10,\r\n0x16,0x0e,0xbb,0x01,0x4a,0x00,0x08,0x01,0x54,0x00,0x07,0x00,0x2f,0xed,0x3f,0x33,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x04,0x07,0x27,0x3e,0x03,0x37,0x01,0x33,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x2b,0x4d,0x86,0xb4,0xcd,0xdb,0x6b,0x2f,0x31,0x68,0x65,0x5f,\r\n0x28,0xfe,0x72,0xb6,0x01,0x70,0x38,0x5e,0x46,0x27,0xa9,0x02,0x64,0x91,0xd3,0x95,0x61,0x3f,0x27,0x10,0xa5,0x05,0x0d,0x13,0x17,0x0d,0x04,0x4b,0xfb,0xe8,0x1b,0x46,0x5f,0x7c,0x50,0x02,0x8c,0x00,0x00,0x01,0x00,0x6c,0xfd,0xff,0x04,0x39,0x04,0xde,0x00,0x1b,0x00,0x3d,0xb9,0x00,0x00,0x01,0x50,0xb6,0x01,0x0e,0x01,0x0e,0x01,0x1d,\r\n0x0d,0xbb,0x01,0x50,0x00,0x10,0x00,0x10,0x01,0x54,0xb4,0x0d,0x0d,0x1c,0x0c,0x07,0xbc,0x01,0x54,0x00,0x11,0x00,0x16,0x01,0x4b,0x00,0x00,0x00,0x2f,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x11,0x21,0x07,0x21,\r\n0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x04,0x39,0xab,0x30,0x6a,0xaa,0x7a,0x16,0x34,0x33,0x2e,0x11,0x01,0x18,0x19,0xfe,0x59,0x24,0x57,0x5e,0x5f,0x2c,0xa5,0xeb,0x94,0x45,0xfd,0xff,0x04,0x73,0x81,0xb3,0x70,0x32,0x04,0x06,0x08,0x04,0xfe,0x65,0x96,0x02,0xaa,0x0b,0x12,0x0e,0x08,0x47,0x98,0xec,0xa5,0x00,0x00,0x01,0x00,0x96,\r\n0xff,0xed,0x04,0x9c,0x04,0xde,0x00,0x27,0x00,0x51,0xb9,0x00,0x00,0x01,0x50,0xb6,0x13,0x1b,0x13,0x1b,0x13,0x29,0x1a,0xb8,0x01,0x50,0xb4,0x1d,0x0a,0x0a,0x1d,0x1d,0xb8,0x01,0x54,0xb4,0x1a,0x1a,0x0e,0x19,0x16,0x41,0x0a,0x01,0x54,0x00,0x1e,0x00,0x23,0x01,0x4b,0x00,0x0b,0x00,0x0e,0x01,0x54,0x00,0x0a,0x00,0x05,0x01,0x4e,0x00,\r\n0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0x32,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x02,0x23,0x22,0x06,0x07,0x11,0x21,0x07,0x21,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x04,0x9c,0x54,\r\n0x9c,0xde,0x8a,0x2d,0x70,0x74,0x70,0x2d,0x1c,0x4b,0xbc,0x7d,0x6a,0xa4,0x71,0x3a,0xca,0xd4,0x5c,0x94,0x26,0x01,0x4c,0x1c,0xfe,0x2b,0x2c,0x71,0x75,0x70,0x2c,0x8f,0xdf,0x9a,0x50,0x02,0x59,0xa0,0xea,0x98,0x4a,0x06,0x0c,0x14,0x0e,0x96,0x14,0x1c,0x32,0x6d,0xaf,0x7e,0xf2,0x01,0x03,0x11,0x0b,0xfe,0x7f,0x96,0x02,0x8b,0x0f,0x17,\r\n0x10,0x08,0x50,0xa1,0xf2,0x00,0x00,0x01,0x00,0x1e,0xfd,0xff,0x04,0x03,0x04,0xe5,0x00,0x22,0x00,0x44,0xb3,0x17,0x09,0x06,0x0a,0xb8,0x01,0x50,0xb4,0x0b,0x0b,0x12,0x20,0x00,0xb8,0x01,0x50,0x40,0x0e,0x1f,0x1c,0x1c,0x24,0x13,0x12,0x12,0x13,0x13,0x17,0x06,0x0a,0x1f,0x20,0xba,0x01,0x4b,0x00,0x0a,0x01,0x4f,0x00,0x3f,0x3f,0x33,\r\n0x12,0x39,0x39,0x33,0x2f,0x33,0x01,0x2f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x32,0x32,0x32,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x07,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x01,0x37,0x01,0x16,0x16,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x04,0x03,0x1e,0x44,0x70,0x52,0x61,0x05,0x02,\r\n0xa9,0x0a,0x17,0x27,0x1e,0xfe,0xa8,0xab,0x01,0x36,0x1d,0x32,0x0c,0x4a,0x63,0x3b,0x19,0x1d,0x14,0xa3,0x17,0x1f,0x03,0xd4,0x59,0x96,0x7a,0x61,0x24,0x2b,0x26,0x50,0x20,0xfc,0xda,0x03,0x23,0x3a,0x62,0x5a,0x54,0x2d,0x02,0x05,0x40,0xfe,0x1f,0x2d,0x6b,0x2d,0x20,0x4e,0x60,0x72,0x44,0x4c,0x72,0x29,0x42,0x32,0x8e,0x00,0x00,0x01,\r\n0x00,0x4b,0x00,0x00,0x04,0x25,0x04,0xd4,0x00,0x14,0x00,0x4e,0xb3,0x05,0x0d,0x0c,0x06,0xb8,0x01,0x51,0xb3,0x0a,0x0a,0x08,0x00,0xb8,0x01,0x50,0x40,0x10,0x12,0x12,0x08,0x16,0x0c,0x0b,0x0b,0x08,0x05,0x0d,0x06,0x0c,0x13,0x13,0x0b,0x0c,0xbd,0x01,0x4a,0x00,0x06,0x00,0x09,0x01,0x54,0x00,0x08,0x01,0x4d,0x00,0x3f,0xed,0x32,0x3f,\r\n0x33,0x33,0x2f,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x13,0x07,0x21,0x37,0x21,0x01,0x37,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x25,0x28,0x48,0x64,0x3c,0xdc,0x2c,0xfc,0x86,0x2d,0x02,0xb3,0xfd,0x39,0x9a,0x01,0xc9,0x23,0x41,\r\n0x32,0x1e,0xaa,0x03,0xd4,0x60,0x94,0x77,0x62,0x2f,0xfe,0xca,0xa2,0xa2,0x03,0xee,0x44,0xfd,0x74,0x15,0x42,0x5c,0x76,0x47,0x01,0x15,0x00,0x02,0x00,0x42,0xfd,0xff,0x04,0xd2,0x04,0xde,0x00,0x29,0x00,0x2d,0x00,0x46,0xb9,0x00,0x00,0x01,0x50,0xb6,0x15,0x09,0x15,0x09,0x15,0x2f,0x2a,0xb8,0x01,0x50,0xb2,0x1f,0x2b,0x2a,0xb8,0x01,\r\n0x4f,0xb4,0x2c,0x2c,0x0a,0x1f,0x1a,0xbf,0x01,0x54,0x00,0x20,0x00,0x25,0x01,0x4b,0x00,0x0a,0x01,0x54,0x00,0x09,0x01,0x4e,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x3f,0x01,0x2f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x07,0x0e,0x03,0x07,0x37,0x3e,0x03,0x37,0x37,0x3e,0x03,0x35,\r\n0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x01,0x23,0x11,0x33,0x04,0xd2,0x02,0x02,0x08,0x10,0x60,0x9f,0xdf,0x90,0x15,0x5e,0x99,0x72,0x47,0x0c,0x0d,0x01,0x01,0x01,0x01,0x2a,0x58,0x88,0x5f,0x5b,0xa4,0x9b,0x97,0x4e,0x20,0x2d,0x7f,0x9a,0xad,0x5a,0x91,0xcf,0x85,0x3e,0xfc,0x9c,0xa9,0xa9,0x03,\r\n0x4a,0x10,0x35,0x11,0x68,0xb7,0xf7,0x9a,0x4c,0x0b,0xa1,0x0b,0x35,0x69,0xaa,0x80,0x8a,0x09,0x1a,0x1b,0x1a,0x09,0x44,0x61,0x3e,0x1d,0x0a,0x11,0x18,0x0e,0xa6,0x06,0x10,0x0d,0x0a,0x32,0x65,0x97,0xfa,0x4f,0x04,0xe2,0x00,0x01,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x00,0x13,0x00,0x27,0xb9,0x00,0x00,0x01,0x50,0xb5,0x01,0x01,\r\n0x15,0x08,0x08,0x05,0xbd,0x01,0x54,0x00,0x09,0x00,0x0e,0x01,0x4b,0x00,0x00,0x01,0x4d,0x00,0x3f,0x3f,0x33,0xed,0x32,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x03,0xcd,0xab,0xc0,0xb0,0x69,0xc7,0x53,0x16,0x2a,0x5f,0x60,0x5b,0x27,0x78,0xc7,\r\n0x8f,0x4f,0x02,0xea,0xb4,0xad,0x21,0x12,0xa0,0x09,0x0f,0x09,0x05,0x3b,0x7a,0xba,0x7f,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x05,0xd8,0x04,0xcd,0x00,0x31,0x00,0x56,0xbc,0x00,0x00,0x01,0x50,0x00,0x31,0x00,0x1b,0x01,0x50,0x40,0x0d,0x1a,0x31,0x1a,0x31,0x1a,0x33,0x0c,0x26,0x25,0x25,0x0e,0x0e,0x0d,0xb8,0x01,0x51,0xb2,0x0b,0x0c,\r\n0x25,0xb8,0x01,0x54,0xb3,0x0e,0x0e,0x00,0x26,0xba,0x01,0x54,0x00,0x0b,0x01,0x4d,0xb2,0x1a,0x0c,0x00,0xb8,0x01,0x4a,0x00,0x3f,0x32,0x32,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x07,0x06,0x06,0x07,0x0e,0x03,0x23,0x21,\r\n0x03,0x33,0x13,0x3e,0x05,0x37,0x36,0x36,0x37,0x36,0x37,0x33,0x06,0x07,0x06,0x06,0x07,0x0e,0x03,0x07,0x17,0x21,0x32,0x3e,0x02,0x37,0x36,0x36,0x37,0x36,0x37,0x05,0xd8,0x06,0x0a,0x08,0x1a,0x14,0x13,0x4f,0x7e,0xaf,0x73,0xfd,0x97,0xb9,0xb3,0x6b,0x3b,0x5f,0x4a,0x38,0x2a,0x1d,0x09,0x05,0x0a,0x05,0x05,0x05,0xb0,0x04,0x05,0x05,\r\n0x0a,0x06,0x0e,0x3e,0x76,0xb9,0x89,0x18,0x01,0xd6,0x3c,0x6b,0x58,0x40,0x10,0x16,0x1c,0x08,0x0a,0x05,0x04,0xcd,0x33,0x54,0x48,0xe8,0xab,0xa8,0xeb,0x94,0x44,0x04,0xcd,0xfd,0x0e,0x12,0x24,0x31,0x44,0x61,0x85,0x5a,0x2e,0x5d,0x26,0x2d,0x29,0x24,0x2c,0x26,0x62,0x39,0x8a,0xc9,0x93,0x66,0x27,0xa7,0x27,0x64,0xad,0x85,0xa6,0xea,\r\n0x4c,0x59,0x39,0x00,0x00,0x01,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x00,0x2d,0x00,0x47,0xb2,0x22,0x22,0x0b,0xb8,0x01,0x50,0xb3,0x1e,0x1e,0x15,0x00,0xb8,0x01,0x50,0x40,0x09,0x01,0x01,0x2f,0x15,0x22,0x0a,0x0a,0x1f,0x07,0x41,0x09,0x01,0x54,0x00,0x23,0x00,0x28,0x01,0x4b,0x00,0x1a,0x01,0x54,0x00,0x12,0x01,0x4e,0x00,0x01,\r\n0x00,0x2f,0x3f,0xed,0x3f,0x33,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0x31,0x30,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x11,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x06,0x06,0x07,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x05,\r\n0x23,0xab,0x39,0x71,0xaa,0x71,0x33,0x6f,0x39,0x04,0x12,0x24,0x42,0x64,0x48,0x1d,0x3e,0x21,0x13,0x14,0x20,0x0f,0x2e,0x3e,0x27,0x11,0x2c,0x4c,0x1e,0x13,0x37,0x81,0x8f,0x9a,0x4f,0x7c,0xd5,0x9d,0x5a,0x02,0xea,0x61,0x86,0x54,0x26,0x08,0x06,0xfd,0x73,0x3d,0x72,0x64,0x54,0x3b,0x21,0x04,0x05,0x91,0x04,0x01,0x1f,0x44,0x69,0x49,\r\n0x02,0x90,0x07,0x0f,0x06,0xa5,0x09,0x10,0x0d,0x08,0x36,0x77,0xba,0x84,0xff,0xff,0x00,0xbe,0x00,0x00,0x03,0x70,0x04,0xcd,0x00,0x26,0x0b,0x6d,0x00,0x00,0x00,0x07,0x0b,0x6d,0x02,0x09,0x00,0x00,0xff,0xff,0x00,0xbe,0x00,0x00,0x03,0x70,0x04,0xcd,0x00,0x27,0x0b,0x6d,0x02,0x09,0x00,0x00,0x00,0x06,0x0b,0x71,0x00,0x00,0xff,0xff,\r\n0x00,0xbe,0x02,0x27,0x03,0x70,0x04,0xcd,0x00,0x26,0x0b,0x71,0x00,0x00,0x00,0x07,0x0b,0x71,0x02,0x09,0x00,0x00,0x00,0x01,0x00,0x6e,0x03,0x0e,0x01,0x70,0x04,0xcc,0x00,0x03,0x00,0x11,0xb5,0x03,0x00,0x01,0x02,0x00,0x02,0x00,0x2f,0xcd,0x01,0x2f,0x33,0xcd,0x32,0x30,0x31,0x01,0x03,0x23,0x13,0x01,0x70,0x8c,0x76,0x6f,0x04,0xcc,\r\n0xfe,0x42,0x01,0xbe,0x00,0x02,0x00,0x6e,0x03,0x0e,0x02,0xa0,0x04,0xcc,0x00,0x03,0x00,0x07,0x00,0x20,0x40,0x0d,0x03,0x00,0x01,0x02,0x07,0x04,0x05,0x06,0x00,0x02,0x02,0x04,0x06,0x00,0x2f,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0x33,0xdd,0x32,0xd6,0x32,0xcd,0x32,0x30,0x31,0x01,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x02,0xa0,0x8c,0x76,\r\n0x6c,0x9a,0x8c,0x76,0x6f,0x04,0xcc,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x01,0xbe,0x00,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x53,0x01,0x48,0x02,0xfb,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x5b,0x00,0xce,0x02,0xfb,\r\n0xff,0xff,0xff,0x51,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x06,0x0b,0x5c,0xad,0x00,0xff,0xff,0xff,0x51,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x26,0x0b,0x5c,0xad,0x00,0x00,0x07,0x0b,0x5e,0x01,0xc6,0x00,0x00,0x00,0x03,0x00,0xbe,0x01,0x58,0x03,0x95,0x04,0xcd,0x00,0x03,\r\n0x00,0x07,0x00,0x0b,0x00,0x30,0xb1,0x03,0x0b,0xb8,0x01,0x50,0xb3,0x0a,0x0a,0x0d,0x07,0xb8,0x01,0x50,0xb2,0x02,0x06,0x0a,0xb8,0x01,0x4b,0xb4,0x00,0x02,0x09,0x04,0x06,0xb8,0x01,0x4b,0x00,0x3f,0xdd,0x32,0xde,0xcd,0x3f,0x01,0x2f,0x33,0xed,0x12,0x39,0x2f,0xed,0x32,0x30,0x31,0x01,0x21,0x35,0x21,0x25,0x23,0x11,0x33,0x01,0x23,\r\n0x11,0x33,0x03,0x95,0xfd,0x29,0x02,0xd7,0xfd,0xd2,0xa9,0xa9,0x02,0x2e,0xa9,0xa9,0x01,0x58,0x6a,0x65,0x02,0xa6,0xfd,0x5a,0x02,0xa6,0x00,0x01,0x00,0x59,0x00,0x00,0x04,0x2b,0x04,0xcd,0x00,0x16,0x00,0x3a,0xb2,0x0f,0x0c,0x16,0xb8,0x01,0x50,0xb5,0x0c,0x0d,0x15,0x15,0x18,0x0e,0xb8,0x01,0x51,0xb7,0x0d,0x08,0x08,0x0d,0x0c,0x0f,\r\n0x16,0x0e,0xbb,0x01,0x4a,0x00,0x08,0x01,0x54,0x00,0x07,0x00,0x2f,0xed,0x3f,0x33,0x39,0x39,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x03,0x23,0x23,0x27,0x33,0x32,0x32,0x37,0x01,0x33,0x01,0x3e,0x03,0x35,0x11,0x33,0x04,0x2b,0x4d,0x86,0xb4,0xaf,0x9a,0xca,0x2f,0xcd,0x33,\r\n0x53,0x2b,0xfe,0x79,0xb6,0x01,0x70,0x38,0x5e,0x46,0x27,0xa9,0x02,0x80,0x91,0xd3,0x95,0x61,0x26,0xa2,0x08,0x04,0x23,0xfc,0x04,0x1b,0x46,0x5f,0x7c,0x50,0x02,0x70,0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x06,0x0b,0x68,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x02,0x06,0x0b,0x6b,0x00,0x00,\r\n0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x02,0x06,0x0b,0x6c,0x00,0x00,0xff,0xff,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x02,0x06,0x0b,0x73,0x00,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x06,0x0b,0x74,0x00,0x00,0xff,0xff,0x00,0xbe,0x00,0x00,0x04,0xe2,0x04,0xde,0x02,0x06,0x0b,0x75,0x00,0x00,\r\n0xff,0xff,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x02,0x06,0x0b,0x80,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x02,0x06,0x0b,0x82,0x00,0x00,0x00,0x01,0x00,0x5f,0x02,0x12,0x04,0x0b,0x04,0x2b,0x00,0x07,0x00,0x19,0xb1,0x07,0x05,0xb8,0x01,0x50,0xb5,0x02,0x04,0x06,0x00,0x02,0x04,0x00,0x2f,0xde,0xcd,0x33,\r\n0x01,0x2f,0xce,0xfd,0xce,0x30,0x31,0x01,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x0b,0xfc,0x54,0x01,0x93,0x85,0x01,0x94,0x02,0x12,0x86,0x01,0x93,0xfe,0x6d,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xde,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x63,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x61,0x00,0x00,0x05,0xd8,\r\n0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x64,0x03,0x25,0x00,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xde,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x27,0x0b,0x63,0x03,0x25,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0x61,0x00,0x00,0x05,0xd8,0x06,0x05,0x02,0x26,0x0b,0x81,0x00,0x00,\r\n0x00,0x27,0x0b,0x64,0x03,0x25,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0xa5,0xff,0x38,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5a,0x01,0xae,0x00,0x00,0xff,0xff,0x00,0xa5,0xfe,0x59,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5b,0x01,0xae,0x00,0x00,\r\n0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0x3a,0xfe,0x43,0xff,0xff,0x00,0x50,0x00,0x00,0x04,0x3c,0x04,0xde,0x02,0x26,0x0b,0x69,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xd3,0x00,0x00,0xff,0xff,0x00,0x31,0x00,0x00,0x03,0x17,0x04,0xcd,0x02,0x26,0x0b,0x6a,0x00,0x00,\r\n0x00,0x07,0x0b,0x5e,0x01,0x10,0x00,0x8c,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x04,0xcd,0x02,0x26,0x0b,0x6b,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x36,0x00,0x00,0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x04,0xde,0x02,0x26,0x0b,0x6c,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xb8,0x00,0x00,0xff,0xff,0xff,0xfb,0x00,0x00,0x01,0xad,\r\n0x04,0xcd,0x00,0x26,0x0b,0x6d,0x46,0x00,0x00,0x06,0x0b,0x5e,0x56,0x00,0xff,0xff,0xff,0xfa,0x00,0x00,0x02,0x87,0x04,0xcd,0x00,0x26,0x0b,0x6e,0x28,0x00,0x00,0x06,0x0b,0x5e,0x55,0x00,0xff,0xff,0x00,0xa0,0xff,0xed,0x05,0x01,0x04,0xdd,0x02,0x26,0x0b,0x70,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xc7,0x00,0x00,0xff,0xff,0xff,0xfb,\r\n0x02,0x27,0x01,0xad,0x04,0xcd,0x00,0x26,0x0b,0x71,0x46,0x00,0x00,0x07,0x0b,0x5e,0x00,0x56,0x01,0x0e,0xff,0xff,0x00,0x2f,0xfe,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x72,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x4e,0xff,0xed,0x03,0xeb,0x04,0xde,0x02,0x26,0x0b,0x73,0x00,0x00,0x00,0x07,0x0b,0x5e,\r\n0x01,0xa4,0x00,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,0x02,0x26,0x0b,0x74,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xc6,0x00,0x00,0xff,0xff,0x00,0xa4,0xff,0xed,0x04,0xe8,0x04,0xe5,0x02,0x26,0x0b,0x76,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xd2,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x87,0x04,0xde,0x02,0x26,\r\n0x0b,0x78,0x00,0x00,0x00,0x07,0x0b,0x5e,0x00,0xfa,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0xed,0x04,0xf7,0x04,0xde,0x02,0x26,0x0b,0x79,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xb2,0x00,0x00,0xff,0xff,0x00,0x6c,0xfd,0xff,0x04,0x39,0x04,0xde,0x02,0x26,0x0b,0x7b,0x00,0x00,0x00,0x07,0x0b,0x5e,0x02,0xd5,0xff,0xd9,0xff,0xff,0x00,0x96,\r\n0xff,0xed,0x04,0x9c,0x04,0xde,0x02,0x26,0x0b,0x7c,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0x2f,0xff,0xf7,0xff,0xff,0x00,0x4b,0x00,0x00,0x04,0x25,0x04,0xd4,0x02,0x26,0x0b,0x7e,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x68,0xff,0x16,0xff,0xff,0x00,0x42,0xfd,0xff,0x04,0xd2,0x04,0xde,0x02,0x26,0x0b,0x7f,0x00,0x00,0x00,0x07,0x0b,0x5e,\r\n0x02,0xad,0x00,0x00,0xff,0xff,0x00,0x2f,0x00,0x00,0x03,0xcd,0x04,0xde,0x02,0x26,0x0b,0x80,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0xb3,0x00,0x00,0xff,0xff,0x00,0x6e,0x00,0x00,0x05,0xd8,0x04,0xcd,0x02,0x26,0x0b,0x81,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0xc0,0xff,0x2a,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x04,0xde,0x02,0x26,\r\n0x0b,0x82,0x00,0x00,0x00,0x07,0x0b,0x5e,0x03,0x20,0x00,0x00,0xff,0xff,0x00,0xb5,0x00,0x00,0x01,0x6e,0x06,0x05,0x02,0x26,0x0b,0x6d,0x00,0x00,0x00,0x07,0x0b,0x5c,0x01,0x11,0x00,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x04,0x3c,0x05,0xd5,0x02,0x26,0x0b,0x69,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xea,0x00,0x00,0xff,0xff,0x00,0x4e,\r\n0xff,0xed,0x03,0xeb,0x05,0xd5,0x02,0x26,0x0b,0x73,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xc7,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0xed,0x04,0x9c,0x05,0xd5,0x02,0x26,0x0b,0x7c,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0x44,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x04,0xba,0x06,0xa0,0x00,0x1b,0x00,0x40,0xb6,0x17,0x06,0x12,0x0c,0x0b,\r\n0x0b,0x01,0xb8,0x01,0x50,0xb3,0x1a,0x1a,0x1d,0x12,0xb8,0x01,0x50,0xb7,0x0f,0x06,0x17,0x0b,0x12,0x12,0x0f,0x1b,0xbc,0x01,0x4a,0x00,0x10,0x01,0x4c,0x00,0x0b,0x01,0x4d,0x00,0x3f,0x3f,0x3f,0x33,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x33,0x12,0x39,0x39,0x31,0x30,0x01,0x11,0x14,0x0e,0x02,0x07,\r\n0x1e,0x03,0x17,0x23,0x02,0x00,0x25,0x11,0x33,0x11,0x16,0x16,0x17,0x16,0x17,0x36,0x36,0x35,0x11,0x04,0x89,0x28,0x4a,0x68,0x41,0x24,0x52,0x57,0x57,0x28,0xcb,0xc4,0xfe,0x36,0xfe,0xf8,0xaa,0x6f,0xc2,0x48,0x54,0x47,0x5c,0x6c,0x04,0xcd,0xfe,0xc1,0x52,0x83,0x6c,0x58,0x29,0x2b,0x6e,0x79,0x7e,0x3c,0x01,0x23,0x02,0x19,0xf6,0x02,\r\n0x6e,0xfd,0xde,0x6f,0xd2,0x51,0x5f,0x55,0x35,0x99,0x6a,0x01,0x5d,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x09,0x9a,0x06,0xe8,0x00,0x04,0x00,0x08,0x00,0x0c,0x00,0x18,0x00,0x1c,0x00,0x21,0x00,0x2c,0x00,0x31,0x00,0x35,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4e,0x00,0x55,0x00,0x5c,0x00,0x64,0x00,0xee,0x40,0x10,0x05,0x32,0x06,0x33,\r\n0x0a,0x19,0x46,0x1a,0x47,0x4b,0x2d,0x61,0x4a,0xce,0x3c,0x36,0xb8,0x01,0x50,0xb2,0x5d,0x53,0x5a,0x41,0x0a,0x01,0x52,0x00,0x25,0x00,0x29,0x01,0x52,0x00,0x4f,0x00,0x22,0x01,0x50,0x00,0x56,0x00,0x0d,0x01,0x50,0x40,0x28,0x16,0x02,0x1e,0x3c,0x5d,0x25,0x4f,0x56,0x16,0x1e,0x1e,0x16,0x56,0x4f,0x25,0x5d,0x3c,0x07,0x0a,0x42,0xce,\r\n0x43,0x2f,0x4b,0x09,0x00,0x1d,0xce,0x0a,0x0b,0x44,0x30,0x0a,0x43,0x48,0x20,0x4c,0x0f,0x25,0x39,0xb8,0x01,0x56,0xb4,0x63,0x14,0x5a,0x63,0x59,0xb8,0x01,0x56,0xb2,0x53,0x52,0x5f,0xb8,0x01,0x56,0x40,0x19,0x3f,0x26,0x17,0x3f,0x01,0x2f,0x4c,0x63,0x53,0x3f,0x2f,0x2f,0x3f,0x53,0x63,0x4c,0x05,0x30,0x34,0x48,0x1e,0x33,0x47,0x03,\r\n0x4b,0xb8,0x01,0x4d,0xb6,0x06,0x1a,0x03,0x07,0x1b,0x03,0x30,0x00,0x2f,0x17,0x33,0xc4,0x32,0x3f,0x17,0x33,0xc4,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x10,0xc6,0x32,0x10,0xc6,0x32,0x01,0x2f,0xe4,0x32,0x32,0x2f,0x33,0x33,\r\n0xe4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x10,0xe4,0x32,0x32,0x10,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0x31,0x30,0x01,0x23,0x01,0x35,0x21,0x05,0x21,0x35,0x21,0x01,0x23,0x11,0x33,0x01,0x10,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x35,0x11,\r\n0x33,0x01,0x21,0x35,0x21,0x01,0x21,0x35,0x01,0x33,0x01,0x14,0x21,0x21,0x11,0x21,0x20,0x15,0x14,0x07,0x16,0x01,0x01,0x23,0x11,0x21,0x01,0x21,0x35,0x21,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x23,0x11,0x33,0x01,0x21,0x35,0x21,0x05,0x21,0x11,0x33,0x01,0x01,0x34,0x23,0x23,0x15,0x33,0x32,0x17,0x34,\r\n0x23,0x23,0x11,0x33,0x32,0x01,0x10,0x23,0x22,0x11,0x10,0x33,0x32,0x09,0x9a,0x78,0xfe,0xf3,0x01,0x85,0xfd,0x4e,0xfe,0x7d,0x01,0x83,0x02,0xb2,0x78,0x78,0xfe,0xc0,0xfd,0x67,0x3d,0x55,0x20,0x2f,0x71,0x8c,0xfb,0xda,0xfe,0x7e,0x01,0x82,0x05,0x66,0xfe,0x7b,0x01,0x0d,0x78,0xfd,0x12,0xfe,0xb7,0xfe,0xe0,0x01,0x1b,0x01,0x2a,0x6a,\r\n0x8e,0xfa,0xd9,0xfe,0xf3,0x78,0x01,0x85,0x05,0x63,0xfe,0x7d,0x01,0x83,0xfd,0x19,0xc5,0xb8,0xb8,0xc0,0xc0,0xb8,0xb8,0xc5,0xfc,0x77,0x78,0x78,0x03,0xbc,0xfe,0x7e,0x01,0x82,0xfd,0x51,0xfe,0x7b,0x78,0x01,0x0d,0x04,0x79,0xc5,0x6c,0x7a,0xb7,0x22,0xcc,0x87,0x96,0xbd,0xfd,0x54,0xf0,0xec,0xec,0xf0,0x05,0x65,0x01,0x09,0x7a,0x7a,\r\n0x7a,0xfb,0xca,0x01,0x82,0xfe,0xa8,0xfe,0xe1,0x36,0x5e,0x1e,0xa4,0x02,0x45,0x01,0x52,0x7a,0xf9,0x18,0x78,0x01,0x0d,0x01,0x41,0xfa,0x03,0x50,0xe0,0x6f,0x3d,0x36,0x03,0x14,0xfe,0xf7,0x01,0x83,0xf9,0x18,0x78,0x02,0xfa,0xd1,0xe4,0xe4,0xd1,0xd1,0xe7,0xe7,0xfe,0x6f,0x01,0x82,0xfb,0xcc,0x78,0x78,0x01,0x85,0xfe,0xf3,0x03,0xb8,\r\n0x75,0xe6,0xf9,0x82,0xfe,0xf7,0x01,0x33,0x01,0x43,0xfe,0xbd,0xfe,0xc1,0x00,0x01,0x00,0x00,0xfe,0x09,0x01,0xb0,0xff,0x9e,0x00,0x07,0x00,0x1a,0x40,0x0a,0x07,0x01,0x06,0x04,0x02,0x01,0x04,0x06,0x06,0x09,0x11,0x00,0x33,0x2f,0xdd,0x32,0xcd,0x01,0x2f,0xcd,0xdd,0xcd,0x30,0x31,0x05,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x01,0xb0,\r\n0xa5,0x66,0xa5,0x01,0xb0,0xc8,0xfe,0xd1,0x01,0x2f,0x66,0x00,0xff,0xff,0x00,0xa5,0x00,0x00,0x04,0x9a,0x04,0xd4,0x02,0x26,0x0b,0x68,0x00,0x00,0x01,0x07,0x0b,0x5e,0x02,0x2a,0xfe,0x6f,0x00,0x0f,0xb1,0x01,0x2c,0xb8,0xff,0xc0,0xb3,0x10,0x10,0x36,0x2c,0x00,0x11,0x2b,0x35,0x00,0xff,0xff,0x00,0x59,0x00,0x00,0x03,0xeb,0x06,0xa0,\r\n0x02,0x06,0x0b,0x74,0x00,0x00,0xff,0xff,0x00,0x59,0xff,0x04,0x04,0xba,0x06,0xa0,0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x58,0x02,0x3f,0x00,0x00,0xff,0xff,0x00,0x59,0xfd,0xff,0x04,0xba,0x06,0xa0,0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x59,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x59,0xfd,0xff,0x05,0x40,0x06,0xa0,\r\n0x02,0x26,0x0b,0xb7,0x00,0x00,0x00,0x07,0x0b,0x54,0x02,0x63,0x00,0x00,0x00,0x01,0xff,0x43,0xfe,0x09,0x00,0xbe,0xff,0xb1,0x00,0x18,0x00,0x2a,0x40,0x12,0x02,0x18,0x12,0x11,0x08,0x0b,0x11,0x13,0x05,0x40,0x10,0x10,0x01,0x0a,0xc0,0x11,0x11,0x1a,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x32,0x39,0x2f,0x1a,0xcd,0x33,0x01,0x2f,0xdc,0xcd,\r\n0x10,0xdd,0xdc,0xcd,0x30,0x31,0x13,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x1e,0x03,0x15,0xbe,0x66,0x27,0x30,0x31,0x27,0x66,0x0e,0x20,0x35,0x27,0x66,0x28,0x35,0x20,0x0e,0xfe,0x09,0x76,0x35,0x2f,0x2f,0x35,0x76,0x77,0x26,0x40,0x31,0x20,0x06,0x74,0x74,0x06,0x20,0x31,0x40,\r\n0x26,0x00,0x00,0x03,0xff,0x15,0x05,0x4e,0x00,0xeb,0x07,0x0a,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3f,0xb9,0x00,0x06,0x01,0x51,0xb3,0x00,0x00,0x0c,0x1e,0xbe,0x01,0x51,0x00,0x18,0x00,0x12,0x01,0x51,0x00,0x0c,0x00,0x1b,0x01,0x55,0xb3,0x21,0x21,0x15,0x03,0xbd,0x01,0x55,0x00,0x09,0x00,0x0f,0x01,0x55,0x00,0x15,0x05,0x10,0x00,\r\n0x3f,0xfd,0xde,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xde,0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x03,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x07,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x5d,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,\r\n0x8e,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x01,0x1d,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x06,0xaf,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x2d,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x01,0xff,0x73,0x05,0x4e,0x00,0x8e,0x07,0x0a,0x00,0x0b,0x00,0x24,0x40,0x0f,0x04,0x02,0x00,0x40,\r\n0x0a,0x08,0x06,0x07,0x03,0x09,0x01,0x04,0x0b,0xc0,0x05,0xb8,0x05,0x10,0x00,0x3f,0x1a,0xcc,0x17,0x39,0x01,0x2f,0x33,0x33,0x1a,0xcc,0x32,0x32,0x30,0x31,0x13,0x07,0x17,0x07,0x17,0x07,0x23,0x37,0x27,0x37,0x27,0x37,0x8e,0xa1,0xa1,0xa1,0xa1,0xa1,0x7a,0xa1,0xa1,0xa1,0xa1,0xa1,0x07,0x0a,0x59,0x59,0x58,0x59,0x59,0x59,0x59,0x58,\r\n0x59,0x59,0x00,0x02,0xff,0xa1,0x05,0x4e,0x00,0x5f,0x07,0x0a,0x00,0x0b,0x00,0x17,0x00,0x2a,0xb9,0x00,0x0c,0x01,0x51,0xb2,0x12,0x12,0x00,0x41,0x09,0x01,0x51,0x00,0x06,0x00,0x15,0x01,0x55,0x00,0x0f,0x00,0x09,0x01,0x55,0x00,0x03,0x05,0x10,0x00,0x3f,0xfd,0xde,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x13,0x14,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x5f,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x03,0xff,0x49,0x05,0x4e,0x00,0xb8,\r\n0x07,0x0a,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x32,0xb9,0x00,0x04,0x01,0x51,0xb2,0x0a,0x0a,0x10,0xb8,0x01,0x51,0xb4,0x16,0x03,0x02,0x03,0x19,0xbe,0x01,0x55,0x00,0x13,0x00,0x0d,0x01,0x55,0x00,0x00,0x00,0x07,0x05,0x10,0x00,0x3f,0x33,0xfd,0xde,0xed,0x32,0x01,0x2f,0xdd,0xde,0xed,0x33,0x2f,0xed,0x30,0x31,0x03,0x23,0x11,0x33,\r\n0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x27,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x51,0x66,0x66,0x01,0x09,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0x05,0x58,0x01,0xa8,0xfe,0xa9,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0xd8,0x2a,0x31,0x2f,0x2c,\r\n0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0x45,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x08,0x05,0x00,0x08,0x09,0x03,0x03,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xcd,0xcc,0x30,0x31,0x07,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x15,0x22,0x26,0xbb,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0xa0,0x25,0x2c,0x31,0x23,\r\n0x96,0x64,0x64,0xa7,0x00,0x01,0xff,0x61,0x05,0x4e,0x00,0x9f,0x06,0xdf,0x00,0x03,0x00,0x10,0xb3,0x00,0x02,0x03,0x01,0xb8,0x05,0x10,0x00,0x3f,0xcd,0x01,0x2f,0xcd,0x30,0x31,0x13,0x07,0x27,0x37,0x9f,0x9f,0x9f,0x9f,0x06,0x17,0xc9,0xc9,0xc8,0x00,0x00,0x01,0xfe,0xab,0x05,0x4e,0x01,0x56,0x06,0xa3,0x00,0x31,0x00,0x2d,0x40,0x12,\r\n0x00,0x19,0x0f,0x24,0x21,0x28,0x0b,0x08,0x0f,0x08,0x21,0x2d,0x25,0x05,0x14,0x1e,0x0c,0x2d,0xb8,0x05,0x10,0x00,0x3f,0x33,0xcd,0xdd,0xcd,0x33,0x12,0x39,0x39,0x01,0x2f,0xcd,0x33,0xdc,0xcd,0x33,0x12,0x39,0x39,0x30,0x31,0x03,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,\r\n0x17,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x1b,0x1c,0x28,0x21,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2c,0x17,0x1b,0x28,0x20,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2b,0x05,\r\n0xdf,0x26,0x31,0x1b,0x0b,0x32,0x2d,0x29,0x31,0x0d,0x48,0x14,0x56,0x45,0x24,0x3d,0x2c,0x19,0x15,0x26,0x36,0x1f,0x26,0x31,0x1b,0x0b,0x32,0x2c,0x29,0x32,0x0d,0x47,0x14,0x56,0x45,0x23,0x3e,0x2c,0x19,0x15,0x26,0x37,0x00,0x01,0xfe,0x26,0x05,0x57,0xff,0x9c,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x05,0x00,0x09,0x08,0x09,0x02,0xb8,\r\n0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xdc,0xcd,0x30,0x31,0x03,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0x64,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0x05,0xaa,0x26,0x2d,0x32,0x24,0x91,0x67,0x64,0xab,0x00,0x01,0x00,0x64,0xfe,0x09,0x01,0xc4,0xff,0xb1,0x00,0x05,0x00,0x40,0x40,0x22,0xb4,0x02,0x01,0x03,0x01,0x00,\r\n0x44,0x04,0x54,0x04,0x02,0xcb,0x04,0x01,0x04,0x80,0xcb,0x05,0x01,0x85,0x05,0x01,0x05,0x02,0x02,0x07,0x02,0x05,0x05,0x01,0xc0,0x03,0x03,0x07,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x39,0x3d,0x2f,0x33,0x11,0x01,0x33,0x18,0x2f,0x33,0x5d,0x5d,0x1a,0xcd,0x5d,0x71,0x32,0x39,0x39,0x5d,0x30,0x31,0x01,0x23,0x27,0x37,0x33,0x07,0x01,0xc4,\r\n0x8d,0xd3,0xd3,0x8d,0xd2,0xfe,0x09,0xd4,0xd4,0xd4,0x00,0x02,0xff,0x42,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x17,0x00,0x27,0xb3,0x04,0x00,0x07,0x0c,0xb8,0x01,0x51,0xb5,0x12,0x04,0x03,0x0a,0x0a,0x0f,0xb8,0x01,0x55,0xb2,0x15,0x15,0x19,0x11,0x00,0x33,0x2f,0xed,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xfd,0xde,0xcd,0xce,0x30,\r\n0x31,0x17,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x07,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0xc0,0x33,0x29,0x2a,0x33,0x31,0x2a,0x2a,0x34,0xa0,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x3a,0x2a,0x31,0x2f,0x2c,0x2a,0x32,0x2f,0x00,0x00,0x01,0xff,0x45,\r\n0x05,0x57,0x00,0xbb,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x07,0x03,0x00,0x04,0x03,0x09,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcc,0xcd,0x30,0x31,0x03,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x01,0x00,0x64,\r\n0x05,0x57,0x01,0xda,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x07,0x03,0x00,0x04,0x03,0x09,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcc,0xcd,0x30,0x31,0x13,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x64,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x02,0xfe,0xe1,\r\n0x05,0x57,0x01,0x1f,0x07,0x09,0x00,0x0b,0x00,0x17,0x00,0x25,0x40,0x0e,0x13,0x10,0x0c,0x0c,0x03,0x07,0x00,0x10,0x0f,0x0f,0x04,0x03,0x15,0x09,0xb8,0x05,0x10,0x00,0x3f,0x33,0xdc,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0xcd,0xcc,0x32,0x2f,0xcc,0xcd,0x30,0x31,0x01,0x34,0x36,0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x25,0x34,0x36,\r\n0x33,0x15,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0xfe,0xe1,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0x01,0x20,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0x05,0xa8,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x25,0xba,0xa7,0x64,0x64,0x97,0x22,0x31,0x2c,0x00,0x04,0xfe,0x06,0x05,0x35,0x01,0xfa,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x2b,0x00,0x37,\r\n0x00,0x44,0x40,0x1f,0x29,0x32,0x1e,0x2c,0x24,0x2b,0x1e,0x02,0x16,0x00,0x0d,0x10,0x07,0x29,0x2a,0x35,0x2a,0x27,0x27,0x04,0x02,0x01,0x13,0x04,0x2f,0x21,0x21,0x19,0x0a,0x01,0x04,0x00,0x2f,0xce,0xdc,0xcd,0x33,0x2f,0xcd,0x10,0xcd,0x11,0x39,0x11,0x33,0x2f,0xce,0xcd,0x11,0x39,0x01,0x2f,0xcd,0xdc,0xce,0xcd,0x32,0xde,0xce,0xdc,\r\n0xcd,0x10,0xcd,0x32,0x30,0x31,0x03,0x07,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x28,0x3e,\r\n0x6d,0x29,0x3f,0x4f,0x70,0x71,0x4e,0x54,0x6f,0x1c,0xfe,0xeb,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x02,0x3d,0x1c,0x6f,0x54,0x4e,0x71,0x70,0x4f,0x3f,0x29,0x6d,0x3e,0x01,0x81,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0x73,0x3e,0x6e,0x1e,0x6f,0x53,0x50,0x73,0x70,0x53,0x3e,0x28,0x66,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,\r\n0x95,0x28,0x3e,0x53,0x70,0x73,0x50,0x53,0x6f,0x1e,0x6e,0x3e,0xd4,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,0x00,0x02,0xff,0x17,0x05,0x35,0x00,0xe9,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x24,0x40,0x0f,0x0d,0x16,0x02,0x10,0x08,0x0f,0x02,0x0d,0x0e,0x19,0x0e,0x0b,0x13,0x05,0x0b,0x00,0x2f,0xdc,0xcd,0x10,0xce,0xcd,0x11,0x39,0x01,0x2f,\r\n0xce,0xdc,0xcd,0x10,0xcd,0x32,0x30,0x31,0x03,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x7d,0x1c,0x6f,0x54,0x4e,0x71,0x70,0x4f,0x3f,0x29,0x6d,0x3e,0x01,0x81,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0xe1,0x28,0x3e,0x53,0x70,\r\n0x73,0x50,0x53,0x6f,0x1e,0x6e,0x3e,0xd4,0x2f,0x44,0x44,0x2f,0x2f,0x44,0x44,0x00,0x00,0x01,0xff,0x5b,0x05,0x58,0x00,0xa6,0x07,0x00,0x00,0x11,0x00,0x2f,0x40,0x15,0x06,0x0a,0x09,0x11,0x40,0x00,0xc0,0x09,0x04,0x40,0x0d,0x40,0x09,0x10,0x48,0x0d,0x0d,0x11,0x09,0xc0,0x07,0xb8,0x05,0x10,0x00,0x3f,0x1a,0xcd,0x32,0x39,0x2f,0x2b,\r\n0x1a,0xcd,0x01,0x2f,0x1a,0xdc,0x1a,0xcd,0x10,0xcd,0x32,0x30,0x31,0x13,0x15,0x14,0x06,0x23,0x22,0x27,0x15,0x23,0x11,0x33,0x15,0x16,0x33,0x32,0x36,0x35,0x35,0xa6,0x57,0x57,0x22,0x17,0x64,0x64,0x0f,0x1c,0x30,0x26,0x07,0x00,0x76,0x58,0x65,0x0a,0x7f,0x01,0xa8,0xcf,0x0b,0x2c,0x39,0x75,0x00,0x01,0xff,0x43,0xfe,0x09,0x00,0xbe,\r\n0xff,0xb1,0x00,0x18,0x00,0x30,0x40,0x17,0x09,0x0a,0x10,0x13,0x01,0x00,0x13,0x10,0x13,0x40,0x05,0x40,0x09,0x10,0x48,0x05,0x05,0x12,0xc0,0x09,0x01,0x01,0x1a,0x11,0x00,0x33,0x2f,0x33,0x1a,0xcc,0x39,0x2f,0x2b,0x1a,0xcd,0x32,0x01,0x2f,0xdd,0xcd,0x10,0xdd,0xdd,0xcd,0x30,0x31,0x07,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,\r\n0x33,0x15,0x14,0x0e,0x02,0x07,0x15,0x23,0x35,0x2e,0x03,0x35,0xbd,0x66,0x27,0x30,0x31,0x27,0x66,0x0e,0x20,0x35,0x27,0x66,0x28,0x35,0x20,0x0e,0x4f,0x76,0x35,0x2f,0x2f,0x35,0x76,0x77,0x26,0x40,0x31,0x20,0x06,0x74,0x74,0x06,0x20,0x31,0x40,0x26,0x00,0x01,0xff,0x6a,0xfe,0x09,0x00,0x96,0xff,0xb1,0x00,0x05,0x00,0x15,0xb7,0x05,\r\n0x02,0x04,0x02,0x01,0x05,0x05,0x07,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xce,0xcd,0x30,0x31,0x13,0x21,0x35,0x33,0x11,0x33,0x96,0xfe,0xd4,0xc6,0x66,0xfe,0x09,0x66,0x01,0x42,0x00,0x00,0x01,0xff,0x4b,0xfe,0x09,0x00,0xab,0xff,0xb1,0x00,0x05,0x00,0x40,0x40,0x22,0xb4,0x02,0x01,0x03,0x01,0x00,0x44,0x04,0x54,0x04,0x02,0xcb,\r\n0x04,0x01,0x04,0x80,0xcb,0x05,0x01,0x85,0x05,0x01,0x05,0x02,0x02,0x07,0x02,0x05,0x05,0x01,0xc0,0x03,0x03,0x07,0x11,0x00,0x33,0x2f,0x1a,0xcc,0x39,0x3d,0x2f,0x33,0x11,0x01,0x33,0x18,0x2f,0x33,0x5d,0x5d,0x1a,0xcd,0x5d,0x71,0x32,0x39,0x39,0x5d,0x30,0x31,0x13,0x23,0x27,0x37,0x33,0x07,0xab,0x8d,0xd3,0xd3,0x8d,0xd2,0xfe,0x09,\r\n0xd4,0xd4,0xd4,0x00,0x00,0x01,0xff,0x45,0xfd,0xff,0x00,0xbb,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x04,0x00,0x07,0x04,0x03,0x0a,0x0a,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xcd,0xce,0x30,0x31,0x17,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0xbb,0xb7,0xbf,0x85,0x8b,0x04,0x64,0x06,0xa0,0xba,0xa7,0x64,0x64,\r\n0x96,0x23,0x31,0x2c,0x00,0x02,0xfe,0xe1,0xfd,0xff,0x01,0x1f,0xff,0xb1,0x00,0x0b,0x00,0x17,0x00,0x26,0x40,0x10,0x00,0x07,0x04,0x04,0x0c,0x10,0x13,0x10,0x0f,0x0f,0x04,0x03,0x16,0x0a,0x0a,0x19,0x11,0x00,0x33,0x2f,0x33,0xdc,0xcd,0x33,0x2f,0xcd,0x01,0x2f,0xce,0xcd,0x32,0x10,0xde,0xcd,0x30,0x31,0x05,0x14,0x06,0x23,0x35,0x32,\r\n0x36,0x35,0x34,0x27,0x33,0x16,0x05,0x14,0x06,0x23,0x35,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x01,0x1f,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0xfe,0xe0,0x8c,0x92,0x5a,0x5e,0x04,0x64,0x06,0xa0,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x25,0xba,0xa7,0x64,0x64,0x96,0x23,0x31,0x2c,0x00,0x01,0xff,0x68,0xfd,0xff,0x00,0x99,0xff,0xbb,\r\n0x00,0x09,0x00,0x2a,0x40,0x11,0x04,0x09,0x00,0x08,0x80,0x05,0x03,0x09,0x07,0x04,0x04,0x03,0x02,0x08,0x07,0x07,0x0b,0x11,0x00,0x33,0x2f,0x33,0xcc,0x32,0x39,0x19,0x2f,0x12,0x39,0x01,0x18,0x2f,0x33,0x1a,0xcc,0x32,0x39,0x39,0x30,0x31,0x13,0x07,0x07,0x35,0x37,0x27,0x37,0x37,0x15,0x07,0x99,0x4d,0xe4,0xa8,0xa8,0x4d,0xe4,0xaa,\r\n0xfe,0x67,0x41,0x27,0x5c,0x1b,0xdd,0x41,0x27,0x59,0x1e,0x00,0x00,0x01,0xff,0x45,0x05,0x4d,0x00,0xbb,0x07,0x09,0x00,0x0b,0x00,0x14,0xb5,0x08,0x00,0x05,0x08,0x09,0x02,0xb8,0x05,0x10,0x00,0x3f,0xdc,0xcd,0x01,0x2f,0xcd,0xce,0x30,0x31,0x13,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0xbb,0x06,0x64,0x04,0x8b,0x85,\r\n0xbf,0xb7,0x05,0xa0,0x26,0x2d,0x32,0x24,0x9b,0x67,0x64,0xab,0x00,0x02,0xff,0x17,0x05,0x35,0x00,0xe9,0x07,0x0a,0x00,0x0f,0x00,0x1b,0x00,0x22,0x40,0x0e,0x02,0x16,0x00,0x0d,0x10,0x07,0x02,0x01,0x13,0x04,0x19,0x0a,0x01,0x04,0x00,0x2f,0xce,0xdc,0xcd,0x10,0xcd,0x11,0x39,0x01,0x2f,0xcd,0xdc,0xce,0xcd,0x32,0x30,0x31,0x13,0x07,\r\n0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xe9,0x3e,0x6d,0x29,0x3f,0x4f,0x70,0x71,0x4e,0x54,0x6f,0x1c,0xfe,0xeb,0x43,0x2e,0x2e,0x42,0x42,0x2e,0x2e,0x43,0x05,0x73,0x3e,0x6e,0x1e,0x6f,0x53,0x50,0x73,0x70,0x53,0x3e,0x28,0x66,0x2f,0x44,\r\n0x44,0x2f,0x2f,0x44,0x44,0x00,0xff,0xff,0xff,0x43,0xfe,0x09,0x00,0xbe,0xff,0xb1,0x02,0x06,0x0b,0xd0,0x00,0x00,0x00,0x01,0xff,0x4b,0x05,0x4d,0x00,0xb5,0x07,0x09,0x00,0x05,0x00,0x31,0x40,0x17,0x00,0x04,0x80,0x84,0x05,0x94,0x05,0x02,0x05,0x34,0x03,0x01,0x03,0x34,0x01,0x01,0x01,0x02,0x05,0x05,0x03,0xc0,0x00,0xb8,0x05,0x10,\r\n0x00,0x3f,0x1a,0xcc,0x39,0x3d,0x2f,0x01,0x18,0x2f,0x33,0x71,0x33,0x71,0x33,0x5d,0x1a,0xcd,0x32,0x30,0x31,0x13,0x23,0x27,0x37,0x33,0x07,0xb5,0x8d,0xdd,0xdd,0x8d,0xdc,0x05,0x4d,0xde,0xde,0xde,0x00,0x01,0xff,0x6a,0x05,0x58,0x00,0x96,0x07,0x00,0x00,0x05,0x00,0x14,0xb5,0x05,0x02,0x04,0x05,0x02,0x00,0xb8,0x05,0x10,0x00,0x3f,\r\n0xcd,0xcd,0x01,0x2f,0xce,0xcd,0x30,0x31,0x13,0x21,0x35,0x33,0x11,0x33,0x96,0xfe,0xd4,0xc6,0x66,0x05,0x58,0x66,0x01,0x42,0x00,0x01,0x00,0x64,0xfd,0xff,0x01,0xda,0xff,0xb1,0x00,0x0b,0x00,0x15,0xb7,0x08,0x05,0x00,0x08,0x09,0x02,0x02,0x0d,0x11,0x00,0x33,0x2f,0xdc,0xcd,0x01,0x2f,0xdd,0xce,0x30,0x31,0x17,0x34,0x37,0x33,0x06,\r\n0x15,0x14,0x16,0x33,0x15,0x22,0x26,0x64,0x06,0x64,0x04,0x8b,0x85,0xbf,0xb7,0xa0,0x25,0x2c,0x31,0x23,0x96,0x64,0x64,0xa7,0x00,0x01,0xfd,0x87,0x05,0x4e,0x00,0x32,0x06,0xa3,0x00,0x31,0x00,0x2d,0x40,0x12,0x00,0x19,0x0f,0x24,0x21,0x28,0x0b,0x08,0x0f,0x08,0x21,0x2d,0x25,0x05,0x14,0x1e,0x0c,0x2d,0xb8,0x05,0x10,0x00,0x3f,0x33,\r\n0xcd,0xdd,0xcd,0x33,0x12,0x39,0x39,0x01,0x2f,0xcd,0x33,0xdc,0xcd,0x33,0x12,0x39,0x39,0x30,0x31,0x01,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0xfe,0xc1,0x1c,\r\n0x28,0x21,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2c,0x17,0x1b,0x28,0x20,0x1d,0x12,0x27,0x31,0x1e,0x24,0x1a,0x38,0x3e,0x18,0x2c,0x3e,0x24,0x22,0x37,0x31,0x2b,0x05,0xdf,0x26,0x31,0x1b,0x0b,0x32,0x2d,0x29,0x31,0x0d,0x48,0x14,0x56,0x45,0x24,0x3d,0x2c,0x19,0x15,0x26,0x36,0x1f,0x26,\r\n0x31,0x1b,0x0b,0x32,0x2c,0x29,0x32,0x0d,0x47,0x14,0x56,0x45,0x23,0x3e,0x2c,0x19,0x15,0x26,0x37,0x00,0x00,0x02,0xff,0x29,0x05,0x4e,0x00,0xd8,0x06,0xfd,0x00,0x0b,0x00,0x17,0x00,0x18,0xb7,0x12,0x06,0x0c,0x00,0x15,0x03,0x0f,0x09,0xb8,0x05,0x10,0x00,0x3f,0xcd,0xdc,0xcd,0x01,0x2f,0xcd,0xdc,0xcd,0x30,0x31,0x03,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0xd7,0x78,0x5f,0x5f,0x79,0x79,0x5f,0x5f,0x78,0x60,0x43,0x34,0x35,0x43,0x43,0x35,0x34,0x43,0x06,0x25,0x55,0x83,0x83,0x55,0x55,0x82,0x82,0x55,0x2f,0x48,0x48,0x2f,0x2f,0x49,0x49,0x00,0xff,0xff,0xff,0xa4,0x05,0x4e,0x00,0x5d,\r\n0x06,0x05,0x02,0x06,0x0b,0x5c,0x00,0x00,0x00,0x01,0x00,0xab,0x00,0x00,0x02,0xcb,0x04,0xde,0x00,0x19,0x00,0x2c,0xb5,0x0b,0x0b,0x18,0x18,0x1b,0x15,0x41,0x0a,0x01,0x50,0x00,0x00,0x00,0x16,0x01,0x54,0x00,0x18,0x01,0x4d,0x00,0x10,0x01,0x54,0x00,0x07,0x01,0x4a,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,\r\n0x31,0x30,0x13,0x34,0x3e,0x04,0x33,0x32,0x16,0x17,0x17,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x11,0x21,0x17,0x21,0xab,0x0b,0x1b,0x2f,0x49,0x65,0x45,0x25,0x56,0x1c,0x18,0x08,0x1f,0x24,0x24,0x0f,0x44,0x52,0x2b,0x0d,0x01,0x62,0x13,0xfd,0xe0,0x03,0x1b,0x3a,0x71,0x64,0x54,0x3e,0x22,0x08,0x06,0x94,0x02,0x04,0x03,0x02,0x2c,0x50,\r\n0x6d,0x41,0xfd,0x85,0xa2,0x00,0xff,0xff,0x00,0xb6,0x00,0xfc,0x01,0x6f,0x04,0xcd,0x02,0x26,0x0b,0x71,0x00,0x00,0x00,0x07,0x0b,0x5e,0x01,0x11,0xfe,0xe4,0x00,0x01,0xfe,0xb2,0x05,0x67,0x01,0x4f,0x06,0x78,0x00,0x0d,0x00,0x15,0xb7,0x00,0x01,0x08,0x07,0x00,0x08,0x0b,0x04,0x00,0x2f,0xcd,0xcc,0x32,0x01,0x2f,0x33,0xcc,0x32,0x30,\r\n0x31,0x13,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0xc8,0x87,0x17,0xaa,0x8d,0x8e,0xa9,0x18,0x87,0x10,0x60,0x51,0x5e,0x60,0x06,0x78,0x84,0x8d,0x8a,0x87,0x49,0x54,0x51,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0x9a,0x00,0x19,0x00,0x8c,0x40,0x5f,0x59,0x17,0x01,0x48,0x17,0x01,0x56,0x13,0x01,0x79,\r\n0x06,0x01,0x6a,0x06,0x01,0x0b,0x06,0x1b,0x06,0x02,0x9a,0x05,0x01,0x68,0x05,0x01,0x2a,0x05,0x01,0x96,0x03,0x01,0x24,0x03,0x01,0x05,0x03,0x15,0x03,0x02,0x66,0x02,0x76,0x02,0x02,0x0d,0x0d,0x00,0x7d,0x10,0x19,0x20,0x19,0x30,0x19,0x03,0x19,0x19,0x1b,0x0f,0x11,0x7d,0x08,0x0b,0x0b,0x8a,0x0a,0x01,0x69,0x0a,0x79,0x0a,0x02,0x4b,\r\n0x0a,0x01,0x0a,0x0f,0x08,0x1f,0x08,0x02,0x08,0x00,0x00,0x15,0x0a,0x0f,0x91,0x0d,0x03,0x15,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xc4,0x12,0x39,0x2f,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x33,0x2f,0x10,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x01,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x10,0x13,0x23,0x35,0x21,0x15,0x21,0x04,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x05,0xaa,0xac,0xb6,0xfe,0xb6,0xfe,0xc6,0xb6,0xb0,0xf1,0xf1,0x05,0x4c,0xfc,0x89,0xfe,0xdb,0x7a,0x87,0xef,0xfc,0x86,0x7a,0x02,0xc8,0xfe,0xb4,0xc4,0xd0,0xc8,0xc1,0x01,0x3b,0x01,0x55,0x01,0x01,\r\n0x98,0x98,0xef,0xfe,0xa8,0xf4,0x9c,0xac,0xaa,0x9b,0x01,0x04,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0xf0,0x05,0x9a,0x00,0x16,0x00,0x5a,0x40,0x39,0x46,0x0e,0x01,0x37,0x0e,0x01,0x78,0x05,0x01,0x5b,0x05,0x01,0x16,0x15,0x7e,0x12,0x02,0x02,0x18,0x0a,0x0c,0x7e,0x68,0x09,0x78,0x09,0x02,0x09,0x0f,0x07,0x2f,0x07,0x3f,0x07,0x4f,0x07,\r\n0x04,0x07,0x40,0x10,0x13,0x48,0x07,0x02,0x04,0x91,0x12,0x10,0x10,0x15,0x0a,0x13,0x03,0x15,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x5d,0xed,0x32,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x33,0x06,\r\n0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x11,0x33,0x04,0xf0,0xfe,0x97,0xbc,0xc3,0xd7,0xfe,0x5b,0xb0,0x63,0x52,0x55,0x96,0xb2,0xbd,0xa8,0xc1,0x02,0x7b,0x73,0x01,0x08,0xd8,0xfe,0xb4,0xce,0xe0,0x97,0x59,0x5c,0x70,0x02,0x8a,0xfa,0xfe,0x00,0x00,0x01,0x00,0x64,0xff,0x35,0x05,0x23,0x05,0xb2,0x00,0x17,0x00,0x5b,0x40,0x37,\r\n0x82,0x14,0x01,0x8a,0x12,0x01,0x76,0x08,0x01,0x67,0x08,0x01,0x65,0x07,0x01,0x7a,0x05,0x01,0x69,0x05,0x01,0x16,0x7e,0x04,0x17,0x7e,0x02,0x04,0x02,0x04,0x02,0x19,0x0c,0x0a,0x7e,0x0d,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x0c,0x0d,0x0d,0x16,0x06,0x91,0x13,0x04,0x16,0x91,0x01,0x03,0x12,0x00,0x3f,0xce,0xed,0x3f,0xed,0x11,0x39,0x2f,\r\n0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x23,0x35,0x21,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x11,0x21,0x05,0x23,0x9c,0xfe,0x89,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,\r\n0xd5,0x01,0xa8,0x01,0x6b,0xcb,0xcb,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xfc,0xb2,0x00,0x02,0x00,0x5a,0xff,0xe8,0x05,0x4c,0x05,0x9a,0x00,0x16,0x00,0x26,0x00,0x7c,0x40,0x53,0x29,0x25,0x79,0x25,0x02,0x26,0x21,0x76,0x21,0x02,0x26,0x1d,0x76,0x1d,0x02,0x29,0x19,0x79,0x19,0x02,\r\n0x8a,0x0b,0x01,0x8a,0x0a,0x01,0x89,0x06,0x01,0x86,0x02,0x01,0x12,0x7e,0x0c,0x11,0x11,0x00,0x7d,0x17,0x50,0x0c,0x01,0x10,0x17,0x20,0x17,0x50,0x17,0x60,0x17,0x04,0x0c,0x17,0x0c,0x17,0x28,0x1f,0x7d,0x08,0x0e,0x0e,0x0f,0x08,0x1f,0x08,0x2f,0x08,0x03,0x08,0x1b,0x91,0x0c,0x13,0x12,0x0d,0x91,0x0f,0x03,0x23,0x91,0x04,0x13,0x00,\r\n0x3f,0xed,0x3f,0xfd,0xc4,0xdd,0x32,0xed,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x34,0x37,0x36,0x37,0x35,0x21,0x35,0x21,0x15,0x21,0x15,0x16,0x17,0x16,0x07,0x34,0x27,\r\n0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x4c,0xbe,0xb3,0xfe,0xfa,0xfe,0xfc,0xb7,0xc0,0xa0,0x99,0xec,0xfd,0xdb,0x04,0xf2,0xfd,0xdb,0xe9,0x9b,0xa1,0xb0,0x87,0x82,0xc0,0xbf,0x82,0x88,0x87,0x82,0xc0,0xbf,0x82,0x88,0x02,0x28,0xfe,0xfa,0xa2,0x98,0xa0,0xa9,0x01,0x04,0xee,0xa0,0x99,0x16,0x90,0x98,\r\n0x98,0x90,0x19,0xa0,0xa5,0xe5,0xc3,0x79,0x73,0x74,0x7a,0xc1,0xc3,0x79,0x73,0x74,0x79,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x03,0xb8,0x05,0xb2,0x00,0x13,0x00,0x51,0x40,0x34,0x96,0x12,0x01,0x72,0x12,0x82,0x12,0x02,0x8a,0x10,0x01,0x79,0x10,0x01,0x7a,0x0f,0x01,0x56,0x06,0x66,0x06,0x02,0x59,0x03,0x69,0x03,0x02,0x00,0x7e,0x02,\r\n0x02,0x15,0x0a,0x08,0x7e,0x0b,0x0f,0x0d,0x1f,0x0d,0x02,0x0d,0x0a,0x0b,0x0b,0x01,0x04,0x91,0x11,0x04,0x01,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,\r\n0x37,0x36,0x33,0x20,0x11,0x03,0xb8,0xa8,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0x00,0x01,0x00,0x64,0x00,0x00,0x05,0x23,0x05,0xb2,0x00,0x19,0x00,0x6f,0x40,0x44,0xa7,0x16,0x01,0x84,0x16,0x01,0x71,0x16,0x01,0x06,\r\n0x16,0x01,0x7a,0x14,0x8a,0x14,0x02,0x7a,0x13,0x01,0x66,0x0a,0x01,0x6a,0x07,0x01,0x03,0x18,0x7e,0x06,0x19,0x7e,0x01,0x00,0x06,0x01,0x06,0x01,0x06,0x01,0x1b,0x0e,0x0c,0x7e,0x0f,0x0f,0x11,0x1f,0x11,0x02,0x11,0x0e,0x0f,0x19,0x91,0x01,0x03,0x0f,0x03,0x0f,0x03,0x05,0x08,0x91,0x15,0x04,0x05,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,\r\n0x39,0x2f,0x2f,0x10,0xce,0xed,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x23,0x11,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x15,0x21,0x05,0x23,0x9c,\r\n0xcf,0xa8,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0x01,0x6b,0x01,0xc2,0xcb,0xfd,0x73,0x03,0xe0,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xc1,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x9a,0x05,0x9a,0x00,0x12,0x00,0x22,0x00,0x51,0x40,0x18,0x4a,0x21,0x5a,0x21,0x02,0x45,\r\n0x1d,0x55,0x1d,0x02,0x45,0x19,0x55,0x19,0x02,0x5a,0x15,0x01,0x49,0x15,0x01,0x00,0x7e,0x13,0xb8,0xff,0xc0,0x40,0x19,0x09,0x0c,0x48,0x13,0x13,0x24,0x1b,0x7e,0x0d,0x7e,0x0a,0x08,0x17,0x91,0x0d,0x0f,0x10,0x09,0x91,0x0c,0x03,0x1f,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x01,0x2f,0xce,0xed,0xed,0x12,0x39,0x2f,\r\n0x2b,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x21,0x35,0x21,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x9a,0x85,0x8b,0xee,0xe7,0x87,0x84,0xfe,0x88,0x02,0x20,0x88,0xda,0xee,0x80,0x78,0xa8,0x4a,0x55,\r\n0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0x03,0x0e,0x98,0xfe,0x07,0x77,0x95,0x8d,0xf8,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,0x73,0x74,0x66,0x00,0x02,0x00,0x5e,0x00,0x00,0x05,0xe7,0x05,0x9a,0x00,0x0e,0x00,0x17,0x00,0x6b,0x40,0x45,0x06,0x15,0x86,0x15,0x02,0x9b,0x0a,0x01,\r\n0x89,0x0a,0x01,0x7c,0x0a,0x01,0x6e,0x0a,0x01,0x0a,0x48,0x0e,0x49,0x29,0x0a,0x01,0x1a,0x0a,0x01,0x59,0x07,0x69,0x07,0x02,0x0d,0x03,0x7e,0x0f,0x0e,0x7e,0x02,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x02,0x19,0x13,0x7d,0x0f,0x09,0x1f,0x09,0x02,0x09,0x0e,0x91,0x01,0x03,0x03,0x04,0x10,0x91,0x0c,0x03,0x0f,0x91,0x04,0x12,0x00,0x3f,0xed,\r\n0x3f,0xed,0x11,0x39,0x2f,0xce,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x21,0x20,0x27,0x26,0x11,0x10,0x21,0x21,0x11,0x21,0x01,0x11,0x23,0x20,0x11,0x10,0x17,0x16,0x21,0x05,0xe7,0x9c,0xcf,0xfe,0xe8,0xfe,\r\n0xa8,0xd4,0xda,0x02,0xf6,0x01,0x28,0x01,0x6b,0xfd,0xed,0x7c,0xfd,0xb6,0x9f,0x9c,0x01,0x19,0x01,0xc2,0xcb,0xfd,0x73,0xc2,0xc8,0x01,0x55,0x02,0xbb,0xfd,0x8b,0xfd,0x73,0x04,0x6a,0xfd,0xd9,0xfe,0xe9,0x98,0x94,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x00,0x05,0x00,0x1a,0x40,0x0c,0x05,0x7e,0x02,0x02,0x07,0x03,\r\n0x02,0x91,0x05,0x03,0x01,0x12,0x00,0x3f,0x3f,0xed,0x01,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x35,0x21,0x03,0x08,0xa8,0xfd,0xc0,0x02,0xe8,0x05,0x02,0x98,0x00,0x02,0x00,0x8c,0x00,0x00,0x04,0x7c,0x05,0x9a,0x00,0x11,0x00,0x21,0x00,0x6a,0x40,0x45,0x35,0x0f,0x01,0x35,0x0e,0x01,0x3a,0x06,0x01,0x3a,0x05,0x01,\r\n0x45,0x0f,0x01,0x46,0x0e,0x01,0x4a,0x06,0x01,0x49,0x05,0x01,0x12,0x7e,0x11,0x7e,0x10,0x02,0x01,0x02,0x02,0x23,0x1a,0x7e,0x0b,0x7e,0x08,0x16,0x91,0x64,0x0b,0x01,0x35,0x0b,0x45,0x0b,0x55,0x0b,0x03,0x0b,0x0d,0x0a,0x03,0x1e,0x91,0x49,0x02,0x59,0x02,0x02,0x3a,0x02,0x01,0x02,0x04,0x01,0x12,0x00,0x3f,0xde,0x32,0x5d,0x5d,0xed,\r\n0x3f,0xde,0x32,0x5d,0x5d,0xed,0x01,0x2f,0xed,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x36,0x33,0x32,0x17,0x16,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x7c,\r\n0xa8,0x88,0xda,0xed,0x81,0x78,0xa8,0x88,0xda,0xed,0x81,0x78,0xa8,0x4c,0x55,0xa9,0xa6,0x5c,0x54,0x4c,0x55,0xa9,0xa6,0x5c,0x54,0x01,0x30,0x77,0x96,0x8c,0xf2,0x02,0xcd,0xfe,0xd0,0x77,0x96,0x8c,0xf2,0xaf,0x67,0x74,0x75,0x6a,0xab,0xaf,0x67,0x74,0x75,0x6a,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x9a,0x05,0x9a,0x00,0x13,0x00,0x23,\r\n0x00,0x61,0x40,0x3f,0x43,0x12,0x53,0x12,0x02,0x4a,0x06,0x01,0x49,0x05,0x59,0x05,0x02,0x5b,0x02,0x01,0x4a,0x02,0x01,0x00,0x7e,0x10,0x14,0x20,0x14,0x30,0x14,0x03,0x14,0x14,0x07,0x25,0x0c,0x7e,0x0a,0x1c,0x7e,0x0e,0x7e,0x0f,0x07,0x01,0x07,0x18,0x91,0x55,0x0e,0x01,0x46,0x0e,0x01,0x0e,0x10,0x10,0x0a,0x08,0x91,0x0d,0x03,0x20,\r\n0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xce,0x3f,0x33,0x5d,0x5d,0xed,0x01,0x2f,0x5d,0xed,0xed,0xde,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x00,0x35,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,\r\n0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0x9a,0x85,0x8b,0xee,0xe2,0xfe,0xf0,0xdc,0x9c,0x02,0x20,0x88,0xda,0xee,0x80,0x78,0xa8,0x4a,0x55,0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x01,0x20,0xec,0x03,0x0e,0xcb,0x01,0x63,0xfe,0x07,0x77,0x95,0x8d,0xf8,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,\r\n0x73,0x74,0x66,0x00,0x00,0x02,0x00,0x5c,0xff,0xe8,0x05,0xb0,0x05,0x9a,0x00,0x17,0x00,0x21,0x00,0x7c,0x40,0x53,0x5b,0x0f,0x01,0x3a,0x0f,0x4a,0x0f,0x02,0x3a,0x0e,0x4a,0x0e,0x5a,0x0e,0x03,0x5a,0x0a,0x01,0x49,0x0a,0x01,0x3a,0x0a,0x01,0x49,0x09,0x01,0x36,0x07,0x46,0x07,0x56,0x07,0x03,0x35,0x06,0x45,0x06,0x55,0x06,0x03,0x17,\r\n0x7e,0x01,0x03,0x16,0x7e,0x11,0x00,0x19,0x10,0x19,0x02,0x19,0x19,0x23,0x1c,0x7e,0x0c,0x13,0x13,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x11,0x16,0x91,0x03,0x01,0x19,0x19,0x1e,0x12,0x91,0x15,0x03,0x1e,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xcc,0xc4,0xfd,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,\r\n0xc4,0xfd,0xc4,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x01,0x11,0x21,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x05,0xb0,0x9c,0xc8,0x83,0x87,0xe8,0xef,0x8a,0x85,0x78,0x7e,0xef,0x01,\r\n0x63,0xfc,0xf4,0x03,0xb4,0x01,0x64,0xfd,0xf4,0xfe,0xaf,0xfe,0xb1,0x01,0x4a,0xa7,0x5b,0x54,0x02,0x9d,0xcb,0xfe,0x8c,0xea,0x8f,0x93,0x93,0x8f,0xf0,0xf0,0x87,0x8f,0x01,0x02,0x98,0xfe,0x66,0xfd,0xf8,0x01,0x70,0xfe,0x8c,0xfe,0x7e,0x72,0x69,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xa4,0x05,0x9a,0x00,0x19,0x00,0x3d,0x40,0x20,\r\n0x95,0x17,0x01,0x94,0x0b,0x01,0x0f,0x0f,0x00,0x7e,0x02,0x02,0x08,0x1b,0x13,0x06,0x7e,0x08,0x13,0x15,0x91,0x06,0x04,0x04,0x08,0x10,0x91,0x0e,0x03,0x01,0x08,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x21,0x23,0x11,0x34,0x23,\r\n0x22,0x07,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x21,0x15,0x21,0x22,0x15,0x11,0x36,0x33,0x32,0x17,0x16,0x15,0x04,0xa4,0xa8,0xf5,0xb4,0xe2,0xa8,0x6c,0x67,0xb8,0x02,0x14,0xfd,0xfe,0xf5,0xe4,0xc6,0xb7,0x67,0x6b,0x02,0x12,0xe8,0x6e,0xfd,0x74,0x04,0x28,0xb5,0x60,0x5d,0x98,0xe8,0xfe,0xfa,0x7a,0x5e,0x61,0xb5,0x00,0x02,0x00,0x5e,\r\n0xfe,0xea,0x05,0xaa,0x05,0xb2,0x00,0x1f,0x00,0x2f,0x00,0xc8,0x40,0x8d,0x59,0x2e,0x01,0x99,0x2d,0x01,0x6a,0x2d,0x01,0x54,0x2b,0x64,0x2b,0x02,0x56,0x2a,0x86,0x2a,0x02,0x86,0x26,0x01,0x67,0x26,0x01,0x56,0x26,0x01,0x64,0x25,0x01,0x56,0x25,0x01,0x6a,0x23,0x01,0x59,0x22,0x01,0x86,0x16,0x01,0x75,0x16,0x01,0x76,0x12,0x01,0x27,\r\n0x12,0x01,0x13,0x12,0x01,0x04,0x12,0x01,0x24,0x11,0x94,0x11,0x02,0x07,0x11,0x01,0x29,0x0f,0x99,0x0f,0x02,0x79,0x0e,0x01,0x0a,0x0e,0x1a,0x0e,0x02,0x79,0x0a,0x01,0x1b,0x0a,0x01,0x0a,0x0a,0x01,0x2a,0x09,0x9a,0x09,0x02,0x09,0x09,0x01,0x19,0x7e,0x06,0x1f,0x1f,0x14,0x7d,0x20,0x40,0x06,0x01,0x10,0x20,0x20,0x20,0x30,0x20,0x03,\r\n0x06,0x20,0x06,0x20,0x31,0x28,0x7d,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x24,0x91,0x10,0x04,0x1f,0x1d,0x91,0x00,0x02,0x2c,0x91,0x06,0x08,0x13,0x00,0x3f,0x33,0xed,0xdc,0x32,0xed,0x32,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x06,0x23,0x22,0x27,0x26,0x27,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x03,0x10,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,\r\n0x33,0x32,0x37,0x36,0x05,0xaa,0x34,0x3c,0x88,0x5e,0x61,0x02,0x6e,0x85,0xfe,0xc8,0xb8,0xb0,0xb1,0xbb,0x01,0x4c,0x01,0x35,0xb4,0xab,0xba,0x23,0x43,0x39,0x32,0x45,0x3c,0x34,0xb0,0x73,0x81,0xfc,0xf2,0x8b,0x7f,0x7b,0x88,0xed,0xfc,0x86,0x7a,0xff,0x17,0x51,0x54,0x7e,0x25,0xd1,0xc7,0x01,0x3c,0x01,0x51,0xcd,0xd8,0xd2,0xc7,0xfe,\r\n0xc6,0xfe,0xa1,0xcc,0x22,0x48,0x37,0x4a,0x2c,0x28,0x1f,0x03,0x34,0x01,0x05,0x9d,0xb0,0xb3,0xa3,0xf9,0xf5,0xa3,0xb4,0xaa,0x9b,0x00,0x00,0x01,0x00,0x32,0xff,0xe8,0x05,0xd5,0x05,0x9a,0x00,0x0f,0x00,0x45,0x40,0x2a,0x35,0x0c,0x01,0x26,0x0c,0x01,0x96,0x0a,0x01,0x33,0x0a,0x01,0x25,0x0a,0x01,0x59,0x03,0x01,0x4b,0x03,0x01,0x4a,\r\n0x01,0x01,0x0f,0x7e,0x0d,0x0d,0x11,0x09,0x7e,0x07,0x05,0x0e,0x05,0x91,0x08,0x03,0x0b,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0xc4,0x01,0x2f,0xcd,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x21,0x35,0x21,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x05,0xd5,0xfd,\r\n0xdf,0xfd,0xf6,0xfe,0x88,0x02,0x20,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0x98,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x03,0x71,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0x43,0x05,0x9a,0x00,0x16,0x00,0x48,0x40,0x29,0x47,0x10,0x01,0x36,0x10,0x01,0x58,0x06,0x01,0x5a,0x05,0x01,0x14,0x00,0x7e,0x02,0x02,0x18,\r\n0x0c,0x0e,0x7e,0x0a,0x09,0x0f,0x07,0x01,0x07,0x14,0x12,0x91,0x02,0x04,0x04,0x01,0x09,0x91,0x15,0x0c,0x03,0x01,0x12,0x00,0x3f,0x3f,0xc4,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x5d,0x33,0xce,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x21,0x35,\r\n0x21,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x05,0x43,0xa8,0xbc,0xc3,0xd7,0xfe,0x23,0xfe,0xc8,0x02,0x20,0x63,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x08,0xd8,0x94,0x86,0x98,0xce,0xe0,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0x64,0xff,0xe8,0x05,0x23,0x05,0x9a,0x00,0x19,0x00,0x61,0x40,0x3c,\r\n0x69,0x14,0x79,0x14,0x02,0x66,0x11,0x76,0x11,0x02,0x8a,0x07,0x01,0x96,0x05,0x01,0x80,0x05,0x01,0x05,0x05,0x01,0x19,0x7e,0x01,0x18,0x03,0x7e,0x00,0x15,0x01,0x15,0x15,0x1b,0x0d,0x0f,0x7e,0x0c,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0d,0x0c,0x19,0x91,0x01,0x03,0x0c,0x03,0x0c,0x03,0x16,0x03,0x13,0x91,0x06,0x13,0x00,0x3f,0xed,0x3f,\r\n0x39,0x39,0x2f,0x2f,0x10,0xce,0xed,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x12,0x39,0x2f,0x5d,0xfd,0xc4,0xde,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x23,0x15,0x10,0x21,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x11,0x11,0x33,0x11,0x21,0x05,0x23,0x9c,0xcf,0xfe,0x58,0xd5,\r\n0x71,0x66,0x34,0x96,0x22,0x36,0x44,0x8a,0x01,0x00,0xa8,0x01,0x6b,0x01,0xc2,0xcb,0xd9,0xfe,0x34,0x8a,0x7c,0xc9,0x8e,0x6a,0x46,0x4e,0x64,0x83,0x56,0x6c,0x01,0x48,0x03,0xe0,0xfd,0x8b,0x00,0x01,0x00,0xb0,0xff,0xe8,0x04,0x04,0x05,0x9a,0x00,0x13,0x00,0x4b,0x40,0x2f,0x59,0x0d,0x69,0x0d,0x02,0x66,0x0a,0x01,0x57,0x0a,0x01,0x99,\r\n0x05,0x01,0x8a,0x05,0x01,0x7b,0x05,0x01,0x75,0x02,0x01,0x12,0x00,0x7e,0x11,0x10,0x0f,0x20,0x0f,0x02,0x0f,0x0f,0x15,0x09,0x7e,0x06,0x11,0x12,0x12,0x08,0x03,0x0b,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,\r\n0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x16,0x04,0x04,0x65,0x72,0xd5,0xfe,0x58,0xa8,0x01,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x01,0xb7,0xc9,0x7c,0x8a,0x01,0xcc,0x03,0xe6,0xfc,0x20,0xfe,0xb8,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,\r\n0x00,0x0e,0x00,0x15,0x00,0x53,0x40,0x34,0x38,0x15,0x48,0x15,0x02,0x56,0x09,0x01,0x57,0x06,0x01,0x77,0x05,0x87,0x05,0x02,0x65,0x05,0x01,0x53,0x05,0x01,0x0e,0x0e,0x07,0x7d,0x10,0x0f,0x20,0x0f,0x02,0x0f,0x0f,0x01,0x17,0x13,0x0c,0x7e,0x01,0x0c,0x91,0x14,0x14,0x0d,0x12,0x91,0x02,0x03,0x0d,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,\r\n0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x23,0x11,0x21,0x03,0x10,0x21,0x23,0x11,0x33,0x20,0x04,0x29,0xfc,0x93,0x01,0x8a,0xdc,0x7e,0x89,0x99,0x8f,0xe0,0xbd,0x02,0xc5,0xb0,0xfe,\r\n0xb0,0xc5,0xb0,0x01,0x65,0x05,0x9a,0x66,0x70,0xd6,0xdb,0x7f,0x76,0xfe,0x7a,0x03,0x4e,0x01,0x1c,0xfd,0xb4,0x00,0x00,0x02,0x00,0x5e,0xfe,0xea,0x05,0xaa,0x05,0xb2,0x00,0x1d,0x00,0x2d,0x00,0xc8,0x40,0x8d,0x6a,0x2c,0x01,0x59,0x2c,0x01,0x69,0x2b,0x99,0x2b,0x02,0x64,0x29,0x01,0x87,0x28,0x01,0x55,0x28,0x01,0x87,0x24,0x01,0x55,\r\n0x24,0x01,0x63,0x23,0x01,0x56,0x23,0x01,0x6b,0x21,0x01,0x59,0x20,0x01,0x07,0x1c,0x01,0x75,0x18,0x01,0x16,0x18,0x01,0x05,0x18,0x01,0x24,0x17,0x94,0x17,0x02,0x15,0x17,0x01,0x07,0x17,0x01,0x99,0x15,0x01,0x2a,0x15,0x01,0x18,0x15,0x01,0x19,0x14,0x79,0x14,0x02,0x0a,0x14,0x01,0x1a,0x10,0x7a,0x10,0x02,0x0b,0x10,0x01,0x99,0x0f,\r\n0x01,0x2c,0x0f,0x01,0x1a,0x0f,0x01,0x09,0x0f,0x01,0x47,0x1c,0x01,0x1c,0x00,0x7e,0x0c,0x05,0x0a,0x0a,0x1a,0x7d,0x10,0x1e,0x20,0x1e,0x30,0x1e,0x03,0x1e,0x1e,0x2f,0x26,0x7d,0x0f,0x12,0x1f,0x12,0x02,0x12,0x22,0x91,0x16,0x04,0x05,0x91,0x06,0x2a,0x91,0x1c,0x0c,0x0e,0x13,0x00,0x3f,0x33,0x33,0xed,0xde,0xed,0x3f,0xed,0x01,0x2f,\r\n0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x33,0x2f,0xcc,0x33,0xed,0x32,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x14,0x06,0x07,0x06,0x23,0x35,0x16,0x37,0x36,0x35,0x34,0x27,0x06,0x21,0x20,0x27,0x26,\r\n0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x10,0x07,0x16,0x03,0x10,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x05,0xaa,0x86,0x6b,0x25,0x4d,0x22,0x27,0x82,0x41,0xb4,0xfe,0xe1,0xfe,0xc8,0xb8,0xb0,0xb1,0xbb,0x01,0x4c,0x01,0x35,0xb4,0xab,0x7b,0x7b,0xb0,0x73,0x81,0xfc,0xf2,0x8b,0x7f,0x7b,0x88,\r\n0xed,0xfc,0x86,0x7a,0x1c,0x64,0xa2,0x21,0x0b,0x87,0x03,0x0c,0x28,0x74,0x52,0x2c,0xac,0xd1,0xc7,0x01,0x3c,0x01,0x51,0xcd,0xd8,0xd2,0xc7,0xfe,0xc6,0xfe,0xe3,0xbc,0x55,0x02,0x17,0x01,0x05,0x9d,0xb0,0xb3,0xa3,0xf9,0xf5,0xa3,0xb4,0xaa,0x9b,0x00,0x00,0x03,0x00,0x5a,0x00,0x00,0x05,0x4c,0x05,0xb2,0x00,0x12,0x00,0x1b,0x00,0x24,\r\n0x00,0x79,0x40,0x51,0x56,0x24,0x01,0x65,0x23,0x75,0x23,0x02,0x65,0x1f,0x75,0x1f,0x02,0x7b,0x1a,0x01,0x6a,0x1a,0x01,0x59,0x16,0x01,0x6a,0x15,0x7a,0x15,0x02,0x97,0x11,0x01,0x85,0x11,0x01,0x89,0x0d,0x01,0x98,0x09,0x01,0x8b,0x09,0x01,0x86,0x02,0x01,0x13,0x7d,0x10,0x00,0x20,0x00,0x02,0x00,0x04,0x18,0x7e,0x07,0x21,0x7d,0x1f,\r\n0x0b,0x2f,0x0b,0x02,0x0b,0x1c,0x07,0x18,0x1c,0x91,0x07,0x04,0x04,0x06,0x17,0x1d,0x91,0x0f,0x04,0x06,0x12,0x00,0x3f,0x3f,0xed,0x32,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xdd,0x5d,0xed,0x10,0xfd,0xc4,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x07,\r\n0x11,0x23,0x11,0x26,0x27,0x26,0x35,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x03,0x34,0x27,0x26,0x27,0x11,0x36,0x37,0x36,0x05,0x11,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x05,0x4c,0xa1,0x9b,0xe9,0xa8,0xec,0x99,0xa0,0xc0,0xb7,0x01,0x04,0x01,0x06,0xb3,0xbe,0xb0,0x6c,0x67,0xa2,0xa3,0x66,0x6c,0xfd,0xe3,0xa3,0x66,0x6c,0x6c,0x67,0x03,\r\n0x72,0xec,0xa5,0xa0,0x19,0xfe,0xd8,0x01,0x28,0x16,0x99,0xa0,0xee,0x01,0x04,0xa9,0xa0,0x98,0xa2,0xfe,0xf3,0xab,0x75,0x6e,0x1a,0xfc,0xaf,0x19,0x6f,0x75,0xfc,0x03,0x51,0x19,0x6f,0x75,0xac,0xaa,0x75,0x6f,0x00,0x01,0x00,0x32,0x00,0x00,0x04,0x62,0x05,0x9a,0x00,0x0f,0x00,0x46,0x40,0x2b,0x00,0x7e,0x20,0x02,0xa0,0x02,0xb0,0x02,\r\n0xc0,0x02,0x04,0x02,0x03,0x0e,0x7e,0x06,0x07,0x7e,0x2f,0x09,0xaf,0x09,0xbf,0x09,0xcf,0x09,0x04,0x09,0x0b,0x06,0x0e,0x09,0x0b,0x91,0x06,0x01,0x03,0x03,0x05,0x0d,0x03,0x05,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xce,0xc4,0xfd,0xce,0xc4,0x01,0x2f,0xc4,0xdc,0x5d,0xed,0x10,0xfd,0xc4,0xdd,0x5d,0xed,0x31,0x30,0x01,0x23,0x35,0x21,\r\n0x11,0x23,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x33,0x11,0x21,0x04,0x62,0x9c,0xfe,0xd8,0xa8,0xfe,0x3c,0x9c,0x01,0x28,0xa8,0x01,0xc4,0x02,0x9d,0xcb,0xfc,0x98,0x03,0x68,0x01,0x63,0xcb,0x01,0x9a,0xfe,0x66,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0xb2,0x00,0x0d,0x00,0x38,0x40,0x21,0x45,0x0c,0x01,0x44,0x0a,0x01,0x3a,0x05,\r\n0x01,0x29,0x05,0x01,0x3a,0x03,0x01,0x29,0x03,0x01,0x00,0x7e,0x02,0x02,0x0f,0x06,0x7e,0x08,0x04,0x91,0x0b,0x04,0x01,0x07,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x04,0xd5,0xa8,0xfe,\r\n0x93,0xfe,0x92,0xa8,0x02,0x17,0x02,0x14,0x03,0x71,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x12,0x00,0x3a,0x40,0x20,0x36,0x0c,0x01,0x68,0x06,0x01,0x4a,0x06,0x5a,0x06,0x02,0x10,0x00,0x7e,0x02,0x02,0x14,0x09,0x7e,0x07,0x02,0x04,0x91,0x10,0x0e,0x0e,\r\n0x00,0x09,0x11,0x03,0x00,0x12,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x11,0x33,0x11,0x14,0x17,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0xa2,0xa8,0xbc,0xc3,0xd7,0xfe,0xa8,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,\r\n0x7b,0x73,0x01,0x08,0xd8,0x01,0xb2,0xfe,0x52,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x81,0x05,0x9a,0x00,0x21,0x00,0x5c,0x40,0x38,0x86,0x1c,0x01,0x36,0x0f,0x01,0x36,0x0b,0x96,0x0b,0x02,0x27,0x0b,0x01,0x49,0x06,0x59,0x06,0x02,0x49,0x02,0x59,0x02,0x02,0x4a,0x01,0x01,0x21,0x7e,0x12,0x1f,0x1f,\r\n0x18,0x23,0x09,0x7e,0x08,0x08,0x1a,0x7e,0x18,0x1f,0x1d,0x91,0x12,0x09,0x14,0x14,0x0d,0x1a,0x20,0x03,0x0d,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xc4,0x12,0x39,0x2f,0xce,0x33,0xed,0x32,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xc4,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,\r\n0x27,0x26,0x35,0x33,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x04,0x81,0x85,0x88,0xdf,0xdb,0x8d,0x87,0xa8,0x57,0x61,0x8f,0x90,0x5e,0x56,0xe4,0xc6,0xb7,0x67,0x6b,0xa8,0xf5,0xb4,0xe2,0xa8,0x01,0xb4,0xce,0x7e,0x80,0x8a,0x85,0xc0,0x76,0x63,0x6c,\r\n0x6a,0x61,0x7d,0x01,0x12,0x7a,0x5e,0x61,0xb5,0x01,0xd4,0xfe,0x34,0xe8,0x6e,0x02,0x46,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xc5,0x05,0x9a,0x00,0x12,0x00,0x40,0x40,0x24,0x66,0x11,0x76,0x11,0x02,0x59,0x04,0x01,0x4a,0x04,0x01,0x39,0x04,0x01,0x00,0x7e,0x02,0x02,0x0a,0x14,0x0d,0x08,0x7e,0x0a,0x08,0x06,0x91,0x0d,0x0f,0x0f,\r\n0x0a,0x0c,0x03,0x01,0x0a,0x12,0x00,0x3f,0xc4,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x32,0x12,0x15,0x04,0xc5,0xa8,0x52,0x55,0x96,0xb2,0xbd,0xa8,0xa8,0xbc,0xc3,0xd7,\r\n0xfe,0x01,0xae,0x97,0x59,0x5c,0x70,0xfd,0x76,0x05,0x9a,0xfd,0x85,0x73,0xfe,0xf8,0xd8,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x05,0x00,0x05,0xb2,0x00,0x1f,0x00,0x83,0x40,0x57,0x66,0x18,0x01,0x06,0x17,0x16,0x17,0x56,0x17,0x66,0x17,0x04,0x56,0x13,0x66,0x13,0x02,0x66,0x12,0x01,0x08,0x0b,0x18,0x0b,0x02,0x29,0x05,0x01,0x77,0x0a,\r\n0x01,0x99,0x07,0x01,0x79,0x06,0x01,0x0f,0x0f,0x1f,0x7e,0x02,0x10,0x1d,0x01,0x1d,0x1d,0x21,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x1e,0x1e,0x19,0x0f,0x11,0x91,0x96,0x0e,0x01,0x87,0x0e,0x01,0x76,0x0e,0x01,0x0e,0x0c,0x04,0x1d,0x19,0x91,0x69,0x02,0x79,0x02,0x02,0x02,0x04,0x13,0x00,0x12,0x00,0x3f,0x3f,0x33,0x5d,0xed,0x32,\r\n0x3f,0x33,0x5d,0x5d,0x5d,0xed,0x32,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,\r\n0x37,0x11,0x33,0x05,0x00,0xa8,0xa7,0xb9,0xfe,0xc6,0xb4,0xac,0xbf,0xc5,0x01,0x46,0xe0,0x9f,0xae,0xe4,0xf8,0x8d,0x82,0x7b,0x86,0xfe,0x66,0x5f,0x56,0x30,0xa8,0x40,0x58,0xcd,0xc3,0x01,0x42,0x01,0x4e,0xd2,0xd8,0x4c,0xba,0x6e,0xaf,0xa2,0xfe,0xfd,0xfe,0xf8,0x99,0xa6,0x28,0x23,0x34,0x01,0x56,0x00,0x00,0x02,0x00,0x5c,0xff,0xe8,\r\n0x05,0xb0,0x05,0x9a,0x00,0x15,0x00,0x1f,0x00,0x73,0x40,0x4c,0x39,0x1e,0x01,0x39,0x1d,0x01,0x36,0x1b,0x01,0x35,0x19,0x01,0x4b,0x0f,0x5b,0x0f,0x02,0x49,0x0e,0x59,0x0e,0x02,0x59,0x0a,0x01,0x4a,0x0a,0x01,0x5a,0x09,0x01,0x56,0x07,0x01,0x55,0x06,0x01,0x44,0x06,0x01,0x15,0x7e,0x01,0x03,0x14,0x7e,0x11,0x00,0x17,0x10,0x17,0x02,\r\n0x17,0x17,0x21,0x1a,0x7e,0x0f,0x0c,0x1f,0x0c,0x02,0x0c,0x14,0x11,0x91,0x17,0x01,0x03,0x03,0x12,0x03,0x1c,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0x39,0x2f,0xce,0xc4,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0xfd,0xc4,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,\r\n0x23,0x11,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x21,0x11,0x33,0x11,0x21,0x01,0x11,0x21,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x05,0xb0,0x9c,0xc8,0x83,0x87,0xe8,0xef,0x8a,0x85,0x78,0x7e,0xef,0x01,0x63,0xa8,0x01,0x64,0xfd,0xf4,0xfe,0xaf,0xfe,0xb1,0x01,0x4a,0xa7,0x5b,0x54,0x02,0x9d,0xcb,0xfe,0x8c,0xea,\r\n0x8f,0x93,0x93,0x8f,0xf0,0xf0,0x87,0x8f,0x01,0x9a,0xfe,0x66,0xfd,0xf8,0x01,0x70,0xfe,0x8c,0xfe,0x7e,0x72,0x69,0x00,0x02,0x00,0xbc,0x00,0x00,0x04,0x38,0x05,0x9a,0x00,0x12,0x00,0x19,0x00,0x5f,0x40,0x3c,0x67,0x19,0x77,0x19,0x02,0x68,0x14,0x78,0x14,0x02,0x85,0x12,0x95,0x12,0x02,0x86,0x11,0x96,0x11,0x02,0x89,0x02,0x99,0x02,\r\n0x02,0x9a,0x01,0x01,0x89,0x01,0x01,0x00,0x7d,0x13,0x13,0x0d,0x1b,0x07,0x7e,0x09,0x17,0x0b,0x06,0x7e,0x0d,0x08,0x0a,0x91,0x07,0x18,0x91,0x05,0x05,0x0d,0x16,0x91,0x0e,0x03,0x0d,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0xed,0xde,0xfd,0xcd,0x01,0x2f,0xfd,0xc4,0xc4,0xdc,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x21,0x15,0x21,0x11,0x23,0x35,0x23,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x07,0x34,0x21,0x23,0x11,0x33,0x20,0x04,0x38,0x81,0x78,0xcb,0xfe,0xf0,0x01,0x6b,0x9c,0xcf,0xa8,0x01,0xaa,0xd5,0x79,0x84,0xb1,0xfe,0xc9,0xec,0xec,0x01,0x37,0x04,0x2f,0xb2,0x60,0x59,0x99,0xfe,0x9d,0xcb,\r\n0xfe,0x6d,0x05,0x9a,0x56,0x5e,0xb7,0xd3,0xfe,0x5a,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xb5,0x05,0xb2,0x00,0x31,0x00,0xa6,0x40,0x68,0x66,0x31,0x76,0x31,0x02,0x76,0x29,0x01,0x7a,0x27,0x01,0x95,0x20,0x01,0x66,0x20,0x86,0x20,0x02,0x9a,0x1c,0x01,0x8b,0x1c,0x01,0x6c,0x1c,0x01,0x89,0x1a,0x01,0x7c,0x12,0x01,0x56,0x0f,0x01,0x89,\r\n0x07,0x01,0x7a,0x07,0x01,0x69,0x07,0x01,0x66,0x02,0x01,0x66,0x01,0x01,0x23,0x21,0x7d,0x24,0x26,0x26,0x13,0x2e,0x2a,0x00,0x7d,0x17,0x1b,0x20,0x13,0x50,0x13,0x02,0x13,0x13,0x33,0x2a,0x7d,0x1b,0x0b,0x0d,0x7d,0x0a,0x08,0x08,0x1b,0x23,0x23,0x2e,0x28,0x2e,0x1d,0x11,0x0a,0x0a,0x17,0x11,0x17,0x04,0x28,0x91,0x1d,0x04,0x11,0x91,\r\n0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0xed,0x11,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,\r\n0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x11,0x34,0x27,0x26,0x27,0x26,0x27,0x26,0x35,0x10,0x21,0x32,0x17,0x16,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x21,0x20,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x04,0xb5,0xab,0x8c,0xec,0xe8,0x93,0xb3,0x0f,0xb4,0x12,0x81,0x62,0x9c,0x01,0x71,\r\n0x7a,0x49,0xa5,0xf5,0x70,0xaf,0x01,0xfa,0xcb,0x84,0xa1,0x0a,0xae,0x08,0xfe,0xbe,0xfe,0xb8,0x80,0x48,0xaa,0xee,0x73,0xa9,0x01,0x85,0xdd,0x6a,0x56,0x57,0x6b,0xd9,0x43,0x40,0x43,0x42,0x8e,0x42,0x32,0x01,0x06,0x85,0x44,0x28,0x1f,0x2e,0x43,0x68,0xcc,0x01,0x78,0x4e,0x5f,0xbd,0x25,0x4b,0x45,0x2b,0xd2,0xe0,0x85,0x42,0x26,0x1e,\r\n0x2b,0x48,0x6b,0x00,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xc5,0x05,0x9a,0x00,0x14,0x00,0x46,0x40,0x2a,0x39,0x10,0x01,0x66,0x02,0x76,0x02,0x02,0x45,0x02,0x55,0x02,0x02,0x47,0x01,0x57,0x01,0x02,0x07,0x07,0x14,0x7e,0x12,0x12,0x09,0x16,0x0c,0x05,0x7e,0x09,0x0e,0x91,0x03,0x03,0x06,0x13,0x0b,0x03,0x06,0x91,0x09,0x12,0x00,0x3f,\r\n0xed,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x02,0x23,0x22,0x27,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x04,0xc5,0xfe,0xd7,0xc3,0xbc,0x02,0xf2,0xfc,0x66,0xa8,0xbd,0xb2,0x96,0x55,0x52,0xa8,0x03,0xe8,\r\n0xd8,0xfe,0xf8,0x73,0xfe,0x1d,0x98,0x05,0x9a,0xfd,0x76,0x70,0x5c,0x59,0x97,0x01,0xae,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x05,0x1d,0x05,0x9a,0x00,0x0a,0x00,0x0d,0x00,0x6b,0x40,0x41,0x0d,0x0b,0x04,0x0c,0x00,0x0a,0x09,0x03,0x0c,0x00,0x05,0x0b,0x04,0x01,0x06,0x02,0x09,0x03,0x01,0x06,0x0b,0x03,0x09,0x03,0x7e,0x04,0x0b,0x14,\r\n0x04,0x04,0x0b,0x09,0x09,0x0c,0x01,0x06,0x01,0x7e,0x00,0x0c,0x14,0x00,0x0c,0x00,0x00,0x04,0x0f,0x07,0x06,0x06,0x0b,0x04,0x01,0x04,0x0c,0x06,0x0b,0x91,0x09,0x03,0x01,0x00,0x03,0x04,0x12,0x00,0x3f,0xc4,0xdc,0xc4,0x3f,0xfd,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0xcd,0x11,0x12,0x39,0x2f,0x87,0x2b,0x87,0x7d,0xc4,0x01,0x33,0x18,\r\n0x2f,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x0f,0x0f,0x0f,0x0f,0x31,0x30,0x25,0x23,0x01,0x01,0x23,0x01,0x01,0x21,0x35,0x21,0x01,0x13,0x21,0x13,0x05,0x1d,0xce,0xfe,0xa3,0xfe,0x0e,0xce,0x02,0x59,0xfe,0xad,0xfe,0xfa,0x04,0xeb,0xfe,0x3c,0x86,0xfe,0x27,0xec,0xcc,0x01,0xdb,0xfd,0x59,0x03,0x33,0x01,0xcf,0x98,0xfd,0x99,0x01,0xcf,0xfe,\r\n0xbd,0x00,0x00,0x01,0x00,0x32,0xff,0xe8,0x05,0xd5,0x05,0x9a,0x00,0x11,0x00,0x55,0x40,0x35,0x29,0x0e,0x39,0x0e,0x49,0x0e,0x03,0x96,0x0c,0x01,0x44,0x0c,0x01,0x35,0x0c,0x01,0x26,0x0c,0x01,0x59,0x03,0x01,0x11,0x7e,0x10,0x0f,0x01,0x0f,0x0f,0x04,0x13,0x09,0x7e,0x07,0x0b,0x7e,0x0f,0x04,0x01,0x04,0x11,0x11,0x0a,0x0d,0x07,0x05,\r\n0x91,0x0a,0x03,0x0d,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0xfd,0xce,0x11,0x12,0x39,0x2f,0x01,0x2f,0x5d,0xed,0xde,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x23,0x15,0x23,0x11,0x21,0x11,0x10,0x21,0x20,0x11,0x35,0x33,0x05,0xd5,0xfd,0xdf,0xfd,0xf6,0xdc,0x9c,0x02,\r\n0x20,0x01,0x74,0x01,0x67,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0xcb,0x01,0x63,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x7f,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xf0,0x05,0x9a,0x00,0x11,0x00,0x55,0x40,0x34,0x97,0x0f,0xa7,0x0f,0x02,0x86,0x0f,0x01,0x7a,0x02,0x01,0x00,0x10,0x7e,0x01,0x01,0x09,0x13,0x0c,0x07,0x7e,0x09,0x75,0x0c,\r\n0x01,0x56,0x0c,0x66,0x0c,0x02,0x44,0x0c,0x01,0x23,0x0c,0x33,0x0c,0x02,0x0c,0x0e,0x91,0x03,0x10,0x91,0x01,0x03,0x03,0x08,0x0b,0x03,0x08,0x12,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xde,0xed,0x10,0xed,0x32,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x21,0x10,0x23,0x22,\r\n0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x13,0x33,0x04,0xf0,0xfe,0x95,0xf0,0x94,0x4c,0x44,0xa8,0xa8,0x6f,0xb5,0x01,0x49,0x41,0xd1,0x02,0x44,0x01,0x4a,0x78,0x6b,0xb1,0xfe,0x06,0x05,0x9a,0xfe,0x07,0x77,0xfe,0xc4,0x00,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0x9a,0x00,0x15,0x00,0x64,0x40,0x42,0x27,0x15,\r\n0x01,0x86,0x14,0x01,0x37,0x14,0x01,0x25,0x14,0x01,0x6b,0x0d,0x7b,0x0d,0x02,0x59,0x0d,0x01,0x99,0x09,0x01,0x1b,0x09,0x5b,0x09,0x02,0x08,0x09,0x01,0x65,0x02,0x75,0x02,0x02,0x00,0x7d,0x00,0x0b,0x10,0x0b,0x02,0x0b,0x0b,0x17,0x12,0x7e,0x0f,0x06,0x06,0x0f,0x0f,0x91,0x13,0x10,0x03,0x06,0x08,0x91,0x9a,0x05,0x01,0x05,0x03,0x13,\r\n0x00,0x3f,0x33,0x5d,0xed,0x32,0x3f,0xdc,0xed,0x01,0x2f,0x32,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x00,0x21,0x22,0x27,0x35,0x16,0x33,0x20,0x00,0x11,0x34,0x00,0x23,0x21,0x11,0x33,0x15,0x33,0x20,0x00,0x04,0x8c,0xfe,0x75,0xfe,0xaf,0xcc,0x86,0x9a,0xba,\r\n0x01,0x0a,0x01,0x20,0xfe,0xf1,0xf9,0xfe,0xf4,0x9c,0x86,0x01,0x3c,0x01,0x66,0x02,0xa7,0xfe,0xba,0xfe,0x87,0x3b,0xb3,0x56,0x01,0x1d,0x01,0x00,0xec,0x01,0x00,0x01,0x11,0x79,0xfe,0xb4,0x00,0x01,0x00,0x33,0x00,0x00,0x04,0x2f,0x05,0x9a,0x00,0x14,0x00,0x3f,0x40,0x24,0x36,0x0e,0x46,0x0e,0x02,0x5b,0x05,0x01,0x12,0x00,0x7e,0x02,\r\n0x02,0x16,0x0a,0x0c,0x7e,0x09,0x07,0x40,0x09,0x0d,0x48,0x07,0x02,0x04,0x91,0x12,0x10,0x10,0x01,0x0a,0x13,0x03,0x01,0x12,0x00,0x3f,0x3f,0xce,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2b,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x5d,0x5d,0x21,0x23,0x11,0x06,0x23,0x22,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x17,\r\n0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x2f,0xa8,0xbc,0xc3,0xd7,0xfe,0x33,0xb0,0x3b,0x52,0x55,0x96,0xb2,0xbd,0xa8,0x02,0x7b,0x73,0x01,0x08,0xd8,0x72,0x88,0x92,0x64,0x97,0x59,0x5c,0x70,0x02,0x8a,0x00,0x01,0x00,0x96,0x00,0x00,0x04,0xc4,0x05,0x9a,0x00,0x10,0x00,0x41,0x40,0x26,0x96,0x0b,0x01,0x87,0x0b,0x01,0x49,0x06,0x01,0x3a,\r\n0x06,0x01,0x3a,0x01,0x4a,0x01,0x02,0x09,0x7e,0x07,0x04,0x0f,0x7e,0x00,0x02,0x7e,0x04,0x05,0x02,0x91,0x0c,0x0c,0x04,0x0f,0x09,0x03,0x04,0x12,0x00,0x3f,0x3f,0xc4,0x12,0x39,0x2f,0xed,0x32,0x01,0x2f,0xfd,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x05,0x11,0x23,0x11,0x24,0x11,0x11,0x33,0x11,\r\n0x10,0x21,0x20,0x11,0x11,0x33,0x04,0xc4,0xfe,0x3d,0xa8,0xfe,0x3d,0xa8,0x01,0x6f,0x01,0x6f,0xa8,0x04,0x48,0xfd,0xd4,0x2c,0xfe,0x10,0x01,0xf0,0x2e,0x02,0x13,0x01,0x69,0xfe,0xa2,0xfe,0x47,0x01,0xaa,0x01,0x6d,0x00,0x00,0x03,0x00,0x52,0xff,0xe8,0x06,0x3a,0x05,0x9a,0x00,0x17,0x00,0x22,0x00,0x2e,0x00,0x6b,0x40,0x40,0x89,0x2d,\r\n0x01,0x85,0x27,0x01,0x77,0x27,0x01,0x95,0x17,0x01,0x9a,0x11,0x01,0x94,0x0a,0x01,0x94,0x01,0x01,0x1e,0x07,0x03,0x7e,0x24,0x14,0x06,0x06,0x00,0x7d,0x18,0x14,0x18,0x14,0x18,0x30,0x29,0x7e,0x0f,0x0f,0x1f,0x0f,0x02,0x0f,0x07,0x24,0x91,0x04,0x1e,0x91,0x02,0x14,0x04,0x04,0x2b,0x1d,0x91,0x15,0x03,0x2b,0x91,0x0b,0x13,0x00,0x3f,\r\n0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xde,0xed,0x10,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0x10,0xc4,0xfd,0xc4,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x21,0x15,0x21,0x15,0x21,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x33,0x11,0x21,0x20,0x03,\r\n0x34,0x27,0x26,0x23,0x23,0x11,0x33,0x32,0x37,0x36,0x01,0x35,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x06,0x3a,0xfe,0x3c,0xfe,0xf0,0x02,0x23,0xfd,0xdd,0xcd,0xb6,0xb5,0x6b,0x71,0x81,0x74,0xb1,0xc6,0x01,0xaa,0x01,0xd2,0xb1,0x5b,0x45,0x97,0xec,0xec,0xa4,0x45,0x4e,0xfd,0x35,0xc6,0x65,0x45,0x4c,0xe1,0x69,0x3a,0x38,\r\n0x04,0x61,0xfe,0xc7,0x82,0x98,0xa8,0xb5,0xc9,0x57,0x5c,0xa8,0xab,0x60,0x58,0x02,0xf4,0xfe,0xc7,0x60,0x25,0x1c,0xfe,0xbe,0x21,0x24,0xfd,0x61,0xa8,0x32,0x39,0x60,0xc4,0x41,0x3e,0x00,0x00,0x01,0x00,0x60,0xff,0xea,0x03,0x98,0x04,0x00,0x00,0x2d,0x00,0x58,0x40,0x36,0x99,0x16,0x01,0x88,0x16,0x01,0x95,0x29,0x01,0x76,0x29,0x86,\r\n0x29,0x02,0x27,0x29,0x37,0x29,0x02,0x29,0x00,0x24,0x84,0x23,0x00,0x84,0x19,0x6a,0x1e,0x01,0x1e,0x19,0x10,0x19,0x90,0x19,0x02,0x23,0x19,0x23,0x19,0x2f,0x0f,0x84,0x0a,0x0d,0x0c,0x0c,0x24,0x0f,0x14,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x5d,0x10,0xed,0x10,\r\n0xed,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x1e,0x03,0x03,0x98,0x44,0x72,0x96,0x51,0x51,0x95,0x72,0x43,0x28,0x9c,0x1e,0x27,0x43,0x59,0x32,0x32,0x5a,\r\n0x43,0x28,0x16,0x28,0x39,0x23,0x36,0x41,0x26,0x0f,0x03,0xa4,0x01,0x0e,0x20,0x35,0x28,0x2c,0x47,0x31,0x1b,0x01,0x4a,0x57,0x84,0x58,0x2d,0x2d,0x58,0x84,0x57,0x5f,0x50,0x37,0x38,0x44,0x36,0x4f,0x34,0x19,0x19,0x34,0x4f,0x36,0x2f,0x49,0x42,0x3f,0x25,0x38,0x57,0x59,0x69,0x4b,0x37,0x54,0x48,0x45,0x28,0x2c,0x52,0x57,0x63,0x00,\r\n0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x05,0xec,0x00,0x16,0x00,0x26,0x00,0x84,0x40,0x59,0x96,0x21,0x01,0x96,0x1d,0x01,0x53,0x15,0x01,0x44,0x15,0x01,0x53,0x14,0x01,0x42,0x14,0x01,0x09,0x0a,0x01,0x5a,0x06,0x01,0x4b,0x06,0x01,0x59,0x05,0x01,0x56,0x03,0x01,0x56,0x02,0x01,0x45,0x02,0x01,0x17,0x83,0x40,0x00,0x50,0x00,0x02,\r\n0x00,0x12,0x84,0x0c,0x10,0x84,0x0e,0x0c,0x1f,0x83,0x0f,0x08,0x3f,0x08,0x02,0x08,0x4f,0x0c,0x01,0x0c,0x0e,0x95,0x11,0x11,0x0f,0x1b,0x95,0x0c,0x00,0x13,0x10,0x13,0x20,0x13,0x03,0x13,0x10,0x0f,0x00,0x23,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x5d,0x33,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x5d,0xdd,0x5d,0xed,0x10,0xde,0xed,\r\n0x10,0xfd,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x10,0x37,0x36,0x37,0x35,0x21,0x11,0x33,0x15,0x21,0x11,0x16,0x17,0x16,0x03,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x04,0x50,0x85,0x8b,0xee,\r\n0xe7,0x87,0x84,0x8d,0x71,0xb2,0xfe,0xb8,0xa4,0x01,0x48,0xb1,0x6b,0x80,0xa8,0x4a,0x55,0xab,0xaa,0x5b,0x51,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0x01,0x02,0x91,0x74,0x17,0xc9,0x01,0x11,0x79,0xfe,0xa1,0x14,0x75,0x8c,0xfe,0xff,0xb3,0x67,0x76,0x78,0x6c,0xb0,0xab,0x6a,0x73,0x74,0x66,0x00,0x02,\r\n0x00,0x60,0xfe,0x1e,0x04,0x50,0x04,0x18,0x00,0x32,0x00,0x42,0x00,0x8d,0x40,0x5b,0x49,0x42,0x59,0x42,0x02,0x59,0x3e,0x01,0x4a,0x3e,0x01,0x55,0x3b,0x01,0x46,0x3b,0x01,0x6a,0x23,0x01,0x76,0x1a,0x01,0x65,0x1a,0x01,0x07,0x1a,0x17,0x1a,0x02,0x48,0x0e,0x58,0x0e,0x02,0x19,0x0e,0x29,0x0e,0x39,0x0e,0x03,0x19,0x16,0x83,0x2e,0x2b,\r\n0x2e,0x1c,0x83,0x40,0x30,0x40,0x01,0x2e,0x40,0x2e,0x40,0x26,0x44,0x08,0x05,0x83,0x09,0x0c,0x0c,0x38,0x83,0x0f,0x26,0x1f,0x26,0x02,0x26,0x08,0x09,0x33,0x95,0x19,0x2b,0x2b,0x00,0x3d,0x95,0x21,0x1c,0x00,0x95,0x11,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xed,0x32,\r\n0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,\r\n0x33,0x36,0x36,0x35,0x34,0x2e,0x02,0x13,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xc6,0x2a,0x46,0x32,0x1c,0x06,0x0e,0xa6,0x10,0x06,0x35,0x5f,0x83,0x4f,0x4f,0x82,0x5e,0x34,0x17,0x0e,0xa5,0xa7,0x46,0x83,0xbd,0x78,0x74,0xb9,0x81,0x44,0x46,0x85,0xc2,0x7c,0x0e,0x10,0x1d,0x33,0x47,0x6e,0x57,0x81,\r\n0x54,0x2a,0x2b,0x56,0x80,0x55,0x9f,0xab,0xab,0x03,0x8e,0x1f,0x35,0x45,0x27,0x1b,0x2f,0x39,0x1d,0x46,0x3a,0x20,0x4a,0x7a,0x57,0x2f,0x2f,0x58,0x7d,0x4e,0x43,0x60,0x22,0x28,0xfa,0xc3,0x76,0xbd,0x84,0x47,0x44,0x80,0xb7,0x73,0x7c,0xc1,0x84,0x45,0x27,0x4e,0x35,0x33,0x4f,0x35,0x1b,0xfd,0xfa,0x35,0x62,0x8a,0x55,0x53,0x86,0x5e,\r\n0x33,0xb0,0xbe,0xc0,0xb2,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x06,0xa0,0x04,0x18,0x00,0x3e,0x00,0x52,0x01,0x00,0x40,0xa8,0x97,0x11,0x01,0x95,0x10,0x01,0x57,0x50,0x01,0x55,0x4b,0x01,0x58,0x42,0x01,0x65,0x3d,0x01,0x65,0x3c,0x01,0x55,0x37,0x01,0x56,0x34,0x01,0x47,0x34,0x01,0x36,0x34,0x01,0x46,0x33,0x56,0x33,0x02,0x37,0x33,\r\n0x01,0x39,0x2d,0x49,0x2d,0x59,0x2d,0x03,0x29,0x11,0x01,0x28,0x10,0x01,0x69,0x07,0x01,0x69,0x03,0x01,0x68,0x02,0x01,0x49,0x83,0x0a,0x38,0x9a,0x0c,0x01,0x89,0x0c,0x01,0x68,0x0c,0x78,0x0c,0x02,0x0c,0x0a,0x9d,0x2c,0x01,0x8f,0x2c,0x01,0x2c,0x31,0x92,0x1a,0x01,0x70,0x1a,0x01,0x1a,0x13,0x9d,0x20,0x01,0x7a,0x20,0x8a,0x20,0x02,\r\n0x20,0x1f,0x1f,0x00,0x83,0x3f,0x0a,0x3f,0x0a,0x3f,0x54,0x13,0x83,0x31,0x29,0x29,0x31,0x4e,0x95,0x05,0x05,0x2c,0x44,0x95,0x3a,0x0c,0x0e,0x95,0x56,0x38,0x01,0x25,0x38,0x01,0x14,0x38,0x01,0x05,0x38,0x01,0x38,0x36,0x36,0x3a,0x10,0x26,0x1a,0x01,0x1a,0x20,0x2c,0x95,0x25,0x17,0x29,0x01,0x29,0x95,0x28,0x28,0x25,0x1f,0x20,0x1c,\r\n0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x5d,0x10,0xed,0x11,0x39,0x5d,0x3f,0x33,0x2f,0x33,0x5d,0x5d,0x5d,0x5d,0xed,0x32,0x10,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0x33,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x11,0x33,0x5d,0x5d,0x5d,0x33,0x10,0xed,0x31,\r\n0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x17,0x1e,0x03,0x17,0x07,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,\r\n0x32,0x17,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x06,0xa0,0x3c,0x74,0xa7,0x6b,0x6b,0xad,0x7b,0x43,0x46,0x6a,0x74,0x4d,0x7a,0x54,0x2d,0x2c,0x52,0x73,0x90,0xa7,0x5c,0x5d,0x96,0x7b,0x66,0x2d,0x68,0x64,0xc7,0xd4,0xe5,0x82,0x6c,0xc8,0x4b,0x4e,0xca,0x6b,0x54,\r\n0x83,0x5c,0x30,0x45,0x81,0xbb,0x75,0xb7,0x83,0x7a,0xb4,0x6b,0xa7,0x74,0x3c,0xa8,0x21,0x45,0x6a,0x4a,0x4a,0x71,0x4c,0x27,0x27,0x4c,0x71,0x4a,0x4a,0x6a,0x45,0x21,0x02,0x2e,0x6a,0xb3,0x82,0x49,0x4a,0x83,0xb3,0x6a,0x9e,0x74,0x4c,0x41,0x70,0x94,0x53,0x61,0x98,0x78,0x5d,0x4c,0x3e,0x1d,0x1d,0x38,0x39,0x39,0x1f,0x7d,0x3f,0x5e,\r\n0x3f,0x20,0x3f,0x3f,0xa8,0x31,0x31,0x2e,0x77,0x91,0xaa,0x62,0x7b,0xcd,0x95,0x53,0x64,0x64,0x4a,0x83,0xb4,0x69,0x46,0x80,0x61,0x39,0x39,0x60,0x7f,0x46,0x47,0x7f,0x61,0x39,0x38,0x60,0x7f,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x2d,0x00,0x6b,0x40,0x45,0x07,0x2b,0x17,0x2b,0x02,0x96,0x20,0x01,0x76,0x1f,\r\n0x86,0x1f,0x96,0x1f,0x03,0x9c,0x1c,0x01,0x79,0x1c,0x89,0x1c,0x02,0x6a,0x16,0x01,0x59,0x16,0x01,0x75,0x12,0x01,0x57,0x12,0x67,0x12,0x02,0x77,0x11,0x01,0x2d,0x84,0x19,0x19,0x0a,0x2f,0x22,0x84,0x23,0x23,0x0d,0x0f,0x84,0x0c,0x0a,0x0d,0x0c,0x22,0x0c,0x22,0x14,0x1d,0x95,0x28,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,\r\n0x11,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,\r\n0x02,0x33,0x32,0x1e,0x02,0x15,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x74,0x55,0x30,0x80,0x71,0x32,0x53,0x3c,0x22,0xa6,0x3e,0x6b,0x8f,0x51,0x50,0x92,0x70,0x43,0x22,0x69,0xa6,0x74,0x3d,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4d,0x6d,0x45,\r\n0x02,0xc2,0x79,0x83,0x19,0x34,0x51,0x37,0x55,0x83,0x5a,0x2e,0x2b,0x57,0x85,0x59,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x43,0x00,0x9b,0x40,0x61,0x87,0x3d,0x01,0x76,0x3d,0x01,0x76,0x2d,0x86,0x2d,0x96,0x2d,0x03,0x79,0x29,0x89,0x29,0x99,0x29,0x03,0x5b,0x1c,0x01,0x6a,0x16,0x01,0x59,0x16,0x01,0x56,0x12,0x66,\r\n0x12,0x02,0x75,0x11,0x01,0x3f,0x3e,0x1f,0x3b,0x83,0x26,0x26,0x19,0x1f,0x1f,0x0f,0x00,0x83,0x19,0x19,0x0a,0x45,0x30,0x84,0x31,0x40,0x12,0x18,0x48,0x31,0x31,0x0d,0x0f,0x84,0x0c,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x0d,0x0c,0x3f,0x3e,0x1e,0x31,0x31,0x2b,0x20,0x95,0x1e,0x0c,0x1e,0x0c,0x1e,0x14,0x2b,0x95,0x36,0x10,0x14,0x95,0x05,\r\n0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x2b,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x11,0x33,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,\r\n0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,\r\n0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x1f,0x3c,0x58,0x39,0x32,0x56,0x40,0x25,0xa6,0x41,0x6f,0x92,0x51,0x55,0x93,0x6d,0x3f,0x98,0x8d,0x49,0x82,0x62,0x39,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,\r\n0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x34,0x57,0x3d,0x22,0x1b,0x35,0x50,0x35,0x5a,0x84,0x57,0x2b,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x00,0x03,0x00,0x3c,0xff,0xe8,0x05,0xcc,0x06,0x02,0x00,0x1a,0x00,0x2a,0x00,0x36,0x00,0x6e,0x40,0x44,0x48,0x36,0x58,0x36,0x02,0x46,0x33,0x56,0x33,0x02,0x47,0x2f,0x57,0x2f,\r\n0x02,0x65,0x19,0x01,0x66,0x02,0x01,0x00,0x83,0x10,0x2b,0x30,0x2b,0x02,0x2b,0x2b,0x08,0x38,0x0f,0x84,0x23,0x31,0x83,0x08,0x1b,0x1b,0x15,0x84,0x0f,0x08,0x01,0x08,0x09,0x0b,0x95,0x27,0x2d,0x95,0x17,0x15,0x17,0x27,0x17,0x27,0x17,0x35,0x1f,0x95,0x12,0x01,0x35,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,\r\n0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x10,0xed,0xdc,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x21,0x22,0x27,0x26,0x35,0x11,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x11,0x36,0x33,0x32,0x17,0x16,0x01,0x34,0x27,0x26,0x23,0x22,0x07,\r\n0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x01,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x05,0xcc,0x6c,0x76,0xfe,0xf8,0xe5,0x80,0x79,0x31,0x64,0x91,0x52,0x50,0x9f,0x94,0x01,0x3d,0x88,0xc6,0xea,0x7a,0x6e,0xfc,0x38,0x24,0x28,0x44,0x44,0x28,0x24,0x24,0x28,0x43,0x43,0x29,0x25,0x03,0x20,0xfe,0xca,0xa8,0x53,\r\n0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xf0,0x81,0x97,0x8f,0x88,0xe1,0x01,0xd3,0x2c,0x57,0x54,0x91,0x94,0xab,0xfe,0xc9,0xfe,0x9a,0x77,0x8d,0x80,0x01,0xf6,0x47,0x32,0x39,0x39,0x32,0x47,0x45,0x33,0x38,0x38,0x33,0xfd,0x6a,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0xc1,0x04,0x18,0x00,0x2a,\r\n0x00,0x3e,0x00,0xca,0x40,0x8b,0x39,0x3c,0x01,0x36,0x38,0x01,0x37,0x32,0x01,0x38,0x2e,0x01,0x47,0x28,0x57,0x28,0x02,0x57,0x23,0x01,0x45,0x23,0x01,0x57,0x22,0x01,0x5a,0x1e,0x01,0x49,0x1e,0x01,0x48,0x1d,0x58,0x1d,0x02,0x58,0x19,0x01,0x49,0x19,0x01,0x4a,0x18,0x5a,0x18,0x02,0x45,0x14,0x55,0x14,0x02,0x47,0x13,0x57,0x13,0x02,\r\n0x46,0x0f,0x01,0x39,0x0a,0x99,0x0a,0x02,0x2a,0x0a,0x01,0x99,0x09,0x01,0x68,0x05,0x98,0x05,0x02,0x94,0x03,0x01,0x76,0x02,0x86,0x02,0x02,0x03,0x04,0x04,0x07,0x19,0x23,0x01,0x23,0x37,0x0f,0x01,0x0f,0x11,0x83,0x2b,0x00,0x83,0x07,0x10,0x07,0x01,0x2b,0x07,0x2b,0x07,0x40,0x35,0x83,0x1b,0x30,0x95,0x20,0x20,0x0f,0x0c,0x95,0x24,\r\n0x23,0x34,0x23,0x02,0x15,0x23,0x01,0x23,0x26,0x10,0x04,0x03,0x03,0x3a,0x95,0x16,0x16,0x00,0x3f,0xed,0x33,0x2f,0x33,0x3f,0x33,0x5d,0x5d,0xed,0x32,0x33,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x32,0x5d,0x32,0x5d,0x11,0x39,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x05,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,\r\n0x33,0x32,0x3e,0x02,0x06,0xc1,0x7f,0x76,0x75,0x5d,0x65,0x2c,0x56,0x7e,0x52,0x3f,0x64,0x2d,0x4f,0x43,0x81,0xbc,0x79,0x74,0xb7,0x7f,0x43,0x44,0x83,0xc1,0x7d,0x5e,0x94,0x3c,0x43,0x98,0x5d,0x76,0xbb,0x81,0x44,0xfc,0xdd,0x23,0x4d,0x7c,0x59,0x58,0x7f,0x53,0x27,0x29,0x54,0x7e,0x56,0x59,0x7c,0x4d,0x23,0x01,0xe8,0xa5,0xfe,0x5d,\r\n0x73,0x47,0xcc,0x88,0x4d,0x93,0x72,0x46,0x22,0x23,0x80,0xc5,0x77,0xc6,0x8f,0x50,0x4e,0x8b,0xc1,0x72,0x7b,0xca,0x90,0x4f,0x2e,0x30,0x30,0x2e,0x57,0x97,0xcd,0x5f,0x54,0x92,0x6c,0x3e,0x40,0x6d,0x93,0x54,0x52,0x8f,0x6a,0x3d,0x3d,0x6a,0x91,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x04,0x81,0x04,0x18,0x00,0x19,0x00,0x89,0x40,0x5a,\r\n0x45,0x18,0x01,0x4a,0x14,0x01,0x96,0x0b,0x01,0x99,0x07,0x01,0x28,0x07,0x38,0x07,0x02,0x99,0x10,0x01,0x88,0x10,0x01,0x79,0x10,0x01,0x10,0x12,0x0f,0x96,0x02,0x01,0x87,0x02,0x01,0x76,0x02,0x01,0x02,0x03,0x00,0x67,0x0f,0x01,0x01,0x0f,0x01,0x68,0x03,0x01,0x0e,0x03,0x01,0x0f,0x03,0x0f,0x03,0x0d,0x00,0x83,0x20,0x05,0x30,0x05,\r\n0xa0,0x05,0x03,0x05,0x05,0x1b,0x0d,0x83,0x0f,0x12,0x1f,0x12,0xaf,0x12,0x03,0x12,0x09,0x95,0x16,0x10,0x03,0x02,0x02,0x0f,0x10,0x16,0x00,0x3f,0x33,0x33,0x2f,0x33,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x5d,0x5d,0x5d,\r\n0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x27,0x36,0x11,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x10,0x17,0x07,0x26,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x04,0x81,0xeb,0x75,0xb8,0x5e,0x65,0xa8,0xa8,0x63,0x5b,0xb8,0x75,0xeb,0x8b,0x90,0xf7,0xf7,0x8e,0x8a,0x01,0xe8,0xfe,0xb8,0xb8,0x73,0x8d,0x01,0x0e,0xab,0x72,\r\n0x7b,0x7b,0x71,0xac,0xfe,0xf2,0x8d,0x73,0xb8,0x01,0x48,0xfa,0x98,0x9e,0x9e,0x98,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x39,0x00,0x72,0x40,0x44,0x86,0x33,0x01,0x77,0x33,0x01,0x79,0x29,0x89,0x29,0x99,0x29,0x03,0x6b,0x16,0x01,0x59,0x16,0x01,0x74,0x12,0x01,0x67,0x12,0x01,0x56,0x12,0x01,0x34,0x35,0x31,0x1f,\r\n0x1f,0x0f,0x00,0x83,0x19,0x19,0x0a,0x3b,0x31,0x83,0x2b,0x26,0x0d,0x0f,0x84,0x0c,0x0a,0x35,0x34,0x20,0x95,0x0d,0x0c,0x1e,0x0c,0x1e,0x0c,0x14,0x2b,0x95,0x2c,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x39,0x39,0x01,0x2f,0x33,0xed,0x32,0x2f,0xce,0xed,0x11,0x12,0x39,0x2f,0xed,\r\n0x12,0x39,0x2f,0x12,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x35,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,\r\n0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x1f,0x3c,0x58,0x39,0x55,0x93,0x6d,0x3f,0x98,0x8d,0x49,0x82,0x62,0x39,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,\r\n0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x34,0x57,0x3d,0x22,0x8b,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x08,0x06,0x04,0x18,0x00,0x5f,0x01,0x72,0x40,0xf7,0x77,0x5e,0x01,0x86,0x5d,0x01,0x75,0x5d,0x01,0x89,0x58,0x01,0x77,0x53,0x01,0x89,0x50,0x01,\r\n0x78,0x50,0x01,0x99,0x4f,0x01,0x97,0x4b,0x01,0x86,0x4b,0x01,0x99,0x47,0x01,0x88,0x47,0x01,0x79,0x47,0x01,0x78,0x41,0x01,0x66,0x2d,0x01,0x5a,0x29,0x6a,0x29,0x02,0x66,0x1f,0x01,0x64,0x1e,0x01,0x56,0x1e,0x01,0x5a,0x1a,0x6a,0x1a,0x02,0x6a,0x19,0x01,0x97,0x11,0x01,0x56,0x0f,0x66,0x0f,0x02,0x69,0x0b,0x01,0x99,0x07,0x01,0x88,\r\n0x07,0x01,0x69,0x07,0x01,0x44,0x59,0x01,0x45,0x53,0x01,0x45,0x50,0x01,0x45,0x4c,0x01,0x47,0x4b,0x01,0x46,0x10,0x01,0x47,0x0f,0x01,0x4e,0x23,0x84,0x24,0x56,0x15,0x94,0x05,0x01,0x85,0x05,0x01,0x76,0x05,0x01,0x05,0x06,0x06,0x08,0x14,0x84,0x15,0x7f,0x3f,0x8f,0x3f,0x9f,0x3f,0x03,0x5c,0x3f,0x01,0x4b,0x3f,0x01,0x3a,0x3f,0x01,\r\n0x2d,0x3f,0x01,0x3f,0x44,0x9b,0x38,0x01,0x8a,0x38,0x01,0x7b,0x38,0x01,0x6c,0x38,0x01,0x5a,0x38,0x01,0x38,0x93,0x35,0x01,0x85,0x35,0x01,0x62,0x35,0x01,0x35,0x37,0x37,0x30,0x00,0x83,0x08,0x24,0x15,0x08,0x08,0x15,0x24,0x03,0x61,0x30,0x83,0x44,0x3d,0x3d,0x44,0x0d,0x95,0x5b,0x5b,0x51,0x2b,0x95,0x49,0x49,0x70,0x4e,0x01,0x44,\r\n0x4e,0x01,0x70,0x56,0x01,0x44,0x56,0x01,0x4e,0x56,0x23,0x51,0x14,0x14,0x23,0x23,0x05,0x1c,0x95,0x51,0x10,0x35,0x38,0x3f,0x95,0x3a,0x3d,0x95,0x3c,0x3c,0x3a,0x37,0x38,0x1c,0x06,0x05,0x16,0x00,0x3f,0x33,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x3f,0xed,0x11,0x39,0x2f,0x33,0x2f,0x11,0x12,0x39,0x39,0x5d,0x5d,0x5d,\r\n0x5d,0x33,0x2f,0xed,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x12,0x39,0x2f,0x39,0x5d,0x5d,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x5d,0x5d,0x5d,0x11,0x39,0x10,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x07,0x27,0x36,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,\r\n0x14,0x1e,0x02,0x17,0x04,0x17,0x07,0x24,0x21,0x22,0x07,0x35,0x36,0x33,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x08,0x06,0x1c,0x3a,0x59,0x3c,0x75,0xb8,0x1f,0x36,0x4a,0x2b,0x2b,0x42,0x30,0x20,0x14,0x08,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x29,\r\n0x3f,0x2e,0x1e,0x13,0x08,0xa4,0x08,0x14,0x21,0x30,0x41,0x2b,0x2b,0x4a,0x36,0x1f,0x56,0x9f,0xde,0x89,0x01,0x91,0xb6,0x68,0xfe,0x6f,0xfd,0xf9,0xd7,0x94,0x9b,0xd4,0x54,0x7e,0x53,0x2a,0x29,0x59,0x8d,0x63,0x2f,0x5a,0x4f,0x3f,0x15,0x2a,0x99,0x5d,0x2e,0x59,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x5a,0x2f,0x55,0x89,0x60,0x34,0x02,0x26,\r\n0x4e,0xa3,0x99,0x85,0x2f,0x73,0x8d,0x01,0x3e,0x5a,0x87,0x5a,0x2d,0x2b,0x46,0x59,0x5d,0x59,0x22,0x22,0x58,0x5d,0x5a,0x46,0x2b,0x2d,0x48,0x5b,0x5d,0x56,0x1f,0x1f,0x56,0x5d,0x5b,0x48,0x2d,0x2d,0x5a,0x87,0x5a,0x91,0xd1,0x98,0x6c,0x2b,0x80,0x7a,0x7d,0xfc,0x7e,0xa8,0x62,0x2d,0x8c,0xaa,0xbe,0x5f,0x5b,0xb2,0x8d,0x58,0x1b,0x33,\r\n0x4a,0x2f,0x5f,0x68,0x1b,0x33,0x4a,0x2f,0x2f,0x4a,0x33,0x1b,0x3e,0x7d,0xbb,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x25,0x00,0x33,0x00,0x72,0x40,0x4a,0x59,0x31,0x01,0x56,0x2e,0x01,0x59,0x29,0x01,0x99,0x1e,0x01,0x99,0x1d,0x01,0x76,0x18,0x01,0x67,0x17,0x01,0x6a,0x14,0x7a,0x14,0x02,0x69,0x0d,0x01,0x69,\r\n0x0c,0x01,0x26,0x25,0x83,0x30,0x11,0x40,0x11,0x02,0x11,0x11,0x0a,0x35,0x1a,0x84,0x1b,0x1b,0x2d,0x83,0x0f,0x0a,0x1f,0x0a,0x02,0x0a,0x2b,0x95,0x4f,0x1b,0x01,0x1b,0x11,0x0f,0x0f,0x2f,0x15,0x95,0x20,0x01,0x2f,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xce,0x5d,0xed,0x01,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,\r\n0x12,0x39,0x2f,0x5d,0xed,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x03,0x34,0x2e,0x02,0x23,0x20,0x11,0x10,0x21,0x32,0x3e,0x02,0x04,0x28,\r\n0x3f,0x7a,0xb2,0x73,0x75,0xb7,0x7d,0x41,0x3b,0x75,0xae,0x74,0xc5,0x89,0x8d,0x87,0x31,0x56,0x41,0x25,0xa6,0x41,0x6f,0x91,0x50,0x66,0xa5,0x74,0x3f,0xa8,0x26,0x4e,0x7a,0x54,0xfe,0xca,0x01,0x36,0x52,0x79,0x50,0x27,0x01,0xe0,0x70,0xb9,0x85,0x4a,0x4c,0x8a,0xbf,0x73,0x71,0xb6,0x80,0x45,0x77,0xec,0x8a,0x9d,0x1e,0x3b,0x58,0x39,\r\n0x55,0x89,0x61,0x35,0x3d,0x74,0xa6,0x69,0xfd,0xa4,0x50,0x86,0x60,0x36,0xfe,0x98,0xfe,0x88,0x3a,0x65,0x87,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x1f,0x00,0x2b,0x00,0x7f,0x40,0x2c,0x59,0x2b,0x01,0x56,0x29,0x01,0x47,0x29,0x01,0x56,0x28,0x01,0x55,0x24,0x01,0x5a,0x21,0x01,0x66,0x1e,0x76,0x1e,0x02,0x2b,\r\n0x0a,0x3b,0x0a,0x4b,0x0a,0x03,0x0c,0x0a,0x1c,0x0a,0x02,0x69,0x05,0x01,0x10,0x11,0x11,0x00,0x83,0x20,0xb8,0xff,0xc0,0x40,0x24,0x0a,0x0d,0x48,0x20,0x20,0x2d,0x26,0x83,0x1a,0x84,0x0f,0x08,0x1f,0x08,0x02,0x08,0x22,0x95,0x1a,0x1c,0x1c,0x2a,0x11,0x13,0x95,0x10,0x0e,0x0e,0x16,0x95,0x0b,0x01,0x2a,0x95,0x04,0x16,0x00,0x3f,0xed,\r\n0x3f,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x39,0x2f,0x33,0xed,0x01,0x2f,0x5d,0xed,0xed,0x12,0x39,0x2f,0x2b,0xed,0x32,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x10,0x21,0x32,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x23,0x22,0x06,0x15,0x11,\r\n0x36,0x33,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x04,0x28,0x7b,0x84,0xeb,0xe5,0x80,0x79,0x01,0x5a,0x40,0xeb,0x35,0x52,0x72,0x4a,0x83,0x88,0x44,0xf5,0x2d,0x64,0x4b,0x88,0xc6,0xea,0x7a,0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xe6,0x8c,0x96,0x8f,0x88,0xe1,\r\n0x02,0xd0,0x01,0x52,0x46,0x46,0x71,0x5f,0x46,0x55,0x64,0xfe,0xa6,0x77,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x05,0xae,0x04,0x18,0x00,0x3e,0x00,0xb8,0x40,0x11,0x86,0x3c,0x96,0x3c,0x02,0x77,0x38,0x01,0x66,0x38,0x01,0x47,0x38,0x57,0x38,0x02,0x32,0xb8,0xff,0xf8,0x40,0x65,\r\n0x0d,0x10,0x48,0x96,0x2e,0x01,0x87,0x2e,0x01,0x99,0x27,0x01,0x75,0x24,0x01,0x66,0x24,0x01,0x85,0x23,0x01,0x69,0x20,0x79,0x20,0x02,0x6a,0x0b,0x7a,0x0b,0x02,0x84,0x08,0x01,0x66,0x07,0x76,0x07,0x02,0x99,0x04,0x01,0x88,0x04,0x01,0x26,0x25,0x25,0x16,0x2b,0x83,0x22,0x16,0x35,0x16,0x05,0x06,0x06,0x15,0x00,0x83,0x09,0x15,0x84,\r\n0x16,0x0e,0x95,0x3a,0x3a,0x71,0x35,0x01,0x62,0x35,0x01,0x40,0x35,0x50,0x35,0x02,0x35,0x30,0x16,0x16,0x26,0x1d,0x95,0x30,0x10,0x94,0x06,0x01,0x06,0x05,0x05,0x94,0x25,0x01,0x25,0x26,0x16,0x00,0x3f,0x33,0x5d,0x33,0x2f,0x33,0x5d,0x3f,0xed,0x11,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0x32,0x2f,0xed,0x01,0x2f,0xfd,0xde,0xed,0x12,\r\n0x39,0x2f,0x33,0x11,0x39,0x10,0xde,0xed,0x12,0x39,0x2f,0x33,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x2e,0x03,\r\n0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x05,0xae,0x1f,0x3e,0x5c,0x3c,0x75,0x5d,0x65,0x22,0x3a,0x4d,0x2b,0x2d,0x43,0x30,0x20,0x12,0x07,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x65,0x5d,0x75,0x3c,0x5c,0x3e,0x1f,0x37,0x64,0x8c,0x55,0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,\r\n0x59,0x2e,0x55,0x8c,0x64,0x37,0x02,0x26,0x4e,0xa3,0x99,0x85,0x2f,0x73,0x47,0xe4,0xa0,0x5a,0x87,0x5a,0x2d,0x2a,0x45,0x59,0x5d,0x59,0x24,0x26,0x5b,0x5d,0x57,0x44,0x29,0x2d,0x5a,0x87,0x5a,0xa0,0xe4,0x47,0x73,0x2f,0x85,0x99,0xa3,0x4e,0x7c,0xbb,0x7d,0x3e,0x1e,0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x00,0x00,0x01,\r\n0x00,0x60,0xff,0xe8,0x03,0xf1,0x06,0x02,0x00,0x3f,0x00,0x99,0x40,0x5b,0x86,0x38,0x01,0x96,0x31,0x01,0x79,0x28,0x01,0x6a,0x16,0x01,0x59,0x16,0x01,0x56,0x12,0x66,0x12,0x02,0x7a,0x08,0x8a,0x08,0x02,0x7a,0x07,0x8a,0x07,0x02,0x46,0x3e,0x01,0x47,0x33,0x01,0x3a,0x3b,0x1f,0x31,0x2d,0x35,0x84,0x29,0x2d,0x26,0x26,0x19,0x2e,0x2d,\r\n0x2d,0x1f,0x1f,0x0f,0x00,0x83,0x19,0x19,0x41,0x0d,0x0f,0x84,0x0c,0x0a,0x3b,0x3a,0x1e,0x18,0x31,0x01,0x09,0x31,0x01,0x29,0x31,0x2e,0x20,0x95,0x0d,0x0c,0x1e,0x0c,0x1e,0x0c,0x2d,0x2e,0x01,0x14,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0x33,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x11,0x39,0x39,0x5d,0x5d,0x11,0x39,0x39,0x01,0x2f,0x33,\r\n0xed,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0xed,0x11,0x39,0x11,0x39,0x39,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,\r\n0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x27,0x37,0x1e,0x05,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x03,0xf1,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x79,0x49,0x20,0x38,0x59,0x70,0x70,0x65,0x21,0x5e,0x23,0x70,0x7f,0x81,0x68,\r\n0x41,0x1e,0x3f,0x64,0x46,0x49,0x82,0x62,0x39,0x01,0xbc,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1d,0x34,0x47,0x2a,0x37,0x46,0x31,0x24,0x2b,0x3b,0x2f,0x56,0x2c,0x3b,0x31,0x31,0x43,0x5f,0x47,0x2c,0x54,0x47,0x35,0x0c,0x04,0x0b,0x43,\r\n0x66,0x85,0x00,0x01,0x00,0x3f,0xfe,0x1e,0x03,0xf1,0x04,0x00,0x00,0x2d,0x00,0x8e,0x40,0x52,0x65,0x13,0x01,0x56,0x13,0x01,0x76,0x0f,0x01,0x57,0x0f,0x67,0x0f,0x02,0x2c,0x2d,0x84,0x16,0x18,0x1a,0x28,0x25,0x27,0x27,0x20,0x1a,0x84,0x25,0x25,0x0d,0x16,0x16,0x08,0x2f,0x20,0x84,0x1f,0x1f,0x0b,0x0d,0x84,0x0a,0x08,0x28,0x95,0x18,\r\n0x27,0x18,0x1f,0x20,0x0b,0x0a,0x0a,0x11,0x1d,0x95,0x22,0x89,0x16,0x99,0x16,0x02,0x16,0x2d,0x00,0x18,0x10,0x18,0x02,0x18,0x20,0x22,0x22,0x20,0x18,0x03,0x2d,0x0f,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x12,0x39,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x11,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0x33,\r\n0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x03,0x37,0x16,\r\n0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x32,0x37,0x36,0x37,0x33,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x57,0x5d,0x5f,0xab,0x3f,0x8e,0x9b,0xf9,0x21,0x89,0x17,0x7a,0x4c,0x40,0x6f,0x37,0xac,0x62,0x73,0x73,0x50,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,\r\n0x51,0x8a,0x03,0x3b,0x39,0x08,0x4a,0x65,0x75,0x93,0x01,0x1d,0x26,0xb9,0x47,0x47,0x6b,0x3c,0x82,0x1f,0x24,0x6a,0x00,0x01,0x00,0x60,0xff,0xe8,0x05,0xae,0x06,0x02,0x00,0x52,0x00,0xfc,0x40,0xa7,0x96,0x4c,0x01,0x94,0x47,0x01,0x99,0x2f,0x01,0x66,0x4c,0x76,0x4c,0x02,0x84,0x4b,0x01,0x8c,0x48,0x01,0x8a,0x47,0x01,0x69,0x47,0x79,\r\n0x47,0x02,0x4a,0x42,0x5a,0x42,0x6a,0x42,0x03,0x4a,0x39,0x5a,0x39,0x6a,0x39,0x03,0x7b,0x33,0x01,0x6a,0x33,0x01,0x85,0x2f,0x01,0x66,0x2f,0x76,0x2f,0x02,0x89,0x2c,0x01,0x86,0x25,0x96,0x25,0x02,0x77,0x21,0x01,0x25,0x04,0x01,0x55,0x03,0x01,0x46,0x03,0x01,0x34,0x03,0x01,0x26,0x03,0x01,0x9b,0x4e,0x01,0x4e,0x4d,0x4d,0x3e,0x94,\r\n0x17,0x01,0x17,0x11,0x4a,0x07,0x0d,0x00,0x83,0x4a,0x3e,0x94,0x2d,0x01,0x2d,0x2e,0x2e,0x3d,0x31,0x0c,0x0d,0x0d,0x28,0x83,0x31,0x1e,0x3d,0x84,0x3e,0x70,0x1e,0x01,0x1e,0x23,0x3e,0x3e,0x4e,0x2e,0x2d,0x2d,0x4d,0x4e,0x16,0x36,0x95,0x23,0x45,0x95,0x17,0x19,0x19,0x9d,0x11,0x01,0x7a,0x11,0x8a,0x11,0x02,0x96,0x07,0x01,0x09,0x07,\r\n0x19,0x07,0x29,0x07,0x03,0x11,0x07,0x0c,0x23,0x10,0x0d,0x0c,0x01,0x00,0x3f,0x33,0x3f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x33,0x2f,0x33,0xed,0x10,0xed,0x3f,0x33,0x33,0x2f,0x33,0x11,0x39,0x2f,0x12,0x39,0x5d,0x01,0x2f,0xfd,0x39,0xde,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x5d,0x10,0xde,0xed,0x11,0x39,0x12,0x39,0x39,\r\n0x5d,0x11,0x39,0x2f,0x33,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x13,0x34,0x3e,0x02,0x37,0x3e,0x05,0x37,0x17,0x0e,0x05,0x07,0x06,0x06,0x07,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,\r\n0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x07,0x2e,0x03,0x60,0x30,0x64,0x99,0x69,0x3f,0x85,0x81,0x7a,0x67,0x50,0x18,0x76,0x17,0x5d,0x7a,0x8b,0x8b,0x80,0x31,0x3c,0x4a,0x13,0x18,0x18,0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x59,0x2e,0x55,0x8c,\r\n0x64,0x37,0x1f,0x3e,0x5c,0x3c,0x75,0x5d,0x65,0x22,0x3a,0x4d,0x2b,0x2d,0x43,0x30,0x20,0x12,0x07,0xa4,0x08,0x14,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x65,0x5d,0x75,0x3c,0x5c,0x3e,0x1f,0x02,0x26,0x84,0xe2,0xb8,0x8c,0x2d,0x1b,0x2a,0x24,0x23,0x28,0x30,0x21,0x53,0x25,0x3c,0x33,0x2c,0x29,0x28,0x16,0x1b,0x3f,0x19,0x03,0x1e,\r\n0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x7c,0x4e,0xa3,0x99,0x85,0x2f,0x73,0x47,0xe4,0xa0,0x5a,0x87,0x5a,0x2d,0x2a,0x45,0x59,0x5d,0x59,0x24,0x26,0x5b,0x5d,0x57,0x44,0x29,0x2d,0x5a,0x87,0x5a,0xa0,0xe4,0x47,0x73,0x2f,0x85,0x99,0xa3,0x00,0x01,0x00,0x9a,0xff,0xe6,0x04,0x1d,0x05,0xec,0x00,0x19,0x00,0x6b,0x40,0x26,\r\n0x99,0x13,0x01,0x68,0x13,0x78,0x13,0x02,0x69,0x0e,0x01,0x65,0x0c,0x01,0x56,0x0c,0x01,0x79,0x06,0x01,0x89,0x05,0x01,0x96,0x03,0x01,0x76,0x02,0x01,0x14,0x15,0x17,0x84,0x12,0x00,0x84,0x0f,0x12,0xb8,0xff,0xc0,0x40,0x1c,0x0a,0x0d,0x48,0x10,0x0f,0x20,0x0f,0x02,0x12,0x0f,0x12,0x0f,0x1b,0x0b,0x84,0x90,0x08,0x01,0x08,0x15,0x14,\r\n0x10,0x0a,0x00,0x0d,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x10,0xed,0x10,0xfd,0xce,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x34,0x26,0x35,0x34,0x37,0x17,0x06,\r\n0x15,0x14,0x16,0x04,0x1d,0x6a,0x76,0xe0,0xe5,0x74,0x6a,0xa2,0x01,0x21,0x01,0x1b,0x78,0xbf,0x4d,0x5e,0x6f,0x01,0xb3,0xd5,0x78,0x80,0x7b,0x77,0xd8,0x04,0x3c,0xfb,0xe1,0xfe,0xab,0x01,0x34,0x71,0xfb,0x3c,0x87,0x3d,0x87,0x23,0x34,0x1a,0xf7,0x00,0x00,0x02,0x00,0x5e,0xfe,0x1e,0x05,0xaa,0x05,0x31,0x00,0x36,0x00,0x42,0x01,0x23,\r\n0x40,0xc8,0x09,0x13,0x01,0x06,0x10,0x01,0x57,0x35,0x01,0x77,0x2f,0x87,0x2f,0x02,0x77,0x2b,0x87,0x2b,0x02,0x88,0x27,0x01,0x7c,0x15,0x8c,0x15,0x02,0x6a,0x15,0x01,0x66,0x13,0x01,0x65,0x10,0x01,0x56,0x10,0x01,0x47,0x10,0x01,0x65,0x0f,0x85,0x0f,0x95,0x0f,0x03,0x69,0x0d,0x01,0x57,0x0a,0x01,0x79,0x06,0x01,0x79,0x02,0x01,0x1e,\r\n0xa1,0x1f,0xb1,0x1f,0xc1,0x1f,0x03,0x50,0x1f,0x01,0x1f,0x1f,0x18,0x00,0x83,0x14,0x14,0x29,0x44,0x56,0x33,0x01,0x16,0x33,0x18,0x31,0x84,0x5a,0x27,0x01,0x27,0x41,0x25,0x37,0x3f,0x84,0x29,0x18,0x84,0x25,0x25,0x29,0x08,0x83,0x0f,0x0e,0x01,0x0e,0x0b,0x0c,0x29,0x7b,0x0c,0x8b,0x0c,0x9b,0x0c,0x03,0x49,0x0c,0x01,0x0c,0x85,0x41,\r\n0x01,0x74,0x41,0x01,0x48,0x33,0x68,0x33,0x02,0x39,0x33,0x01,0x78,0x27,0x01,0x6a,0x27,0x01,0x58,0x27,0x01,0x3a,0x27,0x4a,0x27,0x02,0x06,0x27,0x16,0x27,0x26,0x27,0x03,0x27,0x33,0x41,0x03,0x3b,0x9c,0x16,0x01,0x8b,0x16,0x01,0x7c,0x16,0x01,0x6a,0x16,0x01,0x38,0x16,0x48,0x16,0x58,0x16,0x03,0x16,0x0b,0x0b,0x1c,0x2d,0x95,0x3b,\r\n0x3b,0x1f,0x21,0x95,0x1e,0x1c,0x12,0x95,0x04,0x1c,0x00,0x3f,0xed,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x12,0x39,0x2f,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x33,0x5d,0x5d,0x01,0x2f,0xce,0x32,0xdc,0x5d,0xed,0x11,0x33,0x2f,0xed,0x10,0xfd,0xde,0x11,0x39,0x39,0x5d,0xed,0x11,\r\n0x39,0x39,0x5d,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x5d,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x25,0x10,0x07,0x06,0x21,0x20,0x27,0x26,0x11,0x34,0x12,0x37,0x17,0x06,0x11,0x14,0x17,0x16,0x33,0x20,0x11,0x10,0x25,0x06,0x15,0x14,0x17,0x16,0x33,\r\n0x32,0x37,0x17,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x36,0x05,0xaa,0xae,0xb5,0xfe,0xb2,0xfe,0xc5,0xb3,0xad,0xbb,0xb1,0x3b,0xf7,0x78,0x83,0xf0,0x02,0x01,0xfe,0x72,0x60,0x20,0x1d,0x25,0x39,\r\n0x22,0x7a,0x52,0x83,0x62,0x4a,0x52,0x82,0x82,0x53,0x49,0x63,0x5e,0x4a,0x4f,0x87,0xd3,0x78,0x80,0xfe,0x22,0x1f,0x1b,0x23,0x25,0x1d,0x20,0x60,0x5f,0xd9,0xfe,0xb9,0xb7,0xbd,0xc1,0xbb,0x01,0x3a,0xeb,0x01,0x56,0x53,0x96,0x90,0xfe,0xa1,0xf3,0x96,0xa5,0x02,0x0d,0x01,0x67,0xf7,0x5b,0x45,0x28,0x19,0x17,0x2c,0x50,0x6d,0x39,0x40,\r\n0x66,0x79,0x79,0x6e,0x72,0x6d,0x42,0x3a,0x3c,0x40,0x5b,0x62,0x7c,0x7b,0xaa,0xb5,0x02,0xb8,0x21,0x14,0x11,0x14,0x17,0x23,0x46,0x42,0x59,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x06,0x22,0x04,0x18,0x00,0x5a,0x00,0xe8,0x40,0x99,0x17,0x57,0x01,0x7a,0x53,0x01,0x69,0x53,0x01,0x7b,0x52,0x01,0x6a,0x52,0x01,0x48,0x50,0x58,0x50,0x02,\r\n0x96,0x4e,0x01,0x65,0x4e,0x75,0x4e,0x02,0x97,0x4d,0x01,0x86,0x4d,0x01,0x65,0x4d,0x75,0x4d,0x02,0x69,0x49,0x01,0x98,0x3c,0x01,0x89,0x3c,0x01,0x57,0x35,0x01,0x46,0x35,0x01,0x37,0x35,0x01,0x48,0x2c,0x58,0x2c,0x02,0x49,0x2b,0x01,0x8a,0x1d,0x9a,0x1d,0x02,0x48,0x17,0x01,0x5a,0x16,0x01,0x49,0x16,0x01,0x65,0x12,0x75,0x12,0x02,\r\n0x47,0x12,0x57,0x12,0x02,0x5a,0x84,0x19,0x19,0x27,0x5c,0x3d,0x20,0x3e,0x40,0x3e,0x50,0x3e,0x03,0x3e,0x3e,0x48,0x33,0x27,0x43,0x84,0x3b,0x50,0x26,0x84,0x27,0x0d,0x0f,0x84,0x0c,0x0a,0x0a,0x27,0x1f,0x95,0x55,0x55,0x4b,0x3e,0x3d,0x3d,0x4b,0x36,0x95,0x45,0x2e,0x0d,0x0c,0x50,0x26,0x4b,0x0c,0x26,0x0c,0x26,0x14,0x2e,0x95,0x4b,\r\n0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xdc,0xed,0x11,0x33,0x2f,0x33,0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xdc,0xed,0x11,0x39,0x39,0x32,0x2f,0x5d,0x33,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,\r\n0x35,0x34,0x37,0x17,0x0e,0x03,0x15,0x14,0x33,0x36,0x36,0x37,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x06,0x22,0x4d,0x85,0xb4,0x66,0x59,0xa0,0x79,0x47,0x29,0x99,0x1c,0x2c,0x4c,0x64,0x39,0x43,0x77,0x59,0x33,0x17,0x2c,0x3d,0x27,0x24,0x38,0x2b,0x1e,0x12,0x09,0xa4,0x0a,0x13,0x1d,0x26,0x30,0x1c,\r\n0x1d,0x2b,0x22,0x1e,0x11,0x21,0x73,0x63,0x32,0x50,0x38,0x1d,0x7f,0x69,0x12,0x20,0x1a,0x0f,0x4d,0x2e,0x45,0x1f,0x1f,0x84,0x58,0x2e,0x4c,0x3e,0x32,0x13,0x15,0x36,0x43,0x52,0x30,0x55,0x7e,0x52,0x29,0x0e,0x73,0xaf,0x76,0x3c,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4f,0x76,0x4e,0x02,0x40,0x5f,\r\n0x89,0x59,0x2a,0x2d,0x48,0x5b,0x5d,0x56,0x1f,0x1f,0x56,0x5d,0x5b,0x48,0x2d,0x1a,0x35,0x4e,0x34,0x68,0x69,0x22,0x3c,0x54,0x32,0x88,0x6c,0x59,0x0b,0x20,0x28,0x30,0x1a,0x54,0x01,0x56,0x67,0x68,0x78,0x1f,0x39,0x4f,0x2f,0x2f,0x4f,0x39,0x1f,0x38,0x77,0xbb,0x84,0x00,0x00,0x02,0x00,0x40,0xfe,0x1e,0x06,0x9c,0x04,0x18,0x00,0x55,\r\n0x00,0x69,0x00,0xd9,0x40,0x52,0x5a,0x67,0x01,0x39,0x67,0x49,0x67,0x02,0x36,0x63,0x46,0x63,0x56,0x63,0x03,0x56,0x5d,0x01,0x35,0x5d,0x45,0x5d,0x02,0x39,0x59,0x49,0x59,0x59,0x59,0x03,0x56,0x54,0x01,0x86,0x4f,0x96,0x4f,0x02,0x75,0x4f,0x01,0x95,0x4b,0x01,0x96,0x4a,0x01,0x7b,0x29,0x8b,0x29,0x02,0x69,0x28,0x01,0x58,0x28,0x01,\r\n0x5a,0x16,0x01,0x86,0x11,0x01,0x9a,0x08,0x01,0x0d,0x0f,0x84,0x0a,0x0c,0x0a,0x50,0x51,0x4d,0x1f,0x5a,0x43,0x01,0x43,0x30,0xb8,0xff,0xf0,0x40,0x38,0x0f,0x12,0x48,0x30,0x32,0x83,0x56,0x4d,0x83,0x26,0x00,0x83,0x19,0x0a,0x56,0x26,0x19,0x19,0x26,0x56,0x0a,0x04,0x6b,0x60,0x83,0x3c,0x5b,0x95,0x41,0x41,0x48,0x0d,0x0c,0x65,0x95,\r\n0x37,0x51,0x50,0x20,0x95,0x1e,0x37,0x1e,0x37,0x1e,0x14,0x30,0x2b,0x95,0x43,0x48,0x10,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x39,0x10,0xed,0xce,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xfd,0x32,0x2b,0x32,\r\n0x5d,0xce,0x11,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,\r\n0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x06,0x9c,0x4a,0x81,0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,\r\n0x2e,0x4b,0x60,0x32,0x43,0x73,0x53,0x2f,0x38,0x68,0x94,0x5b,0x3b,0x35,0x59,0x80,0x53,0x28,0x2b,0x4a,0x63,0x38,0x2b,0x47,0x3c,0x35,0x1a,0x46,0x43,0x7b,0xad,0x6b,0x6b,0xad,0x7b,0x43,0x43,0x7b,0xad,0x6b,0xb4,0x7a,0x20,0x53,0x5e,0x64,0x30,0x58,0x9d,0x77,0x46,0x98,0x8d,0x49,0x82,0x62,0x39,0xfc,0xa8,0x27,0x4c,0x71,0x4a,0x4a,\r\n0x71,0x4c,0x27,0x27,0x4c,0x71,0x4a,0x4a,0x71,0x4c,0x27,0x0e,0x75,0xb0,0x75,0x3a,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x26,0x4d,0x77,0x51,0x50,0x7c,0x54,0x2b,0x8b,0x1a,0x39,0x59,0x3e,0x36,0x57,0x3c,0x21,0x0a,0x13,0x1c,0x12,0x74,0x9e,0x6a,0xb3,0x83,0x4a,0x49,0x82,0xb3,0x6a,0x69,0xb4,0x83,0x4a,\r\n0x64,0x17,0x25,0x1a,0x0e,0x2d,0x57,0x80,0x52,0x89,0xa3,0x18,0x04,0x0b,0x43,0x66,0x85,0x01,0xef,0x46,0x7f,0x60,0x39,0x39,0x61,0x80,0x46,0x47,0x7f,0x60,0x38,0x39,0x61,0x7f,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x05,0xec,0x00,0x29,0x00,0xad,0x40,0x70,0x76,0x1b,0x01,0x79,0x18,0x01,0x59,0x13,0x69,0x13,0x02,0x75,0x0f,0x01,\r\n0x57,0x0f,0x67,0x0f,0x02,0x09,0x25,0x01,0x95,0x1f,0x01,0x88,0x1b,0x01,0x28,0x29,0x84,0x74,0x26,0x01,0x26,0x00,0x27,0x70,0x27,0x02,0x27,0x24,0x20,0x16,0x01,0x16,0x16,0x08,0x2b,0x1d,0x84,0x1e,0x1e,0x0b,0x0d,0x84,0x0a,0x30,0x08,0x01,0x0f,0x08,0x1f,0x08,0x02,0x08,0x8b,0x25,0x9b,0x25,0x02,0x7f,0x25,0x01,0x49,0x25,0x59,0x25,\r\n0x02,0x27,0x25,0x28,0x8f,0x26,0x9f,0x26,0x02,0x26,0x22,0x0b,0x0a,0x1d,0x0a,0x1d,0x11,0x19,0x95,0x95,0x24,0x01,0x83,0x24,0x01,0x24,0x22,0x22,0x28,0x00,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x33,0x5d,0x5d,0xed,0x11,0x39,0x39,0x2f,0x2f,0x33,0x10,0xce,0x5d,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x01,0x2f,0x5d,0x5d,0x33,\r\n0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xc4,0xcc,0x5d,0x32,0x5d,0xed,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33,\r\n0x32,0x17,0x11,0x07,0x27,0x01,0x33,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x57,0x5d,0x88,0x77,0x66,0x43,0x49,0xa6,0x7d,0x73,0xa8,0x97,0x68,0x81,0x6f,0x01,0x10,0x84,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x51,0x8a,0x01,0xfa,0x79,0x83,0x34,0x39,\r\n0x68,0xa8,0x61,0x57,0x3e,0x01,0xd8,0x82,0x70,0x01,0x14,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x05,0xce,0x04,0x18,0x00,0x49,0x00,0xdb,0x40,0x91,0x67,0x3f,0x77,0x3f,0x02,0x49,0x3b,0x59,0x3b,0x02,0x3a,0x3b,0x01,0x6a,0x3a,0x01,0x66,0x31,0x01,0x46,0x30,0x56,0x30,0x66,0x30,0x03,0x35,0x30,0x01,0x69,0x2c,0x79,0x2c,0x02,0x86,0x1e,\r\n0x96,0x1e,0x02,0x79,0x1a,0x01,0x99,0x19,0x01,0x7a,0x19,0x8a,0x19,0x02,0x76,0x15,0x86,0x15,0x96,0x15,0x03,0x75,0x14,0x01,0x89,0x10,0x99,0x10,0x02,0x47,0x42,0x8e,0x08,0x9e,0x08,0x02,0x7b,0x08,0x01,0x59,0x08,0x01,0x3a,0x08,0x4a,0x08,0x02,0x08,0x00,0x06,0x06,0x0d,0x83,0x42,0x36,0x26,0x27,0x27,0x21,0x83,0x29,0x8d,0x01,0x9d,\r\n0x01,0x02,0x01,0x00,0x00,0x29,0x17,0x35,0x84,0x36,0x17,0x35,0x12,0x27,0x26,0x35,0x26,0x35,0x26,0x08,0x3d,0x95,0x12,0x2e,0x95,0x1c,0x1c,0x12,0x10,0x27,0x47,0x01,0x47,0x01,0x08,0x95,0x03,0x06,0xf4,0x05,0x05,0x03,0x00,0x01,0x1c,0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x5d,0x3f,0x33,0x2f,0xed,0x10,0xed,0x11,\r\n0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x12,0x39,0x01,0x2f,0xfd,0x39,0xce,0x32,0x2f,0x33,0x5d,0x10,0xed,0x33,0x2f,0x39,0x10,0xde,0xed,0x32,0x2f,0x11,0x39,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x07,0x24,0x21,0x22,0x07,0x35,0x36,0x33,0x2e,0x03,\r\n0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x27,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x16,0x04,0x05,0x42,0x68,0xfe,0x9c,0xfe,0x55,0xd7,0x94,0x9b,0xd4,0x54,0x7e,0x53,0x2a,0x37,0x64,0x8c,0x55,\r\n0x2f,0x5a,0x4f,0x3f,0x15,0x15,0x3f,0x4f,0x59,0x2e,0x55,0x8c,0x64,0x37,0x08,0x0f,0x16,0x0e,0x98,0x2b,0x22,0x3a,0x4d,0x2b,0x2c,0x41,0x30,0x20,0x13,0x09,0xa4,0x01,0x08,0x13,0x20,0x30,0x42,0x2b,0x2b,0x4d,0x3a,0x22,0x48,0x88,0xc7,0x7f,0xab,0x01,0x00,0xfe,0x9b,0x7d,0xfc,0x7e,0xa8,0x62,0x2d,0x8c,0xaa,0xbe,0x5f,0x7c,0xbb,0x7d,\r\n0x3e,0x1e,0x37,0x4d,0x2f,0x2f,0x4d,0x37,0x1e,0x3e,0x7d,0xbb,0x7c,0x28,0x59,0x57,0x4e,0x1e,0x37,0x80,0x8d,0x5a,0x87,0x5a,0x2d,0x33,0x52,0x69,0x6c,0x67,0x27,0x27,0x67,0x6c,0x69,0x52,0x33,0x2d,0x5a,0x88,0x5a,0x89,0xcc,0x9a,0x72,0x2f,0x3f,0x7c,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x3b,0x00,0xcb,0x40,0x77,\r\n0x66,0x32,0x01,0x86,0x31,0x01,0x74,0x31,0x01,0x65,0x31,0x01,0x56,0x31,0x01,0x9a,0x22,0x01,0x98,0x21,0x01,0x55,0x17,0x65,0x17,0x02,0x47,0x16,0x01,0x67,0x11,0x01,0x56,0x11,0x01,0x7a,0x08,0x01,0x79,0x07,0x01,0x3b,0x84,0x1a,0x39,0x39,0x0a,0x3d,0x5c,0x2a,0x6c,0x2a,0x7c,0x2a,0x03,0x3b,0x2a,0x4b,0x2a,0x02,0x2d,0x2a,0x01,0x2a,\r\n0x2f,0x84,0x7c,0x29,0x01,0x6b,0x29,0x01,0x5c,0x29,0x01,0x3d,0x29,0x4d,0x29,0x02,0x2e,0x29,0x01,0x29,0x60,0x24,0x01,0x24,0x24,0x0d,0x0f,0x84,0x0c,0x0a,0x2a,0x29,0x29,0x3a,0x34,0x95,0x6a,0x1a,0x01,0x59,0x1a,0x01,0x3a,0x1a,0x4a,0x1a,0x02,0x2b,0x1a,0x01,0x1a,0x1f,0x0d,0x0c,0x1f,0xb8,0xff,0xc0,0x40,0x0d,0x0b,0x10,0x48,0x1f,\r\n0x0c,0x1f,0x0c,0x3a,0x0f,0x14,0x95,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x2b,0x11,0x33,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x33,0x2f,0x33,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0xed,0x32,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x05,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x37,0x17,0x06,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x03,0xf1,0x4a,0x81,\r\n0xb1,0x66,0x52,0x9b,0x79,0x49,0x29,0x99,0x1c,0x2e,0x4b,0x60,0x32,0x43,0x74,0x55,0x30,0x17,0x3f,0x4b,0x53,0x2a,0x57,0x91,0x68,0x39,0x0f,0x0a,0x0b,0x0f,0x99,0x0b,0x08,0x08,0x0b,0x28,0x42,0x56,0x2f,0x3e,0x65,0x48,0x27,0xa4,0x22,0x69,0xa6,0x74,0x3d,0x34,0x60,0x8a,0x56,0x5b,0x54,0x37,0x32,0x4a,0x35,0x55,0x3c,0x20,0x28,0x4d,\r\n0x6d,0x45,0x02,0x41,0x1a,0x2f,0x24,0x15,0x36,0x67,0x96,0x5f,0x33,0x59,0x22,0x28,0x22,0x37,0x1a,0x1e,0x1a,0x43,0x26,0x46,0x66,0x42,0x20,0x3b,0x63,0x80,0x45,0x85,0x00,0x02,0x00,0x32,0xff,0xe8,0x04,0xdb,0x06,0x02,0x00,0x2b,0x00,0x37,0x00,0x9d,0x40,0x65,0x48,0x36,0x58,0x36,0x02,0x39,0x36,0x01,0x37,0x33,0x47,0x33,0x57,0x33,\r\n0x03,0x38,0x2e,0x48,0x2e,0x58,0x2e,0x03,0x88,0x10,0x01,0x69,0x0a,0x01,0x66,0x03,0x01,0x86,0x28,0x96,0x28,0x02,0x86,0x26,0x96,0x26,0x02,0x99,0x10,0x01,0x08,0x83,0x32,0x32,0x16,0x20,0x22,0x84,0x1f,0x1f,0x1d,0x01,0x1d,0x16,0x27,0x16,0x15,0x2c,0x83,0x2b,0x84,0x10,0x0e,0x01,0x0e,0x15,0x84,0x16,0x1a,0x95,0x25,0x25,0x83,0x27,\r\n0x93,0x27,0x02,0x27,0x29,0x1f,0x20,0x20,0x16,0x30,0x95,0x0e,0x0c,0x0c,0x34,0x11,0x95,0x29,0x01,0x34,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x2f,0x33,0x11,0x39,0x5d,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xdc,0x5d,0xfd,0xed,0x11,0x12,0x39,0x10,0xde,0x5d,0x32,0xed,0x32,0x11,0x33,0x2f,0xed,0x31,\r\n0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x35,0x10,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x20,0x11,0x03,0x34,0x27,0x26,0x23,0x20,0x11,\r\n0x10,0x21,0x32,0x37,0x36,0x04,0xdb,0x79,0x80,0xe5,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xac,0x67,0x30,0x24,0xa4,0x24,0x30,0x67,0x47,0x4c,0x1e,0xa6,0x20,0xad,0x8e,0xb9,0x53,0x53,0xbb,0x01,0x54,0xa8,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa3,0x55,0x4a,0x01,0xe0,0xe1,0x88,0x8f,0x96,0x8c,0xe6,0xdf,0x80,0x8d,0x77,0xce,0x01,\r\n0x45,0x64,0x49,0x69,0x69,0x49,0x64,0x65,0x51,0x3a,0x53,0x1d,0x52,0x4e,0x95,0xb5,0xbd,0xbd,0xfe,0x22,0xfd,0xc2,0xa1,0x5e,0x6d,0xfe,0x98,0xfe,0x88,0x73,0x63,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x03,0xf8,0x06,0x02,0x00,0x23,0x00,0x2c,0x00,0x72,0x40,0x44,0x85,0x21,0xa5,0x21,0x02,0x87,0x17,0x01,0x88,0x06,0x98,0x06,0x02,0x7b,\r\n0x08,0x01,0x80,0x04,0x90,0x04,0x02,0x76,0x04,0x01,0x04,0x00,0x05,0x05,0x1e,0x00,0x83,0x07,0x07,0x10,0x2e,0x19,0x84,0x24,0x2b,0x0e,0x1e,0x84,0x10,0x2b,0x95,0x1d,0x1d,0x37,0x1e,0x01,0x26,0x1e,0x01,0x1e,0x0a,0x95,0x20,0x20,0x0f,0x26,0x95,0x15,0x01,0x05,0x04,0x04,0x0f,0x15,0x00,0x3f,0x33,0x2f,0x33,0x3f,0xed,0x11,0x39,0x2f,\r\n0xed,0x33,0x5d,0x5d,0x33,0x2f,0xed,0x01,0x2f,0xfd,0xc4,0xc4,0xdc,0xed,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x07,0x27,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,\r\n0x15,0x36,0x33,0x32,0x17,0x16,0x01,0x34,0x23,0x22,0x07,0x06,0x15,0x15,0x36,0x03,0xf8,0x3d,0x3e,0x6b,0x75,0xb7,0x7a,0x74,0x81,0x51,0x4a,0xa4,0x37,0x48,0xb5,0x6b,0x41,0x46,0x7b,0x64,0xa3,0x72,0xe2,0x9c,0x61,0x5d,0xfe,0x32,0x50,0x43,0x28,0x25,0xe0,0x01,0xe3,0x8e,0x89,0x8c,0x58,0x73,0x9f,0xe1,0x88,0x9f,0x70,0x66,0x88,0xfe,\r\n0x5c,0x04,0x83,0xb0,0x59,0x76,0x34,0x38,0x66,0x96,0x69,0x55,0x2b,0xd3,0xae,0x7a,0x77,0x02,0x91,0x4b,0x33,0x2f,0x45,0x8d,0x3c,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x04,0x8b,0x04,0x18,0x00,0x2d,0x00,0xcc,0x40,0x89,0x87,0x2d,0x01,0x65,0x2d,0x01,0x76,0x2c,0x01,0x86,0x29,0x96,0x29,0x02,0x64,0x29,0x74,0x29,0x02,0x46,0x26,0x96,\r\n0x26,0x02,0x96,0x24,0x01,0x9a,0x20,0x01,0x8d,0x1f,0x01,0x39,0x1f,0x01,0x5d,0x17,0x01,0x48,0x16,0x01,0x69,0x13,0x01,0x48,0x13,0x01,0x84,0x10,0x01,0x75,0x0f,0x01,0x07,0x0f,0x17,0x0f,0x67,0x0f,0x03,0x9a,0x06,0x01,0x29,0x06,0x01,0x54,0x02,0x01,0x9a,0x0a,0x01,0x8b,0x0a,0x01,0x7e,0x0a,0x01,0x0a,0x08,0x0b,0x21,0x94,0x22,0x01,\r\n0x22,0x21,0x2a,0x2b,0x19,0x28,0x83,0x1d,0x00,0x83,0x15,0x2f,0x21,0x3f,0x21,0x02,0x21,0x19,0x1d,0x15,0x15,0x1d,0x19,0x21,0x04,0x2f,0x0d,0x83,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2b,0x2a,0x18,0x95,0x1a,0x1a,0x22,0x0b,0x0a,0x0a,0x21,0x22,0x10,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x2f,0x33,0x11,0x39,0x2f,0xed,0x39,\r\n0x39,0x01,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x5d,0x10,0xce,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x20,0x27,0x26,0x11,0x10,0x13,0x17,\r\n0x02,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,0x16,0x15,0x14,0x05,0x15,0x16,0x16,0x04,0x8b,0x8e,0x85,0xcf,0xfe,0xdf,0x9b,0x8d,0xb0,0x88,0x8a,0x74,0x6d,0xb1,0x89,0x5a,0x60,0xcb,0xb0,0x1d,0x17,0x01,0x4f,0xa2,0x8b,0x4c,0x77,0x3d,0x79,\r\n0x65,0x45,0x4a,0xfe,0xef,0x92,0xb1,0x22,0xd2,0x7b,0x73,0xcc,0xba,0x01,0x35,0x01,0xa5,0x01,0x9a,0x3a,0xfe,0x88,0xfe,0x71,0xfe,0xf4,0x96,0x8d,0x4c,0x51,0x8a,0x8b,0x98,0x8b,0xd9,0x8b,0x2c,0x26,0x85,0x60,0x6d,0x22,0x1c,0x4e,0x52,0x65,0xf3,0x36,0x04,0x0e,0xba,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x28,0x06,0x02,0x00,0x16,\r\n0x00,0x22,0x00,0x68,0x40,0x26,0x59,0x21,0x01,0x56,0x1e,0x01,0x55,0x1c,0x01,0x59,0x19,0x01,0x78,0x0b,0x01,0x69,0x0b,0x01,0x66,0x03,0x01,0x94,0x12,0x01,0x76,0x12,0x86,0x12,0x02,0x12,0x00,0x11,0x0e,0x17,0x83,0x00,0x84,0x0e,0xb8,0xff,0xc0,0x40,0x1a,0x0a,0x0d,0x48,0x0e,0x0e,0x24,0x1d,0x83,0x0f,0x08,0x1f,0x08,0x02,0x08,0x11,\r\n0x12,0x01,0x1b,0x95,0x0e,0x0c,0x0f,0x1f,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x33,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x2b,0xfd,0xed,0x10,0xce,0x11,0x39,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x35,0x10,0x27,0x37,0x16,\r\n0x17,0x16,0x15,0x03,0x34,0x27,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x04,0x28,0x79,0x80,0xe5,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xb8,0x75,0x71,0x3f,0x3b,0xa8,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa3,0x55,0x4a,0x01,0xf4,0xf5,0x88,0x8f,0x96,0x8c,0xfa,0xf3,0x80,0x8d,0x77,0x4c,0x01,0x29,0x8d,0x73,0x58,0xa3,0x97,\r\n0x98,0xfe,0x22,0xb5,0x5e,0x6d,0xfe,0x84,0xfe,0x74,0x73,0x63,0x00,0x02,0x00,0x32,0xfe,0x1e,0x04,0xdb,0x06,0x02,0x00,0x25,0x00,0x28,0x01,0x1e,0x40,0x21,0x98,0x22,0x01,0x96,0x20,0x01,0x86,0x0a,0x01,0x99,0x07,0x01,0x21,0x0d,0x0c,0x19,0x1a,0x18,0x1a,0x06,0x27,0x01,0x27,0x15,0x14,0x28,0x14,0x51,0x18,0x61,0x18,0x02,0x18,0xb8,\r\n0xff,0xc8,0x40,0x90,0x33,0x36,0x48,0x00,0x18,0x10,0x18,0x20,0x18,0x03,0xf1,0x18,0x01,0x58,0x18,0x01,0x29,0x18,0x01,0x18,0x14,0x28,0x14,0x84,0x1a,0x18,0x14,0x1a,0x1a,0x18,0x0c,0x84,0x0d,0x0d,0x26,0x0f,0x1a,0x01,0x1a,0x1a,0x28,0x03,0x05,0x84,0x00,0x31,0x17,0x41,0x17,0x51,0x17,0x71,0x17,0x81,0x17,0x05,0x77,0x17,0x01,0x56,\r\n0x17,0x01,0x47,0x17,0x01,0x25,0x17,0x01,0x16,0x17,0x01,0x3e,0x26,0x4e,0x26,0x02,0x38,0x26,0x01,0x0b,0x26,0x01,0x17,0x26,0x28,0x26,0x84,0x16,0x17,0x14,0x16,0x16,0x17,0x02,0x0e,0x00,0x01,0x00,0x00,0x80,0x16,0x01,0x16,0x16,0x58,0x28,0x01,0x26,0x28,0x01,0x28,0x28,0x1b,0x21,0x0d,0x08,0x95,0x23,0x23,0x1f,0x03,0x02,0x02,0x0d,\r\n0x26,0x27,0x95,0x1a,0x16,0x15,0x14,0x15,0x0d,0x15,0x0d,0x15,0x18,0x11,0x95,0x1f,0x01,0x17,0x18,0x1b,0x00,0x3f,0xc4,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc4,0x33,0xfd,0xc4,0x11,0x33,0x2f,0x33,0x11,0x33,0x2f,0xed,0x12,0x39,0x3f,0x01,0x3d,0x2f,0x5d,0x5d,0xc9,0x18,0x2f,0x5d,0x32,0x2f,0x5d,0x33,0x87,0x10,0x2b,\r\n0x87,0x7d,0xc4,0x01,0x5d,0x5d,0x72,0x5d,0x5d,0x5d,0x5d,0x5d,0x72,0x18,0x10,0xed,0x32,0x10,0xc9,0x2f,0x5d,0x12,0x39,0x2f,0xed,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x01,0x5d,0x5d,0x71,0x72,0x2b,0x72,0x10,0x87,0xc4,0xc4,0x01,0x5d,0x10,0x87,0x0e,0xc4,0x11,0x12,0x01,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x27,0x36,0x35,\r\n0x34,0x26,0x23,0x22,0x07,0x06,0x15,0x23,0x34,0x27,0x26,0x23,0x22,0x11,0x14,0x17,0x21,0x01,0x23,0x01,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x01,0x21,0x01,0x04,0xdb,0x20,0xa6,0x1e,0x4c,0x47,0x67,0x30,0x24,0xa4,0x24,0x30,0x67,0xac,0x1c,0x03,0xa7,0xfe,0x25,0xa2,0xfe,0x67,0x55,0x4d,0x57,0xb0,0xbb,0x53,\r\n0x53,0xb9,0x8e,0xad,0xfe,0xf4,0xfd,0x4c,0x01,0x56,0x04,0xb8,0x4e,0x52,0x1d,0x53,0x3a,0x51,0x65,0x64,0x49,0x69,0x69,0x49,0x64,0xfe,0xc5,0x6c,0x5d,0xfa,0xaa,0x04,0x7f,0xef,0xa2,0xd3,0x78,0x89,0xbd,0xbd,0xb5,0xfd,0x9a,0xfb,0xe8,0x00,0x00,0x02,0x00,0x50,0xfe,0x1e,0x04,0x00,0x05,0xec,0x00,0x41,0x00,0x4c,0x00,0xe4,0x40,0x8d,\r\n0x76,0x3f,0x01,0x75,0x3e,0x01,0x86,0x3d,0x01,0x73,0x3d,0x01,0x99,0x18,0x01,0x76,0x13,0x01,0x76,0x0f,0x01,0x67,0x0f,0x01,0x88,0x01,0x01,0x37,0x36,0x39,0x2f,0x36,0x36,0x34,0x31,0x32,0x2f,0x84,0x28,0x1c,0x42,0x00,0x84,0x15,0x42,0x15,0x42,0x15,0x22,0x4e,0x2d,0x84,0x2a,0x2a,0x22,0x0b,0x0d,0x84,0x0a,0x08,0x08,0x48,0x84,0x22,\r\n0x43,0x42,0x45,0x4b,0xb9,0x32,0x01,0xa8,0x32,0x01,0x32,0x31,0x31,0x66,0x2f,0x01,0x37,0x2f,0x47,0x2f,0x57,0x2f,0x03,0x26,0x2f,0x01,0x69,0x39,0x01,0x38,0x39,0x48,0x39,0x58,0x39,0x03,0x29,0x39,0x01,0x1c,0x39,0x34,0x2f,0x28,0x05,0x1e,0x26,0x95,0x45,0x4b,0xb6,0x36,0x01,0xa7,0x36,0x01,0x36,0x37,0x37,0x0b,0x0a,0x0a,0x11,0x1e,\r\n0x95,0x4b,0x4b,0x11,0x29,0x95,0x2e,0x2c,0x00,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xde,0xed,0x11,0x39,0x2f,0xed,0x11,0x39,0x2f,0x33,0x32,0x2f,0x33,0x5d,0x5d,0x10,0xde,0xed,0x11,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x5d,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x2f,\r\n0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xc4,0xfd,0xcd,0x39,0x39,0x32,0x2f,0x10,0xc4,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x26,0x27,0x26,0x35,0x06,\r\n0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x36,0x37,0x17,0x06,0x07,0x16,0x17,0x07,0x26,0x27,0x15,0x14,0x17,0x16,0x17,0x16,0x17,0x16,0x01,0x35,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x04,0x00,0x9d,0x86,0xb6,0xb3,0x88,0x9c,0x28,0x9c,0x1e,0x68,0x58,0x71,0x74,0x56,0x69,\r\n0x25,0x06,0xb5,0x19,0x28,0x5d,0x5d,0x71,0x43,0x3f,0x3f,0x44,0x70,0x5b,0x5f,0xfe,0x7c,0xa4,0x01,0x84,0x55,0x40,0x81,0x4b,0x56,0x56,0x4b,0x81,0x40,0x55,0x23,0x13,0x42,0x67,0x19,0x2b,0xfe,0x39,0x64,0x56,0x25,0x3d,0x3d,0x25,0x56,0x8c,0xa5,0x5f,0x52,0x57,0x64,0xa5,0x5e,0x51,0x37,0x37,0x45,0x65,0x3b,0x32,0x2d,0x36,0x65,0x51,\r\n0x34,0x09,0xbb,0x2c,0x45,0x66,0x29,0x4b,0x46,0x6d,0x6d,0x47,0x4b,0x2a,0x01,0xa1,0x01,0x11,0x79,0xfd,0x61,0x59,0x69,0x60,0x74,0x5d,0x5d,0x74,0x5f,0x69,0x59,0x6d,0x41,0x34,0x1c,0x41,0x66,0x27,0x46,0x02,0x5f,0x43,0x40,0x3f,0x22,0x22,0x40,0x00,0x00,0x02,0x00,0xae,0xff,0xe8,0x04,0x76,0x05,0xec,0x00,0x11,0x00,0x1d,0x00,0x92,\r\n0x40,0x62,0x5a,0x1d,0x01,0x49,0x1d,0x01,0x45,0x1b,0x55,0x1b,0x02,0x46,0x1a,0x56,0x1a,0x02,0x46,0x16,0x56,0x16,0x02,0x49,0x13,0x59,0x13,0x02,0x69,0x05,0x01,0x37,0x1d,0x01,0x37,0x1a,0x01,0x38,0x16,0x01,0x85,0x0e,0x01,0x74,0x0e,0x01,0x07,0x0e,0x17,0x0e,0x02,0x0e,0x0c,0x0b,0x2e,0x0d,0x01,0x1f,0x0d,0x01,0x0d,0x0d,0x00,0x83,\r\n0x10,0x12,0x20,0x12,0x30,0x12,0x03,0x12,0x12,0x1f,0x0b,0x84,0x18,0x83,0x08,0x0c,0x2e,0x0d,0x01,0x0d,0x0d,0x0a,0x14,0x95,0x66,0x0b,0x01,0x0b,0x0e,0x0f,0x0a,0x00,0x1c,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xc4,0x01,0x2f,0xed,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x5d,0x5d,0x12,0x39,\r\n0x39,0x5d,0x5d,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x33,0x11,0x01,0x33,0x01,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x04,0x76,0x7b,0x84,0xeb,0xe5,0x80,0x79,0xa8,0x01,0xd8,0xd7,0xfe,0xa0,0xea,0x79,\r\n0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0x01,0xf0,0xe6,0x8c,0x96,0x8f,0x88,0xe1,0x04,0x0c,0xfd,0x7a,0x01,0x9e,0xfe,0xd8,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x00,0x00,0x01,0x00,0x21,0xfe,0x1e,0x05,0xf5,0x04,0x18,0x00,0x43,0x01,0x30,0x40,0xb7,0x75,0x3a,0x01,0x67,0x29,0x01,0x56,0x29,\r\n0x01,0x45,0x29,0x01,0x26,0x29,0x01,0x36,0x17,0x01,0x6a,0x0e,0x01,0x42,0x41,0x41,0x00,0x84,0x3f,0x3b,0x30,0x31,0x31,0x2c,0x3a,0x3b,0x28,0x38,0x08,0x39,0x38,0x08,0x38,0x2a,0x2b,0x17,0x29,0x3b,0x28,0x2b,0x17,0x18,0x06,0x19,0x2b,0x17,0x07,0x06,0x19,0x38,0x08,0xa5,0x2b,0x01,0x2b,0x08,0x38,0x08,0x84,0x17,0x2b,0x14,0x17,0x17,\r\n0x2b,0x2b,0x2c,0x84,0x38,0x37,0x37,0x28,0x06,0x19,0x06,0x84,0x3b,0x28,0x14,0x3b,0x28,0x3b,0x3b,0x17,0x45,0x20,0x1f,0x22,0x84,0x1d,0x1f,0x1f,0x1d,0x19,0x19,0x17,0x10,0x0f,0x08,0x17,0x0a,0x84,0x00,0x15,0x01,0x15,0x15,0x17,0x38,0x2e,0x31,0x33,0x30,0x30,0x2e,0x95,0x33,0x33,0x26,0xc5,0x1f,0x01,0x1f,0x20,0x20,0x19,0x1b,0x95,\r\n0x28,0x26,0x10,0xba,0x41,0x01,0xa9,0x41,0x01,0x41,0x42,0x42,0x3b,0x3d,0x95,0x04,0xd2,0x17,0x01,0x24,0x17,0x44,0x17,0x54,0x17,0x03,0x09,0x17,0x01,0x17,0x76,0x10,0x86,0x10,0x02,0x10,0x12,0x95,0x6c,0x0f,0x01,0x0f,0x0d,0x0d,0x06,0x04,0x1c,0x00,0x3f,0x33,0x33,0x2f,0x33,0x5d,0xed,0x32,0x5d,0x32,0x5d,0x5d,0x5d,0x10,0xed,0x32,\r\n0x32,0x2f,0x33,0x5d,0x5d,0x3f,0x33,0xed,0x32,0x32,0x2f,0x33,0x5d,0x11,0x33,0x2f,0xed,0x32,0x2f,0x12,0x39,0x11,0x33,0x01,0x2f,0x33,0x2f,0x5d,0xed,0x11,0x39,0xcc,0x32,0x11,0x33,0x2f,0xce,0x32,0x2f,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x87,0x2b,0x87,0x7d,0xc4,0x01,0x33,0x18,0x2f,0x33,0xed,0x32,0x87,0x04,0x10,0x2b,0x87,\r\n0x7d,0xc4,0x00,0x5d,0x0f,0x0f,0x0f,0x87,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x0f,0x11,0x01,0x33,0x18,0x2f,0x33,0x10,0xde,0xed,0x33,0x2f,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x01,0x01,\r\n0x26,0x23,0x22,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x01,0x01,0x36,0x35,0x34,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x01,0x01,0x16,0x33,0x32,0x35,0x34,0x27,0x37,0x16,0x05,0xf5,0x40,0x3c,0x5b,0x90,0x52,0xfe,0xcf,0xfe,0xa4,0x33,0x8e,0x69,0x77,0x53,0x43,0x3c,0x4b,0x24,0x36,0x83,\r\n0x01,0xef,0xfe,0xc3,0x36,0x2f,0x2b,0x5a,0x7f,0x74,0x40,0x3c,0x5b,0x8b,0x52,0x01,0x3b,0x01,0xd3,0x59,0x38,0x3d,0x87,0x58,0xac,0x64,0x62,0x3a,0x37,0x86,0xfe,0x26,0x01,0x35,0x37,0x30,0x2b,0x5a,0x7f,0x74,0xfe,0xf1,0x62,0x3a,0x37,0x86,0x01,0xf3,0xfe,0xfd,0x38,0x6c,0x5d,0x75,0x47,0x8a,0x47,0x34,0x24,0x6b,0x50,0x01,0x70,0x02,\r\n0x06,0x58,0x38,0x3d,0x87,0x58,0xac,0x64,0x62,0x3a,0x37,0x86,0xfd,0xff,0x01,0x5c,0x42,0x25,0x2b,0x5a,0x7f,0x74,0x40,0x3c,0x5b,0x7e,0x64,0xfe,0x9f,0xfe,0x08,0x59,0x38,0x3d,0x87,0x58,0xac,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0xf3,0x06,0x02,0x00,0x3d,0x00,0xa2,0x40,0x5f,0x94,0x32,0x01,0x87,0x2e,0x01,0x98,0x15,0x01,0x86,\r\n0x12,0x01,0x77,0x12,0x01,0x77,0x0f,0x87,0x0f,0x02,0x99,0x01,0x01,0x36,0x20,0x33,0x84,0x24,0x24,0x13,0x3a,0x19,0x38,0x84,0x1d,0x1d,0x13,0x20,0x20,0x19,0x19,0x0d,0x00,0x84,0x13,0x13,0x08,0x3f,0x2d,0x2c,0x2c,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x01,0x08,0x36,0x20,0x95,0x22,0x3a,0x19,0x0b,0x0a,0x0a,0x17,0x95,0x19,0x8b,0x2c,0x01,\r\n0x18,0x31,0x01,0x9a,0x28,0x01,0x28,0x31,0x2c,0x03,0x2d,0x22,0x19,0x22,0x19,0x2d,0x01,0x11,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x33,0x11,0x39,0x10,0xed,0x39,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x33,0x2f,\r\n0x11,0x33,0x2f,0xed,0x11,0x39,0x11,0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x35,0x34,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x26,\r\n0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,0x04,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x03,0xf3,0x8f,0x80,0xd5,0xae,0x79,0x88,0x29,0x99,0x1c,0x55,0x4a,0x6c,0x01,0x3f,0x3d,0x40,0x60,0x60,0x60,0x64,0x79,0xdd,0x60,0x60,0xdd,0x55,0x17,0x79,0xa1,0x2f,0x6a,0x3d,0x6d,0x41,0x5f,0x23,0x9d,0x01,0x32,0x6d,0x5c,0xc9,\r\n0xc9,0x58,0x3a,0x37,0x01,0x2b,0xa2,0x55,0x4c,0x57,0x62,0xa7,0x5c,0x53,0x37,0x33,0x49,0x66,0x3a,0x32,0xc9,0x43,0x2f,0x30,0x8b,0x48,0x40,0x82,0x8b,0x84,0x44,0x1e,0x08,0x14,0x1b,0x10,0x24,0x54,0x60,0x48,0x1c,0x0b,0x18,0x2f,0xc9,0x4a,0x6e,0x13,0x2a,0xa1,0xa0,0x2a,0x13,0x4b,0x47,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x95,\r\n0x06,0x02,0x00,0x3d,0x00,0x45,0x00,0xc6,0x40,0x7a,0x76,0x41,0x01,0x57,0x41,0x67,0x41,0x02,0x65,0x30,0x01,0x99,0x2b,0x01,0x98,0x2a,0x01,0x99,0x29,0x01,0x99,0x28,0x01,0x99,0x17,0x01,0x9b,0x14,0x01,0x89,0x14,0x01,0x94,0x12,0x01,0x55,0x12,0x85,0x12,0x02,0x37,0x11,0x01,0x86,0x0d,0x01,0x89,0x07,0x01,0x6b,0x03,0x01,0x36,0x22,\r\n0x33,0x84,0x26,0x26,0x15,0x3a,0x1b,0x00,0x22,0x22,0x2f,0x1b,0x01,0x1b,0x1b,0x42,0x38,0x84,0x1f,0x1f,0x15,0x2d,0x2c,0x3e,0x84,0x0b,0x0b,0x42,0x00,0x84,0x15,0x15,0x47,0x0f,0x42,0x83,0x06,0x3a,0x19,0x95,0x1b,0x42,0x95,0x0f,0x36,0x23,0x95,0x21,0x1b,0x0f,0x21,0x21,0x0f,0x1b,0x03,0x13,0x40,0x95,0x08,0x2c,0x2d,0x2d,0x08,0x01,\r\n0x13,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x33,0x10,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x10,0xed,0x39,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0xed,0xce,0x32,0x11,0x33,0x2f,0xed,0x12,0x39,0x2f,0x5d,0x33,0x2f,0x11,0x12,0x39,0x11,0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x03,0x26,0x11,0x10,0x21,0x32,0x16,0x15,0x14,0x07,0x06,0x07,0x14,0x17,0x12,0x33,0x20,0x35,0x34,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x27,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x17,\r\n0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x23,0x22,0x11,0x36,0x37,0x36,0x04,0x95,0xfe,0x5f,0xfe,0xb4,0xb4,0x94,0x01,0x4e,0x67,0x7c,0x7d,0x7a,0x8f,0x67,0x87,0xf0,0x01,0x09,0x3d,0x40,0x60,0x60,0x60,0x64,0x79,0xdd,0x60,0x60,0xdd,0x3d,0x40,0x41,0x51,0x21,0x81,0x1a,0x5b,0x88,0x0c,0x49,0x6d,0x5c,\r\n0xc9,0xc9,0x58,0x3a,0x37,0xfd,0x5a,0x41,0xa3,0x65,0x45,0x3a,0x01,0x2b,0xfe,0xbd,0x01,0x30,0xfa,0x01,0x59,0x02,0x97,0x74,0x68,0xa0,0xa0,0x9b,0x26,0xd8,0xcc,0xfe,0xf1,0xc9,0x43,0x2f,0x30,0x8b,0x48,0x40,0x82,0x8b,0x84,0x36,0x29,0x27,0x28,0x39,0x50,0x4a,0x41,0x3c,0x59,0x0b,0x42,0x5c,0x4a,0x6e,0x13,0x2a,0xa1,0xa0,0x2a,0x13,\r\n0x4b,0x47,0x03,0xa4,0x55,0xfe,0x40,0x1b,0x83,0x6f,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x1d,0x04,0x18,0x00,0x19,0x00,0x27,0x01,0x04,0x40,0xb7,0x48,0x20,0x58,0x20,0x02,0x48,0x1c,0x58,0x1c,0x02,0x08,0x17,0x01,0x77,0x13,0x01,0x65,0x13,0x01,0x77,0x0f,0x01,0x65,0x0f,0x01,0x08,0x0b,0x01,0x25,0x1a,0x22,0x17,0x04,0x0b,0x03,0x0d,\r\n0x19,0x19,0x15,0x83,0x1a,0x1a,0x29,0x22,0x83,0x0d,0x09,0x09,0x0d,0x1e,0x95,0x11,0x10,0x16,0x25,0x01,0x07,0x25,0x01,0xe7,0x25,0xf7,0x25,0x02,0xc5,0x25,0x01,0x97,0x25,0x01,0x73,0x25,0x83,0x25,0x02,0x64,0x25,0x01,0x47,0x25,0x57,0x25,0x02,0x25,0x09,0xda,0x0b,0x01,0x99,0x0b,0x01,0x0b,0x95,0x06,0x19,0xda,0x17,0x01,0x99,0x17,\r\n0x01,0x17,0x95,0x19,0x00,0x01,0x08,0x00,0x01,0xe9,0x00,0xf9,0x00,0x02,0x9b,0x00,0x01,0x00,0x02,0x02,0x19,0x08,0x01,0x08,0x08,0x01,0xe9,0x08,0xf9,0x08,0x02,0x9b,0x08,0x01,0x08,0x0b,0x04,0x01,0xeb,0x04,0xfb,0x04,0x02,0x04,0x20,0x21,0x24,0x48,0x7c,0x04,0x01,0x5d,0x04,0x6d,0x04,0x02,0x4b,0x04,0x01,0x1a,0x04,0x2a,0x04,0x3a,\r\n0x04,0x03,0x09,0x04,0x01,0xfa,0x04,0x01,0xdb,0x04,0xeb,0x04,0x02,0x9d,0x04,0x01,0x04,0x06,0x16,0x00,0x3f,0x33,0x5d,0x5d,0x5d,0x71,0x71,0x71,0x71,0x71,0x2b,0x71,0x72,0x33,0x5d,0x5d,0x71,0x71,0x33,0x2f,0x33,0x5d,0x5d,0x71,0x71,0xed,0x5d,0x5d,0x32,0x10,0xed,0x5d,0x5d,0x32,0x32,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x71,0x3f,\r\n0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x11,0x17,0x39,0x11,0x12,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x27,0x35,0x16,0x37,0x26,0x11,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x07,0x16,0x37,0x01,0x34,0x27,0x26,0x23,0x22,0x07,0x06,\r\n0x15,0x14,0x16,0x17,0x36,0x36,0x05,0x1d,0x92,0xec,0x84,0x73,0x73,0x85,0xec,0x92,0x8e,0xfb,0xe8,0x8a,0x7d,0xcc,0xcc,0x7e,0x8c,0xe8,0xfb,0x8e,0xfe,0xb7,0x59,0x4e,0x87,0x86,0x4e,0x57,0xa3,0x8a,0x8a,0xa2,0x1b,0x33,0x1e,0x1e,0x33,0x9c,0x47,0x02,0xa6,0x01,0x2a,0xe8,0x7d,0x71,0x71,0x7d,0xe8,0xfe,0xd6,0xa6,0x02,0x47,0x01,0x8b,\r\n0xaa,0x56,0x4c,0x4c,0x56,0xaa,0x88,0xe0,0x39,0x39,0xe0,0x00,0x00,0x01,0x00,0x5e,0xfe,0x1e,0x03,0xf1,0x04,0x00,0x00,0x28,0x00,0x9a,0x40,0x5d,0x55,0x27,0x01,0x99,0x16,0x01,0x3a,0x16,0x4a,0x16,0x02,0x76,0x0f,0x01,0x57,0x0f,0x67,0x0f,0x02,0x66,0x02,0x01,0x54,0x02,0x01,0x77,0x25,0x01,0x99,0x1a,0x01,0x8a,0x1a,0x01,0x59,0x1a,\r\n0x69,0x1a,0x02,0x25,0x1a,0x24,0x19,0x19,0x0d,0x15,0x24,0x24,0x00,0x83,0x15,0x15,0x08,0x2a,0x1f,0x1e,0x1e,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x01,0x08,0x1a,0x1c,0x24,0x23,0x23,0x1f,0x19,0x25,0x95,0x0b,0x0a,0x18,0x0a,0x18,0x0a,0x11,0x1c,0x95,0x21,0x21,0x1e,0x95,0x1f,0x0f,0x11,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x33,0x2f,\r\n0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x39,0x11,0x33,0x2f,0x33,0x12,0x39,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,\r\n0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x10,0x21,0x23,0x35,0x01,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x25,0x15,0x01,0x16,0x17,0x16,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x86,0x57,0x5b,0xfe,0x54,0x52,0x01,0x65,0x77,0x77,0xab,0xb9,0x2b,0x93,0xcb,0xcc,0x01,0x03,0xfe,0x77,0xd2,\r\n0x74,0x7e,0x1d,0xd2,0x7d,0x76,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x54,0x57,0x8c,0x01,0x4e,0x33,0x01,0xea,0x18,0x42,0x8c,0x42,0x42,0x33,0xfd,0xe1,0x19,0x6e,0x77,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x06,0x02,0x00,0x43,0x00,0xe0,0x40,0x8f,0x56,0x43,0x66,0x43,0x02,0x85,0x3d,0x01,0x57,0x3d,0x67,0x3d,\r\n0x02,0x76,0x36,0x86,0x36,0x02,0x79,0x32,0x89,0x32,0x02,0x89,0x22,0x01,0x48,0x17,0x01,0x59,0x13,0x69,0x13,0x02,0x76,0x0f,0x86,0x0f,0x02,0x67,0x0f,0x01,0x56,0x0f,0x01,0x2d,0x2b,0x84,0x2e,0x30,0x30,0x15,0x85,0x3a,0x95,0x3a,0x02,0x3a,0x38,0x3e,0x83,0x9b,0x1f,0x01,0x79,0x1f,0x01,0x08,0x1f,0x01,0x1f,0x23,0x1d,0x1d,0x15,0x54,\r\n0x40,0x01,0x41,0x40,0x00,0x19,0x19,0x0d,0x00,0x83,0x20,0x15,0x01,0x15,0x15,0x08,0x45,0x38,0x83,0x23,0x23,0x0b,0x0d,0x84,0x0a,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2e,0x2d,0x40,0x41,0x1a,0x0b,0x0a,0x0a,0x11,0x18,0x95,0x1a,0x18,0x1f,0x01,0x3a,0x1f,0x1a,0x0f,0x2d,0x1f,0x2d,0x02,0x2d,0x1a,0x2d,0x1a,0x11,0x34,0x95,0x27,0x01,0x11,\r\n0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x10,0xed,0x11,0x39,0x2f,0x33,0x11,0x39,0x39,0x11,0x33,0x01,0x2f,0x5d,0x33,0xed,0x32,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x5d,0x11,0x33,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,\r\n0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x20,0x35,0x34,0x27,0x24,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,\r\n0x27,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x05,0x15,0x16,0x16,0x03,0xf1,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x29,0x99,0x1c,0x55,0x4e,0x68,0x88,0x55,0x5b,0xcb,0xb0,0x1d,0x17,0x01,0x4f,0xa7,0xfe,0xf2,0x2a,0xa7,0x89,0x79,0xaf,0xae,0x79,0x88,0x27,0x9d,0x1e,0x54,0x4a,0x6b,0x6c,0x4a,\r\n0x55,0xa8,0x9c,0x9c,0xa8,0xfe,0xef,0x92,0xb1,0x22,0xd2,0x7b,0x73,0x61,0x6a,0xa9,0x5c,0x53,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x50,0x8b,0x8b,0x98,0x8b,0xd9,0x5d,0x3f,0x66,0x1a,0x6a,0xc6,0xa8,0x61,0x57,0x57,0x62,0xa7,0x60,0x4f,0x37,0x37,0x45,0x67,0x39,0x32,0x32,0x39,0x67,0x98,0x4b,0x38,0x38,0x4d,0x9e,0xf3,0x36,0x04,0x0e,\r\n0xba,0x00,0x00,0x03,0x00,0x52,0xff,0xe8,0x04,0x92,0x06,0x02,0x00,0x21,0x00,0x2c,0x00,0x38,0x00,0x81,0x40,0x50,0x99,0x37,0x01,0x8a,0x37,0x01,0x85,0x31,0x01,0x8a,0x25,0x01,0x79,0x25,0x01,0x96,0x19,0x01,0x9a,0x16,0x01,0x7a,0x12,0x8a,0x12,0x02,0x9a,0x0b,0x01,0x7b,0x0b,0x01,0x7b,0x0a,0x01,0x1e,0x21,0x1c,0x01,0x1f,0x84,0x2e,\r\n0x22,0x0e,0x0e,0x09,0x3a,0x28,0x83,0x14,0x14,0x33,0x83,0x09,0x40,0x09,0x0c,0x48,0x09,0x1c,0x22,0x95,0x0f,0x1f,0x0e,0x2e,0x01,0x95,0x20,0x0e,0x0e,0x35,0x26,0x95,0x18,0x01,0x35,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x10,0xdd,0xc4,0xfd,0xc4,0x01,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,\r\n0x2f,0xc4,0xc4,0xfd,0xc4,0xc4,0xde,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x33,0x35,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0x35,0x34,0x26,0x23,0x22,0x15,0x14,0x17,\r\n0x16,0x33,0x13,0x35,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x04,0x92,0xfe,0xd4,0xcd,0xb6,0xb5,0x6b,0x71,0x81,0x74,0xb1,0xc6,0xc6,0xb1,0x74,0x81,0x71,0x6b,0xb5,0xb6,0xcd,0x01,0x2c,0xfe,0xd4,0x01,0x2c,0xfe,0x2c,0x72,0x69,0xe1,0x4c,0x45,0x65,0xc6,0xc6,0x65,0x45,0x4c,0xe1,0x69,0x3a,0x38,0x02,0x0e,0xa8,0xb5,0xc9,\r\n0x57,0x5c,0xa8,0xab,0x60,0x58,0x9e,0x58,0x60,0xab,0xa8,0x5c,0x57,0xc9,0xb5,0xa8,0x98,0x9e,0x01,0x36,0xa8,0x68,0x7f,0xc4,0x60,0x39,0x32,0xfd,0x8a,0xa8,0x32,0x39,0x60,0xc4,0x41,0x3e,0x00,0x03,0x00,0x60,0xfe,0x1e,0x07,0x48,0x06,0x02,0x00,0x31,0x00,0x3d,0x00,0x49,0x00,0xb9,0x40,0x79,0x46,0x45,0x01,0x46,0x43,0x01,0x49,0x3d,\r\n0x01,0x49,0x33,0x01,0x55,0x45,0x01,0x59,0x43,0x01,0x55,0x3d,0x01,0x5a,0x33,0x01,0x44,0x83,0x0f,0x19,0x1f,0x19,0x3f,0x19,0x03,0x19,0x12,0x32,0x83,0x00,0x00,0x10,0x00,0x30,0x00,0x03,0x00,0x06,0x38,0x38,0x2c,0x0b,0x06,0x84,0x12,0x3e,0x3e,0x24,0x1f,0x12,0x24,0x22,0x95,0x25,0x27,0x01,0x34,0x95,0x44,0x2c,0x54,0x2c,0x02,0x2c,\r\n0x2e,0x2e,0x42,0x95,0x44,0x1f,0x54,0x1f,0x02,0x1f,0x1d,0x0f,0x3c,0x95,0x79,0x06,0x01,0x6a,0x06,0x01,0x4b,0x06,0x5b,0x06,0x02,0x06,0x04,0x04,0x46,0x95,0x69,0x13,0x79,0x13,0x02,0x4b,0x13,0x5b,0x13,0x02,0x13,0x15,0x16,0x0b,0x09,0x95,0x0c,0x0e,0x1c,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x5d,0x5d,0xed,0x33,0x2f,0x33,0x5d,0x5d,\r\n0x5d,0xed,0x3f,0x33,0x5d,0xed,0x33,0x2f,0x33,0x5d,0xed,0x3f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xcc,0x33,0x2f,0x10,0xfd,0xce,0xc4,0x33,0x2f,0x10,0xdc,0x5d,0xed,0x10,0xdc,0x5d,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x15,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x27,\r\n0x26,0x35,0x35,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x11,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x16,0x07,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x20,0x01,0x34,0x27,0x26,0x23,0x20,0x11,0x10,0x21,0x32,0x37,0x36,0x07,0x48,0x7b,0x84,0xeb,0xbc,0x7a,\r\n0xac,0x3d,0x30,0x2c,0x4b,0x93,0x5d,0x5a,0x7a,0xbc,0xeb,0x84,0x7b,0x6e,0x7a,0xea,0xc6,0x88,0xac,0x3d,0x30,0x2c,0x4b,0x93,0x5d,0x5a,0x88,0xc6,0xea,0x7a,0x6e,0xa8,0xfe,0xca,0xa8,0x53,0x47,0x4a,0x55,0xa3,0x01,0x36,0xfc,0xe0,0x47,0x53,0xa8,0xfe,0xca,0x01,0x36,0xa1,0x56,0x4b,0x01,0xf0,0xe6,0x8c,0x96,0x63,0xc9,0xd9,0x1b,0x94,\r\n0x12,0x65,0x62,0x95,0xd1,0x63,0x96,0x8c,0xe6,0xdf,0x80,0x8d,0x77,0x01,0x39,0xd9,0x1b,0x94,0x12,0x65,0x62,0x95,0xfe,0xbf,0x77,0x8d,0x80,0xe5,0x01,0x68,0x6d,0x5e,0xa1,0x9e,0x63,0x73,0x01,0x74,0xa1,0x5e,0x6d,0xfe,0x98,0xfe,0x88,0x71,0x62,0x00,0x00,0x01,0x00,0x60,0xfe,0x1e,0x03,0xf1,0x04,0x18,0x00,0x2f,0x00,0xc2,0x40,0x83,\r\n0x79,0x29,0x01,0x68,0x29,0x01,0x59,0x29,0x01,0x56,0x25,0x66,0x25,0x02,0x25,0x1f,0x01,0x77,0x1e,0x01,0x35,0x1e,0x01,0x85,0x1b,0x95,0x1b,0x02,0x8a,0x17,0x9a,0x17,0x02,0x75,0x12,0x01,0x67,0x12,0x01,0x7a,0x0f,0x01,0x2a,0x0a,0x01,0x69,0x09,0x01,0x06,0x02,0x16,0x02,0x02,0x2e,0x00,0x84,0x2d,0x2b,0x2b,0x0e,0x34,0x20,0x54,0x20,\r\n0x64,0x20,0x84,0x20,0x04,0x20,0x23,0x1d,0x83,0x8b,0x0b,0x9b,0x0b,0x02,0x6d,0x0b,0x01,0x4a,0x0b,0x5a,0x0b,0x02,0x2f,0x0b,0x01,0x0b,0x08,0x20,0x0e,0x30,0x0e,0x02,0x0e,0x0e,0x31,0x23,0x83,0x08,0x14,0x84,0x15,0x15,0x0f,0x08,0x1f,0x08,0x02,0x08,0x2d,0x2e,0x2e,0x27,0x20,0x20,0x04,0x15,0x15,0x0b,0x10,0x95,0x0b,0x19,0x10,0x27,\r\n0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x39,0xed,0x11,0x39,0x2f,0x11,0x39,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x05,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x21,0x22,0x07,0x06,0x15,0x23,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x14,0x07,0x06,0x07,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x37,0x16,0x03,0xf1,0x88,0x7d,0xaa,0xcf,0x85,0x8e,0xbc,0xae,0xae,0xbc,0xfe,0xfb,0x68,0x44,\r\n0x4b,0xa6,0x7f,0x73,0xab,0xba,0x77,0x7c,0xbc,0xae,0xae,0xbc,0x5b,0x55,0x88,0x68,0x4e,0x55,0x1c,0x9a,0x28,0x6e,0xa9,0x6a,0x61,0x73,0x7b,0xd2,0xcd,0x76,0x4d,0x4e,0x58,0x85,0xf4,0x34,0x39,0x68,0xa8,0x61,0x57,0x60,0x63,0xa7,0xe0,0x72,0x4b,0x4b,0x57,0xa0,0x8b,0x50,0x4c,0x3c,0x42,0x68,0x49,0x33,0x37,0x51,0x00,0x01,0x00,0x5f,\r\n0xfe,0x1e,0x03,0xf0,0x04,0x18,0x00,0x3b,0x00,0x76,0x40,0x49,0x56,0x2a,0x66,0x2a,0x76,0x2a,0x03,0x55,0x24,0x65,0x24,0x02,0x47,0x24,0x01,0x99,0x1a,0x01,0x9a,0x19,0x01,0x76,0x0a,0x86,0x0a,0x02,0x2f,0x31,0x84,0x2c,0x12,0x17,0x84,0x11,0x0c,0x0c,0x2e,0x2c,0x2c,0x3d,0x02,0x21,0x84,0x3b,0x6b,0x21,0x01,0x3a,0x21,0x4a,0x21,0x5a,\r\n0x21,0x03,0x21,0x07,0x95,0x2e,0x2f,0x1c,0x2f,0x1c,0x2f,0x01,0x27,0x95,0x36,0x1c,0x11,0x12,0x12,0x01,0x0f,0x00,0x3f,0x33,0x2f,0x33,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x33,0x5d,0x5d,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x13,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x5f,0xa4,0x27,0x48,0x65,0x3e,0x2e,0x57,0x42,0x28,0x0c,0x07,\r\n0x09,0x0a,0x99,0x0e,0x0b,0x0a,0x10,0x39,0x68,0x91,0x57,0x2a,0x53,0x4b,0x40,0x16,0x30,0x55,0x73,0x44,0x32,0x60,0x4b,0x2e,0x1c,0x99,0x29,0x49,0x79,0x9b,0x52,0x66,0xb1,0x81,0x4a,0x04,0x00,0x85,0x45,0x80,0x63,0x3b,0x20,0x42,0x66,0x46,0x26,0x43,0x1a,0x1e,0x1a,0x37,0x22,0x28,0x22,0x59,0x33,0x5f,0x96,0x67,0x36,0x15,0x24,0x2f,\r\n0x1a,0xfd,0xbf,0x45,0x6d,0x4d,0x28,0x20,0x3c,0x55,0x35,0x4a,0x32,0x37,0x54,0x5b,0x56,0x8a,0x60,0x34,0x3d,0x74,0xa6,0x69,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x50,0x04,0x18,0x00,0x36,0x00,0x46,0x00,0x93,0x40,0x60,0x45,0x46,0x55,0x46,0x02,0x55,0x42,0x01,0x46,0x42,0x01,0x5a,0x3f,0x01,0x49,0x3f,0x01,0x59,0x39,0x01,0x4a,0x39,\r\n0x01,0x64,0x27,0x01,0x69,0x23,0x01,0x79,0x1e,0x01,0x6a,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x02,0x16,0x12,0x26,0x12,0x46,0x12,0x56,0x12,0x04,0x2f,0x32,0x84,0x1a,0x1d,0x1a,0x0b,0x10,0x83,0x0a,0x05,0x05,0x2a,0x83,0x3c,0x30,0x3c,0x01,0x1a,0x3c,0x1a,0x3c,0x48,0x44,0x83,0x0f,0x20,0x1f,0x20,0x02,0x20,0x0a,0x0b,0x37,0x95,0x1d,0x2f,\r\n0x2f,0x00,0x41,0x95,0x25,0x10,0x00,0x95,0x15,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0xce,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x32,0x3e,0x02,0x35,\r\n0x34,0x26,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x06,0x06,0x15,0x14,0x1e,0x02,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xea,0x2a,0x46,0x32,0x1c,0x06,\r\n0x04,0x04,0x06,0xa6,0x06,0x05,0x04,0x07,0x35,0x5f,0x83,0x4f,0x4f,0x82,0x5e,0x34,0x17,0x0e,0xa5,0xa7,0x46,0x83,0xbd,0x78,0x74,0xb9,0x81,0x44,0x46,0x86,0xc1,0x7c,0x0e,0x10,0x1d,0x33,0x47,0x6e,0x57,0x81,0x54,0x2a,0x2b,0x56,0x80,0x55,0x9f,0xab,0xab,0xfe,0xa8,0x1f,0x35,0x45,0x27,0x1a,0x30,0x12,0x15,0x12,0x1d,0x16,0x1a,0x16,\r\n0x3a,0x20,0x4a,0x7a,0x57,0x2f,0x2f,0x58,0x7d,0x4e,0x43,0x60,0x22,0x28,0xfa,0xc3,0x76,0xbd,0x84,0x47,0x44,0x80,0xb7,0x73,0x7c,0xc1,0x84,0x45,0x27,0x4e,0x35,0x33,0x4f,0x35,0x1b,0x02,0x06,0x35,0x62,0x8a,0x55,0x53,0x86,0x5e,0x33,0xb0,0xbe,0xc0,0xb2,0x00,0x00,0x01,0x00,0x40,0xfe,0x1e,0x04,0x96,0x04,0x18,0x00,0x33,0x00,0x93,\r\n0x40,0x60,0x35,0x27,0x45,0x27,0x55,0x27,0x95,0x27,0x04,0x3a,0x23,0x4a,0x23,0x5a,0x23,0x03,0x65,0x16,0x01,0x94,0x2f,0x01,0x86,0x2f,0x01,0x64,0x2f,0x74,0x2f,0x02,0x2f,0x2a,0x8f,0x0c,0x9f,0x0c,0x02,0x3b,0x0c,0x4b,0x0c,0x5b,0x0c,0x03,0x18,0x0c,0x01,0x0c,0x0f,0x8b,0x01,0x9b,0x01,0x02,0x19,0x01,0x39,0x01,0x02,0x01,0x00,0x00,\r\n0x1c,0x19,0x83,0x1d,0x20,0x20,0x35,0x2a,0x83,0x0f,0x09,0x09,0x0f,0x1d,0x1c,0x1c,0x0c,0x25,0x95,0x14,0x10,0x2f,0x01,0x0c,0x95,0x06,0x09,0x95,0x08,0x08,0x06,0x00,0x01,0x1c,0x00,0x3f,0x33,0xce,0x32,0x2f,0xed,0x10,0xed,0x11,0x39,0x3f,0xed,0x11,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x32,\r\n0x2f,0x33,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x12,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x07,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x26,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0x96,\r\n0x68,0x4f,0x98,0x9c,0xa4,0x5c,0xd7,0x94,0x4e,0xc0,0x6b,0xa8,0xb1,0x49,0x89,0xc5,0x7d,0x6f,0xb1,0x7b,0x42,0x0a,0x13,0x9d,0x0c,0x06,0x2b,0x52,0x77,0x4d,0x57,0x84,0x58,0x2d,0x43,0x84,0xc4,0x81,0x3a,0x65,0x5c,0x59,0xfe,0x9b,0x7d,0x3f,0x5e,0x3f,0x20,0x7e,0xa8,0x31,0x31,0x5e,0x01,0x30,0xca,0x7c,0xc7,0x8c,0x4b,0x4a,0x8a,0xc2,\r\n0x78,0x28,0x4c,0x61,0x37,0x42,0x3a,0x23,0x56,0x8f,0x66,0x38,0x3b,0x68,0x90,0x54,0x81,0xb9,0x8e,0x71,0x39,0x1a,0x39,0x3e,0x44,0x00,0x00,0x03,0x00,0x70,0xff,0xea,0x02,0xf4,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x32,0x40,0x1a,0x0c,0xaf,0x12,0x12,0x1e,0x25,0x00,0xaf,0x06,0x06,0x18,0xaf,0x1e,0x15,0xb0,0x0f,0x0f,0x03,\r\n0x21,0xb0,0x1b,0x16,0x03,0xb0,0x09,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x01,0x50,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x01,0xa4,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0xfe,0x5c,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x03,0xa8,0x2f,0x41,0x42,0x2e,0x2e,0x40,0x3f,0xfe,0x28,0x2f,0x41,0x42,0x2e,0x2e,0x40,0x3f,0xfe,0x2c,0x2f,0x41,0x42,0x2e,0x2e,0x43,0x42,0x00,0x00,0x02,0x00,0x32,\r\n0x02,0x58,0x02,0x76,0x06,0x02,0x00,0x20,0x00,0x2e,0x00,0x67,0x40,0x3f,0xd7,0x2a,0x01,0x0a,0x1c,0x01,0xea,0x1c,0xfa,0x1c,0x02,0x0a,0x06,0x01,0xeb,0x06,0xfb,0x06,0x02,0x0b,0x05,0x01,0x05,0x02,0x01,0xe5,0x02,0xf5,0x02,0x02,0x10,0x11,0x11,0x00,0x00,0x21,0x10,0x21,0x02,0x21,0x1b,0x29,0x29,0x09,0x1b,0x1b,0x1d,0x25,0x2b,0x04,\r\n0x00,0x25,0x01,0x25,0x16,0x0b,0x11,0x13,0x10,0x0e,0x0e,0x0b,0x01,0x00,0x3f,0x33,0x2f,0x33,0xcd,0x32,0x10,0xdd,0xdc,0x5d,0xdc,0xcd,0x10,0xcd,0x32,0x01,0x2f,0xcd,0x33,0x2f,0x10,0xdc,0x5d,0xcd,0x32,0x2f,0x33,0x31,0x30,0x5d,0x71,0x71,0x5d,0x71,0x5d,0x71,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x11,0x34,0x33,0x32,\r\n0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x15,0x15,0x36,0x33,0x32,0x17,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x36,0x02,0x76,0x4a,0x4f,0x8d,0x89,0x4d,0x48,0xcf,0x26,0x8d,0x20,0x31,0x45,0x2c,0x4f,0x51,0x29,0x93,0x1b,0x35,0x13,0x0d,0x52,0x63,0x8d,0x48,0x42,0x78,0x1d,\r\n0x24,0x65,0x64,0x29,0x21,0xae,0x63,0x26,0x1d,0x03,0x90,0x8a,0x54,0x5a,0x56,0x52,0x87,0x01,0xb0,0xcb,0x2a,0x2a,0x58,0x39,0x2a,0x1f,0x17,0x39,0xbc,0x48,0x55,0x4d,0x89,0x65,0x2a,0x35,0x38,0x2d,0x62,0xcb,0x3b,0x2e,0x00,0x01,0x00,0x28,0xff,0x40,0x04,0x25,0x04,0x18,0x00,0x32,0x00,0x8c,0x40,0x4f,0x96,0x23,0x01,0x1b,0x1c,0x1c,\r\n0x19,0x84,0x1e,0x03,0x00,0x84,0x04,0x07,0x07,0x1e,0x1e,0x28,0x34,0x2c,0x2b,0x2b,0x2a,0x2e,0x0c,0x0d,0x0e,0x2d,0x2d,0x0e,0x0e,0x84,0x28,0x2a,0x14,0x28,0x2a,0xa8,0x2a,0xb8,0x2a,0x02,0x19,0x2a,0x29,0x2a,0x02,0x0a,0x2a,0x01,0x2a,0x1f,0x28,0x01,0x28,0x0c,0x03,0x09,0x95,0x2e,0x31,0x10,0x2a,0x95,0x2d,0x0f,0x16,0x95,0x20,0x25,\r\n0x1c,0x1b,0x1b,0x0e,0x11,0x95,0x28,0x25,0x16,0x00,0x3f,0x33,0xed,0x32,0x33,0x2f,0x33,0x10,0xdc,0xed,0x3f,0xed,0x3f,0x33,0xfd,0xcc,0x33,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x33,0x2f,\r\n0x39,0x31,0x30,0x5d,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x0d,0xa8,0x13,0x03,0x33,0x0d,\r\n0x13,0xfe,0x54,0x7c,0x02,0x33,0x0d,0x13,0x01,0x2b,0x4a,0x30,0x40,0x50,0x72,0x7d,0x52,0x33,0x0d,0x13,0xfe,0xd4,0x4e,0x26,0x9f,0x08,0x8d,0xc7,0x1d,0x01,0x6e,0x18,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x73,0xfd,0xb6,0x09,0x1b,0x35,0x05,0x4d,0x13,0x53,0x41,0x6a,0x99,0x5b,0x57,0x2f,0x31,\r\n0x05,0x51,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0x68,0x6b,0x15,0x00,0x01,0x00,0x28,0xfe,0x1f,0x04,0x4e,0x04,0x00,0x00,0x30,0x00,0x95,0x40,0x54,0x9b,0x17,0x01,0x89,0x17,0x01,0x78,0x17,0x01,0x2f,0x30,0x02,0x00,0x00,0x84,0x30,0x1c,0x14,0x30,0x30,0x1c,0x30,0x1c,0x06,0x84,0x19,0x19,0x1c,0x1c,0x22,0x32,0x27,0x29,0x29,0x84,0x22,\r\n0x24,0x14,0x22,0x22,0x24,0x26,0x25,0x25,0x24,0xa8,0x24,0xb8,0x24,0x02,0x24,0x22,0x10,0x12,0x84,0x0f,0x0d,0x0d,0x1f,0x22,0x01,0x22,0x00,0x30,0x24,0x95,0x27,0x0f,0x2f,0x29,0x2c,0x95,0x10,0x15,0x0f,0x22,0x1c,0x02,0x1f,0x16,0x15,0x95,0x0a,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x33,0xce,0x11,0x39,0xed,0x32,0x32,0x3f,0xed,0xd4,\r\n0xc4,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x17,\r\n0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4e,0xb8,0x02,0x9c,0xb3,0x84,0xbc,0x93,0xd5,0x47,0x90,0x30,0x84,0x5a,0x65,0x56,0x75,0x9b,0xfe,0x7f,0x48,0x2c,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,\r\n0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x95,0x0a,0x0c,0x32,0xba,0x43,0xa7,0x50,0x3a,0x85,0x5f,0x52,0x4e,0x37,0x33,0x27,0x2c,0x3d,0x21,0x2d,0x55,0x2d,0xa9,0x4a,0x70,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0x00,0x01,0x00,0x28,0xfe,0x1f,0x04,0x30,0x04,0x18,0x00,0x33,0x00,0xbd,\r\n0x40,0x74,0x78,0x15,0x01,0x9a,0x11,0x01,0x89,0x11,0x01,0x30,0x2d,0x2d,0x84,0x1a,0x17,0x14,0x1a,0x1a,0x17,0xd9,0x1a,0x01,0x78,0x1a,0x01,0x1a,0x17,0x00,0x84,0x13,0x13,0x50,0x17,0x60,0x17,0x02,0x17,0x17,0x22,0x35,0x25,0x24,0x24,0x23,0x20,0x27,0x26,0x21,0x26,0x21,0x21,0x84,0x22,0x23,0x14,0x22,0x22,0x23,0xf7,0x23,0x01,0x88,\r\n0x23,0xa8,0x23,0xc8,0x23,0x03,0x79,0x23,0x01,0x47,0x23,0x57,0x23,0x02,0x23,0x22,0x0a,0x0c,0x84,0x09,0x07,0x07,0x1f,0x22,0x01,0x22,0x40,0x0c,0x10,0x48,0x22,0x20,0x1a,0x1d,0x95,0x2d,0x27,0x2a,0x10,0x23,0x95,0x26,0x0f,0x0a,0x09,0x30,0x21,0x17,0x22,0x15,0x0f,0x95,0x04,0x1c,0x00,0x3f,0xed,0x3f,0x33,0xc4,0x33,0xce,0x32,0x3f,\r\n0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x05,0x14,0x07,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x16,0x04,0x30,0xb3,0x84,0xbc,0x93,0xd5,0x47,0x90,0x30,0x84,0x5a,0x65,0x56,0x75,\r\n0x9b,0x09,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x87,0x02,0x9c,0xb0,0xa7,0x50,0x3a,0x85,0x5f,0x52,0x4e,0x37,0x33,0x27,0x2c,0x3d,0x21,0x2d,0x55,0x2c,0xa9,0x4b,0x1d,0x2c,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0xb4,0x26,\r\n0x26,0xfd,0x7d,0x0a,0x0c,0x32,0xba,0x00,0x00,0x02,0x00,0x30,0xff,0xe7,0x04,0xa7,0x06,0x04,0x00,0x39,0x00,0x48,0x00,0xe4,0x40,0x9a,0x84,0x44,0x01,0x75,0x44,0x01,0x66,0x40,0x01,0x45,0x40,0x55,0x40,0x02,0x85,0x3f,0x01,0x8b,0x3d,0x01,0x7c,0x3d,0x01,0x48,0x3d,0x68,0x3d,0x02,0x79,0x3c,0x89,0x3c,0x02,0x48,0x36,0x58,0x36,0x68,\r\n0x36,0x03,0x79,0x1e,0x89,0x1e,0x02,0x99,0x1d,0x01,0x99,0x1a,0x01,0x76,0x17,0x86,0x17,0x02,0x27,0x17,0x01,0x94,0x11,0x01,0x85,0x11,0x01,0x11,0x15,0x0c,0x0f,0x84,0x22,0x97,0x25,0x01,0x25,0x22,0x15,0x83,0x3a,0x03,0x00,0x84,0x04,0x07,0x07,0x89,0x3e,0x01,0x58,0x3e,0x78,0x3e,0x02,0x20,0x3e,0x3a,0x4f,0x22,0x5f,0x22,0x6f,0x22,\r\n0x03,0x22,0x3a,0x22,0x3a,0x1c,0x4a,0x2e,0x31,0x84,0x2d,0x00,0x2a,0x10,0x2a,0x02,0x2a,0x2a,0x42,0x83,0x0f,0x1c,0x1f,0x1c,0x5f,0x1c,0x6f,0x1c,0x04,0x1c,0x25,0x0c,0x28,0x04,0x09,0x95,0x38,0x01,0x3e,0x95,0x20,0x20,0x45,0x28,0x95,0x33,0x2d,0x00,0x45,0x95,0x19,0x16,0x00,0x3f,0xed,0x3f,0xdc,0xed,0x11,0x39,0x2f,0xed,0x3f,0xfd,\r\n0xce,0x12,0x39,0x39,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x5d,0x33,0xed,0x32,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x32,0x2f,0x33,0xed,0x32,0x10,0xed,0x11,0x33,0x5d,0x10,0xed,0x32,0x11,0x39,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x07,\r\n0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x0f,0x02,0x06,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x10,0x07,0x06,0x21,0x22,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x37,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x37,0x33,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x33,0x32,0x01,0x34,0x27,0x26,0x27,0x06,0x07,0x06,0x15,0x14,0x16,\r\n0x33,0x32,0x37,0x36,0x04,0xa7,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xaa,0x28,0x02,0x53,0x7c,0x1d,0x53,0x9e,0xa6,0xfe,0xf7,0xbd,0xde,0x90,0x93,0xfd,0x1d,0x09,0x15,0x9b,0x44,0x30,0x9f,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0x01,0xf7,0x44,0x30,0x9f,0xfe,0xc9,0x36,0x20,0x53,0xfe,0x84,0x6d,0x89,0x74,0xb9,0x77,0x6b,0x05,\r\n0x50,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x35,0xc3,0x0a,0x0c,0x3c,0x42,0x63,0x25,0x66,0x95,0xfe,0xf7,0xb5,0xc0,0xc9,0xad,0xf8,0xb0,0xb4,0x2e,0x2f,0x38,0x19,0x30,0x71,0x30,0x15,0xb4,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x9c,0x15,0xfc,0x5c,0x5e,0x48,0x2b,0x41,0x1b,0xa8,0x8b,0xbf,0x6d,0x85,0xa3,0x91,0x00,0x00,0x01,\r\n0x00,0x28,0xfe,0x25,0x04,0x25,0x04,0x18,0x00,0x21,0x00,0x90,0x40,0x57,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0xb8,0x10,0xc8,0x10,0x02,0x10,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x18,0x23,0x1b,0x1a,0x1a,0x19,0x16,0x1d,0x1c,0x17,0x1c,0x17,0x17,0x84,0x18,0x19,0x14,0x18,0x19,0xf7,0x19,0x01,0x88,0x19,0xa8,0x19,0xc8,\r\n0x19,0x03,0x79,0x19,0x01,0x57,0x19,0x01,0x19,0x1f,0x18,0x01,0x18,0x40,0x0c,0x10,0x48,0x18,0x16,0x10,0x13,0x95,0x1d,0x01,0x20,0x10,0x19,0x95,0x1c,0x0f,0x17,0x0d,0x04,0x18,0x15,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0xc4,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x2b,0x5d,0x33,0x5d,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,\r\n0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,\r\n0x08,0x87,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x88,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x7e,0x5a,0x45,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x40,0x63,0x02,0xa4,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x00,0x01,\r\n0x00,0x28,0xfe,0x25,0x06,0xc0,0x04,0x18,0x00,0x30,0x00,0xb5,0x40,0x69,0x25,0x24,0x24,0x23,0x20,0x27,0x26,0x21,0x26,0x21,0x21,0x84,0x22,0x23,0x14,0x22,0x23,0xc8,0x23,0x01,0x86,0x23,0x01,0x57,0x23,0x77,0x23,0x02,0x23,0x5f,0x22,0x8f,0x22,0xbf,0x22,0x03,0x22,0x17,0x2c,0x0e,0x0c,0x0c,0x84,0x1a,0x17,0x14,0x1a,0x1a,0x17,0xa8,\r\n0x1a,0xc8,0x1a,0x02,0x1a,0x17,0x12,0x84,0x13,0x13,0x17,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0xb8,0x06,0x01,0x06,0x04,0x17,0x0c,0x06,0x09,0x95,0x2c,0x01,0x2f,0x2f,0x20,0x1a,0x1d,0x95,0x27,0x2a,0x10,0x23,0x95,0x26,0x0f,0x03,0x04,0x21,0x17,0x0e,0x22,0x15,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x33,0xc4,0xd4,0xc4,0x3f,\r\n0xed,0x3f,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x32,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x33,0x18,0x10,0xdc,0x5d,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x31,\r\n0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x06,0xc0,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0d,0x13,0xfe,0x56,0x86,0x13,\r\n0x01,0x14,0xa4,0x14,0x01,0x14,0x88,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x84,0x17,0x01,0x8c,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfd,0x81,0x5a,0x45,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x40,0x63,0x02,0xa4,0x0f,0x0e,0x35,\r\n0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x86,0x71,0x15,0x00,0x00,0x02,0xff,0x3f,0xff,0xe7,0x04,0x25,0x06,0x04,0x00,0x2d,0x00,0x3f,0x00,0xa4,0x40,0x5e,0x87,0x04,0x01,0x76,0x04,0x01,0x64,0x04,0x01,0x53,0x04,0x01,0x03,0x01,0x01,0x84,0x3f,0x3d,0x14,0x3f,0x3f,0x3d,0x08,0x3f,0x18,0x3f,0x02,0x3f,0x3d,0x3d,0x0b,0x41,\r\n0x1b,0x1d,0x84,0x18,0x34,0x33,0x29,0x28,0x27,0x35,0x27,0x35,0x35,0x84,0x0b,0x0e,0x14,0x0b,0x0b,0x0e,0x1a,0x18,0x18,0x0e,0x39,0x0e,0x01,0x2a,0x0e,0x01,0x0e,0x1f,0x0b,0x01,0x0b,0x3f,0x33,0x30,0x95,0x29,0x01,0x2c,0x10,0x0e,0x11,0x95,0x27,0x24,0x01,0x16,0x95,0x1f,0x1b,0x00,0x3d,0x35,0x38,0x95,0x0b,0x03,0x08,0x16,0x00,0x3f,\r\n0x33,0x33,0xed,0x32,0x32,0x3f,0xde,0xed,0x3f,0x33,0xed,0x32,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x01,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,\r\n0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,\r\n0x13,0x36,0x04,0x25,0x08,0x6c,0x1f,0xae,0xfe,0x8a,0x53,0x21,0x9f,0x08,0xec,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x51,0x01,0x75,0x4a,0x2a,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfe,0x03,0x94,\r\n0x2c,0x5f,0x15,0xb4,0x27,0x25,0x04,0x4a,0x10,0x0d,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x27,0x25,0xfe,0x8b,0x6a,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x02,0x00,0x5b,0xff,0xa7,0x06,0xc3,0x04,0x58,0x00,0x3a,0x00,0x4c,0x00,0xf0,0x40,0x85,\r\n0x88,0x2c,0x98,0x2c,0x02,0x87,0x1c,0x01,0x76,0x1b,0x86,0x1b,0x96,0x1b,0x03,0x97,0x07,0x01,0x1d,0x1c,0x1c,0x18,0x16,0x36,0x01,0x07,0x36,0x01,0x36,0x16,0x49,0x4a,0x4b,0x4c,0x18,0x16,0x16,0x84,0x4c,0x20,0x14,0x4c,0x4c,0x20,0x4c,0x20,0x40,0x41,0x42,0x31,0x31,0x42,0x42,0x84,0x26,0x29,0x14,0x26,0x26,0x29,0x2e,0x2d,0x2d,0x29,\r\n0x29,0x5f,0x26,0x01,0x26,0x20,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x50,0x0d,0x01,0x0d,0x20,0x4c,0x40,0x29,0x3d,0x95,0x34,0x16,0x10,0x13,0x95,0x36,0x01,0x39,0x39,0x34,0x2d,0x2e,0x2e,0x31,0x34,0x10,0x49,0x42,0x45,0x95,0x23,0x0d,0x08,0x04,0x09,0x09,0x96,0x1c,0x01,0x1c,0x1d,0x1d,0x23,0x26,\r\n0x26,0x20,0x18,0x23,0x16,0x00,0x3f,0x33,0x33,0x33,0x2f,0x11,0x33,0x2f,0x33,0x5d,0x33,0x2f,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x3f,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x10,0xcc,0x5d,0x32,0x11,\r\n0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0xc4,0x05,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,\r\n0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x05,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xc3,0x08,0x81,0x04,\r\n0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0xfe,0x53,0x80,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x84,0x17,0x01,0x8f,0x4b,0x29,0x9f,0xfc,0xbb,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,\r\n0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,0x0f,0x35,0x05,0x73,0xfd,0x9f,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x22,0x39,0x62,0x15,0xb4,0x27,0x25,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x85,0x70,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,\r\n0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x01,0x00,0x28,0x00,0x00,0x03,0xa4,0x04,0x00,0x00,0x1f,0x00,0x52,0x40,0x2f,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0xd8,0x06,0x01,0x06,0x00,0x04,0x01,0x04,0x04,0x21,0x15,0x17,0x84,0x14,0x13,0x12,0x10,0x0e,0x95,0x0f,0x19,0x1f,0x19,0x02,0x19,0x06,0x09,0x95,0x01,0x1e,\r\n0x12,0x95,0x15,0x0f,0x03,0x04,0x15,0x00,0x3f,0xc4,0x3f,0xed,0xde,0x32,0xed,0x32,0xdc,0x5d,0xed,0x01,0x2f,0x33,0xce,0x32,0xed,0x32,0x12,0x39,0x2f,0x5d,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x23,0x37,0x21,0x06,0x15,\r\n0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x03,0xa4,0x08,0x8a,0xa3,0x8e,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x02,0xc7,0x1d,0x01,0x6e,0x1f,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x02,0xec,0x25,0x27,0xfd,0x60,0x02,0xc3,0x0f,0x0e,0x2b,0x05,0x34,0x15,0x96,0x12,0x10,0x8b,0x78,0x15,0x28,0x05,0x31,0x15,0x00,0x00,0x02,0x00,0x59,\r\n0xfe,0x25,0x04,0x25,0x05,0xec,0x00,0x27,0x00,0x37,0x00,0x95,0x40,0x4e,0x36,0x35,0x0f,0x0e,0x0d,0x04,0x01,0x01,0x84,0x37,0x0d,0x14,0x37,0x37,0x0d,0x37,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x15,0x39,0x2e,0x2d,0x23,0x22,0x21,0x2f,0x21,0x2f,0x2f,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x84,0x1c,0x1c,0x18,0x87,0x18,0x01,0x18,\r\n0x1f,0x15,0x01,0x15,0x37,0x2d,0x2a,0x95,0x23,0x21,0x18,0x01,0x26,0x10,0x1c,0x00,0x35,0x2f,0x32,0x95,0x15,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0xed,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,\r\n0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,\r\n0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x04,0x25,0x09,0x99,0x13,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x03,0xfe,0x89,0x4a,0x2a,0x9f,0x09,0x99,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x54,0x7c,\r\n0x03,0x33,0x0d,0x13,0x01,0xac,0x7c,0x03,0x03,0x64,0x22,0x2a,0xfd,0x3b,0x58,0x59,0x09,0x1d,0xfe,0xa9,0x01,0x50,0x16,0x0e,0x35,0x85,0x14,0x6b,0x15,0xb4,0x22,0x2a,0x02,0xc5,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0xc0,0x35,0x05,0x73,0xfd,0xaf,0x0e,0x0f,0x35,0x05,0x73,0x02,0x51,0x0e,0x00,\r\n0x00,0x02,0x00,0x31,0xff,0xa7,0x06,0xbe,0x04,0x58,0x00,0x30,0x00,0x42,0x00,0xd9,0x40,0x7c,0x79,0x22,0x01,0x87,0x07,0x01,0x76,0x07,0x01,0x24,0x23,0x23,0x1f,0x27,0x1b,0x1c,0x1c,0x84,0x1d,0x1f,0x14,0x1d,0x1f,0x7a,0x1f,0x8a,0x1f,0x9a,0x1f,0x03,0x1f,0x1d,0x12,0x07,0x2c,0x17,0x2c,0x02,0x2c,0x36,0x38,0x38,0x84,0x12,0x15,0x14,\r\n0x12,0x12,0x15,0x15,0x12,0x09,0x08,0x08,0x04,0x41,0x40,0x3f,0x0c,0x42,0x0c,0x97,0x04,0x01,0x04,0x01,0x01,0x84,0x42,0x0c,0x14,0x42,0x42,0x0c,0x42,0x0c,0x12,0x42,0x36,0x33,0x95,0x2c,0x01,0x2f,0x2f,0x2a,0x9a,0x23,0x01,0x8b,0x23,0x01,0x23,0x24,0x24,0x1b,0x15,0x18,0x95,0x27,0x1f,0x2a,0x10,0x1c,0x1d,0x15,0x3f,0x38,0x3b,0x95,\r\n0x0f,0x85,0x08,0x95,0x08,0x02,0x08,0x09,0x09,0x12,0x0c,0x04,0x0f,0x16,0x00,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x5d,0x10,0xed,0x32,0x32,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x10,0x87,0xc4,0x0e,\r\n0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x5d,0x18,0x10,0xdc,0x32,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,\r\n0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xbe,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x80,0x02,0x33,\r\n0x0d,0x13,0xfe,0x57,0xa6,0xab,0xb5,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x83,0x18,0x01,0x8a,0x4b,0x29,0x9f,0xa7,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,0x3a,0x62,0x15,0xb4,0x27,0x25,0x02,0x54,\r\n0x09,0x14,0x35,0x05,0x72,0xfc,0xea,0x03,0x4b,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x83,0x6e,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x00,0x02,0x00,0x30,0xff,0xe7,0x05,0x4c,0x06,0x04,0x00,0x30,0x00,0x3d,0x00,0xcc,0x40,0x7d,0x56,0x3c,0x01,0x95,0x38,0x01,\r\n0x87,0x38,0x01,0x89,0x35,0x01,0x95,0x0e,0x01,0x46,0x0e,0x56,0x0e,0x02,0x8a,0x07,0x01,0x21,0x23,0x84,0x20,0x1e,0x1e,0x14,0x00,0x01,0x01,0x2d,0x31,0x12,0x13,0x14,0x3d,0x14,0x2e,0x2f,0x05,0x06,0x2d,0x06,0x2d,0x2d,0x84,0x14,0x3d,0x14,0x14,0x14,0x3d,0x14,0x3d,0x3d,0x3f,0x37,0x83,0x0c,0x1c,0x95,0x0f,0x25,0x1f,0x25,0x02,0x25,\r\n0x14,0x17,0x95,0x2d,0x2a,0x01,0x20,0x00,0x05,0x31,0x33,0x54,0x00,0x64,0x00,0x02,0x45,0x00,0x01,0x16,0x00,0x26,0x00,0x36,0x00,0x03,0x07,0x00,0x01,0x66,0x2f,0x01,0x12,0x2f,0x00,0x03,0x10,0x01,0x01,0x33,0x95,0x20,0x10,0x01,0x10,0x10,0x47,0x3d,0x01,0x3d,0x39,0x95,0x06,0x0a,0x16,0x00,0x3f,0x33,0xed,0x32,0x5d,0x3f,0x5d,0xed,\r\n0x32,0x2f,0x12,0x17,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x12,0x39,0x39,0x3f,0x3f,0x33,0xed,0x32,0xdc,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x01,0x07,0x26,0x27,0x26,0x27,0x03,0x06,0x07,0x06,0x23,0x20,0x11,0x10,0x37,0x36,0x21,0x32,0x17,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x16,0x05,0x26,0x23,0x20,0x07,0x06,0x15,0x14,0x33,0x32,0x37,\r\n0x36,0x37,0x05,0x4c,0x25,0x1c,0x20,0x4d,0x51,0x7e,0x21,0xc3,0x98,0xa8,0xfe,0x85,0xee,0xf7,0x01,0x75,0x27,0x1b,0x3c,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x3b,0x83,0xfe,0xc0,0x1f,0x1a,0xfe,0xe3,0xc8,0xbb,0xee,0x59,0x73,0x8d,0x10,0x03,0x9b,0xa2,0x15,0x12,0x2d,0x1b,\r\n0xfd,0xb3,0x9c,0x55,0x43,0x01,0x7a,0x01,0x1f,0xc9,0xd0,0x02,0x01,0x1a,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x27,0x25,0xfe,0xee,0x23,0x4f,0x03,0xaf,0xa4,0xcc,0xfb,0x2d,0x36,0x4c,0x00,0x01,0x00,0x31,0x00,0x00,0x04,0x8d,0x06,0x04,0x00,0x33,0x00,0x9e,0x40,0x59,0x03,0x00,0x84,0x06,\r\n0x18,0x15,0x15,0x84,0x24,0x21,0x14,0x24,0x24,0x21,0x04,0x06,0x06,0x24,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x00,0x21,0x01,0x21,0x21,0x2c,0x35,0x2a,0x0f,0x0e,0x2b,0x0e,0x2b,0x2b,0x84,0x2c,0x2d,0x14,0x2c,0x2d,0x08,0x2d,0x01,0x2d,0x2c,0x2f,0x03,0x01,0x03,0x03,0x12,0x19,0x0e,0x01,0x0e,0x09,0x95,0x77,0x2d,0x01,0x26,0x2d,0x01,0x19,\r\n0x2d,0x01,0x2d,0x32,0x01,0x21,0x27,0x18,0x12,0x1d,0x2b,0x2c,0x15,0x2a,0x24,0x27,0x95,0x15,0x0f,0x12,0x10,0x00,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xc4,0xc4,0x11,0x39,0x11,0x39,0x3f,0x33,0x5d,0x5d,0x5d,0xed,0x32,0x5d,0x11,0x39,0x2f,0x5d,0x01,0x2f,0x33,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x12,0x01,0x39,0x18,\r\n0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x07,0x03,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x07,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,\r\n0x22,0x07,0x05,0x03,0x23,0x01,0x36,0x37,0x25,0x36,0x33,0x32,0x04,0x8d,0x08,0x0e,0xa8,0x14,0x03,0x33,0x0d,0x13,0xfe,0x89,0x37,0x0a,0x3e,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x27,0x13,0x03,0x12,0xa4,0x12,0x03,0x14,0x28,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0x01,0x06,0x1f,0xae,0x01,0x76,0x53,0x21,0x9f,0x05,0x50,0x27,0x25,0x41,\r\n0x64,0x0f,0x0e,0x35,0x05,0x63,0x0f,0x32,0xfe,0xc9,0x6a,0x15,0xb4,0x2a,0x22,0xa7,0x51,0x44,0x30,0x3d,0xfe,0x91,0x01,0x6f,0x3d,0x2d,0x34,0x65,0xc9,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x04,0xd0,0x94,0x2c,0x5f,0x15,0x00,0x01,0x00,0x5b,0xff,0xa7,0x06,0xea,0x04,0x58,0x00,0x35,0x00,0xba,0x40,0x67,0x96,0x05,0x01,0x07,0x87,0x06,\r\n0x01,0x06,0x06,0x96,0x02,0x01,0x87,0x02,0x01,0x02,0x00,0x00,0x84,0x35,0x34,0x14,0x35,0x35,0x34,0x35,0x0a,0x50,0x34,0x01,0x34,0x2a,0x2c,0x2e,0x2e,0x84,0x2a,0x2b,0x14,0x2a,0x2a,0x2b,0x2b,0x2a,0x21,0x24,0x24,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x1c,0x1c,0x18,0x99,0x18,0x01,0x08,0x18,0x01,0x18,0x5f,0x15,0x01,0x15,0x0f,\r\n0x2a,0x00,0x35,0x2b,0x1c,0x1d,0x1d,0x2c,0x21,0x18,0x2b,0x0f,0x34,0x2e,0x31,0x95,0x0d,0x2a,0x24,0x27,0x95,0x15,0x0f,0x12,0x12,0x0d,0x06,0x07,0x07,0x0a,0x02,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x3f,0x33,0x33,0xc4,0x33,0x2f,0x33,0x10,0xd4,0xc4,0x01,0x2f,\r\n0x33,0xcc,0x5d,0x32,0x5d,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xcc,0x5d,0x32,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x5d,0x32,0x18,0x2f,0x5d,0x33,0x31,0x30,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,\r\n0x22,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x06,0xea,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x82,0x4b,0x29,0x84,0x17,0xfe,0x71,0x4b,0x29,0x9f,0x08,0x81,0x04,\r\n0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0xa7,0xac,0x03,0x33,0x0d,0x13,0x01,0xa9,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x85,0x70,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,\r\n0x03,0x16,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x00,0x01,0x00,0x28,0xff,0xa7,0x05,0xa2,0x04,0x18,0x00,0x36,0x00,0x8e,0x40,0x4e,0x86,0x05,0x01,0x07,0x06,0x06,0x02,0x00,0x00,0x84,0x36,0x35,0x14,0x36,0x36,0x35,0x36,0x0a,0x35,0x35,0x10,0x38,0x20,0x22,0x84,0x1d,0xa7,0x2c,0x01,0x2c,0x2f,0x2f,0x84,0x10,0x13,0x14,\r\n0x10,0x10,0x13,0x1f,0x1d,0x1d,0x13,0xd8,0x13,0x01,0x13,0x10,0x00,0x36,0x0f,0x1b,0x95,0x24,0x13,0x16,0x95,0x2c,0x29,0x10,0x1f,0x0f,0x35,0x2f,0x32,0x95,0x0d,0x94,0x06,0x01,0x06,0x07,0x07,0x10,0x0a,0x02,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x5d,0x10,0xed,0x32,0x32,0x3f,0x3f,0x33,0xed,0x32,0xdc,0xed,0x3f,0xc4,\r\n0x01,0x2f,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,\r\n0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x05,0xa2,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x86,0x4a,0x30,0x9f,0x08,0x81,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,\r\n0x23,0x96,0x08,0x81,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x26,0x26,0x02,0x5e,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x26,0x26,0xfd,0xa2,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x01,0x00,0x28,0xfe,0x25,\r\n0x05,0xa2,0x04,0x18,0x00,0x39,0x00,0x88,0x40,0x48,0x0c,0x0d,0x38,0x39,0x02,0x00,0x00,0x84,0x39,0x0b,0x14,0x39,0x39,0x0b,0x39,0x0b,0x06,0x84,0x07,0x07,0x0b,0x0b,0x13,0x3b,0x23,0x25,0x84,0x20,0x2f,0x32,0x32,0x84,0x13,0x16,0x14,0x13,0x13,0x16,0x22,0x20,0x20,0x16,0x16,0x13,0x00,0x39,0x0f,0x1e,0x95,0x27,0x16,0x19,0x95,0x2c,\r\n0x2f,0x2c,0x22,0x22,0x2c,0x10,0x38,0x32,0x35,0x95,0x13,0x0d,0x0b,0x02,0x10,0x16,0x07,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0x2f,0x11,0x33,0x10,0xed,0x32,0xdc,0xed,0x3f,0xc4,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x11,0x12,0x39,0x2f,0x33,0x2f,\r\n0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x15,0x14,\r\n0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x05,0xa2,0xc3,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x05,0xfe,0x85,0x4a,0x30,0x9f,0x08,0x81,0x03,0x2c,0x0e,0x12,0xbe,0x4d,0x2c,0x90,0x08,0xa3,0x04,0x29,0x0d,0x13,0xbd,0x51,0x23,0x96,0x08,0x81,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0x53,0x52,0x5f,0x09,0x1d,0xfe,\r\n0xa9,0x01,0x4e,0x18,0x0e,0x61,0x59,0x14,0x6b,0x15,0xb4,0x26,0x26,0x02,0x5e,0x0e,0x0f,0x2b,0x05,0x34,0x15,0x96,0x21,0x22,0x15,0x0e,0x28,0x05,0x31,0x15,0xaa,0x26,0x26,0xfd,0xa2,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x01,0x00,0x59,0xff,0xa7,0x06,0xbc,0x05,0xec,0x00,0x3b,0x00,0xc6,0x40,0x6e,0x96,0x07,0x01,0x31,0x84,0x30,\r\n0x30,0x19,0x2a,0x2b,0x2c,0x18,0x2c,0x16,0x37,0x36,0x35,0x17,0x35,0x17,0x17,0x84,0x18,0x2c,0x14,0x18,0x18,0x2c,0x57,0x2c,0x01,0x2c,0x18,0x22,0x24,0x24,0x84,0x1f,0x21,0x14,0x1f,0x21,0x38,0x21,0x01,0x09,0x21,0x01,0x21,0x6f,0x1f,0x01,0x1f,0x18,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x28,0x10,0x01,\r\n0x10,0x20,0x0d,0x50,0x0d,0x02,0x0d,0x18,0x16,0x10,0x13,0x95,0x37,0x35,0x2c,0x01,0x3a,0x10,0x31,0x30,0x00,0x22,0x21,0x0f,0x2a,0x24,0x27,0x95,0x1f,0x19,0x1c,0x16,0x0d,0x08,0x04,0x09,0x09,0x17,0x18,0x15,0x00,0x3f,0xc4,0x33,0x2f,0x33,0x33,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xc4,0x3f,0xc4,0x3f,0x33,0x33,0x33,0x33,0xed,\r\n0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x10,0xdc,0x5d,0x32,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x01,0x33,0x18,0x2f,0xed,0x31,0x30,0x5d,0x01,0x14,\r\n0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x06,0xbc,0x08,0x81,0x04,0x15,\r\n0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0xfe,0x54,0xa8,0xa6,0x16,0xfe,0x8e,0x4a,0x2a,0x9f,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0e,0x12,0x01,0xa7,0x98,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,\r\n0x0f,0x35,0x05,0x73,0xfc,0xeb,0x65,0x69,0x15,0xb4,0x26,0x26,0x03,0x19,0xfc,0xc4,0x0f,0x0e,0x35,0x05,0x72,0x02,0xc3,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x00,0x01,0x00,0x59,0xff,0xa7,0x04,0x4c,0x05,0xec,0x00,0x26,0x00,0x7d,0x40,0x45,0x07,0x06,0x06,0x02,0x00,0x00,0x84,0x26,0x25,0x14,\r\n0x26,0x26,0x25,0x18,0x26,0x01,0x26,0x0a,0x25,0x25,0x10,0x28,0x1c,0x1f,0x1f,0x84,0x10,0x13,0x14,0x10,0x10,0x13,0x18,0x84,0x17,0x17,0x13,0x08,0x13,0x28,0x13,0x38,0x13,0x03,0x13,0x1f,0x10,0x01,0x10,0x1c,0x13,0x00,0x26,0x0f,0x17,0x00,0x25,0x1f,0x22,0x95,0x0d,0x06,0x02,0x07,0x07,0x10,0x0a,0x0d,0x16,0x00,0x3f,0x33,0x33,0x33,\r\n0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x3f,0x3f,0xc4,0x33,0x33,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0xed,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,\r\n0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4c,0xb2,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0xfe,0x86,0x4a,0x30,0x9f,0x08,0x97,0x14,0x01,0x14,0xa4,0x14,0x01,0x14,0x9c,0x03,0x33,0x13,0x13,0x01,0xa8,0xa5,0x04,0x00,0xfc,0xb4,0x18,0x04,0x17,0x0f,\r\n0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x26,0x26,0x02,0xc5,0x5e,0x53,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x5b,0x5f,0xfd,0x18,0x0e,0x0f,0x35,0x05,0x72,0x03,0x17,0x00,0x00,0x02,0x00,0x42,0xfe,0x1f,0x04,0x25,0x04,0x58,0x00,0x27,0x00,0x39,0x00,0xab,0x40,0x64,0x86,0x0e,0x01,0x75,0x0e,0x01,0x88,0x04,0x01,0x03,0x01,0x01,\r\n0x84,0x39,0x37,0x14,0x39,0x39,0x37,0x18,0x39,0x01,0x09,0x39,0x01,0x39,0x37,0x12,0x13,0x13,0x37,0x37,0x18,0x3b,0x23,0x0a,0x2d,0x2f,0x2f,0x84,0x18,0x1b,0x14,0x18,0x18,0x1b,0x20,0x1f,0x1f,0x1b,0x09,0x1b,0x01,0x1b,0x1f,0x18,0x3f,0x18,0x02,0x18,0x39,0x2d,0x2a,0x95,0x26,0x1f,0x1b,0x20,0x20,0x23,0x01,0x26,0x10,0x5a,0x13,0x6a,\r\n0x13,0x9a,0x13,0x03,0x13,0x15,0x12,0x12,0x10,0x95,0x15,0x1c,0x37,0x2f,0x32,0x95,0x18,0x0a,0x79,0x03,0x01,0x03,0x08,0x16,0x00,0x3f,0x33,0x5d,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,0x33,0x33,0x33,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,\r\n0x10,0xc4,0x01,0x33,0x32,0x11,0x12,0x39,0x18,0x2f,0x33,0x2f,0x33,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,\r\n0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x04,0x25,0x08,0x6c,0x1f,0xae,0xfe,0x8a,0x53,0x21,0x08,0x0b,0x02,0x5a,0x53,0xb6,0xcd,0xb2,0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x9f,0xa7,0x33,0x0d,0x13,\r\n0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfe,0x03,0x94,0x2c,0x5f,0x15,0x01,0x18,0x08,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x85,0x9a,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x25,0x3f,0x6b,0x15,0xc0,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0x20,\r\n0x0f,0x00,0x00,0x01,0x00,0x5b,0xfe,0x25,0x06,0xea,0x05,0xec,0x00,0x42,0x00,0xb9,0x40,0x64,0x31,0x33,0x33,0x84,0x2f,0x30,0x14,0x2f,0x2f,0x30,0x30,0x2f,0x26,0x29,0x29,0x84,0x1a,0x1d,0x14,0x1a,0x1a,0x1d,0x22,0x21,0x21,0x1d,0x1d,0x5f,0x1a,0x8f,0x1a,0x02,0x1a,0x2f,0x40,0x84,0x3f,0x3f,0x0e,0x0f,0x39,0x3a,0x3b,0x04,0x01,0x01,\r\n0x84,0x3b,0x0d,0x14,0x3b,0x3b,0x0d,0x68,0x3b,0x01,0x3b,0x0d,0x08,0x84,0x09,0x09,0x60,0x0d,0x01,0x0d,0x14,0x2f,0x3f,0x00,0x26,0x21,0x1d,0x22,0x22,0x3b,0x31,0x01,0x30,0x0f,0x39,0x33,0x36,0x95,0x12,0x2f,0x29,0x2c,0x95,0x1a,0x14,0x17,0x17,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,\r\n0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x3f,0x33,0xc4,0x33,0x33,0x2f,0x33,0x33,0x33,0x3f,0x01,0x2f,0x33,0xcc,0x5d,0x32,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x01,0x33,0x18,0x2f,0xed,0x10,0xcc,0x5d,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,\r\n0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x33,0x03,0x06,0x15,0x14,0x33,\r\n0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x06,0xea,0x13,0xb2,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x14,0x05,0xfe,0x83,0x4a,0x2a,0x84,0x17,0xfe,0x71,0x4b,0x29,0x9f,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0xa7,0xac,0x03,0x33,0x0d,0x13,0x01,0xa9,0x96,0x14,0x01,0x14,\r\n0xa4,0x14,0x01,0x04,0x66,0x5f,0x5b,0xfc,0xa7,0x52,0x5f,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x19,0x0e,0x61,0x59,0x14,0x6b,0x15,0x85,0x70,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x72,0x02,0xc3,0x5e,0x53,0x14,\r\n0x12,0x01,0x69,0xfe,0x97,0x12,0x00,0x03,0x00,0x5b,0xfe,0x25,0x06,0xbe,0x04,0x58,0x00,0x32,0x00,0x3e,0x00,0x50,0x01,0x06,0x40,0x94,0x25,0x2e,0x01,0x06,0x2e,0x16,0x2e,0x02,0x2e,0x38,0x18,0x4d,0x4e,0x4f,0x50,0x17,0x50,0x0d,0x38,0x0e,0x38,0x0e,0x0e,0x84,0x17,0x50,0x14,0x17,0x17,0x50,0x50,0x17,0x16,0x29,0x26,0x29,0x02,0x07,\r\n0x29,0x01,0x29,0x44,0x46,0x46,0x84,0x1e,0x21,0x14,0x1e,0x1e,0x21,0x26,0x25,0x25,0x21,0x21,0x1e,0x17,0x12,0x84,0x13,0x13,0x17,0x09,0x08,0x08,0x04,0x3b,0x3c,0x3d,0x3e,0x04,0x01,0x01,0x84,0x3e,0x0c,0x14,0x3e,0x3e,0x0c,0x3e,0x20,0x0c,0x50,0x0c,0x02,0x0c,0x17,0x50,0x44,0x41,0x95,0x2c,0x3e,0x38,0x35,0x95,0x2e,0x01,0x31,0x31,\r\n0x2c,0x25,0x21,0x26,0x26,0x29,0x2c,0x10,0x4d,0x46,0x39,0x49,0x95,0x1b,0x7b,0x3b,0x01,0x3b,0xa9,0x0c,0x01,0x9a,0x0c,0x01,0x7b,0x0c,0x8b,0x0c,0x02,0x0c,0x96,0x08,0x01,0x08,0x04,0x09,0x09,0x1e,0x18,0x17,0x0e,0x0d,0x1b,0x16,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,0x5d,0x33,0x5d,0x5d,0x5d,0x33,\r\n0x5d,0x10,0xed,0x32,0x32,0x32,0x3f,0x33,0x33,0x2f,0x33,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x32,0x01,0x2f,0xcd,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0xc4,0x05,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x2f,0xed,0x10,0xcc,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,\r\n0x01,0x32,0x5d,0x5d,0x11,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0x10,0x87,0x0e,0xc4,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,\r\n0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x07,0x34,0x23,0x22,0x07,0x05,0x03,0x25,0x36,0x37,0x13,0x36,0x25,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x36,0x06,0xbe,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfd,0xf4,0x03,0x01,0x0c,0xa4,\r\n0x0c,0x01,0x17,0xfe,0x81,0x50,0x24,0x9f,0x08,0x83,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7e,0x4b,0x29,0x85,0x16,0x01,0x8a,0x4e,0x26,0x9f,0xa7,0x33,0x0e,0x12,0xfe,0x58,0x8c,0x01,0xd5,0x36,0x0b,0x6e,0x03,0xfd,0x67,0x33,0x0d,0x13,0xfe,0x57,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x6e,0x03,0x03,0x64,0x26,0x26,0xfd,\r\n0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,0x3a,0x77,0x29,0x1c,0x09,0x1d,0xfe,0xa9,0x01,0x39,0x1a,0x21,0x5d,0x6b,0x65,0x15,0xb4,0x27,0x25,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0x7f,0x6a,0x15,0xc0,0x35,0x05,0x73,0xfd,0x58,0x6d,0x0d,0x34,0x02,0x20,0x0f,0x0e,0x35,0x05,0x72,0xfd,0xae,0x0e,0x0f,\r\n0x35,0x05,0x63,0x0e,0x33,0x02,0x20,0x0f,0x00,0x01,0x00,0x71,0xfe,0x25,0x04,0x75,0x05,0xec,0x00,0x39,0x00,0xb1,0x40,0x63,0x30,0x84,0x2f,0x2f,0x2b,0x21,0x1e,0x84,0x22,0x2f,0x25,0x01,0x25,0x25,0x2b,0x03,0x00,0x84,0x04,0x7f,0x07,0x01,0x07,0x07,0x34,0x2a,0x19,0x18,0x17,0x2b,0x17,0x0d,0x0c,0x35,0x34,0x0e,0x34,0x0e,0x0e,0x84,\r\n0x17,0x2b,0x14,0x17,0x17,0x2b,0x89,0x2b,0x01,0xf8,0x2b,0x01,0x99,0x2b,0x01,0x85,0x2b,0x01,0x66,0x2b,0x01,0x08,0x2b,0x01,0x2b,0x17,0x12,0x84,0x13,0x13,0x17,0x2a,0x35,0x38,0x27,0x95,0x0c,0x19,0x09,0x1c,0x1c,0x03,0x09,0x95,0x38,0x34,0x2b,0x38,0x22,0x22,0x38,0x10,0x2f,0x00,0x0e,0x17,0x15,0x13,0x1b,0x00,0x3f,0x3f,0x33,0x3f,\r\n0x3f,0x33,0x2f,0x11,0x33,0x33,0x10,0xfd,0xcc,0x32,0x2f,0x12,0x39,0x39,0xed,0x11,0x39,0x39,0x01,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x5d,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0x33,0xed,\r\n0x32,0x11,0x33,0x2f,0xed,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x37,0x33,0x07,0x06,0x15,0x14,0x33,0x32,0x37,0x37,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x37,0x36,0x33,\r\n0x32,0x04,0x75,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xad,0x9f,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x13,0x92,0x9b,0x44,0x30,0x9f,0x08,0x0d,0xa8,0x13,0x03,0x33,0x10,0x10,0xd0,0x15,0x01,0x14,0xa4,0x14,0x01,0x0a,0x78,0x44,0x30,0x9f,0x03,0x64,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x36,0xfd,0x01,0x52,0x5f,0x09,0x1d,0xfe,0xa9,\r\n0x01,0x4d,0x19,0x0e,0x5d,0x5d,0x02,0xc9,0x30,0x15,0xb4,0x24,0x28,0x41,0x64,0x10,0x0d,0x35,0x05,0x41,0x67,0x4e,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x44,0x44,0x25,0x15,0x00,0x01,0x00,0x28,0xff,0xa7,0x04,0x25,0x04,0x18,0x00,0x21,0x00,0x84,0x40,0x4a,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,\r\n0x0d,0x0d,0x18,0x23,0x1b,0x1a,0x1a,0x19,0x16,0x1d,0x1c,0x17,0x1c,0x17,0x17,0x84,0x18,0x19,0x14,0x18,0x19,0x88,0x19,0x01,0x79,0x19,0x01,0x18,0x19,0x01,0x19,0x1f,0x18,0x3f,0x18,0x02,0x18,0x16,0x10,0x13,0x95,0x1d,0x01,0x20,0x10,0x19,0x95,0x1c,0x0f,0x0d,0x96,0x08,0x01,0x08,0x04,0x09,0x09,0x17,0x18,0x15,0x00,0x3f,0xc4,0x33,\r\n0x2f,0x33,0x33,0x5d,0x33,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,\r\n0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x0a,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0xa6,0xab,0xbe,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,\r\n0x85,0x5c,0x28,0x4d,0x0c,0x31,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,0xfc,0xea,0x03,0x75,0x8b,0x67,0x6a,0x15,0x00,0x00,0x01,0x00,0x28,0xfe,0x25,0x04,0x4e,0x04,0x00,0x00,0x21,0x00,0x7e,0x40,0x45,0x20,0x0d,0x0c,0x0b,0x00,0x02,0x02,0x84,0x0b,0x21,0x14,0x0b,0x0b,0x21,0xa8,0x21,0x01,0x21,0x0b,0x06,0x84,0x07,0x07,0x0b,0x0b,0x13,\r\n0x23,0x18,0x1a,0x1a,0x84,0x13,0x15,0x14,0x13,0x13,0x15,0x17,0x16,0x16,0x15,0xa9,0x15,0xb9,0x15,0x02,0x15,0x1f,0x13,0x01,0x13,0x00,0x21,0x15,0x95,0x18,0x0f,0x20,0x1a,0x1d,0x95,0x13,0x0d,0x0b,0x02,0x10,0x16,0x07,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,\r\n0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x31,0x30,0x01,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,\r\n0x32,0x37,0x25,0x13,0x04,0x4e,0xc5,0x11,0x01,0x0c,0xa4,0x0c,0x01,0x10,0x06,0xfe,0x84,0x48,0x2c,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x53,0x51,0x60,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x19,0x0e,0x73,0x47,0x19,0x70,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,0x0f,0x35,\r\n0x05,0x73,0x03,0x16,0x00,0x01,0x00,0x5b,0xfe,0x1f,0x04,0x4e,0x04,0x00,0x00,0x2c,0x00,0x8e,0x40,0x52,0x75,0x12,0x85,0x12,0x02,0x85,0x11,0x01,0x76,0x11,0x01,0x98,0x0c,0x01,0x95,0x08,0x01,0x95,0x07,0x01,0x2b,0x1a,0x02,0x00,0x00,0x84,0x2c,0x1a,0x14,0x2c,0x2c,0x1a,0x2c,0x1a,0x06,0x84,0x17,0x17,0x1a,0x1a,0x20,0x2e,0x23,0x25,\r\n0x25,0x84,0x20,0x22,0x14,0x20,0x20,0x22,0x22,0x20,0x0f,0x84,0x0e,0x0e,0x1f,0x20,0x01,0x20,0x00,0x2c,0x23,0x22,0x0f,0x2b,0x25,0x28,0x95,0x0e,0x0f,0x20,0x1a,0x02,0x1d,0x16,0x13,0x95,0x0a,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x33,0x33,0xce,0x32,0xed,0x32,0x32,0x3f,0xc4,0xd4,0xc4,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,\r\n0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x26,0x35,0x05,0x06,0x23,0x22,0x35,\r\n0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x04,0x4e,0xb8,0x02,0x1a,0x9f,0x77,0xb5,0x9a,0x6f,0x61,0x12,0x9d,0x08,0x41,0x4c,0x67,0x5d,0x4a,0x61,0x19,0xfe,0x7f,0x48,0x2c,0x9f,0x08,0xa8,0xa8,0xae,0x03,0x33,0x0d,0x13,0x01,0xad,0xa6,0x04,0x00,0xfc,0x95,0x0a,0x0c,0x32,0xb0,0x43,0xae,0x51,0x3c,0x60,0x54,\r\n0x6c,0x19,0x39,0x36,0x40,0x23,0x2f,0x5b,0x2d,0x9f,0x4a,0x70,0x15,0xb4,0x26,0x26,0x03,0x19,0xfc,0xc4,0x0e,0x0f,0x35,0x05,0x73,0x03,0x16,0x00,0x00,0x01,0x00,0x2f,0xfe,0x25,0x04,0x25,0x05,0xec,0x00,0x33,0x00,0x97,0x40,0x52,0x96,0x07,0x01,0x09,0x08,0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x0d,0x0d,0x21,\r\n0x35,0x29,0x84,0x28,0x28,0x24,0x17,0x16,0x2f,0x2e,0x2d,0x18,0x2d,0x18,0x18,0x84,0x21,0x24,0x14,0x21,0x21,0x24,0xe6,0x24,0x01,0xd7,0x24,0x01,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x1f,0x21,0x3f,0x21,0x02,0x21,0x16,0x10,0x13,0x95,0x2f,0x2d,0x24,0x01,0x32,0x10,0x28,0x00,0x0d,0x08,0x04,0x09,0x09,0x18,0x21,0x15,0x1d,0x1b,0x00,0x3f,\r\n0x3f,0x33,0x33,0x2f,0x33,0x33,0x33,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x11,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x31,0x30,\r\n0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,\r\n0x86,0x03,0x33,0x0d,0x13,0xfe,0x54,0x97,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x14,0xb8,0x13,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1b,0x22,0x02,0x86,0x0e,0x0f,0x35,0x05,0x73,0xfd,0x3e,0x62,0x4f,0x09,0x1d,0xfe,0xa9,0x01,0x4b,0x18,\r\n0x11,0x5d,0x5d,0x03,0x59,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x00,0x01,0x00,0x42,0xfe,0x1f,0x04,0x25,0x04,0x58,0x00,0x34,0x00,0xa5,0x40,0x5f,0x9a,0x23,0x01,0x76,0x1b,0x86,0x1b,0x02,0x95,0x07,0x01,0x77,0x07,0x87,0x07,0x02,0x1f,0x20,0x20,0x50,0x20,0x60,0x20,0x03,0x20,0x20,0x09,0x08,\r\n0x08,0x04,0x01,0x01,0x84,0x10,0x0d,0x14,0x10,0x10,0x0d,0x10,0x0d,0x0d,0x25,0x36,0x2d,0x2c,0x2c,0x28,0x30,0x16,0x18,0x18,0x84,0x25,0x28,0x14,0x25,0x28,0x28,0x1f,0x25,0x01,0x25,0x2c,0x28,0x2d,0x2d,0x16,0x10,0x13,0x95,0x30,0x01,0x33,0x10,0x9a,0x20,0x01,0x20,0x22,0x1f,0x1f,0x1d,0x95,0x22,0x1c,0x08,0x09,0x09,0x25,0x18,0x0d,\r\n0x04,0x0a,0x15,0x00,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x01,0x2f,0x5d,0x33,0x87,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x11,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x32,0x2f,0x5d,\r\n0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x04,0x25,0x08,0x81,\r\n0x04,0x15,0x63,0x53,0x90,0x3f,0x0a,0x83,0x03,0x33,0x0d,0x13,0xfe,0x57,0x7a,0x23,0x5a,0x53,0xb6,0xcd,0xb2,0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x83,0x05,0x15,0x63,0x53,0x90,0x37,0x06,0x01,0x7f,0x4b,0x29,0x9f,0x03,0x64,0x26,0x26,0xfd,0x9c,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x0c,0x31,0x02,0x86,0x0f,0x0e,0x35,0x05,0x72,\r\n0xfd,0xba,0xa7,0x61,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x85,0x9a,0x02,0x64,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x23,0x41,0x6b,0x15,0x00,0x00,0x02,0x00,0x59,0xff,0xe7,0x06,0xbc,0x05,0xec,0x00,0x2a,0x00,0x36,0x00,0xb6,0x40,0x64,0x20,0x84,0x1f,0x1f,0x1b,0x1a,0x2b,0x36,0x0f,0x0e,0x1b,0x0e,0x0c,0x26,0x25,0x24,0x0d,0x24,\r\n0x0d,0x0d,0x84,0x0e,0x1b,0x14,0x0e,0x0e,0x1b,0x88,0x1b,0x01,0x79,0x1b,0x01,0x1b,0x0e,0x2d,0x30,0x30,0x84,0x15,0x18,0x14,0x15,0x18,0x78,0x18,0x01,0x69,0x18,0x01,0x08,0x18,0x01,0x18,0x15,0x0e,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0x06,0x04,0x0e,0x2d,0x2b,0x95,0x24,0x1b,0x18,0x1a,0x1a,0x0c,0x06,0x09,0x95,0x26,\r\n0x01,0x29,0x10,0x1f,0x00,0x36,0x30,0x33,0x95,0x15,0x0f,0x12,0x16,0x03,0x04,0x0d,0x0e,0x15,0x00,0x3f,0xc4,0xd4,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x33,0xed,0x32,0x01,0x2f,0xcc,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xdc,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,\r\n0x10,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x10,0x87,0xc4,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x31,0x30,0x01,0x14,0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x37,0x25,0x36,0x35,0x34,\r\n0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x05,0x05,0x06,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x06,0xbc,0x08,0xa5,0xa7,0xaa,0x03,0x33,0x0d,0x13,0xfe,0x54,0xa8,0xa6,0x16,0xfe,0x8e,0x4a,0x2a,0x9f,0x08,0x69,0x20,0xad,0x02,0x0b,0x03,0x01,0x14,0xa4,0x14,0x01,0x14,0x03,0x01,0x77,0x4a,0x2a,0x9f,\r\n0xfc,0xd0,0xfe,0x23,0x37,0x0a,0x6b,0x03,0x33,0x0e,0x12,0x01,0xa7,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfc,0xeb,0x65,0x69,0x15,0xb4,0x27,0x25,0x01,0xeb,0x94,0x2c,0x86,0x23,0x22,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x35,0x85,0x14,0x6b,0x15,0x87,0x7e,0x0e,0x33,0xfd,0xf2,0x0f,0x0e,0x35,0x05,\r\n0x72,0x00,0x00,0x01,0x00,0x3f,0xfe,0x25,0x06,0xc0,0x04,0x58,0x00,0x35,0x00,0xae,0x40,0x61,0x29,0x28,0x28,0x24,0x15,0x2c,0x01,0x06,0x2c,0x01,0x2c,0x16,0x18,0x18,0x84,0x21,0x24,0x14,0x21,0x21,0x24,0x24,0x21,0x1c,0x84,0x1d,0x1d,0x5f,0x21,0x01,0x21,0x0e,0x06,0x31,0x16,0x31,0x02,0x31,0x0d,0x0c,0x0c,0x84,0x10,0x0e,0x14,0x10,\r\n0x10,0x0e,0x10,0x0e,0x03,0x01,0x01,0x84,0x06,0x04,0x14,0x06,0x06,0x04,0x06,0x50,0x04,0x80,0x04,0x02,0x04,0x0e,0x0c,0x06,0x09,0x95,0x31,0x01,0x34,0x34,0x2f,0x28,0x24,0x29,0x29,0x16,0x10,0x13,0x95,0x2c,0x2f,0x10,0x1d,0x1b,0x03,0x04,0x21,0x18,0x0d,0x0e,0x15,0x00,0x3f,0xc4,0x33,0x33,0xd4,0xc4,0x3f,0x3f,0x33,0xed,0x32,0x32,\r\n0x33,0x2f,0x33,0x33,0x11,0x33,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x33,0x5d,0x18,0x10,0xcc,0x5d,0x32,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x5d,0x5d,0x11,0x33,0x18,0x2f,0x33,0x31,0x30,0x01,0x14,\r\n0x07,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x17,0x25,0x36,0x33,0x32,0x06,0xc0,0x08,0xa5,0xa3,0xa6,0x03,0x33,0x0d,0x13,0xfe,0x56,\r\n0xa5,0xa3,0xa7,0x03,0x33,0x0d,0x13,0xfe,0x57,0x87,0x18,0x01,0x14,0xa4,0x14,0x01,0x14,0x93,0x05,0x15,0x63,0x53,0x90,0x37,0x06,0x01,0x7f,0x4b,0x29,0x84,0x17,0x01,0x8c,0x4a,0x2a,0x9f,0x03,0x64,0x26,0x26,0xfc,0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfc,0xeb,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x72,0xfd,0x80,0x72,0x2d,0x37,0x14,\r\n0xfe,0x79,0x01,0x87,0x14,0x34,0x45,0x5e,0x02,0xb4,0x18,0x04,0x17,0x0f,0x46,0x85,0x5c,0x23,0x41,0x6b,0x15,0x86,0x71,0x15,0x00,0x01,0x00,0x21,0xfe,0x1f,0x04,0x80,0x04,0x18,0x00,0x44,0x00,0xd9,0x40,0x84,0x97,0x44,0x01,0x7a,0x2c,0x01,0x69,0x2c,0x01,0x9a,0x28,0x01,0x96,0x24,0x01,0x77,0x24,0x87,0x24,0x02,0x46,0x17,0x56,0x17,\r\n0x02,0x85,0x13,0x01,0x36,0x28,0x01,0x01,0x00,0x00,0x42,0x84,0x04,0x3d,0x84,0x09,0x09,0x04,0x04,0x15,0x83,0x2a,0x2a,0x33,0x46,0x36,0x35,0x35,0x34,0x0f,0x0e,0x38,0x37,0x32,0x67,0x32,0x77,0x32,0x02,0x37,0x32,0x32,0x84,0x33,0x34,0x14,0x33,0x33,0x34,0x47,0x34,0x77,0x34,0x97,0x34,0x03,0x34,0x33,0x20,0x22,0x84,0x1f,0x1d,0x1d,\r\n0x4f,0x33,0x5f,0x33,0x02,0x33,0x20,0x1f,0x0f,0x11,0x32,0x33,0x33,0x26,0x2e,0x95,0x00,0x01,0x09,0x01,0x19,0x01,0x29,0x01,0x03,0x11,0x01,0x11,0x01,0x26,0x0e,0x0b,0x95,0x38,0x3b,0x10,0x34,0x95,0x37,0x0f,0x26,0x95,0x19,0x1c,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0xed,0x11,0x39,\r\n0x2f,0xc4,0x12,0x39,0xce,0x32,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x87,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x33,0x2f,0x33,0x2f,0xed,0x10,0xed,0x32,0x2f,0x33,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,\r\n0x07,0x27,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x36,0x33,0x32,0x17,0x16,0x15,0x10,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x06,0x07,0x23,0x13,0x23,0x37,0x21,0x07,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x07,\r\n0x06,0x15,0x14,0x17,0x04,0x80,0x53,0x90,0x3f,0x0a,0x13,0x03,0x33,0x0d,0x13,0xfe,0x57,0x5e,0x81,0xca,0xcd,0x74,0x62,0xb8,0x9a,0xf1,0xc7,0x78,0x6f,0x3b,0x90,0x24,0x4b,0x52,0x87,0x8e,0x6b,0x87,0x40,0x4e,0x8c,0x64,0x5f,0x70,0x2d,0xab,0xa8,0xc7,0x1d,0x01,0x6e,0x16,0x01,0x75,0x4a,0x2a,0x9f,0x08,0x11,0x04,0x15,0x02,0x47,0x85,\r\n0x5c,0x28,0x4d,0x06,0x37,0x6b,0x10,0x0d,0x35,0x05,0x72,0xfe,0x3f,0x4a,0x7b,0x69,0x8f,0xfe,0xf2,0x8a,0x75,0x50,0x4b,0x71,0x53,0x52,0x37,0x38,0x27,0x3c,0x29,0x2c,0x52,0x69,0xc4,0x56,0x43,0x54,0x2a,0x31,0x56,0x03,0x11,0x8b,0x67,0x6a,0x15,0xb4,0x28,0x24,0x49,0x11,0x0b,0x17,0x0f,0x00,0x00,0x01,0x00,0x42,0xfe,0x1f,0x04,0x2e,\r\n0x04,0x58,0x00,0x30,0x00,0xbb,0x40,0x6b,0x18,0x25,0x01,0x99,0x2c,0x01,0x88,0x2c,0x01,0x9a,0x0f,0x01,0x77,0x0a,0x87,0x0a,0x02,0x2e,0x2d,0x2d,0x29,0x0e,0x0f,0x0f,0x04,0x01,0x01,0x84,0x29,0x26,0x14,0x29,0x29,0x26,0x18,0x29,0x01,0x09,0x29,0x01,0x29,0x26,0x26,0x14,0x32,0x1c,0x1b,0x1b,0x17,0x21,0x22,0x23,0x24,0x06,0x20,0x20,\r\n0x06,0x06,0x84,0x14,0x17,0x14,0x14,0x17,0x17,0x1f,0x14,0x01,0x14,0x2d,0x2e,0x2e,0x1b,0x1c,0x1c,0x29,0x20,0x17,0x01,0x1d,0x0f,0x7a,0x0f,0x01,0x5b,0x0f,0x6b,0x0f,0x02,0x0f,0x11,0x0e,0x0e,0x0c,0x95,0x11,0x1c,0x26,0x24,0x95,0x14,0x79,0x04,0x01,0x04,0x06,0x16,0x00,0x3f,0x33,0x5d,0x33,0xed,0x32,0x3f,0xed,0x32,0x2f,0x12,0x39,\r\n0x5d,0x5d,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x01,0x2f,0x5d,0x33,0x87,0x2b,0x7d,0x10,0xc4,0x87,0xc4,0x0e,0xc4,0xc4,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x5d,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x32,0x18,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x01,\r\n0x5d,0x01,0x14,0x07,0x03,0x06,0x07,0x05,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x07,0x06,0x23,0x20,0x11,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x07,0x25,0x36,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x04,0x2e,0x06,0x73,0x1f,0xae,0xfd,0xfe,0x01,0x5a,0x53,0xb6,0xcd,0xb2,\r\n0x23,0xb1,0xbd,0xfe,0x0c,0x21,0x84,0x03,0x15,0x63,0x53,0x90,0x3f,0x07,0x85,0x0c,0x07,0x01,0xdb,0x37,0x0a,0x70,0x03,0x15,0x63,0x53,0x90,0x3f,0x03,0x87,0x20,0x1d,0xfd,0xdc,0x95,0x2b,0x7f,0x12,0x0d,0x9e,0x44,0x3f,0x4c,0xa3,0x31,0x01,0xa9,0x86,0x99,0x02,0x64,0x10,0x0c,0x17,0x0f,0x46,0x85,0x5c,0x28,0x4d,0x1c,0x21,0xfd,0x86,\r\n0x38,0x2d,0x7a,0x0e,0x33,0x02,0x25,0x0f,0x0d,0x17,0x0f,0x46,0x85,0x5c,0x28,0x00,0x00,0x02,0xff,0x8a,0xfe,0x25,0x04,0x5a,0x04,0xb5,0x00,0x15,0x00,0x18,0x00,0x95,0x40,0x5d,0x27,0x01,0x01,0x06,0x05,0x18,0x16,0x08,0x17,0x02,0x09,0x16,0x08,0x0a,0x03,0x04,0x00,0x05,0x0a,0x03,0x01,0x00,0x05,0x17,0x02,0x16,0x05,0x00,0x05,0x84,\r\n0x08,0x16,0x14,0x08,0x08,0x16,0x17,0x03,0x0a,0x03,0x84,0x02,0x17,0x14,0x02,0x02,0x17,0x00,0x00,0x0f,0x02,0x4f,0x02,0x6f,0x02,0x7f,0x02,0xbf,0x02,0x05,0x02,0x02,0x08,0x1a,0x10,0x12,0x84,0x0f,0x0d,0x0d,0x0a,0x0a,0x07,0x0f,0x08,0x01,0x08,0x00,0x15,0x17,0x0a,0x16,0x95,0x10,0x15,0x0f,0x07,0x1b,0x08,0x05,0x03,0x02,0x15,0x00,\r\n0x3f,0xc4,0x33,0x33,0x3f,0x3f,0xce,0xfd,0xc4,0xc4,0x12,0x39,0x01,0x2f,0x5d,0x33,0x33,0x2f,0x33,0x2f,0x33,0xed,0x32,0x11,0x12,0x39,0x2f,0x5d,0x33,0x2f,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x87,0x18,0x10,0x2b,0x87,0x7d,0xc4,0x0f,0x0f,0x0f,0x0f,0x11,0x01,0x33,0x31,0x30,0x5d,0x01,0x01,0x13,0x23,0x03,0x00,0x03,0x23,0x12,0x01,0x03,\r\n0x23,0x22,0x37,0x36,0x37,0x33,0x06,0x15,0x14,0x33,0x21,0x05,0x21,0x17,0x04,0x5a,0xfe,0x68,0xe6,0xb5,0xa5,0xfe,0x8d,0x8e,0xc3,0xc9,0x01,0xb5,0xaa,0x86,0x96,0x06,0x02,0x1d,0xa7,0x1f,0x29,0x03,0x42,0xfe,0xf5,0xfe,0xc4,0x6b,0x03,0xd1,0xfe,0x24,0xfe,0x0b,0x01,0x67,0xfe,0x2f,0xfe,0x8f,0x01,0xcd,0x02,0x0d,0x01,0x75,0x94,0x2f,\r\n0x7e,0x78,0x15,0x28,0x8c,0xea,0x00,0x01,0x00,0x31,0xff,0xa7,0x06,0xe6,0x04,0x58,0x00,0x37,0x00,0xb7,0x40,0x65,0x89,0x20,0x01,0x97,0x05,0x01,0x22,0x70,0x21,0x01,0x21,0x21,0x1d,0x25,0x19,0x1a,0x1a,0x84,0x1b,0x1d,0x14,0x1b,0x1d,0x89,0x1d,0x01,0x1d,0x1b,0x10,0x2b,0x2e,0x2e,0x84,0x10,0x13,0x14,0x10,0x10,0x13,0x13,0x10,0x07,\r\n0x06,0x06,0x02,0x36,0x35,0x0a,0x02,0x00,0x00,0x84,0x37,0x0a,0x14,0x37,0x37,0x0a,0x37,0x20,0x0a,0x01,0x0a,0x10,0x00,0x37,0x0f,0x21,0x1d,0x22,0x22,0x19,0x13,0x16,0x95,0x2b,0x25,0x28,0x10,0x1a,0x1b,0x15,0x29,0x35,0x01,0x35,0x2e,0x31,0x95,0x0d,0x06,0x02,0x07,0x07,0x10,0x28,0x0a,0x01,0x0a,0x0d,0x16,0x00,0x3f,0x33,0x5d,0x33,\r\n0x33,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x5d,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0x33,0x3f,0xc4,0x01,0x2f,0xcc,0x5d,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0x33,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xdc,0x32,0x5d,0x87,0x2b,0x7d,0x10,0xc4,0x01,\r\n0x32,0x11,0x33,0x18,0x2f,0x5d,0x33,0x31,0x30,0x5d,0x5d,0x01,0x03,0x06,0x15,0x14,0x17,0x17,0x07,0x27,0x26,0x27,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x03,0x23,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x17,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,\r\n0x36,0x37,0x13,0x06,0xe6,0xb1,0x04,0x15,0x63,0x53,0x90,0x34,0x09,0xfe,0x7e,0x53,0x21,0x9f,0x08,0x7f,0x03,0x33,0x0e,0x13,0xfe,0x58,0xa6,0xab,0xb5,0x05,0x15,0x63,0x53,0x90,0x38,0x06,0x01,0x7d,0x4b,0x2a,0x9f,0x0a,0x7d,0x03,0x33,0x0d,0x13,0x01,0x77,0x37,0x0a,0x94,0x04,0x00,0xfc,0xb4,0x13,0x09,0x17,0x0f,0x46,0x85,0x5c,0x21,\r\n0x3a,0x62,0x15,0xb4,0x26,0x26,0x02,0x54,0x0e,0x0f,0x35,0x05,0x72,0xfc,0xea,0x03,0x4b,0x17,0x05,0x17,0x0f,0x46,0x85,0x5c,0x24,0x40,0x6b,0x15,0xb4,0x1e,0x30,0xfd,0xae,0x0e,0x0f,0x35,0x05,0x63,0x0e,0x33,0x02,0xe5,0x00,0x01,0x00,0x2f,0xfe,0x25,0x04,0xbe,0x05,0xec,0x00,0x2d,0x00,0x77,0x40,0x40,0x00,0x01,0x37,0x29,0x97,0x29,\r\n0x02,0x29,0x2b,0x84,0x06,0x04,0x04,0x15,0x2f,0x1d,0x84,0x1c,0x1c,0x18,0x22,0x23,0x0a,0x0b,0x0c,0x21,0x21,0x0c,0x0c,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x69,0x18,0x01,0x18,0x15,0x10,0x84,0x11,0x11,0x15,0x02,0x95,0x2d,0x0a,0x07,0x95,0x23,0x21,0x18,0x26,0x10,0x1c,0x00,0x0c,0x15,0x15,0x11,0x1b,0x00,0x3f,0x3f,0x33,0x3f,0x3f,\r\n0x33,0x33,0x33,0xed,0x32,0xdc,0xed,0x01,0x2f,0x33,0x2f,0xed,0x11,0x33,0x5d,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xfd,0x32,0x5d,0xcc,0x32,0x31,0x30,0x01,0x07,0x23,0x22,0x27,0x27,0x26,0x23,0x22,0x07,0x05,0x03,0x06,0x15,0x14,0x17,0x13,\r\n0x23,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x15,0x14,0x07,0x07,0x25,0x36,0x33,0x32,0x17,0x16,0x17,0x17,0x16,0x33,0x04,0xbe,0x1d,0xd3,0x60,0x22,0x38,0x0d,0x2a,0x10,0x10,0xfe,0xc5,0x9a,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x14,0xb8,0x13,0x01,0x14,0xa4,0x14,0x01,0x0f,0x03,0x01,0x04,0x42,0x32,0x4c,\r\n0x27,0x19,0x17,0x32,0x08,0x19,0x02,0x7f,0x8b,0x87,0xde,0x34,0x05,0x63,0xfd,0x2e,0x62,0x4f,0x09,0x1d,0xfe,0xa9,0x01,0x4d,0x18,0x0f,0x5d,0x5d,0x03,0x59,0x58,0x59,0x14,0x12,0x01,0x69,0xfe,0x97,0x12,0x0b,0x3e,0x64,0x14,0x53,0x15,0x36,0x23,0x5a,0xc7,0x1f,0x00,0x01,0x00,0x35,0xff,0xe7,0x03,0xfe,0x04,0x00,0x00,0x1b,0x00,0x58,\r\n0x40,0x35,0x89,0x0b,0x01,0x95,0x08,0x01,0x28,0x05,0x01,0x95,0x02,0x01,0x37,0x02,0x01,0x24,0x02,0x01,0x00,0x83,0x20,0x0d,0x01,0x0d,0x0d,0x1d,0x15,0x17,0x84,0x12,0x07,0x06,0x06,0x14,0x12,0x0f,0x95,0x1a,0x15,0x0f,0x08,0x06,0x18,0x06,0x02,0x06,0x04,0x07,0x07,0x09,0x95,0x04,0x16,0x00,0x3f,0xed,0x32,0x2f,0x12,0x39,0x5d,0x3f,\r\n0xde,0xed,0x01,0x2f,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x10,0x07,0x06,0x21,0x22,0x27,0x37,0x16,0x33,0x32,0x37,0x36,0x35,0x34,0x23,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x33,0x21,0x20,0x03,0xfe,0x9c,0xa5,0xfe,0xe9,0xe9,0x88,0x65,0x81,0x9a,0xbf,\r\n0x77,0x6b,0xbb,0xfe,0xc8,0x90,0x0e,0xa3,0x0a,0x29,0x01,0x2c,0x01,0x2f,0x02,0x41,0xfe,0xfe,0xa7,0xb1,0x8b,0x7f,0x7e,0x91,0x84,0xb5,0xde,0x94,0x1e,0x33,0x25,0x0c,0x28,0x00,0x00,0x01,0x00,0x46,0xfe,0x29,0x04,0x3c,0x05,0xec,0x00,0x33,0x00,0x94,0x40,0x4e,0x9a,0x1b,0x01,0x31,0x84,0x30,0x30,0x2c,0x2b,0x2a,0x0f,0x0e,0x0d,0x04,\r\n0x01,0x01,0x84,0x2c,0x0d,0x14,0x2c,0x2c,0x0d,0x2c,0x0d,0x08,0x84,0x09,0x09,0x0d,0x0d,0x15,0x35,0x21,0x24,0x24,0x84,0x15,0x18,0x14,0x15,0x15,0x18,0x1d,0x1c,0x1c,0x18,0x08,0x18,0x01,0x18,0x1f,0x15,0x01,0x15,0x30,0x00,0x1c,0x1d,0x1d,0x2c,0x21,0x18,0x01,0x1e,0x0f,0x2a,0x24,0x27,0x95,0x15,0x0f,0x0d,0x04,0x12,0x16,0x09,0x1b,\r\n0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0x33,0x33,0x33,0x33,0x2f,0x33,0x3f,0x01,0x2f,0x5d,0x33,0x5d,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x11,0x12,0x01,0x39,0x18,0x2f,0x33,0x2f,0xed,0x11,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x10,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x11,0x01,0x33,0x18,0x2f,\r\n0xed,0x31,0x30,0x5d,0x01,0x14,0x07,0x03,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x37,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x35,0x34,0x27,0x27,0x37,0x17,0x16,0x15,0x14,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x13,0x36,0x35,0x34,0x27,0x03,0x33,0x13,0x16,0x04,0x3c,0x14,0xb8,0x13,0x01,0x10,0xa4,\r\n0x10,0x01,0x14,0x03,0xfe,0x89,0x4a,0x2a,0x9f,0x08,0x81,0x04,0x15,0x63,0x53,0x90,0x3f,0x07,0x86,0x03,0x33,0x0d,0x13,0x01,0xac,0x97,0x15,0x01,0x0c,0xa4,0x0c,0x01,0x04,0x66,0x5d,0x5d,0xfc,0xa7,0x58,0x59,0x11,0x15,0xfe,0xad,0x01,0x53,0x15,0x08,0x35,0x85,0x14,0x6b,0x15,0xb4,0x26,0x26,0x02,0x64,0x13,0x09,0x17,0x0f,0x46,0x85,\r\n0x5c,0x28,0x4d,0x1b,0x22,0xfd,0x7a,0x0e,0x0f,0x35,0x05,0x73,0x02,0xc2,0x62,0x4f,0x08,0x1e,0x01,0x69,0xfe,0x97,0x1e,0x00,0x00,0x01,0x00,0x28,0xfe,0x25,0x04,0x4e,0x04,0x00,0x00,0x27,0x00,0x6f,0x40,0x3c,0x02,0x00,0x00,0x84,0x27,0x25,0x14,0x27,0x27,0x25,0x27,0x25,0x0f,0x1c,0x1e,0x1e,0x84,0x17,0x19,0x14,0x17,0x17,0x19,0x1b,\r\n0x1a,0x1a,0x19,0x19,0x17,0x0f,0x0b,0x84,0x0c,0x0c,0x06,0x08,0x84,0x11,0x0f,0x00,0x27,0x19,0x95,0x1c,0x0f,0x67,0x25,0x01,0x25,0x1e,0x21,0x95,0x17,0x11,0x06,0x02,0x14,0x16,0x0c,0x1b,0x00,0x3f,0x3f,0x33,0x33,0x33,0x33,0xed,0x32,0x32,0x5d,0x3f,0xed,0xd4,0xc4,0x01,0x2f,0x33,0xed,0x32,0x33,0x2f,0xed,0x10,0xcc,0x32,0x11,0x33,\r\n0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xcd,0x32,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x31,0x30,0x01,0x03,0x06,0x07,0x06,0x07,0x07,0x06,0x15,0x14,0x17,0x13,0x23,0x03,0x26,0x35,0x34,0x37,0x07,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x23,0x37,0x21,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x13,0x04,0x4e,0x99,\r\n0x14,0x42,0x27,0x50,0x7e,0x06,0x01,0x14,0xa4,0x14,0x01,0x01,0x53,0x4b,0x29,0x9f,0x08,0x8c,0xc7,0x1d,0x01,0x6e,0xae,0x03,0x33,0x0f,0x11,0x01,0x7b,0x37,0x0a,0x96,0x04,0x00,0xfd,0x26,0x5d,0x31,0x1c,0x16,0x23,0x28,0x24,0x37,0x14,0xfe,0x79,0x01,0x87,0x14,0x34,0x0d,0x12,0x17,0x15,0xb4,0x27,0x25,0x02,0x8e,0x8b,0xfc,0xc4,0x0e,\r\n0x0f,0x35,0x05,0x6e,0x10,0x31,0x02,0xda,0x00,0x02,0x00,0x59,0xff,0xe7,0x07,0x24,0x06,0x04,0x00,0x35,0x00,0x43,0x00,0xcc,0x40,0x71,0x43,0x36,0x2e,0x2f,0x30,0x42,0x30,0x0e,0x0f,0x20,0x21,0x22,0x0d,0x86,0x22,0x01,0x65,0x22,0x01,0x0d,0x22,0x22,0x84,0x42,0x30,0x14,0x42,0x42,0x30,0x3a,0x30,0x01,0x08,0x30,0x18,0x30,0x02,0x30,\r\n0x42,0x38,0x3b,0x3b,0x84,0x29,0x2c,0x14,0x29,0x2c,0x78,0x2c,0x01,0x6a,0x2c,0x01,0x08,0x2c,0x01,0x2c,0x29,0x42,0x03,0x00,0x84,0x07,0x17,0x15,0x15,0x84,0x1a,0x18,0x14,0x1a,0x1a,0x18,0x04,0x07,0x07,0x1a,0x1a,0x18,0x42,0x0d,0x09,0x95,0x30,0x34,0x01,0x42,0x3b,0x3e,0x95,0x29,0x22,0x26,0x16,0x17,0x18,0x15,0x38,0x36,0x95,0x2c,\r\n0x2e,0x2e,0x20,0x1a,0x1d,0x95,0x15,0x0f,0x03,0x12,0x10,0x00,0x3f,0xce,0x33,0x33,0xed,0x32,0x32,0x33,0x2f,0x33,0xed,0x32,0x3f,0xc4,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0x33,0xed,0x32,0x01,0x2f,0xcc,0x32,0x11,0x33,0x2f,0x33,0x87,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x18,0x10,0xed,0x32,0x10,0xdc,0x32,0x5d,0x5d,0x5d,0x87,0x2b,0x7d,\r\n0x10,0xc4,0x11,0x01,0x33,0x5d,0x5d,0x87,0x18,0x10,0x2b,0x7d,0x10,0xc4,0x01,0x5d,0x5d,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x10,0x87,0x0e,0xc4,0x05,0xc4,0xc4,0x0e,0xc4,0x31,0x30,0x01,0x14,0x07,0x07,0x23,0x37,0x36,0x35,0x34,0x23,0x22,0x07,0x05,0x06,0x07,0x03,0x25,0x36,0x33,0x32,0x15,0x14,0x07,0x03,0x23,0x13,0x36,0x35,\r\n0x34,0x23,0x22,0x07,0x05,0x03,0x06,0x07,0x05,0x06,0x23,0x22,0x35,0x34,0x37,0x13,0x36,0x37,0x25,0x37,0x36,0x37,0x25,0x36,0x33,0x32,0x01,0x05,0x06,0x07,0x03,0x06,0x15,0x14,0x33,0x32,0x37,0x25,0x36,0x37,0x07,0x24,0x08,0x0e,0xa8,0x14,0x03,0x33,0x0d,0x13,0xfe,0x89,0x37,0x0a,0x40,0x01,0x77,0x4a,0x2a,0x9f,0x08,0xa5,0xa7,0xaa,\r\n0x03,0x33,0x0d,0x13,0xfe,0x54,0x6c,0x20,0xae,0xfe,0x90,0x55,0x1f,0x9f,0x08,0x69,0x20,0xad,0x02,0x12,0x25,0x1e,0xaf,0x01,0x76,0x53,0x21,0x9f,0xfc,0x68,0xfe,0x23,0x37,0x0a,0x6b,0x03,0x33,0x0f,0x13,0x01,0x6f,0x35,0x0b,0x05,0x50,0x27,0x25,0x41,0x64,0x0f,0x0e,0x35,0x05,0x63,0x0e,0x33,0xfe,0xc8,0x6b,0x15,0xb4,0x26,0x26,0xfc,\r\n0xe8,0x03,0x3b,0x0f,0x0e,0x35,0x05,0x73,0xfe,0x02,0x95,0x2b,0x5b,0x15,0xb4,0x27,0x25,0x01,0xeb,0x94,0x2c,0x86,0xb8,0x93,0x2d,0x5f,0x15,0xfd,0x8d,0x7e,0x0e,0x33,0xfd,0xf2,0x0f,0x0e,0x35,0x05,0x5f,0x0e,0x33,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x06,0x3a,0x05,0x9a,0x00,0x25,0x00,0x70,0x40,0x4b,0x98,0x21,0x01,0x98,0x20,0x01,\r\n0x3a,0x20,0x01,0x29,0x20,0x01,0x94,0x1c,0x01,0x86,0x1c,0x01,0x25,0x1c,0x35,0x1c,0x02,0x87,0x1b,0x97,0x1b,0x02,0x48,0x14,0x01,0x49,0x13,0x01,0x45,0x0e,0x01,0x57,0x0e,0x01,0x07,0x7e,0x00,0x08,0x01,0x08,0x03,0x0c,0x25,0x7e,0x10,0x23,0x20,0x23,0x30,0x23,0x03,0x23,0x23,0x27,0x18,0x7e,0x16,0x24,0x18,0x03,0x1e,0x91,0x11,0x13,\r\n0x03,0x91,0x0c,0x08,0x12,0x00,0x3f,0xde,0xed,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0xfd,0x32,0x32,0xdc,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x06,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,\r\n0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x05,0x25,0x03,0x04,0x83,0x99,0x99,0x47,0x5a,0x1a,0x66,0x8e,0xb1,0x65,0x83,0xd0,0x91,0x4e,0xa8,0x3b,0x6c,0x98,0x5d,0x5a,0x93,0x69,0x39,0xa8,0x02,0x44,0x23,0x40,0x1f,0x03,0x9f,0x9d,0x83,0x83,0x53,0x5c,0x01,0x53,0x7c,0x53,0x29,0x49,0x91,0xda,0x91,0x03,0x6d,0xfc,0x9e,0x6e,0xa6,\r\n0x6e,0x37,0x35,0x6b,0x9f,0x6b,0x03,0x71,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x07,0x05,0xb2,0x00,0x11,0x00,0x7a,0x40,0x51,0x37,0x10,0x01,0xa8,0x10,0xb8,0x10,0x02,0x56,0x10,0x01,0x45,0x10,0x01,0x58,0x0e,0x01,0x4a,0x0e,0x01,0x26,0x05,0x01,0x97,0x05,0xa7,0x05,0x02,0x34,0x05,0x01,0x26,0x05,0x01,0x99,0x03,0x01,0x3a,0x03,0x01,\r\n0xc0,0x08,0x01,0x08,0x00,0x7e,0x9f,0x01,0x01,0x01,0x01,0x13,0x07,0x0a,0x7e,0x8f,0x0c,0x01,0x0c,0x01,0x01,0x0f,0x08,0x91,0xaf,0x0a,0x01,0x9f,0x0a,0xdf,0x0a,0x02,0x0a,0x0a,0x0b,0x04,0x91,0x0f,0x04,0x0b,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x32,0x12,0x39,0x2f,0x5d,0xfd,\r\n0xc6,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x04,0xd5,0xa8,0xfe,0x93,0xfe,0x92,0x03,0xb5,0xfc,0x4b,0xa8,0x02,0x17,0x02,0x14,0x03,0x2a,0x47,0x01,0xaa,0xfe,0x47,0xfe,0xa8,0x98,0xfe,0x8e,0x03,0x6d,\r\n0x02,0x45,0xfd,0xa4,0x00,0x02,0x00,0x5e,0x00,0x00,0x05,0x70,0x05,0xb2,0x00,0x10,0x00,0x19,0x00,0x76,0x40,0x4f,0x26,0x16,0x01,0xa7,0x14,0x01,0x26,0x14,0x01,0x3a,0x12,0x4a,0x12,0x02,0x28,0x12,0x01,0xa8,0x11,0x01,0xa8,0x0d,0x01,0x55,0x0d,0x01,0x3a,0x0a,0x4a,0x0a,0x5a,0x0a,0x03,0x3b,0x06,0x4b,0x06,0x5b,0x06,0x03,0x00,0x00,\r\n0x1b,0x0f,0x01,0x7d,0x18,0x04,0x04,0x1b,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x0f,0x18,0x91,0x01,0xaf,0x04,0x01,0x9f,0x04,0xdf,0x04,0x02,0x04,0x04,0x03,0x13,0x91,0x0b,0x04,0x03,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0x33,0xed,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x39,0x2f,0x31,0x30,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x23,0x11,0x21,0x20,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x11,0x21,0x00,0x26,0x23,0x20,0x03,0x12,0x21,0x21,0x11,0x05,0x70,0xfe,0xfc,0xa8,0xfe,0x9d,0xfe,0xfd,0xff,0x00,0x01,0x19,0x01,0x03,0xe8,0x01,0x0a,0x01,0x04,0xfe,0x54,0xaf,0xa7,0xfe,0xa2,0x0a,0x0a,\r\n0x01,0x63,0x01,0x51,0x01,0x72,0xfe,0x8e,0x01,0x72,0x01,0x2a,0xf0,0x01,0x04,0x01,0x22,0xfe,0xde,0xfe,0xfe,0x78,0x02,0x43,0xdb,0xfe,0x6a,0xfe,0x78,0x01,0x84,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x94,0x05,0xb2,0x00,0x11,0x00,0x62,0x40,0x3e,0x96,0x0e,0x01,0x35,0x0e,0x01,0x26,0x0e,0x01,0x29,0x0c,0x01,0x98,0x0c,0x01,0x3a,\r\n0x0c,0x01,0x29,0x0c,0x01,0x49,0x03,0x01,0x46,0x03,0x56,0x03,0x02,0xa7,0x01,0x01,0x49,0x01,0x59,0x01,0x02,0x07,0x05,0x08,0x7e,0x0a,0x0a,0x13,0x10,0x7e,0x11,0x11,0x11,0x0d,0x0a,0x06,0x91,0x08,0x08,0x02,0x0a,0x12,0x0d,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,\r\n0xfd,0x32,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x13,0x10,0x21,0x20,0x11,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x15,0x23,0x78,0x02,0x14,0x02,0x17,0xf1,0xf1,0xa8,0xfe,0x92,0xfe,0x93,0xa8,0x03,0x56,0x02,0x5c,0xfd,0xbb,0xfe,0x9d,0x98,0xfe,0x8e,0x03,0x62,0x01,0xb9,0xfe,0x56,\r\n0x47,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0x07,0x05,0x9a,0x00,0x11,0x00,0x64,0x40,0x3e,0x99,0x0e,0x01,0x3a,0x0e,0x01,0x26,0x0c,0x01,0xa7,0x0c,0x01,0x95,0x0c,0x01,0x34,0x0c,0x01,0x26,0x0c,0x01,0x4a,0x03,0x01,0xa8,0x01,0x01,0x45,0x01,0x01,0x09,0x09,0x13,0x11,0x7e,0x9f,0x10,0x01,0x10,0x10,0x13,0x07,0x0a,0x7e,0x8f,0x04,\r\n0x01,0x04,0x10,0x10,0x02,0x0a,0x91,0x08,0x08,0x02,0x05,0x03,0x0d,0x91,0x02,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x32,0x12,0x39,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x21,0x15,0x21,0x11,\r\n0x10,0x21,0x20,0x11,0x35,0x33,0x04,0xd5,0xfd,0xec,0xfd,0xe9,0xa8,0x03,0xb5,0xfc,0x4b,0x01,0x6e,0x01,0x6d,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfe,0x8e,0x98,0xfe,0xa8,0xfe,0x47,0x01,0xaa,0x47,0x00,0x01,0x00,0x64,0xff,0x38,0x05,0x44,0x05,0xb2,0x00,0x29,0x00,0x8e,0x40,0x5c,0x55,0x1c,0x01,0x27,0x19,0x01,0x84,0x18,\r\n0x01,0x8c,0x14,0x01,0x99,0x13,0x01,0x24,0x0d,0x01,0x15,0x0d,0x01,0x69,0x09,0x79,0x09,0x02,0x1b,0x09,0x01,0x68,0x08,0x78,0x08,0x02,0x6a,0x04,0x7a,0x04,0x02,0x38,0x04,0x48,0x04,0x02,0x91,0x1d,0x01,0x83,0x1d,0x01,0x54,0x1d,0x01,0x1d,0x00,0x1b,0x7d,0x04,0x02,0x06,0x06,0x23,0x7d,0x24,0x24,0x02,0x2b,0x10,0x7d,0x11,0x11,0x00,\r\n0x7e,0x0f,0x02,0x01,0x02,0x11,0x11,0x04,0x0b,0x91,0x16,0x04,0x1d,0x04,0x91,0x00,0x24,0x02,0x00,0x12,0x00,0x3f,0xdd,0xc4,0x10,0xfd,0xc4,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x33,0x2f,0x12,0x39,0xed,0x11,0x39,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x21,0x15,0x23,0x11,0x21,0x24,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x01,0x0e,0xaa,0x01,0x99,0x02,0x6f,0x36,0x69,0x9b,0x66,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd8,0x83,0x88,0xdc,0x99,0x53,\r\n0xfe,0x29,0xc5,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xc8,0x01,0x60,0xe6,0x01,0xbb,0x62,0xaf,0x84,0x4d,0x3e,0x6f,0x9b,0x5d,0x81,0xd3,0x96,0x52,0x5b,0xa3,0xe4,0x88,0xfe,0x3d,0xed,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0x00,0x00,0x01,0x00,0xbc,0xff,0x38,0x04,0x83,0x05,0x9a,0x00,0x13,0x00,0x2d,0x40,0x17,0x12,0x12,\r\n0x06,0x7e,0x07,0x07,0x0d,0x15,0x10,0x13,0x7e,0x0d,0x12,0x91,0x10,0x10,0x0f,0x03,0x07,0x00,0x91,0x0d,0x12,0x00,0x3f,0xed,0xce,0x3f,0x3f,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x25,0x21,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x01,0x64,0x01,0xb3,0x55,\r\n0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xfd,0xca,0xa8,0x03,0x1f,0xfc,0xe1,0x98,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0x05,0x9a,0xfe,0x8e,0x98,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x07,0x05,0xb2,0x00,0x0f,0x00,0x44,0x40,0x29,0xa8,0x0e,0x01,0x45,0x0e,0x01,0x4a,0x0c,0x01,0x25,0x05,0x35,0x05,0x02,0x2a,0x03,0x3a,0x03,\r\n0x02,0x08,0x08,0x11,0x0f,0x7e,0x01,0x01,0x11,0x07,0x7e,0x0b,0x01,0x01,0x0a,0x04,0x91,0x0d,0x04,0x07,0x91,0x0a,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x21,0x15,0x21,0x11,0x10,0x21,0x20,0x11,\r\n0x04,0xd5,0xa8,0xfe,0x93,0xfe,0x92,0x03,0xb5,0xfb,0xa3,0x02,0x17,0x02,0x14,0x03,0x2a,0x47,0x01,0xaa,0xfe,0x47,0xfd,0x36,0x98,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x00,0x02,0x00,0xaa,0xff,0xe8,0x06,0x2b,0x05,0xb2,0x00,0x2c,0x00,0x3d,0x00,0xa0,0x40,0x6c,0x6a,0x3b,0x01,0x67,0x37,0x01,0x64,0x31,0x01,0x56,0x31,0x01,0x79,0x29,\r\n0x01,0x78,0x28,0x01,0x99,0x24,0x01,0x88,0x24,0x01,0x7a,0x24,0x01,0x8a,0x23,0x9a,0x23,0x02,0x7b,0x23,0x01,0x86,0x1f,0x96,0x1f,0x02,0x75,0x1f,0x01,0x76,0x1e,0x01,0x46,0x14,0x01,0x49,0x10,0x01,0x97,0x08,0x01,0x86,0x07,0x96,0x07,0x02,0x25,0x07,0x35,0x07,0x02,0x16,0x07,0x01,0x98,0x03,0x01,0x2a,0x03,0x3a,0x03,0x02,0x1b,0x1a,\r\n0x18,0x7e,0x2c,0x2e,0x2e,0x0c,0x3f,0x34,0x7e,0x26,0x0a,0x7e,0x0c,0x1b,0x2e,0x91,0x2c,0x18,0x18,0x39,0x05,0x91,0x12,0x04,0x39,0x91,0x21,0x21,0x0c,0x12,0x00,0x3f,0x33,0x2f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x01,0x2f,0xfd,0xde,0xed,0x11,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x21,0x15,0x21,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x35,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,\r\n0x17,0x32,0x3e,0x02,0x04,0x7d,0x3a,0x6b,0x95,0x5b,0x5c,0x95,0x6b,0x3a,0xa8,0x4f,0x95,0xd5,0x86,0x85,0xd4,0x94,0x4f,0x01,0x06,0xfe,0xfa,0x35,0x63,0x90,0x5b,0x53,0x89,0x62,0x35,0x3c,0x6d,0x97,0x5c,0xb2,0xb2,0x36,0x58,0x3d,0x21,0x18,0x31,0x49,0x31,0x34,0x52,0x38,0x1d,0x03,0x71,0x6a,0xa0,0x6b,0x35,0x37,0x6e,0xa6,0x6e,0xfc,\r\n0x9e,0x03,0x6d,0x91,0xda,0x91,0x49,0x4b,0x97,0xe3,0x97,0x38,0x98,0xee,0x65,0xa0,0x6f,0x3c,0x3b,0x6a,0x92,0x56,0x5e,0x9d,0x70,0x3e,0xfe,0x7a,0xee,0x2a,0x49,0x64,0x3a,0x33,0x58,0x41,0x27,0x03,0x29,0x4b,0x67,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x70,0x05,0x9a,0x00,0x10,0x00,0x19,0x00,0x6e,0x40,0x48,0x3a,0x18,0x4a,0x18,\r\n0x9a,0x18,0x03,0x28,0x18,0x01,0x96,0x16,0x01,0x34,0x16,0x44,0x16,0x02,0x26,0x16,0x01,0x96,0x14,0x01,0x34,0x14,0x44,0x14,0x02,0x26,0x14,0x01,0x59,0x09,0x01,0x55,0x04,0x01,0x00,0x00,0x1b,0x0f,0x01,0x7e,0x0c,0x9f,0x11,0x01,0x11,0x11,0x1b,0x15,0x7d,0x0f,0x08,0x1f,0x08,0x02,0x08,0x12,0x01,0x91,0x0f,0x0c,0x0c,0x05,0x0d,0x03,\r\n0x17,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0x33,0xed,0x32,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x14,0x00,0x23,0x20,0x00,0x11,0x34,0x00,0x21,0x21,0x11,0x33,0x11,0x21,0x01,0x11,0x21,0x20,0x03,0x12,0x21,\r\n0x32,0x36,0x05,0x70,0xfe,0xfc,0xfe,0xf6,0xe8,0xfe,0xfd,0xfe,0xe7,0x01,0x00,0x01,0x03,0x01,0x63,0xa8,0x01,0x04,0xfe,0x54,0xfe,0xaf,0xfe,0x9d,0x0a,0x0a,0x01,0x5e,0xa7,0xaf,0x03,0x90,0xfe,0x78,0xfe,0xfe,0xde,0x01,0x22,0x01,0x04,0xf0,0x01,0x2a,0x01,0x72,0xfe,0x8e,0xfd,0xe4,0x01,0x84,0xfe,0x78,0xfe,0x6a,0xdb,0x00,0x00,0x01,\r\n0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x1b,0x00,0x5e,0x40,0x3c,0x9c,0x0a,0x01,0x8a,0x0a,0x01,0x89,0x09,0x99,0x09,0x02,0x98,0x05,0x01,0x39,0x05,0x01,0x89,0x04,0x01,0x4b,0x04,0x01,0x39,0x04,0x01,0x2b,0x04,0x01,0x18,0x04,0x01,0x1b,0x7e,0x01,0x01,0x0e,0x1d,0x11,0x0c,0x7e,0x0e,0x36,0x11,0x01,0x15,0x11,0x25,0x11,0x02,\r\n0x11,0x07,0x91,0x16,0x16,0x10,0x03,0x01,0x0d,0x12,0x00,0x3f,0xce,0x3f,0x39,0x2f,0xed,0x33,0x5d,0x5d,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,\r\n0x15,0x04,0xd5,0xa8,0x2b,0x57,0x86,0x5b,0x5c,0x8c,0x5f,0x31,0xa8,0xa8,0x1d,0x4b,0x5e,0x71,0x42,0x85,0xc5,0x81,0x3f,0x01,0x3c,0xe7,0x6a,0xaa,0x75,0x3f,0x41,0x79,0xaf,0x6e,0xfd,0xec,0x05,0x9a,0xfe,0x45,0x21,0x3c,0x2c,0x1a,0x55,0xa2,0xec,0x97,0x00,0x01,0x00,0xbc,0xff,0x38,0x04,0x08,0x05,0x9a,0x00,0x0f,0x00,0x1f,0x40,0x0f,\r\n0x09,0x7e,0x0a,0x0a,0x11,0x03,0x7e,0x00,0x02,0x03,0x0a,0x03,0x91,0x00,0x12,0x00,0x3f,0xed,0xce,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0xbc,0xa8,0x01,0x6a,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0x05,0x9a,0xfa,0xfe,0x37,0x60,0x80,0x49,\r\n0x2b,0x49,0x36,0x1e,0x00,0x01,0x00,0xbc,0xff,0xe8,0x05,0xc3,0x05,0x9a,0x00,0x1f,0x00,0x5a,0x40,0x38,0x94,0x1e,0x01,0x6a,0x15,0x7a,0x15,0x8a,0x15,0x03,0x59,0x15,0x01,0x84,0x11,0x01,0x65,0x11,0x75,0x11,0x02,0x56,0x11,0x01,0x9a,0x02,0x01,0x0d,0x7e,0x05,0x1a,0x7e,0x18,0x05,0x18,0x05,0x18,0x09,0x21,0x0c,0x07,0x7e,0x09,0x19,\r\n0x06,0x91,0x0d,0x0f,0x0b,0x03,0x13,0x91,0x00,0x00,0x08,0x12,0x00,0x3f,0x33,0x2f,0xed,0x3f,0x3f,0xed,0xc4,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,\r\n0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x04,0x23,0x5d,0x99,0x6c,0x3b,0xfe,0xde,0xa8,0xa8,0x01,0xc5,0x27,0x43,0x5b,0x35,0x35,0x5d,0x44,0x27,0xa3,0x3b,0x6d,0x9a,0x18,0x36,0x6d,0xa4,0x6d,0x01,0xcc,0xfc,0x98,0x05,0x9a,0xfe,0x66,0xfd,0xb6,0x51,0x7a,0x51,0x28,0x28,0x51,0x7a,0x51,0x02,0x4a,0xfd,0x9c,0x6d,0xa4,0x6d,0x36,0x00,\r\n0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x04,0x05,0xb2,0x00,0x1a,0x00,0x25,0x00,0xf0,0x40,0x33,0x76,0x21,0x01,0x79,0x25,0x01,0x26,0x22,0x76,0x22,0x02,0x3a,0x1f,0x01,0x86,0x1d,0x01,0x39,0x1d,0x01,0x45,0x17,0x55,0x17,0x02,0x05,0x17,0x15,0x17,0x25,0x17,0x03,0x98,0x04,0x01,0x38,0x02,0x88,0x02,0x02,0x89,0x1c,0x01,0x96,0x16,0xa6,\r\n0x16,0xe6,0x16,0x03,0x15,0xb8,0xff,0xe0,0xb3,0x2e,0x31,0x48,0x15,0xb8,0xff,0xc0,0x40,0x6e,0x25,0x28,0x48,0x0c,0x15,0x0a,0x11,0x18,0x7d,0x6b,0x05,0x7b,0x05,0x8b,0x05,0x03,0x08,0x05,0x18,0x05,0x02,0x6b,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x29,0x1e,0x03,0x1e,0x05,0x07,0x10,0x1b,0x20,0x1b,0x30,0x1b,0x03,0x1b,0x1b,0x03,0x27,0x0a,\r\n0x7e,0x07,0x20,0x7d,0x0f,0x03,0x1f,0x03,0x02,0x03,0x1e,0x18,0x1a,0x1f,0x48,0x09,0x1e,0x01,0xe9,0x1e,0xf9,0x1e,0x02,0x1e,0x05,0x07,0x91,0x06,0x15,0x16,0x15,0x26,0x15,0x03,0xb9,0x15,0x01,0x15,0xb9,0x0c,0x01,0x0c,0xb0,0x0a,0xc0,0x0a,0xd0,0x0a,0x03,0x0a,0x0a,0x08,0x11,0x13,0x91,0x10,0x0e,0x04,0x08,0x03,0x23,0x91,0x00,0x13,\r\n0x00,0x3f,0xed,0x3f,0x3f,0x33,0xed,0x32,0x10,0xcd,0x2f,0x5d,0x32,0x5d,0x32,0x71,0x72,0xed,0x32,0x32,0x5d,0x71,0x2b,0x01,0x2f,0x5d,0xed,0xd4,0xed,0x11,0x12,0x39,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0xfd,0xc4,0x12,0x39,0x39,0x2b,0x2b,0x31,0x30,0x00,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x05,0x20,0x00,0x11,0x10,0x37,0x26,0x27,0x11,0x33,0x15,0x16,0x17,0x36,0x21,0x32,0x17,0x15,0x26,0x23,0x26,0x07,0x16,0x00,0x11,0x10,0x00,0x13,0x10,0x24,0x27,0x06,0x11,0x14,0x16,0x33,0x36,0x36,0x02,0xc0,0xfe,0xf4,0xfe,0xaa,0xd4,0x63,0x71,0x9c,0x79,0x6c,0xed,0x01,0x42,0x86,0x70,0x7f,0x8a,0xad,0x84,0xe7,0x01,0x53,0xfe,0xbb,\r\n0x95,0xfe,0x8e,0xe8,0xec,0xf7,0xb8,0xbd,0xda,0x18,0x01,0x4a,0x01,0x24,0x01,0x45,0xec,0x06,0x01,0x01,0x0c,0x79,0x01,0x0b,0x9d,0x10,0xb0,0x28,0x02,0x30,0x27,0xfe,0xd2,0xfe,0xde,0xfe,0xce,0xfe,0xa5,0x02,0x83,0x01,0x0c,0xef,0x0e,0xcb,0xfe,0xb9,0xea,0xf9,0x01,0xff,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x17,\r\n0x00,0x49,0x40,0x2d,0x4b,0x16,0x01,0x95,0x08,0x01,0x84,0x08,0x01,0x34,0x03,0x01,0x25,0x03,0x01,0x0c,0x7e,0x0a,0x0f,0x0f,0x19,0x01,0x7e,0x17,0x8e,0x0f,0x01,0x49,0x0f,0x01,0x2a,0x0f,0x3a,0x0f,0x02,0x0f,0x05,0x91,0x14,0x0e,0x12,0x0b,0x0f,0x01,0x03,0x00,0x3f,0x3f,0x3f,0xde,0xed,0x33,0x5d,0x5d,0x5d,0x01,0x2f,0xed,0x12,0x39,\r\n0x2f,0xc4,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x11,0x23,0x11,0x0e,0x03,0x23,0x20,0x02,0x11,0xaa,0xa8,0xab,0xb7,0x51,0x8b,0x64,0x39,0xa8,0xa8,0x1b,0x50,0x63,0x71,0x3b,0xfe,0xf6,0xff,0x05,0x9a,0xfd,0xa1,0xd6,0xd4,0x34,0x6c,0xa6,0x73,0xb6,0xfc,0x00,0x01,\r\n0x7f,0x1c,0x30,0x24,0x15,0x01,0x2e,0x01,0x2e,0x00,0x00,0x01,0x00,0x21,0xff,0x68,0x04,0x50,0x06,0x02,0x00,0x0d,0x00,0xa1,0x40,0x5e,0xa6,0x08,0xb6,0x08,0x02,0xa9,0x04,0x01,0xb8,0x04,0x01,0x08,0x07,0x08,0x09,0x07,0x7e,0x06,0x05,0x14,0x06,0x06,0x05,0x06,0x05,0x0b,0x04,0x03,0x04,0x7e,0x0a,0x0b,0x14,0x0a,0x04,0x05,0x0a,0x0b,\r\n0x08,0x09,0x04,0x05,0x08,0x05,0x04,0x7e,0x09,0x08,0x14,0x09,0x08,0x04,0x09,0x09,0x0a,0x61,0x05,0x01,0xc1,0x05,0xd1,0x05,0xe1,0x05,0x03,0x05,0x0a,0x05,0x0a,0x03,0x0d,0x7e,0x00,0x00,0x0f,0x03,0x86,0x0a,0x01,0x48,0x05,0x01,0x07,0x05,0x09,0x0a,0x04,0x06,0x0b,0x91,0x03,0x00,0x02,0x12,0x00,0x3f,0xce,0x33,0xed,0x2f,0x17,0x39,\r\n0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x11,0x33,0x10,0xc1,0x87,0x04,0x2b,0x10,0x01,0xc1,0x87,0x04,0x7d,0x10,0xc4,0x87,0x08,0x18,0x10,0x2b,0x87,0x05,0x7d,0xc4,0x11,0x01,0x33,0x87,0x18,0x10,0x2b,0x08,0x7d,0x10,0xc4,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x05,0x35,0x21,0x35,0x01,0x25,0x13,\r\n0x17,0x07,0x05,0x15,0x01,0x21,0x11,0x03,0xa8,0xfc,0x79,0x02,0xb3,0xfe,0x8c,0x8c,0x95,0x46,0x01,0x6b,0xfd,0x76,0x03,0x34,0x98,0x98,0x2f,0x04,0x03,0xc2,0x01,0x0e,0x4e,0x86,0xba,0x1d,0xfc,0x41,0xfe,0xd0,0x00,0x02,0x00,0x5e,0xff,0xc6,0x05,0x38,0x05,0xb2,0x00,0x35,0x00,0x45,0x00,0xba,0x40,0x7a,0x39,0x34,0x49,0x34,0x59,0x34,\r\n0x03,0x84,0x1f,0x01,0x9b,0x1a,0x01,0x86,0x14,0x01,0x7a,0x10,0x01,0x28,0x10,0x01,0x69,0x0f,0x79,0x0f,0x02,0x56,0x09,0x01,0x37,0x09,0x47,0x09,0x02,0x9d,0x2b,0x01,0x7c,0x2b,0x8c,0x2b,0x02,0x2b,0x2a,0x2a,0x91,0x25,0x01,0x64,0x25,0x74,0x25,0x84,0x25,0x03,0x30,0x25,0x36,0x22,0x7e,0x9e,0x3c,0x01,0x8d,0x3c,0x01,0x7e,0x3c,0x01,\r\n0x6b,0x3c,0x01,0x3c,0x0a,0x36,0x10,0x0d,0x20,0x0d,0x02,0x0d,0x0d,0x47,0x36,0x7e,0x00,0x17,0x7e,0x18,0x18,0x0f,0x00,0x1f,0x00,0x02,0x00,0x3c,0x25,0x39,0x41,0x18,0x18,0x12,0x30,0x0a,0x33,0x05,0x91,0x41,0x39,0x91,0x33,0x2a,0x2b,0x2b,0x33,0x13,0x12,0x91,0x1d,0x04,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x33,0x10,0xfd,0xde,0xed,0x11,\r\n0x39,0x39,0x11,0x39,0x2f,0x11,0x12,0x39,0x39,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0xed,0x11,0x39,0x39,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x1e,0x03,0x17,0x07,0x2e,0x03,0x27,0x06,0x04,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x36,0x36,0x37,0x2e,0x03,0x23,0x22,0x0e,0x02,0x5e,0x05,0x31,0x5f,0x8e,0x61,0x3f,0x7c,0x78,0x73,0x35,0x41,0x48,0x34,0x67,0x9c,0x69,0x63,0x98,0x67,0x36,0xb0,\r\n0x54,0x99,0xd7,0x84,0x89,0xdb,0x9a,0x52,0x5d,0x53,0x14,0x40,0x45,0x42,0x17,0x73,0x18,0x42,0x46,0x43,0x18,0x74,0xfe,0xff,0x91,0xa9,0xb3,0xa6,0x5b,0x5b,0x6d,0xb5,0x51,0x23,0x4e,0x57,0x5d,0x30,0x38,0x50,0x34,0x18,0xf8,0x3f,0x67,0x49,0x29,0x18,0x2a,0x38,0x1f,0x4f,0xcb,0x8a,0x63,0xb8,0x8f,0x56,0x3f,0x70,0x9d,0x5d,0x81,0xd4,\r\n0x97,0x54,0x63,0xae,0xed,0x8a,0xa7,0xfe,0xfc,0x64,0x0f,0x37,0x3e,0x3c,0x13,0x82,0x16,0x3f,0x41,0x3a,0x12,0x57,0x69,0x92,0x7c,0x29,0x3d,0x01,0x41,0x33,0x12,0x23,0x1c,0x12,0x12,0x1f,0x29,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x05,0x94,0x05,0xb2,0x00,0x0f,0x00,0x56,0x40,0x38,0x96,0x0c,0x01,0x24,0x0c,0x34,0x0c,0x02,0x98,0x0a,\r\n0x01,0x2a,0x0a,0x3a,0x0a,0x02,0xa8,0x03,0x01,0x57,0x03,0x01,0x45,0x03,0x01,0xa7,0x01,0x01,0x49,0x01,0x59,0x01,0x02,0x06,0x05,0x7e,0xc0,0x09,0x01,0x09,0x09,0x11,0x0e,0x7e,0x0f,0x0e,0x0e,0x02,0x05,0x91,0x08,0x12,0x0b,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xcd,0x31,\r\n0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x10,0x21,0x20,0x11,0x11,0x33,0x15,0x21,0x11,0x10,0x21,0x20,0x11,0x15,0x23,0x78,0x02,0x14,0x02,0x17,0xf1,0xfe,0x67,0xfe,0x92,0xfe,0x93,0xa8,0x03,0x56,0x02,0x5c,0xfd,0xbb,0xfd,0x2b,0x98,0x03,0x62,0x01,0xb9,0xfe,0x56,0x97,0x00,0x00,0x02,0x00,0x62,0x00,0x00,0x05,0x3a,\r\n0x05,0x9a,0x00,0x13,0x00,0x1b,0x00,0x7d,0x40,0x51,0x78,0x17,0x01,0x36,0x12,0x01,0x07,0x12,0x17,0x12,0x02,0x44,0x11,0x84,0x11,0x94,0x11,0x03,0x29,0x03,0x39,0x03,0x02,0x19,0x10,0x14,0x4a,0x04,0x7a,0x04,0x8a,0x04,0x9a,0x04,0x04,0x04,0x09,0x01,0x0d,0x0d,0x00,0x7e,0x15,0x15,0x1d,0x14,0x7e,0x01,0x06,0x06,0x01,0x19,0x20,0x24,\r\n0x2a,0x48,0x19,0x20,0x17,0x1e,0x48,0x19,0x04,0x06,0x91,0x10,0x09,0xd0,0x07,0x01,0x07,0x07,0x01,0x0d,0x91,0x0c,0x03,0x14,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2b,0x2b,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0x12,0x39,0x39,0x5d,0x12,0x39,0x39,0x31,0x30,\r\n0x71,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x11,0x10,0x37,0x26,0x23,0x35,0x20,0x17,0x36,0x21,0x33,0x15,0x23,0x22,0x07,0x04,0x00,0x11,0x01,0x21,0x11,0x10,0x24,0x27,0x06,0x11,0x05,0x3a,0xfb,0x82,0xca,0x59,0xcb,0x01,0x47,0x76,0xf7,0x01,0x56,0xce,0xe1,0xd4,0xa9,0x01,0x07,0x01,0x57,0xfc,0x2a,0x03,0x2e,0xfe,0xa6,0xfd,0xd7,0x02,0x10,\r\n0x01,0x45,0xe7,0x07,0x9b,0x0f,0xcb,0x98,0x53,0x2c,0xfe,0xde,0xfe,0xce,0xfe,0x69,0x01,0x8d,0x01,0x0f,0xe4,0x18,0xd3,0xfe,0xbf,0x00,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0xd0,0x05,0x9a,0x00,0x0f,0x00,0x57,0x40,0x39,0x29,0x0e,0x39,0x0e,0x02,0x96,0x0c,0x01,0x25,0x0c,0x35,0x0c,0x02,0x4a,0x07,0x5a,0x07,0xda,0x07,0x03,0xc8,0x05,\r\n0x01,0xa9,0x05,0x01,0x46,0x05,0x01,0xb7,0x0c,0x01,0x02,0x03,0x7e,0x30,0x0f,0x01,0x0f,0x0f,0x11,0x0a,0x7e,0xb0,0x08,0x01,0x08,0x09,0x03,0x0d,0x91,0x06,0x13,0x03,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,\r\n0x21,0x15,0x23,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x20,0x11,0x04,0x2d,0x01,0xa3,0xfb,0xfd,0xdf,0xfd,0xf6,0xa8,0x01,0x74,0x01,0x67,0x05,0x9a,0x98,0xfd,0x42,0xfd,0xa4,0x02,0x45,0x03,0x6d,0xfc,0x9e,0xfe,0x47,0x01,0xaa,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x4d,0x05,0xb2,0x00,0x3f,0x00,0x9b,0x40,0x63,0x49,0x3e,\r\n0x01,0x33,0x10,0x10,0x13,0x48,0x6a,0x33,0x01,0x57,0x2d,0x01,0x67,0x29,0x77,0x29,0x02,0x56,0x29,0x01,0x46,0x24,0x56,0x24,0x02,0x84,0x20,0x01,0x87,0x1f,0x01,0xaa,0x1a,0x01,0x98,0x1a,0x01,0x7a,0x1a,0x8a,0x1a,0x02,0x63,0x14,0x01,0x79,0x10,0x01,0x6b,0x10,0x01,0x79,0x0f,0x01,0x25,0x06,0x22,0x7e,0x0d,0x0d,0x2b,0x7e,0x00,0x00,\r\n0x18,0x41,0x36,0x7e,0x35,0x35,0x18,0x06,0x06,0x17,0x7e,0x18,0x26,0x25,0x06,0x18,0x18,0x12,0x08,0x91,0x06,0x36,0x06,0x36,0x12,0x3b,0x91,0x30,0x13,0x12,0x91,0x1d,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x39,0x2f,0x2f,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x01,0x2f,0xed,0x33,0x2f,0x11,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,\r\n0x33,0x2f,0xed,0x11,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x01,0x34,0x2e,0x02,0x23,0x21,0x35,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,\r\n0x2e,0x02,0x27,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xa5,0x3b,0x70,0xa3,0x69,0xfe,0xac,0x01,0x4e,0x5e,0x93,0x60,0x30,0x26,0x45,0x60,0x3a,0x34,0x61,0x4a,0x2c,0xa6,0x4b,0x79,0x9c,0x51,0x51,0x9a,0x79,0x49,0x9a,0x90,0x48,0x84,0x62,0x38,0x55,0x8f,0xba,0x64,0x5c,0xb0,0x8a,0x55,0x02,0xa6,0x30,0x57,0x7c,0x4b,0x41,0x7a,\r\n0x5f,0x39,0x01,0x87,0x46,0x69,0x47,0x23,0x8b,0x21,0x42,0x63,0x42,0x3d,0x5c,0x3d,0x1e,0x1b,0x36,0x50,0x34,0x58,0x84,0x58,0x2c,0x2d,0x57,0x7f,0x53,0x8e,0xb6,0x28,0x04,0x05,0x34,0x5a,0x7b,0x48,0x67,0xa0,0x6e,0x39,0x27,0x54,0x86,0x60,0x34,0x50,0x37,0x1c,0x24,0x47,0x67,0x00,0x00,0x01,0xff,0xf6,0xff,0xe8,0x05,0x1c,0x05,0x9a,\r\n0x00,0x0f,0x00,0x54,0x40,0x38,0x29,0x0c,0x39,0x0c,0x49,0x0c,0x99,0x0c,0x04,0x97,0x0a,0x01,0x25,0x0a,0x35,0x0a,0x45,0x0a,0x03,0x46,0x03,0x56,0x03,0x02,0xd7,0x03,0x01,0x58,0x03,0x01,0x56,0x01,0x01,0x0f,0x7e,0x10,0x0e,0x01,0x0e,0x0e,0x11,0x08,0x7e,0x06,0x04,0x0e,0x0e,0x02,0x05,0x91,0x07,0x03,0x0b,0x91,0x02,0x13,0x00,0x3f,\r\n0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xce,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,0x11,0x11,0x23,0x35,0x21,0x11,0x10,0x21,0x20,0x11,0x35,0x33,0x05,0x1c,0xfd,0xec,0xfd,0xe9,0xfb,0x01,0xa3,0x01,0x6e,0x01,0x6d,0xa8,0x02,0x44,0xfd,0xa4,0x02,0x45,0x02,0xd5,0x98,0xfc,\r\n0x9e,0xfe,0x47,0x01,0xaa,0xab,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xf6,0x05,0xba,0x00,0x23,0x00,0xa4,0x40,0x69,0x97,0x22,0x01,0x98,0x1e,0x01,0x99,0x19,0x01,0x38,0x19,0x48,0x19,0x02,0x9b,0x18,0x01,0x94,0x14,0x01,0x85,0x09,0x01,0x76,0x09,0x01,0x27,0x09,0x01,0x87,0x08,0x01,0x84,0x02,0x01,0x55,0x02,0x01,0x47,0x02,0x01,0x01,\r\n0x20,0x21,0x23,0x21,0x00,0x21,0x7e,0x22,0x23,0x14,0x22,0x22,0x23,0x00,0x9f,0x20,0x01,0x8c,0x20,0x01,0x71,0x01,0x01,0x64,0x01,0x01,0x20,0x01,0x21,0x23,0x23,0x11,0x7e,0x10,0x10,0x20,0x10,0x02,0x10,0x10,0x1b,0x25,0x22,0x21,0x21,0x06,0x7e,0x0f,0x1b,0x1f,0x1b,0x02,0x1b,0x00,0x11,0x00,0x11,0x22,0x04,0x0b,0x91,0x16,0x13,0x00,\r\n0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x33,0x87,0x04,0x10,0x2b,0x87,0x7d,0xc4,0x10,0xc4,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x25,0x0e,0x03,0x15,0x14,0x1e,0x02,\r\n0x33,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x25,0x37,0x01,0x04,0xb8,0xfe,0x92,0x88,0xd4,0x93,0x4d,0x37,0x6a,0x9b,0x64,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd7,0x84,0x86,0xdb,0x9b,0x54,0x43,0x7e,0xb6,0x73,0xfe,0x8b,0x27,0x03,0xe5,0x04,0x14,0x66,0x15,0x6b,0x99,0xbd,0x69,0x61,\r\n0xa3,0x76,0x42,0x3f,0x70,0x9d,0x5d,0x7d,0xd3,0x9a,0x56,0x4f,0x96,0xd7,0x88,0x6c,0xcf,0xae,0x84,0x22,0x6c,0x93,0xfe,0xed,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x25,0x05,0xb2,0x00,0x19,0x00,0x3f,0x40,0x28,0x3b,0x12,0x4b,0x12,0x02,0x86,0x0a,0x96,0x0a,0x02,0x95,0x09,0x01,0x86,0x09,0x01,0x25,0x09,0x01,0x99,0x05,0x01,0x2a,0x05,\r\n0x01,0x19,0x7e,0x01,0x01,0x1b,0x0c,0x7e,0x0e,0x07,0x91,0x14,0x04,0x01,0x0d,0x12,0x00,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x05,0x25,0xa8,0x39,0x69,\r\n0x93,0x5a,0x5d,0x98,0x6c,0x3b,0xa8,0x4e,0x91,0xd0,0x83,0x88,0xd9,0x97,0x51,0x03,0x71,0x6a,0xa0,0x6b,0x35,0x37,0x6e,0xa6,0x6e,0xfc,0x9e,0x03,0x6d,0x91,0xda,0x91,0x49,0x4b,0x97,0xe3,0x97,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x04,0xf6,0x05,0xb2,0x00,0x23,0x00,0x9a,0x40,0x63,0x46,0x1e,0x56,0x1e,0x96,0x1e,0x03,0x93,0x19,0x01,\r\n0x45,0x18,0x01,0x9c,0x14,0x01,0x38,0x14,0x01,0x86,0x0d,0x01,0x89,0x09,0x01,0x3a,0x09,0x01,0x01,0x20,0x21,0x23,0x21,0x00,0x21,0x7e,0x22,0x23,0x14,0x22,0x22,0x23,0x99,0x22,0x01,0x22,0x21,0x21,0x81,0x20,0x91,0x20,0x02,0x34,0x20,0x74,0x20,0x02,0x20,0x23,0x1b,0x7e,0x6d,0x01,0x01,0x01,0x23,0x10,0x06,0x20,0x06,0x30,0x06,0x03,\r\n0x06,0x06,0x11,0x25,0x00,0x23,0x23,0x10,0x7e,0x0f,0x11,0x1f,0x11,0x02,0x11,0x00,0x10,0x00,0x10,0x22,0x12,0x0b,0x91,0x16,0x04,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x5d,0x12,0x39,0x5d,0xed,0x11,0x39,0x5d,0x5d,0x32,0x2f,0x33,0x5d,0x87,0x04,0x10,0x2b,0x87,0x7d,0xc4,\r\n0x10,0xc4,0xc4,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x05,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x05,0x07,0x01,0x9c,0x01,0x6e,0x88,0xd4,0x93,0x4d,0x37,0x6a,0x9b,0x64,0x63,0x98,0x67,0x36,0xb0,0x54,0x99,0xd7,0x84,0x86,\r\n0xdb,0x9b,0x54,0x43,0x7e,0xb6,0x73,0x01,0x75,0x27,0xfc,0x1b,0x01,0xa6,0x66,0x15,0x65,0x91,0xb8,0x69,0x61,0x9f,0x71,0x3e,0x3f,0x70,0x9d,0x5d,0x7d,0xd3,0x9a,0x56,0x4b,0x91,0xd3,0x88,0x6c,0xc9,0xa7,0x7e,0x22,0x6c,0x93,0x01,0x13,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0x89,0x05,0xb2,0x00,0x1c,0x00,0x58,0x40,0x38,0x7a,0x19,\r\n0x01,0x68,0x19,0x01,0x1a,0x19,0x01,0x96,0x11,0x01,0x85,0x11,0x01,0x27,0x11,0x01,0x25,0x10,0x01,0x2a,0x0c,0x01,0x8b,0x0b,0x9b,0x0b,0x02,0x29,0x0b,0x01,0x16,0x03,0x01,0x13,0x7e,0x15,0x00,0x06,0x7e,0x08,0x1b,0x7e,0x00,0x08,0x08,0x01,0x00,0x15,0x12,0x1b,0x01,0x91,0x0e,0x04,0x00,0x3f,0xed,0x32,0x3f,0xce,0x11,0x39,0x2f,0x01,\r\n0x2f,0xed,0xde,0xed,0x10,0xde,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x11,0x0e,0x03,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x11,0x02,0xaf,0x52,0x8e,0x69,0x3c,0xa8,0x5b,0xa8,0xed,0x92,0x92,0xee,0xa9,0x5c,0xa8,0x3c,0x6a,0x90,0x54,\r\n0x01,0x59,0x03,0xbc,0x0b,0x47,0x74,0x9f,0x62,0x74,0x7f,0x91,0xe0,0x99,0x4f,0x52,0x9e,0xe9,0x97,0xfc,0xbe,0x03,0x5d,0x5f,0x9a,0x71,0x45,0x0a,0xfc,0x43,0x00,0x02,0x00,0x64,0xff,0x38,0x05,0x44,0x05,0xb2,0x00,0x28,0x00,0x3a,0x00,0xb7,0x40,0x79,0x95,0x37,0x01,0x47,0x37,0x01,0x93,0x36,0x01,0x94,0x33,0x01,0x55,0x32,0x95,0x32,\r\n0x02,0x45,0x2d,0x01,0x36,0x2d,0x01,0x2b,0x2b,0x8b,0x2b,0x02,0x68,0x2a,0x78,0x2a,0x02,0x94,0x27,0x01,0x94,0x24,0x01,0x36,0x24,0x01,0x89,0x1e,0x01,0x8a,0x1d,0x01,0x8a,0x1b,0x01,0x5a,0x19,0x01,0x80,0x28,0x90,0x28,0x02,0x61,0x28,0x71,0x28,0x02,0x50,0x28,0x01,0x04,0x28,0x01,0x28,0x0c,0x39,0x7e,0x16,0x4f,0x10,0x01,0x3b,0x10,\r\n0x01,0x29,0x10,0x01,0x10,0x0e,0x16,0x05,0x7e,0x06,0x06,0x26,0x7e,0x29,0x16,0x29,0x16,0x29,0x20,0x3c,0x0c,0x7e,0x0e,0x0e,0x2f,0x7e,0x20,0x39,0x10,0x2c,0x91,0x23,0x04,0x28,0x10,0x91,0x0c,0x06,0x0e,0x0c,0x12,0x00,0x3f,0xdd,0xc4,0x10,0xfd,0xc4,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,\r\n0x10,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x5d,0x5d,0x5d,0x10,0xed,0x11,0x39,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x21,0x15,0x23,0x11,0x21,0x36,0x37,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,\r\n0x34,0x00,0x33,0x20,0x00,0x11,0x10,0x05,0x01,0x34,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x36,0x04,0x0a,0x55,0x78,0x4b,0x22,0xb0,0x12,0x2a,0x43,0x30,0xfd,0x29,0xaa,0x01,0x93,0x50,0x2f,0x35,0x41,0x1d,0x14,0x2c,0x45,0x30,0x43,0x88,0x6e,0x45,0x01,0x18,0xea,0x01,0x08,0x01,0x34,0xfe,0x26,0x01,0x2a,0xcf,\r\n0xbd,0xa4,0xae,0x2d,0x4d,0x64,0x37,0x3d,0x63,0x44,0x25,0xc0,0x98,0x37,0x60,0x80,0x49,0x2b,0x49,0x36,0x1e,0xc8,0x01,0x60,0x1d,0x1b,0x1e,0x3b,0x38,0x17,0x20,0x34,0x2c,0x27,0x13,0x1a,0x48,0x66,0x8a,0x5c,0xc0,0x01,0x12,0xfe,0xb3,0xfe,0xe3,0xfe,0x42,0xf2,0x02,0xa1,0xd6,0x01,0x0c,0xc3,0x78,0x33,0x5b,0x4e,0x3d,0x15,0x18,0x39,\r\n0x47,0x56,0x33,0xae,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0xc6,0x05,0xb2,0x00,0x11,0x00,0x6a,0x40,0x46,0xd9,0x0a,0xf9,0x0a,0x02,0xa8,0x0a,0x01,0x46,0x0a,0x01,0x09,0x08,0x01,0x59,0x08,0x01,0x4a,0x08,0x01,0x97,0x03,0x01,0x25,0x03,0x35,0x03,0x02,0xb7,0x01,0x01,0x29,0x01,0x39,0x01,0x02,0x70,0x0e,0x01,0x0e,0x0c,0x0f,0x7e,0x30,\r\n0x11,0x70,0x11,0x02,0x11,0x11,0x13,0x04,0x7e,0xb0,0x06,0x01,0x06,0x0d,0x91,0x0f,0x0f,0x06,0x02,0x91,0x09,0x03,0x11,0x11,0x06,0x12,0x00,0x3f,0x33,0x2f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xfd,0x32,0xcd,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x01,0x10,0x21,0x20,\r\n0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x15,0x33,0x15,0x23,0x11,0x23,0x04,0x2d,0xfe,0x99,0xfe,0x8c,0xa8,0x02,0x0a,0x02,0x21,0xf1,0xf1,0xa8,0x03,0x71,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x3d,0x98,0xfd,0x7f,0x00,0x01,0x00,0xaa,0xff,0xe8,0x05,0x25,0x05,0x9a,0x00,0x19,0x00,0x3f,0x40,0x28,0x99,0x14,\r\n0x01,0x2a,0x14,0x01,0x95,0x10,0x01,0x86,0x10,0x01,0x25,0x10,0x01,0x87,0x0f,0x97,0x0f,0x02,0x3b,0x07,0x4b,0x07,0x02,0x19,0x7e,0x17,0x17,0x1b,0x0c,0x7e,0x0a,0x18,0x0c,0x03,0x12,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,\r\n0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x05,0x25,0x51,0x97,0xd9,0x88,0x83,0xd0,0x91,0x4e,0xa8,0x3b,0x6c,0x98,0x5d,0x5a,0x93,0x69,0x39,0xa8,0x02,0x44,0x97,0xe3,0x97,0x4b,0x49,0x91,0xda,0x91,0x03,0x6d,0xfc,0x9e,0x6e,0xa6,0x6e,0x37,0x35,0x6b,0x9f,0x6b,0x03,0x71,0x00,0x00,0x01,\r\n0x00,0x5e,0x00,0x00,0x05,0x7a,0x05,0x9a,0x00,0x11,0x00,0x57,0x40,0x36,0x9e,0x10,0x01,0x4b,0x10,0x01,0x93,0x06,0x01,0x84,0x06,0x01,0x35,0x03,0x01,0x26,0x03,0x01,0x0a,0x08,0x7e,0x0c,0x06,0x06,0x13,0x01,0x7e,0x11,0x0b,0x4a,0x0d,0x5a,0x0d,0x02,0x3b,0x0d,0x01,0x2d,0x0d,0x01,0x1b,0x0d,0x01,0x0d,0x04,0x91,0x0f,0x09,0x91,0x0c,\r\n0x12,0x01,0x07,0x03,0x00,0x3f,0xce,0x3f,0xed,0xde,0xed,0x33,0x5d,0x5d,0x5d,0x5d,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xc4,0xfd,0xce,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x10,0x21,0x20,0x11,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0x06,0x23,0x20,0x11,0x5e,0xa8,0x01,0x6d,0x01,0x6e,0xa8,0xf1,0xfe,0x67,0x84,\r\n0xeb,0xfd,0xec,0x04,0x5e,0xfe,0xf1,0xfe,0x56,0x01,0xb9,0x02,0x3c,0xfa,0xfe,0x98,0x01,0x93,0x85,0x02,0x5c,0x00,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xb5,0x05,0xb2,0x00,0x3a,0x00,0xba,0x40,0x7a,0x75,0x2e,0x01,0x56,0x2e,0x66,0x2e,0x02,0x5b,0x2a,0x01,0x86,0x24,0x96,0x24,0x02,0x75,0x24,0x01,0x66,0x24,0x01,0x75,0x23,0x01,0x67,\r\n0x23,0x01,0x89,0x1e,0x99,0x1e,0x02,0x89,0x1a,0x01,0x4a,0x1a,0x01,0x7a,0x15,0x01,0x69,0x14,0x01,0x5a,0x11,0x01,0x33,0x0e,0x01,0x88,0x08,0x01,0x08,0x10,0x0d,0x10,0x48,0x49,0x07,0x01,0x73,0x03,0x01,0x65,0x03,0x01,0x65,0x02,0x75,0x02,0x02,0x26,0x7e,0x27,0x27,0x12,0x36,0x31,0x00,0x7e,0x17,0x1c,0x60,0x12,0x01,0x12,0x12,0x3c,\r\n0x31,0x7e,0x1c,0x0b,0x7e,0x0a,0x0a,0x60,0x1c,0x01,0x1c,0x27,0x27,0x36,0x2c,0x36,0x10,0x21,0x0b,0x0b,0x17,0x10,0x17,0x05,0x2c,0x91,0x21,0x04,0x10,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0x5d,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,\r\n0xed,0x11,0x39,0x11,0x33,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x2b,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x33,0x20,0x11,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,\r\n0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0xb5,0x5a,0x97,0xc6,0x6c,0x67,0xc8,0x9e,0x61,0xb1,0x45,0x6e,0x88,0x44,0x01,0x71,0x33,0x59,0x7a,0x48,0x6d,0xbf,0x8e,0x53,0x3f,0x7a,0xb1,0x72,0x5a,0xae,0x89,0x55,0xb0,0x29,0x4f,0x75,0x4b,0x48,0x6f,0x4c,0x27,0x38,0x62,0x81,0x48,0x6c,0xb9,0x87,0x4c,0x01,0x85,\r\n0x75,0x9e,0x60,0x2a,0x2f,0x67,0xa3,0x74,0x4e,0x6a,0x41,0x1d,0x01,0x06,0x49,0x5e,0x3a,0x22,0x0d,0x14,0x3b,0x60,0x8e,0x68,0x55,0x8b,0x63,0x35,0x2b,0x5f,0x99,0x6f,0x38,0x5c,0x42,0x24,0x20,0x3b,0x52,0x33,0x43,0x5b,0x3c,0x25,0x0c,0x13,0x37,0x5f,0x92,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0x25,0x05,0xb2,0x00,0x0d,0x00,0x4f,\r\n0x40,0x33,0x46,0x0c,0x01,0x33,0x0c,0x01,0x4b,0x0a,0x01,0x3d,0x0a,0x01,0x94,0x05,0x01,0x85,0x05,0x01,0x26,0x05,0x01,0x17,0x05,0x01,0x89,0x03,0x99,0x03,0x02,0x18,0x03,0x28,0x03,0x02,0x0d,0x7e,0x01,0x01,0x0f,0x06,0x7e,0x08,0x00,0x00,0x07,0x04,0x91,0x0b,0x04,0x07,0x12,0x00,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0xed,0x12,\r\n0x39,0x2f,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x35,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x21,0x20,0x11,0x05,0x25,0xa8,0xfe,0x6b,0xfe,0x6a,0xa8,0x02,0x3f,0x02,0x3c,0x02,0xc6,0xab,0x01,0xaa,0xfe,0x47,0xfc,0x9e,0x03,0x6d,0x02,0x45,0xfd,0xa4,0x00,0x02,0x00,0x90,0xff,0xe8,0x04,0xdf,\r\n0x05,0xb2,0x00,0x2f,0x00,0x43,0x00,0x9f,0x40,0x67,0x59,0x2d,0x01,0x48,0x29,0x01,0x26,0x24,0x01,0x79,0x1e,0x01,0x68,0x1e,0x01,0x59,0x1e,0x01,0x5a,0x1d,0x01,0x76,0x18,0x01,0x67,0x18,0x01,0x56,0x18,0x01,0x66,0x14,0x76,0x14,0x02,0x64,0x0c,0x74,0x0c,0x84,0x0c,0x03,0x66,0x0b,0x76,0x0b,0x02,0x6a,0x07,0x01,0x7b,0x06,0x8b,0x06,\r\n0x02,0x6c,0x06,0x01,0x01,0x10,0x04,0x0e,0x7e,0x30,0x30,0x16,0x7e,0x50,0x2b,0x01,0x2b,0x2b,0x04,0x45,0x21,0x7e,0x20,0x20,0x3a,0x7e,0x04,0x2f,0x2f,0x04,0x11,0x10,0x2e,0x3f,0x3f,0x01,0x91,0x21,0x2e,0x2e,0x35,0x26,0x91,0x1b,0x13,0x35,0x91,0x09,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xce,0xed,0x32,0x2f,0x11,0x39,0x39,\r\n0x01,0x2f,0x33,0x2f,0x10,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x5d,0xed,0x33,0x2f,0xed,0x11,0x39,0x39,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,\r\n0x02,0x27,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x21,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0xcc,0xbf,0x43,0x45,0x51,0x83,0xa6,0x56,0x55,0xa4,0x82,0x50,0xfe,0xf0,0x49,0x7b,0x5a,0x33,0x5d,0x99,0xc7,0x6a,0x6c,0xc6,0x98,0x5c,0x02,0xa8,0x35,0x64,0x8e,0x5a,0x48,0x89,\r\n0x6c,0x41,0xd1,0xdc,0xfe,0x42,0x03,0x2a,0x30,0x50,0x6a,0x39,0x3f,0x6d,0x4f,0x2d,0x2a,0x4d,0x6c,0x42,0x42,0x6c,0x4e,0x2a,0x03,0x29,0x32,0x93,0x64,0x5b,0x85,0x56,0x2a,0x28,0x57,0x87,0x5a,0xfe,0xed,0x51,0x04,0x05,0x31,0x57,0x7b,0x4e,0x6d,0xa1,0x6a,0x34,0x34,0x6a,0xa1,0x6d,0x43,0x6c,0x4b,0x28,0x20,0x43,0x68,0x48,0x8c,0x8d,\r\n0x01,0x95,0x3a,0x5b,0x3e,0x21,0x23,0x3f,0x5b,0x37,0x40,0x61,0x41,0x22,0x01,0x03,0x23,0x41,0x5f,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x05,0xb2,0x05,0x9a,0x00,0x1a,0x00,0x57,0x40,0x34,0x9a,0x08,0x01,0x79,0x08,0x89,0x08,0x02,0x98,0x07,0x01,0x9a,0x03,0x01,0x3d,0x03,0x4d,0x03,0x02,0x2b,0x03,0x01,0x00,0x19,0x7e,0x01,0x01,0x0c,\r\n0x1c,0x0f,0x0a,0x7e,0x0c,0x1a,0x91,0x01,0x26,0x0f,0x01,0x0f,0x14,0x91,0x05,0x01,0x05,0x01,0x05,0x0b,0x0e,0x03,0x0b,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x5d,0x10,0xed,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0xfd,0xcd,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x35,0x34,0x26,0x23,0x22,\r\n0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x33,0x05,0xb2,0xfe,0x7b,0xb7,0xb6,0x57,0x88,0x5e,0x31,0xa8,0xa8,0x21,0x49,0x58,0x6b,0x42,0x78,0xbb,0x84,0x4d,0x0b,0xe2,0x01,0xe6,0x47,0xd5,0xe9,0x41,0x79,0xaf,0x6e,0xfd,0xec,0x05,0x9a,0xfe,0x45,0x21,0x3c,0x2c,0x1a,0x44,0x84,0xc0,0x7c,0x00,0x03,\r\n0x00,0x5e,0x00,0x00,0x05,0xf8,0x05,0x9a,0x00,0x14,0x00,0x1d,0x00,0x26,0x00,0x87,0x40,0x5a,0x29,0x22,0x01,0x29,0x1e,0x01,0x26,0x19,0x01,0x26,0x15,0x01,0x68,0x12,0x78,0x12,0x02,0x68,0x0e,0x78,0x0e,0x02,0x67,0x07,0x77,0x07,0x02,0x67,0x04,0x77,0x04,0x02,0x17,0x7d,0x0f,0x10,0x01,0x10,0x10,0x0b,0x20,0x7d,0x90,0x06,0x01,0x00,\r\n0x06,0xc0,0x06,0x02,0x06,0x06,0x25,0x02,0x09,0x7e,0x1b,0x14,0x10,0x0b,0xc0,0x0b,0xd0,0x0b,0xf0,0x0b,0x04,0x0b,0x0b,0x27,0x28,0x1b,0x25,0x91,0x0c,0x09,0x40,0x12,0x16,0x48,0x09,0x0b,0x12,0x24,0x1c,0x91,0x02,0x14,0x00,0x03,0x00,0x3f,0xdd,0x32,0xed,0x32,0x3f,0xdd,0x2b,0x32,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x5d,0x33,0x33,\r\n0xed,0x32,0x32,0x32,0x2f,0x5d,0x71,0xed,0x11,0x33,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x33,0x15,0x04,0x17,0x16,0x15,0x14,0x00,0x21,0x15,0x23,0x35,0x20,0x27,0x26,0x35,0x34,0x37,0x36,0x25,0x01,0x06,0x15,0x14,0x17,0x16,0x33,0x11,0x06,0x01,0x36,0x35,0x34,0x27,0x26,0x27,0x11,0x32,0x02,0xd7,\r\n0xa8,0x01,0x0d,0xb6,0xb6,0xfe,0x94,0xfe,0xf3,0xa8,0xfe,0xf2,0xb5,0xb6,0xb6,0xb5,0x01,0x0e,0xfe,0xab,0x74,0x74,0x73,0xe2,0xe2,0x02,0xdf,0x74,0x74,0x74,0xe1,0xe1,0x05,0x9a,0x8c,0x01,0xa3,0xa3,0xfb,0xfd,0xfe,0xb9,0x88,0x88,0xa3,0xa4,0xfd,0xfb,0xa3,0xa3,0x01,0xfe,0xe6,0x7f,0xab,0xa9,0x80,0x7f,0x03,0x52,0x01,0xfd,0x2e,0x80,\r\n0xa9,0xab,0x7f,0x7f,0x01,0xfc,0xae,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x04,0xe1,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0xbe,0x40,0x87,0x39,0x20,0x49,0x20,0x59,0x20,0x99,0x20,0x04,0xe4,0x1e,0x01,0xa6,0x1e,0xb6,0x1e,0x02,0x94,0x1e,0x01,0x36,0x1e,0x46,0x1e,0x56,0x1e,0x03,0xe7,0x1a,0x01,0xa6,0x1a,0x01,0x94,0x1a,0x01,0x35,0x1a,\r\n0x45,0x1a,0x55,0x1a,0x03,0x99,0x18,0x01,0x3a,0x18,0x4a,0x18,0x5a,0x18,0x03,0x06,0x10,0x01,0x5b,0x0c,0x01,0x49,0x0c,0x01,0xe8,0x0c,0x01,0xaa,0x0c,0xba,0x0c,0x02,0x56,0x0a,0x01,0xe7,0x0a,0x01,0x14,0x01,0x7e,0x1c,0x7d,0x04,0x07,0x04,0x15,0x15,0x0e,0x7e,0x16,0x10,0x16,0x01,0x00,0x16,0x10,0x16,0x20,0x16,0x03,0x04,0x16,0x04,\r\n0x16,0x23,0x06,0x19,0x91,0x0b,0x26,0x1f,0x91,0x59,0x13,0x69,0x13,0x02,0x13,0x0f,0x11,0x01,0xbf,0x11,0xcf,0x11,0xdf,0x11,0x03,0x11,0x07,0x15,0x91,0x04,0x01,0x03,0x12,0x00,0x3f,0xdd,0x32,0xfd,0x32,0xde,0x5d,0x71,0x32,0x5d,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x10,0xed,0x32,0x2f,0x11,0x33,0x10,0xed,\r\n0xed,0x32,0x31,0x30,0x5d,0x71,0x5d,0x5d,0x71,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x21,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x34,0x00,0x33,0x32,0x00,0x15,0x14,0x02,0x23,0x22,0x27,0x15,0x21,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xe1,0xfc,0xb8,0xa8,0xdd,0xdd,0x01,\r\n0x0b,0xe7,0xee,0x01,0x10,0xf8,0xee,0xda,0x88,0x03,0x48,0xa8,0x9f,0xab,0xa6,0xb0,0xac,0xaa,0xab,0x9f,0x98,0x98,0x98,0x98,0x02,0x8a,0xdf,0x01,0x19,0xfe,0xdf,0xe7,0xe8,0xfe,0xe8,0x77,0xf1,0x02,0x80,0xa8,0xd0,0xd3,0xa1,0xa6,0xda,0xd3,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x82,0x40,0x61,\r\n0x1a,0x17,0x01,0xc8,0x13,0x01,0x0a,0x13,0x1a,0x13,0x02,0xc6,0x11,0x01,0x05,0x11,0x15,0x11,0x02,0x85,0x0d,0xc5,0x0d,0x02,0x04,0x0d,0x14,0x0d,0x02,0xc9,0x0b,0x01,0x56,0x0b,0x66,0x0b,0x96,0x0b,0x03,0xd7,0x07,0x01,0x55,0x07,0x65,0x07,0x95,0x07,0x03,0xc6,0x05,0x01,0x59,0x05,0x69,0x05,0x99,0x05,0x03,0xc6,0x01,0x01,0x5a,0x01,\r\n0x6a,0x01,0x9a,0x01,0x03,0x09,0x7d,0x00,0x15,0x10,0x15,0x30,0x15,0x03,0x15,0x15,0x19,0x0f,0x7d,0x0f,0x03,0x1f,0x03,0x02,0x03,0x0c,0x91,0x06,0x04,0x12,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x05,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x02,0xfe,0xfe,0xcf,0xfe,0x91,0x01,0x76,0x01,0x42,0x01,0x29,0x01,0x6b,0xfe,0x8c,0xfe,0xd4,0xe2,0xfe,0xe6,0x01,0x13,0xdd,0xec,0x01,0x10,0xfe,0xf8,0x18,0x01,0x92,0x01,0x42,0x01,0x5a,0x01,0x9c,0xfe,0x70,\r\n0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x05,0x32,0xfe,0xba,0xfe,0xf7,0xfe,0xf7,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0x00,0x03,0x00,0x86,0xff,0xe8,0x05,0x45,0x05,0x9a,0x00,0x1f,0x00,0x2a,0x00,0x35,0x00,0x82,0x40,0x54,0x3a,0x28,0x4a,0x28,0x02,0x29,0x28,0x01,0x7c,0x23,0x01,0x69,0x23,0x01,0x4a,0x23,0x01,0x39,0x23,0x01,\r\n0x95,0x1d,0x01,0x99,0x14,0x01,0x45,0x0e,0x95,0x0e,0x02,0x24,0x0e,0x34,0x0e,0x02,0x05,0x0e,0x15,0x0e,0x02,0x96,0x0d,0x01,0x55,0x03,0x01,0x57,0x02,0x01,0x16,0x7e,0x2b,0x11,0x00,0x7e,0x20,0x25,0x1b,0x7e,0x11,0x0a,0x7e,0x0b,0x30,0x11,0x0b,0x0b,0x26,0x11,0x11,0x25,0x05,0x31,0x91,0x1b,0x30,0x1a,0x03,0x10,0x26,0x91,0x05,0x13,\r\n0x00,0x3f,0xed,0x32,0x3f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0xc4,0xde,0xed,0x10,0xfd,0xc4,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x17,0x11,0x2e,0x03,0x35,0x34,0x36,\r\n0x33,0x33,0x11,0x1e,0x03,0x07,0x34,0x2e,0x02,0x27,0x11,0x3e,0x03,0x01,0x14,0x1e,0x02,0x17,0x11,0x22,0x0e,0x02,0x05,0x45,0x59,0x9f,0xdb,0x82,0x88,0xe3,0xa4,0x5b,0xb1,0x36,0x61,0x84,0x4e,0x6d,0x9c,0x63,0x2f,0xd0,0xcb,0xa8,0x80,0xbf,0x7f,0x3f,0xb0,0x29,0x53,0x7d,0x54,0x4b,0x7b,0x57,0x30,0xfd,0x20,0x29,0x43,0x54,0x2b,0x40,\r\n0x5a,0x38,0x19,0x01,0xe9,0x86,0xc2,0x7d,0x3c,0x44,0x86,0xc6,0x81,0x4d,0x82,0x63,0x3d,0x06,0x02,0xde,0x1a,0x3e,0x4b,0x5a,0x35,0x7a,0x8c,0xfe,0x3f,0x1e,0x61,0x7f,0x9b,0x57,0x3f,0x64,0x50,0x40,0x1b,0xfd,0x4f,0x09,0x33,0x57,0x7c,0x02,0xff,0x21,0x30,0x23,0x1a,0x0a,0x01,0x04,0x10,0x1c,0x28,0x00,0x00,0x01,0x00,0x00,0x04,0x90,\r\n0x00,0xca,0x06,0x1c,0x00,0x0d,0x00,0x50,0x40,0x15,0x0c,0x18,0x22,0x25,0x48,0x0c,0x18,0x09,0x13,0x48,0x08,0x18,0x22,0x25,0x48,0x08,0x18,0x09,0x13,0x48,0x05,0xb8,0xff,0xe8,0xb3,0x1d,0x21,0x48,0x01,0xb8,0xff,0xf0,0x40,0x17,0x1d,0x21,0x48,0x00,0x06,0x03,0xc4,0x10,0x0a,0x20,0x0a,0x30,0x0a,0x03,0x0a,0x00,0xc5,0x40,0x0d,0xc0,\r\n0x06,0xc5,0x07,0x00,0x2f,0xed,0x1a,0xde,0x1a,0xed,0x01,0x2f,0x5d,0xfd,0xce,0x32,0x31,0x30,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x13,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0xca,0x30,0x40,0x40,0x30,0x54,0x76,0x76,0x54,0x05,0xcb,0x41,0x34,0x34,0x41,0x51,0x6c,0x5a,0x5a,0x6c,0x00,0x01,0x00,0x00,0x04,0x8a,\r\n0x00,0xe1,0x06,0x03,0x00,0x0e,0x00,0x25,0x40,0x0b,0x01,0x18,0x09,0x0d,0x48,0x00,0x03,0xfb,0x09,0x01,0x01,0xb8,0xff,0xc0,0xb7,0x09,0x0d,0x48,0x01,0x03,0x0c,0xaf,0x06,0x2f,0xe1,0x39,0xc4,0x2b,0x00,0x3f,0xfd,0xc4,0x31,0x30,0x2b,0x11,0x35,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x5e,0x14,0x34,0x3e,\r\n0x3a,0x30,0x35,0x42,0x71,0x04,0x8a,0x49,0x05,0x62,0x02,0x38,0x2a,0x2b,0x3a,0x49,0x38,0x60,0x93,0x00,0x00,0x01,0x00,0x00,0x04,0xc2,0x01,0x35,0x06,0x0a,0x00,0x03,0x00,0x22,0x40,0x11,0x78,0x03,0x88,0x03,0x98,0x03,0x03,0x03,0x40,0x00,0x80,0x01,0x40,0x02,0x03,0x80,0x02,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x1a,0xcd,0x1a,0xdd,0x1a,\r\n0xcd,0x31,0x30,0x5d,0x01,0x03,0x23,0x13,0x01,0x35,0xb6,0x7f,0x8f,0x06,0x0a,0xfe,0xb8,0x01,0x48,0x00,0x00,0x01,0x00,0x00,0x04,0x3e,0x01,0x92,0x06,0x03,0x00,0x1d,0x00,0x13,0xb6,0x03,0x1b,0x1b,0x0d,0x13,0x00,0x0f,0x00,0x2f,0xcc,0x01,0x2f,0xcd,0x33,0x2f,0xcd,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,\r\n0x14,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x35,0x34,0x27,0x01,0x86,0x04,0x08,0x1a,0x2d,0x3c,0x22,0x1a,0x2c,0x21,0x12,0x08,0x71,0x04,0x07,0x59,0x48,0x18,0x2d,0x23,0x15,0x08,0x06,0x03,0x0f,0x30,0x13,0x23,0x38,0x2e,0x25,0x10,0x0c,0x19,0x1d,0x24,0x16,0x17,0x22,0x0f,0x2f,0x14,0x45,0x5b,0x1d,0x0a,0x19,0x1f,0x25,\r\n0x16,0x17,0x22,0x00,0x00,0x01,0x00,0x00,0x04,0xc2,0x01,0x35,0x06,0x0a,0x00,0x03,0x00,0x31,0xb7,0x77,0x03,0x87,0x03,0x97,0x03,0x03,0x03,0xb8,0xff,0xf8,0x40,0x12,0x18,0x1c,0x48,0x01,0x40,0x00,0x80,0x03,0x40,0x50,0x02,0x60,0x02,0x02,0x02,0x03,0x80,0x01,0x00,0x2f,0x1a,0xcd,0x01,0x2f,0x5d,0x1a,0xcd,0x1a,0xdd,0x1a,0xcd,0x31,\r\n0x30,0x2b,0x5d,0x01,0x23,0x03,0x33,0x01,0x35,0x7f,0xb6,0xa8,0x04,0xc2,0x01,0x48,0x00,0x01,0x00,0x00,0x04,0x76,0x02,0x29,0x06,0x1c,0x00,0x2d,0x00,0xa0,0xb5,0x2a,0x08,0x11,0x14,0x48,0x26,0xb8,0xff,0xf8,0x40,0x4f,0x11,0x14,0x48,0x2a,0x1c,0x01,0x1c,0x10,0x11,0x14,0x48,0x06,0x12,0x16,0x12,0x02,0x19,0x07,0x11,0x01,0x2a,0x09,\r\n0x0d,0x01,0x08,0x0c,0x01,0x39,0x0c,0x10,0x19,0x1f,0x48,0x07,0x03,0x17,0x03,0x27,0x03,0x03,0x3e,0x00,0x7f,0x2d,0x8f,0x2d,0x02,0x2d,0x2d,0x16,0x0a,0x9f,0x23,0xaf,0x23,0x02,0x23,0x40,0x09,0x0c,0x48,0x23,0x16,0x10,0x17,0x20,0x17,0x30,0x17,0x03,0x17,0x00,0x00,0x0f,0xc0,0x05,0x01,0x05,0x28,0xb8,0xff,0xc0,0x40,0x12,0x15,0x1a,\r\n0x48,0x28,0x17,0xaf,0x0f,0xbf,0x0f,0xcf,0x0f,0x03,0x0f,0xc0,0x1e,0x01,0x1e,0x17,0xb8,0x01,0x3a,0x00,0x3f,0xdc,0x71,0xcd,0x71,0x10,0xd4,0x2b,0xcd,0x71,0x11,0x39,0x2f,0x01,0x2f,0x5d,0xcd,0xdc,0x2b,0x71,0xcd,0x11,0x39,0x2f,0x71,0xcd,0x31,0x30,0x5e,0x5d,0x2b,0x5e,0x5d,0x5d,0x5e,0x5d,0x5e,0x5d,0x2b,0x5d,0x2b,0x2b,0x01,0x14,\r\n0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x15,0x23,0x34,0x3e,0x04,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x01,0x37,0x07,0x10,0x1b,0x14,0x15,0x1f,0x14,0x09,0x16,0x24,0x30,0x19,0x32,0x4b,0x35,0x23,0x13,0x08,0x5b,0x09,0x1a,0x2e,0x4a,0x69,0x47,0x2e,0x51,0x3c,0x23,0x18,\r\n0x2d,0x40,0x27,0x2a,0x3c,0x28,0x13,0x05,0x4f,0x0e,0x1e,0x19,0x10,0x0e,0x18,0x1f,0x10,0x1a,0x2b,0x1e,0x11,0x20,0x36,0x45,0x4a,0x49,0x1f,0x20,0x57,0x5e,0x5c,0x48,0x2d,0x1e,0x36,0x4a,0x2c,0x23,0x3f,0x2e,0x1b,0x1b,0x2f,0x3d,0x21,0x00,0x00,0x01,0x00,0x00,0x04,0xb7,0x02,0xce,0x06,0x1c,0x00,0x06,0x00,0x2a,0x40,0x16,0xa5,0x01,\r\n0xb5,0x01,0xc5,0x01,0x03,0x96,0x01,0x01,0x01,0x06,0x04,0x00,0x00,0x02,0x04,0x00,0x06,0x05,0x01,0x04,0x00,0x2f,0xdd,0x32,0xcd,0x32,0x01,0x2f,0xcd,0x39,0x2f,0x12,0x39,0x39,0x5d,0x5d,0x31,0x30,0x01,0x07,0x21,0x15,0x21,0x35,0x01,0x01,0x60,0xc9,0x02,0x37,0xfd,0x32,0x01,0x11,0x05,0xd1,0xd5,0x45,0x45,0x01,0x20,0x00,0x00,0x01,\r\n0x00,0x90,0xff,0xe8,0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x91,0x40,0x63,0x9c,0x1e,0x01,0x09,0x1e,0x19,0x1e,0x29,0x1e,0x03,0x57,0x1c,0x01,0x98,0x1b,0x01,0xc8,0x1a,0x01,0x9c,0x1a,0x01,0x07,0x0e,0x17,0x0e,0x02,0xf7,0x0e,0x01,0x36,0x0e,0x01,0x66,0x0c,0xe6,0x0c,0xf6,0x0c,0x03,0x55,0x0c,0x01,0x27,0x0c,0x37,0x0c,0x02,0x66,0x0c,\r\n0x76,0x0c,0x86,0x0c,0x03,0x36,0x06,0x01,0x56,0x04,0x01,0x66,0x04,0x76,0x04,0x86,0x04,0x03,0x01,0x84,0x1f,0x08,0x15,0x15,0x12,0x84,0x10,0x1b,0x0a,0x84,0x08,0x08,0x20,0x21,0x16,0x0d,0x0d,0x1b,0x05,0x95,0x18,0x1d,0x16,0x14,0x0f,0x11,0x09,0x00,0x0f,0x00,0x3f,0x32,0x32,0x3f,0x3f,0x33,0xed,0x32,0x32,0x11,0x33,0x11,0x12,0x01,\r\n0x39,0x2f,0xed,0x33,0xdc,0xed,0x33,0x2f,0x10,0xdc,0xed,0x31,0x30,0x5d,0x71,0x5d,0x5d,0x71,0x71,0x71,0x5d,0x5d,0x71,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x90,0xa4,0x69,\r\n0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0xfc,0x00,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0x2a,0x04,0x18,0x00,0x16,0x00,0x5a,0x40,0x3a,0x75,0x15,\r\n0x01,0x05,0x14,0x15,0x14,0x25,0x14,0x75,0x14,0x85,0x14,0x95,0x14,0x06,0xe8,0x06,0xf8,0x06,0x02,0xc7,0x06,0xd7,0x06,0x02,0x69,0x03,0x01,0x09,0x09,0x18,0x16,0x84,0x01,0x01,0x18,0x0f,0x0b,0x07,0x84,0x0d,0x10,0x04,0x95,0x13,0x01,0x01,0x13,0x10,0x0e,0x0f,0x0d,0x1b,0x09,0x95,0x0b,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x39,0x2f,\r\n0x10,0xed,0x32,0x01,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0x02,0xe0,0xfd,0x20,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x01,0x30,\r\n0x01,0x18,0x01,0x46,0xb9,0x8d,0xfe,0x50,0x98,0xfe,0x29,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0xf2,0x04,0x18,0x00,0x14,0x00,0x21,0x00,0x72,0x40,0x4d,0xc9,0x21,0xd9,0x21,0x02,0x26,0x20,0x36,0x20,0x02,0xc9,0x1e,0xd9,0x1e,0x02,0x64,0x1e,0x01,0x45,0x1e,0x55,0x1e,0x02,0x44,0x1a,0x54,0x1a,0x02,\r\n0x68,0x0d,0x01,0xa7,0x0c,0x01,0xca,0x09,0xda,0x09,0x02,0x02,0x00,0x13,0x84,0x16,0x12,0x20,0x04,0x01,0x04,0x04,0x23,0x1c,0x83,0x0f,0x0b,0x1f,0x0b,0x02,0x0b,0x12,0x0f,0x10,0x19,0x95,0x0e,0x10,0x05,0x1f,0x95,0x08,0x16,0x04,0x1b,0x00,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0x5d,0xed,\r\n0x12,0x39,0x2f,0x5d,0x33,0x33,0xfd,0xce,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x15,0x23,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xf2,0xe2,0xa4,0x04,0x6b,0xf3,0xc1,0xe9,0x01,\r\n0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xa4,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0x98,0x98,0xfe,0x29,0x02,0x87,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfc,0x98,0x01,0x35,0x95,0x7e,0xae,0xdb,0xc7,0xb1,0xc9,0xc5,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0xc3,0x04,0x18,0x00,0x16,0x00,0x5d,0x40,0x0b,0x28,0x11,0x01,0x76,0x11,0x86,\r\n0x11,0x96,0x11,0x03,0x10,0xb8,0xff,0xe0,0x40,0x2f,0x10,0x14,0x48,0x05,0x10,0x15,0x10,0x25,0x10,0x03,0x86,0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x68,0x03,0x01,0x14,0x00,0x12,0x84,0x01,0x01,0x18,0x0b,0x07,0x84,0x09,0x14,0x95,0x16,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x09,0x15,0x01,0x1b,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,\r\n0x3f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0x32,0xce,0x31,0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x01,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x15,0x23,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xcb,0xcb,0xfe,0x29,0x04,0x1f,0x01,\r\n0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0xfe,0x26,0x98,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x2a,0x05,0xec,0x00,0x16,0x00,0x60,0x40,0x3e,0x7a,0x11,0x8a,0x11,0x02,0x10,0x18,0x10,0x14,0x48,0x09,0x10,0x19,0x10,0x29,0x10,0x03,0xc9,0x06,0xd9,0x06,0x02,0x06,0x10,0x1f,0x22,0x48,0x36,0x06,0x01,0x65,0x03,0x01,0x00,\r\n0x00,0x18,0x09,0x84,0x0b,0x07,0x07,0x18,0x15,0x01,0x84,0x12,0x08,0x08,0x0f,0x00,0x95,0x15,0x0f,0x13,0x00,0x0c,0x04,0x95,0x0f,0x16,0x0b,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x11,0x39,0x2f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x31,0x30,0x5d,0x5d,0x2b,0x5d,0x5d,0x2b,0x5d,0x01,0x21,0x11,0x10,\r\n0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x21,0x04,0x2a,0xfd,0x20,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xa4,0x02,0xe0,0x03,0x68,0xfe,0x50,0xfe,0xba,0xb9,0x8d,0x01,0x18,0xfd,0x30,0xaa,0xc2,0xd9,0xcd,0x04,0x5e,0xfe,0x14,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0xec,\r\n0x04,0x18,0x00,0x12,0x00,0x1f,0x00,0x67,0x40,0x46,0xc9,0x1f,0xd9,0x1f,0x02,0x26,0x1e,0x36,0x1e,0x02,0xc9,0x1c,0xd9,0x1c,0x02,0x45,0x1c,0x55,0x1c,0x02,0x44,0x18,0x54,0x18,0x02,0xa7,0x07,0x01,0xca,0x04,0xda,0x04,0x02,0x10,0x0e,0x84,0x14,0x0d,0x00,0x12,0x10,0x12,0x20,0x12,0x03,0x12,0x12,0x21,0x1a,0x83,0x1f,0x06,0x01,0x06,\r\n0x10,0x95,0x12,0x1b,0x0d,0x0f,0x0c,0x17,0x95,0x09,0x10,0x00,0x1d,0x95,0x03,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0x5d,0xed,0x12,0x39,0x2f,0x5d,0x33,0x33,0xfd,0xce,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x00,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x33,\r\n0x15,0x21,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x6c,0x04,0x6b,0xf3,0xc1,0xe9,0x01,0x00,0xd8,0xd2,0x5e,0x04,0xa4,0xdc,0xfe,0x80,0xa5,0x7f,0x94,0xac,0xa6,0x83,0x90,0xab,0xb0,0xc8,0x01,0x13,0xed,0xff,0x01,0x31,0xa6,0x8e,0xfa,0xc1,0x98,0x03,0xa4,0x95,0x7e,0xae,0xdb,0xc7,0xb1,0xc9,0xc5,0x00,\r\n0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x2a,0x05,0xec,0x00,0x09,0x00,0x26,0x40,0x13,0x09,0x06,0x09,0x06,0x0b,0x04,0x07,0x84,0x01,0x06,0x95,0x04,0x0f,0x02,0x00,0x09,0x95,0x01,0x15,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x03,0xf8,\r\n0xfc,0xae,0xa4,0x02,0xe0,0xfd,0x20,0x02,0xae,0x05,0xec,0xfe,0x14,0x98,0xfd,0x30,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0x2a,0x04,0x18,0x00,0x14,0x00,0x5c,0x40,0x0b,0x28,0x13,0x01,0x76,0x13,0x86,0x13,0x96,0x13,0x03,0x12,0xb8,0xff,0xe0,0x40,0x2f,0x10,0x14,0x48,0x05,0x12,0x15,0x12,0x25,0x12,0x03,0x86,0x06,0x96,0x06,0x02,0xe8,\r\n0x05,0x01,0x28,0x03,0x01,0x69,0x03,0x01,0x09,0x14,0x84,0x01,0x01,0x16,0x0d,0x07,0x84,0x0b,0x0e,0x04,0x95,0x11,0x10,0x0c,0x0f,0x09,0x95,0x0b,0x1b,0x01,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xc6,0x31,0x30,0x5d,0x71,0x5d,0x71,0x5d,0x2b,0x5d,0x71,0x21,0x23,0x11,0x10,0x23,0x22,\r\n0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0x02,0xe0,0xfc,0x7c,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfc,0x79,0x98,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x02,0x00,0xa6,0xfe,0x29,0x05,0x2b,0x04,0x18,0x00,0x0c,0x00,0x38,0x00,0x8c,0x40,0x5b,\r\n0x98,0x35,0x01,0x97,0x23,0x01,0x66,0x23,0x76,0x23,0x86,0x23,0x03,0x65,0x22,0x01,0x89,0x1e,0x01,0x96,0x15,0x01,0x87,0x15,0x01,0x5a,0x10,0x01,0x49,0x10,0x01,0x9a,0x0a,0x01,0x89,0x0a,0x01,0x78,0x0a,0x01,0x69,0x0a,0x01,0x97,0x07,0x01,0x66,0x03,0x76,0x03,0x86,0x03,0x03,0x28,0x27,0x25,0x84,0x0d,0x01,0x01,0x19,0x3a,0x05,0x84,\r\n0x33,0x1b,0x17,0x84,0x19,0x01,0x28,0x95,0x25,0x0d,0x0d,0x12,0x08,0x95,0x2e,0x16,0x1c,0x1d,0x1d,0x12,0x95,0x20,0x10,0x1a,0x0f,0x18,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x33,0x11,0x33,0x3f,0xed,0x11,0x39,0x2f,0xc4,0xfd,0xc4,0x01,0x2f,0xfd,0xc4,0xde,0xed,0x11,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x03,0xe9,0x80,0x58,0x67,\r\n0x4f,0x47,0x2e,0x41,0x28,0x12,0x03,0x2e,0x4e,0x69,0x3e,0x57,0x8b,0x62,0x35,0xa4,0xa4,0x04,0x40,0xd4,0x8a,0x5a,0x99,0x71,0x40,0x01,0x9a,0x9a,0x2c,0x56,0x80,0x54,0x45,0x74,0x54,0x2f,0x36,0x60,0x85,0x4f,0x01,0x5c,0x9e,0x6a,0x61,0x54,0x61,0x27,0x40,0x51,0x01,0x60,0x3a,0x5d,0x42,0x23,0x41,0x6b,0x88,0x47,0xfc,0x16,0x05,0xd7,\r\n0xb4,0x60,0x6c,0x38,0x67,0x90,0x57,0x98,0x9e,0x52,0x88,0x63,0x37,0x32,0x58,0x77,0x46,0x52,0x84,0x5c,0x31,0x00,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0xca,0x05,0xec,0x00,0x16,0x00,0x23,0x00,0x55,0x40,0x36,0x68,0x0f,0x01,0x4a,0x0f,0x5a,0x0f,0x02,0x48,0x0e,0x58,0x0e,0x02,0x68,0x09,0x01,0x5a,0x09,0x01,0x4d,0x09,0x01,0x66,0x05,\r\n0x01,0x55,0x05,0x01,0x43,0x05,0x01,0x01,0x00,0x15,0x84,0x12,0x17,0x17,0x25,0x1b,0x83,0x0c,0x01,0x17,0x95,0x12,0x15,0x0f,0x14,0x00,0x1e,0x95,0x07,0x16,0x00,0x3f,0xed,0x3f,0x3f,0xc4,0xfd,0xc4,0x01,0x2f,0xed,0x12,0x39,0x2f,0xc4,0xfd,0xcd,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,0x14,0x0e,\r\n0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x33,0x11,0x33,0x05,0x21,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x04,0xca,0xce,0x39,0x6f,0xa3,0x6b,0x7b,0xb8,0x79,0x3c,0x40,0x7b,0xb4,0x74,0x01,0x13,0xa8,0xce,0xfe,0x8a,0xfe,0xff,0xa7,0xa1,0x05,0x05,0xa1,0x8e,0x48,0x6b,0x45,0x22,0x03,0x76,0xfe,0x8d,\r\n0x69,0xc3,0x96,0x59,0x52,0x92,0xc8,0x75,0x70,0xba,0x84,0x49,0x01,0xec,0xfe,0x14,0x8a,0xba,0xb9,0xc8,0xc9,0x46,0x72,0x92,0x4b,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0xf8,0x05,0xec,0x00,0x11,0x00,0x4e,0xb3,0x37,0x10,0x01,0x10,0xb8,0xff,0xd0,0x40,0x2c,0x11,0x14,0x48,0x71,0x10,0x01,0x06,0x10,0x16,0x10,0x26,0x10,0x03,0x86,\r\n0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x68,0x03,0x01,0x11,0x84,0x01,0x01,0x13,0x0b,0x07,0x84,0x09,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x00,0x08,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x71,0x71,0x5d,0x5d,0x2b,0x71,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,\r\n0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0xc3,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0x76,0x04,0x00,0x00,0x05,0x00,0x1a,0x40,0x0c,0x01,0x01,0x07,0x05,0x84,0x03,0x04,0x0f,0x01,0x95,0x03,0x1b,\r\n0x00,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x11,0x33,0x2f,0x31,0x30,0x01,0x21,0x15,0x21,0x11,0x33,0x01,0x4a,0x01,0x2c,0xfe,0x30,0xa4,0xfe,0xc1,0x98,0x05,0xd7,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x0b,0x05,0xec,0x00,0x35,0x00,0x49,0x40,0x29,0x95,0x2c,0x01,0x87,0x2c,0x01,0x28,0x84,0x0d,0x35,0x84,0x01,0x33,0x0d,0x33,0x0d,0x33,0x1a,\r\n0x37,0x1c,0x18,0x84,0x1a,0x34,0x0f,0x1e,0x13,0x95,0x23,0x10,0x1c,0x00,0x19,0x1b,0x2e,0x95,0x03,0x08,0x16,0x00,0x15,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x3f,0xed,0x33,0x3f,0x01,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc4,0xed,0x10,0xed,0x31,0x30,0x5d,0x5d,0x21,0x23,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,\r\n0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x06,0x0b,0xa4,0x04,0x1a,0x38,0x44,0x51,0x32,0x61,0x80,0x4b,0x1f,0x0d,0x26,0x43,0x37,0x42,0x63,0x42,0x21,0xa4,0xa4,0x04,0x1e,0x41,0x4c,0x5b,0x36,0x54,0x6d,\r\n0x3f,0x18,0x0d,0x2d,0x54,0x47,0x3e,0x5a,0x3b,0x1d,0xa4,0xa2,0x2f,0x45,0x2f,0x17,0x43,0x7c,0xb0,0x6d,0x62,0x50,0x84,0x5f,0x35,0x43,0x6b,0x84,0x40,0xfc,0x0d,0x07,0xc3,0xfd,0x6a,0x30,0x49,0x31,0x18,0x41,0x77,0xa9,0x68,0x71,0x51,0x86,0x60,0x35,0x43,0x69,0x80,0x3c,0x02,0x26,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0xb0,0x06,0x02,\r\n0x00,0x15,0x00,0x25,0x00,0xc7,0x40,0x64,0x96,0x1a,0x01,0x96,0x16,0x01,0x48,0x0a,0x58,0x0a,0x02,0x49,0x06,0x59,0x06,0x02,0x5a,0x05,0x01,0x49,0x05,0x01,0x56,0x03,0x01,0x45,0x03,0x01,0x56,0x02,0x01,0x47,0x02,0x01,0x79,0x0c,0x99,0x0c,0x02,0x4c,0x0c,0x5c,0x0c,0x02,0x38,0x0c,0x01,0x0c,0x23,0x0d,0x20,0xb5,0x11,0xc5,0x11,0x02,\r\n0x87,0x11,0x01,0x62,0x11,0x01,0x47,0x11,0x57,0x11,0x02,0x46,0x14,0x56,0x14,0x02,0x11,0x14,0x10,0x12,0x12,0x00,0x83,0x10,0x20,0x20,0x20,0x30,0x20,0x03,0x20,0x20,0x08,0x27,0xe9,0x0f,0x01,0x0f,0x10,0x0d,0x12,0x48,0x0f,0x10,0xb8,0xff,0xc0,0x40,0x21,0x0e,0x12,0x48,0x10,0x36,0x0e,0x01,0x0e,0x0d,0x0d,0x18,0x83,0x20,0x08,0x01,\r\n0x08,0x14,0x23,0x95,0x0f,0x10,0x0d,0x03,0x0e,0x0c,0x11,0x0f,0x0e,0x00,0x1c,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x3f,0xc5,0x12,0x17,0x39,0xfd,0xc4,0x01,0x2f,0x5d,0xed,0x33,0x2f,0x33,0x5d,0xcd,0x2b,0x32,0x2b,0x5d,0x11,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x39,0x5d,0x5d,\r\n0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x01,0x37,0x17,0x07,0x01,0x21,0x15,0x23,0x16,0x25,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x37,0x36,0x35,0x26,0x27,0x27,0x23,0x22,0x04,0x50,0x85,0x8b,0xee,0xe7,0x87,0x84,0x89,0x78,0xce,0xfe,0x55,\r\n0x97,0x88,0x43,0x01,0xda,0x01,0x76,0xd9,0x78,0xfd,0x14,0x5b,0x54,0x5c,0xa6,0xab,0x54,0x4b,0x01,0x8c,0x2c,0x5b,0xd6,0x02,0x04,0xf1,0x93,0x98,0x94,0x8f,0xe9,0xfb,0x88,0x78,0x0f,0x01,0x21,0xe3,0x5a,0x65,0xfe,0xbd,0x8a,0x96,0x2c,0x69,0xa9,0xab,0x6a,0x73,0x74,0x66,0xb2,0xe6,0x73,0x1f,0x00,0x01,0x00,0x90,0xfe,0x29,0x03,0xe2,\r\n0x05,0xec,0x00,0x11,0x00,0x37,0x40,0x21,0x76,0x0b,0x01,0x67,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x84,0x03,0x01,0x0f,0x09,0x84,0x07,0x11,0x0f,0x09,0x00,0x0c,0x95,0x02,0x05,0x16,0x00,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x2f,0xc4,0x33,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x23,0x11,\r\n0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xfe,0x29,0x02,0x79,0xba,0x01,0xb4,0x04,0x50,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x11,0x00,0x98,0x40,0x2c,0x75,0x10,\r\n0x01,0x92,0x10,0x01,0x82,0x10,0x01,0x6a,0x03,0x01,0x75,0x10,0x01,0x01,0x15,0x09,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x00,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,\r\n0x06,0x4d,0x01,0x01,0x13,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,\r\n0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xa4,0xee,0x78,0xa4,0xa4,0xa4,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfd,0xbc,0x05,0xec,0xfd,0x6a,0xc2,\r\n0xfe,0x5f,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0xb2,0x05,0xc6,0x00,0x14,0x00,0x2f,0x00,0x93,0x40,0x5d,0x99,0x27,0x01,0x46,0x24,0x01,0x37,0x1d,0x01,0x9a,0x12,0x01,0x85,0x08,0x01,0x78,0x15,0x88,0x15,0x02,0x75,0x07,0x01,0x66,0x07,0x01,0x84,0x1a,0x01,0x00,0x1a,0x05,0x91,0x19,0x01,0x19,0x2f,0x2f,0x2a,0x0f,0x99,0x17,0x01,0x17,\r\n0x90,0x18,0x01,0x18,0x16,0x15,0x15,0x05,0x83,0x0f,0x2a,0x01,0x2a,0x21,0x1f,0x84,0x0f,0x0f,0x01,0x0f,0x6c,0x00,0x7c,0x00,0x02,0x4a,0x00,0x5a,0x00,0x02,0x00,0x2f,0x19,0x15,0x18,0x04,0x16,0x1a,0x1a,0x16,0x0a,0x95,0x23,0x25,0x16,0x20,0x15,0x16,0x00,0x00,0x3f,0x3f,0x3f,0x33,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0x33,0x5d,0x5d,\r\n0x01,0x2f,0x5d,0xed,0xc4,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xcd,0x5d,0x32,0x5d,0x11,0x12,0x39,0x2f,0xcd,0x5d,0x11,0x39,0x39,0x5d,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x34,0x2e,0x02,0x01,0x37,0x17,0x07,0x05,0x07,0x1e,0x03,0x15,0x11,0x23,\r\n0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0xf0,0x48,0x5c,0x35,0x14,0x25,0x41,0x56,0x32,0x47,0x6b,0x47,0x24,0x2c,0x4d,0x69,0xfe,0x4e,0x6e,0x8f,0x37,0x01,0x89,0x71,0x49,0x7f,0x5d,0x35,0xa4,0x04,0x62,0xc6,0x54,0x8d,0x67,0x3a,0x29,0x5b,0x91,0x67,0x03,0x73,0x44,0x80,0x78,0x73,0x36,0x47,0x6a,0x47,0x24,\r\n0x33,0x5a,0x78,0x45,0x28,0x56,0x79,0x5a,0x45,0x01,0x9e,0xd6,0x3c,0x63,0xda,0x75,0x29,0x5a,0x72,0x8e,0x5b,0xfe,0x06,0xa2,0xba,0x32,0x64,0x95,0x63,0x5a,0xaa,0xaa,0xad,0x5d,0x00,0x01,0x00,0xa6,0xfe,0x29,0x04,0xd4,0x04,0x18,0x00,0x14,0x00,0x58,0x40,0x0b,0x28,0x10,0x01,0x76,0x10,0x86,0x10,0x96,0x10,0x03,0x0f,0xb8,0xff,0xe0,\r\n0x40,0x2c,0x10,0x14,0x48,0x05,0x0f,0x15,0x0f,0x25,0x0f,0x03,0x86,0x05,0x96,0x05,0x02,0x28,0x02,0x01,0x68,0x02,0x01,0x14,0x12,0x84,0x01,0x01,0x16,0x0a,0x06,0x84,0x09,0x0c,0x03,0x95,0x0e,0x10,0x0a,0x0f,0x08,0x15,0x12,0x95,0x00,0x1b,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xfd,0xcd,0x31,\r\n0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x01,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x15,0x03,0x54,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xdc,0xfe,0x29,0x04,0x1f,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0xfc,0x4f,0x98,0x00,0x00,0x02,\r\n0x00,0x60,0xff,0xe8,0x03,0x89,0x06,0x02,0x00,0x20,0x00,0x31,0x00,0x79,0x40,0x4c,0x49,0x2d,0x59,0x2d,0x02,0x76,0x24,0x86,0x24,0x96,0x24,0x03,0x67,0x24,0x01,0x75,0x12,0x01,0x66,0x12,0x01,0x86,0x0d,0x01,0x77,0x0d,0x01,0x49,0x03,0x59,0x03,0x99,0x03,0x03,0x2f,0x10,0x21,0x1f,0x01,0x1c,0x09,0x09,0x13,0x84,0x15,0x2b,0x2b,0x33,\r\n0x21,0x84,0x1c,0x00,0x00,0x0f,0x1c,0x01,0x1c,0x26,0x95,0x17,0x19,0x16,0x14,0x15,0x09,0x0b,0x95,0x08,0x06,0x01,0x1f,0x2f,0x95,0x10,0x01,0x10,0x00,0x3f,0xc4,0xfd,0xc4,0x3f,0x33,0xed,0x32,0x3f,0x3f,0x33,0xed,0x01,0x2f,0x5d,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xc4,0xed,0x32,0x2f,0x12,0x39,0x39,0x12,0x39,0x39,0x31,0x30,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x07,0x33,0x20,0x11,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x10,0x21,0x23,0x06,0x06,0x60,0x5a,0x21,0x77,0xa0,0xc0,0x6b,0x43,0x29,0x34,0x3e,0x50,\r\n0x8a,0x71,0x55,0x19,0x5e,0x01,0xcd,0xa4,0x04,0x6a,0xd1,0x99,0xad,0x17,0x1d,0x34,0xa8,0x1c,0x33,0x48,0x2d,0x3f,0x68,0x4a,0x28,0xfe,0xc9,0x78,0x1b,0x13,0x04,0x18,0x62,0xb1,0x87,0x50,0x0a,0x8d,0x0d,0x3c,0x63,0x7e,0x43,0xfe,0x1e,0xfd,0xca,0xa0,0xb8,0xde,0xe0,0x8d,0xf3,0x68,0xfe,0x24,0x53,0x78,0x4f,0x26,0x30,0x52,0x6e,0x3e,\r\n0x85,0x01,0x69,0x61,0xec,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x04,0xaf,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x28,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x13,0x84,0x03,0x01,0x0f,0x0f,0x15,0x09,0x84,0x07,0x12,0x95,0x10,0x00,0x09,0x0f,0x0c,0x95,0x02,0x05,0x16,0x00,0x15,0x00,0x3f,\r\n0x3f,0x33,0xed,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xc4,0x32,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x15,0x23,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x01,0x71,0xcd,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,\r\n0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0x98,0x00,0x01,0xff,0x70,0xfe,0x29,0x01,0x80,0x04,0x00,0x00,0x0a,0x00,0x16,0x40,0x0a,0x0a,0x84,0x05,0x09,0x09,0x0f,0x06,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xce,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x11,0x11,0x33,0x01,0x80,0xcb,0xb5,0x90,0x8c,0xe0,0xa4,0x09,\r\n0xe8,0xf8,0x98,0x01,0x3b,0x04,0x04,0x00,0x00,0x01,0xff,0xf6,0xff,0xe8,0x04,0x0b,0x05,0xec,0x00,0x13,0x00,0x3e,0x40,0x25,0x9a,0x10,0x01,0x8b,0x10,0x01,0x29,0x10,0x01,0x76,0x03,0x01,0x67,0x03,0x01,0x13,0x01,0x84,0x11,0x0d,0x0b,0x09,0x84,0x07,0x0c,0x04,0x95,0x0f,0x16,0x0a,0x15,0x09,0x0f,0x12,0x95,0x01,0x00,0x00,0x3f,0xed,\r\n0x3f,0x3f,0x3f,0xed,0x33,0x01,0x2f,0xed,0xc4,0x32,0x2f,0xed,0xce,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x03,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x23,0x0a,0x01,0x66,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xc3,0x05,0xec,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,\r\n0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0x00,0x01,0x00,0x60,0xfe,0x29,0x03,0xc6,0x04,0x18,0x00,0x2f,0x00,0x71,0x40,0x49,0x66,0x2d,0x76,0x2d,0x02,0x79,0x2b,0x01,0x48,0x22,0x58,0x22,0x02,0x9a,0x03,0x01,0x89,0x03,0x01,0x99,0x02,0x01,0x88,0x02,0x01,0x93,0x0f,0x01,0x64,0x0f,0x74,0x0f,0x84,0x0f,0x03,0x0f,0x13,0x1a,0x1a,0x0a,\r\n0x84,0x9c,0x25,0x01,0x8b,0x25,0x01,0x6c,0x25,0x01,0x25,0x20,0x29,0x29,0x31,0x13,0x84,0x20,0x2f,0x84,0x00,0x00,0x20,0x19,0x95,0x1b,0x1b,0x00,0x00,0x2c,0x95,0x05,0x10,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x5d,0x5d,0x5d,0xed,0x32,0x2f,0x11,0x39,0x5d,0x5d,0x31,0x30,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x60,0x44,0x76,0x9e,0x5b,0x5b,0x9e,0x76,0x44,0x3d,0x63,0x80,0x84,0x80,0x63,0x3d,0x1a,0x33,0x49,0x30,0x01,0xfe,0xfd,\r\n0xf1,0x51,0x7f,0x58,0x2f,0x3d,0x63,0x80,0x84,0x80,0x63,0x3d,0x8c,0x85,0x85,0x8c,0x02,0x89,0x5c,0x94,0x67,0x38,0x38,0x67,0x94,0x5c,0x5c,0x8e,0x6e,0x57,0x4b,0x46,0x4d,0x5b,0x3b,0x24,0x3d,0x2e,0x1a,0x94,0x30,0x57,0x77,0x48,0x4e,0x77,0x5d,0x4d,0x48,0x4a,0x5c,0x72,0x4b,0x7e,0x86,0x86,0x7e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,\r\n0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x98,0x40,0x2c,0x75,0x11,0x01,0x92,0x10,0x01,0x82,0x10,0x01,0x6a,0x03,0x01,0x75,0x10,0x01,0x01,0x15,0x09,0x15,0x0a,0x0f,0x0c,0x04,0x95,0x0f,0x10,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x01,0xb8,0xff,0xf6,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,\r\n0xf8,0xb3,0x0c,0x06,0x4d,0x01,0xb8,0xff,0xf8,0x40,0x1e,0x0b,0x06,0x4d,0x01,0x01,0x14,0x0c,0x08,0x06,0x0d,0x06,0x4d,0x08,0x06,0x0c,0x06,0x4d,0x08,0x06,0x0b,0x06,0x4d,0x08,0x84,0x09,0x02,0x0d,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb3,0x0c,0x06,0x4d,0x09,0xb8,0xff,0xfe,0xb6,0x0b,0x06,0x4d,0x09,0x2f,0x14,0x01,0x5d,0x2f,0x2b,0x2b,\r\n0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x32,0x3f,0x3f,0x3f,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,\r\n0x02,0x48,0x01,0x46,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd9,0xcd,0x00,0x01,0x00,0x60,0xfe,0x29,0x02,0xec,0x04,0x1c,0x00,0x29,0x00,0x6a,0x40,0x41,0xb7,0x29,0x01,0xa6,0x29,0x01,0x88,0x25,0x01,0x9a,0x1f,0x01,0x89,0x1f,0x01,0x99,0x1e,0x01,0x8a,0x1e,0x01,0x65,0x0a,0x01,0x47,0x09,0x01,0x67,0x08,0x01,0x67,0x01,0x01,0x27,\r\n0x28,0x28,0x29,0x95,0x29,0x01,0x29,0x11,0x11,0x03,0x84,0x26,0x23,0x23,0x2b,0x0e,0x84,0x16,0x23,0x03,0x11,0x29,0x28,0x95,0x26,0x27,0x10,0x11,0x95,0x12,0x1b,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x2f,0x32,0x5d,0x11,0x33,0x2f,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x07,0x06,0x06,0x15,0x14,0x33,0x21,0x15,0x21,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x37,0x36,0x36,0x35,0x34,0x27,0x01,0x25,0x17,0x07,0x02,0x64,0x11,0x13,0x34,0x3b,0x31,0x46,0x3a,0x38,0x22,0x0b,0x12,0x4e,0x01,0xad,0xfe,0x53,0x73,0x6c,0x06,\r\n0x0d,0x15,0x0f,0x1b,0x4c,0x56,0x58,0x27,0x14,0x10,0x0c,0xfe,0x9c,0x01,0x07,0x5f,0x8d,0x01,0xa4,0x19,0x37,0x23,0x29,0x61,0x3b,0x30,0x48,0x41,0x41,0x29,0x0e,0x2b,0x0e,0x45,0x94,0x68,0x70,0x0c,0x24,0x28,0x29,0x13,0x22,0x54,0x59,0x58,0x27,0x13,0x26,0x10,0x19,0x12,0x02,0x08,0xbd,0x84,0x66,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,\r\n0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x5b,0x40,0x38,0x9c,0x1e,0x01,0x85,0x0c,0x01,0x66,0x0c,0x76,0x0c,0x02,0x86,0x03,0x01,0x77,0x03,0x01,0x66,0x03,0x01,0x02,0x84,0x1f,0x08,0x16,0x14,0x12,0x84,0x10,0x1b,0x0b,0x84,0x08,0x05,0x95,0x1d,0x9d,0x1b,0x01,0x48,0x1b,0x58,0x1b,0x02,0x1b,0x15,0x0d,0x95,0x18,0x16,0x13,0x1b,0x11,0x01,\r\n0x0a,0x0f,0x00,0x3f,0xc4,0xc4,0x3f,0x3f,0xed,0x33,0x33,0x5d,0x5d,0xd4,0xed,0x01,0x2f,0xed,0x33,0xdc,0xed,0xc4,0x33,0x10,0xdc,0xed,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x11,0x23,0x06,0x23,0x22,0x26,0x27,0x06,\r\n0x23,0x20,0x11,0x90,0xa4,0x69,0x7c,0x69,0x93,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6d,0xd1,0x69,0x9c,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xaa,0x98,0xc0,0x86,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb5,0x91,0x02,0x48,0xfa,0x29,0x02,0x79,0xba,0x75,0x5f,0xd4,0x01,0xa1,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x04,0x04,0x18,\r\n0x00,0x2d,0x00,0x44,0x00,0x86,0x40,0x57,0x66,0x40,0x01,0x67,0x3e,0x01,0x94,0x39,0x01,0x76,0x39,0x86,0x39,0x02,0x69,0x36,0x01,0x5a,0x29,0x01,0x49,0x29,0x01,0x67,0x17,0x01,0x93,0x16,0x01,0x86,0x16,0x01,0x75,0x16,0x01,0x66,0x16,0x01,0x95,0x15,0x01,0x85,0x14,0x01,0x77,0x0f,0x01,0x75,0x0e,0x01,0x89,0x02,0x99,0x02,0x02,0x1f,\r\n0x1f,0x11,0x84,0x33,0x2e,0x42,0x84,0x00,0x00,0x07,0x33,0x33,0x26,0x46,0x3b,0x84,0x07,0x07,0x1b,0x84,0x26,0x2e,0x38,0x1f,0x95,0x21,0x1b,0x38,0x95,0x0c,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x2f,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x3e,0x03,0x17,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x04,0x15,0x14,0x06,\r\n0x01,0x5c,0x22,0x32,0x3c,0x32,0x22,0x43,0x78,0xa6,0x64,0x64,0xa8,0x78,0x43,0x4d,0x7d,0xa0,0xa6,0xa0,0x3e,0x10,0x15,0x2f,0x33,0x02,0xb1,0xfd,0x4f,0x39,0x5a,0x3f,0x21,0x28,0x23,0x3c,0x46,0x25,0x0a,0x6e,0x43,0x90,0x78,0x4d,0x2a,0x4d,0x6b,0x41,0x96,0x8f,0x1e,0x2e,0x34,0x2e,0x1e,0x0b,0x01,0x01,0x29,0x45,0x40,0x40,0x48,0x55,\r\n0x35,0x58,0x81,0x55,0x29,0x39,0x65,0x8d,0x54,0x54,0x9b,0x8f,0x87,0x7f,0x7a,0x3b,0x0f,0x2d,0x0e,0x23,0x36,0x94,0x23,0x40,0x5b,0x38,0x2d,0x51,0x20,0x35,0x54,0x4b,0x48,0x43,0x3a,0x70,0x77,0x84,0x4e,0x3b,0x60,0x44,0x25,0x68,0x6a,0x23,0x41,0x3e,0x3d,0x41,0x45,0x27,0x2a,0x44,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x87,0x04,0x18,\r\n0x00,0x17,0x00,0x55,0x40,0x31,0x86,0x10,0x96,0x10,0x02,0x75,0x10,0x01,0x6a,0x03,0x01,0x59,0x03,0x01,0x06,0x14,0x01,0x14,0x00,0x15,0x15,0x12,0x84,0x02,0x00,0x00,0x07,0x02,0x02,0x09,0x19,0x0d,0x0b,0x07,0x84,0x09,0x00,0x14,0x95,0x09,0x17,0x15,0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x00,0x3f,0x3f,0xed,0x33,0x3f,0xc4,0xed,0x39,\r\n0x01,0x2f,0xfd,0xc4,0x33,0x11,0x12,0x39,0x2f,0x12,0x39,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x25,0x24,0x11,0x10,0x25,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x21,0x15,0x21,0x02,0x5b,0x01,0x17,0xfe,0xfe,0x85,0xa1,0xa4,0xa4,0x04,0x74,0xe6,0x9e,0xd0,\r\n0xc0,0x01,0x31,0xfd,0xd4,0x47,0x95,0x01,0x63,0x01,0x3e,0x11,0xb9,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xea,0xf0,0xf7,0xbb,0x8c,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x03,0xe2,0x04,0x00,0x00,0x11,0x00,0xa5,0x40,0x3c,0x79,0x06,0x01,0x9b,0x06,0x01,0x8b,0x06,0x01,0x66,0x0b,0x01,0x56,0x0b,0x01,0x79,0x06,0x01,0x0d,0x10,0x0b,0x0c,\r\n0x00,0x4c,0x38,0x03,0x01,0x01,0x15,0x03,0x0c,0x95,0x05,0x16,0x10,0x0f,0x08,0x0f,0x01,0x00,0x06,0x0d,0x06,0x4d,0x00,0x06,0x0c,0x06,0x4d,0x00,0x06,0x0b,0x06,0x4d,0x00,0x84,0x7f,0x0f,0x01,0x0f,0xb8,0xff,0xfa,0xb3,0x0d,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0xb3,0x0c,0x06,0x4d,0x0f,0xb8,0xff,0xfc,0x40,0x2a,0x0b,0x06,0x4d,0x0f,0x0f,\r\n0x13,0x0a,0x06,0x0d,0x06,0x4d,0x0a,0x06,0x0c,0x06,0x4d,0x0a,0x06,0x0b,0x06,0x4d,0x0a,0x84,0x07,0x0a,0x0d,0x06,0x4d,0x07,0x06,0x0c,0x06,0x4d,0x07,0x02,0x0b,0x06,0x4d,0x07,0x2f,0x13,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x33,0x00,0x3f,0x3f,0x3f,0xed,0x32,\r\n0x3f,0x5d,0x31,0x30,0x2b,0x01,0x5d,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x90,0xfe,0x29,\r\n0x04,0xbe,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x28,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x00,0x12,0x84,0x03,0x01,0x0f,0x0f,0x15,0x09,0x84,0x07,0x11,0x00,0x09,0x0f,0x0c,0x95,0x02,0x05,0x16,0x13,0x95,0x01,0x1b,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,\r\n0xc4,0x33,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x33,0x04,0xbe,0xfe,0x80,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0xa4,0xdc,0xfe,0x29,0x02,0x79,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xf8,0xd5,\r\n0x00,0x01,0x00,0x8f,0xff,0xe8,0x06,0x17,0x04,0x18,0x00,0x26,0x00,0x53,0x40,0x33,0x94,0x24,0x01,0x85,0x16,0x01,0x66,0x16,0x76,0x16,0x02,0x9c,0x11,0x01,0x79,0x03,0x89,0x03,0x02,0x68,0x03,0x01,0x14,0x84,0x12,0x1c,0x1e,0x09,0x84,0x1c,0x00,0x84,0x02,0x0b,0x1c,0x20,0x04,0x95,0x23,0x10,0x14,0x1d,0x0f,0x17,0x95,0x0d,0x10,0x16,\r\n0x01,0x0a,0x15,0x00,0x3f,0xc4,0x3f,0x33,0xed,0x3f,0xc4,0x3f,0xed,0x33,0x01,0x2f,0xc4,0xdc,0xed,0x10,0xfd,0xc4,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x33,\r\n0x36,0x36,0x33,0x32,0x16,0x15,0x06,0x17,0xa4,0xd0,0x39,0x5e,0x42,0x25,0xa4,0x04,0x33,0x8b,0x60,0xfe,0xb0,0xa3,0xda,0x36,0x5a,0x41,0x24,0xa4,0x04,0x3a,0x9c,0x5c,0x96,0xa6,0x02,0x48,0x01,0x46,0x33,0x56,0x71,0x3e,0xfd,0xaa,0xa2,0x5e,0x5c,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x34,0x58,0x74,0x40,0x02,0x4e,0xaa,0x61,0x61,\r\n0xd8,0xce,0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0xf8,0x04,0x18,0x00,0x12,0x00,0x53,0x40,0x0b,0x28,0x11,0x01,0x76,0x11,0x86,0x11,0x96,0x11,0x03,0x10,0xb8,0xff,0xe0,0x40,0x29,0x10,0x14,0x48,0x05,0x10,0x15,0x10,0x25,0x10,0x03,0x86,0x06,0x96,0x06,0x02,0x28,0x03,0x01,0x69,0x03,0x01,0x12,0x84,0x01,0x01,0x14,0x0b,0x07,0x84,0x09,\r\n0x0c,0x04,0x95,0x0f,0x10,0x0a,0x0f,0x09,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x5d,0x71,0x71,0x5d,0x2b,0x5d,0x71,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0xa4,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,\r\n0xdc,0xa8,0xb2,0x02,0x48,0x01,0x46,0xb9,0x8d,0xfb,0xe1,0x05,0xd7,0xaa,0xc2,0xd9,0xcd,0x00,0x00,0x02,0x00,0x60,0xfe,0x1e,0x04,0x10,0x04,0x18,0x00,0x28,0x00,0x3d,0x00,0x70,0x40,0x47,0x55,0x31,0x01,0x46,0x31,0x01,0x45,0x2b,0x01,0x5a,0x21,0x01,0x7a,0x1b,0x01,0x69,0x1b,0x01,0x38,0x12,0x01,0x74,0x0e,0x01,0x9a,0x08,0x01,0x89,\r\n0x08,0x01,0x8a,0x07,0x01,0x54,0x02,0x01,0x45,0x02,0x01,0x27,0x15,0x00,0x84,0x38,0x38,0x1e,0x3f,0x0b,0x83,0x0a,0x0a,0x2e,0x83,0x1e,0x28,0x0f,0x29,0x95,0x25,0x23,0x10,0x33,0x95,0x17,0x0b,0x19,0x16,0x10,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0xce,0x33,0xed,0x3f,0x33,0xed,0x3f,0x01,0x2f,0xed,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,\r\n0xed,0xc4,0xc4,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x10,0x00,0x23,0x22,0x2e,0x04,0x35,0x33,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x35,0x33,0x05,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,\r\n0x35,0x35,0x34,0x2e,0x02,0x04,0x10,0xfe,0xf7,0xf5,0x20,0x59,0x60,0x5f,0x4b,0x2f,0xa8,0x35,0x4f,0x5d,0x27,0x51,0x81,0x5a,0x30,0x04,0x75,0xeb,0x6a,0x9f,0x6a,0x35,0x38,0x73,0xb1,0x79,0xcf,0x64,0x04,0xa4,0xfe,0x3c,0x58,0x7b,0x4e,0x23,0x24,0x4a,0x71,0x4e,0x48,0x73,0x51,0x2b,0x2c,0x4e,0x69,0x52,0xfe,0xe6,0xfe,0xe6,0x0d,0x20,\r\n0x35,0x52,0x70,0x4a,0x3f,0x57,0x35,0x17,0x32,0x65,0x96,0x65,0x70,0xc4,0x50,0x89,0xb7,0x67,0x74,0xcf,0x9b,0x5b,0xa6,0x8e,0x72,0x44,0x74,0x98,0x54,0x4a,0x88,0x68,0x3e,0x38,0x5f,0x7f,0x47,0x97,0x3c,0x6b,0x51,0x30,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0x02,0x04,0x00,0x00,0x05,0x00,0x1a,0x40,0x0c,0x01,0x01,0x07,0x00,0x84,0x03,\r\n0x05,0x0f,0x00,0x95,0x03,0x15,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x25,0x21,0x15,0x21,0x11,0x33,0x01,0x4a,0x01,0xb8,0xfd,0xa4,0xa4,0x98,0x98,0x04,0x00,0x00,0x00,0x01,0x00,0x8f,0xfe,0x29,0x06,0x17,0x05,0xec,0x00,0x26,0x00,0x55,0x40,0x35,0x94,0x24,0x01,0x85,0x16,0x01,0x66,0x16,0x76,0x16,0x02,0x9c,\r\n0x11,0x01,0x79,0x03,0x89,0x03,0x02,0x68,0x03,0x01,0x14,0x84,0x12,0x1c,0x1e,0x09,0x84,0x1c,0x00,0x84,0x02,0x0b,0x1c,0x20,0x04,0x95,0x23,0x10,0x1d,0x00,0x14,0x0f,0x17,0x95,0x0d,0x10,0x16,0x0a,0x1b,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x33,0xed,0x3f,0x3f,0x3f,0xed,0x33,0x01,0x2f,0xc4,0xdc,0xed,0x10,0xfd,0xc4,0x10,0xdc,0xed,0x31,\r\n0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x23,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x06,0x17,0xa4,0xd0,0x39,0x5e,0x42,0x25,0xa4,0x04,0x33,0x8b,0x60,0xfe,0xb0,0xa3,0xda,0x36,0x5a,0x41,\r\n0x24,0xa4,0x04,0x3a,0x9c,0x5c,0x96,0xa6,0x02,0x48,0x01,0x46,0x33,0x56,0x71,0x3e,0xfb,0xd3,0x02,0x79,0x5e,0x5c,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x34,0x58,0x74,0x40,0x04,0x3a,0xfd,0x6a,0x61,0x61,0xd8,0xce,0x00,0x02,0x00,0x00,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x62,0x40,0x3b,0x4a,0x21,0x5a,0x21,\r\n0x02,0x43,0x1f,0x53,0x1f,0x02,0x66,0x09,0x76,0x09,0x02,0x12,0x12,0x0a,0x83,0x20,0x20,0x17,0x27,0x05,0x03,0x1a,0x14,0x0f,0x11,0x84,0x01,0x00,0x17,0x11,0x01,0x95,0x17,0x00,0x14,0x10,0x14,0x20,0x14,0x03,0x14,0x16,0x1b,0x1d,0x95,0x0f,0x0d,0x16,0x23,0x95,0x04,0x07,0x10,0x02,0x0f,0x00,0x3f,0x3f,0x33,0xed,0x3f,0x33,0xed,0x3f,\r\n0xdd,0x5d,0xc4,0xfd,0xc4,0x01,0x2f,0xcd,0xc4,0xfd,0x32,0xc4,0xc4,0xc4,0x32,0x11,0x12,0x39,0x2f,0xed,0x32,0x2f,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x15,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x01,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,\r\n0x22,0x06,0xa6,0xa4,0x04,0x79,0xe9,0xc6,0xde,0xfa,0xd9,0xc7,0x6c,0x04,0x03,0x0a,0xfc,0xf6,0xa4,0xa6,0x01,0x4a,0xa5,0x7f,0x95,0xa9,0x9e,0x87,0x8f,0xae,0xa7,0x04,0xa7,0xb4,0xcc,0xfe,0xed,0xe7,0xfe,0xff,0xfe,0xcb,0xac,0xfe,0xc5,0x98,0x98,0x98,0x03,0x70,0x8f,0x7f,0xb1,0xe4,0xcb,0xab,0xc2,0xc7,0x00,0x02,0x00,0x60,0xff,0xe8,\r\n0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x85,0x40,0x1f,0x19,0x40,0x0b,0x02,0x4d,0x12,0x95,0x00,0x16,0x0c,0x95,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x0b,0x0c,0x06,0x4d,0x20,0x15,0x30,0x15,0x90,\r\n0x15,0x03,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,\r\n0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x18,0x01,0x1f,0xed,\r\n0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x03,0x00,0x60,0xfe,0x29,0x05,0x1f,0x05,0xec,0x00,0x0a,0x00,0x2f,0x00,0x38,0x00,0x93,0x40,0x5e,0x45,0x2d,0x01,0x46,0x2c,0x01,0x95,0x27,0x01,0x76,0x27,0x01,0x99,0x1c,0x01,0x96,0x16,0x01,0x34,0x16,0x01,0x25,0x16,0x01,\r\n0x14,0x16,0x01,0x05,0x16,0x01,0x96,0x15,0x01,0x49,0x10,0x01,0x4c,0x0f,0x01,0x5b,0x08,0x01,0x3a,0x08,0x01,0x29,0x08,0x01,0x39,0x03,0x49,0x03,0x69,0x03,0x03,0x1e,0x83,0x30,0x19,0x2a,0x83,0x00,0x2f,0x05,0x25,0x84,0x19,0x12,0x83,0x13,0x35,0x0d,0x19,0x13,0x13,0x06,0x19,0x19,0x05,0x0d,0x36,0x95,0x25,0x35,0x24,0x00,0x18,0x06,\r\n0x95,0x2f,0x0d,0x13,0x0b,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x2f,0x01,0x2f,0xc4,0xc4,0xde,0xed,0x10,0xfd,0xc4,0xc4,0xdc,0xed,0x10,0xdc,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x34,0x2e,0x02,0x27,0x11,0x3e,\r\n0x03,0x01,0x23,0x11,0x2e,0x03,0x35,0x33,0x14,0x1e,0x02,0x17,0x11,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x14,0x1e,0x02,0x17,0x11,0x22,0x06,0x04,0x6f,0x29,0x53,0x7d,0x54,0x4c,0x7b,0x57,0x2f,0xfe,0xb3,0xa8,0x71,0xc5,0x91,0x53,0xb1,0x38,0x62,0x84,0x4b,0x6d,0x9c,0x63,0x2f,0x37,\r\n0x69,0x99,0x62,0xa8,0x80,0xbf,0x7f,0x3f,0x4e,0x89,0xba,0x6c,0xfe,0x6d,0x29,0x43,0x54,0x2b,0x7c,0x6f,0x01,0xe9,0x3f,0x64,0x50,0x40,0x1b,0xfd,0x4f,0x0b,0x32,0x55,0x7c,0xfc,0x95,0x01,0xc2,0x07,0x49,0x84,0xbd,0x7d,0x50,0x83,0x60,0x3a,0x08,0x02,0xde,0x1e,0x47,0x56,0x67,0x3c,0x46,0x6f,0x4e,0x29,0xfd,0xea,0x1e,0x61,0x7c,0x9b,\r\n0x57,0x7e,0xb7,0x7b,0x42,0x0a,0x04,0xd7,0x30,0x3b,0x2e,0x22,0x0d,0x01,0x56,0x4f,0x00,0x01,0x00,0x90,0xff,0xe8,0x05,0x5e,0x05,0xec,0x00,0x13,0x00,0x42,0x40,0x27,0x76,0x0b,0x01,0x67,0x0b,0x01,0x8b,0x06,0x9b,0x06,0x02,0x28,0x06,0x01,0x11,0x84,0x03,0x01,0x0f,0x13,0x0f,0x13,0x15,0x09,0x84,0x07,0x11,0x0f,0x09,0x00,0x0c,0x95,\r\n0x02,0x05,0x16,0x12,0x95,0x01,0x15,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x3f,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xc4,0x33,0xed,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x21,0x21,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x21,0x05,0x5e,0xfd,0xe0,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,\r\n0x9b,0xa4,0x01,0x7c,0xa2,0xba,0x01,0xb4,0x04,0x50,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x98,0x00,0x02,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x00,0x0b,0x00,0x17,0x00,0x36,0x40,0x12,0x00,0xb0,0x06,0x10,0x12,0xb0,0x0c,0x13,0x09,0x03,0x15,0xaf,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0xb8,0xff,0xec,0xb3,0x0c,0x06,0x4d,0x0f,\r\n0xb8,0xff,0xec,0xb6,0x0b,0x06,0x4d,0x0f,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x71,0xe1,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xdf,0x2e,0x41,0x41,0x2e,0x2f,0x42,0x42,0x2f,0x2e,0x41,0x41,0x2e,0x2f,\r\n0x42,0x42,0x03,0x38,0x42,0x2e,0x2e,0x40,0x40,0x2e,0x2e,0x42,0xfc,0xb2,0x42,0x2e,0x2e,0x43,0x43,0x2e,0x2e,0x42,0x00,0x01,0x00,0x2a,0x00,0x00,0x02,0x19,0x00,0xc8,0x00,0x09,0x00,0x35,0x40,0x1f,0x07,0x08,0x08,0x0b,0x73,0x03,0x83,0x03,0x02,0x55,0x03,0x65,0x03,0x02,0x46,0x03,0x01,0x27,0x03,0x37,0x03,0x02,0x03,0x02,0x02,0x03,\r\n0x07,0x05,0x08,0x00,0x15,0x00,0x3f,0x32,0xdd,0x32,0xce,0x32,0x01,0x2f,0x33,0x71,0x71,0x71,0x71,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x22,0x27,0x37,0x16,0x33,0x32,0x37,0x17,0x06,0x01,0x19,0xa6,0x49,0x59,0x27,0x70,0x66,0x7b,0x1e,0x84,0x86,0x42,0x59,0x20,0x63,0x2c,0x00,0x01,0x00,0x90,0xff,0xe8,0x08,0x69,0x05,0xec,0x00,0x23,\r\n0x00,0x79,0x40,0x4b,0x9b,0x20,0x01,0x85,0x13,0x01,0x76,0x13,0x01,0x67,0x13,0x01,0x85,0x0b,0x01,0x66,0x0b,0x76,0x0b,0x02,0x57,0x0b,0x01,0x9b,0x06,0x01,0x03,0x01,0x23,0x84,0x0f,0x12,0x84,0x21,0x1d,0x1b,0x19,0x84,0x17,0x80,0x0f,0x01,0x4f,0x21,0x01,0x0f,0x21,0x17,0x17,0x21,0x0f,0x03,0x25,0x09,0x84,0x07,0x23,0x95,0x10,0x00,\r\n0x18,0x09,0x0f,0x1c,0x14,0x95,0x1f,0x0c,0x95,0x02,0x05,0x16,0x1a,0x00,0x15,0x00,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0xed,0x33,0x3f,0xc4,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0xc4,0x32,0x10,0xed,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,\r\n0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x21,0x03,0xe2,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7c,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xfe,0xcb,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,\r\n0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0x00,0x00,0x01,0x00,0x90,0xff,0xe8,0x08,0x9b,0x05,0xec,0x00,0x28,0x00,0x8c,0x40,0x58,0x85,0x20,0x01,0x66,0x20,0x76,0x20,0x02,0x57,0x20,0x01,0x9b,0x1b,0x01,0x9a,0x10,0x01,0x85,0x03,0x01,0x66,0x03,0x76,0x03,\r\n0x02,0x18,0x16,0x15,0x84,0x24,0x27,0x01,0x84,0x12,0x0d,0x0b,0x07,0x28,0x28,0x09,0x84,0x07,0x20,0x24,0x80,0x24,0x02,0x3f,0x12,0x01,0x10,0x07,0x70,0x07,0x02,0x24,0x12,0x07,0x07,0x12,0x24,0x03,0x2a,0x1e,0x84,0x1c,0x08,0x00,0x95,0x1e,0x27,0x0f,0x14,0x95,0x25,0x00,0x0c,0x04,0x95,0x0f,0x21,0x95,0x17,0x1a,0x16,0x0b,0x15,0x0f,\r\n0x00,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0xed,0x33,0x3f,0xed,0x3f,0xc4,0xfd,0xce,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0x32,0x2f,0x10,0xc4,0x32,0x10,0xfd,0xc4,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,\r\n0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x21,0x08,0x9b,0xfd,0x20,0xee,0x7b,0xa1,0xa4,0xa4,0x04,0x74,0xdc,0xa8,0xb2,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x02,0xe0,0x03,0x68,0xfe,0x50,0xfe,0xba,0xb9,\r\n0x8d,0x01,0x18,0xfd,0x30,0xaa,0xc2,0xd9,0xcd,0x03,0xc6,0xfa,0xac,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfe,0x14,0x00,0x00,0x01,0x00,0x90,0xfe,0x29,0x08,0x69,0x05,0xec,0x00,0x23,0x00,0x81,0x40,0x52,0x92,0x22,0x01,0x85,0x17,0x01,0x66,0x17,0x76,0x17,0x02,0x57,0x17,0x01,0x9b,0x12,0x01,0x8a,\r\n0x03,0x01,0x79,0x03,0x01,0x68,0x03,0x01,0x0f,0x0d,0x0b,0x84,0x1b,0x1f,0x1d,0x07,0x84,0x09,0x23,0x84,0x02,0x20,0x1b,0x80,0x1b,0x02,0x7f,0x09,0x01,0x10,0x02,0x01,0x1b,0x09,0x02,0x02,0x09,0x1b,0x03,0x25,0x15,0x84,0x13,0x1e,0x04,0x95,0x21,0x10,0x0a,0x95,0x1c,0x00,0x15,0x0f,0x18,0x95,0x0e,0x11,0x16,0x01,0x0c,0x15,0x08,0x1b,\r\n0x00,0x3f,0x3f,0xc4,0x3f,0x33,0xed,0x3f,0x3f,0xed,0x3f,0xed,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0x10,0xfd,0xc4,0x33,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,\r\n0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x33,0x36,0x33,0x20,0x11,0x08,0x69,0xa4,0xee,0x78,0xa4,0xa4,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x04,0x76,0xda,0x01,0x5a,0x02,0x4e,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0x2b,0xfa,0xac,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,\r\n0xbc,0xb1,0x8f,0x04,0x3a,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x01,0x00,0x90,0xfe,0x29,0x08,0x69,0x05,0xec,0x00,0x25,0x00,0x81,0x40,0x51,0x85,0x21,0x01,0x66,0x21,0x76,0x21,0x02,0x57,0x21,0x01,0x9c,0x1c,0x01,0x9b,0x10,0x01,0x75,0x03,0x85,0x03,0x02,0x66,0x03,0x01,0x16,0x14,0x84,0x19,0x17,0x25,0x02,0x84,0x11,0x0d,0x0b,0x09,0x84,\r\n0x07,0x80,0x25,0x01,0x4f,0x11,0x01,0xc0,0x07,0x01,0x25,0x11,0x07,0x07,0x11,0x25,0x03,0x27,0x1f,0x84,0x1d,0x08,0x1f,0x0f,0x15,0x95,0x17,0x1b,0x22,0x95,0x18,0x1b,0x0c,0x04,0x95,0x0f,0x16,0x0a,0x15,0x12,0x95,0x00,0x00,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x33,0xd4,0x32,0xed,0x3f,0xed,0x3f,0xc4,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,\r\n0x2f,0x2f,0x5d,0x5d,0x5d,0x10,0xed,0xc4,0x33,0x10,0xed,0x10,0xc4,0x33,0xfd,0xcd,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x01,0x21,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x21,0x11,0x33,0x15,0x21,0x11,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x03,\r\n0x3e,0x02,0x7c,0xf8,0x78,0x9b,0xa4,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xfe,0xcb,0xa5,0xfe,0xb7,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x05,0xec,0xfb,0xca,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0xfc,0x00,0xa2,0xba,0x01,0xb4,0x03,0xb8,0xf9,0x6d,0x98,0x02,0x79,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x00,0x00,0x01,\r\n0x00,0x90,0xfe,0x29,0x0a,0xc2,0x05,0xec,0x00,0x31,0x00,0x90,0x40,0x59,0x85,0x2b,0x01,0x76,0x2b,0x01,0x67,0x2b,0x01,0x83,0x1d,0x01,0x66,0x1d,0x76,0x1d,0x02,0x57,0x1d,0x01,0x9b,0x18,0x01,0x9a,0x09,0x01,0x88,0x09,0x01,0x9b,0x06,0x01,0x15,0x13,0x11,0x84,0x21,0x25,0x23,0x0d,0x84,0x0f,0x29,0x84,0x07,0x03,0x01,0x31,0x84,0x2f,\r\n0x21,0x0f,0x07,0x2f,0x2f,0x07,0x0f,0x21,0x04,0x33,0x1b,0x84,0x19,0x24,0x0a,0x95,0x27,0x10,0x10,0x95,0x22,0x00,0x30,0x1b,0x0f,0x2c,0x95,0x02,0x05,0x1e,0x95,0x14,0x17,0x16,0x01,0x12,0x15,0x0e,0x1b,0x00,0x3f,0x3f,0xc4,0x3f,0x33,0xed,0xd4,0x32,0xed,0x3f,0xc4,0x3f,0xed,0x3f,0xed,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,\r\n0x2f,0x2f,0x10,0xed,0xc4,0x32,0x10,0xed,0x10,0xfd,0xc4,0x33,0x10,0xed,0xc4,0x32,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,0x11,0x21,\r\n0x11,0x33,0x36,0x33,0x20,0x11,0x15,0x10,0x33,0x32,0x36,0x35,0x11,0x33,0x0a,0xc2,0xa4,0x04,0x66,0xc7,0xfe,0xab,0xc1,0x78,0xa4,0xa4,0xfe,0xcb,0xa4,0x04,0x66,0xd6,0xfe,0x92,0xa3,0xf8,0x78,0x9b,0x02,0x7d,0x04,0x76,0xda,0x01,0x2c,0xdf,0x69,0x9b,0xa4,0xa2,0xba,0x01,0xb4,0xb2,0x01,0x40,0xb9,0x91,0xfb,0xe5,0x07,0x2b,0xfa,0xac,\r\n0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0xb1,0x8f,0x04,0x3a,0xfd,0x6a,0xc2,0xfe,0x5f,0xc1,0xfe,0xbc,0xb1,0x8f,0x02,0x4e,0x00,0x01,0x00,0x83,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x2b,0x00,0x5a,0x40,0x30,0x0f,0x09,0x1c,0x1b,0x11,0x0e,0x7e,0x01,0x2a,0x14,0x01,0x08,0x09,0x1b,0x01,0x01,0x1b,0x09,0x03,0x2d,0x24,0x00,\r\n0x08,0x14,0x23,0x92,0x24,0x11,0x2b,0x92,0x0e,0x00,0x00,0x00,0x24,0x10,0x24,0x02,0x24,0x24,0x08,0x1c,0x12,0x0b,0x07,0x92,0x08,0x03,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x5d,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xed,0x32,0x11,0x33,0x11,0x33,\r\n0x31,0x30,0x13,0x21,0x2e,0x03,0x23,0x23,0x35,0x21,0x15,0x21,0x16,0x16,0x17,0x21,0x15,0x21,0x06,0x06,0x07,0x15,0x1e,0x03,0x17,0x13,0x23,0x03,0x2e,0x03,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x37,0x21,0x83,0x01,0xe5,0x08,0x25,0x43,0x63,0x44,0xce,0x03,0x87,0xfe,0xb8,0x1d,0x25,0x06,0x01,0x00,0xfe,0xfb,0x15,0x9b,0x77,0x22,0x38,\r\n0x34,0x33,0x1d,0xff,0xbe,0xe4,0x21,0x3b,0x43,0x51,0x36,0x70,0xcd,0x33,0x5c,0x49,0x33,0x0b,0xfe,0x1d,0x04,0x53,0x2a,0x45,0x31,0x1b,0x8c,0x8c,0x25,0x5d,0x39,0x8c,0x78,0xa9,0x20,0x04,0x10,0x2a,0x37,0x48,0x2e,0xfe,0x65,0x01,0x7e,0x37,0x54,0x38,0x1c,0x89,0x21,0x3b,0x53,0x32,0x00,0x02,0x00,0x37,0x00,0x00,0x04,0x1a,0x05,0x9a,\r\n0x00,0x07,0x00,0x0b,0x00,0x3b,0x40,0x1f,0x0b,0x00,0x02,0x7e,0x08,0x05,0x00,0x0d,0x05,0x0c,0x03,0x03,0x0d,0x0c,0x01,0x05,0x91,0x00,0x06,0x10,0x06,0x02,0x06,0x06,0x03,0x08,0x91,0x09,0x03,0x03,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0xed,0x11,0x33,0x31,\r\n0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x25,0x35,0x21,0x15,0x04,0x1a,0xfe,0x62,0xa8,0xfe,0x63,0x03,0xe3,0xfc,0x1d,0x03,0xe3,0x03,0xdc,0xfc,0x24,0x03,0xdc,0x98,0x8e,0x98,0x98,0xff,0xff,0x00,0x90,0x00,0x00,0x01,0x66,0x05,0xd9,0x02,0x06,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x5c,0xff,0xe7,0x03,0xf4,0x04,0x19,0x00,0x0d,\r\n0x00,0x18,0x00,0x22,0xbc,0x00,0x00,0x01,0x86,0x00,0x0e,0x00,0x13,0x01,0x86,0x40,0x09,0x08,0x10,0x9a,0x0b,0x10,0x16,0x9a,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x02,0x35,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf4,\r\n0x3d,0x77,0xaf,0x72,0xd9,0xea,0xf4,0xeb,0xe0,0xd9,0xac,0xfe,0xe9,0x8f,0x9c,0x91,0x90,0x8c,0x95,0x02,0x04,0x83,0xc9,0x8a,0x47,0x01,0x06,0xff,0x01,0x14,0x01,0x19,0xfe,0xf0,0xfe,0xf5,0x01,0x93,0xcb,0xd0,0xbf,0xc8,0xcd,0x00,0x00,0x01,0x00,0x79,0x00,0x00,0x02,0x71,0x04,0x1e,0x00,0x0e,0x00,0x24,0xbc,0x00,0x00,0x01,0x86,0x00,\r\n0x01,0x00,0x08,0x01,0x81,0x40,0x09,0x02,0x0d,0x07,0x07,0x01,0x0d,0x10,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0x71,0xac,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x46,0x03,0x3b,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,\r\n0x33,0x3f,0x45,0x21,0x00,0x01,0x00,0x99,0x00,0x00,0x03,0xd3,0x04,0x1b,0x00,0x26,0x00,0x34,0xb9,0x00,0x1b,0x01,0x86,0xb5,0x12,0x0a,0x0a,0x00,0x25,0x24,0xb8,0x01,0x86,0xb6,0x00,0x03,0x0a,0x12,0x03,0x24,0x0d,0xb8,0x01,0x7f,0xb5,0x16,0x10,0x24,0x99,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x2f,0x12,\r\n0x39,0x2f,0x39,0xed,0x31,0x30,0x33,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x06,0x15,0x21,0x15,0x99,0x32,0x53,0x69,0x6e,0x69,0x53,0x32,0x7a,0x67,0x27,0x55,0x57,0x54,0x25,0x48,0xb5,0x67,0x5b,0x8a,0x5e,0x30,0x33,0x52,0x6a,0x6f,0x6a,0x52,0x33,0x02,0x93,\r\n0x58,0x48,0x6d,0x56,0x44,0x3b,0x3a,0x40,0x4e,0x33,0x55,0x5d,0x12,0x20,0x2c,0x1a,0x9d,0x36,0x31,0x2b,0x4f,0x70,0x45,0x40,0x67,0x55,0x46,0x3e,0x39,0x3b,0x3f,0x26,0x93,0x00,0x00,0x01,0x00,0x7b,0xfe,0x50,0x03,0xb8,0x04,0x1b,0x00,0x2a,0x00,0x43,0x40,0x1b,0x16,0x89,0x1b,0x13,0x25,0x03,0x08,0x23,0x23,0x08,0x00,0x89,0x0f,0x0f,\r\n0x2c,0x08,0x25,0x12,0x9a,0x08,0x05,0x1b,0x1e,0x13,0x13,0x05,0x18,0xb8,0x01,0x7f,0xb4,0x1e,0x10,0x0a,0x9a,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,\r\n0x35,0x10,0x21,0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb8,0x4a,0x85,0xb9,0x6f,0xcb,0x7b,0x91,0xbb,0x4a,0x7a,0x56,0x2f,0xfe,0x71,0x77,0x71,0x01,0x62,0xfe,0xf2,0x4b,0x90,0x42,0x88,0xbe,0x5b,0x92,0x68,0x38,0xfe,0xe1,0x4b,0x7c,0x59,0x32,0x02,0x60,\r\n0x9f,0x71,0x3e,0x4e,0xb0,0x73,0x27,0x48,0x66,0x40,0x01,0x18,0x8b,0x01,0x09,0xf3,0x33,0x33,0xa0,0x52,0x32,0x5b,0x7e,0x4b,0xfe,0xe6,0x53,0x04,0x07,0x37,0x59,0x78,0x00,0x02,0x00,0x32,0xfe,0x68,0x04,0x2e,0x04,0x02,0x00,0x0e,0x00,0x15,0x00,0x31,0xb2,0x10,0x0e,0x05,0xb8,0x01,0x85,0x40,0x12,0x0f,0x09,0x06,0x06,0x17,0x09,0x11,\r\n0x07,0x0e,0x10,0x09,0x01,0x10,0x9a,0x04,0x07,0x18,0x06,0x00,0x2f,0x3f,0x33,0xed,0x32,0x32,0x3f,0x12,0x39,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x76,0xb8,0xb8,0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,\r\n0x24,0x01,0xe9,0x46,0x83,0x7b,0x72,0x04,0x02,0xfc,0x83,0x85,0xfe,0x68,0x01,0x98,0x7d,0x64,0xe3,0xea,0xe9,0x6b,0xfc,0x83,0x02,0x89,0x75,0xbc,0x9b,0x82,0x00,0x01,0x00,0xa4,0xfe,0x4d,0x03,0xc9,0x04,0x00,0x00,0x23,0x00,0x35,0xb9,0x00,0x1c,0x01,0x85,0xb3,0x17,0x17,0x08,0x00,0xb8,0x01,0x86,0xb2,0x0f,0x08,0x12,0xb8,0x01,0x7f,\r\n0xb7,0x1f,0x1f,0x0a,0x1b,0x99,0x18,0x0f,0x0a,0xb9,0x01,0x7f,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,\r\n0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x1c,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,\r\n0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x36,0xb3,0x12,0x2b,0x19,0x00,0xbb,0x01,0x86,0x00,0x21,0x00,0x19,0x01,0x86,0x40,0x0c,0x0a,0x26,0x9a,0x19,0x1c,0x1c,0x30,0x14,0x9a,0x0f,0x06,0x30,0xb8,0x01,0x7f,0xb1,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x2f,\r\n0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,\r\n0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,0x3b,0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,\r\n0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,0x2f,0x54,0x75,0x00,0x00,0x01,0x00,0x45,0xfe,0x66,0x03,0xd5,0x04,0x00,0x00,0x12,0x00,0x22,0xb9,0x00,0x07,0x01,0x86,0x40,0x0c,0x0f,0x08,0x08,0x00,0x10,0x00,0x00,0x10,0x99,0x11,0x0f,0x08,0x00,0x2f,0x3f,0xed,0x39,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x0e,0x03,0x02,\r\n0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,0x37,0x21,0x35,0x21,0x03,0xd5,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x03,0xa1,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x03,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,\r\n0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x47,0x40,0x25,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x00,0x05,0x15,0x33,0x9a,0x3d,0x3d,0x0d,0x29,0x99,0x1f,0x18,0x47,0x9a,0x0d,0x06,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,\r\n0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,\r\n0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,\r\n0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,\r\n0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xfe,0x4e,0x03,0xec,0x04,0x19,0x00,0x20,0x00,0x34,0x00,0x33,0x40,0x16,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,0x2b,0x89,0x17,0x30,0x99,0x0f,0x12,0x12,0x05,0x26,0x9a,0x1c,0x10,0x0a,0xb9,0x01,0x7f,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,\r\n0x11,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,\r\n0x4e,0x96,0xd8,0x8a,0x8e,0x6c,0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x01,0x8a,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,\r\n0xb0,0x7f,0x46,0x57,0xa7,0xf4,0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,0x63,0xff,0xff,0x00,0x5c,0xff,0xe7,0x03,0xf4,0x04,0x19,0x02,0x06,0x0c,0xb9,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x02,0xe0,0x04,0x1e,0x00,0x0e,0x00,0x24,0xbc,0x00,0x00,0x01,0x86,0x00,0x01,0x00,0x08,0x01,0x81,0x40,\r\n0x09,0x02,0x0d,0x07,0x07,0x01,0x0d,0x10,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x02,0xe0,0xac,0x13,0x49,0x5b,0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x46,0x03,0x3b,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0xff,0xff,\r\n0x00,0x99,0x00,0x00,0x03,0xd3,0x04,0x1b,0x02,0x06,0x0c,0xbb,0x00,0x00,0xff,0xff,0x00,0x7b,0xfe,0x50,0x03,0xb8,0x04,0x1b,0x02,0x06,0x0c,0xbc,0x00,0x00,0xff,0xff,0x00,0x32,0xfe,0x68,0x04,0x2e,0x04,0x02,0x00,0x06,0x0c,0xbd,0x00,0x00,0xff,0xff,0x00,0xa4,0xfe,0x4d,0x03,0xc9,0x04,0x00,0x02,0x06,0x0c,0xbe,0x00,0x00,0xff,0xff,\r\n0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,0x02,0x06,0x0c,0xbf,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x66,0x03,0xf0,0x04,0x00,0x00,0x06,0x0c,0xc0,0x1b,0x00,0xff,0xff,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,0x02,0x06,0x0c,0xc1,0x00,0x00,0xff,0xff,0x00,0x5e,0xfe,0x4e,0x03,0xec,0x04,0x19,0x02,0x06,0x0c,0xc2,0x00,0x00,0x00,0x02,\r\n0x00,0x56,0xff,0xe7,0x03,0xfc,0x05,0xb2,0x00,0x10,0x00,0x18,0x00,0x20,0x40,0x10,0x00,0x89,0x11,0x11,0x1a,0x15,0x89,0x0a,0x13,0x9a,0x0f,0x07,0x17,0x9a,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x20,0x03,\r\n0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x03,0xfc,0x41,0x7b,0xb3,0x72,0x6c,0xa9,0x74,0x3c,0x3f,0x7a,0xb5,0x75,0x01,0xc3,0xa8,0xfe,0xdd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x02,0xd3,0xb4,0xfe,0xea,0xbf,0x63,0x5f,0xb6,0x01,0x09,0xab,0xbc,0x01,0x20,0xc3,0x63,0xfd,0x11,0x02,0x64,0xfd,0x91,0xfd,0xbb,0x00,0x00,0x01,0x00,0x53,0x00,0x00,\r\n0x02,0x43,0x05,0xba,0x00,0x0e,0x00,0x28,0x40,0x13,0x0e,0x8a,0x00,0x06,0x00,0x06,0x00,0x0f,0x10,0x07,0x99,0x01,0x0c,0x06,0x06,0x0c,0x07,0x00,0x18,0x00,0x3f,0x3f,0x39,0x2f,0x12,0x39,0xed,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x21,0x11,0x0e,0x03,0x07,0x35,0x3e,0x03,0x37,0x33,0x11,0x01,0x9f,0x13,0x49,0x5b,\r\n0x65,0x30,0x36,0x79,0x75,0x68,0x26,0x3e,0x04,0xd7,0x13,0x31,0x30,0x2a,0x0c,0xa6,0x0f,0x33,0x3f,0x45,0x21,0xfa,0x46,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x03,0xe2,0x05,0xb2,0x00,0x2a,0x00,0x2e,0x40,0x17,0x1e,0x13,0x89,0x0a,0x21,0x00,0x00,0x2c,0x1d,0x89,0x21,0x00,0x0e,0x1d,0x99,0x20,0x18,0x0a,0x0a,0x05,0x9a,0x0e,0x07,0x00,\r\n0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x32,0x31,0x30,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x21,0x15,0x21,0x35,0x34,0x3e,0x02,0x37,0x3e,0x03,0x03,0x04,0x29,0x47,0x60,0x38,0x30,0x5c,0x57,0x51,\r\n0x23,0x45,0xab,0x7b,0x58,0x96,0x6e,0x3f,0x27,0x4f,0x78,0x51,0x65,0x83,0x4d,0x1f,0x02,0xca,0xfc,0x8b,0x28,0x5c,0x95,0x6c,0x4e,0x69,0x40,0x1b,0x04,0x22,0x42,0x62,0x41,0x20,0x1a,0x2e,0x40,0x27,0xb0,0x43,0x47,0x33,0x62,0x90,0x5d,0x55,0x8a,0x7a,0x70,0x3a,0x48,0x66,0x59,0x59,0x3a,0x93,0x47,0x5c,0x8c,0x7e,0x7e,0x4f,0x38,0x66,\r\n0x66,0x69,0x00,0x01,0x00,0x7b,0xff,0xe7,0x03,0xb9,0x05,0xb2,0x00,0x29,0x00,0x55,0x40,0x32,0x16,0x89,0x1a,0x13,0x24,0x03,0x08,0x22,0x22,0x08,0x00,0x89,0x0f,0x0f,0x2b,0x08,0x39,0x1a,0x01,0x2f,0x1a,0x01,0x1a,0x1a,0x18,0x9a,0x1d,0x24,0x12,0x9a,0x13,0x13,0x1d,0x07,0x36,0x08,0x01,0x00,0x08,0x10,0x08,0x20,0x08,0x03,0x08,0x08,\r\n0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x3f,0x39,0x2f,0xed,0x39,0x10,0xed,0x32,0x2f,0x5d,0x5d,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x35,0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,\r\n0x33,0x32,0x1e,0x02,0x15,0x10,0x05,0x15,0x1e,0x03,0x03,0xb9,0x49,0x85,0xba,0x70,0xcd,0x79,0x91,0xbb,0x4b,0x79,0x57,0x2f,0xfe,0x70,0x77,0x71,0x01,0x62,0xfe,0xf2,0x98,0x85,0x89,0xbd,0x5a,0x92,0x68,0x39,0xfe,0xe2,0x49,0x7c,0x5a,0x33,0x01,0x96,0x61,0x9f,0x71,0x3e,0x4e,0xb0,0x72,0x26,0x48,0x66,0x40,0x01,0x19,0x8b,0x01,0x08,\r\n0xf4,0x66,0x9f,0x52,0x32,0x5a,0x7e,0x4c,0xfe,0xe5,0x51,0x04,0x08,0x37,0x58,0x77,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x56,0x05,0x9a,0x00,0x0e,0x00,0x15,0x00,0x2e,0x40,0x16,0x10,0x0e,0x04,0x8a,0x07,0x07,0x17,0x0f,0x09,0x04,0x08,0x99,0x09,0x01,0x0f,0x0f,0x06,0x11,0x0e,0x06,0x06,0x18,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x33,\r\n0x33,0xed,0x32,0x01,0x2f,0x33,0x12,0x39,0x2f,0xed,0x33,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x35,0x3e,0x03,0x37,0x01,0x21,0x11,0x0e,0x03,0x03,0x76,0xe0,0xe0,0xa2,0xfd,0x5e,0x5e,0xc0,0xaf,0x95,0x33,0xfe,0x24,0x01,0xe9,0x4b,0x86,0x79,0x6e,0x05,0x9a,0xfc,0x4d,0x96,0xfe,0xaf,0x01,0x51,0x8e,0x6a,0xf1,\r\n0xf8,0xf7,0x71,0xfc,0x4d,0x02,0xbe,0x83,0xce,0xa8,0x88,0x00,0x00,0x01,0x00,0xa4,0xff,0xe7,0x03,0xc9,0x05,0x9a,0x00,0x23,0x00,0x3d,0x40,0x21,0x1c,0x8a,0x1a,0x17,0x17,0x08,0x00,0x89,0x0f,0x0f,0x25,0x08,0x12,0x9a,0x1f,0x1f,0x0a,0x1b,0x99,0x18,0x06,0x32,0x08,0x01,0x20,0x08,0x01,0x08,0x08,0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,\r\n0x32,0x2f,0x5d,0x5d,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x39,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x21,0x15,0x21,0x03,0x36,0x36,0x33,0x32,0x1e,0x02,0x03,0xc9,0x48,0x85,0xbc,0x73,0xc8,0x61,0x92,\r\n0x99,0x4e,0x7d,0x58,0x2f,0xbc,0xb3,0x1d,0x40,0x40,0x3d,0x19,0x31,0x02,0x97,0xfd,0xf7,0x1d,0x20,0x48,0x1c,0x72,0xb4,0x7d,0x41,0x01,0xb6,0x69,0xaa,0x7a,0x42,0x3c,0xae,0x5e,0x2e,0x52,0x74,0x45,0x8c,0x9f,0x02,0x03,0x04,0x03,0x02,0xcf,0x94,0xfe,0x5b,0x02,0x03,0x3c,0x6f,0xa1,0x00,0x02,0x00,0x6f,0xff,0xe7,0x03,0xfe,0x05,0xb2,\r\n0x00,0x20,0x00,0x34,0x00,0x37,0x40,0x1c,0x12,0x0a,0x00,0x89,0x21,0x21,0x36,0x2b,0x19,0x89,0x0a,0x26,0x9a,0x1a,0x1c,0x1c,0x30,0x0f,0x12,0x12,0x14,0x9a,0x0f,0x07,0x30,0x9a,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x11,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,0x0e,\r\n0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xfe,0x44,0x78,0xa6,0x61,0x6c,0xab,0x77,0x3e,0x53,0x99,0xd8,0x85,0x94,0x5a,0x6f,0x7b,0x60,0x9a,0x6e,0x3b,\r\n0x04,0x63,0xe4,0x5e,0x97,0x6b,0x3a,0xa8,0x26,0x47,0x68,0x42,0x3d,0x68,0x4c,0x2b,0x2a,0x4c,0x69,0x40,0x3e,0x66,0x48,0x28,0x01,0xc7,0x69,0xb0,0x80,0x47,0x5a,0xa9,0xf4,0x99,0xbb,0x01,0x31,0xd9,0x76,0x29,0x9b,0x39,0x56,0x9d,0xde,0x88,0xb3,0x40,0x75,0xa2,0x78,0x4b,0x78,0x54,0x2d,0x2e,0x4f,0x69,0x3b,0x4a,0x81,0x60,0x37,0x2f,\r\n0x54,0x75,0x00,0x01,0x00,0x45,0x00,0x00,0x03,0xd5,0x05,0x9a,0x00,0x12,0x00,0x24,0x40,0x11,0x07,0x89,0x0f,0x00,0x08,0x00,0x08,0x00,0x14,0x10,0x00,0x10,0x99,0x11,0x06,0x08,0x18,0x00,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x01,0x0e,0x03,0x02,0x02,0x07,0x23,0x36,0x12,0x12,0x3e,0x02,\r\n0x37,0x21,0x35,0x21,0x03,0xd5,0x21,0x5d,0x68,0x6c,0x5e,0x47,0x10,0xb0,0x12,0x4b,0x5f,0x6a,0x64,0x53,0x19,0xfd,0x31,0x03,0x90,0x05,0x3b,0x39,0xaa,0xd4,0xf4,0xfe,0xfc,0xfe,0xf5,0x81,0x80,0x01,0x0b,0x01,0x01,0xee,0xc8,0x99,0x2b,0x94,0x00,0x03,0x00,0x5a,0xff,0xe9,0x03,0xfc,0x05,0xb2,0x00,0x23,0x00,0x37,0x00,0x4b,0x00,0x47,\r\n0x40,0x25,0x38,0x89,0x08,0x42,0x8a,0x12,0x05,0x15,0x12,0x08,0x12,0x08,0x12,0x00,0x1a,0x89,0x2e,0x2e,0x4d,0x24,0x89,0x00,0x15,0x05,0x33,0x9a,0x3d,0x3d,0x0d,0x29,0x99,0x1f,0x19,0x47,0x9a,0x0d,0x07,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,\r\n0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x0e,0x02,0x5a,0x24,0x43,0x63,0x3f,0x5d,0x6e,0x3d,0x6c,0x94,0x56,0x57,0x94,0x6c,0x3c,0x6e,0x5b,0x3e,0x62,0x43,0x24,0x44,0x7b,0xab,0x67,0x66,0xaa,0x7c,0x45,0xb2,0x29,0x4b,0x6b,0x41,0x3f,0x6a,0x4d,0x2b,0x29,0x4c,0x6a,0x42,0x3e,0x69,0x4d,0x2c,0x33,0x25,0x41,0x56,0x31,0x31,0x57,0x40,0x26,0x25,0x40,0x57,0x32,0x35,\r\n0x57,0x3f,0x22,0x01,0x90,0x39,0x73,0x64,0x52,0x18,0x34,0xa3,0x63,0x4f,0x86,0x62,0x37,0x38,0x62,0x86,0x4e,0x63,0xa3,0x34,0x18,0x52,0x64,0x73,0x39,0x5e,0x9c,0x6f,0x3e,0x3e,0x6f,0x9c,0x6c,0x43,0x6c,0x4c,0x29,0x2a,0x4c,0x6c,0x42,0x3c,0x69,0x50,0x2e,0x2b,0x4d,0x6b,0x02,0x59,0x33,0x57,0x41,0x25,0x26,0x41,0x57,0x32,0x34,0x58,\r\n0x40,0x25,0x26,0x41,0x58,0x00,0x00,0x02,0x00,0x5e,0xff,0xe7,0x03,0xec,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x35,0x40,0x1b,0x21,0x00,0x89,0x08,0x17,0x10,0x10,0x36,0x2b,0x89,0x17,0x30,0x99,0x0f,0x12,0x12,0x05,0x26,0x9a,0x1c,0x07,0x08,0x08,0x0a,0x9a,0x05,0x19,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x2f,0x39,0xed,0x01,\r\n0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xec,0x4e,0x96,0xd8,0x8a,0x8e,0x6c,\r\n0x77,0x87,0x61,0x99,0x6a,0x38,0x04,0x5c,0xe4,0x5c,0x9a,0x70,0x3e,0x45,0x7b,0xa9,0x64,0x6c,0xa7,0x72,0x3c,0xb1,0x2b,0x4c,0x69,0x3e,0x3b,0x66,0x4b,0x2b,0x29,0x4c,0x6b,0x41,0x39,0x65,0x4b,0x2b,0x03,0x23,0xc5,0xfe,0xcd,0xd5,0x6f,0x32,0x9d,0x43,0x50,0x99,0xe0,0x91,0xb9,0x41,0x77,0xa4,0x63,0x6a,0xb0,0x7f,0x46,0x57,0xa7,0xf4,\r\n0x0a,0x53,0x88,0x61,0x35,0x2f,0x55,0x75,0x45,0x4c,0x78,0x53,0x2c,0x2b,0x49,0x63,0x00,0x02,0x00,0x56,0xff,0xe8,0x03,0xfc,0x05,0xb2,0x00,0x0a,0x00,0x12,0x00,0x88,0x40,0x1a,0x0f,0x9a,0x00,0x19,0x0b,0x9a,0x06,0x07,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x89,0x11,0xb8,0xff,0xf0,0xb3,\r\n0x0d,0x06,0x4d,0x11,0xb8,0xff,0xe0,0xb6,0x0c,0x06,0x4d,0x30,0x11,0x01,0x11,0xb8,0xff,0xe0,0x40,0x1d,0x0b,0x06,0x4d,0x20,0x11,0x40,0x11,0x02,0x11,0x11,0x14,0x0d,0x08,0x0d,0x06,0x4d,0x0d,0x08,0x0c,0x06,0x4d,0x0d,0x08,0x0b,0x06,0x4d,0x0d,0x89,0x03,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,\r\n0x03,0xb8,0xff,0xe0,0xb6,0x0b,0x06,0x4d,0x2f,0x03,0x01,0x03,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x05,0x22,0x02,0x11,0x10,0x12,0x33,0x20,0x11,0x10,0x02,0x03,0x20,0x11,0x10,0x21,0x20,0x11,0x10,0x02,0x1a,0xd5,0xef,0xf9,\r\n0xeb,0x01,0xc2,0xfe,0xcd,0xfe,0xcd,0x01,0x2d,0x01,0x29,0x18,0x01,0x6e,0x01,0x5a,0x01,0x7c,0x01,0x86,0xfd,0x21,0xfe,0x94,0xfe,0x81,0x05,0x3f,0xfd,0x91,0xfd,0xba,0x02,0x50,0x02,0x65,0x00,0x01,0x00,0xa8,0x00,0x00,0x03,0xdb,0x05,0xba,0x00,0x09,0x00,0x7e,0xb5,0x26,0x06,0x36,0x06,0x02,0x06,0xb8,0xff,0xf8,0x40,0x2d,0x0d,0x06,\r\n0x4d,0x04,0x08,0x0d,0x06,0x4d,0x06,0x04,0x07,0x05,0x08,0x02,0x99,0x01,0x18,0x05,0x07,0x07,0x01,0x05,0x01,0x00,0x01,0x00,0x01,0x08,0x08,0x0d,0x06,0x4d,0x08,0x08,0x0c,0x06,0x4d,0x08,0x08,0x0b,0x06,0x4d,0x08,0x8a,0x03,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xd0,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,0xd6,0xb3,0x0b,\r\n0x06,0x4d,0x03,0xb8,0xff,0xf0,0xb6,0x0b,0x01,0x4d,0x03,0x03,0x0b,0x0a,0x11,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x33,0x2f,0x2f,0x11,0x33,0x2f,0x00,0x3f,0x33,0x3f,0xed,0x32,0x2f,0x12,0x39,0x39,0x2b,0x2b,0x31,0x30,0x5d,0x21,0x21,0x35,0x21,0x11,0x05,0x35,0x25,0x11,0x21,0x03,0xdb,0xfc,0xd5,0x01,0x44,\r\n0xfe,0xb4,0x01,0xf0,0x01,0x43,0x90,0x04,0x5a,0x63,0x9c,0x97,0xfa,0xd6,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0xcd,0x05,0xb2,0x00,0x17,0x00,0xa3,0xb3,0x78,0x08,0x01,0x15,0xb8,0xff,0xe8,0x40,0x36,0x0c,0x00,0x4d,0x11,0x06,0x0e,0x02,0x15,0x99,0x01,0x18,0x0b,0x0b,0x09,0x9a,0x0e,0x07,0x0b,0x00,0x10,0x0c,0x06,0x4d,0x00,0x18,0x0b,\r\n0x0d,0x01,0x4c,0x00,0x00,0x11,0x08,0x0d,0x06,0x4d,0x11,0x08,0x0c,0x06,0x4d,0x11,0x08,0x0b,0x06,0x4d,0x11,0x8a,0x20,0x06,0x30,0x06,0x02,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x19,0x0b,0xb8,0xff,0xf8,0x40,0x0c,0x0d,0x06,0x4d,0x0b,\r\n0x16,0x20,0x0b,0x0c,0x01,0x4c,0x16,0x01,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x01,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x01,0x2f,0x2b,0x2b,0x33,0x2b,0x33,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x2b,0x2f,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x32,0x12,0x39,0x39,0x31,0x30,0x01,0x2b,0x5d,0x21,\r\n0x21,0x35,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x07,0x01,0x15,0x21,0x03,0xc0,0xfc,0xa0,0x01,0xa2,0xa0,0x89,0x8e,0x83,0xc0,0xb0,0xa8,0xdf,0xc0,0xdc,0x98,0xc5,0xfe,0xb5,0x02,0x9b,0x92,0x01,0xa3,0xa0,0xd5,0x79,0x7c,0x88,0xa4,0xac,0x83,0xd0,0xaf,0x8a,0xfe,0xf9,0xc3,0xfe,0xb9,\r\n0x04,0x00,0x00,0x01,0x00,0x83,0xff,0xe8,0x03,0xc0,0x05,0xb2,0x00,0x21,0x00,0xe5,0x40,0x3a,0x76,0x1c,0x01,0x74,0x16,0x01,0x7a,0x00,0x01,0x12,0x11,0x00,0x01,0x19,0x09,0x9a,0x0a,0x0a,0x14,0x34,0x01,0x01,0x00,0x01,0x10,0x01,0x20,0x01,0x03,0x01,0x01,0x03,0x9a,0x20,0x19,0x3b,0x11,0x01,0x2f,0x11,0x01,0x11,0x11,0x0f,0x9a,0x14,\r\n0x07,0x19,0x09,0x10,0x0c,0x06,0x4d,0x09,0x70,0x11,0x01,0x11,0xb8,0xff,0xf0,0x40,0x3f,0x0d,0x06,0x4d,0x11,0x17,0x06,0x0c,0x06,0x4d,0x17,0x06,0x0b,0x06,0x4d,0x17,0x89,0x0d,0x10,0x0d,0x06,0x4d,0x0d,0x10,0x0c,0x06,0x4d,0x0d,0x14,0x0b,0x06,0x4d,0x0d,0x09,0x11,0x0d,0x03,0x00,0x1d,0x08,0x0d,0x06,0x4d,0x1d,0x08,0x0c,0x06,0x4d,\r\n0x1d,0x08,0x0b,0x06,0x4d,0x1d,0x89,0x7f,0x06,0x01,0x06,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf8,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x23,0x00,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x00,0x2f,0x2b,0x2b,0x2b,0x11,\r\n0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x12,0x17,0x39,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2f,0x2b,0x5d,0x2f,0x2b,0x39,0x00,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x5d,0x11,0x39,0x2f,0xed,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x5d,0x5d,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,\r\n0x33,0x20,0x11,0x34,0x21,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x10,0x05,0x15,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x83,0x93,0xb9,0x96,0xb3,0xfe,0x71,0x77,0x71,0x01,0x63,0xfe,0xf1,0x97,0x86,0x8a,0xbc,0xb5,0xd9,0xfe,0xe0,0x9b,0xb7,0xfe,0xeb,0xe3,0xcc,0x35,0xb1,0x74,0x96,0x7f,0x01,0x19,0x8b,0x01,0x08,0xf4,0x67,0xa0,0x52,\r\n0xc0,0x96,0xfe,0xe5,0x51,0x04,0x0f,0xbb,0x8c,0xc1,0xed,0x00,0x00,0x02,0x00,0x0e,0x00,0x00,0x04,0x0a,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x8a,0x40,0x16,0x39,0x07,0x79,0x07,0x02,0x76,0x06,0x01,0x09,0x00,0x00,0x02,0x06,0x0b,0x0d,0x06,0x4c,0x02,0x8a,0x0b,0x07,0x03,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xd6,0xb4,\r\n0x0b,0x0c,0x06,0x4c,0x03,0xb8,0xff,0xe0,0xb3,0x0d,0x01,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0b,0x0c,0x01,0x4c,0x03,0x03,0x14,0x12,0x05,0xb8,0xff,0xf8,0x40,0x15,0x0c,0x0d,0x06,0x4c,0x2f,0x05,0x3f,0x05,0x4f,0x05,0x03,0x05,0x01,0x05,0x9a,0x09,0x06,0x12,0x12,0x03,0x0f,0xb8,0xff,0xf0,0xb7,0x0c,0x00,0x4d,0x0f,0x07,0x06,0x03,\r\n0x18,0x00,0x3f,0x3f,0x33,0x2b,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0x5d,0x2b,0x32,0x11,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x33,0x33,0xe9,0x2b,0x32,0x2f,0x32,0x31,0x30,0x00,0x5d,0x01,0x5d,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x01,0x33,0x11,0x33,0x21,0x11,0x34,0x37,0x23,0x06,0x07,0x01,0x04,0x0a,0xb8,0xa2,0xfd,0x5e,0x02,\r\n0x7e,0xc6,0xb8,0xfe,0xa6,0x04,0x04,0x0e,0x29,0xfe,0x47,0x01,0x7d,0xfe,0x83,0x01,0x7d,0x6b,0x03,0xb2,0xfc,0x68,0x02,0x6c,0x42,0x52,0x24,0x4a,0xfd,0x6e,0x00,0x01,0x00,0xa4,0xff,0xe8,0x03,0xc8,0x05,0x9a,0x00,0x19,0x00,0xb1,0x40,0x32,0x7a,0x00,0x01,0x00,0x01,0x0b,0x09,0x9a,0x12,0x12,0x0c,0x20,0x01,0x30,0x01,0x02,0x01,0x01,\r\n0x03,0x9a,0x18,0x19,0x0f,0x99,0x0c,0x06,0x0e,0x00,0x0e,0x15,0x08,0x0d,0x06,0x4d,0x15,0x08,0x0c,0x06,0x4d,0x15,0x08,0x0b,0x06,0x4d,0x15,0x89,0x7f,0x06,0x01,0x06,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb6,0x0b,0x06,0x4d,0x06,0x06,0x1b,0x00,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xe0,0x40,0x14,\r\n0x0c,0x06,0x4d,0x00,0x10,0x06,0x0c,0x06,0x4d,0x10,0x0e,0x0b,0x06,0x4d,0x10,0x8b,0x70,0x0b,0x01,0x0b,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x0b,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x0b,0xb8,0xff,0xf8,0x40,0x09,0x0b,0x06,0x4d,0x0b,0x20,0x0d,0x01,0x4d,0x0b,0x2f,0x2b,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x33,0x2b,0x2b,0x12,0x39,\r\n0x2f,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x39,0x2f,0xed,0x32,0x11,0x33,0x31,0x30,0x5d,0x37,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x21,0x15,0x21,0x11,0x36,0x33,0x32,0x16,0x15,0x14,0x04,0x23,0x22,0xa4,0x93,0x98,0x98,0xba,0xbe,0xb1,0x3c,0xa5,\r\n0x02,0xb6,0xfd,0xe5,0x42,0x38,0xe6,0xfc,0xfe,0xf1,0xec,0xc7,0x23,0xae,0x5f,0xac,0x8e,0x8d,0x9e,0x0c,0x02,0xcf,0x94,0xfe,0x5c,0x04,0xe7,0xc9,0xd0,0xfe,0x00,0x02,0x00,0x6e,0xff,0xe8,0x03,0xfe,0x05,0xb2,0x00,0x16,0x00,0x22,0x00,0xae,0x40,0x3b,0x7a,0x14,0x01,0x76,0x0a,0x01,0x29,0x14,0x39,0x14,0x02,0x06,0x0f,0x15,0x17,0x9a,\r\n0x09,0x09,0x15,0x1d,0x9a,0x0f,0x19,0x01,0x01,0x03,0x9a,0x15,0x07,0x01,0x40,0x0c,0x00,0x4d,0x01,0x01,0x0c,0x08,0x0d,0x06,0x4d,0x0c,0x08,0x0c,0x06,0x4d,0x0c,0x08,0x0b,0x06,0x4d,0x0c,0x89,0x20,0x20,0x30,0x20,0x02,0x20,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x20,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x20,0xb8,0xff,0xe4,0x40,0x19,\r\n0x0b,0x06,0x4d,0x20,0x20,0x24,0x1a,0x06,0x08,0x0d,0x06,0x4d,0x06,0x08,0x0c,0x06,0x4d,0x06,0x08,0x0b,0x06,0x4d,0x06,0x89,0x12,0xb8,0xff,0xd4,0xb3,0x0d,0x06,0x4d,0x12,0xb8,0xff,0xd6,0xb3,0x0c,0x06,0x4d,0x12,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x12,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x32,0x12,0x39,0x2f,0x2b,0x2b,0x2b,\r\n0x5d,0xe9,0x2b,0x2b,0x2b,0x32,0x2f,0x2b,0x00,0x3f,0xed,0x32,0x2f,0x3f,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x39,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x01,0x15,0x26,0x23,0x22,0x02,0x11,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x02,0x11,0x10,0x00,0x21,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,\r\n0xa6,0x6f,0x7b,0xbf,0xe5,0x04,0x64,0xe4,0xbc,0xde,0xfe,0xc4,0xd8,0xf6,0x01,0x42,0x01,0x08,0x96,0xfe,0xf2,0x7f,0x9e,0x9d,0x82,0x7c,0x98,0x92,0x05,0x89,0x9b,0x39,0xfe,0xac,0xfe,0xe3,0xcb,0xf1,0xca,0xd3,0xfe,0xf5,0x01,0x58,0x01,0x37,0x01,0x79,0x01,0xc2,0xfd,0x44,0xac,0x75,0x93,0xd0,0xb5,0x8b,0x98,0xac,0x00,0x01,0x00,0x56,\r\n0x00,0x00,0x03,0xf2,0x05,0x9a,0x00,0x06,0x00,0xbc,0x40,0x0b,0x73,0x01,0x01,0x02,0x18,0x00,0x04,0x99,0x05,0x06,0x03,0xb8,0xff,0xd8,0x40,0x0b,0x0b,0x0d,0x01,0x4c,0x01,0x28,0x0b,0x0d,0x01,0x4c,0x03,0xb8,0xff,0xf4,0x40,0x09,0x0d,0x06,0x4d,0x01,0x0c,0x0d,0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x01,0x10,0x0c,\r\n0x06,0x4d,0x03,0xb8,0xff,0xf0,0x40,0x14,0x0b,0x06,0x4d,0x01,0x10,0x0b,0x06,0x4d,0x01,0x03,0x00,0x02,0x02,0x04,0x20,0x00,0x30,0x00,0x02,0x00,0xb8,0xff,0xe8,0xb3,0x0d,0x06,0x4d,0x00,0xb8,0xff,0xf0,0xb3,0x0c,0x06,0x4d,0x00,0xb8,0xff,0xf0,0x40,0x0d,0x0b,0x06,0x4d,0x00,0x20,0x0b,0x0c,0x01,0x4c,0x00,0x00,0x08,0x04,0xb8,0xff,\r\n0xe0,0xb3,0x0d,0x06,0x4d,0x04,0xb8,0xff,0xe0,0xb3,0x0c,0x06,0x4d,0x04,0xb8,0xff,0xe0,0x40,0x0e,0x0b,0x06,0x4d,0x04,0x40,0x0b,0x01,0x4d,0x04,0x40,0x0b,0x00,0x4d,0x04,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x2b,0x5d,0x12,0x39,0x2f,0x12,0x39,0x39,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xed,\r\n0x39,0x3f,0x31,0x30,0x01,0x5d,0x01,0x01,0x23,0x01,0x21,0x35,0x21,0x03,0xf2,0xfd,0xc8,0xaa,0x02,0x19,0xfd,0x2d,0x03,0x9c,0x05,0x66,0xfa,0x9a,0x05,0x06,0x94,0x00,0x00,0x03,0x00,0x64,0xff,0xe8,0x03,0xee,0x05,0xb2,0x00,0x15,0x00,0x1f,0x00,0x29,0x00,0xfa,0x40,0x26,0x7b,0x13,0x01,0x7b,0x0f,0x01,0x74,0x08,0x01,0x74,0x04,0x01,\r\n0x76,0x07,0x01,0x29,0x08,0x0b,0x00,0x4d,0x35,0x1f,0x01,0x36,0x0a,0x01,0x36,0x1d,0x01,0x76,0x1e,0x01,0x20,0x08,0x0d,0x06,0x4d,0x1e,0xb8,0xff,0xf8,0x40,0x38,0x0d,0x06,0x4d,0x20,0x00,0x0b,0x03,0x1e,0x1e,0x06,0x25,0x9a,0x11,0x19,0x19,0x9a,0x06,0x07,0x00,0x0b,0x1e,0x20,0x04,0x03,0x16,0x89,0x09,0x18,0x0d,0x01,0x4d,0x09,0x09,\r\n0x0e,0x08,0x0d,0x06,0x4d,0x0e,0x08,0x0c,0x06,0x4d,0x0e,0x08,0x0b,0x06,0x4d,0x0e,0x89,0x20,0x28,0x30,0x28,0x02,0x28,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x28,0xb8,0xff,0xe8,0xb3,0x0c,0x06,0x4d,0x28,0xb8,0xff,0xe8,0x40,0x0a,0x0b,0x06,0x4d,0x28,0x28,0x2b,0x14,0x1c,0x89,0x03,0xb8,0xff,0xf8,0xb3,0x0c,0x06,0x4d,0x03,0xb8,0xff,\r\n0xf8,0x40,0x17,0x0b,0x06,0x4d,0x03,0x03,0x22,0x08,0x0d,0x06,0x4d,0x22,0x08,0x0c,0x06,0x4d,0x22,0x08,0x0b,0x06,0x4d,0x22,0x89,0x14,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x14,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x14,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x14,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0x2b,0xe9,0x11,\r\n0x12,0x39,0x2f,0x2b,0x2b,0x2b,0x5d,0xe9,0x2b,0x2b,0x2b,0x39,0x2f,0x2b,0xe9,0x12,0x17,0x39,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x17,0x33,0x2b,0x2b,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x2b,0x01,0x5d,0x00,0x5d,0x5d,0x5d,0x5d,0x01,0x35,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x05,0x15,0x04,0x11,0x14,0x04,0x23,0x22,0x26,\r\n0x35,0x10,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x07,0x04,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x9a,0xfe,0xfe,0xec,0xba,0xa8,0xd8,0xfe,0xf6,0x01,0x3a,0xff,0x00,0xe4,0xb8,0xee,0x02,0xb2,0x7c,0x6b,0x64,0x8b,0xe9,0xed,0xf8,0xfe,0xee,0x9f,0x82,0x7c,0x9d,0x02,0xf0,0x04,0x78,0xe4,0x9b,0xc7,0xba,0x92,0xee,\r\n0x84,0x04,0x70,0xfe,0xec,0xb2,0xd2,0xd0,0xa6,0x01,0x14,0x01,0xe0,0x63,0x72,0x77,0x5c,0xbb,0x5f,0x62,0xfa,0x6d,0xcf,0x6b,0x89,0x87,0x67,0xd8,0x00,0x02,0x00,0x5e,0xff,0xe8,0x03,0xec,0x05,0xb2,0x00,0x17,0x00,0x23,0x00,0xc1,0x40,0x29,0x79,0x14,0x01,0x74,0x15,0x01,0x76,0x04,0x01,0x2d,0x04,0x3d,0x04,0x02,0x29,0x14,0x39,0x14,\r\n0x02,0x08,0x10,0x0a,0x9a,0x1e,0x1e,0x10,0x70,0x01,0x01,0x01,0x01,0x03,0x9a,0x16,0x19,0x18,0x9a,0x10,0x07,0x21,0x00,0xb8,0xff,0xea,0x40,0x17,0x0c,0x06,0x4d,0x00,0x13,0x08,0x0d,0x06,0x4d,0x13,0x08,0x0c,0x06,0x4d,0x13,0x08,0x0b,0x06,0x4d,0x21,0x13,0x89,0x06,0xb8,0xff,0xf8,0xb3,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf0,0xb3,0x0c,\r\n0x06,0x4d,0x06,0xb8,0xff,0xe8,0x40,0x1e,0x0b,0x06,0x4d,0x20,0x06,0x30,0x06,0x02,0x06,0x06,0x25,0x00,0x1b,0x08,0x0d,0x06,0x4d,0x1b,0x08,0x0c,0x06,0x4d,0x1b,0x08,0x0b,0x06,0x4d,0x1b,0x89,0x0d,0xb8,0xff,0xd8,0xb3,0x0d,0x06,0x4d,0x0d,0xb8,0xff,0xd8,0xb3,0x0c,0x06,0x4d,0x0d,0xb8,0xff,0xd8,0xb3,0x0b,0x06,0x4d,0x0d,0x2f,0x2b,\r\n0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x33,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xe9,0x33,0x2b,0x2b,0x2b,0x2f,0x2b,0x2f,0x00,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x5d,0x11,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x5d,0x5d,0x5d,0x5d,0x00,0x5d,0x37,0x35,0x16,0x33,0x32,0x12,0x11,0x06,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x00,0x33,0x32,0x12,\r\n0x11,0x10,0x00,0x21,0x22,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0xac,0x78,0x86,0xc3,0xd9,0x02,0x02,0x5c,0xe4,0xb8,0xec,0x01,0x03,0xca,0xd4,0xed,0xfe,0xcc,0xfe,0xee,0x90,0x01,0x06,0x77,0x9f,0x9c,0x85,0x74,0xa1,0xa0,0x18,0x9e,0x44,0x01,0x3a,0x01,0x21,0x01,0x01,0xb9,0xfa,0xc5,0xd2,0x01,0x0d,0xfe,0xb1,\r\n0xfe,0xc0,0xfe,0x73,0xfe,0x52,0x05,0x3f,0xb3,0x8a,0x97,0xad,0x9e,0x72,0xa3,0xce,0x00,0x02,0x00,0x48,0xff,0xec,0x02,0xa5,0x03,0x66,0x00,0x0a,0x00,0x12,0x00,0x20,0x40,0x10,0x08,0xcc,0x11,0x11,0x14,0x0d,0xcc,0x03,0x0b,0xe7,0x06,0x2b,0x0f,0xe7,0x00,0x2d,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,\r\n0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x11,0x10,0x33,0x32,0x11,0x10,0x01,0x6d,0x8b,0x9a,0xa1,0x99,0x01,0x23,0xa3,0x87,0xa9,0xa6,0xa4,0x14,0xdb,0xd1,0xe5,0xe9,0xfe,0x47,0xdb,0xe6,0x03,0x03,0xfe,0xaf,0xfe,0xc6,0x01,0x40,0x01,0x4b,0x00,0xff,0xff,0x00,0x50,0x00,0x01,0x01,0xc2,0x03,0x69,0x01,0x07,\r\n0x00,0xf0,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x00,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x68,0x00,0x01,0x02,0x92,0x03,0x67,0x03,0x07,0x00,0xf1,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x01,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x02,0x8e,0x03,0x67,0x03,0x07,0x00,0xf2,0x00,0x00,0xfd,0xb9,0x00,0x07,\r\n0xb2,0x00,0x1f,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x2f,0x00,0x01,0x02,0xaa,0x03,0x53,0x01,0x07,0x02,0x38,0x00,0x00,0xfd,0xb9,0x00,0x09,0xb3,0x01,0x00,0x03,0x2c,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x7b,0xff,0xec,0x02,0x8a,0x03,0x57,0x03,0x07,0x02,0x39,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x23,0x2d,0x00,0x3f,\r\n0x35,0x00,0x00,0x02,0x00,0x49,0xff,0xec,0x02,0xa6,0x03,0x66,0x00,0x26,0x00,0x36,0x00,0x2f,0x40,0x18,0x01,0x15,0xcd,0x34,0x34,0x38,0x2c,0x0c,0xcc,0x1f,0x27,0xe7,0x0c,0x10,0x10,0x31,0x06,0xe6,0x24,0x2b,0x31,0xe6,0x1a,0x2d,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x32,0x31,\r\n0x30,0x01,0x15,0x2e,0x03,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x33,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x63,0x0e,0x28,0x2b,0x2c,0x12,0x39,0x55,0x21,0x1f,0x2d,0x04,0x1d,0x6e,0x4e,\r\n0x3c,0x5f,0x42,0x23,0x2d,0x4f,0x6b,0x3d,0x3f,0x72,0x56,0x32,0x38,0x65,0x8c,0x54,0x2b,0x52,0xc1,0x22,0x3c,0x2c,0x1a,0x15,0x29,0x3a,0x25,0x4b,0x55,0x4d,0x03,0x43,0x81,0x09,0x10,0x0c,0x07,0x24,0x24,0x22,0x7f,0x61,0x32,0x41,0x27,0x47,0x63,0x3d,0x3d,0x68,0x4d,0x2b,0x31,0x63,0x98,0x68,0x75,0xb5,0x7c,0x40,0x12,0xfe,0x59,0x15,\r\n0x28,0x38,0x24,0x22,0x41,0x32,0x1e,0x5b,0x49,0x4e,0x5a,0x00,0xff,0xff,0x00,0x4d,0x00,0x01,0x02,0xa0,0x03,0x5d,0x03,0x07,0x02,0x3a,0x00,0x00,0xfd,0xb9,0x00,0x07,0xb2,0x00,0x00,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x41,0xff,0xed,0x02,0xad,0x03,0x67,0x03,0x07,0x02,0x3b,0x00,0x00,0xfd,0xb9,0x00,0x0b,0xb4,0x02,0x01,0x00,\r\n0x1f,0x2d,0x00,0x3f,0x35,0x35,0x35,0x00,0x00,0x02,0x00,0x49,0xff,0xeb,0x02,0xa6,0x03,0x66,0x00,0x27,0x00,0x39,0x00,0x31,0x40,0x19,0x2d,0xcc,0x23,0x10,0x35,0x1a,0xcd,0x06,0x05,0x05,0x10,0x3b,0x30,0xe7,0x0b,0x0b,0x28,0x00,0xe6,0x1f,0x2d,0x28,0xe6,0x15,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x11,0x12,0x01,0x39,\r\n0x2f,0x10,0xed,0x33,0x2f,0x33,0xed,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x1e,0x03,0x13,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x34,0x42,0x5e,0x3c,0x1b,0x04,0x0d,0x2b,\r\n0x37,0x42,0x24,0x3c,0x61,0x46,0x26,0x2a,0x4d,0x6c,0x41,0x40,0x71,0x56,0x32,0x30,0x5d,0x8a,0x5b,0x30,0x61,0x26,0x13,0x2e,0x30,0x30,0x52,0x21,0x39,0x2a,0x18,0x52,0x45,0x20,0x3d,0x2f,0x1d,0x19,0x2c,0x3c,0x62,0x33,0x5c,0x7e,0x4b,0x1c,0x2f,0x21,0x13,0x26,0x47,0x63,0x3c,0x3f,0x6a,0x4c,0x2a,0x33,0x65,0x96,0x64,0x69,0xb4,0x82,\r\n0x4a,0x17,0x16,0x7f,0x0b,0x13,0x0f,0x08,0x02,0x8e,0x17,0x2c,0x3e,0x28,0x4c,0x56,0x16,0x26,0x33,0x1d,0x2a,0x47,0x32,0x1c,0x00,0x02,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x00,0x07,0x00,0x15,0x00,0x27,0x40,0x12,0x15,0x08,0x15,0x08,0x00,0x05,0x00,0x03,0x39,0x15,0x15,0x05,0x0f,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,\r\n0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x13,0x03,0x2e,0x03,0x27,0x23,0x0e,0x03,0x07,0x03,0x04,0x04,0xb3,0x71,0xfe,0x3d,0x6a,0xb3,0x01,0xae,0xa4,0x5e,0x98,0x02,0x07,0x08,0x07,0x01,0x03,0x02,0x06,0x07,0x07,0x03,0x92,0x01,0x1a,0xfe,0xe6,0x04,0x33,\r\n0xfd,0x73,0x01,0x9a,0x05,0x17,0x1d,0x1c,0x0b,0x0c,0x1d,0x1d,0x18,0x07,0xfe,0x6b,0x00,0x03,0x00,0xb0,0x00,0x00,0x03,0xa1,0x04,0x33,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x3c,0x40,0x21,0x10,0x24,0x0d,0x38,0x16,0x16,0x06,0x00,0x38,0x1f,0x1b,0x24,0x37,0x06,0x10,0x23,0x3a,0x2f,0x1b,0x3f,0x1b,0x02,0x1b,0x1b,0x06,0x1a,0x3a,0x07,\r\n0x35,0x24,0x3a,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x03,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x23,0x11,0x33,\r\n0x32,0x36,0x03,0xa1,0x3b,0x67,0x8e,0x52,0xfe,0x91,0x01,0x67,0x4c,0x7c,0x57,0x2f,0x6c,0x61,0x3d,0x63,0x44,0x25,0xe7,0x71,0x72,0x83,0x71,0x73,0x82,0x3c,0x8f,0x90,0x83,0xa0,0x7b,0x87,0x01,0x35,0x45,0x72,0x51,0x2d,0x04,0x33,0x23,0x41,0x5b,0x37,0x5b,0x86,0x1e,0x03,0x06,0x2a,0x44,0x5b,0x01,0xb9,0x4e,0x3a,0xfe,0xc3,0x5a,0xfe,\r\n0x6c,0x60,0x55,0xfe,0x9b,0x54,0x00,0x01,0x00,0x58,0xff,0xed,0x03,0xbb,0x04,0x45,0x00,0x1d,0x00,0x1b,0x40,0x0d,0x16,0x38,0x07,0x0f,0x00,0x11,0x39,0x0c,0x36,0x1b,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x33,0x2f,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,\r\n0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x03,0xbb,0x83,0xc5,0x7d,0xc8,0x8c,0x4a,0x54,0x9b,0xd8,0x84,0xa9,0x6f,0x7a,0x96,0x63,0x9e,0x6d,0x3a,0x36,0x66,0x94,0x5e,0xad,0x7d,0x2c,0x3f,0x4d,0x8c,0xc6,0x79,0x80,0xd4,0x98,0x54,0x2c,0x9e,0x40,0x3d,0x70,0x9e,0x62,0x5d,0x96,0x6a,0x39,0x48,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,\r\n0x04,0x54,0x04,0x33,0x00,0x0a,0x00,0x17,0x00,0x1c,0x40,0x0e,0x00,0x38,0x0b,0x12,0x37,0x06,0x11,0x39,0x07,0x35,0x12,0x39,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x20,0x00,0x03,0x34,0x2e,0x02,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x04,0x54,0x5d,0xa9,0xef,\r\n0x92,0xfe,0xe3,0x01,0x2b,0x01,0x3c,0x01,0x3d,0xab,0x3c,0x76,0xae,0x72,0x83,0x7a,0x6e,0xb0,0x7b,0x42,0x02,0x27,0x7d,0xcb,0x90,0x4f,0x04,0x33,0xfe,0xfb,0xfe,0xf6,0x67,0x92,0x5c,0x2a,0xfc,0xed,0x30,0x64,0x98,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x27,0x04,0x33,0x00,0x0b,0x00,0x3c,0x40,0x22,0x06,0x0a,0x37,0x01,0x08,0x04,\r\n0x08,0x04,0x00,0x01,0x00,0x09,0x39,0x0f,0x06,0x01,0x2f,0x06,0x3f,0x06,0xff,0x06,0x03,0x06,0x06,0x01,0x05,0x39,0x02,0x35,0x0a,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x5d,0x71,0xed,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,\r\n0x03,0x27,0xfd,0x89,0x02,0x5b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0x01,0xd3,0x04,0x33,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x0b,0x04,0x33,0x00,0x09,0x00,0x29,0x40,0x14,0x02,0x06,0x37,0x07,0x04,0x04,0x00,0x07,0x00,0x05,0x39,0x02,0x02,0x07,0x01,0x39,0x08,0x35,0x07,0x33,0x00,0x3f,0x3f,0xed,0x12,0x39,\r\n0x2f,0xed,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x0b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0xa4,0x02,0x5b,0x03,0xa8,0xfe,0xb1,0x8a,0xfe,0x31,0x04,0x33,0x00,0x00,0x01,0x00,0x58,0xff,0xed,0x04,0x20,0x04,0x45,0x00,0x22,0x00,0x2f,0x40,0x18,0x20,0x20,0x07,0x1e,\r\n0x0f,0x00,0x37,0x1e,0x16,0x38,0x07,0x20,0x39,0x21,0x21,0x02,0x11,0x39,0x0c,0x36,0x1b,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,\r\n0x33,0x32,0x36,0x37,0x11,0x21,0x35,0x21,0x04,0x20,0xb3,0xdc,0x7f,0xd2,0x96,0x52,0x5c,0xa4,0xe3,0x87,0xc0,0x86,0x8e,0xbd,0x60,0xa3,0x75,0x42,0x39,0x6b,0x98,0x60,0x42,0x6d,0x30,0xfe,0xfe,0x01,0xa4,0x4a,0x5d,0x4f,0x8e,0xc8,0x79,0x7b,0xd1,0x98,0x56,0x39,0xa4,0x53,0x3f,0x71,0x9b,0x5b,0x5e,0x99,0x6c,0x3a,0x16,0x16,0x01,0x0b,\r\n0x8b,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x00,0x0b,0x00,0x27,0x40,0x13,0x08,0x04,0x37,0x05,0x09,0x00,0x37,0x01,0x03,0x39,0x08,0x08,0x05,0x0a,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x33,0x2f,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,\r\n0x21,0x11,0x33,0x04,0x39,0xa5,0xfd,0xc0,0xa4,0xa4,0x02,0x40,0xa5,0x01,0xf3,0xfe,0x0d,0x04,0x33,0xfe,0x4b,0x01,0xb5,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x01,0x54,0x04,0x33,0x00,0x03,0x00,0x10,0xb6,0x00,0x37,0x01,0x02,0x35,0x01,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x54,0xa4,0xa4,0x04,0x33,\r\n0x00,0x01,0x00,0x11,0xff,0xed,0x01,0xe5,0x04,0x33,0x00,0x11,0x00,0x16,0x40,0x0a,0x00,0x37,0x0f,0x07,0x10,0x35,0x0a,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0xe5,0x33,0x5d,0x83,0x4f,0x46,0x2c,0x2c,0x48,0x2f,0x46,\r\n0x2f,0x18,0xa4,0x01,0x81,0x65,0x98,0x65,0x32,0x13,0x9a,0x1d,0x1b,0x3d,0x63,0x48,0x02,0xb3,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x00,0x12,0x00,0x33,0x40,0x18,0x10,0x11,0x11,0x00,0x12,0x0b,0x07,0x37,0x08,0x01,0x00,0x00,0x14,0x12,0x06,0x0b,0x0b,0x08,0x10,0x09,0x35,0x01,0x08,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,\r\n0x39,0x11,0x33,0x33,0x11,0x01,0x33,0x2f,0x33,0x2f,0xed,0x32,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x03,0xec,0xcc,0xfe,0x60,0x09,0x19,0x06,0x04,0xa4,0xa4,0x04,0x05,0x19,0x0a,0x01,0x91,0xb8,0xfe,0x33,0x01,0xdd,0x0b,0x20,0x0a,0xfd,\r\n0xee,0x04,0x33,0xfe,0x07,0x08,0x1e,0x0b,0x01,0xc8,0xfd,0xfc,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x00,0x05,0x00,0x16,0x40,0x0a,0x04,0x37,0x01,0x00,0x02,0x35,0x04,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x2f,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x03,0x2e,0xfd,0x82,0xa4,0x01,0xda,0x04,0x33,0xfc,\r\n0x58,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x05,0x62,0x04,0x33,0x00,0x21,0x00,0x20,0x40,0x0f,0x17,0x10,0x14,0x37,0x15,0x20,0x06,0x05,0x00,0x37,0x01,0x16,0x35,0x15,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x33,0x33,0x33,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x26,0x26,0x27,\r\n0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x05,0x62,0x9e,0x02,0x06,0x04,0x0a,0x14,0x11,0xfe,0x9d,0x58,0xfe,0x98,0x12,0x15,0x09,0x03,0x03,0x03,0x99,0xda,0x01,0x45,0x15,0x1b,0x06,0x06,0x0b,0x1e,0x11,0x01,0x46,0xd7,0x02,0xbe,0x2b,0x61,0x3e,0x24,0x3a,0x26,0xfc,0xfc,0x03,0x04,\r\n0x26,0x38,0x26,0x20,0x62,0x49,0xfd,0x43,0x04,0x33,0xfd,0x3e,0x2a,0x4a,0x17,0x1d,0x4d,0x24,0x02,0xbf,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x00,0x18,0x00,0x1a,0x40,0x0c,0x01,0x00,0x37,0x16,0x0c,0x09,0x37,0x0a,0x0b,0x35,0x01,0x33,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x32,0x2f,0xed,0x33,0x31,0x30,0x21,0x23,0x01,0x26,\r\n0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x1e,0x03,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x04,0x7a,0xae,0xfd,0xcc,0x1f,0x29,0x08,0x05,0x06,0x99,0xb9,0x02,0x35,0x12,0x19,0x11,0x09,0x03,0x03,0x04,0x04,0x99,0x02,0xf7,0x2a,0x41,0x13,0x23,0x71,0xfd,0x1f,0x04,0x33,0xfd,0x04,0x19,0x23,0x18,0x10,0x05,0x17,0x4e,0x39,0x02,\r\n0xc7,0x00,0x00,0x02,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x00,0x13,0x00,0x23,0x00,0x1c,0x40,0x0e,0x00,0x38,0x14,0x1c,0x38,0x0a,0x17,0x39,0x0f,0x36,0x21,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,\r\n0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0x95,0x52,0x91,0xc9,0x77,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x02,0x27,0x86,0xd4,0x93,0x4d,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,\r\n0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x24,0x40,0x12,0x00,0x38,0x0f,0x14,0x07,0x37,0x08,0x06,0x3a,0x14,0x14,0x08,0x13,0x3a,0x09,0x35,0x08,0x33,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,\r\n0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x03,0x92,0x3f,0x73,0xa3,0x63,0x86,0xa4,0x01,0x4b,0x61,0x98,0x68,0x36,0xab,0x86,0x87,0x86,0x76,0x89,0x94,0x02,0xee,0x4d,0x82,0x5e,0x34,0xfe,0x73,0x04,0x33,0x2c,0x54,0x79,0x52,0x6b,0x5a,0xfe,0x65,0x69,0x00,0x02,0x00,0x58,0xff,0x65,\r\n0x04,0xc5,0x04,0x45,0x00,0x18,0x00,0x28,0x00,0x24,0x40,0x12,0x00,0x38,0x19,0x21,0x38,0x0f,0x08,0x05,0x0a,0x1c,0x39,0x14,0x36,0x26,0x39,0x0a,0x34,0x07,0x00,0x2f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x06,0x07,0x05,0x23,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,\r\n0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x04,0x95,0x52,0x49,0x22,0x28,0x01,0x15,0xf8,0xb2,0x4f,0x5a,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x02,0x27,0x86,0xd4,0x4a,0x22,0x1b,0xe1,0x9e,\r\n0x16,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0xdf,0x04,0x33,0x00,0x19,0x00,0x24,0x00,0x2e,0x40,0x17,0x16,0x09,0x00,0x11,0x38,0x1a,0x1f,0x09,0x37,0x0a,0x16,0x08,0x3a,0x1f,0x1f,0x0a,0x1e,0x3a,0x0b,0x35,0x01,0x0a,\r\n0x33,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0xfd,0xc6,0x12,0x39,0x31,0x30,0x21,0x23,0x03,0x2e,0x03,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x03,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x03,0xdf,0xc0,0xbe,0x13,0x24,0x29,0x2f,0x1d,0x61,\r\n0xa4,0x01,0x6d,0x56,0x8a,0x61,0x34,0x26,0x46,0x62,0x3c,0x3c,0x3f,0x1c,0x77,0x76,0xa6,0xa0,0x37,0x59,0x40,0x23,0x01,0x47,0x20,0x2b,0x19,0x0a,0xfe,0x4b,0x04,0x33,0x27,0x4a,0x69,0x43,0x3a,0x63,0x4c,0x35,0x0d,0x03,0x1a,0x65,0x01,0xa1,0x57,0x4c,0xfe,0x8e,0x1e,0x37,0x4c,0x00,0x00,0x01,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45,\r\n0x00,0x37,0x00,0x26,0x40,0x13,0x2e,0x37,0x0a,0x1f,0x27,0x00,0x37,0x15,0x15,0x2d,0x05,0x29,0x39,0x24,0x36,0x10,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xc4,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x2e,\r\n0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x03,0x08,0x38,0x67,0x94,0x5d,0x20,0x4e,0x4c,0x41,0x12,0x1a,0x46,0x4d,0x4f,0x24,0x39,0x53,0x36,0x19,0x14,0x35,0x5d,0x4a,0x47,0x66,0x42,0x1f,0x39,0x66,0x8d,0x53,0xa0,0x4a,0x5f,0x93,0x32,0x4f,0x38,0x1d,0x0e,0x2f,0x56,\r\n0x48,0x4f,0x6f,0x46,0x20,0x01,0x1b,0x44,0x70,0x4f,0x2b,0x0b,0x11,0x16,0x0c,0xac,0x15,0x24,0x1a,0x0e,0x16,0x28,0x38,0x22,0x1f,0x32,0x30,0x36,0x25,0x23,0x46,0x4c,0x58,0x35,0x40,0x68,0x49,0x28,0x26,0xa5,0x42,0x15,0x26,0x33,0x1e,0x1d,0x2f,0x31,0x36,0x22,0x26,0x47,0x4c,0x54,0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,\r\n0x00,0x07,0x00,0x1e,0x40,0x0e,0x02,0x37,0x03,0x03,0x00,0x05,0x00,0x01,0x05,0x39,0x06,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x03,0x6c,0xfe,0xa9,0xa4,0xfe,0xa8,0x03,0x53,0x03,0xa8,0xfc,0x58,0x03,0xa8,0x8b,0x00,0x01,0x00,0x9c,0xff,0xed,\r\n0x04,0x26,0x04,0x33,0x00,0x15,0x00,0x1b,0x40,0x0d,0x00,0x37,0x13,0x09,0x37,0x06,0x14,0x07,0x35,0x0e,0x39,0x03,0x34,0x00,0x3f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x04,0x26,0xed,0xe2,0xd9,0xe2,0xa5,0x22,0x48,\r\n0x6f,0x4d,0x4a,0x6b,0x45,0x20,0xa5,0x01,0xb3,0xe3,0xe3,0xdb,0xda,0x02,0x91,0xfd,0x80,0x51,0x77,0x4e,0x25,0x24,0x4d,0x76,0x51,0x02,0x83,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x15,0x04,0x33,0x00,0x0f,0x00,0x0f,0xb5,0x03,0x00,0x03,0x35,0x02,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x01,0x23,0x01,0x33,0x01,0x1e,\r\n0x03,0x17,0x33,0x36,0x36,0x37,0x01,0x04,0x15,0xfe,0x43,0xa3,0xfe,0x4b,0xb9,0x01,0x0c,0x10,0x17,0x0f,0x0a,0x02,0x03,0x04,0x20,0x22,0x01,0x12,0x04,0x33,0xfb,0xcd,0x04,0x33,0xfd,0x40,0x2a,0x40,0x32,0x24,0x0e,0x17,0x61,0x57,0x02,0xbf,0x00,0x01,0x00,0x05,0x00,0x00,0x06,0x64,0x04,0x33,0x00,0x26,0x00,0x0f,0xb5,0x1a,0x0a,0x1a,\r\n0x35,0x19,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x01,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x23,0x03,0x2e,0x03,0x27,0x0e,0x03,0x07,0x03,0x23,0x01,0x33,0x13,0x1e,0x03,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0x81,0xdf,0x1d,0x1a,0x04,0x03,0x05,0x1c,0x20,0xd4,0xb1,0xfe,0x8c,0xa3,0xdf,0x07,0x10,0x10,0x0f,\r\n0x04,0x06,0x10,0x11,0x10,0x07,0xda,0xa3,0xfe,0x8c,0xb0,0xd7,0x10,0x16,0x0e,0x09,0x02,0x03,0x04,0x1a,0x1d,0xde,0x04,0x33,0xfd,0x5e,0x5a,0x71,0x17,0x1c,0x71,0x62,0x02,0x95,0xfb,0xcd,0x02,0xa4,0x15,0x37,0x3e,0x3e,0x1c,0x1f,0x43,0x40,0x39,0x14,0xfd,0x67,0x04,0x33,0xfd,0x6b,0x31,0x4d,0x3a,0x29,0x0e,0x17,0x71,0x5a,0x02,0xa2,\r\n0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x00,0x19,0x00,0x0f,0xb5,0x0b,0x00,0x0d,0x35,0x0b,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x03,0xe4,0xc3,0xfe,0xfa,0x06,0x0e,0x08,0x03,\r\n0x04,0x0e,0x0b,0xfe,0xc3,0x01,0x7c,0xfe,0xa2,0xc5,0xe6,0x0d,0x15,0x09,0x03,0x0d,0x17,0x0a,0xe3,0xb8,0xfe,0x9a,0x01,0x8e,0x0a,0x1a,0x12,0x09,0x1b,0x12,0xfe,0x72,0x02,0x28,0x02,0x0b,0xfe,0x91,0x14,0x25,0x12,0x19,0x27,0x0e,0x01,0x6c,0xfd,0xdf,0x00,0x01,0x00,0x14,0x00,0x00,0x03,0xa7,0x04,0x33,0x00,0x0f,0x00,0x1d,0x40,0x0d,\r\n0x0a,0x02,0x37,0x03,0x03,0x06,0x05,0x0f,0x00,0x05,0x35,0x03,0x33,0x00,0x3f,0x3f,0x01,0x2f,0x32,0x2f,0x33,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x01,0x11,0x23,0x11,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0xa7,0xfe,0x83,0xa3,0xfe,0x8d,0xb4,0xf3,0x06,0x0f,0x08,0x02,0x05,0x10,0x0b,0xff,0x04,0x33,0xfd,0x5a,\r\n0xfe,0x73,0x01,0x8a,0x02,0xa9,0xfe,0x25,0x0c,0x21,0x15,0x0d,0x21,0x14,0x01,0xdb,0x00,0x01,0x00,0x29,0x00,0x00,0x03,0xb3,0x04,0x33,0x00,0x09,0x00,0x26,0x40,0x12,0x07,0x07,0x00,0x01,0x04,0x06,0x03,0x00,0x00,0x07,0x39,0x08,0x35,0x05,0x01,0x39,0x04,0x33,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x01,0x2f,0x33,0x33,0x2f,0x33,0x12,\r\n0x39,0x2f,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x03,0xb3,0xfd,0x73,0x02,0x7c,0xfc,0x87,0x02,0x8b,0xfd,0xad,0x03,0x52,0x04,0x02,0xfc,0x89,0x8b,0x37,0x03,0x71,0x8b,0x00,0x00,0x02,0xff,0xf8,0x00,0x00,0x05,0x56,0x04,0x33,0x00,0x0f,0x00,0x13,0x00,0x59,0x40,0x33,0x0a,0x0e,0x37,0x01,0x11,0x01,0x10,0x01,\r\n0x0c,0x08,0x08,0x0c,0x01,0x10,0x04,0x00,0x05,0x00,0x09,0x13,0x39,0x06,0x03,0x39,0x10,0x0d,0x39,0x0a,0x0f,0x0a,0x01,0x2f,0x0a,0x3f,0x0a,0xff,0x0a,0x03,0x10,0x0a,0x10,0x0a,0x01,0x06,0x35,0x05,0x33,0x0e,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x71,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,\r\n0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x21,0x03,0x23,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x21,0x11,0x23,0x05,0x56,0xfd,0x89,0xfe,0x6f,0x9b,0xbb,0x02,0x46,0x02,0xfc,0xfe,0x49,0x01,0x95,0xfe,0x6b,0x01,0xd3,0xfc,0x3c,0x01,0x4d,0x49,0x01,0x28,0xfe,0xd8,\r\n0x04,0x33,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x01,0x28,0x01,0xf6,0x00,0x02,0x00,0x58,0xff,0xed,0x05,0xe8,0x04,0x45,0x00,0x1e,0x00,0x2e,0x00,0x51,0x40,0x2f,0x19,0x1d,0x37,0x1f,0x1b,0x1f,0x1b,0x00,0x28,0x38,0x0b,0x17,0x00,0x18,0x20,0x39,0x15,0x1c,0x39,0x0f,0x19,0x01,0x2f,0x19,0x3f,0x19,0xff,0x19,0x03,0x19,0x19,0x01,0x15,0x35,\r\n0x23,0x39,0x10,0x36,0x2d,0x39,0x06,0x34,0x1d,0x1f,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x5d,0x71,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x31,0x30,0x21,0x21,0x22,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x23,0x21,\r\n0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x25,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x05,0xe8,0xfd,0xab,0x06,0x3a,0x50,0x57,0x23,0x80,0xcf,0x93,0x4f,0x52,0x99,0xd8,0x86,0x25,0x58,0x49,0x2f,0x03,0x02,0x3b,0xfe,0x47,0x01,0x97,0xfe,0x69,0x01,0xd3,0xfd,0x89,0x40,0x6a,0x2b,0x5b,0x96,0x6c,0x3c,0x3b,\r\n0x6b,0x95,0x59,0x5a,0x06,0x07,0x06,0x4f,0x8f,0xc8,0x7a,0x82,0xd2,0x94,0x50,0x06,0x06,0x06,0x8b,0xfe,0xc0,0x8b,0xfe,0xae,0x06,0x03,0x14,0x0b,0x0b,0x3f,0x70,0x9a,0x5a,0x5b,0x98,0x6e,0x3e,0x00,0x00,0x01,0x00,0x38,0x00,0x00,0x03,0x2e,0x04,0x33,0x00,0x0d,0x00,0x34,0x40,0x19,0x08,0x0c,0x37,0x01,0x0a,0x0a,0x00,0x05,0x03,0x01,\r\n0x00,0x02,0x08,0x09,0x03,0x09,0x03,0x09,0x01,0x06,0x35,0x0c,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x2f,0xc6,0x33,0x12,0x39,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x25,0x15,0x05,0x11,0x21,0x03,0x2e,0xfd,0x82,0x78,0x78,0xa4,0x01,0x01,0xfe,\r\n0xff,0x01,0xda,0x01,0x95,0x44,0x8a,0x43,0x02,0x15,0xfe,0x48,0x8f,0x8b,0x8d,0xfe,0x99,0x00,0x00,0x03,0x00,0x41,0xff,0xda,0x04,0xa9,0x04,0x65,0x00,0x1b,0x00,0x26,0x00,0x32,0x00,0x28,0x40,0x14,0x1f,0x30,0x2c,0x00,0x38,0x1c,0x2c,0x38,0x0e,0x2f,0x1e,0x22,0x27,0x39,0x13,0x36,0x22,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0xed,0x11,\r\n0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x17,0x07,0x16,0x16,0x07,0x34,0x27,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x01,0x26,0x26,0x04,0xa9,0x4d,0x90,0xce,\r\n0x82,0x6f,0xb6,0x45,0x83,0x4e,0x86,0x36,0x39,0x4d,0x92,0xd4,0x86,0x61,0xa4,0x42,0x7b,0x4f,0x7a,0x3f,0x42,0xab,0x44,0xfd,0xc4,0x30,0x80,0x4e,0x5c,0x8f,0x63,0x34,0xfe,0x88,0x57,0x8f,0x66,0x37,0x1d,0x1b,0x02,0x34,0x2d,0x74,0x02,0x27,0x82,0xd2,0x95,0x51,0x3c,0x39,0x88,0x49,0x8c,0x45,0xb0,0x69,0x81,0xd1,0x95,0x51,0x32,0x2f,\r\n0x81,0x4b,0x7f,0x47,0xbd,0x80,0xa8,0x68,0xfd,0xac,0x2d,0x2f,0x38,0x6a,0x9b,0x02,0x07,0x3c,0x6e,0x9b,0x5e,0x46,0x78,0x31,0x02,0x4e,0x21,0x23,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x00,0x10,0x00,0x19,0x00,0x2e,0x40,0x17,0x00,0x38,0x11,0x16,0x0b,0x07,0x37,0x08,0x06,0x3a,0x16,0x15,0x3a,0x0b,0x16,0x0b,0x16,0x0b,\r\n0x08,0x09,0x35,0x08,0x33,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x32,0x2f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x03,0x92,0x3f,0x73,0xa3,0x63,0x86,0xa4,0xa4,0xa7,0x61,0x98,0x68,0x36,\r\n0xab,0x86,0x87,0x86,0x76,0x89,0x94,0x02,0x2c,0x4d,0x82,0x5e,0x34,0xcb,0x04,0x33,0xc2,0x2c,0x54,0x79,0x52,0x6b,0x5a,0xfe,0x65,0x69,0x00,0x02,0x00,0x2d,0x00,0x00,0x04,0x54,0x04,0x33,0x00,0x0e,0x00,0x1f,0x00,0x35,0x40,0x1b,0x18,0x18,0x06,0x00,0x38,0x0f,0x16,0x1a,0x37,0x0a,0x08,0x06,0x19,0x08,0x39,0x16,0x09,0x09,0x06,0x15,\r\n0x39,0x0b,0x35,0x1a,0x39,0x06,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x21,0x11,0x23,0x35,0x33,0x11,0x21,0x20,0x00,0x03,0x34,0x2e,0x02,0x23,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x32,0x3e,0x02,0x04,0x54,0x5d,0xa9,\r\n0xef,0x92,0xfe,0xe3,0x83,0x83,0x01,0x2b,0x01,0x3c,0x01,0x3d,0xab,0x3c,0x76,0xae,0x72,0x83,0xfb,0xfb,0x7a,0x6e,0xb0,0x7b,0x42,0x02,0x27,0x7d,0xcb,0x90,0x4f,0x01,0xe1,0x89,0x01,0xc9,0xfe,0xfb,0xfe,0xf6,0x67,0x92,0x5c,0x2a,0xfe,0xc7,0x89,0xfe,0xaf,0x30,0x64,0x98,0x00,0x01,0x00,0xa6,0xff,0xee,0x03,0xe8,0x04,0x45,0x00,0x39,\r\n0x00,0x3f,0x40,0x21,0x27,0x38,0x14,0x30,0x38,0x09,0x01,0x0f,0x1c,0x14,0x09,0x14,0x09,0x3b,0x1b,0x37,0x1c,0x2a,0x0e,0x3b,0x0f,0x0f,0x22,0x04,0x39,0x35,0x34,0x17,0x39,0x22,0x36,0x1c,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,\r\n0x30,0x25,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x01,0x9a,0x26,0x73,0x43,0x28,0x48,0x36,0x1f,0x2a,0x57,0x84,0x5a,0x39,0x5c,\r\n0x41,0x23,0x5a,0x58,0x65,0x74,0xa4,0x42,0x6c,0x8c,0x4a,0x4e,0x7f,0x5a,0x31,0x68,0x77,0x56,0x7b,0x4f,0x25,0x31,0x5e,0x88,0x56,0x2c,0x43,0x35,0x2a,0x0a,0x97,0x12,0x1a,0x13,0x2a,0x42,0x30,0x2f,0x4f,0x3b,0x25,0x05,0x71,0x06,0x1c,0x2f,0x41,0x2a,0x45,0x43,0x71,0x7d,0xfd,0x32,0x02,0xe3,0x68,0x88,0x51,0x21,0x24,0x43,0x61,0x3c,\r\n0x5a,0x80,0x1e,0x04,0x0d,0x31,0x48,0x62,0x3f,0x45,0x70,0x4f,0x2c,0x05,0x07,0x0a,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x43,0x00,0x96,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,\r\n0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x0e,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x2c,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0x8c,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,\r\n0x00,0x00,0x04,0x04,0x05,0xd0,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0x9f,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0xa5,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x06,0x00,0x8f,0x62,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x17,0x01,0x17,0x00,\r\n0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x67,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xdc,0x00,0xdf,0xff,0x4b,0x00,0x09,0xb3,0x03,0x02,0x27,0x35,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x58,0xfe,0x56,0x03,0xbb,0x04,0x45,0x02,0x26,0x0c,0xed,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x97,0x00,0x06,\r\n0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x43,0x79,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xec,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,\r\n0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x2c,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0xd7,0x6c,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xa5,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x8f,0x53,0x1e,0x00,0x0c,\r\n0xb5,0x02,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xfc,0x00,0x00,0x01,0x81,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0x43,0xaa,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x87,0x00,0x00,0x02,0x0c,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,\r\n0x00,0x8e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe9,0x00,0x00,0x02,0x1d,0x06,0x2c,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd7,0x8d,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,\r\n0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,0x05,0xd0,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x32,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,\r\n0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x14,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x68,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,\r\n0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x2c,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x00,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xd0,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd8,0x01,0x13,0x00,0x1e,\r\n0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xa5,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xd6,0x00,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x28,0x02,0x26,0x0c,0xff,\r\n0x00,0x00,0x01,0x07,0x00,0x43,0x01,0x07,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x28,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x62,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,\r\n0x04,0x26,0x06,0x2c,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd7,0x00,0xeb,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xa5,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0x8f,0x00,0xc1,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,\r\n0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0x4d,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0xc6,0x00,0x1e,\r\n0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x05,0xdc,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfe,0x70,0x04,0x04,0x04,0x33,0x02,0x26,0x0c,0xeb,0x00,0x00,\r\n0x00,0x07,0x00,0xdf,0x02,0xab,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x28,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x71,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x2a,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0xe0,\r\n0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x05,0xa3,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xba,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x54,0x06,0x2a,0x02,0x26,\r\n0x0c,0xee,0x00,0x00,0x01,0x07,0x00,0xe0,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x2d,0x00,0x00,0x04,0x54,0x04,0x33,0x02,0x06,0x0d,0x0a,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0x4d,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0xd9,0x00,0x9c,0x00,0x1e,\r\n0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xdc,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xac,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0xa3,0x02,0x26,0x0c,0xef,0x00,0x00,\r\n0x01,0x07,0x00,0xdb,0x01,0x15,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x70,0x03,0x27,0x04,0x33,0x02,0x26,0x0c,0xef,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xbe,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x2a,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0xe0,\r\n0x66,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x05,0xdc,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x52,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xfe,0x85,0x04,0x20,0x04,0x45,0x02,0x26,0x0c,0xf1,\r\n0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xf8,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x05,0xa3,0x02,0x26,0x0c,0xed,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0xb0,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x06,0x2c,0x02,0x26,0x0c,0xf2,0x00,0x00,0x01,0x07,\r\n0x00,0xd7,0x00,0xfe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0c,0x01,0x0c,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0x2d,0x00,0x00,0x04,0xbc,0x04,0x33,0x00,0x13,0x00,0x17,0x00,0x4a,0x40,0x0e,0x17,0x0c,0x04,0x37,0x05,0x14,0x0d,0x00,0x37,0x01,0x03,0x39,0x17,0x17,0xb8,0xff,0xc0,0x40,0x16,0x09,0x0c,0x48,0x16,0x13,0x06,0x39,0x09,0x10,\r\n0x0c,0x09,0x17,0x09,0x17,0x09,0x05,0x0e,0x0a,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x2b,0x10,0xed,0x01,0x2f,0xed,0x33,0x33,0x2f,0xed,0x32,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,\r\n0x07,0x35,0x21,0x15,0x04,0x39,0xa5,0xfd,0xc0,0xa4,0x83,0x83,0xa4,0x02,0x40,0xa5,0x83,0x83,0xa5,0xfd,0xc0,0x01,0xf3,0xfe,0x0d,0x03,0x2b,0x89,0x7f,0x7f,0x7f,0x7f,0x89,0xad,0xad,0xad,0xff,0xff,0xff,0xc3,0x00,0x00,0x02,0x44,0x05,0xd0,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd8,0xa0,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,\r\n0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x04,0x00,0x00,0x02,0x00,0x05,0x4d,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xd9,0xc6,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xf1,0x00,0x00,0x02,0x16,0x05,0xdc,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xda,0xcc,0x1e,0x00,0x0a,\r\n0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x3f,0xfe,0x70,0x01,0x54,0x04,0x33,0x02,0x26,0x0c,0xf3,0x00,0x00,0x00,0x06,0x00,0xdf,0x01,0x00,0xff,0xff,0x00,0xa0,0x00,0x00,0x01,0x65,0x05,0xa3,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0xdb,0x34,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0x00,0xb0,0xff,0xed,0x03,0xe9,0x04,0x33,0x00,0x26,0x0c,0xf3,0x00,0x00,0x00,0x07,0x0c,0xf4,0x02,0x04,0x00,0x00,0xff,0xff,0x00,0x11,0xff,0xed,0x02,0xac,0x06,0x2c,0x02,0x26,0x0c,0xf4,0x00,0x00,0x01,0x06,0x00,0xd7,0x1c,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,\r\n0xfe,0x85,0x03,0xec,0x04,0x33,0x02,0x26,0x0c,0xf5,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xa8,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x06,0x28,0x02,0x26,0x0c,0xf6,0x00,0x00,0x01,0x06,0x00,0x8e,0x52,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x06,0x01,0x06,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x03,0x2e,0x04,0x33,\r\n0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x06,0x01,0x9c,0x6b,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x07,0x01,0x9c,0x01,0x13,0x04,0xaa,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x2e,0x04,0x33,0x02,0x26,0x0c,0xf6,0x00,0x00,0x00,0x07,0x00,0xdb,0x01,0x8a,0xfd,0x56,0xff,0xff,0x00,0xb0,\r\n0x00,0x00,0x04,0x7a,0x06,0x28,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x9e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x04,0x7a,0x04,0x33,0x02,0x26,0x0c,0xf8,0x00,0x00,0x00,0x07,0x01,0x9c,0x01,0x0c,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,\r\n0x06,0x2a,0x02,0x26,0x0c,0xf8,0x00,0x00,0x01,0x07,0x00,0xe0,0x01,0x16,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1a,0x01,0x1a,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0xb0,0xfe,0x59,0x04,0x88,0x04,0x33,0x00,0x26,0x00,0x32,0x40,0x18,0x26,0x37,0x25,0x0f,0x25,0x08,0x08,0x25,0x1a,0x17,0x37,0x18,0x20,0x13,0x17,0x25,0x19,0x35,0x0f,0x00,\r\n0x17,0x0a,0x39,0x05,0x00,0x2f,0xed,0x2f,0x33,0x33,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x33,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x01,0x26,0x26,0x27,0x23,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x1e,0x03,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x04,\r\n0x88,0x33,0x5e,0x83,0x4f,0x46,0x2c,0x2c,0x48,0x2f,0x46,0x2f,0x18,0xfd,0xbc,0x20,0x28,0x08,0x05,0x06,0xa0,0xc0,0x02,0x35,0x12,0x19,0x11,0x09,0x03,0x03,0x04,0x04,0xa0,0x13,0x65,0x98,0x65,0x32,0x13,0x9a,0x1d,0x1b,0x42,0x6e,0x52,0x02,0xf1,0x29,0x42,0x13,0x23,0x71,0xfd,0x1f,0x04,0x33,0xfd,0x21,0x19,0x23,0x18,0x10,0x05,0x17,\r\n0x4e,0x39,0x02,0xaa,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0x4d,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x3a,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x05,0xdc,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x3f,0x00,0x1e,\r\n0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x1e,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0xde,0x01,0x7d,0x00,0x1e,0x00,0x0c,0xb5,0x03,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xdf,0x06,0x28,0x02,0x26,0x0c,0xfc,\r\n0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x03,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0xfe,0x85,0x03,0xdf,0x04,0x33,0x02,0x26,0x0c,0xfc,0x00,0x00,0x00,0x07,0x01,0x9c,0x00,0xa0,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xdf,0x06,0x2a,0x02,0x26,0x0c,0xfc,0x00,0x00,0x01,0x07,\r\n0x00,0xe0,0x00,0x83,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x25,0x01,0x25,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x28,0x02,0x26,0x0c,0xfd,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xc9,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x2c,\r\n0x02,0x26,0x0c,0xfd,0x00,0x00,0x01,0x06,0x00,0xd7,0x4e,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xfe,0x50,0x03,0x08,0x04,0x45,0x02,0x26,0x0c,0xfd,0x00,0x00,0x00,0x07,0x00,0xdd,0x00,0xdc,0x00,0x00,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x06,0x2a,0x02,0x26,0x0c,0xfd,0x00,0x00,\r\n0x01,0x06,0x00,0xe0,0x4f,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x19,0xfe,0x50,0x03,0x6c,0x04,0x33,0x02,0x26,0x0c,0xfe,0x00,0x00,0x00,0x07,0x00,0xdd,0x01,0x15,0x00,0x00,0xff,0xff,0x00,0x19,0xfe,0x85,0x03,0x6c,0x04,0x33,0x02,0x26,0x0c,0xfe,0x00,0x00,0x00,0x06,0x01,0x9c,0x2d,0x00,\r\n0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x06,0x2a,0x02,0x26,0x0c,0xfe,0x00,0x00,0x01,0x06,0x00,0xe0,0x43,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x08,0x01,0x08,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x00,0x0f,0x00,0x3d,0x40,0x1f,0x02,0x06,0x37,0x07,0x0b,0x07,0x0a,0x07,0x03,0x03,0x07,0x0a,0x03,0x00,\r\n0x0d,0x00,0x01,0x0d,0x39,0x0e,0x05,0x09,0x39,0x02,0x0a,0x0a,0x07,0x0e,0x35,0x07,0x33,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x03,0x6c,0xfe,\r\n0xa9,0x01,0x0e,0xfe,0xf2,0xa4,0xfe,0xf1,0x01,0x0f,0xfe,0xa8,0x03,0x53,0x03,0xa8,0xfe,0xb6,0x89,0xfe,0x2b,0x01,0xd5,0x89,0x01,0x4a,0x8b,0x00,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xd0,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd8,0x00,0xfe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,\r\n0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0x4d,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xd9,0x01,0x25,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x05,0xdc,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x2a,0x00,0x1e,0x00,0x0a,0xb4,0x01,\r\n0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x3a,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,0x00,0xdc,0x01,0x41,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xff,0xed,0x04,0x26,0x06,0x1e,0x02,0x26,0x0c,0xff,0x00,0x00,0x01,0x07,\r\n0x00,0xde,0x01,0x51,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x16,0x01,0x16,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9c,0xfe,0x70,0x04,0x26,0x04,0x33,0x02,0x26,0x0c,0xff,0x00,0x00,0x00,0x07,0x00,0xdf,0x01,0xaa,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x2c,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0xd7,\r\n0x01,0xbe,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x28,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x43,0x01,0xa6,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x06,0x28,0x02,0x26,\r\n0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x5e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x05,0x00,0x00,0x06,0x64,0x05,0xa5,0x02,0x26,0x0d,0x01,0x00,0x00,0x01,0x07,0x00,0x8f,0x01,0x94,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x27,0x01,0x27,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,\r\n0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x2c,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0xd7,0x67,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x05,0xa5,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0x8f,0x3d,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x10,0x01,0x10,0x00,\r\n0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,0x00,0x43,0x71,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x06,0x28,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x21,0x00,0x1e,0x00,0x0a,\r\n0xb4,0x01,0x0f,0x0b,0x01,0x0b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x05,0xa3,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,0x00,0xdb,0x01,0x3d,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x06,0x2a,0x02,0x26,0x0d,0x04,0x00,0x00,0x01,0x07,\r\n0x00,0xe0,0x00,0x8d,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0a,0x01,0x0a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0xe3,0x02,0x26,0x0c,0xeb,0x00,0x00,0x00,0x27,0x00,0xdc,0x00,0xdf,0xff,0x4b,0x01,0x07,0x00,0x8e,0x01,0x14,0x00,0xd9,0x00,0x2a,0x40,0x1b,0x04,0xe0,0x2f,0x01,0x90,0x2f,0x01,0x90,0x2f,0x01,\r\n0x80,0x2f,0x01,0x70,0x2f,0x01,0x70,0x2f,0x01,0x60,0x2f,0x01,0x2f,0x03,0x02,0x27,0x35,0x00,0x3f,0x35,0x35,0x11,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x35,0xff,0xff,0xff,0xf8,0x00,0x00,0x05,0x56,0x06,0x28,0x02,0x26,0x0d,0x05,0x00,0x00,0x01,0x07,0x00,0x8e,0x02,0x7b,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x16,0x01,0x16,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0x00,0x41,0xff,0xda,0x04,0xa9,0x06,0x28,0x02,0x26,0x0d,0x08,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x69,0x00,0x1e,0x00,0x0a,0xb4,0x03,0x0f,0x35,0x01,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x02,0x06,0x0c,0xeb,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xa1,0x04,0x33,\r\n0x02,0x06,0x0c,0xec,0x00,0x00,0x00,0x01,0x00,0x9c,0x00,0x00,0x03,0x06,0x04,0x33,0x00,0x05,0x00,0x18,0x40,0x0b,0x00,0x07,0x02,0x37,0x03,0x01,0x39,0x04,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0x01,0x2f,0xed,0x11,0x33,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0x06,0xfe,0x3a,0xa4,0x02,0x6a,0x03,0xa6,0xfc,0x5a,0x04,0x33,0x00,\r\n0x00,0x02,0x00,0x2a,0x00,0x00,0x04,0x20,0x04,0x33,0x00,0x05,0x00,0x0e,0x00,0x23,0x40,0x10,0x0e,0x02,0x06,0x05,0x02,0x05,0x0f,0x10,0x09,0x01,0x03,0x35,0x0e,0x39,0x01,0x33,0x00,0x3f,0xed,0x3f,0x12,0x39,0x11,0x12,0x01,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x33,0x01,0x27,0x01,0x26,0x27,0x23,0x06,0x06,\r\n0x07,0x01,0x04,0x20,0xfc,0x0a,0x01,0xa7,0xa4,0x01,0xab,0xcb,0xfe,0xed,0x1c,0x04,0x03,0x03,0x10,0x0e,0xfe,0xf3,0x39,0x03,0xfa,0xfc,0x06,0x51,0x02,0x9a,0x44,0x26,0x12,0x35,0x23,0xfd,0x66,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x04,0x33,0x02,0x06,0x0c,0xef,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x03,0xb3,0x04,0x33,\r\n0x02,0x06,0x0d,0x04,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x02,0x06,0x0c,0xf2,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x00,0x03,0x00,0x17,0x00,0x27,0x00,0x2f,0x40,0x18,0x02,0x01,0x20,0x04,0x38,0x18,0x18,0x29,0x20,0x38,0x0e,0x00,0x39,0x01,0x01,0x25,0x1b,0x39,0x13,0x36,0x25,0x39,\r\n0x09,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x01,0x35,0x21,0x15,0x25,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xac,0x01,0x95,0x01,0x54,0x52,\r\n0x91,0xc9,0x77,0x78,0xc6,0x8e,0x4e,0x4b,0x8f,0xd0,0x85,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,0xb8,0xc0,0x01,0xdd,0x8b,0x8b,0x4a,0x86,0xd4,0x93,0x4d,0x4f,0x90,0xc8,0x79,0x7c,0xd0,0x97,0x55,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0xff,0xff,0x00,0xb0,\r\n0x00,0x00,0x01,0x54,0x04,0x33,0x02,0x06,0x0c,0xf3,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x02,0x06,0x0c,0xf5,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x04,0x15,0x04,0x33,0x00,0x0d,0x00,0x22,0x40,0x0f,0x04,0x03,0x0d,0x00,0x03,0x00,0x0f,0x0e,0x04,0x08,0x01,0x0d,0x33,0x01,0x35,0x00,0x3f,0x3f,0x12,0x39,\r\n0x39,0x11,0x12,0x01,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x31,0x01,0x33,0x01,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x01,0xbd,0xa3,0x01,0xb5,0xb9,0xfe,0xf4,0x20,0x1e,0x04,0x03,0x04,0x20,0x22,0xfe,0xee,0x04,0x33,0xfb,0xcd,0x02,0xc0,0x53,0x5f,0x1c,0x17,0x61,0x57,0xfd,0x41,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,\r\n0x05,0x62,0x04,0x33,0x02,0x06,0x0c,0xf7,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x02,0x06,0x0c,0xf8,0x00,0x00,0x00,0x03,0x00,0x49,0x00,0x00,0x03,0x4c,0x04,0x33,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x30,0x40,0x19,0x02,0x03,0x06,0x07,0x04,0x0b,0x0a,0x0b,0x0a,0x0b,0x0c,0x0d,0x05,0x39,0x06,0x06,0x02,0x0a,\r\n0x39,0x09,0x33,0x01,0x39,0x02,0x35,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x21,0x35,0x21,0x13,0x21,0x35,0x21,0x03,0x36,0xfd,0x29,0x02,0xd7,0x73,0xfe,0x0f,0x01,0xf1,0x89,0xfc,0xfd,0x03,0x03,0x03,0xa3,0x90,0xfd,0xa7,0x8c,0xfd,0x9a,\r\n0x91,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x02,0x06,0x0c,0xf9,0x00,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x37,0x04,0x33,0x00,0x07,0x00,0x1b,0x40,0x0d,0x04,0x37,0x05,0x00,0x37,0x01,0x03,0x39,0x06,0x35,0x01,0x05,0x33,0x00,0x3f,0x33,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x11,\r\n0x23,0x11,0x21,0x04,0x37,0xa5,0xfd,0xc2,0xa4,0x03,0x87,0x03,0xa6,0xfc,0x5a,0x04,0x33,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x02,0x06,0x0c,0xfa,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x00,0x03,0x63,0x04,0x33,0x00,0x0b,0x00,0x34,0x40,0x1a,0x08,0x04,0x03,0x07,0x09,0x0b,0x04,0x09,0x0b,0x0b,0x09,0x04,0x03,0x0d,\r\n0x0a,0x02,0x04,0x08,0x39,0x05,0x35,0x02,0x0a,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x32,0x11,0x33,0x31,0x30,0x21,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x03,0x63,0xfc,0xcd,0x01,0x82,0xfe,0xa1,0x02,0xdc,0xfe,0x0d,0x01,0x27,0xfe,0xb0,\r\n0x02,0x50,0x44,0x01,0xe5,0x01,0xbd,0x4d,0x8c,0xfe,0x87,0xfe,0x59,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x02,0x06,0x0c,0xfe,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x04,0x33,0x02,0x06,0x0d,0x03,0x00,0x00,0x00,0x03,0x00,0x50,0xff,0xf5,0x04,0xb1,0x04,0x3d,0x00,0x1d,0x00,0x2a,0x00,0x37,0x00,0x46,\r\n0x40,0x23,0x1f,0x12,0x01,0x37,0x37,0x0f,0x02,0x02,0x09,0x18,0x37,0x25,0x32,0x37,0x09,0x1f,0x37,0x3a,0x04,0x00,0x04,0x1e,0x2c,0x3a,0x0f,0x12,0x0f,0x04,0x0f,0x04,0x0f,0x02,0x10,0x36,0x02,0x00,0x2f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,\r\n0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x15,0x23,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x02,0xcd,0x99,0x18,0x66,0xaa,0x79,0x43,0x43,0x7a,\r\n0xaa,0x67,0x16,0x99,0x17,0x69,0xaa,0x78,0x42,0x44,0x79,0xa9,0x65,0x19,0x17,0x46,0x70,0x4e,0x29,0x2a,0x4f,0x70,0x46,0xae,0x14,0x45,0x71,0x4f,0x2b,0x29,0x4e,0x70,0x47,0x8b,0x96,0x96,0x3e,0x71,0x9c,0x5f,0x5d,0x97,0x6a,0x3a,0x70,0x70,0x3b,0x6b,0x97,0x5b,0x5f,0x9c,0x71,0x3e,0x02,0xc4,0xfd,0xc1,0x27,0x4b,0x6c,0x46,0x41,0x69,\r\n0x49,0x28,0xfd,0xc1,0x02,0x3f,0x27,0x49,0x6a,0x42,0x46,0x6c,0x4a,0x27,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x02,0x06,0x0d,0x02,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x04,0xc3,0x04,0x33,0x00,0x1b,0x00,0x34,0x40,0x1a,0x0d,0x00,0x37,0x0e,0x1b,0x1b,0x06,0x15,0x37,0x14,0x07,0x37,0x06,0x01,0x19,0x39,0x0c,0x10,\r\n0x10,0x0e,0x1b,0x06,0x14,0x35,0x0e,0x33,0x00,0x3f,0x3f,0x33,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x11,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x02,0xec,0x19,0x97,\r\n0x88,0x9f,0xe1,0xdd,0x19,0x99,0x19,0xd7,0xe6,0x9e,0x88,0x97,0x19,0x04,0x33,0xfd,0x60,0x8a,0x89,0x01,0x8d,0xfe,0x73,0xc6,0xd4,0xfe,0xf4,0x01,0x0c,0xd1,0xc9,0x01,0x8d,0xfe,0x73,0x89,0x8a,0x02,0xa0,0x00,0x00,0x01,0x00,0x58,0x00,0x00,0x04,0xb8,0x04,0x45,0x00,0x2b,0x00,0x2a,0xbc,0x00,0x0f,0x01,0x50,0x00,0x1b,0x00,0x25,0x01,\r\n0x50,0x40,0x0d,0x05,0x0a,0x39,0x20,0x36,0x2a,0x12,0x03,0x15,0x39,0x01,0x14,0x33,0x00,0x3f,0x33,0xed,0x32,0x32,0x32,0x3f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x15,0x21,0x35,0x21,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,\r\n0x14,0x0e,0x02,0x07,0x21,0x04,0xb8,0xfe,0x51,0x80,0x86,0x36,0x64,0x90,0x5a,0x5c,0x92,0x66,0x37,0x87,0x81,0xfe,0x50,0x01,0x0d,0x48,0x67,0x40,0x1e,0x51,0x93,0xcd,0x7d,0x7f,0xd0,0x93,0x50,0x1e,0x41,0x65,0x48,0x01,0x0c,0x8a,0x5d,0xd4,0x89,0x59,0x8c,0x62,0x33,0x33,0x62,0x8c,0x58,0x89,0xd5,0x5d,0x8a,0x8b,0x2c,0x62,0x6f,0x81,\r\n0x4c,0x75,0xb8,0x80,0x43,0x42,0x7f,0xb9,0x76,0x4b,0x81,0x70,0x61,0x2d,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x06,0x28,0x02,0x26,0x0c,0xeb,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x1c,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x06,0x28,0x02,0x26,0x0c,0xef,\r\n0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xe8,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x06,0x28,0x02,0x26,0x0c,0xf2,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x6f,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x0c,0x01,0x0c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x87,0x00,0x00,\r\n0x02,0x0c,0x06,0x28,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x06,0x00,0x8e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x06,0x28,0x02,0x26,0x0c,0xf9,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x65,0x00,0x1e,0x00,0x0a,0xb4,0x02,0x0f,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,\r\n0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x06,0x28,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x07,0x00,0x8e,0x00,0xf5,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0x00,0x00,0x04,0xb8,0x06,0x28,0x02,0x26,0x0d,0x80,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x6d,0x00,0x1e,0x00,0x0a,0xb4,0x01,\r\n0x0f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x14,0x00,0x00,0x03,0xa7,0x05,0xa5,0x02,0x26,0x0d,0x03,0x00,0x00,0x01,0x06,\r\n0x00,0x8f,0x3d,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x10,0x01,0x10,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,0x05,0x8a,0x02,0x26,0x0c,0xef,0x00,0x00,0x01,0x06,0x00,0x8f,0x45,0x03,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x0d,0x01,0x0d,0x00,0x11,0x5d,0x35,0x35,0x00,0x01,0x00,0x22,0xff,0xf2,0x04,0x3f,0x04,0x33,\r\n0x00,0x1d,0x00,0x3e,0x40,0x20,0x13,0x0b,0x37,0x0c,0x19,0x37,0x06,0x01,0x11,0x06,0x0c,0x06,0x0c,0x06,0x1f,0x0e,0x0a,0x39,0x13,0x13,0x0f,0x03,0x3a,0x1c,0x34,0x12,0x0e,0x39,0x0f,0x35,0x0c,0x33,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x32,\r\n0x31,0x30,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x02,0x7c,0x32,0x49,0x4a,0x58,0x7e,0x72,0xba,0xa3,0xfe,0xd6,0x03,0x3a,0xfe,0x93,0xca,0x59,0x90,0x66,0x37,0xa4,0x97,0x4c,0x04,0x8c,0x19,0x5f,0x52,0x60,0x68,0xfe,0x10,\r\n0x03,0xa9,0x8a,0x8a,0xfe,0xce,0x2c,0x56,0x7c,0x51,0x94,0xa2,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x1a,0x06,0x28,0x00,0x26,0x0d,0x6b,0x14,0x00,0x01,0x07,0x00,0x8e,0x00,0xd6,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x06,0x01,0x06,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x58,0xff,0xee,0x03,0xca,0x04,0x45,0x00,0x1c,0x00,0x2e,0x40,0x17,\r\n0x0f,0x16,0x07,0x1c,0x1c,0x1e,0x14,0x17,0x38,0x07,0x17,0x39,0x14,0x14,0x1a,0x11,0x39,0x0c,0x36,0x1a,0x39,0x02,0x34,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x33,0x31,0x30,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,\r\n0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x03,0xca,0x83,0xc3,0x7d,0xcd,0x92,0x50,0x56,0x9a,0xd4,0x7f,0xb0,0x7f,0x86,0xaa,0xb1,0xcf,0x15,0x01,0xf7,0xfe,0x08,0x0e,0xc8,0xb4,0xb9,0x83,0x2d,0x3f,0x48,0x89,0xc7,0x7f,0x8a,0xd6,0x93,0x4d,0x2c,0x9e,0x40,0xa9,0xb6,0x89,0xa5,0xb7,0x48,0xff,0xff,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45,\r\n0x02,0x06,0x0c,0xfd,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x01,0x54,0x04,0x33,0x02,0x06,0x0c,0xf3,0x00,0x00,0xff,0xff,0xff,0xe0,0x00,0x00,0x02,0x27,0x05,0xa5,0x02,0x26,0x0c,0xf3,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x63,0x00,0x1e,0x00,0x0c,0xb5,0x02,0x01,0x0f,0x05,0x01,0x05,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x11,\r\n0xff,0xed,0x01,0xe5,0x04,0x33,0x02,0x06,0x0c,0xf4,0x00,0x00,0x00,0x02,0x00,0x0d,0xff,0xef,0x06,0x32,0x04,0x33,0x00,0x26,0x00,0x2f,0x00,0x44,0xb6,0x02,0x19,0x1b,0x28,0x37,0x00,0x21,0xb8,0x01,0x50,0x40,0x1b,0x2c,0x19,0x00,0x2c,0x2c,0x00,0x19,0x03,0x31,0x0f,0x27,0x39,0x1b,0x1b,0x28,0x02,0x39,0x19,0x35,0x11,0x39,0x0c,0x34,\r\n0x28,0x39,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x11,0x33,0x31,0x30,0x21,0x11,0x21,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x12,0x37,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,\r\n0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x03,0x37,0xfe,0xe5,0x0e,0x1a,0x16,0x14,0x08,0x0f,0x26,0x45,0x6f,0x5a,0x42,0x30,0x2b,0x33,0x2c,0x38,0x27,0x1e,0x12,0x19,0x34,0x1d,0x02,0x4a,0xe2,0x58,0x8b,0x60,0x33,0x36,0x65,0x8f,0x58,0xd6,0xc4,0x70,0x7a,0x74,0x76,0x03,0xa9,0x66,0xa5,0x87,0x6a,0x2a,0x4e,0x92,0x70,0x44,0x0f,\r\n0x8f,0x16,0x28,0x51,0x7a,0x52,0x70,0x01,0x39,0xce,0xfe,0x44,0x2b,0x50,0x73,0x48,0x4a,0x77,0x53,0x2d,0x01,0xed,0xfe,0x9d,0x52,0x5d,0x60,0x54,0x00,0x02,0x00,0xb0,0x00,0x00,0x06,0x46,0x04,0x33,0x00,0x08,0x00,0x1f,0x00,0x49,0xb6,0x1f,0x01,0x37,0x14,0x1c,0x14,0x0e,0xb8,0x01,0x50,0x40,0x1c,0x05,0x14,0x05,0x14,0x05,0x21,0x1b,\r\n0x17,0x37,0x18,0x16,0x39,0x1b,0x00,0x39,0x1f,0x1b,0x1f,0x1b,0x1f,0x1d,0x19,0x35,0x01,0x39,0x17,0x14,0x33,0x00,0x3f,0x33,0xed,0x3f,0x33,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x32,\r\n0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x03,0xf3,0xbf,0x70,0x7a,0x6f,0x76,0x1e,0x58,0x8a,0x5e,0x31,0x36,0x65,0x8f,0x58,0xfe,0x8c,0xfe,0x03,0xa3,0xa3,0x01,0xfd,0xa3,0x01,0xed,0xfe,0x9d,0x52,0x5d,0x60,0x54,0x8a,0x2b,0x50,0x73,0x48,0x4a,0x77,0x53,0x2d,0x01,0xec,0xfe,\r\n0x14,0x04,0x33,0xfe,0x43,0x01,0xbd,0xfe,0x44,0x00,0x00,0x01,0x00,0x22,0x00,0x00,0x04,0x64,0x04,0x33,0x00,0x12,0x00,0x34,0x40,0x1a,0x0f,0x07,0x37,0x08,0x00,0x37,0x01,0x08,0x01,0x08,0x01,0x14,0x0a,0x06,0x39,0x0f,0x0f,0x08,0x0e,0x0a,0x39,0x0b,0x35,0x01,0x08,0x33,0x00,0x3f,0x33,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,\r\n0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x20,0x11,0x04,0x64,0xa4,0x6f,0x65,0xfc,0xa3,0xfe,0xd5,0x03,0x3a,0xfe,0x94,0xfd,0x01,0x77,0x01,0x24,0x66,0x5f,0xfe,0x17,0x03,0xa9,0x8a,0x8a,0xfe,0xc7,0xfe,0xb4,0x00,0xff,0xff,\r\n0x00,0xb0,0x00,0x00,0x03,0xec,0x06,0x28,0x02,0x26,0x0c,0xf5,0x00,0x00,0x01,0x07,0x00,0x8e,0x01,0x42,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x13,0x01,0x13,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x36,0xff,0xed,0x03,0xf4,0x05,0xdc,0x02,0x26,0x0d,0xab,0x00,0x00,0x01,0x07,0x00,0xda,0x00,0xea,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1c,\r\n0x01,0x1c,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0xb0,0xfe,0xe0,0x04,0x2f,0x04,0x33,0x00,0x0b,0x00,0x2e,0x40,0x17,0x01,0x37,0x04,0x00,0x37,0x09,0x04,0x09,0x04,0x09,0x0d,0x08,0x37,0x05,0x0a,0x06,0x35,0x08,0x39,0x01,0x05,0x33,0x03,0x00,0x2f,0x3f,0x33,0xed,0x3f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,\r\n0x31,0x30,0x21,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0x2f,0xfe,0x8b,0x98,0xfe,0x8e,0xa3,0x02,0x38,0xa4,0xfe,0xe0,0x01,0x20,0x04,0x33,0xfc,0x57,0x03,0xa9,0x00,0xff,0xff,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x33,0x02,0x06,0x0c,0xeb,0x00,0x00,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x9c,0x04,0x33,0x00,0x10,\r\n0x00,0x1b,0x00,0x2f,0x40,0x18,0x03,0x12,0x0b,0x38,0x16,0x16,0x1d,0x05,0x12,0x37,0x00,0x11,0x39,0x05,0x05,0x12,0x04,0x39,0x01,0x35,0x12,0x39,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x33,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,\r\n0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0xb0,0x02,0x7c,0xfe,0x27,0xca,0x58,0x8e,0x64,0x35,0x38,0x67,0x92,0x59,0xbf,0xac,0x7d,0x75,0x1b,0x3b,0x5c,0x40,0x04,0x33,0x8a,0xfe,0xce,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xed,0xfe,0x9d,0x50,0x5f,0x30,0x45,0x2b,0x14,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,\r\n0x03,0xa1,0x04,0x33,0x02,0x06,0x0c,0xec,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x1a,0x04,0x33,0x00,0x06,0x0d,0x6b,0x14,0x00,0x00,0x02,0x00,0x12,0xfe,0xdf,0x04,0x6c,0x04,0x33,0x00,0x0f,0x00,0x18,0x00,0x44,0x40,0x23,0x0f,0x37,0x02,0x0e,0x37,0x10,0x12,0x37,0x0c,0x18,0x07,0x0c,0x07,0x10,0x06,0x02,0x10,0x02,0x10,0x1a,\r\n0x03,0x37,0x06,0x12,0x39,0x0c,0x35,0x01,0x04,0x0e,0x07,0x18,0x39,0x03,0x33,0x00,0x3f,0xed,0x32,0x32,0x2f,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x36,0x37,0x12,0x37,0x21,0x11,0x33,0x21,0x11,\r\n0x21,0x06,0x06,0x07,0x06,0x06,0x07,0x04,0x6c,0x98,0xfc,0xd7,0x99,0x5d,0x3c,0x64,0x2a,0x55,0x0a,0x02,0x34,0xa0,0xfe,0xbd,0xfe,0xfd,0x07,0x2d,0x27,0x27,0x56,0x30,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0xab,0x61,0xdf,0x81,0x01,0x02,0xe6,0xfc,0x57,0x03,0x1f,0x58,0xcb,0x75,0x76,0xc2,0x4f,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x27,\r\n0x04,0x33,0x02,0x06,0x0c,0xef,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x05,0xe7,0x04,0x33,0x00,0x1d,0x00,0x17,0x40,0x0a,0x06,0x37,0x07,0x07,0x1f,0x1e,0x15,0x35,0x07,0x33,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xed,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x01,0x16,\r\n0x17,0x33,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x05,0xe7,0xc9,0xfe,0x47,0x15,0x0a,0x04,0x9c,0x04,0x0b,0x13,0xfe,0x46,0xca,0x01,0xff,0xfe,0x25,0xb9,0x01,0xa7,0x13,0x0b,0x04,0x9c,0x04,0x0a,0x15,0x01,0xa6,0xb8,0xfe,0x26,0x01,0xec,0x14,0x11,0xfd,0xef,0x02,0x11,0x10,0x15,0xfe,0x14,0x02,0x2e,0x02,0x05,0xfe,0x2f,0x15,\r\n0x10,0x01,0xf6,0xfe,0x0a,0x10,0x15,0x01,0xd1,0xfd,0xfb,0x00,0x00,0x01,0x00,0x50,0xff,0xee,0x03,0x3d,0x04,0x45,0x00,0x2f,0x00,0x39,0x40,0x1e,0x10,0x38,0x17,0x0c,0x23,0x03,0x00,0x20,0x20,0x00,0x29,0x38,0x08,0x08,0x31,0x00,0x24,0x0b,0x3a,0x0c,0x0c,0x1b,0x03,0x3b,0x2e,0x34,0x15,0x3b,0x1b,0x36,0x00,0x3f,0xed,0x3f,0xed,0x11,\r\n0x39,0x2f,0xed,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x37,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x50,0x88,0xa9,\r\n0x3d,0x65,0x46,0x27,0xfe,0xd9,0x76,0x6c,0x7e,0x89,0x1e,0x38,0x50,0x33,0x8e,0x89,0x42,0x96,0x56,0x54,0x88,0x60,0x34,0x75,0x71,0x3d,0x64,0x47,0x27,0x3d,0x72,0xa2,0x65,0xca,0x2d,0x96,0x5c,0x1b,0x33,0x48,0x2d,0xc2,0x80,0x60,0x58,0x25,0x3e,0x2c,0x18,0x55,0x8d,0x22,0x20,0x26,0x46,0x61,0x3b,0x69,0x83,0x1c,0x03,0x06,0x2b,0x44,\r\n0x59,0x34,0x4a,0x77,0x54,0x2d,0x00,0x01,0x00,0xb0,0x00,0x00,0x04,0x7a,0x04,0x33,0x00,0x18,0x00,0x1e,0x40,0x0e,0x0e,0x37,0x0c,0x0f,0x0f,0x1a,0x17,0x01,0x37,0x00,0x17,0x33,0x01,0x35,0x00,0x3f,0x3f,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x13,0x33,0x11,0x14,0x06,0x07,0x33,0x3e,0x03,0x37,0x01,0x33,0x11,0x23,\r\n0x11,0x34,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0xb0,0x99,0x04,0x04,0x03,0x03,0x09,0x11,0x19,0x12,0x02,0x35,0xb9,0x99,0x06,0x05,0x08,0x29,0x1f,0xfd,0xcc,0xae,0x04,0x33,0xfd,0x39,0x39,0x4e,0x17,0x05,0x10,0x18,0x23,0x19,0x02,0xfc,0xfb,0xcd,0x02,0xe1,0x71,0x23,0x13,0x41,0x2a,0xfd,0x09,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x7a,\r\n0x05,0xdc,0x02,0x26,0x0d,0xa0,0x00,0x00,0x01,0x07,0x00,0xda,0x01,0x65,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1c,0x01,0x1c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0xec,0x04,0x33,0x02,0x06,0x0c,0xf5,0x00,0x00,0x00,0x01,0x00,0x0d,0xff,0xef,0x03,0xda,0x04,0x33,0x00,0x1b,0x00,0x2b,0x40,0x16,0x03,0x37,0x1a,0x00,\r\n0x37,0x01,0x1a,0x01,0x1a,0x01,0x1d,0x10,0x03,0x39,0x1a,0x35,0x12,0x39,0x0d,0x34,0x01,0x33,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x23,0x11,0x21,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x12,0x37,0x21,0x03,0xda,0xa3,0xfe,\r\n0xe5,0x0e,0x1a,0x16,0x14,0x08,0x0f,0x26,0x45,0x6f,0x5a,0x42,0x30,0x2b,0x33,0x2c,0x38,0x27,0x1e,0x12,0x19,0x34,0x1d,0x02,0x4a,0x03,0xa9,0x66,0xa5,0x87,0x6a,0x2a,0x4e,0x92,0x70,0x44,0x0f,0x8f,0x16,0x28,0x51,0x7a,0x52,0x70,0x01,0x39,0xce,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x05,0x62,0x04,0x33,0x02,0x06,0x0c,0xf7,0x00,0x00,\r\n0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x39,0x04,0x33,0x02,0x06,0x0c,0xf2,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x95,0x04,0x45,0x02,0x06,0x0c,0xf9,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x04,0x37,0x04,0x33,0x02,0x06,0x0d,0x78,0x00,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x03,0x92,0x04,0x33,0x02,0x06,0x0c,0xfa,0x00,0x00,\r\n0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x04,0x45,0x02,0x06,0x0c,0xed,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x03,0x6c,0x04,0x33,0x02,0x06,0x0c,0xfe,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xed,0x03,0xf4,0x04,0x33,0x00,0x18,0x00,0x23,0x40,0x10,0x18,0x00,0x00,0x1a,0x12,0x11,0x10,0x16,0x06,0x18,0x11,0x35,0x0b,0x39,0x06,0x34,\r\n0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x31,0x30,0x01,0x01,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x37,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x01,0x03,0xf4,0xfe,0x91,0x2c,0x56,0x61,0x72,0x48,0x57,0x3d,0x45,0x4c,0x1f,0x3a,0x39,0x3b,0x21,0xfe,0x63,0xb6,0x01,0x18,0x08,0x11,\r\n0x06,0x01,0x01,0x23,0x04,0x33,0xfd,0x12,0x5a,0x82,0x54,0x28,0x17,0x98,0x26,0x0e,0x29,0x49,0x3c,0x03,0x01,0xfd,0xdc,0x0e,0x26,0x12,0x02,0x6a,0xff,0xff,0x00,0x50,0xff,0xf5,0x04,0xb1,0x04,0x3d,0x02,0x06,0x0d,0x7d,0x00,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x03,0xe4,0x04,0x33,0x02,0x06,0x0d,0x02,0x00,0x00,0x00,0x01,0x00,0xb0,\r\n0xfe,0xdf,0x04,0xce,0x04,0x33,0x00,0x0b,0x00,0x2a,0x40,0x15,0x02,0x37,0x0b,0x0b,0x09,0x37,0x08,0x08,0x0d,0x05,0x37,0x04,0x08,0x04,0x35,0x0a,0x06,0x39,0x03,0x33,0x01,0x00,0x2f,0x3f,0xed,0x32,0x3f,0x33,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x2f,0xed,0x31,0x30,0x01,0x23,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,\r\n0x04,0xce,0x99,0xfc,0x7b,0xa3,0x02,0x38,0xa4,0x9f,0xfe,0xdf,0x01,0x21,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xb0,0x04,0x33,0x00,0x15,0x00,0x2b,0x40,0x15,0x15,0x37,0x02,0x14,0x14,0x17,0x0c,0x37,0x0b,0x10,0x39,0x02,0x0b,0x05,0x05,0x01,0x14,0x0b,0x35,0x01,0x33,0x00,0x3f,0x3f,0x33,0x12,\r\n0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x23,0x11,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x03,0xb0,0xa3,0x56,0xa7,0x60,0x47,0x72,0x4f,0x2b,0xa3,0x54,0x60,0x4b,0x99,0x55,0xa3,0x01,0xd8,0x28,0x33,0x26,0x4b,0x6f,0x49,0x01,0x8d,0xfe,\r\n0x90,0x64,0x5b,0x28,0x26,0x01,0xe1,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x05,0xc3,0x04,0x33,0x00,0x0b,0x00,0x2e,0x40,0x17,0x07,0x37,0x06,0x0b,0x37,0x0a,0x06,0x0a,0x06,0x0a,0x0d,0x03,0x37,0x02,0x0a,0x06,0x02,0x35,0x08,0x04,0x39,0x01,0x33,0x00,0x3f,0xed,0x32,0x3f,0x33,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,\r\n0x10,0xed,0x31,0x30,0x21,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x05,0xc3,0xfa,0xed,0xa3,0x01,0x95,0xa3,0x01,0x95,0xa3,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x03,0xa9,0x00,0x00,0x01,0x00,0xb0,0xfe,0xdf,0x06,0x61,0x04,0x33,0x00,0x0f,0x00,0x39,0x40,0x1d,0x05,0x37,0x04,0x0e,0x37,0x0b,0x0b,0x09,0x37,0x08,\r\n0x04,0x08,0x04,0x08,0x11,0x01,0x37,0x00,0x0a,0x06,0x02,0x39,0x0f,0x33,0x0d,0x08,0x04,0x00,0x35,0x00,0x3f,0x32,0x32,0x2f,0x3f,0xed,0x32,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x2f,0xed,0x10,0xed,0x31,0x30,0x13,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x21,0xb0,0xa3,0x01,\r\n0x95,0xa3,0x01,0x95,0xa3,0x9e,0x99,0xfa,0xe8,0x04,0x33,0xfc,0x57,0x03,0xa9,0xfc,0x57,0x03,0xa9,0xfc,0x57,0xfe,0x55,0x01,0x21,0x00,0x00,0x02,0x00,0x22,0x00,0x00,0x04,0x3b,0x04,0x33,0x00,0x10,0x00,0x19,0x00,0x33,0x40,0x1a,0x05,0x12,0x37,0x00,0x0b,0x38,0x16,0x00,0x16,0x00,0x16,0x1b,0x02,0x11,0x3a,0x05,0x05,0x12,0x02,0x39,\r\n0x03,0x35,0x12,0x3a,0x00,0x33,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x11,0x21,0x35,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x4d,0xfe,0xd5,0x01,0xce,0xca,0x58,0x8f,0x64,0x36,\r\n0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x03,0xa9,0x8a,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0x00,0x00,0x03,0x00,0xb0,0x00,0x00,0x04,0xf1,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x1b,0x00,0x35,0x40,0x1b,0x09,0x38,0x14,0x18,0x37,0x19,0x14,0x19,0x14,0x19,0x1d,0x03,\r\n0x10,0x37,0x00,0x0f,0x3a,0x03,0x03,0x1a,0x01,0x35,0x10,0x3a,0x19,0x00,0x33,0x00,0x3f,0x32,0xed,0x3f,0x33,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x01,0x23,0x11,\r\n0x33,0xb0,0xa3,0xca,0x58,0x8f,0x64,0x36,0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x02,0xf2,0xa4,0xa4,0x04,0x33,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0xfe,0x0f,0x04,0x33,0x00,0x02,0x00,0xb0,0x00,0x00,0x03,0x9e,0x04,0x33,0x00,0x0e,0x00,0x17,0x00,0x26,0x40,0x13,\r\n0x09,0x38,0x14,0x14,0x19,0x03,0x10,0x37,0x00,0x0f,0x3a,0x03,0x03,0x01,0x35,0x10,0x3a,0x00,0x33,0x00,0x3f,0xed,0x3f,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0xb0,0xa3,0xca,0x58,0x8f,0x64,\r\n0x36,0x39,0x68,0x92,0x59,0xbf,0xac,0x75,0x7f,0x7b,0x79,0x04,0x33,0xfe,0x44,0x2b,0x51,0x73,0x47,0x4a,0x77,0x53,0x2d,0x01,0xf1,0xfe,0x95,0x54,0x5f,0x61,0x57,0x00,0x00,0x01,0x00,0x54,0xff,0xee,0x03,0xc6,0x04,0x45,0x00,0x1c,0x00,0x2e,0x40,0x17,0x15,0x38,0x08,0x06,0x00,0x05,0x05,0x1e,0x0d,0x00,0x06,0x39,0x07,0x07,0x10,0x02,\r\n0x39,0x1a,0x34,0x0b,0x39,0x10,0x36,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0xed,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x54,0x82,0xba,0xb4,0xc8,0x0e,0xfe,0x08,0x01,\r\n0xf7,0x15,0xcf,0xb1,0xaa,0x86,0x7f,0xb0,0x86,0xd7,0x96,0x50,0x50,0x92,0xcd,0x7d,0xc4,0x82,0xbf,0x48,0xb7,0xa5,0x89,0xb6,0xa9,0x40,0x9e,0x2c,0x4d,0x94,0xd6,0x89,0x7f,0xc7,0x89,0x48,0x3f,0x00,0x00,0x02,0x00,0xb0,0xff,0xed,0x06,0x88,0x04,0x45,0x00,0x1a,0x00,0x2a,0x00,0x43,0xb9,0x00,0x23,0x01,0x50,0x40,0x20,0x0a,0x11,0x0a,\r\n0x00,0x38,0x1b,0x0a,0x1b,0x0a,0x1b,0x2c,0x10,0x0c,0x37,0x0d,0x0b,0x3a,0x10,0x10,0x28,0x1e,0x39,0x16,0x36,0x0e,0x35,0x0d,0x33,0x28,0x39,0x05,0x34,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,\r\n0x02,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x07,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x06,0x88,0x52,0x91,0xc9,0x77,0x74,0xc1,0x8d,0x52,0x05,0xf9,0xa3,0xa3,0xfe,0x0e,0x57,0x8c,0xc0,0x78,0x7a,0xc3,0x88,0x49,0xab,0xb7,0xb7,0x57,0x8c,0x62,0x34,0x31,0x5f,0x88,0x57,\r\n0xb8,0xc0,0x02,0x27,0x86,0xd4,0x93,0x4d,0x4b,0x87,0xbd,0x72,0xfe,0x12,0x04,0x33,0xfe,0x3d,0x68,0xac,0x7c,0x45,0x55,0x93,0xc6,0x80,0xc8,0xdc,0x3c,0x6e,0x9b,0x5e,0x5e,0x9a,0x6d,0x3c,0xda,0x00,0x00,0x02,0x00,0x12,0x00,0x00,0x03,0x39,0x04,0x33,0x00,0x1c,0x00,0x27,0x00,0x3d,0xb9,0x00,0x22,0x01,0x50,0x40,0x1b,0x16,0x1d,0x00,\r\n0x37,0x01,0x10,0x01,0x16,0x01,0x16,0x01,0x29,0x09,0x0a,0x10,0x03,0x3a,0x27,0x27,0x09,0x1e,0x3a,0x1c,0x35,0x01,0x09,0x33,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x33,0x10,0xed,0x31,0x30,0x21,0x23,0x11,0x23,0x22,0x0e,0x02,0x07,0x03,0x23,0x13,0x3e,0x03,\r\n0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x03,0x39,0xa4,0x9c,0x16,0x26,0x24,0x24,0x14,0x97,0xb8,0xb7,0x08,0x1b,0x23,0x2b,0x18,0x3b,0x5d,0x40,0x22,0x39,0x66,0x8f,0x56,0x01,0x5d,0xa3,0xb0,0x6d,0x77,0x20,0x3b,0x52,0x33,0x01,0xb5,0x08,0x1b,0x32,0x2a,0xfe,0xca,0x01,\r\n0x63,0x10,0x26,0x24,0x1e,0x09,0x03,0x0c,0x32,0x49,0x5d,0x36,0x46,0x71,0x50,0x2b,0xfe,0x08,0x01,0x72,0x5e,0x58,0x2c,0x45,0x31,0x1a,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x1a,0x04,0xf9,0x00,0x07,0x00,0x1f,0x40,0x0f,0x00,0x37,0x05,0x05,0x09,0x02,0x37,0x03,0x06,0x01,0x39,0x04,0x35,0x03,0x33,0x00,0x3f,0x3f,0xed,0xce,0x01,0x2f,\r\n0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x33,0x03,0x1a,0xfe,0x39,0xa3,0x01,0xda,0x90,0x03,0xa9,0xfc,0x57,0x04,0x33,0xc6,0x00,0x01,0x00,0x35,0x00,0x00,0x03,0xff,0x06,0x04,0x00,0x1d,0x00,0x37,0x40,0x1c,0x1c,0x04,0x84,0x09,0x05,0x05,0x01,0x07,0x13,0x00,0x84,0x01,0x13,0x13,0x08,0x16,0x95,0x0f,\r\n0x01,0x03,0x07,0x95,0x1c,0x08,0x0f,0x01,0x05,0x15,0x00,0x3f,0x33,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x21,0x03,\r\n0xff,0xa4,0xfe,0x2c,0xa4,0xae,0xae,0x40,0x81,0xc2,0x81,0x48,0x7e,0x23,0x2e,0x7f,0x49,0x53,0x7f,0x56,0x2b,0x02,0x78,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xb3,0x8a,0x54,0x09,0x09,0x94,0x0e,0x0d,0x37,0x61,0x85,0x4f,0x0d,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x04,0x01,0x06,0x04,0x00,0x1d,0x00,0x33,0x40,0x1a,0x0b,0x0f,\r\n0x84,0x14,0x10,0x0d,0x10,0x0d,0x01,0x12,0x00,0x84,0x01,0x05,0x95,0x1a,0x01,0x0e,0x12,0x95,0x0b,0x13,0x0f,0x01,0x10,0x15,0x00,0x3f,0x33,0x3f,0x33,0xed,0x32,0x3f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,\r\n0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x04,0x01,0xa2,0x17,0x56,0x2c,0x53,0x79,0x4e,0x25,0xf1,0xf1,0xa4,0xae,0xae,0x3a,0x79,0xbc,0x81,0x3e,0x96,0x5a,0x05,0x6e,0x04,0x07,0x37,0x61,0x85,0x4f,0x0d,0x8b,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xb3,0x8a,0x54,0x0b,0x0d,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x05,0x19,\r\n0x06,0x02,0x00,0x2c,0x00,0x59,0x40,0x2f,0x11,0x28,0x84,0x29,0x00,0x29,0x20,0x24,0x84,0x12,0x0a,0x25,0x29,0x25,0x22,0x22,0x25,0x29,0x03,0x1a,0x2b,0x1a,0x27,0x23,0x2b,0x95,0x2c,0x0a,0x1b,0x0a,0x1b,0x06,0x20,0x11,0x2c,0x0f,0x25,0x29,0x15,0x1d,0x95,0x18,0x01,0x0d,0x95,0x06,0x00,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x3f,0x33,\r\n0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x13,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x15,\r\n0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0xe3,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,0x53,0x30,0x6d,0x71,0x01,0xd5,0x30,0x57,0x78,0x47,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0xf0,0xa4,0xfe,0x2b,0xa4,0xae,0x04,0x00,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0xa6,0x4e,0x80,0x5b,0x33,0x12,0x94,0x1b,\r\n0xd9,0x9e,0x8b,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x00,0x01,0x00,0x35,0x00,0x00,0x06,0x78,0x06,0x04,0x00,0x33,0x00,0x62,0x40,0x36,0x1e,0x08,0x84,0x09,0x0d,0x09,0x32,0x04,0x84,0x1f,0x17,0x05,0x09,0x05,0x09,0x05,0x01,0x0b,0x29,0x00,0x84,0x01,0x2c,0x95,0x25,0x01,0xb0,0x29,0xc0,0x29,0xe0,0x29,0x03,0x17,0x29,0x17,\r\n0x29,0x0c,0x1a,0x95,0x13,0x00,0x07,0x03,0x0b,0x95,0x32,0x1e,0x0c,0x0f,0x05,0x01,0x09,0x15,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x3f,0xed,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,\r\n0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x21,0x06,0x78,0xa4,0xfe,0x2c,0xa4,0xfe,0x2b,0xa4,0xae,0xae,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,\r\n0x53,0x30,0x6d,0x71,0x01,0xd5,0x40,0x81,0xc2,0x81,0x48,0x7e,0x23,0x2e,0x7f,0x49,0x53,0x7f,0x56,0x2b,0x02,0x78,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0x15,0x5e,0xb3,0x8a,0x54,0x09,0x09,0x94,0x0e,0x0d,0x37,0x61,0x85,0x4f,0x0d,0x00,0x00,0x01,\r\n0x00,0x35,0x00,0x00,0x06,0x78,0x06,0x04,0x00,0x33,0x00,0x58,0x40,0x2f,0x29,0x13,0x84,0x14,0x18,0x14,0x0b,0x0f,0x84,0x2a,0x22,0x10,0x14,0x10,0x0d,0x0d,0x10,0x14,0x03,0x01,0x16,0x00,0x84,0x01,0x05,0x95,0x30,0x01,0x22,0x22,0x17,0x25,0x95,0x1e,0x00,0x12,0x0e,0x16,0x95,0x29,0x0b,0x17,0x0f,0x10,0x01,0x14,0x15,0x00,0x3f,0x33,\r\n0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x2f,0x3f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0x33,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,\r\n0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x06,0x78,0xa2,0x17,0x56,0x2c,0x53,0x79,0x4e,0x25,0xf1,0xf1,0xa4,0xfe,0x2d,0xa4,0xae,0xae,0x2f,0x5e,0x8d,0x5f,0x35,0x5b,0x1a,0x1e,0x53,0x30,0x6d,0x71,0x01,0xd3,0x3a,0x79,0xbc,0x81,0x3e,0x96,0x5a,0x05,0x6e,0x04,0x07,\r\n0x37,0x61,0x85,0x4f,0x0d,0x8b,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0x8b,0x15,0x5e,0xa9,0x80,0x4a,0x09,0x09,0x94,0x0e,0x0d,0xb0,0x9e,0x0d,0x15,0x5e,0xb3,0x8a,0x54,0x0b,0x0d,0x00,0x00,0x03,0x00,0x57,0xff,0xef,0x05,0x31,0x04,0x45,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0x6d,0x40,0x3e,0x38,0x05,0x0f,0x33,0x37,0x2c,0x29,0x49,\r\n0x2c,0x53,0x24,0x4e,0x12,0x03,0x17,0x21,0x37,0x58,0x60,0x37,0x17,0x40,0x2c,0x58,0x17,0x17,0x58,0x2c,0x40,0x04,0x69,0x53,0x37,0x0f,0x12,0x4e,0x49,0x05,0x04,0x00,0x5d,0x3b,0x1c,0x2f,0x2f,0x44,0x65,0x24,0x29,0x38,0x04,0x3d,0x1c,0x36,0x44,0x39,0x0a,0x34,0x3d,0x39,0x00,0x34,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x17,0x39,0x12,\r\n0x39,0x2f,0x10,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,\r\n0x1e,0x03,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x13,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x04,0xb2,0x2f,0x4a,0x41,0x3b,0x1f,0x23,0x56,0x6a,\r\n0x7e,0x4b,0x5c,0x97,0x6c,0x3c,0x8b,0x85,0x19,0x30,0x26,0x17,0x30,0x53,0x71,0x41,0x40,0x6c,0x4d,0x2b,0x65,0x65,0x34,0x56,0x4a,0x3f,0x1e,0x33,0x35,0x08,0x07,0xa1,0x08,0x06,0x14,0x2a,0x40,0x2c,0x1d,0x2d,0x2d,0x33,0x21,0x18,0x34,0x1b,0x1e,0x41,0xfd,0x20,0x3a,0x63,0x52,0x44,0x1c,0x2a,0x4f,0x56,0x63,0x3d,0x2d,0x4e,0x39,0x20,\r\n0x26,0x42,0x59,0xde,0x19,0x28,0x31,0x18,0x44,0x51,0x01,0x14,0x21,0x2a,0x17,0x5a,0x50,0x11,0x12,0x23,0x33,0x20,0x1b,0x31,0x26,0x16,0x2a,0x51,0x76,0x4b,0x73,0xa1,0x34,0x10,0x2b,0x36,0x43,0x28,0x3c,0x5b,0x3f,0x20,0x20,0x3c,0x54,0x34,0x5a,0x77,0x2a,0x14,0x3b,0x48,0x53,0x2b,0x55,0xcb,0x70,0x1d,0x32,0x19,0x19,0x2c,0x1e,0x40,\r\n0x86,0x83,0x7e,0x37,0x20,0x2b,0x1a,0x0b,0x0c,0x09,0x85,0x0e,0x0b,0x8b,0x10,0x1d,0x27,0x18,0x3e,0x63,0x4d,0x3a,0x16,0x11,0x29,0x39,0x4a,0x32,0x2f,0x46,0x2e,0x18,0x02,0xd7,0x1f,0x2e,0x1e,0x0e,0x45,0x3b,0x1a,0x2f,0x28,0x20,0x0b,0x1c,0x4e,0x00,0xff,0xff,0x00,0x58,0xff,0xed,0x03,0xbb,0x06,0x2c,0x02,0x26,0x0c,0xed,0x00,0x00,\r\n0x01,0x07,0x00,0xd7,0x00,0xf1,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x1e,0x01,0x1e,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x58,0xff,0xed,0x04,0x20,0x06,0x2c,0x02,0x26,0x0c,0xf1,0x00,0x00,0x01,0x07,0x00,0xd7,0x01,0x1e,0x00,0x1e,0x00,0x0a,0xb4,0x01,0x0f,0x23,0x01,0x23,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x68,0xfe,0x85,0x03,0x08,\r\n0x04,0x45,0x02,0x26,0x0c,0xfd,0x00,0x00,0x00,0x06,0x01,0x9c,0x25,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x2f,0x05,0x9a,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0x29,0x05,0x9a,0x02,0x06,0x00,0x33,0x00,0x00,0xff,0xff,0x00,0x52,0x00,0x00,0x03,0xbf,0x05,0x9a,0x01,0x0f,0x00,0x33,0x04,0x7b,0x05,0x9a,\r\n0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x03,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0x27,0x00,0x00,0xff,0xff,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x02,0x06,0x00,0x37,0x00,0x00,0xff,0xff,0x00,0x27,0x00,0x00,0x04,0x0a,0x05,0x9a,0x01,0x47,0x00,0x37,0xff,0xfe,0x05,0x9a,\r\n0x40,0x00,0xc0,0x00,0x00,0x07,0xb2,0x00,0x07,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0xec,0x05,0xb2,0x02,0x06,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x02,0x06,0x00,0x2e,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x03,0xe8,0x05,0x9a,0x01,0x0f,0x00,0x2e,0x04,0xa4,0x05,0x9a,\r\n0xc0,0x00,0x00,0x07,0xb2,0x00,0x08,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x01,0x0f,0x00,0x26,0x04,0xf4,0x05,0x9a,0xc0,0x00,\r\n0x00,0x07,0xb2,0x00,0x08,0x13,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x02,0x06,0x00,0x3d,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0x94,0x05,0x9a,0x02,0x06,0x00,0x29,0x00,0x00,0xff,0xff,0x00,0x54,0x00,0x00,0x03,0x2c,0x05,0x9a,0x01,0x0f,0x00,0x29,0x03,0xe8,0x05,0x9a,0xc0,0x00,0x00,0x07,\r\n0xb2,0x00,0x08,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x00,0x31,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0x79,0xff,0xe8,0x03,0xde,\r\n0x05,0xb2,0x02,0x06,0x00,0x36,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xc0,0x05,0x9a,0x02,0x06,0x00,0x35,0x00,0x00,0xff,0xff,0x00,0x09,0x00,0x00,0x04,0x0d,0x05,0x9a,0x01,0x0f,0x00,0x35,0x04,0xc9,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x0b,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,\r\n0x05,0x9a,0x01,0x0f,0x00,0x39,0x04,0xf8,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0xe6,0x05,0x9a,0x02,0x06,0x00,0x39,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x02,0x06,0x00,0x2b,0x00,0x00,0xff,0xff,0x00,0x91,0xff,0xe8,0x05,0x1f,0x05,0xb2,\r\n0x01,0x0f,0x00,0x2a,0x05,0x7d,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x08,0x13,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xb0,0x00,0x00,0x02,0xc7,0x05,0xb2,0x01,0x0f,0x00,0x2d,0x02,0xdb,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x0b,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x60,0x05,0x9a,0x02,0x06,0x00,0x3a,\r\n0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x06,0x00,0x3b,0x00,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x04,0x60,0x05,0x9a,0x02,0x06,0x00,0x3c,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x03,0xda,0x05,0x9a,0x01,0x0f,0x00,0x25,0x04,0x96,0x05,0x9a,0xc0,0x00,0x00,0x0b,0xb4,0x02,0x01,0x00,0x01,0x12,0x00,0x3f,\r\n0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x02,0x06,0x00,0x24,0x00,0x00,0xff,0xff,0x00,0x17,0x00,0x00,0x05,0x13,0x05,0x9a,0x01,0x0f,0x00,0x24,0x05,0x29,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x06,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xb4,0x05,0x9a,0x02,0x06,\r\n0x00,0x28,0x00,0x00,0xff,0xff,0x00,0x58,0x00,0x00,0x03,0x50,0x05,0x9a,0x01,0x0f,0x00,0x28,0x04,0x0c,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x01,0x64,0x05,0x9a,0x02,0x06,0x00,0x2c,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x02,0x06,0x00,0x32,\r\n0x00,0x00,0xff,0xff,0x00,0xaa,0xff,0xe8,0x04,0xd5,0x05,0x9a,0x02,0x06,0x00,0x38,0x00,0x00,0xff,0xff,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0xb2,0x01,0x0f,0x00,0x38,0x05,0x7f,0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x05,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x01,0x0f,0x00,0x2f,0x03,0xc4,\r\n0x05,0x9a,0xc0,0x00,0x00,0x07,0xb2,0x00,0x03,0x12,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x5e,0x00,0x00,0x04,0xe0,0x05,0x9a,0x01,0x0f,0x00,0x27,0x05,0x9c,0x05,0x9a,0xc0,0x00,0x00,0x09,0xb3,0x01,0x00,0x01,0x12,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x00,0xcb,0x02,0x06,0x00,0x11,0x00,0x00,0xff,0xff,\r\n0x00,0x27,0xfe,0xf8,0x01,0x3c,0x00,0xe4,0x02,0x06,0x00,0x0f,0x00,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x03,0x0c,0x00,0xcb,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x11,0x01,0xbc,0x00,0x00,0xff,0xff,0x00,0x70,0xfe,0xf8,0x02,0xf8,0x00,0xe4,0x00,0x26,0x00,0x11,0x00,0x00,0x00,0x07,0x00,0x0f,0x01,0xbc,0x00,0x00,0xff,0xff,\r\n0x00,0x27,0xfe,0xf8,0x01,0x52,0x04,0x16,0x02,0x06,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x70,0xff,0xea,0x01,0x50,0x04,0x16,0x02,0x06,0x00,0x1d,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0xea,0x04,0x83,0x02,0x7b,0x00,0x26,0x00,0x10,0x00,0x00,0x00,0x07,0x00,0x11,0x03,0x33,0x00,0x00,0xff,0xff,0x00,0x90,0x01,0xc8,0x02,0xb2,0x03,0xf4,\r\n0x02,0x27,0x00,0x10,0x00,0x00,0x01,0x79,0x00,0x06,0x00,0x10,0x00,0xce,0x00,0x01,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x00,0x0b,0x00,0x61,0x40,0x40,0x02,0x0a,0x92,0x0b,0x03,0x03,0x07,0x92,0x40,0x06,0x01,0x04,0x0e,0x03,0x07,0x08,0x42,0x0a,0x07,0x40,0x03,0x06,0x0d,0x06,0x4d,0x03,0x06,0x0c,0x06,0x4d,0x03,0x06,0x0b,0x06,\r\n0x4d,0x03,0x7e,0x08,0x08,0x04,0x0d,0x06,0x4d,0x08,0x02,0x0c,0x06,0x4d,0x08,0x02,0x0b,0x06,0x4d,0x08,0x40,0x0d,0x01,0x4d,0x0c,0x0d,0x08,0x7e,0xff,0x30,0x2b,0x01,0x2b,0x2b,0x2b,0x2b,0x10,0xe1,0x2b,0x2b,0x2b,0x1a,0x18,0xcd,0x32,0x2b,0x01,0x10,0xe1,0x32,0x00,0x18,0x2f,0x1a,0xed,0x32,0x3f,0xed,0x32,0x31,0x30,0x01,0x15,0x23,\r\n0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x23,0x35,0x01,0xf0,0x8c,0x8c,0xfe,0x40,0x8c,0x8c,0x05,0x9a,0x90,0xfb,0x86,0x90,0x90,0x04,0x7a,0x90,0x00,0x00,0x02,0x00,0x5e,0xfe,0x7c,0x05,0xcc,0x05,0xb2,0x00,0x28,0x00,0x38,0x00,0x96,0x40,0x29,0x78,0x12,0x01,0x14,0x00,0x29,0x91,0x0b,0x04,0x31,0x91,0x00,0x19,0xee,0x24,0x1e,0x1e,0x75,\r\n0x14,0x01,0x14,0x00,0x07,0x0f,0x06,0x0d,0x06,0x4d,0x0f,0x06,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x7d,0x35,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x35,0xb8,0xff,0xea,0xb3,0x0c,0x06,0x4d,0x35,0xb8,0xff,0xea,0x40,0x2f,0x0b,0x06,0x4d,0x20,0x35,0x30,0x35,0x02,0x35,0x35,0x3a,0x2d,0x06,0x0d,0x06,0x4d,0x2d,0x06,0x0c,0x06,\r\n0x4d,0x2d,0x06,0x0b,0x06,0x4d,0x2d,0x7d,0x07,0x10,0x0d,0x06,0x4d,0x07,0x10,0x0c,0x06,0x4d,0x07,0x10,0x0b,0x06,0x4d,0x07,0x2f,0x3a,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe1,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x5d,0x2b,0x2b,0x2b,0xf1,0x2b,0x2b,0x2b,0x11,0x39,0x39,0x5d,0xc2,0x2f,0x00,0x2f,0xed,0x2f,0xed,0x3f,0xed,0x12,0x39,0x31,0x30,\r\n0x01,0x5d,0x05,0x22,0x2e,0x02,0x27,0x26,0x11,0x10,0x37,0x36,0x21,0x20,0x17,0x16,0x11,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x03,0x22,0x07,0x06,0x11,0x10,0x17,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x02,0xf4,0x40,0x84,0x7c,0x71,0x2e,0xb7,0xba,0xbc,0x01,0x46,0x01,\r\n0x24,0xb6,0xb6,0x3d,0x7c,0xbc,0x80,0x34,0x5b,0x5b,0x62,0x3b,0x10,0x26,0x27,0x24,0x0f,0x10,0x28,0x29,0x28,0x11,0x60,0x99,0x85,0x7c,0x2e,0xe2,0x8d,0x8d,0x89,0x8a,0xdd,0xec,0x88,0x88,0x84,0x84,0x18,0x19,0x33,0x4b,0x32,0xc8,0x01,0x43,0x01,0x5b,0xcd,0xce,0xc8,0xc8,0xfe,0xbd,0x88,0xf1,0xc2,0x87,0x1d,0x38,0x56,0x3b,0x1e,0x03,\r\n0x07,0x09,0x06,0xa2,0x05,0x07,0x05,0x03,0x39,0x63,0x84,0x05,0x7e,0xa3,0xa3,0xfe,0xf7,0xfe,0xf8,0xa3,0xa1,0x9a,0x9a,0x01,0x15,0x01,0x1d,0x9a,0x9b,0x00,0x00,0x03,0x00,0x77,0xff,0xe7,0x05,0x91,0x05,0xb2,0x00,0x29,0x00,0x37,0x00,0x46,0x00,0x69,0x40,0x3c,0x02,0x38,0x3b,0x0b,0x04,0x12,0x04,0x24,0x27,0x1f,0x1c,0x36,0x24,0x05,\r\n0x12,0x01,0x45,0x95,0x04,0x13,0x2f,0x96,0x12,0x04,0x27,0x02,0x25,0x09,0x1f,0x38,0x24,0x40,0x0b,0x36,0x3b,0x1c,0x04,0x17,0x0d,0x25,0xef,0x24,0x17,0x84,0x2a,0x34,0x84,0x0d,0x0d,0x2a,0x24,0x03,0x09,0x01,0x00,0x00,0x48,0x40,0x83,0x09,0x2f,0xe1,0x12,0x39,0x2f,0x33,0x12,0x17,0x39,0x2f,0xe1,0x2f,0xe1,0x2f,0xe1,0x11,0x12,0x17,\r\n0x39,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x39,0x00,0x3f,0xed,0x3f,0xed,0x2f,0x11,0x17,0x39,0x2f,0x11,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x27,0x06,0x21,0x22,0x2e,0x02,0x35,0x34,0x25,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x17,0x3e,0x03,0x37,0x33,0x02,0x07,0x16,0x16,0x01,0x34,0x2e,\r\n0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x17,0x36,0x13,0x26,0x26,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x05,0x91,0xe5,0x9a,0xc2,0xfe,0xed,0x67,0xa7,0x77,0x41,0x01,0x47,0x9b,0x38,0x65,0x8a,0x52,0x4d,0x7e,0x5a,0x31,0x21,0x4c,0x7c,0x5b,0x67,0xbb,0x55,0x17,0x29,0x20,0x12,0x01,0x97,0x01,0xab,0x14,0x87,0xfe,0x34,0x1c,0x30,\r\n0x41,0x25,0x32,0x50,0x39,0x1e,0x8d,0xfe,0x62,0x46,0xcc,0x87,0x45,0x60,0x3c,0x1b,0x2c,0x4d,0x68,0x3d,0xdc,0x9e,0xb7,0x39,0x66,0x8e,0x56,0xfd,0xa7,0xc7,0x8b,0x49,0x7c,0x5a,0x33,0x2d,0x50,0x6e,0x40,0x42,0x6b,0x5f,0x56,0x2d,0x6d,0xbe,0x54,0x21,0x5c,0x67,0x6a,0x2f,0xfe,0xf2,0xd8,0x14,0x87,0x04,0x04,0x27,0x43,0x30,0x1c,0x1e,\r\n0x37,0x4c,0x2e,0x6d,0x9d,0x7a,0xfd,0x30,0x48,0xd3,0x8f,0x23,0x45,0x4b,0x54,0x32,0x3a,0x5e,0x42,0x24,0x00,0x02,0x00,0xb4,0xff,0xee,0x01,0x91,0x05,0x9a,0x00,0x03,0x00,0x17,0x00,0x1e,0x40,0x0f,0x03,0x03,0x02,0x13,0xb0,0x09,0x13,0x01,0x02,0x00,0x7d,0x03,0x04,0xaf,0x0e,0x2f,0xe1,0xd4,0xe1,0x39,0x39,0x00,0x3f,0xfd,0xc6,0x3f,\r\n0x31,0x30,0x01,0x03,0x23,0x03,0x13,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x01,0x77,0x14,0x72,0x14,0xb4,0x11,0x1e,0x28,0x17,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x16,0x28,0x1e,0x12,0x05,0x9a,0xfb,0xf9,0x04,0x07,0xfa,0xc2,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x17,0x28,0x1e,0x12,\r\n0x12,0x1e,0x29,0x00,0x00,0x01,0x00,0x5c,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x14,0x00,0x17,0x40,0x0a,0x14,0x0c,0xb2,0x15,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,0x30,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x5c,0x37,0x4c,\r\n0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x5e,0xfe,0xed,0x01,0x52,0x04,0x17,0x00,0x13,0x00,0x28,0x00,0x22,0x40,0x11,0x05,0xb0,0x0f,0x10,0x28,0x20,0xb2,0x29,0x00,0xaf,0x0a,0x17,0x23,0x14,\r\n0x23,0xaf,0x1d,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0x00,0x10,0xf4,0xc4,0x3f,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0x52,0x12,0x1e,0x29,0x18,0x17,0x28,0x1e,0x11,\r\n0x11,0x1e,0x28,0x17,0x16,0x29,0x20,0x12,0xf4,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x03,0xa8,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x28,0x1e,0x12,0x11,0x1e,0x29,0xfb,0x69,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x02,0x00,0x83,\r\n0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x20,0x00,0x34,0x00,0x32,0x40,0x0b,0x19,0x17,0x95,0x1c,0x04,0x09,0x30,0xb0,0x26,0x13,0x08,0xb8,0x01,0x03,0x40,0x0c,0x09,0x21,0xaf,0x2b,0x2b,0x19,0x00,0x84,0x12,0x12,0x36,0x19,0x2f,0x12,0x39,0x2f,0xe1,0x11,0x39,0x2f,0xe1,0xd4,0xe1,0x00,0x3f,0xfd,0xc6,0x3f,0xfd,0xc6,0x31,0x30,0x01,0x14,\r\n0x07,0x0e,0x03,0x15,0x15,0x23,0x35,0x34,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x31,0xcf,0x31,0x44,0x2a,0x12,0x70,0x0f,0x25,0x3d,0x2d,0x57,0x59,0x21,0x3d,0x55,0x34,0xa9,0x7c,0x99,0xa5,\r\n0x53,0x88,0x60,0x35,0xfe,0xc1,0x11,0x1e,0x28,0x18,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x17,0x28,0x1e,0x12,0x04,0x5a,0xce,0xaf,0x2a,0x41,0x39,0x3a,0x22,0x4a,0x4e,0x31,0x52,0x4a,0x48,0x29,0x4e,0x8f,0x50,0x31,0x51,0x39,0x20,0x85,0xb0,0x60,0x32,0x5a,0x7f,0xfb,0xb5,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x17,0x28,0x1e,\r\n0x12,0x12,0x1e,0x28,0x00,0x02,0x00,0x6f,0x03,0xd0,0x02,0x9c,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x32,0x40,0x18,0x21,0x0c,0x29,0x14,0x04,0x18,0x1e,0x24,0x03,0x09,0x0f,0x15,0x15,0x1e,0xaf,0x24,0x24,0x2b,0x11,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,\r\n0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x05,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x01,0x6b,\r\n0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0x03,0xd0,0x02,0x95,0x05,0xb2,\r\n0x00,0x14,0x00,0x29,0x00,0x2c,0x40,0x15,0x14,0x29,0x0c,0x21,0x04,0x03,0x0f,0x09,0x18,0x24,0x1e,0x00,0x0f,0xaf,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0xc6,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,\r\n0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x6f,0x03,0xd0,0x01,0x61,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x0c,0x14,0x04,0x03,0x09,0x0f,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,\r\n0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,\r\n0x1e,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x15,0x40,0x09,0x14,0x0c,0x04,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x74,0x37,0x4c,0x14,0x1a,0x28,0x1a,\r\n0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x62,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x16,0x00,0x17,0x40,0x0a,0x16,0x0e,0xb2,0x17,0x05,0x11,0x00,0x11,0xaf,0x0b,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,\r\n0x30,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x62,0x1b,0x31,0x24,0x15,0x19,0x1d,0x28,0x1a,0x2f,0x30,0x3b,0x45,0x20,0x35,0x46,0x27,0xde,0x16,0x31,0x31,0x2f,0x15,0x19,0x13,0x0d,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,\r\n0xfe,0xed,0x02,0x95,0x00,0xcf,0x00,0x14,0x00,0x29,0x00,0x2a,0x40,0x14,0x14,0x0c,0x29,0x21,0xb2,0x2a,0x18,0x24,0x1e,0x03,0x0f,0xaf,0x09,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x2f,0xe1,0x39,0x11,0x12,0x39,0x00,0x10,0xf4,0xc4,0x33,0x32,0x31,0x30,0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,\r\n0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,\r\n0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0xff,0xff,0x00,0x60,0xff,0xe8,0x05,0x76,0x05,0xf6,0x00,0x26,0x00,0x47,0x00,0x00,0x01,0x07,0x0e,0x10,0x03,0x70,0x06,0x63,0x00,0x14,0x40,0x0b,\r\n0x02,0x27,0x9d,0x27,0x27,0x10,0x10,0x25,0x02,0x2a,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0xa4,0x02,0x26,0x00,0x2f,0x00,0x00,0x01,0x07,0x0e,0x10,0x01,0x54,0x06,0x11,0x00,0x16,0xb1,0x01,0x15,0xb8,0xff,0xb6,0xb7,0x15,0x15,0x05,0x05,0x25,0x01,0x12,0x04,0x00,0x3f,0x35,0x01,0x2b,\r\n0x11,0x35,0xff,0xff,0x00,0xa6,0x00,0x00,0x02,0x8b,0x05,0xf6,0x00,0x26,0x00,0x4f,0x00,0x00,0x01,0x07,0x0e,0x10,0x00,0x85,0x06,0x63,0x00,0x14,0x40,0x0b,0x01,0x0d,0x78,0x0d,0x0d,0x03,0x03,0x25,0x01,0x10,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0xff,0xe4,0x00,0x00,0x04,0x4a,0x05,0xb2,0x00,0x26,0x00,0x51,0x52,0x00,\r\n0x01,0x07,0x0d,0xfc,0xff,0x70,0x00,0x00,0x00,0x16,0xb1,0x01,0x1f,0xb8,0xff,0x62,0xb7,0x1f,0x1f,0x0a,0x0a,0x25,0x01,0x1f,0x04,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0x5e,0xfe,0x05,0x04,0xec,0x05,0xb2,0x02,0x26,0x00,0x2a,0x00,0x00,0x00,0x07,0x0e,0x10,0x01,0x65,0x00,0x00,0xff,0xff,0x00,0x60,0xfe,0x1e,0x04,0x10,\r\n0x06,0x3c,0x02,0x26,0x00,0x4a,0x00,0x00,0x01,0x0f,0x0e,0x10,0x03,0xe5,0x04,0x41,0xc0,0x00,0x00,0x15,0x40,0x0c,0x02,0x32,0x11,0x26,0x02,0x35,0x0b,0x35,0x2f,0x10,0x18,0x25,0x01,0x2b,0x11,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x04,0xa2,0x05,0x9a,0x02,0x26,0x00,0x2e,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xd6,\r\n0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x03,0xf8,0x05,0xec,0x02,0x26,0x00,0x4e,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0x87,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x05,0x40,0x05,0x9a,0x02,0x26,0x00,0x31,0x00,0x00,0x00,0x07,0x0e,0x10,0x01,0x45,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x03,0xf8,0x04,0x18,0x02,0x26,0x00,0x51,\r\n0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xc5,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x05,0x04,0xc0,0x05,0x9a,0x02,0x26,0x00,0x35,0x00,0x00,0x00,0x07,0x0e,0x10,0x00,0xf9,0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x05,0x02,0xbc,0x04,0x12,0x02,0x26,0x00,0x55,0x00,0x00,0x00,0x06,0x0e,0x10,0xed,0x00,0xff,0xff,0x00,0x2b,0xff,0xea,0x03,0x7f,\r\n0x05,0xf6,0x00,0x26,0x00,0x57,0x00,0x00,0x01,0x07,0x0e,0x10,0x01,0x79,0x06,0x63,0x00,0x16,0xb1,0x01,0x1e,0xb8,0x01,0x37,0xb7,0x1e,0x1e,0x0a,0x0a,0x25,0x01,0x21,0x01,0x00,0x3f,0x35,0x01,0x2b,0x11,0x35,0xff,0xff,0x00,0x79,0xfe,0x05,0x03,0xde,0x05,0xb2,0x02,0x26,0x00,0x36,0x00,0x00,0x00,0x06,0x0e,0x10,0x7f,0x00,0xff,0xff,\r\n0x00,0x68,0xfe,0x05,0x03,0x0f,0x04,0x18,0x02,0x26,0x00,0x56,0x00,0x00,0x00,0x06,0x0e,0x10,0x14,0x00,0xff,0xff,0x00,0x5e,0xfe,0xed,0x01,0x52,0x04,0x17,0x02,0x06,0x0d,0xf7,0x00,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x00,0x08,0x04,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x2f,\r\n0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x36,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,\r\n0x5f,0x2d,0x00,0x01,0x01,0x3d,0xfe,0x05,0x02,0x06,0xff,0x93,0x00,0x12,0x00,0x12,0xb6,0x12,0x0c,0x03,0x0f,0x00,0x0f,0x09,0x2f,0xc1,0xc4,0x12,0x39,0x00,0x2f,0xc4,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x50,0x31,0x21,0x12,0x17,0x24,0x18,0x2b,0x2e,0x33,\r\n0x3d,0x45,0x46,0xfe,0x3a,0x28,0x41,0x17,0x16,0x12,0x0b,0x10,0x22,0x1e,0x22,0x34,0x48,0x45,0x4e,0x7c,0x37,0x00,0xff,0xff,0x00,0x29,0xfe,0x05,0x04,0x0c,0x05,0x9a,0x02,0x26,0x00,0x37,0x00,0x00,0x00,0x06,0x0e,0x10,0x7a,0x00,0xff,0xff,0x00,0x2b,0xfe,0x05,0x02,0x81,0x05,0x2f,0x02,0x26,0x00,0x57,0x00,0x00,0x00,0x06,0x0e,0x10,\r\n0xe5,0x00,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x3d,0x00,0x60,0x40,0x25,0x3b,0x36,0x14,0x0f,0x36,0x0f,0x36,0x0f,0x3f,0x25,0x31,0x28,0x11,0x38,0x38,0x2d,0x1f,0x19,0x0d,0x33,0x0d,0x00,0x01,0x01,0x02,0x0a,0x2d,0x0d,0x26,0x0a,0x0a,0x26,0x0d,0x2d,0x04,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,\r\n0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xcd,0x32,0x11,0x33,0x11,0x33,0x10,0xcd,0x32,0x11,0x33,0x11,0x33,0x01,0x2f,0xcd,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x10,0xcd,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x03,0x16,0x33,\r\n0x32,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,0xce,0x01,0x61,0x93,0x17,\r\n0x12,0x4e,0x11,0x64,0x12,0x15,0x28,0x3a,0x26,0x17,0x32,0x1c,0x11,0x36,0x16,0x14,0x10,0x01,0x06,0x07,0x64,0x08,0x10,0x1a,0x12,0x67,0x0a,0x10,0x07,0x12,0x0e,0x23,0x23,0x11,0x63,0x10,0x06,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x02,0x1c,0x05,0x50,0x29,0x24,0x2f,0x2f,0x24,0x40,0x31,0x1c,0x0d,\r\n0x10,0x0f,0x0d,0x03,0x01,0x32,0x6b,0x4a,0x7a,0x77,0x47,0x78,0x74,0x7a,0x49,0x2a,0x4a,0x24,0x05,0x2c,0x25,0x25,0x27,0x26,0x2e,0x12,0x24,0x00,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x3a,0x00,0x57,0xb3,0x09,0x10,0x10,0x35,0xb8,0x05,0x0d,0xb6,0x2a,0x20,0x20,0x2a,0x30,0x2f,0x1b,0xb8,0x04,0xfd,0x40,\r\n0x11,0x15,0x00,0x01,0x01,0x02,0x0a,0x25,0x0b,0x2f,0x03,0x08,0x15,0x0a,0x15,0x0a,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x10,0xcd,0x32,0x11,0x33,0x10,0xed,0x10,0xcd,0x01,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,\r\n0x39,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x03,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,\r\n0xce,0x01,0x61,0xbf,0x38,0x3f,0x20,0x07,0x12,0x1e,0x25,0x12,0x24,0x33,0x1e,0x41,0x42,0x23,0x45,0x36,0x22,0x09,0x1b,0x2f,0x26,0x24,0x2d,0x19,0x0a,0x15,0x36,0x5d,0x48,0x33,0x3b,0x1e,0x08,0x11,0x26,0x3f,0x2e,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x01,0xa7,0x34,0x4a,0x32,0x1c,0x06,0x0d,0x0f,\r\n0x08,0x03,0x07,0x08,0x67,0x14,0x0d,0x1c,0x2f,0x22,0x0f,0x2c,0x36,0x3f,0x23,0x10,0x21,0x21,0x21,0x11,0x19,0x33,0x31,0x2f,0x16,0x6c,0x0c,0x16,0x14,0x11,0x06,0x0a,0x14,0x18,0x20,0x17,0x00,0x02,0xff,0xba,0xff,0xab,0x05,0x1f,0x06,0xee,0x00,0x0a,0x00,0x30,0x00,0x4f,0xb1,0x09,0x1d,0xbb,0x05,0x0b,0x00,0x1e,0x00,0x14,0x04,0xfd,\r\n0x40,0x14,0x27,0x0b,0x0b,0x27,0x00,0x01,0x01,0x02,0x0a,0x2c,0x08,0x0f,0x1d,0x0a,0x0a,0x1d,0x0f,0x03,0x04,0x05,0xb8,0x04,0xff,0x40,0x09,0x2f,0x08,0x01,0x08,0x09,0x2f,0x04,0x01,0x04,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xcd,0x32,0x11,0x33,0x2f,0x33,0x2f,0x10,0xed,0x01,0x2f,0xed,\r\n0x39,0x31,0x30,0x01,0x07,0x27,0x01,0x07,0x01,0x23,0x35,0x21,0x01,0x01,0x13,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x05,0x1f,0x2a,0xa9,0xfe,0x6d,0x54,0xfe,0x0d,0xb8,0x01,0x00,0x01,0xce,0x01,0x61,0x23,\r\n0x22,0x34,0x10,0x76,0x07,0x16,0x1c,0x24,0x14,0x13,0x11,0x0a,0x0b,0x0a,0x64,0x0c,0x0f,0x0c,0x4a,0x34,0x21,0x39,0x2e,0x22,0x0a,0x02,0x0d,0x1a,0x11,0x03,0x2c,0x65,0x4b,0xfc,0xa0,0x07,0x06,0xa7,0x9c,0xf9,0xc5,0x03,0x08,0x02,0xb5,0x35,0x8b,0x47,0x1b,0x37,0x2b,0x1c,0x17,0x12,0x0f,0x2b,0x4f,0x78,0x5b,0x7a,0x77,0x5e,0x82,0x5a,\r\n0x39,0x15,0x36,0x3e,0x16,0x25,0x31,0x19,0x25,0x3b,0x1f,0x00,0x00,0x02,0x00,0x1e,0xfe,0xa9,0x06,0xd2,0x03,0x61,0x00,0x3b,0x00,0x4d,0x00,0x5d,0xb4,0x38,0x25,0x16,0x10,0x06,0xb8,0x05,0x0a,0xb4,0x25,0x49,0x49,0x25,0x41,0xb8,0x05,0x0a,0xb7,0x2d,0x25,0x2d,0x25,0x2d,0x4f,0x13,0x19,0xb8,0x05,0x0a,0xb3,0x10,0x25,0x05,0x28,0xb8,\r\n0x04,0xfb,0xb5,0x38,0x2f,0x46,0x01,0x46,0x3c,0xb8,0x04,0xfb,0xb4,0x2f,0x32,0x01,0x32,0x1e,0xb9,0x04,0xfb,0x00,0x0b,0x00,0x2f,0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x2f,0x10,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x01,0x0e,0x03,0x07,0x15,0x14,0x0e,\r\n0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x25,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x2e,0x03,0x06,0xd2,0x0f,0x2c,0x39,0x43,0x25,\r\n0x49,0x99,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x09,0x08,0xfe,0xc7,0x01,0xeb,0x13,0x13,0x2b,0x64,0xa5,0x7a,0x62,0x8f,0x64,0x3e,0x24,0x0e,0x02,0x2d,0x57,0x28,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x23,0x30,0x0c,0x33,0x5a,0x23,0xfd,0xf3,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x25,0x4d,0x27,0x07,0x27,0x36,0x43,\r\n0x01,0x7c,0x0d,0x20,0x23,0x25,0x11,0x04,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x31,0x6b,0x3a,0x3a,0x72,0x61,0x64,0xa8,0x48,0x5f,0x84,0x54,0x26,0x1a,0x30,0x42,0x50,0x5b,0x30,0x0e,0x0f,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x38,0x91,0x52,0x1c,0x3b,0x1a,0xa6,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0e,0x0d,\r\n0x3a,0x7a,0x63,0x40,0x00,0x04,0x00,0x7c,0x00,0x00,0x05,0x61,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x5e,0xb4,0x0d,0x0e,0x0e,0x00,0x09,0xbb,0x05,0x0c,0x00,0x08,0x00,0x05,0x05,0x0c,0x40,0x0c,0x04,0x0c,0x0f,0x0f,0x04,0x00,0x08,0x04,0x08,0x04,0x11,0x01,0xb8,0x05,0x0c,0xb5,0x00,0x2f,0x0d,0x01,0x0d,0x0c,0xbb,\r\n0x04,0xe6,0x00,0x0a,0x00,0x06,0x04,0xfe,0xb5,0x08,0x2f,0x05,0x01,0x05,0x02,0xb9,0x04,0xfe,0x00,0x01,0x00,0x2f,0xed,0x2f,0x5d,0x33,0xed,0x32,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x39,0x11,0x33,0x31,0x30,0x13,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x25,0x33,\r\n0x15,0x23,0x05,0x01,0x33,0x01,0xc0,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0xfc,0x12,0x03,0x0d,0x8f,0xfc,0xf3,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0xf7,0xf7,0x5b,0x05,0x58,0xfa,0xa8,0x00,0x00,0x05,0x00,0x7c,0x00,0x00,0x06,0xd5,0x05,0x58,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x6d,0xb4,0x01,0x02,0x02,\r\n0x04,0x11,0xbe,0x05,0x0c,0x00,0x10,0x00,0x0d,0x05,0x0c,0x00,0x0c,0x00,0x09,0x05,0x0c,0x40,0x0f,0x08,0x00,0x03,0x03,0x08,0x04,0x10,0x0c,0x08,0x08,0x0c,0x10,0x03,0x15,0x05,0xb8,0x05,0x0c,0xb3,0x04,0x12,0x0e,0x0a,0xb8,0x04,0xfe,0xb6,0x10,0x0c,0x2f,0x09,0x01,0x09,0x06,0xb8,0x04,0xfe,0xb5,0x05,0x2f,0x01,0x01,0x01,0x00,0xb8,\r\n0x04,0xe6,0x00,0x3f,0x2f,0x5d,0x2f,0xed,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x11,0x33,0x31,0x30,0x33,0x01,0x33,0x01,0x03,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x7c,0x03,0x0d,\r\n0x8f,0xfc,0xf3,0x4b,0xf7,0xf7,0x02,0x36,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0x01,0x74,0xf7,0xf7,0x05,0x58,0xfa,0xa8,0x04,0xfd,0xf7,0xfd,0x4c,0xf7,0xf7,0xf7,0xf7,0xf7,0x00,0x01,0x00,0x76,0xfe,0xf8,0x01,0x8b,0x00,0xe4,0x00,0x03,0x00,0x10,0xb7,0x2f,0x01,0x01,0x01,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x5d,0x31,0x30,0x25,0x13,\r\n0x23,0x03,0x01,0x16,0x75,0x75,0xa0,0xe4,0xfe,0x14,0x01,0xec,0x00,0x02,0xff,0xc8,0x06,0x1d,0x02,0x29,0x08,0xde,0x00,0x2b,0x00,0x2f,0x00,0x2c,0xbc,0x00,0x2f,0x05,0x0d,0x00,0x2c,0x00,0x13,0x05,0x0d,0x40,0x09,0x16,0x26,0x09,0x2d,0x14,0x0e,0x1e,0x2c,0x29,0xb9,0x05,0x01,0x00,0x04,0x00,0x2f,0xfd,0xce,0xde,0xcd,0x2f,0x2f,0x01,\r\n0x2f,0xcd,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x07,0x06,0x06,0x23,0x22,0x22,0x06,0x22,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x11,0x33,0x11,0x02,0x29,0x52,0xab,0x43,0x46,0x6c,0x49,0x26,0x25,0x35,\r\n0x3b,0x16,0x1d,0x10,0x0d,0x0d,0x58,0x10,0x1d,0x26,0x15,0x06,0x0c,0x06,0x03,0x0e,0x0f,0x0e,0x04,0x18,0x26,0x60,0x69,0x63,0x9b,0x7f,0x58,0x06,0x8f,0x61,0x08,0x09,0x0c,0x1e,0x33,0x28,0x29,0x35,0x1f,0x0d,0x08,0x07,0x17,0x16,0x01,0x76,0xfe,0x7e,0x26,0x34,0x21,0x11,0x03,0x01,0x01,0x01,0x0f,0x12,0x19,0x10,0x09,0x48,0x02,0x0d,\r\n0xfd,0xf3,0x00,0x02,0x00,0x43,0x06,0x1f,0x01,0x6c,0x08,0xbb,0x00,0x16,0x00,0x1a,0x00,0x23,0xb2,0x17,0x17,0x0e,0xbb,0x05,0x0d,0x00,0x07,0x00,0x19,0x04,0xfd,0xb2,0x18,0x0a,0x02,0xb9,0x04,0xfd,0x00,0x13,0x00,0x2f,0xfd,0xd6,0xd6,0xed,0x01,0x2f,0xed,0x33,0x2f,0x31,0x30,0x13,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,\r\n0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x13,0x23,0x35,0x33,0x43,0x36,0x28,0x21,0x2c,0x1a,0x0b,0x1d,0x13,0x5a,0x17,0x18,0x1f,0x38,0x4b,0x2b,0x17,0x2b,0x1a,0xda,0x57,0x57,0x06,0x90,0x11,0x17,0x28,0x38,0x20,0x3f,0x74,0x37,0x39,0x7f,0x34,0x3c,0x5b,0x3e,0x20,0x09,0x0a,0x02,0x33,0x56,0x00,0x01,0x00,0x37,0x06,0x7c,\r\n0x01,0xcf,0x06,0xca,0x00,0x03,0x00,0x0c,0xba,0x00,0x02,0x05,0x00,0x00,0x01,0x00,0x2f,0xed,0x31,0x30,0x13,0x21,0x15,0x21,0x37,0x01,0x98,0xfe,0x68,0x06,0xca,0x4e,0x00,0x02,0x00,0x0d,0x06,0x5c,0x01,0xb5,0x07,0xe2,0x00,0x23,0x00,0x2f,0x00,0x36,0xb2,0x16,0x09,0x13,0xb8,0x05,0x0e,0xb4,0x24,0x19,0x19,0x24,0x2a,0xb8,0x05,0x0e,\r\n0x40,0x0c,0x09,0x16,0x19,0x19,0x20,0x0e,0x27,0x2d,0x03,0x03,0x20,0x1a,0x00,0x2f,0x2e,0xc9,0x2f,0x32,0xd4,0xcd,0x11,0x33,0x2f,0x39,0x01,0x2f,0xed,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x32,0x37,0x35,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,\r\n0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x1e,0x21,0x41,0x26,0x01,0x09,0x06,0x2d,0x1b,0x2b,0x38,0x1d,0x1c,0x34,0x28,0x19,0x3f,0x33,0x05,0x19,0x06,0x2f,0x14,0x23,0x10,0x15,0x2b,0x11,0x28,0x48,0x23,0x01,0x5d,0x2d,0x1b,0x1d,0x30,0x1f,0x17,0x2a,0x35,0x06,0xea,0x08,\r\n0x08,0x01,0x02,0x3c,0x3b,0x22,0x35,0x24,0x13,0x12,0x24,0x36,0x24,0x3b,0x4f,0x17,0x05,0x16,0x05,0x35,0x0f,0x1f,0x0f,0x05,0x03,0x08,0x07,0xb0,0x23,0x22,0x22,0x20,0x1a,0x36,0x19,0x0e,0x32,0x00,0x00,0x01,0x00,0x37,0xff,0x23,0x01,0xcf,0xff,0x71,0x00,0x03,0x00,0x0c,0xba,0x00,0x02,0x05,0x00,0x00,0x01,0x00,0x2f,0xed,0x31,0x30,\r\n0x17,0x21,0x15,0x21,0x37,0x01,0x98,0xfe,0x68,0x8f,0x4e,0x00,0xff,0xff,0x00,0x70,0xfe,0xf8,0x01,0x8b,0x03,0x11,0x02,0x26,0x0e,0x19,0x00,0x00,0x00,0x07,0x00,0x11,0x00,0x00,0x02,0x46,0xff,0xff,0x00,0x9a,0xfe,0x63,0x05,0x91,0x04,0x15,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x64,0xff,0xff,0x00,0x9a,\r\n0xfe,0x0e,0x06,0xae,0x02,0x13,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x0f,0xff,0xff,0xff,0xba,0xff,0x05,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x5b,0x00,0x1a,0x01,0x06,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x5b,\r\n0x00,0x1a,0x01,0x06,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x3e,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0xe4,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0x3e,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,\r\n0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,\r\n0xff,0xea,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x53,\r\n0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0xfe,0xab,0x00,0x01,0xff,0xba,0xff,0xf2,0x04,0xad,0x03,0x0f,0x00,0x35,\r\n0x00,0x41,0xb1,0x0d,0x24,0xb8,0x05,0x0b,0xb4,0x30,0x30,0x37,0x15,0x2a,0xb8,0x05,0x03,0x40,0x09,0x30,0x24,0x24,0x21,0x0c,0x20,0x04,0x00,0x12,0xb8,0x04,0xff,0xb5,0x2f,0x19,0x01,0x19,0x29,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x5d,0xed,0x12,0x17,0x39,0x11,0x33,0x3f,0x01,0x2f,0x12,0x39,0x2f,0xed,\r\n0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,\r\n0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x14,0x35,0x5e,0x4a,0x14,0x62,0x7d,0x4a,0x1e,0x02,0x48,0xab,0xc8,0xe3,0x80,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2b,0x3b,0x25,0x10,0xa7,\r\n0x29,0x46,0x5d,0x35,0x2b,0x5b,0x4b,0x30,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0x00,0x01,0x00,0x52,0xff,0xea,0x04,0x02,0x03,0xba,0x00,0x24,0x00,0x29,0xb1,0x1b,0x0f,0xb8,0x05,0x0a,0xb5,0x06,0x1c,0x21,0x14,0x14,0x03,0xbd,0x04,0xfb,0x00,0x0b,\r\n0x00,0x21,0x05,0x03,0x00,0x15,0x05,0x03,0x00,0x3f,0x3f,0xc4,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x12,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x52,0x61,0xa6,0x39,0x92,0x7f,0x1c,0x31,0x40,0x24,\r\n0xa6,0x38,0x4d,0x1d,0x07,0x18,0x2d,0x46,0x36,0x16,0x21,0x3f,0x38,0x2d,0x0f,0x05,0x1a,0x51,0x64,0x75,0x3e,0x3a,0x9a,0x4b,0xa9,0x0b,0x0b,0x47,0x4e,0x2e,0x92,0xb0,0xc3,0x5f,0xa7,0xfe,0xe3,0x80,0x20,0x4d,0x43,0x2d,0xa7,0x10,0x23,0x39,0x29,0x2d,0x3c,0x25,0x0f,0x0c,0x0a,0x00,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x05,0x5d,\r\n0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x1d,0x04,0xad,0x00,0x01,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x03,0x0f,0x00,0x58,0x00,0x83,0xb1,0x13,0x08,0xb8,0x05,0x0a,0xb2,0x05,0x1e,0x54,0xb8,0x05,0x0a,0xb3,0x51,0x27,0x27,0x49,0xb8,0x05,0x0a,0x40,0x0a,0x42,0x05,0x51,0x42,0x42,0x51,0x05,0x03,0x5a,0x38,0xb8,0x05,0x0a,\r\n0x40,0x0e,0x31,0x2f,0x53,0x01,0x53,0x2f,0x46,0x01,0x46,0x2f,0x35,0x01,0x35,0x3d,0xb8,0x04,0xfb,0xb6,0x1f,0x2c,0x2f,0x2c,0x02,0x2c,0x4c,0xba,0x04,0xfb,0x00,0x23,0x05,0x03,0xb6,0x26,0x12,0x1d,0x03,0x06,0x0d,0x00,0xba,0x04,0xfb,0x00,0x18,0x05,0x03,0xb3,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x3f,0xed,0x32,0x12,0x17,0x39,0x3f,\r\n0xed,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x2f,0x10,0xed,0x39,0x10,0xed,0x39,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,\r\n0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x07,0x57,0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,\r\n0x4f,0x42,0x34,0x12,0x04,0x19,0x3f,0x44,0x46,0x1f,0x42,0x52,0x19,0x05,0x03,0x3d,0x80,0xcc,0x91,0x8a,0xb9,0x70,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x10,0x9b,0x08,0x0c,0x05,0x06,0x58,0x5e,0x22,0x3f,0x30,0x1d,0x9c,0x0b,0x27,0x48,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x8f,0x43,0x62,\r\n0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x26,0x20,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xbb,0x78,0x3f,0x70,0x38,0x42,0x3f,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x00,0x00,0x01,\r\n0xff,0xba,0xff,0xf2,0x06,0xae,0x03,0x0f,0x00,0x4d,0x00,0x68,0xb5,0x27,0x39,0x1e,0x46,0x13,0x08,0xbe,0x05,0x0a,0x00,0x05,0x00,0x49,0x05,0x0a,0x00,0x46,0x00,0x3c,0x05,0x0a,0x40,0x17,0x39,0x48,0x2f,0x3a,0x01,0x3a,0x26,0x1d,0x06,0x13,0x18,0x12,0x12,0x06,0x18,0x41,0x34,0x34,0x33,0x33,0x0d,0x0d,0x00,0xb8,0x04,0xfb,0xb3,0x2c,\r\n0x23,0x0e,0x18,0xb8,0x05,0x03,0xb3,0x2f,0x06,0x01,0x06,0x00,0x2f,0x5d,0x3f,0x33,0x33,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x39,0x2f,0x5d,0x33,0x01,0x2f,0xed,0xd4,0xed,0xd4,0xed,0x39,0x12,0x39,0x11,0x39,0x31,0x30,0x25,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,\r\n0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x04,0xab,0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,\r\n0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x21,0x64,0x77,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x8f,0x43,0x62,\r\n0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0x0b,0xc9,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,\r\n0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0x00,0x02,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x03,0x3c,0x00,0x4b,0x00,0x5f,0x00,0x7b,0xbf,0x00,0x26,0x05,0x0a,0x00,0x1f,0x00,0x5d,0x05,0x0a,0x00,0x2b,0x00,\r\n0x37,0x05,0x0a,0x40,0x0a,0x51,0x2b,0x51,0x1f,0x51,0x1f,0x51,0x0e,0x3d,0x15,0xb8,0x05,0x0a,0x40,0x0a,0x0e,0x5d,0x5d,0x4c,0x4c,0x3c,0x3c,0x42,0x04,0x2b,0xbd,0x04,0xfb,0x00,0x3d,0x00,0x47,0x05,0x03,0x00,0x56,0x04,0xfb,0x40,0x0d,0x2f,0x32,0x01,0x32,0x2f,0x23,0x01,0x23,0x2f,0x12,0x01,0x12,0x1a,0xb8,0x04,0xfb,0xb5,0x1f,0x09,\r\n0x2f,0x09,0x02,0x09,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x39,0x39,0x32,0x2f,0x33,0x11,0x33,0x2f,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x26,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,\r\n0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0xf8,0x1f,0x28,0x12,0x05,0x03,0x3d,0x81,\r\n0xcd,0x94,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x93,0x5d,0x2b,0x12,0x17,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,0x67,0x81,0x9a,0xb4,0x65,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x46,0x38,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,0xa1,0xe7,0x9d,0x5e,0x02,0x99,0x6b,\r\n0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x85,0x75,0x65,0x52,0x3f,0x15,0x5c,0xee,0x03,0x09,0x1d,0x15,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x53,0xc5,0x6e,0x3f,0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x49,0x7d,0xa4,0x5b,\r\n0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x01,0x03,0x08,0x9d,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x2a,0x49,0x63,0x71,0x7a,0x3c,0x02,0x01,0x00,0x00,0x02,0xff,0xba,0xff,0xea,0x08,0x04,0x03,0x3c,0x00,0x42,0x00,0x54,0x00,0x64,0xbc,0x00,0x52,0x05,0x0a,0x00,0x27,0x00,0x33,0x05,0x0a,0xb7,0x48,0x27,0x48,0x27,\r\n0x48,0x1b,0x39,0x22,0xbd,0x05,0x0a,0x00,0x1b,0x00,0x39,0x05,0x03,0x00,0x4d,0x04,0xfb,0x40,0x13,0x2f,0x2e,0x01,0x2e,0x2f,0x1e,0x01,0x1e,0x52,0x52,0x43,0x43,0x38,0x38,0x27,0x27,0x3e,0x09,0x15,0xbc,0x04,0xfb,0x00,0x0e,0x05,0x03,0x00,0x00,0x05,0x03,0x00,0x3f,0x3f,0xed,0x39,0x39,0x32,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x2f,\r\n0x5d,0x2f,0x5d,0xed,0x3f,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x24,0x26,0x26,0x27,0x26,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,\r\n0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x27,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x04,0xe7,0xb3,0xff,0x00,0xaf,0x69,0x1b,0x23,0x2e,0x14,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x27,0x42,0x30,0x1c,0x0f,0x0d,0x9a,0x0b,0x0d,0x08,0x03,0x11,0x21,0x36,0x28,0x18,0x4c,\r\n0x67,0x81,0x9a,0xb4,0x65,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x3e,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x16,0x01,0x06,0x0d,0x0c,0x0f,0x31,0x23,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x18,0x27,0x33,0x1b,0x30,0x6e,0x3d,0x3f,\r\n0x72,0x3a,0x17,0x2b,0x22,0x15,0x02,0x41,0x96,0x95,0x8b,0x6a,0x40,0x49,0x7d,0xa4,0x5b,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0xa9,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x04,0xb2,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x50,\r\n0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x08,0x04,0x04,0xb2,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x02,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x29,0x00,0x3d,0x00,0x4c,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x2f,0x2f,0x0b,0x3b,0x24,0xb8,0x05,0x0a,0x40,0x11,0x21,0x0b,0x25,0x1b,\r\n0x15,0x23,0x15,0x15,0x0b,0x3b,0x3b,0x2a,0x2a,0x1e,0x1e,0x10,0x0a,0xbd,0x04,0xfb,0x00,0x0b,0x05,0x03,0x00,0x34,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x11,0x33,0x2f,0x11,0x33,0x2f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,\r\n0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,\r\n0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,\r\n0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x00,0x02,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x00,0x24,0x00,0x38,0x00,0x43,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x2a,0x2a,0x3a,0x36,0x1f,0xb8,0x05,0x0a,0x40,0x09,0x1c,0x20,0x0c,0x1e,\r\n0x36,0x36,0x25,0x25,0x18,0xb8,0x04,0xff,0xb3,0x11,0x0c,0x0c,0x11,0xbb,0x05,0x03,0x00,0x2f,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x3f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x2f,0x12,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x21,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x79,0xae,0x70,0x36,0x2d,0x51,0x71,0x88,0x9a,0x52,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,\r\n0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x83,0x75,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x03,0x58,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x54,0x2e,0x16,0x04,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2c,0x4e,0x68,0x77,0x81,0x3f,0x02,0x01,\r\n0x00,0x02,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x00,0x2d,0x00,0x41,0x00,0x50,0xb9,0x00,0x05,0x05,0x0a,0xb4,0x33,0x33,0x0b,0x3f,0x28,0xb8,0x05,0x0a,0xb6,0x25,0x0b,0x29,0x15,0x27,0x1a,0x15,0xb8,0x05,0x03,0x40,0x0a,0x3f,0x3f,0x2e,0x2e,0x22,0x22,0x21,0x21,0x10,0x0a,0xbd,0x04,0xff,0x00,0x0b,0x05,0x03,0x00,0x38,0x04,0xfb,\r\n0x00,0x00,0x00,0x2f,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x2f,0x33,0x11,0x33,0x2f,0x3f,0x33,0x2f,0x12,0x39,0x01,0x2f,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x36,0x37,\r\n0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x6f,0x89,0x9d,0x54,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,\r\n0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3c,0x43,0x30,0x35,0x1a,0x05,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,\r\n0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0xff,0xff,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x39,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x02,0x26,0x0e,0x3a,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x06,0xae,\r\n0x05,0xec,0x02,0x26,0x0e,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xe5,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xa2,0x06,0xb3,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0xb3,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x90,0x06,0x03,\r\n0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xa2,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,\r\n0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x03,0x4b,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,\r\n0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0xdc,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0x01,0xfe,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0x2c,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x01,0xfc,0x50,\r\n0x00,0x0a,0xb4,0x01,0x2f,0x4b,0x01,0x4b,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x6e,0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x6e,\r\n0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x04,0xf9,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x8f,0x04,0x49,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x03,0xb9,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xdc,0x03,0x09,0xff,0xff,0xff,0xba,\r\n0xfe,0xa6,0x02,0x9a,0x04,0xb2,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9a,\r\n0xff,0x55,0x05,0x91,0x06,0x11,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x8f,0x04,0x49,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0xd1,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xdc,0x03,0x09,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x9a,0x05,0xca,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,\r\n0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x53,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,0x05,0x24,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x50,\r\n0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x04,0x79,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xd4,0x03,0xc9,0x00,0x02,0x00,0xab,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x2e,0x00,0x4f,0x00,0x66,0xb1,0x1e,0x13,0xbe,0x05,0x0a,0x00,0x10,0x00,0x4a,0x05,0x0b,0x00,0x31,0x00,0x42,0x05,0x0b,0x40,0x0a,\r\n0x39,0x10,0x31,0x39,0x39,0x31,0x10,0x03,0x51,0x03,0xbe,0x05,0x0a,0x00,0x2b,0x00,0x3e,0x04,0xfd,0x00,0x3f,0x00,0x2f,0x04,0xfd,0xb5,0x4f,0x1e,0x23,0x18,0x18,0x0b,0xbc,0x04,0xfb,0x00,0x23,0x05,0x03,0x00,0x19,0x05,0x03,0xb4,0x11,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0x3f,0x3f,0xed,0x32,0x2f,0x11,0x39,0x2f,0xfd,0xd4,0xed,\r\n0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x35,0x34,0x26,0x27,\r\n0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x01,0x62,0x09,0x11,0x1f,0x2f,0x1a,0x4e,0x7b,0xb1,0x7d,0x6d,0xa2,0x6c,0x36,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x64,0x75,0x20,0x04,0x26,0x6f,0x87,0x9b,0x53,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x01,0xe4,0xc5,0x1f,\r\n0x15,0x10,0x21,0x1b,0x11,0x2e,0x4f,0x69,0x3b,0x5e,0x54,0x21,0x17,0x0f,0x20,0x1a,0x10,0x25,0x4c,0x74,0x4f,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x0a,0x29,0x53,0x48,0x04,0x8b,0xfb,0xac,0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x34,0x1a,0x05,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0x57,0x0b,\r\n0x47,0x12,0x16,0x0b,0x08,0x14,0x1b,0x27,0x1b,0x26,0x3e,0x2f,0x1f,0x08,0x5d,0x0c,0x2d,0x21,0x14,0x18,0x0b,0x08,0x12,0x1a,0x23,0x19,0x1f,0x3e,0x33,0x23,0x04,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x00,0x2c,0x00,0x2e,0x40,0x11,0x11,0x15,0x12,0x03,0x00,0x14,0x2f,0x13,0x01,0x13,0x27,0x27,0x26,0x26,0x21,0x21,\r\n0x06,0xbb,0x04,0xfb,0x00,0x22,0x00,0x00,0x05,0x03,0x00,0x3f,0x32,0xed,0x32,0x11,0x33,0x2f,0x33,0x2f,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x17,0x1e,0x05,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,\r\n0x23,0x23,0x23,0x01,0x28,0x61,0x80,0x4c,0x1e,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0xad,0xdd,0x85,0x40,0x10,0x03,0x0b,0x14,0x21,0x34,0x49,0x32,0x16,0x59,0x8d,0x2c,0x05,0x17,0x47,0x68,0x8d,0x5d,0x0e,0x34,0x20,0x20,0x33,0x16,0x2a,0x3f,0x29,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x52,0x92,0x8b,0x8a,0x4a,\r\n0x0f,0x2b,0x30,0x2e,0x26,0x17,0xa7,0x4a,0x55,0x22,0x3a,0x2b,0x18,0x00,0x00,0x02,0x00,0x39,0xfd,0xff,0x04,0xad,0x02,0xb9,0x00,0x2f,0x00,0x41,0x00,0x54,0xb9,0x00,0x3d,0x01,0x52,0xb5,0x1f,0x1f,0x16,0x1a,0x06,0x2b,0xbb,0x05,0x0a,0x00,0x35,0x00,0x11,0x05,0x0a,0xb4,0x1a,0x0e,0x05,0x09,0x3a,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x26,\r\n0x01,0x26,0x2f,0x16,0x01,0x16,0x09,0xb8,0x05,0x03,0xb3,0x1f,0x30,0x30,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x3f,0x2f,0x5d,0x2f,0x5d,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x39,0x11,0x39,0x39,0x10,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,\r\n0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x04,0xad,0x16,0x51,0x68,0x21,0x04,0x26,0x6c,0x4f,0x31,0x65,0x60,0x57,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,\r\n0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x15,0x44,0x6e,0x53,0x34,0x0b,0x06,0x0f,0x26,0x45,0xfe,0x55,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x99,0xa7,0x3a,0x36,0x36,0x3b,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x42,0x24,\r\n0x0b,0x41,0x67,0x80,0x3f,0x26,0x43,0x33,0x1d,0x01,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0e,0x0e,0x09,0x00,0x02,0xff,0xba,0xff,0xf2,0x04,0xad,0x02,0xaf,0x00,0x30,0x00,0x40,0x00,0x32,0xb2,0x31,0x08,0x3c,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x24,0x01,0x24,0x34,0x30,0x30,0x0d,0x05,0x17,0xb8,0x04,0xfb,0xb4,0x10,\r\n0x08,0x08,0x00,0x10,0xb8,0x05,0x03,0x00,0x3f,0x33,0x33,0x2f,0x10,0xed,0x39,0x39,0x32,0x2f,0x33,0x2f,0x5d,0xed,0x12,0x39,0x31,0x30,0x05,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x04,0x17,0x1e,0x03,0x33,\r\n0x25,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x04,0xad,0x16,0x5b,0x6f,0x1e,0x05,0x2d,0x87,0x61,0x34,0x61,0x57,0x4b,0x1e,0x35,0x99,0x5f,0x13,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,0x3a,0x23,0x0b,0x0d,0x21,0x2b,0x38,0x48,0x5c,0x39,0x4f,0x72,0x50,0x33,0x1c,0x0c,0x02,0x04,0x0d,0x25,0x46,0x3d,0xfc,0xd4,\r\n0x2b,0x8e,0x56,0x5e,0x69,0x1a,0x35,0x52,0x37,0x30,0x4f,0x3e,0x2f,0x0e,0x40,0x41,0x39,0x48,0x18,0x28,0x35,0x1e,0x50,0x43,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1b,0x1f,0x49,0x48,0x42,0x34,0x1e,0x2e,0x48,0x56,0x51,0x40,0x0e,0x21,0x3e,0x30,0x1d,0x6d,0x35,0x36,0x44,0x45,0x21,0x51,0x45,0x2f,0x26,0x45,0x5f,0xff,0xff,0x00,0x9b,\r\n0xfd,0xff,0x05,0x58,0x03,0x5c,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x03,0xff,0xba,0xff,0xf2,0x04,0x87,0x04,0x53,0x00,0x2d,0x00,0x3f,0x00,0x50,0x00,0x63,0xb3,0x12,\r\n0x1f,0x17,0x24,0xb8,0x05,0x0a,0xb2,0x4b,0x46,0x43,0xb8,0x05,0x0b,0xb6,0x31,0x4b,0x31,0x4b,0x31,0x52,0x3b,0xbf,0x05,0x0a,0x00,0x17,0x00,0x49,0x04,0xfc,0x00,0x29,0x05,0x03,0x00,0x36,0x04,0xfc,0x40,0x10,0x1c,0x00,0x46,0x40,0x1c,0x04,0x05,0x1e,0x2f,0x1f,0x01,0x1f,0x2e,0x0f,0x0f,0x0c,0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,\r\n0x3f,0xed,0x32,0x11,0x33,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x33,0x32,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x27,0x35,0x16,0x04,0x16,0x16,\r\n0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x36,0x35,0x34,0x2e,0x02,0x27,0x02,0x3b,0x26,0x61,0x6c,0x73,0x37,0x9e,0x23,0x23,0x23,0x23,0x3a,0x72,0x3a,0x84,0x38,0x01,0x4a,0x60,0x38,0x15,0x25,0x43,0x5c,\r\n0x38,0x01,0x53,0xca,0x01,0x32,0xcd,0x68,0x17,0x2f,0x46,0x2e,0x1e,0x5a,0x6b,0x76,0x51,0x33,0x21,0x1c,0x2b,0x34,0x18,0x1c,0x3a,0x2f,0x1e,0x11,0x31,0x58,0x01,0x0a,0x09,0x08,0x2a,0x2d,0x43,0x9a,0x4b,0x1d,0x29,0x45,0x5b,0x31,0x4c,0x1d,0x23,0x14,0x06,0x34,0x20,0x20,0x33,0x02,0x03,0x04,0x1e,0x44,0x4d,0x55,0x2f,0x37,0x79,0x6c,\r\n0x52,0x11,0x06,0x36,0xc7,0x71,0xf6,0xe7,0xc7,0x42,0x2f,0x5f,0x4c,0x30,0x09,0x15,0x22,0xbd,0x3f,0x7e,0x37,0x2d,0x50,0x3d,0x23,0x29,0x41,0x4f,0x26,0x19,0x36,0x3c,0x42,0x01,0x40,0x20,0x3c,0x21,0x4e,0x92,0x36,0x1a,0x20,0x06,0x2c,0x36,0x2b,0x5d,0x60,0x60,0x2e,0x00,0x00,0x03,0x00,0x53,0xff,0xf2,0x05,0x32,0x04,0x53,0x00,0x2a,\r\n0x00,0x3c,0x00,0x4d,0x00,0x63,0xb3,0x0f,0x1c,0x14,0x21,0xb8,0x05,0x0a,0xb2,0x48,0x43,0x40,0xb8,0x05,0x0b,0xb6,0x2e,0x48,0x2e,0x48,0x2e,0x4f,0x38,0xbf,0x05,0x0a,0x00,0x14,0x00,0x46,0x04,0xfc,0x00,0x26,0x05,0x03,0x00,0x33,0x04,0xfc,0x40,0x10,0x19,0x00,0x43,0x3d,0x19,0x04,0x05,0x1b,0x2f,0x1c,0x01,0x1c,0x2b,0x0e,0x0e,0x0c,\r\n0xba,0x04,0xfb,0x00,0x05,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x32,0x2f,0x5d,0xcd,0x12,0x17,0x39,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x25,0x0e,0x03,0x23,0x22,0x26,0x27,0x27,0x16,0x16,0x33,0x32,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x27,\r\n0x35,0x16,0x04,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x36,0x35,0x34,0x2e,0x02,0x27,0x02,0xe6,0x23,0x59,0x63,0x69,0x33,0x55,0x80,0x23,0x20,0x52,0x9c,0x51,0x80,0x3b,0x01,0x4a,0x60,0x38,\r\n0x15,0x25,0x43,0x5c,0x38,0x01,0x53,0xca,0x01,0x32,0xcd,0x68,0x17,0x2f,0x46,0x2e,0x1e,0x5a,0x6b,0x76,0x51,0x33,0x21,0x1c,0x2b,0x34,0x18,0x1c,0x3a,0x2f,0x1e,0x11,0x31,0x58,0x01,0x0a,0x09,0x08,0x2a,0x2d,0x43,0x9a,0x4b,0x1d,0x29,0x45,0x5b,0x31,0x4c,0x1d,0x23,0x14,0x06,0x0b,0x05,0xa7,0x0a,0x08,0x03,0x04,0x1e,0x44,0x4d,0x55,\r\n0x2f,0x37,0x79,0x6c,0x52,0x11,0x06,0x36,0xc7,0x71,0xf6,0xe7,0xc7,0x42,0x2f,0x5f,0x4c,0x30,0x09,0x15,0x22,0xbd,0x3f,0x7e,0x37,0x2d,0x50,0x3d,0x23,0x29,0x41,0x4f,0x26,0x19,0x36,0x3c,0x42,0x01,0x40,0x20,0x3c,0x21,0x4e,0x92,0x36,0x1a,0x20,0x06,0x2c,0x36,0x2b,0x5d,0x60,0x60,0x2e,0x00,0x00,0x03,0xff,0xba,0xfd,0xff,0x04,0x02,\r\n0x03,0x56,0x00,0x2c,0x00,0x3c,0x00,0x4c,0x00,0x59,0xb1,0x19,0x0c,0xb8,0x05,0x0a,0xb5,0x32,0x47,0x47,0x32,0x3c,0x3d,0xb8,0x05,0x0a,0x40,0x09,0x12,0x00,0x25,0x2d,0x13,0x13,0x12,0x12,0x00,0xb8,0x04,0xfb,0xb3,0x3d,0x16,0x14,0x25,0xba,0x05,0x03,0x00,0x42,0x04,0xfb,0xb6,0x1f,0x1e,0x2f,0x1e,0x02,0x1e,0x37,0xb8,0x04,0xfb,0xb3,\r\n0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x3f,0x33,0x33,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x33,0xed,0x32,0x2f,0x33,0x2f,0x10,0xed,0x32,0x31,0x30,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x17,0x21,0x15,0x21,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x27,0x23,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0xb4,0x15,0x41,0x4e,0x55,0x51,0x49,0x1b,0x2f,0x54,0x3f,0x25,0x16,0x27,0x34,0x1d,0x02,0x01,0x45,0xfe,0xc0,0x01,0x48,0x40,0x27,0x49,0x66,0x3f,0x24,0x54,0x55,0x50,0x3f,\r\n0x29,0x04,0xab,0x23,0x23,0x23,0x23,0x01,0xd0,0x30,0x52,0x3a,0x21,0x11,0x1e,0x27,0x16,0x1a,0x47,0x47,0x3d,0x0e,0x0b,0x04,0x2e,0x45,0x52,0x27,0x22,0x2e,0x1c,0x0d,0x20,0x3d,0x58,0x38,0x99,0x85,0xcf,0x9c,0x6c,0x43,0x1e,0x45,0x6d,0x87,0x43,0x35,0x5d,0x4e,0x41,0x19,0x07,0xa7,0x06,0x2d,0x79,0x3f,0x33,0x5f,0x49,0x2d,0x14,0x2e,\r\n0x4b,0x6f,0x96,0x61,0x34,0x20,0x20,0x33,0x33,0x53,0x69,0x36,0x28,0x55,0x45,0x2d,0x47,0x88,0xc6,0x7f,0xa7,0x58,0x7d,0x50,0x26,0x16,0x22,0x2c,0x16,0x24,0x4b,0x3c,0x26,0x00,0x00,0x02,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x00,0x27,0x00,0x38,0x00,0x55,0xb2,0x1f,0x1f,0x1c,0xb8,0x05,0x0a,0xb4,0x36,0x0b,0x0b,0x36,0x32,0xb8,\r\n0x05,0x0a,0xb2,0x11,0x00,0x03,0xb8,0x04,0xfb,0xb7,0x27,0x1f,0x24,0x2f,0x24,0x02,0x24,0x2d,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x16,0x01,0x16,0x36,0x35,0x35,0x1d,0x1d,0x1c,0xbb,0x04,0xfb,0x00,0x1e,0x00,0x0b,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0x33,\r\n0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x37,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x6c,0xad,0x52,0x45,0x66,0x48,0x2c,0x0c,\r\n0x05,0x0b,0x04,0x75,0x5c,0x92,0x66,0x36,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x35,0x07,0xbc,0xbd,0x08,0x3e,0x74,0xab,0x75,0x5b,0xac,0x64,0x02,0x8d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1b,0x7c,0x87,0x65,0x04,0x0e,0xfe,0xf9,0x2c,0x23,0x21,0x39,0x4c,0x2c,0x13,0x3d,0x26,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,\r\n0x56,0x48,0xbf,0x6d,0xa7,0x66,0xb5,0x88,0x50,0x26,0x2e,0x02,0xe1,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x01,0xf2,0x03,0x0f,0x02,0x06,0x0e,0x6f,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x03,0x0f,0x02,0x06,0x09,0x3b,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,\r\n0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x03,0xff,0xd4,0x05,0x20,0x02,0x33,0x07,0xa1,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x60,0xb2,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb5,0x12,0x15,0x15,0x12,0x12,0x03,0xb8,0x05,0x0d,0x40,0x09,0x2c,0x2f,0x2f,0x2c,0x0a,0x1f,0x23,0x23,0x26,\r\n0xb8,0x05,0x0d,0xb5,0x1f,0x22,0x22,0x1f,0x00,0x31,0xbb,0x04,0xfd,0x00,0x32,0x00,0x35,0x04,0xfd,0xb4,0x36,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0xd6,0xfd,0xd6,0xed,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x11,0x39,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x10,0xed,\r\n0x32,0x2f,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0x2f,0x02,0x02,0x63,\r\n0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0x36,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,\r\n0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x01,0x6b,0x58,0x57,0x58,0x00,0x03,0xff,0xd8,0x06,0x60,0x02,0x2c,0x08,0x21,0x00,0x1e,0x00,0x35,0x00,0x41,0x00,0x4c,0xb4,0x14,0x39,0x04,0x32,0x11,0xbe,0x05,0x0d,0x00,0x39,0x00,0x22,0x05,0x0d,0x00,0x32,0x00,0x3f,0x05,0x0d,0xb4,0x07,0x36,0x1b,0x1e,\r\n0x0c,0xb8,0x04,0xfd,0x40,0x0a,0x3c,0x00,0x1f,0x35,0x04,0x14,0x27,0x2d,0x2d,0x00,0xb9,0x05,0x00,0x00,0x1e,0x00,0x2f,0xed,0x32,0x2f,0xdd,0x39,0x39,0xc0,0x32,0x10,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0xed,0x2f,0xed,0x2f,0xed,0x11,0x39,0x11,0x39,0x31,0x30,0x13,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,\r\n0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x07,0x13,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x88,0x2d,0x58,0x2e,0x01,0x2e,0x2b,0x1a,0x2d,0x3c,0x22,0x24,0x3d,0x2c,0x19,\r\n0x2a,0x23,0x0e,0x18,0x0b,0x21,0x1b,0x2e,0x15,0x3e,0x84,0x3f,0x0b,0x30,0x3a,0x05,0x06,0x0d,0x06,0x1e,0x2b,0x31,0x22,0x17,0x28,0x1d,0x11,0x54,0x4c,0x01,0x17,0x22,0x27,0x2e,0x23,0x23,0x2f,0x31,0x06,0xb0,0x04,0x0e,0x13,0x05,0x1f,0x4e,0x2d,0x24,0x3b,0x2b,0x18,0x18,0x2b,0x39,0x21,0x33,0x4c,0x21,0x08,0x09,0x05,0x4a,0x0a,0x15,\r\n0x0b,0x21,0x1d,0x05,0x01,0x86,0x17,0x41,0x2a,0x0e,0x14,0x02,0x02,0x28,0x21,0x26,0x2c,0x17,0x27,0x35,0x1e,0x4d,0x74,0x24,0xfe,0xe1,0x18,0x3a,0x21,0x22,0x29,0x27,0x20,0x26,0x3a,0x00,0x00,0x04,0xff,0xd4,0x05,0x20,0x02,0x33,0x08,0x29,0x00,0x2f,0x00,0x4e,0x00,0x65,0x00,0x71,0x00,0xaa,0x40,0x0a,0x44,0x2c,0x34,0x03,0x12,0x52,\r\n0x52,0x16,0x16,0x19,0xb8,0x05,0x0b,0x40,0x0b,0x12,0x62,0x62,0x12,0x15,0x15,0x12,0x12,0x41,0x41,0x03,0xb8,0x05,0x0d,0x40,0x0d,0x2c,0x69,0x69,0x2c,0x2f,0x2f,0x2c,0x0a,0x26,0x1f,0x6f,0x6f,0x37,0xb8,0x05,0x0d,0xb3,0x26,0x23,0x23,0x26,0xb8,0x05,0x0d,0x40,0x09,0x1f,0x22,0x22,0x1f,0x00,0x4b,0x66,0x4e,0x3c,0xb8,0x04,0xfd,0x40,\r\n0x0a,0x6c,0x30,0x4f,0x65,0x34,0x44,0x57,0x5d,0x5d,0x30,0xb8,0x05,0x00,0xb6,0x4e,0x2f,0x16,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0x32,0x32,0xde,0xed,0x32,0x2f,0xcd,0x39,0x39,0xc0,0x32,0x10,0xd4,0xed,0x11,0x39,0x39,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x2f,0x10,0xe4,0x33,\r\n0x2f,0x11,0x12,0x39,0x2f,0x33,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x11,0x33,0x2f,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x32,0x2f,0x11,0x12,0x39,0x11,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,\r\n0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x25,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x07,0x13,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,\r\n0x35,0x34,0x36,0x37,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0xfe,0xb9,0x2d,0x58,0x2e,0x01,0x2e,0x28,0x1c,0x2d,0x3a,0x1f,\r\n0x1f,0x3b,0x2e,0x1c,0x28,0x23,0x0e,0x18,0x0b,0x21,0x1b,0x2e,0x15,0x3e,0x84,0x3f,0x0b,0x30,0x3a,0x05,0x06,0x0d,0x06,0x1e,0x2b,0x31,0x22,0x17,0x28,0x1d,0x11,0x54,0x4c,0x01,0x17,0x22,0x25,0x32,0x1e,0x1d,0x31,0x2e,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,\r\n0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x8e,0x04,0x0e,0x13,0x05,0x1d,0x49,0x2b,0x27,0x3a,0x27,0x13,0x13,0x25,0x38,0x25,0x30,0x48,0x20,0x08,0x09,0x05,0x4a,0x0a,0x15,0x0b,0x21,0x1b,0x05,0x01,0x78,0x15,0x3d,0x26,0x0e,0x12,0x02,0x02,0x28,0x21,0x26,0x2c,0x16,0x26,0x33,0x1d,0x4b,0x70,\r\n0x23,0xfe,0xed,0x16,0x35,0x1f,0x23,0x23,0x23,0x21,0x23,0x33,0x00,0x02,0xff,0xd4,0x05,0x20,0x02,0x33,0x08,0x04,0x00,0x2f,0x00,0x33,0x00,0x5e,0xb4,0x0a,0x31,0x23,0x23,0x30,0xbb,0x05,0x0b,0x00,0x31,0x00,0x26,0x05,0x0d,0xb5,0x22,0x22,0x31,0x16,0x16,0x19,0xb8,0x05,0x0b,0xb5,0x12,0x15,0x15,0x12,0x12,0x03,0xb8,0x05,0x0d,0x40,\r\n0x0d,0x2c,0x2f,0x2f,0x2c,0x00,0x33,0x30,0x2f,0x16,0x23,0x0a,0x1c,0x29,0xb8,0x04,0xfd,0xb1,0x0d,0x06,0x00,0x2f,0x33,0xfd,0x32,0x39,0xd6,0x32,0x32,0xd6,0xcd,0x01,0x2f,0x2f,0x33,0x2f,0x10,0xed,0x32,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x2f,0x33,0x2f,0xed,0x10,0xed,0x32,0x2f,0x11,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x23,0x11,0x33,0x02,0x2f,0x02,0x02,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x04,0x02,\r\n0x60,0x05,0x02,0x26,0x2d,0x2d,0x22,0x02,0x61,0x01,0x01,0x22,0x2d,0x30,0x24,0x04,0x02,0x92,0x74,0x74,0x06,0x36,0x12,0x23,0x0d,0x67,0x6d,0x1f,0x20,0x20,0x1f,0x20,0x36,0x49,0x29,0x18,0x28,0x0e,0x27,0x20,0x08,0x30,0x37,0x37,0x36,0x12,0x29,0x0e,0x0d,0x2c,0x0f,0x37,0x37,0x38,0x31,0x14,0x2c,0x0d,0x64,0x01,0x6a,0x00,0x00,0x03,\r\n0xff,0x6c,0x05,0x26,0x02,0x03,0x08,0x58,0x00,0x18,0x00,0x3d,0x00,0x4b,0x00,0x69,0xb2,0x3a,0x11,0x37,0xb8,0x05,0x0d,0xb5,0x3e,0x09,0x09,0x3e,0x0e,0x11,0xb8,0x05,0x0d,0xb3,0x2b,0x06,0x06,0x46,0xb8,0x05,0x0d,0xb7,0x2d,0x0e,0x09,0x0a,0x25,0x22,0x1f,0x32,0xb8,0x04,0xfd,0xb3,0x41,0x3a,0x49,0x28,0xb8,0x04,0xfd,0xb4,0x1f,0x16,\r\n0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0x32,0x39,0xd4,0xed,0x11,0x39,0x39,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x2f,0x39,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x27,0x37,0x16,0x16,0x33,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,\r\n0x36,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x02,0x17,0x28,0x11,0x19,0x2f,0x15,0x42,0x5e,0x25,0x61,0x36,0x99,0x31,0x5b,0x34,0x10,0x0f,0x01,0x36,0x1e,0x31,0x3f,0x20,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,\r\n0x2f,0x3b,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x2b,0x11,0x22,0x11,0x07,0x06,0x34,0x2a,0x59,0x3b,0x8e,0x3c,0x3e,0x03,0x02,0x42,0x41,0x24,0x38,0x27,0x14,0x14,0x27,0x3a,0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x19,0x11,0x1b,0x38,0x1b,0x0e,0x35,0x00,\r\n0x00,0x02,0x00,0x05,0x05,0x26,0x02,0x01,0x07,0x3b,0x00,0x18,0x00,0x1c,0x00,0x3f,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb7,0x11,0x11,0x1d,0x1a,0x0e,0x09,0x0a,0x1a,0xb8,0x04,0xfd,0xb4,0x1b,0x16,0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,\r\n0x10,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x25,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,\r\n0xfe,0x92,0x01,0xfc,0xfe,0x04,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xb8,0x58,0x00,0x03,0xff,0xf8,0x05,0x26,0x02,0x03,0x08,0x58,0x00,0x18,0x00,0x3c,0x00,0x4a,0x00,0x65,0xb3,0x39,0x18,0x11,0x36,0xb8,0x05,0x0d,0xb5,0x3d,0x09,0x09,0x3d,0x0e,0x11,0xb8,0x05,0x0d,0xb3,0x2a,\r\n0x06,0x06,0x45,0xb8,0x05,0x0d,0xb4,0x2c,0x0e,0x09,0x0a,0x31,0xb8,0x04,0xfd,0xb3,0x40,0x39,0x48,0x26,0xb8,0x04,0xfd,0xb4,0x1f,0x16,0x18,0x18,0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0x32,0x39,0xd4,0xed,0x11,0x12,0x39,0x01,\r\n0x2f,0xed,0x39,0x2f,0x39,0xed,0x39,0x2f,0x33,0x2f,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x37,0x26,0x35,0x34,0x3e,0x02,\r\n0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x02,0x17,0x28,0x11,0x18,0x2f,0x14,0x3c,0x65,0x31,0x12,0x33,0x5a,0x39,0x01,0x0b,0x06,0x01,0x34,\r\n0x1e,0x31,0x3e,0x21,0x20,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x02,0x33,0x1f,0x0f,0x1f,0x18,0x0f,0x23,0x1a,0x30,0x3a,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x2b,0x11,0x22,0x11,0x05,0x03,0x0e,0x0e,0x53,0x0d,0x0f,0x01,0x02,0x40,0x40,0x24,0x39,0x27,0x14,0x14,0x27,0x3a,\r\n0x27,0x3f,0x56,0x19,0x0b,0x10,0x08,0xcd,0x26,0x22,0x09,0x11,0x1a,0x10,0x1a,0x3a,0x1a,0x0e,0x36,0x00,0x00,0x03,0x00,0x05,0x05,0x26,0x02,0x01,0x07,0xea,0x00,0x18,0x00,0x1c,0x00,0x20,0x00,0x41,0xb1,0x0e,0x06,0xb8,0x05,0x0d,0xb4,0x11,0x0e,0x09,0x0a,0x1a,0xbb,0x04,0xfd,0x00,0x1b,0x00,0x1e,0x04,0xfd,0xb4,0x1f,0x16,0x18,0x18,\r\n0x16,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,\r\n0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0x01,0x67,0x58,0x57,0x58,0x00,0x00,0x03,\r\n0x00,0x49,0x05,0x26,0x01,0xbd,0x08,0x42,0x00,0x17,0x00,0x2b,0x00,0x37,0x00,0x55,0xbc,0x00,0x1d,0x05,0x0d,0x00,0x2f,0x00,0x06,0x05,0x0d,0xb3,0x0e,0x10,0x10,0x35,0xb8,0x05,0x0d,0xb5,0x0b,0x27,0x0e,0x09,0x0a,0x18,0xbb,0x04,0xfd,0x00,0x32,0x00,0x2c,0x04,0xfd,0xb4,0x22,0x15,0x17,0x17,0x15,0xb8,0x05,0x01,0xb4,0x03,0x09,0x0c,\r\n0x0c,0x09,0xb9,0x05,0x01,0x00,0x0a,0x00,0x2f,0xed,0x32,0x2f,0x10,0xd6,0xed,0x32,0x2f,0x10,0xd6,0xfd,0xd6,0xed,0x11,0x12,0x39,0x01,0x2f,0x33,0xed,0x39,0x2f,0x39,0xed,0x2f,0xed,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x03,0x32,0x1e,0x02,\r\n0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x2d,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x70,0x28,0x45,0x31,0x1c,0x1c,0x31,0x45,0x28,0x2a,0x45,0x30,0x1b,0x1b,0x31,0x44,0x2a,0x30,0x30,0x30,\r\n0x30,0x30,0x30,0x30,0x06,0x1e,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x33,0x3a,0x21,0x37,0x28,0x16,0x06,0x01,0xbf,0x1c,0x31,0x42,0x26,0x26,0x42,0x30,0x1c,0x1c,0x30,0x42,0x26,0x26,0x42,0x31,0x1c,0xfe,0xee,0x33,0x2a,0x29,0x35,0x35,0x29,0x2a,0x33,0x00,0x00,0x03,0x00,0x05,0xfe,0x00,0x02,0x01,0x00,0xc1,0x00,0x18,0x00,0x1c,\r\n0x00,0x20,0x00,0x3d,0xb1,0x0e,0x06,0xbe,0x05,0x0d,0x00,0x11,0x00,0x1b,0x04,0xfd,0x00,0x1a,0x00,0x1f,0x04,0xfd,0xb2,0x1e,0x0e,0x0a,0xb8,0x04,0xfd,0xb4,0x09,0x0c,0x0c,0x09,0x03,0xb8,0x04,0xfd,0xb3,0x16,0x18,0x18,0x16,0x00,0x2f,0x33,0x2f,0x10,0xfd,0xc6,0x32,0x2f,0x10,0xfd,0x39,0xd6,0xfd,0xd6,0xed,0x01,0x2f,0xed,0x39,0x31,\r\n0x30,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x01,0xfc,0xfe,0x04,\r\n0x56,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xfd,0x9d,0x58,0x01,0x07,0x58,0x00,0x00,0x02,0x00,0x05,0xfe,0xaf,0x02,0x01,0x00,0xc1,0x00,0x18,0x00,0x1c,0x00,0x35,0xb1,0x0e,0x06,0xbb,0x05,0x0d,0x00,0x11,0x00,0x1b,0x04,0xfd,0xb2,0x1a,0x0e,0x0a,0xb8,0x04,0xfd,0xb4,0x09,0x0c,0x0c,0x09,\r\n0x03,0xb8,0x04,0xfd,0xb3,0x16,0x18,0x18,0x16,0x00,0x2f,0x33,0x2f,0x10,0xfd,0xc6,0x32,0x2f,0x10,0xfd,0x39,0xd6,0xed,0x01,0x2f,0xed,0x39,0x31,0x30,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x21,0x15,0x21,0x01,0x73,0x0d,0x1d,0x10,0x2d,0x3e,\r\n0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xfe,0x92,0x01,0xfc,0xfe,0x04,0x56,0x03,0x04,0x23,0x28,0x53,0x61,0x5b,0x05,0x1a,0x36,0x1d,0x21,0x37,0x28,0x16,0x06,0xfe,0x4c,0x58,0xff,0xff,0x00,0x4f,0xfe,0xf8,0x01,0x64,0x00,0xe4,0x00,0x06,0x00,0x0f,0x28,0x00,0x00,0x01,0x00,0xab,0xff,0xea,0x07,0x59,\r\n0x03,0x0f,0x00,0x2e,0x00,0x3c,0xb1,0x0c,0x01,0xb8,0x05,0x0a,0xb3,0x2d,0x2d,0x30,0x20,0xb8,0x05,0x0a,0x40,0x0a,0x19,0x2f,0x2e,0x01,0x2e,0x2f,0x1d,0x01,0x1d,0x11,0xb8,0x05,0x03,0xb2,0x0c,0x28,0x06,0xba,0x04,0xfb,0x00,0x07,0x05,0x03,0x00,0x3f,0xed,0x32,0x39,0x3f,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,\r\n0x31,0x30,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x11,0x06,0x9f,0x0c,0x27,0x49,0x3e,0x16,0x61,0x70,0x20,0x04,0x2c,0x80,0x9d,0xb4,0x60,0x88,0xe1,0xb5,0x88,0x30,0x40,\r\n0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1d,0x5c,0x92,0xd1,0x93,0x80,0xc0,0x7f,0x3f,0x03,0x0f,0xfe,0x89,0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x35,0x19,0x05,0x04,0x15,0x2c,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0x00,0x01,0xff,0xba,0xff,0xf2,\r\n0x01,0xf2,0x03,0x0f,0x00,0x16,0x00,0x1e,0xbe,0x00,0x08,0x05,0x0a,0x00,0x05,0x00,0x00,0x04,0xfb,0x00,0x0f,0x05,0x03,0xb3,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,\r\n0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0x00,0x00,0x02,0x00,0x9b,0xfd,0xff,0x06,0x03,0x02,0xb7,0x00,0x30,0x00,0x41,0x00,0x65,0xb2,0x13,0x13,0x10,0xb8,0x05,0x0a,0xb4,0x3f,0x30,0x30,0x3f,0x3b,0xb8,0x05,0x0a,0xb6,0x05,\r\n0x3f,0x05,0x3f,0x05,0x43,0x24,0xb8,0x05,0x0a,0xb5,0x1d,0x2f,0x21,0x01,0x21,0x29,0xb8,0x04,0xfb,0x40,0x0a,0x1f,0x18,0x2f,0x18,0x02,0x18,0x3f,0x3e,0x3e,0x10,0xbd,0x04,0xfb,0x00,0x00,0x00,0x12,0x05,0x03,0x00,0x36,0x04,0xfb,0xb3,0x2f,0x0a,0x01,0x0a,0x00,0x2f,0x5d,0xed,0x3f,0x33,0xed,0x32,0x11,0x33,0x2f,0x5d,0xed,0x2f,0x5d,\r\n0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x03,0x2e,0x03,0x23,0x22,\r\n0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x04,0x36,0x5c,0x91,0x66,0x36,0x30,0x55,0x73,0x44,0x48,0x78,0x36,0x2d,0x34,0x07,0xbc,0xbb,0x0b,0x54,0x99,0xe0,0x97,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x60,0x8d,0x63,0x3e,0x24,0x10,0x03,0x1d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1a,0x7c,0x86,\r\n0x65,0x04,0x0e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x48,0xc0,0x6d,0xa7,0x7f,0xbc,0x7b,0x3d,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x19,0x2d,0x3e,0x49,0x52,0x2b,0x01,0x42,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,\r\n0x03,0x62,0x02,0x06,0x09,0x3c,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x03,0x62,0x02,0x06,0x09,0x3d,0x00,0x00,0xff,0xff,0x00,0x49,0x04,0x7c,0x01,0xa2,0x05,0xe9,0x00,0x07,0x09,0x7e,0x00,0x00,0xfe,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x3e,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x01,\r\n0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xe7,0xfd,0xff,0x04,0x02,0x05,0x63,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,0xfd,0x55,0x01,0x07,0x09,0x30,0x00,0x28,0xfd,0x55,0x00,0x0e,0xb6,0x04,0x03,0x02,0x2f,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,\r\n0xff,0xba,0xff,0xf2,0x03,0xa3,0x05,0x3e,0x00,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x01,0xfd,0x55,0x00,0x0a,0xb4,0x01,0x2f,0x2d,0x01,0x2d,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x3e,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x09,0x7e,0x02,0x01,0xfd,0x55,0x01,0x07,0x09,0x21,0x02,0xac,\r\n0x00,0x00,0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xb9,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x57,0x02,0xad,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x06,0x32,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,\r\n0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,\r\n0x0f,0x52,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xee,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x5b,0x02,0xad,0x00,0xef,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,\r\n0xff,0xba,0xff,0x05,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,\r\n0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,\r\n0x00,0xab,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xca,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,\r\n0x0f,0x56,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x56,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x16,0x02,0x26,0x0e,0x2d,0x00,0x00,0x01,0x07,0x09,0x7e,0x01,0x56,0xfd,0x2d,0x00,0x0a,0xb4,0x01,0x2f,0x4c,0x01,0x4c,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x79,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0xfe,0xab,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,\r\n0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x56,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x79,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x56,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,\r\n0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xf4,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x5b,0x00,0xab,\r\n0x00,0xf5,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x27,0x0f,0x57,0x01,0x1d,0x04,0xad,0x00,0x07,0x0f,0x50,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,\r\n0x04,0x02,0x05,0x5d,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xfe,0xa6,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x1d,\r\n0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x52,0xff,0xea,0x04,0x02,0x06,0x75,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x1d,0x04,0xad,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x04,0x07,0x02,0x26,0x0e,0x31,\r\n0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0x50,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x06,0xae,0x04,0x07,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0x5a,0x03,0x0f,0x02,0x26,0x0e,0x31,\r\n0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x50,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x06,0xae,0x03,0x0f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xa4,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x54,0x05,0x50,0xfd,0xce,0x00,0x07,0x0f,0x53,0x05,0x46,\r\n0x03,0x57,0xff,0xff,0xff,0xba,0xfd,0xc9,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xa4,0xfd,0xce,0x00,0x07,0x0f,0x53,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x03,0x3c,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x51,0x06,0x3c,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,\r\n0x08,0x04,0x03,0x3c,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x51,0x03,0x86,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x05,0xca,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0xca,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xea,0x08,0x04,0x05,0xca,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x1e,\r\n0x04,0x02,0xff,0xff,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x39,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x02,0x26,0x0e,0x3a,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0xff,0xff,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x3b,\r\n0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xe5,0x04,0x02,0x00,0x02,0x00,0xab,0xff,0xea,0x08,0x04,0x03,0x62,0x00,0x41,0x00,0x55,0x00,0x5c,0xb1,0x10,0x0d,0xbb,0x05,0x0a,0x00,0x42,0x00,0x4e,0x05,0x0a,0xb6,0x00,0x42,0x00,0x42,0x00,0x57,0x2f,0xb8,0x05,0x0a,0xb5,0x28,0x2f,0x2c,0x01,0x2c,0x1f,0xb8,0x05,0x03,0x40,0x09,0x53,0x1a,0x05,\r\n0x14,0x3c,0x3c,0x39,0x39,0x13,0xbc,0x04,0xfb,0x00,0x14,0x05,0x03,0x00,0x49,0x04,0xfb,0xb3,0x2f,0x05,0x01,0x05,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x11,0x33,0x2f,0x11,0x12,0x39,0x39,0x3f,0x2f,0x5d,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,\r\n0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x04,0xb0,0x30,0x55,0x74,0x44,\r\n0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5b,0x27,0x33,0x77,0x82,0x8a,0x45,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x01,0xfe,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,\r\n0x1b,0x19,0x41,0x73,0x5a,0x23,0x1b,0x01,0xd1,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x63,0x27,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x18,0x1a,0x0d,0x03,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x35,\r\n0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x1f,0x3e,0x43,0x4a,0x2b,0x18,0x4d,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x08,0x04,0x05,0x24,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x27,0x0f,0x50,0x04,0xd7,\r\n0x04,0x74,0x00,0x07,0x0f,0x50,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,0x06,0x3c,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x53,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0xab,0xfd,0xc9,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x54,0x05,0x10,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,\r\n0x08,0x04,0x06,0x3c,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x56,0x04,0xd7,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x04,0x79,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0xd4,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,\r\n0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,0x05,0x91,0x02,0x26,0x0e,0x70,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xd4,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x06,0x3c,0x02,0x26,0x09,0x3c,\r\n0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x3c,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x04,0x74,0x00,0x01,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x00,0x43,0x00,0x49,0xb4,0x13,0x05,0x05,0x1b,0x37,0xb8,0x05,0x0a,0x40,0x0c,0x30,0x1b,0x2f,0x34,0x01,\r\n0x34,0x0a,0x0e,0x0b,0x03,0x0c,0x28,0xb8,0x05,0x03,0xb5,0x3f,0x20,0x20,0x1f,0x1f,0x1a,0xba,0x04,0xfb,0x00,0x1b,0x05,0x03,0xb4,0x0d,0x2f,0x0c,0x01,0x0c,0x00,0x2f,0x5d,0x33,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x33,0x3f,0x12,0x17,0x39,0x2f,0x5d,0x01,0x2f,0x2f,0xed,0x12,0x39,0x10,0xcd,0x31,0x30,0x25,0x3e,0x03,0x35,0x34,0x2e,0x02,\r\n0x27,0x35,0x01,0x15,0x01,0x1e,0x03,0x17,0x1e,0x05,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x05,0x4b,0x25,0x32,0x1c,0x0c,0x58,0xa4,0xe7,0x90,0x03,0x4b,0xfd,0x66,0xad,0xdd,0x85,0x40,\r\n0x10,0x03,0x0b,0x14,0x21,0x34,0x49,0x32,0x16,0x59,0x8d,0x2c,0x05,0x22,0x53,0x44,0x27,0x5d,0x74,0x90,0x5a,0x76,0xc2,0x9b,0x78,0x2c,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1a,0x4f,0x7b,0xb1,0x7c,0x4f,0x80,0x66,0x4f,0xad,0x0a,0x1d,0x26,0x2d,0x1a,0x4c,0x8c,0x86,0x85,0x46,0x76,0x02,0x22,0xb0,0xfe,0x5f,0x52,0x92,0x8b,\r\n0x8a,0x4a,0x0f,0x2b,0x30,0x2e,0x26,0x17,0xa7,0x4a,0x55,0x2d,0x3d,0x15,0x0c,0x10,0x09,0x03,0x06,0x16,0x2c,0x26,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x13,0x1a,0x10,0x07,0x02,0x05,0x0a,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x06,0x0e,0x56,0x00,0x00,0x00,0x01,0x00,0x19,0xff,0xea,\r\n0x08,0xaf,0x04,0x19,0x00,0x48,0x00,0x52,0xb9,0x00,0x25,0x05,0x0a,0xb2,0x1a,0x3b,0x30,0xb8,0x05,0x0a,0xb4,0x11,0x0e,0x0e,0x11,0x14,0xb8,0x04,0xfb,0xb7,0x2b,0x2b,0x1f,0x3b,0x41,0x35,0x35,0x07,0x41,0x09,0x04,0xfb,0x00,0x41,0x05,0x03,0x00,0x32,0x04,0xfb,0x00,0x36,0x05,0x03,0x00,0x20,0x04,0xfb,0xb3,0x2f,0x1f,0x01,0x1f,0x00,\r\n0x2f,0x5d,0xed,0x3f,0xed,0x3f,0xed,0x32,0x2f,0x11,0x39,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x39,0x2f,0xed,0x31,0x30,0x37,0x1e,0x05,0x33,0x32,0x3e,0x04,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,\r\n0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x06,0x04,0x21,0x22,0x2e,0x04,0x27,0x19,0x25,0x83,0xaa,0xc7,0xd4,0xd8,0x65,0x72,0xbb,0x9d,0x83,0x72,0x68,0x33,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,\r\n0x0b,0x20,0x3e,0x1f,0x07,0x39,0x4b,0x1a,0x04,0x0c,0x21,0x14,0x76,0xfe,0x25,0xfe,0xa9,0x47,0xb1,0xc0,0xc2,0xae,0x8f,0x2d,0xa9,0x05,0x07,0x06,0x03,0x02,0x01,0x01,0x02,0x02,0x05,0x06,0x04,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,\r\n0x38,0x23,0x2c,0x05,0x03,0xa7,0x2c,0x29,0x16,0x21,0x0e,0x0a,0x0e,0x01,0x02,0x03,0x06,0x07,0x05,0x00,0x00,0x01,0xff,0xba,0xff,0xea,0x08,0x04,0x04,0x19,0x00,0x4d,0x00,0x61,0xb1,0x3f,0x34,0xb8,0x05,0x0a,0x40,0x09,0x15,0x12,0x12,0x24,0x15,0x15,0x1e,0x3a,0x29,0xbb,0x05,0x0a,0x00,0x1e,0x00,0x18,0x04,0xfb,0xb3,0x2f,0x2f,0x23,\r\n0x47,0xbc,0x05,0x03,0x00,0x3a,0x05,0x03,0x00,0x24,0x04,0xfb,0x40,0x0c,0x2f,0x23,0x01,0x23,0x3f,0x00,0x39,0x36,0x36,0x0d,0x0d,0x07,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x2f,0x33,0x2f,0x33,0x11,0x39,0x2f,0x5d,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0x39,0x33,0x2f,0x10,0xed,\r\n0x39,0x31,0x30,0x17,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x16,0x04,0x33,0x32,0x3e,0x02,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x24,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x1e,0x02,0x15,0x14,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,\r\n0x0e,0x02,0x04,0x23,0x22,0x2e,0x04,0x32,0x32,0x23,0x23,0x23,0x23,0x3b,0x1e,0xa2,0xef,0x01,0x2e,0xab,0x9d,0xf6,0xc3,0x99,0x40,0x03,0x03,0x5d,0x55,0xfb,0xd3,0x56,0x88,0x5e,0x32,0x6b,0xc7,0x01,0x1f,0xb4,0x7f,0xe3,0xac,0x65,0x19,0x4b,0x88,0x70,0x03,0xba,0x46,0x76,0x54,0x2f,0x0b,0x20,0x3e,0x1f,0x07,0x39,0x4c,0x19,0x04,0x0b,\r\n0x22,0x14,0x34,0xb6,0xec,0xfe,0xe9,0x96,0x50,0xb3,0xb2,0xa8,0x8b,0x66,0x0e,0x34,0x20,0x20,0x33,0x03,0x03,0x02,0x03,0x05,0x07,0x05,0x0b,0x12,0x0b,0x43,0x55,0x07,0x1f,0x40,0x39,0x52,0xa9,0x92,0x6f,0x19,0xa6,0x10,0x43,0x56,0x61,0x2e,0x12,0x14,0x0a,0x02,0x2e,0x4d,0x66,0x38,0x23,0x2c,0x05,0x03,0xa7,0x2d,0x28,0x15,0x22,0x0e,\r\n0x05,0x08,0x07,0x04,0x01,0x02,0x02,0x02,0x01,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x5b,0x04,0xa6,0x05,0xb0,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0xff,0xff,0x00,0xab,0xff,0xea,\r\n0x06,0xae,0x06,0xb3,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xae,0x07,0xcb,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,\r\n0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xcb,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0x39,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x06,0xae,0x05,0xec,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0x74,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,\r\n0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,\r\n0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x5b,0x04,0xa6,0x05,0xb0,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x27,0x0f,0x5b,0x01,0x4f,0x05,0xb0,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xc3,\r\n0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x51,0x03,0x90,0x07,0x13,0x00,0x0c,0xb5,0x03,0x02,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x07,0xc3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x51,0x00,0x39,\r\n0x07,0x13,0x00,0x0c,0xb5,0x03,0x02,0x20,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,\r\n0x00,0x26,0x0f,0x59,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x07,0x38,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x52,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x59,0x03,0x57,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x02,0x07,0x38,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x27,\r\n0x0f,0x52,0x00,0xab,0xfd,0xce,0x00,0x06,0x0f,0x59,0x00,0x00,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x08,0xbd,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x27,0x0f,0x59,0x03,0x57,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x57,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x4f,0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x5d,0x35,0x35,\r\n0x35,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x08,0xbd,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x26,0x0f,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x00,0x00,0x06,0xf5,0x00,0x13,0x40,0x0a,0x04,0x03,0x02,0x20,0x3c,0x01,0x20,0x3c,0x01,0x3c,0x00,0x11,0x5d,0x5d,0x35,0x35,0x35,0x00,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x70,0x08,0x0e,\r\n0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0a,0x6d,0x03,0x48,0x00,0x32,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x07,0x67,0x02,0x26,0x09,0x59,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x48,0x06,0xb7,0xff,0xff,0x00,0x9b,0xfe,0xac,0x05,0x58,0x08,0x7f,0x02,0x26,0x09,0x59,0x00,0x00,0x01,0x07,0x0f,0x53,0x03,0x48,0x06,0xb7,0x00,0x0e,\r\n0xb6,0x01,0x03,0x02,0x20,0x34,0x01,0x34,0x00,0x11,0x5d,0x35,0x35,0x35,0x00,0x04,0x00,0x9b,0xfd,0xc4,0x05,0x58,0x05,0xec,0x00,0x28,0x00,0x2c,0x00,0x30,0x00,0x34,0x00,0x72,0xb1,0x0e,0x01,0xbb,0x05,0x0a,0x00,0x27,0x00,0x2a,0x05,0x0c,0xb2,0x29,0x29,0x2d,0xbb,0x05,0x0c,0x00,0x2e,0x00,0x31,0x05,0x0c,0x40,0x0a,0x32,0x27,0x2e,\r\n0x32,0x32,0x2e,0x27,0x03,0x36,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x29,0x04,0xfb,0xb2,0x2c,0x31,0x2d,0xb8,0x04,0xfb,0x40,0x0c,0x33,0x2f,0x30,0x01,0x30,0x1a,0x0d,0x00,0x11,0x11,0x22,0x06,0xbb,0x04,0xfb,0x00,0x07,0x05,0x03,0x00,0x00,0x00,0x2f,0x3f,0xed,0x32,0x33,0x2f,0x12,0x39,0x2f,0x2f,0x5d,0x33,0xfd,0x32,0xd6,0xed,0x01,\r\n0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x01,0x23,0x35,0x33,0x37,0x23,0x35,0x33,\r\n0x05,0x23,0x35,0x33,0x04,0x9e,0x0c,0x27,0x49,0x3e,0x1a,0x23,0x4c,0x48,0x3e,0x14,0x03,0x41,0xda,0xa3,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x24,0x4e,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xfc,0xc9,0xc9,0xab,0xc9,0xc9,0xfe,0xaa,0xc9,0xc9,0x05,0xec,0xfb,0xb0,0x43,0x61,0x40,0x1f,0xa7,0x10,0x27,0x44,0x35,0x56,0x5a,0x45,\r\n0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x2e,0x67,0xa7,0x79,0x03,0x9c,0xf7,0xd8,0xbd,0x5b,0xbd,0xbd,0xbd,0x00,0x03,0x00,0x9b,0xfd,0xf6,0x05,0x58,0x04,0xb6,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6e,0xb1,0x11,0x03,0xb8,0x05,0x0a,0xb2,0x2c,0x34,0x30,0xb8,0x05,0x0c,0x40,0x09,0x31,0x35,0x31,0x2c,0x31,\r\n0x2c,0x31,0x39,0x22,0xbb,0x05,0x0a,0x00,0x1b,0x00,0x34,0x04,0xfb,0xb4,0x2f,0x37,0x01,0x37,0x30,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x33,0x01,0x33,0x2f,0x2f,0x01,0x2f,0x16,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x27,0x01,0x27,0x2f,0x1f,0x01,0x1f,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0x2f,0x5d,0xed,\r\n0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,\r\n0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x3a,0x34,0x14,0x04,0x1b,0x56,0x79,0x9e,0x63,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0xc9,0xc9,0x03,0x17,0x5d,0xac,0x51,0x21,0x47,0x62,0x3e,\r\n0x1c,0xa7,0x09,0x16,0x28,0x1e,0x3d,0x60,0x42,0x23,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0x40,0xbd,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,\r\n0x00,0x83,0xfe,0xab,0x00,0x01,0x00,0x9b,0xfd,0xff,0x05,0x58,0x01,0xc1,0x00,0x2a,0x00,0x4a,0xb2,0x0b,0x00,0x0c,0xb8,0x05,0x0a,0xb5,0x2a,0x27,0x27,0x2c,0x1a,0x1d,0xb8,0x05,0x0a,0x40,0x0b,0x19,0x16,0x2f,0x2a,0x01,0x2a,0x2f,0x1a,0x01,0x1a,0x22,0xb8,0x04,0xfb,0xb7,0x1f,0x11,0x2f,0x11,0x02,0x11,0x0c,0x06,0xba,0x04,0xfb,0x00,\r\n0x07,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0xed,0x2f,0x5d,0x2f,0x5d,0x01,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xe1,0x32,0x32,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x33,0x15,0x23,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,\r\n0x26,0x27,0x04,0x84,0x08,0x09,0x06,0x09,0x55,0x5f,0x16,0x3f,0x4a,0x17,0x05,0x03,0x3c,0x82,0xcf,0x95,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0x01,0xc1,0x2d,0x54,0x2a,0x3f,0x3e,0xa7,0x26,0x20,0x01,0x84,0xd3,0x93,0x4e,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,\r\n0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x05,0x0e,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x9e,0x06,0x32,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0xff,0xff,0xff,0xba,\r\n0xff,0xf2,0x02,0xac,0x06,0x32,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x57,0x00,0x72,0x03,0xd0,0x00,0x03,0x00,0x9b,0xfe,0x55,0x05,0x58,0x04,0xb6,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x7e,0xb1,0x11,0x03,0xb8,0x05,0x0a,0xb2,0x39,0x14,0x17,0xb8,0x05,0x0e,0xb2,0x44,0x23,0x21,0xb8,0x05,0x0e,0xb5,0x4a,0x44,0x4a,0x44,0x4a,\r\n0x3d,0xb8,0x05,0x0c,0xb6,0x3e,0x39,0x3e,0x39,0x3e,0x4e,0x2f,0xbb,0x05,0x0a,0x00,0x28,0x00,0x40,0x01,0x57,0xb5,0x3d,0x2f,0x3c,0x01,0x3c,0x1c,0xb8,0x05,0x00,0xb3,0x41,0x14,0x23,0x47,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x34,0x01,0x34,0x2f,0x2c,0x01,0x2c,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,\r\n0x2f,0x5d,0xfd,0x39,0x39,0xd6,0xed,0x2f,0x5d,0xd6,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x39,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,\r\n0x02,0x35,0x34,0x37,0x2e,0x03,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x39,0x35,0x14,0x04,0x2b,0xa3,0x80,0x14,0x17,0x1a,0x2b,0x3a,\r\n0x20,0x23,0x3b,0x2b,0x19,0x21,0x6e,0x95,0x5b,0x27,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0x63,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0x03,0x17,0x5e,0xab,0x51,0x21,0x47,0x62,0x3e,0x1c,0xa7,0x09,0x16,0x28,0x1e,0x60,0x7d,0x18,0x15,0x38,0x21,0x20,0x3a,0x2c,0x19,0x19,0x2c,0x39,\r\n0x21,0x3b,0x2a,0x0b,0x4d,0x7e,0xab,0x68,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0xea,0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0xff,0xff,0xff,0xba,0xff,0x05,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x5b,0x00,0x1a,0x01,0x06,0x00,0x07,\r\n0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x04,0x74,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x9f,0x02,0xac,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x87,0x04,0x53,\r\n0x02,0x06,0x0e,0x5b,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xff,0x04,0x02,0x03,0x56,0x02,0x06,0x0e,0x5d,0x00,0x00,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0x56,0xfd,0xce,0x00,0x07,0x0f,0x50,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x57,0xff,0xaf,0x04,0x02,0x04,0x11,\r\n0x02,0x26,0x09,0x72,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfc,0x28,0xff,0xff,0x00,0x57,0xff,0xaf,0x04,0x02,0x03,0x5c,0x02,0x26,0x09,0x72,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xab,0x02,0xac,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x06,0x0f,0x5b,0x66,0x60,0x00,0x02,0x00,0x00,\r\n0xfd,0xfe,0x04,0x02,0x03,0x1c,0x00,0x2c,0x00,0x41,0x00,0x6a,0xb2,0x12,0x2b,0x37,0xb8,0x05,0x0a,0xb2,0x13,0x20,0x2b,0xb8,0x05,0x0a,0xb4,0x18,0x3f,0x3f,0x18,0x12,0xb8,0x04,0xfd,0xb6,0x2f,0x15,0x01,0x15,0x15,0x0d,0x1b,0xb8,0x04,0xfb,0xb6,0x2f,0x3c,0x3f,0x3c,0x02,0x3c,0x32,0xb8,0x04,0xfb,0xb5,0x2f,0x25,0x01,0x25,0x0a,0x0d,\r\n0xb8,0x04,0xfb,0x40,0x09,0x09,0x1f,0x06,0x2f,0x06,0x02,0x06,0x18,0x2b,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x39,0x2f,0x5d,0x33,0xed,0x32,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x11,0x39,0x2f,0x5d,0xed,0x01,0x2f,0x33,0x2f,0x10,0xed,0x2f,0x33,0xed,0x12,0x39,0x31,0x30,0x05,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x35,0x16,\r\n0x16,0x33,0x32,0x3e,0x02,0x37,0x21,0x35,0x21,0x36,0x36,0x37,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x33,0x25,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x04,0x02,0xc3,0x0d,0x3f,0x72,0xab,0x79,0x58,0xad,0x58,0x67,0xab,0x45,0x3e,0x60,0x48,0x33,\r\n0x11,0xfe,0x2a,0x01,0xf4,0x08,0x07,0x01,0x30,0x56,0x2a,0x42,0x7b,0x5e,0x39,0x30,0x55,0x75,0x45,0x42,0x7f,0x63,0x3d,0xb7,0xfe,0x96,0x0f,0x2a,0x32,0x35,0x1a,0x1c,0x37,0x2c,0x1b,0x20,0x3a,0x4e,0x2f,0x1b,0x4b,0x2a,0x02,0x09,0x0e,0x62,0xb5,0x8a,0x53,0x2c,0x2a,0xa6,0x2b,0x25,0x1b,0x31,0x43,0x28,0x6d,0x2b,0x58,0x2d,0x16,0x11,\r\n0x29,0x4f,0x72,0x48,0x41,0x8e,0x77,0x4d,0x4f,0x9e,0xee,0x9f,0x09,0xef,0x33,0x55,0x3d,0x22,0x26,0x3d,0x4a,0x24,0x26,0x3c,0x29,0x16,0x0c,0x14,0x1d,0x33,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x31,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x0a,0x6d,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x63,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x09,0x30,0x00,0xe4,0xfd,0x55,0x00,0x0c,0xb5,0x03,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x59,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x09,0x73,0x00,0xe5,0xfd,0x55,\r\n0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x05,0x31,0x02,0x26,0x0e,0x5e,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xe5,0xfd,0x55,0x00,0x0a,0xb4,0x02,0x2f,0x3a,0x01,0x3a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x04,0x79,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0xd5,0x03,0xc9,0xff,0xff,0x00,0x00,\r\n0xfd,0xff,0x04,0x02,0x05,0x91,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x53,0x00,0xd5,0x03,0xc9,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x6d,\r\n0x00,0x9c,0xfd,0x7e,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0x00,0xfd,0xff,0x04,0x02,0x04,0x79,0x02,0x26,0x0e,0x5e,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x03,0xc9,0xff,0xff,0xff,0xba,0xfd,0xc9,0x01,0xf2,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,\r\n0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x52,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x81,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0f,0x54,\r\n0x00,0x83,0xfd,0xce,0x00,0x01,0x00,0x81,0x06,0xa6,0x01,0x86,0x07,0xab,0x00,0x13,0x00,0x19,0xbc,0x00,0x0a,0x05,0x0c,0x00,0x00,0x00,0x05,0x04,0xfe,0xb3,0x2f,0x0f,0x01,0x0f,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x13,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x81,0x13,0x23,0x2f,0x1d,\r\n0x1c,0x31,0x22,0x14,0x14,0x22,0x31,0x1c,0x1d,0x2f,0x23,0x13,0x07,0x28,0x1c,0x31,0x22,0x14,0x14,0x22,0x31,0x1c,0x1d,0x2f,0x23,0x13,0x13,0x23,0x2f,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x53,0x05,0x50,0x03,0x57,0x00,0x07,0x0f,0x50,0x05,0x50,0xfe,0xab,0xff,0xff,\r\n0xff,0xba,0xfe,0xa6,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xa4,0x03,0x57,0x00,0x07,0x0f,0x50,0x02,0xa4,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x0a,0xb0,0x04,0xb2,0x00,0x26,0x0e,0x35,0x00,0x00,0x00,0x27,0x0f,0x50,0x05,0xca,0x04,0x02,0x00,0x07,0x0f,0x50,0x06,0x3c,0xfe,0xab,0xff,0xff,\r\n0xff,0xba,0xfe,0xa6,0x08,0x04,0x04,0xb2,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x27,0x0f,0x50,0x03,0x1e,0x04,0x02,0x00,0x07,0x0f,0x50,0x03,0x90,0xfe,0xab,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x55,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x0f,\r\n0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x55,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x21,0x02,0xac,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x05,0xca,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xad,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xca,\r\n0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x9c,0x04,0x02,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,\r\n0x0f,0x53,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x53,0x02,0xad,0xfd,0xce,0x00,0x07,0x0f,0x51,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x53,0x00,0x83,0xfd,0xce,0x00,0x07,\r\n0x0f,0x51,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0xb2,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xad,0xfe,0xab,0x00,0x07,0x0f,0x50,0x02,0xad,0x04,0x02,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x83,0xfe,0xab,0x00,0x07,\r\n0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0xab,0xfe,0x13,0x07,0x59,0x03,0x0f,0x02,0x26,0x0e,0x6e,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0xad,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x35,0x01,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0x13,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0x83,\r\n0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x05,0x5a,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0xad,0xfd,0x7e,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x05,0x5a,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0a,0x6d,0x00,0x9c,0xfd,0x7e,0xff,0xff,\r\n0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x61,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x56,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x02,0x07,0x0f,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x27,\r\n0x0f,0x57,0x01,0x1d,0x04,0xad,0x00,0x07,0x0f,0x52,0x00,0xab,0xfd,0xce,0xff,0xff,0x00,0x52,0xfe,0x13,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x01,0x07,0x0a,0x6e,0x00,0xab,0xf7,0x97,0x00,0x0a,0xb4,0x01,0x2f,0x2b,0x01,0x2b,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x02,0x5e,0x02,0x26,0x0b,0x0c,\r\n0x00,0x00,0x00,0x07,0x0f,0x5c,0x00,0xc0,0xfc,0xfa,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0f,0x56,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x56,0x02,0xa4,0x03,0x57,0xff,0xff,0x00,0xab,0xfe,0xa6,\r\n0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x51,0x05,0x10,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x08,0x04,0x03,0x62,0x02,0x26,0x0e,0xa5,0x00,0x00,0x00,0x07,0x0f,0x53,0x05,0x10,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0xb3,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x50,0x03,0x90,\r\n0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x07,0xcb,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x03,0x90,0x06,0x03,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0xad,0xfd,0xce,0xff,0xff,0x00,0x39,0xfd,0xff,0x04,0xad,0x04,0x79,0x02,0x26,0x0e,0x57,\r\n0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,0x04,0x79,0x02,0x26,0x0e,0x58,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0x03,0xc9,0xff,0xff,0x00,0x39,0xfd,0xff,0x04,0xad,0x02,0xb9,0x02,0x26,0x0e,0x57,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,\r\n0x04,0xad,0x02,0xaf,0x02,0x26,0x0e,0x58,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x8f,0xfe,0xab,0x00,0x04,0x00,0x9b,0xfd,0xf6,0x05,0x58,0x04,0xb6,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x82,0xb1,0x11,0x03,0xbb,0x05,0x0a,0x00,0x2c,0x00,0x31,0x05,0x0c,0xb2,0x30,0x30,0x38,0xbe,0x05,0x0c,0x00,0x39,0x00,0x34,0x05,0x0c,0x00,\r\n0x35,0x00,0x22,0x05,0x0a,0x40,0x0e,0x1b,0x2c,0x39,0x35,0x1b,0x1b,0x35,0x39,0x2c,0x04,0x3d,0x3c,0x38,0x34,0xb8,0x04,0xfb,0xb5,0x3a,0x2f,0x37,0x01,0x37,0x33,0xb8,0x01,0x57,0xb5,0x30,0x2f,0x2f,0x01,0x2f,0x16,0xb8,0x04,0xfb,0x40,0x0a,0x2f,0x27,0x01,0x27,0x2f,0x1f,0x01,0x1f,0x11,0x09,0xba,0x04,0xfb,0x00,0x0a,0x05,0x03,0x00,\r\n0x3f,0xed,0x39,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xd6,0xed,0x2f,0x5d,0x33,0xed,0x32,0x11,0x12,0x01,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x16,0x16,0x15,0x15,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x84,0x11,0x11,0x0b,0x26,0x46,0x3b,0x19,0x1b,0x3b,0x3a,0x34,0x14,0x04,0x1b,0x56,0x79,0x9e,0x63,0x88,0xb7,0x6f,0x2f,0x0f,0x0e,0x97,0x0b,0x0c,0x24,0x4f,0x7e,0x5a,0x69,0x94,\r\n0x5e,0x2b,0x11,0x10,0xe4,0xc9,0xc9,0xab,0xc9,0xc9,0x01,0x56,0xc9,0xc9,0x03,0x17,0x5d,0xac,0x51,0x21,0x47,0x62,0x3e,0x1c,0xa7,0x09,0x16,0x28,0x1e,0x3d,0x60,0x42,0x23,0x45,0x7f,0xb7,0x72,0x40,0x89,0x4e,0x4b,0x7f,0x39,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x45,0x9d,0x64,0xe2,0xbd,0xf9,0x40,0xbd,0xbd,0xbd,0x00,0xff,0xff,\r\n0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x00,0x07,0x0f,0x50,0x00,0x9c,0x04,0x02,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x06,0x64,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,0x02,0xac,0x00,0x07,0x0f,0x57,0x01,0x9f,0x04,0x02,0xff,0xff,\r\n0xff,0xba,0xff,0xf2,0x02,0xac,0x07,0xba,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0f,0x57,0x00,0x72,0x05,0x58,0x00,0x0a,0xb4,0x01,0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,0x05,0x63,0x02,0x26,0x0e,0xcf,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0x9f,\r\n0x02,0xac,0x01,0x07,0x0a,0x6d,0x01,0x9f,0xfd,0x87,0x00,0x0a,0xb4,0x01,0x20,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0xc4,0x06,0xb9,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9c,0x04,0x02,0x01,0x07,0x0a,0x6d,0x00,0x9c,0xfe,0xdd,0x00,0x14,0x40,0x0a,0x02,0x2f,0x25,0x01,0x25,0x01,\r\n0x20,0x21,0x01,0x21,0x00,0x11,0x5d,0x35,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x1f,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0f,0x52,0x05,0x50,0x03,0x57,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x1f,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0f,0x52,0x02,0xa4,0x03,0x57,0x00,0x03,0x00,0x7e,\r\n0xfd,0xfe,0x04,0x2d,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x6a,0xb4,0x24,0x02,0x1b,0x1b,0x34,0xb8,0x05,0x0e,0xb2,0x44,0x4c,0x2b,0xb8,0x05,0x0d,0xb7,0x28,0x44,0x28,0x44,0x28,0x4e,0x10,0x21,0xbb,0x05,0x0a,0x00,0x02,0x00,0x39,0x04,0xfd,0xb6,0x3f,0x28,0x28,0x25,0x25,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x0f,0x2a,0x2f,0x2f,\r\n0x01,0x2f,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0xc6,0xfd,0xc6,0x32,0x2f,0x32,0x2f,0x10,0xed,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x2f,0x11,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,\r\n0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x2b,0xad,0x53,0xa8,0xfe,\r\n0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x07,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0xfd,0xfe,\r\n0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x1e,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,\r\n0x33,0x43,0x24,0x00,0x00,0x04,0x00,0x7e,0xfd,0xfe,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x5a,0x00,0x7e,0xb2,0x1b,0x1b,0x34,0xb8,0x05,0x0e,0xb5,0x44,0x58,0x58,0x44,0x4c,0x2b,0xb8,0x05,0x0d,0x40,0x0b,0x28,0x44,0x28,0x44,0x28,0x5c,0x24,0x02,0x4d,0x10,0x21,0xbf,0x05,0x0a,0x00,0x02,0x00,0x50,0x04,0xfb,0x00,\r\n0x52,0x05,0x03,0x00,0x39,0x04,0xfd,0xb6,0x3f,0x28,0x28,0x25,0x25,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x10,0x2a,0x2f,0x2f,0x01,0x2f,0x1b,0x07,0x1c,0x4d,0x04,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0xc6,0xfd,0xc6,0x32,0x2f,0x32,0x2f,0x10,0xed,0x3f,0xed,0x01,0x2f,\r\n0xed,0x39,0x2f,0x12,0x39,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x11,0x33,0x2f,0x10,0xed,0x32,0x2f,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,\r\n0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,\r\n0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x06,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x01,0xba,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,\r\n0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x1e,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x02,0x43,0x68,0x55,\r\n0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x00,0xff,0xff,0xff,0xba,0xfe,0x03,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0xfe,0x03,0xff,0xff,0xff,0xba,0xfe,0x03,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0xfe,0x03,0x00,0x05,0x00,0x7e,0xfd,0xfa,0x04,0x2d,\r\n0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x50,0x00,0x54,0x00,0x9d,0xb9,0x00,0x52,0x05,0x0a,0xb7,0x51,0x51,0x44,0x24,0x02,0x1b,0x1b,0x34,0xbb,0x05,0x0e,0x00,0x44,0x00,0x2b,0x05,0x0d,0xb4,0x2c,0x4c,0x28,0x28,0x4d,0xb8,0x05,0x0a,0xb7,0x4e,0x44,0x4e,0x44,0x4e,0x56,0x10,0x21,0xb8,0x05,0x0a,0xb4,0x02,0x2c,0x2a,0x52,0x4d,\r\n0xb8,0x05,0x02,0xb2,0x53,0x50,0x39,0xb8,0x04,0xfd,0x40,0x0a,0x3f,0x28,0x28,0x25,0x25,0x2f,0x3f,0x01,0x3f,0x47,0xb8,0x04,0xfd,0x40,0x10,0x2f,0x2f,0x3f,0x2f,0x02,0x2f,0x2f,0x2a,0x01,0x2a,0x1c,0x07,0x1b,0x03,0x00,0x0d,0xb8,0x04,0xff,0xb4,0x14,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0xed,0x12,0x17,0x39,0x2f,0x5d,0x2f,0x5d,\r\n0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xfd,0xd6,0x32,0xed,0x32,0x11,0x39,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x2f,0x11,0x39,0x11,0x39,0x2f,0xed,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,\r\n0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,\r\n0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x07,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x21,0xb9,0xb9,0x01,0x42,0xb9,0xb9,\r\n0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x82,0x02,0x03,0x02,0x01,0x93,0xf7,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,\r\n0x1f,0x33,0x43,0x24,0xfe,0x83,0xb5,0xb5,0xb5,0x00,0x00,0x06,0x00,0x7e,0xfd,0xfa,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x3e,0x00,0x4c,0x00,0x5a,0x00,0x5e,0x00,0x62,0x00,0xb1,0xb2,0x24,0x02,0x4d,0xb8,0x05,0x0b,0xb3,0x58,0x58,0x44,0x60,0xb8,0x05,0x0a,0xb3,0x34,0x5f,0x5f,0x34,0xbb,0x05,0x0e,0x00,0x44,0x00,0x2b,0x05,0x0d,0xb4,\r\n0x2c,0x4c,0x28,0x28,0x5b,0xb8,0x05,0x0a,0xb7,0x5c,0x44,0x5c,0x44,0x5c,0x64,0x10,0x21,0xb8,0x05,0x0a,0xb2,0x02,0x5f,0x5b,0xb8,0x04,0xfb,0x40,0x0a,0x61,0x2f,0x5e,0x01,0x5e,0x51,0x50,0x50,0x2f,0x39,0xb8,0x04,0xfd,0x40,0x0a,0x3f,0x28,0x28,0x25,0x25,0x2f,0x3f,0x01,0x3f,0x47,0xb8,0x04,0xfd,0xb3,0x2c,0x52,0x2a,0x2f,0xba,0x04,\r\n0xfb,0x00,0x52,0x05,0x03,0xb6,0x4d,0x1c,0x07,0x1b,0x04,0x00,0x0d,0xb8,0x04,0xff,0xb4,0x14,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x2f,0xed,0x12,0x17,0x39,0x3f,0xf4,0xc6,0x12,0x39,0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x2f,0x5d,0x33,0xed,0x32,0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,\r\n0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x2f,0x10,0xe4,0x12,0x39,0x2f,0xed,0x11,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x03,0x16,0x16,0x17,0x11,0x33,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,\r\n0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,\r\n0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x33,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x01,0xe7,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0xfe,0x86,0xb9,0xb9,\r\n0x01,0x42,0xb9,0xb9,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x01,0x82,0x02,0x03,0x02,0x01,0x93,0xf7,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,0x03,0x5e,0x02,0x0e,\r\n0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x01,0xdf,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0xfc,0xac,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfd,0xfa,0x04,0x68,0x02,0xdb,0x00,0x42,0x00,0x50,0x00,0x54,0x00,0x58,0x00,0x92,0xb1,0x0d,0x30,0xb8,0x05,0x0e,0xb2,0x48,0x48,0x55,0xb8,0x05,0x0a,0xb2,0x56,0x50,0x27,0xb8,0x05,0x0d,\r\n0xb2,0x3f,0x3f,0x51,0xb8,0x05,0x0a,0x40,0x09,0x52,0x56,0x52,0x56,0x52,0x5a,0x15,0x55,0x51,0xb8,0x04,0xfb,0x40,0x09,0x57,0x54,0x43,0x3e,0x3e,0x43,0x3b,0x3b,0x35,0xb8,0x04,0xfd,0xb4,0x2f,0x43,0x01,0x43,0x4b,0xb8,0x04,0xfd,0x40,0x0b,0x27,0x2f,0x2b,0x01,0x2b,0x20,0x0c,0x21,0x03,0x00,0x12,0xb8,0x04,0xff,0xb7,0x2f,0x19,0x01,\r\n0x19,0x26,0x3f,0x3f,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x39,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x2f,0x5d,0x33,0xfd,0xd6,0x5d,0xed,0x33,0x2f,0x11,0x33,0x2f,0x10,0xd4,0x32,0xed,0x32,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x32,0x10,0xed,0x39,0x2f,0xed,0x39,0x31,0x30,0x15,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x0e,0x03,0x07,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,0x16,0x17,0x35,0x06,0x06,0x23,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,\r\n0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xda,0xc7,0xb9,0x5a,0x3a,0x59,0x60,0x76,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x79,0x66,0x5c,0x65,0x76,0x4e,0x20,0x2c,0x75,0x95,0xb4,0x6a,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x0d,0x17,0x3e,\r\n0x2a,0x51,0xb4,0x64,0x02,0x46,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x21,0xaf,0xaf,0x01,0x38,0xaf,0xaf,0x0e,0x34,0x20,0x20,0x33,0x31,0x4f,0x64,0x32,0x05,0x18,0x30,0x25,0x18,0x14,0x10,0x9d,0x12,0x17,0x1b,0x28,0x2f,0x29,0x1c,0x01,0xbb,0x09,0x41,0x57,0x5f,0x27,0x7a,0x01,0x3d,0x42,0x22,0x39,0x4b,0x29,0x3a,\r\n0x40,0x1e,0x05,0x01,0x03,0x04,0x03,0x62,0x02,0x03,0x02,0xe6,0x17,0x1c,0xb5,0x02,0x0c,0x18,0x17,0x33,0x30,0x1b,0x2c,0x3a,0x1f,0xfe,0xbd,0xab,0xab,0xab,0x00,0x04,0xff,0xba,0xfd,0xfa,0x04,0xad,0x02,0xdb,0x00,0x4f,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0xa7,0xb1,0x0d,0x3d,0xb8,0x05,0x0e,0xb6,0x55,0x55,0x62,0x63,0x30,0x30,0x24,\r\n0xba,0x05,0x0b,0x00,0x62,0x05,0x0a,0xb2,0x63,0x5d,0x34,0xb8,0x05,0x0d,0xb2,0x4c,0x4c,0x5e,0xb8,0x05,0x0a,0x40,0x09,0x5f,0x63,0x5f,0x63,0x5f,0x67,0x66,0x62,0x5e,0xb8,0x04,0xfb,0xb2,0x64,0x61,0x42,0xb8,0x04,0xfd,0x40,0x0a,0x50,0x4b,0x4b,0x48,0x48,0x2f,0x50,0x01,0x50,0x58,0xb8,0x04,0xfd,0xb5,0x34,0x2f,0x38,0x01,0x38,0x2a,\r\n0xb8,0x05,0x03,0xb7,0x30,0x24,0x21,0x0c,0x20,0x05,0x00,0x12,0xb8,0x04,0xff,0x40,0x09,0x2f,0x19,0x01,0x19,0x33,0x4c,0x4c,0x29,0x06,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x39,0x11,0x33,0x2f,0x5d,0xed,0x12,0x17,0x39,0x3f,0x2f,0x5d,0x33,0xfd,0xc6,0x5d,0x32,0x2f,0x32,0x2f,0x10,0xfd,0xd6,0x32,0xed,0x32,0x11,\r\n0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x32,0x10,0xfd,0xe4,0x33,0x2f,0x11,0x12,0x39,0x2f,0xed,0x39,0x31,0x30,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,\r\n0x27,0x06,0x06,0x07,0x15,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x16,0x16,0x17,0x35,0x06,0x06,0x23,0x05,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xda,0xc7,0xb9,0x5a,0x3a,0x59,0x60,0x76,0x57,\r\n0x4e,0x7e,0x33,0x37,0x84,0x4e,0x4f,0x7a,0x66,0x5c,0x64,0x77,0x4e,0x20,0x1d,0x46,0x2a,0x03,0x14,0x35,0x5c,0x4a,0x14,0x62,0x7c,0x49,0x1e,0x04,0x48,0xad,0x67,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x0d,0x17,0x3e,0x2a,0x51,0xb4,0x64,0x02,0x46,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,\r\n0x3f,0x35,0x2a,0x0f,0x21,0xaf,0xaf,0x01,0x38,0xaf,0xaf,0x0e,0x34,0x20,0x20,0x33,0x31,0x4f,0x64,0x32,0x05,0x18,0x2f,0x26,0x18,0x14,0x10,0x9d,0x12,0x17,0x1b,0x28,0x2f,0x29,0x1c,0x01,0xbb,0x06,0x22,0x17,0x27,0x36,0x23,0x10,0xa7,0x29,0x45,0x59,0x31,0x2a,0x5a,0x25,0x7a,0x01,0x3c,0x43,0x22,0x39,0x4b,0x29,0x3a,0x40,0x1e,0x05,\r\n0x01,0x03,0x04,0x03,0x62,0x02,0x03,0x02,0xe5,0x17,0x1b,0xb5,0x02,0x0c,0x18,0x17,0x33,0x30,0x1b,0x2c,0x3a,0x1f,0xfe,0xbd,0xab,0xab,0xab,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x07,0x0d,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x27,0x0f,0x51,0x05,0x46,0x03,0x57,0x01,0x07,0x0f,0x57,0x05,0x46,0x04,0xab,0x00,0x0c,0xb5,0x02,\r\n0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x07,0x0d,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x27,0x0f,0x51,0x05,0x46,0x03,0x57,0x01,0x07,0x0f,0x57,0x05,0x46,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x5b,0x01,0x5b,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,\r\n0x07,0x0d,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xa4,0x03,0x57,0x01,0x07,0x0f,0x57,0x02,0xa4,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x45,0x01,0x45,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x07,0x0d,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0xa4,0x03,0x57,0x01,0x07,\r\n0x0f,0x57,0x02,0xa4,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x4f,0x01,0x4f,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc6,0x07,0x0d,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x9a,0x03,0x57,0x01,0x07,0x0f,0x57,0x00,0x9a,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x1d,0x01,0x1d,0x00,0x11,0x5d,\r\n0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x07,0x0d,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x9a,0x03,0x57,0x01,0x07,0x0f,0x57,0x00,0x9a,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0x41,0x06,0x8c,0x02,0x26,0x09,0x13,0x00,0x00,\r\n0x00,0x07,0x0f,0x57,0x01,0x56,0x04,0x2a,0xff,0xff,0x00,0x7e,0xfd,0xff,0x04,0xad,0x06,0x8c,0x02,0x26,0x08,0xd1,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x04,0x2a,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x7c,0x06,0x13,0x02,0x26,0x08,0xd0,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x03,0xb1,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xad,\r\n0x06,0x13,0x02,0x26,0x0e,0x2d,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x56,0x03,0xb1,0xff,0xff,0x00,0x17,0x00,0x00,0x01,0xf2,0x07,0x6e,0x00,0x27,0x09,0x0d,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5e,0x00,0x00,0xff,0xff,0x00,0x17,0xff,0xf2,0x02,0xac,0x07,0x6e,0x00,0x27,0x08,0xc7,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5e,0x00,0x00,\r\n0xff,0xff,0x00,0x16,0x00,0x00,0x01,0xfa,0x07,0x6e,0x00,0x27,0x09,0x0d,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5f,0x00,0x00,0xff,0xff,0x00,0x16,0xff,0xf2,0x02,0xac,0x07,0x6e,0x00,0x27,0x08,0xc7,0x00,0xab,0x00,0x00,0x00,0x06,0x0f,0x5f,0x00,0x00,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0x8a,0x02,0x26,0x09,0x2a,0x00,0x00,\r\n0x01,0x07,0x0f,0x5e,0x00,0xab,0xfe,0x1c,0x00,0x0a,0xb4,0x01,0x2f,0x36,0x01,0x36,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,0x04,0xdf,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x45,0x01,0x2f,0x45,0x01,0x45,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0xff,0xba,\r\n0xfe,0xa6,0x02,0x4c,0x05,0xf6,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5e,0x00,0xd5,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x1f,0x01,0x1f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xf6,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,\r\n0x01,0x07,0x0f,0x5e,0x00,0xd5,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x28,0x01,0x28,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x55,0x05,0x91,0x05,0x8a,0x02,0x26,0x09,0x2a,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfe,0x1c,0x00,0x0a,0xb4,0x01,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x06,0xae,\r\n0x04,0xdf,0x02,0x26,0x08,0xf7,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x68,0x01,0x2f,0x68,0x01,0x68,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x96,0x05,0xf6,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5f,0x00,0x9c,0xfe,0x88,\r\n0x00,0x0a,0xb4,0x03,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0xf6,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x51,0x00,0x4a,0xfe,0xab,0x01,0x07,0x0f,0x5f,0x00,0x9c,0xfe,0x88,0x00,0x0a,0xb4,0x03,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x05,0x91,\r\n0x04,0xaa,0x02,0x27,0x09,0x2a,0x00,0x00,0x00,0x95,0x01,0x07,0x0f,0x60,0x02,0x01,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x06,0xae,0x02,0xbd,0x02,0x26,0x0f,0x61,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xc8,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x43,0x01,0x43,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x02,0x75,0x03,0x0f,0x02,0x26,0x0e,0x6f,0x00,0x00,0x01,0x07,0x0f,0x60,0x00,0x9c,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x33,0x01,0x33,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x02,0xac,0x03,0x0f,0x02,0x26,0x09,0x3b,0x00,0x00,0x01,0x07,0x0f,0x60,0x00,0x9c,0xf8,0x34,0x00,0x0a,\r\n0xb4,0x01,0x2f,0x42,0x01,0x42,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x17,0xfd,0xff,0x03,0xf4,0x04,0xc3,0x00,0x27,0x09,0x29,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5e,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x17,0xfd,0xff,0x04,0xad,0x04,0xc3,0x00,0x27,0x0e,0x5e,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5e,0x00,0x00,0xfd,0x55,0xff,0xff,\r\n0x00,0x16,0xfd,0xff,0x03,0xf4,0x04,0xc3,0x00,0x27,0x09,0x29,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5f,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x16,0xfd,0xff,0x04,0xad,0x04,0xc3,0x00,0x27,0x0e,0x5e,0x00,0xab,0x00,0x00,0x00,0x07,0x0f,0x5f,0x00,0x00,0xfd,0x55,0xff,0xff,0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x6e,0x02,0x26,0x09,0x65,\r\n0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfe,0x00,0x00,0x0e,0xb7,0x01,0x2f,0x2c,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x09,0x66,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,\r\n0x00,0x72,0xff,0xea,0x06,0xe5,0x05,0x6e,0x02,0x26,0x09,0x65,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfe,0x00,0x00,0x0e,0xb7,0x01,0x2f,0x2c,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x09,0x66,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,\r\n0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0x00,0x02,0x00,0x7e,0xfd,0xfe,0x04,0x2c,0x03,0x54,0x00,0x24,0x00,0x4a,0x00,0x65,0xb9,0x00,0x3e,0x05,0x0b,0xb5,0x31,0x31,0x38,0x24,0x02,0x37,0xb8,0x05,0x0d,0xb4,0x38,0x38,0x4c,0x10,0x21,0xb8,0x05,0x0a,0x40,0x09,0x02,0x2f,0x37,0x01,0x37,0x47,0x25,0x28,0x2e,0xb8,0x04,0xfd,\r\n0x40,0x13,0x41,0x4a,0x4a,0x41,0x41,0x2f,0x25,0x01,0x25,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x2f,0x5d,0x33,0x2f,0x33,0x2f,0x10,0xfd,0xc4,0x11,0x39,0x2f,0x5d,0x01,0x2f,0xed,0x39,0x12,0x39,0x2f,0xed,0x11,0x39,0x11,0x39,0x2f,0xed,0x31,0x30,0x01,\r\n0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,\r\n0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,0x58,0x5d,0x58,0x01,0xd3,0x1e,0x2e,0x0f,0x69,0x06,0x14,0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0xfd,\r\n0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x02,0xd6,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,\r\n0x1c,0x00,0x00,0x03,0x00,0x7e,0xfd,0xfe,0x05,0x58,0x03,0x54,0x00,0x24,0x00,0x32,0x00,0x58,0x00,0x81,0xb5,0x24,0x55,0x33,0x03,0x02,0x25,0xbb,0x05,0x0b,0x00,0x30,0x00,0x4c,0x05,0x0b,0xb2,0x3f,0x3f,0x45,0xb8,0x05,0x0d,0xb7,0x46,0x30,0x46,0x30,0x46,0x5a,0x10,0x21,0xb8,0x05,0x0a,0x40,0x09,0x02,0x2f,0x45,0x01,0x45,0x55,0x33,\r\n0x36,0x3c,0xb8,0x04,0xfd,0x40,0x0a,0x4f,0x58,0x58,0x4f,0x4f,0x2f,0x33,0x01,0x33,0x28,0xba,0x04,0xfb,0x00,0x2a,0x05,0x03,0x40,0x0a,0x1c,0x07,0x1b,0x03,0x14,0x2f,0x24,0x01,0x24,0x0d,0xb9,0x04,0xff,0x00,0x14,0x00,0x2f,0xed,0x2f,0x5d,0x12,0x17,0x39,0x3f,0xed,0x2f,0x5d,0x33,0x2f,0x33,0x2f,0x10,0xfd,0xc4,0x11,0x39,0x2f,0x5d,\r\n0x01,0x2f,0xed,0x39,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x2f,0xed,0x10,0xed,0x11,0x17,0x39,0x31,0x30,0x01,0x26,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x04,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x36,\r\n0x36,0x07,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,0x2b,0xad,0x53,0xa8,0xfe,0xac,0x30,0x4c,0x52,0x63,0x46,0x4f,0x7d,0x35,0x36,0x86,0x4b,0x49,0x6f,0x5d,0x54,0x5c,0x6d,0x48,0x20,0xc5,0xfe,0xe2,0xb8,\r\n0x58,0x5d,0x58,0x02,0x89,0x06,0x74,0x68,0x1f,0x37,0x4f,0x77,0x52,0x2c,0x04,0x1f,0x3f,0x96,0x1e,0x2e,0x0f,0x69,0x06,0x14,0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0xfd,0xfe,0xef,0xd9,0x68,0xbe,0xa6,0x8b,0x35,0x08,0x0f,0x20,0x19,0x10,0x14,0x10,0x9d,\r\n0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xbb,0x34,0x75,0x88,0x9f,0x5e,0x64,0xe7,0x8a,0x03,0x58,0x68,0x55,0xa7,0x30,0x56,0x74,0x44,0x0b,0x13,0x7a,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,0x1c,0x00,0xff,0xff,0xff,0xba,\r\n0xfd,0x78,0x04,0x7c,0x03,0x0f,0x02,0x26,0x08,0xd0,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0x56,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x2c,0x01,0x2c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0x78,0x04,0xad,0x03,0x0f,0x02,0x26,0x0e,0x2d,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0x56,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x52,0x01,0x52,\r\n0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x05,0x50,0x02,0x26,0x09,0x19,0x00,0x00,0x01,0x07,0x0f,0x60,0x05,0x49,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x6a,0x01,0x6a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x05,0x50,0x02,0x26,0x0e,0x31,0x00,0x00,0x01,0x07,0x0f,0x60,0x05,0x49,0xfd,0xdd,\r\n0x00,0x0a,0xb4,0x01,0x2f,0x75,0x01,0x75,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x05,0x50,0x02,0x26,0x08,0xd4,0x00,0x00,0x01,0x07,0x0f,0x60,0x02,0x9d,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x5f,0x01,0x5f,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x05,0x50,0x02,0x26,0x0e,0x32,0x00,0x00,\r\n0x01,0x07,0x0f,0x60,0x02,0x9d,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x6a,0x01,0x6a,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9b,0xfd,0xff,0x08,0xa0,0x04,0xb8,0x02,0x26,0x09,0x19,0x00,0x00,0x00,0x07,0x0a,0x6e,0x05,0x46,0xfc,0xdc,0xff,0xff,0x00,0x9b,0xfd,0xff,0x09,0x5a,0x04,0xb8,0x02,0x26,0x0e,0x31,0x00,0x00,0x00,0x07,0x0a,0x6e,\r\n0x05,0x46,0xfc,0xdc,0xff,0xff,0xff,0xba,0xff,0xf2,0x05,0xf4,0x04,0xb8,0x02,0x26,0x08,0xd4,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0xa4,0xfc,0xdc,0xff,0xff,0xff,0xba,0xff,0xf2,0x06,0xae,0x04,0xb8,0x02,0x26,0x0e,0x32,0x00,0x00,0x00,0x07,0x0a,0x6e,0x02,0xa4,0xfc,0xdc,0xff,0xff,0x00,0xab,0xff,0xea,0x05,0xf4,0x06,0xb3,0x02,0x26,\r\n0x09,0x24,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x73,0x06,0x03,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xae,0x06,0xb3,0x02,0x26,0x0e,0x55,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0x73,0x06,0x03,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x4b,0x06,0xb3,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0xff,0xff,0xff,0xba,\r\n0xff,0xf2,0x04,0x02,0x06,0xb3,0x02,0x26,0x0e,0x56,0x00,0x00,0x00,0x07,0x0f,0x51,0x00,0x39,0x06,0x03,0x00,0x01,0x00,0xa4,0xff,0xfb,0x01,0x5d,0x00,0xb0,0x00,0x03,0x00,0x19,0xbc,0x00,0x00,0x05,0x0a,0x00,0x01,0x00,0x02,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x23,0x35,0x33,0x01,\r\n0x5d,0xb9,0xb9,0x05,0xb5,0x00,0x00,0x02,0x00,0x03,0xff,0xfb,0x01,0xfe,0x00,0xb0,0x00,0x03,0x00,0x07,0x00,0x29,0xb9,0x00,0x00,0x05,0x0a,0xb3,0x01,0x01,0x08,0x04,0xb8,0x05,0x0a,0xb2,0x05,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x31,0x30,0x17,\r\n0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x00,0x02,0x00,0xa4,0xff,0xfb,0x01,0x5d,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x25,0xb1,0x04,0x00,0xb8,0x05,0x0a,0xb2,0x05,0x01,0x07,0xbb,0x05,0x02,0x00,0x04,0x00,0x02,0x05,0x02,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xfd,0xd6,0xed,\r\n0x01,0x2f,0x33,0xed,0x32,0x31,0x30,0x05,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x5d,0xb9,0xb9,0xb9,0xb9,0x05,0xb5,0x63,0xb5,0x00,0x00,0x03,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x41,0xbf,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x00,0x05,0x0a,0xb3,0x01,0x01,\r\n0x0c,0x08,0xb8,0x05,0x02,0xb6,0x0b,0x0b,0x00,0x07,0x06,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x11,0x33,0x11,0x33,0x2f,0xed,0x11,0x01,0x33,0x2f,0xed,0xd4,0xed,0xd6,0xed,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,\r\n0xa1,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x03,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x37,0xbf,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x00,0x05,0x0a,0xb2,0x01,0x04,0x00,0xb8,0x05,0x02,0xb3,0x06,0x03,0x03,0x0a,0xb8,0x05,0x02,0xb3,0x2f,0x08,0x01,\r\n0x08,0x00,0x2f,0x5d,0xed,0x33,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0xd6,0xed,0xd4,0xed,0x31,0x30,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x01,0x13,0xb5,0xb5,0xb5,0xfe,0x33,0xb5,0x00,0x00,0x03,0xff,0x62,0xff,0xfb,0x02,0x9f,0x00,0xb0,0x00,0x03,0x00,0x07,\r\n0x00,0x0b,0x00,0x35,0xbf,0x00,0x08,0x05,0x0a,0x00,0x09,0x00,0x04,0x05,0x0a,0x00,0x05,0x00,0x00,0x05,0x0a,0xb5,0x01,0x01,0x0c,0x0a,0x06,0x02,0xb8,0x05,0x02,0xb5,0x09,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0x32,0xed,0x32,0x32,0x11,0x01,0x33,0x2f,0xed,0xd4,0xed,0xd4,0xed,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,\r\n0x33,0x05,0x23,0x35,0x33,0x1b,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x03,0xff,0xfb,0x01,0xfe,0x01,0xc8,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x3f,0xb1,0x08,0x00,0xb8,0x05,0x0a,0xb5,0x09,0x01,0x01,0x10,0x0c,0x04,0xb8,0x05,0x0a,0xb3,0x0d,0x05,0x0d,0x08,0xb8,\r\n0x05,0x02,0xb4,0x0e,0x0b,0x0b,0x06,0x02,0xb8,0x05,0x02,0xb4,0x05,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0x32,0xed,0x32,0x33,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x32,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xbc,0xb9,0xb9,0x01,0x42,0xb9,0xb9,\r\n0xfe,0xbe,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xb5,0xb5,0xb5,0x63,0xb5,0xb5,0xb5,0x00,0x02,0xff,0xc6,0x00,0x00,0x02,0x2c,0x02,0x62,0x00,0x19,0x00,0x27,0x00,0x44,0xb2,0x27,0x27,0x06,0xb8,0x05,0x0d,0xb3,0x03,0x03,0x28,0x0f,0xb8,0x05,0x0e,0xb4,0x1f,0x06,0x14,0x05,0x0a,0xb8,0x05,0x01,0xb7,0x22,0x00,0x27,0x1a,0x1a,0x03,0x03,\r\n0x00,0xb8,0x05,0x01,0xb4,0x2f,0x14,0x01,0x14,0x02,0x00,0x3f,0x5d,0xed,0x32,0x2f,0x33,0x11,0x33,0x10,0xd4,0xfd,0xc6,0x12,0x39,0x01,0x2f,0xed,0x11,0x33,0x2f,0xed,0x32,0x2f,0x31,0x30,0x27,0x16,0x16,0x17,0x11,0x33,0x11,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x25,0x32,0x3e,0x02,0x35,\r\n0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x3a,0x17,0x3f,0x29,0x59,0x03,0x26,0x67,0x48,0x30,0x45,0x2c,0x15,0x27,0x45,0x5c,0x36,0x47,0x6c,0x53,0x3d,0x18,0x01,0x4f,0x35,0x47,0x2a,0x12,0x41,0x2e,0x23,0x3f,0x35,0x2a,0x0f,0x72,0x02,0x03,0x02,0x01,0xf7,0xfe,0xa5,0x01,0x3e,0x46,0x24,0x3d,0x50,0x2c,0x40,0x46,0x21,0x06,0x01,0x03,0x04,\r\n0x03,0x5e,0x02,0x0e,0x1c,0x1a,0x3b,0x38,0x1f,0x33,0x43,0x24,0x00,0x02,0xff,0x97,0x06,0x7d,0x01,0xf0,0x07,0xe8,0x00,0x1b,0x00,0x29,0x00,0x2b,0xbf,0x00,0x0e,0x05,0x0d,0x00,0x21,0x00,0x09,0x04,0xfd,0x00,0x24,0x00,0x1c,0x04,0xfd,0xb3,0x13,0x27,0x13,0x03,0xb8,0x04,0xfd,0xb1,0x18,0x13,0x00,0x2f,0xdc,0xed,0x11,0x39,0x10,0xfd,\r\n0xd6,0xed,0x01,0x2f,0xed,0x31,0x30,0x03,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x25,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x69,0x2f,0x4d,0x27,0x0c,0x15,0x0b,0x24,0x77,0x4d,0x27,0x3c,0x29,0x16,0x21,0x39,0x4b,0x2a,0x20,\r\n0x3e,0x3a,0x38,0x19,0x16,0x39,0x23,0x01,0x57,0x1c,0x2b,0x1e,0x10,0x2c,0x1f,0x27,0x4e,0x20,0x1a,0x37,0x06,0xcd,0x20,0x21,0x02,0x03,0x70,0x6f,0x1b,0x2d,0x3a,0x20,0x29,0x49,0x37,0x20,0x10,0x14,0x10,0x13,0x1b,0x56,0x13,0x1e,0x25,0x13,0x22,0x27,0x46,0x53,0x0a,0x0f,0x00,0x01,0x00,0x00,0x04,0x82,0x03,0x4b,0x07,0x38,0x00,0x03,\r\n0x00,0x11,0xb6,0x03,0x01,0x00,0x2f,0x02,0x01,0x02,0x00,0x2f,0x5d,0xcd,0x01,0x2f,0xcd,0x31,0x30,0x11,0x35,0x01,0x15,0x03,0x4b,0x04,0x82,0x94,0x02,0x22,0x94,0x00,0x00,0x01,0x00,0x89,0xfe,0x0a,0x01,0x93,0xff,0xfa,0x00,0x1c,0x00,0x17,0xb9,0x00,0x03,0x05,0x0b,0xb2,0x17,0x1c,0x12,0xb9,0x04,0xfe,0x00,0x08,0x00,0x2f,0xfd,0xc4,\r\n0x01,0x2f,0xed,0x31,0x30,0x05,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x01,0x5d,0x36,0x3a,0x06,0x0c,0x19,0x0e,0x1b,0x29,0x1b,0x0e,0x0f,0x1d,0x2c,0x1d,0x27,0x39,0x24,0x11,0x14,0x2a,0x44,0x30,0x46,0x17,0x57,0x33,0x17,0x16,0x03,0x05,0x14,0x20,\r\n0x29,0x16,0x16,0x2b,0x21,0x15,0x22,0x3a,0x4c,0x2b,0x2c,0x54,0x49,0x3e,0x16,0x00,0x00,0x02,0x00,0x60,0xfd,0xff,0x01,0xa1,0xff,0x40,0x00,0x0b,0x00,0x17,0x00,0x2d,0xbf,0x00,0x03,0x05,0x0e,0x00,0x0f,0x00,0x15,0x05,0x0e,0x00,0x09,0x00,0x06,0x05,0x00,0xb4,0x2f,0x0c,0x01,0x0c,0x12,0xb8,0x05,0x00,0xb3,0x2f,0x00,0x01,0x00,0x00,\r\n0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x05,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x02,0x41,0x5e,0x5e,0x41,0x45,0x5d,0x5d,0x45,0x23,0x31,0x31,0x23,0x25,0x32,0x32,0xc0,0x5d,0x45,0x41,0x5e,0x5e,0x41,0x45,0x5d,0xf6,\r\n0x31,0x23,0x25,0x32,0x32,0x25,0x23,0x31,0x00,0x01,0x00,0x1e,0x04,0x20,0x02,0x8e,0x04,0x8d,0x00,0x03,0x00,0x10,0xb9,0x00,0x00,0x04,0xfd,0xb3,0x2f,0x03,0x01,0x03,0x00,0x2f,0x5d,0xed,0x31,0x30,0x01,0x21,0x35,0x21,0x02,0x8e,0xfd,0x90,0x02,0x70,0x04,0x20,0x6d,0x00,0x00,0x02,0x00,0x3c,0xfd,0xff,0x01,0xc5,0xff,0x67,0x00,0x03,\r\n0x00,0x07,0x00,0x21,0xbc,0x00,0x04,0x05,0x0b,0x00,0x05,0x00,0x00,0x05,0x0b,0xb2,0x01,0x04,0x00,0xb8,0x04,0xfe,0xb1,0x06,0x03,0x00,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x13,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0xb5,0x79,0x79,0x01,0x10,0x79,0x79,0xfd,0xff,0x01,0x68,0xfe,0x98,0x01,0x68,0x00,0x01,0x00,0x17,\r\n0x05,0x44,0x01,0x77,0x07,0x6e,0x00,0x0f,0x00,0x17,0xb9,0x00,0x09,0x05,0x0d,0xb2,0x0a,0x09,0x01,0xb9,0x05,0x01,0x00,0x02,0x00,0x2f,0xed,0x2f,0x01,0x2f,0xed,0x31,0x30,0x13,0x21,0x15,0x23,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x17,0x01,0x60,0xee,0x09,0x0d,0x09,0x04,0x59,0x08,0x0f,0x16,0x07,0x6e,0x66,0x2c,0x4e,0x50,\r\n0x58,0x35,0x6d,0x6a,0x3f,0x6b,0x68,0x6d,0x00,0x01,0x00,0x16,0x05,0x44,0x01,0xfa,0x07,0x6e,0x00,0x33,0x00,0x44,0xb9,0x00,0x31,0x05,0x0d,0xb2,0x2c,0x18,0x1c,0xb8,0x05,0x0d,0xb3,0x07,0x2e,0x1d,0x0a,0xb8,0x05,0x0d,0x40,0x0b,0x04,0x1c,0x18,0x02,0x0f,0x24,0x2f,0x2f,0x07,0x29,0x02,0xb8,0x05,0x01,0xb3,0x0f,0x15,0x15,0x0f,0x00,\r\n0x2f,0x33,0x2f,0x10,0xfd,0x32,0xc6,0x32,0x11,0x33,0x11,0x12,0x39,0x2f,0x01,0x2f,0xed,0x2f,0x39,0x39,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,\r\n0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x01,0x36,0x13,0x12,0x45,0x08,0x07,0x59,0x10,0x12,0x24,0x34,0x22,0x14,0x2d,0x19,0x0f,0x30,0x14,0x11,0x0f,0x01,0x06,0x06,0x59,0x07,0x0f,0x17,0x10,0x5c,0x09,0x0e,0x06,0x0f,0x0e,0x1f,0x1f,0x0f,0x58,0x0f,0x06,0x06,0xe6,0x04,0x47,0x12,0x24,0x0f,0x29,0x2b,0x20,0x39,\r\n0x2c,0x19,0x0c,0x0e,0x0d,0x0c,0x03,0x01,0x2d,0x5f,0x42,0x6d,0x6a,0x3f,0x6b,0x68,0x6d,0x41,0x26,0x42,0x20,0x04,0x27,0x21,0x23,0x21,0x23,0x28,0x10,0x20,0x00,0x01,0x00,0x30,0x05,0x44,0x01,0xd9,0x07,0x73,0x00,0x25,0x00,0x2b,0xb9,0x00,0x19,0x05,0x0b,0xb2,0x0c,0x0c,0x12,0xb8,0x05,0x0d,0xb6,0x13,0x13,0x22,0x03,0x25,0x25,0x1c,\r\n0xb8,0x05,0x01,0xb1,0x03,0x09,0x00,0x2f,0xc4,0xed,0x32,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x01,0xd9,0x1e,0x2e,0x0f,0x69,0x06,0x14,\r\n0x19,0x20,0x12,0x11,0x0f,0x09,0x0a,0x09,0x59,0x0b,0x0d,0x0b,0x42,0x2e,0x1e,0x33,0x29,0x1e,0x09,0x02,0x0b,0x17,0x10,0x07,0x6e,0x30,0x7c,0x3f,0x18,0x31,0x27,0x19,0x15,0x10,0x0d,0x27,0x46,0x6b,0x51,0x6d,0x6a,0x54,0x74,0x50,0x33,0x13,0x30,0x37,0x14,0x21,0x2b,0x17,0x21,0x35,0x1c,0x00,0x00,0x01,0x00,0x9a,0xff,0xd2,0x06,0xae,\r\n0x02,0xbd,0x00,0x42,0x00,0x4c,0xb9,0x00,0x14,0x05,0x0a,0xb2,0x2f,0x2f,0x0f,0xb8,0x05,0x0a,0xb3,0x34,0x34,0x44,0x27,0xbb,0x05,0x0a,0x00,0x20,0x00,0x0c,0x04,0xff,0xb4,0x2f,0x39,0x01,0x39,0x1b,0xb8,0x04,0xfb,0x40,0x09,0x2f,0x2c,0x01,0x2c,0x2f,0x24,0x01,0x24,0x00,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,\r\n0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,\r\n0x33,0x32,0x16,0x17,0x1e,0x05,0x06,0xae,0x16,0x41,0x63,0x4d,0x3a,0x2f,0x27,0x14,0x1a,0x2b,0x1d,0x1c,0x1f,0x12,0x15,0x12,0x29,0x48,0x60,0x6e,0x76,0x39,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0xa0,0x91,0x10,0x13,0x10,0x21,0x3a,0x4e,0x2c,0x3d,0x65,0x2a,0x12,0x1e,0x21,0x29,0x3a,0x50,0x99,0xa7,0x22,\r\n0x3a,0x4c,0x53,0x55,0x25,0x33,0x2e,0x24,0x17,0x11,0x27,0x2d,0x36,0x20,0x2e,0x4a,0x39,0x28,0x1b,0x0c,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x41,0x38,0x14,0x29,0x2b,0x31,0x1d,0x27,0x45,0x33,0x1e,0x41,0x4d,0x20,0x49,0x47,0x41,0x32,0x1d,0x00,0xff,0xff,0xff,0xa2,0x00,0x26,0x02,0xd4,0x06,0xbf,\r\n0x02,0x26,0x0f,0x65,0x00,0x00,0x01,0x06,0x09,0x37,0x00,0x8f,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x49,0x00,0x26,0x02,0xd4,0x07,0x78,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x7e,0x00,0x8f,0xff,0xff,0x00,0x72,0xfd,0xfe,0x02,0xd4,0x05,0x58,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,\r\n0x09,0x7f,0x72,0x00,0x00,0x01,0x00,0x72,0x00,0x26,0x02,0xd4,0x05,0x58,0x00,0x03,0x00,0x0c,0xb4,0x02,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xcd,0x31,0x30,0x25,0x01,0x33,0x01,0x02,0x32,0xfe,0x40,0xa6,0x01,0xbc,0x26,0x05,0x32,0xfa,0xce,0xff,0xff,0xff,0x97,0x00,0x26,0x02,0xd4,0x07,0x77,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,\r\n0x0f,0x58,0x00,0x8f,0xff,0xff,0xff,0xc2,0x00,0x26,0x02,0xd4,0x07,0x77,0x02,0x26,0x0f,0x65,0x00,0x00,0x01,0x07,0x09,0x77,0x00,0x00,0x08,0x0c,0x00,0x0a,0xb4,0x01,0x20,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x34,0xfd,0xfe,0x02,0xd4,0x05,0x58,0x02,0x26,0x0f,0x65,0x00,0x00,0x00,0x06,0x09,0x77,0x72,0x00,0xff,0xff,\r\n0x00,0x3a,0x00,0x26,0x02,0xf8,0x05,0xe9,0x02,0x26,0x0f,0x65,0xc8,0x00,0x00,0x07,0x09,0x7e,0x01,0x56,0xfe,0x00,0xff,0xff,0x00,0x17,0x00,0x26,0x03,0x7f,0x06,0xf6,0x00,0x27,0x0f,0x65,0x00,0xab,0x00,0x00,0x01,0x06,0x0f,0x5e,0x00,0x88,0x00,0x0a,0xb4,0x01,0x2f,0x04,0x01,0x04,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x16,0x00,0x26,\r\n0x03,0x7f,0x06,0xf6,0x00,0x27,0x0f,0x65,0x00,0xab,0x00,0x00,0x01,0x06,0x0f,0x5f,0x00,0x88,0x00,0x0a,0xb4,0x01,0x2f,0x17,0x01,0x17,0x00,0x11,0x5d,0x35,0x00,0x01,0xff,0xc8,0xff,0xf2,0x05,0x49,0x03,0x0f,0x00,0x37,0x00,0x4b,0xb9,0x00,0x1a,0x05,0x0a,0xb2,0x17,0x23,0x0d,0xbb,0x05,0x0a,0x00,0x0a,0x00,0x00,0x05,0x0a,0xb3,0x30,\r\n0x30,0x30,0x33,0xb8,0x04,0xff,0xb6,0x2f,0x34,0x01,0x34,0x23,0x12,0x05,0xbc,0x04,0xfb,0x00,0x28,0x05,0x03,0x00,0x1f,0x05,0x03,0xb4,0x18,0x2f,0x0b,0x01,0x0b,0x00,0x2f,0x5d,0xc6,0x3f,0x3f,0xed,0x32,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xed,0xd4,0xed,0x39,0xd4,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,\r\n0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x35,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x01,0x47,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x3e,0x26,0x40,0x2e,0x19,0x9c,0x39,0x5d,0x77,0x3f,0x5b,0x84,0x24,\r\n0x04,0x1a,0x42,0x47,0x48,0x21,0x46,0x65,0x47,0x2c,0x18,0x09,0x3a,0x70,0x39,0x17,0x57,0xb6,0x5b,0x01,0x95,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x37,0x6c,0x85,0x4a,0x19,0x36,0x45,0x23,0x2f,0x1d,0x0c,0x21,0x37,0x48,0x4e,0x50,0x23,0x13,0x05,0x03,0x9c,\r\n0x09,0x08,0x00,0x01,0xff,0xc8,0xff,0xf2,0x06,0x03,0x03,0x0f,0x00,0x44,0x00,0x5c,0xb1,0x35,0x2a,0xb8,0x05,0x0a,0xb2,0x27,0x40,0x1d,0x41,0x09,0x05,0x0a,0x00,0x1a,0x00,0x10,0x05,0x0a,0x00,0x08,0x00,0x3a,0x05,0x03,0x00,0x30,0x05,0x03,0xb7,0x28,0x2f,0x1b,0x01,0x1b,0x08,0x08,0x0b,0xb8,0x04,0xff,0x40,0x0b,0x2f,0x0c,0x01,0x0c,\r\n0x40,0x35,0x00,0x2f,0x22,0x22,0x15,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x32,0x11,0x33,0x11,0x39,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x2f,0x5d,0xc6,0x3f,0x3f,0x01,0x2f,0xed,0xd4,0xed,0x39,0xd4,0xed,0x39,0x31,0x30,0x05,0x22,0x2e,0x04,0x35,0x35,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,\r\n0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x01,0xea,0x46,0x65,0x47,0x2c,0x18,0x09,0x3a,0x70,0x39,0x17,0x57,0xb6,0x5b,0x0b,0x24,0x44,0x39,0x24,0x43,0x33,0x1f,0x9c,0x0b,0x27,0x48,0x3e,\r\n0x26,0x40,0x2e,0x19,0x9c,0x0c,0x27,0x49,0x3e,0x16,0x5d,0x70,0x1f,0x06,0x17,0x3a,0x42,0x47,0x24,0x2c,0x4f,0x42,0x34,0x12,0x04,0x1a,0x42,0x47,0x48,0x0e,0x21,0x37,0x48,0x4e,0x50,0x23,0x13,0x05,0x03,0x9c,0x09,0x08,0x64,0x41,0x5f,0x3e,0x1e,0x10,0x2a,0x48,0x38,0x01,0x0b,0xc6,0x43,0x60,0x3e,0x1e,0x0f,0x2a,0x48,0x39,0x01,0xbc,\r\n0xfe,0x8f,0x43,0x62,0x41,0x1f,0xa7,0x36,0x39,0x21,0x2a,0x1a,0x0a,0x0d,0x1c,0x2f,0x23,0x23,0x2f,0x1d,0x0c,0x00,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,\r\n0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x05,0x49,0x04,0x07,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0x03,0x04,0x07,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x50,0x01,0xf9,0x03,0x57,0x00,0x07,\r\n0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x05,0x49,0x03,0x0f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x06,0x03,0x03,0x0f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x05,0x49,0x05,0x1f,\r\n0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x54,0x01,0xf9,0xfd,0xce,0x00,0x07,0x0f,0x53,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xfd,0xc9,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x54,0x01,0xf9,0xfd,0xce,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x05,0x49,0x05,0x1f,\r\n0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x53,0x01,0xf9,0x03,0x57,0x00,0x07,0x0f,0x50,0x01,0xf9,0xfe,0xab,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,\r\n0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x1f,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0xf9,0x03,0x57,0xff,0xff,\r\n0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x1f,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0xf9,0x03,0x57,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x07,0x0d,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x27,0x0f,0x51,0x01,0xf9,0x03,0x57,0x01,0x07,0x0f,0x57,0x01,0xf9,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x3d,0x01,0x3d,0x00,\r\n0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x07,0x0d,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x27,0x0f,0x57,0x01,0xf9,0x04,0xab,0x01,0x07,0x0f,0x51,0x01,0xf9,0x03,0x57,0x00,0x0c,0xb5,0x04,0x03,0x20,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x05,0x49,0x05,0x50,0x02,0x26,0x0f,0x6c,\r\n0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xf2,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x54,0x01,0x54,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x05,0x50,0x02,0x26,0x0f,0x6d,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xf2,0xfd,0xdd,0x00,0x0a,0xb4,0x01,0x2f,0x54,0x01,0x54,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xc8,0xff,0xf2,\r\n0x05,0x49,0x04,0xb8,0x02,0x26,0x0f,0x6c,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0xf9,0xfc,0xdc,0xff,0xff,0xff,0xc8,0xff,0xf2,0x06,0x03,0x04,0xb8,0x02,0x26,0x0f,0x6d,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0xf9,0xfc,0xdc,0x00,0x02,0xff,0xc8,0xff,0xea,0x06,0xa0,0x03,0x3c,0x00,0x30,0x00,0x42,0x00,0x44,0xb9,0x00,0x0c,0x05,0x0a,0xb7,\r\n0x36,0x36,0x44,0x40,0x00,0x20,0x20,0x23,0xb8,0x04,0xff,0x40,0x09,0x2f,0x24,0x01,0x24,0x40,0x40,0x31,0x31,0x00,0xbc,0x04,0xfb,0x00,0x13,0x05,0x03,0x00,0x3b,0x04,0xfb,0xb3,0x2f,0x07,0x01,0x07,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x32,0x11,0x33,0x2f,0x2f,0x5d,0xed,0x32,0x2f,0x01,0x2f,0xcd,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x3e,\r\n0x05,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x2e,0x03,0x27,0x26,0x26,0x27,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x16,0x16,0x01,0xd4,0x18,0x4c,0x67,0x81,0x9a,0xb3,0x66,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,\r\n0x88,0x9a,0x52,0xb3,0xff,0x00,0xaf,0x68,0x1c,0x2e,0x3b,0x24,0x13,0x07,0x05,0x04,0x04,0x3c,0x68,0x36,0x17,0x42,0xae,0x5b,0x06,0x09,0x07,0x06,0x04,0x03,0x0d,0x1e,0x33,0x02,0xa7,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x9b,0x41,0x96,0x95,0x8b,0x6a,0x40,0x4b,0x80,0xab,0x60,0x5d,0x80,0x55,\r\n0x2f,0x16,0x05,0x01,0x06,0x0d,0x0c,0x14,0x35,0x3f,0x47,0x27,0x1a,0x31,0x1c,0x03,0x04,0x9c,0x06,0x07,0x21,0x3a,0x37,0x37,0x1e,0x1a,0x2c,0x20,0x13,0x0a,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x00,0x02,0xff,0xc8,0xff,0xea,0x07,0x59,0x03,0x3c,0x00,0x39,0x00,0x4b,0x00,0x50,0xb9,0x00,0x05,0x05,\r\n0x0a,0x40,0x09,0x47,0x47,0x0b,0x3f,0x33,0x0b,0x22,0x22,0x25,0xb8,0x04,0xff,0xb4,0x2f,0x26,0x01,0x26,0x15,0xb8,0x05,0x03,0xb6,0x42,0x3f,0x3f,0x33,0x33,0x10,0x0a,0xbc,0x04,0xfb,0x00,0x0b,0x05,0x03,0x00,0x3a,0x04,0xfb,0xb3,0x2f,0x00,0x01,0x00,0x00,0x2f,0x5d,0xed,0x3f,0xed,0x39,0x32,0x2f,0x33,0x2f,0x33,0x3f,0x2f,0x5d,0xed,\r\n0x32,0x2f,0x01,0x2f,0x2f,0xcd,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x2e,0x03,0x27,0x26,0x26,0x27,0x26,0x26,0x23,0x37,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x17,0x3e,0x05,0x17,0x22,0x0e,0x02,0x07,0x16,0x16,0x33,0x32,\r\n0x3e,0x02,0x35,0x34,0x2e,0x02,0x04,0xd3,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x70,0x89,0x9d,0x54,0xb3,0xff,0x00,0xaf,0x68,0x1c,0x2e,0x3b,0x24,0x13,0x07,0x05,0x04,0x04,0x3c,0x68,0x36,0x17,0x42,0xae,0x5b,0x06,0x09,0x07,0x06,0x04,0x03,0x0d,0x1e,0x33,0x29,0x18,0x4c,0x67,0x81,0x9a,\r\n0xb3,0x4c,0x6e,0xbc,0x97,0x6e,0x1f,0x5c,0xee,0x9d,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x03,0x3c,0x49,0x7d,0xa4,0x5b,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,0x06,0x01,0x06,0x0d,0x0c,0x14,0x35,0x3f,0x47,0x27,0x1a,0x31,0x1c,0x03,0x04,0x9c,0x06,0x07,0x21,0x3a,0x37,0x37,0x1e,0x1a,0x2c,0x20,0x13,0x02,0x41,0x96,0x95,\r\n0x8b,0x6a,0x40,0xa9,0x5c,0x92,0xb5,0x5a,0x02,0x01,0x0a,0x27,0x4f,0x45,0x56,0x78,0x4b,0x22,0xff,0xff,0xff,0xc8,0xff,0xea,0x06,0xa0,0x04,0xb2,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xff,0xea,0x07,0x59,0x04,0xb2,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x73,\r\n0x04,0x02,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0xa0,0x03,0x3c,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xdb,0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x07,0x59,0x03,0x3c,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x51,0x02,0xdb,0xfe,0xab,0xff,0xff,0xff,0xc8,0xff,0xea,0x06,0xa0,0x05,0xca,0x02,0x26,0x0f,0x82,\r\n0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xff,0xea,0x07,0x59,0x05,0xca,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x07,0x0f,0x53,0x02,0x73,0x04,0x02,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x06,0xa0,0x04,0xb2,0x02,0x26,0x0f,0x82,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x73,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xe5,\r\n0xfe,0xab,0xff,0xff,0xff,0xc8,0xfe,0xa6,0x07,0x59,0x04,0xb2,0x02,0x26,0x0f,0x83,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x73,0x04,0x02,0x00,0x07,0x0f,0x50,0x02,0xe5,0xfe,0xab,0x00,0x01,0xfd,0xa6,0xff,0xea,0x01,0x47,0x05,0xec,0x00,0x15,0x00,0x1a,0xbf,0x00,0x0b,0x05,0x0a,0x00,0x08,0x00,0x03,0x04,0xfb,0x00,0x12,0x05,0x03,0x00,\r\n0x0a,0x00,0x2f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x26,0x27,0xfd,0xa6,0x7f,0xe1,0x6d,0x4f,0x75,0x4e,0x26,0x9c,0x23,0x3f,0x5a,0x6e,0x81,0x46,0x61,0xcb,0x64,0xa8,0x0f,0x09,0x06,0x25,0x4f,0x49,0x04,0x99,0xfb,0x60,0x56,0x77,0x4f,0x2c,0x15,0x05,\r\n0x0a,0x0e,0x00,0x01,0xfd,0xa6,0xff,0xea,0x02,0x01,0x05,0xec,0x00,0x1e,0x00,0x29,0xb1,0x16,0x0b,0xb8,0x05,0x0a,0xb5,0x08,0x16,0x1b,0x10,0x10,0x03,0xbd,0x04,0xfb,0x00,0x1b,0x05,0x03,0x00,0x11,0x05,0x03,0x00,0x0a,0x00,0x2f,0x3f,0x3f,0xed,0x32,0x2f,0x11,0x39,0x01,0x2f,0xed,0x39,0x31,0x30,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,\r\n0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0xfd,0xa6,0x7f,0xe1,0x6d,0x4f,0x75,0x4e,0x26,0x9c,0x0f,0x2a,0x48,0x39,0x16,0x5a,0x6d,0x1e,0x04,0x1d,0x56,0x6d,0x82,0x4a,0x61,0xcb,0x64,0xa8,0x0f,0x09,0x06,0x25,0x4f,0x49,0x04,0x99,0xfb,0xac,0x47,0x62,0x3c,0x1a,0xa7,0x3b,\r\n0x3c,0x2d,0x33,0x19,0x06,0x0a,0x0e,0x00,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x1a,0x08,0x0e,0x02,0x26,0x0f,0x8c,0x00,0x00,0x00,0x06,0x0a,0x6d,0xf2,0x32,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x1a,0x08,0x0e,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x06,0x0a,0x6d,0xf2,0x32,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0x4f,0x07,0x67,0x02,0x26,\r\n0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x50,0xff,0xf2,0x06,0xb7,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x01,0x07,0x67,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x50,0xff,0xf2,0x06,0xb7,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0xf0,0x08,0x7f,0x02,0x26,0x0f,0x8c,0x00,0x00,0x01,0x07,0x0f,0x53,0xff,0xf2,0x06,0xb7,0x00,0x0e,0xb6,0x03,\r\n0x02,0x01,0x20,0x18,0x01,0x18,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xfd,0xa6,0xff,0xea,0x02,0x01,0x08,0x7f,0x02,0x26,0x0f,0x8d,0x00,0x00,0x01,0x07,0x0f,0x53,0xff,0xf2,0x06,0xb7,0x00,0x0e,0xb6,0x03,0x02,0x01,0x20,0x29,0x01,0x29,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0xfd,0xa6,0xfd,0xc9,0x01,0xf0,0x05,0xec,0x02,0x26,\r\n0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x54,0xff,0xf2,0xfd,0xce,0xff,0xff,0xfd,0xa6,0xfd,0xc9,0x02,0x01,0x05,0xec,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x54,0xff,0xf2,0xfd,0xce,0xff,0xff,0xfd,0xa6,0xff,0xea,0x01,0xfb,0x05,0xec,0x02,0x26,0x0f,0x8c,0x00,0x00,0x00,0x07,0x0f,0x5c,0xff,0x6d,0x00,0x00,0xff,0xff,0xfd,0xa6,\r\n0xff,0xea,0x02,0x01,0x05,0xec,0x02,0x26,0x0f,0x8d,0x00,0x00,0x00,0x07,0x0f,0x5c,0xff,0x6d,0x00,0x00,0x00,0x01,0x00,0x39,0xfd,0xff,0x03,0x72,0x02,0x0a,0x00,0x22,0x00,0x2c,0xbc,0x00,0x0b,0x05,0x0a,0x00,0x1b,0x00,0x16,0x04,0xfb,0x40,0x09,0x1f,0x10,0x2f,0x10,0x02,0x10,0x08,0x08,0x06,0xb8,0x04,0xff,0xb3,0x2f,0x00,0x01,0x00,\r\n0x00,0x2f,0x5d,0xed,0x32,0x2f,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x3e,0x03,0x03,0x35,0x1d,0x20,0x28,0x2c,0x3c,0x30,0x11,0x14,0x44,0x79,0xa7,0x62,0x33,0x6c,0x39,0x7c,0x59,\r\n0x55,0x74,0x45,0x1e,0x2d,0x20,0x2a,0x5b,0x57,0x4e,0x02,0x0a,0x2f,0x1d,0x1e,0x32,0x03,0x52,0x9c,0x46,0x8a,0xd4,0x90,0x4a,0x16,0x17,0xa5,0x27,0x3d,0x6c,0x92,0x56,0x76,0xda,0x67,0x06,0x09,0x06,0x03,0x00,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0c,0x03,0x57,\r\n0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0xb9,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x57,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xaf,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0a,0x6d,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,\r\n0x00,0x07,0x0f,0x5b,0x01,0xc9,0x00,0x00,0xff,0xff,0x00,0x39,0xfd,0xfb,0x03,0x88,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x50,0x02,0x2b,0xfe,0x00,0xff,0xff,0x00,0x39,0xfd,0xe1,0x04,0x6a,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x01,0x07,0x0a,0x6d,0x02,0x42,0xf7,0x65,0x00,0x0a,0xb4,0x01,0x2f,0x27,0x01,0x27,\r\n0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x39,0xfd,0xfb,0x03,0x88,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0x2b,0xfe,0x00,0x00,0x07,0x0f,0x50,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0x07,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,\r\n0xfd,0xff,0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x56,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xaf,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0a,0x6e,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x87,0x02,0x0a,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x5c,\r\n0x00,0xf9,0xfc,0x4f,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x52,0x01,0x0c,0x03,0x57,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x04,0xbc,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x09,0x7e,0x01,0x0c,0xfc,0xd3,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x07,0x0d,0x02,0x26,\r\n0x0f,0x98,0x00,0x00,0x00,0x27,0x0f,0x51,0x01,0x0c,0x03,0x57,0x01,0x07,0x0f,0x57,0x01,0x0c,0x04,0xab,0x00,0x0c,0xb5,0x02,0x01,0x20,0x24,0x01,0x24,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x82,0xff,0x02,0x05,0x74,0x04,0x21,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x09,0x7e,0x00,0x39,0xfc,0x38,0x00,0x0a,0xb4,0x01,0x2f,0x4d,\r\n0x01,0x4d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0x2c,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0a,0x6e,0x02,0x01,0xfc,0x50,0x00,0x0a,0xb4,0x01,0x2f,0x3d,0x01,0x3d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x03,0xb9,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x51,0x01,0xdc,\r\n0x03,0x09,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xd1,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0xdc,0x03,0x09,0x00,0x01,0x00,0x9a,0xff,0x02,0x05,0x74,0x02,0x0a,0x00,0x36,0x00,0x41,0xb9,0x00,0x0a,0x05,0x0a,0xb2,0x25,0x25,0x05,0xb8,0x05,0x0a,0xb3,0x2c,0x2c,0x38,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x00,\r\n0x04,0xff,0xb4,0x2f,0x31,0x01,0x31,0x11,0xb8,0x04,0xfb,0xb7,0x2f,0x22,0x01,0x22,0x2f,0x1a,0x01,0x1a,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,\r\n0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x20,0x3b,0x43,0x21,0x08,0x22,0x29,0x22,0x2e,0x51,0x6e,0x7d,0x88,0x43,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x20,0x5b,0xa2,0x83,0xbc,0xb9,0x10,0x18,0x1b,0x18,0x10,0x29,0x54,0x81,0x58,0x1d,0x20,0x28,0x01,\r\n0x6e,0x13,0x1b,0x1e,0x0b,0x22,0x2a,0x2c,0x3b,0x33,0x39,0x5a,0x43,0x2f,0x1d,0x0d,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6e,0x40,0x4a,0x7c,0x5b,0x33,0x48,0x3d,0x13,0x1d,0x1b,0x1e,0x26,0x33,0x23,0x37,0x5b,0x40,0x23,0x2f,0x1d,0x1e,0x32,0x00,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x05,0x74,0x02,0x0a,0x02,0x26,0x0f,0xab,0x00,0x00,\r\n0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0xdd,0x05,0x3e,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x09,0x7e,0x04,0x3b,0xfd,0x55,0x00,0x01,0x00,0x1e,0xff,0x02,0x06,0x1f,0x02,0x0a,0x00,0x38,0x00,0x58,0xb9,0x00,0x1d,0x05,0x0a,0xb5,0x2d,0x2d,0x16,0x0b,0x05,0x32,0xb8,0x05,0x0a,0xb3,0x16,0x16,\r\n0x3a,0x0e,0xb8,0x05,0x0a,0x40,0x0d,0x05,0x08,0x08,0x05,0x09,0x0a,0x0a,0x0b,0x0b,0x22,0x08,0x08,0x28,0xb8,0x04,0xff,0xb4,0x2f,0x22,0x01,0x22,0x00,0xb8,0x04,0xfb,0xb3,0x2f,0x13,0x01,0x13,0x00,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x11,0x39,\r\n0x11,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x35,0x25,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x03,0x5c,0x98,0xcc,0x7d,0x35,0x04,0x04,0xfe,0xd0,0x01,0xe3,\r\n0x0e,0x12,0x24,0x5d,0xa2,0x7e,0xbc,0xb9,0x10,0x18,0x1b,0x18,0x10,0x29,0x54,0x81,0x58,0x1d,0x20,0x28,0x2c,0x3b,0x43,0x21,0x08,0x22,0x29,0x22,0x2e,0x51,0x6e,0x7d,0x88,0xfe,0x4b,0x81,0xad,0x63,0x1f,0x49,0x23,0x39,0x72,0x5f,0x49,0x79,0x3f,0x4d,0x7d,0x5a,0x31,0x48,0x3d,0x13,0x1d,0x1b,0x1e,0x26,0x33,0x23,0x37,0x5b,0x40,0x23,\r\n0x2f,0x1d,0x1e,0x32,0x13,0x1b,0x1e,0x0b,0x22,0x2a,0x2c,0x3b,0x33,0x39,0x5a,0x43,0x2f,0x1d,0x0d,0x00,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0x2c,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0a,0x6d,0x02,0x01,0xfc,0x50,0xff,0xff,0x00,0x9a,0xfd,0xc4,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,0x00,0x07,0x0f,0x54,\r\n0x01,0xc8,0xfd,0xc9,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xdf,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x37,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x04,0xdf,0x02,0x26,0x0f,0xab,0x00,0x00,0x01,0x07,0x0f,0x5f,\r\n0x00,0xa1,0xfd,0x71,0x00,0x0e,0xb7,0x01,0x2f,0x37,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0x78,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,0x01,0x07,0x0f,0x60,0x01,0xc8,0xf8,0x34,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0x00,0x01,0x00,0x9a,0xff,0xd2,0x05,0x74,\r\n0x02,0xbd,0x00,0x32,0x00,0x41,0xb9,0x00,0x0a,0x05,0x0a,0xb2,0x25,0x25,0x05,0xb8,0x05,0x0a,0xb3,0x2a,0x2a,0x34,0x1d,0xbb,0x05,0x0a,0x00,0x16,0x00,0x00,0x04,0xff,0xb4,0x2f,0x2d,0x01,0x2d,0x11,0xb8,0x04,0xfb,0xb7,0x2f,0x22,0x01,0x22,0x2f,0x1a,0x01,0x1a,0x00,0x2f,0x5d,0x2f,0x5d,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x12,0x39,\r\n0x2f,0xed,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x20,0x38,0x40,0x1f,0x07,0x0c,0x0f,0x0d,0x29,0x47,0x60,0x70,0x7b,\r\n0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x20,0x5b,0xa2,0x83,0xa9,0x96,0x0e,0x12,0x0e,0xae,0xa1,0x1d,0x20,0x28,0x01,0x6e,0x0a,0x10,0x12,0x07,0x0c,0x15,0x19,0x20,0x17,0x2d,0x48,0x37,0x27,0x19,0x0c,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6e,0x40,0x4a,0x7c,0x5b,0x33,0x30,0x29,0x0e,0x1a,0x1c,0x21,0x17,0x59,0x61,\r\n0x2f,0x1d,0x1e,0x32,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,0xed,0x31,0x30,0x05,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,\r\n0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x21,0x04,0xad,0xfd,0xf2,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,0x02,0x09,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,\r\n0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0x00,0x01,0x00,0x72,0xfe,0x28,0x06,0xe5,0x00,0x99,0x00,0x25,0x00,0x23,0xbc,0x00,0x06,0x05,0x0a,0x00,0x1d,0x00,0x0b,0x04,0xfb,0xb4,0x2f,0x16,0x01,0x16,0x24,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0xed,0x01,0x2f,\r\n0xed,0x31,0x30,0x05,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,0x04,0x33,0x21,0x06,0xae,0xfb,0xf1,0x43,0x8e,0x75,0x4b,0x45,0x93,0xe5,0xa1,0x7b,0xf4,0xe5,0xcf,0x56,0x72,0xf9,0xf0,0xda,0x54,0x93,0xe1,0xa6,0x70,0x43,0x1d,0x3d,0x63,0x7c,0x7d,0x72,0x27,\r\n0x04,0x0a,0x0e,0x04,0x19,0x37,0x32,0x2e,0x3c,0x23,0x0e,0x07,0x0c,0x10,0x09,0xa5,0x0c,0x12,0x0c,0x06,0x12,0x24,0x35,0x45,0x55,0x32,0x4a,0x69,0x45,0x28,0x15,0x05,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x3d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,\r\n0x03,0x3d,0x02,0x26,0x0f,0xb6,0x00,0x00,0x00,0x07,0x09,0x7e,0x00,0xab,0xfb,0x54,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,\r\n0x0f,0xb6,0x00,0x00,0x01,0x07,0x0f,0x5e,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x26,0x01,0x26,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb5,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x72,\r\n0xfe,0x28,0x06,0xe5,0x03,0x6d,0x02,0x26,0x0f,0xb6,0x00,0x00,0x01,0x07,0x0f,0x5f,0x00,0xab,0xfb,0xff,0x00,0x0a,0xb4,0x01,0x2f,0x37,0x01,0x37,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x05,0x74,0x02,0x0a,0x02,0x06,0x0f,0xab,0x00,0x00,0xff,0xff,0x00,0x9a,0xfd,0xc4,0x05,0x74,0x02,0xbd,0x02,0x26,0x0f,0xb4,0x00,0x00,\r\n0x00,0x07,0x0f,0x52,0x01,0xc8,0xfd,0xc9,0xff,0xff,0x00,0x9a,0xfe,0x0e,0x05,0x74,0x02,0x0a,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x07,0x0f,0x5b,0x02,0x01,0x00,0x0f,0x00,0x01,0xff,0xf1,0xff,0xf2,0x01,0x47,0x05,0x7e,0x00,0x0d,0x00,0x1a,0xbf,0x00,0x08,0x05,0x0a,0x00,0x05,0x00,0x00,0x04,0xfb,0x00,0x0d,0x05,0x03,0x00,0x07,0x00,\r\n0x2f,0x3f,0xed,0x01,0x2f,0xed,0x31,0x30,0x27,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x09,0x25,0x42,0x31,0x1c,0x9c,0x3c,0x61,0x7b,0x3e,0x99,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfb,0xce,0x65,0x86,0x4f,0x20,0x00,0x00,0x01,0xff,0xea,0xff,0xf2,0x02,0x24,0x04,0xe8,0x00,0x1c,0x00,0x22,0xb9,0x00,0x00,0x05,0x0a,0xb5,\r\n0x1a,0x10,0x0d,0x1c,0x15,0x05,0xbb,0x04,0xfb,0x00,0x14,0x00,0x0d,0x05,0x03,0x00,0x3f,0x33,0xed,0x32,0x2f,0x12,0x39,0x01,0x2f,0xed,0x31,0x30,0x01,0x14,0x1e,0x02,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x47,0x0c,0x26,0x46,0x39,0x16,0x16,0x06,0x0d,\r\n0x13,0x0c,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x0a,0x1c,0x41,0x36,0x24,0x9c,0x01,0x8c,0x3b,0x5a,0x3e,0x20,0x31,0x1f,0x10,0x1f,0x19,0x0f,0x40,0x3b,0x3f,0x3c,0xa7,0x13,0x2c,0x47,0x34,0x03,0x95,0x00,0x02,0x00,0xa1,0xff,0xf2,0x04,0x25,0x03,0xd7,0x00,0x21,0x00,0x2f,0x00,0x48,0xb9,0x00,0x15,0x05,0x0a,0xb5,0x12,0x05,0x2a,0x2a,\r\n0x31,0x22,0xbb,0x05,0x0a,0x00,0x0d,0x00,0x2b,0x04,0xfc,0xb2,0x12,0x14,0x2a,0xb8,0x04,0xfc,0x40,0x0a,0x15,0x14,0x05,0x05,0x00,0x2f,0x14,0x01,0x14,0x1a,0xba,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0x5d,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xdd,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x31,0x30,0x05,0x22,\r\n0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x03,0xec,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x17,0x18,0x07,\r\n0x0e,0x16,0xfd,0x3d,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x0e,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x31,0x1e,0x10,0x20,0x19,0x0f,0x01,0xea,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0xff,0xff,0x00,0x39,0xfd,0xff,\r\n0x03,0x72,0x05,0x1f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,0x0f,0x53,0x01,0x0c,0x03,0x57,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0x77,0x05,0xb2,0x00,0x23,0x00,0x65,0x40,0x38,0x82,0x16,0x01,0x76,0x0a,0x01,0x63,0x09,0x01,0x6a,0x07,0x7a,0x07,0x02,0x1a,0x1d,0x1f,0x18,0x1b,0x7e,0x01,0x00,0x03,0x22,0x05,0x01,0x01,0x25,0x0e,0x0c,\r\n0x7e,0x0f,0x11,0x0e,0x0f,0x1f,0x22,0x91,0x01,0x1c,0x02,0x05,0x18,0x91,0x1b,0x02,0x0f,0x02,0x0f,0x02,0x20,0x12,0x08,0x91,0x15,0x04,0x00,0x3f,0xed,0x3f,0x39,0x39,0x2f,0x2f,0x10,0xc4,0xfd,0xc4,0x10,0xdd,0xc4,0xfd,0xc4,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xc4,0xc4,0xde,0xc4,0x10,0xfd,0xc4,0xc4,0xde,0xc4,0x31,\r\n0x30,0x5d,0x5d,0x5d,0x5d,0x01,0x33,0x35,0x23,0x35,0x33,0x35,0x10,0x21,0x22,0x07,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x02,0x52,0xbe,0xbe,0xbe,0xff,0x00,0x8a,0x44,0x36,0x22,0x96,0x34,0x66,0x71,0xd5,0x01,0xa8,0xbf,0xbf,0xbf,0xbf,0xa8,\r\n0xbe,0x02,0x33,0x6e,0x84,0xbb,0x01,0x48,0x6c,0x56,0x83,0x64,0x4e,0x46,0x6a,0x8e,0xc9,0x7c,0x8a,0xfe,0x34,0xc1,0x84,0x6e,0x84,0xfe,0x51,0x01,0xaf,0x00,0x00,0x01,0x00,0x65,0xff,0xe8,0x04,0xb6,0x05,0xb2,0x00,0x31,0x00,0xed,0x40,0xa0,0x6a,0x31,0x7a,0x31,0x8a,0x31,0x03,0x7a,0x30,0x01,0x68,0x30,0x01,0x08,0x2c,0x01,0x8c,0x2b,\r\n0x01,0x6b,0x2b,0x7b,0x2b,0x02,0x56,0x24,0x01,0x56,0x23,0x01,0x37,0x23,0x01,0x57,0x20,0x01,0x88,0x19,0x01,0x49,0x19,0x01,0x8b,0x18,0x01,0x4a,0x18,0x01,0x86,0x17,0x01,0x77,0x17,0x01,0x83,0x16,0x93,0x16,0x02,0x61,0x16,0x71,0x16,0x02,0x07,0x16,0x01,0x85,0x13,0x95,0x13,0x02,0x76,0x13,0x01,0x07,0x13,0x01,0x95,0x12,0x01,0x86,\r\n0x12,0x01,0x65,0x12,0x75,0x12,0x02,0x76,0x01,0x01,0x65,0x01,0x01,0x28,0x2a,0x7d,0x27,0x25,0x25,0x08,0x1b,0x1f,0x17,0x7d,0x04,0x00,0x00,0x08,0x01,0x08,0x08,0x33,0x1f,0x7d,0x00,0x0e,0x0c,0x7d,0x0f,0x11,0x11,0x0f,0x00,0x01,0x00,0x00,0x28,0x10,0x28,0x02,0x28,0x28,0x1b,0x21,0x0f,0x0f,0x04,0x0a,0x25,0x04,0x01,0x04,0x15,0x21,\r\n0x91,0x3a,0x1b,0x01,0x29,0x1b,0x01,0x1b,0x2e,0x13,0x0a,0x91,0x15,0x04,0x00,0x3f,0xed,0x3f,0x39,0x5d,0x5d,0xed,0x11,0x39,0x5d,0x11,0x12,0x39,0x2f,0x11,0x12,0x39,0x2f,0x5d,0x01,0x2f,0x5d,0x33,0x2f,0x33,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x5d,0x12,0x39,0xed,0x11,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,0x00,0x5d,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x37,0x36,0x37,0x36,0x37,0x36,0x35,0x34,0x21,0x20,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x37,0x36,0x33,0x20,0x11,0x14,0x07,0x06,0x07,0x06,0x07,0x06,0x15,0x10,0x21,0x32,0x37,0x36,0x35,0x34,\r\n0x27,0x33,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x65,0xa9,0x73,0xee,0xaa,0x48,0x80,0xfe,0xb8,0xfe,0xbe,0x08,0xae,0x0a,0xa1,0x84,0xcb,0x01,0xfa,0xaf,0x70,0xf5,0xa5,0x49,0x7a,0x01,0x71,0x9c,0x62,0x81,0x12,0xb4,0x0f,0xb3,0x93,0xe8,0xec,0x8c,0xab,0x01,0x85,0xcc,0x6b,0x48,0x2b,0x1e,0x26,0x42,0x85,0xe0,0xd2,0x2b,0x45,\r\n0x4b,0x25,0xbd,0x5f,0x4e,0xfe,0x88,0xcc,0x68,0x43,0x2e,0x1f,0x28,0x44,0x85,0xfe,0xfa,0x32,0x42,0x8e,0x42,0x43,0x40,0x43,0xd9,0x6b,0x57,0x56,0x6a,0x00,0x00,0x01,0x00,0x21,0x00,0x00,0x04,0x64,0x05,0x9a,0x00,0x09,0x00,0x95,0x40,0x0d,0x7c,0x06,0x01,0x74,0x01,0x01,0x01,0x20,0x0b,0x0d,0x01,0x4c,0x06,0xb8,0xff,0xe0,0x40,0x29,\r\n0x0b,0x0d,0x01,0x4c,0x15,0x00,0x25,0x00,0x02,0x03,0x00,0x01,0xe3,0x00,0xf3,0x00,0x02,0x1a,0x05,0x2a,0x05,0x02,0x0c,0x05,0x01,0xec,0x05,0xfc,0x05,0x02,0x05,0x01,0x91,0x04,0x12,0x00,0x07,0x91,0x08,0x03,0x06,0xb8,0xff,0xf8,0x40,0x09,0x0d,0x06,0x4d,0x01,0x08,0x0d,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x09,0x0c,0x06,0x4d,0x01,\r\n0x0c,0x0c,0x06,0x4d,0x06,0xb8,0xff,0xf4,0x40,0x14,0x0b,0x06,0x4d,0x01,0x0c,0x0b,0x06,0x4d,0x03,0x07,0x07,0x01,0x06,0x03,0x04,0x04,0x00,0x00,0x0b,0x04,0x2f,0x12,0x39,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2b,0x2b,0x2b,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x39,0x3f,0xed,0x39,0x31,0x30,0x5d,0x71,0x71,0x5d,0x71,0x71,0x01,0x2b,0x2b,0x5d,\r\n0x5d,0x01,0x01,0x21,0x15,0x21,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xb8,0x03,0x34,0xfb,0xd1,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x26,0x98,0x2f,0x04,0xd3,0x98,0x00,0x01,0x00,0x5f,0xff,0xe8,0x03,0xf0,0x06,0x02,0x00,0x2f,0x00,0xc5,0x40,0x82,0x7a,0x2f,0x01,0x79,0x2e,0x01,0x08,0x2e,0x18,0x2e,0x02,0x86,0x27,0x01,\r\n0x24,0x27,0x01,0x26,0x26,0x46,0x26,0x02,0x85,0x23,0x01,0x56,0x23,0x01,0x79,0x21,0x01,0x79,0x1e,0x01,0x87,0x1a,0x97,0x1a,0x02,0x96,0x19,0x01,0x85,0x19,0x01,0x07,0x19,0x01,0x95,0x15,0x01,0x06,0x15,0x86,0x15,0x02,0x86,0x14,0x01,0x79,0x12,0x01,0x3b,0x12,0x01,0x38,0x11,0x01,0x9a,0x0e,0x01,0x65,0x0b,0x01,0x57,0x0b,0x01,0x57,\r\n0x07,0x67,0x07,0x02,0x25,0x22,0x28,0x83,0x10,0x0d,0x0d,0x13,0x31,0x1b,0x84,0x1c,0x22,0x83,0x13,0x05,0x84,0x00,0x00,0x13,0x03,0x02,0x02,0x09,0x10,0x98,0x10,0x01,0x6a,0x10,0x01,0x10,0x20,0x2c,0x1b,0x1b,0x25,0x20,0x25,0x17,0x09,0x95,0x2c,0x16,0x20,0x95,0x17,0x01,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x11,0x12,0x39,0x2f,0x11,\r\n0x12,0x39,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x2f,0xed,0x11,0x12,0x39,0x2f,0x39,0xed,0x11,0x39,0x31,0x30,0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x13,0x34,0x37,0x17,0x06,0x15,0x14,0x17,0x16,0x33,0x32,\r\n0x37,0x36,0x35,0x34,0x27,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x16,0x15,0x23,0x34,0x27,0x26,0x23,0x20,0x15,0x14,0x17,0x16,0x17,0x16,0x15,0x14,0x07,0x06,0x23,0x22,0x27,0x26,0x5f,0x28,0x9a,0x1c,0x55,0x4e,0x68,0x88,0x55,0x5b,0xbc,0xae,0xae,0xbc,0x7c,0x77,0xba,0xab,0x73,0x7f,0xa6,0x4b,0x44,0x68,0xfe,0xfb,0xbc,\r\n0xae,0xae,0xbc,0x8e,0x85,0xcf,0xaa,0x7d,0x88,0x01,0x5c,0x5e,0x51,0x37,0x33,0x49,0x68,0x42,0x3c,0x4c,0x50,0x95,0xaa,0x57,0x4b,0x4b,0x72,0xe5,0xae,0x63,0x60,0x57,0x61,0xa8,0x68,0x39,0x34,0xfb,0x8a,0x58,0x4e,0x4d,0x76,0xd7,0xdc,0x7b,0x73,0x61,0x6a,0x00,0x00,0x02,0x00,0x0a,0xff,0xe8,0x04,0x52,0x04,0x54,0x00,0x35,0x00,0x49,\r\n0x00,0x8c,0x40,0x5b,0x49,0x47,0x59,0x47,0x69,0x47,0x03,0x65,0x43,0x01,0x46,0x43,0x56,0x43,0x02,0x64,0x3d,0x01,0x9c,0x09,0x01,0x7a,0x08,0x01,0x8f,0x0a,0x9f,0x0a,0x02,0x7e,0x0a,0x01,0x6f,0x0a,0x01,0x87,0x3b,0x01,0x92,0x2c,0x01,0x81,0x2c,0x01,0x63,0x2c,0x73,0x2c,0x02,0x2c,0x1b,0x3b,0x0a,0x04,0x05,0x24,0x24,0x31,0x83,0x30,\r\n0x36,0x01,0x36,0x36,0x4b,0x40,0x83,0x05,0x12,0x12,0x05,0x13,0x18,0x95,0x12,0x0a,0x0d,0x0d,0x3b,0x2c,0x24,0x29,0x95,0x23,0x1b,0x1e,0x10,0x45,0x95,0x00,0x16,0x00,0x3f,0xed,0x3f,0x33,0x33,0xed,0x32,0x32,0x32,0x32,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0x5d,0xed,0x32,0x2f,0x11,0x17,0x39,0x5d,\r\n0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x31,0x30,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0x07,0x35,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x17,0x15,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x13,\r\n0x34,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x4c,0x6c,0xad,0x7b,0x42,0x22,0x4f,0x81,0x5f,0x30,0x69,0x3b,0x33,0x55,0x1f,0x24,0x1e,0x1b,0x22,0x1d,0x51,0x33,0x89,0xda,0x57,0x34,0x72,0x40,0x30,0x4b,0x1a,0x1f,0x16,0x1a,0x21,0x1c,0x4e,0x30,0x0c,0x16,0x0b,0x39,0x50,0x32,0x17,0x42,0x7b,0xad,0xc2,\r\n0x1d,0x3d,0x5d,0x3f,0x59,0x86,0x5a,0x2d,0x26,0x4b,0x72,0x4b,0x4b,0x72,0x4b,0x26,0x18,0x40,0x7a,0xae,0x6e,0x33,0x84,0x89,0x81,0x30,0x0d,0x0e,0x09,0x05,0x06,0x07,0x97,0x03,0x04,0x02,0x05,0x31,0x2a,0x0b,0x0b,0x03,0x02,0x03,0x02,0x92,0x05,0x04,0x03,0x06,0x01,0x01,0x35,0x77,0x77,0x72,0x30,0x6e,0xae,0x7a,0x40,0x01,0xd6,0x32,\r\n0x70,0x6e,0x66,0x29,0x1e,0x61,0x72,0x78,0x36,0x4c,0x7b,0x56,0x2f,0x2f,0x56,0x7b,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x17,0x00,0x83,0x40,0x1f,0x19,0x40,0x0b,0x02,0x4d,0x12,0x95,0x00,0x16,0x0c,0x95,0x06,0x10,0x09,0x06,0x0d,0x06,0x4d,0x09,0x06,0x0c,0x06,0x4d,0x09,0x06,0x0b,0x06,0x4d,0x09,0x83,\r\n0x15,0xb8,0xff,0xf0,0xb3,0x0d,0x06,0x4d,0x15,0xb8,0xff,0xf0,0x40,0x09,0x0c,0x06,0x4d,0x20,0x15,0x30,0x15,0x02,0x15,0xb8,0xff,0xde,0x40,0x2a,0x0b,0x06,0x4d,0x15,0x15,0x19,0x0f,0x08,0x0d,0x06,0x4d,0x0f,0x0a,0x0c,0x06,0x4d,0x0f,0x06,0x0b,0x06,0x4d,0x0f,0x83,0x03,0x10,0x0d,0x06,0x4d,0x03,0x0c,0x0c,0x06,0x4d,0x03,0x19,0x0b,\r\n0x06,0x4d,0x03,0x2f,0x19,0x01,0x5d,0x2f,0x2b,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x12,0x39,0x2f,0x2b,0x5d,0x2b,0x2b,0xe9,0x2b,0x2b,0x2b,0x00,0x3f,0xed,0x3f,0xed,0x31,0x30,0x01,0x2b,0x05,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x52,0xe3,0xfe,0xf1,\r\n0x01,0x1a,0xf0,0xe5,0x01,0x01,0xfe,0xeb,0xdd,0x9e,0xb8,0xba,0x9c,0x9f,0xab,0xab,0x18,0x01,0x1f,0xed,0x01,0x02,0x01,0x22,0xfe,0xe6,0xfa,0xf5,0xfe,0xd9,0x03,0xa6,0xd7,0xbd,0xb6,0xd2,0xce,0xbe,0xc0,0xd0,0x00,0x01,0xff,0xe6,0xfe,0x1e,0x04,0x10,0x04,0x18,0x00,0x3f,0x00,0x91,0x40,0x58,0x75,0x35,0x85,0x35,0x02,0x09,0x2d,0x01,\r\n0x05,0x28,0x15,0x28,0x02,0x6a,0x1d,0x01,0x99,0x0a,0x01,0x99,0x05,0x01,0x00,0x02,0x83,0x3f,0x3d,0x3d,0x17,0x30,0x2f,0x33,0x2a,0x83,0x11,0x12,0x0c,0x17,0x17,0x41,0x33,0x83,0x0c,0x1f,0x84,0x20,0x20,0x0c,0x3f,0x00,0x00,0x30,0x38,0x09,0x2f,0x49,0x2f,0x59,0x2f,0x03,0x7a,0x30,0x01,0x28,0x30,0x01,0x2f,0x30,0x07,0x20,0x20,0x12,\r\n0x1a,0x95,0x16,0x12,0x01,0x35,0x11,0x01,0x12,0x11,0x25,0x10,0x38,0x95,0x07,0x1c,0x00,0x3f,0xed,0x3f,0x39,0x39,0x5d,0x5d,0xed,0x11,0x39,0x2f,0x11,0x39,0x39,0x5d,0x5d,0x5d,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0x33,0x2f,0xed,0x10,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x11,0x39,0x39,0x11,0x33,0x2f,0x33,0xed,0x32,0x31,0x30,\r\n0x00,0x5d,0x5d,0x5d,0x5d,0x5d,0x5d,0x25,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x25,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x05,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x03,0x70,0x0d,0x53,0x8c,\r\n0xb9,0x66,0x51,0x94,0x71,0x43,0x25,0x45,0x64,0x3f,0x01,0x7d,0x43,0x5c,0x3a,0x1a,0x6c,0x6d,0x32,0x5c,0x4e,0x3a,0x0f,0xa6,0x12,0x5b,0x80,0x9d,0x54,0x4b,0x87,0x65,0x3c,0x27,0x46,0x63,0x3d,0xfe,0x85,0x80,0x79,0x28,0x45,0x5e,0x36,0x3d,0x75,0x5b,0x37,0x09,0x41,0x2a,0x30,0x66,0xa9,0x78,0x42,0x32,0x5b,0x83,0x51,0x45,0x80,0x6d,\r\n0x56,0x1a,0x9b,0x1b,0x3e,0x49,0x54,0x31,0x4d,0x5d,0x1b,0x36,0x50,0x34,0x56,0x84,0x59,0x2d,0x23,0x49,0x6e,0x4b,0x43,0x7a,0x68,0x54,0x1e,0x96,0x33,0x9c,0x70,0x35,0x53,0x39,0x1e,0x2c,0x4e,0x6c,0x41,0x20,0x1b,0x00,0x00,0x01,0x00,0x2d,0x00,0x00,0x04,0x55,0x04,0x00,0x00,0x09,0x00,0x41,0x40,0x22,0x06,0x01,0x00,0x01,0x84,0x05,\r\n0x06,0x14,0x05,0x05,0x06,0x09,0x00,0x00,0x02,0x03,0x03,0x05,0x0b,0x08,0x07,0x07,0x04,0x05,0x06,0x95,0x00,0x08,0x0f,0x05,0x01,0x95,0x03,0x15,0x00,0x3f,0xed,0x33,0x3f,0x33,0xed,0x01,0x2f,0x33,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0x33,0x33,0x2f,0x33,0x87,0x10,0x2b,0x87,0x7d,0xc4,0x31,0x30,0x01,0x01,0x21,0x07,0x21,0x37,0x01,\r\n0x21,0x37,0x21,0x04,0x4b,0xfd,0x04,0x02,0x44,0x1d,0xfc,0xb7,0x0a,0x02,0xfb,0xfd,0xef,0x1e,0x03,0x16,0x03,0xd1,0xfc,0xbb,0x8c,0x33,0x03,0x41,0x8c,0x00,0x00,0x02,0x00,0x72,0xff,0xe8,0x03,0xde,0x05,0xb2,0x00,0x0d,0x00,0x18,0x00,0x20,0x40,0x10,0x0a,0x89,0x11,0x11,0x1a,0x16,0x89,0x04,0x13,0x9a,0x07,0x07,0x0e,0x9a,0x00,0x19,\r\n0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x12,0x11,0x14,0x02,0x06,0x27,0x32,0x12,0x11,0x10,0x21,0x22,0x02,0x11,0x10,0x12,0x02,0x22,0x80,0xc6,0x6a,0xef,0xda,0xcb,0xd8,0x6e,0xc9,0x84,0x82,0x91,0xfe,0xff,0x8b,0x90,0x8e,0x18,0xb6,0x01,0x4d,0xdd,0x01,\r\n0x64,0x01,0x86,0xfe,0x89,0xfe,0x9e,0xe4,0xfe,0xa9,0xb6,0x8a,0x01,0x3b,0x01,0x36,0x02,0x45,0xfe,0xd9,0xfe,0xd8,0xfe,0xdd,0xfe,0xbc,0x00,0x01,0x00,0xa1,0x00,0x00,0x03,0xb2,0x05,0x9a,0x00,0x1f,0x00,0x29,0x40,0x0f,0x18,0x08,0x01,0x8a,0x0b,0x10,0x00,0x14,0x1d,0x1d,0x09,0x14,0x06,0x01,0x0e,0xb8,0x01,0x81,0xb1,0x09,0x18,0x00,\r\n0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0xcd,0xfd,0xcd,0xc4,0x31,0x30,0x01,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x34,0x36,0x33,0x33,0x32,0x17,0x13,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x02,0x75,0xf4,0x1d,0x1f,0x1f,0x1d,0xfd,0x74,0x1f,0x1d,0x1d,0x1f,0xf4,0x29,\r\n0x33,0x7f,0x24,0x0f,0xce,0x05,0x42,0x23,0x24,0x0f,0x04,0xe3,0xfb,0xc1,0x30,0x20,0x20,0x34,0x34,0x20,0x20,0x30,0x04,0xa5,0x2f,0x22,0x1c,0xfe,0x70,0x0c,0x0b,0x20,0x2f,0x1d,0x00,0x01,0x00,0xc2,0xff,0xe8,0x03,0x8a,0x05,0xb2,0x00,0x1b,0x00,0x27,0x40,0x13,0x00,0x8a,0x14,0x14,0x1d,0x13,0x05,0x8a,0x0b,0x04,0x9b,0x13,0x13,0x08,\r\n0x18,0x0f,0x07,0x08,0x19,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x21,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x03,0x8a,0x1c,0x1d,0xfe,0x15,0x30,0x20,0x22,0x32,0x31,0x23,0x20,\r\n0x30,0x01,0x80,0x31,0x23,0x20,0x30,0x03,0x54,0x22,0x32,0xfd,0x21,0x1e,0x1b,0x1c,0x1d,0x05,0x58,0x1d,0x1c,0x1b,0x1e,0xfe,0x2b,0x01,0xd5,0x1d,0x1c,0x1b,0x1e,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x03,0x34,0x05,0xb2,0x00,0x19,0x00,0x26,0x40,0x0c,0x0f,0x07,0x01,0x8a,0x13,0x0a,0x0c,0x9b,0x11,0x11,0x17,0x09,0xb8,0x01,0x81,0xb3,\r\n0x05,0x18,0x17,0x07,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0xcd,0x32,0x31,0x30,0x01,0x11,0x14,0x06,0x23,0x21,0x22,0x35,0x34,0x33,0x21,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x03,0x34,0x2c,0x1a,0xfe,0x77,0x46,0x46,0x01,0x2b,0xfe,0xcb,0x1f,0x1d,0x1d,0x1f,0x01,0x35,\r\n0x30,0x20,0x22,0x32,0x05,0x79,0xfa,0xd9,0x1c,0x36,0x51,0x53,0x01,0x99,0x30,0x20,0x20,0x34,0x02,0x98,0x1e,0x1b,0x1c,0x00,0x00,0x01,0x00,0xf7,0x00,0x00,0x03,0x55,0x05,0xb2,0x00,0x1a,0x00,0x2b,0x40,0x0f,0x09,0x01,0x8a,0x14,0x14,0x1c,0x05,0x8a,0x0f,0x04,0x9b,0x13,0x13,0x18,0x05,0xb8,0x01,0x81,0xb3,0x0c,0x18,0x18,0x07,0x00,\r\n0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xfd,0xc4,0x31,0x30,0x01,0x11,0x14,0x23,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x23,0x21,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x11,0x34,0x36,0x33,0x32,0x16,0x03,0x55,0x32,0xfe,0x78,0x01,0x74,0x1e,0x28,0x46,0xfe,0x2e,0x1e,0x28,0x1d,0x1f,0x01,0x7e,0x31,0x23,\r\n0x20,0x30,0x05,0x79,0xfd,0x7a,0x54,0xfe,0x05,0x2a,0x23,0x57,0x39,0x30,0x02,0x86,0x20,0x34,0x02,0x36,0x1d,0x1c,0x1b,0x00,0x00,0x01,0x01,0x08,0xff,0xe8,0x03,0x47,0x05,0xb2,0x00,0x16,0x00,0x1e,0x40,0x0e,0x06,0x01,0x0a,0x8a,0x10,0x09,0x9b,0x01,0x01,0x0d,0x14,0x07,0x0d,0x19,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xfd,\r\n0x32,0xc6,0x31,0x30,0x01,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x01,0xac,0x01,0x55,0x1e,0x28,0x28,0x1e,0xfe,0xab,0x30,0x20,0x22,0x32,0x31,0x23,0x20,0x30,0x05,0x79,0xfd,0xb3,0x2a,0x28,0x2b,0x27,0xfd,0x99,0x1e,0x1b,0x1c,0x1d,0x05,0x58,0x1d,0x1c,0x1b,\r\n0x00,0x01,0x00,0xe1,0xff,0xe9,0x03,0x73,0x05,0xb2,0x00,0x17,0x00,0x23,0x40,0x11,0x01,0x8a,0x07,0x07,0x19,0x14,0x8a,0x0b,0x09,0x9b,0x14,0x14,0x10,0x04,0x19,0x10,0x07,0x00,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x22,0x26,0x35,0x11,0x34,\r\n0x36,0x33,0x32,0x16,0x15,0x11,0x21,0x32,0x16,0x03,0x73,0x31,0x23,0x20,0x30,0xfe,0x66,0x22,0x32,0x30,0x20,0x22,0x32,0x01,0xb2,0x1d,0x1f,0x02,0xef,0xfd,0x33,0x1c,0x1d,0x1b,0x1e,0x02,0x7d,0x1c,0x1d,0x02,0xa1,0x1e,0x1b,0x1c,0x1d,0xfd,0xca,0x34,0x00,0x01,0x00,0xa1,0x00,0x00,0x03,0xaf,0x05,0xb2,0x00,0x16,0x00,0x21,0x40,0x0f,\r\n0x0d,0x11,0x11,0x18,0x0c,0x8a,0x04,0x0c,0x0f,0x0f,0x01,0x08,0x07,0x01,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x33,0x31,0x30,0x21,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x01,0x06,0x01,0x68,0x73,0x25,0x2f,0x31,0x23,0x20,0x30,0x01,\r\n0xd6,0x0d,0x20,0x24,0x43,0x06,0xfd,0xec,0x0e,0x1b,0x1b,0x05,0x43,0x1d,0x1c,0x1b,0x1e,0xfb,0x59,0x03,0x42,0x19,0x35,0x1f,0x0b,0x0c,0xfc,0x57,0x19,0x00,0x00,0x02,0x00,0xa9,0x00,0x00,0x03,0xa7,0x05,0xb2,0x00,0x14,0x00,0x17,0x00,0x26,0x40,0x12,0x15,0x03,0x03,0x19,0x00,0x17,0x8a,0x0d,0x16,0x9b,0x17,0x00,0x00,0x0a,0x11,0x07,\r\n0x0a,0x18,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x21,0x32,0x15,0x14,0x06,0x07,0x01,0x06,0x23,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x01,0x21,0x11,0x01,0x4d,0x02,0x1d,0x3d,0x16,0x16,0xfe,0x22,0x0e,0x1f,0x73,0x25,0x2f,0x31,0x23,0x20,0x30,0x01,0x83,\r\n0xfe,0x7d,0x04,0x2a,0x3a,0x26,0x3a,0x27,0xfc,0xb0,0x19,0x1b,0x1b,0x05,0x43,0x1d,0x1c,0x1b,0x1e,0xfe,0x0d,0xfd,0x4d,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x03,0x94,0x05,0xb2,0x00,0x13,0x00,0x1f,0x00,0x33,0x40,0x1a,0x04,0x8a,0x09,0x00,0x8b,0x14,0x09,0x14,0x09,0x14,0x21,0x1a,0x8b,0x0e,0x1d,0x9b,0x03,0x0b,0x0b,0x11,0x07,0x19,\r\n0x17,0x9b,0x11,0x07,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x94,0x9a,0x80,0x32,\r\n0x20,0x20,0x32,0x82,0x98,0xca,0xa6,0xa6,0xc2,0x9a,0x6b,0x61,0x65,0x73,0x71,0x67,0x5c,0x70,0x04,0x6f,0x78,0xab,0x17,0xfc,0xec,0x1e,0x1b,0x1b,0x1e,0x03,0x15,0x19,0xaa,0x76,0x94,0xaf,0xad,0x8d,0x4f,0x57,0x57,0x4f,0x56,0x60,0x64,0x00,0x00,0x02,0x00,0x76,0x00,0xf7,0x03,0xb0,0x04,0x66,0x00,0x0b,0x00,0x1b,0x00,0x1f,0x40,0x0f,\r\n0x10,0x8a,0x09,0x09,0x1d,0x03,0x8a,0x18,0x06,0x99,0x14,0x00,0x99,0x0c,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x14,0x6e,0x8f,0x93,0x6a,0x6a,\r\n0x91,0x8d,0x6e,0x71,0xbe,0x6d,0x6f,0xbf,0x6e,0x6e,0xbf,0x71,0x6e,0xbe,0x03,0xcc,0xa2,0x7a,0x77,0xa8,0xa7,0x78,0x78,0xa4,0x9a,0x73,0xcc,0x78,0x76,0xcd,0x75,0x76,0xcc,0x76,0x76,0xcd,0x74,0x00,0x00,0x01,0x00,0x8a,0xfe,0xe6,0x03,0x37,0x05,0x9c,0x00,0x29,0x00,0x49,0x40,0x26,0x0a,0x8a,0x20,0x11,0x8a,0x17,0x0e,0x29,0x14,0x1c,\r\n0x29,0x14,0x20,0x17,0x17,0x20,0x14,0x29,0x1c,0x05,0x2b,0x26,0x8a,0x02,0x0e,0x1c,0x29,0x1c,0x13,0x00,0x00,0x06,0x14,0x13,0x23,0x99,0x06,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x26,0x35,\r\n0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x07,0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0x6f,0xe5,0x50,0x94,0x55,0x5b,0x98,0x57,0x48,0x86,0x9c,0xf0,0xa4,0x56,0x87,0x1c,0x1c,0x2a,0x6e,0xb5,0x75,0x9d,0xad,0x4f,0x55,0x49,\r\n0x45,0x59,0x50,0x47,0x02,0xf7,0x8f,0xd7,0x5b,0x92,0x52,0x58,0xa4,0x68,0x5f,0xb8,0xc0,0xa7,0xd2,0xd2,0x5e,0x6a,0x68,0x52,0x27,0x3b,0x23,0x2c,0x4b,0x75,0xa9,0x67,0x9d,0xd7,0xab,0x5b,0x63,0x6c,0x60,0x49,0x42,0x7d,0x2c,0x00,0x00,0x01,0x00,0x6d,0xfe,0xdb,0x03,0xbe,0x05,0x9c,0x00,0x21,0x00,0x3c,0x40,0x1d,0x00,0x21,0x1d,0x1a,\r\n0x8a,0x0e,0x02,0x0e,0x06,0x06,0x13,0x14,0x0b,0x0e,0x09,0x09,0x11,0x0b,0x9a,0x02,0x1d,0x1d,0x00,0x11,0x9b,0x16,0x06,0x21,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x11,0x39,0x2f,0x01,0x2f,0x33,0xc4,0x32,0x39,0x2f,0x12,0x39,0x10,0xed,0x32,0x2f,0x33,0x31,0x30,0x01,0x02,0x03,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,\r\n0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x07,0x07,0x16,0x12,0x17,0x03,0x39,0xee,0x9a,0x46,0x74,0x42,0x4a,0x3c,0x7c,0x50,0x85,0x8d,0xc3,0x9a,0x88,0x96,0x31,0xb1,0xa4,0x8f,0xea,0x83,0xca,0xb0,0x01,0x72,0x9e,0x66,0xfe,0xdb,0x01,0x56,0x01,0x6c,0x02,0x47,0x72,0x3b,0x3b,0x4a,\r\n0xd2,0x2a,0xb4,0x7d,0x9c,0xc8,0x49,0x94,0x4c,0x85,0xe9,0x86,0xa9,0xfe,0xfa,0x3e,0x03,0xed,0xfe,0xf6,0x89,0x00,0x00,0x01,0x00,0x76,0xfe,0xde,0x03,0xa2,0x05,0x88,0x00,0x2f,0x00,0x60,0x40,0x19,0x00,0x2f,0x2b,0x28,0x8a,0x0f,0x0c,0x24,0x0f,0x2f,0x0f,0x2f,0x0f,0x31,0x03,0x18,0x14,0x06,0x14,0x06,0x1c,0x22,0x8a,0x18,0x0c,0xb8,\r\n0x01,0x7e,0x40,0x15,0x2b,0x03,0x2b,0x24,0x13,0x9b,0x14,0x2b,0x09,0x14,0x14,0x09,0x2b,0x03,0x00,0x1c,0x9b,0x1d,0x06,0x2f,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0xc6,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0x10,0xed,0x32,\r\n0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x02,0xf6,0x5a,0x71,0x4b,0x81,0x9d,0x4c,0x39,0x3a,0x83,0x3a,\r\n0x5f,0x61,0x95,0x88,0xfe,0xc3,0x7a,0x8c,0x86,0x82,0xfe,0xd2,0x01,0x29,0x89,0xc3,0x65,0x84,0x62,0x74,0x98,0x7c,0x27,0x93,0x33,0xfe,0xde,0x8b,0x93,0x51,0x05,0x6b,0x51,0x38,0x48,0x57,0x52,0x19,0x85,0x5f,0x7b,0x83,0x97,0x66,0x5c,0x5a,0x5f,0x96,0x53,0x98,0x64,0x9d,0x61,0x06,0x2b,0xc0,0x70,0x84,0xcc,0x24,0x04,0x29,0xb9,0x4c,\r\n0x00,0x02,0x00,0x6c,0xff,0xf3,0x04,0x48,0x05,0x88,0x00,0x25,0x00,0x31,0x00,0x50,0xb6,0x26,0x8b,0x10,0x09,0x8b,0x2c,0x02,0xb8,0x01,0x85,0x40,0x22,0x24,0x2f,0x20,0x13,0x03,0x10,0x06,0x2c,0x24,0x10,0x2c,0x24,0x24,0x2c,0x10,0x03,0x33,0x1c,0x8a,0x17,0x06,0x13,0x20,0x13,0x2f,0x03,0x0d,0x25,0x19,0x06,0x29,0x99,0x0d,0x19,0x00,\r\n0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x16,0x17,\r\n0x3e,0x02,0x35,0x27,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x04,0x41,0x07,0x4d,0x8b,0xa5,0x7e,0x69,0x56,0x98,0x59,0x9c,0xc4,0x65,0x80,0xae,0x89,0x4d,0x0a,0xa6,0x0e,0x41,0x77,0x96,0x92,0x77,0x42,0x04,0xfd,0xfe,0x64,0x57,0x52,0x6e,0x55,0x67,0x68,0x57,0x05,0x88,0x25,0x2e,0x66,0xba,0xb3,0x99,0x74,0xc1,\r\n0x63,0x5d,0x91,0x50,0xb3,0x8f,0x5f,0xb9,0x79,0x94,0xa5,0xae,0x61,0x41,0x39,0x3e,0x32,0x51,0x92,0x8e,0x80,0x84,0x9a,0xa4,0x5b,0x44,0xfb,0xa6,0x4b,0x5a,0x63,0x4c,0x42,0x8f,0x5c,0x63,0x92,0x00,0x00,0x01,0x00,0x97,0xfe,0xdb,0x05,0x22,0x05,0x88,0x00,0x25,0x00,0x49,0x40,0x24,0x25,0x00,0x1a,0x09,0x13,0x0b,0x11,0x00,0x0b,0x11,\r\n0x11,0x0b,0x00,0x03,0x22,0x17,0x16,0x27,0x03,0x8a,0x22,0x13,0x1a,0x1a,0x1e,0x9b,0x09,0x06,0x0e,0x06,0x0e,0x17,0x25,0x06,0x16,0x17,0x00,0x2f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x10,0xc6,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x32,0x11,0x33,0x31,0x30,0x01,0x06,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x12,0x12,0x17,0x07,0x26,0x02,0x27,0x35,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x37,0x01,0x8d,0x2e,0x24,0x8f,0x7f,0x35,0x66,0x24,0x42,0x48,0x3e,0x48,0x5f,0x3a,0x54,0xb1,0x64,0x80,0x62,0xc9,0x25,0x37,0x8c,0x3f,0x82,0xc8,0x6f,0x2b,\r\n0x23,0x05,0x88,0xb2,0xe2,0x63,0xc9,0xd5,0x30,0x2c,0x60,0x6b,0x4b,0x5f,0x7b,0x5c,0x5f,0x5b,0xfe,0xf9,0xfe,0x91,0x85,0x5d,0x86,0x01,0xcd,0x90,0x01,0x2f,0x35,0x91,0x01,0x04,0x9c,0x6f,0x01,0x11,0x7c,0x00,0x00,0x01,0x00,0x90,0xfe,0xde,0x04,0xce,0x05,0x88,0x00,0x36,0x00,0x63,0x40,0x33,0x04,0x8a,0x19,0x16,0x15,0x22,0x1f,0x13,\r\n0x0b,0x11,0x1f,0x0b,0x11,0x15,0x15,0x11,0x0b,0x1f,0x04,0x26,0x38,0x2d,0x2d,0x36,0x32,0x8a,0x26,0x0e,0x01,0x13,0x19,0x19,0x09,0x07,0x99,0x1b,0x22,0x01,0x9b,0x35,0x1b,0x35,0x1b,0x35,0x16,0x2e,0x9b,0x2b,0x06,0x15,0x16,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x32,0x33,0x11,0x33,0x11,0x39,\r\n0x01,0x2f,0xfd,0xc6,0x39,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0x32,0xed,0x31,0x30,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,\r\n0x34,0x3e,0x02,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x03,0x61,0xed,0x73,0x7c,0x9d,0x7c,0x45,0x37,0x2a,0x3c,0x39,0x52,0x73,0x45,0x57,0x92,0x7d,0x3f,0x7c,0x2f,0x60,0x5a,0x80,0xd5,0x77,0x3c,0x4b,0x63,0x75,0x3b,0x64,0xa9,0x85,0xe0,0xca,0x7e,0x7e,0x43,0x96,0x7d,0x01,0x1a,0x02,0xe0,0x75,0x6d,0x7e,0xa2,\r\n0x13,0x56,0x4a,0x3f,0x49,0x8f,0x5a,0x57,0x35,0xad,0xbd,0x5c,0x44,0xd4,0x6d,0x1c,0x75,0xce,0x7d,0x51,0x87,0x3c,0x06,0x26,0xa8,0x6f,0x4d,0x6c,0x47,0x2a,0x96,0x22,0x4a,0x3f,0x5e,0x72,0x00,0x01,0x00,0x76,0xff,0xf8,0x04,0xca,0x05,0x88,0x00,0x29,0x00,0x4d,0xbc,0x00,0x24,0x01,0x85,0x00,0x06,0x00,0x0d,0x01,0x85,0x40,0x0a,0x1d,\r\n0x06,0x29,0x1d,0x1d,0x29,0x06,0x03,0x2b,0x16,0xb8,0x01,0x85,0x40,0x0f,0x15,0x00,0x9b,0x29,0x21,0x9b,0x09,0x29,0x09,0x29,0x09,0x11,0x15,0x06,0x1a,0xb8,0x01,0x80,0xb1,0x11,0x18,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,\r\n0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x02,0x11,0x33,0x10,0x12,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x37,0x03,0xd4,0x16,0x1d,0x78,0xaf,0x5e,0xa8,0x84,0x72,0xb0,0x60,0x7d,0xe2,0x8f,0xcd,0xfe,0xea,0x83,0x9f,0x69,0xcd,0x93,\r\n0x95,0xb9,0x3e,0x6b,0x3e,0x3f,0x4c,0x43,0x75,0x46,0x1a,0x01,0xd4,0x05,0x62,0xae,0x67,0x89,0xb1,0x8b,0xfc,0x9c,0xb6,0xfe,0xe8,0x97,0x01,0x43,0x02,0x95,0x01,0xb8,0xfe,0x5a,0xfd,0xc3,0xfe,0xeb,0x01,0x05,0xce,0x6f,0xb1,0x64,0x59,0x4c,0x48,0x66,0x36,0x02,0x00,0x01,0x00,0x80,0xff,0xa1,0x04,0x3e,0x05,0x96,0x00,0x16,0x00,0x2f,\r\n0x40,0x16,0x16,0x00,0x0a,0x0b,0x00,0x0b,0x00,0x0b,0x18,0x04,0x8b,0x12,0x0b,0x0a,0x0a,0x0e,0x00,0x16,0x06,0x07,0x99,0x0e,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x00,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,0x26,\r\n0x26,0x35,0x34,0x12,0x00,0x13,0x03,0x97,0xfd,0xef,0x52,0x19,0x95,0x73,0x6c,0xb9,0x6d,0x89,0x81,0xfe,0xfd,0x95,0x75,0xc1,0x6f,0x82,0x01,0x23,0xe9,0x05,0x39,0xfd,0x2c,0xc9,0x3c,0x3b,0x6c,0x83,0x89,0xb4,0x57,0xc7,0xb4,0x64,0xb4,0x72,0x72,0x01,0x05,0x01,0xb2,0x01,0x42,0x00,0x00,0x01,0x00,0x76,0xfe,0xe6,0x04,0x23,0x05,0x9c,\r\n0x00,0x27,0x00,0x42,0x40,0x21,0x27,0x00,0x24,0x8a,0x02,0x12,0x13,0x10,0x89,0x16,0x00,0x1d,0x13,0x16,0x02,0x16,0x02,0x16,0x29,0x08,0x8a,0x1d,0x00,0x9a,0x27,0x27,0x12,0x05,0x9b,0x20,0x06,0x13,0x12,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x11,0x33,\r\n0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x01,0xf1,0xc5,0x6f,0x59,0x60,0x77,0x38,0x86,0xcc,0xd0,0x7a,0x38,0x56,0x87,0x36,0x29,0x54,0xb4,0xec,\r\n0xa0,0x49,0xcf,0xa2,0x6b,0xaa,0x5f,0x99,0x90,0x03,0x32,0x54,0xa6,0x60,0x76,0x84,0x63,0x40,0x7e,0xa8,0xd8,0xdd,0x99,0x74,0x37,0x6b,0x6b,0x52,0x4e,0x34,0x22,0x4f,0x69,0xbf,0xfa,0xd2,0xb0,0x5a,0xa5,0xce,0x61,0xad,0x67,0x82,0xc5,0x36,0x00,0x02,0x00,0x96,0x00,0x93,0x04,0x9f,0x04,0xc9,0x00,0x0e,0x00,0x1e,0x00,0x1f,0x40,0x0f,\r\n0x1b,0x8a,0x00,0x00,0x20,0x08,0x8a,0x13,0x0b,0x9b,0x0f,0x04,0x9b,0x17,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x03,0xff,0x55,0x9d,\r\n0x66,0x6c,0xa8,0x5e,0xba,0x96,0x67,0xaf,0x64,0xfe,0x79,0x8c,0xdd,0x79,0x8c,0xfa,0x96,0x8e,0xe2,0x7d,0x93,0xff,0x02,0xc0,0x64,0xa4,0x5d,0x66,0xb7,0x6c,0x9b,0xcb,0x68,0xb6,0xfe,0x3f,0x8a,0xf4,0x8e,0x98,0xff,0x93,0x87,0xed,0x90,0x99,0xfe,0xfb,0x94,0x00,0x00,0x01,0x00,0x64,0xff,0xe7,0x03,0x88,0x05,0xb1,0x00,0x25,0x00,0x35,\r\n0x40,0x1a,0x06,0x8a,0x14,0x25,0x0d,0x12,0x22,0x14,0x0d,0x22,0x14,0x14,0x22,0x0d,0x03,0x27,0x1c,0x25,0x1f,0x10,0x10,0x0a,0x1f,0x07,0x0a,0x19,0x00,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x17,0x16,0x16,0x15,0x14,0x02,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x32,0x12,0x5d,0x74,0xc3,0xb0,0x76,0xb2,0x6a,0x5f,0x73,0xa2,0x73,0x35,0x40,0x3b,0x3f,0x75,0x8e,0x9d,0x6a,0x3c,0x59,0x3d,0x37,0x47,0x22,0x23,0x04,0xd3,0x20,0x56,0x59,0x98,0xfe,0x81,0x7a,\r\n0xfe,0xfa,0x86,0x5a,0x4b,0x57,0x74,0x10,0x4d,0x54,0x3d,0x77,0x7c,0x74,0x7f,0x6e,0x6a,0x35,0x44,0x55,0x3f,0x36,0x25,0x2d,0x11,0x00,0x00,0x01,0x00,0x78,0xff,0xa7,0x05,0x09,0x05,0xb1,0x00,0x2d,0x00,0x43,0x40,0x13,0x03,0x00,0x89,0x0c,0x15,0x27,0x23,0x1d,0x07,0x15,0x23,0x23,0x15,0x07,0x03,0x2f,0x1d,0x03,0x0d,0xb8,0x01,0x81,\r\n0x40,0x0b,0x19,0x27,0x27,0x20,0x0c,0x0c,0x08,0x20,0x07,0x07,0x08,0x00,0x2f,0x33,0x3f,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0xed,0x39,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xc4,0xed,0x32,0x31,0x30,0x01,0x14,0x06,0x07,0x15,0x16,0x04,0x17,0x07,0x26,0x24,0x24,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x36,0x36,\r\n0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x1e,0x05,0x04,0x47,0xcc,0xcf,0xc8,0x01,0x3c,0x59,0x68,0x4d,0xfe,0x8e,0xfe,0x5e,0xc8,0x10,0x31,0x85,0x3c,0x36,0x7e,0xf5,0x7c,0x41,0x75,0xa9,0x97,0x82,0x46,0x56,0x42,0x36,0x46,0x22,0x23,0x01,0x34,0x8a,0x94,0x8f,0x71,0x46,0x03,0x4b,\r\n0x7e,0xc8,0x3f,0x06,0x4b,0xe2,0x83,0x69,0x71,0xfa,0x9c,0x12,0xa5,0x03,0x19,0x06,0x4b,0x74,0x49,0x36,0x48,0x31,0x24,0x20,0x3c,0x57,0x41,0x44,0x5b,0x42,0x2f,0x1d,0x38,0x12,0x06,0x07,0x14,0x24,0x37,0x52,0x72,0x00,0x00,0x01,0x00,0x82,0x00,0x93,0x05,0x8b,0x05,0x36,0x00,0x23,0x00,0x38,0x40,0x14,0x1a,0x8a,0x07,0x0a,0x0d,0x13,\r\n0x0d,0x07,0x07,0x0d,0x13,0x03,0x25,0x00,0x22,0x0a,0x10,0x10,0x16,0x03,0xb8,0x01,0x80,0xb4,0x1e,0x22,0x00,0x16,0x06,0x00,0x3f,0xc6,0x32,0xd4,0xed,0x12,0x39,0x2f,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x31,0x30,0x13,0x12,0x00,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x07,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x03,0x37,0xfb,0x96,0x01,0x40,0xce,0x64,0x97,0x53,0x98,0x83,0x09,0x30,0x8d,0x5b,0x61,0x83,0xc7,0xa8,0x95,0xe1,0x79,0x7a,0xdf,0x8e,0xb4,0xfe,0xce,0xf2,0x4a,0x73,0x05,0x36,0xfd,0xd2,0xfe,0x25,0x6c,0xc0,0x70,0x9e,0xe3,0x18,0x0e,0x3c,\r\n0x4a,0x5b,0x83,0x93,0x6a,0x80,0x9c,0x91,0xfe,0xfe,0x9f,0xa0,0xfe,0xf5,0x99,0xf7,0x01,0xf5,0x01,0x5e,0x59,0x00,0x00,0x03,0x00,0x8c,0x00,0x4c,0x04,0x91,0x05,0xb1,0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x46,0x40,0x26,0x2c,0x8a,0x12,0x1a,0x8a,0x33,0x03,0x8b,0x1e,0x0e,0x12,0x33,0x1d,0x1e,0x12,0x33,0x1e,0x1e,0x33,0x12,0x03,0x3a,\r\n0x26,0x8a,0x0b,0x22,0x1d,0x0e,0x30,0x04,0x16,0x29,0x99,0x07,0x36,0x9b,0x16,0x07,0x00,0x3f,0xed,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,\r\n0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x26,0x27,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x7e,0x95,0x7e,0x8a,0xee,0x8f,0x8e,0xed,0x83,0x8f,0xa7,0x87,0x7a,0x7f,0xe0,0x80,0x82,0xd2,0x77,0x6e,0x7f,0x77,0x46,0x80,0x9b,\r\n0x9d,0x84,0x47,0xd8,0xa0,0x94,0xbd,0xfd,0x6c,0x3f,0x76,0x9f,0x9c,0x7a,0xb7,0x89,0x84,0xa6,0x03,0x32,0x3f,0xa8,0x77,0x75,0xb3,0x60,0x62,0xb1,0x75,0x7e,0xaa,0x37,0x06,0x34,0x91,0x65,0x62,0x98,0x54,0x51,0x94,0x64,0x6b,0x92,0x33,0xfe,0x98,0x44,0x63,0x4a,0x31,0x28,0x44,0x61,0x47,0x71,0x91,0x85,0x03,0x0b,0x37,0x50,0x3d,0x2f,\r\n0x2c,0x71,0x54,0x4c,0x62,0x5e,0x00,0x02,0x00,0x96,0x00,0x01,0x05,0x82,0x05,0xb1,0x00,0x1f,0x00,0x32,0x00,0x5a,0x40,0x18,0x02,0x8a,0x30,0x2b,0x25,0x0f,0x89,0x28,0x09,0x14,0x00,0x30,0x28,0x28,0x30,0x00,0x14,0x09,0x05,0x34,0x20,0x8a,0x1a,0x13,0xb8,0x01,0x7e,0x40,0x10,0x09,0x2b,0x05,0x12,0x30,0x08,0x1e,0x12,0x08,0x12,0x08,\r\n0x16,0x00,0x1e,0x07,0x25,0xb8,0x01,0x80,0xb1,0x16,0x18,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x32,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x33,0x33,0x10,0xed,0x31,0x30,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x15,0x07,0x0e,0x02,0x15,0x14,\r\n0x16,0x33,0x17,0x15,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x00,0x37,0x17,0x01,0x14,0x16,0x16,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x35,0x37,0x06,0x02,0x03,0xbf,0x2f,0x84,0x5f,0x18,0x2e,0x34,0x95,0x70,0xcb,0x8f,0x48,0x7a,0x50,0x79,0xd2,0xd1,0xb0,0xfe,0xdb,0xa5,0xa5,0x01,0x2d,0xc2,0x95,0xfd,0x75,0x78,\r\n0xde,0x95,0x43,0x42,0x5a,0x83,0x97,0x70,0x82,0x02,0xd9,0xe3,0x05,0x5e,0x5c,0x47,0x5d,0x86,0x0d,0x1f,0x4b,0x06,0x49,0x7d,0x78,0x77,0x40,0x4c,0x80,0x80,0x06,0x6b,0x95,0x01,0x01,0x95,0x91,0x01,0x4c,0x01,0x35,0x73,0x4d,0xfc,0xcc,0x76,0xb8,0x63,0x03,0x36,0xa2,0x4d,0x62,0xc2,0x6e,0x2a,0xaa,0x71,0x15,0x15,0xac,0xfe,0xac,0x00,\r\n0x00,0x01,0x00,0x64,0xff,0xe5,0x06,0x29,0x05,0xb1,0x00,0x2d,0x00,0x5a,0xb9,0x00,0x0a,0x01,0x85,0x40,0x12,0x19,0x06,0x1b,0x01,0x8a,0x21,0x1b,0x21,0x19,0x21,0x28,0x28,0x21,0x19,0x03,0x2f,0x11,0x02,0xb8,0x01,0x80,0x40,0x12,0x11,0x12,0x1b,0x1e,0x22,0x06,0x12,0x1e,0x06,0x12,0x12,0x06,0x1e,0x03,0x0e,0x2b,0x07,0x15,0xb8,0x01,\r\n0x80,0xb1,0x0e,0x19,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x11,0x14,0x33,0x32,0x36,0x37,0x33,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x20,0x00,0x03,0x37,0x33,0x12,0x21,0x32,0x36,\r\n0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x92,0x23,0x68,0xbd,0x68,0x0e,0x66,0x73,0x87,0xff,0xae,0xfe,0xae,0xfe,0x39,0x78,0x77,0x06,0xfa,0x02,0x1c,0x7a,0xb6,0x62,0x34,0x47,0xc2,0x66,0x74,0x85,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x04,0x89,\r\n0xfe,0xd2,0x73,0x93,0xa4,0x59,0xfe,0xf7,0x98,0xa6,0xfe,0xf9,0x93,0x02,0x35,0x02,0x51,0x64,0xfb,0xb5,0x6f,0xc6,0x7b,0x7a,0x6a,0x60,0x6e,0x8f,0x78,0x01,0x72,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x00,0x02,0x00,0x87,0xff,0xe8,0x04,0xa0,0x05,0xb1,0x00,0x21,0x00,0x30,0x00,0x43,0x40,0x0a,0x24,0x14,0x8a,0x21,0x1b,0x21,0x1b,0x21,\r\n0x32,0x2e,0xb8,0x01,0x82,0xb4,0x05,0x05,0x2e,0x24,0x22,0xb8,0x01,0x80,0x40,0x0d,0x00,0x0d,0x15,0x1e,0x02,0x02,0x0d,0x1e,0x19,0x2a,0x9b,0x0d,0x07,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x32,0x32,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x27,0x26,\r\n0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x03,0x15,0x11,0x17,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x32,0x37,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x06,0x15,0x17,0x16,0x03,0x4e,0x63,0x96,0x5c,0xfe,0xe1,0x1b,0x19,0x1f,0x62,0x9a,0xc7,0x73,0x1f,0x58,0x59,0x3e,0x27,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,\r\n0x41,0x57,0x62,0xfe,0xfb,0xa2,0x63,0x29,0x37,0x3a,0x11,0x61,0xae,0x65,0x07,0x8c,0x02,0x74,0x1d,0x2a,0x13,0x1c,0x5b,0x2a,0x65,0xfc,0xb7,0x64,0x35,0x62,0x84,0xb2,0x74,0xfd,0xb2,0x4c,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0x01,0xe2,0x27,0x57,0x75,0xa0,0x63,0x2c,0x87,0xe9,0x83,0x0a,0x25,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,\r\n0x06,0x08,0x05,0xb1,0x00,0x31,0x00,0x41,0x00,0x6e,0xb3,0x1f,0x8a,0x18,0x26,0xb8,0x01,0x86,0x40,0x2d,0x3e,0x12,0x24,0x1a,0x3e,0x18,0x1a,0x3e,0x3e,0x1a,0x18,0x03,0x43,0x0e,0x35,0x8a,0x07,0x31,0x1a,0x1c,0x3e,0x34,0x32,0x9b,0x10,0x23,0x9b,0x15,0x12,0x0e,0x02,0x0a,0x1c,0x0e,0x15,0x2b,0x1c,0x10,0x15,0x15,0x10,0x1c,0x03,0x0a,\r\n0x3a,0xb8,0x01,0x80,0xb3,0x2b,0x19,0x0a,0x07,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0xc4,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x27,0x27,0x06,0x23,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x37,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x03,0x35,0x25,0x22,0x07,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x36,0x35,0x27,0x26,0x26,0x01,0x26,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,\r\n0x56,0x63,0x78,0xa1,0x90,0x80,0x26,0x52,0x54,0x58,0x4c,0x0b,0x82,0x06,0x28,0xad,0x90,0x30,0x1b,0x0e,0x62,0x99,0xc7,0x71,0x1f,0x58,0x59,0x3e,0x27,0x01,0xca,0x9b,0x8b,0x29,0x37,0x3a,0x11,0x61,0xab,0x65,0x07,0x3b,0x6f,0x04,0x71,0x52,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0xfe,0xa4,0x36,0x3c,0x18,0x12,0x3a,0x3b,0x1d,0x1f,\r\n0x06,0x62,0x4f,0x52,0x81,0x9b,0x06,0x19,0x2a,0x64,0xff,0xb6,0x63,0x35,0x62,0x84,0xb2,0x74,0x97,0x40,0x57,0x75,0xa0,0x63,0x2c,0x85,0xeb,0x83,0x0a,0x20,0x1e,0x00,0x00,0x01,0x00,0x96,0xff,0xe7,0x05,0x3b,0x05,0xb1,0x00,0x3c,0x00,0x67,0xb9,0x00,0x1a,0x01,0x83,0xb6,0x39,0x0d,0x39,0x0d,0x39,0x07,0x35,0xb8,0x01,0x85,0x40,0x24,\r\n0x1d,0x2d,0x2a,0x24,0x2a,0x1d,0x1d,0x2a,0x24,0x03,0x3e,0x07,0x89,0x14,0x00,0x9b,0x18,0x31,0x21,0x07,0x10,0x0a,0x21,0x2d,0x18,0x27,0x0a,0x18,0x0a,0x18,0x10,0x27,0x07,0x10,0x19,0x1a,0xb8,0x01,0x81,0xb1,0x39,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x01,\r\n0x2f,0xec,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x01,0x22,0x06,0x06,0x15,0x14,0x17,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x20,0x13,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x07,0x07,0x14,0x16,0x17,0x04,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x2e,0x02,0x02,0x26,0x41,0x6f,0x42,0x0c,0x0b,0x0f,0x4e,0x2d,0x41,0x5d,0x5f,0x4b,0x4d,0x90,0x56,0x6d,0xb2,0x6d,0x01,0x6e,0x4c,0x56,0x6a,0x55,0xac,0xff,0xfe,0xe1,0xe2,0x4f,0x44,0x39,0x48,0x22,0x23,0x01,0x94,0xa2,0x01,0x37,0xeb,0x7a,0x87,0xd5,0x85,\r\n0x23,0x4e,0x72,0x02,0x1f,0x45,0x7a,0x41,0x28,0x25,0x02,0x2a,0x36,0x66,0x44,0x47,0x58,0x57,0x95,0x59,0x6a,0xc4,0x63,0xfd,0xec,0x23,0xa6,0x5f,0x42,0x6e,0x61,0x5f,0x69,0xcd,0x8a,0x54,0x5c,0x3e,0x37,0x25,0x2d,0x11,0x06,0x3f,0x6c,0x39,0x6e,0x8c,0xaf,0x6d,0x81,0xf5,0x7c,0xe5,0xe2,0x71,0x00,0x02,0x00,0x98,0x00,0xe6,0x03,0xee,\r\n0x04,0x23,0x00,0x0b,0x00,0x17,0x00,0x2a,0xb9,0x00,0x00,0x01,0x85,0xb3,0x0c,0x0c,0x19,0x12,0xbe,0x01,0x85,0x00,0x06,0x00,0x15,0x01,0x7e,0x00,0x03,0x00,0x0f,0x01,0x7e,0xb1,0x09,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,\r\n0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xee,0xf8,0xb3,0xb3,0xf8,0xf0,0xbb,0xbb,0xf0,0xa0,0x93,0x78,0x77,0x94,0x97,0x74,0x73,0x98,0x02,0x83,0xae,0xef,0xef,0xae,0xbb,0xe5,0xe5,0xbb,0x71,0xab,0xad,0x6f,0x77,0xa5,0xa8,0x00,0x02,0x01,0x00,0xff,0xba,0x03,0x6f,0x05,0x1a,0x00,0x15,0x00,0x1e,0x00,0x36,0x40,0x09,\r\n0x16,0x12,0x8a,0x02,0x00,0x02,0x00,0x20,0x1b,0xb8,0x01,0x85,0x40,0x0b,0x0a,0x1d,0x99,0x05,0x05,0x00,0x19,0x9b,0x0d,0x06,0x15,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x33,0x31,0x30,0x05,0x24,0x11,0x35,0x12,0x35,0x06,0x23,0x22,0x26,0x35,0x34,\r\n0x36,0x33,0x32,0x16,0x15,0x10,0x03,0x15,0x14,0x17,0x01,0x35,0x34,0x23,0x22,0x15,0x14,0x33,0x32,0x03,0x6f,0xfe,0xeb,0x0a,0x25,0x25,0x7e,0x9c,0x9f,0x7c,0x7a,0x72,0x0a,0x72,0xfe,0xfa,0x4e,0x7b,0x78,0x21,0x46,0x24,0x01,0x11,0x0c,0x01,0x1e,0xe4,0x08,0x9b,0x7d,0x74,0x99,0xb2,0xe0,0xfe,0xf0,0xfe,0x83,0x07,0x8e,0x0d,0x03,0x44,\r\n0x25,0xb8,0x6d,0x7c,0x00,0x01,0x00,0x5d,0xff,0xbe,0x04,0x26,0x04,0xee,0x00,0x20,0x00,0x4d,0xb2,0x1e,0x05,0x1c,0xb8,0x01,0x85,0x40,0x1d,0x10,0x0d,0x10,0x01,0x00,0x09,0x10,0x00,0x00,0x10,0x09,0x03,0x22,0x16,0x0d,0x05,0x1e,0x1e,0x07,0x0b,0x07,0x0b,0x07,0x01,0x13,0x9b,0x19,0x06,0x00,0xb8,0x01,0x80,0xb1,0x01,0x19,0x00,0x3f,\r\n0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0x33,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x32,0x31,0x30,0x25,0x07,0x26,0x27,0x26,0x27,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x36,0x33,0x32,0x00,0x15,0x10,0x05,0x16,0x16,\r\n0x04,0x26,0x28,0x79,0x5b,0x19,0xa2,0x6c,0x6f,0xd9,0xe9,0x79,0x6b,0x6b,0x80,0xc3,0xa3,0xbc,0x8f,0x65,0x72,0xbe,0x80,0xe5,0x01,0x21,0xfe,0xf6,0x65,0x6d,0x58,0x9a,0x11,0x43,0x12,0x98,0x24,0x91,0x8e,0x45,0x38,0xc5,0x73,0xa4,0xc8,0x77,0x7c,0x57,0x44,0xfe,0xda,0xe6,0xfe,0xd1,0xad,0x63,0x3e,0x00,0x00,0x01,0x00,0x6b,0xff,0x7b,\r\n0x04,0x19,0x05,0x04,0x00,0x2a,0x00,0x68,0xb6,0x05,0x04,0x04,0x2c,0x29,0x00,0x26,0xb8,0x01,0x85,0x40,0x19,0x1b,0x08,0x02,0x02,0x16,0x1b,0x0d,0x16,0x0d,0x16,0x22,0x13,0x1b,0x02,0x09,0x29,0x29,0x17,0x0f,0x0f,0x11,0x16,0x9b,0x17,0x11,0xb8,0x01,0x81,0x40,0x0b,0x09,0x17,0x09,0x17,0x09,0x05,0x1f,0x9b,0x24,0x06,0x04,0xb9,0x01,\r\n0x80,0x00,0x05,0x00,0x2f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x11,0x39,0x11,0x12,0x39,0x01,0x2f,0x33,0xc4,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x14,0x05,0x16,0x17,0x07,0x26,0x26,0x27,0x07,0x22,0x27,0x26,0x35,0x34,0x33,\r\n0x32,0x17,0x24,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x16,0x04,0x19,0xfe,0xdb,0x41,0x7d,0x29,0x72,0x96,0x62,0x4c,0x8c,0x41,0x77,0xaa,0x6d,0xb3,0x01,0x20,0xfe,0xca,0xcd,0xeb,0x7c,0x94,0x82,0x49,0xa0,0xa8,0xbb,0x38,0xd6,0xc5,0x02,0x0b,0x57,0x3c,\r\n0x9b,0x01,0x8f,0xe9,0x41,0x2e,0x22,0x9a,0x1f,0x51,0x61,0x01,0x12,0x22,0x65,0x78,0x6e,0x14,0x8d,0xcb,0xa1,0x5a,0x53,0x7c,0x29,0x17,0x47,0x97,0x50,0xfe,0xa4,0x46,0x9b,0x24,0x77,0x00,0x00,0x02,0x00,0x94,0xff,0xba,0x03,0xf0,0x05,0x1e,0x00,0x1c,0x00,0x29,0x00,0x53,0xb3,0x00,0x89,0x1c,0x06,0xbb,0x01,0x85,0x00,0x1d,0x00,0x24,\r\n0x01,0x85,0x40,0x1e,0x0e,0x02,0x1c,0x12,0x21,0x18,0x03,0x1d,0x0e,0x1c,0x1d,0x0e,0x0e,0x1d,0x1c,0x03,0x2b,0x15,0x89,0x14,0x18,0x02,0x12,0x21,0x04,0x0a,0x1c,0x14,0x06,0x27,0xb8,0x01,0x80,0xb1,0x0a,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x10,\r\n0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x01,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x00,0x03,0x33,0x16,0x16,0x17,0x3e,0x02,0x37,0x03,0x34,0x27,0x26,0x27,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf0,0x30,0xfe,0xef,0x81,0x3d,0x1f,0x5c,0x9b,0x53,0x54,0x9a,0x5c,0x1f,0x3e,0x80,\r\n0xfe,0xeb,0x2c,0xaa,0x22,0x76,0x6f,0x57,0x55,0x3d,0x18,0x5a,0x38,0x11,0x5e,0x72,0x3b,0x67,0x43,0x43,0x67,0x05,0x1e,0xfe,0x81,0xfe,0xdc,0x95,0x64,0x63,0x30,0x51,0x8f,0x55,0x55,0x8f,0x51,0x30,0x63,0x65,0x94,0x01,0x28,0x01,0x7b,0xb6,0xfa,0x76,0x5a,0x8d,0xba,0x85,0xfb,0xd1,0x3b,0x50,0x18,0x6c,0x84,0x50,0x3b,0x38,0x5e,0x5c,\r\n0x00,0x01,0x00,0x59,0xff,0xf6,0x04,0x2b,0x04,0xe1,0x00,0x1a,0x00,0x48,0xb9,0x00,0x10,0x01,0x85,0xb2,0x0a,0x18,0x00,0xb8,0x01,0x85,0x40,0x0d,0x01,0x0a,0x01,0x0a,0x01,0x1c,0x12,0x89,0x0d,0x07,0x18,0x12,0x15,0xb8,0x01,0x80,0x40,0x0b,0x02,0x07,0x0d,0x04,0x04,0x01,0x19,0x0d,0x06,0x01,0x18,0x00,0x3f,0x3f,0x33,0x12,0x39,0x2f,\r\n0x12,0x39,0x39,0xed,0x32,0x32,0x01,0x2f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,0x31,0x30,0x05,0x23,0x11,0x06,0x23,0x22,0x24,0x27,0x37,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x04,0x2b,0xa0,0x7b,0xe0,0xa7,0xfe,0xf9,0x29,0x4f,0x39,0x41,0x23,0xaa,0x5a,\r\n0x65,0x1f,0x9f,0x56,0x57,0xd7,0x2d,0xa0,0x0a,0x01,0x53,0x2a,0x8e,0x7e,0x69,0x66,0x92,0x50,0xde,0x27,0xac,0xa9,0xcd,0x98,0x31,0x37,0x22,0x16,0x02,0xea,0x00,0x01,0x00,0x7d,0xff,0xf6,0x04,0x06,0x06,0x30,0x00,0x2d,0x00,0x68,0xb9,0x00,0x17,0x01,0x85,0x40,0x10,0x0c,0x13,0x0e,0x13,0x1a,0x1a,0x13,0x0e,0x03,0x05,0x2f,0x25,0x25,\r\n0x00,0x20,0x28,0xb8,0x01,0x85,0x40,0x1c,0x09,0x07,0x05,0x14,0x9b,0x11,0x0c,0x00,0x2d,0x07,0x26,0x9b,0x23,0x1a,0x1b,0x2d,0x23,0x1b,0x1b,0x23,0x2d,0x03,0x02,0x1d,0x9b,0x0c,0x06,0x2b,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x39,0x11,0x33,0x10,0xdd,0xed,0x01,\r\n0x2f,0x33,0x33,0xfd,0x32,0xc4,0x39,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x17,0x15,0x27,0x22,0x06,0x15,0x14,0x17,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,\r\n0x32,0x37,0x04,0x06,0xb9,0xc0,0xe9,0xfe,0xd9,0xa0,0x9c,0xde,0xc2,0x1c,0x98,0x7a,0x69,0x69,0x50,0x22,0x68,0x88,0x23,0x75,0x7a,0xc1,0xa2,0xba,0x84,0xec,0xcb,0xfe,0x9d,0xe0,0x91,0xa3,0xa5,0x39,0x43,0xc4,0xaf,0xa5,0x5c,0x5d,0xb1,0x98,0xb4,0x10,0x32,0x45,0x6a,0x7b,0x04,0xa7,0x03,0x1c,0x21,0x47,0x27,0x23,0x9c,0x1a,0x5f,0x61,\r\n0x52,0x6d,0xaf,0xa1,0x61,0x72,0x3b,0x00,0x00,0x01,0x00,0xbf,0xff,0xf0,0x03,0xc4,0x05,0x25,0x00,0x17,0x00,0x40,0xb4,0x03,0x04,0x10,0x0f,0x00,0xb8,0x01,0x85,0x40,0x09,0x07,0x0f,0x07,0x04,0x07,0x04,0x07,0x19,0x0d,0xb8,0x01,0x85,0x40,0x0c,0x12,0x0f,0x10,0x10,0x15,0x04,0x03,0x19,0x0a,0x9b,0x15,0x06,0x00,0x3f,0xed,0x3f,0x33,\r\n0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x00,0x05,0x27,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0xc4,0xfe,0xba,0xff,0x00,0x70,0xe0,0x01,0x37,0x98,0x69,0x52,0x74,0x40,0x8c,0x53,0xc4,\r\n0xa1,0xb1,0xef,0x03,0x92,0xc2,0xfe,0x08,0xe8,0x71,0xcb,0x01,0xc9,0x9d,0x61,0x92,0x6b,0x46,0x52,0x6b,0x4e,0x75,0x96,0x8f,0xc2,0xe8,0x00,0x01,0x00,0x2b,0xff,0xf6,0x04,0x59,0x05,0x29,0x00,0x18,0x00,0x3c,0xb6,0x10,0x00,0x10,0x00,0x1a,0x0e,0x13,0xb8,0x01,0x85,0x40,0x09,0x09,0x05,0x00,0x18,0x18,0x10,0x02,0x0c,0x0f,0xb8,0x01,\r\n0x80,0xb3,0x07,0x10,0x06,0x16,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0x33,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x33,0x01,0x2f,0xc4,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x59,0x9b,\r\n0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x02,0xbd,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x01,0x00,0x2b,0xff,0xf6,0x04,0x59,0x05,0xda,0x00,0x25,0x00,0x4a,0xb9,0x00,0x19,0x01,0x85,0x40,0x0e,0x0f,0x1d,0x11,\r\n0x1d,0x15,0x00,0x00,0x15,0x1d,0x11,0x04,0x27,0x0e,0x20,0xb8,0x01,0x85,0xb7,0x09,0x05,0x17,0x9b,0x14,0x1c,0x0c,0x0e,0xb8,0x01,0x80,0xb3,0x07,0x1e,0x06,0x23,0xb8,0x01,0x80,0xb1,0x02,0x18,0x00,0x3f,0xed,0x3f,0x33,0xfd,0xcd,0x33,0xd4,0xed,0x01,0x2f,0xc4,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,\r\n0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x59,0x9b,0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x01,0xb5,0x11,0x8e,0xb1,0x44,0x17,0x45,0x46,0x34,0xfd,0x59,0x03,\r\n0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x2c,0x37,0x7f,0x77,0xa0,0x06,0x11,0x3f,0x2c,0x37,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x00,0x02,0x00,0x76,0x01,0x13,0x03,0xc8,0x04,0xa4,0x00,0x0b,0x00,0x19,0x00,0x27,0xb9,0x00,0x10,0x01,0x85,0xb3,0x09,0x09,0x1b,0x03,0xbb,0x01,\r\n0x85,0x00,0x17,0x00,0x06,0x01,0x80,0xb4,0x13,0x00,0x9b,0x0c,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x02,0x20,0x73,0x99,0x9d,0x6f,0x70,0x9a,0x97,0x73,0x75,\r\n0xc3,0x70,0xed,0xbb,0x72,0xc6,0x72,0xe9,0x04,0x09,0xab,0x81,0x7f,0xb0,0xb0,0x7f,0x80,0xac,0x9b,0x76,0xd3,0x7f,0xc8,0xfe,0xff,0x7a,0xd3,0x7c,0xce,0xfa,0x00,0x02,0x00,0x2d,0xff,0xe8,0x03,0x89,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x3c,0x40,0x0b,0x18,0x0d,0x8a,0x0e,0x0f,0x15,0x0f,0x15,0x0f,0x23,0x1f,0xbb,0x01,0x85,0x00,0x06,\r\n0x00,0x16,0x01,0x80,0xb3,0x03,0x03,0x09,0x0d,0xb8,0x01,0x80,0xb5,0x12,0x19,0x1c,0x9b,0x09,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x33,0x31,0x30,0x01,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,\r\n0x03,0x32,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x0c,0x02,0x50,0x4e,0x8c,0xb3,0xb2,0x87,0x92,0xb8,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0xa4,0x58,0x4c,0x55,0x49,0x47,0x5c,0x5b,0x03,0x39,0x02,0x15,0xb7,0x98,0x8c,0xb1,0xc9,0x9f,0xfc,0x38,0x67,0xac,0x28,0x2d,0x55,0x4b,0x03,0x3e,0x23,0x66,0x5e,0x6a,0x5e,0x49,\r\n0x4c,0x5e,0x00,0x01,0x00,0x7c,0xff,0xe8,0x04,0x43,0x05,0xb2,0x00,0x26,0x00,0x55,0xb9,0x00,0x00,0x01,0x85,0x40,0x24,0x09,0x0a,0x1b,0x0a,0x1b,0x0a,0x28,0x18,0x03,0x8b,0x21,0x13,0x10,0x0a,0x09,0x03,0x21,0x20,0x18,0x10,0x16,0x09,0x10,0x16,0x20,0x20,0x16,0x10,0x09,0x04,0x0c,0x1e,0x9b,0x23,0x07,0x07,0xb8,0x01,0x80,0xb1,0x0c,\r\n0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x32,0x11,0x33,0x01,0x2f,0xcd,0xc4,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x17,0x16,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,\r\n0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x03,0x84,0xca,0xac,0x25,0x22,0x64,0x51,0x73,0x8c,0x3a,0x96,0x9f,0x90,0xb4,0x30,0x28,0x7d,0x79,0x68,0x47,0x94,0x38,0x6e,0x81,0xbe,0x9f,0x62,0x33,0x1a,0x38,0x60,0xa7,0xed,0x7e,0x03,0xce,0xa3,0xf2,0x26,0x90,0x82,0x7e,0x47,0x9e,0x44,0xbc,0xc0,0xa3,0x05,0x4e,0x53,\r\n0x45,0x5d,0x9d,0x20,0x9c,0x6b,0x90,0xae,0x08,0x95,0x0e,0x7a,0xdb,0x00,0x00,0x01,0x00,0x0f,0xff,0xe8,0x04,0x52,0x05,0xb2,0x00,0x2b,0x00,0x5b,0xb9,0x00,0x02,0x01,0x85,0x40,0x0d,0x00,0x1d,0x10,0x10,0x2d,0x1d,0x23,0x17,0x23,0x17,0x0a,0x09,0x29,0xb8,0x01,0x85,0x40,0x17,0x1d,0x09,0x0a,0x00,0x13,0x17,0x9b,0x18,0x23,0x22,0x0a,\r\n0x18,0x22,0x22,0x18,0x0a,0x03,0x06,0x20,0x9b,0x25,0x07,0x0d,0xb8,0x01,0x80,0xb1,0x06,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x39,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x12,0x39,0xed,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,\r\n0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x03,0x80,0xd2,0x7b,0xdd,0x89,0xb9,0xfe,0xd6,0x7f,0x7a,0x5e,0xf8,0x8d,0x97,0xb1,0x70,0x5e,0x36,0x40,0x58,0x4d,0x13,0x29,0x5d,0x6f,0x8e,0x96,0x78,\r\n0x4d,0x3f,0x23,0x4d,0x57,0x88,0xc7,0x68,0x7f,0x02,0xf7,0x8d,0xe4,0x7d,0xbc,0x65,0xb6,0xc0,0x5f,0x94,0xa6,0x8e,0x7e,0x56,0x90,0x2f,0x10,0x0b,0x97,0x07,0x89,0x6a,0x6f,0x86,0x12,0x97,0x16,0x6a,0xbd,0x74,0xb0,0x6e,0x00,0x02,0x00,0x0a,0xff,0xe8,0x04,0xc4,0x05,0xbc,0x00,0x10,0x00,0x1b,0x00,0x57,0xbc,0x00,0x16,0x01,0x85,0x00,\r\n0x0d,0x00,0x07,0x01,0x85,0x40,0x1c,0x11,0x02,0x03,0x14,0x01,0x0f,0x03,0x0d,0x04,0x11,0x03,0x0d,0x11,0x03,0x03,0x11,0x0d,0x03,0x1d,0x00,0x10,0x01,0x0f,0x04,0x14,0x04,0x00,0x19,0xb8,0x01,0x80,0xb7,0x0a,0x19,0x03,0x10,0x10,0x02,0x00,0x07,0x00,0x3f,0x32,0x32,0x11,0x33,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x01,0x01,0x17,0x01,0x16,0x12,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x10,0x37,0x01,0x01,0x34,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x70,0x01,0xf5,0x01,0xed,0x72,0xfe,0x16,0x76,0x71,0xbd,0x9b,0x9f,0xbd,0xe6,0xfe,0x17,0x03,0x19,\r\n0x55,0x64,0xbf,0x67,0x50,0x54,0x6d,0x05,0xbc,0xfe,0x3a,0x01,0xc6,0x75,0xfe,0x3b,0x81,0xfe,0xff,0x92,0xae,0xd8,0xe0,0xb0,0x01,0x1a,0xf6,0x01,0xbc,0xfc,0x35,0x5a,0xd5,0x6e,0xcb,0xd8,0x67,0x89,0x8a,0x00,0x00,0x01,0x00,0x16,0xff,0xe8,0x05,0x11,0x05,0xb2,0x00,0x22,0x00,0x4b,0x40,0x12,0x01,0x02,0x20,0x00,0x8a,0x08,0x02,0x08,\r\n0x02,0x08,0x24,0x1b,0x8a,0x15,0x0e,0x21,0x06,0x1e,0xb8,0x01,0x80,0x40,0x0d,0x15,0x09,0x14,0x0b,0x14,0x0b,0x14,0x05,0x12,0x9b,0x17,0x07,0x00,0xb8,0x01,0x80,0xb1,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0xed,0x3f,0x01,0x2f,0xc4,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x31,\r\n0x30,0x25,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x33,0x32,0x37,0x11,0x33,0x04,0x38,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0x6e,0x8b,0xda,0xe8,0x2c,0x2f,0x2d,0x1c,0x1f,0x28,0x41,0x76,0x88,0x8e,0x7c,0x97,0x76,0xa4,0x82,\r\n0x67,0xac,0x28,0x2d,0x55,0x4b,0xfb,0x35,0xed,0xdb,0x01,0xa2,0x29,0x36,0x05,0x96,0x0a,0x91,0x7f,0xfe,0x5e,0x87,0x90,0x66,0x03,0x4b,0x00,0x01,0x00,0x41,0xff,0xe8,0x04,0x85,0x05,0xbb,0x00,0x36,0x00,0x70,0xbf,0x00,0x0a,0x01,0x85,0x00,0x15,0x00,0x2a,0x01,0x85,0x00,0x27,0x00,0x04,0x01,0x85,0x40,0x11,0x1b,0x1d,0x27,0x1b,0x15,\r\n0x00,0x0f,0x27,0x1b,0x1b,0x27,0x0f,0x00,0x15,0x05,0x38,0x30,0xb8,0x01,0x85,0x40,0x16,0x20,0x0f,0x10,0x07,0x17,0x17,0x1d,0x12,0x00,0x9b,0x2d,0x22,0x10,0x0d,0x22,0x27,0x36,0x36,0x0d,0x27,0x07,0x12,0xb8,0x01,0x80,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0xed,0x12,0x39,0x39,0x11,0x33,\r\n0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x02,0x35,0x34,0x37,0x35,0x24,0x35,0x10,0x21,0x32,0x36,0x35,0x34,0x27,0x17,\r\n0x16,0x15,0x14,0x06,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x30,0xb9,0x5f,0x66,0x81,0xb5,0xdb,0xc2,0xa2,0x89,0x86,0x60,0x2f,0x57,0x5b,0x3f,0x53,0xfa,0xb6,0xc1,0x62,0x44,0xfe,0xe9,0x01,0x9a,0x43,0x56,0x06,0x9d,0x04,0xac,0x82,0x87,0x7b,0x89,0x6c,0x2b,0x2d,0xed,0x03,0x1a,0x1c,0x0e,0x59,0x48,0x3d,0x3d,0x05,\r\n0x07,0x79,0x75,0x6d,0x86,0x28,0x8b,0x1b,0x38,0x27,0x50,0x06,0x05,0x3d,0x7b,0x62,0x66,0x4a,0x02,0x45,0xdb,0x01,0x25,0x25,0x22,0x17,0x12,0x33,0x12,0x1e,0x49,0x5f,0x47,0x47,0x43,0x50,0x03,0x23,0x00,0x02,0x00,0x36,0xff,0xe8,0x04,0xaf,0x05,0xb2,0x00,0x1d,0x00,0x29,0x00,0x53,0xb1,0x21,0x16,0xbb,0x01,0x85,0x00,0x07,0x00,0x27,\r\n0x01,0x85,0x40,0x0d,0x0f,0x07,0x0f,0x07,0x0f,0x2b,0x00,0x8b,0x1d,0x1d,0x00,0x21,0x1e,0xb8,0x01,0x80,0x40,0x09,0x0c,0x09,0x0c,0x00,0x0c,0x00,0x0c,0x12,0x03,0xb8,0x01,0x80,0xb5,0x1a,0x19,0x24,0x9b,0x12,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,\r\n0x2f,0x2f,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x13,0x12,0x12,0x33,0x32,0x36,0x12,0x35,0x34,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x03,0x25,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xd1,0x2c,0xcf,0xb5,0x76,0xb8,0x62,0x04,0x02,0x7d,0x9b,0xa1,0xc9,\r\n0xc0,0xa2,0x89,0xce,0x6d,0x89,0xfd,0xa2,0xf8,0xfe,0xde,0x37,0x02,0xb4,0x42,0x89,0x3d,0x21,0x83,0x52,0x5e,0x77,0x6d,0x03,0x23,0xfe,0x94,0xfe,0xcc,0x92,0x01,0x00,0x97,0x3d,0x3a,0x6a,0xdb,0xb0,0xa5,0xc9,0xbf,0xfe,0x9b,0xed,0xc9,0xfe,0xc0,0xb0,0x01,0x70,0x01,0xa2,0x5a,0x47,0x44,0x91,0xa7,0x73,0x5f,0x6c,0x85,0x00,0x00,0x01,\r\n0x00,0x80,0xff,0xe8,0x04,0x3e,0x05,0xbc,0x00,0x14,0x00,0x33,0x40,0x14,0x14,0x00,0x09,0x0a,0x00,0x0a,0x00,0x0a,0x16,0x04,0x8b,0x10,0x0a,0x09,0x09,0x0d,0x00,0x14,0x07,0x07,0xb8,0x01,0x80,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,\r\n0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x13,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x01,0x03,0x7c,0xfe,0x6e,0x6f,0x5e,0x90,0x74,0xe9,0xab,0x89,0x7c,0xfd,0xa0,0xbb,0xea,0x6c,0x71,0x01,0x96,0x05,0x5f,0xfd,0xdf,0x97,0xd8,0x5a,0x6a,0x88,0x01,0x3b,0x57,0xd3,0xac,0xe3,0xaf,0x7c,0x01,0x07,0x98,0x02,0x27,0x00,0x02,\r\n0x00,0x7d,0xff,0xe8,0x04,0x96,0x05,0xb5,0x00,0x03,0x00,0x18,0x00,0x58,0x40,0x13,0x03,0x00,0x15,0x16,0x01,0x02,0x0b,0x0c,0x00,0x16,0x02,0x0c,0x0c,0x02,0x16,0x00,0x04,0x1a,0x04,0xb8,0x01,0x85,0x40,0x13,0x12,0x0c,0x0b,0x00,0x03,0x02,0x01,0x0b,0x03,0x01,0x01,0x03,0x0b,0x03,0x0e,0x16,0x15,0x07,0x08,0xb8,0x01,0x80,0xb1,0x0e,\r\n0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x01,0x17,0x01,0x25,0x14,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x37,0x17,0x06,0x02,0x02,\r\n0x1d,0x01,0xb1,0x71,0xfe,0x52,0xfe,0x8a,0x72,0xc8,0x78,0x61,0xa7,0x51,0x70,0xce,0xf5,0xae,0xfe,0xef,0x97,0xdc,0xca,0x70,0xad,0xcb,0x02,0x68,0x01,0x8c,0x73,0xfe,0x75,0x9a,0x99,0xf0,0x84,0x49,0x43,0x73,0xb4,0xab,0x01,0x3c,0xcc,0xe6,0x01,0x97,0x9d,0x75,0x84,0xfe,0x90,0x00,0x00,0x02,0x00,0x82,0x00,0xd7,0x04,0x4f,0x04,0x89,\r\n0x00,0x0f,0x00,0x1c,0x00,0x22,0x40,0x09,0x08,0x89,0x10,0x10,0x1e,0x16,0x89,0x00,0x19,0xb8,0x01,0x80,0xb4,0x0c,0x13,0x9b,0x04,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x36,0x82,0x81,0xe3,0x83,0x81,0xe3,0x82,0x84,0xe2,0x80,0x81,0xe3,0x83,0x03,0x26,0xb9,0x86,0x84,0xbc,0xbb,0x85,0x55,0x94,0x56,0x02,0xb0,0x7d,0xda,0x82,0x80,0xdc,0x7d,0x7e,0xdc,0x7f,0x80,0xdc,0x7d,0x84,0xbc,0xbc,0x84,0x82,0xbd,0x54,0x96,0x00,0x00,0x02,0x00,0x82,0xff,0xe2,0x03,0x7f,0x05,0x7d,0x00,0x15,\r\n0x00,0x21,0x00,0x3b,0x40,0x0e,0x08,0x8a,0x13,0x12,0x16,0x12,0x16,0x12,0x23,0x0e,0x1c,0x89,0x00,0x1f,0xb8,0x01,0x80,0x40,0x0d,0x0e,0x04,0x0c,0x0c,0x13,0x19,0x9b,0x04,0x06,0x12,0x9a,0x13,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x31,0x30,0x13,\r\n0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x27,0x1e,0x02,0x17,0x07,0x24,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x82,0x69,0xb2,0x67,0x65,0xb1,0x65,0x64,0xb2,0x65,0x68,0x47,0x1b,0x8c,0xe0,0x84,0x56,0xfe,0xcc,0xfe,0xac,0x02,0x58,0x7d,0x59,0x55,0x7f,0x7e,0x56,0x59,0x7d,0x03,\r\n0xe5,0x6c,0xbe,0x6e,0x69,0xb1,0x62,0x64,0xae,0x68,0x33,0x72,0xe3,0xc1,0x3c,0x86,0x92,0x02,0x27,0x01,0x66,0x5c,0x84,0x8b,0x63,0x58,0x7c,0x87,0x00,0x02,0x00,0x96,0xff,0xe2,0x03,0x93,0x05,0x7d,0x00,0x17,0x00,0x23,0x00,0x3d,0x40,0x0f,0x03,0x04,0x0a,0x00,0x89,0x1e,0x04,0x1e,0x04,0x1e,0x25,0x18,0x89,0x10,0x1b,0xb8,0x01,0x80,\r\n0x40,0x0d,0x0a,0x14,0x0c,0x0c,0x03,0x21,0x9b,0x14,0x06,0x04,0x9a,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x11,0x33,0x31,0x30,0x01,0x10,0x00,0x05,0x27,0x36,0x36,0x37,0x15,0x36,0x37,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,\r\n0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x93,0xfe,0xaa,0xfe,0xcf,0x55,0x68,0xbc,0x44,0x74,0x2e,0x49,0x67,0x65,0xb1,0x65,0x67,0xb0,0x64,0x66,0xb3,0x69,0xfd,0xaa,0x7d,0x57,0x57,0x7d,0x7d,0x57,0x58,0x7c,0x03,0xe5,0xfe,0xb7,0xfd,0xd7,0x91,0x86,0x31,0x90,0x4f,0x01,0x91,0xb2,0x33,0x67,0xaf,0x64,\r\n0x64,0xb1,0x67,0x6e,0xbe,0x50,0x5d,0x85,0x7d,0x57,0x62,0x8c,0x83,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0x4c,0x05,0x7d,0x00,0x33,0x00,0x57,0x40,0x1a,0x11,0x10,0x14,0x89,0x0d,0x22,0x32,0x8a,0x33,0x29,0x8a,0x2a,0x10,0x0d,0x33,0x2a,0x2a,0x33,0x0d,0x10,0x04,0x35,0x07,0x89,0x1b,0x0a,0xb8,0x01,0x81,0x40,0x11,0x10,0x22,0x11,\r\n0x17,0x11,0x17,0x11,0x1f,0x2a,0x33,0x18,0x2e,0x04,0x9b,0x25,0x1f,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,\r\n0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0xaf,0x31,0x4f,0x27,0x5c,0x82,0x4c,0x36,0x17,0x1c,0x2e,0x27,0x33,0x52,0x77,0x80,0x5a,0x50,0x8b,0x4f,0x61,0xb4,0x74,0x4f,\r\n0x86,0x1d,0x2a,0x7f,0x4e,0xa1,0xb7,0xa4,0x69,0x46,0x4a,0x5c,0xa4,0x03,0xe7,0x3f,0x76,0x45,0xc8,0x91,0x6d,0x9d,0x26,0x19,0x16,0x2e,0x11,0x8d,0x04,0x87,0x57,0x5f,0x88,0x77,0xc7,0x74,0x8f,0xe5,0x81,0x53,0x40,0x48,0x4b,0xc0,0xa2,0xfb,0xe5,0x04,0x1b,0x4f,0x77,0x8d,0x6d,0xfc,0x19,0x00,0x00,0x02,0x00,0x64,0xff,0xe5,0x05,0x0b,\r\n0x05,0xa9,0x00,0x17,0x00,0x23,0x00,0x53,0x40,0x29,0x1e,0x89,0x00,0x10,0x89,0x18,0x0b,0x8b,0x0a,0x08,0x1b,0x03,0x03,0x00,0x0d,0x18,0x0a,0x00,0x18,0x0a,0x0a,0x18,0x00,0x03,0x25,0x06,0x89,0x05,0x0b,0x05,0x05,0x08,0x03,0x0d,0x1b,0x04,0x14,0x0a,0x06,0x07,0x21,0xb8,0x01,0x80,0xb1,0x14,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,\r\n0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x12,0x05,0x36,0x13,0x17,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,\r\n0x27,0x95,0x84,0xee,0xee,0xa6,0xa6,0x01,0x1e,0xc3,0xe1,0x99,0xd6,0xde,0x85,0x93,0x72,0xc3,0x6f,0x6f,0xc1,0x74,0x02,0xa0,0x8c,0x70,0x73,0x8a,0x94,0x69,0x67,0x95,0x01,0x60,0x87,0xfa,0x57,0x94,0x01,0x9b,0x42,0xfe,0xa2,0xb0,0x6d,0x01,0x87,0x43,0xfe,0x8d,0xa2,0x64,0xf1,0x74,0x6e,0xb5,0x66,0x65,0xb1,0x72,0x5f,0xc7,0x3f,0x38,\r\n0xcf,0x6b,0x5c,0x84,0x8b,0x00,0x00,0x03,0x00,0x64,0xff,0xe5,0x05,0x23,0x05,0x7d,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x6e,0x40,0x39,0x37,0x89,0x0a,0x1d,0x89,0x25,0x12,0x89,0x31,0x19,0x18,0x3a,0x28,0x03,0x08,0x04,0x0a,0x25,0x15,0x1b,0x31,0x18,0x0a,0x25,0x31,0x18,0x18,0x31,0x25,0x0a,0x04,0x3e,0x06,0x05,0x2b,0x89,0x00,0x18,\r\n0x05,0x08,0x3a,0x15,0x03,0x28,0x1b,0x06,0x06,0x19,0x06,0x19,0x06,0x21,0x34,0x9b,0x0e,0x06,0x2e,0xb8,0x01,0x80,0xb1,0x21,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x32,0x33,0x01,0x2f,0xed,0xc6,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x12,0x17,0x39,0x11,0x33,0x10,0xed,\r\n0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,\r\n0x17,0x36,0x36,0x01,0x0b,0x7d,0x6e,0xc8,0xca,0x86,0x80,0x8c,0x49,0x63,0xaa,0x61,0x5c,0xa4,0x60,0x89,0x5f,0x73,0xba,0x63,0x88,0x60,0x82,0x48,0x66,0xb0,0x64,0x65,0xb0,0x67,0x02,0x50,0x50,0x43,0x7d,0x97,0x7c,0x57,0x56,0x7e,0x79,0x6d,0x4c,0x52,0x74,0x4f,0x45,0x6a,0x81,0x01,0x47,0x57,0xb0,0x47,0x59,0x01,0x24,0x65,0xe0,0x56,\r\n0x62,0x78,0x5d,0xa5,0x60,0x64,0xab,0x60,0x5d,0xb5,0x3b,0x2b,0xa3,0x89,0x65,0xaa,0x5c,0x7e,0x62,0x55,0x98,0x59,0x60,0xa4,0x42,0x54,0x9f,0x32,0x29,0x95,0x4b,0x53,0x74,0x62,0x03,0x2c,0x56,0x7d,0x74,0x52,0x3f,0x8a,0x3d,0x38,0x89,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x04,0xe2,0x05,0x7d,0x00,0x2f,0x00,0x57,0x40,0x16,0x12,0x89,\r\n0x1f,0x2c,0x89,0x05,0x1f,0x05,0x1f,0x05,0x24,0x31,0x19,0x18,0x18,0x00,0x0c,0x89,0x24,0x18,0x19,0x1c,0xb8,0x01,0x80,0x40,0x0f,0x15,0x0c,0x28,0x1f,0x15,0x19,0x15,0x19,0x15,0x00,0x09,0x9b,0x28,0x06,0x01,0xb8,0x01,0x81,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x12,0x39,0x10,0xed,0x11,0x33,\r\n0x01,0x2f,0xed,0xc4,0x39,0x2f,0x33,0x11,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x33,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,\r\n0x10,0x00,0x21,0x64,0xcc,0x01,0x42,0x01,0xc7,0x56,0x94,0x56,0x57,0x7e,0x37,0x2e,0x43,0x4b,0xc1,0x86,0x61,0xc1,0x42,0x86,0x36,0x75,0x33,0x44,0x5c,0x76,0x3a,0x42,0x66,0xaf,0x66,0x81,0xe4,0x84,0xfd,0xd4,0xfe,0x7a,0xa7,0x01,0x9f,0x01,0x27,0x63,0xad,0x64,0x54,0x3c,0x17,0x39,0x1a,0x26,0x6b,0x3a,0x77,0xa7,0x77,0x76,0x55,0x50,\r\n0x57,0x46,0x2f,0x3e,0x3d,0x1f,0x6e,0x3d,0x4f,0x8b,0x50,0x90,0xf5,0x8b,0xfe,0x94,0xfd,0xff,0x00,0x02,0x00,0x64,0xff,0xe5,0x04,0xed,0x05,0x7d,0x00,0x27,0x00,0x33,0x00,0x50,0x40,0x13,0x24,0x89,0x05,0x15,0x89,0x2e,0x05,0x2e,0x00,0x00,0x2e,0x05,0x03,0x35,0x28,0x0d,0x8a,0x1c,0x2b,0xb8,0x01,0x80,0x40,0x10,0x18,0x31,0x9b,0x12,\r\n0x0f,0x12,0x18,0x12,0x18,0x12,0x00,0x09,0x9b,0x20,0x06,0x01,0xb8,0x01,0x80,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x17,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,\r\n0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x10,0x00,0x21,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x64,0x95,0x01,0x5e,0x01,0xef,0x73,0xcc,0x72,0x69,0xb8,0x6b,0x09,0x27,0x7d,0x4a,0x77,0xa0,0xa0,0x70,0x6e,0xc4,0x71,0x99,0x01,0x06,\r\n0x92,0x9f,0x01,0x17,0xa2,0xfd,0xab,0xfe,0x61,0x79,0x11,0x53,0x31,0x2e,0x3b,0x46,0x2a,0x30,0x50,0x1b,0x9c,0x01,0xad,0x01,0x32,0x66,0xb3,0x68,0x5e,0xa2,0x5e,0x18,0x26,0x43,0x54,0x9a,0x69,0x6b,0x98,0x75,0xc9,0x6f,0x86,0xec,0x88,0x92,0xfd,0x8e,0xfe,0x8b,0xfd,0xfa,0x02,0xcb,0x1b,0x24,0x40,0x28,0x26,0x36,0x4c,0x00,0x00,0x01,\r\n0x00,0xb4,0x00,0x00,0x04,0x5a,0x05,0x42,0x00,0x05,0x00,0x16,0x40,0x0a,0x01,0x04,0x89,0x05,0x05,0x18,0x03,0x9b,0x00,0x06,0x00,0x3f,0xed,0x3f,0x01,0x2f,0xfd,0xc4,0x31,0x30,0x13,0x21,0x15,0x21,0x11,0x23,0xb4,0x03,0xa6,0xfd,0x02,0xa8,0x05,0x42,0x99,0xfb,0x57,0x00,0x00,0x01,0x00,0x82,0xff,0xe2,0x03,0xf2,0x05,0x62,0x00,0x16,\r\n0x00,0x3b,0x40,0x1d,0x04,0x03,0x0c,0x08,0x89,0x13,0x12,0x0c,0x00,0x05,0x12,0x05,0x12,0x18,0x0f,0x89,0x00,0x0c,0x05,0x0b,0x0b,0x03,0x12,0x99,0x13,0x19,0x06,0x03,0x06,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0xed,0x11,0x33,0x33,0x31,0x30,0x13,0x34,0x12,\r\n0x37,0x33,0x01,0x11,0x33,0x11,0x14,0x06,0x23,0x01,0x06,0x06,0x15,0x14,0x00,0x17,0x07,0x26,0x24,0x02,0x82,0xb1,0x9b,0x1b,0x01,0x62,0xa7,0x1e,0x13,0xfe,0x14,0x56,0x54,0x01,0x19,0xec,0x43,0xac,0xfe,0xe0,0x9f,0x02,0xe5,0xac,0x01,0x58,0x79,0xfe,0x8f,0x01,0x71,0xfd,0x5b,0x0b,0x13,0x01,0xf5,0x51,0xde,0x80,0xcd,0xfe,0xb1,0x51,\r\n0x96,0x3b,0xf3,0x01,0x35,0x00,0x00,0x02,0x00,0x77,0xff,0xe8,0x04,0x41,0x05,0x48,0x00,0x0b,0x00,0x17,0x00,0x20,0x40,0x10,0x00,0x89,0x0c,0x0c,0x19,0x12,0x89,0x06,0x09,0x99,0x0f,0x06,0x15,0x99,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,\r\n0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0x41,0xfb,0xeb,0xea,0xfa,0xfa,0xea,0xeb,0xfb,0xab,0x9a,0xa1,0xa1,0x98,0x97,0xa2,0xa2,0x99,0x02,0x97,0xfe,0xa8,0xfe,0xa9,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x58,0xfe,0xa8,0xfe,0xa7,0x01,0x17,0x01,0x06,0xfe,0xf7,0xfe,0xec,0xfe,0xeb,0xfe,0xfc,0x01,\r\n0x02,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x05,0x94,0x05,0x31,0x00,0x1d,0x00,0x21,0x00,0x2d,0x00,0x57,0x40,0x30,0x21,0x89,0x14,0x19,0x0a,0x89,0x2d,0x1e,0x2d,0x00,0x89,0x07,0x14,0x2d,0x03,0x07,0x17,0x17,0x07,0x03,0x2d,0x14,0x05,0x2f,0x26,0x89,0x11,0x09,0x23,0x9b,0x14,0x19,0x21,0x21,0x0d,0x18,0x20,0x9b,0x15,0x06,0x2a,0x99,\r\n0x0d,0x18,0x04,0x99,0x03,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x35,0x32,0x36,0x35,0x10,0x21,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,\r\n0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x16,0x16,0x01,0x11,0x21,0x11,0x05,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x05,0x94,0xdd,0xae,0x68,0x78,0xfe,0xc6,0xd0,0xd0,0x6e,0xce,0x83,0x8d,0x7d,0x03,0x58,0xfe,0xfd,0x39,0x72,0xc5,0x75,0xfd,0x73,0xfe,0xfb,0x01,0x05,0xfe,0xc8,0x61,0x6f,0x56,0x85,0x3b,0x79,0x79,0x01,\r\n0xc0,0xc9,0xf5,0x02,0x95,0x92,0x89,0x01,0x04,0xd5,0xff,0xe0,0x88,0xe7,0x71,0x86,0xb7,0x13,0x02,0x01,0x94,0xfe,0xab,0x65,0xb8,0x01,0x1d,0x01,0x55,0xfe,0xab,0x94,0x72,0x62,0x49,0x9c,0x66,0xad,0xbe,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x05,0xf0,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x62,0xb4,0x23,0x89,0x0d,0x13,0x16,0xb8,0x01,\r\n0x84,0x40,0x0f,0x2f,0x2a,0x89,0x04,0x00,0x0d,0x2f,0x04,0x04,0x2f,0x0d,0x00,0x04,0x3c,0x35,0xbe,0x01,0x84,0x00,0x1c,0x00,0x32,0x01,0x7e,0x00,0x13,0x00,0x38,0x01,0x7e,0x40,0x12,0x19,0x08,0x27,0x27,0x19,0x13,0x19,0x13,0x19,0x01,0x10,0x9b,0x20,0x06,0x2d,0x99,0x01,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,\r\n0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x26,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,\r\n0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xf0,0xfb,0xe3,0xc7,0xa3,0x45,0x70,0x90,0x96,0x90,0x70,0x45,0xb7,0x9b,0x4d,0x6f,0x33,0x84,0x7d,0x98,0x6d,0x69,0x8b,0x89,0xda,0x88,0xe2,0x01,0x16,0x83,0xf2,0xad,0x8d,0x70,0x56,0x82,0x04,0x04,0xfb,0xcf,0x46,0x2d,0x2f,0x44,0x43,0x30,0x2f,\r\n0x44,0x60,0x6e,0x4a,0x61,0x42,0x2e,0x2d,0x36,0x52,0x7a,0x5a,0x90,0xa5,0x30,0x2f,0x04,0x80,0x7c,0x61,0x8a,0x97,0x6a,0x7d,0xe0,0x76,0xf2,0xc9,0x8a,0xd0,0x79,0x2e,0x25,0x3f,0x2c,0x2e,0x23,0x02,0xbf,0x31,0x47,0x48,0x30,0x33,0x45,0x45,0x00,0x01,0x00,0x8c,0x00,0x00,0x05,0xd1,0x05,0x31,0x00,0x20,0x00,0x51,0x40,0x2b,0x16,0x0c,\r\n0x89,0x0d,0x1f,0x1c,0x89,0x05,0x14,0x00,0x05,0x0d,0x01,0x05,0x05,0x01,0x0d,0x03,0x22,0x10,0x89,0x11,0x02,0x1f,0x99,0x01,0x08,0x9b,0x16,0x01,0x19,0x19,0x12,0x01,0x18,0x15,0x0f,0x9b,0x12,0x06,0x0d,0x11,0x18,0x00,0x3f,0x33,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,\r\n0x2f,0x2f,0x11,0x39,0x39,0x10,0xed,0x32,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x05,0xd1,0xfd,0xf0,0x61,0x84,0x7b,0x6b,0x47,0x54,0x3d,0xa8,0xfe,0xf4,0xa8,0x02,0xce,0x72,\r\n0x3e,0x64,0x45,0xa8,0xd7,0x45,0x38,0x01,0x00,0x95,0x0d,0xbe,0x7a,0x81,0x9b,0x1e,0x32,0xfd,0x5a,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfe,0xb5,0x20,0x19,0xe8,0xaf,0x5e,0xbf,0x43,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x05,0xa3,0x05,0x31,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x50,0x40,0x2b,0x18,0x89,0x0c,0x11,0x02,0x89,0x24,0x15,\r\n0x24,0x00,0x89,0x12,0x0c,0x24,0x0f,0x12,0x12,0x0f,0x24,0x0c,0x04,0x26,0x1e,0x89,0x09,0x01,0x1a,0x9b,0x11,0x0c,0x18,0x18,0x05,0x10,0x17,0x9b,0x13,0x0d,0x06,0x21,0x99,0x05,0x18,0x00,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,\r\n0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x21,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x33,0x01,0x11,0x21,0x11,0x05,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x05,0xa3,0xfe,0x20,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x02,0xd0,0x6d,0x01,0x38,0xa8,0xfd,0x78,0xfe,0xed,\r\n0x01,0x13,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0x02,0xb4,0x90,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0x94,0xfe,0xab,0x01,0xe9,0xfe,0x17,0x01,0x55,0xfe,0xab,0x94,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0x00,0x01,0x00,0x8c,0xfd,0xb9,0x07,0x18,0x07,0x21,0x00,0x34,0x00,0x62,0x40,0x35,0x19,0x89,0x1a,0x1f,\r\n0x15,0x89,0x16,0x24,0x8a,0x0f,0x34,0x8a,0x00,0x1d,0x16,0x0f,0x1a,0x16,0x0f,0x00,0x00,0x0f,0x16,0x1a,0x04,0x36,0x08,0x89,0x2c,0x1e,0x18,0x9b,0x1b,0x04,0x9b,0x30,0x1b,0x12,0x9b,0x1f,0x21,0x00,0x21,0x00,0x1a,0x1b,0x06,0x0c,0x99,0x28,0x16,0x1a,0x18,0x00,0x3f,0x33,0xd4,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x39,0xed,0x10,0xd4,\r\n0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x02,0x02,0x24,0x23,0x22,0x04,0x02,0x11,0x10,0x12,0x04,0x33,0x20,0x00,0x11,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x33,0x32,0x16,\r\n0x15,0x14,0x02,0x04,0x23,0x20,0x00,0x02,0x11,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x13,0x06,0x76,0x07,0xa4,0xfe,0xde,0xba,0xd3,0xfe,0xc7,0xad,0x9d,0x01,0x1e,0xc8,0x01,0x0b,0x01,0x2e,0x5d,0x4f,0x70,0x37,0xa8,0xee,0xa8,0x02,0xb0,0x72,0x53,0x55,0xa1,0xae,0xb5,0xfe,0xb2,0xd6,0xfe,0xff,0xfe,0x93,0xc3,0xd3,0x01,0x8c,0x01,0x10,\r\n0xe3,0x01,0x63,0xcb,0x0c,0x03,0x1d,0x01,0x03,0x01,0x91,0xdc,0xf7,0xfe,0x22,0xfe,0xbc,0xfe,0xb2,0xfe,0x1c,0xf5,0x01,0x6b,0x01,0x4f,0x72,0x8c,0x51,0xfe,0x4c,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfd,0xaa,0x51,0xe9,0xdd,0xed,0xfe,0x96,0xc2,0x01,0x18,0x02,0x22,0x01,0x81,0x01,0x71,0x02,0x22,0x01,0x1a,0xfe,0xfe,0x2c,0xfe,0xce,\r\n0x00,0x03,0x00,0x50,0x00,0x00,0x07,0x45,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x3e,0x00,0x7a,0x40,0x44,0x3e,0x89,0x2d,0x03,0x23,0x89,0x3a,0x3b,0x3a,0x06,0x1d,0x89,0x1e,0x10,0x0d,0x89,0x17,0x2d,0x3a,0x1e,0x01,0x13,0x17,0x12,0x12,0x17,0x13,0x01,0x1e,0x3a,0x2d,0x07,0x40,0x34,0x89,0x2a,0x14,0x10,0x99,0x13,0x19,0x9b,0x06,0x13,\r\n0x0a,0x0a,0x2e,0x13,0x18,0x22,0x30,0x9b,0x03,0x2d,0x3e,0x3e,0x26,0x02,0x3d,0x9b,0x2e,0x06,0x37,0x99,0x26,0x18,0x1e,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,\r\n0x10,0xed,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x15,0x23,0x11,0x16,0x16,0x17,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x21,0x35,0x36,0x36,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x01,0x23,0x22,0x06,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x21,0x11,0x04,0x30,0x6d,0x52,0x75,0x32,0x23,0x50,0x53,0x48,0x94,0xaf,0x3a,0x30,0xa2,0xfe,0xc3,0x28,0x33,0xa1,0x59,0x64,0xa8,0x49,0x51,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x01,0xbb,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0xfe,0xed,0x05,0x31,0x94,0xfe,0xa9,0x0a,0x43,0x40,0x42,0x4d,\r\n0x23,0xd1,0xab,0x64,0xbb,0x3b,0x95,0x93,0x39,0xb3,0x58,0x01,0x00,0x9f,0x95,0xfe,0x5d,0x01,0x94,0x82,0x7e,0x18,0x88,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0xfd,0x83,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0xff,0x01,0x55,0xfe,0xab,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x05,0x5f,0x05,0x31,0x00,0x1a,0x00,0x26,\r\n0x00,0x41,0x40,0x23,0x0f,0x89,0x1b,0x02,0x89,0x03,0x1b,0x03,0x00,0x00,0x03,0x1b,0x03,0x28,0x09,0x21,0x89,0x15,0x1e,0x9b,0x09,0x0c,0x0c,0x12,0x01,0x05,0x9b,0x19,0x06,0x24,0x99,0x12,0x18,0x03,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,\r\n0xed,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x02,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x11,0x34,0x12,0x24,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x5f,0xab,0xa8,0xed,0x99,0xf7,0x90,0x08,0x2c,0x88,0x44,0x96,0xb7,0xbe,0x91,0xcb,0xd2,0xbd,0x01,0x47,0xc3,\r\n0x02,0x48,0xfd,0x32,0x63,0x45,0x47,0x77,0x2a,0x0a,0x79,0x6b,0x44,0x5e,0x04,0x9d,0xfb,0x63,0x04,0x9d,0x8d,0xfe,0xfc,0xa8,0x2b,0x33,0xbf,0x9c,0x9e,0xc8,0x01,0x21,0x01,0x1e,0xd0,0x01,0x5e,0xc3,0xfc,0x27,0x54,0x82,0x3c,0x30,0x8d,0xa0,0x74,0x00,0x00,0x03,0x00,0x32,0xff,0x00,0x06,0xe6,0x05,0x31,0x00,0x2a,0x00,0x34,0x00,0x40,\r\n0x00,0x78,0x40,0x2c,0x29,0x01,0x89,0x02,0x28,0x89,0x11,0x04,0x89,0x2b,0x14,0x17,0x89,0x35,0x3b,0x8a,0x1e,0x0f,0x11,0x2b,0x02,0x11,0x2b,0x35,0x1e,0x1e,0x35,0x2b,0x11,0x02,0x05,0x42,0x2f,0x89,0x0b,0x2a,0x06,0x04,0x2c,0x9b,0x0e,0x28,0x0e,0x3e,0xb8,0x01,0x80,0x40,0x13,0x1a,0x14,0x1a,0x22,0x0e,0x1a,0x0e,0x1a,0x07,0x38,0x9b,\r\n0x22,0x06,0x32,0x99,0x07,0x19,0x02,0x18,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x06,\r\n0x00,0x21,0x22,0x24,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x35,0x34,0x02,0x27,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x07,0x33,0x11,0x01,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x24,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0xe6,0xa8,0xfb,0x59,\r\n0xfe,0x6c,0xfe,0xef,0x8d,0xfe,0xfd,0x83,0xba,0x9a,0x03,0x3c,0x07,0x80,0x78,0x25,0x1b,0xbf,0x92,0x5f,0x97,0x56,0x66,0xc1,0x84,0xb7,0x01,0x0d,0x92,0x06,0xcf,0xfe,0x58,0xfc,0xcb,0x36,0x43,0xd2,0xc5,0xaf,0x01,0x06,0xc9,0x67,0x44,0x44,0x66,0x60,0x4a,0x4b,0x60,0x05,0x31,0xf9,0xf9,0x01,0xdc,0xf9,0xfe,0xf3,0x6e,0xb8,0x75,0x74,\r\n0x8c,0x60,0x31,0xb9,0x01,0x09,0x46,0x25,0x52,0x36,0xa2,0xc1,0x55,0x9f,0x70,0x6d,0xa9,0x5f,0xad,0xfe,0xb1,0xee,0x30,0x48,0x03,0x96,0xfb,0xd5,0x4b,0x35,0x74,0x7d,0xb6,0x03,0x30,0x53,0x7f,0x7d,0x55,0x52,0x6c,0x6e,0x00,0x04,0x00,0x50,0xff,0xe4,0x07,0x4d,0x05,0x31,0x00,0x30,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x91,0x40,0x50,\r\n0x40,0x89,0x20,0x13,0x15,0x08,0x41,0x26,0x03,0x03,0x23,0x23,0x03,0x25,0x15,0x89,0x3c,0x3d,0x3c,0x44,0x8a,0x11,0x0b,0x8a,0x49,0x30,0x00,0x2d,0x8a,0x03,0x00,0x49,0x03,0x20,0x3c,0x11,0x49,0x03,0x03,0x49,0x11,0x3c,0x20,0x05,0x4e,0x36,0x89,0x1d,0x14,0x32,0x9b,0x25,0x20,0x40,0x40,0x19,0x23,0x3f,0x9b,0x21,0x06,0x9b,0x08,0x41,\r\n0x29,0x29,0x0e,0x21,0x06,0x39,0x99,0x19,0x18,0x47,0x99,0x0e,0x18,0x00,0x30,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0xed,0x10,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,\r\n0x10,0xed,0x32,0x11,0x39,0x2f,0x12,0x17,0x39,0x12,0x39,0x10,0xed,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x07,\r\n0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x23,0x11,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x26,0x06,0x43,0x2d,0x3b,0x87,0x73,0x4d,0x42,0x69,0x78,0x88,0x79,0x80,0x9b,0x31,0x9b,0x4b,0xa2,0x87,0x7f,0xc8,0x72,0x72,0x6c,0x02,0xbc,0x6d,0xea,0x3f,0xa8,0x61,0x72,0xc0,0x6c,0x47,0x3d,\r\n0xfc,0x0c,0x63,0x95,0x9b,0x46,0x9c,0x86,0x65,0x52,0xff,0x02,0xf9,0x25,0x20,0x44,0x30,0x62,0x2a,0x46,0x2c,0x43,0xff,0x70,0xca,0xca,0x47,0x35,0xdf,0x8e,0xb4,0xd5,0xe1,0xc0,0x8d,0x86,0x90,0xd0,0xe5,0x6f,0x70,0xd5,0x92,0x86,0xa4,0x2a,0x02,0x06,0x94,0xfe,0xab,0x57,0x65,0x83,0xeb,0x99,0xa0,0xfe,0xda,0x53,0x02,0xd0,0x28,0x5d,\r\n0x5c,0x93,0xab,0xc1,0xf3,0xff,0x01,0x55,0xfe,0xab,0x98,0x33,0x7c,0x65,0x74,0x93,0xf1,0x47,0x80,0x5a,0x00,0x02,0x00,0x72,0xff,0xe5,0x05,0x5b,0x04,0xc9,0x00,0x0f,0x00,0x1f,0x00,0x23,0x40,0x0d,0x0c,0x8b,0x1c,0x1c,0x21,0x14,0x8b,0x04,0x10,0x9b,0x08,0x06,0x18,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,\r\n0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x02,0xe6,0xa6,0xfe,0xdc,0xaa,0xa9,0x01,0x25,0xa6,0xa8,0x01,0x24,0xa9,0xa9,0xfe,0xdb,0xa7,0x7f,0xda,0x80,0x7f,0xda,0x80,0x7f,\r\n0xda,0x80,0x80,0xd9,0x1b,0xa6,0x01,0x21,0xab,0xa9,0x01,0x22,0xa7,0xa7,0xfe,0xdd,0xa8,0xa8,0xfe,0xdd,0xa7,0x04,0x5b,0x7f,0xdf,0x81,0x80,0xdd,0x7e,0x7d,0xdd,0x81,0x81,0xe0,0x7e,0x00,0x00,0x01,0x00,0x74,0xff,0xe6,0x06,0x74,0x04,0xc9,0x00,0x1b,0x00,0x3e,0xb4,0x07,0x06,0x15,0x16,0x12,0xb8,0x01,0x85,0x40,0x0a,0x18,0x06,0x16,\r\n0x18,0x18,0x16,0x06,0x03,0x1d,0x04,0xb8,0x01,0x85,0x40,0x0b,0x0a,0x00,0x9b,0x0e,0x06,0x16,0x06,0x06,0x15,0x07,0x19,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x22,0x04,0x06,0x15,0x10,0x05,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,\r\n0x04,0x12,0x15,0x14,0x02,0x07,0x27,0x24,0x11,0x34,0x26,0x24,0x03,0x74,0xaa,0xfe,0xe8,0xa0,0x01,0x32,0x62,0xaf,0xbf,0xc1,0x01,0x61,0xde,0xe0,0x01,0x60,0xc0,0xbf,0xb0,0x61,0x01,0x31,0xa0,0xfe,0xea,0x04,0x33,0x89,0xef,0x88,0xfe,0xef,0xc2,0x7a,0x6a,0x01,0x37,0xac,0xb7,0x01,0x32,0xad,0xaf,0xfe,0xcf,0xb6,0xac,0xfe,0xc8,0x69,\r\n0x7a,0xc2,0x01,0x11,0x88,0xef,0x89,0x00,0x00,0x02,0x00,0x60,0x00,0x00,0x06,0x3d,0x04,0xdc,0x00,0x1e,0x00,0x2a,0x00,0x45,0xb9,0x00,0x19,0x01,0x85,0x40,0x12,0x05,0x08,0x0a,0x8b,0x1f,0x25,0x8b,0x11,0x05,0x1f,0x11,0x11,0x1f,0x05,0x03,0x2c,0x00,0x28,0xb8,0x01,0x80,0x40,0x0c,0x08,0x0e,0x0e,0x15,0x00,0x99,0x1e,0x18,0x22,0x9b,\r\n0x15,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x37,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x01,0x34,0x26,0x27,\r\n0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x60,0x03,0x61,0x87,0xe4,0x72,0xb2,0x8d,0x2c,0x4e,0x81,0x4b,0x72,0x9c,0x66,0xb0,0x5f,0x99,0x01,0x21,0xab,0x9b,0xfe,0xcd,0xae,0xfc,0x9f,0x03,0x91,0x31,0x2f,0x40,0x57,0x4b,0x32,0x33,0x47,0x97,0x7d,0xd7,0x8e,0x95,0xf7,0x31,0x44,0x45,0x42,0x81,0x4b,0x9f,0x73,0x55,0x88,0x4e,0xac,0xfe,\r\n0xe0,0xa5,0xb1,0xfe,0xee,0xa8,0x03,0xb1,0x28,0x4e,0x1f,0x0b,0x57,0x33,0x33,0x47,0x47,0x00,0x00,0x01,0x00,0x58,0xff,0xe7,0x03,0xcf,0x04,0xc9,0x00,0x28,0x00,0x53,0x40,0x2c,0x23,0x8b,0x17,0x00,0x8b,0x0e,0x26,0x0e,0x12,0x17,0x0e,0x0e,0x17,0x12,0x03,0x2a,0x1c,0x1d,0x07,0x06,0x06,0x07,0x26,0x12,0x9b,0x13,0x1d,0x1c,0x07,0x13,\r\n0x1c,0x1c,0x13,0x07,0x03,0x1f,0x0a,0x99,0x04,0x19,0x1a,0x9b,0x1f,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x39,0x11,0x33,0x01,0x2f,0x33,0xc6,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,\r\n0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x03,0xcf,0x75,0xca,0x7b,0xd9,0xe4,0x5a,0x65,0xab,0x53,0x51,0x81,0x4b,0x96,0x77,0xb6,0xb6,0x77,0x83,0x98,0x7d,0x7f,0x95,0x5c,0xa8,0xe6,0x72,0xba,0x68,0x49,0x50,0x4e,0x5e,0x01,0x54,\r\n0x60,0xab,0x62,0xc6,0x7b,0x5b,0x50,0x39,0x64,0x3a,0x60,0x74,0x8d,0x6b,0x58,0x50,0x6d,0x74,0x64,0xa4,0x58,0x9a,0x5a,0x5f,0x84,0x2d,0x2a,0x98,0x00,0x02,0x00,0x73,0xff,0xe8,0x05,0x9f,0x04,0xec,0x00,0x0b,0x00,0x32,0x00,0x66,0x40,0x36,0x16,0x8b,0x0f,0x13,0x12,0x1d,0x8b,0x03,0x08,0x8b,0x23,0x2a,0x2b,0x1a,0x12,0x25,0x03,0x23,\r\n0x0f,0x12,0x03,0x23,0x2b,0x2b,0x23,0x03,0x12,0x0f,0x05,0x34,0x2e,0x8b,0x28,0x2b,0x2a,0x06,0x9b,0x0c,0x1a,0x26,0x0c,0x20,0x2a,0x0c,0x2a,0x0c,0x13,0x00,0x9a,0x20,0x19,0x12,0x13,0x06,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,\r\n0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x13,0x24,0x36,0x37,0x26,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x24,0x11,0x34,0x37,0x17,0x06,0x06,\r\n0x15,0x14,0x16,0x16,0x17,0x02,0xfe,0x33,0x47,0x47,0x33,0x35,0x45,0x48,0x30,0x01,0x17,0xee,0x05,0x05,0x58,0x51,0x3e,0x7e,0x8b,0x6c,0xca,0xb8,0x27,0x39,0x9d,0x76,0x77,0x9b,0x37,0x27,0xfe,0x29,0x8a,0x5c,0x31,0x1d,0x5c,0xbf,0xb0,0x72,0x44,0x38,0x29,0x4d,0x0e,0x0f,0x4d,0x28,0x39,0x43,0x01,0xa6,0x3b,0xb0,0x7e,0x4f,0x77,0x31,\r\n0x74,0x3c,0xc2,0x6d,0x74,0xaf,0x7d,0x33,0x1e,0x62,0x40,0x6f,0x97,0x98,0x6e,0x37,0x67,0x21,0x67,0x01,0x46,0xa9,0x71,0x66,0x2f,0x59,0x2c,0x4d,0x79,0x54,0x20,0x00,0x00,0x02,0x00,0x5d,0xff,0xc0,0x06,0x59,0x04,0xcd,0x00,0x33,0x00,0x3e,0x00,0x7f,0xb9,0x00,0x1a,0x01,0x84,0x40,0x0a,0x19,0x0a,0x8b,0x34,0x13,0x20,0x3a,0x8b,0x04,\r\n0x00,0xb8,0x01,0x84,0x40,0x14,0x2c,0x02,0x0d,0x20,0x03,0x34,0x2c,0x04,0x2f,0x19,0x34,0x04,0x2f,0x2f,0x04,0x34,0x19,0x04,0x40,0x28,0xb8,0x01,0x84,0x40,0x0c,0x29,0x00,0x2c,0x28,0x2f,0x9b,0x30,0x06,0x29,0x28,0x19,0x3c,0xb8,0x01,0x81,0x40,0x0f,0x02,0x0d,0x25,0x19,0x25,0x19,0x07,0x16,0x99,0x1d,0x19,0x37,0x9b,0x07,0x06,0x00,\r\n0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x39,0xed,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x02,0x17,\r\n0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x27,0x2e,0x03,0x23,0x22,0x00,0x03,0x27,0x36,0x12,0x37,0x26,0x26,0x27,0x37,0x1e,0x02,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x36,0x02,0xbd,0x38,0x3a,0x51,0xa3,0x85,0x80,0xa1,0x6e,0x69,0x30,0x3f,0x2b,0x17,0x0b,0x11,0x05,0x24,0x20,0x29,0x31,\r\n0x0e,0x8b,0x13,0x83,0x63,0x5e,0x79,0x13,0x1d,0x2d,0x40,0x49,0x33,0xe0,0xfe,0xc2,0x66,0x8f,0x3d,0xf0,0xa3,0x2d,0xc1,0x7c,0x21,0x55,0xba,0x9b,0x02,0x01,0x57,0x37,0x38,0x53,0x5e,0x51,0x6a,0x02,0xc8,0x0f,0x06,0x59,0x6d,0x7f,0xa4,0x9e,0x75,0x5e,0x91,0x27,0x25,0x65,0x82,0x82,0x43,0x44,0x16,0x1f,0x5a,0x61,0x18,0x96,0xa0,0x7f,\r\n0x79,0xb5,0x7a,0x4d,0x21,0xfe,0xd0,0xfe,0xc7,0x25,0xdd,0x01,0x4f,0x55,0x9a,0xe7,0x32,0x88,0x14,0x90,0xdb,0x5f,0x38,0x54,0x55,0x41,0x64,0x3f,0x07,0x62,0x00,0x01,0x00,0x73,0x00,0x00,0x05,0xa9,0x04,0xbe,0x00,0x1e,0x00,0x38,0x40,0x1d,0x02,0x00,0x0a,0x13,0x1a,0x1a,0x13,0x0a,0x03,0x20,0x0e,0x17,0x8a,0x04,0x00,0x02,0x14,0x9b,\r\n0x11,0x11,0x08,0x19,0x99,0x1c,0x18,0x0b,0x9b,0x08,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x21,0x21,0x15,\r\n0x21,0x22,0x26,0x73,0xa7,0xa7,0x5c,0xa0,0x5f,0x97,0x7f,0x66,0x6a,0x97,0x7b,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0x01,0x04,0x03,0x8f,0xfc,0x56,0xbc,0xd0,0x01,0x42,0xbd,0x6b,0x6b,0xbe,0x50,0x8c,0x4f,0x92,0x59,0x54,0x5a,0x6f,0x97,0x77,0x61,0xb0,0x97,0xa8,0x00,0x00,0x01,0x00,0x70,0xff,0xe5,0x04,0x44,0x04,0xc9,0x00,0x2e,0x00,0x54,\r\n0xb3,0x04,0x8a,0x03,0x22,0xb8,0x01,0x85,0x40,0x0d,0x14,0x1a,0x8b,0x1b,0x03,0x14,0x1b,0x1b,0x14,0x03,0x03,0x30,0x2c,0xb8,0x01,0x85,0x40,0x11,0x0b,0x2c,0x07,0x03,0x14,0x1b,0x1e,0x03,0x1b,0x03,0x1b,0x07,0x17,0x9b,0x1e,0x06,0x00,0xb8,0x01,0x80,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,\r\n0x11,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x32,0x36,0x37,0x33,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x0e,0x03,0x07,0x0e,0x02,0x15,0x14,0x16,0x02,0x56,\r\n0x95,0xa1,0x16,0xa2,0x18,0xfe,0xff,0xd5,0x8b,0xdf,0x7c,0x2e,0x5c,0x9a,0x95,0x8b,0x6f,0x3b,0xa5,0x6e,0x75,0x97,0x0d,0x9b,0xf9,0xbb,0x7b,0xc6,0x72,0x24,0x3d,0x59,0x6f,0x81,0x94,0x71,0x3e,0xad,0x7d,0x7c,0x7b,0xbd,0xd2,0x56,0x9e,0x6b,0x49,0x71,0x54,0x42,0x22,0x20,0x32,0x44,0x32,0x4c,0x6a,0x74,0x68,0xa1,0xd0,0x59,0x9b,0x53,\r\n0x40,0x5f,0x48,0x33,0x27,0x1e,0x21,0x35,0x4d,0x38,0x5f,0x6c,0x00,0x01,0x00,0x74,0xff,0xe7,0x06,0x8b,0x04,0xc9,0x00,0x20,0x00,0x42,0xb1,0x03,0x06,0xb8,0x01,0x85,0x40,0x0c,0x1d,0x12,0x20,0x1d,0x01,0x01,0x1d,0x20,0x12,0x04,0x22,0x15,0xb8,0x01,0x85,0xb5,0x0e,0x12,0x11,0x11,0x00,0x19,0xb8,0x01,0x81,0xb6,0x0a,0x19,0x20,0x03,\r\n0x9b,0x00,0x06,0x00,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x15,0x21,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x02,0x27,0x03,0x21,0x03,\r\n0x6a,0xfd,0xd4,0x7c,0x81,0xa4,0xfe,0xd4,0xa4,0xa4,0xfe,0xd3,0xa3,0x7c,0x6e,0x5b,0x4d,0x58,0x7c,0xdb,0x7d,0x7c,0xdc,0x7c,0xdb,0xc0,0x04,0xc9,0x8b,0x5d,0xfb,0x91,0xa9,0xfe,0xe8,0xad,0xad,0x01,0x19,0xa8,0x92,0xfb,0x5a,0x6e,0x40,0xc9,0x70,0x7d,0xd3,0x7b,0x7b,0xd4,0x7c,0xae,0x01,0x02,0x3b,0x00,0x00,0x01,0x00,0x73,0x00,0x00,\r\n0x05,0xa9,0x04,0xbe,0x00,0x1e,0x00,0x38,0x40,0x1d,0x1d,0x1b,0x16,0x0e,0x04,0x04,0x0e,0x16,0x03,0x20,0x08,0x12,0x8a,0x00,0x1b,0x1d,0x0f,0x9b,0x0c,0x0c,0x03,0x14,0x99,0x17,0x18,0x06,0x9b,0x03,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x31,0x30,\r\n0x13,0x34,0x36,0x33,0x21,0x15,0x21,0x20,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x34,0x37,0x26,0x73,0xcf,0xbd,0x03,0xaa,0xfc,0x71,0xfe,0xfc,0x43,0x7a,0x55,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0xd0,0x7f,0x97,0x60,0xa0,0x5b,0xa7,0xa7,0x03,0x7b,0x99,0xaa,0x98,0xb0,0x3c,\r\n0x64,0x38,0x96,0x70,0x59,0xa8,0x97,0x50,0x8b,0x50,0xbd,0x6b,0x6b,0x00,0x00,0x02,0x00,0x82,0x00,0x00,0x05,0x05,0x04,0xac,0x00,0x0f,0x00,0x1f,0x00,0x23,0x40,0x0d,0x00,0x8a,0x10,0x10,0x21,0x18,0x8a,0x08,0x14,0x9b,0x0c,0x06,0x1c,0xb8,0x01,0x81,0xb1,0x04,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,\r\n0x30,0x01,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x07,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x05,0x05,0x9b,0xfe,0xf4,0x9b,0x9c,0xfe,0xf6,0x9b,0x9a,0x01,0x0d,0x9a,0x9a,0x01,0x0c,0x9c,0xa5,0x6c,0xc0,0x71,0x70,0xc1,0x6c,0x6e,0xbe,0x71,0x70,0xbf,0x6e,\r\n0x02,0x55,0xa2,0xfe,0xea,0x9d,0x9f,0x01,0x14,0xa2,0xa1,0x01,0x16,0xa0,0xa0,0xfe,0xe9,0xa0,0x73,0xc9,0x76,0x76,0xca,0x72,0x74,0xc9,0x74,0x73,0xca,0x00,0x00,0x01,0x00,0x82,0xff,0xfd,0x05,0x1b,0x04,0xac,0x00,0x1d,0x00,0x37,0x40,0x1c,0x13,0x12,0x03,0x04,0x00,0x8a,0x07,0x12,0x04,0x07,0x07,0x04,0x12,0x03,0x1f,0x0f,0x8a,0x16,\r\n0x0b,0x9b,0x1a,0x06,0x04,0x12,0x12,0x03,0x13,0x18,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x07,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,\r\n0x12,0x05,0x1b,0xc2,0x8b,0x4a,0x68,0x8a,0x75,0xc4,0x6f,0x70,0xc5,0x72,0x8e,0x63,0x49,0x8d,0xc0,0xa0,0x01,0x10,0x9c,0x9d,0x01,0x11,0x9f,0x02,0x55,0xb8,0xfe,0xa6,0x46,0x93,0x37,0x01,0x08,0x86,0x72,0xcb,0x75,0x77,0xc9,0x72,0x8b,0xfe,0xf9,0x34,0x92,0x47,0x01,0x59,0xb8,0xa0,0x01,0x18,0x9f,0xa1,0xfe,0xe8,0x00,0x01,0x00,0x64,\r\n0x00,0x00,0x04,0x54,0x04,0xac,0x00,0x25,0x00,0x44,0x40,0x0f,0x17,0x18,0x00,0x8a,0x0b,0x18,0x0b,0x18,0x0b,0x27,0x12,0x89,0x05,0x1e,0x15,0xb8,0x01,0x81,0x40,0x0c,0x18,0x17,0x1a,0x17,0x1a,0x17,0x05,0x0f,0x9b,0x22,0x06,0x06,0xb8,0x01,0x81,0xb1,0x05,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xed,0x01,\r\n0x2f,0xc4,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x32,0x37,0x24,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x04,0x54,0x9c,0xfe,0xef,0x9f,0xfe,0x5c,0x01,0xa4,0x3c,0x4d,\r\n0x01,0x1e,0x73,0xc4,0x70,0x54,0x80,0x7d,0x57,0x5c,0x3f,0x75,0x62,0xae,0x64,0xb0,0x66,0x66,0xb0,0x64,0xa8,0x01,0x0d,0x97,0x02,0x55,0x9d,0xfe,0xea,0xa2,0xa4,0x1b,0x64,0x01,0x32,0x72,0xca,0x76,0x7c,0x59,0x55,0x7f,0x44,0x72,0x77,0x66,0xae,0x65,0x64,0xb1,0x65,0x9b,0xfe,0xec,0x00,0x02,0x00,0x82,0xff,0xdd,0x04,0xa3,0x04,0xac,\r\n0x00,0x32,0x00,0x3c,0x00,0x7a,0x40,0x21,0x1e,0x1f,0x1f,0x13,0x1a,0x8a,0x25,0x2c,0x8a,0x13,0x03,0x11,0x35,0x03,0x25,0x2e,0x13,0x00,0x25,0x13,0x00,0x00,0x13,0x25,0x03,0x3e,0x3a,0x8a,0x0a,0x38,0x9b,0x0e,0x1c,0xb8,0x01,0x81,0x40,0x12,0x22,0x1f,0x1e,0x11,0x35,0x2e,0x03,0x04,0x06,0x0e,0x22,0x1e,0x1e,0x22,0x0e,0x03,0x28,0x33,\r\n0xb8,0x01,0x81,0xb2,0x06,0x18,0x30,0xb8,0x01,0x81,0xb5,0x00,0x19,0x17,0x9b,0x28,0x06,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x33,0x31,0x30,\r\n0x05,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x05,0x32,0x37,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x04,0xa3,0x54,\r\n0x6c,0x6b,0x58,0xb2,0x92,0x57,0xa4,0x5f,0x57,0x99,0x5d,0x73,0xee,0x48,0x3b,0x65,0xae,0x66,0x2d,0x3a,0x65,0x36,0x2f,0x56,0x20,0x6b,0x32,0x70,0x97,0x97,0x6a,0x8d,0xff,0x9c,0x70,0x46,0x38,0x0c,0x26,0xfd,0x55,0xc5,0x55,0x3c,0xad,0x51,0xa6,0x6d,0x23,0x33,0x61,0x45,0x2c,0x4e,0x81,0x46,0x53,0x7c,0x42,0x6f,0x55,0x53,0xbe,0x6e,\r\n0xbd,0x69,0x30,0x27,0x58,0x41,0x68,0x35,0x47,0x8e,0x6d,0x66,0x96,0x9e,0xfe,0xf1,0x96,0xe1,0x9a,0x51,0x09,0x02,0x4f,0x43,0x4b,0x64,0x36,0x43,0x00,0x03,0x00,0x6e,0xff,0xf3,0x05,0x8a,0x04,0xc1,0x00,0x26,0x00,0x30,0x00,0x3c,0x00,0x72,0x40,0x39,0x37,0x8a,0x11,0x26,0x26,0x22,0x1b,0x8a,0x27,0x0b,0x8a,0x31,0x05,0x8a,0x22,0x2f,\r\n0x15,0x11,0x13,0x1d,0x27,0x08,0x31,0x22,0x11,0x27,0x31,0x22,0x22,0x31,0x27,0x11,0x04,0x3e,0x2c,0x8b,0x15,0x26,0x9b,0x00,0x06,0x34,0x9b,0x13,0x08,0x0e,0x1d,0x2f,0x18,0x1f,0x1f,0x0e,0x29,0x9b,0x18,0x06,0x3a,0xb8,0x01,0x81,0xb1,0x0e,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x39,0xed,0x3f,0xed,\r\n0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x10,0xed,0x31,0x30,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x36,0x36,\r\n0x35,0x34,0x26,0x26,0x27,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xfe,0x51,0x90,0x6c,0x3f,0xca,0xb8,0x25,0x37,0xbb,0x8f,0x8d,0xbd,0x48,0xfe,0x56,0x92,0x69,0x67,0x95,0xc1,0x82,0xf3,0xf0,0xdd,0x3a,0x5e,0x74,0xfd,0xe6,0x33,0x24,0x25,0x3f,0x33,0x88,\r\n0x02,0x00,0x60,0x46,0x45,0x61,0x5d,0x49,0x4b,0x5b,0x04,0xc1,0x0c,0x1f,0x44,0x78,0x64,0x87,0xce,0x46,0x23,0x63,0x38,0x88,0xa2,0xa7,0x83,0x6f,0x45,0x9b,0x01,0x45,0x69,0x92,0x95,0x67,0xa8,0x49,0x61,0x24,0x3f,0xa0,0x63,0x3a,0x42,0x1f,0x06,0x61,0x27,0x37,0x39,0x25,0x5c,0x3c,0x2d,0xfd,0xc2,0x39,0x51,0x4e,0x3c,0x35,0x45,0x45,\r\n0x00,0x03,0x00,0x82,0xff,0xdc,0x05,0xd8,0x04,0xac,0x00,0x35,0x00,0x3e,0x00,0x47,0x00,0x99,0x40,0x4a,0x00,0x8b,0x36,0x04,0x8b,0x0b,0x3b,0x8b,0x30,0x22,0x21,0x21,0x1e,0x18,0x18,0x3f,0x08,0x08,0x0b,0x2c,0x0f,0x8a,0x3f,0x1e,0x8b,0x25,0x02,0x36,0x2e,0x0d,0x3d,0x03,0x0b,0x30,0x36,0x0b,0x30,0x3f,0x25,0x25,0x3f,0x30,0x0b,0x36,\r\n0x05,0x49,0x42,0x8b,0x15,0x3f,0x0f,0x9b,0x18,0x3d,0x2e,0x33,0x02,0x0d,0x2c,0x2c,0x07,0x39,0x9b,0x33,0x06,0x21,0x22,0x22,0x12,0x1b,0x9b,0x28,0x06,0x45,0xb8,0x01,0x80,0xb2,0x12,0x18,0x08,0xb8,0x01,0x80,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x39,0x39,0x12,0x39,0x39,\r\n0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x10,0xed,0x10,0xed,0x32,0x11,0x39,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x07,0x16,0x15,0x14,0x06,0x07,0x27,0x32,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x06,0x23,0x22,0x26,\r\n0x35,0x34,0x36,0x25,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x17,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x36,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xd8,0xaa,0x74,0x89,0xaa,0x4b,0x62,0x7f,0x84,0x6b,0xf7,0x1b,\r\n0xc7,0xa8,0x73,0xa0,0xea,0x01,0x1f,0x08,0x89,0x57,0x35,0x47,0x25,0x30,0x5a,0x3e,0x59,0xa3,0x76,0x68,0xae,0x67,0x06,0x7f,0x43,0x50,0xa5,0x7a,0x80,0xa0,0x9d,0x4e,0x35,0x83,0x72,0x94,0xfd,0x42,0xc5,0x99,0x49,0x2d,0x4d,0x7e,0x03,0x78,0xdd,0x63,0x78,0x8b,0x99,0x9a,0x26,0xa0,0x67,0x49,0x5c,0x6e,0x19,0x0f,0xe1,0xed,0x9e,0x73,\r\n0xa2,0x9e,0x18,0xac,0xfa,0x4c,0x3c,0x1d,0x3a,0x27,0x82,0x20,0x93,0x4d,0x78,0xad,0x93,0xfe,0xfa,0xa0,0x08,0x0a,0x6a,0x89,0x84,0xb0,0xb0,0x73,0x38,0x4e,0x97,0x5c,0x69,0x3e,0xfe,0xd3,0x10,0x56,0x56,0x2b,0x42,0xa5,0x00,0x02,0x00,0x64,0x00,0x00,0x05,0x43,0x04,0xac,0x00,0x1d,0x00,0x28,0x00,0x64,0xb9,0x00,0x11,0x01,0x85,0x40,\r\n0x12,0x1e,0x23,0x8b,0x17,0x0c,0x8b,0x07,0x00,0x1e,0x17,0x07,0x07,0x17,0x1e,0x00,0x04,0x2a,0x19,0xb8,0x01,0x85,0x40,0x09,0x09,0x05,0x17,0x23,0x23,0x21,0x9b,0x0e,0x26,0xb8,0x01,0x81,0x40,0x0d,0x0c,0x07,0x0e,0x14,0x14,0x01,0x0e,0x06,0x09,0x9b,0x0a,0x06,0x1c,0xb8,0x01,0x81,0xb1,0x01,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,\r\n0x39,0x2f,0x12,0x39,0x39,0xed,0x10,0xed,0x32,0x11,0x33,0x01,0x2f,0xc6,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x24,0x26,0x35,0x34,0x37,0x26,0x23,0x37,0x20,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,\r\n0x22,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x43,0xfe,0x06,0xa4,0xfe,0xed,0x9d,0x9d,0x73,0xbb,0x0f,0x01,0x20,0x98,0x7c,0xa2,0x86,0xac,0xad,0x85,0x7e,0xa1,0x4c,0x4a,0xfc,0xb9,0x01,0xfa,0xfe,0x98,0x54,0x3e,0x7b,0x59,0x3a,0x59,0x41,0x3f,0x53,0x84,0xeb,0x8d,0xc7,0x7d,0xc7,0xa5,0xfe,0xe6,0x2b,0xa0,0x7a,0x7b,0xa7,0x85,0xa0,0x4a,\r\n0x6c,0x93,0xb9,0x01,0xf5,0x36,0x49,0x1d,0x79,0x5c,0x40,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x04,0x9e,0x04,0xc1,0x00,0x27,0x00,0x42,0x40,0x1a,0x11,0x8a,0x16,0x1c,0x8a,0x0b,0x16,0x0b,0x27,0x27,0x0b,0x16,0x03,0x29,0x23,0x8a,0x05,0x1e,0x09,0x13,0x09,0x01,0x14,0x14,0x19,0x26,0xb8,0x01,0x81,0xb5,0x01,0x18,0x0e,0x9b,0x19,0x06,\r\n0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x26,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x07,0x06,0x15,\r\n0x14,0x16,0x33,0x21,0x04,0x9e,0xfd,0x4d,0x66,0xb1,0x66,0x8d,0x27,0xd9,0x84,0x4b,0x3f,0x37,0x4a,0x1b,0x8e,0x31,0xab,0x7c,0x84,0xa8,0x8b,0x3e,0x84,0x3f,0x84,0x7c,0x5c,0x02,0xb3,0x62,0xab,0x64,0xb5,0x66,0x1e,0x61,0x3a,0x49,0x3f,0x50,0x45,0x2f,0x30,0x1c,0x52,0x41,0x62,0x74,0x9f,0xae,0x8d,0x9d,0x46,0x1f,0x34,0x1e,0x40,0x70,\r\n0x5b,0x83,0x00,0x02,0x00,0x82,0x00,0x00,0x05,0x43,0x04,0xc1,0x00,0x26,0x00,0x31,0x00,0x59,0xb3,0x24,0x24,0x22,0x13,0xb8,0x01,0x84,0x40,0x24,0x27,0x01,0x04,0x8a,0x22,0x27,0x22,0x00,0x00,0x22,0x27,0x03,0x33,0x2d,0x1a,0x8a,0x0c,0x2f,0x99,0x16,0x24,0x01,0x9b,0x25,0x18,0x25,0x16,0x25,0x16,0x25,0x08,0x2a,0x9b,0x10,0x06,0x1e,\r\n0xb8,0x01,0x81,0xb1,0x08,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x39,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x11,0x39,0x2f,0x31,0x30,0x01,0x23,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,\r\n0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x10,0x27,0x35,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x33,0x32,0x36,0x05,0x43,0xd6,0x62,0x4d,0x9f,0xfe,0xf0,0x9d,0xa4,0xfe,0xf0,0x9a,0x5a,0x91,0x5d,0x64,0x90,0x90,0x64,0x5c,0x3f,0x08,0x70,0xc3,0x76,0x6e,0xc5,0x75,0xec,0x01,0xb7,0xfc,0xeb,0x3f,\r\n0x25,0x2e,0x41,0x0b,0x3f,0x3b,0x2b,0x39,0x04,0x07,0x6a,0xc1,0x87,0x9f,0xfe,0xed,0xa3,0xa5,0x01,0x22,0xaf,0xa0,0x01,0x21,0x8a,0xa4,0x72,0x6f,0xa6,0x3c,0x23,0x40,0x80,0xd5,0x76,0x74,0xc6,0x70,0x01,0x15,0xa7,0xa1,0xff,0x00,0x29,0x49,0x58,0x53,0x4b,0x4f,0x00,0x02,0x00,0x82,0x00,0x00,0x04,0x44,0x04,0xac,0x00,0x26,0x00,0x31,\r\n0x00,0x70,0x40,0x3c,0x17,0x18,0x0b,0x8b,0x31,0x10,0x89,0x1d,0x1f,0x06,0x2c,0x03,0x31,0x1d,0x00,0x18,0x31,0x1d,0x1d,0x31,0x18,0x00,0x04,0x33,0x04,0x8a,0x21,0x18,0x17,0x2f,0x99,0x0e,0x29,0x9b,0x08,0x06,0x2c,0x1f,0x10,0x04,0x0e,0x08,0xc0,0x0e,0xf0,0x0e,0x02,0x17,0x0e,0x08,0x08,0x0e,0x17,0x03,0x1a,0x01,0x9b,0x25,0x06,0x15,\r\n0xb8,0x01,0x81,0xb1,0x1a,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x21,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x21,0x01,0x34,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x04,0x44,0xfd,0x93,0x48,0x68,0x35,0x73,0xa4,0x80,0x92,0x92,0x68,0x9c,0x74,0x08,0x7d,0x63,0x5c,0x37,0x74,0x6a,0x9d,0xab,0xdb,0x25,0x70,0x5b,\r\n0x9e,0x5c,0x02,0x6d,0xfe,0xa4,0x5e,0x29,0x7f,0x17,0x20,0x6e,0x27,0x27,0x41,0x04,0x07,0x68,0x48,0x5e,0x32,0x63,0x6f,0x62,0x5d,0x7b,0x45,0x1b,0x16,0x6a,0x87,0x25,0x73,0x56,0xe3,0xb2,0x4e,0x53,0x7c,0xa5,0x5a,0x9f,0x5c,0xfd,0xa9,0x41,0x28,0x15,0x1a,0x2b,0x29,0x00,0x00,0x02,0x00,0x5d,0xff,0xe8,0x03,0xe9,0x03,0x7c,0x00,0x0b,\r\n0x00,0x1b,0x00,0x23,0x40,0x0d,0x18,0x89,0x03,0x03,0x1d,0x09,0x89,0x10,0x06,0x9b,0x14,0x06,0x00,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,\r\n0x14,0x06,0x06,0x02,0x23,0x7f,0xa0,0xa0,0x7f,0x7f,0xa0,0xa0,0x7f,0x7e,0xd0,0x78,0x78,0xd1,0x7d,0x7e,0xd0,0x78,0x78,0xd0,0x81,0xa9,0x88,0x88,0xa9,0xa9,0x88,0x88,0xa9,0x99,0x76,0xd3,0x81,0x81,0xd3,0x76,0x76,0xd3,0x81,0x81,0xd3,0x76,0x00,0x02,0x00,0x00,0xfe,0x63,0x06,0xd4,0x05,0xb3,0x00,0x18,0x00,0x21,0x00,0x37,0x40,0x1e,\r\n0x21,0x8a,0x11,0x00,0x8a,0x19,0x11,0x09,0x19,0x19,0x09,0x11,0x03,0x23,0x04,0x89,0x0d,0x1d,0x9b,0x15,0x07,0x07,0x99,0x0a,0x18,0x21,0x10,0x99,0x01,0x18,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x21,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x10,0x12,0x21,0x20,0x00,0x11,0x03,0x11,0x10,0x26,0x23,0x22,0x06,0x11,0x11,0x06,0xd4,0xfa,0x99,0x67,0x5f,0x60,0x66,0x01,0x55,0xfe,0xb6,0xc2,0xb6,0xc4,0xb4,0x01,0x57,0xff,0x01,0x03,0x01,0x02,0x01,0x01,0xa4,0xb1,0xae,0xb0,0xae,0x3f,0x46,0x4a,0x3b,0x93,0x86,0x90,0x8f,0x8b,0x02,0x9d,\r\n0x01,0x44,0x01,0x3f,0xfe,0xc5,0xfe,0xb8,0xfd,0x63,0x02,0x8e,0x01,0x05,0xf4,0xf8,0xfe,0xff,0xfd,0x72,0x00,0x01,0x00,0x64,0xff,0xe6,0x07,0x12,0x05,0xb3,0x00,0x1e,0x00,0x3d,0x40,0x21,0x10,0x0f,0x1e,0x89,0x02,0x1b,0x89,0x06,0x0f,0x02,0x06,0x00,0x00,0x06,0x02,0x0f,0x04,0x20,0x0c,0x89,0x13,0x03,0x1e,0x99,0x02,0x18,0x09,0x9b,\r\n0x17,0x07,0x0f,0x10,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x07,0x12,\r\n0xfc,0xd6,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x93,0x93,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x00,0x00,0x01,0x00,0x64,\r\n0xff,0xe6,0x07,0x1b,0x05,0xb3,0x00,0x2d,0x00,0x50,0x40,0x2b,0x19,0x18,0x22,0x0d,0x8a,0x0e,0x2d,0x2a,0x8a,0x06,0x01,0x06,0x18,0x0e,0x02,0x06,0x06,0x02,0x0e,0x18,0x04,0x2f,0x15,0x8a,0x1c,0x22,0x19,0x09,0x12,0x9b,0x26,0x1f,0x07,0x18,0x19,0x19,0x0e,0x18,0x03,0x2d,0x99,0x02,0x18,0x00,0x3f,0xed,0x39,0x3f,0x3f,0x33,0x3f,0x33,\r\n0xed,0x32,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x32,0x10,0xed,0x39,0x11,0x33,0x31,0x30,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x36,\r\n0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x07,0x07,0x1b,0xfd,0x59,0x53,0x52,0x6c,0x79,0x71,0x61,0xa4,0x61,0x71,0x7b,0x6a,0x66,0x5d,0x9b,0x5f,0x6c,0xc5,0xbe,0x6e,0x96,0x21,0x08,0x20,0x96,0x6f,0x76,0xad,0x60,0x4b,0x30,0x93,0x93,0x51,0x74,0x01,0x4b,0xf6,0x01,0x12,0x01,0x00,0xc7,0xeb,0xfc,0x9a,0x03,0x66,0xea,0xc8,0xfb,0xfe,0xe9,\r\n0xf9,0xfe,0x87,0x77,0x37,0x7f,0x01,0xa8,0xe2,0x01,0x56,0x01,0x6e,0x74,0x6b,0x6a,0x75,0xa3,0xfe,0xc0,0xe1,0x99,0xfe,0x93,0x56,0x00,0x00,0x02,0x00,0x61,0xff,0xe6,0x06,0x81,0x07,0xc8,0x00,0x30,0x00,0x3c,0x00,0x6d,0x40,0x38,0x14,0x13,0x37,0x89,0x07,0x00,0x89,0x31,0x26,0x26,0x10,0x2b,0x89,0x20,0x1d,0x34,0x0a,0x03,0x07,0x31,\r\n0x2e,0x20,0x13,0x07,0x31,0x20,0x20,0x31,0x07,0x13,0x04,0x3e,0x10,0x89,0x17,0x1d,0x2e,0x0a,0x34,0x04,0x04,0x26,0x25,0x25,0x1b,0x23,0x9b,0x28,0x0c,0x9b,0x1b,0x07,0x13,0x14,0x19,0x3a,0xb8,0x01,0x80,0xb1,0x04,0x19,0x00,0x3f,0xed,0x3f,0x33,0x3f,0xed,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x17,0x39,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x04,0x02,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x06,0x31,0x79,0xd9,0x88,0xac,0xd5,0xd6,0xd3,0x80,0xaf,0xac,0xfe,0xf0,0x8c,0x6e,0x6e,0x95,0x71,0x7d,0xb3,0x01,0x60,0xde,0xfd,0xba,0x77,0x5b,0x79,0x7a,0x9b,0x9f,0x1d,0xac,0xbb,0xb2,0xd7,0x7f,0x94,0x5e,0x65,0xa7,0x55,0x4b,\r\n0xbb,0xb2,0x7c,0x69,0x80,0xa8,0x02,0x8e,0xb7,0xfe,0xc0,0xb1,0x01,0x1c,0xdd,0xdb,0x01,0x6c,0x9e,0x54,0x9d,0xfe,0xec,0xb7,0xb6,0xfe,0xc4,0x9e,0x3a,0xa6,0x01,0x7d,0xaa,0xe3,0x01,0x57,0xc6,0x8c,0x5b,0x97,0x51,0x62,0x6e,0x3b,0x8a,0x3f,0xba,0x95,0x6f,0xcf,0x72,0x6b,0xfe,0xde,0xba,0x94,0xfc,0x55,0x8d,0xfe,0xc6,0xc1,0xa3,0xbe,\r\n0x01,0x24,0x00,0x01,0x00,0x61,0xfd,0xfe,0x07,0x0f,0x07,0x61,0x00,0x43,0x00,0x71,0x40,0x38,0x1f,0x8a,0x24,0x22,0x21,0x2a,0x8a,0x19,0x30,0x8a,0x11,0x00,0x01,0x41,0x8a,0x03,0x2c,0x11,0x01,0x24,0x21,0x14,0x19,0x11,0x01,0x03,0x03,0x01,0x11,0x19,0x14,0x21,0x24,0x07,0x45,0x0a,0x8a,0x39,0x01,0x00,0x19,0x06,0x9b,0x3d,0x27,0x2c,\r\n0x14,0x9b,0x15,0x15,0x22,0x1c,0x9b,0x27,0x07,0x0e,0xb8,0x01,0x80,0xb3,0x34,0x21,0x22,0x19,0x00,0x3f,0x33,0xd4,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x10,0xd4,0xed,0x3f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,\r\n0x30,0x05,0x27,0x12,0x11,0x10,0x00,0x21,0x22,0x00,0x02,0x11,0x10,0x12,0x04,0x33,0x32,0x12,0x35,0x10,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x13,0x07,0x02,0x11,0x10,0x00,0x33,0x32,0x16,0x15,0x10,0x07,0x15,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x02,0x35,0x10,0x12,0x00,0x21,0x32,\r\n0x04,0x12,0x11,0x14,0x02,0x06,0x7d,0x9e,0x8b,0xfe,0xaf,0xfe,0xd1,0xd4,0xfe,0xa5,0xb6,0x9c,0x01,0x0e,0xb4,0xbf,0xd4,0xf8,0x72,0x65,0x63,0x6d,0x73,0x7a,0xa8,0xa0,0x8b,0x99,0x96,0x01,0x03,0xed,0xb9,0xd3,0xae,0x67,0x7d,0x96,0xff,0xa8,0xa9,0xfe,0xea,0xc9,0x74,0xde,0x01,0xaa,0x01,0x0a,0xef,0x01,0x6b,0xc2,0x4c,0x19,0x37,0x01,\r\n0x9f,0x01,0x92,0x01,0xa6,0x01,0xd3,0xfe,0xfe,0xfe,0x32,0xfe,0xcd,0xfe,0xd1,0xfe,0x00,0xff,0x01,0x24,0xfd,0x01,0x7d,0x96,0x9b,0x85,0xa2,0x8d,0xfe,0xe7,0xfe,0xbd,0xfe,0xb1,0xfe,0xae,0x37,0x01,0x75,0x01,0x5f,0x01,0x69,0x01,0x90,0xf0,0xca,0xfe,0xf8,0x67,0x06,0x1e,0xfc,0xb4,0xc0,0xfe,0xb0,0xa8,0xb1,0x01,0x4d,0x01,0xd0,0xe9,\r\n0x01,0x60,0x02,0x19,0x01,0x33,0xfd,0xfe,0x2f,0xfe,0xc6,0xd7,0xfe,0x31,0x00,0x01,0x00,0x64,0xfd,0xfe,0x06,0xf4,0x05,0xb3,0x00,0x3e,0x00,0x6a,0x40,0x0b,0x00,0x3e,0x0a,0x33,0x8a,0x34,0x11,0x2a,0x8a,0x2b,0x17,0xb8,0x01,0x85,0x40,0x24,0x23,0x3e,0x34,0x1d,0x2b,0x23,0x23,0x2b,0x1d,0x34,0x3e,0x05,0x40,0x3c,0x8a,0x03,0x12,0x0b,\r\n0x0b,0x34,0x2f,0x26,0x38,0x9b,0x15,0x0e,0x07,0x07,0x3e,0x00,0x19,0x1d,0x1e,0x1e,0x34,0x20,0xb8,0x01,0x80,0xb3,0x1b,0x2b,0x34,0x18,0x00,0x3f,0x33,0xd4,0xed,0x12,0x39,0x2f,0x33,0x3f,0x33,0x3f,0x33,0x33,0xed,0x32,0x32,0x12,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,\r\n0xed,0x39,0x11,0x33,0x31,0x30,0x17,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x20,0x11,0x10,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x22,0x06,0x11,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x26,0x23,0x22,\r\n0x06,0x02,0x15,0x10,0x17,0xee,0x41,0x49,0x51,0x92,0x64,0x56,0x7e,0x2a,0x05,0x24,0x86,0x5a,0x5b,0x6f,0x31,0x06,0x26,0x7f,0x60,0x01,0x3c,0x7f,0xe3,0x99,0x8c,0x6f,0x7e,0x77,0xb3,0xad,0x59,0x4e,0x5e,0x51,0xa3,0x4e,0x5b,0x63,0x54,0xa3,0x49,0x55,0x32,0x52,0x2f,0x7d,0x1a,0x85,0x01,0x91,0xdc,0xe8,0x01,0x4b,0xa8,0x56,0x6b,0x5f,\r\n0x62,0x52,0x73,0x64,0x61,0xfc,0xcf,0xfe,0xaa,0xfd,0xe8,0xfe,0xea,0x2d,0xac,0x40,0x01,0xe2,0x01,0xf7,0x01,0x51,0x01,0x57,0xda,0xfe,0xfe,0xfc,0xc4,0x03,0x3c,0x01,0x05,0xd7,0xe9,0xf1,0xfc,0xc2,0x03,0x3e,0x01,0x0b,0xcf,0x8b,0xfe,0xf9,0xb5,0xfe,0x46,0xfa,0x00,0x02,0x00,0x46,0xff,0xe6,0x05,0x17,0x05,0xb3,0x00,0x0b,0x00,0x30,\r\n0x00,0x47,0x40,0x1d,0x2a,0x89,0x13,0x17,0x1b,0x89,0x00,0x13,0x00,0x30,0x30,0x00,0x13,0x03,0x32,0x06,0x8a,0x22,0x09,0x99,0x30,0x0c,0x18,0x1f,0x0c,0x1f,0x0c,0x26,0x0f,0xb8,0x01,0x80,0xb5,0x2e,0x19,0x03,0x9b,0x26,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,\r\n0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x04,0x33,0x32,0x36,0x12,0x35,0x34,0x02,0x26,0x27,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x20,0x27,0x02,0x8f,0x6e,0x5e,0x5e,0x7a,\r\n0x6e,0x5d,0x63,0x76,0xfd,0xb9,0x68,0x01,0x05,0x92,0xa8,0xfd,0x84,0x86,0xe3,0x82,0x03,0x55,0x62,0x62,0xb1,0x6f,0xa9,0xc8,0x86,0xed,0x9a,0xcb,0x01,0x41,0xb8,0xb6,0xfe,0xb1,0xcb,0xfe,0xbf,0xbe,0x04,0x1e,0x69,0x80,0x82,0x64,0x66,0x7c,0x78,0xfd,0x84,0x5c,0x60,0x95,0x01,0x0f,0xb0,0x9f,0x01,0x12,0xa3,0x07,0x08,0x1c,0x9b,0x60,\r\n0x65,0xa5,0x5d,0xc6,0xa3,0x7f,0xbd,0x66,0xb4,0xfe,0xa9,0xd3,0xdc,0xfe,0xab,0xbe,0x94,0x00,0x00,0x01,0x00,0x64,0xfd,0xfe,0x06,0xea,0x05,0xb3,0x00,0x2d,0x00,0x57,0x40,0x2a,0x2c,0x01,0x8a,0x0e,0x28,0x89,0x13,0x1d,0x1c,0x0e,0x13,0x0f,0x07,0x1c,0x1c,0x07,0x0f,0x13,0x0e,0x05,0x2f,0x19,0x89,0x20,0x2d,0x06,0x16,0x9b,0x24,0x07,\r\n0x1c,0x1d,0x19,0x10,0x2b,0x99,0x0f,0x07,0x08,0x08,0x0f,0x0b,0xb8,0x01,0x80,0xb2,0x04,0x0f,0x18,0x00,0x3f,0xd4,0xed,0x12,0x39,0x11,0x33,0x10,0xed,0x39,0x3f,0x33,0x3f,0xed,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x33,0x31,0x30,0x01,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35,\r\n0x17,0x16,0x33,0x32,0x36,0x35,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x21,0x11,0x06,0xea,0xfe,0xcd,0xfe,0xe6,0x46,0x76,0x55,0x4a,0x69,0x70,0xbb,0xdc,0xfd,0xa2,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,0x98,0x80,0x78,\r\n0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x01,0x9a,0x05,0x99,0xfa,0xb4,0xfe,0xe3,0xfe,0xce,0x13,0x14,0xac,0x18,0x22,0xc6,0xa3,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x05,0x06,0x00,\r\n0x00,0x02,0x00,0x61,0xff,0xe6,0x07,0x02,0x07,0xc8,0x00,0x3f,0x00,0x4a,0x00,0x84,0x40,0x45,0x1b,0x1a,0x26,0x10,0x8a,0x11,0x46,0x8a,0x07,0x00,0x8a,0x40,0x35,0x35,0x17,0x3a,0x8a,0x2e,0x2b,0x43,0x0a,0x03,0x07,0x40,0x3d,0x2e,0x1a,0x11,0x07,0x40,0x2e,0x2e,0x40,0x07,0x11,0x1a,0x05,0x4c,0x17,0x8a,0x1e,0x0c,0x14,0x9b,0x22,0x2b,\r\n0x26,0x43,0x0a,0x3d,0x26,0x04,0x04,0x35,0x34,0x34,0x22,0x31,0x9b,0x37,0x29,0x22,0x07,0x1a,0x1b,0x19,0x11,0x18,0x48,0xb8,0x01,0x80,0xb1,0x04,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x3f,0x33,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x39,\r\n0x11,0x12,0x17,0x39,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x39,0x11,0x33,0x31,0x30,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x17,\r\n0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x10,0x33,0x32,0x12,0x06,0xc2,0x64,0xac,0x6c,0x88,0xad,0xb0,0xad,0x57,0x59,0x88,0x91,0xa2,0xea,0x8c,0x88,0x65,0x58,0x9a,0x5c,0x6b,0x6e,0xc5,0x81,0x75,0xab,0x20,0x07,0x2b,0xc0,0x7d,0x90,\r\n0x85,0x3d,0x49,0x60,0x63,0x3b,0x64,0x3f,0x17,0x89,0x97,0x8e,0xad,0x67,0x75,0x48,0x54,0xa4,0x2b,0x30,0x8f,0x7f,0x9a,0x61,0x6e,0x02,0x8e,0xbb,0xfe,0xc2,0xaf,0x01,0x18,0xe1,0xdd,0x01,0x6f,0xa0,0x4f,0xf6,0xe6,0xfc,0xc2,0x03,0x3e,0x01,0xdc,0xfe,0xe3,0xfe,0xd4,0xb4,0xfe,0x8c,0x8c,0x37,0x98,0x01,0x9f,0xbb,0xe4,0x01,0x4a,0xad,\r\n0x90,0x81,0x83,0x8e,0x87,0x3a,0xa8,0x5c,0x63,0x6d,0x1d,0x1e,0x8a,0x3f,0xb8,0x97,0x6f,0xd0,0x70,0x6d,0xfe,0xdd,0xb8,0xb7,0xd9,0x4b,0x84,0xfe,0xd5,0xcf,0xfe,0x9f,0x01,0x13,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0x2b,0x03,0xf1,0x00,0x0b,0x00,0x1b,0x00,0x20,0x40,0x10,0x18,0x89,0x03,0x03,0x1d,0x09,0x89,0x10,0x06,0x9b,0x14,0x06,\r\n0x00,0x99,0x0c,0x18,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x24,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x04,0x02,0xd5,0xc7,0xdf,0xdf,0xc7,0xc5,0xdd,0xdd,0xc5,0xaa,0xfe,0xee,0x97,0x95,0x01,0x13,0xab,\r\n0xae,0x01,0x14,0x94,0x97,0xfe,0xee,0x87,0xc2,0xa9,0xab,0xc1,0xc3,0xa9,0xa9,0xc2,0x93,0x7f,0xe9,0x96,0x97,0xea,0x7e,0x7f,0xe9,0x97,0x96,0xe8,0x80,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0xa3,0x03,0xf1,0x00,0x2b,0x00,0x37,0x00,0x5f,0xbc,0x00,0x2c,0x01,0x82,0x00,0x00,0x00,0x06,0x01,0x82,0x40,0x18,0x32,0x14,0x89,0x1b,0x28,\r\n0x32,0x00,0x32,0x17,0x1b,0x1b,0x17,0x32,0x00,0x04,0x39,0x22,0x89,0x0c,0x18,0x99,0x17,0x18,0x2f,0xb8,0x01,0x7d,0x40,0x11,0x28,0x35,0x9b,0x03,0x28,0x03,0x28,0x03,0x09,0x1f,0x9b,0x10,0x06,0x26,0x99,0x09,0x18,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,\r\n0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x04,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x27,0x26,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,\r\n0x34,0x26,0x23,0x22,0x06,0x02,0x28,0x74,0x5a,0x5d,0x77,0xe8,0xc2,0xb7,0xe7,0xa0,0x01,0x2c,0xc4,0xbf,0x01,0x2c,0xa6,0xcb,0xc2,0x6d,0x6f,0x7a,0xdc,0x8a,0xd9,0xfe,0xf9,0x3f,0x73,0x43,0x82,0x41,0x03,0x55,0x6a,0x6c,0x3a,0x2a,0x27,0x3a,0x39,0x28,0x2b,0x39,0x01,0xb7,0x58,0x78,0x7b,0x63,0xc5,0xf0,0x01,0x05,0xd6,0x9f,0xf9,0x8a,\r\n0x88,0xfa,0x9d,0xc0,0xf6,0x27,0x95,0x1d,0xa8,0x83,0x74,0xb5,0x63,0xd9,0xb6,0x62,0x91,0x51,0x58,0x06,0x06,0x72,0x58,0x29,0x39,0x37,0x2b,0x29,0x39,0x39,0x00,0x02,0x00,0xb4,0x00,0x00,0x05,0x90,0x05,0xe6,0x00,0x3e,0x00,0x4a,0x00,0x71,0xb9,0x00,0x2d,0x01,0x83,0x40,0x2f,0x00,0x42,0x8c,0x30,0x39,0x8c,0x48,0x27,0x26,0x06,0x0e,\r\n0x89,0x1f,0x06,0x48,0x1f,0x00,0x30,0x48,0x1f,0x1f,0x48,0x30,0x00,0x04,0x4c,0x18,0x89,0x15,0x16,0x06,0x45,0x3f,0x30,0x3c,0x36,0x06,0x27,0x3c,0x36,0x27,0x27,0x36,0x3c,0x03,0x03,0x1b,0xb8,0x01,0x80,0xb7,0x12,0x18,0x23,0x2a,0x9b,0x0a,0x03,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,\r\n0x12,0x39,0x33,0x32,0x3f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,\r\n0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x22,0x76,0x72,0x41,0x5d,0x15,0x07,0x0d,0x6e,0x4a,0x7e,0x89,0xb7,0xa0,0xfd,0xd2,0xa1,0xb6,0xad,0x66,0x5b,\r\n0x02,0x00,0x5b,0x64,0x36,0x33,0x2e,0x3f,0x03,0x91,0x02,0x3e,0x2d,0x31,0x31,0x27,0x1e,0x05,0x04,0x55,0x44,0x44,0x57,0x64,0x5d,0x96,0xa9,0x01,0x67,0x1f,0x2e,0x2d,0x20,0x1e,0x2d,0x2e,0x02,0x98,0xb3,0xa9,0x48,0x45,0x3f,0x4e,0xaf,0x99,0xfe,0x9e,0x9b,0xaf,0xb0,0x9a,0x04,0x9c,0xfb,0x6f,0x5b,0x60,0x60,0x5b,0x01,0x5e,0x55,0x5a,\r\n0x4c,0x3e,0x3e,0x4c,0x58,0x72,0x4f,0x73,0x10,0x05,0x05,0x18,0x42,0x58,0x59,0x41,0x4f,0x56,0xb1,0x3e,0x2b,0x20,0x20,0x2a,0x2a,0x20,0x20,0x2b,0x00,0x02,0x00,0x82,0xff,0xf4,0x05,0x73,0x03,0xf3,0x00,0x2d,0x00,0x39,0x00,0x71,0xbc,0x00,0x31,0x01,0x82,0x00,0x25,0x00,0x2b,0x01,0x82,0x40,0x30,0x37,0x1c,0x1b,0x09,0x0f,0x89,0x15,\r\n0x09,0x37,0x12,0x25,0x37,0x12,0x15,0x15,0x12,0x37,0x25,0x04,0x3b,0x22,0x89,0x03,0x13,0x99,0x12,0x18,0x18,0x1f,0x9b,0x06,0x2e,0x9b,0x25,0x00,0x28,0x09,0x1c,0x06,0x28,0x1c,0x28,0x1c,0x00,0x0c,0x06,0x06,0x34,0xb8,0x01,0x7d,0xb1,0x00,0x18,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0xed,\r\n0x10,0xed,0x32,0x3f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x02,0x07,0x35,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x2f,0xc3,0xea,0xc8,0xa4,0x5f,0x8d,0x24,0x1e,0x91,0x63,0xa2,0xc1,0xc4,0xa5,0xb8,0x78,0x58,0x4e,0x53,0xab,0x58,0x4f,0x56,0x77,0x37,0x07,0x06,0x6f,0x58,0x5b,0x76,0x7a,0x55,0x29,0x39,0x39,0x29,0x2a,0x37,\r\n0x38,0x0c,0x01,0x1d,0xeb,0xdf,0x01,0x18,0x72,0x74,0x6b,0x7b,0xfe,0xea,0xdf,0xce,0xfe,0xe9,0x24,0x96,0x3c,0x01,0x37,0x92,0xd0,0x9c,0x91,0x91,0x9c,0xce,0x96,0xb0,0x74,0x02,0x54,0x68,0x74,0x58,0x5d,0x79,0x01,0x38,0x02,0x39,0x29,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x00,0x02,0x00,0x82,0xff,0xed,0x05,0x4b,0x05,0x82,0x00,0x3b,\r\n0x00,0x47,0x00,0x84,0xb9,0x00,0x06,0x01,0x82,0xb4,0x3f,0x28,0x89,0x27,0x45,0xbb,0x01,0x82,0x00,0x0c,0x00,0x0e,0x01,0x83,0x40,0x16,0x00,0x39,0x0c,0x00,0x14,0x3f,0x27,0x0c,0x00,0x00,0x0c,0x27,0x3f,0x14,0x05,0x49,0x32,0x89,0x1e,0x17,0x11,0x3c,0xb8,0x01,0x7d,0x40,0x1a,0x09,0x42,0x9b,0x03,0x22,0x2d,0x11,0x1b,0x0c,0x09,0x2d,\r\n0x03,0x27,0x09,0x03,0x09,0x03,0x1b,0x27,0x06,0x39,0x35,0x99,0x1b,0x18,0x13,0xb8,0x01,0x80,0xb1,0x14,0x19,0x00,0x3f,0xed,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,\r\n0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,\r\n0x26,0x26,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xcb,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,0xed,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0x01,0x6f,\r\n0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0x01,0xae,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x45,0x39,0x2b,0x29,0x3a,0x39,0x2a,\r\n0x2a,0x3a,0x00,0x03,0x00,0x82,0xff,0xed,0x05,0x4b,0x05,0x82,0x00,0x43,0x00,0x4f,0x00,0x5b,0x00,0xaa,0xbf,0x00,0x29,0x01,0x83,0x00,0x1b,0x00,0x4d,0x01,0x82,0x00,0x27,0x00,0x21,0x01,0x82,0x40,0x12,0x47,0x18,0x27,0x1b,0x27,0x47,0x2f,0x2f,0x47,0x27,0x1b,0x04,0x11,0x5d,0x07,0x89,0x06,0x00,0xb8,0x01,0x82,0x40,0x18,0x56,0x50,\r\n0x8c,0x3e,0x3c,0x56,0x3e,0x06,0x56,0x3e,0x3e,0x56,0x06,0x03,0x5d,0x11,0x89,0x39,0x0c,0x01,0x4b,0x9b,0x1e,0x44,0xb8,0x01,0x7d,0x40,0x1a,0x24,0x32,0x2c,0x3c,0x53,0x01,0x03,0x41,0x27,0x1e,0x2c,0x24,0x1e,0x24,0x1e,0x24,0x36,0x59,0x41,0x06,0x18,0x14,0x99,0x36,0x18,0x2e,0xb8,0x01,0x80,0xb3,0x2f,0x19,0x06,0x06,0x00,0x3f,0x3f,\r\n0xed,0x3f,0xed,0x32,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x12,0x39,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x07,\r\n0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,\r\n0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x5d,0x08,0x9e,0x8f,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,\r\n0xab,0xa5,0x33,0xda,0xed,0xb0,0xc5,0x3d,0x74,0x59,0x64,0x72,0xdd,0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0xfe,0x0f,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x04,0x3d,0x10,0x29,0x72,0x52,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x4f,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,\r\n0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xb9,0x01,0x03,0x58,0x3c,0x5c,0x5a,0x75,0x81,0xfc,0xf7,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x02,0xbc,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x02,0x00,0x50,0xff,0xf4,0x04,0xa7,0x05,0x6a,0x00,0x28,0x00,0x34,0x00,0x63,0x40,0x09,0x18,0x89,0x05,0x25,\r\n0x8c,0x2f,0x12,0x0b,0x29,0xb8,0x01,0x83,0x40,0x14,0x1f,0x00,0x0b,0x2f,0x1f,0x05,0x2f,0x1f,0x1f,0x2f,0x05,0x03,0x36,0x0f,0x89,0x0e,0x32,0x9b,0x22,0x2c,0xb8,0x01,0x7d,0x40,0x12,0x00,0x12,0x0b,0x22,0x00,0x22,0x00,0x15,0x02,0x99,0x1c,0x18,0x08,0x9b,0x15,0x06,0x0e,0x06,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,\r\n0x39,0x39,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x26,0x02,0x27,0x33,0x16,0x16,0x17,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xb5,0x47,0x8b,0xa9,0xc6,0xae,0x9b,0x47,0xa9,0x46,0x30,0xae,0x49,0xd5,0x2c,0x49,0x25,0x30,0x91,0x3b,0xe7,0x01,0x05,0x7e,0xeb,0x98,0xca,0xfe,0xfa,0x7a,0x6a,0x58,0x75,0x75,0x5b,0x60,0x3b,0x28,0x28,0x3b,0x3b,0x28,0x2a,0x39,0xb9,\r\n0x34,0xc2,0xb1,0xa2,0xb0,0x26,0x1f,0xa1,0x01,0x70,0x54,0x44,0xd5,0xa6,0x16,0x1a,0xfc,0xe7,0x98,0xec,0x80,0xd7,0xaa,0x6d,0x7c,0x74,0x5c,0x57,0x76,0xce,0x2a,0x39,0x3c,0x27,0x29,0x3b,0x3a,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x06,0x80,0x05,0xe6,0x00,0x3b,0x00,0x47,0x00,0x7b,0x40,0x0c,0x17,0x89,0x14,0x26,0x25,0x06,0x06,0x2c,\r\n0x0d,0x89,0x1e,0x35,0xb8,0x01,0x82,0x40,0x21,0x45,0x3f,0x8c,0x2f,0x1c,0x1e,0x45,0x14,0x1e,0x45,0x2f,0x2f,0x45,0x1e,0x14,0x04,0x49,0x2c,0x89,0x00,0x3c,0x9b,0x2e,0x38,0x32,0x06,0x26,0x32,0x26,0x32,0x26,0x03,0x42,0xb8,0x01,0x7d,0xb2,0x38,0x18,0x10,0xb8,0x01,0x80,0x40,0x0a,0x1c,0x18,0x15,0x06,0x21,0x29,0x9b,0x0a,0x03,0x06,\r\n0x00,0x3f,0x33,0xed,0x32,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x3e,0x02,0x33,0x32,0x12,0x15,0x14,0x06,\r\n0x07,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x21,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x06,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x82,0xac,0xa3,0x53,0x8a,0x23,0x0d,0x48,\r\n0x66,0x36,0xa0,0xac,0x25,0x15,0x46,0x56,0x62,0xae,0x58,0xa4,0x66,0xfe,0xe2,0x5d,0x52,0x4d,0x2d,0x49,0x29,0xa7,0x01,0x53,0x47,0x51,0x58,0x37,0x07,0x06,0x70,0x58,0x5c,0x74,0x7b,0x64,0x80,0xc5,0x6a,0x01,0xbf,0x2a,0x3a,0x3a,0x2a,0x29,0x39,0x3a,0x01,0xfc,0xf8,0x01,0x00,0x75,0x66,0x37,0x65,0x3f,0xfe,0xfe,0xf4,0x64,0xce,0x31,\r\n0x5f,0x5b,0x04,0x91,0xfb,0x64,0x5d,0x97,0x56,0xc8,0x01,0x36,0xa7,0xbd,0x45,0x8c,0x64,0x9f,0x96,0xb8,0xae,0xbb,0x69,0x02,0x57,0x65,0x75,0x57,0x5f,0x77,0x82,0xec,0x36,0x02,0x39,0x29,0x2a,0x38,0x3b,0x27,0x27,0x3d,0x00,0x02,0x00,0x82,0xff,0xf6,0x05,0x9c,0x05,0x82,0x00,0x40,0x00,0x4c,0x00,0x7e,0xb9,0x00,0x0b,0x01,0x82,0x40,\r\n0x1b,0x47,0x27,0x89,0x26,0x41,0x8c,0x05,0x1a,0x33,0x00,0x47,0x26,0x33,0x05,0x1d,0x47,0x26,0x05,0x05,0x26,0x47,0x03,0x4e,0x31,0x89,0x1d,0x44,0xb8,0x01,0x7d,0x40,0x1a,0x02,0x15,0x9b,0x36,0x4a,0x9b,0x08,0x21,0x2c,0x00,0x02,0x36,0x2c,0x08,0x26,0x02,0x36,0x08,0x08,0x36,0x02,0x03,0x0e,0x26,0x06,0x33,0xb8,0x01,0x81,0xb5,0x1a,\r\n0x18,0x3d,0x99,0x0e,0x18,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,\r\n0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x06,0x07,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,\r\n0x23,0x22,0x06,0x04,0xfc,0x16,0x1b,0x57,0x78,0x77,0x56,0x5c,0x77,0x9e,0x80,0x2f,0x57,0x56,0x45,0x3e,0x3e,0x1b,0x1e,0x25,0x18,0x10,0x02,0xda,0xfd,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0xb4,0x16,0x6f,0x5d,0x26,0x49,0x49,0x52,0x46,0x4b,0x1c,0x2e,0x49,0x0d,0x9a,0x3b,0x29,0x27,0x3b,0x3a,\r\n0x28,0x27,0x3d,0x01,0x18,0x05,0x76,0x59,0x5a,0x75,0x7c,0x65,0xd1,0xfe,0xf7,0x27,0x46,0x4d,0x44,0x2e,0x33,0x57,0x84,0x1b,0x02,0xf1,0xc7,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0xca,0x39,0x8b,0x7f,0x22,0x39,0x54,0x4c,0x34,0x49,0x3d,0xd0,0x29,0x3b,0x39,0x2b,0x29,0x39,\r\n0x3a,0x00,0x00,0x02,0x00,0x82,0xff,0xf4,0x06,0x1b,0x04,0xfe,0x00,0x37,0x00,0x43,0x00,0x7a,0x40,0x0a,0x06,0x20,0x2a,0x13,0x89,0x12,0x21,0x89,0x22,0x32,0xbb,0x01,0x82,0x00,0x41,0x00,0x3b,0x01,0x82,0x40,0x19,0x2c,0x12,0x22,0x41,0x2c,0x2c,0x41,0x22,0x12,0x04,0x45,0x2a,0x89,0x00,0x38,0x9b,0x06,0x20,0x03,0x2c,0x35,0x2f,0x2f,\r\n0x03,0x3e,0xb8,0x01,0x7d,0x40,0x15,0x35,0x18,0x1d,0x9b,0x09,0x17,0x9b,0x0f,0x09,0x0f,0x09,0x0f,0x12,0x22,0x18,0x12,0x06,0x26,0x9b,0x03,0x06,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,\r\n0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,0x23,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,\r\n0x06,0x23,0x22,0x02,0x25,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x82,0xd9,0xc5,0x57,0x9d,0x2b,0x1e,0x51,0x38,0x1a,0x3f,0x4b,0x35,0x37,0x15,0x31,0x37,0xa8,0x54,0x79,0x43,0x23,0x55,0x51,0x1d,0x2e,0x11,0x1d,0x2d,0x0b,0x01,0x13,0xc1,0xe5,0x3e,0x6d,0x3f,0x4a,0x67,0x31,0x3c,0x08,0x6f,0x58,0x5b,0x76,0x7a,0x65,\r\n0xc7,0xe6,0x01,0xbd,0x2a,0x39,0x3a,0x29,0x2a,0x37,0x38,0x01,0xdb,0xfa,0x01,0x1c,0x6a,0x57,0x94,0x7a,0x26,0x48,0x35,0x26,0xe1,0xa8,0x88,0xfe,0xe5,0x8f,0x32,0x51,0x1d,0x28,0x88,0x7f,0xfd,0x73,0x02,0x46,0xa1,0x7a,0x63,0xb5,0x6a,0x9d,0x76,0x5c,0x6e,0x74,0x58,0x5d,0x79,0x01,0x06,0x32,0x02,0x3b,0x27,0x2a,0x38,0x38,0x2a,0x28,\r\n0x3c,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x05,0x3f,0x04,0xa3,0x00,0x0f,0x00,0x1e,0x00,0x20,0x40,0x10,0x04,0x89,0x13,0x13,0x20,0x1b,0x89,0x0c,0x00,0x99,0x17,0x06,0x10,0x99,0x08,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,\r\n0x12,0x24,0x13,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x02,0xe2,0xaa,0x01,0x18,0x9b,0x9e,0xfe,0xe6,0xaf,0xa9,0xfe,0xe7,0x9e,0xa0,0x01,0x1e,0xa2,0xcb,0xf2,0x6d,0xc7,0x7f,0x82,0xcd,0x71,0x71,0xc9,0x04,0xa3,0x9a,0xfe,0xed,0xad,0xad,0xfe,0xec,0x96,0x9c,0x01,0x14,0xa7,0xa9,0x01,0x15,0x9c,0xfb,\r\n0xe5,0xf9,0xc8,0x80,0xd0,0x74,0x76,0xd0,0x80,0x7d,0xcf,0x73,0x00,0x02,0x00,0x78,0xff,0xf7,0x05,0x3b,0x04,0xa3,0x00,0x2a,0x00,0x36,0x00,0x61,0xb5,0x29,0x89,0x04,0x00,0x01,0x19,0xbb,0x01,0x82,0x00,0x2e,0x00,0x33,0x01,0x82,0x40,0x12,0x13,0x11,0x2e,0x13,0x04,0x01,0x2e,0x13,0x13,0x2e,0x01,0x04,0x04,0x38,0x0c,0x89,0x21,0x0f,\r\n0xb8,0x01,0x7f,0x40,0x11,0x2b,0x11,0x31,0x11,0x16,0x1d,0x16,0x1d,0x16,0x00,0x25,0x99,0x08,0x06,0x01,0x00,0x18,0x00,0x3f,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x32,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x27,0x36,\r\n0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x10,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0xf3,0x75,0x80,0x94,0x70,0xc9,0x81,0x85,0xc7,0x6e,0x85,\r\n0x6e,0x2d,0x15,0x38,0x69,0x48,0x48,0x6b,0x5b,0xa4,0x6f,0x75,0xbc,0x68,0xa0,0x01,0x11,0xaf,0xa5,0x01,0x15,0xa9,0xfd,0x93,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x09,0x70,0x69,0x01,0x19,0x97,0x65,0xb9,0x6f,0x6a,0xbc,0x71,0x9a,0xb4,0x0b,0x34,0x4d,0x4b,0x69,0x6b,0x49,0x4e,0x81,0x49,0x73,0xd6,0x8e,0x97,0x01,0x07,0x92,0x8e,0xfe,\r\n0xfa,0x8f,0xfe,0x90,0x65,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x04,0x52,0x06,0x66,0x00,0x25,0x00,0x31,0x00,0x5a,0xbf,0x00,0x2f,0x01,0x82,0x00,0x03,0x00,0x17,0x01,0x84,0x00,0x16,0x00,0x09,0x01,0x82,0x40,0x22,0x29,0x00,0x16,0x29,0x03,0x16,0x29,0x29,0x16,0x03,0x03,0x33,0x20,0x89,0x11,\r\n0x13,0x1b,0x2c,0x06,0x31,0x00,0x1b,0x16,0x00,0x06,0x06,0x0d,0x17,0x16,0x07,0x24,0x99,0x0d,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x39,0x12,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x26,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x01,0x36,0x12,0x37,0x17,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x39,0x26,0x26,0x65,0x4b,0x50,0x65,0x6c,0xc8,0x7e,0xa2,0xfb,0x8b,0x01,0x82,0x94,0xca,0x3a,0x92,0x2e,0x5c,0x75,0x8d,0x69,\r\n0x8f,0x57,0x27,0x69,0xba,0x6a,0x61,0x90,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0xa1,0x26,0x3e,0x2d,0x50,0x62,0x68,0x4a,0x58,0x93,0x55,0x7f,0xe8,0x93,0x01,0x2b,0x01,0x35,0x77,0x01,0x06,0x9d,0x36,0x7b,0xa7,0x89,0x77,0x5a,0x91,0x7b,0x71,0x51,0x5c,0xa0,0x62,0x6b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x50,\r\n0xff,0xf2,0x05,0x71,0x06,0xac,0x00,0x45,0x00,0x50,0x00,0x5c,0x00,0x88,0x40,0x23,0x4e,0x89,0x27,0x54,0x22,0x07,0x89,0x3f,0x24,0x46,0x16,0x2f,0x04,0x27,0x2d,0x89,0x48,0x0f,0x89,0x35,0x22,0x3f,0x27,0x3f,0x48,0x35,0x45,0x45,0x35,0x48,0x3f,0x27,0x05,0x5e,0x5a,0xb8,0x01,0x82,0x40,0x1e,0x1c,0x0a,0x3b,0x45,0x3b,0x00,0x00,0x2a,\r\n0x04,0x9b,0x42,0x2a,0x57,0x9b,0x24,0x2f,0x22,0x16,0x04,0x19,0x46,0x2a,0x1f,0x1f,0x19,0x4c,0x9b,0x2a,0x06,0x51,0xb8,0x01,0x7d,0xb5,0x19,0x19,0x32,0x99,0x13,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x17,0x39,0xed,0x10,0xd4,0xed,0x12,0x39,0x2f,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x26,0x02,0x35,0x34,0x36,0x33,0x32,0x16,\r\n0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x12,0x35,0x34,0x2e,0x03,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x04,0x17,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x90,0xec,0x71,0x4f,0x26,0x1d,0x2a,0x44,0x67,0xe9,0xc2,0x6f,0x35,0x64,0xb5,0x71,0x62,0xcb,\r\n0x6a,0x47,0x9f,0x69,0x49,0x68,0x69,0x48,0x36,0x57,0x16,0x27,0x1c,0x54,0x7a,0x7f,0x62,0x76,0x86,0x56,0x5d,0xa3,0x39,0x6d,0x81,0x1f,0x3c,0x59,0x73,0xb3,0x78,0x6a,0x3e,0x8b,0x66,0x56,0x01,0x2a,0x96,0xfd,0x51,0x27,0x2e,0x24,0x17,0x20,0x39,0xf9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0x66,0x71,0x2d,0x12,0x2d,0x1e,0x1d,0x2e,\r\n0x28,0x59,0x74,0x93,0xcf,0x8f,0xc0,0xfe,0xc6,0xae,0x81,0x6f,0x78,0x78,0x69,0x49,0x4b,0x69,0x3b,0x30,0x32,0x4c,0x74,0x01,0x4f,0x72,0x72,0x97,0xd8,0xd4,0x9c,0xe5,0x73,0x81,0x01,0x1d,0xfc,0x65,0x92,0x6c,0x4c,0x3c,0x40,0x2b,0x43,0x57,0x3a,0x5f,0x82,0x68,0x53,0xfc,0x2e,0x69,0x77,0x81,0x93,0x39,0x3e,0x4c,0xe4,0xfd,0xf9,0x27,\r\n0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x78,0xff,0xf2,0x05,0x25,0x06,0x3d,0x00,0x3d,0x00,0x47,0x00,0x53,0x00,0x8b,0xbc,0x00,0x0d,0x01,0x84,0x00,0x43,0x00,0x3b,0x01,0x82,0x40,0x44,0x4b,0x25,0x89,0x22,0x51,0x03,0x03,0x3e,0x08,0x03,0x43,0x06,0x8a,0x34,0x13,0x32,0x22,0x34,0x43,0x4b,0x22,0x34,0x34,0x22,0x4b,\r\n0x43,0x04,0x55,0x2d,0x89,0x19,0x46,0x0a,0x53,0x00,0x4d,0x38,0x1d,0x29,0x08,0x32,0x3e,0x13,0x04,0x10,0x0a,0x03,0x00,0x29,0x38,0x23,0x0a,0x00,0x38,0x38,0x00,0x0a,0x03,0x10,0x23,0x06,0x30,0x99,0x15,0x19,0x40,0x10,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x11,0x12,0x17,0x39,\r\n0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x17,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,\r\n0x36,0x36,0x37,0x24,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x05,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x42,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,\r\n0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x5c,0xbc,0xa9,0x01,0x42,0x85,0x4b,0x1e,0xa8,0xb4,0xcc,0xfe,0xf4,0x87,0x98,0x44,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0xf8,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x5e,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x02,0x0e,0x4c,0x3a,0x16,0x70,0x42,0x4f,\r\n0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa5,0xe0,0x8c,0x2c,0x54,0x2f,0x34,0x41,0x2f,0xa3,0xb0,0x86,0xa0,0x34,0x45,0x23,0x6d,0xa7,0xa2,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0xfe,0xb6,0x50,0x2c,0x1f,0x20,0x27,0x01,0x7b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x04,0x00,0x78,\r\n0xff,0xf2,0x05,0x25,0x06,0x3d,0x00,0x47,0x00,0x51,0x00,0x5c,0x00,0x68,0x00,0xba,0xb9,0x00,0x59,0x01,0x82,0xb6,0x3a,0x38,0x03,0x42,0x03,0x3a,0x40,0xb8,0x01,0x82,0x40,0x13,0x54,0x00,0x8a,0x45,0x3a,0x54,0x45,0x45,0x54,0x3a,0x03,0x33,0x6a,0x20,0x8a,0x10,0x66,0x1d,0x17,0xbb,0x01,0x82,0x00,0x60,0x00,0x27,0x01,0x84,0x40,0x41,\r\n0x4d,0x1d,0x48,0x22,0x2d,0x0e,0x05,0x60,0x10,0x60,0x4d,0x4d,0x60,0x10,0x03,0x6a,0x09,0x89,0x33,0x50,0x24,0x68,0x1a,0x62,0x14,0x06,0x38,0x03,0x42,0x56,0x3d,0x22,0x0e,0x48,0x2d,0x04,0x2a,0x24,0x1d,0x1a,0x42,0x52,0x38,0x03,0x14,0x3d,0x24,0x1a,0x14,0x3d,0x3d,0x14,0x1a,0x24,0x04,0x2a,0x47,0x06,0x0c,0x99,0x2f,0x19,0x4a,0x2a,\r\n0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x11,0x39,0x11,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,\r\n0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,\r\n0x36,0x25,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x36,0x35,0x35,0x33,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x12,0xd0,0xa8,0x23,0x72,0x80,0xc7,0x9c,0x4c,0x4a,0x41,0xc6,\r\n0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0x47,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x68,0xe7,0x01,0x20,0x0f,0x4c,0x66,0x4d,0x4a,0x67,0x0b,0x2b,0x3f,0xa5,0xfe,0x7f,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x7d,0x35,0x2a,0x17,0x1c,0x25,0x31,0xf7,0x1a,0x27,0x27,0x1a,0x1a,\r\n0x26,0x26,0x05,0xd5,0x99,0xbe,0x23,0x3c,0x31,0x4a,0xd9,0xb6,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa6,0xc8,0x9e,0x6b,0x08,0x35,0x5c,0x49,0x6b,0x71,0x47,0x18,0x1d,0x1c,0x6b,0x4b,0x5e,0xfa,0x87,0x50,0x2c,0x1f,\r\n0x20,0x27,0x03,0xf6,0x21,0x29,0x1c,0x29,0x27,0x1e,0x18,0x30,0xfd,0x83,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x78,0xff,0xf2,0x06,0x58,0x06,0xac,0x00,0x4d,0x00,0x58,0x00,0x64,0x00,0xad,0x40,0x0c,0x2a,0x29,0x38,0x89,0x1c,0x0c,0x3e,0x4e,0x16,0x04,0x0e,0x14,0xb8,0x01,0x84,0xb4,0x51,0x31,0x89,0x24,0x57,0xbb,\r\n0x01,0x84,0x00,0x0e,0x00,0x4b,0x01,0x82,0x40,0x26,0x5c,0x62,0x03,0x03,0x5c,0x44,0x29,0x1c,0x51,0x24,0x0e,0x5c,0x5c,0x0e,0x24,0x51,0x1c,0x29,0x06,0x66,0x06,0x89,0x44,0x21,0x34,0x29,0x34,0x2a,0x2a,0x5f,0x2e,0x9b,0x27,0x5f,0x54,0x9b,0x11,0x59,0xb8,0x01,0x7d,0x40,0x11,0x00,0x4e,0x16,0x0c,0x3e,0x04,0x40,0x11,0x03,0x00,0x5f,\r\n0x11,0x00,0x11,0x00,0x40,0x48,0xb8,0x01,0x7d,0xb7,0x5f,0x06,0x18,0x0a,0x99,0x3c,0x40,0x19,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xd4,0xed,0x12,0x39,0x2f,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,\r\n0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x05,0x07,0x27,\r\n0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x32,0x36,0x57,0x15,0x2e,0x40,\r\n0x54,0x94,0x54,0x5b,0x40,0x63,0x79,0x5a,0x5b,0x6f,0x5d,0x39,0x62,0x50,0x93,0x59,0x35,0x74,0xd1,0xa0,0x70,0x6f,0x92,0x5d,0xa7,0x01,0x70,0x46,0x8f,0xa7,0x5a,0x3f,0x1d,0x28,0x48,0x5f,0xfb,0xed,0x69,0x84,0xe1,0x82,0x9d,0x6d,0x71,0x98,0x87,0xe1,0x7e,0x76,0xcc,0x78,0x48,0x6b,0x6c,0xf0,0x14,0x25,0x21,0x1a,0x1a,0x25,0xf4,0x1a,\r\n0x27,0x27,0x1a,0x1a,0x26,0x26,0x03,0x50,0x3b,0x30,0x43,0xe3,0x6e,0x71,0xc0,0x6e,0x37,0x6f,0x87,0x62,0x7f,0x7f,0x62,0x87,0x6d,0x39,0x88,0xe6,0x80,0xa4,0xa7,0x7b,0x70,0x38,0x27,0x7e,0x4e,0x58,0x7d,0xbb,0x8b,0x43,0x4f,0x1e,0x2e,0x1d,0x20,0x2f,0x24,0x5d,0xb8,0xfe,0xfe,0xcb,0xaf,0xfe,0xd5,0xaa,0x6a,0x6a,0x94,0x01,0x04,0x9f,\r\n0xa1,0x01,0x3a,0xb2,0x6b,0x49,0x49,0x69,0xfd,0xd9,0x14,0x57,0x17,0x2f,0x35,0x32,0x2a,0x4b,0x02,0x5b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x64,0xfd,0xeb,0x05,0x98,0x04,0xa5,0x00,0x2d,0x00,0x37,0x00,0x43,0x00,0x85,0xb3,0x3b,0x1e,0x21,0x40,0xb8,0x01,0x82,0xb2,0x19,0x0f,0x00,0xb8,0x01,0x83,0x40,0x14,0x2e,\r\n0x23,0x2e,0x11,0x89,0x21,0x06,0x89,0x07,0x19,0x2e,0x21,0x07,0x07,0x21,0x2e,0x19,0x04,0x45,0x33,0xb8,0x01,0x83,0x40,0x11,0x28,0x3f,0x9b,0x35,0x25,0x1e,0x16,0x1c,0x23,0x0f,0x25,0x1c,0x25,0x1c,0x25,0x0c,0x38,0xb8,0x01,0x7d,0x40,0x0f,0x07,0x16,0x19,0x30,0x2b,0x2e,0x00,0x00,0x0c,0x2b,0x2b,0x02,0x99,0x0c,0x06,0x00,0x3f,0xed,\r\n0x39,0x2f,0x12,0x39,0x11,0x33,0x11,0x33,0x3f,0xc6,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x39,0x11,0x12,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x24,0x33,0x32,0x12,0x15,0x11,0x23,0x11,0x34,0x26,0x26,0x23,\r\n0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xfc,0x01,0x16,0xc4,0xd3,0xef,0xa8,0x4d,0x82,\r\n0x4b,0x4c,0xee,0x5f,0x39,0x39,0x57,0x74,0x44,0x49,0x68,0x69,0x48,0x3b,0x32,0x17,0x1a,0x22,0x48,0x41,0x57,0x66,0x70,0x4a,0x48,0x5f,0x44,0x29,0x3d,0x1b,0x24,0x26,0x19,0x2c,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x0f,0x96,0xfe,0xeb,0xf3,0xfb,0x4e,0x04,0xb2,0x66,0xab,0x61,0x4b,0x36,0xa7,0xba,0x55,0xea,0xa3,0x59,0x69,\r\n0x49,0x4b,0x69,0x27,0x34,0x8f,0x37,0xac,0x73,0x22,0x69,0x52,0x4c,0x70,0x3c,0x92,0x5a,0x2a,0x1b,0x1b,0x30,0xfc,0xca,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x04,0x00,0x70,0xfe,0xa4,0x05,0x65,0x04,0xa5,0x00,0x4a,0x00,0x5d,0x00,0x67,0x00,0x73,0x00,0xa6,0xb3,0x0a,0x56,0x14,0x0c,0xb8,0x01,0x82,0x40,0x09,0x5e,0x24,\r\n0x06,0x89,0x5a,0x62,0x8c,0x14,0x3d,0xb8,0x01,0x82,0x40,0x1e,0x6b,0x71,0x37,0x34,0x89,0x44,0x37,0x6b,0x44,0x5e,0x5a,0x14,0x6b,0x44,0x44,0x6b,0x14,0x5a,0x5e,0x05,0x75,0x4b,0x89,0x1d,0x2b,0x9b,0x00,0x00,0x03,0x48,0xb8,0x01,0x80,0xb4,0x31,0x54,0x0a,0x14,0x68,0xb8,0x01,0x7d,0x40,0x1b,0x40,0x5a,0x21,0x6e,0x9b,0x3a,0x56,0x60,\r\n0x14,0x03,0x1a,0x21,0x37,0x3a,0x40,0x3a,0x40,0x3a,0x1a,0x28,0x31,0x06,0x4e,0x99,0x1a,0x19,0x65,0xb8,0x01,0x7d,0xb1,0x0f,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x12,0x17,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x10,0xed,0x11,0x39,0x39,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x11,0x10,0x02,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x36,0x35,0x34,\r\n0x26,0x26,0x23,0x22,0x07,0x06,0x07,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x36,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x35,0x01,0x06,0x06,0x05,0x34,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,\r\n0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xfa,0x1d,0xd2,0x3c,0xa8,0x98,0x19,0x38,0x34,0x5e,0x6b,0x48,0x49,0x6a,0x15,0x5b,0x45,0xbc,0x86,0x8c,0x3e,0x63,0x6e,0xae,0xbf,0x02,0x0d,0x7d,0x54,0x1c,0x3c,0x40,0x56,0xa3,0x22,0x0f,0x14,0x39,0x4a,0x5a,0x36,0x58,0x60,0x39,0x2c,0x0d,0x62,0x3f,0x48,0x6b,0x6c,\r\n0x47,0x74,0xcf,0x7a,0x5c,0xa6,0x66,0x44,0x9c,0xfe,0x62,0x21,0x16,0x1c,0x60,0x60,0x82,0x01,0x21,0x42,0x21,0x2c,0x26,0x31,0xfd,0x99,0xae,0x87,0x03,0xb6,0x47,0x3c,0x26,0x1c,0x1c,0x25,0xfd,0x5f,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x3f,0x1b,0x49,0xee,0xff,0x00,0xfe,0xff,0xfe,0xf8,0x88,0x1b,0x35,0x7e,0x46,0x6c,0x6c,0x51,\r\n0x20,0x26,0x16,0x1e,0x57,0x41,0x2f,0x6a,0x67,0x56,0x95,0x53,0xe5,0x36,0x7a,0x72,0x7d,0x8f,0x3f,0x5a,0x13,0x05,0x03,0x24,0x2a,0x21,0x78,0x7b,0x3a,0x70,0x1b,0x44,0x50,0x6b,0x49,0x49,0x69,0x70,0xc2,0x71,0x71,0xaf,0x5f,0x38,0xfb,0x11,0x1d,0x1f,0x25,0x2e,0x3e,0x68,0x06,0x19,0x7f,0x49,0x42,0xfe,0xf0,0x4d,0x5b,0x46,0x35,0x20,\r\n0x24,0x31,0x19,0x29,0x26,0x02,0xb8,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0xff,0xf2,0x06,0xb5,0x04,0xa1,0x00,0x33,0x00,0x3f,0x00,0x64,0x40,0x09,0x02,0x89,0x31,0x00,0x33,0x27,0x89,0x0d,0x1a,0xb8,0x01,0x82,0x40,0x1b,0x37,0x3d,0x14,0x14,0x37,0x21,0x31,0x33,0x0d,0x37,0x37,0x0d,0x33,0x31,0x04,0x41,\r\n0x12,0x89,0x21,0x3a,0x9b,0x14,0x1d,0x17,0x17,0x0f,0x34,0xb8,0x01,0x7d,0x40,0x0c,0x1d,0x19,0x33,0x00,0x24,0x99,0x0f,0x06,0x2e,0x99,0x06,0x19,0x00,0x3f,0xed,0x3f,0xed,0xc4,0x32,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x10,0xed,0x11,0x33,\r\n0x10,0xed,0x31,0x30,0x01,0x12,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x37,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x10,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x06,0x13,0xa2,0x70,0xcd,0x84,0x78,0xca,0x6a,0x03,0x0c,0xfe,0xe9,0x88,0x97,0x5e,0x17,0x50,0x30,0x48,0x6b,0x6c,0x47,0x6e,0xba,0x76,0xf3,0xcf,0xcf,0xf6,0x06,0x07,0x91,0x83,0x78,0x8d,0x9c,0xfc,0xa9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x9f,0xfe,0x8d,0xfe,0xdf,0x9f,0xf6,0x84,0x5f,0xb4,0x7a,0x56,0xcd,\r\n0x22,0x01,0x47,0xc6,0xb2,0xfe,0xf2,0x83,0x27,0x2f,0x6b,0x49,0x49,0x69,0xb0,0x01,0x49,0xa5,0xf4,0x01,0x1d,0xfd,0xdc,0x30,0x6b,0x6c,0x33,0x7a,0x8c,0xbb,0xc8,0x01,0x1a,0x01,0x42,0xfb,0xfe,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x78,0x01,0xb4,0x03,0xde,0x05,0x9a,0x00,0x0c,0x00,0x1c,0x00,0x1f,0x40,0x0f,\r\n0x11,0x89,0x09,0x09,0x1e,0x03,0x89,0x19,0x06,0x99,0x15,0x00,0x9b,0x0d,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x2c,0x79,0x93,0x8d,0x7f,\r\n0x80,0x8a,0x42,0x78,0x50,0x74,0xcb,0x73,0x6d,0xc8,0x7d,0x75,0xcb,0x74,0x6f,0xca,0x05,0x09,0xc9,0x9a,0xa5,0xbc,0xbb,0xa6,0x62,0xa6,0x5b,0x91,0x86,0xe6,0x89,0x92,0xe3,0x7c,0x80,0xe4,0x8d,0x8c,0xe6,0x83,0x00,0x01,0x00,0x64,0xff,0x83,0x03,0x98,0x05,0x9a,0x00,0x1d,0x00,0x38,0x40,0x1c,0x19,0x89,0x0e,0x0d,0x1d,0x00,0x03,0x0d,\r\n0x00,0x00,0x0d,0x03,0x03,0x1f,0x09,0x89,0x11,0x0d,0x0a,0x0e,0x0e,0x15,0x00,0x1d,0x06,0x9b,0x15,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x31,0x30,0x17,0x36,0x00,0x35,0x34,0x02,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,\r\n0x34,0x36,0x24,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x00,0x07,0xe9,0xfa,0x01,0x0b,0x5d,0x3d,0x35,0xb1,0x60,0x42,0x39,0x9b,0x39,0x51,0xa5,0x01,0x14,0x6f,0x4b,0x78,0x49,0x85,0xfe,0xf0,0xb0,0x19,0xe7,0x01,0xb7,0xba,0x97,0x01,0x33,0x35,0x39,0x18,0x4b,0xb0,0x43,0x4d,0x51,0xe6,0x5f,0x3a,0x78,0x5a,0x88,0xfe,0xed,0x90,0x9b,0xfe,\r\n0xae,0xfe,0x9b,0x9a,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x00,0x05,0x9a,0x00,0x23,0x00,0x38,0x40,0x1b,0x00,0x23,0x23,0x25,0x0c,0x20,0x0f,0x08,0x08,0x16,0x1c,0x89,0x0f,0x05,0x9b,0x20,0x0a,0x15,0x0a,0x15,0x00,0x12,0x9b,0x19,0x06,0x23,0x00,0x00,0x2f,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0xed,0x01,0x2f,0xed,0xc4,0x39,\r\n0x2f,0x12,0x39,0x39,0x11,0x39,0x2f,0x33,0x31,0x30,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x12,0x13,0x03,0x67,0x21,0x4d,0x63,0x85,0x57,0x74,0x5b,0x1b,0x6d,0xb8,0x41,0x41,0x5d,0x79,0x77,0x6a,\r\n0x53,0xf2,0x6d,0x42,0xa3,0xe7,0x6b,0xba,0xd0,0x38,0x61,0x64,0x62,0x88,0x1c,0x7d,0xf0,0x01,0x05,0xa0,0x59,0x36,0x8c,0x3b,0x18,0x54,0xc7,0x48,0x59,0x63,0x90,0x73,0x85,0x90,0x7f,0x98,0x8b,0x5d,0x9f,0x89,0x5d,0x5f,0xfe,0x91,0xfe,0xff,0x00,0x01,0x00,0x78,0xff,0x83,0x03,0xd3,0x05,0x9a,0x00,0x31,0x00,0x64,0x40,0x33,0x1f,0x1e,\r\n0x1e,0x33,0x07,0x18,0x89,0x2b,0x28,0x04,0x00,0x16,0x2b,0x07,0x0e,0x00,0x2b,0x2b,0x00,0x0e,0x03,0x24,0x14,0x89,0x07,0x2e,0x9b,0x02,0x16,0x02,0x21,0x9b,0x26,0x0d,0x11,0x02,0x28,0x1c,0x26,0x1f,0x02,0x26,0x02,0x26,0x11,0x1e,0x1f,0x0a,0x9b,0x11,0x06,0x00,0x3f,0xed,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,\r\n0x12,0x39,0x10,0xed,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,0x39,0x10,0xed,0x11,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x17,0x07,\r\n0x02,0x21,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0x0a,0x8c,0x8f,0x33,0x2e,0x59,0x4a,0x5c,0x69,0x4e,0xec,0x60,0x3c,0x8b,0xee,0x71,0x9c,0xbf,0xb1,0x8e,0x2d,0x63,0x53,0x88,0x5b,0x8d,0xa8,0xfe,0xa1,0x37,0x36,0x37,0x5f,0x69,0x85,0x6c,0x59,0x7c,0x78,0x73,0x43,0x81,0x23,0x03,0x68,\r\n0x36,0x08,0x41,0x67,0x32,0x4b,0x4e,0x7f,0x5b,0x7b,0x77,0x79,0x99,0x84,0x8b,0x92,0x52,0x93,0x59,0x78,0x75,0x37,0x69,0xc4,0x4e,0x01,0x68,0x14,0x81,0x23,0x28,0x2c,0x97,0x46,0x53,0x5e,0x18,0x11,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x81,0x05,0x9a,0x00,0x22,0x00,0x33,0x40,0x1a,0x1c,0x89,0x04,0x0e,0x02,0x0e,0x20,0x20,0x0e,0x02,\r\n0x03,0x24,0x09,0x89,0x14,0x21,0x9b,0x20,0x20,0x0f,0x04,0x9b,0x18,0x06,0x0e,0x0f,0x00,0x2f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0xed,0x31,0x30,0x01,0x20,0x11,0x34,0x37,0x22,0x0e,0x02,0x15,0x14,0x12,0x12,0x04,0x17,0x07,0x26,0x00,0x00,0x02,0x35,0x34,0x36,0x24,0x33,0x32,\r\n0x17,0x06,0x15,0x14,0x16,0x33,0x37,0x07,0x06,0x04,0x29,0xfe,0x53,0x0e,0x2e,0xa9,0x76,0x1b,0x86,0xfb,0x01,0x1c,0x77,0x30,0x97,0xfe,0xb0,0xfe,0xe9,0x90,0x57,0x01,0x32,0x83,0x8e,0x27,0x13,0x8a,0x91,0x40,0x10,0x2a,0x02,0xa8,0x01,0xc3,0x57,0x50,0x1c,0x23,0x2a,0x45,0x92,0xfe,0xa9,0xfe,0xad,0xf2,0x2b,0x88,0x32,0x01,0x13,0x01,\r\n0x80,0x01,0x7e,0xac,0x6f,0x61,0x58,0x29,0x9f,0x3f,0xb0,0x9e,0x05,0x9d,0x05,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0xff,0x05,0xae,0x00,0x16,0x00,0x3a,0x40,0x1c,0x04,0x03,0x00,0x89,0x16,0x07,0x14,0x16,0x03,0x16,0x03,0x16,0x18,0x0e,0x8a,0x0d,0x12,0x99,0x07,0x0e,0x09,0x09,0x04,0x00,0x0e,0x07,0x03,0x04,0x00,0x2f,0x33,0x3f,\r\n0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x12,0x12,0x17,0x07,0x26,0x02,0x03,0x06,0x23,0x22,0x26,0x02,0x03,0x37,0x17,0x12,0x16,0x33,0x32,0x37,0x02,0x03,0x03,0x36,0x19,0xee,0xc2,0x4c,0x98,0xe5,0x46,0xa6,0x81,0x73,0x93,0x48,0x03,0xa5,0x08,\r\n0x09,0x69,0x6d,0x3c,0x91,0x3c,0x0b,0x05,0xae,0xfd,0xd5,0xfd,0x09,0x8f,0x7a,0x62,0x01,0x9b,0x01,0x24,0x56,0x9e,0x01,0x57,0x01,0x57,0x14,0x9d,0xfe,0xbf,0xf1,0x4e,0x01,0x2c,0x01,0x41,0x00,0x01,0x00,0x78,0xff,0xf6,0x05,0x17,0x05,0x9a,0x00,0x2c,0x00,0x3f,0x40,0x20,0x17,0x16,0x16,0x1c,0x24,0x89,0x08,0x1c,0x89,0x10,0x08,0x10,\r\n0x08,0x10,0x2e,0x00,0x8a,0x2c,0x1c,0x08,0x28,0x00,0x00,0x13,0x04,0x99,0x28,0x18,0x19,0x9b,0x13,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x12,0x12,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x02,0x03,0x01,0x1c,0x0d,0x94,0xef,0x9d,0x39,0x8f,0x5c,0x61,0x61,0x70,0x7f,0x73,0x40,0xdb,0xaf,0x53,0xa0,0x5b,0x4e,0x9a,0x65,0x67,0x7a,0x5f,0x63,0x99,0x7d,0x57,0x35,0x8c,0xee,0x74,0xbe,0xfe,0xe1,\r\n0xb5,0x1f,0x04,0x66,0xfe,0xd1,0xfe,0x33,0xe3,0x5a,0x91,0x52,0x42,0x6d,0x31,0x38,0x3f,0x62,0x7a,0x4e,0x95,0xc0,0x45,0x42,0x73,0x69,0x6c,0x5a,0x3c,0x6a,0x34,0x51,0x4b,0x54,0x68,0x41,0x70,0xdb,0x8f,0xf0,0x01,0xf1,0x01,0x75,0x00,0x01,0x00,0x64,0xff,0xf6,0x05,0x65,0x05,0xae,0x00,0x26,0x00,0x46,0x40,0x12,0x00,0x8b,0x26,0x1b,\r\n0x89,0x0c,0x1f,0x0c,0x07,0x26,0x0c,0x07,0x07,0x0c,0x26,0x03,0x28,0x12,0xb8,0x01,0x84,0x40,0x10,0x13,0x13,0x07,0x12,0x12,0x04,0x0f,0x9b,0x17,0x06,0x21,0x99,0x04,0x18,0x00,0x07,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x31,0x30,\r\n0x01,0x0a,0x02,0x23,0x22,0x26,0x27,0x36,0x37,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x02,0x03,0x27,0x12,0x12,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x02,0x07,0x16,0x33,0x32,0x36,0x12,0x12,0x13,0x05,0x65,0x07,0x72,0xf7,0xd9,0x71,0x98,0x45,0x0a,0x19,0x89,0x6d,0x67,0x6b,0x79,0x90,0x1b,0x8d,0x1c,0x68,0xb7,0x93,0x6f,0x9c,0x54,\r\n0x3e,0x73,0x3a,0x34,0x2c,0x83,0xa4,0x61,0x31,0x0a,0x05,0xae,0xfd,0xac,0xfd,0xa6,0xfe,0xf6,0x29,0x2a,0x18,0x2c,0xef,0x01,0x4f,0x8a,0x92,0x81,0xfe,0xe8,0xfe,0xbd,0x2f,0x01,0x1b,0x01,0x19,0x89,0x65,0xb1,0x68,0x69,0xfe,0xf8,0xfe,0xe9,0x5c,0x10,0x77,0x01,0x01,0x01,0xc4,0x01,0xd7,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x5a,\r\n0x05,0xae,0x00,0x15,0x00,0x2f,0x40,0x15,0x0c,0x0d,0x00,0x15,0x0f,0x08,0x0d,0x15,0x0d,0x15,0x17,0x08,0x0f,0x08,0x07,0x07,0x0d,0x0c,0x07,0x15,0x00,0x00,0x2f,0x32,0x3f,0x33,0x39,0x2f,0x33,0x33,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x3e,0x02,\r\n0x37,0x17,0x04,0x07,0x36,0x33,0x32,0x04,0x12,0x17,0x03,0xc1,0x12,0x80,0xa2,0xb4,0x5b,0x83,0x60,0x23,0x2b,0x9f,0xda,0x63,0x6a,0xfe,0xeb,0x87,0x38,0x3e,0x89,0x01,0x1b,0xda,0x19,0x7d,0x81,0x01,0x4c,0xf6,0x85,0x39,0x7e,0x67,0xef,0xf2,0x56,0x64,0xff,0xf6,0x07,0xfe,0xfe,0x43,0xdb,0x00,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0x2a,\r\n0x05,0x9a,0x00,0x25,0x00,0x3e,0x40,0x20,0x00,0x25,0x0e,0x89,0x16,0x09,0x89,0x1c,0x25,0x16,0x1c,0x11,0x11,0x1c,0x16,0x25,0x04,0x27,0x23,0x89,0x02,0x11,0x0e,0x06,0x12,0x12,0x00,0x1c,0x9b,0x06,0x06,0x00,0x00,0x2f,0x3f,0xec,0x12,0x39,0x2f,0x12,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,\r\n0x11,0x33,0x31,0x30,0x17,0x26,0x35,0x10,0x12,0x00,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x02,0x15,0x14,0x17,0xa3,0x2b,0xce,0x01,0x45,0xbc,0x66,0x6c,0x73,0x4b,0x28,0x85,0x72,0x21,0x7a,0xaa,0x5c,0x36,0x3d,0x3a,0x39,0x1e,0x2b,\r\n0x88,0xeb,0x91,0x2e,0x7d,0x95,0xc0,0x01,0x31,0x02,0x4d,0x01,0x44,0x4d,0x45,0x88,0x6b,0x46,0x33,0x1a,0x41,0x54,0x0f,0x91,0x12,0x54,0x74,0x3d,0x28,0x56,0x3b,0x38,0x5c,0x2d,0x19,0x12,0xfe,0xda,0xfd,0xf6,0xfc,0xc5,0x78,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x01,0x03,0x6e,0x00,0x0f,0x00,0x1b,0x00,0x21,0x40,0x0c,0x00,0x8b,\r\n0x10,0x10,0x1d,0x16,0x8b,0x08,0x13,0x9b,0x0c,0x19,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x01,0x78,0xd2,0x78,0x78,0xd0,\r\n0x77,0x79,0xd0,0x76,0x79,0xd0,0x79,0x97,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x01,0xaf,0x76,0xce,0x7a,0x79,0xd0,0x75,0x7a,0xd1,0x74,0x75,0xd0,0x7a,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x00,0x01,0x00,0x7f,0xff,0xf1,0x03,0xda,0x03,0x6e,0x00,0x1b,0x00,0x34,0x40,0x12,0x1b,0x0f,0x0f,0x00,0x0e,0x07,0x8b,0x15,0x00,0x1b,\r\n0x0e,0x0f,0x1b,0x0f,0x1b,0x0f,0x03,0x12,0xb8,0x01,0x7f,0xb3,0x0b,0x18,0x9b,0x03,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x32,0x11,0x33,0x31,0x30,0x13,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,\r\n0x23,0x22,0x06,0x07,0x80,0x3d,0xe0,0x84,0x79,0xcb,0x75,0x7c,0xd1,0x76,0x85,0xda,0x39,0x89,0x26,0x88,0x59,0x84,0xb0,0xac,0x7e,0x5c,0x93,0x24,0x02,0x68,0x7a,0x8c,0x7a,0xd0,0x75,0x73,0xd1,0x7a,0x91,0x7b,0x37,0x54,0x60,0xab,0x7c,0x7f,0xb9,0x65,0x58,0x00,0x00,0x01,0x00,0x3a,0xfd,0xfe,0x03,0xc2,0x03,0x64,0x00,0x12,0x00,0x24,\r\n0x40,0x0d,0x00,0x8b,0x10,0x10,0x14,0x09,0x8b,0x08,0x08,0x08,0x04,0x11,0x0d,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xc2,0x70,0xc5,0x85,0x92,0xcf,0x6d,0x98,\r\n0x4d,0x8d,0x5c,0x88,0x9b,0x97,0x0d,0x91,0xef,0x75,0x6f,0xc7,0x82,0x52,0x8a,0x4d,0xc8,0xb1,0x03,0x5e,0x00,0x01,0x00,0x7f,0xfd,0xfe,0x03,0xda,0x03,0x6e,0x00,0x1f,0x00,0x47,0x40,0x1b,0x00,0xa8,0x1f,0x1f,0x21,0x1e,0x0a,0x10,0x04,0x04,0x11,0x03,0x18,0x8b,0x0a,0x11,0x10,0x03,0x1e,0x04,0x1c,0x10,0x04,0x10,0x04,0x14,0x07,0xb8,\r\n0x01,0x7f,0xb4,0x1c,0x0d,0x9b,0x14,0x00,0x00,0x2f,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x11,0x33,0x01,0x2f,0xed,0xc4,0x32,0x32,0x11,0x33,0x11,0x39,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x01,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,\r\n0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x27,0x01,0x03,0x0f,0xfd,0xcb,0x2d,0x2e,0x89,0x26,0x88,0x59,0x83,0xb1,0xab,0x7f,0x5c,0x93,0x24,0x86,0x3d,0xe0,0x84,0x79,0xcc,0x74,0x7c,0xd1,0x76,0x05,0x05,0x01,0xc2,0xfd,0xfe,0x02,0x7d,0x32,0x54,0x38,0x54,0x60,0xa8,0x7e,0x80,0xb4,0x65,0x58,0x46,0x7a,0x8c,0x78,0xcd,0x75,0x73,0xd1,0x7a,\r\n0x01,0xfe,0x07,0x00,0x00,0x01,0x00,0x80,0xfd,0xfe,0x03,0xdb,0x03,0x6e,0x00,0x1f,0x00,0x45,0x40,0x1d,0x0f,0x1b,0x1b,0x0e,0x01,0x1c,0x1c,0x07,0x21,0x1f,0x89,0x00,0x15,0x8b,0x07,0x1c,0x1b,0x0e,0x0f,0x01,0x1b,0x0f,0x1b,0x0f,0x03,0x12,0x9b,0x0b,0x18,0xb8,0x01,0x7f,0xb1,0x03,0x00,0x00,0x2f,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,\r\n0x2f,0x2f,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xed,0xd4,0xed,0x11,0x12,0x39,0x2f,0x39,0x33,0x33,0x11,0x33,0x31,0x30,0x13,0x01,0x07,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x07,0x01,0x9f,0x01,0xb5,0x0b,0x06,0x75,0xd2,0x7c,0x74,\r\n0xcb,0x7a,0x84,0xdd,0x40,0x86,0x25,0x93,0x5b,0x7f,0xab,0xb2,0x82,0x59,0x88,0x26,0x89,0x2a,0x32,0xfd,0xe0,0xfd,0xfe,0x01,0xf9,0x01,0x7a,0xd0,0x74,0x74,0xcd,0x79,0x8b,0x7b,0x46,0x58,0x65,0xb3,0x81,0x7e,0xa8,0x60,0x54,0x38,0x50,0x36,0xfd,0x83,0x00,0x02,0x00,0x80,0xfd,0xfe,0x04,0x08,0x03,0x6e,0x00,0x27,0x00,0x33,0x00,0x5c,\r\n0xb4,0x14,0x8b,0x24,0x02,0x05,0xbb,0x01,0x83,0x00,0x2e,0x00,0x28,0x01,0x83,0x40,0x0d,0x0b,0x24,0x2e,0x0b,0x0b,0x2e,0x24,0x03,0x35,0x1d,0x8b,0x1c,0x31,0xbb,0x01,0x7e,0x00,0x02,0x00,0x2b,0x01,0x7e,0x40,0x0a,0x08,0x02,0x08,0x1c,0x1c,0x08,0x02,0x03,0x0f,0x21,0xb8,0x01,0x7f,0xb3,0x18,0x00,0x9b,0x0f,0x00,0x2f,0xed,0x2f,0xed,\r\n0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x10,0xed,0x31,0x30,0x01,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,\r\n0x35,0x11,0x34,0x26,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x4d,0x7a,0x52,0x55,0x73,0x82,0x61,0x5f,0x83,0x75,0xd3,0x81,0x86,0xc5,0x70,0x70,0xc6,0x85,0x91,0xcf,0x6d,0x98,0x4d,0x8d,0x5b,0x89,0x9b,0x99,0xfe,0x2b,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x02,0xdf,0x4e,0x0a,0x81,0x56,0x5b,0x87,0x84,\r\n0x5d,0x7b,0xce,0x76,0x76,0xee,0x91,0xfe,0x7a,0x90,0xef,0x76,0x6e,0xc8,0x82,0x56,0x86,0x4d,0xc8,0xb1,0x01,0x6a,0xb0,0xbf,0xfe,0xd2,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x2f,0x00,0x3b,0x00,0x6f,0xb9,0x00,0x30,0x01,0x83,0xb7,0x00,0x0b,0x8b,0x28,0x1a,0x8b,0x1b,0x06,\r\n0xb8,0x01,0x83,0x40,0x11,0x36,0x08,0x36,0x00,0x28,0x1b,0x36,0x36,0x1b,0x28,0x00,0x04,0x3d,0x23,0x8b,0x12,0x33,0xb8,0x01,0x7e,0x40,0x18,0x2d,0x08,0x2d,0x39,0x9b,0x03,0x2d,0x03,0x2f,0x1b,0x01,0x1b,0x30,0x2d,0x01,0x1b,0x03,0x2d,0x03,0x0e,0x1f,0x9b,0x17,0x25,0xb9,0x01,0x7f,0x00,0x0e,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,\r\n0x5d,0x2f,0x5d,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x12,0x15,0x23,0x34,0x26,0x26,\r\n0x23,0x22,0x06,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x07,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x0f,0x86,0x5c,0x5e,0x85,0x38,0x2a,0x35,0xfb,0xc6,0x8a,0xc6,0x6a,0x73,0xc5,0x82,0xd9,0xf5,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x01,0x23,0x94,0x96,0x3a,0x25,0x0a,0x0b,0x5e,0x83,\r\n0x7f,0x3c,0x27,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x02,0x7c,0x60,0x84,0x85,0x5e,0x52,0x43,0x1d,0x49,0x37,0x9f,0xbb,0x6a,0xd7,0x8c,0x02,0x54,0x8a,0xdf,0x6e,0xfe,0xf0,0xdb,0x60,0xa0,0x5c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x61,0x5b,0x23,0x2d,0x10,0x01,0x83,0x60,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x3c,0x00,0x00,0x01,0x00,0x80,0xfe,0x05,\r\n0x04,0x30,0x03,0x6e,0x00,0x32,0x00,0x43,0xb9,0x00,0x00,0x01,0x84,0x40,0x0c,0x32,0x23,0x8b,0x10,0x32,0x10,0x32,0x10,0x34,0x19,0x18,0x2a,0xb8,0x01,0x84,0x40,0x0b,0x08,0x18,0x19,0x32,0x19,0x32,0x04,0x13,0x9b,0x1f,0x2d,0xb9,0x01,0x7f,0x00,0x04,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0xed,0xc6,0x32,\r\n0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x0e,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x04,0x30,0x07,0x40,0x6d,\r\n0x4b,0x50,0x68,0x3a,0x1d,0x35,0x45,0x44,0x34,0x1c,0xaf,0x7c,0x7c,0xab,0x2d,0x7b,0x4a,0x79,0xd0,0x76,0x7a,0xd1,0x77,0x1e,0x32,0x50,0x58,0x35,0x2c,0x28,0x13,0x1d,0x1d,0x15,0x15,0xf9,0x48,0x74,0x46,0x32,0x5d,0x3b,0x3d,0x62,0x6e,0x6b,0x69,0x6c,0x69,0x34,0x7f,0xa7,0xae,0x82,0x58,0x4a,0x52,0x72,0x82,0x7a,0xd1,0x74,0x72,0xca,\r\n0x79,0x34,0x75,0x68,0x7e,0x88,0x88,0x37,0x2a,0x2c,0x09,0x19,0x23,0x48,0x00,0x02,0x00,0x80,0xff,0xf0,0x04,0x01,0x03,0x6e,0x00,0x1d,0x00,0x24,0x00,0x47,0xb5,0x1a,0x8b,0x03,0x1d,0x00,0x0c,0xb8,0x01,0x83,0x40,0x0f,0x1e,0x03,0x00,0x1e,0x1e,0x00,0x03,0x03,0x26,0x21,0x8b,0x12,0x00,0x1d,0x21,0xb8,0x01,0x7d,0xb6,0x09,0x09,0x0f,\r\n0x06,0x9b,0x16,0x23,0xb9,0x01,0x80,0x00,0x0f,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x2f,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,\r\n0x14,0x06,0x07,0x25,0x34,0x26,0x27,0x16,0x17,0x36,0x02,0xa5,0x53,0x72,0xaf,0x7c,0x64,0xa0,0x1a,0x7c,0x9d,0x6e,0x51,0x77,0x84,0x79,0xd1,0x75,0x79,0xd0,0x79,0x9d,0x76,0xfe,0xc5,0x57,0x42,0x0a,0x74,0x1b,0x6f,0x1d,0xb5,0x6e,0x80,0xb0,0x76,0x5e,0x09,0x9b,0x6f,0x4d,0x9d,0x1d,0x45,0xf8,0x92,0x72,0xc6,0x76,0x75,0xd0,0x7a,0x92,\r\n0xfe,0x2f,0xfd,0x45,0x66,0x04,0x91,0x7a,0x2e,0x00,0x00,0x02,0x00,0x80,0xfd,0xfe,0x04,0x08,0x03,0x6e,0x00,0x30,0x00,0x3c,0x00,0x72,0x40,0x09,0x05,0x29,0x16,0x8b,0x15,0x26,0x8b,0x08,0x2b,0xbb,0x01,0x83,0x00,0x37,0x00,0x31,0x01,0x83,0x40,0x10,0x00,0x29,0x15,0x08,0x37,0x00,0x00,0x37,0x08,0x15,0x04,0x3e,0x0e,0x8b,0x1e,0x34,\r\n0xb8,0x01,0x7e,0x40,0x19,0x2e,0x3a,0x9b,0x03,0x29,0x03,0x20,0x15,0x30,0x15,0x40,0x15,0x03,0x15,0x2e,0x03,0x03,0x2e,0x15,0x03,0x1a,0x0b,0x9b,0x23,0x11,0xb9,0x01,0x7f,0x00,0x1a,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x39,\r\n0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x25,0x34,0x36,0x33,0x33,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x20,0x11,0x11,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x33,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x0f,0x83,0x5e,0x0b,0x0a,0x25,0x3a,0x97,0x93,0xfe,0xdd,0x98,0x8b,0x5b,0x93,0x48,0x98,0x6e,0xcf,0x91,0x83,0xc4,0x73,0x6a,0xc7,0x89,0xc6,0xfb,0x35,0x2a,0x38,0x82,0x61,0x5c,0x86,0x7f,0x3b,0x28,0x29,0x3b,0x3c,0x28,0x28,0x3b,0xe3,0x5e,0x83,0x01,0x10,0x2d,0x23,0x5c,0x60,0xfe,\r\n0xaf,0xfe,0x6e,0xb1,0xbe,0x4c,0x83,0x5a,0x82,0xc7,0x6f,0x6e,0xe0,0x89,0x01,0xcc,0x8c,0xd8,0x69,0xbc,0x9e,0x37,0x49,0x1d,0x43,0x52,0x5c,0x87,0x84,0x5e,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x3c,0x00,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x0f,0x00,0x1a,0x00,0x23,0x40,0x0d,0x00,0x8b,0x1a,0x1a,0x1c,0x16,0x8b,0x07,\r\n0x12,0x9b,0x0c,0x07,0x18,0xb8,0x01,0x7f,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x07,0x10,0x21,0x22,0x06,0x15,0x11,0x10,0x21,0x20,0x11,0x04,0x08,0xf6,0xd8,0x8a,0xc6,0x6a,0x74,0xc7,0x83,0xdb,0xef,\r\n0x97,0xfe,0xc9,0x88,0x9b,0x01,0x23,0x01,0x37,0x01,0xc8,0xd6,0xfe,0xff,0x6a,0xd7,0x8c,0x02,0x54,0x85,0xe3,0x6f,0xf2,0xdc,0x0d,0x01,0x4c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x01,0x6f,0x00,0x00,0x01,0x00,0x66,0xff,0xe7,0x03,0xa8,0x05,0xe8,0x00,0x09,0x00,0x2d,0x40,0x15,0x03,0x8b,0x07,0x05,0x07,0x05,0x0b,0x00,0x05,0x04,0x00,0x09,\r\n0x04,0x09,0x04,0x09,0x01,0x07,0x18,0x01,0x06,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x13,0x25,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x05,0x66,0x01,0xd1,0x1c,0x01,0x2b,0x2a,0xfe,0x30,0x1c,0xfe,0xd4,0x05,0x16,0xd2,0xfa,0xcb,0x86,0x80,0xd2,0x05,0x35,0x83,\r\n0x00,0x01,0x00,0x80,0x00,0x00,0x03,0xd2,0x05,0xe9,0x00,0x22,0x00,0x32,0xb7,0x08,0x8b,0x1b,0x1b,0x24,0x22,0x03,0x11,0xb8,0x01,0x84,0x40,0x0e,0x00,0x12,0x03,0x00,0x00,0x01,0x12,0x18,0x1e,0x9b,0x05,0x05,0x01,0x06,0x00,0x3f,0x33,0x2f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0x33,0xed,0x32,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,\r\n0x13,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x80,0x97,0x73,0x87,0xca,0xf7,0x51,0x92,0xaa,0x80,0x66,0x37,0x94,0x43,0x77,0x9d,0x91,0x7d,0x42,0xaa,0x80,0x4e,0x83,0x29,0x04,0x12,0x01,0xd1,0x45,0x4b,0xed,\r\n0xbd,0x57,0x9f,0x9d,0x85,0x65,0x66,0x5d,0x2e,0xd1,0xe0,0x42,0x7b,0x7d,0x7b,0x71,0x81,0x7a,0x3e,0x7b,0xa0,0x4e,0x3c,0xbe,0x00,0x01,0x00,0x66,0x00,0x00,0x04,0x34,0x05,0xe3,0x00,0x12,0x00,0x2c,0xb6,0x0a,0x8b,0x0b,0x0b,0x14,0x03,0x12,0xbb,0x01,0x85,0x00,0x00,0x00,0x0f,0x01,0x7f,0xb7,0x03,0x05,0x05,0x01,0x06,0x0b,0x00,0x18,\r\n0x00,0x3f,0x32,0x3f,0x39,0x2f,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x33,0x01,0x33,0x03,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x03,0x66,0x01,0xeb,0xa7,0xd1,0x28,0x2c,0x7d,0xcb,0x71,0x97,0xac,0x7e,0x44,0x3f,0xe9,0x05,0xe3,0xfd,0x83,0x08,0x6a,0xbd,0x70,0xfe,0x29,0x01,\r\n0xa7,0x7f,0xb9,0x1e,0xfd,0x3f,0x00,0x01,0x00,0x66,0xff,0xe7,0x04,0x8b,0x05,0xe3,0x00,0x09,0x00,0x37,0x40,0x09,0x03,0x8b,0x07,0x05,0x07,0x05,0x07,0x0b,0x09,0xb8,0x01,0x85,0x40,0x0f,0x00,0x05,0x08,0x01,0x03,0x07,0x04,0x04,0x01,0x07,0x18,0x01,0x06,0x00,0x18,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x33,0x01,\r\n0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x33,0x01,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x01,0x66,0x02,0x1d,0xb3,0x01,0x2c,0x29,0xfe,0x30,0x1c,0xfe,0x68,0x05,0xe3,0xfa,0xcf,0x87,0x80,0xd2,0x04,0x7a,0xfb,0x9f,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x59,0x05,0xe3,0x00,0x11,0x00,0x1d,0x00,0x35,0x40,0x16,0x00,0x04,\r\n0x8b,0x0f,0x1c,0x02,0x1c,0x02,0x1f,0x15,0x8b,0x0b,0x03,0x12,0x9b,0x00,0x0e,0x0e,0x08,0x10,0x06,0x18,0xb8,0x01,0x7f,0xb1,0x08,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x33,0x15,0x23,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x21,0x11,0x33,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x03,0xdf,0x7a,0x7a,0x67,0xbb,0x7a,0xd0,0xf3,0xf1,0xc9,0x01,0x0e,0x97,0xfe,0x62,0x8d,0x9d,0xa6,0x8e,0x40,0x78,0x45,0x03,0x6e,0x8f,0xfe,0xa0,0x7c,0xb3,0x5f,0xee,0xd0,0xcb,0xf4,0x02,0x75,0xfc,0xfc,0xa4,0x94,0x8a,0x9d,0x3a,0x64,0x3f,0x01,0x82,0x00,\r\n0x00,0x02,0x00,0x80,0x00,0x00,0x04,0x59,0x05,0xe9,0x00,0x11,0x00,0x1d,0x00,0x36,0x40,0x1b,0x10,0x02,0x8b,0x03,0x1d,0x03,0x00,0x03,0x00,0x03,0x1f,0x19,0x8b,0x08,0x10,0x1c,0x99,0x01,0x05,0x05,0x03,0x16,0x9b,0x0b,0x07,0x03,0x18,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,\r\n0x33,0x10,0xed,0x32,0x31,0x30,0x01,0x23,0x11,0x23,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x33,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x04,0x59,0x7a,0x97,0xfe,0xf2,0xca,0xf0,0xf3,0xd0,0x79,0xbc,0x67,0x7a,0xfe,0xef,0x46,0x77,0x40,0x8e,0xa6,0x9d,0x8d,0x01,0x07,0x02,0x6c,0xfd,\r\n0x94,0x02,0x6c,0xf4,0xcb,0xcf,0xef,0x5f,0xb3,0x7c,0xfe,0xa1,0x01,0x81,0x3f,0x65,0x39,0x9c,0x8a,0x96,0xa2,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x03,0x41,0x05,0xe3,0x00,0x07,0x00,0x2a,0x40,0x0d,0x02,0x89,0x05,0x03,0x01,0x05,0x05,0x01,0x03,0x03,0x09,0x00,0x02,0xb8,0x01,0x7f,0xb5,0x05,0x18,0x07,0x9b,0x00,0x06,0x00,0x3f,0xed,\r\n0x3f,0xed,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x31,0x30,0x13,0x21,0x01,0x21,0x15,0x21,0x01,0x21,0x67,0x02,0xa8,0xfe,0x4f,0x01,0xe3,0xfd,0x50,0x01,0xaa,0xfe,0x2c,0x05,0xe3,0xfa,0xac,0x8f,0x05,0x54,0x00,0x02,0x00,0x80,0xff,0xf1,0x04,0x01,0x05,0xfe,0x00,0x28,0x00,0x34,0x00,0x59,0x40,0x29,0x1a,0x1b,0x00,0x27,\r\n0x03,0x09,0x8b,0x29,0x24,0x29,0x14,0x11,0x1b,0x06,0x29,0x1b,0x27,0x29,0x29,0x27,0x1b,0x03,0x36,0x1e,0x2f,0x8b,0x17,0x11,0x27,0x1b,0x1b,0x00,0x1a,0x14,0x06,0x0d,0x2c,0x9b,0x21,0x06,0x32,0xb8,0x01,0x7f,0xb1,0x0d,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0xc4,0x32,0x32,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x13,0x34,0x26,0x23,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x5b,0x4c,0x5a,0x6e,0x60,0x5f,0x6f,0x78,0xd2,0x78,0x78,0xd0,0x77,0x6a,0x63,0x5e,0x6f,0x5d,0x4d,0x63,0x36,0x3f,0xad,0x7a,0x7e,0xad,0x40,0x39,0x66,0x13,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x05,0xfb,0x3c,0xb3,0x6d,0x6f,0xca,0x3e,0x3d,0xc7,0x75,0x76,0xce,0x7a,0x79,0xd0,0x75,\r\n0x72,0xc7,0x40,0x3d,0xc8,0x72,0x6e,0xb4,0x3d,0x6a,0x2a,0x7e,0x4d,0x81,0xae,0xb4,0x7b,0x4b,0x80,0x2b,0x66,0xfb,0xb4,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x02,0x00,0x80,0xff,0xdc,0x04,0x01,0x05,0xe9,0x00,0x27,0x00,0x33,0x00,0x5a,0x40,0x2e,0x0d,0x0c,0x27,0x00,0x1e,0x24,0x8b,0x03,0x28,0x03,0x13,0x10,0x0c,0x21,0x03,0x0c,\r\n0x00,0x03,0x03,0x00,0x0c,0x03,0x35,0x2e,0x09,0x8b,0x16,0x10,0x31,0x99,0x13,0x21,0x1a,0x06,0x06,0x0d,0x2b,0x9b,0x1a,0x07,0x00,0x0c,0x0c,0x27,0x0d,0x19,0x00,0x3f,0x33,0x33,0x11,0x33,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x01,0x2f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,\r\n0xed,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0xf1,0x39,0x40,\r\n0xae,0x7d,0x7a,0xad,0x3f,0x36,0x63,0x4d,0x5d,0x6f,0x5e,0x61,0x6c,0x78,0xd0,0x77,0x78,0xd2,0x78,0x6f,0x5f,0x61,0x6d,0x5b,0x4d,0x11,0xae,0x7d,0x7a,0xad,0xa9,0x7e,0x7e,0xad,0x46,0x2a,0x80,0x4b,0x7c,0xb3,0xae,0x81,0x4d,0x7e,0x29,0x6b,0x3d,0xb4,0x6e,0x71,0xc9,0x3d,0x3e,0xca,0x71,0x76,0xd0,0x78,0x7a,0xce,0x76,0x75,0xc6,0x3e,\r\n0x3f,0xc9,0x6f,0x6d,0xb3,0x3e,0x04,0x4e,0x7c,0xb3,0xae,0x81,0x81,0xae,0xb1,0x00,0x00,0x02,0x00,0xa0,0xff,0xec,0x04,0x14,0x05,0xa3,0x00,0x0b,0x00,0x17,0x00,0x26,0xb9,0x00,0x00,0x01,0x85,0x40,0x0b,0x0c,0x0c,0x19,0x12,0x8a,0x06,0x0f,0x9b,0x09,0x06,0x15,0xb8,0x01,0x7f,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,\r\n0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0x14,0xd6,0xe5,0xe0,0xd9,0xda,0xdf,0xe0,0xdb,0xa0,0x8c,0x8f,0x8a,0x8d,0x88,0x8f,0x92,0x89,0x02,0xc8,0xfe,0x7a,0xfe,0xaa,0x01,0x58,0x01,0x84,0x01,0x78,0x01,0x63,0xfe,\r\n0xa0,0xfe,0x85,0x01,0x3c,0x01,0x13,0xfe,0xe1,0xfe,0xd0,0xfe,0xc9,0xfe,0xe7,0x01,0x11,0x00,0x00,0x01,0x00,0x8c,0xff,0xec,0x04,0x4d,0x05,0xa3,0x00,0x2c,0x00,0x56,0xb9,0x00,0x16,0x01,0x85,0x40,0x0e,0x2b,0x09,0x03,0x23,0x09,0x03,0x1d,0x1d,0x03,0x09,0x23,0x04,0x2e,0x28,0xbb,0x01,0x85,0x00,0x0f,0x00,0x2b,0x01,0x7f,0x40,0x15,\r\n0x0c,0x1c,0x1d,0x00,0x0c,0x06,0x0c,0x1d,0x1d,0x0c,0x06,0x03,0x13,0x1f,0x99,0x1a,0x19,0x25,0x9b,0x13,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0xed,0x31,0x30,0x01,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x00,0x11,0x14,0x02,0x04,0x23,0x22,0x27,0x27,0x16,0x33,0x32,0x36,0x12,0x35,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x38,0x29,0x30,0x4c,0x34,0x3e,0x4c,0x94,0x6f,0x9e,0xbc,0x77,0xd6,0x84,0xeb,0x01,0x05,0xaf,0xfe,0xcf,0xc4,0x48,0x50,0x1b,0x5f,0x68,0x93,0xdc,\r\n0x81,0xfe,0xa4,0x88,0x9d,0x68,0x54,0x3a,0x02,0xf2,0x0b,0x42,0x27,0x32,0x4e,0x5a,0x3f,0x68,0x95,0xd9,0xb3,0x7b,0xd3,0x79,0xfe,0xa1,0xfe,0xb6,0xe2,0xfe,0x95,0xc1,0x0a,0xa5,0x19,0x92,0x01,0x1e,0xb6,0x02,0x2f,0xbd,0x90,0x66,0x88,0x00,0x00,0x02,0x00,0x64,0xff,0xec,0x05,0x7f,0x06,0x3b,0x00,0x4c,0x00,0x55,0x00,0x85,0xb5,0x31,\r\n0x1a,0x1a,0x13,0x21,0x4d,0xbe,0x01,0x85,0x00,0x2b,0x00,0x25,0x01,0x84,0x00,0x52,0x00,0x38,0x01,0x85,0x40,0x0b,0x13,0x2b,0x52,0x13,0x13,0x52,0x2b,0x03,0x57,0x4c,0x04,0xb8,0x01,0x85,0xb4,0x48,0x40,0x9b,0x0b,0x50,0xb8,0x01,0x7e,0x40,0x13,0x28,0x55,0x9b,0x21,0x1a,0x9b,0x31,0x0b,0x28,0x21,0x31,0x31,0x21,0x28,0x0b,0x04,0x2f,\r\n0x10,0x07,0xb8,0x01,0x7f,0x40,0x0b,0x3b,0x45,0x19,0x16,0x1d,0x9b,0x4c,0x00,0x34,0x2f,0x06,0x00,0x3f,0x33,0xc4,0x32,0xed,0x32,0x3f,0x33,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x11,0x39,0x11,\r\n0x33,0x31,0x30,0x13,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x11,0x34,0x23,0x22,0x06,0x07,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x2e,0x02,\r\n0x23,0x22,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x94,0x66,0x65,0x57,0x24,0x47,0x3e,0x6c,0x68,0x30,0x5f,0x5a,0x53,0x24,0x20,0x2c,0x62,0x22,0x5a,0x2f,0x23,0x2c,0x5c,0x52,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x92,0x6a,0x2d,0x83,0x41,0x69,0x76,0x85,\r\n0x59,0x34,0x56,0x54,0x59,0x37,0x36,0x5e,0x5b,0x5f,0x37,0x78,0x77,0x26,0x35,0x02,0x1d,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x13,0x72,0x6e,0xfb,0xa2,0x72,0x11,0x17,0x28,0x19,0x1e,0x19,0x38,0x20,0x03,0xbd,0x8a,0x46,0x38,0x2a,0x33,0x74,0x55,0x56,0xbd,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x01,0xfd,0xa8,0x9b,0x82,0x3a,0x48,\r\n0x9b,0x8b,0xfc,0x21,0x45,0x6d,0x19,0x1e,0x19,0x19,0x1e,0x19,0x67,0x6d,0x04,0x44,0x5b,0x43,0x0f,0xfc,0xd9,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x02,0x00,0xa0,0xff,0xec,0x06,0x1e,0x05,0xa3,0x00,0x28,0x00,0x31,0x00,0x5e,0xb9,0x00,0x15,0x01,0x84,0xb2,0x2e,0x22,0x08,0xbb,0x01,0x85,0x00,0x09,0x00,0x28,0x01,0x85,0x40,0x0b,\r\n0x00,0x2e,0x09,0x00,0x00,0x09,0x2e,0x03,0x33,0x11,0x29,0xb8,0x01,0x85,0x40,0x0f,0x1b,0x31,0x9b,0x22,0x1f,0x11,0x11,0x18,0x04,0x0d,0x9b,0x24,0x1f,0x06,0x2c,0xb8,0x01,0x7e,0xb4,0x18,0x19,0x00,0x09,0x18,0x00,0x3f,0x33,0x3f,0xed,0x3f,0x33,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,\r\n0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x25,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x7e,0x82,0x62,0x69,\r\n0x82,0xa0,0x82,0x69,0x63,0x81,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0xd4,0xb0,0x64,0xa2,0x35,0x6c,0xcf,0xaf,0xd5,0xfb,0x22,0x22,0x1c,0x37,0x4d,0x28,0x04,0x1e,0x70,0x89,0x8a,0x6f,0xfb,0xe2,0x04,0x1e,0x6f,0x8a,0x8a,0x6f,0xfd,0xc0,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x03,0x89,0xb5,0xd2,0x44,0x42,0x86,0xd1,0xb6,0xfb,0xe4,\r\n0xba,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x01,0x00,0xa0,0xff,0xec,0x04,0xc4,0x06,0x27,0x00,0x3d,0x00,0x6f,0x40,0x12,0x08,0x89,0x32,0x38,0x8b,0x03,0x2f,0x00,0x32,0x00,0x03,0x03,0x00,0x32,0x03,0x28,0x0b,0x1f,0xb8,0x01,0x85,0xb6,0x1c,0x0b,0x1c,0x0b,0x1c,0x3f,0x28,0xb8,0x01,0x85,0x40,0x14,0x15,0x23,0x19,0x19,0x1d,0x35,\r\n0x0e,0x2f,0x2f,0x12,0x03,0x35,0x3b,0x3b,0x12,0x06,0x9b,0x35,0x06,0x2b,0xb8,0x01,0x7f,0xb4,0x12,0x19,0x0b,0x0c,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x11,0x33,0x10,0xc4,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,\r\n0xed,0x10,0xed,0x31,0x30,0x01,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x00,0x25,0x36,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,\r\n0x22,0x26,0x03,0x9f,0x51,0x37,0x08,0x57,0x44,0xb6,0xe7,0xf1,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x01,0x00,0x01,0x1e,0xa9,0x97,0xa0,0x5a,0xac,0xa3,0xa4,0xb7,0x5a,0x6a,0x64,0x2e,0x77,0x7d,0x2d,0x93,0xa6,0xb8,0x9f,0x96,0xb3,0x58,0x44,0x39,0x50,0x02,0x26,0x39,0x4f,0x3b,0x44,0xdc,0x90,0xdd,0x56,0xa0,0x21,0x11,0x12,\r\n0xc2,0x9f,0x01,0x0f,0x01,0x05,0x01,0x2e,0x4e,0x2d,0x61,0x41,0x7b,0x73,0x56,0x81,0x58,0x2b,0x2c,0x82,0xc7,0x8b,0xd6,0x83,0x89,0x0f,0x0f,0x01,0x3d,0xd9,0x93,0xb1,0xc8,0xcb,0xa7,0x4c,0x5e,0x4f,0x00,0x02,0x00,0xa0,0xff,0xec,0x04,0xf8,0x06,0x3b,0x00,0x4e,0x00,0x5a,0x00,0xa2,0xb9,0x00,0x4f,0x01,0x84,0xb4,0x3e,0x46,0x3c,0x3e,\r\n0x44,0xbb,0x01,0x84,0x00,0x55,0x00,0x04,0x01,0x85,0x40,0x1f,0x4a,0x2a,0x89,0x15,0x1b,0x8b,0x24,0x13,0x21,0x15,0x21,0x24,0x24,0x21,0x15,0x03,0x0c,0x2d,0x3e,0x55,0x4a,0x2d,0x00,0x00,0x2d,0x4a,0x55,0x3e,0x05,0x5c,0x0c,0xb8,0x01,0x85,0x40,0x1e,0x37,0x00,0x4e,0x41,0x30,0x13,0x27,0x9b,0x18,0x46,0x3c,0x08,0x13,0x34,0x24,0x1e,\r\n0x08,0x52,0x18,0x41,0x1e,0x18,0x1e,0x18,0x34,0x58,0x9b,0x41,0x06,0x0f,0xb8,0x01,0x7f,0xb4,0x34,0x19,0x2d,0x2e,0x19,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x39,0x11,0x39,0x12,0x39,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x10,0xc4,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,\r\n0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x15,0x14,0x06,0x06,0x23,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x26,0x26,0x23,\r\n0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x3e,0x02,0x35,0x35,0x34,0x36,0x37,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x04,0xf8,0x37,0x23,0x7d,0xf5,0x8f,0xae,0xaf,0x6a,0x64,0x2e,0x77,0x7d,\r\n0x2d,0xfe,0xc7,0xc5,0x92,0x96,0xb3,0x58,0x44,0x39,0x50,0x51,0x37,0x08,0x57,0x44,0x53,0x63,0xf9,0xdf,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x43,0x8b,0x72,0x61,0x7a,0x62,0x5f,0x84,0x1b,0x41,0x62,0x38,0x67,0x64,0xfd,0x3f,0x30,0x23,0x24,0x31,0x31,0x24,0x23,0x30,0x05,0xb1,0x10,0x45,0x58,0x53,0x56,0x80,0x47,0x1d,0xbe,\r\n0xaf,0x86,0x83,0x89,0x0f,0x0f,0x01,0x7c,0xf5,0x8b,0xb8,0xcb,0xa7,0x4c,0x5e,0x4f,0x3a,0x39,0x4f,0x3b,0x44,0x60,0x53,0x7a,0xc7,0x3d,0xa0,0x21,0x11,0x12,0xc2,0x9f,0xbf,0x7f,0xa2,0x7d,0x2a,0x43,0x70,0x5f,0x83,0x86,0x5b,0x34,0x33,0x01,0x2e,0x4b,0x25,0x88,0x6f,0x71,0x13,0xfe,0x57,0x23,0x30,0x30,0x23,0x24,0x31,0x31,0x00,0x01,\r\n0x00,0x7b,0xff,0xec,0x04,0x61,0x06,0x3b,0x00,0x3a,0x00,0x76,0xb9,0x00,0x24,0x01,0x85,0xb4,0x0b,0x32,0x89,0x00,0x1e,0xb8,0x01,0x85,0x40,0x11,0x17,0x12,0x13,0x0b,0x00,0x39,0x17,0x13,0x13,0x17,0x39,0x00,0x0b,0x05,0x3c,0x1a,0x05,0xb8,0x01,0x85,0xb3,0x2b,0x13,0x12,0x02,0xb8,0x01,0x7f,0x40,0x0d,0x2e,0x00,0x2e,0x35,0x12,0x2e,\r\n0x35,0x35,0x2e,0x12,0x03,0x20,0x08,0xb8,0x01,0x7f,0x40,0x0a,0x27,0x19,0x1a,0x1b,0x17,0x1e,0x0f,0x9b,0x20,0x06,0x00,0x3f,0xed,0x39,0x39,0xc4,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x10,0xed,\r\n0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x33,0x32,0x00,0x11,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x02,0x4c,0x16,\r\n0x3a,0x54,0x68,0x9c,0x89,0xb3,0xa9,0xac,0xa5,0x6d,0xba,0x2e,0x65,0x11,0x0c,0x04,0x2f,0x2d,0x2f,0x60,0x6c,0x02,0x70,0x74,0xfc,0x01,0x09,0xff,0xf1,0x84,0xd6,0x77,0xbc,0x9e,0x49,0x77,0x43,0x4c,0x3e,0x35,0x4b,0x30,0x02,0x9d,0x16,0x88,0x66,0x90,0xbd,0x01,0x08,0x01,0x13,0x9e,0xef,0xed,0x63,0x4e,0x72,0x26,0x1b,0x15,0x19,0x2a,\r\n0x3e,0x0c,0x8a,0x13,0x72,0x4b,0x38,0xfe,0xc8,0xfe,0xd0,0xba,0xfe,0xbd,0xfe,0xae,0x79,0xd3,0x7b,0xb3,0xd9,0x44,0x76,0x43,0x3f,0x5a,0x4f,0x31,0x27,0x42,0x00,0x02,0x00,0xa0,0xff,0xec,0x05,0x85,0x06,0x3b,0x00,0x37,0x00,0x40,0x00,0x76,0xb9,0x00,0x1c,0x01,0x84,0xb5,0x3d,0x28,0x11,0x11,0x38,0x2e,0xbb,0x01,0x85,0x00,0x0a,0x00,\r\n0x04,0x01,0x85,0x40,0x0d,0x33,0x3d,0x0a,0x37,0x33,0x33,0x37,0x0a,0x3d,0x04,0x42,0x18,0x38,0xb8,0x01,0x85,0x40,0x15,0x22,0x40,0x9b,0x18,0x11,0x9b,0x28,0x18,0x28,0x18,0x28,0x1f,0x0e,0x14,0x9b,0x37,0x00,0x2a,0x26,0x06,0x3b,0xb8,0x01,0x7e,0xb2,0x1f,0x19,0x30,0xb8,0x01,0x7f,0xb1,0x07,0x19,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,\r\n0xc6,0x32,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x10,0xed,0x31,0x30,0x01,0x16,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,\r\n0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x04,0xba,0x66,0x65,0x85,0x72,0x72,0x7f,0x28,0x30,0x23,0x63,0x52,0x2b,0x5a,0x54,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x91,\r\n0x6a,0x6c,0x84,0x6a,0x76,0x54,0x27,0x2d,0x29,0x31,0xfc,0xb5,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x15,0x6e,0x65,0xfb,0x6d,0x64,0x70,0x69,0x5d,0x03,0xdb,0x46,0x44,0x49,0x5f,0x33,0x74,0x55,0x56,0xfd,0x73,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x03,0xcd,0xa8,0x9b,0x82,0x82,0x9d,0x89,0xfc,0x67,0x6c,0x39,0x39,0x04,0x2c,0x57,\r\n0x3c,0x08,0xfb,0x09,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x01,0x00,0xa0,0xff,0xec,0x04,0x8e,0x06,0x27,0x00,0x45,0x00,0x6d,0xb9,0x00,0x00,0x01,0x85,0xb5,0x43,0x33,0x13,0x13,0x0c,0x2e,0xb8,0x01,0x85,0x40,0x0f,0x1a,0x1f,0x89,0x28,0x43,0x1a,0x22,0x28,0x28,0x22,0x1a,0x43,0x04,0x47,0x0c,0xbb,0x01,0x85,0x00,0x39,0x00,0x13,0x01,\r\n0x81,0x40,0x09,0x33,0x1f,0x25,0x33,0x25,0x33,0x2b,0x17,0x0f,0xb8,0x01,0x7f,0x40,0x0b,0x31,0x36,0x19,0x05,0x3f,0x3f,0x44,0x1d,0x9b,0x2b,0x06,0x00,0x3f,0xed,0xc4,0x39,0x11,0x33,0x3f,0x33,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x39,0x10,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,\r\n0x33,0x10,0xed,0x31,0x30,0x01,0x14,0x0e,0x02,0x07,0x0e,0x04,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x17,0x16,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x3e,0x02,0x37,\r\n0x3e,0x02,0x35,0x35,0x33,0x04,0x8e,0x2e,0x54,0x92,0x9a,0x7e,0x72,0x56,0x3a,0x20,0x3b,0x36,0x22,0x5a,0x2f,0x23,0x2c,0x2f,0x54,0x2b,0x41,0x39,0x52,0x3c,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x8a,0x9e,0x8e,0x6a,0x92,0x6a,0x2d,0x84,0x40,0x6c,0x82,0x38,0x73,0xc5,0xc1,0x72,0x71,0x3a,0xa0,0x05,0xb4,0x4a,0x72,0x55,\r\n0x44,0x26,0x20,0x36,0x4e,0x73,0xa1,0x6f,0xfe,0xf0,0x44,0x46,0x46,0x38,0x2a,0x32,0x3b,0x39,0x01,0x9f,0x98,0x75,0x90,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,0xe4,0xbc,0xb9,0xf9,0x82,0x3b,0x47,0xa1,0x85,0x01,0x2c,0x8b,0xcd,0x8f,0x6c,0x39,0x23,0x3d,0x52,0x30,0x7b,0x00,0x01,0x00,0xe9,0xff,0xec,0x04,0xac,0x06,0x3b,\r\n0x00,0x43,0x00,0x85,0xb9,0x00,0x2f,0x01,0x85,0xb5,0x1b,0x40,0x04,0x8a,0x05,0x0b,0xb8,0x01,0x85,0x40,0x15,0x3b,0x05,0x23,0x38,0x29,0x3b,0x00,0x1b,0x10,0x23,0x29,0x3b,0x3b,0x29,0x23,0x10,0x1b,0x00,0x06,0x45,0x15,0xb8,0x01,0x85,0x40,0x20,0x36,0x00,0x43,0x3e,0x1e,0x9b,0x2c,0x38,0x12,0x9b,0x0f,0x20,0x26,0x2c,0x40,0x05,0x3e,\r\n0x26,0x2c,0x0f,0x05,0x05,0x0f,0x2c,0x26,0x04,0x33,0x08,0x9b,0x3e,0x06,0x18,0xb8,0x01,0x7f,0xb1,0x33,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x39,0x10,0xed,0x10,0xc4,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x39,\r\n0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x21,0x07,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,\r\n0x10,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x34,0x36,0x37,0x04,0xac,0x37,0x23,0xa2,0x22,0x8e,0x61,0x6a,0x85,0x35,0x63,0x46,0x01,0x3c,0x10,0xed,0x8f,0xb5,0xb8,0x8c,0x91,0xa8,0x41,0x30,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x7e,0x8d,0x78,0xda,0x87,0xdf,0xfe,0xfb,0xdc,0x57,0x5e,0xe0,0xb6,0xa3,0x69,0x67,\r\n0x64,0x05,0xb1,0x10,0x45,0x58,0xa4,0x56,0x61,0x70,0x5b,0x35,0x58,0x32,0x8c,0xb2,0x91,0x8f,0xb7,0x7d,0x6d,0x49,0x5e,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,0xa7,0x99,0x6c,0xa2,0x58,0xf1,0xcd,0x01,0x2d,0x69,0x26,0x8b,0x5b,0x9b,0xbc,0x5b,0x6f,0x71,0x13,0x00,0x02,0x00,0x84,0x00,0x45,0x03,0x96,0x05,0xa3,0x00,0x0e,\r\n0x00,0x1d,0x00,0x1f,0x40,0x0f,0x0f,0x89,0x00,0x00,0x1f,0x07,0x89,0x17,0x0b,0x9a,0x13,0x03,0x9b,0x1b,0x06,0x00,0x3f,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x12,0x37,0x14,0x02,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,\r\n0x12,0x02,0xef,0x60,0x4c,0x4e,0x7c,0x4e,0x33,0x55,0x2f,0x4f,0x77,0x47,0xa7,0x75,0xc9,0x87,0x67,0x95,0x51,0x7a,0xd7,0x7c,0x98,0xad,0x03,0x81,0xb6,0xe2,0xb0,0xfe,0xa8,0xb8,0x72,0xb7,0x62,0xa8,0x01,0x5f,0xa0,0xf3,0xfe,0x7f,0xbc,0x8f,0x01,0x1e,0xba,0xd5,0x01,0x5e,0xc4,0xfe,0xd5,0x00,0x00,0x01,0x00,0x69,0xfe,0xf1,0x03,0x48,\r\n0x05,0xa3,0x00,0x2e,0x00,0x3d,0x40,0x0f,0x00,0x89,0x15,0x1c,0x89,0x28,0x15,0x21,0x28,0x28,0x21,0x15,0x03,0x30,0x0e,0xb8,0x01,0x83,0x40,0x0e,0x09,0x0c,0x24,0x0c,0x24,0x05,0x18,0x9b,0x2c,0x06,0x11,0x99,0x05,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,\r\n0xed,0x31,0x30,0x01,0x14,0x02,0x02,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x16,0x33,0x32,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x12,0x36,0x33,0x32,0x12,0x03,0x48,0x5d,0x88,0xa7,0x50,0x3b,0x7b,0x4d,0x4d,0x11,0x1f,0x06,0x0b,\r\n0x51,0x2d,0x46,0x93,0x53,0x3c,0x36,0x42,0x75,0x4d,0x27,0x10,0x09,0x5f,0x1d,0x11,0x38,0x22,0x74,0xcc,0x7a,0x7f,0x8b,0x03,0x60,0xec,0xfe,0x42,0xfe,0xdd,0xa2,0x4f,0x7b,0x3a,0x12,0x3a,0x20,0x3b,0x61,0x01,0x52,0x01,0xf7,0xcb,0xb6,0xca,0xc0,0xfe,0xa8,0x90,0x72,0x8f,0x29,0x17,0x15,0x1a,0x44,0x68,0x96,0x5a,0x01,0x0e,0x01,0x9e,\r\n0xe2,0xfe,0xd5,0x00,0x00,0x01,0x00,0x84,0x00,0x8a,0x04,0x64,0x05,0xa3,0x00,0x3f,0x00,0x4e,0xb5,0x0c,0x32,0x08,0x32,0x0f,0x00,0xb8,0x01,0x83,0x40,0x21,0x3b,0x2f,0x89,0x15,0x3b,0x15,0x0f,0x20,0x20,0x0f,0x15,0x3b,0x04,0x41,0x1c,0x89,0x27,0x32,0x08,0x0c,0x05,0x08,0x3d,0x3d,0x08,0x05,0x0c,0x04,0x23,0x17,0x9b,0x2c,0x06,0x00,\r\n0x3f,0xed,0xc4,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x31,0x30,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x17,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x03,0x03,0x36,0x33,0x32,0x16,0x33,0x32,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x04,0x64,0x0f,0x6e,0x65,0x44,0x1f,0x3a,0x1f,0x2b,0x35,0x0a,0x09,0x15,0x3e,0x0b,0x01,0x1a,0x29,0x31,0x68,0x41,0xb8,0x9e,0x55,0x30,0x09,0x5f,0x1c,0x13,0x31,0x21,0x6f,\r\n0xcc,0xf4,0x72,0x78,0x89,0xa9,0xc5,0x0d,0x14,0x18,0x2c,0x1b,0x17,0x62,0x21,0x0b,0x0d,0x0b,0x23,0x4c,0x02,0x21,0x11,0x2d,0xd7,0x60,0x12,0x22,0x07,0x40,0x10,0x16,0x16,0x02,0x32,0x52,0xaa,0x28,0xb2,0x9b,0xf7,0xfe,0xeb,0x89,0x5b,0x7d,0x18,0x11,0x17,0x47,0x5b,0x8b,0x3f,0xbf,0x01,0x6d,0x01,0x23,0xa5,0xa4,0x86,0x71,0xfe,0xbb,\r\n0xfe,0x84,0x04,0x09,0x8d,0x51,0x1c,0x17,0x23,0x00,0x00,0x01,0x00,0x84,0x01,0x73,0x04,0x1b,0x05,0xa3,0x00,0x54,0x00,0x4c,0x40,0x28,0x47,0x89,0x14,0x41,0x4b,0x0c,0x14,0x34,0x23,0x0c,0x14,0x00,0x00,0x14,0x0c,0x23,0x34,0x05,0x56,0x2f,0x89,0x3a,0x16,0x2b,0x9b,0x3e,0x41,0x3e,0x51,0x1f,0x51,0x1f,0x04,0x37,0x4b,0x03,0x0a,0x43,\r\n0x3e,0x06,0x00,0x3f,0x33,0xc4,0x17,0x32,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x39,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x07,0x22,0x35,0x35,0x34,0x37,0x37,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,\r\n0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x16,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x16,0x04,0x0e,0x62,0x7f,0x2a,0x11,0x2d,0x28,0x23,0x23,\r\n0x10,0x36,0x43,0x20,0x9b,0x2a,0x3b,0x19,0x15,0x16,0x2b,0x31,0x38,0x24,0x23,0x30,0x27,0x1b,0x11,0x2f,0x2b,0x25,0x48,0x29,0x23,0x38,0x58,0x35,0x0d,0x11,0x0d,0x6b,0x1e,0x12,0x36,0x5f,0xa8,0x72,0x29,0x68,0x16,0x5e,0x61,0x36,0x53,0x2f,0x54,0x50,0x8d,0x18,0x1c,0x20,0x4f,0x1c,0x0d,0x15,0x11,0x32,0x02,0x62,0x22,0x71,0x51,0x07,\r\n0x0f,0x03,0x24,0x0d,0x0e,0x71,0x39,0x01,0x23,0x4d,0xc1,0x35,0x26,0x31,0x32,0x61,0x90,0x5d,0x5c,0x66,0x2e,0x1d,0x11,0x14,0x6d,0x5e,0xb5,0x62,0x26,0x26,0x82,0xfe,0xf1,0x90,0x4b,0x5c,0x3c,0x29,0x16,0x14,0x41,0xc6,0x49,0xe7,0x01,0x75,0xb7,0x32,0x23,0x55,0x32,0x57,0x33,0x4a,0xf1,0x94,0xfe,0x0b,0x3e,0x32,0x18,0x24,0x00,0x01,\r\n0x00,0x84,0xff,0xc3,0x03,0x45,0x05,0xa7,0x00,0x26,0x00,0x2d,0x40,0x17,0x10,0x12,0x04,0x89,0x1f,0x25,0x12,0x1f,0x1f,0x12,0x25,0x03,0x28,0x18,0x8a,0x0b,0x1b,0x9a,0x08,0x10,0x06,0x00,0x07,0x00,0x3f,0x3f,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x32,0x16,0x16,0x15,0x10,0x02,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x02,0xa9,0x20,0x4c,0x30,0x69,0xba,0x83,0x8c,0x8f,0x8d,0x81,0x1a,0x15,0x0e,0x57,0x2c,0x75,0x5d,0x43,0x3b,0x4a,0x6e,0x40,0x28,0x2e,0x08,0x54,0x05,0xa7,0x9c,0xed,\r\n0x6b,0xfe,0xef,0xfe,0x1c,0xfb,0xee,0xe8,0xd0,0x01,0x65,0x8e,0x1c,0x36,0x0c,0x14,0x3a,0xa0,0xfe,0xed,0x98,0x94,0xbb,0xde,0x01,0xa1,0xca,0x94,0xb9,0x49,0x0c,0x13,0x11,0x4a,0x00,0x01,0x00,0x84,0x01,0x46,0x03,0x79,0x05,0xa7,0x00,0x33,0x00,0x49,0xb9,0x00,0x31,0x01,0x83,0xb4,0x07,0x2f,0x89,0x28,0x0a,0xb8,0x01,0x84,0x40,0x1b,\r\n0x21,0x00,0x07,0x28,0x21,0x21,0x28,0x07,0x00,0x04,0x35,0x19,0x8b,0x13,0x0a,0x16,0x2b,0x04,0x16,0x04,0x16,0x0f,0x2b,0x07,0x1d,0x99,0x0f,0x00,0x2f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x27,\r\n0x27,0x26,0x27,0x27,0x06,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x07,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x27,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x17,0x13,0x17,0x16,0x03,0x79,0x3b,0x29,0x19,0x2e,0x19,0x1a,0x18,0x0a,0x05,0x06,0x29,0x35,0x5a,0x49,0x57,0x65,0x2d,\r\n0x1e,0x37,0x27,0x1d,0x04,0x2a,0x2b,0x30,0x38,0x0d,0x06,0x0b,0x1d,0x14,0x16,0x04,0x3e,0x17,0x1b,0x17,0x14,0x0b,0x04,0x64,0x3c,0x24,0x01,0xdd,0x17,0x23,0x7b,0x8b,0x8a,0x77,0x80,0x2b,0x7f,0xfe,0x64,0xa3,0x51,0x71,0xe0,0xf8,0x21,0x1b,0x15,0x14,0xed,0x72,0x68,0xa7,0xd6,0x5a,0xa9,0x3a,0x3c,0x40,0x10,0x45,0x11,0x11,0x1f,0x18,\r\n0x47,0x45,0x18,0xfe,0x6e,0xd2,0x7f,0x00,0x00,0x01,0x00,0x84,0xff,0xc3,0x03,0xdd,0x05,0xa3,0x00,0x40,0x00,0x49,0xb7,0x06,0x89,0x22,0x00,0x3b,0x8b,0x36,0x27,0xb8,0x01,0x82,0x40,0x1c,0x2e,0x22,0x15,0x36,0x2e,0x2e,0x36,0x15,0x22,0x04,0x42,0x1c,0x89,0x0d,0x24,0x00,0x00,0x2b,0x2b,0x39,0x1f,0x9a,0x09,0x39,0x06,0x19,0x12,0x06,\r\n0x00,0x3f,0x33,0x3f,0xd4,0xed,0x12,0x39,0x2f,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x10,0x02,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x02,0x15,0x10,0x12,0x33,0x32,\r\n0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x15,0x14,0x07,0x06,0x15,0x14,0x02,0x7d,0x14,0x2a,0x16,0x78,0x94,0xc8,0xbe,0x88,0xd5,0x76,0x60,0xad,0xd8,0x60,0x37,0x26,0x10,0x2a,0x2f,0xb7,0xdc,0xa1,0x8a,0x70,0x72,0x7c,0x17,0x2e,0x20,0x01,\r\n0x01,0x17,0x22,0x1f,0x17,0x0e,0x0d,0x08,0x08,0x1d,0x30,0x4f,0x0b,0x0b,0x03,0x2a,0x06,0x0d,0xb3,0x93,0xfe,0xee,0xfe,0xde,0xb1,0x01,0x49,0xd2,0x9a,0x01,0x1e,0xdb,0x81,0x13,0x1a,0x31,0x1d,0x12,0x07,0x1a,0xfe,0xa4,0xff,0xfe,0xee,0xfe,0xc6,0xb9,0xc6,0xf6,0x31,0x49,0x19,0x1c,0x1d,0x15,0x22,0x33,0x5d,0x5c,0x35,0x26,0x44,0x44,\r\n0x24,0x29,0x28,0x3e,0x1e,0x46,0x47,0x2e,0x23,0x00,0x00,0x01,0x00,0x84,0xff,0xf6,0x03,0xe8,0x05,0xa3,0x00,0x3e,0x00,0x4a,0x40,0x29,0x00,0x89,0x2c,0x23,0x89,0x0a,0x27,0x89,0x06,0x2c,0x0a,0x06,0x16,0x16,0x06,0x0a,0x2c,0x04,0x40,0x37,0x10,0x89,0x1d,0x34,0x34,0x20,0x30,0x9b,0x3b,0x06,0x0d,0x9b,0x20,0x06,0x16,0x19,0x18,0x29,\r\n0x9a,0x03,0x18,0x00,0x3f,0xed,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x01,0x2f,0xed,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x10,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,\r\n0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x10,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x03,0xe8,0x91,0x9e,0x6b,0x60,0x0d,0x0c,0x34,0x3c,0x3c,0x30,0x34,0x35,0x08,0x1a,0x59,0x19,0x2b,0x53,0x42,0x9b,0x89,0x78,0x90,0x0c,0x0c,0x41,0x34,0x34,0x5b,\r\n0xa1,0x60,0x23,0x46,0x47,0x20,0x09,0x20,0x14,0xab,0x62,0x95,0xeb,0x83,0x02,0xa5,0xfe,0x97,0xfe,0xba,0xb8,0xb6,0x33,0x95,0x94,0x30,0x7c,0x71,0xb2,0xb6,0x85,0xdd,0x6d,0x0f,0x1b,0x0f,0x15,0x4f,0xab,0x01,0x50,0x71,0xea,0x01,0x09,0xbd,0x9b,0x31,0x94,0x89,0x39,0xfe,0xf8,0x01,0x20,0x01,0x07,0xa6,0x01,0x23,0xa8,0x16,0x17,0x21,\r\n0x2f,0x1e,0x18,0x31,0xc4,0xfe,0x9f,0x00,0x00,0x01,0x00,0x70,0x00,0x45,0x03,0x6c,0x05,0xa7,0x00,0x31,0x00,0x41,0xb9,0x00,0x1c,0x01,0x85,0x40,0x10,0x17,0x05,0x89,0x27,0x17,0x27,0x00,0x00,0x27,0x17,0x03,0x33,0x22,0x8b,0x14,0x22,0xb8,0x01,0x81,0xb5,0x11,0x2f,0x11,0x2f,0x19,0x27,0xb8,0x01,0x80,0xb2,0x0a,0x19,0x07,0x00,0x3f,\r\n0xd4,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xec,0x10,0xed,0x31,0x30,0x01,0x14,0x07,0x06,0x06,0x07,0x0e,0x02,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x37,0x37,0x32,0x17,0x17,0x32,0x37,\r\n0x3e,0x04,0x17,0x32,0x16,0x03,0x6c,0x2e,0x24,0x56,0x16,0x1b,0x17,0x20,0x0f,0x26,0x47,0x47,0x23,0x24,0x3f,0x3f,0x20,0x1d,0x27,0x67,0x01,0x43,0x09,0x44,0x23,0x31,0x12,0x14,0x26,0x57,0xfe,0xef,0x39,0x34,0x0e,0x65,0x20,0x11,0x21,0x0e,0x1f,0x0e,0x54,0x20,0x17,0x1f,0x4e,0x02,0xc6,0x14,0x4c,0x4b,0xd1,0x55,0x69,0x2a,0x1d,0x0f,\r\n0x0e,0x0e,0x0f,0x25,0x26,0x30,0x01,0x24,0x03,0xa9,0x1a,0x1a,0x13,0x0e,0x34,0x2f,0x5b,0xe2,0xfd,0x1f,0x07,0x04,0x10,0x03,0x68,0x2d,0x60,0x25,0xd5,0x34,0x03,0x27,0x00,0x01,0x00,0x84,0xff,0xc3,0x03,0x33,0x05,0xa7,0x00,0x37,0x00,0x3f,0x40,0x21,0x00,0x1f,0x2d,0x89,0x0e,0x33,0x89,0x08,0x1f,0x0e,0x08,0x08,0x0e,0x1f,0x03,0x39,\r\n0x14,0x89,0x27,0x36,0x9a,0x02,0x1c,0x02,0x1c,0x2a,0x17,0x9a,0x23,0x11,0x9b,0x2a,0x07,0x00,0x3f,0xed,0xd4,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x14,0x06,0x23,0x27,0x26,0x23,0x22,0x35,0x34,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x02,\r\n0x11,0x10,0x12,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x03,0x07,0x25,0x0d,0x22,0x5d,0x3d,0x3b,0x21,0x33,0x40,0x16,0x3c,0x30,0x72,0x79,0x73,0x66,0x4c,0x31,0x35,0x09,0x10,0x16,0x42,0x5d,0x89,0x4e,\r\n0x72,0xa8,0x5b,0xe6,0xd5,0x6e,0x86,0x2e,0x55,0x0e,0x13,0x24,0x33,0x21,0x01,0x94,0x13,0x4e,0x04,0x12,0x3b,0x18,0x54,0x81,0xdb,0x97,0x48,0x72,0x80,0xfe,0x9f,0xfe,0xc4,0xfe,0xf4,0xfe,0xda,0x3c,0x40,0x0b,0x3a,0x19,0x21,0x61,0x3d,0xa4,0x01,0x3b,0xde,0x01,0x85,0x01,0xa2,0xd1,0xab,0x4c,0xc0,0xe1,0x23,0x29,0x0e,0x10,0x0f,0x0b,\r\n0x08,0x00,0x00,0x02,0x00,0x60,0xff,0xe7,0x04,0xa2,0x04,0x19,0x00,0x0b,0x00,0x17,0x00,0x23,0x40,0x0d,0x09,0x89,0x15,0x15,0x19,0x0f,0x89,0x03,0x0c,0x9b,0x06,0x06,0x12,0xb8,0x01,0x7f,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x14,\r\n0x00,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x81,0xf5,0xfe,0xd4,0x01,0x2c,0x01,0x01,0xf8,0x01,0x1d,0xfe,0xdf,0xfa,0xb3,0xcc,0xd0,0xaf,0xb5,0xbe,0xbe,0x19,0x01,0x21,0xec,0x01,0x02,0x01,0x23,0xfe,0xe7,0xfc,0xfb,0xfe,0xde,0x03,0xa6,0xd9,0xba,0xb5,0xd2,0xcb,0xc0,0xc1,0xce,0x00,0x00,0x01,0x00,0x50,\r\n0xff,0xe7,0x03,0x44,0x04,0x19,0x00,0x15,0x00,0x28,0x40,0x0b,0x0a,0x00,0x05,0x89,0x10,0x0b,0x15,0x0b,0x15,0x02,0x0d,0xb8,0x01,0x7f,0xb5,0x08,0x19,0x13,0x9b,0x02,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0xed,0xc4,0x32,0x31,0x30,0x13,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x23,0x22,0x27,0x35,0x16,0x33,\r\n0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x56,0x72,0x9e,0xdf,0xff,0xfe,0xf8,0xf2,0x8e,0x6c,0x69,0x8f,0xa9,0xad,0xa1,0x9d,0x96,0x74,0x03,0xd3,0x46,0xfe,0xe5,0xf6,0xfe,0xfc,0xfe,0xe3,0x38,0xa2,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x00,0x02,0x00,0x2d,0xfd,0x6d,0x03,0xe5,0x04,0x19,0x00,0x1c,0x00,0x27,0x00,0x50,0xb9,0x00,0x0d,0x01,\r\n0x83,0x40,0x0b,0x25,0x19,0x8a,0x0b,0x25,0x0b,0x25,0x0b,0x29,0x03,0x20,0xb8,0x01,0x83,0xb3,0x13,0x03,0x04,0x22,0xb8,0x01,0x7d,0x40,0x11,0x10,0x0d,0x10,0x16,0x04,0x10,0x04,0x10,0x00,0x1d,0x9b,0x16,0x06,0x06,0x9a,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,\r\n0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x00,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0xb0,0x7b,0xb8,0x50,0xa8,0xdf,0x77,0xb4,0x63,0x1d,0x0c,\r\n0x73,0x60,0x64,0x71,0x80,0x86,0xb6,0xb8,0xfe,0xd1,0x68,0x2f,0x33,0x60,0x2b,0x33,0x31,0xfd,0x6d,0x23,0x28,0xaa,0x6c,0x79,0xe6,0x9d,0x02,0x25,0xb3,0x65,0x59,0x65,0x70,0x61,0x6d,0x6a,0xe8,0xdd,0xfd,0x9e,0xfe,0xce,0xfe,0xad,0x06,0x3d,0x35,0x31,0x5f,0x34,0x2d,0x30,0x34,0x00,0x00,0x01,0x00,0x50,0xfd,0x6d,0x03,0xd7,0x04,0x19,\r\n0x00,0x25,0x00,0x40,0x40,0x18,0x1c,0x27,0x13,0x0a,0x25,0x10,0x89,0x05,0x19,0x99,0x1e,0x19,0x0b,0x0a,0x15,0x00,0x13,0x0a,0x00,0x0a,0x00,0x0d,0x25,0x02,0xb8,0x01,0x7f,0xb5,0x13,0x18,0x08,0x9b,0x0d,0x06,0x00,0x3f,0xed,0x3f,0xed,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x3f,0xed,0x01,0x2f,0xed,0xc4,0x32,0x39,\r\n0x10,0xc6,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x10,0x00,0x21,0x23,0x27,0x17,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x04,0x27,0x50,0x78,0xa2,0xc0,0xc6,0xb9,0xb2,0xad,0x82,0x7d,0xb2,0xf7,0x01,0x1a,0xfe,0xdd,0xfe,0xf1,0x1a,0x19,0x53,0xb6,0xe0,0x44,0x43,\r\n0x36,0x36,0x59,0x49,0x94,0x8f,0x87,0x78,0x66,0x27,0xc1,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x9c,0x46,0xfe,0xe4,0xf5,0xfe,0xfc,0xfe,0xe3,0x02,0x5d,0xd2,0xb8,0x1b,0x90,0x20,0x52,0x80,0x9c,0x94,0x7b,0x1e,0x00,0x00,0x01,0x00,0x60,0xfd,0x6d,0x03,0xe5,0x04,0x19,0x00,0x21,0x00,0x46,0x40,0x1d,0x1f,0x0a,0x0e,0x89,0x0f,0x12,0x0f,0x0a,\r\n0x0f,0x0a,0x0f,0x23,0x03,0x89,0x17,0x1e,0x1f,0x12,0x09,0x1f,0x09,0x1f,0x14,0x00,0x9b,0x1b,0x06,0x0a,0x06,0xb8,0x01,0x7f,0xb3,0x14,0x18,0x0f,0x18,0x00,0x3f,0x3f,0xed,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x22,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x24,0x37,0x15,0x03,0x06,0x02,0x07,0x23,0x36,0x12,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x02,0x75,0xb0,0xbf,0x9e,0x9b,0x57,0x01,0x09,0x46,0xcd,0xa7,0xaf,0x26,0xbb,0x3e,0xea,0x01,0x24,0x6d,0x8b,0xd4,0xfe,0xff,0x84,0xf5,0x98,0x73,0xbf,0x3c,0x41,0xcd,0x03,0x8f,\r\n0xa9,0x9c,0x93,0x98,0x3e,0x24,0x9c,0xfe,0xf7,0xd5,0xfe,0xe1,0x7b,0xa9,0x01,0x5d,0x01,0x50,0x30,0xed,0xce,0x87,0xd2,0x72,0x26,0x20,0x9c,0x29,0x2f,0x00,0x00,0x01,0x00,0x60,0xfd,0x6d,0x05,0xb0,0x04,0x19,0x00,0x32,0x00,0x59,0xb9,0x00,0x0a,0x01,0x84,0x40,0x21,0x05,0x18,0x17,0x2b,0x2b,0x1f,0x00,0x8a,0x0f,0x22,0x05,0x0f,0x0f,\r\n0x05,0x22,0x03,0x34,0x1f,0x89,0x24,0x21,0x22,0x2b,0x18,0x07,0x22,0x18,0x18,0x22,0x07,0x03,0x28,0x0d,0xb8,0x01,0x7f,0xb7,0x02,0x19,0x14,0x1b,0x9b,0x2e,0x28,0x06,0x00,0x3f,0x33,0xed,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x12,0x39,0x11,0x33,\r\n0x33,0x10,0xed,0x31,0x30,0x01,0x10,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x05,0xb0,0xfa,0x6c,0x79,0x14,0x83,0x0e,\r\n0x2e,0x26,0x5e,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0xfe,0x81,0xfe,0xec,0x75,0x64,0x50,0x24,0x2f,0x2d,0x30,0x32,0x8b,0x03,0x79,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,\r\n0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0x00,0x00,0x01,0x00,0x77,0xff,0xe7,0x04,0x35,0x07,0x62,0x00,0x31,0x00,0x50,0x40,0x26,0x19,0x8b,0x0d,0x1f,0x89,0x06,0x0d,0x06,0x13,0x2c,0x2c,0x13,0x06,0x0d,0x04,0x33,0x31,0x8a,0x26,0x12,0x06,0x19,0x22,0x13,0x13,0x22,0x2b,0x2c,0x2c,0x10,0x2e,0x9b,0x29,0x16,0x9b,0x10,0x06,0x03,\r\n0xb8,0x01,0x7f,0xb1,0x22,0x19,0x00,0x3f,0xed,0x3f,0xed,0xd4,0xed,0x12,0x39,0x2f,0x33,0x11,0x39,0x2f,0x12,0x39,0x39,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x10,0x12,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x00,0x11,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x01,0x1b,0xb1,0xc5,0x7a,0x84,0x7c,0x77,0x4b,0x32,0x1b,0x96,0x8b,0x73,0x54,0x29,0x60,0x3e,0x41,0x46,0x57,0x75,0x66,0x65,0xd8,0xcc,0xfe,0xed,0xfe,0xf9,0x01,0x3b,0x01,0x2f,0xb6,0x98,0xa5,0xa7,0xe7,0xe1,\r\n0x02,0xe9,0xfe,0xb3,0xfe,0xd7,0x57,0x51,0x5b,0x4a,0x46,0x3b,0x45,0x4f,0x33,0x7f,0x92,0x2b,0x90,0x13,0x20,0x4c,0x39,0x33,0x55,0x43,0x3b,0x89,0x56,0xa0,0xa0,0x01,0x72,0x01,0x90,0x01,0x40,0x01,0x97,0x01,0xa2,0x4e,0xaa,0x6d,0xfe,0x9d,0xfe,0x86,0x00,0x01,0x00,0x60,0xfd,0x6d,0x06,0xec,0x04,0x19,0x00,0x32,0x00,0x5e,0x40,0x09,\r\n0x08,0x07,0x1b,0x1b,0x0f,0x23,0x8a,0x32,0x2b,0xb8,0x01,0x83,0x40,0x21,0x2a,0x12,0x32,0x2a,0x2a,0x32,0x12,0x03,0x34,0x0f,0x89,0x14,0x04,0x0b,0x9b,0x18,0x11,0x12,0x1b,0x08,0x18,0x2a,0x12,0x08,0x08,0x12,0x2a,0x03,0x30,0x1e,0x18,0x06,0x25,0xb8,0x01,0x7f,0xb1,0x30,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,\r\n0x11,0x12,0x39,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x12,0x39,0x11,0x33,0x33,0x31,0x30,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,\r\n0x14,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x11,0x05,0x0c,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0x5e,0x27,0x2d,0x0e,0x83,0x15,0x79,0x6d,0xfa,0x02,0x00,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,\r\n0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0xfc,0x85,0x89,0x32,0x30,0x2d,0x2f,0x26,0x3e,0x70,0x79,0x01,0x14,0x00,0x01,0x00,0x0a,0x00,0x00,0x04,0x3f,0x04,0x00,0x00,0x0e,0x00,0x2a,0x40,0x14,0x0b,0x89,0x08,0x07,0x00,0x00,0x04,0x0c,0x0c,0x10,0x03,0x89,0x04,0x00,0x04,0x07,\r\n0x06,0x0c,0x04,0x18,0x00,0x3f,0x33,0x3f,0x12,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x33,0xed,0x31,0x30,0x01,0x06,0x02,0x07,0x23,0x36,0x12,0x37,0x33,0x16,0x12,0x17,0x23,0x26,0x02,0x02,0x25,0x2b,0xc5,0x6e,0xbd,0x9a,0xf7,0x36,0xa8,0x3b,0xf2,0x99,0xbc,0x71,0xc3,0x03,0x31,0xbc,0xfe,0x3c,0xb1,0xe1,0x02,0x2e,\r\n0xf1,0xfe,0xfd,0xe1,0xe3,0xb6,0x01,0xc4,0x00,0x01,0x00,0x60,0xfd,0x6d,0x04,0x25,0x04,0x19,0x00,0x24,0x00,0x4d,0xb9,0x00,0x0e,0x01,0x85,0x40,0x12,0x09,0x05,0x89,0x14,0x09,0x14,0x20,0x20,0x14,0x09,0x03,0x26,0x1a,0x89,0x00,0x20,0x1f,0x11,0xb8,0x01,0x7e,0x40,0x11,0x07,0x1f,0x07,0x0b,0x0b,0x07,0x1f,0x03,0x02,0x1d,0x9a,0x22,\r\n0x19,0x17,0x9b,0x02,0x06,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x10,0x21,0x32,0x16,0x15,0x10,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,\r\n0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x60,0x02,0x11,0xd1,0xe3,0xfe,0xcd,0xfa,0x08,0xa0,0x08,0x2b,0x35,0x48,0x3d,0x8b,0x81,0xb3,0xb6,0xf8,0xe9,0x8f,0x86,0x7e,0x9f,0xfe,0xc4,0xfe,0xbb,0x01,0x29,0x02,0xf0,0xea,0xdb,0xfe,0x62,0xdd,0x30,0x12,0x18,0x27,0x2f,0x30,0x8e,0x8b,0x9b,0xa2,0xfe,0xd6,0xfe,0xbc,0xfe,0x74,0xfe,0x65,\r\n0x52,0xa0,0x3d,0x01,0xe3,0x00,0x00,0x01,0x00,0x60,0xff,0xe7,0x04,0x7b,0x05,0xfa,0x00,0x22,0x00,0x4b,0xb1,0x03,0x0e,0xb8,0x01,0x84,0x40,0x19,0x0f,0x0a,0x89,0x05,0x0f,0x1b,0x05,0x05,0x1b,0x0f,0x03,0x24,0x15,0x89,0x20,0x1b,0x1a,0x03,0x0f,0x1a,0x0f,0x1a,0x0f,0x00,0x18,0xb8,0x01,0x7f,0xb6,0x1d,0x19,0x12,0x9b,0x07,0x00,0x06,\r\n0x00,0x3f,0xc6,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x31,0x30,0x01,0x32,0x16,0x17,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x06,0x07,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x11,\r\n0x34,0x12,0x02,0x29,0x68,0xa6,0x29,0x75,0x3f,0xb0,0x35,0x2f,0x54,0x75,0x8d,0x6e,0x5d,0x8d,0x98,0xad,0xa9,0x82,0x76,0x6c,0x8e,0xf2,0xfe,0xf8,0xf2,0x04,0x19,0x5f,0x56,0xa4,0xfc,0x8b,0x6b,0x6a,0x8e,0x65,0xa9,0x9a,0x97,0x5b,0x6f,0xce,0xb5,0xc7,0xd0,0x4e,0xa2,0x38,0x01,0x1a,0x01,0x07,0xfc,0x01,0x15,0x00,0x00,0x03,0x00,0x82,\r\n0xff,0xe8,0x05,0x70,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x33,0x00,0x5c,0xbc,0x00,0x1b,0x01,0x85,0x00,0x27,0x00,0x00,0x01,0x85,0xb2,0x1a,0x05,0x14,0xb8,0x01,0x85,0x40,0x0f,0x13,0x2e,0x8a,0x21,0x27,0x1a,0x13,0x21,0x21,0x13,0x1a,0x27,0x04,0x35,0x0c,0xb8,0x01,0x85,0x40,0x12,0x0b,0x16,0x10,0x99,0x05,0x1a,0x13,0x0b,0x02,0x09,\r\n0x2b,0x9b,0x24,0x06,0x31,0x99,0x1e,0x19,0x00,0x3f,0xed,0x3f,0xed,0xde,0x32,0xcd,0x32,0x32,0x39,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x21,0x22,0x26,0x27,0x0e,0x02,0x23,0x20,0x03,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x12,0x33,\r\n0x32,0x36,0x36,0x35,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x34,0x26,0x26,0x23,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x00,0x05,0x70,0x01,0xfe,0x9f,0x59,0x9d,0x1f,0x0f,0x53,0x76,0x3c,0xfe,0x9e,0x01,0xa1,0x1f,0x5a,0x49,0x63,0x62,0xa1,0x02,0xc0,0x47,0x5a,0x21,0x99,0xfe,0x94,0xfe,0xfd,0xfe,0xfd,0xfe,\r\n0x94,0x01,0x6d,0x01,0x02,0x01,0x01,0x01,0x6e,0xa1,0x7e,0xd5,0x7b,0xbc,0xfe,0xef,0x01,0x0c,0xc1,0xc5,0x01,0x09,0x06,0xd0,0xfe,0x51,0x57,0x4e,0x2c,0x4e,0x2b,0x01,0xaf,0x62,0x7a,0x42,0x86,0x98,0xfe,0xe2,0x3e,0x75,0x6b,0xfb,0x87,0xfe,0xfd,0xfe,0x94,0x01,0x6e,0x01,0x01,0x01,0x01,0x01,0x6e,0xfe,0x94,0xfe,0xfd,0x80,0xdb,0x83,\r\n0xfe,0xe3,0xc1,0xbe,0xfe,0xe0,0x01,0x23,0x00,0x01,0x00,0xf0,0x00,0x00,0x01,0x91,0x06,0xd0,0x00,0x03,0x00,0x12,0xb9,0x00,0x00,0x01,0x85,0xb3,0x01,0x02,0x01,0x18,0x00,0x3f,0xcd,0x01,0x2f,0xed,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x91,0xa1,0xa1,0x06,0xd0,0x00,0x04,0x00,0x64,0xff,0xe8,0x06,0x29,0x06,0xe8,0x00,0x20,0x00,0x2c,\r\n0x00,0x38,0x00,0x45,0x00,0x81,0xb9,0x00,0x14,0x01,0x84,0xb4,0x39,0x21,0x89,0x27,0x18,0xbb,0x01,0x85,0x00,0x09,0x00,0x3f,0x01,0x84,0x40,0x37,0x0e,0x00,0x39,0x27,0x09,0x0e,0x0e,0x09,0x27,0x39,0x00,0x05,0x47,0x2d,0x89,0x33,0x3c,0x9b,0x11,0x43,0x00,0x20,0x06,0x9b,0x1a,0x24,0x30,0x2a,0x36,0x17,0x0a,0x18,0x20,0x1a,0x0a,0x36,\r\n0x43,0x20,0x1a,0x30,0x36,0x36,0x30,0x1a,0x20,0x04,0x09,0x43,0x06,0x09,0x18,0x1e,0x99,0x02,0x19,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0x10,0xed,0x11,0x33,0x10,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,\r\n0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x25,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x07,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,\r\n0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x06,0x29,0x73,0x9d,0x78,0x9b,0x86,0x4c,0x9d,0x5e,0xa2,0x72,0x50,0x49,0xcb,0x90,0x90,0xca,0x01,0x8f,0x7b,0x79,0x91,0x6f,0x9e,0x85,0x4d,0x6b,0x4b,0xfd,0x93,0x3d,0x2d,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0xfd,0xd0,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x01,0x77,\r\n0x76,0x54,0x50,0x7a,0x3a,0x3d,0x53,0x54,0x76,0x69,0x81,0x6d,0x5a,0xaf,0x04,0x3a,0x1d,0x5d,0x62,0x77,0x90,0xcb,0xcc,0x8f,0x78,0xbb,0x20,0xfc,0xa4,0x61,0x6b,0x5b,0x5b,0x01,0xe4,0x2d,0x3d,0x3e,0x2c,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0x3d,0x2d,0x2e,0x3d,0x3e,0x02,0xa8,0x56,0x74,0x71,0x59,0x53,0x3d,0x3a,0x72,0x00,0x02,0x00,0x64,\r\n0x00,0x00,0x04,0xfa,0x06,0xe8,0x00,0x29,0x00,0x35,0x00,0x6f,0xb1,0x16,0x22,0xbb,0x01,0x84,0x00,0x2a,0x00,0x04,0x01,0x85,0xb2,0x05,0x25,0x00,0xb8,0x01,0x84,0x40,0x0f,0x0b,0x12,0x27,0x0b,0x2a,0x05,0x0e,0x0b,0x0b,0x0e,0x05,0x2a,0x04,0x37,0x30,0xb8,0x01,0x84,0x40,0x1b,0x1c,0x33,0x99,0x19,0x2d,0x9b,0x1f,0x22,0x07,0x03,0x9b,\r\n0x06,0x27,0x0e,0x9b,0x0f,0x06,0x0f,0x06,0x0f,0x05,0x16,0x9b,0x22,0x06,0x05,0x18,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xed,0x33,0x10,0xdd,0xed,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x39,0x33,0x10,0xed,0x32,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x01,0x10,0x21,0x23,0x11,\r\n0x23,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x20,0x36,0x35,0x34,0x26,0x23,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x01,0x34,0x26,0x27,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xfa,0xfe,0x8f,0x5f,0xa1,0x01,0x00,0x79,0x67,0x43,0xa7,0xa1,0x01,0x02,\r\n0x89,0x71,0x6f,0x76,0x19,0xbb,0x80,0x8c,0xcf,0xcb,0x90,0x7c,0xbf,0x19,0x76,0x01,0x71,0xc5,0xc5,0xfd,0x8f,0x76,0x54,0x51,0x79,0x6f,0x5b,0x56,0x74,0x03,0x16,0xfe,0xf9,0xfd,0xf1,0x02,0xa0,0x40,0x4a,0x34,0x3b,0x12,0x91,0x42,0x4d,0x4c,0x2f,0x75,0xa0,0xc7,0x95,0x90,0xcb,0x9c,0x75,0xf8,0xb6,0x32,0x07,0x35,0x01,0xd2,0x55,0x74,\r\n0x01,0x71,0x59,0x51,0x79,0x76,0x00,0x01,0x00,0xb4,0x00,0x00,0x05,0x0a,0x06,0xd0,0x00,0x12,0x00,0x5c,0xb1,0x11,0x04,0xb8,0x01,0x85,0xb5,0x05,0x0e,0x05,0x0b,0x0a,0x00,0xb8,0x01,0x85,0x40,0x0a,0x01,0x05,0x0a,0x01,0x01,0x0a,0x05,0x03,0x14,0x0d,0xb8,0x01,0x85,0x40,0x16,0x07,0x03,0x07,0x9b,0x11,0x0d,0x0a,0x0b,0x0d,0x0f,0x0b,\r\n0x0b,0x0f,0x0d,0x03,0x0c,0x01,0x05,0x18,0x08,0x0c,0x07,0x00,0x3f,0xcd,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x32,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x01,0x07,0x01,0x11,0x21,0x11,\r\n0x33,0x11,0x21,0x05,0x0a,0xa1,0xfe,0xc7,0xa1,0xfe,0x25,0xa3,0x01,0xa5,0x72,0xfe,0xcb,0x01,0x3a,0xa1,0x01,0xda,0x02,0x48,0xfd,0xb8,0x02,0x48,0x04,0x88,0xfe,0x58,0x72,0x01,0x39,0xfc,0xea,0x01,0x22,0xfe,0xde,0x00,0x00,0x01,0x00,0xb4,0xff,0xe9,0x04,0xc6,0x06,0xd0,0x00,0x1b,0x00,0x4b,0xb9,0x00,0x00,0x01,0x84,0x40,0x0d,0x12,\r\n0x11,0x07,0x04,0x11,0x11,0x04,0x07,0x03,0x1d,0x14,0x10,0x0d,0xb8,0x01,0x85,0x40,0x13,0x0e,0x0a,0x9b,0x11,0x12,0x14,0x18,0x12,0x18,0x12,0x0e,0x0f,0x13,0x07,0x0e,0x18,0x04,0x03,0x19,0x00,0x3f,0x33,0x3f,0x3f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0xed,0x01,0x2f,0xed,0x32,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,\r\n0xed,0x31,0x30,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x00,0x07,0x23,0x11,0x33,0x01,0x07,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x16,0x04,0xc6,0xd5,0x96,0x37,0x7c,0x95,0x86,0x70,0xd8,0xfe,0xef,0x01,0xa1,0xa3,0x01,0xa6,0x72,0xfe,0xca,0x51,0x87,0x7f,0x93,0x71,0xb5,0x61,0x01,0xa6,0x9a,0xf6,0x2d,0x7b,\r\n0x21,0xb4,0x6d,0x62,0x74,0xfe,0x82,0xfe,0x06,0xd0,0xfe,0x58,0x72,0x01,0x39,0xfb,0xf9,0x89,0x47,0x47,0x51,0x9e,0x00,0x02,0x00,0x64,0xff,0xe8,0x03,0xfa,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x5e,0xb9,0x00,0x00,0x01,0x84,0x40,0x13,0x1b,0x21,0x1b,0x21,0x1b,0x05,0x28,0x07,0x0a,0x14,0x11,0x04,0x08,0x12,0x12,0x08,0x0e,0x08,0x16,\r\n0xb8,0x01,0x85,0x40,0x18,0x05,0x1e,0x9b,0x18,0x14,0x08,0x9b,0x09,0x11,0x09,0x16,0x18,0x09,0x18,0x09,0x03,0x0c,0x99,0x0f,0x06,0x24,0x99,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x01,0x2f,0xed,0xc6,0xc4,0x11,0x39,0x2f,0x12,0x17,0x39,0x11,0x12,0x39,0x39,0x2f,0x2f,\r\n0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x20,0x11,0x10,0x13,0x21,0x35,0x21,0x36,0x37,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x21,0x02,0x11,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xfa,0xcc,0x8f,0xfe,0x6e,0x7d,0xfe,0xda,0x01,0x61,0x47,0x7a,0x01,0x74,0xfe,0xf2,0x47,0x2f,0x01,0x2f,\r\n0xfe,0x94,0x8b,0x69,0x88,0x8f,0xcc,0x91,0x72,0x58,0x59,0x72,0x70,0x5b,0x5a,0x70,0x01,0x44,0x90,0xcc,0x02,0x57,0x01,0x2d,0x01,0x53,0x92,0xa2,0xdd,0x92,0x83,0x6a,0x92,0xfe,0xa1,0xfe,0xde,0x60,0xcc,0x8e,0x50,0x79,0x78,0x51,0x50,0x7b,0x7a,0x00,0x00,0x02,0x00,0x00,0xff,0xe8,0x05,0x9d,0x06,0xe8,0x00,0x1f,0x00,0x2b,0x00,0x5a,\r\n0xb5,0x0a,0x8a,0x16,0x08,0x16,0x0d,0xb8,0x01,0x84,0xb7,0x26,0x16,0x26,0x16,0x26,0x2d,0x00,0x20,0xb8,0x01,0x84,0x40,0x1b,0x13,0x0a,0x16,0x16,0x1f,0x29,0x29,0x10,0x1f,0x19,0x9b,0x06,0x08,0x06,0x08,0x06,0x1f,0x1d,0x9b,0x02,0x17,0x1f,0x07,0x23,0x99,0x10,0x19,0x00,0x3f,0xed,0x3f,0x33,0xdd,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,\r\n0xed,0x11,0x12,0x39,0x2f,0x12,0x39,0x11,0x33,0x01,0x2f,0xed,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x31,0x30,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x11,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x16,0x33,0x32,0x36,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x73,0x9d,0x76,0x9d,0x83,0x4e,0x9e,0x5d,0xa3,0x75,0x96,0xca,0x92,0x8f,0xcc,0x98,0x72,0x77,0x93,0x70,0x9d,0x85,0x4c,0x69,0x4e,0x03,0x26,0x77,0x53,0x54,0x77,0x78,0x53,0x53,0x77,0x06,0x67,0x81,0x6d,0x5b,0xb0,0xfb,0xc5,0x1c,0xc0,0x76,0x90,0xcb,0xca,0x91,0x77,0xc0,0x1b,0x03,0x5d,0x62,0x6c,0x5b,\r\n0x5b,0xfb,0x47,0x53,0x77,0x76,0x54,0x54,0x76,0x77,0x00,0x04,0x00,0x82,0xff,0xe8,0x04,0x4e,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x39,0x00,0x6f,0x40,0x0a,0x34,0x8a,0x1e,0x0c,0x89,0x12,0x00,0x89,0x06,0x18,0xb8,0x01,0x85,0x40,0x11,0x2e,0x20,0x12,0x2c,0x06,0x2e,0x1e,0x12,0x06,0x2e,0x2e,0x06,0x12,0x1e,0x04,0x22,0x2a,\r\n0xbb,0x01,0x85,0x00,0x29,0x00,0x23,0x01,0x85,0x40,0x11,0x22,0x31,0x9b,0x2c,0x20,0x26,0x26,0x1b,0x22,0x09,0x15,0x03,0x0f,0x29,0x22,0x06,0x37,0xb8,0x01,0x80,0xb1,0x1b,0x19,0x00,0x3f,0xed,0x3f,0x33,0xde,0x32,0xcd,0x32,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,\r\n0x39,0x11,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x37,0x26,0x03,0x33,0x16,0x16,0x33,0x32,0x36,0x37,0x33,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x13,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0xfd,0x7f,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0x02,0xbc,0xfe,0xe6,0xcc,0xcc,0xfe,0xe6,0xda,0xd9,0x01,0xa2,0x01,0xbd,0x86,0x87,0xbd,0x01,0xa1,0x02,0xd8,0xda,0xa1,0xbf,0x86,0x86,0xbe,0xbf,0x85,0x86,0xbf,0x06,0x18,0x2b,0x40,0x40,0x2b,\r\n0x2d,0x3e,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0xfb,0x8c,0xc7,0xfe,0xde,0x01,0x20,0xc9,0x01,0x02,0x95,0x93,0x01,0x00,0x7e,0xc5,0xc7,0x7c,0xfe,0xff,0x92,0x95,0xfe,0xfe,0x7f,0xc7,0xc6,0x80,0x83,0xc5,0xc7,0x00,0x03,0x00,0x64,0xff,0xe9,0x05,0xdd,0x06,0xe8,0x00,0x28,0x00,0x35,0x00,0x41,0x00,0x82,0xb9,0x00,0x30,0x01,\r\n0x84,0x40,0x11,0x23,0x0d,0x0d,0x3b,0x06,0x89,0x36,0x04,0x08,0x8b,0x12,0x1d,0x12,0x20,0x03,0x23,0x00,0xb8,0x01,0x84,0x40,0x0c,0x29,0x23,0x36,0x12,0x29,0x29,0x12,0x36,0x23,0x04,0x43,0x3b,0xb8,0x01,0x85,0xb5,0x17,0x2d,0x9b,0x26,0x33,0x3f,0xb8,0x01,0x81,0x40,0x14,0x14,0x38,0x9b,0x1b,0x20,0x03,0x1d,0x36,0x06,0x12,0x06,0x1b,\r\n0x14,0x1b,0x14,0x1b,0x0c,0x33,0x06,0x0d,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x10,0xed,0x10,0xed,0x10,0xd4,0xed,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0x10,0xed,0x31,0x30,0x01,0x14,\r\n0x06,0x07,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x27,0x06,0x21,0x22,0x24,0x27,0x34,0x37,0x36,0x33,0x20,0x17,0x36,0x35,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x32,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x14,0x16,0x33,0x32,0x36,0x01,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x20,0x37,\r\n0x05,0xdd,0x92,0x81,0x2f,0x2f,0x79,0xf2,0x98,0xb0,0xc2,0x07,0xb5,0xfe,0xc7,0xcb,0xfe,0xec,0x01,0x8b,0x8a,0xcb,0x01,0x38,0xb6,0x07,0x01,0x7c,0x96,0xca,0x91,0x90,0xcc,0x92,0x3b,0x3a,0x55,0x55,0x74,0x01,0x71,0x59,0x56,0x74,0xfe,0x9f,0x8c,0xfe,0xe6,0x87,0xb8,0x57,0x93,0x55,0x01,0x1b,0x8b,0x05,0x8d,0x76,0xc2,0x1d,0x18,0x86,\r\n0x74,0x72,0x88,0x9d,0xeb,0x9e,0x1d,0xa1,0x2b,0xd7,0xa0,0x28,0x29,0xc4,0xd8,0x95,0x97,0x6a,0x6c,0xc3,0x28,0x28,0x18,0x1d,0xbf,0x79,0x90,0xca,0x01,0xcc,0x8f,0x57,0x38,0x3b,0x76,0x54,0x51,0x79,0x76,0xfd,0xef,0xc2,0x74,0x50,0x32,0x5e,0x33,0xc1,0x00,0x02,0x00,0x67,0xff,0xe7,0x04,0x72,0x05,0xb2,0x00,0x0f,0x00,0x1d,0x00,0x2b,\r\n0xb9,0x00,0x0c,0x01,0x86,0xb3,0x1b,0x1b,0x1f,0x14,0xbb,0x01,0x86,0x00,0x04,0x00,0x10,0x01,0x80,0xb2,0x08,0x07,0x17,0xb8,0x01,0x80,0xb1,0x00,0x19,0x00,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x35,0x10,0x12,0x24,0x33,0x32,0x16,0x16,0x15,0x10,0x02,0x04,0x13,0x22,0x06,0x02,0x15,\r\n0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x01,0xe2,0x78,0xab,0x58,0xae,0x01,0x28,0xc1,0x69,0xaa,0x61,0xab,0xfe,0xde,0x4a,0x87,0xd4,0x86,0x75,0x70,0x81,0xd2,0x85,0x71,0x19,0x75,0xd1,0x86,0x01,0x19,0x01,0xe9,0xfd,0x6a,0xc3,0x7e,0xfe,0xcf,0xfe,0x0a,0xf9,0x05,0x2d,0xd0,0xfe,0x65,0xd5,0xa5,0xaa,0xcf,0x01,0x9b,0xd0,0xa4,\r\n0xb1,0x00,0x00,0x01,0x00,0x84,0xff,0xe7,0x04,0x18,0x05,0xb5,0x00,0x23,0x00,0x40,0xb9,0x00,0x18,0x01,0x86,0xb2,0x0d,0x13,0x1f,0xb8,0x01,0x86,0x40,0x0d,0x06,0x0d,0x06,0x0d,0x06,0x25,0x00,0x00,0x13,0x00,0x13,0x10,0x03,0xb8,0x01,0x80,0xb2,0x21,0x19,0x16,0xb8,0x01,0x80,0xb1,0x10,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,\r\n0x2f,0x2f,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc6,0x10,0xed,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x27,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x1e,0x02,0x15,0x10,0x21,0x22,0x27,0x84,0x3b,0xbe,0x50,0x9c,0x97,0x33,0x4d,0x46,0x3a,0x1f,0xc2,0xbd,0x5d,\r\n0x5b,0x2e,0x35,0x48,0xe4,0x34,0x54,0x49,0x30,0x1d,0xfe,0x26,0xcd,0x7b,0xb2,0x13,0x1a,0x83,0x9b,0x3a,0x7c,0x6b,0x61,0x70,0x78,0x3f,0xb2,0xb7,0x10,0x9e,0x08,0x08,0xb2,0x40,0x88,0x7b,0x6c,0x62,0x69,0x3c,0xfe,0x38,0x1d,0x00,0x00,0x01,0x00,0x67,0xff,0xe7,0x04,0x8e,0x05,0xb2,0x00,0x27,0x00,0x61,0xb9,0x00,0x19,0x01,0x86,0xb4,\r\n0x0b,0x12,0x89,0x13,0x00,0xb8,0x01,0x85,0x40,0x0e,0x27,0x09,0x1d,0x0b,0x1d,0x13,0x27,0x27,0x13,0x1d,0x0b,0x04,0x29,0x21,0xb8,0x01,0x86,0xb2,0x06,0x09,0x1c,0xb8,0x01,0x80,0x40,0x09,0x1d,0x27,0x13,0x13,0x27,0x1d,0x03,0x03,0x16,0xb8,0x01,0x80,0xb2,0x0f,0x07,0x24,0xb8,0x01,0x80,0xb1,0x03,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,\r\n0x17,0x39,0x2f,0x2f,0x2f,0xed,0x39,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,\r\n0x32,0x12,0x13,0x04,0x8e,0x5d,0xfe,0xc9,0xde,0xcc,0xe9,0x92,0x7a,0xaa,0x64,0xc0,0x84,0xa0,0xe2,0x1d,0xac,0x18,0x7e,0x65,0x73,0x86,0x97,0x8a,0x28,0x9b,0xc0,0x97,0x7c,0xa0,0xec,0x3f,0x02,0xcf,0xfe,0x7f,0xfe,0x99,0xe4,0xca,0x85,0xd5,0x2a,0x6c,0xc4,0x6b,0xa4,0x5a,0xae,0x91,0x4b,0x56,0x6d,0x57,0x70,0x74,0x9e,0xa7,0x8f,0x7e,\r\n0x95,0x01,0x4f,0x01,0x26,0x00,0x00,0x01,0x00,0x3f,0xff,0xe7,0x04,0x9f,0x05,0x9d,0x00,0x2c,0x00,0x5e,0xb6,0x0e,0x8a,0x1e,0x09,0x8a,0x23,0x15,0xb8,0x01,0x85,0x40,0x0d,0x14,0x1e,0x23,0x14,0x14,0x23,0x1e,0x03,0x2a,0x2e,0x03,0x01,0x29,0xb8,0x01,0x85,0x40,0x0f,0x2c,0x2a,0x2a,0x18,0x25,0x99,0x06,0x04,0x06,0x14,0x06,0x14,0x06,\r\n0x00,0x10,0xb8,0x01,0x80,0xb6,0x1b,0x19,0x03,0x2c,0x99,0x00,0x06,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x10,0xed,0x3f,0x01,0x2f,0xc6,0xfd,0xc4,0x33,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x21,0x07,0x21,0x03,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,\r\n0x15,0x14,0x33,0x32,0x36,0x37,0x37,0x33,0x07,0x0e,0x03,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x23,0x22,0x06,0x07,0x03,0x23,0x01,0x23,0xb1,0x03,0x9f,0x20,0xfd,0xc3,0x4d,0x6c,0x69,0x77,0x90,0x04,0x3d,0x21,0x52,0x2b,0x33,0x17,0x16,0xa2,0x17,0x0f,0x21,0x3e,0x68,0x57,0x70,0x6f,0x26,0x36,0x06,0x84,0x51,0x7f,0x19,\r\n0x91,0xa1,0x01,0x12,0xc0,0x05,0x9d,0x91,0xfe,0x96,0x36,0x84,0x6e,0x10,0x26,0xfe,0xf3,0x79,0x44,0x61,0x44,0x68,0x62,0x6d,0x44,0x75,0x56,0x30,0x69,0x72,0x3a,0xab,0xf1,0x1b,0x1b,0x79,0x51,0x48,0xfd,0x52,0x05,0x0c,0x00,0x02,0x00,0x6b,0xff,0xe7,0x04,0x21,0x05,0xb0,0x00,0x14,0x00,0x21,0x00,0x4f,0xb2,0x10,0x0f,0x03,0xb8,0x01,\r\n0x86,0x40,0x21,0x1e,0x14,0x00,0x01,0x12,0x15,0x0e,0x04,0x1e,0x0f,0x1e,0x00,0x00,0x1e,0x0f,0x03,0x23,0x19,0x89,0x09,0x00,0x0f,0x0f,0x15,0x01,0x0e,0x12,0x04,0x06,0x14,0x10,0x07,0x1b,0xb8,0x01,0x80,0xb1,0x06,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x17,0x39,0x33,0x11,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x17,\r\n0x39,0x11,0x33,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x01,0x00,0x15,0x14,0x04,0x21,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x37,0x27,0x37,0x16,0x17,0x36,0x37,0x01,0x0e,0x02,0x15,0x14,0x21,0x32,0x36,0x35,0x34,0x02,0x27,0x04,0x20,0xff,0x00,0x01,0x01,0xfe,0xf8,0xfe,0xf2,0xcb,0xd5,0x51,0x92,0xa5,0x5f,0xaa,0x98,0x3e,0x53,0x78,0x5c,\r\n0xfe,0xfc,0x5d,0xc5,0x69,0x01,0x0b,0xa0,0xb9,0x7d,0x56,0x05,0x4f,0xfe,0xff,0xfe,0x52,0xeb,0xec,0xe2,0xb4,0xb0,0x66,0xc6,0xcb,0xad,0x64,0xfd,0x60,0x53,0x80,0x7a,0x58,0xfe,0x16,0x4b,0xf3,0xd3,0x47,0xe8,0x9a,0x8a,0x54,0x01,0x3f,0x88,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x61,0x05,0xb5,0x00,0x26,0x00,0x32,0x00,0x63,0x41,0x0b,\r\n0x00,0x30,0x01,0x86,0x00,0x21,0x00,0x04,0x01,0x84,0x00,0x1f,0x00,0x00,0x01,0x86,0x00,0x2a,0x00,0x12,0x01,0x85,0x40,0x0c,0x11,0x21,0x1f,0x2a,0x11,0x11,0x2a,0x1f,0x21,0x04,0x34,0x0b,0xb8,0x01,0x86,0x40,0x0a,0x18,0x27,0x1f,0x04,0x11,0x04,0x11,0x04,0x15,0x2d,0xb8,0x01,0x80,0xb2,0x24,0x07,0x0e,0xb8,0x01,0x80,0xb1,0x15,0x19,\r\n0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x01,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x14,0x06,0x06,0x07,0x06,0x06,0x07,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x37,0x17,0x02,0x00,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x36,0x37,\r\n0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x03,0x8f,0x51,0xa4,0x63,0x0b,0x37,0x52,0x49,0x38,0x1e,0x7b,0x7b,0x8f,0xf7,0x3f,0xa2,0x58,0xfe,0xc1,0xd5,0xc6,0xd3,0x1f,0x39,0x4c,0x51,0x45,0x0e,0x3d,0xa0,0x77,0x7f,0x92,0xfe,0x9d,0x5c,0x5f,0x3e,0x2f,0x2b,0x40,0x18,0x04,0xab,\r\n0x4b,0x78,0x54,0x0d,0x2d,0x5e,0x5c,0x50,0x56,0x59,0x30,0x72,0x7a,0x01,0x10,0xd8,0x27,0xfe,0xdc,0xfe,0xc5,0xcb,0xbc,0x3e,0x65,0x5c,0x54,0x58,0x72,0x39,0x74,0x6b,0x77,0x9b,0x93,0xfe,0x0f,0x47,0x31,0x2b,0x41,0x43,0x30,0x35,0x48,0x00,0x00,0x01,0x00,0xd6,0xff,0xe7,0x04,0x48,0x05,0x9a,0x00,0x1e,0x00,0x3d,0xb9,0x00,0x1a,0x01,\r\n0x85,0x40,0x0c,0x19,0x05,0x19,0x01,0x19,0x01,0x19,0x20,0x12,0x8a,0x0b,0x15,0xb8,0x01,0x80,0x40,0x0c,0x05,0x0e,0x08,0x08,0x00,0x19,0x0e,0x06,0x01,0x9a,0x00,0x19,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x31,0x30,0x05,0x27,0x36,0x36,0x37,0x37,0x06,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x13,0x33,0x03,0x0e,0x02,0x01,0x7d,0x10,0x98,0xae,0x2b,0x34,0x29,0x97,0x57,0x81,0xa4,0x08,0x5d,0xa1,0x5a,0x06,0x5d,0x45,0x55,0x9d,0x2d,0x6a,0xa1,0xbd,0x2e,0x81,0xca,0x19,0x87,0x0c,0xa9,0xc3,0xf1,0x1a,0x22,0x87,0x67,0x2b,0x20,0x01,\r\n0xc6,0xfe,0x4d,0x1d,0x19,0x35,0x43,0x32,0x2a,0x02,0x05,0xfc,0x7e,0xd5,0xdf,0x77,0x00,0x01,0x00,0x59,0xff,0xe7,0x04,0x5f,0x05,0xb5,0x00,0x19,0x00,0x41,0xb2,0x0c,0x0d,0x12,0xb8,0x01,0x86,0x40,0x11,0x07,0x0d,0x07,0x0d,0x07,0x1b,0x00,0x89,0x19,0x0d,0x0c,0x19,0x0c,0x19,0x0c,0x0f,0x02,0xb8,0x01,0x80,0xb2,0x16,0x19,0x0a,0xb8,\r\n0x01,0x80,0xb1,0x0f,0x07,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x16,0x33,0x32,0x36,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x21,0x32,0x16,0x15,0x10,0x02,0x04,0x23,0x22,0x26,0x27,0x01,0x0d,0x2e,0x9a,0x69,0xaf,0x7f,\r\n0x4c,0x75,0x71,0x9e,0x75,0x89,0xa9,0x01,0x04,0xb1,0xcb,0xae,0xfe,0xd6,0xc0,0x8c,0xc8,0x1a,0x01,0x34,0xaf,0x7f,0xe7,0x01,0x44,0x99,0xa1,0xae,0x96,0x5a,0xda,0xf9,0xd4,0xfe,0xe8,0xfe,0x14,0xfd,0xb4,0x98,0x00,0x01,0x00,0x7b,0xff,0xe7,0x04,0x7f,0x05,0xb2,0x00,0x1a,0x00,0x3f,0x40,0x0b,0x0d,0x0c,0x1a,0x89,0x00,0x0c,0x00,0x0c,\r\n0x00,0x1c,0x07,0xb8,0x01,0x86,0xb7,0x13,0x0d,0x0c,0x00,0x0c,0x00,0x10,0x02,0xb8,0x01,0x80,0xb2,0x17,0x07,0x0a,0xb8,0x01,0x80,0xb1,0x10,0x19,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x16,0x33,\r\n0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x12,0x24,0x33,0x32,0x16,0x17,0x03,0xcc,0x30,0x98,0x69,0xad,0x80,0x4c,0x75,0x70,0x9e,0x75,0x88,0x57,0xd3,0x82,0xaf,0xcc,0xae,0x01,0x28,0xc1,0x8d,0xc7,0x19,0x04,0x65,0xaf,0x7c,0xe7,0xfe,0xbd,0x9a,0xa5,0xaa,0x96,0x5a,0x70,0x6a,0xf9,0xd3,0x01,0x19,0x01,0xe9,0xfd,0xb6,0x96,\r\n0x00,0x01,0x00,0x8b,0xff,0xe7,0x04,0x9b,0x05,0x9d,0x00,0x15,0x00,0x29,0xb9,0x00,0x08,0x01,0x85,0xb4,0x07,0x07,0x17,0x13,0x00,0xb8,0x01,0x86,0xb4,0x0f,0x07,0x12,0x06,0x03,0xb8,0x01,0x80,0xb1,0x0c,0x19,0x00,0x3f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x32,0x12,0x39,0x2f,0xed,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x13,0x33,\r\n0x03,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x13,0x33,0x03,0x06,0x01,0x32,0x68,0x6d,0x75,0x88,0x22,0xd3,0xa2,0xd8,0x32,0xe2,0xbf,0xa7,0xbe,0x31,0xb1,0xa2,0xaf,0x2e,0x01,0x45,0x67,0x59,0x97,0x99,0x03,0xe7,0xfc,0x0a,0xef,0xd0,0xa3,0x8f,0x6c,0xd2,0x03,0x46,0xfc,0xca,0xcf,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,\r\n0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0xff,0xd0,0xfe,0x9d,0x02,0x51,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xad,0xf9,0xeb,0x00,0x0b,0xb6,0x01,0x00,0x16,0x0c,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf9,0x00,0x00,0x02,0x29,0x07,0x18,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x2a,\r\n0xfe,0xb9,0x01,0x84,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,0x12,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0x86,0x00,0x00,0x01,0xf0,0x07,0x5e,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x6e,0x00,0xa9,0x01,0x5e,0x00,0x1a,0xb1,0x02,0x01,0xb8,0xff,0x78,0x40,0x0a,0x12,0x0c,0x0b,0x05,\r\n0x25,0x02,0x01,0x11,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xfe,0x07,0x66,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8e,0xff,0xf2,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xe8,0x40,0x09,0x0d,\r\n0x0d,0x0b,0x05,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfd,0x00,0x00,0x02,0x31,0x07,0x6b,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd7,0xff,0xa1,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x10,0x05,0x26,0x01,0x00,0x10,0x0c,0x0b,0x00,0x25,0x01,0x2b,0x35,0x00,0x2b,0x35,0x00,0xff,0xff,0xff,0xbe,\r\n0x00,0x00,0x03,0x58,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x68,0x00,0x00,0x01,0x07,0x04,0x36,0xfe,0x74,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x40,0x40,0x09,0x0d,0x19,0x0b,0x05,0x25,0x02,0x01,0x1b,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbd,0x00,0x00,0x03,0x6e,0x05,0xa1,0x00,0x27,0x0d,0xf2,\r\n0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x37,0xfe,0x7b,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x31,0x40,0x09,0x0d,0x19,0x0b,0x05,0x25,0x02,0x01,0x1c,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xc1,0x00,0x00,0x03,0x67,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x77,0x00,0x00,0x01,0x07,0x04,0x43,0xfe,0x7d,\r\n0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x3a,0x40,0x09,0x0f,0x19,0x0b,0x05,0x25,0x02,0x01,0x1b,0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x03,0x6e,0x05,0xb3,0x00,0x27,0x0d,0xf2,0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x38,0xfe,0x8b,0xff,0x30,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x41,\r\n0x40,0x09,0x12,0x0c,0x0b,0x05,0x25,0x02,0x01,0x15,0x04,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xc0,0x00,0x00,0x03,0x88,0x05,0xa1,0x00,0x27,0x0d,0xf2,0x01,0x98,0x00,0x00,0x01,0x07,0x04,0x44,0xfe,0x88,0xff,0x9b,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x25,0x40,0x09,0x0f,0x19,0x0b,0x05,0x25,0x02,0x01,0x1c,\r\n0x03,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xbe,0x00,0x00,0x03,0x6e,0x05,0xb3,0x00,0x27,0x0d,0xf2,0x01,0x7e,0x00,0x00,0x01,0x07,0x04,0x45,0xfe,0x8b,0xff,0x30,0x00,0x19,0xb1,0x02,0x01,0xb8,0xfe,0x41,0x40,0x09,0x12,0x0c,0x0b,0x05,0x25,0x02,0x01,0x15,0x04,0x00,0x3f,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,\r\n0xff,0xff,0xff,0xbf,0x00,0x00,0x02,0x48,0x05,0xa1,0x00,0x26,0x0d,0xf2,0x58,0x00,0x01,0x07,0x04,0x61,0xfd,0xdd,0xff,0x7e,0x00,0x14,0xb9,0x00,0x01,0xfe,0xb9,0xb7,0x10,0x0c,0x0b,0x05,0x25,0x01,0x13,0x04,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xbe,0x00,0x00,0x02,0x4a,0x05,0xa1,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,\r\n0x04,0x27,0xfd,0xda,0xff,0x7e,0x00,0x14,0xb9,0x00,0x01,0xfe,0xb5,0xb7,0x0d,0x18,0x0b,0x05,0x25,0x01,0x15,0x04,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xfe,0x00,0x00,0x02,0x22,0x07,0x0a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x66,0x01,0x10,0x01,0x4c,0x00,0x13,0x40,0x0b,0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,\r\n0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xf2,\r\n0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0xff,0xf2,0x00,0x00,0x02,0x39,0x06,0xe3,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,\r\n0x00,0x8f,0xff,0x75,0x01,0x5c,0x00,0x17,0x40,0x0d,0x02,0x01,0x05,0x1b,0x15,0x0b,0x05,0x25,0x02,0x01,0x18,0x05,0x26,0x00,0x2b,0x35,0x35,0x01,0x2b,0x35,0x35,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0xfe,0x70,0x01,0xf0,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,\r\n0x01,0x06,0x00,0xdf,0x12,0x00,0x00,0x0b,0xb6,0x01,0x00,0x1a,0x0c,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x05,0x9a,0x02,0x06,0x0d,0xf2,0x00,0x00,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x07,0x83,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x02,0x50,0xff,0xf0,0x01,0x5c,0x00,0x13,0x40,0x0b,\r\n0x01,0x00,0x16,0x15,0x0b,0x05,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0xff,0xe8,0x04,0x4c,0x05,0x9a,0x00,0x26,0x0d,0xf2,0x00,0x00,0x00,0x07,0x00,0x2d,0x02,0x21,0x00,0x00,0xff,0xff,0xff,0xd1,0x00,0x00,0x02,0x52,0x07,0x0c,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd8,0xff,0xae,\r\n0x01,0x5a,0x00,0x13,0x40,0x0b,0x01,0x00,0x16,0x0c,0x0b,0x05,0x25,0x01,0x16,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x30,0xfe,0xc6,0x01,0xf0,0x05,0x9a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x06,0x02,0x45,0xbc,0x00,0x00,0x0b,0xb6,0x01,0x00,0x0f,0x15,0x0b,0x05,0x25,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x1c,\r\n0x00,0x00,0x01,0xf0,0x07,0x66,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0x43,0xff,0xca,0x01,0x5c,0x00,0x16,0xb9,0x00,0x01,0xff,0xc5,0x40,0x09,0x0e,0x0c,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc7,0x00,0x00,0x02,0x4a,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,0x04,0x60,\r\n0xfd,0xf6,0xff,0x9b,0x00,0x14,0xb9,0x00,0x01,0xfe,0xd0,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01,0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xc7,0x00,0x00,0x02,0x4a,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x5a,0x00,0x01,0x07,0x01,0x9f,0xfe,0xf9,0xff,0x9a,0x00,0x14,0xb9,0x00,0x01,0xfe,0xcf,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01,\r\n0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0xff,0xf3,0x00,0x00,0x02,0x3a,0x07,0xd1,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x02,0xd5,0xff,0x76,0x00,0x00,0x00,0x1b,0x40,0x0f,0x03,0x02,0x01,0x06,0x1f,0x19,0x0b,0x05,0x25,0x03,0x02,0x01,0x1c,0x05,0x26,0x00,0x2b,0x35,0x35,0x35,0x01,0x2b,0x35,0x35,0x35,0x00,0xff,0xff,\r\n0xff,0xf8,0x00,0x00,0x02,0x2a,0x07,0x62,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xe0,0xff,0x92,0x01,0x56,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x0c,0x0b,0x05,0x25,0x01,0x0e,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x12,0x00,0x00,0x02,0x0e,0x06,0x79,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x04,0x64,\r\n0x01,0x10,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0f,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xaf,0x00,0x00,0x02,0x2c,0x05,0x9b,0x00,0x26,0x0d,0xf2,0x3c,0x00,0x01,0x07,0x04,0x55,0xfd,0xde,0xff,0x9b,0x00,0x14,0xb9,0x00,0x01,0xfe,0xd6,0xb7,0x0e,0x0c,0x0b,0x05,0x25,0x01,\r\n0x0f,0x03,0x00,0x3f,0x35,0x01,0x2b,0x35,0xff,0xff,0x00,0x30,0x00,0x00,0x01,0xf0,0x06,0xe2,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xdb,0x00,0x42,0x01,0x5d,0x00,0x13,0x40,0x0b,0x01,0x00,0x0f,0x15,0x0b,0x05,0x25,0x01,0x0c,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x10,0x06,0x79,\r\n0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xd9,0xff,0xd6,0x01,0x4a,0x00,0x13,0x40,0x0b,0x01,0x00,0x0e,0x0f,0x0b,0x05,0x25,0x01,0x0d,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x02,0x24,0x07,0x1a,0x02,0x26,0x0d,0xf2,0x00,0x00,0x01,0x07,0x00,0xda,0xff,0xda,0x01,0x5c,0x00,0x13,0x40,0x0b,\r\n0x01,0x00,0x12,0x0c,0x0b,0x05,0x25,0x01,0x0f,0x05,0x26,0x00,0x2b,0x35,0x01,0x2b,0x35,0x00,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x55,0x00,0x5b,0x00,0x61,0x00,0x67,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,\r\n0x00,0x99,0x00,0x9d,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,\r\n0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x05,0x21,0x35,0x33,0x11,0x07,0x35,0x37,0x11,0x33,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,\r\n0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,\r\n0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x02,0xe0,0xfe,0xf0,0x59,0x5b,0xba,0x58,0xfb,0xbb,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,\r\n0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfc,0x44,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,\r\n0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x04,0x4b,0x01,0x0b,0x13,0x4c,0x26,0xfe,0x96,0x03,0x8b,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,\r\n0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x61,0x00,0x67,0x00,0x6d,0x00,0x73,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,\r\n0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,\r\n0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x33,0x15,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,\r\n0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,\r\n0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x02,0x2f,0xae,0xfe,0xe5,0x7c,0x25,0x1e,0x40,0x37,0x33,0x38,0x47,0x42,0x4a,0x5b,0xfc,0x14,0xeb,0x96,0x04,\r\n0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,\r\n0x01,0x2a,0xfc,0x44,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x4d,0x02,0x4f,0x4a,0x76,0x24,0x30,0x1b,0x3b,0x2c,0x53,0x25,0x43,0x38,0x4b,\r\n0x51,0x03,0x37,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x14,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,\r\n0x00,0x09,0x00,0x15,0x00,0x4b,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8a,0x00,0x8e,0x00,0x92,0x00,0x96,0x00,0x9a,0x00,0x9e,0x00,0xa2,0x00,0xa6,0x00,0xaa,0x00,0xae,0x00,0xb2,0x00,0xb6,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x11,0x33,0x21,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,\r\n0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,\r\n0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x03,0x20,0x97,0x8b,0x8b,0x61,0xf8,0x02,0x1a,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xfd,0x35,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,\r\n0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x01,0xd9,0x2b,0x3a,0x24,0x28,0x32,0x2b,0x27,0x24,0x54,0x41,0x2b,0x29,0x2d,0x3d,0x42,0x49,0x55,0x2d,0x35,0x58,0x4e,0x42,0xfc,0x98,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,\r\n0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0x04,0x7b,0x6a,0x4e,0xa7,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfc,0x45,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,\r\n0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x0a,0x52,0x1f,0x1f,0x1c,0x1d,0x1f,0x48,0x38,0x35,0x1c,0x4d,0x17,0x3b,0x30,0x54,0x15,0x02,0x06,0x37,0x27,0x3d,0x46,0x03,0xdd,0xec,\r\n0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x13,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x0b,0x00,0x41,\r\n0x00,0x5d,0x00,0x63,0x00,0x69,0x00,0x6f,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0x00,0x01,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x13,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,\r\n0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x13,0x23,0x11,0x34,0x37,0x23,0x06,0x07,0x03,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x17,0x16,0x17,0x33,0x36,0x37,0x37,0x33,0x25,0x35,0x33,0x15,0x23,0x15,0x25,0x35,\r\n0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,\r\n0x03,0x82,0x94,0x6e,0x92,0x68,0x5a,0x07,0x01,0x02,0x02,0x07,0x5a,0xe5,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0x7b,0x60,0x04,0x02,0x08,0x06,0x65,\r\n0x4f,0x67,0x04,0x09,0x03,0x04,0x57,0x8e,0x58,0x0a,0x05,0x02,0x08,0x09,0x58,0x8a,0xfc,0x28,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,\r\n0x05,0x6b,0x56,0x56,0x02,0xac,0xfe,0x52,0x01,0xae,0xfe,0xd4,0x18,0x13,0x15,0x18,0x01,0x2a,0xfe,0x63,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,\r\n0x0c,0x02,0x19,0x01,0x01,0x2a,0x32,0x27,0x12,0xfe,0xdc,0x01,0x21,0x0c,0x30,0x3f,0x30,0xee,0x01,0xae,0xff,0x1f,0x1e,0x23,0x1b,0xfe,0x0a,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,\r\n0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x00,0x00,0x03,0x00,0x93,0xff,0x43,0x03,0x75,0x05,0xb8,0x00,0x1e,0x00,0x25,0x00,0x2a,0x00,0x5b,0xb1,0x16,0x1c,0xb8,0x01,0x84,0x40,0x0d,0x29,0x19,0x13,0x00,0x00,0x1f,0x10,0x09,0x03,0x03,0x0d,0x29,0x23,0xb8,0x01,0x84,0x40,0x0b,0x06,0x0d,0x1f,0x19,0x13,0x09,\r\n0x26,0x0a,0x03,0x20,0x18,0xb8,0x01,0x7e,0xb6,0x10,0x7f,0x13,0x01,0x13,0x27,0x09,0xb8,0x01,0x7e,0xb1,0x00,0x03,0x00,0x2f,0x33,0xed,0x32,0x2f,0x71,0x33,0xed,0x32,0x11,0x39,0x39,0x11,0x12,0x39,0x39,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x2f,0x33,0x33,0x33,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x31,0x30,0x25,0x15,0x23,0x35,0x22,\r\n0x27,0x35,0x16,0x16,0x33,0x11,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x03,0x11,0x06,0x06,0x15,0x14,0x16,0x13,0x11,0x36,0x35,0x34,0x02,0x2e,0x5e,0xc1,0x79,0x35,0xb6,0x4f,0xc7,0x76,0xb3,0x8a,0x5e,0xb2,0x44,0x5d,0x99,0xbd,0x8a,0xad,0xf8,0x4c,0x59,0x48,0xbb,0xaf,\r\n0x07,0xc4,0xbd,0x4e,0x9e,0x2f,0x3e,0x01,0xd0,0x60,0xa2,0x6e,0x84,0xbf,0x13,0xa3,0x9f,0x06,0x2d,0x9a,0x48,0x06,0xfe,0x21,0x59,0xa8,0x6b,0x80,0xaf,0x02,0xce,0x01,0xa6,0x0f,0x68,0x4b,0x4d,0x64,0xfe,0xff,0xfe,0x66,0x26,0x97,0x7d,0x00,0x00,0x05,0x00,0x48,0xff,0xec,0x05,0xaa,0x05,0x27,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x27,\r\n0x00,0x33,0x00,0x6f,0xb5,0x18,0x1a,0x18,0x1a,0x03,0x25,0xbe,0x01,0x83,0x00,0x31,0x00,0x09,0x01,0x83,0x00,0x15,0x00,0x2b,0x01,0x83,0xb7,0x1f,0x15,0x1f,0x15,0x1f,0x03,0x31,0x0f,0xbb,0x01,0x83,0x00,0x03,0x00,0x12,0x01,0x7d,0xb5,0x70,0x00,0x01,0x00,0x00,0x0c,0xb8,0x01,0x7d,0xb6,0x06,0x06,0x7f,0x1b,0x01,0x1b,0x28,0xb8,0x01,\r\n0x7d,0xb2,0x22,0x22,0x2e,0xb8,0x01,0x7d,0xb2,0x1c,0x1c,0x1a,0x00,0x2f,0x33,0x2f,0xed,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x33,0x2f,0x71,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x25,0x01,0x23,0x01,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x6e,0x86,0xa0,0xa9,0x8f,0x8b,0x99,0xab,0x7e,0x56,0x64,0x62,0x54,0x55,0x60,0x5f,0x03,0x07,0xfc,0xbe,0x81,0x03,0x40,0x23,\r\n0x86,0xa0,0xab,0x8d,0x8a,0x9a,0xac,0x7e,0x57,0x62,0x62,0x54,0x55,0x60,0x5f,0x02,0x88,0xb0,0x94,0xa1,0xba,0xac,0x9c,0x9c,0xbb,0x02,0x3b,0x7f,0x70,0x6d,0x7b,0x7f,0x71,0x6d,0x7a,0x50,0xfa,0xe4,0x05,0x1c,0xfa,0xd9,0xb2,0x92,0xa2,0xbb,0xae,0x9c,0x9b,0xbc,0x02,0x3b,0x7f,0x70,0x6c,0x7a,0x7f,0x70,0x6e,0x78,0x00,0x03,0x00,0x6c,\r\n0xff,0xeb,0x05,0xa8,0x05,0x29,0x00,0x43,0x00,0x57,0x00,0x67,0x00,0x7e,0xb1,0x41,0x33,0xbb,0x01,0x84,0x00,0x2c,0x00,0x60,0x01,0x84,0xb6,0x17,0x12,0x4e,0x24,0x03,0x17,0x21,0xb8,0x01,0x84,0xb3,0x58,0x29,0x05,0x38,0xb8,0x01,0x85,0x40,0x0b,0x49,0x17,0x58,0x49,0x49,0x58,0x17,0x03,0x0f,0x2c,0x53,0xb8,0x01,0x84,0xb3,0x0f,0x24,\r\n0x12,0x4e,0xb8,0x01,0x7e,0x40,0x0c,0x29,0x49,0x38,0x05,0x04,0x0a,0x65,0x2f,0x65,0x2f,0x44,0x5d,0xb8,0x01,0x7e,0xb2,0x1c,0x3d,0x44,0xb8,0x01,0x7e,0xb1,0x00,0x0a,0x00,0x2f,0x33,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0xed,0x39,0x39,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x39,0x39,\r\n0x10,0xed,0x11,0x17,0x39,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x05,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x14,0x0e,0x02,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,\r\n0x15,0x06,0x06,0x25,0x32,0x3e,0x02,0x37,0x2e,0x03,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x14,0x1e,0x02,0x17,0x36,0x36,0x05,0x1d,0x33,0x4f,0x43,0x3f,0x22,0x25,0x5f,0x74,0x89,0x51,0x62,0xa3,0x74,0x40,0x9d,0x91,0x1c,0x36,0x2b,0x1a,0x34,0x5a,0x7c,0x47,0x47,0x75,0x54,0x2f,0x7c,0x7c,0x3e,\r\n0x66,0x56,0x4a,0x24,0x4a,0x4a,0x08,0x07,0x90,0x07,0x03,0x02,0x23,0x3a,0x4d,0x2a,0x1f,0x35,0x35,0x39,0x25,0x1b,0x38,0x1e,0x21,0x47,0xfc,0xe5,0x45,0x74,0x62,0x4f,0x21,0x37,0x5e,0x5f,0x6b,0x47,0x39,0x60,0x46,0x28,0x2d,0x4f,0x69,0x01,0x20,0x22,0x34,0x3f,0x1f,0x59,0x6a,0x01,0x17,0x29,0x36,0x1f,0x72,0x71,0x15,0x1c,0x34,0x4a,\r\n0x2f,0x27,0x48,0x38,0x22,0x31,0x5f,0x8c,0x5a,0x8b,0xc5,0x3e,0x14,0x35,0x44,0x53,0x31,0x47,0x6f,0x4c,0x27,0x27,0x48,0x66,0x3e,0x6d,0x90,0x33,0x18,0x47,0x57,0x64,0x35,0x66,0xf7,0x87,0x22,0x3d,0x1e,0x1e,0x36,0x25,0x52,0xa7,0x9d,0x8d,0x3b,0x2b,0x41,0x2b,0x15,0x0e,0x0b,0x89,0x0d,0x0d,0x81,0x1e,0x32,0x42,0x24,0x56,0x7a,0x59,\r\n0x40,0x1b,0x17,0x37,0x4b,0x64,0x43,0x3e,0x5e,0x3e,0x20,0x03,0x9d,0x2d,0x40,0x29,0x13,0x60,0x52,0x25,0x42,0x38,0x2b,0x10,0x28,0x6a,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x8f,0x05,0x29,0x00,0x1b,0x00,0x4d,0xb1,0x14,0x18,0xb8,0x01,0x84,0x40,0x0c,0x08,0x04,0x16,0x0f,0x00,0x00,0x0f,0x16,0x04,0x04,0x1d,0x1a,0xb8,0x01,0x86,0xb3,\r\n0x06,0x01,0x17,0x06,0xb8,0x01,0x7e,0xb4,0x14,0x07,0x07,0x1a,0x11,0xb8,0x01,0x7e,0xb2,0x0c,0x02,0x1a,0xb9,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc4,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x21,0x35,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,\r\n0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x14,0x07,0x21,0x03,0x8f,0xfc,0xd1,0xc6,0xb3,0xb3,0xc5,0x9d,0x6a,0x57,0x5b,0x64,0xd0,0x01,0x0c,0xfe,0xf4,0xaf,0x02,0x84,0x7a,0x3f,0xdd,0xa9,0x80,0xe6,0xab,0xd9,0x25,0x8d,0x34,0xfe,0xea,0xd6,0x80,0x8d,0xdb,0x58,0x00,0x02,0x00,0x77,0xff,0xc4,0x02,0xdb,\r\n0x05,0x47,0x00,0x26,0x00,0x30,0x00,0x5c,0xb2,0x1c,0x00,0x25,0xbb,0x01,0x84,0x00,0x2e,0x00,0x20,0x01,0x84,0xb2,0x07,0x16,0x02,0xb8,0x01,0x84,0x40,0x09,0x0d,0x16,0x0d,0x16,0x0d,0x12,0x2e,0x14,0x29,0xb8,0x01,0x84,0x40,0x0c,0x12,0x00,0x2c,0x14,0x27,0x20,0x27,0x2c,0x0d,0x04,0x05,0x1e,0xbc,0x01,0x7e,0x00,0x19,0x00,0x0a,0x01,\r\n0x7e,0x00,0x05,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xfd,0xc5,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xed,0x10,0xfd,0xcd,0xc4,0x31,0x30,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,\r\n0x15,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x01,0x06,0x15,0x14,0x16,0x17,0x36,0x35,0x34,0x26,0x02,0x54,0x52,0xb6,0x8c,0x77,0x61,0x75,0x6d,0x4c,0x53,0x40,0x83,0xd3,0x85,0x60,0xa9,0x8b,0x76,0x50,0x5b,0x6f,0x98,0x49,0x94,0xca,0xfe,0x8e,0x5c,0x66,0x80,0x50,0x5f,0x01,0x79,0x43,0x66,0x77,0x95,0x33,0x8f,0x43,0x48,\r\n0x36,0x30,0x42,0x46,0x6e,0xb1,0x94,0x49,0x4b,0x7f,0x73,0x95,0x27,0x8f,0x38,0x83,0x31,0x52,0x47,0x61,0xa8,0x9a,0x01,0x5b,0x2e,0x62,0x41,0x63,0x39,0x3d,0x5f,0x41,0x5b,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x03,0xb0,0x05,0x13,0x00,0x1b,0x00,0x72,0xb3,0x10,0x0c,0x05,0x09,0xbb,0x01,0x84,0x00,0x0a,0x00,0x01,0x01,0x82,0x40,0x15,\r\n0x18,0x03,0x07,0x0c,0x12,0x0a,0x0e,0x18,0x07,0x07,0x18,0x0e,0x0a,0x12,0x0c,0x06,0x00,0x13,0x00,0x08,0x0c,0xb8,0x01,0x7e,0xb4,0x0d,0x05,0x0d,0x04,0x10,0xb8,0x01,0x7e,0x40,0x13,0x11,0x01,0x18,0x11,0x0f,0x11,0x1f,0x11,0x02,0x0d,0x11,0x0d,0x11,0x0a,0x13,0x7f,0x00,0x01,0x00,0x00,0x2f,0x71,0x32,0x2f,0x39,0x39,0x2f,0x2f,0x5d,\r\n0x11,0x39,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x10,0xed,0x32,0x11,0x33,0x31,0x30,0x01,0x01,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x01,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x03,0xb0,\r\n0xfe,0xbe,0x01,0x02,0xfe,0xd1,0x01,0x2f,0xfe,0xd1,0x94,0xfe,0xc8,0x01,0x38,0xfe,0xc8,0x01,0x08,0xfe,0xc1,0xae,0xe2,0x19,0x12,0x03,0x0c,0x21,0xe4,0x05,0x13,0xfd,0xae,0x7e,0xbc,0x7e,0xfe,0xf7,0x01,0x09,0x7e,0xbc,0x7e,0x02,0x52,0xfe,0x2f,0x35,0x30,0x26,0x44,0x01,0xcc,0x00,0x00,0x01,0x00,0x96,0xfe,0x99,0x03,0xb5,0x03,0xa0,\r\n0x00,0x18,0x00,0x29,0xb1,0x0e,0x0a,0xbb,0x01,0x84,0x00,0x0b,0x00,0x17,0x01,0x84,0xb5,0x14,0x03,0x15,0x0d,0x0b,0x11,0xb8,0x01,0x7e,0xb1,0x06,0x01,0x00,0x2f,0x2f,0xed,0x2f,0x2f,0x33,0x01,0x2f,0x33,0xed,0x2f,0xed,0x32,0x31,0x30,0x21,0x23,0x26,0x35,0x23,0x06,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x14,0x16,0x33,0x32,\r\n0x36,0x35,0x11,0x33,0x11,0x14,0x03,0xb5,0x9a,0x14,0x05,0x4c,0xb1,0x97,0x40,0x04,0x94,0x94,0x7d,0x65,0x6d,0x89,0x96,0x41,0x57,0xad,0x70,0xfe,0x3e,0x05,0x07,0xfd,0xc9,0x73,0x88,0x9b,0x84,0x02,0x13,0xfd,0x50,0xaa,0x00,0x01,0x00,0x2e,0xfe,0x57,0x04,0x48,0x05,0x13,0x00,0x0b,0x00,0x32,0xb1,0x08,0x0a,0xbb,0x01,0x86,0x00,0x01,\r\n0x00,0x09,0x01,0x86,0x40,0x10,0x03,0x03,0x00,0x04,0x01,0x07,0x00,0x08,0x9a,0x7f,0x05,0x01,0x05,0x0a,0x9a,0x01,0x00,0x2f,0xed,0x2f,0x71,0xed,0x01,0x2f,0x33,0x2f,0x33,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x31,0x30,0x01,0x21,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x04,0x48,0xfb,0xe6,0x02,0x65,0xfd,0xbd,0x03,0xd4,\r\n0xfd,0x0b,0x02,0x1a,0xfd,0xca,0x03,0x35,0xfe,0x57,0x47,0x03,0x20,0x03,0x04,0x51,0x8b,0xfd,0x39,0xfd,0x21,0x00,0x00,0x01,0x00,0x5c,0xff,0xea,0x03,0x97,0x05,0x29,0x00,0x25,0x00,0x58,0xb4,0x14,0x25,0x25,0x27,0x1d,0xb8,0x01,0x85,0xb2,0x09,0x21,0x05,0xb8,0x01,0x7e,0xb4,0x06,0x1e,0x06,0x1c,0x0c,0xb8,0x01,0x7e,0x40,0x13,0x0d,\r\n0x19,0x0d,0x0f,0x06,0x1f,0x06,0x02,0x3f,0x0d,0x4f,0x0d,0x02,0x06,0x0d,0x06,0x0d,0x23,0x16,0xbc,0x01,0x7e,0x00,0x11,0x00,0x23,0x01,0x7e,0x00,0x02,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x2f,0x39,0x31,0x30,0x25,0x06,0x23,0x20,\r\n0x03,0x23,0x35,0x33,0x26,0x35,0x34,0x37,0x23,0x35,0x33,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x06,0x17,0x21,0x15,0x21,0x12,0x33,0x32,0x37,0x03,0x97,0x79,0x87,0xfe,0x7d,0x4a,0x6e,0x62,0x03,0x05,0x64,0x77,0x2e,0x01,0x01,0xb7,0x7c,0x62,0x68,0x80,0x72,0xb0,0x24,0x01,0xc3,0xfe,0x2a,0x08,0x07,\r\n0x01,0xd7,0xfe,0x37,0x41,0xfc,0x77,0x80,0x2d,0x43,0x01,0xcb,0x7f,0x1c,0x29,0x2c,0x36,0x7f,0xd9,0xf6,0x33,0x93,0x47,0xb6,0x9a,0x7f,0x5a,0x4d,0x7f,0xfe,0xb4,0x4f,0x00,0x03,0x00,0x73,0x00,0x00,0x06,0x30,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x24,0x00,0x70,0xb1,0x0e,0x1f,0xbe,0x01,0x83,0x00,0x14,0x00,0x08,0x01,0x82,0x00,0x03,\r\n0x00,0x23,0x01,0x84,0x40,0x11,0x19,0x0f,0x03,0x00,0x0f,0x0f,0x00,0x03,0x03,0x05,0x0a,0x14,0x0c,0x01,0x05,0x08,0x02,0xbb,0x01,0x7d,0x00,0x01,0x00,0x17,0x01,0x7d,0xb7,0x1c,0x01,0x1c,0x01,0x1c,0x0d,0x10,0x23,0xb8,0x01,0x7d,0x40,0x0a,0x0f,0x04,0x99,0x07,0x07,0x7f,0x0d,0x01,0x0d,0x0c,0x00,0x2f,0x2f,0x71,0x33,0x2f,0xed,0x2f,\r\n0xed,0x32,0x11,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0xc4,0x2f,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc4,0xed,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,\r\n0x16,0x15,0x14,0x07,0x07,0x15,0x21,0x02,0x43,0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,0x83,0x03,0x0a,0x01,0xc4,0xfe,0x0a,0xd9,0x5e,0x33,0x45,0x38,0x6b,0x59,0x4d,0x88,0x6b,0x7d,0xb9,0x95,0x01,0x5e,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfa,0xee,0x67,0xd6,0x5c,0x63,\r\n0x32,0x35,0x42,0x5d,0x87,0x45,0x77,0x62,0x8b,0xb1,0x8d,0x04,0x00,0x04,0x00,0x73,0x00,0x00,0x06,0x0a,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x18,0x00,0x20,0x00,0x7d,0xb5,0x17,0x10,0x0e,0xa8,0x11,0x08,0xbb,0x01,0x82,0x00,0x03,0x00,0x1d,0x01,0x83,0x40,0x18,0x13,0x03,0x00,0x13,0x13,0x00,0x03,0x03,0x05,0x1e,0x1a,0x19,0x0a,0x11,\r\n0x0c,0x01,0x05,0x04,0x99,0x07,0x07,0x0d,0x0f,0x13,0xb8,0x01,0x7d,0xb5,0x1d,0x17,0x14,0x1d,0x08,0x02,0xb8,0x01,0x7d,0x40,0x11,0x01,0x19,0x15,0x1d,0x01,0x15,0x15,0x01,0x1d,0x03,0x0c,0x7f,0x0d,0x01,0x0d,0x11,0x0c,0x00,0x2f,0x33,0x2f,0x71,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x33,0x10,0xed,0x32,\r\n0x11,0x33,0x2f,0xed,0x01,0x2f,0x33,0xc4,0x2f,0xc4,0x33,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xf4,0xc6,0x32,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x01,0x33,0x11,0x33,0x03,0x23,0x06,0x07,0x03,0x33,0x11,0x34,0x02,0x43,\r\n0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,0x83,0x03,0x0a,0x01,0x9e,0x64,0x78,0xfe,0x9c,0x01,0x4f,0x8d,0x64,0xd8,0x04,0x0a,0x18,0xc6,0xe8,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfb,0xa6,0xb9,0xb9,0x53,0x01,0xf6,0xfe,0x1a,0x01,0x74,0x1c,0x26,0xfe,0xce,0x01,0x24,0x1d,\r\n0x00,0x04,0x00,0x75,0x00,0x00,0x06,0x45,0x05,0x25,0x00,0x20,0x00,0x24,0x00,0x2f,0x00,0x37,0x00,0x9a,0xb5,0x2e,0x27,0x25,0xa8,0x28,0x17,0xbe,0x01,0x82,0x00,0x0d,0x00,0x1c,0x01,0x83,0x00,0x06,0x00,0x34,0x01,0x83,0x40,0x0f,0x2a,0x0d,0x06,0x2a,0x2a,0x06,0x0d,0x03,0x09,0x35,0x30,0x21,0x28,0x23,0x1a,0xb8,0x01,0x86,0xb4,0x11,\r\n0x00,0x09,0x26,0x2a,0xb8,0x01,0x7d,0xb5,0x34,0x2e,0x2b,0x34,0x19,0x09,0xb8,0x01,0x7d,0xb3,0x0a,0x0a,0x14,0x03,0xb8,0x01,0x7d,0x40,0x0d,0x1f,0x30,0x2c,0x34,0x1f,0x2c,0x2c,0x1f,0x34,0x03,0x23,0x24,0x0f,0xb8,0x01,0x7d,0xb7,0x14,0x14,0x7f,0x24,0x01,0x24,0x28,0x23,0x00,0x2f,0x33,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x17,0x39,\r\n0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x11,0x39,0x2f,0xed,0x39,0x11,0x33,0x33,0x10,0xed,0x32,0x01,0x2f,0xc4,0xc6,0xed,0xc4,0x2f,0xc4,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x10,0xf4,0xc6,0x32,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,\r\n0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x23,0x15,0x23,0x35,0x21,0x35,0x01,0x33,0x11,0x33,0x03,0x23,0x06,0x07,0x03,0x33,0x11,0x34,0x75,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4f,0x72,0x66,0x7a,0x84,0xa1,0x9a,0x81,0x7c,0x04,0x74,0xfc,0xf7,0x82,\r\n0x03,0x0a,0x01,0x98,0x64,0x78,0xfe,0x9c,0x01,0x4f,0x8d,0x64,0xd8,0x04,0x0b,0x17,0xc6,0xe8,0x02,0x2e,0x81,0x45,0x44,0x3a,0x80,0x6a,0x7a,0x6c,0x3f,0x7e,0x2e,0x6b,0x57,0x89,0x31,0x04,0x26,0x91,0x6a,0x86,0x03,0x15,0xfa,0xed,0x05,0x13,0xfb,0xa6,0xb9,0xb9,0x53,0x01,0xf6,0xfe,0x1a,0x01,0x74,0x1c,0x26,0xfe,0xce,0x01,0x24,0x1d,\r\n0x00,0x01,0x00,0x19,0x00,0x00,0x03,0x3e,0x05,0x13,0x00,0x11,0x00,0x4b,0x40,0x09,0x00,0x0e,0x00,0x0e,0x03,0x09,0x10,0x0c,0x02,0xb8,0x01,0x85,0xb4,0x07,0x05,0x03,0x01,0x05,0xb8,0x01,0x7f,0x40,0x12,0x06,0x10,0x06,0x0f,0x9a,0x0c,0x06,0x0c,0x06,0x0c,0x03,0x0b,0x9a,0x7f,0x08,0x01,0x08,0x03,0x00,0x2f,0x2f,0x71,0xed,0x12,0x39,\r\n0x39,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xc6,0x33,0xed,0x32,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x15,0x33,0x02,0x20,0xdd,0x99,0x91,0x91,0x02,0x94,0xfe,0x05,0x01,0xd5,0xfe,0x2b,0xdd,0xfc,0xfc,0xfc,0x8d,0x03,0x8a,\r\n0x8a,0xfe,0x3f,0x89,0xb6,0x00,0x00,0x04,0x00,0xaa,0xff,0xea,0x07,0xd0,0x05,0x13,0x00,0x09,0x00,0x10,0x00,0x25,0x00,0x45,0x00,0x9b,0xb1,0x36,0x41,0xbb,0x01,0x84,0x00,0x2b,0x00,0x06,0x01,0x85,0xb2,0x0e,0x1d,0x21,0xb8,0x01,0x84,0xb5,0x1a,0x18,0x16,0x1f,0x11,0x3b,0xb8,0x01,0x84,0x40,0x0f,0x26,0x30,0x0e,0x16,0x11,0x30,0x30,\r\n0x11,0x16,0x0e,0x04,0x02,0x2b,0x0b,0x01,0xb8,0x01,0x85,0x40,0x0e,0x02,0x2b,0x3b,0x44,0x33,0x44,0x13,0x0b,0x9a,0x00,0x33,0x38,0x20,0x18,0xb8,0x01,0x7e,0x40,0x0d,0x19,0x1d,0x19,0x00,0x19,0x1c,0x1c,0x19,0x00,0x03,0x03,0x29,0x23,0xb8,0x01,0x7e,0x40,0x09,0x13,0x0a,0x9a,0x7f,0x03,0x01,0x03,0x02,0x18,0x00,0x3f,0x2f,0x71,0xed,\r\n0x2f,0xed,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x32,0x33,0x10,0xed,0x11,0x33,0x11,0x12,0x39,0x39,0x01,0x2f,0xed,0x32,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc4,0xed,0x11,0x33,0x10,0xc6,0x33,0xed,0x32,0x10,0xed,0x10,0xfd,0xc4,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x20,0x11,0x14,0x06,0x23,0x03,\r\n0x11,0x33,0x20,0x11,0x10,0x21,0x01,0x06,0x23,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x33,0x15,0x23,0x11,0x14,0x33,0x32,0x37,0x17,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x01,0x43,0x99,0x01,0x1b,0x01,\r\n0xa3,0xf0,0xd5,0x60,0x55,0x01,0x30,0xfe,0xe3,0x03,0xd3,0x34,0x57,0x76,0x6a,0x8d,0x8d,0x94,0xd7,0xd7,0x77,0x36,0x2a,0x3e,0x6d,0x7c,0x93,0x3a,0xdf,0x61,0xa6,0x85,0x75,0x47,0x57,0x67,0x42,0x4f,0x62,0x55,0x7f,0x44,0x9f,0x8c,0x92,0x01,0xeb,0xfe,0x15,0x05,0x13,0xfe,0x7c,0xbe,0xe6,0x02,0x9e,0xfd,0xec,0x01,0x13,0x01,0x01,0xfb,\r\n0x80,0x1d,0x81,0x8f,0x01,0xa4,0x7d,0xe3,0x31,0xfe,0xec,0x7d,0xfe,0x76,0xad,0x1f,0x66,0x9f,0x5a,0x68,0x24,0x48,0x54,0x38,0x69,0x6e,0x83,0x2a,0x91,0x3e,0x39,0x2e,0x33,0x28,0x23,0x39,0x66,0x43,0x71,0x82,0x00,0x01,0x00,0x60,0x00,0x00,0x03,0x8f,0x05,0x29,0x00,0x23,0x00,0x81,0xb5,0x10,0x0c,0x07,0x22,0x1e,0x01,0xb8,0x01,0x84,\r\n0x40,0x0e,0x12,0x0e,0x0a,0x20,0x00,0x0a,0x00,0x19,0x19,0x00,0x0a,0x03,0x05,0x04,0xb8,0x01,0x86,0xb3,0x07,0x05,0x01,0x0c,0xb8,0x01,0x7e,0xb4,0x0d,0x22,0x0d,0x21,0x10,0xb8,0x01,0x7e,0x40,0x16,0x11,0x1e,0x11,0x30,0x0d,0x40,0x0d,0x02,0x2f,0x11,0x01,0x00,0x11,0x10,0x11,0x02,0x0d,0x11,0x0d,0x11,0x04,0x1b,0xb8,0x01,0x7e,0xb2,\r\n0x16,0x08,0x04,0xb9,0x01,0x7e,0x00,0x07,0x00,0x2f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0xed,0x32,0x32,0x10,0xc4,0x32,0x31,0x30,0x01,0x21,0x15,0x14,0x07,0x21,0x15,0x21,0x35,\r\n0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x11,0x15,0x21,0x15,0x21,0x15,0x21,0x02,0xc6,0xfe,0xf4,0xaf,0x02,0x84,0xfc,0xd1,0xc6,0xb3,0xb3,0xb3,0xb3,0xc5,0x9d,0x6b,0x56,0x5a,0x65,0xd0,0x01,0x0c,0xfe,0xf4,0x01,0x0c,0x01,0xba,0x08,0xdc,0x57,0x7f,0x7a,0x41,0xdb,0x24,\r\n0x7f,0x7b,0x80,0x71,0xab,0xd9,0x25,0x8d,0x34,0xfe,0xea,0x61,0x80,0x7b,0x00,0x05,0x00,0x73,0xff,0xee,0x06,0x35,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x21,0x00,0x2a,0x00,0x34,0x00,0x9a,0xbc,0x00,0x24,0x01,0x83,0x00,0x20,0x00,0x29,0x01,0x83,0x40,0x0a,0x1a,0x0e,0x18,0x1a,0x20,0x1a,0x20,0x1a,0x16,0x10,0xbb,0x01,0x83,0x00,0x33,\r\n0x00,0x2d,0x01,0x83,0x40,0x0b,0x16,0x0c,0x16,0x0a,0x0a,0x16,0x0c,0x03,0x03,0x33,0x08,0xb8,0x01,0x82,0xb7,0x03,0x04,0x99,0x07,0x07,0x0d,0x08,0x02,0xb8,0x01,0x7d,0xb7,0x01,0x18,0x0e,0x2b,0x22,0x2b,0x13,0x26,0xb8,0x01,0x7d,0x40,0x0e,0x1d,0x22,0x30,0x1d,0x01,0x1d,0x01,0x1d,0x0c,0x7f,0x0d,0x01,0x0d,0x30,0xb8,0x01,0x7d,0xb3,\r\n0x13,0x13,0x0c,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x21,\r\n0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x02,0x43,0xfe,0x37,0xa8,0xaf,0x01,0x25,0xab,0x02,0xab,0xfc,0xf7,\r\n0x83,0x03,0x0a,0x01,0x35,0x94,0x94,0x87,0x72,0x97,0x93,0x77,0x8b,0x76,0x6a,0x84,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x42,0x41,0x53,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,\r\n0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x75,0xff,0xee,0x06,0x76,0x05,0x25,0x00,0x20,0x00,0x24,0x00,0x38,0x00,0x41,0x00,0x4b,0x00,0xc3,0xbc,0x00,0x3b,0x01,0x83,0x00,0x37,0x00,0x40,0x01,0x83,0x40,0x0a,0x31,0x25,0x2f,0x31,0x37,0x31,0x37,0x31,0x2d,0x27,0xbb,0x01,0x83,0x00,0x4a,0x00,0x0d,\r\n0x01,0x82,0x40,0x09,0x11,0x09,0x1a,0x03,0x00,0x17,0x17,0x00,0x1c,0xbb,0x01,0x83,0x00,0x06,0x00,0x44,0x01,0x83,0x40,0x0f,0x2d,0x23,0x06,0x2d,0x21,0x21,0x2d,0x06,0x23,0x04,0x00,0x4a,0x00,0x19,0x09,0xb8,0x01,0x7d,0xb3,0x0a,0x0a,0x14,0x03,0xb8,0x01,0x7d,0xb7,0x1f,0x2f,0x25,0x42,0x39,0x42,0x2a,0x3d,0xb8,0x01,0x7d,0x40,0x0b,\r\n0x34,0x39,0x34,0x47,0x1f,0x34,0x1f,0x34,0x23,0x24,0x0f,0xb8,0x01,0x7d,0xb6,0x14,0x14,0x7f,0x24,0x01,0x24,0x47,0xb8,0x01,0x7d,0xb3,0x2a,0x2a,0x23,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x2f,0xed,0x39,\r\n0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,\r\n0x16,0x15,0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x75,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4f,0x72,0x66,\r\n0x7a,0x84,0xa1,0x9a,0x81,0x7c,0x04,0x75,0xfc,0xf7,0x83,0x03,0x0b,0x01,0x35,0x93,0x94,0x87,0x71,0x98,0x93,0x77,0x8b,0x77,0x6a,0x83,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x43,0x40,0x53,0x02,0x2e,0x81,0x45,0x44,0x3a,0x80,0x6a,0x7a,0x6c,0x3f,0x7e,0x2e,0x6b,0x57,0x89,0x31,0x04,0x26,0x91,0x6a,0x86,0x03,0x15,0xfa,0xed,0x05,\r\n0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x82,0xff,0xee,0x06,0x78,0x05,0x17,0x00,0x15,0x00,0x19,0x00,0x2d,0x00,0x36,0x00,0x40,0x00,0xb6,0xbc,0x00,0x30,0x01,0x83,0x00,0x2c,0x00,\r\n0x35,0x01,0x83,0x40,0x0a,0x26,0x1a,0x24,0x26,0x2c,0x26,0x2c,0x26,0x22,0x1c,0xb8,0x01,0x83,0xb2,0x3f,0x0c,0x11,0xbb,0x01,0x83,0x00,0x06,0x00,0x39,0x01,0x83,0x40,0x0d,0x22,0x18,0x06,0x22,0x16,0x16,0x22,0x06,0x18,0x04,0x09,0x3f,0x0e,0xb8,0x01,0x82,0xb2,0x00,0x09,0x08,0xb8,0x01,0x7d,0xb3,0x0e,0x0e,0x0a,0x03,0xb8,0x01,0x7d,\r\n0xb7,0x14,0x1a,0x24,0x37,0x2e,0x37,0x1f,0x32,0xb8,0x01,0x7d,0x40,0x0b,0x29,0x2e,0x29,0x3c,0x14,0x29,0x14,0x29,0x1f,0x19,0x0d,0xb8,0x01,0x7d,0xb6,0x0a,0x0a,0x7f,0x19,0x01,0x19,0x3c,0xb8,0x01,0x7d,0xb3,0x1f,0x1f,0x18,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x33,0x2f,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,\r\n0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x10,0xed,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xfd,0xc4,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,0x10,0xed,0x10,0xed,0x31,0x30,0x13,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x11,0x21,0x15,0x21,0x15,0x36,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x01,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x82,0x67,0x4e,0x4d,0x5b,0xb9,0x8c,0x01,0x9e,0xfe,0xd6,0xa5,0xa9,0x9e,0x89,0x70,0x04,\r\n0x6c,0xfc,0xf7,0x83,0x03,0x0b,0x01,0x34,0x94,0x94,0x87,0x72,0x97,0x93,0x77,0x8b,0x76,0x6a,0x84,0xf8,0x7b,0x79,0x36,0x46,0x74,0x90,0x55,0x42,0x41,0x53,0x02,0x25,0x84,0x3f,0x51,0x40,0x8a,0x08,0x01,0x9a,0x71,0xb5,0x0c,0x89,0x74,0x72,0x90,0x03,0x15,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,\r\n0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x05,0x00,0x93,0xff,0xee,0x05,0xfe,0x05,0x1c,0x00,0x06,0x00,0x0a,0x00,0x1e,0x00,0x27,0x00,0x31,0x00,0x9a,0xbc,0x00,0x21,0x01,0x83,0x00,0x1d,0x00,0x26,0x01,0x83,0x40,0x0a,0x17,0x0b,0x15,0x17,0x1d,0x17,0x1d,\r\n0x17,0x13,0x0d,0xbe,0x01,0x83,0x00,0x30,0x00,0x06,0x01,0x85,0x00,0x02,0x00,0x2a,0x01,0x83,0x40,0x0f,0x13,0x01,0x09,0x02,0x13,0x07,0x07,0x13,0x02,0x09,0x01,0x05,0x30,0x03,0x03,0xb8,0x01,0x7d,0x40,0x0a,0x04,0x04,0x0a,0x0b,0x15,0x1f,0x28,0x28,0x10,0x23,0xb8,0x01,0x7d,0x40,0x0e,0x1a,0x1f,0x2d,0x1a,0x01,0x1a,0x01,0x1a,0x10,\r\n0x7f,0x0a,0x01,0x0a,0x2d,0xb8,0x01,0x7d,0xb3,0x10,0x10,0x09,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x10,0xed,0x11,0x39,0x11,0x12,0x39,0x39,0x11,0x33,0x2f,0xed,0x01,0x2f,0x2f,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x11,0x39,0x39,0x2f,0x2f,0x12,0x39,0x39,\r\n0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x23,0x01,0x21,0x35,0x21,0x15,0x25,0x01,0x23,0x01,0x01,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,0x35,0x34,0x23,0x22,0x06,0x15,0x14,0x17,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x01,0x73,0x84,0x01,0x23,0xfe,0x81,0x02,\r\n0x1b,0x02,0x09,0xfc,0xf6,0x82,0x03,0x0a,0x01,0x35,0x94,0x95,0x87,0x71,0x97,0x92,0x76,0x8a,0x77,0x6a,0x83,0xf8,0x7b,0x78,0x36,0x46,0x74,0x90,0x55,0x42,0x40,0x54,0x02,0x11,0x02,0xa0,0x6b,0x30,0x27,0xfa,0xed,0x05,0x13,0xfc,0x83,0x41,0x8b,0x66,0x76,0x75,0x60,0x8a,0x49,0x43,0x72,0x5b,0x6e,0x69,0x55,0x79,0x10,0x34,0x4a,0x5d,\r\n0x33,0x28,0x4d,0xa0,0x30,0x69,0x2e,0x3e,0x3d,0x2c,0x67,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x04,0x1e,0x05,0x2b,0x00,0x27,0x00,0x61,0xb1,0x22,0x26,0xb8,0x01,0x84,0x40,0x0a,0x1d,0x01,0x10,0x24,0x24,0x10,0x01,0x03,0x00,0x18,0xb8,0x01,0x84,0xb3,0x07,0x20,0x00,0x02,0xbe,0x01,0x7e,0x00,0x1d,0x00,0x25,0x01,0x7e,0x00,0x22,0x00,\r\n0x21,0x01,0x7e,0x40,0x0a,0x1e,0x1d,0x22,0x1e,0x1e,0x22,0x1d,0x03,0x26,0x13,0xbc,0x01,0x7e,0x00,0x0c,0x00,0x26,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x01,0x2f,0x33,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x21,0x11,0x2e,0x03,\r\n0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x04,0x1e,0xfd,0xed,0x61,0x9b,0x6c,0x3a,0x42,0x7d,0xb3,0x70,0x3e,0x71,0x2f,0x34,0x74,0x3b,0x4d,0x7a,0x52,0x2c,0x21,0x42,0x64,0x43,0x01,0xfe,0xfe,0x95,0x01,0x51,0xfe,0xaf,\r\n0x01,0x80,0x01,0x5a,0x03,0x4c,0x80,0xa7,0x5f,0x6f,0xbb,0x87,0x4b,0x17,0x17,0x9b,0x24,0x22,0x39,0x63,0x85,0x4b,0x45,0x75,0x59,0x39,0x0a,0x01,0xba,0x7f,0xfe,0xf0,0x7f,0xfe,0xed,0x00,0x00,0x03,0x00,0x6b,0xff,0xbc,0x03,0xb5,0x05,0xa7,0x00,0x2e,0x00,0x36,0x00,0x40,0x00,0x34,0x40,0x09,0x3b,0x32,0x3f,0x03,0x28,0x15,0x15,0x42,\r\n0x2f,0xb8,0x01,0x85,0xb6,0x28,0x3e,0x31,0x32,0x03,0x37,0x10,0xbc,0x01,0x7e,0x00,0x1b,0x00,0x37,0x01,0x7e,0x00,0x01,0x00,0x2f,0xed,0x2f,0xed,0x11,0x17,0x39,0x01,0x2f,0xed,0x12,0x39,0x2f,0x12,0x17,0x39,0x31,0x30,0x01,0x07,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,\r\n0x0e,0x03,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x07,0x23,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x37,0x01,0x14,0x17,0x13,0x0e,0x03,0x01,0x22,0x06,0x07,0x01,0x16,0x16,0x17,0x01,0x26,0x02,0xe9,0x27,0x17,0x2b,0x14,0x27,0x68,0x2c,0x0e,0x1d,0x0f,0x36,0x2b,0xfe,0xc3,0x3c,0x4b,0x2a,0x47,0x42,0x41,0x23,0x22,0x43,0x48,0x4f,\r\n0x2f,0x52,0x48,0x15,0x67,0x20,0x26,0x23,0x2f,0x66,0x46,0x45,0x4c,0x4a,0x84,0xb4,0x6b,0x29,0xfe,0x89,0x2f,0xf2,0x41,0x6b,0x4c,0x29,0x01,0xb2,0x09,0x10,0x08,0xfe,0xe2,0x0f,0x21,0x13,0x01,0x32,0x1a,0x05,0xa7,0x7e,0x02,0x02,0x82,0x93,0x04,0x09,0x04,0x96,0x19,0x0e,0xfb,0xee,0x19,0x09,0x12,0x1b,0x13,0x88,0x10,0x17,0x11,0x08,\r\n0x16,0x44,0x69,0x16,0x1b,0x9a,0xe8,0x55,0xe8,0x90,0x8c,0xea,0xb3,0x73,0x13,0x87,0xfc,0xd3,0x96,0x74,0x03,0x1e,0x1a,0x63,0x8a,0xab,0x01,0xce,0x01,0x01,0xfc,0x52,0x14,0x21,0x10,0x03,0xf2,0x03,0x00,0x01,0x00,0x6b,0xff,0xea,0x03,0xb5,0x05,0x29,0x00,0x3e,0x00,0x45,0xb1,0x37,0x07,0xb8,0x01,0x83,0xb3,0x34,0x34,0x00,0x2f,0xb8,\r\n0x01,0x85,0xb4,0x1a,0x25,0x10,0x00,0x02,0xb8,0x01,0x7e,0x40,0x09,0x35,0x37,0x34,0x07,0x04,0x3b,0x3b,0x0a,0x2a,0xbc,0x01,0x7e,0x00,0x1f,0x00,0x0a,0x01,0x7e,0x00,0x15,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x17,0x39,0xed,0x01,0x2f,0x33,0x33,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x26,0x23,0x22,0x07,0x06,0x15,\r\n0x11,0x16,0x32,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x03,0xb5,0x23,0x41,0x56,0x39,0x39,0x04,0x0b,0x06,0x2a,0x47,0x42,0x41,0x23,0x22,0x43,\r\n0x48,0x4f,0x2f,0x77,0xc7,0x90,0x51,0x5b,0xa1,0xd9,0x7e,0x28,0x40,0x3a,0x38,0x1d,0x23,0x3c,0x3a,0x3c,0x24,0x5f,0x9e,0x74,0x41,0x24,0x41,0x5c,0x39,0x85,0x03,0x1d,0x74,0x49,0x1a,0x27,0x0e,0x02,0xd1,0x1b,0x50,0x50,0x8c,0xfe,0xaa,0x01,0x09,0x12,0x1b,0x13,0x88,0x10,0x17,0x11,0x08,0x5d,0xa8,0xef,0x93,0x9c,0x01,0x00,0xb7,0x65,\r\n0x05,0x09,0x0e,0x0a,0x96,0x11,0x16,0x0f,0x07,0x52,0x94,0xce,0x7c,0x59,0x9e,0x7f,0x5e,0x1b,0x02,0xcd,0xab,0x58,0x62,0x07,0x05,0x00,0x00,0x01,0x00,0x96,0xff,0x28,0x05,0xbc,0x04,0x93,0x00,0x2e,0x00,0x62,0xb1,0x23,0x1f,0xb8,0x01,0x84,0xb2,0x20,0x2b,0x11,0xb8,0x01,0x84,0x40,0x0d,0x16,0x15,0x20,0x12,0x00,0x01,0x12,0x01,0x12,\r\n0x01,0x06,0x20,0x05,0xb8,0x01,0x84,0xb2,0x06,0x0f,0x19,0xb8,0x01,0x7e,0x40,0x12,0x26,0x13,0x16,0x10,0x2b,0x04,0x26,0x20,0x2e,0x2e,0x2d,0x01,0x26,0x15,0x15,0x12,0x06,0x20,0x00,0x2f,0x33,0x33,0x33,0x2f,0x2f,0x33,0x33,0x33,0x2f,0x11,0x12,0x17,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,\r\n0x12,0x39,0x33,0xed,0x39,0x10,0xed,0x32,0x31,0x30,0x01,0x07,0x33,0x20,0x11,0x11,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x22,0x07,0x03,0x11,0x23,0x35,0x03,0x23,0x01,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x37,0x13,0x05,0x00,0x7a,0x03,0x01,0x33,0x95,0x0f,0x2e,0x51,\r\n0x41,0x07,0x0b,0x07,0xcc,0x94,0xde,0x8b,0x01,0x69,0xd3,0x39,0x56,0x37,0x1b,0x95,0x95,0x04,0x63,0xbd,0x2d,0x54,0x46,0x33,0x0c,0x39,0x56,0x90,0x04,0x93,0xde,0xfe,0x87,0xfd,0xc4,0x02,0x15,0x3f,0x6b,0x4e,0x2b,0x01,0xfe,0x8f,0xfe,0x3a,0xb9,0xfe,0x6f,0x02,0x8d,0x72,0x01,0x11,0x33,0x54,0x6a,0x36,0xfd,0xef,0x03,0xa0,0x93,0xa8,\r\n0x1b,0x32,0x47,0x2c,0x69,0x2f,0x01,0x06,0x00,0x05,0x00,0x20,0x00,0x00,0x04,0x91,0x05,0x13,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x29,0x00,0x31,0x00,0xa2,0x40,0x0f,0x2f,0x22,0x21,0x12,0x04,0x11,0x14,0x11,0x28,0x0e,0x09,0x09,0x0c,0x08,0x10,0xb8,0x01,0x83,0x40,0x0d,0x29,0x1c,0x1f,0x04,0x04,0x03,0x1d,0x05,0x28,0x03,0x2e,0x20,\r\n0x14,0xb8,0x01,0x84,0x40,0x0b,0x15,0x17,0x00,0x00,0x19,0x01,0x15,0x29,0x13,0x0f,0x17,0xb8,0x01,0x7e,0x40,0x09,0x18,0x20,0x1c,0x0c,0x18,0x23,0x1f,0x0b,0x1b,0xb8,0x01,0x7e,0x40,0x1c,0x00,0x2e,0x08,0x04,0x00,0x0f,0x00,0x1f,0x00,0x3f,0x00,0x4f,0x00,0x04,0x18,0x00,0x18,0x00,0x02,0x25,0x15,0x11,0x2b,0x06,0x7f,0x02,0x01,0x02,\r\n0x00,0x2f,0x71,0xc4,0x33,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x11,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x01,0x2f,0x33,0x33,0x33,0x2f,0x33,0x10,0xed,0x32,0x32,0x32,0x2f,0x33,0x33,0x12,0x17,0x39,0xed,0x32,0x32,0x32,0x2f,0x33,0x11,0x33,0x11,0x12,0x17,0x39,0x31,0x30,\r\n0x13,0x33,0x11,0x33,0x13,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x23,0x03,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x05,0x33,0x27,0x23,0x01,0x33,0x26,0x35,0x35,0x23,0x01,0x23,0x16,0x15,0x15,0x33,0x27,0x26,0x20,0x8a,0xb8,0xdb,0x01,0x3e,0x88,0x8e,0x8e,0x8e,0x8e,0xaf,0xed,0xfe,\r\n0xcc,0x89,0x8a,0x8a,0x8a,0x02,0x99,0xc2,0xff,0xfe,0xb7,0xf6,0x3e,0xb8,0x02,0x4b,0x03,0x06,0x85,0xfe,0x3b,0x04,0x06,0x79,0x57,0x19,0x03,0x55,0x01,0xbe,0xfe,0x42,0x01,0xbe,0xfe,0x42,0x7f,0x7c,0x7e,0xfe,0x24,0x01,0xdc,0xfe,0x24,0x01,0xdc,0x7e,0x7c,0x7c,0x7c,0x7c,0x7c,0xfd,0xf2,0x2d,0x91,0x56,0x02,0x79,0x2a,0x86,0x50,0xb0,\r\n0x32,0x00,0x00,0x03,0x00,0xaa,0xff,0xea,0x05,0xdb,0x05,0x13,0x00,0x16,0x00,0x21,0x00,0x54,0x00,0x79,0xb1,0x3a,0x4c,0xb8,0x01,0x84,0xb3,0x27,0x13,0x07,0x0e,0xbb,0x01,0x85,0x00,0x1e,0x00,0x42,0x01,0x84,0x40,0x0c,0x31,0x22,0x00,0x31,0x1e,0x31,0x1e,0x31,0x07,0x27,0x18,0x06,0xb8,0x01,0x85,0x40,0x09,0x07,0x13,0x18,0x9a,0x05,\r\n0x27,0x42,0x51,0x3d,0xb8,0x01,0x7e,0x40,0x0d,0x36,0x05,0x36,0x05,0x36,0x07,0x17,0x9a,0x7f,0x08,0x01,0x08,0x25,0xb8,0x01,0x7e,0xb4,0x51,0x51,0x01,0x07,0x18,0x00,0x3f,0x33,0x33,0x2f,0xed,0x2f,0x71,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x12,0x39,0x39,0x10,0xed,0x39,0x01,0x2f,0xed,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,\r\n0x33,0x33,0x10,0xed,0x10,0xed,0x11,0x39,0x10,0xed,0x32,0x31,0x30,0x21,0x23,0x03,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x16,0x17,0x01,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,\r\n0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0xa3,0xb5,0xa0,0x47,0x80,0x44,0x99,0x01,0x3f,0x55,0x90,0x67,0x3a,0x25,0x47,0x67,0x43,0x49,0x3c,0xfe,0x65,0x84,0x39,0x61,0x46,0x28,0x81,0x80,0x01,0xee,0x38,0x75,0x3d,0xa0,0x1a,0x2d,0x3a,0x1f,0x43,0x57,0x36,\r\n0x16,0x2a,0x4f,0x71,0x48,0x33,0x69,0x28,0x2e,0x64,0x37,0x20,0x38,0x27,0x16,0x14,0x27,0x37,0x20,0x3c,0x5b,0x3c,0x1e,0x1f,0x4a,0x77,0x58,0x3f,0x77,0x31,0x01,0x87,0xa2,0xfd,0xd7,0x05,0x13,0x2a,0x57,0x82,0x57,0x44,0x76,0x5d,0x41,0x0f,0x03,0x1b,0x7f,0x02,0xd4,0xfe,0x29,0x23,0x40,0x5d,0x3a,0x69,0x74,0xfc,0x32,0x26,0x2d,0x64,\r\n0x1c,0x28,0x1c,0x16,0x0b,0x15,0x30,0x3b,0x46,0x2a,0x31,0x53,0x3f,0x25,0x13,0x10,0x94,0x1d,0x1c,0x0d,0x19,0x25,0x16,0x1e,0x26,0x1b,0x14,0x0a,0x14,0x2b,0x38,0x49,0x31,0x2d,0x55,0x43,0x29,0x1b,0x18,0x00,0x00,0x07,0x00,0x12,0x00,0x00,0x05,0x53,0x05,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x33,0x00,0x3b,0x00,0x43,\r\n0x00,0x6a,0xb4,0x3b,0x33,0x05,0x01,0x09,0xb8,0x01,0x7e,0x40,0x0b,0x0a,0x28,0x24,0x20,0x1e,0x0a,0x2b,0x27,0x23,0x1d,0x0d,0xb8,0x01,0x7e,0x40,0x23,0x0e,0x40,0x1a,0x16,0x12,0x0e,0x0f,0x0e,0x1f,0x0e,0x3f,0x0e,0x4f,0x0e,0x04,0x0a,0x0e,0x0a,0x0e,0x07,0x3c,0x18,0x14,0x10,0x10,0x7f,0x14,0x01,0x14,0x37,0x36,0x2e,0x2e,0x03,0x07,\r\n0x00,0x2f,0x33,0x33,0x11,0x33,0x33,0x2f,0x71,0x33,0x2f,0x11,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x32,0x11,0x33,0x33,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x32,0x31,0x30,0x01,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x03,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x03,0x33,0x13,0x33,\r\n0x13,0x33,0x13,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x21,0x33,0x37,0x23,0x05,0x33,0x37,0x23,0x07,0x33,0x27,0x23,0x03,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x05,0x16,0x17,0x33,0x36,0x37,0x37,0x23,0x03,0x23,0x06,0x07,0x07,0x33,0x27,0x26,0x05,0x53,0xf4,0x5a,0x93,0x59,0xd2,0x59,0x92,0x5d,0xed,0xd3,0x17,0xbc,0xa2,0x56,\r\n0x82,0x51,0xf4,0x55,0x78,0x50,0xe9,0x4f,0x80,0x54,0xad,0xc5,0x17,0xdb,0xfc,0x0e,0x95,0x18,0xc4,0x02,0x27,0x8f,0x16,0xbc,0xf9,0xa1,0x16,0x74,0xe0,0x0c,0x02,0x04,0x03,0x0f,0x22,0x67,0x02,0x33,0x0a,0x04,0x02,0x03,0x0d,0x20,0x62,0xd4,0x02,0x04,0x0c,0x12,0x43,0x11,0x0c,0x01,0xde,0xfe,0x22,0x01,0xde,0xfe,0x22,0x01,0xde,0x7f,\r\n0x7b,0x80,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x80,0x7b,0x7b,0x7b,0x7b,0x7b,0x7b,0xfe,0x57,0x3f,0x44,0x30,0x53,0xaf,0xb7,0x33,0x46,0x2f,0x4e,0xb3,0x02,0x5c,0x43,0x40,0x5f,0x5d,0x3d,0x00,0x00,0x03,0x00,0x57,0xfe,0xf3,0x04,0x29,0x05,0x5d,0x00,0x1c,0x00,0x31,0x00,0x35,0x00,0x64,0xb4,0x14,0x14,0x01,\r\n0x33,0x28,0xb8,0x01,0x84,0xb4,0x0a,0x32,0x1b,0x19,0x00,0xb8,0x01,0x84,0xb4,0x1d,0x16,0x12,0x01,0x33,0xbb,0x01,0x7d,0x00,0x34,0x00,0x23,0x01,0x7e,0xb2,0x0f,0x1c,0x14,0xb8,0x01,0x7e,0x40,0x0c,0x15,0x19,0x15,0x02,0x12,0x0f,0x15,0x0f,0x15,0x05,0x18,0x2d,0xb8,0x01,0x7e,0xb3,0x05,0x18,0x01,0x18,0x00,0x3f,0x3f,0xed,0x2f,0x12,\r\n0x39,0x39,0x2f,0x2f,0x39,0x39,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x2f,0xed,0x01,0x2f,0x33,0x33,0x33,0xfd,0x32,0xc6,0xc6,0x2f,0xed,0xc4,0x12,0x39,0x2f,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x33,0x11,0x21,0x35,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x03,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x13,0x21,0x35,0x21,0x03,0xae,0x94,0x04,0x67,0xd8,0x62,0x91,0x5f,0x2e,0x35,0x6a,0xa0,0x6a,0xbc,0x5a,0x04,0xfe,0xd4,0x01,0x2c,0x94,0x7b,0x7b,0x94,0x28,0x46,0x60,0x39,0x4e,0x6f,0x46,0x21,0x20,0x43,0x68,0x49,0x40,0x68,0x4a,0x26,0x70,0xfc,0xfe,0x03,0x02,0x9e,0xb4,\r\n0x4b,0x7d,0xa9,0x5f,0x67,0xb8,0x8b,0x51,0x96,0x01,0x22,0x79,0xa3,0xa3,0x79,0xfd,0x62,0x89,0x38,0x62,0x49,0x29,0x3c,0x68,0x87,0x4c,0x44,0x7e,0x60,0x38,0x34,0x57,0x72,0xfd,0x8f,0x6c,0x00,0x01,0x00,0x26,0x00,0x00,0x03,0x9d,0x05,0x13,0x00,0x19,0x00,0x42,0xb6,0x18,0x19,0x16,0x03,0x00,0x0f,0x07,0xb8,0x01,0x85,0xb7,0x0c,0x0a,\r\n0x08,0x15,0x00,0x19,0x06,0x0a,0xb8,0x01,0x7e,0x40,0x0d,0x16,0x10,0x0f,0x0b,0x0b,0x01,0x14,0x7f,0x0e,0x01,0x0e,0x08,0x01,0x00,0x2f,0x33,0x2f,0x71,0x33,0x12,0x39,0x2f,0x33,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x33,0x2f,0xc6,0x33,0xed,0x32,0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x01,0x26,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,\r\n0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x21,0x15,0x21,0x03,0x9d,0xc6,0xfe,0x92,0x0f,0x0d,0x07,0x03,0x99,0x84,0x84,0x99,0x03,0x07,0x14,0x08,0x01,0x6f,0xb0,0xfe,0x61,0x01,0x4e,0xfe,0xb9,0x02,0x1c,0x18,0x18,0x0d,0xfd,0xa7,0x02,0x5f,0x80,0x02,0x34,0xfd,0xca,0x0d,0x1e,0x0b,0x02,0x00,0xfd,0xcc,0x80,0x00,0x01,\r\n0x00,0x25,0x00,0x00,0x03,0x1a,0x05,0x13,0x00,0x17,0x00,0x5e,0xb9,0x00,0x06,0x01,0x84,0x40,0x2c,0x07,0x15,0x11,0x9a,0x12,0x02,0x0b,0x03,0x0a,0x0a,0x09,0x0f,0x16,0x0e,0x17,0x0e,0x0d,0x08,0x05,0x09,0x04,0x04,0x03,0x0c,0x01,0x0d,0x00,0x00,0x17,0x09,0x0d,0x03,0x17,0x17,0x03,0x0d,0x09,0x04,0x07,0x7f,0x12,0x01,0x12,0x07,0x00,\r\n0x2f,0x2f,0x71,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x01,0x2f,0xed,0x31,0x30,0x01,0x07,0x15,0x37,0x15,0x07,0x11,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,0x21,0x35,0x21,0x15,0x21,\r\n0x11,0x37,0x02,0xbf,0xd4,0xd4,0xd4,0x98,0xd9,0xd9,0xd9,0xd9,0xfe,0xd2,0x02,0xf5,0xfe,0xd1,0xd4,0x03,0x5c,0x79,0xb9,0x79,0x81,0x78,0xfe,0x56,0x01,0x53,0x7a,0x80,0x7a,0xb9,0x7a,0x81,0x7a,0x01,0x7c,0x8a,0x8a,0xfe,0xdb,0x78,0x00,0x05,0x00,0x28,0xfe,0xbf,0x08,0x0c,0x05,0xdb,0x00,0x3a,0x00,0x53,0x00,0x6a,0x00,0x7e,0x00,0x8e,\r\n0x00,0x98,0x40,0x09,0x8c,0x3e,0x0c,0x1e,0x4f,0x36,0x2f,0x24,0x00,0xb8,0x01,0x85,0x40,0x11,0x4a,0x68,0x54,0x6b,0x2a,0x1e,0x24,0x4a,0x6b,0x6b,0x4a,0x24,0x1e,0x2a,0x05,0x14,0x5e,0xbb,0x01,0x83,0x00,0x75,0x00,0x84,0x01,0x82,0x40,0x29,0x14,0x6a,0x24,0x4f,0x4f,0x36,0x0c,0x8c,0x07,0x7f,0x7f,0x3e,0x1e,0x43,0x19,0x68,0x63,0x7a,\r\n0x59,0x19,0x59,0x29,0x29,0x59,0x19,0x03,0x0f,0x36,0x32,0x32,0x2f,0x36,0x43,0x89,0x89,0x0f,0x70,0x63,0x63,0x07,0x0f,0x00,0x2f,0x33,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x2f,0x33,0x33,0x2f,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x12,0x39,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x2f,0x01,0x2f,\r\n0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x33,0x33,0x11,0x33,0x33,0x33,0x31,0x30,0x01,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x37,0x36,0x36,0x37,0x0e,0x03,0x07,0x27,0x3e,0x03,0x37,0x36,\r\n0x36,0x37,0x17,0x06,0x06,0x07,0x1e,0x03,0x05,0x06,0x02,0x07,0x1e,0x03,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x03,0x23,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0x22,0x0e,0x02,0x15,\r\n0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x26,0x26,0x05,0xe7,0x20,0x45,0x6d,0x9a,0xca,0x7f,0x35,0x5d,0x4f,0x45,0x1f,0x3c,0x86,0x4d,0x2a,0x43,0x2f,0x1a,0x20,0x34,0x44,0x24,0x23,0x3d,0x38,0x34,0x1a,0x30,0x50,0x23,0x21,0x55,0x37,0x52,0x8c,0x7d,0x72,0x37,0x2f,0x3f,0x90,0xa1,0xb0,0x5e,0x3d,0x91,0x58,0x32,0x40,0x62,0x28,0x7d,0xbc,\r\n0x7d,0x3e,0xfd,0x1c,0x2d,0x69,0x40,0x1b,0x39,0x42,0x48,0x2a,0x5f,0x98,0x76,0x55,0x37,0x1b,0x36,0x67,0x99,0x63,0x18,0x2d,0x29,0x29,0x02,0xa9,0x0e,0x29,0x4a,0x74,0x58,0x38,0x5c,0x43,0x26,0x28,0x4d,0x6f,0x48,0x1e,0x39,0x31,0x27,0x0b,0x7d,0x94,0x01,0x43,0x10,0x21,0x34,0x23,0x28,0x3e,0x2a,0x16,0x12,0x21,0x31,0x1d,0x30,0x43,\r\n0x28,0x12,0xfa,0x8c,0x13,0x23,0x1b,0x11,0x11,0x19,0x22,0x10,0x34,0x59,0x28,0x2d,0x53,0x02,0xee,0x50,0xae,0xa7,0x95,0x71,0x42,0x12,0x1f,0x29,0x15,0x39,0x36,0x19,0x2e,0x41,0x27,0x2b,0x43,0x2d,0x17,0x0e,0x1a,0x21,0x13,0x56,0xf4,0x9b,0x99,0xe1,0x55,0x0a,0x30,0x42,0x4f,0x29,0x48,0x33,0x5f,0x4a,0x2f,0x02,0x42,0x5c,0x22,0x3b,\r\n0x1c,0x43,0x2b,0x0e,0x56,0x8c,0xc0,0xa1,0xb1,0xfe,0xff,0x57,0x13,0x21,0x19,0x0e,0x39,0x61,0x81,0x8d,0x92,0x43,0x6c,0xa9,0x79,0x46,0x09,0x29,0x67,0x7b,0x94,0xfd,0xf1,0x31,0x69,0x57,0x39,0x21,0x41,0x5e,0x3d,0x41,0x73,0x56,0x31,0x0f,0x1c,0x28,0x18,0xfe,0x55,0x02,0x40,0x1d,0x38,0x2b,0x1a,0x22,0x39,0x49,0x27,0x25,0x3c,0x2c,\r\n0x17,0x2c,0x40,0x4b,0x13,0x0c,0x17,0x21,0x14,0x16,0x23,0x17,0x0d,0x31,0x30,0x23,0x31,0x00,0x00,0x02,0x00,0x2b,0xfe,0x7a,0x03,0x18,0x05,0x54,0x00,0x3c,0x00,0x4e,0x00,0x5e,0xb9,0x00,0x02,0x01,0x82,0xb2,0x3b,0x28,0x47,0xb8,0x01,0x83,0xb3,0x0c,0x4a,0x35,0x1b,0xbb,0x01,0x82,0x00,0x07,0x00,0x16,0x01,0x82,0x40,0x1a,0x3d,0x3b,\r\n0x0c,0x07,0x3d,0x3d,0x07,0x0c,0x3b,0x04,0x00,0x20,0x8a,0x30,0x00,0x25,0x4a,0x1b,0x07,0x35,0x01,0x02,0x3b,0x07,0x00,0x42,0xb8,0x01,0x7d,0xb2,0x11,0x3a,0x00,0x00,0x2f,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x01,0x2f,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0xcd,0x32,0x10,0xfd,0xc4,0x10,0xed,0x31,0x30,\r\n0x33,0x13,0x13,0x36,0x37,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x26,0x36,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x27,0x06,0x06,0x07,0x06,0x07,0x03,0x07,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x3e,0x03,\r\n0x2b,0xe7,0x44,0x10,0x11,0x0f,0x25,0x14,0x23,0x43,0x34,0x20,0x1d,0x35,0x4c,0x30,0x2b,0x40,0x2b,0x15,0x0f,0x1a,0x22,0x14,0x2a,0x59,0x49,0x2d,0x38,0x64,0x88,0x4f,0x0a,0x0a,0x01,0x08,0x0b,0x21,0x49,0x3d,0x28,0x15,0x25,0x30,0x1b,0x20,0x40,0x1a,0x1d,0x1c,0x5a,0x59,0x01,0xa2,0x0d,0x17,0x1e,0x13,0x0f,0x1e,0x17,0x0d,0x3b,0x2d,\r\n0x0d,0x16,0x11,0x0a,0x01,0xf0,0xfe,0xfe,0x32,0x3a,0x32,0x82,0x4a,0x44,0x80,0x7e,0x7d,0x41,0x39,0x5d,0x42,0x24,0x1f,0x3a,0x53,0x32,0x1f,0x5f,0x79,0x8a,0x4b,0x4c,0x9d,0xaa,0xbb,0x69,0x48,0x88,0x69,0x40,0x0b,0x08,0x06,0x0e,0x03,0x08,0x36,0x51,0x6d,0x40,0x4e,0x90,0x85,0x7b,0x3a,0x72,0xd1,0x52,0x60,0x55,0x01,0x31,0xdf,0x04,\r\n0x6c,0x2b,0x3b,0x24,0x10,0x12,0x25,0x3b,0x2a,0x5e,0xad,0x57,0x36,0x66,0x5d,0x4e,0x00,0x04,0x00,0x22,0x00,0x00,0x04,0x20,0x05,0x13,0x00,0x1f,0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x7f,0xb3,0x30,0x2b,0x2d,0x0c,0xb8,0x01,0x85,0xb6,0x20,0x00,0x1c,0x2d,0x2f,0x24,0x19,0xb8,0x01,0x85,0x40,0x09,0x1e,0x02,0x1a,0x18,0x9a,0x2d,0x2c,\r\n0x12,0x1c,0xb8,0x01,0x7e,0xb6,0x1d,0x24,0x0f,0x1d,0x23,0x0a,0x00,0xb8,0x01,0x7e,0x40,0x21,0x01,0x2f,0x07,0x01,0x50,0x2d,0x01,0x50,0x1d,0x01,0x1d,0x40,0x09,0x0d,0x48,0x20,0x01,0x01,0x2d,0x1d,0x01,0x01,0x1d,0x2d,0x03,0x03,0x1a,0x2e,0x9a,0x7f,0x03,0x01,0x03,0x00,0x2f,0x71,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x2b,\r\n0x5d,0x5d,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x10,0xed,0x01,0x2f,0x33,0x33,0xed,0x32,0x32,0x32,0xc6,0x32,0x2f,0xed,0x12,0x39,0x39,0x31,0x30,0x13,0x35,0x33,0x35,0x21,0x32,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x23,0x0e,0x03,0x23,0x23,0x11,0x23,0x11,0x23,0x35,0x33,\r\n0x35,0x05,0x34,0x27,0x21,0x15,0x21,0x36,0x36,0x01,0x32,0x36,0x37,0x21,0x15,0x11,0x15,0x21,0x26,0x26,0x23,0x22,0x88,0x01,0x59,0x91,0xc7,0x2a,0x9b,0x82,0x03,0x03,0x02,0x84,0xa5,0x19,0x50,0x69,0x7f,0x49,0x9e,0x99,0x88,0x88,0x02,0x57,0x03,0xfe,0x45,0x01,0xba,0x01,0x03,0xfe,0xd8,0x5d,0x7b,0x22,0xfe,0x70,0x01,0x94,0x20,0x73,\r\n0x5b,0x03,0x9d,0x80,0xf6,0x7e,0x78,0x80,0x18,0x1a,0x13,0x24,0x12,0x7f,0x3c,0x5f,0x42,0x23,0xfe,0x5d,0x02,0xa3,0x7f,0x7b,0x39,0x1e,0x1b,0x7b,0x0f,0x21,0xfe,0xda,0x3f,0x38,0x77,0x02,0x5d,0x6c,0x33,0x39,0x00,0x03,0x00,0x4c,0xff,0x43,0x03,0x93,0x05,0xb8,0x00,0x1c,0x00,0x27,0x00,0x2e,0x00,0x65,0x40,0x1a,0x1c,0x2e,0x2d,0x17,\r\n0x16,0x0f,0x06,0x0e,0x00,0x00,0x02,0x22,0x23,0x0c,0x04,0x0d,0x01,0x0d,0x13,0x0e,0x01,0x0e,0x01,0x0e,0x07,0x19,0xbe,0x01,0x84,0x00,0x2b,0x00,0x1d,0x01,0x84,0x00,0x07,0x00,0x2d,0x01,0x7e,0xb4,0x17,0x17,0x0f,0x22,0x28,0xb8,0x01,0x7e,0xb4,0x02,0x1b,0x18,0x23,0x16,0xb8,0x01,0x7e,0xb1,0x0c,0x0f,0x00,0x2f,0x33,0xed,0x32,0x3f,\r\n0x33,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x39,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x31,0x30,0x05,0x23,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x37,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x26,0x27,0x03,0x21,0x11,0x06,0x23,0x23,0x01,0x14,0x1e,0x02,0x17,0x13,0x0e,\r\n0x03,0x01,0x32,0x36,0x37,0x11,0x23,0x03,0x02,0x04,0x63,0x11,0x5b,0x87,0x58,0x2c,0x3d,0x76,0xaf,0x73,0x10,0x63,0x10,0x4a,0x80,0x34,0x37,0x87,0x4b,0x29,0x01,0x43,0xa8,0xcb,0x0b,0xfe,0xcf,0x19,0x33,0x53,0x3b,0x59,0x4e,0x73,0x4d,0x25,0x01,0x46,0x3c,0x72,0x2c,0xc0,0x24,0xbd,0xcc,0x13,0x64,0x9e,0xd3,0x81,0x96,0xee,0xaa,0x5f,\r\n0x07,0xac,0xac,0x05,0x21,0x1d,0xa0,0x2b,0x30,0x06,0xfe,0x1c,0xfd,0xce,0x6f,0x02,0x7e,0x65,0xa6,0x7d,0x53,0x13,0x03,0xf4,0x09,0x51,0x87,0xb6,0xfd,0x93,0x1e,0x1f,0x01,0x63,0xfe,0x60,0x00,0x03,0x00,0x0b,0x00,0x00,0x03,0xdd,0x05,0x13,0x00,0x17,0x00,0x1b,0x00,0x23,0x00,0x45,0xb6,0x1c,0x1d,0x1d,0x15,0x0a,0x06,0x0e,0xb8,0x01,\r\n0x7e,0xb6,0x0f,0x18,0x03,0x0f,0x1b,0x02,0x12,0xb8,0x01,0x7e,0x40,0x0f,0x13,0x20,0x17,0x13,0x0f,0x13,0x0f,0x13,0x08,0x7f,0x15,0x01,0x15,0x0c,0x08,0x00,0x2f,0x33,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x23,0x17,0x33,\r\n0x15,0x23,0x13,0x23,0x03,0x21,0x03,0x23,0x13,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x13,0x01,0x21,0x27,0x21,0x13,0x23,0x06,0x07,0x03,0x33,0x03,0x26,0x03,0xc8,0xba,0x34,0x86,0x5f,0x74,0xa8,0x6b,0xfe,0x52,0x68,0xa9,0x73,0x5d,0x85,0x33,0xb8,0xe0,0xa4,0x9d,0xa4,0xfe,0x5a,0x01,0x65,0x2f,0xfe,0xf8,0x84,0x02,0x08,0x0a,\r\n0x4b,0xbe,0x4d,0x09,0x03,0x0e,0x80,0xa2,0x80,0xfe,0x94,0x01,0x6c,0xfe,0x94,0x01,0x6c,0x80,0xa2,0x80,0x02,0x05,0xfd,0xfb,0xfe,0xde,0xa2,0x01,0xde,0x37,0x1f,0xfe,0xf8,0x01,0x08,0x1b,0x00,0x01,0x00,0x5f,0xff,0xea,0x03,0x85,0x05,0x29,0x00,0x47,0x00,0x5c,0xb3,0x3c,0x21,0x16,0x44,0xbb,0x01,0x85,0x00,0x35,0x00,0x0e,0x01,0x85,\r\n0xb2,0x21,0x09,0x26,0xb8,0x01,0x7d,0xb4,0x27,0x06,0x27,0x01,0x2f,0xb8,0x01,0x7d,0x40,0x1b,0x30,0x46,0x30,0x20,0x27,0x01,0x0f,0x27,0x1f,0x27,0x02,0x3f,0x30,0x4f,0x30,0x02,0x27,0x30,0x27,0x30,0x11,0x3a,0x9a,0x3f,0x11,0x9a,0x1c,0x00,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,\r\n0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x32,0x11,0x39,0x31,0x30,0x01,0x23,0x07,0x06,0x07,0x06,0x07,0x21,0x15,0x21,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x36,0x37,0x23,0x35,0x33,0x36,0x37,0x36,0x37,0x36,0x37,0x21,0x35,0x21,0x36,0x37,0x36,0x35,\r\n0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x03,0x85,0x65,0x04,0x2b,0x3b,0x2f,0x35,0x01,0x33,0xfe,0x15,0x21,0x1a,0x29,0x2e,0x8a,0x8d,0x28,0x60,0x60,0x56,0x1f,0x1a,0x54,0x5e,0x5b,0x1f,0x5c,0xa7,0x80,0x4b,0x1b,0x11,0x17,0x4c,0xb4,0x14,0x15,0x3f,0x45,0x2a,0x24,0xfe,0x51,0x02,0x44,0x17,\r\n0x0d,0x13,0x31,0x4e,0x63,0x32,0xb4,0x73,0x57,0xc1,0x54,0xa2,0x7f,0x4e,0x18,0x23,0x02,0xf3,0x04,0x2b,0x23,0x1c,0x1c,0x61,0x14,0x15,0x1f,0x4e,0x35,0x62,0x68,0x10,0x1e,0x2c,0x1b,0xb3,0x12,0x1c,0x13,0x0a,0x25,0x54,0x85,0x60,0x48,0x39,0x21,0x1e,0x61,0x0e,0x0c,0x26,0x23,0x15,0x12,0x61,0x16,0x1b,0x25,0x32,0x35,0x4a,0x2f,0x15,\r\n0x4f,0xab,0x2e,0x2a,0x55,0x83,0x59,0x46,0x34,0x00,0x00,0x02,0x00,0x4e,0xff,0x43,0x03,0x88,0x05,0xb8,0x00,0x18,0x00,0x21,0x00,0x38,0xb2,0x16,0x10,0x03,0xb8,0x01,0x82,0xb5,0x1f,0x0d,0x04,0x04,0x00,0x1b,0xb8,0x01,0x84,0x40,0x0d,0x09,0x13,0x00,0x20,0x15,0x9a,0x0d,0x10,0x1f,0x16,0x9a,0x05,0x02,0x00,0x2f,0x33,0xed,0x32,0x2f,\r\n0x33,0xed,0x32,0x01,0x2f,0x33,0x2f,0xed,0x12,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x31,0x30,0x25,0x06,0x07,0x15,0x23,0x35,0x26,0x27,0x26,0x11,0x10,0x37,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x15,0x26,0x27,0x11,0x36,0x37,0x01,0x06,0x15,0x14,0x17,0x16,0x17,0x11,0x06,0x03,0x88,0x68,0x97,0x5f,0xd0,0x80,0x8c,0x9e,0x81,0xbd,0x5f,\r\n0x9c,0x63,0x71,0x8e,0x94,0x6b,0xfd,0xd1,0x73,0x6c,0x56,0x82,0x7d,0x36,0x41,0x09,0xa9,0xa9,0x0f,0xa2,0xb2,0x01,0x22,0x01,0x38,0xc0,0x9d,0x1c,0x96,0x8f,0x01,0x35,0xa2,0x4d,0x01,0xfb,0xd4,0x06,0x51,0x03,0x40,0x96,0xfa,0xed,0x8e,0x70,0x17,0x04,0x1c,0x1c,0x00,0x05,0x00,0xaa,0xff,0x43,0x03,0x8c,0x05,0xb8,0x00,0x17,0x00,0x1e,\r\n0x00,0x22,0x00,0x26,0x00,0x2d,0x00,0x76,0xb6,0x0c,0x10,0x1d,0x1d,0x2c,0x05,0x15,0xb8,0x01,0x82,0xb4,0x16,0x25,0x02,0x16,0x09,0xb8,0x01,0x85,0x40,0x0a,0x29,0x16,0x21,0x29,0x29,0x21,0x16,0x03,0x00,0x10,0xb8,0x01,0x85,0xb2,0x1a,0x24,0x20,0xb8,0x01,0x85,0x40,0x1c,0xa0,0x00,0xb0,0x00,0x02,0x00,0x0d,0x1c,0x1f,0x9a,0x2c,0x24,\r\n0x24,0x01,0x1d,0x20,0x9a,0x17,0x14,0x04,0x2b,0x23,0x9a,0x05,0x7f,0x01,0x01,0x01,0x00,0x2f,0x71,0x33,0xed,0x32,0x2f,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x39,0x01,0x2f,0x5d,0xed,0x32,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x32,0x11,0x12,0x39,0x31,0x30,0x33,0x11,\r\n0x21,0x35,0x33,0x15,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x07,0x06,0x07,0x15,0x23,0x35,0x37,0x36,0x35,0x34,0x27,0x11,0x36,0x01,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x13,0x36,0x35,0x34,0x27,0x11,0x36,0xaa,0x01,0x1d,0x5e,0x85,0x53,0x5c,0x78,0x69,0x7d,0x97,0x6f,0x63,0x95,0x5e,0xe5,0x40,0xc7,0x53,0xfe,\r\n0xcb,0x84,0x84,0x84,0xb3,0x40,0x95,0x32,0x05,0x13,0xa5,0xa6,0x08,0x49,0x53,0x84,0x6e,0xa4,0x22,0x04,0x0f,0xa8,0x86,0xa6,0x68,0x5e,0x08,0xbe,0xbd,0xc9,0x40,0x6e,0xc4,0x1d,0xfe,0x34,0x0a,0x01,0xc7,0xfe,0x2d,0x01,0xd3,0x02,0x2c,0xfe,0x5d,0x01,0xa3,0xfe,0x99,0x3d,0x6d,0x9b,0x1c,0xfe,0x6f,0x0e,0x00,0x05,0x00,0x8c,0xfe,0x2f,\r\n0x0a,0x0a,0x05,0x5d,0x00,0x1d,0x00,0x37,0x00,0x52,0x00,0x56,0x00,0x5a,0x00,0x95,0xbc,0x00,0x10,0x05,0x0a,0x00,0x0d,0x00,0x33,0x05,0x0a,0x40,0x09,0x30,0x30,0x53,0x89,0x54,0x57,0x89,0x58,0x24,0xb8,0x05,0x0a,0x40,0x0e,0x21,0x0d,0x54,0x58,0x21,0x52,0x52,0x21,0x58,0x54,0x0d,0x05,0x1a,0x4a,0xb8,0x05,0x0a,0xb2,0x3f,0x00,0x03,\r\n0xb8,0x05,0x0a,0x40,0x0a,0x1a,0x1d,0x44,0x22,0x22,0x44,0x1d,0x03,0x0f,0x3a,0xb8,0x04,0xfb,0xb4,0x2f,0x4f,0x01,0x4f,0x1e,0xb8,0x04,0xfb,0xb6,0x2f,0x29,0x01,0x29,0x59,0x55,0x08,0xb8,0x04,0xfb,0x40,0x0b,0x58,0x54,0x2f,0x15,0x01,0x15,0x31,0x2f,0x0f,0x01,0x0f,0x00,0x2f,0x5d,0x33,0x2f,0x5d,0x33,0x33,0xed,0x32,0x32,0x2f,0x5d,\r\n0xed,0x2f,0x5d,0xed,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x01,0x2f,0xfd,0xc6,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x33,0x10,0xed,0x10,0xed,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,\r\n0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x25,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x2f,0x0a,0x0a,0x20,0x47,0x71,0x51,0x5d,0x85,0x55,0x27,0x8d,0x33,\r\n0x75,0xc0,0x8e,0x7a,0xa5,0x63,0x2b,0x0c,0x0d,0x05,0xf7,0x55,0x52,0x8d,0x31,0x56,0x73,0x40,0x3e,0x5b,0x41,0x29,0x18,0x09,0x8e,0x08,0x20,0x3e,0x01,0x45,0x71,0x50,0x4d,0x69,0x3f,0x1b,0x11,0x1c,0x25,0x14,0x92,0x17,0x24,0x1a,0x0d,0x3d,0x6e,0x97,0x59,0x2e,0x62,0x34,0xfe,0x72,0xa8,0xa8,0x01,0x23,0xa7,0xa7,0x01,0x7e,0x41,0x6e,\r\n0x32,0x56,0x78,0x49,0x21,0x2c,0x64,0xa2,0x75,0x04,0x51,0xfb,0x9d,0x82,0xce,0x90,0x4e,0x3e,0x74,0xa5,0x68,0x39,0x76,0x44,0xfb,0x5f,0x65,0x01,0x7e,0xfe,0x7c,0x61,0x83,0x4f,0x22,0x1e,0x34,0x44,0x4f,0x55,0x2a,0x04,0x0d,0xfc,0x29,0x3a,0x60,0x43,0x26,0xfe,0x6a,0x23,0x37,0x62,0x85,0x4d,0x44,0x81,0x7b,0x77,0x39,0x3b,0x81,0x81,\r\n0x7e,0x38,0x7d,0xc0,0x83,0x43,0x14,0x15,0x6e,0xa4,0xa4,0xa4,0x00,0x03,0x00,0x6e,0xff,0xee,0x06,0x34,0x05,0x27,0x00,0x09,0x00,0x0d,0x00,0x2e,0x00,0x82,0xb9,0x00,0x1b,0x01,0x82,0x40,0x09,0x27,0x18,0x1f,0x03,0x0f,0x25,0x25,0x0f,0x2a,0xb8,0x01,0x83,0x40,0x0b,0x14,0x0a,0x0f,0x0c,0x0c,0x0f,0x0a,0x03,0x03,0x14,0x08,0xb8,0x01,\r\n0x82,0xb7,0x03,0x04,0x99,0x07,0x07,0x0d,0x08,0x02,0xb8,0x01,0x7d,0xb2,0x01,0x27,0x17,0xb8,0x01,0x7d,0xb3,0x18,0x18,0x11,0x1d,0xb8,0x01,0x7d,0x40,0x0b,0x22,0x01,0x22,0x01,0x22,0x0c,0x7f,0x0d,0x01,0x0d,0x11,0xb8,0x01,0x7d,0xb3,0x2d,0x2d,0x0c,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x12,\r\n0x39,0x2f,0xed,0x39,0x10,0xed,0x32,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x21,0x35,0x33,0x11,0x07,0x35,0x25,0x11,0x33,0x01,0x01,0x23,0x01,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,\r\n0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x3d,0xfe,0x38,0xa7,0xae,0x01,0x24,0xab,0x02,0xef,0xfc,0xf6,0x82,0x03,0x0a,0x51,0x5d,0x67,0x49,0x53,0xc6,0x4d,0x49,0xb2,0x82,0x55,0x54,0x4f,0x72,0x67,0x79,0x83,0xa0,0x9a,0x80,0x7d,0x02,0x11,0x66,0x02,0x1a,0x32,0x71,0x57,0xfd,0x50,0x02,0x9c,\r\n0xfa,0xed,0x05,0x13,0xfb,0x0b,0x81,0x45,0x44,0x3a,0x7f,0x6b,0x7a,0x6b,0x3e,0x7e,0x2e,0x6c,0x57,0x88,0x31,0x04,0x26,0x91,0x6a,0x86,0x00,0x03,0x00,0x80,0xff,0xee,0x06,0x32,0x05,0x25,0x00,0x16,0x00,0x1a,0x00,0x3b,0x00,0x9c,0xb9,0x00,0x28,0x01,0x82,0x40,0x09,0x2c,0x24,0x35,0x03,0x1b,0x32,0x32,0x1b,0x37,0xbb,0x01,0x83,0x00,\r\n0x21,0x00,0x11,0x01,0x83,0x40,0x13,0x06,0x0b,0x01,0x19,0x00,0x06,0x1b,0x19,0x06,0x1b,0x17,0x17,0x1b,0x06,0x19,0x04,0x01,0x21,0x15,0xbb,0x01,0x84,0x00,0x01,0x00,0x09,0x01,0x7d,0xb4,0x0e,0x0e,0x1a,0x34,0x24,0xb8,0x01,0x7d,0xb3,0x25,0x25,0x1e,0x2a,0xb8,0x01,0x7d,0xb2,0x2f,0x02,0x15,0xb8,0x01,0x7d,0x40,0x0b,0x01,0x2f,0x01,\r\n0x2f,0x01,0x19,0x7f,0x1a,0x01,0x1a,0x1e,0xb8,0x01,0x7d,0xb3,0x3a,0x3a,0x19,0x18,0x00,0x3f,0x33,0x2f,0xed,0x2f,0x71,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x32,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,0x11,0x33,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,\r\n0x39,0x2f,0x12,0x17,0x39,0xed,0x31,0x30,0x01,0x21,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x15,0x21,0x01,0x01,0x23,0x01,0x03,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x15,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x02,0x76,0xfe,0x0a,0xd9,0x5e,0x33,0x45,0x38,0x6b,0x59,0x4d,0x88,0x6b,0x7d,0xb9,0x95,0x01,0x5e,0x02,0xb4,0xfc,0xf7,0x83,0x03,0x0a,0x51,0x5d,0x67,0x49,0x53,0xc6,0x4c,0x48,0xb3,0x83,0x55,0x53,0x4e,0x73,0x66,0x79,0x83,0xa0,0x9a,0x80,0x7c,0x02,0x11,0x67,0xd6,0x5d,0x62,0x32,0x35,0x42,0x5d,0x87,0x45,0x77,\r\n0x62,0x8b,0xb0,0x8e,0x03,0x02,0x93,0xfa,0xed,0x05,0x13,0xfb,0x0b,0x81,0x45,0x44,0x3a,0x7f,0x6b,0x7a,0x6b,0x3e,0x7e,0x2e,0x6c,0x57,0x88,0x31,0x04,0x26,0x91,0x6a,0x86,0x00,0x00,0x02,0x00,0xb2,0x04,0x37,0x02,0xbc,0x06,0x1f,0x00,0x03,0x00,0x07,0x00,0x1f,0xbc,0x00,0x05,0x01,0x85,0x00,0x06,0x00,0x01,0x01,0x85,0xb5,0x02,0x06,\r\n0x02,0x02,0x07,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x51,0x9f,0x02,0x0a,0x9f,0x06,0x1f,0xfe,0x18,0x01,0xe8,0xfe,0x18,0x01,0xe8,0x00,0x00,0x01,0x00,0xb2,0x04,0x37,0x01,0x51,0x06,0x1f,0x00,0x03,0x00,0x13,0xb9,0x00,0x01,0x01,0x85,0xb3,0x02,0x02,\r\n0x02,0x00,0x00,0x2f,0x32,0x2f,0x01,0x2f,0xed,0x31,0x30,0x01,0x11,0x23,0x11,0x01,0x51,0x9f,0x06,0x1f,0xfe,0x18,0x01,0xe8,0x00,0x01,0x00,0x53,0x03,0x1d,0x03,0x55,0x06,0x1f,0x00,0x0e,0x00,0x0f,0xb4,0x0c,0x0b,0x03,0x03,0x0c,0x00,0x2f,0x33,0x2f,0x01,0x2f,0xcd,0x31,0x30,0x01,0x05,0x13,0x07,0x03,0x03,0x27,0x13,0x25,0x37,0x05,\r\n0x03,0x33,0x03,0x25,0x03,0x55,0xfe,0xd4,0xd0,0x79,0xaa,0xad,0x78,0xd0,0xfe,0xd2,0x31,0x01,0x1f,0x1a,0x97,0x19,0x01,0x20,0x04,0xb7,0x3e,0xfe,0xf7,0x53,0x01,0x21,0xfe,0xdf,0x53,0x01,0x09,0x3e,0x88,0x6c,0x01,0x4c,0xfe,0xb4,0x6c,0x00,0x00,0x01,0x00,0x2b,0xfe,0xdf,0x01,0x59,0x00,0xf9,0x00,0x03,0x00,0x0f,0xb4,0x02,0x00,0x02,\r\n0x02,0x00,0x00,0x2f,0x32,0x2f,0x01,0x2f,0x2f,0x31,0x30,0x25,0x03,0x23,0x13,0x01,0x59,0xae,0x80,0x80,0xf9,0xfd,0xe6,0x02,0x1a,0x00,0x00,0x01,0x00,0xa6,0x02,0x49,0x03,0x1e,0x02,0xde,0x00,0x03,0x00,0x0e,0xb4,0x01,0x00,0x01,0x99,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0x1e,0xfd,0x88,0x02,0x78,\r\n0x02,0x49,0x95,0x00,0x00,0x01,0x00,0x7a,0xff,0xe8,0x01,0x6f,0x00,0xde,0x00,0x0b,0x00,0x0d,0xb3,0x09,0x03,0x06,0x00,0x00,0x2f,0x32,0x01,0x2f,0xcd,0x31,0x30,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xf4,0x33,0x47,0x47,0x33,0x33,0x48,0x48,0x18,0x48,0x32,0x33,0x49,0x49,0x33,0x32,0x48,0x00,0x02,0x00,0x7a,\r\n0xff,0xe8,0x01,0x6f,0x04,0x77,0x00,0x0b,0x00,0x17,0x00,0x15,0xb7,0x15,0x09,0x0f,0x03,0x12,0x0c,0x00,0x06,0x00,0x2f,0x33,0x2f,0x33,0x01,0x2f,0x33,0xcd,0x32,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xf4,0x33,0x47,0x47,0x33,0x33,0x48,\r\n0x48,0x33,0x33,0x47,0x47,0x33,0x33,0x48,0x48,0x03,0x85,0x48,0x32,0x32,0x46,0x46,0x32,0x32,0x48,0xfc,0x63,0x48,0x32,0x33,0x49,0x49,0x33,0x32,0x48,0x00,0x00,0x02,0x00,0x2b,0xfe,0xdf,0x01,0x71,0x04,0x77,0x00,0x0b,0x00,0x0f,0x00,0x1a,0x40,0x0a,0x0c,0x0c,0x0e,0x09,0x03,0x0e,0x0e,0x0f,0x00,0x06,0x00,0x2f,0x33,0x2f,0x33,0x2f,\r\n0x01,0x2f,0xcd,0x2f,0x39,0x2f,0x31,0x30,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x03,0x23,0x13,0xf7,0x33,0x47,0x47,0x33,0x32,0x48,0x48,0x30,0xae,0x80,0x80,0x03,0x85,0x48,0x32,0x32,0x46,0x46,0x32,0x32,0x48,0xfd,0x74,0xfd,0xe6,0x02,0x1a,0x00,0x01,0x00,0x00,0xfe,0xa9,0x03,0xd7,0xff,0x32,0x00,0x03,\r\n0x00,0x0e,0xb4,0x01,0x00,0x01,0x9a,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x03,0xd7,0xfc,0x29,0x03,0xd7,0xfe,0xa9,0x89,0x00,0x00,0x02,0x00,0x6a,0x00,0xe7,0x04,0x48,0x03,0xf9,0x00,0x05,0x00,0x0b,0x00,0x09,0xb1,0x05,0x0b,0x00,0x19,0x2f,0x33,0x31,0x30,0x25,0x23,0x01,0x01,0x33,0x01,0x03,0x23,0x01,\r\n0x01,0x33,0x01,0x04,0x46,0xc3,0xfe,0xa7,0x01,0x59,0xc5,0xfe,0x9d,0x61,0xc0,0xfe,0xa6,0x01,0x5a,0xc0,0xfe,0xa2,0xe7,0x01,0x85,0x01,0x8d,0xfe,0x73,0xfe,0x7b,0x01,0x85,0x01,0x8d,0xfe,0x73,0x00,0x00,0x02,0x00,0x68,0x00,0xe7,0x04,0x48,0x03,0xf9,0x00,0x05,0x00,0x0b,0x00,0x09,0xb1,0x03,0x09,0x00,0x19,0x2f,0x33,0x31,0x30,0x01,\r\n0x01,0x23,0x01,0x01,0x33,0x03,0x01,0x23,0x01,0x01,0x33,0x04,0x48,0xfe,0xa4,0xbf,0x01,0x5d,0xfe,0xa3,0xbf,0x66,0xfe,0xa7,0xc5,0x01,0x64,0xfe,0x9c,0xc5,0x02,0x6e,0xfe,0x79,0x01,0x87,0x01,0x8b,0xfe,0x75,0xfe,0x79,0x01,0x87,0x01,0x8b,0x00,0x01,0x00,0x00,0x02,0x29,0x04,0x5f,0x02,0xb6,0x00,0x03,0x00,0x11,0xb2,0x01,0x00,0x01,\r\n0xb9,0x01,0x7f,0x00,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,0x01,0x21,0x35,0x21,0x04,0x5f,0xfb,0xa1,0x04,0x5f,0x02,0x29,0x8d,0x00,0x02,0x00,0x6f,0x03,0xd0,0x02,0x9c,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x32,0x40,0x18,0x21,0x0c,0x29,0x14,0x04,0x18,0x1e,0x24,0x03,0x09,0x0f,0x15,0x15,0x1e,0xaf,0x24,0x24,0x2b,0x11,0x00,\r\n0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x05,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,\r\n0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x01,0x6b,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,\r\n0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0x03,0xd0,0x02,0x95,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x2c,0x40,0x15,0x14,0x29,0x0c,0x21,0x04,0x03,0x0f,0x09,0x18,0x24,0x1e,0x00,0x0f,0xaf,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0xe1,0xc6,0x11,0x12,0x39,0x11,0x12,\r\n0x39,0x00,0x3f,0x33,0xc4,0x32,0x31,0x30,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,\r\n0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x6f,0x03,0xd0,0x01,0x61,\r\n0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x0c,0x14,0x04,0x03,0x09,0x0f,0x00,0x00,0x09,0xaf,0x0f,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x3e,0x02,0x37,0x01,0x61,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,\r\n0x35,0x46,0x27,0x05,0x77,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x01,0x00,0x74,0x03,0xd0,0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x15,0x40,0x09,0x14,0x0c,0x04,0x03,0x0f,0x00,0x0f,0xaf,0x09,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x13,0x36,0x36,0x35,0x34,\r\n0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x74,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0x04,0x0b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x62,0xfe,0xed,0x01,0x4e,0x00,0xcf,0x00,0x16,0x00,0x17,\r\n0x40,0x0a,0x16,0x0e,0xb2,0x17,0x05,0x11,0x00,0x11,0xaf,0x0b,0x2f,0xe1,0xc6,0x12,0x39,0x00,0x10,0xf4,0xc4,0x31,0x30,0x17,0x3e,0x03,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x62,0x1b,0x31,0x24,0x15,0x19,0x1d,0x28,0x1a,0x2f,0x30,0x3b,0x45,0x20,0x35,0x46,0x27,0xde,0x16,0x31,0x31,\r\n0x2f,0x15,0x19,0x13,0x0d,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x00,0x02,0x00,0x68,0xfe,0xed,0x02,0x95,0x00,0xcf,0x00,0x14,0x00,0x29,0x00,0x2a,0x40,0x14,0x14,0x0c,0x29,0x21,0xb2,0x2a,0x18,0x24,0x1e,0x03,0x0f,0xaf,0x09,0x09,0x09,0x2b,0x15,0x24,0xaf,0x1e,0x2f,0xe1,0xc6,0x12,0x39,0x2f,0x2f,0xe1,\r\n0x39,0x11,0x12,0x39,0x00,0x10,0xf4,0xc4,0x33,0x32,0x31,0x30,0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x25,0x36,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x07,0x01,0xa3,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,\r\n0x20,0x35,0x46,0x27,0xfe,0x95,0x37,0x4c,0x14,0x1a,0x28,0x1a,0x30,0x33,0x38,0x44,0x20,0x35,0x46,0x27,0xd8,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x3b,0x2d,0x5f,0x2a,0x18,0x15,0x0c,0x11,0x26,0x22,0x26,0x39,0x4f,0x4e,0x37,0x5d,0x4f,0x44,0x1e,0x00,0x01,0x00,0x74,0x03,0xd0,\r\n0x01,0x66,0x05,0xb2,0x00,0x14,0x00,0x19,0x40,0x0b,0x00,0x08,0x04,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x00,0x3f,0xc4,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x36,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,\r\n0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,0x5f,0x2d,0x00,0x02,0x00,0x90,0x03,0xd0,0x02,0xbd,0x05,0xb2,0x00,0x14,0x00,0x29,0x00,0x2d,0x40,0x15,0x26,0x1a,0x20,0x29,0x29,0x20,0xaf,0x1a,0x11,0x0b,0x05,0x14,0x14,0x0b,0xaf,0x05,0x15,0x00,0x1d,0x08,0x04,0x00,\r\n0x3f,0x33,0xc4,0x32,0x01,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xf1,0xc2,0x2f,0x11,0x12,0x39,0x31,0x30,0x01,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x05,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x52,0x27,0x46,0x35,\r\n0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x01,0x0b,0x27,0x46,0x35,0x20,0x44,0x38,0x33,0x30,0x1a,0x28,0x1a,0x14,0x4c,0x37,0x03,0xd0,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,0x5f,0x2d,0x3b,0x1e,0x44,0x4f,0x5d,0x37,0x4e,0x4f,0x39,0x26,0x22,0x26,0x11,0x0c,0x15,0x18,0x2a,\r\n0x5f,0x2d,0x00,0x03,0x00,0x8d,0xff,0xe7,0x06,0x57,0x05,0xb1,0x00,0x15,0x00,0x31,0x00,0x4d,0x00,0x40,0x40,0x1d,0x10,0x0b,0x00,0x05,0x00,0x05,0x00,0x40,0x32,0x16,0x24,0x40,0x0b,0x0b,0x0d,0x15,0x02,0x13,0x0d,0x08,0x13,0x08,0x13,0x08,0x1d,0x39,0x2b,0x47,0x1d,0x00,0x2f,0xc9,0x2f,0xc9,0x11,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,\r\n0xc9,0xc6,0x10,0xc2,0x2f,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xc9,0x31,0x30,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x25,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x04,0x37,0x14,0x1e,0x04,0x33,0x32,\r\n0x3e,0x04,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x04,0x04,0x80,0x69,0x8f,0xc0,0xfe,0xfc,0x01,0x0a,0xd5,0x79,0x60,0x56,0x8f,0x8d,0xb7,0xbb,0x90,0x84,0x5e,0xfc,0x0d,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x7f,0x2c,0x50,0x70,0x88,0x9d,0x55,0x54,\r\n0x9d,0x88,0x70,0x50,0x2c,0x2c,0x50,0x70,0x88,0x9d,0x54,0x55,0x9d,0x88,0x70,0x50,0x2c,0x01,0x49,0x45,0xfa,0xbc,0xda,0x01,0x04,0x35,0x96,0x48,0xb4,0x98,0x94,0xb2,0x4e,0xfb,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x66,0x66,0xbe,0xa4,0x88,0x60,0x35,0x35,0x60,0x88,0xa4,0xbe,0x5f,0x55,0x9c,0x88,0x70,0x50,0x2c,\r\n0x2c,0x50,0x70,0x88,0x9c,0x55,0x55,0x9d,0x88,0x70,0x50,0x2c,0x2c,0x50,0x70,0x88,0x9d,0x00,0xff,0xff,0x00,0x70,0x00,0xb2,0x01,0x50,0x04,0xde,0x02,0x07,0x00,0x1d,0x00,0x00,0x00,0xc8,0x00,0x17,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,\r\n0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x5b,0x00,0x6b,0x00,0x73,0x00,0x7c,0x00,0xb2,0x00,0xbc,0x00,0xc3,0x01,0x65,0x40,0xc6,0x3b,0x1b,0x38,0x18,0x37,0x2f,0x14,0x34,0x2c,0x23,0x1f,0x20,0x1c,0x0c,0x64,0x65,0x79,0x97,0x97,0xab,0x7d,0x8e,0x03,0x11,0x4d,0x50,0x51,0xa1,0x8e,0xab,0x86,0x48,\r\n0x57,0x59,0x57,0xbe,0xb4,0xb5,0x6d,0x75,0x5c,0xb9,0xc1,0x61,0x71,0x68,0x79,0x06,0x12,0x11,0x51,0x8e,0x86,0x57,0xb5,0x5c,0xc1,0x71,0x79,0x12,0x12,0x79,0x71,0xc1,0x5c,0xb5,0x57,0x86,0x8e,0x51,0x11,0x0b,0x14,0x30,0x3c,0x40,0x05,0x04,0x0f,0x00,0x31,0x3d,0x41,0x04,0x0c,0x09,0x24,0x28,0x44,0x04,0x17,0x25,0x29,0x45,0x0a,0x04,\r\n0x14,0x2a,0x42,0x29,0x41,0x46,0x3e,0x01,0x45,0x3d,0x3d,0x0f,0x26,0x32,0x32,0x0f,0x25,0x31,0x31,0x0f,0x97,0x97,0x9c,0x7e,0x81,0x5a,0x52,0x51,0x51,0x49,0x15,0x0d,0xb0,0x81,0xb3,0xbe,0xbd,0xb6,0x9c,0x93,0x5c,0x75,0x49,0x57,0x74,0x6d,0x6c,0x5d,0x4d,0x52,0x0a,0x00,0x0d,0xb5,0x81,0xbe,0xb6,0x93,0x75,0x57,0x6d,0x5d,0x52,0x00,\r\n0x00,0x52,0x5d,0x6d,0x57,0x75,0x93,0xb6,0xbe,0x81,0xb5,0x0d,0x0c,0x01,0x19,0x1d,0x2d,0x13,0x04,0x0f,0x12,0x18,0x1c,0x2c,0x04,0x0c,0x20,0x34,0x38,0x06,0x04,0x04,0x07,0x21,0x35,0x39,0x04,0x01,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,\r\n0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0x10,0xc0,0x2f,0x10,0xc4,0x10,0xc6,0x10,0xc2,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,\r\n0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x11,0x33,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc5,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,\r\n0x32,0x31,0x30,0x13,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,\r\n0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,\r\n0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x23,0x11,0x33,0x32,0x15,0x14,0x06,0x23,0x27,0x15,0x33,0x32,0x35,0x34,0x23,0xbc,0xeb,0x96,\r\n0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfd,0x02,0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,\r\n0x98,0x9d,0x48,0x4d,0x2f,0x25,0x2e,0x37,0x55,0x49,0x44,0x2a,0x1e,0x23,0x47,0x24,0x34,0x22,0x26,0x25,0x22,0xfd,0x7c,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,\r\n0x24,0x40,0x02,0x1f,0x61,0x98,0xa2,0x5d,0x4e,0x2e,0x26,0x4d,0x4d,0x04,0xd4,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,\r\n0xd1,0x2c,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfe,0x52,0x01,0xae,0x35,0x30,0x23,0x34,0x0a,0x01,0x06,0x38,0x29,0x3b,0x45,0x01,0x67,0x66,0x1d,0x19,0x30,0xae,0x72,0x1f,0x1b,0x1a,0x1e,0xfd,0x3a,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,\r\n0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x8f,0x94,0x01,0xae,0x89,0x41,0x50,0xd0,0x86,0x43,0x43,0x00,0x00,0x15,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,\r\n0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x7d,0x00,0x87,0x00,0x8e,0x00,0x98,0x00,0xb4,0x01,0x57,0x40,0xbf,0x3b,0x1b,0x38,0x18,0x14,0x23,0x1f,0x20,0x1c,0x0c,0xa8,0x2f,0x2f,0x37,0x62,0x62,0x76,0x34,0x2c,0xa4,0x8f,0x8f,0x96,0x48,0x59,0x93,0x03,0x11,0x97,0x90,0x6c,0x59,\r\n0x96,0x92,0x76,0x51,0x37,0xa4,0x89,0x7f,0x80,0x84,0x8c,0x06,0x12,0x11,0x90,0x59,0x92,0x51,0xa4,0x80,0x8c,0x12,0x99,0x99,0x12,0x8c,0x80,0xa4,0x51,0x92,0x59,0x90,0x11,0x0a,0x14,0x30,0x3c,0x40,0x05,0x04,0x0f,0x00,0x31,0x3d,0x41,0x04,0x0c,0x09,0x24,0x28,0x44,0x04,0x17,0x25,0x29,0x45,0x0a,0x04,0x14,0x2a,0x42,0x29,0x41,0x46,\r\n0x3e,0x01,0x45,0x3d,0x3d,0x0f,0x26,0x32,0x32,0x0f,0x25,0x31,0x31,0x0f,0x62,0x62,0x67,0x49,0x4c,0xb4,0xa4,0xac,0x15,0x0d,0x7b,0x4c,0x7e,0x89,0x88,0x81,0x67,0x5e,0xa3,0x9b,0x90,0x97,0xb1,0xb0,0xa9,0xa8,0x04,0x97,0x9e,0x9f,0xac,0x93,0x94,0x0a,0x00,0x0d,0x80,0x4c,0x89,0x81,0x5e,0x97,0xac,0x94,0x00,0x00,0x94,0xac,0x97,0x5e,\r\n0x81,0x89,0x4c,0x80,0x0d,0x0a,0x01,0x19,0x1d,0x2d,0x13,0x04,0x0f,0x12,0x18,0x1c,0x2c,0x04,0x0c,0x20,0x34,0x38,0x06,0x04,0x04,0x07,0x21,0x35,0x39,0x04,0x01,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x32,\r\n0x11,0x17,0x33,0x10,0xc9,0x32,0x32,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0x10,0xc4,0x32,0x10,0xc6,0x10,0xc2,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,\r\n0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x10,0xc9,0x32,0x10,0xca,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x33,0xc4,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc4,0x32,0x10,0xc0,0x2f,0x10,0xc0,0x2f,0x32,0x10,0xc4,0x32,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0x31,0x30,0x13,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,\r\n0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x01,0x35,0x16,\r\n0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x25,0x15,0x23,0x11,0x33,0x32,0x15,0x14,0x06,0x23,0x27,0x15,0x33,0x32,0x35,0x34,0x23,0x25,0x21,0x35,0x13,0x23,0x35,\r\n0x21,0x15,0x03,0x33,0x01,0x03,0x23,0x03,0x26,0x27,0x23,0x06,0x07,0x03,0x23,0x03,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x17,0x33,0x36,0x37,0x13,0xbc,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,\r\n0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfb,0xac,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,\r\n0x02,0x1f,0x61,0x98,0xa2,0x5d,0x4e,0x2e,0x26,0x4d,0x4d,0xfe,0x82,0xfe,0xa5,0xdd,0xcd,0x01,0x4a,0xd8,0xd9,0x02,0xb6,0x71,0x6c,0x47,0x06,0x01,0x01,0x03,0x05,0x49,0x70,0x71,0x6a,0x3c,0x04,0x02,0x02,0x01,0x07,0x4e,0x68,0x47,0x04,0x03,0x01,0x01,0x05,0x3b,0x04,0xd4,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,\r\n0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0xfd,0xc7,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,\r\n0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x8f,0x94,0x01,0xae,0x89,0x41,0x50,0xd0,0x86,0x43,0x43,0xba,0x38,0x01,0x27,0x4f,0x36,0xfe,0xd6,0x01,0x60,0xfe,0x52,0x01,0x14,0x15,0x1b,0x1d,0x13,0xfe,0xec,0x01,0xae,0xfe,0xe2,0x13,0x1f,0x17,0x1c,0x01,0x1d,0xfe,0xdf,\r\n0x10,0x1e,0x18,0x18,0x01,0x1f,0x00,0x16,0x00,0xbc,0x00,0x00,0x06,0x7c,0x05,0xc0,0x00,0x35,0x00,0x3b,0x00,0x41,0x00,0x47,0x00,0x4d,0x00,0x51,0x00,0x55,0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x91,0x00,0xa5,0x00,0xb5,0x00,0xbd,0x00,0xc6,0x01,0x62,0x40,0xc3,\r\n0x71,0x51,0x6e,0x4e,0x6d,0x65,0x4a,0x6a,0x62,0x59,0x56,0x52,0x42,0x1a,0x1a,0x2e,0x00,0x11,0xae,0xaf,0xc3,0x39,0x47,0x83,0x86,0x87,0xb7,0xbf,0xa6,0xab,0xbb,0xb2,0xc3,0x7e,0x8d,0x8f,0x8d,0x97,0x9a,0x9b,0x24,0x11,0x2e,0x09,0x92,0xa1,0xa3,0xa1,0x3c,0x48,0x47,0x87,0xa6,0xbb,0xc3,0x8d,0x9b,0x11,0x09,0xa1,0x48,0x48,0xa1,0x09,\r\n0x11,0x9b,0x8d,0xc3,0xbb,0xa6,0x87,0x47,0x0b,0x4a,0x66,0x72,0x76,0x3b,0x04,0x45,0x36,0x67,0x73,0x77,0x04,0x42,0x3f,0x5a,0x5e,0x7a,0x04,0x4d,0x5b,0x5f,0x7b,0x40,0x04,0x4a,0x60,0x78,0x5f,0x77,0x7c,0x74,0x37,0x5b,0x67,0x67,0x45,0x01,0xbf,0xa4,0x90,0x88,0x9b,0x87,0x87,0x7f,0x1a,0x7b,0x73,0x73,0xb6,0x5c,0xae,0xaf,0x03,0x68,\r\n0xb7,0x4b,0x43,0x33,0xa6,0xbf,0x04,0xbf,0xbe,0xb7,0x1f,0xb6,0xa7,0x16,0xa7,0x93,0x7f,0x8d,0xa1,0x8d,0x97,0x83,0x88,0x9c,0x88,0x40,0x36,0x43,0xbf,0xb7,0xa7,0x8d,0x88,0x36,0x36,0x88,0x8d,0xa7,0xb7,0xbf,0x43,0x07,0x37,0x4f,0x53,0x63,0x49,0x04,0x45,0x48,0x4e,0x52,0x62,0x04,0x42,0x56,0x6a,0x6e,0x3c,0x04,0x3a,0x3d,0x57,0x6b,\r\n0x6f,0x04,0x37,0x00,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x11,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x10,0xc9,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc4,0x17,0x32,0x10,0xc0,0x2f,0x32,0x32,0x10,0xc0,0x2f,\r\n0x32,0x10,0xc4,0x32,0x10,0xc4,0x10,0xc0,0x2f,0x32,0x10,0xc6,0x32,0xc6,0x32,0xc6,0x32,0x01,0x2f,0x17,0x33,0xc9,0x17,0x32,0x2f,0x17,0x33,0xc9,0x17,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x10,0xc9,0x10,\r\n0xc9,0x10,0xc9,0x32,0x10,0xc9,0x32,0x11,0x33,0x10,0xc5,0x32,0x10,0xc4,0x10,0xc0,0x2f,0x10,0xc4,0x32,0xc4,0xc4,0x32,0x10,0xc4,0x32,0xc4,0x32,0xc4,0x32,0x31,0x30,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,\r\n0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x01,0x35,0x33,0x15,0x23,0x15,0x25,0x35,0x33,0x15,0x23,0x35,0x01,0x35,0x33,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,0x35,0x33,\r\n0x01,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x01,0x23,0x03,0x26,0x27,0x23,0x16,0x15,0x15,0x23,0x11,0x33,0x13,0x16,0x17,0x33,0x26,0x35,0x35,0x33,0x01,0x11,0x33,0x32,\r\n0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x15,0x33,0x32,0x36,0x35,0x34,0x23,0x07,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x04,0x10,0x1a,0x3d,0x20,0x12,0x1b,0x12,0x09,0x0e,0x19,0x22,0x14,0x32,0x32,0x1b,0x2f,0x3d,0x22,0x22,0x34,0x16,0x0b,0x1a,0x1b,0x1a,0x0c,0x11,0x1b,0x13,0x0a,0x0c,0x15,0x1e,0x13,\r\n0x19,0x29,0x1e,0x0f,0x1b,0x2f,0x3e,0x22,0x24,0x40,0xfc,0x95,0xeb,0x96,0x04,0x7f,0xec,0x56,0xfa,0x96,0x55,0x96,0x03,0xe9,0x96,0x56,0xfd,0xe6,0xd2,0xfc,0xce,0xd3,0xd3,0xd3,0x03,0xa7,0x56,0x56,0x56,0x56,0xfc,0xb7,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0x5e,0xd2,0xfb,0xdd,0x55,0x55,0x55,0x55,0x05,0x6b,0x56,0x56,0xfc,0xe4,\r\n0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,0x02,0x01,0x61,0xb2,0x0f,0x06,0x01,0x02,0x5c,0x69,0xab,0x0b,0x0a,0x01,0x02,0x5b,0xfc,0xc7,0x9d,0x48,0x4d,0x2f,0x25,0x2e,0x37,0x55,0x49,0x44,0x2a,0x1e,0x23,0x47,0x24,0x34,0x22,0x26,0x25,0x22,0x01,0x0e,0x60,0x16,0x16,0x07,0x0c,0x0f,0x0a,0x0c,0x14,0x11,\r\n0x10,0x08,0x15,0x3c,0x2b,0x22,0x30,0x1f,0x0f,0x08,0x09,0x59,0x07,0x0c,0x07,0x04,0x07,0x0b,0x10,0x0a,0x0b,0x11,0x0f,0x0f,0x07,0x0b,0x19,0x1e,0x27,0x1b,0x24,0x30,0x1f,0x0d,0x0c,0x03,0xd2,0xec,0x55,0x97,0x97,0x55,0xec,0x97,0xfa,0x95,0xeb,0x95,0x56,0x56,0x95,0xeb,0x56,0x56,0x56,0x56,0x05,0x6b,0x55,0x55,0xfb,0xdd,0xd2,0x01,\r\n0x8c,0xd2,0xfb,0x88,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xfd,0xff,0xd1,0x2c,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfe,0x52,0x01,0x0e,0x18,0x0c,0x17,0x2f,0xec,0x01,0xae,0xfe,0xfa,0x12,0x11,0x0f,0x2c,0xee,0xfc,0x34,0x01,0xae,0x35,0x30,\r\n0x23,0x34,0x0a,0x01,0x06,0x38,0x29,0x3b,0x45,0x01,0x67,0x66,0x1d,0x19,0x30,0xae,0x72,0x1f,0x1b,0x1a,0x1e,0x00,0xff,0xff,0x00,0xab,0xff,0xf2,0x04,0x15,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x0e,0x6f,0x02,0x01,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x73,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x3c,0x01,0x3c,0x00,0x11,\r\n0x5d,0x35,0xff,0xff,0x00,0xab,0xff,0xf2,0x04,0xad,0x05,0xec,0x00,0x26,0x08,0xc7,0x00,0x00,0x00,0x27,0x09,0x3b,0x02,0x01,0x00,0x00,0x01,0x07,0x09,0x7e,0x02,0x73,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x3c,0x01,0x3c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xa1,0xff,0xf2,0x06,0x16,0x05,0x3f,0x00,0x26,0x08,0xf3,0x00,0x00,0x00,0x27,\r\n0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x57,0x01,0x57,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0xa1,0xff,0xf2,0x06,0xae,0x05,0x3f,0x00,0x26,0x08,0xf3,0x00,0x00,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x60,\r\n0x01,0x60,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x3f,0x00,0x26,0x0e,0x5e,\r\n0x00,0x00,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x64,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x30,0x00,0xe4,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,\r\n0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0e,0xb6,0x05,0x02,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x64,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x30,0x00,0xe4,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0e,\r\n0xb6,0x05,0x02,0x03,0x2f,0x59,0x01,0x59,0x00,0x11,0x5d,0x35,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0x16,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0a,0x6d,0x00,0xe5,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0c,0xb5,0x04,0x02,0x2f,0x3e,0x01,0x3e,0x00,\r\n0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x3f,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x0a,0x6d,0x00,0xe5,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0c,0xb5,0x04,0x02,0x2f,0x3e,0x01,0x3e,0x00,0x11,0x5d,0x35,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,\r\n0x06,0x16,0x05,0x5a,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,0x09,0x73,0x00,0xe5,0xfd,0x56,0x00,0x27,0x0e,0x6f,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x5d,0x01,0x5d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x00,0xfd,0xff,0x06,0xae,0x05,0x5a,0x00,0x26,0x0e,0x5e,0x00,0x00,0x00,0x27,\r\n0x09,0x73,0x00,0xe5,0xfd,0x56,0x00,0x27,0x09,0x3b,0x04,0x02,0x00,0x00,0x01,0x07,0x09,0x7e,0x04,0x74,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x5d,0x01,0x5d,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc5,0x08,0xc2,0x05,0x3f,0x00,0x26,0x0f,0x61,0x00,0x00,0x00,0x27,0x0f,0x52,0x01,0xc8,0xfd,0xca,0x00,0x27,0x0e,0x6f,0x06,0xae,\r\n0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x6c,0x01,0x6c,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xfd,0xc5,0x09,0x5a,0x05,0x3f,0x00,0x26,0x0f,0x61,0x00,0x00,0x00,0x27,0x0f,0x52,0x01,0xc8,0xfd,0xca,0x00,0x27,0x09,0x3b,0x06,0xae,0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,\r\n0xb4,0x04,0x2f,0x6c,0x01,0x6c,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xfd,0xca,0x04,0xc0,0x05,0x3f,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x52,0x00,0x83,0xfd,0xcf,0x00,0x27,0x0e,0x6f,0x02,0xac,0x00,0x00,0x01,0x07,0x09,0x7e,0x03,0x1e,0xfd,0x56,0x00,0x0a,0xb4,0x04,0x2f,0x55,0x01,0x55,0x00,0x11,0x5d,0x35,0xff,0xff,\r\n0x00,0x9a,0xff,0x02,0x08,0xc2,0x05,0x3f,0x00,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x0e,0x6f,0x06,0xae,0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0xff,0xff,0x00,0x9a,0xff,0x02,0x09,0x5a,0x05,0x3f,0x00,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x09,0x3b,0x06,0xae,\r\n0x00,0x00,0x01,0x07,0x09,0x7e,0x07,0x20,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x72,0x01,0x72,0x00,0x11,0x5d,0x35,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0xc0,0x05,0x3f,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0e,0x6f,0x02,0xac,0x00,0x00,0x01,0x07,0x09,0x7e,0x03,0x1e,0xfd,0x56,0x00,0x0a,0xb4,0x02,0x2f,0x4d,0x01,0x4d,0x00,0x11,\r\n0x5d,0x35,0x00,0x02,0xff,0x0e,0x04,0x88,0x00,0xf3,0x07,0x90,0x00,0x19,0x00,0x25,0x00,0x2b,0x40,0x0d,0x0d,0x0d,0x00,0x1a,0x14,0x14,0x20,0x06,0x1d,0x14,0x17,0x17,0x0c,0xbb,0x01,0x36,0x00,0x23,0x00,0x03,0x01,0x3a,0x00,0x3f,0xc9,0x3f,0x39,0x2f,0x39,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0xd9,0xc0,0x2f,0x31,0x30,0x13,0x14,0x06,\r\n0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x36,0x37,0x15,0x06,0x07,0x07,0x0e,0x02,0x07,0x33,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0xf3,0x83,0x6c,0x74,0x82,0x2d,0x68,0x80,0x71,0x1e,0x0e,0x34,0x58,0x46,0x42,0x26,0x06,0x02,0x3c,0x6f,0x69,0x79,0x54,0x58,0x48,0x68,0x34,0x59,0x4a,0x45,\r\n0x54,0x05,0x8c,0x77,0x8d,0xa3,0xa0,0x78,0xaa,0x67,0x15,0x13,0x14,0x4d,0x0e,0x09,0x0e,0x0c,0x2f,0x68,0x49,0x57,0x8c,0x7a,0x59,0x67,0x62,0x3f,0x5c,0x79,0x68,0x00,0x00,0x03,0xff,0x36,0x04,0x96,0x00,0xcb,0x06,0x96,0x00,0x0c,0x00,0x13,0x00,0x1a,0x00,0x31,0x40,0x10,0x0b,0x09,0x0d,0x0d,0x04,0x00,0x14,0x11,0x18,0x04,0x17,0x11,\r\n0x11,0x18,0x10,0x05,0xbb,0x01,0x38,0x00,0x18,0x00,0x04,0x01,0x3a,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0xc4,0x31,0x30,0x13,0x14,0x06,0x23,0x23,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x27,0x34,0x23,0x23,0x15,0x33,0x32,0x17,0x34,0x23,0x23,0x15,0x33,0x32,0xcb,0x61,\r\n0x47,0xed,0xdf,0x4c,0x57,0x62,0x75,0x65,0x59,0x85,0x7b,0x63,0x13,0x6f,0x82,0x8e,0x63,0x05,0x29,0x40,0x53,0x02,0x00,0x42,0x3b,0x64,0x15,0x0f,0x7c,0x43,0x90,0x94,0x4e,0x9e,0x00,0x01,0xff,0x72,0x04,0x96,0x00,0x8f,0x06,0x96,0x00,0x05,0x00,0x17,0xb4,0x04,0x01,0x02,0x00,0x03,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,\r\n0xc9,0x01,0x2f,0xc9,0x2f,0x31,0x30,0x03,0x11,0x23,0x11,0x21,0x15,0x3c,0x52,0x01,0x1d,0x06,0x50,0xfe,0x46,0x02,0x00,0x46,0x00,0x02,0xfe,0xfc,0x03,0xdb,0x01,0x05,0x06,0x96,0x00,0x0c,0x00,0x11,0x00,0x2f,0x40,0x0b,0x0a,0x11,0x11,0x00,0x10,0x03,0x04,0x0c,0x00,0x0e,0x08,0xb8,0x01,0x38,0xb5,0x10,0x0a,0x05,0x04,0x00,0x02,0xb8,\r\n0x01,0x3a,0x00,0x3f,0xce,0x32,0xc9,0x32,0x32,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0xc8,0x12,0x39,0x2f,0xc9,0x31,0x30,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x36,0x13,0x21,0x11,0x33,0x11,0x03,0x23,0x06,0x07,0x33,0xbf,0xfe,0x83,0x46,0x2e,0x81,0x04,0x01,0x0a,0x4c,0x9e,0x72,0x0d,0x67,0xe6,0x03,0xdb,0xbb,0xbb,0x01,0x01,0xba,0x01,\r\n0x00,0xfe,0x46,0xfe,0xff,0x02,0x75,0xd5,0x9f,0x00,0x00,0x01,0xfe,0x84,0x04,0x96,0x01,0x7d,0x06,0x96,0x00,0x15,0x00,0x2f,0x40,0x12,0x10,0x03,0x04,0x0d,0x04,0x0a,0x09,0x04,0x13,0x13,0x04,0x09,0x0a,0x04,0x08,0x15,0x08,0x0b,0xba,0x01,0x38,0x00,0x00,0x01,0x3a,0x00,0x3f,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,\r\n0x11,0x33,0x10,0xc9,0x32,0x31,0x30,0x01,0x27,0x23,0x15,0x23,0x35,0x23,0x07,0x23,0x13,0x27,0x33,0x17,0x33,0x35,0x33,0x15,0x33,0x37,0x33,0x07,0x13,0x01,0x0e,0xe5,0x02,0x4e,0x02,0xe4,0x6f,0xfe,0xee,0x68,0xdb,0x02,0x4e,0x02,0xdb,0x6a,0xf0,0xff,0x04,0x96,0xfd,0xfd,0xfd,0xfd,0x01,0x08,0xf8,0xf0,0xf0,0xf0,0xf0,0xf8,0xfe,0xf8,\r\n0x00,0x01,0xff,0x46,0x04,0x88,0x00,0xbb,0x06,0xa1,0x00,0x21,0x00,0x37,0x40,0x13,0x1e,0x1f,0x0d,0x1b,0x11,0x11,0x0a,0x16,0x05,0x0d,0x00,0x0a,0x1f,0x0d,0x0e,0x0e,0x08,0x14,0x19,0xbb,0x01,0x39,0x00,0x08,0x00,0x03,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x39,0x01,0x2f,0xc9,0x2f,0xc4,0x32,0x12,0x39,0x2f,0xc9,\r\n0x10,0xc9,0x32,0x31,0x30,0x13,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0xbb,0x70,0x64,0x6b,0x36,0x3f,0x5d,0x88,0x95,0x32,0x30,0x82,0x37,0x39,0x4b,0x4a,0x57,0x45,0xbb,0x3a,0x30,0x38,0x46,0x05,0x21,\r\n0x47,0x52,0x1b,0x51,0x26,0x56,0x55,0x46,0x51,0x1f,0x2c,0x25,0x4c,0x1f,0x89,0x2e,0x41,0x09,0x02,0x05,0x42,0x00,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x0c,0x00,0x29,0x40,0x0c,0x0a,0x0a,0x04,0x0c,0x07,0x03,0x0b,0x04,0x02,0x07,0x09,0x06,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,0x01,0x3a,0x00,0x3f,0x32,0x3f,0x33,\r\n0x39,0x39,0x01,0x2f,0xc8,0xc9,0x32,0x2f,0x12,0x39,0x2f,0x31,0x30,0x13,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x01,0x62,0xe2,0x02,0x52,0x52,0x02,0xd7,0x6c,0xee,0x01,0x00,0x04,0x96,0xf6,0xf6,0x02,0x00,0xeb,0xeb,0xf7,0xfe,0xf7,0x00,0x01,0xff,0x20,0x04,0x8f,0x00,0xe1,0x06,0x96,0x00,0x0e,0x00,0x1c,0xb4,0x07,\r\n0x0e,0x00,0x02,0x0c,0xb8,0x01,0x38,0xb2,0x0a,0x05,0x00,0xb8,0x01,0x3a,0x00,0x3f,0xd4,0xc9,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0x31,0x30,0x13,0x11,0x23,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x8f,0x77,0x12,0x61,0x59,0x1a,0x12,0x0d,0x19,0x70,0x1e,0x01,0x0d,0x04,0x96,0x01,0xbb,0xe9,0xd9,0x07,0x47,0x09,0x01,\r\n0xc2,0xfe,0x00,0x00,0x00,0x01,0xfe,0xec,0x04,0x96,0x01,0x15,0x06,0x96,0x00,0x10,0x00,0x17,0xb4,0x07,0x08,0x10,0x00,0x09,0xba,0x01,0x38,0x00,0x08,0x01,0x3a,0x00,0x3f,0x3f,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x11,0x07,0x03,0x23,0x03,0x27,0x11,0x23,0x11,0x33,0x13,0x17,0x37,0x13,0x33,0x11,0xc4,0x0f,0x93,0x49,0x84,0x22,\r\n0x47,0x69,0x87,0x25,0x24,0x83,0x6d,0x04,0x96,0x01,0xa6,0x2d,0xfe,0x87,0x01,0x48,0x5e,0xfe,0x5a,0x02,0x00,0xfe,0xb2,0x65,0x63,0x01,0x50,0xfe,0x00,0x00,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x0b,0x00,0x27,0x40,0x0b,0x07,0x03,0x04,0x0b,0x08,0x00,0x02,0x07,0x07,0x09,0x06,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,\r\n0x01,0x3a,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0xc9,0x01,0x2f,0x33,0xc9,0x2f,0xc9,0x32,0x31,0x30,0x13,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x83,0xfe,0xfb,0x52,0x52,0x01,0x05,0x52,0x04,0x96,0xe8,0xe8,0x02,0x00,0xd2,0xd2,0xfe,0x00,0x00,0x00,0x02,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa2,0x00,0x0b,0x00,0x15,\r\n0x00,0x1c,0xb5,0x09,0x14,0x0f,0x03,0x0c,0x06,0xbb,0x01,0x39,0x00,0x12,0x00,0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x02,0x71,0x89,0x8d,0x79,0x71,0x81,0x8a,0x6e,0x4f,0x5d,0x5b,\r\n0x51,0xa4,0x04,0x89,0x91,0x76,0x82,0x90,0x8e,0x7c,0x7c,0x93,0x01,0xd3,0x6a,0x5e,0x5b,0x6a,0xc7,0xc6,0x00,0x01,0xff,0x2c,0x04,0x96,0x00,0xd5,0x06,0x96,0x00,0x07,0x00,0x1c,0xb5,0x03,0x04,0x07,0x00,0x02,0x05,0xbb,0x01,0x38,0x00,0x04,0x00,0x00,0x01,0x3a,0x00,0x3f,0x32,0x3f,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x11,\r\n0x21,0x11,0x23,0x11,0x21,0x11,0x83,0xfe,0xfb,0x52,0x01,0xa9,0x04,0x96,0x01,0xba,0xfe,0x46,0x02,0x00,0xfe,0x00,0x00,0x02,0xff,0x15,0x03,0xa9,0x00,0xec,0x06,0xa2,0x00,0x10,0x00,0x1d,0x00,0x2e,0x40,0x0c,0x0b,0x17,0x11,0x05,0x01,0x02,0x00,0x05,0x08,0x14,0x01,0x0e,0xbd,0x01,0x3b,0x00,0x1a,0x00,0x08,0x01,0x39,0x00,0x03,0x01,\r\n0x38,0x00,0x3f,0x3f,0xc9,0x3f,0xce,0xc9,0x12,0x39,0x39,0x01,0x2f,0xc9,0x32,0x32,0x2f,0xc9,0x31,0x30,0x03,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x99,0x52,0x52,0x02,0x3c,0x75,0x64,0x6e,0x7d,0x6c,0x65,0x35,0x02,0x52,\r\n0x40,0x46,0x59,0x4e,0x44,0x47,0x58,0x04,0xdf,0xfe,0xca,0x02,0xed,0x5a,0x66,0x8a,0x73,0x82,0x9a,0x56,0x83,0x3b,0x59,0x6c,0x6d,0x52,0x64,0x62,0x48,0x00,0x00,0x01,0xff,0x40,0x04,0x89,0x00,0xc1,0x06,0xa2,0x00,0x15,0x00,0x1c,0xb5,0x05,0x10,0x0b,0x00,0x02,0x13,0xbb,0x01,0x39,0x00,0x08,0x00,0x0d,0x01,0x3b,0x00,0x3f,0xc9,0x3f,\r\n0xc9,0x01,0x2f,0x33,0x2f,0xc9,0x31,0x30,0x13,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0xc1,0x38,0x41,0x4f,0x65,0x5d,0x51,0x43,0x3c,0x3d,0x51,0x6b,0x88,0x93,0x77,0x46,0x31,0x06,0x35,0x27,0x72,0x58,0x58,0x6b,0x2d,0x4e,0x25,0x8c,0x74,0x7d,0x9c,0x19,0x00,0x01,\r\n0xff,0x3e,0x04,0x96,0x00,0xc3,0x06,0x96,0x00,0x07,0x00,0x1d,0xb7,0x01,0x02,0x02,0x06,0x04,0x00,0x04,0x05,0xba,0x01,0x38,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x32,0x01,0x2f,0x2f,0x39,0x2f,0xc9,0x31,0x30,0x13,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x2a,0x52,0x9a,0x01,0x85,0x06,0x50,0xfe,0x46,0x01,0xba,0x46,0x46,0x00,0x01,\r\n0xff,0x23,0x04,0x96,0x00,0xdd,0x06,0x96,0x00,0x10,0x00,0x1d,0xb7,0x01,0x09,0x09,0x0a,0x08,0x02,0x00,0x03,0xba,0x01,0x3a,0x00,0x00,0x01,0x38,0x00,0x3f,0x3f,0x01,0x2f,0x32,0x2f,0x33,0x39,0x2f,0xc9,0x31,0x30,0x13,0x03,0x17,0x23,0x27,0x23,0x06,0x07,0x23,0x37,0x03,0x33,0x16,0x17,0x33,0x37,0x37,0xdd,0xac,0xaa,0x60,0x7b,0x02,\r\n0x12,0x6b,0x5e,0xae,0xa8,0x60,0x6b,0x0e,0x02,0x1a,0x65,0x06,0x96,0xfe,0xfe,0xfe,0xcc,0x20,0xac,0xfc,0x01,0x04,0xbd,0x1b,0x31,0xa7,0x00,0x01,0xff,0x06,0x03,0xdb,0x00,0xfb,0x06,0x96,0x00,0x0b,0x00,0x29,0x40,0x0a,0x09,0x06,0x06,0x00,0x05,0x02,0x0b,0x00,0x07,0x04,0xb8,0x01,0x38,0xb3,0x09,0x05,0x00,0x02,0xb8,0x01,0x3a,0x00,\r\n0x3f,0xce,0xc9,0x32,0x3f,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0x31,0x30,0x13,0x35,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x11,0xb4,0xfe,0x52,0x52,0x01,0x05,0x52,0x4c,0x03,0xdb,0xbb,0x02,0x00,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xff,0x00,0x00,0x01,0xff,0x2f,0x04,0x96,0x00,0xd2,0x06,0x96,0x00,0x0f,0x00,0x24,\r\n0x40,0x0b,0x08,0x05,0x0f,0x0c,0x00,0x03,0x01,0x0a,0x0a,0x0d,0x07,0xba,0x01,0x38,0x00,0x00,0x01,0x3a,0x00,0x3f,0x3f,0x33,0x39,0x2f,0xcd,0xc9,0x01,0x2f,0x33,0xc9,0x2f,0xc9,0x31,0x30,0x13,0x35,0x06,0x23,0x22,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x37,0x35,0x33,0x11,0x81,0x57,0x4f,0xac,0x52,0x61,0x49,0x56,0x51,0x04,0x96,0xce,\r\n0x31,0xb6,0xad,0xa9,0x71,0x2b,0xeb,0xfe,0x04,0x00,0x00,0x01,0xfe,0xba,0x04,0x96,0x01,0x47,0x06,0x96,0x00,0x0b,0x00,0x29,0x40,0x0b,0x07,0x04,0x04,0x00,0x0b,0x08,0x03,0x00,0x09,0x05,0x02,0xb8,0x01,0x38,0xb2,0x07,0x03,0x00,0xb8,0x01,0x3a,0x00,0x3f,0xc9,0x32,0x3f,0x33,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x2f,0xc9,0x31,\r\n0x30,0x01,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0xfe,0xba,0x52,0xcc,0x52,0xcb,0x52,0x04,0x96,0x02,0x00,0xfe,0x46,0x01,0xba,0xfe,0x46,0x01,0xba,0xfe,0x00,0x00,0x01,0xfe,0x93,0x03,0xdb,0x01,0x6d,0x06,0x96,0x00,0x0f,0x00,0x37,0x40,0x10,0x09,0x06,0x0d,0x0a,0x06,0x0a,0x06,0x0a,0x00,0x05,0x02,0x0f,0x00,0x0b,\r\n0x07,0x04,0xb8,0x01,0x38,0xb4,0x0d,0x09,0x05,0x00,0x02,0xb8,0x01,0x3a,0x00,0x3f,0xce,0xc9,0x32,0x32,0x3f,0x33,0x33,0x01,0x2f,0xc9,0x2f,0xc9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x31,0x30,0x01,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x01,0x25,0xfd,0x6e,0x52,0xcb,0x52,0xcc,0x52,\r\n0x4d,0x03,0xdb,0xbb,0x02,0x00,0xfe,0x45,0x01,0xbb,0xfe,0x45,0x01,0xbb,0xfe,0x45,0xff,0x00,0x00,0x03,0xff,0x04,0x04,0x89,0x00,0xfc,0x06,0xa1,0x00,0x0b,0x00,0x1b,0x00,0x28,0x00,0x40,0x40,0x19,0x27,0x09,0x19,0x1f,0x13,0x03,0x19,0x13,0x1f,0x0c,0x27,0x10,0x21,0x25,0x1f,0x27,0x21,0x21,0x27,0x1f,0x25,0x04,0x16,0x1c,0x06,0xbb,\r\n0x01,0x39,0x00,0x16,0x00,0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x32,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x33,0x31,0x30,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x22,0x27,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x06,0x06,\r\n0x03,0x22,0x06,0x07,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x26,0x02,0x73,0x87,0x8c,0x79,0x73,0x80,0x89,0x29,0x16,0x36,0x32,0x15,0x0d,0x29,0x27,0x08,0x5c,0x45,0x48,0x51,0x0a,0x1d,0x30,0x55,0x49,0x59,0x08,0x48,0x19,0x13,0x39,0x3b,0x0c,0x0e,0x4a,0x10,0x04,0x89,0x8f,0x78,0x80,0x91,0x8c,0x7d,0x7c,0x91,0xcc,0x1b,0x1a,0x10,\r\n0x0c,0x4b,0x57,0x4e,0x55,0x0b,0x0f,0x01,0x05,0x55,0x4d,0x18,0x19,0x1b,0x1d,0xa1,0x00,0x01,0xfe,0x94,0x04,0x88,0x01,0x6c,0x06,0x96,0x00,0x17,0x00,0x30,0x40,0x0d,0x01,0x02,0x0d,0x02,0x0d,0x02,0x12,0x16,0x07,0x12,0x00,0x04,0x15,0xbd,0x01,0x38,0x00,0x0a,0x00,0x0f,0x01,0x3b,0x00,0x02,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x3f,0xc9,\r\n0x32,0x01,0x2f,0xc9,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x31,0x30,0x13,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0xd3,0x52,0xe0,0x56,0x64,0x58,0x4b,0x44,0x3a,0x39,0x48,0x6d,0x86,0x8d,0x7c,0x01,0xcf,0x06,0x50,0xfe,0x46,0x01,0xba,0x65,0x59,0x55,\r\n0x6e,0x2d,0x4e,0x26,0x8c,0x75,0x7d,0x90,0x46,0x00,0x00,0x02,0xff,0x36,0x04,0x89,0x00,0xcb,0x06,0xa2,0x00,0x14,0x00,0x1e,0x00,0x3a,0x40,0x12,0x0f,0x0f,0x19,0x08,0x1e,0x0b,0x00,0x01,0x15,0x0f,0x12,0x0b,0x0b,0x1b,0x02,0x05,0x0d,0x12,0xbd,0x01,0x39,0x00,0x1b,0x00,0x05,0x01,0x3b,0x00,0x01,0x01,0x3a,0x00,0x3f,0x3f,0xc9,0x3f,\r\n0xc9,0x12,0x39,0x12,0x39,0x2f,0x12,0x39,0xc9,0x01,0x2f,0xc9,0x33,0x33,0x2f,0xd9,0xc0,0x2f,0x31,0x30,0x13,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x07,0x07,0x06,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0xcb,0x52,0x02,0x35,0x68,0x4e,0x56,0xa4,0x9f,0x6a,0x5c,0x4a,0x40,\r\n0x6e,0xb4,0x52,0x7c,0x42,0x31,0x64,0x3a,0x51,0x04,0x96,0x50,0x5d,0x52,0x43,0x8d,0x18,0x18,0x81,0x3e,0x54,0x30,0xbe,0x4a,0x13,0x0a,0x2a,0x2e,0x56,0x54,0x40,0x00,0x00,0x02,0xff,0x21,0x04,0x89,0x00,0xdf,0x06,0xa2,0x00,0x11,0x00,0x17,0x00,0x2d,0x40,0x0e,0x06,0x06,0x00,0x12,0x17,0x01,0x0b,0x01,0x05,0x17,0x17,0x03,0x14,0x0e,\r\n0xbb,0x01,0x39,0x00,0x03,0x00,0x08,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0xc9,0x12,0x39,0x2f,0x39,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x27,0x26,0x23,0x22,0x06,0x07,0xdf,0xfe,0x98,0x04,0xa1,0x56,0x4a,0x41,0x71,0x6d,0x7c,\r\n0x86,0x65,0x64,0x6f,0x53,0x02,0x7e,0x3a,0x52,0x09,0x05,0x81,0xb2,0x39,0x4e,0x31,0x8b,0x80,0x76,0x98,0x80,0x76,0x1a,0x96,0x51,0x45,0x00,0x01,0xff,0x27,0x04,0x96,0x00,0xda,0x06,0x96,0x00,0x19,0x00,0x4c,0x40,0x1f,0x04,0x08,0x01,0x17,0x17,0x14,0x0d,0x19,0x19,0x13,0x14,0x06,0x06,0x0c,0x0d,0x10,0x17,0x08,0x17,0x07,0x19,0x00,\r\n0x04,0x00,0x17,0x00,0x17,0x00,0x02,0x14,0x0d,0xba,0x01,0x3a,0x00,0x02,0x01,0x38,0x00,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0xd9,0xc0,0x2f,0x11,0x12,0x39,0x2f,0x33,0xc9,0x32,0x31,0x30,0x03,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x16,0x16,0x15,\r\n0x15,0x23,0x35,0x34,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x37,0x35,0x23,0xae,0x86,0x52,0x85,0x85,0x57,0x59,0x52,0x85,0x8a,0x52,0xb1,0x86,0x06,0x3a,0x5c,0x5c,0x43,0x4c,0x0a,0x78,0x6a,0x29,0x32,0xa1,0xa1,0x32,0x2c,0xd8,0x12,0x4b,0x00,0x00,0x02,0xff,0x18,0x04,0x88,0x00,0xe8,0x07,0x8c,0x00,0x12,0x00,0x1c,0x00,0x3b,0x40,0x1a,\r\n0x10,0x08,0x0c,0x19,0x00,0x16,0x08,0x19,0x16,0x16,0x19,0x08,0x03,0x06,0x0f,0x1b,0x09,0x06,0x19,0x0c,0x09,0x0c,0x09,0x0f,0x13,0x03,0xb8,0x01,0x3b,0x00,0x3f,0xc9,0x2f,0x39,0x39,0x2f,0x2f,0xc9,0x01,0x2f,0xc6,0xc9,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x11,0x33,0x10,0xc9,0x31,0x30,0x13,0x14,0x06,0x23,0x22,0x26,0x35,\r\n0x34,0x37,0x03,0x33,0x16,0x17,0x37,0x13,0x33,0x03,0x16,0x16,0x07,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x15,0x14,0x5d,0x44,0x34,0x35,0x47,0x47,0x98,0x5f,0x59,0x0e,0x09,0xa5,0x5c,0xda,0x23,0x2c,0x7a,0x19,0x10,0x0f,0x1d,0x26,0x04,0xf8,0x30,0x40,0x3d,0x36,0x37,0x89,0x01,0x20,0xb6,0x23,0x16,0x01,0x74,0xfe,0x30,0x3e,0x5e,0x52,\r\n0x21,0x0e,0x10,0x2d,0x3a,0x4f,0x28,0x2f,0x00,0x02,0xfe,0xf7,0x04,0x96,0x01,0x0a,0x07,0x8c,0x00,0x12,0x00,0x19,0x00,0x3b,0x40,0x19,0x0f,0x0b,0x17,0x08,0x04,0x04,0x06,0x0d,0x00,0x13,0x06,0x16,0x0f,0x0e,0x06,0x07,0x0b,0x07,0x0f,0x07,0x0f,0x07,0x09,0x17,0x04,0xb8,0x01,0x3a,0x00,0x3f,0xc9,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x33,\r\n0x10,0xc9,0x32,0x10,0xc9,0x01,0x2f,0x2f,0xc9,0xc4,0x12,0x39,0x2f,0x33,0xc9,0x32,0x32,0x31,0x30,0x01,0x14,0x06,0x23,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x32,0x16,0x07,0x34,0x23,0x23,0x15,0x33,0x32,0x01,0x0a,0x5c,0x48,0xe3,0x8c,0x8c,0x52,0x9c,0x9c,0x89,0x4f,0x5d,0x54,0x68,0x79,0x7a,0x67,0x05,\r\n0x36,0x47,0x59,0x02,0x59,0x43,0x5a,0x5a,0x43,0xfe,0xe2,0x51,0x4a,0x55,0xaf,0x00,0x00,0x02,0xfe,0xa2,0x04,0x8a,0x01,0x5e,0x06,0xa2,0x00,0x12,0x00,0x1a,0x00,0x3b,0x40,0x10,0x15,0x0a,0x03,0x03,0x06,0x10,0x19,0x09,0x05,0x06,0x04,0x09,0x09,0x17,0x13,0x0d,0xbf,0x01,0x39,0x00,0x07,0x01,0x38,0x00,0x06,0x01,0x3a,0x00,0x17,0x00,\r\n0x00,0x01,0x3b,0x00,0x3f,0xc9,0x3f,0x3f,0x3f,0xc9,0x12,0x39,0x2f,0xc9,0x01,0x2f,0xc9,0x32,0x2f,0xc9,0x12,0x39,0x2f,0x33,0xc9,0x31,0x30,0x13,0x22,0x26,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x15,0x14,0x33,0x32,0x35,0x34,0x6c,0x6a,0x79,0x04,0x91,0x52,0x52,0x92,0x0d,0x7c,\r\n0x69,0x70,0x76,0x81,0x6c,0x99,0x9b,0x97,0x04,0x8a,0x7f,0x75,0xe8,0x02,0x00,0xd2,0x66,0x78,0x8e,0x7c,0x7f,0x8f,0x01,0xd3,0xc8,0xc6,0xc7,0xc7,0x00,0x02,0xfe,0xc2,0x04,0x8a,0x01,0x3f,0x06,0xa2,0x00,0x1b,0x00,0x26,0x00,0x5e,0x40,0x1d,0x0f,0x0b,0x0c,0x15,0x15,0x1c,0x09,0x07,0x07,0x00,0x0c,0x22,0x1b,0x11,0x00,0x15,0x15,0x13,\r\n0x18,0x0a,0x0f,0x23,0x11,0x0f,0x11,0x0f,0x11,0x1f,0x18,0xbd,0x01,0x39,0x00,0x0d,0x01,0x38,0x00,0x00,0x00,0x0c,0x01,0x3a,0xb4,0x01,0x02,0x02,0x1f,0x04,0xb8,0x01,0x3b,0x00,0x3f,0xd9,0xc0,0x2f,0x32,0x3f,0x33,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x01,0x2f,0x33,0xc9,0x33,0x2f,0x12,0x39,\r\n0x2f,0xcd,0xd9,0xc0,0x2f,0x10,0xc9,0x32,0x31,0x30,0x13,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x23,0x11,0x33,0x15,0x21,0x37,0x34,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x15,0x11,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x07,0x06,0x06,0xed,0x02,0x32,0x6b,0x4c,0x57,0x1c,0xb3,0x52,0x52,0x01,0x38,0xa1,0x69,0x5b,\r\n0x4c,0x47,0x67,0xb4,0xfe,0xc0,0x3a,0x28,0x3f,0x4d,0x7c,0x42,0x30,0x04,0x96,0x50,0x5c,0x51,0x43,0x3c,0x24,0xe8,0x02,0x00,0xd2,0x16,0x83,0x3f,0x54,0x30,0xbf,0xfe,0xb3,0x8e,0x2a,0x2b,0x57,0x3c,0x37,0x12,0x0a,0x2b,0x00,0x02,0xff,0x07,0x04,0x96,0x00,0xfa,0x06,0x96,0x00,0x08,0x00,0x14,0x00,0x47,0x40,0x1b,0x00,0x00,0x0d,0x07,\r\n0x0e,0x04,0x03,0x0b,0x08,0x10,0x0e,0x08,0x08,0x0e,0x10,0x03,0x09,0x12,0x09,0x0b,0x10,0x10,0x08,0x0a,0x03,0x04,0x13,0xb8,0x01,0x38,0xb2,0x12,0x0e,0x0a,0xb8,0x01,0x3a,0x00,0x3f,0x33,0x33,0x3f,0xc9,0x32,0x12,0x39,0x39,0x11,0x33,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0xc6,0x32,0x10,0xc4,0xd9,0xc0,0x2f,0x31,\r\n0x30,0x13,0x27,0x26,0x27,0x23,0x06,0x06,0x07,0x17,0x17,0x23,0x27,0x07,0x15,0x23,0x35,0x27,0x07,0x23,0x13,0x33,0x3a,0x26,0x0e,0x04,0x02,0x02,0x08,0x2f,0x3d,0xf6,0x58,0x4c,0x30,0x4b,0x32,0x4e,0x54,0xd6,0x51,0x05,0xa3,0x69,0x22,0x25,0x14,0x23,0x75,0x46,0xcb,0xc6,0x3b,0x8b,0x8b,0x3c,0xc7,0x02,0x00,0x00,0x00,0x02,0xfe,0xee,\r\n0x04,0x96,0x01,0x12,0x06,0x96,0x00,0x12,0x00,0x17,0x00,0x51,0x40,0x20,0x12,0x12,0x0e,0x13,0x03,0x04,0x0f,0x16,0x0c,0x04,0x16,0x16,0x04,0x0c,0x03,0x0d,0x13,0x14,0x09,0x0d,0x0f,0x0c,0x02,0x05,0x16,0x0c,0x16,0x0c,0x16,0x00,0x14,0x0d,0xb8,0x01,0x38,0xb2,0x09,0x04,0x00,0xb8,0x01,0x3a,0x00,0x3f,0x32,0x32,0x3f,0xc9,0x12,0x39,\r\n0x39,0x2f,0x2f,0x10,0xc9,0x32,0x11,0x33,0x01,0x2f,0xc6,0xc9,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x26,0x27,0x15,0x23,0x35,0x06,0x06,0x07,0x23,0x36,0x36,0x37,0x27,0x21,0x07,0x16,0x16,0x17,0x03,0x23,0x17,0x17,0x37,0xbb,0x12,0x80,0x4e,0x44,0x47,0x0b,0x57,0x15,0x5c,0x57,\r\n0x9f,0x01,0xda,0xa4,0x53,0x5b,0x17,0xa8,0xc9,0x5b,0x07,0x04,0x04,0x96,0xb3,0x26,0xd9,0xda,0x15,0x68,0x5d,0x7e,0x7c,0x1b,0xeb,0xec,0x1b,0x7a,0x7f,0x01,0xbc,0x91,0x0f,0x08,0x00,0x02,0xfe,0xb2,0x04,0x96,0x01,0x4f,0x06,0x96,0x00,0x17,0x00,0x1c,0x00,0x69,0x40,0x2d,0x17,0x17,0x13,0x18,0x19,0x12,0x03,0x04,0x14,0x1b,0x12,0x0a,\r\n0x11,0x04,0x1b,0x1b,0x04,0x11,0x0a,0x12,0x05,0x0d,0x18,0x10,0x0c,0x08,0x08,0x0c,0x0d,0x02,0x05,0x1b,0x0b,0x10,0x14,0x1b,0x10,0x10,0x1b,0x14,0x03,0x00,0x19,0x0e,0x12,0xb8,0x01,0x38,0xb3,0x0d,0x08,0x04,0x00,0xb8,0x01,0x3a,0x00,0x3f,0x32,0x32,0x32,0x3f,0xc4,0xc9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x32,0x01,\r\n0x2f,0xd9,0xc2,0x2f,0x11,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xc9,0x10,0xc9,0x10,0xc9,0x10,0xd9,0xc2,0x2f,0x31,0x30,0x13,0x26,0x27,0x15,0x23,0x35,0x06,0x07,0x23,0x36,0x37,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x27,0x21,0x07,0x16,0x16,0x17,0x03,0x23,0x17,0x17,0x37,0xf8,0x11,0x82,0x4e,0x86,0x0f,0x57,0x1e,\r\n0x72,0xb7,0x52,0x52,0xdf,0x8f,0x01,0xda,0xa4,0x54,0x5a,0x17,0xa8,0xc9,0x5a,0x07,0x09,0x04,0x96,0xb0,0x29,0xd9,0xda,0x29,0xb1,0xb7,0x35,0xec,0x02,0x00,0xd4,0xd4,0xec,0x1c,0x76,0x82,0x01,0xbc,0x91,0x0f,0x0f,0x00,0x00,0x01,0x00,0x21,0xfe,0x99,0x04,0x7b,0x05,0x9a,0x00,0x25,0x00,0x3f,0x40,0x21,0x06,0x1a,0x0a,0x0a,0x1a,0x06,\r\n0x03,0x00,0x03,0x09,0x0e,0x7f,0x05,0x00,0x09,0x06,0x91,0x07,0x03,0x1d,0x92,0x16,0x16,0x03,0x23,0x92,0x1a,0x11,0x04,0x0a,0x91,0x03,0x12,0x00,0x3f,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xc4,0xfd,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x31,0x30,0x05,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,\r\n0x15,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x03,0xe8,0xa4,0xfc,0xdd,0x03,0x41,0xfd,0x02,0x04,0x00,0xfc,0xb8,0x02,0x2a,0x94,0xa1,0x8b,0x73,0x45,0x8b,0x50,0x5d,0x4e,0x40,0x41,0x8c,0x87,0x78,0x4a,0x79,0x3f,0x30,0x64,0x32,\r\n0x37,0x45,0x79,0x79,0x2f,0x04,0xd3,0x98,0x28,0xfb,0x26,0x87,0x7f,0x6f,0x8a,0x2e,0x24,0x29,0x43,0x33,0x73,0x85,0x29,0x19,0x13,0x26,0x3e,0x00,0x00,0x01,0x00,0x21,0xfe,0xa9,0x03,0x9e,0x04,0x00,0x00,0x22,0x00,0x40,0x40,0x22,0x18,0x06,0x0a,0x05,0x05,0x0a,0x06,0x18,0x04,0x00,0x03,0x09,0x0d,0xed,0x00,0x09,0x06,0x95,0x07,0x0f,\r\n0x1b,0x96,0x14,0x14,0x03,0x20,0x96,0x18,0x10,0x04,0x0a,0x95,0x03,0x15,0x00,0x3f,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x05,0x34,0x23,0x21,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x20,0x15,0x14,0x06,0x23,0x22,0x27,0x26,0x23,0x22,\r\n0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x33,0x32,0x36,0x03,0x11,0x99,0xfd,0xa9,0x02,0x5e,0xfd,0xdb,0x03,0x16,0xfd,0xa2,0x01,0x7b,0x01,0x11,0x7a,0x67,0x65,0x9b,0x52,0x46,0x39,0x39,0x81,0x78,0x6e,0x44,0x82,0x4b,0x50,0x2e,0x36,0x34,0x72,0x72,0x33,0x03,0x41,0x8c,0x2f,0xfc,0xbb,0xf5,0x6a,0x84,0x4c,0x28,0x40,0x30,\r\n0x6f,0x7e,0x2c,0x22,0x26,0x3e,0x00,0x01,0x00,0x21,0xfe,0x99,0x04,0x7b,0x05,0x9a,0x00,0x2d,0x00,0x5a,0x40,0x30,0x2d,0x1b,0x03,0x1b,0x0b,0x2c,0x07,0x07,0x2c,0x0b,0x1b,0x03,0x05,0x27,0x2a,0x09,0x06,0x0f,0x7f,0x02,0x27,0x1e,0x92,0x17,0x17,0x2a,0x24,0x92,0x1b,0x12,0x2b,0x0b,0x91,0x2a,0x0a,0x2d,0x92,0x07,0x00,0x00,0x04,0x2a,\r\n0x12,0x06,0x03,0x91,0x04,0x03,0x00,0x3f,0xed,0x39,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xfd,0xc4,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x31,0x30,0x13,0x21,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x21,0x01,0x21,0x32,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x17,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x21,0x35,0x01,0x21,0xa2,0x01,0x85,0x01,0x3b,0xfd,0x02,0x04,0x00,0xfe,0x78,0x01,0x38,0xfe,0x72,0xfe,0x96,0x02,0x2a,0xa2,0x93,0x8b,0x72,0x42,0x7d,0x61,0x61,0x4a,0x40,0x42,0x8c,0x87,0x79,0x5c,0x69,0x3e,\r\n0x30,0x63,0x32,0x37,0x44,0xa4,0xfc,0xdd,0x01,0xae,0xfe,0xd3,0x03,0x2e,0x01,0xd4,0x98,0x28,0xfd,0xbc,0x80,0xfd,0xea,0x7e,0x88,0x6f,0x8a,0x27,0x2b,0x29,0x43,0x33,0x73,0x85,0x2a,0x18,0x13,0x26,0x3e,0x2e,0x79,0x2f,0x02,0x7f,0x00,0x01,0x00,0x21,0xfe,0xa9,0x03,0x9e,0x04,0x00,0x00,0x2c,0x00,0x5a,0x40,0x31,0x1b,0x03,0x2c,0x0b,\r\n0x2b,0x07,0x02,0x02,0x07,0x2b,0x0b,0x2c,0x03,0x1b,0x07,0x26,0x29,0x09,0x06,0x0f,0xed,0x26,0x1e,0x96,0x17,0x17,0x29,0x23,0x96,0x1b,0x12,0x2a,0x0b,0x95,0x29,0x0a,0x2c,0x96,0x07,0x00,0x00,0x04,0x29,0x15,0x06,0x03,0x95,0x04,0x0f,0x00,0x3f,0xed,0x39,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x39,0xd4,0x32,0xed,0x12,0x39,\r\n0x2f,0xed,0x01,0x2f,0xfd,0xc4,0xc4,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x13,0x21,0x13,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x21,0x03,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x23,0x21,0x35,0x01,\r\n0x23,0x7d,0x01,0x31,0xd1,0xfd,0xdb,0x03,0x16,0xfe,0xec,0x01,0x04,0xfe,0xa4,0xf2,0x01,0x7f,0x80,0x8d,0x7c,0x6b,0x40,0x97,0x2f,0x4c,0x45,0x36,0x37,0x81,0x76,0x6a,0x41,0x7d,0x4f,0x54,0x2f,0x39,0x36,0x76,0xfd,0x86,0x01,0x33,0xd7,0x02,0x54,0x01,0x20,0x8c,0x2f,0xfe,0x83,0x7a,0xfe,0xb2,0x7f,0x76,0x69,0x85,0x33,0x19,0x28,0x40,\r\n0x30,0x70,0x7d,0x2b,0x23,0x26,0x3e,0x2a,0x72,0x33,0x01,0xa7,0x00,0x01,0x00,0x77,0xff,0xe8,0x03,0xdc,0x05,0xb2,0x00,0x27,0x00,0x29,0x40,0x16,0x00,0x1a,0x7d,0x0d,0x22,0x7d,0x13,0x06,0x13,0x0d,0x22,0x27,0x04,0x03,0x10,0x91,0x17,0x04,0x24,0x91,0x03,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xc4,0xed,0x2f,0xfd,\r\n0xc4,0x31,0x30,0x25,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x14,0x21,0x32,0x36,0x37,0x03,0xdc,0x3f,0xcb,0x5d,0xf1,0xfe,0xf3,0xae,0xce,0x8f,0x74,0x34,0x9b,0x96,0x5e,0x8e,0x5a,0x4f,0x88,0x5e,0xef,0x01,\r\n0x03,0x43,0x92,0x8f,0x9d,0x7a,0x38,0x01,0x34,0x63,0xe0,0x3e,0x3a,0x26,0x2c,0xb6,0xa9,0x91,0xd8,0x66,0x48,0x55,0x5d,0x44,0x5a,0x6c,0x24,0x34,0xbd,0x1e,0x15,0xbd,0xad,0x5d,0x8e,0x7a,0x49,0x50,0x5e,0x65,0x44,0xc4,0x4a,0x37,0x00,0x01,0x00,0x70,0xff,0xe8,0x03,0x17,0x04,0x18,0x00,0x22,0x00,0x29,0x40,0x16,0x00,0x16,0x83,0x0b,\r\n0x1d,0x83,0x10,0x05,0x10,0x0b,0x1d,0x22,0x04,0x02,0x0e,0x95,0x13,0x10,0x1f,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xc4,0xed,0x2f,0xfd,0xc4,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x0e,0x02,0x15,\r\n0x14,0x33,0x32,0x36,0x37,0x03,0x17,0x70,0xa2,0xc6,0xcf,0x87,0x9e,0x82,0x56,0x6a,0x60,0x91,0x73,0x68,0x86,0xb5,0xd3,0x75,0x9e,0x6c,0x53,0x2b,0xd8,0x52,0x99,0x3c,0x25,0x3d,0x88,0x85,0x71,0x9c,0x3e,0x34,0x55,0x3c,0x40,0x49,0x4a,0xa6,0x2e,0x91,0x7e,0x72,0x91,0x40,0x2c,0x36,0x41,0x2b,0x86,0x35,0x2e,0x00,0x00,0x01,0x00,0xbc,\r\n0xff,0xf0,0x02,0xc8,0x05,0x9a,0x00,0x11,0x00,0x1f,0x40,0x0f,0x09,0x7e,0x06,0x00,0x7f,0x0f,0x10,0x10,0x03,0x07,0x03,0x0c,0x91,0x03,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x01,0x2f,0xed,0x2f,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x02,0xc8,0x8b,0x79,0x7d,\r\n0x8b,0xa8,0x3c,0x2d,0x2c,0x37,0x98,0xfa,0x7d,0x8d,0x9a,0x93,0x04,0x7d,0xfb,0x82,0x54,0x45,0x3b,0x3d,0x2b,0x00,0x00,0x01,0x00,0xa6,0xff,0xf0,0x02,0xa5,0x04,0x00,0x00,0x11,0x00,0x22,0xb3,0x09,0x84,0x06,0x00,0xb8,0x01,0x2e,0x40,0x0a,0x0f,0x10,0x10,0x03,0x07,0x0f,0x0c,0xec,0x03,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x01,\r\n0x2f,0xed,0x2f,0xed,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x02,0xa5,0x85,0x78,0x7b,0x87,0xa3,0x38,0x31,0x2a,0x34,0x95,0xf1,0x76,0x8b,0x98,0x8b,0x02,0xed,0xfd,0x12,0x4a,0x48,0x38,0x3b,0x28,0x00,0x01,0x00,0xaa,0x00,0x00,0x04,0xd5,0x05,0x9a,0x00,0x19,0x00,0x4d,\r\n0x40,0x29,0x12,0x16,0x7e,0x0f,0x0b,0x0b,0x07,0x00,0x0d,0x06,0x7e,0x07,0x14,0x19,0x7e,0x00,0x16,0x03,0x91,0x0b,0x15,0x0d,0x92,0x0e,0x12,0x0e,0x00,0x0b,0x10,0x0b,0x02,0x0b,0x0e,0x0b,0x0e,0x07,0x10,0x03,0x00,0x07,0x12,0x00,0x3f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x33,0x01,0x2f,0xfd,\r\n0xc4,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x31,0x30,0x21,0x11,0x10,0x21,0x20,0x11,0x11,0x23,0x11,0x10,0x12,0x37,0x35,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x15,0x04,0x11,0x11,0x04,0x2d,0xfe,0x99,0xfe,0x8c,0xa8,0xe0,0xe2,0xfe,0xba,0x01,0x46,0xa8,0x01,0x46,0xfe,0xba,0x01,0xc1,0x01,0x7c,0x01,0xaa,0xfe,\r\n0x47,0xfe,0x93,0x01,0x78,0x01,0x08,0x01,0x28,0x11,0x99,0x8a,0xbe,0xbe,0x8a,0x9b,0x2e,0xfd,0xd8,0xfe,0x9f,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xe4,0x04,0x00,0x00,0x19,0x00,0x47,0x40,0x24,0x14,0x19,0x0d,0x07,0x12,0x16,0x84,0x0f,0x0b,0x0b,0x00,0x07,0x84,0x08,0x19,0x84,0x00,0x15,0x0d,0x96,0x12,0x0e,0x0e,0x08,0x10,0x03,\r\n0x96,0x16,0x0b,0x0b,0x08,0x10,0x0f,0x00,0x08,0x15,0x00,0x3f,0x33,0x3f,0x12,0x39,0x2f,0x33,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xc4,0x10,0xc4,0x31,0x30,0x21,0x35,0x10,0x21,0x22,0x06,0x15,0x15,0x23,0x35,0x10,0x25,0x35,0x21,0x35,0x21,0x35,0x33,0x15,0x21,0x15,\r\n0x21,0x15,0x04,0x11,0x15,0x03,0x40,0xfe,0xf5,0x8b,0x89,0xa4,0x01,0x62,0xfe,0xf5,0x01,0x0b,0xa4,0x01,0x0b,0xfe,0xf5,0x01,0x61,0x6b,0x01,0x3c,0xa1,0xa7,0x5f,0x58,0x01,0xac,0x28,0x96,0x86,0xb8,0xb8,0x86,0x97,0x2c,0xfe,0x54,0x53,0x00,0x00,0x02,0x00,0x48,0xff,0xe7,0x05,0x73,0x05,0x9a,0x00,0x16,0x00,0x35,0x00,0x55,0x40,0x18,\r\n0x2b,0x1d,0x7e,0x07,0x10,0x23,0x28,0x23,0x28,0x23,0x04,0x17,0x0f,0x13,0x7d,0x17,0x2e,0x7d,0x08,0x04,0x20,0x25,0x1a,0x2b,0xb8,0x01,0x05,0x40,0x10,0x07,0x10,0x0c,0x07,0x25,0x07,0x25,0x07,0x00,0x0e,0x08,0x03,0x32,0x92,0x00,0x13,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x01,\r\n0x2f,0xc4,0xed,0x2f,0xfd,0xc4,0x11,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0xc4,0xfd,0xcd,0x31,0x30,0x05,0x22,0x24,0x26,0x35,0x34,0x36,0x37,0x01,0x33,0x01,0x17,0x33,0x37,0x01,0x33,0x01,0x16,0x16,0x15,0x14,0x06,0x04,0x01,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x06,\r\n0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x02,0xe9,0xca,0xfe,0xcb,0xa2,0xfe,0xed,0xfe,0x69,0xdc,0x01,0x34,0x36,0x06,0x31,0x01,0x2b,0xca,0xfe,0x88,0xe1,0xfc,0xa4,0xfe,0xd6,0x01,0x1c,0xd1,0xb0,0x46,0x36,0x2a,0x33,0x38,0x43,0x4f,0x4e,0x69,0x7a,0x32,0x39,0xb2,0xdb,0x73,0xf1,0x92,0x8f,0xd8,0x6a,0x19,0x6e,0xc8,0x86,0xad,\r\n0xe5,0x26,0x02,0x3f,0xfe,0x20,0x5e,0x56,0x01,0xe8,0xfd,0xc3,0x26,0xdc,0xa4,0x8d,0xd3,0x70,0x01,0xca,0x88,0xa3,0x0c,0x60,0x71,0x2b,0x21,0x2f,0x1f,0x89,0x1d,0x64,0x59,0x48,0x7f,0x4e,0x14,0xa6,0x82,0x61,0x8f,0x54,0x52,0x95,0x00,0x02,0x00,0x19,0xff,0xe7,0x03,0xb6,0x05,0xed,0x00,0x14,0x00,0x20,0x00,0x3b,0x40,0x1e,0x0e,0x1e,\r\n0x09,0x15,0x84,0x07,0x12,0x00,0x84,0x1b,0x07,0x1b,0x07,0x1b,0x0a,0x11,0x0a,0x0e,0x12,0x1e,0x03,0x0a,0x0a,0x04,0x10,0x00,0x18,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0xc5,0x10,0xfd,0xc5,0xc6,0x32,0x31,0x30,0x25,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,\r\n0x13,0x01,0x33,0x13,0x16,0x17,0x37,0x01,0x33,0x01,0x16,0x16,0x05,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x02,0xa2,0x3c,0x6e,0x45,0x71,0x87,0x8d,0xfe,0xd1,0xbe,0x92,0x20,0x1c,0x13,0x01,0x46,0xb8,0xfe,0x4e,0x4f,0x4f,0xfe,0xba,0x2c,0x27,0x26,0x2c,0x32,0x27,0x28,0x24,0xc6,0x3b,0x68,0x3c,0x7e,0x67,0x79,0x01,\r\n0x07,0x02,0x40,0xfe,0xd5,0x42,0x45,0x2d,0x02,0xe6,0xfc,0x62,0x87,0xb5,0x43,0x2b,0x32,0x32,0x2b,0x23,0x85,0x47,0x59,0x6e,0x00,0x01,0x00,0x5e,0xff,0xe8,0x08,0xaa,0x05,0xb2,0x00,0x32,0x00,0x49,0x40,0x28,0x1e,0x02,0x1e,0x02,0x17,0x09,0x7d,0x30,0x24,0x7d,0x17,0x00,0x21,0x91,0x1b,0x10,0xee,0x02,0x1e,0x1e,0x1b,0x0f,0x2a,0x1f,\r\n0x2a,0x2f,0x2a,0x03,0x2a,0x2a,0x13,0x05,0x1b,0x04,0x2d,0x27,0x91,0x0d,0x13,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x39,0x2f,0x5d,0x12,0x39,0x11,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x01,0x22,0x07,0x35,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x26,0x27,\r\n0x06,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x36,0x37,0x16,0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x06,0x14,0xa8,0x66,0x71,0x9b,0xc5,0x01,0x2e,0xa5,0xa4,0xfe,0xd0,0xc6,0x5e,0xd2,0x5b,0x5a,0xd6,0x5d,0xc5,0xfe,0xcf,0xa4,0xa2,0x01,0x2e,0xc8,0xa1,0x6b,\r\n0x2e,0x8f,0x51,0xdc,0xfe,0xf6,0x01,0x0c,0xf2,0x6f,0xc9,0x3f,0x42,0xc2,0x75,0xef,0x01,0x0f,0xfe,0xf8,0x05,0x1a,0x45,0xb2,0x2b,0xb9,0xfe,0xaa,0xdf,0xd9,0xfe,0xb3,0xb6,0x2c,0x2a,0x29,0x2d,0xb6,0x01,0x4c,0xd8,0xda,0x01,0x57,0xbf,0x2b,0xb2,0x20,0x25,0xfe,0xbc,0xfe,0xf0,0xfe,0xee,0xfe,0xcb,0x35,0x2b,0x2b,0x35,0x01,0x31,0x01,\r\n0x16,0x01,0x11,0x01,0x43,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x06,0xc6,0x04,0x18,0x00,0x2b,0x00,0x47,0x40,0x26,0x0c,0x20,0x0c,0x20,0x06,0x27,0x83,0x1b,0x11,0x83,0x06,0x1e,0x0e,0xec,0x09,0x00,0xec,0x20,0x0c,0x0c,0x09,0x16,0x40,0x09,0x0c,0x48,0x16,0x16,0x02,0x23,0x09,0x10,0x18,0x14,0x95,0x2a,0x02,0x16,0x00,0x3f,0x33,0xed,\r\n0x32,0x3f,0x33,0x12,0x39,0x2f,0x2b,0x12,0x39,0x11,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x25,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x00,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,\r\n0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x03,0x96,0x93,0xaf,0x98,0xe4,0x78,0x01,0x0a,0xdc,0x80,0x67,0x69,0x82,0x93,0xa7,0xc1,0xa7,0xa5,0x7f,0x80,0xa2,0xa9,0xbf,0xa5,0x93,0x83,0x69,0x6a,0x7e,0x90,0xdd,0x77,0xfe,0xf3,0xe6,0xae,0x42,0x5a,0x84,0xf3,0x9b,0xf6,0x01,0x28,0x30,0xaa,0x49,0xd2,0xb9,0xb9,0xcf,0x63,0x63,0xd0,0xb8,0xb8,\r\n0xd3,0x49,0xaa,0x30,0x87,0xf7,0xa0,0xef,0xfe,0xdd,0x00,0x02,0xff,0xf3,0x00,0x00,0x04,0x5a,0x05,0xb2,0x00,0x14,0x00,0x1d,0x00,0x2d,0x40,0x17,0x00,0x1a,0x7e,0x08,0x08,0x0e,0x04,0x7d,0x15,0x0e,0x19,0x91,0x00,0x00,0x08,0x0c,0x92,0x11,0x04,0x1a,0x91,0x08,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0xed,\r\n0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x01,0x86,0x01,0x1d,0xcb,0xec,0xf5,0xda,0xfe,0x53,0x4a,0x51,0x26,0x2a,0x2f,0x3e,0x8e,0x98,0x02,0x23,0xa1,0x9d,0xe5,0xe7,0x9a,0xa2,0x03,\r\n0x3a,0xd0,0xbe,0xc5,0xe7,0x04,0x05,0x9f,0x83,0x15,0x8e,0x12,0xce,0xbf,0xfd,0x7d,0x86,0x7a,0xfd,0xf6,0x8c,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x04,0x19,0x04,0x18,0x00,0x06,0x00,0x1b,0x00,0x2d,0x40,0x17,0x13,0x04,0x84,0x1b,0x1b,0x00,0x0c,0x17,0x83,0x00,0x03,0x95,0x13,0x13,0x0f,0x04,0x95,0x1b,0x15,0x0a,0x95,0x0f,0x10,0x00,\r\n0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x01,0x34,0x23,0x23,0x11,0x33,0x32,0x01,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x03,0x71,0xce,0xf4,0xf6,0xcc,0xfd,0x9a,0x3b,0x4a,0x30,0x24,0x39,0x37,0x83,0x8a,0x01,\r\n0x14,0x9b,0xbb,0xb5,0x91,0xfe,0x38,0x01,0x40,0xaa,0xfe,0xa2,0x02,0x5b,0x50,0x57,0x0f,0x88,0x11,0x99,0x91,0x77,0xa5,0x92,0x92,0xae,0x00,0x03,0x00,0x33,0x00,0x00,0x06,0xa2,0x05,0x9a,0x00,0x03,0x00,0x10,0x00,0x18,0x00,0x40,0x40,0x22,0x0d,0x15,0x7e,0x08,0x04,0x7d,0x11,0x08,0x11,0x08,0x11,0x00,0x0a,0x03,0x7e,0x00,0x14,0x91,\r\n0x0d,0x0d,0x08,0x0b,0x01,0x03,0x00,0x12,0x0a,0x91,0x0b,0x03,0x15,0x91,0x08,0x12,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x32,0x31,0x30,0x21,0x11,0x33,0x11,0x01,0x14,0x06,0x23,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x07,0x10,0x21,\r\n0x23,0x11,0x33,0x32,0x36,0x05,0xfa,0xa8,0xfe,0xb1,0xf5,0xda,0xfe,0x53,0xfe,0x5c,0x02,0x4c,0x01,0x1e,0xcb,0xeb,0xb1,0xfe,0xc3,0xe6,0xe7,0x97,0xa5,0x05,0x9a,0xfa,0x66,0x01,0xac,0xc4,0xe8,0x05,0x02,0x98,0xfd,0xa0,0xd3,0xc5,0x01,0x00,0xfd,0xf6,0x89,0x00,0x00,0x03,0x00,0x1c,0x00,0x00,0x05,0xae,0x04,0x00,0x00,0x03,0x00,0x10,\r\n0x00,0x18,0x00,0x40,0x40,0x22,0x0d,0x16,0x84,0x08,0x04,0x83,0x11,0x08,0x11,0x08,0x11,0x00,0x0a,0x03,0x84,0x00,0x15,0x95,0x0d,0x0d,0x08,0x0b,0x01,0x0f,0x00,0x15,0x0a,0x95,0x0b,0x0f,0x16,0x95,0x08,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x11,0x12,0x39,0x2f,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,\r\n0xed,0x32,0x31,0x30,0x21,0x11,0x33,0x11,0x01,0x14,0x06,0x23,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x32,0x16,0x07,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x05,0x0c,0xa2,0xfe,0xae,0xb6,0x92,0xfe,0x3a,0xfe,0xce,0x01,0xd6,0x01,0x14,0xa0,0xb6,0xa8,0x67,0x6c,0xef,0xef,0xd3,0x04,0x00,0xfc,0x00,0x01,0x40,0x93,0xad,0x03,0x73,0x8d,0xfe,\r\n0x77,0xa6,0x93,0x57,0x55,0xfe,0xa2,0x00,0x00,0x02,0x00,0xbb,0x00,0x00,0x06,0x5d,0x05,0x9a,0x00,0x16,0x00,0x1f,0x00,0x4b,0x40,0x27,0x07,0x0b,0x1c,0x7e,0x04,0x13,0x09,0x13,0x09,0x17,0x03,0x16,0x7e,0x00,0x0f,0x7d,0x17,0x0a,0x15,0x91,0x07,0x03,0x03,0x13,0x01,0x1b,0x91,0x0b,0x0b,0x13,0x05,0x01,0x03,0x00,0x12,0x1c,0x91,0x13,\r\n0x12,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x32,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x11,0x01,0x34,0x26,0x23,0x23,0x11,\r\n0x33,0x32,0x36,0xbb,0xa8,0x01,0x7e,0xa8,0x01,0x67,0xfe,0x99,0x01,0x1a,0xce,0xec,0xfb,0xd7,0xfe,0x56,0xfe,0x82,0x04,0x49,0x9c,0xa5,0xe2,0xe3,0x9c,0xa4,0x05,0x9a,0x95,0x95,0x95,0x98,0xfe,0xcd,0xd2,0xbc,0xc9,0xe3,0x04,0x6d,0xfb,0x93,0x01,0xa2,0x80,0x80,0xfd,0xf6,0x89,0x00,0x00,0x02,0x00,0xa6,0x00,0x00,0x05,0xaa,0x05,0xec,\r\n0x00,0x16,0x00,0x1e,0x00,0x4b,0x40,0x27,0x09,0x17,0x07,0x0b,0x1c,0x84,0x04,0x13,0x13,0x17,0x03,0x16,0x84,0x00,0x0f,0x83,0x17,0x0a,0x15,0x95,0x07,0x03,0x03,0x13,0x01,0x1b,0x95,0x0b,0x0b,0x13,0x05,0x01,0x00,0x00,0x15,0x1c,0x95,0x13,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x12,0x39,0x2f,0xed,0x11,0x12,0x39,0x2f,0x33,0xed,0x32,\r\n0x01,0x2f,0xed,0x2f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x32,0x10,0xc4,0x31,0x30,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x21,0x11,0x21,0x11,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0xa6,0xa4,0x01,0x52,0xa4,0x01,0x1e,0xfe,0xe2,0x01,0x14,0xa2,0xb4,0xb6,0x91,0xfe,\r\n0x39,0xfe,0xae,0x03,0xb8,0x63,0x70,0xef,0xef,0xd3,0x05,0xec,0xc3,0xc3,0xc3,0x8d,0xfd,0xdb,0xa7,0x90,0x91,0xaf,0x04,0x9c,0xfb,0x64,0x01,0x3e,0x55,0x57,0xfe,0xa2,0x00,0x02,0x00,0x60,0xff,0xe8,0x07,0x6a,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x36,0x40,0x1d,0x07,0x7e,0x1c,0x1c,0x0c,0x16,0x7d,0x00,0x0b,0x7e,0x08,0x0c,0x0e,0x91,\r\n0x07,0x07,0x0c,0x09,0x03,0x0c,0x12,0x1f,0x91,0x04,0x04,0x19,0x91,0x12,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x34,0x12,0x24,0x33,0x20,0x00,0x13,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x37,0x10,0x12,0x33,\r\n0x32,0x12,0x11,0x10,0x00,0x23,0x22,0x02,0x60,0x9a,0x01,0x21,0xbf,0x01,0x1b,0x01,0x5b,0x1f,0x01,0x53,0xa8,0xa8,0xfe,0xb2,0xa5,0xfe,0xdb,0xb7,0xcd,0xfe,0xd7,0x9d,0xb0,0xfe,0xe5,0xdf,0xf2,0xfe,0xfd,0xe1,0xe0,0xf0,0x02,0xdf,0xd7,0x01,0x49,0xb3,0xfe,0xae,0xfe,0xd5,0x02,0x65,0xfa,0x66,0x02,0x9e,0xc6,0xfe,0xbb,0xab,0xb7,0x01,\r\n0x59,0xd0,0xfe,0xe9,0xfe,0xce,0x01,0x3b,0x01,0x17,0x01,0x13,0x01,0x36,0xfe,0xcd,0x00,0x02,0x00,0x63,0xff,0xe8,0x05,0xdb,0x04,0x18,0x00,0x13,0x00,0x1b,0x00,0x38,0x40,0x1e,0x06,0x0d,0x84,0x18,0x18,0x0b,0x14,0x83,0x00,0x0a,0x84,0x07,0x0b,0x0d,0x95,0x06,0x06,0x0b,0x08,0x0f,0x0b,0x15,0x1a,0x95,0x03,0x10,0x16,0x95,0x11,0x16,\r\n0x00,0x3f,0xed,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x32,0x31,0x30,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x0e,0x02,0x23,0x22,0x00,0x37,0x10,0x21,0x20,0x11,0x10,0x21,0x20,0x63,0xf0,0xdc,0xca,0xff,0x1b,0x01,0x24,0xa4,0xa4,0xfe,0xde,0x05,\r\n0x6f,0xcb,0x8f,0xe2,0xfe,0xfe,0xa7,0x01,0x2f,0x01,0x36,0xfe,0xce,0xfe,0xcd,0x02,0x04,0xff,0x01,0x15,0xe9,0xd3,0x01,0xa4,0xfc,0x00,0x01,0xd1,0x94,0xde,0x77,0x01,0x24,0xf2,0xfe,0x74,0x01,0x8c,0x01,0x90,0x00,0x02,0x00,0xbc,0x00,0x00,0x07,0x50,0x05,0x9a,0x00,0x0f,0x00,0x17,0x00,0x48,0xb9,0x00,0x14,0x01,0x04,0x40,0x22,0x05,\r\n0x04,0x05,0x15,0x15,0x05,0x04,0x03,0x08,0x0f,0x0b,0x07,0x7e,0x08,0x02,0x91,0x14,0x06,0x91,0x0b,0x14,0x0b,0x14,0x0b,0x08,0x11,0x0d,0x03,0x09,0x03,0x04,0x00,0x08,0x12,0x00,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xed,0x32,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x31,0x30,\r\n0x21,0x03,0x21,0x03,0x23,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x01,0x23,0x06,0x07,0x03,0x21,0x03,0x26,0x06,0x96,0x98,0xfd,0xa0,0x8f,0xbb,0xfb,0xfe,0x15,0xa8,0xa8,0x02,0x25,0xf1,0xae,0x02,0x28,0xfd,0x80,0x04,0x09,0x0e,0xdf,0x01,0xf1,0xe1,0x0b,0x01,0x92,0xfe,0x6e,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,\r\n0x02,0x75,0xfa,0x66,0x04,0xec,0x37,0x29,0xfd,0x9d,0x02,0x63,0x1f,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x05,0xa1,0x04,0x18,0x00,0x1c,0x00,0x27,0x00,0x5d,0x40,0x31,0x0f,0x0b,0x84,0x0c,0x16,0x1d,0x83,0x09,0x07,0x07,0x00,0x0c,0x23,0x1c,0x84,0x11,0x00,0x13,0x95,0x19,0x10,0x01,0x02,0x0a,0x95,0x0f,0x24,0x96,0x11,0x02,0x0c,0x0f,\r\n0x16,0x11,0x0d,0x0f,0x11,0x0f,0x11,0x0c,0x0d,0x0f,0x00,0x0c,0x15,0x20,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x33,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x11,0x33,0x3f,0xed,0x01,0x2f,0x33,0xed,0x33,0x2f,0x12,0x39,0x2f,0xcd,0xfd,0xc4,0x10,0xed,0x32,0x31,0x30,0x21,0x35,0x23,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x37,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x25,0x10,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x07,0x06,0x06,0x04,0xfd,0x04,0x67,0xd4,0x97,0xaf,0x38,0xfe,0x9a,0xa4,0xa4,0x02,0x71,0x01,0x42,0xd3,0x60,0xa0,0x4e,0x93,0xc9,0x01,0x69,0xfd,0x7f,0x6b,0x59,0x7a,\r\n0x9f,0xef,0x88,0x66,0xa0,0xb8,0x9f,0x89,0x74,0x4d,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x2d,0x01,0x05,0x3d,0x41,0xa8,0x60,0xfe,0x82,0xfd,0x66,0x01,0x1c,0x4c,0x5e,0xab,0x83,0x66,0x21,0x14,0x56,0x00,0x00,0x03,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x11,0x00,0x2f,0x40,0x18,0x07,0x0d,0x0e,0x04,0x04,0x0e,\r\n0x0d,0x07,0x04,0x00,0x03,0x00,0x06,0x92,0x0d,0x0d,0x00,0x09,0x01,0x03,0x07,0x92,0x00,0x12,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x33,0x01,0x33,0x01,0x27,0x03,0x21,0x03,0x01,0x23,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x16,0x02,0x26,0xae,0x02,0x28,0xf1,\r\n0xae,0xfe,0x3a,0xa8,0x01,0x8d,0x04,0x08,0x08,0x08,0x97,0x01,0x62,0x99,0x08,0x06,0x05,0x9a,0xfa,0x66,0x91,0x01,0xd2,0xfe,0x2e,0x04,0x5b,0x23,0x2b,0x14,0xfe,0x62,0x01,0xa0,0x17,0x2c,0x00,0x03,0x00,0x0a,0x00,0x00,0x03,0xc7,0x04,0x00,0x00,0x03,0x00,0x07,0x00,0x0f,0x00,0x2f,0x40,0x18,0x04,0x0b,0x0c,0x05,0x05,0x0c,0x0b,0x04,\r\n0x04,0x00,0x01,0x00,0x07,0x96,0x0b,0x0b,0x01,0x08,0x02,0x0f,0x04,0x96,0x01,0x15,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x31,0x30,0x21,0x21,0x01,0x33,0x01,0x21,0x03,0x21,0x13,0x06,0x07,0x07,0x33,0x27,0x26,0x27,0x03,0xc7,0xfc,0x43,0x01,0x98,0xa1,0xfe,0xa0,0x02,0x05,\r\n0x71,0xfe,0xe3,0x8c,0x05,0x1a,0x43,0xcb,0x40,0x14,0x10,0x04,0x00,0xfc,0x7b,0x01,0x44,0x01,0xb8,0x44,0x47,0xb9,0xb5,0x34,0x5b,0x00,0x00,0x04,0x00,0x29,0x00,0x00,0x05,0xaa,0x05,0x9a,0x00,0x14,0x00,0x1b,0x00,0x1f,0x00,0x24,0x00,0x69,0x40,0x38,0x16,0x14,0x1c,0x0b,0x7e,0x0c,0x24,0x0c,0x15,0x02,0x7e,0x19,0x00,0x23,0x14,0x0c,\r\n0x19,0x1d,0x01,0x01,0x1d,0x19,0x0c,0x14,0x23,0x00,0x07,0x06,0x11,0x06,0x0a,0x0e,0x92,0x23,0x1c,0x23,0x1f,0x20,0x92,0x14,0x19,0x02,0x14,0x23,0x14,0x23,0x14,0x00,0x0c,0x07,0x11,0x12,0x16,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,\r\n0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xfd,0xcd,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0x31,0x30,0x13,0x21,0x01,0x16,0x16,0x12,0x17,0x23,0x26,0x27,0x21,0x11,0x23,0x11,0x21,0x06,0x07,0x23,0x12,0x00,0x37,0x01,0x21,0x13,0x16,0x17,0x36,0x36,0x13,0x21,0x26,0x27,0x27,0x06,0x06,0x07,0x21,0xa5,0x04,0x9f,0xfe,\r\n0x52,0x9e,0xcb,0x7e,0x2d,0xbf,0x10,0x31,0xfe,0x98,0xa8,0xfe,0x8c,0x2c,0x10,0xc1,0x2f,0x01,0x01,0xe9,0x01,0xe5,0xfd,0x9f,0xf8,0x23,0x11,0x11,0x0e,0x31,0x01,0x25,0x6e,0xb7,0xa8,0x68,0x8b,0x3e,0x01,0x31,0x05,0x9a,0xfd,0x60,0x36,0xb2,0xfe,0xea,0xfc,0xb1,0x6b,0xfe,0xe4,0x01,0x1c,0x6d,0xaf,0x01,0x4a,0x01,0x6c,0x46,0x02,0x06,\r\n0xfe,0x6a,0x37,0x39,0x33,0x1a,0xfe,0x58,0x9c,0x33,0x02,0x1f,0x5b,0x57,0x00,0x04,0x00,0x1e,0x00,0x00,0x04,0x66,0x04,0x00,0x00,0x15,0x00,0x1c,0x00,0x21,0x00,0x26,0x00,0x6d,0x40,0x0c,0x20,0x17,0x0e,0x22,0x04,0xef,0x05,0x21,0x05,0x23,0x16,0x11,0xb8,0x01,0x2e,0x40,0x2a,0x1a,0x0f,0x0e,0x05,0x1a,0x10,0x10,0x1a,0x05,0x0e,0x0f,\r\n0x05,0x0a,0x15,0x0a,0x03,0x07,0x96,0x20,0x22,0x20,0x26,0x1d,0x96,0x0e,0x11,0x1a,0x0e,0x0f,0x20,0x0e,0x20,0x0e,0x0a,0x17,0x95,0x0f,0x0f,0x05,0x00,0x0a,0x15,0x00,0x3f,0x33,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,\r\n0x2f,0x10,0xfd,0xcd,0xcd,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0xcd,0x31,0x30,0x21,0x26,0x27,0x23,0x15,0x23,0x35,0x21,0x06,0x07,0x23,0x3e,0x02,0x37,0x01,0x21,0x01,0x1e,0x02,0x17,0x01,0x21,0x17,0x16,0x17,0x36,0x36,0x07,0x06,0x06,0x07,0x3b,0x02,0x26,0x26,0x27,0x03,0xb8,0x0a,0x21,0xf9,0x9c,0xff,0x00,0x1a,0x11,0xaf,0x24,0x60,\r\n0x98,0x74,0xfe,0xc2,0x03,0xb5,0xfe,0xb8,0x73,0x9b,0x5e,0x1d,0xfe,0xb0,0xfe,0x6f,0x9f,0x1c,0x08,0x03,0x0a,0x5d,0x3a,0x5a,0x2d,0xc1,0x9c,0xb9,0x35,0x4c,0x38,0x74,0x4e,0xc2,0xc2,0x40,0x82,0xbe,0xc9,0x81,0x23,0x01,0xd5,0xfe,0x29,0x24,0x8a,0xcd,0xae,0x03,0x79,0xff,0x2b,0x17,0x08,0x11,0x9d,0x12,0x37,0x35,0x3a,0x30,0x12,0x00,\r\n0x00,0x03,0x00,0xbc,0x00,0x00,0x07,0x50,0x05,0x9a,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x49,0x40,0x27,0x08,0x04,0x7e,0x05,0x14,0x0e,0x7e,0x0f,0x02,0x01,0x02,0x15,0x0c,0x0c,0x15,0x02,0x01,0x04,0x00,0x05,0x00,0x0e,0x03,0x91,0x14,0x08,0x08,0x01,0x11,0x0a,0x03,0x06,0x03,0x05,0x12,0x0f,0x92,0x01,0x12,0x00,0x3f,0xed,0x3f,0x3f,\r\n0x3f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x10,0xc5,0xfd,0xcd,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x03,0x21,0x03,0x01,0x23,0x06,0x07,0x03,0x21,0x03,0x26,0x07,0x50,0xfb,0x04,0xfb,0xfe,0x15,0xa8,0xa8,0x02,0x25,0xf1,0xae,\r\n0x01,0x37,0xbe,0xfe,0x5a,0xb8,0x01,0x8d,0x04,0x09,0x0e,0x83,0x01,0x38,0x84,0x09,0x02,0x8e,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0xf7,0x01,0xfd,0xfe,0x03,0x04,0x5b,0x37,0x29,0xfe,0x99,0x01,0x67,0x1b,0x00,0x00,0x03,0x00,0xa6,0x00,0x00,0x05,0xd0,0x04,0x00,0x00,0x0b,0x00,0x0f,0x00,0x17,0x00,0x4d,0x40,0x2a,0x08,0x04,\r\n0x84,0x05,0x01,0x02,0x0c,0x13,0x14,0x0d,0x0d,0x14,0x13,0x0c,0x02,0x01,0x06,0x00,0x05,0x00,0x0f,0x96,0x13,0x03,0x95,0x08,0x13,0x08,0x13,0x08,0x01,0x10,0x0a,0x0f,0x06,0x0f,0x05,0x15,0x0c,0x96,0x01,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,\r\n0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x32,0x31,0x30,0x21,0x21,0x13,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x13,0x33,0x01,0x21,0x03,0x21,0x13,0x06,0x07,0x07,0x33,0x26,0x26,0x27,0x05,0xd0,0xfc,0x43,0xba,0xfe,0x7d,0xa4,0xa4,0x01,0xba,0xa7,0xa1,0xfe,0xa0,0x02,0x05,0x71,0xfe,0xe3,0x8c,0x06,0x18,0x44,0xcb,0x2c,0x2c,0x0c,0x01,0xd1,0xfe,\r\n0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfc,0x7b,0x01,0x44,0x01,0xb8,0x47,0x44,0xb9,0x7b,0x7c,0x4d,0x00,0x00,0x01,0x00,0x1e,0xfe,0x29,0x05,0xfe,0x05,0x9a,0x00,0x1a,0x00,0x2f,0x40,0x17,0x1a,0x7e,0x02,0x00,0x00,0x0b,0x14,0x0b,0x19,0x18,0x01,0x02,0x02,0x12,0x15,0x12,0x12,0x03,0x0e,0x91,0x00,0x08,0x13,0x00,0x3f,0xc6,0xed,0x3f,\r\n0x3f,0x12,0x39,0x11,0x33,0x33,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x06,0x07,0x03,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x23,0x01,0x26,0x27,0x23,0x11,0x03,0x4d,0x05,0x0e,0x1a,0xe0,0x2c,0x8c,0x6d,0x6b,0x85,0x0d,0xa1,0x0d,0x51,0x2c,0x3c,0x1f,0x01,0xb4,\r\n0x9a,0x02,0x0c,0xc0,0xfe,0xe4,0x1d,0x0a,0x05,0xfe,0x29,0x05,0xc9,0x60,0x47,0xfd,0xa3,0x89,0x7e,0x7b,0x80,0x64,0x4b,0x51,0x04,0x80,0xfa,0x66,0x03,0x44,0x5c,0x52,0xfa,0x37,0x00,0x01,0x00,0x05,0xfe,0x29,0x04,0xd0,0x04,0x00,0x00,0x1a,0x00,0x30,0x40,0x18,0x1a,0xef,0x02,0x00,0x00,0x0a,0x14,0x0a,0x19,0x18,0x01,0x02,0x02,0x12,\r\n0x15,0x15,0x12,0x0f,0x0e,0x95,0x08,0x16,0x00,0x1b,0x00,0x3f,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x11,0x33,0x33,0x33,0x01,0x2f,0x2f,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x01,0x11,0x23,0x06,0x07,0x03,0x06,0x06,0x23,0x22,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x26,0x27,0x23,0x11,0x02,0xa3,0x05,0x0f,0x12,\r\n0x81,0x2f,0x78,0x5c,0xd5,0x1f,0x9d,0x05,0x29,0x29,0x27,0x39,0x22,0x01,0x2a,0x9d,0x01,0x8e,0xaa,0xbd,0x1a,0x0b,0x05,0xfe,0x29,0x04,0x86,0x54,0x36,0xfe,0xaf,0x85,0x68,0xeb,0x30,0x2d,0x43,0x56,0x02,0xf2,0xfc,0x00,0x02,0x16,0x58,0x41,0xfb,0x7a,0x00,0x01,0x00,0x3e,0xfe,0x7f,0x05,0x34,0x05,0x9a,0x00,0x0b,0x00,0x2a,0x40,0x15,\r\n0x05,0x7e,0x02,0x02,0x06,0x0b,0x7f,0x00,0x09,0x7e,0x06,0x00,0x0a,0x07,0x03,0x03,0x05,0x01,0x91,0x0a,0x12,0x00,0x3f,0xed,0x32,0x3f,0x33,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x3e,0xc0,0xa8,0x02,0xe6,0xa8,0xfb,0xa5,0xfe,0x7f,0x02,0x19,\r\n0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0x66,0xfe,0x7f,0x00,0x01,0x00,0x3e,0xfe,0x8b,0x04,0x27,0x04,0x00,0x00,0x0b,0x00,0x2a,0x40,0x15,0x05,0x84,0x02,0x02,0x06,0x0b,0xed,0x00,0x09,0x84,0x06,0x00,0x0a,0x07,0x03,0x0f,0x05,0x01,0x95,0x0a,0x15,0x00,0x3f,0xed,0x32,0x3f,0x33,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,\r\n0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x3e,0x97,0xa4,0x02,0x0a,0xa4,0xfc,0xa4,0xfe,0x8b,0x02,0x00,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x00,0xfe,0x8b,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x06,0xc6,0x05,0x9a,0x00,0x0f,0x00,0x15,0x00,0x3d,0x40,0x1f,0x14,0x07,0x01,0x7e,0x15,0x03,0x7f,0x04,0x15,0x04,\r\n0x15,0x04,0x0e,0x07,0x7f,0x08,0x0e,0x04,0x08,0x06,0x00,0x11,0xee,0x0d,0x03,0x01,0x14,0x09,0x91,0x06,0x12,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x10,0xcd,0x32,0x01,0x2f,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,0x30,0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,\r\n0x15,0x21,0x21,0x06,0x02,0x07,0x21,0x04,0x87,0xc1,0x9b,0xfb,0xfd,0x9b,0x6f,0x92,0xc8,0x0c,0x04,0xe2,0xfd,0x19,0xfe,0x94,0x0e,0xb9,0x78,0x02,0xab,0x04,0xfe,0xfb,0x9a,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x0d,0x02,0xba,0x01,0x3b,0x9c,0xe5,0xfd,0x66,0xe7,0x00,0x02,0x00,0x12,0xfe,0x8b,0x05,0x20,0x04,0x00,0x00,0x0f,\r\n0x00,0x15,0x00,0x3d,0x40,0x1f,0x14,0x07,0x01,0x84,0x15,0x03,0xed,0x04,0x15,0x04,0x15,0x04,0x0e,0x07,0xed,0x08,0x0e,0x04,0x08,0x06,0x00,0x11,0x95,0x0d,0x0f,0x01,0x14,0x09,0x95,0x06,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x10,0xcd,0x32,0x01,0x2f,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,\r\n0x30,0x01,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x35,0x21,0x15,0x21,0x23,0x06,0x02,0x07,0x21,0x03,0x8b,0x98,0x8b,0xfd,0x06,0x8c,0x5b,0x7d,0x8d,0x03,0xa9,0xfd,0xc7,0xe3,0x0a,0x79,0x66,0x01,0xcc,0x03,0x74,0xfd,0x17,0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0xb0,0x01,0xc9,0xfc,0x8c,0xc5,0xfe,0x7d,0xa1,\r\n0x00,0x01,0x00,0x10,0xff,0xe9,0x06,0xe3,0x05,0x9a,0x00,0x17,0x00,0x24,0x40,0x12,0x17,0x7e,0x00,0x00,0x0a,0x14,0x0a,0x16,0x02,0xee,0x13,0x03,0x0e,0x91,0x08,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x21,0x07,0x06,0x02,0x02,0x06,0x23,0x22,0x27,0x35,0x16,0x16,\r\n0x33,0x32,0x36,0x12,0x12,0x13,0x21,0x15,0x21,0x11,0x03,0xfc,0xfe,0x71,0x20,0x1e,0x46,0x57,0x8e,0x6b,0x4d,0x3c,0x12,0x47,0x18,0x44,0x4f,0x4b,0x55,0x2e,0x05,0x01,0xfd,0xc1,0x04,0xfe,0xf9,0xe7,0xfe,0x48,0xfe,0xfa,0x77,0x15,0x9e,0x0b,0x12,0x6e,0x01,0x26,0x02,0x1c,0x01,0x6b,0x9c,0xfb,0x02,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,\r\n0x05,0x26,0x04,0x00,0x00,0x11,0x00,0x24,0x40,0x12,0x11,0x84,0x00,0x00,0x07,0x0e,0x07,0x10,0x02,0x95,0x0d,0x0f,0x0a,0x95,0x05,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x23,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x13,0x21,0x15,0x21,0x11,0x02,0xee,\r\n0xee,0x28,0xc1,0xaf,0x38,0x20,0x1f,0x2d,0x6d,0x8b,0x23,0x03,0xaf,0xfe,0x6b,0x03,0x74,0xfe,0x21,0xfe,0x5d,0x0e,0x8d,0x12,0x01,0xbf,0x01,0xc6,0x8c,0xfc,0x8c,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x08,0xb1,0x05,0x9a,0x00,0x1f,0x00,0x3f,0x40,0x1f,0x07,0x06,0x03,0x01,0x7e,0x02,0x02,0x14,0x1e,0x10,0x13,0x7e,0x14,0x00,0xee,0x1d,\r\n0x1d,0x15,0x0f,0x07,0x06,0x10,0x19,0x10,0x14,0x15,0x03,0x0c,0x02,0x14,0x12,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x39,0x11,0x33,0x33,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x32,0x2f,0x12,0x39,0x2f,0xed,0x33,0x33,0x33,0x31,0x30,0x01,0x11,0x23,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x15,\r\n0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x01,0x21,0x15,0x06,0x72,0xa7,0x02,0x0c,0x04,0x0d,0x10,0x0e,0xfe,0x16,0x52,0xfe,0x17,0x13,0x17,0x05,0x08,0xa2,0xde,0x01,0xb8,0x31,0x11,0x06,0x29,0x1a,0x01,0xc4,0x03,0x10,0x04,0xfe,0xfb,0x02,0x03,0xc2,0x20,0x39,0xbe,0x2e,0x3f,0x1e,0xfb,0xb2,0x04,0x46,0x2d,0x66,0x6a,0xaf,\r\n0xfc,0x40,0x05,0x9a,0xfc,0x18,0x70,0x3c,0x70,0x3c,0x03,0xe8,0x9c,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0x8d,0x04,0x00,0x00,0x17,0x00,0x34,0x40,0x1a,0x17,0x84,0x00,0x00,0x0a,0x14,0x09,0xed,0x0a,0x16,0x95,0x13,0x13,0x0b,0x01,0x08,0x0f,0x08,0x0a,0x0b,0x0f,0x00,0x0a,0x15,0x05,0x15,0x00,0x3f,0x3f,0x33,0x3f,0x12,0x39,0x39,\r\n0x11,0x33,0x11,0x33,0x10,0xed,0x01,0x2f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x06,0x01,0x23,0x01,0x26,0x27,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x37,0x01,0x21,0x15,0x21,0x11,0x04,0x56,0x10,0x26,0xfe,0xf2,0x93,0xfe,0xf8,0x2d,0x17,0x8d,0xd1,0x01,0x0e,0x3e,0x0a,0x04,0x0f,0x26,0x01,0x18,0x02,0x6f,\r\n0xfe,0x6b,0x03,0x4c,0x2f,0x6a,0xfd,0x4d,0x02,0x90,0x74,0x48,0xfc,0xb4,0x04,0x00,0xfd,0x64,0x9a,0x2f,0x39,0x5d,0x02,0xcf,0x8c,0xfc,0x8c,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x28,0x40,0x14,0x15,0x7d,0x09,0x21,0x1b,0x7d,0x03,0x0f,0x00,0x06,0x06,0x0c,0x18,0x91,0x12,0x04,\r\n0x1e,0x91,0x0c,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,0x2f,0xc4,0xed,0x2f,0xc6,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x02,0x30,0x41,0x42,0x31,\r\n0x30,0x42,0x41,0x37,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x23,0x01,0x71,0xfe,0x89,0xfe,0xd7,0xe1,0xfe,0xe5,0x01,0x0f,0xe1,0xef,0x01,0x0d,0xfe,0xf5,0x02,0x70,0x3c,0x30,0x2b,0x3e,0x39,0x30,0x2e,0x3e,0xfd,0x78,0x01,0x90,0x01,0x44,0x01,0x5a,0x01,0x9c,0xfe,0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x05,0x32,0xfe,0xbb,0xfe,\r\n0xf6,0xfe,0xfb,0xfe,0xb9,0x01,0x36,0x01,0x13,0x01,0x20,0x01,0x32,0x00,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x24,0x00,0x28,0x40,0x14,0x15,0x83,0x09,0x22,0x1c,0x83,0x03,0x0f,0x00,0x06,0x06,0x0c,0x19,0x95,0x12,0x10,0x1f,0x95,0x0c,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x01,\r\n0x2f,0xc4,0xed,0x2f,0xc6,0xed,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x12,0x17,0x14,0x06,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x58,0x29,0x38,0x3a,0x27,0x2a,0x37,0x35,0x32,0xe7,0xfe,0xf5,0x01,0x1c,0xee,0xe6,0xfe,0x02,\r\n0x83,0xe1,0x8e,0x9e,0xb8,0xb6,0xa0,0xa0,0xaa,0xac,0x01,0xaa,0x38,0x2a,0x2d,0x32,0x37,0x28,0x27,0x3b,0xfe,0x3e,0x01,0x23,0xe9,0x01,0x04,0x01,0x20,0xfe,0xe6,0xfa,0xaa,0xf1,0x81,0x03,0xa6,0xd7,0xbd,0xb2,0xd6,0xd0,0xbc,0xc2,0xce,0x00,0x00,0x04,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,\r\n0x00,0x32,0x40,0x19,0x2d,0x27,0x15,0x7d,0x21,0x1b,0x7d,0x09,0x03,0x0f,0x24,0x00,0x00,0x2a,0x06,0x06,0x0c,0x18,0x91,0x12,0x04,0x1e,0x91,0x0c,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xc4,0xc4,0xed,0x2f,0xed,0xc4,0xc6,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x13,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x01,0x22,0x00,0x11,0x10,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x34,0x2c,0x3d,0x3e,0x2d,0x30,0x3a,0x3c,0x9a,0xfe,0xd0,0xfe,0x90,0x01,0x75,0x01,0x43,0x01,0x23,0x01,0x71,0xfe,0x89,0xfe,0xd7,0xe1,0xfe,\r\n0xe5,0x01,0x0f,0xe1,0xef,0x01,0x0d,0xfe,0xf5,0x1e,0x2c,0x3d,0x3e,0x2d,0x30,0x3a,0x3c,0x02,0x70,0x3c,0x30,0x2e,0x3b,0x3e,0x2b,0x2d,0x3f,0xfd,0x78,0x01,0x90,0x01,0x44,0x01,0x5a,0x01,0x9c,0xfe,0x75,0xfe,0xb8,0xfe,0x9d,0xfe,0x6c,0x05,0x32,0xfe,0xbb,0xfe,0xf6,0xfe,0xfb,0xfe,0xb9,0x01,0x36,0x01,0x13,0x01,0x20,0x01,0x32,0xfd,\r\n0x56,0x3c,0x30,0x2e,0x3b,0x3e,0x2b,0x2d,0x3f,0x00,0x00,0x04,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x0b,0x00,0x18,0x00,0x24,0x00,0x30,0x00,0x32,0x40,0x19,0x2e,0x28,0x15,0x83,0x09,0x22,0x1c,0x83,0x03,0x0f,0x25,0x00,0x00,0x2b,0x06,0x06,0x0c,0x19,0x95,0x12,0x10,0x1f,0x95,0x0c,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,\r\n0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xc4,0xed,0x2f,0xc4,0xed,0xc4,0xc6,0x31,0x30,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x00,0x35,0x10,0x00,0x33,0x32,0x12,0x17,0x14,0x06,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,\r\n0x06,0x01,0xc9,0x28,0x34,0x37,0x25,0x25,0x38,0x37,0x63,0xe7,0xfe,0xf5,0x01,0x1c,0xee,0xe6,0xfe,0x02,0x83,0xe1,0x8e,0x9e,0xb8,0xb6,0xa0,0xa0,0xaa,0xac,0x16,0x28,0x34,0x37,0x25,0x25,0x38,0x37,0x01,0xaf,0x37,0x26,0x2b,0x30,0x31,0x2a,0x28,0x35,0xfe,0x39,0x01,0x23,0xe9,0x01,0x04,0x01,0x20,0xfe,0xe6,0xfa,0xaa,0xf1,0x81,0x03,\r\n0xa6,0xd7,0xbd,0xb2,0xd6,0xd0,0xbc,0xc2,0xce,0xfe,0x21,0x37,0x26,0x2b,0x30,0x31,0x2a,0x28,0x35,0x00,0x00,0x05,0x00,0x5e,0xff,0xe8,0x09,0x58,0x05,0xb2,0x00,0x1d,0x00,0x2b,0x00,0x37,0x00,0x43,0x00,0x4f,0x00,0x3f,0x40,0x20,0x21,0x7d,0x35,0x35,0x0c,0x4d,0x47,0x1a,0x7d,0x28,0x41,0x3b,0x2f,0x7d,0x0c,0x44,0x38,0x38,0x4a,0x3e,\r\n0x3e,0x09,0x1e,0x2c,0x91,0x0f,0x04,0x25,0x32,0x91,0x09,0x13,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xed,0xc4,0xc4,0x2f,0xed,0xc4,0xc6,0x12,0x39,0x2f,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x27,0x23,0x06,0x07,0x06,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x04,0x17,0x33,0x3e,0x02,0x33,\r\n0x20,0x00,0x11,0x10,0x07,0x06,0x01,0x22,0x02,0x11,0x14,0x12,0x16,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x21,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x35,0x10,0x02,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0xe8,0x7b,0xc7,0x98,0x2f,0x08,0x27,\r\n0x36,0x9e,0xfe,0xe7,0xfe,0xea,0xfe,0xb1,0x01,0x55,0x01,0x26,0xb8,0x01,0x0a,0x3e,0x08,0x24,0x9d,0xd9,0x83,0x01,0x0e,0x01,0x4c,0xaa,0xa8,0xfe,0xed,0xca,0xf6,0x69,0xc2,0x8a,0xcd,0xf3,0x67,0xc5,0xfb,0x52,0xc8,0xf8,0xf4,0xc1,0xdb,0xe5,0xef,0xcd,0x2d,0x3c,0x40,0x2a,0x2b,0x40,0x3d,0x03,0xf6,0x2b,0x3e,0x3f,0x2b,0x2b,0x40,0x3c,\r\n0x18,0x4e,0x9d,0x7b,0x68,0x3d,0xc1,0x01,0x91,0x01,0x44,0x01,0x59,0x01,0x9c,0xbb,0xa6,0x66,0xa8,0x53,0xfe,0x70,0xfe,0xbd,0xfe,0x9f,0xca,0xcc,0x05,0x32,0xfe,0xb7,0xfe,0xfc,0xac,0xfe,0xf5,0x97,0x01,0x2e,0x01,0x1b,0xbb,0x01,0x0a,0x8d,0xfe,0xba,0xfe,0xf7,0xfe,0xf3,0xfe,0xc1,0x01,0x41,0xfe,0x01,0x2f,0x01,0x2d,0xfd,0x56,0x3f,\r\n0x2d,0x30,0x39,0x39,0x30,0x2e,0x3e,0x3b,0x31,0x30,0x39,0x39,0x30,0x2e,0x3e,0x00,0x00,0x05,0x00,0x60,0xff,0xe8,0x06,0xdc,0x04,0x18,0x00,0x1b,0x00,0x28,0x00,0x34,0x00,0x40,0x00,0x4c,0x00,0x4b,0x40,0x28,0x3e,0x83,0x38,0x20,0x83,0x32,0x4a,0x83,0x44,0x38,0x32,0x44,0x44,0x32,0x38,0x03,0x0c,0x19,0x83,0x26,0x2c,0x83,0x0c,0x41,\r\n0x35,0x35,0x47,0x3b,0x3b,0x08,0x1c,0x29,0x95,0x0f,0x10,0x23,0x2f,0x95,0x08,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0x33,0x11,0x33,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x26,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x00,\r\n0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x12,0x17,0x14,0x02,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x0e,\r\n0x57,0x89,0x6d,0x25,0x04,0x2a,0xbe,0x8c,0x86,0xc6,0x78,0x01,0x08,0xd1,0x84,0xbd,0x29,0x04,0x32,0xc4,0x86,0xca,0xee,0x01,0xfb,0xc9,0x5f,0x86,0x41,0x99,0x8d,0x88,0x94,0x94,0xfc,0x8e,0x85,0xa1,0x9d,0x89,0x84,0x98,0x95,0x8c,0x24,0x34,0x32,0x26,0x23,0x35,0x32,0x02,0xc4,0x25,0x33,0x32,0x26,0x23,0x35,0x32,0x18,0x32,0x66,0x57,\r\n0x71,0x7e,0x7a,0xea,0xa8,0x01,0x0b,0x01,0x19,0x7e,0x70,0x75,0x79,0xfe,0xe2,0xf6,0xf5,0xfe,0xd9,0x03,0xa6,0x6b,0xad,0x78,0xb2,0xda,0xce,0xbe,0xc2,0xce,0xd3,0xc1,0xb5,0xd3,0xc8,0xc9,0xbb,0xd0,0xfe,0x1c,0x38,0x2a,0x2a,0x35,0x33,0x2c,0x29,0x39,0x39,0x29,0x2a,0x35,0x33,0x2c,0x29,0x39,0x00,0x0f,0x00,0x7e,0xff,0xe7,0x05,0xd7,\r\n0x05,0xb3,0x00,0x2a,0x00,0x36,0x00,0x42,0x00,0x4e,0x00,0x5a,0x00,0x66,0x00,0x72,0x00,0x7e,0x00,0x8a,0x00,0x96,0x00,0xa2,0x00,0xae,0x00,0xba,0x00,0xc6,0x00,0xd2,0x01,0x3c,0xb1,0xbe,0x82,0xb8,0x01,0x04,0x40,0x0f,0x0f,0x09,0x07,0x11,0x07,0x58,0x7f,0x52,0x34,0x64,0x7f,0x5e,0x2e,0x5e,0xa6,0xb8,0x01,0x04,0xb4,0xa0,0x16,0x02,\r\n0xca,0x8e,0xb8,0x01,0x04,0x40,0x0d,0x88,0xc4,0x88,0x4c,0x7f,0x46,0x40,0x7c,0x7f,0x76,0x3a,0x76,0xb2,0xb8,0x01,0x04,0xb4,0xac,0x1d,0x26,0x1b,0x28,0xb8,0x01,0x04,0x40,0x1d,0x94,0xd0,0x94,0x70,0x7f,0x6a,0x07,0x52,0x5e,0xa0,0x88,0x46,0x76,0xac,0x94,0x6a,0x6a,0x94,0xac,0x76,0x46,0x88,0xa0,0x5e,0x52,0x07,0x0a,0x0c,0x21,0xbb,\r\n0x01,0x04,0x00,0xb8,0x00,0x9a,0x01,0x04,0xb2,0x0c,0xc7,0xbb,0xb8,0x01,0x05,0x40,0x0c,0x14,0x73,0x5b,0xee,0x61,0x79,0x61,0x8b,0x7f,0x26,0x25,0x09,0xb8,0x01,0x05,0x40,0x0f,0x9d,0xb5,0x9d,0x67,0x43,0x4f,0xee,0x55,0x6d,0x49,0x55,0xcd,0xc1,0xaf,0x97,0xb8,0x01,0x05,0x40,0x2a,0x0f,0x1e,0x1d,0x0f,0x37,0x2b,0xee,0x31,0x3d,0x31,\r\n0x80,0x55,0x01,0x02,0x61,0x7f,0x9d,0xa9,0x55,0xa3,0xc1,0x0f,0x31,0x16,0x16,0x31,0x0f,0xc1,0xa3,0x55,0xa9,0x9d,0x7f,0x61,0x02,0x0b,0x04,0x18,0x14,0x04,0x91,0x85,0xb8,0x01,0x05,0xb2,0x00,0x04,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x10,\r\n0xed,0x32,0x11,0x33,0x33,0x10,0xed,0x32,0x11,0x33,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x10,0xed,0x32,0x32,0x11,0x33,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xed,0x11,0x33,0x10,0xfd,0x32,0xcd,0x32,0x10,0xed,0x11,0x33,\r\n0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x10,0xfd,0x32,0xcd,0x32,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0x11,0x33,0x10,0xcd,0x32,0xed,0x32,0x31,0x30,0x05,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x37,0x32,0x16,0x15,\r\n0x14,0x06,0x07,0x23,0x27,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xe2,0x8f,0x45,0x45,0x8b,0x78,0x94,0x27,0x65,0x76,0x74,0x66,0x26,0x91,\r\n0x7e,0x8a,0x43,0x47,0x8f,0x7a,0x88,0x23,0x1c,0x6f,0x89,0x80,0x6e,0x13,0x14,0x24,0x89,0xfd,0xdc,0x1d,0x2c,0x2b,0x1e,0x1f,0x2d,0x2b,0x01,0x83,0x1d,0x2c,0x2c,0x1d,0x1e,0x2e,0x2b,0xd5,0x1d,0x2c,0x2c,0x1d,0x1d,0x2f,0x2c,0xfe,0x3c,0x1d,0x2d,0x2d,0x1d,0x1e,0x2e,0x2c,0x94,0x1d,0x2c,0x2d,0x1c,0x1e,0x2e,0x2b,0x02,0x73,0x1d,0x2c,\r\n0x2c,0x1d,0x20,0x2b,0x2b,0xfe,0xf0,0x1d,0x2c,0x2b,0x1e,0x1e,0x2e,0x2b,0xfe,0x3b,0x46,0x54,0x56,0x48,0x4b,0x4f,0x4f,0x01,0x55,0x47,0x54,0x57,0x48,0x49,0x51,0x50,0xfd,0x5a,0x47,0x54,0x56,0x49,0x48,0x51,0x50,0x01,0x57,0x47,0x54,0x55,0x4a,0x48,0x51,0x51,0x01,0x58,0x46,0x55,0x56,0x48,0x49,0x51,0x4e,0xfd,0x1d,0x46,0x54,0x56,\r\n0x48,0x49,0x51,0x50,0x01,0x56,0x47,0x54,0x56,0x49,0x49,0x51,0x50,0x19,0x65,0x65,0x9e,0x84,0x60,0x44,0x0f,0x99,0x76,0x77,0x9b,0x11,0x41,0x5d,0x86,0xa1,0x66,0x66,0x9e,0x8a,0x5c,0x41,0x02,0x9f,0x87,0x80,0x98,0x07,0x01,0x44,0x60,0x83,0x9e,0x04,0x5f,0x2a,0x25,0x22,0x2b,0x28,0x25,0x22,0x2d,0x2b,0x24,0x24,0x29,0x28,0x25,0x22,\r\n0x2d,0xfe,0x3e,0x2a,0x26,0x24,0x29,0x27,0x26,0x22,0x2e,0x2b,0x25,0x22,0x2b,0x28,0x25,0x23,0x2d,0xfe,0x3f,0x2b,0x24,0x25,0x28,0x28,0x25,0x22,0x2d,0x01,0xc1,0x2c,0x24,0x23,0x2a,0x2a,0x23,0x23,0x2d,0xfe,0x3f,0x2b,0x24,0x22,0x2b,0x27,0x26,0x22,0x2d,0x01,0x09,0x69,0x59,0x5a,0x65,0x66,0x5a,0x5a,0x67,0x6a,0x59,0x59,0x65,0x64,\r\n0x5c,0x5c,0x65,0x01,0xc2,0x6a,0x58,0x58,0x67,0x64,0x5b,0x5d,0x65,0x69,0x59,0x5a,0x65,0x63,0x5c,0x5f,0x63,0x6a,0x58,0x5a,0x65,0x64,0x5c,0x59,0x68,0x01,0xc2,0x69,0x5a,0x5a,0x65,0x64,0x5c,0x5b,0x67,0x6a,0x59,0x5a,0x65,0x64,0x5c,0x5c,0x66,0x00,0x00,0x01,0xfe,0xc2,0x04,0xd3,0x01,0x3e,0x05,0x87,0x00,0x0f,0x00,0x1a,0x40,0x0a,\r\n0x0b,0x0c,0x03,0x04,0x00,0x40,0x07,0x80,0x0c,0x04,0x00,0x2f,0x33,0x1a,0xdd,0x1a,0xc9,0x01,0x2f,0xc9,0x2f,0xc9,0x31,0x30,0x03,0x22,0x15,0x15,0x23,0x35,0x34,0x33,0x21,0x32,0x15,0x15,0x23,0x35,0x34,0x23,0x70,0x42,0x8c,0x7a,0x01,0x88,0x7a,0x8b,0x42,0x05,0x20,0x31,0x1c,0x2e,0x86,0x88,0x2c,0x1c,0x31,0x00,0x00,0x08,0x00,0x6f,\r\n0xfe,0xb6,0x07,0x72,0x05,0xf8,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3b,0x00,0x47,0x00,0x53,0x00,0x5f,0x00,0x39,0x40,0x1b,0x35,0x59,0x5b,0x37,0x5b,0x29,0x4d,0x4f,0x2b,0x4f,0x1d,0x41,0x43,0x1f,0x43,0x5b,0x4f,0x43,0x43,0x4f,0x5b,0x03,0x07,0x11,0x13,0x05,0x07,0x00,0x2f,0xce,0x2f,0xce,0x12,0x17,0x39,0x2f,0x2f,0x2f,\r\n0x11,0x33,0x10,0xce,0x32,0x11,0x33,0x10,0xce,0x32,0x11,0x33,0x10,0xce,0x32,0x31,0x30,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x03,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x13,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,\r\n0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x01,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x13,0x17,0x23,0x27,0x07,0x23,0x37,0x27,0x33,0x17,0x37,0x33,0x04,0x1d,0x7e,0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x87,0x7e,\r\n0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x01,0xa4,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0x1c,0x7e,0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0xfe,0xdf,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0xfb,0x1c,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0xfe,0xd4,0x7e,\r\n0x60,0x4a,0x4b,0x5f,0x7e,0x88,0x60,0x54,0x53,0x60,0x27,0x7d,0x5f,0x4b,0x4a,0x60,0x7f,0x88,0x60,0x53,0x54,0x60,0x05,0x30,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xf9,0x78,0xba,0x7b,0x7b,0xba,0xc7,0x88,0x88,0x04,0x63,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xfc,0xee,0xb9,0x7b,0x7b,0xb9,0xc8,0x88,0x88,0xfc,0xed,0xba,0x7c,0x7c,0xba,\r\n0xc8,0x89,0x89,0x03,0xcd,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0xfc,0xee,0xb9,0x7b,0x7b,0xb9,0xc8,0x88,0x88,0xfc,0xed,0xba,0x7c,0x7c,0xba,0xc8,0x89,0x89,0x00,0x02,0x01,0x13,0xfe,0x52,0x06,0xce,0x06,0x5b,0x00,0x07,0x00,0x0f,0x00,0x40,0xb1,0x05,0x0b,0xb8,0x01,0x04,0xb3,0x06,0x08,0x01,0x0f,0xb8,0x01,0x04,0x40,0x0c,0x02,0x0c,\r\n0x0d,0x09,0x02,0x06,0x09,0x06,0x09,0x06,0x07,0x0b,0xbc,0x01,0x05,0x00,0x08,0x00,0x04,0x01,0x05,0x00,0x07,0x00,0x2f,0xed,0x2f,0xed,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x01,0x2f,0x33,0xed,0x32,0x2f,0x33,0xed,0x32,0x31,0x30,0x01,0x11,0x23,0x11,0x21,0x11,0x23,0x19,0x02,0x33,0x11,0x21,0x11,0x33,0x11,0x06,0xce,0x60,\r\n0xfb,0x09,0x64,0x64,0x04,0xf7,0x60,0x06,0x5b,0xfe,0x26,0x01,0x80,0xfe,0x80,0x01,0xda,0xf7,0xf7,0x01,0xda,0xfe,0x80,0x01,0x80,0xfe,0x26,0x00,0x00,0x0a,0x00,0x26,0xfe,0x52,0x07,0xbb,0x06,0x5b,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0xae,0xb3,0x28,0x10,0x14,\r\n0x2f,0xb8,0x01,0x04,0xb3,0x2c,0x0b,0x07,0x0f,0xb8,0x01,0x04,0xb4,0x0c,0x04,0x00,0x0c,0x1b,0xb8,0x01,0x04,0x40,0x1f,0x18,0x25,0x1d,0x21,0x14,0x2c,0x02,0x0c,0x09,0x18,0x21,0x21,0x18,0x09,0x0c,0x02,0x2c,0x14,0x07,0x11,0x24,0x20,0x1c,0x29,0x15,0x11,0x19,0x0d,0x2d,0x22,0x16,0xb8,0x01,0x05,0xb4,0x15,0x21,0x15,0x26,0x2a,0xb8,\r\n0x01,0x05,0xb4,0x29,0x25,0x29,0x1e,0x12,0xb8,0x01,0x05,0x40,0x12,0x11,0x1d,0x11,0x2d,0x15,0x29,0x11,0x11,0x29,0x15,0x2d,0x04,0x03,0x18,0x0c,0x2c,0x0a,0x02,0xb8,0x01,0x05,0xb1,0x07,0x03,0x00,0x2f,0x33,0xed,0x32,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x11,0x33,\r\n0x10,0xed,0x32,0x11,0x33,0x33,0x01,0x2f,0x33,0x33,0x2f,0x33,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0x10,0xed,0x11,0x33,0x33,0x31,0x30,0x01,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x03,0x11,0x33,0x11,0x01,0x21,0x35,0x21,0x11,0x21,\r\n0x35,0x21,0x01,0x11,0x33,0x11,0x01,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x05,0x21,0x35,0x21,0x13,0x11,0x33,0x11,0x03,0xbd,0xc0,0xc0,0x64,0xb6,0xb6,0x64,0x64,0xfd,0xd5,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0x03,0x61,0x64,0x02,0x00,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0xfe,0x30,0x01,0xd0,0xfa,0x3b,\r\n0xfe,0x30,0x01,0xd0,0x2d,0x64,0x04,0x8b,0xb6,0x64,0xb6,0xb6,0x64,0xb6,0xf9,0xc7,0x01,0xd0,0xfe,0x30,0x05,0x6c,0x64,0xfc,0x68,0x64,0xfd,0x64,0x01,0xd0,0xfe,0x30,0x05,0x6c,0x64,0xfc,0x68,0x64,0x01,0x36,0x64,0x64,0x64,0xfb,0xca,0x01,0xd0,0xfe,0x30,0x00,0x00,0x02,0x00,0x7d,0x02,0xaf,0x03,0x54,0x05,0xeb,0x00,0x0b,0x00,0x17,\r\n0x00,0x64,0xb2,0x16,0x0c,0x17,0xb8,0x01,0x00,0xb5,0x00,0x14,0x0e,0x12,0x10,0x06,0xb8,0x01,0x00,0x40,0x23,0x11,0x00,0x0e,0x11,0x11,0x0e,0x00,0x03,0x01,0x07,0x05,0x0b,0x01,0x0f,0x0c,0x0b,0x08,0x0b,0x13,0x16,0x01,0x04,0x01,0x0e,0x09,0x0b,0x14,0x01,0x0b,0x01,0x0b,0x01,0x03,0x09,0x03,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,\r\n0x11,0x39,0x11,0x12,0x39,0x11,0x33,0x10,0xc9,0x32,0x11,0x33,0x10,0xc9,0x32,0x01,0x2f,0x33,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xfd,0xc5,0x32,0x11,0x33,0x10,0xed,0xc5,0x32,0x31,0x30,0x13,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x23,0x07,0x27,0x23,0x37,0x33,0x17,0x37,0x33,0x27,0x37,0x23,0x27,0x07,0x23,0x17,0xfa,0x7d,\r\n0xf9,0x73,0x74,0xf7,0x7c,0x7c,0xf8,0x73,0x73,0xf7,0x69,0xb1,0x50,0x50,0xb0,0x58,0x58,0xb0,0x50,0x51,0xb0,0x58,0x04,0x4e,0xd5,0xc8,0xc8,0xd6,0xd6,0xc8,0xc8,0x3d,0x8b,0x8b,0x99,0x99,0x8b,0x8b,0x99,0x00,0x00,0x01,0xfe,0x9c,0x04,0xc2,0x01,0x64,0x05,0xf2,0x00,0x0d,0x00,0x13,0xb6,0x0a,0x04,0x0a,0x04,0x80,0x00,0x07,0x00,0x2f,\r\n0xc9,0x1a,0xcd,0x32,0x01,0x2f,0x2f,0x31,0x30,0x03,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,0x33,0x01,0x4e,0x6c,0x09,0xa2,0x0f,0xc2,0x97,0x9c,0xbb,0x09,0xa2,0x12,0xae,0x05,0x36,0x67,0x55,0x8c,0xa4,0xa5,0x8b,0xbc,0x00,0x01,0xff,0x33,0x04,0x80,0x00,0xce,0x05,0xbe,0x00,0x12,0x00,0x26,0x40,0x10,0x01,0x01,\r\n0x06,0x11,0x00,0x00,0x09,0x06,0x0c,0x40,0x03,0x03,0x10,0x08,0x80,0x00,0x00,0x2f,0x1a,0xcc,0x32,0x39,0x2f,0x1a,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0x12,0x39,0x2f,0x31,0x30,0x13,0x37,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x33,0x03,0x0e,0x1b,0x41,0x35,0x39,0x47,0x76,0x1c,0x1f,0x1d,0x27,\r\n0x15,0x18,0x79,0x46,0x04,0x80,0x77,0x1f,0x46,0x48,0x58,0x3c,0x26,0x21,0x0e,0x09,0x6c,0xfe,0xc2,0x00,0x00,0x01,0x00,0xfc,0x04,0xc2,0x03,0xc4,0x05,0xf2,0x00,0x0d,0x00,0x11,0xb5,0x0a,0x04,0x00,0x07,0x0a,0x04,0x00,0x2f,0x33,0x2f,0xc9,0x01,0x2f,0x2f,0x31,0x30,0x01,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x26,0x27,0x33,0x16,\r\n0x33,0x02,0x5f,0x4e,0x6c,0x09,0xa2,0x0f,0xc2,0x97,0x9c,0xbb,0x09,0xa2,0x12,0xae,0x05,0x36,0x67,0x55,0x8c,0xa4,0xa5,0x8b,0xbc,0x00,0x00,0x01,0x01,0x33,0x04,0x80,0x02,0xce,0x05,0xbe,0x00,0x12,0x00,0x26,0x40,0x10,0x01,0x01,0x06,0x11,0x00,0x00,0x09,0x06,0x0c,0x40,0x03,0x03,0x10,0x08,0x80,0x00,0x00,0x2f,0x1a,0xcc,0x32,0x39,\r\n0x2f,0x1a,0xc9,0x01,0x2f,0xd9,0xc0,0x2f,0x2f,0x12,0x39,0x2f,0x31,0x30,0x01,0x37,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x33,0x03,0x02,0x0f,0x1a,0x41,0x35,0x39,0x47,0x76,0x1c,0x1f,0x1e,0x26,0x15,0x18,0x79,0x46,0x04,0x80,0x77,0x1f,0x46,0x48,0x58,0x3c,0x26,0x21,0x0e,0x09,0x6c,0xfe,0xc2,\r\n0x00,0x02,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x06,0xa2,0x00,0x10,0x00,0x16,0x00,0x42,0x40,0x22,0x15,0x03,0x0c,0x7f,0x09,0x0e,0x7e,0x16,0x09,0x16,0x09,0x16,0x00,0x03,0x7f,0x04,0x10,0x7f,0x00,0x0a,0x0c,0x00,0x04,0x02,0x12,0x91,0x0c,0x03,0x0e,0x15,0x05,0x91,0x02,0x12,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x10,0xcd,0x32,0x10,0xcd,\r\n0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x10,0xc4,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x11,0x35,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x21,0x06,0x02,0x07,0x21,0x04,0xad,0xfb,0xfd,0x9b,0x6f,0xa4,0xc2,0x90,0x02,0x13,0xc1,0xfe,0x97,0xfe,0x94,0x11,0xb6,0x78,0x02,0xab,0xfe,0x7f,\r\n0x01,0x81,0xfe,0x7f,0x02,0x19,0x01,0x31,0x02,0xdb,0x01,0x11,0xed,0xfe,0xf8,0xfa,0xfe,0xfd,0xe7,0x06,0x83,0xf6,0xfd,0x7c,0xf0,0x00,0x00,0x02,0x00,0x12,0xfe,0x8b,0x04,0x23,0x05,0x0e,0x00,0x10,0x00,0x15,0x00,0x40,0x40,0x21,0x14,0x0c,0xed,0x09,0x0e,0x84,0x15,0x09,0x15,0x09,0x15,0x00,0x03,0xed,0x04,0x10,0xed,0x00,0x0a,0x0c,\r\n0x00,0x04,0x02,0x12,0x95,0x0c,0x0f,0x0e,0x14,0x05,0x95,0x02,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x10,0xcd,0x32,0x10,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0xc4,0x31,0x30,0x01,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x11,0x35,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x23,0x02,0x03,0x21,\r\n0x03,0x98,0xfd,0x06,0x8c,0x5c,0x88,0x81,0x90,0x01,0x84,0x98,0xfe,0xc4,0xe3,0x20,0xc9,0x01,0xcc,0xfe,0x8b,0x01,0x75,0xfe,0x8b,0x02,0x00,0xcf,0x01,0xad,0x01,0x15,0xf2,0xfe,0xf2,0xfc,0x8b,0xfe,0x00,0x04,0xea,0xfe,0x4d,0xfe,0xc9,0x00,0x00,0x01,0x00,0x79,0xfe,0x29,0x03,0xde,0x05,0xb2,0x00,0x22,0x00,0x28,0x40,0x15,0x22,0x16,\r\n0x7d,0x0b,0x11,0x1d,0x7d,0x05,0x11,0x16,0x05,0x00,0x04,0x0e,0x02,0x91,0x20,0x13,0x91,0x0e,0x04,0x00,0x3f,0xed,0x2f,0xed,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0xc4,0x31,0x30,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,0x26,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x02,\r\n0x15,0x14,0x04,0x23,0x22,0x27,0x79,0xb7,0xca,0x93,0xa1,0x87,0xc8,0xbf,0xa5,0x01,0x0f,0xe3,0xa5,0x90,0x9e,0xa8,0x88,0xa9,0xa3,0x95,0x98,0x9b,0x48,0xfe,0xf6,0xf4,0xcc,0x9b,0xbf,0x81,0xa4,0x94,0x7d,0xbf,0x8b,0x83,0xff,0x9e,0xd4,0xff,0x33,0xbd,0x58,0xa9,0x89,0x7f,0xd0,0x5e,0x61,0xa0,0xb7,0x76,0xe7,0xfd,0x52,0x00,0x00,0x01,\r\n0x00,0x67,0xfe,0x29,0x03,0x0f,0x04,0x18,0x00,0x23,0x00,0x29,0x40,0x16,0x23,0x18,0x83,0x0c,0x13,0x1e,0x83,0x06,0x13,0x18,0x06,0x00,0x04,0x10,0x03,0x95,0x21,0x1b,0x15,0x95,0x10,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0xc4,0x31,0x30,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x26,\r\n0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x67,0x3d,0x9b,0x50,0x64,0x74,0x6d,0x7d,0x8e,0x85,0x61,0xb3,0x74,0x8e,0x60,0x72,0x88,0x63,0x71,0x62,0x76,0xa0,0x85,0xda,0xbb,0x9b,0x77,0xea,0x2e,0x35,0x7c,0x74,0x5d,0x93,0x4b,0x53,0xd5,0x8d,0x70,\r\n0xb3,0x62,0x2e,0xa6,0x4a,0x81,0x72,0x63,0x90,0x48,0x63,0xc3,0x83,0xb5,0xd9,0x3d,0x00,0x01,0x00,0x60,0xff,0xe8,0x08,0x9a,0x05,0xb2,0x00,0x34,0x00,0x72,0x40,0x3e,0x28,0x7d,0x1d,0x2b,0x08,0x7d,0x06,0x15,0x2f,0x03,0x7e,0x04,0x2c,0x04,0x22,0x18,0x1d,0x15,0x04,0x33,0x32,0x32,0x33,0x04,0x15,0x1d,0x18,0x22,0x07,0x0e,0x34,0x0e,\r\n0x33,0x2f,0x02,0x2f,0x02,0x06,0x18,0x92,0x2b,0x0f,0x04,0x22,0x2d,0x19,0x19,0x04,0x31,0x2d,0x03,0x20,0x92,0x25,0x04,0x12,0x92,0x0c,0x13,0x00,0x04,0x12,0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0x33,0xed,0x32,0x32,0x33,0x11,0x12,0x39,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,\r\n0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xcd,0xed,0xc4,0x10,0xed,0x31,0x30,0x21,0x01,0x23,0x11,0x23,0x11,0x21,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x11,0x33,0x11,\r\n0x33,0x01,0x33,0x01,0x01,0x07,0xb0,0xfd,0xd7,0x2b,0xa8,0xfe,0x9d,0x91,0x7c,0xed,0xa2,0xf6,0x81,0x55,0xc7,0x61,0x9e,0xb4,0xfe,0x8b,0x95,0x89,0x9f,0xaf,0x94,0x7c,0xb9,0xa5,0xa3,0xc9,0xcc,0xea,0x54,0x45,0x01,0x9d,0xa8,0x2b,0x02,0x17,0xd1,0xfd,0xa1,0x02,0x8a,0x02,0xa0,0xfd,0x60,0x02,0xa0,0x5f,0xab,0x80,0xc3,0x6b,0x54,0xb6,\r\n0x40,0x3b,0x96,0x7f,0x01,0x14,0x8b,0x8c,0x7c,0x6f,0x7f,0x71,0xaa,0x58,0xbf,0xa1,0x64,0x9a,0x29,0x02,0x6f,0xfd,0x91,0x02,0x6f,0xfd,0x59,0xfd,0x0d,0x00,0x00,0x01,0x00,0x50,0xff,0xe7,0x07,0x39,0x04,0x19,0x00,0x31,0x00,0x6f,0x40,0x3c,0x30,0x1d,0x84,0x13,0x20,0x00,0x84,0x0b,0x24,0x2d,0x84,0x2e,0x21,0x2e,0x0e,0x13,0x0b,0x2e,\r\n0x28,0x27,0x27,0x28,0x2e,0x0b,0x13,0x0e,0x06,0x05,0x29,0x18,0x05,0x28,0x2c,0x24,0x24,0x2c,0x30,0x0e,0x95,0x20,0x06,0x2e,0x18,0x0f,0x0f,0x22,0x2a,0x2e,0x15,0x26,0x22,0x0f,0x16,0x95,0x1b,0x10,0x09,0x95,0x03,0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x39,0x12,0x39,0x33,0xed,0x32,0x32,0x33,0x11,0x12,\r\n0x39,0x01,0x2f,0x33,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xed,0xcd,0x10,0xfd,0xc4,0x31,0x30,0x01,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x16,0x33,0x20,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x21,0x11,0x33,0x11,\r\n0x33,0x01,0x33,0x01,0x01,0x23,0x01,0x23,0x11,0x23,0x11,0x21,0x16,0x03,0x3b,0xe0,0xc8,0xde,0x65,0x3a,0xab,0x54,0x01,0x0f,0xfe,0xd7,0x65,0x60,0x84,0x81,0x76,0x6a,0x95,0x96,0xa1,0x97,0x01,0x76,0x35,0x2c,0x01,0x36,0xa4,0x2a,0x01,0x88,0xd7,0xfe,0x29,0x01,0xfc,0xe6,0xfe,0x62,0x2a,0xa4,0xfe,0xf6,0x5e,0x01,0x19,0x8c,0xa6,0x36,\r\n0xa1,0x23,0x28,0xac,0xaa,0x8b,0x4f,0x53,0x46,0x51,0x4b,0x99,0x3e,0xfe,0xed,0x3f,0x53,0x20,0x01,0xac,0xfe,0x54,0x01,0xac,0xfe,0x16,0xfd,0xea,0x01,0xc9,0xfe,0x37,0x01,0xc9,0x40,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x06,0xc6,0x05,0x9a,0x00,0x20,0x00,0x38,0x40,0x1c,0x19,0x7e,0x16,0x14,0x14,0x00,0x0f,0x7e,0x0c,0x20,0x7e,0x1d,\r\n0x00,0x1b,0x11,0x91,0x03,0x01,0x05,0x0d,0x09,0x09,0x1e,0x17,0x0d,0x03,0x00,0x12,0x00,0x3f,0x3f,0x33,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,0x39,0x2f,0x33,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x22,0x27,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x37,0x26,0x35,\r\n0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x06,0x1e,0xc3,0xa9,0xc3,0x5b,0x68,0x79,0x7c,0x41,0x9f,0xb1,0xa8,0xc9,0x4d,0xba,0x4d,0x09,0xa8,0xc9,0x96,0xb5,0xa8,0x02,0x85,0x79,0x95,0x3f,0x36,0x20,0xc1,0xad,0x02,0x20,0xfd,0xf2,0xec,0x42,0x32,0x2f,0x3c,0x02,0x1b,0xfd,0xed,0xe7,0x6e,0x02,0x8c,0xfa,0x66,0x00,0x00,0x01,\r\n0x00,0x98,0x00,0x00,0x06,0x3b,0x04,0x00,0x00,0x20,0x00,0x3c,0x40,0x1e,0x19,0xef,0x14,0x16,0x14,0x16,0x14,0x00,0x0f,0x84,0x0c,0x20,0x84,0x1d,0x00,0x1b,0x11,0xec,0x04,0x01,0x07,0x0d,0x0a,0x0a,0x1e,0x17,0x0d,0x0f,0x00,0x15,0x00,0x3f,0x3f,0x33,0x33,0x39,0x2f,0x12,0x39,0x39,0x33,0xed,0x32,0x01,0x2f,0x33,0xed,0x2f,0xed,0x12,\r\n0x39,0x39,0x2f,0x2f,0x10,0xed,0x31,0x30,0x21,0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x14,0x33,0x32,0x36,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x05,0x98,0x46,0x9a,0x5a,0x60,0x8d,0x22,0x90,0x98,0x49,0xfe,0xba,0xa4,0xb4,0x59,0x98,0x43,0x0c,0xa3,0xb5,0x8b,0x9d,\r\n0xa3,0x01,0x9c,0x27,0x3b,0x43,0x3c,0x4f,0x30,0x01,0x6c,0x01,0x5a,0xfe,0xaf,0xe2,0x38,0x24,0x32,0x4b,0x01,0x5a,0xfe,0xae,0xe1,0x56,0x01,0xdd,0xfc,0x00,0x00,0x02,0x00,0x0f,0xfe,0x38,0x05,0xda,0x05,0x9a,0x00,0x29,0x00,0x2f,0x00,0x4c,0x40,0x27,0x2e,0x13,0x7f,0x14,0x08,0x1b,0x7e,0x29,0x2f,0x1e,0x7f,0x0e,0x2f,0x0e,0x2f,0x0e,\r\n0x05,0x14,0x21,0x24,0x7f,0x05,0x2b,0x91,0x19,0x03,0x21,0x09,0x08,0x08,0x03,0x27,0x2e,0x1b,0x15,0x91,0x14,0x12,0x12,0x00,0x3f,0xcd,0xed,0x32,0x32,0xc4,0x32,0x39,0x2f,0x33,0x33,0x3f,0xed,0x01,0x2f,0xfd,0xcd,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xfd,0xc4,0x10,0xfd,0xc4,0x31,0x30,0x01,0x16,0x16,0x33,0x32,0x35,\r\n0x34,0x23,0x23,0x35,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x12,0x12,0x13,0x21,0x11,0x33,0x32,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x03,0x21,0x06,0x02,0x07,0x21,0x04,0x2a,0x24,0x60,0x1e,0x7d,0x89,0x47,0x20,0x20,0x3b,0x42,0x3c,0x40,0xfb,0xf0,0x9b,0x6f,0x92,0xc7,0x0d,0x02,\r\n0xa3,0x47,0xf9,0x36,0x28,0x32,0x3f,0x85,0x77,0x68,0x4b,0x4c,0xfe,0x94,0x0f,0xb1,0x7f,0x02,0xab,0xfe,0xc7,0x0e,0x12,0x43,0x3a,0x69,0x01,0x21,0x1b,0x1f,0x19,0xfe,0x7f,0x02,0x19,0x01,0x0a,0x02,0xc6,0x01,0x32,0xfa,0xec,0xa6,0x33,0x41,0x0b,0x0c,0x45,0x34,0x4e,0x56,0x1a,0x06,0xb0,0xef,0xfd,0x83,0xfe,0x00,0x00,0x02,0x00,0x12,\r\n0xfe,0x38,0x04,0xcb,0x04,0x00,0x00,0x2a,0x00,0x30,0x00,0x54,0x40,0x0a,0x2f,0x13,0xed,0x14,0x08,0x1c,0x84,0x2a,0x30,0x1f,0xb8,0x01,0x2e,0x40,0x09,0x0e,0x30,0x0e,0x30,0x0e,0x05,0x14,0x22,0x25,0xb8,0x01,0x2e,0x40,0x12,0x05,0x2c,0x95,0x1a,0x0f,0x22,0x09,0x08,0x08,0x03,0x28,0x2f,0x1c,0x15,0x95,0x14,0x12,0x15,0x00,0x3f,0xcd,\r\n0xed,0x32,0x32,0xc4,0x32,0x39,0x2f,0x33,0x33,0x3f,0xed,0x01,0x2f,0xfd,0xcd,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xc4,0xfd,0xc4,0x10,0xfd,0xc4,0x31,0x30,0x01,0x16,0x16,0x33,0x32,0x35,0x34,0x23,0x23,0x35,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x23,0x11,0x33,0x36,0x12,0x35,0x35,0x21,0x11,0x33,0x32,0x15,\r\n0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x03,0x23,0x06,0x02,0x07,0x21,0x03,0x1b,0x17,0x6d,0x1e,0x7d,0x89,0x47,0x20,0x20,0x3a,0x43,0x3c,0x36,0xfc,0xe9,0x8c,0x5b,0x80,0x8a,0x02,0x14,0x34,0xf9,0x36,0x28,0x30,0x41,0x87,0x75,0x68,0x4b,0x35,0xe3,0x0a,0x73,0x6d,0x01,0xcd,0xfe,0xc7,0x0a,0x16,0x43,0x3a,0x69,0x01,\r\n0x20,0x1c,0x1f,0x19,0xfe,0x8b,0x02,0x00,0xb6,0x01,0xc8,0xea,0x0d,0xfc,0x87,0xa7,0x34,0x40,0x0b,0x0c,0x45,0x34,0x4e,0x56,0x1a,0x05,0x23,0xbc,0xfe,0x80,0xae,0x00,0x00,0x01,0x00,0x29,0xfe,0x66,0x05,0x3d,0x05,0x9a,0x00,0x1e,0x00,0x39,0x40,0x1d,0x13,0x0b,0xad,0x0c,0x1e,0x1e,0x05,0x0e,0x18,0x7d,0x11,0x05,0x0a,0x91,0x13,0x13,\r\n0x0c,0x12,0x0e,0x91,0x0f,0x03,0x00,0x0c,0x02,0x91,0x1c,0x0c,0x12,0x00,0x3f,0xd4,0xed,0x11,0x39,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x39,0x2f,0x33,0xe4,0x32,0x31,0x30,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x04,0x12,0x15,\r\n0x14,0x02,0x06,0x23,0x22,0x27,0x01,0xc8,0xa2,0x9c,0xba,0xcd,0x76,0xda,0x8d,0x42,0xa8,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x4a,0xc1,0x01,0x26,0x9e,0x89,0xff,0xab,0xaa,0x98,0x96,0x6c,0xde,0xcc,0x94,0xe8,0x7e,0xfd,0x5e,0x05,0x02,0x98,0x98,0xfe,0x38,0xa2,0xfe,0xd6,0xc0,0xab,0xfe,0xf5,0x92,0x4c,0x00,0x00,0x01,0x00,0x1e,0xfe,0x66,\r\n0x04,0x56,0x04,0x00,0x00,0x1d,0x00,0x39,0x40,0x1d,0x12,0x0a,0x84,0x1d,0x0b,0x0b,0x05,0x0d,0x16,0x83,0x10,0x05,0x09,0x95,0x12,0x12,0x0b,0x11,0x0d,0x95,0x0e,0x0f,0x00,0x0b,0x02,0x95,0x1a,0x0b,0x15,0x00,0x3f,0xd4,0xed,0x11,0x39,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xed,0x2f,0x12,0x39,0x2f,0xc4,0xed,0x32,0x31,\r\n0x30,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x33,0x32,0x00,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x01,0x52,0x79,0x87,0xa5,0xb7,0xd9,0xbf,0x20,0xa4,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x42,0xf7,0x01,0x27,0x81,0xeb,0x9a,0x4c,0x6c,0x46,0xc0,0x4e,0xb9,0xab,0xb9,0xd7,0xfe,\r\n0x1a,0x03,0x74,0x8c,0x8c,0xff,0x00,0xfe,0xde,0xfa,0x8e,0xe5,0x7f,0x16,0x24,0x00,0x00,0x01,0x00,0x29,0xff,0xe8,0x04,0x0c,0x05,0x9a,0x00,0x11,0x00,0x23,0x40,0x11,0x0c,0x7e,0x05,0x00,0x05,0x00,0x09,0x07,0x0b,0x07,0x91,0x08,0x03,0x0f,0x92,0x02,0x13,0x00,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0xed,0x31,\r\n0x30,0x25,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0x83,0x3c,0x57,0x95,0x95,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x52,0x56,0x44,0x29,0x01,0x19,0xa3,0xac,0x03,0xcb,0x98,0x98,0xfc,0x53,0x78,0x66,0x1d,0x00,0x01,0x00,0x1e,0xff,0xe8,0x03,0x29,0x04,0x00,0x00,0x10,0x00,0x23,0x40,0x11,\r\n0x0b,0x84,0x04,0x00,0x04,0x00,0x08,0x06,0x0a,0x06,0x95,0x07,0x0f,0x0e,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x03,0x0c,0x34,0x58,0xfe,0xd2,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0x55,0x53,\r\n0x45,0x29,0x01,0x19,0x01,0x50,0x02,0x3c,0x8c,0x8c,0xfd,0xdd,0x78,0x67,0x1d,0x00,0x00,0x01,0x00,0xae,0xfe,0x29,0x05,0xbd,0x05,0x9a,0x00,0x26,0x00,0x40,0x40,0x12,0x26,0x17,0x7e,0x14,0x14,0x0c,0x13,0x03,0x7f,0x10,0x21,0x1a,0x7f,0x0c,0x15,0x11,0x03,0x24,0xb8,0x01,0x05,0xb3,0x00,0x00,0x10,0x07,0xb8,0x01,0x05,0xb5,0x1e,0x17,\r\n0x13,0x91,0x10,0x12,0x00,0x3f,0xed,0x32,0xd4,0xed,0x12,0x39,0x2f,0xed,0x3f,0x33,0x01,0x2f,0xed,0x2f,0x33,0xed,0x32,0x12,0x39,0x2f,0xed,0xc4,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x04,0x21,0x21,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x21,0x15,0x01,0xd0,0x45,0x4e,0x88,0x8b,0x0f,0x01,0x32,0x93,0xb4,0x51,0x74,0x68,0xfc,0x6f,0xa8,0x02,0xe6,0xa8,0x63,0x68,0xff,0x00,0xfe,0xf0,0xfe,0x9a,0xd3,0xc6,0x8b,0x93,0x02,0x5a,0xd8,0x23,0x21,0x30,0x24,0x2c,0x51,0x4e,0x51,0x54,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xf8,0x22,0x92,0x69,0xab,0xa1,0x56,0x63,\r\n0x4e,0x5d,0x65,0x00,0x00,0x01,0x00,0x8f,0xfe,0x29,0x04,0xc6,0x04,0x00,0x00,0x24,0x00,0x44,0x40,0x10,0x11,0x84,0x0e,0x24,0x15,0x84,0x12,0x0e,0x12,0x0e,0x12,0x0a,0x03,0xed,0x1f,0x18,0xb8,0x01,0x2e,0x40,0x10,0x0a,0x22,0x00,0x00,0x0e,0x06,0x1c,0x1b,0x13,0x0f,0x0f,0x15,0x11,0x95,0x0e,0x15,0x00,0x3f,0xed,0x32,0x3f,0x33,0x3f,\r\n0xcd,0x12,0x39,0x2f,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x01,0x9a,0x3c,0x44,0x78,\r\n0x6c,0xc3,0xc3,0xaf,0x72,0x60,0xfd,0x45,0xa4,0x02,0x0a,0xa4,0x61,0x6d,0xfb,0xfb,0xed,0xaa,0xaa,0x87,0x77,0x01,0xab,0xd8,0x23,0x20,0x32,0x26,0x01,0x66,0x67,0x4c,0x59,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x7b,0x1d,0x91,0x62,0x9e,0xa4,0x5c,0x62,0x4d,0x57,0x63,0x00,0x00,0x01,0x00,0x29,0xfe,0x9b,0x04,0x0c,0x05,0x9a,0x00,0x13,\r\n0x00,0x31,0x40,0x19,0x00,0x7e,0x0a,0x05,0x13,0x7e,0x0c,0x0a,0x0c,0x0a,0x0c,0x10,0x0e,0x12,0x0e,0x91,0x0f,0x03,0x02,0x92,0x07,0x0b,0x92,0x00,0x12,0x00,0x3f,0xed,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc4,0x10,0xed,0x31,0x30,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x33,\r\n0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x01,0xcf,0x0a,0xa5,0x4c,0x32,0x38,0x52,0x9f,0xac,0x9f,0xfe,0x63,0x03,0xe3,0xfe,0x62,0xdb,0x20,0x92,0x18,0xc5,0xba,0x76,0x04,0x72,0x98,0x98,0xfa,0xfe,0x00,0x00,0x01,0x00,0x1e,0xfe,0x9b,0x03,0x29,0x04,0x00,0x00,0x13,0x00,0x2d,0x40,0x17,0x05,0x13,0x84,0x0c,0x0c,0x0a,0x10,0x0e,0x00,0x84,\r\n0x0a,0x12,0x0e,0x95,0x0f,0x0f,0x02,0x95,0x07,0x0b,0xec,0x00,0x15,0x00,0x3f,0xed,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0xed,0xc6,0x2f,0x12,0x39,0x2f,0xfd,0xc4,0x31,0x30,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x35,0x33,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x01,0x53,0x0a,0xa4,0x44,0x2e,0x3d,0x45,0x9c,0xa6,0xa3,\r\n0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0xdb,0x20,0x93,0x17,0xc7,0xb8,0x76,0x02,0xe4,0x8c,0x8c,0xfc,0x8c,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x05,0xc5,0x05,0x9a,0x00,0x14,0x00,0x37,0x40,0x1c,0x0d,0x7e,0x06,0x0b,0x06,0x0b,0x00,0x08,0x14,0x7e,0x11,0x00,0x12,0x03,0x0c,0x08,0x91,0x09,0x0f,0x91,0x01,0x09,0x03,0x03,0x09,0x03,0x00,0x12,\r\n0x00,0x3f,0x3f,0x39,0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x22,0x26,0x35,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x21,0x32,0x37,0x11,0x33,0x11,0x05,0x1d,0xf2,0xcb,0xc3,0xd7,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x04,0xc4,0xe7,0xa8,0x02,\r\n0x85,0x79,0xc3,0xb0,0x01,0x85,0x96,0x98,0xfe,0x85,0xe7,0x6e,0x02,0x8c,0xfa,0x66,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0xae,0x04,0x00,0x00,0x13,0x00,0x37,0x40,0x1c,0x0c,0x84,0x05,0x0a,0x05,0x0a,0x00,0x07,0x13,0x84,0x10,0x00,0x11,0x0f,0x0b,0x07,0x95,0x08,0x0e,0xec,0x01,0x08,0x03,0x03,0x08,0x0f,0x00,0x15,0x00,0x3f,0x3f,0x39,\r\n0x2f,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0x33,0xed,0x2f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x31,0x30,0x21,0x11,0x06,0x23,0x20,0x11,0x35,0x21,0x35,0x21,0x15,0x21,0x15,0x14,0x33,0x32,0x37,0x11,0x33,0x11,0x04,0x0b,0xba,0x9c,0xfe,0x9d,0xfe,0xcc,0x03,0x0b,0xfe,0xcd,0xca,0x9a,0xb1,0xa3,0x01,0x9c,0x62,0x01,0x6c,0xce,0x8c,\r\n0x8c,0xc6,0xe1,0x56,0x01,0xdd,0xfc,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x04,0x81,0x05,0xb4,0x00,0x19,0x00,0x2c,0x40,0x16,0x0b,0x18,0x7e,0x19,0x11,0x7e,0x05,0x12,0x15,0x91,0x0b,0x19,0x0d,0x0d,0x02,0x12,0x19,0x12,0x07,0x91,0x02,0x04,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0xed,0x01,0x2f,0xc4,0xed,0x2f,0xed,0x32,\r\n0x31,0x30,0x13,0x10,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x11,0x23,0xa6,0x01,0xf2,0x63,0x61,0x5c,0x63,0xae,0xa1,0xea,0xc0,0xbf,0xca,0xa8,0xf5,0xb6,0xe0,0xa8,0x03,0xb4,0x02,0x00,0x17,0x9a,0x1d,0xba,0xca,0x88,0x7a,0xc5,0xaf,0xfd,0xe6,0x02,0x12,0xe8,\r\n0x6e,0xfd,0x74,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x06,0x02,0x00,0x1d,0x00,0x29,0x40,0x15,0x0d,0x1c,0x84,0x1d,0x06,0x13,0x84,0x14,0x0d,0x10,0x14,0x1d,0x15,0x17,0x95,0x10,0x10,0x09,0x95,0x03,0x01,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0x32,0x31,0x30,0x13,0x34,0x12,0x33,0x32,\r\n0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x20,0x11,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x06,0x15,0x11,0x23,0xa6,0xf2,0xe5,0x86,0x82,0x3e,0x8c,0x3d,0xa4,0x90,0x04,0x75,0xdb,0x01,0x5a,0xa4,0xee,0x4d,0x83,0x4c,0xa4,0x03,0xe9,0xfc,0x01,0x1d,0x37,0x98,0x20,0x24,0xc3,0xc8,0x96,0xc2,0xfe,0x5f,0xfd,0x89,0x02,\r\n0x4e,0x01,0x40,0x53,0x97,0x60,0xfd,0xbc,0x00,0x01,0x00,0xbc,0xfe,0x29,0x07,0xa5,0x05,0x9a,0x00,0x2a,0x00,0x54,0x40,0x1d,0x03,0x7f,0x25,0x17,0x7e,0x14,0x2a,0x1b,0x7e,0x18,0x25,0x14,0x18,0x18,0x14,0x25,0x03,0x0c,0x13,0x7e,0x10,0x1e,0x7f,0x0c,0x19,0x15,0x11,0x03,0x28,0xb8,0x01,0x05,0xb3,0x00,0x00,0x10,0x07,0xb8,0x01,0x05,\r\n0xb6,0x22,0x1b,0x17,0x13,0x91,0x10,0x12,0x00,0x3f,0xed,0x32,0x32,0xd4,0xed,0x12,0x39,0x2f,0xed,0x3f,0x33,0x33,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x21,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,\r\n0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x04,0x21,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x03,0x47,0x45,0x4e,0x88,0x8b,0x0f,0x01,0xa3,0x93,0xb4,0x51,0x75,0x68,0xfa,0x88,0xa8,0x02,0x13,0xa8,0x02,0x12,0xa8,0x62,0x6a,0xff,0x00,0xfe,0xf0,0xfe,0x28,0xd2,0xc6,0x8b,0x93,0x02,0xcb,0xd8,0x23,0x21,0x30,0x24,0x2b,\r\n0x53,0x4d,0x51,0x54,0x05,0x9a,0xfa,0xfe,0x05,0x02,0xfa,0xfe,0x05,0x02,0xfa,0xf8,0x22,0x91,0x6a,0xaa,0xa2,0x56,0x63,0x4e,0x5d,0x65,0x00,0x01,0x00,0xa6,0xfe,0x29,0x06,0x8f,0x04,0x00,0x00,0x28,0x00,0x51,0x40,0x16,0x03,0xed,0x23,0x15,0x84,0x12,0x28,0x19,0x84,0x16,0x23,0x12,0x16,0x16,0x12,0x23,0x03,0x0a,0x11,0x84,0x0e,0x1c,\r\n0xb8,0x01,0x2e,0x40,0x12,0x0a,0x26,0x00,0x00,0x0e,0x06,0x20,0x1b,0x17,0x13,0x0f,0x0f,0x19,0x15,0x11,0x95,0x0e,0x15,0x00,0x3f,0xed,0x32,0x32,0x3f,0x33,0x33,0x3f,0xcd,0x12,0x39,0x2f,0xcd,0x01,0x2f,0xed,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0xc4,0x10,0xed,0x10,0xed,0x31,0x30,0x05,0x22,0x06,0x15,0x14,0x16,0x33,\r\n0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x15,0x02,0x85,0x3c,0x44,0x78,0x6c,0x01,0xa1,0xc3,0xaf,0x72,0x60,0xfb,0x7c,0xa4,0x01,0x97,0xa4,0x01,0x98,0xa4,0x61,0x6d,0xfb,0xfb,0xfe,0x35,0xaa,0xaa,0x87,\r\n0x77,0x02,0x89,0xd8,0x23,0x20,0x32,0x26,0x01,0x66,0x67,0x4c,0x59,0x04,0x00,0xfc,0x8b,0x03,0x75,0xfc,0x8b,0x03,0x75,0xfc,0x7b,0x1d,0x91,0x62,0x9e,0xa4,0x5c,0x62,0x4d,0x57,0x63,0x00,0x00,0x01,0x00,0x2b,0xff,0xea,0x04,0x1b,0x05,0x2f,0x00,0x1c,0x00,0x47,0x40,0x24,0x0f,0x07,0x84,0x08,0x0c,0x08,0x13,0x17,0x84,0x04,0x10,0x04,\r\n0x08,0x04,0x08,0x04,0x00,0x0a,0x15,0x00,0x12,0x0e,0x16,0x06,0x0a,0x95,0x13,0x0f,0x0b,0x0f,0x08,0x15,0x1a,0x95,0x02,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0xc4,0x32,0x01,0x2f,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x31,0x30,0x25,0x06,0x23,0x20,0x11,0x11,0x23,\r\n0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x33,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x04,0x1b,0x3a,0x5f,0xfe,0xf3,0xf6,0xa4,0xb0,0xb0,0xa4,0xf6,0xa4,0x01,0x01,0xfe,0xff,0x46,0x51,0x3f,0x2c,0x0a,0x20,0x01,0x2c,0x02,0x5e,0xfc,0x8c,0x03,0x74,0x8c,0xfa,0x35,0xfe,0xd1,0xfa,0x35,0xfe,0xd1,0x8b,0xfd,\r\n0xbe,0x67,0x58,0x22,0x00,0x04,0x00,0x32,0x00,0x00,0x04,0x37,0x05,0xb2,0x00,0x3f,0x00,0x48,0x00,0x51,0x00,0x5a,0x00,0xb2,0xb1,0x4f,0x2b,0xb8,0x01,0x04,0xb2,0x09,0x2c,0x35,0xb8,0x01,0x04,0xb2,0x58,0x46,0x26,0xb8,0x01,0x04,0xb4,0x51,0x15,0x27,0x3e,0x21,0xb8,0x01,0x04,0x40,0x0e,0x22,0x48,0x22,0x2c,0x58,0x27,0x22,0x22,0x27,\r\n0x58,0x2c,0x04,0x00,0x55,0xb8,0x01,0x04,0x40,0x40,0x30,0x10,0x1d,0x7d,0x00,0x58,0x3e,0x4f,0x48,0x51,0x05,0x52,0x46,0x25,0x52,0x33,0x42,0x3b,0x3b,0x33,0x4b,0x37,0x37,0x1d,0x00,0x39,0x35,0x2d,0x2a,0x20,0x23,0x28,0x09,0x25,0x10,0x15,0x09,0x03,0x33,0x25,0x40,0x09,0x11,0x48,0x0f,0x33,0x1f,0x33,0x2f,0x33,0x03,0x25,0x33,0x25,\r\n0x33,0x0d,0x27,0x22,0x2c,0x12,0x12,0x91,0x0d,0x04,0x00,0x3f,0xed,0x3f,0x33,0x33,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x2b,0x11,0x17,0x39,0x12,0x17,0x39,0x33,0x2f,0xc9,0x11,0x33,0x2f,0xc9,0x10,0xc9,0x10,0xc9,0x11,0x17,0x39,0x01,0x2f,0xfd,0xc4,0x2f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x10,0xc4,0x33,\r\n0xed,0x32,0x10,0xed,0x10,0xc4,0xed,0x32,0x31,0x30,0x01,0x34,0x2e,0x02,0x27,0x2e,0x02,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x06,0x23,0x15,0x23,0x35,0x26,0x27,0x15,0x23,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,\r\n0x17,0x36,0x33,0x32,0x15,0x15,0x36,0x27,0x34,0x23,0x22,0x06,0x15,0x15,0x32,0x37,0x25,0x34,0x23,0x22,0x06,0x15,0x15,0x16,0x17,0x25,0x22,0x06,0x15,0x14,0x16,0x17,0x35,0x34,0x03,0x87,0x33,0x5a,0x7b,0x47,0x9e,0x83,0x43,0x82,0xe5,0x8b,0xd3,0x62,0x7f,0xc7,0x8d,0xa4,0x2f,0x66,0xa2,0xaa,0x88,0x4a,0x90,0x84,0x60,0x42,0x61,0x60,\r\n0x64,0x40,0x60,0x3f,0x4b,0x3c,0x33,0x5b,0x17,0x2f,0x5a,0x59,0x1e,0x2f,0x5c,0x85,0x64,0xc4,0x4e,0x24,0x31,0x69,0x3a,0xfe,0xfd,0x4e,0x26,0x30,0x39,0x6b,0xfe,0xde,0x13,0x0f,0x22,0x1e,0x01,0x5e,0x3a,0x56,0x48,0x40,0x24,0x50,0x6f,0x84,0x56,0x74,0xae,0x5d,0x33,0xbd,0x58,0x76,0x62,0x3a,0x56,0x4c,0x50,0x55,0x71,0x8a,0x57,0x7d,\r\n0x8b,0x1b,0x4c,0x3e,0x06,0x38,0x3a,0x05,0x0d,0x4c,0x68,0x1a,0x6d,0x49,0x33,0x3d,0x54,0x53,0x53,0x53,0xaa,0x53,0x36,0x0c,0x6b,0x3e,0x30,0x6b,0x0c,0x65,0x68,0x3d,0x34,0x55,0x0c,0x05,0xe8,0x26,0x15,0x23,0x46,0x11,0x6e,0x47,0x00,0x01,0x00,0xe7,0x00,0x50,0x04,0xf6,0x04,0x5c,0x00,0x09,0x00,0x0d,0xb3,0x06,0x00,0x09,0x03,0x00,\r\n0x2f,0xc4,0x01,0x2f,0xc4,0x31,0x30,0x37,0x01,0x23,0x27,0x05,0x17,0x13,0x27,0x35,0x01,0xe7,0x03,0x46,0xa8,0x68,0x01,0xcc,0x05,0x08,0x69,0xfc,0xb9,0xae,0x03,0x46,0x68,0x08,0x04,0xfe,0x33,0x69,0xac,0xfc,0xb8,0x00,0x00,0x01,0x00,0xe7,0x00,0x50,0x04,0xf6,0x04,0x5c,0x00,0x09,0x00,0x0d,0xb3,0x00,0x06,0x09,0x03,0x00,0x2f,0xc4,\r\n0x01,0x2f,0xc4,0x31,0x30,0x01,0x01,0x37,0x17,0x25,0x27,0x03,0x17,0x07,0x01,0x04,0xf6,0xfc,0xb8,0xaa,0x69,0xfe,0x33,0x04,0x09,0x69,0x02,0x03,0x4a,0x03,0xfe,0xfc,0xb8,0x02,0x68,0x08,0x04,0x01,0xcd,0x68,0xaf,0x03,0x4a,0x00,0x00,0x02,0x00,0x00,0xff,0xb8,0x06,0x78,0x06,0x2e,0x00,0x09,0x00,0x13,0x00,0x2e,0x40,0x16,0x06,0x10,\r\n0x06,0x10,0x00,0x0a,0x0a,0x15,0x30,0x00,0x01,0x00,0x03,0x0d,0x03,0x0d,0x09,0x3f,0x13,0x01,0x13,0x09,0x00,0x2f,0x2f,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x01,0x2f,0x5d,0x11,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x35,0x01,0x21,0x37,0x21,0x17,0x11,0x07,0x11,0x09,0x02,0x21,0x07,0x21,0x27,0x11,0x37,0x11,0x01,0x01,0xee,0xfe,\r\n0x91,0xb3,0x01,0xfe,0x02,0xb3,0xfe,0x11,0x05,0xe8,0xfe,0x12,0x01,0x6f,0xb3,0xfe,0x02,0x02,0xb3,0x01,0xef,0x48,0x01,0xee,0xb3,0x02,0xfe,0x02,0xb3,0x01,0x73,0xfe,0x0f,0x05,0xe6,0xfe,0x12,0xb3,0x02,0x01,0xfe,0xb3,0xfe,0x8d,0x01,0xf1,0x00,0x03,0x00,0x83,0xff,0xee,0x03,0x31,0x05,0xb2,0x00,0x13,0x00,0x1b,0x00,0x2f,0x00,0x3a,\r\n0x40,0x1d,0x1b,0x08,0x08,0x09,0x09,0x1c,0xaf,0x26,0x26,0x0c,0x00,0x84,0x17,0x17,0x31,0x0c,0x1b,0x0f,0x09,0x2b,0xb0,0x21,0x15,0x0c,0x0a,0x1a,0x95,0x0f,0x00,0x00,0x3f,0xfd,0x32,0xcc,0x3f,0xfd,0xce,0x11,0x39,0x01,0x2f,0x12,0x39,0x2f,0xed,0x11,0x39,0x2f,0xed,0x33,0x2f,0x33,0x11,0x33,0x31,0x30,0x01,0x14,0x07,0x0e,0x03,0x15,\r\n0x07,0x23,0x03,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x01,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x13,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x03,0x31,0xcf,0x1e,0x38,0x2b,0x1a,0x03,0x87,0x10,0x5e,0x4c,0x99,0xa5,0x53,0x88,0x60,0x35,0xfe,0xae,0x57,0x59,0x65,0x55,0x0a,0x27,0x11,0x1e,0x28,\r\n0x18,0x17,0x29,0x1e,0x11,0x12,0x1e,0x28,0x17,0x16,0x29,0x1e,0x12,0x04,0x5a,0xce,0xaf,0x1a,0x33,0x32,0x32,0x19,0x7f,0x03,0x80,0x20,0x52,0xb0,0x60,0x32,0x5a,0x7f,0xfe,0x78,0x4e,0x8f,0x50,0x58,0x73,0x0d,0xfd,0xe8,0xfd,0x50,0x16,0x28,0x1e,0x12,0x11,0x1e,0x28,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x29,0x00,0xff,0xff,0x00,0xac,\r\n0xfe,0x1e,0x03,0x00,0x06,0x1e,0x00,0x26,0x00,0x5f,0x00,0x00,0x00,0x07,0x00,0x5f,0x01,0xc0,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x78,0x05,0x1c,0x05,0x23,0x00,0x23,0x00,0x45,0x00,0x15,0xb7,0x24,0x14,0x32,0x05,0x41,0x19,0x2b,0x0d,0x00,0x2f,0x33,0x2f,0x33,0x01,0x2f,0x33,0x2f,0x33,0x31,0x30,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,\r\n0x04,0x07,0x23,0x2e,0x05,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x33,0x3e,0x03,0x01,0x14,0x1e,0x04,0x17,0x3e,0x05,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x2e,0x03,0x23,0x22,0x0e,0x02,0x03,0xea,0x3b,0x6f,0x55,0x33,0x40,0x68,0x83,0x86,0x7d,0x2d,0x09,0x2d,0x7c,0x86,0x83,0x68,0x40,0x33,0x55,0x6f,0x3b,0x39,0x5b,\r\n0x49,0x37,0x14,0x09,0x14,0x38,0x49,0x5b,0xfd,0x2b,0x34,0x54,0x69,0x6c,0x63,0x23,0x23,0x62,0x6b,0x68,0x53,0x34,0x1c,0x30,0x42,0x26,0x3a,0x5b,0x49,0x39,0x16,0x17,0x38,0x49,0x5c,0x39,0x26,0x42,0x30,0x1c,0x05,0x23,0x2b,0x57,0x84,0x5a,0x64,0xad,0x98,0x85,0x79,0x6f,0x35,0x35,0x6f,0x79,0x85,0x98,0xad,0x64,0x5a,0x84,0x57,0x2b,\r\n0x1e,0x33,0x41,0x22,0x22,0x41,0x33,0x1e,0xfe,0xa0,0x50,0x8e,0x7e,0x6f,0x63,0x57,0x26,0x26,0x57,0x63,0x6f,0x7e,0x8e,0x50,0x3d,0x58,0x38,0x1a,0x2e,0x4b,0x5e,0x2f,0x2f,0x5e,0x4b,0x2e,0x1a,0x38,0x58,0x00,0x00,0x02,0x00,0x30,0x00,0x00,0x03,0x43,0x05,0x9a,0x00,0x1b,0x00,0x1f,0x00,0x21,0x40,0x0e,0x1c,0x00,0x0f,0x12,0x1d,0x0b,\r\n0x01,0x0e,0x1e,0x1c,0x03,0x11,0x03,0x03,0x00,0x3f,0x2f,0x12,0x39,0x39,0x01,0x2f,0x33,0xcd,0x33,0x2f,0xcd,0x32,0x32,0x31,0x30,0x01,0x25,0x11,0x33,0x15,0x37,0x15,0x07,0x11,0x37,0x15,0x07,0x11,0x23,0x35,0x05,0x11,0x23,0x35,0x07,0x35,0x37,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x25,0x11,0x05,0x01,0x37,0x01,0x05,0x67,0xa0,0xa0,\r\n0xa0,0xa0,0x67,0xfe,0xfb,0x67,0xa0,0xa0,0xa0,0xa0,0x67,0x01,0x05,0xfe,0xfb,0x03,0xff,0x8b,0x01,0x10,0xd9,0x55,0x98,0x55,0xfe,0x42,0x55,0x98,0x55,0xfe,0xda,0xef,0x8b,0xfe,0xef,0xda,0x55,0x98,0x55,0x01,0xbe,0x55,0x98,0x55,0x01,0x0e,0xfc,0xd3,0x8b,0x01,0xbe,0x8b,0x00,0x09,0x00,0xe6,0xff,0xb8,0x07,0x19,0x05,0xe7,0x00,0x1e,\r\n0x00,0x2c,0x00,0x3a,0x00,0x48,0x00,0x56,0x00,0x64,0x00,0x72,0x00,0x7f,0x00,0x8c,0x00,0x1e,0x40,0x13,0x30,0x49,0x23,0x36,0x57,0x41,0x86,0x50,0x79,0x6e,0x2b,0x5d,0x80,0x68,0x0e,0x3b,0x0f,0x73,0x00,0x00,0x2f,0x32,0x2f,0x33,0x17,0x39,0x31,0x30,0x05,0x22,0x27,0x2e,0x02,0x27,0x26,0x35,0x34,0x37,0x36,0x36,0x37,0x36,0x33,0x32,\r\n0x17,0x16,0x16,0x17,0x16,0x15,0x14,0x06,0x07,0x0e,0x02,0x07,0x06,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x36,0x33,0x32,0x16,0x17,0x36,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x01,0x22,0x06,0x15,0x14,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x37,0x26,0x05,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,\r\n0x37,0x26,0x26,0x35,0x34,0x03,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x37,0x06,0x23,0x22,0x26,0x13,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x01,0x32,0x36,0x35,0x34,0x26,0x27,0x16,0x15,0x14,0x06,0x07,0x16,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x03,0xff,0xa4,0x76,0x69,\r\n0xb5,0x6e,0x05,0x6e,0x6e,0x08,0xe8,0xa1,0x76,0xa4,0xa2,0x79,0xa0,0xe6,0x0a,0x6f,0x3a,0x34,0x07,0x6d,0xb6,0x69,0x77,0x02,0x11,0x54,0x96,0x56,0x63,0xa4,0x24,0x5a,0x64,0x87,0xde,0x2d,0x1b,0x84,0x23,0xa4,0x62,0x53,0x95,0x58,0x1c,0x2a,0xe1,0x86,0x66,0xfe,0x27,0x83,0xbd,0x6f,0x5e,0x2d,0x51,0x88,0x48,0x3e,0xfe,0x44,0x5b,0x71,\r\n0x53,0x93,0x59,0x46,0x3b,0x81,0xa0,0xf1,0x1b,0x54,0x92,0x59,0x61,0xa7,0x22,0x5a,0x63,0x88,0xde,0x3c,0x24,0x9d,0x5c,0x5c,0x9b,0x56,0x1b,0x2c,0xdf,0x87,0x60,0x01,0xd3,0x82,0xbd,0x6b,0x60,0x2c,0x9d,0x86,0x40,0x01,0xbb,0x5a,0x74,0xb9,0x86,0x43,0x3e,0x7f,0xa0,0x48,0x6c,0x05,0x6c,0xb8,0x67,0x76,0xa5,0xa4,0x78,0xa0,0xe8,0x08,\r\n0x6c,0x6d,0x08,0xe7,0x9f,0x7b,0xa4,0x4f,0x92,0x39,0x6a,0xb4,0x6c,0x06,0x6b,0x03,0x16,0x54,0x95,0x58,0x70,0x5d,0x2d,0x9f,0x84,0x40,0x01,0xbd,0x5c,0x6f,0x55,0x95,0x54,0x47,0x3c,0x82,0xa0,0x01,0x0c,0xbb,0x85,0x61,0xa5,0x24,0x58,0x67,0x60,0xa7,0x75,0x13,0x1c,0x81,0x23,0xa6,0x61,0x54,0x94,0x58,0x1b,0x2a,0xe1,0x85,0x66,0xfe,\r\n0xaa,0x3c,0x46,0x53,0x95,0x57,0x6f,0x5d,0x2d,0xa1,0xfe,0x86,0x5b,0x71,0x56,0x94,0x55,0x45,0x3e,0x83,0xa0,0xfe,0xf5,0xbe,0x80,0x61,0xa2,0x28,0x58,0x66,0x87,0xda,0x2e,0x1c,0x80,0x23,0xa2,0x65,0x82,0xbf,0x1b,0x2b,0xdd,0x86,0x6f,0x00,0x00,0x09,0x00,0xe6,0xff,0xb8,0x07,0x19,0x05,0xe7,0x00,0x1e,0x00,0x2c,0x00,0x3a,0x00,0x48,\r\n0x00,0x56,0x00,0x64,0x00,0x72,0x00,0x80,0x00,0x8e,0x00,0x21,0x40,0x15,0x38,0x49,0x2f,0x29,0x32,0x57,0x43,0x88,0x50,0x7a,0x21,0x6a,0x5f,0x81,0x70,0x0f,0x07,0x73,0x16,0x3b,0x07,0x00,0x2f,0x33,0x2f,0x33,0x12,0x17,0x39,0x31,0x30,0x13,0x34,0x37,0x36,0x36,0x37,0x36,0x33,0x32,0x17,0x1e,0x02,0x17,0x16,0x15,0x14,0x07,0x06,0x06,\r\n0x07,0x06,0x23,0x22,0x27,0x2e,0x02,0x27,0x26,0x26,0x37,0x14,0x17,0x36,0x36,0x33,0x32,0x17,0x26,0x26,0x23,0x22,0x06,0x06,0x13,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x25,0x22,0x07,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x35,0x34,0x26,0x17,0x16,0x15,0x14,0x06,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,\r\n0x26,0x13,0x06,0x06,0x23,0x22,0x27,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x03,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x05,0x32,0x37,0x26,0x26,0x35,0x34,0x37,0x06,0x06,0x15,0x14,0x16,0x16,0x25,0x26,0x35,0x34,0x36,0x37,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0xe6,0x6f,0x08,0xe6,0xa2,0x79,0xa2,\r\n0xa4,0x76,0x68,0xb6,0x6e,0x05,0x6e,0x6e,0x08,0xe6,0xa3,0x76,0xa4,0xa2,0x77,0x68,0xb6,0x70,0x05,0x34,0x3a,0x67,0x1b,0x2d,0xde,0x87,0x64,0x5a,0x23,0xa6,0x62,0x57,0x95,0x54,0x84,0x56,0x66,0x86,0xe1,0x2a,0x1c,0x57,0x94,0x55,0x62,0xa4,0x02,0x0c,0x43,0x3e,0x49,0x87,0x51,0x2d,0x5e,0x6f,0xbe,0xf7,0x2d,0xa0,0x81,0x3b,0x46,0x57,\r\n0x94,0x54,0x71,0xc3,0x2b,0xde,0x88,0x63,0x5a,0x23,0xa6,0x61,0x5a,0x92,0x53,0x82,0x5d,0x60,0x88,0xdf,0x2b,0x1b,0x56,0x9a,0x5d,0x5b,0x9d,0xfd,0xf5,0x43,0x40,0x84,0x9f,0x2c,0x5f,0x6c,0x57,0x95,0xfe,0xdb,0x2d,0xa0,0x7f,0x3e,0x43,0x55,0x93,0x57,0x74,0x02,0xcd,0xa4,0x7b,0x9c,0xe9,0x09,0x6d,0x6c,0x05,0x6e,0xb5,0x68,0x78,0xa4,\r\n0xa5,0x76,0xa0,0xe8,0x08,0x6c,0x6b,0x05,0x6c,0xb6,0x69,0x39,0x92,0x50,0x42,0x40,0x85,0x9e,0x2d,0x5c,0x71,0x58,0x95,0x01,0x27,0x2c,0xa0,0x82,0x3c,0x47,0x54,0x94,0x56,0x70,0xdd,0x1c,0x14,0x75,0xa6,0x60,0x67,0x58,0x24,0xa6,0x60,0x85,0xbb,0x81,0x59,0x66,0x85,0xe1,0x2a,0x1b,0x57,0x93,0x56,0x61,0xa6,0xfe,0x74,0x81,0xa1,0x2d,\r\n0x5f,0x6d,0x58,0x96,0x51,0x46,0xfe,0x41,0x2d,0xa0,0x83,0x3e,0x45,0x55,0x94,0x56,0x70,0xdc,0x1c,0x2d,0xda,0x88,0x66,0x58,0x27,0xa3,0x61,0x54,0x94,0x56,0x80,0x53,0x6f,0x86,0xdd,0x2b,0x1b,0x55,0x97,0x55,0x64,0xa4,0xff,0xff,0x00,0x37,0xfe,0x70,0x01,0x4b,0x04,0x00,0x02,0x26,0x00,0xd6,0x00,0x00,0x01,0x06,0x00,0xdf,0xf9,0x00,\r\n0x00,0x0b,0xb6,0x01,0x00,0x12,0x04,0x02,0x03,0x25,0x01,0x2b,0x35,0x00,0x00,0x02,0xfd,0x33,0x00,0x00,0x02,0xcd,0x05,0x9a,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x21,0x37,0x21,0x11,0x21,0xfd,0x33,0x05,0x9a,0xfa,0x66,0x7c,0x04,0xa2,0xfb,0x5e,0x05,0x9a,0xfa,0x66,0x7c,0x04,0xa2,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,\r\n0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x23,0x00,0x27,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x07,0x23,0x07,0x33,0x07,0x23,0x03,0x23,0x13,0x23,0x03,0x23,0x13,0x23,0x37,0x33,0x37,0x23,0x37,0x33,0x13,0x33,0x03,0x33,0x13,0x33,0x03,0x07,0x23,0x07,0x33,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0xf6,0x19,0xd1,\r\n0x32,0xe1,0x1a,0xdc,0x42,0x8d,0x41,0xc8,0x3f,0x8c,0x3f,0xd2,0x14,0xd4,0x31,0xde,0x17,0xde,0x3d,0x8d,0x3d,0xc9,0x3f,0x8a,0x3d,0xa2,0xc9,0x35,0xcb,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfd,0x0f,0x6e,0xf0,0x6b,0xfe,0xd9,0x01,0x27,0xfe,0xd9,0x01,0x27,0x6b,0xf0,0x6e,0x01,0x29,0xfe,0xd7,0x01,0x29,0xfe,0xd7,0x6e,\r\n0xf0,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x00,0x01,0x11,0x23,0x11,0x06,0x06,0x07,0x06,0x06,0x07,0x35,0x36,0x36,0x37,0x36,0x36,0x37,0x36,0x36,0x37,0x36,0x36,0x37,0x01,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x04,0x62,0xae,0x16,0x31,0x1a,0x1c,0x3e,0x25,0x19,0x29,0x14,0x14,\r\n0x28,0x14,0x13,0x27,0x13,0x15,0x29,0x15,0xfc,0x7a,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0x04,0xb2,0xfb,0xfd,0x03,0x3f,0x0f,0x1c,0x0b,0x0b,0x13,0x09,0x8b,0x07,0x0e,0x07,0x08,0x11,0x08,0x0a,0x14,0x0b,0x0b,0x1a,0x0b,0x01,0x41,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,\r\n0x00,0x07,0x00,0x27,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x21,0x35,0x01,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x07,0x21,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x4a,0xfd,0x6f,0x01,0x3d,0x31,0x45,0x2c,0x13,0x10,0x28,0x42,0x32,0x49,\r\n0x82,0x43,0x80,0xa9,0x45,0x73,0x53,0x2e,0x1f,0x3d,0x5b,0x3b,0xed,0x01,0xd6,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x20,0x84,0x01,0x23,0x2d,0x4a,0x46,0x4c,0x2f,0x15,0x38,0x33,0x23,0x3a,0x39,0x97,0x5c,0x2e,0x4e,0x65,0x37,0x3b,0x65,0x60,0x5f,0x34,0xd1,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,\r\n0x00,0x03,0x00,0x07,0x00,0x3e,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x94,\r\n0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xd6,0x3a,0x95,0x48,0x21,0x4c,0x41,0x2b,0x29,0x49,0x63,0x3a,0x5d,0x58,0x34,0x57,0x3f,0x23,0x21,0x33,0x3c,0x1c,0x3b,0x82,0x35,0x36,0x81,0x49,0x3f,0x77,0x5c,0x37,0x73,0x64,0x31,0x5c,0x47,0x2a,0x3f,0x6c,0x8f,0x4f,0x50,0x92,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x4a,\r\n0x9a,0x29,0x28,0x0e,0x25,0x40,0x31,0x31,0x45,0x2b,0x14,0x80,0x12,0x29,0x40,0x2e,0x2b,0x37,0x1f,0x0c,0x24,0x24,0x8e,0x1d,0x1d,0x1d,0x3c,0x5c,0x3f,0x64,0x80,0x17,0x05,0x26,0x3f,0x55,0x33,0x4a,0x70,0x4c,0x27,0x1b,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x12,0x00,0x15,0x00,0x00,0x13,0x11,\r\n0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x23,0x11,0x23,0x11,0x21,0x35,0x01,0x33,0x11,0x33,0x21,0x11,0x01,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x83,0x88,0xae,0xfe,0x21,0x01,0xc4,0xc9,0x88,0xfe,0xca,0xfe,0xd7,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfb,0x2a,0xfe,0xfb,0x01,0x05,0x7f,0x02,0x79,0xfd,0x99,0x01,\r\n0xac,0xfe,0x54,0x00,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2c,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x11,0x21,0x15,0x21,0x11,0x3e,0x02,0x32,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x94,0x06,\r\n0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xd7,0x7b,0x7e,0x36,0x5c,0x43,0x26,0x2d,0x4b,0x64,0x37,0x33,0x88,0x02,0x41,0xfe,0x6c,0x0e,0x0c,0x09,0x0a,0x0c,0x4f,0x92,0x6e,0x42,0x47,0x75,0x98,0x52,0xa5,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0x3f,0x97,0x42,0x18,0x30,0x47,0x2f,0x30,0x43,0x2c,0x14,0x09,0x02,0x16,0x86,\r\n0xfe,0xf8,0x01,0x01,0x01,0x21,0x48,0x73,0x52,0x56,0x7a,0x4f,0x25,0x00,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2d,0x00,0x41,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x26,0x23,0x22,0x0e,0x02,0x15,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,\r\n0x35,0x34,0x3e,0x04,0x33,0x32,0x17,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0x31,0x5a,0x61,0x56,0x77,0x4a,0x22,0x03,0x12,0x30,0x3d,0x48,0x29,0x47,0x75,0x54,0x2e,0x31,0x5a,0x82,0x51,0x66,0x8e,0x57,0x27,0x19,0x32,0x4d,0x68,0x84,0x51,0x76,\r\n0x48,0xfe,0xe2,0x26,0x4a,0x3b,0x25,0x1b,0x36,0x4e,0x33,0x30,0x47,0x2f,0x18,0x21,0x36,0x45,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfd,0x7c,0x2c,0x46,0x70,0x90,0x49,0x1f,0x34,0x27,0x16,0x2f,0x53,0x72,0x42,0x4c,0x80,0x5c,0x33,0x50,0x81,0xa2,0x52,0x45,0x8c,0x82,0x71,0x55,0x30,0x20,0xfe,0x24,0x1c,0x34,0x4a,0x2e,\r\n0x29,0x49,0x39,0x21,0x24,0x3a,0x49,0x26,0x34,0x4b,0x31,0x17,0x00,0x03,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x0e,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x01,0x23,0x01,0x21,0x35,0x21,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfd,0xae,0xfe,0x1a,0xad,0x01,0xb4,0xfd,0x9a,0x03,0x45,\r\n0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfe,0x05,0xfc,0x23,0x03,0x78,0x8b,0x00,0x00,0x05,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2b,0x00,0x3f,0x00,0x53,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,\r\n0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x13,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfc,0x03,0x3b,0x70,0x56,0x34,0x5a,0x5e,0x34,0x53,0x3b,0x1f,0x3a,\r\n0x62,0x7e,0x44,0x44,0x7e,0x62,0x3a,0x1f,0x3b,0x53,0x34,0x5e,0x5a,0x34,0x56,0x70,0x3b,0x1e,0x37,0x28,0x18,0x13,0x26,0x37,0x25,0x25,0x38,0x25,0x13,0x18,0x28,0x37,0x1e,0x28,0x44,0x32,0x1d,0x1a,0x30,0x46,0x2b,0x2c,0x45,0x30,0x1a,0x1d,0x32,0x44,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfe,0x2b,0x21,0x40,0x5e,0x3d,\r\n0x50,0x86,0x23,0x17,0x3a,0x47,0x54,0x31,0x43,0x64,0x42,0x20,0x20,0x42,0x64,0x43,0x31,0x54,0x47,0x3a,0x17,0x23,0x86,0x50,0x3d,0x5e,0x40,0x21,0xfe,0x4a,0x0a,0x24,0x31,0x3c,0x21,0x13,0x2a,0x24,0x18,0x18,0x24,0x2a,0x13,0x21,0x3c,0x31,0x24,0xfe,0x11,0x19,0x2a,0x37,0x1e,0x24,0x39,0x30,0x2a,0x15,0x15,0x2a,0x30,0x39,0x24,0x1e,\r\n0x37,0x2a,0x19,0x00,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x03,0x00,0x07,0x00,0x2d,0x00,0x41,0x00,0x00,0x13,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x01,0x16,0x33,0x32,0x3e,0x02,0x35,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x27,0x01,0x32,0x3e,\r\n0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x94,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0xfa,0xdb,0x5a,0x61,0x55,0x78,0x4a,0x22,0x03,0x12,0x30,0x3d,0x48,0x29,0x47,0x75,0x54,0x2e,0x31,0x5a,0x82,0x51,0x66,0x8e,0x57,0x27,0x19,0x32,0x4d,0x68,0x84,0x51,0x76,0x48,0x01,0x1e,0x26,0x4a,0x3b,0x25,0x1b,0x36,0x4e,\r\n0x33,0x30,0x47,0x2f,0x18,0x21,0x36,0x45,0x05,0xf3,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xfa,0xc2,0x2c,0x46,0x70,0x8f,0x4a,0x1f,0x34,0x27,0x16,0x2f,0x53,0x72,0x42,0x4c,0x80,0x5c,0x33,0x50,0x81,0xa2,0x52,0x45,0x8c,0x82,0x71,0x55,0x30,0x20,0x01,0xdc,0x1c,0x34,0x4a,0x2e,0x28,0x4a,0x39,0x21,0x24,0x3a,0x49,0x26,0x34,0x4b,\r\n0x31,0x17,0x00,0x04,0x00,0x00,0xfe,0xb9,0x07,0xd1,0x06,0x89,0x00,0x10,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x25,0x22,0x26,0x27,0x26,0x35,0x34,0x36,0x37,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x06,0x03,0x22,0x11,0x14,0x16,0x33,0x32,0x11,0x34,0x26,0x01,0x11,0x21,0x11,0x13,0x21,0x11,0x21,0x03,0xd1,0x55,0x7f,0x30,0x5d,0x2f,\r\n0x32,0x62,0xb5,0x01,0x5c,0x2f,0x32,0x63,0xa0,0xc1,0x5f,0x5e,0xb9,0x58,0xfc,0x57,0x06,0xa7,0x96,0xf8,0x2f,0x07,0xd1,0x9e,0x40,0x40,0x7f,0xf5,0x87,0xc8,0x46,0x89,0xfd,0xfa,0x80,0xc2,0x44,0x86,0x03,0x8e,0xfe,0x6d,0xbd,0xbc,0x01,0x7f,0xc9,0xc4,0x01,0xc7,0xf9,0x5c,0x06,0xa4,0xf8,0xc6,0x07,0xd0,0xff,0xff,0x00,0x90,0x01,0xfa,\r\n0x02,0xb2,0x02,0x7b,0x02,0x06,0x00,0x10,0x00,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9b,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,\r\n0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,\r\n0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x1e,0x05,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x08,\r\n0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,\r\n0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x01,\r\n0xeb,0x13,0x1e,0x19,0x13,0x0c,0x07,0x7d,0x0e,0x1c,0x2b,0x1e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,\r\n0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x4e,0x8b,0x81,0x7f,0x88,0x94,0x57,0xfe,0xd1,0x01,\r\n0x29,0x76,0xcc,0xc7,0xcf,0x7a,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9b,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,\r\n0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,\r\n0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x21,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x08,0xca,0x68,\r\n0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,\r\n0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xd5,0x02,0x84,\r\n0xfe,0x1b,0x14,0x1e,0x14,0x0b,0x7d,0x0e,0x1c,0x2b,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,\r\n0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x85,0x5b,0xa1,0xa7,0xb6,0x6e,0xfe,0xd1,0x01,0x29,0x76,0xcc,\r\n0xc7,0xcf,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xc4,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,\r\n0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,\r\n0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,\r\n0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x27,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,\r\n0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,\r\n0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xd3,0x11,0x1d,0x0c,0x11,0x1e,0x0e,0x21,0x30,0x1e,0x0e,0x1d,0x7d,0x1d,0x19,0x18,0x29,0x13,0x21,0x2f,0x1f,0x0d,0x1c,0x7d,0x1d,0x1e,0x3c,0x56,0x38,0x24,0x52,0x30,0x39,\r\n0x4f,0x21,0x23,0x09,0x0d,0x09,0x05,0x7d,0x0e,0x1c,0x2b,0x1e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,\r\n0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xc4,0x49,0x80,0x3d,0x04,0x03,0x16,0x26,0x33,0x1d,0x43,\r\n0x3e,0x47,0x45,0x41,0x33,0x07,0x06,0x16,0x26,0x33,0x1d,0x43,0x3e,0x47,0x45,0x31,0x56,0x3f,0x24,0x13,0x16,0x28,0x07,0x36,0x6d,0x74,0x7f,0x48,0xfe,0xd1,0x01,0x29,0x76,0xcc,0xc7,0xcf,0x7a,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,\r\n0x00,0xbd,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,\r\n0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x0e,0x05,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,\r\n0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,\r\n0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x02,0x63,0x43,0x5f,0x40,0x24,0x14,0x05,0x22,0x39,0x46,\r\n0x24,0x3c,0x61,0x2f,0x65,0x72,0x39,0x6f,0x59,0x38,0x16,0x35,0x59,0x43,0x40,0x56,0x32,0x15,0x23,0x57,0x92,0x6e,0x5c,0x6c,0x37,0x10,0x19,0x42,0x73,0x5b,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,\r\n0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,\r\n0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x03,0xbf,0x3f,0x65,0x53,0x40,0x2f,0x21,0x09,0x22,0x2a,0x18,0x08,0x10,0x0c,0x84,0x24,0x18,0x33,0x51,0x38,0x21,0x54,0x65,0x76,0x42,0x1e,0x36,0x37,0x3b,0x21,0x2b,0x5b,0x59,0x54,0x25,0x8d,0x1c,0x38,0x33,0x29,0x0c,0x14,0x20,0x2b,0x39,0x2d,0x00,0x00,0x0a,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,\r\n0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xa1,0x00,0xb5,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,\r\n0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,\r\n0x2e,0x02,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,\r\n0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,\r\n0x20,0x2f,0x01,0xe9,0x39,0x7c,0x66,0x43,0x31,0x5b,0x84,0x52,0x51,0x7c,0x55,0x2b,0x1f,0x34,0x45,0x4b,0x4c,0x20,0x20,0x49,0x3f,0x29,0x21,0x3a,0x4c,0x2b,0x3b,0x55,0x37,0x1a,0x2f,0x45,0x4e,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,\r\n0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,\r\n0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0x24,0x44,0x84,0xc1,0x7d,0x4d,0x7f,0x5b,0x31,0x2d,0x51,0x73,0x48,0x54,0x92,0x7a,0x60,0x42,0x23,0x81,0x3c,0x6a,0x96,0x59,0x34,0x4a,0x2e,0x15,0x1b,0x32,0x46,0x2c,0x5f,0x98,0x68,0x38,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,\r\n0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xa1,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,\r\n0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x2e,0x07,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,\r\n0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,\r\n0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x02,0xb1,0x13,0x1e,0x16,0x11,0x0b,0x09,0x06,0x04,0x03,0x02,0xfe,0x15,0x02,0x64,0x04,0x04,0x06,0x0a,0x10,0x1b,0x27,0x1b,\r\n0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,\r\n0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x01,0x49,0x52,0x84,0x72,0x63,0x61,0x62,0x71,0x83,0x51,0x43,0x85,0x9e,0x70,0xac,0x93,0x84,0x91,0xab,0x6e,0x00,0x00,0x09,\r\n0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9d,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,\r\n0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x16,0x12,0x17,0x33,0x36,0x12,0x37,0x33,0x02,0x02,0x03,0x23,0x26,0x0a,0x02,0x27,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,\r\n0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,\r\n0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0xce,0x50,0x8c,0x3e,0x05,0x41,0x8a,\r\n0x50,0x7e,0x66,0xad,0x4d,0x77,0x29,0x54,0x57,0x5c,0x31,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,\r\n0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x05,0xba,0xd9,0xfe,0x34,0xf8,0xf8,0x01,0xcc,0xd9,0xfe,0xe6,0xfd,\r\n0xc7,0xfe,0xd8,0x9b,0x01,0x27,0x01,0x1d,0x01,0x14,0x88,0x00,0x00,0x09,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0x9d,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,\r\n0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,\r\n0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x26,0x02,0x27,0x23,0x06,0x02,0x07,0x23,0x36,\r\n0x1a,0x02,0x37,0x33,0x12,0x12,0x13,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,\r\n0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,\r\n0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x03,0x06,0x51,0x8b,0x3e,0x05,0x41,0x8a,0x50,0x7f,0x34,0x5d,0x57,0x52,0x27,0x77,0x51,0xad,0x62,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,\r\n0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,0x20,0x2e,0x2e,0x20,0x21,\r\n0x2e,0x2f,0x01,0x49,0xda,0x01,0xcc,0xf7,0xf8,0xfe,0x34,0xd9,0x8e,0x01,0x1a,0x01,0x1e,0x01,0x21,0x94,0xfe,0xcb,0xfd,0xc9,0xfe,0xf1,0x00,0x0a,0x00,0x32,0xfe,0x7f,0x08,0xca,0x07,0x16,0x00,0x33,0x00,0x3f,0x00,0x44,0x00,0x50,0x00,0x6e,0x00,0x7a,0x00,0x7f,0x00,0x8b,0x00,0xaa,0x00,0xbf,0x00,0x00,0x01,0x14,0x07,0x06,0x07,0x16,\r\n0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x21,0x20,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x27,0x26,0x35,0x34,0x37,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x21,0x20,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x26,0x23,0x22,0x07,0x07,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x34,0x27,0x26,0x27,0x06,0x23,0x22,0x27,0x21,0x06,0x23,0x22,0x27,0x06,0x07,0x06,0x15,0x10,0x01,0x36,0x33,0x32,0x17,0x21,0x36,0x33,0x32,0x17,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x27,0x21,0x16,0x33,0x32,0x25,0x34,0x26,0x23,0x22,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x23,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x03,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x08,0xca,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0xfe,0xed,0xfe,0xef,0xf0,0x21,0x28,\r\n0x37,0x4e,0x03,0xb3,0x64,0x68,0x68,0x64,0xb3,0x03,0x4e,0x37,0x28,0x21,0xf0,0x01,0x13,0x01,0x11,0xf0,0x21,0x28,0x37,0x4e,0x03,0xb3,0x64,0x68,0xfe,0x4e,0x2e,0x20,0x20,0x2f,0x2e,0x21,0x20,0x2e,0xd6,0xd4,0xef,0xf1,0xd4,0x39,0x2f,0x20,0x20,0x2e,0x2e,0x20,0x21,0x2e,0x05,0xdb,0x5c,0x58,0x9f,0x1d,0x23,0x38,0x27,0xfc,0x28,0x27,\r\n0x38,0x23,0x1d,0x9f,0x58,0x5c,0x01,0x53,0x1d,0x23,0x38,0x27,0x03,0xd8,0x27,0x38,0x23,0x1d,0x01,0x53,0xfe,0xbc,0x2e,0x20,0x21,0x2e,0x2f,0x20,0x20,0x2e,0xd6,0xfc,0x78,0xd4,0xf1,0xef,0xfd,0x13,0x2e,0x21,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x03,0x51,0x80,0x20,0x2c,0x1c,0x11,0x07,0x64,0x60,0x40,0x71,0x54,0x32,0x29,0x4d,0x70,0x48,\r\n0x46,0x71,0x30,0x1a,0x1e,0x12,0x09,0x05,0x06,0x10,0x1e,0x32,0xe3,0x03,0x06,0x08,0x0c,0x08,0x1c,0x58,0x38,0x23,0x3c,0x2c,0x19,0x20,0x38,0x4d,0x2e,0x26,0x53,0x02,0xcb,0xf6,0xdc,0xd6,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd6,0xdc,0xf6,0xf6,0xdc,0xd5,0x9a,0x0e,0x0f,0x37,0x4d,0x16,0x7f,0x7f,\r\n0x16,0x4d,0x37,0x0f,0x0e,0x9a,0xd5,0xdc,0x02,0x67,0x21,0x2e,0x2f,0x20,0x20,0x2e,0x2e,0x33,0x6d,0x6d,0x13,0x20,0x2f,0x2e,0x21,0x20,0x2e,0x2e,0xfc,0xc2,0xdb,0xc6,0xbe,0x8b,0x10,0x29,0x29,0x10,0x8b,0xbe,0xc6,0xdb,0xfe,0x3f,0xfe,0xd8,0x10,0x29,0x29,0x10,0x01,0x28,0xfe,0x64,0x20,0x2e,0x2e,0x20,0x20,0x2f,0x2e,0x0e,0x6d,0x80,\r\n0x20,0x2e,0x2e,0x20,0x21,0x2e,0x2f,0x01,0x49,0x4e,0x97,0x8d,0x83,0x39,0x2f,0x2a,0x4d,0x72,0x48,0x40,0x7b,0x60,0x3b,0x40,0x4c,0x28,0x50,0x57,0x62,0x3b,0x41,0x91,0xa2,0xb5,0x02,0x43,0x22,0x34,0x2d,0x28,0x15,0x46,0x4e,0x1e,0x34,0x46,0x27,0x2c,0x45,0x30,0x19,0x13,0x00,0x01,0x00,0x53,0x00,0x00,0x04,0x2d,0x05,0x9a,0x00,0x1d,\r\n0x00,0x70,0x40,0x25,0x1b,0x00,0x1a,0x01,0x1a,0x03,0x18,0x02,0x0f,0x19,0x1f,0x19,0x02,0x19,0x40,0x0f,0x12,0x48,0x19,0x19,0x15,0x17,0x04,0x16,0x05,0x16,0x14,0x07,0x15,0x06,0x06,0x00,0x05,0x10,0x05,0x02,0x05,0xb8,0xff,0xc0,0x40,0x1a,0x0f,0x12,0x48,0x05,0x05,0x02,0x01,0x60,0x15,0x70,0x15,0x02,0x0d,0x15,0x01,0x01,0x15,0x0d,\r\n0x03,0x13,0x1c,0x03,0x08,0x91,0x13,0x12,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x11,0x33,0x33,0x2f,0x2b,0x5d,0x33,0x11,0x12,0x39,0x39,0x32,0x11,0x12,0x39,0x39,0x11,0x33,0x2f,0x2b,0x5d,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x31,0x30,0x01,0x25,0x15,0x05,0x15,0x25,0x15,0x05,0x11,0x33,0x32,0x37,0x36,0x37,\r\n0x33,0x06,0x07,0x06,0x23,0x23,0x11,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x11,0x33,0x01,0xea,0x01,0x58,0xfe,0xa8,0x01,0x58,0xfe,0xa8,0x23,0xa3,0x68,0x66,0x0b,0xa4,0x14,0x93,0x90,0xee,0xc6,0xef,0xef,0xef,0xef,0xa8,0x04,0x1d,0x89,0x99,0x89,0x83,0x89,0x99,0x88,0xfe,0x2e,0x69,0x69,0xb9,0xfe,0x92,0x92,0x02,0x26,0x5e,0x98,0x5f,\r\n0x83,0x5f,0x98,0x5f,0x01,0xc0,0x00,0x02,0x00,0xbb,0x00,0xf7,0x03,0xf5,0x04,0x66,0x00,0x0b,0x00,0x1b,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0x59,0x6e,0x8f,0x93,0x6a,0x6a,0x91,0x8d,0x6e,0x71,0xbe,0x6d,0x6f,\r\n0xbf,0x6e,0x6e,0xbf,0x71,0x6e,0xbe,0x03,0xcc,0xa2,0x7a,0x77,0xa8,0xa7,0x78,0x78,0xa4,0x9a,0x73,0xcc,0x78,0x76,0xcd,0x75,0x76,0xcc,0x76,0x76,0xcd,0x74,0x00,0x01,0x01,0x01,0xfe,0xe6,0x03,0xae,0x05,0x9c,0x00,0x29,0x00,0x00,0x01,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x07,\r\n0x27,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0xe6,0xe5,0x50,0x94,0x55,0x5b,0x98,0x57,0x48,0x86,0x9c,0xf0,0xa4,0x56,0x87,0x1c,0x1c,0x2a,0x6e,0xb5,0x75,0x9d,0xad,0x4f,0x55,0x49,0x45,0x59,0x50,0x47,0x02,0xf7,0x8f,0xd7,0x5b,0x92,0x52,0x58,0xa4,0x68,0x5f,0xb8,0xc0,\r\n0xa7,0xd2,0xd2,0x5e,0x6a,0x68,0x52,0x27,0x3b,0x23,0x2c,0x4b,0x75,0xa9,0x67,0x9d,0xd7,0xab,0x5b,0x63,0x6c,0x60,0x49,0x42,0x7d,0x2c,0x00,0x01,0x00,0xaf,0xfe,0xdb,0x04,0x00,0x05,0x9c,0x00,0x21,0x00,0x00,0x01,0x02,0x03,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,\r\n0x16,0x15,0x14,0x02,0x07,0x07,0x16,0x12,0x17,0x03,0x7b,0xee,0x9a,0x46,0x74,0x42,0x4a,0x3c,0x7c,0x50,0x85,0x8d,0xc3,0x9a,0x88,0x96,0x31,0xb1,0xa4,0x8f,0xea,0x83,0xca,0xb0,0x01,0x72,0x9e,0x66,0xfe,0xdb,0x01,0x56,0x01,0x6c,0x02,0x47,0x72,0x3b,0x3b,0x4a,0xd2,0x2a,0xb4,0x7d,0x9c,0xc8,0x49,0x94,0x4c,0x85,0xe9,0x86,0xa9,0xfe,\r\n0xfa,0x3e,0x03,0xed,0xfe,0xf6,0x89,0x00,0x00,0x01,0x00,0xc2,0xfe,0xde,0x03,0xee,0x05,0x88,0x00,0x2f,0x00,0x00,0x01,0x26,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x14,0x07,0x15,0x16,0x16,0x15,0x14,\r\n0x06,0x07,0x15,0x16,0x16,0x17,0x03,0x42,0x5a,0x71,0x4b,0x81,0x9d,0x4c,0x39,0x3a,0x83,0x3a,0x5f,0x61,0x95,0x88,0xfe,0xc3,0x7a,0x8c,0x86,0x82,0xfe,0xd2,0x01,0x29,0x89,0xc3,0x65,0x84,0x62,0x74,0x98,0x7c,0x27,0x93,0x33,0xfe,0xde,0x8b,0x93,0x51,0x05,0x6b,0x51,0x38,0x48,0x57,0x52,0x19,0x85,0x5f,0x7b,0x83,0x97,0x66,0x5c,0x5a,\r\n0x5f,0x96,0x53,0x98,0x64,0x9d,0x61,0x06,0x2b,0xc0,0x70,0x84,0xcc,0x24,0x04,0x29,0xb9,0x4c,0x00,0x02,0x00,0x6a,0xff,0xf3,0x04,0x46,0x05,0x88,0x00,0x25,0x00,0x31,0x00,0x00,0x01,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,\r\n0x16,0x17,0x3e,0x02,0x35,0x27,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x04,0x3f,0x07,0x4d,0x8b,0xa5,0x7e,0x69,0x56,0x98,0x59,0x9c,0xc4,0x65,0x80,0xae,0x89,0x4d,0x0a,0xa6,0x0e,0x41,0x77,0x96,0x92,0x77,0x42,0x04,0xfd,0xfe,0x64,0x57,0x52,0x6e,0x55,0x67,0x68,0x57,0x05,0x88,0x25,0x2e,0x66,0xba,0xb3,0x99,\r\n0x74,0xc1,0x63,0x5d,0x91,0x50,0xb3,0x8f,0x5f,0xb9,0x79,0x94,0xa5,0xae,0x61,0x41,0x39,0x3e,0x32,0x51,0x92,0x8e,0x80,0x84,0x9a,0xa4,0x5b,0x44,0xfb,0xa6,0x4b,0x5a,0x63,0x4c,0x42,0x8f,0x5c,0x63,0x92,0x00,0x00,0x01,0x00,0x64,0xfe,0xdb,0x04,0xef,0x05,0x88,0x00,0x25,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,\r\n0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x12,0x12,0x17,0x07,0x26,0x02,0x27,0x35,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x37,0x01,0x5a,0x2e,0x24,0x8f,0x7f,0x35,0x66,0x24,0x42,0x48,0x3e,0x48,0x5f,0x3a,0x54,0xb1,0x64,0x80,0x62,0xc9,0x25,0x37,0x8c,0x3f,0x82,0xc8,0x6f,0x2b,0x23,0x05,0x88,0xb2,0xe2,0x63,0xc9,\r\n0xd5,0x30,0x2c,0x60,0x6b,0x4b,0x5f,0x7b,0x5c,0x5f,0x5b,0xfe,0xf9,0xfe,0x91,0x85,0x5d,0x86,0x01,0xcd,0x90,0x01,0x2f,0x35,0x91,0x01,0x04,0x9c,0x6f,0x01,0x11,0x7c,0x00,0x01,0x00,0x39,0xfe,0xde,0x04,0x77,0x05,0x88,0x00,0x36,0x00,0x00,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x07,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x03,0x0a,0xed,0x73,0x7c,0x9d,0x7c,0x45,0x37,0x2a,0x3c,0x39,0x52,0x73,0x45,0x57,0x92,0x7d,0x3f,0x7c,0x2f,0x60,0x5a,0x80,0xd5,0x77,0x3c,0x4b,\r\n0x63,0x75,0x3b,0x64,0xa9,0x85,0xe0,0xca,0x7e,0x7e,0x43,0x96,0x7d,0x01,0x1a,0x02,0xe0,0x75,0x6d,0x7e,0xa2,0x13,0x56,0x4a,0x3f,0x49,0x8f,0x5a,0x57,0x35,0xad,0xbd,0x5c,0x44,0xd4,0x6d,0x1c,0x75,0xce,0x7d,0x51,0x87,0x3c,0x06,0x26,0xa8,0x6f,0x4d,0x6c,0x47,0x2a,0x96,0x22,0x4a,0x3f,0x5e,0x72,0x00,0x00,0x01,0x00,0x2e,0xff,0xf8,\r\n0x04,0x82,0x05,0x88,0x00,0x29,0x00,0x00,0x01,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x23,0x22,0x00,0x02,0x11,0x33,0x10,0x12,0x12,0x33,0x32,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x37,0x03,0x8c,0x16,0x1d,0x78,0xaf,0x5e,0xa8,0x84,0x72,0xb0,0x60,0x7d,0xe2,\r\n0x8f,0xcd,0xfe,0xea,0x83,0x9f,0x69,0xcd,0x93,0x95,0xb9,0x3e,0x6b,0x3e,0x3f,0x4c,0x43,0x75,0x46,0x1a,0x01,0xd4,0x05,0x62,0xae,0x67,0x89,0xb1,0x8b,0xfc,0x9c,0xb6,0xfe,0xe8,0x97,0x01,0x43,0x02,0x95,0x01,0xb8,0xfe,0x5a,0xfd,0xc3,0xfe,0xeb,0x01,0x05,0xce,0x6f,0xb1,0x64,0x59,0x4c,0x48,0x66,0x36,0x02,0x00,0x00,0x01,0x00,0x79,\r\n0xff,0xa1,0x04,0x37,0x05,0x96,0x00,0x16,0x00,0x00,0x01,0x00,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x00,0x13,0x03,0x90,0xfd,0xef,0x52,0x19,0x95,0x73,0x6c,0xb9,0x6d,0x89,0x81,0xfe,0xfd,0x95,0x75,0xc1,0x6f,0x82,0x01,0x23,0xe9,0x05,0x39,0xfd,0x2c,0xc9,0x3c,0x3b,0x6c,\r\n0x83,0x89,0xb4,0x57,0xc7,0xb4,0x64,0xb4,0x72,0x72,0x01,0x05,0x01,0xb2,0x01,0x42,0x00,0x01,0x00,0x81,0xfe,0xe6,0x04,0x2e,0x05,0x9c,0x00,0x27,0x00,0x00,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x1e,0x02,0x15,0x14,0x07,0x27,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x16,\r\n0x15,0x14,0x06,0x07,0x01,0xfc,0xc5,0x6f,0x59,0x60,0x77,0x38,0x86,0xcc,0xd0,0x7a,0x38,0x56,0x87,0x36,0x29,0x54,0xb4,0xec,0xa0,0x49,0xcf,0xa2,0x6b,0xaa,0x5f,0x99,0x90,0x03,0x32,0x54,0xa6,0x60,0x76,0x84,0x63,0x40,0x7e,0xa8,0xd8,0xdd,0x99,0x74,0x37,0x6b,0x6b,0x52,0x4e,0x34,0x22,0x4f,0x69,0xbf,0xfa,0xd2,0xb0,0x5a,0xa5,0xce,\r\n0x61,0xad,0x67,0x82,0xc5,0x36,0x00,0x02,0x00,0xfd,0x00,0x93,0x05,0x06,0x04,0xc9,0x00,0x0e,0x00,0x1e,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x06,0x04,0x66,0x55,0x9d,0x66,0x6c,0xa8,0x5e,0xba,0x96,0x67,\r\n0xaf,0x64,0xfe,0x79,0x8c,0xdd,0x79,0x8c,0xfa,0x96,0x8e,0xe2,0x7d,0x93,0xff,0x02,0xc0,0x64,0xa4,0x5d,0x66,0xb7,0x6c,0x9b,0xcb,0x68,0xb6,0xfe,0x3f,0x8a,0xf4,0x8e,0x98,0xff,0x93,0x87,0xed,0x90,0x99,0xfe,0xfb,0x94,0x00,0x01,0x01,0x70,0xff,0xe7,0x04,0x94,0x05,0xb1,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x17,0x16,0x16,0x15,0x14,\r\n0x02,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x02,0x3e,0x12,0x5d,0x74,0xc3,0xb0,0x76,0xb2,0x6a,0x5f,0x73,0xa2,0x73,0x35,0x40,0x3b,0x3f,0x75,0x8e,0x9d,0x6a,0x3c,0x59,0x3d,0x37,0x47,0x22,0x23,0x04,0xd3,0x20,0x56,0x59,0x98,\r\n0xfe,0x81,0x7a,0xfe,0xfa,0x86,0x5a,0x4b,0x57,0x74,0x10,0x4d,0x54,0x3d,0x77,0x7c,0x74,0x7f,0x6e,0x6a,0x35,0x44,0x55,0x3f,0x36,0x25,0x2d,0x11,0x00,0x01,0x00,0xb9,0xff,0xa7,0x05,0x4a,0x05,0xb1,0x00,0x2d,0x00,0x00,0x01,0x14,0x06,0x07,0x15,0x16,0x04,0x17,0x07,0x26,0x24,0x24,0x27,0x37,0x16,0x17,0x16,0x33,0x32,0x36,0x36,0x35,\r\n0x34,0x26,0x26,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x1e,0x05,0x04,0x88,0xcc,0xcf,0xc8,0x01,0x3c,0x59,0x68,0x4d,0xfe,0x8e,0xfe,0x5e,0xc8,0x10,0x31,0x85,0x3c,0x36,0x7e,0xf5,0x7c,0x41,0x75,0xa9,0x97,0x82,0x46,0x56,0x42,0x36,0x46,0x22,0x23,0x01,0x34,0x8a,0x94,0x8f,0x71,0x46,0x03,0x4b,0x7e,\r\n0xc8,0x3f,0x06,0x4b,0xe2,0x83,0x69,0x71,0xfa,0x9c,0x12,0xa5,0x03,0x19,0x06,0x4b,0x74,0x49,0x36,0x48,0x31,0x24,0x20,0x3c,0x57,0x41,0x44,0x5b,0x42,0x2f,0x1d,0x38,0x12,0x06,0x07,0x14,0x24,0x37,0x52,0x72,0x00,0x01,0x00,0x7d,0x00,0x93,0x05,0x86,0x05,0x36,0x00,0x23,0x00,0x00,0x13,0x12,0x00,0x33,0x32,0x36,0x36,0x35,0x34,0x26,\r\n0x27,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x24,0x02,0x03,0x37,0xf6,0x96,0x01,0x40,0xce,0x64,0x97,0x53,0x98,0x83,0x09,0x30,0x8d,0x5b,0x61,0x83,0xc7,0xa8,0x95,0xe1,0x79,0x7a,0xdf,0x8e,0xb4,0xfe,0xce,0xf2,0x4a,0x73,0x05,0x36,0xfd,0xd2,0xfe,0x25,0x6c,0xc0,\r\n0x70,0x9e,0xe3,0x18,0x0e,0x3c,0x4a,0x5b,0x83,0x93,0x6a,0x80,0x9c,0x91,0xfe,0xfe,0x9f,0xa0,0xfe,0xf5,0x99,0xf7,0x01,0xf5,0x01,0x5e,0x59,0x00,0x00,0x03,0x00,0xff,0x00,0x4c,0x05,0x04,0x05,0xb1,0x00,0x1d,0x00,0x2b,0x00,0x38,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,\r\n0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x26,0x27,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x14,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xf1,0x95,0x7e,0x8a,0xee,0x8f,0x8e,0xed,0x83,0x8f,0xa7,0x87,0x7a,0x7f,0xe0,0x80,0x82,0xd2,0x77,0x6e,0x7f,0x77,0x46,0x80,0x9b,\r\n0x9d,0x84,0x47,0xd8,0xa0,0x94,0xbd,0xfd,0x6c,0x3f,0x76,0x9f,0x9c,0x7a,0xb7,0x89,0x84,0xa6,0x03,0x32,0x3f,0xa8,0x77,0x75,0xb3,0x60,0x62,0xb1,0x75,0x7e,0xaa,0x37,0x06,0x34,0x91,0x65,0x62,0x98,0x54,0x51,0x94,0x64,0x6b,0x92,0x33,0xfe,0x98,0x44,0x63,0x4a,0x31,0x28,0x44,0x61,0x47,0x71,0x91,0x85,0x03,0x0b,0x37,0x50,0x3d,0x2f,\r\n0x2c,0x71,0x54,0x4c,0x62,0x5e,0x00,0x02,0x00,0x8c,0x00,0x01,0x05,0x78,0x05,0xb1,0x00,0x1f,0x00,0x32,0x00,0x00,0x01,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x15,0x07,0x0e,0x02,0x15,0x14,0x16,0x33,0x17,0x15,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x00,0x37,0x17,0x01,0x14,0x16,0x16,0x33,0x37,0x26,0x26,0x35,0x34,0x36,\r\n0x37,0x26,0x26,0x35,0x35,0x37,0x06,0x02,0x03,0xb5,0x2f,0x84,0x5f,0x18,0x2e,0x34,0x95,0x70,0xcb,0x8f,0x48,0x7a,0x50,0x79,0xd2,0xd1,0xb0,0xfe,0xdb,0xa5,0xa5,0x01,0x2d,0xc2,0x95,0xfd,0x75,0x78,0xde,0x95,0x43,0x42,0x5a,0x83,0x97,0x70,0x82,0x02,0xd9,0xe3,0x05,0x5e,0x5c,0x47,0x5d,0x86,0x0d,0x1f,0x4b,0x06,0x49,0x7d,0x78,0x77,\r\n0x40,0x4c,0x80,0x80,0x06,0x6b,0x95,0x01,0x01,0x95,0x91,0x01,0x4c,0x01,0x35,0x73,0x4d,0xfc,0xcc,0x76,0xb8,0x63,0x03,0x36,0xa2,0x4d,0x62,0xc2,0x6e,0x2a,0xaa,0x71,0x15,0x15,0xac,0xfe,0xac,0x00,0x00,0x01,0x00,0x1f,0xff,0xe5,0x05,0xe4,0x05,0xb1,0x00,0x2d,0x00,0x00,0x01,0x11,0x14,0x33,0x32,0x36,0x37,0x33,0x16,0x12,0x15,0x14,\r\n0x02,0x06,0x23,0x20,0x00,0x03,0x37,0x33,0x12,0x21,0x32,0x36,0x36,0x35,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0x4d,0x23,0x68,0xbd,0x68,0x0e,0x66,0x73,0x87,0xff,0xae,0xfe,0xae,0xfe,0x39,0x78,0x77,0x06,0xfa,0x02,0x1c,0x7a,0xb6,0x62,0x34,0x47,0xc2,0x66,0x74,\r\n0x85,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x04,0x89,0xfe,0xd2,0x73,0x93,0xa4,0x59,0xfe,0xf7,0x98,0xa6,0xfe,0xf9,0x93,0x02,0x35,0x02,0x51,0x64,0xfb,0xb5,0x6f,0xc6,0x7b,0x7a,0x6a,0x60,0x6e,0x8f,0x78,0x01,0x72,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x00,0x02,0x00,0xf5,0xff,0xe8,0x05,0x0e,0x05,0xb1,0x00,0x21,0x00,0x30,\r\n0x00,0x00,0x01,0x06,0x23,0x22,0x24,0x27,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x03,0x15,0x11,0x17,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x01,0x32,0x37,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x06,0x15,0x17,0x16,0x03,0xbc,0x63,0x96,0x5c,0xfe,0xe1,0x1b,0x19,0x1f,0x62,0x9a,0xc7,0x73,0x1f,0x58,0x59,\r\n0x3e,0x27,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x57,0x62,0xfe,0xfb,0xa2,0x63,0x29,0x37,0x3a,0x11,0x61,0xae,0x65,0x07,0x8c,0x02,0x74,0x1d,0x2a,0x13,0x1c,0x5b,0x2a,0x65,0xfc,0xb7,0x64,0x35,0x62,0x84,0xb2,0x74,0xfd,0xb2,0x4c,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0x01,0xe2,0x27,0x57,0x75,0xa0,0x63,0x2c,0x87,0xe9,0x83,\r\n0x0a,0x25,0x00,0x02,0x00,0x3a,0xff,0xe8,0x05,0xca,0x05,0xb1,0x00,0x31,0x00,0x41,0x00,0x00,0x13,0x27,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x36,0x35,0x34,0x27,0x35,0x37,0x33,0x16,0x15,0x14,0x06,0x23,0x22,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x03,\r\n0x35,0x25,0x22,0x07,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x36,0x35,0x27,0x26,0x26,0xe8,0x01,0x06,0x1a,0x1d,0x2a,0x46,0x58,0x41,0x56,0x63,0x78,0xa1,0x90,0x80,0x26,0x52,0x54,0x58,0x4c,0x0b,0x82,0x06,0x28,0xad,0x90,0x30,0x1b,0x0e,0x62,0x99,0xc7,0x71,0x1f,0x58,0x59,0x3e,0x27,0x01,0xca,0x9b,0x8b,0x29,0x37,0x3a,0x11,0x61,0xab,\r\n0x65,0x07,0x3b,0x6f,0x04,0x71,0x52,0x01,0x11,0x42,0x2f,0x38,0x55,0x9e,0x8a,0xfe,0xa4,0x36,0x3c,0x18,0x12,0x3a,0x3b,0x1d,0x1f,0x06,0x62,0x4f,0x52,0x81,0x9b,0x06,0x19,0x2a,0x64,0xff,0xb6,0x63,0x35,0x62,0x84,0xb2,0x74,0x97,0x40,0x57,0x75,0xa0,0x63,0x2c,0x85,0xeb,0x83,0x0a,0x20,0x1e,0x00,0x01,0x00,0xaf,0xff,0xe7,0x05,0x54,\r\n0x05,0xb1,0x00,0x3c,0x00,0x00,0x01,0x22,0x06,0x06,0x15,0x14,0x17,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x20,0x13,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x14,0x16,0x17,0x04,0x16,0x16,0x15,0x14,0x06,0x06,0x23,\r\n0x2e,0x02,0x02,0x3f,0x41,0x6f,0x42,0x0c,0x0b,0x0f,0x4e,0x2d,0x41,0x5d,0x5f,0x4b,0x4d,0x90,0x56,0x6d,0xb2,0x6d,0x01,0x6e,0x4c,0x56,0x6a,0x55,0xac,0xff,0xfe,0xe1,0xe2,0x4f,0x44,0x39,0x48,0x22,0x23,0x01,0x94,0xa2,0x01,0x37,0xeb,0x7a,0x87,0xd5,0x85,0x23,0x4e,0x72,0x02,0x1f,0x45,0x7a,0x41,0x28,0x25,0x02,0x2a,0x36,0x66,0x44,\r\n0x47,0x58,0x57,0x95,0x59,0x6a,0xc4,0x63,0xfd,0xec,0x23,0xa6,0x5f,0x42,0x6e,0x61,0x5f,0x69,0xcd,0x8a,0x54,0x5c,0x3e,0x37,0x25,0x2d,0x11,0x06,0x3f,0x6c,0x39,0x6e,0x8c,0xaf,0x6d,0x81,0xf5,0x7c,0xe5,0xe2,0x71,0x00,0x00,0x02,0x00,0xb7,0x00,0xe6,0x04,0x0d,0x04,0x23,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x0d,0xf8,0xb3,0xb3,0xf8,0xf0,0xbb,0xbb,0xf0,0xa0,0x93,0x78,0x77,0x94,0x97,0x74,0x73,0x98,0x02,0x83,0xae,0xef,0xef,0xae,0xbb,0xe5,0xe5,0xbb,0x71,0xab,0xad,0x6f,0x77,0xa5,0xa8,0x00,0x02,0x01,0x2a,0xff,0xba,0x03,0x99,0x05,0x1a,\r\n0x00,0x15,0x00,0x1e,0x00,0x00,0x05,0x24,0x11,0x35,0x12,0x35,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x10,0x03,0x15,0x14,0x17,0x01,0x35,0x34,0x23,0x22,0x15,0x14,0x33,0x32,0x03,0x99,0xfe,0xeb,0x0a,0x25,0x25,0x7e,0x9c,0x9f,0x7c,0x7a,0x72,0x0a,0x72,0xfe,0xfa,0x4e,0x7b,0x78,0x21,0x46,0x24,0x01,0x11,0x0c,0x01,\r\n0x1e,0xe4,0x08,0x9b,0x7d,0x74,0x99,0xb2,0xe0,0xfe,0xf0,0xfe,0x83,0x07,0x8e,0x0d,0x03,0x44,0x25,0xb8,0x6d,0x7c,0x00,0x01,0x00,0x7d,0xff,0xbe,0x04,0x46,0x04,0xee,0x00,0x20,0x00,0x00,0x25,0x07,0x26,0x27,0x26,0x27,0x06,0x23,0x22,0x35,0x34,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x36,0x33,0x32,0x00,\r\n0x15,0x10,0x05,0x16,0x16,0x04,0x46,0x28,0x79,0x5b,0x19,0xa2,0x6c,0x6f,0xd9,0xe9,0x79,0x6b,0x6b,0x80,0xc3,0xa3,0xbc,0x8f,0x65,0x72,0xbe,0x80,0xe5,0x01,0x21,0xfe,0xf6,0x65,0x6d,0x58,0x9a,0x11,0x43,0x12,0x98,0x24,0x91,0x8e,0x45,0x38,0xc5,0x73,0xa4,0xc8,0x77,0x7c,0x57,0x44,0xfe,0xda,0xe6,0xfe,0xd1,0xad,0x63,0x3e,0x00,0x01,\r\n0x00,0x8b,0xff,0x7b,0x04,0x39,0x05,0x04,0x00,0x2a,0x00,0x00,0x01,0x14,0x05,0x16,0x17,0x07,0x26,0x26,0x27,0x07,0x22,0x27,0x26,0x35,0x34,0x33,0x32,0x17,0x24,0x35,0x34,0x21,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x20,0x11,0x14,0x06,0x07,0x16,0x04,0x39,0xfe,0xdb,0x41,0x7d,0x29,0x72,0x96,\r\n0x62,0x4c,0x8c,0x41,0x77,0xaa,0x6d,0xb3,0x01,0x20,0xfe,0xca,0xcd,0xeb,0x7c,0x94,0x82,0x49,0xa0,0xa8,0xbb,0x38,0xd6,0xc5,0x02,0x0b,0x57,0x3c,0x9b,0x01,0x8f,0xe9,0x41,0x2e,0x22,0x9a,0x1f,0x51,0x61,0x01,0x12,0x22,0x65,0x78,0x6e,0x14,0x8d,0xcb,0xa1,0x5a,0x53,0x7c,0x29,0x17,0x47,0x97,0x50,0xfe,0xa4,0x46,0x9b,0x24,0x77,0x00,\r\n0x00,0x02,0x00,0xb4,0xff,0xba,0x04,0x10,0x05,0x1e,0x00,0x1c,0x00,0x29,0x00,0x00,0x01,0x02,0x01,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x00,0x03,0x33,0x16,0x16,0x17,0x3e,0x02,0x37,0x03,0x34,0x27,0x26,0x27,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0x10,0x30,0xfe,0xef,0x81,0x3d,0x1f,\r\n0x5c,0x9b,0x53,0x54,0x9a,0x5c,0x1f,0x3e,0x80,0xfe,0xeb,0x2c,0xaa,0x22,0x76,0x6f,0x57,0x55,0x3d,0x18,0x5a,0x38,0x11,0x5e,0x72,0x3b,0x67,0x43,0x43,0x67,0x05,0x1e,0xfe,0x81,0xfe,0xdc,0x95,0x64,0x63,0x30,0x51,0x8f,0x55,0x55,0x8f,0x51,0x30,0x63,0x65,0x94,0x01,0x28,0x01,0x7b,0xb6,0xfa,0x76,0x5a,0x8d,0xba,0x85,0xfb,0xd1,0x3b,\r\n0x50,0x18,0x6c,0x84,0x50,0x3b,0x38,0x5e,0x5c,0x00,0x00,0x01,0x00,0x79,0xff,0xf6,0x04,0x4b,0x04,0xe1,0x00,0x1a,0x00,0x00,0x05,0x23,0x11,0x06,0x23,0x22,0x24,0x27,0x37,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x36,0x37,0x11,0x33,0x04,0x4b,0xa0,0x7b,0xe0,0xa7,0xfe,0xf9,0x29,0x4f,0x39,0x41,0x23,\r\n0xaa,0x5a,0x65,0x1f,0x9f,0x56,0x57,0xd7,0x2d,0xa0,0x0a,0x01,0x53,0x2a,0x8e,0x7e,0x69,0x66,0x92,0x50,0xde,0x27,0xac,0xa9,0xcd,0x98,0x31,0x37,0x22,0x16,0x02,0xea,0x00,0x01,0x00,0x9d,0xff,0xf6,0x04,0x26,0x06,0x30,0x00,0x2d,0x00,0x00,0x25,0x06,0x23,0x22,0x24,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x37,0x26,0x35,0x34,0x36,0x33,\r\n0x17,0x15,0x27,0x22,0x06,0x15,0x14,0x17,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x20,0x15,0x14,0x16,0x33,0x32,0x37,0x04,0x26,0xb9,0xc0,0xe9,0xfe,0xd9,0xa0,0x9c,0xde,0xc2,0x1c,0x98,0x7a,0x69,0x69,0x50,0x22,0x68,0x88,0x23,0x75,0x7a,0xc1,0xa2,0xba,0x84,0xec,0xcb,0xfe,0x9d,0xe0,0x91,0xa3,0xa5,0x39,\r\n0x43,0xc4,0xaf,0xa5,0x5c,0x5d,0xb1,0x98,0xb4,0x10,0x32,0x45,0x6a,0x7b,0x04,0xa7,0x03,0x1c,0x21,0x47,0x27,0x23,0x9c,0x1a,0x5f,0x61,0x52,0x6d,0xaf,0xa1,0x61,0x72,0x3b,0x00,0x00,0x01,0x00,0xdf,0xff,0xf0,0x03,0xe4,0x05,0x25,0x00,0x17,0x00,0x00,0x01,0x14,0x00,0x05,0x27,0x36,0x00,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,\r\n0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x03,0xe4,0xfe,0xba,0xff,0x00,0x70,0xe0,0x01,0x37,0x98,0x69,0x52,0x74,0x40,0x8c,0x53,0xc4,0xa1,0xb1,0xef,0x03,0x92,0xc2,0xfe,0x08,0xe8,0x71,0xcb,0x01,0xc9,0x9d,0x61,0x92,0x6b,0x46,0x52,0x6b,0x4e,0x75,0x96,0x8f,0xc2,0xe8,0x00,0x01,0x00,0x4b,0xff,0xf6,0x04,0x79,0x05,0x29,0x00,0x18,\r\n0x00,0x00,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x79,0x9b,0xa6,0xfb,0xfe,0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x02,0xbd,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x9f,0x2f,\r\n0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x01,0x00,0x4b,0xff,0xf6,0x04,0x79,0x05,0xda,0x00,0x25,0x00,0x00,0x25,0x06,0x23,0x22,0x00,0x11,0x34,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x21,0x26,0x35,0x34,0x36,0x33,0x15,0x22,0x07,0x06,0x15,0x14,0x16,0x33,0x15,0x21,0x16,0x15,0x10,0x12,0x33,0x32,0x37,0x04,0x79,0x9b,0xa6,0xfb,0xfe,\r\n0xcd,0x07,0xb8,0x83,0x40,0x5c,0x26,0x01,0xb5,0x11,0x8e,0xb1,0x44,0x17,0x45,0x46,0x34,0xfd,0x59,0x03,0xdd,0xb2,0x65,0x79,0x65,0x6f,0x01,0xd2,0x01,0x80,0x52,0x47,0x09,0x89,0x3f,0x77,0xa8,0x2c,0x37,0x7f,0x77,0xa0,0x06,0x11,0x3f,0x2c,0x37,0x9f,0x2f,0x6b,0xfe,0xc9,0xfe,0x85,0x4d,0x00,0x00,0x02,0x00,0xe1,0x01,0x13,0x04,0x33,\r\n0x04,0xa4,0x00,0x0b,0x00,0x19,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x02,0x8b,0x73,0x99,0x9d,0x6f,0x70,0x9a,0x97,0x73,0x75,0xc3,0x70,0xed,0xbb,0x72,0xc6,0x72,0xe9,0x04,0x09,0xab,0x81,0x7f,0xb0,0xb0,0x7f,0x80,0xac,0x9b,\r\n0x76,0xd3,0x7f,0xc8,0xfe,0xff,0x7a,0xd3,0x7c,0xce,0xfa,0x00,0x00,0x02,0x00,0xdc,0xff,0xe8,0x04,0x38,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x00,0x01,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x03,0x32,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0xbb,\r\n0x02,0x50,0x4e,0x8c,0xb3,0xb2,0x87,0x92,0xb8,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0xa4,0x58,0x4c,0x55,0x49,0x47,0x5c,0x5b,0x03,0x39,0x02,0x15,0xb7,0x98,0x8c,0xb1,0xc9,0x9f,0xfc,0x38,0x67,0xac,0x28,0x2d,0x55,0x4b,0x03,0x3e,0x23,0x66,0x5e,0x6a,0x5e,0x49,0x4c,0x5e,0x00,0x01,0x00,0xa6,0xff,0xe8,0x04,0x6d,0x05,0xb2,0x00,0x26,\r\n0x00,0x00,0x01,0x14,0x06,0x07,0x17,0x16,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x03,0xae,0xca,0xac,0x25,0x22,0x64,0x51,0x73,0x8c,0x3a,0x96,0x9f,0x90,0xb4,0x30,0x28,0x7d,0x79,0x68,0x47,0x94,0x38,\r\n0x6e,0x81,0xbe,0x9f,0x62,0x33,0x1a,0x38,0x60,0xa7,0xed,0x7e,0x03,0xce,0xa3,0xf2,0x26,0x90,0x82,0x7e,0x47,0x9e,0x44,0xbc,0xc0,0xa3,0x05,0x4e,0x53,0x45,0x5d,0x9d,0x20,0x9c,0x6b,0x90,0xae,0x08,0x95,0x0e,0x7a,0xdb,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0xab,0x05,0xb2,0x00,0x2b,0x00,0x00,0x01,0x16,0x15,0x14,0x06,0x06,0x23,0x22,\r\n0x24,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x03,0xd9,0xd2,0x7b,0xdd,0x89,0xb9,0xfe,0xd6,0x7f,0x7a,0x5e,0xf8,0x8d,0x97,0xb1,0x70,0x5e,0x36,0x40,0x58,0x4d,0x13,0x29,0x5d,0x6f,0x8e,0x96,\r\n0x78,0x4d,0x3f,0x23,0x4d,0x57,0x88,0xc7,0x68,0x7f,0x02,0xf7,0x8d,0xe4,0x7d,0xbc,0x65,0xb6,0xc0,0x5f,0x94,0xa6,0x8e,0x7e,0x56,0x90,0x2f,0x10,0x0b,0x97,0x07,0x89,0x6a,0x6f,0x86,0x12,0x97,0x16,0x6a,0xbd,0x74,0xb0,0x6e,0x00,0x00,0x02,0x00,0x2d,0xff,0xe8,0x04,0xe7,0x05,0xbc,0x00,0x10,0x00,0x1b,0x00,0x00,0x13,0x01,0x01,0x17,\r\n0x01,0x16,0x12,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x10,0x37,0x01,0x01,0x34,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x93,0x01,0xf5,0x01,0xed,0x72,0xfe,0x16,0x76,0x71,0xbd,0x9b,0x9f,0xbd,0xe6,0xfe,0x17,0x03,0x19,0x55,0x64,0xbf,0x67,0x50,0x54,0x6d,0x05,0xbc,0xfe,0x3a,0x01,0xc6,0x75,0xfe,0x3b,0x81,0xfe,0xff,0x92,0xae,\r\n0xd8,0xe0,0xb0,0x01,0x1a,0xf6,0x01,0xbc,0xfc,0x35,0x5a,0xd5,0x6e,0xcb,0xd8,0x67,0x89,0x8a,0x00,0x01,0x00,0x0c,0xff,0xe8,0x05,0x07,0x05,0xb2,0x00,0x22,0x00,0x00,0x25,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x33,0x32,\r\n0x37,0x11,0x33,0x04,0x2e,0x90,0x49,0x3f,0x83,0x35,0x42,0x44,0x6e,0x8b,0xda,0xe8,0x2c,0x2f,0x2d,0x1c,0x1f,0x28,0x41,0x76,0x88,0x8e,0x7c,0x97,0x76,0xa4,0x82,0x67,0xac,0x28,0x2d,0x55,0x4b,0xfb,0x35,0xed,0xdb,0x01,0xa2,0x29,0x36,0x05,0x96,0x0a,0x91,0x7f,0xfe,0x5e,0x87,0x90,0x66,0x03,0x4b,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,\r\n0x04,0xac,0x05,0xbb,0x00,0x36,0x00,0x00,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x2e,0x02,0x35,0x34,0x37,0x35,0x24,0x35,0x10,0x21,0x32,0x36,0x35,0x34,0x27,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x03,0x57,\r\n0xb9,0x5f,0x66,0x81,0xb5,0xdb,0xc2,0xa2,0x89,0x86,0x60,0x2f,0x57,0x5b,0x3f,0x53,0xfa,0xb6,0xc1,0x62,0x44,0xfe,0xe9,0x01,0x9a,0x43,0x56,0x06,0x9d,0x04,0xac,0x82,0x87,0x7b,0x89,0x6c,0x2b,0x2d,0xed,0x03,0x1a,0x1c,0x0e,0x59,0x48,0x3d,0x3d,0x05,0x07,0x79,0x75,0x6d,0x86,0x28,0x8b,0x1b,0x38,0x27,0x50,0x06,0x05,0x3d,0x7b,0x62,\r\n0x66,0x4a,0x02,0x45,0xdb,0x01,0x25,0x25,0x22,0x17,0x12,0x33,0x12,0x1e,0x49,0x5f,0x47,0x47,0x43,0x50,0x03,0x23,0x00,0x02,0x00,0x4d,0xff,0xe8,0x04,0xc6,0x05,0xb2,0x00,0x1d,0x00,0x29,0x00,0x00,0x13,0x12,0x12,0x33,0x32,0x36,0x12,0x35,0x34,0x27,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x06,\r\n0x23,0x22,0x00,0x03,0x25,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe8,0x2c,0xcf,0xb5,0x76,0xb8,0x62,0x04,0x02,0x7d,0x9b,0xa1,0xc9,0xc0,0xa2,0x89,0xce,0x6d,0x89,0xfd,0xa2,0xf8,0xfe,0xde,0x37,0x02,0xb4,0x42,0x89,0x3d,0x21,0x83,0x52,0x5e,0x77,0x6d,0x03,0x23,0xfe,0x94,0xfe,0xcc,0x92,0x01,0x00,0x97,0x3d,0x3a,\r\n0x6a,0xdb,0xb0,0xa5,0xc9,0xbf,0xfe,0x9b,0xed,0xc9,0xfe,0xc0,0xb0,0x01,0x70,0x01,0xa2,0x5a,0x47,0x44,0x91,0xa7,0x73,0x5f,0x6c,0x85,0x00,0x01,0x00,0xab,0xff,0xe8,0x04,0x69,0x05,0xbc,0x00,0x14,0x00,0x00,0x01,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x13,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x01,0x03,0xa7,0xfe,\r\n0x6e,0x6f,0x5e,0x90,0x74,0xe9,0xab,0x89,0x7c,0xfd,0xa0,0xbb,0xea,0x6c,0x71,0x01,0x96,0x05,0x5f,0xfd,0xdf,0x97,0xd8,0x5a,0x6a,0x88,0x01,0x3b,0x57,0xd3,0xac,0xe3,0xaf,0x7c,0x01,0x07,0x98,0x02,0x27,0x00,0x00,0x02,0x00,0x7d,0xff,0xe8,0x04,0x96,0x05,0xb5,0x00,0x03,0x00,0x18,0x00,0x00,0x01,0x01,0x17,0x01,0x25,0x14,0x16,0x16,\r\n0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x37,0x17,0x06,0x02,0x02,0x1d,0x01,0xb1,0x71,0xfe,0x52,0xfe,0x8a,0x72,0xc8,0x78,0x61,0xa7,0x51,0x70,0xce,0xf5,0xae,0xfe,0xef,0x97,0xdc,0xca,0x70,0xad,0xcb,0x02,0x68,0x01,0x8c,0x73,0xfe,0x75,0x9a,0x99,0xf0,0x84,0x49,0x43,0x73,0xb4,0xab,0x01,0x3c,0xcc,0xe6,\r\n0x01,0x97,0x9d,0x75,0x84,0xfe,0x90,0x00,0x00,0x02,0x00,0xad,0x00,0xd7,0x04,0x7a,0x04,0x89,0x00,0x0f,0x00,0x1c,0x00,0x00,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0xad,0x81,0xe3,0x83,0x81,0xe3,0x82,0x84,0xe2,0x80,0x81,\r\n0xe3,0x83,0x03,0x26,0xb9,0x86,0x84,0xbc,0xbb,0x85,0x55,0x94,0x56,0x02,0xb0,0x7d,0xda,0x82,0x80,0xdc,0x7d,0x7e,0xdc,0x7f,0x80,0xdc,0x7d,0x84,0xbc,0xbc,0x84,0x82,0xbd,0x54,0x96,0x00,0x00,0x02,0x01,0x15,0xff,0xe2,0x04,0x12,0x05,0x7d,0x00,0x15,0x00,0x21,0x00,0x00,0x01,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,\r\n0x23,0x22,0x27,0x1e,0x02,0x17,0x07,0x24,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x15,0x69,0xb2,0x67,0x65,0xb1,0x65,0x64,0xb2,0x65,0x68,0x47,0x1b,0x8c,0xe0,0x84,0x56,0xfe,0xcc,0xfe,0xac,0x02,0x58,0x7d,0x59,0x55,0x7f,0x7e,0x56,0x59,0x7d,0x03,0xe5,0x6c,0xbe,0x6e,0x69,0xb1,0x62,0x64,0xae,0x68,\r\n0x33,0x72,0xe3,0xc1,0x3c,0x86,0x92,0x02,0x27,0x01,0x66,0x5c,0x84,0x8b,0x63,0x58,0x7c,0x87,0x00,0x02,0x01,0x15,0xff,0xe2,0x04,0x12,0x05,0x7d,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x10,0x00,0x05,0x27,0x36,0x36,0x37,0x15,0x36,0x37,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x05,0x14,0x16,0x33,0x32,0x36,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x04,0x12,0xfe,0xaa,0xfe,0xcf,0x55,0x68,0xbc,0x44,0x74,0x2e,0x49,0x67,0x65,0xb1,0x65,0x67,0xb0,0x64,0x66,0xb3,0x69,0xfd,0xaa,0x7d,0x57,0x57,0x7d,0x7d,0x57,0x58,0x7c,0x03,0xe5,0xfe,0xb7,0xfd,0xd7,0x91,0x86,0x31,0x90,0x4f,0x01,0x91,0xb2,0x33,0x67,0xaf,0x64,0x64,0xb1,0x67,0x6e,0xbe,0x50,0x5d,\r\n0x85,0x7d,0x57,0x62,0x8c,0x83,0x00,0x01,0x00,0x2f,0x00,0x00,0x04,0xf9,0x05,0x7d,0x00,0x33,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x02,0x5c,0x31,0x4f,0x27,0x5c,0x82,0x4c,0x36,0x17,0x1c,0x2e,0x27,0x33,0x52,0x77,0x80,0x5a,0x50,0x8b,0x4f,0x61,0xb4,0x74,0x4f,0x86,0x1d,0x2a,0x7f,0x4e,0xa1,0xb7,0xa4,0x69,0x46,0x4a,0x5c,0xa4,0x03,0xe7,0x3f,0x76,0x45,0xc8,0x91,0x6d,0x9d,0x26,0x19,0x16,0x2e,0x11,0x8d,0x04,0x87,0x57,\r\n0x5f,0x88,0x77,0xc7,0x74,0x8f,0xe5,0x81,0x53,0x40,0x48,0x4b,0xc0,0xa2,0xfb,0xe5,0x04,0x1b,0x4f,0x77,0x8d,0x6d,0xfc,0x19,0x00,0x02,0x00,0x40,0xff,0xe5,0x04,0xe7,0x05,0xa9,0x00,0x17,0x00,0x23,0x00,0x00,0x01,0x34,0x36,0x37,0x26,0x03,0x37,0x12,0x05,0x36,0x13,0x17,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,\r\n0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x03,0x95,0x84,0xee,0xee,0xa6,0xa6,0x01,0x1e,0xc3,0xe1,0x99,0xd6,0xde,0x85,0x93,0x72,0xc3,0x6f,0x6f,0xc1,0x74,0x02,0xa0,0x8c,0x70,0x73,0x8a,0x94,0x69,0x67,0x95,0x01,0x60,0x87,0xfa,0x57,0x94,0x01,0x9b,0x42,0xfe,0xa2,0xb0,0x6d,0x01,0x87,0x43,0xfe,0x8d,0xa2,\r\n0x64,0xf1,0x74,0x6e,0xb5,0x66,0x65,0xb1,0x72,0x5f,0xc7,0x3f,0x38,0xcf,0x6b,0x5c,0x84,0x8b,0x00,0x03,0x00,0x34,0xff,0xe5,0x04,0xf3,0x05,0x7d,0x00,0x24,0x00,0x30,0x00,0x3c,0x00,0x00,0x13,0x34,0x36,0x37,0x26,0x03,0x37,0x16,0x17,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,\r\n0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x25,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0xdb,0x7d,0x6e,0xc8,0xca,0x86,0x80,0x8c,0x49,0x63,0xaa,0x61,0x5c,0xa4,0x60,0x89,0x5f,0x73,0xba,0x63,0x88,0x60,0x82,0x48,0x66,0xb0,0x64,0x65,0xb0,0x67,0x02,\r\n0x50,0x50,0x43,0x7d,0x97,0x7c,0x57,0x56,0x7e,0x79,0x6d,0x4c,0x52,0x74,0x4f,0x45,0x6a,0x81,0x01,0x47,0x57,0xb0,0x47,0x59,0x01,0x24,0x65,0xe0,0x56,0x62,0x78,0x5d,0xa5,0x60,0x64,0xab,0x60,0x5d,0xb5,0x3b,0x2b,0xa3,0x89,0x65,0xaa,0x5c,0x7e,0x62,0x55,0x98,0x59,0x60,0xa4,0x42,0x54,0x9f,0x32,0x29,0x95,0x4b,0x53,0x74,0x62,0x03,\r\n0x2c,0x56,0x7d,0x74,0x52,0x3f,0x8a,0x3d,0x38,0x89,0x00,0x01,0x00,0x55,0x00,0x00,0x04,0xd3,0x05,0x7d,0x00,0x2f,0x00,0x00,0x33,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x26,0x26,0x35,0x34,0x36,0x36,\r\n0x33,0x32,0x16,0x16,0x15,0x10,0x00,0x21,0x55,0xcc,0x01,0x42,0x01,0xc7,0x56,0x94,0x56,0x57,0x7e,0x37,0x2e,0x43,0x4b,0xc1,0x86,0x61,0xc1,0x42,0x86,0x36,0x75,0x33,0x44,0x5c,0x76,0x3a,0x42,0x66,0xaf,0x66,0x81,0xe4,0x84,0xfd,0xd4,0xfe,0x7a,0xa7,0x01,0x9f,0x01,0x27,0x63,0xad,0x64,0x54,0x3c,0x17,0x39,0x1a,0x26,0x6b,0x3a,0x77,\r\n0xa7,0x77,0x76,0x55,0x50,0x57,0x46,0x2f,0x3e,0x3d,0x1f,0x6e,0x3d,0x4f,0x8b,0x50,0x90,0xf5,0x8b,0xfe,0x94,0xfd,0xff,0x00,0x00,0x02,0x00,0x4f,0xff,0xe5,0x04,0xd8,0x05,0x7d,0x00,0x27,0x00,0x33,0x00,0x00,0x17,0x35,0x33,0x20,0x00,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x10,0x00,0x21,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x4f,0x95,0x01,0x5e,0x01,0xef,0x73,0xcc,0x72,0x69,0xb8,0x6b,0x09,0x27,0x7d,0x4a,0x77,0xa0,0xa0,0x70,0x6e,0xc4,0x71,0x99,0x01,0x06,0x92,0x9f,0x01,0x17,0xa2,0xfd,0xab,0xfe,0x61,0x79,\r\n0x11,0x53,0x31,0x2e,0x3b,0x46,0x2a,0x30,0x50,0x1b,0x9c,0x01,0xad,0x01,0x32,0x66,0xb3,0x68,0x5e,0xa2,0x5e,0x18,0x26,0x43,0x54,0x9a,0x69,0x6b,0x98,0x75,0xc9,0x6f,0x86,0xec,0x88,0x92,0xfd,0x8e,0xfe,0x8b,0xfd,0xfa,0x02,0xcb,0x1b,0x24,0x40,0x28,0x26,0x36,0x4c,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x04,0x67,0x05,0x42,0x00,0x05,\r\n0x00,0x00,0x13,0x21,0x15,0x21,0x11,0x23,0xc1,0x03,0xa6,0xfd,0x02,0xa8,0x05,0x42,0x99,0xfb,0x57,0x00,0x00,0x01,0x00,0xdc,0xff,0xe2,0x04,0x4c,0x05,0x62,0x00,0x16,0x00,0x00,0x13,0x34,0x12,0x37,0x33,0x01,0x11,0x33,0x11,0x14,0x06,0x23,0x01,0x06,0x06,0x15,0x14,0x00,0x17,0x07,0x26,0x24,0x02,0xdc,0xb1,0x9b,0x1b,0x01,0x62,0xa7,\r\n0x1e,0x13,0xfe,0x14,0x56,0x54,0x01,0x19,0xec,0x43,0xac,0xfe,0xe0,0x9f,0x02,0xe5,0xac,0x01,0x58,0x79,0xfe,0x8f,0x01,0x71,0xfd,0x5b,0x0b,0x13,0x01,0xf5,0x51,0xde,0x80,0xcd,0xfe,0xb1,0x51,0x96,0x3b,0xf3,0x01,0x35,0x00,0x02,0x01,0xbd,0xff,0xe8,0x05,0x87,0x05,0x48,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x10,0x02,0x23,0x22,0x02,\r\n0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x05,0x87,0xfb,0xeb,0xea,0xfa,0xfa,0xea,0xeb,0xfb,0xab,0x9a,0xa1,0xa1,0x98,0x97,0xa2,0xa2,0x99,0x02,0x97,0xfe,0xa8,0xfe,0xa9,0x01,0x57,0x01,0x58,0x01,0x59,0x01,0x58,0xfe,0xa8,0xfe,0xa7,0x01,0x17,0x01,0x06,0xfe,0xf7,0xfe,0xec,0xfe,\r\n0xeb,0xfe,0xfc,0x01,0x02,0x00,0x00,0x03,0x01,0x00,0x00,0x00,0x06,0x44,0x05,0x31,0x00,0x1d,0x00,0x21,0x00,0x2d,0x00,0x00,0x01,0x14,0x06,0x07,0x35,0x32,0x36,0x35,0x10,0x21,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x21,0x11,0x33,0x32,0x16,0x16,0x01,0x11,0x21,0x11,0x05,0x21,0x22,0x06,0x15,0x14,\r\n0x16,0x16,0x33,0x32,0x36,0x35,0x06,0x44,0xdd,0xae,0x68,0x78,0xfe,0xc6,0xd0,0xd0,0x6e,0xce,0x83,0x8d,0x7d,0x03,0x58,0xfe,0xfd,0x39,0x72,0xc5,0x75,0xfd,0x73,0xfe,0xfb,0x01,0x05,0xfe,0xc8,0x61,0x6f,0x56,0x85,0x3b,0x79,0x79,0x01,0xc0,0xc9,0xf5,0x02,0x95,0x92,0x89,0x01,0x04,0xd5,0xff,0xe0,0x88,0xe7,0x71,0x86,0xb7,0x13,0x02,\r\n0x01,0x94,0xfe,0xab,0x65,0xb8,0x01,0x1d,0x01,0x55,0xfe,0xab,0x94,0x72,0x62,0x49,0x9c,0x66,0xad,0xbe,0x00,0x02,0x00,0xd2,0x00,0x00,0x06,0x72,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x00,0x21,0x21,0x22,0x26,0x35,0x34,0x3e,0x06,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,\r\n0x32,0x04,0x15,0x14,0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0x72,0xfb,0xe3,0xc7,0xa3,0x45,0x70,0x90,0x96,0x90,0x70,0x45,0xb7,0x9b,0x4d,0x6f,0x33,0x84,0x7d,0x98,0x6d,0x69,0x8b,0x89,0xda,0x88,0xe2,0x01,0x16,0x83,0xf2,0xad,0x8d,0x70,0x56,0x82,0x04,\r\n0x04,0xfb,0xcf,0x46,0x2d,0x2f,0x44,0x43,0x30,0x2f,0x44,0x60,0x6e,0x4a,0x61,0x42,0x2e,0x2d,0x36,0x52,0x7a,0x5a,0x90,0xa5,0x30,0x2f,0x04,0x80,0x7c,0x61,0x8a,0x97,0x6a,0x7d,0xe0,0x76,0xf2,0xc9,0x8a,0xd0,0x79,0x2e,0x25,0x3f,0x2c,0x2e,0x23,0x02,0xbf,0x31,0x47,0x48,0x30,0x33,0x45,0x45,0x00,0x01,0x00,0xff,0x00,0x00,0x06,0x44,\r\n0x05,0x31,0x00,0x20,0x00,0x00,0x21,0x21,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x15,0x23,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x21,0x06,0x44,0xfd,0xf0,0x61,0x84,0x7b,0x6b,0x47,0x54,0x3d,0xa8,0xfe,0xf4,0xa8,0x02,0xce,0x72,0x3e,0x64,0x45,0xa8,0xd7,0x45,0x38,\r\n0x01,0x00,0x95,0x0d,0xbe,0x7a,0x81,0x9b,0x1e,0x32,0xfd,0x5a,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfe,0xb5,0x20,0x19,0xe8,0xaf,0x5e,0xbf,0x43,0x00,0x03,0x00,0xf8,0x00,0x00,0x06,0x4b,0x05,0x31,0x00,0x14,0x00,0x18,0x00,0x24,0x00,0x00,0x01,0x21,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,\r\n0x21,0x11,0x33,0x01,0x11,0x21,0x11,0x05,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x06,0x4b,0xfe,0x20,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x02,0xd0,0x6d,0x01,0x38,0xa8,0xfd,0x78,0xfe,0xed,0x01,0x13,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,0x02,0xb4,0x90,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,\r\n0x06,0x94,0xfe,0xab,0x01,0xe9,0xfe,0x17,0x01,0x55,0xfe,0xab,0x94,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0x00,0x01,0x00,0x5c,0xfd,0xb9,0x06,0xe8,0x07,0x21,0x00,0x34,0x00,0x00,0x01,0x02,0x02,0x24,0x23,0x22,0x04,0x02,0x11,0x10,0x12,0x04,0x33,0x20,0x00,0x11,0x34,0x26,0x23,0x22,0x07,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x21,0x15,\r\n0x23,0x11,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x04,0x23,0x20,0x00,0x02,0x11,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x13,0x06,0x46,0x07,0xa4,0xfe,0xde,0xba,0xd3,0xfe,0xc7,0xad,0x9d,0x01,0x1e,0xc8,0x01,0x0b,0x01,0x2e,0x5d,0x4f,0x70,0x37,0xa8,0xee,0xa8,0x02,0xb0,0x72,0x53,0x55,0xa1,0xae,0xb5,0xfe,0xb2,0xd6,0xfe,0xff,0xfe,0x93,\r\n0xc3,0xd3,0x01,0x8c,0x01,0x10,0xe3,0x01,0x63,0xcb,0x0c,0x03,0x1d,0x01,0x03,0x01,0x91,0xdc,0xf7,0xfe,0x22,0xfe,0xbc,0xfe,0xb2,0xfe,0x1c,0xf5,0x01,0x6b,0x01,0x4f,0x72,0x8c,0x51,0xfe,0x4c,0x04,0x9d,0xfb,0x63,0x05,0x31,0x94,0xfd,0xaa,0x51,0xe9,0xdd,0xed,0xfe,0x96,0xc2,0x01,0x18,0x02,0x22,0x01,0x81,0x01,0x71,0x02,0x22,0x01,\r\n0x1a,0xfe,0xfe,0x2c,0xfe,0xce,0x00,0x03,0x00,0x27,0x00,0x00,0x07,0x1c,0x05,0x31,0x00,0x2e,0x00,0x3a,0x00,0x3e,0x00,0x00,0x01,0x15,0x23,0x11,0x16,0x16,0x17,0x3e,0x02,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x33,0x15,0x21,0x35,0x36,0x36,0x35,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x27,0x15,0x10,0x02,0x23,0x22,0x26,\r\n0x26,0x35,0x34,0x36,0x37,0x11,0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x21,0x11,0x04,0x07,0x6d,0x52,0x75,0x32,0x23,0x50,0x53,0x48,0x94,0xaf,0x3a,0x30,0xa2,0xfe,0xc3,0x28,0x33,0xa1,0x59,0x64,0xa8,0x49,0x51,0xe0,0xda,0x7f,0xc8,0x72,0x92,0x7e,0x01,0xbb,0xa9,0x95,0x9b,0x46,0x9c,0x86,0x79,0x84,\r\n0xfe,0xed,0x05,0x31,0x94,0xfe,0xa9,0x0a,0x43,0x40,0x42,0x4d,0x23,0xd1,0xab,0x64,0xbb,0x3b,0x95,0x93,0x39,0xb3,0x58,0x01,0x00,0x9f,0x95,0xfe,0x5d,0x01,0x94,0x82,0x7e,0x18,0x88,0xfe,0xf4,0xfe,0xe8,0x70,0xd5,0x92,0x81,0xb4,0x1f,0x02,0x06,0xfd,0x83,0x28,0x5d,0x5c,0x93,0xab,0xe8,0xcc,0xff,0x01,0x55,0xfe,0xab,0x00,0x00,0x02,\r\n0x01,0x1a,0x00,0x00,0x06,0x29,0x05,0x31,0x00,0x1a,0x00,0x26,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x02,0x07,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x11,0x34,0x12,0x24,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x06,0x29,0xab,0xa8,0xed,0x99,0xf7,0x90,0x08,0x2c,0x88,\r\n0x44,0x96,0xb7,0xbe,0x91,0xcb,0xd2,0xbd,0x01,0x47,0xc3,0x02,0x48,0xfd,0x32,0x63,0x45,0x47,0x77,0x2a,0x0a,0x79,0x6b,0x44,0x5e,0x04,0x9d,0xfb,0x63,0x04,0x9d,0x8d,0xfe,0xfc,0xa8,0x2b,0x33,0xbf,0x9c,0x9e,0xc8,0x01,0x21,0x01,0x1e,0xd0,0x01,0x5e,0xc3,0xfc,0x27,0x54,0x82,0x3c,0x30,0x8d,0xa0,0x74,0x00,0x03,0x00,0x48,0xff,0x00,\r\n0x06,0xfc,0x05,0x31,0x00,0x2a,0x00,0x34,0x00,0x40,0x00,0x00,0x01,0x11,0x23,0x11,0x23,0x06,0x00,0x21,0x22,0x24,0x26,0x35,0x34,0x36,0x33,0x21,0x36,0x35,0x34,0x02,0x27,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x07,0x33,0x11,0x01,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,\r\n0x24,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x06,0xfc,0xa8,0xfb,0x59,0xfe,0x6c,0xfe,0xef,0x8d,0xfe,0xfd,0x83,0xba,0x9a,0x03,0x3c,0x07,0x80,0x78,0x25,0x1b,0xbf,0x92,0x5f,0x97,0x56,0x66,0xc1,0x84,0xb7,0x01,0x0d,0x92,0x06,0xcf,0xfe,0x58,0xfc,0xcb,0x36,0x43,0xd2,0xc5,0xaf,0x01,0x06,0xc9,0x67,0x44,0x44,\r\n0x66,0x60,0x4a,0x4b,0x60,0x05,0x31,0xf9,0xf9,0x01,0xdc,0xf9,0xfe,0xf3,0x6e,0xb8,0x75,0x74,0x8c,0x60,0x31,0xb9,0x01,0x09,0x46,0x25,0x52,0x36,0xa2,0xc1,0x55,0x9f,0x70,0x6d,0xa9,0x5f,0xad,0xfe,0xb1,0xee,0x30,0x48,0x03,0x96,0xfb,0xd5,0x4b,0x35,0x74,0x7d,0xb6,0x03,0x30,0x53,0x7f,0x7d,0x55,0x52,0x6c,0x6e,0x00,0x04,0x00,0x23,\r\n0xff,0xe4,0x07,0x20,0x05,0x31,0x00,0x30,0x00,0x3c,0x00,0x40,0x00,0x4c,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x23,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x11,0x21,0x15,0x23,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,\r\n0x07,0x01,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x11,0x23,0x11,0x05,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x26,0x06,0x16,0x2d,0x3b,0x87,0x73,0x4d,0x42,0x69,0x78,0x88,0x79,0x80,0x9b,0x31,0x9b,0x4b,0xa2,0x87,0x7f,0xc8,0x72,0x72,0x6c,0x02,0xbc,0x6d,0xea,0x3f,0xa8,0x61,0x72,0xc0,0x6c,0x47,\r\n0x3d,0xfc,0x0c,0x63,0x95,0x9b,0x46,0x9c,0x86,0x65,0x52,0xff,0x02,0xf9,0x25,0x20,0x44,0x30,0x62,0x2a,0x46,0x2c,0x43,0xff,0x70,0xca,0xca,0x47,0x35,0xdf,0x8e,0xb4,0xd5,0xe1,0xc0,0x8d,0x86,0x90,0xd0,0xe5,0x6f,0x70,0xd5,0x92,0x86,0xa4,0x2a,0x02,0x06,0x94,0xfe,0xab,0x57,0x65,0x83,0xeb,0x99,0xa0,0xfe,0xda,0x53,0x02,0xd0,0x28,\r\n0x5d,0x5c,0x93,0xab,0xc1,0xf3,0xff,0x01,0x55,0xfe,0xab,0x98,0x33,0x7c,0x65,0x74,0x93,0xf1,0x47,0x80,0x5a,0x00,0x00,0x02,0x00,0xbf,0xff,0xe5,0x05,0xa8,0x04,0xc9,0x00,0x0f,0x00,0x1f,0x00,0x00,0x05,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x03,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,\r\n0x36,0x36,0x35,0x34,0x26,0x26,0x03,0x33,0xa6,0xfe,0xdc,0xaa,0xa9,0x01,0x25,0xa6,0xa8,0x01,0x24,0xa9,0xa9,0xfe,0xdb,0xa7,0x7f,0xda,0x80,0x7f,0xda,0x80,0x7f,0xda,0x80,0x80,0xd9,0x1b,0xa6,0x01,0x21,0xab,0xa9,0x01,0x22,0xa7,0xa7,0xfe,0xdd,0xa8,0xa8,0xfe,0xdd,0xa7,0x04,0x5b,0x7f,0xdf,0x81,0x80,0xdd,0x7e,0x7d,0xdd,0x81,0x81,\r\n0xe0,0x7e,0x00,0x01,0x00,0x34,0xff,0xe6,0x06,0x34,0x04,0xc9,0x00,0x1b,0x00,0x00,0x01,0x22,0x04,0x06,0x15,0x10,0x05,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x27,0x24,0x11,0x34,0x26,0x24,0x03,0x34,0xaa,0xfe,0xe8,0xa0,0x01,0x32,0x62,0xaf,0xbf,0xc1,0x01,0x61,0xde,0xe0,0x01,0x60,0xc0,0xbf,\r\n0xb0,0x61,0x01,0x31,0xa0,0xfe,0xea,0x04,0x33,0x89,0xef,0x88,0xfe,0xef,0xc2,0x7a,0x6a,0x01,0x37,0xac,0xb7,0x01,0x32,0xad,0xaf,0xfe,0xcf,0xb6,0xac,0xfe,0xc8,0x69,0x7a,0xc2,0x01,0x11,0x88,0xef,0x89,0x00,0x00,0x02,0x00,0x45,0x00,0x00,0x06,0x22,0x04,0xdc,0x00,0x1e,0x00,0x2a,0x00,0x00,0x37,0x21,0x32,0x36,0x36,0x35,0x34,0x26,\r\n0x27,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x21,0x01,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x45,0x03,0x61,0x87,0xe4,0x72,0xb2,0x8d,0x2c,0x4e,0x81,0x4b,0x72,0x9c,0x66,0xb0,0x5f,0x99,0x01,0x21,0xab,0x9b,0xfe,0xcd,0xae,0xfc,0x9f,0x03,0x91,\r\n0x31,0x2f,0x40,0x57,0x4b,0x32,0x33,0x47,0x97,0x7d,0xd7,0x8e,0x95,0xf7,0x31,0x44,0x45,0x42,0x81,0x4b,0x9f,0x73,0x55,0x88,0x4e,0xac,0xfe,0xe0,0xa5,0xb1,0xfe,0xee,0xa8,0x03,0xb1,0x28,0x4e,0x1f,0x0b,0x57,0x33,0x33,0x47,0x47,0x00,0x01,0x01,0x78,0xff,0xe7,0x04,0xef,0x04,0xc9,0x00,0x28,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,\r\n0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x04,0xef,0x75,0xca,0x7b,0xd9,0xe4,0x5a,0x65,0xab,0x53,0x51,0x81,0x4b,0x96,0x77,0xb6,0xb6,0x77,0x83,0x98,0x7d,0x7f,0x95,0x5c,0xa8,0xe6,0x72,0xba,\r\n0x68,0x49,0x50,0x4e,0x5e,0x01,0x54,0x60,0xab,0x62,0xc6,0x7b,0x5b,0x50,0x39,0x64,0x3a,0x60,0x74,0x8d,0x6b,0x58,0x50,0x6d,0x74,0x64,0xa4,0x58,0x9a,0x5a,0x5f,0x84,0x2d,0x2a,0x98,0x00,0x00,0x02,0x00,0x9e,0xff,0xe8,0x05,0xca,0x04,0xec,0x00,0x0b,0x00,0x32,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0x14,0x16,\r\n0x13,0x24,0x36,0x37,0x26,0x26,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x24,0x11,0x34,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x17,0x03,0x29,0x33,0x47,0x47,0x33,0x35,0x45,0x48,0x30,0x01,0x17,0xee,0x05,0x05,0x58,0x51,0x3e,0x7e,0x8b,0x6c,0xca,0xb8,0x27,0x39,\r\n0x9d,0x76,0x77,0x9b,0x37,0x27,0xfe,0x29,0x8a,0x5c,0x31,0x1d,0x5c,0xbf,0xb0,0x72,0x44,0x38,0x29,0x4d,0x0e,0x0f,0x4d,0x28,0x39,0x43,0x01,0xa6,0x3b,0xb0,0x7e,0x4f,0x77,0x31,0x74,0x3c,0xc2,0x6d,0x74,0xaf,0x7d,0x33,0x1e,0x62,0x40,0x6f,0x97,0x98,0x6e,0x37,0x67,0x21,0x67,0x01,0x46,0xa9,0x71,0x66,0x2f,0x59,0x2c,0x4d,0x79,0x54,\r\n0x20,0x00,0x00,0x02,0x00,0x36,0xff,0xc0,0x06,0x32,0x04,0xcd,0x00,0x33,0x00,0x3e,0x00,0x00,0x01,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x1e,0x02,0x17,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x27,0x2e,0x03,0x23,0x22,0x00,0x03,0x27,0x36,0x12,0x37,0x26,0x26,0x27,0x37,\r\n0x1e,0x02,0x25,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x36,0x02,0x96,0x38,0x3a,0x51,0xa3,0x85,0x80,0xa1,0x6e,0x69,0x30,0x3f,0x2b,0x17,0x0b,0x11,0x05,0x24,0x20,0x29,0x31,0x0e,0x8b,0x13,0x83,0x63,0x5e,0x79,0x13,0x1d,0x2d,0x40,0x49,0x33,0xe0,0xfe,0xc2,0x66,0x8f,0x3d,0xf0,0xa3,0x2d,0xc1,0x7c,0x21,0x55,0xba,0x9b,0x02,\r\n0x01,0x57,0x37,0x38,0x53,0x5e,0x51,0x6a,0x02,0xc8,0x0f,0x06,0x59,0x6d,0x7f,0xa4,0x9e,0x75,0x5e,0x91,0x27,0x25,0x65,0x82,0x82,0x43,0x44,0x16,0x1f,0x5a,0x61,0x18,0x96,0xa0,0x7f,0x79,0xb5,0x7a,0x4d,0x21,0xfe,0xd0,0xfe,0xc7,0x25,0xdd,0x01,0x4f,0x55,0x9a,0xe7,0x32,0x88,0x14,0x90,0xdb,0x5f,0x38,0x54,0x55,0x41,0x64,0x3f,0x07,\r\n0x62,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x05,0xcf,0x04,0xbe,0x00,0x1e,0x00,0x00,0x13,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x21,0x21,0x15,0x21,0x22,0x26,0x99,0xa7,0xa7,0x5c,0xa0,0x5f,0x97,0x7f,0x66,0x6a,0x97,0x7b,0x01,0xd2,0xfe,0x2e,0x7b,\r\n0x97,0x01,0x04,0x03,0x8f,0xfc,0x56,0xbc,0xd0,0x01,0x42,0xbd,0x6b,0x6b,0xbe,0x50,0x8c,0x4f,0x92,0x59,0x54,0x5a,0x6f,0x97,0x77,0x61,0xb0,0x97,0xa8,0x00,0x00,0x01,0x01,0x4a,0xff,0xe5,0x05,0x1e,0x04,0xc9,0x00,0x2e,0x00,0x00,0x25,0x32,0x36,0x37,0x33,0x06,0x04,0x23,0x22,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x07,0x23,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x0e,0x03,0x07,0x0e,0x02,0x15,0x14,0x16,0x03,0x30,0x95,0xa1,0x16,0xa2,0x18,0xfe,0xff,0xd5,0x8b,0xdf,0x7c,0x2e,0x5c,0x9a,0x95,0x8b,0x6f,0x3b,0xa5,0x6e,0x75,0x97,0x0d,0x9b,0xf9,0xbb,0x7b,0xc6,0x72,0x24,0x3d,0x59,0x6f,0x81,0x94,0x71,0x3e,0xad,0x7d,0x7c,\r\n0x7b,0xbd,0xd2,0x56,0x9e,0x6b,0x49,0x71,0x54,0x42,0x22,0x20,0x32,0x44,0x32,0x4c,0x6a,0x74,0x68,0xa1,0xd0,0x59,0x9b,0x53,0x40,0x5f,0x48,0x33,0x27,0x1e,0x21,0x35,0x4d,0x38,0x5f,0x6c,0x00,0x01,0x00,0x28,0xff,0xe7,0x06,0x3f,0x04,0xc9,0x00,0x20,0x00,0x00,0x01,0x21,0x15,0x21,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,\r\n0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x02,0x27,0x02,0xd5,0x03,0x6a,0xfd,0xd4,0x7c,0x81,0xa4,0xfe,0xd4,0xa4,0xa4,0xfe,0xd3,0xa3,0x7c,0x6e,0x5b,0x4d,0x58,0x7c,0xdb,0x7d,0x7c,0xdc,0x7c,0xdb,0xc0,0x04,0xc9,0x8b,0x5d,0xfb,0x91,0xa9,0xfe,0xe8,0xad,0xad,0x01,0x19,0xa8,0x92,0xfb,\r\n0x5a,0x6e,0x40,0xc9,0x70,0x7d,0xd3,0x7b,0x7b,0xd4,0x7c,0xae,0x01,0x02,0x3b,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x05,0xcf,0x04,0xbe,0x00,0x1e,0x00,0x00,0x13,0x34,0x36,0x33,0x21,0x15,0x21,0x20,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x34,0x37,0x26,0x99,0xcf,0xbd,\r\n0x03,0xaa,0xfc,0x71,0xfe,0xfc,0x43,0x7a,0x55,0x01,0xd2,0xfe,0x2e,0x7b,0x97,0xd0,0x7f,0x97,0x60,0xa0,0x5b,0xa7,0xa7,0x03,0x7b,0x99,0xaa,0x98,0xb0,0x3c,0x64,0x38,0x96,0x70,0x59,0xa8,0x97,0x50,0x8b,0x50,0xbd,0x6b,0x6b,0x00,0x00,0x02,0x00,0xac,0x00,0x00,0x05,0x2f,0x04,0xac,0x00,0x0f,0x00,0x1f,0x00,0x00,0x01,0x14,0x02,0x04,\r\n0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x07,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x05,0x2f,0x9b,0xfe,0xf4,0x9b,0x9c,0xfe,0xf6,0x9b,0x9a,0x01,0x0d,0x9a,0x9a,0x01,0x0c,0x9c,0xa5,0x6c,0xc0,0x71,0x70,0xc1,0x6c,0x6e,0xbe,0x71,0x70,0xbf,0x6e,0x02,0x55,0xa2,0xfe,0xea,\r\n0x9d,0x9f,0x01,0x14,0xa2,0xa1,0x01,0x16,0xa0,0xa0,0xfe,0xe9,0xa0,0x73,0xc9,0x76,0x76,0xca,0x72,0x74,0xc9,0x74,0x73,0xca,0x00,0x01,0x00,0xa1,0xff,0xfd,0x05,0x3a,0x04,0xac,0x00,0x1d,0x00,0x00,0x01,0x14,0x02,0x07,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,\r\n0x33,0x32,0x04,0x12,0x05,0x3a,0xc2,0x8b,0x4a,0x68,0x8a,0x75,0xc4,0x6f,0x70,0xc5,0x72,0x8e,0x63,0x49,0x8d,0xc0,0xa0,0x01,0x10,0x9c,0x9d,0x01,0x11,0x9f,0x02,0x55,0xb8,0xfe,0xa6,0x46,0x93,0x37,0x01,0x08,0x86,0x72,0xcb,0x75,0x77,0xc9,0x72,0x8b,0xfe,0xf9,0x34,0x92,0x47,0x01,0x59,0xb8,0xa0,0x01,0x18,0x9f,0xa1,0xfe,0xe8,0x00,\r\n0x00,0x01,0x00,0xf6,0x00,0x00,0x04,0xe6,0x04,0xac,0x00,0x25,0x00,0x00,0x01,0x14,0x02,0x04,0x23,0x21,0x35,0x21,0x32,0x37,0x24,0x11,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x04,0xe6,0x9c,0xfe,0xef,0x9f,0xfe,0x5c,0x01,0xa4,0x3c,0x4d,\r\n0x01,0x1e,0x73,0xc4,0x70,0x54,0x80,0x7d,0x57,0x5c,0x3f,0x75,0x62,0xae,0x64,0xb0,0x66,0x66,0xb0,0x64,0xa8,0x01,0x0d,0x97,0x02,0x55,0x9d,0xfe,0xea,0xa2,0xa4,0x1b,0x64,0x01,0x32,0x72,0xca,0x76,0x7c,0x59,0x55,0x7f,0x44,0x72,0x77,0x66,0xae,0x65,0x64,0xb1,0x65,0x9b,0xfe,0xec,0x00,0x02,0x00,0xdd,0xff,0xdd,0x04,0xfe,0x04,0xac,\r\n0x00,0x32,0x00,0x3c,0x00,0x00,0x05,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x32,0x37,0x17,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x07,0x16,0x33,0x32,0x37,0x05,0x32,0x37,0x26,0x26,0x23,0x22,\r\n0x15,0x14,0x16,0x04,0xfe,0x54,0x6c,0x6b,0x58,0xb2,0x92,0x57,0xa4,0x5f,0x57,0x99,0x5d,0x73,0xee,0x48,0x3b,0x65,0xae,0x66,0x2d,0x3a,0x65,0x36,0x2f,0x56,0x20,0x6b,0x32,0x70,0x97,0x97,0x6a,0x8d,0xff,0x9c,0x70,0x46,0x38,0x0c,0x26,0xfd,0x55,0xc5,0x55,0x3c,0xad,0x51,0xa6,0x6d,0x23,0x33,0x61,0x45,0x2c,0x4e,0x81,0x46,0x53,0x7c,\r\n0x42,0x6f,0x55,0x53,0xbe,0x6e,0xbd,0x69,0x30,0x27,0x58,0x41,0x68,0x35,0x47,0x8e,0x6d,0x66,0x96,0x9e,0xfe,0xf1,0x96,0xe1,0x9a,0x51,0x09,0x02,0x4f,0x43,0x4b,0x64,0x36,0x43,0x00,0x03,0x00,0x60,0xff,0xf3,0x05,0x7c,0x04,0xc1,0x00,0x26,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x35,0x34,0x37,0x24,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x26,0x27,0x05,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x36,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xf0,0x51,0x90,0x6c,0x3f,0xca,0xb8,0x25,0x37,0xbb,0x8f,0x8d,0xbd,0x48,0xfe,0x56,\r\n0x92,0x69,0x67,0x95,0xc1,0x82,0xf3,0xf0,0xdd,0x3a,0x5e,0x74,0xfd,0xe6,0x33,0x24,0x25,0x3f,0x33,0x88,0x02,0x00,0x60,0x46,0x45,0x61,0x5d,0x49,0x4b,0x5b,0x04,0xc1,0x0c,0x1f,0x44,0x78,0x64,0x87,0xce,0x46,0x23,0x63,0x38,0x88,0xa2,0xa7,0x83,0x6f,0x45,0x9b,0x01,0x45,0x69,0x92,0x95,0x67,0xa8,0x49,0x61,0x24,0x3f,0xa0,0x63,0x3a,\r\n0x42,0x1f,0x06,0x61,0x27,0x37,0x39,0x25,0x5c,0x3c,0x2d,0xfd,0xc2,0x39,0x51,0x4e,0x3c,0x35,0x45,0x45,0x00,0x03,0x00,0x43,0xff,0xdc,0x05,0x99,0x04,0xac,0x00,0x35,0x00,0x3e,0x00,0x47,0x00,0x00,0x01,0x14,0x07,0x16,0x15,0x14,0x06,0x07,0x27,0x32,0x36,0x35,0x34,0x27,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x25,0x26,\r\n0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x17,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x15,0x14,0x17,0x36,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x99,0xaa,0x74,0x89,0xaa,0x4b,0x62,0x7f,0x84,0x6b,0xf7,0x1b,0xc7,0xa8,0x73,0xa0,0xea,\r\n0x01,0x1f,0x08,0x89,0x57,0x35,0x47,0x25,0x30,0x5a,0x3e,0x59,0xa3,0x76,0x68,0xae,0x67,0x06,0x7f,0x43,0x50,0xa5,0x7a,0x80,0xa0,0x9d,0x4e,0x35,0x83,0x72,0x94,0xfd,0x42,0xc5,0x99,0x49,0x2d,0x4d,0x7e,0x03,0x78,0xdd,0x63,0x78,0x8b,0x99,0x9a,0x26,0xa0,0x67,0x49,0x5c,0x6e,0x19,0x0f,0xe1,0xed,0x9e,0x73,0xa2,0x9e,0x18,0xac,0xfa,\r\n0x4c,0x3c,0x1d,0x3a,0x27,0x82,0x20,0x93,0x4d,0x78,0xad,0x93,0xfe,0xfa,0xa0,0x08,0x0a,0x6a,0x89,0x84,0xb0,0xb0,0x73,0x38,0x4e,0x97,0x5c,0x69,0x3e,0xfe,0xd3,0x10,0x56,0x56,0x2b,0x42,0xa5,0x00,0x00,0x02,0x00,0x7e,0x00,0x00,0x05,0x5d,0x04,0xac,0x00,0x1d,0x00,0x28,0x00,0x00,0x21,0x21,0x22,0x24,0x26,0x35,0x34,0x37,0x26,0x23,\r\n0x37,0x20,0x13,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x33,0x21,0x01,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x33,0x32,0x36,0x05,0x5d,0xfe,0x06,0xa4,0xfe,0xed,0x9d,0x9d,0x73,0xbb,0x0f,0x01,0x20,0x98,0x7c,0xa2,0x86,0xac,0xad,0x85,0x7e,0xa1,0x4c,0x4a,0xfc,0xb9,0x01,0xfa,0xfe,0x98,0x54,0x3e,\r\n0x7b,0x59,0x3a,0x59,0x41,0x3f,0x53,0x84,0xeb,0x8d,0xc7,0x7d,0xc7,0xa5,0xfe,0xe6,0x2b,0xa0,0x7a,0x7b,0xa7,0x85,0xa0,0x4a,0x6c,0x93,0xb9,0x01,0xf5,0x36,0x49,0x1d,0x79,0x5c,0x40,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x05,0x06,0x04,0xc1,0x00,0x27,0x00,0x00,0x21,0x21,0x22,0x26,0x26,0x35,0x34,0x37,0x36,0x37,0x36,0x35,0x34,0x26,\r\n0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x07,0x06,0x15,0x14,0x16,0x33,0x21,0x05,0x06,0xfd,0x4d,0x66,0xb1,0x66,0x8d,0x27,0xd9,0x84,0x4b,0x3f,0x37,0x4a,0x1b,0x8e,0x31,0xab,0x7c,0x84,0xa8,0x8b,0x3e,0x84,0x3f,0x84,0x7c,0x5c,0x02,0xb3,0x62,0xab,0x64,0xb5,0x66,0x1e,0x61,\r\n0x3a,0x49,0x3f,0x50,0x45,0x2f,0x30,0x1c,0x52,0x41,0x62,0x74,0x9f,0xae,0x8d,0x9d,0x46,0x1f,0x34,0x1e,0x40,0x70,0x5b,0x83,0x00,0x02,0x00,0x8d,0x00,0x00,0x05,0x4e,0x04,0xc1,0x00,0x26,0x00,0x31,0x00,0x00,0x01,0x23,0x16,0x16,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,\r\n0x27,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x10,0x27,0x35,0x21,0x01,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x33,0x32,0x36,0x05,0x4e,0xd6,0x62,0x4d,0x9f,0xfe,0xf0,0x9d,0xa4,0xfe,0xf0,0x9a,0x5a,0x91,0x5d,0x64,0x90,0x90,0x64,0x5c,0x3f,0x08,0x70,0xc3,0x76,0x6e,0xc5,0x75,0xec,0x01,0xb7,0xfc,0xeb,0x3f,0x25,0x2e,0x41,\r\n0x0b,0x3f,0x3b,0x2b,0x39,0x04,0x07,0x6a,0xc1,0x87,0x9f,0xfe,0xed,0xa3,0xa5,0x01,0x22,0xaf,0xa0,0x01,0x21,0x8a,0xa4,0x72,0x6f,0xa6,0x3c,0x23,0x40,0x80,0xd5,0x76,0x74,0xc6,0x70,0x01,0x15,0xa7,0xa1,0xff,0x00,0x29,0x49,0x58,0x53,0x4b,0x4f,0x00,0x00,0x02,0x01,0x0d,0x00,0x00,0x04,0xcf,0x04,0xac,0x00,0x26,0x00,0x31,0x00,0x00,\r\n0x01,0x21,0x22,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x17,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x21,0x01,0x34,0x23,0x22,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x04,0xcf,0xfd,0x93,0x48,0x68,0x35,0x73,0xa4,0x80,0x92,0x92,0x68,0x9c,\r\n0x74,0x08,0x7d,0x63,0x5c,0x37,0x74,0x6a,0x9d,0xab,0xdb,0x25,0x70,0x5b,0x9e,0x5c,0x02,0x6d,0xfe,0xa4,0x5e,0x29,0x7f,0x17,0x20,0x6e,0x27,0x27,0x41,0x04,0x07,0x68,0x48,0x5e,0x32,0x63,0x6f,0x62,0x5d,0x7b,0x45,0x1b,0x16,0x6a,0x87,0x25,0x73,0x56,0xe3,0xb2,0x4e,0x53,0x7c,0xa5,0x5a,0x9f,0x5c,0xfd,0xa9,0x41,0x28,0x15,0x1a,0x2b,\r\n0x29,0x00,0x00,0x02,0x01,0xc8,0xff,0xe8,0x05,0x54,0x03,0x7c,0x00,0x0b,0x00,0x1b,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x8e,0x7f,0xa0,0xa0,0x7f,0x7f,0xa0,0xa0,0x7f,0x7e,0xd0,0x78,0x78,0xd1,0x7d,0x7e,0xd0,\r\n0x78,0x78,0xd0,0x81,0xa9,0x88,0x88,0xa9,0xa9,0x88,0x88,0xa9,0x99,0x76,0xd3,0x81,0x81,0xd3,0x76,0x76,0xd3,0x81,0x81,0xd3,0x76,0x00,0x00,0x02,0x00,0x24,0xfe,0x63,0x06,0xf8,0x05,0xb3,0x00,0x18,0x00,0x21,0x00,0x00,0x21,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x11,0x10,0x12,0x21,\r\n0x20,0x00,0x11,0x03,0x11,0x10,0x26,0x23,0x22,0x06,0x11,0x11,0x06,0xf8,0xfa,0x99,0x67,0x5f,0x60,0x66,0x01,0x55,0xfe,0xb6,0xc2,0xb6,0xc4,0xb4,0x01,0x57,0xff,0x01,0x03,0x01,0x02,0x01,0x01,0xa4,0xb1,0xae,0xb0,0xae,0x3f,0x46,0x4a,0x3b,0x93,0x86,0x90,0x8f,0x8b,0x02,0x9d,0x01,0x44,0x01,0x3f,0xfe,0xc5,0xfe,0xb8,0xfd,0x63,0x02,\r\n0x8e,0x01,0x05,0xf4,0xf8,0xfe,0xff,0xfd,0x72,0x00,0x00,0x01,0x00,0x37,0xff,0xe6,0x06,0xe5,0x05,0xb3,0x00,0x1e,0x00,0x00,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x06,0xe5,0xfc,0xd6,0x67,0x56,0xf8,0xd5,0xd5,\r\n0xf8,0x66,0x83,0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x93,0x93,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,0x00,0x01,0x00,0x32,0xff,0xe6,0x06,0xe9,0x05,0xb3,0x00,0x2d,\r\n0x00,0x00,0x25,0x15,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x07,0x06,0xe9,0xfd,0x59,0x53,0x52,0x6c,0x79,0x71,0x61,0xa4,0x61,0x71,0x7b,0x6a,0x66,\r\n0x5d,0x9b,0x5f,0x6c,0xc5,0xbe,0x6e,0x96,0x21,0x08,0x20,0x96,0x6f,0x76,0xad,0x60,0x4b,0x30,0x93,0x93,0x51,0x74,0x01,0x4b,0xf6,0x01,0x12,0x01,0x00,0xc7,0xeb,0xfc,0x9a,0x03,0x66,0xea,0xc8,0xfb,0xfe,0xe9,0xf9,0xfe,0x87,0x77,0x37,0x7f,0x01,0xa8,0xe2,0x01,0x56,0x01,0x6e,0x74,0x6b,0x6a,0x75,0xa3,0xfe,0xc0,0xe1,0x99,0xfe,0x93,\r\n0x56,0x00,0x00,0x02,0x00,0x7e,0xff,0xe6,0x06,0x9e,0x07,0xc8,0x00,0x30,0x00,0x3c,0x00,0x00,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x04,0x02,0x15,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x12,0x06,0x4e,0x79,0xd9,0x88,0xac,0xd5,0xd6,0xd3,0x80,0xaf,0xac,0xfe,0xf0,0x8c,0x6e,0x6e,0x95,0x71,0x7d,0xb3,0x01,0x60,0xde,0xfd,0xba,0x77,0x5b,0x79,0x7a,0x9b,0x9f,0x1d,0xac,0xbb,0xb2,0xd7,0x7f,0x94,0x5e,0x65,0xa7,0x55,0x4b,0xbb,0xb2,0x7c,0x69,0x80,\r\n0xa8,0x02,0x8e,0xb7,0xfe,0xc0,0xb1,0x01,0x1c,0xdd,0xdb,0x01,0x6c,0x9e,0x54,0x9d,0xfe,0xec,0xb7,0xb6,0xfe,0xc4,0x9e,0x3a,0xa6,0x01,0x7d,0xaa,0xe3,0x01,0x57,0xc6,0x8c,0x5b,0x97,0x51,0x62,0x6e,0x3b,0x8a,0x3f,0xba,0x95,0x6f,0xcf,0x72,0x6b,0xfe,0xde,0xba,0x94,0xfc,0x55,0x8d,0xfe,0xc6,0xc1,0xa3,0xbe,0x01,0x24,0x00,0x00,0x01,\r\n0x00,0x37,0xfd,0xfe,0x06,0xe5,0x07,0x61,0x00,0x43,0x00,0x00,0x05,0x27,0x12,0x11,0x10,0x00,0x21,0x22,0x00,0x02,0x11,0x10,0x12,0x04,0x33,0x32,0x12,0x35,0x10,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x13,0x07,0x02,0x11,0x10,0x00,0x33,0x32,0x16,0x15,0x10,0x07,0x15,0x16,0x16,0x15,0x14,0x02,0x06,\r\n0x23,0x22,0x24,0x02,0x02,0x35,0x10,0x12,0x00,0x21,0x32,0x04,0x12,0x11,0x14,0x02,0x06,0x53,0x9e,0x8b,0xfe,0xaf,0xfe,0xd1,0xd4,0xfe,0xa5,0xb6,0x9c,0x01,0x0e,0xb4,0xbf,0xd4,0xf8,0x72,0x65,0x63,0x6d,0x73,0x7a,0xa8,0xa0,0x8b,0x99,0x96,0x01,0x03,0xed,0xb9,0xd3,0xae,0x67,0x7d,0x96,0xff,0xa8,0xa9,0xfe,0xea,0xc9,0x74,0xde,0x01,\r\n0xaa,0x01,0x0a,0xef,0x01,0x6b,0xc2,0x4c,0x19,0x37,0x01,0x9f,0x01,0x92,0x01,0xa6,0x01,0xd3,0xfe,0xfe,0xfe,0x32,0xfe,0xcd,0xfe,0xd1,0xfe,0x00,0xff,0x01,0x24,0xfd,0x01,0x7d,0x96,0x9b,0x85,0xa2,0x8d,0xfe,0xe7,0xfe,0xbd,0xfe,0xb1,0xfe,0xae,0x37,0x01,0x75,0x01,0x5f,0x01,0x69,0x01,0x90,0xf0,0xca,0xfe,0xf8,0x67,0x06,0x1e,0xfc,\r\n0xb4,0xc0,0xfe,0xb0,0xa8,0xb1,0x01,0x4d,0x01,0xd0,0xe9,0x01,0x60,0x02,0x19,0x01,0x33,0xfd,0xfe,0x2f,0xfe,0xc6,0xd7,0xfe,0x31,0x00,0x00,0x01,0x00,0x46,0xfd,0xfe,0x06,0xd6,0x05,0xb3,0x00,0x3e,0x00,0x00,0x17,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x20,0x11,\r\n0x10,0x02,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x22,0x06,0x11,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x26,0x23,0x22,0x06,0x02,0x15,0x10,0x17,0xd0,0x41,0x49,0x51,0x92,0x64,0x56,0x7e,0x2a,0x05,0x24,0x86,0x5a,0x5b,0x6f,0x31,0x06,0x26,0x7f,0x60,0x01,0x3c,0x7f,0xe3,0x99,\r\n0x8c,0x6f,0x7e,0x77,0xb3,0xad,0x59,0x4e,0x5e,0x51,0xa3,0x4e,0x5b,0x63,0x54,0xa3,0x49,0x55,0x32,0x52,0x2f,0x7d,0x1a,0x85,0x01,0x91,0xdc,0xe8,0x01,0x4b,0xa8,0x56,0x6b,0x5f,0x62,0x52,0x73,0x64,0x61,0xfc,0xcf,0xfe,0xaa,0xfd,0xe8,0xfe,0xea,0x2d,0xac,0x40,0x01,0xe2,0x01,0xf7,0x01,0x51,0x01,0x57,0xda,0xfe,0xfe,0xfc,0xc4,0x03,\r\n0x3c,0x01,0x05,0xd7,0xe9,0xf1,0xfc,0xc2,0x03,0x3e,0x01,0x0b,0xcf,0x8b,0xfe,0xf9,0xb5,0xfe,0x46,0xfa,0x00,0x02,0x01,0x25,0xff,0xe6,0x05,0xf6,0x05,0xb3,0x00,0x0b,0x00,0x30,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x16,0x04,0x33,0x32,0x36,0x12,0x35,0x34,0x02,0x26,0x27,0x07,0x16,0x16,0x15,\r\n0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x20,0x27,0x03,0x6e,0x6e,0x5e,0x5e,0x7a,0x6e,0x5d,0x63,0x76,0xfd,0xb9,0x68,0x01,0x05,0x92,0xa8,0xfd,0x84,0x86,0xe3,0x82,0x03,0x55,0x62,0x62,0xb1,0x6f,0xa9,0xc8,0x86,0xed,0x9a,0xcb,0x01,0x41,0xb8,0xb6,0xfe,0xb1,0xcb,0xfe,0xbf,\r\n0xbe,0x04,0x1e,0x69,0x80,0x82,0x64,0x66,0x7c,0x78,0xfd,0x84,0x5c,0x60,0x95,0x01,0x0f,0xb0,0x9f,0x01,0x12,0xa3,0x07,0x08,0x1c,0x9b,0x60,0x65,0xa5,0x5d,0xc6,0xa3,0x7f,0xbd,0x66,0xb4,0xfe,0xa9,0xd3,0xdc,0xfe,0xab,0xbe,0x94,0x00,0x01,0x00,0x4b,0xfd,0xfe,0x06,0xd1,0x05,0xb3,0x00,0x2d,0x00,0x00,0x01,0x11,0x10,0x00,0x21,0x22,\r\n0x26,0x27,0x35,0x17,0x16,0x33,0x32,0x36,0x35,0x21,0x35,0x36,0x12,0x35,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,0x14,0x02,0x07,0x21,0x11,0x06,0xd1,0xfe,0xcd,0xfe,0xe6,0x46,0x76,0x55,0x4a,0x69,0x70,0xbb,0xdc,0xfd,0xa2,0x67,0x56,0xf8,0xd5,0xd5,0xf8,0x66,0x83,\r\n0x98,0x80,0x78,0xa4,0x01,0x27,0xb4,0xae,0x01,0x1c,0x9f,0x56,0x4a,0x01,0x9a,0x05,0x99,0xfa,0xb4,0xfe,0xe3,0xfe,0xce,0x13,0x14,0xac,0x18,0x22,0xc6,0xa3,0x62,0xa7,0x01,0x15,0x96,0x01,0x19,0x01,0x4d,0xfe,0xb2,0xfe,0xe8,0xae,0xfe,0xdd,0xc6,0x37,0xb9,0x01,0x64,0xbb,0xdc,0x01,0x5b,0xbe,0xbe,0xfe,0xa7,0xde,0x8d,0xfe,0xd6,0x74,\r\n0x05,0x06,0x00,0x02,0x00,0x3d,0xff,0xe6,0x06,0xde,0x07,0xc8,0x00,0x3f,0x00,0x4a,0x00,0x00,0x01,0x14,0x02,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x37,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x02,0x11,0x14,0x12,0x17,0x07,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x17,0x36,0x36,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x12,0x07,0x34,0x26,0x27,0x06,0x02,0x15,0x10,0x33,0x32,0x12,0x06,0x9e,0x64,0xac,0x6c,0x88,0xad,0xb0,0xad,0x57,0x59,0x88,0x91,0xa2,0xea,0x8c,0x88,0x65,0x58,0x9a,0x5c,0x6b,0x6e,0xc5,0x81,0x75,0xab,0x20,0x07,0x2b,0xc0,0x7d,0x90,0x85,0x3d,\r\n0x49,0x60,0x63,0x3b,0x64,0x3f,0x17,0x89,0x97,0x8e,0xad,0x67,0x75,0x48,0x54,0xa4,0x2b,0x30,0x8f,0x7f,0x9a,0x61,0x6e,0x02,0x8e,0xbb,0xfe,0xc2,0xaf,0x01,0x18,0xe1,0xdd,0x01,0x6f,0xa0,0x4f,0xf6,0xe6,0xfc,0xc2,0x03,0x3e,0x01,0xdc,0xfe,0xe3,0xfe,0xd4,0xb4,0xfe,0x8c,0x8c,0x37,0x98,0x01,0x9f,0xbb,0xe4,0x01,0x4a,0xad,0x90,0x81,\r\n0x83,0x8e,0x87,0x3a,0xa8,0x5c,0x63,0x6d,0x1d,0x1e,0x8a,0x3f,0xb8,0x97,0x6f,0xd0,0x70,0x6d,0xfe,0xdd,0xb8,0xb7,0xd9,0x4b,0x84,0xfe,0xd5,0xcf,0xfe,0x9f,0x01,0x13,0x00,0x02,0x00,0xdf,0xff,0xf4,0x05,0x88,0x03,0xf1,0x00,0x0b,0x00,0x1b,0x00,0x00,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x22,0x24,0x26,\r\n0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x04,0x03,0x32,0xc7,0xdf,0xdf,0xc7,0xc5,0xdd,0xdd,0xc5,0xaa,0xfe,0xee,0x97,0x95,0x01,0x13,0xab,0xae,0x01,0x14,0x94,0x97,0xfe,0xee,0x87,0xc2,0xa9,0xab,0xc1,0xc3,0xa9,0xa9,0xc2,0x93,0x7f,0xe9,0x96,0x97,0xea,0x7e,0x7f,0xe9,0x97,0x96,0xe8,0x80,0x00,0x00,0x02,0x00,0xa3,\r\n0xff,0xf4,0x05,0xc4,0x03,0xf1,0x00,0x2b,0x00,0x37,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x04,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x04,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x27,0x26,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x02,0x49,0x74,0x5a,0x5d,0x77,0xe8,0xc2,0xb7,0xe7,0xa0,0x01,0x2c,0xc4,0xbf,0x01,0x2c,0xa6,0xcb,0xc2,0x6d,0x6f,0x7a,0xdc,0x8a,0xd9,0xfe,0xf9,0x3f,0x73,0x43,0x82,0x41,0x03,0x55,0x6a,0x6c,0x3a,0x2a,0x27,0x3a,0x39,0x28,0x2b,0x39,0x01,0xb7,0x58,0x78,0x7b,0x63,0xc5,0xf0,0x01,0x05,0xd6,0x9f,0xf9,0x8a,0x88,\r\n0xfa,0x9d,0xc0,0xf6,0x27,0x95,0x1d,0xa8,0x83,0x74,0xb5,0x63,0xd9,0xb6,0x62,0x91,0x51,0x58,0x06,0x06,0x72,0x58,0x29,0x39,0x37,0x2b,0x29,0x39,0x39,0x00,0x00,0x02,0x00,0xc6,0x00,0x00,0x05,0xa2,0x05,0xe6,0x00,0x3e,0x00,0x4a,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,\r\n0x21,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x25,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x34,0x76,0x72,0x41,0x5d,0x15,\r\n0x07,0x0d,0x6e,0x4a,0x7e,0x89,0xb7,0xa0,0xfd,0xd2,0xa1,0xb6,0xad,0x66,0x5b,0x02,0x00,0x5b,0x64,0x36,0x33,0x2e,0x3f,0x03,0x91,0x02,0x3e,0x2d,0x31,0x31,0x27,0x1e,0x05,0x04,0x55,0x44,0x44,0x57,0x64,0x5d,0x96,0xa9,0x01,0x67,0x1f,0x2e,0x2d,0x20,0x1e,0x2d,0x2e,0x02,0x98,0xb3,0xa9,0x48,0x45,0x3f,0x4e,0xaf,0x99,0xfe,0x9e,0x9b,\r\n0xaf,0xb0,0x9a,0x04,0x9c,0xfb,0x6f,0x5b,0x60,0x60,0x5b,0x01,0x5e,0x55,0x5a,0x4c,0x3e,0x3e,0x4c,0x58,0x72,0x4f,0x73,0x10,0x05,0x05,0x18,0x42,0x58,0x59,0x41,0x4f,0x56,0xb1,0x3e,0x2b,0x20,0x20,0x2a,0x2a,0x20,0x20,0x2b,0x00,0x00,0x02,0x00,0xbb,0xff,0xf4,0x05,0xac,0x03,0xf3,0x00,0x2d,0x00,0x39,0x00,0x00,0x05,0x22,0x02,0x35,\r\n0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x02,0x07,0x35,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x68,0xc3,0xea,0xc8,0xa4,0x5f,0x8d,0x24,0x1e,\r\n0x91,0x63,0xa2,0xc1,0xc4,0xa5,0xb8,0x78,0x58,0x4e,0x53,0xab,0x58,0x4f,0x56,0x77,0x37,0x07,0x06,0x6f,0x58,0x5b,0x76,0x7a,0x55,0x29,0x39,0x39,0x29,0x2a,0x37,0x38,0x0c,0x01,0x1d,0xeb,0xdf,0x01,0x18,0x72,0x74,0x6b,0x7b,0xfe,0xea,0xdf,0xce,0xfe,0xe9,0x24,0x96,0x3c,0x01,0x37,0x92,0xd0,0x9c,0x91,0x91,0x9c,0xce,0x96,0xb0,0x74,\r\n0x02,0x54,0x68,0x74,0x58,0x5d,0x79,0x01,0x38,0x02,0x39,0x29,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x02,0x00,0xcf,0xff,0xed,0x05,0x98,0x05,0x82,0x00,0x3b,0x00,0x47,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,\r\n0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x18,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,\r\n0xed,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0x01,0x6f,0x27,0x3b,0x38,0x2a,0x27,0x3b,0x3c,0x01,0xae,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,\r\n0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x45,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x00,0x03,0x00,0xcf,0xff,0xed,0x05,0x98,0x05,0x82,0x00,0x43,0x00,0x4f,0x00,0x5b,0x00,0x00,0x01,0x07,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x16,\r\n0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x15,0x14,0x16,0x17,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x14,0x16,0x33,\r\n0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0xaa,0x08,0x9e,0x8f,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,0x98,0x81,0x29,0x75,0x3c,0x38,0x39,0x57,0xb7,0x96,0x70,0x81,0x78,0x58,0x56,0x71,0x08,0x1f,0x9b,0x81,0x8c,0x58,0x39,0xb1,0x54,0x41,0xab,0xa5,0x33,0xda,0xed,0xb0,0xc5,0x3d,0x74,0x59,0x64,0x72,0xdd,0x27,0x3b,0x38,\r\n0x2a,0x27,0x3b,0x3c,0xfe,0x0f,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x04,0x3d,0x10,0x29,0x72,0x52,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,0x93,0x5f,0x85,0xa0,0x13,0x0b,0x05,0x1e,0x8e,0x4f,0x89,0xa6,0x74,0x62,0x5a,0x74,0x6a,0x59,0x23,0x38,0x5e,0x7b,0x10,0x0e,0x23,0x9a,0x19,0x24,0x18,0x16,0xeb,0xcc,0xb9,0x01,\r\n0x03,0x58,0x3c,0x5c,0x5a,0x75,0x81,0xfc,0xf7,0x39,0x2b,0x29,0x3a,0x39,0x2a,0x2a,0x3a,0x02,0xbc,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x02,0x01,0x08,0xff,0xf4,0x05,0x5f,0x05,0x6a,0x00,0x28,0x00,0x34,0x00,0x00,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x26,0x02,0x27,0x33,0x16,0x16,0x17,0x36,0x36,0x33,\r\n0x32,0x04,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x6d,0x47,0x8b,0xa9,0xc6,0xae,0x9b,0x47,0xa9,0x46,0x30,0xae,0x49,0xd5,0x2c,0x49,0x25,0x30,0x91,0x3b,0xe7,0x01,0x05,0x7e,0xeb,0x98,0xca,0xfe,0xfa,0x7a,0x6a,0x58,\r\n0x75,0x75,0x5b,0x60,0x3b,0x28,0x28,0x3b,0x3b,0x28,0x2a,0x39,0xb9,0x34,0xc2,0xb1,0xa2,0xb0,0x26,0x1f,0xa1,0x01,0x70,0x54,0x44,0xd5,0xa6,0x16,0x1a,0xfc,0xe7,0x98,0xec,0x80,0xd7,0xaa,0x6d,0x7c,0x74,0x5c,0x57,0x76,0xce,0x2a,0x39,0x3c,0x27,0x29,0x3b,0x3a,0x00,0x02,0x00,0x35,0xff,0xf4,0x06,0x33,0x05,0xe6,0x00,0x3b,0x00,0x47,\r\n0x00,0x00,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x3e,0x02,0x33,0x32,0x12,0x15,0x14,0x06,0x07,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x21,0x36,0x11,0x34,0x26,0x23,0x22,0x06,0x06,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x05,0x06,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0xac,0xa3,0x53,0x8a,0x23,0x0d,0x48,0x66,0x36,0xa0,0xac,0x25,0x15,0x46,0x56,0x62,0xae,0x58,0xa4,0x66,0xfe,0xe2,0x5d,0x52,0x4d,0x2d,0x49,0x29,0xa7,0x01,0x53,0x47,0x51,0x58,0x37,0x07,0x06,0x70,0x58,0x5c,0x74,0x7b,0x64,0x80,0xc5,0x6a,0x01,0xbf,0x2a,0x3a,0x3a,0x2a,0x29,0x39,\r\n0x3a,0x01,0xfc,0xf8,0x01,0x00,0x75,0x66,0x37,0x65,0x3f,0xfe,0xfe,0xf4,0x64,0xce,0x31,0x5f,0x5b,0x04,0x91,0xfb,0x64,0x5d,0x97,0x56,0xc8,0x01,0x36,0xa7,0xbd,0x45,0x8c,0x64,0x9f,0x96,0xb8,0xae,0xbb,0x69,0x02,0x57,0x65,0x75,0x57,0x5f,0x77,0x82,0xec,0x36,0x02,0x39,0x29,0x2a,0x38,0x3b,0x27,0x27,0x3d,0x00,0x00,0x02,0x00,0xa7,\r\n0xff,0xf6,0x05,0xc1,0x05,0x82,0x00,0x40,0x00,0x4c,0x00,0x00,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x23,0x22,0x26,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x06,0x07,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x37,0x36,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x07,0x0e,0x03,0x15,0x14,0x17,0x36,0x36,\r\n0x33,0x32,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x21,0x16,0x1b,0x57,0x78,0x77,0x56,0x5c,0x77,0x9e,0x80,0x2f,0x57,0x56,0x45,0x3e,0x3e,0x1b,0x1e,0x25,0x18,0x10,0x02,0xda,0xfd,0x93,0x01,0x20,0xf9,0xaf,0xa5,0x12,0xac,0x15,0xd7,0xe9,0xcd,0xc0,0x78,0x3c,\r\n0xb4,0x16,0x6f,0x5d,0x26,0x49,0x49,0x52,0x46,0x4b,0x1c,0x2e,0x49,0x0d,0x9a,0x3b,0x29,0x27,0x3b,0x3a,0x28,0x27,0x3d,0x01,0x18,0x05,0x76,0x59,0x5a,0x75,0x7c,0x65,0xd1,0xfe,0xf7,0x27,0x46,0x4d,0x44,0x2e,0x33,0x57,0x84,0x1b,0x02,0xf1,0xc7,0xa3,0xef,0xa4,0x3b,0x28,0x77,0x57,0x3b,0x2d,0x28,0x3d,0x94,0xb6,0x35,0x30,0x56,0x71,\r\n0x93,0x5f,0xca,0x39,0x8b,0x7f,0x22,0x39,0x54,0x4c,0x34,0x49,0x3d,0xd0,0x29,0x3b,0x39,0x2b,0x29,0x39,0x3a,0x00,0x00,0x02,0x00,0x67,0xff,0xf4,0x06,0x00,0x04,0xfe,0x00,0x37,0x00,0x43,0x00,0x00,0x13,0x34,0x12,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x02,0x06,0x23,0x22,0x26,\r\n0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x01,0x23,0x03,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x02,0x25,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x67,0xd9,0xc5,0x57,0x9d,0x2b,0x1e,0x51,0x38,0x1a,0x3f,0x4b,0x35,0x37,0x15,0x31,0x37,0xa8,0x54,0x79,0x43,0x23,\r\n0x55,0x51,0x1d,0x2e,0x11,0x1d,0x2d,0x0b,0x01,0x13,0xc1,0xe5,0x3e,0x6d,0x3f,0x4a,0x67,0x31,0x3c,0x08,0x6f,0x58,0x5b,0x76,0x7a,0x65,0xc7,0xe6,0x01,0xbd,0x2a,0x39,0x3a,0x29,0x2a,0x37,0x38,0x01,0xdb,0xfa,0x01,0x1c,0x6a,0x57,0x94,0x7a,0x26,0x48,0x35,0x26,0xe1,0xa8,0x88,0xfe,0xe5,0x8f,0x32,0x51,0x1d,0x28,0x88,0x7f,0xfd,0x73,\r\n0x02,0x46,0xa1,0x7a,0x63,0xb5,0x6a,0x9d,0x76,0x5c,0x6e,0x74,0x58,0x5d,0x79,0x01,0x06,0x32,0x02,0x3b,0x27,0x2a,0x38,0x38,0x2a,0x28,0x3c,0x00,0x00,0x02,0x00,0xd0,0xff,0xf2,0x05,0x97,0x04,0xa3,0x00,0x0f,0x00,0x1e,0x00,0x00,0x01,0x32,0x04,0x12,0x15,0x14,0x02,0x04,0x23,0x22,0x24,0x02,0x35,0x34,0x12,0x24,0x13,0x32,0x36,0x35,\r\n0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x03,0x3a,0xaa,0x01,0x18,0x9b,0x9e,0xfe,0xe6,0xaf,0xa9,0xfe,0xe7,0x9e,0xa0,0x01,0x1e,0xa2,0xcb,0xf2,0x6d,0xc7,0x7f,0x82,0xcd,0x71,0x71,0xc9,0x04,0xa3,0x9a,0xfe,0xed,0xad,0xad,0xfe,0xec,0x96,0x9c,0x01,0x14,0xa7,0xa9,0x01,0x15,0x9c,0xfb,0xe5,0xf9,0xc8,0x80,0xd0,0x74,\r\n0x76,0xd0,0x80,0x7d,0xcf,0x73,0x00,0x02,0x00,0xd2,0xff,0xf7,0x05,0x95,0x04,0xa3,0x00,0x2a,0x00,0x36,0x00,0x00,0x05,0x27,0x36,0x12,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x24,0x33,0x32,0x04,0x12,0x15,\r\n0x10,0x25,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x4d,0x75,0x80,0x94,0x70,0xc9,0x81,0x85,0xc7,0x6e,0x85,0x6e,0x2d,0x15,0x38,0x69,0x48,0x48,0x6b,0x5b,0xa4,0x6f,0x75,0xbc,0x68,0xa0,0x01,0x11,0xaf,0xa5,0x01,0x15,0xa9,0xfd,0x93,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x09,0x70,0x69,0x01,0x19,0x97,0x65,0xb9,\r\n0x6f,0x6a,0xbc,0x71,0x9a,0xb4,0x0b,0x34,0x4d,0x4b,0x69,0x6b,0x49,0x4e,0x81,0x49,0x73,0xd6,0x8e,0x97,0x01,0x07,0x92,0x8e,0xfe,0xfa,0x8f,0xfe,0x90,0x65,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x02,0x01,0x47,0xff,0xf2,0x05,0x21,0x06,0x66,0x00,0x25,0x00,0x31,0x00,0x00,0x25,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x01,0x36,0x12,0x37,0x17,0x0e,0x02,0x07,0x0e,0x03,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x08,0x26,0x26,0x65,0x4b,0x50,0x65,0x6c,0xc8,0x7e,0xa2,0xfb,0x8b,0x01,0x82,0x94,0xca,0x3a,0x92,0x2e,0x5c,0x75,0x8d,0x69,0x8f,0x57,\r\n0x27,0x69,0xba,0x6a,0x61,0x90,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0xa1,0x26,0x3e,0x2d,0x50,0x62,0x68,0x4a,0x58,0x93,0x55,0x7f,0xe8,0x93,0x01,0x2b,0x01,0x35,0x77,0x01,0x06,0x9d,0x36,0x7b,0xa7,0x89,0x77,0x5a,0x91,0x7b,0x71,0x51,0x5c,0xa0,0x62,0x6b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0xa3,0xff,0xf2,\r\n0x05,0xc4,0x06,0xac,0x00,0x45,0x00,0x50,0x00,0x5c,0x00,0x00,0x01,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x02,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x37,0x26,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x33,0x32,0x12,0x35,0x34,\r\n0x2e,0x03,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x04,0x17,0x01,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0xe3,0xec,0x71,0x4f,0x26,0x1d,0x2a,0x44,0x67,0xe9,0xc2,0x6f,0x35,0x64,0xb5,0x71,0x62,0xcb,0x6a,0x47,0x9f,0x69,0x49,0x68,0x69,0x48,0x36,0x57,\r\n0x16,0x27,0x1c,0x54,0x7a,0x7f,0x62,0x76,0x86,0x56,0x5d,0xa3,0x39,0x6d,0x81,0x1f,0x3c,0x59,0x73,0xb3,0x78,0x6a,0x3e,0x8b,0x66,0x56,0x01,0x2a,0x96,0xfd,0x51,0x27,0x2e,0x24,0x17,0x20,0x39,0xf9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0x66,0x71,0x2d,0x12,0x2d,0x1e,0x1d,0x2e,0x28,0x59,0x74,0x93,0xcf,0x8f,0xc0,0xfe,0xc6,0xae,\r\n0x81,0x6f,0x78,0x78,0x69,0x49,0x4b,0x69,0x3b,0x30,0x32,0x4c,0x74,0x01,0x4f,0x72,0x72,0x97,0xd8,0xd4,0x9c,0xe5,0x73,0x81,0x01,0x1d,0xfc,0x65,0x92,0x6c,0x4c,0x3c,0x40,0x2b,0x43,0x57,0x3a,0x5f,0x82,0x68,0x53,0xfc,0x2e,0x69,0x77,0x81,0x93,0x39,0x3e,0x4c,0xe4,0xfd,0xf9,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,\r\n0x00,0xdd,0xff,0xf2,0x05,0x8a,0x06,0x3d,0x00,0x3d,0x00,0x47,0x00,0x53,0x00,0x00,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x24,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x05,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,\r\n0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0xa7,0x32,0x64,0x16,0x2b,0x3a,0x19,0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x5c,0xbc,0xa9,0x01,0x42,0x85,0x4b,0x1e,\r\n0xa8,0xb4,0xcc,0xfe,0xf4,0x87,0x98,0x44,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0xf8,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x5e,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x02,0x0e,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa5,0xe0,0x8c,0x2c,0x54,0x2f,0x34,0x41,0x2f,\r\n0xa3,0xb0,0x86,0xa0,0x34,0x45,0x23,0x6d,0xa7,0xa2,0xb9,0xd4,0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0xfe,0xb6,0x50,0x2c,0x1f,0x20,0x27,0x01,0x7b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x04,0x00,0xdd,0xff,0xf2,0x05,0x8a,0x06,0x3d,0x00,0x47,0x00,0x51,0x00,0x5c,0x00,0x68,0x00,0x00,0x01,0x14,0x06,0x23,\r\n0x06,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x17,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x25,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x36,\r\n0x36,0x35,0x35,0x33,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x03,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x77,0xd0,0xa8,0x23,0x72,0x80,0xc7,0x9c,0x4c,0x4a,0x41,0xc6,0x32,0x7a,0xcb,0x70,0x48,0x6b,0x6c,0x47,0x32,0x64,0x16,0x2b,0x3a,0x19,\r\n0x74,0x65,0x73,0x8f,0x86,0x6d,0x50,0x7a,0x5a,0xe5,0x6f,0x80,0x85,0x3d,0x68,0xe7,0x01,0x20,0x0f,0x4c,0x66,0x4d,0x4a,0x67,0x0b,0x2b,0x3f,0xa5,0xfe,0x7f,0x5d,0x42,0x26,0x3e,0x42,0x2f,0x3d,0x7d,0x35,0x2a,0x17,0x1c,0x25,0x31,0xf7,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x05,0xd5,0x99,0xbe,0x23,0x3c,0x31,0x4a,0xd9,0xb6,0xb9,0xd4,\r\n0x75,0x5e,0x74,0x71,0xc4,0x70,0x6b,0x49,0x49,0x69,0x4c,0x3a,0x16,0x70,0x42,0x4f,0x34,0x3c,0x70,0x56,0x5d,0x70,0x34,0x55,0x89,0x73,0xfa,0xd7,0xa6,0xc8,0x9e,0x6b,0x08,0x35,0x5c,0x49,0x6b,0x71,0x47,0x18,0x1d,0x1c,0x6b,0x4b,0x5e,0xfa,0x87,0x50,0x2c,0x1f,0x20,0x27,0x03,0xf6,0x21,0x29,0x1c,0x29,0x27,0x1e,0x18,0x30,0xfd,0x83,\r\n0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x03,0x00,0x44,0xff,0xf2,0x06,0x24,0x06,0xac,0x00,0x4d,0x00,0x58,0x00,0x64,0x00,0x00,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,\r\n0x33,0x32,0x05,0x07,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0xfe,\r\n0x36,0x57,0x15,0x2e,0x40,0x54,0x94,0x54,0x5b,0x40,0x63,0x79,0x5a,0x5b,0x6f,0x5d,0x39,0x62,0x50,0x93,0x59,0x35,0x74,0xd1,0xa0,0x70,0x6f,0x92,0x5d,0xa7,0x01,0x70,0x46,0x8f,0xa7,0x5a,0x3f,0x1d,0x28,0x48,0x5f,0xfb,0xed,0x69,0x84,0xe1,0x82,0x9d,0x6d,0x71,0x98,0x87,0xe1,0x7e,0x76,0xcc,0x78,0x48,0x6b,0x6c,0xf0,0x14,0x25,0x21,\r\n0x1a,0x1a,0x25,0xf4,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x03,0x50,0x3b,0x30,0x43,0xe3,0x6e,0x71,0xc0,0x6e,0x37,0x6f,0x87,0x62,0x7f,0x7f,0x62,0x87,0x6d,0x39,0x88,0xe6,0x80,0xa4,0xa7,0x7b,0x70,0x38,0x27,0x7e,0x4e,0x58,0x7d,0xbb,0x8b,0x43,0x4f,0x1e,0x2e,0x1d,0x20,0x2f,0x24,0x5d,0xb8,0xfe,0xfe,0xcb,0xaf,0xfe,0xd5,0xaa,0x6a,\r\n0x6a,0x94,0x01,0x04,0x9f,0xa1,0x01,0x3a,0xb2,0x6b,0x49,0x49,0x69,0xfd,0xd9,0x14,0x57,0x17,0x2f,0x35,0x32,0x2a,0x4b,0x02,0x5b,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x03,0x00,0x9a,0xfd,0xeb,0x05,0xce,0x04,0xa5,0x00,0x2d,0x00,0x37,0x00,0x43,0x00,0x00,0x01,0x24,0x33,0x32,0x12,0x15,0x11,0x23,0x11,0x34,0x26,0x26,\r\n0x23,0x22,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x32,0x01,0x16,0xc4,0xd3,0xef,0xa8,0x4d,\r\n0x82,0x4b,0x4c,0xee,0x5f,0x39,0x39,0x57,0x74,0x44,0x49,0x68,0x69,0x48,0x3b,0x32,0x17,0x1a,0x22,0x48,0x41,0x57,0x66,0x70,0x4a,0x48,0x5f,0x44,0x29,0x3d,0x1b,0x24,0x26,0x19,0x2c,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x0f,0x96,0xfe,0xeb,0xf3,0xfb,0x4e,0x04,0xb2,0x66,0xab,0x61,0x4b,0x36,0xa7,0xba,0x55,0xea,0xa3,0x59,\r\n0x69,0x49,0x4b,0x69,0x27,0x34,0x8f,0x37,0xac,0x73,0x22,0x69,0x52,0x4c,0x70,0x3c,0x92,0x5a,0x2a,0x1b,0x1b,0x30,0xfc,0xca,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x04,0x00,0xb9,0xfe,0xa4,0x05,0xae,0x04,0xa5,0x00,0x4a,0x00,0x5d,0x00,0x67,0x00,0x73,0x00,0x00,0x01,0x36,0x36,0x33,0x32,0x16,0x11,0x10,0x02,0x06,0x07,0x16,\r\n0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x06,0x07,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x25,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x07,0x06,0x07,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x01,0x14,0x16,\r\n0x33,0x32,0x36,0x37,0x36,0x24,0x33,0x32,0x17,0x36,0x36,0x35,0x35,0x01,0x06,0x06,0x05,0x34,0x27,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x43,0x1d,0xd2,0x3c,0xa8,0x98,0x19,0x38,0x34,0x5e,0x6b,0x48,0x49,0x6a,0x15,0x5b,0x45,0xbc,0x86,0x8c,0x3e,0x63,0x6e,0xae,0xbf,\r\n0x02,0x0d,0x7d,0x54,0x1c,0x3c,0x40,0x56,0xa3,0x22,0x0f,0x14,0x39,0x4a,0x5a,0x36,0x58,0x60,0x39,0x2c,0x0d,0x62,0x3f,0x48,0x6b,0x6c,0x47,0x74,0xcf,0x7a,0x5c,0xa6,0x66,0x44,0x9c,0xfe,0x62,0x21,0x16,0x1c,0x60,0x60,0x82,0x01,0x21,0x42,0x21,0x2c,0x26,0x31,0xfd,0x99,0xae,0x87,0x03,0xb6,0x47,0x3c,0x26,0x1c,0x1c,0x25,0xfd,0x5f,\r\n0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x3f,0x1b,0x49,0xee,0xff,0x00,0xfe,0xff,0xfe,0xf8,0x88,0x1b,0x35,0x7e,0x46,0x6c,0x6c,0x51,0x20,0x26,0x16,0x1e,0x57,0x41,0x2f,0x6a,0x67,0x56,0x95,0x53,0xe5,0x36,0x7a,0x72,0x7d,0x8f,0x3f,0x5a,0x13,0x05,0x03,0x24,0x2a,0x21,0x78,0x7b,0x3a,0x70,0x1b,0x44,0x50,0x6b,0x49,0x49,0x69,0x70,\r\n0xc2,0x71,0x71,0xaf,0x5f,0x38,0xfb,0x11,0x1d,0x1f,0x25,0x2e,0x3e,0x68,0x06,0x19,0x7f,0x49,0x42,0xfe,0xf0,0x4d,0x5b,0x46,0x35,0x20,0x24,0x31,0x19,0x29,0x26,0x02,0xb8,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x00,0x15,0xff,0xf2,0x06,0x52,0x04,0xa1,0x00,0x33,0x00,0x3f,0x00,0x00,0x01,0x12,0x11,0x14,0x06,0x06,\r\n0x23,0x22,0x26,0x26,0x35,0x37,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x10,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x10,0x03,0x01,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0xb0,0xa2,0x70,0xcd,0x84,\r\n0x78,0xca,0x6a,0x03,0x0c,0xfe,0xe9,0x88,0x97,0x5e,0x17,0x50,0x30,0x48,0x6b,0x6c,0x47,0x6e,0xba,0x76,0xf3,0xcf,0xcf,0xf6,0x06,0x07,0x91,0x83,0x78,0x8d,0x9c,0xfc,0xa9,0x1a,0x27,0x27,0x1a,0x1a,0x26,0x26,0x04,0x9f,0xfe,0x8d,0xfe,0xdf,0x9f,0xf6,0x84,0x5f,0xb4,0x7a,0x56,0xcd,0x22,0x01,0x47,0xc6,0xb2,0xfe,0xf2,0x83,0x27,0x2f,\r\n0x6b,0x49,0x49,0x69,0xb0,0x01,0x49,0xa5,0xf4,0x01,0x1d,0xfd,0xdc,0x30,0x6b,0x6c,0x33,0x7a,0x8c,0xbb,0xc8,0x01,0x1a,0x01,0x42,0xfb,0xfe,0x27,0x1a,0x1b,0x27,0x26,0x1c,0x1b,0x26,0x00,0x00,0x02,0x01,0x09,0x01,0xb4,0x04,0x6f,0x05,0x9a,0x00,0x0c,0x00,0x1c,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,\r\n0x26,0x27,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x02,0xbd,0x79,0x93,0x8d,0x7f,0x80,0x8a,0x42,0x78,0x50,0x74,0xcb,0x73,0x6d,0xc8,0x7d,0x75,0xcb,0x74,0x6f,0xca,0x05,0x09,0xc9,0x9a,0xa5,0xbc,0xbb,0xa6,0x62,0xa6,0x5b,0x91,0x86,0xe6,0x89,0x92,0xe3,0x7c,0x80,0xe4,0x8d,0x8c,0xe6,0x83,0x00,\r\n0x00,0x01,0x01,0x22,0xff,0x83,0x04,0x56,0x05,0x9a,0x00,0x1d,0x00,0x00,0x05,0x36,0x00,0x35,0x34,0x02,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x24,0x33,0x32,0x16,0x12,0x15,0x14,0x02,0x00,0x07,0x01,0xa7,0xfa,0x01,0x0b,0x5d,0x3d,0x35,0xb1,0x60,0x42,0x39,0x9b,0x39,0x51,0xa5,0x01,0x14,0x6f,0x4b,\r\n0x78,0x49,0x85,0xfe,0xf0,0xb0,0x19,0xe7,0x01,0xb7,0xba,0x97,0x01,0x33,0x35,0x39,0x18,0x4b,0xb0,0x43,0x4d,0x51,0xe6,0x5f,0x3a,0x78,0x5a,0x88,0xfe,0xed,0x90,0x9b,0xfe,0xae,0xfe,0x9b,0x9a,0x00,0x00,0x01,0x00,0xf8,0xff,0x83,0x04,0x80,0x05,0x9a,0x00,0x23,0x00,0x00,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x36,0x33,0x32,\r\n0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x16,0x12,0x13,0x03,0xe7,0x21,0x4d,0x63,0x85,0x57,0x74,0x5b,0x1b,0x6d,0xb8,0x41,0x41,0x5d,0x79,0x77,0x6a,0x53,0xf2,0x6d,0x42,0xa3,0xe7,0x6b,0xba,0xd0,0x38,0x61,0x64,0x62,0x88,0x1c,0x7d,0xf0,0x01,0x05,0xa0,0x59,0x36,\r\n0x8c,0x3b,0x18,0x54,0xc7,0x48,0x59,0x63,0x90,0x73,0x85,0x90,0x7f,0x98,0x8b,0x5d,0x9f,0x89,0x5d,0x5f,0xfe,0x91,0xfe,0xff,0x00,0x01,0x01,0x0e,0xff,0x83,0x04,0x69,0x05,0x9a,0x00,0x31,0x00,0x00,0x01,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x15,0x14,\r\n0x06,0x06,0x07,0x16,0x17,0x07,0x02,0x21,0x22,0x07,0x27,0x36,0x33,0x32,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x01,0xa0,0x8c,0x8f,0x33,0x2e,0x59,0x4a,0x5c,0x69,0x4e,0xec,0x60,0x3c,0x8b,0xee,0x71,0x9c,0xbf,0xb1,0x8e,0x2d,0x63,0x53,0x88,0x5b,0x8d,0xa8,0xfe,0xa1,0x37,0x36,0x37,0x5f,0x69,0x85,0x6c,0x59,0x7c,0x78,\r\n0x73,0x43,0x81,0x23,0x03,0x68,0x36,0x08,0x41,0x67,0x32,0x4b,0x4e,0x7f,0x5b,0x7b,0x77,0x79,0x99,0x84,0x8b,0x92,0x52,0x93,0x59,0x78,0x75,0x37,0x69,0xc4,0x4e,0x01,0x68,0x14,0x81,0x23,0x28,0x2c,0x97,0x46,0x53,0x5e,0x18,0x11,0x00,0x01,0x00,0xb7,0xff,0x83,0x04,0xc0,0x05,0x9a,0x00,0x22,0x00,0x00,0x01,0x20,0x11,0x34,0x37,0x22,\r\n0x0e,0x02,0x15,0x14,0x12,0x12,0x04,0x17,0x07,0x26,0x00,0x00,0x02,0x35,0x34,0x36,0x24,0x33,0x32,0x17,0x06,0x15,0x14,0x16,0x33,0x37,0x07,0x06,0x04,0x68,0xfe,0x53,0x0e,0x2e,0xa9,0x76,0x1b,0x86,0xfb,0x01,0x1c,0x77,0x30,0x97,0xfe,0xb0,0xfe,0xe9,0x90,0x57,0x01,0x32,0x83,0x8e,0x27,0x13,0x8a,0x91,0x40,0x10,0x2a,0x02,0xa8,0x01,\r\n0xc3,0x57,0x50,0x1c,0x23,0x2a,0x45,0x92,0xfe,0xa9,0xfe,0xad,0xf2,0x2b,0x88,0x32,0x01,0x13,0x01,0x80,0x01,0x7e,0xac,0x6f,0x61,0x58,0x29,0x9f,0x3f,0xb0,0x9e,0x05,0x9d,0x05,0x00,0x01,0x00,0x78,0xff,0x83,0x04,0xff,0x05,0xae,0x00,0x16,0x00,0x00,0x01,0x12,0x12,0x17,0x07,0x26,0x02,0x03,0x06,0x23,0x22,0x26,0x02,0x03,0x37,0x17,\r\n0x12,0x16,0x33,0x32,0x37,0x02,0x03,0x03,0x36,0x19,0xee,0xc2,0x4c,0x98,0xe5,0x46,0xa6,0x81,0x73,0x93,0x48,0x03,0xa5,0x08,0x09,0x69,0x6d,0x3c,0x91,0x3c,0x0b,0x05,0xae,0xfd,0xd5,0xfd,0x09,0x8f,0x7a,0x62,0x01,0x9b,0x01,0x24,0x56,0x9e,0x01,0x57,0x01,0x57,0x14,0x9d,0xfe,0xbf,0xf1,0x4e,0x01,0x2c,0x01,0x41,0x00,0x01,0x00,0x6c,\r\n0xff,0xf6,0x05,0x0b,0x05,0x9a,0x00,0x2c,0x00,0x00,0x01,0x12,0x12,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x02,0x03,0x01,0x10,0x0d,0x94,0xef,0x9d,0x39,0x8f,0x5c,0x61,0x61,0x70,\r\n0x7f,0x73,0x40,0xdb,0xaf,0x53,0xa0,0x5b,0x4e,0x9a,0x65,0x67,0x7a,0x5f,0x63,0x99,0x7d,0x57,0x35,0x8c,0xee,0x74,0xbe,0xfe,0xe1,0xb5,0x1f,0x04,0x66,0xfe,0xd1,0xfe,0x33,0xe3,0x5a,0x91,0x52,0x42,0x6d,0x31,0x38,0x3f,0x62,0x7a,0x4e,0x95,0xc0,0x45,0x42,0x73,0x69,0x6c,0x5a,0x3c,0x6a,0x34,0x51,0x4b,0x54,0x68,0x41,0x70,0xdb,0x8f,\r\n0xf0,0x01,0xf1,0x01,0x75,0x00,0x00,0x01,0x00,0x3b,0xff,0xf6,0x05,0x3c,0x05,0xae,0x00,0x26,0x00,0x00,0x01,0x0a,0x02,0x23,0x22,0x26,0x27,0x36,0x37,0x36,0x12,0x35,0x34,0x26,0x23,0x22,0x02,0x03,0x27,0x12,0x12,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x02,0x02,0x07,0x16,0x33,0x32,0x36,0x12,0x12,0x13,0x05,0x3c,0x07,0x72,0xf7,0xd9,\r\n0x71,0x98,0x45,0x0a,0x19,0x89,0x6d,0x67,0x6b,0x79,0x90,0x1b,0x8d,0x1c,0x68,0xb7,0x93,0x6f,0x9c,0x54,0x3e,0x73,0x3a,0x34,0x2c,0x83,0xa4,0x61,0x31,0x0a,0x05,0xae,0xfd,0xac,0xfd,0xa6,0xfe,0xf6,0x29,0x2a,0x18,0x2c,0xef,0x01,0x4f,0x8a,0x92,0x81,0xfe,0xe8,0xfe,0xbd,0x2f,0x01,0x1b,0x01,0x19,0x89,0x65,0xb1,0x68,0x69,0xfe,0xf8,\r\n0xfe,0xe9,0x5c,0x10,0x77,0x01,0x01,0x01,0xc4,0x01,0xd7,0x00,0x00,0x01,0x00,0xcb,0xff,0x83,0x04,0xad,0x05,0xae,0x00,0x15,0x00,0x00,0x05,0x26,0x02,0x26,0x26,0x23,0x22,0x07,0x27,0x3e,0x02,0x37,0x17,0x04,0x07,0x36,0x33,0x32,0x04,0x12,0x17,0x04,0x14,0x12,0x80,0xa2,0xb4,0x5b,0x83,0x60,0x23,0x2b,0x9f,0xda,0x63,0x6a,0xfe,0xeb,\r\n0x87,0x38,0x3e,0x89,0x01,0x1b,0xda,0x19,0x7d,0x81,0x01,0x4c,0xf6,0x85,0x39,0x7e,0x67,0xef,0xf2,0x56,0x64,0xff,0xf6,0x07,0xfe,0xfe,0x43,0xdb,0x00,0x01,0x00,0xe3,0xff,0x83,0x04,0x95,0x05,0x9a,0x00,0x25,0x00,0x00,0x05,0x26,0x35,0x10,0x12,0x00,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x2e,0x02,0x35,\r\n0x34,0x36,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x02,0x15,0x14,0x17,0x01,0x0e,0x2b,0xce,0x01,0x45,0xbc,0x66,0x6c,0x73,0x4b,0x28,0x85,0x72,0x21,0x7a,0xaa,0x5c,0x36,0x3d,0x3a,0x39,0x1e,0x2b,0x88,0xeb,0x91,0x2e,0x7d,0x95,0xc0,0x01,0x31,0x02,0x4d,0x01,0x44,0x4d,0x45,0x88,0x6b,0x46,0x33,0x1a,0x41,0x54,0x0f,0x91,0x12,\r\n0x54,0x74,0x3d,0x28,0x56,0x3b,0x38,0x5c,0x2d,0x19,0x12,0xfe,0xda,0xfd,0xf6,0xfc,0xc5,0x78,0x00,0x02,0x00,0x47,0xff,0xf1,0x03,0xc8,0x03,0x6e,0x00,0x0f,0x00,0x1b,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0xc8,\r\n0x78,0xd2,0x78,0x78,0xd0,0x77,0x79,0xd0,0x76,0x79,0xd0,0x79,0x97,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x01,0xaf,0x76,0xce,0x7a,0x79,0xd0,0x75,0x7a,0xd1,0x74,0x75,0xd0,0x7a,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x01,0x00,0x5a,0xff,0xf1,0x03,0xb5,0x03,0x6e,0x00,0x1b,0x00,0x00,0x13,0x36,0x36,0x33,0x32,0x16,0x16,0x15,\r\n0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x5b,0x3d,0xe0,0x84,0x79,0xcb,0x75,0x7c,0xd1,0x76,0x85,0xda,0x39,0x89,0x26,0x88,0x59,0x84,0xb0,0xac,0x7e,0x5c,0x93,0x24,0x02,0x68,0x7a,0x8c,0x7a,0xd0,0x75,0x73,0xd1,0x7a,0x91,0x7b,0x37,0x54,0x60,0xab,0x7c,0x7f,0xb9,0x65,\r\n0x58,0x00,0x00,0x01,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x64,0x00,0x12,0x00,0x00,0x05,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x03,0xcc,0x70,0xc5,0x85,0x92,0xcf,0x6d,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x97,0x0d,0x91,0xef,0x75,0x6f,0xc7,0x82,0x52,0x8a,0x4d,0xc8,0xb1,0x03,0x5e,\r\n0x00,0x01,0x00,0x5a,0xfd,0xfe,0x03,0xb5,0x03,0x6e,0x00,0x1f,0x00,0x00,0x01,0x01,0x26,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x27,0x01,0x02,0xea,0xfd,0xcb,0x2d,0x2e,0x89,0x26,0x88,0x59,0x83,0xb1,0xab,0x7f,0x5c,0x93,0x24,0x86,\r\n0x3d,0xe0,0x84,0x79,0xcc,0x74,0x7c,0xd1,0x76,0x05,0x05,0x01,0xc2,0xfd,0xfe,0x02,0x7d,0x32,0x54,0x38,0x54,0x60,0xa8,0x7e,0x80,0xb4,0x65,0x58,0x46,0x7a,0x8c,0x78,0xcd,0x75,0x73,0xd1,0x7a,0x01,0xfe,0x07,0x00,0x01,0x00,0x5a,0xfd,0xfe,0x03,0xb5,0x03,0x6e,0x00,0x1f,0x00,0x00,0x13,0x01,0x07,0x23,0x22,0x26,0x26,0x35,0x34,0x36,\r\n0x36,0x33,0x32,0x16,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x07,0x01,0x79,0x01,0xb5,0x0b,0x06,0x75,0xd2,0x7c,0x74,0xcb,0x7a,0x84,0xdd,0x40,0x86,0x25,0x93,0x5b,0x7f,0xab,0xb2,0x82,0x59,0x88,0x26,0x89,0x2a,0x32,0xfd,0xe0,0xfd,0xfe,0x01,0xf9,0x01,0x7a,0xd0,0x74,0x74,0xcd,0x79,0x8b,\r\n0x7b,0x46,0x58,0x65,0xb3,0x81,0x7e,0xa8,0x60,0x54,0x38,0x50,0x36,0xfd,0x83,0x00,0x00,0x02,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x6e,0x00,0x27,0x00,0x33,0x00,0x00,0x01,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x33,0x14,0x16,\r\n0x16,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x11,0x7a,0x52,0x55,0x73,0x82,0x61,0x5f,0x83,0x75,0xd3,0x81,0x86,0xc5,0x70,0x70,0xc6,0x85,0x91,0xcf,0x6d,0x98,0x4d,0x8d,0x5b,0x89,0x9b,0x99,0xfe,0x2b,0x3c,0x28,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x02,0xdf,0x4e,0x0a,0x81,\r\n0x56,0x5b,0x87,0x84,0x5d,0x7b,0xce,0x76,0x76,0xee,0x91,0xfe,0x7a,0x90,0xef,0x76,0x6e,0xc8,0x82,0x56,0x86,0x4d,0xc8,0xb1,0x01,0x6a,0xb0,0xbf,0xfe,0xd2,0x28,0x3b,0x3c,0x27,0x29,0x3b,0x3b,0x00,0x00,0x02,0x00,0x44,0xff,0xf1,0x03,0xcc,0x05,0xe9,0x00,0x2f,0x00,0x3b,0x00,0x00,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x16,\r\n0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x12,0x15,0x23,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x11,0x10,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x07,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xd3,0x86,0x5c,0x5e,0x85,0x38,0x2a,0x35,0xfb,0xc6,0x8a,0xc6,0x6a,\r\n0x73,0xc5,0x82,0xd9,0xf5,0x98,0x4d,0x8d,0x5c,0x88,0x9b,0x01,0x23,0x94,0x96,0x3a,0x25,0x0a,0x0b,0x5e,0x83,0x7f,0x3c,0x27,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x02,0x7c,0x60,0x84,0x85,0x5e,0x52,0x43,0x1d,0x49,0x37,0x9f,0xbb,0x6a,0xd7,0x8c,0x02,0x54,0x8a,0xdf,0x6e,0xfe,0xf0,0xdb,0x60,0xa0,0x5c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x61,\r\n0x5b,0x23,0x2d,0x10,0x01,0x83,0x60,0x28,0x3b,0x3b,0x28,0x29,0x3b,0x3c,0x00,0x01,0x00,0x30,0xfe,0x05,0x03,0xe0,0x03,0x6e,0x00,0x32,0x00,0x00,0x05,0x0e,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x07,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,\r\n0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x03,0xe0,0x07,0x40,0x6d,0x4b,0x50,0x68,0x3a,0x1d,0x35,0x45,0x44,0x34,0x1c,0xaf,0x7c,0x7c,0xab,0x2d,0x7b,0x4a,0x79,0xd0,0x76,0x7a,0xd1,0x77,0x1e,0x32,0x50,0x58,0x35,0x2c,0x28,0x13,0x1d,0x1d,0x15,0x15,0xf9,0x48,0x74,0x46,0x32,0x5d,0x3b,0x3d,0x62,0x6e,0x6b,0x69,\r\n0x6c,0x69,0x34,0x7f,0xa7,0xae,0x82,0x58,0x4a,0x52,0x72,0x82,0x7a,0xd1,0x74,0x72,0xca,0x79,0x34,0x75,0x68,0x7e,0x88,0x88,0x37,0x2a,0x2c,0x09,0x19,0x23,0x48,0x00,0x00,0x02,0x00,0x47,0xff,0xf0,0x03,0xc8,0x03,0x6e,0x00,0x1d,0x00,0x24,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,\r\n0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x25,0x34,0x26,0x27,0x16,0x17,0x36,0x02,0x6c,0x53,0x72,0xaf,0x7c,0x64,0xa0,0x1a,0x7c,0x9d,0x6e,0x51,0x77,0x84,0x79,0xd1,0x75,0x79,0xd0,0x79,0x9d,0x76,0xfe,0xc5,0x57,0x42,0x0a,0x74,0x1b,0x6f,0x1d,0xb5,0x6e,0x80,0xb0,0x76,0x5e,0x09,0x9b,0x6f,0x4d,0x9d,\r\n0x1d,0x45,0xf8,0x92,0x72,0xc6,0x76,0x75,0xd0,0x7a,0x92,0xfe,0x2f,0xfd,0x45,0x66,0x04,0x91,0x7a,0x2e,0x00,0x02,0x00,0x44,0xfd,0xfe,0x03,0xcc,0x03,0x6e,0x00,0x30,0x00,0x3c,0x00,0x00,0x25,0x34,0x36,0x33,0x33,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x20,0x11,0x11,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x33,0x14,0x06,0x06,0x23,0x22,\r\n0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x37,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x01,0xd3,0x83,0x5e,0x0b,0x0a,0x25,0x3a,0x97,0x93,0xfe,0xdd,0x98,0x8b,0x5b,0x93,0x48,0x98,0x6e,0xcf,0x91,0x83,0xc4,0x73,0x6a,0xc7,0x89,0xc6,0xfb,0x35,0x2a,\r\n0x38,0x82,0x61,0x5c,0x86,0x7f,0x3b,0x28,0x29,0x3b,0x3c,0x28,0x28,0x3b,0xe3,0x5e,0x83,0x01,0x10,0x2d,0x23,0x5c,0x60,0xfe,0xaf,0xfe,0x6e,0xb1,0xbe,0x4c,0x83,0x5a,0x82,0xc7,0x6f,0x6e,0xe0,0x89,0x01,0xcc,0x8c,0xd8,0x69,0xbc,0x9e,0x37,0x49,0x1d,0x43,0x52,0x5c,0x87,0x84,0x5e,0x29,0x3b,0x3b,0x29,0x28,0x3b,0x3c,0x00,0x00,0x02,\r\n0x00,0x80,0xff,0xf1,0x04,0x08,0x05,0xe9,0x00,0x0f,0x00,0x1a,0x00,0x00,0x01,0x14,0x02,0x23,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x15,0x07,0x10,0x21,0x22,0x06,0x15,0x11,0x10,0x21,0x20,0x11,0x04,0x08,0xf6,0xd8,0x8a,0xc6,0x6a,0x74,0xc7,0x83,0xdb,0xef,0x97,0xfe,0xc9,0x88,0x9b,0x01,0x23,0x01,0x37,0x01,0xc8,\r\n0xd6,0xfe,0xff,0x6a,0xd7,0x8c,0x02,0x54,0x85,0xe3,0x6f,0xf2,0xdc,0x0d,0x01,0x4c,0xbd,0xb2,0xfd,0xe6,0xfe,0xaf,0x01,0x6f,0x00,0x01,0x00,0xa3,0xff,0xe7,0x03,0xe5,0x05,0xe8,0x00,0x09,0x00,0x00,0x13,0x25,0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x05,0xa3,0x01,0xd1,0x1c,0x01,0x2b,0x2a,0xfe,0x30,0x1c,0xfe,0xd4,0x05,0x16,0xd2,0xfa,\r\n0xcb,0x86,0x80,0xd2,0x05,0x35,0x83,0x00,0x00,0x01,0x00,0x9b,0x00,0x00,0x03,0xed,0x05,0xe9,0x00,0x22,0x00,0x00,0x13,0x11,0x33,0x15,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x15,0x9b,0x97,0x73,0x87,0xca,0xf7,0x51,0x92,0xaa,\r\n0x80,0x66,0x37,0x94,0x43,0x77,0x9d,0x91,0x7d,0x42,0xaa,0x80,0x4e,0x83,0x29,0x04,0x12,0x01,0xd1,0x45,0x4b,0xed,0xbd,0x57,0x9f,0x9d,0x85,0x65,0x66,0x5d,0x2e,0xd1,0xe0,0x42,0x7b,0x7d,0x7b,0x71,0x81,0x7a,0x3e,0x7b,0xa0,0x4e,0x3c,0xbe,0x00,0x01,0x00,0x5d,0x00,0x00,0x04,0x2b,0x05,0xe3,0x00,0x12,0x00,0x00,0x33,0x01,0x33,0x03,\r\n0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x07,0x03,0x5d,0x01,0xeb,0xa7,0xd1,0x28,0x2c,0x7d,0xcb,0x71,0x97,0xac,0x7e,0x44,0x3f,0xe9,0x05,0xe3,0xfd,0x83,0x08,0x6a,0xbd,0x70,0xfe,0x29,0x01,0xa7,0x7f,0xb9,0x1e,0xfd,0x3f,0x00,0x01,0x00,0x31,0xff,0xe7,0x04,0x56,0x05,0xe3,0x00,0x09,0x00,0x00,0x33,0x01,\r\n0x33,0x11,0x25,0x17,0x05,0x23,0x11,0x01,0x31,0x02,0x1d,0xb3,0x01,0x2c,0x29,0xfe,0x30,0x1c,0xfe,0x68,0x05,0xe3,0xfa,0xcf,0x87,0x80,0xd2,0x04,0x7a,0xfb,0x9f,0x00,0x00,0x02,0x00,0x57,0xff,0xf1,0x04,0x30,0x05,0xe3,0x00,0x11,0x00,0x1d,0x00,0x00,0x01,0x33,0x15,0x23,0x11,0x14,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,\r\n0x11,0x33,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x03,0xb6,0x7a,0x7a,0x67,0xbb,0x7a,0xd0,0xf3,0xf1,0xc9,0x01,0x0e,0x97,0xfe,0x62,0x8d,0x9d,0xa6,0x8e,0x40,0x78,0x45,0x03,0x6e,0x8f,0xfe,0xa0,0x7c,0xb3,0x5f,0xee,0xd0,0xcb,0xf4,0x02,0x75,0xfc,0xfc,0xa4,0x94,0x8a,0x9d,0x3a,0x64,0x3f,0x01,0x82,0x00,0x02,\r\n0x00,0x57,0x00,0x00,0x04,0x30,0x05,0xe9,0x00,0x11,0x00,0x1d,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x33,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x04,0x30,0x7a,0x97,0xfe,0xf2,0xca,0xf0,0xf3,0xd0,0x79,0xbc,0x67,0x7a,0xfe,0xef,0x46,0x77,0x40,0x8e,\r\n0xa6,0x9d,0x8d,0x01,0x07,0x02,0x6c,0xfd,0x94,0x02,0x6c,0xf4,0xcb,0xcf,0xef,0x5f,0xb3,0x7c,0xfe,0xa1,0x01,0x81,0x3f,0x65,0x39,0x9c,0x8a,0x96,0xa2,0x00,0x00,0x01,0x00,0xd7,0x00,0x00,0x03,0xb1,0x05,0xe3,0x00,0x07,0x00,0x00,0x13,0x21,0x01,0x21,0x15,0x21,0x01,0x21,0xd7,0x02,0xa8,0xfe,0x4f,0x01,0xe3,0xfd,0x50,0x01,0xaa,0xfe,\r\n0x2c,0x05,0xe3,0xfa,0xac,0x8f,0x05,0x54,0x00,0x02,0x00,0x83,0xff,0xf1,0x04,0x04,0x05,0xfe,0x00,0x28,0x00,0x34,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,\r\n0x37,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x03,0x5e,0x4c,0x5a,0x6e,0x60,0x5f,0x6f,0x78,0xd2,0x78,0x78,0xd0,0x77,0x6a,0x63,0x5e,0x6f,0x5d,0x4d,0x63,0x36,0x3f,0xad,0x7a,0x7e,0xad,0x40,0x39,0x66,0x13,0xaf,0x7c,0x7c,0xab,0xad,0x7a,0x7e,0xad,0x05,0xfb,0x3c,0xb3,0x6d,0x6f,0xca,0x3e,0x3d,0xc7,0x75,0x76,\r\n0xce,0x7a,0x79,0xd0,0x75,0x72,0xc7,0x40,0x3d,0xc8,0x72,0x6e,0xb4,0x3d,0x6a,0x2a,0x7e,0x4d,0x81,0xae,0xb4,0x7b,0x4b,0x80,0x2b,0x66,0xfb,0xb4,0x80,0xb0,0xae,0x82,0x81,0xae,0xb4,0x00,0x00,0x02,0x00,0x83,0xff,0xdc,0x04,0x04,0x05,0xe9,0x00,0x27,0x00,0x33,0x00,0x00,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,\r\n0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0xf4,0x39,0x40,0xae,0x7d,0x7a,0xad,0x3f,0x36,0x63,0x4d,0x5d,0x6f,0x5e,0x61,0x6c,0x78,0xd0,0x77,0x78,0xd2,0x78,0x6f,\r\n0x5f,0x61,0x6d,0x5b,0x4d,0x11,0xae,0x7d,0x7a,0xad,0xa9,0x7e,0x7e,0xad,0x46,0x2a,0x80,0x4b,0x7c,0xb3,0xae,0x81,0x4d,0x7e,0x29,0x6b,0x3d,0xb4,0x6e,0x71,0xc9,0x3d,0x3e,0xca,0x71,0x76,0xd0,0x78,0x7a,0xce,0x76,0x75,0xc6,0x3e,0x3f,0xc9,0x6f,0x6d,0xb3,0x3e,0x04,0x4e,0x7c,0xb3,0xae,0x81,0x81,0xae,0xb1,0x00,0x00,0x02,0x01,0x48,\r\n0xff,0xec,0x04,0xbc,0x05,0xa3,0x00,0x0b,0x00,0x17,0x00,0x00,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x03,0x10,0x02,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x12,0x04,0xbc,0xd6,0xe5,0xe0,0xd9,0xda,0xdf,0xe0,0xdb,0xa0,0x8c,0x8f,0x8a,0x8d,0x88,0x8f,0x92,0x89,0x02,0xc8,0xfe,0x7a,0xfe,0xaa,0x01,0x58,0x01,\r\n0x84,0x01,0x78,0x01,0x63,0xfe,0xa0,0xfe,0x85,0x01,0x3c,0x01,0x13,0xfe,0xe1,0xfe,0xd0,0xfe,0xc9,0xfe,0xe7,0x01,0x11,0x00,0x00,0x01,0x01,0x21,0xff,0xec,0x04,0xe2,0x05,0xa3,0x00,0x2c,0x00,0x00,0x01,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x00,0x11,0x14,0x02,0x04,\r\n0x23,0x22,0x27,0x27,0x16,0x33,0x32,0x36,0x12,0x35,0x10,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0xcd,0x29,0x30,0x4c,0x34,0x3e,0x4c,0x94,0x6f,0x9e,0xbc,0x77,0xd6,0x84,0xeb,0x01,0x05,0xaf,0xfe,0xcf,0xc4,0x48,0x50,0x1b,0x5f,0x68,0x93,0xdc,0x81,0xfe,0xa4,0x88,0x9d,0x68,0x54,0x3a,0x02,0xf2,0x0b,0x42,0x27,0x32,0x4e,0x5a,\r\n0x3f,0x68,0x95,0xd9,0xb3,0x7b,0xd3,0x79,0xfe,0xa1,0xfe,0xb6,0xe2,0xfe,0x95,0xc1,0x0a,0xa5,0x19,0x92,0x01,0x1e,0xb6,0x02,0x2f,0xbd,0x90,0x66,0x88,0x00,0x00,0x02,0x00,0x74,0xff,0xec,0x05,0x8f,0x06,0x3b,0x00,0x4c,0x00,0x55,0x00,0x00,0x13,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,\r\n0x35,0x11,0x34,0x23,0x22,0x06,0x07,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,\r\n0xa4,0x66,0x65,0x57,0x24,0x47,0x3e,0x6c,0x68,0x30,0x5f,0x5a,0x53,0x24,0x20,0x2c,0x62,0x22,0x5a,0x2f,0x23,0x2c,0x5c,0x52,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x92,0x6a,0x2d,0x83,0x41,0x69,0x76,0x85,0x59,0x34,0x56,0x54,0x59,0x37,0x36,0x5e,0x5b,0x5f,0x37,0x78,0x77,0x26,0x35,0x02,0x1d,0x22,0x1c,0x37,0x4d,\r\n0x28,0x06,0x3b,0x13,0x72,0x6e,0xfb,0xa2,0x72,0x11,0x17,0x28,0x19,0x1e,0x19,0x38,0x20,0x03,0xbd,0x8a,0x46,0x38,0x2a,0x33,0x74,0x55,0x56,0xbd,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,0x01,0xfd,0xa8,0x9b,0x82,0x3a,0x48,0x9b,0x8b,0xfc,0x21,0x45,0x6d,0x19,0x1e,0x19,0x19,0x1e,0x19,0x67,0x6d,0x04,0x44,0x5b,0x43,0x0f,0xfc,0xd9,\r\n0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x02,0x00,0x43,0xff,0xec,0x05,0xc1,0x05,0xa3,0x00,0x28,0x00,0x31,0x00,0x00,0x21,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x25,0x14,\r\n0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x21,0x82,0x62,0x69,0x82,0xa0,0x82,0x69,0x63,0x81,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0xd4,0xb0,0x64,0xa2,0x35,0x6c,0xcf,0xaf,0xd5,0xfb,0x22,0x22,0x1c,0x37,0x4d,0x28,0x04,0x1e,0x70,0x89,0x8a,0x6f,0xfb,0xe2,0x04,0x1e,0x6f,0x8a,0x8a,0x6f,0xfd,0xc0,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,\r\n0x4e,0x03,0x89,0xb5,0xd2,0x44,0x42,0x86,0xd1,0xb6,0xfb,0xe4,0xba,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x00,0x01,0x00,0xf0,0xff,0xec,0x05,0x14,0x06,0x27,0x00,0x3d,0x00,0x00,0x01,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x15,0x14,0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x00,0x25,0x36,0x36,0x35,0x35,\r\n0x33,0x15,0x14,0x06,0x06,0x07,0x0e,0x02,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x03,0xef,0x51,0x37,0x08,0x57,0x44,0xb6,0xe7,0xf1,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x01,0x00,0x01,0x1e,0xa9,0x97,0xa0,0x5a,0xac,0xa3,0xa4,0xb7,0x5a,0x6a,\r\n0x64,0x2e,0x77,0x7d,0x2d,0x93,0xa6,0xb8,0x9f,0x96,0xb3,0x58,0x44,0x39,0x50,0x02,0x26,0x39,0x4f,0x3b,0x44,0xdc,0x90,0xdd,0x56,0xa0,0x21,0x11,0x12,0xc2,0x9f,0x01,0x0f,0x01,0x05,0x01,0x2e,0x4e,0x2d,0x61,0x41,0x7b,0x73,0x56,0x81,0x58,0x2b,0x2c,0x82,0xc7,0x8b,0xd6,0x83,0x89,0x0f,0x0f,0x01,0x3d,0xd9,0x93,0xb1,0xc8,0xcb,0xa7,\r\n0x4c,0x5e,0x4f,0x00,0x00,0x02,0x00,0xd6,0xff,0xec,0x05,0x2e,0x06,0x3b,0x00,0x4e,0x00,0x5a,0x00,0x00,0x01,0x06,0x06,0x15,0x15,0x14,0x06,0x06,0x23,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x37,0x24,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x26,0x26,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x17,0x07,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x3e,0x02,0x35,0x35,0x34,0x36,0x37,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x05,0x2e,0x37,0x23,0x7d,0xf5,0x8f,0xae,0xaf,0x6a,0x64,0x2e,0x77,0x7d,0x2d,0xfe,0xc7,0xc5,\r\n0x92,0x96,0xb3,0x58,0x44,0x39,0x50,0x51,0x37,0x08,0x57,0x44,0x53,0x63,0xf9,0xdf,0x1a,0xc0,0x64,0x55,0x77,0x78,0x3c,0x95,0xb3,0x43,0x8b,0x72,0x61,0x7a,0x62,0x5f,0x84,0x1b,0x41,0x62,0x38,0x67,0x64,0xfd,0x3f,0x30,0x23,0x24,0x31,0x31,0x24,0x23,0x30,0x05,0xb1,0x10,0x45,0x58,0x53,0x56,0x80,0x47,0x1d,0xbe,0xaf,0x86,0x83,0x89,\r\n0x0f,0x0f,0x01,0x7c,0xf5,0x8b,0xb8,0xcb,0xa7,0x4c,0x5e,0x4f,0x3a,0x39,0x4f,0x3b,0x44,0x60,0x53,0x7a,0xc7,0x3d,0xa0,0x21,0x11,0x12,0xc2,0x9f,0xbf,0x7f,0xa2,0x7d,0x2a,0x43,0x70,0x5f,0x83,0x86,0x5b,0x34,0x33,0x01,0x2e,0x4b,0x25,0x88,0x6f,0x71,0x13,0xfe,0x57,0x23,0x30,0x30,0x23,0x24,0x31,0x31,0x00,0x01,0x01,0x0f,0xff,0xec,\r\n0x04,0xf5,0x06,0x3b,0x00,0x3a,0x00,0x00,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x12,0x11,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x16,0x17,0x36,0x33,0x32,0x00,0x11,0x15,0x10,0x02,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,\r\n0x35,0x34,0x36,0x02,0xe0,0x16,0x3a,0x54,0x68,0x9c,0x89,0xb3,0xa9,0xac,0xa5,0x6d,0xba,0x2e,0x65,0x11,0x0c,0x04,0x2f,0x2d,0x2f,0x60,0x6c,0x02,0x70,0x74,0xfc,0x01,0x09,0xff,0xf1,0x84,0xd6,0x77,0xbc,0x9e,0x49,0x77,0x43,0x4c,0x3e,0x35,0x4b,0x30,0x02,0x9d,0x16,0x88,0x66,0x90,0xbd,0x01,0x08,0x01,0x13,0x9e,0xef,0xed,0x63,0x4e,\r\n0x72,0x26,0x1b,0x15,0x19,0x2a,0x3e,0x0c,0x8a,0x13,0x72,0x4b,0x38,0xfe,0xc8,0xfe,0xd0,0xba,0xfe,0xbd,0xfe,0xae,0x79,0xd3,0x7b,0xb3,0xd9,0x44,0x76,0x43,0x3f,0x5a,0x4f,0x31,0x27,0x42,0x00,0x02,0x00,0x8f,0xff,0xec,0x05,0x74,0x06,0x3b,0x00,0x37,0x00,0x40,0x00,0x00,0x01,0x16,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x11,\r\n0x34,0x26,0x23,0x22,0x06,0x07,0x27,0x26,0x23,0x22,0x06,0x15,0x11,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x14,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x04,0xa9,0x66,0x65,0x85,0x72,0x72,0x7f,0x28,0x30,0x23,0x63,\r\n0x52,0x2b,0x5a,0x54,0x26,0x2e,0x48,0x74,0x45,0x75,0x5b,0x62,0x6f,0x65,0x6d,0x91,0x6a,0x6c,0x84,0x6a,0x76,0x54,0x27,0x2d,0x29,0x31,0xfc,0xb5,0x22,0x1c,0x37,0x4d,0x28,0x06,0x3b,0x15,0x6e,0x65,0xfb,0x6d,0x64,0x70,0x69,0x5d,0x03,0xdb,0x46,0x44,0x49,0x5f,0x33,0x74,0x55,0x56,0xfd,0x73,0x10,0x5f,0x83,0x3b,0x58,0x6d,0x59,0x4e,\r\n0x03,0xcd,0xa8,0x9b,0x82,0x82,0x9d,0x89,0xfc,0x67,0x6c,0x39,0x39,0x04,0x2c,0x57,0x3c,0x08,0xfb,0x09,0x24,0x28,0x52,0x25,0x63,0x0b,0x00,0x01,0x01,0x0b,0xff,0xec,0x04,0xf9,0x06,0x27,0x00,0x45,0x00,0x00,0x01,0x14,0x0e,0x02,0x07,0x0e,0x04,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x17,0x16,0x16,0x17,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x3e,0x02,0x37,0x3e,0x02,0x35,0x35,0x33,0x04,0xf9,0x2e,0x54,0x92,0x9a,0x7e,0x72,0x56,0x3a,0x20,0x3b,0x36,0x22,0x5a,0x2f,0x23,0x2c,0x2f,0x54,0x2b,0x41,0x39,0x52,\r\n0x3c,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x8a,0x9e,0x8e,0x6a,0x92,0x6a,0x2d,0x84,0x40,0x6c,0x82,0x38,0x73,0xc5,0xc1,0x72,0x71,0x3a,0xa0,0x05,0xb4,0x4a,0x72,0x55,0x44,0x26,0x20,0x36,0x4e,0x73,0xa1,0x6f,0xfe,0xf0,0x44,0x46,0x46,0x38,0x2a,0x32,0x3b,0x39,0x01,0x9f,0x98,0x75,0x90,0x07,0x0a,0x39,0x23,0x2b,0x45,\r\n0x4c,0x3a,0x60,0x80,0xe4,0xbc,0xb9,0xf9,0x82,0x3b,0x47,0xa1,0x85,0x01,0x2c,0x8b,0xcd,0x8f,0x6c,0x39,0x23,0x3d,0x52,0x30,0x7b,0x00,0x00,0x01,0x01,0x20,0xff,0xec,0x04,0xe3,0x06,0x3b,0x00,0x43,0x00,0x00,0x01,0x06,0x06,0x15,0x15,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x21,0x07,0x23,0x22,0x06,0x15,0x14,0x16,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x24,0x35,0x10,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x34,0x36,0x37,0x04,0xe3,0x37,0x23,0xa2,0x22,0x8e,0x61,0x6a,0x85,0x35,0x63,0x46,0x01,0x3c,0x10,0xed,0x8f,0xb5,0xb8,\r\n0x8c,0x91,0xa8,0x41,0x30,0x16,0x1a,0x27,0x25,0x48,0x34,0x3a,0x4b,0x7e,0x6d,0x7e,0x8d,0x78,0xda,0x87,0xdf,0xfe,0xfb,0xdc,0x57,0x5e,0xe0,0xb6,0xa3,0x69,0x67,0x64,0x05,0xb1,0x10,0x45,0x58,0xa4,0x56,0x61,0x70,0x5b,0x35,0x58,0x32,0x8c,0xb2,0x91,0x8f,0xb7,0x7d,0x6d,0x49,0x5e,0x07,0x0a,0x39,0x23,0x2b,0x45,0x4c,0x3a,0x60,0x80,\r\n0xa7,0x99,0x6c,0xa2,0x58,0xf1,0xcd,0x01,0x2d,0x69,0x26,0x8b,0x5b,0x9b,0xbc,0x5b,0x6f,0x71,0x13,0x00,0x00,0x02,0x00,0x9d,0x00,0x45,0x03,0xaf,0x05,0xa3,0x00,0x0e,0x00,0x1d,0x00,0x00,0x01,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x12,0x37,0x14,0x02,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x33,\r\n0x32,0x12,0x03,0x08,0x60,0x4c,0x4e,0x7c,0x4e,0x33,0x55,0x2f,0x4f,0x77,0x47,0xa7,0x75,0xc9,0x87,0x67,0x95,0x51,0x7a,0xd7,0x7c,0x98,0xad,0x03,0x81,0xb6,0xe2,0xb0,0xfe,0xa8,0xb8,0x72,0xb7,0x62,0xa8,0x01,0x5f,0xa0,0xf3,0xfe,0x7f,0xbc,0x8f,0x01,0x1e,0xba,0xd5,0x01,0x5e,0xc4,0xfe,0xd5,0x00,0x01,0x00,0xb6,0xfe,0xf1,0x03,0x95,\r\n0x05,0xa3,0x00,0x2e,0x00,0x00,0x01,0x14,0x02,0x02,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x16,0x16,0x33,0x32,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x16,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x10,0x12,0x36,0x33,0x32,0x12,0x03,0x95,0x5d,0x88,0xa7,0x50,0x3b,0x7b,0x4d,0x4d,0x11,\r\n0x1f,0x06,0x0b,0x51,0x2d,0x46,0x93,0x53,0x3c,0x36,0x42,0x75,0x4d,0x27,0x10,0x09,0x5f,0x1d,0x11,0x38,0x22,0x74,0xcc,0x7a,0x7f,0x8b,0x03,0x60,0xec,0xfe,0x42,0xfe,0xdd,0xa2,0x4f,0x7b,0x3a,0x12,0x3a,0x20,0x3b,0x61,0x01,0x52,0x01,0xf7,0xcb,0xb6,0xca,0xc0,0xfe,0xa8,0x90,0x72,0x8f,0x29,0x17,0x15,0x1a,0x44,0x68,0x96,0x5a,0x01,\r\n0x0e,0x01,0x9e,0xe2,0xfe,0xd5,0x00,0x01,0x00,0x36,0x00,0x8a,0x04,0x16,0x05,0xa3,0x00,0x3f,0x00,0x00,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x01,0x36,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x17,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x12,0x12,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x03,0x03,0x36,0x33,0x32,0x16,0x33,0x32,0x36,0x37,0x36,0x36,0x33,0x32,0x16,0x04,0x16,0x0f,0x6e,0x65,0x44,0x1f,0x3a,0x1f,0x2b,0x35,0x0a,0x09,0x15,0x3e,0x0b,0x01,0x1a,0x29,0x31,0x68,0x41,0xb8,0x9e,0x55,0x30,0x09,0x5f,0x1c,0x13,0x31,0x21,0x6f,0xcc,0xf4,0x72,0x78,0x89,0xa9,0xc5,0x0d,0x14,0x18,0x2c,0x1b,\r\n0x17,0x62,0x21,0x0b,0x0d,0x0b,0x23,0x4c,0x02,0x21,0x11,0x2d,0xd7,0x60,0x12,0x22,0x07,0x40,0x10,0x16,0x16,0x02,0x32,0x52,0xaa,0x28,0xb2,0x9b,0xf7,0xfe,0xeb,0x89,0x5b,0x7d,0x18,0x11,0x17,0x47,0x5b,0x8b,0x3f,0xbf,0x01,0x6d,0x01,0x23,0xa5,0xa4,0x86,0x71,0xfe,0xbb,0xfe,0x84,0x04,0x09,0x8d,0x51,0x1c,0x17,0x23,0x00,0x00,0x01,\r\n0x00,0x5a,0x01,0x73,0x03,0xf1,0x05,0xa3,0x00,0x54,0x00,0x00,0x01,0x14,0x06,0x06,0x23,0x22,0x26,0x23,0x22,0x07,0x07,0x22,0x35,0x35,0x34,0x37,0x37,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x0e,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x02,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x35,0x34,0x12,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x16,0x33,0x32,0x36,0x37,0x36,0x33,0x32,0x16,0x03,0xe4,0x62,0x7f,0x2a,0x11,0x2d,0x28,0x23,0x23,0x10,0x36,0x43,0x20,0x9b,0x2a,0x3b,0x19,0x15,0x16,0x2b,0x31,0x38,0x24,0x23,0x30,0x27,0x1b,0x11,0x2f,0x2b,0x25,0x48,0x29,\r\n0x23,0x38,0x58,0x35,0x0d,0x11,0x0d,0x6b,0x1e,0x12,0x36,0x5f,0xa8,0x72,0x29,0x68,0x16,0x5e,0x61,0x36,0x53,0x2f,0x54,0x50,0x8d,0x18,0x1c,0x20,0x4f,0x1c,0x0d,0x15,0x11,0x32,0x02,0x62,0x22,0x71,0x51,0x07,0x0f,0x03,0x24,0x0d,0x0e,0x71,0x39,0x01,0x23,0x4d,0xc1,0x35,0x26,0x31,0x32,0x61,0x90,0x5d,0x5c,0x66,0x2e,0x1d,0x11,0x14,\r\n0x6d,0x5e,0xb5,0x62,0x26,0x26,0x82,0xfe,0xf1,0x90,0x4b,0x5c,0x3c,0x29,0x16,0x14,0x41,0xc6,0x49,0xe7,0x01,0x75,0xb7,0x32,0x23,0x55,0x32,0x57,0x33,0x4a,0xf1,0x94,0xfe,0x0b,0x3e,0x32,0x18,0x24,0x00,0x01,0x00,0xc5,0xff,0xc3,0x03,0x86,0x05,0xa7,0x00,0x26,0x00,0x00,0x01,0x32,0x16,0x16,0x15,0x10,0x02,0x06,0x23,0x22,0x26,0x35,\r\n0x34,0x12,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x12,0x35,0x34,0x26,0x27,0x26,0x35,0x34,0x36,0x02,0xea,0x20,0x4c,0x30,0x69,0xba,0x83,0x8c,0x8f,0x8d,0x81,0x1a,0x15,0x0e,0x57,0x2c,0x75,0x5d,0x43,0x3b,0x4a,0x6e,0x40,0x28,0x2e,0x08,0x54,0x05,0xa7,0x9c,0xed,0x6b,0xfe,0xef,0xfe,0x1c,\r\n0xfb,0xee,0xe8,0xd0,0x01,0x65,0x8e,0x1c,0x36,0x0c,0x14,0x3a,0xa0,0xfe,0xed,0x98,0x94,0xbb,0xde,0x01,0xa1,0xca,0x94,0xb9,0x49,0x0c,0x13,0x11,0x4a,0x00,0x00,0x01,0x00,0xab,0x01,0x46,0x03,0xa0,0x05,0xa7,0x00,0x33,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x27,0x27,0x06,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x35,\r\n0x34,0x36,0x33,0x32,0x16,0x15,0x07,0x14,0x16,0x33,0x32,0x36,0x37,0x37,0x36,0x37,0x36,0x35,0x34,0x27,0x27,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x17,0x13,0x17,0x16,0x03,0xa0,0x3b,0x29,0x19,0x2e,0x19,0x1a,0x18,0x0a,0x05,0x06,0x29,0x35,0x5a,0x49,0x57,0x65,0x2d,0x1e,0x37,0x27,0x1d,0x04,0x2a,0x2b,0x30,0x38,0x0d,0x06,0x0b,0x1d,\r\n0x14,0x16,0x04,0x3e,0x17,0x1b,0x17,0x14,0x0b,0x04,0x64,0x3c,0x24,0x01,0xdd,0x17,0x23,0x7b,0x8b,0x8a,0x77,0x80,0x2b,0x7f,0xfe,0x64,0xa3,0x51,0x71,0xe0,0xf8,0x21,0x1b,0x15,0x14,0xed,0x72,0x68,0xa7,0xd6,0x5a,0xa9,0x3a,0x3c,0x40,0x10,0x45,0x11,0x11,0x1f,0x18,0x47,0x45,0x18,0xfe,0x6e,0xd2,0x7f,0x00,0x01,0x00,0x79,0xff,0xc3,\r\n0x03,0xd2,0x05,0xa3,0x00,0x40,0x00,0x00,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x10,0x02,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x06,0x02,0x15,0x10,0x12,0x33,0x32,0x36,0x35,0x34,0x23,0x22,0x06,0x06,0x07,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x27,0x26,0x35,0x34,\r\n0x36,0x33,0x32,0x15,0x14,0x07,0x06,0x15,0x14,0x02,0x72,0x14,0x2a,0x16,0x78,0x94,0xc8,0xbe,0x88,0xd5,0x76,0x60,0xad,0xd8,0x60,0x37,0x26,0x10,0x2a,0x2f,0xb7,0xdc,0xa1,0x8a,0x70,0x72,0x7c,0x17,0x2e,0x20,0x01,0x01,0x17,0x22,0x1f,0x17,0x0e,0x0d,0x08,0x08,0x1d,0x30,0x4f,0x0b,0x0b,0x03,0x2a,0x06,0x0d,0xb3,0x93,0xfe,0xee,0xfe,\r\n0xde,0xb1,0x01,0x49,0xd2,0x9a,0x01,0x1e,0xdb,0x81,0x13,0x1a,0x31,0x1d,0x12,0x07,0x1a,0xfe,0xa4,0xff,0xfe,0xee,0xfe,0xc6,0xb9,0xc6,0xf6,0x31,0x49,0x19,0x1c,0x1d,0x15,0x22,0x33,0x5d,0x5c,0x35,0x26,0x44,0x44,0x24,0x29,0x28,0x3e,0x1e,0x46,0x47,0x2e,0x23,0x00,0x01,0x00,0x74,0xff,0xf6,0x03,0xd8,0x05,0xa3,0x00,0x3e,0x00,0x00,\r\n0x01,0x10,0x02,0x23,0x22,0x26,0x35,0x34,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x02,0x35,0x34,0x12,0x33,0x32,0x16,0x15,0x14,0x07,0x06,0x15,0x10,0x33,0x32,0x12,0x11,0x34,0x02,0x26,0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x12,0x03,\r\n0xd8,0x91,0x9e,0x6b,0x60,0x0d,0x0c,0x34,0x3c,0x3c,0x30,0x34,0x35,0x08,0x1a,0x59,0x19,0x2b,0x53,0x42,0x9b,0x89,0x78,0x90,0x0c,0x0c,0x41,0x34,0x34,0x5b,0xa1,0x60,0x23,0x46,0x47,0x20,0x09,0x20,0x14,0xab,0x62,0x95,0xeb,0x83,0x02,0xa5,0xfe,0x97,0xfe,0xba,0xb8,0xb6,0x33,0x95,0x94,0x30,0x7c,0x71,0xb2,0xb6,0x85,0xdd,0x6d,0x0f,\r\n0x1b,0x0f,0x15,0x4f,0xab,0x01,0x50,0x71,0xea,0x01,0x09,0xbd,0x9b,0x31,0x94,0x89,0x39,0xfe,0xf8,0x01,0x20,0x01,0x07,0xa6,0x01,0x23,0xa8,0x16,0x17,0x21,0x2f,0x1e,0x18,0x31,0xc4,0xfe,0x9f,0x00,0x00,0x01,0x00,0xa8,0x00,0x45,0x03,0xa4,0x05,0xa7,0x00,0x31,0x00,0x00,0x01,0x14,0x07,0x06,0x06,0x07,0x0e,0x02,0x23,0x22,0x27,0x26,\r\n0x23,0x22,0x07,0x06,0x23,0x22,0x26,0x35,0x34,0x13,0x01,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x01,0x37,0x37,0x32,0x17,0x17,0x32,0x37,0x3e,0x04,0x17,0x32,0x16,0x03,0xa4,0x2e,0x24,0x56,0x16,0x1b,0x17,0x20,0x0f,0x26,0x47,0x47,0x23,0x24,0x3f,0x3f,0x20,0x1d,0x27,0x67,0x01,0x43,0x09,0x44,0x23,0x31,0x12,0x14,0x26,\r\n0x57,0xfe,0xef,0x39,0x34,0x0e,0x65,0x20,0x11,0x21,0x0e,0x1f,0x0e,0x54,0x20,0x17,0x1f,0x4e,0x02,0xc6,0x14,0x4c,0x4b,0xd1,0x55,0x69,0x2a,0x1d,0x0f,0x0e,0x0e,0x0f,0x25,0x26,0x30,0x01,0x24,0x03,0xa9,0x1a,0x1a,0x13,0x0e,0x34,0x2f,0x5b,0xe2,0xfd,0x1f,0x07,0x04,0x10,0x03,0x68,0x2d,0x60,0x25,0xd5,0x34,0x03,0x27,0x00,0x00,0x01,\r\n0x00,0xce,0xff,0xc3,0x03,0x7d,0x05,0xa7,0x00,0x37,0x00,0x00,0x01,0x14,0x06,0x23,0x27,0x26,0x23,0x22,0x35,0x34,0x37,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,0x32,0x37,0x37,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x02,0x35,0x10,0x12,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x06,0x15,0x14,\r\n0x16,0x17,0x16,0x03,0x51,0x25,0x0d,0x22,0x5d,0x3d,0x3b,0x21,0x33,0x40,0x16,0x3c,0x30,0x72,0x79,0x73,0x66,0x4c,0x31,0x35,0x09,0x10,0x16,0x42,0x5d,0x89,0x4e,0x72,0xa8,0x5b,0xe6,0xd5,0x6e,0x86,0x2e,0x55,0x0e,0x13,0x24,0x33,0x21,0x01,0x94,0x13,0x4e,0x04,0x12,0x3b,0x18,0x54,0x81,0xdb,0x97,0x48,0x72,0x80,0xfe,0x9f,0xfe,0xc4,\r\n0xfe,0xf4,0xfe,0xda,0x3c,0x40,0x0b,0x3a,0x19,0x21,0x61,0x3d,0xa4,0x01,0x3b,0xde,0x01,0x85,0x01,0xa2,0xd1,0xab,0x4c,0xc0,0xe1,0x23,0x29,0x0e,0x10,0x0f,0x0b,0x08,0x00,0x02,0x00,0xc3,0xff,0xe7,0x05,0x05,0x04,0x19,0x00,0x0b,0x00,0x17,0x00,0x00,0x05,0x22,0x00,0x35,0x10,0x00,0x21,0x32,0x00,0x15,0x14,0x00,0x03,0x22,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0xe4,0xf5,0xfe,0xd4,0x01,0x2c,0x01,0x01,0xf8,0x01,0x1d,0xfe,0xdf,0xfa,0xb3,0xcc,0xd0,0xaf,0xb5,0xbe,0xbe,0x19,0x01,0x21,0xec,0x01,0x02,0x01,0x23,0xfe,0xe7,0xfc,0xfb,0xfe,0xde,0x03,0xa6,0xd9,0xba,0xb5,0xd2,0xcb,0xc0,0xc1,0xce,0x00,0x01,0x01,0x6a,0xff,0xe7,0x04,0x5e,0x04,0x19,\r\n0x00,0x15,0x00,0x00,0x01,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x01,0x70,0x72,0x9e,0xdf,0xff,0xfe,0xf8,0xf2,0x8e,0x6c,0x69,0x8f,0xa9,0xad,0xa1,0x9d,0x96,0x74,0x03,0xd3,0x46,0xfe,0xe5,0xf6,0xfe,0xfc,0xfe,0xe3,0x38,0xa2,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x00,\r\n0x00,0x02,0x01,0x08,0xfd,0x6d,0x04,0xc0,0x04,0x19,0x00,0x1c,0x00,0x27,0x00,0x00,0x01,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x36,0x35,0x11,0x34,0x27,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x10,0x00,0x03,0x22,0x06,0x15,0x14,0x33,0x32,0x36,0x35,0x34,0x26,0x02,0x8b,0x7b,0xb8,0x50,0xa8,0xdf,0x77,\r\n0xb4,0x63,0x1d,0x0c,0x73,0x60,0x64,0x71,0x80,0x86,0xb6,0xb8,0xfe,0xd1,0x68,0x2f,0x33,0x60,0x2b,0x33,0x31,0xfd,0x6d,0x23,0x28,0xaa,0x6c,0x79,0xe6,0x9d,0x02,0x25,0xb3,0x65,0x59,0x65,0x70,0x61,0x6d,0x6a,0xe8,0xdd,0xfd,0x9e,0xfe,0xce,0xfe,0xad,0x06,0x3d,0x35,0x31,0x5f,0x34,0x2d,0x30,0x34,0x00,0x00,0x01,0x01,0x20,0xfd,0x6d,\r\n0x04,0xa7,0x04,0x19,0x00,0x25,0x00,0x00,0x25,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x10,0x00,0x21,0x23,0x27,0x17,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x04,0x27,0x01,0x20,0x78,0xa2,0xc0,0xc6,0xb9,0xb2,0xad,0x82,0x7d,0xb2,0xf7,0x01,0x1a,0xfe,0xdd,0xfe,0xf1,0x1a,0x19,\r\n0x53,0xb6,0xe0,0x44,0x43,0x36,0x36,0x59,0x49,0x94,0x8f,0x87,0x78,0x66,0x27,0xc1,0x4e,0xd0,0xc7,0xbe,0xc5,0x56,0x9c,0x46,0xfe,0xe4,0xf5,0xfe,0xfc,0xfe,0xe3,0x02,0x5d,0xd2,0xb8,0x1b,0x90,0x20,0x52,0x80,0x9c,0x94,0x7b,0x1e,0x00,0x01,0x01,0x21,0xfd,0x6d,0x04,0xa6,0x04,0x19,0x00,0x21,0x00,0x00,0x01,0x22,0x06,0x15,0x14,0x16,\r\n0x33,0x32,0x24,0x37,0x15,0x03,0x06,0x02,0x07,0x23,0x36,0x12,0x01,0x06,0x23,0x22,0x24,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x03,0x36,0xb0,0xbf,0x9e,0x9b,0x57,0x01,0x09,0x46,0xcd,0xa7,0xaf,0x26,0xbb,0x3e,0xea,0x01,0x24,0x6d,0x8b,0xd4,0xfe,0xff,0x84,0xf5,0x98,0x73,0xbf,0x3c,0x41,0xcd,0x03,0x8f,0xa9,0x9c,\r\n0x93,0x98,0x3e,0x24,0x9c,0xfe,0xf7,0xd5,0xfe,0xe1,0x7b,0xa9,0x01,0x5d,0x01,0x50,0x30,0xed,0xce,0x87,0xd2,0x72,0x26,0x20,0x9c,0x29,0x2f,0x00,0x00,0x01,0x00,0x3c,0xfd,0x6d,0x05,0x8c,0x04,0x19,0x00,0x32,0x00,0x00,0x01,0x10,0x23,0x22,0x26,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x35,0x11,0x34,0x26,0x26,0x23,0x22,\r\n0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x05,0x8c,0xfa,0x6c,0x79,0x14,0x83,0x0e,0x2e,0x26,0x5e,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,\r\n0x77,0x88,0xa5,0x4e,0xfe,0x81,0xfe,0xec,0x75,0x64,0x50,0x24,0x2f,0x2d,0x30,0x32,0x8b,0x03,0x79,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0x00,0x01,0x01,0x05,0xff,0xe7,0x04,0xc3,0x07,0x62,0x00,0x31,0x00,0x00,0x01,0x10,0x12,0x33,\r\n0x32,0x36,0x35,0x34,0x27,0x2e,0x03,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x00,0x11,0x11,0x10,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x02,0x11,0x01,0xa9,0xb1,0xc5,0x7a,0x84,0x7c,0x77,0x4b,0x32,0x1b,0x96,0x8b,0x73,0x54,0x29,0x60,0x3e,0x41,0x46,\r\n0x57,0x75,0x66,0x65,0xd8,0xcc,0xfe,0xed,0xfe,0xf9,0x01,0x3b,0x01,0x2f,0xb6,0x98,0xa5,0xa7,0xe7,0xe1,0x02,0xe9,0xfe,0xb3,0xfe,0xd7,0x57,0x51,0x5b,0x4a,0x46,0x3b,0x45,0x4f,0x33,0x7f,0x92,0x2b,0x90,0x13,0x20,0x4c,0x39,0x33,0x55,0x43,0x3b,0x89,0x56,0xa0,0xa0,0x01,0x72,0x01,0x90,0x01,0x40,0x01,0x97,0x01,0xa2,0x4e,0xaa,0x6d,\r\n0xfe,0x9d,0xfe,0x86,0x00,0x01,0x00,0x50,0xfd,0x6d,0x06,0xdc,0x04,0x19,0x00,0x32,0x00,0x00,0x01,0x34,0x26,0x26,0x23,0x22,0x06,0x07,0x23,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x10,0x17,0x15,0x24,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x15,\r\n0x14,0x06,0x23,0x22,0x11,0x04,0xfc,0x29,0x5c,0x52,0x60,0x6f,0x0e,0x9e,0x0e,0x6d,0x60,0x51,0x5c,0x2a,0xbf,0xfe,0x99,0x4e,0xa8,0x89,0x78,0x8a,0x29,0x29,0x8b,0x77,0x88,0xa5,0x4e,0x5e,0x27,0x2d,0x0e,0x83,0x15,0x79,0x6d,0xfa,0x02,0x00,0xb0,0x91,0x4c,0x75,0x8b,0x8a,0x76,0x4b,0x90,0xb0,0xfe,0xa5,0x24,0x9c,0x48,0x01,0xd3,0xca,\r\n0xdb,0x72,0x60,0x75,0x74,0x61,0x70,0xda,0xcf,0xfc,0x85,0x89,0x32,0x30,0x2d,0x2f,0x26,0x3e,0x70,0x79,0x01,0x14,0x00,0x01,0x00,0xc9,0x00,0x00,0x04,0xfe,0x04,0x00,0x00,0x0e,0x00,0x00,0x01,0x06,0x02,0x07,0x23,0x36,0x12,0x37,0x33,0x16,0x12,0x17,0x23,0x26,0x02,0x02,0xe4,0x2b,0xc5,0x6e,0xbd,0x9a,0xf7,0x36,0xa8,0x3b,0xf2,0x99,\r\n0xbc,0x71,0xc3,0x03,0x31,0xbc,0xfe,0x3c,0xb1,0xe1,0x02,0x2e,0xf1,0xfe,0xfd,0xe1,0xe3,0xb6,0x01,0xc4,0x00,0x01,0x01,0x01,0xfd,0x6d,0x04,0xc6,0x04,0x19,0x00,0x24,0x00,0x00,0x01,0x10,0x21,0x32,0x16,0x15,0x10,0x21,0x22,0x35,0x34,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x02,0x11,0x10,0x12,0x33,\r\n0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x01,0x01,0x02,0x11,0xd1,0xe3,0xfe,0xcd,0xfa,0x08,0xa0,0x08,0x2b,0x35,0x48,0x3d,0x8b,0x81,0xb3,0xb6,0xf8,0xe9,0x8f,0x86,0x7e,0x9f,0xfe,0xc4,0xfe,0xbb,0x01,0x29,0x02,0xf0,0xea,0xdb,0xfe,0x62,0xdd,0x30,0x12,0x18,0x27,0x2f,0x30,0x8e,0x8b,0x9b,0xa2,0xfe,0xd6,0xfe,0xbc,0xfe,0x74,0xfe,0x65,\r\n0x52,0xa0,0x3d,0x01,0xe3,0x00,0x00,0x01,0x00,0xd6,0xff,0xe7,0x04,0xf1,0x05,0xfa,0x00,0x22,0x00,0x00,0x01,0x32,0x16,0x17,0x36,0x35,0x34,0x27,0x33,0x16,0x15,0x14,0x06,0x06,0x07,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x00,0x11,0x34,0x12,0x02,0x9f,0x68,0xa6,0x29,0x75,0x3f,0xb0,0x35,\r\n0x2f,0x54,0x75,0x8d,0x6e,0x5d,0x8d,0x98,0xad,0xa9,0x82,0x76,0x6c,0x8e,0xf2,0xfe,0xf8,0xf2,0x04,0x19,0x5f,0x56,0xa4,0xfc,0x8b,0x6b,0x6a,0x8e,0x65,0xa9,0x9a,0x97,0x5b,0x6f,0xce,0xb5,0xc7,0xd0,0x4e,0xa2,0x38,0x01,0x1a,0x01,0x07,0xfc,0x01,0x15,0x00,0x03,0x00,0x8b,0xff,0xe8,0x05,0x79,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x33,\r\n0x00,0x00,0x01,0x02,0x21,0x22,0x26,0x27,0x0e,0x02,0x23,0x20,0x03,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x35,0x33,0x12,0x33,0x32,0x36,0x36,0x35,0x13,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x03,0x34,0x26,0x26,0x23,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x00,0x05,0x79,0x01,0xfe,0x9f,0x59,0x9d,0x1f,0x0f,0x53,0x76,\r\n0x3c,0xfe,0x9e,0x01,0xa1,0x1f,0x5a,0x49,0x63,0x62,0xa1,0x02,0xc0,0x47,0x5a,0x21,0x99,0xfe,0x94,0xfe,0xfd,0xfe,0xfd,0xfe,0x94,0x01,0x6d,0x01,0x02,0x01,0x01,0x01,0x6e,0xa1,0x7e,0xd5,0x7b,0xbc,0xfe,0xef,0x01,0x0c,0xc1,0xc5,0x01,0x09,0x06,0xd0,0xfe,0x51,0x57,0x4e,0x2c,0x4e,0x2b,0x01,0xaf,0x62,0x7a,0x42,0x86,0x98,0xfe,0xe2,\r\n0x3e,0x75,0x6b,0xfb,0x87,0xfe,0xfd,0xfe,0x94,0x01,0x6e,0x01,0x01,0x01,0x01,0x01,0x6e,0xfe,0x94,0xfe,0xfd,0x80,0xdb,0x83,0xfe,0xe3,0xc1,0xbe,0xfe,0xe0,0x01,0x23,0x00,0x01,0x02,0xb1,0x00,0x00,0x03,0x52,0x06,0xd0,0x00,0x03,0x00,0x00,0x21,0x23,0x11,0x33,0x03,0x52,0xa1,0xa1,0x06,0xd0,0x00,0x04,0x00,0x1f,0xff,0xe8,0x05,0xe4,\r\n0x06,0xe8,0x00,0x20,0x00,0x2c,0x00,0x38,0x00,0x45,0x00,0x00,0x25,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x23,0x11,0x26,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x14,0x06,0x07,0x11,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x32,0x16,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x16,0x33,0x32,0x36,0x05,0xe4,0x73,0x9d,0x78,0x9b,0x86,0x4c,0x9d,0x5e,0xa2,0x72,0x50,0x49,0xcb,0x90,0x90,0xca,0x01,0x8f,0x7b,0x79,0x91,0x6f,0x9e,0x85,0x4d,0x6b,0x4b,0xfd,0x93,0x3d,0x2d,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0xfd,0xd0,0x3e,0x2d,0x2b,0x40,0x40,\r\n0x2b,0x2d,0x3e,0x01,0x77,0x76,0x54,0x50,0x7a,0x3a,0x3d,0x53,0x54,0x76,0x69,0x81,0x6d,0x5a,0xaf,0x04,0x3a,0x1d,0x5d,0x62,0x77,0x90,0xcb,0xcc,0x8f,0x78,0xbb,0x20,0xfc,0xa4,0x61,0x6b,0x5b,0x5b,0x01,0xe4,0x2d,0x3d,0x3e,0x2c,0x2d,0x3e,0x3e,0x2d,0x2c,0x3e,0x3d,0x2d,0x2e,0x3d,0x3e,0x02,0xa8,0x56,0x74,0x71,0x59,0x53,0x3d,0x3a,\r\n0x72,0x00,0x00,0x02,0x00,0xb7,0x00,0x00,0x05,0x4d,0x06,0xe8,0x00,0x29,0x00,0x35,0x00,0x00,0x01,0x10,0x21,0x23,0x11,0x23,0x11,0x21,0x32,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x20,0x36,0x35,0x34,0x26,0x23,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x20,0x15,0x14,0x07,0x15,0x16,0x01,0x34,0x26,0x27,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x4d,0xfe,0x8f,0x5f,0xa1,0x01,0x00,0x79,0x67,0x43,0xa7,0xa1,0x01,0x02,0x89,0x71,0x6f,0x76,0x19,0xbb,0x80,0x8c,0xcf,0xcb,0x90,0x7c,0xbf,0x19,0x76,0x01,0x71,0xc5,0xc5,0xfd,0x8f,0x76,0x54,0x51,0x79,0x6f,0x5b,0x56,0x74,0x03,0x16,0xfe,0xf9,0xfd,0xf1,0x02,0xa0,0x40,0x4a,0x34,0x3b,\r\n0x12,0x91,0x42,0x4d,0x4c,0x2f,0x75,0xa0,0xc7,0x95,0x90,0xcb,0x9c,0x75,0xf8,0xb6,0x32,0x07,0x35,0x01,0xd2,0x55,0x74,0x01,0x71,0x59,0x51,0x79,0x76,0x00,0x00,0x01,0x00,0xd7,0x00,0x00,0x05,0x2d,0x06,0xd0,0x00,0x12,0x00,0x00,0x21,0x23,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x33,0x01,0x07,0x01,0x11,0x21,0x11,0x33,0x11,0x21,0x05,\r\n0x2d,0xa1,0xfe,0xc7,0xa1,0xfe,0x25,0xa3,0x01,0xa5,0x72,0xfe,0xcb,0x01,0x3a,0xa1,0x01,0xda,0x02,0x48,0xfd,0xb8,0x02,0x48,0x04,0x88,0xfe,0x58,0x72,0x01,0x39,0xfc,0xea,0x01,0x22,0xfe,0xde,0x00,0x00,0x01,0x00,0xf9,0xff,0xe9,0x05,0x0b,0x06,0xd0,0x00,0x1b,0x00,0x00,0x01,0x14,0x06,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,\r\n0x00,0x07,0x23,0x11,0x33,0x01,0x07,0x01,0x11,0x36,0x37,0x36,0x33,0x32,0x16,0x16,0x05,0x0b,0xd5,0x96,0x37,0x7c,0x95,0x86,0x70,0xd8,0xfe,0xef,0x01,0xa1,0xa3,0x01,0xa6,0x72,0xfe,0xca,0x51,0x87,0x7f,0x93,0x71,0xb5,0x61,0x01,0xa6,0x9a,0xf6,0x2d,0x7b,0x21,0xb4,0x6d,0x62,0x74,0xfe,0x82,0xfe,0x06,0xd0,0xfe,0x58,0x72,0x01,0x39,\r\n0xfb,0xf9,0x89,0x47,0x47,0x51,0x9e,0x00,0x00,0x02,0x01,0x37,0xff,0xe8,0x04,0xcd,0x06,0xd0,0x00,0x1a,0x00,0x26,0x00,0x00,0x01,0x14,0x06,0x23,0x20,0x11,0x10,0x13,0x21,0x35,0x21,0x36,0x37,0x21,0x15,0x21,0x06,0x07,0x21,0x15,0x21,0x02,0x11,0x36,0x33,0x32,0x16,0x07,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,\r\n0xcd,0xcc,0x8f,0xfe,0x6e,0x7d,0xfe,0xda,0x01,0x61,0x47,0x7a,0x01,0x74,0xfe,0xf2,0x47,0x2f,0x01,0x2f,0xfe,0x94,0x8b,0x69,0x88,0x8f,0xcc,0x91,0x72,0x58,0x59,0x72,0x70,0x5b,0x5a,0x70,0x01,0x44,0x90,0xcc,0x02,0x57,0x01,0x2d,0x01,0x53,0x92,0xa2,0xdd,0x92,0x83,0x6a,0x92,0xfe,0xa1,0xfe,0xde,0x60,0xcc,0x8e,0x50,0x79,0x78,0x51,\r\n0x50,0x7b,0x7a,0x00,0x00,0x02,0x00,0x33,0xff,0xe8,0x05,0xd0,0x06,0xe8,0x00,0x1f,0x00,0x2b,0x00,0x00,0x13,0x36,0x33,0x32,0x17,0x16,0x33,0x32,0x37,0x33,0x11,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x11,0x06,0x23,0x22,0x27,0x26,0x23,0x22,0x07,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,\r\n0x33,0x73,0x9d,0x76,0x9d,0x83,0x4e,0x9e,0x5d,0xa3,0x75,0x96,0xca,0x92,0x8f,0xcc,0x98,0x72,0x77,0x93,0x70,0x9d,0x85,0x4c,0x69,0x4e,0x03,0x26,0x77,0x53,0x54,0x77,0x78,0x53,0x53,0x77,0x06,0x67,0x81,0x6d,0x5b,0xb0,0xfb,0xc5,0x1c,0xc0,0x76,0x90,0xcb,0xca,0x91,0x77,0xc0,0x1b,0x03,0x5d,0x62,0x6c,0x5b,0x5b,0xfb,0x47,0x53,0x77,\r\n0x76,0x54,0x54,0x76,0x77,0x00,0x00,0x04,0x01,0x1c,0xff,0xe8,0x04,0xe8,0x06,0x83,0x00,0x0b,0x00,0x17,0x00,0x2d,0x00,0x39,0x00,0x00,0x01,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x05,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x01,0x14,0x00,0x23,0x22,0x00,0x35,0x10,0x37,0x26,0x03,0x33,0x16,0x16,\r\n0x33,0x32,0x36,0x37,0x33,0x02,0x07,0x16,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xad,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0xfd,0x7f,0x3d,0x2d,0x2e,0x3d,0x3e,0x2d,0x2c,0x3e,0x02,0xbc,0xfe,0xe6,0xcc,0xcc,0xfe,0xe6,0xda,0xd9,0x01,0xa2,0x01,0xbd,0x86,0x87,0xbd,0x01,0xa1,0x02,0xd8,0xda,0xa1,0xbf,\r\n0x86,0x86,0xbe,0xbf,0x85,0x86,0xbf,0x06,0x18,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0x2d,0x2b,0x40,0x40,0x2b,0x2d,0x3e,0x3e,0xfb,0x8c,0xc7,0xfe,0xde,0x01,0x20,0xc9,0x01,0x02,0x95,0x93,0x01,0x00,0x7e,0xc5,0xc7,0x7c,0xfe,0xff,0x92,0x95,0xfe,0xfe,0x7f,0xc7,0xc6,0x80,0x83,0xc5,0xc7,0x00,0x00,0x03,0x00,0x45,0xff,0xe9,0x05,0xbe,\r\n0x06,0xe8,0x00,0x28,0x00,0x35,0x00,0x41,0x00,0x00,0x01,0x14,0x06,0x07,0x15,0x14,0x07,0x16,0x15,0x14,0x06,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x27,0x06,0x21,0x22,0x24,0x27,0x34,0x37,0x36,0x33,0x20,0x17,0x36,0x35,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x32,0x16,0x07,0x34,0x27,0x26,0x23,0x22,0x06,0x07,0x14,0x16,0x33,0x32,0x36,\r\n0x01,0x26,0x21,0x22,0x06,0x15,0x14,0x16,0x16,0x33,0x20,0x37,0x05,0xbe,0x92,0x81,0x2f,0x2f,0x79,0xf2,0x98,0xb0,0xc2,0x07,0xb5,0xfe,0xc7,0xcb,0xfe,0xec,0x01,0x8b,0x8a,0xcb,0x01,0x38,0xb6,0x07,0x01,0x7c,0x96,0xca,0x91,0x90,0xcc,0x92,0x3b,0x3a,0x55,0x55,0x74,0x01,0x71,0x59,0x56,0x74,0xfe,0x9f,0x8c,0xfe,0xe6,0x87,0xb8,0x57,\r\n0x93,0x55,0x01,0x1b,0x8b,0x05,0x8d,0x76,0xc2,0x1d,0x18,0x86,0x74,0x72,0x88,0x9d,0xeb,0x9e,0x1d,0xa1,0x2b,0xd7,0xa0,0x28,0x29,0xc4,0xd8,0x95,0x97,0x6a,0x6c,0xc3,0x28,0x28,0x18,0x1d,0xbf,0x79,0x90,0xca,0x01,0xcc,0x8f,0x57,0x38,0x3b,0x76,0x54,0x51,0x79,0x76,0xfd,0xef,0xc2,0x74,0x50,0x32,0x5e,0x33,0xc1,0xff,0xff,0x00,0x00,\r\n0xfd,0xff,0x03,0xbd,0xff,0xbb,0x02,0x26,0x0b,0x59,0x00,0x00,0x00,0x27,0x0b,0x5f,0x02,0x6d,0x00,0x00,0x00,0x07,0x0b,0x53,0x03,0x04,0x00,0x00,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x97,0xff,0xbb,0x02,0x26,0x0b,0x5a,0x00,0x00,0x00,0x67,0x0b,0x5f,0x02,0x47,0x00,0x00,0xc0,0x01,0x40,0x00,0x00,0x07,0x0b,0x53,0x02,0xde,0x00,0x00,\r\n0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x97,0xff,0xbb,0x02,0x26,0x0b,0x5b,0x00,0x00,0x00,0x67,0x0b,0x5f,0x02,0x47,0x00,0x00,0xc0,0x01,0x40,0x00,0x00,0x07,0x0b,0x53,0x02,0xde,0x00,0x00,0xff,0xff,0xff,0x9c,0x05,0x77,0x00,0x67,0x06,0x40,0x02,0x06,0x0b,0x66,0x00,0x00,0xff,0xff,0xfe,0xe6,0x05,0x77,0x01,0x1b,0x06,0x40,0x02,0x27,\r\n0x0b,0x66,0xff,0x4a,0x00,0x00,0x00,0x07,0x0b,0x66,0x00,0xb4,0x00,0x00,0xff,0xff,0xff,0x9c,0xfe,0x8d,0x00,0x67,0xff,0x56,0x02,0x06,0x0b,0x67,0x00,0x00,0xff,0xff,0x00,0x31,0x00,0x00,0x03,0x17,0x05,0xd5,0x02,0x26,0x0b,0x6a,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0x9f,0x00,0x00,0xff,0xff,0x00,0x20,0x00,0x00,0x03,0xab,0x05,0xd5,\r\n0x02,0x26,0x0b,0x6b,0x00,0x00,0x00,0x07,0x0b,0x61,0x01,0xea,0x00,0x00,0xff,0xff,0x00,0xb8,0x00,0x00,0x04,0xc0,0x05,0xd5,0x02,0x26,0x0b,0x6c,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0xad,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xed,0x05,0x23,0x05,0xd5,0x02,0x26,0x0b,0x82,0x00,0x00,0x00,0x07,0x0b,0x61,0x02,0xf3,0x00,0x00,0x00,0x02,\r\n0x00,0x6d,0xff,0xe8,0x01,0xcc,0x05,0xb2,0x00,0x0d,0x00,0x1b,0x00,0x4d,0x40,0x2e,0x11,0x03,0x7e,0x18,0x0a,0x0a,0x1d,0x1b,0x14,0x0d,0x06,0x15,0x91,0x14,0x0d,0x91,0x00,0x2f,0x14,0x01,0x20,0x00,0x50,0x00,0x80,0x00,0xb0,0x00,0xd0,0x00,0xe0,0x00,0x06,0x14,0x00,0x14,0x00,0x06,0x1b,0x91,0x0e,0x04,0x07,0x91,0x06,0x13,0x00,0x3f,\r\n0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x10,0xed,0x01,0x2f,0x33,0x33,0x33,0x12,0x39,0x2f,0x33,0xe9,0x32,0x31,0x30,0x13,0x32,0x16,0x15,0x14,0x06,0x23,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x11,0x32,0x16,0x15,0x14,0x06,0x23,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x6d,0x91,0xce,0xce,0x91,0x52,0x65,0x65,0x52,\r\n0x91,0xce,0xce,0x91,0x52,0x65,0x65,0x52,0x02,0xa6,0xce,0x91,0x91,0xce,0x98,0x06,0x6e,0x53,0x53,0x6e,0x06,0x03,0xa4,0xce,0x91,0x91,0xce,0x98,0x06,0x6e,0x53,0x53,0x6e,0x06,0x00,0x02,0x00,0x5a,0x01,0x80,0x01,0x52,0x05,0xb2,0x00,0x0d,0x00,0x1b,0x00,0x30,0x40,0x18,0x11,0x03,0xed,0x18,0x0a,0x0a,0x1d,0x1b,0x14,0x0d,0x06,0x07,\r\n0x96,0x06,0x0d,0x96,0x00,0x15,0x96,0x14,0x1b,0x96,0x0e,0x04,0x00,0x3f,0xed,0xd6,0xed,0xd6,0xed,0xd6,0xed,0x01,0x2f,0x33,0x33,0x33,0x12,0x39,0x2f,0x33,0xe9,0x32,0x31,0x30,0x13,0x16,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x11,0x16,0x16,0x15,0x14,0x06,0x07,0x35,0x36,0x36,0x35,0x34,0x26,0x27,0x5a,0x68,\r\n0x90,0x90,0x68,0x36,0x3a,0x3a,0x36,0x68,0x90,0x90,0x68,0x36,0x3a,0x3a,0x36,0x03,0x70,0x02,0x91,0x65,0x65,0x91,0x02,0x82,0x05,0x3b,0x36,0x36,0x3b,0x05,0x02,0xc4,0x02,0x91,0x65,0x65,0x91,0x02,0x82,0x05,0x3b,0x36,0x36,0x3b,0x05,0x00,0x00,0x01,0x00,0x5b,0x02,0xac,0x01,0xde,0x05,0xb2,0x00,0x0d,0x00,0x1e,0x40,0x0e,0x00,0x07,\r\n0x07,0x0f,0x03,0x7e,0x0a,0x06,0x91,0x07,0x00,0x91,0x0d,0x04,0x00,0x3f,0xed,0xd6,0xed,0x01,0x2f,0xe9,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0xde,0x60,0x7b,0x7b,0x60,0xa7,0xdc,0xdc,0xa7,0x05,0x1a,0x06,0x85,0x60,0x60,0x85,0x06,0x98,0xdc,0xa7,0xa7,0xdc,0x00,\r\n0x00,0x01,0x00,0x4e,0x03,0x90,0x01,0x5e,0x05,0xb2,0x00,0x0d,0x00,0x1e,0x40,0x0e,0x00,0x07,0x07,0x0f,0x03,0xed,0x0a,0x06,0x96,0x07,0x00,0x96,0x0d,0x04,0x00,0x3f,0xed,0xd6,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x15,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x5e,0x3f,0x49,0x49,0x3f,\r\n0x77,0x99,0x95,0x7b,0x05,0x30,0x05,0x4b,0x3f,0x3f,0x4b,0x05,0x82,0x02,0x98,0x77,0x75,0x98,0x04,0x00,0x00,0x01,0x00,0xbc,0xfe,0x5a,0x04,0xf2,0x05,0x9a,0x00,0x15,0x00,0x3b,0x40,0x1f,0x13,0x00,0x7e,0x0b,0x06,0x0b,0x06,0x0b,0x17,0x12,0x0e,0x7e,0x0f,0x0d,0x91,0x40,0x12,0x10,0x0f,0x12,0x91,0x2b,0x30,0x14,0x10,0x03,0x08,0x91,\r\n0x03,0x0f,0x12,0x00,0x3f,0xd4,0xed,0x3f,0x33,0x2b,0x00,0x18,0x2f,0x1a,0xed,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x31,0x30,0x25,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x04,0xf2,0xb5,0xb7,0x4c,0x3d,0x4f,0x3e,0x5f,0x61,0xfd,0x1a,0xa8,\r\n0xa8,0x02,0xe6,0xa8,0x3f,0xf8,0xed,0x1f,0xa5,0x2c,0x86,0x89,0x02,0x8d,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x02,0x75,0x00,0x01,0x00,0xa6,0xfe,0x5a,0x03,0xf8,0x05,0xec,0x00,0x1a,0x00,0x2f,0x40,0x18,0x00,0x84,0x0a,0x06,0x0a,0x06,0x0a,0x1c,0x15,0x11,0x84,0x12,0x15,0x0d,0x95,0x18,0x0f,0x13,0x00,0x08,0xec,0x03,0x12,0x15,0x00,0x3f,\r\n0xd4,0xed,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x21,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x20,0x11,0x03,0xf8,0xb7,0xaf,0x4d,0x3d,0x4f,0x3f,0xbe,0xee,0x77,0xa5,0xa4,0xa4,0x04,0x77,0xd9,0x01,\r\n0x5a,0xd4,0xd2,0x1f,0xa5,0x2c,0x01,0x0e,0x02,0x4e,0x01,0x40,0xb8,0x92,0xfd,0xbc,0x05,0xec,0xfd,0x6a,0xc2,0xfe,0x5f,0x00,0x00,0x01,0x00,0x29,0xfe,0x21,0x05,0x83,0x05,0x9a,0x00,0x21,0x00,0x5c,0x40,0x31,0x1f,0x17,0x7e,0x13,0x0a,0x18,0x03,0x7d,0x10,0x15,0x21,0x1a,0x18,0x1d,0x10,0x21,0x21,0x10,0x1d,0x18,0x1a,0x05,0x22,0x23,\r\n0x00,0x14,0x21,0x15,0x91,0x1f,0x12,0x92,0x00,0x00,0x06,0x1f,0x1f,0x18,0x1e,0x1a,0x91,0x1b,0x03,0x0a,0x0d,0x92,0x06,0x18,0x12,0x00,0x3f,0xd4,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x01,0x2f,0x33,0x11,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x10,0xc6,0xc4,0xe9,0x32,\r\n0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x23,0x35,0x01,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x15,0x03,0xea,0xbf,0xda,0xfe,0xdf,0xea,0x76,0xaa,0x56,0x63,0xb7,0x63,0x96,0xbc,0xfe,0xa1,0x8c,0x01,0x8a,0xfd,0xfe,0xa8,0xfe,0x63,0x03,0xe3,0xfe,\r\n0x62,0x03,0x02,0x01,0x73,0x04,0xd8,0xb6,0xce,0xf2,0x26,0x2e,0xb6,0x44,0x37,0xa0,0x87,0x01,0x1e,0x07,0x02,0x3f,0xfc,0xc5,0x05,0x02,0x98,0x98,0xfe,0xd1,0x28,0x00,0x00,0x01,0x00,0x2b,0xfe,0x21,0x04,0xe4,0x05,0x2f,0x00,0x29,0x00,0x57,0x40,0x2e,0x00,0x12,0x03,0x83,0x0e,0x14,0x29,0x12,0x0e,0x29,0x29,0x0e,0x12,0x03,0x2b,0x27,\r\n0x15,0x84,0x24,0x22,0x09,0x20,0x29,0x15,0x21,0x95,0x23,0x11,0x96,0x00,0x00,0x06,0x27,0x26,0x23,0x0f,0x1b,0x19,0x95,0x1e,0x15,0x09,0x0b,0x95,0x06,0x1b,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x33,0x33,0x12,0x39,0x2f,0xed,0x10,0xed,0x32,0x32,0x01,0x2f,0xc4,0x33,0x33,0xe9,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,\r\n0xe9,0x11,0x33,0x31,0x30,0x01,0x16,0x16,0x15,0x14,0x00,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,0x33,0x35,0x37,0x11,0x21,0x15,0x03,0x20,0xd2,0xf2,0xfe,0xb5,0xf0,0xb6,0x9a,0xa6,0xb0,0xab,0xe2,0xdb,0xd1,0x52,0x01,\r\n0x80,0xfd,0xc1,0x46,0x51,0x3f,0x2c,0x3b,0x5e,0xfe,0xf3,0xb0,0xb0,0xa4,0x03,0x2a,0x01,0xae,0x1c,0xe9,0xb3,0xce,0xfe,0xf9,0x51,0xa2,0x68,0xb2,0x94,0x9b,0xa0,0x33,0x02,0x14,0xfd,0xbf,0x67,0x58,0x22,0x8c,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x33,0x00,0x00,0x01,0x00,0x66,0xff,0xe9,0x04,0x0b,0x05,0xb2,0x00,0x24,\r\n0x00,0x4b,0x40,0x17,0x24,0x1a,0x18,0x01,0x20,0x0e,0x1a,0x01,0x0e,0x0e,0x01,0x1a,0x03,0x26,0x09,0x7d,0x15,0x20,0x23,0x91,0x1c,0x00,0x05,0xb8,0x01,0x05,0x40,0x0e,0x19,0x1a,0x24,0x1b,0x19,0x04,0x12,0x1c,0x04,0x0e,0x0c,0x91,0x12,0x13,0x00,0x3f,0xed,0x32,0x3f,0x12,0x17,0x39,0x10,0xed,0x33,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,\r\n0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x26,0x26,0x27,0x27,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x06,0x23,0x20,0x24,0x35,0x34,0x24,0x37,0x35,0x01,0x35,0x01,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x07,0x03,0x3c,0x0c,0x25,0x13,0x26,0x1f,0xd2,0xca,0xd4,0xac,0xb9,0xbb,0x5c,\r\n0xb3,0x65,0xfe,0xfd,0xfe,0xd2,0x01,0x17,0xf4,0xfe,0x49,0x01,0xb7,0x93,0x9c,0x4f,0x53,0xbf,0x58,0xf8,0x03,0x40,0x8c,0x03,0x03,0x01,0x02,0x99,0x9b,0x7e,0x8c,0x5c,0xa6,0x29,0x23,0xdc,0xc3,0xc6,0xd8,0x02,0x04,0x01,0x23,0x2e,0x01,0x35,0x24,0x22,0xaa,0x30,0x28,0xab,0x00,0x01,0x00,0x26,0xfe,0x1d,0x03,0xc5,0x04,0x00,0x00,0x25,\r\n0x00,0x4a,0x40,0x26,0x25,0x1b,0x19,0x00,0x1b,0x00,0x1b,0x00,0x16,0x21,0x10,0x10,0x27,0x09,0x84,0x16,0x21,0x24,0x95,0x1d,0x06,0x96,0x00,0x1c,0x25,0x1b,0x03,0x1d,0x19,0x19,0x13,0x1d,0x10,0x0f,0x0c,0x95,0x13,0x1c,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x12,0x17,0x39,0x33,0xed,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,\r\n0xc4,0x11,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x15,0x26,0x26,0x27,0x27,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x24,0x35,0x34,0x24,0x37,0x35,0x01,0x35,0x01,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x07,0x02,0xf6,0x0c,0x25,0x13,0x26,0x1f,0xc3,0xde,0xe3,0xa2,0x5e,0xb8,0x5e,\r\n0x67,0xaa,0x63,0xf9,0xfe,0xce,0x01,0x1e,0xee,0xfe,0x56,0x01,0x8f,0x9a,0xaa,0x4e,0x53,0xbf,0x58,0xf0,0x01,0x8e,0x8c,0x03,0x03,0x01,0x02,0xa9,0x97,0x83,0xa0,0x34,0x2e,0x9c,0x2d,0x24,0xe3,0xca,0xc5,0xe3,0x02,0x05,0x01,0x23,0x2e,0x01,0x36,0x24,0x22,0x9b,0x30,0x28,0xbe,0x00,0x00,0x02,0x00,0x51,0xff,0xe6,0x03,0x95,0x05,0x9a,\r\n0x00,0x12,0x00,0x1e,0x00,0x35,0x40,0x1a,0x13,0x12,0x01,0x7e,0x0f,0x08,0x0f,0x08,0x0f,0x20,0x1e,0x10,0x11,0x10,0x91,0x17,0x12,0x1e,0x1e,0x04,0x12,0x03,0x0b,0x91,0x04,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x01,0x2f,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x33,0x31,0x30,0x01,0x11,0x14,0x06,0x23,\r\n0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x13,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x07,0x06,0x07,0x01,0x03,0x95,0xa4,0xbc,0x23,0x65,0x21,0x1f,0x61,0x29,0x60,0x58,0xfd,0x64,0x02,0x95,0x07,0x07,0x03,0x04,0x07,0x09,0x11,0x09,0x08,0xfe,0x47,0x05,0x9a,0xfb,0xdc,0xde,0xb2,0x0f,0x10,0xa5,0x11,0x1b,\r\n0x58,0x80,0x0f,0x81,0x03,0xb4,0xfc,0x61,0x02,0x4d,0x18,0x54,0x1a,0x0f,0x10,0x1d,0x0f,0x0c,0xfd,0x84,0x00,0x02,0x00,0x21,0xfe,0x1e,0x03,0x50,0x04,0x00,0x00,0x12,0x00,0x1d,0x00,0x30,0x40,0x18,0x13,0x11,0x00,0x84,0x0e,0x07,0x0e,0x07,0x0e,0x1f,0x1d,0x10,0x17,0x11,0x0f,0x10,0x1d,0x96,0x0f,0x15,0x0a,0x95,0x03,0x1c,0x00,0x3f,\r\n0xed,0x3f,0xed,0x32,0x3f,0x33,0x01,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x33,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x33,0x03,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x01,0x03,0x50,0xae,0xa5,0x29,0x57,0x29,0x2b,0x51,0x2a,0x5a,0x58,0xfd,0x75,\r\n0x02,0x85,0xaa,0xa4,0x02,0x05,0x03,0x03,0x0a,0x06,0x14,0xfe,0x46,0x3f,0xca,0xd9,0x0c,0x14,0x99,0x1b,0x12,0x7e,0x9b,0x3d,0x6f,0x03,0x91,0xfc,0x84,0x02,0x54,0x1e,0x32,0x15,0x07,0x14,0x0a,0x22,0xfd,0x8e,0x00,0x03,0x00,0x51,0xff,0xe6,0x04,0xa1,0x05,0x9a,0x00,0x16,0x00,0x22,0x00,0x26,0x00,0x54,0x40,0x2c,0x26,0x23,0x24,0x25,\r\n0x01,0x04,0x7e,0x13,0x17,0x16,0x13,0x23,0x03,0x25,0x13,0x0c,0x0c,0x13,0x25,0x03,0x23,0x05,0x28,0x22,0x14,0x25,0x12,0x26,0x04,0x14,0x91,0x15,0x01,0x1b,0x16,0x22,0x22,0x08,0x16,0x03,0x0f,0x91,0x08,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0xfd,0x32,0xcc,0x3f,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,\r\n0x2f,0x2f,0x11,0x33,0x33,0x10,0xe9,0x32,0x11,0x33,0x11,0x33,0x31,0x30,0x01,0x11,0x33,0x15,0x23,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x13,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x07,0x06,0x07,0x01,0x05,0x03,0x23,0x13,0x03,0x95,0xf1,0xf1,0xa6,0xba,0x23,0x65,0x21,0x1f,0x61,\r\n0x29,0x60,0x58,0xfd,0x64,0x02,0x95,0x07,0x07,0x03,0x04,0x07,0x09,0x11,0x09,0x08,0xfe,0x47,0x03,0x99,0xa6,0x7b,0x75,0x05,0x9a,0xfc,0x61,0x96,0x0e,0xc7,0xaa,0x0f,0x10,0xa5,0x11,0x1b,0x58,0x80,0x0f,0x81,0x03,0xb4,0xfc,0x61,0x02,0x4d,0x18,0x54,0x1a,0x0f,0x10,0x1d,0x0f,0x0c,0xfd,0x84,0xf8,0xfe,0xfc,0x01,0x04,0x00,0x00,0x03,\r\n0x00,0x21,0xfe,0x1e,0x04,0x72,0x04,0x00,0x00,0x16,0x00,0x21,0x00,0x25,0x00,0x4b,0x40,0x26,0x23,0x24,0x25,0x22,0x07,0x24,0x14,0x22,0x22,0x14,0x24,0x07,0x04,0x27,0x21,0x10,0x13,0x16,0x84,0x17,0x11,0x0e,0x1b,0x11,0x0f,0x24,0x24,0x03,0x13,0x10,0x21,0x25,0x16,0x0f,0x15,0x0a,0x03,0x1c,0x00,0x3f,0xcd,0x3f,0x33,0xcc,0xcd,0x32,\r\n0x32,0x12,0x39,0x2f,0x3f,0x33,0x01,0x2f,0x33,0x33,0xe9,0x32,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x21,0x35,0x01,0x33,0x11,0x21,0x15,0x21,0x27,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x01,0x05,0x03,0x23,\r\n0x13,0x03,0x50,0xae,0xa5,0x29,0x57,0x29,0x2b,0x51,0x2a,0x5a,0x58,0xfd,0x75,0x02,0x85,0xaa,0x01,0x05,0xfe,0xfb,0xa4,0x02,0x05,0x03,0x03,0x0a,0x06,0x14,0xfe,0x46,0x03,0xa3,0xa6,0x7b,0x75,0x3f,0xca,0xd9,0x0c,0x14,0x99,0x1b,0x12,0x7e,0x9b,0x3d,0x6f,0x03,0x91,0xfc,0x84,0x84,0x84,0x02,0x54,0x1e,0x32,0x15,0x07,0x14,0x0a,0x22,\r\n0xfd,0x8e,0xdc,0xfe,0xfc,0x01,0x04,0x00,0x00,0x01,0x00,0xb0,0x00,0x00,0x03,0x0b,0x04,0x33,0x00,0x09,0x00,0x26,0x40,0x12,0x03,0x00,0x00,0x0b,0x02,0x05,0x84,0x07,0x05,0x95,0x02,0x02,0x07,0x01,0x95,0x08,0x07,0x15,0x00,0x3f,0xdd,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0xc6,0x31,0x30,0x01,0x21,0x11,0x21,\r\n0x15,0x21,0x11,0x23,0x11,0x21,0x03,0x0b,0xfe,0x49,0x01,0x95,0xfe,0x6b,0xa4,0x02,0x5b,0x03,0xa8,0xfe,0xb1,0x8a,0xfe,0x31,0x04,0x33,0x00,0x01,0x00,0x68,0xff,0xed,0x03,0x08,0x04,0x45,0x00,0x21,0x00,0x34,0x40,0x1b,0x1b,0x84,0x06,0x11,0x06,0x11,0x21,0x23,0x16,0x84,0x0b,0x21,0x11,0x13,0x95,0x16,0x0b,0x1b,0x06,0x04,0x0e,0x1e,\r\n0x00,0x03,0x95,0x1e,0x16,0x00,0x3f,0xfd,0xc6,0x10,0xd4,0x17,0x39,0xfd,0xc6,0x01,0x2f,0xd4,0xe9,0x11,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x24,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x04,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x6b,0x33,\r\n0xa3,0x4a,0x73,0x68,0x71,0xfe,0xef,0x7c,0xd7,0xa8,0xa0,0x4a,0x5f,0x93,0x61,0x75,0x77,0x01,0x01,0x87,0xd7,0xb9,0x43,0xa8,0x22,0xd7,0x29,0x38,0x54,0x44,0x46,0x57,0x87,0x91,0x69,0x7e,0x9b,0x26,0xa5,0x42,0x4e,0x3e,0x4d,0x59,0x7b,0x8d,0x67,0x88,0xa6,0x28,0x16,0x00,0x00,0x03,0x00,0x16,0x00,0x00,0x08,0xf1,0x05,0x9a,0x00,0x17,\r\n0x00,0x21,0x00,0x2b,0x00,0x3f,0x40,0x1f,0x17,0x0c,0x1c,0x03,0x05,0x26,0x13,0x00,0x00,0x05,0x13,0x13,0x2d,0x05,0x26,0x1c,0x16,0x03,0x91,0x2b,0x21,0x21,0x04,0x1c,0x11,0x06,0x03,0x14,0x01,0x04,0x12,0x00,0x3f,0x33,0x33,0x3f,0x33,0xcd,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x33,0x01,0x2f,0x11,0x33,0x2f,0x12,0x39,0x2f,0x12,0x39,\r\n0x12,0x17,0x39,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x01,0x17,0x16,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x05,0x12,0xba,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x01,0x6f,0x16,0x06,\r\n0x0b,0x02,0x04,0x15,0x09,0x01,0x77,0xae,0x02,0x28,0xba,0x98,0xfd,0xa0,0x60,0xfe,0xaa,0xe1,0x06,0x0e,0x02,0x04,0x02,0x0d,0x08,0xdf,0x05,0xd0,0xe1,0x06,0x0e,0x02,0x04,0x02,0x0d,0x08,0xdf,0x01,0x92,0xfe,0x6e,0x05,0x9a,0xfc,0x47,0x3b,0x12,0x23,0x0d,0x0d,0x40,0x16,0x03,0xd3,0xfa,0x66,0x01,0x92,0xfe,0xf2,0x01,0xa5,0x02,0x63,\r\n0x10,0x3a,0x16,0x14,0x36,0x15,0xfd,0x9c,0x02,0x63,0x10,0x3a,0x16,0x14,0x36,0x15,0xfd,0x9c,0x00,0x03,0x00,0x5a,0xff,0xe8,0x05,0xfc,0x04,0x18,0x00,0x2d,0x00,0x38,0x00,0x43,0x00,0x5d,0x40,0x30,0x09,0x09,0x00,0x32,0xef,0x39,0x23,0x19,0x39,0x2e,0x11,0x84,0x12,0x04,0x12,0x39,0x12,0x39,0x12,0x45,0x3d,0x83,0x27,0x20,0x09,0x27,\r\n0x27,0x06,0x25,0x95,0x2a,0x2e,0x39,0x96,0x04,0x23,0x23,0x0d,0x2a,0x0f,0x35,0x40,0x95,0x16,0x1d,0x16,0x12,0x15,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0x33,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x32,0x11,0x33,0x01,0x2f,0xc4,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x33,0x11,0x33,0x33,0x10,0xf9,0x32,0xc0,0x2f,0x31,\r\n0x30,0x01,0x36,0x36,0x37,0x25,0x10,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x15,0x05,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x25,0x07,0x06,0x06,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x35,0x03,0x7b,0x1f,0x5b,0x30,0x01,0x33,0xcd,0x3f,0x8f,0x1f,0x3d,0x87,0x52,0x9f,0xa9,0xa4,0x04,0x6a,0xd1,0x78,0x91,0x26,0x04,0x32,0xa9,0x6b,0x94,0xb2,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x97,0xc5,0xb9,0xa8,0x01,0xdd,0xf7,0x82,0x64,0x73,0x51,0x78,0xa1,0xfd,0x87,0xf7,0x82,0x64,0x6d,0x57,0x7a,0x9f,0x02,\r\n0x2d,0x12,0x18,0x07,0x2b,0x01,0x05,0x49,0x35,0x9e,0x39,0x31,0xbe,0xc0,0xfd,0x66,0xa0,0xb8,0x5b,0x61,0x5a,0x62,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xc3,0xbb,0x94,0x22,0x12,0x5f,0x57,0x4d,0x5d,0xae,0x80,0x66,0x22,0x12,0x5f,0x57,0x50,0x5a,0xae,0x80,0x00,0x00,0x03,0x00,0x16,0xff,0xe8,0x08,0xdb,0x05,0xb2,\r\n0x00,0x15,0x00,0x21,0x00,0x2b,0x00,0x3b,0x40,0x1f,0x0d,0x7d,0x26,0x06,0x1b,0x1b,0x00,0x2d,0x21,0x7f,0x07,0x00,0x14,0x91,0x06,0x2b,0x2b,0x01,0x15,0x12,0x18,0x91,0x10,0x13,0x1e,0x91,0x0a,0x04,0x26,0x01,0x03,0x00,0x3f,0xcd,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0xed,0x01,0x2f,0x2f,0xe9,0x11,0x12,0x39,0x2f,0x39,0x39,\r\n0xe9,0x31,0x30,0x33,0x01,0x33,0x13,0x16,0x17,0x17,0x33,0x36,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x24,0x27,0x21,0x03,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x07,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x9f,0x0b,0x08,0x0c,0x04,0x21,0x01,0x60,0x01,0x1a,0x01,0x28,0x01,\r\n0x6c,0xfe,0x8c,0xfe,0xc8,0xeb,0xfe,0xbd,0x42,0xfd,0xa1,0x8f,0x03,0x6e,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xb6,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfe,0x62,0x1d,0x19,0x2c,0xdf,0x01,0x39,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0xed,0xbd,0xfe,0x6e,0x01,0xc1,0xfe,0xbe,0x01,0x34,\r\n0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0xa2,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0xb6,0x04,0x18,0x00,0x20,0x00,0x2c,0x00,0x37,0x00,0x52,0x40,0x2c,0x00,0x14,0x2c,0x84,0x30,0x0a,0x30,0x1b,0x83,0x26,0x30,0x26,0x30,0x26,0x39,0x34,0x83,0x0e,0x07,0x23,0x95,0x1e,\r\n0x16,0x29,0x95,0x18,0x10,0x0e,0x0c,0x95,0x11,0x30,0x96,0x14,0x11,0x00,0x0a,0x0a,0x11,0x10,0x37,0x95,0x04,0x16,0x00,0x3f,0xed,0x3f,0x39,0x2f,0x39,0x12,0x39,0xed,0x10,0xed,0x32,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xc4,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,0x39,0x39,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,\r\n0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x12,0x15,0x14,0x00,0x23,0x22,0x26,0x36,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x03,0x27,0x02,0x45,0xc8,0x78,0x92,0xb4,0x01,0x52,0x01,0x33,0xd3,0xba,\r\n0x94,0x97,0xc5,0x8d,0x98,0x18,0x04,0x44,0xd3,0x6a,0xe0,0xfa,0xfe,0xf2,0xe4,0x83,0xe0,0x22,0xb4,0x99,0x9c,0xa2,0xa2,0x9c,0x9c,0xb1,0xfe,0xc2,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xcd,0x73,0x72,0xa2,0x86,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0x64,0x4b,0x61,0x4e,0xfe,0xe4,0xf8,0xf3,0xfe,0xd7,0x75,0xed,0xd8,0xcf,0xbd,0xbe,\r\n0xd2,0xe1,0xa1,0xfe,0x66,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x16,0xff,0xe8,0x07,0x3a,0x05,0x9a,0x00,0x13,0x00,0x1d,0x00,0x30,0x40,0x18,0x02,0x7e,0x18,0x08,0x0c,0x01,0x01,0x1f,0x0c,0x0a,0x91,0x1d,0x1d,0x0b,0x18,0x01,0x0d,0x03,0x0b,0x12,0x12,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x3f,0x33,0xcd,0x12,\r\n0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x2f,0x12,0x39,0x39,0xe9,0x31,0x30,0x01,0x11,0x33,0x11,0x10,0x21,0x22,0x26,0x27,0x03,0x21,0x03,0x23,0x01,0x33,0x01,0x16,0x16,0x33,0x20,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x06,0x92,0xa8,0xfd,0xdf,0x34,0x59,0x34,0x98,0xfd,0xa0,0x8f,0xbb,0x02,0x26,0xae,0x01,0xf5,0x12,0x29,\r\n0x11,0x01,0x67,0xfc,0xf7,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x02,0x29,0x03,0x71,0xfc,0xaa,0xfd,0xa4,0x0a,0x0e,0x01,0x92,0xfe,0x6e,0x05,0x9a,0xfa,0xea,0x03,0x02,0x01,0xaa,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xff,0xe8,0x06,0x1e,0x04,0x18,0x00,0x26,0x00,0x31,0x00,0x50,0x40,0x2b,\r\n0x1d,0x84,0x2a,0x12,0x08,0x2a,0x02,0x00,0x84,0x24,0x2a,0x24,0x2a,0x24,0x33,0x2e,0x83,0x18,0x0f,0x25,0x0f,0x18,0x16,0x95,0x1b,0x2a,0x96,0x12,0x12,0x1b,0x0f,0x08,0x31,0x95,0x0c,0x16,0x02,0x21,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x39,0x2f,0xed,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc4,0xe1,0x12,\r\n0x39,0x39,0x2f,0x2f,0x10,0xe9,0x33,0x11,0x33,0x33,0x10,0xe9,0x31,0x30,0x21,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,\r\n0x06,0x1e,0x9f,0x04,0x63,0xd0,0x75,0x98,0x2f,0x03,0x3f,0xc0,0x6a,0x99,0xad,0x01,0x52,0x01,0x33,0x6b,0x68,0xba,0x94,0x97,0xc5,0x01,0x69,0x7b,0x74,0x74,0x94,0xa4,0xfc,0x27,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xa2,0xba,0x57,0x65,0x5d,0x5f,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x11,0x75,0x7f,0x7e,0xa8,0x60,0xfe,0x82,0xf4,0x92,0xa2,0xb2,\r\n0x8e,0x02,0x4e,0xfc,0x72,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x16,0x00,0x00,0x07,0x24,0x05,0x9a,0x00,0x10,0x00,0x1a,0x00,0x32,0x40,0x18,0x15,0x05,0x00,0x0a,0x0b,0x0b,0x1c,0x0c,0x06,0x00,0x0f,0x91,0x1a,0x1a,0x01,0x10,0x05,0x0d,0x12,0x0a,0x03,0x15,0x01,0x03,0x00,0x3f,0xcd,0x3f,0x3f,0x33,0x33,0x12,\r\n0x39,0x2f,0xed,0x01,0x2f,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x39,0x31,0x30,0x33,0x01,0x33,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x01,0xb5,0x14,0x0b,0x04,0x10,0x08,0x01,0x95,0xb5,0xfd,0xed,0xb9,0x98,0xfd,0xa0,0x8f,\r\n0x02,0xb8,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfb,0x8f,0x36,0x49,0x18,0x51,0x16,0x04,0x71,0xfa,0x66,0x01,0x92,0xfe,0x6e,0x02,0x29,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xff,0xe8,0x05,0x3a,0x04,0x18,0x00,0x1b,0x00,0x26,0x00,0x45,0x40,0x24,0x0c,0x04,0x84,0x17,0x0e,0x1f,\r\n0x1f,0x14,0x0a,0x0b,0x0b,0x28,0x23,0x83,0x1b,0x14,0x1f,0x96,0x05,0x17,0x17,0x02,0x0e,0x26,0x95,0x11,0x16,0x0c,0x15,0x0a,0x0f,0x1b,0x19,0x95,0x02,0x10,0x00,0x3f,0xed,0x32,0x3f,0x3f,0x3f,0xed,0x32,0x11,0x39,0x2f,0x39,0xed,0x01,0x2f,0xc4,0xe9,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0xe9,0x32,0x31,0x30,0x13,0x36,0x33,\r\n0x20,0x11,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x00,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0xbe,0x97,0xc5,0x01,0x69,0x04,0x03,0x16,0x11,0xdc,0xad,0xfe,0x4a,0xa5,0x04,0x6a,0xd1,0x99,0xad,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x01,0x87,\r\n0x9a,0xf7,0x8f,0x57,0x6e,0x56,0x03,0xb8,0x60,0xfe,0x82,0xfe,0x87,0x24,0x51,0x2a,0x02,0x40,0xfc,0x00,0xa0,0xb8,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xfd,0x62,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x03,0x00,0x16,0x00,0x00,0x07,0x24,0x05,0x9a,0x00,0x0f,0x00,0x19,0x00,0x22,0x00,0x3b,0x40,0x1c,0x00,0x1d,\r\n0x10,0x1d,0x05,0x0d,0x0a,0x0b,0x0b,0x24,0x05,0x22,0x0f,0x03,0x91,0x0c,0x08,0x1c,0x14,0x14,0x04,0x10,0x0a,0x06,0x03,0x01,0x04,0x12,0x00,0x3f,0x33,0x3f,0x33,0xcd,0x12,0x39,0x2f,0x39,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0x11,0x33,0x2f,0x33,0xc6,0x12,0x39,0x39,0x11,0x33,0x31,0x30,0x21,0x23,0x03,0x21,0x03,0x23,0x01,0x33,0x01,\r\n0x21,0x13,0x33,0x03,0x33,0x15,0x21,0x01,0x06,0x06,0x07,0x03,0x21,0x03,0x26,0x26,0x27,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x13,0x21,0x05,0x11,0xb9,0xe5,0xfe,0x3a,0xdc,0xbb,0x02,0x26,0xae,0x01,0x02,0x01,0x94,0xef,0xb5,0xf9,0xcd,0xfe,0xfb,0xfc,0x9b,0x05,0x0b,0x07,0x93,0x01,0x57,0x93,0x05,0x0c,0x05,0x02,0x0d,0x14,0x0b,0x04,\r\n0x10,0x08,0x70,0xfe,0xdc,0x02,0x64,0xfd,0x9c,0x05,0x9a,0xfd,0x61,0x02,0x9f,0xfd,0x61,0x97,0x02,0x88,0x1f,0x30,0x11,0xfe,0x6f,0x01,0x91,0x0f,0x30,0x21,0xfc,0x3d,0x36,0x49,0x18,0x51,0x16,0x01,0x3b,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x05,0x3a,0x04,0x18,0x00,0x1d,0x00,0x24,0x00,0x2f,0x00,0x4d,0x40,0x28,0x1a,0x17,0x18,0x18,\r\n0x31,0x1d,0x15,0x1f,0x84,0x0a,0x01,0x2f,0x28,0x83,0x0f,0x07,0x17,0x0f,0x0f,0x0d,0x95,0x12,0x1f,0x1c,0x2f,0x96,0x19,0x15,0x20,0x0a,0x0a,0x12,0x10,0x01,0x2b,0x95,0x04,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x39,0x2f,0x39,0x33,0x33,0xed,0x32,0x32,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc4,0xe9,0x2f,0x33,0x33,0xe9,0x32,0x32,\r\n0x11,0x33,0x2f,0x33,0xc6,0x31,0x30,0x21,0x35,0x23,0x06,0x23,0x22,0x26,0x35,0x34,0x24,0x21,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x11,0x15,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x03,0x13,0x23,0x15,0x33,0x36,0x36,0x37,0x27,0x20,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x02,0xdf,0x04,0x6a,0xd1,0x99,0xad,0x01,0x29,\r\n0x01,0x5c,0x69,0x6a,0xba,0x94,0x97,0xc5,0x01,0x69,0x7e,0x8c,0xad,0x9f,0x77,0xaf,0xdf,0x4b,0x4c,0x04,0x05,0x20,0x11,0xf3,0xfe,0xf6,0xbe,0x6e,0x56,0x7f,0x9a,0xa0,0xb8,0xa1,0x87,0xbe,0xbf,0x83,0x7e,0x7e,0xa8,0x60,0xfe,0x82,0x0d,0x01,0x73,0xfe,0x8d,0x83,0xfd,0xf6,0x02,0x0a,0xf1,0x2e,0x64,0x2e,0x31,0x76,0x78,0x4b,0x5f,0xa9,\r\n0x8f,0x60,0x00,0x02,0x00,0x16,0xfe,0x1e,0x07,0x24,0x05,0x9a,0x00,0x1c,0x00,0x26,0x00,0x42,0x40,0x22,0x21,0x00,0x0c,0x05,0x19,0x03,0x0b,0x13,0x13,0x00,0x0a,0x0b,0x0b,0x28,0x00,0x1b,0x91,0x05,0x1c,0x26,0x26,0x01,0x19,0x1c,0x12,0x15,0x91,0x0f,0x1c,0x0a,0x03,0x21,0x01,0x03,0x00,0x3f,0xcd,0x3f,0x3f,0xed,0x3f,0x33,0x12,0x39,\r\n0x2f,0x12,0x39,0xed,0x01,0x2f,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x17,0x39,0x12,0x39,0x31,0x30,0x33,0x01,0x33,0x01,0x16,0x17,0x33,0x34,0x36,0x37,0x01,0x33,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x03,0x21,0x03,0x01,0x03,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x16,0x02,0x26,0xae,0x01,\r\n0xb5,0x14,0x0b,0x04,0x10,0x08,0x01,0x95,0xb5,0xfd,0xe5,0x5f,0xb6,0x8c,0x1e,0x30,0x1d,0x31,0x30,0x3a,0x60,0x22,0x48,0xa2,0xfd,0xa0,0x8f,0x02,0xb8,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfb,0x8f,0x36,0x49,0x18,0x51,0x16,0x04,0x71,0xfa,0x53,0xfd,0xd2,0x05,0x08,0x9d,0x12,0x56,0x50,0xa4,0x01,0x92,0xfe,0x6e,\r\n0x02,0x29,0x02,0x63,0x0f,0x30,0x21,0x1f,0x30,0x11,0xfd,0x9d,0x00,0x02,0x00,0x5a,0xfe,0x1e,0x05,0x3a,0x04,0x18,0x00,0x25,0x00,0x30,0x00,0x56,0x40,0x2d,0x28,0x13,0x84,0x25,0x0a,0x1b,0x25,0x1a,0x20,0x25,0x20,0x25,0x07,0x19,0x1a,0x1a,0x32,0x2d,0x83,0x07,0x0e,0x0e,0x07,0x22,0x95,0x1d,0x1c,0x19,0x0f,0x0e,0x0c,0x95,0x11,0x29,\r\n0x96,0x14,0x0a,0x0a,0x11,0x10,0x00,0x30,0x95,0x04,0x16,0x00,0x3f,0xed,0x32,0x3f,0x39,0x2f,0x39,0xed,0x10,0xed,0x32,0x3f,0x3f,0xed,0x01,0x2f,0x33,0x2f,0x10,0xe9,0x11,0x33,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x32,0x10,0xe9,0x33,0x31,0x30,0x25,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x10,0x25,0x25,0x10,0x23,0x22,\r\n0x07,0x35,0x36,0x33,0x20,0x11,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x26,0x36,0x35,0x35,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x02,0xe4,0x04,0x36,0xa1,0x69,0x99,0xad,0x01,0x52,0x01,0x33,0xd3,0xba,0x94,0x97,0xc5,0x01,0x69,0x04,0x03,0x18,0x10,0xdb,0xad,0xfe,0x0a,0x7e,0xe4,\r\n0x41,0x2a,0x34,0x2d,0x7f,0x3d,0x50,0x9f,0x9a,0xf7,0x8f,0x57,0x6e,0x56,0xa8,0x5d,0x63,0xa1,0x87,0x01,0x1f,0x2f,0x2b,0x01,0x05,0x7e,0xa8,0x60,0xfe,0x82,0xfe,0x8c,0x24,0x51,0x2a,0x02,0x3b,0xfb,0x5c,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x70,0xa9,0x8f,0x5c,0x22,0x15,0x5e,0x55,0x4b,0x5f,0x00,0x02,0x00,0x68,0xff,0xe8,0x04,0x96,\r\n0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x37,0x40,0x1c,0x1b,0xc0,0x21,0x10,0x7d,0x05,0x21,0x05,0x21,0x05,0x23,0x0a,0x15,0x1e,0xc1,0x18,0x18,0x0d,0x00,0x02,0x91,0x13,0x13,0x0a,0x08,0x91,0x0d,0x04,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,\r\n0x16,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x27,0x00,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x68,0x9d,0xd9,0xea,0x01,0x1e,0xfe,0xcc,0xf6,0xb9,0x9b,0x87,0xcb,0x01,0x3e,0x01,0x9e,0xfe,0x8f,0xfe,0xcf,0xed,0x9f,0x01,0x27,0x3a,0x29,0x2a,0x38,0x38,0x2a,\r\n0x29,0x3a,0xdf,0x60,0x01,0x38,0x01,0x05,0x01,0x14,0x01,0x4a,0x56,0xb3,0x3b,0xfe,0x58,0xfe,0xa8,0xfe,0xbf,0xfe,0x77,0x54,0x02,0xc2,0x37,0x36,0x2a,0x2a,0x39,0x3b,0x28,0x00,0x00,0x02,0x00,0x50,0xff,0xe8,0x03,0x52,0x04,0x18,0x00,0x15,0x00,0x21,0x00,0x37,0x40,0x1c,0x1b,0xc0,0x21,0x10,0x83,0x05,0x21,0x05,0x21,0x05,0x23,0x0a,\r\n0x15,0x1e,0xc1,0x18,0x18,0x0d,0x00,0x02,0x95,0x13,0x16,0x0a,0x08,0x95,0x0d,0x10,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x11,0x39,0x2f,0xed,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x27,0x12,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x52,0x77,0x85,0x9e,0xbe,0xca,0x9c,0x81,0x73,0x69,0x85,0xf1,0x01,0x23,0xfe,0xf3,0xdb,0xa1,0x77,0xa1,0x3a,0x29,0x2a,0x38,0x38,0x2a,0x29,0x3a,0xcb,0x59,0xd0,0xb4,0xb6,0xe2,0x50,0xa8,0x32,0xfe,0xcd,0xfd,0xe4,0xfe,0xe4,0x47,0x01,0xfd,0x37,0x36,0x2a,0x2a,0x39,0x3b,0x28,\r\n0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x46,0x40,0x23,0x17,0x18,0x00,0x19,0x10,0x10,0x07,0x01,0x00,0x00,0x1b,0x12,0x0e,0x06,0x7e,0x0b,0x09,0x07,0x11,0x09,0x92,0x0e,0x04,0x19,0x12,0x03,0x0a,0x0a,0x07,0x17,0x0c,0x03,0x01,0x07,0x12,0x00,0x3f,0x33,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0x33,0xed,0x32,\r\n0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x39,0x10,0xc6,0x32,0x31,0x30,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x04,0xa2,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x07,0x13,0x0c,\r\n0x02,0x18,0xd1,0xfd,0x99,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x43,0x40,0x22,0x09,0x09,0x0d,0x0e,0x11,0x0e,0x10,0x10,0x16,0x0f,0x0b,0x07,0x14,0x84,0x04,0x02,0x00,0x0d,0x0f,0x0a,0x02,0x96,\r\n0x07,0x12,0x0f,0x0b,0x03,0x03,0x03,0x05,0x00,0x11,0x00,0x15,0x00,0x3f,0x32,0x3f,0x39,0x2f,0x17,0x39,0x33,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x32,0x11,0x33,0x11,0x33,0x33,0x2f,0x33,0x39,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x01,0x23,0x01,0x23,0x11,\r\n0xa6,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x02,0x00,0xe6,0xfe,0x3c,0x04,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,0xfe,0x12,0xfd,0xee,0x01,0xec,0xfe,0x14,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x41,0x40,0x21,0x0a,0x0c,0x13,0x0c,0x13,0x0c,0x08,0x09,0x09,0x10,\r\n0x0f,0x0f,0x1b,0x03,0x19,0x7e,0x00,0x13,0x12,0x0d,0x0c,0x0c,0x03,0x0a,0x17,0x12,0x05,0x08,0x01,0x03,0x10,0x00,0x12,0x00,0x3f,0x32,0x3f,0x33,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xe1,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,\r\n0x17,0x01,0x15,0x07,0x01,0x23,0x01,0x07,0x35,0x37,0x27,0x26,0x27,0x23,0x11,0xbc,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xa5,0x01,0x08,0xa8,0x01,0x8d,0xea,0xfe,0xec,0xcc,0x6e,0xb8,0x1e,0x08,0x04,0x05,0x9a,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0xbc,0x01,0x21,0xd5,0xb8,0xfe,0x3e,0x01,0x46,0xe1,0xd7,0x79,\r\n0xdb,0x24,0x0e,0xfd,0x3e,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x40,0x40,0x21,0x02,0x13,0x84,0x14,0x0e,0x08,0x0e,0x08,0x05,0x14,0x04,0x05,0x05,0x0c,0x0b,0x0f,0x0e,0x09,0x08,0x08,0x02,0x06,0x11,0x0e,0x05,0x04,0x0c,0x14,0x15,0x04,0x0f,0x00,0x00,0x00,0x3f,0x3f,0x3f,0x33,0x12,0x17,0x39,0x11,\r\n0x33,0x11,0x33,0x01,0x2f,0x33,0x33,0x2f,0x33,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x32,0x31,0x30,0x13,0x33,0x11,0x33,0x01,0x33,0x01,0x17,0x37,0x15,0x07,0x01,0x23,0x27,0x07,0x35,0x37,0x27,0x23,0x11,0x23,0xa6,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x67,0xe6,0x88,0x01,0x3b,0xe6,0xc4,0x99,0x3e,0xa5,0x04,0xa4,0x05,0xec,0xfc,\r\n0x3f,0x01,0xd5,0xfe,0x12,0x6b,0xee,0xc2,0x8d,0xfe,0xba,0xd4,0x9e,0xc2,0x40,0xb4,0xfe,0x14,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x21,0x00,0x54,0x40,0x2b,0x12,0x14,0x1b,0x14,0x1b,0x14,0x10,0x11,0x11,0x18,0x17,0x17,0x23,0x0b,0x07,0x21,0x7e,0x04,0x02,0x00,0x0a,0x02,0x92,0x07,0x03,0x15,0x14,0x1b,0x1a,0x1a,\r\n0x1f,0x12,0x0b,0x14,0x05,0x03,0x03,0x10,0x05,0x03,0x18,0x00,0x12,0x00,0x3f,0x32,0x3f,0x33,0x39,0x2f,0x17,0x39,0x11,0x33,0x11,0x33,0x11,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,\r\n0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x17,0x01,0x15,0x07,0x01,0x23,0x01,0x07,0x35,0x37,0x27,0x26,0x27,0x23,0x11,0xbc,0xaa,0xaa,0xa8,0xe8,0xe8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xa5,0x01,0x08,0xa8,0x01,0x8d,0xea,0xfe,0xec,0xcc,0x6e,0xb8,0x1e,0x08,0x04,0x04,0x9c,0x85,0x79,0x79,0x85,0xfe,0x5c,0x0b,0x18,0x0e,0x02,\r\n0x71,0xfd,0x50,0xbc,0x01,0x21,0xd5,0xb8,0xfe,0x3e,0x01,0x46,0xe1,0xd7,0x79,0xdb,0x24,0x0e,0xfd,0x3e,0x00,0x01,0x00,0x27,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x1c,0x00,0x59,0x40,0x2e,0x0d,0x0f,0x16,0x0f,0x16,0x0f,0x0b,0x0c,0x0c,0x13,0x12,0x12,0x1e,0x09,0x05,0x1a,0x84,0x02,0x00,0x1b,0x10,0x0f,0x16,0x15,0x15,0x18,0x0d,0x09,\r\n0x0f,0x05,0x0b,0x1b,0x08,0x00,0x96,0x05,0x01,0x01,0x03,0x13,0x1b,0x15,0x0b,0x0f,0x03,0x00,0x00,0x3f,0x3f,0x3f,0x33,0x12,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0x01,0x2f,0xc6,0x33,0xe1,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x35,0x33,0x35,0x33,\r\n0x15,0x21,0x15,0x21,0x11,0x33,0x01,0x33,0x01,0x17,0x37,0x15,0x07,0x01,0x23,0x27,0x07,0x35,0x37,0x27,0x23,0x11,0x23,0x11,0x27,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x01,0xae,0xd7,0xfe,0x25,0x67,0xe6,0x88,0x01,0x3b,0xe6,0xc4,0x99,0x3e,0xa5,0x04,0xa4,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfd,0x79,0x01,0xd5,0xfe,0x12,0x6b,0xee,0xc2,\r\n0x8d,0xfe,0xba,0xd4,0x9e,0xc2,0x40,0xb4,0xfe,0x14,0x04,0xb2,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0x3b,0x05,0x9a,0x00,0x09,0x00,0x2a,0x40,0x16,0x01,0x7e,0x04,0x02,0x04,0x02,0x0b,0x08,0x7e,0x06,0x06,0x05,0x09,0x00,0x04,0x04,0x07,0x03,0x01,0x91,0x04,0x12,0x00,0x3f,0xed,0x3f,0x12,0x17,0x39,0x01,0x2f,0xe1,0x12,0x39,0x39,0x2f,\r\n0x2f,0xe1,0x31,0x30,0x01,0x11,0x21,0x15,0x21,0x11,0x07,0x11,0x33,0x11,0x01,0xfc,0x02,0x3f,0xfd,0x18,0x97,0xa9,0x03,0x18,0xfd,0x80,0x98,0x02,0xa8,0x2f,0x03,0x21,0xfd,0x4d,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0xdc,0x05,0xed,0x00,0x07,0x00,0x2b,0x40,0x16,0x06,0x84,0x04,0x00,0x84,0x02,0x04,0x02,0x04,0x02,0x08,0x09,0x04,0x03,\r\n0x07,0x00,0x04,0x02,0x05,0x00,0x02,0x15,0x00,0x3f,0x3f,0x12,0x17,0x39,0x11,0x12,0x01,0x39,0x39,0x2f,0x2f,0x10,0xe1,0x10,0xe1,0x31,0x30,0x01,0x11,0x23,0x11,0x07,0x11,0x33,0x11,0x01,0xdc,0xa4,0x92,0xa4,0x03,0x43,0xfc,0xbd,0x02,0xd5,0x2e,0x03,0x46,0xfd,0x26,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x03,0xa4,0x05,0x9a,0x00,0x0d,\r\n0x00,0x2d,0x40,0x16,0x09,0x0c,0x09,0x0c,0x0f,0x0b,0x7e,0x02,0x00,0x0a,0x02,0x92,0x07,0x03,0x03,0x00,0x05,0x03,0x0b,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0xe1,0x12,0x39,0x39,0x2f,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x21,0x15,0xbc,0xaa,0xaa,\r\n0xa8,0xe8,0xe8,0x02,0x40,0x04,0x9c,0x85,0x79,0x79,0x85,0xfb,0xfc,0x98,0x00,0x01,0x00,0x1e,0x00,0x00,0x01,0xd2,0x05,0xec,0x00,0x0b,0x00,0x2c,0x40,0x15,0x09,0x09,0x07,0x0a,0x84,0x04,0x02,0x00,0x00,0x0c,0x0d,0x0a,0x02,0x96,0x07,0x03,0x03,0x05,0x00,0x00,0x15,0x00,0x3f,0x3f,0x39,0x2f,0x33,0xed,0x32,0x11,0x12,0x01,0x39,0x2f,\r\n0xc6,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0xa6,0x88,0x88,0xa4,0x88,0x88,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfb,0x4e,0x00,0x03,0x00,0x00,0xff,0xe8,0x06,0x08,0x05,0xb2,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x3f,0x40,0x20,0x0a,0x0a,0x08,0x0b,0x7d,0x12,0x1f,0x1f,0x21,0x18,\r\n0x19,0x7d,0x02,0x00,0x11,0x19,0x0b,0x11,0x91,0x18,0x08,0x02,0x02,0x05,0x1c,0x91,0x0e,0x13,0x15,0x91,0x05,0x04,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x33,0xe1,0x32,0x12,0x39,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x11,0x35,0x33,0x12,0x00,0x21,0x20,0x00,0x13,0x33,0x15,0x23,0x02,\r\n0x00,0x21,0x20,0x00,0x03,0x25,0x26,0x02,0x23,0x22,0x00,0x07,0x15,0x16,0x00,0x33,0x32,0x00,0x37,0x61,0x14,0x01,0x7a,0x01,0x27,0x01,0x1e,0x01,0x5d,0x17,0x60,0x62,0x16,0xfe,0x91,0xfe,0xdd,0xfe,0xdc,0xfe,0x9a,0x14,0x04,0x97,0x15,0xfe,0xda,0xd3,0xfe,0xee,0x14,0x14,0x01,0x0f,0xca,0xdf,0x01,0x05,0x15,0x02,0x7e,0x9b,0x01,0x2c,\r\n0x01,0x6d,0xfe,0x9e,0xfe,0xc9,0x9b,0xfe,0xd0,0xfe,0x9a,0x01,0x69,0x01,0x2d,0x9b,0xf9,0x01,0x08,0xfe,0xea,0xeb,0x9b,0xe6,0xfe,0xe7,0x01,0x09,0xf6,0x00,0x00,0x03,0x00,0x00,0xff,0xe8,0x04,0xb0,0x04,0x18,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x3b,0x40,0x1e,0x08,0x08,0x07,0x0a,0x83,0x19,0x18,0x1f,0x12,0x83,0x01,0x00,0x10,0x12,\r\n0x0a,0x11,0x95,0x1f,0x07,0x00,0x00,0x04,0x15,0x95,0x0d,0x16,0x1c,0x95,0x04,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0x33,0xed,0x32,0x32,0x01,0x2f,0xcd,0x33,0xe1,0x32,0x2f,0x33,0xf1,0x32,0xc1,0x2f,0x31,0x30,0x11,0x33,0x36,0x24,0x33,0x32,0x16,0x17,0x33,0x15,0x23,0x06,0x00,0x23,0x22,0x00,0x27,0x23,0x21,0x16,0x16,\r\n0x33,0x32,0x36,0x37,0x27,0x26,0x26,0x23,0x22,0x06,0x07,0x66,0x1e,0x01,0x10,0xd6,0xce,0xfd,0x16,0x65,0x62,0x10,0xfe,0xf2,0xde,0xdc,0xfe,0xf9,0x0e,0x61,0x01,0x0a,0x0c,0xb1,0x97,0x96,0xa5,0x0d,0x04,0x15,0xa3,0x8c,0x87,0xb0,0x19,0x02,0x5b,0xd0,0xed,0xec,0xd1,0x8b,0xe1,0xfe,0xf9,0x01,0x04,0xe4,0xa4,0xba,0xb2,0xac,0x8c,0x95,\r\n0x9d,0xa0,0x92,0x00,0x00,0x03,0x00,0x5e,0xff,0xe8,0x06,0xcb,0x05,0xb2,0x00,0x15,0x00,0x21,0x00,0x2c,0x00,0x44,0x40,0x25,0x00,0x2b,0x22,0x03,0x11,0x0b,0x7d,0x1b,0x06,0x7f,0x25,0x1b,0x25,0x1b,0x25,0x2e,0x21,0x7d,0x11,0x1e,0x91,0x14,0x04,0x22,0x92,0x09,0x09,0x03,0x18,0x91,0x0e,0x13,0x00,0x28,0x92,0x03,0x04,0x00,0x3f,0xed,\r\n0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x11,0x17,0x39,0x31,0x30,0x01,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x17,0x15,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x15,0x25,0x36,0x36,0x35,\r\n0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x04,0xda,0x26,0x7c,0x55,0x73,0x87,0xa0,0x83,0x02,0xfe,0x8e,0xfe,0xc6,0xfe,0xd0,0xfe,0x90,0x01,0x78,0x01,0x40,0x01,0x14,0xfc,0xe4,0x01,0x11,0xdf,0xef,0x01,0x0d,0xfe,0xfd,0xed,0xe8,0xfe,0xec,0x04,0x89,0x47,0x59,0x39,0x37,0x31,0x4e,0x19,0x4c,0x05,0x04,0x52,0x5c,0x9d,0x84,0x95,0xcd,0x11,\r\n0x1f,0x20,0xfe,0xa8,0xfe,0x61,0x01,0x97,0x01,0x3d,0x01,0x59,0x01,0x9d,0xfc,0x1a,0xfe,0xb3,0x01,0x40,0x01,0x09,0x01,0x17,0x01,0x3b,0xfe,0xac,0xfb,0xd3,0x13,0x7e,0x57,0x4f,0x56,0x4a,0x42,0x71,0x00,0x03,0x00,0x60,0xff,0xe8,0x05,0x4b,0x04,0x18,0x00,0x13,0x00,0x1f,0x00,0x2a,0x00,0x45,0xb7,0x20,0x29,0x04,0x03,0x0d,0x84,0x19,\r\n0x0a,0xb8,0x01,0x03,0x40,0x1b,0x23,0x19,0x23,0x19,0x23,0x2c,0x1f,0x83,0x13,0x20,0x96,0x0d,0x0d,0x07,0x16,0x95,0x10,0x16,0x04,0x26,0x96,0x07,0x0f,0x1c,0x95,0x02,0x10,0x00,0x3f,0xed,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x17,0x39,0x31,0x30,0x12,0x00,0x33,\r\n0x32,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x06,0x00,0x23,0x22,0x00,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x25,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x60,0x01,0x1b,0xef,0xc4,0x7a,0x22,0x61,0x3c,0x6a,0x7a,0x8e,0x6f,0x16,0xfe,0xef,0xd5,0xe3,0xfe,0xf1,0xa8,0xba,0x9c,0xa1,\r\n0xa9,0xa8,0xa2,0x9f,0xb7,0x03,0x45,0x39,0x40,0x34,0x31,0x23,0x33,0x14,0x4a,0x02,0xef,0x01,0x29,0x68,0x2f,0x39,0x8d,0x79,0x79,0xb8,0x15,0xe0,0xfe,0xfc,0x01,0x24,0xe8,0xa9,0xd9,0xcf,0xbd,0xbf,0xd1,0xe1,0xb3,0x4c,0x19,0x67,0x45,0x40,0x55,0x29,0x1f,0x70,0x00,0x03,0x00,0x5e,0xff,0xe8,0x0a,0x47,0x05,0xb2,0x00,0x19,0x00,0x25,\r\n0x00,0x31,0x00,0x3f,0x40,0x22,0x00,0x0d,0x25,0x7d,0x2b,0x2b,0x07,0x13,0x7d,0x1f,0x1f,0x33,0x31,0x7d,0x07,0x1c,0x91,0x16,0x13,0x22,0x91,0x10,0x04,0x0d,0x00,0x04,0x2e,0x91,0x0a,0x04,0x28,0x91,0x04,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x39,\r\n0x39,0x31,0x30,0x01,0x0e,0x02,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x32,0x04,0x17,0x36,0x24,0x33,0x20,0x00,0x11,0x10,0x00,0x21,0x22,0x26,0x26,0x36,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x05,0x50,0x1e,0xb0,0xef,0x95,0xfe,0xcf,0xfe,0x91,0x01,0x77,\r\n0x01,0x41,0xd1,0x01,0x2c,0x43,0x42,0x01,0x39,0xe2,0x01,0x28,0x01,0x6c,0xfe,0x8c,0xfe,0xc8,0x93,0xec,0xae,0x3d,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xfb,0x63,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0x01,0x4a,0x54,0xb2,0x5c,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xc5,0x9e,0x9a,\r\n0xc9,0xfe,0x70,0xfe,0xbd,0xfe,0xa1,0xfe,0x68,0x5d,0xb1,0xcb,0xfe,0xbe,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0xfe,0xf6,0xfe,0xbe,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x3f,0x40,0x22,0x00,0x0c,\r\n0x23,0x83,0x29,0x29,0x06,0x12,0x83,0x1d,0x1d,0x31,0x2f,0x83,0x06,0x1a,0x95,0x15,0x16,0x20,0x95,0x0f,0x10,0x0c,0x00,0x03,0x2c,0x95,0x09,0x10,0x26,0x95,0x03,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x39,0x39,0x31,0x30,0x25,0x06,0x06,0x23,0x22,\r\n0x00,0x35,0x10,0x00,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x00,0x15,0x14,0x00,0x23,0x22,0x26,0x36,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x04,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x03,0xf9,0x2d,0xdb,0x9f,0xe4,0xfe,0xf2,0x01,0x19,0xf1,0x92,0xd7,0x2e,0x27,0xe6,0xa4,0xe6,0x01,0x00,0xfe,\r\n0xeb,0xe9,0x98,0xde,0x2c,0xbb,0x9b,0xa1,0xa9,0xa8,0xa2,0xa0,0xb6,0xfc,0xb8,0xba,0x9c,0xa1,0xa9,0xa8,0xa2,0xa0,0xb6,0xc9,0x60,0x81,0x01,0x1f,0xed,0x01,0x01,0x01,0x23,0x75,0x6b,0x5b,0x85,0xfe,0xe5,0xf9,0xf5,0xfe,0xd9,0x81,0xd9,0xd0,0xcf,0xbd,0xbf,0xd1,0xda,0xbb,0xb5,0xd2,0xcf,0xbd,0xbf,0xd1,0xda,0xba,0x00,0x02,0x00,0x19,\r\n0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x12,0x00,0x1a,0x00,0x47,0x40,0x24,0x0f,0x7d,0x18,0x18,0x06,0x1c,0x14,0x05,0x03,0x03,0x01,0x05,0x7e,0x0a,0x08,0x06,0x00,0x91,0x14,0x04,0x08,0x92,0x09,0x01,0x09,0x14,0x09,0x14,0x09,0x06,0x13,0x91,0x0b,0x03,0x06,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,\r\n0x10,0xed,0x01,0x2f,0xc6,0x33,0xf9,0x32,0xc2,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x15,0x21,0x15,0x21,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x04,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0x01,0x0d,0xfe,0xf3,0xa8,0xa3,0xa3,0x01,0x8a,0xe1,0x01,0x02,0xfe,0xe8,0xf0,0xbd,\r\n0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0x9d,0x85,0xfc,0xfc,0x85,0x04,0x19,0xe2,0xca,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x00,0x02,0x00,0x1e,0xfe,0x29,0x04,0x54,0x04,0x18,0x00,0x19,0x00,0x26,0x00,0x49,0x40,0x27,0x0d,0x83,0x20,0x20,0x19,0x28,0x16,0x16,0x14,0x06,0x18,0x84,0x03,0x01,0x19,0x00,0x16,0x96,\r\n0x03,0x15,0x15,0x10,0x19,0x1b,0x12,0x1d,0x95,0x2f,0x10,0x01,0x10,0x16,0x06,0x23,0x95,0x0a,0x10,0x04,0x0f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x5d,0xed,0x32,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xc6,0x33,0xf9,0x32,0x32,0xc2,0x2f,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x13,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,\r\n0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x88,0x88,0xa4,0x04,0x3f,0xaf,0x74,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0x01,0x4b,0xfe,0xb5,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0xfe,0xdd,0x86,0x04,0x9d,0xb4,0x68,\r\n0x64,0xfe,0xee,0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfe,0xcf,0x86,0xb4,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x05,0x31,0x05,0x9a,0x00,0x18,0x00,0x20,0x00,0x39,0x40,0x1d,0x15,0x7d,0x1e,0x1e,0x02,0x22,0x07,0x7e,0x0c,0x1a,0x01,0x7e,0x10,0x02,0x03,0x00,0x91,0x10,0x1a,0x09,0x1a,0x09,\r\n0x02,0x19,0x91,0x11,0x03,0x02,0x12,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0xd4,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,\r\n0x10,0x21,0x02,0x6c,0xa8,0x5c,0x51,0x59,0x14,0x9e,0x16,0xca,0x9a,0x42,0x01,0x8a,0xe5,0xfe,0xfe,0xe8,0xf0,0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x02,0x1e,0x5c,0x4e,0x36,0x34,0x36,0x44,0x89,0xa9,0x02,0xe4,0xe3,0xc9,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x02,0x00,0x05,0xfe,0x29,0x05,0x46,\r\n0x04,0x18,0x00,0x1d,0x00,0x28,0x00,0x39,0x40,0x1e,0x09,0x83,0x22,0x14,0x83,0x1a,0x1e,0x02,0x0e,0x84,0x00,0x0f,0x17,0x17,0x0d,0x0f,0x1b,0x00,0x1e,0x95,0x10,0x0d,0x15,0x03,0x25,0x95,0x06,0x10,0x01,0x0f,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x33,0xed,0x32,0x3f,0x12,0x39,0x2f,0x01,0x2f,0x33,0xe9,0x32,0x32,0xd4,0xed,0x2f,0xe9,0x31,\r\n0x30,0x25,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x21,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x3b,0x02,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x98,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfe,0xdd,0xfe,0xf1,0xd8,0xa4,0x39,0x64,0x6c,0x1c,0x94,0x07,0x0b,0xb1,0x99,\r\n0xed,0xe4,0xc6,0xb8,0x9e,0x87,0x8d,0xb0,0x8a,0x03,0x76,0xb4,0xcc,0xfe,0xee,0xe8,0xff,0x00,0xfe,0xe2,0xfe,0x29,0x01,0xd7,0x52,0x52,0x32,0x3a,0x0e,0x4b,0x1d,0x89,0x9b,0xd1,0xc6,0xab,0xc2,0xc5,0x98,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x06,0x27,0x05,0xb2,0x00,0x23,0x00,0x2b,0x00,0x41,0x40,0x22,0x20,0x7d,0x29,0x29,0x02,0x2d,\r\n0x15,0x7e,0x0e,0x08,0x08,0x2c,0x25,0x01,0x7e,0x1b,0x02,0x03,0x00,0x91,0x1b,0x25,0x25,0x01,0x24,0x91,0x1c,0x03,0x0b,0x91,0x12,0x04,0x01,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0x12,0x39,0x2f,0xc6,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x22,0x26,\r\n0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x16,0x16,0x33,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x03,0x62,0xa8,0x27,0xcd,0xb4,0x41,0x4e,0x20,0x3a,0x1f,0x28,0x42,0x28,0x7f,0x9f,0x27,0x5b,0x55,0x29,0x01,0x8a,0xe5,0xfe,0xfe,0xe8,0xf0,\r\n0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x02,0x1e,0xb0,0xca,0xd3,0x4e,0x5b,0x0c,0x0a,0x9e,0x0b,0x0b,0x9c,0x7c,0xc4,0x83,0x6b,0x31,0x02,0xe3,0xe3,0xc9,0xcb,0xfe,0xfb,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x00,0x02,0x00,0x05,0xfe,0x29,0x06,0x85,0x04,0x96,0x00,0x28,0x00,0x33,0x00,0x44,0x40,0x24,0x23,0x83,\r\n0x2d,0x2d,0x00,0x35,0x15,0x84,0x0c,0x05,0x05,0x34,0x29,0x1d,0x28,0x84,0x1a,0x00,0x1d,0x30,0x95,0x20,0x10,0x09,0x95,0x11,0x1b,0x0f,0x29,0x1a,0x95,0x27,0x01,0x15,0x00,0x1b,0x00,0x3f,0x3f,0x33,0xed,0x32,0x3f,0xd4,0xed,0x3f,0xed,0x32,0x01,0x2f,0x33,0xe9,0x32,0x32,0x12,0x39,0x2f,0xc6,0xe9,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,\r\n0x01,0x11,0x23,0x22,0x26,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x37,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x16,0x16,0x33,0x33,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x00,0x21,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x02,0xd7,0x49,0xcd,0xb4,0x3e,0x43,0x23,0x41,0x23,0x28,0x1e,\r\n0x31,0x20,0x83,0x92,0x29,0x5d,0x55,0x4b,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfe,0xdd,0xfe,0xf1,0xd8,0xe4,0xc6,0xb8,0x9e,0x87,0x8d,0xb0,0xfe,0x29,0x01,0xd7,0xb0,0xca,0x01,0xf3,0x4f,0x50,0x10,0x10,0x94,0x09,0x07,0x06,0x95,0x83,0xfe,0x2b,0x81,0x6c,0x32,0x03,0x76,0xb4,0xcc,0xfe,0xee,0xe8,0xff,0x00,0xfe,0xe2,0xfe,0x29,0x02,0x61,\r\n0xd1,0xc6,0xab,0xc2,0xc5,0x98,0x00,0x02,0x00,0x5e,0xfe,0xd0,0x06,0x25,0x05,0xb2,0x00,0x18,0x00,0x24,0x00,0x4f,0x40,0x2a,0x02,0x7d,0x1e,0x0b,0x0a,0x07,0x10,0x05,0x1e,0x0e,0x1e,0x07,0x07,0x1e,0x0e,0x03,0x26,0x24,0x7d,0x15,0x21,0x91,0x18,0x04,0x0c,0x0f,0x09,0x06,0x04,0x0b,0x0b,0x0d,0x08,0x07,0x1b,0x91,0x0e,0x0d,0x10,0x05,\r\n0x12,0x13,0x00,0x3f,0x33,0x33,0xc6,0x32,0xfd,0xc0,0x32,0x11,0x39,0x2f,0x17,0x39,0x3f,0xed,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x10,0xc6,0x32,0x10,0xe9,0x31,0x30,0x00,0x00,0x11,0x14,0x02,0x07,0x17,0x25,0x15,0x07,0x17,0x21,0x27,0x05,0x35,0x37,0x27,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x00,0x00,\r\n0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x04,0x3e,0x01,0x6c,0xa1,0x77,0x44,0x01,0x05,0x8d,0xd7,0xfe,0xcf,0x46,0xff,0x00,0x8a,0x52,0x6b,0x7d,0xfe,0xcf,0xfe,0x91,0x01,0x77,0x01,0x41,0xfd,0xf8,0x01,0x12,0xde,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0x05,0xb2,0xfe,0x70,0xfe,0xbd,0xeb,0xfe,0xbd,0x51,0x31,0xa6,\r\n0xa3,0x59,0x9a,0x34,0xa3,0xa3,0x58,0x3e,0x21,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xfc,0x11,0xfe,0xbc,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x00,0x02,0x00,0x60,0xfe,0x29,0x04,0x98,0x04,0x18,0x00,0x18,0x00,0x25,0x00,0x4f,0x40,0x2b,0x14,0x17,0x84,0x00,0x25,0x10,0x04,0x00,0x02,0x00,0x16,0x16,\r\n0x00,0x02,0x03,0x27,0x1f,0x83,0x0b,0x12,0x0f,0x10,0x1c,0x95,0x0e,0x10,0x06,0x22,0x95,0x08,0x17,0x02,0x96,0x14,0x03,0x03,0x2f,0x08,0x01,0x08,0x16,0x00,0x1b,0x00,0x3f,0x3f,0x5d,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x33,0x33,0x10,0xe9,0x32,0x31,\r\n0x30,0x01,0x35,0x21,0x35,0x21,0x11,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x33,0x15,0x23,0x15,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x03,0x6c,0xfe,0xb5,0x01,0x4b,0x04,0x6b,0xf3,0xc2,0xe8,0xff,0xd9,0xd2,0x5e,0x04,0xa4,0x88,0x88,0xa4,0xa7,0x7d,0x94,0xac,0xa4,\r\n0x85,0x90,0xab,0xfe,0x29,0xb4,0x86,0x01,0x4d,0xc8,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfb,0x63,0x86,0xb4,0x04,0x39,0x7f,0xad,0xdc,0xc6,0xb0,0xca,0xc6,0x95,0x00,0x02,0x00,0x5e,0xfe,0x3c,0x07,0xa9,0x05,0xb2,0x00,0x23,0x00,0x2f,0x00,0x5a,0x40,0x31,0x00,0x01,0x0e,0x7d,0x29,0x1d,0x7e,0x16,0x03,0x11,0x29,0x01,0x29,0x19,\r\n0x22,0x16,0x16,0x22,0x19,0x29,0x01,0x05,0x31,0x2f,0x7d,0x08,0x19,0x92,0x11,0x12,0x03,0x03,0x1a,0x1a,0x05,0x2c,0x91,0x0b,0x04,0x21,0x02,0x05,0x23,0x23,0x01,0x26,0x91,0x05,0x13,0x00,0x3f,0xed,0xc6,0x39,0x2f,0x12,0x39,0x39,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0xed,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x12,\r\n0x39,0x39,0x10,0xe9,0x10,0xe9,0x11,0x33,0x31,0x30,0x01,0x23,0x01,0x27,0x06,0x23,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x14,0x02,0x07,0x17,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x37,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x17,0x21,0x00,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x11,0x04,0x43,0xaf,0x01,0x00,0xae,\r\n0x6b,0x7d,0xfe,0xcf,0xfe,0x91,0x01,0x77,0x01,0x41,0x01,0x28,0x01,0x6c,0x8f,0x89,0x6e,0x01,0x38,0x64,0x6c,0x6d,0x85,0x01,0xc6,0xcc,0x59,0x8a,0xfe,0xaa,0xb5,0xfe,0xe7,0xfc,0x02,0x01,0x11,0xdf,0xec,0x01,0x10,0xfe,0xf8,0xe8,0xe2,0xfe,0xe6,0xfe,0x3c,0x01,0x4b,0x82,0x21,0x01,0x91,0x01,0x43,0x01,0x5b,0x01,0x9b,0xfe,0x70,0xfe,\r\n0xbd,0xce,0xfe,0xac,0x5d,0x4f,0x01,0x93,0x81,0xb7,0x32,0x4c,0x4c,0x91,0x90,0x8e,0x3d,0xb4,0xb0,0xfe,0x49,0x82,0x02,0x83,0xfe,0xbd,0x01,0x34,0x01,0x15,0x01,0x1c,0x01,0x36,0xfe,0xb9,0xfe,0xf8,0x00,0x02,0x00,0x60,0xfe,0x29,0x06,0x12,0x04,0x18,0x00,0x25,0x00,0x32,0x00,0x56,0x40,0x2e,0x00,0x01,0x32,0x23,0x84,0x24,0x10,0x02,\r\n0x24,0x1d,0xef,0x16,0x01,0x09,0x24,0x19,0x16,0x16,0x19,0x24,0x03,0x34,0x2c,0x83,0x09,0x25,0x01,0x01,0x06,0x24,0x1b,0x19,0x95,0x1a,0x10,0x0e,0x29,0x95,0x0c,0x10,0x12,0x03,0x2f,0x95,0x06,0x16,0x00,0x3f,0xed,0x32,0x32,0x3f,0xed,0x32,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,\r\n0x10,0xed,0x11,0x33,0x33,0x10,0xe9,0x33,0x11,0x33,0x31,0x30,0x01,0x23,0x01,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x37,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x01,0x11,0x23,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x02,\r\n0xcd,0xa5,0x01,0x44,0x04,0x6b,0xf3,0xc2,0xe8,0xff,0xd9,0xd2,0x5e,0x04,0xa4,0x9b,0x64,0x6c,0x71,0x81,0x01,0xc4,0xc4,0x52,0x43,0x4e,0xfe,0xe1,0xa4,0xa7,0x7d,0x94,0xac,0xa4,0x85,0x90,0xab,0xfe,0x4e,0x01,0x9f,0xc3,0xc8,0x01,0x13,0xed,0xfe,0x01,0x32,0xa6,0x8e,0xfc,0xbe,0xc7,0x81,0xb7,0x32,0x4f,0x50,0x8a,0x90,0x8e,0x40,0xa4,\r\n0x58,0x65,0xfe,0x92,0xfe,0x3e,0xf0,0x03,0x49,0x7f,0xad,0xdc,0xc6,0xb0,0xca,0xc6,0x95,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x04,0x13,0x05,0xb3,0x00,0x16,0x00,0x3d,0x40,0x1f,0x14,0x01,0x11,0x7d,0x04,0x16,0x15,0x01,0x04,0x15,0x15,0x04,0x01,0x03,0x18,0x0a,0x7e,0x0b,0x14,0x01,0x0a,0x01,0x0a,0x01,0x0e,0x16,0x12,0x07,0x91,0x0e,\r\n0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xcd,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x11,0x33,0x31,0x30,0x01,0x35,0x24,0x24,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x24,0x33,0x32,0x04,0x15,0x14,0x00,0x07,0x01,0x23,0x01,0x3c,0x01,0x0c,0x01,0x0a,0xa1,0x84,0x8f,0xb1,0x24,0xab,\r\n0x24,0x01,0x1a,0xd4,0xd0,0x01,0x02,0xfe,0xeb,0xca,0x01,0xf0,0xd3,0x02,0x4c,0x3e,0x27,0xc6,0x94,0x7b,0x95,0x9b,0x8f,0xd2,0xf0,0xe7,0xc1,0xa8,0xfe,0xf9,0x2c,0xfd,0xd0,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x03,0x0b,0x04,0x18,0x00,0x16,0x00,0x3e,0x40,0x20,0x0b,0x0a,0x06,0x83,0x10,0x09,0x0c,0x0a,0x10,0x0c,0x0c,0x10,0x0a,0x03,\r\n0x18,0x16,0x84,0x00,0x0c,0x09,0x96,0x0d,0x00,0x0d,0x00,0x03,0x0b,0x15,0x13,0x95,0x03,0x10,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xe9,0x11,0x33,0x31,0x30,0x13,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x01,0x23,0x01,0x35,0x36,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x07,0x0f,0x29,0xbb,0xa1,0x94,0xbe,0xab,0x93,0x01,0x63,0xd6,0xfe,0xaa,0x9d,0xc2,0x5e,0x4e,0x58,0x66,0x1f,0x02,0xcf,0xa1,0xa8,0xae,0x89,0x71,0xae,0x32,0xfe,0x70,0x01,0x9e,0x40,0x16,0x8c,0x61,0x4c,0x61,0x56,0x69,0x00,0x01,0x00,0x3d,0x00,0x00,0x04,0x53,0x05,0xb0,0x00,0x1e,0x00,0x4c,0x40,0x26,0x10,0x7e,\r\n0x04,0x1a,0x1a,0x18,0x1c,0x7e,0x1d,0x15,0x1d,0x04,0x1d,0x04,0x1d,0x20,0x14,0x09,0x00,0x1b,0x1e,0x91,0x15,0x18,0x01,0x15,0x16,0x15,0x16,0x15,0x0d,0x1d,0x12,0x09,0x07,0x92,0x0d,0x04,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x01,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,\r\n0xf9,0x32,0xc2,0x2f,0x10,0xe9,0x31,0x30,0x13,0x35,0x12,0x12,0x35,0x34,0x26,0x23,0x22,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x06,0x07,0x21,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x3d,0xfe,0xa8,0x4e,0x3e,0x76,0x5f,0x3d,0x77,0x3d,0x80,0x95,0x5a,0x91,0xaf,0x01,0xf1,0xa8,0xcc,0xcc,0xa8,0x01,0x47,0x96,0x01,\r\n0x05,0x01,0x29,0x7c,0x43,0x55,0x76,0xa4,0x39,0x2a,0x9e,0x8b,0x64,0xc5,0xc3,0xbe,0x01,0xfb,0xfe,0x05,0x96,0xfe,0xb9,0x01,0x47,0x00,0x00,0x01,0x00,0x0f,0xfe,0xe7,0x03,0xe0,0x04,0x18,0x00,0x1e,0x00,0x48,0x40,0x24,0x1b,0x84,0x0e,0x04,0x04,0x03,0x07,0x84,0x08,0x00,0x08,0x0e,0x08,0x0e,0x08,0x20,0x1e,0x14,0x0a,0x14,0x11,0x95,\r\n0x18,0x01,0x01,0x09,0x18,0x10,0x0b,0x03,0x00,0x96,0x08,0x06,0x09,0x15,0x00,0x3f,0x33,0xcd,0xed,0x32,0x32,0x3f,0x12,0x39,0x2f,0x10,0xed,0x32,0x01,0x2f,0xc4,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xf9,0x32,0xc0,0x2f,0x10,0xe9,0x31,0x30,0x25,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x37,0x36,0x12,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x02,0x07,0x02,0x9d,0xa4,0x9f,0x9f,0xa4,0xfd,0x72,0x02,0xc9,0xca,0x46,0x42,0x36,0x6b,0x30,0x39,0x79,0x39,0x7d,0x91,0xb1,0xd6,0x84,0x01,0xe3,0xfe,0x1d,0x84,0xfe,0xe7,0x01,0x19,0x77,0xc4,0x01,0x44,0x7f,0x42,0x4e,0x36,0x36,0x93,0x34,0x2f,0x98,0x7b,0x7a,0xfe,\r\n0xd1,0xd8,0x00,0x01,0x00,0x12,0x00,0x00,0x04,0xe6,0x05,0x9a,0x00,0x14,0x00,0x3a,0x40,0x1d,0x14,0x00,0x05,0x06,0x00,0x06,0x00,0x06,0x0f,0x10,0x10,0x16,0x03,0x02,0x04,0x07,0x01,0x13,0x0b,0x05,0x14,0x14,0x02,0x12,0x12,0x0f,0x05,0x02,0x03,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0x32,0x11,0x33,0x2f,0x33,\r\n0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x31,0x30,0x37,0x13,0x01,0x33,0x13,0x13,0x33,0x01,0x17,0x16,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x03,0xb0,0xb1,0xfe,0xb1,0xbb,0xed,0xf3,0x93,0xfe,0xc2,0x58,0x0a,0x0e,0x05,0x04,0x07,0x1a,0x01,0x95,0xb5,0xfd,0xed,0xb9,0x6f,0x68,0x0f,0x01,0xee,0x03,0x9d,0xfd,0x5a,0x02,\r\n0xa6,0xfc,0x8a,0xfb,0x1c,0x3f,0x24,0x3c,0x45,0x04,0x6f,0xfa,0x66,0x01,0x31,0xfe,0xde,0x00,0x00,0x01,0xff,0xe8,0xff,0x37,0x03,0xcb,0x04,0xd1,0x00,0x14,0x00,0x42,0x40,0x24,0x10,0x0f,0x06,0x03,0x01,0x13,0x04,0x07,0x12,0x05,0x05,0x02,0x0f,0x05,0x02,0x02,0x05,0x0f,0x03,0x16,0x14,0x00,0x04,0x07,0x01,0x0a,0x04,0x03,0x14,0x12,\r\n0x15,0x06,0x0f,0x0f,0x03,0x0f,0x00,0x3f,0x3f,0xce,0x3f,0xce,0x12,0x17,0x39,0x01,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x17,0x39,0x33,0x32,0x11,0x33,0x30,0x31,0x07,0x01,0x03,0x33,0x13,0x13,0x33,0x01,0x17,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x23,0x03,0x03,0x18,0x01,0x09,0xe3,0xb4,0x88,0xff,0x87,0xfe,\r\n0xb7,0x3f,0x1d,0x07,0x04,0x05,0x10,0x0b,0x01,0x10,0xad,0xfe,0x68,0xa1,0x62,0xc3,0xc9,0x02,0x71,0x02,0x58,0xfe,0x79,0x02,0x58,0xfc,0xfb,0xb4,0x53,0x3c,0x26,0x46,0x1f,0x02,0xec,0xfc,0x00,0x01,0x01,0xfe,0x36,0x00,0x00,0x01,0x00,0x1a,0xfe,0x1e,0x07,0x60,0x05,0x9a,0x00,0x2c,0x00,0x4e,0x40,0x27,0x18,0x17,0x1d,0x23,0x22,0x13,\r\n0x0f,0x01,0x27,0x1d,0x19,0x13,0x27,0x00,0x09,0x09,0x19,0x2c,0x00,0x00,0x2e,0x1a,0x19,0x1d,0x27,0x13,0x03,0x18,0x2c,0x22,0x19,0x03,0x0f,0x18,0x12,0x0b,0x91,0x05,0x1c,0x00,0x3f,0xed,0x3f,0x33,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x11,0x33,0x33,0x11,0x33,\r\n0x33,0x11,0x33,0x33,0x31,0x30,0x01,0x01,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x07,0x60,0xfe,0x74,0x3c,0x75,0x9c,0x63,0x1d,0x31,0x1d,0x30,0x31,0x3b,\r\n0x67,0x1f,0x3c,0xfe,0xc8,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0xc3,0xfe,0x5c,0xb9,0x01,0x31,0x13,0x05,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x37,0x09,0x09,0x03,0x03,0x04,0x0a,0x0a,0x01,0x24,0x05,0x9a,0xfa,0x88,0xd5,0xca,0x65,0x05,0x08,0x9d,0x12,0x56,0x52,0xa2,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x05,0x9a,\r\n0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xb0,0x20,0x4a,0x20,0x21,0x43,0x26,0x04,0x50,0x00,0x00,0x01,0x00,0x18,0xfe,0x1e,0x05,0xb0,0x04,0x00,0x00,0x2c,0x00,0x4b,0x40,0x25,0x18,0x17,0x1f,0x23,0x22,0x13,0x0f,0x27,0x1f,0x19,0x13,0x27,0x00,0x09,0x09,0x19,0x2c,0x00,0x00,0x2e,0x1a,0x19,0x27,0x1e,0x13,0x03,0x18,0x2c,\r\n0x22,0x19,0x0f,0x0b,0x95,0x05,0x0f,0x18,0x15,0x00,0x3f,0x33,0xd4,0xed,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x12,0x39,0x11,0x33,0x11,0x33,0x33,0x11,0x33,0x33,0x31,0x30,0x01,0x01,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x37,0x37,0x03,0x26,0x26,0x27,\r\n0x23,0x06,0x07,0x03,0x23,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x33,0x34,0x36,0x37,0x13,0x05,0xb0,0xfe,0xb4,0x39,0x59,0x88,0x6a,0x1c,0x34,0x1b,0x34,0x2d,0x51,0x66,0x23,0x2d,0xdd,0x06,0x08,0x02,0x04,0x03,0x12,0xe5,0xa4,0xfe,0xca,0xac,0xd4,0x05,0x07,0x02,0x08,0x03,0x0f,0xec,0x96,0xd5,\r\n0x05,0x06,0x02,0x06,0x06,0x08,0xd6,0x04,0x00,0xfb,0xb6,0xba,0x90,0x4e,0x05,0x08,0x93,0x12,0x5b,0x6f,0x8a,0x02,0xdd,0x15,0x30,0x1a,0x24,0x39,0xfd,0x21,0x04,0x00,0xfc,0xfe,0x11,0x2e,0x1d,0x2d,0x31,0x03,0x00,0xfc,0xfc,0x13,0x2d,0x1c,0x13,0x2f,0x1a,0x03,0x04,0x00,0x00,0x01,0x00,0x55,0xfe,0x21,0x04,0x93,0x05,0xc2,0x00,0x2c,\r\n0x00,0x53,0x40,0x19,0x0c,0x20,0x20,0x26,0x00,0x00,0x26,0x22,0x0b,0x0b,0x0f,0x7d,0x1c,0x1c,0x2e,0x16,0x06,0x7d,0x26,0x0b,0x22,0x91,0x09,0x21,0x1f,0xb8,0x01,0x05,0x40,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x12,0x03,0x91,0x29,0x16,0x19,0x91,0x12,0x1c,0x00,0x3f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,\r\n0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x32,0x11,0x39,0x2f,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x32,0x04,0x15,0x14,0x04,0x21,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x17,0x02,0x7e,0x1f,0x63,0x27,0x59,0x78,0x8e,0x84,0x01,0xf9,0xfe,0xad,0xd3,0x01,0x04,0xfe,0xc0,0xfe,0xfb,0x57,0xae,0x57,0x59,0xb1,0x58,0xb9,0xd8,0xc2,0xf0,0x68,0x01,0x4c,0xfe,0xd8,0xec,0xd9,0x9b,0x32,0x5b,0x29,0x05,0x00,0x10,0x1d,0x74,0x5b,0x74,0x7d,0x56,0xfe,0x65,0xe0,0xbe,0xcc,0xf1,0x20,0x2a,0xa2,0x32,0x22,0x9c,\r\n0x8e,0x91,0x8e,0x37,0x01,0x9c,0xc9,0xc0,0x95,0xcf,0x0b,0x0c,0x00,0x01,0x00,0x3e,0xfe,0x21,0x04,0x0c,0x04,0xdd,0x00,0x2c,0x00,0x53,0x40,0x19,0x0c,0x20,0x20,0x26,0x00,0x00,0x26,0x22,0x0b,0x0b,0x0f,0x83,0x1c,0x1c,0x2e,0x16,0x06,0x83,0x26,0x0b,0x22,0x95,0x09,0x21,0x1f,0xb8,0x01,0x05,0x40,0x0e,0x0c,0x09,0x0c,0x09,0x0c,0x12,\r\n0x03,0x96,0x29,0x16,0x19,0x95,0x12,0x1c,0x00,0x3f,0xed,0x32,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x10,0xed,0x32,0x01,0x2f,0xed,0xc4,0x12,0x39,0x2f,0xf9,0xc0,0x2f,0x32,0x11,0x39,0x2f,0x12,0x39,0x11,0x33,0x31,0x30,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x16,0x16,0x15,0x14,0x04,0x23,\r\n0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x01,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x02,0x00,0x26,0x4b,0x27,0x39,0x4a,0x5d,0x5e,0x01,0xec,0xfe,0xbe,0xd4,0xee,0xfe,0xc6,0xf1,0x53,0xa6,0x53,0x55,0xa8,0x54,0xab,0xd3,0xe0,0xcf,0x4f,0x01,0x42,0xfe,0xf9,0x9e,0xc5,0xa8,0x77,0x29,\r\n0x51,0x29,0x04,0x33,0x14,0x10,0x46,0x39,0x4a,0x4e,0x53,0xfe,0x7e,0x11,0xd6,0xb6,0xc6,0xe7,0x1f,0x28,0xa2,0x34,0x2a,0x9c,0x8b,0x91,0x96,0x35,0x01,0x85,0xa0,0x84,0x70,0x95,0x0b,0x11,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x14,0x00,0x1c,0x00,0x56,0x40,0x16,0x11,0x7d,0x1a,0x16,0x0d,0x01,0x0b,0x0b,0x09,0x01,\r\n0x7e,0x06,0x04,0x02,0x00,0x91,0x16,0x15,0x91,0x0d,0x0c,0x04,0xb8,0x01,0x05,0xb6,0x05,0x09,0x05,0x20,0x16,0x01,0x05,0xb8,0xff,0xc0,0x40,0x0c,0x09,0x0e,0x48,0x16,0x05,0x16,0x05,0x02,0x07,0x03,0x02,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x5d,0x11,0x33,0x10,0xfd,0x32,0xdc,0xed,0x10,0xed,0x01,0x2f,0xc6,0x33,0xf9,\r\n0x32,0xc0,0x2f,0x11,0x33,0x33,0x2f,0xe9,0x31,0x30,0x01,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0xaa,0xaa,0xa8,0xd4,0xd4,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xae,0xb7,0xfe,0xb0,0x01,0x3e,0xfe,0xc2,0x04,\r\n0xee,0x67,0x45,0x45,0x67,0x36,0xe0,0xcc,0xcb,0xfe,0xfd,0x02,0xe3,0xfd,0xb4,0x9b,0x92,0x01,0x1f,0x00,0x00,0x02,0x00,0x27,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4f,0x40,0x2c,0x10,0x83,0x1f,0x08,0x1f,0x08,0x1f,0x27,0x0a,0x06,0x17,0x84,0x03,0x01,0x18,0x17,0x1b,0x15,0x1c,0x95,0x13,0x16,0x0a,0x22,0x95,0x0d,\r\n0x09,0x01,0x96,0x06,0x02,0x02,0x04,0x00,0x0d,0x10,0x0d,0x20,0x0d,0x03,0x0d,0x10,0x04,0x00,0x00,0x3f,0x3f,0x5d,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x13,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x15,0x21,0x11,0x33,0x36,\r\n0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x7f,0x7f,0xa4,0x01,0x54,0xfe,0xac,0x04,0x79,0xe9,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0x04,0xb2,0x86,0xb4,0xb4,0x86,0xfe,0x9a,0xcc,0xfe,0xee,\r\n0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfd,0x95,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0x29,0x05,0x9a,0x00,0x14,0x00,0x1c,0x00,0x44,0x40,0x23,0x11,0x7d,0x1a,0x1a,0x06,0x1e,0x16,0x05,0x03,0x03,0x01,0x05,0x7e,0x0a,0x08,0x06,0x15,0x91,0x0d,0x0d,0x06,0x0b,0x03,0x16,0x91,0x00,0x01,0x0f,\r\n0x09,0x01,0x09,0x04,0x08,0x06,0x12,0x00,0x3f,0xde,0x32,0xdd,0x5d,0x32,0xdc,0xed,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc6,0x33,0xf9,0x32,0xc2,0x2f,0x11,0x33,0x11,0x12,0x39,0x2f,0xe9,0x31,0x30,0x01,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x00,0x23,0x03,0x11,0x33,0x32,0x36,\r\n0x35,0x10,0x21,0x01,0x64,0xd4,0xd4,0xa8,0xaa,0xaa,0xa8,0xe2,0xe8,0xfb,0xfe,0xe5,0xf0,0xba,0xb0,0xae,0xb7,0xfe,0xb0,0x01,0x3e,0x55,0x67,0x82,0x82,0x67,0x04,0xb1,0xe2,0xe0,0xcc,0xcb,0xfe,0xfd,0x02,0xe3,0xfd,0xb4,0x9b,0x92,0x01,0x1f,0x00,0x02,0x00,0x27,0xfe,0x29,0x04,0x54,0x05,0xec,0x00,0x18,0x00,0x25,0x00,0x4b,0x40,0x28,\r\n0x0c,0x1f,0x1f,0x18,0x27,0x19,0x17,0x15,0x15,0x13,0x06,0x17,0x03,0x01,0x18,0x17,0x1b,0x11,0x1c,0x95,0x0f,0x00,0x16,0x96,0x03,0x13,0x1f,0x0f,0x2f,0x0f,0x02,0x0f,0x16,0x06,0x22,0x95,0x09,0x10,0x04,0x00,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x5d,0xde,0x32,0xed,0x32,0x10,0xed,0x32,0x3f,0x01,0x2f,0xc6,0x33,0xd1,0x32,0x32,0xc2,0x2f,\r\n0x11,0x33,0x11,0x12,0x39,0x2f,0xc1,0x31,0x30,0x17,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x12,0x15,0x10,0x02,0x23,0x22,0x27,0x23,0x11,0x21,0x15,0x21,0x15,0x23,0x13,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xa6,0x7f,0x7f,0xa4,0x04,0x79,0xe9,0xc4,0xe0,0xfa,0xd9,0xc7,0x6c,0x04,0x01,0x54,0xfe,\r\n0xac,0xa4,0xa4,0xa4,0x80,0x94,0xaa,0x9e,0x87,0x8d,0xb0,0xf8,0x86,0x06,0x5e,0xfd,0x60,0xcc,0xfe,0xee,0xe8,0xfe,0xfe,0xfe,0xcc,0xac,0xfe,0xfa,0x86,0xdf,0x03,0x79,0x80,0xb0,0xe3,0xcc,0xab,0xc2,0xc5,0x98,0x00,0x01,0x00,0xbc,0xfe,0x29,0x03,0xc7,0x05,0x9a,0x00,0x0b,0x00,0x23,0x40,0x10,0x09,0x0a,0x0a,0x0d,0x04,0x00,0x7e,0x01,\r\n0x04,0x0b,0x01,0x09,0x02,0x03,0x01,0x1b,0x00,0x3f,0x3f,0x33,0x12,0x39,0x39,0x01,0x2f,0xe9,0x32,0x11,0x33,0x2f,0x33,0x31,0x30,0x01,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x01,0x64,0xa8,0xa8,0x04,0x03,0x0e,0x0d,0x01,0x8c,0xb5,0xfd,0x9d,0xfe,0x29,0x07,0x71,0xfb,0xcb,0x12,0x31,0x1e,0x03,0xd4,0xfa,0x66,0x00,\r\n0x00,0x01,0x00,0xa6,0xfe,0x29,0x03,0x28,0x04,0x00,0x00,0x0b,0x00,0x21,0x40,0x0f,0x08,0x09,0x09,0x0d,0x03,0x0a,0x84,0x00,0x0a,0x03,0x08,0x01,0x0f,0x00,0x1b,0x00,0x3f,0x3f,0x33,0x39,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x13,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x13,0x33,0x01,0x11,0xa6,0xa4,0x04,0x0a,0x2b,\r\n0x14,0xe4,0xad,0xfe,0x22,0xfe,0x29,0x05,0xd7,0xfd,0x34,0x33,0x68,0x2f,0x02,0x02,0xfc,0x00,0xfe,0x29,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x5d,0x05,0xb2,0x00,0x29,0x00,0x41,0x40,0x22,0x1c,0x7d,0x0f,0x23,0x7d,0x06,0x1f,0x0f,0x0a,0x0f,0x06,0x06,0x0f,0x0a,0x03,0x2b,0x15,0x29,0x1f,0x0a,0x91,0x0b,0x0b,0x19,0x00,0x03,0x91,0x26,\r\n0x13,0x15,0x12,0x91,0x19,0x04,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xc4,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x37,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x60,0x4b,0xa1,0x4b,0x80,0x99,0x9b,0x93,0x71,0x5a,0x7f,0x95,0x67,0x62,0x45,0x99,0x41,0x4b,0x93,0x4b,0xa9,0xc3,0x6d,0x6a,0x7c,0x8c,0xf8,0xcc,0x4e,0x9d,0x4e,0xd7,0x32,0x26,0x95,0x82,0x80,0x85,0x98,0x97,0x84,0x64,0x69,0x2d,0x30,0xa2,0x2b,0x27,0xc1,0xa0,0x7d,\r\n0xa9,0x2d,0x08,0x16,0xbe,0x8c,0xc4,0xea,0x21,0x2c,0x00,0x01,0x00,0x1e,0xfe,0x23,0x02,0xe7,0x04,0x18,0x00,0x29,0x00,0x41,0x40,0x22,0x1c,0x84,0x0f,0x23,0x84,0x06,0x20,0x0f,0x0a,0x0f,0x06,0x06,0x0f,0x0a,0x03,0x2b,0x15,0x00,0x1f,0x0a,0x95,0x0b,0x0b,0x19,0x00,0x03,0x95,0x26,0x1c,0x15,0x12,0x95,0x19,0x10,0x00,0x3f,0xed,0x32,\r\n0x3f,0xed,0x32,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xc6,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x00,0x23,\r\n0x22,0x26,0x27,0x21,0x23,0x6c,0x2b,0x97,0xd0,0x9c,0xba,0x46,0x52,0x78,0xa1,0x71,0x65,0x47,0x8f,0x47,0x48,0x94,0x48,0xaf,0xc6,0x72,0x51,0x80,0x73,0xfe,0xcf,0xdb,0x2a,0x66,0x2a,0xfe,0xcc,0x0f,0x11,0xc5,0x96,0x8b,0x85,0x89,0xa2,0x78,0x65,0x70,0x29,0x2b,0x98,0x25,0x20,0xb8,0xa6,0x5d,0xc0,0x2a,0x05,0x2c,0xbb,0x80,0xcd,0xfe,\r\n0xe9,0x08,0x09,0x00,0x00,0x02,0x00,0x14,0xff,0xe8,0x03,0xba,0x05,0xb0,0x00,0x19,0x00,0x24,0x00,0x41,0x40,0x21,0x24,0x0e,0x7e,0x00,0x03,0x00,0x0a,0x7d,0x1d,0x00,0x1d,0x00,0x1d,0x26,0x01,0x15,0x15,0x17,0x91,0x12,0x0e,0x00,0x91,0x24,0x02,0x02,0x07,0x12,0x13,0x20,0x91,0x07,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,\r\n0x32,0x10,0xed,0x32,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,0x32,0x31,0x30,0x01,0x21,0x35,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x01,0x83,0xfe,0xe2,0x01,0x1e,\r\n0x95,0x86,0x7d,0x9f,0xb9,0x86,0x50,0xd1,0xbc,0x54,0x36,0x36,0x56,0xe3,0xf9,0x49,0x45,0x31,0x36,0x41,0x37,0x03,0x70,0x97,0x81,0x8c,0x9c,0x99,0x7c,0x80,0xab,0xfe,0x92,0xf8,0xfe,0xde,0x18,0xa6,0x27,0x01,0x81,0x02,0x07,0x53,0x41,0x36,0x4a,0x50,0x43,0x81,0x00,0x02,0xff,0x76,0xfe,0x1e,0x03,0x15,0x06,0x02,0x00,0x19,0x00,0x24,\r\n0x00,0x41,0x40,0x21,0x24,0x0e,0x84,0x00,0x03,0x00,0x0a,0x83,0x1d,0x00,0x1d,0x00,0x1d,0x26,0x01,0x15,0x15,0x17,0x95,0x12,0x0e,0x00,0x95,0x24,0x02,0x02,0x07,0x12,0x1c,0x20,0x95,0x07,0x00,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x33,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x10,0xe9,\r\n0x32,0x31,0x30,0x13,0x23,0x35,0x37,0x35,0x34,0x36,0x37,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x14,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0xe2,0xd8,0xd8,0x91,0x8a,0x7d,0x9b,0xae,0x83,0x5e,0xcc,0xbc,0x45,0x43,0x49,0x43,0xe0,0xf9,0x43,0x4f,0x3d,0x33,0x3c,0x3b,\r\n0x03,0xc6,0x8c,0x01,0x87,0x89,0x9e,0x01,0x98,0x7a,0x82,0xa8,0xfc,0x65,0xfd,0xfe,0xf0,0x20,0x99,0x2d,0x01,0x66,0x04,0x42,0x57,0x47,0x3d,0x4b,0x54,0x4a,0x88,0x00,0x00,0x01,0x00,0x38,0xff,0xe8,0x03,0xca,0x05,0xb2,0x00,0x25,0x00,0x37,0x40,0x1c,0x15,0x7d,0x22,0x08,0x22,0x08,0x22,0x27,0x1c,0x02,0x7e,0x0f,0x1c,0x1f,0x91,0x18,\r\n0x08,0x05,0x91,0x0c,0x0c,0x12,0x18,0x13,0x25,0x91,0x12,0x04,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x00,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x22,0x26,\r\n0x27,0x35,0x16,0x16,0x33,0x32,0x12,0x11,0x10,0x26,0x23,0x01,0x7c,0x9b,0x8b,0x7c,0x3a,0x6e,0x36,0x35,0x6d,0x3d,0xc1,0xee,0xf8,0xcd,0xde,0xef,0xfe,0xc0,0xfe,0xe7,0x3c,0x77,0x3c,0x39,0x81,0x39,0xcf,0xd6,0x8f,0x90,0x05,0x1c,0xae,0x8d,0x90,0xaf,0x28,0x2b,0xa2,0x23,0x24,0xfc,0xc7,0xd7,0x01,0x0c,0xfe,0x9f,0xfe,0xbe,0xfe,0x87,\r\n0xfe,0x52,0x18,0x16,0xa5,0x1d,0x20,0x01,0x4c,0x01,0x45,0x01,0x10,0xfd,0x00,0x01,0x00,0x43,0xfe,0x4e,0x03,0xce,0x04,0x18,0x00,0x25,0x00,0x34,0x40,0x1a,0x15,0x83,0x22,0x08,0x22,0x08,0x22,0x27,0x1c,0x02,0x84,0x0f,0x08,0x05,0x95,0x0c,0x0c,0x12,0x1c,0x1f,0x95,0x18,0x25,0x95,0x12,0x0f,0x00,0x3f,0xed,0x2f,0xed,0x32,0x11,0x39,\r\n0x2f,0xed,0x32,0x01,0x2f,0xe9,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x00,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x12,0x33,0x32,0x12,0x11,0x10,0x00,0x21,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x12,0x11,0x10,0x02,0x23,0x01,0x83,0x9c,0x8e,0x7b,0x39,0x6d,0x37,0x36,0x71,\r\n0x37,0xc0,0xec,0xf5,0xcd,0xdd,0xec,0xfe,0xc8,0xfe,0xe2,0x3c,0x76,0x3c,0x39,0x82,0x38,0xd4,0xd5,0x91,0x92,0x03,0x8e,0xb6,0x8e,0x96,0xb2,0x24,0x2b,0x98,0x23,0x1e,0xfb,0xc5,0xd6,0x01,0x0a,0xfe,0xa2,0xfe,0xbb,0xfe,0x8a,0xfe,0x4f,0x16,0x14,0x9d,0x1d,0x20,0x01,0x55,0x01,0x49,0x01,0x18,0x01,0x00,0x00,0x01,0x00,0x28,0x02,0x89,\r\n0x02,0x39,0x05,0xaa,0x00,0x24,0x00,0x44,0xb3,0x00,0x00,0x05,0x0b,0xb8,0x01,0x04,0xb3,0x18,0x18,0x26,0x1e,0xb8,0x01,0x04,0xb3,0x12,0x05,0x12,0x15,0xb8,0x01,0x05,0xb2,0x0e,0x24,0x21,0xb8,0x01,0x05,0xb4,0x02,0x02,0x08,0x0e,0x1b,0xb8,0x01,0x05,0xb1,0x08,0x04,0x00,0x3f,0xed,0x2f,0x12,0x39,0x2f,0xed,0x32,0x10,0xed,0x32,0x01,\r\n0x2f,0xc4,0xe9,0x12,0x39,0x2f,0xed,0x12,0x39,0x2f,0x31,0x30,0x01,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x01,0x7a,0x2b,0x32,0x77,0x7e,0x8f,0x71,0x83,0x8e,0xa9,0x9c,0x29,0x4b,0x26,\r\n0x28,0x4b,0x28,0x5f,0x62,0x49,0x45,0x3a,0x47,0x38,0x3f,0x18,0x31,0x13,0x03,0xbb,0x11,0x83,0x72,0x74,0x97,0xbf,0xad,0xc5,0xf0,0x0f,0x0e,0x78,0x14,0x11,0xa3,0xa1,0x86,0x77,0x55,0x42,0x3f,0x52,0x0c,0x0e,0x00,0x02,0x00,0x60,0xff,0x43,0x05,0x60,0x05,0xec,0x00,0x1a,0x00,0x27,0x00,0x4e,0x40,0x2a,0x27,0x19,0x84,0x15,0x09,0x06,\r\n0x07,0x00,0x01,0x09,0x07,0x01,0x03,0x03,0x01,0x07,0x09,0x04,0x29,0x21,0x83,0x10,0x17,0x00,0x15,0x1e,0x95,0x13,0x10,0x0a,0x24,0x95,0x07,0x0d,0x16,0x02,0x00,0x19,0x95,0x05,0x09,0x15,0x00,0x3f,0x33,0xfd,0xc6,0x33,0x3f,0xc6,0xed,0x32,0x3f,0xed,0x32,0x3f,0x01,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,\r\n0x11,0x33,0xe9,0x33,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x35,0x23,0x06,0x23,0x22,0x02,0x35,0x34,0x12,0x33,0x32,0x17,0x33,0x11,0x33,0x11,0x33,0x03,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x04,0xbc,0x8e,0x59,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0x04,0x72,0xee,0xc0,0xe8,0xff,0xd6,0xd3,\r\n0x60,0x04,0xa4,0x53,0xf7,0xa6,0x7c,0x97,0xab,0xa3,0x8d,0x88,0xac,0x01,0x44,0xba,0x8a,0xbd,0xbd,0xae,0xc6,0x01,0x11,0xef,0xfc,0x01,0x34,0xa6,0x02,0x7a,0xfa,0x9e,0x01,0xdc,0x7e,0xaa,0xdd,0xc1,0xb1,0xcd,0xc6,0x97,0x00,0x01,0x00,0xa6,0xff,0x43,0x02,0x9a,0x05,0xec,0x00,0x0d,0x00,0x30,0x40,0x17,0x0b,0x0c,0x05,0x06,0x0c,0x06,\r\n0x00,0x08,0x08,0x0f,0x03,0x84,0x00,0x01,0x00,0x07,0x05,0x03,0x95,0x0c,0x0a,0x00,0x15,0x00,0x3f,0x32,0xc6,0xfd,0xc6,0x33,0x3f,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x12,0x39,0x39,0x11,0x33,0x11,0x33,0x31,0x30,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0xa6,0xa4,0x53,0x57,0x8e,0x57,0x6f,0xb1,0x59,0x8e,\r\n0x59,0x05,0xec,0xfa,0x9e,0xba,0xba,0x8a,0xbd,0xbd,0x00,0x01,0x00,0xa6,0xff,0x43,0x07,0xa4,0x04,0x18,0x00,0x29,0x00,0x5d,0x40,0x32,0x1d,0x19,0x84,0x1a,0x23,0x11,0x84,0x12,0x28,0x84,0x09,0x06,0x07,0x00,0x01,0x12,0x09,0x07,0x01,0x03,0x03,0x01,0x07,0x09,0x12,0x05,0x04,0x1a,0x04,0x23,0x1d,0x0d,0x15,0x95,0x25,0x20,0x10,0x1b,\r\n0x0f,0x12,0x19,0x15,0x02,0x00,0x28,0x95,0x07,0x05,0x09,0x15,0x00,0x3f,0x33,0xc6,0xfd,0xc6,0x33,0x3f,0x33,0x3f,0x3f,0x33,0xed,0x32,0x32,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0x10,0xe9,0x10,0xe9,0x39,0x10,0xe9,0x32,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x11,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x36,0x33,0x20,0x11,0x11,0x33,0x06,0xfe,0x8e,0x57,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0x68,0x7d,0x69,0x93,0xa4,0xe9,0x6a,0x8e,0xa4,0xa4,0x04,0x6d,0xd1,0x68,0x9e,0x1c,0x72,0xe2,0x01,0x52,0x53,0x01,0x44,\r\n0xba,0x8a,0xbd,0xbd,0x02,0x4c,0xa7,0x9b,0xbe,0x88,0xfd,0xb8,0x02,0x60,0x01,0x2e,0xb3,0x93,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x76,0x5e,0xd4,0xfe,0x5f,0xfe,0x13,0x00,0x00,0x01,0x00,0xa6,0xff,0x43,0x05,0x48,0x04,0x18,0x00,0x1c,0x00,0x45,0x40,0x25,0x14,0x10,0x84,0x11,0x1b,0x84,0x06,0x07,0x00,0x01,0x09,0x07,0x01,0x03,0x03,0x01,\r\n0x07,0x09,0x04,0x04,0x11,0x04,0x15,0x0c,0x95,0x17,0x10,0x12,0x0f,0x11,0x15,0x00,0x1b,0x95,0x07,0x09,0x15,0x00,0x3f,0xc6,0xfd,0xc6,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x11,0x33,0x11,0x33,0xed,0x10,0xe9,0x32,0x31,0x30,0x01,0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x11,0x10,0x23,\r\n0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x04,0xa5,0x8e,0x5a,0x6f,0xb1,0x59,0x8e,0x59,0xb5,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x53,0x01,0x46,0xbc,0x8a,0xbd,0xbd,0x02,0x48,0x01,0x46,0xb8,0x8e,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfe,0x18,0x00,0x00,0x01,0x00,0xa6,\r\n0x00,0x00,0x02,0xbc,0x04,0x91,0x00,0x17,0x00,0x3a,0x40,0x1e,0x09,0x0a,0x00,0x01,0x0a,0x01,0x06,0x06,0x01,0x0a,0x03,0x19,0x12,0x0f,0x84,0x10,0x11,0x0f,0x10,0x15,0x14,0x0b,0x09,0x08,0xec,0x17,0x00,0x96,0x02,0x10,0x00,0x3f,0xed,0x33,0xfd,0xcd,0x33,0x33,0x3f,0x3f,0x01,0x2f,0xe9,0x32,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,\r\n0x11,0x33,0x31,0x30,0x01,0x33,0x07,0x16,0x16,0x17,0x15,0x26,0x27,0x07,0x23,0x37,0x06,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x37,0x02,0x26,0x7a,0x23,0x14,0x1e,0x0d,0x26,0x42,0x3a,0x7a,0x31,0x3a,0x4d,0xa4,0xa4,0x04,0x1a,0x5b,0x3b,0x04,0x91,0x80,0x02,0x06,0x05,0xaa,0x1d,0x03,0xd7,0xb7,0x26,0xa8,0x82,0xfd,0xf6,\r\n0x04,0x00,0xd3,0x4f,0x6c,0x18,0x00,0x02,0x00,0xa6,0xff,0x43,0x04,0xa2,0x04,0x01,0x00,0x1e,0x00,0x27,0x00,0x53,0x40,0x2c,0x0f,0x06,0x0c,0x83,0x1c,0x1d,0x16,0x17,0x17,0x14,0x1d,0x00,0x04,0x19,0x24,0x19,0x24,0x19,0x07,0x1a,0x20,0x06,0x84,0x07,0x0f,0x20,0x96,0x05,0x05,0x06,0x1f,0x96,0x08,0x0f,0x06,0x15,0x18,0x16,0x14,0x95,\r\n0x1d,0x1b,0x00,0x15,0x00,0x3f,0x32,0xc6,0xfd,0xc6,0x33,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x01,0x2f,0xe9,0x32,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x12,0x17,0x39,0x11,0x33,0x11,0x33,0xed,0x11,0x39,0x31,0x30,0x21,0x03,0x26,0x26,0x23,0x23,0x11,0x23,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x17,0x33,0x37,\r\n0x33,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x01,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x02,0xe5,0x98,0x2e,0x40,0x4e,0x47,0xa4,0x01,0x36,0xce,0xb2,0x90,0x67,0x1f,0x3b,0x2a,0x69,0x53,0x4f,0x8e,0x4f,0x6f,0xb1,0x59,0x8e,0x59,0xfd,0xe7,0x78,0x72,0x80,0x67,0x73,0x01,0x1b,0x54,0x34,0xfe,0x5d,0x04,0x01,0x8b,0x94,0x5f,0x97,0x0c,\r\n0x03,0x09,0x3d,0x4d,0xc0,0xa7,0xa7,0x8a,0xbd,0xbd,0x03,0x7e,0xfe,0xab,0x5f,0x5a,0x4f,0x4d,0x00,0x02,0x00,0x2b,0xff,0xea,0x05,0x12,0x05,0xb1,0x00,0x21,0x00,0x2c,0x00,0x4d,0x40,0x28,0x1c,0xef,0x25,0x09,0x25,0x09,0x25,0x2e,0x14,0x03,0x84,0x11,0x0f,0x0d,0x2c,0x21,0x84,0x15,0x00,0x28,0x96,0x19,0x20,0x02,0x0e,0x95,0x11,0x2c,\r\n0x14,0x11,0x13,0x13,0x11,0x0f,0x06,0x95,0x0b,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x33,0x2f,0x11,0x33,0x33,0x10,0xed,0x32,0x32,0xd4,0xed,0x01,0x2f,0x33,0xe9,0x32,0x2f,0xc6,0x33,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x11,0x11,0x23,0x35,\r\n0x33,0x35,0x37,0x11,0x21,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x02,0xf2,0xfe,0x8d,0x46,0x51,0x3f,0x2c,0x3b,0x5e,0xfe,0xf3,0xb0,0xb0,0xa4,0x01,0x73,0x8c,0x8a,0x83,0x87,0xa7,0xa0,0x35,0x36,0x4f,0x5d,0x37,0x39,0x39,0x37,0x03,0x74,0xfd,0xbf,0x67,\r\n0x58,0x22,0x8c,0x20,0x01,0x2c,0x02,0x5e,0x8c,0xfa,0x35,0xfe,0xd1,0x6e,0xa9,0x9a,0x96,0x82,0x8d,0x98,0xfc,0x8c,0x04,0x00,0x4b,0x4f,0x49,0x48,0x52,0x6e,0x6b,0x00,0x00,0x02,0xff,0xec,0x00,0x00,0x03,0x5b,0x05,0xb2,0x00,0x22,0x00,0x2e,0x00,0x4c,0x40,0x28,0x1f,0x10,0x22,0x0d,0x7e,0x26,0x03,0x23,0x00,0x26,0x13,0x7e,0x1c,0x26,\r\n0x1c,0x26,0x1c,0x30,0x22,0x00,0x2c,0x7e,0x18,0x07,0x1f,0x03,0x10,0x23,0x04,0x22,0x22,0x0a,0x18,0x91,0x16,0x12,0x29,0x91,0x0a,0x03,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x17,0x39,0x01,0x2f,0xc6,0xe9,0xc6,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x11,0x12,0x39,0x39,0x10,0xe9,0x11,0x39,0x39,0x31,0x30,0x13,0x36,0x12,0x37,\r\n0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x07,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x95,0x4d,0x8d,0x3c,0x10,0x93,0x4c,0x98,0x6f,0x73,0x88,0x31,0x22,0x84,0x6c,0xe5,0xc4,0xfe,0x3a,0x01,0xd1,\r\n0x69,0x89,0x42,0x48,0x3d,0x87,0x4b,0xcf,0x15,0x18,0x2c,0x29,0x29,0x31,0x49,0x01,0x3a,0x80,0x01,0x04,0x80,0x0e,0x82,0x97,0x4f,0x6b,0x93,0x92,0x79,0x4b,0xa5,0x59,0x84,0xd8,0x73,0xba,0xd5,0x97,0x89,0x6d,0x54,0x9e,0x4e,0x7e,0xed,0x7b,0x02,0xf5,0x38,0x5d,0x38,0x36,0x3b,0x3c,0x29,0x39,0x69,0x00,0x00,0x02,0x00,0x0f,0xff,0xe8,\r\n0x05,0xaa,0x05,0x9a,0x00,0x0e,0x00,0x1a,0x00,0x28,0x40,0x14,0x05,0x7d,0x0e,0x0b,0x14,0x14,0x1c,0x1a,0x7d,0x00,0x0b,0x11,0x91,0x08,0x13,0x17,0x0e,0x91,0x01,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x01,0x2f,0xc6,0xe9,0x12,0x39,0x2f,0x12,0x39,0xe9,0x31,0x30,0x13,0x35,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x11,0x34,0x12,\r\n0x37,0x02,0x00,0x33,0x32,0x00,0x11,0x10,0x00,0x23,0x22,0x00,0x15,0x0f,0x03,0x07,0x01,0x25,0x01,0x6f,0xfe,0x8c,0xfe,0xc8,0xfe,0xd4,0xfe,0x8c,0x99,0x74,0x5d,0x01,0x11,0xdf,0xe9,0x01,0x13,0xfe,0xfc,0xec,0xe1,0xfe,0xe5,0x05,0x02,0x98,0xfe,0x6d,0xfe,0xcc,0xfe,0xb0,0xfe,0x65,0x01,0x8d,0x01,0x3b,0xe1,0x01,0x2a,0x47,0xfc,0xc1,\r\n0xfe,0xbc,0x01,0x34,0x01,0x09,0x01,0x10,0x01,0x36,0xfe,0xb9,0xfc,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x18,0x05,0xe9,0x00,0x13,0x00,0x1e,0x00,0x2f,0x40,0x18,0x09,0x0c,0x10,0x83,0x19,0x19,0x20,0x0d,0x0c,0x1e,0x83,0x02,0x08,0x05,0x16,0x95,0x13,0x16,0x0d,0x00,0x1b,0x95,0x05,0x10,0x00,0x3f,0xed,0x3f,0x3f,0xed,0x12,0x39,\r\n0x01,0x2f,0xe9,0xc4,0x32,0x12,0x39,0x2f,0xed,0x12,0x39,0x31,0x30,0x04,0x02,0x35,0x34,0x00,0x33,0x32,0x16,0x17,0x37,0x26,0x00,0x27,0x33,0x04,0x00,0x11,0x14,0x00,0x23,0x00,0x16,0x33,0x32,0x36,0x35,0x10,0x21,0x22,0x06,0x15,0x01,0x5c,0xfc,0x01,0x09,0xde,0x33,0x5e,0x1f,0x03,0x4f,0xfe,0xea,0xbc,0xfa,0x01,0x20,0x01,0x25,0xfe,\r\n0xfa,0xd4,0xfe,0xca,0xa9,0x91,0x8a,0xa4,0xfe,0xd6,0x96,0xa8,0x18,0x01,0x1c,0xf6,0xf0,0x01,0x2e,0x1e,0x1d,0x02,0x77,0x01,0x06,0x8d,0xdb,0xfe,0x07,0xfe,0xf1,0xef,0xfe,0xd1,0x01,0x61,0xd7,0xdf,0xad,0x01,0x90,0xdc,0xb8,0x00,0x00,0x01,0x00,0xbc,0xfe,0x29,0x02,0xf4,0x05,0xac,0x00,0x15,0x00,0x2b,0x40,0x16,0x07,0x00,0x00,0x17,\r\n0x0d,0x06,0x09,0x83,0x0b,0x0e,0x02,0xf4,0x12,0x01,0x0c,0x00,0x0a,0x1b,0x06,0xec,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x02,0xf4,0x2f,0x57,0x78,\r\n0x92,0x01,0x77,0xfe,0x89,0xa8,0xa8,0x04,0x26,0x9b,0x61,0x23,0x34,0x13,0x04,0xea,0x21,0xd1,0xc8,0xfd,0x25,0x97,0xfe,0x29,0x07,0x71,0xd3,0x6b,0x7a,0x07,0x07,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x14,0x00,0x2b,0x40,0x16,0x07,0x00,0x00,0x16,0x0d,0x06,0x09,0x84,0x0b,0x0e,0x02,0xec,0x12,0x10,0x0c,0x0f,\r\n0x0a,0x1b,0x06,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x21,0x15,0x21,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2c,0x50,0x6a,0x8c,0x01,0x56,0xfe,0xaa,0xa4,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,\r\n0x03,0x5a,0x21,0xc5,0xac,0xfe,0x80,0x8a,0xfe,0x29,0x05,0xd7,0xd3,0x6e,0x77,0x0e,0x00,0x02,0x00,0x5a,0xff,0xe8,0x04,0x49,0x05,0x9a,0x00,0x1a,0x00,0x2b,0x00,0x4d,0x40,0x28,0x07,0x7d,0x18,0x0b,0x7d,0x1d,0x00,0x04,0x15,0x25,0x1d,0x18,0x1d,0x04,0x04,0x1d,0x18,0x03,0x2d,0x28,0x7d,0x01,0x12,0x18,0x07,0x25,0x07,0x02,0x15,0x15,\r\n0x02,0x2b,0x91,0x0f,0x13,0x04,0x00,0x91,0x02,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x11,0x39,0x2f,0x12,0x39,0xcd,0x11,0x33,0x01,0x2f,0xc4,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x11,0x33,0x10,0xe9,0x10,0xe9,0x31,0x30,0x01,0x21,0x35,0x21,0x15,0x06,0x06,0x15,0x14,0x04,0x16,0x15,0x15,0x06,0x04,0x23,0x22,0x24,0x35,\r\n0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x12,0x36,0x35,0x34,0x26,0x2f,0x02,0x26,0x26,0x27,0x06,0x06,0x15,0x14,0x16,0x33,0x02,0x82,0xfe,0x27,0x03,0x4b,0x95,0xeb,0x01,0x31,0xa4,0x06,0xfe,0xe8,0xe5,0xdb,0xfe,0xef,0xc0,0xda,0x19,0x17,0x69,0xb6,0xb6,0x55,0x39,0x4b,0x3c,0x0e,0x19,0x0e,0xbe,0x87,0xa9,0x96,0x05,0x04,0x96,0x85,\r\n0x1a,0x90,0x52,0x52,0xce,0xcb,0x81,0x07,0xd0,0xee,0xed,0xc3,0x9d,0xee,0x61,0x21,0x53,0x23,0x46,0x7f,0xfb,0x9f,0xa1,0x8c,0x40,0x76,0x2d,0x3a,0x2d,0x0a,0x14,0x0c,0x5a,0xae,0x76,0x88,0x9b,0x00,0x00,0x02,0x00,0x59,0x00,0x00,0x04,0x48,0x05,0xb2,0x00,0x1d,0x00,0x2d,0x00,0x45,0x40,0x24,0x1b,0x7d,0x07,0x15,0x7d,0x2a,0x00,0x0f,\r\n0x07,0x2a,0x01,0x01,0x2a,0x07,0x03,0x2f,0x20,0x7d,0x04,0x0f,0x27,0x1b,0x07,0x07,0x18,0x18,0x03,0x2d,0x91,0x12,0x04,0x04,0x00,0x91,0x03,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0x39,0x11,0x33,0xcd,0x01,0x2f,0xc4,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x10,0xe9,0x10,0xe9,0x31,0x30,0x25,0x21,0x15,0x21,0x35,\r\n0x36,0x24,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x35,0x36,0x24,0x33,0x32,0x04,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x02,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x17,0x36,0x36,0x35,0x34,0x26,0x23,0x02,0x20,0x01,0xd9,0xfc,0xb5,0x7b,0x01,0x05,0x45,0x47,0x46,0x8f,0x74,0x06,0x01,0x17,0xe6,0xdb,0x01,0x11,0xc9,0xd1,\r\n0x19,0x17,0x69,0xb6,0xb6,0x60,0x9a,0x1c,0x0d,0x19,0x0e,0xbe,0x87,0xa9,0x96,0x96,0x96,0x85,0x12,0x93,0x57,0x2a,0x53,0x33,0x32,0x6a,0xb5,0x65,0x0d,0xcf,0xef,0xed,0xc3,0xa1,0xf0,0x5b,0x21,0x53,0x23,0x46,0x7f,0x04,0x61,0xa1,0x8c,0x41,0x85,0x6f,0x15,0x0a,0x14,0x0c,0x5a,0xae,0x76,0x88,0x9b,0x00,0x00,0x02,0x00,0x60,0xfe,0x39,\r\n0x04,0x3f,0x04,0x18,0x00,0x19,0x00,0x27,0x00,0x48,0x40,0x25,0x21,0x14,0x1c,0x17,0x84,0x07,0x11,0x83,0x24,0x00,0x0b,0x07,0x01,0x24,0x07,0x24,0x07,0x24,0x29,0x1c,0x83,0x04,0x0b,0x21,0x96,0x14,0x14,0x02,0x27,0x95,0x0e,0x10,0x04,0x00,0x95,0x02,0x1b,0x00,0x3f,0xed,0x32,0x3f,0xed,0x12,0x39,0x2f,0xed,0x01,0x2f,0xc4,0xe9,0x12,\r\n0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xe9,0x10,0xe9,0x11,0x39,0x39,0x31,0x30,0x01,0x21,0x15,0x21,0x35,0x36,0x36,0x35,0x34,0x24,0x26,0x35,0x34,0x24,0x33,0x32,0x04,0x15,0x14,0x02,0x07,0x16,0x16,0x15,0x14,0x06,0x02,0x06,0x15,0x14,0x16,0x1f,0x02,0x36,0x36,0x35,0x34,0x26,0x23,0x02,0x08,0x01,0xc0,0xfc,0xd3,0xd5,\r\n0xb0,0xfe,0xc2,0x82,0x01,0x1a,0xef,0xca,0x01,0x0c,0xd8,0xc6,0x14,0x11,0x6a,0x96,0xbe,0x5c,0x60,0x6a,0x1b,0xa7,0xa7,0xaa,0x8a,0xfe,0xc5,0x8c,0x47,0x61,0x97,0x4e,0x5b,0xd6,0xd0,0x86,0xd5,0xf6,0xef,0xc9,0xb2,0xfe,0xf7,0x5c,0x21,0x41,0x21,0x4d,0x8e,0x04,0xa2,0xa7,0x95,0x68,0x7f,0x4d,0x54,0x18,0x52,0xc8,0x95,0x8c,0xa1,0x00,\r\n0x00,0x01,0x00,0x20,0x00,0x00,0x03,0x08,0x05,0x9a,0x00,0x05,0x00,0x1a,0x40,0x0c,0x02,0x7e,0x03,0x03,0x07,0x05,0x03,0x12,0x05,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x01,0x2f,0x12,0x39,0x2f,0xe9,0x31,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x20,0x02,0xe8,0xa8,0xfd,0xc0,0x05,0x9a,0xfa,0x66,0x05,0x02,0x00,0x01,0x00,0xa6,0x00,0x00,\r\n0x01,0x4a,0x05,0xec,0x00,0x03,0x00,0x17,0x40,0x0a,0x00,0x84,0x01,0x01,0x04,0x05,0x02,0x00,0x01,0x15,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xe9,0x31,0x30,0x21,0x23,0x11,0x33,0x01,0x4a,0xa4,0xa4,0x05,0xec,0x00,0x00,0x01,0x00,0xbc,0xfe,0x29,0x05,0xfc,0x05,0xb2,0x00,0x1e,0x00,0x2e,0x40,0x18,0x00,0x7e,0x0d,0x06,0x0d,0x06,\r\n0x20,0x17,0x14,0x7e,0x15,0x19,0x10,0x91,0x1b,0x04,0x17,0x03,0x14,0x1b,0x03,0x91,0x0a,0x13,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x21,0x22,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,\r\n0x12,0x21,0x32,0x12,0x11,0x05,0x27,0x34,0x31,0x20,0x36,0x1a,0x18,0x44,0x1f,0x7e,0x84,0xfe,0x9f,0xc1,0xf9,0xa8,0xa8,0x06,0x9d,0x01,0x3f,0xe8,0xf9,0x01,0x21,0x5b,0x48,0x0e,0x0e,0x9e,0x0b,0x09,0x91,0x7f,0x02,0x3d,0x01,0xe5,0xfe,0xe5,0xd4,0xfa,0xfe,0x07,0x71,0xfe,0xfa,0x01,0x1e,0xfe,0xcd,0xfe,0xe3,0x00,0x00,0x01,0x00,0xa6,\r\n0xfe,0x29,0x04,0xb0,0x04,0x18,0x00,0x1e,0x00,0x2e,0x40,0x18,0x00,0x84,0x0d,0x06,0x0d,0x06,0x20,0x18,0x14,0x84,0x15,0x18,0x10,0x95,0x1b,0x10,0x17,0x0f,0x14,0x1b,0x03,0x95,0x0a,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x01,0x14,0x16,0x33,0x32,0x36,0x37,0x15,\r\n0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0xf8,0x2c,0x2c,0x16,0x34,0x16,0x17,0x39,0x19,0x73,0x80,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x01,0x14,0x5e,0x45,0x0a,0x0e,0x8d,0x0b,0x09,0x8d,0x83,0x01,0x50,0x01,0x46,0xb8,0x8e,0xfb,0xe1,\r\n0x05,0xd7,0xaa,0xc2,0xd8,0xce,0x00,0x01,0x00,0xbc,0xfe,0x29,0x02,0xf4,0x05,0xb2,0x00,0x11,0x00,0x21,0x40,0x10,0x0c,0x0c,0x13,0x04,0x00,0x83,0x01,0x04,0x0e,0xf4,0x08,0x01,0x03,0x00,0x00,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,\r\n0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x01,0x64,0xa8,0xa8,0x04,0x26,0x9b,0x61,0x23,0x34,0x13,0x2f,0x57,0x78,0x92,0xfe,0x29,0x07,0x71,0xcd,0x6b,0x7a,0x07,0x07,0xb4,0x21,0xd1,0xc8,0x00,0x00,0x01,0x00,0xa6,0xfe,0x29,0x02,0xbc,0x04,0x12,0x00,0x10,0x00,0x21,0x40,0x10,0x00,0x00,0x12,0x0b,0x06,0x84,0x07,0x0a,0x02,0xec,0x0e,0x10,\r\n0x09,0x0f,0x06,0x1b,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x01,0x2f,0xe1,0x32,0x11,0x39,0x2f,0x31,0x30,0x01,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x02,0xbc,0x2c,0x50,0x6a,0x8c,0xa4,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,0x03,0x5a,0x21,0xc5,0xac,0xfc,0x1f,0x05,0xd7,0xd3,0x6e,0x77,0x0e,0x00,\r\n0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0xb9,0x05,0x9b,0x00,0x1e,0x00,0x2f,0x40,0x17,0x1d,0x19,0x12,0x08,0x12,0x08,0x20,0x1e,0x0c,0x7d,0x19,0x13,0x12,0x12,0x0f,0x91,0x16,0x13,0x09,0x1d,0x91,0x00,0x03,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x2f,0x33,0x01,0x2f,0xe1,0xc4,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x33,0x32,\r\n0x37,0x21,0x32,0x17,0x33,0x15,0x21,0x22,0x00,0x15,0x14,0x00,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x20,0x00,0x11,0x34,0x12,0x36,0x37,0x21,0x6b,0xe6,0x64,0x4f,0x01,0xc6,0x32,0x3a,0x83,0xfe,0x88,0xe7,0xfe,0xb4,0x01,0x20,0xe9,0x57,0xa6,0x78,0x50,0xc0,0x6a,0xfe,0xc4,0xfe,0x88,0x84,0xad,0x35,0xfe,0xa7,0x05,0x9a,0x01,0x01,\r\n0x97,0xfe,0xa4,0xeb,0xfa,0xfe,0xbd,0x28,0x38,0xa3,0x2a,0x2a,0x01,0x88,0x01,0x42,0x91,0x01,0x18,0x96,0x12,0x00,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x98,0x04,0x00,0x00,0x17,0x00,0x2d,0x40,0x16,0x16,0x13,0x0c,0x02,0x0c,0x02,0x19,0x17,0x06,0x83,0x13,0x0c,0x0c,0x09,0x95,0x10,0x16,0x03,0x16,0x95,0x00,0x0f,0x00,0x3f,0xed,0x32,\r\n0x3f,0xed,0x32,0x2f,0x01,0x2f,0xe9,0xc6,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x31,0x30,0x13,0x21,0x15,0x21,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x00,0x35,0x34,0x36,0x37,0x23,0x60,0x03,0x38,0xfe,0xe3,0x9c,0xbf,0xbd,0x93,0x44,0x7f,0x44,0x45,0x82,0x44,0xdd,0xfe,0xe7,0x72,0x5a,0xe2,0x04,0x00,\r\n0x89,0xda,0xaf,0xa1,0xdc,0x2b,0x30,0x9c,0x29,0x1f,0x01,0x16,0xdf,0x95,0xcc,0x39,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xf2,0x05,0x9a,0x00,0x09,0x00,0x25,0x40,0x12,0x08,0x7e,0x01,0x07,0x07,0x0b,0x04,0x7e,0x03,0x02,0x91,0x05,0x05,0x07,0x03,0x03,0x00,0x12,0x00,0x3f,0x3f,0x33,0x39,0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0x33,\r\n0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0x4a,0xfc,0x72,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0x03,0x0c,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x00,0x00,0x02,0xff,0xe5,0xfe,0x1e,0x03,0x30,0x05,0xec,0x00,0x22,0x00,0x2c,0x00,0x55,0x40,0x2c,0x00,0x08,0x84,0x12,0x23,0x20,0x12,0x0c,0x04,0x12,0x04,0x12,0x04,0x2e,\r\n0x28,0xef,0x1a,0x07,0x17,0x96,0x04,0x03,0x2b,0x00,0x2b,0x25,0x96,0x1d,0x20,0x1d,0x20,0x2b,0x01,0x2b,0x1d,0x2b,0x1d,0x0f,0x21,0x00,0x0a,0x95,0x0f,0x1c,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x11,0x33,0x10,0xc4,0x32,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xc6,0x11,0x33,0x33,\r\n0x10,0xe9,0x32,0x31,0x30,0x01,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x11,0x14,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x35,0x11,0x07,0x22,0x07,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x03,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x02,0x16,0x3c,0x75,0x3c,0x3c,0x75,0x3c,0xac,0x3c,0x32,0x29,0x4d,0x8e,\r\n0xba,0x15,0x0c,0x0d,0x2e,0x8d,0xa4,0x85,0x6a,0x25,0x53,0x26,0xa4,0xa4,0x04,0x8f,0x2a,0x39,0x4d,0x61,0x25,0x03,0x8b,0x1a,0x49,0x34,0xa6,0x2a,0x3f,0x17,0xfc,0x8d,0xdf,0x1a,0x93,0x13,0xc0,0xa1,0x03,0x51,0x02,0x01,0x01,0x81,0x73,0x65,0x7b,0x16,0x22,0x01,0x84,0xfd,0x6a,0xc4,0x30,0x2a,0x3a,0x36,0x00,0x01,0x00,0xbc,0xfe,0x7f,\r\n0x06,0x00,0x05,0x9a,0x00,0x1a,0x00,0x38,0x40,0x1c,0x12,0x0c,0x7e,0x0b,0x0e,0x7f,0x10,0x0b,0x10,0x0b,0x10,0x1c,0x02,0x1a,0x7e,0x00,0x15,0x06,0x01,0x1a,0x10,0x0d,0x91,0x12,0x12,0x0b,0x01,0x03,0x00,0x3f,0x33,0x3f,0xed,0xce,0x33,0x12,0x39,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x33,0x31,0x30,\r\n0x33,0x11,0x33,0x01,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x01,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0xbc,0xda,0x02,0xce,0x17,0x1c,0x07,0x04,0x05,0x05,0xa8,0xc0,0x9b,0xf3,0xfd,0x1e,0x1b,0x13,0x06,0x04,0x04,0x05,0x9a,0xfb,0x9b,0x23,0x30,0x0d,0x1f,0x68,0x4c,0x03,0xf2,0xfa,0xfe,0xfd,0xe7,\r\n0x01,0x81,0x04,0x77,0x2a,0x30,0x17,0x61,0x4d,0xfb,0xf4,0x00,0x00,0x01,0x00,0xa6,0xfe,0x8b,0x04,0x8f,0x04,0x18,0x00,0x16,0x00,0x35,0x40,0x1b,0x13,0x84,0x01,0x15,0xed,0x16,0x01,0x16,0x01,0x16,0x18,0x0b,0x08,0x84,0x09,0x0c,0x04,0x0f,0x10,0x0a,0x0f,0x08,0x15,0x16,0x13,0x01,0x15,0x00,0x3f,0xcd,0xce,0x3f,0x3f,0x3f,0xcd,0x32,\r\n0x01,0x2f,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x21,0x23,0x11,0x10,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x11,0x23,0x04,0x02,0xae,0xee,0x7a,0xa2,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x97,0x8d,0x02,0x48,0x01,0x46,0xb8,0x8e,0xfd,0xb8,0x04,0x00,0xaa,\r\n0xc2,0xd8,0xce,0xfe,0x19,0xfe,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x00,0x1b,0x00,0x3e,0x40,0x1f,0x15,0x06,0x06,0x1d,0x1a,0x01,0x7d,0x0f,0x0d,0x0c,0x14,0x15,0x15,0x17,0x91,0x12,0x01,0x0c,0x91,0x1a,0x0f,0x0f,0x12,0x04,0x07,0x06,0x06,0x04,0x91,0x09,0x13,0x00,0x3f,0xed,0x32,0x2f,0x33,0x3f,0x39,0x2f,\r\n0x33,0xed,0x32,0x10,0xed,0x32,0x2f,0x33,0x01,0x2f,0xcd,0x33,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x01,0x21,0x16,0x00,0x33,0x32,0x37,0x15,0x06,0x23,0x20,0x00,0x03,0x23,0x35,0x33,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x21,0x02,0xa2,0xfe,0x6e,0x10,0x01,0x18,0xde,0xd8,0x9e,0x9f,0xed,0xfe,0xdc,0xfe,0x93,\r\n0x10,0x5f,0x62,0x1d,0x01,0x91,0x01,0x2a,0xcb,0x87,0x9b,0xb9,0xe3,0xfe,0xd6,0x19,0x01,0x90,0x02,0x7d,0xe7,0xfe,0xe9,0x60,0xa3,0x54,0x01,0x6b,0x01,0x2a,0x9b,0x01,0x25,0x01,0x75,0x3b,0xb3,0x56,0xfe,0xe8,0xea,0x00,0x00,0x01,0x00,0x00,0xff,0xe8,0x03,0x62,0x04,0x18,0x00,0x1b,0x00,0x32,0x40,0x19,0x07,0x14,0x14,0x1d,0x0c,0x0f,\r\n0x83,0x01,0x00,0x1a,0x0f,0x1a,0x95,0x0c,0x00,0x00,0x04,0x12,0x95,0x17,0x16,0x09,0x95,0x04,0x10,0x00,0x3f,0xed,0x3f,0xed,0x11,0x39,0x2f,0x33,0xed,0x32,0x01,0x2f,0xcd,0x33,0xe9,0x32,0x12,0x39,0x2f,0x33,0x31,0x30,0x11,0x33,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x15,\r\n0x06,0x23,0x22,0x00,0x27,0x23,0x68,0x1f,0x01,0x15,0xd8,0x85,0x69,0x73,0x81,0x89,0xbc,0x19,0x01,0x36,0xfe,0xc3,0x09,0xbc,0x96,0x85,0x77,0x77,0xa1,0xd5,0xfe,0xf5,0x08,0x60,0x02,0x5c,0xc6,0xf6,0x32,0xa8,0x50,0xac,0x86,0x8b,0xa5,0xba,0x59,0x9c,0x47,0x01,0x0d,0xdc,0x00,0x01,0x00,0x01,0xff,0xe8,0x05,0x1a,0x05,0xb2,0x00,0x1f,\r\n0x00,0x78,0x40,0x2b,0x19,0x19,0x00,0x00,0x0b,0x7e,0x06,0x08,0x06,0x08,0x06,0x21,0x1e,0x01,0x7e,0x13,0x10,0x19,0x19,0x1b,0x91,0x16,0x10,0x01,0x11,0x00,0x00,0x1f,0x08,0x91,0x13,0x1e,0x12,0x1f,0x12,0x11,0x1f,0x16,0x11,0xc0,0x09,0x01,0x09,0xb8,0xff,0xc0,0xb3,0x0f,0x13,0x48,0x09,0xb8,0xff,0xc0,0x40,0x0d,0x0a,0x0d,0x48,0x09,\r\n0x09,0x16,0x04,0x0b,0x06,0x04,0x91,0x0d,0x13,0x00,0x3f,0xed,0x32,0x32,0x3f,0x39,0x2f,0x2b,0x2b,0x5d,0x39,0x12,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0xed,0x11,0x33,0x11,0x12,0x39,0x39,0x10,0xed,0x32,0x2f,0x01,0x2f,0x33,0xe9,0x32,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x32,0x2f,0x32,0x2f,0x31,0x30,0x01,0x01,0x16,0x00,0x33,0x32,\r\n0x37,0x11,0x21,0x35,0x21,0x11,0x06,0x21,0x20,0x00,0x03,0x07,0x35,0x37,0x12,0x00,0x21,0x32,0x17,0x15,0x26,0x23,0x22,0x00,0x07,0x01,0x05,0x1a,0xfb,0xf6,0x13,0x01,0x19,0xe5,0xa9,0x7a,0xfe,0xc6,0x01,0xe2,0xd9,0xfe,0xf9,0xfe,0xe7,0xfe,0x92,0x20,0x64,0x5d,0x0b,0x01,0xa2,0x01,0x3b,0xeb,0x9e,0xaf,0xed,0xe2,0xfe,0xd5,0x14,0x04,\r\n0x08,0x03,0xe0,0xfe,0x9c,0xed,0xfe,0xf0,0x43,0x01,0x92,0x98,0xfd,0x76,0x7a,0x01,0x4c,0x01,0x0d,0x22,0x9a,0x20,0x01,0x41,0x01,0x98,0x4c,0xba,0x6e,0xfe,0xdc,0xe0,0x01,0x64,0x00,0x03,0x00,0x00,0xfe,0x1e,0x04,0x81,0x04,0x18,0x00,0x21,0x00,0x29,0x00,0x31,0x00,0x60,0x40,0x34,0x22,0x2a,0x84,0x0d,0x0b,0x00,0x0e,0x1b,0x1b,0x19,\r\n0x1d,0x84,0x2b,0x29,0x16,0x04,0x00,0x02,0x95,0x1f,0x1b,0x17,0x0f,0x15,0x2e,0x95,0x1c,0x29,0x22,0x0b,0x04,0x0c,0x1b,0x1b,0x19,0x2a,0x0e,0x03,0x0d,0x1a,0x0d,0x0c,0x1a,0x0c,0x08,0x13,0x10,0x05,0x25,0x95,0x08,0x16,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0xed,0x32,0x3f,\r\n0x3f,0xed,0x32,0x01,0x2f,0x33,0x33,0x33,0xf9,0x32,0xc2,0x2f,0x2f,0xc4,0x33,0xcd,0xe9,0x32,0x31,0x30,0x17,0x16,0x33,0x20,0x11,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x07,0x35,0x37,0x26,0x35,0x10,0x12,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x37,0x15,0x07,0x11,0x10,0x21,0x22,0x27,0x13,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x05,0x25,\r\n0x26,0x26,0x23,0x22,0x06,0x15,0xa8,0xac,0x9e,0x01,0x7a,0x04,0x75,0xeb,0x96,0xd0,0x29,0x79,0x62,0x02,0xfa,0xdb,0xcf,0x64,0x04,0xa4,0x71,0x71,0xfd,0xe4,0xbe,0x8e,0x72,0x1e,0x91,0x6c,0x8a,0xad,0xfd,0x9c,0x02,0x5c,0x16,0x97,0x6b,0x99,0xab,0xf6,0x60,0x01,0x92,0x70,0xc4,0xa8,0x8e,0x29,0x8e,0x21,0x0e,0x1e,0x01,0x14,0x01,0x34,\r\n0xa6,0x8e,0xfe,0xe9,0x27,0x8e,0x27,0xfd,0xf7,0xfd,0xcc,0x48,0x02,0xf0,0x67,0x7d,0xc4,0x99,0x53,0x45,0xd1,0x5c,0x84,0xdf,0xc5,0x00,0x00,0x02,0x00,0x12,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x17,0x00,0x1d,0x00,0x57,0x40,0x2f,0x0b,0x10,0x0d,0x09,0x0a,0x0a,0x11,0x10,0x10,0x1f,0x13,0x04,0x19,0x7e,0x17,0x01,0x15,0x0f,0x12,0x13,\r\n0x16,0x04,0x17,0x0e,0x0e,0x0c,0x1a,0x19,0x01,0x04,0x00,0x0d,0x00,0x17,0x17,0x18,0x0b,0x04,0x0d,0x05,0x02,0x11,0x15,0x12,0x09,0x02,0x03,0x00,0x3f,0x33,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0x33,0xc6,0xed,0x32,0x32,0x11,0x33,0x2f,0x33,0x33,0x2f,0x33,0x33,0x11,0x39,0x31,\r\n0x30,0x13,0x37,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x17,0x25,0x15,0x05,0x01,0x23,0x01,0x07,0x11,0x23,0x11,0x07,0x01,0x15,0x37,0x27,0x26,0x27,0x12,0xaa,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0x81,0x01,0xfb,0xfe,0x6a,0x01,0xac,0xea,0xfe,0x97,0xeb,0xa8,0xaa,0x01,0x52,0x89,0x5f,0x1e,0x08,0x01,0x7c,\r\n0x3a,0x03,0xe4,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0x93,0xaf,0x96,0x8c,0xfe,0x1c,0x01,0xab,0x51,0xfe,0xa6,0x01,0x20,0x3a,0x01,0xdc,0xd2,0x2f,0x71,0x24,0x0e,0x00,0x00,0x02,0x00,0x26,0x00,0x00,0x03,0xf8,0x05,0xec,0x00,0x14,0x00,0x18,0x00,0x54,0x40,0x2e,0x12,0x11,0x15,0x0e,0x06,0x84,0x0b,0x09,0x07,0x14,0x10,0x11,\r\n0x11,0x03,0x02,0x01,0x04,0x05,0x08,0x04,0x09,0x00,0x00,0x13,0x16,0x15,0x0b,0x04,0x0a,0x14,0x0a,0x09,0x09,0x17,0x12,0x0e,0x14,0x05,0x07,0x10,0x0f,0x0c,0x00,0x03,0x07,0x15,0x00,0x3f,0x33,0x3f,0x3f,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0xce,0x33,0xe9,\r\n0x32,0x32,0x11,0x39,0x31,0x30,0x01,0x05,0x01,0x23,0x01,0x07,0x15,0x23,0x35,0x07,0x35,0x37,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x17,0x25,0x05,0x37,0x27,0x23,0x03,0xea,0xfe,0xc2,0x01,0x4c,0xe6,0xfe,0xf7,0xbf,0xa4,0x80,0x80,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0x4d,0x01,0xa5,0xfd,0x60,0x5c,0x58,0x04,0x01,0xc5,0x6d,0xfe,0xa8,\r\n0x01,0x20,0x42,0xde,0xa6,0x2c,0x8e,0x2c,0x04,0xb8,0xfc,0x3f,0x01,0xd5,0xfe,0x12,0x50,0x91,0xe7,0x20,0x60,0x00,0x00,0x03,0x00,0x12,0x00,0x00,0x05,0xea,0x05,0x9a,0x00,0x13,0x00,0x1c,0x00,0x26,0x00,0x58,0x40,0x31,0x0c,0x08,0x0a,0x0a,0x08,0x7e,0x25,0x07,0x07,0x28,0x18,0x04,0x11,0x7e,0x02,0x00,0x12,0x0c,0x25,0x26,0x0f,0x10,\r\n0x13,0x06,0x00,0x0b,0x0b,0x06,0x09,0x01,0x0a,0x01,0x00,0x20,0x00,0x02,0x18,0x19,0x05,0x0a,0x14,0x08,0x03,0x0e,0x12,0x12,0x07,0x03,0x03,0x00,0x3f,0x33,0x3f,0x33,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0xce,0x33,0xe9,0x32,0x32,0x12,0x39,0x2f,0x33,0xf9,0xca,0x2f,0x11,0x33,0x31,0x30,\r\n0x13,0x35,0x37,0x11,0x33,0x01,0x25,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x23,0x01,0x05,0x11,0x23,0x11,0x13,0x16,0x16,0x15,0x11,0x25,0x03,0x26,0x27,0x01,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x05,0x12,0xaa,0xda,0x01,0x90,0x01,0x72,0xa8,0xaa,0xaa,0xce,0xfe,0x6a,0xfe,0x88,0xa8,0xa0,0x04,0x04,0x01,0x26,0xfa,0x1b,0x13,0x03,\r\n0x02,0x17,0x1c,0x07,0x04,0x05,0x05,0xfe,0xde,0x01,0x82,0x9a,0x3a,0x03,0x44,0xfd,0x8e,0x7e,0x01,0xf4,0xfe,0x45,0x3a,0x9a,0x3a,0xfc,0xbb,0x02,0x75,0x80,0xfe,0x0b,0x01,0xbc,0x03,0x15,0x17,0x61,0x4d,0xfe,0x83,0x64,0x01,0x84,0x2a,0x30,0xfc,0x64,0x23,0x30,0x0d,0x1f,0x68,0x4c,0x01,0x64,0x63,0x00,0x00,0x02,0x00,0x19,0x00,0x00,\r\n0x04,0x86,0x04,0x18,0x00,0x15,0x00,0x1c,0x00,0x55,0x40,0x2e,0x17,0x0d,0x06,0x84,0x0b,0x09,0x07,0x14,0x02,0x00,0x00,0x02,0x84,0x18,0x03,0x0f,0x1a,0x95,0x01,0x04,0x05,0x03,0x09,0x00,0x00,0x14,0x18,0x17,0x0b,0x04,0x0a,0x15,0x0a,0x09,0x09,0x08,0x15,0x03,0x06,0x11,0x10,0x0d,0x0f,0x03,0x06,0x15,0x00,0x3f,0x33,0x3f,0x3f,0x12,\r\n0x17,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0xed,0x32,0x01,0x2f,0x33,0xf9,0xca,0x2f,0x11,0x33,0x2f,0xce,0x33,0xe9,0x32,0x32,0x31,0x30,0x01,0x07,0x11,0x23,0x11,0x05,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x17,0x37,0x05,0x15,0x25,0x26,0x23,0x22,0x06,0x04,0x86,0x8e,0xa4,\r\n0xfd,0xf6,0xa4,0x8d,0x8d,0xa4,0x04,0x74,0xdc,0x93,0xad,0x14,0x94,0xfc,0xc4,0x02,0x05,0x1d,0xcc,0x7a,0xa2,0x02,0x78,0x30,0xfd,0xb8,0x02,0x10,0xb4,0xfe,0xa4,0x01,0x23,0x30,0x8e,0x30,0x02,0x4f,0xaa,0xc2,0xa6,0x9e,0x32,0xbe,0x5e,0xb2,0xf2,0xb8,0x00,0x03,0x00,0x12,0x00,0x00,0x04,0xc0,0x05,0x9a,0x00,0x1d,0x00,0x24,0x00,0x2a,\r\n0x00,0x65,0x40,0x35,0x0f,0x22,0x1c,0x15,0x14,0x09,0x09,0x14,0x14,0x2c,0x07,0x0c,0x27,0x23,0x26,0x1e,0x1b,0x7e,0x02,0x00,0x1c,0x0a,0x23,0x24,0x1d,0x04,0x00,0x09,0x09,0x07,0x27,0x26,0x02,0x04,0x01,0x08,0x01,0x00,0x0f,0x1e,0x91,0x08,0x00,0x1a,0x1a,0x03,0x15,0x1b,0x12,0x25,0x91,0x03,0x03,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,\r\n0x2f,0x39,0x39,0xed,0x39,0x11,0x33,0x11,0x12,0x17,0x39,0x33,0x11,0x12,0x17,0x39,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x2f,0x33,0xc1,0x32,0x11,0x33,0x2f,0x33,0x2f,0x11,0x33,0x12,0x39,0x39,0x31,0x30,0x13,0x35,0x37,0x11,0x21,0x32,0x16,0x17,0x37,0x15,0x07,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x17,0x01,0x23,0x03,0x26,0x26,\r\n0x23,0x23,0x11,0x23,0x11,0x17,0x33,0x32,0x36,0x35,0x35,0x05,0x11,0x11,0x25,0x26,0x26,0x23,0x12,0xaa,0x01,0xac,0x84,0xcd,0x35,0xbc,0x91,0x03,0xa7,0x97,0x2f,0x4d,0x59,0x01,0x0d,0xc8,0xf0,0x47,0x7b,0x58,0x8a,0xa8,0xa8,0xe4,0x81,0xa3,0xfd,0xf8,0x01,0xdb,0x23,0x7b,0x57,0x02,0xf4,0x9a,0x3a,0x01,0xd2,0x5d,0x5f,0x40,0x9a,0x31,\r\n0x1b,0x1c,0x90,0xcb,0x27,0x04,0x15,0x44,0x8e,0xfe,0x51,0x01,0x92,0x79,0x57,0xfd,0x9e,0x03,0x2e,0x34,0x97,0x7d,0x0a,0xb1,0x01,0x9b,0xfe,0xff,0xa1,0x2f,0x31,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0xbc,0x04,0x12,0x00,0x17,0x00,0x48,0x40,0x23,0x17,0x11,0x11,0x19,0x16,0x09,0x02,0x84,0x07,0x05,0x03,0x11,0x11,0x0b,0x13,0x0e,\r\n0x10,0x04,0x01,0x05,0x00,0x00,0x07,0x16,0x06,0x17,0x06,0x05,0x17,0x05,0x03,0x08,0x0f,0x03,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0x3f,0xcd,0x32,0x32,0x2f,0x01,0x2f,0xc6,0x33,0xe9,0x32,0x32,0x11,0x39,0x2f,0x33,0x31,0x30,0x01,0x05,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x33,\r\n0x15,0x33,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x25,0x02,0xa4,0xfe,0xa6,0xa4,0x83,0x83,0xa4,0x04,0x25,0x8f,0x58,0x3e,0x24,0x2c,0x50,0x69,0x8d,0x01,0x5a,0x02,0x20,0xa1,0xfe,0x81,0x01,0x33,0x3c,0x92,0x3c,0x02,0x3b,0xd3,0x6e,0x77,0x0e,0xaa,0x21,0xc5,0xa5,0xa1,0x00,0x00,0x01,0x00,0x45,0xff,0xe8,0x04,0x06,\r\n0x05,0xb2,0x00,0x2a,0x00,0x5b,0x40,0x31,0x0f,0x7d,0x00,0x04,0x15,0x15,0x19,0x7d,0x26,0x04,0x26,0x0a,0x0a,0x26,0x04,0x03,0x2c,0x20,0x1f,0x20,0x29,0x16,0x2a,0x15,0x15,0x01,0x13,0x00,0x14,0x00,0x2a,0x26,0x19,0x2a,0x14,0x04,0x0f,0x06,0x07,0x23,0x91,0x1c,0x13,0x09,0x0a,0x0c,0x91,0x07,0x04,0x00,0x3f,0xed,0xcd,0x32,0x3f,0xed,\r\n0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xc4,0x32,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xf9,0xc2,0x2f,0x10,0xc6,0xe9,0x31,0x30,0x13,0x25,0x26,0x26,0x35,0x34,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x25,0x15,0x05,0x16,0x16,0x15,0x14,0x04,0x23,0x22,0x26,\r\n0x27,0x35,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x05,0x45,0x01,0x2b,0x86,0x6f,0x01,0x1b,0xd7,0xd3,0x62,0x7f,0xc7,0x8a,0xa7,0x54,0x8e,0x3f,0x01,0xba,0xfe,0xf0,0x7b,0x6d,0xfe,0xf2,0xf0,0x52,0xe2,0x33,0x40,0xe2,0x5f,0x9c,0x98,0x62,0xaf,0xfe,0x28,0x02,0x6f,0x66,0x4d,0xa4,0x6d,0xae,0xd1,0x33,0xbd,0x58,0x74,0x64,0x4d,\r\n0x68,0x4d,0x1f,0x97,0x96,0x5d,0x4f,0xa8,0x64,0xba,0xc8,0x2f,0x23,0xc6,0x39,0x48,0x72,0x6d,0x4a,0x79,0x59,0xa1,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x2b,0x04,0x18,0x00,0x27,0x00,0x63,0x40,0x35,0x26,0x01,0x04,0x22,0x83,0x13,0x17,0x04,0x83,0x0e,0x27,0x1d,0x14,0x11,0x0e,0x17,0x0e,0x1d,0x1d,0x0e,0x17,0x03,0x29,0x09,0x1d,0x1f,\r\n0x95,0x11,0x01,0x12,0x00,0x00,0x14,0x26,0x13,0x27,0x13,0x12,0x0e,0x04,0x12,0x27,0x17,0x22,0x06,0x07,0x1a,0x10,0x0a,0x0c,0x95,0x07,0x16,0x00,0x3f,0xfd,0xc6,0x3f,0x12,0x17,0x39,0x11,0x33,0x11,0x12,0x39,0x39,0x33,0x11,0x12,0x39,0x39,0xfd,0xc6,0x01,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x39,0x10,0xc6,0x10,0xe9,0x10,\r\n0xc6,0xe9,0x11,0x39,0x39,0x31,0x30,0x01,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x26,0x27,0x05,0x35,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x25,0x03,0x2b,0x9e,0x3f,0x43,0xe2,0xb3,0x9f,0x73,0x85,0xa2,0xd8,0x41,0x68,0xfe,0xa2,0xa7,\r\n0x53,0x4a,0xe2,0xa6,0x86,0x68,0x71,0x93,0x5b,0x6f,0x41,0x39,0x51,0x01,0x4e,0x02,0x2a,0x37,0x27,0x6a,0x50,0x89,0xa1,0x3d,0xb0,0x63,0x90,0x33,0x4d,0x2a,0x78,0x8e,0x39,0x2d,0x74,0x54,0x84,0xa4,0x2e,0xa6,0x4a,0x50,0x40,0x3b,0x45,0x18,0x21,0x73,0x00,0x01,0xff,0xac,0x00,0x00,0x05,0x44,0x05,0x9a,0x00,0x17,0x00,0x39,0x40,0x1e,\r\n0x17,0x7e,0x14,0x00,0x00,0x04,0x19,0x09,0x7e,0x0e,0x13,0x03,0x7e,0x04,0x15,0x03,0x02,0x91,0x13,0x0b,0x0b,0x04,0x06,0x91,0x11,0x03,0x04,0x12,0x00,0x12,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0x2f,0xed,0x3f,0x01,0x2f,0xed,0x32,0xd4,0xe9,0x11,0x12,0x39,0x2f,0x33,0xe9,0x31,0x30,0x21,0x11,0x21,0x11,0x23,0x11,0x23,0x22,0x06,\r\n0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x21,0x11,0x33,0x11,0x04,0x9c,0xfd,0x1a,0xa8,0x18,0x51,0x59,0x14,0x9e,0x16,0xc8,0x9a,0xa8,0x02,0xe6,0xa8,0x02,0x8e,0xfd,0x72,0x05,0x02,0x5c,0x4e,0x36,0x34,0x36,0x44,0x88,0xaa,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x00,0x02,0x00,0x19,0x02,0x9a,0x03,0x4b,0x05,0x9a,0x00,0x13,\r\n0x00,0x17,0x00,0x5d,0xb3,0x0a,0x0a,0x08,0x0c,0xb8,0x01,0x0c,0xb7,0x14,0x05,0x0d,0x0d,0x19,0x17,0x04,0x10,0xb8,0x01,0x0c,0xb3,0x13,0x01,0x11,0x0f,0xb8,0x01,0x0e,0x40,0x0a,0x30,0x17,0x40,0x17,0x02,0x17,0x17,0x00,0x0d,0x11,0xb8,0x01,0x0a,0xb2,0x16,0x0b,0x13,0xb8,0x01,0x0e,0xb4,0x08,0x04,0x00,0x06,0x02,0xb8,0x01,0x06,0x00,\r\n0x3f,0x33,0xde,0x32,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x5d,0xed,0x01,0x2f,0x33,0xce,0xe1,0x32,0x32,0x12,0x39,0x2f,0x33,0x33,0xf1,0x32,0xca,0x2f,0x31,0x30,0x13,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x23,0x05,0x35,0x21,0x15,0x19,0x62,0x83,0x01,0x68,0x84,0x61,\r\n0x61,0x84,0xfe,0x98,0x83,0x62,0x02,0x4d,0xfe,0x98,0x05,0x2b,0x6f,0x6f,0x6f,0x6f,0x70,0xfd,0xdf,0x01,0x4e,0xfe,0xb2,0x02,0x21,0x63,0x63,0x63,0x00,0x03,0x00,0x3e,0x02,0x89,0x03,0xf6,0x04,0xcf,0x00,0x1f,0x00,0x2b,0x00,0x30,0x00,0x7a,0xb3,0x15,0x02,0x30,0x0b,0xb8,0x01,0x0c,0xb2,0x22,0x0f,0x0a,0xb8,0x01,0x0c,0xb6,0x2c,0x22,\r\n0x2c,0x22,0x2c,0x32,0x28,0xb8,0x01,0x0c,0xb2,0x1c,0x02,0x25,0xbb,0x01,0x0d,0x00,0x1f,0x00,0x0b,0x01,0x0d,0x40,0x0e,0x0c,0x30,0x1c,0x30,0x2c,0x30,0x03,0x30,0x0f,0x30,0x0f,0x1f,0x0d,0x2e,0x41,0x0d,0x01,0x0d,0x00,0x06,0x00,0x1f,0x01,0x09,0x00,0x15,0x00,0x2b,0x01,0x0d,0x00,0x19,0x00,0x0d,0x01,0x0d,0x00,0x12,0x00,0x19,0x01,\r\n0x0b,0x00,0x3f,0xd4,0xed,0x10,0xed,0x32,0x3f,0xd4,0xed,0x11,0x12,0x39,0x39,0x2f,0x2f,0x5d,0xed,0x10,0xed,0x32,0x01,0x2f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xfd,0xc6,0x10,0xed,0x32,0x39,0x39,0x31,0x30,0x00,0x16,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x23,0x06,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x12,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x25,0x26,0x23,0x22,0x07,0x01,0x9f,0x71,0x2b,0x04,0x23,0x6a,0x37,0x71,0x82,0xfe,0x87,0x0b,0x99,0x5b,0x4f,0x48,0x78,0x3b,0x6c,0x29,0x04,0x26,0x71,0x48,0x7f,0x9b,0xa0,0x86,0x43,0x57,0x57,0x49,0x49,0x57,0x58,0x48,0x02,0x1d,\r\n0x02,0x78,0x78,0x0c,0x04,0xcf,0x2c,0x3c,0x36,0x32,0x92,0x7b,0x43,0x8f,0x35,0x6f,0x2d,0x2a,0x3c,0x30,0x36,0x9d,0x80,0x85,0xa4,0xfe,0x25,0x61,0x57,0x58,0x60,0x61,0x57,0x57,0x61,0xee,0x8a,0x8a,0x00,0x01,0x00,0x90,0xff,0xe8,0x06,0x3e,0x04,0x00,0x00,0x1f,0x00,0x3b,0x40,0x1f,0x1b,0x0b,0x84,0x08,0x08,0x1f,0x14,0x12,0x84,0x11,\r\n0x11,0x21,0x02,0x84,0x1f,0x1b,0x05,0x95,0x1d,0x16,0x15,0x0d,0x95,0x18,0x16,0x14,0x15,0x11,0x01,0x09,0x0f,0x00,0x3f,0x33,0x33,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xed,0x33,0x12,0x39,0x2f,0xe9,0x33,0x31,0x30,0x13,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x10,0x33,0x32,0x36,0x35,\r\n0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x26,0x27,0x06,0x23,0x20,0x11,0x90,0xa4,0x67,0x7e,0x68,0x94,0xa4,0xe9,0x6c,0x8c,0xa4,0xa4,0x04,0x6e,0xd0,0x6b,0x9a,0x1d,0x72,0xe2,0xfe,0xae,0x04,0x00,0xfd,0xb4,0xa8,0x9a,0xc1,0x85,0x02,0x48,0xfd,0xa0,0xfe,0xd2,0xb4,0x92,0x02,0x48,0xfc,0x00,0xa2,0xba,0x75,0x5f,0xd4,0x01,0xa1,\r\n0x00,0x01,0x00,0x54,0x00,0x00,0x03,0x2c,0x05,0x9a,0x00,0x09,0x00,0x29,0x40,0x14,0x02,0x7e,0x03,0x06,0x03,0x06,0x03,0x0b,0x09,0x04,0x91,0x07,0x07,0x00,0x03,0x12,0x08,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x01,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x31,0x30,0x13,0x21,0x11,0x23,0x11,0x21,0x35,0x21,0x11,\r\n0x21,0x54,0x02,0xd8,0xa8,0xfd,0xfa,0x02,0x06,0xfd,0xd0,0x05,0x9a,0xfa,0x66,0x02,0x7b,0x97,0x01,0xf0,0x00,0x02,0x00,0x52,0x00,0x00,0x03,0xbf,0x05,0x9a,0x00,0x0a,0x00,0x12,0x00,0x28,0x40,0x14,0x11,0x08,0x7e,0x09,0x09,0x14,0x0d,0x7d,0x03,0x0a,0x91,0x11,0x11,0x06,0x09,0x12,0x12,0x91,0x06,0x03,0x00,0x3f,0xed,0x3f,0x12,0x39,\r\n0x2f,0xed,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x33,0x31,0x30,0x01,0x22,0x00,0x35,0x34,0x36,0x33,0x21,0x11,0x23,0x11,0x03,0x20,0x11,0x14,0x16,0x33,0x33,0x11,0x02,0x5a,0xf0,0xfe,0xe8,0xff,0xe4,0x01,0x8a,0xa8,0xc5,0xfe,0xb0,0xb6,0xaf,0xb0,0x02,0x1e,0x01,0x05,0xcb,0xcd,0xdf,0xfa,0x66,0x02,0x1e,0x02,0xe4,0xfe,0xe4,0x92,0x9e,\r\n0x02,0x4c,0x00,0x01,0x00,0xbd,0x00,0x00,0x06,0x73,0x05,0x9a,0x00,0x1e,0x00,0x30,0x40,0x18,0x15,0x13,0x7e,0x05,0x00,0x0d,0x12,0x12,0x20,0x1d,0x01,0x7e,0x00,0x0d,0x06,0x18,0x03,0x15,0x1d,0x12,0x12,0x09,0x00,0x03,0x00,0x3f,0x32,0x32,0x3f,0x33,0x17,0x39,0x01,0x2f,0xe9,0x32,0x12,0x39,0x2f,0x39,0x12,0x39,0xe9,0x33,0x31,0x30,\r\n0x13,0x33,0x11,0x14,0x06,0x07,0x33,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x33,0x11,0x23,0x01,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0xbd,0xa7,0x07,0x07,0x04,0x18,0x13,0x01,0xea,0x52,0x01,0xe9,0x14,0x17,0x04,0x04,0x04,0xa2,0xde,0xfe,0x48,0x33,0x0f,0x06,0x16,0x22,0x0d,0xfe,0x3f,0xd2,0x05,0x9a,0xfc,\r\n0x3e,0x39,0x8b,0x53,0x63,0x28,0x04,0x4e,0xfb,0xba,0x2e,0x65,0x2b,0x8b,0x63,0x03,0xc0,0xfa,0x66,0x03,0xe8,0x74,0x38,0x3c,0x57,0x1d,0xfc,0x1c,0x00,0x01,0x00,0xbc,0xfe,0x29,0x01,0x64,0x05,0x9a,0x00,0x03,0x00,0x17,0x40,0x0a,0x00,0x7e,0x01,0x01,0x04,0x05,0x02,0x03,0x01,0x1b,0x00,0x3f,0x3f,0x11,0x12,0x01,0x39,0x2f,0xe9,0x31,\r\n0x30,0x01,0x23,0x11,0x33,0x01,0x64,0xa8,0xa8,0xfe,0x29,0x07,0x71,0x00,0x00,0x01,0x00,0x1a,0x00,0x00,0x09,0x12,0x05,0x9a,0x00,0x27,0x00,0x48,0x40,0x25,0x0c,0x0b,0x04,0x00,0x0f,0x15,0x14,0x24,0x1f,0x1e,0x18,0x18,0x24,0x0f,0x04,0x04,0x0a,0x1d,0x1d,0x29,0x27,0x10,0x0a,0x0f,0x18,0x04,0x23,0x04,0x09,0x1c,0x14,0x0b,0x03,0x1f,\r\n0x00,0x09,0x12,0x00,0x3f,0x33,0x33,0x3f,0x33,0x33,0x12,0x17,0x39,0x01,0x2f,0x2f,0x33,0x11,0x33,0x2f,0x12,0x17,0x39,0x11,0x33,0x33,0x11,0x33,0x33,0x11,0x33,0x11,0x33,0x33,0x31,0x30,0x21,0x01,0x27,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x16,0x17,0x33,0x36,0x37,\r\n0x01,0x33,0x01,0x23,0x01,0x26,0x26,0x27,0x23,0x06,0x07,0x01,0x03,0x70,0xfe,0xcc,0x13,0x0a,0x03,0x04,0x03,0x12,0x0a,0xfe,0xd7,0xb6,0x01,0xb2,0xb9,0x01,0x31,0x13,0x05,0x05,0x02,0x10,0x0d,0x01,0x3d,0xa1,0x01,0x30,0x10,0x08,0x04,0x04,0x17,0x01,0x25,0xb6,0xfe,0x6b,0xc5,0xfe,0xd9,0x0a,0x0b,0x02,0x04,0x06,0x14,0xfe,0xd7,0x04,\r\n0x1a,0x46,0x23,0x25,0x25,0x46,0x23,0xfb,0xe6,0x05,0x9a,0xfb,0xb4,0x45,0x4b,0x1a,0x48,0x2e,0x04,0x4c,0xfb,0xac,0x39,0x4d,0x34,0x56,0x04,0x50,0xfa,0x66,0x04,0x18,0x22,0x48,0x28,0x47,0x49,0xfb,0xe6,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x06,0xd7,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,\r\n0x01,0x07,0x02,0x3a,0x04,0x37,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x11,0x2c,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x50,0xff,0xeb,0x06,0xd4,0x05,0xb0,0x00,0x27,0x0c,0xea,0x04,0x2e,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x06,0x00,0xf0,0x00,0x00,0x00,0x09,0xb3,0x01,0x00,0x1f,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,\r\n0x00,0x4a,0xff,0xec,0x09,0x19,0x05,0xb0,0x00,0x26,0x00,0xf0,0xfa,0x00,0x00,0x27,0x00,0xf0,0x04,0x00,0xfd,0xb9,0x00,0x27,0x0c,0xe1,0x06,0x74,0x00,0x00,0x01,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0x00,0x0e,0xb6,0x03,0x02,0x1a,0x2d,0x01,0x0d,0x2c,0x00,0x3f,0x35,0x3f,0x35,0x35,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xa3,0x05,0xb0,\r\n0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x02,0x39,0x04,0x19,0xfd,0xb9,0x01,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0x00,0x07,0xb2,0x01,0x30,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x8d,0xff,0xec,0x06,0xe5,0x05,0xae,0x00,0x26,0x00,0xf1,0x25,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x5b,0xfd,0xb9,\r\n0x00,0x07,0xb2,0x02,0x47,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x81,0xff,0xec,0x06,0xe5,0x05,0xae,0x00,0x26,0x00,0xf2,0x00,0x00,0x00,0x27,0x00,0xbc,0x03,0x01,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x5b,0xfd,0xb9,0x00,0x07,0xb2,0x02,0x48,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x2f,0xff,0xec,0x06,0xa3,0x05,0x9a,0x00,0x26,\r\n0x02,0x38,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x02,0x39,0x04,0x19,0xfd,0xb9,0x00,0x07,0xb2,0x03,0x39,0x2d,0x00,0x3f,0x35,0x00,0xff,0xff,0x00,0x50,0xff,0xec,0x06,0xb3,0x05,0xb0,0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xbf,0x00,0x00,0x01,0x07,0x0c,0xe7,0x04,0x0d,0x00,0x00,0x00,0x09,\r\n0xb3,0x03,0x02,0x2b,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x7b,0xff,0xec,0x06,0xed,0x05,0x9e,0x00,0x26,0x02,0x39,0x00,0x00,0x00,0x27,0x00,0xbc,0x02,0xf9,0x00,0x00,0x01,0x07,0x0c,0xe7,0x04,0x47,0x00,0x00,0x00,0x09,0xb3,0x03,0x02,0x43,0x2d,0x00,0x3f,0x35,0x35,0x00,0xff,0xff,0x00,0x50,0x00,0x00,0x05,0x71,0x05,0xb0,\r\n0x00,0x26,0x00,0xf0,0x00,0x00,0x00,0x07,0x00,0xbc,0x02,0xbf,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x03,0xa4,0x05,0x9a,0x02,0x06,0x00,0x2f,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x04,0x8c,0x05,0xb2,0x02,0x06,0x00,0x26,0x00,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x02,0x06,0x00,0x27,0x00,0x00,0xff,0xff,\r\n0x00,0xbc,0x00,0x00,0x06,0x72,0x05,0x9a,0x02,0x06,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x05,0x12,0x05,0xd9,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x07,0x00,0x4c,0x03,0xac,0x00,0x00,0xff,0xff,0x00,0x1a,0x00,0x00,0x07,0x02,0x05,0xd9,0x00,0x26,0x00,0x5b,0x00,0x00,0x00,0x27,0x00,0x4c,0x03,0xac,0x00,0x00,0x00,0x07,\r\n0x00,0x4c,0x05,0x9c,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x01,0x4a,0x05,0xec,0x02,0x06,0x00,0x4f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0x62,0x04,0x18,0x02,0x06,0x00,0x46,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x04,0x10,0x05,0xec,0x02,0x06,0x00,0x47,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x06,0x54,0x04,0x18,\r\n0x02,0x06,0x00,0x50,0x00,0x00,0x00,0x03,0x00,0x5e,0x00,0x00,0x07,0xde,0x05,0x9a,0x00,0x0f,0x00,0x19,0x00,0x23,0x00,0x2d,0x40,0x17,0x11,0x7e,0x22,0x22,0x05,0x0a,0x7d,0x17,0x17,0x25,0x1c,0x7d,0x05,0x10,0x23,0x91,0x07,0x03,0x11,0x22,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,\r\n0x39,0x2f,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x1e,0x02,0x33,0x33,0x11,0x03,0x64,0xaa,0xfe,0xe4,0xce,0x72,0x02,0xf6,0x01,0x94,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0x66,0x68,0x8b,0xdd,0x9a,0x52,0xfd,\r\n0xb6,0xfe,0x74,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0x68,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0xfb,0x96,0x4c,0x93,0xd8,0x8c,0x02,0x27,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x04,0x6a,0x00,0x03,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x09,0x00,0x20,0x00,0x2b,0x00,0x41,0x40,0x22,0x11,0x7e,\r\n0x24,0x24,0x00,0x04,0x7d,0x1e,0x1e,0x2d,0x2b,0x0b,0x18,0x7e,0x00,0x2a,0x92,0x0b,0x2b,0x92,0x17,0x0b,0x17,0x0b,0x17,0x00,0x0a,0x91,0x01,0x03,0x18,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x01,0x2f,0xe9,0x32,0x32,0x12,0x39,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x31,0x30,0x33,0x11,0x21,\r\n0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x03,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0xbc,0x01,0x8c,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0xd4,0x5a,0x65,0xa1,0x6f,0x3b,0x3a,0x6f,0xa0,0x65,0x5c,0xd6,0x8b,0xdd,0x9a,0x52,0xfd,\r\n0xb6,0x83,0x78,0x89,0x24,0x44,0x60,0x3c,0x5a,0x05,0x9a,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0x9d,0x30,0x61,0x95,0x65,0x65,0x9d,0x6b,0x38,0x9d,0x4c,0x93,0xd8,0x8c,0x02,0x27,0xfc,0xba,0x8b,0x93,0x49,0x64,0x3d,0x1a,0xfd,0xde,0x00,0x05,0x00,0x5e,0x00,0x00,0x07,0xde,0x05,0x9a,0x00,0x0f,0x00,0x26,0x00,0x3d,0x00,0x48,\r\n0x00,0x53,0x00,0x6b,0x40,0x39,0x45,0x7e,0x20,0x53,0x30,0x3d,0x7e,0x19,0x3e,0x26,0x19,0x36,0x7e,0x4c,0x20,0x19,0x4c,0x4c,0x19,0x20,0x03,0x05,0x0a,0x7d,0x2c,0x2c,0x55,0x13,0x7d,0x05,0x52,0x3f,0x92,0x26,0x30,0x26,0x53,0x3e,0x92,0x1a,0x3c,0x1a,0x26,0x1a,0x26,0x1a,0x00,0x2f,0x10,0x91,0x07,0x03,0x3d,0x19,0x91,0x00,0x12,0x00,\r\n0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x01,0x2f,0xe9,0x12,0x39,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe9,0x11,0x33,0x33,0x10,0xe9,0x32,0x32,0x10,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x01,\r\n0x23,0x20,0x11,0x14,0x1e,0x02,0x33,0x33,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x01,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x21,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x03,0x64,0xaa,0xfe,0xe4,\r\n0xce,0x72,0x02,0xf6,0x01,0x94,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0xfe,0xf2,0x72,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0x68,0x5c,0x65,0xa0,0x6f,0x3a,0x3b,0x6f,0xa1,0x65,0x5a,0x01,0x10,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0x72,0x5a,0x65,0xa1,0x6f,0x3b,0x3a,0x6f,0xa0,0x65,0x5c,0xa8,0x5a,0x3c,0x60,0x44,0x24,0x89,0x78,0x01,0x62,0x78,0x89,\r\n0x24,0x44,0x60,0x3c,0x5a,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x9d,0x38,0x6b,0x9d,0x65,0x65,0x95,0x61,0x30,0xfc,0x33,0x4c,0x93,0xd8,0x8c,0x02,0x27,0x9d,0x30,0x61,0x95,0x65,0x65,0x9d,0x6b,0x38,0x9d,0x01,0x24,0x02,0x22,0x1a,0x3d,0x64,0x49,0x93,0x8b,\r\n0x8b,0x93,0x49,0x64,0x3d,0x1a,0xfd,0xde,0x00,0x01,0x00,0x68,0xff,0xe8,0x04,0x96,0x05,0xb2,0x00,0x19,0x00,0x2f,0x40,0x18,0x06,0x7d,0x13,0x13,0x1b,0x0d,0x19,0x0c,0x2f,0x0d,0x01,0x0d,0x0d,0x0f,0x91,0x0a,0x13,0x00,0x19,0x19,0x17,0x91,0x02,0x04,0x00,0x3f,0xed,0x32,0x2f,0x33,0x3f,0xed,0x32,0x2f,0x5d,0x33,0x01,0x2f,0x33,0x12,\r\n0x39,0x2f,0xe9,0x31,0x30,0x13,0x36,0x33,0x20,0x17,0x16,0x11,0x10,0x07,0x06,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x11,0x10,0x27,0x26,0x23,0x22,0x07,0x68,0x9f,0xed,0x01,0x31,0xb9,0xb8,0xcf,0xcf,0xfe,0xc2,0xcb,0x87,0x9b,0xb9,0xf6,0x9b,0x99,0x8f,0x90,0xe9,0xd9,0x9d,0x05,0x5e,0x54,0xc5,0xc4,0xfe,0xbf,0xfe,0xa7,0xd3,\r\n0xd4,0x3b,0xb3,0x56,0xa5,0xa5,0x01,0x14,0x01,0x05,0x9d,0x9b,0x60,0x00,0x00,0x01,0x00,0x5e,0xfe,0x7f,0x04,0x8c,0x05,0xb2,0x00,0x20,0x00,0x38,0x40,0x1e,0x1c,0x7f,0x1f,0x0d,0x1f,0x0d,0x22,0x14,0x7d,0x05,0x0c,0x30,0x0d,0x01,0x0d,0x0d,0x0f,0x91,0x0a,0x04,0x20,0x1c,0x01,0x1c,0x1c,0x19,0x91,0x1e,0x00,0x13,0x00,0x3f,0xce,0xed,\r\n0x32,0x2f,0x5d,0x3f,0xed,0x32,0x2f,0x5d,0x33,0x01,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0xe9,0x31,0x30,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x23,0x11,0x06,0x03,0x00,0xa1,0xfb,0xac,0x5a,0x6b,0xc2,0x01,0x0d,0xa2,0xcb,0x87,\r\n0x9b,0xb9,0x87,0xcf,0x8c,0x48,0x47,0x87,0xc0,0x7a,0x6b,0xba,0x51,0x9b,0x6e,0x18,0x70,0xc2,0x01,0x04,0x94,0xa6,0x01,0x1a,0xcd,0x73,0x3b,0xb3,0x56,0x61,0xa6,0xdc,0x7b,0x7a,0xd1,0x9a,0x58,0x2f,0x32,0xfd,0x9f,0x01,0x83,0x1a,0x00,0x01,0x01,0x05,0xff,0xcc,0x05,0x57,0x05,0xc6,0x00,0x08,0x00,0x24,0x40,0x0f,0x03,0x08,0x01,0x07,\r\n0x07,0x0a,0x05,0x07,0x00,0x06,0x06,0x03,0x01,0x05,0x03,0x00,0x2f,0xdd,0xc4,0x12,0x39,0x11,0x33,0x2f,0x01,0x2f,0x12,0x39,0x2f,0x39,0xc9,0x39,0x31,0x30,0x01,0x01,0x11,0x01,0x01,0x11,0x01,0x11,0x21,0x03,0xb1,0x01,0xa6,0xfd,0xd7,0xfd,0xd7,0x01,0xa8,0x01,0x04,0x01,0x66,0x01,0x70,0xfe,0xd7,0xfe,0x1f,0x01,0xe1,0x01,0x29,0xfe,\r\n0x90,0x04,0x60,0x00,0x00,0x04,0x00,0xbc,0x00,0x00,0x05,0x3e,0x05,0x9a,0x00,0x09,0x00,0x20,0x00,0x36,0x00,0x3f,0x00,0x65,0x40,0x18,0x2f,0x7f,0x3a,0x11,0x7e,0x26,0x3a,0x26,0x3a,0x26,0x00,0x04,0x7d,0x1e,0x1e,0x41,0x3f,0x36,0x2b,0x0b,0x18,0x7e,0x00,0x3e,0xb8,0x01,0x05,0xb4,0x2b,0x2a,0x92,0x0b,0x3f,0xb8,0x01,0x05,0x40,0x14,\r\n0x35,0x36,0x92,0x17,0x40,0x0b,0x01,0x0b,0x17,0x0b,0x17,0x00,0x0a,0x91,0x01,0x03,0x18,0x91,0x00,0x12,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xfd,0xd6,0xed,0x10,0xfd,0xd6,0xed,0x01,0x2f,0xe9,0x32,0x32,0x32,0x32,0x12,0x39,0x2f,0xe9,0x12,0x39,0x39,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x31,0x30,0x33,0x11,0x21,\r\n0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x03,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x33,0x32,0x3e,0x02,0x35,0x10,0x21,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0xbc,0x01,0x8c,0x02,0xf6,0x72,0xce,0xfe,\r\n0xe4,0xaa,0xd4,0x8c,0x7d,0xc6,0x89,0x48,0x48,0x89,0xc5,0x7c,0x8e,0xd6,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0x54,0x61,0x8b,0x5a,0x2a,0xb1,0xbf,0x8c,0x3c,0x9f,0xa8,0x30,0x56,0x77,0x48,0x3e,0x3c,0x5b,0x57,0x56,0x5c,0x3c,0x05,0x9a,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x05,0x02,0x53,0x35,0x71,0xb2,0x7c,0x73,0xb5,0x7e,0x42,0x5b,0x4c,\r\n0x93,0xd8,0x8c,0x02,0x27,0xfc,0x6e,0x3a,0x64,0x83,0x4a,0xa8,0xaf,0x4b,0x7c,0x90,0x50,0x6e,0x44,0x1e,0x4b,0xba,0x52,0x5f,0x55,0x48,0xfe,0xb2,0x00,0x07,0x00,0x5e,0x00,0x00,0x08,0xba,0x05,0x9a,0x00,0x0f,0x00,0x26,0x00,0x3d,0x00,0x53,0x00,0x69,0x00,0x72,0x00,0x7b,0x00,0x95,0x40,0x2c,0x4e,0x7e,0x2c,0x78,0x7f,0x45,0x72,0x69,\r\n0x5e,0x19,0x26,0x7e,0x3c,0x73,0x49,0x3e,0x32,0x3c,0x62,0x7f,0x6d,0x1f,0x7e,0x59,0x2c,0x45,0x3c,0x6d,0x59,0x59,0x6d,0x3c,0x45,0x2c,0x05,0x05,0x0a,0x7d,0x15,0x36,0x7d,0x05,0x71,0x74,0xb8,0x01,0x05,0x40,0x13,0x5e,0x49,0x5d,0x4a,0x92,0x19,0x20,0x32,0x30,0x32,0x02,0x32,0x18,0x33,0x91,0x07,0x03,0x72,0x73,0xb8,0x01,0x05,0x40,\r\n0x0f,0x68,0x3f,0x69,0x3e,0x92,0x25,0x2f,0x3d,0x01,0x3d,0x26,0x3c,0x91,0x00,0x12,0x00,0x3f,0xfd,0x32,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0x32,0xed,0x32,0x3f,0xfd,0x32,0xd6,0x5d,0x32,0xfd,0x32,0xd6,0x32,0xed,0x32,0x01,0x2f,0xe9,0x2f,0xe9,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x2f,0x2f,0x10,0xe9,0x10,0xe9,0x11,0x33,0x33,0x33,0x33,0x10,\r\n0xe9,0x32,0x32,0x32,0x32,0x10,0xe9,0x10,0xe9,0x31,0x30,0x21,0x22,0x24,0x26,0x02,0x35,0x10,0x21,0x21,0x20,0x11,0x14,0x02,0x06,0x04,0x23,0x37,0x32,0x3e,0x02,0x35,0x10,0x21,0x23,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x25,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x23,0x20,0x11,0x14,0x1e,0x02,\r\n0x33,0x33,0x3d,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x03,0x64,0xaa,0xfe,\r\n0xe4,0xce,0x72,0x02,0xf6,0x02,0x70,0x02,0xf6,0x72,0xce,0xfe,0xe4,0xaa,0x02,0x8b,0xdd,0x9a,0x52,0xfd,0xb6,0xe0,0x8c,0x7d,0xc6,0x89,0x48,0x48,0x89,0xc5,0x7c,0x8e,0xfe,0xca,0x7d,0xc4,0x89,0x48,0x48,0x89,0xc6,0x7d,0x8c,0xe0,0xfd,0xb6,0x52,0x9a,0xdd,0x8b,0xd6,0x3e,0x48,0x77,0x56,0x30,0xa8,0x9f,0x3c,0x8c,0xbf,0xb1,0x2a,0x5a,\r\n0x8b,0x61,0x01,0xc0,0x61,0x8b,0x5a,0x2a,0xb1,0xbf,0x8c,0x3c,0x9f,0xa8,0x30,0x56,0x77,0x48,0x3e,0x3c,0x5b,0x57,0x56,0x5c,0x3c,0xa8,0x3c,0x5c,0x56,0x56,0x5c,0x65,0xbf,0x01,0x10,0xab,0x02,0xbb,0xfd,0x45,0xab,0xfe,0xf0,0xbf,0x65,0x98,0x4c,0x93,0xd8,0x8c,0x02,0x27,0x53,0x35,0x71,0xb2,0x7c,0x73,0xb5,0x7e,0x42,0x5b,0x5b,0x42,\r\n0x7e,0xb5,0x73,0x7c,0xb2,0x71,0x35,0x53,0xfd,0xd9,0x8c,0xd8,0x93,0x4c,0x5b,0x7d,0x4b,0x1e,0x44,0x6e,0x50,0x90,0x7c,0x4b,0xaf,0xa8,0x4a,0x83,0x64,0x3a,0x3a,0x64,0x83,0x4a,0xa8,0xaf,0x4b,0x7c,0x90,0x50,0x6e,0x44,0x1e,0x4b,0xba,0x52,0x5f,0x55,0x48,0xfe,0xb2,0x01,0x4e,0x48,0x55,0x5f,0x52,0x00,0xff,0xff,0x00,0x48,0xff,0xec,\r\n0x06,0xd9,0x05,0xae,0x00,0x27,0x00,0xbc,0x03,0x03,0x00,0x00,0x00,0x27,0x00,0xf2,0x04,0x4b,0xfd,0xb9,0x01,0x06,0x08,0x8d,0x00,0x00,0x00,0x07,0xb2,0x01,0x23,0x2d,0x00,0x3f,0x35,0x00,0x00,0x01,0x00,0x00,0x01,0x46,0x04,0x27,0x01,0xb6,0x00,0x03,0x00,0x0e,0xb4,0x01,0x00,0x01,0x52,0x02,0x00,0x2f,0xed,0x01,0x2f,0x2f,0x31,0x30,\r\n0x01,0x21,0x35,0x21,0x04,0x27,0xfb,0xd9,0x04,0x27,0x01,0x46,0x70,0x00,0x00,0x02,0x00,0xab,0xfe,0x0a,0x07,0x59,0x03,0x0f,0x00,0x2e,0x00,0x35,0x00,0x00,0x01,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,\r\n0x33,0x32,0x3e,0x02,0x35,0x11,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x06,0x9f,0x0c,0x27,0x49,0x3e,0x16,0x61,0x70,0x20,0x04,0x2c,0x80,0x9d,0xb4,0x60,0x88,0xe1,0xb5,0x88,0x30,0x40,0x30,0x12,0x0b,0x9a,0x09,0x11,0x1f,0x2f,0x1d,0x5c,0x92,0xd1,0x93,0x80,0xc0,0x7f,0x3f,0xfd,0x6c,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x03,0x0f,0xfe,0x89,\r\n0x43,0x60,0x3e,0x1e,0xa7,0x3a,0x40,0x2f,0x35,0x19,0x05,0x04,0x15,0x2c,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0xfa,0xfb,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x02,0xff,0xba,0xfe,0x0a,0x02,0xac,0x03,0x0f,0x00,0x1f,0x00,0x26,0x00,0x00,0x01,0x14,\r\n0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x03,0x33,0x17,0x37,0x33,0x03,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0xa9,0xec,0x7d,0xab,\r\n0xa8,0x79,0xe6,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0xfa,0xfb,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x02,0x00,0xab,0xfe,0x0a,0x06,0x9f,0x03,0x0f,0x00,0x25,0x00,0x2c,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,\r\n0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x01,0x62,0x09,0x11,0x1e,0x30,0x1d,0x5c,0x91,0xd2,0x93,0x80,0xc0,0x7f,0x3f,0x9c,0x33,0x5d,0x81,0x9a,0xaf,0x5d,0x86,0xde,0xb3,0x87,0x30,0x3f,0x30,0x12,0x0b,0x02,0xa7,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x02,\r\n0x5f,0x2b,0x65,0x36,0x3c,0x63,0x23,0x15,0x1b,0x0f,0x05,0x0a,0x29,0x53,0x48,0x01,0xae,0xfe,0x4b,0x5a,0x7c,0x52,0x2d,0x16,0x05,0x03,0x15,0x2d,0x29,0x37,0x98,0x58,0x3d,0x70,0x33,0xfb,0xab,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x00,0x02,0xff,0xba,0xfe,0x0a,0x02,0xa6,0x03,0x0f,0x00,0x16,0x00,0x1d,0x00,0x00,0x37,0x32,0x3e,0x02,\r\n0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0x03,0x33,0x17,0x37,0x33,0x03,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x49,0xec,0x7d,0xab,0xa8,0x79,0xe6,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,\r\n0x20,0x33,0xfd,0x71,0x01,0x60,0xff,0xff,0xfe,0xa0,0x00,0x04,0x00,0x7e,0xfd,0xff,0x04,0x41,0x04,0xb2,0x00,0x31,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x00,0x01,0x06,0x04,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,\r\n0x36,0x33,0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0xd8,0xfe,0xde,0xaf,0x49,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,\r\n0xf9,0xb9,0xb9,0xfe,0xe9,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x02,0x01,0x39,0x7e,0x8a,0x98,0x52,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfd,0x0e,0xb5,0x03,0x7e,0xb5,0xb5,0xb5,0x00,0x04,\r\n0x00,0x7e,0xfd,0xff,0x04,0xad,0x04,0xb2,0x00,0x40,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x00,0x01,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,\r\n0x32,0x1e,0x04,0x17,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x0c,0x22,0x40,0x1e,0x05,0x26,0x46,0x69,0x47,0x18,0x63,0x8f,0x5f,0x31,0x05,0x8d,0xc0,0x75,0x32,0x2e,0x64,0x9d,0x70,0x61,0xc3,0x64,0x6d,0xbd,0x63,0x98,0xd7,0x88,0x3f,0x19,0x3d,0x64,0x97,0xcd,0x87,0x32,0x4d,0x51,0x63,0x49,0x4b,0x80,0x31,\r\n0x37,0x85,0x4e,0x48,0x6d,0x5d,0x53,0x5d,0x6d,0x48,0xfe,0xd4,0xb9,0xb9,0xf2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x02,0x01,0x09,0x12,0x09,0x60,0x7e,0x49,0x1d,0xa7,0x3f,0x75,0xa6,0x67,0x33,0x6e,0x77,0x80,0x45,0x42,0x74,0x56,0x31,0x26,0x23,0x9a,0x26,0x23,0x48,0x7b,0xa3,0x5c,0x38,0x75,0x76,0x74,0x6d,0x63,0x2a,0x08,0x10,0x20,0x19,\r\n0x0f,0x15,0x0f,0x9d,0x12,0x17,0x16,0x21,0x27,0x22,0x17,0x01,0xfc,0xe6,0xb5,0x03,0xa6,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x04,0x7c,0x04,0xb2,0x00,0x28,0x00,0x2c,0x00,0x30,0x00,0x34,0x00,0x00,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,\r\n0x1e,0x04,0x17,0x07,0x0e,0x05,0x23,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x2b,0x73,0x92,0xb1,0xd0,0xf1,0x88,0x02,0x81,0xb9,0xb9,0xc3,0xb9,0xb9,0x01,0x42,\r\n0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x0a,0x42,0x59,0x62,0x53,0x36,0xfe,0xb4,0xb5,0x04,0xa2,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x04,0xad,0x04,0xb2,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x00,0x15,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x01,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x23,0x23,0x23,0x23,0x3b,0x7b,0xe0,0xcf,0xbf,0x5a,0x39,\r\n0x60,0x68,0x7c,0x57,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x14,0x35,0x5e,0x4a,0x14,0x62,0x7d,0x4a,0x1e,0x02,0x48,0xab,0xc8,0xe3,0x80,0x02,0x81,0xb9,0xb9,0xc3,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x37,0x59,0x70,0x39,0x05,0x1b,0x35,0x2b,0x1b,0x14,0x10,\r\n0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2b,0x3b,0x25,0x10,0xa7,0x29,0x46,0x5d,0x35,0x2b,0x5b,0x4b,0x30,0xfe,0xb4,0xb5,0x04,0xa2,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x19,0xff,0xea,0x05,0xf5,0x05,0xec,0x00,0x20,0x00,0x34,0x00,0x38,0x00,0x3c,0x00,0x00,0x01,0x33,0x11,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,\r\n0x15,0x14,0x0e,0x04,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x55,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x5a,0x79,0xae,0x70,0x36,0x2d,0x52,0x71,0x88,0x9a,0x52,0xb7,0xfe,0xf5,0xc6,0x92,\r\n0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x02,0x52,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x97,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x05,0xec,0xfc,0x1d,0x01,0x43,0x7a,0x5d,0x36,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x55,0x2f,0x16,0x05,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,\r\n0x66,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x04,0xff,0xba,0xff,0xed,0x05,0xf5,0x05,0xec,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x00,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x36,\r\n0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x79,0xae,0x70,0x36,0x2d,0x51,0x71,0x88,0x9a,0x52,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,\r\n0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x83,0x75,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x96,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4f,0x88,0xb5,0x66,0x5d,0x80,0x54,0x2e,0x16,0x04,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,\r\n0x52,0x25,0x2c,0x4e,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x00,0x04,0xff,0xba,0xff,0xed,0x06,0xae,0x05,0xec,0x00,0x2d,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x00,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x21,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,0x6f,0x89,0x9d,0x54,0x72,0xc7,0xc6,0xd2,0x7c,0x45,0x23,0x23,0x23,\r\n0x23,0x01,0x2e,0x08,0x14,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5b,0xeb,0x96,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3c,0x43,0x30,0x35,0x1a,0x05,0x02,0x01,0x02,0x34,0x20,0x20,0x33,0x17,0x2f,0x1a,\r\n0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x19,0xff,0xea,0x06,0xae,0x05,0xec,0x00,0x29,0x00,0x3d,0x00,0x41,0x00,0x45,0x00,0x00,0x01,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,\r\n0x27,0x23,0x0e,0x03,0x23,0x22,0x24,0x26,0x26,0x27,0x27,0x16,0x16,0x17,0x36,0x36,0x37,0x11,0x33,0x11,0x17,0x3e,0x03,0x03,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x04,0x07,0x16,0x16,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x28,0x78,0xac,0x70,0x37,0x02,0x01,0x11,0x29,0x47,0x37,0x16,0x5e,0x74,0x1f,0x06,0x26,\r\n0x70,0x89,0x9d,0x54,0xb7,0xfe,0xf5,0xc6,0x92,0x3e,0x20,0x2d,0x91,0x58,0x08,0x13,0x0b,0x9e,0x03,0x2e,0x77,0x8f,0xa4,0x27,0x6b,0xa2,0x6d,0x37,0x32,0x58,0x79,0x47,0x49,0x84,0x74,0x63,0x52,0x3e,0x15,0x5c,0xe9,0x97,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x03,0x58,0x4e,0x84,0xae,0x61,0x3a,0x54,0x36,0x1a,0xa7,0x3a,0x45,0x31,0x36,0x1a,\r\n0x06,0x03,0x06,0x09,0x06,0xa7,0x06,0x07,0x01,0x16,0x2e,0x1a,0x04,0xf3,0xfc,0x1d,0x01,0x43,0x7a,0x5c,0x37,0xfd,0x3b,0x0a,0x27,0x4f,0x45,0x5e,0x82,0x52,0x25,0x2d,0x4d,0x68,0x77,0x81,0x3f,0x02,0x01,0x03,0x6a,0xb5,0xb5,0xb5,0x00,0x06,0x00,0xab,0xfe,0xa6,0x07,0x4b,0x06,0x3c,0x00,0x36,0x00,0x4a,0x00,0x4e,0x00,0x52,0x00,0x56,\r\n0x00,0x5a,0x00,0x00,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,\r\n0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x01,0x62,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x3a,0x64,0x89,0x9d,0xac,0x55,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x05,0xe6,0x0f,\r\n0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1a,0x18,0x42,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0xfe,0x0f,0xb9,0xb9,0x02,0x5f,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x60,\r\n0x84,0x57,0x30,0x17,0x05,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0xf2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x49,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x00,0x06,0xff,0xba,0xfe,0xa6,0x03,0x49,0x06,0x3c,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44,\r\n0x00,0x48,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x13,0x23,0x35,0x33,\r\n0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x39,0xb9,0xb9,\r\n0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,0x4a,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x00,0x06,0xff,0xba,0xfe,0xa6,\r\n0x04,0x02,0x06,0x3c,0x00,0x2f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,\r\n0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x13,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,\r\n0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x39,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,\r\n0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,0x00,0x06,0x00,0xab,0xfe,0xa6,0x08,0x04,0x06,0x3c,0x00,0x41,0x00,0x55,0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x00,0x01,0x34,0x3e,0x02,\r\n0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x05,0x33,0x32,0x36,0x37,0x37,0x2e,0x03,0x05,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,\r\n0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0xb0,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5b,0x27,0x33,0x77,0x82,0x8a,0x45,0xb9,0x86,0xd6,0xaa,0x7f,0x2e,0x3f,0x30,0x12,0x0b,0x9a,0x09,0x11,0x20,0x2e,0x17,0x39,0x4f,0x6d,\r\n0x96,0xc7,0x82,0x5b,0x8e,0x3b,0x02,0x4a,0x60,0x38,0x15,0x01,0xfe,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x41,0x73,0x5a,0x23,0x1b,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0xfe,0x0f,0xb9,0xb9,0x01,0xd1,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x63,0x27,0x09,0x03,0xa7,0x07,\r\n0x0e,0x16,0x0f,0x18,0x1a,0x0d,0x03,0x05,0x15,0x2d,0x27,0x36,0x99,0x58,0x3d,0x70,0x33,0x2b,0x65,0x36,0x3c,0x66,0x20,0x10,0x17,0x0f,0x08,0x05,0x01,0x02,0x03,0x06,0x1e,0x44,0x4d,0x55,0x35,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x1f,0x3e,0x43,0x4a,0x2b,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0x63,0xb5,0xf8,0x6a,0xb5,\r\n0x00,0x05,0x00,0x9b,0xfc,0xb6,0x05,0x4b,0x04,0x79,0x00,0x30,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0x00,0x25,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x2e,0x05,\r\n0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0xad,0x50,0x5c,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x1b,0x28,0x1b,0x0e,0x4a,0x98,0xed,0xa3,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x67,0x93,0x64,0x3b,0x21,\r\n0x0b,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xf8,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x6a,0xb9,0xb9,0x17,0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x2a,0x68,0x75,0x7f,0x40,0x95,0xdc,0x91,0x47,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,\r\n0x1d,0x32,0x46,0x51,0x5b,0xd0,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x03,0x1f,0xb5,0xb5,0xb5,0xf8,0x3d,0xb5,0x00,0x00,0x05,0xff,0xba,0xfe,0xa6,0x03,0x49,0x05,0x24,0x00,0x24,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,\r\n0x03,0x15,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x14,0x26,0x1d,0x12,0x39,0x61,0x81,\r\n0x91,0x97,0x47,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x37,0x2c,0x1b,0x19,0x41,0x73,0x5a,0x21,0x1d,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x68,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x58,0x21,0x4a,0x52,0x5a,0x30,0x60,0x83,0x55,0x2e,0x15,0x04,\r\n0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x42,0x4a,0x2a,0x18,0x4d,0x03,0x3e,0xb5,0xb5,0xb5,0xf9,0x82,0xb5,0x00,0x05,0xff,0xba,0xfe,0xa6,0x04,0x02,0x05,0x24,0x00,0x2f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x00,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,\r\n0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xa5,0x4a,0x60,0x38,0x15,0x30,\r\n0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x38,0x72,0x43,0x16,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x70,0x75,0x74,0x34,0xbf,0x23,0x23,0x23,0x23,0xc8,0x30,0x75,0x36,0x01,0x09,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0xfe,0xe5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x68,0xb9,0xb9,\r\n0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x56,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x34,0x20,0x20,0x33,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0x03,0x3e,0xb5,0xb5,0xb5,0xf9,0x82,0xb5,0x00,\r\n0x00,0x05,0x00,0x9b,0xfc,0xb6,0x06,0x03,0x04,0x79,0x00,0x30,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x03,0x2e,\r\n0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x04,0x36,0x5c,0x91,0x66,0x36,0x30,0x55,0x73,0x44,0x48,0x78,0x36,0x2d,0x34,0x07,0xbc,0xbb,0x0b,0x54,0x99,0xe0,0x97,0xa1,0xdb,0x87,0x3b,0x0f,0x0e,0x97,0x0b,0x0c,0x2b,0x64,0xa5,0x7a,0x60,0x8d,0x63,0x3e,\r\n0x24,0x10,0x03,0x1d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1a,0x7c,0x86,0x65,0x04,0x0e,0xfe,0xf5,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x6a,0xb9,0xb9,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x48,0xc0,0x6d,0xa7,0x7f,0xbc,0x7b,0x3d,0x41,0x7c,0xb7,0x77,0x3f,0x8c,0x4e,0x4b,0x7d,0x36,0x5f,0x84,0x54,0x26,0x19,\r\n0x2d,0x3e,0x49,0x52,0x2b,0x01,0x42,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0x02,0xb6,0xb5,0xb5,0xb5,0xf8,0x3d,0xb5,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x51,0x05,0xec,0x00,0x2d,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,\r\n0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x05,0x51,0xb3,0xb3,0xb3,0x38,0x81,0xd4,0x9d,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfd,0xa8,0x8f,0xe4,\r\n0x9f,0x56,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x02,0x44,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xa5,0x05,0xec,0x00,0x26,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,\r\n0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x02,0xa5,0xb3,0xb3,0xb3,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x99,0x2e,0x47,0x30,0x18,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfd,0xe0,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0x0f,0x2a,\r\n0x48,0x39,0x02,0x19,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0xac,0x05,0xec,0x00,0x2f,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,\r\n0x35,0x21,0x11,0x33,0x11,0x33,0x02,0xa5,0xb3,0xb3,0xb3,0x0c,0x27,0x4a,0x3d,0x16,0x61,0x74,0x1d,0x04,0x1b,0x43,0x48,0x49,0x22,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,0x5c,0x83,0x6d,0xfe,0x2c,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,\r\n0x20,0x33,0x12,0x2c,0x47,0x35,0x02,0x19,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x01,0x00,0x9b,0xfe,0xac,0x05,0x58,0x05,0xec,0x00,0x38,0x00,0x00,0x01,0x23,0x15,0x33,0x15,0x23,0x11,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,\r\n0x33,0x32,0x3e,0x02,0x35,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x33,0x05,0x51,0xb3,0xb3,0xb3,0x0c,0x27,0x4a,0x3d,0x13,0x49,0x59,0x1c,0x04,0x11,0x4c,0x7f,0xb7,0x7c,0x87,0xb6,0x6d,0x2f,0x0d,0x0e,0x98,0x0b,0x0b,0x23,0x4f,0x7d,0x59,0x67,0x93,0x5d,0x2b,0xfe,0xdf,0x01,0x21,0xfe,0xdf,0x01,0x21,0x9c,0xb3,0x04,\r\n0x5c,0x83,0x6d,0xfe,0x30,0x43,0x61,0x40,0x1f,0xa7,0x28,0x26,0x5f,0x95,0x69,0x37,0x45,0x7f,0xb7,0x72,0x3f,0x83,0x4b,0x48,0x7a,0x37,0x5f,0x84,0x51,0x24,0x31,0x6e,0xb3,0x81,0x02,0x44,0x6d,0x83,0x6d,0x01,0x23,0xfe,0xdd,0x00,0x00,0x05,0x00,0x39,0xfd,0xff,0x03,0xf4,0x05,0x91,0x00,0x26,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x44,\r\n0x00,0x00,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x13,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x1e,0x03,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x02,0xac,0x4c,0x79,0x55,0x2e,\r\n0x23,0x47,0x69,0x45,0x31,0x66,0x61,0x59,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x2e,0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x54,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x02,0xb9,0x53,0x7d,0x91,0x3e,0x3b,0x6c,0x52,0x30,\r\n0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x43,0x23,0x0b,0xfd,0xdf,0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0f,0x0d,0x09,0x03,0x2c,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0xff,0xba,0xff,0xf2,0x03,0xf4,0x05,0x91,0x00,0x23,0x00,0x33,0x00,0x37,\r\n0x00,0x3b,0x00,0x3f,0x00,0x00,0x15,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x23,0x23,\r\n0x23,0x23,0x1a,0x3f,0x57,0x3b,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x35,0x9a,0x5e,0x01,0x6e,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3f,0x2d,0xb0,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x0e,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1a,0x2f,\r\n0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,0x50,0x43,0x01,0x13,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x02,0x89,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0xff,0xba,0xff,0xf2,0x04,0xad,0x05,0x91,0x00,0x30,0x00,0x40,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x00,0x05,0x23,0x22,0x26,\r\n0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x04,0x17,0x1e,0x03,0x33,0x25,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x04,0xad,0x16,0x5b,\r\n0x6f,0x1e,0x05,0x2d,0x87,0x61,0x34,0x61,0x57,0x4b,0x1e,0x35,0x99,0x5f,0x13,0x23,0x23,0x23,0x23,0x1a,0x3f,0x57,0x3a,0x23,0x0b,0x0d,0x21,0x2b,0x38,0x48,0x5c,0x39,0x4f,0x72,0x50,0x33,0x1c,0x0c,0x02,0x04,0x0d,0x25,0x46,0x3d,0xfc,0xd4,0x2b,0x8e,0x56,0x5e,0x69,0x1a,0x35,0x52,0x37,0x30,0x4f,0x3e,0x2f,0xaf,0xb9,0xb9,0x01,0x42,\r\n0xb9,0xb9,0xa1,0xb9,0xb9,0x0e,0x40,0x41,0x39,0x48,0x18,0x28,0x35,0x1e,0x50,0x43,0x34,0x20,0x20,0x33,0x2e,0x41,0x48,0x1b,0x1f,0x49,0x48,0x42,0x34,0x1e,0x2e,0x48,0x56,0x51,0x40,0x0e,0x21,0x3e,0x30,0x1d,0x6d,0x35,0x36,0x44,0x45,0x21,0x51,0x45,0x2f,0x26,0x45,0x5f,0x02,0x85,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x05,0x00,0x39,\r\n0xfd,0xff,0x04,0xad,0x05,0x91,0x00,0x2f,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x00,0x25,0x15,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x3e,0x05,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x05,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x06,0x07,0x1e,0x03,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x27,0x23,0x35,0x33,0x04,0xad,0x16,0x51,0x68,0x21,0x04,0x26,0x6c,0x4f,0x31,0x65,0x60,0x57,0x24,0x4e,0x43,0x09,0x11,0x17,0x0e,0xa6,0x19,0x1d,0x24,0x42,0x5d,0x3a,0x17,0x3d,0x45,0x49,0x44,0x3b,0x15,0x44,0x6e,0x53,0x34,0x0b,0x06,0x0f,0x26,0x45,0xfe,0x55,\r\n0x21,0x35,0x27,0x15,0x1e,0x33,0x45,0x27,0x4b,0x6d,0x29,0x21,0x44,0x44,0x43,0x54,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xa1,0xb9,0xb9,0x99,0xa7,0x3a,0x36,0x36,0x3b,0x13,0x17,0x13,0x63,0x5b,0x26,0x5d,0x63,0x61,0x2a,0x67,0xbd,0x45,0x48,0x79,0x5b,0x39,0x09,0x71,0xa2,0x6f,0x42,0x24,0x0b,0x41,0x67,0x80,0x3f,0x26,0x43,0x33,0x1d,0x01,\r\n0x0c,0x1c,0x30,0x23,0x25,0x59,0x4e,0x34,0xa4,0xad,0x05,0x0e,0x0e,0x09,0x03,0x2c,0xb5,0xb5,0xb5,0x63,0xb5,0x00,0x00,0x04,0x00,0x82,0xfe,0x10,0x05,0x91,0x04,0xcc,0x00,0x35,0x00,0x4e,0x00,0x52,0x00,0x56,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,\r\n0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,\r\n0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0xfe,0xa1,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xc2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,\r\n0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0x05,0x0c,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x4a,0xb5,0xb5,0xb5,\r\n0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0x48,0x05,0x3e,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x37,0x00,0x00,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,\r\n0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x06,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x63,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,\r\n0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0xfe,0x0d,0xb5,0xb5,0xb5,0x05,0x78,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x00,0x1f,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x00,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,\r\n0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0xf2,0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,\r\n0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0x0d,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xdf,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x01,0xc4,0x03,0x04,0x25,\r\n0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x6e,0xb5,0xb5,0xb5,0x00,0x04,0x00,0x82,0xfd,0xc0,0x06,0xae,0x04,0x68,0x00,0x44,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x33,0x33,0x15,0x21,0x35,0x33,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x13,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x06,0xae,0x16,0x43,0x67,\r\n0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,0x21,0x2a,0x3b,0x52,0xfb,0x36,0x0d,0x1d,0x10,0x2d,0x3e,0x8e,0x46,0xfe,0xa7,0x55,\r\n0x01,0x17,0x16,0x1c,0x33,0x47,0x2b,0x1f,0x21,0xc2,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,\r\n0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0x03,0x64,0x03,0x04,0x25,0x2b,0x58,0x61,0x5b,0x05,0x1a,0x3a,0x1d,0x22,0x39,0x2a,0x17,0x06,0xf9,0x5e,0xb5,0xb5,0xb5,0x00,0x00,0x04,0x00,0x9a,0xfe,0x10,0x05,0x91,0x04,0x78,0x00,0x35,0x00,0x39,0x00,0x3d,0x00,0x41,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,\r\n0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x04,0x15,0x14,0x0e,0x04,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x02,0x9c,0x94,0xc5,0x77,0x32,0x23,0x1d,0x97,0x17,0x23,0x21,0x52,0x8e,0x6d,0x6d,0xbd,0x8d,0x51,0x33,0x4b,0x59,0x4b,\r\n0x33,0x54,0x96,0xd1,0x7e,0x64,0x9c,0x6c,0x38,0x33,0x4d,0x5a,0x4d,0x33,0x27,0x4e,0x73,0x98,0xbc,0x9d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0xb2,0xb9,0xb9,0xab,0x4e,0x85,0xb1,0x63,0x5b,0xba,0x5b,0x58,0xaf,0x55,0x47,0x7b,0x5c,0x34,0x2e,0x4b,0x5e,0x30,0x26,0x33,0x2c,0x2e,0x40,0x5c,0x45,0x55,0x7f,0x5b,0x3b,0x12,0xa2,0x0d,0x23,\r\n0x31,0x41,0x2a,0x29,0x39,0x2f,0x2c,0x3a,0x4f,0x3a,0x31,0x6a,0x68,0x5e,0x47,0x2a,0xfe,0xbb,0xb5,0xb5,0xb5,0x04,0xfe,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0x48,0x04,0xb2,0x00,0x16,0x00,0x1a,0x00,0x1e,0x00,0x22,0x00,0x00,0x37,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x0e,0x04,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x01,\r\n0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x99,0x2e,0x47,0x30,0x18,0x9c,0x1c,0x31,0x43,0x4f,0x57,0x2d,0x8f,0x23,0x23,0x23,0x23,0x01,0x06,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x4f,0xb9,0xb9,0x99,0x0f,0x2a,0x48,0x39,0x01,0xbc,0xfe,0x3d,0x4b,0x6e,0x4c,0x31,0x1a,0x0a,0x34,0x20,0x20,0x33,0xfe,0x0d,0xb5,0xb5,0xb5,0x04,\r\n0xa2,0xb5,0x00,0x04,0xff,0xba,0xfe,0xa6,0x02,0xac,0x04,0xb2,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x00,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x23,0x35,0x33,0x01,0xf2,\r\n0x0c,0x27,0x4a,0x3d,0x16,0x64,0x78,0x1e,0x04,0x1a,0x41,0x46,0x47,0x21,0x8f,0x23,0x23,0x23,0x23,0x99,0x1d,0x43,0x38,0x25,0x9c,0xec,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x4f,0xb9,0xb9,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x3f,0x3c,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0xfb,0x97,0xb5,0xb5,0xb5,0x04,\r\n0xa2,0xb5,0x00,0x04,0x00,0x9a,0xfd,0xc0,0x06,0xae,0x03,0xba,0x00,0x44,0x00,0x48,0x00,0x4c,0x00,0x50,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x04,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,\r\n0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x05,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x06,0xae,0x16,0x43,0x67,0x4e,0x3b,0x2d,0x25,0x12,0x17,0x2b,0x18,0x1d,0x27,0x20,0x26,0x20,0x2d,0x4e,0x68,0x77,0x80,0x3e,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x54,0x81,0x59,0x2d,\r\n0x20,0x26,0x20,0x26,0x41,0x57,0x30,0x31,0x60,0x27,0x11,0x1e,0x21,0x2a,0x3b,0x52,0xfb,0xf8,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0x9b,0xb9,0xb9,0x99,0xa7,0x21,0x35,0x45,0x47,0x44,0x1b,0x23,0x1c,0x22,0x24,0x21,0x2c,0x2f,0x3e,0x34,0x3a,0x5c,0x47,0x31,0x20,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,\r\n0x33,0x16,0x27,0x35,0x20,0x1c,0x2b,0x30,0x41,0x32,0x35,0x57,0x3e,0x22,0x2c,0x3a,0x1a,0x3d,0x3d,0x3a,0x2c,0x1a,0xfd,0x27,0xb5,0xb5,0xb5,0x04,0x90,0xb5,0x00,0x02,0xff,0xa6,0xfd,0xff,0x03,0x5a,0x02,0x5e,0x00,0x28,0x00,0x38,0x00,0x00,0x01,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,\r\n0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x03,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x02,0x31,0x1a,0x28,0x1c,0x0f,0x0f,0x0d,0x3c,0x6c,0x30,0x8b,0x3f,0x51,0x23,0x56,0x5f,0x64,0x30,0x45,0x6f,0x4f,0x2a,0x2e,0x4e,0x67,0x39,0x4e,0x9a,0x4b,0x07,0x05,0x13,0x1f,\r\n0x29,0x16,0xbc,0x46,0x78,0x2a,0x37,0x7c,0x47,0x26,0x31,0x1d,0x0b,0x0f,0x23,0x37,0x02,0x5e,0x41,0x8e,0x8f,0x8b,0x3e,0x3e,0x6d,0x31,0x2b,0x72,0x4a,0x57,0x61,0x44,0x36,0x4a,0x2e,0x15,0x22,0x40,0x5d,0x3b,0x3d,0x5b,0x3a,0x1d,0x1d,0x20,0x31,0x41,0x1e,0x4b,0x8e,0x88,0x83,0x3f,0xfc,0x49,0x33,0x39,0x18,0x19,0x0d,0x16,0x1d,0x10,\r\n0x10,0x1c,0x15,0x0c,0x00,0x02,0xff,0xa6,0xfd,0xff,0x03,0x5a,0x02,0x5e,0x00,0x30,0x00,0x40,0x00,0x00,0x01,0x16,0x16,0x17,0x1e,0x03,0x33,0x15,0x23,0x22,0x26,0x27,0x14,0x06,0x07,0x16,0x16,0x17,0x07,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x27,0x03,0x32,\r\n0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x02,0x31,0x1e,0x2b,0x0f,0x06,0x1c,0x31,0x49,0x32,0x16,0x3f,0x4a,0x1a,0x0f,0x0d,0x3c,0x6c,0x30,0x8b,0x3f,0x51,0x23,0x56,0x5f,0x64,0x30,0x45,0x6f,0x4f,0x2a,0x2e,0x4e,0x67,0x39,0x4e,0x9a,0x4b,0x07,0x05,0x13,0x1f,0x29,0x16,0xbc,0x46,0x78,0x2a,0x37,0x7c,0x47,0x26,\r\n0x31,0x1d,0x0b,0x0f,0x23,0x37,0x02,0x5e,0x4c,0xa5,0x53,0x21,0x31,0x20,0x0f,0xa7,0x24,0x21,0x3e,0x6d,0x31,0x2b,0x72,0x4a,0x57,0x61,0x44,0x36,0x4a,0x2e,0x15,0x22,0x40,0x5d,0x3b,0x3d,0x5b,0x3a,0x1d,0x1d,0x20,0x31,0x41,0x1e,0x4b,0x8e,0x88,0x83,0x3f,0xfc,0x49,0x33,0x39,0x18,0x19,0x0d,0x16,0x1d,0x10,0x10,0x1c,0x15,0x0c,0x00,\r\n0x00,0x03,0x00,0x00,0xfd,0xff,0x03,0x49,0x02,0xb7,0x00,0x22,0x00,0x36,0x00,0x3a,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,\r\n0x23,0x35,0x33,0x6c,0xad,0x52,0x64,0x7b,0x45,0x1a,0x02,0x53,0x59,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x34,0x72,0xb6,0x82,0x5b,0xac,0x64,0x02,0xa9,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0xfe,0x93,0xb9,0xb9,0xfe,0xf9,0x2c,0x23,0x42,0x68,0x82,0x41,\r\n0x25,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xed,0x84,0x74,0xd3,0xa2,0x60,0x26,0x2e,0x02,0x66,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0xfe,0x8c,0xb5,0x00,0x03,0x00,0x00,0xfd,0xff,0x04,0x02,0x02,0xb7,0x00,0x27,0x00,0x38,0x00,0x3c,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,\r\n0x02,0x37,0x36,0x36,0x37,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x01,0x23,0x35,0x33,0x6c,0xad,0x52,0x45,0x66,0x48,0x2c,0x0c,0x05,0x0b,0x04,0x75,0x5c,0x92,0x66,0x36,0x30,\r\n0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x35,0x07,0xbc,0xbd,0x08,0x3e,0x74,0xab,0x75,0x5b,0xac,0x64,0x02,0x8d,0x0d,0x25,0x2c,0x34,0x1c,0x1d,0x37,0x2c,0x1b,0x7c,0x87,0x65,0x04,0x0e,0xfe,0x7f,0xb9,0xb9,0xfe,0xf9,0x2c,0x23,0x21,0x39,0x4c,0x2c,0x13,0x3d,0x26,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x56,0x48,0xbf,0x6d,0xa7,\r\n0x66,0xb5,0x88,0x50,0x26,0x2e,0x02,0xe1,0x26,0x4d,0x3d,0x26,0x26,0x3c,0x4c,0x26,0x4b,0x52,0x27,0x4e,0xfe,0x23,0xb5,0x00,0x00,0x04,0x00,0x02,0xfe,0x8d,0x03,0xfe,0x03,0x62,0x00,0x3d,0x00,0x51,0x00,0x55,0x00,0x59,0x00,0x00,0x25,0x16,0x16,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,\r\n0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x27,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x03,0x15,0x1d,0x47,0x26,0x19,0x23,0x23,0x23,\r\n0x23,0x22,0x17,0x3f,0x4a,0x51,0x27,0x32,0x5e,0x4d,0x35,0x07,0x10,0x29,0x49,0x39,0x21,0x83,0x03,0x01,0x41,0x67,0x7f,0x3e,0x10,0x22,0x0a,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x82,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0x87,0xb9,0xb9,\r\n0x01,0x42,0xb9,0xb9,0xa5,0x05,0x07,0x33,0x20,0x20,0x34,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x25,0x4f,0x7b,0x56,0x20,0x16,0x1e,0x05,0x7d,0xb1,0x71,0x34,0x01,0x01,0x07,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0xa2,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,\r\n0x3e,0x44,0x4a,0x2b,0x18,0x4f,0xfd,0x75,0xb5,0xb5,0xb5,0x00,0x00,0x04,0x00,0x02,0xfe,0x8d,0x04,0x1c,0x03,0x62,0x00,0x37,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x00,0x25,0x15,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x2e,0x03,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x06,0x07,0x16,0x16,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x04,0x1c,0x30,0x2c,0x60,0x5f,0x5c,0x27,0x32,0x5e,0x4d,0x35,0x07,0x10,0x29,0x49,0x39,0x21,0x83,0x03,0x01,0x41,0x67,0x7f,0x3e,0x0e,0x25,\r\n0x09,0x02,0x4a,0x60,0x38,0x15,0x30,0x55,0x74,0x44,0x48,0x78,0x36,0x15,0x25,0x1d,0x11,0x1b,0x19,0x39,0x8b,0xfe,0xd3,0x0f,0x1c,0x26,0x2d,0x32,0x1a,0x1d,0x38,0x2b,0x1b,0x19,0x43,0x74,0x5b,0x21,0x19,0x87,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x99,0xa7,0x07,0x0e,0x16,0x0f,0x16,0x17,0x0b,0x02,0x25,0x4f,0x7b,0x56,0x20,0x16,0x1e,0x05,\r\n0x7d,0xb1,0x71,0x34,0x01,0x01,0x07,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x52,0x57,0x21,0x4a,0x53,0x5a,0x30,0x42,0x64,0x26,0x09,0x03,0xd4,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3e,0x44,0x4a,0x2b,0x18,0x4f,0xfd,0x75,0xb5,0xb5,0xb5,0x00,0x00,0x01,0x00,0x00,0x06,0x40,0x02,0x35,0x07,0xaa,0x00,0x1b,\r\n0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x0c,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x06,0x40,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,\r\n0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x02,0x00,0x00,0x06,0x76,0x02,0x33,0x08,0x14,0x00,0x2a,0x00,0x37,0x00,0x00,0x01,0x06,0x07,0x06,0x07,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x37,0x1e,0x03,0x33,0x32,0x37,0x36,0x37,0x26,0x27,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x37,0x27,0x34,0x26,\r\n0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x36,0x02,0x33,0x25,0x29,0x0b,0x11,0x22,0x72,0x54,0x21,0x44,0x3e,0x31,0x0d,0x44,0x07,0x1a,0x27,0x34,0x22,0x2d,0x26,0x12,0x10,0x10,0x10,0x1c,0x2c,0x1b,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x0f,0x0e,0x6e,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x24,0x1c,0x0b,0x07,0x07,0x0c,0x09,\r\n0x14,0x12,0x25,0x31,0x13,0x22,0x31,0x1e,0x35,0x0e,0x22,0x1e,0x14,0x0b,0x05,0x07,0x02,0x05,0x09,0x24,0x38,0x27,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x14,0x15,0x06,0x07,0x19,0x2a,0x21,0x24,0x1f,0x1f,0x24,0x02,0x1a,0x00,0x00,0x01,0x00,0x00,0xfe,0x89,0x02,0x35,0xff,0xf3,0x00,0x1b,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,\r\n0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x0c,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0xfe,0x89,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,\r\n0x00,0x02,0x00,0x00,0x06,0x40,0x02,0x7b,0x08,0x72,0x00,0x1b,0x00,0x37,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x27,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,\r\n0x06,0x15,0x14,0x17,0x52,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x9f,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x06,0x40,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,\r\n0x20,0x13,0x0d,0x9d,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x04,0x00,0x00,0x06,0x76,0x02,0xdd,0x08,0xfa,0x00,0x28,0x00,0x51,0x00,0x5e,0x00,0x6c,0x00,0x00,0x01,0x06,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x37,0x1e,0x03,0x33,0x32,0x37,0x2e,0x03,\r\n0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x37,0x01,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x07,0x2e,0x03,0x23,0x22,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x06,0x06,0x07,0x17,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x07,0x06,0x05,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x36,0x02,0xdd,0x26,0x28,0x0f,0x2e,0x40,0x53,0x34,0x21,0x44,0x3e,0x31,0x0d,0x44,0x07,0x1a,0x27,0x34,0x22,0x43,0x31,0x19,0x2f,0x24,0x16,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x08,0x0e,0x07,0xfd,0x35,0x25,0x29,0x0f,0x2e,0x40,0x52,0x35,0x21,0x44,0x3e,0x30,0x0e,0x44,0x08,0x19,\r\n0x27,0x34,0x22,0x44,0x31,0x19,0x2f,0x25,0x16,0x18,0x29,0x38,0x21,0x1f,0x38,0x2a,0x19,0x04,0x08,0x0e,0x07,0x6e,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x24,0x1c,0x0b,0x01,0xdd,0x2a,0x1b,0x1c,0x28,0x29,0x15,0x12,0x20,0x0e,0x0b,0x07,0x07,0x0c,0x09,0x1a,0x2d,0x21,0x14,0x13,0x22,0x31,0x1e,0x35,0x0e,0x22,0x1e,0x14,0x17,0x03,0x15,0x24,\r\n0x34,0x23,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x16,0x13,0x03,0x06,0x04,0x01,0x14,0x0c,0x09,0x19,0x2e,0x21,0x14,0x13,0x22,0x31,0x1e,0x35,0x0d,0x22,0x1e,0x15,0x18,0x03,0x15,0x24,0x34,0x22,0x23,0x3a,0x29,0x17,0x14,0x29,0x3d,0x29,0x15,0x13,0x02,0x07,0x03,0x19,0x2a,0x21,0x24,0x1f,0x1f,0x24,0x03,0x1b,0xb1,0x2a,0x21,0x24,\r\n0x1f,0x1f,0x24,0x01,0x01,0x1b,0x00,0x02,0x00,0x00,0xfd,0xc1,0x02,0x7b,0xff,0xf3,0x00,0x1b,0x00,0x37,0x00,0x00,0x13,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x27,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x15,\r\n0x14,0x0e,0x02,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x52,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0x9f,0x0c,0x19,0x2e,0x41,0x29,0xd6,0x1f,0x33,0x09,0x59,0x0c,0x19,0x2e,0x42,0x28,0xd6,0x1f,0x33,0x09,0xfd,0xc1,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,\r\n0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x9d,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x12,0x0e,0x2b,0x1b,0x20,0x23,0x3d,0x2d,0x19,0x1e,0x20,0x13,0x0d,0x00,0x00,0x01,0x00,0x64,0x06,0x76,0x01,0x1d,0x07,0x2b,0x00,0x03,0x00,0x00,0x01,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x06,0x76,0xb5,0x00,0x00,0x02,0x00,0x64,0x06,0x76,\r\n0x02,0x5f,0x07,0x2b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0x06,0x76,0xb5,0xb5,0xb5,0x00,0x00,0x02,0x00,0x00,0x06,0x41,0x02,0x3f,0x07,0xda,0x00,0x1c,0x00,0x2b,0x00,0x00,0x01,0x26,0x27,0x06,0x07,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,\r\n0x17,0x16,0x17,0x36,0x37,0x17,0x06,0x07,0x06,0x07,0x16,0x17,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x01,0xa4,0x09,0x0b,0x1a,0x1e,0x36,0x43,0x28,0x50,0x3f,0x28,0x5a,0x51,0x3b,0x6c,0x2b,0x27,0x1e,0x37,0x2a,0x1c,0x1a,0x21,0x0e,0x10,0x0b,0x07,0xb5,0x1e,0x4a,0x28,0x0f,0x20,0x1b,0x11,0x47,0x3d,\r\n0x4c,0x3f,0x11,0x06,0x41,0x23,0x20,0x04,0x04,0x06,0x0d,0x27,0x48,0x3a,0x51,0x5d,0x3e,0x36,0x30,0x3f,0x0f,0x10,0x64,0x07,0x0b,0x04,0x05,0x23,0x26,0xcf,0x2a,0x30,0x07,0x12,0x1e,0x17,0x29,0x27,0x0a,0x20,0x00,0x01,0x00,0x64,0xfe,0xa6,0x01,0x1d,0xff,0x5b,0x00,0x03,0x00,0x00,0x01,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0xfe,0xa6,\r\n0xb5,0x00,0x00,0x02,0x00,0x64,0xfe,0xa6,0x02,0x5f,0xff,0x5b,0x00,0x03,0x00,0x07,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x1d,0xb9,0xb9,0x01,0x42,0xb9,0xb9,0xfe,0xa6,0xb5,0xb5,0xb5,0x00,0x00,0x02,0x00,0x00,0xfd,0xd1,0x02,0x3f,0xff,0x6a,0x00,0x1c,0x00,0x2b,0x00,0x00,0x01,0x26,0x27,0x06,0x07,0x06,0x23,0x22,\r\n0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x16,0x17,0x36,0x37,0x17,0x06,0x07,0x06,0x07,0x16,0x17,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x37,0x26,0x01,0xa4,0x09,0x0b,0x1b,0x1d,0x36,0x43,0x28,0x50,0x3f,0x28,0x5a,0x51,0x3b,0x6c,0x2b,0x27,0x1e,0x37,0x2a,0x1c,0x1a,0x21,0x0e,0x10,0x0b,0x07,0xb5,0x1e,\r\n0x4a,0x28,0x0f,0x20,0x1b,0x11,0x47,0x3d,0x4c,0x40,0x11,0xfd,0xd1,0x23,0x21,0x05,0x03,0x07,0x0d,0x27,0x48,0x3a,0x51,0x5d,0x3e,0x36,0x30,0x3f,0x0f,0x10,0x64,0x07,0x0a,0x05,0x04,0x24,0x26,0xd0,0x29,0x30,0x07,0x12,0x1e,0x17,0x29,0x27,0x0a,0x20,0x00,0x02,0x00,0x00,0x06,0x76,0x02,0xae,0x08,0x74,0x00,0x03,0x00,0x07,0x00,0x00,\r\n0x11,0x25,0x17,0x05,0x13,0x25,0x17,0x05,0x02,0x22,0x1e,0xfd,0xde,0x50,0x02,0x22,0x1e,0xfd,0xde,0x06,0xde,0x9c,0x68,0x9c,0x01,0x62,0x9c,0x68,0x9c,0x00,0x00,0x04,0xff,0xbf,0x06,0x55,0x03,0xd2,0x08,0x0e,0x00,0x21,0x00,0x2f,0x00,0x51,0x00,0x5f,0x00,0x00,0x01,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,\r\n0x36,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x05,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x36,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,\r\n0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x3c,0x17,0x28,0x11,0x18,0x30,0x15,0x72,0x5e,0x12,0x33,0x5a,0x39,0x01,0x0b,0x07,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x01,0xcf,0x17,0x28,0x11,0x18,0x30,0x15,0x72,0x5e,\r\n0x12,0x33,0x5a,0x39,0x01,0x0b,0x07,0x34,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0x06,0x55,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,\r\n0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0xe9,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x01,0x02,0x43,0x44,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x00,0x00,0x02,0x00,0x00,0xfd,0x6c,0x02,0xae,0xff,0x6a,0x00,0x03,0x00,0x07,\r\n0x00,0x00,0x11,0x25,0x17,0x05,0x13,0x25,0x17,0x05,0x02,0x22,0x1e,0xfd,0xde,0x50,0x02,0x22,0x1e,0xfd,0xde,0xfd,0xd4,0x9c,0x68,0x9c,0x01,0x62,0x9c,0x68,0x9c,0x00,0x00,0x02,0x00,0x00,0x06,0x76,0x01,0xc8,0x08,0xdd,0x00,0x23,0x00,0x35,0x00,0x00,0x11,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x3c,0x5c,0x2b,0x34,0x41,0x25,0x0e,0x15,0x2d,0x17,0x24,0x42,0x33,0x1e,0x1a,0x2e,0x3f,0x24,0x26,0x45,0x1d,0x1d,0x1d,0x1e,0x3f,0x63,0x45,0x31,0x5c,0x36,0x01,0x6a,0x01,0x11,\r\n0x1d,0x25,0x15,0x0f,0x1c,0x17,0x0e,0x12,0x1d,0x27,0x15,0x13,0x28,0x07,0x01,0x18,0x12,0x1e,0x31,0x3d,0x20,0x08,0x0a,0x16,0x2a,0x3d,0x28,0x22,0x47,0x39,0x25,0x2b,0x2e,0x2d,0x70,0x47,0x3e,0x6c,0x51,0x2f,0x10,0x19,0x01,0x3d,0x14,0x38,0x33,0x24,0x0f,0x1a,0x24,0x14,0x13,0x1f,0x15,0x0c,0x06,0x00,0x00,0x03,0x00,0x0a,0x06,0x7b,\r\n0x02,0x06,0x08,0x1c,0x00,0x11,0x00,0x18,0x00,0x1f,0x00,0x00,0x13,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,0x15,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x32,0x36,0x37,0x23,0x16,0x16,0x13,0x22,0x06,0x07,0x33,0x26,0x26,0x0a,0x5c,0x0a,0x50,0x42,0x42,0x52,0x0b,0x65,0x64,0x08,0x50,0x48,0x45,0x51,0x08,0x5a,0xfb,0x2a,0x22,\r\n0x04,0xa3,0x04,0x25,0x2a,0x27,0x26,0x05,0xa0,0x05,0x23,0x07,0x7e,0x50,0x4e,0x4e,0x50,0x58,0x55,0x56,0x56,0x55,0x60,0x2b,0x35,0x35,0x2b,0x01,0x0b,0x25,0x2e,0x2d,0x26,0x00,0x00,0x02,0x00,0x05,0x06,0x7c,0x02,0x01,0x07,0xdf,0x00,0x03,0x00,0x07,0x00,0x00,0x13,0x21,0x15,0x21,0x25,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,\r\n0x5b,0xb9,0xb9,0x06,0xd4,0x58,0xae,0xb5,0x00,0x02,0x00,0x05,0xfe,0x07,0x02,0x01,0xff,0x6a,0x00,0x03,0x00,0x07,0x00,0x00,0x17,0x21,0x15,0x21,0x01,0x23,0x35,0x33,0x05,0x01,0xfc,0xfe,0x04,0x01,0x5b,0xb9,0xb9,0x96,0x58,0xfe,0xf5,0xb5,0x00,0x01,0x00,0x00,0x06,0x62,0x01,0x49,0x08,0x48,0x00,0x06,0x00,0x00,0x11,0x25,0x15,0x07,\r\n0x17,0x15,0x25,0x01,0x49,0xe7,0xe7,0xfe,0xb7,0x07,0x8e,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0x06,0x62,0x01,0x49,0x08,0x48,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x07,0x1c,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0xfd,0x84,0x01,0x49,\r\n0xff,0x6a,0x00,0x06,0x00,0x00,0x11,0x25,0x15,0x07,0x17,0x15,0x25,0x01,0x49,0xe7,0xe7,0xfe,0xb7,0xfe,0xb0,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x01,0x00,0x00,0xfd,0x84,0x01,0x49,0xff,0x6a,0x00,0x06,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0xfe,0x3e,0xba,0x7d,0x76,0x76,0x7d,\r\n0xba,0x00,0x00,0x02,0x00,0x00,0x06,0x62,0x02,0xd9,0x08,0x48,0x00,0x06,0x00,0x0d,0x00,0x00,0x01,0x05,0x35,0x37,0x27,0x35,0x0d,0x02,0x35,0x37,0x27,0x35,0x05,0x01,0x49,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x01,0x90,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x07,0x1c,0xba,0x7d,0x76,0x76,0x7d,0xba,0x72,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x03,\r\n0x00,0x64,0x06,0x62,0x04,0x41,0x08,0x48,0x00,0x03,0x00,0x0a,0x00,0x11,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x05,0x35,0x37,0x27,0x35,0x0d,0x02,0x35,0x37,0x27,0x35,0x05,0x01,0x1d,0xb9,0xb9,0x01,0x94,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x01,0x90,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x06,0xf8,0xb5,0x91,0xba,0x7d,0x76,0x76,0x7d,0xba,0x72,\r\n0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x02,0x00,0x64,0x06,0x62,0x02,0xb1,0x08,0x48,0x00,0x03,0x00,0x0a,0x00,0x00,0x01,0x23,0x35,0x33,0x05,0x05,0x35,0x37,0x27,0x35,0x05,0x01,0x1d,0xb9,0xb9,0x01,0x94,0xfe,0xb7,0xe7,0xe7,0x01,0x49,0x06,0xf8,0xb5,0x91,0xba,0x7d,0x76,0x76,0x7d,0xba,0x00,0x00,0x03,0x00,0x00,0x06,0x55,0x02,0x84,\r\n0x08,0x0e,0x00,0x21,0x00,0x2f,0x00,0x33,0x00,0x00,0x01,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x37,0x16,0x16,0x33,0x32,0x32,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x17,0x37,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x36,0x36,0x25,0x23,0x35,0x33,0x01,0xf6,0x17,0x28,0x11,\r\n0x18,0x30,0x15,0x72,0x5e,0x12,0x33,0x5a,0x39,0x01,0x0c,0x08,0x36,0x1e,0x32,0x3f,0x20,0x1f,0x3c,0x2e,0x1c,0x48,0x39,0x0b,0x14,0x09,0x04,0x33,0x1f,0x10,0x1f,0x19,0x0f,0x23,0x1a,0x30,0x3c,0xfe,0x8a,0xb9,0xb9,0x06,0x55,0x11,0x22,0x11,0x05,0x03,0x1c,0x53,0x0d,0x0f,0x02,0x45,0x43,0x26,0x3c,0x29,0x15,0x14,0x29,0x3d,0x29,0x42,\r\n0x5a,0x1a,0x0b,0x10,0x08,0xd6,0x29,0x25,0x09,0x13,0x1c,0x12,0x1d,0x3d,0x1d,0x10,0x39,0x11,0xb5,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x0b,0xf8,0x02,0x3e,0x00,0x45,0x00,0x2c,0xb1,0x40,0x37,0xb8,0x04,0xfb,0xb5,0x0e,0x45,0x45,0x3c,0x3c,0x30,0xb8,0x04,0xfb,0xb4,0x15,0x05,0x0e,0x28,0x1f,0xb9,0x04,0xfb,0x00,0x21,0x00,0x2f,0xfd,\r\n0x32,0xde,0x32,0xdc,0xed,0x32,0x2f,0x33,0x2f,0x10,0xed,0x32,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x33,0x15,0x21,0x22,0x26,0x27,0x27,0x37,0x21,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x04,0x33,0x32,0x3e,0x02,0x35,0x33,0x14,\r\n0x16,0x33,0x32,0x3e,0x02,0x35,0x0b,0xf8,0x16,0x2d,0x44,0x2e,0x2d,0x4a,0x17,0x07,0x12,0x24,0x26,0x28,0x16,0x29,0x39,0x2c,0x25,0x2b,0x36,0x26,0x20,0x24,0x14,0x05,0x0b,0x17,0x21,0x17,0x8c,0xf8,0x84,0x55,0xb2,0x51,0x1c,0x05,0x07,0xa7,0x17,0x15,0x1a,0x38,0x56,0x3c,0x2a,0x3d,0x30,0x28,0x29,0x2f,0x20,0x20,0x2d,0x1c,0x0d,0x6e,\r\n0x26,0x33,0x13,0x18,0x0e,0x06,0x02,0x3d,0x45,0x6f,0x4e,0x2a,0x27,0x2a,0x1a,0x20,0x11,0x06,0x14,0x1e,0x24,0x1e,0x14,0x11,0x1a,0x20,0x10,0x15,0x30,0x2e,0x27,0x0b,0xa7,0x0e,0x0f,0x85,0x05,0x25,0x5c,0x23,0x30,0x5a,0x47,0x2b,0x17,0x22,0x27,0x22,0x17,0x20,0x30,0x37,0x17,0x54,0x4a,0x1f,0x30,0x37,0x18,0x00,0x00,0x01,0x00,0xbc,\r\n0x00,0x00,0x03,0xfa,0x05,0x9a,0x00,0x07,0x00,0x00,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0xfa,0xfd,0x6a,0xa8,0xa8,0x03,0x25,0x97,0xfd,0x72,0x05,0x9a,0xfd,0x8b,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0x04,0x04,0x00,0x00,0x07,0x00,0x00,0x01,0x15,0x21,0x11,0x23,0x11,0x33,0x11,0x03,0x04,0xfe,0x46,0xa4,0xa4,0x02,0x5c,\r\n0x8b,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0x33,0x05,0x9a,0x00,0x0b,0x00,0x00,0x01,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x04,0x33,0xa8,0xf6,0xa8,0xf5,0xa8,0x05,0x9a,0xfe,0x1e,0x01,0x4a,0xfa,0xfe,0x05,0x02,0xfe,0xb6,0x01,0xe2,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x03,0xe8,\r\n0x05,0x3f,0x00,0x0b,0x00,0x00,0x01,0x11,0x23,0x35,0x23,0x11,0x23,0x11,0x23,0x15,0x23,0x11,0x03,0xe8,0x9e,0xdc,0xa4,0xdc,0x9e,0x05,0x3f,0xfe,0x8e,0xe6,0xfb,0x4d,0x04,0xb3,0xe6,0x01,0x72,0x00,0xff,0xff,0x00,0xbc,0x00,0x00,0x05,0x40,0x05,0x9a,0x02,0x06,0x01,0xef,0x00,0x00,0xff,0xff,0x00,0xa6,0x00,0x00,0x04,0x00,0x04,0x00,\r\n0x02,0x06,0x02,0x0f,0x00,0x00,0x00,0x01,0x00,0xbc,0xfe,0x8c,0x04,0x98,0x05,0x9a,0x00,0x12,0x00,0x00,0x25,0x01,0x27,0x01,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x37,0x01,0x33,0x01,0x04,0x98,0xfe,0x30,0x63,0x01,0x49,0xfd,0xe0,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0x02,0x18,0xd1,0xfd,0x99,0x05,0xfe,0x87,\r\n0x74,0x01,0x0b,0x02,0x85,0x25,0x0d,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x16,0x1b,0x02,0x71,0xfd,0x50,0x00,0x00,0x01,0x00,0x10,0xff,0xe9,0x06,0xe4,0x05,0x9a,0x00,0x28,0x00,0x00,0x21,0x23,0x01,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x23,0x03,0x06,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x12,0x13,\r\n0x21,0x01,0x16,0x16,0x17,0x33,0x36,0x37,0x01,0x33,0x01,0x06,0xe4,0xcd,0xfe,0xb6,0x10,0x11,0x04,0x05,0x11,0x0c,0xfe,0xac,0xce,0x01,0xe0,0xfe,0xa4,0x7a,0x6d,0x10,0x2d,0x14,0x52,0xc5,0x4f,0x3a,0x34,0x3d,0x3e,0x36,0x37,0x71,0x45,0x01,0x76,0x01,0x25,0x0e,0x1a,0x0b,0x04,0x1f,0x19,0x01,0x31,0xc1,0xfe,0x3d,0x02,0x25,0x1b,0x2c,\r\n0x0b,0x24,0x18,0xfd,0xdb,0x02,0xd1,0x02,0x31,0xfd,0x02,0x71,0xa3,0x36,0xd1,0x15,0x9e,0x1d,0x4a,0x4a,0x02,0x6e,0x02,0x19,0xfe,0x08,0x19,0x32,0x19,0x41,0x27,0x01,0xf4,0xfd,0x39,0x00,0x00,0x01,0x00,0x10,0xff,0xf2,0x05,0x40,0x04,0x00,0x00,0x21,0x00,0x00,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x03,\r\n0x23,0x02,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x13,0x16,0x16,0x17,0x33,0x01,0x05,0x40,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xcd,0xbd,0x01,0x5d,0xf5,0x30,0x29,0x64,0x63,0xa8,0x31,0x27,0x22,0x2a,0xdc,0x3f,0x01,0x1f,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x04,0x00,0xfd,0xfa,0xfe,0x06,\r\n0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfe,0xb4,0x01,0xf6,0x01,0x7f,0xfe,0x0f,0xc9,0xc9,0x0e,0x8d,0x12,0x03,0x85,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0x00,0x00,0x02,0x00,0xbc,0x00,0x00,0x05,0xe0,0x05,0x9a,0x00,0x11,0x00,0x19,0x00,0x00,0x01,0x11,0x23,0x11,0x21,0x32,0x17,0x16,0x17,0x13,0x33,0x01,0x01,0x23,0x01,0x06,0x06,0x23,\r\n0x03,0x11,0x33,0x32,0x36,0x35,0x10,0x21,0x01,0x64,0xa8,0x01,0x8a,0xe7,0x7d,0x73,0x0b,0xf1,0xc1,0xfe,0x3d,0x01,0xc9,0xcd,0xfe,0x63,0x42,0xab,0x68,0xbd,0xb0,0xaf,0xb6,0xfe,0xb0,0x02,0x1e,0xfd,0xe2,0x05,0x9a,0x70,0x66,0xb5,0x01,0x8b,0xfd,0x39,0xfd,0x2d,0x02,0x80,0x32,0x30,0x02,0xe4,0xfd,0xb4,0x9e,0x92,0x01,0x1c,0x00,0x02,\r\n0x00,0xa6,0xfe,0x29,0x05,0xea,0x04,0x18,0x00,0x1a,0x00,0x2f,0x00,0x00,0x09,0x02,0x23,0x03,0x0e,0x03,0x23,0x22,0x27,0x23,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x13,0x01,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x05,0xea,0xfe,0xa8,0x01,0x52,0xbf,0xe2,0x13,0x4e,\r\n0x72,0x95,0x5a,0xc7,0x6c,0x04,0xa4,0xa4,0x04,0x79,0xe9,0x58,0x8f,0x6a,0x42,0x0b,0xe7,0xfc,0x15,0x2b,0x4e,0x6b,0x40,0x4b,0x76,0x52,0x2b,0x29,0x4c,0x6d,0x43,0x47,0x75,0x53,0x2e,0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x74,0x5b,0x93,0x67,0x37,0xac,0xfd,0x95,0x05,0xd7,0xb4,0xcc,0x3a,0x6b,0x99,0x5e,0x01,0x84,0xfe,0x31,0x8f,0x3f,\r\n0x6f,0x52,0x30,0x3b,0x70,0x9f,0x65,0x55,0x87,0x5f,0x32,0x35,0x5e,0x80,0x00,0x02,0x00,0x3d,0x00,0x00,0x06,0x4d,0x05,0x9a,0x00,0x24,0x00,0x2f,0x00,0x00,0x21,0x21,0x11,0x23,0x22,0x0e,0x02,0x07,0x03,0x23,0x13,0x3e,0x03,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x01,0x11,0x23,\r\n0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x06,0x4d,0xfd,0x08,0xd1,0x1e,0x34,0x31,0x2f,0x19,0xb4,0xc8,0xda,0x0a,0x21,0x2b,0x33,0x1d,0x47,0x70,0x4e,0x29,0x44,0x7a,0xaa,0x66,0x03,0xd0,0xfd,0xd0,0x02,0x06,0xfd,0xfa,0x02,0x50,0xfd,0x08,0xe9,0x8f,0x9c,0x2a,0x4d,0x6d,0x43,0x02,0x62,0x0b,0x25,0x47,0x3b,0xfe,0x50,0x01,0xdf,0x16,0x34,\r\n0x30,0x29,0x0b,0x04,0x10,0x43,0x60,0x7b,0x47,0x5c,0x95,0x6a,0x39,0x98,0xfe,0x23,0x97,0xfe,0x0a,0x02,0x62,0x02,0x08,0x85,0x7b,0x3d,0x62,0x44,0x25,0x00,0x00,0x03,0x00,0x3e,0xff,0xe8,0x06,0x3a,0x04,0x18,0x00,0x28,0x00,0x31,0x00,0x38,0x00,0x00,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x22,\r\n0x07,0x03,0x23,0x13,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x21,0x15,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x07,0x11,0x23,0x22,0x15,0x14,0x33,0x06,0x3a,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,0xdd,0x63,0xa1,0x77,0x48,0x0a,0x8c,0x63,0x51,0x85,0xbe,0xac,0x3d,0x54,0x79,0x7d,0x33,\r\n0x61,0x8b,0x58,0x01,0x66,0x3e,0x9b,0x5a,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0xab,0xc2,0xcf,0xc9,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x3c,0x72,0xa7,0x6b,0xa0,0xfe,0xf8,0x01,0x3c,0x6f,0x22,0x10,0x8f,0x6d,0x44,0x6d,0x4d,0x29,0x62,0x3a,0x40,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,\r\n0x31,0x01,0x43,0x9d,0xa6,0x00,0x00,0x01,0x00,0xbc,0x00,0x00,0x04,0xa2,0x05,0x9a,0x00,0x19,0x00,0x00,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x27,0x37,0x17,0x37,0x33,0x01,0x17,0x07,0x27,0x03,0x04,0xa2,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xa8,0x04,0x07,0x13,0x0c,0x01,0x04,0x7f,0x6a,\r\n0x79,0xb0,0xd1,0xfe,0xe6,0x92,0x6e,0x8b,0xe6,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x05,0x9a,0xfd,0x5e,0x0b,0x18,0x0e,0x01,0x30,0x8d,0x69,0x82,0xcd,0xfe,0xc5,0x9c,0x71,0x99,0xfe,0xff,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf8,0x04,0x00,0x00,0x14,0x00,0x00,0x01,0x37,0x33,0x07,0x17,0x07,0x27,0x07,0x01,0x23,0x01,0x23,0x11,0x23,\r\n0x11,0x33,0x11,0x33,0x37,0x27,0x37,0x02,0x84,0x78,0xd7,0xed,0x66,0x61,0x5e,0x95,0x02,0x00,0xe6,0xfe,0x3c,0x04,0xa4,0xa4,0x04,0xdf,0x57,0x5f,0x03,0x7d,0x83,0xf6,0x77,0x54,0x6e,0x9b,0xfd,0xee,0x01,0xec,0xfe,0x14,0x04,0x00,0xfe,0x2b,0xf3,0x66,0x55,0x00,0x00,0x01,0x00,0x10,0xfe,0x66,0x07,0x73,0x05,0x9a,0x00,0x2e,0x00,0x00,\r\n0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x03,0x06,0x06,0x07,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x36,0x12,0x13,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x03,0xfe,0xa3,0x9b,0xbe,0xc9,0x42,0x7a,0xb0,0x6d,0x46,0xa8,0xfe,0x72,0x6d,0x10,0x2d,0x14,0x52,0xc5,\r\n0x4f,0x3a,0x34,0x3d,0x3e,0x36,0x37,0x71,0x45,0x02,0xc2,0x4a,0x93,0xee,0xa8,0x5c,0x4b,0x90,0xd2,0x86,0xae,0xfe,0xb2,0xb8,0x6c,0xde,0xcc,0x69,0xb9,0x89,0x4f,0xfd,0x5e,0x05,0x02,0xfd,0x02,0x71,0xa3,0x36,0xd1,0x15,0x9e,0x1d,0x4a,0x4a,0x02,0x6e,0x02,0x19,0xfd,0xa0,0x5f,0xac,0xf0,0x91,0x7d,0xd6,0x9c,0x59,0x00,0x01,0x00,0x10,\r\n0xfe,0x66,0x05,0xf1,0x04,0x00,0x00,0x2c,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x23,0x06,0x02,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x13,0x21,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x02,0xed,0x75,0x8b,0x54,0x81,0x59,0x2e,0x39,0x6a,0x97,0x5e,0x20,\r\n0xa3,0xee,0x15,0x46,0x65,0x85,0x53,0x31,0x27,0x22,0x2a,0xdc,0x3f,0x02,0x1a,0x42,0x7b,0xc8,0x8e,0x4d,0x49,0x87,0xbf,0x77,0x9a,0xfe,0xa0,0xa0,0x4e,0x30,0x5b,0x85,0x54,0x5d,0x94,0x67,0x38,0xfe,0x1a,0x03,0x75,0xfb,0xfe,0xa9,0xd4,0x5d,0x0e,0x8d,0x12,0x03,0x85,0xfe,0x74,0x4c,0x8d,0xc8,0x7b,0x6b,0xb6,0x85,0x4c,0x00,0x00,0x01,\r\n0x00,0xbc,0xfe,0x66,0x07,0xc1,0x05,0x9a,0x00,0x25,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x04,0x4c,0xa3,0x9b,0xbe,0xc9,0x42,0x7a,0xb0,0x6d,0x46,0xa8,0xfd,0x1a,0xa8,0xa8,0x02,\r\n0xe6,0xa8,0x4a,0x93,0xee,0xa8,0x5c,0x4b,0x90,0xd2,0x86,0xae,0xfe,0xb2,0xb8,0x6c,0xde,0xcc,0x69,0xb9,0x89,0x4f,0xfd,0x5e,0x02,0xa3,0xfd,0x5d,0x05,0x9a,0xfd,0xa0,0x02,0x60,0xfd,0xa0,0x5f,0xac,0xf0,0x91,0x7d,0xd6,0x9c,0x59,0x00,0x01,0x00,0xa6,0xfe,0x66,0x06,0x58,0x04,0x00,0x00,0x27,0x00,0x00,0x01,0x35,0x16,0x33,0x32,0x3e,\r\n0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x03,0x54,0x75,0x8b,0x54,0x81,0x59,0x2e,0x39,0x6a,0x97,0x5e,0x20,0xa4,0xfd,0xf6,0xa4,0xa4,0x02,0x0a,0xa4,0x42,0x7b,0xc8,0x8e,0x4d,0x49,0x87,0xbf,0x77,0x9a,0xfe,0xa0,0xa0,\r\n0x4e,0x30,0x5b,0x85,0x54,0x5d,0x94,0x67,0x38,0xfe,0x1a,0x01,0xd1,0xfe,0x2f,0x04,0x00,0xfe,0x5c,0x01,0xa4,0xfe,0x74,0x4c,0x8d,0xc8,0x7b,0x6b,0xb6,0x85,0x4c,0x00,0x00,0x01,0x00,0xa6,0xfe,0x7f,0x05,0x41,0x05,0x9a,0x00,0x16,0x00,0x00,0x13,0x33,0x11,0x36,0x33,0x32,0x1e,0x02,0x15,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x34,0x23,\r\n0x22,0x07,0x11,0x23,0xa6,0xa8,0xe5,0xc5,0x5e,0x92,0x65,0x34,0xc0,0x9b,0xcd,0xf6,0xb1,0xe4,0xa8,0x05,0x9a,0xfd,0x7b,0x79,0x32,0x5f,0x8a,0x58,0xfe,0x7d,0xfd,0xe7,0x01,0x81,0x02,0x13,0xe7,0x6e,0xfd,0x74,0x00,0x01,0x00,0x98,0xfe,0x8b,0x04,0x76,0x04,0x00,0x00,0x13,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x11,\r\n0x23,0x11,0x33,0x11,0x36,0x33,0x20,0x11,0x15,0x33,0x04,0x76,0x8d,0xae,0xc2,0x94,0xaa,0xa3,0xa3,0xb5,0x97,0x01,0x58,0x97,0xfe,0x8b,0x01,0x75,0x01,0x52,0xe1,0x56,0xfe,0x23,0x04,0x00,0xfe,0x64,0x62,0xfe,0x94,0xcf,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x1a,0x00,0x00,0x01,0x07,0x11,0x23,0x11,0x07,0x35,0x37,\r\n0x35,0x23,0x35,0x33,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x11,0x37,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xaf,0x32,0x58,0x76,0x45,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0x02,0xec,0x92,0xfd,0xa6,0x01,0xf8,0x6a,0xa5,0x68,0xd9,0x8c,0xa6,0x51,0x81,0x5a,0x30,0x12,0x94,0x1b,0xd9,0xfe,0x5f,0x8f,0x00,0x01,0x00,0x35,\r\n0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x18,0x00,0x00,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xba,0x0d,0x3b,0x52,0x67,0x39,0x4b,0x2c,0x30,0x3d,0x7b,0x23,0x05,0x09,0x8c,0xfb,0x83,0x03,0x74,0x8c,0x7d,0x8c,0x3a,0x5d,\r\n0x40,0x22,0x12,0x94,0x1b,0x6e,0x00,0x02,0x00,0x5c,0xff,0xe7,0x04,0x53,0x05,0xfe,0x00,0x27,0x00,0x38,0x00,0x00,0x01,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x03,0x04,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,\r\n0x02,0x35,0x34,0x2e,0x02,0x03,0xe7,0xa9,0xab,0x32,0x51,0x3a,0x20,0x19,0x36,0x55,0x3c,0x72,0xa7,0x6e,0x36,0x4a,0x88,0xc0,0x77,0x6d,0xb5,0x83,0x49,0xd3,0xcc,0xee,0x36,0x65,0x91,0x5a,0xa6,0xbf,0xfe,0x92,0x2f,0x57,0x7a,0x4b,0x4f,0x7f,0x59,0x30,0x22,0x4a,0x75,0x05,0xbe,0xb7,0x65,0x12,0x21,0x2f,0x1d,0x18,0x31,0x36,0x3e,0x24,\r\n0x45,0x7c,0x81,0x8f,0x5a,0x75,0xbb,0x83,0x47,0x46,0x7f,0xb1,0x6c,0x9c,0x01,0x01,0x58,0x93,0xa3,0x40,0x63,0x44,0x23,0xfd,0x75,0x95,0xfe,0xec,0x4f,0x7e,0x59,0x30,0x32,0x5d,0x82,0x50,0x3b,0x68,0x63,0x62,0x00,0x02,0x00,0xbc,0x00,0x00,0x05,0x0c,0x05,0x9a,0x00,0x05,0x00,0x09,0x00,0x00,0x21,0x21,0x11,0x33,0x11,0x21,0x05,0x23,\r\n0x11,0x33,0x05,0x0c,0xfd,0x18,0xa8,0x02,0x40,0xfc,0x58,0xa8,0xa8,0x05,0x9a,0xfa,0xfe,0x98,0x05,0x9a,0x00,0x01,0x00,0x1e,0x00,0x00,0x03,0x26,0x05,0xec,0x00,0x13,0x00,0x00,0x01,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x03,0x26,0x88,0xa4,0xb0,0xa4,0x88,0x88,0xa4,0xb0,\r\n0xa4,0x88,0x04,0xb2,0xfb,0x4e,0x04,0xb2,0xfb,0x4e,0x04,0xb2,0x86,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x01,0x00,0x81,0xff,0xe9,0x04,0x4b,0x05,0xee,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x17,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,\r\n0x03,0x8d,0x5a,0x64,0x43,0x7d,0xb1,0x6e,0x77,0xb7,0x7d,0x40,0x3b,0x62,0x7d,0x42,0x80,0x3e,0x6c,0x50,0x2e,0x2a,0x51,0x75,0x4b,0x43,0x6d,0x4e,0x2b,0x38,0x33,0x03,0x9b,0x43,0xda,0x8d,0x75,0xbf,0x89,0x4b,0x56,0xa4,0xf0,0x9b,0x92,0x01,0x11,0xea,0xb9,0x3a,0x6b,0x40,0x9e,0xc2,0xe8,0x8b,0x6c,0xb7,0x84,0x4b,0x36,0x5e,0x82,0x4c,\r\n0x60,0x96,0x32,0x00,0x00,0x01,0x00,0x77,0xff,0xe8,0x03,0xaa,0x05,0xf1,0x00,0x25,0x00,0x00,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x36,0x36,0x37,0x17,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x02,0xf1,0x58,0x61,0x33,0x61,0x8c,0x5a,0x6c,0xa5,0x6f,0x39,0x3b,0x61,\r\n0x7c,0x42,0x78,0x3e,0x6c,0x50,0x2e,0x25,0x47,0x66,0x41,0x31,0x4d,0x34,0x1c,0x38,0x33,0x03,0x96,0x42,0xd8,0x8c,0x75,0xbf,0x89,0x4b,0x56,0xa5,0xf0,0x9b,0x93,0x01,0x13,0xeb,0xb9,0x39,0x65,0x40,0x9f,0xc4,0xec,0x8d,0x6e,0xbb,0x88,0x4d,0x37,0x62,0x86,0x4e,0x61,0x98,0x33,0x00,0x00,0x02,0x00,0x06,0xff,0xe7,0x04,0x96,0x05,0x9a,\r\n0x00,0x1a,0x00,0x29,0x00,0x00,0x01,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x01,0x33,0x01,0x16,0x16,0x17,0x33,0x01,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x26,0x04,0x96,0xfe,0x45,0x3c,0x70,0x71,0x76,0x41,0x3b,0x5f,0x43,0x24,0x42,0x6e,0x8d,0x4b,0x30,0x2f,0xfe,0x4f,0xbf,\r\n0x01,0x58,0x05,0x12,0x0e,0x05,0x01,0x65,0xfd,0x96,0x2e,0x4a,0x35,0x1d,0x3a,0x35,0x18,0x35,0x3c,0x42,0x24,0x43,0x05,0x9a,0xfc,0x17,0x87,0xb0,0x69,0x2a,0x26,0x44,0x5e,0x37,0x48,0x6f,0x4b,0x26,0x06,0x03,0x92,0xfd,0x02,0x0a,0x2e,0x25,0x03,0x5b,0xfb,0xea,0x15,0x26,0x35,0x20,0x3b,0x3c,0x19,0x38,0x5c,0x44,0x16,0x00,0x00,0x02,\r\n0xff,0xbd,0xfe,0x1e,0x03,0xd5,0x04,0x00,0x00,0x19,0x00,0x29,0x00,0x00,0x01,0x01,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x01,0x33,0x01,0x17,0x33,0x36,0x36,0x37,0x01,0x01,0x22,0x0e,0x02,0x15,0x14,0x33,0x32,0x3e,0x02,0x37,0x37,0x26,0x22,0x03,0xd5,0xfe,0x29,0x7e,0xe4,0x32,0x52,0x3b,0x20,0x43,0x6f,\r\n0x8f,0x4b,0x14,0x25,0x13,0xfe,0x79,0xb6,0x01,0x15,0x15,0x06,0x02,0x0a,0x08,0x01,0x23,0xfe,0x08,0x2e,0x4c,0x36,0x1e,0x49,0x12,0x2a,0x2b,0x28,0x0f,0x22,0x0e,0x1e,0x04,0x00,0xfb,0x5c,0xfe,0xc2,0x1b,0x36,0x51,0x36,0x48,0x6f,0x4a,0x26,0x02,0x02,0x03,0xe7,0xfc,0xec,0x4e,0x0c,0x26,0x1a,0x03,0x16,0xfb,0x93,0x15,0x25,0x35,0x20,\r\n0x58,0x12,0x25,0x38,0x25,0x51,0x02,0x00,0x00,0x02,0x00,0xbc,0xff,0xe8,0x05,0x8c,0x05,0xb2,0x00,0x18,0x00,0x2d,0x00,0x00,0x01,0x3e,0x03,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x15,0x23,0x11,0x33,0x11,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x01,0x64,\r\n0x27,0x70,0x7c,0x7e,0x35,0x85,0xe0,0xa2,0x5b,0x67,0xb0,0xea,0x82,0x42,0x7c,0x6c,0x5a,0x21,0xa8,0xa8,0x16,0x65,0x7c,0x84,0x35,0x5d,0xa5,0x7d,0x49,0x40,0x76,0xa5,0x66,0x33,0x82,0x7d,0x69,0x1c,0x04,0xab,0x4a,0x65,0x3d,0x1b,0x6a,0xc3,0xfe,0xeb,0xab,0xa9,0xfe,0xf1,0xbf,0x66,0x22,0x3b,0x4d,0x2b,0xbd,0x05,0x9a,0xfc,0x6d,0x6e,\r\n0x96,0x5c,0x28,0x4e,0x96,0xd9,0x8c,0x8a,0xdc,0x9a,0x52,0x27,0x5c,0x98,0x70,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x40,0x04,0x18,0x00,0x31,0x00,0x3a,0x00,0x00,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x17,0x0e,0x03,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,\r\n0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x01,0x0a,0x04,0xaf,0x9b,0x3c,0x79,0x6b,0x52,0x15,0x6a,0x03,0x18,0x2d,0x45,0x30,0x28,0x46,0x3b,0x32,0x15,0x4a,0x1e,0x4d,0x56,0x5c,0x2d,0x54,0x7a,0x1b,0x29,0x67,0x75,0x7d,0x3f,0x75,0xb7,0x7e,0x42,0x49,0x7f,0xad,0x63,0x65,0x9d,0x6b,0x38,0xa8,0x01,\r\n0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x12,0x39,0x6a,0x57,0x1b,0x1f,0x43,0x37,0x24,0x23,0x3d,0x51,0x2e,0x23,0x57,0x7f,0x54,0x29,0x67,0x62,0x45,0x5c,0x38,0x17,0x47,0x89,0xc6,0x7e,0x77,0xc7,0x8f,0x4f,0x43,0x7f,0xb6,0x73,0x56,0x8b,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x00,0x01,0x00,0x78,0xff,0xee,0x02,0x8e,\r\n0x05,0xfe,0x00,0x25,0x00,0x00,0x37,0x16,0x33,0x32,0x37,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x0e,0x03,0x23,0x22,0x27,0x78,0x2b,0x51,0x69,0x47,0x22,0x24,0x24,0x22,0x47,0x69,0x51,0x2b,0x24,0x3e,0x2d,0x51,0x46,0x36,0x12,0x04,0xa4,0xa4,\r\n0x04,0x12,0x36,0x46,0x51,0x2d,0x3e,0x24,0xa6,0x21,0x63,0x30,0x81,0x53,0x02,0x14,0x52,0x82,0x30,0x63,0x21,0xaa,0x0e,0x1f,0x3b,0x55,0x36,0xd3,0xfa,0x14,0xd3,0x36,0x55,0x3b,0x1f,0x0e,0x00,0x03,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,0x00,0x13,0x00,0x2f,0x00,0x3e,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,\r\n0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x36,0x36,0x35,0x34,0x26,0x03,0x22,0x0e,0x02,0x15,0x14,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x02,0x52,0x71,0xb8,0x82,0x47,0x49,0x88,0xc1,0x78,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,\r\n0x59,0x30,0x4d,0x46,0x06,0x1f,0x38,0x4d,0x2d,0x2c,0x4a,0x36,0x1f,0x07,0x3e,0x40,0xaa,0x9f,0x18,0x29,0x1e,0x11,0x70,0x19,0x2b,0x1f,0x11,0x41,0x18,0x4b,0x8a,0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x73,0xab,0x31,0x18,0x1b,0x2d,0x49,0x34,0x1c,0x1d,0x33,0x46,0x2a,\r\n0x1c,0x16,0x31,0xa7,0x74,0xc1,0xcf,0xfd,0xc5,0x11,0x1f,0x29,0x18,0x70,0x11,0x1e,0x29,0x18,0x31,0x40,0x00,0x01,0x00,0x49,0x00,0x00,0x02,0xc0,0x04,0x33,0x00,0x0b,0x00,0x00,0x37,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x49,0x01,0xd3,0xfe,0x6b,0x01,0x95,0xfe,0x49,0x02,0x5b,0xfd,0x89,0x8b,0x01,0x52,0x8b,0x01,\r\n0x40,0x8b,0xfb,0xcd,0x00,0x02,0x00,0x06,0xfd,0xe3,0x01,0x4a,0x02,0x13,0x00,0x0d,0x00,0x19,0x00,0x00,0x05,0x14,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x35,0x11,0x33,0x27,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x40,0x74,0x6e,0x15,0x2c,0x17,0x3a,0x20,0x6a,0x76,0x3f,0x1d,0x2a,0x2a,0x1d,0x1e,0x2b,\r\n0x2b,0xf7,0x8f,0x97,0x0b,0x0a,0x72,0x25,0xb5,0x02,0x19,0x76,0x28,0x1e,0x1d,0x27,0x27,0x1d,0x1d,0x29,0x00,0x01,0x00,0x1c,0x02,0x9a,0x02,0xdb,0x05,0xa3,0x00,0x08,0x00,0x00,0x01,0x01,0x23,0x01,0x33,0x13,0x17,0x37,0x13,0x02,0xdb,0xfe,0xd7,0x79,0xfe,0xe3,0x83,0xcf,0x0a,0x0a,0xd9,0x05,0xa3,0xfc,0xf7,0x03,0x09,0xfd,0xb7,0x2f,\r\n0x2e,0x02,0x4a,0x00,0x00,0x01,0x00,0x79,0xfe,0x92,0x03,0xde,0x05,0xb2,0x00,0x49,0x00,0x00,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x26,0x27,0x26,0x26,0x27,0x35,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,\r\n0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x17,0x1e,0x03,0x33,0x32,0x36,0x37,0x03,0xab,0x23,0x5b,0x38,0x32,0x5f,0x53,0x42,0x15,0x41,0x8c,0x23,0x3d,0x14,0x22,0x5f,0x69,0x6a,0x2d,0x9c,0x98,0x27,0x53,0x7e,0x57,0x4b,0x82,0x60,0x37,0x56,0x8c,0xb3,0x5d,0xd3,0x62,0x7f,0xc7,0x38,0x6d,0x56,0x36,0x29,0x50,0x73,0x4b,0x4d,0x8a,0x68,0x3d,\r\n0x4d,0x83,0xac,0x5f,0x13,0x1d,0x0b,0x0f,0x2c,0x33,0x38,0x1a,0x2c,0x56,0x2b,0xfe,0xb9,0x14,0x13,0x15,0x2b,0x40,0x2b,0x83,0x4a,0x0a,0x18,0x0e,0xc6,0x1e,0x30,0x21,0x12,0x71,0x6d,0x37,0x4f,0x45,0x45,0x2d,0x27,0x4d,0x5e,0x77,0x50,0x62,0x90,0x5f,0x2e,0x33,0xbd,0x58,0x17,0x34,0x52,0x3b,0x37,0x50,0x42,0x3e,0x25,0x26,0x54,0x66,\r\n0x7d,0x4f,0x64,0x8e,0x5d,0x2e,0x04,0x11,0x28,0x17,0x1d,0x2c,0x1d,0x0f,0x14,0x15,0x00,0x01,0x00,0x21,0xfe,0x8b,0x04,0x64,0x05,0x9a,0x00,0x1c,0x00,0x00,0x01,0x01,0x1e,0x03,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x27,0x2e,0x03,0x23,0x23,0x35,0x01,0x21,0x35,0x21,0x04,0x64,0xfc,0xbd,0x3a,0x6d,0x60,0x54,0x23,\r\n0x4e,0x75,0x32,0x29,0x43,0x28,0x40,0x69,0xaa,0xaa,0x2b,0x51,0x54,0x59,0x33,0xae,0x03,0x41,0xfd,0x02,0x04,0x00,0x05,0x72,0xfb,0x2e,0x0c,0x30,0x3e,0x48,0x24,0x51,0x50,0x14,0x15,0x91,0x26,0xba,0x2e,0x47,0x2e,0x18,0x2f,0x04,0xd3,0x98,0x00,0x01,0x00,0x70,0xff,0xea,0x01,0x50,0x01,0xcf,0x00,0x17,0x00,0x00,0x17,0x22,0x2e,0x02,\r\n0x35,0x34,0x3e,0x02,0x37,0x17,0x0e,0x03,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0xdf,0x17,0x28,0x1e,0x12,0x1b,0x24,0x26,0x0b,0x66,0x0b,0x16,0x13,0x10,0x06,0x24,0x30,0x12,0x1f,0x29,0x16,0x12,0x1e,0x29,0x17,0x20,0x67,0x6e,0x63,0x1d,0x13,0x19,0x3c,0x41,0x41,0x1e,0x0a,0x3d,0x26,0x17,0x29,0x1e,0x12,0x00,0x01,0x00,0x70,0x00,0xf8,\r\n0x01,0x50,0x01,0xd9,0x00,0x13,0x00,0x00,0x37,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0xdf,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0xf8,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x01,0x00,0x27,0xff,0xd4,\r\n0x01,0x3c,0x01,0xc0,0x00,0x03,0x00,0x00,0x01,0x03,0x23,0x13,0x01,0x3c,0xa0,0x75,0x75,0x01,0xc0,0xfe,0x14,0x01,0xec,0x00,0x00,0x02,0x00,0x6f,0xff,0xea,0x01,0x9a,0x05,0x08,0x00,0x13,0x00,0x17,0x00,0x00,0x37,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x03,0x13,0x33,0x03,0xdf,0x17,0x29,0x1e,\r\n0x12,0x12,0x1e,0x29,0x17,0x17,0x29,0x1e,0x12,0x12,0x1e,0x29,0x43,0xa0,0x75,0x75,0xc8,0x12,0x1e,0x29,0x17,0x18,0x28,0x1d,0x11,0x11,0x1e,0x28,0x17,0x17,0x29,0x1e,0x12,0x02,0x54,0x01,0xec,0xfe,0x14,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x01,0xda,0x05,0x99,0x00,0x09,0x00,0x00,0x25,0x23,0x03,0x05,0x35,0x05,0x03,0x33,0x03,0x33,\r\n0x01,0xaa,0x4c,0x28,0xfe,0xfa,0x01,0x2e,0x28,0x9c,0x28,0x30,0xe5,0x02,0xb6,0x1e,0x96,0x14,0x01,0x9a,0xfe,0x66,0x00,0x01,0x01,0x2e,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x09,0x00,0x00,0x01,0x33,0x03,0x33,0x03,0x25,0x15,0x25,0x03,0x23,0x01,0x2e,0x30,0x28,0x9c,0x28,0x01,0x2e,0xfe,0xfa,0x28,0x4c,0x03,0xff,0x01,0x9a,0xfe,0x66,\r\n0x14,0x96,0x1e,0xfd,0x4a,0x00,0x00,0x01,0x00,0x30,0x00,0xe5,0x02,0xd8,0x05,0x99,0x00,0x0b,0x00,0x00,0x01,0x25,0x13,0x23,0x13,0x05,0x35,0x05,0x13,0x33,0x13,0x25,0x02,0xd8,0xfe,0xd2,0x28,0x9c,0x28,0xfe,0xd2,0x01,0x06,0x28,0x4c,0x28,0x01,0x06,0x02,0x6b,0x14,0xfe,0x66,0x01,0x9a,0x14,0x96,0x1e,0x02,0xb6,0xfd,0x4a,0x1e,0x00,\r\n0x00,0x02,0x00,0x83,0x01,0x31,0x03,0x27,0x05,0xd3,0x00,0x1f,0x00,0x2d,0x00,0x00,0x01,0x26,0x26,0x27,0x26,0x35,0x34,0x37,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x14,0x1e,0x02,0x17,0x16,0x15,0x14,0x06,0x07,0x01,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x35,0x34,0x2e,0x02,0x02,0x1e,0x18,0x5d,0x3d,0xe9,\r\n0x93,0x6a,0x31,0x5a,0x7d,0x4c,0x84,0x57,0x65,0x7a,0xa8,0x0d,0x32,0x61,0x54,0xdf,0x3d,0x39,0xfe,0xdd,0x65,0x1a,0x3c,0x61,0x47,0x58,0x18,0x38,0x5d,0x01,0x31,0x13,0x3c,0x20,0x7a,0xc3,0xa3,0x51,0x52,0x8d,0x40,0x6b,0x4d,0x2b,0x2b,0x9e,0x3e,0x90,0x1c,0x2f,0x32,0x3a,0x28,0x6a,0xbb,0x4c,0x7b,0x35,0x01,0xd1,0x33,0x6c,0x25,0x3d,\r\n0x39,0x39,0x20,0x43,0x69,0x24,0x3b,0x36,0x35,0x00,0x00,0x01,0x00,0x00,0x01,0xfa,0x0b,0xf2,0x02,0x7b,0x00,0x03,0x00,0x00,0x01,0x21,0x35,0x21,0x0b,0xf2,0xf4,0x0e,0x0b,0xf2,0x01,0xfa,0x81,0x00,0x00,0x01,0x00,0x00,0x01,0xfa,0x0f,0xfe,0x02,0x7b,0x00,0x03,0x00,0x00,0x01,0x21,0x35,0x21,0x0f,0xfe,0xf0,0x02,0x0f,0xfe,0x01,0xfa,\r\n0x81,0x00,0x00,0x01,0x00,0x25,0x06,0x12,0x02,0x7d,0x09,0x46,0x00,0x1f,0x00,0x00,0x01,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x1e,0x03,0x33,0x32,0x36,0x37,0x02,0x7d,0x5c,0x85,0x55,0x8a,0x62,0x36,0x3a,0x67,0x8f,0x56,0x74,0x5e,0x6b,0x68,0x6b,0x8d,0x0e,0x01,\r\n0x54,0xfe,0xac,0x06,0x2a,0x42,0x58,0x35,0x39,0x6d,0x34,0x06,0x44,0x32,0x3a,0x68,0x92,0x58,0x60,0x9c,0x6f,0x3d,0x25,0x7c,0x38,0x83,0x7b,0x69,0x39,0x5d,0x42,0x23,0x1f,0x21,0x00,0x01,0x00,0x5b,0x06,0x20,0x02,0xe6,0x09,0x3a,0x00,0x09,0x00,0x00,0x01,0x23,0x11,0x01,0x23,0x11,0x33,0x11,0x01,0x33,0x02,0xe6,0x78,0xfe,0x76,0x89,\r\n0x78,0x01,0x87,0x8c,0x06,0x20,0x02,0x64,0xfd,0x9c,0x03,0x1a,0xfd,0x9e,0x02,0x62,0x00,0x03,0xff,0xda,0x06,0x1f,0x01,0x31,0x09,0x2f,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x00,0x13,0x23,0x11,0x33,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xc2,0x76,\r\n0x76,0x2c,0x1b,0x28,0x27,0x1b,0x1d,0x27,0x26,0xeb,0x1d,0x29,0x28,0x1c,0x1c,0x29,0x28,0x06,0x1f,0x02,0x3e,0x51,0x24,0x1c,0x1c,0x25,0x25,0x1c,0x1b,0x25,0x26,0x1a,0x1c,0x25,0x25,0x1c,0x1b,0x25,0x00,0x01,0xff,0xf7,0x05,0x1c,0x02,0x26,0x08,0x5d,0x00,0x14,0x00,0x00,0x01,0x01,0x06,0x06,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,\r\n0x36,0x37,0x37,0x26,0x02,0x27,0x33,0x13,0x13,0x02,0x26,0xfe,0xfc,0x22,0x68,0x41,0x12,0x24,0x12,0x2b,0x17,0x1b,0x2e,0x0e,0x2a,0x35,0x70,0x36,0x80,0x97,0x9e,0x08,0x5d,0xfd,0x72,0x55,0x5e,0x05,0x06,0x68,0x0f,0x25,0x23,0x65,0x89,0x01,0x1e,0x89,0xfe,0x53,0x01,0xad,0x00,0x02,0x00,0x0c,0x06,0x1f,0x02,0xe6,0x09,0x39,0x00,0x0e,\r\n0x00,0x16,0x00,0x00,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0xea,0xde,0x01,0x55,0x84,0x79,0x88,0x25,0x45,0x62,0x3d,0x7c,0x71,0x48,0x50,0x98,0x06,0x1f,0x02,0xb0,0x6a,0xfe,0xb9,0x74,0x6e,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x44,0x3e,0x7f,0x00,0x03,\r\n0x00,0x5b,0x06,0x1f,0x03,0x0c,0x09,0x39,0x00,0x03,0x00,0x10,0x00,0x18,0x00,0x00,0x01,0x23,0x11,0x33,0x01,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x03,0x0c,0x77,0x77,0xfd,0x4f,0x78,0x83,0x7a,0x88,0x25,0x45,0x62,0x3d,0x7c,0x71,0x48,0x50,0x98,0x06,0x1f,0x03,0x1a,0xfc,\r\n0xe6,0x03,0x1a,0xfe,0xb9,0x75,0x6d,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x43,0x3f,0x7f,0x00,0x02,0x00,0x5a,0x06,0x1f,0x02,0x57,0x09,0x39,0x00,0x0c,0x00,0x14,0x00,0x00,0x13,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x23,0x5a,0x78,0x83,0x7a,0x88,0x25,0x45,0x62,0x3d,0x7c,\r\n0x71,0x48,0x50,0x98,0x06,0x1f,0x03,0x1a,0xfe,0xb9,0x75,0x6d,0x37,0x59,0x3f,0x22,0x01,0x6b,0xfe,0xff,0x43,0x3f,0x7f,0x00,0x00,0x01,0x00,0x1e,0x06,0x1f,0x03,0xd5,0x09,0x39,0x00,0x2d,0x00,0x00,0x01,0x2e,0x05,0x27,0x33,0x1e,0x03,0x17,0x13,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x3e,0x05,0x37,0x33,0x0e,0x05,0x07,0x23,0x26,0x26,\r\n0x27,0x03,0x01,0x19,0x2b,0x41,0x31,0x24,0x1c,0x14,0x0a,0x79,0x0c,0x20,0x2b,0x38,0x26,0x6b,0x0c,0x12,0x0f,0x0d,0x06,0x78,0x0d,0x1f,0x2b,0x39,0x26,0x1a,0x2a,0x23,0x1c,0x18,0x14,0x09,0x78,0x09,0x15,0x1b,0x24,0x32,0x40,0x2b,0x6b,0x2a,0x3f,0x18,0x68,0x06,0x1f,0x53,0x89,0x7b,0x73,0x7a,0x86,0x50,0x6c,0xa7,0x90,0x89,0x4f,0x01,\r\n0x11,0x28,0x52,0x59,0x60,0x37,0x6e,0xa6,0x91,0x89,0x51,0x36,0x5f,0x5d,0x5f,0x6a,0x7a,0x4a,0x51,0x86,0x7a,0x74,0x7a,0x89,0x52,0x51,0x83,0x3c,0xfe,0xf0,0x00,0x01,0x00,0x5c,0x06,0x12,0x03,0xfb,0x09,0x46,0x00,0x27,0x00,0x00,0x01,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,\r\n0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x15,0x21,0x1e,0x03,0x33,0x32,0x36,0x37,0x03,0xfb,0x5e,0x84,0x50,0x84,0x61,0x3a,0x06,0xcf,0x79,0x79,0xd1,0x09,0x40,0x66,0x86,0x4e,0x3b,0x68,0x2f,0x6d,0x66,0x6c,0x8d,0x0d,0x01,0x53,0xfe,0xac,0x06,0x2a,0x42,0x58,0x35,0x39,0x6d,0x35,0x06,0x44,0x32,0x33,0x5e,0x83,0x50,0xfe,0xa9,0x03,0x1a,\r\n0xfe,0xa6,0x52,0x85,0x5d,0x33,0x13,0x12,0x7c,0x38,0x83,0x7b,0x69,0x39,0x5d,0x42,0x23,0x1f,0x21,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x71,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,\r\n0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xc8,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,\r\n0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfd,0xa3,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,\r\n0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfb,0xe1,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,\r\n0x00,0x00,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x07,0x58,0xfa,0x1f,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,\r\n0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x64,0xff,0xf1,0x02,0x79,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x21,0x23,0x11,0x33,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x02,0x79,0x94,0x94,0xfe,0x5a,0x17,0x28,0x1e,0x12,0x12,0x1e,0x28,0x17,0x17,0x29,0x1f,0x12,\r\n0x12,0x1f,0x29,0x07,0x58,0xf8,0x99,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x71,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,\r\n0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x06,0x90,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x04,0xfb,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,\r\n0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x03,0x39,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,\r\n0x1e,0x12,0x00,0x02,0x00,0x96,0x00,0x00,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x01,0x77,\r\n0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x02,0x00,0x96,0xff,0xf1,0x02,0xab,0x07,0x58,0x00,0x03,0x00,0x17,0x00,0x00,0x13,0x33,0x11,0x23,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x96,0x94,0x94,0x01,0xa6,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,\r\n0x17,0x16,0x29,0x1e,0x12,0x12,0x1e,0x28,0x07,0x58,0xf8,0xa8,0x0f,0x12,0x1e,0x29,0x17,0x17,0x29,0x1f,0x12,0x12,0x1f,0x29,0x17,0x17,0x29,0x1e,0x12,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x05,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x02,0xc9,0x06,0xd4,0xf9,0x2c,0x07,0x58,0x00,\r\n0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x94,0x02,0x35,0x05,0x1f,0xfa,0xe1,0x07,0x58,0xfe,0x4b,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,\r\n0x94,0x94,0x02,0x35,0x03,0x6a,0xfc,0x96,0x07,0x58,0xfc,0x96,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x07,0x00,0x00,0x01,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x03,0x5f,0xfd,0xcb,0x94,0x94,0x02,0x35,0x01,0xb5,0xfe,0x4b,0x07,0x58,0xfa,0xe1,0x00,0x01,0x00,0x96,0x00,0x00,0x03,0x5f,0x07,0x58,0x00,0x05,0x00,0x00,\r\n0x13,0x33,0x11,0x21,0x15,0x21,0x96,0x94,0x02,0x35,0xfd,0x37,0x07,0x58,0xf9,0x2c,0x84,0x00,0x00,0x04,0x00,0xb4,0xfe,0x31,0x09,0xec,0x07,0x69,0x00,0x0e,0x00,0x26,0x00,0x3a,0x00,0x46,0x00,0x5f,0xb9,0x00,0x0e,0x01,0x43,0xb2,0x07,0x0d,0x36,0xbb,0x01,0x43,0x00,0x20,0x00,0x16,0x01,0x43,0x40,0x0c,0x2c,0x0d,0x20,0x2c,0x2c,0x20,\r\n0x0d,0x03,0x3b,0x41,0x3b,0x44,0xbc,0x01,0x42,0x00,0x3e,0x01,0x41,0x00,0x27,0x01,0x44,0xb2,0x1b,0x07,0x31,0xb8,0x01,0x44,0x40,0x0c,0x0f,0x19,0x0e,0x18,0x04,0x0c,0x01,0x0c,0x06,0x07,0x00,0x07,0x00,0x3f,0xde,0xce,0x33,0x5d,0x3f,0x3f,0xe6,0x3f,0xe6,0x3f,0x3f,0x01,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xe6,0x10,0xe6,\r\n0x10,0xcd,0xe6,0x30,0x31,0x01,0x23,0x0e,0x03,0x07,0x15,0x3e,0x03,0x37,0x11,0x33,0x05,0x32,0x3e,0x04,0x35,0x34,0x02,0x26,0x26,0x23,0x22,0x06,0x06,0x02,0x15,0x14,0x1e,0x04,0x13,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x10,0x00,0x21,0x20,0x00,0x11,0x10,0x00,0x21,0x20,0x00,0x04,0x2f,\r\n0x7a,0x26,0x68,0x75,0x79,0x36,0x30,0x65,0x5b,0x49,0x13,0xe0,0x02,0x8f,0x64,0x8f,0x62,0x3b,0x20,0x0a,0x2c,0x61,0x9d,0x70,0x75,0xa8,0x6c,0x33,0x0f,0x24,0x3c,0x5c,0x7e,0x6a,0x3a,0x4a,0x2b,0x10,0x11,0x2c,0x4d,0x3b,0x3c,0x4e,0x2d,0x12,0x12,0x2f,0x50,0xfa,0x1d,0x02,0xb7,0x01,0xe5,0x01,0xe5,0x02,0xb7,0xfd,0x49,0xfe,0x1b,0xfe,\r\n0x1b,0xfd,0x49,0x05,0xba,0x21,0x45,0x3f,0x33,0x0f,0xce,0x0c,0x2a,0x30,0x31,0x13,0xfb,0x51,0x18,0x45,0x73,0x98,0xa6,0xa9,0x4c,0xb8,0x01,0x13,0xb8,0x5c,0x62,0xc2,0xfe,0xe0,0xbe,0x58,0xae,0x9f,0x87,0x64,0x38,0x05,0x0d,0x46,0x8d,0xd3,0x8d,0x87,0xcc,0x87,0x44,0x42,0x85,0xc8,0x85,0x8f,0xd7,0x8f,0x48,0xfd,0xd8,0x01,0xe5,0x02,\r\n0xb7,0xfd,0x49,0xfe,0x1b,0xfe,0x1b,0xfd,0x49,0x02,0xb7,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x04,0x08,0x05,0x9a,0x00,0x1a,0x00,0x27,0x00,0x5c,0x40,0x35,0x76,0x15,0x01,0x59,0x22,0x69,0x22,0x89,0x22,0x03,0x22,0x15,0x29,0x05,0x01,0x1c,0x09,0x0d,0x0b,0x06,0x0f,0x07,0x03,0x02,0x0a,0x02,0x0b,0x1a,0x1d,0x0e,0x1d,0x2f,0x02,0x6f,\r\n0x02,0x7f,0x02,0xbf,0x02,0x04,0x2f,0x1d,0x01,0x02,0x1d,0x02,0x1d,0x05,0x27,0x0f,0x06,0x05,0x18,0x00,0x3f,0x3f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x11,0x33,0x10,0xcd,0x32,0x11,0x33,0x10,0xcd,0x32,0x01,0x2f,0x33,0x33,0xce,0x32,0xcd,0x32,0x32,0x10,0xde,0xcd,0x5d,0x5d,0x30,0x31,0x01,0x15,0x21,0x15,0x21,0x11,0x23,0x11,\r\n0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x01,0x5b,0x01,0x82,0xfe,0x7e,0xa4,0x77,0x77,0x77,0x77,0x01,0x84,0x5c,0xa7,0x7f,0x4b,0x43,0x80,0xb8,0x76,0xbc,0xa7,0x57,0x85,0x5b,0x2e,0x2a,0x54,0x7e,0x54,0x02,0x7f,0xcf,0x8b,0xfe,\r\n0xdb,0x01,0x25,0x8b,0xcf,0x8b,0x02,0x90,0x2f,0x60,0x92,0x63,0x66,0x98,0x66,0x33,0x02,0x90,0xfd,0xfb,0x1b,0x3d,0x64,0x48,0x47,0x62,0x3d,0x1b,0x00,0x01,0x00,0x32,0x00,0x00,0x05,0xe6,0x05,0x9a,0x00,0x27,0x00,0x57,0x40,0x35,0x67,0x25,0x01,0x00,0x12,0x25,0x13,0x13,0x1e,0x0a,0x0f,0x07,0x3f,0x07,0x02,0x07,0x29,0x1b,0x5f,0x1e,\r\n0x6f,0x1e,0x8f,0x1e,0xaf,0x1e,0x04,0x1e,0x78,0x11,0x88,0x11,0x02,0x11,0x5b,0x14,0x01,0x3a,0x14,0x4a,0x14,0x02,0x14,0x00,0x25,0x25,0x13,0x27,0x06,0x1c,0x09,0x13,0x18,0x00,0x3f,0x33,0x33,0x3f,0x12,0x39,0x2f,0x33,0xcd,0x5d,0x5d,0x32,0x5d,0x01,0x2f,0x5d,0xcd,0x10,0xde,0x5d,0xcd,0x12,0x39,0x2f,0x33,0xcd,0x32,0x00,0x5d,0x30,\r\n0x31,0x01,0x1e,0x04,0x12,0x15,0x15,0x23,0x35,0x34,0x2e,0x04,0x27,0x11,0x23,0x11,0x0e,0x05,0x15,0x15,0x23,0x35,0x34,0x12,0x3e,0x03,0x37,0x11,0x33,0x03,0x5e,0x55,0xa3,0x90,0x78,0x57,0x31,0xa4,0x27,0x45,0x5d,0x6c,0x75,0x3a,0xa4,0x39,0x73,0x6c,0x5e,0x46,0x28,0xa4,0x32,0x58,0x7a,0x90,0xa1,0x53,0xa4,0x04,0x6d,0x09,0x39,0x65,\r\n0x95,0xcd,0xfe,0xf9,0xa5,0xb8,0xbf,0x91,0xe3,0xac,0x79,0x51,0x2c,0x09,0xfc,0x22,0x03,0xe0,0x08,0x2a,0x4f,0x7a,0xad,0xe5,0x94,0xbf,0xb8,0xa8,0x01,0x0b,0xce,0x95,0x63,0x35,0x08,0x01,0x2c,0x00,0x00,0x16,0x00,0x26,0x00,0x00,0x07,0x15,0x05,0xc0,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,\r\n0x00,0x27,0x00,0x2d,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x57,0x00,0x5c,0x00,0x62,0x00,0x7c,0x00,0x00,0x13,0x35,0x33,0x15,0x23,0x15,0x03,0x35,0x33,0x15,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x13,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x01,0x23,\r\n0x35,0x33,0x35,0x23,0x35,0x33,0x25,0x35,0x33,0x15,0x23,0x35,0x03,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0x23,0x35,0x33,0x01,0x23,0x27,0x23,0x07,0x23,0x13,0x33,0x13,0x27,0x27,0x15,0x07,0x05,0x21,0x11,0x33,0x11,\r\n0x33,0x05,0x23,0x11,0x34,0x34,0x37,0x03,0x23,0x03,0x15,0x11,0x23,0x11,0x33,0x13,0x16,0x16,0x17,0x36,0x37,0x3e,0x03,0x37,0x33,0x26,0xeb,0x96,0x55,0x55,0x96,0x5b,0xd3,0xd3,0xd3,0x5e,0xd1,0xfd,0x0d,0x55,0x55,0x02,0x22,0xd1,0xfd,0x0d,0x55,0x55,0x55,0x55,0x05,0xae,0xec,0x56,0x96,0x96,0x56,0xfd,0xe6,0xd2,0x01,0x48,0x56,0x56,\r\n0x56,0x56,0xfc,0xb7,0xd1,0xd1,0xd1,0x5e,0xd2,0x01,0x48,0x56,0x56,0xfb,0x91,0x50,0x35,0xc6,0x32,0x50,0xc2,0x48,0x28,0x4d,0x01,0x4b,0x02,0x7d,0xfe,0xed,0x4a,0xc9,0x02,0x4a,0x4b,0x01,0xa9,0x28,0xaa,0x48,0x5b,0x9a,0x08,0x04,0x05,0x0a,0x08,0x12,0x28,0x29,0x28,0x12,0x58,0x04,0xd4,0xec,0x55,0x97,0xfb,0x2c,0xeb,0x95,0x56,0x56,\r\n0x56,0x05,0x6b,0x55,0x55,0xfa,0x95,0x56,0x56,0x01,0x48,0xd2,0x03,0x51,0x55,0x55,0xfd,0x0c,0xd1,0x5e,0xd2,0xf3,0x55,0xec,0x97,0xfa,0x95,0x56,0x95,0xeb,0x56,0x56,0x01,0x48,0xd2,0x01,0x8c,0xd2,0xfb,0x88,0x56,0x56,0x05,0x6b,0x55,0x55,0x55,0x55,0xfd,0x0c,0xd1,0xfe,0xb6,0x8c,0x8c,0x01,0xfb,0xfe,0xce,0xcf,0x02,0x02,0xcf,0xc9,\r\n0x01,0xfb,0xfe,0x42,0x3d,0x01,0x53,0x09,0x14,0x0b,0xfe,0x85,0x01,0x7b,0x29,0xfe,0xae,0x01,0xfb,0xfe,0xa2,0x12,0x0f,0x09,0x1b,0x10,0x28,0x59,0x5c,0x59,0x27,0x00,0x00,0x01,0x00,0xbc,0xfe,0x96,0x06,0x72,0x05,0x9a,0x00,0x26,0x00,0x1f,0x40,0x10,0x0e,0x16,0x21,0x03,0x1c,0x1d,0x03,0x08,0x03,0x03,0x1c,0x12,0x12,0x12,0x00,0x03,\r\n0x00,0x3f,0x3f,0x3f,0x33,0x2f,0x33,0x3f,0x12,0x17,0x39,0x30,0x31,0x01,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x34,0x36,0x37,0x23,0x06,0x07,0x01,0x23,0x01,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0x23,0x11,0x33,0x01,0x16,0x17,0x33,0x36,0x36,0x37,0x01,0x06,0x72,0xfe,0xaf,0x3f,0x39,0x32,0x3e,0xb2,0x07,0x07,0x04,\r\n0x18,0x13,0xfe,0x16,0x52,0xfe,0x17,0x14,0x17,0x04,0x04,0x04,0xa2,0xde,0x01,0xb8,0x33,0x0f,0x06,0x16,0x22,0x0d,0x01,0xc1,0x05,0x9a,0xfa,0x9b,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x03,0x8d,0x39,0x8b,0x53,0x63,0x28,0xfb,0xb2,0x04,0x46,0x2e,0x65,0x2b,0x8c,0x62,0xfc,0x40,0x05,0x9a,0xfc,0x18,0x74,0x38,0x3c,0x57,0x1d,0x03,0xe4,\r\n0x00,0x02,0x00,0x16,0x00,0x00,0x05,0x12,0x05,0x9a,0x00,0x07,0x00,0x11,0x00,0x1a,0x40,0x0c,0x11,0x0d,0x06,0x02,0x02,0x01,0x06,0x12,0x04,0x03,0x01,0x03,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x33,0x30,0x31,0x13,0x33,0x13,0x21,0x13,0x33,0x01,0x23,0x03,0x13,0x16,0x16,0x17,0x33,0x36,0x36,0x37,0x13,0x16,0xba,0x98,0x02,\r\n0x60,0x8f,0xbb,0xfd,0xda,0xae,0x9f,0xe1,0x05,0x0c,0x05,0x04,0x05,0x0b,0x07,0xdf,0x05,0x9a,0xfe,0x6e,0x01,0x92,0xfa,0x66,0x03,0x71,0xfd,0x9d,0x0f,0x30,0x21,0x1f,0x30,0x11,0x02,0x63,0xff,0xff,0x00,0x60,0xfe,0x96,0x03,0x62,0x04,0x18,0x02,0x26,0x00,0x46,0x00,0x00,0x00,0x07,0x08,0x5d,0x02,0x89,0x00,0x00,0xff,0xff,0x00,0xa6,\r\n0xfe,0x96,0x04,0x91,0x05,0xec,0x02,0x26,0x00,0x4b,0x00,0x00,0x00,0x07,0x08,0x5d,0x03,0xba,0x00,0x00,0x00,0x03,0x00,0x6e,0x00,0x00,0x05,0x5b,0x05,0x9a,0x00,0x2a,0x00,0x32,0x00,0x3c,0x00,0x29,0x40,0x15,0x1f,0x35,0x91,0x2b,0x13,0x91,0x01,0x01,0x2b,0x0a,0x2b,0x0a,0x00,0x3c,0x91,0x14,0x03,0x2c,0x91,0x00,0x12,0x00,0x3f,0xed,\r\n0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x33,0x2f,0xed,0x10,0xed,0x39,0x30,0x31,0x21,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x3e,\r\n0x02,0x35,0x34,0x21,0x01,0xe8,0x47,0x28,0x3b,0x27,0x13,0x06,0x05,0x98,0x09,0x28,0x4b,0x6a,0x41,0x5c,0x01,0x98,0x5d,0x95,0x69,0x39,0x22,0x40,0x5c,0x3a,0x48,0x75,0x54,0x2e,0x47,0x7c,0xab,0x63,0xfa,0xe4,0x95,0xa2,0xfe,0xa6,0xc1,0xac,0x45,0x6e,0x4c,0x29,0xfe,0xed,0x02,0x9c,0x17,0x25,0x31,0x1a,0x0f,0x2c,0x13,0x30,0x29,0x47,\r\n0x67,0x44,0x20,0x02,0x68,0x30,0x57,0x78,0x49,0x3d,0x6b,0x58,0x41,0x13,0x04,0x08,0x38,0x5a,0x7a,0x4a,0x5c,0x98,0x6c,0x3c,0x02,0x9c,0xfd,0xfc,0x8b,0x7b,0xfe,0x02,0x66,0xfe,0x31,0x22,0x41,0x5f,0x3c,0xd1,0x00,0x02,0x00,0x75,0xfe,0xab,0x05,0x80,0x05,0xec,0x00,0x30,0x00,0x43,0x00,0x24,0x40,0x14,0x12,0x0f,0x21,0x03,0x15,0x23,\r\n0x15,0x2d,0x96,0x05,0x36,0x95,0x1f,0x15,0x40,0x95,0x15,0x10,0x11,0x00,0x00,0x3f,0x3f,0xed,0x3f,0xed,0xdc,0xed,0x3f,0x12,0x17,0x39,0x30,0x31,0x05,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x23,0x15,0x23,0x11,0x0e,0x03,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x37,0x03,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x03,0x4d,0x10,0x3c,0x4c,0x54,0x27,0x7d,0xac,0x6c,0x30,0x2b,0x57,0x83,0x58,0xa4,0x46,0x9f,0x5b,0x66,0xa9,0x78,0x43,0x40,0x79,0xad,0x6d,0xcc,0x67,0x04,0xa4,0x2f,0x44,0x2c,0x16,0x8d,0x98,0x3f,0x77,0x27,0xa9,0x2b,0x4e,\r\n0x6b,0x40,0x4b,0x76,0x52,0x2b,0x22,0x50,0x83,0x61,0x4e,0x85,0x39,0xf7,0x12,0x22,0x1a,0x10,0x44,0x79,0xa9,0x65,0x4c,0xc0,0xc9,0xc3,0x4e,0x02,0x90,0xfd,0xe0,0x23,0x29,0x48,0x85,0xbb,0x72,0x7f,0xd1,0x94,0x52,0xac,0x94,0x02,0x9c,0x41,0x91,0x92,0x89,0x39,0xa8,0xae,0x1d,0x19,0x02,0x4c,0x3f,0x6f,0x52,0x30,0x3b,0x70,0x9f,0x65,\r\n0x46,0x83,0x66,0x3d,0x2b,0x25,0x00,0x01,0xff,0x9a,0xfe,0x96,0x03,0x94,0x05,0x9a,0x00,0x15,0x00,0x20,0x40,0x10,0x14,0x91,0x01,0x01,0x09,0x91,0x06,0x06,0x02,0x11,0x91,0x0c,0x04,0x91,0x02,0x03,0x00,0x3f,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x30,0x31,0x03,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x10,\r\n0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x23,0x1f,0xdb,0x02,0xd8,0xfd,0xd0,0x01,0x20,0xfe,0xe0,0xfe,0xae,0x3f,0x39,0x32,0x3e,0xb2,0xdb,0x03,0x12,0x02,0x88,0x98,0xfe,0x10,0x97,0xfd,0xba,0xfe,0x61,0x14,0xa0,0x1d,0x01,0x08,0x02,0x46,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x02,0xa0,0x06,0x02,0x00,0x1d,0x00,0x33,0xb6,0x05,\r\n0x95,0x08,0x08,0x02,0x95,0x1d,0xb8,0xff,0xc0,0x40,0x14,0x09,0x0c,0x48,0x1d,0x1d,0x03,0x1c,0x95,0x19,0x0f,0x16,0x95,0x11,0x00,0x09,0x95,0x0c,0x0f,0x03,0x15,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x2b,0xed,0x33,0x2f,0xed,0x30,0x31,0x01,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x34,\r\n0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x15,0x02,0x77,0xf0,0xa3,0xaf,0xaf,0xaf,0xaf,0x5d,0x5d,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0xf0,0xf0,0x03,0x06,0x8c,0xfd,0x86,0x02,0x7a,0x8c,0x6e,0x8c,0xa6,0xa1,0x5d,0x5e,0x12,0x94,0x1b,0xd9,0x9e,0x8c,0x6e,0x00,0x02,0x00,0x5e,0xff,0xe8,0x04,0x8e,0x05,0xb2,\r\n0x00,0x21,0x00,0x3d,0x00,0x26,0x40,0x14,0x0f,0x36,0x92,0x35,0x35,0x00,0x21,0x03,0x1f,0x2d,0x91,0x1a,0x04,0x02,0x22,0x92,0x05,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,\r\n0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x01,0x32,0x3e,0x02,0x37,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x04,0x8e,0xa8,0x4e,0xd4,0x83,0x6c,0xb1,0x80,0x46,0x2d,0x54,0x77,0x4a,0x44,0x66,0x44,0x22,0x43,0x79,0xab,0x68,0x3b,0x70,0x64,0x56,0x22,0xa8,0xfd,0xbe,0x4d,0x7b,0x63,\r\n0x4e,0x21,0x21,0x54,0x63,0x72,0x3f,0x47,0x69,0x46,0x23,0xae,0x9d,0xc2,0xbc,0x30,0x55,0x73,0x8c,0x4b,0x59,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x12,0x38,0x4f,0x6a,0x44,0x54,0x8b,0x63,0x37,0x14,0x23,0x31,0x1d,0x6d,0xfa,0xdd,0x27,0x40,0x52,0x2c,0x02,0xf3,0x2d,0x4b,0x36,0x1d,0x23,0x40,0x59,0x35,0x7e,0x80,0x8b,\r\n0x8a,0x8a,0x3e,0x66,0x49,0x28,0x00,0x02,0x00,0x60,0xff,0xe8,0x03,0x97,0x04,0x19,0x00,0x1f,0x00,0x3d,0x00,0x26,0x40,0x14,0x0f,0x36,0x96,0x34,0x34,0x01,0x1f,0x0f,0x1d,0x2b,0x95,0x18,0x10,0x02,0x20,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,\r\n0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x01,0x32,0x3e,0x02,0x37,0x11,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x03,0x97,0xa4,0x3c,0x8d,0x5f,0x4f,0x85,0x61,0x36,0x24,0x42,0x5d,0x39,0x64,\r\n0x6f,0x36,0x5d,0x7c,0x47,0x2e,0x52,0x45,0x39,0x16,0xa4,0xfe,0x54,0x24,0x4a,0x45,0x3e,0x17,0x16,0x38,0x41,0x48,0x25,0x37,0x4d,0x31,0x16,0x6d,0x7b,0x06,0x0b,0x4a,0x67,0x3f,0x1c,0x78,0x5d,0x34,0x41,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,0x05,0x05,0x15,0x6c,0x5a,0x45,0x6d,0x4c,0x29,0x12,0x1c,0x23,0x12,0x4a,0xfc,0x71,0x10,\r\n0x1e,0x2e,0x1e,0x02,0x28,0x1b,0x2d,0x21,0x12,0x19,0x2b,0x3c,0x22,0x51,0x4c,0x81,0x17,0x2c,0x42,0x2a,0x57,0x57,0x00,0x02,0x00,0x5e,0xff,0xe8,0x05,0x14,0x05,0xb2,0x00,0x1e,0x00,0x39,0x00,0x1c,0x40,0x0e,0x0a,0x28,0x92,0x27,0x27,0x00,0x1f,0x91,0x15,0x04,0x30,0x92,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,\r\n0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x02,0x6a,0x7b,0xc3,0x87,0x47,0x2d,0x54,0x77,0x4a,0x44,0x66,0x44,\r\n0x22,0x44,0x80,0xb8,0x74,0x94,0xf3,0xae,0x5f,0x62,0xb3,0xfb,0x90,0x50,0x72,0x4b,0x23,0xae,0x9d,0xc2,0xbc,0x31,0x58,0x7a,0x4a,0x75,0xc0,0x87,0x4a,0x46,0x81,0xb7,0x18,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x12,0x38,0x4f,0x6a,0x44,0x54,0x8b,0x63,0x37,0x6a,0xbf,0xfe,0xf6,0xa0,0xaa,0xfe,0xe9,0xc8,0x6e,0x05,0x32,\r\n0x23,0x40,0x59,0x35,0x7e,0x80,0x8b,0x8a,0x8a,0x3e,0x66,0x49,0x28,0x52,0x99,0xdc,0x8a,0x8f,0xde,0x97,0x4e,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x10,0x04,0x19,0x00,0x1c,0x00,0x3b,0x00,0x1e,0x40,0x0f,0x00,0x1c,0x1d,0x96,0x3b,0x3b,0x08,0x26,0x95,0x12,0x16,0x30,0x95,0x08,0x10,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,\r\n0x39,0x39,0x30,0x31,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x17,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x33,0x01,0x5c,0x64,0x6f,0x38,0x68,0x96,0x5d,0x6f,0xb8,\r\n0x84,0x49,0x49,0x87,0xc0,0x78,0x63,0x9d,0x6d,0x3b,0x24,0x42,0x5d,0x39,0xbe,0x0b,0x4a,0x67,0x3f,0x1c,0x80,0x89,0x54,0x82,0x58,0x2e,0x24,0x50,0x82,0x5e,0x37,0x56,0x3c,0x1f,0x18,0x36,0x59,0x41,0x06,0x02,0x17,0x15,0x6c,0x5a,0x45,0x6d,0x4c,0x29,0x43,0x85,0xc8,0x85,0x71,0xc5,0x92,0x54,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,\r\n0x05,0x44,0x17,0x2c,0x42,0x2a,0x57,0x57,0x3b,0x6a,0x92,0x56,0x52,0x92,0x6d,0x3f,0x19,0x2b,0x3c,0x22,0x29,0x3b,0x26,0x13,0x00,0x01,0x00,0x5e,0xff,0xe8,0x04,0x8e,0x05,0x9a,0x00,0x2b,0x00,0x21,0x40,0x11,0x0f,0x1c,0x92,0x1b,0x1b,0x00,0x2b,0x03,0x15,0x03,0x02,0x24,0x92,0x05,0x13,0x00,0x12,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,\r\n0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x15,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x11,0x33,0x04,0x8e,0xa8,0x4e,0xd4,0x83,0x6c,0xb1,0x80,0x46,0x2d,0x54,0x77,0x4a,0x7d,0x8a,0xa8,0x31,\r\n0x58,0x7b,0x4a,0xc2,0xbc,0x30,0x55,0x73,0x43,0x4d,0x7b,0x63,0x4e,0x21,0xa8,0x8c,0x4b,0x59,0x3f,0x72,0x9e,0x5f,0x45,0x77,0x5a,0x3a,0x08,0x04,0x22,0x87,0x74,0x01,0x8b,0xfe,0x76,0x39,0x56,0x39,0x1d,0x8b,0x8a,0x8a,0x3e,0x66,0x49,0x28,0x27,0x40,0x52,0x2c,0x04,0x3e,0x00,0x01,0x00,0x60,0xff,0xe8,0x03,0x97,0x04,0x00,0x00,0x2b,\r\n0x00,0x21,0x40,0x11,0x0f,0x1b,0x96,0x1a,0x1a,0x00,0x2b,0x0f,0x15,0x0f,0x02,0x24,0x92,0x05,0x16,0x00,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x21,0x23,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x0e,\r\n0x02,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x37,0x11,0x33,0x03,0x97,0xa4,0x3c,0x8d,0x5f,0x4f,0x85,0x61,0x36,0x24,0x42,0x5d,0x39,0x64,0x6f,0xa4,0x6d,0x7a,0x06,0x0b,0x4a,0x67,0x3f,0x1c,0x78,0x70,0x24,0x4a,0x45,0x3e,0x17,0xa4,0x5d,0x34,0x41,0x2b,0x4f,0x71,0x46,0x34,0x57,0x41,0x28,0x05,0x05,0x15,0x6c,0x5a,0x01,0x0e,0xfe,0xec,\r\n0x51,0x4c,0x81,0x17,0x2c,0x42,0x2a,0x57,0x57,0x10,0x1e,0x2e,0x1e,0x03,0x15,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x03,0xe2,0x05,0xb2,0x02,0x06,0x01,0xee,0x00,0x00,0x00,0x02,0x00,0x5e,0xfe,0x1e,0x05,0x2c,0x05,0xb2,0x00,0x1f,0x00,0x36,0x00,0x25,0x40,0x14,0x19,0x91,0x16,0x2f,0x14,0x01,0x14,0x11,0x03,0x0f,0x1d,0x00,0x20,0x91,\r\n0x0a,0x04,0x2a,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x3f,0x2f,0x5d,0x33,0xed,0x30,0x31,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x35,0x33,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,\r\n0x35,0x11,0x34,0x2e,0x02,0x02,0xb9,0x86,0xde,0x9f,0x58,0x5c,0xa9,0xf0,0x94,0x4e,0x80,0x66,0x4d,0x1c,0xa8,0xfd,0x6b,0xf4,0xb6,0xdf,0xc9,0xf2,0xfd,0x40,0xe1,0x80,0x6c,0xad,0x7a,0x42,0x42,0x79,0xa9,0x66,0x33,0x67,0x5f,0x53,0x3d,0x23,0x3b,0x6e,0x9a,0x18,0x6a,0xbf,0x01,0x0a,0xa1,0xac,0x01,0x18,0xc6,0x6c,0x21,0x39,0x4b,0x2a,\r\n0xb7,0xfa,0xf0,0xfd,0x94,0x4f,0xb2,0x69,0xdf,0xdd,0x64,0x6d,0x81,0x05,0x32,0x56,0x9c,0xd9,0x84,0x84,0xd9,0x9a,0x55,0x13,0x2c,0x48,0x6a,0x90,0x5d,0x01,0x0d,0x6c,0xa2,0x6c,0x36,0x00,0x00,0x02,0x00,0x28,0x00,0x00,0x04,0x9d,0x05,0x9a,0x00,0x20,0x00,0x2c,0x00,0x32,0x40,0x1c,0x1e,0x07,0x92,0x2b,0x17,0x2b,0x23,0x92,0x11,0x8f,\r\n0x11,0xef,0x11,0x02,0x61,0x11,0x01,0x2b,0x11,0x2b,0x11,0x01,0x15,0x03,0x1f,0x91,0x01,0x12,0x00,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x5d,0x10,0xed,0x11,0x33,0x10,0xed,0x32,0x30,0x31,0x21,0x21,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x37,0x15,0x06,0x06,\r\n0x07,0x11,0x21,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x04,0x9d,0xfd,0x18,0x0b,0x10,0x13,0x19,0x15,0x46,0x71,0x4f,0x2b,0x23,0x3f,0x58,0x35,0x25,0x53,0x26,0xa8,0x3c,0x75,0x3c,0x3c,0x75,0x3c,0x02,0x40,0xfd,0x18,0x04,0x8f,0x2a,0x39,0x12,0x29,0x43,0x30,0x25,0x02,0x22,0x01,0x01,0x01,0x01,0x21,0x3e,0x5b,0x3a,\r\n0x31,0x53,0x3b,0x21,0x16,0x22,0x01,0xe0,0xfd,0x43,0x1a,0x49,0x34,0xa6,0x2a,0x3f,0x17,0xfe,0x4a,0x02,0x10,0xc4,0x30,0x2a,0x1d,0x2a,0x1c,0x0d,0x00,0x01,0x00,0x02,0x00,0x00,0x03,0xe8,0x05,0x9a,0x00,0x10,0x00,0x19,0x40,0x0d,0x0e,0x12,0x04,0x10,0x0a,0x03,0x06,0x09,0x12,0x06,0x03,0x01,0x03,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,\r\n0x3f,0x30,0x31,0x13,0x33,0x01,0x16,0x17,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x06,0x07,0x01,0x23,0x01,0x02,0xea,0x02,0x2a,0x1f,0x07,0x04,0xa8,0xa8,0x04,0x0e,0x18,0xfd,0xe8,0xd1,0x02,0x67,0x05,0x9a,0xfd,0x70,0x25,0x0d,0x02,0xc2,0xfa,0x66,0x02,0xa2,0x16,0x1b,0xfd,0x8f,0x02,0xb0,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,\r\n0x05,0x9a,0x00,0x07,0x00,0x0f,0xb6,0x05,0x03,0x06,0x02,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0x30,0x31,0x21,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x04,0x0c,0xfc,0x1d,0x01,0x9d,0xa8,0x01,0x9e,0x98,0x05,0x02,0xfa,0xfe,0x00,0x00,0x01,0x00,0x32,0x02,0x79,0x05,0xcc,0x03,0x21,0x00,0x03,0x00,0x08,0xb1,0x01,0x03,0x00,0x2f,0xcd,\r\n0x30,0x31,0x01,0x15,0x21,0x35,0x05,0xcc,0xfa,0x66,0x03,0x21,0xa8,0xa8,0x00,0x03,0xff,0xf9,0xff,0xe8,0x04,0xc5,0x04,0x18,0x00,0x27,0x00,0x30,0x00,0x39,0x00,0x30,0x40,0x19,0x1c,0x0f,0x20,0x0c,0x35,0x1d,0x0f,0x19,0x14,0x04,0x2d,0x2d,0x07,0x28,0x95,0x14,0x10,0x31,0xec,0x07,0x16,0x25,0xec,0x02,0x16,0x00,0x3f,0xed,0x3f,0xed,\r\n0x3f,0xed,0x12,0x39,0x2f,0x39,0x12,0x39,0x33,0x33,0xcd,0x32,0x32,0x3f,0x30,0x31,0x25,0x06,0x23,0x22,0x03,0x23,0x02,0x21,0x22,0x2e,0x02,0x27,0x23,0x35,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x1e,0x03,0x33,0x32,0x37,0x01,0x22,0x0e,0x02,0x07,0x21,0x26,0x26,0x03,0x32,0x36,0x37,0x21,0x1e,\r\n0x03,0x04,0xc5,0x33,0x2c,0x9a,0x36,0x04,0x95,0xfe,0xf7,0x5a,0x94,0x6b,0x3d,0x04,0x61,0x67,0x0c,0x4d,0x79,0xa3,0x63,0x3f,0x72,0x60,0x4c,0x1a,0x04,0x55,0xac,0xab,0xa0,0xaa,0x10,0x20,0x26,0x2c,0x1c,0x16,0x12,0xfd,0x74,0x3f,0x67,0x4e,0x33,0x0a,0x02,0x53,0x2a,0x92,0x95,0x66,0xa8,0x3a,0xfd,0xb1,0x05,0x29,0x43,0x5d,0x05,0x0d,\r\n0x01,0x25,0xfe,0xcb,0x48,0x7f,0xae,0x66,0x81,0x68,0xac,0x7c,0x44,0x26,0x4a,0x6a,0x44,0x01,0x06,0xfe,0x44,0x81,0x59,0x75,0x46,0x1d,0x05,0x02,0xf9,0x32,0x59,0x79,0x48,0xa2,0xaa,0xfc,0xe8,0xa6,0xa5,0x47,0x79,0x58,0x33,0x00,0x00,0x03,0x00,0x5a,0xff,0xe8,0x06,0x58,0x04,0x18,0x00,0x29,0x00,0x38,0x00,0x41,0x00,0x43,0x40,0x24,\r\n0x23,0x25,0x95,0x20,0x10,0x18,0x16,0x95,0x1b,0x39,0x95,0x28,0x2a,0x95,0x14,0x08,0x0c,0x28,0x1d,0x14,0x1b,0x28,0x14,0x28,0x14,0x0c,0x1b,0x10,0x33,0x95,0x0c,0x16,0x3e,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x10,0xed,0x32,0x3f,0xed,0x32,0x30,\r\n0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x15,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x10,0x25,0x25,0x10,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x05,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x37,0x1e,0x03,0x33,0x32,0x36,0x37,0x06,0x58,0x38,\r\n0x6b,0x9d,0x65,0x80,0xcc,0x3e,0x04,0x91,0xf2,0x4d,0x79,0x55,0x2d,0x01,0x7f,0x01,0x06,0xd7,0xaf,0x9b,0x94,0xc8,0xdb,0x48,0x3c,0xb8,0x7b,0xdd,0x88,0x92,0xac,0x9b,0xaf,0x04,0x02,0xd3,0xfc,0x87,0xcb,0x8b,0x89,0x1b,0x33,0x49,0x2d,0x3b,0x67,0x4d,0x2c,0xa8,0x0a,0x33,0x4e,0x64,0x3a,0x79,0x86,0x01,0x01,0xd3,0x73,0xb6,0x7f,0x43,\r\n0x7e,0x6e,0x07,0xe5,0x2a,0x4d,0x6d,0x44,0x01,0x2c,0x18,0x10,0x01,0x2a,0x7a,0xa4,0x60,0xb1,0x56,0x5b,0x62,0x9a,0x72,0xb9,0xac,0x50,0x0c,0x08,0x52,0x5f,0x24,0x3c,0x2b,0x17,0x2d,0x50,0x6c,0x3f,0x04,0x43,0x6e,0x4f,0x2c,0x9d,0x8f,0x00,0x00,0x02,0x00,0x64,0xff,0xd8,0x03,0x40,0x04,0x12,0x00,0x20,0x00,0x2a,0x00,0x22,0x40,0x0f,\r\n0x1f,0x1e,0x14,0x21,0x1e,0x21,0x1e,0x21,0x01,0x25,0x0d,0x20,0x19,0x01,0x15,0x00,0x3f,0xcd,0x33,0x2f,0xcd,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x30,0x31,0x05,0x37,0x2e,0x03,0x35,0x11,0x34,0x3e,0x02,0x37,0x25,0x33,0x13,0x16,0x15,0x14,0x07,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x17,0x01,0x03,0x25,0x36,0x35,\r\n0x27,0x0e,0x03,0x15,0x01,0xac,0x09,0x62,0x82,0x4d,0x20,0x07,0x10,0x1c,0x14,0x01,0x7c,0x31,0xd9,0x0f,0x1a,0xfe,0x35,0x2f,0x45,0x50,0x21,0x21,0x31,0x2d,0x2f,0x1e,0x2d,0xfe,0xaf,0x92,0x01,0x0b,0x11,0xa7,0x19,0x2b,0x1f,0x12,0x0d,0x1a,0x1e,0x4b,0x5b,0x6c,0x40,0x01,0x18,0x23,0x2d,0x20,0x17,0x0c,0xea,0xfe,0xd6,0x1a,0x09,0x0f,\r\n0x10,0xfe,0xef,0x30,0x44,0x2d,0x15,0x07,0x13,0x21,0x19,0x2d,0xfe,0xd2,0x02,0x09,0x9a,0x0b,0x07,0xf1,0x10,0x1a,0x23,0x35,0x2c,0x00,0x00,0x02,0x00,0x13,0xff,0xe8,0x04,0x23,0x04,0x18,0x00,0x20,0x00,0x29,0x00,0x36,0x40,0x1e,0x11,0x0b,0xff,0x06,0x01,0x06,0x03,0x14,0x03,0x01,0x95,0x29,0xe0,0x03,0xf0,0x03,0x02,0x03,0x29,0x03,\r\n0x29,0x0e,0x24,0x95,0x1b,0x10,0x09,0x95,0x0e,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x11,0x33,0x10,0xdd,0x5d,0xce,0x33,0x30,0x31,0x01,0x21,0x14,0x17,0x21,0x15,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x23,0x35,0x33,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x27,\r\n0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x03,0xdd,0xfd,0x2d,0x06,0x03,0x13,0xfd,0x15,0x29,0x92,0x65,0xac,0x92,0x88,0xdd,0xa1,0xdb,0x31,0x71,0x53,0x06,0x49,0x7f,0xad,0x63,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0x26,0x21,0x81,0x4d,0x50,0x72,0x9a,0x62,0x98,0x8f,0x81,0x33,0x39,0x77,0xc7,0x8f,\r\n0x4f,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x02,0x00,0x29,0xff,0xe8,0x04,0xc4,0x04,0x18,0x00,0x26,0x00,0x2f,0x00,0x27,0x40,0x14,0x0f,0x95,0x1b,0x1b,0x01,0x95,0x2f,0x13,0x2f,0x13,0x2f,0x09,0x2a,0x95,0x21,0x10,0x04,0x95,0x09,0x16,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,\r\n0xed,0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x23,0x22,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x33,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x04,0xc4,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,0xdd,0x75,0xab,0x72,0x3a,0x04,0x0e,0x8a,0x29,\r\n0x89,0x27,0x25,0x44,0x60,0x3b,0x22,0x0e,0x4c,0x77,0x9f,0x60,0x6f,0xa0,0x66,0x30,0xa8,0x01,0x86,0x79,0x41,0x66,0x4b,0x2e,0x09,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x4e,0x87,0xb4,0x66,0x77,0x4a,0x47,0x49,0x56,0x38,0x5a,0x40,0x22,0x5b,0x9f,0x77,0x45,0x50,0x88,0xb2,0x61,0x35,0x8f,0x9d,0x34,0x54,0x6c,0x38,0xff,0xff,0x00,0x35,\r\n0x00,0x00,0x02,0xa0,0x06,0x02,0x02,0x06,0x00,0x49,0x00,0x00,0x00,0x03,0x00,0x60,0xfe,0x11,0x04,0x35,0x04,0x18,0x00,0x2d,0x00,0x42,0x00,0x4e,0x00,0x45,0x40,0x2b,0x24,0x15,0x18,0x27,0x0f,0x33,0x95,0x22,0x10,0x24,0x12,0x01,0x02,0x46,0x2a,0x12,0x04,0x05,0x49,0x96,0x2f,0x0f,0x01,0x0f,0x3d,0x95,0xef,0x18,0x01,0x18,0x40,0x09,\r\n0x0f,0x48,0x18,0x15,0x43,0x96,0x05,0x1b,0x2d,0x00,0x1b,0x00,0x3f,0x32,0x3f,0xed,0x3f,0x2b,0x5d,0xed,0xde,0x5d,0xed,0x12,0x17,0x39,0x5d,0x3f,0xed,0x3f,0x12,0x39,0x39,0x30,0x31,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x35,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,\r\n0x02,0x33,0x32,0x17,0x33,0x35,0x33,0x11,0x14,0x07,0x16,0x16,0x17,0x03,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x01,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0xaa,0x1c,0x2b,0x49,0xbc,0x63,0x3a,0x69,0x50,0x2f,0x34,0x56,0x71,0x3e,0x51,0x9e,0x45,0x26,0x04,0x75,0xeb,\r\n0x5f,0x9d,0x6f,0x3d,0x41,0x79,0xae,0x6d,0xcf,0x64,0x04,0xa4,0x4a,0x26,0x38,0x11,0xc9,0x2c,0x4e,0x69,0x3d,0x4b,0x78,0x54,0x2d,0x2a,0x4f,0x6f,0x45,0x45,0x72,0x53,0x2d,0xfe,0x95,0x4d,0x78,0x2d,0x30,0x6e,0x3e,0x4d,0x51,0x48,0xfe,0x11,0x42,0x36,0x3b,0x30,0x1c,0x35,0x4b,0x2f,0x31,0x4b,0x33,0x1b,0x29,0x27,0x5b,0x7e,0x70,0xc4,\r\n0x47,0x83,0xba,0x73,0x82,0xd2,0x95,0x50,0xa6,0x8e,0xfc,0x52,0xd0,0x83,0x29,0x60,0x39,0x04,0x29,0x3c,0x6b,0x51,0x30,0x38,0x6c,0x9c,0x64,0x54,0x8b,0x63,0x36,0x35,0x5d,0x80,0x4b,0xfc,0xd1,0x2a,0x26,0x1f,0x22,0x27,0x1d,0x23,0x2a,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0xb7,0x05,0xec,0x00,0x2b,0x00,0x2b,0x40,0x15,0x21,0x20,\r\n0x11,0x03,0x03,0x1a,0x27,0x0a,0x0b,0x20,0x27,0x0b,0x0b,0x27,0x20,0x03,0x16,0x2a,0x00,0x16,0x15,0x00,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x30,0x31,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x23,0x11,0x26,0x26,\r\n0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x11,0x33,0x01,0xae,0x0f,0x1d,0x0e,0x1b,0x25,0x17,0x09,0x57,0x27,0x58,0x47,0x6f,0x68,0x0e,0x18,0x0c,0xa4,0x0f,0x20,0x11,0x32,0x29,0x2d,0x2a,0x26,0x4d,0x53,0x6a,0x68,0x1a,0x1e,0xa4,0x03,0x1f,0x06,0x08,0x10,0x1c,0x27,0x17,0x5b,0x19,0x52,0x17,\r\n0x63,0x4c,0x5f,0x70,0x04,0x03,0xfd,0x4d,0x02,0xff,0x05,0x07,0x3c,0x2e,0x34,0x32,0x0e,0x51,0x0e,0x62,0x55,0x5f,0x70,0x08,0x02,0x84,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0xa4,0x05,0xec,0x00,0x26,0x00,0x4f,0x6e,0x00,0x00,0x27,0x00,0xd8,0x00,0x00,0xfe,0x71,0x00,0x07,0x00,0xd8,0x00,0x00,0xfd,0x3b,0x00,0x03,0xff,0xf6,0x00,0x00,\r\n0x01,0xfa,0x05,0xec,0x00,0x15,0x00,0x1b,0x00,0x22,0x00,0x29,0x40,0x13,0x20,0x15,0x15,0x18,0x02,0x1f,0x0d,0x0d,0x19,0x0a,0x02,0x0a,0x02,0x0a,0x01,0x0b,0x00,0x01,0x15,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x2f,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x21,0x23,0x11,0x2e,0x03,0x35,0x34,0x36,0x37,0x11,0x33,\r\n0x11,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x27,0x14,0x17,0x35,0x06,0x06,0x05,0x34,0x26,0x27,0x15,0x36,0x36,0x01,0x4a,0xa4,0x27,0x41,0x2e,0x1a,0x60,0x50,0xa4,0x50,0x60,0x1a,0x2f,0x41,0x26,0xe4,0x40,0x1d,0x23,0x01,0x1e,0x20,0x1a,0x1a,0x20,0x02,0x1c,0x0a,0x2a,0x3a,0x4a,0x2c,0x5b,0x7a,0x17,0x02,0x00,0xfe,0x01,0x16,0x7a,0x55,\r\n0x2a,0x4a,0x3c,0x2d,0x0c,0xe6,0x5f,0x1e,0xf5,0x13,0x3f,0x26,0x23,0x3c,0x13,0xe3,0x13,0x3b,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0xb4,0x04,0x18,0x00,0x3a,0x00,0x47,0x00,0x36,0x40,0x1e,0x36,0x1a,0x95,0x38,0x03,0x96,0x01,0x01,0x3b,0x96,0x13,0x13,0x20,0x38,0x10,0x2e,0x24,0x95,0x31,0x10,0x2d,0x0f,0x2a,0x15,0x20,0x15,0x43,0x95,\r\n0x09,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x10,0xed,0x32,0x30,0x31,0x01,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,\r\n0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x33,0x20,0x11,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x54,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,0x3c,0x56,0x19,0x37,0x57,0x3e,0x35,0x5c,0x44,0x27,0xa4,0xe9,0x35,0x5b,0x42,0x26,0xa4,0xa4,0x04,0x6d,0xd1,0x34,0x5d,0x4b,0x38,\r\n0x0e,0x72,0xe2,0x01,0x52,0xeb,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x01,0xd8,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x74,0x54,0x7a,0x4f,0x25,0x34,0x5a,0x76,0x42,0xfd,0xb8,0x02,0x60,0x01,0x2e,0x30,0x56,0x78,0x48,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0xfe,0x5f,0xfe,0xf2,\r\n0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x02,0x00,0xa6,0xff,0xe8,0x04,0x58,0x04,0x18,0x00,0x26,0x00,0x33,0x00,0x2b,0x40,0x17,0x20,0x17,0x95,0x23,0x03,0x96,0x00,0x00,0x27,0x96,0x13,0x13,0x1c,0x23,0x10,0x1f,0x0f,0x1c,0x15,0x2f,0x95,0x09,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,\r\n0x10,0xed,0x32,0x30,0x31,0x01,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x10,0x23,0x22,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x03,0xf8,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,\r\n0x24,0x2a,0x4a,0x66,0x3c,0x56,0xee,0x7b,0x51,0x50,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0xeb,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x01,0xd8,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x70,0x01,0x46,0x5d,0x5c,0x8d,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfe,0xf7,0x16,0x24,0x2f,0x19,0x35,0x3f,\r\n0x50,0x43,0x63,0x00,0x00,0x02,0x00,0xa6,0xfe,0x11,0x04,0x1c,0x04,0x18,0x00,0x2e,0x00,0x3a,0x00,0x3f,0x40,0x28,0x17,0x95,0x24,0x10,0x20,0x0f,0x24,0x12,0x01,0x02,0x32,0x2b,0x12,0x04,0x05,0x35,0x96,0x2f,0x0f,0x5f,0x0f,0x6f,0x0f,0xef,0x0f,0x04,0x06,0x0f,0x01,0x0f,0x0f,0x1d,0x15,0x2e,0x00,0x00,0x2f,0x96,0x05,0x1b,0x00,0x3f,\r\n0xed,0x33,0x2f,0x33,0x3f,0x33,0x2f,0x5d,0x5d,0xed,0x12,0x17,0x39,0x5d,0x3f,0x3f,0xed,0x30,0x31,0x01,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x35,0x11,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x16,0x16,0x17,0x25,\r\n0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x91,0x1c,0x2a,0x4a,0xbb,0x64,0x3a,0x69,0x50,0x2f,0x34,0x56,0x71,0x3e,0x51,0x9e,0x46,0x26,0xee,0x3d,0x68,0x4c,0x2b,0xa4,0xa4,0x04,0x74,0xdc,0xa9,0xb1,0x27,0x23,0x26,0x37,0x11,0xfd,0xca,0x44,0x83,0x2d,0x30,0x6e,0x3e,0x4d,0x51,0x47,0xfe,0x11,0x42,0x36,0x3b,0x30,\r\n0x1c,0x35,0x4b,0x2f,0x31,0x4b,0x33,0x1b,0x29,0x27,0x5a,0x7f,0x02,0x0c,0x01,0x46,0x31,0x57,0x78,0x46,0xfd,0xb8,0x04,0x00,0xaa,0xc2,0xd8,0xce,0xfd,0xca,0x61,0x9e,0x3f,0x28,0x60,0x39,0x63,0x29,0x26,0x1f,0x23,0x27,0x1d,0x23,0x2a,0x00,0x00,0x02,0x00,0x64,0xff,0xd8,0x03,0xc9,0x04,0x12,0x00,0x1e,0x00,0x30,0x00,0x0d,0xb4,0x30,\r\n0x1e,0x25,0x10,0x16,0x00,0x3f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x07,0x1e,0x03,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x07,0x23,0x26,0x26,0x27,0x35,0x3e,0x03,0x35,0x11,0x34,0x26,0x27,0x25,0x05,0x11,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x26,0x26,0x27,0x03,0x02,0x20,0x03,0x23,0x36,0x40,0x20,0x16,0x15,0x19,0x38,\r\n0x5c,0x42,0xbd,0x43,0x04,0xbe,0xb4,0x10,0x13,0x0b,0x04,0x05,0x05,0x02,0x54,0xfe,0xa6,0x2d,0x52,0x42,0x2d,0x06,0x0e,0x26,0x22,0x18,0x29,0x28,0x30,0x56,0x13,0x03,0xd9,0x0e,0x05,0x3b,0x55,0x67,0x32,0x23,0x41,0x2a,0x28,0x4e,0x58,0x69,0x42,0xbe,0x14,0x50,0x2d,0x3e,0x05,0x11,0x20,0x31,0x26,0x01,0x57,0x33,0x53,0x22,0xdf,0xd4,\r\n0xfd,0xb8,0x15,0x1e,0x15,0x0a,0x2b,0x47,0x5a,0x2f,0x3a,0x6d,0x3f,0x4a,0x74,0x2a,0x00,0x03,0x00,0x54,0xff,0xb4,0x03,0xc9,0x04,0x40,0x00,0x22,0x00,0x31,0x00,0x37,0x00,0x16,0x40,0x09,0x37,0x00,0x20,0x13,0x12,0x12,0x23,0x0e,0x16,0x00,0x3f,0xcd,0x33,0x2f,0x33,0x2f,0x33,0x33,0x30,0x31,0x01,0x07,0x16,0x16,0x17,0x16,0x16,0x15,\r\n0x14,0x0e,0x02,0x07,0x07,0x23,0x26,0x26,0x27,0x07,0x23,0x37,0x27,0x35,0x3e,0x03,0x35,0x11,0x34,0x26,0x27,0x25,0x17,0x37,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x27,0x01,0x1e,0x03,0x03,0x11,0x13,0x26,0x26,0x27,0x03,0x9e,0x83,0x1b,0x46,0x22,0x16,0x15,0x19,0x38,0x5c,0x42,0xbd,0x43,0x03,0x60,0x5b,0x50,0x78,0x62,0x52,0x10,\r\n0x13,0x0b,0x04,0x05,0x05,0x02,0x54,0x14,0x31,0xab,0x0e,0x26,0x22,0x18,0x29,0x28,0x06,0xfe,0xff,0x2b,0x4f,0x3f,0x2b,0xee,0xcb,0x1b,0x2d,0x0b,0x04,0x40,0xd3,0x2d,0x6d,0x36,0x23,0x41,0x2a,0x28,0x4e,0x58,0x69,0x42,0xbe,0x0e,0x31,0x1e,0x81,0x9f,0x16,0x3e,0x05,0x11,0x20,0x31,0x26,0x01,0x57,0x33,0x53,0x22,0xdf,0x22,0x50,0xfc,\r\n0x64,0x2b,0x47,0x5a,0x2f,0x3a,0x6d,0x3f,0x09,0xfe,0x63,0x14,0x1c,0x14,0x09,0x02,0x9a,0xfe,0x64,0x01,0x48,0x27,0x42,0x1a,0x00,0x02,0x00,0x80,0xff,0xb4,0x04,0x50,0x04,0x40,0x00,0x23,0x00,0x2b,0x00,0x2b,0x40,0x15,0x0c,0x22,0x0e,0x23,0x23,0x1f,0x12,0x1b,0x12,0x1b,0x09,0x18,0x95,0x1f,0x10,0x0e,0x0e,0x24,0x95,0x09,0x16,0x00,\r\n0x3f,0xed,0x33,0x2f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x2f,0x12,0x39,0x39,0x30,0x31,0x01,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x07,0x23,0x37,0x26,0x27,0x33,0x16,0x16,0x17,0x01,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x17,0x37,0x01,0x32,0x36,0x35,0x34,0x27,0x01,0x16,0x04,0x25,\r\n0x66,0x47,0x4a,0x48,0x84,0xbd,0x75,0x38,0x64,0x2d,0x36,0x78,0x53,0x7a,0x34,0xb3,0x0e,0x28,0x17,0x01,0x9c,0x4d,0x71,0x6b,0x9b,0x29,0xaf,0x34,0xfd,0xb9,0x4b,0x81,0x36,0x40,0xfe,0xb2,0xa0,0xaa,0x42,0xfe,0x72,0x3c,0x04,0x40,0xa5,0x45,0xce,0x84,0x79,0xc7,0x8e,0x4e,0x12,0x11,0x57,0x87,0x54,0x98,0x1f,0x34,0x15,0x02,0x99,0x36,\r\n0x65,0x5e,0x9f,0xae,0x20,0x1f,0x67,0xfc,0x32,0xcd,0xbf,0xa8,0x65,0xfd,0x7f,0x18,0x00,0x03,0x00,0x60,0xff,0xe8,0x07,0x1f,0x04,0x18,0x00,0x22,0x00,0x32,0x00,0x3b,0x00,0x2c,0x40,0x18,0x1e,0x95,0x19,0x10,0x33,0x95,0x16,0x14,0x08,0x21,0x21,0x0a,0x23,0x95,0x14,0x10,0x2d,0x95,0x0a,0x16,0x38,0x95,0x05,0x16,0x00,0x3f,0xed,0x3f,\r\n0xed,0x3f,0xed,0x12,0x39,0x2f,0x39,0x12,0x39,0xed,0x3f,0xed,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x20,0x17,0x36,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x06,0x07,0x21,0x01,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x01,0x1e,0x03,0x33,\r\n0x32,0x36,0x37,0x07,0x1f,0x38,0x6b,0x9d,0x65,0x80,0xca,0x3c,0x83,0xfe,0xe1,0x72,0xb9,0x81,0x46,0x4a,0x89,0xc1,0x78,0x01,0x17,0x6f,0x39,0xc2,0x86,0xdd,0x88,0x92,0xac,0x9b,0xaf,0x04,0x02,0xd3,0xfb,0x3f,0x4e,0x7f,0x59,0x30,0x30,0x58,0x7e,0x4e,0xa0,0xac,0xac,0x01,0x52,0x0a,0x33,0x4e,0x64,0x3a,0x79,0x86,0x01,0x01,0xd3,0x73,\r\n0xb6,0x7f,0x43,0x7e,0x6e,0xec,0x4b,0x89,0xc0,0x76,0x81,0xcc,0x8e,0x4b,0xd4,0x67,0x6d,0x62,0x9a,0x72,0xb9,0xac,0x01,0x65,0x38,0x69,0x98,0x5f,0x5a,0x8f,0x65,0x36,0xcc,0xbe,0xc3,0xcf,0xfe,0x10,0x43,0x6e,0x4f,0x2c,0x9d,0x8f,0x00,0x04,0x00,0x60,0xff,0xb4,0x07,0x21,0x04,0x40,0x00,0x2d,0x00,0x36,0x00,0x41,0x00,0x4a,0x00,0x41,\r\n0x40,0x24,0x2e,0x95,0x29,0x2c,0x3f,0x34,0x0b,0x04,0x0c,0x2d,0x2d,0x29,0x10,0x42,0x95,0x10,0x13,0x26,0x24,0x19,0x19,0x13,0x1f,0x95,0x24,0x10,0x45,0x95,0x13,0x16,0x0c,0x0c,0x37,0x95,0x09,0x16,0x00,0x3f,0xed,0x33,0x2f,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x3f,0x33,0x2f,0x12,0x17,0x39,0x10,0xed,0x30,\r\n0x31,0x01,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x07,0x23,0x37,0x26,0x27,0x23,0x06,0x21,0x22,0x2e,0x02,0x35,0x35,0x21,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x16,0x17,0x37,0x05,0x22,0x06,0x15,0x14,0x16,0x17,0x01,0x26,0x03,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x01,0x16,0x01,0x16,\r\n0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0xf5,0x69,0x48,0x4d,0x4a,0x89,0xc2,0x77,0x6a,0x55,0x33,0x78,0x52,0x4d,0x2d,0x04,0x76,0xfe,0xf5,0x63,0x9a,0x6a,0x37,0x02,0xd5,0x02,0x2f,0x56,0x7a,0x4d,0xaf,0x90,0x89,0xdc,0x01,0x0d,0x71,0x04,0x82,0x01,0x1e,0x4d,0x85,0x38,0x43,0xfe,0xa9,0xa0,0xac,0x3c,0x39,0x01,0x9c,0x52,0x75,0x4f,0x7f,\r\n0x59,0x2f,0x24,0x22,0xfe,0x72,0x39,0xfc,0x2a,0x02,0x85,0x75,0x3d,0x67,0x50,0x33,0x08,0x04,0x40,0xaa,0x45,0xc7,0x7c,0x81,0xcc,0x8e,0x4b,0x1f,0x53,0x84,0x38,0x63,0xeb,0x45,0x7f,0xb5,0x70,0x58,0x55,0x85,0x5c,0x2f,0x72,0x9a,0x62,0xed,0xed,0x23,0x21,0x6c,0xb2,0xcc,0xbe,0x72,0xa5,0x33,0x02,0x9a,0x3a,0xfc,0xe4,0x39,0x69,0x97,\r\n0x5f,0x4e,0x7f,0x31,0xfd,0x7f,0x15,0x01,0x2c,0x8f,0x9d,0x2e,0x51,0x6e,0x3f,0x00,0x00,0x04,0x00,0x60,0xff,0xe8,0x07,0x21,0x04,0x18,0x00,0x24,0x00,0x2d,0x00,0x36,0x00,0x3f,0x00,0x3b,0x40,0x20,0x3a,0x95,0x1f,0x16,0x37,0x95,0x01,0x2b,0x95,0x31,0x1c,0x1a,0x01,0x0d,0x31,0x01,0x31,0x01,0x31,0x10,0x25,0x95,0x1a,0x16,0x2e,0x95,\r\n0x10,0x10,0x06,0x95,0x0b,0x10,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x39,0x11,0x12,0x39,0x10,0xed,0x10,0xed,0x3f,0xed,0x30,0x31,0x13,0x21,0x2e,0x03,0x23,0x22,0x07,0x35,0x36,0x33,0x20,0x17,0x33,0x36,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x20,0x27,0x23,0x06,0x21,0x22,0x2e,0x02,0x35,0x01,\r\n0x32,0x3e,0x02,0x37,0x21,0x16,0x16,0x13,0x22,0x06,0x07,0x21,0x2e,0x03,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x60,0x02,0xd5,0x02,0x2f,0x56,0x7a,0x4d,0xaf,0x90,0x89,0xdc,0x01,0x0d,0x71,0x04,0x82,0x01,0x1e,0x73,0xb8,0x81,0x46,0x4a,0x89,0xc2,0x77,0xfe,0xda,0x6c,0x04,0x76,0xfe,0xf5,0x63,0x9a,0x6a,0x37,0x04,0xc3,0x49,0x77,\r\n0x58,0x35,0x07,0xfd,0x63,0x0b,0xab,0x95,0x8c,0xa7,0x14,0x02,0x95,0x0a,0x38,0x55,0x72,0xfb,0x9e,0x02,0x85,0x75,0x3d,0x67,0x50,0x33,0x08,0x02,0x29,0x55,0x85,0x5c,0x2f,0x72,0x9a,0x62,0xed,0xed,0x4c,0x89,0xc0,0x75,0x81,0xcc,0x8e,0x4b,0xeb,0xeb,0x45,0x7f,0xb5,0x70,0xfe,0xa1,0x30,0x5b,0x82,0x52,0xab,0xb4,0x03,0x1c,0x9d,0x95,\r\n0x47,0x72,0x4f,0x2a,0xfe,0x10,0x8f,0x9d,0x2e,0x51,0x6e,0x3f,0x00,0x02,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x00,0x32,0x00,0x42,0x00,0x1f,0x40,0x11,0x33,0x95,0x29,0x10,0x17,0x95,0x10,0x10,0x21,0x95,0x06,0x16,0x03,0x3d,0x95,0x00,0x16,0x00,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x30,0x31,0x05,0x22,0x26,0x27,0x06,\r\n0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x07,0x26,0x22,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x9a,0x8d,0xd5,0x3f,0x42,0xd6,0x8f,0x71,0xb8,0x82,\r\n0x47,0x49,0x88,0xc1,0x78,0x0d,0x18,0x0c,0x19,0x09,0x12,0x09,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0x4a,0x89,0xc0,0x77,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0xaa,0x18,0x71,0x66,0x66,0x71,0x4b,0x8a,0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x01,0x01,0x89,0x01,0x37,0x69,\r\n0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0x7e,0xc8,0x8b,0x49,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0xc1,0xcf,0x00,0x03,0x00,0x60,0xff,0xb4,0x07,0x98,0x04,0x40,0x00,0x3c,0x00,0x47,0x00,0x4f,0x00,0x30,0x40,0x1b,0x03,0x45,0x4d,0x32,0x04,0x05,0x33,0x33,0x3d,0x95,\r\n0x2f,0x10,0x1d,0x95,0x16,0x10,0x09,0x27,0x95,0x0c,0x16,0x05,0x05,0x48,0x95,0x00,0x16,0x00,0x3f,0xed,0x33,0x2f,0x3f,0xed,0x32,0x3f,0xed,0x3f,0xed,0x33,0x2f,0x12,0x17,0x39,0x30,0x31,0x05,0x22,0x26,0x27,0x07,0x23,0x37,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x07,0x26,0x22,0x23,\r\n0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x01,0x26,0x03,0x32,0x36,0x35,0x34,0x27,0x01,0x16,0x05,0x9a,0x38,0x64,0x2d,0x36,0x78,0x54,0x26,0x3f,0x19,0x42,0xd6,0x8f,0x71,0xb8,0x82,0x47,0x49,\r\n0x88,0xc1,0x78,0x0d,0x18,0x0c,0x19,0x09,0x12,0x09,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0x4a,0x89,0xc0,0x77,0x4b,0x81,0x36,0x40,0x79,0x66,0x47,0x4a,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x3f,0x3a,0x01,0x9b,0x4d,0x71,0xa0,0xaa,0x42,0xfe,0x72,0x3c,0x18,0x13,0x11,0x58,0x87,0x1a,0x42,0x28,0x66,0x71,0x4b,0x8a,\r\n0xc1,0x76,0x81,0xcb,0x8d,0x4b,0x01,0x01,0x89,0x01,0x37,0x69,0x96,0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0x7e,0xc8,0x8b,0x49,0x20,0x1f,0x67,0xa5,0x45,0xce,0x84,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,0x5e,0x69,0x9f,0x33,0x02,0x99,0x36,0xfc,0xe4,0xcd,0xbf,0xa8,0x65,0xfd,0x7f,0x18,0x00,0x01,0x00,0x7d,0x00,0x00,0x03,0xe4,\r\n0x04,0x00,0x00,0x11,0x00,0x19,0x40,0x0c,0x0b,0x03,0x96,0x0e,0x0e,0x07,0x0c,0x0f,0x07,0x15,0x00,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x30,0x31,0x21,0x35,0x10,0x21,0x22,0x06,0x15,0x15,0x23,0x35,0x10,0x25,0x11,0x33,0x11,0x04,0x11,0x15,0x03,0x40,0xfe,0xf5,0x8c,0x88,0xa4,0x01,0x62,0xa4,0x01,0x61,0x6b,0x01,0x3c,\r\n0xa0,0xa8,0x5f,0x58,0x01,0xab,0x29,0x01,0xd4,0xfe,0x2b,0x2c,0xfe,0x54,0x53,0x00,0x00,0x02,0x00,0xb0,0xfe,0x8d,0x04,0x24,0x04,0x33,0x00,0x2a,0x00,0x35,0x00,0x1d,0x40,0x0e,0x0a,0x27,0x3a,0x30,0x30,0x28,0x2f,0x3a,0x2a,0x16,0x3a,0x1d,0x28,0x08,0x00,0x3f,0xdc,0xed,0x2f,0xed,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x01,0x32,0x1e,\r\n0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x2e,0x02,0x23,0x23,0x11,0x23,0x11,0x01,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x3e,0x02,0x02,0x1d,0x56,0x8a,0x61,0x34,0x26,0x46,0x62,0x3c,0x3c,0x55,0x37,0x19,0x09,0x1b,0x30,0x28,0x11,0x20,\r\n0x0e,0x11,0x22,0x13,0x96,0x83,0x27,0x40,0x51,0x29,0x90,0xa4,0x02,0x37,0x77,0x76,0xa6,0xa0,0x37,0x59,0x40,0x23,0x04,0x33,0x27,0x4a,0x69,0x43,0x3b,0x62,0x4c,0x35,0x0d,0x03,0x14,0x2e,0x3e,0x4f,0x33,0xe8,0x3b,0x58,0x3a,0x1e,0x05,0x05,0x88,0x04,0x04,0xb8,0xb9,0xff,0x25,0x43,0x33,0x1d,0xfe,0x4b,0x04,0x33,0xfe,0xd7,0x57,0x4c,\r\n0xfe,0x8e,0x1e,0x37,0x4c,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x01,0xef,0x04,0x00,0x00,0x0d,0x00,0x11,0xb7,0x09,0x00,0x0d,0x0f,0x07,0x0f,0x05,0x15,0x00,0x3f,0x3f,0x3f,0x33,0x32,0x30,0x31,0x01,0x06,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x37,0x01,0xef,0x35,0x2a,0x46,0xa4,0xa4,0x04,0x18,0x51,0x35,0x03,0x6a,\r\n0x18,0x3a,0x62,0xac,0xfd,0xf6,0x04,0x00,0xd3,0x49,0x68,0x1a,0x00,0x01,0x00,0xa6,0x00,0x00,0x03,0xf2,0x04,0x12,0x00,0x1e,0x00,0x1b,0x40,0x0e,0x14,0x07,0x0a,0xec,0x1a,0x10,0x13,0x0f,0x10,0x15,0x05,0xec,0x00,0x10,0x00,0x3f,0xed,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x30,0x31,0x01,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x26,0x26,0x23,\r\n0x22,0x06,0x07,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x36,0x03,0x90,0x3e,0x24,0x2c,0x50,0x65,0x45,0x2a,0x50,0x20,0x35,0x4a,0x23,0x46,0xa4,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x32,0x49,0x1a,0x47,0x04,0x12,0x0e,0xaa,0x21,0x5b,0x37,0x24,0x31,0x32,0x62,0xac,0xfd,0xf6,0x04,0x00,0xd3,0x36,0x55,\r\n0x3b,0x1f,0x20,0x1d,0x3d,0x00,0x00,0x02,0x00,0x1c,0xff,0xe8,0x03,0x9e,0x04,0x12,0x00,0x26,0x00,0x33,0x00,0x28,0x40,0x15,0x02,0xec,0x24,0x10,0x0a,0x96,0x07,0x07,0x27,0x96,0x1e,0x1c,0x1b,0x1b,0x10,0x1c,0x0f,0x2f,0x95,0x10,0x16,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x2f,0xed,0x3f,0xed,0x30,0x31,0x01,0x26,\r\n0x23,0x22,0x07,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x17,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x03,0x9e,0x2c,0x50,0x6a,0x46,0x46,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,\r\n0x3c,0x56,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x3e,0x24,0xfd,0xa3,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x03,0x5a,0x21,0x63,0x62,0xac,0x32,0x6f,0x63,0x46,0x6b,0x48,0x25,0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x02,0x28,0xd3,0x36,0x55,0x3b,0x1f,0x0e,0xfd,0x65,0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x02,\r\n0x00,0x1c,0xff,0xe8,0x04,0xd4,0x04,0x12,0x00,0x32,0x00,0x3f,0x00,0x30,0x40,0x1a,0x07,0x0a,0xec,0x2e,0x10,0x14,0x96,0x11,0x11,0x33,0x96,0x28,0x27,0x25,0x25,0x1a,0x27,0x0f,0x3b,0x95,0x1a,0x16,0x05,0xec,0x00,0x10,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x33,0x2f,0xed,0x3f,0xed,0x32,0x30,0x31,0x01,0x32,\r\n0x17,0x15,0x26,0x23,0x22,0x07,0x26,0x26,0x23,0x22,0x06,0x07,0x06,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x15,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x36,0x01,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x04,0x72,0x3e,0x24,0x2c,0x50,0x65,0x45,\r\n0x2a,0x50,0x20,0x35,0x4a,0x23,0x23,0x23,0x60,0x60,0x28,0x49,0x67,0x3f,0x37,0x5c,0x42,0x24,0x2a,0x4a,0x66,0x3c,0x56,0xa4,0x04,0x12,0x36,0x46,0x51,0x2d,0x32,0x49,0x1a,0x47,0xfd,0x29,0x24,0x36,0x23,0x11,0x36,0x36,0x36,0x33,0x04,0x12,0x0e,0xaa,0x21,0x5b,0x37,0x24,0x31,0x32,0x32,0x90,0x56,0x28,0x6f,0x63,0x46,0x6b,0x48,0x25,\r\n0x27,0x45,0x5e,0x37,0x3c,0x59,0x3c,0x1e,0x02,0x28,0xd3,0x36,0x55,0x3b,0x1f,0x20,0x1d,0x3d,0xfd,0x57,0x16,0x24,0x2f,0x19,0x35,0x3f,0x50,0x43,0x63,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x03,0x14,0x04,0x00,0x00,0x15,0x00,0x1d,0x40,0x0e,0x05,0x96,0x0f,0x0a,0x0f,0x0a,0x0f,0x01,0x14,0x0f,0x0c,0x0f,0x01,0x15,0x00,0x3f,0x3f,0x3f,\r\n0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x30,0x31,0x21,0x23,0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x03,0x14,0xa4,0x2d,0x70,0x46,0x4a,0x6e,0x2b,0x6e,0x83,0x27,0x64,0x41,0x25,0x4a,0x3f,0x2e,0x09,0xa4,0x03,0x64,0x1a,0x1f,0x1f,0x1c,0xd4,0x01,0x6e,0x38,0x24,0x10,0x1a,0x21,\r\n0x11,0x00,0x00,0x02,0x00,0x3c,0xff,0xe9,0x05,0x06,0x04,0x00,0x00,0x20,0x00,0x2c,0x00,0x29,0x40,0x16,0x21,0x96,0x1c,0x09,0x96,0x13,0x0d,0x1c,0x13,0x13,0x1c,0x0d,0x03,0x00,0x18,0x0f,0x10,0x0f,0x27,0x96,0x00,0x16,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x10,0xed,0x10,0xed,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,\r\n0x11,0x06,0x06,0x23,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x11,0x36,0x33,0x20,0x11,0x14,0x06,0x03,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x03,0xb0,0x48,0x76,0x54,0x2e,0x2d,0x70,0x46,0x4a,0x6e,0x2b,0x6e,0x83,0x27,0x64,0x41,0x25,0x4a,0x3f,0x2e,0x09,0xa4,0x49,0x6b,0x01,\r\n0x3e,0xb2,0x94,0x5d,0x4f,0x4e,0x5b,0x5a,0x4c,0x4b,0x17,0x27,0x4b,0x70,0x4a,0x02,0x4f,0x1a,0x1f,0x1f,0x1c,0xd4,0x01,0x6e,0x38,0x24,0x10,0x1a,0x21,0x11,0xfe,0x73,0x24,0xfe,0xac,0xaa,0xb0,0x02,0x52,0x81,0x83,0x79,0x79,0x7a,0x7d,0x80,0x7f,0x00,0xff,0xff,0xff,0x92,0xfe,0x1e,0x02,0x68,0x06,0x02,0x02,0x06,0x05,0x88,0x00,0x00,\r\n0x00,0x01,0x00,0x90,0xff,0xe8,0x03,0xe2,0x04,0x00,0x00,0x12,0x00,0x19,0x40,0x0c,0x11,0x11,0x01,0x09,0x0f,0x02,0x0c,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x30,0x31,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x03,0xe2,0xa4,0x04,0x66,0xd6,\r\n0xfe,0x92,0xa3,0xf8,0x79,0x4c,0x4e,0xa4,0xa2,0xba,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x58,0x58,0x90,0x01,0x03,0x00,0x00,0x02,0x00,0x21,0xff,0xe8,0x04,0xa4,0x04,0x00,0x00,0x15,0x00,0x1f,0x00,0x28,0x40,0x13,0x0a,0x01,0x18,0x10,0x14,0x0d,0x10,0x12,0x10,0x12,0x10,0x07,0x0f,0x0f,0x04,0x1b,0x95,0x07,0x15,0x00,0x3f,0xed,\r\n0x32,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x10,0xcd,0x32,0x32,0x30,0x31,0x01,0x23,0x11,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x21,0x35,0x33,0x15,0x33,0x05,0x35,0x21,0x15,0x10,0x33,0x32,0x3e,0x02,0x04,0xa4,0x98,0xa4,0x04,0x66,0xd5,0xfe,0x8f,0x97,0x97,0xa4,0x02,0x0c,0xa4,0x98,0xfe,\r\n0xc4,0xfd,0xf4,0xfa,0x3c,0x65,0x48,0x29,0x01,0xdb,0xfe,0x25,0xa2,0xba,0x01,0xb4,0x3f,0x8b,0x01,0x9a,0xfe,0x66,0x50,0x50,0xb4,0x29,0x25,0xfe,0xbc,0x2f,0x54,0x76,0x00,0x02,0x00,0xa6,0xff,0xe8,0x06,0x54,0x04,0x12,0x00,0x27,0x00,0x3b,0x00,0x29,0x40,0x16,0x0e,0x0e,0x25,0x28,0x32,0x10,0x07,0x95,0x25,0x16,0x23,0x1b,0x11,0x95,\r\n0x1e,0x16,0x1a,0x15,0x17,0x0f,0x01,0x0f,0x00,0x3f,0x3f,0x3f,0x3f,0xed,0x32,0x32,0x3f,0xed,0x3f,0xcd,0x12,0x39,0x2f,0x30,0x31,0x13,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x10,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x23,0x20,0x11,0x01,0x22,0x2e,\r\n0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0xa6,0xa4,0x19,0x36,0x57,0x3f,0x34,0x5c,0x45,0x27,0xa4,0xe9,0x36,0x5b,0x42,0x25,0xa4,0xa4,0x04,0x6e,0xd0,0x35,0x5d,0x4b,0x37,0x0e,0x72,0xe2,0xfe,0xae,0x02,0xd7,0x16,0x27,0x1c,0x11,0x11,0x1c,0x27,0x16,0x16,0x28,0x1d,0x11,0x11,0x1d,0x28,0x04,0x00,0xfd,0xb4,\r\n0x55,0x7a,0x4e,0x25,0x35,0x59,0x76,0x42,0x8d,0xa5,0xfe,0xd2,0x30,0x57,0x77,0x48,0x02,0x48,0xfc,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0x01,0xa1,0x01,0xb4,0x10,0x1c,0x27,0x17,0x17,0x27,0x1d,0x10,0x10,0x1d,0x27,0x17,0x16,0x27,0x1c,0x11,0x00,0x00,0x02,0x00,0xa6,0xff,0xee,0x06,0x54,0x04,0x18,0x00,0x27,0x00,0x3b,0x00,0x2b,\r\n0x40,0x17,0x28,0x32,0x16,0x07,0x95,0x25,0x10,0x11,0x95,0x1e,0x10,0x23,0x1b,0x19,0x0e,0x0e,0x18,0x19,0x0f,0x18,0x15,0x01,0x15,0x00,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x12,0x39,0x39,0x3f,0xed,0x3f,0xed,0x3f,0xcd,0x30,0x31,0x21,0x23,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x10,0x23,0x22,0x0e,0x02,0x15,0x11,\r\n0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x1e,0x02,0x17,0x36,0x33,0x20,0x11,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x06,0x54,0xa4,0x19,0x36,0x57,0x3f,0x35,0x5b,0x45,0x27,0xa4,0xe9,0x36,0x5b,0x42,0x25,0xa4,0xa4,0x04,0x6d,0xd1,0x34,0x5e,0x4b,0x37,0x0e,0x72,0xe2,0x01,0x52,0xfd,0x29,\r\n0x16,0x27,0x1c,0x11,0x11,0x1c,0x27,0x16,0x17,0x27,0x1d,0x11,0x11,0x1d,0x27,0x02,0x4c,0x55,0x7a,0x4e,0x25,0x35,0x59,0x76,0x42,0x8d,0xa5,0x01,0x2e,0x30,0x57,0x77,0x48,0xfd,0xb8,0x04,0x00,0xa2,0xba,0x1f,0x38,0x4e,0x2f,0xd4,0xfe,0x5f,0xfe,0x4c,0x10,0x1c,0x27,0x17,0x17,0x27,0x1d,0x10,0x10,0x1d,0x27,0x17,0x16,0x27,0x1c,0x11,\r\n0x00,0x01,0x00,0x0e,0xff,0xe8,0x04,0x46,0x04,0x31,0x00,0x21,0x00,0x1c,0x40,0x0e,0x0d,0x95,0x13,0x13,0x02,0x01,0x20,0x0f,0x1b,0x95,0x05,0x16,0x01,0x15,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x39,0x33,0x2f,0xed,0x30,0x31,0x21,0x23,0x35,0x23,0x06,0x23,0x20,0x11,0x11,0x34,0x2e,0x02,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,\r\n0x15,0x11,0x10,0x33,0x32,0x37,0x36,0x35,0x11,0x33,0x04,0x46,0xa4,0x04,0x66,0xd6,0xfe,0x92,0x0a,0x1c,0x35,0x2a,0x1e,0x2a,0x19,0x2a,0x4c,0x48,0x68,0x43,0x20,0xf8,0x79,0x4c,0x4e,0xa4,0xa2,0xba,0x01,0xb4,0x01,0x2b,0x38,0x54,0x37,0x1c,0x0d,0x0e,0x94,0x12,0x34,0x5e,0x82,0x4e,0xfe,0xe7,0xfe,0xbc,0x58,0x58,0x90,0x02,0x4e,0x00,\r\n0xff,0xff,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x02,0x06,0x01,0xd3,0x00,0x00,0x00,0x02,0x00,0x0c,0xfe,0x21,0x04,0xbc,0x04,0x18,0x00,0x28,0x00,0x3c,0x00,0x28,0x40,0x15,0x38,0x18,0x0a,0x1b,0x07,0x04,0x19,0x1f,0x1f,0x08,0x19,0x0f,0x0d,0xec,0x12,0x10,0x2e,0x00,0x00,0x08,0x1b,0x00,0x3f,0x33,0x2f,0x32,0x3f,0xed,0x3f,0x12,\r\n0x39,0x2f,0x12,0x17,0x39,0x33,0x30,0x31,0x01,0x22,0x26,0x27,0x26,0x26,0x27,0x03,0x01,0x23,0x01,0x03,0x26,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x1e,0x02,0x17,0x13,0x01,0x33,0x01,0x13,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0xea,\r\n0x3e,0x5c,0x1c,0x1c,0x35,0x1f,0xa0,0xfe,0xa1,0xb9,0x01,0xc6,0xae,0x42,0x48,0x2e,0x2a,0x21,0x4a,0x2b,0x44,0x39,0x32,0x1a,0x8c,0x01,0x11,0xb9,0xfe,0x89,0xdc,0x1c,0x4c,0x2d,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,0x8c,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0xfe,0x21,0x38,0x30,0x30,0x6c,\r\n0x43,0x01,0x56,0xfd,0x6f,0x03,0x38,0x01,0x89,0x94,0x0e,0x9a,0x0a,0x15,0x32,0x51,0x3c,0xfe,0xb6,0x02,0x06,0xfd,0x58,0xfe,0x18,0x1a,0x1b,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0xc6,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x00,0x01,0x00,0x0c,0xfe,0x21,0x04,0x46,0x04,0x18,0x00,0x21,\r\n0x00,0x20,0x40,0x12,0x02,0xec,0x1f,0x1c,0x08,0x16,0x05,0x19,0x04,0x07,0x18,0x1b,0x13,0xec,0x0e,0x10,0x07,0x0f,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x17,0x39,0x3f,0xed,0x30,0x31,0x13,0x16,0x33,0x32,0x37,0x13,0x01,0x33,0x01,0x13,0x3e,0x03,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x07,0x03,0x01,0x23,0x01,0x03,0x0e,0x03,0x23,0x22,0x27,\r\n0x0c,0x27,0x27,0x48,0x44,0xec,0xfe,0x89,0xb9,0x01,0x11,0x8c,0x1a,0x32,0x39,0x44,0x2b,0x4a,0x21,0x2a,0x2e,0x48,0x42,0xae,0x01,0xc6,0xb9,0xfe,0xa1,0x9f,0x26,0x44,0x45,0x4b,0x2d,0x31,0x2b,0xfe,0xc6,0x10,0x96,0x02,0x0c,0x02,0xa8,0xfd,0xfa,0x01,0x4a,0x3d,0x52,0x31,0x14,0x0a,0x9a,0x0e,0x94,0xfe,0x77,0xfc,0xc8,0x02,0x91,0xfe,\r\n0x95,0x57,0x75,0x48,0x1e,0x09,0x00,0x02,0x00,0x1a,0xff,0xd3,0x04,0x2c,0x04,0x00,0x00,0x27,0x00,0x3b,0x00,0x26,0x40,0x16,0x21,0x0f,0x37,0x25,0x01,0x1f,0x18,0x04,0x05,0x40,0x0b,0x0e,0x48,0x05,0x05,0x1d,0x15,0x2d,0x0f,0x16,0x00,0x0f,0x00,0x3f,0x3f,0x33,0x3f,0x39,0x2f,0x2b,0x17,0x39,0x33,0x3f,0x30,0x31,0x01,0x01,0x17,0x36,\r\n0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x03,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0x92,0xfe,0xa8,0x88,0x1c,0x51,0x32,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,\r\n0x2b,0x34,0x46,0x34,0x2c,0x19,0x63,0x09,0x17,0x0d,0x04,0x02,0x18,0x15,0xcd,0xbd,0x01,0x5d,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x1b,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x04,0x00,0xfd,0xfa,0xe2,0x1e,0x21,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0x1b,0x32,0x49,0x2e,\r\n0xb5,0x11,0x26,0x17,0x05,0x26,0x23,0xfe,0xb4,0x01,0xf6,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfc,0x99,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x00,0x01,0xff,0x1f,0xfe,0x57,0x03,0x92,0x04,0x00,0x00,0x15,0x00,0x1a,0x40,0x0e,0x06,0x0d,0x01,0x13,0x04,0x03,0x15,0x0f,0x0f,0x0f,\r\n0x0b,0x1b,0x03,0x15,0x00,0x3f,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x30,0x31,0x09,0x02,0x23,0x03,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x03,0x92,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xfe,0x38,0xbd,0x02,0x58,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,\r\n0x04,0x00,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfd,0x0b,0x03,0x9f,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0x00,0x02,0xff,0x1f,0xfe,0x57,0x04,0x2c,0x04,0x00,0x00,0x27,0x00,0x3b,0x00,0x2a,0x40,0x18,0x37,0x18,0x1f,0x01,0x25,0x04,0x27,0x2f,0x05,0x3f,0x05,0x02,0x05,0x05,0x0f,0x27,0x0f,0x21,0x0f,0x1d,\r\n0x1b,0x2d,0x0f,0x16,0x00,0x3f,0x33,0x3f,0x3f,0x3f,0x12,0x39,0x2f,0x5d,0x12,0x17,0x39,0x33,0x30,0x31,0x01,0x01,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,0x01,0x23,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,\r\n0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x03,0x92,0xfe,0xa8,0x88,0x1c,0x51,0x32,0x2c,0x4a,0x36,0x1f,0x21,0x39,0x4d,0x2b,0x29,0x3f,0x36,0x2e,0x16,0x74,0x09,0x17,0x0d,0x04,0x02,0x18,0x15,0xfe,0x38,0xbd,0x02,0x58,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0x1b,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,\r\n0x26,0x15,0x15,0x26,0x1d,0x10,0x04,0x00,0xfd,0xfa,0xe2,0x1e,0x21,0x1d,0x33,0x46,0x2a,0x2a,0x48,0x34,0x1e,0x15,0x29,0x3e,0x29,0xd4,0x11,0x26,0x17,0x05,0x26,0x23,0xfd,0x0b,0x03,0x9f,0x02,0x0a,0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfc,0x99,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x15,0x15,0x26,0x1d,0x10,0x10,0x1d,0x26,0x00,0x01,\r\n0xfe,0xc8,0xfe,0x21,0x03,0x7a,0x04,0x00,0x00,0x23,0x00,0x1d,0x40,0x10,0x02,0xec,0x21,0x1c,0x0e,0x12,0x08,0x17,0x04,0x10,0x14,0x15,0x10,0x0f,0x0a,0x0f,0x00,0x3f,0x3f,0x3f,0x12,0x17,0x39,0x3f,0xed,0x30,0x31,0x01,0x16,0x33,0x32,0x3e,0x02,0x37,0x01,0x01,0x33,0x13,0x16,0x16,0x17,0x33,0x01,0x33,0x01,0x01,0x23,0x03,0x26,0x27,\r\n0x23,0x06,0x06,0x07,0x01,0x0e,0x03,0x23,0x22,0x27,0xfe,0xc8,0x27,0x27,0x14,0x1d,0x1f,0x2a,0x21,0x01,0xae,0xfe,0xb2,0xbf,0xc6,0x0b,0x15,0x0b,0x04,0x01,0x00,0xb5,0xfe,0xa8,0x01,0x52,0xbf,0xc9,0x14,0x19,0x04,0x02,0x18,0x15,0xfe,0xab,0x2b,0x41,0x3c,0x41,0x2a,0x31,0x2b,0xfe,0xc6,0x10,0x0a,0x21,0x3f,0x34,0x02,0xa2,0x02,0x0a,\r\n0xfe,0xa2,0x14,0x28,0x14,0x01,0xae,0xfd,0xfa,0xfe,0x06,0x01,0x4c,0x1f,0x2f,0x05,0x26,0x23,0xfd,0xdc,0x45,0x64,0x40,0x1e,0x09,0x00,0x00,0x01,0x00,0x0e,0xfe,0x1e,0x03,0x40,0x04,0x00,0x00,0x14,0x00,0x18,0x40,0x0b,0x0f,0x0b,0x14,0x14,0x03,0x0d,0x0f,0x08,0x95,0x03,0x1c,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0x30,0x31,\r\n0x01,0x01,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x37,0x37,0x01,0x33,0x01,0x17,0x33,0x36,0x36,0x37,0x13,0x03,0x40,0xfe,0xbe,0x7e,0xe4,0x41,0x2a,0x34,0x2d,0x7d,0x3d,0x52,0xfe,0x70,0xb6,0x01,0x15,0x15,0x06,0x02,0x0a,0x08,0x99,0x02,0x89,0xfc,0xd3,0xfe,0xc2,0x0d,0x93,0x12,0x94,0xc2,0x03,0xfe,0xfc,0xec,0x4e,0x0c,0x26,0x1a,\r\n0x01,0x9f,0x00,0x02,0x00,0x25,0x03,0x50,0x02,0x4a,0x05,0xbe,0x00,0x10,0x00,0x21,0x00,0x14,0xb7,0x11,0x16,0x14,0x1c,0x0b,0x10,0x0d,0x05,0x00,0x2f,0xcd,0xcc,0x32,0xde,0xcd,0xcc,0x32,0x30,0x31,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x33,0x16,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,\r\n0x02,0x17,0x02,0x4a,0x05,0x2e,0x4a,0x61,0x39,0x3a,0x61,0x47,0x2a,0x02,0x64,0x0c,0xa0,0x45,0x60,0x0a,0x0a,0x60,0x45,0xa0,0x0c,0x64,0x02,0x2a,0x47,0x61,0x3a,0x37,0x62,0x4a,0x2f,0x05,0x05,0xbe,0x38,0x5c,0x43,0x25,0x24,0x42,0x5d,0x39,0x9b,0x53,0x48,0xfd,0x92,0x48,0x53,0x9b,0x39,0x5d,0x42,0x24,0x25,0x42,0x5d,0x38,0x00,0x01,\r\n0x00,0x64,0x01,0xbc,0x02,0x4e,0x05,0xc4,0x00,0x21,0x00,0x14,0xb7,0x12,0x1f,0x1f,0x19,0x1a,0x0a,0x05,0x19,0x00,0x2f,0xdc,0xcd,0x2f,0x12,0x39,0x2f,0xcd,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,\r\n0x4e,0x1f,0x3a,0x56,0x36,0x2b,0x24,0x2b,0x26,0x13,0x25,0x1b,0x11,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,0xb4,0x02,0xa0,0x3e,0x57,0x36,0x19,0x10,0x5f,0x16,0x06,0x1a,0x32,0x2c,0x01,0x3a,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0x00,0x01,0x00,0x00,0x02,0x9a,0x01,0xf4,0x05,0xc4,0x00,0x28,\r\n0x00,0x29,0x40,0x13,0x1c,0x1d,0x0e,0x02,0x02,0x16,0x23,0x07,0x08,0x1d,0x23,0x08,0x08,0x23,0x1d,0x03,0x12,0x27,0x12,0x00,0x2f,0x2f,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x30,0x31,0x01,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x37,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,\r\n0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x07,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x01,0x3c,0x12,0x11,0x24,0x1b,0x3f,0x1e,0x42,0x35,0x50,0x4b,0x10,0x0d,0x80,0x0a,0x14,0x0b,0x21,0x1b,0x21,0x1e,0x1e,0x39,0x3f,0x4d,0x4c,0x09,0x11,0x09,0x80,0x04,0x6b,0x05,0x27,0x20,0x3d,0x11,0x43,0x11,0x48,0x38,0x45,0x52,\r\n0x03,0xfe,0x81,0x01,0xb9,0x03,0x04,0x29,0x1f,0x23,0x23,0x0a,0x41,0x0b,0x48,0x3e,0x45,0x52,0x03,0x02,0x01,0x20,0x00,0x01,0x00,0x00,0x02,0x95,0x01,0xbf,0x05,0xc0,0x00,0x2f,0x00,0x23,0x40,0x0f,0x03,0x2d,0x2d,0x0a,0x10,0x10,0x28,0x22,0x22,0x15,0x1b,0x1b,0x07,0x1e,0x07,0x00,0x2f,0x2f,0x12,0x39,0x2f,0xcd,0x33,0x2f,0xcd,0x32,\r\n0x2f,0xcd,0x33,0x2f,0xcd,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x27,0x11,0x23,0x11,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x35,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x17,0x35,0x33,0x11,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x23,0x22,0x27,0x15,0x16,0x33,0x32,0x37,0x01,0xbf,0x02,0x40,0x38,0x11,0x10,0x86,0x14,\r\n0x0d,0x41,0x02,0x3a,0x02,0x40,0x3b,0x11,0x10,0x14,0x0d,0x41,0x02,0x3a,0x02,0x40,0x3b,0x11,0x10,0x86,0x0d,0x11,0x3e,0x02,0x3d,0x02,0x40,0x38,0x11,0x10,0x0d,0x11,0x3e,0x02,0x04,0x3d,0x47,0x59,0x03,0xfe,0xf5,0x01,0x45,0x06,0x50,0x49,0x57,0x04,0x76,0x06,0x50,0x49,0x57,0x04,0xcc,0xfe,0xf7,0x04,0x52,0x47,0x59,0x03,0x79,0x04,\r\n0x52,0x00,0x00,0x01,0x00,0x00,0x02,0x8d,0x02,0x80,0x04,0xfc,0x00,0x25,0x00,0x19,0x40,0x0a,0x0c,0x13,0x13,0x02,0x01,0x25,0x1e,0x06,0x06,0x01,0x00,0x2f,0x33,0x2f,0xcd,0x2f,0x12,0x39,0x33,0x2f,0xcd,0x30,0x31,0x01,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,\r\n0x15,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x02,0x80,0x7f,0x02,0x1d,0x4f,0x3d,0xd3,0x1c,0x30,0x11,0x18,0x0e,0x0c,0x2e,0x16,0x29,0x42,0x2d,0x18,0x05,0x14,0x29,0x23,0x24,0x3a,0x29,0x15,0x7f,0x02,0x9a,0x5c,0x35,0x34,0xf7,0xa0,0x40,0x3f,0x07,0x08,0x5e,0x05,0x05,0x1e,0x35,0x4a,0x2c,0x8c,0x2e,0x45,0x2e,0x17,\r\n0x1e,0x33,0x41,0x24,0x01,0x3b,0x00,0x02,0x00,0x60,0xff,0xe8,0x04,0x0e,0x04,0x18,0x00,0x14,0x00,0x29,0x00,0x1b,0x40,0x0e,0x00,0x1b,0x95,0x13,0x10,0x06,0x25,0x95,0x09,0x16,0x04,0x15,0x03,0x0f,0x00,0x3f,0x3f,0x3f,0xed,0x32,0x3f,0xed,0x32,0x30,0x31,0x01,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x13,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0x66,0x04,0xa4,0xa4,0x04,0x7a,0xe8,0x63,0x9c,0x6c,0x39,0x40,0x79,0xad,0x6d,0xcc,0x6b,0x2c,0x4e,0x6b,0x3f,0x4a,0x76,0x52,0x2c,0x29,0x4c,0x6c,0x44,0x48,0x75,0x53,0x2d,0x03,0x6c,0x94,0xfc,0x00,0xb4,0xcc,0x48,0x84,\r\n0xbb,0x73,0x7f,0xd0,0x95,0x52,0xfd,0xb7,0x8f,0x3e,0x6f,0x53,0x30,0x3b,0x6f,0xa0,0x65,0x55,0x87,0x5f,0x32,0x36,0x5e,0x7f,0xff,0xff,0x00,0x58,0x00,0x00,0x04,0xb8,0x04,0x45,0x02,0x06,0x0d,0x80,0x00,0x00,0xff,0xff,0x00,0xcf,0x03,0xca,0x01,0x88,0x04,0x7f,0x00,0x07,0x0f,0x50,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0xcf,0xfe,0xe8,\r\n0x01,0x88,0xff,0x9d,0x00,0x07,0x0f,0x50,0x00,0x2b,0xfe,0xed,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x04,0x7f,0x00,0x07,0x0f,0x51,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfe,0xe8,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x51,0x00,0x2b,0xfe,0xed,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x05,0x97,0x00,0x07,0x0f,0x53,0x00,0x2b,\r\n0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x53,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,0x05,0x97,0x00,0x07,0x0f,0x54,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x54,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x2e,0x03,0xca,0x02,0x29,\r\n0x05,0x97,0x00,0x07,0x0f,0x56,0x00,0x2b,0x03,0xcf,0xff,0xff,0x00,0x2e,0xfd,0xd0,0x02,0x29,0xff,0x9d,0x00,0x07,0x0f,0x56,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x67,0xfe,0x36,0x01,0xf0,0xff,0x9e,0x00,0x06,0x0f,0x5d,0x2b,0x37,0xff,0xff,0x00,0xcf,0x03,0xca,0x01,0x88,0x05,0x97,0x00,0x07,0x0f,0x52,0x00,0x2b,0x03,0xcf,0xff,0xff,\r\n0x00,0xcf,0xfd,0xd0,0x01,0x88,0xff,0x9d,0x00,0x07,0x0f,0x52,0x00,0x2b,0xfd,0xd5,0xff,0xff,0x00,0x8b,0xfe,0x63,0x01,0xcc,0xff,0xa4,0x00,0x06,0x0f,0x5b,0x2b,0x64,0xff,0xff,0x00,0x0c,0x03,0xca,0x02,0x72,0x06,0x2c,0x00,0x07,0x0f,0x57,0x00,0x46,0x03,0xca,0xff,0xff,0x00,0x0c,0xfe,0x17,0x02,0x72,0x00,0x79,0x00,0x07,0x0f,0x57,\r\n0x00,0x46,0xfe,0x17,0xff,0xff,0xff,0xd4,0x03,0xc3,0x02,0x33,0x06,0xa7,0x02,0x07,0x0e,0x65,0x00,0x00,0xfe,0xa3,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x05,0x95,0x00,0x27,0x0a,0x65,0x00,0x1e,0xfe,0xa3,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x06,0xa0,0x00,0x27,0x0a,0x66,0x00,0x1e,0xfe,0xa3,\r\n0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x51,0x05,0x9f,0x00,0x27,0x0a,0x67,0x00,0x1e,0xfe,0xa3,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x05,0xff,0xf2,0x02,0x01,0x07,0x8d,0x02,0x26,0x08,0xc7,0x00,0x00,0x00,0x06,0x09,0x2c,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x01,0x07,0x8d,0x02,0x26,\r\n0x09,0x0d,0x00,0x00,0x00,0x06,0x09,0x2c,0x00,0x00,0x00,0x02,0x00,0x52,0xfe,0x9c,0x0c,0xb6,0x03,0xba,0x00,0x7a,0x00,0x8a,0x00,0x68,0xb1,0x72,0x03,0xbd,0x04,0xfb,0x00,0x77,0x05,0x03,0x00,0x15,0x00,0x6a,0x04,0xfb,0xb6,0x6b,0x6b,0x59,0x1f,0x5e,0x37,0x34,0xb8,0x04,0xfb,0xb6,0x7b,0x55,0x59,0x33,0x33,0x2c,0x3c,0x41,0x09,0x04,\r\n0xfb,0x00,0x59,0x05,0x03,0x00,0x7e,0x04,0xfb,0x00,0x50,0x05,0x03,0x00,0x86,0x04,0xfb,0xb5,0x2f,0x46,0x01,0x46,0x46,0x25,0xb8,0x04,0xff,0xb3,0x2c,0x0e,0x0e,0x2c,0x00,0x2f,0x33,0x2f,0x10,0xed,0x33,0x2f,0x5d,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x39,0xed,0x32,0x32,0x39,0x11,0x33,0x2f,0xed,0x32,0x3f,0xed,0x32,\r\n0x30,0x31,0x37,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x00,0x17,0x1e,0x03,0x17,0x26,0x26,0x35,0x34,0x3e,0x04,0x37,0x35,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x04,0x17,0x07,0x06,0x06,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,\r\n0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x0e,0x05,0x15,0x14,0x1e,0x02,0x17,0x07,0x2e,0x05,0x27,0x0e,0x03,0x23,0x22,0x26,0x27,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x52,0x61,0xa6,0x39,0x4f,0x6c,0x42,0x1d,0x3b,0x60,0x7b,0x40,0xb9,0x01,0x05,0x2d,0x1f,0x5e,0x76,0x8a,0x4b,\r\n0x06,0x09,0x31,0x5a,0x80,0x9f,0xb9,0x67,0x39,0x60,0x68,0x7d,0x56,0x4e,0x7e,0x33,0x37,0x84,0x4e,0x50,0x7c,0x6a,0x61,0x69,0x7a,0x4e,0x20,0x20,0x50,0x31,0x01,0x13,0x30,0x55,0x44,0x3f,0x56,0x3a,0x22,0x0b,0x14,0x37,0x54,0x79,0x56,0x61,0x8b,0x58,0x2a,0x2b,0x56,0x81,0x57,0x36,0x63,0x58,0x4b,0x1f,0x32,0x88,0x55,0x31,0x43,0x6e,\r\n0x50,0x30,0x05,0x30,0x6f,0x70,0x66,0x50,0x2f,0x24,0x4b,0x73,0x50,0x2f,0x50,0xad,0xad,0xa5,0x91,0x77,0x28,0x1c,0x53,0x67,0x76,0x3f,0x3a,0x9a,0x4b,0x09,0xd1,0x2a,0x8f,0x55,0x5e,0x6a,0x1a,0x35,0x52,0x38,0x32,0x4e,0x3e,0x2e,0xa9,0x0b,0x0b,0x15,0x2c,0x44,0x2f,0x49,0x9c,0x9f,0xa1,0x4e,0xfe,0xdc,0xf9,0x5a,0x97,0x7b,0x61,0x23,\r\n0x1e,0x39,0x12,0x38,0x57,0x47,0x3e,0x3d,0x42,0x29,0x05,0x1b,0x36,0x2a,0x1b,0x14,0x10,0x9d,0x12,0x17,0x1d,0x2b,0x32,0x2c,0x1e,0x01,0xc8,0x08,0x29,0x1d,0x2a,0x3a,0x26,0x11,0x2e,0x41,0x48,0x1a,0x2f,0x72,0x62,0x42,0x4d,0x74,0x86,0x3a,0x3b,0x72,0x59,0x36,0x17,0x28,0x35,0x1f,0x4b,0x48,0x29,0x4d,0x6e,0x45,0x0c,0x24,0x2a,0x31,\r\n0x34,0x38,0x1b,0x25,0x43,0x35,0x22,0x04,0xaa,0x08,0x2a,0x41,0x55,0x67,0x77,0x42,0x2c,0x3b,0x24,0x0f,0x0c,0x0a,0x01,0x05,0x34,0x37,0x44,0x46,0x21,0x50,0x45,0x2f,0x28,0x47,0x5f,0x00,0x00,0x12,0x00,0x32,0xff,0x17,0x07,0xc3,0x06,0x5d,0x01,0x37,0x01,0x67,0x01,0x8a,0x01,0xb5,0x01,0xb9,0x01,0xc7,0x01,0xec,0x02,0x11,0x02,0x21,\r\n0x02,0x30,0x02,0x3a,0x02,0x44,0x02,0x48,0x02,0x4c,0x02,0x50,0x02,0x54,0x02,0x58,0x02,0x5c,0x00,0x00,0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,\r\n0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x15,0x14,0x16,0x33,0x33,0x35,0x33,0x15,0x21,\r\n0x32,0x3e,0x02,0x35,0x11,0x23,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x33,0x14,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x17,\r\n0x33,0x11,0x33,0x11,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x23,0x11,0x14,0x1e,0x02,0x33,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,\r\n0x36,0x36,0x37,0x15,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x21,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x3e,0x02,0x35,0x35,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,\r\n0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x01,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x27,0x15,0x14,0x0e,0x02,0x23,\r\n0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x36,0x35,0x35,0x01,0x33,0x11,0x23,0x25,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x01,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x05,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x01,0x34,\r\n0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x1e,0x03,0x03,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x13,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x01,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x01,0x21,0x15,0x21,0x25,0x33,0x15,0x23,0x03,0x23,0x35,0x33,\r\n0x07,0x23,0x35,0x33,0x05,0xf4,0x19,0x27,0x32,0x18,0x23,0x37,0x0e,0x11,0x39,0x17,0x1d,0x38,0x10,0x17,0x39,0x17,0x68,0x2f,0x35,0x0b,0x15,0x31,0x14,0x97,0x18,0x28,0x0d,0x10,0x24,0x19,0x13,0x27,0x11,0x0f,0x1b,0x0a,0x19,0x14,0x0e,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0c,0x18,0x27,0x1e,0x13,0x05,0x01,0x05,0x0e,\r\n0x19,0x15,0x8d,0x09,0x15,0x11,0x0c,0xdb,0x1d,0x27,0x0d,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x13,0x23,0xd2,0x41,0x01,0xee,0x09,0x15,0x11,0x0c,0x0c,0x26,0x2e,0x0a,0x15,0x31,0x14,0x27,0x2f,0x22,0x1b,0x12,0x13,0x24,0x21,0x29,0x21,0x8b,0x94,0x75,\r\n0x6a,0x01,0x02,0x3c,0x03,0x20,0x30,0x3a,0x1a,0x73,0x6d,0x24,0x2a,0x24,0x42,0x3c,0x1f,0x2a,0x22,0x24,0x1a,0x09,0x14,0x11,0x0b,0x41,0x18,0x22,0x0a,0x41,0x1a,0x21,0x05,0x05,0x42,0x04,0x04,0x03,0x04,0x3c,0x10,0x36,0x3d,0x3e,0x19,0x2c,0x3c,0x25,0x10,0x21,0x39,0x4d,0x2d,0x4b,0x1a,0x36,0x30,0x28,0x0d,0x01,0x0f,0x2d,0x16,0x0e,\r\n0x07,0x11,0x1d,0x15,0xb7,0x2e,0x1b,0x15,0x2c,0x42,0x2c,0x0e,0x2d,0x12,0x11,0x25,0x14,0x17,0x26,0x1d,0x10,0x24,0x35,0x2f,0x4e,0x33,0x2d,0x4e,0x4a,0x48,0x27,0x8c,0x2f,0x35,0x0b,0x15,0x31,0x14,0xfe,0x16,0x07,0x11,0x1d,0x15,0x6b,0x0b,0x18,0x13,0x0d,0x43,0x1d,0x26,0x0c,0x17,0x12,0x0c,0x40,0x21,0x2a,0x0e,0x1a,0x13,0x0b,0xfc,\r\n0x2c,0x13,0x23,0x17,0x22,0x42,0x16,0x24,0x2d,0x16,0x20,0x2a,0x0e,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x04,0x1d,0x2a,0x43,0x20,0x27,0x31,0x1b,0x0a,0x01,0x21,0x22,0x1a,0x30,0x25,0x16,0x13,0x21,0x2d,0x1b,0x1d,0x2e,0x14,0x16,0x15,0x14,0x2d,0x48,\r\n0x33,0x23,0x43,0x27,0xe6,0x12,0x1c,0x23,0x12,0x34,0x16,0x0d,0x27,0x11,0x14,0x29,0x0b,0x11,0x28,0x11,0xfe,0xa3,0x01,0x60,0x11,0x1f,0x30,0x15,0x1b,0x11,0x1e,0x2d,0x18,0x1d,0x15,0x1e,0xfd,0xf8,0x42,0x42,0x04,0x15,0x4d,0x3c,0x11,0x19,0x1c,0x0c,0x17,0x2d,0x28,0x21,0x0b,0xfa,0xe9,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,\r\n0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x02,0x68,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x03,0x7c,0x0d,0x16,0x1c,0x0f,0x0c,0x16,0x11,0x0b,0x31,0x20,0x0f,0x1e,0xfa,0x73,0x14,0x19,0x09,0x11,0x15,0x0c,0x2d,0x1b,0x17,0x1d,0x12,0x0a,0xf3,\r\n0x29,0x1b,0x0c,0x18,0x0c,0x32,0x42,0x05,0x29,0x1b,0x0c,0x18,0x0c,0x32,0x42,0x03,0x5d,0x01,0x0d,0xfe,0xf3,0x01,0x0d,0xfe,0xf3,0x02,0x36,0x01,0x0d,0xfe,0xf3,0xfd,0x85,0xd1,0xd1,0xe2,0x4c,0x4c,0x83,0x4b,0x4b,0x01,0x23,0xa2,0x29,0x31,0x1b,0x09,0x12,0x0f,0x14,0x0d,0x11,0x14,0x16,0x0f,0x18,0x0d,0x15,0x10,0x13,0x0e,0x10,0x11,\r\n0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x01,0x48,0x14,0x11,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,0x01,0x07,0xf3,0x26,0x27,0x7c,0x7c,0x05,\r\n0x0d,0x16,0x11,0x01,0x83,0x02,0x17,0x0c,0x15,0x10,0x2b,0x34,0x2b,0x1d,0x1a,0x10,0x26,0x2b,0x30,0x1a,0x4f,0x4b,0x4d,0x55,0x0e,0x17,0x0e,0x13,0x15,0x09,0x20,0x25,0x12,0x05,0x29,0x30,0x11,0x22,0x26,0x2c,0x1c,0x39,0x48,0x2b,0x33,0x2b,0x05,0x0e,0x15,0x11,0x02,0x0c,0xfe,0x0b,0x1a,0x30,0x05,0x01,0xb8,0xfe,0x48,0x02,0x17,0x14,\r\n0x11,0x29,0x17,0x17,0x2b,0x15,0x21,0x03,0x38,0x59,0x3e,0x21,0x1c,0x2f,0x40,0x24,0x33,0x39,0x1b,0x06,0x02,0x09,0x14,0x12,0x14,0x1d,0xfe,0x94,0x0f,0x1c,0x17,0x0e,0x27,0x3b,0x19,0x1d,0x35,0x27,0x17,0x03,0x03,0x46,0x03,0x04,0x05,0x11,0x1f,0x19,0x17,0x37,0x21,0x09,0x1f,0x19,0x4e,0x14,0x1a,0x10,0x06,0x18,0x0d,0x15,0x10,0xfe,\r\n0xcf,0x0f,0x1c,0x17,0x0e,0x04,0x0d,0x16,0x12,0x63,0x4b,0x2c,0x25,0x04,0x0c,0x17,0x12,0x63,0x49,0x2c,0x26,0x01,0x04,0x0c,0x17,0x12,0x9f,0x03,0x42,0x26,0x27,0x1a,0x1f,0x01,0x6d,0xfe,0x90,0x25,0x30,0x1d,0x0c,0x13,0x12,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,\r\n0x01,0x39,0xfa,0x39,0x11,0x0e,0x1a,0x28,0x33,0x1a,0x0f,0x10,0x1f,0x2d,0x1d,0x19,0x37,0x2f,0x1e,0x21,0x21,0x22,0x5c,0x34,0x2d,0x53,0x3f,0x26,0x0f,0x12,0x56,0x6d,0x1b,0x21,0x12,0x06,0x16,0x0e,0x08,0x0b,0x0e,0x0f,0x0a,0x30,0x0f,0x17,0x43,0x32,0x1d,0x1a,0x0e,0x18,0x43,0x31,0x1d,0x1a,0x01,0x0e,0x18,0x6b,0x06,0x70,0xfd,0x3c,\r\n0x95,0x1b,0x24,0x20,0x29,0x18,0x0a,0x1c,0x2f,0x3e,0x21,0x02,0x02,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0x69,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,\r\n0x0f,0x08,0xfa,0xc0,0x0f,0x2d,0x2a,0x1e,0x0f,0x17,0x1e,0x0f,0x1d,0x21,0x05,0x20,0x0f,0x14,0x0c,0x1d,0x18,0x11,0x68,0x04,0x05,0x03,0x01,0x02,0x33,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0x01,0xe7,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0xfc,0xd6,0x25,0x01,0x6f,0x25,0x03,0x3f,0x25,0x51,0x25,0xfb,0x58,0x4c,0x4c,0x4c,0x00,0x00,0x05,\r\n0x00,0x32,0xff,0xba,0x06,0xc7,0x06,0x22,0x00,0xa9,0x00,0xb9,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0x00,0x25,0x22,0x26,0x27,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x35,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x27,0x26,\r\n0x26,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x16,0x33,0x32,0x37,0x26,0x02,0x27,0x35,0x33,0x16,0x12,0x17,0x33,0x11,0x33,0x11,0x14,0x07,0x16,0x16,0x17,0x3e,0x03,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x16,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x3e,0x02,\r\n0x37,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x17,0x36,0x36,0x37,0x26,0x26,0x27,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x16,0x17,0x36,0x36,0x37,0x17,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x37,0x15,0x0e,0x05,0x25,0x26,0x26,0x27,0x0e,0x03,0x07,0x16,0x16,0x33,0x32,0x3e,0x02,0x01,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,\r\n0x3e,0x02,0x35,0x01,0x23,0x35,0x33,0x07,0x23,0x35,0x33,0x04,0xc2,0x2d,0x39,0x10,0x09,0x0a,0x3b,0x5d,0x7e,0x4c,0x6b,0xc5,0xab,0x8a,0x2e,0x33,0x93,0xae,0xc0,0x60,0x3e,0x70,0x56,0x32,0x14,0x2d,0x39,0x16,0x14,0x37,0x3d,0x42,0x20,0x2d,0x5e,0x58,0x4d,0x1c,0x34,0x69,0x29,0x25,0x40,0x22,0x10,0x10,0x05,0x10,0x07,0x0f,0x08,0x32,\r\n0x43,0x2c,0x4d,0x39,0x20,0x17,0x48,0x2a,0x21,0x33,0x23,0x13,0x34,0x51,0x61,0x2d,0x4c,0x3e,0x46,0x3a,0x24,0x39,0x96,0x61,0x5c,0x41,0x81,0x3e,0x08,0x48,0x25,0x0e,0x1b,0x0d,0x13,0x22,0x18,0x0e,0x47,0x08,0x0b,0x0a,0x25,0x14,0x16,0x47,0x16,0x19,0x3d,0x42,0x44,0x21,0x22,0x41,0x22,0x23,0x27,0x2a,0x62,0x35,0x22,0x13,0x1f,0x0c,\r\n0x15,0x3e,0x2a,0x2b,0x56,0x2f,0x1c,0x21,0x2a,0x57,0x33,0x63,0x5d,0x14,0x2d,0x14,0x03,0x19,0x17,0x3d,0x22,0x15,0x27,0x15,0x59,0x1e,0x51,0x5d,0x63,0x5f,0x56,0x01,0x3d,0x0f,0x2b,0x20,0x2f,0x60,0x5b,0x51,0x20,0x0f,0x2e,0x1d,0x29,0x5e,0x5c,0x56,0xfb,0x47,0x22,0x43,0x35,0x21,0x24,0x1f,0x10,0x2a,0x25,0x19,0x04,0xb9,0x3f,0x3f,\r\n0xad,0x3f,0x3f,0x47,0x28,0x26,0x1f,0x18,0x38,0x30,0x20,0x31,0x4e,0x61,0x30,0x61,0x37,0x67,0x50,0x30,0x18,0x29,0x36,0x1e,0x1c,0x24,0x2f,0x25,0x34,0x21,0x0f,0x11,0x1d,0x24,0x13,0x54,0x1e,0x2d,0x0b,0x0a,0x06,0x03,0x02,0x39,0x19,0x33,0x19,0x19,0x15,0x28,0x39,0x23,0x17,0x20,0x18,0x29,0x34,0x1c,0x34,0x44,0x29,0x13,0x03,0x25,\r\n0xfe,0xec,0x32,0x36,0x15,0xab,0x01,0x4c,0x9f,0x05,0x6b,0xfe,0xea,0xb4,0x03,0x86,0xfc,0x77,0x4c,0x31,0x2b,0x5c,0x30,0x08,0x1f,0x27,0x2c,0x15,0x04,0x7b,0xfb,0xb5,0x20,0x38,0x1a,0x17,0x20,0x04,0xa7,0xfb,0x59,0x0d,0x16,0x1c,0x10,0x0a,0x08,0x52,0x13,0x11,0x0c,0x0a,0x11,0x08,0x11,0x21,0x10,0x10,0x0e,0x52,0x0e,0x10,0x1e,0x43,\r\n0x0b,0x1a,0x0b,0x5a,0x0f,0x0e,0x24,0x13,0x0c,0x1a,0x10,0x32,0x54,0x16,0x33,0x34,0x31,0x25,0x17,0xda,0x0e,0x1b,0x0f,0x18,0x2d,0x23,0x16,0x01,0x1c,0x24,0x18,0x27,0x30,0x01,0xe0,0x03,0x0b,0x19,0x2b,0x22,0x1e,0x29,0x06,0x0d,0x14,0x0e,0xfd,0x9c,0x40,0x85,0x40,0x00,0x00,0x20,0x00,0x32,0xfe,0x62,0x08,0x31,0x06,0xaf,0x00,0x69,\r\n0x00,0xcf,0x01,0x2d,0x01,0x5d,0x01,0x61,0x01,0x86,0x01,0x8a,0x01,0x96,0x01,0xa5,0x01,0xb4,0x01,0xbe,0x01,0xc2,0x01,0xc6,0x01,0xca,0x01,0xf0,0x01,0xf4,0x02,0x1a,0x02,0x1e,0x02,0x2a,0x02,0x36,0x02,0x42,0x02,0x4e,0x02,0x52,0x02,0x56,0x02,0x5a,0x02,0x5e,0x02,0x62,0x02,0x66,0x02,0x6a,0x02,0x6e,0x02,0x93,0x02,0xb8,0x00,0x00,\r\n0x01,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,\r\n0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x32,0x3e,0x02,0x35,0x35,0x01,0x06,0x06,0x07,0x0e,0x03,0x23,0x23,0x22,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,\r\n0x37,0x36,0x36,0x35,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x37,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x17,0x03,0x06,0x06,0x07,0x0e,0x03,0x23,0x23,\r\n0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x37,0x27,0x26,0x26,0x23,0x22,0x06,\r\n0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x17,0x1e,0x03,0x33,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x25,0x33,0x11,0x23,0x01,0x06,0x06,0x15,\r\n0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x01,0x23,0x35,0x33,0x13,0x22,0x06,0x07,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x01,0x1e,0x03,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x01,0x32,0x36,0x35,\r\n0x34,0x2e,0x02,0x23,0x22,0x07,0x1e,0x03,0x25,0x14,0x16,0x33,0x32,0x36,0x37,0x35,0x06,0x06,0x01,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x13,0x23,0x35,0x33,0x01,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x27,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,\r\n0x33,0x01,0x33,0x11,0x23,0x03,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x27,0x0e,0x03,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x01,0x33,0x11,0x23,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x14,0x16,0x01,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x01,0x33,0x15,0x23,0x25,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0x01,0x33,0x15,0x23,0x05,0x33,0x15,0x23,0x03,0x33,0x15,0x23,0x05,0x06,0x06,0x15,\r\n0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,0x22,0x26,0x35,0x34,0x34,0x37,0x13,0x06,0x06,0x15,0x14,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x35,0x33,0x14,0x16,0x15,0x14,0x06,0x23,0x22,0x27,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x34,0x37,0x08,0x31,0x19,0x27,0x32,0x18,0x23,0x37,0x0e,0x11,0x39,0x17,0x1d,0x38,0x10,0x17,0x39,0x17,0x20,0x33,0x0f,0x15,0x31,0x14,0x30,0x18,0x28,0x0d,0x10,0x24,0x19,0x13,0x27,0x11,0x0f,0x1b,0x0a,0x19,0x14,0x0e,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0c,0x18,0x27,0x1e,0x13,0x05,0x01,0x05,\r\n0x0e,0x19,0x15,0x26,0x09,0x15,0x11,0x0c,0x41,0x1d,0x23,0x0b,0x18,0x13,0x0d,0x43,0x1d,0x26,0x0c,0x17,0x12,0x0c,0x40,0x21,0x2a,0x0e,0x1a,0x13,0x0b,0xfd,0x03,0x1a,0x32,0x17,0x16,0x32,0x39,0x3f,0x23,0x24,0x44,0x1c,0x13,0x2c,0x20,0x21,0x3a,0x18,0x12,0x2d,0x19,0x18,0x11,0x15,0x09,0x05,0x58,0x65,0x2f,0x41,0x28,0x12,0x03,0x02,\r\n0x02,0x03,0x42,0x05,0x05,0x31,0x3b,0x23,0x32,0x1f,0x0e,0x07,0x06,0x42,0x08,0x02,0x1c,0x1d,0x10,0x16,0x11,0x0b,0x04,0x0d,0x1a,0x20,0x29,0x1c,0x29,0x34,0x1c,0x0b,0x01,0x08,0x12,0x20,0x1b,0x1c,0x18,0x2f,0x34,0x3b,0x23,0x16,0x23,0x23,0x23,0x16,0x18,0x2f,0x17,0x14,0x33,0x1b,0x22,0x3c,0x3c,0x3f,0x23,0x4f,0x0e,0x31,0x2a,0x16,\r\n0x2e,0x37,0x42,0x2a,0x38,0x20,0x2a,0x0e,0x15,0x31,0x14,0x27,0x17,0x28,0x0d,0x10,0x24,0x1a,0x13,0x26,0x11,0x0f,0x1b,0x0a,0x19,0x15,0x0f,0x0b,0x47,0x0a,0x0a,0x2e,0x2b,0x0d,0x24,0x26,0x23,0x0b,0x19,0x27,0x1e,0x13,0x05,0x01,0x05,0x0e,0x18,0x15,0x1d,0x09,0x15,0x11,0x0c,0x40,0x14,0x23,0x4b,0x19,0x2e,0x33,0x3b,0x26,0x19,0x19,\r\n0x38,0x2c,0x18,0x2e,0x17,0x14,0x32,0x1c,0x2a,0x39,0x1a,0x0d,0x19,0x1e,0x24,0x17,0xfd,0x23,0x13,0x23,0x17,0x22,0x42,0x16,0x24,0x2d,0x16,0x20,0x2a,0x0e,0x14,0x30,0x17,0x26,0x3c,0x0c,0x10,0x20,0x0b,0x19,0x2f,0x24,0x15,0x1e,0x33,0x41,0x23,0x42,0x15,0x21,0x13,0x26,0x43,0x01,0x20,0x42,0x42,0xfe,0x7f,0x02,0x01,0x18,0x14,0x2d,\r\n0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x01,0x40,0x33,0x33,0x32,0x1e,0x27,0x0c,0x1e,0x38,0x3e,0x08,0x10,0x19,0xfe,0x84,0x17,0x1c,0x12,0x0a,0x06,0x15,0x19,0x09,0x11,0x16,0x0c,0x2c,0x03,0x0f,0x14,0x19,0x09,0x11,0x15,0x0c,0x2d,0x1b,0x17,0x1d,0x12,0x0a,0xfb,0xfb,0x29,0x1b,0x0c,0x18,\r\n0x0c,0x32,0x42,0x07,0xb1,0x4b,0x4b,0xf9,0x00,0x4b,0x4b,0xac,0x2d,0x2d,0x04,0xac,0x1e,0x1d,0x42,0x16,0x24,0x2e,0x18,0x3e,0x20,0x15,0x03,0x1a,0x2a,0x38,0x21,0x23,0x2e,0x31,0x1f,0x36,0x2c,0x1a,0x10,0x42,0x0e,0x0f,0x05,0x04,0x20,0x26,0x01,0x10,0x41,0x41,0xdf,0x1e,0x1d,0x42,0x16,0x24,0x2e,0x18,0x3e,0x20,0x15,0x03,0x1a,0x2a,\r\n0x38,0x21,0x23,0x2e,0x31,0x1f,0x36,0x2c,0x1a,0x10,0x42,0x0e,0x0f,0x05,0x04,0x20,0x26,0x01,0x10,0x41,0x41,0xfe,0x50,0x20,0x2c,0x2c,0x20,0x20,0x2c,0x2c,0x20,0x11,0x15,0x15,0x11,0x10,0x15,0x15,0xfe,0xd8,0x1f,0x2c,0x2c,0x1f,0x21,0x2c,0x2c,0x21,0x10,0x15,0x15,0x10,0x11,0x15,0x15,0xfe,0x51,0x4b,0x4b,0x83,0x4c,0x4c,0x02,0x10,\r\n0xd1,0xd1,0xfe,0xd8,0xc7,0xc7,0x60,0xc7,0xc7,0x01,0x86,0xd1,0xd1,0xfb,0x5c,0xc7,0xc7,0x75,0xbd,0xbd,0x05,0x44,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,0x02,0x2c,0x02,0x01,0x18,0x14,0x2d,0x09,0x0c,0x0e,0x09,0x01,0x2c,0x01,0x26,0x1e,0x18,0x16,0x17,0x16,0x22,0x1d,\r\n0x02,0x04,0xf0,0xa2,0x29,0x31,0x1b,0x09,0x12,0x0f,0x14,0x0d,0x11,0x14,0x16,0x0f,0x14,0x11,0x15,0x10,0x13,0x0e,0x10,0x11,0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x63,0x4c,0x2a,0x26,0x04,0x0d,0x16,0x12,0x63,\r\n0x4b,0x2c,0x25,0x04,0x0c,0x17,0x12,0x9f,0x85,0x2c,0x26,0x01,0x04,0x0c,0x17,0x12,0x9f,0xfc,0xfb,0x07,0x20,0x0e,0x0e,0x1f,0x1a,0x10,0x27,0x14,0x13,0x1c,0x14,0x14,0x1c,0x08,0x07,0x59,0x63,0x19,0x2e,0x42,0x29,0x0f,0x1b,0x0e,0x0e,0x16,0x0c,0x21,0x2f,0x11,0x3f,0x31,0x10,0x24,0x3b,0x2b,0x17,0x3d,0x24,0x41,0x11,0x14,0x0b,0x11,\r\n0x13,0x09,0x1b,0x2e,0x23,0x14,0x22,0x2d,0x2c,0x0a,0x09,0x12,0x0f,0x09,0x0f,0x1a,0x25,0x17,0x0b,0x11,0x0c,0x06,0x08,0x06,0x46,0x06,0x08,0x15,0x19,0x15,0x01,0xfd,0x54,0x04,0x19,0x1d,0x0f,0x1d,0x17,0x0e,0x14,0x11,0x15,0x10,0x13,0x0e,0x10,0x11,0x07,0x05,0x04,0x05,0x1f,0x1c,0x1a,0x41,0x22,0x26,0x3c,0x18,0x33,0x42,0x08,0x3c,\r\n0x46,0x24,0x09,0x18,0x26,0x2f,0x16,0x0c,0x14,0x0f,0x09,0x05,0x0d,0x16,0x11,0x9f,0x89,0x2a,0x25,0x0d,0x19,0x26,0x19,0x0c,0x0d,0x15,0x08,0x06,0x45,0x06,0x08,0x15,0x0d,0x06,0x0c,0x09,0x06,0x04,0x83,0x26,0x27,0x1a,0x1f,0x01,0x6d,0xfe,0x90,0x25,0x30,0x1d,0x0c,0x13,0x12,0x11,0x14,0x23,0x26,0x05,0x03,0x0c,0x19,0x28,0x1d,0x21,\r\n0x31,0x22,0x16,0x06,0x2b,0xd1,0x27,0x26,0x19,0x20,0x01,0x39,0x5a,0xfd,0xf1,0x02,0x46,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xfc,0x7e,0xdb,0xfe,0xa4,0x2c,0x25,0x20,0x29,0x0a,0x19,0x16,0x0f,0xfd,0x41,0x04,0x05,0x03,0x01,0x0f,0x14,\r\n0x0c,0x1c,0x19,0x11,0x04,0x56,0x0f,0x14,0x0c,0x1d,0x18,0x11,0x68,0x04,0x05,0x03,0x01,0x6a,0x17,0x13,0x02,0x04,0x74,0x0b,0x28,0xfe,0xb5,0x4c,0xfe,0xb0,0x4d,0x03,0xa2,0x71,0xfb,0x17,0x14,0x25,0x01,0x9c,0xfe,0x61,0x29,0x32,0x1b,0x09,0x10,0x2e,0x3e,0x27,0x11,0x12,0x45,0x10,0x35,0x38,0x31,0x5b,0x2b,0x1f,0x2c,0x1b,0x16,0x12,\r\n0x01,0xd0,0xfd,0xe7,0xfd,0xd0,0x14,0x25,0x01,0xa7,0xfe,0x56,0x29,0x31,0x1b,0x09,0x10,0x2e,0x41,0x2a,0x13,0x12,0x44,0x10,0x3d,0x39,0x30,0x5b,0x2c,0x1f,0x2d,0x1b,0x16,0x12,0x01,0xdb,0xfd,0xdd,0x06,0xa1,0x2d,0x20,0x20,0x2c,0x2c,0x20,0x20,0x2d,0x71,0x14,0x10,0x10,0x15,0x15,0x10,0x10,0x14,0xfd,0xfb,0x2d,0x21,0x20,0x2c,0x2c,\r\n0x20,0x21,0x2d,0x72,0x14,0x10,0x10,0x16,0x16,0x10,0x10,0x14,0xfb,0xca,0x4c,0x4c,0x4c,0x04,0x61,0x25,0x8e,0x29,0xfb,0x6f,0x29,0x02,0x00,0x25,0x21,0x2a,0x03,0x7d,0x2a,0xbb,0x0a,0x14,0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xfd,0x87,0x0a,0x14,\r\n0x02,0x20,0x22,0x1e,0x1e,0x11,0x11,0x10,0x11,0x08,0x0d,0x0a,0x07,0x0b,0x08,0x26,0x2a,0x12,0x12,0x30,0x20,0x03,0x0f,0x08,0xff,0xff,0x00,0x29,0x03,0xcb,0x02,0x25,0x04,0xdc,0x00,0x07,0x09,0x2c,0x00,0x24,0xfd,0x4f,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x04,0xdc,0x00,0x27,0x09,0x2c,0x00,0x24,0xfd,0x4f,0x00,0x06,0x14,0x02,\r\n0x00,0x00,0xff,0xff,0x00,0x05,0x03,0x9a,0x02,0x9c,0x05,0x53,0x00,0x07,0x09,0x2d,0x00,0xd2,0xfd,0x45,0x00,0x01,0x00,0x9a,0xff,0xf2,0x03,0x2a,0x02,0xdd,0x00,0x13,0x00,0x10,0xb1,0x0a,0x12,0xba,0x04,0xfb,0x00,0x01,0x05,0x03,0x00,0x3f,0xed,0x2f,0x30,0x31,0x05,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,\r\n0x1e,0x02,0x33,0x33,0x03,0x2a,0x79,0x9c,0xce,0x7b,0x32,0x12,0x11,0x9a,0x0e,0x12,0x21,0x5a,0xa1,0x81,0x56,0x0e,0x50,0x87,0xb2,0x63,0x3f,0x7b,0x45,0x40,0x6f,0x3e,0x4a,0x7c,0x5c,0x33,0xff,0xff,0x00,0x05,0xfe,0x60,0x02,0x01,0xff,0x71,0x00,0x06,0x09,0x2e,0x00,0x00,0xff,0xff,0x00,0x15,0x03,0xcb,0x02,0x11,0x04,0x23,0x00,0x07,\r\n0x09,0x2f,0x00,0x10,0xfd,0x4f,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x04,0x23,0x02,0x26,0x14,0x02,0x00,0x00,0x00,0x07,0x09,0x2f,0x00,0x10,0xfd,0x4f,0xff,0xff,0x00,0x21,0x03,0x90,0x02,0x2c,0x05,0x49,0x00,0x07,0x09,0x30,0x00,0x62,0xfd,0x3b,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x05,0x49,0x00,0x27,0x09,0x30,0x00,0x62,\r\n0xfd,0x3b,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x29,0xff,0x19,0x02,0x25,0xff,0x71,0x00,0x06,0x09,0x31,0x24,0x00,0xff,0xff,0xff,0xba,0xff,0x19,0x02,0x4e,0x00,0x99,0x00,0x26,0x09,0x31,0x24,0x00,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0xff,0xf8,0x03,0xc5,0x02,0x57,0x04,0xef,0x00,0x07,0x09,0x32,0x00,0x24,0xfd,0x4f,\r\n0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x57,0x04,0xef,0x00,0x27,0x09,0x32,0x00,0x24,0xfd,0x4f,0x00,0x06,0x14,0x02,0x00,0x00,0xff,0xff,0x00,0x69,0x03,0xbb,0x01,0xe5,0x05,0x2e,0x00,0x07,0x09,0x33,0x00,0x24,0xfd,0x45,0xff,0xff,0xff,0xba,0xff,0xf2,0x02,0x4e,0x05,0x2e,0x00,0x27,0x09,0x33,0x00,0x24,0xfd,0x45,0x00,0x06,0x14,0x02,\r\n0x00,0x00,0x00,0x01,0xff,0xba,0xff,0xf2,0x02,0x4e,0x00,0x99,0x00,0x08,0x00,0x0e,0xbb,0x00,0x08,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x30,0x31,0x05,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x02,0x4e,0xfd,0xb2,0x23,0x23,0x23,0x23,0x02,0x4e,0x0e,0x34,0x20,0x20,0x33,0x00,0x01,0xff,0xe7,0x06,0x19,0x05,0x0f,0x07,0x5f,\r\n0x00,0x1a,0x00,0x16,0xbc,0x00,0x12,0x04,0xfb,0x00,0x07,0x00,0x19,0x04,0xfb,0xb1,0x0c,0x02,0x00,0x2f,0x33,0xed,0xdc,0xed,0x30,0x31,0x01,0x07,0x21,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x23,0x3e,0x03,0x33,0x32,0x1e,0x04,0x33,0x21,0x05,0x0f,0x5a,0xfd,0xf4,0x4a,0x7d,0x66,0x4d,0x19,0x10,0x27,0x2e,0x34,0x1d,0x79,0x28,0x57,\r\n0x5a,0x59,0x2a,0x18,0x39,0x3f,0x44,0x49,0x4c,0x27,0x02,0x3c,0x06,0xb6,0x9d,0x32,0x3d,0x32,0x08,0x1f,0x3c,0x34,0x55,0x78,0x4c,0x23,0x18,0x23,0x29,0x23,0x18,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0x76,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x09,0x7e,0x02,0xb6,0xfc,0x8d,\r\n0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x14,0x05,0x3e,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x83,0xfe,0xab,0x00,0x07,0x09,0x7e,0x00,0x72,0xfd,0x55,\r\n0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0x76,0x02,0x26,0x0e,0x6e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x09,0x7e,0x02,0xb6,0xfc,0x8d,0xff,0xff,0x00,0xc4,0xfd,0xe4,0x01,0x42,0xff,0x6c,0x00,0x07,0x09,0x73,0x00,0x00,0xf7,0x68,0xff,0xff,0x00,0x52,0xfd,0xc9,0x03,0x4a,0x03,0xba,0x02,0x26,0x09,0x15,\r\n0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xc9,0xfd,0xce,0xff,0xff,0x00,0x52,0xfd,0xc9,0x04,0x02,0x03,0xba,0x02,0x26,0x0e,0x2f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0xc9,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x09,0xf7,0x03,0x3c,0x02,0x26,0x09,0x1b,0x00,0x00,0x00,0x07,0x0f,0x54,0x06,0x46,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,\r\n0x07,0x4b,0x03,0x3c,0x02,0x26,0x08,0xd6,0x00,0x00,0x00,0x07,0x0f,0x54,0x03,0x9c,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x08,0x04,0x03,0x3c,0x02,0x26,0x0e,0x36,0x00,0x00,0x00,0x07,0x0f,0x54,0x03,0x9c,0xfd,0xce,0xff,0xff,0x00,0x9b,0xfd,0xc9,0x0a,0xb0,0x03,0x3c,0x02,0x26,0x0e,0x35,0x00,0x00,0x00,0x07,0x0f,0x54,0x06,0x46,\r\n0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0xb9,0x06,0x02,0x02,0x26,0x09,0x46,0x00,0x00,0x00,0x07,0x14,0x18,0x06,0xe0,0xff,0x38,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x5d,0x06,0x02,0x02,0x26,0x08,0xed,0x00,0x00,0x00,0x07,0x14,0x18,0x03,0x84,0xff,0x38,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x06,0x02,0x02,0x26,0x0e,0x56,\r\n0x00,0x00,0x00,0x07,0x14,0x18,0x03,0x84,0xff,0x38,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x06,0x02,0x02,0x26,0x0e,0xb1,0x00,0x00,0x00,0x07,0x14,0x18,0x06,0xe0,0xff,0x38,0x00,0x02,0x00,0xab,0xfe,0x0c,0x03,0x49,0x02,0xb7,0x00,0x15,0x00,0x29,0x00,0x18,0xb1,0x11,0x1d,0xbd,0x04,0xfb,0x00,0x0a,0x00,0x27,0x04,0xfb,0x00,0x00,\r\n0x05,0x03,0x00,0x3f,0xed,0x2f,0xed,0x2f,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x11,0x23,0x11,0x06,0x06,0x37,0x2e,0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xff,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x36,0x36,0x9c,0x2a,0x58,0x7e,0x01,\r\n0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x55,0xf0,0x92,0xfd,0xd5,0x02,0x09,0x11,0x12,0xc7,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0x00,0x02,0x00,0xab,0xfe,0x0c,0x04,0x02,0x02,0xb7,0x00,0x18,\r\n0x00,0x2c,0x00,0x23,0xb1,0x14,0x11,0x41,0x0a,0x04,0xfb,0x00,0x13,0x05,0x03,0x00,0x20,0x04,0xfb,0x00,0x0a,0x00,0x2a,0x04,0xfb,0x00,0x00,0x05,0x03,0x00,0x3f,0xed,0x2f,0xed,0x3f,0xed,0x2f,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x17,0x33,0x15,0x23,0x11,0x23,0x11,0x06,0x06,0x37,0x2e,\r\n0x05,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x01,0xff,0x42,0x7b,0x5e,0x39,0x30,0x55,0x74,0x44,0x48,0x77,0x36,0x2d,0x33,0x08,0xbd,0xb9,0x9c,0x2a,0x58,0x7e,0x01,0x10,0x1b,0x24,0x2d,0x32,0x1b,0x1d,0x37,0x2c,0x1b,0x22,0x39,0x4a,0x28,0x27,0x4e,0x0e,0x29,0x4f,0x72,0x4a,0x40,0x8d,0x77,0x4d,0x54,0x55,0x47,0xbc,\r\n0x72,0xa7,0xfe,0x1a,0x02,0x09,0x11,0x12,0xc7,0x19,0x45,0x4b,0x49,0x3b,0x24,0x26,0x3c,0x4c,0x26,0x25,0x3b,0x28,0x16,0x0d,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0xc3,0x05,0xca,0x02,0x26,0x09,0x17,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x07,0x0a,0x6e,0x00,0x9b,0xfd,0xee,0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,\r\n0x05,0xca,0x02,0x26,0x0b,0x0c,0x00,0x00,0x00,0x27,0x0f,0x50,0x00,0x9a,0x03,0x57,0x00,0x07,0x0a,0x6e,0x00,0x9b,0xfd,0xee,0x00,0x01,0x00,0x8c,0x06,0x56,0x01,0xc8,0x08,0x05,0x00,0x18,0x00,0x0c,0xb3,0x08,0x0e,0x00,0x18,0x00,0x2f,0xcd,0xdc,0xcd,0x30,0x31,0x13,0x3e,0x03,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x33,0x32,\r\n0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x8c,0x2a,0x49,0x35,0x1f,0x3e,0x2d,0x10,0x1d,0x0d,0x21,0x1f,0x37,0x52,0x36,0x1b,0x2d,0x53,0x75,0x47,0x06,0xa9,0x0a,0x17,0x23,0x33,0x26,0x29,0x2a,0x04,0x03,0x6d,0x06,0x1c,0x2e,0x3e,0x22,0x3e,0x57,0x3c,0x26,0x0e,0x00,0x00,0x01,0xfe,0x45,0x04,0x3a,0xff,0xd9,0x05,0xc0,0x00,0x03,0x00,0x0c,\r\n0xb3,0x03,0x02,0x01,0x00,0x00,0x2f,0x32,0xcd,0x32,0x30,0x31,0x01,0x35,0x01,0x15,0xfe,0x45,0x01,0x94,0x04,0x3a,0x85,0x01,0x01,0x8f,0xff,0xff,0x00,0x14,0xff,0xe8,0x02,0x2b,0x05,0x9a,0x02,0x06,0x00,0x2d,0x00,0x00,0xff,0xff,0x00,0xbc,0xfe,0x80,0x05,0xbb,0x05,0x9a,0x00,0x26,0x01,0xb5,0x00,0x00,0x00,0x07,0x0a,0xbd,0x03,0x5b,\r\n0x00,0x00,0xff,0xff,0x00,0xa6,0xfe,0x8a,0x04,0x91,0x04,0x00,0x00,0x26,0x02,0x16,0x00,0x00,0x00,0x07,0x0a,0xbe,0x02,0x44,0x00,0x00,0x00,0x01,0xff,0x98,0xfe,0x96,0x04,0xf2,0x05,0x9a,0x00,0x13,0x00,0x1d,0x40,0x0e,0x10,0x91,0x0b,0x0b,0x06,0x07,0x91,0x01,0x01,0x06,0x12,0x03,0x00,0x03,0x00,0x3f,0x32,0x3f,0x39,0x2f,0xed,0x11,\r\n0x33,0x2f,0xed,0x30,0x31,0x01,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x10,0x21,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x01,0x64,0x02,0xe6,0xa8,0xa8,0xfd,0x1a,0xfe,0xbc,0x4c,0x3c,0x36,0x44,0xaa,0x05,0x9a,0xfd,0x8b,0x02,0x75,0xfa,0x66,0x02,0x8e,0xfd,0x9d,0xfe,0x6b,0x1a,0x94,0x17,0x01,0x08,0x05,0x65,0x00,0x00,0x01,\r\n0xff,0x5c,0xfe,0x1e,0x03,0xf8,0x04,0x00,0x00,0x16,0x00,0x1f,0x40,0x0f,0x16,0x95,0x10,0x10,0x0e,0x14,0x0a,0x95,0x05,0x05,0x14,0x15,0x11,0x0e,0x0f,0x00,0x3f,0x33,0x3f,0x33,0x2f,0xed,0x11,0x12,0x39,0x2f,0xed,0x30,0x31,0x05,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x11,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x23,0x11,\r\n0x21,0x01,0x4a,0x31,0x5d,0x87,0x57,0x4b,0x37,0x3d,0x45,0xc8,0xa4,0x02,0x0a,0xa4,0xa4,0xfd,0xf6,0x04,0x73,0xb2,0x7a,0x3f,0x1a,0x99,0x27,0x01,0x3e,0x04,0x18,0xfe,0x5c,0x01,0xa4,0xfc,0x00,0x01,0xd1,0x00,0x00,0x02,0x00,0x0f,0xfe,0x7f,0x0a,0x06,0x05,0x9a,0x00,0x25,0x00,0x2e,0x00,0x32,0x40,0x1b,0x08,0x91,0x04,0x25,0x1e,0x03,\r\n0x1a,0x1a,0x07,0x23,0x1c,0x03,0x27,0x91,0x19,0x03,0x12,0x0a,0x26,0x91,0x10,0x0c,0x0e,0x12,0x01,0x07,0x12,0x00,0x3f,0x33,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0xed,0x30,0x31,0x21,0x23,0x01,0x26,0x27,0x23,0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x36,0x12,\r\n0x37,0x12,0x13,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x36,0x36,0x37,0x01,0x33,0x01,0x01,0x11,0x21,0x06,0x02,0x07,0x06,0x02,0x07,0x0a,0x06,0xea,0xfd,0xd6,0x1e,0x08,0x04,0xa8,0xfe,0x67,0xc1,0x9b,0xfb,0xfd,0x9b,0x6f,0x48,0x79,0x33,0x65,0x0d,0x02,0xa3,0x01,0x99,0xa8,0x04,0x07,0x13,0x0c,0x02,0x18,0xd1,0xfd,0x99,0xfc,0x6b,0xfe,\r\n0x94,0x08,0x36,0x30,0x30,0x67,0x3a,0x02,0x90,0x24,0x0e,0xfd,0x3e,0x02,0x8e,0xfe,0x0a,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x19,0x84,0x01,0x31,0xb1,0x01,0x61,0x01,0x3b,0xfd,0x8b,0x02,0x75,0xfd,0x5e,0x0b,0x18,0x0e,0x02,0x71,0xfd,0x50,0xfd,0xae,0x04,0x6a,0x7d,0xfe,0xe2,0xa7,0xa7,0xfe,0xee,0x6f,0x00,0x02,0x00,0x12,0xfe,0x8b,\r\n0x08,0x44,0x04,0x00,0x00,0x1d,0x00,0x22,0x00,0x32,0x40,0x1b,0x07,0x95,0x02,0x1d,0x19,0x03,0x15,0x15,0x05,0x1b,0x17,0x0f,0x1f,0x95,0x14,0x0f,0x10,0x08,0x1e,0x95,0x0e,0x0a,0x0c,0x15,0x01,0x05,0x15,0x00,0x3f,0x33,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x17,0x39,0xed,0x30,0x31,0x21,0x23,0x01,0x23,\r\n0x11,0x23,0x11,0x21,0x11,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x33,0x00,0x13,0x21,0x11,0x21,0x11,0x33,0x11,0x33,0x01,0x33,0x01,0x01,0x11,0x23,0x02,0x03,0x08,0x44,0xe6,0xfe,0x3c,0x04,0xa4,0xfe,0x99,0x98,0x8b,0xfd,0x06,0x8c,0x5b,0x01,0x05,0x05,0x02,0x14,0x01,0x67,0xa4,0x04,0x01,0xae,0xd7,0xfe,0x25,0xfc,0xa3,0xe3,0x1b,\r\n0xce,0x01,0xec,0xfe,0x14,0x01,0xd1,0xfe,0xba,0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0x01,0x79,0x01,0xfc,0xfe,0x5c,0x01,0xa4,0xfe,0x2b,0x01,0xd5,0xfe,0x12,0xfe,0x79,0x02,0xea,0xfe,0x62,0xfe,0xb4,0x00,0x00,0x03,0x00,0x0f,0xfe,0x7f,0x05,0x48,0x05,0x9a,0x00,0x13,0x00,0x1a,0x00,0x1f,0x00,0x29,0x40,0x14,0x09,0x14,0x91,0x11,\r\n0x1e,0x13,0x1b,0x1b,0x04,0x0e,0x13,0x03,0x08,0x00,0x18,0x91,0x06,0x02,0x04,0x12,0x00,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0xed,0x32,0x30,0x31,0x25,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x01,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x01,0x33,0x01,0x22,0x27,0x01,0x21,0x11,0x06,0x27,0x32,\r\n0x37,0x11,0x01,0x04,0x81,0xc7,0x9b,0xfb,0xfd,0x9b,0x01,0x40,0x53,0x56,0xa8,0x63,0x02,0x28,0xa8,0xfd,0xae,0x30,0x2b,0xfe,0xe2,0x03,0x23,0xe5,0xb0,0xb1,0xe4,0xfe,0x66,0x98,0xfd,0xe7,0x01,0x81,0xfe,0x7f,0x02,0x1a,0x01,0xa4,0x2d,0xa2,0x73,0x02,0x1b,0xfd,0xed,0x93,0x36,0x02,0xdc,0xfc,0x72,0x06,0xfe,0x86,0x01,0xed,0x79,0x94,\r\n0x6e,0x01,0xb1,0xfd,0xe1,0x00,0x00,0x03,0x00,0x12,0xfe,0x8b,0x04,0x23,0x04,0x00,0x00,0x12,0x00,0x19,0x00,0x1f,0x00,0x2b,0x40,0x15,0x09,0x13,0xec,0x18,0x10,0x1d,0x0d,0x1a,0x1a,0x04,0x11,0x0d,0x0f,0x08,0x01,0x16,0x95,0x06,0x02,0x04,0x15,0x00,0x3f,0xcd,0x32,0xed,0x32,0x32,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x33,0xed,\r\n0x32,0x30,0x31,0x25,0x33,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x37,0x26,0x35,0x11,0x33,0x11,0x14,0x17,0x01,0x33,0x01,0x22,0x27,0x07,0x21,0x11,0x06,0x27,0x32,0x37,0x11,0x01,0x16,0x03,0xdf,0x44,0x8b,0xfd,0x06,0x8c,0xe8,0x62,0xa4,0x30,0x01,0xd0,0xa3,0xfe,0x11,0x52,0x3f,0xb2,0x02,0x8f,0xb5,0x89,0x94,0xaa,0xfe,0x98,0x13,0x8b,\r\n0xfe,0x00,0x01,0x75,0xfe,0x8b,0x02,0x00,0xfe,0x59,0xc4,0x01,0x5a,0xfe,0xae,0x6f,0x39,0x01,0xfa,0xfd,0x3a,0x15,0xc4,0x01,0x11,0x62,0x93,0x56,0x01,0x3a,0xfe,0x73,0x03,0x00,0xff,0xff,0x00,0x10,0xfe,0x80,0x05,0x60,0x05,0x9a,0x00,0x26,0x01,0xf2,0x00,0x00,0x00,0x07,0x0a,0xbd,0x03,0x00,0x00,0x00,0xff,0xff,0x00,0x10,0xfe,0x8a,\r\n0x04,0x29,0x04,0x00,0x00,0x26,0x02,0x12,0x00,0x00,0x00,0x07,0x0a,0xbe,0x01,0xdc,0x00,0x00,0xff,0xff,0x00,0x5e,0xff,0xe8,0x0a,0x47,0x05,0xb2,0x02,0x06,0x12,0x8f,0x00,0x00,0xff,0xff,0x00,0x60,0xff,0xe8,0x07,0x98,0x04,0x18,0x02,0x06,0x12,0x90,0x00,0x00,0x00,0x05,0x00,0x5e,0xff,0xe8,0x05,0xaa,0x05,0xb2,0x00,0x13,0x00,0x1a,\r\n0x00,0x21,0x00,0x28,0x00,0x2f,0x00,0x22,0x40,0x11,0x15,0x2a,0x91,0x23,0x21,0x21,0x00,0x24,0x20,0x91,0x0a,0x03,0x14,0x2b,0x91,0x00,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x30,0x31,0x05,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x27,0x11,\r\n0x21,0x1e,0x03,0x01,0x2e,0x03,0x27,0x11,0x21,0x21,0x11,0x0e,0x03,0x01,0x21,0x11,0x3e,0x03,0x02,0xfe,0x98,0xf8,0xb0,0x60,0x61,0xb4,0x01,0x02,0xa1,0x94,0xf3,0xae,0x5f,0x61,0xb3,0xfc,0xdf,0xfe,0x57,0x09,0x45,0x6f,0x94,0x02,0x93,0x08,0x40,0x6b,0x92,0x5a,0xfd,0xbb,0x01,0xa9,0x59,0x93,0x6e,0x45,0x03,0xda,0xfe,0x61,0x5b,0x91,\r\n0x6a,0x40,0x18,0x6a,0xbf,0x01,0x0a,0xa1,0xac,0x01,0x18,0xc6,0x6c,0x6a,0xbf,0xfe,0xf6,0xa0,0xaf,0xfe,0xe7,0xc5,0x6a,0x9b,0x01,0xfa,0x6b,0xb0,0x82,0x51,0x02,0x89,0x6e,0xb2,0x82,0x4f,0x0c,0xfe,0x03,0x01,0xfc,0x0d,0x53,0x84,0xaf,0xfe,0xfc,0xfe,0x08,0x0d,0x50,0x80,0xaf,0x00,0x00,0x05,0x00,0x60,0xff,0xe8,0x04,0x50,0x04,0x18,\r\n0x00,0x13,0x00,0x17,0x00,0x1e,0x00,0x22,0x00,0x27,0x00,0x22,0x40,0x11,0x19,0x15,0x95,0x24,0x22,0x22,0x00,0x25,0x21,0x95,0x0a,0x0f,0x18,0x16,0x95,0x00,0x15,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x12,0x39,0x2f,0x33,0xed,0x32,0x30,0x31,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x13,0x21,\r\n0x11,0x36,0x05,0x11,0x21,0x1e,0x03,0x01,0x02,0x27,0x11,0x21,0x21,0x11,0x06,0x06,0x02,0x52,0x72,0xb8,0x82,0x46,0x49,0x88,0xc1,0x78,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0xdf,0xfe,0xfe,0xef,0xfe,0x7d,0xfe,0xfa,0x06,0x26,0x40,0x5c,0x01,0xd0,0x24,0xda,0xfe,0x6a,0x01,0x02,0x69,0x85,0x18,0x4c,0x8a,0xc1,0x75,0x81,0xcb,0x8d,0x4b,\r\n0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x01,0xe9,0xfe,0xa6,0x25,0x23,0x01,0x58,0x42,0x72,0x5a,0x3d,0x01,0xd6,0x01,0x0a,0x22,0xfe,0xd4,0x01,0x2a,0x15,0x98,0x00,0xff,0xff,0x00,0x0c,0x06,0x1f,0x02,0xe6,0x09,0x39,0x02,0x06,0x13,0x7b,0x00,0x00,0xff,0xff,0x00,0x5a,0x06,0x1f,0x02,0x57,0x09,0x39,0x02,0x06,0x13,0x7d,0x00,0x00,\r\n0x00,0x03,0x00,0x28,0xff,0xe8,0x04,0xca,0x05,0x88,0x00,0x4a,0x00,0x68,0x00,0x79,0x00,0x54,0x40,0x16,0x3a,0x37,0x99,0x40,0x32,0x27,0x2e,0x03,0x5a,0x4f,0x2b,0x00,0x4a,0x4a,0x2b,0x9a,0x55,0x55,0x22,0x9a,0x5e,0x07,0xb8,0x01,0x7f,0xb2,0x6f,0x6f,0x4b,0xb8,0x01,0x7f,0x40,0x0a,0x18,0x5e,0x18,0x5e,0x18,0x11,0x3b,0x40,0x19,0x75,\r\n0xb9,0x01,0x7d,0x00,0x11,0x00,0x2f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0xed,0x10,0xed,0x33,0x2f,0xed,0x32,0x2f,0x33,0x10,0xcd,0x32,0x17,0x39,0x10,0xed,0x32,0x30,0x31,0x13,0x3e,0x03,0x37,0x11,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,\r\n0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x07,0x1e,0x03,0x33,0x32,0x36,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x07,0x01,0x11,0x36,0x36,0x37,0x17,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x17,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x01,0x14,0x1e,0x02,\r\n0x33,0x33,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x7c,0x09,0x2b,0x3c,0x48,0x26,0x23,0x56,0x6b,0x3a,0x14,0x25,0x41,0x59,0x35,0x3e,0x56,0x36,0x18,0x01,0x6f,0x49,0x7f,0x5e,0x37,0x1a,0x3a,0x5d,0x43,0x12,0x26,0x25,0x20,0x0c,0x07,0x18,0x3b,0x26,0x20,0x3e,0x17,0x07,0x0e,0x28,0x19,0x07,0x27,0x3f,0x58,0x39,0x5b,0x8b,0x34,0x1c,\r\n0x47,0x4c,0x4d,0x22,0x5b,0x91,0x69,0x40,0x09,0x24,0x44,0x3c,0x30,0x0e,0x01,0x82,0x21,0x2e,0x07,0x3b,0x05,0x0f,0x1b,0x15,0x15,0x2a,0x22,0x15,0x3b,0x30,0x2b,0x10,0x26,0x22,0x17,0x24,0x3d,0x51,0x2e,0xfd,0x4e,0x0d,0x21,0x38,0x2c,0x0c,0x03,0x0e,0x1e,0x1b,0x17,0x20,0x14,0x09,0x01,0x97,0x01,0x09,0x0f,0x15,0x0e,0x01,0x9d,0x37,\r\n0x50,0x59,0x21,0x43,0x68,0x47,0x25,0x2c,0x46,0x56,0x2b,0x98,0x2a,0x4f,0x72,0x49,0x3e,0x78,0x5e,0x3b,0x06,0x11,0x1b,0x15,0x26,0x21,0x20,0x27,0x0b,0x14,0x0a,0x54,0x6c,0x40,0x19,0x35,0x30,0xb1,0x13,0x1c,0x13,0x09,0x2b,0x5d,0x92,0x67,0x08,0x0e,0x0a,0x07,0x02,0x02,0x30,0xfe,0xb3,0x17,0x37,0x20,0x11,0x14,0x2d,0x27,0x19,0x1c,\r\n0x2c,0x33,0x17,0x11,0x39,0x48,0x14,0x2d,0x46,0x32,0x2e,0x45,0x2e,0x17,0x01,0x1b,0x21,0x35,0x25,0x13,0x7a,0x1b,0x3a,0x30,0x1f,0x17,0x27,0x34,0x00,0x01,0xff,0x38,0x06,0x19,0x05,0x0f,0x06,0xc0,0x00,0x04,0x00,0x0c,0xba,0x00,0x02,0x04,0xfb,0x00,0x00,0x00,0x2f,0xed,0x30,0x31,0x01,0x21,0x35,0x21,0x15,0x04,0xb5,0xfa,0x83,0x05,\r\n0xd7,0x06,0x19,0xa7,0x0a,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x05,0x26,0x06,0x50,0x00,0x3b,0x00,0x2e,0x40,0x12,0x3a,0x31,0x00,0x30,0x17,0x0b,0x11,0x9a,0x36,0x15,0x06,0x0d,0x0d,0x23,0x36,0x07,0x26,0x21,0xb8,0x01,0x7f,0xb1,0x23,0x18,0x00,0x3f,0xed,0x32,0x3f,0x12,0x39,0x2f,0x33,0x33,0x10,0xed,0x32,0x32,0x39,0x39,0xcc,0x32,\r\n0x30,0x31,0x01,0x1e,0x03,0x17,0x23,0x2e,0x03,0x27,0x11,0x23,0x11,0x26,0x26,0x23,0x22,0x06,0x07,0x11,0x23,0x11,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x21,0x35,0x21,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x03,0x6d,0x67,0xa0,0x6f,0x3e,0x05,0xa5,0x05,0x23,0x42,0x65,\r\n0x45,0x72,0x0e,0x1e,0x0f,0x12,0x21,0x10,0x72,0x47,0x67,0x43,0x20,0x45,0x83,0xbd,0x78,0x01,0xd7,0xfb,0xb4,0x01,0x12,0x4a,0x78,0x54,0x2e,0x40,0x74,0xa4,0x63,0x72,0x11,0x23,0x12,0x0e,0x1c,0x0e,0x72,0x05,0x9c,0x1b,0x76,0xa6,0xcd,0x73,0x5c,0x9d,0x7d,0x59,0x18,0xfe,0x19,0x01,0xff,0x01,0x02,0x02,0x02,0xfe,0x02,0x01,0xe1,0x1d,\r\n0x69,0x8e,0xae,0x62,0x78,0xd9,0xa4,0x61,0x8c,0x8c,0x22,0x7c,0xa1,0xbb,0x62,0x7c,0xde,0xb3,0x81,0x20,0xba,0xa2,0x02,0x02,0x02,0x01,0xa1,0x00,0x00,0x03,0x00,0xbc,0xff,0x2f,0x03,0xea,0x06,0x50,0x00,0x28,0x00,0x33,0x00,0x3e,0x00,0x38,0x40,0x0b,0x12,0x2a,0x99,0x35,0x35,0x27,0x26,0x06,0x00,0x00,0x34,0xb8,0x01,0x80,0xb7,0x08,\r\n0x02,0x27,0x06,0x1d,0x24,0x24,0x2b,0xb8,0x01,0x80,0xb3,0x22,0x1b,0x26,0x18,0x00,0x3f,0x33,0x33,0xed,0x33,0x2f,0x33,0x3f,0x33,0x33,0xed,0x33,0x2f,0x33,0x11,0x12,0x39,0x2f,0xed,0x39,0x30,0x31,0x01,0x33,0x15,0x33,0x32,0x17,0x35,0x33,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x06,0x07,0x15,0x23,0x35,\r\n0x06,0x22,0x23,0x23,0x15,0x23,0x35,0x23,0x11,0x33,0x13,0x23,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x27,0x03,0x11,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x01,0x7f,0x68,0x0f,0x23,0x24,0x68,0x3a,0x62,0x48,0x29,0x24,0x42,0x5b,0x37,0x48,0x71,0x4e,0x29,0xa9,0x9c,0x68,0x11,0x22,0x12,0x11,0x68,0xc3,0xc3,0x77,0x92,0x94,0x48,0x77,\r\n0x54,0x2f,0xdc,0xfa,0x92,0x81,0x8b,0x17,0x3c,0x68,0x51,0x06,0x50,0xb6,0x03,0xb9,0xc7,0x0c,0x30,0x4b,0x69,0x47,0x3d,0x6c,0x58,0x41,0x12,0x04,0x09,0x3c,0x5c,0x78,0x45,0xac,0xc2,0x1f,0xe0,0xd3,0x02,0xd1,0xd1,0x05,0x9a,0xfd,0x02,0xfd,0xfc,0x1a,0x3d,0x64,0x4b,0xd9,0x1f,0x02,0x6c,0xfe,0x31,0x82,0x7c,0x2b,0x4c,0x39,0x21,0x00,\r\n0x00,0x01,0x00,0x66,0xfe,0xef,0x02,0x50,0x02,0x19,0x00,0x13,0x00,0x12,0xb6,0x04,0x11,0x11,0x0b,0x0c,0x01,0x0b,0x00,0x2f,0x33,0x2f,0x12,0x39,0x2f,0x33,0x30,0x31,0x01,0x23,0x11,0x34,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x11,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,\r\n0xb4,0xfe,0xef,0x01,0x33,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x03,0x2a,0xfe,0xa4,0x67,0xe7,0xff,0xff,0x00,0x66,0xfe,0xef,0x02,0x56,0x02,0x19,0x02,0x07,0x07,0xb1,0x00,0x00,0xfc,0x55,0x00,0x01,0x00,0x66,0xfe,0xef,0x00,0xe6,0x02,0x19,0x00,0x03,0x00,0x08,0xb1,0x03,0x00,0x00,0x2f,0x2f,0x30,0x31,0x13,0x23,0x11,0x33,0xe6,0x80,\r\n0x80,0xfe,0xef,0x03,0x2a,0x00,0xff,0xff,0x00,0x66,0xfe,0xef,0x03,0x9a,0x01,0x24,0x02,0x07,0x07,0xb2,0x00,0x00,0xfc,0x55,0x00,0x01,0x00,0x66,0xfe,0xef,0x02,0x50,0x01,0x24,0x00,0x13,0x00,0x14,0xb7,0x04,0x11,0x11,0x0e,0x0b,0x0c,0x01,0x0b,0x00,0x2f,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x11,0x34,0x23,0x22,\r\n0x0e,0x02,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x33,0x32,0x15,0x02,0x50,0x7f,0x6d,0x1d,0x2e,0x21,0x12,0x80,0x80,0x02,0x3a,0x7a,0xb4,0xfe,0xef,0x01,0x33,0x97,0x16,0x28,0x36,0x1f,0xfe,0xc9,0x02,0x24,0x56,0x67,0xe7,0x00,0xff,0xff,0x00,0x66,0xfd,0xf9,0x02,0x89,0x01,0x24,0x02,0x07,0x07,0xb8,0x00,0x00,0xfc,0x55,0x00,0x01,\r\n0x00,0x3c,0xfe,0xdc,0x01,0xcd,0x01,0x26,0x00,0x2e,0x00,0x12,0xb6,0x06,0x1f,0x15,0x03,0x2c,0x1c,0x15,0x00,0x2f,0x33,0x2f,0x33,0x12,0x39,0x39,0x30,0x31,0x17,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x15,\r\n0x14,0x0e,0x02,0x23,0x22,0x27,0x3c,0x28,0x59,0x2f,0x33,0x32,0x10,0x1d,0x27,0x16,0x2c,0x40,0x2a,0x14,0x22,0x3b,0x51,0x30,0x2a,0x4e,0x20,0x23,0x4d,0x2d,0x2a,0x34,0x39,0x33,0x27,0x3f,0x2c,0x17,0x27,0x42,0x55,0x2e,0x60,0x45,0x96,0x16,0x15,0x1d,0x21,0x13,0x1a,0x14,0x10,0x09,0x10,0x21,0x27,0x30,0x21,0x28,0x3e,0x2a,0x16,0x0f,\r\n0x0e,0x6d,0x0f,0x14,0x1a,0x1d,0x20,0x26,0x13,0x0f,0x1f,0x28,0x32,0x21,0x2b,0x40,0x2a,0x15,0x25,0x00,0xff,0xff,0x00,0x0a,0xfe,0xe3,0x01,0x68,0x01,0xb7,0x02,0x07,0x07,0xb9,0x00,0x00,0xfc,0x55,0x00,0x03,0x00,0x1e,0x04,0xdb,0x03,0x93,0x0a,0x63,0x00,0x1d,0x00,0x26,0x00,0x31,0x00,0x27,0x40,0x11,0x1f,0x1d,0x1d,0x27,0x04,0x1e,\r\n0x13,0x13,0x28,0x0e,0x04,0x0e,0x04,0x0e,0x02,0x10,0x02,0x00,0x2f,0x2f,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x33,0x2f,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x11,0x23,0x11,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x11,0x33,0x11,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x03,0x11,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x02,0x14,0x77,0x12,0x52,0x87,0x60,0x34,0x36,0x61,0x88,0x53,0x0d,0x77,0x0a,0x54,0x8a,0x62,0x35,0x34,0x5f,0x86,0x52,0x14,0x0a,0x73,0x7f,0x7c,0x71,0x86,0x0d,0x70,0x7f,0x20,0x3e,0x5a,0x3b,0x06,0x29,0xfe,0xb2,0x01,0x4e,0x38,0x65,0x8d,0x55,0x5a,0x93,0x69,0x3a,0x01,\r\n0x2b,0xfe,0xd5,0x3a,0x69,0x93,0x5a,0x54,0x8d,0x66,0x38,0x02,0xa4,0xfd,0xc6,0x95,0x84,0x89,0x98,0xfd,0xc6,0x02,0x3a,0x97,0x8a,0x41,0x67,0x4a,0x27,0x00,0x00,0x01,0x00,0x6e,0xff,0x35,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x0e,0xb4,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x25,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0x9d,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0x00,0x02,0x00,0x6e,0xfe,0x48,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x19,0x00,0x14,\r\n0xb7,0x16,0x19,0x19,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x25,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x21,0x35,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,\r\n0xfe,0x0a,0x01,0xf6,0x9d,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0xfd,0x36,0x75,0x00,0x00,0x01,0x00,0x6e,0x05,0x32,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x0e,0xb4,0x07,0x09,0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,\r\n0x35,0x34,0x3e,0x02,0x33,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0x06,0x9a,0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0x00,0x00,0x02,0x00,0x6e,0x04,0x45,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x16,0x19,0x19,0x07,0x09,\r\n0x09,0x00,0x14,0x00,0x2f,0x33,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x21,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x21,0x11,0x21,0x35,0x21,0x02,0x7f,0xf3,0x4c,0x4c,0x50,0x48,0xf3,0xfe,0xf8,0x3d,0x62,0x45,0x25,0x23,0x42,0x60,0x3c,0x01,0x10,0xfe,0x0a,0x01,0xf6,0x06,0x9a,\r\n0x3c,0x40,0x3f,0x36,0x77,0x20,0x3d,0x58,0x37,0x37,0x59,0x3f,0x22,0xfd,0x36,0x75,0x00,0x01,0x00,0x6e,0x05,0x32,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x0e,0xb4,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,\r\n0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x07,0x0f,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0x00,0x02,0x00,0x6e,0x04,0x45,0x02,0x7f,0x07,0x0f,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x19,0x16,0x16,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,\r\n0x33,0x33,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x21,0x15,0x21,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0xf6,0xfe,0x0a,0x07,0x0f,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,\r\n0x36,0x3f,0x40,0x3c,0xfe,0x20,0x75,0x00,0x00,0x01,0x00,0x6e,0xff,0x35,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x0e,0xb4,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,\r\n0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0x12,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0x00,0x02,0x00,0x6e,0xfe,0x48,0x02,0x7f,0x01,0x12,0x00,0x15,0x00,0x19,0x00,0x14,0xb7,0x19,0x16,0x16,0x0d,0x0c,0x0c,0x14,0x00,0x00,0x2f,0x32,0x32,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x13,0x21,\r\n0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x21,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x21,0x15,0x21,0x6e,0x01,0x10,0x3c,0x60,0x42,0x23,0x25,0x45,0x62,0x3d,0xfe,0xf8,0xf3,0x48,0x50,0x4c,0x4c,0xf3,0x01,0xf6,0xfe,0x0a,0x01,0x12,0x22,0x3f,0x59,0x37,0x37,0x58,0x3d,0x20,0x77,0x36,0x3f,0x40,0x3c,0xfe,0x20,0x75,0x00,\r\n0xff,0xff,0x00,0x70,0x01,0xfe,0x01,0x50,0x02,0xdf,0x02,0x02,0x00,0xc3,0x00,0x00,0x00,0x01,0x00,0x29,0x00,0x00,0x04,0x0c,0x05,0x9a,0x00,0x0b,0x00,0x15,0x40,0x0a,0x09,0x04,0x91,0x06,0x03,0x0a,0x03,0x91,0x01,0x12,0x00,0x3f,0xed,0x32,0x3f,0xed,0x32,0x30,0x31,0x21,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x04,\r\n0x0c,0xfc,0x1d,0x01,0x9d,0xfe,0x63,0x03,0xe3,0xfe,0x62,0x01,0x9e,0x98,0x04,0x6a,0x98,0x98,0xfb,0x96,0x00,0x02,0x00,0x20,0xff,0xde,0x02,0xd9,0x05,0xa4,0x00,0x1d,0x00,0x29,0x00,0x2a,0x40,0x19,0x07,0x21,0x00,0x16,0x04,0xb9,0x24,0xc9,0x24,0x02,0x24,0x14,0x14,0x0a,0x19,0x03,0xb6,0x1e,0xc6,0x1e,0x02,0x1e,0x04,0x0a,0x12,0x00,\r\n0x3f,0x33,0x33,0x5d,0x3f,0x12,0x39,0x2f,0x33,0x5d,0x17,0x39,0x30,0x31,0x25,0x16,0x16,0x17,0x07,0x26,0x26,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x17,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x05,0x32,0x36,0x37,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x83,0x1c,0x2d,0x0d,0x91,0x09,0x18,0x0d,0x38,\r\n0x86,0x4a,0x35,0x59,0x40,0x24,0x29,0x46,0x5f,0x35,0x77,0x66,0x12,0xa8,0x17,0xfe,0x7c,0x2c,0x4d,0x20,0x22,0x47,0x28,0x33,0x33,0x36,0xd6,0x29,0x63,0x37,0x35,0x1b,0x3d,0x17,0x33,0x29,0x1d,0x36,0x4d,0x30,0x32,0x50,0x37,0x1d,0x43,0x4e,0x6d,0x03,0x95,0xfc,0x68,0x52,0x9e,0x91,0x1b,0x20,0x1b,0x1d,0x20,0x19,0x1e,0x1c,0xff,0xff,\r\n0x00,0x1a,0x00,0x00,0x04,0x9a,0x05,0x9a,0x02,0x02,0x00,0x3b,0x00,0x00,0x00,0x03,0x00,0xbc,0xfe,0x29,0x04,0x2f,0x05,0x9a,0x00,0x19,0x00,0x21,0x00,0x2b,0x00,0x22,0x40,0x11,0x0b,0x1a,0x91,0x23,0x23,0x00,0x1b,0x91,0x17,0x19,0x19,0x17,0x12,0x22,0x91,0x00,0x03,0x00,0x3f,0xed,0x3f,0x33,0x2f,0x10,0xed,0x12,0x39,0x2f,0xed,0x39,\r\n0x30,0x31,0x13,0x21,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x23,0x11,0x23,0x13,0x11,0x33,0x32,0x36,0x35,0x34,0x21,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x21,0xbc,0x01,0x98,0x5d,0x95,0x69,0x39,0x22,0x40,0x5c,0x3a,0x48,0x75,0x54,0x2e,0x47,0x7c,0xab,0x63,0xfa,0xa8,0xa8,0xe4,0x95,\r\n0xa2,0xfe,0xa6,0xc1,0xac,0x45,0x6e,0x4c,0x29,0xfe,0xed,0x05,0x9a,0x30,0x57,0x78,0x49,0x3d,0x6b,0x58,0x41,0x13,0x04,0x08,0x38,0x5a,0x7a,0x4a,0x5c,0x98,0x6c,0x3c,0xfe,0x29,0x04,0x73,0xfd,0xfc,0x8b,0x7b,0xfe,0x02,0x66,0xfe,0x31,0x22,0x41,0x5f,0x3c,0xd1,0xff,0xff,0x00,0xa7,0xfe,0x1f,0x04,0x15,0x05,0xfc,0x02,0x02,0x01,0xc4,\r\n0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x07,0x58,0x05,0x9a,0x00,0x44,0x00,0x20,0x40,0x10,0x38,0x91,0x21,0x12,0x1c,0x17,0x3f,0x3f,0x0a,0x00,0x91,0x17,0x12,0x2e,0x0a,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x3f,0xed,0x30,0x31,0x25,0x32,0x12,0x11,0x34,0x2e,0x04,0x27,0x33,0x1e,0x05,0x15,0x14,0x02,0x06,0x06,\r\n0x23,0x22,0x2e,0x02,0x27,0x0e,0x03,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x3e,0x04,0x37,0x33,0x0e,0x05,0x15,0x10,0x12,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x05,0x5d,0xa0,0xab,0x18,0x28,0x35,0x3a,0x3b,0x1b,0xb5,0x18,0x38,0x39,0x35,0x29,0x19,0x46,0x85,0xc0,0x79,0x4a,0x72,0x5a,0x47,0x1e,0x1f,0x47,0x5a,0x72,\r\n0x49,0x7a,0xbf,0x85,0x46,0x19,0x29,0x35,0x39,0x38,0x18,0xb5,0x1b,0x3b,0x3a,0x35,0x28,0x18,0xaa,0xa1,0x5c,0x76,0x44,0x1a,0xa8,0x18,0x42,0x77,0x7f,0x01,0x0a,0x01,0x15,0x45,0x96,0x96,0x8f,0x7b,0x63,0x1e,0x1c,0x58,0x73,0x88,0x98,0xa4,0x54,0xa7,0xfe,0xff,0xb0,0x5b,0x16,0x2b,0x3f,0x29,0x29,0x3f,0x2b,0x16,0x5b,0xb0,0x01,0x01,\r\n0xa7,0x54,0xa4,0x98,0x88,0x73,0x58,0x1c,0x1e,0x63,0x7b,0x8f,0x96,0x96,0x45,0xfe,0xeb,0xfe,0xf6,0x32,0x62,0x93,0x62,0x01,0xc7,0xfe,0x4d,0x66,0x9b,0x68,0x34,0x00,0xff,0xff,0x00,0x77,0xff,0xea,0x06,0x00,0x04,0x01,0x02,0x02,0x01,0xd5,0x00,0x01,0x00,0x02,0x00,0xa6,0x00,0x00,0x06,0x14,0x04,0x00,0x00,0x11,0x00,0x18,0x00,0x1e,\r\n0x40,0x0f,0x12,0x95,0x04,0x04,0x00,0x11,0x95,0x02,0x0f,0x13,0x95,0x0f,0x0f,0x00,0x15,0x00,0x3f,0x32,0x2f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x30,0x31,0x21,0x23,0x11,0x21,0x11,0x21,0x32,0x1e,0x02,0x15,0x14,0x07,0x06,0x23,0x21,0x11,0x21,0x01,0x11,0x33,0x32,0x35,0x34,0x23,0x01,0x4a,0xa4,0x03,0x04,0x01,0x14,0x51,0x7f,0x58,\r\n0x2e,0x5c,0x5c,0x8f,0xfe,0x39,0xfe,0x44,0x02,0x60,0xf6,0xcc,0xce,0x04,0x00,0xfe,0x6a,0x28,0x4e,0x71,0x49,0x93,0x54,0x53,0x03,0x74,0xfe,0x69,0xfe,0xaf,0xae,0xa3,0x00,0x02,0x00,0xa6,0xff,0xe8,0x05,0xfe,0x04,0x18,0x00,0x1f,0x00,0x28,0x00,0x27,0x40,0x15,0x23,0x95,0x1a,0x0f,0x01,0x95,0x28,0x28,0x0f,0x95,0x14,0x14,0x11,0x12,\r\n0x0f,0x11,0x15,0x04,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x12,0x39,0x2f,0xed,0x33,0x2f,0xed,0x3f,0xed,0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x27,0x21,0x11,0x23,0x11,0x33,0x11,0x21,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x05,0xfe,0xfd,0x2d,0x04,\r\n0xaf,0x9b,0xac,0x92,0x88,0xdd,0x68,0xa8,0x78,0x44,0x04,0xfe,0xc8,0xa4,0xa4,0x01,0x3e,0x0f,0x52,0x7b,0x9c,0x59,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x42,0x7f,0xb8,0x76,0xfe,0x29,0x04,0x00,0xfe,0x62,0x62,0xa2,0x73,0x3f,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,\r\n0x4f,0x6f,0x42,0x00,0x00,0x02,0x00,0x60,0xff,0xe8,0x06,0x37,0x04,0x18,0x00,0x2e,0x00,0x37,0x00,0x2e,0x40,0x19,0x32,0x95,0x29,0x0f,0x01,0x95,0x0c,0x0f,0x26,0x23,0x37,0x37,0x0f,0x1e,0x95,0x23,0x0f,0x14,0x95,0x0f,0x15,0x04,0x95,0x09,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x12,0x39,0x12,0x39,0xed,0x3f,0xed,\r\n0x30,0x31,0x01,0x21,0x16,0x16,0x33,0x32,0x37,0x15,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x07,0x35,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x07,0x06,0x37,0xfd,0x2d,0x04,0xaf,0x9b,0xac,0x92,0x88,\r\n0xdd,0x88,0xc8,0x3a,0x45,0xdd,0x91,0x85,0x69,0x73,0x81,0x4e,0x84,0x5f,0x35,0x31,0x5b,0x81,0x4f,0x85,0x77,0x77,0xa1,0x89,0xd0,0x3f,0x40,0xc7,0x79,0x65,0x9d,0x6b,0x38,0xa8,0x01,0x86,0x79,0x3a,0x64,0x4e,0x33,0x0a,0x01,0xd7,0xac,0xb9,0x72,0x9a,0x62,0x6d,0x69,0x66,0x70,0x32,0xa8,0x50,0x3b,0x6c,0x96,0x5b,0x5a,0x8f,0x65,0x36,\r\n0x59,0x9c,0x47,0x73,0x65,0x66,0x72,0x43,0x7f,0xb6,0x73,0x35,0x8f,0x9d,0x2c,0x4f,0x6f,0x42,0x00,0x02,0x00,0x90,0xff,0xe8,0x07,0x2a,0x04,0x18,0x00,0x23,0x00,0x33,0x00,0x22,0x40,0x12,0x24,0x95,0x1a,0x0f,0x17,0x03,0x08,0x15,0x0b,0x0f,0x0f,0x95,0x08,0x15,0x2e,0x95,0x00,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x39,\r\n0x3f,0xed,0x30,0x31,0x05,0x22,0x26,0x27,0x0e,0x03,0x23,0x20,0x11,0x11,0x33,0x11,0x10,0x21,0x32,0x3e,0x02,0x35,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x2c,0x81,0xc6,0x40,0x17,0x3d,0x58,0x77,0x4f,0xfe,0x5d,0xa3,0x01,0x00,\r\n0x48,0x66,0x40,0x1d,0xa4,0x42,0xb2,0x6e,0x73,0xb4,0x7d,0x42,0x48,0x84,0xbd,0x69,0x4e,0x7f,0x59,0x30,0x30,0x5a,0x7e,0x4e,0xa0,0xaa,0xaa,0x18,0x5e,0x57,0x23,0x41,0x33,0x1e,0x01,0xb4,0x02,0x64,0xfd,0xb6,0xfe,0xbc,0x2f,0x55,0x75,0x47,0x02,0x4e,0x62,0x3c,0x3e,0x49,0x8a,0xc5,0x7c,0x79,0xc7,0x8e,0x4e,0x03,0xa6,0x37,0x69,0x96,\r\n0x5e,0x5a,0x91,0x66,0x37,0xcd,0xbf,0xc1,0xcf,0x00,0x00,0x01,0x00,0x35,0xff,0xea,0x04,0xce,0x06,0x02,0x00,0x26,0x00,0x26,0x40,0x14,0x1c,0x0b,0x16,0x95,0x11,0x00,0x20,0x06,0x09,0x95,0x1d,0x19,0x0b,0x0f,0x07,0x15,0x24,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0x3f,0x33,0x33,0xed,0x32,0x32,0x3f,0xed,0x12,0x39,0x30,0x31,0x25,0x06,\r\n0x23,0x20,0x11,0x11,0x21,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x37,0x36,0x33,0x32,0x17,0x15,0x26,0x23,0x22,0x15,0x15,0x21,0x35,0x37,0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x04,0xce,0x3b,0x5e,0xfe,0xf3,0xfe,0x5f,0xa3,0xaf,0xaf,0x5d,0x5d,0x8b,0x4b,0x2c,0x30,0x3d,0xac,0x01,0xa1,0xa4,0x01,0x02,0xfe,0xfe,0x46,\r\n0x51,0x3f,0x2c,0x0a,0x20,0x01,0x2c,0x02,0x5e,0xfc,0x8c,0x03,0x74,0x8c,0xa6,0xa1,0x5d,0x5e,0x12,0x94,0x1b,0xd9,0x9e,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x00,0x01,0x00,0x68,0xff,0xe8,0x05,0x47,0x05,0x2f,0x00,0x3d,0x00,0x25,0x40,0x14,0x37,0x95,0x34,0x0f,0x0b,0x21,0x1a,0x33,0x05,0x95,0x31,0x0f,0x1f,0x95,\r\n0x1a,0x15,0x3b,0x95,0x02,0x15,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x33,0x12,0x39,0x39,0x3f,0xed,0x30,0x31,0x25,0x06,0x23,0x20,0x11,0x11,0x21,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x27,0x35,0x16,0x33,0x32,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x21,0x35,0x37,\r\n0x11,0x21,0x15,0x21,0x11,0x14,0x16,0x33,0x32,0x37,0x05,0x47,0x3b,0x5e,0xfe,0xf3,0xfe,0x3b,0x2e,0x4a,0x35,0x1d,0x1d,0x38,0x50,0x33,0x44,0x6c,0x4c,0x29,0x43,0x70,0x93,0x4f,0x9f,0x73,0x85,0xa2,0xd8,0x25,0x3f,0x55,0x31,0x44,0x67,0x45,0x23,0x3d,0x63,0x7e,0x40,0x01,0xd9,0xa4,0x01,0x02,0xfe,0xfe,0x46,0x51,0x3f,0x2c,0x0a,0x20,\r\n0x01,0x2c,0x02,0x5e,0x0d,0x1c,0x2d,0x20,0x28,0x36,0x2a,0x22,0x14,0x1a,0x37,0x45,0x5b,0x3d,0x4c,0x70,0x4a,0x24,0x3d,0xb0,0x63,0x90,0x27,0x38,0x2d,0x25,0x13,0x1b,0x37,0x45,0x58,0x3b,0x48,0x67,0x42,0x1f,0xfa,0x35,0xfe,0xd1,0x8c,0xfd,0xbf,0x67,0x58,0x22,0x00,0x01,0x00,0x50,0x00,0x00,0x04,0xad,0x04,0xda,0x00,0x0b,0x00,0x0b,\r\n0xb3,0x05,0x06,0x00,0x18,0x00,0x3f,0x2f,0x39,0x30,0x31,0x21,0x26,0x02,0x27,0x00,0x25,0x37,0x04,0x13,0x16,0x12,0x17,0x04,0x74,0x58,0xde,0x8d,0xfe,0xeb,0xfe,0xb4,0xe6,0x01,0x1d,0xe7,0x75,0xb8,0x46,0xcd,0x01,0x5b,0x97,0x01,0x2a,0x85,0x6c,0xd4,0xfe,0xbe,0xa3,0xfe,0xa0,0xc1,0x00,0x01,0x00,0x50,0xff,0xfa,0x02,0xd5,0x04,0xdd,\r\n0x00,0x42,0x00,0x26,0x40,0x11,0x2a,0x29,0x29,0x10,0x11,0x36,0x3e,0x11,0x3e,0x11,0x3e,0x05,0x18,0x20,0x33,0x05,0x18,0x00,0x3f,0x33,0x2f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x11,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x23,0x35,0x21,0x36,0x36,0x35,0x34,0x26,0x23,\r\n0x22,0x07,0x26,0x26,0x35,0x34,0x36,0x37,0x36,0x1e,0x02,0x15,0x14,0x06,0x15,0x33,0x15,0x23,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x02,0xd5,0x2d,0x51,0x70,0x43,0x17,0x4c,0x4b,0x36,0x1b,0x28,0x30,0x14,0xf7,0x01,0x0e,0x09,0x0d,0x4a,0x40,0x1d,0x27,0x08,0x11,0x0d,0x10,\r\n0x47,0x69,0x45,0x21,0x04,0xe1,0xf3,0x2b,0x39,0x21,0x0d,0x39,0x42,0x3c,0x57,0x1d,0x27,0x20,0x11,0x1b,0x22,0x12,0x1d,0x2d,0x1f,0x10,0x01,0x02,0x2f,0x5e,0x4c,0x2f,0x26,0x46,0x62,0x3c,0x36,0x7a,0x80,0x82,0x3e,0x4e,0x11,0x39,0x28,0x4e,0x55,0x0b,0x08,0x1f,0x1a,0x11,0x26,0x17,0x02,0x3b,0x5e,0x72,0x36,0x17,0x2e,0x15,0x4e,0x7a,\r\n0x9f,0x6a,0x44,0x1d,0x5d,0x65,0x47,0x36,0x12,0x31,0x19,0x13,0x25,0x1b,0x11,0x19,0x27,0x31,0x00,0x03,0x00,0x3c,0xfd,0xec,0x06,0xe7,0x05,0x65,0x00,0x3b,0x00,0x4f,0x00,0x63,0x00,0x43,0x40,0x0e,0x2e,0x15,0x9b,0x18,0x55,0x9b,0x4b,0x18,0x4b,0x18,0x4b,0x06,0x21,0x1f,0xb8,0x01,0x80,0x40,0x0c,0x27,0x5f,0x9b,0x41,0x41,0x06,0x39,\r\n0x99,0x02,0x02,0x35,0x0b,0xb8,0x01,0x80,0xb2,0x09,0x06,0x18,0x00,0x3f,0x33,0xed,0x33,0x33,0x2f,0xed,0x11,0x33,0x2f,0xed,0x2f,0xed,0x33,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x30,0x31,0x01,0x06,0x23,0x22,0x27,0x26,0x27,0x26,0x27,0x37,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x20,0x35,\r\n0x34,0x2e,0x02,0x23,0x22,0x07,0x27,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x16,0x15,0x14,0x0e,0x02,0x07,0x16,0x17,0x16,0x33,0x32,0x37,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x07,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x03,0xcf,0x67,0x59,\r\n0xb2,0x7f,0x56,0x2f,0xbf,0x5e,0x8c,0x50,0xa6,0x34,0x5a,0x43,0x26,0x2d,0x51,0x70,0x43,0x8b,0x8b,0x01,0x35,0x27,0x44,0x5c,0x34,0x9c,0x5d,0x89,0x18,0x4f,0x65,0x76,0x40,0x59,0x96,0x6c,0x3c,0xa6,0xa3,0x33,0x5c,0x7f,0x4b,0x0c,0x4f,0x63,0x61,0x42,0x2c,0x03,0x61,0x3f,0x6c,0x8f,0x51,0x50,0x8f,0x6c,0x3f,0x3f,0x6c,0x8f,0x50,0x50,\r\n0x90,0x6c,0x3f,0xa1,0x25,0x40,0x55,0x30,0x30,0x55,0x40,0x25,0x25,0x40,0x55,0x30,0x30,0x55,0x40,0x25,0xfe,0x20,0x34,0xcd,0x8a,0xc5,0x1f,0xa4,0x4d,0x77,0x1e,0x38,0x4c,0x2f,0x38,0x5b,0x40,0x22,0xa0,0xdc,0x31,0x53,0x3d,0x23,0x77,0x50,0x2d,0x49,0x33,0x1c,0x38,0x66,0x8e,0x56,0xc3,0x6a,0x63,0xe1,0x4a,0x7f,0x60,0x3d,0x09,0x60,\r\n0x81,0xa5,0x26,0x02,0xdb,0x50,0x8f,0x6c,0x3f,0x3f,0x6c,0x8f,0x50,0x51,0x90,0x6c,0x3f,0x3f,0x6c,0x90,0x51,0x30,0x55,0x41,0x25,0x25,0x41,0x55,0x30,0x30,0x55,0x40,0x25,0x25,0x40,0x55,0x00,0x02,0x00,0x54,0xfe,0x9b,0x08,0x76,0x08,0xe0,0x00,0x72,0x00,0x82,0x00,0x53,0xb9,0x00,0x39,0x01,0x81,0xb4,0x4b,0x4b,0x43,0x48,0x42,0xb8,\r\n0x01,0x81,0x40,0x18,0x45,0x11,0x63,0x79,0x23,0x04,0x16,0x7e,0x1e,0x1e,0x01,0x76,0x16,0x16,0x69,0x71,0x01,0x01,0x45,0x45,0x43,0x0c,0x69,0x2d,0xb8,0x01,0x81,0xb4,0x55,0x55,0x40,0x43,0x18,0x00,0x3f,0x33,0x33,0x2f,0xed,0x2f,0x33,0x12,0x39,0x2f,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x11,0x33,0x2f,0x33,0x12,0x17,0x39,0x10,0xed,\r\n0x32,0x12,0x39,0x2f,0xed,0x30,0x31,0x01,0x21,0x35,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x07,0x3e,0x03,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x0e,0x02,0x02,0x15,0x14,0x12,0x04,0x04,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x21,0x11,0x23,0x11,0x21,\r\n0x15,0x23,0x11,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x06,0x04,0x23,0x22,0x24,0x24,0x26,0x26,0x02,0x35,0x34,0x3e,0x04,0x37,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x21,0x25,0x34,0x26,0x23,0x22,0x06,0x07,0x1e,0x03,0x33,0x32,0x3e,0x02,0x06,0xe5,0xfe,0x0b,0x1d,0x2f,0x20,0x11,0x28,0x4b,0x6b,0x42,0x3a,\r\n0x60,0x47,0x2a,0x04,0x08,0x1a,0x20,0x20,0x0e,0x76,0x82,0x23,0x3f,0x56,0x34,0x38,0x56,0x40,0x2a,0x0d,0x46,0x93,0x78,0x4c,0x90,0x01,0x05,0x01,0x6d,0xde,0x5f,0xaf,0x96,0x7b,0x57,0x30,0x18,0x2d,0x40,0x29,0x1d,0x36,0x29,0x19,0xd8,0xfe,0xd7,0xd8,0x03,0xcd,0xf4,0x40,0x7f,0x50,0x81,0x5a,0x31,0x66,0xd9,0xfe,0xad,0xec,0xb2,0xfe,\r\n0xc6,0xfe,0xf8,0xd2,0x91,0x4d,0x30,0x54,0x71,0x82,0x8d,0x45,0x44,0x75,0x9d,0x58,0x60,0xa4,0x77,0x44,0x23,0x23,0x01,0x21,0xfd,0x25,0x2b,0x2e,0x26,0x3b,0x11,0x02,0x16,0x22,0x2a,0x17,0x10,0x1d,0x16,0x0d,0x05,0xa8,0x7f,0x12,0x39,0x44,0x47,0x20,0x48,0x75,0x53,0x2e,0x29,0x46,0x61,0x37,0x04,0x08,0x08,0x05,0x78,0x6e,0x32,0x52,\r\n0x3b,0x20,0x27,0x40,0x52,0x2c,0x2d,0x8f,0xd4,0xfe,0xe1,0xbd,0xda,0xfe,0xa0,0xfa,0x87,0x08,0x1f,0x3f,0x6e,0xa6,0x77,0x47,0x78,0x57,0x31,0x21,0x36,0x42,0x21,0xfe,0x1c,0x04,0x78,0xfb,0x88,0x05,0x28,0xb0,0xfe,0x99,0x3e,0x46,0x7c,0xad,0x67,0xb3,0xfe,0xee,0xba,0x5f,0x4b,0x8d,0xca,0xfe,0x01,0x2c,0xa9,0x8e,0xf6,0xd0,0xaa,0x87,\r\n0x64,0x21,0x17,0x58,0x9d,0x75,0x45,0x45,0x78,0xa5,0x60,0x3c,0x7a,0x3b,0x56,0x36,0x30,0x15,0x0e,0x1e,0x37,0x2a,0x1a,0x0f,0x18,0x1f,0x00,0x01,0x00,0x74,0x00,0xfd,0x03,0x47,0x05,0x5a,0x00,0x5c,0x00,0x2b,0x40,0x14,0x37,0x53,0x59,0x22,0x1c,0x12,0x2d,0x03,0x53,0x03,0x12,0x12,0x03,0x53,0x03,0x0a,0x4d,0x40,0x21,0x0a,0x00,0x2f,\r\n0x33,0x2f,0x33,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x12,0x39,0x11,0x33,0x32,0x32,0x11,0x33,0x30,0x31,0x01,0x06,0x06,0x07,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x11,0x26,0x26,0x27,0x22,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,\r\n0x17,0x35,0x34,0x26,0x23,0x22,0x06,0x23,0x22,0x2e,0x02,0x27,0x13,0x33,0x17,0x16,0x33,0x32,0x37,0x17,0x07,0x22,0x2e,0x02,0x23,0x22,0x06,0x07,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x15,0x36,0x36,0x37,0x03,0x47,0x2e,0x82,0x53,0x0d,0x15,0x1a,0x0c,0x42,0x24,0x50,0x43,0x2c,0x3b,0x2e,0x06,0x1b,0x1b,0x15,0x18,0x1c,0x18,0x0b,0x15,\r\n0x20,0x15,0x2e,0x55,0x31,0x36,0x3c,0x10,0x1c,0x26,0x17,0x27,0x3b,0x07,0x0e,0x28,0x1e,0x2a,0x25,0x0f,0x17,0x09,0x0b,0x10,0x10,0x12,0x0c,0xfc,0x1c,0x9f,0x06,0x12,0x0f,0x0c,0x1d,0x75,0x08,0x1e,0x2b,0x38,0x22,0x1a,0x28,0x11,0x0e,0x19,0x0b,0x27,0x3f,0x2d,0x18,0x34,0x66,0x33,0x03,0x8b,0x54,0x4f,0x0e,0xfe,0x69,0x0f,0x1a,0x13,\r\n0x0a,0x38,0x5b,0x75,0x3d,0x3f,0x47,0x06,0x18,0x33,0x2d,0x27,0x27,0x14,0x08,0x07,0x0c,0x25,0x23,0x19,0x01,0x69,0x04,0x0b,0x12,0x3f,0x2a,0x16,0x26,0x1d,0x10,0x2b,0x23,0x09,0x0d,0x0c,0x34,0x35,0x28,0x03,0x0e,0x1b,0x27,0x18,0x01,0x0c,0x6c,0x06,0x09,0x2a,0x78,0x1a,0x20,0x1a,0x2a,0x1b,0x02,0x03,0x17,0x25,0x31,0x1a,0x93,0x05,\r\n0x2c,0x3b,0x00,0x01,0xff,0xf8,0xff,0xec,0x09,0x3b,0x05,0xcd,0x00,0xa4,0x00,0x00,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x37,0x3e,0x03,0x37,0x17,0x0e,0x05,0x07,0x0e,0x05,0x07,0x3e,0x05,0x37,0x3e,0x03,0x37,0x3e,0x03,0x37,0x17,\r\n0x0e,0x05,0x07,0x0e,0x05,0x15,0x14,0x33,0x32,0x3e,0x02,0x37,0x17,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x37,0x3e,0x05,0x37,0x0e,0x03,0x07,0x0e,0x03,0x07,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x36,0x12,0x37,0x3e,0x05,0x37,0x0e,0x05,0x07,0x0e,0x05,0x01,0x0a,0x3f,0x65,0x48,0x26,0x1c,0x31,0x44,0x29,0x22,\r\n0x2c,0x1a,0x0b,0x14,0x2c,0x43,0x2f,0x1a,0x11,0x13,0x2e,0x4b,0x38,0x4b,0x87,0x7e,0x77,0x76,0x78,0x41,0x61,0xc1,0xb0,0x96,0x36,0x21,0x09,0x32,0x40,0x47,0x3f,0x2e,0x07,0x07,0x24,0x30,0x36,0x31,0x26,0x07,0x20,0x4b,0x51,0x55,0x55,0x52,0x27,0x2d,0x4a,0x43,0x40,0x23,0x39,0x70,0x64,0x55,0x1f,0x22,0x17,0x3d,0x44,0x48,0x46,0x40,\r\n0x19,0x15,0x38,0x3c,0x3b,0x2f,0x1d,0x10,0x1b,0x51,0x5b,0x5e,0x29,0x19,0x27,0x5f,0x62,0x5f,0x28,0x23,0x38,0x27,0x15,0x24,0x3b,0x48,0x48,0x3f,0x15,0x1a,0x4d,0x55,0x58,0x4b,0x37,0x0a,0x1a,0x70,0x9d,0xc4,0x6d,0x3e,0x6b,0x5d,0x51,0x24,0x1f,0x38,0x34,0x2f,0x15,0x22,0x27,0x14,0x05,0x19,0x49,0x84,0x6c,0x18,0x3e,0x42,0x41,0x36,\r\n0x28,0x08,0x2c,0x6c,0x74,0x79,0x71,0x67,0x28,0x37,0x6d,0x71,0x78,0x85,0x96,0x14,0x27,0x48,0x63,0x3c,0x2b,0x4c,0x38,0x20,0x14,0x21,0x28,0x14,0x18,0x2d,0x26,0x1c,0x06,0x03,0x16,0x12,0x09,0x30,0x31,0x26,0x3a,0x65,0x8b,0xa0,0xaf,0x58,0x84,0xef,0xc3,0x90,0x26,0x15,0x15,0x6e,0x91,0xa1,0x8e,0x69,0x10,0x10,0x59,0x79,0x8e,0x8f,\r\n0x83,0x30,0x20,0x66,0x7c,0x8a,0x8a,0x82,0x35,0x3d,0x64,0x55,0x4b,0x25,0x3d,0x69,0x54,0x3e,0x12,0x21,0x21,0x65,0x78,0x85,0x85,0x7d,0x33,0x2a,0x79,0x8a,0x90,0x81,0x67,0x1c,0x1d,0x38,0x59,0x6e,0x35,0x15,0x36,0x72,0x5e,0x3d,0x1a,0x3c,0x64,0x4a,0x31,0x7c,0x86,0x87,0x78,0x60,0x1c,0x23,0x5f,0x67,0x67,0x56,0x3e,0x0b,0x12,0x56,\r\n0x97,0xde,0x99,0x59,0xa6,0x98,0x85,0x36,0x2e,0x4f,0x3b,0x21,0x2f,0x45,0x4d,0x1e,0x21,0x7b,0xbc,0x01,0x01,0xa7,0x26,0x5c,0x5e,0x5b,0x4c,0x36,0x0b,0x21,0x6b,0x82,0x91,0x90,0x86,0x36,0x49,0xa1,0x9b,0x8d,0x6b,0x3f,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0x2d,0x04,0x2a,0x02,0x26,0x09,0x1f,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0xc9,\r\n0xfe,0xf4,0xff,0xff,0x00,0xab,0xfe,0xa6,0x05,0xf4,0x05,0xec,0x00,0x27,0x0f,0x50,0x02,0x59,0xfe,0xab,0x00,0x06,0x09,0x24,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0x9f,0x04,0x12,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x07,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0xff,0xff,0x00,0xab,0xfd,0xc9,\r\n0x06,0x9f,0x04,0x12,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x27,0x0f,0x54,0x02,0xad,0xfd,0xce,0x00,0x07,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0xff,0xff,0x00,0xab,0xff,0xea,0x06,0x9f,0x04,0x39,0x02,0x26,0x09,0x3e,0x00,0x00,0x00,0x07,0x14,0x7c,0x03,0xc6,0xfb,0xaa,0xff,0xff,0x00,0x00,0xfd,0xff,0x02,0x9e,0x05,0x5f,0x02,0x26,0x09,0x17,\r\n0x00,0x00,0x00,0x07,0x0a,0x1f,0x00,0xa5,0xfc,0xd3,0xff,0xff,0x00,0x9a,0xfd,0xfb,0x05,0x91,0x05,0xe2,0x02,0x26,0x09,0x2a,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0x01,0xfe,0x00,0x00,0x07,0x0a,0x1f,0x01,0xc4,0xfd,0x56,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x4b,0x03,0x62,0x02,0x06,0x09,0xc8,0x00,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,\r\n0x05,0x4b,0x02,0xb7,0x02,0x06,0x09,0x7c,0x00,0x00,0xff,0xff,0x00,0x9b,0xfd,0xff,0x04,0xa6,0x01,0xc1,0x02,0x06,0x09,0x5f,0x00,0x00,0x00,0x04,0x00,0x00,0x06,0x71,0x04,0xb4,0x09,0x9a,0x00,0x28,0x00,0x2c,0x00,0x6e,0x00,0x7c,0x00,0x00,0x01,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,\r\n0x22,0x26,0x27,0x35,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x17,0x16,0x16,0x33,0x13,0x33,0x11,0x23,0x25,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,\r\n0x27,0x35,0x34,0x36,0x37,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x33,0x27,0x34,0x26,0x23,0x22,0x06,0x07,0x16,0x16,0x17,0x3e,0x03,0x03,0x75,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x0b,0x13,0x08,0x08,0x6a,0x4d,0x15,0x2b,0x17,0x17,0x2f,0x10,0x1d,0x27,0x18,0x0a,0x1f,0x11,0x61,0x0c,0x12,0x05,0x04,\r\n0x1d,0x1d,0xee,0x5c,0x5c,0xfd,0x6b,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x1b,0x45,0x78,0x33,0x31,0x26,0x10,0x23,0x38,0x27,0x26,0x53,0x26,0x2b,0x4d,0x28,0x3f,0x5b,0x39,0x1b,0x0a,0x1a,0x2e,0x23,0x19,0x30,0x11,0x08,0x05,0x12,0x2d,0x32,0x35,0x1a,0x19,0x38,0x2d,0x1e,0x09,0x19,0x2c,0x24,0x25,0x50,0x2d,0x8d,0x26,0x21,0x18,0x32,\r\n0x17,0x11,0x27,0x14,0x1c,0x24,0x15,0x07,0x07,0x95,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x07,0x03,0x66,0x67,0x08,0x0b,0x5f,0x07,0x09,0x15,0x26,0x34,0x1f,0x39,0x73,0x30,0x1d,0x42,0x20,0x14,0x15,0x02,0x05,0xfd,0x9a,0x61,0x16,0x23,0xb7,0xba,0x31,0x3c,0x20,0x0a,0x36,0x2e,0x16,0x30,0x1a,0x16,0x27,0x1e,0x11,0x0f,\r\n0x0d,0x5a,0x14,0x09,0x1e,0x35,0x45,0x27,0x15,0x2b,0x2a,0x29,0x15,0x1c,0x45,0x1d,0x46,0x05,0x09,0x01,0x03,0x07,0x07,0x04,0x07,0x13,0x25,0x1e,0x0e,0x26,0x2a,0x2b,0x14,0x17,0x1a,0xbb,0x0b,0x08,0x04,0x03,0x1a,0x2e,0x14,0x0d,0x18,0x15,0x11,0x00,0x00,0x02,0xff,0x2b,0x06,0x1f,0x02,0xdf,0x08,0x40,0x00,0x36,0x00,0x48,0x00,0x21,\r\n0x40,0x0e,0x00,0x37,0x37,0x23,0x31,0x05,0x0f,0x0f,0x1a,0x3f,0x05,0x05,0x29,0x1a,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x39,0x33,0x11,0x33,0x30,0x31,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,\r\n0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x33,0x17,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x32,0x32,0x16,0x32,0x01,0x35,0x0d,0x2f,0x43,0x57,0x36,0x28,0x3c,0x27,0x13,0x20,0x46,0x71,0x51,0x17,0x3e,0x3b,0x30,0x0a,0x02,0x02,0x1a,0x36,0x56,0x3e,0x3f,0x54,0x32,0x15,0x06,0x07,0x56,\r\n0x05,0x05,0x3a,0x45,0x28,0x38,0x23,0x10,0x07,0x07,0x58,0x0a,0x02,0x1b,0x13,0xd3,0x2e,0x3b,0x23,0x0e,0x34,0x25,0x1f,0x34,0x29,0x1e,0x09,0x08,0x1c,0x1d,0x1b,0x07,0x2f,0x27,0x5f,0x53,0x38,0x22,0x3a,0x50,0x2d,0x3a,0x40,0x1e,0x06,0x01,0x06,0x0c,0x0a,0x30,0x4a,0x33,0x1a,0x1b,0x32,0x48,0x2d,0x1a,0x37,0x1d,0x1b,0x29,0x16,0x42,\r\n0x34,0x12,0x28,0x41,0x2f,0x21,0x43,0x2f,0x5d,0x14,0x1c,0x03,0x02,0x0e,0x1b,0x1a,0x39,0x33,0x1f,0x33,0x3f,0x1f,0x01,0x00,0x00,0x01,0x00,0x00,0x06,0x1e,0x01,0xba,0x08,0xdd,0x00,0x35,0x00,0x19,0x40,0x0a,0x19,0x00,0x30,0x30,0x11,0x2a,0x21,0x21,0x0a,0x11,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x33,0x33,0x30,0x31,0x01,\r\n0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x32,0x16,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x3e,0x03,0x37,0x01,0x62,0x47,0x61,0x3d,0x1b,0x12,0x26,0x3d,0x2b,0x2d,0x65,0x26,0x2f,0x5c,0x2e,0x45,0x61,\r\n0x3e,0x1d,0x23,0x30,0x1c,0x1a,0x1c,0x35,0x4d,0x30,0x06,0x16,0x1a,0x16,0x06,0x0b,0x2b,0x11,0x34,0x43,0x11,0x0e,0x10,0x2f,0x34,0x37,0x1a,0x07,0xaa,0x10,0x28,0x2f,0x33,0x1b,0x18,0x2b,0x20,0x13,0x16,0x0e,0x63,0x10,0x12,0x21,0x38,0x4c,0x2a,0x2a,0x56,0x2a,0x1f,0x49,0x23,0x24,0x44,0x34,0x1f,0x02,0x03,0x03,0x64,0x02,0x03,0x25,\r\n0x32,0x1a,0x2d,0x0f,0x0a,0x13,0x13,0x10,0x07,0x00,0x00,0x04,0x00,0x00,0x06,0x71,0x01,0xf5,0x09,0x3e,0x00,0x2a,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x27,0x40,0x11,0x40,0x3e,0x3e,0x3b,0x39,0x39,0x2b,0x00,0x19,0x0f,0x0f,0x22,0x33,0x19,0x19,0x08,0x22,0x00,0x2f,0x33,0x33,0x2f,0x33,0x12,0x39,0x2f,0x12,0x39,0x33,0x32,0x2f,0x33,\r\n0x33,0x2f,0x33,0x30,0x31,0x13,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x05,0x32,0x36,0x37,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x65,\r\n0x03,0x05,0x0f,0x23,0x3a,0x2c,0x31,0x3c,0x23,0x0e,0x03,0x18,0x1a,0x1d,0x36,0x29,0x19,0x15,0x26,0x33,0x1e,0x21,0x33,0x19,0x16,0x17,0x7d,0x88,0x43,0x5c,0x38,0x19,0x05,0x05,0x01,0x61,0x0b,0x15,0x0b,0x02,0x0b,0x11,0x16,0x0b,0x10,0x1d,0x27,0x2f,0x73,0x73,0xc8,0x73,0x73,0x07,0xa4,0x1a,0x2c,0x13,0x21,0x2c,0x1b,0x0c,0x0f,0x1b,\r\n0x25,0x15,0x07,0x12,0x23,0x33,0x21,0x1b,0x3d,0x33,0x21,0x25,0x25,0x21,0x65,0x33,0x7e,0x77,0x1b,0x34,0x4e,0x32,0x17,0x32,0x1c,0x10,0x01,0x05,0x0e,0x25,0x21,0x17,0x2b,0x19,0x15,0x18,0x01,0x38,0x71,0x71,0x71,0x00,0x00,0x03,0x00,0x32,0x05,0xd1,0x01,0xd4,0x08,0x8c,0x00,0x1c,0x00,0x20,0x00,0x24,0x00,0x1d,0x40,0x0c,0x23,0x22,\r\n0x22,0x1f,0x1d,0x1d,0x11,0x08,0x1c,0x1c,0x16,0x08,0x00,0x2f,0x33,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x32,0x2f,0x33,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x23,0x35,0x33,0x03,0x21,0x15,0x21,0x01,0xc7,0x07,0x06,\r\n0x16,0x35,0x56,0x40,0x37,0x4a,0x2d,0x13,0x06,0x05,0x58,0x09,0x30,0x3c,0x46,0x3c,0x07,0x06,0x31,0x73,0x73,0xdd,0x01,0x52,0xfe,0xae,0x07,0xe3,0x23,0x43,0x1f,0x37,0x58,0x3d,0x21,0x1a,0x32,0x46,0x2c,0x18,0x35,0x1e,0x3b,0x29,0x36,0x29,0x40,0x4f,0x1a,0x3d,0x26,0x38,0x71,0xfd,0x9d,0x58,0xff,0xff,0x00,0x32,0xfc,0xd5,0x01,0xd4,\r\n0xff,0x90,0x02,0x03,0x14,0x61,0x00,0x00,0xf7,0x04,0x00,0x0b,0xfc,0xe6,0x07,0x1d,0x02,0xe0,0x0a,0x0e,0x00,0x64,0x00,0x68,0x00,0x6c,0x00,0x70,0x00,0x74,0x00,0x78,0x00,0x7c,0x00,0x80,0x00,0x84,0x00,0x88,0x00,0x8c,0x00,0x00,0x03,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,\r\n0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,\r\n0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x01,0x33,0x11,0x23,0x01,0x33,0x15,0x23,0x07,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xf6,0x14,0x26,0x50,0x09,0x14,0x12,0x0c,0x5c,0x13,0x26,0x36,0x09,0x15,\r\n0x11,0x0c,0x5c,0x11,0x21,0x3e,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x3b,0x23,0x32,0x11,0x17,0x35,0x19,0x4c,0x19,0x2c,0x0d,0x17,0x39,0x19,0x6a,0x17,0x2d,0x0d,0x17,0x35,0x1a,0x0e,0x17,0x27,0x22,0x1d,0x0e,0x16,0x2b,0x17,0x1c,0x28,0x50,0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x17,0x2a,0x17,0x0e,0x09,0x15,\r\n0x11,0x0c,0x5c,0x03,0x7a,0x5c,0x5c,0xfc,0xdd,0x3f,0x3f,0x9e,0x65,0x65,0x02,0x2e,0x65,0x65,0xfc,0x7b,0x65,0x65,0x03,0xcc,0x64,0x64,0xfc,0xc0,0x64,0x64,0x01,0x12,0x64,0x64,0x45,0x64,0x64,0x02,0x2e,0x64,0x64,0x07,0xe9,0x2c,0x28,0x06,0x0d,0x16,0x11,0x01,0xcb,0xfe,0x4f,0x2c,0x28,0x06,0x0d,0x16,0x11,0xb7,0x9d,0x2a,0x2a,0x16,\r\n0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x15,0x12,0x16,0x11,0x16,0x11,0x16,0x11,0x18,0x0f,0x16,0x11,0x0c,0x13,0x18,0x0c,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x12,0x1d,0x06,0x0d,0x16,0x11,0xb7,0x01,0x14,0xfd,0x9a,0x02,0xda,0xc4,0x8f,0x62,0x62,0x62,0xeb,0x62,0xaf,0x62,\r\n0xfe,0x8d,0x62,0xaf,0x62,0xea,0x62,0x62,0x62,0x00,0x00,0x07,0xfb,0x6b,0x06,0xaa,0x03,0xb0,0x09,0x9a,0x00,0x84,0x00,0x94,0x00,0x98,0x00,0xa4,0x00,0xa8,0x00,0xac,0x00,0xb0,0x00,0x00,0x01,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x33,0x16,0x16,0x17,0x1e,0x03,0x17,0x33,0x32,0x3e,0x02,0x37,0x27,0x26,0x26,0x23,0x22,\r\n0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x07,0x07,0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x17,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,\r\n0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x03,0x1e,0x03,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x27,0x01,0x33,0x11,0x23,0x25,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x06,0x06,0x13,0x23,0x35,0x33,\r\n0x17,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0xfc,0xb3,0x26,0x47,0x16,0x32,0x29,0x0c,0x13,0x1a,0x0e,0x5f,0x17,0x20,0x0b,0x02,0x08,0x0e,0x15,0x0f,0x09,0x2a,0x4f,0x49,0x45,0x20,0x0b,0x1d,0x3f,0x32,0x1e,0x3d,0x13,0x17,0x3c,0x1f,0x32,0x45,0x1e,0x0d,0x1d,0x22,0x2b,0x1c,0x10,0x3d,0x02,0x22,0x2c,0x1d,0x09,0x15,0x11,0x0c,0x5c,0x03,\r\n0x0b,0x15,0x11,0x16,0x22,0x5c,0x13,0x26,0x17,0x1d,0x5d,0x10,0x21,0x0d,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x1c,0x27,0x0e,0x14,0x34,0x1a,0x22,0x35,0x12,0x17,0x37,0x19,0x24,0x32,0x0f,0x16,0x38,0x18,0x38,0x2d,0x42,0x08,0x1c,0x41,0x4b,0x54,0x2f,0x0f,0x1b,0x2b,0x0c,0x1a,0x4e,0x2e,0x17,0x41,0x1d,0xe7,0x35,0x49,0x2d,0x13,\r\n0x51,0x49,0x47,0x4b,0x35,0x21,0x1f,0x07,0xb2,0x5c,0x5c,0xf8,0x73,0x21,0x17,0x20,0x1c,0x18,0x21,0x1a,0x21,0x20,0x65,0x65,0x8c,0x64,0x64,0x02,0xe0,0x64,0x64,0x07,0x9e,0x05,0x06,0x14,0x16,0x12,0x3e,0x4b,0x52,0x24,0x45,0x79,0x31,0x0a,0x19,0x17,0x0f,0x01,0x12,0x1e,0x27,0x14,0x05,0x10,0x18,0x08,0x05,0x58,0x08,0x0b,0x19,0x10,\r\n0x06,0x0d,0x0b,0x09,0x02,0x59,0x27,0x14,0x10,0x06,0x0d,0x16,0x11,0x71,0x58,0x15,0x20,0x14,0x0a,0x17,0x23,0x71,0x57,0x2c,0x28,0x17,0x23,0xb8,0x9b,0x2b,0x2a,0x02,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,0x13,0x0f,0x13,0x0f,0x10,0x17,0x16,0x11,0x14,0x12,0x14,0x12,0x30,0x2a,0x10,0x20,0x1a,0x10,0x1c,0x11,0x1b,0x15,\r\n0x08,0x04,0x01,0x96,0x21,0x43,0x45,0x47,0x25,0x42,0x51,0x49,0x3e,0x40,0x63,0x1f,0x1a,0x01,0x0c,0xfd,0x9a,0x8a,0x1a,0x17,0x1a,0x16,0x1f,0x3c,0x23,0x16,0x42,0x01,0x2a,0x62,0x62,0x62,0xfd,0x3b,0x62,0x00,0x00,0x06,0xfb,0x9b,0x07,0x31,0x03,0x92,0x09,0x9a,0x00,0x7e,0x00,0x82,0x00,0x92,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0x00,\r\n0x01,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x23,0x26,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,\r\n0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x17,0x16,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x16,0x16,0x17,0x01,0x33,0x11,0x23,0x25,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,\r\n0x22,0x0e,0x02,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0x01,0x7a,0x17,0x1d,0x5d,0x03,0x0c,0x16,0x13,0x10,0x1d,0x1d,0x5c,0x1a,0x2b,0x38,0x1d,0x19,0x20,0x2c,0x0f,0x14,0x34,0x1a,0x1b,0x24,0x2d,0x11,0x11,0x2e,0x35,0x3b,0x1e,0x48,0x66,0x45,0x2a,0x0b,0x0c,0x11,\r\n0x07,0x17,0x37,0x19,0x19,0x11,0x1c,0x1a,0x19,0x0f,0x2a,0x67,0x36,0x48,0x68,0x89,0x27,0x1d,0x15,0x0b,0x05,0x5a,0x04,0x09,0x0a,0x0e,0x0c,0x22,0x33,0x48,0x31,0x13,0x26,0x21,0x18,0x04,0x22,0x10,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x39,0x17,0x21,0x09,0x05,0x5c,0x0e,0x02,0x0e,0x10,0x0f,0x37,0x4e,0x65,0x3d,0x33,0x4a,\r\n0x30,0x17,0x01,0x0e,0x17,0x01,0xe2,0x5c,0x5c,0xfc,0x5a,0x21,0x52,0x35,0x26,0x39,0x27,0x14,0x40,0x32,0x25,0x41,0x34,0x29,0xfe,0x59,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x11,0x64,0x64,0x04,0x24,0x64,0x64,0x07,0x95,0x17,0x23,0xb8,0x9b,0x17,0x20,0x16,0x0a,0x16,0x23,0x01,0xcc,0xfe,0x31,0x31,0x3c,0x20,0x0a,\r\n0x01,0x11,0x10,0x13,0x0f,0x0f,0x18,0x0e,0x11,0x09,0x02,0x01,0x03,0x05,0x05,0x05,0x0f,0x08,0x16,0x11,0x03,0x06,0x08,0x06,0x13,0x07,0x0f,0x20,0x17,0x43,0x25,0x1b,0x34,0x14,0x11,0x34,0x13,0x14,0x23,0x09,0x08,0x0a,0x04,0x01,0x01,0x02,0x02,0x01,0x16,0x31,0x20,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x19,0x0f,0x11,\r\n0x3a,0x17,0x68,0x0b,0x11,0x04,0x28,0x5c,0x4e,0x34,0x1f,0x35,0x46,0x27,0x20,0x25,0x01,0x02,0x04,0xfd,0x9a,0x61,0x01,0x01,0x03,0x0c,0x19,0x16,0x3a,0x31,0x1d,0x2f,0x3c,0x24,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x19,0x0f,0x0d,0x01,0x42,0x62,0x8d,0x62,0x00,0x00,0x05,0xfc,0x00,0x07,0x1d,0x02,0x8d,0x09,0xb2,0x00,0x7e,\r\n0x00,0x82,0x00,0x86,0x00,0x8a,0x00,0x8e,0x00,0x00,0x01,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x35,0x25,0x15,0x07,0x1e,0x03,0x17,0x1e,0x03,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,\r\n0x26,0x27,0x06,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x05,0x23,0x35,\r\n0x33,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xfe,0x24,0x14,0x26,0xd5,0x43,0x30,0x23,0x40,0x5a,0x36,0x01,0x5e,0xea,0x42,0x50,0x2e,0x15,0x07,0x01,0x07,0x10,0x1d,0x19,0x13,0x09,0x15,0x11,0x0c,0x5c,0x03,0x0b,0x15,0x11,0x16,0x22,0x5c,0x13,0x26,0x17,0x1d,0x5d,0x0f,0x22,0x38,0x29,0x22,0x35,0x12,0x17,0x37,\r\n0x19,0x24,0x32,0x0f,0x16,0x38,0x18,0x38,0x0a,0x16,0x16,0x12,0x05,0x17,0x50,0x42,0xdd,0x23,0x32,0x11,0x17,0x35,0x1a,0x10,0x2c,0x41,0x1c,0x16,0x2b,0x17,0x1c,0x28,0x50,0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x17,0x2a,0x17,0x0e,0x09,0x15,0x11,0x0c,0x5c,0xfe,0x62,0x65,0x65,0x01,0x57,0x65,0x65,0x8c,0x64,\r\n0x64,0xfe,0xa9,0x64,0x64,0x07,0xe9,0x2c,0x28,0x1a,0x18,0x1b,0x35,0x34,0x34,0x1b,0x3d,0xdb,0x61,0x94,0x20,0x38,0x36,0x36,0x1e,0x07,0x18,0x16,0x11,0x06,0x0d,0x16,0x11,0x71,0x58,0x15,0x20,0x14,0x0a,0x17,0x23,0x71,0x57,0x2c,0x28,0x17,0x23,0xb8,0x9b,0x33,0x46,0x2b,0x14,0x10,0x17,0x16,0x11,0x14,0x12,0x14,0x12,0x0b,0x10,0x12,\r\n0x07,0x17,0x1d,0x15,0x12,0x16,0x11,0x2a,0x19,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x12,0x1d,0x06,0x0d,0x16,0x11,0xb7,0x54,0x62,0x27,0x62,0x62,0x62,0xeb,0x62,0x00,0x00,0x06,0xfd,0x71,0x07,0x31,0x01,0x80,0x09,0x5c,0x00,0x43,0x00,0x52,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,\r\n0x00,0x00,0x03,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x26,0x26,0x17,0x34,\r\n0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0x05,0x23,0x35,0x33,0xfc,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x74,0x1f,0x16,0x15,0x26,0x32,0x1e,0x24,0x38,0x28,0x15,0x33,0x4f,0x60,0x2c,0x4b,0x1a,0x2f,\r\n0x14,0x2a,0x67,0x36,0x48,0x68,0x89,0x27,0x1d,0x15,0x0b,0x05,0x5a,0x04,0x09,0x0a,0x0e,0x0c,0x22,0x33,0x48,0x31,0x13,0x26,0x21,0x18,0x04,0x22,0x10,0xc8,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x01,0x58,0x0b,0x12,0x17,0x0c,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x58,0x65,0x65,0x8c,0x64,0x64,0xfe,0x63,0x64,0x64,\r\n0x08,0x00,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x16,0x35,0x20,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x3e,0x44,0x1f,0x05,0x0f,0x08,0x13,0x07,0x0f,0x20,0x17,0x43,0x25,0x1b,0x34,0x14,0x11,0x34,0x13,0x14,0x23,0x09,0x08,0x0a,0x04,0x01,0x01,0x02,0x02,0x01,0x16,0x31,0x08,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,\r\n0x15,0x19,0x0f,0x0d,0x20,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x18,0x0f,0x0f,0x01,0x3f,0x62,0x62,0x62,0x62,0x62,0x00,0x0a,0xfd,0x0e,0x06,0x71,0x02,0x8c,0x09,0x5c,0x00,0x4b,0x00,0x6d,0x00,0x7c,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xaf,0x00,0x00,0x01,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,\r\n0x15,0x14,0x07,0x33,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x0e,0x03,0x23,0x23,0x22,0x26,0x27,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x22,0x26,0x26,0x34,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x16,0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x05,0x16,0x16,0x33,0x32,\r\n0x3e,0x02,0x37,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x25,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x17,0x36,0x03,0x23,0x35,0x33,0x01,0x23,0x35,0x33,0x25,0x23,0x35,0x33,0x05,0x23,\r\n0x35,0x33,0x01,0x23,0x35,0x33,0x05,0x32,0x36,0x37,0x2e,0x03,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0xfe,0xa0,0x15,0x26,0x33,0x1e,0x24,0x39,0x27,0x15,0x0c,0x74,0x1f,0x16,0x15,0x26,0x32,0x1e,0x24,0x38,0x28,0x15,0x33,0x4f,0x60,0x2c,0x4b,0x19,0x30,0x14,0x15,0x30,0x2f,0x2c,0x12,0x27,0x30,0x42,0x1d,0x16,0x2b,0x17,0x1c,0x28,0x50,\r\n0x02,0x01,0x01,0x1d,0x2d,0x39,0x1b,0x12,0x26,0x24,0x20,0x0d,0x19,0x2f,0x1e,0x14,0x1e,0x05,0x22,0x10,0x02,0x89,0x2a,0x51,0x1d,0x1e,0x27,0x19,0x0c,0x02,0x16,0x1c,0x1d,0x35,0x2a,0x19,0x16,0x25,0x33,0x1e,0x2d,0x3b,0x23,0x0f,0x16,0x30,0x4e,0x37,0x26,0x4b,0x27,0xfe,0x3f,0x0a,0x12,0x17,0x0d,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,\r\n0x01,0x58,0x0b,0x12,0x17,0x0c,0x11,0x1c,0x08,0x16,0x25,0x1e,0x0c,0x58,0x65,0x65,0xfd,0x2c,0x65,0x65,0x01,0xc3,0x64,0x64,0x01,0x9d,0x64,0x64,0xfd,0x2c,0x64,0x64,0x03,0xe3,0x0b,0x15,0x0a,0x02,0x0b,0x11,0x14,0x0c,0x08,0x10,0x0d,0x08,0x27,0x08,0x00,0x1b,0x3d,0x33,0x21,0x2c,0x40,0x49,0x1d,0x29,0x1c,0x16,0x35,0x20,0x1b,0x3d,\r\n0x33,0x21,0x2c,0x40,0x49,0x1d,0x3e,0x44,0x1f,0x05,0x0f,0x08,0x08,0x0a,0x04,0x01,0x2a,0x19,0x12,0x1d,0x33,0x3d,0x19,0x0a,0x0c,0x0b,0x02,0x36,0x4b,0x30,0x15,0x0d,0x13,0x18,0x0a,0x14,0x1c,0x03,0x02,0x16,0x31,0xe9,0x11,0x13,0x12,0x1d,0x25,0x14,0x07,0x12,0x23,0x33,0x21,0x1b,0x3d,0x33,0x21,0x38,0x51,0x59,0x21,0x30,0x59,0x43,\r\n0x29,0x09,0x13,0x01,0x4b,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x19,0x0f,0x0d,0x20,0x0f,0x27,0x23,0x18,0x2b,0x19,0x09,0x14,0x15,0x18,0x0f,0x0f,0x01,0x3f,0x62,0xfe,0xd6,0x62,0x66,0x62,0x62,0x62,0xfe,0xd6,0x62,0xff,0x02,0x05,0x0e,0x25,0x21,0x16,0x0c,0x14,0x17,0x0c,0x16,0x18,0x00,0x02,0x00,0x00,0x06,0x71,0x02,0xf4,\r\n0x08,0x06,0x00,0x1b,0x00,0x2e,0x00,0x14,0xb7,0x21,0x18,0x18,0x05,0x2a,0x10,0x10,0x05,0x00,0x2f,0x33,0x2f,0x33,0x11,0x33,0x11,0x33,0x30,0x31,0x01,0x0e,0x03,0x23,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x33,0x32,0x36,0x37,0x25,0x14,0x1e,0x02,0x33,0x33,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,\r\n0x22,0x0e,0x02,0x02,0xf4,0x11,0x3c,0x4e,0x5d,0x31,0xef,0x3f,0x54,0x33,0x16,0x11,0x2b,0x48,0x38,0x2b,0x43,0x2c,0x17,0x13,0x81,0x59,0x93,0x2d,0xfd,0x66,0x0f,0x21,0x34,0x24,0x15,0x0f,0x0d,0x10,0x1a,0x20,0x10,0x1d,0x25,0x15,0x08,0x06,0x98,0x08,0x0f,0x0a,0x06,0x26,0x3c,0x49,0x23,0x21,0x47,0x3a,0x25,0x1f,0x36,0x4a,0x2b,0x32,\r\n0x33,0x13,0x10,0x41,0x13,0x24,0x1c,0x11,0x1d,0x31,0x15,0x19,0x26,0x1a,0x0d,0x12,0x1c,0x25,0x00,0x02,0xff,0xfe,0x06,0x71,0x03,0x28,0x07,0xeb,0x00,0x29,0x00,0x39,0x00,0x21,0x40,0x0e,0x0f,0x2d,0x2d,0x20,0x08,0x14,0x1c,0x1c,0x26,0x35,0x14,0x14,0x03,0x26,0x00,0x2f,0x33,0x33,0x2f,0x33,0x11,0x33,0x2f,0x12,0x39,0x39,0x33,0x11,\r\n0x33,0x30,0x31,0x03,0x16,0x16,0x33,0x32,0x3e,0x02,0x37,0x33,0x15,0x14,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x16,0x15,0x14,0x0e,0x02,0x23,0x23,0x22,0x26,0x27,0x23,0x0e,0x03,0x23,0x22,0x22,0x27,0x25,0x32,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x02,0x0f,0x1b,0x0d,0x37,0x4b,0x2e,0x16,0x03,0x5b,0x04,0x0c,\r\n0x18,0x15,0x0d,0x30,0x44,0x57,0x35,0x42,0x43,0x1d,0x41,0x67,0x4a,0x5d,0x4c,0x52,0x06,0x04,0x0b,0x22,0x35,0x4c,0x35,0x0a,0x13,0x0b,0x01,0xe4,0x08,0x16,0x0c,0x16,0x3f,0x3a,0x2a,0x23,0x1d,0x1f,0x34,0x29,0x1e,0x06,0xda,0x01,0x02,0x11,0x1f,0x2e,0x1e,0x14,0x1a,0x26,0x1a,0x0d,0x01,0x29,0x61,0x53,0x37,0x4c,0x46,0x28,0x51,0x42,\r\n0x2a,0x3e,0x34,0x19,0x2b,0x1f,0x12,0x01,0x66,0x01,0x08,0x18,0x2f,0x27,0x17,0x24,0x1f,0x33,0x3f,0x00,0x00,0x02,0x00,0xdc,0x01,0x03,0x03,0xa8,0x04,0x9a,0x00,0x1e,0x00,0x39,0x00,0x1a,0xb1,0x03,0x1b,0xb8,0x04,0xfb,0xb3,0x36,0x1f,0x22,0x2c,0xb9,0x04,0xfb,0x00,0x0f,0x00,0x2f,0xed,0x2f,0xce,0x33,0xed,0x32,0x30,0x31,0x01,0x06,\r\n0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x02,0x3f,0x20,0x4d,0x2e,0x25,0x47,0x39,0x23,0x24,0x3b,0x4c,0x51,0x4e,0x20,0x1e,0x4d,0x4e,0x4b,0x3b,\r\n0x23,0x26,0x3c,0x4b,0x25,0x2d,0x4a,0x1b,0x28,0x2d,0x30,0x13,0x24,0x1c,0x10,0x35,0x4b,0x52,0x1d,0x1d,0x4e,0x48,0x32,0x0f,0x1a,0x25,0x15,0x28,0x31,0x02,0x01,0x68,0x38,0x2d,0x1c,0x46,0x78,0x5c,0x5a,0xa0,0x87,0x6c,0x4c,0x28,0x27,0x4a,0x69,0x83,0x9c,0x57,0x60,0x7e,0x4b,0x1e,0x2d,0x38,0xaf,0x3a,0x49,0x0f,0x28,0x45,0x37,0x62,\r\n0xa9,0x7b,0x46,0x47,0x7b,0xa6,0x5e,0x35,0x46,0x2c,0x12,0x44,0x3f,0x00,0xff,0xff,0xfe,0xd4,0xfe,0x53,0x00,0xdf,0x00,0x0c,0x02,0x07,0x0a,0x51,0xff,0x15,0xf7,0xe0,0xff,0xff,0x00,0x65,0xfd,0xff,0x04,0xad,0x03,0x95,0x02,0x26,0x08,0xe4,0x00,0x00,0x00,0x47,0x0f,0x54,0x01,0x91,0xfe,0xe7,0x2d,0x51,0x2d,0x42,0xff,0xff,0xff,0xba,\r\n0xfd,0xc9,0x04,0xad,0x03,0x5e,0x02,0x26,0x08,0xe3,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x7f,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x04,0x3c,0x03,0x8a,0x02,0x26,0x08,0xe2,0x00,0x00,0x00,0x07,0x0f,0x54,0x01,0x31,0xfd,0xce,0xff,0xff,0x00,0xab,0xfe,0xa6,0x06,0xae,0x05,0xec,0x00,0x27,0x0f,0x50,0x02,0x59,0xfe,0xab,0x00,0x06,\r\n0x0e,0x55,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x06,0x02,0x00,0x27,0x0f,0x50,0x00,0xf6,0xfe,0xab,0x00,0x06,0x0e,0x56,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x4b,0x06,0x02,0x00,0x27,0x0f,0x50,0x00,0x98,0xfe,0xab,0x00,0x06,0x08,0xed,0x00,0x00,0xff,0xff,0x00,0xab,0xfe,0xa6,0x07,0x59,0x04,0x12,0x00,0x27,\r\n0x0f,0x50,0x02,0xad,0xfe,0xab,0x00,0x27,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0x00,0x06,0x0e,0x6e,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,0x05,0x3e,0x00,0x27,0x0f,0x50,0x00,0xa1,0xfe,0xab,0x00,0x26,0x09,0x3b,0x00,0x00,0x00,0x07,0x0a,0x19,0x00,0x65,0xfc,0xe0,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x8d,0x05,0x3e,0x00,0x27,\r\n0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0x83,0xfe,0xab,0xff,0xff,0x00,0xab,0xfd,0xc9,0x07,0x59,0x04,0x12,0x00,0x27,0x0a,0x19,0x02,0xc0,0xfb,0xb4,0x00,0x26,0x0e,0x6e,0x00,0x00,0x00,0x07,0x0f,0x54,0x02,0xad,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0xac,0x05,0x3e,0x02,0x26,\r\n0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0xff,0xba,0xfd,0xc9,0x02,0x8d,0x05,0x3e,0x00,0x27,0x0a,0x19,0x00,0x65,0xfc,0xe0,0x00,0x26,0x0e,0x6f,0x00,0x00,0x00,0x07,0x0f,0x54,0x00,0x83,0xfd,0xce,0xff,0xff,0x00,0xab,0xff,0xea,0x07,0x59,0x04,0x39,0x02,0x26,\r\n0x0e,0x6e,0x00,0x00,0x00,0x07,0x14,0x7c,0x03,0xc6,0xfb,0xaa,0x00,0x04,0xff,0xba,0xff,0xf2,0x03,0xf1,0x05,0x17,0x00,0x21,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x25,0x40,0x0c,0x4b,0x47,0x4a,0x49,0x34,0x22,0x3a,0x2d,0x2d,0x20,0x05,0x19,0xb8,0x04,0xfb,0xb1,0x06,0x12,0x00,0x2f,0x33,0xed,0x32,0x2f,0x33,0x2f,0xcd,0xde,0x32,0xde,\r\n0x32,0xcd,0x32,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x15,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x11,0x33,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,\r\n0x37,0x37,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x48,0x07,0x20,0x44,0x3e,0x16,0x32,0x4a,0x37,0x27,0x0f,0x04,0x1a,0x41,0x46,0x47,0x21,0xfe,0x1b,0x23,0x23,0x23,0x23,0x01,0xef,0x1d,0x43,0x38,0x25,0x9c,0xfd,0x2d,0x06,0x09,0x0e,0x16,0x0c,0x1b,0x2b,0x43,0x35,0x39,0x4f,0x31,0x16,0x5e,0x2f,0x54,0x73,0x45,0x3d,0x4f,0x38,0x2a,\r\n0x17,0x1e,0x17,0x0a,0x07,0x97,0x73,0x47,0x72,0x01,0x98,0x43,0x60,0x3e,0x1e,0xa7,0x10,0x1f,0x2e,0x1e,0x23,0x2f,0x1d,0x0c,0x34,0x20,0x20,0x33,0x12,0x2c,0x47,0x35,0x01,0xbc,0x01,0x5b,0x1a,0x3c,0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x31,0x2c,0xb4,0xb8,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,\r\n0x42,0x1f,0x3d,0x70,0x70,0x70,0x70,0x00,0x00,0x04,0xff,0xba,0xff,0xf2,0x03,0x48,0x05,0x17,0x00,0x14,0x00,0x38,0x00,0x3c,0x00,0x40,0x00,0x21,0x40,0x0b,0x3e,0x3a,0x3d,0x3c,0x27,0x15,0x2d,0x20,0x20,0x14,0x0d,0xb9,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,0x2f,0x33,0x2f,0xcd,0xde,0x32,0xde,0x32,0xcd,0x32,0x30,0x31,0x01,0x11,0x14,\r\n0x0e,0x02,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x3e,0x02,0x35,0x11,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x03,0x48,0x3d,0x63,0x80,0x43,0xfe,0x1b,0x23,\r\n0x23,0x23,0x23,0x01,0xef,0x2e,0x47,0x30,0x18,0xfd,0xc9,0x06,0x09,0x0e,0x16,0x0c,0x1b,0x2b,0x43,0x35,0x39,0x4f,0x31,0x16,0x5e,0x2f,0x54,0x73,0x45,0x3d,0x4f,0x38,0x2a,0x17,0x1e,0x17,0x0a,0x07,0x97,0x73,0x47,0x72,0x03,0x0f,0xfe,0x3d,0x71,0x88,0x49,0x18,0x34,0x20,0x20,0x33,0x0f,0x2a,0x48,0x39,0x01,0xbc,0x01,0x5b,0x1a,0x3c,\r\n0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x31,0x2c,0xb4,0xb8,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,0x42,0x1f,0x3d,0x70,0x70,0x70,0x70,0x00,0x00,0x03,0xfe,0x84,0x06,0x71,0x01,0x76,0x08,0x8f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x1d,0x40,0x0c,0x24,0x27,0x27,0x29,0x2b,0x2b,0x00,0x18,0x11,0x11,\r\n0x0b,0x18,0x00,0x2f,0x33,0x33,0x2f,0x12,0x39,0x33,0x2f,0x33,0x33,0x2f,0x33,0x30,0x31,0x01,0x06,0x06,0x15,0x14,0x16,0x17,0x1e,0x03,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x25,0x23,0x35,0x33,0x17,0x23,0x35,0x33,0xfe,0xed,0x06,0x09,0x12,0x1a,0x10,0x22,\r\n0x37,0x56,0x44,0x49,0x66,0x3f,0x1d,0x5e,0x38,0x65,0x8a,0x52,0x49,0x60,0x43,0x32,0x1b,0x24,0x1c,0x0a,0x07,0x01,0x46,0x73,0x73,0xb9,0x72,0x72,0x07,0xe2,0x1a,0x3c,0x21,0x24,0x31,0x15,0x0d,0x11,0x09,0x03,0x06,0x19,0x32,0x2b,0xef,0xf3,0x53,0x5a,0x2a,0x07,0x02,0x0d,0x1b,0x19,0x22,0x50,0x36,0x25,0x42,0x1f,0x3d,0x70,0x70,0x70,\r\n0xff,0xff,0x00,0x00,0xfd,0xff,0x03,0x57,0x05,0x5f,0x00,0x27,0x0a,0x1f,0x00,0xa5,0xfc,0xd3,0x00,0x06,0x0b,0x0c,0x00,0x00,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x06,0xae,0x04,0x24,0x02,0x26,0x08,0xf7,0x00,0x00,0x00,0x27,0x0f,0x51,0x02,0x01,0xfd,0xd8,0x00,0x07,0x0a,0x1f,0x01,0xde,0xfb,0x98,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0xac,\r\n0x05,0xb4,0x02,0x26,0x09,0x3b,0x00,0x00,0x00,0x27,0x0a,0x1f,0x00,0xa0,0xfd,0x28,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x02,0x74,0x05,0xb4,0x02,0x26,0x0e,0x6f,0x00,0x00,0x00,0x27,0x0a,0x1f,0x00,0xa0,0xfd,0x28,0x00,0x07,0x0f,0x51,0x00,0x4a,0xfe,0xab,0xff,0xff,0x00,0xab,0xff,0xea,0x08,0x04,\r\n0x03,0x62,0x02,0x06,0x0e,0xa5,0x00,0x00,0xff,0xff,0xff,0xba,0xfe,0xa6,0x04,0x02,0x03,0x62,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0xff,0xba,0xfe,0xa6,0x03,0x49,0x03,0x62,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x01,0x0e,0xfe,0xab,0xff,0xff,0x00,0x9b,0xfd,0xff,0x06,0x03,\r\n0x02,0xb7,0x02,0x02,0x0e,0x70,0x00,0x00,0xff,0xff,0xff,0xba,0xff,0xf2,0x04,0x02,0x05,0x24,0x02,0x26,0x09,0x3d,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0xff,0xba,0xff,0xf2,0x03,0x49,0x05,0x24,0x02,0x26,0x09,0x3c,0x00,0x00,0x00,0x07,0x0f,0x50,0x00,0xd5,0x04,0x74,0xff,0xff,0x00,0x9b,0xfd,0xff,0x05,0x58,\r\n0x01,0xc1,0x02,0x02,0x0e,0xcf,0x00,0x00,0x00,0x01,0x00,0xab,0x01,0xe1,0x01,0xac,0x02,0xe2,0x00,0x13,0x00,0x08,0xb1,0x0a,0x00,0x00,0x2f,0xcd,0x30,0x31,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0x2d,0x17,0x2e,0x25,0x18,0x18,0x25,0x2e,0x17,0x16,0x2d,0x25,0x17,0x17,0x25,0x2d,0x01,\r\n0xe1,0x17,0x25,0x2d,0x16,0x16,0x2f,0x25,0x18,0x18,0x25,0x2f,0x16,0x16,0x2d,0x25,0x17,0x00,0x00,0x01,0x00,0xd4,0x01,0x18,0x01,0x84,0x03,0xe5,0x00,0x0d,0x00,0x08,0xb1,0x06,0x00,0x00,0x2f,0x2f,0x30,0x31,0x01,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x01,0x43,0x11,0x18,0x10,0x08,0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,\r\n0x45,0x74,0x70,0x74,0x45,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x01,0x00,0x66,0x01,0x18,0x02,0x01,0x03,0xe5,0x00,0x0f,0x00,0x0a,0xb2,0x01,0x0e,0x07,0x00,0x2f,0x2f,0xcd,0x30,0x31,0x01,0x21,0x1e,0x03,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x21,0x02,0x01,0xfe,0xf2,0x08,0x0d,0x09,0x05,0x6b,0x07,0x10,0x1b,0x13,0x01,0x9b,\r\n0x03,0x5d,0x2b,0x51,0x53,0x59,0x32,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x01,0x00,0x1f,0x01,0x18,0x02,0x39,0x03,0xe5,0x00,0x37,0x00,0x14,0xb7,0x30,0x2b,0x25,0x06,0x16,0x1c,0x00,0x0d,0x00,0x2f,0x33,0x33,0xdc,0x32,0xcd,0x32,0x2f,0x30,0x31,0x13,0x16,0x16,0x17,0x16,0x32,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,\r\n0x15,0x14,0x06,0x07,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x23,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0x8e,0x0c,0x12,0x07,0x04,0x09,0x04,0x28,0x1f,0x12,0x0b,0x6b,0x0d,0x0d,0x04,0x02,0x08,0x0e,0x07,0x28,0x1f,0x12,0x0b,0x6b,0x0d,0x0d,\r\n0x18,0x2b,0x3c,0x23,0x18,0x33,0x1d,0x13,0x2f,0x18,0x10,0x05,0x05,0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,0x30,0x51,0x27,0x01,0x25,0x1b,0x19,0x38,0x18,0x20,0x37,0x1b,0x0e,0x19,0x0d,0x02,0x01,0x25,0x1b,0x19,0x38,0x18,0x21,0x35,0x1d,0x29,0x3f,0x2d,0x17,0x0b,0x0f,0x0d,0x0c,0x2d,0x5e,0x39,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,\r\n0x00,0x01,0x00,0x7f,0x01,0x0b,0x01,0xd8,0x03,0xfa,0x00,0x2e,0x00,0x0c,0xb3,0x14,0x13,0x2e,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,\r\n0x01,0xd8,0x23,0x3f,0x21,0x27,0x4d,0x3d,0x25,0x3b,0x46,0x43,0x38,0x1b,0x3e,0x66,0x4b,0x39,0x44,0x23,0x0b,0x21,0x35,0x44,0x24,0x3f,0x4a,0x25,0x0a,0x16,0x1f,0x25,0x0f,0x14,0x20,0x1e,0x20,0x13,0x01,0x20,0x0b,0x0a,0x10,0x23,0x37,0x28,0x2f,0x6c,0x44,0x20,0x42,0x33,0x22,0x41,0x3a,0x35,0x17,0x8d,0x11,0x1b,0x14,0x0e,0x04,0x0a,\r\n0x1b,0x1c,0x1d,0x0d,0x1d,0x35,0x4b,0x32,0x1d,0x07,0x0e,0x0f,0x07,0x02,0x01,0x04,0x06,0x05,0x00,0x02,0x00,0x4f,0x01,0x60,0x02,0x08,0x03,0x99,0x00,0x13,0x00,0x27,0x00,0x0c,0xb3,0x14,0x0a,0x1e,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x03,0x22,\r\n0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x26,0x30,0x4f,0x39,0x1f,0x2c,0x42,0x4b,0x20,0x22,0x4f,0x43,0x2c,0x22,0x3c,0x53,0x30,0x11,0x26,0x20,0x16,0x12,0x1e,0x28,0x16,0x23,0x2d,0x1b,0x0a,0x18,0x24,0x29,0x01,0x60,0x1b,0x36,0x4f,0x35,0x54,0x84,0x5b,0x31,0x2b,0x54,0x7e,0x54,0x39,0x56,0x3b,\r\n0x1e,0x01,0xb3,0x1f,0x38,0x4d,0x2e,0x1b,0x22,0x14,0x07,0x0f,0x19,0x1f,0x10,0x30,0x4e,0x37,0x1e,0x00,0x00,0x01,0x00,0x35,0x01,0x18,0x02,0x22,0x03,0xe5,0x00,0x12,0x00,0x0a,0xb2,0x12,0x07,0x0a,0x00,0x2f,0xcd,0x2f,0x30,0x31,0x01,0x2e,0x05,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x01,0xb2,0x10,0x16,0x10,0x09,0x06,0x04,0x02,\r\n0xfe,0xce,0x01,0x99,0x03,0x02,0x04,0x07,0x0a,0x11,0x18,0x11,0x01,0x18,0x43,0x66,0x56,0x4d,0x55,0x63,0x41,0x88,0x63,0x46,0x6c,0x5b,0x53,0x5b,0x6a,0x45,0x00,0x01,0x00,0x1b,0x01,0x12,0x02,0x3c,0x03,0xe5,0x00,0x13,0x00,0x0c,0xb3,0x03,0x10,0x00,0x0a,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x36,0x36,0x37,0x33,0x0e,0x03,0x07,\r\n0x23,0x2e,0x03,0x27,0x33,0x16,0x16,0x17,0x01,0x2d,0x22,0x4e,0x2d,0x72,0x23,0x3d,0x38,0x32,0x19,0x5c,0x1a,0x34,0x38,0x3b,0x21,0x72,0x2d,0x4e,0x22,0x01,0xe5,0x87,0xfc,0x7d,0x60,0xb6,0xb1,0xb1,0x5b,0x60,0xb4,0xb1,0xb1,0x5d,0x7d,0xfb,0x88,0x00,0x00,0x01,0x00,0x1b,0x01,0x18,0x02,0x3c,0x03,0xea,0x00,0x13,0x00,0x0c,0xb3,0x13,\r\n0x09,0x10,0x03,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x06,0x06,0x07,0x23,0x3e,0x03,0x37,0x33,0x1e,0x03,0x17,0x23,0x26,0x26,0x27,0x01,0x2a,0x22,0x4e,0x2d,0x72,0x23,0x3d,0x37,0x33,0x19,0x5c,0x1a,0x34,0x38,0x3b,0x21,0x72,0x2d,0x4e,0x22,0x03,0x18,0x88,0xfb,0x7d,0x60,0xb5,0xb1,0xb1,0x5b,0x5f,0xb4,0xb1,0xb1,0x5d,0x7d,0xfa,\r\n0x89,0x00,0x00,0x02,0x00,0x35,0x01,0x18,0x02,0x23,0x03,0xeb,0x00,0x1c,0x00,0x2d,0x00,0x0e,0xb4,0x1c,0x05,0x28,0x20,0x0f,0x00,0x2f,0xdd,0xde,0xcd,0x2f,0x30,0x31,0x01,0x26,0x26,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,0x17,0x03,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x37,0x26,0x26,0x01,0xb2,0x28,0x20,0x08,0x38,0x36,0x27,0x45,0x35,0x1e,0x1c,0x33,0x47,0x2c,0x2a,0x47,0x1f,0x10,0x13,0x0c,0x07,0x04,0x03,0x0a,0x15,0x23,0x1d,0xdd,0x0e,0x2d,0x1f,0x13,0x1e,0x14,0x0b,0x38,0x29,0x14,0x2e,0x18,0x03,0x07,0x01,0x18,0x5b,0xa5,0x40,0x16,0x19,0x31,0x4a,0x32,0x2f,0x53,0x3d,0x24,\r\n0x28,0x2e,0x1a,0x30,0x36,0x3e,0x26,0x26,0x53,0x63,0x75,0x48,0x02,0x04,0x22,0x28,0x10,0x19,0x20,0x0f,0x26,0x25,0x08,0x07,0x1a,0x1f,0x00,0x01,0x00,0x53,0x01,0x18,0x02,0x05,0x03,0xf1,0x00,0x2b,0x00,0x10,0xb5,0x24,0x1c,0x15,0x0b,0x00,0x05,0x00,0x2f,0x33,0xdd,0xde,0xcd,0x2f,0x30,0x31,0x13,0x17,0x17,0x36,0x36,0x33,0x32,0x16,\r\n0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x06,0x23,0x22,0x26,0x27,0x07,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x27,0xc2,0x12,0x03,0x1a,0x58,0x3f,0x0c,0x23,0x16,0x22,0x25,0x1d,0x38,0x2b,0x1b,0x14,0x1f,0x27,0x14,0x2d,0x58,0x27,0x1f,0x5b,0x30,0x18,0x2e,0x14,0x02,0x02,0x02,\r\n0x6b,0x07,0x10,0x1b,0x13,0x03,0xe5,0x52,0x01,0x2a,0x35,0x03,0x05,0x85,0x08,0x0a,0x13,0x1c,0x12,0x11,0x17,0x0f,0x07,0x1e,0x18,0x8a,0x14,0x1d,0x09,0x0b,0x01,0x1b,0x33,0x20,0xeb,0xe7,0x3b,0x6c,0x71,0x7f,0x4f,0x00,0x00,0x02,0x00,0x32,0x01,0x07,0x02,0x25,0x03,0xed,0x00,0x1a,0x00,0x35,0x00,0x12,0xb6,0x28,0x25,0x2c,0x03,0x17,\r\n0x1b,0x0d,0x00,0x2f,0xcd,0x2f,0x33,0xdd,0x32,0xcc,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x33,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x01,0x29,0x14,0x34,0x1e,0x1a,\r\n0x33,0x2a,0x1a,0x32,0x4c,0x58,0x27,0x26,0x57,0x49,0x30,0x1c,0x2c,0x36,0x1a,0x1d,0x32,0x12,0x04,0x15,0x32,0x2b,0x1c,0x08,0x0d,0x13,0x0b,0x17,0x18,0x02,0x5b,0x17,0x1b,0x0a,0x12,0x0e,0x08,0x1e,0x2d,0x34,0x01,0x4e,0x28,0x1f,0x17,0x3b,0x64,0x4e,0x6c,0xb1,0x7f,0x46,0x44,0x7b,0xae,0x69,0x50,0x69,0x3e,0x19,0x1f,0x28,0x02,0x1f,\r\n0x35,0x5d,0x7f,0x4b,0x26,0x32,0x1d,0x0c,0x31,0x39,0x34,0x35,0x09,0x1b,0x31,0x27,0x4e,0x81,0x5d,0x34,0x00,0x01,0x00,0x59,0x01,0x03,0x01,0xff,0x03,0xec,0x00,0x27,0x00,0x19,0x40,0x0a,0x20,0x19,0x00,0x23,0x1f,0x1f,0x24,0x23,0x0f,0x08,0x00,0x2f,0xcd,0x2f,0x33,0x39,0x2f,0x12,0x39,0x33,0x33,0x30,0x31,0x01,0x26,0x26,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x16,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x27,0x36,0x36,0x37,0x01,0x18,0x48,0x46,0x24,0x3f,0x56,0x32,0x10,0x25,0x1a,0x1b,0x2a,0x12,0x18,0x2b,0x21,0x14,0x12,0x1c,0x25,0x14,0x12,0x1f,0x0f,0x14,0x2e,0x21,0x6a,0xc3,0x5a,0x1f,\r\n0x28,0x62,0x36,0x02,0x70,0x13,0x59,0x45,0x31,0x4c,0x33,0x1b,0x03,0x04,0x88,0x04,0x04,0x07,0x12,0x1f,0x17,0x16,0x1e,0x13,0x09,0x06,0x05,0x0b,0x1a,0x10,0x9b,0x2e,0xb4,0x86,0x9c,0x3c,0x65,0x2d,0x00,0x01,0x00,0x2b,0x01,0x18,0x02,0x2d,0x03,0xec,0x00,0x28,0x00,0x0e,0xb4,0x09,0x0f,0x04,0x23,0x19,0x00,0x2f,0x2f,0x33,0xdd,0xcc,\r\n0x30,0x31,0x01,0x36,0x36,0x37,0x33,0x0e,0x03,0x07,0x23,0x2e,0x03,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x16,0x16,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x01,0x6c,0x0e,0x1e,0x13,0x82,0x1e,0x2b,0x21,0x18,0x0a,0x5b,0x09,0x19,0x20,0x27,0x16,0x17,0x13,0x09,0x03,0x08,0x08,0x6b,0x0b,0x0d,0x0b,\r\n0x4c,0x3e,0x22,0x38,0x2c,0x22,0x0c,0x03,0x71,0x21,0x37,0x1c,0x2a,0x48,0x45,0x45,0x26,0x22,0x3c,0x2b,0x19,0x17,0x12,0x11,0x2c,0x14,0x2d,0x7c,0x58,0xd2,0xce,0x60,0x7a,0x51,0x36,0x1b,0x45,0x45,0x15,0x23,0x2c,0x17,0x00,0x01,0x00,0x4d,0x01,0x12,0x02,0x0a,0x03,0xe5,0x00,0x0e,0x00,0x0c,0xb3,0x09,0x05,0x07,0x00,0x00,0x2f,0x2f,\r\n0xcd,0x32,0x30,0x31,0x01,0x0e,0x03,0x07,0x21,0x15,0x21,0x35,0x3e,0x03,0x37,0x01,0x5d,0x06,0x15,0x1e,0x26,0x18,0x01,0x24,0xfe,0x43,0x25,0x39,0x29,0x19,0x06,0x03,0xe5,0x79,0xb1,0x87,0x69,0x31,0x88,0x47,0x43,0x7f,0x94,0xb9,0x7d,0x00,0x00,0x06,0x00,0xa1,0xff,0xf2,0x0b,0x4d,0x08,0x36,0x00,0x64,0x00,0x78,0x00,0x86,0x00,0xb4,\r\n0x00,0xb8,0x00,0xbc,0x00,0x54,0x40,0x0b,0xb8,0xb6,0xa0,0x87,0x94,0x9a,0x8d,0xa6,0xad,0x4d,0x34,0xb8,0x04,0xfb,0x40,0x0f,0x3e,0x82,0x40,0x7e,0x82,0x7e,0x82,0x40,0x40,0x5a,0x4d,0x76,0x53,0x46,0x61,0xb8,0x04,0xfb,0xb5,0x2c,0x25,0x1a,0xbc,0xba,0x6c,0xb9,0x04,0xfb,0x00,0x0a,0x00,0x2f,0xed,0xde,0xcd,0x2f,0x33,0x33,0xed,0x32,\r\n0x32,0x32,0x2f,0x33,0x33,0x2f,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0xed,0x10,0xde,0x32,0xdd,0x32,0xdc,0x32,0x32,0xde,0xcd,0x30,0x31,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x07,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,\r\n0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x25,0x14,0x1e,0x02,0x33,\r\n0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x34,0x27,0x33,0x06,0x14,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x33,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x25,0x23,0x11,0x33,0x01,0x23,0x35,0x33,0x09,0xa8,0x4a,0x61,0x38,\r\n0x16,0x31,0x55,0x75,0x44,0x48,0x79,0x36,0x14,0x26,0x1d,0x11,0x39,0x61,0x82,0x90,0x98,0x47,0x8d,0x3b,0x5c,0x46,0x34,0x13,0x04,0x19,0x40,0x49,0x4f,0x28,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1c,0x41,0x36,0x24,0x9c,0x0c,\r\n0x26,0x46,0x39,0x25,0x42,0x31,0x1c,0x9c,0x20,0x3c,0x57,0x38,0x96,0x30,0x75,0x36,0x01,0x0a,0x10,0x1b,0x27,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1c,0x19,0x43,0x73,0x5a,0x21,0x1e,0xf6,0x87,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x02,0xf8,0x03,0x01,0x26,0x2d,0x2d,0x22,0x01,0x5f,0x01,0x22,0x2d,0x30,0x24,0x03,0x5f,\r\n0x01,0x01,0x63,0x52,0x26,0x44,0x14,0x06,0x15,0x49,0x27,0x2d,0x3d,0x26,0x11,0x03,0x01,0x6b,0x74,0x74,0x04,0xfb,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x57,0x21,0x4a,0x52,0x5a,0x30,0x60,0x82,0x53,0x2d,0x15,0x06,0x02,0x11,0x20,0x2e,0x1c,0x23,0x2f,0x1d,0x0c,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,\r\n0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xa4,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfc,0x0d,0x45,0x5c,0x39,0x18,0x01,0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x43,0x49,0x2a,0x18,0x4d,0xab,0x26,\r\n0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x04,0x80,0x1c,0x18,0x09,0x33,0x3f,0x3d,0x3c,0x0d,0x1c,0x0d,0x0e,0x1c,0x0b,0x3d,0x3d,0x3e,0x37,0x1f,0x1b,0x0c,0x18,0x08,0x6d,0x76,0x1f,0x20,0x20,0x1f,0x22,0x3a,0x4e,0x2c,0x21,0x18,0x53,0x01,0x56,0xfc,0x39,0xb5,0x00,0x00,0x04,0x00,0xa1,0xff,0xf2,0x0b,0x4d,0x05,0x7e,\r\n0x00,0x64,0x00,0x78,0x00,0x86,0x00,0x8a,0x00,0x3b,0xb9,0x00,0x34,0x04,0xfb,0x40,0x0d,0x82,0x3e,0x40,0x7e,0x7e,0x40,0x40,0x5a,0x4d,0x76,0x53,0x46,0x60,0xb8,0x04,0xfb,0xb5,0x2c,0x25,0x19,0x8a,0x88,0x6c,0xb9,0x04,0xfb,0x00,0x0a,0x00,0x2f,0xed,0xde,0xcd,0x2f,0x33,0x33,0xed,0x32,0x32,0x32,0x2f,0x33,0x33,0x2f,0x39,0x2f,0x12,\r\n0x39,0x39,0xed,0x30,0x31,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x15,0x14,0x0e,0x04,0x07,0x23,0x22,0x2e,0x02,0x27,0x23,0x0e,0x03,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0x23,0x22,0x2e,0x02,0x27,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x35,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,\r\n0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x33,0x11,0x14,0x1e,0x02,0x33,0x33,0x32,0x16,0x17,0x25,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x36,0x36,0x25,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x11,0x0e,0x03,0x01,0x23,0x35,0x33,0x09,0xa8,0x4a,0x61,0x38,0x16,0x31,0x55,0x75,0x44,0x48,\r\n0x79,0x36,0x14,0x26,0x1d,0x11,0x39,0x61,0x82,0x90,0x98,0x47,0x8d,0x3b,0x5c,0x46,0x34,0x13,0x04,0x19,0x40,0x49,0x4f,0x28,0x68,0x75,0x1c,0x04,0x31,0x91,0x49,0x38,0x64,0x50,0x3a,0x0e,0x2b,0x62,0x2a,0x45,0x7f,0x62,0x3a,0x58,0x92,0xbc,0x65,0x9c,0x0e,0x26,0x44,0x36,0x1c,0x41,0x36,0x24,0x9c,0x0c,0x26,0x46,0x39,0x25,0x42,0x31,\r\n0x1c,0x9c,0x20,0x3c,0x57,0x38,0x96,0x30,0x75,0x36,0x01,0x0a,0x10,0x1b,0x27,0x2d,0x32,0x1a,0x1d,0x38,0x2c,0x1c,0x19,0x43,0x73,0x5a,0x21,0x1e,0xf6,0x87,0x23,0x3c,0x4e,0x2a,0x27,0x55,0x22,0x4d,0x87,0x66,0x3b,0x08,0xfe,0xb9,0xb9,0x9e,0x1e,0x44,0x4d,0x55,0x2f,0x40,0x8d,0x77,0x4d,0x53,0x57,0x21,0x4a,0x52,0x5a,0x30,0x60,0x82,\r\n0x53,0x2d,0x15,0x06,0x02,0x11,0x20,0x2e,0x1c,0x23,0x2f,0x1d,0x0c,0x40,0x3b,0x3f,0x3c,0x19,0x35,0x52,0x3a,0x11,0x0c,0x20,0x45,0x6c,0x4d,0x5e,0x92,0x68,0x42,0x0f,0x61,0xfd,0xb5,0x3d,0x5b,0x3d,0x1e,0x13,0x2c,0x47,0x34,0x03,0x95,0xfc,0xa4,0x3b,0x5a,0x3e,0x20,0x16,0x2d,0x46,0x31,0x04,0x2b,0xfc,0x0d,0x45,0x5c,0x39,0x18,0x01,\r\n0x01,0xd6,0x1d,0x47,0x49,0x45,0x36,0x20,0x26,0x3c,0x4c,0x26,0x20,0x3f,0x43,0x49,0x2a,0x18,0x4d,0xab,0x26,0x35,0x21,0x0e,0x0a,0x0b,0x01,0x76,0x0e,0x2f,0x41,0x52,0x02,0x62,0xb5,0x00,0x00,0x01,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x00,0x0e,0x00,0x0c,0xba,0x00,0x0e,0x04,0xfb,0x00,0x01,0x00,0x2f,0xed,0x30,0x31,0x05,0x21,\r\n0x22,0x2e,0x02,0x27,0x27,0x37,0x1e,0x03,0x33,0x21,0x08,0xfe,0xf9,0xb1,0x4b,0x99,0x8f,0x7d,0x2e,0x1e,0x05,0x36,0x8d,0x9f,0xa9,0x50,0x06,0x2b,0x0e,0x07,0x0f,0x15,0x0e,0x91,0x05,0x0a,0x0f,0x0a,0x05,0x00,0x00,0x01,0x00,0x00,0xff,0xf2,0x05,0x2f,0x00,0x99,0x00,0x07,0x00,0x0c,0xba,0x00,0x00,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,\r\n0x30,0x31,0x35,0x21,0x17,0x07,0x06,0x06,0x23,0x21,0x05,0x2a,0x05,0x1a,0x56,0xb9,0x6e,0xfc,0x68,0x99,0x05,0x84,0x0d,0x11,0x00,0x01,0x00,0x00,0xff,0xf2,0x05,0x2f,0x00,0x99,0x00,0x07,0x00,0x0c,0xba,0x00,0x00,0x04,0xfb,0x00,0x06,0x00,0x2f,0xed,0x30,0x31,0x35,0x21,0x17,0x07,0x06,0x06,0x23,0x21,0x05,0x2a,0x05,0x1a,0x56,0xb9,\r\n0x6e,0xfc,0x68,0x99,0x05,0x84,0x0d,0x11,0xff,0xff,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x02,0x06,0x14,0x99,0x00,0x00,0xff,0xff,0x00,0x73,0xff,0xf2,0x08,0xfe,0x00,0xc1,0x02,0x06,0x14,0x99,0x00,0x00,0x00,0x01,0x00,0xf2,0x02,0x84,0x02,0x5a,0x03,0xed,0x00,0x13,0x00,0x08,0xb1,0x0a,0x00,0x00,0x2f,0xcd,0x30,0x31,0x01,0x22,\r\n0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x01,0xa8,0x20,0x40,0x35,0x21,0x21,0x35,0x40,0x20,0x1f,0x40,0x33,0x20,0x20,0x33,0x40,0x02,0x84,0x20,0x34,0x3f,0x20,0x1f,0x41,0x34,0x22,0x21,0x35,0x41,0x1f,0x20,0x3f,0x34,0x20,0x00,0x00,0x01,0x01,0x2f,0x01,0x4a,0x02,0x1d,0x05,0x7d,0x00,0x0d,0x00,0x08,\r\n0xb1,0x06,0x00,0x00,0x2f,0x2f,0x30,0x31,0x01,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x01,0xb7,0x19,0x27,0x19,0x0d,0x84,0x0c,0x19,0x29,0x1c,0x05,0x7d,0x6c,0xb4,0xb1,0xbc,0x73,0xfe,0xcd,0x01,0x2d,0x67,0xb5,0xb5,0xc1,0x74,0x00,0x01,0x00,0x76,0x01,0x4a,0x02,0xd6,0x05,0x7d,0x00,0x0f,0x00,0x0a,0xb2,0x01,0x0f,0x08,\r\n0x00,0x2f,0x2f,0xcd,0x30,0x31,0x01,0x15,0x21,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0x02,0xd6,0xfe,0x4a,0x10,0x19,0x12,0x09,0x84,0x0c,0x19,0x29,0x1c,0x05,0x7d,0x97,0x4f,0x9b,0xa0,0xa9,0x5d,0xfe,0xf4,0x01,0x06,0x75,0xc5,0xbc,0xc3,0x74,0x00,0x00,0x01,0x00,0x25,0x01,0x4a,0x03,0x28,0x05,0x7d,0x00,0x3c,0x00,0x14,\r\n0xb7,0x35,0x2c,0x26,0x06,0x15,0x1d,0x00,0x0f,0x00,0x2f,0x33,0x33,0xdc,0x32,0xcd,0x32,0x2f,0x30,0x31,0x13,0x16,0x16,0x17,0x16,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x15,0x14,0x07,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x06,0x06,0x23,0x22,0x26,\r\n0x27,0x1e,0x03,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0xac,0x11,0x1b,0x0b,0x0c,0x17,0x0b,0x1f,0x2c,0x1b,0x0c,0x12,0x0f,0x84,0x1f,0x12,0x24,0x1e,0x1f,0x2c,0x1b,0x0c,0x12,0x0f,0x84,0x0e,0x10,0x1d,0x39,0x54,0x37,0x23,0x4c,0x2d,0x1b,0x42,0x25,0x0c,0x19,0x0d,0x06,0x0a,0x07,0x04,0x83,0x10,0x1c,0x27,0x17,0x05,0x7d,0x45,0x79,\r\n0x3a,0x03,0x02,0x13,0x21,0x2b,0x19,0x21,0x44,0x20,0x4b,0x45,0x36,0x2d,0x0a,0x13,0x21,0x2b,0x19,0x21,0x44,0x20,0x21,0x52,0x27,0x2c,0x51,0x3e,0x24,0x11,0x16,0x14,0x12,0x02,0x02,0x28,0x53,0x62,0x77,0x4c,0xfe,0xe1,0x01,0x1a,0x6c,0xcb,0xc4,0xbf,0x5f,0x00,0x00,0x01,0x00,0xab,0x01,0x38,0x02,0xa1,0x05,0x97,0x00,0x2f,0x00,0x0c,\r\n0xb3,0x25,0x24,0x0a,0x10,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x37,0x15,0x0e,0x03,0x15,0x14,0x1e,0x02,0x17,0x02,0x3f,0x5f,0x6c,0x36,0x0e,0x25,0x36,0x3d,0x18,0x39,0x58,0x30,0x62,0x65,\r\n0x37,0x6d,0x56,0x35,0x15,0x30,0x50,0x3c,0x39,0x4d,0x2e,0x14,0x24,0x55,0x8e,0x6b,0x56,0x66,0x34,0x0f,0x20,0x43,0x6a,0x4b,0x03,0x91,0x55,0x7b,0x56,0x33,0x0c,0x1c,0x22,0x12,0x06,0x0c,0x0d,0x96,0x21,0x17,0x31,0x4e,0x38,0x20,0x4d,0x5b,0x68,0x3a,0x1b,0x31,0x34,0x39,0x22,0x2d,0x58,0x55,0x4f,0x23,0x9f,0x1a,0x31,0x29,0x21,0x0a,\r\n0x11,0x22,0x28,0x33,0x22,0x00,0x00,0x02,0x00,0x62,0x01,0xbc,0x02,0xeb,0x04,0xf3,0x00,0x13,0x00,0x27,0x00,0x0c,0xb3,0x1e,0x0a,0x14,0x00,0x00,0x2f,0xcd,0x2f,0xcd,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x17,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,\r\n0x2e,0x02,0x01,0xa1,0x35,0x74,0x62,0x3f,0x2f,0x57,0x7c,0x4c,0x4a,0x75,0x51,0x2b,0x40,0x60,0x6f,0x2e,0x1c,0x41,0x37,0x25,0x1e,0x33,0x43,0x26,0x36,0x4c,0x30,0x15,0x29,0x3d,0x46,0x04,0xf3,0x40,0x7c,0xb8,0x78,0x4d,0x7a,0x56,0x2e,0x29,0x4e,0x70,0x47,0x78,0xc1,0x87,0x49,0x94,0x35,0x5e,0x84,0x4f,0x2e,0x3f,0x26,0x11,0x18,0x2c,\r\n0x3c,0x23,0x54,0x85,0x5d,0x31,0x00,0x01,0x00,0x42,0x01,0x4a,0x03,0x0a,0x05,0x7d,0x00,0x13,0x00,0x0a,0xb2,0x13,0x08,0x0a,0x00,0x2f,0xcd,0x2f,0x30,0x31,0x01,0x2e,0x05,0x27,0x27,0x21,0x35,0x21,0x17,0x1e,0x05,0x17,0x02,0x80,0x17,0x21,0x17,0x0e,0x0a,0x06,0x03,0x03,0xfe,0x35,0x02,0x4a,0x05,0x03,0x07,0x0a,0x0f,0x19,0x23,0x1a,\r\n0x01,0x4a,0x60,0x96,0x7e,0x70,0x79,0x8a,0x59,0x5c,0x97,0x94,0x68,0xa1,0x89,0x7d,0x88,0xa1,0x67,0x00,0x00,0x01,0x00,0x1c,0x01,0x47,0x03,0x30,0x05,0x7d,0x00,0x13,0x00,0x0c,0xb3,0x03,0x0e,0x07,0x00,0x00,0x2f,0x32,0x2f,0x33,0x30,0x31,0x13,0x16,0x12,0x17,0x33,0x36,0x12,0x37,0x33,0x06,0x0a,0x02,0x07,0x23,0x26,0x0a,0x02,0x27,\r\n0xa5,0x49,0x7d,0x39,0x04,0x3a,0x7d,0x49,0x88,0x32,0x59,0x53,0x4c,0x24,0x78,0x27,0x4e,0x53,0x57,0x2f,0x05,0x7d,0xc7,0xfe,0x64,0xdf,0xdf,0x01,0x9d,0xc6,0x89,0xfe,0xf5,0xfe,0xf5,0xfe,0xf3,0x8a,0x91,0x01,0x12,0x01,0x0b,0x01,0x05,0x83,0x00,0x01,0x00,0x1d,0x01,0x4a,0x03,0x30,0x05,0x80,0x00,0x13,0x00,0x0c,0xb3,0x03,0x0d,0x00,\r\n0x07,0x00,0x2f,0x33,0x2f,0x33,0x30,0x31,0x01,0x26,0x02,0x27,0x23,0x06,0x02,0x07,0x23,0x36,0x1a,0x02,0x37,0x33,0x16,0x1a,0x02,0x17,0x02,0xa8,0x4a,0x7d,0x38,0x05,0x39,0x7e,0x48,0x88,0x31,0x59,0x52,0x4d,0x25,0x78,0x26,0x4e,0x53,0x57,0x2f,0x01,0x4a,0xc7,0x01,0x9b,0xe0,0xe0,0xfe,0x64,0xc6,0x88,0x01,0x0b,0x01,0x0b,0x01,0x0e,\r\n0x8a,0x90,0xfe,0xed,0xfe,0xf6,0xfe,0xfa,0x83,0x00,0x00,0x02,0x00,0x3c,0x01,0x4a,0x03,0x10,0x05,0x87,0x00,0x1e,0x00,0x33,0x00,0x10,0xb5,0x07,0x31,0x31,0x1e,0x27,0x11,0x00,0x2f,0xcd,0x2f,0x39,0x2f,0xcd,0x30,0x31,0x01,0x2e,0x03,0x27,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x1e,0x03,0x17,0x1e,0x03,\r\n0x17,0x01,0x2e,0x03,0x27,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x02,0x88,0x1f,0x28,0x1b,0x10,0x06,0x5d,0x55,0x3b,0x6a,0x4f,0x2e,0x27,0x4a,0x6a,0x43,0x41,0x6a,0x2d,0x18,0x1d,0x11,0x09,0x05,0x05,0x0f,0x1e,0x31,0x27,0xfe,0xf3,0x03,0x05,0x07,0x09,0x07,0x19,0x4d,0x33,0x1f,0x35,0x26,0x15,0x1c,0x30,\r\n0x42,0x27,0x22,0x4a,0x01,0x4a,0x47,0x8a,0x81,0x77,0x34,0x29,0x26,0x4a,0x6c,0x46,0x3f,0x76,0x5b,0x37,0x3b,0x47,0x26,0x4b,0x51,0x5c,0x38,0x3b,0x85,0x97,0xab,0x63,0x02,0x86,0x1b,0x2b,0x25,0x21,0x11,0x3d,0x44,0x1b,0x2d,0x3b,0x20,0x25,0x3a,0x27,0x14,0x10,0x00,0x01,0x00,0x69,0x01,0x4a,0x02,0xe4,0x05,0x92,0x00,0x31,0x00,0x12,\r\n0xb6,0x22,0x17,0x17,0x2a,0x0d,0x00,0x07,0x00,0x2f,0x33,0xcd,0x2f,0x39,0x2f,0xcd,0x30,0x31,0x13,0x17,0x33,0x3e,0x03,0x33,0x32,0x16,0x17,0x15,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x37,0x15,0x0e,0x03,0x23,0x22,0x26,0x27,0x07,0x16,0x16,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x27,0xf0,0x21,0x04,0x0d,\r\n0x32,0x46,0x59,0x35,0x16,0x36,0x1d,0x33,0x36,0x30,0x58,0x42,0x28,0x1e,0x31,0x3c,0x1e,0x24,0x48,0x43,0x3d,0x19,0x12,0x37,0x45,0x4d,0x27,0x2a,0x53,0x1d,0x03,0x0a,0x07,0x83,0x0b,0x19,0x28,0x1e,0x05,0x7d,0x92,0x21,0x3d,0x2e,0x1b,0x05,0x08,0x95,0x0c,0x12,0x22,0x30,0x1d,0x1a,0x25,0x18,0x0b,0x0e,0x17,0x1e,0x10,0x9a,0x0e,0x1c,\r\n0x16,0x0f,0x14,0x17,0x02,0x48,0xac,0x53,0xfe,0xe5,0x01,0x16,0x6a,0xba,0xba,0xc8,0x77,0x00,0x00,0x02,0x00,0x3c,0x01,0x36,0x03,0x10,0x05,0x81,0x00,0x1e,0x00,0x3c,0x00,0x12,0xb6,0x3c,0x3a,0x24,0x03,0x1b,0x30,0x0f,0x00,0x2f,0xcd,0x2f,0x33,0xdd,0x32,0xcc,0x30,0x31,0x01,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x04,0x33,\r\n0x32,0x1e,0x04,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x37,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x01,0xa3,0x20,0x4c,0x2e,0x25,0x49,0x3b,0x24,0x22,0x38,0x4b,0x52,0x53,0x26,0x25,0x51,0x4f,0x48,0x37,0x20,0x27,0x3d,0x4d,0x26,0x2c,0x49,0x1c,0x36,0x0a,\r\n0x15,0x21,0x16,0x23,0x25,0x10,0x02,0x16,0x25,0x30,0x35,0x35,0x18,0x23,0x50,0x44,0x2c,0x0e,0x18,0x21,0x13,0x50,0x06,0x01,0xa3,0x3c,0x31,0x22,0x55,0x91,0x70,0x6b,0xbe,0xa1,0x80,0x59,0x30,0x2e,0x57,0x7d,0x9c,0xba,0x68,0x74,0x98,0x5a,0x25,0x31,0x3c,0xcb,0x1f,0x37,0x29,0x18,0x33,0x47,0x48,0x15,0x53,0x96,0x81,0x68,0x49,0x28,\r\n0x59,0x9a,0xd2,0x78,0x41,0x57,0x34,0x16,0x9c,0x00,0x00,0x01,0x00,0x6f,0x01,0x3a,0x02,0xdd,0x05,0x86,0x00,0x25,0x00,0x1b,0x40,0x0c,0x20,0x00,0x07,0x03,0x03,0x25,0x25,0x03,0x16,0x10,0x04,0x03,0x00,0x2f,0x33,0x2f,0xcd,0x11,0x39,0x2f,0x12,0x17,0x39,0x30,0x31,0x01,0x06,0x00,0x07,0x27,0x36,0x36,0x37,0x27,0x26,0x26,0x35,0x34,\r\n0x3e,0x02,0x33,0x32,0x17,0x15,0x26,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x37,0x36,0x36,0x37,0x02,0xdd,0xa7,0xfe,0xde,0x83,0x22,0x43,0xa6,0x5e,0x01,0x6e,0x76,0x30,0x57,0x79,0x4a,0x2d,0x3e,0x1d,0x3b,0x1a,0x27,0x46,0x33,0x1e,0x19,0x2c,0x3b,0x21,0x34,0x35,0x1d,0x3c,0x24,0x03,0x78,0x4e,0xfe,0xe3,0xd3,0xaf,\r\n0x6d,0xbe,0x4c,0x03,0x16,0x88,0x69,0x42,0x69,0x4a,0x27,0x09,0x99,0x05,0x05,0x0f,0x22,0x37,0x28,0x25,0x36,0x24,0x11,0x13,0x11,0x22,0x12,0x00,0x00,0x01,0x00,0x41,0x01,0x4a,0x03,0x0b,0x05,0x88,0x00,0x29,0x00,0x0e,0xb4,0x04,0x09,0x29,0x20,0x16,0x00,0x2f,0x2f,0x33,0xdd,0xce,0x30,0x31,0x01,0x06,0x06,0x07,0x23,0x2e,0x03,0x23,\r\n0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x15,0x11,0x23,0x11,0x34,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x17,0x33,0x36,0x36,0x37,0x03,0x0b,0x42,0x54,0x1c,0x7a,0x0d,0x29,0x35,0x40,0x25,0x15,0x1a,0x0f,0x06,0x08,0x0c,0x0d,0x0c,0x08,0x83,0x13,0x16,0x13,0x67,0x5e,0x34,0x56,0x44,0x30,0x0e,0x04,0x14,0x30,0x1d,0x05,0x7d,0x61,\r\n0xc2,0x71,0x36,0x60,0x46,0x29,0x0b,0x13,0x19,0x0d,0x11,0x2b,0x3b,0x52,0x73,0x99,0x65,0xfe,0xda,0x01,0x10,0x93,0xd0,0x8e,0x5b,0x1e,0x5b,0x69,0x29,0x3f,0x4e,0x25,0x3c,0x65,0x2f,0x00,0x00,0x01,0x00,0x6b,0x01,0x47,0x02,0xe1,0x05,0x7d,0x00,0x12,0x00,0x0c,0xb3,0x00,0x0f,0x11,0x08,0x00,0x2f,0x2f,0xcd,0x32,0x30,0x31,0x13,0x3e,\r\n0x05,0x37,0x33,0x0e,0x05,0x07,0x21,0x15,0x21,0x6b,0x25,0x3f,0x33,0x28,0x1e,0x13,0x05,0x83,0x06,0x12,0x19,0x21,0x27,0x2f,0x1a,0x01,0xc0,0xfd,0x8a,0x01,0x8b,0x45,0x83,0x89,0x98,0xb2,0xd5,0x82,0x82,0xd1,0xaa,0x8a,0x77,0x6b,0x36,0x97,0xff,0xff,0x00,0x39,0xfd,0xff,0x03,0x72,0x05,0x5f,0x02,0x26,0x0f,0x98,0x00,0x00,0x00,0x07,\r\n0x0a,0x1f,0x01,0x09,0xfc,0xd3,0xff,0xff,0x00,0x9a,0xfd,0xd3,0x05,0x74,0x04,0x24,0x02,0x26,0x0f,0xab,0x00,0x00,0x00,0x27,0x0a,0x1f,0x02,0x00,0xfb,0x98,0x00,0x07,0x0f,0x51,0x02,0x01,0xfd,0xd8,0x00,0x01,0x00,0x55,0xff,0xe8,0x04,0x79,0x05,0x9a,0x00,0x2d,0x00,0x14,0x40,0x09,0x0e,0x0e,0x05,0x24,0x03,0x16,0x91,0x05,0x13,0x00,\r\n0x3f,0xed,0x3f,0x12,0x39,0x2f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x27,0x2e,0x03,0x27,0x33,0x1e,0x03,0x17,0x1e,0x03,0x04,0x79,0x4e,0x8f,0xc7,0x78,0x78,0xc1,0x87,0x48,0x0c,0x10,0xb4,0x0e,0x12,0x2c,0x58,0x83,0x58,0xb1,\r\n0xb4,0x1e,0x35,0x49,0x2b,0x2f,0x57,0x44,0x2c,0x04,0xa8,0x03,0x22,0x38,0x4c,0x2e,0x2b,0x57,0x45,0x2b,0x01,0xdc,0x7b,0xbb,0x7e,0x40,0x43,0x75,0x9e,0x5b,0x27,0x52,0x2a,0x21,0x50,0x33,0x3e,0x67,0x4b,0x29,0xa9,0xae,0x40,0x6f,0x62,0x56,0x28,0x2c,0x67,0x85,0xab,0x72,0x60,0x89,0x69,0x57,0x2e,0x2c,0x60,0x74,0x8e,0x00,0x00,0x02,\r\n0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0x9a,0x00,0x2f,0x00,0x41,0x00,0x1c,0x40,0x0e,0x3d,0x91,0x26,0x13,0x12,0x00,0x10,0x03,0x03,0x1c,0x35,0x91,0x00,0x10,0x00,0x3f,0xed,0x39,0x39,0x3f,0x12,0x39,0x3f,0xed,0x30,0x31,0x01,0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x06,0x35,0x35,0x33,0x15,0x14,0x1e,0x04,0x15,0x14,0x06,0x07,0x1e,\r\n0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x9f,0x0e,0x1b,0x0e,0x01,0x01,0x20,0x35,0x44,0x46,0x44,0x35,0x20,0xa4,0x38,0x55,0x62,0x55,0x38,0x04,0x02,0x4d,0x74,0x4d,0x26,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,\r\n0xcf,0x01,0xec,0x33,0x5b,0x80,0x4c,0xb8,0xc4,0x32,0x5f,0x89,0x58,0x58,0x85,0x5a,0x2d,0x04,0x17,0x01,0x01,0x05,0x0a,0x05,0x18,0x1e,0x16,0x11,0x17,0x20,0x34,0x4b,0x36,0x28,0x28,0x1f,0x23,0x1d,0x1d,0x33,0x4f,0x40,0x0b,0x27,0x0f,0x1c,0x60,0x80,0x9c,0x57,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0xfd,0xe7,\r\n0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0x34,0x62,0x8f,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0xae,0x00,0x2f,0x00,0x41,0x00,0x21,0x40,0x11,0x3d,0x91,0x26,0x13,0x10,0x10,0x00,0x0b,0x91,0x16,0x04,0x03,0x1e,0x35,0x91,0x00,0x10,0x00,0x3f,0xed,0x39,0x39,0x3f,0xed,0x12,0x39,0x2f,0x3f,0xed,0x30,0x31,0x01,\r\n0x32,0x16,0x17,0x36,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x02,0x9f,0x26,0x46,0x21,0x07,0x08,0x1a,0x2f,\r\n0x40,0x27,0x2f,0x47,0x2f,0x17,0xaf,0x35,0x60,0x86,0x50,0x51,0x82,0x5b,0x32,0x14,0x0c,0x73,0x70,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,0xcf,0x01,0xec,0x33,0x5b,0x80,0x4c,0xb8,0xc4,0x32,0x5f,0x89,0x58,0x58,0x85,0x5a,0x2d,0x04,0x17,0x07,0x07,0x17,0x35,0x22,0x29,0x3d,0x28,0x13,0x17,0x27,0x36,0x1f,0x43,0x6e,0x4e,\r\n0x2a,0x2a,0x50,0x71,0x46,0x39,0x58,0x1f,0x45,0xed,0x97,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0xfd,0xe7,0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0x34,0x62,0x8f,0x00,0x02,0x00,0x82,0xff,0xe0,0x06,0xac,0x05,0xaf,0x00,0x42,0x00,0x52,0x00,0x34,0x40,0x1b,0x1f,0x2e,0x2a,0x92,0x33,0x50,0x91,0x0a,\r\n0x33,0x0a,0x33,0x0a,0x25,0x15,0x91,0x3d,0x04,0x24,0x25,0x13,0x12,0x40,0x40,0x48,0x91,0x00,0x04,0x00,0x3f,0xed,0x39,0x11,0x33,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x10,0xed,0x39,0x39,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x23,0x22,0x0e,0x02,\r\n0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x17,0x07,0x2e,0x03,0x23,0x22,0x06,0x07,0x35,0x3e,0x03,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x04,0xdf,0x6a,0xab,0x78,0x40,0x40,0x78,0xab,0x6a,0x6a,0xb1,0x7f,0x47,0x29,0x26,0x38,0x6d,0x31,\r\n0x4e,0x79,0x53,0x2b,0x59,0x94,0xc0,0x67,0x57,0xa4,0x9b,0x91,0x45,0x5d,0x44,0xbb,0xd2,0xda,0x63,0x78,0xc1,0x3c,0x1b,0x46,0x4d,0x50,0x25,0x52,0x89,0x62,0x36,0x48,0x85,0xbb,0x73,0x55,0x9a,0x47,0x3e,0x97,0x01,0x74,0x21,0x46,0x6c,0x4a,0x4b,0x72,0x4d,0x27,0x9b,0x96,0x95,0x88,0x05,0xaf,0x42,0x7d,0xb6,0x75,0x75,0xb6,0x7d,0x40,\r\n0x41,0x7e,0xb6,0x75,0x56,0x90,0x39,0x22,0x11,0x38,0x67,0x93,0x5a,0x82,0xb6,0x7f,0x54,0x20,0x1b,0x35,0x3e,0x4a,0x2f,0x7b,0x33,0x5b,0x45,0x28,0x23,0x1b,0x9c,0x0a,0x11,0x0d,0x08,0x02,0x22,0x68,0x8a,0xab,0x66,0x7e,0xca,0x8c,0x4b,0x25,0x37,0x2d,0x2f,0xfe,0x16,0x52,0x7e,0x57,0x2d,0x32,0x5a,0x7c,0x4a,0xa5,0xaf,0xad,0x00,0x01,\r\n0x00,0x64,0xff,0xe8,0x04,0x87,0x05,0xb2,0x00,0x31,0x00,0x1b,0x40,0x0d,0x26,0x0e,0x26,0x0e,0x05,0x21,0x91,0x2c,0x04,0x16,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,\r\n0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x04,0x87,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x2d,0x51,0x72,0x44,0x42,0x6c,0x4b,0x29,0xb0,0x48,0x7e,0xaa,0x62,0x62,0xae,0x81,0x4b,0x01,0xda,0x71,0xb7,0x83,0x47,0x44,\r\n0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x02,0x27,0x44,0x68,0x47,0x25,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x35,0x66,0x96,0x61,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0xb2,0x00,0x41,0x00,0x22,0x40,0x11,0x3d,0x1f,0x2d,0x22,0x91,0x0d,0x1f,0x1f,0x05,0x2a,0x91,0x33,\r\n0x04,0x15,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xce,0xfd,0xce,0x12,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x3e,0x02,\r\n0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x04,0x93,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x52,0x6b,0x3f,0x1a,0x7f,0x82,0x79,0x8c,0xb0,0x40,0x75,0xa5,0x65,0x5c,0x9b,0x71,0x3f,0x21,0x3f,0x5d,0x3c,0x43,0x76,0x59,0x33,\r\n0x01,0xb2,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x60,0x6b,0x68,0x6b,0x5c,0x88,0x5a,0x2c,0x31,0x5c,0x81,0x50,0x3b,0x66,0x4e,0x34,0x09,0x08,0x3c,0x61,0x83,0x00,0x00,0x03,0x00,0x28,0xff,0xe8,0x05,0xfe,0x05,0xb2,\r\n0x00,0x27,0x00,0x37,0x00,0x45,0x00,0x24,0x40,0x13,0x1e,0x3b,0x91,0x23,0x10,0x0b,0x33,0x91,0x10,0x10,0x05,0x2b,0x91,0x1a,0x04,0x43,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x3f,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,\r\n0x33,0x32,0x16,0x15,0x15,0x3e,0x03,0x33,0x32,0x1e,0x02,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x01,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x05,0xfe,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0x0d,0x28,0x2e,0x34,0x19,0x41,0x70,0x53,0x30,0x2f,0x56,0x79,0x49,0x9e,0xa1,0x21,\r\n0x53,0x5d,0x63,0x31,0x6e,0xb5,0x81,0x47,0xfc,0x0e,0x58,0x45,0x45,0x58,0x18,0x2a,0x39,0x21,0x21,0x3a,0x2a,0x19,0x03,0x40,0xa8,0x9d,0x4f,0x80,0x5a,0x30,0xaa,0xaf,0xa5,0xa0,0x02,0x16,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x01,0x70,0x0d,0x16,0x0f,0x09,0x2a,0x51,0x73,0x4a,0x4a,0x76,0x53,0x2c,0x9b,0x9c,0xf7,0x29,0x38,0x22,\r\n0x0f,0x42,0x82,0xbf,0x01,0xe2,0x54,0x52,0x52,0x54,0x2c,0x3e,0x28,0x12,0x12,0x28,0x3e,0xfd,0xc7,0xbf,0xb1,0x2d,0x5b,0x8c,0x60,0xc4,0xca,0xcb,0x00,0x02,0x00,0x82,0xff,0xe8,0x07,0x4c,0x05,0xb2,0x00,0x28,0x00,0x36,0x00,0x20,0x40,0x11,0x10,0x23,0x23,0x0e,0x91,0x26,0x04,0x2c,0x91,0x21,0x04,0x34,0x91,0x17,0x13,0x06,0x12,0x00,\r\n0x3f,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x39,0x11,0x33,0x30,0x31,0x01,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x10,0x02,0x23,0x22,0x07,0x16,0x11,0x14,0x02,0x06,0x06,0x23,0x22,0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x36,0x33,0x32,0x17,0x36,0x36,0x33,0x32,0x00,0x01,0x10,0x02,0x23,0x22,0x02,0x11,0x14,0x1e,0x02,0x33,0x32,0x12,0x07,\r\n0x4c,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0xae,0xb4,0x91,0x58,0x61,0x4a,0x8b,0xca,0x7f,0x73,0xc3,0x8d,0x4f,0x4c,0x8e,0xce,0x82,0xc6,0x7d,0x44,0xac,0x67,0xf9,0x01,0x0d,0xfc,0xb6,0xae,0xb4,0xb2,0xbc,0x32,0x5e,0x88,0x56,0xac,0xb6,0x02,0xc0,0x80,0xd2,0xab,0x8a,0x39,0x3a,0x9c,0xb8,0xcd,0x6b,0x01,0x2a,0x01,0x2c,0x60,\r\n0xb7,0xfe,0xc7,0xba,0xfe,0xea,0xb8,0x5c,0x53,0xaf,0x01,0x12,0xc0,0xc0,0x01,0x1c,0xbd,0x5d,0x75,0x3c,0x39,0xfe,0x89,0xfe,0x8b,0x01,0x2a,0x01,0x2b,0xfe,0xd4,0xfe,0xd3,0x97,0xda,0x8e,0x44,0x01,0x1f,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x04,0xb2,0x05,0xb2,0x00,0x24,0x00,0x0f,0xb6,0x0b,0x1a,0x12,0x12,0x91,0x00,0x04,0x00,0x3f,\r\n0xed,0x3f,0x33,0x30,0x31,0x01,0x32,0x16,0x16,0x12,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x10,0x21,0x22,0x02,0x11,0x14,0x1e,0x02,0x17,0x23,0x2e,0x03,0x35,0x34,0x12,0x36,0x36,0x02,0xa7,0x7c,0xc3,0x86,0x46,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0xfe,0x9c,0xb4,0xb8,0x1e,0x34,0x49,0x2b,0xc9,0x20,0x3e,0x31,0x1e,\r\n0x4b,0x8e,0xcb,0x05,0xb2,0x5e,0xbc,0xfe,0xe5,0xbd,0x80,0xd2,0xab,0x8a,0x39,0x3a,0x9c,0xb6,0xc9,0x67,0x02,0x60,0xfe,0xd4,0xfe,0xd6,0x6b,0xcd,0xb8,0x9c,0x3a,0x39,0x8a,0xab,0xd2,0x80,0xbd,0x01,0x1b,0xbc,0x5e,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0xb2,0x00,0x3a,0x00,0x1e,0x40,0x0f,0x36,0x23,0x91,0x0e,0x20,0x20,\r\n0x05,0x2b,0x91,0x2c,0x04,0x16,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x23,0x35,0x32,0x1e,0x02,\r\n0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x04,0x93,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x0e,0x0f,0xb8,0x12,0x14,0x36,0x60,0x83,0x4c,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x52,0x6b,0x3f,0x1a,0x7b,0x83,0x63,0x9f,0x70,0x3c,0x21,0x40,0x5e,0x3d,0x45,0x78,0x58,0x33,0x01,0xb2,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,\r\n0x26,0x52,0x2c,0x26,0x4f,0x2e,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x60,0x6b,0x97,0x31,0x5c,0x81,0x50,0x3b,0x65,0x4e,0x34,0x0a,0x09,0x3c,0x61,0x82,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x08,0x12,0x05,0xb3,0x00,0x5c,0x00,0x3d,0x40,0x21,0x48,0x3e,0x0e,0x0a,0x07,0x91,0x57,0x0b,\r\n0x57,0x3e,0x2e,0x57,0x57,0x2e,0x3e,0x03,0x00,0x39,0x91,0x24,0x04,0x21,0x1b,0x42,0x91,0x1e,0x04,0x4d,0x91,0x18,0x04,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x32,0x32,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x33,0x10,0xed,0x32,0x39,0x11,0x33,0x30,0x31,0x21,0x2e,0x05,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x37,0x2e,0x03,\r\n0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x16,0x04,0x04,0x16,\r\n0x17,0x05,0xf6,0x0c,0x50,0x7a,0x9e,0xb3,0xc4,0x63,0x7e,0xf0,0x68,0x3c,0x93,0x55,0x66,0x8e,0x58,0x28,0x2b,0x59,0x88,0x5c,0x6d,0x9a,0x2f,0x27,0x9a,0x67,0x65,0x9d,0x26,0x32,0x93,0x66,0x54,0x8b,0x62,0x36,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x20,0x36,0x48,0x29,0x73,0x64,0xa8,0x63,0x73,0x39,0x4f,0x31,0x15,0xa8,0x64,\r\n0x73,0x2c,0x49,0x35,0x1d,0x43,0x6f,0x8e,0x4b,0xc7,0x01,0x59,0x01,0x0b,0xb0,0x1f,0x1c,0x38,0x31,0x2a,0x1e,0x11,0x1f,0x22,0x9c,0x11,0x16,0x05,0x33,0x85,0x9c,0xb0,0x5f,0x62,0xb2,0x87,0x50,0x5b,0x65,0x65,0x5b,0x61,0x5f,0x66,0x5a,0x3e,0x7c,0xbb,0x7c,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x62,0x85,0x52,0x23,0xac,\r\n0xae,0x88,0x88,0xae,0xac,0x2b,0x57,0x81,0x57,0x88,0x88,0xae,0xac,0x26,0x53,0x84,0x5f,0x77,0xb9,0x8e,0x67,0x23,0x0f,0x39,0x5c,0x80,0x55,0x00,0x00,0x02,0x00,0x82,0xff,0xe8,0x04,0x74,0x05,0xb2,0x00,0x2a,0x00,0x3a,0x00,0x1e,0x40,0x0f,0x14,0x36,0x91,0x1f,0x0f,0x0f,0x05,0x1a,0x91,0x25,0x04,0x2e,0x91,0x05,0x13,0x00,0x3f,0xed,\r\n0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x04,0x74,0x47,0x82,0xb7,\r\n0x6f,0x7a,0xc0,0x84,0x45,0x47,0x81,0xb5,0x6e,0x31,0x62,0x5c,0x50,0x20,0x2e,0x52,0x72,0x44,0x42,0x6f,0x4f,0x2c,0xb0,0x4b,0x81,0xae,0x62,0x62,0xae,0x82,0x4c,0xfc,0xbe,0xa2,0xa5,0xaf,0xa4,0x2f,0x57,0x7e,0x4f,0x4e,0x7a,0x54,0x2b,0x01,0xfc,0x7f,0xc6,0x88,0x47,0x48,0x8c,0xcc,0x84,0x7d,0xbc,0x7e,0x3f,0x0f,0x23,0x38,0x29,0x92,\r\n0x45,0x69,0x47,0x25,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x32,0x63,0x92,0x61,0xfd,0xdc,0xc7,0xc1,0xc0,0xc4,0x60,0x89,0x58,0x29,0x28,0x57,0x87,0x00,0x00,0x02,0x00,0xa0,0xff,0xe8,0x04,0x92,0x05,0xb2,0x00,0x30,0x00,0x40,0x00,0x2b,0x40,0x16,0x21,0x2b,0x91,0x18,0x26,0x91,0x1d,0x1d,0x18,0x00,0x36,0x91,0x05,0x05,0x0f,0x20,\r\n0x18,0x04,0x3e,0x91,0x0f,0x13,0x00,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0xed,0x39,0x11,0x33,0x2f,0xed,0x10,0xed,0x32,0x30,0x31,0x01,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x37,0x15,0x0e,0x03,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,\r\n0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x01,0x42,0x21,0x53,0x5d,0x63,0x31,0x6e,0xb5,0x81,0x47,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0xa3,0xac,0x2b,0x63,0x5f,0x55,0x1e,0x2a,0x74,0x38,0x17,0x36,0x38,0x36,0x18,0x2e,0x62,0x5e,0x56,0x22,0x2e,0x41,0x28,0x13,0x02,0xa6,0x2d,0x56,0x7c,0x4e,0x4f,\r\n0x80,0x5a,0x30,0xaa,0xaf,0xa5,0xa8,0x03,0x84,0x29,0x38,0x22,0x0f,0x42,0x82,0xbf,0x7d,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x02,0x5a,0xa9,0xa9,0x16,0x1a,0x16,0x21,0x23,0xaa,0x0c,0x12,0x0c,0x06,0x16,0x1a,0x16,0x10,0x28,0x42,0x33,0xfd,0xa1,0x60,0x8b,0x5a,0x2b,0x2d,0x5b,0x8c,0x60,0xc4,0xca,0xcb,0x00,0x00,0x01,0x00,0x82,\r\n0x00,0x00,0x06,0xf8,0x05,0xb4,0x00,0x3e,0x00,0x20,0x40,0x10,0x2a,0x25,0x0c,0x0c,0x2f,0x1c,0x3a,0x12,0x05,0x91,0x2f,0x04,0x12,0x91,0x25,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x33,0x12,0x39,0x2f,0x12,0x39,0x30,0x31,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,\r\n0x02,0x17,0x23,0x2e,0x03,0x35,0x10,0x12,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x06,0x48,0x21,0x46,0x6c,0x4a,0x3a,0x67,0x4e,0x2d,0xa4,0x2d,0x4e,0x67,0x3a,0x4a,0x6c,0x46,0x21,0x1e,0x34,0x49,0x2b,0xc9,0x20,0x3e,0x31,0x1e,0xee,0xe2,0x36,0x6e,0x62,0x4f,0x16,0x13,\r\n0x4f,0x68,0x78,0x3d,0x69,0xa5,0x72,0x3c,0x1e,0x31,0x3e,0x20,0xc9,0x2b,0x49,0x34,0x1e,0x02,0xbc,0x91,0xe2,0x9c,0x52,0x46,0x86,0xc4,0x7e,0x6e,0x6e,0x7e,0xc4,0x86,0x46,0x4e,0x98,0xde,0x91,0x73,0xd0,0xb5,0x96,0x3a,0x39,0x8a,0xac,0xd2,0x80,0x01,0x77,0x01,0x7c,0x23,0x4a,0x76,0x52,0x52,0x75,0x4b,0x23,0x61,0xbf,0xfe,0xe3,0xbb,\r\n0x81,0xd0,0xa9,0x89,0x39,0x3a,0x96,0xb2,0xcb,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x93,0x05,0x9a,0x00,0x43,0x00,0x1f,0x40,0x0f,0x3b,0x01,0x0f,0x36,0x91,0x21,0x33,0x33,0x01,0x29,0x91,0x19,0x13,0x01,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x11,0x39,0x30,0x31,0x01,0x33,0x1e,0x07,0x15,0x14,0x0e,0x02,0x07,\r\n0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x06,0x01,0x12,0xbe,0x04,0x3a,0x5a,0x71,0x75,0x6f,0x57,0x35,0x24,0x41,0x5d,0x39,0x43,0x76,0x59,0x33,0x5a,0x94,0xbf,0x66,0x75,0xc3,\r\n0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0xd4,0xce,0x4f,0x6d,0x44,0x1e,0x36,0x58,0x71,0x78,0x74,0x5e,0x3e,0x05,0x9a,0x23,0x2a,0x1b,0x11,0x16,0x21,0x38,0x56,0x41,0x2e,0x50,0x40,0x2c,0x09,0x08,0x3c,0x61,0x83,0x4e,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,\r\n0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x1e,0x2e,0x38,0x1a,0x28,0x2f,0x1c,0x12,0x15,0x20,0x39,0x5a,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0xc3,0x05,0xb2,0x00,0x42,0x00,0x35,0x40,0x1e,0x3e,0x1a,0x92,0x00,0x0e,0x00,0x0e,0x00,0x20,0xb0,0x30,0xc0,0x30,0xd0,0x30,0x03,0x30,0x13,0x91,0x08,0x08,0x21,\r\n0x38,0x91,0x27,0x13,0x21,0x04,0x20,0x03,0x00,0x3f,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0xce,0x5d,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x37,0x32,0x3e,0x02,0x37,0x33,0x07,0x11,0x14,0x0e,0x02,0x23,\r\n0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x02,0xf1,0x14,0x13,0x2a,0x53,0x7c,0x52,0x3f,0x81,0x68,0x41,0xaa,0x20,0x33,0x3f,0x1f,0x52,0x5d,0x2a,0x31,0x37,0x5e,0x9c,0x86,0x76,0x37,0x4c,0x01,0x4a,0x8b,0xca,0x80,0x75,0xc1,0x8b,0x4c,0x0f,0x10,0xb6,0x0f,0x16,\r\n0x30,0x5e,0x88,0x59,0x57,0x85,0x5a,0x2f,0x18,0x44,0x4e,0x55,0x04,0x7c,0x23,0x4a,0x25,0x39,0x6a,0x52,0x31,0x21,0x4b,0x78,0x58,0x2f,0x3f,0x27,0x11,0x4d,0x51,0x2b,0x43,0x1c,0x83,0x10,0x27,0x43,0x33,0x02,0xfc,0x2a,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,\r\n0x02,0xe8,0x0e,0x18,0x14,0x0c,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0xd0,0x05,0x9a,0x00,0x54,0x00,0x44,0x40,0x14,0x17,0x45,0x91,0x1e,0x3e,0x1b,0x1b,0x38,0x91,0x23,0x80,0x23,0x90,0x23,0xa0,0x23,0xe0,0x23,0x04,0x23,0xb8,0xff,0xc0,0x40,0x11,0x09,0x0d,0x48,0x3e,0x23,0x3e,0x23,0x0d,0x4f,0x2d,0x12,0x12,0x91,0x07,0x07,0x0d,0x03,\r\n0x00,0x3f,0x33,0x2f,0xed,0x3f,0x33,0x12,0x39,0x39,0x2f,0x2f,0x2b,0x5d,0x10,0xed,0x33,0x2f,0x12,0x39,0xed,0x39,0x30,0x31,0x13,0x34,0x3e,0x04,0x37,0x3e,0x03,0x37,0x33,0x0e,0x03,0x07,0x0e,0x03,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,\r\n0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x23,0x2e,0x03,0x82,0x3f,0x6a,0x8d,0x9b,0xa0,0x49,0x55,0x6c,0x42,0x24,0x0d,0xb5,0x10,0x49,0x77,0xa8,0x6f,0x4d,0x8b,0x72,0x58,0x1a,0x05,0x22,0x4f,0x28,0x6a,0x88,0x1b,0x0e,0x3d,0x51,0x5f,0x2f,0x54,0x8b,0x63,0x37,0x1d,0x2f,\r\n0x3c,0x1f,0xc2,0x23,0x45,0x36,0x21,0x22,0x39,0x4b,0x29,0x3b,0x53,0x33,0x17,0xa2,0x14,0x32,0x54,0x40,0x2f,0x4f,0x39,0x20,0x23,0x37,0x44,0x21,0xc2,0x1f,0x3c,0x2f,0x1d,0x02,0x26,0xab,0xf2,0xa4,0x62,0x38,0x18,0x09,0x0a,0x13,0x1a,0x25,0x1c,0x42,0x58,0x3c,0x27,0x10,0x0b,0x11,0x20,0x3b,0x34,0x1d,0x1a,0x7c,0x85,0x45,0x61,0x3d,\r\n0x1d,0x3e,0x7d,0xbb,0x7c,0x66,0xa3,0x85,0x6b,0x2d,0x29,0x6b,0x88,0xa6,0x64,0x62,0x85,0x52,0x23,0x37,0x60,0x83,0x4c,0x30,0x30,0x4d,0x83,0x60,0x36,0x29,0x56,0x83,0x5a,0x64,0xa6,0x88,0x6b,0x29,0x2d,0x6d,0x87,0xa2,0x00,0x01,0x00,0xa0,0xff,0xe8,0x04,0xac,0x05,0x9a,0x00,0x27,0x00,0x18,0x40,0x0b,0x23,0x15,0x1f,0x1f,0x05,0x0c,\r\n0x03,0x10,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x39,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x04,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x04,0xac,0x46,0x83,0xbb,0x75,0x80,0xc6,0x87,0x46,0xa2,0xb2,0xad,0x58,0x85,\r\n0x58,0x2c,0x13,0x1e,0x21,0x1e,0x13,0x15,0x1b,0xb1,0x15,0x22,0x29,0x31,0x29,0x01,0x98,0x5a,0x9d,0x75,0x44,0x47,0x83,0xb7,0x71,0x03,0xc0,0xfc,0x42,0xa6,0xb8,0x2a,0x4b,0x68,0x3d,0x3a,0x5e,0x4e,0x43,0x40,0x40,0x24,0x22,0x4c,0x2d,0x20,0x46,0x32,0x2c,0x5a,0x6c,0x86,0x00,0x02,0x00,0x6e,0xff,0xe8,0x05,0xba,0x05,0xb2,0x00,0x5a,\r\n0x00,0x66,0x00,0x3e,0xb6,0x3d,0x2d,0x64,0x54,0x64,0x01,0x64,0xb8,0xff,0xe0,0x40,0x1a,0x10,0x15,0x48,0x64,0x9f,0x13,0x01,0x13,0x13,0x35,0x1e,0x1b,0x92,0x23,0x23,0x49,0x55,0x0f,0x05,0x91,0x49,0x13,0x5e,0x92,0x35,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0x12,0x39,0x2f,0xed,0x33,0x12,0x39,0x2f,0x5d,0x33,0x2b,0x5d,0x12,0x39,0x39,\r\n0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x04,0x35,0x34,0x2e,0x04,0x27,0x0e,0x03,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x16,0x16,0x17,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x1e,0x05,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x04,0x35,0x34,0x3e,\r\n0x02,0x37,0x33,0x0e,0x03,0x01,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x36,0x36,0x01,0x1d,0x57,0x8e,0xb4,0x5d,0x3a,0x78,0x70,0x62,0x49,0x2a,0x20,0x38,0x4a,0x56,0x5b,0x2d,0x19,0x2b,0x21,0x13,0x31,0x36,0x1d,0x38,0x11,0x23,0x39,0x18,0x52,0x92,0x38,0x5c,0x41,0x24,0x17,0x26,0x33,0x1c,0x3a,0x48,0x28,0x46,0x5c,0x35,0x31,\r\n0x5a,0x46,0x2a,0x43,0x30,0x30,0x66,0x61,0x56,0x40,0x26,0x71,0xbc,0xf6,0x84,0x52,0xa4,0x97,0x81,0x60,0x37,0x21,0x3a,0x4f,0x2d,0xd7,0x35,0x5c,0x46,0x28,0x02,0xbf,0x33,0x2a,0x31,0x31,0x36,0x2d,0x27,0x35,0x02,0x1c,0x6e,0x9c,0x64,0x2f,0x11,0x25,0x3b,0x54,0x70,0x47,0x3c,0x5f,0x4c,0x3d,0x34,0x2e,0x17,0x15,0x27,0x25,0x24,0x12,\r\n0x26,0x32,0x1a,0x16,0x11,0x2d,0x16,0x6d,0x22,0x3b,0x52,0x30,0x27,0x44,0x3b,0x34,0x17,0x2a,0x70,0x51,0x31,0x52,0x3b,0x21,0x21,0x3b,0x52,0x31,0x3c,0x67,0x2d,0x17,0x32,0x3d,0x4b,0x5f,0x77,0x4a,0x93,0xd2,0x86,0x3f,0x1c,0x39,0x59,0x7a,0x9c,0x61,0x46,0x89,0x7f,0x74,0x31,0x2f,0x6f,0x7b,0x86,0x02,0x72,0x23,0x2d,0x2f,0x21,0x2c,\r\n0x41,0x1c,0x20,0x42,0x00,0x01,0x00,0x0a,0xff,0xe8,0x06,0x23,0x05,0xb8,0x00,0x54,0x00,0x30,0x40,0x19,0x10,0x91,0x0d,0x1e,0x07,0x07,0x19,0x4e,0x35,0x4e,0x35,0x4e,0x21,0x3d,0x91,0x2c,0x13,0x48,0x91,0x21,0x04,0x00,0x91,0x19,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x12,0x39,0x2f,0x39,0x39,0xed,\r\n0x30,0x31,0x01,0x22,0x0e,0x04,0x23,0x22,0x2e,0x02,0x35,0x33,0x14,0x16,0x33,0x32,0x3e,0x06,0x33,0x32,0x1e,0x02,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,\r\n0x23,0x35,0x34,0x2e,0x02,0x02,0x76,0x32,0x39,0x27,0x22,0x36,0x58,0x49,0x32,0x53,0x3b,0x21,0x97,0x30,0x1d,0x1e,0x2b,0x20,0x1c,0x20,0x29,0x3b,0x51,0x39,0x38,0x5a,0x42,0x2b,0x08,0x1d,0x9b,0x74,0x54,0x88,0x60,0x33,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x20,\r\n0x36,0x48,0x29,0x3b,0x52,0x33,0x17,0xa8,0x13,0x2d,0x49,0x05,0x21,0x2f,0x45,0x51,0x45,0x2e,0x23,0x3f,0x55,0x32,0x2a,0x2a,0x1b,0x2c,0x39,0x3a,0x39,0x2c,0x1b,0x26,0x44,0x5f,0x38,0x80,0x7f,0x3e,0x7d,0xbb,0x7c,0xfe,0x16,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,\r\n0x53,0x01,0xe1,0x64,0x89,0x52,0x24,0x37,0x60,0x83,0x4c,0x30,0x30,0x49,0x82,0x63,0x39,0x00,0x00,0x02,0x00,0x55,0xff,0xe8,0x06,0xd5,0x05,0xb2,0x00,0x56,0x00,0x66,0x00,0x31,0x40,0x1a,0x64,0x91,0x04,0x2b,0x47,0x19,0x91,0x16,0x2b,0x16,0x2b,0x16,0x3d,0x0c,0x91,0x52,0x13,0x38,0x21,0x91,0x3d,0x04,0x5c,0x91,0x35,0x04,0x00,0x3f,\r\n0xed,0x3f,0xed,0x39,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x39,0x10,0xce,0xed,0x30,0x31,0x01,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x07,0x06,0x06,0x07,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,\r\n0x02,0x33,0x32,0x16,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x13,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0x02,0x59,0x03,0x02,0xb0,0x03,0x02,0x3f,0x6c,0x92,0x53,0x69,0x96,0x60,0x2d,0x25,0x4f,0x79,0x54,0x5e,0x58,0x51,0x6c,\r\n0x41,0x1b,0x82,0x82,0x61,0xaf,0x53,0x1d,0x3a,0x6c,0x9b,0x62,0x61,0xa1,0x73,0x40,0x42,0x75,0xa0,0x5e,0x64,0x9d,0x36,0x37,0x6e,0x6f,0x6f,0x39,0x5d,0x9c,0x71,0x40,0x20,0x3e,0x5a,0x3a,0x3a,0x69,0x4f,0x2e,0x62,0xa2,0xce,0x6c,0x81,0xd4,0x97,0x52,0xa4,0x1c,0x3b,0x5c,0x40,0x41,0x61,0x42,0x21,0x83,0x82,0x80,0x73,0x01,0x8e,0x0f,\r\n0x1f,0x11,0x11,0x1e,0x0f,0x44,0x66,0x44,0x22,0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x24,0x3f,0x53,0x2f,0x5f,0x6d,0x01,0x02,0x30,0x3d,0x54,0x69,0x6c,0xa6,0x71,0x3b,0x3c,0x72,0xa7,0x6b,0x6a,0xa6,0x72,0x3c,0x3e,0x3c,0x26,0x31,0x1c,0x0a,0x31,0x5c,0x81,0x50,0x3b,0x65,0x4e,0x33,0x09,0x04,0x07,0x3b,0x61,0x83,0x4e,0x75,\r\n0xad,0x71,0x37,0x3c,0x6e,0x9c,0x02,0xc1,0x47,0x6f,0x4c,0x27,0x2c,0x4e,0x6c,0x41,0x90,0x99,0x98,0x00,0x00,0x01,0x00,0x5a,0xff,0xe8,0x04,0x7d,0x05,0x9a,0x00,0x31,0x00,0x23,0x40,0x11,0x24,0x0a,0x24,0x0a,0x1b,0x13,0x05,0x91,0x10,0x10,0x15,0x2c,0x91,0x1b,0x13,0x15,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x12,0x39,\r\n0x39,0x2f,0x2f,0x30,0x31,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x03,0xd5,0x2e,0x52,0x72,0x44,0x42,0x6f,0x4f,0x2c,0xa6,0x48,0x7e,0xaa,0x62,0x59,\r\n0x9c,0x41,0xa8,0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x02,0xed,0x43,0x68,0x47,0x24,0x1b,0x34,0x50,0x34,0x58,0x88,0x5b,0x2f,0x28,0x29,0x01,0x51,0xfc,0x40,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,\r\n0x82,0x53,0x00,0x01,0x00,0x82,0x00,0x00,0x05,0xb6,0x05,0xb3,0x00,0x4d,0x00,0x33,0x40,0x1b,0x08,0x05,0x92,0x4a,0x09,0x0c,0x19,0x37,0x1c,0x0c,0x26,0x37,0x37,0x26,0x0c,0x03,0x00,0x31,0x91,0x1c,0x04,0x3e,0x91,0x16,0x04,0x00,0x12,0x00,0x3f,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x11,0x12,0x39,0x11,0x33,0x33,0xed,\r\n0x32,0x30,0x31,0x21,0x2e,0x03,0x27,0x22,0x06,0x07,0x35,0x36,0x36,0x37,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x04,0x17,0x16,0x16,\r\n0x17,0x04,0x49,0x19,0x65,0x8a,0xa7,0x6e,0x46,0xbb,0x59,0x41,0x98,0x51,0x68,0x90,0x5a,0x28,0x2b,0x59,0x88,0x5c,0x6d,0x92,0x2f,0x27,0x99,0x67,0x54,0x8b,0x62,0x36,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x20,0x36,0x49,0x2a,0x39,0x4f,0x30,0x15,0xa8,0x16,0x31,0x4f,0x39,0x2c,0x49,0x35,0x1d,0x2b,0x4a,0x62,0x6d,0x74,0x36,\r\n0xb8,0xf1,0x2f,0x2e,0x4f,0x3a,0x23,0x04,0x1e,0x23,0x9c,0x15,0x19,0x02,0x2d,0x83,0x9e,0xb3,0x5e,0x62,0xb2,0x87,0x50,0x5b,0x65,0x65,0x5b,0x3e,0x7c,0xbb,0x7c,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x62,0x85,0x52,0x23,0x2b,0x57,0x81,0x57,0x88,0x88,0x57,0x81,0x57,0x2b,0x26,0x53,0x84,0x5f,0x5a,0x98,0x7e,0x65,0x4f,\r\n0x39,0x13,0x2d,0xa7,0x7d,0x00,0x00,0x01,0x00,0x6e,0xff,0xe8,0x04,0x91,0x05,0x9a,0x00,0x3d,0x00,0x1d,0x40,0x0e,0x00,0x1a,0x91,0x30,0x05,0x05,0x21,0x38,0x91,0x27,0x13,0x10,0x21,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x37,0x33,0x0e,0x03,\r\n0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x35,0x33,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x03,0xe9,0x20,0x54,0x5e,0x63,0x30,0x5a,0xa8,0x80,0x4d,0x08,0x0d,0x13,0x0b,0xb6,0x0d,0x15,0x0f,0x08,0x39,0x57,0x68,0x30,0x49,0x7f,0x5e,0x36,0xa8,\r\n0x4a,0x8b,0xca,0x80,0x75,0xbf,0x87,0x49,0x0f,0x10,0xb6,0x0f,0x16,0x2d,0x5a,0x86,0x59,0x57,0x85,0x5a,0x2f,0x03,0x5f,0x2a,0x3a,0x26,0x11,0x34,0x6d,0xaa,0x77,0x21,0x49,0x48,0x45,0x1d,0x1a,0x45,0x4b,0x4c,0x22,0x5f,0x74,0x3f,0x15,0x33,0x57,0x75,0x42,0xfe,0xfc,0x40,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,\r\n0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x00,0x02,0x00,0x32,0xff,0xe8,0x04,0xf3,0x05,0xb3,0x00,0x13,0x00,0x57,0x00,0x32,0x40,0x1c,0x38,0x33,0x2b,0x20,0x0f,0x91,0x57,0x48,0x00,0x52,0x10,0x52,0x02,0x52,0x52,0x3d,0x05,0x91,0x48,0x13,0x19,0x92,0x3d,0x04,0x26,0x92,0x33,0x04,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,\r\n0x39,0x2f,0x5d,0x12,0x39,0xed,0xce,0x32,0x11,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x01,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x15,0x14,0x17,0x23,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,\r\n0x1e,0x02,0x15,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x01,0xb1,0x39,0x5d,0x75,0x3c,0x3c,0x79,0x61,0x3d,0x39,0x5e,0x7a,0x42,0x42,0x76,0x5a,0x35,0x02,0x9a,0x18,0x2d,0x44,0x2b,0x36,0x48,0x2c,0x13,0x9e,0x1c,0x33,0x46,0x2a,0x4e,0x4f,0x15,0xb5,0x0e,0x32,0x5a,0x7b,0x49,0x2a,0x4e,\r\n0x45,0x38,0x13,0x11,0x36,0x43,0x4d,0x29,0x5a,0x87,0x5b,0x2d,0x52,0x89,0xb3,0x61,0x69,0xbc,0x8c,0x52,0x59,0x8e,0xae,0x56,0x31,0x62,0x5b,0x51,0x20,0x01,0xde,0x56,0x83,0x59,0x2e,0x2d,0x58,0x82,0x55,0x55,0x83,0x59,0x2e,0x2b,0x56,0x83,0x01,0xc8,0x50,0x71,0x48,0x22,0x1e,0x33,0x45,0x27,0x2b,0x2b,0x2d,0x46,0x30,0x1a,0x62,0x54,\r\n0x30,0x42,0x36,0x32,0x52,0x7b,0x53,0x2a,0x0f,0x23,0x38,0x29,0x28,0x38,0x24,0x10,0x32,0x6d,0xac,0x7a,0xfd,0xec,0x72,0xb9,0x81,0x46,0x46,0x84,0xbc,0x76,0x78,0xb8,0x7d,0x3f,0x11,0x24,0x37,0x27,0x00,0x02,0x00,0xa0,0x00,0x00,0x04,0x94,0x05,0xb1,0x00,0x0d,0x00,0x3f,0x00,0x22,0x40,0x11,0x06,0x91,0x3a,0x3a,0x3b,0x23,0x91,0x0e,\r\n0x0e,0x2a,0x00,0x92,0x30,0x04,0x19,0x2a,0x12,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x2f,0xed,0x39,0x33,0x2f,0xed,0x30,0x31,0x01,0x22,0x0e,0x02,0x15,0x15,0x3e,0x03,0x35,0x34,0x26,0x13,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x23,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x11,0x23,0x11,0x34,0x3e,0x02,0x33,0x32,\r\n0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x15,0x3e,0x03,0x01,0xde,0x23,0x39,0x28,0x16,0x4e,0x6e,0x45,0x1f,0x3f,0x9a,0x63,0xab,0x7f,0x48,0x11,0x1b,0x20,0x10,0xc4,0x1c,0x2a,0x1c,0x0e,0x37,0x56,0x6b,0x33,0x48,0x87,0x69,0x3f,0xa2,0x33,0x57,0x73,0x41,0x44,0x6f,0x50,0x2b,0x2e,0x6b,0xb0,0x81,0x21,0x5b,0x66,0x6b,0x05,0x21,0x18,0x2a,\r\n0x3c,0x24,0x83,0x0a,0x25,0x31,0x3b,0x20,0x30,0x3a,0xfe,0x36,0x35,0x71,0xb0,0x7b,0x42,0x73,0x61,0x50,0x20,0x26,0x5b,0x64,0x6b,0x35,0x5f,0x7b,0x47,0x1c,0x30,0x57,0x7d,0x4c,0xfe,0x8e,0x04,0x74,0x4c,0x77,0x50,0x2a,0x20,0x3f,0x5b,0x3b,0x34,0x66,0x5a,0x48,0x16,0xc5,0x2d,0x43,0x2c,0x16,0x00,0x01,0x00,0x82,0xff,0xe8,0x05,0x1d,\r\n0x05,0x9a,0x00,0x42,0x00,0x20,0x40,0x10,0x14,0x3d,0x91,0x00,0x07,0x3c,0x3c,0x1e,0x28,0x03,0x31,0x91,0x1e,0x13,0x07,0x03,0x00,0x3f,0x3f,0xed,0x3f,0x12,0x39,0x2f,0x12,0x39,0xed,0x39,0x30,0x31,0x01,0x34,0x2e,0x04,0x35,0x33,0x14,0x1e,0x04,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x26,0x02,0x35,\r\n0x34,0x3e,0x02,0x37,0x33,0x06,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x04,0x28,0x3a,0x57,0x65,0x57,0x3a,0xb1,0x39,0x55,0x64,0x55,0x39,0x24,0x41,0x5c,0x37,0x45,0x77,0x56,0x31,0x5f,0x9f,0xd2,0x73,0x87,0xdd,0x9e,0x56,0x1f,0x34,0x42,0x23,0xc7,0x6d,0x68,0x3c,0x72,\r\n0xa4,0x68,0x69,0x97,0x60,0x2d,0x2c,0x58,0x85,0x59,0x7f,0x79,0x46,0x6a,0x48,0x25,0x04,0x1a,0x31,0x32,0x20,0x1c,0x35,0x5c,0x50,0x2c,0x2d,0x1d,0x1c,0x36,0x5e,0x51,0x30,0x54,0x42,0x2d,0x08,0x09,0x3c,0x61,0x82,0x4e,0x75,0xad,0x71,0x37,0x5e,0xbc,0x01,0x1b,0xbd,0x7b,0xd3,0xaf,0x8d,0x36,0x94,0xfe,0xa4,0xd6,0x94,0xe0,0x96,0x4b,\r\n0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x20,0x32,0x3e,0x00,0x02,0x00,0x6e,0xff,0xe8,0x04,0x60,0x05,0x9a,0x00,0x16,0x00,0x24,0x00,0x16,0x40,0x0b,0x15,0x03,0x22,0x91,0x14,0x0f,0x10,0x1a,0x91,0x05,0x13,0x00,0x3f,0xed,0x3f,0x33,0xed,0x3f,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,\r\n0x1e,0x02,0x17,0x11,0x33,0x01,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x04,0x60,0x47,0x82,0xb7,0x6f,0x7a,0xc0,0x84,0x45,0x47,0x81,0xb5,0x6e,0x31,0x63,0x5b,0x51,0x1f,0xa8,0xfc,0xbe,0xa2,0xa5,0xae,0xa5,0x2f,0x57,0x7e,0x4f,0x9d,0xaa,0x02,0x06,0x7f,0xc9,0x8c,0x4a,0x4b,0x90,0xcf,0x84,0x7d,0xc0,0x82,0x43,\r\n0x10,0x24,0x39,0x28,0x02,0x17,0xfc,0x76,0xc7,0xcb,0xcb,0xc3,0x60,0x8c,0x5d,0x2d,0xb3,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x04,0xff,0x05,0xb3,0x00,0x41,0x00,0x56,0x00,0x33,0x40,0x1c,0x3f,0x53,0x91,0x17,0x12,0x30,0x00,0x00,0x00,0x10,0x00,0x02,0x23,0x00,0x23,0x00,0x09,0x29,0x92,0x1c,0x04,0x36,0x92,0x12,0x04,0x47,0x09,0x12,\r\n0x00,0x3f,0x33,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xce,0x11,0x39,0xed,0x39,0x30,0x31,0x01,0x32,0x1e,0x02,0x15,0x14,0x07,0x01,0x23,0x01,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x07,0x23,0x36,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x15,0x23,0x35,\r\n0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x17,0x17,0x36,0x36,0x13,0x1e,0x03,0x17,0x33,0x3e,0x03,0x37,0x37,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x02,0xa4,0x58,0x8c,0x62,0x33,0x2d,0xfe,0xfe,0x8e,0xfe,0x17,0x11,0x16,0x32,0x5a,0x7e,0x4b,0x29,0x4d,0x43,0x36,0x11,0x13,0x38,0x45,0x4e,0x2a,0x49,0x7c,0x5a,0x33,0x0e,\r\n0xb7,0x15,0x4f,0x4e,0x2a,0x46,0x33,0x1c,0x9e,0x13,0x2c,0x48,0x36,0x22,0x3b,0x2b,0x19,0x0c,0x0c,0x39,0x4e,0xa7,0x33,0x05,0x10,0x10,0x0d,0x03,0x02,0x03,0x0e,0x11,0x11,0x05,0x72,0x18,0x67,0x72,0x4b,0x7e,0x37,0x03,0xd5,0x28,0x4c,0x6d,0x45,0x59,0x5a,0xfe,0x04,0x03,0xca,0x23,0x5b,0x32,0x51,0x76,0x4d,0x25,0x10,0x24,0x38,0x28,\r\n0x29,0x38,0x23,0x0f,0x2a,0x53,0x7b,0x52,0x32,0x36,0x42,0x30,0x54,0x62,0x1a,0x30,0x46,0x2d,0x2b,0x2b,0x27,0x45,0x33,0x1e,0x18,0x2e,0x43,0x2b,0x1d,0x36,0x17,0x72,0x1d,0x20,0xfd,0x79,0x0b,0x20,0x25,0x25,0x0f,0x0f,0x25,0x25,0x21,0x0b,0xe1,0x2e,0x3a,0x53,0x53,0x1c,0x19,0x00,0x00,0x02,0x00,0x32,0xff,0xe8,0x05,0x26,0x05,0x9a,\r\n0x00,0x41,0x00,0x53,0x00,0x3f,0x40,0x25,0x02,0x41,0x09,0x4f,0x2d,0x10,0x06,0x05,0x0d,0x0d,0x4c,0x91,0x1f,0x32,0x05,0x05,0x42,0x91,0x3c,0x6f,0x32,0x7f,0x32,0xdf,0x32,0x03,0x32,0x3c,0x32,0x3c,0x01,0x27,0x91,0x16,0x13,0x01,0x03,0x00,0x3f,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x33,0x2f,0x10,0xce,0xed,0x33,0x2f,\r\n0x12,0x17,0x39,0x30,0x31,0x01,0x33,0x11,0x36,0x36,0x37,0x15,0x06,0x06,0x07,0x16,0x16,0x17,0x15,0x26,0x26,0x27,0x11,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x11,0x0e,0x03,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x17,0x25,0x22,\r\n0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x37,0x2e,0x03,0x03,0xad,0xa8,0x33,0x66,0x38,0x39,0x69,0x30,0x30,0x69,0x39,0x38,0x66,0x33,0x4a,0x8b,0xca,0x80,0x7e,0xc1,0x82,0x43,0x0f,0x10,0xb6,0x0f,0x16,0x2b,0x58,0x87,0x5c,0x57,0x85,0x5a,0x2f,0x2d,0x5a,0x5f,0x66,0x37,0x43,0x70,0x52,0x2e,0x2e,0x52,0x70,0x43,0x37,0x66,0x5f,\r\n0x5a,0x2d,0xfe,0x88,0x17,0x32,0x2a,0x1b,0x1b,0x2a,0x32,0x17,0x66,0xbf,0x55,0x2a,0x5b,0x5f,0x63,0x05,0x9a,0xfe,0xac,0x2a,0x4d,0x21,0xa0,0x1d,0x46,0x26,0x26,0x45,0x1d,0xa0,0x20,0x4e,0x29,0xfe,0xb6,0x71,0xb7,0x83,0x47,0x44,0x75,0x9d,0x5a,0x27,0x53,0x2a,0x20,0x53,0x30,0x3d,0x68,0x4b,0x2b,0x2f,0x5a,0x82,0x53,0x01,0x53,0x22,\r\n0x3b,0x2c,0x19,0x2b,0x4f,0x6d,0x42,0x42,0x6d,0x4e,0x2b,0x19,0x2c,0x3b,0x22,0x0f,0x0f,0x23,0x39,0x2a,0x2a,0x3a,0x23,0x0f,0x55,0x40,0x20,0x37,0x28,0x17,0x00,0x02,0x00,0xa0,0xff,0xe8,0x04,0x92,0x05,0x9a,0x00,0x16,0x00,0x24,0x00,0x16,0x40,0x0b,0x22,0x91,0x11,0x13,0x1a,0x91,0x02,0x07,0x10,0x01,0x03,0x00,0x3f,0x3f,0x33,0xed,\r\n0x3f,0xed,0x30,0x31,0x13,0x33,0x11,0x3e,0x03,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x25,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x16,0x33,0x32,0x36,0xa0,0xa8,0x1f,0x51,0x5b,0x63,0x31,0x6e,0xb5,0x81,0x47,0x45,0x84,0xc0,0x7a,0x6f,0xb7,0x82,0x47,0x03,0x42,0xaa,0x9d,0x4f,0x7e,0x57,0x2f,0xa5,0xae,\r\n0xa5,0xa2,0x05,0x9a,0xfd,0xe9,0x28,0x39,0x24,0x10,0x43,0x82,0xc0,0x7d,0x84,0xcf,0x90,0x4b,0x4a,0x8c,0xc9,0x7f,0x0a,0xbf,0xb3,0x2d,0x5d,0x8c,0x60,0xc3,0xcb,0xcb,0x00,0x01,0x00,0x50,0xff,0xe8,0x05,0xea,0x05,0xb2,0x00,0x5b,0x00,0x34,0x40,0x1d,0x14,0x4f,0x21,0x4f,0x21,0x4f,0x29,0x48,0x91,0x57,0x13,0x5b,0x44,0x15,0x2d,0x04,\r\n0x08,0x34,0x91,0x3b,0x04,0x19,0x92,0x29,0x04,0x0e,0x92,0x08,0x13,0x00,0x3f,0xed,0x3f,0xed,0x3f,0xed,0x12,0x17,0x39,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x12,0x39,0x30,0x31,0x01,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x35,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x01,0x01,0x26,0x26,0x27,0x22,0x06,0x06,0x15,0x14,\r\n0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x16,0x17,0x01,0x01,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x35,0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x06,0x07,0x01,0x01,0x16,0x16,0x37,0x36,0x36,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x27,0x01,0x01,0xd9,0x19,0x1d,0x24,0x49,\r\n0x6e,0x4a,0x20,0x48,0x1f,0x3c,0x4b,0x39,0x39,0x3b,0x3d,0x01,0xc9,0xfe,0xb5,0x0f,0x21,0x12,0x09,0x1a,0x16,0x1c,0x17,0xa4,0x11,0x15,0x25,0x3d,0x4e,0x2a,0x48,0x6a,0x2a,0x01,0x32,0x01,0xc4,0x23,0x1b,0x29,0x1e,0x35,0x51,0x2c,0x2b,0x66,0x28,0x3d,0x5a,0x3b,0x1d,0x3e,0x3e,0xfe,0x21,0x01,0x40,0x0f,0x1f,0x15,0x20,0x18,0x1c,0x17,\r\n0xae,0x11,0x15,0x26,0x3f,0x50,0x2a,0x48,0x6f,0x2a,0xfe,0xd9,0x01,0x7c,0x24,0x54,0x28,0x2f,0x58,0x44,0x29,0x0d,0x0f,0xb5,0x47,0x3f,0x2e,0x30,0x61,0x26,0x01,0x45,0x02,0x1e,0x18,0x0f,0x01,0x08,0x1f,0x1d,0x26,0x5b,0x2c,0x2b,0x50,0x2c,0x37,0x52,0x37,0x1b,0x3f,0x45,0xfe,0x10,0x01,0x42,0x19,0x34,0x14,0x1a,0x22,0x1e,0x17,0xa4,\r\n0x11,0x15,0x22,0x3a,0x4f,0x2d,0x3c,0x6d,0x2c,0xfe,0xad,0xfd,0xfa,0x18,0x12,0x01,0x04,0x24,0x1d,0x26,0x55,0x2c,0x2b,0x50,0x2c,0x37,0x54,0x38,0x1d,0x3f,0x45,0x01,0xe3,0x00,0x00,0x01,0x00,0x50,0xff,0xe8,0x04,0x46,0x05,0x9a,0x00,0x52,0x00,0x2e,0x40,0x19,0x31,0x16,0x91,0x13,0x39,0x0d,0x91,0x0a,0x5f,0x0a,0x01,0x13,0x4b,0x0a,\r\n0x0a,0x4b,0x13,0x03,0x22,0x00,0x91,0x43,0x13,0x22,0x03,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x39,0x30,0x31,0x25,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x2e,0x06,0x35,0x33,0x14,0x1e,0x06,0x15,0x14,\r\n0x0e,0x02,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x02,0x58,0x4a,0x76,0x52,0x2b,0x21,0x3b,0x51,0x2f,0x5e,0x5e,0x67,0x75,0x6b,0x71,0x5e,0x5e,0x73,0x69,0x2a,0x46,0x58,0x5d,0x58,0x46,0x2a,0xb1,0x2a,0x46,0x58,0x5d,0x58,0x46,\r\n0x2a,0x17,0x31,0x4c,0x35,0x65,0x63,0x1a,0x32,0x4b,0x31,0x35,0x4c,0x30,0x17,0x3f,0x7c,0xbb,0x7b,0x6f,0xbd,0x8a,0x4e,0x1e,0xb7,0x12,0x13,0x33,0x5c,0x7e,0x7e,0x13,0x2a,0x41,0x2e,0x21,0x36,0x25,0x15,0x96,0x3b,0x3d,0x3f,0x31,0x96,0x3d,0x3b,0x1e,0x24,0x16,0x0e,0x13,0x1d,0x33,0x4f,0x3b,0x1b,0x22,0x18,0x11,0x14,0x1d,0x2e,0x44,\r\n0x32,0x27,0x49,0x3c,0x29,0x07,0x14,0x5c,0x4d,0x26,0x41,0x32,0x21,0x06,0x09,0x2e,0x3f,0x4d,0x28,0x47,0x71,0x50,0x2b,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x00,0x01,0x00,0x82,0xff,0xe8,0x04,0xcc,0x05,0x9a,0x00,0x57,0x00,0x2c,0x40,0x17,0x20,0x4c,0x91,0x49,0x18,0x55,0x91,0x52,0x5f,0x49,0x01,0x49,\r\n0x52,0x49,0x52,0x09,0x3f,0x91,0x2a,0x13,0x35,0x09,0x03,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x39,0x30,0x31,0x01,0x34,0x2e,0x06,0x35,0x33,0x14,0x1e,0x06,0x15,0x14,0x0e,0x02,0x07,0x16,0x16,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x26,0x26,0x02,0x35,0x34,\r\n0x3e,0x02,0x37,0x33,0x0e,0x03,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x04,0x1b,0x1f,0x33,0x41,0x45,0x41,0x33,0x1f,0xb1,0x1f,0x33,0x41,0x45,0x41,0x33,0x1f,0x17,0x31,0x4c,0x35,0x65,0x63,0x1a,0x32,0x4b,0x31,0x35,0x4c,0x30,0x17,\r\n0x3f,0x7c,0xbb,0x7b,0x87,0xdd,0x9e,0x56,0x1e,0x33,0x43,0x24,0xc9,0x38,0x50,0x33,0x17,0x3b,0x70,0xa2,0x68,0x47,0x73,0x50,0x2b,0x21,0x3b,0x51,0x2f,0x5e,0x5e,0x67,0x75,0x6b,0x71,0x5e,0x5e,0x73,0x69,0x04,0x47,0x1e,0x25,0x18,0x11,0x14,0x1e,0x32,0x4b,0x38,0x1b,0x22,0x18,0x11,0x14,0x1d,0x2e,0x44,0x32,0x27,0x49,0x3c,0x29,0x07,\r\n0x14,0x5c,0x4d,0x26,0x41,0x32,0x21,0x06,0x09,0x2e,0x3f,0x4d,0x28,0x47,0x71,0x50,0x2b,0x5e,0xbc,0x01,0x1b,0xbd,0x7c,0xd2,0xaf,0x8d,0x36,0x4a,0xa0,0xb0,0xc1,0x6b,0x94,0xe0,0x96,0x4b,0x13,0x29,0x41,0x2e,0x21,0x36,0x25,0x15,0x96,0x3b,0x3d,0x3f,0x31,0x96,0x3d,0x00,0x00,0x02,0x00,0x64,0xff,0xe8,0x05,0xe4,0x05,0xb2,0x00,0x29,\r\n0x00,0x3b,0x00,0x26,0x40,0x14,0x2f,0x91,0x1f,0x04,0x37,0xee,0x08,0x08,0x10,0x15,0x91,0x0f,0x0a,0x13,0x00,0x27,0x91,0x01,0x06,0x13,0x00,0x3f,0x33,0xed,0x32,0x3f,0x33,0xed,0x32,0x39,0x10,0xed,0x3f,0xed,0x30,0x31,0x25,0x15,0x0e,0x03,0x23,0x22,0x27,0x06,0x23,0x22,0x2e,0x02,0x27,0x35,0x1e,0x03,0x17,0x2e,0x03,0x35,0x34,0x12,\r\n0x36,0x36,0x33,0x32,0x1e,0x02,0x15,0x14,0x02,0x07,0x36,0x36,0x03,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x12,0x17,0x3e,0x03,0x05,0xe4,0x35,0x64,0x6d,0x7c,0x4c,0x82,0x72,0x6b,0x74,0x56,0x83,0x6f,0x63,0x34,0x2f,0x5a,0x5f,0x67,0x3c,0x5c,0x83,0x56,0x28,0x5d,0xaf,0xfa,0x9e,0x92,0xec,0xa7,0x5b,0xb9,0xba,0x72,0xc9,0x78,\r\n0x40,0x7b,0xb1,0x70,0x6e,0xb4,0x80,0x46,0xf7,0xe9,0x75,0xb4,0x7b,0x40,0xd8,0xb0,0x10,0x18,0x10,0x08,0x15,0x15,0x08,0x10,0x18,0x10,0xb5,0x12,0x1e,0x17,0x10,0x03,0x2d,0x82,0xa0,0xbc,0x68,0xa6,0x01,0x04,0xb4,0x5e,0x5d,0xae,0xf8,0x9c,0xe2,0xfe,0xab,0x5d,0x04,0x2f,0x02,0x54,0x85,0xc8,0x85,0x42,0x49,0x8b,0xc8,0x7e,0xf3,0xfe,\r\n0xc7,0x38,0x1b,0x6c,0x9d,0xcb,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0x89,0x05,0xbb,0x00,0x34,0x00,0x26,0x40,0x13,0x0c,0x0a,0x91,0x1b,0x2d,0x1b,0x2d,0x15,0x00,0x91,0x25,0x13,0x10,0x91,0x15,0x15,0x18,0x13,0x04,0x00,0x3f,0x33,0x33,0x2f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0xed,0x39,0x30,0x31,0x25,0x32,0x3e,0x02,0x35,0x34,\r\n0x2e,0x02,0x23,0x23,0x35,0x01,0x23,0x06,0x23,0x22,0x27,0x37,0x16,0x33,0x32,0x36,0x37,0x15,0x01,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x02,0x78,0x64,0x8a,0x54,0x25,0x2c,0x58,0x85,0x59,0xc5,0x01,0x64,0x03,0x77,0x76,0xaa,0xb7,0x2b,0x8d,0xce,0x67,0xff,0x81,\r\n0xfe,0x76,0x03,0x8b,0xb9,0x6d,0x2d,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x7f,0x35,0x56,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x4b,0x01,0xdb,0x18,0x41,0x97,0x40,0x21,0x20,0x3f,0xfd,0xf0,0x02,0x07,0x53,0x7c,0x97,0x4b,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,\r\n0x48,0x25,0x00,0x01,0x00,0x64,0xff,0xe8,0x04,0x89,0x05,0x9a,0x00,0x44,0x00,0x2e,0x40,0x1a,0x3d,0x91,0x08,0x0f,0x36,0x91,0x33,0x00,0x33,0x10,0x33,0x02,0x08,0x33,0x21,0x21,0x33,0x08,0x03,0x00,0x29,0x91,0x19,0x13,0x00,0x03,0x00,0x3f,0x3f,0xed,0x12,0x17,0x39,0x2f,0x2f,0x2f,0x5d,0x10,0xed,0x39,0x10,0xed,0x30,0x31,0x01,0x33,\r\n0x06,0x15,0x14,0x1e,0x02,0x33,0x21,0x15,0x14,0x0e,0x02,0x07,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x37,0x33,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,0x23,0x35,0x33,0x32,0x3e,0x02,0x35,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x01,0x17,0xaf,0x09,0x1f,0x3d,0x5a,0x3b,\r\n0x01,0x91,0x24,0x41,0x5d,0x39,0x43,0x76,0x59,0x33,0x5a,0x94,0xbf,0x66,0x75,0xc3,0x8c,0x4e,0x1e,0xb7,0x12,0x13,0x34,0x5f,0x83,0x4e,0x64,0x88,0x52,0x23,0x2a,0x56,0x83,0x59,0x70,0x6a,0x4f,0x6d,0x45,0x1f,0xfe,0x58,0x93,0x69,0x3b,0x06,0x05,0x9a,0x24,0x1b,0x23,0x29,0x15,0x05,0xda,0x2e,0x50,0x40,0x2c,0x09,0x08,0x3c,0x61,0x83,\r\n0x4e,0x75,0xad,0x71,0x37,0x3f,0x72,0x9f,0x60,0x4d,0x57,0x22,0x5a,0x27,0x44,0x69,0x48,0x26,0x35,0x57,0x6e,0x39,0x3e,0x6a,0x4e,0x2d,0x97,0x1e,0x2e,0x38,0x1a,0x55,0x17,0x35,0x57,0x41,0x14,0x2c,0x00,0x03,0x00,0x6e,0xff,0xe8,0x04,0x29,0x05,0xb2,0x00,0x29,0x00,0x38,0x00,0x47,0x00,0x35,0x40,0x1c,0x24,0x2a,0x91,0x13,0x27,0x13,\r\n0x01,0x39,0x91,0x12,0x28,0x12,0x2f,0x13,0x01,0x13,0x12,0x13,0x12,0x07,0x2e,0x91,0x1e,0x04,0x44,0x91,0x07,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x5d,0x11,0x33,0x10,0xed,0x32,0x11,0x33,0x10,0xed,0x32,0x30,0x31,0x01,0x23,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x23,0x22,\r\n0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x15,0x33,0x15,0x23,0x15,0x33,0x01,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x13,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x04,0x29,0xad,0x35,0x63,0x8e,0x5a,0x54,0x91,0x6c,0x3d,0x3e,0x6f,0x9a,0x5c,0xc9,0xc9,0x5c,0x9a,0x6f,0x3e,\r\n0x3d,0x6a,0x92,0x55,0x5a,0x8e,0x63,0x35,0xad,0xad,0xad,0xfe,0xb1,0x73,0x6b,0x2f,0x53,0x3e,0x24,0x25,0x42,0x5c,0x36,0xc9,0xc9,0x36,0x5c,0x42,0x25,0x24,0x3e,0x53,0x2f,0x68,0x76,0x01,0xe6,0x94,0x5a,0x88,0x5b,0x2d,0x29,0x52,0x7a,0x52,0x51,0x7c,0x55,0x2b,0xa2,0x2b,0x55,0x7c,0x51,0x52,0x7a,0x52,0x29,0x2e,0x5a,0x88,0x5a,0x94,\r\n0x96,0xa2,0x01,0x38,0x94,0x69,0x6c,0x13,0x2a,0x44,0x31,0x2e,0x44,0x2e,0x17,0xfe,0x32,0x17,0x2e,0x45,0x2d,0x31,0x44,0x2a,0x13,0x6b,0x6a,0x00,0x00,0x03,0x00,0x6e,0xff,0xf1,0x05,0xd9,0x05,0xa7,0x00,0x1d,0x00,0x2a,0x00,0x37,0x00,0x2d,0x40,0x17,0x37,0x91,0x04,0x04,0x20,0x91,0x1d,0x2d,0x92,0x0e,0x0e,0x2a,0x92,0x13,0x1d,0x13,\r\n0x1d,0x13,0x01,0x10,0x03,0x01,0x12,0x00,0x3f,0x3f,0x12,0x39,0x39,0x2f,0x2f,0x10,0xed,0x33,0x2f,0xed,0x10,0xed,0x33,0x2f,0xed,0x30,0x31,0x25,0x15,0x23,0x35,0x23,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x33,0x35,0x33,0x15,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x23,0x03,0x11,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x23,\r\n0x03,0x11,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x03,0x78,0xa8,0x2b,0x7c,0xd0,0x97,0x54,0x54,0x97,0xd1,0x7d,0x29,0xa8,0x2a,0x7d,0xd0,0x96,0x54,0x55,0x97,0xcf,0x7a,0x2c,0x2c,0x5a,0x91,0x64,0x36,0x37,0x65,0x91,0x5a,0xd2,0x29,0x59,0x91,0x67,0x38,0x35,0x64,0x92,0x5c,0xba,0xc9,0xc9,0x54,0x96,0xd1,0x7d,0x7b,0xc9,0x8f,\r\n0x4d,0x95,0x95,0x4f,0x8f,0xc8,0x7a,0x7e,0xd1,0x96,0x53,0x03,0xca,0xfc,0xcc,0x39,0x6b,0x9a,0x62,0x5b,0x95,0x6a,0x3a,0xfc,0xcc,0x03,0x34,0x39,0x69,0x96,0x5d,0x62,0x9b,0x6a,0x38,0x00,0x00,0x01,0x00,0x76,0xff,0xe8,0x04,0xc1,0x05,0xb2,0x00,0x3a,0x00,0x1b,0x40,0x0d,0x29,0x0a,0x1a,0x31,0x2b,0x91,0x36,0x13,0x15,0x0f,0x91,0x1a,\r\n0x04,0x00,0x3f,0xed,0xcd,0x3f,0xed,0xcd,0x12,0x39,0x39,0x30,0x31,0x13,0x34,0x3e,0x02,0x37,0x3e,0x03,0x35,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x23,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x07,0x0e,0x03,0x15,0x10,0x21,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x76,0x4c,0x86,0xb8,0x6c,\r\n0x49,0x81,0x62,0x39,0x28,0x4c,0x70,0x49,0x4c,0x76,0x50,0x29,0xaa,0x54,0x88,0xae,0x59,0x71,0xb0,0x79,0x3f,0x4c,0x85,0xb6,0x6a,0x46,0x82,0x65,0x3d,0x01,0x74,0x44,0x89,0x6f,0x46,0xab,0x60,0x9d,0xc7,0x67,0x6b,0xc5,0x96,0x5a,0x01,0x85,0x6f,0x92,0x5f,0x37,0x13,0x0c,0x25,0x3c,0x5b,0x43,0x33,0x52,0x3b,0x20,0x24,0x42,0x5c,0x38,\r\n0x6f,0x99,0x5f,0x2b,0x35,0x63,0x8b,0x55,0x66,0x8d,0x60,0x3a,0x14,0x0d,0x24,0x3e,0x5e,0x47,0xfe,0xfa,0x1d,0x41,0x6a,0x4e,0x74,0xa3,0x67,0x2f,0x2a,0x60,0x9e,0x00,0x00,0x01,0x00,0xa0,0xff,0xe8,0x04,0xc3,0x05,0x9a,0x00,0x3d,0x00,0x1d,0x40,0x0e,0x3d,0x23,0x91,0x0e,0x38,0x38,0x16,0x2d,0x1d,0x03,0x05,0x91,0x16,0x13,0x00,0x3f,\r\n0xed,0x3f,0x33,0x12,0x39,0x2f,0xce,0xed,0x39,0x30,0x31,0x01,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x11,0x33,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x27,0x33,0x1e,0x03,0x15,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x27,0x01,0x48,\r\n0x2f,0x5a,0x85,0x57,0x58,0x86,0x5a,0x2e,0x16,0x0f,0xb6,0x10,0x0f,0x4a,0x87,0xbe,0x75,0x80,0xca,0x8b,0x4a,0xa8,0x36,0x5e,0x7f,0x49,0x30,0x68,0x57,0x39,0x08,0x0f,0x15,0x0d,0xb6,0x0b,0x13,0x0d,0x08,0x4d,0x80,0xa8,0x5a,0x30,0x63,0x5e,0x54,0x20,0x01,0xdc,0x53,0x82,0x5a,0x2f,0x2b,0x4b,0x68,0x3d,0x30,0x53,0x20,0x2a,0x53,0x27,\r\n0x5a,0x9d,0x75,0x44,0x47,0x83,0xb7,0x71,0x03,0xc0,0xfe,0x42,0x75,0x57,0x33,0x19,0x44,0x78,0x5f,0x22,0x48,0x47,0x40,0x1a,0x1d,0x45,0x48,0x49,0x21,0x77,0xaa,0x6d,0x34,0x11,0x26,0x3a,0x2a,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x04,0xae,0x05,0xae,0x00,0x2f,0x00,0x3f,0x00,0x26,0x40,0x15,0x1e,0x03,0x35,0x91,0x11,0x00,0x40,0x09,\r\n0x0d,0x48,0x00,0x00,0x16,0x3d,0x91,0x26,0x04,0x0b,0x91,0x16,0x13,0x00,0x3f,0xed,0x3f,0xed,0x12,0x39,0x2f,0x2b,0xce,0xed,0x39,0x39,0x30,0x31,0x01,0x22,0x26,0x27,0x06,0x06,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x33,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,\r\n0x02,0x15,0x14,0x0e,0x02,0x01,0x14,0x1e,0x02,0x33,0x32,0x36,0x35,0x34,0x2e,0x02,0x23,0x22,0x06,0x02,0x87,0x26,0x46,0x21,0x07,0x08,0x1a,0x2f,0x40,0x27,0x2f,0x47,0x2f,0x17,0xaf,0x35,0x60,0x86,0x50,0x51,0x82,0x5b,0x32,0x14,0x0c,0x73,0x70,0x4f,0x90,0xc9,0x7a,0x7a,0xc5,0x8a,0x4b,0x43,0x88,0xcf,0xfe,0x14,0x33,0x5b,0x7f,0x4d,\r\n0xb8,0xc4,0x32,0x5f,0x89,0x58,0xb0,0xb4,0x01,0x7f,0x07,0x07,0x17,0x35,0x22,0x29,0x3d,0x28,0x13,0x17,0x27,0x36,0x1f,0x43,0x6e,0x4e,0x2a,0x2a,0x50,0x70,0x47,0x39,0x58,0x1f,0x45,0xed,0x97,0x7e,0xc8,0x8c,0x4a,0x4b,0x8a,0xc1,0x76,0x72,0xc8,0x94,0x55,0x02,0x19,0x60,0x91,0x60,0x31,0xcb,0xbb,0x59,0x8d,0x61,0x34,0xca,0x00,0x01,\r\n0x00,0x82,0xff,0xd5,0x05,0x14,0x05,0xb2,0x00,0x24,0x00,0x22,0x40,0x10,0x03,0x22,0x00,0x24,0x12,0x24,0x12,0x24,0x01,0x18,0x91,0x0d,0x04,0x02,0x01,0x13,0x00,0x3f,0x33,0x3f,0xed,0x12,0x39,0x39,0x2f,0x2f,0x11,0x33,0x39,0x39,0x30,0x31,0x25,0x01,0x35,0x25,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,\r\n0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x33,0x25,0x04,0xd6,0xfc,0x21,0x01,0x73,0x71,0xb5,0x7e,0x44,0x59,0x9d,0xd8,0x7f,0x83,0xd6,0x99,0x53,0xaa,0x36,0x68,0x9a,0x63,0x65,0x9c,0x6b,0x37,0x4d,0x94,0xd5,0x89,0x01,0x01,0x6a,0xe5,0xfe,0xf0,0x9d,0x6b,0x20,0x75,0xa2,0xcd,0x78,0x84,0xdd,0x9f,0x59,0x50,0x96,0xd5,0x85,\r\n0x5d,0x9d,0x70,0x3f,0x48,0x7e,0xaa,0x61,0x68,0xb8,0x92,0x65,0x15,0x65,0x00,0x01,0x00,0x62,0xff,0xe8,0x04,0xad,0x05,0xb2,0x00,0x3a,0x00,0x1b,0x40,0x0d,0x31,0x12,0x05,0x2c,0x91,0x26,0x21,0x04,0x10,0x91,0x0a,0x05,0x13,0x00,0x3f,0xcd,0xed,0x3f,0xcd,0xed,0x12,0x39,0x39,0x30,0x31,0x01,0x14,0x0e,0x02,0x23,0x22,0x2e,0x02,0x35,\r\n0x33,0x14,0x1e,0x02,0x33,0x20,0x11,0x34,0x2e,0x02,0x27,0x2e,0x03,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x23,0x34,0x2e,0x02,0x23,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x17,0x1e,0x03,0x04,0xad,0x5a,0x96,0xc5,0x6b,0x67,0xc7,0x9d,0x60,0xab,0x46,0x6f,0x89,0x44,0x01,0x74,0x3d,0x65,0x82,0x46,0x6a,0xb6,0x85,0x4c,0x42,0x7b,\r\n0xaf,0x6d,0x59,0xad,0x89,0x54,0xaa,0x29,0x50,0x76,0x4c,0x49,0x70,0x4d,0x27,0x39,0x61,0x82,0x49,0x6c,0xb8,0x86,0x4c,0x01,0x85,0x75,0x9e,0x60,0x2a,0x2f,0x67,0xa3,0x74,0x4e,0x6a,0x41,0x1d,0x01,0x06,0x47,0x5e,0x3e,0x24,0x0d,0x14,0x3a,0x60,0x8d,0x66,0x53,0x8b,0x63,0x37,0x2b,0x5f,0x99,0x6f,0x38,0x5c,0x42,0x24,0x20,0x3b,0x52,\r\n0x33,0x43,0x5b,0x3c,0x25,0x0c,0x13,0x37,0x5f,0x92,0x00,0x02,0x00,0x64,0xff,0xe8,0x05,0xe4,0x05,0xb2,0x00,0x29,0x00,0x3b,0x00,0x26,0x40,0x14,0x2f,0x91,0x1e,0x13,0x0f,0x14,0x91,0x0e,0x09,0x04,0x37,0xee,0x07,0x07,0x29,0x26,0x91,0x00,0x05,0x04,0x00,0x3f,0x33,0xed,0x32,0x39,0x10,0xed,0x3f,0x33,0xed,0x32,0x3f,0xed,0x30,0x31,\r\n0x13,0x3e,0x03,0x33,0x32,0x17,0x36,0x33,0x32,0x1e,0x02,0x17,0x15,0x2e,0x03,0x27,0x1e,0x03,0x15,0x14,0x02,0x06,0x06,0x23,0x22,0x2e,0x02,0x35,0x34,0x12,0x37,0x06,0x06,0x07,0x13,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x02,0x27,0x0e,0x03,0x64,0x34,0x65,0x6d,0x7c,0x4c,0x82,0x72,0x6a,0x75,0x55,0x84,0x6f,0x62,0x35,0x2f,\r\n0x5a,0x5f,0x67,0x3c,0x5b,0x84,0x56,0x28,0x5d,0xaf,0xfb,0x9d,0x92,0xec,0xa7,0x5b,0xb9,0xba,0x72,0xc9,0x66,0xde,0x40,0x7b,0xb0,0x71,0x6e,0xb4,0x80,0x46,0xf7,0xe9,0x75,0xb4,0x7b,0x40,0x05,0x72,0x10,0x18,0x10,0x08,0x15,0x15,0x08,0x10,0x18,0x10,0xb5,0x12,0x1e,0x17,0x10,0x03,0x2d,0x82,0xa0,0xbc,0x68,0xa6,0xfe,0xfc,0xb4,0x5e,\r\n0x5d,0xae,0xf8,0x9c,0xe2,0x01,0x55,0x5d,0x04,0x2f,0x26,0xfd,0xd2,0x86,0xc7,0x85,0x42,0x49,0x8b,0xc8,0x7e,0xf3,0x01,0x39,0x38,0x1b,0x6c,0x9d,0xcb,0x00,0x00,0x02,0x00,0x78,0xff,0xe8,0x05,0xbe,0x05,0xb2,0x00,0x13,0x00,0x27,0x00,0x10,0xb7,0x14,0x91,0x0a,0x04,0x1e,0x91,0x00,0x13,0x00,0x3f,0xed,0x3f,0xed,0x30,0x31,0x05,0x22,\r\n0x26,0x26,0x02,0x35,0x34,0x12,0x36,0x24,0x33,0x32,0x16,0x16,0x12,0x15,0x14,0x02,0x06,0x06,0x03,0x22,0x0e,0x02,0x15,0x14,0x1e,0x02,0x33,0x32,0x3e,0x02,0x35,0x34,0x2e,0x02,0x03,0x15,0x98,0xf6,0xb0,0x5f,0x60,0xb4,0x01,0x01,0xa0,0x94,0xf2,0xac,0x5f,0x61,0xb2,0xfb,0x8f,0x72,0xbc,0x87,0x4a,0x48,0x83,0xb8,0x70,0x76,0xbd,0x85,\r\n0x47,0x44,0x81,0xb9,0x18,0x6a,0xc0,0x01,0x0a,0xa0,0xac,0x01,0x18,0xc6,0x6c,0x6a,0xbe,0xfe,0xf5,0xa0,0xaf,0xfe,0xe7,0xc5,0x6a,0x05,0x32,0x56,0x9c,0xd9,0x84,0x83,0xd9,0x9b,0x55,0x4f,0x96,0xda,0x8a,0x8d,0xdd,0x98,0x50,0x00,0x00,0x03,0x00,0xbe,0x02,0x27,0x03,0x98,0x06,0x8f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x1a,0x40,0x09,\r\n0x0b,0x09,0x09,0x02,0x05,0x07,0x07,0x00,0x02,0xb8,0x01,0x4a,0x00,0x3f,0xcd,0x33,0x2f,0xcd,0x11,0x33,0x2f,0xcd,0x30,0x31,0x01,0x23,0x11,0x33,0x01,0x23,0x11,0x33,0x05,0x23,0x11,0x33,0x01,0x67,0xa9,0xa9,0x02,0x31,0xa9,0xa9,0xfe,0xe8,0xa9,0xa9,0x02,0x27,0x02,0xa6,0xfd,0x5a,0x02,0xa6,0x67,0x02,0x29,0x00,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0xc2,0x66,0x00,0x01,0x20,0x64,0xc0,0x00,0x00,0x0d,0x02,0x58,0x00,0x05,0x00,0x55,0xff,0xcd,0x00,0x05,0x00,0x56,0xff,0xbe,0x00,0x05,0x00,0xe4,0xff,0xbe,0x00,0x05,0x00,0xfb,0xff,0xbe,0x00,0x05,0x01,0x1b,0xff,0xcd,0x00,0x05,0x01,0x1d,0xff,0xcd,0x00,0x05,0x01,0x1f,0xff,0xbe,0x00,0x05,0x01,0x73,0xff,0xcd,0x00,0x05,\r\n0x01,0x75,0xff,0xbe,0x00,0x05,0x01,0xd5,0xff,0x6f,0x00,0x05,0x02,0x2b,0xff,0xbc,0x00,0x05,0x02,0x3e,0xff,0xbe,0x00,0x0a,0x00,0x55,0xff,0xcd,0x00,0x0a,0x00,0x56,0xff,0xbe,0x00,0x0a,0x00,0xe4,0xff,0xbe,0x00,0x0a,0x00,0xfb,0xff,0xbe,0x00,0x0a,0x01,0x1b,0xff,0xcd,0x00,0x0a,0x01,0x1d,0xff,0xcd,0x00,0x0a,0x01,0x1f,0xff,0xbe,\r\n0x00,0x0a,0x01,0x73,0xff,0xcd,0x00,0x0a,0x01,0x75,0xff,0xbe,0x00,0x0a,0x01,0xd5,0xff,0x6f,0x00,0x0a,0x02,0x2b,0xff,0xbc,0x00,0x0a,0x02,0x3e,0xff,0xbe,0x00,0x0b,0x00,0x4d,0x00,0xe9,0x00,0x0b,0x01,0x64,0x00,0xe9,0x00,0x0d,0x00,0x24,0xff,0x5a,0x00,0x0d,0x00,0x2d,0xff,0x66,0x00,0x0d,0x00,0x46,0xff,0x9a,0x00,0x0d,0x00,0x47,\r\n0xff,0x9a,0x00,0x0d,0x00,0x48,0xff,0x9a,0x00,0x0d,0x00,0x4a,0xff,0x9a,0x00,0x0d,0x00,0x52,0xff,0x9a,0x00,0x0d,0x00,0x54,0xff,0x9a,0x00,0x0d,0x00,0xa9,0xff,0x58,0x00,0x0d,0x00,0xf8,0xff,0x9a,0x00,0x0d,0x00,0xfd,0xff,0x9a,0x00,0x0d,0x00,0xff,0xff,0x9a,0x00,0x0d,0x01,0x00,0xff,0x9a,0x00,0x0d,0x01,0x03,0xff,0x5a,0x00,0x0d,\r\n0x01,0x05,0xff,0x5a,0x00,0x0d,0x01,0x08,0xff,0x9a,0x00,0x0d,0x01,0x0b,0xff,0x9a,0x00,0x0d,0x01,0x45,0xff,0x5a,0x00,0x0d,0x01,0x48,0xff,0x9a,0x00,0x0d,0x01,0x52,0xff,0x9a,0x00,0x0d,0x01,0x54,0xff,0x9a,0x00,0x0d,0x01,0x56,0xff,0x9a,0x00,0x0d,0x01,0x63,0xff,0x66,0x00,0x0d,0x01,0x85,0xff,0x5a,0x00,0x0d,0x01,0x87,0xff,0x5a,\r\n0x00,0x0d,0x01,0xa9,0xff,0x58,0x00,0x0d,0x01,0xb0,0xff,0x58,0x00,0x0d,0x01,0xe7,0xff,0x58,0x00,0x0d,0x02,0x0c,0xff,0x98,0x00,0x0d,0x02,0x15,0xff,0x98,0x00,0x0d,0x02,0x18,0xff,0x98,0x00,0x0d,0x02,0x1b,0xff,0x98,0x00,0x0d,0x02,0x27,0xff,0x98,0x00,0x0d,0x02,0x2a,0xff,0x98,0x00,0x0f,0x00,0xb4,0xff,0x31,0x00,0x0f,0x00,0xb5,\r\n0xff,0x31,0x00,0x0f,0x00,0xb6,0xff,0x31,0x00,0x0f,0x00,0xb7,0xff,0x31,0x00,0x10,0x01,0x33,0xff,0xdb,0x00,0x10,0x01,0xd3,0xff,0xe7,0x00,0x10,0x02,0x37,0xff,0xdb,0x00,0x11,0x00,0xb4,0xff,0x31,0x00,0x11,0x00,0xb5,0xff,0x3d,0x00,0x11,0x00,0xb6,0xff,0x31,0x00,0x11,0x00,0xb7,0xff,0x3d,0x00,0x1e,0x02,0x37,0xff,0xdb,0x00,0x22,\r\n0x01,0xcb,0xff,0xe7,0x00,0x22,0x02,0x37,0xff,0xdb,0x00,0x24,0x00,0x0d,0xff,0x7f,0x00,0x24,0x00,0x0f,0x00,0x44,0x00,0x24,0x00,0x1e,0x00,0x44,0x00,0x24,0x00,0x26,0xff,0xe5,0x00,0x24,0x00,0x2a,0xff,0xe5,0x00,0x24,0x00,0x2d,0x00,0x5e,0x00,0x24,0x00,0x32,0xff,0xe5,0x00,0x24,0x00,0x37,0xff,0x6d,0x00,0x24,0x00,0x38,0xff,0xe5,\r\n0x00,0x24,0x00,0x39,0xff,0x8b,0x00,0x24,0x00,0x3a,0xff,0xb6,0x00,0x24,0x00,0x3c,0xff,0x64,0x00,0x24,0x00,0x3d,0x00,0x3b,0x00,0x24,0x00,0x57,0xff,0xe5,0x00,0x24,0x00,0x59,0xff,0xd5,0x00,0x24,0x00,0x5a,0xff,0xe5,0x00,0x24,0x00,0x5c,0xff,0xdb,0x00,0x24,0x00,0x8d,0xff,0x9a,0x00,0x24,0x00,0xb4,0xff,0x66,0x00,0x24,0x00,0xb5,\r\n0xff,0x3f,0x00,0x24,0x00,0xb6,0xff,0x66,0x00,0x24,0x00,0xb7,0xff,0x3f,0x00,0x24,0x00,0xba,0xff,0xc1,0x00,0x24,0x00,0xbb,0xff,0x64,0x00,0x24,0x00,0xe5,0x00,0x3b,0x00,0x24,0x00,0xea,0xff,0x64,0x00,0x24,0x00,0xeb,0xff,0xdb,0x00,0x24,0x00,0xf7,0xff,0xe5,0x00,0x24,0x00,0xfc,0xff,0xe5,0x00,0x24,0x00,0xfe,0xff,0xe5,0x00,0x24,\r\n0x01,0x18,0xff,0xe5,0x00,0x24,0x01,0x20,0xff,0x6d,0x00,0x24,0x01,0x21,0xff,0xe5,0x00,0x24,0x01,0x22,0xff,0x6d,0x00,0x24,0x01,0x23,0xff,0xe5,0x00,0x24,0x01,0x24,0xff,0xe5,0x00,0x24,0x01,0x26,0xff,0xe5,0x00,0x24,0x01,0x28,0x00,0x3b,0x00,0x24,0x01,0x2a,0x00,0x3b,0x00,0x24,0x01,0x47,0xff,0xe5,0x00,0x24,0x01,0x51,0xff,0xe5,\r\n0x00,0x24,0x01,0x53,0xff,0xe5,0x00,0x24,0x01,0x55,0xff,0xe5,0x00,0x24,0x01,0x63,0x00,0x5e,0x00,0x24,0x01,0x6e,0xff,0xe5,0x00,0x24,0x01,0x70,0xff,0xe5,0x00,0x24,0x01,0x76,0xff,0x6d,0x00,0x24,0x01,0x77,0xff,0xe5,0x00,0x24,0x01,0x78,0xff,0xe5,0x00,0x24,0x01,0x7a,0xff,0xe5,0x00,0x24,0x01,0x7c,0xff,0xe5,0x00,0x24,0x01,0x7e,\r\n0xff,0xe5,0x00,0x24,0x01,0x80,0xff,0xb6,0x00,0x24,0x01,0x81,0xff,0xe5,0x00,0x24,0x01,0x82,0xff,0x64,0x00,0x24,0x01,0x83,0xff,0xdb,0x00,0x24,0x01,0x89,0xff,0xe5,0x00,0x24,0x01,0x8c,0xff,0xb6,0x00,0x24,0x01,0x8d,0xff,0xe5,0x00,0x24,0x01,0x8e,0xff,0xb6,0x00,0x24,0x01,0x8f,0xff,0xe5,0x00,0x24,0x01,0x90,0xff,0xb6,0x00,0x24,\r\n0x01,0x91,0xff,0xe5,0x00,0x24,0x01,0x92,0xff,0x64,0x00,0x24,0x01,0x93,0xff,0xdb,0x00,0x25,0x00,0x37,0xff,0xa4,0x00,0x25,0x00,0x3c,0xff,0xbe,0x00,0x25,0x00,0xbb,0xff,0xbe,0x00,0x25,0x00,0xc4,0xff,0xb2,0x00,0x25,0x00,0xc5,0xff,0xb2,0x00,0x25,0x00,0xea,0xff,0xbe,0x00,0x25,0x01,0x20,0xff,0xa4,0x00,0x25,0x01,0x22,0xff,0xa4,\r\n0x00,0x25,0x01,0x76,0xff,0xa4,0x00,0x25,0x01,0x82,0xff,0xbe,0x00,0x25,0x01,0x92,0xff,0xbe,0x00,0x26,0x00,0x22,0x00,0x02,0x00,0x26,0x00,0x26,0xff,0xc9,0x00,0x26,0x00,0x2a,0xff,0xc9,0x00,0x26,0x00,0x32,0xff,0xe5,0x00,0x26,0x00,0x34,0xff,0xc9,0x00,0x26,0x00,0x64,0xff,0xc9,0x00,0x26,0x00,0x67,0xff,0xc9,0x00,0x26,0x00,0x77,\r\n0x00,0x1d,0x00,0x26,0x00,0x92,0xff,0xc9,0x00,0x26,0x00,0xaa,0xff,0xcf,0x00,0x26,0x00,0xaf,0xff,0xc9,0x00,0x26,0x00,0xb0,0xff,0xc9,0x00,0x26,0x00,0xbe,0xff,0xcf,0x00,0x26,0x00,0xd0,0xff,0xc9,0x00,0x26,0x00,0xd1,0xff,0xc9,0x00,0x26,0x00,0xd2,0xff,0xc9,0x00,0x26,0x00,0xf7,0xff,0xc9,0x00,0x26,0x00,0xfc,0xff,0xc9,0x00,0x26,\r\n0x00,0xfe,0xff,0xc9,0x00,0x26,0x01,0x18,0xff,0xe5,0x00,0x26,0x01,0x47,0xff,0xc9,0x00,0x26,0x01,0x51,0xff,0xc9,0x00,0x26,0x01,0x53,0xff,0xc9,0x00,0x26,0x01,0x55,0xff,0xc9,0x00,0x26,0x01,0x5c,0x00,0x1d,0x00,0x26,0x01,0x5e,0x00,0x1d,0x00,0x26,0x01,0x60,0x00,0x1d,0x00,0x26,0x01,0x6e,0xff,0xe5,0x00,0x26,0x01,0x70,0xff,0xe5,\r\n0x00,0x26,0x01,0x89,0xff,0xe5,0x00,0x27,0x00,0x0f,0xff,0x7f,0x00,0x27,0x00,0x11,0xff,0x7f,0x00,0x27,0x00,0x24,0xff,0xdf,0x00,0x27,0x00,0x37,0xff,0xa4,0x00,0x27,0x00,0x3b,0xff,0xcb,0x00,0x27,0x00,0x3d,0xff,0xcf,0x00,0x27,0x00,0x62,0xff,0xdf,0x00,0x27,0x00,0x63,0xff,0xdf,0x00,0x27,0x00,0x91,0xff,0xb6,0x00,0x27,0x00,0xac,\r\n0xff,0x7f,0x00,0x27,0x00,0xad,0xff,0xdf,0x00,0x27,0x00,0xae,0xff,0xdf,0x00,0x27,0x00,0xbb,0xff,0xf6,0x00,0x27,0x00,0xc4,0xff,0x8b,0x00,0x27,0x00,0xc5,0xff,0x8b,0x00,0x27,0x00,0xc7,0xff,0xdf,0x00,0x27,0x00,0xc9,0xff,0xdf,0x00,0x27,0x00,0xe5,0xff,0xcf,0x00,0x27,0x01,0x03,0xff,0xdf,0x00,0x27,0x01,0x05,0xff,0xdf,0x00,0x27,\r\n0x01,0x20,0xff,0xa4,0x00,0x27,0x01,0x22,0xff,0xa4,0x00,0x27,0x01,0x28,0xff,0xcf,0x00,0x27,0x01,0x2a,0xff,0xcf,0x00,0x27,0x01,0x45,0xff,0xdf,0x00,0x27,0x01,0x76,0xff,0xa4,0x00,0x27,0x01,0x85,0xff,0xdf,0x00,0x27,0x01,0x87,0xff,0xdf,0x00,0x28,0x00,0x24,0x00,0x0a,0x00,0x28,0x00,0x2d,0x00,0x44,0x00,0x28,0x00,0x37,0x00,0x04,\r\n0x00,0x28,0x00,0x3a,0x00,0x1d,0x00,0x28,0x00,0x3b,0x00,0x08,0x00,0x28,0x00,0x62,0x00,0x0a,0x00,0x28,0x00,0x63,0x00,0x0a,0x00,0x28,0x00,0x77,0x00,0x12,0x00,0x28,0x00,0xad,0x00,0x0a,0x00,0x28,0x00,0xae,0x00,0x0a,0x00,0x28,0x00,0xc7,0x00,0x0a,0x00,0x28,0x00,0xc9,0x00,0x0a,0x00,0x28,0x01,0x03,0x00,0x0a,0x00,0x28,0x01,0x05,\r\n0x00,0x0a,0x00,0x28,0x01,0x20,0x00,0x04,0x00,0x28,0x01,0x22,0x00,0x04,0x00,0x28,0x01,0x45,0x00,0x0a,0x00,0x28,0x01,0x5c,0x00,0x12,0x00,0x28,0x01,0x5e,0x00,0x12,0x00,0x28,0x01,0x60,0x00,0x12,0x00,0x28,0x01,0x63,0x00,0x44,0x00,0x28,0x01,0x76,0x00,0x04,0x00,0x28,0x01,0x80,0x00,0x1d,0x00,0x28,0x01,0x85,0x00,0x0a,0x00,0x28,\r\n0x01,0x87,0x00,0x0a,0x00,0x28,0x01,0x8c,0x00,0x1d,0x00,0x28,0x01,0x8e,0x00,0x1d,0x00,0x28,0x01,0x90,0x00,0x1d,0x00,0x29,0x00,0x0f,0xff,0x66,0x00,0x29,0x00,0x11,0xff,0x66,0x00,0x29,0x00,0x24,0xff,0x7b,0x00,0x29,0x00,0x2d,0xff,0xbe,0x00,0x29,0x00,0x36,0xff,0xe5,0x00,0x29,0x00,0x37,0x00,0x0e,0x00,0x29,0x00,0x44,0xff,0xb4,\r\n0x00,0x29,0x00,0x49,0x00,0x0a,0x00,0x29,0x00,0x62,0xff,0x7b,0x00,0x29,0x00,0x63,0xff,0x7b,0x00,0x29,0x00,0x77,0x00,0x27,0x00,0x29,0x00,0x91,0xff,0x4c,0x00,0x29,0x00,0xac,0xff,0x66,0x00,0x29,0x00,0xad,0xff,0x7b,0x00,0x29,0x00,0xae,0xff,0x7b,0x00,0x29,0x00,0xc4,0xff,0x4a,0x00,0x29,0x00,0xc5,0xff,0x4a,0x00,0x29,0x00,0xc7,\r\n0xff,0x7b,0x00,0x29,0x00,0xc9,0xff,0x7b,0x00,0x29,0x00,0xe3,0xff,0xe5,0x00,0x29,0x00,0xfa,0xff,0xe5,0x00,0x29,0x01,0x03,0xff,0x7b,0x00,0x29,0x01,0x05,0xff,0x7b,0x00,0x29,0x01,0x06,0xff,0xb4,0x00,0x29,0x01,0x1e,0xff,0xe5,0x00,0x29,0x01,0x20,0x00,0x0e,0x00,0x29,0x01,0x22,0x00,0x0e,0x00,0x29,0x01,0x45,0xff,0x7b,0x00,0x29,\r\n0x01,0x5c,0x00,0x27,0x00,0x29,0x01,0x5e,0x00,0x27,0x00,0x29,0x01,0x60,0x00,0x27,0x00,0x29,0x01,0x63,0xff,0xbe,0x00,0x29,0x01,0x74,0xff,0xe5,0x00,0x29,0x01,0x76,0x00,0x0e,0x00,0x29,0x01,0x85,0xff,0x7b,0x00,0x29,0x01,0x87,0xff,0x7b,0x00,0x29,0x01,0x88,0xff,0xb4,0x00,0x29,0x02,0x3d,0xff,0xe5,0x00,0x2a,0x00,0x37,0xff,0xcf,\r\n0x00,0x2a,0x00,0x39,0xff,0xe5,0x00,0x2a,0x00,0x5c,0xff,0xe5,0x00,0x2a,0x00,0xba,0xff,0xe5,0x00,0x2a,0x00,0xeb,0xff,0xe5,0x00,0x2a,0x01,0x20,0xff,0xcf,0x00,0x2a,0x01,0x22,0xff,0xcf,0x00,0x2a,0x01,0x76,0xff,0xcf,0x00,0x2a,0x01,0x83,0xff,0xe5,0x00,0x2a,0x01,0x93,0xff,0xe5,0x00,0x2d,0x00,0x0f,0xff,0x9a,0x00,0x2d,0x00,0x11,\r\n0xff,0x9a,0x00,0x2d,0x00,0x24,0xff,0xdb,0x00,0x2d,0x00,0x2d,0xff,0xbe,0x00,0x2d,0x00,0x44,0xff,0xe5,0x00,0x2d,0x00,0x62,0xff,0xdb,0x00,0x2d,0x00,0x63,0xff,0xdb,0x00,0x2d,0x00,0x69,0xff,0xe5,0x00,0x2d,0x00,0x6a,0xff,0xe5,0x00,0x2d,0x00,0x6b,0xff,0xe5,0x00,0x2d,0x00,0x6c,0xff,0xe5,0x00,0x2d,0x00,0x6d,0xff,0xe5,0x00,0x2d,\r\n0x00,0x6e,0xff,0xe5,0x00,0x2d,0x00,0x91,0xff,0x98,0x00,0x2d,0x00,0xa0,0xff,0xe5,0x00,0x2d,0x00,0xac,0xff,0x9a,0x00,0x2d,0x00,0xad,0xff,0xdb,0x00,0x2d,0x00,0xae,0xff,0xdb,0x00,0x2d,0x00,0xc4,0xff,0x66,0x00,0x2d,0x00,0xc5,0xff,0x9a,0x00,0x2d,0x00,0xc7,0xff,0xdb,0x00,0x2d,0x00,0xc9,0xff,0xdb,0x00,0x2d,0x01,0x03,0xff,0xdb,\r\n0x00,0x2d,0x01,0x04,0xff,0xe5,0x00,0x2d,0x01,0x05,0xff,0xdb,0x00,0x2d,0x01,0x06,0xff,0xe5,0x00,0x2d,0x01,0x45,0xff,0xdb,0x00,0x2d,0x01,0x46,0xff,0xe5,0x00,0x2d,0x01,0x63,0xff,0xbe,0x00,0x2d,0x01,0x85,0xff,0xdb,0x00,0x2d,0x01,0x86,0xff,0xe5,0x00,0x2d,0x01,0x87,0xff,0xdb,0x00,0x2d,0x01,0x88,0xff,0xe5,0x00,0x2e,0x00,0x0f,\r\n0x00,0x27,0x00,0x2e,0x00,0x1e,0x00,0x27,0x00,0x2e,0x00,0x26,0xff,0xa6,0x00,0x2e,0x00,0x2a,0xff,0xa6,0x00,0x2e,0x00,0x2d,0x00,0x5a,0x00,0x2e,0x00,0x32,0xff,0xa6,0x00,0x2e,0x00,0x34,0xff,0xa6,0x00,0x2e,0x00,0x3b,0x00,0x25,0x00,0x2e,0x00,0x3d,0x00,0x27,0x00,0x2e,0x00,0x46,0xff,0xe5,0x00,0x2e,0x00,0x47,0xff,0xe5,0x00,0x2e,\r\n0x00,0x48,0xff,0xe5,0x00,0x2e,0x00,0x4a,0xff,0xe5,0x00,0x2e,0x00,0x52,0xff,0xe5,0x00,0x2e,0x00,0x54,0xff,0xe5,0x00,0x2e,0x00,0x57,0xff,0xd1,0x00,0x2e,0x00,0x59,0xff,0xb6,0x00,0x2e,0x00,0x5a,0xff,0xcb,0x00,0x2e,0x00,0x5c,0xff,0xa4,0x00,0x2e,0x00,0x64,0xff,0x9a,0x00,0x2e,0x00,0x67,0xff,0xa6,0x00,0x2e,0x00,0x6f,0xff,0xe5,\r\n0x00,0x2e,0x00,0x70,0xff,0xe5,0x00,0x2e,0x00,0x71,0xff,0xe5,0x00,0x2e,0x00,0x72,0xff,0xe5,0x00,0x2e,0x00,0x73,0xff,0xe5,0x00,0x2e,0x00,0x74,0xff,0xcf,0x00,0x2e,0x00,0x77,0x00,0x27,0x00,0x2e,0x00,0x79,0xff,0xe5,0x00,0x2e,0x00,0x7a,0xff,0xe5,0x00,0x2e,0x00,0x7b,0xff,0xe5,0x00,0x2e,0x00,0x7c,0xff,0xe5,0x00,0x2e,0x00,0x7d,\r\n0xff,0xe5,0x00,0x2e,0x00,0x92,0xff,0xa6,0x00,0x2e,0x00,0xaf,0xff,0xa6,0x00,0x2e,0x00,0xb0,0xff,0xa6,0x00,0x2e,0x00,0xb1,0xff,0xe5,0x00,0x2e,0x00,0xba,0xff,0xa4,0x00,0x2e,0x00,0xc4,0x00,0x44,0x00,0x2e,0x00,0xc5,0x00,0x44,0x00,0x2e,0x00,0xd0,0xff,0xa6,0x00,0x2e,0x00,0xd1,0xff,0xa6,0x00,0x2e,0x00,0xd2,0xff,0xa6,0x00,0x2e,\r\n0x00,0xe5,0x00,0x27,0x00,0x2e,0x00,0xeb,0xff,0xa4,0x00,0x2e,0x00,0xf7,0xff,0xa6,0x00,0x2e,0x00,0xf8,0xff,0xe5,0x00,0x2e,0x00,0xfc,0xff,0xa6,0x00,0x2e,0x00,0xfd,0xff,0xe5,0x00,0x2e,0x00,0xfe,0xff,0xa6,0x00,0x2e,0x00,0xff,0xff,0xe5,0x00,0x2e,0x01,0x00,0xff,0xe5,0x00,0x2e,0x01,0x08,0xff,0xe5,0x00,0x2e,0x01,0x0b,0xff,0xe5,\r\n0x00,0x2e,0x01,0x0d,0xff,0xe5,0x00,0x2e,0x01,0x18,0xff,0xa6,0x00,0x2e,0x01,0x19,0xff,0xe5,0x00,0x2e,0x01,0x21,0xff,0xd1,0x00,0x2e,0x01,0x23,0xff,0xd1,0x00,0x2e,0x01,0x28,0x00,0x27,0x00,0x2e,0x01,0x2a,0x00,0x27,0x00,0x2e,0x01,0x47,0xff,0xa6,0x00,0x2e,0x01,0x48,0xff,0xe5,0x00,0x2e,0x01,0x4c,0xff,0xe5,0x00,0x2e,0x01,0x4e,\r\n0xff,0xe5,0x00,0x2e,0x01,0x50,0xff,0xe5,0x00,0x2e,0x01,0x51,0xff,0xa6,0x00,0x2e,0x01,0x52,0xff,0xe5,0x00,0x2e,0x01,0x53,0xff,0xa6,0x00,0x2e,0x01,0x54,0xff,0xe5,0x00,0x2e,0x01,0x55,0xff,0xa6,0x00,0x2e,0x01,0x56,0xff,0xe5,0x00,0x2e,0x01,0x5c,0x00,0x27,0x00,0x2e,0x01,0x5e,0x00,0x27,0x00,0x2e,0x01,0x60,0x00,0x27,0x00,0x2e,\r\n0x01,0x63,0x00,0x5a,0x00,0x2e,0x01,0x6e,0xff,0xa6,0x00,0x2e,0x01,0x6f,0xff,0xe5,0x00,0x2e,0x01,0x70,0xff,0xa6,0x00,0x2e,0x01,0x71,0xff,0xe5,0x00,0x2e,0x01,0x77,0xff,0xd1,0x00,0x2e,0x01,0x81,0xff,0xcb,0x00,0x2e,0x01,0x83,0xff,0xa4,0x00,0x2e,0x01,0x89,0xff,0xa6,0x00,0x2e,0x01,0x8a,0xff,0xe5,0x00,0x2e,0x01,0x8d,0xff,0xcb,\r\n0x00,0x2e,0x01,0x8f,0xff,0xcb,0x00,0x2e,0x01,0x91,0xff,0xcb,0x00,0x2e,0x01,0x93,0xff,0xa4,0x00,0x2f,0x00,0x0d,0xff,0x31,0x00,0x2f,0x00,0x22,0xff,0x9a,0x00,0x2f,0x00,0x24,0x00,0x3b,0x00,0x2f,0x00,0x26,0xff,0xbe,0x00,0x2f,0x00,0x2a,0xff,0xbe,0x00,0x2f,0x00,0x2d,0x00,0x64,0x00,0x2f,0x00,0x32,0xff,0xba,0x00,0x2f,0x00,0x34,\r\n0xff,0xba,0x00,0x2f,0x00,0x37,0xff,0x8f,0x00,0x2f,0x00,0x38,0xff,0xe3,0x00,0x2f,0x00,0x39,0xff,0x8b,0x00,0x2f,0x00,0x3a,0xff,0xcf,0x00,0x2f,0x00,0x3c,0xff,0x7f,0x00,0x2f,0x00,0x3d,0x00,0x3b,0x00,0x2f,0x00,0x57,0xff,0xe5,0x00,0x2f,0x00,0x59,0xff,0x9a,0x00,0x2f,0x00,0x5a,0xff,0xbe,0x00,0x2f,0x00,0x5c,0xff,0xb4,0x00,0x2f,\r\n0x00,0x64,0xff,0xbe,0x00,0x2f,0x00,0x67,0xff,0xba,0x00,0x2f,0x00,0x68,0xff,0xe3,0x00,0x2f,0x00,0x8d,0xff,0x9a,0x00,0x2f,0x00,0x92,0xff,0xba,0x00,0x2f,0x00,0xaf,0xff,0xba,0x00,0x2f,0x00,0xb0,0xff,0xba,0x00,0x2f,0x00,0xb4,0xff,0x73,0x00,0x2f,0x00,0xb5,0xff,0x8b,0x00,0x2f,0x00,0xb6,0xff,0x73,0x00,0x2f,0x00,0xb7,0xff,0x7f,\r\n0x00,0x2f,0x00,0xba,0xff,0xb4,0x00,0x2f,0x00,0xbb,0xff,0x9a,0x00,0x2f,0x00,0xc4,0x00,0x44,0x00,0x2f,0x00,0xc5,0x00,0x44,0x00,0x2f,0x00,0xd0,0xff,0xba,0x00,0x2f,0x00,0xd1,0xff,0xba,0x00,0x2f,0x00,0xd2,0xff,0xba,0x00,0x2f,0x00,0xd3,0xff,0xe3,0x00,0x2f,0x00,0xd4,0xff,0xe3,0x00,0x2f,0x00,0xd5,0xff,0xe3,0x00,0x2f,0x00,0xe5,\r\n0x00,0x3b,0x00,0x2f,0x00,0xea,0xff,0x7f,0x00,0x2f,0x00,0xeb,0xff,0xb4,0x00,0x2f,0x00,0xf7,0xff,0xbe,0x00,0x2f,0x00,0xfc,0xff,0xbe,0x00,0x2f,0x00,0xfe,0xff,0xbe,0x00,0x2f,0x01,0x03,0x00,0x3b,0x00,0x2f,0x01,0x05,0x00,0x3b,0x00,0x2f,0x01,0x18,0xff,0xba,0x00,0x2f,0x01,0x20,0xff,0x8f,0x00,0x2f,0x01,0x21,0xff,0xe5,0x00,0x2f,\r\n0x01,0x22,0xff,0x8f,0x00,0x2f,0x01,0x23,0xff,0xe5,0x00,0x2f,0x01,0x24,0xff,0xe3,0x00,0x2f,0x01,0x26,0xff,0xe3,0x00,0x2f,0x01,0x28,0x00,0x3b,0x00,0x2f,0x01,0x2a,0x00,0x3b,0x00,0x2f,0x01,0x45,0x00,0x3b,0x00,0x2f,0x01,0x47,0xff,0xbe,0x00,0x2f,0x01,0x51,0xff,0xbe,0x00,0x2f,0x01,0x53,0xff,0xbe,0x00,0x2f,0x01,0x55,0xff,0xbe,\r\n0x00,0x2f,0x01,0x63,0x00,0x64,0x00,0x2f,0x01,0x6e,0xff,0xba,0x00,0x2f,0x01,0x70,0xff,0xba,0x00,0x2f,0x01,0x76,0xff,0x8f,0x00,0x2f,0x01,0x77,0xff,0xe5,0x00,0x2f,0x01,0x78,0xff,0xe3,0x00,0x2f,0x01,0x7a,0xff,0xe3,0x00,0x2f,0x01,0x7c,0xff,0xe3,0x00,0x2f,0x01,0x7e,0xff,0xe3,0x00,0x2f,0x01,0x80,0xff,0xcf,0x00,0x2f,0x01,0x81,\r\n0xff,0xbe,0x00,0x2f,0x01,0x82,0xff,0x7f,0x00,0x2f,0x01,0x83,0xff,0xb4,0x00,0x2f,0x01,0x85,0x00,0x3b,0x00,0x2f,0x01,0x87,0x00,0x3b,0x00,0x2f,0x01,0x89,0xff,0xba,0x00,0x2f,0x01,0x8c,0xff,0xcf,0x00,0x2f,0x01,0x8d,0xff,0xbe,0x00,0x2f,0x01,0x8e,0xff,0xcf,0x00,0x2f,0x01,0x8f,0xff,0xbe,0x00,0x2f,0x01,0x90,0xff,0xcf,0x00,0x2f,\r\n0x01,0x91,0xff,0xbe,0x00,0x2f,0x01,0x92,0xff,0x7f,0x00,0x2f,0x01,0x93,0xff,0xb4,0x00,0x32,0x00,0x0f,0xff,0xa4,0x00,0x32,0x00,0x11,0xff,0xa4,0x00,0x32,0x00,0x24,0xff,0xe5,0x00,0x32,0x00,0x2d,0xff,0xf6,0x00,0x32,0x00,0x37,0xff,0xa4,0x00,0x32,0x00,0x3b,0xff,0xdb,0x00,0x32,0x00,0x3c,0xff,0xe7,0x00,0x32,0x00,0x3d,0xff,0xcf,\r\n0x00,0x32,0x00,0x62,0xff,0xe5,0x00,0x32,0x00,0x63,0xff,0xe5,0x00,0x32,0x00,0xac,0xff,0xa4,0x00,0x32,0x00,0xad,0xff,0xe5,0x00,0x32,0x00,0xae,0xff,0xe5,0x00,0x32,0x00,0xbb,0xff,0xf6,0x00,0x32,0x00,0xc4,0xff,0x4c,0x00,0x32,0x00,0xc5,0xff,0x98,0x00,0x32,0x00,0xc7,0xff,0xe5,0x00,0x32,0x00,0xc9,0xff,0xe5,0x00,0x32,0x00,0xe5,\r\n0xff,0xcf,0x00,0x32,0x00,0xea,0xff,0xe7,0x00,0x32,0x01,0x03,0xff,0xe5,0x00,0x32,0x01,0x05,0xff,0xe5,0x00,0x32,0x01,0x20,0xff,0xa4,0x00,0x32,0x01,0x22,0xff,0xa4,0x00,0x32,0x01,0x28,0xff,0xcf,0x00,0x32,0x01,0x2a,0xff,0xcf,0x00,0x32,0x01,0x45,0xff,0xe5,0x00,0x32,0x01,0x63,0xff,0xf6,0x00,0x32,0x01,0x76,0xff,0xa4,0x00,0x32,\r\n0x01,0x82,0xff,0xe7,0x00,0x32,0x01,0x85,0xff,0xe5,0x00,0x32,0x01,0x87,0xff,0xe5,0x00,0x32,0x01,0x92,0xff,0xe7,0x00,0x33,0x00,0x0f,0xfe,0xba,0x00,0x33,0x00,0x11,0xfe,0xba,0x00,0x33,0x00,0x24,0xff,0x62,0x00,0x33,0x00,0x2a,0xff,0xf6,0x00,0x33,0x00,0x2d,0xff,0x7f,0x00,0x33,0x00,0x3a,0x00,0x27,0x00,0x33,0x00,0x3b,0xff,0xc3,\r\n0x00,0x33,0x00,0x44,0xff,0xbe,0x00,0x33,0x00,0x46,0xff,0xb4,0x00,0x33,0x00,0x47,0xff,0xb4,0x00,0x33,0x00,0x48,0xff,0xb4,0x00,0x33,0x00,0x4a,0xff,0xb4,0x00,0x33,0x00,0x52,0xff,0xb4,0x00,0x33,0x00,0x54,0xff,0xb6,0x00,0x33,0x00,0x62,0xff,0x62,0x00,0x33,0x00,0x63,0xff,0x62,0x00,0x33,0x00,0x69,0xff,0xbe,0x00,0x33,0x00,0x6a,\r\n0xff,0xbe,0x00,0x33,0x00,0x6b,0xff,0xbe,0x00,0x33,0x00,0x6c,0xff,0xbe,0x00,0x33,0x00,0x6d,0xff,0xbe,0x00,0x33,0x00,0x6e,0xff,0xbe,0x00,0x33,0x00,0x6f,0xff,0xb4,0x00,0x33,0x00,0x70,0xff,0xb4,0x00,0x33,0x00,0x71,0xff,0xb4,0x00,0x33,0x00,0x72,0xff,0xb4,0x00,0x33,0x00,0x73,0xff,0xb4,0x00,0x33,0x00,0x79,0xff,0xb4,0x00,0x33,\r\n0x00,0x7a,0xff,0xb4,0x00,0x33,0x00,0x7b,0xff,0xb4,0x00,0x33,0x00,0x7c,0xff,0xb4,0x00,0x33,0x00,0x7d,0xff,0xb4,0x00,0x33,0x00,0x91,0xfe,0xe9,0x00,0x33,0x00,0xa0,0xff,0xbe,0x00,0x33,0x00,0xac,0xfe,0xba,0x00,0x33,0x00,0xad,0xff,0x62,0x00,0x33,0x00,0xae,0xff,0x62,0x00,0x33,0x00,0xb1,0xff,0xb4,0x00,0x33,0x00,0xc4,0xfe,0xba,\r\n0x00,0x33,0x00,0xc5,0xfe,0xae,0x00,0x33,0x00,0xc7,0xff,0x62,0x00,0x33,0x00,0xc9,0xff,0x62,0x00,0x33,0x00,0xf7,0xff,0xf6,0x00,0x33,0x00,0xf8,0xff,0xb4,0x00,0x33,0x00,0xfd,0xff,0xb4,0x00,0x33,0x00,0xff,0xff,0xb4,0x00,0x33,0x01,0x00,0xff,0xb4,0x00,0x33,0x01,0x03,0xff,0x62,0x00,0x33,0x01,0x04,0xff,0xbe,0x00,0x33,0x01,0x05,\r\n0xff,0x62,0x00,0x33,0x01,0x06,0xff,0xbe,0x00,0x33,0x01,0x08,0xff,0xb4,0x00,0x33,0x01,0x0b,0xff,0xb4,0x00,0x33,0x01,0x0d,0xff,0xb4,0x00,0x33,0x01,0x19,0xff,0xb4,0x00,0x33,0x01,0x45,0xff,0x62,0x00,0x33,0x01,0x46,0xff,0xbe,0x00,0x33,0x01,0x48,0xff,0xb4,0x00,0x33,0x01,0x4c,0xff,0xb4,0x00,0x33,0x01,0x4e,0xff,0xb4,0x00,0x33,\r\n0x01,0x50,0xff,0xb4,0x00,0x33,0x01,0x51,0xff,0xf6,0x00,0x33,0x01,0x52,0xff,0xb4,0x00,0x33,0x01,0x53,0xff,0xf6,0x00,0x33,0x01,0x54,0xff,0xb4,0x00,0x33,0x01,0x55,0xff,0xf6,0x00,0x33,0x01,0x56,0xff,0xb4,0x00,0x33,0x01,0x63,0xff,0x7f,0x00,0x33,0x01,0x6f,0xff,0xb4,0x00,0x33,0x01,0x71,0xff,0xb4,0x00,0x33,0x01,0x80,0x00,0x27,\r\n0x00,0x33,0x01,0x85,0xff,0x62,0x00,0x33,0x01,0x86,0xff,0xbe,0x00,0x33,0x01,0x87,0xff,0x62,0x00,0x33,0x01,0x88,0xff,0xbe,0x00,0x33,0x01,0x8a,0xff,0xb4,0x00,0x33,0x01,0x8c,0x00,0x27,0x00,0x33,0x01,0x8e,0x00,0x27,0x00,0x33,0x01,0x90,0x00,0x27,0x00,0x34,0x00,0x0f,0xff,0xa4,0x00,0x34,0x00,0x11,0xff,0x7f,0x00,0x34,0x00,0x24,\r\n0xff,0xe5,0x00,0x34,0x00,0x37,0xff,0xa4,0x00,0x34,0x00,0x3b,0xff,0xdb,0x00,0x34,0x00,0x3c,0xff,0xf6,0x00,0x34,0x00,0x3d,0xff,0xcf,0x00,0x34,0x00,0x62,0xff,0xe5,0x00,0x34,0x00,0x63,0xff,0xe5,0x00,0x34,0x00,0xac,0xff,0x7f,0x00,0x34,0x00,0xad,0xff,0xe5,0x00,0x34,0x00,0xae,0xff,0xe5,0x00,0x34,0x00,0xbb,0xff,0xf6,0x00,0x34,\r\n0x00,0xc4,0xff,0x98,0x00,0x34,0x00,0xc5,0xff,0x98,0x00,0x34,0x00,0xc7,0xff,0xe5,0x00,0x34,0x00,0xc9,0xff,0xe5,0x00,0x34,0x00,0xe5,0xff,0xcf,0x00,0x34,0x00,0xea,0xff,0xf6,0x00,0x34,0x01,0x03,0xff,0xe5,0x00,0x34,0x01,0x05,0xff,0xe5,0x00,0x34,0x01,0x20,0xff,0xa4,0x00,0x34,0x01,0x22,0xff,0xa4,0x00,0x34,0x01,0x28,0xff,0xcf,\r\n0x00,0x34,0x01,0x2a,0xff,0xcf,0x00,0x34,0x01,0x45,0xff,0xe5,0x00,0x34,0x01,0x76,0xff,0xa4,0x00,0x34,0x01,0x82,0xff,0xf6,0x00,0x34,0x01,0x85,0xff,0xe5,0x00,0x34,0x01,0x87,0xff,0xe5,0x00,0x34,0x01,0x92,0xff,0xf6,0x00,0x35,0x00,0x1e,0x00,0x52,0x00,0x35,0x00,0x26,0xff,0xe3,0x00,0x35,0x00,0x2a,0xff,0xe3,0x00,0x35,0x00,0x2d,\r\n0x00,0x39,0x00,0x35,0x00,0x32,0xff,0xec,0x00,0x35,0x00,0x34,0xff,0xec,0x00,0x35,0x00,0x37,0xff,0xcb,0x00,0x35,0x00,0x3c,0xff,0xd9,0x00,0x35,0x00,0x46,0xff,0xcb,0x00,0x35,0x00,0x47,0xff,0xcb,0x00,0x35,0x00,0x48,0xff,0xc7,0x00,0x35,0x00,0x4a,0xff,0xc7,0x00,0x35,0x00,0x52,0xff,0xc5,0x00,0x35,0x00,0x54,0xff,0xcb,0x00,0x35,\r\n0x00,0x64,0xff,0xe5,0x00,0x35,0x00,0x67,0xff,0xec,0x00,0x35,0x00,0x6f,0xff,0xbe,0x00,0x35,0x00,0x70,0xff,0xbe,0x00,0x35,0x00,0x71,0xff,0xbe,0x00,0x35,0x00,0x72,0xff,0xbe,0x00,0x35,0x00,0x73,0xff,0xbe,0x00,0x35,0x00,0x79,0xff,0xc5,0x00,0x35,0x00,0x7a,0xff,0xc5,0x00,0x35,0x00,0x7b,0xff,0xc5,0x00,0x35,0x00,0x7c,0xff,0xc5,\r\n0x00,0x35,0x00,0x7d,0xff,0xc5,0x00,0x35,0x00,0x92,0xff,0xec,0x00,0x35,0x00,0xaf,0xff,0xec,0x00,0x35,0x00,0xb0,0xff,0xec,0x00,0x35,0x00,0xb1,0xff,0xc5,0x00,0x35,0x00,0xbb,0xff,0xe5,0x00,0x35,0x00,0xd0,0xff,0xec,0x00,0x35,0x00,0xd1,0xff,0xec,0x00,0x35,0x00,0xd2,0xff,0xec,0x00,0x35,0x00,0xea,0xff,0xd9,0x00,0x35,0x00,0xf7,\r\n0xff,0xe3,0x00,0x35,0x00,0xf8,0xff,0xc7,0x00,0x35,0x00,0xfc,0xff,0xe3,0x00,0x35,0x00,0xfd,0xff,0xcb,0x00,0x35,0x00,0xfe,0xff,0xe3,0x00,0x35,0x00,0xff,0xff,0xcb,0x00,0x35,0x01,0x00,0xff,0xcb,0x00,0x35,0x01,0x08,0xff,0xcb,0x00,0x35,0x01,0x0b,0xff,0xc7,0x00,0x35,0x01,0x0d,0xff,0xbe,0x00,0x35,0x01,0x18,0xff,0xec,0x00,0x35,\r\n0x01,0x19,0xff,0xc5,0x00,0x35,0x01,0x20,0xff,0xcb,0x00,0x35,0x01,0x22,0xff,0xcb,0x00,0x35,0x01,0x47,0xff,0xe3,0x00,0x35,0x01,0x48,0xff,0xcb,0x00,0x35,0x01,0x4c,0xff,0xbe,0x00,0x35,0x01,0x4e,0xff,0xbe,0x00,0x35,0x01,0x50,0xff,0xbe,0x00,0x35,0x01,0x51,0xff,0xe3,0x00,0x35,0x01,0x52,0xff,0xc7,0x00,0x35,0x01,0x53,0xff,0xe3,\r\n0x00,0x35,0x01,0x54,0xff,0xc7,0x00,0x35,0x01,0x55,0xff,0xe3,0x00,0x35,0x01,0x56,0xff,0xc7,0x00,0x35,0x01,0x63,0x00,0x39,0x00,0x35,0x01,0x6e,0xff,0xec,0x00,0x35,0x01,0x6f,0xff,0xc5,0x00,0x35,0x01,0x70,0xff,0xec,0x00,0x35,0x01,0x71,0xff,0xc5,0x00,0x35,0x01,0x76,0xff,0xcb,0x00,0x35,0x01,0x82,0xff,0xd9,0x00,0x35,0x01,0x89,\r\n0xff,0xec,0x00,0x35,0x01,0x8a,0xff,0xc5,0x00,0x35,0x01,0x92,0xff,0xd9,0x00,0x36,0x00,0x57,0xff,0xbe,0x00,0x36,0x00,0x59,0xff,0xcf,0x00,0x36,0x00,0x5a,0xff,0xe5,0x00,0x36,0x00,0x5c,0xff,0xd1,0x00,0x36,0x00,0xba,0xff,0xbe,0x00,0x36,0x00,0xc4,0xff,0xb2,0x00,0x36,0x00,0xc5,0xff,0xb2,0x00,0x36,0x00,0xeb,0xff,0xd1,0x00,0x36,\r\n0x01,0x21,0xff,0xbe,0x00,0x36,0x01,0x23,0xff,0xbe,0x00,0x36,0x01,0x77,0xff,0xbe,0x00,0x36,0x01,0x81,0xff,0xe5,0x00,0x36,0x01,0x83,0xff,0xd1,0x00,0x36,0x01,0x8d,0xff,0xe5,0x00,0x36,0x01,0x8f,0xff,0xe5,0x00,0x36,0x01,0x91,0xff,0xe5,0x00,0x36,0x01,0x93,0xff,0xd1,0x00,0x37,0x00,0x0f,0xff,0x7f,0x00,0x37,0x00,0x11,0xff,0x4c,\r\n0x00,0x37,0x00,0x1d,0xff,0xe9,0x00,0x37,0x00,0x1e,0xff,0xe9,0x00,0x37,0x00,0x24,0xff,0x66,0x00,0x37,0x00,0x26,0xff,0xa4,0x00,0x37,0x00,0x2a,0xff,0xa4,0x00,0x37,0x00,0x2d,0xff,0x8f,0x00,0x37,0x00,0x32,0xff,0xa4,0x00,0x37,0x00,0x34,0xff,0xa4,0x00,0x37,0x00,0x37,0x00,0x27,0x00,0x37,0x00,0x39,0x00,0x2b,0x00,0x37,0x00,0x3a,\r\n0x00,0x27,0x00,0x37,0x00,0x3b,0xff,0xfa,0x00,0x37,0x00,0x3c,0x00,0x1d,0x00,0x37,0x00,0x44,0xff,0x27,0x00,0x37,0x00,0x46,0xff,0x2d,0x00,0x37,0x00,0x47,0xff,0x2d,0x00,0x37,0x00,0x48,0xff,0x2d,0x00,0x37,0x00,0x49,0xff,0xa0,0x00,0x37,0x00,0x4a,0xff,0x2d,0x00,0x37,0x00,0x50,0xff,0x4e,0x00,0x37,0x00,0x51,0xff,0x4e,0x00,0x37,\r\n0x00,0x52,0xff,0x2d,0x00,0x37,0x00,0x53,0xff,0x4e,0x00,0x37,0x00,0x54,0xff,0x2d,0x00,0x37,0x00,0x55,0xff,0x4e,0x00,0x37,0x00,0x56,0xff,0x66,0x00,0x37,0x00,0x58,0xff,0x4e,0x00,0x37,0x00,0x59,0xff,0x9a,0x00,0x37,0x00,0x5a,0xff,0x8f,0x00,0x37,0x00,0x5b,0xff,0x4c,0x00,0x37,0x00,0x5c,0xff,0x8f,0x00,0x37,0x00,0x5d,0xff,0x7f,\r\n0x00,0x37,0x00,0x62,0xff,0x66,0x00,0x37,0x00,0x63,0xff,0x66,0x00,0x37,0x00,0x64,0xff,0xa4,0x00,0x37,0x00,0x67,0xff,0xa4,0x00,0x37,0x00,0x69,0xff,0x27,0x00,0x37,0x00,0x6a,0xff,0x27,0x00,0x37,0x00,0x6b,0xff,0x27,0x00,0x37,0x00,0x6c,0xff,0x27,0x00,0x37,0x00,0x6d,0xff,0x3f,0x00,0x37,0x00,0x6e,0xff,0x27,0x00,0x37,0x00,0x6f,\r\n0xff,0x1b,0x00,0x37,0x00,0x70,0xff,0x2d,0x00,0x37,0x00,0x71,0xff,0x2d,0x00,0x37,0x00,0x72,0xff,0x2d,0x00,0x37,0x00,0x73,0xff,0x2d,0x00,0x37,0x00,0x74,0xff,0xe9,0x00,0x37,0x00,0x76,0x00,0x31,0x00,0x37,0x00,0x77,0x00,0x6f,0x00,0x37,0x00,0x78,0xff,0x4e,0x00,0x37,0x00,0x79,0xff,0x2d,0x00,0x37,0x00,0x7a,0xff,0x2d,0x00,0x37,\r\n0x00,0x7b,0xff,0x2d,0x00,0x37,0x00,0x7c,0xff,0x2d,0x00,0x37,0x00,0x7d,0xff,0x2d,0x00,0x37,0x00,0x7e,0xff,0x4e,0x00,0x37,0x00,0x7f,0xff,0x4e,0x00,0x37,0x00,0x80,0xff,0x4e,0x00,0x37,0x00,0x81,0xff,0x4e,0x00,0x37,0x00,0x8d,0x00,0x52,0x00,0x37,0x00,0x91,0xff,0x0c,0x00,0x37,0x00,0x92,0xff,0xa4,0x00,0x37,0x00,0xa0,0xff,0x27,\r\n0x00,0x37,0x00,0xaa,0xff,0x9a,0x00,0x37,0x00,0xab,0xff,0xcf,0x00,0x37,0x00,0xac,0xff,0x4c,0x00,0x37,0x00,0xad,0xff,0x66,0x00,0x37,0x00,0xae,0xff,0x66,0x00,0x37,0x00,0xaf,0xff,0xa4,0x00,0x37,0x00,0xb0,0xff,0xa4,0x00,0x37,0x00,0xb1,0xff,0x2d,0x00,0x37,0x00,0xb5,0x00,0x27,0x00,0x37,0x00,0xb7,0x00,0x27,0x00,0x37,0x00,0xba,\r\n0xff,0x8f,0x00,0x37,0x00,0xbe,0xff,0x9a,0x00,0x37,0x00,0xbf,0xff,0xcf,0x00,0x37,0x00,0xc4,0xff,0x17,0x00,0x37,0x00,0xc5,0xff,0x17,0x00,0x37,0x00,0xc7,0xff,0x66,0x00,0x37,0x00,0xc9,0xff,0x66,0x00,0x37,0x00,0xd0,0xff,0xa4,0x00,0x37,0x00,0xd1,0xff,0xa4,0x00,0x37,0x00,0xd2,0xff,0xa4,0x00,0x37,0x00,0xe4,0xff,0x66,0x00,0x37,\r\n0x00,0xe6,0xff,0x7f,0x00,0x37,0x00,0xea,0x00,0x1d,0x00,0x37,0x00,0xeb,0xff,0x8f,0x00,0x37,0x00,0xf7,0xff,0xa4,0x00,0x37,0x00,0xf8,0xff,0x2d,0x00,0x37,0x00,0xfb,0xff,0x66,0x00,0x37,0x00,0xfc,0xff,0xa4,0x00,0x37,0x00,0xfd,0xff,0x2d,0x00,0x37,0x00,0xfe,0xff,0xa4,0x00,0x37,0x00,0xff,0xff,0x2d,0x00,0x37,0x01,0x00,0xff,0x2d,\r\n0x00,0x37,0x01,0x03,0xff,0x66,0x00,0x37,0x01,0x04,0xff,0x27,0x00,0x37,0x01,0x05,0xff,0x66,0x00,0x37,0x01,0x06,0xff,0x27,0x00,0x37,0x01,0x08,0xff,0x2d,0x00,0x37,0x01,0x0b,0xff,0x2d,0x00,0x37,0x01,0x0d,0xff,0x2d,0x00,0x37,0x01,0x15,0xff,0x4e,0x00,0x37,0x01,0x17,0xff,0x4e,0x00,0x37,0x01,0x18,0xff,0xa4,0x00,0x37,0x01,0x19,\r\n0xff,0x2d,0x00,0x37,0x01,0x1b,0xff,0x4e,0x00,0x37,0x01,0x1d,0xff,0x4e,0x00,0x37,0x01,0x1f,0xff,0x66,0x00,0x37,0x01,0x20,0x00,0x27,0x00,0x37,0x01,0x22,0x00,0x27,0x00,0x37,0x01,0x25,0xff,0x4e,0x00,0x37,0x01,0x27,0xff,0x4e,0x00,0x37,0x01,0x29,0xff,0x7f,0x00,0x37,0x01,0x2b,0xff,0x7f,0x00,0x37,0x01,0x45,0xff,0x66,0x00,0x37,\r\n0x01,0x46,0xff,0x27,0x00,0x37,0x01,0x47,0xff,0xa4,0x00,0x37,0x01,0x48,0xff,0x2d,0x00,0x37,0x01,0x4c,0xff,0x2d,0x00,0x37,0x01,0x4e,0xff,0x2d,0x00,0x37,0x01,0x50,0xff,0x2d,0x00,0x37,0x01,0x51,0xff,0xa4,0x00,0x37,0x01,0x52,0xff,0x2d,0x00,0x37,0x01,0x53,0xff,0xa4,0x00,0x37,0x01,0x54,0xff,0x2d,0x00,0x37,0x01,0x55,0xff,0xa4,\r\n0x00,0x37,0x01,0x56,0xff,0x2d,0x00,0x37,0x01,0x5c,0x00,0x6f,0x00,0x37,0x01,0x5e,0x00,0x6f,0x00,0x37,0x01,0x60,0x00,0x6f,0x00,0x37,0x01,0x63,0xff,0x8f,0x00,0x37,0x01,0x6d,0xff,0x4e,0x00,0x37,0x01,0x6e,0xff,0xa4,0x00,0x37,0x01,0x6f,0xff,0x2d,0x00,0x37,0x01,0x70,0xff,0xa4,0x00,0x37,0x01,0x71,0xff,0x2d,0x00,0x37,0x01,0x73,\r\n0xff,0x4e,0x00,0x37,0x01,0x75,0xff,0x66,0x00,0x37,0x01,0x76,0x00,0x27,0x00,0x37,0x01,0x79,0xff,0x4e,0x00,0x37,0x01,0x7b,0xff,0x4e,0x00,0x37,0x01,0x7d,0xff,0x4e,0x00,0x37,0x01,0x7f,0xff,0x4e,0x00,0x37,0x01,0x80,0x00,0x27,0x00,0x37,0x01,0x81,0xff,0x8f,0x00,0x37,0x01,0x82,0x00,0x1d,0x00,0x37,0x01,0x83,0xff,0x8f,0x00,0x37,\r\n0x01,0x85,0xff,0x66,0x00,0x37,0x01,0x86,0xff,0x27,0x00,0x37,0x01,0x87,0xff,0x66,0x00,0x37,0x01,0x88,0xff,0x27,0x00,0x37,0x01,0x89,0xff,0xa4,0x00,0x37,0x01,0x8a,0xff,0x2d,0x00,0x37,0x01,0x8c,0x00,0x27,0x00,0x37,0x01,0x8d,0xff,0x8f,0x00,0x37,0x01,0x8e,0x00,0x27,0x00,0x37,0x01,0x8f,0xff,0x8f,0x00,0x37,0x01,0x90,0x00,0x27,\r\n0x00,0x37,0x01,0x91,0xff,0x8f,0x00,0x37,0x01,0x92,0x00,0x1d,0x00,0x37,0x01,0x93,0xff,0x8f,0x00,0x37,0x02,0x3e,0xff,0x66,0x00,0x38,0x00,0x24,0xff,0xd7,0x00,0x38,0x00,0x91,0xff,0x8b,0x00,0x38,0x00,0xc4,0xff,0xa6,0x00,0x38,0x00,0xc5,0xff,0xa6,0x00,0x38,0x01,0x03,0xff,0xd7,0x00,0x38,0x01,0x05,0xff,0xd7,0x00,0x38,0x01,0x45,\r\n0xff,0xd7,0x00,0x38,0x01,0x85,0xff,0xd7,0x00,0x38,0x01,0x87,0xff,0xd7,0x00,0x39,0x00,0x0f,0xff,0x33,0x00,0x39,0x00,0x11,0xff,0x1b,0x00,0x39,0x00,0x24,0xff,0x8b,0x00,0x39,0x00,0x26,0xff,0xd5,0x00,0x39,0x00,0x2a,0xff,0xd5,0x00,0x39,0x00,0x2d,0xff,0xba,0x00,0x39,0x00,0x32,0xff,0xf4,0x00,0x39,0x00,0x34,0xff,0xd5,0x00,0x39,\r\n0x00,0x36,0xff,0xe5,0x00,0x39,0x00,0x37,0x00,0x27,0x00,0x39,0x00,0x44,0xff,0x6d,0x00,0x39,0x00,0x46,0xff,0x7f,0x00,0x39,0x00,0x47,0xff,0x7f,0x00,0x39,0x00,0x48,0xff,0x7f,0x00,0x39,0x00,0x4a,0xff,0x7f,0x00,0x39,0x00,0x50,0xff,0xb4,0x00,0x39,0x00,0x51,0xff,0xb4,0x00,0x39,0x00,0x52,0xff,0x7f,0x00,0x39,0x00,0x53,0xff,0xb4,\r\n0x00,0x39,0x00,0x54,0xff,0x7f,0x00,0x39,0x00,0x55,0xff,0xb4,0x00,0x39,0x00,0x56,0xff,0xbe,0x00,0x39,0x00,0x58,0xff,0xb4,0x00,0x39,0x00,0x62,0xff,0x8b,0x00,0x39,0x00,0x63,0xff,0x8b,0x00,0x39,0x00,0x64,0xff,0xe1,0x00,0x39,0x00,0x67,0xff,0xf4,0x00,0x39,0x00,0x69,0xff,0x6d,0x00,0x39,0x00,0x6a,0xff,0x6d,0x00,0x39,0x00,0x6b,\r\n0xff,0x6d,0x00,0x39,0x00,0x6c,0xff,0x6d,0x00,0x39,0x00,0x6d,0xff,0x6d,0x00,0x39,0x00,0x6e,0xff,0x6d,0x00,0x39,0x00,0x6f,0xff,0x7f,0x00,0x39,0x00,0x70,0xff,0x7f,0x00,0x39,0x00,0x71,0xff,0x7f,0x00,0x39,0x00,0x72,0xff,0x7f,0x00,0x39,0x00,0x73,0xff,0x7f,0x00,0x39,0x00,0x76,0x00,0x1d,0x00,0x39,0x00,0x77,0x00,0x5a,0x00,0x39,\r\n0x00,0x78,0xff,0xb4,0x00,0x39,0x00,0x79,0xff,0x7f,0x00,0x39,0x00,0x7a,0xff,0x7f,0x00,0x39,0x00,0x7b,0xff,0x7f,0x00,0x39,0x00,0x7c,0xff,0x7f,0x00,0x39,0x00,0x7d,0xff,0x7f,0x00,0x39,0x00,0x7e,0xff,0xb4,0x00,0x39,0x00,0x7f,0xff,0xb4,0x00,0x39,0x00,0x80,0xff,0xb4,0x00,0x39,0x00,0x81,0xff,0xb4,0x00,0x39,0x00,0x8d,0x00,0x52,\r\n0x00,0x39,0x00,0x91,0xff,0x44,0x00,0x39,0x00,0x92,0xff,0xf4,0x00,0x39,0x00,0xa0,0xff,0x6d,0x00,0x39,0x00,0xa2,0xff,0x75,0x00,0x39,0x00,0xaa,0xff,0xcf,0x00,0x39,0x00,0xac,0xff,0x1b,0x00,0x39,0x00,0xad,0xff,0x8b,0x00,0x39,0x00,0xae,0xff,0x8b,0x00,0x39,0x00,0xaf,0xff,0xf4,0x00,0x39,0x00,0xb0,0xff,0xf4,0x00,0x39,0x00,0xb1,\r\n0xff,0x7f,0x00,0x39,0x00,0xbe,0xff,0xcf,0x00,0x39,0x00,0xc4,0xff,0x73,0x00,0x39,0x00,0xc5,0xff,0x7f,0x00,0x39,0x00,0xc7,0xff,0x8b,0x00,0x39,0x00,0xc9,0xff,0x8b,0x00,0x39,0x00,0xd0,0xff,0xf4,0x00,0x39,0x00,0xd1,0xff,0xf4,0x00,0x39,0x00,0xd2,0xff,0xf4,0x00,0x39,0x00,0xe3,0xff,0xe5,0x00,0x39,0x00,0xe4,0xff,0xbe,0x00,0x39,\r\n0x00,0xf7,0xff,0xd5,0x00,0x39,0x00,0xf8,0xff,0x7f,0x00,0x39,0x00,0xfa,0xff,0xe5,0x00,0x39,0x00,0xfb,0xff,0xbe,0x00,0x39,0x00,0xfc,0xff,0xd5,0x00,0x39,0x00,0xfd,0xff,0x7f,0x00,0x39,0x00,0xfe,0xff,0xd5,0x00,0x39,0x00,0xff,0xff,0x7f,0x00,0x39,0x01,0x00,0xff,0x7f,0x00,0x39,0x01,0x03,0xff,0x8b,0x00,0x39,0x01,0x04,0xff,0x6d,\r\n0x00,0x39,0x01,0x05,0xff,0x8b,0x00,0x39,0x01,0x06,0xff,0x6d,0x00,0x39,0x01,0x08,0xff,0x7f,0x00,0x39,0x01,0x0b,0xff,0x7f,0x00,0x39,0x01,0x0d,0xff,0x7f,0x00,0x39,0x01,0x15,0xff,0xb4,0x00,0x39,0x01,0x17,0xff,0xb4,0x00,0x39,0x01,0x18,0xff,0xf4,0x00,0x39,0x01,0x19,0xff,0x7f,0x00,0x39,0x01,0x1b,0xff,0xb4,0x00,0x39,0x01,0x1d,\r\n0xff,0xb4,0x00,0x39,0x01,0x1e,0xff,0xe5,0x00,0x39,0x01,0x1f,0xff,0xbe,0x00,0x39,0x01,0x20,0x00,0x27,0x00,0x39,0x01,0x22,0x00,0x27,0x00,0x39,0x01,0x25,0xff,0xb4,0x00,0x39,0x01,0x27,0xff,0xb4,0x00,0x39,0x01,0x45,0xff,0x8b,0x00,0x39,0x01,0x46,0xff,0x6d,0x00,0x39,0x01,0x47,0xff,0xd5,0x00,0x39,0x01,0x48,0xff,0x7f,0x00,0x39,\r\n0x01,0x4c,0xff,0x7f,0x00,0x39,0x01,0x4e,0xff,0x7f,0x00,0x39,0x01,0x50,0xff,0x7f,0x00,0x39,0x01,0x51,0xff,0xd5,0x00,0x39,0x01,0x52,0xff,0x7f,0x00,0x39,0x01,0x53,0xff,0xd5,0x00,0x39,0x01,0x54,0xff,0x7f,0x00,0x39,0x01,0x55,0xff,0xd5,0x00,0x39,0x01,0x56,0xff,0x7f,0x00,0x39,0x01,0x5c,0x00,0x5a,0x00,0x39,0x01,0x5e,0x00,0x5a,\r\n0x00,0x39,0x01,0x60,0x00,0x5a,0x00,0x39,0x01,0x63,0xff,0xba,0x00,0x39,0x01,0x6d,0xff,0xb4,0x00,0x39,0x01,0x6e,0xff,0xf4,0x00,0x39,0x01,0x6f,0xff,0x7f,0x00,0x39,0x01,0x70,0xff,0xf4,0x00,0x39,0x01,0x71,0xff,0x7f,0x00,0x39,0x01,0x73,0xff,0xb4,0x00,0x39,0x01,0x74,0xff,0xe5,0x00,0x39,0x01,0x75,0xff,0xbe,0x00,0x39,0x01,0x76,\r\n0x00,0x27,0x00,0x39,0x01,0x79,0xff,0xb4,0x00,0x39,0x01,0x7b,0xff,0xb4,0x00,0x39,0x01,0x7d,0xff,0xb4,0x00,0x39,0x01,0x7f,0xff,0xb4,0x00,0x39,0x01,0x85,0xff,0x8b,0x00,0x39,0x01,0x86,0xff,0x6d,0x00,0x39,0x01,0x87,0xff,0x8b,0x00,0x39,0x01,0x88,0xff,0x6d,0x00,0x39,0x01,0x89,0xff,0xf4,0x00,0x39,0x01,0x8a,0xff,0x7f,0x00,0x39,\r\n0x02,0x3d,0xff,0xe5,0x00,0x39,0x02,0x3e,0xff,0xbe,0x00,0x3a,0x00,0x0f,0xff,0x8b,0x00,0x3a,0x00,0x11,0xff,0x7f,0x00,0x3a,0x00,0x24,0xff,0xb6,0x00,0x3a,0x00,0x37,0x00,0x27,0x00,0x3a,0x00,0x44,0xff,0xb4,0x00,0x3a,0x00,0x46,0xff,0xcf,0x00,0x3a,0x00,0x47,0xff,0xcf,0x00,0x3a,0x00,0x48,0xff,0xcf,0x00,0x3a,0x00,0x4a,0xff,0xcf,\r\n0x00,0x3a,0x00,0x52,0xff,0xcf,0x00,0x3a,0x00,0x54,0xff,0xcf,0x00,0x3a,0x00,0x62,0xff,0xb6,0x00,0x3a,0x00,0x63,0xff,0xb6,0x00,0x3a,0x00,0x69,0xff,0xb4,0x00,0x3a,0x00,0x6a,0xff,0xb4,0x00,0x3a,0x00,0x6b,0xff,0xb4,0x00,0x3a,0x00,0x6c,0xff,0xb4,0x00,0x3a,0x00,0x6d,0xff,0xb4,0x00,0x3a,0x00,0x6e,0xff,0xb4,0x00,0x3a,0x00,0x6f,\r\n0xff,0xcf,0x00,0x3a,0x00,0x70,0xff,0xcf,0x00,0x3a,0x00,0x71,0xff,0xcf,0x00,0x3a,0x00,0x72,0xff,0xcf,0x00,0x3a,0x00,0x73,0xff,0xcf,0x00,0x3a,0x00,0x76,0x00,0x31,0x00,0x3a,0x00,0x77,0x00,0x64,0x00,0x3a,0x00,0x79,0xff,0xcf,0x00,0x3a,0x00,0x7a,0xff,0xcf,0x00,0x3a,0x00,0x7b,0xff,0xcf,0x00,0x3a,0x00,0x7c,0xff,0xcf,0x00,0x3a,\r\n0x00,0x7d,0xff,0xcf,0x00,0x3a,0x00,0x91,0xff,0x9a,0x00,0x3a,0x00,0xa0,0xff,0xb4,0x00,0x3a,0x00,0xa2,0xff,0xa4,0x00,0x3a,0x00,0xaa,0xff,0xcf,0x00,0x3a,0x00,0xab,0x00,0x27,0x00,0x3a,0x00,0xac,0xff,0x7f,0x00,0x3a,0x00,0xad,0xff,0xb6,0x00,0x3a,0x00,0xae,0xff,0xb6,0x00,0x3a,0x00,0xb1,0xff,0xcf,0x00,0x3a,0x00,0xbe,0xff,0xcf,\r\n0x00,0x3a,0x00,0xbf,0x00,0x27,0x00,0x3a,0x00,0xc4,0xff,0x7f,0x00,0x3a,0x00,0xc5,0xff,0x8b,0x00,0x3a,0x00,0xc7,0xff,0xb6,0x00,0x3a,0x00,0xc9,0xff,0xb6,0x00,0x3a,0x00,0xf8,0xff,0xcf,0x00,0x3a,0x00,0xfd,0xff,0xcf,0x00,0x3a,0x00,0xff,0xff,0xcf,0x00,0x3a,0x01,0x00,0xff,0xcf,0x00,0x3a,0x01,0x03,0xff,0xb6,0x00,0x3a,0x01,0x04,\r\n0xff,0xb4,0x00,0x3a,0x01,0x05,0xff,0xb6,0x00,0x3a,0x01,0x06,0xff,0xb4,0x00,0x3a,0x01,0x08,0xff,0xcf,0x00,0x3a,0x01,0x0b,0xff,0xcf,0x00,0x3a,0x01,0x0d,0xff,0xcf,0x00,0x3a,0x01,0x19,0xff,0xcf,0x00,0x3a,0x01,0x20,0x00,0x27,0x00,0x3a,0x01,0x22,0x00,0x27,0x00,0x3a,0x01,0x45,0xff,0xb6,0x00,0x3a,0x01,0x46,0xff,0xb4,0x00,0x3a,\r\n0x01,0x48,0xff,0xcf,0x00,0x3a,0x01,0x4c,0xff,0xcf,0x00,0x3a,0x01,0x4e,0xff,0xcf,0x00,0x3a,0x01,0x50,0xff,0xcf,0x00,0x3a,0x01,0x52,0xff,0xcf,0x00,0x3a,0x01,0x54,0xff,0xcf,0x00,0x3a,0x01,0x56,0xff,0xcf,0x00,0x3a,0x01,0x5c,0x00,0x64,0x00,0x3a,0x01,0x5e,0x00,0x64,0x00,0x3a,0x01,0x60,0x00,0x64,0x00,0x3a,0x01,0x6f,0xff,0xcf,\r\n0x00,0x3a,0x01,0x71,0xff,0xcf,0x00,0x3a,0x01,0x76,0x00,0x27,0x00,0x3a,0x01,0x85,0xff,0xb6,0x00,0x3a,0x01,0x86,0xff,0xb4,0x00,0x3a,0x01,0x87,0xff,0xb6,0x00,0x3a,0x01,0x88,0xff,0xb4,0x00,0x3a,0x01,0x8a,0xff,0xcf,0x00,0x3b,0x00,0x0f,0x00,0x44,0x00,0x3b,0x00,0x11,0x00,0x39,0x00,0x3b,0x00,0x1e,0x00,0x52,0x00,0x3b,0x00,0x26,\r\n0xff,0xe9,0x00,0x3b,0x00,0x2a,0xff,0xe9,0x00,0x3b,0x00,0x2d,0x00,0x60,0x00,0x3b,0x00,0x32,0xff,0xe9,0x00,0x3b,0x00,0x34,0xff,0xe9,0x00,0x3b,0x00,0x37,0x00,0x21,0x00,0x3b,0x00,0x64,0xff,0xe9,0x00,0x3b,0x00,0x67,0xff,0xe9,0x00,0x3b,0x00,0x77,0x00,0x52,0x00,0x3b,0x00,0x92,0xff,0xe9,0x00,0x3b,0x00,0xac,0x00,0x39,0x00,0x3b,\r\n0x00,0xaf,0xff,0xe9,0x00,0x3b,0x00,0xb0,0xff,0xe9,0x00,0x3b,0x00,0xc4,0x00,0x44,0x00,0x3b,0x00,0xc5,0x00,0x52,0x00,0x3b,0x00,0xd0,0xff,0xe9,0x00,0x3b,0x00,0xd1,0xff,0xe9,0x00,0x3b,0x00,0xd2,0xff,0xe9,0x00,0x3b,0x00,0xf7,0xff,0xe9,0x00,0x3b,0x00,0xfc,0xff,0xe9,0x00,0x3b,0x00,0xfe,0xff,0xe9,0x00,0x3b,0x01,0x18,0xff,0xe9,\r\n0x00,0x3b,0x01,0x20,0x00,0x21,0x00,0x3b,0x01,0x22,0x00,0x21,0x00,0x3b,0x01,0x47,0xff,0xe9,0x00,0x3b,0x01,0x51,0xff,0xe9,0x00,0x3b,0x01,0x53,0xff,0xe9,0x00,0x3b,0x01,0x55,0xff,0xe9,0x00,0x3b,0x01,0x5c,0x00,0x52,0x00,0x3b,0x01,0x5e,0x00,0x52,0x00,0x3b,0x01,0x60,0x00,0x52,0x00,0x3b,0x01,0x63,0x00,0x60,0x00,0x3b,0x01,0x6e,\r\n0xff,0xe9,0x00,0x3b,0x01,0x70,0xff,0xe9,0x00,0x3b,0x01,0x76,0x00,0x21,0x00,0x3b,0x01,0x89,0xff,0xe9,0x00,0x3c,0x00,0x0f,0xff,0x50,0x00,0x3c,0x00,0x11,0xff,0x3d,0x00,0x3c,0x00,0x24,0xff,0x62,0x00,0x3c,0x00,0x26,0xff,0xd3,0x00,0x3c,0x00,0x2a,0xff,0xd3,0x00,0x3c,0x00,0x2d,0xff,0xbe,0x00,0x3c,0x00,0x32,0xff,0xd3,0x00,0x3c,\r\n0x00,0x34,0xff,0xd3,0x00,0x3c,0x00,0x36,0xff,0xe5,0x00,0x3c,0x00,0x37,0x00,0x27,0x00,0x3c,0x00,0x44,0xff,0x39,0x00,0x3c,0x00,0x46,0xff,0x4c,0x00,0x3c,0x00,0x47,0xff,0x4c,0x00,0x3c,0x00,0x48,0xff,0x4c,0x00,0x3c,0x00,0x49,0xff,0xe5,0x00,0x3c,0x00,0x4a,0xff,0x4c,0x00,0x3c,0x00,0x50,0xff,0x73,0x00,0x3c,0x00,0x51,0xff,0x73,\r\n0x00,0x3c,0x00,0x52,0xff,0x4c,0x00,0x3c,0x00,0x53,0xff,0x73,0x00,0x3c,0x00,0x54,0xff,0x4c,0x00,0x3c,0x00,0x55,0xff,0x73,0x00,0x3c,0x00,0x56,0xff,0x7b,0x00,0x3c,0x00,0x58,0xff,0x73,0x00,0x3c,0x00,0x62,0xff,0x62,0x00,0x3c,0x00,0x63,0xff,0x62,0x00,0x3c,0x00,0x64,0xff,0xcd,0x00,0x3c,0x00,0x67,0xff,0xd3,0x00,0x3c,0x00,0x69,\r\n0xff,0x39,0x00,0x3c,0x00,0x6a,0xff,0x39,0x00,0x3c,0x00,0x6b,0xff,0x39,0x00,0x3c,0x00,0x6c,0xff,0x7f,0x00,0x3c,0x00,0x6d,0xff,0x66,0x00,0x3c,0x00,0x6e,0xff,0x39,0x00,0x3c,0x00,0x6f,0xff,0x4c,0x00,0x3c,0x00,0x70,0xff,0x4c,0x00,0x3c,0x00,0x71,0xff,0x4c,0x00,0x3c,0x00,0x72,0xff,0x4c,0x00,0x3c,0x00,0x73,0xff,0x4c,0x00,0x3c,\r\n0x00,0x77,0x00,0x5a,0x00,0x3c,0x00,0x78,0xff,0x73,0x00,0x3c,0x00,0x79,0xff,0x4c,0x00,0x3c,0x00,0x7a,0xff,0x4c,0x00,0x3c,0x00,0x7b,0xff,0x4c,0x00,0x3c,0x00,0x7c,0xff,0x4c,0x00,0x3c,0x00,0x7d,0xff,0x4c,0x00,0x3c,0x00,0x7e,0xff,0x73,0x00,0x3c,0x00,0x7f,0xff,0x73,0x00,0x3c,0x00,0x80,0xff,0x73,0x00,0x3c,0x00,0x81,0xff,0x73,\r\n0x00,0x3c,0x00,0x91,0xff,0x3f,0x00,0x3c,0x00,0x92,0xff,0xd3,0x00,0x3c,0x00,0xa0,0xff,0x39,0x00,0x3c,0x00,0xa2,0xff,0x1b,0x00,0x3c,0x00,0xaa,0xff,0xcf,0x00,0x3c,0x00,0xac,0xff,0x3d,0x00,0x3c,0x00,0xad,0xff,0x62,0x00,0x3c,0x00,0xae,0xff,0x62,0x00,0x3c,0x00,0xaf,0xff,0xd3,0x00,0x3c,0x00,0xb0,0xff,0xd3,0x00,0x3c,0x00,0xb1,\r\n0xff,0x4c,0x00,0x3c,0x00,0xbe,0xff,0x9a,0x00,0x3c,0x00,0xc4,0xff,0x08,0x00,0x3c,0x00,0xc5,0xff,0x08,0x00,0x3c,0x00,0xc7,0xff,0x62,0x00,0x3c,0x00,0xc9,0xff,0x62,0x00,0x3c,0x00,0xd0,0xff,0xd3,0x00,0x3c,0x00,0xd1,0xff,0xd3,0x00,0x3c,0x00,0xd2,0xff,0xd3,0x00,0x3c,0x00,0xe3,0xff,0xe5,0x00,0x3c,0x00,0xe4,0xff,0x7b,0x00,0x3c,\r\n0x00,0xf7,0xff,0xd3,0x00,0x3c,0x00,0xf8,0xff,0x4c,0x00,0x3c,0x00,0xfa,0xff,0xe5,0x00,0x3c,0x00,0xfb,0xff,0x7b,0x00,0x3c,0x00,0xfc,0xff,0xd3,0x00,0x3c,0x00,0xfd,0xff,0x4c,0x00,0x3c,0x00,0xfe,0xff,0xd3,0x00,0x3c,0x00,0xff,0xff,0x4c,0x00,0x3c,0x01,0x00,0xff,0x4c,0x00,0x3c,0x01,0x03,0xff,0x62,0x00,0x3c,0x01,0x04,0xff,0x7f,\r\n0x00,0x3c,0x01,0x05,0xff,0x62,0x00,0x3c,0x01,0x06,0xff,0x39,0x00,0x3c,0x01,0x08,0xff,0x4c,0x00,0x3c,0x01,0x0b,0xff,0x4c,0x00,0x3c,0x01,0x0d,0xff,0x4c,0x00,0x3c,0x01,0x15,0xff,0x73,0x00,0x3c,0x01,0x17,0xff,0x73,0x00,0x3c,0x01,0x18,0xff,0xd3,0x00,0x3c,0x01,0x19,0xff,0x4c,0x00,0x3c,0x01,0x1b,0xff,0x73,0x00,0x3c,0x01,0x1d,\r\n0xff,0x73,0x00,0x3c,0x01,0x1e,0xff,0xe5,0x00,0x3c,0x01,0x1f,0xff,0x7b,0x00,0x3c,0x01,0x20,0x00,0x27,0x00,0x3c,0x01,0x22,0x00,0x27,0x00,0x3c,0x01,0x25,0xff,0x73,0x00,0x3c,0x01,0x27,0xff,0x73,0x00,0x3c,0x01,0x45,0xff,0x62,0x00,0x3c,0x01,0x46,0xff,0x7f,0x00,0x3c,0x01,0x47,0xff,0xd3,0x00,0x3c,0x01,0x48,0xff,0x4c,0x00,0x3c,\r\n0x01,0x4c,0xff,0x4c,0x00,0x3c,0x01,0x4e,0xff,0x4c,0x00,0x3c,0x01,0x50,0xff,0x4c,0x00,0x3c,0x01,0x51,0xff,0xd3,0x00,0x3c,0x01,0x52,0xff,0x4c,0x00,0x3c,0x01,0x53,0xff,0xd3,0x00,0x3c,0x01,0x54,0xff,0x4c,0x00,0x3c,0x01,0x55,0xff,0xd3,0x00,0x3c,0x01,0x56,0xff,0x4c,0x00,0x3c,0x01,0x5c,0x00,0x5a,0x00,0x3c,0x01,0x5e,0x00,0x5a,\r\n0x00,0x3c,0x01,0x60,0x00,0x5a,0x00,0x3c,0x01,0x63,0xff,0xbe,0x00,0x3c,0x01,0x6d,0xff,0x73,0x00,0x3c,0x01,0x6e,0xff,0xd3,0x00,0x3c,0x01,0x6f,0xff,0x4c,0x00,0x3c,0x01,0x70,0xff,0xd3,0x00,0x3c,0x01,0x71,0xff,0x4c,0x00,0x3c,0x01,0x73,0xff,0x73,0x00,0x3c,0x01,0x74,0xff,0xe5,0x00,0x3c,0x01,0x75,0xff,0x7b,0x00,0x3c,0x01,0x76,\r\n0x00,0x27,0x00,0x3c,0x01,0x79,0xff,0x73,0x00,0x3c,0x01,0x7b,0xff,0x73,0x00,0x3c,0x01,0x7d,0xff,0x73,0x00,0x3c,0x01,0x7f,0xff,0x73,0x00,0x3c,0x01,0x85,0xff,0x62,0x00,0x3c,0x01,0x86,0xff,0x7f,0x00,0x3c,0x01,0x87,0xff,0x62,0x00,0x3c,0x01,0x88,0xff,0x39,0x00,0x3c,0x01,0x89,0xff,0xd3,0x00,0x3c,0x01,0x8a,0xff,0x4c,0x00,0x3c,\r\n0x02,0x3d,0xff,0xe5,0x00,0x3c,0x02,0x3e,0xff,0x7b,0x00,0x3d,0x00,0x2d,0x00,0x52,0x00,0x3d,0x00,0x37,0x00,0x27,0x00,0x3d,0x00,0x5c,0xff,0xcb,0x00,0x3d,0x00,0x77,0x00,0x46,0x00,0x3d,0x00,0xab,0x00,0x27,0x00,0x3d,0x00,0xba,0xff,0xbe,0x00,0x3d,0x00,0xbf,0x00,0x52,0x00,0x3d,0x00,0xeb,0xff,0xcb,0x00,0x3d,0x01,0x20,0x00,0x27,\r\n0x00,0x3d,0x01,0x22,0x00,0x27,0x00,0x3d,0x01,0x5c,0x00,0x46,0x00,0x3d,0x01,0x5e,0x00,0x46,0x00,0x3d,0x01,0x60,0x00,0x46,0x00,0x3d,0x01,0x63,0x00,0x52,0x00,0x3d,0x01,0x76,0x00,0x27,0x00,0x3d,0x01,0x83,0xff,0xcb,0x00,0x3d,0x01,0x93,0xff,0xcb,0x00,0x3e,0x00,0x4d,0x00,0xe9,0x00,0x3e,0x01,0x64,0x00,0xe9,0x00,0x45,0x00,0x44,\r\n0xff,0xe5,0x00,0x45,0x00,0x49,0xff,0xf6,0x00,0x45,0x00,0x5b,0xff,0xe7,0x00,0x45,0x00,0x69,0xff,0xe5,0x00,0x45,0x00,0x6a,0xff,0xe5,0x00,0x45,0x00,0x6b,0xff,0xe5,0x00,0x45,0x00,0x6c,0xff,0xe5,0x00,0x45,0x00,0x6d,0xff,0xe5,0x00,0x45,0x00,0x6e,0xff,0xe5,0x00,0x45,0x00,0xa0,0xff,0xe5,0x00,0x45,0x00,0xc0,0xff,0xf6,0x00,0x45,\r\n0x00,0xc1,0xff,0xf6,0x00,0x45,0x01,0x04,0xff,0xe5,0x00,0x45,0x01,0x06,0xff,0xe5,0x00,0x45,0x01,0x46,0xff,0xe5,0x00,0x45,0x01,0x86,0xff,0xe5,0x00,0x45,0x01,0x88,0xff,0xe5,0x00,0x46,0x00,0x2d,0x00,0x46,0x00,0x46,0x00,0x37,0xff,0x9a,0x00,0x46,0x00,0x3c,0xff,0xb4,0x00,0x46,0x00,0xea,0xff,0xb4,0x00,0x46,0x01,0x20,0xff,0x9a,\r\n0x00,0x46,0x01,0x22,0xff,0x9a,0x00,0x46,0x01,0x63,0x00,0x46,0x00,0x46,0x01,0x76,0xff,0x9a,0x00,0x46,0x01,0x82,0xff,0xb4,0x00,0x46,0x01,0x92,0xff,0xb4,0x00,0x48,0x00,0x05,0xff,0x98,0x00,0x48,0x00,0x0a,0xff,0x98,0x00,0x49,0x00,0x0c,0x00,0x8d,0x00,0x49,0x00,0x0f,0xff,0x7f,0x00,0x49,0x00,0x10,0xff,0x9a,0x00,0x49,0x00,0x11,\r\n0xff,0x7f,0x00,0x49,0x00,0x1d,0x00,0x52,0x00,0x49,0x00,0x1e,0x00,0x52,0x00,0x49,0x00,0x22,0x00,0x42,0x00,0x49,0x00,0x40,0x00,0x8d,0x00,0x49,0x00,0x45,0x00,0x12,0x00,0x49,0x00,0x4b,0x00,0x12,0x00,0x49,0x00,0x57,0x00,0x25,0x00,0x49,0x00,0x59,0x00,0x27,0x00,0x49,0x00,0x5a,0x00,0x27,0x00,0x49,0x00,0x5b,0x00,0x12,0x00,0x49,\r\n0x00,0x5c,0x00,0x21,0x00,0x49,0x00,0x60,0x00,0x52,0x00,0x49,0x00,0x75,0x00,0x2d,0x00,0x49,0x00,0x76,0x00,0x12,0x00,0x49,0x00,0x77,0x00,0x79,0x00,0x49,0x00,0x8d,0x00,0x93,0x00,0x49,0x00,0xab,0x00,0x27,0x00,0x49,0x00,0xac,0xff,0x7f,0x00,0x49,0x00,0xb4,0x00,0x5e,0x00,0x49,0x00,0xb5,0x00,0x52,0x00,0x49,0x00,0xb6,0x00,0x5e,\r\n0x00,0x49,0x00,0xb7,0x00,0x52,0x00,0x49,0x00,0xbf,0x00,0x27,0x00,0x49,0x00,0xc4,0xff,0xb0,0x00,0x49,0x00,0xc5,0xff,0xb0,0x00,0x49,0x00,0xeb,0x00,0x21,0x00,0x49,0x00,0xed,0x00,0x12,0x00,0x49,0x01,0x21,0x00,0x25,0x00,0x49,0x01,0x23,0x00,0x25,0x00,0x49,0x01,0x58,0x00,0x12,0x00,0x49,0x01,0x5a,0x00,0x12,0x00,0x49,0x01,0x5c,\r\n0x00,0x79,0x00,0x49,0x01,0x5e,0x00,0x79,0x00,0x49,0x01,0x60,0x00,0x79,0x00,0x49,0x01,0x77,0x00,0x25,0x00,0x49,0x01,0x81,0x00,0x27,0x00,0x49,0x01,0x83,0x00,0x21,0x00,0x49,0x01,0x8d,0x00,0x27,0x00,0x49,0x01,0x8f,0x00,0x27,0x00,0x49,0x01,0x91,0x00,0x27,0x00,0x49,0x01,0x93,0x00,0x21,0x00,0x4a,0x00,0x4d,0x00,0x2f,0x00,0x4a,\r\n0x01,0x64,0x00,0x2f,0x00,0x4d,0x00,0x4d,0x00,0x23,0x00,0x4d,0x01,0x64,0x00,0x23,0x00,0x4e,0x00,0x0f,0x00,0x52,0x00,0x4e,0x00,0x10,0xff,0x75,0x00,0x4e,0x00,0x11,0x00,0x52,0x00,0x4e,0x00,0x1d,0x00,0x52,0x00,0x4e,0x00,0x1e,0x00,0x52,0x00,0x4e,0x00,0x46,0xff,0xd7,0x00,0x4e,0x00,0x47,0xff,0xe5,0x00,0x4e,0x00,0x48,0xff,0xd7,\r\n0x00,0x4e,0x00,0x4a,0xff,0xd7,0x00,0x4e,0x00,0x52,0xff,0xd7,0x00,0x4e,0x00,0x54,0xff,0xe5,0x00,0x4e,0x00,0x57,0xff,0xf0,0x00,0x4e,0x00,0x6f,0xff,0xe5,0x00,0x4e,0x00,0x70,0xff,0xd7,0x00,0x4e,0x00,0x71,0xff,0xd7,0x00,0x4e,0x00,0x72,0xff,0xd7,0x00,0x4e,0x00,0x73,0xff,0xd7,0x00,0x4e,0x00,0x79,0xff,0xd7,0x00,0x4e,0x00,0x7a,\r\n0xff,0xd7,0x00,0x4e,0x00,0x7b,0xff,0xd7,0x00,0x4e,0x00,0x7c,0xff,0xd7,0x00,0x4e,0x00,0x7d,0xff,0xd7,0x00,0x4e,0x00,0xac,0x00,0x52,0x00,0x4e,0x00,0xb1,0xff,0xd7,0x00,0x4e,0x00,0xf8,0xff,0xd7,0x00,0x4e,0x00,0xfd,0xff,0xd7,0x00,0x4e,0x00,0xff,0xff,0xd7,0x00,0x4e,0x01,0x00,0xff,0xe5,0x00,0x4e,0x01,0x08,0xff,0xe5,0x00,0x4e,\r\n0x01,0x0b,0xff,0xd7,0x00,0x4e,0x01,0x0d,0xff,0xd7,0x00,0x4e,0x01,0x19,0xff,0xd7,0x00,0x4e,0x01,0x21,0xff,0xf0,0x00,0x4e,0x01,0x23,0xff,0xf0,0x00,0x4e,0x01,0x48,0xff,0xd7,0x00,0x4e,0x01,0x4c,0xff,0xd7,0x00,0x4e,0x01,0x4e,0xff,0xd7,0x00,0x4e,0x01,0x50,0xff,0xd7,0x00,0x4e,0x01,0x52,0xff,0xd7,0x00,0x4e,0x01,0x54,0xff,0xd7,\r\n0x00,0x4e,0x01,0x56,0xff,0xd7,0x00,0x4e,0x01,0x6f,0xff,0xd7,0x00,0x4e,0x01,0x71,0xff,0xd7,0x00,0x4e,0x01,0x77,0xff,0xf0,0x00,0x4e,0x01,0x8a,0xff,0xd7,0x00,0x51,0x00,0x05,0xff,0x98,0x00,0x51,0x00,0x0a,0xff,0x98,0x00,0x52,0x00,0x05,0xff,0x6f,0x00,0x52,0x00,0x0a,0xff,0x6f,0x00,0x52,0x00,0x44,0xff,0xe5,0x00,0x52,0x00,0x49,\r\n0xff,0xdb,0x00,0x52,0x00,0x5b,0xff,0xe7,0x00,0x52,0x00,0x69,0xff,0xe5,0x00,0x52,0x00,0x6a,0xff,0xe5,0x00,0x52,0x00,0x6b,0xff,0xe5,0x00,0x52,0x00,0x6c,0xff,0xe5,0x00,0x52,0x00,0x6d,0xff,0xe5,0x00,0x52,0x00,0x6e,0xff,0xe5,0x00,0x52,0x00,0xa0,0xff,0xe5,0x00,0x52,0x00,0xb4,0xff,0xb2,0x00,0x52,0x00,0xb5,0xff,0x7d,0x00,0x52,\r\n0x00,0xb6,0xff,0xbe,0x00,0x52,0x00,0xb7,0xff,0x7d,0x00,0x52,0x00,0xc0,0xff,0xe7,0x00,0x52,0x00,0xc1,0xff,0xe7,0x00,0x52,0x01,0x04,0xff,0xe5,0x00,0x52,0x01,0x06,0xff,0xe5,0x00,0x52,0x01,0x46,0xff,0xe5,0x00,0x52,0x01,0x86,0xff,0xe5,0x00,0x52,0x01,0x88,0xff,0xe5,0x00,0x53,0x00,0x44,0xff,0xe5,0x00,0x53,0x00,0x49,0xff,0xdb,\r\n0x00,0x53,0x00,0x5b,0xff,0xe7,0x00,0x53,0x00,0x69,0xff,0xe5,0x00,0x53,0x00,0x6a,0xff,0xe5,0x00,0x53,0x00,0x6b,0xff,0xe5,0x00,0x53,0x00,0x6c,0xff,0xe5,0x00,0x53,0x00,0x6d,0xff,0xe5,0x00,0x53,0x00,0x6e,0xff,0xe5,0x00,0x53,0x00,0xa0,0xff,0xe5,0x00,0x53,0x00,0xb4,0xff,0xcb,0x00,0x53,0x00,0xb5,0xff,0x89,0x00,0x53,0x00,0xb6,\r\n0xff,0x89,0x00,0x53,0x00,0xb7,0xff,0x89,0x00,0x53,0x00,0xc0,0xff,0xe7,0x00,0x53,0x00,0xc1,0xff,0xe7,0x00,0x53,0x01,0x04,0xff,0xe5,0x00,0x53,0x01,0x06,0xff,0xe5,0x00,0x53,0x01,0x46,0xff,0xe5,0x00,0x53,0x01,0x86,0xff,0xe5,0x00,0x53,0x01,0x88,0xff,0xe5,0x00,0x54,0x00,0x4d,0x00,0x66,0x00,0x54,0x01,0x64,0x00,0x66,0x00,0x55,\r\n0x00,0x0f,0xff,0x62,0x00,0x55,0x00,0x10,0xff,0x7f,0x00,0x55,0x00,0x11,0xff,0x56,0x00,0x55,0x00,0x1d,0x00,0x52,0x00,0x55,0x00,0x1e,0x00,0x52,0x00,0x55,0x00,0x46,0xff,0xe5,0x00,0x55,0x00,0x47,0xff,0xe5,0x00,0x55,0x00,0x48,0xff,0xe5,0x00,0x55,0x00,0x49,0x00,0x27,0x00,0x55,0x00,0x4a,0xff,0xe5,0x00,0x55,0x00,0x50,0xff,0xfc,\r\n0x00,0x55,0x00,0x51,0xff,0xfc,0x00,0x55,0x00,0x52,0xff,0xe5,0x00,0x55,0x00,0x54,0xff,0xe5,0x00,0x55,0x00,0x56,0x00,0x0e,0x00,0x55,0x00,0x57,0x00,0x3b,0x00,0x55,0x00,0x59,0x00,0x52,0x00,0x55,0x00,0x5a,0x00,0x52,0x00,0x55,0x00,0x5b,0x00,0x3b,0x00,0x55,0x00,0x5c,0x00,0x52,0x00,0x55,0x00,0x5d,0x00,0x27,0x00,0x55,0x00,0x6f,\r\n0xff,0xe5,0x00,0x55,0x00,0x70,0xff,0xe5,0x00,0x55,0x00,0x71,0xff,0xe5,0x00,0x55,0x00,0x72,0xff,0xe5,0x00,0x55,0x00,0x73,0xff,0xe5,0x00,0x55,0x00,0x79,0xff,0xe5,0x00,0x55,0x00,0x7a,0xff,0xe5,0x00,0x55,0x00,0x7b,0xff,0xe5,0x00,0x55,0x00,0x7c,0xff,0xe5,0x00,0x55,0x00,0x7d,0xff,0xe5,0x00,0x55,0x00,0xac,0xff,0x56,0x00,0x55,\r\n0x00,0xb1,0xff,0xe5,0x00,0x55,0x00,0xb4,0x00,0xa4,0x00,0x55,0x00,0xb5,0x00,0x79,0x00,0x55,0x00,0xb6,0x00,0xa4,0x00,0x55,0x00,0xb7,0x00,0x79,0x00,0x55,0x00,0xc4,0xff,0x62,0x00,0x55,0x00,0xc5,0xff,0x62,0x00,0x55,0x00,0xe4,0x00,0x0e,0x00,0x55,0x00,0xe6,0x00,0x27,0x00,0x55,0x00,0xeb,0x00,0x52,0x00,0x55,0x00,0xf8,0xff,0xe5,\r\n0x00,0x55,0x00,0xfb,0x00,0x0e,0x00,0x55,0x00,0xfd,0xff,0xe5,0x00,0x55,0x00,0xff,0xff,0xe5,0x00,0x55,0x01,0x00,0xff,0xe5,0x00,0x55,0x01,0x08,0xff,0xe5,0x00,0x55,0x01,0x0b,0xff,0xe5,0x00,0x55,0x01,0x0d,0xff,0xe5,0x00,0x55,0x01,0x19,0xff,0xe5,0x00,0x55,0x01,0x1f,0x00,0x0e,0x00,0x55,0x01,0x21,0x00,0x3b,0x00,0x55,0x01,0x23,\r\n0x00,0x3b,0x00,0x55,0x01,0x29,0x00,0x27,0x00,0x55,0x01,0x2b,0x00,0x27,0x00,0x55,0x01,0x48,0xff,0xe5,0x00,0x55,0x01,0x4c,0xff,0xe5,0x00,0x55,0x01,0x4e,0xff,0xe5,0x00,0x55,0x01,0x50,0xff,0xe5,0x00,0x55,0x01,0x52,0xff,0xe5,0x00,0x55,0x01,0x54,0xff,0xe5,0x00,0x55,0x01,0x56,0xff,0xe5,0x00,0x55,0x01,0x6d,0xff,0xfc,0x00,0x55,\r\n0x01,0x6f,0xff,0xe5,0x00,0x55,0x01,0x71,0xff,0xe5,0x00,0x55,0x01,0x75,0x00,0x0e,0x00,0x55,0x01,0x77,0x00,0x3b,0x00,0x55,0x01,0x81,0x00,0x52,0x00,0x55,0x01,0x83,0x00,0x52,0x00,0x55,0x01,0x8a,0xff,0xe5,0x00,0x55,0x01,0x8d,0x00,0x52,0x00,0x55,0x01,0x8f,0x00,0x52,0x00,0x55,0x01,0x91,0x00,0x52,0x00,0x55,0x01,0x93,0x00,0x52,\r\n0x00,0x55,0x02,0x3e,0x00,0x0e,0x00,0x57,0x00,0x10,0xff,0x8f,0x00,0x57,0x00,0x22,0xff,0xcb,0x00,0x57,0x00,0x46,0xff,0xe5,0x00,0x57,0x00,0x47,0xff,0xe5,0x00,0x57,0x00,0x48,0xff,0xf0,0x00,0x57,0x00,0x4a,0xff,0xf0,0x00,0x57,0x00,0x52,0xff,0xf0,0x00,0x57,0x00,0x54,0xff,0xf0,0x00,0x57,0x00,0x5b,0x00,0x1d,0x00,0x57,0x00,0x6f,\r\n0xff,0xe5,0x00,0x57,0x00,0x70,0xff,0xf0,0x00,0x57,0x00,0x71,0xff,0xf0,0x00,0x57,0x00,0x72,0xff,0xf0,0x00,0x57,0x00,0x73,0xff,0xf0,0x00,0x57,0x00,0x79,0xff,0xf0,0x00,0x57,0x00,0x7a,0xff,0xf0,0x00,0x57,0x00,0x7b,0xff,0xf0,0x00,0x57,0x00,0x7c,0xff,0xf0,0x00,0x57,0x00,0x7d,0xff,0xf0,0x00,0x57,0x00,0xab,0x00,0x27,0x00,0x57,\r\n0x00,0xb1,0xff,0xf0,0x00,0x57,0x00,0xbf,0x00,0x27,0x00,0x57,0x00,0xf8,0xff,0xf0,0x00,0x57,0x00,0xfd,0xff,0xe5,0x00,0x57,0x00,0xff,0xff,0xe5,0x00,0x57,0x01,0x00,0xff,0xe5,0x00,0x57,0x01,0x08,0xff,0xe5,0x00,0x57,0x01,0x0b,0xff,0xf0,0x00,0x57,0x01,0x0d,0xff,0xf0,0x00,0x57,0x01,0x19,0xff,0xf0,0x00,0x57,0x01,0x48,0xff,0xe5,\r\n0x00,0x57,0x01,0x4c,0xff,0xf0,0x00,0x57,0x01,0x4e,0xff,0xf0,0x00,0x57,0x01,0x50,0xff,0xf0,0x00,0x57,0x01,0x52,0xff,0xf0,0x00,0x57,0x01,0x54,0xff,0xf0,0x00,0x57,0x01,0x56,0xff,0xf0,0x00,0x57,0x01,0x6f,0xff,0xf0,0x00,0x57,0x01,0x71,0xff,0xf0,0x00,0x57,0x01,0x8a,0xff,0xf0,0x00,0x58,0x00,0x05,0xff,0xbe,0x00,0x58,0x00,0x0a,\r\n0xff,0xbe,0x00,0x59,0x00,0x0f,0xff,0x8b,0x00,0x59,0x00,0x11,0xff,0x7f,0x00,0x59,0x00,0x44,0xff,0xdb,0x00,0x59,0x00,0x46,0xff,0xf4,0x00,0x59,0x00,0x47,0xff,0xf0,0x00,0x59,0x00,0x48,0xff,0xf4,0x00,0x59,0x00,0x4a,0xff,0xf4,0x00,0x59,0x00,0x52,0xff,0xf4,0x00,0x59,0x00,0x54,0xff,0xf0,0x00,0x59,0x00,0x69,0xff,0xdb,0x00,0x59,\r\n0x00,0x6a,0xff,0xdb,0x00,0x59,0x00,0x6b,0xff,0xdb,0x00,0x59,0x00,0x6c,0xff,0xdb,0x00,0x59,0x00,0x6d,0xff,0xdb,0x00,0x59,0x00,0x6e,0xff,0xdb,0x00,0x59,0x00,0x6f,0xff,0xf4,0x00,0x59,0x00,0x70,0xff,0xf4,0x00,0x59,0x00,0x71,0xff,0xf4,0x00,0x59,0x00,0x72,0xff,0xf4,0x00,0x59,0x00,0x73,0xff,0xf4,0x00,0x59,0x00,0x79,0xff,0xf4,\r\n0x00,0x59,0x00,0x7a,0xff,0xf4,0x00,0x59,0x00,0x7b,0xff,0xf4,0x00,0x59,0x00,0x7c,0xff,0xf4,0x00,0x59,0x00,0x7d,0xff,0xf4,0x00,0x59,0x00,0xa0,0xff,0xdb,0x00,0x59,0x00,0xac,0xff,0x7f,0x00,0x59,0x00,0xb1,0xff,0xf4,0x00,0x59,0x00,0xc4,0xff,0x8b,0x00,0x59,0x00,0xc5,0xff,0x7f,0x00,0x59,0x00,0xf8,0xff,0xf4,0x00,0x59,0x00,0xfd,\r\n0xff,0xf4,0x00,0x59,0x00,0xff,0xff,0xf4,0x00,0x59,0x01,0x00,0xff,0xf0,0x00,0x59,0x01,0x04,0xff,0xdb,0x00,0x59,0x01,0x06,0xff,0xdb,0x00,0x59,0x01,0x08,0xff,0xf0,0x00,0x59,0x01,0x0b,0xff,0xf4,0x00,0x59,0x01,0x0d,0xff,0xf4,0x00,0x59,0x01,0x19,0xff,0xf4,0x00,0x59,0x01,0x46,0xff,0xdb,0x00,0x59,0x01,0x48,0xff,0xf4,0x00,0x59,\r\n0x01,0x4c,0xff,0xf4,0x00,0x59,0x01,0x4e,0xff,0xf4,0x00,0x59,0x01,0x50,0xff,0xf4,0x00,0x59,0x01,0x52,0xff,0xf4,0x00,0x59,0x01,0x54,0xff,0xf4,0x00,0x59,0x01,0x56,0xff,0xf4,0x00,0x59,0x01,0x6f,0xff,0xf4,0x00,0x59,0x01,0x71,0xff,0xf4,0x00,0x59,0x01,0x86,0xff,0xdb,0x00,0x59,0x01,0x88,0xff,0xdb,0x00,0x59,0x01,0x8a,0xff,0xf4,\r\n0x00,0x5a,0x00,0x0f,0xff,0xa6,0x00,0x5a,0x00,0x11,0xff,0x9a,0x00,0x5a,0x00,0x46,0xff,0xfa,0x00,0x5a,0x00,0x47,0xff,0xf6,0x00,0x5a,0x00,0x48,0xff,0xf6,0x00,0x5a,0x00,0x4a,0xff,0xfa,0x00,0x5a,0x00,0x52,0xff,0xfa,0x00,0x5a,0x00,0x54,0xff,0xf6,0x00,0x5a,0x00,0x6f,0xff,0xfa,0x00,0x5a,0x00,0x70,0xff,0xf6,0x00,0x5a,0x00,0x71,\r\n0xff,0xf6,0x00,0x5a,0x00,0x72,0xff,0xf6,0x00,0x5a,0x00,0x73,0xff,0xf6,0x00,0x5a,0x00,0x79,0xff,0xfa,0x00,0x5a,0x00,0x7a,0xff,0xfa,0x00,0x5a,0x00,0x7b,0xff,0xfa,0x00,0x5a,0x00,0x7c,0xff,0xfa,0x00,0x5a,0x00,0x7d,0xff,0xfa,0x00,0x5a,0x00,0xac,0xff,0x9a,0x00,0x5a,0x00,0xb1,0xff,0xfa,0x00,0x5a,0x00,0xc4,0xff,0xb4,0x00,0x5a,\r\n0x00,0xc5,0xff,0xb4,0x00,0x5a,0x00,0xf8,0xff,0xfa,0x00,0x5a,0x00,0xfd,0xff,0xfa,0x00,0x5a,0x00,0xff,0xff,0xfa,0x00,0x5a,0x01,0x00,0xff,0xf6,0x00,0x5a,0x01,0x08,0xff,0xf6,0x00,0x5a,0x01,0x0b,0xff,0xf6,0x00,0x5a,0x01,0x0d,0xff,0xf6,0x00,0x5a,0x01,0x19,0xff,0xfa,0x00,0x5a,0x01,0x48,0xff,0xfa,0x00,0x5a,0x01,0x4c,0xff,0xf6,\r\n0x00,0x5a,0x01,0x4e,0xff,0xf6,0x00,0x5a,0x01,0x50,0xff,0xf6,0x00,0x5a,0x01,0x52,0xff,0xfa,0x00,0x5a,0x01,0x54,0xff,0xfa,0x00,0x5a,0x01,0x56,0xff,0xfa,0x00,0x5a,0x01,0x6f,0xff,0xfa,0x00,0x5a,0x01,0x71,0xff,0xfa,0x00,0x5a,0x01,0x8a,0xff,0xfa,0x00,0x5b,0x00,0x46,0xff,0xf0,0x00,0x5b,0x00,0x47,0xff,0xf0,0x00,0x5b,0x00,0x48,\r\n0xff,0xf0,0x00,0x5b,0x00,0x4a,0xff,0xf0,0x00,0x5b,0x00,0x52,0xff,0xf0,0x00,0x5b,0x00,0x54,0xff,0xf0,0x00,0x5b,0x00,0x6f,0xff,0xf0,0x00,0x5b,0x00,0x70,0xff,0xf0,0x00,0x5b,0x00,0x71,0xff,0xf0,0x00,0x5b,0x00,0x72,0xff,0xf0,0x00,0x5b,0x00,0x73,0xff,0xf0,0x00,0x5b,0x00,0x79,0xff,0xf0,0x00,0x5b,0x00,0x7a,0xff,0xf0,0x00,0x5b,\r\n0x00,0x7b,0xff,0xf0,0x00,0x5b,0x00,0x7c,0xff,0xf0,0x00,0x5b,0x00,0x7d,0xff,0xf0,0x00,0x5b,0x00,0xb1,0xff,0xf0,0x00,0x5b,0x00,0xf8,0xff,0xf0,0x00,0x5b,0x00,0xfd,0xff,0xf0,0x00,0x5b,0x00,0xff,0xff,0xf0,0x00,0x5b,0x01,0x00,0xff,0xf0,0x00,0x5b,0x01,0x08,0xff,0xf0,0x00,0x5b,0x01,0x0b,0xff,0xf0,0x00,0x5b,0x01,0x0d,0xff,0xf0,\r\n0x00,0x5b,0x01,0x19,0xff,0xf0,0x00,0x5b,0x01,0x48,0xff,0xf0,0x00,0x5b,0x01,0x4c,0xff,0xf0,0x00,0x5b,0x01,0x4e,0xff,0xf0,0x00,0x5b,0x01,0x50,0xff,0xf0,0x00,0x5b,0x01,0x52,0xff,0xf0,0x00,0x5b,0x01,0x54,0xff,0xf0,0x00,0x5b,0x01,0x56,0xff,0xf0,0x00,0x5b,0x01,0x6f,0xff,0xf0,0x00,0x5b,0x01,0x71,0xff,0xf0,0x00,0x5b,0x01,0x8a,\r\n0xff,0xf0,0x00,0x5c,0x00,0x05,0x00,0x1d,0x00,0x5c,0x00,0x0a,0x00,0x1d,0x00,0x5c,0x00,0x0f,0xff,0x9a,0x00,0x5c,0x00,0x11,0xff,0x81,0x00,0x5c,0x00,0x22,0xff,0xb4,0x00,0x5c,0x00,0x46,0xff,0xf6,0x00,0x5c,0x00,0x47,0xff,0xf6,0x00,0x5c,0x00,0x48,0xff,0xf6,0x00,0x5c,0x00,0x49,0x00,0x04,0x00,0x5c,0x00,0x4a,0xff,0xf6,0x00,0x5c,\r\n0x00,0x52,0xff,0xf6,0x00,0x5c,0x00,0x54,0xff,0xf6,0x00,0x5c,0x00,0x57,0x00,0x06,0x00,0x5c,0x00,0x6f,0xff,0xf6,0x00,0x5c,0x00,0x70,0xff,0xf6,0x00,0x5c,0x00,0x71,0xff,0xf6,0x00,0x5c,0x00,0x72,0xff,0xf6,0x00,0x5c,0x00,0x73,0xff,0xf6,0x00,0x5c,0x00,0x79,0xff,0xf6,0x00,0x5c,0x00,0x7a,0xff,0xf6,0x00,0x5c,0x00,0x7b,0xff,0xf6,\r\n0x00,0x5c,0x00,0x7c,0xff,0xf6,0x00,0x5c,0x00,0x7d,0xff,0xf6,0x00,0x5c,0x00,0xac,0xff,0x81,0x00,0x5c,0x00,0xb1,0xff,0xf6,0x00,0x5c,0x00,0xbf,0x00,0x0c,0x00,0x5c,0x00,0xc4,0xff,0x8d,0x00,0x5c,0x00,0xc5,0xff,0x8d,0x00,0x5c,0x00,0xf8,0xff,0xf6,0x00,0x5c,0x00,0xfd,0xff,0xf6,0x00,0x5c,0x00,0xff,0xff,0xf6,0x00,0x5c,0x01,0x00,\r\n0xff,0xf6,0x00,0x5c,0x01,0x08,0xff,0xf6,0x00,0x5c,0x01,0x0b,0xff,0xf6,0x00,0x5c,0x01,0x0d,0xff,0xf6,0x00,0x5c,0x01,0x19,0xff,0xf6,0x00,0x5c,0x01,0x21,0x00,0x06,0x00,0x5c,0x01,0x23,0x00,0x06,0x00,0x5c,0x01,0x48,0xff,0xf6,0x00,0x5c,0x01,0x4c,0xff,0xf6,0x00,0x5c,0x01,0x4e,0xff,0xf6,0x00,0x5c,0x01,0x50,0xff,0xf6,0x00,0x5c,\r\n0x01,0x52,0xff,0xf6,0x00,0x5c,0x01,0x54,0xff,0xf6,0x00,0x5c,0x01,0x56,0xff,0xf6,0x00,0x5c,0x01,0x6f,0xff,0xf6,0x00,0x5c,0x01,0x71,0xff,0xf6,0x00,0x5c,0x01,0x77,0x00,0x06,0x00,0x5c,0x01,0x8a,0xff,0xf6,0x00,0x5e,0x00,0x4d,0x00,0xcb,0x00,0x5e,0x01,0x64,0x00,0xcb,0x00,0x62,0x00,0x2d,0x00,0x5e,0x00,0x62,0x00,0x37,0xff,0x6d,\r\n0x00,0x62,0x00,0x39,0xff,0x8b,0x00,0x62,0x00,0x3a,0xff,0xb0,0x00,0x62,0x00,0x3c,0xff,0x64,0x00,0x62,0x00,0xea,0xff,0x64,0x00,0x62,0x01,0x20,0xff,0x6d,0x00,0x62,0x01,0x22,0xff,0x6d,0x00,0x62,0x01,0x63,0x00,0x5e,0x00,0x62,0x01,0x76,0xff,0x6d,0x00,0x62,0x01,0x80,0xff,0xb0,0x00,0x62,0x01,0x82,0xff,0x64,0x00,0x62,0x01,0x8c,\r\n0xff,0xb0,0x00,0x62,0x01,0x8e,0xff,0xb0,0x00,0x62,0x01,0x90,0xff,0xb0,0x00,0x62,0x01,0x92,0xff,0x64,0x00,0x63,0x00,0x2d,0x00,0x5e,0x00,0x63,0x00,0x37,0xff,0x6d,0x00,0x63,0x00,0x39,0xff,0x8b,0x00,0x63,0x00,0x3a,0xff,0xb6,0x00,0x63,0x00,0x3c,0xff,0x64,0x00,0x63,0x00,0xea,0xff,0x64,0x00,0x63,0x01,0x20,0xff,0x6d,0x00,0x63,\r\n0x01,0x22,0xff,0x6d,0x00,0x63,0x01,0x63,0x00,0x5e,0x00,0x63,0x01,0x76,0xff,0x6d,0x00,0x63,0x01,0x80,0xff,0xb6,0x00,0x63,0x01,0x82,0xff,0x64,0x00,0x63,0x01,0x8c,0xff,0xb6,0x00,0x63,0x01,0x8e,0xff,0xb6,0x00,0x63,0x01,0x90,0xff,0xb6,0x00,0x63,0x01,0x92,0xff,0x64,0x00,0x64,0x00,0x26,0xff,0xc9,0x00,0x64,0x00,0x2a,0xff,0xc9,\r\n0x00,0x64,0x00,0x32,0xff,0xc9,0x00,0x64,0x00,0x34,0xff,0xc9,0x00,0x64,0x00,0xf7,0xff,0xc9,0x00,0x64,0x00,0xfc,0xff,0xc9,0x00,0x64,0x00,0xfe,0xff,0xc9,0x00,0x64,0x01,0x18,0xff,0xc9,0x00,0x64,0x01,0x47,0xff,0xc9,0x00,0x64,0x01,0x51,0xff,0xc9,0x00,0x64,0x01,0x53,0xff,0xc9,0x00,0x64,0x01,0x55,0xff,0xc9,0x00,0x64,0x01,0x6e,\r\n0xff,0xc9,0x00,0x64,0x01,0x70,0xff,0xc9,0x00,0x64,0x01,0x89,0xff,0xc9,0x00,0x65,0x00,0x2d,0x00,0x3d,0x00,0x65,0x01,0x63,0x00,0x3d,0x00,0x67,0x00,0x24,0xff,0xe5,0x00,0x67,0x00,0x37,0xff,0xa4,0x00,0x67,0x00,0x3b,0xff,0xdb,0x00,0x67,0x00,0x3d,0xff,0xcf,0x00,0x67,0x00,0xe5,0xff,0xcf,0x00,0x67,0x01,0x03,0xff,0xe5,0x00,0x67,\r\n0x01,0x05,0xff,0xe5,0x00,0x67,0x01,0x20,0xff,0xa4,0x00,0x67,0x01,0x22,0xff,0xa4,0x00,0x67,0x01,0x28,0xff,0xcf,0x00,0x67,0x01,0x2a,0xff,0xcf,0x00,0x67,0x01,0x45,0xff,0xe5,0x00,0x67,0x01,0x76,0xff,0xa4,0x00,0x67,0x01,0x85,0xff,0xe5,0x00,0x67,0x01,0x87,0xff,0xe5,0x00,0x79,0x00,0x44,0xff,0xe5,0x00,0x79,0x00,0x49,0xff,0xe7,\r\n0x00,0x79,0x00,0x5b,0xff,0xe5,0x00,0x79,0x00,0xc0,0xff,0xe7,0x00,0x79,0x00,0xc1,0xff,0xe7,0x00,0x79,0x01,0x06,0xff,0xe5,0x00,0x79,0x01,0x88,0xff,0xe5,0x00,0x7a,0x00,0x44,0xff,0xe5,0x00,0x7a,0x00,0x49,0xff,0xe7,0x00,0x7a,0x00,0x5b,0xff,0xe5,0x00,0x7a,0x00,0xc0,0xff,0xe7,0x00,0x7a,0x00,0xc1,0xff,0xe7,0x00,0x7a,0x01,0x06,\r\n0xff,0xe5,0x00,0x7a,0x01,0x88,0xff,0xe5,0x00,0x7b,0x00,0x44,0xff,0xe5,0x00,0x7b,0x00,0x49,0xff,0xe7,0x00,0x7b,0x00,0x5b,0xff,0xe5,0x00,0x7b,0x00,0xc0,0xff,0xe7,0x00,0x7b,0x00,0xc1,0xff,0xe7,0x00,0x7b,0x01,0x06,0xff,0xe5,0x00,0x7b,0x01,0x88,0xff,0xe5,0x00,0x7c,0x00,0x44,0xff,0xe5,0x00,0x7c,0x00,0x49,0xff,0xe7,0x00,0x7c,\r\n0x00,0x5b,0xff,0xe5,0x00,0x7c,0x00,0xc0,0xff,0xe7,0x00,0x7c,0x00,0xc1,0xff,0xe7,0x00,0x7c,0x01,0x06,0xff,0xe5,0x00,0x7c,0x01,0x88,0xff,0xe5,0x00,0x7d,0x00,0x44,0xff,0xe5,0x00,0x7d,0x00,0x49,0xff,0xe7,0x00,0x7d,0x00,0x5b,0xff,0xe5,0x00,0x7d,0x00,0xc0,0xff,0xe7,0x00,0x7d,0x00,0xc1,0xff,0xe7,0x00,0x7d,0x01,0x06,0xff,0xe5,\r\n0x00,0x7d,0x01,0x88,0xff,0xe5,0x00,0x91,0x00,0x2d,0x00,0x0e,0x00,0x91,0x01,0x63,0x00,0x0e,0x00,0x92,0x00,0x24,0xff,0xe5,0x00,0x92,0x00,0x37,0xff,0xa4,0x00,0x92,0x00,0x3b,0xff,0xdb,0x00,0x92,0x00,0x3d,0xff,0xcf,0x00,0x92,0x00,0xe5,0xff,0xcf,0x00,0x92,0x01,0x03,0xff,0xe5,0x00,0x92,0x01,0x05,0xff,0xe5,0x00,0x92,0x01,0x20,\r\n0xff,0xa4,0x00,0x92,0x01,0x22,0xff,0xa4,0x00,0x92,0x01,0x28,0xff,0xcf,0x00,0x92,0x01,0x2a,0xff,0xcf,0x00,0x92,0x01,0x45,0xff,0xe5,0x00,0x92,0x01,0x76,0xff,0xa4,0x00,0x92,0x01,0x85,0xff,0xe5,0x00,0x92,0x01,0x87,0xff,0xe5,0x00,0xa1,0x00,0x44,0xff,0xe5,0x00,0xa1,0x00,0x49,0xff,0xe7,0x00,0xa1,0x00,0x5b,0xff,0xe5,0x00,0xa1,\r\n0x00,0xc0,0xff,0xe7,0x00,0xa1,0x00,0xc1,0xff,0xe7,0x00,0xa1,0x01,0x06,0xff,0xe5,0x00,0xa1,0x01,0x88,0xff,0xe5,0x00,0xa2,0x00,0x3c,0xff,0x9a,0x00,0xa2,0x00,0x4d,0x00,0xbc,0x00,0xa2,0x00,0xea,0xff,0x9a,0x00,0xa2,0x01,0x64,0x00,0xbc,0x00,0xa2,0x01,0x82,0xff,0x9a,0x00,0xa2,0x01,0x92,0xff,0x9a,0x00,0xa4,0x00,0x4d,0x00,0xa0,\r\n0x00,0xa4,0x01,0x33,0xff,0xdb,0x00,0xa4,0x01,0x64,0x00,0xa0,0x00,0xa4,0x02,0x37,0xff,0xdb,0x00,0xa9,0x00,0x0d,0xff,0x7f,0x00,0xa9,0x00,0x8d,0xff,0x98,0x00,0xa9,0x00,0xb4,0xff,0x66,0x00,0xa9,0x00,0xb5,0xff,0x3d,0x00,0xa9,0x00,0xb6,0xff,0x66,0x00,0xa9,0x00,0xb7,0xff,0x3d,0x00,0xa9,0x01,0x2d,0xff,0xd5,0x00,0xa9,0x01,0x2e,\r\n0xff,0xd5,0x00,0xa9,0x01,0x33,0xff,0xa4,0x00,0xa9,0x01,0xb4,0xff,0xd5,0x00,0xa9,0x01,0xb7,0x00,0x3d,0x00,0xa9,0x01,0xb8,0xff,0x66,0x00,0xa9,0x01,0xb9,0xff,0x66,0x00,0xa9,0x01,0xba,0x00,0x3d,0x00,0xa9,0x01,0xbb,0xff,0x79,0x00,0xa9,0x01,0xbc,0x00,0x12,0x00,0xa9,0x01,0xbe,0xff,0x66,0x00,0xa9,0x01,0xc3,0xff,0xf6,0x00,0xa9,\r\n0x01,0xc5,0xff,0xb6,0x00,0xa9,0x01,0xc8,0xff,0xf4,0x00,0xa9,0x01,0xcb,0x00,0x3d,0x00,0xa9,0x01,0xcd,0xff,0xdb,0x00,0xa9,0x01,0xd2,0xff,0xf6,0x00,0xa9,0x01,0xd3,0xff,0xc1,0x00,0xa9,0x01,0xd4,0xff,0xf6,0x00,0xa9,0x01,0xd7,0xff,0xf6,0x00,0xa9,0x01,0xd9,0xff,0xf6,0x00,0xaa,0x00,0x2d,0x00,0x52,0x00,0xaa,0x00,0x37,0xff,0xcf,\r\n0x00,0xaa,0x00,0x3a,0x00,0x52,0x00,0xaa,0x00,0x3d,0x00,0x52,0x00,0xaa,0x00,0x5c,0x00,0x0c,0x00,0xaa,0x00,0xe5,0x00,0x52,0x00,0xaa,0x00,0xeb,0x00,0x0c,0x00,0xaa,0x01,0x20,0xff,0xcf,0x00,0xaa,0x01,0x22,0xff,0xcf,0x00,0xaa,0x01,0x28,0x00,0x52,0x00,0xaa,0x01,0x2a,0x00,0x52,0x00,0xaa,0x01,0x63,0x00,0x52,0x00,0xaa,0x01,0x76,\r\n0xff,0xcf,0x00,0xaa,0x01,0x80,0x00,0x52,0x00,0xaa,0x01,0x83,0x00,0x0c,0x00,0xaa,0x01,0x8c,0x00,0x52,0x00,0xaa,0x01,0x8e,0x00,0x52,0x00,0xaa,0x01,0x90,0x00,0x52,0x00,0xaa,0x01,0x93,0x00,0x0c,0x00,0xaa,0x01,0xac,0x00,0x52,0x00,0xaa,0x01,0xb8,0xff,0xcd,0x00,0xaa,0x01,0xdc,0xff,0xcd,0x00,0xaa,0x01,0xe1,0x00,0x52,0x00,0xaa,\r\n0x01,0xe3,0xff,0xcd,0x00,0xaa,0x01,0xeb,0x00,0x52,0x00,0xaa,0x01,0xf2,0x00,0x52,0x00,0xaa,0x01,0xf9,0xff,0xcd,0x00,0xaa,0x02,0x01,0xff,0xcd,0x00,0xaa,0x02,0x1a,0x00,0x0e,0x00,0xaa,0x02,0x31,0x00,0x0e,0x00,0xab,0x00,0x37,0xff,0xcf,0x00,0xab,0x00,0x39,0xff,0xcf,0x00,0xab,0x00,0x3a,0xff,0xcf,0x00,0xab,0x00,0x3c,0xff,0x9a,\r\n0x00,0xab,0x00,0xea,0xff,0x9a,0x00,0xab,0x01,0x20,0xff,0xcf,0x00,0xab,0x01,0x22,0xff,0xcf,0x00,0xab,0x01,0x76,0xff,0xcf,0x00,0xab,0x01,0x80,0xff,0xcf,0x00,0xab,0x01,0x82,0xff,0x9a,0x00,0xab,0x01,0x8c,0xff,0xcf,0x00,0xab,0x01,0x8e,0xff,0xcf,0x00,0xab,0x01,0x90,0xff,0xcf,0x00,0xab,0x01,0x92,0xff,0x9a,0x00,0xab,0x01,0xb8,\r\n0xff,0xcd,0x00,0xab,0x01,0xb9,0xff,0x98,0x00,0xab,0x01,0xdc,0xff,0xcd,0x00,0xab,0x01,0xe3,0xff,0xcd,0x00,0xab,0x01,0xf9,0xff,0xcd,0x00,0xab,0x02,0x01,0xff,0xcd,0x00,0xac,0x00,0xb4,0xff,0x31,0x00,0xac,0x00,0xb5,0xff,0x3d,0x00,0xac,0x00,0xb6,0xff,0x31,0x00,0xac,0x00,0xb7,0xff,0x3d,0x00,0xad,0x00,0x2d,0x00,0x5e,0x00,0xad,\r\n0x00,0x37,0xff,0x6d,0x00,0xad,0x00,0x39,0xff,0x8b,0x00,0xad,0x00,0x3a,0xff,0xb6,0x00,0xad,0x00,0x3c,0xff,0x64,0x00,0xad,0x00,0xea,0xff,0x64,0x00,0xad,0x01,0x20,0xff,0x6d,0x00,0xad,0x01,0x22,0xff,0x6d,0x00,0xad,0x01,0x63,0x00,0x5e,0x00,0xad,0x01,0x76,0xff,0x6d,0x00,0xad,0x01,0x80,0xff,0xb6,0x00,0xad,0x01,0x82,0xff,0x64,\r\n0x00,0xad,0x01,0x8c,0xff,0xb6,0x00,0xad,0x01,0x8e,0xff,0xb6,0x00,0xad,0x01,0x90,0xff,0xb6,0x00,0xad,0x01,0x92,0xff,0x64,0x00,0xae,0x00,0x2d,0x00,0x5e,0x00,0xae,0x00,0x37,0xff,0x6d,0x00,0xae,0x00,0x39,0xff,0x8b,0x00,0xae,0x00,0x3a,0xff,0xb6,0x00,0xae,0x00,0x3c,0xff,0x64,0x00,0xae,0x00,0xea,0xff,0x64,0x00,0xae,0x01,0x20,\r\n0xff,0x6d,0x00,0xae,0x01,0x22,0xff,0x6d,0x00,0xae,0x01,0x63,0x00,0x5e,0x00,0xae,0x01,0x76,0xff,0x6d,0x00,0xae,0x01,0x80,0xff,0xb6,0x00,0xae,0x01,0x82,0xff,0x64,0x00,0xae,0x01,0x8c,0xff,0xb6,0x00,0xae,0x01,0x8e,0xff,0xb6,0x00,0xae,0x01,0x90,0xff,0xb6,0x00,0xae,0x01,0x92,0xff,0x64,0x00,0xaf,0x00,0x24,0xff,0xe5,0x00,0xaf,\r\n0x00,0x37,0xff,0xa4,0x00,0xaf,0x00,0x3b,0xff,0xdb,0x00,0xaf,0x00,0x3d,0xff,0xcf,0x00,0xaf,0x00,0xe5,0xff,0xcf,0x00,0xaf,0x01,0x03,0xff,0xe5,0x00,0xaf,0x01,0x05,0xff,0xe5,0x00,0xaf,0x01,0x20,0xff,0xa4,0x00,0xaf,0x01,0x22,0xff,0xa4,0x00,0xaf,0x01,0x28,0xff,0xcf,0x00,0xaf,0x01,0x2a,0xff,0xcf,0x00,0xaf,0x01,0x45,0xff,0xe5,\r\n0x00,0xaf,0x01,0x76,0xff,0xa4,0x00,0xaf,0x01,0x85,0xff,0xe5,0x00,0xaf,0x01,0x87,0xff,0xe5,0x00,0xb0,0x00,0x24,0x00,0x1d,0x00,0xb0,0x00,0x2d,0x00,0x44,0x00,0xb0,0x00,0x37,0x00,0x04,0x00,0xb0,0x00,0x3b,0x00,0x08,0x00,0xb0,0x01,0x03,0x00,0x1d,0x00,0xb0,0x01,0x05,0x00,0x1d,0x00,0xb0,0x01,0x20,0x00,0x04,0x00,0xb0,0x01,0x22,\r\n0x00,0x04,0x00,0xb0,0x01,0x45,0x00,0x1d,0x00,0xb0,0x01,0x63,0x00,0x44,0x00,0xb0,0x01,0x76,0x00,0x04,0x00,0xb0,0x01,0x85,0x00,0x1d,0x00,0xb0,0x01,0x87,0x00,0x1d,0x00,0xb4,0x00,0x0f,0xff,0x98,0x00,0xb4,0x00,0x11,0xff,0x98,0x00,0xb4,0x00,0x24,0xff,0x25,0x00,0xb4,0x00,0x2d,0xff,0x62,0x00,0xb4,0x00,0x37,0x00,0x52,0x00,0xb4,\r\n0x00,0x46,0xff,0x7f,0x00,0xb4,0x00,0x47,0xff,0x7f,0x00,0xb4,0x00,0x48,0xff,0x7f,0x00,0xb4,0x00,0x4a,0xff,0x73,0x00,0xb4,0x00,0x56,0xff,0xb2,0x00,0xb4,0x00,0x91,0xfe,0x87,0x00,0xb4,0x00,0xac,0xff,0x98,0x00,0xb4,0x00,0xe4,0xff,0xb2,0x00,0xb4,0x00,0xf8,0xff,0x73,0x00,0xb4,0x00,0xfb,0xff,0xb2,0x00,0xb4,0x00,0xfd,0xff,0x7f,\r\n0x00,0xb4,0x00,0xff,0xff,0x7f,0x00,0xb4,0x01,0x00,0xff,0x7f,0x00,0xb4,0x01,0x03,0xff,0x25,0x00,0xb4,0x01,0x05,0xff,0x25,0x00,0xb4,0x01,0x08,0xff,0x7f,0x00,0xb4,0x01,0x0b,0xff,0x7f,0x00,0xb4,0x01,0x1f,0xff,0xb2,0x00,0xb4,0x01,0x20,0x00,0x52,0x00,0xb4,0x01,0x22,0x00,0x52,0x00,0xb4,0x01,0x45,0xff,0x25,0x00,0xb4,0x01,0x48,\r\n0xff,0x7f,0x00,0xb4,0x01,0x52,0xff,0x73,0x00,0xb4,0x01,0x54,0xff,0x73,0x00,0xb4,0x01,0x56,0xff,0x73,0x00,0xb4,0x01,0x63,0xff,0x62,0x00,0xb4,0x01,0x75,0xff,0xb2,0x00,0xb4,0x01,0x76,0x00,0x52,0x00,0xb4,0x01,0x85,0xff,0x25,0x00,0xb4,0x01,0x87,0xff,0x25,0x00,0xb4,0x01,0xb8,0x00,0x52,0x00,0xb4,0x01,0xdc,0x00,0x52,0x00,0xb4,\r\n0x01,0xe1,0xff,0x6f,0x00,0xb4,0x01,0xe3,0x00,0x52,0x00,0xb4,0x01,0xe7,0xff,0x23,0x00,0xb4,0x01,0xeb,0xff,0x6f,0x00,0xb4,0x01,0xf2,0xff,0x6f,0x00,0xb4,0x01,0xf9,0x00,0x52,0x00,0xb4,0x02,0x01,0x00,0x52,0x00,0xb4,0x02,0x0c,0xff,0x7f,0x00,0xb4,0x02,0x15,0xff,0x7f,0x00,0xb4,0x02,0x18,0xff,0x7f,0x00,0xb4,0x02,0x1b,0xff,0x7f,\r\n0x00,0xb4,0x02,0x27,0xff,0x7f,0x00,0xb4,0x02,0x2a,0xff,0x7f,0x00,0xb4,0x02,0x2b,0xff,0xb0,0x00,0xb4,0x02,0x3e,0xff,0xb2,0x00,0xb5,0x00,0x0f,0xff,0x9a,0x00,0xb5,0x00,0x11,0xff,0x9a,0x00,0xb5,0x00,0x24,0xff,0x66,0x00,0xb5,0x00,0x37,0x00,0x52,0x00,0xb5,0x00,0x46,0xff,0xdd,0x00,0xb5,0x00,0x47,0xff,0x62,0x00,0xb5,0x00,0x48,\r\n0xff,0x62,0x00,0xb5,0x00,0x4a,0xff,0x62,0x00,0xb5,0x00,0x52,0xff,0x62,0x00,0xb5,0x00,0x56,0xff,0x7f,0x00,0xb5,0x00,0x91,0xff,0x0a,0x00,0xb5,0x00,0xac,0xff,0x9a,0x00,0xb5,0x00,0xe4,0xff,0x7f,0x00,0xb5,0x00,0xf8,0xff,0x62,0x00,0xb5,0x00,0xfb,0xff,0x7f,0x00,0xb5,0x00,0xfd,0xff,0xdd,0x00,0xb5,0x00,0xff,0xff,0xdd,0x00,0xb5,\r\n0x01,0x00,0xff,0x62,0x00,0xb5,0x01,0x03,0xff,0x66,0x00,0xb5,0x01,0x05,0xff,0x66,0x00,0xb5,0x01,0x08,0xff,0x62,0x00,0xb5,0x01,0x0b,0xff,0x62,0x00,0xb5,0x01,0x1f,0xff,0x7f,0x00,0xb5,0x01,0x20,0x00,0x52,0x00,0xb5,0x01,0x22,0x00,0x52,0x00,0xb5,0x01,0x45,0xff,0x66,0x00,0xb5,0x01,0x48,0xff,0xdd,0x00,0xb5,0x01,0x52,0xff,0x62,\r\n0x00,0xb5,0x01,0x54,0xff,0x62,0x00,0xb5,0x01,0x56,0xff,0x62,0x00,0xb5,0x01,0x75,0xff,0x7f,0x00,0xb5,0x01,0x76,0x00,0x52,0x00,0xb5,0x01,0x85,0xff,0x66,0x00,0xb5,0x01,0x87,0xff,0x66,0x00,0xb5,0x01,0xdc,0x00,0x52,0x00,0xb5,0x01,0xe3,0x00,0x52,0x00,0xb5,0x01,0xe7,0xff,0x66,0x00,0xb5,0x01,0xf9,0x00,0x52,0x00,0xb5,0x02,0x01,\r\n0x00,0x52,0x00,0xb5,0x02,0x0c,0xff,0x62,0x00,0xb5,0x02,0x15,0xff,0x62,0x00,0xb5,0x02,0x18,0xff,0x62,0x00,0xb5,0x02,0x1b,0xff,0x62,0x00,0xb5,0x02,0x27,0xff,0x62,0x00,0xb5,0x02,0x2a,0xff,0x62,0x00,0xb5,0x02,0x2b,0xff,0x7f,0x00,0xb5,0x02,0x3e,0xff,0x7f,0x00,0xb6,0x00,0x24,0xff,0x25,0x00,0xb6,0x00,0x26,0xff,0xbe,0x00,0xb6,\r\n0x00,0x2d,0xff,0x6f,0x00,0xb6,0x00,0x37,0x00,0x52,0x00,0xb6,0x00,0x46,0xff,0x7f,0x00,0xb6,0x00,0x47,0xff,0x62,0x00,0xb6,0x00,0x48,0xff,0x7f,0x00,0xb6,0x00,0x4a,0xff,0x7f,0x00,0xb6,0x00,0x52,0xff,0x7f,0x00,0xb6,0x00,0x56,0xff,0xb2,0x00,0xb6,0x00,0x91,0xff,0x0a,0x00,0xb6,0x00,0xb6,0xff,0x54,0x00,0xb6,0x00,0xe4,0xff,0xb2,\r\n0x00,0xb6,0x00,0xf8,0xff,0x7f,0x00,0xb6,0x00,0xfb,0xff,0xb2,0x00,0xb6,0x00,0xfc,0xff,0xbe,0x00,0xb6,0x00,0xfd,0xff,0x7f,0x00,0xb6,0x00,0xfe,0xff,0xbe,0x00,0xb6,0x00,0xff,0xff,0x7f,0x00,0xb6,0x01,0x00,0xff,0x62,0x00,0xb6,0x01,0x03,0xff,0x25,0x00,0xb6,0x01,0x05,0xff,0x25,0x00,0xb6,0x01,0x08,0xff,0x62,0x00,0xb6,0x01,0x0b,\r\n0xff,0x7f,0x00,0xb6,0x01,0x1f,0xff,0xb2,0x00,0xb6,0x01,0x20,0x00,0x52,0x00,0xb6,0x01,0x22,0x00,0x52,0x00,0xb6,0x01,0x45,0xff,0x25,0x00,0xb6,0x01,0x47,0xff,0xbe,0x00,0xb6,0x01,0x48,0xff,0x7f,0x00,0xb6,0x01,0x52,0xff,0x7f,0x00,0xb6,0x01,0x54,0xff,0x7f,0x00,0xb6,0x01,0x56,0xff,0x7f,0x00,0xb6,0x01,0x63,0xff,0x6f,0x00,0xb6,\r\n0x01,0x75,0xff,0xb2,0x00,0xb6,0x01,0x76,0x00,0x52,0x00,0xb6,0x01,0x85,0xff,0x25,0x00,0xb6,0x01,0x87,0xff,0x25,0x00,0xb6,0x01,0xdc,0x00,0x52,0x00,0xb6,0x01,0xde,0xff,0xbc,0x00,0xb6,0x01,0xe1,0xff,0x6f,0x00,0xb6,0x01,0xe3,0x00,0x52,0x00,0xb6,0x01,0xe7,0xff,0x23,0x00,0xb6,0x01,0xeb,0xff,0x6f,0x00,0xb6,0x01,0xf2,0xff,0x6f,\r\n0x00,0xb6,0x01,0xf5,0xff,0xbc,0x00,0xb6,0x01,0xf8,0xff,0xbc,0x00,0xb6,0x01,0xf9,0x00,0x52,0x00,0xb6,0x01,0xfb,0xff,0xbc,0x00,0xb6,0x02,0x01,0x00,0x52,0x00,0xb6,0x02,0x0c,0xff,0x7f,0x00,0xb6,0x02,0x15,0xff,0x7f,0x00,0xb6,0x02,0x18,0xff,0x7f,0x00,0xb6,0x02,0x1b,0xff,0x7f,0x00,0xb6,0x02,0x27,0xff,0x7f,0x00,0xb6,0x02,0x2a,\r\n0xff,0x7f,0x00,0xb6,0x02,0x2b,0xff,0xb0,0x00,0xb6,0x02,0x3e,0xff,0xb2,0x00,0xb7,0x00,0x0f,0xff,0x9a,0x00,0xb7,0x00,0x11,0xff,0x9a,0x00,0xb7,0x00,0x24,0xff,0x5a,0x00,0xb7,0x00,0x2d,0xff,0x62,0x00,0xb7,0x00,0x37,0x00,0x52,0x00,0xb7,0x00,0x44,0xff,0x98,0x00,0xb7,0x00,0x46,0xff,0x3d,0x00,0xb7,0x00,0x47,0xff,0x62,0x00,0xb7,\r\n0x00,0x48,0xff,0x62,0x00,0xb7,0x00,0x4a,0xff,0x62,0x00,0xb7,0x00,0x52,0xff,0x62,0x00,0xb7,0x00,0x54,0xff,0x6f,0x00,0xb7,0x00,0x56,0xff,0x8b,0x00,0xb7,0x00,0x91,0xff,0x08,0x00,0xb7,0x00,0xac,0xff,0x9a,0x00,0xb7,0x00,0xb7,0xff,0x54,0x00,0xb7,0x00,0xc4,0xff,0x98,0x00,0xb7,0x00,0xe4,0xff,0x8b,0x00,0xb7,0x00,0xf8,0xff,0x62,\r\n0x00,0xb7,0x00,0xfb,0xff,0x8b,0x00,0xb7,0x00,0xfd,0xff,0x3d,0x00,0xb7,0x00,0xff,0xff,0x3d,0x00,0xb7,0x01,0x00,0xff,0x62,0x00,0xb7,0x01,0x03,0xff,0x5a,0x00,0xb7,0x01,0x05,0xff,0x5a,0x00,0xb7,0x01,0x06,0xff,0x98,0x00,0xb7,0x01,0x08,0xff,0x62,0x00,0xb7,0x01,0x0b,0xff,0x62,0x00,0xb7,0x01,0x1f,0xff,0x8b,0x00,0xb7,0x01,0x20,\r\n0x00,0x52,0x00,0xb7,0x01,0x22,0x00,0x52,0x00,0xb7,0x01,0x45,0xff,0x5a,0x00,0xb7,0x01,0x48,0xff,0x3d,0x00,0xb7,0x01,0x52,0xff,0x62,0x00,0xb7,0x01,0x54,0xff,0x62,0x00,0xb7,0x01,0x56,0xff,0x62,0x00,0xb7,0x01,0x63,0xff,0x62,0x00,0xb7,0x01,0x75,0xff,0x8b,0x00,0xb7,0x01,0x76,0x00,0x52,0x00,0xb7,0x01,0x85,0xff,0x5a,0x00,0xb7,\r\n0x01,0x87,0xff,0x5a,0x00,0xb7,0x01,0x88,0xff,0x98,0x00,0xb7,0x01,0xdc,0x00,0x52,0x00,0xb7,0x01,0xe1,0xff,0x62,0x00,0xb7,0x01,0xe3,0x00,0x52,0x00,0xb7,0x01,0xe7,0xff,0x5a,0x00,0xb7,0x01,0xeb,0xff,0x62,0x00,0xb7,0x01,0xf2,0xff,0x62,0x00,0xb7,0x01,0xf9,0x00,0x52,0x00,0xb7,0x02,0x01,0x00,0x52,0x00,0xb7,0x02,0x07,0xff,0x96,\r\n0x00,0xb7,0x02,0x0c,0xff,0x62,0x00,0xb7,0x02,0x15,0xff,0x62,0x00,0xb7,0x02,0x18,0xff,0x62,0x00,0xb7,0x02,0x1b,0xff,0x62,0x00,0xb7,0x02,0x27,0xff,0x62,0x00,0xb7,0x02,0x2a,0xff,0x62,0x00,0xb7,0x02,0x2b,0xff,0x8b,0x00,0xb7,0x02,0x3e,0xff,0x8b,0x00,0xba,0x00,0x46,0xff,0xf6,0x00,0xba,0x00,0x47,0xff,0xf6,0x00,0xba,0x00,0x48,\r\n0xff,0xf6,0x00,0xba,0x00,0x4a,0xff,0xf6,0x00,0xba,0x00,0x52,0xff,0xf6,0x00,0xba,0x00,0x54,0xff,0xf6,0x00,0xba,0x00,0xf8,0xff,0xf6,0x00,0xba,0x00,0xfd,0xff,0xf6,0x00,0xba,0x00,0xff,0xff,0xf6,0x00,0xba,0x01,0x00,0xff,0xf6,0x00,0xba,0x01,0x08,0xff,0xf6,0x00,0xba,0x01,0x0b,0xff,0xf6,0x00,0xba,0x01,0x48,0xff,0xf6,0x00,0xba,\r\n0x01,0x52,0xff,0xf6,0x00,0xba,0x01,0x54,0xff,0xf6,0x00,0xba,0x01,0x56,0xff,0xf6,0x00,0xbb,0x00,0x24,0xff,0x62,0x00,0xbb,0x00,0x26,0xff,0xe1,0x00,0xbb,0x00,0x2a,0xff,0xe1,0x00,0xbb,0x00,0x32,0xff,0xe1,0x00,0xbb,0x00,0x34,0xff,0xcd,0x00,0xbb,0x00,0x36,0xff,0xe5,0x00,0xbb,0x00,0xe3,0xff,0xe5,0x00,0xbb,0x00,0xf7,0xff,0xe1,\r\n0x00,0xbb,0x00,0xfa,0xff,0xe5,0x00,0xbb,0x00,0xfc,0xff,0xe1,0x00,0xbb,0x00,0xfe,0xff,0xe1,0x00,0xbb,0x01,0x03,0xff,0x62,0x00,0xbb,0x01,0x05,0xff,0x62,0x00,0xbb,0x01,0x18,0xff,0xe1,0x00,0xbb,0x01,0x1e,0xff,0xe5,0x00,0xbb,0x01,0x45,0xff,0x62,0x00,0xbb,0x01,0x47,0xff,0xe1,0x00,0xbb,0x01,0x51,0xff,0xe1,0x00,0xbb,0x01,0x53,\r\n0xff,0xe1,0x00,0xbb,0x01,0x55,0xff,0xe1,0x00,0xbb,0x01,0x6e,0xff,0xe1,0x00,0xbb,0x01,0x70,0xff,0xe1,0x00,0xbb,0x01,0x74,0xff,0xe5,0x00,0xbb,0x01,0x85,0xff,0x62,0x00,0xbb,0x01,0x87,0xff,0x62,0x00,0xbb,0x01,0x89,0xff,0xe1,0x00,0xbb,0x02,0x3d,0xff,0xe5,0x00,0xbe,0x00,0x2d,0x00,0x52,0x00,0xbe,0x00,0x37,0xff,0xcf,0x00,0xbe,\r\n0x00,0x3a,0x00,0x27,0x00,0xbe,0x00,0x3d,0x00,0x52,0x00,0xbe,0x00,0x5c,0x00,0x0c,0x00,0xbe,0x00,0xe5,0x00,0x52,0x00,0xbe,0x00,0xeb,0x00,0x0c,0x00,0xbe,0x01,0x20,0xff,0xcf,0x00,0xbe,0x01,0x22,0xff,0xcf,0x00,0xbe,0x01,0x28,0x00,0x52,0x00,0xbe,0x01,0x2a,0x00,0x52,0x00,0xbe,0x01,0x63,0x00,0x52,0x00,0xbe,0x01,0x76,0xff,0xcf,\r\n0x00,0xbe,0x01,0x80,0x00,0x27,0x00,0xbe,0x01,0x83,0x00,0x0c,0x00,0xbe,0x01,0x8c,0x00,0x27,0x00,0xbe,0x01,0x8e,0x00,0x27,0x00,0xbe,0x01,0x90,0x00,0x27,0x00,0xbe,0x01,0x93,0x00,0x0c,0x00,0xbe,0x01,0xdc,0xff,0xcd,0x00,0xbe,0x01,0xe1,0x00,0x52,0x00,0xbe,0x01,0xe3,0xff,0xcd,0x00,0xbe,0x01,0xeb,0x00,0x52,0x00,0xbe,0x01,0xf2,\r\n0x00,0x52,0x00,0xbe,0x01,0xf9,0xff,0xcd,0x00,0xbe,0x02,0x01,0xff,0xcd,0x00,0xbe,0x02,0x1a,0x00,0x0e,0x00,0xbe,0x02,0x31,0x00,0x0e,0x00,0xbf,0x00,0x37,0xff,0x9a,0x00,0xbf,0x00,0x39,0xff,0xcf,0x00,0xbf,0x00,0x3a,0xff,0xcf,0x00,0xbf,0x00,0x3c,0xff,0x9a,0x00,0xbf,0x00,0xea,0xff,0x9a,0x00,0xbf,0x01,0x20,0xff,0x9a,0x00,0xbf,\r\n0x01,0x22,0xff,0x9a,0x00,0xbf,0x01,0x76,0xff,0x9a,0x00,0xbf,0x01,0x80,0xff,0xcf,0x00,0xbf,0x01,0x82,0xff,0x9a,0x00,0xbf,0x01,0x8c,0xff,0xcf,0x00,0xbf,0x01,0x8e,0xff,0xcf,0x00,0xbf,0x01,0x90,0xff,0xcf,0x00,0xbf,0x01,0x92,0xff,0x9a,0x00,0xbf,0x01,0xdc,0xff,0x98,0x00,0xbf,0x01,0xe3,0xff,0x98,0x00,0xbf,0x01,0xf9,0xff,0x98,\r\n0x00,0xbf,0x02,0x01,0xff,0x98,0x00,0xc4,0x00,0x2a,0xff,0xb2,0x00,0xc4,0x00,0x2d,0x00,0x6d,0x00,0xc4,0x00,0x32,0xff,0xa6,0x00,0xc4,0x00,0x37,0xff,0x31,0x00,0xc4,0x00,0x38,0xff,0xf6,0x00,0xc4,0x00,0x39,0xff,0x73,0x00,0xc4,0x00,0x3a,0xff,0x7f,0x00,0xc4,0x00,0x3b,0x00,0x39,0x00,0xc4,0x00,0x3c,0xff,0x08,0x00,0xc4,0x00,0x52,\r\n0x00,0x19,0x00,0xc4,0x00,0x59,0xff,0x8b,0x00,0xc4,0x00,0x5a,0xff,0x7f,0x00,0xc4,0x00,0xea,0xff,0x08,0x00,0xc4,0x00,0xf7,0xff,0xb2,0x00,0xc4,0x01,0x18,0xff,0xa6,0x00,0xc4,0x01,0x20,0xff,0x31,0x00,0xc4,0x01,0x22,0xff,0x31,0x00,0xc4,0x01,0x24,0xff,0xf6,0x00,0xc4,0x01,0x26,0xff,0xf6,0x00,0xc4,0x01,0x51,0xff,0xb2,0x00,0xc4,\r\n0x01,0x53,0xff,0xb2,0x00,0xc4,0x01,0x55,0xff,0xb2,0x00,0xc4,0x01,0x63,0x00,0x6d,0x00,0xc4,0x01,0x6e,0xff,0xa6,0x00,0xc4,0x01,0x70,0xff,0xa6,0x00,0xc4,0x01,0x76,0xff,0x31,0x00,0xc4,0x01,0x78,0xff,0xf6,0x00,0xc4,0x01,0x7a,0xff,0xf6,0x00,0xc4,0x01,0x7c,0xff,0xf6,0x00,0xc4,0x01,0x7e,0xff,0xf6,0x00,0xc4,0x01,0x80,0xff,0x7f,\r\n0x00,0xc4,0x01,0x81,0xff,0x7f,0x00,0xc4,0x01,0x82,0xff,0x08,0x00,0xc4,0x01,0x89,0xff,0xa6,0x00,0xc4,0x01,0x8c,0xff,0x7f,0x00,0xc4,0x01,0x8d,0xff,0x7f,0x00,0xc4,0x01,0x8e,0xff,0x7f,0x00,0xc4,0x01,0x8f,0xff,0x7f,0x00,0xc4,0x01,0x90,0xff,0x7f,0x00,0xc4,0x01,0x91,0xff,0x7f,0x00,0xc4,0x01,0x92,0xff,0x08,0x00,0xc4,0x01,0xdc,\r\n0xff,0x31,0x00,0xc4,0x01,0xde,0xff,0xa4,0x00,0xc4,0x01,0xe1,0x00,0x6f,0x00,0xc4,0x01,0xe3,0xff,0x31,0x00,0xc4,0x01,0xeb,0x00,0x6f,0x00,0xc4,0x01,0xf2,0x00,0x6f,0x00,0xc4,0x01,0xf5,0xff,0xa4,0x00,0xc4,0x01,0xf8,0xff,0xa4,0x00,0xc4,0x01,0xf9,0xff,0x31,0x00,0xc4,0x01,0xfb,0xff,0xa4,0x00,0xc4,0x01,0xfc,0x00,0x39,0x00,0xc4,\r\n0x02,0x01,0xff,0x31,0x00,0xc4,0x02,0x08,0x00,0x1b,0x00,0xc4,0x02,0x0c,0x00,0x1b,0x00,0xc4,0x02,0x15,0x00,0x1b,0x00,0xc4,0x02,0x18,0x00,0x1b,0x00,0xc4,0x02,0x1b,0x00,0x1b,0x00,0xc4,0x02,0x27,0x00,0x1b,0x00,0xc4,0x02,0x2a,0x00,0x1b,0x00,0xc5,0x00,0x2a,0xff,0xa6,0x00,0xc5,0x00,0x2d,0x00,0x6d,0x00,0xc5,0x00,0x32,0xff,0xb2,\r\n0x00,0xc5,0x00,0x37,0xff,0x31,0x00,0xc5,0x00,0x38,0xff,0xf6,0x00,0xc5,0x00,0x39,0xff,0x7f,0x00,0xc5,0x00,0x3a,0xff,0x8b,0x00,0xc5,0x00,0x3b,0x00,0x27,0x00,0xc5,0x00,0x3c,0xff,0x3d,0x00,0xc5,0x00,0x59,0xff,0x8b,0x00,0xc5,0x00,0x5a,0xff,0x7f,0x00,0xc5,0x00,0xea,0xff,0x3d,0x00,0xc5,0x00,0xf7,0xff,0xa6,0x00,0xc5,0x01,0x18,\r\n0xff,0xb2,0x00,0xc5,0x01,0x20,0xff,0x31,0x00,0xc5,0x01,0x22,0xff,0x31,0x00,0xc5,0x01,0x24,0xff,0xf6,0x00,0xc5,0x01,0x26,0xff,0xf6,0x00,0xc5,0x01,0x51,0xff,0xa6,0x00,0xc5,0x01,0x53,0xff,0xa6,0x00,0xc5,0x01,0x55,0xff,0xa6,0x00,0xc5,0x01,0x63,0x00,0x6d,0x00,0xc5,0x01,0x6e,0xff,0xb2,0x00,0xc5,0x01,0x70,0xff,0xb2,0x00,0xc5,\r\n0x01,0x76,0xff,0x31,0x00,0xc5,0x01,0x78,0xff,0xf6,0x00,0xc5,0x01,0x7a,0xff,0xf6,0x00,0xc5,0x01,0x7c,0xff,0xf6,0x00,0xc5,0x01,0x7e,0xff,0xf6,0x00,0xc5,0x01,0x80,0xff,0x8b,0x00,0xc5,0x01,0x81,0xff,0x7f,0x00,0xc5,0x01,0x82,0xff,0x3d,0x00,0xc5,0x01,0x89,0xff,0xb2,0x00,0xc5,0x01,0x8c,0xff,0x8b,0x00,0xc5,0x01,0x8d,0xff,0x7f,\r\n0x00,0xc5,0x01,0x8e,0xff,0x8b,0x00,0xc5,0x01,0x8f,0xff,0x7f,0x00,0xc5,0x01,0x90,0xff,0x8b,0x00,0xc5,0x01,0x91,0xff,0x7f,0x00,0xc5,0x01,0x92,0xff,0x3d,0x00,0xc5,0x01,0xdc,0xff,0x31,0x00,0xc5,0x01,0xde,0xff,0xb0,0x00,0xc5,0x01,0xe1,0x00,0x6f,0x00,0xc5,0x01,0xe3,0xff,0x31,0x00,0xc5,0x01,0xeb,0x00,0x6f,0x00,0xc5,0x01,0xf2,\r\n0x00,0x6f,0x00,0xc5,0x01,0xf5,0xff,0xb0,0x00,0xc5,0x01,0xf8,0xff,0xb0,0x00,0xc5,0x01,0xf9,0xff,0x31,0x00,0xc5,0x01,0xfb,0xff,0xb0,0x00,0xc5,0x01,0xfc,0x00,0x29,0x00,0xc5,0x02,0x01,0xff,0x31,0x00,0xc7,0x00,0x2d,0x00,0x5e,0x00,0xc7,0x00,0x37,0xff,0x6d,0x00,0xc7,0x00,0x39,0xff,0x8b,0x00,0xc7,0x00,0x3a,0xff,0xb6,0x00,0xc7,\r\n0x00,0x3c,0xff,0x64,0x00,0xc7,0x00,0xea,0xff,0x64,0x00,0xc7,0x01,0x20,0xff,0x6d,0x00,0xc7,0x01,0x22,0xff,0x6d,0x00,0xc7,0x01,0x63,0x00,0x5e,0x00,0xc7,0x01,0x76,0xff,0x6d,0x00,0xc7,0x01,0x80,0xff,0xb6,0x00,0xc7,0x01,0x82,0xff,0x64,0x00,0xc7,0x01,0x8c,0xff,0xb6,0x00,0xc7,0x01,0x8e,0xff,0xb6,0x00,0xc7,0x01,0x90,0xff,0xb6,\r\n0x00,0xc7,0x01,0x92,0xff,0x64,0x00,0xc8,0x00,0x2d,0x00,0x3d,0x00,0xc8,0x01,0x63,0x00,0x3d,0x00,0xc9,0x00,0x2d,0x00,0x5e,0x00,0xc9,0x00,0x37,0xff,0x6d,0x00,0xc9,0x00,0x39,0xff,0x8b,0x00,0xc9,0x00,0x3a,0xff,0xb6,0x00,0xc9,0x00,0x3c,0xff,0x64,0x00,0xc9,0x00,0xea,0xff,0x64,0x00,0xc9,0x01,0x20,0xff,0x6d,0x00,0xc9,0x01,0x22,\r\n0xff,0x6d,0x00,0xc9,0x01,0x63,0x00,0x5e,0x00,0xc9,0x01,0x76,0xff,0x6d,0x00,0xc9,0x01,0x80,0xff,0xb6,0x00,0xc9,0x01,0x82,0xff,0x64,0x00,0xc9,0x01,0x8c,0xff,0xb6,0x00,0xc9,0x01,0x8e,0xff,0xb6,0x00,0xc9,0x01,0x90,0xff,0xb6,0x00,0xc9,0x01,0x92,0xff,0x64,0x00,0xca,0x00,0x2d,0x00,0x3d,0x00,0xca,0x01,0x63,0x00,0x3d,0x00,0xcb,\r\n0x00,0x2d,0x00,0x3d,0x00,0xcb,0x01,0x63,0x00,0x3d,0x00,0xd0,0x00,0x24,0xff,0xe5,0x00,0xd0,0x00,0x37,0xff,0xa4,0x00,0xd0,0x00,0x3b,0xff,0xdb,0x00,0xd0,0x00,0x3d,0xff,0xcf,0x00,0xd0,0x00,0xe5,0xff,0xcf,0x00,0xd0,0x01,0x03,0xff,0xe5,0x00,0xd0,0x01,0x05,0xff,0xe5,0x00,0xd0,0x01,0x20,0xff,0xa4,0x00,0xd0,0x01,0x22,0xff,0xa4,\r\n0x00,0xd0,0x01,0x28,0xff,0xcf,0x00,0xd0,0x01,0x2a,0xff,0xcf,0x00,0xd0,0x01,0x45,0xff,0xe5,0x00,0xd0,0x01,0x76,0xff,0xa4,0x00,0xd0,0x01,0x85,0xff,0xe5,0x00,0xd0,0x01,0x87,0xff,0xe5,0x00,0xd1,0x00,0x24,0xff,0xe5,0x00,0xd1,0x00,0x37,0xff,0xa4,0x00,0xd1,0x00,0x3b,0xff,0xdb,0x00,0xd1,0x00,0x3d,0xff,0xcf,0x00,0xd1,0x00,0xe5,\r\n0xff,0xcf,0x00,0xd1,0x01,0x03,0xff,0xe5,0x00,0xd1,0x01,0x05,0xff,0xe5,0x00,0xd1,0x01,0x20,0xff,0xa4,0x00,0xd1,0x01,0x22,0xff,0xa4,0x00,0xd1,0x01,0x28,0xff,0xcf,0x00,0xd1,0x01,0x2a,0xff,0xcf,0x00,0xd1,0x01,0x45,0xff,0xe5,0x00,0xd1,0x01,0x76,0xff,0xa4,0x00,0xd1,0x01,0x85,0xff,0xe5,0x00,0xd1,0x01,0x87,0xff,0xe5,0x00,0xd2,\r\n0x00,0x24,0xff,0xe5,0x00,0xd2,0x00,0x37,0xff,0xa4,0x00,0xd2,0x00,0x3b,0xff,0xdb,0x00,0xd2,0x00,0x3d,0xff,0xcf,0x00,0xd2,0x00,0xe5,0xff,0xcf,0x00,0xd2,0x01,0x03,0xff,0xe5,0x00,0xd2,0x01,0x05,0xff,0xe5,0x00,0xd2,0x01,0x20,0xff,0xa4,0x00,0xd2,0x01,0x22,0xff,0xa4,0x00,0xd2,0x01,0x28,0xff,0xcf,0x00,0xd2,0x01,0x2a,0xff,0xcf,\r\n0x00,0xd2,0x01,0x45,0xff,0xe5,0x00,0xd2,0x01,0x76,0xff,0xa4,0x00,0xd2,0x01,0x85,0xff,0xe5,0x00,0xd2,0x01,0x87,0xff,0xe5,0x00,0xe1,0x00,0x0d,0xff,0x31,0x00,0xe1,0x00,0x22,0xff,0x9a,0x00,0xe1,0x00,0x24,0x00,0x3b,0x00,0xe1,0x00,0x26,0xff,0xbe,0x00,0xe1,0x00,0x2a,0xff,0xbe,0x00,0xe1,0x00,0x2d,0x00,0x64,0x00,0xe1,0x00,0x32,\r\n0xff,0xba,0x00,0xe1,0x00,0x34,0xff,0xba,0x00,0xe1,0x00,0x37,0xff,0x8f,0x00,0xe1,0x00,0x38,0xff,0xe3,0x00,0xe1,0x00,0x39,0xff,0x8b,0x00,0xe1,0x00,0x3a,0xff,0xcf,0x00,0xe1,0x00,0x3c,0xff,0x7f,0x00,0xe1,0x00,0x3d,0x00,0x3b,0x00,0xe1,0x00,0x57,0xff,0xe5,0x00,0xe1,0x00,0x59,0xff,0x9a,0x00,0xe1,0x00,0x5a,0xff,0xbe,0x00,0xe1,\r\n0x00,0x5c,0xff,0xb4,0x00,0xe1,0x00,0x64,0xff,0xbe,0x00,0xe1,0x00,0x67,0xff,0xba,0x00,0xe1,0x00,0x68,0xff,0xe3,0x00,0xe1,0x00,0x8d,0xff,0x9a,0x00,0xe1,0x00,0x92,0xff,0xba,0x00,0xe1,0x00,0xaf,0xff,0xba,0x00,0xe1,0x00,0xb0,0xff,0xba,0x00,0xe1,0x00,0xb4,0xff,0x73,0x00,0xe1,0x00,0xb5,0xff,0x8b,0x00,0xe1,0x00,0xb6,0xff,0x73,\r\n0x00,0xe1,0x00,0xb7,0xff,0x7f,0x00,0xe1,0x00,0xba,0xff,0xb4,0x00,0xe1,0x00,0xbb,0xff,0x9a,0x00,0xe1,0x00,0xc4,0x00,0x44,0x00,0xe1,0x00,0xc5,0x00,0x44,0x00,0xe1,0x00,0xd0,0xff,0xba,0x00,0xe1,0x00,0xd1,0xff,0xba,0x00,0xe1,0x00,0xd2,0xff,0xba,0x00,0xe1,0x00,0xd3,0xff,0xe3,0x00,0xe1,0x00,0xd4,0xff,0xe3,0x00,0xe1,0x00,0xd5,\r\n0xff,0xe3,0x00,0xe1,0x00,0xe5,0x00,0x3b,0x00,0xe1,0x00,0xea,0xff,0x7f,0x00,0xe1,0x00,0xeb,0xff,0xb4,0x00,0xe1,0x00,0xf7,0xff,0xbe,0x00,0xe1,0x00,0xfc,0xff,0xbe,0x00,0xe1,0x00,0xfe,0xff,0xbe,0x00,0xe1,0x01,0x03,0x00,0x3b,0x00,0xe1,0x01,0x05,0x00,0x3b,0x00,0xe1,0x01,0x18,0xff,0xba,0x00,0xe1,0x01,0x20,0xff,0x8f,0x00,0xe1,\r\n0x01,0x21,0xff,0xe5,0x00,0xe1,0x01,0x22,0xff,0x8f,0x00,0xe1,0x01,0x23,0xff,0xe5,0x00,0xe1,0x01,0x24,0xff,0xe3,0x00,0xe1,0x01,0x26,0xff,0xe3,0x00,0xe1,0x01,0x28,0x00,0x3b,0x00,0xe1,0x01,0x2a,0x00,0x3b,0x00,0xe1,0x01,0x45,0x00,0x3b,0x00,0xe1,0x01,0x47,0xff,0xbe,0x00,0xe1,0x01,0x51,0xff,0xbe,0x00,0xe1,0x01,0x53,0xff,0xbe,\r\n0x00,0xe1,0x01,0x55,0xff,0xbe,0x00,0xe1,0x01,0x63,0x00,0x64,0x00,0xe1,0x01,0x6e,0xff,0xba,0x00,0xe1,0x01,0x70,0xff,0xba,0x00,0xe1,0x01,0x76,0xff,0x8f,0x00,0xe1,0x01,0x77,0xff,0xe5,0x00,0xe1,0x01,0x78,0xff,0xe3,0x00,0xe1,0x01,0x7a,0xff,0xe3,0x00,0xe1,0x01,0x7c,0xff,0xe3,0x00,0xe1,0x01,0x7e,0xff,0xe3,0x00,0xe1,0x01,0x80,\r\n0xff,0xcf,0x00,0xe1,0x01,0x81,0xff,0xbe,0x00,0xe1,0x01,0x82,0xff,0x7f,0x00,0xe1,0x01,0x83,0xff,0xb4,0x00,0xe1,0x01,0x85,0x00,0x3b,0x00,0xe1,0x01,0x87,0x00,0x3b,0x00,0xe1,0x01,0x89,0xff,0xba,0x00,0xe1,0x01,0x8c,0xff,0xcf,0x00,0xe1,0x01,0x8d,0xff,0xbe,0x00,0xe1,0x01,0x8e,0xff,0xcf,0x00,0xe1,0x01,0x8f,0xff,0xbe,0x00,0xe1,\r\n0x01,0x90,0xff,0xcf,0x00,0xe1,0x01,0x91,0xff,0xbe,0x00,0xe1,0x01,0x92,0xff,0x7f,0x00,0xe1,0x01,0x93,0xff,0xb4,0x00,0xe3,0x00,0x57,0xff,0xbe,0x00,0xe3,0x00,0x59,0xff,0xcf,0x00,0xe3,0x00,0x5a,0xff,0xe5,0x00,0xe3,0x00,0x5c,0xff,0xd1,0x00,0xe3,0x00,0xba,0xff,0xbe,0x00,0xe3,0x00,0xc4,0xff,0xb2,0x00,0xe3,0x00,0xc5,0xff,0xb2,\r\n0x00,0xe3,0x00,0xeb,0xff,0xd1,0x00,0xe3,0x01,0x21,0xff,0xbe,0x00,0xe3,0x01,0x23,0xff,0xbe,0x00,0xe3,0x01,0x77,0xff,0xbe,0x00,0xe3,0x01,0x81,0xff,0xe5,0x00,0xe3,0x01,0x83,0xff,0xd1,0x00,0xe3,0x01,0x8d,0xff,0xe5,0x00,0xe3,0x01,0x8f,0xff,0xe5,0x00,0xe3,0x01,0x91,0xff,0xe5,0x00,0xe3,0x01,0x93,0xff,0xd1,0x00,0xe5,0x00,0x2d,\r\n0x00,0x52,0x00,0xe5,0x00,0x37,0x00,0x27,0x00,0xe5,0x00,0x5c,0xff,0xcb,0x00,0xe5,0x00,0x77,0x00,0x46,0x00,0xe5,0x00,0xab,0x00,0x27,0x00,0xe5,0x00,0xba,0xff,0xbe,0x00,0xe5,0x00,0xbf,0x00,0x52,0x00,0xe5,0x00,0xeb,0xff,0xcb,0x00,0xe5,0x01,0x20,0x00,0x27,0x00,0xe5,0x01,0x22,0x00,0x27,0x00,0xe5,0x01,0x5c,0x00,0x46,0x00,0xe5,\r\n0x01,0x5e,0x00,0x46,0x00,0xe5,0x01,0x60,0x00,0x46,0x00,0xe5,0x01,0x63,0x00,0x52,0x00,0xe5,0x01,0x76,0x00,0x27,0x00,0xe5,0x01,0x83,0xff,0xcb,0x00,0xe5,0x01,0x93,0xff,0xcb,0x00,0xe8,0x00,0x0f,0xff,0x7f,0x00,0xe8,0x00,0x11,0xff,0x7f,0x00,0xe8,0x00,0x24,0xff,0xdf,0x00,0xe8,0x00,0x37,0xff,0xa4,0x00,0xe8,0x00,0x3b,0xff,0xcb,\r\n0x00,0xe8,0x00,0x3d,0xff,0xcf,0x00,0xe8,0x00,0x62,0xff,0xdf,0x00,0xe8,0x00,0x63,0xff,0xdf,0x00,0xe8,0x00,0x91,0xff,0xb6,0x00,0xe8,0x00,0xac,0xff,0x7f,0x00,0xe8,0x00,0xad,0xff,0xdf,0x00,0xe8,0x00,0xae,0xff,0xdf,0x00,0xe8,0x00,0xbb,0xff,0xf6,0x00,0xe8,0x00,0xc4,0xff,0x8b,0x00,0xe8,0x00,0xc5,0xff,0x8b,0x00,0xe8,0x00,0xc7,\r\n0xff,0xdf,0x00,0xe8,0x00,0xc9,0xff,0xdf,0x00,0xe8,0x00,0xe5,0xff,0xcf,0x00,0xe8,0x01,0x03,0xff,0xdf,0x00,0xe8,0x01,0x05,0xff,0xdf,0x00,0xe8,0x01,0x20,0xff,0xa4,0x00,0xe8,0x01,0x22,0xff,0xa4,0x00,0xe8,0x01,0x28,0xff,0xcf,0x00,0xe8,0x01,0x2a,0xff,0xcf,0x00,0xe8,0x01,0x45,0xff,0xdf,0x00,0xe8,0x01,0x76,0xff,0xa4,0x00,0xe8,\r\n0x01,0x85,0xff,0xdf,0x00,0xe8,0x01,0x87,0xff,0xdf,0x00,0xea,0x00,0x0f,0xff,0x50,0x00,0xea,0x00,0x11,0xff,0x3d,0x00,0xea,0x00,0x24,0xff,0x62,0x00,0xea,0x00,0x26,0xff,0xd3,0x00,0xea,0x00,0x2a,0xff,0xd3,0x00,0xea,0x00,0x2d,0xff,0xbe,0x00,0xea,0x00,0x32,0xff,0xd3,0x00,0xea,0x00,0x34,0xff,0xd3,0x00,0xea,0x00,0x36,0xff,0xe5,\r\n0x00,0xea,0x00,0x37,0x00,0x27,0x00,0xea,0x00,0x44,0xff,0x39,0x00,0xea,0x00,0x46,0xff,0x4c,0x00,0xea,0x00,0x47,0xff,0x4c,0x00,0xea,0x00,0x48,0xff,0x4c,0x00,0xea,0x00,0x49,0xff,0xe5,0x00,0xea,0x00,0x4a,0xff,0x4c,0x00,0xea,0x00,0x50,0xff,0x73,0x00,0xea,0x00,0x51,0xff,0x73,0x00,0xea,0x00,0x52,0xff,0x4c,0x00,0xea,0x00,0x53,\r\n0xff,0x73,0x00,0xea,0x00,0x54,0xff,0x4c,0x00,0xea,0x00,0x55,0xff,0x73,0x00,0xea,0x00,0x56,0xff,0x7b,0x00,0xea,0x00,0x58,0xff,0x73,0x00,0xea,0x00,0x62,0xff,0x62,0x00,0xea,0x00,0x63,0xff,0x62,0x00,0xea,0x00,0x64,0xff,0xcd,0x00,0xea,0x00,0x67,0xff,0xd3,0x00,0xea,0x00,0x69,0xff,0x39,0x00,0xea,0x00,0x6a,0xff,0x39,0x00,0xea,\r\n0x00,0x6b,0xff,0x39,0x00,0xea,0x00,0x6c,0xff,0x7f,0x00,0xea,0x00,0x6d,0xff,0x66,0x00,0xea,0x00,0x6e,0xff,0x39,0x00,0xea,0x00,0x6f,0xff,0x4c,0x00,0xea,0x00,0x70,0xff,0x4c,0x00,0xea,0x00,0x71,0xff,0x4c,0x00,0xea,0x00,0x72,0xff,0x4c,0x00,0xea,0x00,0x73,0xff,0x4c,0x00,0xea,0x00,0x77,0x00,0x5a,0x00,0xea,0x00,0x78,0xff,0x73,\r\n0x00,0xea,0x00,0x79,0xff,0x4c,0x00,0xea,0x00,0x7a,0xff,0x4c,0x00,0xea,0x00,0x7b,0xff,0x4c,0x00,0xea,0x00,0x7c,0xff,0x4c,0x00,0xea,0x00,0x7d,0xff,0x4c,0x00,0xea,0x00,0x7e,0xff,0x73,0x00,0xea,0x00,0x7f,0xff,0x73,0x00,0xea,0x00,0x80,0xff,0x73,0x00,0xea,0x00,0x81,0xff,0x73,0x00,0xea,0x00,0x91,0xff,0x3f,0x00,0xea,0x00,0x92,\r\n0xff,0xd3,0x00,0xea,0x00,0xa0,0xff,0x39,0x00,0xea,0x00,0xa2,0xff,0x1b,0x00,0xea,0x00,0xaa,0xff,0xcf,0x00,0xea,0x00,0xac,0xff,0x3d,0x00,0xea,0x00,0xad,0xff,0x62,0x00,0xea,0x00,0xae,0xff,0x62,0x00,0xea,0x00,0xaf,0xff,0xd3,0x00,0xea,0x00,0xb0,0xff,0xd3,0x00,0xea,0x00,0xb1,0xff,0x4c,0x00,0xea,0x00,0xbe,0xff,0x9a,0x00,0xea,\r\n0x00,0xc4,0xff,0x08,0x00,0xea,0x00,0xc5,0xff,0x08,0x00,0xea,0x00,0xc7,0xff,0x62,0x00,0xea,0x00,0xc9,0xff,0x62,0x00,0xea,0x00,0xd0,0xff,0xd3,0x00,0xea,0x00,0xd1,0xff,0xd3,0x00,0xea,0x00,0xd2,0xff,0xd3,0x00,0xea,0x00,0xe3,0xff,0xe5,0x00,0xea,0x00,0xe4,0xff,0x7b,0x00,0xea,0x00,0xf7,0xff,0xd3,0x00,0xea,0x00,0xf8,0xff,0x4c,\r\n0x00,0xea,0x00,0xfa,0xff,0xe5,0x00,0xea,0x00,0xfb,0xff,0x7b,0x00,0xea,0x00,0xfc,0xff,0xd3,0x00,0xea,0x00,0xfd,0xff,0x4c,0x00,0xea,0x00,0xfe,0xff,0xd3,0x00,0xea,0x00,0xff,0xff,0x4c,0x00,0xea,0x01,0x00,0xff,0x4c,0x00,0xea,0x01,0x03,0xff,0x62,0x00,0xea,0x01,0x04,0xff,0x7f,0x00,0xea,0x01,0x05,0xff,0x62,0x00,0xea,0x01,0x06,\r\n0xff,0x39,0x00,0xea,0x01,0x08,0xff,0x4c,0x00,0xea,0x01,0x0b,0xff,0x4c,0x00,0xea,0x01,0x0d,0xff,0x4c,0x00,0xea,0x01,0x15,0xff,0x73,0x00,0xea,0x01,0x17,0xff,0x73,0x00,0xea,0x01,0x18,0xff,0xd3,0x00,0xea,0x01,0x19,0xff,0x4c,0x00,0xea,0x01,0x1b,0xff,0x73,0x00,0xea,0x01,0x1d,0xff,0x73,0x00,0xea,0x01,0x1e,0xff,0xe5,0x00,0xea,\r\n0x01,0x1f,0xff,0x7b,0x00,0xea,0x01,0x20,0x00,0x27,0x00,0xea,0x01,0x22,0x00,0x27,0x00,0xea,0x01,0x25,0xff,0x73,0x00,0xea,0x01,0x27,0xff,0x73,0x00,0xea,0x01,0x45,0xff,0x62,0x00,0xea,0x01,0x46,0xff,0x7f,0x00,0xea,0x01,0x47,0xff,0xd3,0x00,0xea,0x01,0x48,0xff,0x4c,0x00,0xea,0x01,0x4c,0xff,0x4c,0x00,0xea,0x01,0x4e,0xff,0x4c,\r\n0x00,0xea,0x01,0x50,0xff,0x4c,0x00,0xea,0x01,0x51,0xff,0xd3,0x00,0xea,0x01,0x52,0xff,0x4c,0x00,0xea,0x01,0x53,0xff,0xd3,0x00,0xea,0x01,0x54,0xff,0x4c,0x00,0xea,0x01,0x55,0xff,0xd3,0x00,0xea,0x01,0x56,0xff,0x4c,0x00,0xea,0x01,0x5c,0x00,0x5a,0x00,0xea,0x01,0x5e,0x00,0x5a,0x00,0xea,0x01,0x60,0x00,0x5a,0x00,0xea,0x01,0x63,\r\n0xff,0xbe,0x00,0xea,0x01,0x6d,0xff,0x73,0x00,0xea,0x01,0x6e,0xff,0xd3,0x00,0xea,0x01,0x6f,0xff,0x4c,0x00,0xea,0x01,0x70,0xff,0xd3,0x00,0xea,0x01,0x71,0xff,0x4c,0x00,0xea,0x01,0x73,0xff,0x73,0x00,0xea,0x01,0x74,0xff,0xe5,0x00,0xea,0x01,0x75,0xff,0x7b,0x00,0xea,0x01,0x76,0x00,0x27,0x00,0xea,0x01,0x79,0xff,0x73,0x00,0xea,\r\n0x01,0x7b,0xff,0x73,0x00,0xea,0x01,0x7d,0xff,0x73,0x00,0xea,0x01,0x7f,0xff,0x73,0x00,0xea,0x01,0x85,0xff,0x62,0x00,0xea,0x01,0x86,0xff,0x7f,0x00,0xea,0x01,0x87,0xff,0x62,0x00,0xea,0x01,0x88,0xff,0x39,0x00,0xea,0x01,0x89,0xff,0xd3,0x00,0xea,0x01,0x8a,0xff,0x4c,0x00,0xea,0x02,0x3d,0xff,0xe5,0x00,0xea,0x02,0x3e,0xff,0x7b,\r\n0x00,0xeb,0x00,0x05,0x00,0x1d,0x00,0xeb,0x00,0x0a,0x00,0x1d,0x00,0xeb,0x00,0x0f,0xff,0x9a,0x00,0xeb,0x00,0x11,0xff,0x81,0x00,0xeb,0x00,0x22,0xff,0xb4,0x00,0xeb,0x00,0x46,0xff,0xf6,0x00,0xeb,0x00,0x47,0xff,0xf6,0x00,0xeb,0x00,0x48,0xff,0xf6,0x00,0xeb,0x00,0x49,0x00,0x04,0x00,0xeb,0x00,0x4a,0xff,0xf6,0x00,0xeb,0x00,0x52,\r\n0xff,0xf6,0x00,0xeb,0x00,0x54,0xff,0xf6,0x00,0xeb,0x00,0x57,0x00,0x06,0x00,0xeb,0x00,0x6f,0xff,0xf6,0x00,0xeb,0x00,0x70,0xff,0xf6,0x00,0xeb,0x00,0x71,0xff,0xf6,0x00,0xeb,0x00,0x72,0xff,0xf6,0x00,0xeb,0x00,0x73,0xff,0xf6,0x00,0xeb,0x00,0x79,0xff,0xf6,0x00,0xeb,0x00,0x7a,0xff,0xf6,0x00,0xeb,0x00,0x7b,0xff,0xf6,0x00,0xeb,\r\n0x00,0x7c,0xff,0xf6,0x00,0xeb,0x00,0x7d,0xff,0xf6,0x00,0xeb,0x00,0xac,0xff,0x81,0x00,0xeb,0x00,0xb1,0xff,0xf6,0x00,0xeb,0x00,0xbf,0x00,0x0c,0x00,0xeb,0x00,0xc4,0xff,0x8d,0x00,0xeb,0x00,0xc5,0xff,0x8d,0x00,0xeb,0x00,0xf8,0xff,0xf6,0x00,0xeb,0x00,0xfd,0xff,0xf6,0x00,0xeb,0x00,0xff,0xff,0xf6,0x00,0xeb,0x01,0x00,0xff,0xf6,\r\n0x00,0xeb,0x01,0x08,0xff,0xf6,0x00,0xeb,0x01,0x0b,0xff,0xf6,0x00,0xeb,0x01,0x0d,0xff,0xf6,0x00,0xeb,0x01,0x19,0xff,0xf6,0x00,0xeb,0x01,0x21,0x00,0x06,0x00,0xeb,0x01,0x23,0x00,0x06,0x00,0xeb,0x01,0x48,0xff,0xf6,0x00,0xeb,0x01,0x4c,0xff,0xf6,0x00,0xeb,0x01,0x4e,0xff,0xf6,0x00,0xeb,0x01,0x50,0xff,0xf6,0x00,0xeb,0x01,0x52,\r\n0xff,0xf6,0x00,0xeb,0x01,0x54,0xff,0xf6,0x00,0xeb,0x01,0x56,0xff,0xf6,0x00,0xeb,0x01,0x6f,0xff,0xf6,0x00,0xeb,0x01,0x71,0xff,0xf6,0x00,0xeb,0x01,0x77,0x00,0x06,0x00,0xeb,0x01,0x8a,0xff,0xf6,0x00,0xec,0x00,0x0f,0xfe,0xba,0x00,0xec,0x00,0x11,0xfe,0xba,0x00,0xec,0x00,0x24,0xff,0x62,0x00,0xec,0x00,0x2a,0xff,0xf6,0x00,0xec,\r\n0x00,0x2d,0xff,0x7f,0x00,0xec,0x00,0x3a,0x00,0x27,0x00,0xec,0x00,0x3b,0xff,0xc3,0x00,0xec,0x00,0x44,0xff,0xbe,0x00,0xec,0x00,0x46,0xff,0xb4,0x00,0xec,0x00,0x47,0xff,0xb4,0x00,0xec,0x00,0x48,0xff,0xb4,0x00,0xec,0x00,0x4a,0xff,0xb4,0x00,0xec,0x00,0x52,0xff,0xb4,0x00,0xec,0x00,0x54,0xff,0xb6,0x00,0xec,0x00,0x62,0xff,0x62,\r\n0x00,0xec,0x00,0x63,0xff,0x62,0x00,0xec,0x00,0x69,0xff,0xbe,0x00,0xec,0x00,0x6a,0xff,0xbe,0x00,0xec,0x00,0x6b,0xff,0xbe,0x00,0xec,0x00,0x6c,0xff,0xbe,0x00,0xec,0x00,0x6d,0xff,0xbe,0x00,0xec,0x00,0x6e,0xff,0xbe,0x00,0xec,0x00,0x6f,0xff,0xb4,0x00,0xec,0x00,0x70,0xff,0xb4,0x00,0xec,0x00,0x71,0xff,0xb4,0x00,0xec,0x00,0x72,\r\n0xff,0xb4,0x00,0xec,0x00,0x73,0xff,0xb4,0x00,0xec,0x00,0x79,0xff,0xb4,0x00,0xec,0x00,0x7a,0xff,0xb4,0x00,0xec,0x00,0x7b,0xff,0xb4,0x00,0xec,0x00,0x7c,0xff,0xb4,0x00,0xec,0x00,0x7d,0xff,0xb4,0x00,0xec,0x00,0x91,0xfe,0xe9,0x00,0xec,0x00,0xa0,0xff,0xbe,0x00,0xec,0x00,0xac,0xfe,0xba,0x00,0xec,0x00,0xad,0xff,0x62,0x00,0xec,\r\n0x00,0xae,0xff,0x62,0x00,0xec,0x00,0xb1,0xff,0xb4,0x00,0xec,0x00,0xc4,0xfe,0xba,0x00,0xec,0x00,0xc5,0xfe,0xae,0x00,0xec,0x00,0xc7,0xff,0x62,0x00,0xec,0x00,0xc9,0xff,0x62,0x00,0xec,0x00,0xf7,0xff,0xf6,0x00,0xec,0x00,0xf8,0xff,0xb4,0x00,0xec,0x00,0xfd,0xff,0xb4,0x00,0xec,0x00,0xff,0xff,0xb4,0x00,0xec,0x01,0x00,0xff,0xb4,\r\n0x00,0xec,0x01,0x03,0xff,0x62,0x00,0xec,0x01,0x04,0xff,0xbe,0x00,0xec,0x01,0x05,0xff,0x62,0x00,0xec,0x01,0x06,0xff,0xbe,0x00,0xec,0x01,0x08,0xff,0xb4,0x00,0xec,0x01,0x0b,0xff,0xb4,0x00,0xec,0x01,0x0d,0xff,0xb4,0x00,0xec,0x01,0x19,0xff,0xb4,0x00,0xec,0x01,0x45,0xff,0x62,0x00,0xec,0x01,0x46,0xff,0xbe,0x00,0xec,0x01,0x48,\r\n0xff,0xb4,0x00,0xec,0x01,0x4c,0xff,0xb4,0x00,0xec,0x01,0x4e,0xff,0xb4,0x00,0xec,0x01,0x50,0xff,0xb4,0x00,0xec,0x01,0x51,0xff,0xf6,0x00,0xec,0x01,0x52,0xff,0xb4,0x00,0xec,0x01,0x53,0xff,0xf6,0x00,0xec,0x01,0x54,0xff,0xb4,0x00,0xec,0x01,0x55,0xff,0xf6,0x00,0xec,0x01,0x56,0xff,0xb4,0x00,0xec,0x01,0x63,0xff,0x7f,0x00,0xec,\r\n0x01,0x6f,0xff,0xb4,0x00,0xec,0x01,0x71,0xff,0xb4,0x00,0xec,0x01,0x80,0x00,0x27,0x00,0xec,0x01,0x85,0xff,0x62,0x00,0xec,0x01,0x86,0xff,0xbe,0x00,0xec,0x01,0x87,0xff,0x62,0x00,0xec,0x01,0x88,0xff,0xbe,0x00,0xec,0x01,0x8a,0xff,0xb4,0x00,0xec,0x01,0x8c,0x00,0x27,0x00,0xec,0x01,0x8e,0x00,0x27,0x00,0xec,0x01,0x90,0x00,0x27,\r\n0x00,0xed,0x00,0x44,0xff,0xe5,0x00,0xed,0x00,0x49,0xff,0xf6,0x00,0xed,0x00,0x5b,0xff,0xe7,0x00,0xed,0x00,0x69,0xff,0xe5,0x00,0xed,0x00,0x6a,0xff,0xe5,0x00,0xed,0x00,0x6b,0xff,0xe5,0x00,0xed,0x00,0x6c,0xff,0xe5,0x00,0xed,0x00,0x6d,0xff,0xe5,0x00,0xed,0x00,0x6e,0xff,0xe5,0x00,0xed,0x00,0xa0,0xff,0xe5,0x00,0xed,0x00,0xc0,\r\n0xff,0xf6,0x00,0xed,0x00,0xc1,0xff,0xf6,0x00,0xed,0x01,0x04,0xff,0xe5,0x00,0xed,0x01,0x06,0xff,0xe5,0x00,0xed,0x01,0x46,0xff,0xe5,0x00,0xed,0x01,0x86,0xff,0xe5,0x00,0xed,0x01,0x88,0xff,0xe5,0x00,0xf7,0x00,0x37,0xff,0xcf,0x00,0xf7,0x00,0x39,0xff,0xe5,0x00,0xf7,0x00,0x5c,0xff,0xe5,0x00,0xf7,0x00,0xba,0xff,0xe5,0x00,0xf7,\r\n0x00,0xeb,0xff,0xe5,0x00,0xf7,0x01,0x20,0xff,0xcf,0x00,0xf7,0x01,0x22,0xff,0xcf,0x00,0xf7,0x01,0x76,0xff,0xcf,0x00,0xf7,0x01,0x83,0xff,0xe5,0x00,0xf7,0x01,0x93,0xff,0xe5,0x00,0xf8,0x00,0x4d,0x00,0x2f,0x00,0xf8,0x01,0x64,0x00,0x2f,0x00,0xfa,0x00,0x57,0xff,0xbe,0x00,0xfa,0x00,0x59,0xff,0xcf,0x00,0xfa,0x00,0x5a,0xff,0xe5,\r\n0x00,0xfa,0x00,0x5c,0xff,0xd1,0x00,0xfa,0x00,0xba,0xff,0xbe,0x00,0xfa,0x00,0xc4,0xff,0xb2,0x00,0xfa,0x00,0xc5,0xff,0xb2,0x00,0xfa,0x00,0xeb,0xff,0xd1,0x00,0xfa,0x01,0x21,0xff,0xbe,0x00,0xfa,0x01,0x23,0xff,0xbe,0x00,0xfa,0x01,0x77,0xff,0xbe,0x00,0xfa,0x01,0x81,0xff,0xe5,0x00,0xfa,0x01,0x83,0xff,0xd1,0x00,0xfa,0x01,0x8d,\r\n0xff,0xe5,0x00,0xfa,0x01,0x8f,0xff,0xe5,0x00,0xfa,0x01,0x91,0xff,0xe5,0x00,0xfa,0x01,0x93,0xff,0xd1,0x00,0xfc,0x00,0x26,0xff,0xc9,0x00,0xfc,0x00,0x2a,0xff,0xc9,0x00,0xfc,0x00,0x32,0xff,0xe5,0x00,0xfc,0x00,0x34,0xff,0xc9,0x00,0xfc,0x00,0x64,0xff,0xc9,0x00,0xfc,0x00,0x67,0xff,0xc9,0x00,0xfc,0x00,0x77,0x00,0x1d,0x00,0xfc,\r\n0x00,0x92,0xff,0xc9,0x00,0xfc,0x00,0xaa,0xff,0xcf,0x00,0xfc,0x00,0xaf,0xff,0xc9,0x00,0xfc,0x00,0xb0,0xff,0xc9,0x00,0xfc,0x00,0xbe,0xff,0xcf,0x00,0xfc,0x00,0xd0,0xff,0xc9,0x00,0xfc,0x00,0xd1,0xff,0xc9,0x00,0xfc,0x00,0xd2,0xff,0xc9,0x00,0xfc,0x00,0xf7,0xff,0xc9,0x00,0xfc,0x00,0xfc,0xff,0xc9,0x00,0xfc,0x00,0xfe,0xff,0xc9,\r\n0x00,0xfc,0x01,0x18,0xff,0xe5,0x00,0xfc,0x01,0x47,0xff,0xc9,0x00,0xfc,0x01,0x51,0xff,0xc9,0x00,0xfc,0x01,0x53,0xff,0xc9,0x00,0xfc,0x01,0x55,0xff,0xc9,0x00,0xfc,0x01,0x5c,0x00,0x1d,0x00,0xfc,0x01,0x5e,0x00,0x1d,0x00,0xfc,0x01,0x60,0x00,0x1d,0x00,0xfc,0x01,0x6e,0xff,0xe5,0x00,0xfc,0x01,0x70,0xff,0xe5,0x00,0xfc,0x01,0x89,\r\n0xff,0xe5,0x00,0xfd,0x00,0x2d,0x00,0x46,0x00,0xfd,0x00,0x37,0xff,0x9a,0x00,0xfd,0x00,0x3c,0xff,0xb4,0x00,0xfd,0x00,0xea,0xff,0xb4,0x00,0xfd,0x01,0x20,0xff,0x9a,0x00,0xfd,0x01,0x22,0xff,0x9a,0x00,0xfd,0x01,0x63,0x00,0x46,0x00,0xfd,0x01,0x76,0xff,0x9a,0x00,0xfd,0x01,0x82,0xff,0xb4,0x00,0xfd,0x01,0x92,0xff,0xb4,0x00,0xfe,\r\n0x00,0x26,0xff,0xc9,0x00,0xfe,0x00,0x2a,0xff,0xc9,0x00,0xfe,0x00,0x32,0xff,0xe5,0x00,0xfe,0x00,0x34,0xff,0xc9,0x00,0xfe,0x00,0x64,0xff,0xc9,0x00,0xfe,0x00,0x67,0xff,0xc9,0x00,0xfe,0x00,0x77,0x00,0x1d,0x00,0xfe,0x00,0x92,0xff,0xc9,0x00,0xfe,0x00,0xaa,0xff,0xcf,0x00,0xfe,0x00,0xaf,0xff,0xc9,0x00,0xfe,0x00,0xb0,0xff,0xc9,\r\n0x00,0xfe,0x00,0xbe,0xff,0xcf,0x00,0xfe,0x00,0xd0,0xff,0xc9,0x00,0xfe,0x00,0xd1,0xff,0xc9,0x00,0xfe,0x00,0xd2,0xff,0xc9,0x00,0xfe,0x00,0xf7,0xff,0xc9,0x00,0xfe,0x00,0xfc,0xff,0xc9,0x00,0xfe,0x00,0xfe,0xff,0xc9,0x00,0xfe,0x01,0x18,0xff,0xe5,0x00,0xfe,0x01,0x47,0xff,0xc9,0x00,0xfe,0x01,0x51,0xff,0xc9,0x00,0xfe,0x01,0x53,\r\n0xff,0xc9,0x00,0xfe,0x01,0x55,0xff,0xc9,0x00,0xfe,0x01,0x5c,0x00,0x1d,0x00,0xfe,0x01,0x5e,0x00,0x1d,0x00,0xfe,0x01,0x60,0x00,0x1d,0x00,0xfe,0x01,0x6e,0xff,0xe5,0x00,0xfe,0x01,0x70,0xff,0xe5,0x00,0xfe,0x01,0x89,0xff,0xe5,0x00,0xff,0x00,0x2d,0x00,0x46,0x00,0xff,0x00,0x37,0xff,0x9a,0x00,0xff,0x00,0x3c,0xff,0xb4,0x00,0xff,\r\n0x00,0xea,0xff,0xb4,0x00,0xff,0x01,0x20,0xff,0x9a,0x00,0xff,0x01,0x22,0xff,0x9a,0x00,0xff,0x01,0x63,0x00,0x46,0x00,0xff,0x01,0x76,0xff,0x9a,0x00,0xff,0x01,0x82,0xff,0xb4,0x00,0xff,0x01,0x92,0xff,0xb4,0x01,0x03,0x00,0x0d,0xff,0x7f,0x01,0x03,0x00,0x0f,0x00,0x44,0x01,0x03,0x00,0x1e,0x00,0x44,0x01,0x03,0x00,0x26,0xff,0xe5,\r\n0x01,0x03,0x00,0x2a,0xff,0xe5,0x01,0x03,0x00,0x2d,0x00,0x5e,0x01,0x03,0x00,0x32,0xff,0xe5,0x01,0x03,0x00,0x37,0xff,0x6d,0x01,0x03,0x00,0x38,0xff,0xe5,0x01,0x03,0x00,0x39,0xff,0x8b,0x01,0x03,0x00,0x3a,0xff,0xb6,0x01,0x03,0x00,0x3c,0xff,0x64,0x01,0x03,0x00,0x3d,0x00,0x3b,0x01,0x03,0x00,0x57,0xff,0xe5,0x01,0x03,0x00,0x59,\r\n0xff,0xd5,0x01,0x03,0x00,0x5a,0xff,0xe5,0x01,0x03,0x00,0x5c,0xff,0xdb,0x01,0x03,0x00,0x8d,0xff,0x9a,0x01,0x03,0x00,0xb4,0xff,0x66,0x01,0x03,0x00,0xb5,0xff,0x3f,0x01,0x03,0x00,0xb6,0xff,0x66,0x01,0x03,0x00,0xb7,0xff,0x3f,0x01,0x03,0x00,0xba,0xff,0xc1,0x01,0x03,0x00,0xbb,0xff,0x64,0x01,0x03,0x00,0xe5,0x00,0x3b,0x01,0x03,\r\n0x00,0xea,0xff,0x64,0x01,0x03,0x00,0xeb,0xff,0xdb,0x01,0x03,0x00,0xf7,0xff,0xe5,0x01,0x03,0x00,0xfc,0xff,0xe5,0x01,0x03,0x00,0xfe,0xff,0xe5,0x01,0x03,0x01,0x18,0xff,0xe5,0x01,0x03,0x01,0x20,0xff,0x6d,0x01,0x03,0x01,0x21,0xff,0xe5,0x01,0x03,0x01,0x22,0xff,0x6d,0x01,0x03,0x01,0x23,0xff,0xe5,0x01,0x03,0x01,0x24,0xff,0xe5,\r\n0x01,0x03,0x01,0x26,0xff,0xe5,0x01,0x03,0x01,0x28,0x00,0x3b,0x01,0x03,0x01,0x2a,0x00,0x3b,0x01,0x03,0x01,0x47,0xff,0xe5,0x01,0x03,0x01,0x51,0xff,0xe5,0x01,0x03,0x01,0x53,0xff,0xe5,0x01,0x03,0x01,0x55,0xff,0xe5,0x01,0x03,0x01,0x63,0x00,0x5e,0x01,0x03,0x01,0x6e,0xff,0xe5,0x01,0x03,0x01,0x70,0xff,0xe5,0x01,0x03,0x01,0x76,\r\n0xff,0x6d,0x01,0x03,0x01,0x77,0xff,0xe5,0x01,0x03,0x01,0x78,0xff,0xe5,0x01,0x03,0x01,0x7a,0xff,0xe5,0x01,0x03,0x01,0x7c,0xff,0xe5,0x01,0x03,0x01,0x7e,0xff,0xe5,0x01,0x03,0x01,0x80,0xff,0xb6,0x01,0x03,0x01,0x81,0xff,0xe5,0x01,0x03,0x01,0x82,0xff,0x64,0x01,0x03,0x01,0x83,0xff,0xdb,0x01,0x03,0x01,0x89,0xff,0xe5,0x01,0x03,\r\n0x01,0x8c,0xff,0xb6,0x01,0x03,0x01,0x8d,0xff,0xe5,0x01,0x03,0x01,0x8e,0xff,0xb6,0x01,0x03,0x01,0x8f,0xff,0xe5,0x01,0x03,0x01,0x90,0xff,0xb6,0x01,0x03,0x01,0x91,0xff,0xe5,0x01,0x03,0x01,0x92,0xff,0x64,0x01,0x03,0x01,0x93,0xff,0xdb,0x01,0x05,0x00,0x0d,0xff,0x7f,0x01,0x05,0x00,0x0f,0x00,0x44,0x01,0x05,0x00,0x1e,0x00,0x44,\r\n0x01,0x05,0x00,0x26,0xff,0xe5,0x01,0x05,0x00,0x2a,0xff,0xe5,0x01,0x05,0x00,0x2d,0x00,0x5e,0x01,0x05,0x00,0x32,0xff,0xe5,0x01,0x05,0x00,0x37,0xff,0x6d,0x01,0x05,0x00,0x38,0xff,0xe5,0x01,0x05,0x00,0x39,0xff,0x8b,0x01,0x05,0x00,0x3a,0xff,0xb6,0x01,0x05,0x00,0x3c,0xff,0x64,0x01,0x05,0x00,0x3d,0x00,0x3b,0x01,0x05,0x00,0x57,\r\n0xff,0xe5,0x01,0x05,0x00,0x59,0xff,0xd5,0x01,0x05,0x00,0x5a,0xff,0xe5,0x01,0x05,0x00,0x5c,0xff,0xdb,0x01,0x05,0x00,0x8d,0xff,0x9a,0x01,0x05,0x00,0xb4,0xff,0x66,0x01,0x05,0x00,0xb5,0xff,0x3f,0x01,0x05,0x00,0xb6,0xff,0x66,0x01,0x05,0x00,0xb7,0xff,0x3f,0x01,0x05,0x00,0xba,0xff,0xc1,0x01,0x05,0x00,0xbb,0xff,0x64,0x01,0x05,\r\n0x00,0xe5,0x00,0x3b,0x01,0x05,0x00,0xea,0xff,0x64,0x01,0x05,0x00,0xeb,0xff,0xdb,0x01,0x05,0x00,0xf7,0xff,0xe5,0x01,0x05,0x00,0xfc,0xff,0xe5,0x01,0x05,0x00,0xfe,0xff,0xe5,0x01,0x05,0x01,0x18,0xff,0xe5,0x01,0x05,0x01,0x20,0xff,0x6d,0x01,0x05,0x01,0x21,0xff,0xe5,0x01,0x05,0x01,0x22,0xff,0x6d,0x01,0x05,0x01,0x23,0xff,0xe5,\r\n0x01,0x05,0x01,0x24,0xff,0xe5,0x01,0x05,0x01,0x26,0xff,0xe5,0x01,0x05,0x01,0x28,0x00,0x3b,0x01,0x05,0x01,0x2a,0x00,0x3b,0x01,0x05,0x01,0x47,0xff,0xe5,0x01,0x05,0x01,0x51,0xff,0xe5,0x01,0x05,0x01,0x53,0xff,0xe5,0x01,0x05,0x01,0x55,0xff,0xe5,0x01,0x05,0x01,0x63,0x00,0x5e,0x01,0x05,0x01,0x6e,0xff,0xe5,0x01,0x05,0x01,0x70,\r\n0xff,0xe5,0x01,0x05,0x01,0x76,0xff,0x6d,0x01,0x05,0x01,0x77,0xff,0xe5,0x01,0x05,0x01,0x78,0xff,0xe5,0x01,0x05,0x01,0x7a,0xff,0xe5,0x01,0x05,0x01,0x7c,0xff,0xe5,0x01,0x05,0x01,0x7e,0xff,0xe5,0x01,0x05,0x01,0x80,0xff,0xb6,0x01,0x05,0x01,0x81,0xff,0xe5,0x01,0x05,0x01,0x82,0xff,0x64,0x01,0x05,0x01,0x83,0xff,0xdb,0x01,0x05,\r\n0x01,0x89,0xff,0xe5,0x01,0x05,0x01,0x8c,0xff,0xb6,0x01,0x05,0x01,0x8d,0xff,0xe5,0x01,0x05,0x01,0x8e,0xff,0xb6,0x01,0x05,0x01,0x8f,0xff,0xe5,0x01,0x05,0x01,0x90,0xff,0xb6,0x01,0x05,0x01,0x91,0xff,0xe5,0x01,0x05,0x01,0x92,0xff,0x64,0x01,0x05,0x01,0x93,0xff,0xdb,0x01,0x07,0x00,0x0f,0xff,0x7f,0x01,0x07,0x00,0x11,0xff,0x7f,\r\n0x01,0x07,0x00,0x24,0xff,0xdf,0x01,0x07,0x00,0x37,0xff,0xa4,0x01,0x07,0x00,0x3b,0xff,0xcb,0x01,0x07,0x00,0x3d,0xff,0xcf,0x01,0x07,0x00,0x62,0xff,0xdf,0x01,0x07,0x00,0x63,0xff,0xdf,0x01,0x07,0x00,0x91,0xff,0xb6,0x01,0x07,0x00,0xac,0xff,0x7f,0x01,0x07,0x00,0xad,0xff,0xdf,0x01,0x07,0x00,0xae,0xff,0xdf,0x01,0x07,0x00,0xbb,\r\n0xff,0xf6,0x01,0x07,0x00,0xc4,0xff,0x8b,0x01,0x07,0x00,0xc5,0xff,0x8b,0x01,0x07,0x00,0xc7,0xff,0xdf,0x01,0x07,0x00,0xc9,0xff,0xdf,0x01,0x07,0x00,0xe5,0xff,0xcf,0x01,0x07,0x01,0x03,0xff,0xdf,0x01,0x07,0x01,0x05,0xff,0xdf,0x01,0x07,0x01,0x20,0xff,0xa4,0x01,0x07,0x01,0x22,0xff,0xa4,0x01,0x07,0x01,0x28,0xff,0xcf,0x01,0x07,\r\n0x01,0x2a,0xff,0xcf,0x01,0x07,0x01,0x45,0xff,0xdf,0x01,0x07,0x01,0x76,0xff,0xa4,0x01,0x07,0x01,0x85,0xff,0xdf,0x01,0x07,0x01,0x87,0xff,0xdf,0x01,0x0a,0x00,0x24,0x00,0x0a,0x01,0x0a,0x00,0x2d,0x00,0x44,0x01,0x0a,0x00,0x37,0x00,0x04,0x01,0x0a,0x00,0x3a,0x00,0x1d,0x01,0x0a,0x00,0x3b,0x00,0x08,0x01,0x0a,0x00,0x62,0x00,0x0a,\r\n0x01,0x0a,0x00,0x63,0x00,0x0a,0x01,0x0a,0x00,0x77,0x00,0x12,0x01,0x0a,0x00,0xad,0x00,0x0a,0x01,0x0a,0x00,0xae,0x00,0x0a,0x01,0x0a,0x00,0xc7,0x00,0x0a,0x01,0x0a,0x00,0xc9,0x00,0x0a,0x01,0x0a,0x01,0x03,0x00,0x0a,0x01,0x0a,0x01,0x05,0x00,0x0a,0x01,0x0a,0x01,0x20,0x00,0x04,0x01,0x0a,0x01,0x22,0x00,0x04,0x01,0x0a,0x01,0x45,\r\n0x00,0x0a,0x01,0x0a,0x01,0x5c,0x00,0x12,0x01,0x0a,0x01,0x5e,0x00,0x12,0x01,0x0a,0x01,0x60,0x00,0x12,0x01,0x0a,0x01,0x63,0x00,0x44,0x01,0x0a,0x01,0x76,0x00,0x04,0x01,0x0a,0x01,0x80,0x00,0x1d,0x01,0x0a,0x01,0x85,0x00,0x0a,0x01,0x0a,0x01,0x87,0x00,0x0a,0x01,0x0a,0x01,0x8c,0x00,0x1d,0x01,0x0a,0x01,0x8e,0x00,0x1d,0x01,0x0a,\r\n0x01,0x90,0x00,0x1d,0x01,0x0b,0x00,0x05,0xff,0x98,0x01,0x0b,0x00,0x0a,0xff,0x98,0x01,0x0c,0x00,0x24,0x00,0x0a,0x01,0x0c,0x00,0x2d,0x00,0x44,0x01,0x0c,0x00,0x37,0x00,0x04,0x01,0x0c,0x00,0x3a,0x00,0x1d,0x01,0x0c,0x00,0x3b,0x00,0x08,0x01,0x0c,0x00,0x62,0x00,0x0a,0x01,0x0c,0x00,0x63,0x00,0x0a,0x01,0x0c,0x00,0x77,0x00,0x12,\r\n0x01,0x0c,0x00,0xad,0x00,0x0a,0x01,0x0c,0x00,0xae,0x00,0x0a,0x01,0x0c,0x00,0xc7,0x00,0x0a,0x01,0x0c,0x00,0xc9,0x00,0x0a,0x01,0x0c,0x01,0x03,0x00,0x0a,0x01,0x0c,0x01,0x05,0x00,0x0a,0x01,0x0c,0x01,0x20,0x00,0x04,0x01,0x0c,0x01,0x22,0x00,0x04,0x01,0x0c,0x01,0x45,0x00,0x0a,0x01,0x0c,0x01,0x5c,0x00,0x12,0x01,0x0c,0x01,0x5e,\r\n0x00,0x12,0x01,0x0c,0x01,0x60,0x00,0x12,0x01,0x0c,0x01,0x63,0x00,0x44,0x01,0x0c,0x01,0x76,0x00,0x04,0x01,0x0c,0x01,0x80,0x00,0x1d,0x01,0x0c,0x01,0x85,0x00,0x0a,0x01,0x0c,0x01,0x87,0x00,0x0a,0x01,0x0c,0x01,0x8c,0x00,0x1d,0x01,0x0c,0x01,0x8e,0x00,0x1d,0x01,0x0c,0x01,0x90,0x00,0x1d,0x01,0x0d,0x00,0x05,0xff,0x98,0x01,0x0d,\r\n0x00,0x0a,0xff,0x98,0x01,0x0e,0x00,0x0d,0xff,0x31,0x01,0x0e,0x00,0x22,0xff,0x9a,0x01,0x0e,0x00,0x24,0x00,0x3b,0x01,0x0e,0x00,0x26,0xff,0xbe,0x01,0x0e,0x00,0x2a,0xff,0xbe,0x01,0x0e,0x00,0x2d,0x00,0x64,0x01,0x0e,0x00,0x32,0xff,0xba,0x01,0x0e,0x00,0x34,0xff,0xba,0x01,0x0e,0x00,0x37,0xff,0x8f,0x01,0x0e,0x00,0x38,0xff,0xe3,\r\n0x01,0x0e,0x00,0x39,0xff,0x8b,0x01,0x0e,0x00,0x3a,0xff,0xcf,0x01,0x0e,0x00,0x3c,0xff,0x7f,0x01,0x0e,0x00,0x3d,0x00,0x3b,0x01,0x0e,0x00,0x57,0xff,0xe5,0x01,0x0e,0x00,0x59,0xff,0x9a,0x01,0x0e,0x00,0x5a,0xff,0xbe,0x01,0x0e,0x00,0x5c,0xff,0xb4,0x01,0x0e,0x00,0x64,0xff,0xbe,0x01,0x0e,0x00,0x67,0xff,0xba,0x01,0x0e,0x00,0x68,\r\n0xff,0xe3,0x01,0x0e,0x00,0x8d,0xff,0x9a,0x01,0x0e,0x00,0x92,0xff,0xba,0x01,0x0e,0x00,0xaf,0xff,0xba,0x01,0x0e,0x00,0xb0,0xff,0xba,0x01,0x0e,0x00,0xb4,0xff,0x73,0x01,0x0e,0x00,0xb5,0xff,0x8b,0x01,0x0e,0x00,0xb6,0xff,0x73,0x01,0x0e,0x00,0xb7,0xff,0x7f,0x01,0x0e,0x00,0xba,0xff,0xb4,0x01,0x0e,0x00,0xbb,0xff,0x9a,0x01,0x0e,\r\n0x00,0xc4,0x00,0x44,0x01,0x0e,0x00,0xc5,0x00,0x44,0x01,0x0e,0x00,0xd0,0xff,0xba,0x01,0x0e,0x00,0xd1,0xff,0xba,0x01,0x0e,0x00,0xd2,0xff,0xba,0x01,0x0e,0x00,0xd3,0xff,0xe3,0x01,0x0e,0x00,0xd4,0xff,0xe3,0x01,0x0e,0x00,0xd5,0xff,0xe3,0x01,0x0e,0x00,0xe5,0x00,0x3b,0x01,0x0e,0x00,0xea,0xff,0x7f,0x01,0x0e,0x00,0xeb,0xff,0xb4,\r\n0x01,0x0e,0x00,0xf7,0xff,0xbe,0x01,0x0e,0x00,0xfc,0xff,0xbe,0x01,0x0e,0x00,0xfe,0xff,0xbe,0x01,0x0e,0x01,0x03,0x00,0x3b,0x01,0x0e,0x01,0x05,0x00,0x3b,0x01,0x0e,0x01,0x18,0xff,0xba,0x01,0x0e,0x01,0x20,0xff,0x8f,0x01,0x0e,0x01,0x21,0xff,0xe5,0x01,0x0e,0x01,0x22,0xff,0x8f,0x01,0x0e,0x01,0x23,0xff,0xe5,0x01,0x0e,0x01,0x24,\r\n0xff,0xe3,0x01,0x0e,0x01,0x26,0xff,0xe3,0x01,0x0e,0x01,0x28,0x00,0x3b,0x01,0x0e,0x01,0x2a,0x00,0x3b,0x01,0x0e,0x01,0x45,0x00,0x3b,0x01,0x0e,0x01,0x47,0xff,0xbe,0x01,0x0e,0x01,0x51,0xff,0xbe,0x01,0x0e,0x01,0x53,0xff,0xbe,0x01,0x0e,0x01,0x55,0xff,0xbe,0x01,0x0e,0x01,0x63,0x00,0x64,0x01,0x0e,0x01,0x6e,0xff,0xba,0x01,0x0e,\r\n0x01,0x70,0xff,0xba,0x01,0x0e,0x01,0x76,0xff,0x8f,0x01,0x0e,0x01,0x77,0xff,0xe5,0x01,0x0e,0x01,0x78,0xff,0xe3,0x01,0x0e,0x01,0x7a,0xff,0xe3,0x01,0x0e,0x01,0x7c,0xff,0xe3,0x01,0x0e,0x01,0x7e,0xff,0xe3,0x01,0x0e,0x01,0x80,0xff,0xcf,0x01,0x0e,0x01,0x81,0xff,0xbe,0x01,0x0e,0x01,0x82,0xff,0x7f,0x01,0x0e,0x01,0x83,0xff,0xb4,\r\n0x01,0x0e,0x01,0x85,0x00,0x3b,0x01,0x0e,0x01,0x87,0x00,0x3b,0x01,0x0e,0x01,0x89,0xff,0xba,0x01,0x0e,0x01,0x8c,0xff,0xcf,0x01,0x0e,0x01,0x8d,0xff,0xbe,0x01,0x0e,0x01,0x8e,0xff,0xcf,0x01,0x0e,0x01,0x8f,0xff,0xbe,0x01,0x0e,0x01,0x90,0xff,0xcf,0x01,0x0e,0x01,0x91,0xff,0xbe,0x01,0x0e,0x01,0x92,0xff,0x7f,0x01,0x0e,0x01,0x93,\r\n0xff,0xb4,0x01,0x10,0x00,0x0d,0xff,0x31,0x01,0x10,0x00,0x22,0xff,0x9a,0x01,0x10,0x00,0x24,0x00,0x3b,0x01,0x10,0x00,0x26,0xff,0xbe,0x01,0x10,0x00,0x2a,0xff,0xbe,0x01,0x10,0x00,0x2d,0x00,0x64,0x01,0x10,0x00,0x32,0xff,0xba,0x01,0x10,0x00,0x34,0xff,0xba,0x01,0x10,0x00,0x37,0xff,0x8f,0x01,0x10,0x00,0x38,0xff,0xe3,0x01,0x10,\r\n0x00,0x39,0xff,0x8b,0x01,0x10,0x00,0x3a,0xff,0xcf,0x01,0x10,0x00,0x3c,0xff,0x7f,0x01,0x10,0x00,0x3d,0x00,0x3b,0x01,0x10,0x00,0x57,0xff,0xe5,0x01,0x10,0x00,0x59,0xff,0x9a,0x01,0x10,0x00,0x5a,0xff,0xbe,0x01,0x10,0x00,0x5c,0xff,0xb4,0x01,0x10,0x00,0x64,0xff,0xbe,0x01,0x10,0x00,0x67,0xff,0xba,0x01,0x10,0x00,0x68,0xff,0xe3,\r\n0x01,0x10,0x00,0x8d,0xff,0x9a,0x01,0x10,0x00,0x92,0xff,0xba,0x01,0x10,0x00,0xaf,0xff,0xba,0x01,0x10,0x00,0xb0,0xff,0xba,0x01,0x10,0x00,0xb4,0xff,0x73,0x01,0x10,0x00,0xb5,0xff,0x8b,0x01,0x10,0x00,0xb6,0xff,0x73,0x01,0x10,0x00,0xb7,0xff,0x7f,0x01,0x10,0x00,0xba,0xff,0xb4,0x01,0x10,0x00,0xbb,0xff,0x9a,0x01,0x10,0x00,0xc4,\r\n0x00,0x44,0x01,0x10,0x00,0xc5,0x00,0x44,0x01,0x10,0x00,0xd0,0xff,0xba,0x01,0x10,0x00,0xd1,0xff,0xba,0x01,0x10,0x00,0xd2,0xff,0xba,0x01,0x10,0x00,0xd3,0xff,0xe3,0x01,0x10,0x00,0xd4,0xff,0xe3,0x01,0x10,0x00,0xd5,0xff,0xe3,0x01,0x10,0x00,0xe5,0x00,0x3b,0x01,0x10,0x00,0xea,0xff,0x7f,0x01,0x10,0x00,0xeb,0xff,0xb4,0x01,0x10,\r\n0x00,0xf7,0xff,0xbe,0x01,0x10,0x00,0xfc,0xff,0xbe,0x01,0x10,0x00,0xfe,0xff,0xbe,0x01,0x10,0x01,0x03,0x00,0x3b,0x01,0x10,0x01,0x05,0x00,0x3b,0x01,0x10,0x01,0x20,0xff,0x8f,0x01,0x10,0x01,0x21,0xff,0xe5,0x01,0x10,0x01,0x22,0xff,0x8f,0x01,0x10,0x01,0x23,0xff,0xe5,0x01,0x10,0x01,0x24,0xff,0xe3,0x01,0x10,0x01,0x26,0xff,0xe3,\r\n0x01,0x10,0x01,0x28,0x00,0x3b,0x01,0x10,0x01,0x2a,0x00,0x3b,0x01,0x10,0x01,0x45,0x00,0x3b,0x01,0x10,0x01,0x47,0xff,0xbe,0x01,0x10,0x01,0x51,0xff,0xbe,0x01,0x10,0x01,0x53,0xff,0xbe,0x01,0x10,0x01,0x55,0xff,0xbe,0x01,0x10,0x01,0x63,0x00,0x64,0x01,0x10,0x01,0x6e,0xff,0xba,0x01,0x10,0x01,0x70,0xff,0xba,0x01,0x10,0x01,0x76,\r\n0xff,0x8f,0x01,0x10,0x01,0x77,0xff,0xe5,0x01,0x10,0x01,0x78,0xff,0xe3,0x01,0x10,0x01,0x7a,0xff,0xe3,0x01,0x10,0x01,0x7c,0xff,0xe3,0x01,0x10,0x01,0x7e,0xff,0xe3,0x01,0x10,0x01,0x80,0xff,0xcf,0x01,0x10,0x01,0x81,0xff,0xbe,0x01,0x10,0x01,0x82,0xff,0x7f,0x01,0x10,0x01,0x83,0xff,0xb4,0x01,0x10,0x01,0x85,0x00,0x3b,0x01,0x10,\r\n0x01,0x87,0x00,0x3b,0x01,0x10,0x01,0x89,0xff,0xba,0x01,0x10,0x01,0x8c,0xff,0xcf,0x01,0x10,0x01,0x8d,0xff,0xbe,0x01,0x10,0x01,0x8e,0xff,0xcf,0x01,0x10,0x01,0x8f,0xff,0xbe,0x01,0x10,0x01,0x90,0xff,0xcf,0x01,0x10,0x01,0x91,0xff,0xbe,0x01,0x10,0x01,0x92,0xff,0x7f,0x01,0x10,0x01,0x93,0xff,0xb4,0x01,0x12,0x00,0x0d,0xff,0x31,\r\n0x01,0x12,0x00,0x22,0xff,0x9a,0x01,0x12,0x00,0x24,0x00,0x3b,0x01,0x12,0x00,0x26,0xff,0xbe,0x01,0x12,0x00,0x2a,0xff,0xbe,0x01,0x12,0x00,0x2d,0x00,0x64,0x01,0x12,0x00,0x32,0xff,0xba,0x01,0x12,0x00,0x34,0xff,0xba,0x01,0x12,0x00,0x37,0xff,0x8f,0x01,0x12,0x00,0x38,0xff,0xe3,0x01,0x12,0x00,0x39,0xff,0x8b,0x01,0x12,0x00,0x3a,\r\n0xff,0xcf,0x01,0x12,0x00,0x3c,0xff,0x7f,0x01,0x12,0x00,0x3d,0x00,0x3b,0x01,0x12,0x00,0x57,0xff,0xe5,0x01,0x12,0x00,0x59,0xff,0x9a,0x01,0x12,0x00,0x5a,0xff,0xbe,0x01,0x12,0x00,0x5c,0xff,0xb4,0x01,0x12,0x00,0x64,0xff,0xbe,0x01,0x12,0x00,0x67,0xff,0xba,0x01,0x12,0x00,0x68,0xff,0xe3,0x01,0x12,0x00,0x8d,0xff,0x9a,0x01,0x12,\r\n0x00,0x92,0xff,0xba,0x01,0x12,0x00,0xaf,0xff,0xba,0x01,0x12,0x00,0xb0,0xff,0xba,0x01,0x12,0x00,0xb4,0xff,0x73,0x01,0x12,0x00,0xb5,0xff,0x8b,0x01,0x12,0x00,0xb6,0xff,0x73,0x01,0x12,0x00,0xb7,0xff,0x7f,0x01,0x12,0x00,0xba,0xff,0xb4,0x01,0x12,0x00,0xbb,0xff,0x9a,0x01,0x12,0x00,0xc4,0x00,0x44,0x01,0x12,0x00,0xc5,0x00,0x44,\r\n0x01,0x12,0x00,0xd0,0xff,0xba,0x01,0x12,0x00,0xd1,0xff,0xba,0x01,0x12,0x00,0xd2,0xff,0xba,0x01,0x12,0x00,0xd3,0xff,0xe3,0x01,0x12,0x00,0xd4,0xff,0xe3,0x01,0x12,0x00,0xd5,0xff,0xe3,0x01,0x12,0x00,0xe5,0x00,0x3b,0x01,0x12,0x00,0xea,0xff,0x7f,0x01,0x12,0x00,0xeb,0xff,0xb4,0x01,0x12,0x00,0xf7,0xff,0xbe,0x01,0x12,0x00,0xfc,\r\n0xff,0xbe,0x01,0x12,0x00,0xfe,0xff,0xbe,0x01,0x12,0x01,0x03,0x00,0x3b,0x01,0x12,0x01,0x05,0x00,0x3b,0x01,0x12,0x01,0x18,0xff,0xba,0x01,0x12,0x01,0x20,0xff,0x8f,0x01,0x12,0x01,0x21,0xff,0xe5,0x01,0x12,0x01,0x22,0xff,0x8f,0x01,0x12,0x01,0x23,0xff,0xe5,0x01,0x12,0x01,0x24,0xff,0xe3,0x01,0x12,0x01,0x26,0xff,0xe3,0x01,0x12,\r\n0x01,0x28,0x00,0x3b,0x01,0x12,0x01,0x2a,0x00,0x3b,0x01,0x12,0x01,0x45,0x00,0x3b,0x01,0x12,0x01,0x47,0xff,0xbe,0x01,0x12,0x01,0x51,0xff,0xbe,0x01,0x12,0x01,0x53,0xff,0xbe,0x01,0x12,0x01,0x55,0xff,0xbe,0x01,0x12,0x01,0x63,0x00,0x64,0x01,0x12,0x01,0x6e,0xff,0xba,0x01,0x12,0x01,0x70,0xff,0xba,0x01,0x12,0x01,0x76,0xff,0x8f,\r\n0x01,0x12,0x01,0x77,0xff,0xe5,0x01,0x12,0x01,0x78,0xff,0xe3,0x01,0x12,0x01,0x7a,0xff,0xe3,0x01,0x12,0x01,0x7c,0xff,0xe3,0x01,0x12,0x01,0x7e,0xff,0xe3,0x01,0x12,0x01,0x80,0xff,0xcf,0x01,0x12,0x01,0x81,0xff,0xbe,0x01,0x12,0x01,0x82,0xff,0x7f,0x01,0x12,0x01,0x83,0xff,0xb4,0x01,0x12,0x01,0x85,0x00,0x3b,0x01,0x12,0x01,0x87,\r\n0x00,0x3b,0x01,0x12,0x01,0x89,0xff,0xba,0x01,0x12,0x01,0x8c,0xff,0xcf,0x01,0x12,0x01,0x8d,0xff,0xbe,0x01,0x12,0x01,0x8e,0xff,0xcf,0x01,0x12,0x01,0x8f,0xff,0xbe,0x01,0x12,0x01,0x90,0xff,0xcf,0x01,0x12,0x01,0x91,0xff,0xbe,0x01,0x12,0x01,0x92,0xff,0x7f,0x01,0x12,0x01,0x93,0xff,0xb4,0x01,0x15,0x00,0x05,0xff,0x98,0x01,0x15,\r\n0x00,0x0a,0xff,0x98,0x01,0x17,0x00,0x05,0xff,0x98,0x01,0x17,0x00,0x0a,0xff,0x98,0x01,0x18,0x00,0x0f,0xff,0xa4,0x01,0x18,0x00,0x11,0xff,0xa4,0x01,0x18,0x00,0x24,0xff,0xe5,0x01,0x18,0x00,0x2d,0xff,0xf6,0x01,0x18,0x00,0x37,0xff,0xa4,0x01,0x18,0x00,0x3b,0xff,0xdb,0x01,0x18,0x00,0x3c,0xff,0xe7,0x01,0x18,0x00,0x3d,0xff,0xcf,\r\n0x01,0x18,0x00,0x62,0xff,0xe5,0x01,0x18,0x00,0x63,0xff,0xe5,0x01,0x18,0x00,0xac,0xff,0xa4,0x01,0x18,0x00,0xad,0xff,0xe5,0x01,0x18,0x00,0xae,0xff,0xe5,0x01,0x18,0x00,0xbb,0xff,0xf6,0x01,0x18,0x00,0xc4,0xff,0x4c,0x01,0x18,0x00,0xc5,0xff,0x98,0x01,0x18,0x00,0xc7,0xff,0xe5,0x01,0x18,0x00,0xc9,0xff,0xe5,0x01,0x18,0x00,0xe5,\r\n0xff,0xcf,0x01,0x18,0x00,0xea,0xff,0xe7,0x01,0x18,0x01,0x03,0xff,0xe5,0x01,0x18,0x01,0x05,0xff,0xe5,0x01,0x18,0x01,0x20,0xff,0xa4,0x01,0x18,0x01,0x22,0xff,0xa4,0x01,0x18,0x01,0x28,0xff,0xcf,0x01,0x18,0x01,0x2a,0xff,0xcf,0x01,0x18,0x01,0x45,0xff,0xe5,0x01,0x18,0x01,0x63,0xff,0xf6,0x01,0x18,0x01,0x76,0xff,0xa4,0x01,0x18,\r\n0x01,0x82,0xff,0xe7,0x01,0x18,0x01,0x85,0xff,0xe5,0x01,0x18,0x01,0x87,0xff,0xe5,0x01,0x18,0x01,0x92,0xff,0xe7,0x01,0x19,0x00,0x05,0xff,0x6f,0x01,0x19,0x00,0x0a,0xff,0x6f,0x01,0x19,0x00,0x44,0xff,0xe5,0x01,0x19,0x00,0x49,0xff,0xdb,0x01,0x19,0x00,0x5b,0xff,0xe7,0x01,0x19,0x00,0x69,0xff,0xe5,0x01,0x19,0x00,0x6a,0xff,0xe5,\r\n0x01,0x19,0x00,0x6b,0xff,0xe5,0x01,0x19,0x00,0x6c,0xff,0xe5,0x01,0x19,0x00,0x6d,0xff,0xe5,0x01,0x19,0x00,0x6e,0xff,0xe5,0x01,0x19,0x00,0xa0,0xff,0xe5,0x01,0x19,0x00,0xb4,0xff,0xb2,0x01,0x19,0x00,0xb5,0xff,0x7d,0x01,0x19,0x00,0xb6,0xff,0xbe,0x01,0x19,0x00,0xb7,0xff,0x7d,0x01,0x19,0x00,0xc0,0xff,0xe7,0x01,0x19,0x00,0xc1,\r\n0xff,0xe7,0x01,0x19,0x01,0x04,0xff,0xe5,0x01,0x19,0x01,0x06,0xff,0xe5,0x01,0x19,0x01,0x46,0xff,0xe5,0x01,0x19,0x01,0x86,0xff,0xe5,0x01,0x19,0x01,0x88,0xff,0xe5,0x01,0x1a,0x00,0x1e,0x00,0x52,0x01,0x1a,0x00,0x26,0xff,0xe3,0x01,0x1a,0x00,0x2a,0xff,0xe3,0x01,0x1a,0x00,0x2d,0x00,0x39,0x01,0x1a,0x00,0x32,0xff,0xec,0x01,0x1a,\r\n0x00,0x34,0xff,0xec,0x01,0x1a,0x00,0x37,0xff,0xcb,0x01,0x1a,0x00,0x3c,0xff,0xd9,0x01,0x1a,0x00,0x46,0xff,0xcb,0x01,0x1a,0x00,0x47,0xff,0xcb,0x01,0x1a,0x00,0x48,0xff,0xc7,0x01,0x1a,0x00,0x4a,0xff,0xc7,0x01,0x1a,0x00,0x52,0xff,0xc5,0x01,0x1a,0x00,0x54,0xff,0xcb,0x01,0x1a,0x00,0x64,0xff,0xe5,0x01,0x1a,0x00,0x67,0xff,0xec,\r\n0x01,0x1a,0x00,0x6f,0xff,0xbe,0x01,0x1a,0x00,0x70,0xff,0xbe,0x01,0x1a,0x00,0x71,0xff,0xbe,0x01,0x1a,0x00,0x72,0xff,0xbe,0x01,0x1a,0x00,0x73,0xff,0xbe,0x01,0x1a,0x00,0x79,0xff,0xc5,0x01,0x1a,0x00,0x7a,0xff,0xc5,0x01,0x1a,0x00,0x7b,0xff,0xc5,0x01,0x1a,0x00,0x7c,0xff,0xc5,0x01,0x1a,0x00,0x7d,0xff,0xc5,0x01,0x1a,0x00,0x92,\r\n0xff,0xec,0x01,0x1a,0x00,0xaf,0xff,0xec,0x01,0x1a,0x00,0xb0,0xff,0xec,0x01,0x1a,0x00,0xb1,0xff,0xc5,0x01,0x1a,0x00,0xbb,0xff,0xe5,0x01,0x1a,0x00,0xd0,0xff,0xec,0x01,0x1a,0x00,0xd1,0xff,0xec,0x01,0x1a,0x00,0xd2,0xff,0xec,0x01,0x1a,0x00,0xea,0xff,0xd9,0x01,0x1a,0x00,0xf7,0xff,0xe3,0x01,0x1a,0x00,0xf8,0xff,0xc7,0x01,0x1a,\r\n0x00,0xfc,0xff,0xe3,0x01,0x1a,0x00,0xfd,0xff,0xcb,0x01,0x1a,0x00,0xfe,0xff,0xe3,0x01,0x1a,0x00,0xff,0xff,0xcb,0x01,0x1a,0x01,0x00,0xff,0xcb,0x01,0x1a,0x01,0x08,0xff,0xcb,0x01,0x1a,0x01,0x0b,0xff,0xc7,0x01,0x1a,0x01,0x0d,0xff,0xbe,0x01,0x1a,0x01,0x18,0xff,0xec,0x01,0x1a,0x01,0x19,0xff,0xc5,0x01,0x1a,0x01,0x20,0xff,0xcb,\r\n0x01,0x1a,0x01,0x22,0xff,0xcb,0x01,0x1a,0x01,0x47,0xff,0xe3,0x01,0x1a,0x01,0x48,0xff,0xcb,0x01,0x1a,0x01,0x4c,0xff,0xbe,0x01,0x1a,0x01,0x4e,0xff,0xbe,0x01,0x1a,0x01,0x50,0xff,0xbe,0x01,0x1a,0x01,0x51,0xff,0xe3,0x01,0x1a,0x01,0x52,0xff,0xc7,0x01,0x1a,0x01,0x53,0xff,0xe3,0x01,0x1a,0x01,0x54,0xff,0xc7,0x01,0x1a,0x01,0x55,\r\n0xff,0xe3,0x01,0x1a,0x01,0x56,0xff,0xc7,0x01,0x1a,0x01,0x63,0x00,0x39,0x01,0x1a,0x01,0x6e,0xff,0xec,0x01,0x1a,0x01,0x6f,0xff,0xc5,0x01,0x1a,0x01,0x70,0xff,0xec,0x01,0x1a,0x01,0x71,0xff,0xc5,0x01,0x1a,0x01,0x76,0xff,0xcb,0x01,0x1a,0x01,0x82,0xff,0xd9,0x01,0x1a,0x01,0x89,0xff,0xec,0x01,0x1a,0x01,0x8a,0xff,0xc5,0x01,0x1a,\r\n0x01,0x92,0xff,0xd9,0x01,0x1b,0x00,0x0f,0xff,0x62,0x01,0x1b,0x00,0x10,0xff,0x7f,0x01,0x1b,0x00,0x11,0xff,0x56,0x01,0x1b,0x00,0x1d,0x00,0x52,0x01,0x1b,0x00,0x1e,0x00,0x52,0x01,0x1b,0x00,0x46,0xff,0xe5,0x01,0x1b,0x00,0x47,0xff,0xe5,0x01,0x1b,0x00,0x48,0xff,0xe5,0x01,0x1b,0x00,0x49,0x00,0x27,0x01,0x1b,0x00,0x4a,0xff,0xe5,\r\n0x01,0x1b,0x00,0x50,0xff,0xfc,0x01,0x1b,0x00,0x51,0xff,0xfc,0x01,0x1b,0x00,0x52,0xff,0xe5,0x01,0x1b,0x00,0x54,0xff,0xe5,0x01,0x1b,0x00,0x56,0x00,0x0e,0x01,0x1b,0x00,0x57,0x00,0x3b,0x01,0x1b,0x00,0x59,0x00,0x52,0x01,0x1b,0x00,0x5a,0x00,0x52,0x01,0x1b,0x00,0x5b,0x00,0x3b,0x01,0x1b,0x00,0x5c,0x00,0x52,0x01,0x1b,0x00,0x5d,\r\n0x00,0x27,0x01,0x1b,0x00,0x6f,0xff,0xe5,0x01,0x1b,0x00,0x70,0xff,0xe5,0x01,0x1b,0x00,0x71,0xff,0xe5,0x01,0x1b,0x00,0x72,0xff,0xe5,0x01,0x1b,0x00,0x73,0xff,0xe5,0x01,0x1b,0x00,0x79,0xff,0xe5,0x01,0x1b,0x00,0x7a,0xff,0xe5,0x01,0x1b,0x00,0x7b,0xff,0xe5,0x01,0x1b,0x00,0x7c,0xff,0xe5,0x01,0x1b,0x00,0x7d,0xff,0xe5,0x01,0x1b,\r\n0x00,0xac,0xff,0x56,0x01,0x1b,0x00,0xb1,0xff,0xe5,0x01,0x1b,0x00,0xb4,0x00,0xa4,0x01,0x1b,0x00,0xb5,0x00,0x79,0x01,0x1b,0x00,0xb6,0x00,0xa4,0x01,0x1b,0x00,0xb7,0x00,0x79,0x01,0x1b,0x00,0xc4,0xff,0x62,0x01,0x1b,0x00,0xc5,0xff,0x62,0x01,0x1b,0x00,0xe4,0x00,0x0e,0x01,0x1b,0x00,0xe6,0x00,0x27,0x01,0x1b,0x00,0xeb,0x00,0x52,\r\n0x01,0x1b,0x00,0xf8,0xff,0xe5,0x01,0x1b,0x00,0xfb,0x00,0x0e,0x01,0x1b,0x00,0xfd,0xff,0xe5,0x01,0x1b,0x00,0xff,0xff,0xe5,0x01,0x1b,0x01,0x00,0xff,0xe5,0x01,0x1b,0x01,0x08,0xff,0xe5,0x01,0x1b,0x01,0x0b,0xff,0xe5,0x01,0x1b,0x01,0x0d,0xff,0xe5,0x01,0x1b,0x01,0x19,0xff,0xe5,0x01,0x1b,0x01,0x1f,0x00,0x0e,0x01,0x1b,0x01,0x21,\r\n0x00,0x3b,0x01,0x1b,0x01,0x23,0x00,0x3b,0x01,0x1b,0x01,0x29,0x00,0x27,0x01,0x1b,0x01,0x2b,0x00,0x27,0x01,0x1b,0x01,0x48,0xff,0xe5,0x01,0x1b,0x01,0x4c,0xff,0xe5,0x01,0x1b,0x01,0x4e,0xff,0xe5,0x01,0x1b,0x01,0x50,0xff,0xe5,0x01,0x1b,0x01,0x52,0xff,0xe5,0x01,0x1b,0x01,0x54,0xff,0xe5,0x01,0x1b,0x01,0x56,0xff,0xe5,0x01,0x1b,\r\n0x01,0x6d,0xff,0xfc,0x01,0x1b,0x01,0x6f,0xff,0xe5,0x01,0x1b,0x01,0x71,0xff,0xe5,0x01,0x1b,0x01,0x75,0x00,0x0e,0x01,0x1b,0x01,0x77,0x00,0x3b,0x01,0x1b,0x01,0x81,0x00,0x52,0x01,0x1b,0x01,0x83,0x00,0x52,0x01,0x1b,0x01,0x8a,0xff,0xe5,0x01,0x1b,0x01,0x8d,0x00,0x52,0x01,0x1b,0x01,0x8f,0x00,0x52,0x01,0x1b,0x01,0x91,0x00,0x52,\r\n0x01,0x1b,0x01,0x93,0x00,0x52,0x01,0x1b,0x02,0x3e,0x00,0x0e,0x01,0x1c,0x00,0x1e,0x00,0x52,0x01,0x1c,0x00,0x26,0xff,0xe3,0x01,0x1c,0x00,0x2a,0xff,0xe3,0x01,0x1c,0x00,0x2d,0x00,0x39,0x01,0x1c,0x00,0x32,0xff,0xec,0x01,0x1c,0x00,0x34,0xff,0xec,0x01,0x1c,0x00,0x37,0xff,0xcb,0x01,0x1c,0x00,0x3c,0xff,0xd9,0x01,0x1c,0x00,0x46,\r\n0xff,0xcb,0x01,0x1c,0x00,0x47,0xff,0xcb,0x01,0x1c,0x00,0x48,0xff,0xc7,0x01,0x1c,0x00,0x4a,0xff,0xc7,0x01,0x1c,0x00,0x52,0xff,0xc5,0x01,0x1c,0x00,0x54,0xff,0xcb,0x01,0x1c,0x00,0x64,0xff,0xe5,0x01,0x1c,0x00,0x67,0xff,0xec,0x01,0x1c,0x00,0x6f,0xff,0xbe,0x01,0x1c,0x00,0x70,0xff,0xbe,0x01,0x1c,0x00,0x71,0xff,0xbe,0x01,0x1c,\r\n0x00,0x72,0xff,0xbe,0x01,0x1c,0x00,0x73,0xff,0xbe,0x01,0x1c,0x00,0x79,0xff,0xc5,0x01,0x1c,0x00,0x7a,0xff,0xc5,0x01,0x1c,0x00,0x7b,0xff,0xc5,0x01,0x1c,0x00,0x7c,0xff,0xc5,0x01,0x1c,0x00,0x7d,0xff,0xc5,0x01,0x1c,0x00,0x92,0xff,0xec,0x01,0x1c,0x00,0xaf,0xff,0xec,0x01,0x1c,0x00,0xb0,0xff,0xec,0x01,0x1c,0x00,0xb1,0xff,0xc5,\r\n0x01,0x1c,0x00,0xbb,0xff,0xe5,0x01,0x1c,0x00,0xd0,0xff,0xec,0x01,0x1c,0x00,0xd1,0xff,0xec,0x01,0x1c,0x00,0xd2,0xff,0xec,0x01,0x1c,0x00,0xea,0xff,0xd9,0x01,0x1c,0x00,0xf7,0xff,0xe3,0x01,0x1c,0x00,0xf8,0xff,0xc7,0x01,0x1c,0x00,0xfc,0xff,0xe3,0x01,0x1c,0x00,0xfd,0xff,0xcb,0x01,0x1c,0x00,0xfe,0xff,0xe3,0x01,0x1c,0x00,0xff,\r\n0xff,0xcb,0x01,0x1c,0x01,0x00,0xff,0xcb,0x01,0x1c,0x01,0x08,0xff,0xcb,0x01,0x1c,0x01,0x0b,0xff,0xc7,0x01,0x1c,0x01,0x0d,0xff,0xbe,0x01,0x1c,0x01,0x18,0xff,0xec,0x01,0x1c,0x01,0x19,0xff,0xc5,0x01,0x1c,0x01,0x20,0xff,0xcb,0x01,0x1c,0x01,0x22,0xff,0xcb,0x01,0x1c,0x01,0x47,0xff,0xe3,0x01,0x1c,0x01,0x48,0xff,0xcb,0x01,0x1c,\r\n0x01,0x4c,0xff,0xbe,0x01,0x1c,0x01,0x4e,0xff,0xbe,0x01,0x1c,0x01,0x50,0xff,0xbe,0x01,0x1c,0x01,0x51,0xff,0xe3,0x01,0x1c,0x01,0x52,0xff,0xc7,0x01,0x1c,0x01,0x53,0xff,0xe3,0x01,0x1c,0x01,0x54,0xff,0xc7,0x01,0x1c,0x01,0x55,0xff,0xe3,0x01,0x1c,0x01,0x56,0xff,0xc7,0x01,0x1c,0x01,0x63,0x00,0x39,0x01,0x1c,0x01,0x6e,0xff,0xec,\r\n0x01,0x1c,0x01,0x6f,0xff,0xc5,0x01,0x1c,0x01,0x70,0xff,0xec,0x01,0x1c,0x01,0x71,0xff,0xc5,0x01,0x1c,0x01,0x76,0xff,0xcb,0x01,0x1c,0x01,0x82,0xff,0xd9,0x01,0x1c,0x01,0x89,0xff,0xec,0x01,0x1c,0x01,0x8a,0xff,0xc5,0x01,0x1c,0x01,0x92,0xff,0xd9,0x01,0x1d,0x00,0x0f,0xff,0x62,0x01,0x1d,0x00,0x10,0xff,0x7f,0x01,0x1d,0x00,0x11,\r\n0xff,0x56,0x01,0x1d,0x00,0x1d,0x00,0x52,0x01,0x1d,0x00,0x1e,0x00,0x52,0x01,0x1d,0x00,0x46,0xff,0xe5,0x01,0x1d,0x00,0x47,0xff,0xe5,0x01,0x1d,0x00,0x48,0xff,0xe5,0x01,0x1d,0x00,0x49,0x00,0x27,0x01,0x1d,0x00,0x4a,0xff,0xe5,0x01,0x1d,0x00,0x50,0xff,0xfc,0x01,0x1d,0x00,0x51,0xff,0xfc,0x01,0x1d,0x00,0x52,0xff,0xe5,0x01,0x1d,\r\n0x00,0x54,0xff,0xe5,0x01,0x1d,0x00,0x56,0x00,0x0e,0x01,0x1d,0x00,0x57,0x00,0x3b,0x01,0x1d,0x00,0x59,0x00,0x52,0x01,0x1d,0x00,0x5a,0x00,0x52,0x01,0x1d,0x00,0x5b,0x00,0x3b,0x01,0x1d,0x00,0x5c,0x00,0x52,0x01,0x1d,0x00,0x5d,0x00,0x27,0x01,0x1d,0x00,0x6f,0xff,0xe5,0x01,0x1d,0x00,0x70,0xff,0xe5,0x01,0x1d,0x00,0x71,0xff,0xe5,\r\n0x01,0x1d,0x00,0x72,0xff,0xe5,0x01,0x1d,0x00,0x73,0xff,0xe5,0x01,0x1d,0x00,0x79,0xff,0xe5,0x01,0x1d,0x00,0x7a,0xff,0xe5,0x01,0x1d,0x00,0x7b,0xff,0xe5,0x01,0x1d,0x00,0x7c,0xff,0xe5,0x01,0x1d,0x00,0x7d,0xff,0xe5,0x01,0x1d,0x00,0xac,0xff,0x56,0x01,0x1d,0x00,0xb1,0xff,0xe5,0x01,0x1d,0x00,0xb4,0x00,0xa4,0x01,0x1d,0x00,0xb5,\r\n0x00,0x79,0x01,0x1d,0x00,0xb6,0x00,0xa4,0x01,0x1d,0x00,0xb7,0x00,0x79,0x01,0x1d,0x00,0xc4,0xff,0x62,0x01,0x1d,0x00,0xc5,0xff,0x62,0x01,0x1d,0x00,0xe4,0x00,0x0e,0x01,0x1d,0x00,0xe6,0x00,0x27,0x01,0x1d,0x00,0xeb,0x00,0x52,0x01,0x1d,0x00,0xf8,0xff,0xe5,0x01,0x1d,0x00,0xfb,0x00,0x0e,0x01,0x1d,0x00,0xfd,0xff,0xe5,0x01,0x1d,\r\n0x00,0xff,0xff,0xe5,0x01,0x1d,0x01,0x00,0xff,0xe5,0x01,0x1d,0x01,0x08,0xff,0xe5,0x01,0x1d,0x01,0x0b,0xff,0xe5,0x01,0x1d,0x01,0x0d,0xff,0xe5,0x01,0x1d,0x01,0x19,0xff,0xe5,0x01,0x1d,0x01,0x1f,0x00,0x0e,0x01,0x1d,0x01,0x21,0x00,0x3b,0x01,0x1d,0x01,0x23,0x00,0x3b,0x01,0x1d,0x01,0x29,0x00,0x27,0x01,0x1d,0x01,0x2b,0x00,0x27,\r\n0x01,0x1d,0x01,0x48,0xff,0xe5,0x01,0x1d,0x01,0x4c,0xff,0xe5,0x01,0x1d,0x01,0x4e,0xff,0xe5,0x01,0x1d,0x01,0x50,0xff,0xe5,0x01,0x1d,0x01,0x52,0xff,0xe5,0x01,0x1d,0x01,0x54,0xff,0xe5,0x01,0x1d,0x01,0x56,0xff,0xe5,0x01,0x1d,0x01,0x6d,0xff,0xfc,0x01,0x1d,0x01,0x6f,0xff,0xe5,0x01,0x1d,0x01,0x71,0xff,0xe5,0x01,0x1d,0x01,0x75,\r\n0x00,0x0e,0x01,0x1d,0x01,0x77,0x00,0x3b,0x01,0x1d,0x01,0x81,0x00,0x52,0x01,0x1d,0x01,0x83,0x00,0x52,0x01,0x1d,0x01,0x8a,0xff,0xe5,0x01,0x1d,0x01,0x8d,0x00,0x52,0x01,0x1d,0x01,0x8f,0x00,0x52,0x01,0x1d,0x01,0x91,0x00,0x52,0x01,0x1d,0x01,0x93,0x00,0x52,0x01,0x1d,0x02,0x3e,0x00,0x0e,0x01,0x1e,0x00,0x57,0xff,0xbe,0x01,0x1e,\r\n0x00,0x59,0xff,0xcf,0x01,0x1e,0x00,0x5a,0xff,0xe5,0x01,0x1e,0x00,0x5c,0xff,0xd1,0x01,0x1e,0x00,0xba,0xff,0xbe,0x01,0x1e,0x00,0xc4,0xff,0xb2,0x01,0x1e,0x00,0xc5,0xff,0xb2,0x01,0x1e,0x00,0xeb,0xff,0xd1,0x01,0x1e,0x01,0x21,0xff,0xbe,0x01,0x1e,0x01,0x23,0xff,0xbe,0x01,0x1e,0x01,0x77,0xff,0xbe,0x01,0x1e,0x01,0x81,0xff,0xe5,\r\n0x01,0x1e,0x01,0x83,0xff,0xd1,0x01,0x1e,0x01,0x8d,0xff,0xe5,0x01,0x1e,0x01,0x8f,0xff,0xe5,0x01,0x1e,0x01,0x91,0xff,0xe5,0x01,0x1e,0x01,0x93,0xff,0xd1,0x01,0x20,0x00,0x0f,0xff,0x7f,0x01,0x20,0x00,0x11,0xff,0x4c,0x01,0x20,0x00,0x1d,0xff,0xe9,0x01,0x20,0x00,0x1e,0xff,0xe9,0x01,0x20,0x00,0x24,0xff,0x66,0x01,0x20,0x00,0x26,\r\n0xff,0xa4,0x01,0x20,0x00,0x2a,0xff,0xa4,0x01,0x20,0x00,0x2d,0xff,0x8f,0x01,0x20,0x00,0x32,0xff,0xa4,0x01,0x20,0x00,0x34,0xff,0xa4,0x01,0x20,0x00,0x37,0x00,0x27,0x01,0x20,0x00,0x39,0x00,0x2b,0x01,0x20,0x00,0x3a,0x00,0x27,0x01,0x20,0x00,0x3b,0xff,0xfa,0x01,0x20,0x00,0x3c,0x00,0x1d,0x01,0x20,0x00,0x44,0xff,0x27,0x01,0x20,\r\n0x00,0x46,0xff,0x2d,0x01,0x20,0x00,0x47,0xff,0x2d,0x01,0x20,0x00,0x48,0xff,0x2d,0x01,0x20,0x00,0x49,0xff,0xa0,0x01,0x20,0x00,0x4a,0xff,0x2d,0x01,0x20,0x00,0x50,0xff,0x4e,0x01,0x20,0x00,0x51,0xff,0x4e,0x01,0x20,0x00,0x52,0xff,0x2d,0x01,0x20,0x00,0x53,0xff,0x4e,0x01,0x20,0x00,0x54,0xff,0x2d,0x01,0x20,0x00,0x55,0xff,0x4e,\r\n0x01,0x20,0x00,0x56,0xff,0x66,0x01,0x20,0x00,0x58,0xff,0x4e,0x01,0x20,0x00,0x59,0xff,0x9a,0x01,0x20,0x00,0x5a,0xff,0x8f,0x01,0x20,0x00,0x5b,0xff,0x4c,0x01,0x20,0x00,0x5c,0xff,0x8f,0x01,0x20,0x00,0x5d,0xff,0x7f,0x01,0x20,0x00,0x62,0xff,0x66,0x01,0x20,0x00,0x63,0xff,0x66,0x01,0x20,0x00,0x64,0xff,0xa4,0x01,0x20,0x00,0x67,\r\n0xff,0xa4,0x01,0x20,0x00,0x69,0xff,0x27,0x01,0x20,0x00,0x6a,0xff,0x27,0x01,0x20,0x00,0x6b,0xff,0x27,0x01,0x20,0x00,0x6c,0xff,0x27,0x01,0x20,0x00,0x6d,0xff,0x3f,0x01,0x20,0x00,0x6e,0xff,0x27,0x01,0x20,0x00,0x6f,0xff,0x1b,0x01,0x20,0x00,0x70,0xff,0x2d,0x01,0x20,0x00,0x71,0xff,0x2d,0x01,0x20,0x00,0x72,0xff,0x2d,0x01,0x20,\r\n0x00,0x73,0xff,0x2d,0x01,0x20,0x00,0x74,0xff,0xe9,0x01,0x20,0x00,0x76,0x00,0x31,0x01,0x20,0x00,0x77,0x00,0x6f,0x01,0x20,0x00,0x78,0xff,0x4e,0x01,0x20,0x00,0x79,0xff,0x2d,0x01,0x20,0x00,0x7a,0xff,0x2d,0x01,0x20,0x00,0x7b,0xff,0x2d,0x01,0x20,0x00,0x7c,0xff,0x2d,0x01,0x20,0x00,0x7d,0xff,0x2d,0x01,0x20,0x00,0x7e,0xff,0x4e,\r\n0x01,0x20,0x00,0x7f,0xff,0x4e,0x01,0x20,0x00,0x80,0xff,0x4e,0x01,0x20,0x00,0x81,0xff,0x4e,0x01,0x20,0x00,0x8d,0x00,0x52,0x01,0x20,0x00,0x91,0xff,0x0c,0x01,0x20,0x00,0x92,0xff,0xa4,0x01,0x20,0x00,0xa0,0xff,0x27,0x01,0x20,0x00,0xaa,0xff,0x9a,0x01,0x20,0x00,0xab,0xff,0xcf,0x01,0x20,0x00,0xac,0xff,0x4c,0x01,0x20,0x00,0xad,\r\n0xff,0x66,0x01,0x20,0x00,0xae,0xff,0x66,0x01,0x20,0x00,0xaf,0xff,0xa4,0x01,0x20,0x00,0xb0,0xff,0xa4,0x01,0x20,0x00,0xb1,0xff,0x2d,0x01,0x20,0x00,0xb5,0x00,0x27,0x01,0x20,0x00,0xb7,0x00,0x27,0x01,0x20,0x00,0xba,0xff,0x8f,0x01,0x20,0x00,0xbe,0xff,0x9a,0x01,0x20,0x00,0xbf,0xff,0xcf,0x01,0x20,0x00,0xc4,0xff,0x17,0x01,0x20,\r\n0x00,0xc5,0xff,0x17,0x01,0x20,0x00,0xc7,0xff,0x66,0x01,0x20,0x00,0xc9,0xff,0x66,0x01,0x20,0x00,0xd0,0xff,0xa4,0x01,0x20,0x00,0xd1,0xff,0xa4,0x01,0x20,0x00,0xd2,0xff,0xa4,0x01,0x20,0x00,0xe4,0xff,0x66,0x01,0x20,0x00,0xe6,0xff,0x7f,0x01,0x20,0x00,0xea,0x00,0x1d,0x01,0x20,0x00,0xeb,0xff,0x8f,0x01,0x20,0x00,0xf7,0xff,0xa4,\r\n0x01,0x20,0x00,0xf8,0xff,0x2d,0x01,0x20,0x00,0xfb,0xff,0x66,0x01,0x20,0x00,0xfc,0xff,0xa4,0x01,0x20,0x00,0xfd,0xff,0x2d,0x01,0x20,0x00,0xfe,0xff,0xa4,0x01,0x20,0x00,0xff,0xff,0x2d,0x01,0x20,0x01,0x00,0xff,0x2d,0x01,0x20,0x01,0x03,0xff,0x66,0x01,0x20,0x01,0x04,0xff,0x27,0x01,0x20,0x01,0x05,0xff,0x66,0x01,0x20,0x01,0x06,\r\n0xff,0x27,0x01,0x20,0x01,0x08,0xff,0x2d,0x01,0x20,0x01,0x0b,0xff,0x2d,0x01,0x20,0x01,0x0d,0xff,0x2d,0x01,0x20,0x01,0x15,0xff,0x4e,0x01,0x20,0x01,0x17,0xff,0x4e,0x01,0x20,0x01,0x18,0xff,0xa4,0x01,0x20,0x01,0x19,0xff,0x2d,0x01,0x20,0x01,0x1b,0xff,0x4e,0x01,0x20,0x01,0x1d,0xff,0x4e,0x01,0x20,0x01,0x1f,0xff,0x66,0x01,0x20,\r\n0x01,0x20,0x00,0x27,0x01,0x20,0x01,0x22,0x00,0x27,0x01,0x20,0x01,0x25,0xff,0x4e,0x01,0x20,0x01,0x27,0xff,0x4e,0x01,0x20,0x01,0x29,0xff,0x7f,0x01,0x20,0x01,0x2b,0xff,0x7f,0x01,0x20,0x01,0x45,0xff,0x66,0x01,0x20,0x01,0x46,0xff,0x27,0x01,0x20,0x01,0x47,0xff,0xa4,0x01,0x20,0x01,0x48,0xff,0x2d,0x01,0x20,0x01,0x4c,0xff,0x2d,\r\n0x01,0x20,0x01,0x4e,0xff,0x2d,0x01,0x20,0x01,0x50,0xff,0x2d,0x01,0x20,0x01,0x51,0xff,0xa4,0x01,0x20,0x01,0x52,0xff,0x2d,0x01,0x20,0x01,0x53,0xff,0xa4,0x01,0x20,0x01,0x54,0xff,0x2d,0x01,0x20,0x01,0x55,0xff,0xa4,0x01,0x20,0x01,0x56,0xff,0x2d,0x01,0x20,0x01,0x5c,0x00,0x6f,0x01,0x20,0x01,0x5e,0x00,0x6f,0x01,0x20,0x01,0x60,\r\n0x00,0x6f,0x01,0x20,0x01,0x63,0xff,0x8f,0x01,0x20,0x01,0x6d,0xff,0x4e,0x01,0x20,0x01,0x6e,0xff,0xa4,0x01,0x20,0x01,0x6f,0xff,0x2d,0x01,0x20,0x01,0x70,0xff,0xa4,0x01,0x20,0x01,0x71,0xff,0x2d,0x01,0x20,0x01,0x73,0xff,0x4e,0x01,0x20,0x01,0x75,0xff,0x66,0x01,0x20,0x01,0x76,0x00,0x27,0x01,0x20,0x01,0x79,0xff,0x4e,0x01,0x20,\r\n0x01,0x7b,0xff,0x4e,0x01,0x20,0x01,0x7d,0xff,0x4e,0x01,0x20,0x01,0x7f,0xff,0x4e,0x01,0x20,0x01,0x80,0x00,0x27,0x01,0x20,0x01,0x81,0xff,0x8f,0x01,0x20,0x01,0x82,0x00,0x1d,0x01,0x20,0x01,0x83,0xff,0x8f,0x01,0x20,0x01,0x85,0xff,0x66,0x01,0x20,0x01,0x86,0xff,0x27,0x01,0x20,0x01,0x87,0xff,0x66,0x01,0x20,0x01,0x88,0xff,0x27,\r\n0x01,0x20,0x01,0x89,0xff,0xa4,0x01,0x20,0x01,0x8a,0xff,0x2d,0x01,0x20,0x01,0x8c,0x00,0x27,0x01,0x20,0x01,0x8d,0xff,0x8f,0x01,0x20,0x01,0x8e,0x00,0x27,0x01,0x20,0x01,0x8f,0xff,0x8f,0x01,0x20,0x01,0x90,0x00,0x27,0x01,0x20,0x01,0x91,0xff,0x8f,0x01,0x20,0x01,0x92,0x00,0x1d,0x01,0x20,0x01,0x93,0xff,0x8f,0x01,0x20,0x02,0x3e,\r\n0xff,0x66,0x01,0x21,0x00,0x10,0xff,0x8f,0x01,0x21,0x00,0x22,0xff,0xcb,0x01,0x21,0x00,0x46,0xff,0xe5,0x01,0x21,0x00,0x47,0xff,0xe5,0x01,0x21,0x00,0x48,0xff,0xf0,0x01,0x21,0x00,0x4a,0xff,0xf0,0x01,0x21,0x00,0x52,0xff,0xf0,0x01,0x21,0x00,0x54,0xff,0xf0,0x01,0x21,0x00,0x5b,0x00,0x1d,0x01,0x21,0x00,0x6f,0xff,0xe5,0x01,0x21,\r\n0x00,0x70,0xff,0xf0,0x01,0x21,0x00,0x71,0xff,0xf0,0x01,0x21,0x00,0x72,0xff,0xf0,0x01,0x21,0x00,0x73,0xff,0xf0,0x01,0x21,0x00,0x79,0xff,0xf0,0x01,0x21,0x00,0x7a,0xff,0xf0,0x01,0x21,0x00,0x7b,0xff,0xf0,0x01,0x21,0x00,0x7c,0xff,0xf0,0x01,0x21,0x00,0x7d,0xff,0xf0,0x01,0x21,0x00,0xab,0x00,0x27,0x01,0x21,0x00,0xb1,0xff,0xf0,\r\n0x01,0x21,0x00,0xbf,0x00,0x27,0x01,0x21,0x00,0xf8,0xff,0xf0,0x01,0x21,0x00,0xfd,0xff,0xe5,0x01,0x21,0x00,0xff,0xff,0xe5,0x01,0x21,0x01,0x00,0xff,0xe5,0x01,0x21,0x01,0x08,0xff,0xe5,0x01,0x21,0x01,0x0b,0xff,0xf0,0x01,0x21,0x01,0x0d,0xff,0xf0,0x01,0x21,0x01,0x19,0xff,0xf0,0x01,0x21,0x01,0x48,0xff,0xe5,0x01,0x21,0x01,0x4c,\r\n0xff,0xf0,0x01,0x21,0x01,0x4e,0xff,0xf0,0x01,0x21,0x01,0x50,0xff,0xf0,0x01,0x21,0x01,0x52,0xff,0xf0,0x01,0x21,0x01,0x54,0xff,0xf0,0x01,0x21,0x01,0x56,0xff,0xf0,0x01,0x21,0x01,0x6f,0xff,0xf0,0x01,0x21,0x01,0x71,0xff,0xf0,0x01,0x21,0x01,0x8a,0xff,0xf0,0x01,0x22,0x00,0x0f,0xff,0x7f,0x01,0x22,0x00,0x11,0xff,0x4c,0x01,0x22,\r\n0x00,0x1d,0xff,0xe9,0x01,0x22,0x00,0x1e,0xff,0xe9,0x01,0x22,0x00,0x24,0xff,0x66,0x01,0x22,0x00,0x26,0xff,0xa4,0x01,0x22,0x00,0x2a,0xff,0xa4,0x01,0x22,0x00,0x2d,0xff,0x8f,0x01,0x22,0x00,0x32,0xff,0xa4,0x01,0x22,0x00,0x34,0xff,0xa4,0x01,0x22,0x00,0x37,0x00,0x27,0x01,0x22,0x00,0x39,0x00,0x2b,0x01,0x22,0x00,0x3a,0x00,0x27,\r\n0x01,0x22,0x00,0x3b,0xff,0xfa,0x01,0x22,0x00,0x3c,0x00,0x1d,0x01,0x22,0x00,0x44,0xff,0x27,0x01,0x22,0x00,0x46,0xff,0x2d,0x01,0x22,0x00,0x47,0xff,0x2d,0x01,0x22,0x00,0x48,0xff,0x2d,0x01,0x22,0x00,0x49,0xff,0xa0,0x01,0x22,0x00,0x4a,0xff,0x2d,0x01,0x22,0x00,0x50,0xff,0x4e,0x01,0x22,0x00,0x51,0xff,0x4e,0x01,0x22,0x00,0x52,\r\n0xff,0x2d,0x01,0x22,0x00,0x53,0xff,0x4e,0x01,0x22,0x00,0x54,0xff,0x2d,0x01,0x22,0x00,0x55,0xff,0x4e,0x01,0x22,0x00,0x56,0xff,0x66,0x01,0x22,0x00,0x58,0xff,0x4e,0x01,0x22,0x00,0x59,0xff,0x9a,0x01,0x22,0x00,0x5a,0xff,0x8f,0x01,0x22,0x00,0x5b,0xff,0x4c,0x01,0x22,0x00,0x5c,0xff,0x8f,0x01,0x22,0x00,0x5d,0xff,0x7f,0x01,0x22,\r\n0x00,0x62,0xff,0x66,0x01,0x22,0x00,0x63,0xff,0x66,0x01,0x22,0x00,0x64,0xff,0xa4,0x01,0x22,0x00,0x67,0xff,0xa4,0x01,0x22,0x00,0x69,0xff,0x27,0x01,0x22,0x00,0x6a,0xff,0x27,0x01,0x22,0x00,0x6b,0xff,0x27,0x01,0x22,0x00,0x6c,0xff,0x27,0x01,0x22,0x00,0x6d,0xff,0x3f,0x01,0x22,0x00,0x6e,0xff,0x27,0x01,0x22,0x00,0x6f,0xff,0x1b,\r\n0x01,0x22,0x00,0x70,0xff,0x2d,0x01,0x22,0x00,0x71,0xff,0x2d,0x01,0x22,0x00,0x72,0xff,0x2d,0x01,0x22,0x00,0x73,0xff,0x2d,0x01,0x22,0x00,0x74,0xff,0xe9,0x01,0x22,0x00,0x76,0x00,0x31,0x01,0x22,0x00,0x77,0x00,0x6f,0x01,0x22,0x00,0x78,0xff,0x4e,0x01,0x22,0x00,0x79,0xff,0x2d,0x01,0x22,0x00,0x7a,0xff,0x2d,0x01,0x22,0x00,0x7b,\r\n0xff,0x2d,0x01,0x22,0x00,0x7c,0xff,0x2d,0x01,0x22,0x00,0x7d,0xff,0x2d,0x01,0x22,0x00,0x7e,0xff,0x4e,0x01,0x22,0x00,0x7f,0xff,0x4e,0x01,0x22,0x00,0x80,0xff,0x4e,0x01,0x22,0x00,0x81,0xff,0x4e,0x01,0x22,0x00,0x8d,0x00,0x52,0x01,0x22,0x00,0x91,0xff,0x0c,0x01,0x22,0x00,0x92,0xff,0xa4,0x01,0x22,0x00,0xa0,0xff,0x27,0x01,0x22,\r\n0x00,0xaa,0xff,0x9a,0x01,0x22,0x00,0xab,0xff,0xcf,0x01,0x22,0x00,0xac,0xff,0x4c,0x01,0x22,0x00,0xad,0xff,0x66,0x01,0x22,0x00,0xae,0xff,0x66,0x01,0x22,0x00,0xaf,0xff,0xa4,0x01,0x22,0x00,0xb0,0xff,0xa4,0x01,0x22,0x00,0xb1,0xff,0x2d,0x01,0x22,0x00,0xb5,0x00,0x27,0x01,0x22,0x00,0xb7,0x00,0x27,0x01,0x22,0x00,0xba,0xff,0x8f,\r\n0x01,0x22,0x00,0xbe,0xff,0x9a,0x01,0x22,0x00,0xbf,0xff,0xcf,0x01,0x22,0x00,0xc4,0xff,0x17,0x01,0x22,0x00,0xc5,0xff,0x17,0x01,0x22,0x00,0xc7,0xff,0x66,0x01,0x22,0x00,0xc9,0xff,0x66,0x01,0x22,0x00,0xd0,0xff,0xa4,0x01,0x22,0x00,0xd1,0xff,0xa4,0x01,0x22,0x00,0xd2,0xff,0xa4,0x01,0x22,0x00,0xe4,0xff,0x66,0x01,0x22,0x00,0xe6,\r\n0xff,0x7f,0x01,0x22,0x00,0xea,0x00,0x1d,0x01,0x22,0x00,0xeb,0xff,0x8f,0x01,0x22,0x00,0xf7,0xff,0xa4,0x01,0x22,0x00,0xf8,0xff,0x2d,0x01,0x22,0x00,0xfb,0xff,0x66,0x01,0x22,0x00,0xfc,0xff,0xa4,0x01,0x22,0x00,0xfd,0xff,0x2d,0x01,0x22,0x00,0xfe,0xff,0xa4,0x01,0x22,0x00,0xff,0xff,0x2d,0x01,0x22,0x01,0x00,0xff,0x2d,0x01,0x22,\r\n0x01,0x03,0xff,0x66,0x01,0x22,0x01,0x04,0xff,0x27,0x01,0x22,0x01,0x05,0xff,0x66,0x01,0x22,0x01,0x06,0xff,0x27,0x01,0x22,0x01,0x08,0xff,0x2d,0x01,0x22,0x01,0x0b,0xff,0x2d,0x01,0x22,0x01,0x0d,0xff,0x2d,0x01,0x22,0x01,0x15,0xff,0x4e,0x01,0x22,0x01,0x17,0xff,0x4e,0x01,0x22,0x01,0x18,0xff,0xa4,0x01,0x22,0x01,0x19,0xff,0x2d,\r\n0x01,0x22,0x01,0x1b,0xff,0x4e,0x01,0x22,0x01,0x1d,0xff,0x4e,0x01,0x22,0x01,0x1f,0xff,0x66,0x01,0x22,0x01,0x20,0x00,0x27,0x01,0x22,0x01,0x22,0x00,0x27,0x01,0x22,0x01,0x25,0xff,0x4e,0x01,0x22,0x01,0x27,0xff,0x4e,0x01,0x22,0x01,0x29,0xff,0x7f,0x01,0x22,0x01,0x2b,0xff,0x7f,0x01,0x22,0x01,0x45,0xff,0x66,0x01,0x22,0x01,0x46,\r\n0xff,0x27,0x01,0x22,0x01,0x47,0xff,0xa4,0x01,0x22,0x01,0x48,0xff,0x2d,0x01,0x22,0x01,0x4c,0xff,0x2d,0x01,0x22,0x01,0x4e,0xff,0x2d,0x01,0x22,0x01,0x50,0xff,0x2d,0x01,0x22,0x01,0x51,0xff,0xa4,0x01,0x22,0x01,0x52,0xff,0x2d,0x01,0x22,0x01,0x53,0xff,0xa4,0x01,0x22,0x01,0x54,0xff,0x2d,0x01,0x22,0x01,0x55,0xff,0xa4,0x01,0x22,\r\n0x01,0x56,0xff,0x2d,0x01,0x22,0x01,0x5c,0x00,0x6f,0x01,0x22,0x01,0x5e,0x00,0x6f,0x01,0x22,0x01,0x60,0x00,0x6f,0x01,0x22,0x01,0x63,0xff,0x8f,0x01,0x22,0x01,0x6d,0xff,0x4e,0x01,0x22,0x01,0x6e,0xff,0xa4,0x01,0x22,0x01,0x6f,0xff,0x2d,0x01,0x22,0x01,0x70,0xff,0xa4,0x01,0x22,0x01,0x71,0xff,0x2d,0x01,0x22,0x01,0x73,0xff,0x4e,\r\n0x01,0x22,0x01,0x75,0xff,0x66,0x01,0x22,0x01,0x76,0x00,0x27,0x01,0x22,0x01,0x79,0xff,0x4e,0x01,0x22,0x01,0x7b,0xff,0x4e,0x01,0x22,0x01,0x7d,0xff,0x4e,0x01,0x22,0x01,0x7f,0xff,0x4e,0x01,0x22,0x01,0x80,0x00,0x27,0x01,0x22,0x01,0x81,0xff,0x8f,0x01,0x22,0x01,0x82,0x00,0x1d,0x01,0x22,0x01,0x83,0xff,0x8f,0x01,0x22,0x01,0x85,\r\n0xff,0x66,0x01,0x22,0x01,0x86,0xff,0x27,0x01,0x22,0x01,0x87,0xff,0x66,0x01,0x22,0x01,0x88,0xff,0x27,0x01,0x22,0x01,0x89,0xff,0xa4,0x01,0x22,0x01,0x8a,0xff,0x2d,0x01,0x22,0x01,0x8c,0x00,0x27,0x01,0x22,0x01,0x8d,0xff,0x8f,0x01,0x22,0x01,0x8e,0x00,0x27,0x01,0x22,0x01,0x8f,0xff,0x8f,0x01,0x22,0x01,0x90,0x00,0x27,0x01,0x22,\r\n0x01,0x91,0xff,0x8f,0x01,0x22,0x01,0x92,0x00,0x1d,0x01,0x22,0x01,0x93,0xff,0x8f,0x01,0x22,0x02,0x3e,0xff,0x66,0x01,0x23,0x00,0x10,0xff,0x8f,0x01,0x23,0x00,0x22,0xff,0xcb,0x01,0x23,0x00,0x46,0xff,0xe5,0x01,0x23,0x00,0x47,0xff,0xe5,0x01,0x23,0x00,0x48,0xff,0xf0,0x01,0x23,0x00,0x4a,0xff,0xf0,0x01,0x23,0x00,0x52,0xff,0xf0,\r\n0x01,0x23,0x00,0x54,0xff,0xf0,0x01,0x23,0x00,0x5b,0x00,0x1d,0x01,0x23,0x00,0x6f,0xff,0xe5,0x01,0x23,0x00,0x70,0xff,0xf0,0x01,0x23,0x00,0x71,0xff,0xf0,0x01,0x23,0x00,0x72,0xff,0xf0,0x01,0x23,0x00,0x73,0xff,0xf0,0x01,0x23,0x00,0x79,0xff,0xf0,0x01,0x23,0x00,0x7a,0xff,0xf0,0x01,0x23,0x00,0x7b,0xff,0xf0,0x01,0x23,0x00,0x7c,\r\n0xff,0xf0,0x01,0x23,0x00,0x7d,0xff,0xf0,0x01,0x23,0x00,0xab,0x00,0x27,0x01,0x23,0x00,0xb1,0xff,0xf0,0x01,0x23,0x00,0xbf,0x00,0x27,0x01,0x23,0x00,0xf8,0xff,0xf0,0x01,0x23,0x00,0xfd,0xff,0xe5,0x01,0x23,0x00,0xff,0xff,0xe5,0x01,0x23,0x01,0x00,0xff,0xe5,0x01,0x23,0x01,0x08,0xff,0xe5,0x01,0x23,0x01,0x0b,0xff,0xf0,0x01,0x23,\r\n0x01,0x0d,0xff,0xf0,0x01,0x23,0x01,0x19,0xff,0xf0,0x01,0x23,0x01,0x48,0xff,0xe5,0x01,0x23,0x01,0x4c,0xff,0xf0,0x01,0x23,0x01,0x4e,0xff,0xf0,0x01,0x23,0x01,0x50,0xff,0xf0,0x01,0x23,0x01,0x52,0xff,0xf0,0x01,0x23,0x01,0x54,0xff,0xf0,0x01,0x23,0x01,0x56,0xff,0xf0,0x01,0x23,0x01,0x6f,0xff,0xf0,0x01,0x23,0x01,0x71,0xff,0xf0,\r\n0x01,0x23,0x01,0x8a,0xff,0xf0,0x01,0x24,0x00,0x24,0xff,0xd7,0x01,0x24,0x00,0x91,0xff,0x8b,0x01,0x24,0x00,0xc4,0xff,0xa6,0x01,0x24,0x00,0xc5,0xff,0xa6,0x01,0x24,0x01,0x03,0xff,0xd7,0x01,0x24,0x01,0x05,0xff,0xd7,0x01,0x24,0x01,0x45,0xff,0xd7,0x01,0x24,0x01,0x85,0xff,0xd7,0x01,0x24,0x01,0x87,0xff,0xd7,0x01,0x25,0x00,0x05,\r\n0xff,0xbe,0x01,0x25,0x00,0x0a,0xff,0xbe,0x01,0x26,0x00,0x24,0xff,0xd7,0x01,0x26,0x00,0x91,0xff,0x8b,0x01,0x26,0x00,0xc4,0xff,0xa6,0x01,0x26,0x00,0xc5,0xff,0xa6,0x01,0x26,0x01,0x03,0xff,0xd7,0x01,0x26,0x01,0x05,0xff,0xd7,0x01,0x26,0x01,0x45,0xff,0xd7,0x01,0x26,0x01,0x85,0xff,0xd7,0x01,0x26,0x01,0x87,0xff,0xd7,0x01,0x27,\r\n0x00,0x05,0xff,0xbe,0x01,0x27,0x00,0x0a,0xff,0xbe,0x01,0x28,0x00,0x2d,0x00,0x52,0x01,0x28,0x00,0x37,0x00,0x27,0x01,0x28,0x00,0x5c,0xff,0xcb,0x01,0x28,0x00,0x77,0x00,0x46,0x01,0x28,0x00,0xab,0x00,0x27,0x01,0x28,0x00,0xba,0xff,0xbe,0x01,0x28,0x00,0xbf,0x00,0x52,0x01,0x28,0x00,0xeb,0xff,0xcb,0x01,0x28,0x01,0x20,0x00,0x27,\r\n0x01,0x28,0x01,0x22,0x00,0x27,0x01,0x28,0x01,0x5c,0x00,0x46,0x01,0x28,0x01,0x5e,0x00,0x46,0x01,0x28,0x01,0x60,0x00,0x46,0x01,0x28,0x01,0x63,0x00,0x52,0x01,0x28,0x01,0x76,0x00,0x27,0x01,0x28,0x01,0x83,0xff,0xcb,0x01,0x28,0x01,0x93,0xff,0xcb,0x01,0x2a,0x00,0x2d,0x00,0x52,0x01,0x2a,0x00,0x37,0x00,0x27,0x01,0x2a,0x00,0x5c,\r\n0xff,0xcb,0x01,0x2a,0x00,0x77,0x00,0x46,0x01,0x2a,0x00,0xab,0x00,0x27,0x01,0x2a,0x00,0xba,0xff,0xbe,0x01,0x2a,0x00,0xbf,0x00,0x52,0x01,0x2a,0x00,0xeb,0xff,0xcb,0x01,0x2a,0x01,0x20,0x00,0x27,0x01,0x2a,0x01,0x22,0x00,0x27,0x01,0x2a,0x01,0x5c,0x00,0x46,0x01,0x2a,0x01,0x5e,0x00,0x46,0x01,0x2a,0x01,0x60,0x00,0x46,0x01,0x2a,\r\n0x01,0x63,0x00,0x52,0x01,0x2a,0x01,0x76,0x00,0x27,0x01,0x2a,0x01,0x83,0xff,0xcb,0x01,0x2a,0x01,0x93,0xff,0xcb,0x01,0x2c,0x00,0x04,0x00,0x44,0x01,0x2c,0x00,0x0f,0xff,0x7d,0x01,0x2c,0x00,0x11,0xff,0x4c,0x01,0x2c,0x00,0x1d,0xff,0xe9,0x01,0x2c,0x00,0x1e,0xff,0xe9,0x01,0x2c,0x00,0x8d,0x00,0x52,0x01,0x2c,0x00,0xa9,0xff,0x6d,\r\n0x01,0x2c,0x00,0xaa,0xff,0x98,0x01,0x2c,0x00,0xab,0xff,0xcd,0x01,0x2c,0x00,0xac,0xff,0x4c,0x01,0x2c,0x00,0xb5,0x00,0x29,0x01,0x2c,0x00,0xb7,0x00,0x29,0x01,0x2c,0x00,0xbe,0xff,0x98,0x01,0x2c,0x00,0xbf,0xff,0xcd,0x01,0x2c,0x00,0xc4,0xff,0x14,0x01,0x2c,0x00,0xc5,0xff,0x14,0x01,0x2c,0x01,0x2d,0xff,0xb6,0x01,0x2c,0x01,0x2e,\r\n0xff,0xb6,0x01,0x2c,0x01,0x2f,0xff,0x2b,0x01,0x2c,0x01,0x30,0xff,0xb0,0x01,0x2c,0x01,0x31,0xff,0x2b,0x01,0x2c,0x01,0x32,0xff,0x2b,0x01,0x2c,0x01,0x33,0xff,0x8f,0x01,0x2c,0x01,0x34,0xff,0x2b,0x01,0x2c,0x01,0xa8,0x00,0x7b,0x01,0x2c,0x01,0xa9,0xff,0x6d,0x01,0x2c,0x01,0xac,0x00,0x0a,0x01,0x2c,0x01,0xb0,0xff,0x6d,0x01,0x2c,\r\n0x01,0xb4,0xff,0xb6,0x01,0x2c,0x01,0xb8,0x00,0x2f,0x01,0x2c,0x01,0xb9,0x00,0x1d,0x01,0x2c,0x01,0xbc,0xff,0xcf,0x01,0x2c,0x01,0xbf,0xff,0x2b,0x01,0x2c,0x01,0xc0,0xff,0x2b,0x01,0x2c,0x01,0xc1,0xff,0x4e,0x01,0x2c,0x01,0xc2,0xff,0x8f,0x01,0x2c,0x01,0xc5,0xff,0xc1,0x01,0x2c,0x01,0xc7,0xff,0x4e,0x01,0x2c,0x01,0xc9,0xff,0x4e,\r\n0x01,0x2c,0x01,0xca,0xff,0x4e,0x01,0x2c,0x01,0xcc,0xff,0x4e,0x01,0x2c,0x01,0xce,0xff,0xb0,0x01,0x2c,0x01,0xcf,0xff,0x2b,0x01,0x2c,0x01,0xd0,0xff,0x4e,0x01,0x2c,0x01,0xd1,0xff,0x2b,0x01,0x2c,0x01,0xd2,0xff,0x4e,0x01,0x2c,0x01,0xd3,0xff,0x7f,0x01,0x2c,0x01,0xd4,0xff,0x4e,0x01,0x2c,0x01,0xd5,0xff,0x2b,0x01,0x2c,0x01,0xd6,\r\n0x00,0x52,0x01,0x2c,0x01,0xd7,0xff,0x4e,0x01,0x2c,0x01,0xd8,0xff,0x2b,0x01,0x2c,0x01,0xd9,0xff,0x4e,0x01,0x2c,0x01,0xda,0xff,0x2b,0x01,0x2c,0x02,0x37,0xff,0x8f,0x01,0x2d,0x00,0x0f,0xff,0xa2,0x01,0x2d,0x00,0xa9,0xff,0xcf,0x01,0x2d,0x00,0xc4,0xff,0x4a,0x01,0x2d,0x00,0xc5,0xff,0x96,0x01,0x2d,0x01,0xa9,0xff,0xe5,0x01,0x2d,\r\n0x01,0xac,0xff,0xcd,0x01,0x2d,0x01,0xb0,0xff,0xe5,0x01,0x2d,0x01,0xb7,0xff,0xe3,0x01,0x2d,0x01,0xb8,0xff,0xa4,0x01,0x2d,0x01,0xb9,0xff,0xe7,0x01,0x2d,0x01,0xba,0xff,0xdb,0x01,0x2d,0x01,0xbe,0xff,0xe7,0x01,0x2d,0x01,0xcb,0xff,0xd7,0x01,0x2e,0x00,0x0f,0xff,0xa2,0x01,0x2e,0x00,0xa9,0xff,0xcf,0x01,0x2e,0x00,0xc4,0xff,0x4a,\r\n0x01,0x2e,0x00,0xc5,0xff,0x96,0x01,0x2e,0x01,0xa9,0xff,0xcf,0x01,0x2e,0x01,0xac,0xff,0xcd,0x01,0x2e,0x01,0xb0,0xff,0xcf,0x01,0x2e,0x01,0xb7,0xff,0xe3,0x01,0x2e,0x01,0xb8,0xff,0xa4,0x01,0x2e,0x01,0xb9,0xff,0xe7,0x01,0x2e,0x01,0xba,0xff,0xd3,0x01,0x2e,0x01,0xbe,0xff,0xe7,0x01,0x2e,0x01,0xcb,0xff,0xc3,0x01,0x2f,0x01,0x2f,\r\n0xff,0xee,0x01,0x2f,0x01,0x30,0xff,0xee,0x01,0x2f,0x01,0x32,0xff,0xee,0x01,0x2f,0x01,0x34,0xff,0xee,0x01,0x2f,0x01,0xbf,0xff,0xee,0x01,0x2f,0x01,0xcf,0xff,0xee,0x01,0x2f,0x01,0xd1,0xff,0xee,0x01,0x2f,0x01,0xd5,0xff,0xee,0x01,0x2f,0x01,0xd8,0xff,0xee,0x01,0x30,0x00,0x05,0xff,0x6f,0x01,0x30,0x00,0x0a,0xff,0x6f,0x01,0x30,\r\n0x00,0xb4,0xff,0xb0,0x01,0x30,0x00,0xb5,0xff,0x7b,0x01,0x30,0x00,0xb6,0xff,0xbc,0x01,0x30,0x00,0xb7,0xff,0x7b,0x01,0x30,0x01,0x33,0xff,0xdb,0x01,0x30,0x01,0xc5,0xff,0xc1,0x01,0x30,0x01,0xd3,0xff,0xaa,0x01,0x30,0x02,0x37,0xff,0xdb,0x01,0x32,0x01,0x33,0x00,0x19,0x01,0x32,0x01,0xc5,0x00,0x31,0x01,0x32,0x01,0xcd,0x00,0x39,\r\n0x01,0x32,0x01,0xd3,0x00,0x19,0x01,0x32,0x02,0x37,0x00,0x19,0x01,0x33,0x01,0x2f,0xff,0xdb,0x01,0x33,0x01,0x30,0xff,0xdb,0x01,0x33,0x01,0x32,0xff,0xdb,0x01,0x33,0x01,0x33,0x00,0x19,0x01,0x33,0x01,0x34,0xff,0xdb,0x01,0x33,0x01,0xbf,0xff,0xdb,0x01,0x33,0x01,0xc5,0x00,0x29,0x01,0x33,0x01,0xcd,0x00,0x25,0x01,0x33,0x01,0xcf,\r\n0xff,0xdb,0x01,0x33,0x01,0xd0,0xff,0xcf,0x01,0x33,0x01,0xd3,0x00,0x19,0x01,0x33,0x01,0xd5,0xff,0xdb,0x01,0x33,0x01,0xd8,0xff,0xdb,0x01,0x33,0x01,0xda,0xff,0xdb,0x01,0x34,0x00,0x05,0xff,0x6f,0x01,0x34,0x00,0x0a,0xff,0x6f,0x01,0x34,0x00,0xb4,0xff,0xb0,0x01,0x34,0x00,0xb5,0xff,0x7b,0x01,0x34,0x00,0xb6,0xff,0xbc,0x01,0x34,\r\n0x00,0xb7,0xff,0x7b,0x01,0x34,0x01,0x33,0xff,0xdb,0x01,0x34,0x01,0xc5,0xff,0xdb,0x01,0x34,0x01,0xd3,0xff,0xc3,0x01,0x34,0x02,0x37,0xff,0xdb,0x01,0x3a,0x00,0x4d,0x00,0x23,0x01,0x3a,0x01,0x64,0x00,0x23,0x01,0x3b,0x00,0x05,0xff,0x98,0x01,0x3b,0x00,0x0a,0xff,0x98,0x01,0x45,0x00,0x0d,0xff,0x7f,0x01,0x45,0x00,0x0f,0x00,0x44,\r\n0x01,0x45,0x00,0x1e,0x00,0x44,0x01,0x45,0x00,0x26,0xff,0xe5,0x01,0x45,0x00,0x2a,0xff,0xe5,0x01,0x45,0x00,0x2d,0x00,0x5e,0x01,0x45,0x00,0x32,0xff,0xe5,0x01,0x45,0x00,0x37,0xff,0x6d,0x01,0x45,0x00,0x38,0xff,0xe5,0x01,0x45,0x00,0x39,0xff,0x8b,0x01,0x45,0x00,0x3a,0xff,0xb6,0x01,0x45,0x00,0x3c,0xff,0x64,0x01,0x45,0x00,0x3d,\r\n0x00,0x3b,0x01,0x45,0x00,0x57,0xff,0xe5,0x01,0x45,0x00,0x59,0xff,0xd5,0x01,0x45,0x00,0x5a,0xff,0xe5,0x01,0x45,0x00,0x5c,0xff,0xdb,0x01,0x45,0x00,0x8d,0xff,0x9a,0x01,0x45,0x00,0xb4,0xff,0x66,0x01,0x45,0x00,0xb5,0xff,0x3f,0x01,0x45,0x00,0xb6,0xff,0x66,0x01,0x45,0x00,0xb7,0xff,0x3f,0x01,0x45,0x00,0xba,0xff,0xc1,0x01,0x45,\r\n0x00,0xbb,0xff,0x64,0x01,0x45,0x00,0xe5,0x00,0x3b,0x01,0x45,0x00,0xea,0xff,0x64,0x01,0x45,0x00,0xeb,0xff,0xdb,0x01,0x45,0x00,0xf7,0xff,0xe5,0x01,0x45,0x00,0xfc,0xff,0xe5,0x01,0x45,0x00,0xfe,0xff,0xe5,0x01,0x45,0x01,0x18,0xff,0xe5,0x01,0x45,0x01,0x20,0xff,0x6d,0x01,0x45,0x01,0x21,0xff,0xe5,0x01,0x45,0x01,0x22,0xff,0x6d,\r\n0x01,0x45,0x01,0x23,0xff,0xe5,0x01,0x45,0x01,0x24,0xff,0xe5,0x01,0x45,0x01,0x26,0xff,0xe5,0x01,0x45,0x01,0x28,0x00,0x3b,0x01,0x45,0x01,0x2a,0x00,0x3b,0x01,0x45,0x01,0x47,0xff,0xe5,0x01,0x45,0x01,0x51,0xff,0xe5,0x01,0x45,0x01,0x53,0xff,0xe5,0x01,0x45,0x01,0x55,0xff,0xe5,0x01,0x45,0x01,0x63,0x00,0x5e,0x01,0x45,0x01,0x6e,\r\n0xff,0xe5,0x01,0x45,0x01,0x70,0xff,0xe5,0x01,0x45,0x01,0x76,0xff,0x6d,0x01,0x45,0x01,0x77,0xff,0xe5,0x01,0x45,0x01,0x78,0xff,0xe5,0x01,0x45,0x01,0x7a,0xff,0xe5,0x01,0x45,0x01,0x7c,0xff,0xe5,0x01,0x45,0x01,0x7e,0xff,0xe5,0x01,0x45,0x01,0x80,0xff,0xb6,0x01,0x45,0x01,0x81,0xff,0xe5,0x01,0x45,0x01,0x82,0xff,0x64,0x01,0x45,\r\n0x01,0x83,0xff,0xdb,0x01,0x45,0x01,0x89,0xff,0xe5,0x01,0x45,0x01,0x8c,0xff,0xb6,0x01,0x45,0x01,0x8d,0xff,0xe5,0x01,0x45,0x01,0x8e,0xff,0xb6,0x01,0x45,0x01,0x8f,0xff,0xe5,0x01,0x45,0x01,0x90,0xff,0xb6,0x01,0x45,0x01,0x91,0xff,0xe5,0x01,0x45,0x01,0x92,0xff,0x64,0x01,0x45,0x01,0x93,0xff,0xdb,0x01,0x47,0x00,0x26,0xff,0xc9,\r\n0x01,0x47,0x00,0x2a,0xff,0xc9,0x01,0x47,0x00,0x32,0xff,0xe5,0x01,0x47,0x00,0x34,0xff,0xc9,0x01,0x47,0x00,0x64,0xff,0xc9,0x01,0x47,0x00,0x67,0xff,0xc9,0x01,0x47,0x00,0x77,0x00,0x1d,0x01,0x47,0x00,0x92,0xff,0xc9,0x01,0x47,0x00,0xaa,0xff,0xcf,0x01,0x47,0x00,0xaf,0xff,0xc9,0x01,0x47,0x00,0xb0,0xff,0xc9,0x01,0x47,0x00,0xbe,\r\n0xff,0xcf,0x01,0x47,0x00,0xd0,0xff,0xc9,0x01,0x47,0x00,0xd1,0xff,0xc9,0x01,0x47,0x00,0xd2,0xff,0xc9,0x01,0x47,0x00,0xf7,0xff,0xc9,0x01,0x47,0x00,0xfc,0xff,0xc9,0x01,0x47,0x00,0xfe,0xff,0xc9,0x01,0x47,0x01,0x18,0xff,0xe5,0x01,0x47,0x01,0x47,0xff,0xc9,0x01,0x47,0x01,0x51,0xff,0xc9,0x01,0x47,0x01,0x53,0xff,0xc9,0x01,0x47,\r\n0x01,0x55,0xff,0xc9,0x01,0x47,0x01,0x5c,0x00,0x1d,0x01,0x47,0x01,0x5e,0x00,0x1d,0x01,0x47,0x01,0x60,0x00,0x1d,0x01,0x47,0x01,0x6e,0xff,0xe5,0x01,0x47,0x01,0x70,0xff,0xe5,0x01,0x47,0x01,0x89,0xff,0xe5,0x01,0x48,0x00,0x2d,0x00,0x46,0x01,0x48,0x00,0x37,0xff,0x9a,0x01,0x48,0x00,0x3c,0xff,0xb4,0x01,0x48,0x00,0xea,0xff,0xb4,\r\n0x01,0x48,0x01,0x20,0xff,0x9a,0x01,0x48,0x01,0x22,0xff,0x9a,0x01,0x48,0x01,0x63,0x00,0x46,0x01,0x48,0x01,0x76,0xff,0x9a,0x01,0x48,0x01,0x82,0xff,0xb4,0x01,0x48,0x01,0x92,0xff,0xb4,0x01,0x4b,0x00,0x24,0x00,0x0a,0x01,0x4b,0x00,0x2d,0x00,0x44,0x01,0x4b,0x00,0x37,0x00,0x04,0x01,0x4b,0x00,0x3a,0x00,0x1d,0x01,0x4b,0x00,0x3b,\r\n0x00,0x08,0x01,0x4b,0x00,0x62,0x00,0x0a,0x01,0x4b,0x00,0x63,0x00,0x0a,0x01,0x4b,0x00,0x77,0x00,0x12,0x01,0x4b,0x00,0xad,0x00,0x0a,0x01,0x4b,0x00,0xae,0x00,0x0a,0x01,0x4b,0x00,0xc7,0x00,0x0a,0x01,0x4b,0x00,0xc9,0x00,0x0a,0x01,0x4b,0x01,0x03,0x00,0x0a,0x01,0x4b,0x01,0x05,0x00,0x0a,0x01,0x4b,0x01,0x20,0x00,0x04,0x01,0x4b,\r\n0x01,0x22,0x00,0x04,0x01,0x4b,0x01,0x45,0x00,0x0a,0x01,0x4b,0x01,0x5c,0x00,0x12,0x01,0x4b,0x01,0x5e,0x00,0x12,0x01,0x4b,0x01,0x60,0x00,0x12,0x01,0x4b,0x01,0x63,0x00,0x44,0x01,0x4b,0x01,0x76,0x00,0x04,0x01,0x4b,0x01,0x80,0x00,0x1d,0x01,0x4b,0x01,0x85,0x00,0x0a,0x01,0x4b,0x01,0x87,0x00,0x0a,0x01,0x4b,0x01,0x8c,0x00,0x1d,\r\n0x01,0x4b,0x01,0x8e,0x00,0x1d,0x01,0x4b,0x01,0x90,0x00,0x1d,0x01,0x4c,0x00,0x05,0xff,0x98,0x01,0x4c,0x00,0x0a,0xff,0x98,0x01,0x4d,0x00,0x24,0x00,0x0a,0x01,0x4d,0x00,0x2d,0x00,0x44,0x01,0x4d,0x00,0x37,0x00,0x04,0x01,0x4d,0x00,0x3a,0x00,0x1d,0x01,0x4d,0x00,0x3b,0x00,0x08,0x01,0x4d,0x00,0x62,0x00,0x0a,0x01,0x4d,0x00,0x63,\r\n0x00,0x0a,0x01,0x4d,0x00,0x77,0x00,0x12,0x01,0x4d,0x00,0xad,0x00,0x0a,0x01,0x4d,0x00,0xae,0x00,0x0a,0x01,0x4d,0x00,0xc7,0x00,0x0a,0x01,0x4d,0x00,0xc9,0x00,0x0a,0x01,0x4d,0x01,0x03,0x00,0x0a,0x01,0x4d,0x01,0x05,0x00,0x0a,0x01,0x4d,0x01,0x20,0x00,0x04,0x01,0x4d,0x01,0x22,0x00,0x04,0x01,0x4d,0x01,0x45,0x00,0x0a,0x01,0x4d,\r\n0x01,0x5c,0x00,0x12,0x01,0x4d,0x01,0x5e,0x00,0x12,0x01,0x4d,0x01,0x60,0x00,0x12,0x01,0x4d,0x01,0x63,0x00,0x44,0x01,0x4d,0x01,0x76,0x00,0x04,0x01,0x4d,0x01,0x80,0x00,0x1d,0x01,0x4d,0x01,0x85,0x00,0x0a,0x01,0x4d,0x01,0x87,0x00,0x0a,0x01,0x4d,0x01,0x8c,0x00,0x1d,0x01,0x4d,0x01,0x8e,0x00,0x1d,0x01,0x4d,0x01,0x90,0x00,0x1d,\r\n0x01,0x4e,0x00,0x05,0xff,0x98,0x01,0x4e,0x00,0x0a,0xff,0x98,0x01,0x4f,0x00,0x24,0x00,0x0a,0x01,0x4f,0x00,0x2d,0x00,0x44,0x01,0x4f,0x00,0x37,0x00,0x04,0x01,0x4f,0x00,0x3a,0x00,0x1d,0x01,0x4f,0x00,0x3b,0x00,0x08,0x01,0x4f,0x00,0x62,0x00,0x0a,0x01,0x4f,0x00,0x63,0x00,0x0a,0x01,0x4f,0x00,0x77,0x00,0x12,0x01,0x4f,0x00,0xad,\r\n0x00,0x0a,0x01,0x4f,0x00,0xae,0x00,0x0a,0x01,0x4f,0x00,0xc7,0x00,0x0a,0x01,0x4f,0x00,0xc9,0x00,0x0a,0x01,0x4f,0x01,0x03,0x00,0x0a,0x01,0x4f,0x01,0x05,0x00,0x0a,0x01,0x4f,0x01,0x20,0x00,0x04,0x01,0x4f,0x01,0x22,0x00,0x04,0x01,0x4f,0x01,0x45,0x00,0x0a,0x01,0x4f,0x01,0x5c,0x00,0x12,0x01,0x4f,0x01,0x5e,0x00,0x12,0x01,0x4f,\r\n0x01,0x60,0x00,0x12,0x01,0x4f,0x01,0x63,0x00,0x44,0x01,0x4f,0x01,0x76,0x00,0x04,0x01,0x4f,0x01,0x80,0x00,0x1d,0x01,0x4f,0x01,0x85,0x00,0x0a,0x01,0x4f,0x01,0x87,0x00,0x0a,0x01,0x4f,0x01,0x8c,0x00,0x1d,0x01,0x4f,0x01,0x8e,0x00,0x1d,0x01,0x4f,0x01,0x90,0x00,0x1d,0x01,0x50,0x00,0x05,0xff,0x98,0x01,0x50,0x00,0x0a,0xff,0x98,\r\n0x01,0x51,0x00,0x37,0xff,0xcf,0x01,0x51,0x00,0x39,0xff,0xe5,0x01,0x51,0x00,0x5c,0xff,0xe5,0x01,0x51,0x00,0xba,0xff,0xe5,0x01,0x51,0x00,0xeb,0xff,0xe5,0x01,0x51,0x01,0x20,0xff,0xcf,0x01,0x51,0x01,0x22,0xff,0xcf,0x01,0x51,0x01,0x76,0xff,0xcf,0x01,0x51,0x01,0x83,0xff,0xe5,0x01,0x51,0x01,0x93,0xff,0xe5,0x01,0x52,0x00,0x4d,\r\n0x00,0x2f,0x01,0x52,0x01,0x64,0x00,0x2f,0x01,0x53,0x00,0x37,0xff,0xcf,0x01,0x53,0x00,0x39,0xff,0xe5,0x01,0x53,0x00,0x5c,0xff,0xe5,0x01,0x53,0x00,0xba,0xff,0xe5,0x01,0x53,0x00,0xeb,0xff,0xe5,0x01,0x53,0x01,0x20,0xff,0xcf,0x01,0x53,0x01,0x22,0xff,0xcf,0x01,0x53,0x01,0x76,0xff,0xcf,0x01,0x53,0x01,0x83,0xff,0xe5,0x01,0x53,\r\n0x01,0x93,0xff,0xe5,0x01,0x54,0x00,0x4d,0x00,0x2f,0x01,0x54,0x01,0x64,0x00,0x2f,0x01,0x55,0x00,0x37,0xff,0xcf,0x01,0x55,0x00,0x39,0xff,0xe5,0x01,0x55,0x00,0x5c,0xff,0xe5,0x01,0x55,0x00,0xba,0xff,0xe5,0x01,0x55,0x00,0xeb,0xff,0xe5,0x01,0x55,0x01,0x20,0xff,0xcf,0x01,0x55,0x01,0x22,0xff,0xcf,0x01,0x55,0x01,0x76,0xff,0xcf,\r\n0x01,0x55,0x01,0x83,0xff,0xe5,0x01,0x55,0x01,0x93,0xff,0xe5,0x01,0x56,0x00,0x4d,0x00,0x2f,0x01,0x56,0x01,0x64,0x00,0x2f,0x01,0x63,0x00,0x0f,0xff,0x9a,0x01,0x63,0x00,0x11,0xff,0x9a,0x01,0x63,0x00,0x24,0xff,0xdb,0x01,0x63,0x00,0x2d,0xff,0xbe,0x01,0x63,0x00,0x44,0xff,0xe5,0x01,0x63,0x00,0x62,0xff,0xdb,0x01,0x63,0x00,0x63,\r\n0xff,0xdb,0x01,0x63,0x00,0x69,0xff,0xe5,0x01,0x63,0x00,0x6a,0xff,0xe5,0x01,0x63,0x00,0x6b,0xff,0xe5,0x01,0x63,0x00,0x6c,0xff,0xe5,0x01,0x63,0x00,0x6d,0xff,0xe5,0x01,0x63,0x00,0x6e,0xff,0xe5,0x01,0x63,0x00,0x91,0xff,0x98,0x01,0x63,0x00,0xa0,0xff,0xe5,0x01,0x63,0x00,0xac,0xff,0x9a,0x01,0x63,0x00,0xad,0xff,0xdb,0x01,0x63,\r\n0x00,0xae,0xff,0xdb,0x01,0x63,0x00,0xc4,0xff,0x66,0x01,0x63,0x00,0xc5,0xff,0x9a,0x01,0x63,0x00,0xc7,0xff,0xdb,0x01,0x63,0x00,0xc9,0xff,0xdb,0x01,0x63,0x01,0x03,0xff,0xdb,0x01,0x63,0x01,0x04,0xff,0xe5,0x01,0x63,0x01,0x05,0xff,0xdb,0x01,0x63,0x01,0x06,0xff,0xe5,0x01,0x63,0x01,0x45,0xff,0xdb,0x01,0x63,0x01,0x46,0xff,0xe5,\r\n0x01,0x63,0x01,0x63,0xff,0xbe,0x01,0x63,0x01,0x85,0xff,0xdb,0x01,0x63,0x01,0x86,0xff,0xe5,0x01,0x63,0x01,0x87,0xff,0xdb,0x01,0x63,0x01,0x88,0xff,0xe5,0x01,0x64,0x00,0x4d,0x00,0x23,0x01,0x64,0x01,0x64,0x00,0x23,0x01,0x65,0x00,0x0f,0x00,0x27,0x01,0x65,0x00,0x1e,0x00,0x27,0x01,0x65,0x00,0x26,0xff,0xa6,0x01,0x65,0x00,0x2a,\r\n0xff,0xa6,0x01,0x65,0x00,0x2d,0x00,0x5a,0x01,0x65,0x00,0x32,0xff,0xa6,0x01,0x65,0x00,0x34,0xff,0xa6,0x01,0x65,0x00,0x3b,0x00,0x25,0x01,0x65,0x00,0x3d,0x00,0x27,0x01,0x65,0x00,0x46,0xff,0xe5,0x01,0x65,0x00,0x47,0xff,0xe5,0x01,0x65,0x00,0x48,0xff,0xe5,0x01,0x65,0x00,0x4a,0xff,0xe5,0x01,0x65,0x00,0x52,0xff,0xe5,0x01,0x65,\r\n0x00,0x54,0xff,0xe5,0x01,0x65,0x00,0x57,0xff,0xd1,0x01,0x65,0x00,0x59,0xff,0xb6,0x01,0x65,0x00,0x5a,0xff,0xcb,0x01,0x65,0x00,0x5c,0xff,0xa4,0x01,0x65,0x00,0x64,0xff,0x9a,0x01,0x65,0x00,0x67,0xff,0xa6,0x01,0x65,0x00,0x6f,0xff,0xe5,0x01,0x65,0x00,0x70,0xff,0xe5,0x01,0x65,0x00,0x71,0xff,0xe5,0x01,0x65,0x00,0x72,0xff,0xe5,\r\n0x01,0x65,0x00,0x73,0xff,0xe5,0x01,0x65,0x00,0x74,0xff,0xcf,0x01,0x65,0x00,0x77,0x00,0x27,0x01,0x65,0x00,0x79,0xff,0xe5,0x01,0x65,0x00,0x7a,0xff,0xe5,0x01,0x65,0x00,0x7b,0xff,0xe5,0x01,0x65,0x00,0x7c,0xff,0xe5,0x01,0x65,0x00,0x7d,0xff,0xe5,0x01,0x65,0x00,0x92,0xff,0xa6,0x01,0x65,0x00,0xaf,0xff,0xa6,0x01,0x65,0x00,0xb0,\r\n0xff,0xa6,0x01,0x65,0x00,0xb1,0xff,0xe5,0x01,0x65,0x00,0xba,0xff,0xa4,0x01,0x65,0x00,0xc4,0x00,0x44,0x01,0x65,0x00,0xc5,0x00,0x44,0x01,0x65,0x00,0xd0,0xff,0xa6,0x01,0x65,0x00,0xd1,0xff,0xa6,0x01,0x65,0x00,0xd2,0xff,0xa6,0x01,0x65,0x00,0xe5,0x00,0x27,0x01,0x65,0x00,0xeb,0xff,0xa4,0x01,0x65,0x00,0xf7,0xff,0xa6,0x01,0x65,\r\n0x00,0xf8,0xff,0xe5,0x01,0x65,0x00,0xfc,0xff,0xa6,0x01,0x65,0x00,0xfd,0xff,0xe5,0x01,0x65,0x00,0xfe,0xff,0xa6,0x01,0x65,0x00,0xff,0xff,0xe5,0x01,0x65,0x01,0x00,0xff,0xe5,0x01,0x65,0x01,0x08,0xff,0xe5,0x01,0x65,0x01,0x0b,0xff,0xe5,0x01,0x65,0x01,0x0d,0xff,0xe5,0x01,0x65,0x01,0x18,0xff,0xa6,0x01,0x65,0x01,0x19,0xff,0xe5,\r\n0x01,0x65,0x01,0x21,0xff,0xd1,0x01,0x65,0x01,0x23,0xff,0xd1,0x01,0x65,0x01,0x28,0x00,0x27,0x01,0x65,0x01,0x2a,0x00,0x27,0x01,0x65,0x01,0x47,0xff,0xa6,0x01,0x65,0x01,0x48,0xff,0xe5,0x01,0x65,0x01,0x4c,0xff,0xe5,0x01,0x65,0x01,0x4e,0xff,0xe5,0x01,0x65,0x01,0x50,0xff,0xe5,0x01,0x65,0x01,0x51,0xff,0xa6,0x01,0x65,0x01,0x52,\r\n0xff,0xe5,0x01,0x65,0x01,0x53,0xff,0xa6,0x01,0x65,0x01,0x54,0xff,0xe5,0x01,0x65,0x01,0x55,0xff,0xa6,0x01,0x65,0x01,0x56,0xff,0xe5,0x01,0x65,0x01,0x5c,0x00,0x27,0x01,0x65,0x01,0x5e,0x00,0x27,0x01,0x65,0x01,0x60,0x00,0x27,0x01,0x65,0x01,0x63,0x00,0x5a,0x01,0x65,0x01,0x6e,0xff,0xa6,0x01,0x65,0x01,0x6f,0xff,0xe5,0x01,0x65,\r\n0x01,0x70,0xff,0xa6,0x01,0x65,0x01,0x71,0xff,0xe5,0x01,0x65,0x01,0x77,0xff,0xd1,0x01,0x65,0x01,0x81,0xff,0xcb,0x01,0x65,0x01,0x83,0xff,0xa4,0x01,0x65,0x01,0x89,0xff,0xa6,0x01,0x65,0x01,0x8a,0xff,0xe5,0x01,0x65,0x01,0x8d,0xff,0xcb,0x01,0x65,0x01,0x8f,0xff,0xcb,0x01,0x65,0x01,0x91,0xff,0xcb,0x01,0x65,0x01,0x93,0xff,0xa4,\r\n0x01,0x66,0x00,0x0f,0x00,0x52,0x01,0x66,0x00,0x10,0xff,0x75,0x01,0x66,0x00,0x11,0x00,0x52,0x01,0x66,0x00,0x1d,0x00,0x52,0x01,0x66,0x00,0x1e,0x00,0x52,0x01,0x66,0x00,0x46,0xff,0xd7,0x01,0x66,0x00,0x47,0xff,0xe5,0x01,0x66,0x00,0x48,0xff,0xd7,0x01,0x66,0x00,0x4a,0xff,0xd7,0x01,0x66,0x00,0x52,0xff,0xd7,0x01,0x66,0x00,0x54,\r\n0xff,0xe5,0x01,0x66,0x00,0x57,0xff,0xf0,0x01,0x66,0x00,0x6f,0xff,0xe5,0x01,0x66,0x00,0x70,0xff,0xd7,0x01,0x66,0x00,0x71,0xff,0xd7,0x01,0x66,0x00,0x72,0xff,0xd7,0x01,0x66,0x00,0x73,0xff,0xd7,0x01,0x66,0x00,0x79,0xff,0xd7,0x01,0x66,0x00,0x7a,0xff,0xd7,0x01,0x66,0x00,0x7b,0xff,0xd7,0x01,0x66,0x00,0x7c,0xff,0xd7,0x01,0x66,\r\n0x00,0x7d,0xff,0xd7,0x01,0x66,0x00,0xac,0x00,0x52,0x01,0x66,0x00,0xb1,0xff,0xd7,0x01,0x66,0x00,0xf8,0xff,0xd7,0x01,0x66,0x00,0xfd,0xff,0xd7,0x01,0x66,0x00,0xff,0xff,0xd7,0x01,0x66,0x01,0x00,0xff,0xe5,0x01,0x66,0x01,0x08,0xff,0xe5,0x01,0x66,0x01,0x0b,0xff,0xd7,0x01,0x66,0x01,0x0d,0xff,0xd7,0x01,0x66,0x01,0x19,0xff,0xd7,\r\n0x01,0x66,0x01,0x21,0xff,0xf0,0x01,0x66,0x01,0x23,0xff,0xf0,0x01,0x66,0x01,0x48,0xff,0xd7,0x01,0x66,0x01,0x4c,0xff,0xd7,0x01,0x66,0x01,0x4e,0xff,0xd7,0x01,0x66,0x01,0x50,0xff,0xd7,0x01,0x66,0x01,0x52,0xff,0xd7,0x01,0x66,0x01,0x54,0xff,0xd7,0x01,0x66,0x01,0x56,0xff,0xd7,0x01,0x66,0x01,0x6f,0xff,0xd7,0x01,0x66,0x01,0x71,\r\n0xff,0xd7,0x01,0x66,0x01,0x77,0xff,0xf0,0x01,0x66,0x01,0x8a,0xff,0xd7,0x01,0x67,0x00,0x0f,0x00,0x52,0x01,0x67,0x00,0x10,0xff,0x75,0x01,0x67,0x00,0x11,0x00,0x52,0x01,0x67,0x00,0x1d,0x00,0x52,0x01,0x67,0x00,0x1e,0x00,0x52,0x01,0x67,0x00,0x46,0xff,0xd7,0x01,0x67,0x00,0x47,0xff,0xe5,0x01,0x67,0x00,0x48,0xff,0xd7,0x01,0x67,\r\n0x00,0x4a,0xff,0xd7,0x01,0x67,0x00,0x52,0xff,0xd7,0x01,0x67,0x00,0x54,0xff,0xe5,0x01,0x67,0x00,0x57,0xff,0xf0,0x01,0x67,0x00,0x6f,0xff,0xe5,0x01,0x67,0x00,0x70,0xff,0xd7,0x01,0x67,0x00,0x71,0xff,0xd7,0x01,0x67,0x00,0x72,0xff,0xd7,0x01,0x67,0x00,0x73,0xff,0xd7,0x01,0x67,0x00,0x79,0xff,0xd7,0x01,0x67,0x00,0x7a,0xff,0xd7,\r\n0x01,0x67,0x00,0x7b,0xff,0xd7,0x01,0x67,0x00,0x7c,0xff,0xd7,0x01,0x67,0x00,0x7d,0xff,0xd7,0x01,0x67,0x00,0xac,0x00,0x52,0x01,0x67,0x00,0xb1,0xff,0xd7,0x01,0x67,0x00,0xf8,0xff,0xd7,0x01,0x67,0x00,0xfd,0xff,0xd7,0x01,0x67,0x00,0xff,0xff,0xd7,0x01,0x67,0x01,0x00,0xff,0xe5,0x01,0x67,0x01,0x08,0xff,0xe5,0x01,0x67,0x01,0x0b,\r\n0xff,0xd7,0x01,0x67,0x01,0x0d,0xff,0xd7,0x01,0x67,0x01,0x19,0xff,0xd7,0x01,0x67,0x01,0x21,0xff,0xf0,0x01,0x67,0x01,0x23,0xff,0xf0,0x01,0x67,0x01,0x48,0xff,0xd7,0x01,0x67,0x01,0x4c,0xff,0xd7,0x01,0x67,0x01,0x4e,0xff,0xd7,0x01,0x67,0x01,0x50,0xff,0xd7,0x01,0x67,0x01,0x52,0xff,0xd7,0x01,0x67,0x01,0x54,0xff,0xd7,0x01,0x67,\r\n0x01,0x56,0xff,0xd7,0x01,0x67,0x01,0x6f,0xff,0xd7,0x01,0x67,0x01,0x71,0xff,0xd7,0x01,0x67,0x01,0x77,0xff,0xf0,0x01,0x67,0x01,0x8a,0xff,0xd7,0x01,0x68,0x00,0x0d,0xff,0x31,0x01,0x68,0x00,0x22,0xff,0x9a,0x01,0x68,0x00,0x24,0x00,0x3b,0x01,0x68,0x00,0x26,0xff,0xbe,0x01,0x68,0x00,0x2a,0xff,0xbe,0x01,0x68,0x00,0x2d,0x00,0x64,\r\n0x01,0x68,0x00,0x32,0xff,0xba,0x01,0x68,0x00,0x34,0xff,0xba,0x01,0x68,0x00,0x37,0xff,0x8f,0x01,0x68,0x00,0x38,0xff,0xe3,0x01,0x68,0x00,0x39,0xff,0x8b,0x01,0x68,0x00,0x3a,0xff,0xcf,0x01,0x68,0x00,0x3c,0xff,0x7f,0x01,0x68,0x00,0x3d,0x00,0x3b,0x01,0x68,0x00,0x57,0xff,0xe5,0x01,0x68,0x00,0x59,0xff,0x9a,0x01,0x68,0x00,0x5a,\r\n0xff,0xbe,0x01,0x68,0x00,0x5c,0xff,0xb4,0x01,0x68,0x00,0x64,0xff,0xbe,0x01,0x68,0x00,0x67,0xff,0xba,0x01,0x68,0x00,0x68,0xff,0xe3,0x01,0x68,0x00,0x8d,0xff,0x9a,0x01,0x68,0x00,0x92,0xff,0xba,0x01,0x68,0x00,0xaf,0xff,0xba,0x01,0x68,0x00,0xb0,0xff,0xba,0x01,0x68,0x00,0xb4,0xff,0x73,0x01,0x68,0x00,0xb5,0xff,0x8b,0x01,0x68,\r\n0x00,0xb6,0xff,0x73,0x01,0x68,0x00,0xb7,0xff,0x7f,0x01,0x68,0x00,0xba,0xff,0xb4,0x01,0x68,0x00,0xbb,0xff,0x9a,0x01,0x68,0x00,0xc4,0x00,0x44,0x01,0x68,0x00,0xc5,0x00,0x44,0x01,0x68,0x00,0xd0,0xff,0xba,0x01,0x68,0x00,0xd1,0xff,0xba,0x01,0x68,0x00,0xd2,0xff,0xba,0x01,0x68,0x00,0xd3,0xff,0xe3,0x01,0x68,0x00,0xd4,0xff,0xe3,\r\n0x01,0x68,0x00,0xd5,0xff,0xe3,0x01,0x68,0x00,0xe5,0x00,0x3b,0x01,0x68,0x00,0xea,0xff,0x7f,0x01,0x68,0x00,0xeb,0xff,0xb4,0x01,0x68,0x00,0xf7,0xff,0xbe,0x01,0x68,0x00,0xfc,0xff,0xbe,0x01,0x68,0x00,0xfe,0xff,0xbe,0x01,0x68,0x01,0x03,0x00,0x3b,0x01,0x68,0x01,0x05,0x00,0x3b,0x01,0x68,0x01,0x18,0xff,0xba,0x01,0x68,0x01,0x20,\r\n0xff,0x8f,0x01,0x68,0x01,0x21,0xff,0xe5,0x01,0x68,0x01,0x22,0xff,0x8f,0x01,0x68,0x01,0x23,0xff,0xe5,0x01,0x68,0x01,0x24,0xff,0xe3,0x01,0x68,0x01,0x26,0xff,0xe3,0x01,0x68,0x01,0x28,0x00,0x3b,0x01,0x68,0x01,0x2a,0x00,0x3b,0x01,0x68,0x01,0x45,0x00,0x3b,0x01,0x68,0x01,0x47,0xff,0xbe,0x01,0x68,0x01,0x51,0xff,0xbe,0x01,0x68,\r\n0x01,0x53,0xff,0xbe,0x01,0x68,0x01,0x55,0xff,0xbe,0x01,0x68,0x01,0x63,0x00,0x64,0x01,0x68,0x01,0x6e,0xff,0xba,0x01,0x68,0x01,0x70,0xff,0xba,0x01,0x68,0x01,0x76,0xff,0x8f,0x01,0x68,0x01,0x77,0xff,0xe5,0x01,0x68,0x01,0x78,0xff,0xe3,0x01,0x68,0x01,0x7a,0xff,0xe3,0x01,0x68,0x01,0x7c,0xff,0xe3,0x01,0x68,0x01,0x7e,0xff,0xe3,\r\n0x01,0x68,0x01,0x80,0xff,0xcf,0x01,0x68,0x01,0x81,0xff,0xbe,0x01,0x68,0x01,0x82,0xff,0x7f,0x01,0x68,0x01,0x83,0xff,0xb4,0x01,0x68,0x01,0x85,0x00,0x3b,0x01,0x68,0x01,0x87,0x00,0x3b,0x01,0x68,0x01,0x89,0xff,0xba,0x01,0x68,0x01,0x8c,0xff,0xcf,0x01,0x68,0x01,0x8d,0xff,0xbe,0x01,0x68,0x01,0x8e,0xff,0xcf,0x01,0x68,0x01,0x8f,\r\n0xff,0xbe,0x01,0x68,0x01,0x90,0xff,0xcf,0x01,0x68,0x01,0x91,0xff,0xbe,0x01,0x68,0x01,0x92,0xff,0x7f,0x01,0x68,0x01,0x93,0xff,0xb4,0x01,0x6c,0x00,0x0f,0xff,0x9a,0x01,0x6c,0x00,0x11,0xff,0x9a,0x01,0x6c,0x00,0x24,0xff,0xdb,0x01,0x6c,0x00,0x2d,0xff,0xbe,0x01,0x6c,0x00,0x44,0xff,0xe5,0x01,0x6c,0x00,0x62,0xff,0xdb,0x01,0x6c,\r\n0x00,0x63,0xff,0xdb,0x01,0x6c,0x00,0x69,0xff,0xe5,0x01,0x6c,0x00,0x6a,0xff,0xe5,0x01,0x6c,0x00,0x6b,0xff,0xe5,0x01,0x6c,0x00,0x6c,0xff,0xe5,0x01,0x6c,0x00,0x6d,0xff,0xe5,0x01,0x6c,0x00,0x6e,0xff,0xe5,0x01,0x6c,0x00,0x91,0xff,0x98,0x01,0x6c,0x00,0xa0,0xff,0xe5,0x01,0x6c,0x00,0xac,0xff,0x9a,0x01,0x6c,0x00,0xad,0xff,0xdb,\r\n0x01,0x6c,0x00,0xae,0xff,0xdb,0x01,0x6c,0x00,0xc4,0xff,0x66,0x01,0x6c,0x00,0xc5,0xff,0x9a,0x01,0x6c,0x00,0xc7,0xff,0xdb,0x01,0x6c,0x00,0xc9,0xff,0xdb,0x01,0x6c,0x01,0x03,0xff,0xdb,0x01,0x6c,0x01,0x04,0xff,0xe5,0x01,0x6c,0x01,0x05,0xff,0xdb,0x01,0x6c,0x01,0x06,0xff,0xe5,0x01,0x6c,0x01,0x45,0xff,0xdb,0x01,0x6c,0x01,0x46,\r\n0xff,0xe5,0x01,0x6c,0x01,0x63,0xff,0xbe,0x01,0x6c,0x01,0x85,0xff,0xdb,0x01,0x6c,0x01,0x86,0xff,0xe5,0x01,0x6c,0x01,0x87,0xff,0xdb,0x01,0x6c,0x01,0x88,0xff,0xe5,0x01,0x6d,0x00,0x4d,0x00,0x23,0x01,0x6d,0x01,0x64,0x00,0x23,0x01,0x6e,0x00,0x0f,0xff,0xa4,0x01,0x6e,0x00,0x11,0xff,0xa4,0x01,0x6e,0x00,0x24,0xff,0xe5,0x01,0x6e,\r\n0x00,0x2d,0xff,0xf6,0x01,0x6e,0x00,0x37,0xff,0xa4,0x01,0x6e,0x00,0x3b,0xff,0xdb,0x01,0x6e,0x00,0x3c,0xff,0xe7,0x01,0x6e,0x00,0x3d,0xff,0xcf,0x01,0x6e,0x00,0x62,0xff,0xe5,0x01,0x6e,0x00,0x63,0xff,0xe5,0x01,0x6e,0x00,0xac,0xff,0xa4,0x01,0x6e,0x00,0xad,0xff,0xe5,0x01,0x6e,0x00,0xae,0xff,0xe5,0x01,0x6e,0x00,0xbb,0xff,0xf6,\r\n0x01,0x6e,0x00,0xc4,0xff,0x4c,0x01,0x6e,0x00,0xc5,0xff,0x98,0x01,0x6e,0x00,0xc7,0xff,0xe5,0x01,0x6e,0x00,0xc9,0xff,0xe5,0x01,0x6e,0x00,0xe5,0xff,0xcf,0x01,0x6e,0x00,0xea,0xff,0xe7,0x01,0x6e,0x01,0x03,0xff,0xe5,0x01,0x6e,0x01,0x05,0xff,0xe5,0x01,0x6e,0x01,0x20,0xff,0xa4,0x01,0x6e,0x01,0x22,0xff,0xa4,0x01,0x6e,0x01,0x28,\r\n0xff,0xcf,0x01,0x6e,0x01,0x2a,0xff,0xcf,0x01,0x6e,0x01,0x45,0xff,0xe5,0x01,0x6e,0x01,0x63,0xff,0xf6,0x01,0x6e,0x01,0x76,0xff,0xa4,0x01,0x6e,0x01,0x82,0xff,0xe7,0x01,0x6e,0x01,0x85,0xff,0xe5,0x01,0x6e,0x01,0x87,0xff,0xe5,0x01,0x6e,0x01,0x92,0xff,0xe7,0x01,0x6f,0x00,0x05,0xff,0x6f,0x01,0x6f,0x00,0x0a,0xff,0x6f,0x01,0x6f,\r\n0x00,0x44,0xff,0xe5,0x01,0x6f,0x00,0x49,0xff,0xdb,0x01,0x6f,0x00,0x5b,0xff,0xe7,0x01,0x6f,0x00,0x69,0xff,0xe5,0x01,0x6f,0x00,0x6a,0xff,0xe5,0x01,0x6f,0x00,0x6b,0xff,0xe5,0x01,0x6f,0x00,0x6c,0xff,0xe5,0x01,0x6f,0x00,0x6d,0xff,0xe5,0x01,0x6f,0x00,0x6e,0xff,0xe5,0x01,0x6f,0x00,0xa0,0xff,0xe5,0x01,0x6f,0x00,0xb4,0xff,0xb2,\r\n0x01,0x6f,0x00,0xb5,0xff,0x7d,0x01,0x6f,0x00,0xb6,0xff,0xbe,0x01,0x6f,0x00,0xb7,0xff,0x7d,0x01,0x6f,0x00,0xc0,0xff,0xe7,0x01,0x6f,0x00,0xc1,0xff,0xe7,0x01,0x6f,0x01,0x04,0xff,0xe5,0x01,0x6f,0x01,0x06,0xff,0xe5,0x01,0x6f,0x01,0x46,0xff,0xe5,0x01,0x6f,0x01,0x86,0xff,0xe5,0x01,0x6f,0x01,0x88,0xff,0xe5,0x01,0x70,0x00,0x0f,\r\n0xff,0xa4,0x01,0x70,0x00,0x11,0xff,0xa4,0x01,0x70,0x00,0x24,0xff,0xe5,0x01,0x70,0x00,0x2d,0xff,0xf6,0x01,0x70,0x00,0x37,0xff,0xa4,0x01,0x70,0x00,0x3b,0xff,0xdb,0x01,0x70,0x00,0x3c,0xff,0xe7,0x01,0x70,0x00,0x3d,0xff,0xcf,0x01,0x70,0x00,0x62,0xff,0xe5,0x01,0x70,0x00,0x63,0xff,0xe5,0x01,0x70,0x00,0xac,0xff,0xa4,0x01,0x70,\r\n0x00,0xad,0xff,0xe5,0x01,0x70,0x00,0xae,0xff,0xe5,0x01,0x70,0x00,0xbb,0xff,0xf6,0x01,0x70,0x00,0xc4,0xff,0x4c,0x01,0x70,0x00,0xc5,0xff,0x98,0x01,0x70,0x00,0xc7,0xff,0xe5,0x01,0x70,0x00,0xc9,0xff,0xe5,0x01,0x70,0x00,0xe5,0xff,0xcf,0x01,0x70,0x00,0xea,0xff,0xe7,0x01,0x70,0x01,0x03,0xff,0xe5,0x01,0x70,0x01,0x05,0xff,0xe5,\r\n0x01,0x70,0x01,0x20,0xff,0xa4,0x01,0x70,0x01,0x22,0xff,0xa4,0x01,0x70,0x01,0x28,0xff,0xcf,0x01,0x70,0x01,0x2a,0xff,0xcf,0x01,0x70,0x01,0x45,0xff,0xe5,0x01,0x70,0x01,0x63,0xff,0xf6,0x01,0x70,0x01,0x76,0xff,0xa4,0x01,0x70,0x01,0x82,0xff,0xe7,0x01,0x70,0x01,0x85,0xff,0xe5,0x01,0x70,0x01,0x87,0xff,0xe5,0x01,0x70,0x01,0x92,\r\n0xff,0xe7,0x01,0x71,0x00,0x05,0xff,0x6f,0x01,0x71,0x00,0x0a,0xff,0x6f,0x01,0x71,0x00,0x44,0xff,0xe5,0x01,0x71,0x00,0x49,0xff,0xdb,0x01,0x71,0x00,0x5b,0xff,0xe7,0x01,0x71,0x00,0x69,0xff,0xe5,0x01,0x71,0x00,0x6a,0xff,0xe5,0x01,0x71,0x00,0x6b,0xff,0xe5,0x01,0x71,0x00,0x6c,0xff,0xe5,0x01,0x71,0x00,0x6d,0xff,0xe5,0x01,0x71,\r\n0x00,0x6e,0xff,0xe5,0x01,0x71,0x00,0xa0,0xff,0xe5,0x01,0x71,0x00,0xb4,0xff,0xb2,0x01,0x71,0x00,0xb5,0xff,0x7d,0x01,0x71,0x00,0xb6,0xff,0xbe,0x01,0x71,0x00,0xb7,0xff,0x7d,0x01,0x71,0x00,0xc0,0xff,0xe7,0x01,0x71,0x00,0xc1,0xff,0xe7,0x01,0x71,0x01,0x04,0xff,0xe5,0x01,0x71,0x01,0x06,0xff,0xe5,0x01,0x71,0x01,0x46,0xff,0xe5,\r\n0x01,0x71,0x01,0x86,0xff,0xe5,0x01,0x71,0x01,0x88,0xff,0xe5,0x01,0x72,0x00,0x1e,0x00,0x52,0x01,0x72,0x00,0x26,0xff,0xe3,0x01,0x72,0x00,0x2a,0xff,0xe3,0x01,0x72,0x00,0x2d,0x00,0x39,0x01,0x72,0x00,0x32,0xff,0xec,0x01,0x72,0x00,0x34,0xff,0xec,0x01,0x72,0x00,0x37,0xff,0xcb,0x01,0x72,0x00,0x3c,0xff,0xd9,0x01,0x72,0x00,0x46,\r\n0xff,0xcb,0x01,0x72,0x00,0x47,0xff,0xcb,0x01,0x72,0x00,0x48,0xff,0xc7,0x01,0x72,0x00,0x4a,0xff,0xc7,0x01,0x72,0x00,0x52,0xff,0xc5,0x01,0x72,0x00,0x54,0xff,0xcb,0x01,0x72,0x00,0x64,0xff,0xe5,0x01,0x72,0x00,0x67,0xff,0xec,0x01,0x72,0x00,0x6f,0xff,0xbe,0x01,0x72,0x00,0x70,0xff,0xbe,0x01,0x72,0x00,0x71,0xff,0xbe,0x01,0x72,\r\n0x00,0x72,0xff,0xbe,0x01,0x72,0x00,0x73,0xff,0xbe,0x01,0x72,0x00,0x79,0xff,0xc5,0x01,0x72,0x00,0x7a,0xff,0xc5,0x01,0x72,0x00,0x7b,0xff,0xc5,0x01,0x72,0x00,0x7c,0xff,0xc5,0x01,0x72,0x00,0x7d,0xff,0xc5,0x01,0x72,0x00,0x92,0xff,0xec,0x01,0x72,0x00,0xaf,0xff,0xec,0x01,0x72,0x00,0xb0,0xff,0xec,0x01,0x72,0x00,0xb1,0xff,0xc5,\r\n0x01,0x72,0x00,0xbb,0xff,0xe5,0x01,0x72,0x00,0xd0,0xff,0xec,0x01,0x72,0x00,0xd1,0xff,0xec,0x01,0x72,0x00,0xd2,0xff,0xec,0x01,0x72,0x00,0xea,0xff,0xd9,0x01,0x72,0x00,0xf7,0xff,0xe3,0x01,0x72,0x00,0xf8,0xff,0xc7,0x01,0x72,0x00,0xfc,0xff,0xe3,0x01,0x72,0x00,0xfd,0xff,0xcb,0x01,0x72,0x00,0xfe,0xff,0xe3,0x01,0x72,0x00,0xff,\r\n0xff,0xcb,0x01,0x72,0x01,0x00,0xff,0xcb,0x01,0x72,0x01,0x08,0xff,0xcb,0x01,0x72,0x01,0x0b,0xff,0xc7,0x01,0x72,0x01,0x0d,0xff,0xbe,0x01,0x72,0x01,0x18,0xff,0xec,0x01,0x72,0x01,0x19,0xff,0xc5,0x01,0x72,0x01,0x20,0xff,0xcb,0x01,0x72,0x01,0x22,0xff,0xcb,0x01,0x72,0x01,0x47,0xff,0xe3,0x01,0x72,0x01,0x48,0xff,0xcb,0x01,0x72,\r\n0x01,0x4c,0xff,0xbe,0x01,0x72,0x01,0x4e,0xff,0xbe,0x01,0x72,0x01,0x50,0xff,0xbe,0x01,0x72,0x01,0x51,0xff,0xe3,0x01,0x72,0x01,0x52,0xff,0xc7,0x01,0x72,0x01,0x53,0xff,0xe3,0x01,0x72,0x01,0x54,0xff,0xc7,0x01,0x72,0x01,0x55,0xff,0xe3,0x01,0x72,0x01,0x56,0xff,0xc7,0x01,0x72,0x01,0x63,0x00,0x39,0x01,0x72,0x01,0x6e,0xff,0xec,\r\n0x01,0x72,0x01,0x6f,0xff,0xc5,0x01,0x72,0x01,0x70,0xff,0xec,0x01,0x72,0x01,0x71,0xff,0xc5,0x01,0x72,0x01,0x76,0xff,0xcb,0x01,0x72,0x01,0x82,0xff,0xd9,0x01,0x72,0x01,0x89,0xff,0xec,0x01,0x72,0x01,0x8a,0xff,0xc5,0x01,0x72,0x01,0x92,0xff,0xd9,0x01,0x73,0x00,0x0f,0xff,0x62,0x01,0x73,0x00,0x10,0xff,0x7f,0x01,0x73,0x00,0x11,\r\n0xff,0x56,0x01,0x73,0x00,0x1d,0x00,0x52,0x01,0x73,0x00,0x1e,0x00,0x52,0x01,0x73,0x00,0x46,0xff,0xe5,0x01,0x73,0x00,0x47,0xff,0xe5,0x01,0x73,0x00,0x48,0xff,0xe5,0x01,0x73,0x00,0x49,0x00,0x27,0x01,0x73,0x00,0x4a,0xff,0xe5,0x01,0x73,0x00,0x50,0xff,0xfc,0x01,0x73,0x00,0x51,0xff,0xfc,0x01,0x73,0x00,0x52,0xff,0xe5,0x01,0x73,\r\n0x00,0x54,0xff,0xe5,0x01,0x73,0x00,0x56,0x00,0x0e,0x01,0x73,0x00,0x57,0x00,0x3b,0x01,0x73,0x00,0x59,0x00,0x52,0x01,0x73,0x00,0x5a,0x00,0x52,0x01,0x73,0x00,0x5b,0x00,0x3b,0x01,0x73,0x00,0x5c,0x00,0x52,0x01,0x73,0x00,0x5d,0x00,0x27,0x01,0x73,0x00,0x6f,0xff,0xe5,0x01,0x73,0x00,0x70,0xff,0xe5,0x01,0x73,0x00,0x71,0xff,0xe5,\r\n0x01,0x73,0x00,0x72,0xff,0xe5,0x01,0x73,0x00,0x73,0xff,0xe5,0x01,0x73,0x00,0x79,0xff,0xe5,0x01,0x73,0x00,0x7a,0xff,0xe5,0x01,0x73,0x00,0x7b,0xff,0xe5,0x01,0x73,0x00,0x7c,0xff,0xe5,0x01,0x73,0x00,0x7d,0xff,0xe5,0x01,0x73,0x00,0xac,0xff,0x56,0x01,0x73,0x00,0xb1,0xff,0xe5,0x01,0x73,0x00,0xb4,0x00,0xa4,0x01,0x73,0x00,0xb5,\r\n0x00,0x79,0x01,0x73,0x00,0xb6,0x00,0xa4,0x01,0x73,0x00,0xb7,0x00,0x79,0x01,0x73,0x00,0xc4,0xff,0x62,0x01,0x73,0x00,0xc5,0xff,0x62,0x01,0x73,0x00,0xe4,0x00,0x0e,0x01,0x73,0x00,0xe6,0x00,0x27,0x01,0x73,0x00,0xeb,0x00,0x52,0x01,0x73,0x00,0xf8,0xff,0xe5,0x01,0x73,0x00,0xfb,0x00,0x0e,0x01,0x73,0x00,0xfd,0xff,0xe5,0x01,0x73,\r\n0x00,0xff,0xff,0xe5,0x01,0x73,0x01,0x00,0xff,0xe5,0x01,0x73,0x01,0x08,0xff,0xe5,0x01,0x73,0x01,0x0b,0xff,0xe5,0x01,0x73,0x01,0x0d,0xff,0xe5,0x01,0x73,0x01,0x19,0xff,0xe5,0x01,0x73,0x01,0x1f,0x00,0x0e,0x01,0x73,0x01,0x21,0x00,0x3b,0x01,0x73,0x01,0x23,0x00,0x3b,0x01,0x73,0x01,0x29,0x00,0x27,0x01,0x73,0x01,0x2b,0x00,0x27,\r\n0x01,0x73,0x01,0x48,0xff,0xe5,0x01,0x73,0x01,0x4c,0xff,0xe5,0x01,0x73,0x01,0x4e,0xff,0xe5,0x01,0x73,0x01,0x50,0xff,0xe5,0x01,0x73,0x01,0x52,0xff,0xe5,0x01,0x73,0x01,0x54,0xff,0xe5,0x01,0x73,0x01,0x56,0xff,0xe5,0x01,0x73,0x01,0x6d,0xff,0xfc,0x01,0x73,0x01,0x6f,0xff,0xe5,0x01,0x73,0x01,0x71,0xff,0xe5,0x01,0x73,0x01,0x75,\r\n0x00,0x0e,0x01,0x73,0x01,0x77,0x00,0x3b,0x01,0x73,0x01,0x81,0x00,0x52,0x01,0x73,0x01,0x83,0x00,0x52,0x01,0x73,0x01,0x8a,0xff,0xe5,0x01,0x73,0x01,0x8d,0x00,0x52,0x01,0x73,0x01,0x8f,0x00,0x52,0x01,0x73,0x01,0x91,0x00,0x52,0x01,0x73,0x01,0x93,0x00,0x52,0x01,0x73,0x02,0x3e,0x00,0x0e,0x01,0x74,0x00,0x57,0xff,0xbe,0x01,0x74,\r\n0x00,0x59,0xff,0xcf,0x01,0x74,0x00,0x5a,0xff,0xe5,0x01,0x74,0x00,0x5c,0xff,0xd1,0x01,0x74,0x00,0xba,0xff,0xbe,0x01,0x74,0x00,0xc4,0xff,0xb2,0x01,0x74,0x00,0xc5,0xff,0xb2,0x01,0x74,0x00,0xeb,0xff,0xd1,0x01,0x74,0x01,0x21,0xff,0xbe,0x01,0x74,0x01,0x23,0xff,0xbe,0x01,0x74,0x01,0x77,0xff,0xbe,0x01,0x74,0x01,0x81,0xff,0xe5,\r\n0x01,0x74,0x01,0x83,0xff,0xd1,0x01,0x74,0x01,0x8d,0xff,0xe5,0x01,0x74,0x01,0x8f,0xff,0xe5,0x01,0x74,0x01,0x91,0xff,0xe5,0x01,0x74,0x01,0x93,0xff,0xd1,0x01,0x76,0x00,0x0f,0xff,0x7f,0x01,0x76,0x00,0x11,0xff,0x4c,0x01,0x76,0x00,0x1d,0xff,0xe9,0x01,0x76,0x00,0x1e,0xff,0xe9,0x01,0x76,0x00,0x24,0xff,0x66,0x01,0x76,0x00,0x26,\r\n0xff,0xa4,0x01,0x76,0x00,0x2a,0xff,0xa4,0x01,0x76,0x00,0x2d,0xff,0x8f,0x01,0x76,0x00,0x32,0xff,0xa4,0x01,0x76,0x00,0x34,0xff,0xa4,0x01,0x76,0x00,0x37,0x00,0x27,0x01,0x76,0x00,0x39,0x00,0x2b,0x01,0x76,0x00,0x3a,0x00,0x27,0x01,0x76,0x00,0x3b,0xff,0xfa,0x01,0x76,0x00,0x3c,0x00,0x1d,0x01,0x76,0x00,0x44,0xff,0x27,0x01,0x76,\r\n0x00,0x46,0xff,0x2d,0x01,0x76,0x00,0x47,0xff,0x2d,0x01,0x76,0x00,0x48,0xff,0x2d,0x01,0x76,0x00,0x49,0xff,0xa0,0x01,0x76,0x00,0x4a,0xff,0x2d,0x01,0x76,0x00,0x50,0xff,0x4e,0x01,0x76,0x00,0x51,0xff,0x4e,0x01,0x76,0x00,0x52,0xff,0x2d,0x01,0x76,0x00,0x53,0xff,0x4e,0x01,0x76,0x00,0x54,0xff,0x2d,0x01,0x76,0x00,0x55,0xff,0x4e,\r\n0x01,0x76,0x00,0x56,0xff,0x66,0x01,0x76,0x00,0x58,0xff,0x4e,0x01,0x76,0x00,0x59,0xff,0x9a,0x01,0x76,0x00,0x5a,0xff,0x8f,0x01,0x76,0x00,0x5b,0xff,0x4c,0x01,0x76,0x00,0x5c,0xff,0x8f,0x01,0x76,0x00,0x5d,0xff,0x7f,0x01,0x76,0x00,0x62,0xff,0x66,0x01,0x76,0x00,0x63,0xff,0x66,0x01,0x76,0x00,0x64,0xff,0xa4,0x01,0x76,0x00,0x67,\r\n0xff,0xa4,0x01,0x76,0x00,0x69,0xff,0x27,0x01,0x76,0x00,0x6a,0xff,0x27,0x01,0x76,0x00,0x6b,0xff,0x27,0x01,0x76,0x00,0x6c,0xff,0x27,0x01,0x76,0x00,0x6d,0xff,0x3f,0x01,0x76,0x00,0x6e,0xff,0x27,0x01,0x76,0x00,0x6f,0xff,0x1b,0x01,0x76,0x00,0x70,0xff,0x2d,0x01,0x76,0x00,0x71,0xff,0x2d,0x01,0x76,0x00,0x72,0xff,0x2d,0x01,0x76,\r\n0x00,0x73,0xff,0x2d,0x01,0x76,0x00,0x74,0xff,0xe9,0x01,0x76,0x00,0x76,0x00,0x31,0x01,0x76,0x00,0x77,0x00,0x6f,0x01,0x76,0x00,0x78,0xff,0x4e,0x01,0x76,0x00,0x79,0xff,0x2d,0x01,0x76,0x00,0x7a,0xff,0x2d,0x01,0x76,0x00,0x7b,0xff,0x2d,0x01,0x76,0x00,0x7c,0xff,0x2d,0x01,0x76,0x00,0x7d,0xff,0x2d,0x01,0x76,0x00,0x7e,0xff,0x4e,\r\n0x01,0x76,0x00,0x7f,0xff,0x4e,0x01,0x76,0x00,0x80,0xff,0x4e,0x01,0x76,0x00,0x81,0xff,0x4e,0x01,0x76,0x00,0x8d,0x00,0x52,0x01,0x76,0x00,0x91,0xff,0x0c,0x01,0x76,0x00,0x92,0xff,0xa4,0x01,0x76,0x00,0xa0,0xff,0x27,0x01,0x76,0x00,0xaa,0xff,0x9a,0x01,0x76,0x00,0xab,0xff,0xcf,0x01,0x76,0x00,0xac,0xff,0x4c,0x01,0x76,0x00,0xad,\r\n0xff,0x66,0x01,0x76,0x00,0xae,0xff,0x66,0x01,0x76,0x00,0xaf,0xff,0xa4,0x01,0x76,0x00,0xb0,0xff,0xa4,0x01,0x76,0x00,0xb1,0xff,0x2d,0x01,0x76,0x00,0xb5,0x00,0x27,0x01,0x76,0x00,0xb7,0x00,0x27,0x01,0x76,0x00,0xba,0xff,0x8f,0x01,0x76,0x00,0xbe,0xff,0x9a,0x01,0x76,0x00,0xbf,0xff,0xcf,0x01,0x76,0x00,0xc4,0xff,0x17,0x01,0x76,\r\n0x00,0xc5,0xff,0x17,0x01,0x76,0x00,0xc7,0xff,0x66,0x01,0x76,0x00,0xc9,0xff,0x66,0x01,0x76,0x00,0xd0,0xff,0xa4,0x01,0x76,0x00,0xd1,0xff,0xa4,0x01,0x76,0x00,0xd2,0xff,0xa4,0x01,0x76,0x00,0xe4,0xff,0x66,0x01,0x76,0x00,0xe6,0xff,0x7f,0x01,0x76,0x00,0xea,0x00,0x1d,0x01,0x76,0x00,0xeb,0xff,0x8f,0x01,0x76,0x00,0xf7,0xff,0xa4,\r\n0x01,0x76,0x00,0xf8,0xff,0x2d,0x01,0x76,0x00,0xfb,0xff,0x66,0x01,0x76,0x00,0xfc,0xff,0xa4,0x01,0x76,0x00,0xfd,0xff,0x2d,0x01,0x76,0x00,0xfe,0xff,0xa4,0x01,0x76,0x00,0xff,0xff,0x2d,0x01,0x76,0x01,0x00,0xff,0x2d,0x01,0x76,0x01,0x03,0xff,0x66,0x01,0x76,0x01,0x04,0xff,0x27,0x01,0x76,0x01,0x05,0xff,0x66,0x01,0x76,0x01,0x06,\r\n0xff,0x27,0x01,0x76,0x01,0x08,0xff,0x2d,0x01,0x76,0x01,0x0b,0xff,0x2d,0x01,0x76,0x01,0x0d,0xff,0x2d,0x01,0x76,0x01,0x15,0xff,0x4e,0x01,0x76,0x01,0x17,0xff,0x4e,0x01,0x76,0x01,0x18,0xff,0xa4,0x01,0x76,0x01,0x19,0xff,0x2d,0x01,0x76,0x01,0x1b,0xff,0x4e,0x01,0x76,0x01,0x1d,0xff,0x4e,0x01,0x76,0x01,0x1f,0xff,0x66,0x01,0x76,\r\n0x01,0x20,0x00,0x27,0x01,0x76,0x01,0x22,0x00,0x27,0x01,0x76,0x01,0x25,0xff,0x4e,0x01,0x76,0x01,0x27,0xff,0x4e,0x01,0x76,0x01,0x29,0xff,0x7f,0x01,0x76,0x01,0x2b,0xff,0x7f,0x01,0x76,0x01,0x45,0xff,0x66,0x01,0x76,0x01,0x46,0xff,0x27,0x01,0x76,0x01,0x47,0xff,0xa4,0x01,0x76,0x01,0x48,0xff,0x2d,0x01,0x76,0x01,0x4c,0xff,0x2d,\r\n0x01,0x76,0x01,0x4e,0xff,0x2d,0x01,0x76,0x01,0x50,0xff,0x2d,0x01,0x76,0x01,0x51,0xff,0xa4,0x01,0x76,0x01,0x52,0xff,0x2d,0x01,0x76,0x01,0x53,0xff,0xa4,0x01,0x76,0x01,0x54,0xff,0x2d,0x01,0x76,0x01,0x55,0xff,0xa4,0x01,0x76,0x01,0x56,0xff,0x2d,0x01,0x76,0x01,0x5c,0x00,0x6f,0x01,0x76,0x01,0x5e,0x00,0x6f,0x01,0x76,0x01,0x60,\r\n0x00,0x6f,0x01,0x76,0x01,0x63,0xff,0x8f,0x01,0x76,0x01,0x6d,0xff,0x4e,0x01,0x76,0x01,0x6e,0xff,0xa4,0x01,0x76,0x01,0x6f,0xff,0x2d,0x01,0x76,0x01,0x70,0xff,0xa4,0x01,0x76,0x01,0x71,0xff,0x2d,0x01,0x76,0x01,0x73,0xff,0x4e,0x01,0x76,0x01,0x75,0xff,0x66,0x01,0x76,0x01,0x76,0x00,0x27,0x01,0x76,0x01,0x79,0xff,0x4e,0x01,0x76,\r\n0x01,0x7b,0xff,0x4e,0x01,0x76,0x01,0x7d,0xff,0x4e,0x01,0x76,0x01,0x7f,0xff,0x4e,0x01,0x76,0x01,0x80,0x00,0x27,0x01,0x76,0x01,0x81,0xff,0x8f,0x01,0x76,0x01,0x82,0x00,0x1d,0x01,0x76,0x01,0x83,0xff,0x8f,0x01,0x76,0x01,0x85,0xff,0x66,0x01,0x76,0x01,0x86,0xff,0x27,0x01,0x76,0x01,0x87,0xff,0x66,0x01,0x76,0x01,0x88,0xff,0x27,\r\n0x01,0x76,0x01,0x89,0xff,0xa4,0x01,0x76,0x01,0x8a,0xff,0x2d,0x01,0x76,0x01,0x8c,0x00,0x27,0x01,0x76,0x01,0x8d,0xff,0x8f,0x01,0x76,0x01,0x8e,0x00,0x27,0x01,0x76,0x01,0x8f,0xff,0x8f,0x01,0x76,0x01,0x90,0x00,0x27,0x01,0x76,0x01,0x91,0xff,0x8f,0x01,0x76,0x01,0x92,0x00,0x1d,0x01,0x76,0x01,0x93,0xff,0x8f,0x01,0x76,0x02,0x3e,\r\n0xff,0x66,0x01,0x77,0x00,0x10,0xff,0x8f,0x01,0x77,0x00,0x22,0xff,0xcb,0x01,0x77,0x00,0x46,0xff,0xe5,0x01,0x77,0x00,0x47,0xff,0xe5,0x01,0x77,0x00,0x48,0xff,0xf0,0x01,0x77,0x00,0x4a,0xff,0xf0,0x01,0x77,0x00,0x52,0xff,0xf0,0x01,0x77,0x00,0x54,0xff,0xf0,0x01,0x77,0x00,0x5b,0x00,0x1d,0x01,0x77,0x00,0x6f,0xff,0xe5,0x01,0x77,\r\n0x00,0x70,0xff,0xf0,0x01,0x77,0x00,0x71,0xff,0xf0,0x01,0x77,0x00,0x72,0xff,0xf0,0x01,0x77,0x00,0x73,0xff,0xf0,0x01,0x77,0x00,0x79,0xff,0xf0,0x01,0x77,0x00,0x7a,0xff,0xf0,0x01,0x77,0x00,0x7b,0xff,0xf0,0x01,0x77,0x00,0x7c,0xff,0xf0,0x01,0x77,0x00,0x7d,0xff,0xf0,0x01,0x77,0x00,0xab,0x00,0x27,0x01,0x77,0x00,0xb1,0xff,0xf0,\r\n0x01,0x77,0x00,0xbf,0x00,0x27,0x01,0x77,0x00,0xf8,0xff,0xf0,0x01,0x77,0x00,0xfd,0xff,0xe5,0x01,0x77,0x00,0xff,0xff,0xe5,0x01,0x77,0x01,0x00,0xff,0xe5,0x01,0x77,0x01,0x08,0xff,0xe5,0x01,0x77,0x01,0x0b,0xff,0xf0,0x01,0x77,0x01,0x0d,0xff,0xf0,0x01,0x77,0x01,0x19,0xff,0xf0,0x01,0x77,0x01,0x48,0xff,0xe5,0x01,0x77,0x01,0x4c,\r\n0xff,0xf0,0x01,0x77,0x01,0x4e,0xff,0xf0,0x01,0x77,0x01,0x50,0xff,0xf0,0x01,0x77,0x01,0x52,0xff,0xf0,0x01,0x77,0x01,0x54,0xff,0xf0,0x01,0x77,0x01,0x56,0xff,0xf0,0x01,0x77,0x01,0x6f,0xff,0xf0,0x01,0x77,0x01,0x71,0xff,0xf0,0x01,0x77,0x01,0x8a,0xff,0xf0,0x01,0x78,0x00,0x24,0xff,0xd7,0x01,0x78,0x00,0x91,0xff,0x8b,0x01,0x78,\r\n0x00,0xc4,0xff,0xa6,0x01,0x78,0x00,0xc5,0xff,0xa6,0x01,0x78,0x01,0x03,0xff,0xd7,0x01,0x78,0x01,0x05,0xff,0xd7,0x01,0x78,0x01,0x45,0xff,0xd7,0x01,0x78,0x01,0x85,0xff,0xd7,0x01,0x78,0x01,0x87,0xff,0xd7,0x01,0x79,0x00,0x05,0xff,0xbe,0x01,0x79,0x00,0x0a,0xff,0xbe,0x01,0x7a,0x00,0x24,0xff,0xd7,0x01,0x7a,0x00,0x91,0xff,0x8b,\r\n0x01,0x7a,0x00,0xc4,0xff,0xa6,0x01,0x7a,0x00,0xc5,0xff,0xa6,0x01,0x7a,0x01,0x03,0xff,0xd7,0x01,0x7a,0x01,0x05,0xff,0xd7,0x01,0x7a,0x01,0x45,0xff,0xd7,0x01,0x7a,0x01,0x85,0xff,0xd7,0x01,0x7a,0x01,0x87,0xff,0xd7,0x01,0x7b,0x00,0x05,0xff,0xbe,0x01,0x7b,0x00,0x0a,0xff,0xbe,0x01,0x7c,0x00,0x24,0xff,0xd7,0x01,0x7c,0x00,0x91,\r\n0xff,0x8b,0x01,0x7c,0x00,0xc4,0xff,0xa6,0x01,0x7c,0x00,0xc5,0xff,0xa6,0x01,0x7c,0x01,0x03,0xff,0xd7,0x01,0x7c,0x01,0x05,0xff,0xd7,0x01,0x7c,0x01,0x45,0xff,0xd7,0x01,0x7c,0x01,0x85,0xff,0xd7,0x01,0x7c,0x01,0x87,0xff,0xd7,0x01,0x7d,0x00,0x05,0xff,0xbe,0x01,0x7d,0x00,0x0a,0xff,0xbe,0x01,0x7e,0x00,0x24,0xff,0xd7,0x01,0x7e,\r\n0x00,0x91,0xff,0x8b,0x01,0x7e,0x00,0xc4,0xff,0xa6,0x01,0x7e,0x00,0xc5,0xff,0xa6,0x01,0x7e,0x01,0x03,0xff,0xd7,0x01,0x7e,0x01,0x05,0xff,0xd7,0x01,0x7e,0x01,0x45,0xff,0xd7,0x01,0x7e,0x01,0x85,0xff,0xd7,0x01,0x7e,0x01,0x87,0xff,0xd7,0x01,0x7f,0x00,0x05,0xff,0xbe,0x01,0x7f,0x00,0x0a,0xff,0xbe,0x01,0x80,0x00,0x0f,0xff,0x8b,\r\n0x01,0x80,0x00,0x11,0xff,0x7f,0x01,0x80,0x00,0x24,0xff,0xb6,0x01,0x80,0x00,0x37,0x00,0x27,0x01,0x80,0x00,0x44,0xff,0xb4,0x01,0x80,0x00,0x46,0xff,0xcf,0x01,0x80,0x00,0x47,0xff,0xcf,0x01,0x80,0x00,0x48,0xff,0xcf,0x01,0x80,0x00,0x4a,0xff,0xcf,0x01,0x80,0x00,0x52,0xff,0xcf,0x01,0x80,0x00,0x54,0xff,0xcf,0x01,0x80,0x00,0x62,\r\n0xff,0xb6,0x01,0x80,0x00,0x63,0xff,0xb6,0x01,0x80,0x00,0x69,0xff,0xb4,0x01,0x80,0x00,0x6a,0xff,0xb4,0x01,0x80,0x00,0x6b,0xff,0xb4,0x01,0x80,0x00,0x6c,0xff,0xb4,0x01,0x80,0x00,0x6d,0xff,0xb4,0x01,0x80,0x00,0x6e,0xff,0xb4,0x01,0x80,0x00,0x6f,0xff,0xcf,0x01,0x80,0x00,0x70,0xff,0xcf,0x01,0x80,0x00,0x71,0xff,0xcf,0x01,0x80,\r\n0x00,0x72,0xff,0xcf,0x01,0x80,0x00,0x73,0xff,0xcf,0x01,0x80,0x00,0x76,0x00,0x31,0x01,0x80,0x00,0x77,0x00,0x64,0x01,0x80,0x00,0x79,0xff,0xcf,0x01,0x80,0x00,0x7a,0xff,0xcf,0x01,0x80,0x00,0x7b,0xff,0xcf,0x01,0x80,0x00,0x7c,0xff,0xcf,0x01,0x80,0x00,0x7d,0xff,0xcf,0x01,0x80,0x00,0x91,0xff,0x9a,0x01,0x80,0x00,0xa0,0xff,0xb4,\r\n0x01,0x80,0x00,0xa2,0xff,0xa4,0x01,0x80,0x00,0xaa,0xff,0xcf,0x01,0x80,0x00,0xab,0x00,0x27,0x01,0x80,0x00,0xac,0xff,0x7f,0x01,0x80,0x00,0xad,0xff,0xb6,0x01,0x80,0x00,0xae,0xff,0xb6,0x01,0x80,0x00,0xb1,0xff,0xcf,0x01,0x80,0x00,0xbe,0xff,0xcf,0x01,0x80,0x00,0xbf,0x00,0x27,0x01,0x80,0x00,0xc4,0xff,0x7f,0x01,0x80,0x00,0xc5,\r\n0xff,0x8b,0x01,0x80,0x00,0xc7,0xff,0xb6,0x01,0x80,0x00,0xc9,0xff,0xb6,0x01,0x80,0x00,0xf8,0xff,0xcf,0x01,0x80,0x00,0xfd,0xff,0xcf,0x01,0x80,0x00,0xff,0xff,0xcf,0x01,0x80,0x01,0x00,0xff,0xcf,0x01,0x80,0x01,0x03,0xff,0xb6,0x01,0x80,0x01,0x04,0xff,0xb4,0x01,0x80,0x01,0x05,0xff,0xb6,0x01,0x80,0x01,0x06,0xff,0xb4,0x01,0x80,\r\n0x01,0x08,0xff,0xcf,0x01,0x80,0x01,0x0b,0xff,0xcf,0x01,0x80,0x01,0x0d,0xff,0xcf,0x01,0x80,0x01,0x19,0xff,0xcf,0x01,0x80,0x01,0x20,0x00,0x27,0x01,0x80,0x01,0x22,0x00,0x27,0x01,0x80,0x01,0x45,0xff,0xb6,0x01,0x80,0x01,0x46,0xff,0xb4,0x01,0x80,0x01,0x48,0xff,0xcf,0x01,0x80,0x01,0x4c,0xff,0xcf,0x01,0x80,0x01,0x4e,0xff,0xcf,\r\n0x01,0x80,0x01,0x50,0xff,0xcf,0x01,0x80,0x01,0x52,0xff,0xcf,0x01,0x80,0x01,0x54,0xff,0xcf,0x01,0x80,0x01,0x56,0xff,0xcf,0x01,0x80,0x01,0x5c,0x00,0x64,0x01,0x80,0x01,0x5e,0x00,0x64,0x01,0x80,0x01,0x60,0x00,0x64,0x01,0x80,0x01,0x6f,0xff,0xcf,0x01,0x80,0x01,0x71,0xff,0xcf,0x01,0x80,0x01,0x76,0x00,0x27,0x01,0x80,0x01,0x85,\r\n0xff,0xb6,0x01,0x80,0x01,0x86,0xff,0xb4,0x01,0x80,0x01,0x87,0xff,0xb6,0x01,0x80,0x01,0x88,0xff,0xb4,0x01,0x80,0x01,0x8a,0xff,0xcf,0x01,0x81,0x00,0x0f,0xff,0xa6,0x01,0x81,0x00,0x11,0xff,0x9a,0x01,0x81,0x00,0x46,0xff,0xfa,0x01,0x81,0x00,0x47,0xff,0xf6,0x01,0x81,0x00,0x48,0xff,0xf6,0x01,0x81,0x00,0x4a,0xff,0xfa,0x01,0x81,\r\n0x00,0x52,0xff,0xfa,0x01,0x81,0x00,0x54,0xff,0xf6,0x01,0x81,0x00,0x6f,0xff,0xfa,0x01,0x81,0x00,0x70,0xff,0xf6,0x01,0x81,0x00,0x71,0xff,0xf6,0x01,0x81,0x00,0x72,0xff,0xf6,0x01,0x81,0x00,0x73,0xff,0xf6,0x01,0x81,0x00,0x79,0xff,0xfa,0x01,0x81,0x00,0x7a,0xff,0xfa,0x01,0x81,0x00,0x7b,0xff,0xfa,0x01,0x81,0x00,0x7c,0xff,0xfa,\r\n0x01,0x81,0x00,0x7d,0xff,0xfa,0x01,0x81,0x00,0xac,0xff,0x9a,0x01,0x81,0x00,0xb1,0xff,0xfa,0x01,0x81,0x00,0xc4,0xff,0xb4,0x01,0x81,0x00,0xc5,0xff,0xb4,0x01,0x81,0x00,0xf8,0xff,0xfa,0x01,0x81,0x00,0xfd,0xff,0xfa,0x01,0x81,0x00,0xff,0xff,0xfa,0x01,0x81,0x01,0x00,0xff,0xf6,0x01,0x81,0x01,0x08,0xff,0xf6,0x01,0x81,0x01,0x0b,\r\n0xff,0xf6,0x01,0x81,0x01,0x0d,0xff,0xf6,0x01,0x81,0x01,0x19,0xff,0xfa,0x01,0x81,0x01,0x48,0xff,0xfa,0x01,0x81,0x01,0x4c,0xff,0xf6,0x01,0x81,0x01,0x4e,0xff,0xf6,0x01,0x81,0x01,0x50,0xff,0xf6,0x01,0x81,0x01,0x52,0xff,0xfa,0x01,0x81,0x01,0x54,0xff,0xfa,0x01,0x81,0x01,0x56,0xff,0xfa,0x01,0x81,0x01,0x6f,0xff,0xfa,0x01,0x81,\r\n0x01,0x71,0xff,0xfa,0x01,0x81,0x01,0x8a,0xff,0xfa,0x01,0x82,0x00,0x0f,0xff,0x50,0x01,0x82,0x00,0x11,0xff,0x3d,0x01,0x82,0x00,0x24,0xff,0x62,0x01,0x82,0x00,0x26,0xff,0xd3,0x01,0x82,0x00,0x2a,0xff,0xd3,0x01,0x82,0x00,0x2d,0xff,0xbe,0x01,0x82,0x00,0x32,0xff,0xd3,0x01,0x82,0x00,0x34,0xff,0xd3,0x01,0x82,0x00,0x36,0xff,0xe5,\r\n0x01,0x82,0x00,0x37,0x00,0x27,0x01,0x82,0x00,0x44,0xff,0x39,0x01,0x82,0x00,0x46,0xff,0x4c,0x01,0x82,0x00,0x47,0xff,0x4c,0x01,0x82,0x00,0x48,0xff,0x4c,0x01,0x82,0x00,0x49,0xff,0xe5,0x01,0x82,0x00,0x4a,0xff,0x4c,0x01,0x82,0x00,0x50,0xff,0x73,0x01,0x82,0x00,0x51,0xff,0x73,0x01,0x82,0x00,0x52,0xff,0x4c,0x01,0x82,0x00,0x53,\r\n0xff,0x73,0x01,0x82,0x00,0x54,0xff,0x4c,0x01,0x82,0x00,0x55,0xff,0x73,0x01,0x82,0x00,0x56,0xff,0x7b,0x01,0x82,0x00,0x58,0xff,0x73,0x01,0x82,0x00,0x62,0xff,0x62,0x01,0x82,0x00,0x63,0xff,0x62,0x01,0x82,0x00,0x64,0xff,0xcd,0x01,0x82,0x00,0x67,0xff,0xd3,0x01,0x82,0x00,0x69,0xff,0x39,0x01,0x82,0x00,0x6a,0xff,0x39,0x01,0x82,\r\n0x00,0x6b,0xff,0x39,0x01,0x82,0x00,0x6c,0xff,0x7f,0x01,0x82,0x00,0x6d,0xff,0x66,0x01,0x82,0x00,0x6e,0xff,0x39,0x01,0x82,0x00,0x6f,0xff,0x4c,0x01,0x82,0x00,0x70,0xff,0x4c,0x01,0x82,0x00,0x71,0xff,0x4c,0x01,0x82,0x00,0x72,0xff,0x4c,0x01,0x82,0x00,0x73,0xff,0x4c,0x01,0x82,0x00,0x77,0x00,0x5a,0x01,0x82,0x00,0x78,0xff,0x73,\r\n0x01,0x82,0x00,0x79,0xff,0x4c,0x01,0x82,0x00,0x7a,0xff,0x4c,0x01,0x82,0x00,0x7b,0xff,0x4c,0x01,0x82,0x00,0x7c,0xff,0x4c,0x01,0x82,0x00,0x7d,0xff,0x4c,0x01,0x82,0x00,0x7e,0xff,0x73,0x01,0x82,0x00,0x7f,0xff,0x73,0x01,0x82,0x00,0x80,0xff,0x73,0x01,0x82,0x00,0x81,0xff,0x73,0x01,0x82,0x00,0x91,0xff,0x3f,0x01,0x82,0x00,0x92,\r\n0xff,0xd3,0x01,0x82,0x00,0xa0,0xff,0x39,0x01,0x82,0x00,0xa2,0xff,0x1b,0x01,0x82,0x00,0xaa,0xff,0xcf,0x01,0x82,0x00,0xac,0xff,0x3d,0x01,0x82,0x00,0xad,0xff,0x62,0x01,0x82,0x00,0xae,0xff,0x62,0x01,0x82,0x00,0xaf,0xff,0xd3,0x01,0x82,0x00,0xb0,0xff,0xd3,0x01,0x82,0x00,0xb1,0xff,0x4c,0x01,0x82,0x00,0xbe,0xff,0x9a,0x01,0x82,\r\n0x00,0xc4,0xff,0x08,0x01,0x82,0x00,0xc5,0xff,0x08,0x01,0x82,0x00,0xc7,0xff,0x62,0x01,0x82,0x00,0xc9,0xff,0x62,0x01,0x82,0x00,0xd0,0xff,0xd3,0x01,0x82,0x00,0xd1,0xff,0xd3,0x01,0x82,0x00,0xd2,0xff,0xd3,0x01,0x82,0x00,0xe3,0xff,0xe5,0x01,0x82,0x00,0xe4,0xff,0x7b,0x01,0x82,0x00,0xf7,0xff,0xd3,0x01,0x82,0x00,0xf8,0xff,0x4c,\r\n0x01,0x82,0x00,0xfa,0xff,0xe5,0x01,0x82,0x00,0xfb,0xff,0x7b,0x01,0x82,0x00,0xfc,0xff,0xd3,0x01,0x82,0x00,0xfd,0xff,0x4c,0x01,0x82,0x00,0xfe,0xff,0xd3,0x01,0x82,0x00,0xff,0xff,0x4c,0x01,0x82,0x01,0x00,0xff,0x4c,0x01,0x82,0x01,0x03,0xff,0x62,0x01,0x82,0x01,0x04,0xff,0x7f,0x01,0x82,0x01,0x05,0xff,0x62,0x01,0x82,0x01,0x06,\r\n0xff,0x39,0x01,0x82,0x01,0x08,0xff,0x4c,0x01,0x82,0x01,0x0b,0xff,0x4c,0x01,0x82,0x01,0x0d,0xff,0x4c,0x01,0x82,0x01,0x15,0xff,0x73,0x01,0x82,0x01,0x17,0xff,0x73,0x01,0x82,0x01,0x18,0xff,0xd3,0x01,0x82,0x01,0x19,0xff,0x4c,0x01,0x82,0x01,0x1b,0xff,0x73,0x01,0x82,0x01,0x1d,0xff,0x73,0x01,0x82,0x01,0x1e,0xff,0xe5,0x01,0x82,\r\n0x01,0x1f,0xff,0x7b,0x01,0x82,0x01,0x20,0x00,0x27,0x01,0x82,0x01,0x22,0x00,0x27,0x01,0x82,0x01,0x25,0xff,0x73,0x01,0x82,0x01,0x27,0xff,0x73,0x01,0x82,0x01,0x45,0xff,0x62,0x01,0x82,0x01,0x46,0xff,0x7f,0x01,0x82,0x01,0x47,0xff,0xd3,0x01,0x82,0x01,0x48,0xff,0x4c,0x01,0x82,0x01,0x4c,0xff,0x4c,0x01,0x82,0x01,0x4e,0xff,0x4c,\r\n0x01,0x82,0x01,0x50,0xff,0x4c,0x01,0x82,0x01,0x51,0xff,0xd3,0x01,0x82,0x01,0x52,0xff,0x4c,0x01,0x82,0x01,0x53,0xff,0xd3,0x01,0x82,0x01,0x54,0xff,0x4c,0x01,0x82,0x01,0x55,0xff,0xd3,0x01,0x82,0x01,0x56,0xff,0x4c,0x01,0x82,0x01,0x5c,0x00,0x5a,0x01,0x82,0x01,0x5e,0x00,0x5a,0x01,0x82,0x01,0x60,0x00,0x5a,0x01,0x82,0x01,0x63,\r\n0xff,0xbe,0x01,0x82,0x01,0x6d,0xff,0x73,0x01,0x82,0x01,0x6e,0xff,0xd3,0x01,0x82,0x01,0x6f,0xff,0x4c,0x01,0x82,0x01,0x70,0xff,0xd3,0x01,0x82,0x01,0x71,0xff,0x4c,0x01,0x82,0x01,0x73,0xff,0x73,0x01,0x82,0x01,0x74,0xff,0xe5,0x01,0x82,0x01,0x75,0xff,0x7b,0x01,0x82,0x01,0x76,0x00,0x27,0x01,0x82,0x01,0x79,0xff,0x73,0x01,0x82,\r\n0x01,0x7b,0xff,0x73,0x01,0x82,0x01,0x7d,0xff,0x73,0x01,0x82,0x01,0x7f,0xff,0x73,0x01,0x82,0x01,0x85,0xff,0x62,0x01,0x82,0x01,0x86,0xff,0x7f,0x01,0x82,0x01,0x87,0xff,0x62,0x01,0x82,0x01,0x88,0xff,0x39,0x01,0x82,0x01,0x89,0xff,0xd3,0x01,0x82,0x01,0x8a,0xff,0x4c,0x01,0x82,0x02,0x3d,0xff,0xe5,0x01,0x82,0x02,0x3e,0xff,0x7b,\r\n0x01,0x83,0x00,0x05,0x00,0x1d,0x01,0x83,0x00,0x0a,0x00,0x1d,0x01,0x83,0x00,0x0f,0xff,0x9a,0x01,0x83,0x00,0x11,0xff,0x81,0x01,0x83,0x00,0x22,0xff,0xb4,0x01,0x83,0x00,0x46,0xff,0xf6,0x01,0x83,0x00,0x47,0xff,0xf6,0x01,0x83,0x00,0x48,0xff,0xf6,0x01,0x83,0x00,0x49,0x00,0x04,0x01,0x83,0x00,0x4a,0xff,0xf6,0x01,0x83,0x00,0x52,\r\n0xff,0xf6,0x01,0x83,0x00,0x54,0xff,0xf6,0x01,0x83,0x00,0x57,0x00,0x06,0x01,0x83,0x00,0x6f,0xff,0xf6,0x01,0x83,0x00,0x70,0xff,0xf6,0x01,0x83,0x00,0x71,0xff,0xf6,0x01,0x83,0x00,0x72,0xff,0xf6,0x01,0x83,0x00,0x73,0xff,0xf6,0x01,0x83,0x00,0x79,0xff,0xf6,0x01,0x83,0x00,0x7a,0xff,0xf6,0x01,0x83,0x00,0x7b,0xff,0xf6,0x01,0x83,\r\n0x00,0x7c,0xff,0xf6,0x01,0x83,0x00,0x7d,0xff,0xf6,0x01,0x83,0x00,0xac,0xff,0x81,0x01,0x83,0x00,0xb1,0xff,0xf6,0x01,0x83,0x00,0xbf,0x00,0x0c,0x01,0x83,0x00,0xc4,0xff,0x8d,0x01,0x83,0x00,0xc5,0xff,0x8d,0x01,0x83,0x00,0xf8,0xff,0xf6,0x01,0x83,0x00,0xfd,0xff,0xf6,0x01,0x83,0x00,0xff,0xff,0xf6,0x01,0x83,0x01,0x00,0xff,0xf6,\r\n0x01,0x83,0x01,0x08,0xff,0xf6,0x01,0x83,0x01,0x0b,0xff,0xf6,0x01,0x83,0x01,0x0d,0xff,0xf6,0x01,0x83,0x01,0x19,0xff,0xf6,0x01,0x83,0x01,0x21,0x00,0x06,0x01,0x83,0x01,0x23,0x00,0x06,0x01,0x83,0x01,0x48,0xff,0xf6,0x01,0x83,0x01,0x4c,0xff,0xf6,0x01,0x83,0x01,0x4e,0xff,0xf6,0x01,0x83,0x01,0x50,0xff,0xf6,0x01,0x83,0x01,0x52,\r\n0xff,0xf6,0x01,0x83,0x01,0x54,0xff,0xf6,0x01,0x83,0x01,0x56,0xff,0xf6,0x01,0x83,0x01,0x6f,0xff,0xf6,0x01,0x83,0x01,0x71,0xff,0xf6,0x01,0x83,0x01,0x77,0x00,0x06,0x01,0x83,0x01,0x8a,0xff,0xf6,0x01,0x84,0x00,0x0c,0x00,0x8d,0x01,0x84,0x00,0x0f,0xff,0x7f,0x01,0x84,0x00,0x10,0xff,0x9a,0x01,0x84,0x00,0x11,0xff,0x7f,0x01,0x84,\r\n0x00,0x1d,0x00,0x52,0x01,0x84,0x00,0x1e,0x00,0x52,0x01,0x84,0x00,0x22,0x00,0x42,0x01,0x84,0x00,0x40,0x00,0x8d,0x01,0x84,0x00,0x45,0x00,0x12,0x01,0x84,0x00,0x4b,0x00,0x12,0x01,0x84,0x00,0x57,0x00,0x25,0x01,0x84,0x00,0x59,0x00,0x27,0x01,0x84,0x00,0x5a,0x00,0x27,0x01,0x84,0x00,0x5b,0x00,0x12,0x01,0x84,0x00,0x5c,0x00,0x21,\r\n0x01,0x84,0x00,0x60,0x00,0x52,0x01,0x84,0x00,0x75,0x00,0x2d,0x01,0x84,0x00,0x76,0x00,0x12,0x01,0x84,0x00,0x77,0x00,0x79,0x01,0x84,0x00,0x8d,0x00,0x93,0x01,0x84,0x00,0xab,0x00,0x27,0x01,0x84,0x00,0xac,0xff,0x7f,0x01,0x84,0x00,0xb4,0x00,0x5e,0x01,0x84,0x00,0xb5,0x00,0x52,0x01,0x84,0x00,0xb6,0x00,0x5e,0x01,0x84,0x00,0xb7,\r\n0x00,0x52,0x01,0x84,0x00,0xbf,0x00,0x27,0x01,0x84,0x00,0xc4,0xff,0xb0,0x01,0x84,0x00,0xc5,0xff,0xb0,0x01,0x84,0x00,0xeb,0x00,0x21,0x01,0x84,0x00,0xed,0x00,0x12,0x01,0x84,0x01,0x21,0x00,0x25,0x01,0x84,0x01,0x23,0x00,0x25,0x01,0x84,0x01,0x58,0x00,0x12,0x01,0x84,0x01,0x5a,0x00,0x12,0x01,0x84,0x01,0x5c,0x00,0x79,0x01,0x84,\r\n0x01,0x5e,0x00,0x79,0x01,0x84,0x01,0x60,0x00,0x79,0x01,0x84,0x01,0x77,0x00,0x25,0x01,0x84,0x01,0x81,0x00,0x27,0x01,0x84,0x01,0x83,0x00,0x21,0x01,0x84,0x01,0x8d,0x00,0x27,0x01,0x84,0x01,0x8f,0x00,0x27,0x01,0x84,0x01,0x91,0x00,0x27,0x01,0x84,0x01,0x93,0x00,0x21,0x01,0x85,0x00,0x0d,0xff,0x7f,0x01,0x85,0x00,0x0f,0x00,0x44,\r\n0x01,0x85,0x00,0x1e,0x00,0x44,0x01,0x85,0x00,0x26,0xff,0xe5,0x01,0x85,0x00,0x2a,0xff,0xe5,0x01,0x85,0x00,0x2d,0x00,0x5e,0x01,0x85,0x00,0x32,0xff,0xe5,0x01,0x85,0x00,0x37,0xff,0x6d,0x01,0x85,0x00,0x38,0xff,0xe5,0x01,0x85,0x00,0x39,0xff,0x8b,0x01,0x85,0x00,0x3a,0xff,0xb6,0x01,0x85,0x00,0x3c,0xff,0x64,0x01,0x85,0x00,0x3d,\r\n0x00,0x3b,0x01,0x85,0x00,0x57,0xff,0xe5,0x01,0x85,0x00,0x59,0xff,0xd5,0x01,0x85,0x00,0x5a,0xff,0xe5,0x01,0x85,0x00,0x5c,0xff,0xdb,0x01,0x85,0x00,0x8d,0xff,0x9a,0x01,0x85,0x00,0xb4,0xff,0x66,0x01,0x85,0x00,0xb5,0xff,0x3f,0x01,0x85,0x00,0xb6,0xff,0x66,0x01,0x85,0x00,0xb7,0xff,0x3f,0x01,0x85,0x00,0xba,0xff,0xc1,0x01,0x85,\r\n0x00,0xbb,0xff,0x64,0x01,0x85,0x00,0xe5,0x00,0x3b,0x01,0x85,0x00,0xea,0xff,0x64,0x01,0x85,0x00,0xeb,0xff,0xdb,0x01,0x85,0x00,0xf7,0xff,0xe5,0x01,0x85,0x00,0xfc,0xff,0xe5,0x01,0x85,0x00,0xfe,0xff,0xe5,0x01,0x85,0x01,0x18,0xff,0xe5,0x01,0x85,0x01,0x20,0xff,0x6d,0x01,0x85,0x01,0x21,0xff,0xe5,0x01,0x85,0x01,0x22,0xff,0x6d,\r\n0x01,0x85,0x01,0x23,0xff,0xe5,0x01,0x85,0x01,0x24,0xff,0xe5,0x01,0x85,0x01,0x26,0xff,0xe5,0x01,0x85,0x01,0x28,0x00,0x3b,0x01,0x85,0x01,0x2a,0x00,0x3b,0x01,0x85,0x01,0x47,0xff,0xe5,0x01,0x85,0x01,0x51,0xff,0xe5,0x01,0x85,0x01,0x53,0xff,0xe5,0x01,0x85,0x01,0x55,0xff,0xe5,0x01,0x85,0x01,0x63,0x00,0x5e,0x01,0x85,0x01,0x6e,\r\n0xff,0xe5,0x01,0x85,0x01,0x70,0xff,0xe5,0x01,0x85,0x01,0x76,0xff,0x6d,0x01,0x85,0x01,0x77,0xff,0xe5,0x01,0x85,0x01,0x78,0xff,0xe5,0x01,0x85,0x01,0x7a,0xff,0xe5,0x01,0x85,0x01,0x7c,0xff,0xe5,0x01,0x85,0x01,0x7e,0xff,0xe5,0x01,0x85,0x01,0x80,0xff,0xb6,0x01,0x85,0x01,0x81,0xff,0xe5,0x01,0x85,0x01,0x82,0xff,0x64,0x01,0x85,\r\n0x01,0x83,0xff,0xdb,0x01,0x85,0x01,0x89,0xff,0xe5,0x01,0x85,0x01,0x8c,0xff,0xb6,0x01,0x85,0x01,0x8d,0xff,0xe5,0x01,0x85,0x01,0x8e,0xff,0xb6,0x01,0x85,0x01,0x8f,0xff,0xe5,0x01,0x85,0x01,0x90,0xff,0xb6,0x01,0x85,0x01,0x91,0xff,0xe5,0x01,0x85,0x01,0x92,0xff,0x64,0x01,0x85,0x01,0x93,0xff,0xdb,0x01,0x87,0x00,0x24,0x00,0x0a,\r\n0x01,0x87,0x00,0x2d,0x00,0x44,0x01,0x87,0x00,0x37,0x00,0x04,0x01,0x87,0x00,0x3a,0x00,0x1d,0x01,0x87,0x00,0x3b,0x00,0x08,0x01,0x87,0x00,0x62,0x00,0x0a,0x01,0x87,0x00,0x63,0x00,0x0a,0x01,0x87,0x00,0x77,0x00,0x12,0x01,0x87,0x00,0xad,0x00,0x0a,0x01,0x87,0x00,0xae,0x00,0x0a,0x01,0x87,0x00,0xc7,0x00,0x0a,0x01,0x87,0x00,0xc9,\r\n0x00,0x0a,0x01,0x87,0x01,0x03,0x00,0x0a,0x01,0x87,0x01,0x05,0x00,0x0a,0x01,0x87,0x01,0x20,0x00,0x04,0x01,0x87,0x01,0x22,0x00,0x04,0x01,0x87,0x01,0x45,0x00,0x0a,0x01,0x87,0x01,0x5c,0x00,0x12,0x01,0x87,0x01,0x5e,0x00,0x12,0x01,0x87,0x01,0x60,0x00,0x12,0x01,0x87,0x01,0x63,0x00,0x44,0x01,0x87,0x01,0x76,0x00,0x04,0x01,0x87,\r\n0x01,0x80,0x00,0x1d,0x01,0x87,0x01,0x85,0x00,0x0a,0x01,0x87,0x01,0x87,0x00,0x0a,0x01,0x87,0x01,0x8c,0x00,0x1d,0x01,0x87,0x01,0x8e,0x00,0x1d,0x01,0x87,0x01,0x90,0x00,0x1d,0x01,0x88,0x00,0x05,0xff,0x98,0x01,0x88,0x00,0x0a,0xff,0x98,0x01,0x89,0x00,0x0f,0xff,0xa4,0x01,0x89,0x00,0x11,0xff,0xa4,0x01,0x89,0x00,0x24,0xff,0xe5,\r\n0x01,0x89,0x00,0x2d,0xff,0xf6,0x01,0x89,0x00,0x37,0xff,0xa4,0x01,0x89,0x00,0x3b,0xff,0xdb,0x01,0x89,0x00,0x3c,0xff,0xe7,0x01,0x89,0x00,0x3d,0xff,0xcf,0x01,0x89,0x00,0x62,0xff,0xe5,0x01,0x89,0x00,0x63,0xff,0xe5,0x01,0x89,0x00,0xac,0xff,0xa4,0x01,0x89,0x00,0xad,0xff,0xe5,0x01,0x89,0x00,0xae,0xff,0xe5,0x01,0x89,0x00,0xbb,\r\n0xff,0xf6,0x01,0x89,0x00,0xc4,0xff,0x4c,0x01,0x89,0x00,0xc5,0xff,0x98,0x01,0x89,0x00,0xc7,0xff,0xe5,0x01,0x89,0x00,0xc9,0xff,0xe5,0x01,0x89,0x00,0xe5,0xff,0xcf,0x01,0x89,0x00,0xea,0xff,0xe7,0x01,0x89,0x01,0x03,0xff,0xe5,0x01,0x89,0x01,0x05,0xff,0xe5,0x01,0x89,0x01,0x20,0xff,0xa4,0x01,0x89,0x01,0x22,0xff,0xa4,0x01,0x89,\r\n0x01,0x28,0xff,0xcf,0x01,0x89,0x01,0x2a,0xff,0xcf,0x01,0x89,0x01,0x45,0xff,0xe5,0x01,0x89,0x01,0x63,0xff,0xf6,0x01,0x89,0x01,0x76,0xff,0xa4,0x01,0x89,0x01,0x82,0xff,0xe7,0x01,0x89,0x01,0x85,0xff,0xe5,0x01,0x89,0x01,0x87,0xff,0xe5,0x01,0x89,0x01,0x92,0xff,0xe7,0x01,0x8a,0x00,0x05,0xff,0x6f,0x01,0x8a,0x00,0x0a,0xff,0x6f,\r\n0x01,0x8a,0x00,0x44,0xff,0xe5,0x01,0x8a,0x00,0x49,0xff,0xdb,0x01,0x8a,0x00,0x5b,0xff,0xe7,0x01,0x8a,0x00,0x69,0xff,0xe5,0x01,0x8a,0x00,0x6a,0xff,0xe5,0x01,0x8a,0x00,0x6b,0xff,0xe5,0x01,0x8a,0x00,0x6c,0xff,0xe5,0x01,0x8a,0x00,0x6d,0xff,0xe5,0x01,0x8a,0x00,0x6e,0xff,0xe5,0x01,0x8a,0x00,0xa0,0xff,0xe5,0x01,0x8a,0x00,0xb4,\r\n0xff,0xb2,0x01,0x8a,0x00,0xb5,0xff,0x7d,0x01,0x8a,0x00,0xb6,0xff,0xbe,0x01,0x8a,0x00,0xb7,0xff,0x7d,0x01,0x8a,0x00,0xc0,0xff,0xe7,0x01,0x8a,0x00,0xc1,0xff,0xe7,0x01,0x8a,0x01,0x04,0xff,0xe5,0x01,0x8a,0x01,0x06,0xff,0xe5,0x01,0x8a,0x01,0x46,0xff,0xe5,0x01,0x8a,0x01,0x86,0xff,0xe5,0x01,0x8a,0x01,0x88,0xff,0xe5,0x01,0x8c,\r\n0x00,0x0f,0xff,0x8b,0x01,0x8c,0x00,0x11,0xff,0x7f,0x01,0x8c,0x00,0x24,0xff,0xb6,0x01,0x8c,0x00,0x37,0x00,0x27,0x01,0x8c,0x00,0x44,0xff,0xb4,0x01,0x8c,0x00,0x46,0xff,0xcf,0x01,0x8c,0x00,0x47,0xff,0xcf,0x01,0x8c,0x00,0x48,0xff,0xcf,0x01,0x8c,0x00,0x4a,0xff,0xcf,0x01,0x8c,0x00,0x52,0xff,0xcf,0x01,0x8c,0x00,0x54,0xff,0xcf,\r\n0x01,0x8c,0x00,0x62,0xff,0xb6,0x01,0x8c,0x00,0x63,0xff,0xb6,0x01,0x8c,0x00,0x69,0xff,0xb4,0x01,0x8c,0x00,0x6a,0xff,0xb4,0x01,0x8c,0x00,0x6b,0xff,0xb4,0x01,0x8c,0x00,0x6c,0xff,0xb4,0x01,0x8c,0x00,0x6d,0xff,0xb4,0x01,0x8c,0x00,0x6e,0xff,0xb4,0x01,0x8c,0x00,0x6f,0xff,0xcf,0x01,0x8c,0x00,0x70,0xff,0xcf,0x01,0x8c,0x00,0x71,\r\n0xff,0xcf,0x01,0x8c,0x00,0x72,0xff,0xcf,0x01,0x8c,0x00,0x73,0xff,0xcf,0x01,0x8c,0x00,0x76,0x00,0x31,0x01,0x8c,0x00,0x77,0x00,0x64,0x01,0x8c,0x00,0x79,0xff,0xcf,0x01,0x8c,0x00,0x7a,0xff,0xcf,0x01,0x8c,0x00,0x7b,0xff,0xcf,0x01,0x8c,0x00,0x7c,0xff,0xcf,0x01,0x8c,0x00,0x7d,0xff,0xcf,0x01,0x8c,0x00,0x91,0xff,0x9a,0x01,0x8c,\r\n0x00,0xa0,0xff,0xb4,0x01,0x8c,0x00,0xa2,0xff,0xa4,0x01,0x8c,0x00,0xaa,0xff,0xcf,0x01,0x8c,0x00,0xab,0x00,0x27,0x01,0x8c,0x00,0xac,0xff,0x7f,0x01,0x8c,0x00,0xad,0xff,0xb6,0x01,0x8c,0x00,0xae,0xff,0xb6,0x01,0x8c,0x00,0xb1,0xff,0xcf,0x01,0x8c,0x00,0xbe,0xff,0xcf,0x01,0x8c,0x00,0xbf,0x00,0x27,0x01,0x8c,0x00,0xc4,0xff,0x7f,\r\n0x01,0x8c,0x00,0xc5,0xff,0x8b,0x01,0x8c,0x00,0xc7,0xff,0xb6,0x01,0x8c,0x00,0xc9,0xff,0xb6,0x01,0x8c,0x00,0xf8,0xff,0xcf,0x01,0x8c,0x00,0xfd,0xff,0xcf,0x01,0x8c,0x00,0xff,0xff,0xcf,0x01,0x8c,0x01,0x00,0xff,0xcf,0x01,0x8c,0x01,0x03,0xff,0xb6,0x01,0x8c,0x01,0x04,0xff,0xb4,0x01,0x8c,0x01,0x05,0xff,0xb6,0x01,0x8c,0x01,0x06,\r\n0xff,0xb4,0x01,0x8c,0x01,0x08,0xff,0xcf,0x01,0x8c,0x01,0x0b,0xff,0xcf,0x01,0x8c,0x01,0x0d,0xff,0xcf,0x01,0x8c,0x01,0x19,0xff,0xcf,0x01,0x8c,0x01,0x20,0x00,0x27,0x01,0x8c,0x01,0x22,0x00,0x27,0x01,0x8c,0x01,0x45,0xff,0xb6,0x01,0x8c,0x01,0x46,0xff,0xb4,0x01,0x8c,0x01,0x48,0xff,0xcf,0x01,0x8c,0x01,0x4c,0xff,0xcf,0x01,0x8c,\r\n0x01,0x4e,0xff,0xcf,0x01,0x8c,0x01,0x50,0xff,0xcf,0x01,0x8c,0x01,0x52,0xff,0xcf,0x01,0x8c,0x01,0x54,0xff,0xcf,0x01,0x8c,0x01,0x56,0xff,0xcf,0x01,0x8c,0x01,0x5c,0x00,0x64,0x01,0x8c,0x01,0x5e,0x00,0x64,0x01,0x8c,0x01,0x60,0x00,0x64,0x01,0x8c,0x01,0x6f,0xff,0xcf,0x01,0x8c,0x01,0x71,0xff,0xcf,0x01,0x8c,0x01,0x76,0x00,0x27,\r\n0x01,0x8c,0x01,0x85,0xff,0xb6,0x01,0x8c,0x01,0x86,0xff,0xb4,0x01,0x8c,0x01,0x87,0xff,0xb6,0x01,0x8c,0x01,0x88,0xff,0xb4,0x01,0x8c,0x01,0x8a,0xff,0xcf,0x01,0x8d,0x00,0x0f,0xff,0xa6,0x01,0x8d,0x00,0x11,0xff,0x9a,0x01,0x8d,0x00,0x46,0xff,0xfa,0x01,0x8d,0x00,0x47,0xff,0xf6,0x01,0x8d,0x00,0x48,0xff,0xf6,0x01,0x8d,0x00,0x4a,\r\n0xff,0xfa,0x01,0x8d,0x00,0x52,0xff,0xfa,0x01,0x8d,0x00,0x54,0xff,0xf6,0x01,0x8d,0x00,0x6f,0xff,0xfa,0x01,0x8d,0x00,0x70,0xff,0xf6,0x01,0x8d,0x00,0x71,0xff,0xf6,0x01,0x8d,0x00,0x72,0xff,0xf6,0x01,0x8d,0x00,0x73,0xff,0xf6,0x01,0x8d,0x00,0x79,0xff,0xfa,0x01,0x8d,0x00,0x7a,0xff,0xfa,0x01,0x8d,0x00,0x7b,0xff,0xfa,0x01,0x8d,\r\n0x00,0x7c,0xff,0xfa,0x01,0x8d,0x00,0x7d,0xff,0xfa,0x01,0x8d,0x00,0xac,0xff,0x9a,0x01,0x8d,0x00,0xb1,0xff,0xfa,0x01,0x8d,0x00,0xc4,0xff,0xb4,0x01,0x8d,0x00,0xc5,0xff,0xb4,0x01,0x8d,0x00,0xf8,0xff,0xfa,0x01,0x8d,0x00,0xfd,0xff,0xfa,0x01,0x8d,0x00,0xff,0xff,0xfa,0x01,0x8d,0x01,0x00,0xff,0xf6,0x01,0x8d,0x01,0x08,0xff,0xf6,\r\n0x01,0x8d,0x01,0x0b,0xff,0xf6,0x01,0x8d,0x01,0x0d,0xff,0xf6,0x01,0x8d,0x01,0x19,0xff,0xfa,0x01,0x8d,0x01,0x48,0xff,0xfa,0x01,0x8d,0x01,0x4c,0xff,0xf6,0x01,0x8d,0x01,0x4e,0xff,0xf6,0x01,0x8d,0x01,0x50,0xff,0xf6,0x01,0x8d,0x01,0x52,0xff,0xfa,0x01,0x8d,0x01,0x54,0xff,0xfa,0x01,0x8d,0x01,0x56,0xff,0xfa,0x01,0x8d,0x01,0x6f,\r\n0xff,0xfa,0x01,0x8d,0x01,0x71,0xff,0xfa,0x01,0x8d,0x01,0x8a,0xff,0xfa,0x01,0x8e,0x00,0x0f,0xff,0x8b,0x01,0x8e,0x00,0x11,0xff,0x7f,0x01,0x8e,0x00,0x24,0xff,0xb6,0x01,0x8e,0x00,0x37,0x00,0x27,0x01,0x8e,0x00,0x44,0xff,0xb4,0x01,0x8e,0x00,0x46,0xff,0xcf,0x01,0x8e,0x00,0x47,0xff,0xcf,0x01,0x8e,0x00,0x48,0xff,0xcf,0x01,0x8e,\r\n0x00,0x4a,0xff,0xcf,0x01,0x8e,0x00,0x52,0xff,0xcf,0x01,0x8e,0x00,0x54,0xff,0xcf,0x01,0x8e,0x00,0x62,0xff,0xb6,0x01,0x8e,0x00,0x63,0xff,0xb6,0x01,0x8e,0x00,0x69,0xff,0xb4,0x01,0x8e,0x00,0x6a,0xff,0xb4,0x01,0x8e,0x00,0x6b,0xff,0xb4,0x01,0x8e,0x00,0x6c,0xff,0xb4,0x01,0x8e,0x00,0x6d,0xff,0xb4,0x01,0x8e,0x00,0x6e,0xff,0xb4,\r\n0x01,0x8e,0x00,0x6f,0xff,0xcf,0x01,0x8e,0x00,0x70,0xff,0xcf,0x01,0x8e,0x00,0x71,0xff,0xcf,0x01,0x8e,0x00,0x72,0xff,0xcf,0x01,0x8e,0x00,0x73,0xff,0xcf,0x01,0x8e,0x00,0x76,0x00,0x31,0x01,0x8e,0x00,0x77,0x00,0x64,0x01,0x8e,0x00,0x79,0xff,0xcf,0x01,0x8e,0x00,0x7a,0xff,0xcf,0x01,0x8e,0x00,0x7b,0xff,0xcf,0x01,0x8e,0x00,0x7c,\r\n0xff,0xcf,0x01,0x8e,0x00,0x7d,0xff,0xcf,0x01,0x8e,0x00,0x91,0xff,0x9a,0x01,0x8e,0x00,0xa0,0xff,0xb4,0x01,0x8e,0x00,0xa2,0xff,0xa4,0x01,0x8e,0x00,0xaa,0xff,0xcf,0x01,0x8e,0x00,0xab,0x00,0x27,0x01,0x8e,0x00,0xac,0xff,0x7f,0x01,0x8e,0x00,0xad,0xff,0xb6,0x01,0x8e,0x00,0xae,0xff,0xb6,0x01,0x8e,0x00,0xb1,0xff,0xcf,0x01,0x8e,\r\n0x00,0xbe,0xff,0xcf,0x01,0x8e,0x00,0xbf,0x00,0x27,0x01,0x8e,0x00,0xc4,0xff,0x7f,0x01,0x8e,0x00,0xc5,0xff,0x8b,0x01,0x8e,0x00,0xc7,0xff,0xb6,0x01,0x8e,0x00,0xc9,0xff,0xb6,0x01,0x8e,0x00,0xf8,0xff,0xcf,0x01,0x8e,0x00,0xfd,0xff,0xcf,0x01,0x8e,0x00,0xff,0xff,0xcf,0x01,0x8e,0x01,0x00,0xff,0xcf,0x01,0x8e,0x01,0x03,0xff,0xb6,\r\n0x01,0x8e,0x01,0x04,0xff,0xb4,0x01,0x8e,0x01,0x05,0xff,0xb6,0x01,0x8e,0x01,0x06,0xff,0xb4,0x01,0x8e,0x01,0x08,0xff,0xcf,0x01,0x8e,0x01,0x0b,0xff,0xcf,0x01,0x8e,0x01,0x0d,0xff,0xcf,0x01,0x8e,0x01,0x19,0xff,0xcf,0x01,0x8e,0x01,0x20,0x00,0x27,0x01,0x8e,0x01,0x22,0x00,0x27,0x01,0x8e,0x01,0x45,0xff,0xb6,0x01,0x8e,0x01,0x46,\r\n0xff,0xb4,0x01,0x8e,0x01,0x48,0xff,0xcf,0x01,0x8e,0x01,0x4c,0xff,0xcf,0x01,0x8e,0x01,0x4e,0xff,0xcf,0x01,0x8e,0x01,0x50,0xff,0xcf,0x01,0x8e,0x01,0x52,0xff,0xcf,0x01,0x8e,0x01,0x54,0xff,0xcf,0x01,0x8e,0x01,0x56,0xff,0xcf,0x01,0x8e,0x01,0x5c,0x00,0x64,0x01,0x8e,0x01,0x5e,0x00,0x64,0x01,0x8e,0x01,0x60,0x00,0x64,0x01,0x8e,\r\n0x01,0x6f,0xff,0xcf,0x01,0x8e,0x01,0x71,0xff,0xcf,0x01,0x8e,0x01,0x76,0x00,0x27,0x01,0x8e,0x01,0x85,0xff,0xb6,0x01,0x8e,0x01,0x86,0xff,0xb4,0x01,0x8e,0x01,0x87,0xff,0xb6,0x01,0x8e,0x01,0x88,0xff,0xb4,0x01,0x8e,0x01,0x8a,0xff,0xcf,0x01,0x8f,0x00,0x0f,0xff,0xa6,0x01,0x8f,0x00,0x11,0xff,0x9a,0x01,0x8f,0x00,0x46,0xff,0xfa,\r\n0x01,0x8f,0x00,0x47,0xff,0xf6,0x01,0x8f,0x00,0x48,0xff,0xf6,0x01,0x8f,0x00,0x4a,0xff,0xfa,0x01,0x8f,0x00,0x52,0xff,0xfa,0x01,0x8f,0x00,0x54,0xff,0xf6,0x01,0x8f,0x00,0x6f,0xff,0xfa,0x01,0x8f,0x00,0x70,0xff,0xf6,0x01,0x8f,0x00,0x71,0xff,0xf6,0x01,0x8f,0x00,0x72,0xff,0xf6,0x01,0x8f,0x00,0x73,0xff,0xf6,0x01,0x8f,0x00,0x79,\r\n0xff,0xfa,0x01,0x8f,0x00,0x7a,0xff,0xfa,0x01,0x8f,0x00,0x7b,0xff,0xfa,0x01,0x8f,0x00,0x7c,0xff,0xfa,0x01,0x8f,0x00,0x7d,0xff,0xfa,0x01,0x8f,0x00,0xac,0xff,0x9a,0x01,0x8f,0x00,0xb1,0xff,0xfa,0x01,0x8f,0x00,0xc4,0xff,0xb4,0x01,0x8f,0x00,0xc5,0xff,0xb4,0x01,0x8f,0x00,0xf8,0xff,0xfa,0x01,0x8f,0x00,0xfd,0xff,0xfa,0x01,0x8f,\r\n0x00,0xff,0xff,0xfa,0x01,0x8f,0x01,0x00,0xff,0xf6,0x01,0x8f,0x01,0x08,0xff,0xf6,0x01,0x8f,0x01,0x0b,0xff,0xf6,0x01,0x8f,0x01,0x0d,0xff,0xf6,0x01,0x8f,0x01,0x19,0xff,0xfa,0x01,0x8f,0x01,0x48,0xff,0xfa,0x01,0x8f,0x01,0x4c,0xff,0xf6,0x01,0x8f,0x01,0x4e,0xff,0xf6,0x01,0x8f,0x01,0x50,0xff,0xf6,0x01,0x8f,0x01,0x52,0xff,0xfa,\r\n0x01,0x8f,0x01,0x54,0xff,0xfa,0x01,0x8f,0x01,0x56,0xff,0xfa,0x01,0x8f,0x01,0x6f,0xff,0xfa,0x01,0x8f,0x01,0x71,0xff,0xfa,0x01,0x8f,0x01,0x8a,0xff,0xfa,0x01,0x90,0x00,0x0f,0xff,0x8b,0x01,0x90,0x00,0x11,0xff,0x7f,0x01,0x90,0x00,0x24,0xff,0xb6,0x01,0x90,0x00,0x37,0x00,0x27,0x01,0x90,0x00,0x44,0xff,0xb4,0x01,0x90,0x00,0x46,\r\n0xff,0xcf,0x01,0x90,0x00,0x47,0xff,0xcf,0x01,0x90,0x00,0x48,0xff,0xcf,0x01,0x90,0x00,0x4a,0xff,0xcf,0x01,0x90,0x00,0x52,0xff,0xcf,0x01,0x90,0x00,0x54,0xff,0xcf,0x01,0x90,0x00,0x62,0xff,0xb6,0x01,0x90,0x00,0x63,0xff,0xb6,0x01,0x90,0x00,0x69,0xff,0xb4,0x01,0x90,0x00,0x6a,0xff,0xb4,0x01,0x90,0x00,0x6b,0xff,0xb4,0x01,0x90,\r\n0x00,0x6c,0xff,0xb4,0x01,0x90,0x00,0x6d,0xff,0xb4,0x01,0x90,0x00,0x6e,0xff,0xb4,0x01,0x90,0x00,0x6f,0xff,0xcf,0x01,0x90,0x00,0x70,0xff,0xcf,0x01,0x90,0x00,0x71,0xff,0xcf,0x01,0x90,0x00,0x72,0xff,0xcf,0x01,0x90,0x00,0x73,0xff,0xcf,0x01,0x90,0x00,0x76,0x00,0x31,0x01,0x90,0x00,0x77,0x00,0x64,0x01,0x90,0x00,0x79,0xff,0xcf,\r\n0x01,0x90,0x00,0x7a,0xff,0xcf,0x01,0x90,0x00,0x7b,0xff,0xcf,0x01,0x90,0x00,0x7c,0xff,0xcf,0x01,0x90,0x00,0x7d,0xff,0xcf,0x01,0x90,0x00,0x91,0xff,0x9a,0x01,0x90,0x00,0xa0,0xff,0xb4,0x01,0x90,0x00,0xa2,0xff,0xa4,0x01,0x90,0x00,0xaa,0xff,0xcf,0x01,0x90,0x00,0xab,0x00,0x27,0x01,0x90,0x00,0xac,0xff,0x7f,0x01,0x90,0x00,0xad,\r\n0xff,0xb6,0x01,0x90,0x00,0xae,0xff,0xb6,0x01,0x90,0x00,0xb1,0xff,0xcf,0x01,0x90,0x00,0xbe,0xff,0xcf,0x01,0x90,0x00,0xbf,0x00,0x27,0x01,0x90,0x00,0xc4,0xff,0x7f,0x01,0x90,0x00,0xc5,0xff,0x8b,0x01,0x90,0x00,0xc7,0xff,0xb6,0x01,0x90,0x00,0xc9,0xff,0xb6,0x01,0x90,0x00,0xf8,0xff,0xcf,0x01,0x90,0x00,0xfd,0xff,0xcf,0x01,0x90,\r\n0x00,0xff,0xff,0xcf,0x01,0x90,0x01,0x00,0xff,0xcf,0x01,0x90,0x01,0x03,0xff,0xb6,0x01,0x90,0x01,0x04,0xff,0xb4,0x01,0x90,0x01,0x05,0xff,0xb6,0x01,0x90,0x01,0x06,0xff,0xb4,0x01,0x90,0x01,0x08,0xff,0xcf,0x01,0x90,0x01,0x0b,0xff,0xcf,0x01,0x90,0x01,0x0d,0xff,0xcf,0x01,0x90,0x01,0x19,0xff,0xcf,0x01,0x90,0x01,0x20,0x00,0x27,\r\n0x01,0x90,0x01,0x22,0x00,0x27,0x01,0x90,0x01,0x45,0xff,0xb6,0x01,0x90,0x01,0x46,0xff,0xb4,0x01,0x90,0x01,0x48,0xff,0xcf,0x01,0x90,0x01,0x4c,0xff,0xcf,0x01,0x90,0x01,0x4e,0xff,0xcf,0x01,0x90,0x01,0x50,0xff,0xcf,0x01,0x90,0x01,0x52,0xff,0xcf,0x01,0x90,0x01,0x54,0xff,0xcf,0x01,0x90,0x01,0x56,0xff,0xcf,0x01,0x90,0x01,0x5c,\r\n0x00,0x64,0x01,0x90,0x01,0x5e,0x00,0x64,0x01,0x90,0x01,0x60,0x00,0x64,0x01,0x90,0x01,0x6f,0xff,0xcf,0x01,0x90,0x01,0x71,0xff,0xcf,0x01,0x90,0x01,0x76,0x00,0x27,0x01,0x90,0x01,0x85,0xff,0xb6,0x01,0x90,0x01,0x86,0xff,0xb4,0x01,0x90,0x01,0x87,0xff,0xb6,0x01,0x90,0x01,0x88,0xff,0xb4,0x01,0x90,0x01,0x8a,0xff,0xcf,0x01,0x91,\r\n0x00,0x0f,0xff,0xa6,0x01,0x91,0x00,0x11,0xff,0x9a,0x01,0x91,0x00,0x46,0xff,0xfa,0x01,0x91,0x00,0x47,0xff,0xf6,0x01,0x91,0x00,0x48,0xff,0xf6,0x01,0x91,0x00,0x4a,0xff,0xfa,0x01,0x91,0x00,0x52,0xff,0xfa,0x01,0x91,0x00,0x54,0xff,0xf6,0x01,0x91,0x00,0x6f,0xff,0xfa,0x01,0x91,0x00,0x70,0xff,0xf6,0x01,0x91,0x00,0x71,0xff,0xf6,\r\n0x01,0x91,0x00,0x72,0xff,0xf6,0x01,0x91,0x00,0x73,0xff,0xf6,0x01,0x91,0x00,0x79,0xff,0xfa,0x01,0x91,0x00,0x7a,0xff,0xfa,0x01,0x91,0x00,0x7b,0xff,0xfa,0x01,0x91,0x00,0x7c,0xff,0xfa,0x01,0x91,0x00,0x7d,0xff,0xfa,0x01,0x91,0x00,0xac,0xff,0x9a,0x01,0x91,0x00,0xb1,0xff,0xfa,0x01,0x91,0x00,0xc4,0xff,0xb4,0x01,0x91,0x00,0xc5,\r\n0xff,0xb4,0x01,0x91,0x00,0xf8,0xff,0xfa,0x01,0x91,0x00,0xfd,0xff,0xfa,0x01,0x91,0x00,0xff,0xff,0xfa,0x01,0x91,0x01,0x00,0xff,0xf6,0x01,0x91,0x01,0x08,0xff,0xf6,0x01,0x91,0x01,0x0b,0xff,0xf6,0x01,0x91,0x01,0x0d,0xff,0xf6,0x01,0x91,0x01,0x19,0xff,0xfa,0x01,0x91,0x01,0x48,0xff,0xfa,0x01,0x91,0x01,0x4c,0xff,0xf6,0x01,0x91,\r\n0x01,0x4e,0xff,0xf6,0x01,0x91,0x01,0x50,0xff,0xf6,0x01,0x91,0x01,0x52,0xff,0xfa,0x01,0x91,0x01,0x54,0xff,0xfa,0x01,0x91,0x01,0x56,0xff,0xfa,0x01,0x91,0x01,0x6f,0xff,0xfa,0x01,0x91,0x01,0x71,0xff,0xfa,0x01,0x91,0x01,0x8a,0xff,0xfa,0x01,0x92,0x00,0x0f,0xff,0x50,0x01,0x92,0x00,0x11,0xff,0x3d,0x01,0x92,0x00,0x24,0xff,0x62,\r\n0x01,0x92,0x00,0x26,0xff,0xd3,0x01,0x92,0x00,0x2a,0xff,0xd3,0x01,0x92,0x00,0x2d,0xff,0xbe,0x01,0x92,0x00,0x32,0xff,0xd3,0x01,0x92,0x00,0x34,0xff,0xd3,0x01,0x92,0x00,0x36,0xff,0xe5,0x01,0x92,0x00,0x37,0x00,0x27,0x01,0x92,0x00,0x44,0xff,0x39,0x01,0x92,0x00,0x46,0xff,0x4c,0x01,0x92,0x00,0x47,0xff,0x4c,0x01,0x92,0x00,0x48,\r\n0xff,0x4c,0x01,0x92,0x00,0x49,0xff,0xe5,0x01,0x92,0x00,0x4a,0xff,0x4c,0x01,0x92,0x00,0x50,0xff,0x73,0x01,0x92,0x00,0x51,0xff,0x73,0x01,0x92,0x00,0x52,0xff,0x4c,0x01,0x92,0x00,0x53,0xff,0x73,0x01,0x92,0x00,0x54,0xff,0x4c,0x01,0x92,0x00,0x55,0xff,0x73,0x01,0x92,0x00,0x56,0xff,0x7b,0x01,0x92,0x00,0x58,0xff,0x73,0x01,0x92,\r\n0x00,0x62,0xff,0x62,0x01,0x92,0x00,0x63,0xff,0x62,0x01,0x92,0x00,0x64,0xff,0xcd,0x01,0x92,0x00,0x67,0xff,0xd3,0x01,0x92,0x00,0x69,0xff,0x39,0x01,0x92,0x00,0x6a,0xff,0x39,0x01,0x92,0x00,0x6b,0xff,0x39,0x01,0x92,0x00,0x6c,0xff,0x7f,0x01,0x92,0x00,0x6d,0xff,0x66,0x01,0x92,0x00,0x6e,0xff,0x39,0x01,0x92,0x00,0x6f,0xff,0x4c,\r\n0x01,0x92,0x00,0x70,0xff,0x4c,0x01,0x92,0x00,0x71,0xff,0x4c,0x01,0x92,0x00,0x72,0xff,0x4c,0x01,0x92,0x00,0x73,0xff,0x4c,0x01,0x92,0x00,0x77,0x00,0x5a,0x01,0x92,0x00,0x78,0xff,0x73,0x01,0x92,0x00,0x79,0xff,0x4c,0x01,0x92,0x00,0x7a,0xff,0x4c,0x01,0x92,0x00,0x7b,0xff,0x4c,0x01,0x92,0x00,0x7c,0xff,0x4c,0x01,0x92,0x00,0x7d,\r\n0xff,0x4c,0x01,0x92,0x00,0x7e,0xff,0x73,0x01,0x92,0x00,0x7f,0xff,0x73,0x01,0x92,0x00,0x80,0xff,0x73,0x01,0x92,0x00,0x81,0xff,0x73,0x01,0x92,0x00,0x91,0xff,0x3f,0x01,0x92,0x00,0x92,0xff,0xd3,0x01,0x92,0x00,0xa0,0xff,0x39,0x01,0x92,0x00,0xa2,0xff,0x1b,0x01,0x92,0x00,0xaa,0xff,0xcf,0x01,0x92,0x00,0xac,0xff,0x3d,0x01,0x92,\r\n0x00,0xad,0xff,0x62,0x01,0x92,0x00,0xae,0xff,0x62,0x01,0x92,0x00,0xaf,0xff,0xd3,0x01,0x92,0x00,0xb0,0xff,0xd3,0x01,0x92,0x00,0xb1,0xff,0x4c,0x01,0x92,0x00,0xbe,0xff,0x9a,0x01,0x92,0x00,0xc4,0xff,0x08,0x01,0x92,0x00,0xc5,0xff,0x08,0x01,0x92,0x00,0xc7,0xff,0x62,0x01,0x92,0x00,0xc9,0xff,0x62,0x01,0x92,0x00,0xd0,0xff,0xd3,\r\n0x01,0x92,0x00,0xd1,0xff,0xd3,0x01,0x92,0x00,0xd2,0xff,0xd3,0x01,0x92,0x00,0xe3,0xff,0xe5,0x01,0x92,0x00,0xe4,0xff,0x7b,0x01,0x92,0x00,0xf7,0xff,0xd3,0x01,0x92,0x00,0xf8,0xff,0x4c,0x01,0x92,0x00,0xfa,0xff,0xe5,0x01,0x92,0x00,0xfb,0xff,0x7b,0x01,0x92,0x00,0xfc,0xff,0xd3,0x01,0x92,0x00,0xfd,0xff,0x4c,0x01,0x92,0x00,0xfe,\r\n0xff,0xd3,0x01,0x92,0x00,0xff,0xff,0x4c,0x01,0x92,0x01,0x00,0xff,0x4c,0x01,0x92,0x01,0x03,0xff,0x62,0x01,0x92,0x01,0x04,0xff,0x7f,0x01,0x92,0x01,0x05,0xff,0x62,0x01,0x92,0x01,0x06,0xff,0x39,0x01,0x92,0x01,0x08,0xff,0x4c,0x01,0x92,0x01,0x0b,0xff,0x4c,0x01,0x92,0x01,0x0d,0xff,0x4c,0x01,0x92,0x01,0x15,0xff,0x73,0x01,0x92,\r\n0x01,0x17,0xff,0x73,0x01,0x92,0x01,0x18,0xff,0xd3,0x01,0x92,0x01,0x19,0xff,0x4c,0x01,0x92,0x01,0x1b,0xff,0x73,0x01,0x92,0x01,0x1d,0xff,0x73,0x01,0x92,0x01,0x1e,0xff,0xe5,0x01,0x92,0x01,0x1f,0xff,0x7b,0x01,0x92,0x01,0x20,0x00,0x27,0x01,0x92,0x01,0x22,0x00,0x27,0x01,0x92,0x01,0x25,0xff,0x73,0x01,0x92,0x01,0x27,0xff,0x73,\r\n0x01,0x92,0x01,0x45,0xff,0x62,0x01,0x92,0x01,0x46,0xff,0x7f,0x01,0x92,0x01,0x47,0xff,0xd3,0x01,0x92,0x01,0x48,0xff,0x4c,0x01,0x92,0x01,0x4c,0xff,0x4c,0x01,0x92,0x01,0x4e,0xff,0x4c,0x01,0x92,0x01,0x50,0xff,0x4c,0x01,0x92,0x01,0x51,0xff,0xd3,0x01,0x92,0x01,0x52,0xff,0x4c,0x01,0x92,0x01,0x53,0xff,0xd3,0x01,0x92,0x01,0x54,\r\n0xff,0x4c,0x01,0x92,0x01,0x55,0xff,0xd3,0x01,0x92,0x01,0x56,0xff,0x4c,0x01,0x92,0x01,0x5c,0x00,0x5a,0x01,0x92,0x01,0x5e,0x00,0x5a,0x01,0x92,0x01,0x60,0x00,0x5a,0x01,0x92,0x01,0x63,0xff,0xbe,0x01,0x92,0x01,0x6d,0xff,0x73,0x01,0x92,0x01,0x6e,0xff,0xd3,0x01,0x92,0x01,0x6f,0xff,0x4c,0x01,0x92,0x01,0x70,0xff,0xd3,0x01,0x92,\r\n0x01,0x71,0xff,0x4c,0x01,0x92,0x01,0x73,0xff,0x73,0x01,0x92,0x01,0x74,0xff,0xe5,0x01,0x92,0x01,0x75,0xff,0x7b,0x01,0x92,0x01,0x76,0x00,0x27,0x01,0x92,0x01,0x79,0xff,0x73,0x01,0x92,0x01,0x7b,0xff,0x73,0x01,0x92,0x01,0x7d,0xff,0x73,0x01,0x92,0x01,0x7f,0xff,0x73,0x01,0x92,0x01,0x85,0xff,0x62,0x01,0x92,0x01,0x86,0xff,0x7f,\r\n0x01,0x92,0x01,0x87,0xff,0x62,0x01,0x92,0x01,0x88,0xff,0x39,0x01,0x92,0x01,0x89,0xff,0xd3,0x01,0x92,0x01,0x8a,0xff,0x4c,0x01,0x92,0x02,0x3d,0xff,0xe5,0x01,0x92,0x02,0x3e,0xff,0x7b,0x01,0x93,0x00,0x05,0x00,0x1d,0x01,0x93,0x00,0x0a,0x00,0x1d,0x01,0x93,0x00,0x0f,0xff,0x9a,0x01,0x93,0x00,0x11,0xff,0x81,0x01,0x93,0x00,0x22,\r\n0xff,0xb4,0x01,0x93,0x00,0x46,0xff,0xf6,0x01,0x93,0x00,0x47,0xff,0xf6,0x01,0x93,0x00,0x48,0xff,0xf6,0x01,0x93,0x00,0x49,0x00,0x04,0x01,0x93,0x00,0x4a,0xff,0xf6,0x01,0x93,0x00,0x52,0xff,0xf6,0x01,0x93,0x00,0x54,0xff,0xf6,0x01,0x93,0x00,0x57,0x00,0x06,0x01,0x93,0x00,0x6f,0xff,0xf6,0x01,0x93,0x00,0x70,0xff,0xf6,0x01,0x93,\r\n0x00,0x71,0xff,0xf6,0x01,0x93,0x00,0x72,0xff,0xf6,0x01,0x93,0x00,0x73,0xff,0xf6,0x01,0x93,0x00,0x79,0xff,0xf6,0x01,0x93,0x00,0x7a,0xff,0xf6,0x01,0x93,0x00,0x7b,0xff,0xf6,0x01,0x93,0x00,0x7c,0xff,0xf6,0x01,0x93,0x00,0x7d,0xff,0xf6,0x01,0x93,0x00,0xac,0xff,0x81,0x01,0x93,0x00,0xb1,0xff,0xf6,0x01,0x93,0x00,0xbf,0x00,0x0c,\r\n0x01,0x93,0x00,0xc4,0xff,0x8d,0x01,0x93,0x00,0xc5,0xff,0x8d,0x01,0x93,0x00,0xf8,0xff,0xf6,0x01,0x93,0x00,0xfd,0xff,0xf6,0x01,0x93,0x00,0xff,0xff,0xf6,0x01,0x93,0x01,0x00,0xff,0xf6,0x01,0x93,0x01,0x08,0xff,0xf6,0x01,0x93,0x01,0x0b,0xff,0xf6,0x01,0x93,0x01,0x0d,0xff,0xf6,0x01,0x93,0x01,0x19,0xff,0xf6,0x01,0x93,0x01,0x21,\r\n0x00,0x06,0x01,0x93,0x01,0x23,0x00,0x06,0x01,0x93,0x01,0x48,0xff,0xf6,0x01,0x93,0x01,0x4c,0xff,0xf6,0x01,0x93,0x01,0x4e,0xff,0xf6,0x01,0x93,0x01,0x50,0xff,0xf6,0x01,0x93,0x01,0x52,0xff,0xf6,0x01,0x93,0x01,0x54,0xff,0xf6,0x01,0x93,0x01,0x56,0xff,0xf6,0x01,0x93,0x01,0x6f,0xff,0xf6,0x01,0x93,0x01,0x71,0xff,0xf6,0x01,0x93,\r\n0x01,0x77,0x00,0x06,0x01,0x93,0x01,0x8a,0xff,0xf6,0x01,0xa1,0x00,0x0d,0xff,0x7f,0x01,0xa1,0x00,0x8d,0xff,0x98,0x01,0xa1,0x00,0xb4,0xff,0x66,0x01,0xa1,0x00,0xb5,0xff,0x3d,0x01,0xa1,0x00,0xb6,0xff,0x66,0x01,0xa1,0x00,0xb7,0xff,0x3d,0x01,0xa1,0x01,0x2d,0xff,0xe5,0x01,0xa1,0x01,0x2e,0xff,0xcf,0x01,0xa1,0x01,0x33,0xff,0x8f,\r\n0x01,0xa1,0x01,0xb4,0xff,0xe5,0x01,0xa1,0x01,0xb7,0x00,0x3d,0x01,0xa1,0x01,0xb8,0xff,0x6d,0x01,0xa1,0x01,0xb9,0xff,0x64,0x01,0xa1,0x01,0xbb,0xff,0x79,0x01,0xa1,0x01,0xbe,0xff,0x64,0x01,0xa1,0x01,0xc5,0xff,0xaa,0x01,0xa1,0x01,0xc8,0xff,0xe7,0x01,0xa1,0x01,0xd3,0xff,0xcf,0x01,0xa2,0x00,0xa9,0x00,0x0c,0x01,0xa2,0x01,0xa8,\r\n0x00,0x0a,0x01,0xa2,0x01,0xa9,0x00,0x0c,0x01,0xa2,0x01,0xb0,0x00,0x0c,0x01,0xa2,0x01,0xb8,0x00,0x33,0x01,0xa5,0x01,0xa9,0xff,0xe5,0x01,0xa5,0x01,0xb0,0xff,0xe5,0x01,0xa5,0x01,0xb8,0xff,0xa4,0x01,0xa5,0x01,0xb9,0xff,0xe7,0x01,0xa5,0x01,0xbe,0xff,0xe7,0x01,0xa5,0x01,0xcb,0xff,0xd7,0x01,0xa6,0x00,0x04,0xff,0xd7,0x01,0xa6,\r\n0x00,0x11,0xff,0x71,0x01,0xa6,0x00,0x1e,0xff,0x4c,0x01,0xa6,0x00,0xa2,0xff,0xd7,0x01,0xa6,0x00,0xa9,0xff,0x71,0x01,0xa6,0x00,0xac,0xff,0x71,0x01,0xa6,0x01,0x2d,0xff,0xd3,0x01,0xa6,0x01,0x2e,0xff,0xd3,0x01,0xa6,0x01,0x2f,0xff,0x4c,0x01,0xa6,0x01,0x30,0xff,0xc3,0x01,0xa6,0x01,0x31,0xff,0x9c,0x01,0xa6,0x01,0x32,0xff,0x4c,\r\n0x01,0xa6,0x01,0x33,0xff,0xcf,0x01,0xa6,0x01,0x34,0xff,0x4c,0x01,0xa6,0x01,0xa9,0xff,0x60,0x01,0xa6,0x01,0xb0,0xff,0x60,0x01,0xa6,0x01,0xb4,0xff,0xd3,0x01,0xa6,0x01,0xb8,0x00,0x29,0x01,0xa6,0x01,0xbf,0xff,0x4c,0x01,0xa6,0x01,0xc0,0xff,0x9c,0x01,0xa6,0x01,0xc3,0xff,0x9a,0x01,0xa6,0x01,0xc6,0xff,0xc1,0x01,0xa6,0x01,0xc7,\r\n0xff,0x71,0x01,0xa6,0x01,0xc9,0xff,0xd7,0x01,0xa6,0x01,0xca,0xff,0x71,0x01,0xa6,0x01,0xcc,0xff,0x71,0x01,0xa6,0x01,0xce,0xff,0xb0,0x01,0xa6,0x01,0xcf,0xff,0x4c,0x01,0xa6,0x01,0xd0,0xff,0x71,0x01,0xa6,0x01,0xd1,0xff,0x4c,0x01,0xa6,0x01,0xd2,0xff,0x9a,0x01,0xa6,0x01,0xd3,0xff,0xdb,0x01,0xa6,0x01,0xd4,0xff,0x9a,0x01,0xa6,\r\n0x01,0xd5,0xff,0x4c,0x01,0xa6,0x01,0xd7,0xff,0x9a,0x01,0xa6,0x01,0xd8,0xff,0x4c,0x01,0xa6,0x01,0xd9,0xff,0x9a,0x01,0xa6,0x01,0xda,0xff,0x4c,0x01,0xa6,0x02,0x37,0xff,0xcf,0x01,0xa8,0x01,0xcb,0x00,0x6a,0x01,0xa9,0x00,0x0d,0xff,0x7f,0x01,0xa9,0x00,0x0f,0x00,0x46,0x01,0xa9,0x00,0x1e,0x00,0x46,0x01,0xa9,0x00,0x8d,0xff,0x98,\r\n0x01,0xa9,0x00,0xa4,0xff,0xf6,0x01,0xa9,0x00,0xb4,0xff,0x66,0x01,0xa9,0x00,0xb5,0xff,0x3d,0x01,0xa9,0x00,0xb6,0xff,0x66,0x01,0xa9,0x00,0xb7,0xff,0x3d,0x01,0xa9,0x01,0x2d,0xff,0xe5,0x01,0xa9,0x01,0x2e,0xff,0xcf,0x01,0xa9,0x01,0x33,0xff,0x8f,0x01,0xa9,0x01,0xb4,0xff,0xe5,0x01,0xa9,0x01,0xb7,0x00,0x3d,0x01,0xa9,0x01,0xb8,\r\n0xff,0x6d,0x01,0xa9,0x01,0xb9,0xff,0x64,0x01,0xa9,0x01,0xbb,0xff,0x79,0x01,0xa9,0x01,0xbe,0xff,0x64,0x01,0xa9,0x01,0xc5,0xff,0xaa,0x01,0xa9,0x01,0xc8,0xff,0xe7,0x01,0xa9,0x01,0xcb,0x00,0x3d,0x01,0xa9,0x01,0xcd,0xff,0xcf,0x01,0xa9,0x01,0xd3,0xff,0xcf,0x01,0xa9,0x01,0xd4,0xff,0xf6,0x01,0xaa,0x00,0xc4,0xff,0xb0,0x01,0xaa,\r\n0x00,0xc5,0xff,0xb0,0x01,0xaa,0x01,0xb8,0xff,0xa4,0x01,0xaa,0x01,0xb9,0xff,0xbe,0x01,0xaa,0x01,0xbb,0xff,0xe7,0x01,0xaa,0x01,0xbe,0xff,0xbe,0x01,0xaa,0x01,0xd3,0xff,0xe7,0x01,0xab,0x00,0xa9,0x00,0x0c,0x01,0xab,0x01,0xa8,0x00,0x0a,0x01,0xab,0x01,0xa9,0x00,0x0c,0x01,0xab,0x01,0xb0,0x00,0x0c,0x01,0xab,0x01,0xb8,0x00,0x33,\r\n0x01,0xab,0x01,0xba,0x00,0x0a,0x01,0xac,0x00,0xab,0x00,0x29,0x01,0xac,0x00,0xbf,0x00,0x52,0x01,0xac,0x01,0xa8,0x00,0x3d,0x01,0xac,0x01,0xb8,0x00,0x29,0x01,0xac,0x01,0xcb,0x00,0x25,0x01,0xaf,0x00,0x0f,0x00,0x29,0x01,0xaf,0x00,0x1e,0x00,0x29,0x01,0xaf,0x00,0xc4,0x00,0x46,0x01,0xaf,0x00,0xc5,0x00,0x46,0x01,0xaf,0x01,0x2d,\r\n0xff,0xa6,0x01,0xaf,0x01,0x2e,0xff,0x91,0x01,0xaf,0x01,0x2f,0xff,0xe7,0x01,0xaf,0x01,0x30,0xff,0xe7,0x01,0xaf,0x01,0x32,0xff,0xe7,0x01,0xaf,0x01,0x33,0xff,0x9a,0x01,0xaf,0x01,0x34,0xff,0xe7,0x01,0xaf,0x01,0xa8,0x00,0x4a,0x01,0xaf,0x01,0xac,0x00,0x29,0x01,0xaf,0x01,0xb4,0xff,0xa6,0x01,0xaf,0x01,0xb7,0x00,0x3f,0x01,0xaf,\r\n0x01,0xba,0x00,0x25,0x01,0xaf,0x01,0xbb,0xff,0xdb,0x01,0xaf,0x01,0xbf,0xff,0xe7,0x01,0xaf,0x01,0xc2,0xff,0xe7,0x01,0xaf,0x01,0xc3,0xff,0xe7,0x01,0xaf,0x01,0xc5,0xff,0xd1,0x01,0xaf,0x01,0xc8,0xff,0xe7,0x01,0xaf,0x01,0xc9,0xff,0xe7,0x01,0xaf,0x01,0xca,0x00,0x29,0x01,0xaf,0x01,0xcb,0x00,0x3d,0x01,0xaf,0x01,0xcc,0x00,0x29,\r\n0x01,0xaf,0x01,0xcf,0xff,0xe7,0x01,0xaf,0x01,0xd1,0xff,0xe7,0x01,0xaf,0x01,0xd2,0xff,0xe7,0x01,0xaf,0x01,0xd4,0xff,0xe7,0x01,0xaf,0x01,0xd5,0xff,0xe7,0x01,0xaf,0x01,0xd7,0xff,0xe7,0x01,0xaf,0x01,0xd9,0xff,0xe7,0x01,0xaf,0x01,0xda,0xff,0xe7,0x01,0xb0,0x00,0x0d,0xff,0x7f,0x01,0xb0,0x00,0x8d,0xff,0x98,0x01,0xb0,0x00,0xb4,\r\n0xff,0x66,0x01,0xb0,0x00,0xb5,0xff,0x3d,0x01,0xb0,0x00,0xb6,0xff,0x66,0x01,0xb0,0x00,0xb7,0xff,0x3d,0x01,0xb0,0x01,0x2d,0xff,0xe5,0x01,0xb0,0x01,0x2e,0xff,0xcf,0x01,0xb0,0x01,0x33,0xff,0x8f,0x01,0xb0,0x01,0xb4,0xff,0xe5,0x01,0xb0,0x01,0xb7,0x00,0x3d,0x01,0xb0,0x01,0xb8,0xff,0x6d,0x01,0xb0,0x01,0xb9,0xff,0x64,0x01,0xb0,\r\n0x01,0xbb,0xff,0x79,0x01,0xb0,0x01,0xbe,0xff,0x64,0x01,0xb0,0x01,0xc3,0xff,0xf6,0x01,0xb0,0x01,0xc5,0xff,0xaa,0x01,0xb0,0x01,0xc8,0xff,0xe7,0x01,0xb0,0x01,0xcb,0x00,0x3d,0x01,0xb0,0x01,0xcd,0xff,0xcf,0x01,0xb0,0x01,0xd3,0xff,0xcf,0x01,0xb0,0x01,0xd4,0xff,0xf6,0x01,0xb0,0x01,0xd9,0xff,0xf6,0x01,0xb3,0x01,0xa8,0x00,0x3d,\r\n0x01,0xb3,0x01,0xb7,0x00,0x25,0x01,0xb3,0x01,0xcb,0x00,0x3d,0x01,0xb4,0x00,0x0f,0xff,0xa2,0x01,0xb4,0x00,0xa9,0xff,0xcf,0x01,0xb4,0x00,0xc4,0xff,0x4a,0x01,0xb4,0x00,0xc5,0xff,0x96,0x01,0xb4,0x01,0xa9,0xff,0xe5,0x01,0xb4,0x01,0xac,0xff,0xcd,0x01,0xb4,0x01,0xb0,0xff,0xe5,0x01,0xb4,0x01,0xb7,0xff,0xe3,0x01,0xb4,0x01,0xb8,\r\n0xff,0xa4,0x01,0xb4,0x01,0xb9,0xff,0xe7,0x01,0xb4,0x01,0xba,0xff,0xdb,0x01,0xb4,0x01,0xbe,0xff,0xe7,0x01,0xb4,0x01,0xcb,0xff,0xd7,0x01,0xb6,0x00,0x0f,0xfe,0xba,0x01,0xb6,0x00,0x11,0xfe,0xba,0x01,0xb6,0x00,0xa9,0xff,0x58,0x01,0xb6,0x00,0xac,0xfe,0xba,0x01,0xb6,0x00,0xc4,0xfe,0xba,0x01,0xb6,0x00,0xc5,0xfe,0xae,0x01,0xb6,\r\n0x01,0x2f,0xff,0xb2,0x01,0xb6,0x01,0x30,0xff,0xb2,0x01,0xb6,0x01,0x32,0xff,0xb2,0x01,0xb6,0x01,0x34,0xff,0xb2,0x01,0xb6,0x01,0xa9,0xff,0x60,0x01,0xb6,0x01,0xb0,0xff,0x60,0x01,0xb6,0x01,0xba,0xff,0xc3,0x01,0xb6,0x01,0xbf,0xff,0xb2,0x01,0xb6,0x01,0xcb,0xff,0xc3,0x01,0xb6,0x01,0xcf,0xff,0xb2,0x01,0xb6,0x01,0xd0,0xff,0xa0,\r\n0x01,0xb6,0x01,0xd1,0xff,0xc3,0x01,0xb6,0x01,0xd5,0xff,0xc3,0x01,0xb6,0x01,0xd8,0xff,0xb2,0x01,0xb7,0x00,0xa9,0x00,0x3d,0x01,0xb7,0x01,0x2d,0xff,0xe7,0x01,0xb7,0x01,0x2e,0xff,0xe7,0x01,0xb7,0x01,0x33,0xff,0xb6,0x01,0xb7,0x01,0xa9,0x00,0x3d,0x01,0xb7,0x01,0xb0,0x00,0x3d,0x01,0xb7,0x01,0xb3,0x00,0x25,0x01,0xb7,0x01,0xb4,\r\n0xff,0xe7,0x01,0xb7,0x01,0xba,0x00,0x12,0x01,0xb7,0x01,0xcb,0x00,0x3d,0x01,0xb7,0x01,0xd3,0xff,0xdb,0x01,0xb8,0x00,0x0f,0xff,0x7d,0x01,0xb8,0x00,0x11,0xff,0x4c,0x01,0xb8,0x00,0x1d,0xff,0x7d,0x01,0xb8,0x00,0x1e,0xff,0xe9,0x01,0xb8,0x00,0x8d,0x00,0x52,0x01,0xb8,0x00,0xa9,0xff,0x6d,0x01,0xb8,0x00,0xaa,0xff,0x98,0x01,0xb8,\r\n0x00,0xab,0xff,0xcd,0x01,0xb8,0x00,0xac,0xff,0x4c,0x01,0xb8,0x00,0xb5,0x00,0x29,0x01,0xb8,0x00,0xb7,0x00,0x29,0x01,0xb8,0x00,0xbe,0xff,0x98,0x01,0xb8,0x00,0xbf,0xff,0xcd,0x01,0xb8,0x00,0xc4,0xff,0x14,0x01,0xb8,0x00,0xc5,0xff,0x14,0x01,0xb8,0x01,0x2d,0xff,0xa4,0x01,0xb8,0x01,0x2e,0xff,0xa4,0x01,0xb8,0x01,0x2f,0xff,0x2b,\r\n0x01,0xb8,0x01,0x30,0xff,0xb0,0x01,0xb8,0x01,0x31,0xff,0x2b,0x01,0xb8,0x01,0x32,0xff,0x2b,0x01,0xb8,0x01,0x33,0xff,0x8f,0x01,0xb8,0x01,0x34,0xff,0x2b,0x01,0xb8,0x01,0xa8,0x00,0x7b,0x01,0xb8,0x01,0xa9,0xff,0x66,0x01,0xb8,0x01,0xb0,0xff,0x66,0x01,0xb8,0x01,0xb4,0xff,0xa4,0x01,0xb8,0x01,0xb8,0x00,0x29,0x01,0xb8,0x01,0xb9,\r\n0x00,0x1d,0x01,0xb8,0x01,0xba,0xff,0xf8,0x01,0xb8,0x01,0xbe,0x00,0x1d,0x01,0xb8,0x01,0xbf,0xff,0x2b,0x01,0xb8,0x01,0xc0,0xff,0x2b,0x01,0xb8,0x01,0xc1,0xff,0x4e,0x01,0xb8,0x01,0xc2,0xff,0x8f,0x01,0xb8,0x01,0xc3,0xff,0x4e,0x01,0xb8,0x01,0xc5,0xff,0xc1,0x01,0xb8,0x01,0xc6,0xff,0xc1,0x01,0xb8,0x01,0xc7,0xff,0x4e,0x01,0xb8,\r\n0x01,0xc9,0xff,0x4e,0x01,0xb8,0x01,0xca,0xff,0x4e,0x01,0xb8,0x01,0xcc,0xff,0x4e,0x01,0xb8,0x01,0xce,0xff,0xb0,0x01,0xb8,0x01,0xcf,0xff,0x2b,0x01,0xb8,0x01,0xd0,0xff,0x4e,0x01,0xb8,0x01,0xd1,0xff,0x2b,0x01,0xb8,0x01,0xd2,0xff,0x4e,0x01,0xb8,0x01,0xd3,0xff,0x7f,0x01,0xb8,0x01,0xd4,0xff,0x4e,0x01,0xb8,0x01,0xd5,0xff,0x2b,\r\n0x01,0xb8,0x01,0xd6,0x00,0x52,0x01,0xb8,0x01,0xd7,0xff,0x4e,0x01,0xb8,0x01,0xd8,0xff,0x2b,0x01,0xb8,0x01,0xd9,0xff,0x4e,0x01,0xb8,0x01,0xda,0xff,0x2b,0x01,0xb8,0x02,0x37,0xff,0x8f,0x01,0xb9,0x00,0x0f,0xff,0x50,0x01,0xb9,0x00,0x11,0xff,0x3d,0x01,0xb9,0x00,0x1e,0xff,0x4c,0x01,0xb9,0x00,0xa2,0xff,0x19,0x01,0xb9,0x00,0xa9,\r\n0xff,0x71,0x01,0xb9,0x00,0xaa,0xff,0xcd,0x01,0xb9,0x00,0xac,0xff,0x3d,0x01,0xb9,0x00,0xbe,0xff,0x98,0x01,0xb9,0x00,0xc4,0xff,0x06,0x01,0xb9,0x00,0xc5,0xff,0x06,0x01,0xb9,0x01,0x2d,0xff,0xd3,0x01,0xb9,0x01,0x2e,0xff,0xd3,0x01,0xb9,0x01,0x2f,0xff,0x4c,0x01,0xb9,0x01,0x30,0xff,0xc3,0x01,0xb9,0x01,0x31,0xff,0x9c,0x01,0xb9,\r\n0x01,0x32,0xff,0x4c,0x01,0xb9,0x01,0x33,0xff,0xcf,0x01,0xb9,0x01,0x34,0xff,0x4c,0x01,0xb9,0x01,0xa8,0x00,0x5c,0x01,0xb9,0x01,0xa9,0xff,0x60,0x01,0xb9,0x01,0xb0,0xff,0x60,0x01,0xb9,0x01,0xb4,0xff,0xd3,0x01,0xb9,0x01,0xb8,0x00,0x29,0x01,0xb9,0x01,0xbf,0xff,0x4c,0x01,0xb9,0x01,0xc0,0xff,0x9c,0x01,0xb9,0x01,0xc2,0xff,0x9a,\r\n0x01,0xb9,0x01,0xc3,0xff,0x9a,0x01,0xb9,0x01,0xc6,0xff,0xc1,0x01,0xb9,0x01,0xc7,0xff,0x71,0x01,0xb9,0x01,0xc9,0xff,0x9a,0x01,0xb9,0x01,0xca,0xff,0x71,0x01,0xb9,0x01,0xcc,0xff,0x71,0x01,0xb9,0x01,0xce,0xff,0xb0,0x01,0xb9,0x01,0xcf,0xff,0x4c,0x01,0xb9,0x01,0xd0,0xff,0x71,0x01,0xb9,0x01,0xd1,0xff,0x4c,0x01,0xb9,0x01,0xd2,\r\n0xff,0x9a,0x01,0xb9,0x01,0xd3,0xff,0xdb,0x01,0xb9,0x01,0xd4,0xff,0x9a,0x01,0xb9,0x01,0xd5,0xff,0x4c,0x01,0xb9,0x01,0xd6,0x00,0x29,0x01,0xb9,0x01,0xd7,0xff,0x9a,0x01,0xb9,0x01,0xd8,0xff,0x4c,0x01,0xb9,0x01,0xd9,0xff,0x9a,0x01,0xb9,0x01,0xda,0xff,0x4c,0x01,0xb9,0x02,0x37,0xff,0xcf,0x01,0xba,0x00,0x0f,0x00,0x46,0x01,0xba,\r\n0x00,0x10,0xff,0xe7,0x01,0xba,0x00,0x11,0x00,0x39,0x01,0xba,0x00,0x1e,0x00,0x52,0x01,0xba,0x00,0xa9,0x00,0x3d,0x01,0xba,0x00,0xac,0x00,0x39,0x01,0xba,0x00,0xc4,0x00,0x46,0x01,0xba,0x00,0xc5,0x00,0x52,0x01,0xba,0x01,0x2d,0xff,0xe7,0x01,0xba,0x01,0x2e,0xff,0xe7,0x01,0xba,0x01,0x33,0xff,0xc3,0x01,0xba,0x01,0xa8,0x00,0x52,\r\n0x01,0xba,0x01,0xb4,0xff,0xe7,0x01,0xba,0x01,0xb7,0x00,0x12,0x01,0xba,0x01,0xb8,0x00,0x23,0x01,0xba,0x01,0xc2,0xff,0xe7,0x01,0xba,0x01,0xc3,0xff,0xe7,0x01,0xba,0x01,0xc9,0xff,0xe7,0x01,0xba,0x01,0xd2,0xff,0xe7,0x01,0xba,0x01,0xd4,0xff,0xe7,0x01,0xba,0x01,0xd6,0x00,0x0a,0x01,0xba,0x01,0xd7,0xff,0xe7,0x01,0xba,0x01,0xd9,\r\n0xff,0xe7,0x01,0xbb,0x00,0xa9,0xff,0x71,0x01,0xbb,0x01,0x2f,0xff,0xe7,0x01,0xbb,0x01,0x30,0xff,0xe7,0x01,0xbb,0x01,0x32,0xff,0xe7,0x01,0xbb,0x01,0x34,0xff,0xe7,0x01,0xbb,0x01,0xa9,0xff,0x6d,0x01,0xbb,0x01,0xb0,0xff,0x6d,0x01,0xbb,0x01,0xbf,0xff,0xe7,0x01,0xbb,0x01,0xcf,0xff,0xe7,0x01,0xbb,0x01,0xd1,0xff,0xe7,0x01,0xbb,\r\n0x01,0xd5,0xff,0xe7,0x01,0xbb,0x01,0xd8,0xff,0xe7,0x01,0xbb,0x01,0xda,0xff,0xe7,0x01,0xbc,0x00,0xa9,0x00,0x12,0x01,0xbe,0x00,0x04,0xff,0xd7,0x01,0xbe,0x00,0x11,0xff,0x71,0x01,0xbe,0x00,0x1e,0xff,0x4c,0x01,0xbe,0x00,0xa2,0xff,0xd7,0x01,0xbe,0x00,0xa9,0xff,0x71,0x01,0xbe,0x00,0xac,0xff,0x71,0x01,0xbe,0x01,0x2d,0xff,0xd3,\r\n0x01,0xbe,0x01,0x2e,0xff,0xd3,0x01,0xbe,0x01,0x2f,0xff,0x4c,0x01,0xbe,0x01,0x30,0xff,0xc3,0x01,0xbe,0x01,0x31,0xff,0x9c,0x01,0xbe,0x01,0x32,0xff,0x4c,0x01,0xbe,0x01,0x33,0xff,0xcf,0x01,0xbe,0x01,0x34,0xff,0x4c,0x01,0xbe,0x01,0xa9,0xff,0x60,0x01,0xbe,0x01,0xb0,0xff,0x60,0x01,0xbe,0x01,0xb4,0xff,0xd3,0x01,0xbe,0x01,0xb8,\r\n0x00,0x29,0x01,0xbe,0x01,0xbf,0xff,0x4c,0x01,0xbe,0x01,0xc0,0xff,0x9c,0x01,0xbe,0x01,0xc3,0xff,0x9a,0x01,0xbe,0x01,0xc6,0xff,0xc1,0x01,0xbe,0x01,0xc7,0xff,0x71,0x01,0xbe,0x01,0xc9,0xff,0xd7,0x01,0xbe,0x01,0xca,0xff,0x71,0x01,0xbe,0x01,0xcc,0xff,0x71,0x01,0xbe,0x01,0xce,0xff,0xb0,0x01,0xbe,0x01,0xcf,0xff,0x4c,0x01,0xbe,\r\n0x01,0xd0,0xff,0x71,0x01,0xbe,0x01,0xd1,0xff,0x4c,0x01,0xbe,0x01,0xd2,0xff,0x9a,0x01,0xbe,0x01,0xd3,0xff,0xdb,0x01,0xbe,0x01,0xd4,0xff,0x9a,0x01,0xbe,0x01,0xd5,0xff,0x4c,0x01,0xbe,0x01,0xd7,0xff,0x9a,0x01,0xbe,0x01,0xd8,0xff,0x4c,0x01,0xbe,0x01,0xd9,0xff,0x9a,0x01,0xbe,0x01,0xda,0xff,0x4c,0x01,0xbe,0x02,0x37,0xff,0xcf,\r\n0x01,0xbf,0x00,0x1e,0xff,0xee,0x01,0xbf,0x01,0x2f,0xff,0xee,0x01,0xbf,0x01,0x30,0xff,0xee,0x01,0xbf,0x01,0x32,0xff,0xee,0x01,0xbf,0x01,0x34,0xff,0xee,0x01,0xbf,0x01,0xcf,0xff,0xee,0x01,0xbf,0x01,0xd1,0xff,0xee,0x01,0xbf,0x01,0xd5,0xff,0xee,0x01,0xc1,0x00,0x05,0xff,0x98,0x01,0xc1,0x00,0x0a,0xff,0x98,0x01,0xc2,0x01,0xcb,\r\n0x00,0x6a,0x01,0xc3,0x00,0x05,0xff,0x6f,0x01,0xc3,0x00,0x0a,0xff,0x6f,0x01,0xc3,0x01,0xc5,0xff,0xdb,0x01,0xc3,0x01,0xcb,0xff,0xe7,0x01,0xc3,0x01,0xd3,0xff,0xe7,0x01,0xc4,0x01,0x33,0xff,0xd1,0x01,0xc4,0x01,0xd3,0xff,0xc1,0x01,0xc5,0x01,0x30,0xff,0xe5,0x01,0xc5,0x01,0x33,0x00,0x19,0x01,0xc5,0x01,0xc8,0x00,0x19,0x01,0xc5,\r\n0x01,0xd0,0xff,0xe7,0x01,0xc5,0x02,0x37,0x00,0x19,0x01,0xc6,0x01,0x2f,0xff,0xb6,0x01,0xc6,0x01,0x30,0xff,0xb6,0x01,0xc6,0x01,0x32,0xff,0xb6,0x01,0xc6,0x01,0x33,0xff,0x81,0x01,0xc6,0x01,0x34,0xff,0xb6,0x01,0xc6,0x01,0xa8,0x00,0x3d,0x01,0xc6,0x01,0xbf,0xff,0xb6,0x01,0xc6,0x01,0xc3,0xff,0xe7,0x01,0xc6,0x01,0xc5,0xff,0xc3,\r\n0x01,0xc6,0x01,0xcd,0xff,0x8f,0x01,0xc6,0x01,0xcf,0xff,0xb6,0x01,0xc6,0x01,0xd1,0xff,0xb6,0x01,0xc6,0x01,0xd2,0xff,0xe7,0x01,0xc6,0x01,0xd4,0xff,0xc3,0x01,0xc6,0x01,0xd5,0xff,0xb6,0x01,0xc6,0x01,0xd7,0xff,0xe7,0x01,0xc6,0x01,0xd8,0xff,0xb6,0x01,0xc6,0x01,0xd9,0xff,0xe7,0x01,0xc7,0x00,0x05,0xff,0x98,0x01,0xc7,0x00,0x0a,\r\n0xff,0x98,0x01,0xc9,0x01,0xcb,0x00,0x6a,0x01,0xca,0x00,0x0f,0x00,0x29,0x01,0xca,0x00,0x10,0xff,0xb8,0x01,0xca,0x00,0x11,0x00,0x29,0x01,0xca,0x00,0x1d,0x00,0x52,0x01,0xca,0x00,0x1e,0x00,0x52,0x01,0xca,0x00,0xac,0x00,0x29,0x01,0xca,0x01,0x2f,0xff,0xd7,0x01,0xca,0x01,0x30,0xff,0xd7,0x01,0xca,0x01,0x32,0xff,0xd7,0x01,0xca,\r\n0x01,0x34,0xff,0xd7,0x01,0xca,0x01,0xbf,0xff,0xd7,0x01,0xca,0x01,0xcb,0x00,0x31,0x01,0xca,0x01,0xcf,0xff,0xd7,0x01,0xca,0x01,0xd1,0xff,0xd7,0x01,0xca,0x01,0xd5,0xff,0xd7,0x01,0xca,0x01,0xd8,0xff,0xd7,0x01,0xca,0x01,0xda,0xff,0xd7,0x01,0xcb,0x01,0x33,0xff,0xb0,0x01,0xcb,0x01,0xc3,0xff,0xdb,0x01,0xcb,0x01,0xcb,0x00,0x31,\r\n0x01,0xcb,0x01,0xcd,0xff,0xd1,0x01,0xcb,0x01,0xd2,0xff,0xdb,0x01,0xcb,0x01,0xd3,0xff,0xcf,0x01,0xcb,0x01,0xd4,0xff,0xdb,0x01,0xcb,0x01,0xd7,0xff,0xdb,0x01,0xcb,0x01,0xd9,0xff,0xdb,0x01,0xcd,0x01,0x2f,0xff,0xd7,0x01,0xcd,0x01,0x30,0xff,0xd7,0x01,0xcd,0x01,0x32,0xff,0xd7,0x01,0xcd,0x01,0x34,0xff,0xd7,0x01,0xcd,0x01,0xbf,\r\n0xff,0xd7,0x01,0xcd,0x01,0xcb,0xff,0xb6,0x01,0xcd,0x01,0xce,0xff,0xe7,0x01,0xcd,0x01,0xcf,0xff,0xd7,0x01,0xcd,0x01,0xd0,0xff,0xdb,0x01,0xcd,0x01,0xd1,0xff,0xec,0x01,0xcd,0x01,0xd5,0xff,0xd7,0x01,0xcd,0x01,0xd8,0xff,0xd7,0x01,0xcd,0x01,0xda,0xff,0xd7,0x01,0xce,0x01,0x2f,0xff,0xd7,0x01,0xce,0x01,0x30,0xff,0xd7,0x01,0xce,\r\n0x01,0x32,0xff,0xd7,0x01,0xce,0x01,0x34,0xff,0xd7,0x01,0xce,0x01,0xbf,0xff,0xd7,0x01,0xce,0x01,0xcf,0xff,0xd7,0x01,0xce,0x01,0xd5,0xff,0xd7,0x01,0xce,0x01,0xda,0xff,0xd7,0x01,0xcf,0x00,0x05,0xff,0x6f,0x01,0xcf,0x00,0x0a,0xff,0x6f,0x01,0xcf,0x00,0xb4,0xff,0xb0,0x01,0xcf,0x00,0xb5,0xff,0x7b,0x01,0xcf,0x00,0xb6,0xff,0xbc,\r\n0x01,0xcf,0x00,0xb7,0xff,0x7b,0x01,0xcf,0x01,0x33,0xff,0xdb,0x01,0xcf,0x01,0xc5,0xff,0xdb,0x01,0xcf,0x01,0xd3,0xff,0xc3,0x01,0xcf,0x02,0x37,0xff,0xdb,0x01,0xd0,0x00,0x05,0xff,0x6f,0x01,0xd0,0x00,0x0a,0xff,0x6f,0x01,0xd0,0x00,0xb4,0xff,0xb0,0x01,0xd0,0x00,0xb5,0xff,0x7b,0x01,0xd0,0x00,0xb6,0xff,0xbc,0x01,0xd0,0x00,0xb7,\r\n0xff,0x7b,0x01,0xd0,0x01,0x33,0xff,0xdb,0x01,0xd0,0x01,0xc5,0xff,0xe7,0x01,0xd0,0x01,0xd3,0xff,0xc3,0x01,0xd0,0x02,0x37,0xff,0xdb,0x01,0xd1,0x01,0x2f,0xff,0xc3,0x01,0xd1,0x01,0x30,0xff,0xc3,0x01,0xd1,0x01,0x32,0xff,0xc3,0x01,0xd1,0x01,0x34,0xff,0xc3,0x01,0xd1,0x01,0xbf,0xff,0xc3,0x01,0xd1,0x01,0xcb,0x00,0x25,0x01,0xd1,\r\n0x01,0xcf,0xff,0xc3,0x01,0xd1,0x01,0xd8,0xff,0xc3,0x01,0xd1,0x01,0xda,0xff,0xc3,0x01,0xd2,0x00,0x05,0xff,0x6f,0x01,0xd2,0x00,0x0a,0xff,0x6f,0x01,0xd2,0x00,0xb4,0xff,0xb0,0x01,0xd2,0x00,0xb5,0xff,0x7b,0x01,0xd2,0x00,0xb6,0xff,0xbc,0x01,0xd2,0x00,0xb7,0xff,0x7b,0x01,0xd2,0x01,0x33,0xff,0xdb,0x01,0xd2,0x01,0xc5,0xff,0xdb,\r\n0x01,0xd2,0x01,0xcb,0xff,0xe7,0x01,0xd2,0x01,0xd3,0xff,0xe7,0x01,0xd2,0x02,0x37,0xff,0xdb,0x01,0xd3,0x00,0x10,0xff,0xe7,0x01,0xd3,0x01,0x2f,0xff,0xc3,0x01,0xd3,0x01,0x30,0xff,0x9c,0x01,0xd3,0x01,0x31,0xff,0xd7,0x01,0xd3,0x01,0x32,0xff,0xc3,0x01,0xd3,0x01,0x34,0xff,0xc3,0x01,0xd3,0x01,0xbf,0xff,0xc3,0x01,0xd3,0x01,0xc0,\r\n0xff,0xd7,0x01,0xd3,0x01,0xc3,0xff,0xe7,0x01,0xd3,0x01,0xcb,0xff,0xe7,0x01,0xd3,0x01,0xcf,0xff,0xc3,0x01,0xd3,0x01,0xd1,0xff,0xbe,0x01,0xd3,0x01,0xd2,0xff,0xe7,0x01,0xd3,0x01,0xd3,0x00,0x19,0x01,0xd3,0x01,0xd5,0xff,0xc3,0x01,0xd3,0x01,0xd7,0xff,0xe7,0x01,0xd3,0x01,0xd8,0xff,0xc3,0x01,0xd3,0x01,0xd9,0xff,0xe7,0x01,0xd3,\r\n0x01,0xda,0xff,0xc3,0x01,0xd4,0x01,0xcb,0xff,0xe7,0x01,0xd5,0x00,0x05,0xff,0x6f,0x01,0xd5,0x00,0x0a,0xff,0x6f,0x01,0xd5,0x00,0xb4,0xff,0xb0,0x01,0xd5,0x00,0xb5,0xff,0x7b,0x01,0xd5,0x00,0xb6,0xff,0xbc,0x01,0xd5,0x00,0xb7,0xff,0x7b,0x01,0xd5,0x01,0x33,0xff,0xdb,0x01,0xd5,0x01,0xc5,0xff,0xdb,0x01,0xd5,0x01,0xd3,0xff,0xe7,\r\n0x01,0xd5,0x02,0x37,0xff,0xdb,0x01,0xd6,0x01,0xcb,0x00,0x6a,0x01,0xd7,0x00,0x05,0xff,0x6f,0x01,0xd7,0x00,0x0a,0xff,0x6f,0x01,0xd7,0x00,0xb4,0xff,0xb0,0x01,0xd7,0x00,0xb5,0xff,0x7b,0x01,0xd7,0x00,0xb6,0xff,0xbc,0x01,0xd7,0x00,0xb7,0xff,0x7b,0x01,0xd7,0x01,0xc5,0xff,0xdb,0x01,0xd7,0x01,0xcb,0xff,0xe7,0x01,0xd7,0x01,0xd3,\r\n0xff,0xe7,0x01,0xd8,0x00,0x05,0xff,0x6f,0x01,0xd8,0x00,0x0a,0xff,0x6f,0x01,0xd8,0x00,0xb4,0xff,0xb0,0x01,0xd8,0x00,0xb5,0xff,0x7b,0x01,0xd8,0x00,0xb6,0xff,0xbc,0x01,0xd8,0x00,0xb7,0xff,0x7b,0x01,0xd8,0x01,0xc5,0xff,0xdb,0x01,0xd8,0x01,0xd3,0xff,0xc3,0x01,0xd9,0x00,0x05,0xff,0x6f,0x01,0xd9,0x00,0x0a,0xff,0x6f,0x01,0xd9,\r\n0x00,0xb4,0xff,0xb0,0x01,0xd9,0x00,0xb5,0xff,0x7b,0x01,0xd9,0x00,0xb6,0xff,0xbc,0x01,0xd9,0x00,0xb7,0xff,0x7b,0x01,0xd9,0x01,0xc5,0xff,0xdb,0x01,0xd9,0x01,0xcb,0xff,0xe7,0x01,0xd9,0x01,0xd3,0xff,0xe7,0x01,0xda,0x00,0x05,0xff,0x6f,0x01,0xda,0x00,0x0a,0xff,0x6f,0x01,0xda,0x00,0xb4,0xff,0xb0,0x01,0xda,0x00,0xb5,0xff,0x7b,\r\n0x01,0xda,0x00,0xb6,0xff,0xbc,0x01,0xda,0x00,0xb7,0xff,0x7b,0x01,0xda,0x01,0xc5,0xff,0xdb,0x01,0xda,0x01,0xd3,0xff,0xe7,0x01,0xdb,0x01,0xe1,0x00,0x46,0x01,0xdb,0x01,0xe7,0x00,0x0c,0x01,0xdb,0x01,0xeb,0x00,0x46,0x01,0xdb,0x01,0xed,0x00,0x14,0x01,0xdb,0x01,0xf2,0x00,0x46,0x01,0xdb,0x01,0xfc,0x00,0x0a,0x01,0xdc,0x01,0xdc,\r\n0xff,0x79,0x01,0xdc,0x01,0xde,0xff,0xcf,0x01,0xdc,0x01,0xe1,0x00,0x29,0x01,0xdc,0x01,0xe3,0xff,0x79,0x01,0xdc,0x01,0xe5,0xff,0xee,0x01,0xdc,0x01,0xeb,0x00,0x29,0x01,0xdc,0x01,0xf2,0x00,0x29,0x01,0xdc,0x01,0xf5,0xff,0xcf,0x01,0xdc,0x01,0xf8,0xff,0xcf,0x01,0xdc,0x01,0xf9,0xff,0x79,0x01,0xdc,0x01,0xfa,0xff,0xee,0x01,0xdc,\r\n0x01,0xfb,0xff,0xc3,0x01,0xdc,0x01,0xfe,0xff,0x60,0x01,0xdc,0x02,0x01,0xff,0x79,0x01,0xdc,0x02,0x19,0xff,0xcf,0x01,0xdc,0x02,0x1a,0xff,0xe7,0x01,0xdc,0x02,0x31,0xff,0xe7,0x01,0xdd,0x00,0x0f,0xff,0x83,0x01,0xdd,0x00,0x11,0xff,0x83,0x01,0xdd,0x00,0xaa,0xff,0x91,0x01,0xdd,0x00,0xab,0xff,0xd7,0x01,0xdd,0x00,0xac,0xff,0x83,\r\n0x01,0xdd,0x01,0xdc,0x00,0x29,0x01,0xdd,0x01,0xde,0xff,0xa2,0x01,0xdd,0x01,0xe1,0xff,0xa2,0x01,0xdd,0x01,0xe3,0x00,0x29,0x01,0xdd,0x01,0xe5,0x00,0x1d,0x01,0xdd,0x01,0xe7,0xff,0x71,0x01,0xdd,0x01,0xeb,0xff,0xa2,0x01,0xdd,0x01,0xf2,0xff,0xa2,0x01,0xdd,0x01,0xf5,0xff,0xcf,0x01,0xdd,0x01,0xf8,0xff,0xcf,0x01,0xdd,0x01,0xf9,\r\n0x00,0x29,0x01,0xdd,0x01,0xfa,0x00,0x1d,0x01,0xdd,0x01,0xfb,0xff,0xa2,0x01,0xdd,0x02,0x01,0x00,0x29,0x01,0xdd,0x02,0x06,0xff,0xe7,0x01,0xdd,0x02,0x07,0xff,0x27,0x01,0xdd,0x02,0x09,0xff,0x4e,0x01,0xdd,0x02,0x0a,0xff,0x4e,0x01,0xdd,0x02,0x0b,0xff,0x9e,0x01,0xdd,0x02,0x0c,0xff,0x2b,0x01,0xdd,0x02,0x0f,0xff,0x4e,0x01,0xdd,\r\n0x02,0x10,0xff,0x4e,0x01,0xdd,0x02,0x11,0xff,0x4e,0x01,0xdd,0x02,0x12,0xff,0x9e,0x01,0xdd,0x02,0x13,0xff,0x4e,0x01,0xdd,0x02,0x14,0xff,0x4e,0x01,0xdd,0x02,0x15,0xff,0x2b,0x01,0xdd,0x02,0x16,0xff,0x4e,0x01,0xdd,0x02,0x17,0xff,0x4e,0x01,0xdd,0x02,0x18,0xff,0x2b,0x01,0xdd,0x02,0x19,0xff,0xc3,0x01,0xdd,0x02,0x1b,0xff,0x2b,\r\n0x01,0xdd,0x02,0x1c,0xff,0x4c,0x01,0xdd,0x02,0x1d,0xff,0x4e,0x01,0xdd,0x02,0x1e,0xff,0x4e,0x01,0xdd,0x02,0x1f,0xff,0x4e,0x01,0xdd,0x02,0x20,0xff,0x4e,0x01,0xdd,0x02,0x21,0xff,0xc3,0x01,0xdd,0x02,0x22,0xff,0x4e,0x01,0xdd,0x02,0x23,0xff,0x4e,0x01,0xdd,0x02,0x24,0xff,0x60,0x01,0xdd,0x02,0x25,0xff,0x4e,0x01,0xdd,0x02,0x26,\r\n0xff,0x54,0x01,0xdd,0x02,0x27,0xff,0x2b,0x01,0xdd,0x02,0x29,0xff,0x4e,0x01,0xdd,0x02,0x2a,0xff,0x2b,0x01,0xdd,0x02,0x2b,0xff,0x66,0x01,0xdd,0x02,0x2c,0x00,0x6f,0x01,0xdd,0x02,0x2d,0xff,0x9e,0x01,0xdd,0x02,0x2e,0xff,0x4e,0x01,0xdd,0x02,0x32,0xff,0x4e,0x01,0xdd,0x02,0x34,0xff,0x4e,0x01,0xde,0x00,0xaa,0xff,0xcd,0x01,0xde,\r\n0x00,0xbe,0xff,0xcd,0x01,0xde,0x01,0xde,0xff,0xc9,0x01,0xde,0x01,0xf5,0xff,0xc9,0x01,0xde,0x01,0xf8,0xff,0xc9,0x01,0xde,0x01,0xfb,0xff,0xc9,0x01,0xde,0x02,0x19,0xff,0xdb,0x01,0xde,0x02,0x21,0xff,0xdb,0x01,0xde,0x02,0x2c,0x00,0x1f,0x01,0xdf,0x00,0xc4,0xff,0xb0,0x01,0xdf,0x00,0xc5,0xff,0xb0,0x01,0xdf,0x01,0xf5,0xff,0xe7,\r\n0x01,0xdf,0x01,0xfb,0xff,0xdb,0x01,0xdf,0x01,0xfe,0xff,0xdb,0x01,0xdf,0x02,0x1a,0xff,0xcf,0x01,0xdf,0x02,0x31,0xff,0xcf,0x01,0xe1,0x01,0xdc,0xff,0x79,0x01,0xe1,0x01,0xde,0xff,0xe7,0x01,0xe1,0x01,0xe3,0xff,0x79,0x01,0xe1,0x01,0xf5,0xff,0xe7,0x01,0xe1,0x01,0xf8,0xff,0xe7,0x01,0xe1,0x01,0xf9,0xff,0x79,0x01,0xe1,0x01,0xfb,\r\n0xff,0xe7,0x01,0xe1,0x01,0xfe,0xff,0x62,0x01,0xe1,0x02,0x01,0xff,0x79,0x01,0xe1,0x02,0x19,0xff,0xcf,0x01,0xe1,0x02,0x21,0xff,0xcf,0x01,0xe2,0x01,0xdc,0xff,0x79,0x01,0xe2,0x01,0xde,0xff,0xe7,0x01,0xe2,0x01,0xe3,0xff,0x79,0x01,0xe2,0x01,0xf5,0xff,0xe7,0x01,0xe2,0x01,0xf8,0xff,0xe7,0x01,0xe2,0x01,0xf9,0xff,0x79,0x01,0xe2,\r\n0x01,0xfb,0xff,0xe7,0x01,0xe2,0x01,0xfe,0xff,0x62,0x01,0xe2,0x02,0x01,0xff,0x79,0x01,0xe2,0x02,0x19,0xff,0xcf,0x01,0xe2,0x02,0x21,0xff,0xcf,0x01,0xe3,0x01,0xdc,0xff,0x79,0x01,0xe3,0x01,0xe1,0x00,0x3d,0x01,0xe3,0x01,0xe3,0xff,0x58,0x01,0xe3,0x01,0xeb,0x00,0x3d,0x01,0xe3,0x01,0xf2,0x00,0x3d,0x01,0xe3,0x01,0xfb,0xff,0xe7,\r\n0x01,0xe3,0x01,0xfe,0xff,0x4e,0x01,0xe3,0x02,0x01,0xff,0xae,0x01,0xe4,0x00,0x0f,0x00,0x29,0x01,0xe4,0x00,0x1e,0x00,0x29,0x01,0xe4,0x00,0xc4,0x00,0x46,0x01,0xe4,0x00,0xc5,0x00,0x46,0x01,0xe4,0x01,0xde,0xff,0xa4,0x01,0xe4,0x01,0xe1,0x00,0x5c,0x01,0xe4,0x01,0xeb,0x00,0x5c,0x01,0xe4,0x01,0xed,0x00,0x62,0x01,0xe4,0x01,0xf2,\r\n0x00,0x5c,0x01,0xe4,0x01,0xf5,0xff,0xa4,0x01,0xe4,0x01,0xf8,0xff,0xa4,0x01,0xe4,0x01,0xfb,0xff,0xa4,0x01,0xe4,0x01,0xfc,0x00,0x25,0x01,0xe4,0x01,0xfe,0xff,0xc3,0x01,0xe4,0x02,0x08,0xff,0xe5,0x01,0xe4,0x02,0x0b,0x00,0x62,0x01,0xe4,0x02,0x0c,0xff,0xe5,0x01,0xe4,0x02,0x0d,0x00,0x3d,0x01,0xe4,0x02,0x12,0x00,0x62,0x01,0xe4,\r\n0x02,0x15,0xff,0xe5,0x01,0xe4,0x02,0x18,0xff,0xe5,0x01,0xe4,0x02,0x1a,0xff,0xa2,0x01,0xe4,0x02,0x1b,0xff,0xe5,0x01,0xe4,0x02,0x1e,0xff,0xc3,0x01,0xe4,0x02,0x27,0xff,0xe5,0x01,0xe4,0x02,0x2a,0xff,0xe5,0x01,0xe4,0x02,0x2c,0x00,0x29,0x01,0xe4,0x02,0x2d,0x00,0x62,0x01,0xe4,0x02,0x31,0xff,0xa2,0x01,0xe5,0x00,0x0f,0xff,0x3b,\r\n0x01,0xe5,0x00,0x11,0xff,0x2b,0x01,0xe5,0x00,0xac,0xff,0x2b,0x01,0xe5,0x01,0xdc,0x00,0x29,0x01,0xe5,0x01,0xe1,0xff,0x75,0x01,0xe5,0x01,0xe3,0x00,0x29,0x01,0xe5,0x01,0xe7,0xff,0x33,0x01,0xe5,0x01,0xeb,0xff,0x75,0x01,0xe5,0x01,0xed,0x00,0x25,0x01,0xe5,0x01,0xf2,0xff,0x75,0x01,0xe5,0x01,0xf9,0x00,0x29,0x01,0xe5,0x02,0x01,\r\n0x00,0x29,0x01,0xe5,0x02,0x07,0xff,0x79,0x01,0xe5,0x02,0x09,0xff,0xb6,0x01,0xe5,0x02,0x0a,0xff,0xb6,0x01,0xe5,0x02,0x0b,0xfe,0xfe,0x01,0xe5,0x02,0x0c,0xff,0x91,0x01,0xe5,0x02,0x0f,0xff,0xb6,0x01,0xe5,0x02,0x10,0xff,0xb6,0x01,0xe5,0x02,0x11,0xff,0xb6,0x01,0xe5,0x02,0x12,0xfe,0xfe,0x01,0xe5,0x02,0x13,0xff,0xb6,0x01,0xe5,\r\n0x02,0x14,0xff,0xb6,0x01,0xe5,0x02,0x15,0xff,0x91,0x01,0xe5,0x02,0x16,0xff,0xb6,0x01,0xe5,0x02,0x17,0xff,0xb6,0x01,0xe5,0x02,0x18,0xff,0x91,0x01,0xe5,0x02,0x1b,0xff,0x91,0x01,0xe5,0x02,0x1c,0xff,0xb6,0x01,0xe5,0x02,0x1d,0xff,0xb6,0x01,0xe5,0x02,0x1f,0xff,0xb6,0x01,0xe5,0x02,0x20,0xff,0xb6,0x01,0xe5,0x02,0x22,0xff,0xb6,\r\n0x01,0xe5,0x02,0x23,0xff,0xb6,0x01,0xe5,0x02,0x25,0xff,0xb6,0x01,0xe5,0x02,0x26,0xff,0xaa,0x01,0xe5,0x02,0x27,0xff,0x91,0x01,0xe5,0x02,0x29,0xff,0xb6,0x01,0xe5,0x02,0x2a,0xff,0x91,0x01,0xe5,0x02,0x2b,0xff,0xc3,0x01,0xe5,0x02,0x2c,0x00,0x6d,0x01,0xe5,0x02,0x2d,0xfe,0xfe,0x01,0xe5,0x02,0x2e,0xff,0xb6,0x01,0xe5,0x02,0x30,\r\n0xff,0xb6,0x01,0xe5,0x02,0x32,0xff,0xb6,0x01,0xe5,0x02,0x34,0xff,0xb6,0x01,0xe7,0x00,0x0d,0xff,0x7f,0x01,0xe7,0x00,0x0f,0x00,0x46,0x01,0xe7,0x00,0x1e,0x00,0x46,0x01,0xe7,0x00,0x8d,0xff,0x98,0x01,0xe7,0x00,0xb4,0xff,0x66,0x01,0xe7,0x00,0xb5,0xff,0x3d,0x01,0xe7,0x00,0xb6,0xff,0x66,0x01,0xe7,0x00,0xb7,0xff,0x3d,0x01,0xe7,\r\n0x01,0xdc,0xff,0x6d,0x01,0xe7,0x01,0xde,0xff,0xe5,0x01,0xe7,0x01,0xe1,0x00,0x60,0x01,0xe7,0x01,0xe3,0xff,0x6d,0x01,0xe7,0x01,0xeb,0x00,0x60,0x01,0xe7,0x01,0xed,0x00,0x3d,0x01,0xe7,0x01,0xf2,0x00,0x60,0x01,0xe7,0x01,0xf5,0xff,0xe5,0x01,0xe7,0x01,0xf8,0xff,0xe5,0x01,0xe7,0x01,0xf9,0xff,0x6d,0x01,0xe7,0x01,0xfb,0xff,0xc3,\r\n0x01,0xe7,0x01,0xfe,0xff,0x3d,0x01,0xe7,0x02,0x01,0xff,0x6d,0x01,0xe7,0x02,0x0b,0x00,0x56,0x01,0xe7,0x02,0x0d,0x00,0x29,0x01,0xe7,0x02,0x12,0x00,0x56,0x01,0xe7,0x02,0x1a,0xff,0xd9,0x01,0xe7,0x02,0x2d,0x00,0x56,0x01,0xe7,0x02,0x31,0xff,0xd9,0x01,0xe8,0x01,0xde,0xff,0xe7,0x01,0xe8,0x01,0xf5,0xff,0xe7,0x01,0xe8,0x01,0xf8,\r\n0xff,0xe7,0x01,0xe8,0x01,0xfb,0xff,0xe7,0x01,0xe8,0x01,0xfe,0xff,0x62,0x01,0xe8,0x02,0x19,0xff,0xcf,0x01,0xe8,0x02,0x21,0xff,0xcf,0x01,0xe9,0x00,0xc4,0xff,0xb0,0x01,0xe9,0x00,0xc5,0xff,0xb0,0x01,0xe9,0x01,0xdc,0xff,0xa2,0x01,0xe9,0x01,0xe3,0xff,0xa2,0x01,0xe9,0x01,0xf9,0xff,0xa2,0x01,0xe9,0x01,0xfe,0xff,0xd5,0x01,0xe9,\r\n0x02,0x01,0xff,0xa2,0x01,0xea,0x00,0x0f,0xff,0x83,0x01,0xea,0x00,0x11,0xff,0x83,0x01,0xea,0x00,0xaa,0xff,0x91,0x01,0xea,0x00,0xab,0xff,0xd7,0x01,0xea,0x00,0xac,0xff,0x83,0x01,0xea,0x01,0xdc,0x00,0x29,0x01,0xea,0x01,0xde,0xff,0xa2,0x01,0xea,0x01,0xe1,0xff,0x9e,0x01,0xea,0x01,0xe3,0x00,0x29,0x01,0xea,0x01,0xe5,0x00,0x1d,\r\n0x01,0xea,0x01,0xe7,0xff,0x71,0x01,0xea,0x01,0xeb,0xff,0xa2,0x01,0xea,0x01,0xf2,0xff,0xa2,0x01,0xea,0x01,0xf5,0xff,0xcf,0x01,0xea,0x01,0xf8,0xff,0xcf,0x01,0xea,0x01,0xf9,0x00,0x29,0x01,0xea,0x01,0xfa,0x00,0x1d,0x01,0xea,0x01,0xfb,0xff,0xa2,0x01,0xea,0x02,0x01,0x00,0x29,0x01,0xea,0x02,0x06,0xff,0xe7,0x01,0xea,0x02,0x07,\r\n0xff,0x27,0x01,0xea,0x02,0x09,0xff,0x4e,0x01,0xea,0x02,0x0a,0xff,0x4e,0x01,0xea,0x02,0x0b,0xff,0x9e,0x01,0xea,0x02,0x0c,0xff,0x2b,0x01,0xea,0x02,0x0f,0xff,0x4e,0x01,0xea,0x02,0x10,0xff,0x4e,0x01,0xea,0x02,0x11,0xff,0x4e,0x01,0xea,0x02,0x12,0xff,0x9e,0x01,0xea,0x02,0x13,0xff,0x4e,0x01,0xea,0x02,0x14,0xff,0x4e,0x01,0xea,\r\n0x02,0x15,0xff,0x2b,0x01,0xea,0x02,0x16,0xff,0x4e,0x01,0xea,0x02,0x17,0xff,0x4e,0x01,0xea,0x02,0x18,0xff,0x2b,0x01,0xea,0x02,0x19,0xff,0xc3,0x01,0xea,0x02,0x1b,0xff,0x2b,0x01,0xea,0x02,0x1c,0xff,0x4c,0x01,0xea,0x02,0x1d,0xff,0x4e,0x01,0xea,0x02,0x1e,0xff,0x4e,0x01,0xea,0x02,0x1f,0xff,0x4e,0x01,0xea,0x02,0x20,0xff,0x4e,\r\n0x01,0xea,0x02,0x21,0xff,0xc3,0x01,0xea,0x02,0x22,0xff,0x4e,0x01,0xea,0x02,0x23,0xff,0x4e,0x01,0xea,0x02,0x24,0xff,0x60,0x01,0xea,0x02,0x25,0xff,0x4e,0x01,0xea,0x02,0x26,0xff,0x54,0x01,0xea,0x02,0x27,0xff,0x2b,0x01,0xea,0x02,0x29,0xff,0x4e,0x01,0xea,0x02,0x2a,0xff,0x2b,0x01,0xea,0x02,0x2b,0xff,0x66,0x01,0xea,0x02,0x2c,\r\n0x00,0x6f,0x01,0xea,0x02,0x2d,0xff,0x9e,0x01,0xea,0x02,0x2e,0xff,0x4e,0x01,0xea,0x02,0x32,0xff,0x4e,0x01,0xea,0x02,0x34,0xff,0x4e,0x01,0xec,0x01,0xe1,0x00,0x46,0x01,0xec,0x01,0xe7,0x00,0x0c,0x01,0xec,0x01,0xeb,0x00,0x46,0x01,0xec,0x01,0xed,0x00,0x14,0x01,0xec,0x01,0xf2,0x00,0x46,0x01,0xec,0x01,0xfc,0x00,0x0a,0x01,0xec,\r\n0x02,0x2c,0x00,0x14,0x01,0xed,0x00,0x0f,0x00,0x52,0x01,0xed,0x00,0x1e,0x00,0x52,0x01,0xed,0x00,0xc4,0x00,0x5a,0x01,0xed,0x00,0xc5,0x00,0x5a,0x01,0xed,0x01,0xde,0xff,0xcd,0x01,0xed,0x01,0xe1,0x00,0x85,0x01,0xed,0x01,0xe7,0x00,0x3d,0x01,0xed,0x01,0xeb,0x00,0x85,0x01,0xed,0x01,0xed,0x00,0x66,0x01,0xed,0x01,0xf5,0xff,0xcd,\r\n0x01,0xed,0x01,0xf8,0xff,0xcd,0x01,0xed,0x01,0xfb,0xff,0xcd,0x01,0xed,0x01,0xfc,0x00,0x25,0x01,0xed,0x01,0xfe,0xff,0xdb,0x01,0xed,0x02,0x06,0x00,0x3d,0x01,0xed,0x02,0x0b,0x00,0x7b,0x01,0xed,0x02,0x0d,0x00,0x3d,0x01,0xed,0x02,0x12,0x00,0x7b,0x01,0xed,0x02,0x1a,0xff,0xd1,0x01,0xed,0x02,0x1c,0x00,0x48,0x01,0xed,0x02,0x1e,\r\n0xff,0xe7,0x01,0xed,0x02,0x2c,0x00,0x52,0x01,0xed,0x02,0x2d,0x00,0x7b,0x01,0xed,0x02,0x31,0xff,0xd1,0x01,0xee,0x01,0xdc,0xff,0xe1,0x01,0xee,0x01,0xde,0xff,0xdb,0x01,0xee,0x01,0xe3,0xff,0xe1,0x01,0xee,0x01,0xf5,0xff,0xdb,0x01,0xee,0x01,0xf8,0xff,0xdb,0x01,0xee,0x01,0xf9,0xff,0xe1,0x01,0xee,0x01,0xfb,0xff,0xdb,0x01,0xee,\r\n0x01,0xfe,0xff,0xdd,0x01,0xee,0x02,0x01,0xff,0xe1,0x01,0xf1,0x00,0x0f,0x00,0x29,0x01,0xf1,0x00,0x1e,0x00,0x29,0x01,0xf1,0x00,0xc4,0x00,0x46,0x01,0xf1,0x00,0xc5,0x00,0x46,0x01,0xf1,0x01,0xde,0xff,0xa4,0x01,0xf1,0x01,0xe1,0x00,0x5c,0x01,0xf1,0x01,0xeb,0x00,0x5c,0x01,0xf1,0x01,0xed,0x00,0x62,0x01,0xf1,0x01,0xf2,0x00,0x5c,\r\n0x01,0xf1,0x01,0xf5,0xff,0xa4,0x01,0xf1,0x01,0xf8,0xff,0xa4,0x01,0xf1,0x01,0xfb,0xff,0xa4,0x01,0xf1,0x01,0xfc,0x00,0x25,0x01,0xf1,0x01,0xfe,0xff,0xc3,0x01,0xf1,0x02,0x06,0x00,0x3d,0x01,0xf1,0x02,0x08,0xff,0xe5,0x01,0xf1,0x02,0x0b,0x00,0x62,0x01,0xf1,0x02,0x0c,0xff,0xe5,0x01,0xf1,0x02,0x0d,0x00,0x3d,0x01,0xf1,0x02,0x12,\r\n0x00,0x62,0x01,0xf1,0x02,0x15,0xff,0xe5,0x01,0xf1,0x02,0x18,0xff,0xe5,0x01,0xf1,0x02,0x1a,0xff,0xa2,0x01,0xf1,0x02,0x1b,0xff,0xe5,0x01,0xf1,0x02,0x1e,0xff,0xc3,0x01,0xf1,0x02,0x27,0xff,0xe5,0x01,0xf1,0x02,0x2a,0xff,0xe5,0x01,0xf1,0x02,0x2c,0x00,0x29,0x01,0xf1,0x02,0x2d,0x00,0x62,0x01,0xf1,0x02,0x31,0xff,0xa2,0x01,0xf5,\r\n0x00,0x0f,0xff,0xa2,0x01,0xf5,0x00,0x11,0xff,0xa2,0x01,0xf5,0x00,0xac,0xff,0xa2,0x01,0xf5,0x00,0xc4,0xff,0x4a,0x01,0xf5,0x00,0xc5,0xff,0x96,0x01,0xf5,0x01,0xdc,0xff,0xa2,0x01,0xf5,0x01,0xdf,0xff,0xdb,0x01,0xf5,0x01,0xe1,0xff,0xf6,0x01,0xf5,0x01,0xe3,0xff,0xa2,0x01,0xf5,0x01,0xe5,0xff,0xe7,0x01,0xf5,0x01,0xe7,0xff,0xe5,\r\n0x01,0xf5,0x01,0xeb,0xff,0xf6,0x01,0xf5,0x01,0xed,0xff,0xcd,0x01,0xf5,0x01,0xf2,0xff,0xf6,0x01,0xf5,0x01,0xf9,0xff,0xa2,0x01,0xf5,0x01,0xfa,0xff,0xe7,0x01,0xf5,0x01,0xfc,0xff,0xdb,0x01,0xf5,0x02,0x01,0xff,0xa2,0x01,0xf7,0x00,0x0f,0xfe,0xba,0x01,0xf7,0x00,0x11,0xfe,0xba,0x01,0xf7,0x00,0xac,0xfe,0xba,0x01,0xf7,0x00,0xc4,\r\n0xfe,0xba,0x01,0xf7,0x00,0xc5,0xfe,0xae,0x01,0xf7,0x01,0xde,0xff,0xf6,0x01,0xf7,0x01,0xe1,0xff,0x7f,0x01,0xf7,0x01,0xe5,0xff,0xe7,0x01,0xf7,0x01,0xe7,0xff,0x60,0x01,0xf7,0x01,0xeb,0xff,0x7f,0x01,0xf7,0x01,0xed,0xff,0xcf,0x01,0xf7,0x01,0xee,0xff,0xe7,0x01,0xf7,0x01,0xf2,0xff,0x7f,0x01,0xf7,0x01,0xf5,0xff,0xf6,0x01,0xf7,\r\n0x01,0xf8,0xff,0xf6,0x01,0xf7,0x01,0xfa,0xff,0xe7,0x01,0xf7,0x01,0xfb,0xff,0xf6,0x01,0xf7,0x01,0xfc,0xff,0xc1,0x01,0xf7,0x02,0x07,0xff,0xbc,0x01,0xf7,0x02,0x0b,0xff,0x6d,0x01,0xf7,0x02,0x0c,0xff,0xb2,0x01,0xf7,0x02,0x12,0xff,0x6d,0x01,0xf7,0x02,0x15,0xff,0xb2,0x01,0xf7,0x02,0x18,0xff,0xb2,0x01,0xf7,0x02,0x1b,0xff,0xb2,\r\n0x01,0xf7,0x02,0x27,0xff,0xb2,0x01,0xf7,0x02,0x2a,0xff,0xb2,0x01,0xf7,0x02,0x2d,0xff,0x6d,0x01,0xf8,0x00,0xaa,0xff,0xcd,0x01,0xf8,0x00,0xbe,0xff,0xcd,0x01,0xf8,0x01,0xde,0xff,0xc9,0x01,0xf8,0x01,0xed,0x00,0x31,0x01,0xf8,0x01,0xf5,0xff,0xc9,0x01,0xf8,0x01,0xf8,0xff,0xc9,0x01,0xf8,0x01,0xfb,0xff,0xc9,0x01,0xf8,0x02,0x19,\r\n0xff,0xdb,0x01,0xf8,0x02,0x21,0xff,0xdb,0x01,0xf8,0x02,0x2c,0x00,0x1f,0x01,0xf9,0x00,0x0f,0xff,0x7d,0x01,0xf9,0x00,0x11,0xff,0x4c,0x01,0xf9,0x00,0x1d,0xff,0xe9,0x01,0xf9,0x00,0x1e,0xff,0xe9,0x01,0xf9,0x00,0x8d,0x00,0x52,0x01,0xf9,0x00,0xaa,0xff,0x98,0x01,0xf9,0x00,0xab,0xff,0xcd,0x01,0xf9,0x00,0xac,0xff,0x4c,0x01,0xf9,\r\n0x00,0xb5,0x00,0x29,0x01,0xf9,0x00,0xb7,0x00,0x29,0x01,0xf9,0x00,0xbe,0xff,0x98,0x01,0xf9,0x00,0xbf,0xff,0xcd,0x01,0xf9,0x00,0xc4,0xff,0x14,0x01,0xf9,0x00,0xc5,0xff,0x14,0x01,0xf9,0x01,0xdc,0x00,0x29,0x01,0xf9,0x01,0xde,0xff,0xa2,0x01,0xf9,0x01,0xe1,0xff,0x8d,0x01,0xf9,0x01,0xe3,0x00,0x29,0x01,0xf9,0x01,0xe7,0xff,0x66,\r\n0x01,0xf9,0x01,0xeb,0xff,0x8d,0x01,0xf9,0x01,0xf2,0xff,0x8d,0x01,0xf9,0x01,0xf5,0xff,0xa2,0x01,0xf9,0x01,0xf8,0xff,0xa2,0x01,0xf9,0x01,0xf9,0x00,0x29,0x01,0xf9,0x01,0xfb,0xff,0xa2,0x01,0xf9,0x01,0xfc,0xff,0xf8,0x01,0xf9,0x02,0x01,0x00,0x29,0x01,0xf9,0x02,0x06,0xff,0xe7,0x01,0xf9,0x02,0x07,0xff,0x27,0x01,0xf9,0x02,0x09,\r\n0xff,0x4e,0x01,0xf9,0x02,0x0a,0xff,0x4e,0x01,0xf9,0x02,0x0b,0xff,0x9e,0x01,0xf9,0x02,0x0c,0xff,0x2b,0x01,0xf9,0x02,0x0d,0xff,0xa6,0x01,0xf9,0x02,0x0f,0xff,0x4e,0x01,0xf9,0x02,0x10,0xff,0x4e,0x01,0xf9,0x02,0x11,0xff,0x4e,0x01,0xf9,0x02,0x12,0xff,0x9e,0x01,0xf9,0x02,0x13,0xff,0x4e,0x01,0xf9,0x02,0x14,0xff,0x4e,0x01,0xf9,\r\n0x02,0x15,0xff,0x2b,0x01,0xf9,0x02,0x16,0xff,0x4e,0x01,0xf9,0x02,0x17,0xff,0x4e,0x01,0xf9,0x02,0x18,0xff,0x2b,0x01,0xf9,0x02,0x19,0xff,0xc3,0x01,0xf9,0x02,0x1a,0xff,0x8d,0x01,0xf9,0x02,0x1b,0xff,0x2b,0x01,0xf9,0x02,0x1c,0xff,0x4c,0x01,0xf9,0x02,0x1d,0xff,0x4e,0x01,0xf9,0x02,0x1e,0xff,0x4e,0x01,0xf9,0x02,0x1f,0xff,0x4e,\r\n0x01,0xf9,0x02,0x20,0xff,0x4e,0x01,0xf9,0x02,0x21,0xff,0xc3,0x01,0xf9,0x02,0x22,0xff,0x4e,0x01,0xf9,0x02,0x23,0xff,0x4e,0x01,0xf9,0x02,0x24,0xff,0x60,0x01,0xf9,0x02,0x25,0xff,0x4e,0x01,0xf9,0x02,0x26,0xff,0x54,0x01,0xf9,0x02,0x27,0xff,0x2b,0x01,0xf9,0x02,0x29,0xff,0x4e,0x01,0xf9,0x02,0x2a,0xff,0x2b,0x01,0xf9,0x02,0x2b,\r\n0xff,0x66,0x01,0xf9,0x02,0x2c,0x00,0x6f,0x01,0xf9,0x02,0x2d,0xff,0x9e,0x01,0xf9,0x02,0x2e,0xff,0x4e,0x01,0xf9,0x02,0x30,0xff,0x4e,0x01,0xf9,0x02,0x31,0xff,0x8d,0x01,0xf9,0x02,0x32,0xff,0x4e,0x01,0xf9,0x02,0x34,0xff,0x4e,0x01,0xfa,0x00,0x0f,0xff,0x3b,0x01,0xfa,0x00,0x11,0xff,0x2b,0x01,0xfa,0x00,0xac,0xff,0x2b,0x01,0xfa,\r\n0x01,0xdc,0x00,0x29,0x01,0xfa,0x01,0xe1,0xff,0x75,0x01,0xfa,0x01,0xe3,0x00,0x29,0x01,0xfa,0x01,0xe7,0xff,0x33,0x01,0xfa,0x01,0xeb,0xff,0x75,0x01,0xfa,0x01,0xed,0x00,0x25,0x01,0xfa,0x01,0xf2,0xff,0x75,0x01,0xfa,0x01,0xf8,0xff,0xdb,0x01,0xfa,0x01,0xf9,0x00,0x29,0x01,0xfa,0x02,0x01,0x00,0x29,0x01,0xfa,0x02,0x07,0xff,0x79,\r\n0x01,0xfa,0x02,0x09,0xff,0xb6,0x01,0xfa,0x02,0x0a,0xff,0xb6,0x01,0xfa,0x02,0x0b,0xfe,0xfe,0x01,0xfa,0x02,0x0c,0xff,0x91,0x01,0xfa,0x02,0x0f,0xff,0xb6,0x01,0xfa,0x02,0x10,0xff,0xb6,0x01,0xfa,0x02,0x11,0xff,0xb6,0x01,0xfa,0x02,0x12,0xfe,0xfe,0x01,0xfa,0x02,0x13,0xff,0xb6,0x01,0xfa,0x02,0x14,0xff,0xb6,0x01,0xfa,0x02,0x15,\r\n0xff,0x91,0x01,0xfa,0x02,0x16,0xff,0xb6,0x01,0xfa,0x02,0x17,0xff,0xb6,0x01,0xfa,0x02,0x18,0xff,0x91,0x01,0xfa,0x02,0x1b,0xff,0x91,0x01,0xfa,0x02,0x1c,0xff,0xb6,0x01,0xfa,0x02,0x1d,0xff,0xb6,0x01,0xfa,0x02,0x1f,0xff,0xb6,0x01,0xfa,0x02,0x20,0xff,0xb6,0x01,0xfa,0x02,0x22,0xff,0xb6,0x01,0xfa,0x02,0x23,0xff,0xb6,0x01,0xfa,\r\n0x02,0x25,0xff,0xb6,0x01,0xfa,0x02,0x26,0xff,0xaa,0x01,0xfa,0x02,0x27,0xff,0x91,0x01,0xfa,0x02,0x29,0xff,0xb6,0x01,0xfa,0x02,0x2a,0xff,0x91,0x01,0xfa,0x02,0x2b,0xff,0xc3,0x01,0xfa,0x02,0x2c,0x00,0x6d,0x01,0xfa,0x02,0x2d,0xfe,0xfe,0x01,0xfa,0x02,0x2e,0xff,0xb6,0x01,0xfa,0x02,0x30,0xff,0xb6,0x01,0xfa,0x02,0x32,0xff,0xb6,\r\n0x01,0xfa,0x02,0x34,0xff,0xb6,0x01,0xfb,0x00,0x0f,0xff,0xa2,0x01,0xfb,0x00,0x11,0xff,0xa2,0x01,0xfb,0x00,0xac,0xff,0xa2,0x01,0xfb,0x00,0xc4,0xff,0x4a,0x01,0xfb,0x00,0xc5,0xff,0x96,0x01,0xfb,0x01,0xdc,0xff,0xa2,0x01,0xfb,0x01,0xdf,0xff,0xdb,0x01,0xfb,0x01,0xe1,0xff,0xf6,0x01,0xfb,0x01,0xe3,0xff,0xa2,0x01,0xfb,0x01,0xe5,\r\n0xff,0xe7,0x01,0xfb,0x01,0xe7,0xff,0xc3,0x01,0xfb,0x01,0xeb,0xff,0xf6,0x01,0xfb,0x01,0xed,0xff,0xcd,0x01,0xfb,0x01,0xee,0xff,0xcf,0x01,0xfb,0x01,0xf2,0xff,0xf6,0x01,0xfb,0x01,0xf9,0xff,0xa2,0x01,0xfb,0x01,0xfa,0xff,0xe7,0x01,0xfb,0x01,0xfc,0xff,0xdb,0x01,0xfb,0x02,0x01,0xff,0xa2,0x01,0xfb,0x02,0x07,0xff,0xe7,0x01,0xfb,\r\n0x02,0x0b,0xff,0x91,0x01,0xfb,0x02,0x2d,0xff,0x91,0x01,0xfc,0x00,0x0f,0x00,0x46,0x01,0xfc,0x00,0x11,0x00,0x39,0x01,0xfc,0x00,0x1e,0x00,0x52,0x01,0xfc,0x00,0xac,0x00,0x39,0x01,0xfc,0x00,0xc4,0x00,0x46,0x01,0xfc,0x00,0xc5,0x00,0x52,0x01,0xfc,0x01,0xdc,0x00,0x23,0x01,0xfc,0x01,0xde,0xff,0xdb,0x01,0xfc,0x01,0xe1,0x00,0x62,\r\n0x01,0xfc,0x01,0xe3,0x00,0x23,0x01,0xfc,0x01,0xeb,0x00,0x62,0x01,0xfc,0x01,0xed,0x00,0x25,0x01,0xfc,0x01,0xf2,0x00,0x62,0x01,0xfc,0x01,0xf5,0xff,0xe7,0x01,0xfc,0x01,0xf8,0xff,0xdb,0x01,0xfc,0x01,0xf9,0x00,0x23,0x01,0xfc,0x01,0xfb,0xff,0xdb,0x01,0xfc,0x02,0x01,0x00,0x23,0x01,0xfc,0x02,0x2c,0x00,0x52,0x01,0xfd,0x00,0x0f,\r\n0x00,0x29,0x01,0xfd,0x00,0xc4,0x00,0x29,0x01,0xfd,0x00,0xc5,0x00,0x29,0x01,0xfd,0x01,0xe1,0x00,0x3d,0x01,0xfd,0x01,0xeb,0x00,0x3d,0x01,0xfd,0x01,0xf2,0x00,0x3d,0x01,0xfd,0x01,0xfe,0xff,0xdb,0x01,0xfd,0x02,0x0b,0x00,0x25,0x01,0xfd,0x02,0x12,0x00,0x25,0x01,0xfd,0x02,0x2d,0x00,0x25,0x02,0x00,0x00,0x0f,0x00,0x29,0x02,0x00,\r\n0x00,0x1e,0x00,0x29,0x02,0x00,0x00,0xc4,0x00,0x29,0x02,0x00,0x00,0xc5,0x00,0x29,0x02,0x00,0x01,0xe1,0x00,0x3d,0x02,0x00,0x01,0xeb,0x00,0x3d,0x02,0x00,0x01,0xf2,0x00,0x3d,0x02,0x00,0x01,0xfb,0xff,0xcf,0x02,0x00,0x01,0xfe,0xff,0xdb,0x02,0x00,0x02,0x0b,0x00,0x25,0x02,0x00,0x02,0x12,0x00,0x25,0x02,0x00,0x02,0x2d,0x00,0x25,\r\n0x02,0x01,0x01,0xdc,0xff,0x79,0x02,0x01,0x01,0xde,0xff,0xe7,0x02,0x01,0x01,0xe3,0xff,0x79,0x02,0x01,0x01,0xf5,0xff,0xe7,0x02,0x01,0x01,0xf8,0xff,0xe7,0x02,0x01,0x01,0xf9,0xff,0x79,0x02,0x01,0x01,0xfb,0xff,0xe7,0x02,0x01,0x01,0xfe,0xff,0x62,0x02,0x01,0x02,0x01,0xff,0x79,0x02,0x01,0x02,0x19,0xff,0xcf,0x02,0x01,0x02,0x21,\r\n0xff,0xcf,0x02,0x03,0x01,0xdc,0xff,0x79,0x02,0x03,0x01,0xde,0xff,0xe7,0x02,0x03,0x01,0xe3,0xff,0x79,0x02,0x03,0x01,0xf5,0xff,0xe7,0x02,0x03,0x01,0xf8,0xff,0xe7,0x02,0x03,0x01,0xf9,0xff,0x79,0x02,0x03,0x01,0xfb,0xff,0xe7,0x02,0x03,0x01,0xfe,0xff,0x62,0x02,0x03,0x02,0x01,0xff,0x79,0x02,0x03,0x02,0x19,0xff,0xcf,0x02,0x03,\r\n0x02,0x21,0xff,0xcf,0x02,0x04,0x00,0x0f,0xff,0xa2,0x02,0x04,0x00,0x11,0xff,0xa2,0x02,0x04,0x00,0xac,0xff,0xa2,0x02,0x04,0x00,0xc4,0xff,0x4a,0x02,0x04,0x00,0xc5,0xff,0x96,0x02,0x04,0x01,0xdc,0xff,0xa2,0x02,0x04,0x01,0xdf,0xff,0xdb,0x02,0x04,0x01,0xe1,0xff,0xf6,0x02,0x04,0x01,0xe3,0xff,0xa2,0x02,0x04,0x01,0xe5,0xff,0xe7,\r\n0x02,0x04,0x01,0xe7,0xff,0xe5,0x02,0x04,0x01,0xeb,0xff,0xf6,0x02,0x04,0x01,0xf2,0xff,0xf6,0x02,0x04,0x01,0xf9,0xff,0xa2,0x02,0x04,0x01,0xfa,0xff,0xe7,0x02,0x04,0x01,0xfc,0xff,0xdb,0x02,0x04,0x02,0x01,0xff,0xa2,0x02,0x05,0x00,0x0f,0xff,0xa2,0x02,0x05,0x00,0x11,0xff,0xa2,0x02,0x05,0x00,0xac,0xff,0xa2,0x02,0x05,0x00,0xc4,\r\n0xff,0x4a,0x02,0x05,0x00,0xc5,0xff,0x96,0x02,0x05,0x01,0xdc,0xff,0xa2,0x02,0x05,0x01,0xdf,0xff,0xdb,0x02,0x05,0x01,0xe1,0xff,0xf6,0x02,0x05,0x01,0xe3,0xff,0xa2,0x02,0x05,0x01,0xe5,0xff,0xe7,0x02,0x05,0x01,0xe7,0xff,0xe5,0x02,0x05,0x01,0xeb,0xff,0xf6,0x02,0x05,0x01,0xf2,0xff,0xf6,0x02,0x05,0x01,0xf9,0xff,0xa2,0x02,0x05,\r\n0x01,0xfa,0xff,0xe7,0x02,0x05,0x01,0xfc,0xff,0xdb,0x02,0x05,0x02,0x01,0xff,0xa2,0x02,0x07,0x02,0x1e,0xff,0xe7,0x02,0x08,0x02,0x0b,0xff,0xe7,0x02,0x08,0x02,0x0d,0xff,0xe1,0x02,0x08,0x02,0x19,0xff,0xdb,0x02,0x08,0x02,0x21,0xff,0xdb,0x02,0x09,0x02,0x19,0xff,0xee,0x02,0x09,0x02,0x1e,0xff,0xe7,0x02,0x09,0x02,0x21,0xff,0xee,\r\n0x02,0x0a,0x00,0x0f,0xff,0xc3,0x02,0x0a,0x00,0x11,0xff,0xae,0x02,0x0a,0x00,0xac,0xff,0xae,0x02,0x0a,0x02,0x07,0xff,0xc3,0x02,0x0a,0x02,0x0b,0xff,0xb6,0x02,0x0a,0x02,0x0c,0xff,0xdb,0x02,0x0a,0x02,0x12,0xff,0xb6,0x02,0x0a,0x02,0x15,0xff,0xdb,0x02,0x0a,0x02,0x18,0xff,0xdb,0x02,0x0a,0x02,0x19,0x00,0x29,0x02,0x0a,0x02,0x1b,\r\n0xff,0xdb,0x02,0x0a,0x02,0x21,0x00,0x29,0x02,0x0a,0x02,0x26,0xff,0xe7,0x02,0x0a,0x02,0x27,0xff,0xdb,0x02,0x0a,0x02,0x2a,0xff,0xdb,0x02,0x0a,0x02,0x2d,0xff,0xb6,0x02,0x0b,0x02,0x12,0x00,0x14,0x02,0x0b,0x02,0x1e,0xff,0xdb,0x02,0x0b,0x02,0x2d,0x00,0x14,0x02,0x0c,0x00,0x05,0xff,0x98,0x02,0x0c,0x00,0x0a,0xff,0x98,0x02,0x0d,\r\n0x00,0x0f,0x00,0x52,0x02,0x0d,0x00,0x10,0xff,0x73,0x02,0x0d,0x00,0x11,0x00,0x52,0x02,0x0d,0x00,0x1d,0x00,0x52,0x02,0x0d,0x00,0x1e,0x00,0x52,0x02,0x0d,0x00,0xac,0x00,0x52,0x02,0x0d,0x02,0x0b,0x00,0x29,0x02,0x0d,0x02,0x0c,0xff,0xd7,0x02,0x0d,0x02,0x0d,0x00,0x4a,0x02,0x0d,0x02,0x12,0x00,0x52,0x02,0x0d,0x02,0x15,0xff,0xd7,\r\n0x02,0x0d,0x02,0x18,0xff,0xd7,0x02,0x0d,0x02,0x1b,0xff,0xd7,0x02,0x0d,0x02,0x1e,0xff,0xe7,0x02,0x0d,0x02,0x27,0xff,0xd7,0x02,0x0d,0x02,0x2a,0xff,0xd7,0x02,0x0d,0x02,0x2d,0x00,0x29,0x02,0x0e,0x02,0x1e,0xff,0xd7,0x02,0x11,0x00,0x0f,0x00,0x52,0x02,0x11,0x00,0x10,0xff,0x73,0x02,0x11,0x00,0x11,0x00,0x52,0x02,0x11,0x00,0x1d,\r\n0x00,0x52,0x02,0x11,0x00,0x1e,0x00,0x52,0x02,0x11,0x00,0xac,0x00,0x52,0x02,0x11,0x02,0x0b,0x00,0x14,0x02,0x11,0x02,0x0c,0xff,0xd7,0x02,0x11,0x02,0x0d,0x00,0x3d,0x02,0x11,0x02,0x12,0x00,0x29,0x02,0x11,0x02,0x15,0xff,0xd7,0x02,0x11,0x02,0x18,0xff,0xd7,0x02,0x11,0x02,0x1b,0xff,0xd7,0x02,0x11,0x02,0x1e,0xff,0xe7,0x02,0x11,\r\n0x02,0x27,0xff,0xd7,0x02,0x11,0x02,0x2a,0xff,0xd7,0x02,0x11,0x02,0x2d,0x00,0x29,0x02,0x15,0x00,0x05,0xff,0x6f,0x02,0x15,0x00,0x0a,0xff,0x6f,0x02,0x15,0x00,0xb4,0xff,0xb0,0x02,0x15,0x00,0xb5,0xff,0x7b,0x02,0x15,0x00,0xb6,0xff,0xbc,0x02,0x15,0x00,0xb7,0xff,0x7b,0x02,0x15,0x02,0x07,0xff,0xe5,0x02,0x15,0x02,0x0b,0xff,0xe7,\r\n0x02,0x15,0x02,0x0d,0xff,0xd7,0x02,0x15,0x02,0x19,0xff,0xdb,0x02,0x15,0x02,0x1c,0xff,0xe7,0x02,0x15,0x02,0x21,0xff,0xdb,0x02,0x17,0x00,0x05,0xff,0x6f,0x02,0x17,0x00,0x0a,0xff,0x6f,0x02,0x17,0x00,0xb4,0xff,0xc9,0x02,0x17,0x00,0xb5,0xff,0x87,0x02,0x17,0x00,0xb6,0xff,0x87,0x02,0x17,0x00,0xb7,0xff,0x87,0x02,0x17,0x02,0x07,\r\n0xff,0xe5,0x02,0x17,0x02,0x0b,0xff,0xe7,0x02,0x17,0x02,0x0d,0xff,0xd7,0x02,0x17,0x02,0x19,0xff,0xdb,0x02,0x17,0x02,0x1c,0xff,0xe7,0x02,0x17,0x02,0x21,0xff,0xdb,0x02,0x19,0x00,0x0f,0xff,0xc3,0x02,0x19,0x00,0x11,0xff,0xae,0x02,0x19,0x00,0xac,0xff,0xae,0x02,0x19,0x02,0x0b,0xff,0xdb,0x02,0x19,0x02,0x0c,0xff,0xdb,0x02,0x19,\r\n0x02,0x12,0xff,0xdb,0x02,0x19,0x02,0x15,0xff,0xdb,0x02,0x19,0x02,0x18,0xff,0xdb,0x02,0x19,0x02,0x19,0x00,0x14,0x02,0x19,0x02,0x1a,0x00,0x29,0x02,0x19,0x02,0x1b,0xff,0xdb,0x02,0x19,0x02,0x21,0x00,0x29,0x02,0x19,0x02,0x26,0xff,0xe7,0x02,0x19,0x02,0x27,0xff,0xdb,0x02,0x19,0x02,0x2a,0xff,0xdb,0x02,0x19,0x02,0x2d,0xff,0xdb,\r\n0x02,0x19,0x02,0x31,0x00,0x29,0x02,0x1a,0x00,0x05,0x00,0x1d,0x02,0x1a,0x00,0x0a,0x00,0x1d,0x02,0x1a,0x00,0x0f,0xff,0x98,0x02,0x1a,0x00,0x11,0xff,0x7f,0x02,0x1a,0x00,0x22,0xff,0xb2,0x02,0x1a,0x00,0xac,0xff,0x7f,0x02,0x1a,0x00,0xbf,0x00,0x0e,0x02,0x1a,0x00,0xc4,0xff,0x8b,0x02,0x1a,0x00,0xc5,0xff,0x8b,0x02,0x1a,0x02,0x0b,\r\n0xff,0x91,0x02,0x1a,0x02,0x0c,0xff,0xf6,0x02,0x1a,0x02,0x12,0xff,0x91,0x02,0x1a,0x02,0x15,0xff,0xf6,0x02,0x1a,0x02,0x18,0xff,0xf6,0x02,0x1a,0x02,0x19,0x00,0x29,0x02,0x1a,0x02,0x1b,0xff,0xf6,0x02,0x1a,0x02,0x21,0x00,0x29,0x02,0x1a,0x02,0x27,0xff,0xf6,0x02,0x1a,0x02,0x2a,0xff,0xf6,0x02,0x1a,0x02,0x2d,0xff,0x91,0x02,0x1b,\r\n0x00,0x05,0xff,0x6f,0x02,0x1b,0x00,0x0a,0xff,0x6f,0x02,0x1b,0x00,0xb4,0xff,0xb0,0x02,0x1b,0x00,0xb5,0xff,0x7b,0x02,0x1b,0x00,0xb6,0xff,0xbc,0x02,0x1b,0x00,0xb7,0xff,0x7b,0x02,0x1b,0x02,0x07,0xff,0xe5,0x02,0x1b,0x02,0x0b,0xff,0xe7,0x02,0x1b,0x02,0x0d,0xff,0xd7,0x02,0x1b,0x02,0x19,0xff,0xdb,0x02,0x1b,0x02,0x1c,0xff,0xe7,\r\n0x02,0x1b,0x02,0x21,0xff,0xdb,0x02,0x1c,0x02,0x0b,0x00,0x14,0x02,0x1c,0x02,0x0c,0xff,0xee,0x02,0x1c,0x02,0x12,0x00,0x29,0x02,0x1c,0x02,0x15,0xff,0xee,0x02,0x1c,0x02,0x18,0xff,0xee,0x02,0x1c,0x02,0x1b,0xff,0xee,0x02,0x1c,0x02,0x1e,0xff,0xdb,0x02,0x1c,0x02,0x27,0xff,0xee,0x02,0x1c,0x02,0x2a,0xff,0xee,0x02,0x1c,0x02,0x2d,\r\n0x00,0x29,0x02,0x1d,0x02,0x1e,0xff,0xdb,0x02,0x20,0x02,0x1e,0xff,0xdb,0x02,0x21,0x02,0x0c,0xff,0xf4,0x02,0x21,0x02,0x15,0xff,0xf4,0x02,0x21,0x02,0x18,0xff,0xf4,0x02,0x21,0x02,0x19,0xff,0xaa,0x02,0x21,0x02,0x1a,0xff,0xb6,0x02,0x21,0x02,0x1b,0xff,0xf4,0x02,0x21,0x02,0x1e,0xff,0x85,0x02,0x21,0x02,0x21,0xff,0xaa,0x02,0x21,\r\n0x02,0x27,0xff,0xf4,0x02,0x21,0x02,0x2a,0xff,0xf4,0x02,0x21,0x02,0x31,0xff,0xb6,0x02,0x23,0x02,0x0c,0xff,0xf4,0x02,0x23,0x02,0x15,0xff,0xf4,0x02,0x23,0x02,0x18,0xff,0xf4,0x02,0x23,0x02,0x19,0xff,0xaa,0x02,0x23,0x02,0x1a,0xff,0xb6,0x02,0x23,0x02,0x1b,0xff,0xf4,0x02,0x23,0x02,0x1e,0xff,0x85,0x02,0x23,0x02,0x21,0xff,0xaa,\r\n0x02,0x23,0x02,0x27,0xff,0xf4,0x02,0x23,0x02,0x2a,0xff,0xf4,0x02,0x23,0x02,0x31,0xff,0xb6,0x02,0x24,0x00,0x05,0xff,0x6f,0x02,0x24,0x00,0x0a,0xff,0x6f,0x02,0x24,0x00,0xb4,0xff,0xb0,0x02,0x24,0x00,0xb5,0xff,0x7b,0x02,0x24,0x00,0xb6,0xff,0xbc,0x02,0x24,0x00,0xb7,0xff,0x7b,0x02,0x24,0x02,0x07,0xff,0xe5,0x02,0x24,0x02,0x0b,\r\n0xff,0xe7,0x02,0x24,0x02,0x0d,0xff,0xd7,0x02,0x24,0x02,0x19,0xff,0xdb,0x02,0x24,0x02,0x1c,0xff,0xe7,0x02,0x24,0x02,0x21,0xff,0xdb,0x02,0x25,0x00,0x05,0xff,0x6f,0x02,0x25,0x00,0x0a,0xff,0x6f,0x02,0x25,0x00,0xb4,0xff,0xb0,0x02,0x25,0x00,0xb5,0xff,0x7b,0x02,0x25,0x00,0xb6,0xff,0xbc,0x02,0x25,0x00,0xb7,0xff,0x7b,0x02,0x25,\r\n0x02,0x07,0xff,0xe5,0x02,0x25,0x02,0x0b,0xff,0xe7,0x02,0x25,0x02,0x0d,0xff,0xd7,0x02,0x25,0x02,0x19,0xff,0xdb,0x02,0x25,0x02,0x1c,0xff,0xe7,0x02,0x25,0x02,0x21,0xff,0xdb,0x02,0x27,0x00,0x05,0xff,0x98,0x02,0x27,0x00,0x0a,0xff,0x98,0x02,0x28,0x00,0x05,0xff,0x6f,0x02,0x28,0x00,0x0a,0xff,0x6f,0x02,0x28,0x00,0xb4,0xff,0xb0,\r\n0x02,0x28,0x00,0xb5,0xff,0x7b,0x02,0x28,0x00,0xb6,0xff,0xbc,0x02,0x28,0x00,0xb7,0xff,0x7b,0x02,0x28,0x02,0x07,0xff,0xee,0x02,0x28,0x02,0x19,0xff,0xe7,0x02,0x28,0x02,0x1c,0xff,0xee,0x02,0x28,0x02,0x1e,0xff,0xe7,0x02,0x28,0x02,0x21,0xff,0xe7,0x02,0x29,0x00,0x0f,0xff,0xc3,0x02,0x29,0x00,0x11,0xff,0xae,0x02,0x29,0x00,0xac,\r\n0xff,0xae,0x02,0x29,0x02,0x07,0xff,0xc3,0x02,0x29,0x02,0x0b,0xff,0xb6,0x02,0x29,0x02,0x0c,0xff,0xdb,0x02,0x29,0x02,0x12,0xff,0xb6,0x02,0x29,0x02,0x15,0xff,0xdb,0x02,0x29,0x02,0x18,0xff,0xdb,0x02,0x29,0x02,0x19,0x00,0x29,0x02,0x29,0x02,0x1b,0xff,0xdb,0x02,0x29,0x02,0x21,0x00,0x29,0x02,0x29,0x02,0x26,0xff,0xe7,0x02,0x29,\r\n0x02,0x27,0xff,0xdb,0x02,0x29,0x02,0x2a,0xff,0xdb,0x02,0x29,0x02,0x2d,0xff,0xb6,0x02,0x2a,0x01,0xe4,0xff,0xe5,0x02,0x2c,0x02,0x28,0x00,0x52,0x02,0x2c,0x02,0x2f,0x00,0x52,0x02,0x2d,0x02,0x0c,0xff,0xf4,0x02,0x2d,0x02,0x15,0xff,0xf4,0x02,0x2d,0x02,0x18,0xff,0xf4,0x02,0x2d,0x02,0x19,0xff,0xaa,0x02,0x2d,0x02,0x1a,0xff,0xb6,\r\n0x02,0x2d,0x02,0x1b,0xff,0xf4,0x02,0x2d,0x02,0x1e,0xff,0x85,0x02,0x2d,0x02,0x21,0xff,0xaa,0x02,0x2d,0x02,0x27,0xff,0xf4,0x02,0x2d,0x02,0x2a,0xff,0xf4,0x02,0x2d,0x02,0x31,0xff,0xb6,0x02,0x2e,0x02,0x0c,0xff,0xf4,0x02,0x2e,0x02,0x15,0xff,0xf4,0x02,0x2e,0x02,0x18,0xff,0xf4,0x02,0x2e,0x02,0x19,0xff,0xaa,0x02,0x2e,0x02,0x1a,\r\n0xff,0xb6,0x02,0x2e,0x02,0x1b,0xff,0xf4,0x02,0x2e,0x02,0x1e,0xff,0x85,0x02,0x2e,0x02,0x21,0xff,0xaa,0x02,0x2e,0x02,0x27,0xff,0xf4,0x02,0x2e,0x02,0x2a,0xff,0xf4,0x02,0x2e,0x02,0x31,0xff,0xb6,0x02,0x2f,0x00,0x05,0xff,0x98,0x02,0x2f,0x00,0x0a,0xff,0x98,0x02,0x30,0x00,0x0f,0x00,0x52,0x02,0x30,0x00,0x10,0xff,0x73,0x02,0x30,\r\n0x00,0x11,0x00,0x52,0x02,0x30,0x00,0x1d,0x00,0x52,0x02,0x30,0x00,0x1e,0x00,0x52,0x02,0x30,0x00,0xac,0x00,0x52,0x02,0x30,0x02,0x0b,0x00,0x29,0x02,0x30,0x02,0x0c,0xff,0xd7,0x02,0x30,0x02,0x12,0x00,0x3d,0x02,0x30,0x02,0x15,0xff,0xd7,0x02,0x30,0x02,0x18,0xff,0xd7,0x02,0x30,0x02,0x1b,0xff,0xd7,0x02,0x30,0x02,0x1e,0xff,0xe7,\r\n0x02,0x30,0x02,0x27,0xff,0xd7,0x02,0x30,0x02,0x2a,0xff,0xd7,0x02,0x30,0x02,0x2d,0x00,0x3d,0x02,0x31,0x00,0x05,0x00,0x1d,0x02,0x31,0x00,0x0a,0x00,0x1d,0x02,0x31,0x00,0x0f,0xff,0x98,0x02,0x31,0x00,0x11,0xff,0x7f,0x02,0x31,0x00,0x22,0xff,0xb2,0x02,0x31,0x00,0xac,0xff,0x7f,0x02,0x31,0x00,0xbf,0x00,0x0e,0x02,0x31,0x00,0xc4,\r\n0xff,0x8b,0x02,0x31,0x00,0xc5,0xff,0x8b,0x02,0x31,0x02,0x0b,0xff,0x91,0x02,0x31,0x02,0x0c,0xff,0xf6,0x02,0x31,0x02,0x12,0xff,0x91,0x02,0x31,0x02,0x15,0xff,0xf6,0x02,0x31,0x02,0x18,0xff,0xf6,0x02,0x31,0x02,0x19,0x00,0x29,0x02,0x31,0x02,0x1b,0xff,0xf6,0x02,0x31,0x02,0x21,0x00,0x29,0x02,0x31,0x02,0x27,0xff,0xf6,0x02,0x31,\r\n0x02,0x2a,0xff,0xf6,0x02,0x31,0x02,0x2d,0xff,0x91,0x02,0x33,0x01,0xdc,0x00,0x29,0x02,0x33,0x01,0xde,0xff,0xa2,0x02,0x33,0x01,0xe0,0x00,0x2d,0x02,0x33,0x01,0xe1,0xff,0xa2,0x02,0x33,0x01,0xe3,0x00,0x29,0x02,0x33,0x01,0xe5,0x00,0x1d,0x02,0x33,0x01,0xe7,0xff,0x71,0x02,0x33,0x01,0xeb,0xff,0xa2,0x02,0x33,0x01,0xf2,0xff,0xa2,\r\n0x02,0x33,0x01,0xf5,0xff,0xcf,0x02,0x33,0x01,0xf8,0xff,0xcf,0x02,0x33,0x01,0xf9,0x00,0x29,0x02,0x33,0x01,0xfa,0x00,0x1d,0x02,0x33,0x01,0xfb,0xff,0xa2,0x02,0x33,0x02,0x01,0x00,0x29,0x02,0x33,0x02,0x06,0xff,0xe7,0x02,0x33,0x02,0x07,0xff,0x27,0x02,0x33,0x02,0x09,0xff,0x4e,0x02,0x33,0x02,0x0a,0xff,0x4e,0x02,0x33,0x02,0x0b,\r\n0xff,0x9e,0x02,0x33,0x02,0x0c,0xff,0x2b,0x02,0x33,0x02,0x0f,0xff,0x4e,0x02,0x33,0x02,0x10,0xff,0x4e,0x02,0x33,0x02,0x11,0xff,0x4e,0x02,0x33,0x02,0x12,0xff,0x9e,0x02,0x33,0x02,0x13,0xff,0x4e,0x02,0x33,0x02,0x14,0xff,0x4e,0x02,0x33,0x02,0x15,0xff,0x2b,0x02,0x33,0x02,0x16,0xff,0x4e,0x02,0x33,0x02,0x17,0xff,0x4e,0x02,0x33,\r\n0x02,0x18,0xff,0x2b,0x02,0x33,0x02,0x19,0xff,0xc3,0x02,0x33,0x02,0x1b,0xff,0x2b,0x02,0x33,0x02,0x1c,0xff,0x4c,0x02,0x33,0x02,0x1d,0xff,0x4e,0x02,0x33,0x02,0x1e,0xff,0x4e,0x02,0x33,0x02,0x1f,0xff,0x4e,0x02,0x33,0x02,0x20,0xff,0x4e,0x02,0x33,0x02,0x21,0xff,0xc3,0x02,0x33,0x02,0x22,0xff,0x4e,0x02,0x33,0x02,0x23,0xff,0x4e,\r\n0x02,0x33,0x02,0x24,0xff,0x60,0x02,0x33,0x02,0x25,0xff,0x4e,0x02,0x33,0x02,0x26,0xff,0x54,0x02,0x33,0x02,0x27,0xff,0x2b,0x02,0x33,0x02,0x29,0xff,0x4e,0x02,0x33,0x02,0x2a,0xff,0x2b,0x02,0x33,0x02,0x2b,0xff,0x66,0x02,0x33,0x02,0x2c,0x00,0x6f,0x02,0x33,0x02,0x2d,0xff,0x9e,0x02,0x33,0x02,0x2e,0xff,0x4e,0x02,0x33,0x02,0x32,\r\n0xff,0x4e,0x02,0x33,0x02,0x34,0xff,0x4e,0x02,0x34,0x00,0x0f,0xff,0xc3,0x02,0x34,0x00,0x11,0xff,0xae,0x02,0x34,0x00,0xac,0xff,0xae,0x02,0x34,0x02,0x07,0xff,0xc3,0x02,0x34,0x02,0x0b,0xff,0xb6,0x02,0x34,0x02,0x0c,0xff,0xdb,0x02,0x34,0x02,0x12,0xff,0xb6,0x02,0x34,0x02,0x15,0xff,0xdb,0x02,0x34,0x02,0x18,0xff,0xdb,0x02,0x34,\r\n0x02,0x19,0x00,0x29,0x02,0x34,0x02,0x1b,0xff,0xdb,0x02,0x34,0x02,0x21,0x00,0x29,0x02,0x34,0x02,0x26,0xff,0xe7,0x02,0x34,0x02,0x27,0xff,0xdb,0x02,0x34,0x02,0x2a,0xff,0xdb,0x02,0x34,0x02,0x2c,0x00,0x52,0x02,0x34,0x02,0x2d,0xff,0xb6,0x02,0x37,0x01,0x33,0x00,0x19,0x02,0x37,0x01,0xc5,0x00,0x29,0x02,0x37,0x02,0x37,0x00,0x19,\r\n0x02,0x3d,0x00,0x57,0xff,0xbe,0x02,0x3d,0x00,0x59,0xff,0xcf,0x02,0x3d,0x00,0x5a,0xff,0xe5,0x02,0x3d,0x00,0x5c,0xff,0xd1,0x02,0x3d,0x00,0xba,0xff,0xbe,0x02,0x3d,0x00,0xc4,0xff,0xb2,0x02,0x3d,0x00,0xc5,0xff,0xb2,0x02,0x3d,0x00,0xeb,0xff,0xd1,0x02,0x3d,0x01,0x21,0xff,0xbe,0x02,0x3d,0x01,0x23,0xff,0xbe,0x02,0x3d,0x01,0x77,\r\n0xff,0xbe,0x02,0x3d,0x01,0x81,0xff,0xe5,0x02,0x3d,0x01,0x83,0xff,0xd1,0x02,0x3d,0x01,0x8d,0xff,0xe5,0x02,0x3d,0x01,0x8f,0xff,0xe5,0x02,0x3d,0x01,0x91,0xff,0xe5,0x02,0x3d,0x01,0x93,0xff,0xd1,0x00,0x00,0x00,0x00,0x00,0x30,0x02,0x46,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x14,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,\r\n0x00,0x01,0x00,0x10,0x02,0x14,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x0e,0x02,0x24,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x00,0x20,0x02,0x32,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x10,0x02,0x14,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x05,0x00,0x18,0x02,0x52,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x06,0x00,0x0e,\r\n0x02,0x6a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x72,0x02,0x78,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x2a,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0b,0x00,0x56,0x02,0xea,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0d,0x0e,0x04,0x03,0x40,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0e,0x00,0x56,0x02,0xea,0x00,0x03,\r\n0x00,0x01,0x04,0x03,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x05,0x00,0x02,0x00,0x10,0x11,0x50,0x00,0x03,0x00,0x01,0x04,0x06,0x00,0x02,0x00,0x0c,0x11,0x60,0x00,0x03,0x00,0x01,0x04,0x07,0x00,0x02,0x00,0x10,0x11,0x6c,0x00,0x03,0x00,0x01,0x04,0x08,0x00,0x02,0x00,0x10,0x11,0x7c,0x00,0x03,0x00,0x01,0x04,0x09,\r\n0x00,0x00,0x02,0x18,0x11,0x8c,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x10,0x02,0x14,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,0x02,0x24,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x20,0x02,0x32,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x10,0x02,0x14,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x18,\r\n0x02,0x52,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x0e,0x02,0x6a,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x07,0x00,0x72,0x02,0x78,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x2a,0x00,0x0e,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x56,0x02,0xea,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x0e,0x18,0x13,0xa4,0x00,0x03,\r\n0x00,0x01,0x04,0x09,0x00,0x0e,0x00,0x4a,0x02,0xea,0x00,0x03,0x00,0x01,0x04,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x0b,0x00,0x02,0x00,0x10,0x21,0xbc,0x00,0x03,0x00,0x01,0x04,0x0c,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x0e,0x00,0x02,0x00,0x0c,0x21,0xcc,0x00,0x03,0x00,0x01,0x04,0x10,\r\n0x00,0x02,0x00,0x0e,0x21,0xd8,0x00,0x03,0x00,0x01,0x04,0x13,0x00,0x02,0x00,0x12,0x21,0xe6,0x00,0x03,0x00,0x01,0x04,0x14,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x15,0x00,0x02,0x00,0x10,0x21,0xf8,0x00,0x03,0x00,0x01,0x04,0x16,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x19,0x00,0x02,0x00,0x0e,\r\n0x22,0x08,0x00,0x03,0x00,0x01,0x04,0x1b,0x00,0x02,0x00,0x10,0x22,0x16,0x00,0x03,0x00,0x01,0x04,0x1d,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x1f,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x04,0x24,0x00,0x02,0x00,0x0e,0x22,0x26,0x00,0x03,0x00,0x01,0x04,0x2d,0x00,0x02,0x00,0x0e,0x22,0x34,0x00,0x03,\r\n0x00,0x01,0x08,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x08,0x16,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x0c,0x0a,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0x03,0x00,0x01,0x0c,0x0c,0x00,0x02,0x00,0x0c,0x11,0x44,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x31,0x00,0x38,0x00,0x20,0x00,0x4d,0x00,0x69,\r\n0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x72,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,\r\n0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0d,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,\r\n0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x33,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x37,\r\n0x00,0x2c,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x54,\r\n0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,\r\n0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,\r\n0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x3b,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64,\r\n0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x73,\r\n0x00,0x2e,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x55,0x00,0x49,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x55,0x00,0x49,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,\r\n0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x35,0x00,0x2e,0x00,0x36,0x00,0x32,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x55,0x00,0x49,0x00,0x53,0x00,0x65,0x00,0x67,0x00,0x6f,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x74,0x00,0x72,\r\n0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00,0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x6f,0x00,0x75,0x00,0x70,0x00,0x20,0x00,0x6f,\r\n0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x70,0x00,0x61,0x00,0x6e,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x2e,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x73,0x00,0x2e,0x00,0x6d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,\r\n0x00,0x66,0x00,0x74,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x2f,0x00,0x74,0x00,0x79,0x00,0x70,0x00,0x6f,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x70,0x00,0x68,0x00,0x79,0x00,0x2f,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,\r\n0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,\r\n0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x70,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x70,0x00,0x72,\r\n0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,\r\n0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,\r\n0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,\r\n0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,\r\n0x00,0x77,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x65,\r\n0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,\r\n0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,\r\n0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x3b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,\r\n0x00,0x28,0x00,0x69,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x72,0x00,0x69,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x6e,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,\r\n0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x70,0x00,0x75,0x00,0x74,\r\n0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x6c,0x00,0x70,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x41,\r\n0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x0d,0x00,0x0d,0x00,0x54,0x00,0x68,0x00,0x65,\r\n0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,\r\n0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x65,0x00,0x6e,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x69,\r\n0x00,0x61,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x5f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x73,\r\n0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,\r\n0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x20,0x1d,\r\n0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x6a,0x00,0x6f,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,\r\n0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0d,0x00,0x50,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,\r\n0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x65,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,\r\n0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,\r\n0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,\r\n0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f,\r\n0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63,0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,\r\n0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x20,0x1d,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61,\r\n0x00,0x6c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x77,\r\n0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,0x00,0x69,\r\n0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x75,\r\n0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,0x00,0x68,\r\n0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75,0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72,\r\n0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,\r\n0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73,\r\n0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,\r\n0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e,0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63,\r\n0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0d,0x00,0x0d,\r\n0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76,0x00,0x65,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,\r\n0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69,\r\n0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,\r\n0x00,0x74,0x00,0x69,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,\r\n0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2e,0x00,0x0d,0x00,0x0d,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,0x00,0x4f,\r\n0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x27,0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x27,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,0x00,0x20,\r\n0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,0x00,0x2c,\r\n0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55,0x00,0x44,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x54,0x00,0x48,\r\n0x00,0x45,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,\r\n0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,0x00,0x53,\r\n0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2e,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,0x00,0x45,\r\n0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41,0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x55,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48,\r\n0x00,0x54,0x00,0x20,0x00,0x48,0x00,0x4f,0x00,0x4c,0x00,0x44,0x00,0x45,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,0x00,0x41,0x00,0x49,\r\n0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d,0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x57,\r\n0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x2c,\r\n0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d,\r\n0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x4e,0x00,0x45,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x20,0x00,0x54,\r\n0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,\r\n0x00,0x44,0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x6f,\r\n0x00,0x62,0x00,0x79,0x01,0x0d,0x00,0x65,0x00,0x6a,0x00,0x6e,0x00,0xe9,0x00,0x6e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x72,0x00,0x64,0x03,0x9a,0x03,0xb1,0x03,0xbd,0x03,0xbf,0x03,0xbd,0x03,0xb9,0x03,0xba,0x03,0xac,0x00,0xa9,0x00,0x20,0x00,0x32,\r\n0x00,0x30,0x00,0x31,0x00,0x38,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x43,0x00,0x6f,0x00,0x72,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x52,\r\n0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x52,0x00,0x65,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,\r\n0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0xa9,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,\r\n0x00,0x33,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x30,0x00,0x37,0x00,0x2c,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x26,0x00,0x20,0x00,0x4a,0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,\r\n0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,\r\n0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x75,0x00,0x72,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,\r\n0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x3b,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x65,0x00,0x20,\r\n0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,\r\n0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x73,0x00,0x2e,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,\r\n0x00,0x2e,0x00,0x20,0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x63,0x00,0x72,0x00,0x65,0x00,0x61,0x00,0x74,\r\n0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x70,0x00,0x6c,0x00,0x61,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,\r\n0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,\r\n0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,\r\n0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x64,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x72,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x69,\r\n0x00,0x6e,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x69,0x00,0x63,0x00,0x68,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x77,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x20,\r\n0x00,0x59,0x00,0x6f,0x00,0x75,0x00,0x20,0x00,0x6d,0x00,0x61,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,\r\n0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,\r\n0x00,0x65,0x00,0x6d,0x00,0x62,0x00,0x65,0x00,0x64,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,\r\n0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x3b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x28,0x00,0x69,0x00,0x69,0x00,0x29,0x00,0x20,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x70,0x00,0x6f,0x00,0x72,0x00,0x61,0x00,0x72,0x00,0x69,\r\n0x00,0x6c,0x00,0x79,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x77,0x00,0x6e,0x00,0x6c,0x00,0x6f,0x00,0x61,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,\r\n0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x70,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x68,0x00,0x65,0x00,0x6c,\r\n0x00,0x70,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x00,0x20,0x00,0x41,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,\r\n0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x72,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x62,0x00,0x69,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x6c,\r\n0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,\r\n0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x65,0x00,0x6e,0x00,0x2e,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x69,0x00,0x61,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x77,0x00,0x69,0x00,0x6b,0x00,0x69,0x00,0x2f,0x00,0x4d,\r\n0x00,0x49,0x00,0x54,0x00,0x5f,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x70,0x00,0x70,0x00,0x6c,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,\r\n0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,\r\n0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x20,0x1d,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x20,0x00,0x6a,0x00,0x6f,0x00,0x69,0x00,0x6e,0x00,0x74,0x00,0x6c,0x00,0x79,0x00,0x20,\r\n0x00,0x64,0x00,0x65,0x00,0x76,0x00,0x65,0x00,0x6c,0x00,0x6f,0x00,0x70,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x52,0x00,0x61,0x00,0x6c,0x00,0x70,0x00,0x68,0x00,0x20,0x00,0x48,0x00,0x61,0x00,0x6e,0x00,0x63,0x00,0x6f,0x00,0x63,0x00,0x6b,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x4a,\r\n0x00,0x6f,0x00,0x68,0x00,0x6e,0x00,0x20,0x00,0x48,0x00,0x75,0x00,0x64,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x2e,0x00,0x20,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x50,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x68,0x00,0x65,\r\n0x00,0x72,0x00,0x65,0x00,0x62,0x00,0x79,0x00,0x20,0x00,0x67,0x00,0x72,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x2c,0x00,0x20,0x00,0x66,0x00,0x72,0x00,0x65,0x00,0x65,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x63,0x00,0x68,0x00,0x61,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,\r\n0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x79,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6f,0x00,0x62,0x00,0x74,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,\r\n0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x54,0x00,0x79,0x00,0x70,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x66,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x42,0x00,0x69,\r\n0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x48,0x00,0x65,0x00,0x62,0x00,0x72,0x00,0x65,0x00,0x77,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x6f,0x00,0x63,0x00,0x69,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x63,\r\n0x00,0x75,0x00,0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x66,0x00,0x69,0x00,0x6c,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x20,0x1c,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,\r\n0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x20,0x1d,0x00,0x29,0x00,0x2c,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x65,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,\r\n0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x72,0x00,0x65,0x00,0x73,\r\n0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x77,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x6d,0x00,0x69,\r\n0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x75,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x2c,0x00,0x20,\r\n0x00,0x6d,0x00,0x6f,0x00,0x64,0x00,0x69,0x00,0x66,0x00,0x79,0x00,0x2c,0x00,0x20,0x00,0x6d,0x00,0x65,0x00,0x72,0x00,0x67,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x70,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x2c,0x00,0x20,0x00,0x64,0x00,0x69,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x69,0x00,0x62,0x00,0x75,\r\n0x00,0x74,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x2f,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x65,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,\r\n0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x2c,\r\n0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,0x00,0x69,0x00,0x74,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x77,0x00,0x68,0x00,0x6f,0x00,0x6d,0x00,0x20,0x00,0x74,\r\n0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x66,0x00,0x75,0x00,0x72,0x00,0x6e,\r\n0x00,0x69,0x00,0x73,0x00,0x68,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x64,0x00,0x6f,0x00,0x20,0x00,0x73,0x00,0x6f,0x00,0x2c,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x74,0x00,0x6f,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x66,\r\n0x00,0x6f,0x00,0x6c,0x00,0x6c,0x00,0x6f,0x00,0x77,0x00,0x69,0x00,0x6e,0x00,0x67,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x64,0x00,0x69,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x3a,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x62,0x00,0x6f,0x00,0x76,\r\n0x00,0x65,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x70,0x00,0x65,0x00,0x72,0x00,0x6d,\r\n0x00,0x69,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x6e,0x00,0x6f,0x00,0x74,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x20,0x00,0x73,0x00,0x68,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x62,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x6e,0x00,0x63,0x00,0x6c,0x00,0x75,0x00,0x64,0x00,0x65,0x00,0x64,0x00,0x20,\r\n0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x61,0x00,0x6c,0x00,0x6c,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x70,0x00,0x69,0x00,0x65,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x72,0x00,0x20,0x00,0x73,0x00,0x75,0x00,0x62,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x69,0x00,0x61,0x00,0x6c,0x00,0x20,0x00,0x70,0x00,0x6f,0x00,0x72,\r\n0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4c,0x00,0x61,0x00,0x79,0x00,0x6f,0x00,0x75,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x6f,0x00,0x67,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,\r\n0x00,0x72,0x00,0x65,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x0d,0x00,0x0a,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x20,0x00,0x50,0x00,0x52,0x00,0x4f,0x00,0x56,0x00,0x49,0x00,0x44,0x00,0x45,0x00,0x44,0x00,0x20,\r\n0x00,0x27,0x00,0x41,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x53,0x00,0x27,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x59,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,\r\n0x00,0x20,0x00,0x4b,0x00,0x49,0x00,0x4e,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x45,0x00,0x58,0x00,0x50,0x00,0x52,0x00,0x45,0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4d,0x00,0x50,0x00,0x4c,0x00,0x49,0x00,0x45,0x00,0x44,0x00,0x2c,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x43,0x00,0x4c,0x00,0x55,\r\n0x00,0x44,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x42,0x00,0x55,0x00,0x54,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x54,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x4d,0x00,0x49,0x00,0x54,0x00,0x45,0x00,0x44,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x52,\r\n0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x49,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4d,0x00,0x45,0x00,0x52,0x00,0x43,0x00,0x48,0x00,0x41,0x00,0x4e,0x00,0x54,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x46,0x00,0x49,0x00,0x54,0x00,0x4e,0x00,0x45,\r\n0x00,0x53,0x00,0x53,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x20,0x00,0x50,0x00,0x41,0x00,0x52,0x00,0x54,0x00,0x49,0x00,0x43,0x00,0x55,0x00,0x4c,0x00,0x41,0x00,0x52,0x00,0x20,0x00,0x50,0x00,0x55,0x00,0x52,0x00,0x50,0x00,0x4f,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x44,0x00,0x20,\r\n0x00,0x4e,0x00,0x4f,0x00,0x4e,0x00,0x49,0x00,0x4e,0x00,0x46,0x00,0x52,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x45,0x00,0x4d,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x2e,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x4e,0x00,0x4f,0x00,0x20,0x00,0x45,0x00,0x56,0x00,0x45,0x00,0x4e,0x00,0x54,0x00,0x20,0x00,0x53,0x00,0x48,0x00,0x41,\r\n0x00,0x4c,0x00,0x4c,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x41,0x00,0x55,0x00,0x54,0x00,0x48,0x00,0x4f,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x50,0x00,0x59,0x00,0x52,0x00,0x49,0x00,0x47,0x00,0x48,0x00,0x54,0x00,0x20,0x00,0x48,0x00,0x4f,0x00,0x4c,0x00,0x44,\r\n0x00,0x45,0x00,0x52,0x00,0x53,0x00,0x20,0x00,0x42,0x00,0x45,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x4c,0x00,0x45,0x00,0x20,0x00,0x46,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x59,0x00,0x20,0x00,0x43,0x00,0x4c,0x00,0x41,0x00,0x49,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x44,0x00,0x41,0x00,0x4d,\r\n0x00,0x41,0x00,0x47,0x00,0x45,0x00,0x53,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x4c,0x00,0x49,0x00,0x41,0x00,0x42,0x00,0x49,0x00,0x4c,0x00,0x49,0x00,0x54,0x00,0x59,0x00,0x2c,0x00,0x20,0x00,0x57,0x00,0x48,0x00,0x45,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,\r\n0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x4e,0x00,0x20,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x54,0x00,0x52,0x00,0x41,0x00,0x43,0x00,0x54,0x00,0x2c,0x00,0x20,0x00,0x54,0x00,0x4f,0x00,0x52,0x00,0x54,0x00,0x20,\r\n0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x57,0x00,0x49,0x00,0x53,0x00,0x45,0x00,0x2c,0x00,0x20,0x00,0x41,0x00,0x52,0x00,0x49,0x00,0x53,0x00,0x49,0x00,0x4e,0x00,0x47,0x00,0x20,0x00,0x46,0x00,0x52,0x00,0x4f,0x00,0x4d,0x00,0x2c,0x00,0x20,0x00,0x4f,0x00,0x55,0x00,0x54,0x00,0x20,\r\n0x00,0x4f,0x00,0x46,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x43,0x00,0x4f,0x00,0x4e,0x00,0x4e,0x00,0x45,0x00,0x43,0x00,0x54,0x00,0x49,0x00,0x4f,0x00,0x4e,0x00,0x20,0x00,0x57,0x00,0x49,0x00,0x54,0x00,0x48,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,\r\n0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x55,0x00,0x53,0x00,0x45,0x00,0x20,0x00,0x4f,0x00,0x52,0x00,0x20,0x00,0x4f,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x52,0x00,0x20,0x00,0x44,0x00,0x45,0x00,0x41,0x00,0x4c,0x00,0x49,0x00,0x4e,\r\n0x00,0x47,0x00,0x53,0x00,0x20,0x00,0x49,0x00,0x4e,0x00,0x20,0x00,0x54,0x00,0x48,0x00,0x45,0x00,0x20,0x00,0x53,0x00,0x4f,0x00,0x46,0x00,0x54,0x00,0x57,0x00,0x41,0x00,0x52,0x00,0x45,0x00,0x2e,0x00,0x0d,0x00,0x0a,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x61,0x00,0x6c,0x00,0x69,0x00,0x4e,0x00,0x6f,0x00,0x72,\r\n0x00,0x6d,0x00,0xe1,0x00,0x6c,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x65,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x64,0x00,0x61,0x00,0x61,0x00,0x72,0x00,0x64,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0x61,0x00,0x6c,0x00,0x6e,0x00,0x79,0x04,0x1e,0x04,0x31,0x04,0x4b,0x04,0x47,0x04,0x3d,\r\n0x04,0x4b,0x04,0x39,0x00,0x4e,0x00,0x6f,0x00,0x72,0x00,0x6d,0x00,0xe1,0x00,0x6c,0x00,0x6e,0x00,0x65,0x00,0x4e,0x00,0x61,0x00,0x76,0x00,0x61,0x00,0x64,0x00,0x6e,0x00,0x6f,0x00,0x41,0x00,0x72,0x00,0x72,0x00,0x75,0x00,0x6e,0x00,0x74,0x00,0x61,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x4e,0x00,0x77,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x08,0x00,0x0a,0x00,0x13,0x00,0x07,0xff,0xff,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x23,0x8a,0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x23,0x82,0x30,0x82,0x23,0x7e,\r\n0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x23,0x6f,0x30,0x82,0x23,0x6b,0x02,0x01,0x01,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x71,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0xa0,0x63,0x30,0x61,0x30,0x2c,0x06,0x0a,0x2b,0x06,0x01,\r\n0x04,0x01,0x82,0x37,0x02,0x01,0x1c,0xa2,0x1e,0x80,0x1c,0x00,0x3c,0x00,0x3c,0x00,0x3c,0x00,0x4f,0x00,0x62,0x00,0x73,0x00,0x6f,0x00,0x6c,0x00,0x65,0x00,0x74,0x00,0x65,0x00,0x3e,0x00,0x3e,0x00,0x3e,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0xd1,0x66,0x06,0x5e,0x25,0x40,\r\n0xdd,0x89,0xdd,0x33,0x17,0x38,0x13,0xf4,0x79,0x7b,0x24,0x66,0x3e,0x9d,0x0d,0xef,0x96,0x4e,0xe9,0x40,0xb6,0xb7,0x21,0xab,0x14,0x43,0xa0,0x82,0x0d,0x81,0x30,0x82,0x05,0xff,0x30,0x82,0x03,0xe7,0xa0,0x03,0x02,0x01,0x02,0x02,0x13,0x33,0x00,0x00,0x01,0x03,0x5e,0x25,0x1c,0x99,0x1f,0xa3,0x1e,0xb8,0x00,0x00,0x00,0x00,0x01,0x03,\r\n0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,\r\n0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,\r\n0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x30,0x1e,0x17,0x0d,0x31,0x38,0x30,0x37,0x31,0x32,0x32,0x30,0x30,0x38,0x34,0x38,0x5a,0x17,0x0d,0x31,0x39,0x30,0x37,0x32,0x36,0x32,0x30,0x30,0x38,0x34,0x38,0x5a,0x30,0x74,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,\r\n0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,\r\n0x61,0x74,0x69,0x6f,0x6e,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x03,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,\r\n0x0a,0x02,0x82,0x01,0x01,0x00,0xd1,0x94,0x76,0x36,0xe6,0x86,0xab,0x36,0xfe,0x69,0xf9,0x46,0x7c,0x8b,0x88,0x50,0xcb,0x90,0x70,0x7f,0xb0,0x55,0xa9,0x24,0x1d,0x7e,0x39,0xe7,0x05,0x9f,0x0f,0xac,0x7b,0x97,0xb2,0xce,0x73,0x0a,0xfb,0xd4,0x9b,0x24,0x5c,0x16,0xb5,0x39,0xdd,0x1b,0x7e,0x33,0x6c,0x11,0xfc,0x3b,0x26,0xf3,0x98,0xaa,\r\n0x5d,0x53,0x6b,0xaa,0xc3,0xec,0x13,0xb8,0xd2,0xef,0xcf,0x57,0x7f,0xcc,0x65,0xcb,0xaf,0x4d,0x2e,0x32,0xb1,0x56,0x2b,0x4e,0x34,0x07,0x89,0xfe,0x69,0x21,0xbd,0x3e,0x44,0xfb,0xde,0x12,0x9d,0x85,0xbf,0x7c,0x76,0x86,0x7d,0x72,0xb1,0x76,0x9b,0x61,0xe6,0x8a,0x64,0x4c,0x46,0xce,0xb6,0xd5,0x3a,0x8c,0x77,0x93,0x77,0x67,0x21,0x9c,\r\n0xb6,0x5a,0x06,0x5e,0x47,0x86,0xf5,0x3c,0xd1,0x09,0xca,0x0d,0x3d,0xcd,0xb2,0xe9,0xa1,0x50,0x78,0xd1,0x84,0x88,0xe2,0x01,0x3c,0x22,0xfc,0xaf,0x96,0x08,0xcc,0x5d,0x99,0xc0,0xed,0xeb,0xa5,0x5a,0x98,0x92,0xf5,0xc8,0x40,0x4e,0x6a,0x73,0xaf,0xde,0xe3,0x74,0x7a,0xd3,0x5f,0x46,0x97,0xbc,0xe2,0x67,0x28,0x77,0x99,0xac,0xc1,0x0e,\r\n0x31,0x16,0x8f,0x00,0x0f,0x01,0xfe,0x4b,0x5e,0x54,0x0f,0xca,0xc4,0x65,0x3f,0x0a,0xe3,0xa3,0x46,0xdb,0xf6,0x2c,0x03,0x3a,0x19,0xbe,0x68,0x05,0x16,0x9c,0xe6,0x7f,0x34,0xbf,0xa7,0x87,0x8d,0x65,0x39,0x26,0xc9,0x63,0xd4,0xef,0xc5,0xdd,0xbd,0x25,0xfe,0xfd,0x28,0xf4,0x34,0x86,0x79,0xac,0x2a,0xd5,0x5f,0x30,0x91,0x3b,0xe4,0x14,\r\n0x6a,0xeb,0xb1,0xca,0x04,0x23,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x7e,0x30,0x82,0x01,0x7a,0x30,0x1f,0x06,0x03,0x55,0x1d,0x25,0x04,0x18,0x30,0x16,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x4c,0x08,0x01,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x03,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x47,\r\n0xbe,0xc0,0xcb,0xe1,0xa6,0x3f,0xfd,0x65,0xd6,0x38,0xf2,0x03,0x5d,0xb7,0xaf,0x77,0xf7,0x40,0xff,0x30,0x50,0x06,0x03,0x55,0x1d,0x11,0x04,0x49,0x30,0x47,0xa4,0x45,0x30,0x43,0x31,0x29,0x30,0x27,0x06,0x03,0x55,0x04,0x0b,0x13,0x20,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,\r\n0x73,0x20,0x50,0x75,0x65,0x72,0x74,0x6f,0x20,0x52,0x69,0x63,0x6f,0x31,0x16,0x30,0x14,0x06,0x03,0x55,0x04,0x05,0x13,0x0d,0x32,0x33,0x30,0x30,0x31,0x32,0x2b,0x34,0x33,0x37,0x39,0x36,0x35,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x48,0x6e,0x64,0xe5,0x50,0x05,0xd3,0x82,0xaa,0x17,0x37,0x37,0x22,0xb5,\r\n0x6d,0xa8,0xca,0x75,0x02,0x95,0x30,0x54,0x06,0x03,0x55,0x1d,0x1f,0x04,0x4d,0x30,0x4b,0x30,0x49,0xa0,0x47,0xa0,0x45,0x86,0x43,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x63,0x72,0x6c,0x2f,0x4d,0x69,0x63,\r\n0x43,0x6f,0x64,0x53,0x69,0x67,0x50,0x43,0x41,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x2d,0x30,0x37,0x2d,0x30,0x38,0x2e,0x63,0x72,0x6c,0x30,0x61,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x55,0x30,0x53,0x30,0x51,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,\r\n0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x43,0x6f,0x64,0x53,0x69,0x67,0x50,0x43,0x41,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x2d,0x30,0x37,0x2d,0x30,0x38,0x2e,0x63,0x72,0x74,0x30,\r\n0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x9f,0xf5,0xc9,0x53,0x0d,0x3f,0x0d,0x26,0xec,0xa2,0x44,0xd8,0x0d,0xd1,0x9f,0x63,0x96,0x06,0x4b,0x3f,0x1e,0x5c,0xc5,0x33,0xa3,0xa4,0xc3,0x6c,0xaf,0x1f,0xc0,\r\n0x01,0xba,0xeb,0x65,0xec,0x9e,0x33,0x10,0x0f,0xa7,0xac,0x5b,0xd4,0xbd,0x90,0x61,0x17,0xe7,0x31,0xe7,0xc3,0x26,0xb4,0xac,0xf5,0x27,0xd3,0x48,0x93,0x86,0x88,0xfe,0x12,0x35,0x91,0x64,0x22,0xd1,0x6b,0x2d,0x3b,0xa8,0x2c,0x15,0x94,0x29,0xd2,0x37,0x96,0xe6,0x35,0xff,0x0c,0xce,0xc8,0x06,0x16,0x16,0x9e,0x24,0xb1,0xe2,0x39,0xf9,\r\n0x6e,0x0e,0x78,0xd8,0x0c,0x1b,0xb6,0x29,0x60,0x27,0x76,0x34,0x24,0x9b,0xdd,0xb9,0x97,0x75,0xcb,0x01,0x3b,0xad,0x82,0x12,0x16,0x22,0x80,0x89,0x15,0x84,0xbb,0x98,0x50,0x20,0xb0,0x17,0x26,0x86,0x49,0xaf,0xce,0x7d,0x45,0x15,0x43,0x34,0x96,0xcf,0x81,0x5c,0x18,0x2c,0xd4,0x93,0xf2,0x67,0xab,0xe2,0x73,0xc8,0x3d,0xa3,0xcd,0xfc,\r\n0x32,0x1e,0x60,0x1c,0xe9,0xb0,0x1b,0x30,0xfb,0x2c,0xbb,0x07,0x2e,0x96,0x84,0x93,0x45,0x28,0x54,0x5c,0xcd,0x96,0xfd,0xa0,0xdb,0x81,0xd8,0xb6,0x30,0xca,0x43,0xb1,0xf3,0x48,0xc0,0xb2,0x46,0x1c,0x5d,0x5e,0x76,0x2a,0x58,0x9f,0xd4,0xee,0xf2,0xf4,0xfa,0x48,0x4c,0xb5,0x61,0x8b,0xb0,0x8c,0x41,0xe9,0xaa,0xb8,0x9d,0x90,0xf4,0xff,\r\n0x6a,0x42,0x0f,0xb9,0x3e,0xe9,0x0e,0xec,0x94,0xfc,0x8d,0x80,0xbb,0x78,0xe3,0x23,0xa7,0x78,0x5b,0xb2,0x6d,0x1f,0xf9,0x59,0xc1,0x7d,0xb6,0xd1,0x39,0xc9,0x79,0xe0,0x83,0x1c,0x60,0x0a,0xda,0x3d,0xb0,0xd1,0xed,0x36,0xbf,0x45,0x07,0xe9,0x1b,0x36,0x6e,0xe5,0x3d,0x3b,0x05,0x03,0xa7,0xd4,0xa7,0x25,0x12,0x8f,0xe6,0x76,0xa3,0x13,\r\n0xb3,0x45,0x5a,0x43,0x31,0x82,0xda,0xd8,0x84,0xae,0xb9,0xb0,0x1f,0x75,0xf5,0xf6,0x1d,0x7d,0x51,0x11,0x37,0x27,0xe8,0xb5,0x35,0x84,0x71,0xf7,0x57,0xaa,0xae,0xfa,0x89,0x71,0xc9,0x98,0xd2,0x9e,0x5a,0x64,0x76,0xbe,0x8c,0xc3,0x7d,0x15,0x6a,0x91,0xf1,0x14,0xf4,0xf2,0xd9,0x35,0x31,0xb8,0xdb,0x72,0xfa,0xb4,0x75,0xc8,0x88,0x9b,\r\n0x6a,0xbf,0x98,0x45,0xc7,0x66,0xb2,0xd7,0xff,0xce,0x92,0x90,0x75,0xe4,0xeb,0xe6,0x86,0xd2,0xc8,0x1b,0xdb,0x27,0xc0,0x5b,0x95,0x6f,0x49,0x6f,0x58,0x5d,0x69,0x2a,0xde,0x53,0x4b,0xf8,0xe8,0xca,0x7b,0xf6,0x6c,0x15,0xf9,0x03,0x19,0x0f,0x11,0x85,0xaa,0x4f,0x9a,0xbf,0xaa,0x57,0xdd,0x60,0xc6,0xf5,0x71,0x20,0xf4,0x51,0xa8,0x9a,\r\n0xca,0xe9,0xd1,0xeb,0x34,0x47,0x3d,0x75,0xfa,0x22,0xec,0x55,0x3f,0x6a,0x19,0x39,0x6b,0x10,0xe9,0x5a,0x3f,0x8e,0xf4,0x23,0x78,0x30,0xb2,0xf2,0xa6,0x38,0xcb,0x35,0x8d,0xaa,0x98,0x59,0x24,0x40,0xb8,0x3a,0x67,0xa4,0x07,0x5f,0xa0,0xfe,0xd8,0x3b,0x49,0x13,0xfb,0x0c,0xe1,0xed,0x0b,0x6d,0x83,0x50,0xce,0xf0,0x7f,0x3e,0xe0,0xd9,\r\n0x08,0xe8,0x8c,0x21,0x4a,0x41,0xc2,0xde,0xeb,0x8e,0x5b,0xee,0x03,0xc3,0x1d,0x6e,0x6e,0xe6,0x54,0x35,0x66,0x67,0x72,0x7c,0x1a,0xea,0x52,0xf6,0x22,0xc4,0x72,0x3f,0xae,0x30,0x82,0x07,0x7a,0x30,0x82,0x05,0x62,0xa0,0x03,0x02,0x01,0x02,0x02,0x0a,0x61,0x0e,0x90,0xd2,0x00,0x00,0x00,0x00,0x00,0x03,0x30,0x0d,0x06,0x09,0x2a,0x86,\r\n0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81,0x88,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,\r\n0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,0x65,0x72,0x74,0x69,0x66,\r\n0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x32,0x30,0x31,0x31,0x30,0x1e,0x17,0x0d,0x31,0x31,0x30,0x37,0x30,0x38,0x32,0x30,0x35,0x39,0x30,0x39,0x5a,0x17,0x0d,0x32,0x36,0x30,0x37,0x30,0x38,0x32,0x31,0x30,0x39,0x30,0x39,0x5a,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,\r\n0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,\r\n0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x30,0x82,0x02,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,\r\n0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x02,0x0f,0x00,0x30,0x82,0x02,0x0a,0x02,0x82,0x02,0x01,0x00,0xab,0xf0,0xfa,0x72,0x10,0x1c,0x2e,0xad,0xd8,0x6e,0xaa,0x82,0x10,0x4d,0x34,0xba,0xf2,0xb6,0x58,0x21,0x9f,0x42,0x1b,0x2a,0x6b,0xe9,0x5a,0x50,0xaa,0xb8,0x06,0x38,0x1a,0x04,0x49,0xba,0x7f,0xc3,0x0c,0x1e,0xdd,0x37,0x6b,\r\n0xc6,0x12,0xd8,0x0b,0xf0,0x38,0xc2,0x99,0x06,0xb0,0xc8,0x39,0xd5,0x01,0x14,0x31,0x42,0xd3,0x89,0x0d,0x79,0x64,0x87,0x7e,0x94,0x60,0x24,0x6c,0xaf,0x9e,0x49,0x9c,0xe9,0x68,0x5e,0xd2,0xdf,0x9b,0x53,0xb2,0x0a,0x2c,0xc3,0xaf,0xd9,0xa9,0x2b,0xae,0x7a,0x09,0xaf,0xd7,0x96,0x59,0xca,0x60,0x1a,0x05,0xe9,0x66,0x76,0xe8,0x32,0x52,\r\n0x26,0x12,0x2f,0xe7,0xab,0x08,0x50,0xcf,0xb3,0x44,0xb7,0x5d,0xd8,0xc4,0x2e,0x03,0x75,0xab,0x68,0xf3,0xcb,0x6d,0xf3,0x3a,0x5c,0xa1,0x16,0xf4,0x46,0xba,0xe0,0x38,0x64,0xac,0x6e,0x64,0x35,0x78,0xa6,0xa0,0x63,0x0f,0x2d,0xd3,0x40,0x93,0xf8,0xe3,0xde,0x07,0x0d,0xd5,0x5c,0x79,0xa5,0x49,0x29,0xe7,0x0d,0xbe,0xa0,0x13,0x77,0xbe,\r\n0x94,0x3d,0xef,0xfb,0xe3,0x2b,0x5a,0x10,0x1f,0x4d,0x56,0x28,0xa2,0x7a,0x72,0xe0,0x12,0x3a,0xb7,0x49,0x5e,0xd8,0xed,0xed,0x43,0x91,0x83,0xd9,0x7b,0xb2,0x7b,0x86,0x1b,0xd9,0x3e,0xb1,0x8c,0x5d,0xe8,0x89,0x4f,0x84,0x1a,0xf2,0xa1,0x2f,0x59,0xe4,0x90,0x3b,0x2d,0xae,0x33,0x58,0xc5,0xb7,0x3e,0xfe,0x32,0xd3,0xb3,0x03,0x3d,0xb1,\r\n0xb2,0xaf,0x92,0x38,0x7e,0xd2,0x9d,0x80,0x2c,0xf5,0x4e,0x56,0x91,0x21,0x35,0x25,0xc3,0x39,0x6e,0x64,0x7f,0x53,0xba,0x9c,0x0f,0xad,0x19,0x23,0x84,0xcb,0xf4,0xba,0x03,0x86,0x8d,0xf7,0x5f,0xf0,0xd0,0x52,0xbf,0x8c,0x94,0x87,0xbc,0xc0,0x21,0x74,0x25,0x5f,0x18,0x28,0xb6,0xcc,0x27,0x28,0x38,0x25,0x98,0x39,0x4a,0x36,0xcf,0x7c,\r\n0xb1,0x92,0xae,0x1c,0x23,0xa7,0xa9,0x66,0xec,0x61,0x1f,0x6a,0xe1,0x28,0x49,0x9d,0x5f,0x88,0xe2,0x25,0x5d,0xd3,0x21,0x4b,0x3e,0x52,0xc4,0xb5,0x57,0x3f,0x24,0x03,0xf0,0xd1,0x7a,0x5b,0x2f,0xd5,0x23,0xe3,0x70,0x5d,0x0f,0x51,0x46,0x77,0xb3,0xf8,0x00,0xe1,0xbc,0xac,0x02,0x82,0x5f,0xdb,0xc0,0x15,0xb3,0xbd,0x1b,0xd4,0x55,0x4b,\r\n0xe7,0x39,0xa1,0x0f,0xe9,0x23,0x49,0xbc,0x18,0xb8,0x44,0x7c,0x45,0xe4,0xc1,0xc3,0x72,0x7a,0xe0,0x72,0xe7,0x24,0xdf,0xbf,0x46,0x99,0xc5,0xef,0xc2,0x1c,0x57,0xdb,0x83,0x8d,0xec,0x4d,0x49,0x30,0xa7,0xab,0x8e,0xdf,0xec,0x5b,0x9f,0xaf,0xfc,0xdd,0xb0,0x66,0xe2,0xc1,0x97,0x81,0x7b,0xed,0xd6,0xed,0x4b,0xe7,0x49,0x29,0xa7,0x13,\r\n0x28,0xa6,0xa7,0x7d,0x67,0x80,0xe6,0x8a,0x62,0x78,0x5f,0xb2,0x2f,0x84,0xd7,0x57,0x9c,0x5c,0xbf,0x77,0x28,0x28,0xf1,0xed,0x6d,0xc3,0x28,0x8f,0x2c,0x8f,0x40,0x37,0x4f,0xc1,0xe1,0x85,0x44,0x89,0xc4,0x09,0x4c,0xc5,0xd4,0xa5,0x43,0x2f,0x74,0x95,0xf7,0x6e,0xf8,0x78,0x20,0x58,0x2c,0x13,0x5d,0x60,0x95,0x9a,0x3e,0x4f,0x33,0x84,\r\n0xda,0xb0,0x88,0x17,0xde,0x9e,0x4e,0xf4,0x96,0xb0,0xbc,0x46,0xa0,0x6c,0x98,0xd2,0xe0,0xd6,0x88,0x8c,0x0b,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xed,0x30,0x82,0x01,0xe9,0x30,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,0x04,0x14,0x48,\r\n0x6e,0x64,0xe5,0x50,0x05,0xd3,0x82,0xaa,0x17,0x37,0x37,0x22,0xb5,0x6d,0xa8,0xca,0x75,0x02,0x95,0x30,0x19,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x0c,0x1e,0x0a,0x00,0x53,0x00,0x75,0x00,0x62,0x00,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f,0x06,0x03,0x55,\r\n0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0x72,0x2d,0x3a,0x02,0x31,0x90,0x43,0xb9,0x14,0x05,0x4e,0xe1,0xea,0xa7,0xc7,0x31,0xd1,0x23,0x89,0x34,0x30,0x5a,0x06,0x03,0x55,0x1d,0x1f,0x04,0x53,0x30,0x51,0x30,0x4f,0xa0,0x4d,0xa0,0x4b,0x86,0x49,\r\n0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x5f,\r\n0x30,0x33,0x5f,0x32,0x32,0x2e,0x63,0x72,0x6c,0x30,0x5e,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x52,0x30,0x50,0x30,0x4e,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x42,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,\r\n0x70,0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x32,0x30,0x31,0x31,0x5f,0x32,0x30,0x31,0x31,0x5f,0x30,0x33,0x5f,0x32,0x32,0x2e,0x63,0x72,0x74,0x30,0x81,0x9f,0x06,0x03,0x55,0x1d,0x20,0x04,0x81,0x97,0x30,0x81,0x94,0x30,0x81,0x91,0x06,0x09,0x2b,0x06,0x01,0x04,\r\n0x01,0x82,0x37,0x2e,0x03,0x30,0x81,0x83,0x30,0x3f,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x33,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x6f,0x70,0x73,0x2f,0x64,0x6f,0x63,0x73,0x2f,0x70,0x72,0x69,0x6d,0x61,\r\n0x72,0x79,0x63,0x70,0x73,0x2e,0x68,0x74,0x6d,0x30,0x40,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x34,0x1e,0x32,0x20,0x1d,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,0x5f,0x00,0x70,0x00,0x6f,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x79,0x00,0x5f,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x65,0x00,\r\n0x6d,0x00,0x65,0x00,0x6e,0x00,0x74,0x00,0x2e,0x20,0x1d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x67,0xf2,0x86,0xa5,0x98,0xe0,0x54,0x79,0x1a,0x2e,0xd3,0xd8,0x74,0x67,0x22,0x9b,0x0b,0x96,0x11,0xe1,0x63,0x92,0x99,0x42,0x96,0x7d,0xd2,0x79,0x0c,0x90,0xc1,0x65,0x5f,\r\n0x2e,0x2c,0x3e,0xf8,0xc3,0x72,0xd1,0x6d,0x83,0xfe,0xbe,0x3f,0xe8,0x0a,0xca,0x3b,0xbf,0x47,0xa9,0xa3,0xf3,0x69,0xdb,0x63,0xbf,0x22,0x35,0xa5,0x97,0x5d,0x65,0x84,0x90,0x7d,0x8b,0x46,0x50,0x55,0xd8,0x0c,0x92,0x7c,0xd2,0x1a,0x4b,0x1c,0xf3,0x3c,0x42,0x8b,0x52,0xd0,0xb0,0xfd,0x6b,0xe3,0x3e,0x07,0x2e,0x29,0x9b,0xe6,0x3d,0x1b,\r\n0xa5,0xd4,0xb5,0x1d,0x77,0x94,0x39,0xe2,0xe9,0x64,0xc9,0x44,0x3d,0x78,0x7a,0x23,0xf3,0x13,0x7d,0xa6,0x90,0x74,0x83,0x8d,0xf4,0xcb,0x26,0x02,0x46,0x2a,0xc2,0x8a,0x10,0xbb,0xa4,0xa9,0x05,0x0c,0x9b,0xed,0x68,0xfa,0x68,0x2e,0x95,0xa0,0x2a,0x3f,0x2a,0x6b,0x58,0x49,0x63,0x1f,0x09,0x69,0x6e,0x5a,0x98,0x96,0xe4,0x83,0xf4,0xc0,\r\n0x8f,0xf3,0x46,0x2b,0xde,0xfc,0x3b,0xd0,0xbd,0x35,0xef,0x6e,0x25,0xae,0xe5,0xaf,0x27,0xed,0xd0,0xdd,0xf3,0x0e,0xaf,0x99,0x28,0x97,0x98,0x4d,0x0e,0x3d,0x0b,0xf2,0x08,0x89,0xd6,0x1f,0xc3,0x32,0x18,0xe2,0xf0,0xc5,0x2d,0xce,0x5b,0x9e,0xb4,0x49,0x39,0x0a,0xc6,0x0a,0xc2,0xc6,0xad,0xae,0xe5,0xb2,0xd9,0xdb,0x15,0x88,0x51,0x45,\r\n0x58,0x38,0x32,0x71,0x27,0x1a,0x7f,0xb1,0xf4,0x27,0xf8,0xde,0x2c,0x3a,0x20,0x69,0x98,0xb2,0x59,0x89,0x68,0x6e,0x6f,0xa7,0xb7,0x74,0xc3,0x40,0x05,0x06,0xa6,0x01,0x2a,0x28,0x3e,0x82,0x3f,0x13,0x4d,0x66,0x0b,0xc0,0xb3,0x4d,0xf5,0xe1,0x8f,0x7f,0x1c,0x6f,0x15,0x7d,0x45,0xa7,0x76,0xe5,0x40,0x2a,0x65,0xa3,0xc3,0x5d,0x52,0x62,\r\n0x86,0xc3,0x1d,0x63,0x36,0x97,0x86,0xdf,0xda,0xf3,0xf8,0xf2,0x16,0xa1,0x9a,0x27,0xe1,0xcd,0xa5,0x97,0xd0,0xee,0x5d,0x63,0x41,0xe3,0x5b,0x07,0x9c,0x87,0x3e,0x06,0x77,0x06,0xd1,0x06,0xb1,0x75,0x1f,0x14,0xbe,0x61,0x61,0xb5,0xf0,0xdc,0xc6,0x1b,0x04,0xbe,0xdf,0x41,0xc7,0x0e,0x28,0xee,0xde,0x65,0x2f,0xec,0x97,0xf6,0xa1,0x5c,\r\n0x96,0xd8,0x00,0xd6,0xa1,0x46,0xbd,0x59,0xf3,0x97,0xa5,0x09,0x4b,0x48,0x10,0x99,0x80,0x1f,0xd0,0x00,0x29,0xc5,0xb1,0x9b,0xa5,0x3f,0x45,0x77,0x1e,0x35,0xc6,0xd2,0xa2,0xa2,0x9f,0x7a,0x7a,0x22,0xfa,0x48,0x95,0x1f,0xab,0xfb,0x47,0x23,0x80,0xf5,0x9e,0xf8,0xbf,0x6b,0xb7,0x4b,0x97,0xe2,0xeb,0x75,0x78,0x1a,0xec,0xea,0x37,0x99,\r\n0x79,0x18,0x4b,0xff,0xd6,0xb3,0x23,0x68,0x75,0xe6,0xaf,0xfa,0xfc,0x8b,0xeb,0x0b,0x80,0xea,0x69,0x3b,0xaf,0xfc,0x30,0xed,0x04,0x4c,0x8e,0xdf,0xdf,0x75,0x6d,0x63,0x91,0x3d,0xd1,0x9d,0x56,0x4e,0x4f,0xbf,0x80,0x57,0x22,0xa1,0x78,0x11,0x32,0x21,0x7a,0xef,0x41,0x0a,0xb1,0x3f,0xfb,0xa8,0xcc,0xa4,0x5d,0xc1,0xa1,0x88,0x9b,0x57,\r\n0x71,0x56,0x4e,0x48,0x45,0xc0,0x42,0xc9,0x9b,0x76,0x5b,0x0a,0x80,0x48,0x6b,0xfd,0x79,0x9f,0xc1,0xbd,0x6d,0x6d,0x6a,0xc9,0x52,0x73,0x13,0x0d,0x7a,0x50,0xcd,0x31,0x82,0x15,0x5b,0x30,0x82,0x15,0x57,0x02,0x01,0x01,0x30,0x81,0x95,0x30,0x7e,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,\r\n0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,\r\n0x69,0x6f,0x6e,0x31,0x28,0x30,0x26,0x06,0x03,0x55,0x04,0x03,0x13,0x1f,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x64,0x65,0x20,0x53,0x69,0x67,0x6e,0x69,0x6e,0x67,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x31,0x02,0x13,0x33,0x00,0x00,0x01,0x03,0x5e,0x25,0x1c,0x99,0x1f,0xa3,0x1e,0xb8,0x00,0x00,0x00,0x00,\r\n0x01,0x03,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x81,0xae,0x30,0x19,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x04,0x30,0x1c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0b,0x31,0x0e,0x30,\r\n0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x15,0x30,0x2f,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xef,0x1c,0x60,0x9d,0x4d,0xa4,0xea,0x66,0x76,0x09,0x51,0xf4,0xba,0x29,0x24,0x71,0xc9,0x1d,0x9e,0x20,0xa1,0x48,0x83,0xb3,0x95,0xb6,0x32,0x21,0x3f,0xc2,0xe1,0x1b,0x30,0x42,\r\n0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x02,0x01,0x0c,0x31,0x34,0x30,0x32,0xa0,0x14,0x80,0x12,0x00,0x4d,0x00,0x69,0x00,0x63,0x00,0x72,0x00,0x6f,0x00,0x73,0x00,0x6f,0x00,0x66,0x00,0x74,0xa1,0x1a,0x80,0x18,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,\r\n0x6f,0x6d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x04,0x82,0x01,0x00,0x40,0xe0,0xd2,0x89,0x67,0x1e,0x8d,0xfc,0xdd,0x9c,0xd3,0x57,0x55,0xe8,0x1f,0x88,0x8d,0x5a,0xb1,0x90,0xf0,0xfa,0xb0,0x85,0xec,0xba,0xfa,0x6d,0x70,0xfa,0xab,0x25,0x02,0xe2,0x31,0xef,0xa5,0xfb,0xb2,0x85,0x7a,0xf7,0x50,\r\n0xcf,0x79,0xff,0xf4,0x16,0x03,0x5f,0x86,0xa6,0xde,0xda,0x4a,0xfc,0x47,0xdd,0x21,0x41,0x45,0xda,0xcd,0x3b,0xe9,0xf3,0xf1,0xe6,0xd3,0xf8,0x9b,0xd8,0x83,0xcb,0x5f,0x4e,0x07,0x80,0x70,0x2a,0xc3,0x57,0x1e,0xa3,0x72,0xf3,0xe7,0xc7,0x90,0xd3,0x53,0xc7,0x44,0x76,0xd6,0xff,0xeb,0x2e,0x62,0xf4,0x1b,0xe2,0x09,0x62,0x8f,0x0a,0x08,\r\n0x1b,0xc9,0xc5,0x1a,0xe0,0xd3,0x20,0x65,0x22,0x84,0xc1,0x58,0x73,0xa8,0x05,0x4c,0x6c,0x2a,0xee,0x5c,0x61,0x76,0x16,0x53,0x2b,0xf2,0x1a,0xb3,0xdb,0x8c,0xd7,0x39,0x03,0x3d,0x4c,0xf6,0xbd,0x67,0x20,0x8e,0x69,0xf9,0x0e,0x50,0x18,0x08,0x70,0x7d,0x33,0xfb,0xff,0x2e,0x5c,0x62,0x2d,0x6e,0xc6,0x3e,0x5e,0xf7,0x60,0x56,0x99,0xce,\r\n0x52,0x94,0xce,0x2f,0xae,0xf8,0x50,0x19,0xe7,0x6e,0x6a,0x22,0x9b,0x27,0x70,0xfe,0xbe,0x79,0xdb,0x31,0x52,0x01,0x3f,0x4e,0xb4,0xcd,0xe8,0xf7,0x30,0xc2,0x61,0x02,0xc7,0x05,0x9b,0x0a,0x2f,0xe5,0xf5,0x0e,0x0c,0x9d,0xcb,0x2a,0xb0,0x79,0xac,0x96,0xf8,0x39,0xf0,0xb4,0xe5,0x67,0x7f,0x94,0x8a,0xac,0x77,0x9a,0xc9,0x38,0xb9,0x93,\r\n0xed,0xf5,0x33,0xc2,0x44,0x82,0x81,0x5d,0xab,0x33,0x75,0xd2,0x6e,0x43,0xf4,0x03,0xf0,0x91,0x23,0x18,0xfb,0xa1,0x82,0x12,0xe5,0x30,0x82,0x12,0xe1,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x03,0x03,0x01,0x31,0x82,0x12,0xd1,0x30,0x82,0x12,0xcd,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x07,0x02,0xa0,0x82,0x12,0xbe,\r\n0x30,0x82,0x12,0xba,0x02,0x01,0x03,0x31,0x0f,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x30,0x82,0x01,0x51,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x04,0xa0,0x82,0x01,0x40,0x04,0x82,0x01,0x3c,0x30,0x82,0x01,0x38,0x02,0x01,0x01,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,\r\n0x59,0x0a,0x03,0x01,0x30,0x31,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0x04,0x20,0x4d,0xd8,0x6e,0x4d,0x11,0x8e,0x9b,0xbb,0x96,0x9d,0x1d,0x2e,0x32,0x48,0x7c,0xb0,0xde,0x56,0x6c,0xeb,0x7e,0x1c,0xe6,0x73,0xbc,0xa1,0x52,0xc7,0xa9,0xdb,0x41,0x31,0x02,0x06,0x5c,0x3d,0xd3,0x10,0xa8,0xe5,0x18,\r\n0x13,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x34,0x31,0x38,0x34,0x30,0x33,0x36,0x2e,0x37,0x34,0x35,0x5a,0x30,0x04,0x80,0x02,0x01,0xf4,0xa0,0x81,0xd0,0xa4,0x81,0xcd,0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,\r\n0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,\r\n0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,\r\n0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0xa0,0x82,0x0e,0x3c,0x30,0x82,0x04,0xf1,0x30,0x82,0x03,0xd9,0xa0,0x03,0x02,0x01,0x02,0x02,0x13,\r\n0x33,0x00,0x00,0x00,0xee,0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,\r\n0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,\r\n0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x1e,0x17,0x0d,0x31,0x38,0x31,0x30,0x32,0x34,0x32,0x31,0x31,0x34,0x31,0x35,0x5a,0x17,0x0d,0x32,0x30,0x30,0x31,0x31,0x30,0x32,0x31,0x31,0x34,0x31,0x35,0x5a,\r\n0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,\r\n0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,\r\n0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,\r\n0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa3,0xf7,0x56,0x35,0x84,0xf3,0xdd,0x34,0xe4,0xa3,0x93,0x48,0x65,0xb2,0x92,0x69,0xb8,0xa1,\r\n0x51,0xc2,0xfb,0x51,0x1e,0x08,0xbe,0xa5,0x84,0xaf,0xf3,0x48,0x46,0x9b,0x6c,0x0c,0xdc,0x8f,0xc3,0x82,0x4b,0x12,0x11,0xb1,0x11,0x5c,0xff,0x22,0xb3,0x3e,0xc2,0xde,0xb7,0xda,0xac,0x93,0x45,0x91,0xf4,0x8a,0xff,0x12,0x16,0x6f,0xd2,0x2d,0x4f,0xc8,0x20,0x76,0x05,0x21,0x37,0x4b,0x9f,0xd4,0xfd,0x57,0x7e,0xa9,0xf4,0x91,0x21,0xa6,\r\n0xb9,0x8c,0x69,0xbf,0xe9,0x21,0xb8,0x98,0x0c,0x20,0xb7,0x5b,0xb4,0xc5,0xbf,0x4f,0xc3,0x6c,0x74,0x86,0x8d,0x10,0xfc,0x68,0xfe,0x8d,0x0c,0x85,0x64,0x5b,0xf0,0x23,0x2d,0xda,0x24,0x0b,0x0c,0x50,0xb4,0x8c,0x8f,0x67,0x02,0x0d,0x97,0x37,0xb4,0x1f,0x1d,0xaf,0x8b,0xcd,0xd5,0x87,0x8c,0x1e,0x70,0xd3,0xee,0xdf,0x22,0xc9,0xfe,0x54,\r\n0xac,0x57,0xf4,0xbe,0xcd,0x55,0x12,0xfb,0x9b,0xa0,0x29,0xe1,0xcb,0x56,0x02,0x2e,0x4d,0xcb,0x72,0x2a,0xbf,0x4c,0x8c,0x14,0x9a,0x84,0x2a,0x25,0xdf,0x11,0xce,0x80,0x81,0xea,0x15,0x60,0x62,0x57,0xa2,0x0e,0x1a,0x09,0x74,0xa5,0x18,0xad,0xe9,0x9a,0x88,0x56,0x2c,0xcd,0xaf,0xd2,0x69,0x5d,0x2f,0xf1,0x88,0x1a,0x96,0x11,0x38,0x51,\r\n0x0e,0x97,0xbd,0xdd,0x6c,0x11,0x52,0xe8,0x32,0xa5,0x95,0x17,0xa4,0x27,0x49,0xa9,0x7e,0x38,0x1a,0x84,0x1d,0xe8,0xe5,0xe7,0xcd,0x9f,0x6c,0x9c,0x2f,0x44,0x65,0x13,0x5d,0x89,0x5a,0x80,0x3d,0x3c,0x5a,0x37,0x7e,0xfd,0x5f,0xc6,0xab,0x2d,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0x1b,0x30,0x82,0x01,0x17,0x30,0x1d,0x06,0x03,0x55,\r\n0x1d,0x0e,0x04,0x16,0x04,0x14,0x26,0x77,0xcd,0x38,0x2b,0x45,0x7e,0xbd,0xd3,0x33,0x65,0x28,0xf7,0xcf,0xe3,0x68,0xf2,0x0e,0x65,0x4d,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xd5,0x63,0x3a,0x5c,0x8a,0x31,0x90,0xf3,0x43,0x7b,0x7c,0x46,0x1b,0xc5,0x33,0x68,0x5a,0x85,0x6d,0x55,0x30,0x56,0x06,0x03,0x55,\r\n0x1d,0x1f,0x04,0x4f,0x30,0x4d,0x30,0x4b,0xa0,0x49,0xa0,0x47,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x54,0x69,0x6d,0x53,0x74,\r\n0x61,0x50,0x43,0x41,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x37,0x2d,0x30,0x31,0x2e,0x63,0x72,0x6c,0x30,0x5a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x4e,0x30,0x4c,0x30,0x4a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,\r\n0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x54,0x69,0x6d,0x53,0x74,0x61,0x50,0x43,0x41,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x37,0x2d,0x30,0x31,0x2e,0x63,0x72,0x74,0x30,0x0c,0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x02,0x30,0x00,0x30,0x13,0x06,\r\n0x03,0x55,0x1d,0x25,0x04,0x0c,0x30,0x0a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x03,0x08,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x01,0x01,0x00,0x91,0x3f,0xe2,0xd1,0x15,0x1b,0x20,0x21,0x1c,0xf2,0x7b,0xbc,0xe4,0x9b,0x59,0x03,0xdf,0x8c,0x9a,0x5c,0x62,0xc4,0x1e,0xc1,0xc5,0xd3,\r\n0x4e,0x96,0x21,0x60,0xf5,0x03,0xe5,0xcf,0x83,0x98,0x94,0x27,0x4d,0x5d,0xf8,0x1a,0x4e,0xec,0xa4,0x59,0xe3,0x23,0x87,0x2c,0x2c,0xc8,0x72,0xf8,0xc4,0x26,0xc3,0x73,0x06,0x5a,0xa7,0xff,0xed,0xfe,0xee,0xa1,0x8a,0x27,0xc5,0x65,0x68,0xc8,0xf6,0x16,0x8f,0x5a,0x4e,0x72,0xe5,0x37,0xf1,0x91,0x81,0xfc,0x18,0xe4,0x6e,0x2c,0xcd,0x94,\r\n0x99,0xb5,0xda,0x60,0xa0,0x60,0x5f,0x76,0x3c,0x64,0x46,0x45,0xff,0x19,0x16,0x0c,0x40,0x25,0x7f,0x67,0xbb,0x2f,0x3a,0xfc,0x1f,0xbf,0x18,0x6c,0x68,0x90,0x8c,0xad,0x9a,0x23,0x6f,0xfd,0xa9,0xa6,0x3e,0x29,0xb2,0x57,0x1e,0xaa,0x83,0x8c,0xa3,0x1a,0xb5,0x95,0xe3,0xd7,0x0b,0x78,0xc9,0xa4,0xd1,0x0b,0x1c,0xbb,0xcd,0xc5,0xcf,0xe3,\r\n0x13,0x45,0x57,0x43,0x0f,0x1f,0xc1,0x17,0x86,0x26,0x71,0x2f,0xad,0x27,0x6e,0x11,0xf3,0xa6,0xb3,0x72,0x5d,0x90,0xa3,0xdd,0xa0,0x2b,0x74,0x87,0xf7,0x77,0x26,0xd9,0x06,0x8f,0x5f,0x4d,0xfd,0x1e,0x0f,0x7b,0x0c,0x34,0xf0,0x25,0x54,0x21,0xe4,0x6e,0x4b,0x1f,0xab,0x7d,0x9d,0x9a,0x01,0x80,0x02,0xdf,0xf6,0xa9,0xa6,0x19,0xf9,0x24,\r\n0xd2,0xa8,0x14,0x2e,0x38,0xfa,0x21,0x59,0x33,0xfe,0x9b,0x67,0xca,0x10,0x77,0x4f,0x66,0x4e,0x7c,0x97,0xb7,0x04,0x5a,0xa5,0x04,0xb3,0x56,0x39,0xb6,0x2f,0x54,0x21,0xe2,0x5c,0xc5,0x01,0xa8,0x46,0x30,0x82,0x06,0x71,0x30,0x82,0x04,0x59,0xa0,0x03,0x02,0x01,0x02,0x02,0x0a,0x61,0x09,0x81,0x2a,0x00,0x00,0x00,0x00,0x00,0x02,0x30,\r\n0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x30,0x81,0x88,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,\r\n0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x32,0x30,0x30,0x06,0x03,0x55,0x04,0x03,0x13,0x29,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x52,0x6f,0x6f,0x74,0x20,0x43,\r\n0x65,0x72,0x74,0x69,0x66,0x69,0x63,0x61,0x74,0x65,0x20,0x41,0x75,0x74,0x68,0x6f,0x72,0x69,0x74,0x79,0x20,0x32,0x30,0x31,0x30,0x30,0x1e,0x17,0x0d,0x31,0x30,0x30,0x37,0x30,0x31,0x32,0x31,0x33,0x36,0x35,0x35,0x5a,0x17,0x0d,0x32,0x35,0x30,0x37,0x30,0x31,0x32,0x31,0x34,0x36,0x35,0x35,0x5a,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,\r\n0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,\r\n0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x82,0x01,0x22,0x30,0x0d,0x06,0x09,0x2a,\r\n0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x01,0x05,0x00,0x03,0x82,0x01,0x0f,0x00,0x30,0x82,0x01,0x0a,0x02,0x82,0x01,0x01,0x00,0xa9,0x1d,0x0d,0xbc,0x77,0x11,0x8a,0x3a,0x20,0xec,0xfc,0x13,0x97,0xf5,0xfa,0x7f,0x69,0x94,0x6b,0x74,0x54,0x10,0xd5,0xa5,0x0a,0x00,0x82,0x85,0xfb,0xed,0x7c,0x68,0x4b,0x2c,0x5f,0xc5,0xc3,0xe5,0x61,0xc2,\r\n0x76,0xb7,0x3e,0x66,0x2b,0x5b,0xf0,0x15,0x53,0x27,0x04,0x31,0x1f,0x41,0x1b,0x1a,0x95,0x1d,0xce,0x09,0x13,0x8e,0x7c,0x61,0x30,0x59,0xb1,0x30,0x44,0x0f,0xf1,0x60,0x88,0x84,0x54,0x43,0x0c,0xd7,0x4d,0xb8,0x38,0x08,0xb3,0x42,0xdd,0x93,0xac,0xd6,0x73,0x30,0x57,0x26,0x82,0xa3,0x45,0x0d,0xd0,0xea,0xf5,0x47,0x81,0xcd,0xbf,0x24,\r\n0x60,0x32,0x58,0x60,0x46,0xf2,0x58,0x47,0x86,0x32,0x84,0x1e,0x74,0x61,0x67,0x91,0x5f,0x81,0x54,0xb1,0xcf,0x93,0x4c,0x92,0xc1,0xc4,0xa6,0x5d,0xd1,0x61,0x13,0x6e,0x28,0xc6,0x1a,0xf9,0x86,0x80,0xbb,0xdf,0x61,0xfc,0x46,0xc1,0x27,0x1d,0x24,0x67,0x12,0x72,0x1a,0x21,0x8a,0xaf,0x4b,0x64,0x89,0x50,0x62,0xb1,0x5d,0xfd,0x77,0x1f,\r\n0x3d,0xf0,0x57,0x75,0xac,0xbd,0x8a,0x42,0x4d,0x40,0x51,0xd1,0x0f,0x9c,0x06,0x3e,0x67,0x7f,0xf5,0x66,0xc0,0x03,0x96,0x44,0x7e,0xef,0xd0,0x4b,0xfd,0x6e,0xe5,0x9a,0xca,0xb1,0xa8,0xf2,0x7a,0x2a,0x0a,0x31,0xf0,0xda,0x4e,0x06,0x91,0xb6,0x88,0x08,0x35,0xe8,0x78,0x1c,0xb0,0xe9,0x99,0xcd,0x3c,0xe7,0x2f,0x44,0xba,0xa7,0xf4,0xdc,\r\n0x64,0xbd,0xa4,0x01,0xc1,0x20,0x09,0x93,0x78,0xcd,0xfc,0xbc,0xc0,0xc9,0x44,0x5d,0x5e,0x16,0x9c,0x01,0x05,0x4f,0x22,0x4d,0x02,0x03,0x01,0x00,0x01,0xa3,0x82,0x01,0xe6,0x30,0x82,0x01,0xe2,0x30,0x10,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x15,0x01,0x04,0x03,0x02,0x01,0x00,0x30,0x1d,0x06,0x03,0x55,0x1d,0x0e,0x04,0x16,\r\n0x04,0x14,0xd5,0x63,0x3a,0x5c,0x8a,0x31,0x90,0xf3,0x43,0x7b,0x7c,0x46,0x1b,0xc5,0x33,0x68,0x5a,0x85,0x6d,0x55,0x30,0x19,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,0x37,0x14,0x02,0x04,0x0c,0x1e,0x0a,0x00,0x53,0x00,0x75,0x00,0x62,0x00,0x43,0x00,0x41,0x30,0x0b,0x06,0x03,0x55,0x1d,0x0f,0x04,0x04,0x03,0x02,0x01,0x86,0x30,0x0f,\r\n0x06,0x03,0x55,0x1d,0x13,0x01,0x01,0xff,0x04,0x05,0x30,0x03,0x01,0x01,0xff,0x30,0x1f,0x06,0x03,0x55,0x1d,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xd5,0xf6,0x56,0xcb,0x8f,0xe8,0xa2,0x5c,0x62,0x68,0xd1,0x3d,0x94,0x90,0x5b,0xd7,0xce,0x9a,0x18,0xc4,0x30,0x56,0x06,0x03,0x55,0x1d,0x1f,0x04,0x4f,0x30,0x4d,0x30,0x4b,0xa0,0x49,0xa0,\r\n0x47,0x86,0x45,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x63,0x72,0x6c,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,0x6b,0x69,0x2f,0x63,0x72,0x6c,0x2f,0x70,0x72,0x6f,0x64,0x75,0x63,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,\r\n0x36,0x2d,0x32,0x33,0x2e,0x63,0x72,0x6c,0x30,0x5a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x01,0x01,0x04,0x4e,0x30,0x4c,0x30,0x4a,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x02,0x86,0x3e,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x70,\r\n0x6b,0x69,0x2f,0x63,0x65,0x72,0x74,0x73,0x2f,0x4d,0x69,0x63,0x52,0x6f,0x6f,0x43,0x65,0x72,0x41,0x75,0x74,0x5f,0x32,0x30,0x31,0x30,0x2d,0x30,0x36,0x2d,0x32,0x33,0x2e,0x63,0x72,0x74,0x30,0x81,0xa0,0x06,0x03,0x55,0x1d,0x20,0x01,0x01,0xff,0x04,0x81,0x95,0x30,0x81,0x92,0x30,0x81,0x8f,0x06,0x09,0x2b,0x06,0x01,0x04,0x01,0x82,\r\n0x37,0x2e,0x03,0x30,0x81,0x81,0x30,0x3d,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x01,0x16,0x31,0x68,0x74,0x74,0x70,0x3a,0x2f,0x2f,0x77,0x77,0x77,0x2e,0x6d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x2e,0x63,0x6f,0x6d,0x2f,0x50,0x4b,0x49,0x2f,0x64,0x6f,0x63,0x73,0x2f,0x43,0x50,0x53,0x2f,0x64,0x65,0x66,0x61,0x75,0x6c,\r\n0x74,0x2e,0x68,0x74,0x6d,0x30,0x40,0x06,0x08,0x2b,0x06,0x01,0x05,0x05,0x07,0x02,0x02,0x30,0x34,0x1e,0x32,0x20,0x1d,0x00,0x4c,0x00,0x65,0x00,0x67,0x00,0x61,0x00,0x6c,0x00,0x5f,0x00,0x50,0x00,0x6f,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x79,0x00,0x5f,0x00,0x53,0x00,0x74,0x00,0x61,0x00,0x74,0x00,0x65,0x00,0x6d,0x00,0x65,0x00,\r\n0x6e,0x00,0x74,0x00,0x2e,0x20,0x1d,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x82,0x02,0x01,0x00,0x07,0xe6,0x88,0x51,0x0d,0xe2,0xc6,0xe0,0x98,0x3f,0x81,0x71,0x03,0x3d,0x9d,0xa3,0xa1,0x21,0x6f,0xb3,0xeb,0xa6,0xcc,0xf5,0x31,0xbe,0xcf,0x05,0xe2,0xa9,0xfe,0xfa,0x57,0x6d,0x19,0x30,0xb3,\r\n0xc2,0xc5,0x66,0xc9,0x6a,0xdf,0xf5,0xe7,0xf0,0x78,0xbd,0xc7,0xa8,0x9e,0x25,0xe3,0xf9,0xbc,0xed,0x6b,0x54,0x57,0x08,0x2b,0x51,0x82,0x44,0x12,0xfb,0xb9,0x53,0x8c,0xcc,0xf4,0x60,0x12,0x8a,0x76,0xcc,0x40,0x40,0x41,0x9b,0xdc,0x5c,0x17,0xff,0x5c,0xf9,0x5e,0x17,0x35,0x98,0x24,0x56,0x4b,0x74,0xef,0x42,0x10,0xc8,0xaf,0xbf,0x7f,\r\n0xc6,0x7f,0xf2,0x37,0x7d,0x5a,0x3f,0x1c,0xf2,0x99,0x79,0x4a,0x91,0x52,0x00,0xaf,0x38,0x0f,0x17,0xf5,0x2f,0x79,0x81,0x65,0xd9,0xa9,0xb5,0x6b,0xe4,0xc7,0xce,0xf6,0xca,0x7a,0x00,0x6f,0x4b,0x30,0x44,0x24,0x22,0x3c,0xcf,0xed,0x03,0xa5,0x96,0x8f,0x59,0x29,0xbc,0xb6,0xfd,0x04,0xe1,0x70,0x9f,0x32,0x4a,0x27,0xfd,0x55,0xaf,0x2f,\r\n0xfe,0xb6,0xe5,0x8e,0x33,0xbb,0x62,0x5f,0x9a,0xdb,0x57,0x40,0xe9,0xf1,0xce,0x99,0x66,0x90,0x8c,0xff,0x6a,0x62,0x7f,0xdd,0xc5,0x4a,0x0b,0x91,0x26,0xe2,0x39,0xec,0x19,0x4a,0x71,0x63,0x9d,0x7b,0x21,0x6d,0xc3,0x9c,0xa3,0xa2,0x3c,0xfa,0x7f,0x7d,0x96,0x6a,0x90,0x78,0xa6,0x6d,0xd2,0xe1,0x9c,0xf9,0x1d,0xfc,0x38,0xd8,0x94,0xf4,\r\n0xc6,0xa5,0x0a,0x96,0x86,0xa4,0xbd,0x9e,0x1a,0xae,0x04,0x42,0x83,0xb8,0xb5,0x80,0x9b,0x22,0x38,0x20,0xb5,0x25,0xe5,0x64,0xec,0xf7,0xf4,0xbf,0x7e,0x63,0x59,0x25,0x0f,0x7a,0x2e,0x39,0x57,0x76,0xa2,0x71,0xaa,0x06,0x8a,0x0f,0x89,0x16,0xba,0x61,0xa7,0x11,0xcb,0x9a,0xd8,0x0e,0x47,0x9a,0x80,0xc5,0xd0,0xcd,0xa7,0xd0,0xef,0x7d,\r\n0x83,0xf0,0xe1,0x3b,0x71,0x09,0xdf,0x5d,0x74,0x98,0x22,0x08,0x61,0xda,0xb0,0x50,0x1e,0x6f,0xbd,0xf1,0xe1,0x00,0xdf,0xe7,0x31,0x07,0xa4,0x93,0x3a,0xf7,0x65,0x47,0x78,0xe8,0xf8,0xa8,0x48,0xab,0xf7,0xde,0x72,0x7e,0x61,0x6b,0x6f,0x77,0xa9,0x81,0xcb,0xa7,0x09,0xac,0x39,0xbb,0xec,0xc6,0xcb,0xd8,0x82,0xb4,0x72,0xcd,0x1d,0xf4,\r\n0xb8,0x85,0x01,0x1e,0x80,0xfb,0x1b,0x89,0x2a,0x54,0x39,0xb2,0x5b,0xda,0xc8,0x0d,0x55,0x99,0x7a,0x87,0x73,0x3b,0x08,0xe6,0x98,0x2d,0xea,0x8d,0xe0,0x33,0x2e,0x12,0x29,0xf5,0xc0,0x2f,0x54,0x27,0x21,0xf7,0xc8,0xac,0x4e,0xda,0x28,0xb8,0xb1,0xa9,0xdb,0x96,0xb2,0xa7,0x42,0xa2,0xc9,0xcf,0x19,0x41,0x4d,0xe0,0x86,0xf9,0x2a,0x9a,\r\n0xa3,0x11,0x66,0x30,0xd3,0xbb,0x74,0x32,0x4b,0xdf,0x63,0x7b,0xf5,0x99,0x8a,0x2f,0x1b,0xc7,0x21,0xaf,0x59,0xb5,0xae,0xdc,0x44,0x3c,0x97,0x50,0x71,0xd7,0xa1,0xd2,0xc5,0x55,0xe3,0x69,0xde,0x57,0xc1,0xd1,0xde,0x30,0xc0,0xfd,0xcc,0xe6,0x4d,0xfb,0x0d,0xbf,0x5d,0x4f,0xe9,0x9d,0x1e,0x19,0x38,0x2f,0xbc,0xcf,0x58,0x05,0x2e,0xef,\r\n0x0d,0xa0,0x50,0x35,0xda,0xef,0x09,0x27,0x1c,0xd5,0xb3,0x7e,0x35,0x1e,0x08,0xba,0xda,0x36,0xdb,0xd3,0x5f,0x8f,0xde,0x74,0x88,0x49,0x12,0xa1,0x82,0x02,0xce,0x30,0x82,0x02,0x37,0x02,0x01,0x01,0x30,0x81,0xf8,0xa1,0x81,0xd0,0xa4,0x81,0xcd,0x30,0x81,0xca,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,\r\n0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,\r\n0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x0b,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x41,0x6d,0x65,0x72,0x69,0x63,0x61,0x20,0x4f,0x70,0x65,0x72,0x61,0x74,0x69,0x6f,0x6e,0x73,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x0b,0x13,0x1d,0x54,0x68,0x61,0x6c,0x65,0x73,0x20,0x54,\r\n0x53,0x53,0x20,0x45,0x53,0x4e,0x3a,0x34,0x39,0x42,0x43,0x2d,0x45,0x33,0x37,0x41,0x2d,0x32,0x33,0x33,0x43,0x31,0x25,0x30,0x23,0x06,0x03,0x55,0x04,0x03,0x13,0x1c,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x53,0x65,0x72,0x76,0x69,0x63,0x65,0xa2,0x23,0x0a,0x01,\r\n0x01,0x30,0x07,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x03,0x15,0x00,0x38,0x3d,0xac,0x26,0x41,0x22,0x8f,0x3c,0xc6,0xc6,0x55,0xda,0x06,0x0a,0xf9,0x32,0x6d,0x93,0x2e,0x69,0xa0,0x81,0x83,0x30,0x81,0x80,0xa4,0x7e,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,\r\n0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,\r\n0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x02,0x05,0x00,0xdf,0xf4,0x2e,0xe3,0x30,0x22,0x18,\r\n0x0f,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x34,0x32,0x30,0x33,0x32,0x33,0x35,0x5a,0x18,0x0f,0x32,0x30,0x31,0x39,0x30,0x31,0x32,0x35,0x32,0x30,0x33,0x32,0x33,0x35,0x5a,0x30,0x77,0x30,0x3d,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,0x04,0x01,0x31,0x2f,0x30,0x2d,0x30,0x0a,0x02,0x05,0x00,0xdf,0xf4,0x2e,0xe3,0x02,0x01,\r\n0x00,0x30,0x0a,0x02,0x01,0x00,0x02,0x02,0x19,0xf6,0x02,0x01,0xff,0x30,0x07,0x02,0x01,0x00,0x02,0x02,0x11,0x74,0x30,0x0a,0x02,0x05,0x00,0xdf,0xf5,0x80,0x63,0x02,0x01,0x00,0x30,0x36,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,0x04,0x02,0x31,0x28,0x30,0x26,0x30,0x0c,0x06,0x0a,0x2b,0x06,0x01,0x04,0x01,0x84,0x59,0x0a,\r\n0x03,0x02,0xa0,0x0a,0x30,0x08,0x02,0x01,0x00,0x02,0x03,0x07,0xa1,0x20,0xa1,0x0a,0x30,0x08,0x02,0x01,0x00,0x02,0x03,0x01,0x86,0xa0,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x05,0x05,0x00,0x03,0x81,0x81,0x00,0x79,0x78,0x9e,0x72,0x3a,0x6f,0xf0,0x0e,0x50,0x48,0xa6,0x78,0x90,0xb3,0x7b,0xd8,0xf9,0xd8,0xeb,\r\n0x34,0x2d,0x2b,0x30,0xd5,0x86,0xfa,0x8c,0xc2,0x8e,0x06,0xad,0x31,0xb1,0xf1,0xfa,0x4b,0x6b,0xce,0xd8,0x44,0x4c,0xc7,0xc5,0xb0,0xa0,0x86,0x94,0x97,0x10,0x01,0x25,0xd1,0x29,0x21,0x2b,0x6c,0x1d,0x67,0x37,0xd3,0x15,0x81,0x32,0x40,0xa9,0x7f,0x2e,0x6b,0x4d,0x0d,0xcb,0xc9,0xa0,0x05,0xed,0x54,0x89,0x0a,0x8c,0x7f,0x0d,0x52,0x1a,\r\n0x26,0xda,0x26,0x7f,0x8e,0xa4,0xc2,0x49,0xba,0x54,0x51,0xd1,0x1e,0xfc,0xf2,0x66,0xbf,0x46,0xa5,0xde,0x59,0x55,0x9a,0xbc,0xea,0xca,0xf7,0xf7,0xf9,0x7b,0x77,0x66,0x86,0x03,0xf0,0xf2,0xb8,0x53,0x28,0xa3,0x4a,0x0e,0xbe,0xf9,0x71,0x31,0x82,0x03,0x0d,0x30,0x82,0x03,0x09,0x02,0x01,0x01,0x30,0x81,0x93,0x30,0x7c,0x31,0x0b,0x30,\r\n0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,\r\n0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x02,0x13,0x33,0x00,0x00,0x00,0xee,\r\n0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x0d,0x06,0x09,0x60,0x86,0x48,0x01,0x65,0x03,0x04,0x02,0x01,0x05,0x00,0xa0,0x82,0x01,0x4a,0x30,0x1a,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x03,0x31,0x0d,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x01,0x04,0x30,0x2f,0x06,\r\n0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x04,0x31,0x22,0x04,0x20,0xa9,0xb8,0x68,0x0f,0x5b,0x53,0xc4,0x53,0x8f,0x02,0x31,0x6a,0xa0,0x8b,0xf7,0x6b,0x41,0xea,0x53,0x11,0xcb,0xc2,0x98,0xe8,0xce,0x11,0x08,0xe6,0x0c,0xe8,0x14,0xd4,0x30,0x81,0xfa,0x06,0x0b,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x09,0x10,0x02,0x2f,0x31,0x81,\r\n0xea,0x30,0x81,0xe7,0x30,0x81,0xe4,0x30,0x81,0xbd,0x04,0x20,0x3f,0xae,0xc6,0x22,0xb7,0x3e,0xfb,0xf8,0xb4,0xb1,0x77,0x93,0x35,0x3e,0x92,0x51,0x0a,0x9f,0x0b,0x21,0x01,0xf2,0x99,0x2b,0x12,0x0c,0xd1,0x23,0x2f,0x10,0x2e,0xc3,0x30,0x81,0x98,0x30,0x81,0x80,0xa4,0x7e,0x30,0x7c,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,\r\n0x02,0x55,0x53,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x08,0x13,0x0a,0x57,0x61,0x73,0x68,0x69,0x6e,0x67,0x74,0x6f,0x6e,0x31,0x10,0x30,0x0e,0x06,0x03,0x55,0x04,0x07,0x13,0x07,0x52,0x65,0x64,0x6d,0x6f,0x6e,0x64,0x31,0x1e,0x30,0x1c,0x06,0x03,0x55,0x04,0x0a,0x13,0x15,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x43,\r\n0x6f,0x72,0x70,0x6f,0x72,0x61,0x74,0x69,0x6f,0x6e,0x31,0x26,0x30,0x24,0x06,0x03,0x55,0x04,0x03,0x13,0x1d,0x4d,0x69,0x63,0x72,0x6f,0x73,0x6f,0x66,0x74,0x20,0x54,0x69,0x6d,0x65,0x2d,0x53,0x74,0x61,0x6d,0x70,0x20,0x50,0x43,0x41,0x20,0x32,0x30,0x31,0x30,0x02,0x13,0x33,0x00,0x00,0x00,0xee,0xf8,0xc5,0xf5,0x36,0x3b,0x81,0x1c,\r\n0x8c,0x00,0x00,0x00,0x00,0x00,0xee,0x30,0x22,0x04,0x20,0x14,0xc2,0x54,0x4f,0xba,0xe2,0x1c,0xdf,0x0c,0x3b,0x9d,0xfc,0xbc,0x5c,0xd8,0xb1,0x97,0xa6,0x39,0x9a,0x30,0x96,0xf8,0xa5,0xf4,0xb2,0x11,0xd6,0x59,0xc6,0x50,0xdd,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x04,0x82,0x01,0x00,0x4e,0x09,\r\n0xa9,0x0d,0x51,0x40,0x35,0x45,0x38,0x88,0x5f,0x87,0xc6,0xaf,0x4a,0xd8,0x8c,0x36,0x34,0xd4,0x98,0x9b,0x5b,0xfb,0xc0,0xc0,0x85,0xd8,0x62,0x7e,0x9d,0x36,0x78,0x97,0xc6,0x77,0x76,0x2c,0xfb,0xf7,0x48,0x80,0x3e,0x93,0x18,0x95,0x1d,0xda,0xab,0x0a,0x0a,0xd1,0x9d,0xdb,0xcd,0xb7,0x67,0x8c,0x91,0xa8,0xdd,0x33,0x8d,0x55,0x9e,0xa0,\r\n0x25,0xdb,0x26,0x6d,0x71,0xea,0xb6,0x99,0x10,0xce,0xa6,0x7a,0xfe,0x58,0x2e,0xb0,0x19,0xbd,0xc4,0x92,0xa4,0xa4,0x2b,0x56,0x85,0x54,0x02,0xdc,0x8d,0xe5,0x7b,0x23,0xcd,0xd7,0xee,0x49,0xcb,0x8d,0x7d,0x2f,0x80,0x9d,0x48,0x77,0xa2,0xe1,0xcc,0xb9,0x66,0x09,0xbd,0x3b,0x43,0x88,0x4d,0x7d,0xbc,0x83,0xff,0xfc,0xbf,0x27,0x4d,0x0c,\r\n0xc7,0x06,0xbb,0x68,0x0d,0x37,0xcc,0xa0,0x0f,0xda,0xe0,0xf5,0xcc,0x8c,0xd2,0x24,0x97,0xe4,0x6c,0x02,0x83,0xb3,0xbd,0x0e,0x50,0xdd,0x2f,0x0c,0x05,0xee,0xe7,0xda,0x9b,0x11,0xc4,0x9d,0x6e,0x67,0x8c,0x29,0x9b,0x4e,0xef,0x33,0xe7,0x31,0x20,0x9e,0xdf,0x47,0xdd,0x6a,0xea,0x7b,0xac,0x08,0x0f,0x83,0x04,0x2c,0xee,0x13,0x35,0x69,\r\n0x90,0xb4,0x8a,0xbe,0xc5,0x5e,0x5e,0x29,0x29,0x09,0xc0,0x1b,0xa7,0x68,0x47,0x29,0x21,0x91,0x3b,0xdf,0xa3,0x2f,0x81,0x42,0x88,0x50,0x90,0x72,0x29,0x4f,0x24,0xc5,0x03,0x45,0x2e,0xa2,0x6a,0x10,0xf4,0xd1,0x0b,0x23,0xbd,0xbf,0x92,0x8c,0xc8,0x74,0x6e,0x35,0xcd,0x74,0x9b,0x38,0xdf,0x13,0xd2,0x2a,0xc5,0xfa,0x30,0xab,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x00,0x02,0x1a,0x02,0x22,0x00,0x02,0x00,0x57,0x00,0x00,0x02,0x43,0x00,0x01,0x02,0x44,0x02,0x56,0x00,0x03,0x02,0x57,0x04,0x61,0x00,0x01,0x04,0x62,0x04,0xaf,0x00,0x03,0x04,0xb0,0x05,0xfc,0x00,0x01,0x05,0xfd,0x06,0x02,0x00,0x03,0x06,0x03,0x06,0x65,0x00,0x01,0x06,0x66,0x06,0x72,0x00,0x03,\r\n0x06,0x73,0x06,0x9a,0x00,0x01,0x06,0x9b,0x06,0x9b,0x00,0x03,0x06,0x9c,0x06,0xad,0x00,0x01,0x06,0xae,0x06,0xd9,0x00,0x02,0x06,0xda,0x06,0xda,0x00,0x03,0x06,0xdb,0x07,0x38,0x00,0x02,0x07,0x39,0x07,0x3d,0x00,0x03,0x07,0x3e,0x07,0x54,0x00,0x01,0x07,0x55,0x07,0x5f,0x00,0x03,0x07,0x60,0x07,0xec,0x00,0x01,0x07,0xed,0x07,0xf0,\r\n0x00,0x03,0x07,0xf1,0x08,0x4b,0x00,0x01,0x08,0x4c,0x08,0x4f,0x00,0x03,0x08,0x50,0x09,0x2b,0x00,0x01,0x09,0x2c,0x09,0x33,0x00,0x03,0x09,0x34,0x09,0x36,0x00,0x01,0x09,0x37,0x09,0x37,0x00,0x03,0x09,0x38,0x09,0x70,0x00,0x01,0x09,0x71,0x09,0x71,0x00,0x02,0x09,0x72,0x09,0x72,0x00,0x01,0x09,0x73,0x09,0x75,0x00,0x03,0x09,0x76,\r\n0x09,0x76,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x03,0x09,0x78,0x09,0x7d,0x00,0x01,0x09,0x7e,0x09,0x7f,0x00,0x03,0x09,0x80,0x0a,0x0e,0x00,0x01,0x0a,0x0f,0x0a,0x13,0x00,0x03,0x0a,0x14,0x0a,0x15,0x00,0x01,0x0a,0x16,0x0a,0x1f,0x00,0x03,0x0a,0x20,0x0a,0x20,0x00,0x01,0x0a,0x21,0x0a,0x23,0x00,0x03,0x0a,0x24,0x0a,0x4a,0x00,0x01,\r\n0x0a,0x4b,0x0a,0x53,0x00,0x03,0x0a,0x54,0x0a,0x5b,0x00,0x01,0x0a,0x5c,0x0a,0x5e,0x00,0x03,0x0a,0x5f,0x0a,0x62,0x00,0x01,0x0a,0x63,0x0a,0x64,0x00,0x02,0x0a,0x65,0x0a,0x69,0x00,0x03,0x0a,0x6a,0x0a,0x6b,0x00,0x01,0x0a,0x6c,0x0a,0x71,0x00,0x03,0x0a,0x72,0x0a,0xda,0x00,0x01,0x0a,0xdb,0x0a,0xe3,0x00,0x03,0x0a,0xe4,0x0b,0x52,\r\n0x00,0x01,0x0b,0x53,0x0b,0x5f,0x00,0x03,0x0b,0x60,0x0b,0x60,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x03,0x0b,0x62,0x0b,0x62,0x00,0x01,0x0b,0x63,0x0b,0x64,0x00,0x03,0x0b,0x65,0x0b,0x65,0x00,0x01,0x0b,0x66,0x0b,0x67,0x00,0x03,0x0b,0x68,0x0b,0xb8,0x00,0x01,0x0b,0xb9,0x0b,0xb9,0x00,0x03,0x0b,0xba,0x0b,0xbe,0x00,0x01,0x0b,0xbf,\r\n0x0b,0xde,0x00,0x03,0x0b,0xdf,0x0b,0xe0,0x00,0x01,0x0b,0xe1,0x0b,0xe1,0x00,0x03,0x0b,0xe2,0x0e,0x19,0x00,0x01,0x0e,0x1a,0x0e,0x1e,0x00,0x03,0x0e,0x1f,0x0e,0x61,0x00,0x01,0x0e,0x62,0x0e,0x6c,0x00,0x03,0x0e,0x6d,0x0e,0xea,0x00,0x01,0x0e,0xeb,0x0e,0xeb,0x00,0x03,0x0e,0xec,0x12,0x58,0x00,0x01,0x12,0x59,0x12,0x5e,0x00,0x03,\r\n0x12,0x5f,0x13,0x29,0x00,0x01,0x13,0x2a,0x13,0x44,0x00,0x03,0x13,0x45,0x13,0xd8,0x00,0x01,0x13,0xd9,0x13,0xe9,0x00,0x03,0x13,0xea,0x13,0xee,0x00,0x01,0x13,0xef,0x13,0xf2,0x00,0x02,0x13,0xf3,0x14,0x16,0x00,0x01,0x14,0x17,0x14,0x17,0x00,0x03,0x14,0x18,0x14,0x5c,0x00,0x01,0x14,0x5d,0x14,0x6a,0x00,0x03,0x14,0x6b,0x14,0x6b,\r\n0x00,0x01,0x14,0x6c,0x14,0x6c,0x00,0x03,0x14,0x6d,0x14,0x96,0x00,0x01,0x14,0x97,0x14,0x98,0x00,0x02,0x14,0x99,0x14,0xdf,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x33,0x02,0x44,0x02,0x44,0x00,0x02,0x02,0x45,0x02,0x45,0x00,0x04,0x02,0x46,0x02,0x47,0x00,0x02,0x04,0x62,0x04,0x73,0x00,0x02,0x04,0x75,\r\n0x04,0x78,0x00,0x04,0x04,0x79,0x04,0x79,0x00,0x02,0x04,0x7b,0x04,0x7f,0x00,0x04,0x04,0x82,0x04,0x84,0x00,0x04,0x04,0x87,0x04,0x91,0x00,0x04,0x04,0x97,0x04,0x9a,0x00,0x04,0x04,0x9b,0x04,0x9d,0x00,0x02,0x04,0xa0,0x04,0xa2,0x00,0x02,0x04,0xa3,0x04,0xa3,0x00,0x04,0x04,0xa4,0x04,0xa4,0x00,0x02,0x04,0xa5,0x04,0xa7,0x00,0x04,\r\n0x04,0xa8,0x04,0xaa,0x00,0x02,0x04,0xab,0x04,0xac,0x00,0x04,0x05,0xfd,0x06,0x00,0x00,0x02,0x06,0x66,0x06,0x72,0x00,0x02,0x07,0x3a,0x07,0x3d,0x00,0x03,0x07,0x55,0x07,0x57,0x00,0x02,0x07,0x58,0x07,0x5b,0x00,0x04,0x07,0x5c,0x07,0x5c,0x00,0x02,0x07,0xed,0x07,0xee,0x00,0x04,0x07,0xef,0x07,0xef,0x00,0x02,0x08,0x4c,0x08,0x4d,\r\n0x00,0x02,0x08,0x4e,0x08,0x4e,0x00,0x04,0x08,0x4f,0x08,0x4f,0x00,0x02,0x09,0x2e,0x09,0x2e,0x00,0x01,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x01,0x09,0x7f,0x09,0x7f,0x00,0x01,0x0a,0x1a,0x0a,0x1a,0x00,0x01,0x0a,0x21,0x0a,0x21,0x00,0x01,0x0a,0x23,0x0a,0x23,0x00,0x01,0x0a,0x50,0x0a,0x50,0x00,0x01,0x0a,0x6f,\r\n0x0a,0x6f,0x00,0x01,0x0a,0xdb,0x0a,0xe0,0x00,0x02,0x0a,0xe1,0x0a,0xe1,0x00,0x04,0x0a,0xe2,0x0a,0xe2,0x00,0x02,0x0a,0xe3,0x0a,0xe3,0x00,0x04,0x0e,0x1e,0x0e,0x1e,0x00,0x01,0x0e,0x6b,0x0e,0x6c,0x00,0x01,0x13,0x2c,0x13,0x2c,0x00,0x01,0x13,0x2f,0x13,0x2f,0x00,0x01,0x13,0x33,0x13,0x35,0x00,0x01,0x13,0x38,0x13,0x38,0x00,0x01,\r\n0x13,0x3c,0x13,0x3c,0x00,0x01,0x13,0x3f,0x13,0x40,0x00,0x01,0x14,0x62,0x14,0x62,0x00,0x01,0x14,0x6c,0x14,0x6c,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x0a,0x01,0xee,0x04,0xce,0x00,0x15,0x61,0x72,0x61,0x62,0x00,0x80,0x62,0x6e,0x67,0x32,0x00,0xea,0x63,0x79,0x72,0x6c,0x00,0xf4,0x64,0x65,0x76,0x32,0x01,0x08,0x67,0x6a,0x72,0x32,\r\n0x01,0x22,0x67,0x72,0x65,0x6b,0x01,0x12,0x67,0x75,0x72,0x32,0x01,0x2c,0x68,0x65,0x62,0x72,0x01,0x36,0x6b,0x68,0x6d,0x72,0x01,0x4e,0x6b,0x6e,0x64,0x32,0x01,0x44,0x6c,0x61,0x6f,0x20,0x01,0x58,0x6c,0x61,0x74,0x6e,0x01,0x62,0x6d,0x6c,0x6d,0x32,0x01,0x8a,0x6d,0x6f,0x6e,0x67,0x01,0x94,0x6d,0x79,0x6d,0x72,0x01,0x9e,0x6f,0x72,\r\n0x79,0x32,0x01,0xb2,0x74,0x61,0x6c,0x75,0x01,0xa8,0x74,0x65,0x6c,0x32,0x01,0xc6,0x74,0x68,0x61,0x69,0x01,0xd0,0x74,0x69,0x62,0x74,0x01,0xda,0x74,0x6d,0x6c,0x32,0x01,0xbc,0x00,0x2e,0x00,0x05,0x41,0x52,0x41,0x20,0x00,0x22,0x4d,0x4c,0x59,0x20,0x00,0x3a,0x4d,0x4f,0x52,0x20,0x00,0x46,0x53,0x4e,0x44,0x20,0x00,0x52,0x55,0x52,\r\n0x44,0x20,0x00,0x5e,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1c,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x09,0x00,0x13,0x00,0x1d,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0a,0x00,0x14,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0b,0x00,0x15,0x00,0x1f,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x20,\r\n0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x0d,0x00,0x17,0x00,0x21,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x04,0x00,0x00,0x00,0x0e,0x00,0x18,0x00,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x05,\r\n0x00,0x01,0x00,0x0f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x10,0x00,0x19,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,\r\n0xff,0xff,0x00,0x00,0x00,0x0a,0x00,0x01,0x54,0x52,0x4b,0x20,0x00,0x1a,0x00,0x00,0xff,0xff,0x00,0x05,0x00,0x06,0x00,0x02,0x00,0x11,0x00,0x1a,0x00,0x23,0x00,0x00,0xff,0xff,0x00,0x04,0x00,0x07,0x00,0x03,0x00,0x1b,0x00,0x24,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,\r\n0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x04,0x00,0x00,\r\n0x00,0x00,0xff,0xff,0x00,0x00,0x00,0x25,0x63,0x61,0x73,0x65,0x00,0xe0,0x63,0x61,0x73,0x65,0x00,0xe6,0x63,0x61,0x73,0x65,0x00,0xec,0x63,0x61,0x73,0x65,0x00,0xf2,0x63,0x70,0x73,0x70,0x00,0xf8,0x63,0x70,0x73,0x70,0x01,0x02,0x63,0x70,0x73,0x70,0x01,0x0c,0x63,0x70,0x73,0x70,0x01,0x16,0x6b,0x65,0x72,0x6e,0x01,0x20,0x6b,0x65,\r\n0x72,0x6e,0x01,0x36,0x6b,0x65,0x72,0x6e,0x01,0x60,0x6b,0x65,0x72,0x6e,0x01,0x76,0x6b,0x65,0x72,0x6e,0x01,0x8c,0x6b,0x65,0x72,0x6e,0x01,0xa2,0x6b,0x65,0x72,0x6e,0x01,0xcc,0x6b,0x65,0x72,0x6e,0x01,0xd2,0x6b,0x65,0x72,0x6e,0x01,0xd8,0x6b,0x65,0x72,0x6e,0x01,0xde,0x6d,0x61,0x72,0x6b,0x01,0xe4,0x6d,0x61,0x72,0x6b,0x01,0xee,\r\n0x6d,0x61,0x72,0x6b,0x01,0xf8,0x6d,0x61,0x72,0x6b,0x02,0x02,0x6d,0x61,0x72,0x6b,0x02,0x0c,0x6d,0x61,0x72,0x6b,0x02,0x16,0x6d,0x61,0x72,0x6b,0x02,0x20,0x6d,0x61,0x72,0x6b,0x02,0x28,0x6d,0x61,0x72,0x6b,0x02,0x6a,0x6d,0x61,0x72,0x6b,0x02,0x80,0x6d,0x6b,0x6d,0x6b,0x02,0x94,0x6d,0x6b,0x6d,0x6b,0x02,0x9c,0x6d,0x6b,0x6d,0x6b,\r\n0x02,0xa4,0x6d,0x6b,0x6d,0x6b,0x02,0xac,0x6d,0x6b,0x6d,0x6b,0x02,0xb4,0x6d,0x6b,0x6d,0x6b,0x02,0xbc,0x6d,0x6b,0x6d,0x6b,0x02,0xc4,0x6d,0x6b,0x6d,0x6b,0x02,0xcc,0x6d,0x6b,0x6d,0x6b,0x02,0xd8,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x00,\r\n0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x03,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x13,\r\n0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x09,\r\n0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x00,0x00,0x13,0x00,0x00,0x00,0x01,0x00,0x39,0x00,0x3a,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,\r\n0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,0x00,0x48,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x01,0x00,0x19,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,\r\n0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x13,0x00,0x00,0x00,0x1f,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x1d,0x00,0x1e,0x00,0x1f,0x00,0x20,\r\n0x00,0x21,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x2b,0x00,0x2c,0x00,0x2d,0x00,0x2e,0x00,0x2f,0x00,0x30,0x00,0x31,0x00,0x32,0x00,0x33,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x09,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x07,0x00,0x08,0x00,0x09,\r\n0x00,0x0a,0x00,0x0c,0x00,0x14,0x00,0x00,0x00,0x08,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0c,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,\r\n0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x0e,0x00,0x00,0x00,0x04,0x00,0x0d,0x00,0x0e,0x00,0x17,0x00,0x18,0x00,0x00,0x00,0x02,0x00,0x0d,0x00,0x0e,0x00,0x86,0x01,0x0e,0x01,0x28,0x01,0x42,0x01,0x52,0x01,0x62,0x01,0x72,0x01,0x82,0x01,0x92,0x01,0xa2,0x01,0xb2,0x01,0xc2,0x01,0xd2,\r\n0x01,0xe2,0x01,0xf2,0x02,0x02,0x02,0x12,0x02,0x22,0x02,0x32,0x02,0x42,0x02,0x52,0x02,0x62,0x02,0x72,0x02,0x96,0x02,0xa6,0x02,0xb6,0x02,0xc6,0x02,0xd6,0x02,0xe6,0x02,0xf6,0x03,0x06,0x03,0x2a,0x03,0x3a,0x03,0x68,0x04,0x5e,0x05,0xb8,0x05,0xc8,0x05,0xd8,0x06,0x56,0x06,0x7a,0x06,0xee,0x07,0x1c,0x09,0x70,0x09,0x80,0x09,0x90,\r\n0x09,0xa0,0x09,0xb0,0x09,0xc0,0x09,0xd0,0x09,0xe0,0x0a,0x04,0x0a,0x14,0x0a,0x38,0x0a,0x7a,0x0a,0xa8,0x0a,0xb8,0x0a,0xc8,0x0a,0xf6,0x0b,0x06,0x0b,0x16,0x0b,0x26,0x0b,0x36,0x0b,0x46,0x0b,0x56,0x0b,0x66,0x0b,0x76,0x0b,0x9a,0x0b,0xbe,0x0b,0xe2,0x0c,0x06,0x0c,0x2a,0x0c,0x4e,0x0c,0x72,0x0c,0x96,0x0c,0xba,0x0c,0xde,0x0c,0xee,\r\n0x0c,0xfe,0x0d,0x0e,0x0d,0x1e,0x0d,0x2e,0x0d,0x3e,0x0d,0x4e,0x0d,0x5e,0x0d,0x6e,0x0d,0x7e,0x0d,0x8e,0x0d,0x9e,0x0d,0xae,0x0d,0xbe,0x0d,0xce,0x0d,0xde,0x0d,0xee,0x0d,0xfe,0x0e,0x0e,0x0e,0x1e,0x0e,0x2e,0x0e,0x3e,0x0e,0x4e,0x0e,0x5e,0x0e,0x6e,0x0e,0x7e,0x0e,0x8e,0x0e,0x9e,0x0e,0xae,0x0e,0xbe,0x0e,0xce,0x0e,0xde,0x0e,0xee,\r\n0x0e,0xfe,0x0f,0x0e,0x0f,0x1e,0x0f,0x2e,0x0f,0x3e,0x0f,0x4e,0x0f,0x5e,0x0f,0x6e,0x0f,0x7e,0x0f,0x8e,0x0f,0x9e,0x0f,0xae,0x0f,0xbe,0x0f,0xce,0x0f,0xde,0x0f,0xee,0x0f,0xfe,0x10,0x0e,0x10,0x1e,0x10,0x2e,0x10,0x3e,0x10,0x4e,0x10,0x5e,0x10,0x6e,0x10,0x7e,0x10,0x8e,0x00,0x09,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,\r\n0x00,0x02,0x00,0x00,0x0f,0x86,0x00,0x01,0x00,0x02,0x00,0x00,0x2d,0x04,0x00,0x09,0x00,0x08,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x02,0x00,0x00,0x35,0xd0,0x00,0x01,0x00,0x02,0x00,0x00,0x36,0x16,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x82,0xbe,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x00,0x97,0x3c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x98,0x5c,0x00,0x09,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x36,0x96,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x99,0xa2,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x00,0x9a,0x78,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xa8,0x76,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xa9,0x56,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xaa,0x32,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x00,0xb1,0x9a,0x00,0x09,0x03,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0xb2,0x1c,0x00,0x09,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0xfe,0xcc,0x00,0x09,0x04,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x01,0x20,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x01,0x00,0x00,0x48,0x22,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x49,0xe8,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x49,0xf2,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x4a,0x08,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x01,0x02,0x92,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x02,0xa8,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x40,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x4a,0x78,0x00,0x09,0x00,0x01,\r\n0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x05,0x00,0x01,0x12,0xb8,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x15,0x60,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x18,0xd4,0x00,0x09,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x4a,0xcc,0x00,0x09,0x00,0x01,\r\n0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1a,0x3a,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1a,0x90,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xa2,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xe4,\r\n0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x4e,0xfc,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1d,0x58,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x2c,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x36,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x4f,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x50,0x00,0x09,0x00,0x01,0x00,0x18,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,\r\n0x00,0xe6,0x00,0xee,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x58,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x64,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x7e,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x8a,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0x98,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xa2,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x4f,0xb0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xd2,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xe0,0x00,0x01,0x00,0x08,0x00,0x00,0x4f,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x12,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x24,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x50,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x56,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x66,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x78,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x8a,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0x9e,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xaa,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x50,0xb8,0x00,0x09,0x00,0x01,0x00,0x22,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x92,0x00,0x9a,0x00,0xa2,0x00,0xaa,0x00,0xb2,0x00,0xba,0x00,0xc2,0x00,0xca,0x00,0xd2,0x00,0xda,0x00,0xe2,0x00,0xea,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x01,0x12,0x01,0x1a,\r\n0x01,0x22,0x01,0x2a,0x01,0x32,0x01,0x3a,0x01,0x42,0x01,0x4a,0x01,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xce,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xda,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xe8,0x00,0x01,0x00,0x08,0x00,0x00,0x50,0xf8,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x06,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x16,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x51,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x34,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x82,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0x90,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x51,0xa0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xd0,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xe2,0x00,0x01,0x00,0x08,0x00,0x00,0x51,0xf2,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x04,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x18,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x52,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x36,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x48,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0x94,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xa6,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x52,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xca,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xdc,0x00,0x01,0x00,0x08,0x00,0x00,0x52,0xf0,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1b,0xac,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xbe,0x00,0x09,\r\n0x00,0x01,0x00,0x0c,0x00,0x1e,0x00,0x26,0x00,0x2e,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xf0,0x00,0x01,0x00,0x08,0x00,0x00,0x53,0xfa,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x06,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x14,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x54,0x1e,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x2a,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x4e,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x66,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0x72,0x00,0x09,0x00,0x01,\r\n0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xd8,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xe4,0x00,0x01,0x00,0x08,0x00,0x00,0x54,0xf2,0x00,0x09,0x00,0x01,0x00,0x0b,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x44,0x00,0x4c,0x00,0x54,0x00,0x5c,0x00,0x64,0x00,0x6c,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x55,0x42,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x4e,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x6c,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x78,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x86,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0x96,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xa2,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x55,0xb0,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xc0,0x00,0x01,0x00,0x08,0x00,0x00,0x55,0xcc,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x56,0x00,0x01,0x00,0x08,0x00,0x00,\r\n0x56,0x68,0x00,0x09,0x00,0x01,0x00,0x3b,0x00,0x7c,0x00,0x84,0x00,0x8c,0x00,0x94,0x00,0x9c,0x00,0xa4,0x00,0xac,0x00,0xb4,0x00,0xbc,0x00,0xc4,0x00,0xcc,0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x01,0x14,0x01,0x1c,0x01,0x24,0x01,0x2c,0x01,0x34,0x01,0x3c,0x01,0x44,0x01,0x4c,0x01,0x54,\r\n0x01,0x5c,0x01,0x64,0x01,0x6c,0x01,0x74,0x01,0x7c,0x01,0x84,0x01,0x8c,0x01,0x94,0x01,0x9c,0x01,0xa4,0x01,0xac,0x01,0xb4,0x01,0xbc,0x01,0xc4,0x01,0xcc,0x01,0xd4,0x01,0xdc,0x01,0xe4,0x01,0xec,0x01,0xf4,0x01,0xfc,0x02,0x04,0x02,0x0c,0x02,0x14,0x02,0x1c,0x02,0x24,0x02,0x2c,0x02,0x34,0x02,0x3c,0x02,0x44,0x02,0x4c,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x56,0x62,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0x90,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xa0,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xc4,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xd8,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x56,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x56,0xfc,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x10,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x24,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x4a,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x6e,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x57,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0x94,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xa8,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xbe,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xd2,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xe6,0x00,0x01,0x00,0x08,0x00,0x00,0x57,0xfc,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x12,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x58,0x2a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x4a,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x5c,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x80,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0x92,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xa6,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x58,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xd0,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xe2,0x00,0x01,0x00,0x08,0x00,0x00,0x58,0xf4,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x32,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x46,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x59,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x6e,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0x96,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xaa,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xbe,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xd4,0x00,0x01,0x00,0x08,0x00,0x00,0x59,0xea,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x59,0xf8,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x18,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x28,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x4c,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x72,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x5a,0x84,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0x98,0x00,0x01,0x00,0x08,0x00,0x00,0x5a,0xac,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x1d,0x36,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xa4,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x5b,0xb6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xd0,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x1e,0xda,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x1f,0x28,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,\r\n0x00,0x06,0x00,0x01,0x20,0x1c,0x00,0x09,0x00,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xb6,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xc2,0x00,0x01,0x00,0x08,0x00,0x00,0x5b,0xce,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x20,0xb0,0x00,0x09,0x00,0x01,0x00,0x03,\r\n0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x2c,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x38,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0x46,0x00,0x09,0x00,0x01,0x00,0x06,0x00,0x12,0x00,0x1a,0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xc6,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xd2,\r\n0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xde,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x5c,0xf6,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x02,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x5a,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x66,0x00,0x01,\r\n0x00,0x08,0x00,0x00,0x5d,0x72,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0x7e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5d,0xe6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x01,0x20,0xc8,0x00,0x09,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x5e,0x46,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x52,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x60,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0x70,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x01,0x21,0x7a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xa4,0x00,0x09,0x00,0x00,\r\n0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xb6,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xca,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xde,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5e,0xf4,0x00,0x09,0x00,0x00,\r\n0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x0a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x20,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x2e,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x48,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x62,\r\n0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x70,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0x8c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xa8,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xb8,0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xd4,\r\n0x00,0x01,0x00,0x08,0x00,0x00,0x5f,0xf0,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x1e,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x3c,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x4e,\r\n0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x6c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x8a,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0x9c,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xba,0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xd8,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,\r\n0x00,0x01,0x00,0x08,0x00,0x00,0x60,0xea,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x0a,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x2a,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x3e,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x5e,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x7e,0x00,0x09,0x00,0x00,\r\n0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0x92,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xb2,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xd2,0x00,0x09,0x00,0x00,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x08,0x00,0x00,0x61,0xe6,0x00,0x01,0x00,0x08,0x00,0x00,0x62,0x06,0x00,0x01,0x00,0x08,\r\n0x00,0x00,0x62,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x62,0x3e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,\r\n0x00,0x00,0x65,0x04,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x67,0x4e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x68,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x68,0xf8,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,\r\n0x00,0x00,0x69,0xca,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6a,0x26,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6b,0xb0,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6c,0x88,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,\r\n0x00,0x00,0x6c,0xea,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6d,0xbc,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x18,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0xe6,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,\r\n0x00,0x00,0x6f,0xbe,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x70,0x96,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x71,0x6e,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x72,0x94,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,\r\n0x00,0x00,0x72,0xea,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x73,0x40,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0x96,0x00,0x09,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xe0,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x60,0xfc,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x00,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x02,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x06,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x08,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x0a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x0e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x14,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x18,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x1c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x20,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x22,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x24,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x26,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x2a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x2e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x32,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x36,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x3a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x3e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x42,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x46,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x4a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x4e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x52,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x56,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x58,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x5a,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x5c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x5e,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x60,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x62,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x64,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x66,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x68,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x61,0x6c,0x00,0x09,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x61,0x70,0x00,0x01,0x1c,0xce,0x00,0x05,0x00,0x00,0x00,0x53,0x00,0xb8,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x09,0x64,0x14,0x30,0x00,0xb8,0x10,0x92,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,\r\n0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x14,0x30,0x14,0x30,0x15,0x52,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x08,0x3c,0x14,0x30,0x14,0x30,0x00,0xb8,0x00,0xb8,0x00,0xb8,\r\n0x00,0xb8,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x00,0xb0,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x08,0x3c,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x14,0x30,0x00,0x01,0x09,0x08,0x01,0x56,0x01,0x56,0x00,0x01,0x09,0x08,\r\n0x00,0xab,0x00,0xab,0x01,0x3f,0x08,0xcc,0xff,0x55,0xff,0x55,0x08,0xcd,0xff,0x55,0xff,0x55,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,\r\n0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,0xff,0x55,0xff,0x55,0x08,0xfa,0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,\r\n0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,\r\n0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,\r\n0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,\r\n0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,\r\n0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5c,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,\r\n0xff,0x55,0x09,0x65,0xff,0x55,0xff,0x55,0x09,0x67,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,0xff,0x55,0xff,0x55,0x09,0x8c,\r\n0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x93,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x95,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab,\r\n0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55,\r\n0xff,0x55,0x09,0xb7,0xff,0x55,0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,\r\n0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,\r\n0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,\r\n0xff,0x55,0x09,0xe2,0xff,0x55,0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,\r\n0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xf9,0xff,0x55,0xff,0x55,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,\r\n0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,\r\n0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,\r\n0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,\r\n0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,\r\n0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,\r\n0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,\r\n0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,\r\n0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd1,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,\r\n0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,\r\n0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x3c,0xff,0x55,0xff,0x55,0x0f,0x3e,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,\r\n0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,\r\n0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,\r\n0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,\r\n0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,\r\n0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x75,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x7b,0xff,0x55,0xff,0x55,0x14,0x83,0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,\r\n0x00,0x31,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,\r\n0x00,0xab,0x00,0xab,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xf2,0x00,0xab,0x00,0xab,\r\n0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8f,0x00,0xab,\r\n0x00,0xab,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0xab,0x00,0xab,0x00,0xab,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,\r\n0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x78,0x00,0xab,0x00,0xab,0x01,0x32,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,\r\n0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,\r\n0xff,0x55,0xff,0x55,0x08,0xfa,0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,\r\n0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,\r\n0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,\r\n0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,\r\n0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,\r\n0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,\r\n0xff,0x55,0xff,0x55,0x09,0x8c,0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,\r\n0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55,0xff,0x55,0x09,0xb7,0xff,0x55,\r\n0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,\r\n0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,\r\n0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,0xff,0x55,0x09,0xe2,0xff,0x55,\r\n0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,0xff,0x55,0xff,0x55,0x09,0xf2,\r\n0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,\r\n0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,\r\n0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,\r\n0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,\r\n0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,\r\n0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,\r\n0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,\r\n0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,\r\n0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,\r\n0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,\r\n0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,\r\n0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,\r\n0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,\r\n0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,\r\n0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x83,\r\n0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x9a,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,\r\n0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x0e,0xff,0x55,0xff,0x55,0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,\r\n0xff,0x55,0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,\r\n0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x65,0xff,0x55,\r\n0xff,0x55,0x09,0x67,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x8c,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,\r\n0x00,0xab,0x00,0xab,0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,\r\n0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,\r\n0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,\r\n0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x72,0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,\r\n0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,0xff,0x55,0x0a,0x8f,0x00,0xab,\r\n0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,\r\n0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,\r\n0x0e,0xaf,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x3c,0xff,0x55,\r\n0xff,0x55,0x0f,0x3e,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,0x00,0xab,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,\r\n0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x83,0xff,0x55,0xff,0x55,0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x30,0x08,0xf4,0x00,0xab,0x00,0xab,0x09,0x0e,0xff,0x55,\r\n0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x97,0x00,0xab,0x00,0xab,0x09,0x98,\r\n0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xfa,0x00,0xab,0x00,0xab,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x73,0x00,0xab,0x00,0xab,\r\n0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7d,0x00,0xab,0x00,0xab,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0xab,0x00,0xab,0x00,0xab,0x0e,0x49,0x00,0xab,\r\n0x00,0xab,0x0e,0x4d,0x00,0xab,0x00,0xab,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x24,0x00,0xab,0x00,0xab,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x40,\r\n0x00,0xab,0x00,0xab,0x0f,0x94,0x00,0xab,0x00,0xab,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x78,0x00,0xab,0x00,0xab,0x01,0x3f,0x08,0xcc,0xff,0x55,0xff,0x55,0x08,0xcd,0xff,0x55,0xff,0x55,0x08,0xd4,0xff,0x55,0xff,0x55,0x08,0xd5,0xff,0x55,0xff,0x55,0x08,0xd6,0xff,0x55,0xff,0x55,0x08,0xe1,0xff,0x55,0xff,0x55,0x08,0xe2,0xff,0x55,\r\n0xff,0x55,0x08,0xe5,0xff,0x55,0xff,0x55,0x08,0xe8,0xff,0x55,0xff,0x55,0x08,0xeb,0xff,0x55,0xff,0x55,0x08,0xed,0xff,0x55,0xff,0x55,0x08,0xee,0xff,0x55,0xff,0x55,0x08,0xef,0xff,0x55,0xff,0x55,0x08,0xf0,0xff,0x55,0xff,0x55,0x08,0xf1,0xff,0x55,0xff,0x55,0x08,0xf4,0x00,0xab,0x00,0xab,0x08,0xf9,0xff,0x55,0xff,0x55,0x08,0xfa,\r\n0xff,0x55,0xff,0x55,0x08,0xff,0xff,0x55,0xff,0x55,0x09,0x01,0xff,0x55,0xff,0x55,0x09,0x06,0xff,0x55,0xff,0x55,0x09,0x07,0xff,0x55,0xff,0x55,0x09,0x08,0xff,0x55,0xff,0x55,0x09,0x09,0xff,0x55,0xff,0x55,0x09,0x0a,0xff,0x55,0xff,0x55,0x09,0x0c,0xff,0x55,0xff,0x55,0x09,0x0d,0xff,0x55,0xff,0x55,0x09,0x0f,0xff,0x55,0xff,0x55,\r\n0x09,0x10,0xff,0x55,0xff,0x55,0x09,0x11,0xff,0x55,0xff,0x55,0x09,0x12,0x00,0xab,0x00,0xab,0x09,0x13,0x00,0xab,0x00,0xab,0x09,0x14,0x00,0xab,0x00,0xab,0x09,0x15,0xff,0x55,0xff,0x55,0x09,0x16,0xff,0x55,0xff,0x55,0x09,0x17,0xff,0x55,0xff,0x55,0x09,0x18,0xff,0x55,0xff,0x55,0x09,0x19,0xff,0x55,0xff,0x55,0x09,0x1a,0xff,0x55,\r\n0xff,0x55,0x09,0x1b,0xff,0x55,0xff,0x55,0x09,0x1c,0xff,0x55,0xff,0x55,0x09,0x1d,0xff,0x55,0xff,0x55,0x09,0x1e,0xff,0x55,0xff,0x55,0x09,0x1f,0x00,0xab,0x00,0xab,0x09,0x20,0x00,0xab,0x00,0xab,0x09,0x22,0xff,0x55,0xff,0x55,0x09,0x24,0xff,0x55,0xff,0x55,0x09,0x26,0xff,0x55,0xff,0x55,0x09,0x28,0xff,0x55,0xff,0x55,0x09,0x29,\r\n0xff,0x55,0xff,0x55,0x09,0x2a,0xff,0x55,0xff,0x55,0x09,0x2b,0xff,0x55,0xff,0x55,0x09,0x34,0xff,0x55,0xff,0x55,0x09,0x3c,0xff,0x55,0xff,0x55,0x09,0x3e,0xff,0x55,0xff,0x55,0x09,0x40,0xff,0x55,0xff,0x55,0x09,0x41,0x00,0xab,0x00,0xab,0x09,0x42,0x00,0xab,0x00,0xab,0x09,0x45,0xff,0x55,0xff,0x55,0x09,0x46,0xff,0x55,0xff,0x55,\r\n0x09,0x47,0xff,0x55,0xff,0x55,0x09,0x48,0xff,0x55,0xff,0x55,0x09,0x49,0xff,0x55,0xff,0x55,0x09,0x4a,0xff,0x55,0xff,0x55,0x09,0x4c,0x00,0xab,0x00,0xab,0x09,0x4e,0xff,0x55,0xff,0x55,0x09,0x5b,0xff,0x55,0xff,0x55,0x09,0x5c,0xff,0x55,0xff,0x55,0x09,0x5d,0xff,0x55,0xff,0x55,0x09,0x5e,0xff,0x55,0xff,0x55,0x09,0x60,0xff,0x55,\r\n0xff,0x55,0x09,0x63,0xff,0x55,0xff,0x55,0x09,0x64,0xff,0x55,0xff,0x55,0x09,0x6c,0xff,0x55,0xff,0x55,0x09,0x6d,0xff,0x55,0xff,0x55,0x09,0x71,0xff,0x55,0xff,0x55,0x09,0x80,0xff,0x55,0xff,0x55,0x09,0x82,0xff,0x55,0xff,0x55,0x09,0x88,0xff,0x55,0xff,0x55,0x09,0x89,0xff,0x55,0xff,0x55,0x09,0x8a,0xff,0x55,0xff,0x55,0x09,0x8c,\r\n0xff,0x55,0xff,0x55,0x09,0x8d,0xff,0x55,0xff,0x55,0x09,0x8e,0xff,0x55,0xff,0x55,0x09,0x8f,0x00,0xab,0x00,0xab,0x09,0x90,0xff,0x55,0xff,0x55,0x09,0x92,0xff,0x55,0xff,0x55,0x09,0x93,0xff,0x55,0xff,0x55,0x09,0x94,0xff,0x55,0xff,0x55,0x09,0x95,0xff,0x55,0xff,0x55,0x09,0x96,0xff,0x55,0xff,0x55,0x09,0x97,0x00,0xab,0x00,0xab,\r\n0x09,0x98,0x00,0xab,0x00,0xab,0x09,0x9b,0x00,0xab,0x00,0xab,0x09,0x9e,0x00,0xab,0x00,0xab,0x09,0xa1,0x00,0xab,0x00,0xab,0x09,0xa4,0x00,0xab,0x00,0xab,0x09,0xa7,0x00,0xab,0x00,0xab,0x09,0xaa,0xff,0x55,0xff,0x55,0x09,0xab,0xff,0x55,0xff,0x55,0x09,0xac,0xff,0x55,0xff,0x55,0x09,0xae,0xff,0x55,0xff,0x55,0x09,0xb2,0xff,0x55,\r\n0xff,0x55,0x09,0xb3,0xff,0x55,0xff,0x55,0x09,0xb4,0xff,0x55,0xff,0x55,0x09,0xb5,0xff,0x55,0xff,0x55,0x09,0xb6,0xff,0x55,0xff,0x55,0x09,0xb7,0xff,0x55,0xff,0x55,0x09,0xb8,0xff,0x55,0xff,0x55,0x09,0xb9,0xff,0x55,0xff,0x55,0x09,0xba,0xff,0x55,0xff,0x55,0x09,0xbb,0xff,0x55,0xff,0x55,0x09,0xbc,0xff,0x55,0xff,0x55,0x09,0xbd,\r\n0xff,0x55,0xff,0x55,0x09,0xbe,0xff,0x55,0xff,0x55,0x09,0xbf,0xff,0x55,0xff,0x55,0x09,0xc0,0xff,0x55,0xff,0x55,0x09,0xc1,0xff,0x55,0xff,0x55,0x09,0xc2,0xff,0x55,0xff,0x55,0x09,0xc3,0xff,0x55,0xff,0x55,0x09,0xc4,0x00,0xab,0x00,0xab,0x09,0xc6,0xff,0x55,0xff,0x55,0x09,0xc8,0xff,0x55,0xff,0x55,0x09,0xc9,0xff,0x55,0xff,0x55,\r\n0x09,0xca,0xff,0x55,0xff,0x55,0x09,0xcc,0xff,0x55,0xff,0x55,0x09,0xcd,0xff,0x55,0xff,0x55,0x09,0xd2,0xff,0x55,0xff,0x55,0x09,0xd3,0xff,0x55,0xff,0x55,0x09,0xd7,0xff,0x55,0xff,0x55,0x09,0xd8,0xff,0x55,0xff,0x55,0x09,0xd9,0xff,0x55,0xff,0x55,0x09,0xda,0xff,0x55,0xff,0x55,0x09,0xdb,0xff,0x55,0xff,0x55,0x09,0xdc,0xff,0x55,\r\n0xff,0x55,0x09,0xdd,0xff,0x55,0xff,0x55,0x09,0xde,0xff,0x55,0xff,0x55,0x09,0xdf,0xff,0x55,0xff,0x55,0x09,0xe1,0xff,0x55,0xff,0x55,0x09,0xe2,0xff,0x55,0xff,0x55,0x09,0xe3,0xff,0x55,0xff,0x55,0x09,0xe4,0xff,0x55,0xff,0x55,0x09,0xe5,0xff,0x55,0xff,0x55,0x09,0xe7,0xff,0x55,0xff,0x55,0x09,0xe8,0xff,0x55,0xff,0x55,0x09,0xe9,\r\n0xff,0x55,0xff,0x55,0x09,0xea,0xff,0x55,0xff,0x55,0x09,0xec,0xff,0x55,0xff,0x55,0x09,0xee,0xff,0x55,0xff,0x55,0x09,0xf0,0xff,0x55,0xff,0x55,0x09,0xf2,0x00,0xab,0x00,0xab,0x09,0xf9,0xff,0x55,0xff,0x55,0x09,0xfa,0x00,0xab,0x00,0xab,0x09,0xfd,0xff,0x55,0xff,0x55,0x09,0xfe,0xff,0x55,0xff,0x55,0x09,0xff,0xff,0x55,0xff,0x55,\r\n0x0a,0x00,0xff,0x55,0xff,0x55,0x0a,0x01,0xff,0x55,0xff,0x55,0x0a,0x02,0xff,0x55,0xff,0x55,0x0a,0x03,0xff,0x55,0xff,0x55,0x0a,0x04,0xff,0x55,0xff,0x55,0x0a,0x05,0xff,0x55,0xff,0x55,0x0a,0x07,0xff,0x55,0xff,0x55,0x0a,0x0a,0xff,0x55,0xff,0x55,0x0a,0x0b,0xff,0x55,0xff,0x55,0x0a,0x0d,0xff,0x55,0xff,0x55,0x0a,0x24,0xff,0x55,\r\n0xff,0x55,0x0a,0x25,0xff,0x55,0xff,0x55,0x0a,0x26,0xff,0x55,0xff,0x55,0x0a,0x27,0xff,0x55,0xff,0x55,0x0a,0x28,0x00,0xab,0x00,0xab,0x0a,0x2a,0xff,0x55,0xff,0x55,0x0a,0x3e,0xff,0x55,0xff,0x55,0x0a,0x56,0xff,0x55,0xff,0x55,0x0a,0x58,0xff,0x55,0xff,0x55,0x0a,0x5a,0xff,0x55,0xff,0x55,0x0a,0x63,0xff,0x55,0xff,0x55,0x0a,0x72,\r\n0xff,0x55,0xff,0x55,0x0a,0x73,0x00,0xab,0x00,0xab,0x0a,0x74,0xff,0x55,0xff,0x55,0x0a,0x76,0xff,0x55,0xff,0x55,0x0a,0x77,0x00,0xab,0x00,0xab,0x0a,0x78,0xff,0x55,0xff,0x55,0x0a,0x79,0x00,0xab,0x00,0xab,0x0a,0x7a,0xff,0x55,0xff,0x55,0x0a,0x7b,0x00,0xab,0x00,0xab,0x0a,0x7c,0xff,0x55,0xff,0x55,0x0a,0x7d,0x00,0xab,0x00,0xab,\r\n0x0a,0x7e,0xff,0x55,0xff,0x55,0x0a,0x7f,0xff,0x55,0xff,0x55,0x0a,0x80,0x00,0xab,0x00,0xab,0x0a,0x83,0x00,0xab,0x00,0xab,0x0a,0x86,0xff,0x55,0xff,0x55,0x0a,0x87,0xff,0x55,0xff,0x55,0x0a,0x88,0xff,0x55,0xff,0x55,0x0a,0x89,0xff,0x55,0xff,0x55,0x0a,0x8a,0xff,0x55,0xff,0x55,0x0a,0x8b,0x00,0xab,0x00,0xab,0x0a,0x8d,0xff,0x55,\r\n0xff,0x55,0x0a,0x8f,0x00,0xab,0x00,0xab,0x0a,0x91,0xff,0x55,0xff,0x55,0x0a,0x93,0x00,0xab,0x00,0xab,0x0a,0x95,0xff,0x55,0xff,0x55,0x0a,0x9d,0xff,0x55,0xff,0x55,0x0a,0x9e,0xff,0x55,0xff,0x55,0x0a,0xa0,0xff,0x55,0xff,0x55,0x0a,0xa1,0xff,0x55,0xff,0x55,0x0a,0xa3,0xff,0x55,0xff,0x55,0x0a,0xa6,0xff,0x55,0xff,0x55,0x0a,0xa7,\r\n0xff,0x55,0xff,0x55,0x0a,0xa8,0xff,0x55,0xff,0x55,0x0a,0xa9,0xff,0x55,0xff,0x55,0x0a,0xab,0x00,0xab,0x00,0xab,0x0a,0xad,0xff,0x55,0xff,0x55,0x0a,0xaf,0xff,0x55,0xff,0x55,0x0a,0xb2,0xff,0x55,0xff,0x55,0x0a,0xb4,0xff,0x55,0xff,0x55,0x0a,0xb5,0xff,0x55,0xff,0x55,0x0a,0xb6,0xff,0x55,0xff,0x55,0x0a,0xb7,0xff,0x55,0xff,0x55,\r\n0x0b,0x19,0xff,0x55,0xff,0x55,0x0e,0x20,0xff,0x55,0xff,0x55,0x0e,0x3a,0xff,0x55,0xff,0x55,0x0e,0x3d,0xff,0x55,0xff,0x55,0x0e,0x3f,0xff,0x55,0xff,0x55,0x0e,0x41,0xff,0x55,0xff,0x55,0x0e,0x43,0xff,0x55,0xff,0x55,0x0e,0x47,0xff,0x55,0xff,0x55,0x0e,0x49,0x00,0xab,0x00,0xab,0x0e,0x4b,0xff,0x55,0xff,0x55,0x0e,0x4d,0x00,0xab,\r\n0x00,0xab,0x0e,0x4f,0xff,0x55,0xff,0x55,0x0e,0x51,0x00,0xab,0x00,0xab,0x0e,0x5b,0xff,0x55,0xff,0x55,0x0e,0x5c,0xff,0x55,0xff,0x55,0x0e,0x5f,0xff,0x55,0xff,0x55,0x0e,0x6f,0xff,0x55,0xff,0x55,0x0e,0x71,0xff,0x55,0xff,0x55,0x0e,0x76,0xff,0x55,0xff,0x55,0x0e,0xa3,0xff,0x55,0xff,0x55,0x0e,0xac,0xff,0x55,0xff,0x55,0x0e,0xaf,\r\n0xff,0x55,0xff,0x55,0x0e,0xd1,0xff,0x55,0xff,0x55,0x0e,0xd7,0xff,0x55,0xff,0x55,0x0e,0xe7,0x00,0xab,0x00,0xab,0x0e,0xe9,0x00,0xab,0x00,0xab,0x0f,0x16,0x00,0xab,0x00,0xab,0x0f,0x1a,0x00,0xab,0x00,0xab,0x0f,0x1e,0xff,0x55,0xff,0x55,0x0f,0x20,0xff,0x55,0xff,0x55,0x0f,0x22,0xff,0x55,0xff,0x55,0x0f,0x24,0x00,0xab,0x00,0xab,\r\n0x0f,0x28,0xff,0x55,0xff,0x55,0x0f,0x2a,0xff,0x55,0xff,0x55,0x0f,0x2c,0xff,0x55,0xff,0x55,0x0f,0x2e,0x00,0xab,0x00,0xab,0x0f,0x30,0xff,0x55,0xff,0x55,0x0f,0x32,0x00,0xab,0x00,0xab,0x0f,0x34,0xff,0x55,0xff,0x55,0x0f,0x36,0x00,0xab,0x00,0xab,0x0f,0x38,0xff,0x55,0xff,0x55,0x0f,0x3a,0xff,0x55,0xff,0x55,0x0f,0x40,0x00,0xab,\r\n0x00,0xab,0x0f,0x44,0xff,0x55,0xff,0x55,0x0f,0x46,0xff,0x55,0xff,0x55,0x0f,0x48,0xff,0x55,0xff,0x55,0x0f,0x4a,0xff,0x55,0xff,0x55,0x0f,0x4c,0xff,0x55,0xff,0x55,0x0f,0x4e,0xff,0x55,0xff,0x55,0x0f,0x6c,0xff,0x55,0xff,0x55,0x0f,0x6e,0xff,0x55,0xff,0x55,0x0f,0x70,0xff,0x55,0xff,0x55,0x0f,0x72,0xff,0x55,0xff,0x55,0x0f,0x74,\r\n0xff,0x55,0xff,0x55,0x0f,0x76,0xff,0x55,0xff,0x55,0x0f,0x78,0xff,0x55,0xff,0x55,0x0f,0x7a,0xff,0x55,0xff,0x55,0x0f,0x7c,0xff,0x55,0xff,0x55,0x0f,0x7e,0xff,0x55,0xff,0x55,0x0f,0x80,0xff,0x55,0xff,0x55,0x0f,0x82,0xff,0x55,0xff,0x55,0x0f,0x84,0xff,0x55,0xff,0x55,0x0f,0x86,0xff,0x55,0xff,0x55,0x0f,0x88,0xff,0x55,0xff,0x55,\r\n0x0f,0x8a,0xff,0x55,0xff,0x55,0x0f,0x8c,0xff,0x55,0xff,0x55,0x0f,0x8e,0xff,0x55,0xff,0x55,0x0f,0x90,0xff,0x55,0xff,0x55,0x0f,0x92,0xff,0x55,0xff,0x55,0x0f,0x94,0x00,0xab,0x00,0xab,0x0f,0x96,0xff,0x55,0xff,0x55,0x0f,0xc0,0xff,0x55,0xff,0x55,0x10,0xfe,0xff,0x55,0xff,0x55,0x11,0x00,0xff,0x55,0xff,0x55,0x11,0x02,0xff,0x55,\r\n0xff,0x55,0x11,0x04,0xff,0x55,0xff,0x55,0x11,0x06,0xff,0x55,0xff,0x55,0x11,0x08,0xff,0x55,0xff,0x55,0x11,0x0a,0xff,0x55,0xff,0x55,0x11,0x0c,0xff,0x55,0xff,0x55,0x11,0x0d,0xff,0x55,0xff,0x55,0x11,0x0f,0xff,0x55,0xff,0x55,0x14,0x53,0x00,0xab,0x00,0xab,0x14,0x54,0xff,0x55,0xff,0x55,0x14,0x55,0xff,0x55,0xff,0x55,0x14,0x56,\r\n0xff,0x55,0xff,0x55,0x14,0x57,0xff,0x55,0xff,0x55,0x14,0x58,0xff,0x55,0xff,0x55,0x14,0x59,0xff,0x55,0xff,0x55,0x14,0x5a,0xff,0x55,0xff,0x55,0x14,0x6f,0xff,0x55,0xff,0x55,0x14,0x72,0xff,0x55,0xff,0x55,0x14,0x75,0xff,0x55,0xff,0x55,0x14,0x78,0x00,0xab,0x00,0xab,0x14,0x7b,0xff,0x55,0xff,0x55,0x14,0x83,0xff,0x55,0xff,0x55,\r\n0x14,0x86,0xff,0x55,0xff,0x55,0x14,0x97,0xff,0x55,0xff,0x55,0x14,0x98,0xff,0x55,0xff,0x55,0x00,0x02,0x00,0x1e,0x08,0xc8,0x08,0xc9,0x00,0x00,0x08,0xff,0x09,0x01,0x00,0x02,0x09,0x04,0x09,0x04,0x00,0x05,0x09,0x08,0x09,0x09,0x00,0x06,0x09,0x17,0x09,0x18,0x00,0x08,0x09,0x45,0x09,0x45,0x00,0x0a,0x09,0x5d,0x09,0x5e,0x00,0x0b,\r\n0x09,0x80,0x09,0x83,0x00,0x0d,0x09,0xad,0x09,0xad,0x00,0x11,0x09,0xaf,0x09,0xb1,0x00,0x12,0x09,0xb3,0x09,0xb8,0x00,0x15,0x0a,0x54,0x0a,0x57,0x00,0x1b,0x0a,0x88,0x0a,0x88,0x00,0x1f,0x0a,0xb4,0x0a,0xb5,0x00,0x20,0x0b,0x0c,0x0b,0x0f,0x00,0x22,0x0b,0x11,0x0b,0x18,0x00,0x26,0x0e,0x8f,0x0e,0x8f,0x00,0x2e,0x0e,0x93,0x0e,0x93,\r\n0x00,0x2f,0x0e,0x95,0x0e,0x97,0x00,0x30,0x0f,0x02,0x0f,0x02,0x00,0x33,0x0f,0x22,0x0f,0x23,0x00,0x34,0x0f,0x28,0x0f,0x2b,0x00,0x36,0x0f,0x62,0x0f,0x63,0x00,0x3a,0x0f,0x66,0x0f,0x67,0x00,0x3c,0x0f,0x6a,0x0f,0x6b,0x00,0x3e,0x0f,0x98,0x0f,0xa6,0x00,0x40,0x0f,0xc3,0x0f,0xc3,0x00,0x4f,0x14,0x58,0x14,0x58,0x00,0x50,0x14,0x7d,\r\n0x14,0x7d,0x00,0x51,0x14,0xad,0x14,0xad,0x00,0x52,0x00,0x02,0x01,0x70,0x00,0x05,0x00,0x00,0x02,0x2e,0x03,0x3a,0x00,0x08,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0xff,0x55,\r\n0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0xab,0x00,0xab,0x00,0xab,\r\n0x00,0xab,0xff,0x55,0xff,0x55,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x00,0x00,0x00,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0xab,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0xff,0x55,0x00,0x02,0x00,0x1f,0x08,0xc9,\r\n0x08,0xca,0x00,0x00,0x08,0xff,0x09,0x01,0x00,0x02,0x09,0x04,0x09,0x04,0x00,0x05,0x09,0x08,0x09,0x08,0x00,0x06,0x09,0x0a,0x09,0x0b,0x00,0x07,0x09,0x29,0x09,0x29,0x00,0x09,0x09,0x45,0x09,0x45,0x00,0x0a,0x09,0x85,0x09,0x85,0x00,0x0b,0x09,0xb3,0x09,0xb8,0x00,0x0c,0x0a,0x56,0x0a,0x57,0x00,0x12,0x0a,0xb4,0x0a,0xb5,0x00,0x14,\r\n0x0b,0x0c,0x0b,0x0f,0x00,0x16,0x0b,0x11,0x0b,0x18,0x00,0x1a,0x0e,0x24,0x0e,0x24,0x00,0x22,0x0e,0x5e,0x0e,0x5e,0x00,0x23,0x0e,0x74,0x0e,0x75,0x00,0x24,0x0e,0xdc,0x0e,0xe3,0x00,0x26,0x0e,0xe6,0x0e,0xe6,0x00,0x2e,0x0f,0x02,0x0f,0x02,0x00,0x2f,0x0f,0x22,0x0f,0x23,0x00,0x30,0x0f,0x39,0x0f,0x39,0x00,0x32,0x0f,0x3b,0x0f,0x3b,\r\n0x00,0x33,0x0f,0x62,0x0f,0x63,0x00,0x34,0x0f,0x66,0x0f,0x67,0x00,0x36,0x0f,0x6a,0x0f,0x6b,0x00,0x38,0x0f,0x98,0x0f,0xa6,0x00,0x3a,0x0f,0xc3,0x0f,0xc3,0x00,0x49,0x11,0x02,0x11,0x09,0x00,0x4a,0x14,0x58,0x14,0x58,0x00,0x52,0x14,0x7d,0x14,0x7d,0x00,0x53,0x14,0xad,0x14,0xad,0x00,0x54,0x00,0x02,0x00,0x2c,0x08,0xc9,0x08,0xc9,\r\n0x00,0x01,0x08,0xca,0x08,0xca,0x00,0x03,0x08,0xff,0x09,0x01,0x00,0x04,0x09,0x04,0x09,0x04,0x00,0x04,0x09,0x08,0x09,0x08,0x00,0x01,0x09,0x0a,0x09,0x0a,0x00,0x02,0x09,0x0b,0x09,0x0b,0x00,0x03,0x09,0x29,0x09,0x29,0x00,0x02,0x09,0x45,0x09,0x45,0x00,0x07,0x09,0x85,0x09,0x85,0x00,0x03,0x09,0xb3,0x09,0xb5,0x00,0x05,0x09,0xb6,\r\n0x09,0xb6,0x00,0x06,0x09,0xb7,0x09,0xb8,0x00,0x07,0x0a,0x56,0x0a,0x57,0x00,0x07,0x0a,0xb4,0x0a,0xb5,0x00,0x07,0x0b,0x0c,0x0b,0x0c,0x00,0x05,0x0b,0x0d,0x0b,0x0d,0x00,0x06,0x0b,0x0e,0x0b,0x0f,0x00,0x07,0x0b,0x11,0x0b,0x13,0x00,0x05,0x0b,0x14,0x0b,0x14,0x00,0x06,0x0b,0x15,0x0b,0x18,0x00,0x07,0x0e,0x24,0x0e,0x24,0x00,0x02,\r\n0x0e,0x5e,0x0e,0x5e,0x00,0x02,0x0e,0x74,0x0e,0x75,0x00,0x02,0x0e,0xdc,0x0e,0xe3,0x00,0x02,0x0e,0xe6,0x0e,0xe6,0x00,0x02,0x0f,0x02,0x0f,0x02,0x00,0x06,0x0f,0x22,0x0f,0x23,0x00,0x07,0x0f,0x39,0x0f,0x39,0x00,0x02,0x0f,0x3b,0x0f,0x3b,0x00,0x02,0x0f,0x62,0x0f,0x63,0x00,0x04,0x0f,0x66,0x0f,0x67,0x00,0x04,0x0f,0x6a,0x0f,0x6b,\r\n0x00,0x04,0x0f,0x98,0x0f,0x99,0x00,0x05,0x0f,0x9a,0x0f,0x9b,0x00,0x07,0x0f,0x9c,0x0f,0x9f,0x00,0x05,0x0f,0xa0,0x0f,0xa2,0x00,0x07,0x0f,0xa3,0x0f,0xa3,0x00,0x05,0x0f,0xa4,0x0f,0xa6,0x00,0x07,0x0f,0xc3,0x0f,0xc3,0x00,0x07,0x11,0x02,0x11,0x09,0x00,0x02,0x14,0x58,0x14,0x58,0x00,0x07,0x14,0x7d,0x14,0x7d,0x00,0x07,0x14,0xad,\r\n0x14,0xad,0x00,0x07,0x00,0x02,0x00,0xf0,0x08,0xcc,0x08,0xcd,0x00,0x05,0x08,0xd4,0x08,0xd5,0x00,0x01,0x08,0xd6,0x08,0xd6,0x00,0x02,0x08,0xe1,0x08,0xe2,0x00,0x02,0x08,0xe5,0x08,0xe5,0x00,0x02,0x08,0xe8,0x08,0xe8,0x00,0x02,0x08,0xeb,0x08,0xeb,0x00,0x02,0x08,0xed,0x08,0xed,0x00,0x08,0x08,0xee,0x08,0xee,0x00,0x01,0x08,0xef,\r\n0x08,0xef,0x00,0x02,0x08,0xf0,0x08,0xf0,0x00,0x01,0x08,0xf1,0x08,0xf1,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x06,0x08,0xf9,0x08,0xfa,0x00,0x01,0x08,0xff,0x08,0xff,0x00,0x01,0x09,0x01,0x09,0x01,0x00,0x01,0x09,0x06,0x09,0x06,0x00,0x01,0x09,0x07,0x09,0x07,0x00,0x02,0x09,0x09,0x09,0x09,0x00,0x03,0x09,0x0a,0x09,0x0a,0x00,0x01,\r\n0x09,0x0c,0x09,0x0d,0x00,0x01,0x09,0x0f,0x09,0x0f,0x00,0x04,0x09,0x10,0x09,0x11,0x00,0x02,0x09,0x12,0x09,0x14,0x00,0x06,0x09,0x15,0x09,0x16,0x00,0x02,0x09,0x17,0x09,0x1a,0x00,0x01,0x09,0x1b,0x09,0x1e,0x00,0x02,0x09,0x1f,0x09,0x20,0x00,0x07,0x09,0x22,0x09,0x22,0x00,0x02,0x09,0x24,0x09,0x24,0x00,0x01,0x09,0x26,0x09,0x26,\r\n0x00,0x02,0x09,0x28,0x09,0x28,0x00,0x02,0x09,0x29,0x09,0x2b,0x00,0x01,0x09,0x34,0x09,0x34,0x00,0x01,0x09,0x3c,0x09,0x3c,0x00,0x02,0x09,0x3e,0x09,0x3e,0x00,0x02,0x09,0x40,0x09,0x40,0x00,0x02,0x09,0x41,0x09,0x42,0x00,0x06,0x09,0x45,0x09,0x45,0x00,0x01,0x09,0x46,0x09,0x49,0x00,0x08,0x09,0x4a,0x09,0x4a,0x00,0x01,0x09,0x4c,\r\n0x09,0x4c,0x00,0x06,0x09,0x4e,0x09,0x4e,0x00,0x02,0x09,0x5b,0x09,0x5b,0x00,0x02,0x09,0x5c,0x09,0x5c,0x00,0x05,0x09,0x5d,0x09,0x5d,0x00,0x02,0x09,0x5e,0x09,0x5e,0x00,0x01,0x09,0x60,0x09,0x60,0x00,0x02,0x09,0x63,0x09,0x63,0x00,0x02,0x09,0x64,0x09,0x64,0x00,0x04,0x09,0x65,0x09,0x65,0x00,0x0a,0x09,0x67,0x09,0x67,0x00,0x0a,\r\n0x09,0x6c,0x09,0x6d,0x00,0x02,0x09,0x71,0x09,0x71,0x00,0x01,0x09,0x80,0x09,0x80,0x00,0x03,0x09,0x82,0x09,0x82,0x00,0x03,0x09,0x88,0x09,0x8a,0x00,0x01,0x09,0x8c,0x09,0x8c,0x00,0x02,0x09,0x8d,0x09,0x8d,0x00,0x01,0x09,0x8e,0x09,0x8e,0x00,0x02,0x09,0x8f,0x09,0x8f,0x00,0x06,0x09,0x90,0x09,0x90,0x00,0x02,0x09,0x92,0x09,0x92,\r\n0x00,0x02,0x09,0x93,0x09,0x93,0x00,0x05,0x09,0x94,0x09,0x94,0x00,0x02,0x09,0x95,0x09,0x95,0x00,0x05,0x09,0x96,0x09,0x96,0x00,0x02,0x09,0x97,0x09,0x98,0x00,0x06,0x09,0x9b,0x09,0x9b,0x00,0x06,0x09,0x9e,0x09,0x9e,0x00,0x06,0x09,0xa1,0x09,0xa1,0x00,0x06,0x09,0xa4,0x09,0xa4,0x00,0x06,0x09,0xa7,0x09,0xa7,0x00,0x06,0x09,0xaa,\r\n0x09,0xac,0x00,0x02,0x09,0xae,0x09,0xae,0x00,0x02,0x09,0xb2,0x09,0xb2,0x00,0x01,0x09,0xb3,0x09,0xb6,0x00,0x09,0x09,0xb7,0x09,0xbe,0x00,0x01,0x09,0xbf,0x09,0xc3,0x00,0x02,0x09,0xc4,0x09,0xc4,0x00,0x07,0x09,0xc6,0x09,0xc6,0x00,0x02,0x09,0xc8,0x09,0xca,0x00,0x02,0x09,0xcc,0x09,0xcd,0x00,0x02,0x09,0xd2,0x09,0xd3,0x00,0x02,\r\n0x09,0xd7,0x09,0xd8,0x00,0x02,0x09,0xd9,0x09,0xda,0x00,0x08,0x09,0xdb,0x09,0xdb,0x00,0x01,0x09,0xdc,0x09,0xdc,0x00,0x08,0x09,0xdd,0x09,0xdd,0x00,0x01,0x09,0xde,0x09,0xde,0x00,0x08,0x09,0xdf,0x09,0xdf,0x00,0x01,0x09,0xe1,0x09,0xe5,0x00,0x08,0x09,0xe7,0x09,0xea,0x00,0x08,0x09,0xec,0x09,0xec,0x00,0x01,0x09,0xee,0x09,0xee,\r\n0x00,0x01,0x09,0xf0,0x09,0xf0,0x00,0x01,0x09,0xf2,0x09,0xf2,0x00,0x06,0x09,0xf9,0x09,0xf9,0x00,0x05,0x09,0xfa,0x09,0xfa,0x00,0x06,0x09,0xfd,0x09,0xfd,0x00,0x09,0x09,0xfe,0x0a,0x05,0x00,0x01,0x0a,0x07,0x0a,0x07,0x00,0x01,0x0a,0x0a,0x0a,0x0b,0x00,0x01,0x0a,0x0d,0x0a,0x0d,0x00,0x01,0x0a,0x24,0x0a,0x25,0x00,0x01,0x0a,0x26,\r\n0x0a,0x27,0x00,0x02,0x0a,0x28,0x0a,0x28,0x00,0x07,0x0a,0x2a,0x0a,0x2a,0x00,0x02,0x0a,0x3e,0x0a,0x3e,0x00,0x08,0x0a,0x56,0x0a,0x56,0x00,0x01,0x0a,0x58,0x0a,0x58,0x00,0x02,0x0a,0x5a,0x0a,0x5a,0x00,0x02,0x0a,0x63,0x0a,0x63,0x00,0x01,0x0a,0x72,0x0a,0x72,0x00,0x02,0x0a,0x73,0x0a,0x73,0x00,0x06,0x0a,0x74,0x0a,0x74,0x00,0x02,\r\n0x0a,0x76,0x0a,0x76,0x00,0x02,0x0a,0x77,0x0a,0x77,0x00,0x06,0x0a,0x78,0x0a,0x78,0x00,0x02,0x0a,0x79,0x0a,0x79,0x00,0x06,0x0a,0x7a,0x0a,0x7a,0x00,0x02,0x0a,0x7b,0x0a,0x7b,0x00,0x06,0x0a,0x7c,0x0a,0x7c,0x00,0x02,0x0a,0x7d,0x0a,0x7d,0x00,0x06,0x0a,0x7e,0x0a,0x7e,0x00,0x02,0x0a,0x7f,0x0a,0x7f,0x00,0x01,0x0a,0x80,0x0a,0x80,\r\n0x00,0x06,0x0a,0x83,0x0a,0x83,0x00,0x06,0x0a,0x86,0x0a,0x87,0x00,0x02,0x0a,0x88,0x0a,0x8a,0x00,0x01,0x0a,0x8b,0x0a,0x8b,0x00,0x07,0x0a,0x8d,0x0a,0x8d,0x00,0x02,0x0a,0x8f,0x0a,0x8f,0x00,0x07,0x0a,0x91,0x0a,0x91,0x00,0x02,0x0a,0x93,0x0a,0x93,0x00,0x07,0x0a,0x95,0x0a,0x95,0x00,0x02,0x0a,0x9d,0x0a,0x9e,0x00,0x08,0x0a,0xa0,\r\n0x0a,0xa1,0x00,0x08,0x0a,0xa3,0x0a,0xa3,0x00,0x08,0x0a,0xa6,0x0a,0xa9,0x00,0x02,0x0a,0xab,0x0a,0xab,0x00,0x06,0x0a,0xad,0x0a,0xad,0x00,0x01,0x0a,0xaf,0x0a,0xaf,0x00,0x01,0x0a,0xb2,0x0a,0xb2,0x00,0x01,0x0a,0xb4,0x0a,0xb7,0x00,0x01,0x0b,0x19,0x0b,0x19,0x00,0x02,0x0e,0x20,0x0e,0x20,0x00,0x01,0x0e,0x3a,0x0e,0x3a,0x00,0x02,\r\n0x0e,0x3d,0x0e,0x3d,0x00,0x02,0x0e,0x3f,0x0e,0x3f,0x00,0x08,0x0e,0x41,0x0e,0x41,0x00,0x08,0x0e,0x43,0x0e,0x43,0x00,0x08,0x0e,0x47,0x0e,0x47,0x00,0x01,0x0e,0x49,0x0e,0x49,0x00,0x06,0x0e,0x4b,0x0e,0x4b,0x00,0x01,0x0e,0x4d,0x0e,0x4d,0x00,0x06,0x0e,0x4f,0x0e,0x4f,0x00,0x01,0x0e,0x51,0x0e,0x51,0x00,0x06,0x0e,0x5b,0x0e,0x5c,\r\n0x00,0x02,0x0e,0x5f,0x0e,0x5f,0x00,0x02,0x0e,0x6f,0x0e,0x6f,0x00,0x02,0x0e,0x71,0x0e,0x71,0x00,0x02,0x0e,0x76,0x0e,0x76,0x00,0x01,0x0e,0xa3,0x0e,0xa3,0x00,0x02,0x0e,0xac,0x0e,0xac,0x00,0x02,0x0e,0xaf,0x0e,0xaf,0x00,0x02,0x0e,0xd1,0x0e,0xd1,0x00,0x05,0x0e,0xd7,0x0e,0xd7,0x00,0x02,0x0e,0xe7,0x0e,0xe7,0x00,0x06,0x0e,0xe9,\r\n0x0e,0xe9,0x00,0x06,0x0f,0x16,0x0f,0x16,0x00,0x06,0x0f,0x1a,0x0f,0x1a,0x00,0x06,0x0f,0x1e,0x0f,0x1e,0x00,0x01,0x0f,0x20,0x0f,0x20,0x00,0x01,0x0f,0x22,0x0f,0x22,0x00,0x01,0x0f,0x24,0x0f,0x24,0x00,0x06,0x0f,0x28,0x0f,0x28,0x00,0x01,0x0f,0x2a,0x0f,0x2a,0x00,0x01,0x0f,0x2c,0x0f,0x2c,0x00,0x01,0x0f,0x2e,0x0f,0x2e,0x00,0x06,\r\n0x0f,0x30,0x0f,0x30,0x00,0x01,0x0f,0x32,0x0f,0x32,0x00,0x06,0x0f,0x34,0x0f,0x34,0x00,0x01,0x0f,0x36,0x0f,0x36,0x00,0x06,0x0f,0x38,0x0f,0x38,0x00,0x01,0x0f,0x3a,0x0f,0x3a,0x00,0x01,0x0f,0x3c,0x0f,0x3c,0x00,0x0a,0x0f,0x3e,0x0f,0x3e,0x00,0x0a,0x0f,0x40,0x0f,0x40,0x00,0x06,0x0f,0x44,0x0f,0x44,0x00,0x01,0x0f,0x46,0x0f,0x46,\r\n0x00,0x01,0x0f,0x48,0x0f,0x48,0x00,0x01,0x0f,0x4a,0x0f,0x4a,0x00,0x01,0x0f,0x4c,0x0f,0x4c,0x00,0x01,0x0f,0x4e,0x0f,0x4e,0x00,0x08,0x0f,0x6c,0x0f,0x6c,0x00,0x01,0x0f,0x6e,0x0f,0x6e,0x00,0x01,0x0f,0x70,0x0f,0x70,0x00,0x01,0x0f,0x72,0x0f,0x72,0x00,0x01,0x0f,0x74,0x0f,0x74,0x00,0x01,0x0f,0x76,0x0f,0x76,0x00,0x01,0x0f,0x78,\r\n0x0f,0x78,0x00,0x01,0x0f,0x7a,0x0f,0x7a,0x00,0x01,0x0f,0x7c,0x0f,0x7c,0x00,0x01,0x0f,0x7e,0x0f,0x7e,0x00,0x01,0x0f,0x80,0x0f,0x80,0x00,0x01,0x0f,0x82,0x0f,0x82,0x00,0x02,0x0f,0x84,0x0f,0x84,0x00,0x02,0x0f,0x86,0x0f,0x86,0x00,0x02,0x0f,0x88,0x0f,0x88,0x00,0x02,0x0f,0x8a,0x0f,0x8a,0x00,0x02,0x0f,0x8c,0x0f,0x8c,0x00,0x01,\r\n0x0f,0x8e,0x0f,0x8e,0x00,0x01,0x0f,0x90,0x0f,0x90,0x00,0x01,0x0f,0x92,0x0f,0x92,0x00,0x01,0x0f,0x94,0x0f,0x94,0x00,0x06,0x0f,0x96,0x0f,0x96,0x00,0x01,0x0f,0xc0,0x0f,0xc0,0x00,0x01,0x10,0xfe,0x10,0xfe,0x00,0x01,0x11,0x00,0x11,0x00,0x00,0x01,0x11,0x02,0x11,0x02,0x00,0x01,0x11,0x04,0x11,0x04,0x00,0x01,0x11,0x06,0x11,0x06,\r\n0x00,0x01,0x11,0x08,0x11,0x08,0x00,0x01,0x11,0x0a,0x11,0x0a,0x00,0x01,0x11,0x0c,0x11,0x0d,0x00,0x01,0x11,0x0f,0x11,0x0f,0x00,0x01,0x14,0x53,0x14,0x53,0x00,0x07,0x14,0x54,0x14,0x54,0x00,0x01,0x14,0x55,0x14,0x57,0x00,0x02,0x14,0x58,0x14,0x59,0x00,0x01,0x14,0x5a,0x14,0x5b,0x00,0x02,0x14,0x6f,0x14,0x6f,0x00,0x02,0x14,0x72,\r\n0x14,0x72,0x00,0x08,0x14,0x75,0x14,0x75,0x00,0x05,0x14,0x78,0x14,0x78,0x00,0x06,0x14,0x7b,0x14,0x7b,0x00,0x05,0x14,0x80,0x14,0x80,0x00,0x06,0x14,0x83,0x14,0x83,0x00,0x02,0x14,0x97,0x14,0x98,0x00,0x02,0x00,0x01,0x00,0x26,0x00,0x04,0x00,0x00,0x00,0x08,0x00,0x1a,0x00,0x20,0x00,0x20,0x00,0x1a,0x00,0x1a,0x00,0x20,0x00,0x20,\r\n0x00,0x1a,0x00,0x01,0x08,0xdd,0xff,0x55,0x00,0x01,0x08,0xdb,0xff,0x55,0x00,0x02,0x00,0x06,0x08,0xd7,0x08,0xd7,0x00,0x00,0x08,0xd9,0x08,0xd9,0x00,0x01,0x08,0xde,0x08,0xdf,0x00,0x02,0x09,0x4f,0x09,0x4f,0x00,0x04,0x09,0x51,0x09,0x51,0x00,0x05,0x09,0x56,0x09,0x57,0x00,0x06,0x00,0x02,0x00,0x30,0x00,0x04,0x00,0x00,0x00,0x4c,\r\n0x00,0x80,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0xfe,0xaa,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0x00,0x00,0xff,0x55,0x00,0x00,0x00,0x02,0x00,0x04,0x08,0xd9,0x08,0xda,0x00,0x00,0x08,0xde,0x08,0xdf,0x00,0x02,0x09,0x51,0x09,0x53,0x00,0x04,0x09,0x55,0x09,0x57,\r\n0x00,0x07,0x00,0x02,0x00,0x08,0x08,0xd9,0x08,0xda,0x00,0x01,0x08,0xde,0x08,0xde,0x00,0x01,0x08,0xdf,0x08,0xdf,0x00,0x03,0x09,0x51,0x09,0x52,0x00,0x01,0x09,0x53,0x09,0x53,0x00,0x02,0x09,0x55,0x09,0x55,0x00,0x02,0x09,0x56,0x09,0x56,0x00,0x01,0x09,0x57,0x09,0x57,0x00,0x03,0x00,0x02,0x00,0x0a,0x08,0xd7,0x08,0xd7,0x00,0x01,\r\n0x08,0xdc,0x08,0xdc,0x00,0x01,0x08,0xde,0x08,0xde,0x00,0x02,0x08,0xdf,0x08,0xdf,0x00,0x03,0x08,0xe0,0x08,0xe0,0x00,0x02,0x09,0x4f,0x09,0x4f,0x00,0x01,0x09,0x54,0x09,0x55,0x00,0x01,0x09,0x56,0x09,0x56,0x00,0x02,0x09,0x57,0x09,0x57,0x00,0x03,0x09,0x58,0x09,0x58,0x00,0x02,0x00,0x01,0x10,0xc6,0x00,0x04,0x00,0x00,0x00,0x57,\r\n0x00,0xb8,0x01,0xbe,0x01,0xe4,0x02,0x3e,0x02,0xa8,0x03,0x2a,0x03,0x70,0x03,0xa6,0x04,0xf0,0x06,0x16,0x06,0x9c,0x07,0x96,0x08,0x14,0x09,0x0a,0x09,0x50,0x0b,0x7a,0x0b,0xa8,0x0d,0x72,0x0e,0x88,0x0e,0xde,0x10,0x88,0x00,0xb8,0x00,0xb8,0x01,0xe4,0x06,0x16,0x0b,0x7a,0x06,0x16,0x00,0xb8,0x00,0xb8,0x06,0x16,0x06,0x16,0x0e,0xde,\r\n0x00,0xb8,0x00,0xb8,0x06,0x16,0x06,0x16,0x06,0x16,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x09,0x0a,0x10,0x88,0x02,0x3e,0x0e,0xde,0x03,0x2a,0x09,0x0a,0x01,0xe4,0x01,0xe4,0x00,0xb8,0x00,0xb8,0x04,0xf0,0x06,0x16,0x08,0x14,0x08,0x14,0x09,0x0a,0x09,0x50,0x09,0x50,0x0b,0x7a,0x0b,0x7a,0x10,0x88,0x10,0x88,0x00,0xb8,0x01,0xe4,0x03,0x2a,\r\n0x03,0x2a,0x03,0x2a,0x03,0x70,0x03,0xa6,0x04,0xf0,0x06,0x16,0x06,0x16,0x08,0x14,0x09,0x0a,0x09,0x50,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x0b,0x7a,0x0d,0x72,0x0e,0xde,0x00,0xb8,0x06,0x16,0x0d,0x72,0x0d,0x72,0x0d,0x72,0x0e,0xde,0x09,0x0a,0x00,0x41,0x00,0x26,0xff,0xd8,0x00,0x2a,0xff,0xd8,0x00,0x2d,0x00,0x5e,0x00,0x32,0xff,0xd8,\r\n0x00,0x37,0xff,0x6d,0x00,0x38,0xff,0xd8,0x00,0x39,0xff,0x74,0x00,0x3a,0xff,0x74,0x00,0x3c,0xff,0x74,0x00,0x3d,0x00,0x3c,0x00,0x59,0xff,0xd8,0x00,0x5a,0xff,0xd8,0x00,0x5c,0xff,0xd8,0x00,0x64,0xff,0xd8,0x00,0x67,0xff,0xd8,0x00,0x68,0xff,0xd8,0x00,0x92,0xff,0xd8,0x00,0xaf,0xff,0xd8,0x00,0xb0,0xff,0xd8,0x00,0xba,0xff,0xd8,\r\n0x00,0xbb,0xff,0x74,0x00,0xd0,0xff,0xd8,0x00,0xd1,0xff,0xd8,0x00,0xd2,0xff,0xd8,0x00,0xd3,0xff,0xd8,0x00,0xd4,0xff,0xd8,0x00,0xd5,0xff,0xd8,0x00,0xe5,0x00,0x3c,0x00,0xea,0xff,0x74,0x00,0xeb,0xff,0xd8,0x00,0xf7,0xff,0xd8,0x00,0xfc,0xff,0xd8,0x00,0xfe,0xff,0xd8,0x01,0x18,0xff,0xd8,0x01,0x20,0xff,0x6d,0x01,0x22,0xff,0x6d,\r\n0x01,0x24,0xff,0xd8,0x01,0x26,0xff,0xd8,0x01,0x28,0x00,0x3c,0x01,0x2a,0x00,0x3c,0x01,0x47,0xff,0xd8,0x01,0x51,0xff,0xd8,0x01,0x53,0xff,0xd8,0x01,0x55,0xff,0xd8,0x01,0x63,0x00,0x5e,0x01,0x6e,0xff,0xd8,0x01,0x70,0xff,0xd8,0x01,0x76,0xff,0x6d,0x01,0x78,0xff,0xd8,0x01,0x7a,0xff,0xd8,0x01,0x7c,0xff,0xd8,0x01,0x7e,0xff,0xd8,\r\n0x01,0x80,0xff,0x74,0x01,0x81,0xff,0xd8,0x01,0x82,0xff,0x74,0x01,0x83,0xff,0xd8,0x01,0x89,0xff,0xd8,0x01,0x8c,0xff,0x74,0x01,0x8d,0xff,0xd8,0x01,0x8e,0xff,0x74,0x01,0x8f,0xff,0xd8,0x01,0x90,0xff,0x74,0x01,0x91,0xff,0xd8,0x01,0x92,0xff,0x74,0x01,0x93,0xff,0xd8,0x00,0x09,0x00,0x37,0xff,0xa4,0x00,0x3c,0xff,0xbe,0x00,0xbb,\r\n0xff,0xbe,0x00,0xea,0xff,0xbe,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x76,0xff,0xa4,0x01,0x82,0xff,0xbe,0x01,0x92,0xff,0xbe,0x00,0x16,0x00,0x26,0xff,0xc9,0x00,0x2a,0xff,0xc9,0x00,0x32,0xff,0xc9,0x00,0x64,0xff,0xc9,0x00,0x67,0xff,0xc9,0x00,0x92,0xff,0xc9,0x00,0xaf,0xff,0xc9,0x00,0xb0,0xff,0xc9,0x00,0xd0,0xff,0xc9,\r\n0x00,0xd1,0xff,0xc9,0x00,0xd2,0xff,0xc9,0x00,0xf7,0xff,0xc9,0x00,0xfc,0xff,0xc9,0x00,0xfe,0xff,0xc9,0x01,0x18,0xff,0xc9,0x01,0x47,0xff,0xc9,0x01,0x51,0xff,0xc9,0x01,0x53,0xff,0xc9,0x01,0x55,0xff,0xc9,0x01,0x6e,0xff,0xc9,0x01,0x70,0xff,0xc9,0x01,0x89,0xff,0xc9,0x00,0x1a,0x00,0x24,0xff,0xce,0x00,0x37,0xff,0xa4,0x00,0x39,\r\n0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xc4,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,\r\n0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x85,0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,0xff,0xce,0x01,0x90,0xff,0xce,0x00,0x20,0x00,0x24,0xff,0x88,0x00,0x2d,0xff,0xbe,0x00,0x44,0xff,0xba,0x00,0x62,0xff,0x88,0x00,0x63,0xff,0x88,0x00,0x69,0xff,0xba,0x00,0x6a,0xff,0xba,0x00,0x6b,0xff,0xba,\r\n0x00,0x6c,0xff,0xba,0x00,0x6d,0xff,0xba,0x00,0x6e,0xff,0xba,0x00,0x75,0x00,0x32,0x00,0x76,0x00,0x32,0x00,0x77,0x00,0x32,0x00,0xa0,0xff,0xba,0x00,0xad,0xff,0x88,0x00,0xae,0xff,0x88,0x00,0xc7,0xff,0x88,0x00,0xc9,0xff,0x88,0x01,0x03,0xff,0x88,0x01,0x04,0xff,0xba,0x01,0x05,0xff,0x88,0x01,0x06,0xff,0xba,0x01,0x45,0xff,0x88,\r\n0x01,0x46,0xff,0xba,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0xff,0xbe,0x01,0x85,0xff,0x88,0x01,0x86,0xff,0xba,0x01,0x88,0xff,0xba,0x00,0x11,0x00,0x37,0xff,0xcf,0x00,0x39,0xff,0xd8,0x00,0x3a,0xff,0xd8,0x00,0x3b,0xff,0xd8,0x00,0x5c,0xff,0xd8,0x00,0x5d,0xff,0xd8,0x00,0xba,0xff,0xd8,0x00,0xeb,\r\n0xff,0xd8,0x01,0x20,0xff,0xcf,0x01,0x22,0xff,0xcf,0x01,0x76,0xff,0xcf,0x01,0x80,0xff,0xd8,0x01,0x83,0xff,0xd8,0x01,0x8c,0xff,0xd8,0x01,0x8e,0xff,0xd8,0x01,0x90,0xff,0xd8,0x01,0x93,0xff,0xd8,0x00,0x0d,0x00,0x24,0xff,0xce,0x00,0x2d,0xff,0xb0,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,\r\n0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x63,0xff,0xb0,0x01,0x85,0xff,0xce,0x00,0x52,0x00,0x26,0xff,0xa6,0x00,0x2a,0xff,0xa6,0x00,0x2d,0x00,0x5a,0x00,0x32,0xff,0xa6,0x00,0x39,0x00,0x28,0x00,0x3a,0x00,0x28,0x00,0x3b,0x00,0x32,0x00,0x3c,0x00,0x28,0x00,0x3d,\r\n0x00,0x28,0x00,0x46,0xff,0xe5,0x00,0x47,0xff,0xe5,0x00,0x48,0xff,0xe5,0x00,0x4a,0xff,0xe5,0x00,0x52,0xff,0xce,0x00,0x54,0xff,0xce,0x00,0x57,0xff,0xd1,0x00,0x59,0xff,0xba,0x00,0x5a,0xff,0xba,0x00,0x5b,0x00,0x1e,0x00,0x5c,0xff,0xa6,0x00,0x64,0xff,0xa6,0x00,0x67,0xff,0xa6,0x00,0x79,0xff,0xce,0x00,0x7a,0xff,0xce,0x00,0x7b,\r\n0xff,0xce,0x00,0x7c,0xff,0xce,0x00,0x7d,0xff,0xce,0x00,0x92,0xff,0xa6,0x00,0xaf,0xff,0xa6,0x00,0xb0,0xff,0xa6,0x00,0xb1,0xff,0xce,0x00,0xba,0xff,0xa6,0x00,0xbb,0x00,0x28,0x00,0xd0,0xff,0xa6,0x00,0xd1,0xff,0xa6,0x00,0xd2,0xff,0xa6,0x00,0xe5,0x00,0x28,0x00,0xea,0x00,0x28,0x00,0xeb,0xff,0xa6,0x00,0xf7,0xff,0xa6,0x00,0xf8,\r\n0xff,0xe5,0x00,0xfc,0xff,0xa6,0x00,0xfd,0xff,0xe5,0x00,0xfe,0xff,0xa6,0x00,0xff,0xff,0xe5,0x01,0x00,0xff,0xe5,0x01,0x08,0xff,0xe5,0x01,0x0b,0xff,0xe5,0x01,0x18,0xff,0xa6,0x01,0x19,0xff,0xce,0x01,0x21,0xff,0xd1,0x01,0x23,0xff,0xd1,0x01,0x28,0x00,0x28,0x01,0x2a,0x00,0x28,0x01,0x47,0xff,0xa6,0x01,0x48,0xff,0xe5,0x01,0x51,\r\n0xff,0xa6,0x01,0x52,0xff,0xe5,0x01,0x53,0xff,0xa6,0x01,0x54,0xff,0xe5,0x01,0x55,0xff,0xa6,0x01,0x56,0xff,0xe5,0x01,0x63,0x00,0x5a,0x01,0x6e,0xff,0xa6,0x01,0x6f,0xff,0xce,0x01,0x70,0xff,0xa6,0x01,0x71,0xff,0xce,0x01,0x77,0xff,0xd1,0x01,0x80,0x00,0x28,0x01,0x81,0xff,0xba,0x01,0x82,0x00,0x28,0x01,0x83,0xff,0xa6,0x01,0x89,\r\n0xff,0xa6,0x01,0x8a,0xff,0xce,0x01,0x8c,0x00,0x28,0x01,0x8d,0xff,0xba,0x01,0x8e,0x00,0x28,0x01,0x8f,0xff,0xba,0x01,0x90,0x00,0x28,0x01,0x91,0xff,0xba,0x01,0x92,0x00,0x28,0x01,0x93,0xff,0xa6,0x00,0x49,0x00,0x24,0x00,0x3c,0x00,0x26,0xff,0xba,0x00,0x2a,0xff,0xbe,0x00,0x2d,0x00,0x64,0x00,0x32,0xff,0xba,0x00,0x37,0xff,0x74,\r\n0x00,0x38,0xff,0xd8,0x00,0x39,0xff,0x88,0x00,0x3a,0xff,0x88,0x00,0x3c,0xff,0x88,0x00,0x3d,0x00,0x3b,0x00,0x57,0xff,0xe5,0x00,0x59,0xff,0x9c,0x00,0x5a,0xff,0x9c,0x00,0x5c,0xff,0x9c,0x00,0x62,0x00,0x3c,0x00,0x63,0x00,0x3c,0x00,0x64,0xff,0xba,0x00,0x68,0xff,0xd8,0x00,0xad,0x00,0x3c,0x00,0xae,0x00,0x3c,0x00,0xba,0xff,0x9c,\r\n0x00,0xbb,0xff,0x88,0x00,0xc7,0x00,0x3c,0x00,0xc9,0x00,0x3c,0x00,0xd3,0xff,0xd8,0x00,0xd4,0xff,0xd8,0x00,0xd5,0xff,0xd8,0x00,0xe5,0x00,0x3b,0x00,0xea,0xff,0x88,0x00,0xeb,0xff,0x9c,0x00,0xf7,0xff,0xbe,0x00,0xfc,0xff,0xba,0x00,0xfe,0xff,0xba,0x01,0x03,0x00,0x3c,0x01,0x05,0x00,0x3c,0x01,0x18,0xff,0xba,0x01,0x20,0xff,0x74,\r\n0x01,0x21,0xff,0xe5,0x01,0x22,0xff,0x74,0x01,0x23,0xff,0xe5,0x01,0x24,0xff,0xd8,0x01,0x26,0xff,0xd8,0x01,0x28,0x00,0x3b,0x01,0x2a,0x00,0x3b,0x01,0x45,0x00,0x3c,0x01,0x47,0xff,0xba,0x01,0x51,0xff,0xbe,0x01,0x53,0xff,0xbe,0x01,0x55,0xff,0xbe,0x01,0x63,0x00,0x64,0x01,0x6e,0xff,0xba,0x01,0x70,0xff,0xba,0x01,0x76,0xff,0x74,\r\n0x01,0x77,0xff,0xe5,0x01,0x78,0xff,0xd8,0x01,0x7a,0xff,0xd8,0x01,0x7c,0xff,0xd8,0x01,0x7e,0xff,0xd8,0x01,0x80,0xff,0x88,0x01,0x81,0xff,0x9c,0x01,0x82,0xff,0x88,0x01,0x83,0xff,0x9c,0x01,0x85,0x00,0x3c,0x01,0x89,0xff,0xba,0x01,0x8c,0xff,0x88,0x01,0x8d,0xff,0x9c,0x01,0x8e,0xff,0x88,0x01,0x8f,0xff,0x9c,0x01,0x90,0xff,0x88,\r\n0x01,0x91,0xff,0x9c,0x01,0x92,0xff,0x88,0x01,0x93,0xff,0x9c,0x00,0x21,0x00,0x24,0xff,0xce,0x00,0x2d,0xff,0xf6,0x00,0x37,0xff,0xa4,0x00,0x39,0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xce,0x00,0x3c,0xff,0xce,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xbb,\r\n0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x00,0xea,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x63,0xff,0xf6,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x82,0xff,0xce,0x01,0x85,\r\n0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,0xff,0xce,0x01,0x90,0xff,0xce,0x01,0x92,0xff,0xce,0x00,0x3e,0x00,0x24,0xff,0x74,0x00,0x2d,0xff,0x7f,0x00,0x3b,0xff,0xce,0x00,0x44,0xff,0xba,0x00,0x46,0xff,0xb4,0x00,0x47,0xff,0xb4,0x00,0x48,0xff,0xb4,0x00,0x4a,0xff,0xb4,0x00,0x52,0xff,0xb4,0x00,0x54,0xff,0xb4,0x00,0x62,0xff,0x74,\r\n0x00,0x63,0xff,0x74,0x00,0x69,0xff,0xba,0x00,0x6a,0xff,0xba,0x00,0x6b,0xff,0xba,0x00,0x6c,0xff,0xba,0x00,0x6d,0xff,0xba,0x00,0x6e,0xff,0xba,0x00,0x6f,0xff,0xb4,0x00,0x70,0xff,0xb4,0x00,0x71,0xff,0xb4,0x00,0x72,0xff,0xb4,0x00,0x73,0xff,0xb4,0x00,0x79,0xff,0xb4,0x00,0x7a,0xff,0xb4,0x00,0x7b,0xff,0xb4,0x00,0x7c,0xff,0xb4,\r\n0x00,0x7d,0xff,0xb4,0x00,0xa0,0xff,0xba,0x00,0xad,0xff,0x74,0x00,0xae,0xff,0x74,0x00,0xb1,0xff,0xb4,0x00,0xc7,0xff,0x74,0x00,0xc9,0xff,0x74,0x00,0xf8,0xff,0xb4,0x00,0xfd,0xff,0xb4,0x00,0xff,0xff,0xb4,0x01,0x00,0xff,0xb4,0x01,0x03,0xff,0x74,0x01,0x04,0xff,0xba,0x01,0x05,0xff,0x74,0x01,0x06,0xff,0xba,0x01,0x08,0xff,0xb4,\r\n0x01,0x0b,0xff,0xb4,0x01,0x0d,0xff,0xb4,0x01,0x19,0xff,0xb4,0x01,0x45,0xff,0x74,0x01,0x46,0xff,0xba,0x01,0x48,0xff,0xb4,0x01,0x4c,0xff,0xb4,0x01,0x4e,0xff,0xb4,0x01,0x50,0xff,0xb4,0x01,0x52,0xff,0xb4,0x01,0x54,0xff,0xb4,0x01,0x56,0xff,0xb4,0x01,0x63,0xff,0x7f,0x01,0x6f,0xff,0xb4,0x01,0x71,0xff,0xb4,0x01,0x85,0xff,0x74,\r\n0x01,0x86,0xff,0xba,0x01,0x88,0xff,0xba,0x01,0x8a,0xff,0xb4,0x00,0x1f,0x00,0x24,0xff,0xce,0x00,0x37,0xff,0xa4,0x00,0x39,0xff,0xce,0x00,0x3a,0xff,0xce,0x00,0x3b,0xff,0xce,0x00,0x3c,0xff,0xce,0x00,0x3d,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xbb,0xff,0xce,0x00,0xc7,\r\n0xff,0xce,0x00,0xc9,0xff,0xce,0x00,0xe5,0xff,0xce,0x00,0xea,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x28,0xff,0xce,0x01,0x2a,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x76,0xff,0xa4,0x01,0x80,0xff,0xce,0x01,0x82,0xff,0xce,0x01,0x85,0xff,0xce,0x01,0x8c,0xff,0xce,0x01,0x8e,\r\n0xff,0xce,0x01,0x90,0xff,0xce,0x01,0x92,0xff,0xce,0x00,0x3d,0x00,0x26,0xff,0xe3,0x00,0x2a,0xff,0xe3,0x00,0x2d,0x00,0x39,0x00,0x32,0xff,0xec,0x00,0x37,0xff,0xa4,0x00,0x3c,0xff,0xd9,0x00,0x46,0xff,0xc4,0x00,0x47,0xff,0xc4,0x00,0x48,0xff,0xc4,0x00,0x4a,0xff,0xc4,0x00,0x52,0xff,0xc4,0x00,0x54,0xff,0xcb,0x00,0x64,0xff,0xe3,\r\n0x00,0x6f,0xff,0xc4,0x00,0x70,0xff,0xc4,0x00,0x71,0xff,0xc4,0x00,0x72,0xff,0xc4,0x00,0x73,0xff,0xc4,0x00,0x79,0xff,0xc4,0x00,0x7a,0xff,0xc4,0x00,0x7b,0xff,0xc4,0x00,0x7c,0xff,0xc4,0x00,0x7d,0xff,0xc4,0x00,0xb1,0xff,0xc4,0x00,0xbb,0xff,0xd9,0x00,0xea,0xff,0xd9,0x00,0xf7,0xff,0xe3,0x00,0xf8,0xff,0xc4,0x00,0xfc,0xff,0xe3,\r\n0x00,0xfd,0xff,0xc4,0x00,0xfe,0xff,0xe3,0x00,0xff,0xff,0xc4,0x01,0x00,0xff,0xc4,0x01,0x08,0xff,0xc4,0x01,0x0b,0xff,0xc4,0x01,0x0d,0xff,0xc4,0x01,0x18,0xff,0xec,0x01,0x19,0xff,0xc4,0x01,0x20,0xff,0xa4,0x01,0x22,0xff,0xa4,0x01,0x47,0xff,0xe3,0x01,0x48,0xff,0xc4,0x01,0x4c,0xff,0xc4,0x01,0x4e,0xff,0xc4,0x01,0x50,0xff,0xc4,\r\n0x01,0x51,0xff,0xe3,0x01,0x52,0xff,0xc4,0x01,0x53,0xff,0xe3,0x01,0x54,0xff,0xc4,0x01,0x55,0xff,0xe3,0x01,0x56,0xff,0xc4,0x01,0x63,0x00,0x39,0x01,0x6e,0xff,0xec,0x01,0x6f,0xff,0xc4,0x01,0x70,0xff,0xec,0x01,0x71,0xff,0xc4,0x01,0x76,0xff,0xa4,0x01,0x82,0xff,0xd9,0x01,0x89,0xff,0xec,0x01,0x8a,0xff,0xc4,0x01,0x92,0xff,0xd9,\r\n0x00,0x11,0x00,0x57,0xff,0xbe,0x00,0x59,0xff,0xce,0x00,0x5a,0xff,0xe2,0x00,0x5b,0xff,0xe2,0x00,0x5c,0xff,0xc4,0x00,0x5d,0xff,0xc4,0x00,0xba,0xff,0xc4,0x00,0xeb,0xff,0xc4,0x01,0x21,0xff,0xbe,0x01,0x23,0xff,0xbe,0x01,0x77,0xff,0xbe,0x01,0x81,0xff,0xe2,0x01,0x83,0xff,0xc4,0x01,0x8d,0xff,0xe2,0x01,0x8f,0xff,0xe2,0x01,0x91,\r\n0xff,0xe2,0x01,0x93,0xff,0xc4,0x00,0x8a,0x00,0x24,0xff,0x74,0x00,0x26,0xff,0xa1,0x00,0x2a,0xff,0xa1,0x00,0x2d,0xff,0x8f,0x00,0x32,0xff,0xa1,0x00,0x36,0xff,0xd8,0x00,0x37,0x00,0x28,0x00,0x39,0x00,0x2b,0x00,0x3a,0x00,0x2b,0x00,0x3c,0x00,0x28,0x00,0x44,0xff,0x1a,0x00,0x46,0xff,0x38,0x00,0x47,0xff,0x38,0x00,0x48,0xff,0x38,\r\n0x00,0x49,0xff,0xa0,0x00,0x4a,0xff,0x38,0x00,0x50,0xff,0x4e,0x00,0x51,0xff,0x4e,0x00,0x52,0xff,0x38,0x00,0x53,0xff,0x4e,0x00,0x54,0xff,0x38,0x00,0x55,0xff,0x4e,0x00,0x56,0xff,0x66,0x00,0x59,0xff,0x9a,0x00,0x5a,0xff,0x8f,0x00,0x5b,0xff,0x4c,0x00,0x5c,0xff,0x8f,0x00,0x5d,0xff,0x8f,0x00,0x62,0xff,0x74,0x00,0x63,0xff,0x74,\r\n0x00,0x64,0xff,0xa1,0x00,0x67,0xff,0xa1,0x00,0x69,0xff,0x1a,0x00,0x6a,0xff,0x1a,0x00,0x6b,0xff,0x1a,0x00,0x6c,0xff,0x38,0x00,0x6d,0xff,0x38,0x00,0x6e,0xff,0x1a,0x00,0x6f,0xff,0x38,0x00,0x70,0xff,0x38,0x00,0x71,0xff,0x38,0x00,0x72,0xff,0x38,0x00,0x73,0xff,0x38,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x32,0x00,0x77,0x00,0x32,\r\n0x00,0x79,0xff,0x38,0x00,0x7a,0xff,0x38,0x00,0x7b,0xff,0x38,0x00,0x7c,0xff,0x38,0x00,0x7d,0xff,0x38,0x00,0x92,0xff,0xa1,0x00,0xa0,0xff,0x1a,0x00,0xad,0xff,0x74,0x00,0xae,0xff,0x74,0x00,0xaf,0xff,0xa1,0x00,0xb0,0xff,0xa1,0x00,0xb1,0xff,0x38,0x00,0xba,0xff,0x8f,0x00,0xbb,0x00,0x28,0x00,0xc7,0xff,0x74,0x00,0xc9,0xff,0x74,\r\n0x00,0xd0,0xff,0xa1,0x00,0xd1,0xff,0xa1,0x00,0xd2,0xff,0xa1,0x00,0xe3,0xff,0xd8,0x00,0xe4,0xff,0x66,0x00,0xea,0x00,0x28,0x00,0xeb,0xff,0x8f,0x00,0xf7,0xff,0xa1,0x00,0xf8,0xff,0x38,0x00,0xfa,0xff,0xd8,0x00,0xfb,0xff,0x66,0x00,0xfc,0xff,0xa1,0x00,0xfd,0xff,0x38,0x00,0xfe,0xff,0xa1,0x00,0xff,0xff,0x38,0x01,0x00,0xff,0x38,\r\n0x01,0x03,0xff,0x74,0x01,0x04,0xff,0x38,0x01,0x05,0xff,0x74,0x01,0x06,0xff,0x1a,0x01,0x08,0xff,0x38,0x01,0x0b,0xff,0x38,0x01,0x0d,0xff,0x38,0x01,0x18,0xff,0xa1,0x01,0x19,0xff,0x38,0x01,0x1b,0xff,0x4e,0x01,0x1d,0xff,0x4e,0x01,0x1e,0xff,0xd8,0x01,0x1f,0xff,0x66,0x01,0x20,0x00,0x28,0x01,0x22,0x00,0x28,0x01,0x45,0xff,0x74,\r\n0x01,0x46,0xff,0x38,0x01,0x47,0xff,0xa1,0x01,0x48,0xff,0x38,0x01,0x4c,0xff,0x38,0x01,0x4e,0xff,0x38,0x01,0x50,0xff,0x38,0x01,0x51,0xff,0xa1,0x01,0x52,0xff,0x38,0x01,0x53,0xff,0xa1,0x01,0x54,0xff,0x38,0x01,0x55,0xff,0xa1,0x01,0x56,0xff,0x38,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0xff,0x8f,\r\n0x01,0x6d,0xff,0x4e,0x01,0x6e,0xff,0xa1,0x01,0x6f,0xff,0x38,0x01,0x70,0xff,0xa1,0x01,0x71,0xff,0x38,0x01,0x73,0xff,0x4e,0x01,0x74,0xff,0xd8,0x01,0x75,0xff,0x66,0x01,0x76,0x00,0x28,0x01,0x80,0x00,0x2b,0x01,0x81,0xff,0x8f,0x01,0x82,0x00,0x28,0x01,0x83,0xff,0x8f,0x01,0x85,0xff,0x74,0x01,0x86,0xff,0x38,0x01,0x88,0xff,0x1a,\r\n0x01,0x89,0xff,0xa1,0x01,0x8a,0xff,0x38,0x01,0x8c,0x00,0x2b,0x01,0x8d,0xff,0x8f,0x01,0x8e,0x00,0x2b,0x01,0x8f,0xff,0x8f,0x01,0x90,0x00,0x2b,0x01,0x91,0xff,0x8f,0x01,0x92,0x00,0x28,0x01,0x93,0xff,0x8f,0x02,0x3d,0xff,0xd8,0x02,0x3e,0xff,0x66,0x00,0x0b,0x00,0x24,0xff,0xce,0x00,0x62,0xff,0xce,0x00,0x63,0xff,0xce,0x00,0xad,\r\n0xff,0xce,0x00,0xae,0xff,0xce,0x00,0xc7,0xff,0xce,0x00,0xc9,0xff,0xce,0x01,0x03,0xff,0xce,0x01,0x05,0xff,0xce,0x01,0x45,0xff,0xce,0x01,0x85,0xff,0xce,0x00,0x72,0x00,0x24,0xff,0x88,0x00,0x26,0xff,0xce,0x00,0x2a,0xff,0xce,0x00,0x2d,0xff,0xba,0x00,0x32,0xff,0xce,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0x6a,0x00,0x46,0xff,0x7e,\r\n0x00,0x47,0xff,0x7e,0x00,0x48,0xff,0x7e,0x00,0x4a,0xff,0x7e,0x00,0x50,0xff,0xb0,0x00,0x51,0xff,0xb0,0x00,0x52,0xff,0x7e,0x00,0x53,0xff,0xb4,0x00,0x54,0xff,0x7e,0x00,0x55,0xff,0xb4,0x00,0x56,0xff,0xbe,0x00,0x58,0xff,0xce,0x00,0x62,0xff,0x88,0x00,0x63,0xff,0x88,0x00,0x64,0xff,0xce,0x00,0x67,0xff,0xce,0x00,0x69,0xff,0x6a,\r\n0x00,0x6a,0xff,0x6a,0x00,0x6b,0xff,0x6a,0x00,0x6c,0xff,0x6a,0x00,0x6d,0xff,0x6a,0x00,0x6e,0xff,0x6a,0x00,0x6f,0xff,0x7e,0x00,0x70,0xff,0x7e,0x00,0x71,0xff,0x7e,0x00,0x72,0xff,0x7e,0x00,0x73,0xff,0x7e,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x1e,0x00,0x77,0x00,0x3c,0x00,0x79,0xff,0x7e,0x00,0x7a,0xff,0x7e,0x00,0x7b,0xff,0x7e,\r\n0x00,0x7c,0xff,0x7e,0x00,0x7d,0xff,0x7e,0x00,0x92,0xff,0xce,0x00,0xa0,0xff,0x6a,0x00,0xad,0xff,0x88,0x00,0xae,0xff,0x88,0x00,0xaf,0xff,0xce,0x00,0xb0,0xff,0xce,0x00,0xb1,0xff,0x7e,0x00,0xc7,0xff,0x88,0x00,0xc9,0xff,0x88,0x00,0xd0,0xff,0xce,0x00,0xd1,0xff,0xce,0x00,0xd2,0xff,0xce,0x00,0xe4,0xff,0xbe,0x00,0xf7,0xff,0xce,\r\n0x00,0xf8,0xff,0x7e,0x00,0xfb,0xff,0xbe,0x00,0xfc,0xff,0xce,0x00,0xfd,0xff,0x7e,0x00,0xfe,0xff,0xce,0x00,0xff,0xff,0x7e,0x01,0x00,0xff,0x7e,0x01,0x03,0xff,0x88,0x01,0x04,0xff,0x6a,0x01,0x05,0xff,0x88,0x01,0x06,0xff,0x6a,0x01,0x08,0xff,0x7e,0x01,0x0b,0xff,0x7e,0x01,0x0d,0xff,0x7e,0x01,0x18,0xff,0xce,0x01,0x19,0xff,0x7e,\r\n0x01,0x1b,0xff,0xb4,0x01,0x1d,0xff,0xb4,0x01,0x1f,0xff,0xbe,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x25,0xff,0xce,0x01,0x27,0xff,0xce,0x01,0x45,0xff,0x88,0x01,0x46,0xff,0x6a,0x01,0x47,0xff,0xce,0x01,0x48,0xff,0x7e,0x01,0x4c,0xff,0x7e,0x01,0x4e,0xff,0x7e,0x01,0x50,0xff,0x7e,0x01,0x51,0xff,0xce,0x01,0x52,0xff,0x7e,\r\n0x01,0x53,0xff,0xce,0x01,0x54,0xff,0x7e,0x01,0x55,0xff,0xce,0x01,0x56,0xff,0x7e,0x01,0x5c,0x00,0x3c,0x01,0x5e,0x00,0x3c,0x01,0x60,0x00,0x3c,0x01,0x63,0xff,0xba,0x01,0x6d,0xff,0xb0,0x01,0x6e,0xff,0xce,0x01,0x6f,0xff,0x7e,0x01,0x70,0xff,0xce,0x01,0x71,0xff,0x7e,0x01,0x73,0xff,0xb4,0x01,0x75,0xff,0xbe,0x01,0x76,0x00,0x27,\r\n0x01,0x79,0xff,0xce,0x01,0x7b,0xff,0xce,0x01,0x7d,0xff,0xce,0x01,0x7f,0xff,0xce,0x01,0x85,0xff,0x88,0x01,0x86,0xff,0x6a,0x01,0x88,0xff,0x6a,0x01,0x89,0xff,0xce,0x01,0x8a,0xff,0x7e,0x02,0x3e,0xff,0xbe,0x00,0x45,0x00,0x24,0xff,0xb0,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0xb0,0x00,0x46,0xff,0xb0,0x00,0x47,0xff,0xb0,0x00,0x48,\r\n0xff,0xb0,0x00,0x4a,0xff,0xb0,0x00,0x52,0xff,0xb0,0x00,0x54,0xff,0xb0,0x00,0x62,0xff,0xb0,0x00,0x63,0xff,0xb0,0x00,0x69,0xff,0xb0,0x00,0x6a,0xff,0xb0,0x00,0x6b,0xff,0xb0,0x00,0x6c,0xff,0xb0,0x00,0x6d,0xff,0xb0,0x00,0x6e,0xff,0xb0,0x00,0x6f,0xff,0xb0,0x00,0x70,0xff,0xb0,0x00,0x71,0xff,0xb0,0x00,0x72,0xff,0xb0,0x00,0x73,\r\n0xff,0xb0,0x00,0x75,0x00,0x1e,0x00,0x76,0x00,0x1e,0x00,0x77,0x00,0x3c,0x00,0x79,0xff,0xb0,0x00,0x7a,0xff,0xb0,0x00,0x7b,0xff,0xb0,0x00,0x7c,0xff,0xb0,0x00,0x7d,0xff,0xb0,0x00,0xa0,0xff,0xb0,0x00,0xad,0xff,0xb0,0x00,0xae,0xff,0xb0,0x00,0xb1,0xff,0xb0,0x00,0xc7,0xff,0xb0,0x00,0xc9,0xff,0xb0,0x00,0xf8,0xff,0xb0,0x00,0xfd,\r\n0xff,0xb0,0x00,0xff,0xff,0xb0,0x01,0x00,0xff,0xb0,0x01,0x03,0xff,0xb0,0x01,0x04,0xff,0xb0,0x01,0x05,0xff,0xb0,0x01,0x06,0xff,0xb0,0x01,0x08,0xff,0xb0,0x01,0x0b,0xff,0xb0,0x01,0x0d,0xff,0xb0,0x01,0x19,0xff,0xb0,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x45,0xff,0xb0,0x01,0x46,0xff,0xb0,0x01,0x48,0xff,0xb0,0x01,0x4c,\r\n0xff,0xb0,0x01,0x4e,0xff,0xb0,0x01,0x50,0xff,0xb0,0x01,0x52,0xff,0xb0,0x01,0x54,0xff,0xb0,0x01,0x56,0xff,0xb0,0x01,0x5c,0x00,0x3c,0x01,0x5e,0x00,0x3c,0x01,0x60,0x00,0x3c,0x01,0x6f,0xff,0xb0,0x01,0x71,0xff,0xb0,0x01,0x76,0x00,0x27,0x01,0x85,0xff,0xb0,0x01,0x86,0xff,0xb0,0x01,0x88,0xff,0xb0,0x01,0x8a,0xff,0xb0,0x00,0x15,\r\n0x00,0x26,0xff,0xe9,0x00,0x2a,0xff,0xe9,0x00,0x2d,0x00,0x60,0x00,0x32,0xff,0xe9,0x00,0x37,0x00,0x21,0x00,0x64,0xff,0xe9,0x00,0xf7,0xff,0xe9,0x00,0xfc,0xff,0xe9,0x00,0xfe,0xff,0xe9,0x01,0x18,0xff,0xe9,0x01,0x20,0x00,0x21,0x01,0x22,0x00,0x21,0x01,0x47,0xff,0xe9,0x01,0x51,0xff,0xe9,0x01,0x53,0xff,0xe9,0x01,0x55,0xff,0xe9,\r\n0x01,0x63,0x00,0x60,0x01,0x6e,0xff,0xe9,0x01,0x70,0xff,0xe9,0x01,0x76,0x00,0x21,0x01,0x89,0xff,0xe9,0x00,0x6a,0x00,0x24,0xff,0x60,0x00,0x26,0xff,0xb0,0x00,0x2a,0xff,0xb0,0x00,0x2d,0xff,0xbe,0x00,0x32,0xff,0xb0,0x00,0x37,0x00,0x27,0x00,0x44,0xff,0x4c,0x00,0x46,0xff,0x4c,0x00,0x47,0xff,0x4c,0x00,0x48,0xff,0x4c,0x00,0x49,\r\n0xff,0xe5,0x00,0x4a,0xff,0x4c,0x00,0x50,0xff,0x73,0x00,0x51,0xff,0x73,0x00,0x52,0xff,0x4c,0x00,0x53,0xff,0x74,0x00,0x54,0xff,0x4c,0x00,0x55,0xff,0x73,0x00,0x56,0xff,0x7b,0x00,0x62,0xff,0x60,0x00,0x63,0xff,0x60,0x00,0x64,0xff,0xb0,0x00,0x67,0xff,0xb0,0x00,0x69,0xff,0x4c,0x00,0x6a,0xff,0x4c,0x00,0x6b,0xff,0x4c,0x00,0x6c,\r\n0xff,0x4c,0x00,0x6d,0xff,0x4c,0x00,0x6e,0xff,0x4c,0x00,0x6f,0xff,0x4c,0x00,0x70,0xff,0x4c,0x00,0x71,0xff,0x4c,0x00,0x72,0xff,0x4c,0x00,0x73,0xff,0x4c,0x00,0x77,0x00,0x32,0x00,0x79,0xff,0x4c,0x00,0x7a,0xff,0x4c,0x00,0x7b,0xff,0x4c,0x00,0x7c,0xff,0x4c,0x00,0x7d,0xff,0x4c,0x00,0x92,0xff,0xb0,0x00,0xa0,0xff,0x4c,0x00,0xad,\r\n0xff,0x60,0x00,0xae,0xff,0x60,0x00,0xaf,0xff,0xb0,0x00,0xb0,0xff,0xb0,0x00,0xb1,0xff,0x4c,0x00,0xc7,0xff,0x60,0x00,0xc9,0xff,0x60,0x00,0xd0,0xff,0xb0,0x00,0xd1,0xff,0xb0,0x00,0xd2,0xff,0xb0,0x00,0xe4,0xff,0x7b,0x00,0xf7,0xff,0xb0,0x00,0xf8,0xff,0x4c,0x00,0xfb,0xff,0x7b,0x00,0xfc,0xff,0xb0,0x00,0xfd,0xff,0x4c,0x00,0xfe,\r\n0xff,0xb0,0x00,0xff,0xff,0x4c,0x01,0x00,0xff,0x4c,0x01,0x03,0xff,0x60,0x01,0x04,0xff,0x4c,0x01,0x05,0xff,0x60,0x01,0x06,0xff,0x4c,0x01,0x08,0xff,0x4c,0x01,0x0b,0xff,0x4c,0x01,0x0d,0xff,0x4c,0x01,0x18,0xff,0xb0,0x01,0x19,0xff,0x4c,0x01,0x1b,0xff,0x73,0x01,0x1d,0xff,0x73,0x01,0x1f,0xff,0x7b,0x01,0x20,0x00,0x27,0x01,0x22,\r\n0x00,0x27,0x01,0x45,0xff,0x60,0x01,0x46,0xff,0x4c,0x01,0x47,0xff,0xb0,0x01,0x48,0xff,0x4c,0x01,0x4c,0xff,0x4c,0x01,0x4e,0xff,0x4c,0x01,0x50,0xff,0x4c,0x01,0x51,0xff,0xb0,0x01,0x52,0xff,0x4c,0x01,0x53,0xff,0xb0,0x01,0x54,0xff,0x4c,0x01,0x55,0xff,0xb0,0x01,0x56,0xff,0x4c,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,\r\n0x00,0x32,0x01,0x63,0xff,0xbe,0x01,0x6d,0xff,0x73,0x01,0x6e,0xff,0xb0,0x01,0x6f,0xff,0x4c,0x01,0x70,0xff,0xb0,0x01,0x71,0xff,0x4c,0x01,0x73,0xff,0x73,0x01,0x75,0xff,0x7b,0x01,0x76,0x00,0x27,0x01,0x85,0xff,0x60,0x01,0x86,0xff,0x4c,0x01,0x88,0xff,0x4c,0x01,0x89,0xff,0xb0,0x01,0x8a,0xff,0x4c,0x02,0x3e,0xff,0x7b,0x00,0x0f,\r\n0x00,0x2d,0x00,0x52,0x00,0x37,0x00,0x27,0x00,0x5c,0xff,0xcb,0x00,0x77,0x00,0x32,0x00,0xba,0xff,0xcb,0x00,0xeb,0xff,0xcb,0x01,0x20,0x00,0x27,0x01,0x22,0x00,0x27,0x01,0x5c,0x00,0x32,0x01,0x5e,0x00,0x32,0x01,0x60,0x00,0x32,0x01,0x63,0x00,0x52,0x01,0x76,0x00,0x27,0x01,0x83,0xff,0xcb,0x01,0x93,0xff,0xcb,0x00,0x02,0x00,0x3b,\r\n0x00,0x24,0x00,0x27,0x00,0x00,0x00,0x29,0x00,0x2a,0x00,0x04,0x00,0x2d,0x00,0x2f,0x00,0x06,0x00,0x32,0x00,0x3d,0x00,0x09,0x00,0x62,0x00,0x64,0x00,0x15,0x00,0x67,0x00,0x68,0x00,0x18,0x00,0x92,0x00,0x92,0x00,0x1a,0x00,0xad,0x00,0xb0,0x00,0x1b,0x00,0xbb,0x00,0xbb,0x00,0x1f,0x00,0xc7,0x00,0xc7,0x00,0x20,0x00,0xc9,0x00,0xc9,\r\n0x00,0x21,0x00,0xd0,0x00,0xd5,0x00,0x22,0x00,0xe3,0x00,0xe3,0x00,0x28,0x00,0xe5,0x00,0xe5,0x00,0x29,0x00,0xe8,0x00,0xe8,0x00,0x2a,0x00,0xea,0x00,0xea,0x00,0x2b,0x00,0xf7,0x00,0xf7,0x00,0x2c,0x00,0xfa,0x00,0xfa,0x00,0x2d,0x00,0xfc,0x00,0xfc,0x00,0x2e,0x00,0xfe,0x00,0xfe,0x00,0x2f,0x01,0x03,0x01,0x03,0x00,0x30,0x01,0x05,\r\n0x01,0x05,0x00,0x31,0x01,0x0e,0x01,0x0e,0x00,0x32,0x01,0x18,0x01,0x18,0x00,0x33,0x01,0x1a,0x01,0x1a,0x00,0x34,0x01,0x1c,0x01,0x1c,0x00,0x35,0x01,0x1e,0x01,0x1e,0x00,0x36,0x01,0x20,0x01,0x20,0x00,0x37,0x01,0x22,0x01,0x22,0x00,0x38,0x01,0x24,0x01,0x24,0x00,0x39,0x01,0x26,0x01,0x26,0x00,0x3a,0x01,0x28,0x01,0x28,0x00,0x3b,\r\n0x01,0x2a,0x01,0x2a,0x00,0x3c,0x01,0x45,0x01,0x45,0x00,0x3d,0x01,0x47,0x01,0x47,0x00,0x3e,0x01,0x51,0x01,0x51,0x00,0x3f,0x01,0x53,0x01,0x53,0x00,0x40,0x01,0x55,0x01,0x55,0x00,0x41,0x01,0x63,0x01,0x63,0x00,0x42,0x01,0x65,0x01,0x65,0x00,0x43,0x01,0x68,0x01,0x68,0x00,0x44,0x01,0x6e,0x01,0x6e,0x00,0x45,0x01,0x70,0x01,0x70,\r\n0x00,0x46,0x01,0x72,0x01,0x72,0x00,0x47,0x01,0x74,0x01,0x74,0x00,0x48,0x01,0x76,0x01,0x76,0x00,0x49,0x01,0x78,0x01,0x78,0x00,0x4a,0x01,0x7a,0x01,0x7a,0x00,0x4b,0x01,0x7c,0x01,0x7c,0x00,0x4c,0x01,0x7e,0x01,0x7e,0x00,0x4d,0x01,0x80,0x01,0x80,0x00,0x4e,0x01,0x82,0x01,0x82,0x00,0x4f,0x01,0x85,0x01,0x85,0x00,0x50,0x01,0x89,\r\n0x01,0x89,0x00,0x51,0x01,0x8c,0x01,0x8c,0x00,0x52,0x01,0x8e,0x01,0x8e,0x00,0x53,0x01,0x90,0x01,0x90,0x00,0x54,0x01,0x92,0x01,0x92,0x00,0x55,0x02,0x3d,0x02,0x3d,0x00,0x56,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,0x00,0x48,0x00,0x02,0x00,0x4c,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x62,0x00,0x68,0x00,0x1a,0x00,0x91,0x00,0x92,\r\n0x00,0x21,0x00,0xad,0x00,0xb0,0x00,0x23,0x00,0xbb,0x00,0xbb,0x00,0x27,0x00,0xc7,0x00,0xd5,0x00,0x28,0x00,0xe1,0x00,0xe1,0x00,0x37,0x00,0xe3,0x00,0xe3,0x00,0x38,0x00,0xe5,0x00,0xe5,0x00,0x39,0x00,0xe8,0x00,0xe8,0x00,0x3a,0x00,0xea,0x00,0xea,0x00,0x3b,0x00,0xec,0x00,0xec,0x00,0x3c,0x00,0xf7,0x00,0xf7,0x00,0x3d,0x00,0xf9,\r\n0x00,0xfa,0x00,0x3e,0x00,0xfc,0x00,0xfc,0x00,0x40,0x00,0xfe,0x00,0xfe,0x00,0x41,0x01,0x03,0x01,0x03,0x00,0x42,0x01,0x05,0x01,0x05,0x00,0x43,0x01,0x07,0x01,0x07,0x00,0x44,0x01,0x09,0x01,0x0a,0x00,0x45,0x01,0x0c,0x01,0x0c,0x00,0x47,0x01,0x0e,0x01,0x0e,0x00,0x48,0x01,0x10,0x01,0x10,0x00,0x49,0x01,0x12,0x01,0x12,0x00,0x4a,\r\n0x01,0x14,0x01,0x14,0x00,0x4b,0x01,0x16,0x01,0x16,0x00,0x4c,0x01,0x18,0x01,0x18,0x00,0x4d,0x01,0x1a,0x01,0x1a,0x00,0x4e,0x01,0x1c,0x01,0x1c,0x00,0x4f,0x01,0x1e,0x01,0x1e,0x00,0x50,0x01,0x20,0x01,0x20,0x00,0x51,0x01,0x22,0x01,0x22,0x00,0x52,0x01,0x24,0x01,0x24,0x00,0x53,0x01,0x26,0x01,0x26,0x00,0x54,0x01,0x28,0x01,0x28,\r\n0x00,0x55,0x01,0x2a,0x01,0x2a,0x00,0x56,0x01,0x39,0x01,0x39,0x00,0x57,0x01,0x45,0x01,0x45,0x00,0x58,0x01,0x47,0x01,0x47,0x00,0x59,0x01,0x49,0x01,0x49,0x00,0x5a,0x01,0x4b,0x01,0x4b,0x00,0x5b,0x01,0x4d,0x01,0x4d,0x00,0x5c,0x01,0x4f,0x01,0x4f,0x00,0x5d,0x01,0x51,0x01,0x51,0x00,0x5e,0x01,0x53,0x01,0x53,0x00,0x5f,0x01,0x55,\r\n0x01,0x55,0x00,0x60,0x01,0x57,0x01,0x57,0x00,0x61,0x01,0x59,0x01,0x59,0x00,0x62,0x01,0x5b,0x01,0x5b,0x00,0x63,0x01,0x5d,0x01,0x5d,0x00,0x64,0x01,0x5f,0x01,0x5f,0x00,0x65,0x01,0x61,0x01,0x61,0x00,0x66,0x01,0x63,0x01,0x63,0x00,0x67,0x01,0x65,0x01,0x65,0x00,0x68,0x01,0x68,0x01,0x68,0x00,0x69,0x01,0x6a,0x01,0x6a,0x00,0x6a,\r\n0x01,0x6c,0x01,0x6c,0x00,0x6b,0x01,0x6e,0x01,0x6e,0x00,0x6c,0x01,0x70,0x01,0x70,0x00,0x6d,0x01,0x72,0x01,0x72,0x00,0x6e,0x01,0x74,0x01,0x74,0x00,0x6f,0x01,0x76,0x01,0x76,0x00,0x70,0x01,0x78,0x01,0x78,0x00,0x71,0x01,0x7a,0x01,0x7a,0x00,0x72,0x01,0x7c,0x01,0x7c,0x00,0x73,0x01,0x7e,0x01,0x7e,0x00,0x74,0x01,0x80,0x01,0x80,\r\n0x00,0x75,0x01,0x82,0x01,0x82,0x00,0x76,0x01,0x85,0x01,0x85,0x00,0x77,0x01,0x87,0x01,0x87,0x00,0x78,0x01,0x89,0x01,0x89,0x00,0x79,0x01,0x8c,0x01,0x8c,0x00,0x7a,0x01,0x8e,0x01,0x8e,0x00,0x7b,0x01,0x90,0x01,0x90,0x00,0x7c,0x01,0x92,0x01,0x92,0x00,0x7d,0x0b,0x21,0x0b,0x21,0x00,0x7e,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,\r\n0x00,0x48,0x00,0x02,0x00,0x02,0x01,0xdb,0x02,0x06,0x00,0x00,0x02,0x33,0x02,0x33,0x00,0x2c,0x00,0x01,0x00,0x0a,0x00,0x05,0x00,0x24,0x00,0x48,0x00,0x02,0x00,0x04,0x00,0xa9,0x00,0xa9,0x00,0x00,0x01,0x2c,0x01,0x2e,0x00,0x01,0x01,0xa1,0x01,0xa7,0x00,0x04,0x01,0xa9,0x01,0xbe,0x00,0x0b,0x00,0x02,0x00,0x26,0x00,0x02,0x00,0x0f,\r\n0x00,0x8c,0x00,0x8c,0x00,0x6e,0x00,0x8c,0x00,0x8c,0x00,0x8c,0x00,0x8c,0x01,0x96,0x01,0x96,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x6e,0x00,0x02,0x00,0x0b,0x00,0x0b,0x00,0x0c,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x02,0x00,0x3e,0x00,0x3e,0x00,0x03,0x00,0x40,0x00,0x40,0x00,0x04,0x00,0x5e,0x00,0x5e,0x00,0x05,\r\n0x00,0x60,0x00,0x60,0x00,0x06,0x00,0xa2,0x00,0xa2,0x00,0x07,0x00,0xa4,0x00,0xa4,0x00,0x08,0x00,0xaa,0x00,0xab,0x00,0x09,0x00,0xb2,0x00,0xb3,0x00,0x0b,0x00,0xbe,0x00,0xbf,0x00,0x0d,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x02,0x00,0x02,0x0f,0x2c,0x0f,0x2d,0x00,0x00,\r\n0x0f,0x30,0x0f,0x31,0x00,0x02,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4b,0x00,0x01,0x00,0x02,0x0a,0x07,0x0a,0x08,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x8e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x02,\r\n0x00,0x14,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x0c,0x09,0x0c,0x00,0x03,0x09,0x2a,0x09,0x2b,0x00,0x04,0x09,0x4a,0x09,0x4b,0x00,0x06,0x09,0x8a,0x09,0x8b,0x00,0x08,0x0a,0x05,0x0a,0x08,0x00,0x0a,0x0a,0x0b,0x0a,0x0e,0x00,0x0e,0x0e,0x20,0x0e,0x21,0x00,0x12,0x0e,0x4b,\r\n0x0e,0x4c,0x00,0x14,0x0e,0x4f,0x0e,0x50,0x00,0x16,0x0f,0x2c,0x0f,0x2d,0x00,0x18,0x0f,0x30,0x0f,0x31,0x00,0x1a,0x0f,0x34,0x0f,0x35,0x00,0x1c,0x13,0x1c,0x13,0x1c,0x00,0x1e,0x13,0x1f,0x13,0x20,0x00,0x1f,0x13,0x23,0x13,0x23,0x00,0x21,0x14,0x59,0x14,0x59,0x00,0x22,0x14,0x7e,0x14,0x7e,0x00,0x23,0x00,0x01,0x00,0x01,0x09,0x73,\r\n0x00,0x01,0x03,0x7e,0x00,0x05,0x00,0x00,0x00,0x2e,0x00,0x66,0x00,0xd4,0x01,0x48,0x02,0x04,0x02,0x84,0x02,0x84,0x02,0x84,0x01,0x48,0x02,0x84,0x02,0x92,0x02,0x92,0x02,0x9a,0x02,0x92,0x02,0xc6,0x03,0x76,0x02,0x84,0x02,0x84,0x01,0x48,0x01,0x48,0x00,0x66,0x01,0x48,0x02,0x84,0x01,0x48,0x01,0x48,0x02,0xc6,0x02,0xc6,0x02,0xc6,\r\n0x02,0xc6,0x00,0x66,0x00,0x66,0x00,0x66,0x00,0x66,0x01,0x48,0x02,0x84,0x02,0x84,0x01,0x48,0x02,0x84,0x01,0x48,0x02,0xc6,0x02,0x84,0x01,0x48,0x00,0x66,0x01,0x48,0x01,0x48,0x01,0x48,0x01,0x48,0x00,0x12,0x0b,0x6b,0xff,0xec,0xff,0xec,0x0b,0x74,0xff,0xec,0xff,0xec,0x0b,0x7a,0xff,0xec,0xff,0xec,0x0b,0x7f,0xff,0xec,0xff,0xec,\r\n0x0b,0x81,0xff,0xec,0xff,0xec,0x0b,0x8a,0xff,0xec,0xff,0xec,0x0b,0x8b,0xff,0xec,0xff,0xec,0x0b,0x8d,0xff,0xec,0xff,0xec,0x0b,0x8f,0xff,0xec,0xff,0xec,0x0b,0x92,0xff,0xec,0xff,0xec,0x0b,0x97,0xff,0xec,0xff,0xec,0x0b,0x98,0xff,0xec,0xff,0xec,0x0b,0x99,0xff,0xec,0xff,0xec,0x0b,0x9a,0xff,0xec,0xff,0xec,0x0b,0xa0,0xff,0xec,\r\n0xff,0xec,0x0b,0xaf,0xff,0xec,0xff,0xec,0x0b,0xb1,0xff,0xec,0xff,0xec,0x0b,0xbb,0xff,0xec,0xff,0xec,0x00,0x13,0x0b,0x6b,0xff,0xec,0xff,0xec,0x0b,0x71,0xff,0xec,0xff,0xec,0x0b,0x74,0xff,0xec,0xff,0xec,0x0b,0x7a,0xff,0xec,0xff,0xec,0x0b,0x7f,0xff,0xec,0xff,0xec,0x0b,0x81,0xff,0xec,0xff,0xec,0x0b,0x8a,0xff,0xec,0xff,0xec,\r\n0x0b,0x8b,0xff,0xec,0xff,0xec,0x0b,0x8d,0xff,0xec,0xff,0xec,0x0b,0x8f,0xff,0xec,0xff,0xec,0x0b,0x92,0xff,0xec,0xff,0xec,0x0b,0x97,0xff,0xec,0xff,0xec,0x0b,0x98,0xff,0xec,0xff,0xec,0x0b,0x99,0xff,0xec,0xff,0xec,0x0b,0x9a,0xff,0xec,0xff,0xec,0x0b,0xa0,0xff,0xec,0xff,0xec,0x0b,0xaf,0xff,0xec,0xff,0xec,0x0b,0xb1,0xff,0xec,\r\n0xff,0xec,0x0b,0xbb,0xff,0xec,0xff,0xec,0x00,0x1f,0x0b,0x69,0xff,0xce,0xff,0xce,0x0b,0x6a,0xff,0xce,0xff,0xce,0x0b,0x6c,0xff,0xce,0xff,0xce,0x0b,0x6e,0x00,0x28,0x00,0x28,0x0b,0x6f,0xff,0xce,0xff,0xce,0x0b,0x70,0xff,0xd8,0xff,0xd8,0x0b,0x73,0xff,0xd8,0xff,0xd8,0x0b,0x75,0xff,0xce,0xff,0xce,0x0b,0x76,0xff,0xce,0xff,0xce,\r\n0x0b,0x78,0xff,0xce,0xff,0xce,0x0b,0x79,0xff,0xd8,0xff,0xd8,0x0b,0x7b,0xff,0xce,0xff,0xce,0x0b,0x7c,0xff,0xd8,0xff,0xd8,0x0b,0x7d,0x00,0x14,0x00,0x14,0x0b,0x82,0xff,0xce,0xff,0xce,0x0b,0x90,0xff,0xce,0xff,0xce,0x0b,0x91,0xff,0xd8,0xff,0xd8,0x0b,0x93,0xff,0xce,0xff,0xce,0x0b,0x94,0xff,0xce,0xff,0xce,0x0b,0x95,0xff,0xce,\r\n0xff,0xce,0x0b,0x9f,0xff,0xce,0xff,0xce,0x0b,0xa1,0xff,0xce,0xff,0xce,0x0b,0xa4,0xff,0xd8,0xff,0xd8,0x0b,0xa6,0xff,0xce,0xff,0xce,0x0b,0xa7,0xff,0xd8,0xff,0xd8,0x0b,0xa9,0xff,0xce,0xff,0xce,0x0b,0xab,0xff,0xd8,0xff,0xd8,0x0b,0xac,0xff,0xce,0xff,0xce,0x0b,0xad,0xff,0xd8,0xff,0xd8,0x0b,0xb0,0xff,0xce,0xff,0xce,0x0b,0xb2,\r\n0xff,0xce,0xff,0xce,0x00,0x15,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x6c,0xff,0xec,0xff,0xec,0x0b,0x6e,0x00,0x14,0x00,0x14,0x0b,0x6f,0xff,0xec,0xff,0xec,0x0b,0x75,0xff,0xec,0xff,0xec,0x0b,0x76,0xff,0xec,0xff,0xec,0x0b,0x78,0xff,0xec,0xff,0xec,0x0b,0x7b,0xff,0xec,0xff,0xec,0x0b,0x7d,0x00,0x14,0x00,0x14,0x0b,0x82,0xff,0xec,\r\n0xff,0xec,0x0b,0x90,0xff,0xec,0xff,0xec,0x0b,0x93,0xff,0xec,0xff,0xec,0x0b,0x94,0xff,0xec,0xff,0xec,0x0b,0x95,0xff,0xec,0xff,0xec,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x0b,0xa1,0xff,0xec,0xff,0xec,0x0b,0xa6,0xff,0xec,0xff,0xec,0x0b,0xa9,0xff,0xec,0xff,0xec,0x0b,0xac,0xff,0xec,0xff,0xec,0x0b,0xb0,0xff,0xec,0xff,0xec,0x0b,0xb2,\r\n0xff,0xec,0xff,0xec,0x00,0x02,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x00,0x01,0x0b,0x6e,0x00,0x14,0x00,0x14,0x00,0x07,0x0b,0x79,0xff,0xe2,0xff,0xe2,0x0b,0x7c,0xff,0xe2,0xff,0xe2,0x0b,0x91,0xff,0xe2,0xff,0xe2,0x0b,0xa4,0xff,0xe2,0xff,0xe2,0x0b,0xa7,0xff,0xe2,0xff,0xe2,0x0b,0xab,0xff,0xe2,0xff,0xe2,\r\n0x0b,0xad,0xff,0xe2,0xff,0xe2,0x00,0x1d,0x0b,0x69,0xff,0xec,0xff,0xec,0x0b,0x6a,0xff,0xe2,0xff,0xe2,0x0b,0x6c,0xff,0xec,0xff,0xec,0x0b,0x6f,0xff,0xec,0xff,0xec,0x0b,0x70,0xff,0xec,0xff,0xec,0x0b,0x73,0xff,0xec,0xff,0xec,0x0b,0x75,0xff,0xec,0xff,0xec,0x0b,0x76,0xff,0xec,0xff,0xec,0x0b,0x78,0xff,0xec,0xff,0xec,0x0b,0x79,\r\n0xff,0xec,0xff,0xec,0x0b,0x7b,0xff,0xec,0xff,0xec,0x0b,0x7c,0xff,0xec,0xff,0xec,0x0b,0x82,0xff,0xec,0xff,0xec,0x0b,0x90,0xff,0xec,0xff,0xec,0x0b,0x91,0xff,0xec,0xff,0xec,0x0b,0x93,0xff,0xec,0xff,0xec,0x0b,0x94,0xff,0xec,0xff,0xec,0x0b,0x95,0xff,0xec,0xff,0xec,0x0b,0x9f,0xff,0xe2,0xff,0xe2,0x0b,0xa1,0xff,0xec,0xff,0xec,\r\n0x0b,0xa4,0xff,0xec,0xff,0xec,0x0b,0xa6,0xff,0xec,0xff,0xec,0x0b,0xa7,0xff,0xec,0xff,0xec,0x0b,0xa9,0xff,0xec,0xff,0xec,0x0b,0xab,0xff,0xec,0xff,0xec,0x0b,0xac,0xff,0xec,0xff,0xec,0x0b,0xad,0xff,0xec,0xff,0xec,0x0b,0xb0,0xff,0xec,0xff,0xec,0x0b,0xb2,0xff,0xec,0xff,0xec,0x00,0x01,0x0b,0x81,0xff,0xe2,0xff,0xe2,0x00,0x02,\r\n0x00,0x16,0x0b,0x68,0x0b,0x68,0x00,0x00,0x0b,0x6a,0x0b,0x6b,0x00,0x01,0x0b,0x6e,0x0b,0x6e,0x00,0x03,0x0b,0x70,0x0b,0x71,0x00,0x04,0x0b,0x73,0x0b,0x74,0x00,0x06,0x0b,0x79,0x0b,0x7a,0x00,0x08,0x0b,0x7d,0x0b,0x7f,0x00,0x0a,0x0b,0x81,0x0b,0x82,0x00,0x0d,0x0b,0x84,0x0b,0x85,0x00,0x0f,0x0b,0x8a,0x0b,0x8b,0x00,0x11,0x0b,0x8e,\r\n0x0b,0x8f,0x00,0x13,0x0b,0x91,0x0b,0x92,0x00,0x15,0x0b,0x94,0x0b,0x94,0x00,0x17,0x0b,0x97,0x0b,0x9d,0x00,0x18,0x0b,0x9f,0x0b,0xa0,0x00,0x1f,0x0b,0xa4,0x0b,0xa4,0x00,0x21,0x0b,0xa7,0x0b,0xa8,0x00,0x22,0x0b,0xab,0x0b,0xab,0x00,0x24,0x0b,0xb0,0x0b,0xb1,0x00,0x25,0x0b,0xb5,0x0b,0xb5,0x00,0x27,0x0b,0xb7,0x0b,0xb7,0x00,0x28,\r\n0x0b,0xba,0x0b,0xbe,0x00,0x29,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x4d,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,\r\n0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x02,0x00,0x44,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x02,0x00,0x30,0x00,0x5e,0x00,0x01,\r\n0x00,0x00,0x00,0x4e,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x1c,0x00,0x50,0x00,0x01,0x00,0x00,0x00,0x4e,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,\r\n0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x58,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x5a,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x02,0x00,0x4e,0x00,0x48,0x00,0x01,0x00,0x00,0x00,0x4f,\r\n0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x3a,0x00,0x3a,0x00,0x34,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x24,0x00,0x24,0x00,0x24,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x05,0x0b,0x5f,\r\n0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x30,0x00,0x02,0x02,0x36,0x02,0x3c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x1c,0x00,0x02,0x02,0x22,0x02,0x38,0x00,0x01,\r\n0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x08,0x00,0x03,0x02,0x0e,0x02,0x2a,0x02,0x24,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xf2,0x00,0x02,0x01,0xf8,0x02,0x36,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xde,0x00,0x03,0x01,0xe4,0x02,0x00,0x02,0x22,0x00,0x01,\r\n0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x01,0x02,0x12,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xb6,0x00,0x03,0x01,0xd8,0x01,0xbc,0x01,0xc2,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x04,0x01,0xc2,0x01,0xc2,0x01,0xa6,0x01,0xac,0x00,0x01,\r\n0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x88,0x00,0x05,0x01,0xaa,0x01,0xaa,0x01,0xaa,0x01,0x8e,0x01,0x94,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x6e,0x00,0x03,0x01,0x90,0x01,0x74,0x01,0x8a,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x04,0x01,0x7a,\r\n0x01,0x5e,0x01,0x7a,0x01,0x74,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x40,0x00,0x04,0x01,0x62,0x01,0x62,0x01,0x46,0x01,0x5c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x28,0x00,0x05,0x01,0x4a,0x01,0x4a,0x01,0x2e,0x01,0x4a,0x01,0x44,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,\r\n0x00,0x00,0x00,0x01,0x01,0x0e,0x00,0x05,0x01,0x30,0x01,0x30,0x01,0x30,0x01,0x14,0x01,0x2a,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf4,0x00,0x06,0x01,0x16,0x01,0x16,0x01,0x16,0x00,0xfa,0x01,0x16,0x01,0x10,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xd8,0x00,0x03,0x00,0xfa,\r\n0x00,0xde,0x01,0x1c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xc2,0x00,0x04,0x00,0xe4,0x00,0xc8,0x00,0xe4,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x04,0x00,0xcc,0x00,0xcc,0x00,0xb0,0x00,0xee,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,\r\n0x00,0x92,0x00,0x05,0x00,0xb4,0x00,0xb4,0x00,0x98,0x00,0xb4,0x00,0xd6,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x05,0x00,0x9a,0x00,0x9a,0x00,0x9a,0x00,0x7e,0x00,0xbc,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x06,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x64,\r\n0x00,0x80,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x02,0x00,0x64,0x00,0x8c,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x50,0x00,0x50,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x3a,\r\n0x00,0x3a,0x00,0x3a,0x00,0x62,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,\r\n0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x3c,0x00,0x02,0x03,0x42,0x03,0x82,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x28,0x00,0x03,0x03,0xa8,0x03,0x2e,0x03,0x6e,\r\n0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x03,0x12,0x00,0x04,0x03,0x92,0x03,0x92,0x03,0x18,0x03,0x58,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xfa,0x00,0x03,0x03,0x00,0x03,0x9c,0x03,0xa2,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x04,0x03,0x64,\r\n0x02,0xea,0x03,0x86,0x03,0x8c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xcc,0x00,0x05,0x03,0x4c,0x03,0x4c,0x02,0xd2,0x03,0x6e,0x03,0x74,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0xb2,0x00,0x02,0x02,0xb8,0x03,0x6a,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,\r\n0x02,0x9e,0x00,0x03,0x03,0x1e,0x02,0xa4,0x03,0x56,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x88,0x00,0x04,0x03,0x08,0x03,0x08,0x02,0x8e,0x03,0x40,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x70,0x00,0x03,0x02,0x76,0x03,0x12,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,\r\n0x00,0x00,0x00,0x01,0x02,0x5a,0x00,0x04,0x02,0xda,0x02,0x60,0x02,0xfc,0x03,0x18,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x42,0x00,0x05,0x02,0xc2,0x02,0xc2,0x02,0x48,0x02,0xe4,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x28,0x00,0x03,0x02,0x2e,0x02,0xca,0x02,0xec,\r\n0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x02,0x12,0x00,0x04,0x02,0x92,0x02,0x18,0x02,0xb4,0x02,0xd6,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xfa,0x00,0x05,0x02,0x7a,0x02,0x7a,0x02,0x00,0x02,0x9c,0x02,0xbe,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xe0,\r\n0x00,0x03,0x01,0xe6,0x02,0x60,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xca,0x00,0x04,0x02,0x4a,0x01,0xd0,0x02,0x4a,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0xb2,0x00,0x05,0x02,0x32,0x02,0x32,0x01,0xb8,0x02,0x32,0x01,0xf8,0x00,0x01,0x00,0x00,0x00,0x51,\r\n0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x98,0x00,0x04,0x01,0x9e,0x02,0x18,0x02,0x3a,0x02,0x40,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x05,0x02,0x00,0x01,0x86,0x02,0x00,0x02,0x22,0x02,0x28,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x66,0x00,0x06,0x01,0xe6,0x01,0xe6,\r\n0x01,0x6c,0x01,0xe6,0x02,0x08,0x02,0x0e,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x4a,0x00,0x03,0x01,0x50,0x01,0xca,0x02,0x02,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x34,0x00,0x04,0x01,0xb4,0x01,0x3a,0x01,0xb4,0x01,0xec,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,\r\n0x00,0x01,0x01,0x1c,0x00,0x05,0x01,0x9c,0x01,0x9c,0x01,0x22,0x01,0x9c,0x01,0xd4,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x01,0x02,0x00,0x05,0x01,0x08,0x01,0x82,0x01,0xa4,0x01,0xcc,0x01,0xd2,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x06,0x01,0x68,0x00,0xee,0x01,0x68,\r\n0x01,0x8a,0x01,0xb2,0x01,0xb8,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xcc,0x00,0x07,0x01,0x4c,0x01,0x4c,0x00,0xd2,0x01,0x4c,0x01,0x6e,0x01,0x96,0x01,0x9c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xae,0x00,0x04,0x00,0xb4,0x01,0x2e,0x01,0x50,0x01,0x6c,0x00,0x01,0x00,0x00,\r\n0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x05,0x01,0x16,0x00,0x9c,0x01,0x16,0x01,0x38,0x01,0x54,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x06,0x00,0xfc,0x00,0xfc,0x00,0x82,0x00,0xfc,0x01,0x1e,0x01,0x3a,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x60,\r\n0x00,0x04,0x00,0x66,0x00,0xe0,0x01,0x02,0x01,0x24,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x05,0x00,0xc8,0x00,0x4e,0x00,0xc8,0x00,0xea,0x01,0x0c,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x06,0x00,0xae,0x00,0xae,0x00,0x34,0x00,0xae,0x00,0xd0,0x00,0xf2,\r\n0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x03,0x00,0x01,0x00,0xe8,0x00,0x01,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,\r\n0x0b,0xd6,0x0b,0xd6,0x00,0x08,0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,\r\n0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,\r\n0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x61,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1a,0x00,0x01,0x00,0x42,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x03,0x0b,0xc0,0x0b,0xc0,0x00,0x00,\r\n0x0b,0xd7,0x0b,0xd7,0x00,0x01,0x0b,0xdc,0x0b,0xdc,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0xf8,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xde,0x00,0x02,0x01,0x0e,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xca,0x00,0x03,0x00,0xfa,0x00,0xfa,\r\n0x00,0xd2,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x01,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xa2,0x00,0x02,0x00,0xd2,0x00,0xf4,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x8e,0x00,0x03,0x00,0xbe,0x00,0xbe,0x00,0xe0,0x00,0x01,\r\n0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x01,0x00,0xd0,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x02,0x00,0x96,0x00,0xbe,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x03,0x00,0x82,0x00,0x82,0x00,0xaa,0x00,0x01,0x00,0x00,0x00,0x53,\r\n0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x9a,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2a,0x00,0x02,0x00,0x5a,0x00,0x88,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x03,0x00,0x46,0x00,0x46,0x00,0x74,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x01,0x00,0x02,\r\n0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,\r\n0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x62,0x00,0x01,0x00,0x01,0x11,0x86,0x00,0x01,0x00,0x01,0x0b,0x07,0x00,0x03,0x00,0x01,0x00,0x40,0x00,0x01,0x00,0x46,0x00,0x01,0x00,0x4e,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x03,0x00,0x01,0x00,0x2c,0x00,0x01,0x00,0x32,0x00,0x02,\r\n0x00,0x74,0x00,0x7a,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x5e,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x54,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,\r\n0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x03,\r\n0x00,0x02,0x00,0xee,0x00,0xee,0x00,0x01,0x01,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x01,0x08,0x00,0xda,0x00,0xda,0x00,0x01,0x01,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0xf2,0x00,0xf2,0x00,0xc4,0x00,0xc4,0x00,0x01,0x00,0xec,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,\r\n0x00,0x03,0x00,0x02,0x00,0xac,0x00,0xda,0x00,0x01,0x00,0xd4,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x00,0xc6,0x00,0x98,0x00,0xc6,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0xb0,0x00,0xb0,0x00,0x82,0x00,0xb0,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x6a,0x00,0xc6,0x00,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x03,0x00,0x84,0x00,0x56,0x00,0xb2,0x00,0x01,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x04,0x00,0x6e,0x00,0x6e,0x00,0x40,0x00,0x9c,0x00,0x01,0x00,0x68,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x8a,0x00,0x01,0x00,0x50,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x7c,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,\r\n0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,\r\n0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x62,0x00,0x01,0x00,0x01,0x11,0x86,0x00,0x01,0x00,0x01,0x0b,0x07,0x00,0x03,0x00,0x03,0x00,0x64,0x00,0x6a,0x00,0x6a,0x00,0x01,0x00,0x92,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x04,0x00,0x4e,0x00,0x54,0x00,0x82,0x00,0x54,0x00,0x01,0x00,0x7c,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x05,0x00,0x36,0x00,0x3c,0x00,0x6a,0x00,0x6a,0x00,0x3c,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x03,0x00,0x06,0x00,0x1c,0x00,0x22,0x00,0x50,0x00,0x50,0x00,0x50,0x00,0x22,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x01,\r\n0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,\r\n0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x03,0x00,0x02,0x06,0x38,0x06,0x3e,0x00,0x01,0x06,0x66,0x00,0x01,0x06,0xa6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0x22,0x06,0xca,0x06,0x28,\r\n0x00,0x01,0x06,0x50,0x00,0x01,0x06,0x90,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x06,0x0a,0x06,0x10,0x00,0x01,0x06,0x38,0x00,0x02,0x06,0xba,0x06,0x78,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0xa2,0x05,0xf2,0x05,0xf8,0x00,0x01,0x06,0x20,0x00,0x01,0x06,0x60,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,\r\n0x00,0x04,0x06,0x8a,0x06,0x8a,0x05,0xda,0x05,0xe0,0x00,0x01,0x06,0x08,0x00,0x01,0x06,0x48,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x06,0x70,0x05,0xc0,0x05,0xc6,0x00,0x01,0x05,0xee,0x00,0x02,0x06,0x70,0x06,0x2e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x06,0x56,0x06,0x56,0x05,0xa6,0x05,0xac,0x00,0x01,\r\n0x05,0xd4,0x00,0x02,0x06,0x56,0x06,0x14,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x8a,0x06,0x32,0x05,0x90,0x00,0x01,0x05,0xb8,0x00,0x02,0x06,0x3a,0x05,0xf8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x06,0x20,0x05,0x70,0x06,0x18,0x05,0x76,0x00,0x01,0x05,0x9e,0x00,0x01,0x05,0xde,0x00,0x01,0x00,0x00,\r\n0x00,0x57,0x00,0x03,0x00,0x05,0x06,0x06,0x06,0x06,0x05,0x56,0x05,0xfe,0x05,0x5c,0x00,0x01,0x05,0x84,0x00,0x01,0x05,0xc4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x05,0xea,0x05,0x3a,0x05,0xe2,0x05,0x40,0x00,0x01,0x05,0x68,0x00,0x02,0x05,0xea,0x05,0xa8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x05,0xce,\r\n0x05,0xce,0x05,0x1e,0x05,0xc6,0x05,0x24,0x00,0x01,0x05,0x4c,0x00,0x02,0x05,0xce,0x05,0x8c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x05,0x00,0x05,0x06,0x00,0x01,0x05,0x2e,0x00,0x02,0x05,0xd2,0x05,0xd8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x04,0xe8,0x05,0x90,0x04,0xee,0x00,0x01,0x05,0x16,0x00,0x02,\r\n0x05,0xba,0x05,0xc0,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x04,0xce,0x04,0xd4,0x00,0x01,0x04,0xfc,0x00,0x03,0x05,0x7e,0x05,0xa0,0x05,0xa6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x64,0x04,0xb4,0x04,0xba,0x00,0x01,0x04,0xe2,0x00,0x02,0x05,0x86,0x05,0x8c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,\r\n0x00,0x04,0x05,0x4a,0x05,0x4a,0x04,0x9a,0x04,0xa0,0x00,0x01,0x04,0xc8,0x00,0x02,0x05,0x6c,0x05,0x72,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x05,0x2e,0x04,0x7e,0x04,0x84,0x00,0x01,0x04,0xac,0x00,0x03,0x05,0x2e,0x05,0x50,0x05,0x56,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x05,0x12,0x05,0x12,0x04,0x62,\r\n0x04,0x68,0x00,0x01,0x04,0x90,0x00,0x03,0x05,0x12,0x05,0x34,0x05,0x3a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x04,0x44,0x04,0xec,0x04,0x4a,0x00,0x01,0x04,0x72,0x00,0x03,0x04,0xf4,0x05,0x16,0x05,0x1c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x04,0xd8,0x04,0x28,0x04,0xd0,0x04,0x2e,0x00,0x01,0x04,0x56,\r\n0x00,0x02,0x04,0xfa,0x05,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x04,0xbc,0x04,0xbc,0x04,0x0c,0x04,0xb4,0x04,0x12,0x00,0x01,0x04,0x3a,0x00,0x02,0x04,0xde,0x04,0xe4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x04,0x9e,0x03,0xee,0x04,0x96,0x03,0xf4,0x00,0x01,0x04,0x1c,0x00,0x03,0x04,0x9e,0x04,0xc0,\r\n0x04,0xc6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x04,0x80,0x04,0x80,0x03,0xd0,0x04,0x78,0x03,0xd6,0x00,0x01,0x03,0xfe,0x00,0x03,0x04,0x80,0x04,0xa2,0x04,0xa8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x03,0xb0,0x03,0xb6,0x00,0x01,0x03,0xde,0x00,0x02,0x04,0x82,0x04,0x98,0x00,0x01,0x00,0x00,0x00,0x57,\r\n0x00,0x03,0x00,0x02,0x03,0x98,0x03,0x9e,0x00,0x01,0x03,0xc6,0x00,0x02,0x04,0x6a,0x04,0x86,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x80,0x04,0x28,0x03,0x86,0x00,0x01,0x03,0xae,0x00,0x02,0x04,0x52,0x04,0x68,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x66,0x04,0x0e,0x03,0x6c,0x00,0x01,0x03,0x94,\r\n0x00,0x02,0x04,0x38,0x04,0x54,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x03,0x4c,0x03,0x52,0x00,0x01,0x03,0x7a,0x00,0x03,0x03,0xfc,0x04,0x1e,0x04,0x34,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0xe2,0x03,0x32,0x03,0x38,0x00,0x01,0x03,0x60,0x00,0x02,0x04,0x04,0x04,0x1a,0x00,0x01,0x00,0x00,0x00,0x57,\r\n0x00,0x03,0x00,0x04,0x03,0xc8,0x03,0xc8,0x03,0x18,0x03,0x1e,0x00,0x01,0x03,0x46,0x00,0x02,0x03,0xea,0x04,0x00,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0xac,0x02,0xfc,0x03,0x02,0x00,0x01,0x03,0x2a,0x00,0x03,0x03,0xac,0x03,0xce,0x03,0xe4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x90,0x03,0x90,\r\n0x02,0xe0,0x02,0xe6,0x00,0x01,0x03,0x0e,0x00,0x03,0x03,0x90,0x03,0xb2,0x03,0xc8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x02,0xc2,0x02,0xc8,0x00,0x01,0x02,0xf0,0x00,0x03,0x03,0x72,0x03,0x94,0x03,0xb0,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x58,0x02,0xa8,0x02,0xae,0x00,0x01,0x02,0xd6,0x00,0x02,\r\n0x03,0x7a,0x03,0x96,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x3e,0x03,0x3e,0x02,0x8e,0x02,0x94,0x00,0x01,0x02,0xbc,0x00,0x02,0x03,0x60,0x03,0x7c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x03,0x22,0x02,0x72,0x02,0x78,0x00,0x01,0x02,0xa0,0x00,0x03,0x03,0x22,0x03,0x44,0x03,0x60,0x00,0x01,0x00,0x00,\r\n0x00,0x57,0x00,0x03,0x00,0x04,0x03,0x06,0x03,0x06,0x02,0x56,0x02,0x5c,0x00,0x01,0x02,0x84,0x00,0x03,0x03,0x06,0x03,0x28,0x03,0x44,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x02,0x38,0x02,0xe0,0x02,0x3e,0x00,0x01,0x02,0x66,0x00,0x03,0x02,0xe8,0x03,0x0a,0x03,0x20,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,\r\n0x02,0xcc,0x02,0x1c,0x02,0xc4,0x02,0x22,0x00,0x01,0x02,0x4a,0x00,0x02,0x02,0xee,0x03,0x04,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0xb0,0x02,0x00,0x02,0xa8,0x02,0x06,0x00,0x01,0x02,0x2e,0x00,0x02,0x02,0xd2,0x02,0xe8,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x94,0x01,0xe4,0x02,0x8c,0x01,0xea,\r\n0x00,0x01,0x02,0x12,0x00,0x03,0x02,0x94,0x02,0xb6,0x02,0xcc,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x02,0x76,0x02,0x76,0x00,0x01,0x01,0xf4,0x00,0x03,0x02,0x76,0x02,0x98,0x02,0xae,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0xac,0x02,0x54,0x01,0xb2,0x00,0x01,0x01,0xda,0x00,0x03,0x02,0x5c,0x02,0x7e,\r\n0x02,0x94,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x40,0x01,0x90,0x02,0x38,0x01,0x96,0x00,0x01,0x01,0xbe,0x00,0x02,0x02,0x62,0x02,0x78,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x02,0x24,0x02,0x24,0x01,0x74,0x02,0x1c,0x01,0x7a,0x00,0x01,0x01,0xa2,0x00,0x02,0x02,0x46,0x02,0x5c,0x00,0x01,0x00,0x00,\r\n0x00,0x57,0x00,0x03,0x00,0x04,0x02,0x06,0x01,0x56,0x01,0xfe,0x01,0x5c,0x00,0x01,0x01,0x84,0x00,0x03,0x02,0x06,0x02,0x28,0x02,0x3e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x01,0x38,0x01,0x3e,0x00,0x01,0x01,0x66,0x00,0x01,0x02,0x2c,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0x22,0x01,0xca,0x01,0x28,\r\n0x00,0x01,0x01,0x50,0x00,0x01,0x02,0x16,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x02,0x01,0x0a,0x01,0x10,0x00,0x01,0x01,0x38,0x00,0x02,0x01,0xba,0x01,0xfe,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0xa2,0x00,0xf2,0x00,0xf8,0x00,0x01,0x01,0x20,0x00,0x01,0x01,0xe6,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,\r\n0x00,0x04,0x01,0x8a,0x01,0x8a,0x00,0xda,0x00,0xe0,0x00,0x01,0x01,0x08,0x00,0x01,0x01,0xce,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x01,0x70,0x00,0xc0,0x00,0xc6,0x00,0x01,0x00,0xee,0x00,0x02,0x01,0x70,0x01,0xb4,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x01,0x56,0x01,0x56,0x00,0xa6,0x00,0xac,0x00,0x01,\r\n0x00,0xd4,0x00,0x02,0x01,0x56,0x01,0x9a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x03,0x00,0x8a,0x01,0x32,0x00,0x90,0x00,0x01,0x00,0xb8,0x00,0x02,0x01,0x3a,0x01,0x7e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x01,0x20,0x00,0x70,0x01,0x18,0x00,0x76,0x00,0x01,0x00,0x9e,0x00,0x01,0x01,0x64,0x00,0x01,0x00,0x00,\r\n0x00,0x57,0x00,0x03,0x00,0x05,0x01,0x06,0x01,0x06,0x00,0x56,0x00,0xfe,0x00,0x5c,0x00,0x01,0x00,0x84,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x04,0x00,0xea,0x00,0x3a,0x00,0xe2,0x00,0x40,0x00,0x01,0x00,0x68,0x00,0x02,0x00,0xea,0x01,0x2e,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x03,0x00,0x05,0x00,0xce,\r\n0x00,0xce,0x00,0x1e,0x00,0xc6,0x00,0x24,0x00,0x01,0x00,0x4c,0x00,0x02,0x00,0xce,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x57,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,\r\n0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,0x0b,0xd6,0x0b,0xd6,0x00,0x08,0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,\r\n0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,\r\n0x00,0x01,0x00,0x02,0x0b,0x5e,0x0b,0x61,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,\r\n0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,\r\n0x00,0x01,0x00,0x00,0x00,0x59,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x02,0x0b,0x58,0x0b,0x5b,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x04,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x5a,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x02,0x0b,0x54,0x0b,0x56,\r\n0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x42,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x00,0x00,0x5b,0x00,0x03,0x00,0x01,0x00,0x8a,0x00,0x01,0x00,0x2e,0x00,0x01,0x00,0x5c,0x00,0x01,0x00,0x00,0x00,0x5b,0x00,0x03,0x00,0x01,0x00,0x7c,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x48,0x00,0x01,\r\n0x00,0x00,0x00,0x5b,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,\r\n0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x88,0x00,0x01,0x00,0x01,0x0b,0x89,0x00,0x03,0x00,0x02,0x00,0x3e,0x00,0x6c,0x00,0x01,0x00,0x72,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x03,0x00,0x03,0x00,0x66,0x00,0x7c,0x00,0x82,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x94,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,\r\n0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x53,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,\r\n0x00,0x0a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x03,0x00,0x02,0x00,0x78,0x00,0xa6,0x00,0x01,\r\n0x00,0xac,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x64,0x00,0xa0,0x00,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x50,0x00,0x92,0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x3c,0x00,0x84,0x00,0x01,0x00,0x70,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x76,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x68,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5d,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,\r\n0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x58,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0x59,0x00,0x01,0x00,0x01,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x5b,0x00,0x01,0x00,0x01,\r\n0x0b,0x5d,0x00,0x01,0x00,0x01,0x0b,0xb9,0x00,0x03,0x00,0x02,0x00,0x50,0x00,0x7e,0x00,0x01,0x00,0x84,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x3c,0x00,0x78,0x00,0x01,0x00,0x70,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x28,0x00,0x6a,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0x5e,0x00,0x03,0x00,0x02,0x00,0x5c,0x00,0x72,0x00,0x01,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,\r\n0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x54,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0x55,0x00,0x01,0x00,0x01,0x0b,0x56,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x03,0x00,0x00,\r\n0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x4c,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,\r\n0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,\r\n0x00,0x10,0x00,0x03,0x00,0x01,0x00,0x5c,0x00,0x01,0x00,0x8a,0x00,0x01,0x00,0x90,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x48,0x00,0x01,0x00,0x76,0x00,0x02,0x00,0x48,0x00,0x7c,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x32,0x00,0x01,0x00,0x60,0x00,0x03,0x00,0x32,0x00,0x32,0x00,0x66,0x00,0x01,\r\n0x00,0x00,0x00,0x60,0x00,0x03,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x48,0x00,0x04,0x00,0x1a,0x00,0x1a,0x00,0x1a,0x00,0x4e,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,\r\n0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x01,0x00,0x01,0x0b,0x75,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,\r\n0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x63,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,\r\n0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x02,\r\n0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x01,0x00,0x01,0x14,0x6b,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,\r\n0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,\r\n0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,\r\n0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x00,0x00,0x6d,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x02,0x00,0x01,\r\n0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6f,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x1e,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x16,\r\n0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x1c,0x00,0x02,0x00,0x1c,0x00,0x1c,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,\r\n0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,\r\n0x00,0x75,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,\r\n0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x03,0x00,0x16,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x16,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,\r\n0x00,0x7a,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x18,\r\n0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x1e,0x00,0x1e,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x02,0x00,0x01,0x14,0x9e,\r\n0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x02,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x02,\r\n0x00,0x18,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,\r\n0x0a,0x44,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x03,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x18,0x00,0x01,0x00,0x00,\r\n0x00,0x82,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x03,0x00,0x04,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x44,0x00,0x03,0x00,0x04,0x00,0x18,\r\n0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x47,0x00,0x03,0x00,0x04,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x22,0x00,0x01,0x00,0x18,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x85,0x00,0x02,0x00,0x01,0x14,0x9e,\r\n0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x13,0x45,0x00,0x01,0x00,0x0a,0x00,0x03,0x00,0x64,0xff,0xce,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x0a,0x00,0x03,0x01,0x2c,0xff,0xce,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0xc8,0x00,0x01,0x00,0x01,0x09,0x73,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x5d,\r\n0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x89,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,\r\n0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0xd4,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfc,0xb5,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x0c,0x00,0x07,0xfc,0xc8,0xfc,0xc7,0xfd,0xa8,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,\r\n0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0xe6,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf6,0xcd,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf6,0x8e,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x8d,0xfc,0xb2,0x00,0x02,0x00,0x01,\r\n0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x74,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x35,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,\r\n0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfb,0x0b,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,\r\n0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfe,0x59,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xff,0x82,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,\r\n0xfd,0x69,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfd,0x2a,0x03,0x4e,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,\r\n0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0xfe,0x59,0x00,0x02,0x00,0x01,0x14,0x9e,\r\n0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xfa,0x8d,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x74,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x05,0xf8,0x35,0xfc,0xb2,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,\r\n0x00,0x01,0x02,0x1c,0x02,0x32,0x00,0x03,0x00,0x0c,0x00,0x3a,0x00,0x0b,0x00,0x00,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x00,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x02,0x4f,0xd6,0x00,0x01,0x4f,0xd6,0x00,0x50,0x4f,0xae,0x4f,0xb4,\r\n0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x4f,0xde,0x50,0x1a,0x50,0x20,0x50,0x14,0x50,0x26,0x50,0x2c,0x50,0x32,0x50,0x38,0x50,0x3e,0x50,0x44,0x50,0x4a,0x50,0x50,0x4f,0xde,0x50,0x1a,0x50,0x20,0x50,0x56,\r\n0x50,0x5c,0x50,0x62,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0x9e,0x50,0xa4,0x50,0xaa,0x50,0xb0,0x50,0xb6,0x50,0xbc,0x50,0xc2,0x50,0xc8,0x50,0xce,0x50,0xd4,0x50,0xda,0x50,0xe0,0x50,0xe6,0x50,0xec,0x50,0xf2,0x50,0xf8,0x50,0xfe,0x51,0x04,\r\n0x51,0x0a,0x51,0x10,0x51,0x16,0x51,0x1c,0x51,0x22,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x76,0x51,0x7c,0x51,0x82,0x51,0x76,0x51,0x7c,0x51,0x82,0x51,0x76,0x51,0x7c,0x51,0x82,0x50,0x56,0x50,0x5c,0x50,0x62,0x50,0x56,0x50,0x5c,\r\n0x50,0x62,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x7a,0x50,0x80,0x50,0x86,0x51,0x88,0x51,0x8e,0x51,0x94,0x51,0x9a,0x51,0xa0,0x51,0xa6,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x51,0xac,0x51,0xb2,0x51,0xb8,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x51,0x40,\r\n0x51,0x46,0x51,0x4c,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x52,0x51,0x58,0x51,0x5e,0x4f,0xc0,0x4f,0xc6,0x4f,0xcc,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,\r\n0x51,0xbe,0x51,0xc4,0x51,0xca,0x51,0xd0,0x51,0xd6,0x51,0xdc,0x50,0x44,0x50,0x4a,0x50,0x50,0x51,0xbe,0x51,0xc4,0x51,0xca,0x50,0x56,0x50,0x5c,0x50,0x62,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x50,0xb0,0x50,0xb6,0x50,0xbc,0x50,0xc2,0x50,0xc8,0x50,0xce,0x50,0xe6,0x50,0xec,\r\n0x50,0xf2,0x50,0xf8,0x50,0xfe,0x51,0x04,0x51,0x1c,0x51,0x22,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x4f,0xde,0x50,0x1a,0x50,0x20,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0xf8,0x50,0xfe,0x51,0x04,0x51,0x9a,\r\n0x51,0xa0,0x51,0xa6,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x51,0x64,0x51,0x6a,0x51,0x70,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,\r\n0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x4d,0x7c,0x00,0x00,0x4d,0x7c,0x00,0x50,0x4f,0xac,0x4f,0xb2,0x4f,0xb8,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x4f,0xd0,\r\n0x4e,0xc2,0x4f,0xd6,0x4f,0xdc,0x4f,0xd0,0x4e,0x20,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x4f,0xee,0x4e,0x68,0x4f,0xf4,0x4f,0xfa,0x50,0x00,0x4e,0xb0,0x50,0x06,0x4e,0xd4,0x50,0x0c,0x50,0x12,0x50,0x18,0x50,0x1e,0x50,0x24,0x50,0x2a,0x50,0x2a,0x50,0x2a,0x4e,0x20,0x4e,0x20,0x4f,0xe8,0x4f,0xe8,0x50,0x30,0x50,0x36,0x4f,0xb2,0x4f,0xc4,\r\n0x4f,0xca,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x50,0x18,0x50,0x24,0x50,0x1e,0x50,0x1e,0x50,0x1e,0x50,0x1e,0x4f,0xb2,0x4f,0xb8,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x50,0x3c,0x50,0x42,0x4f,0xdc,0x50,0x3c,0x4e,0x20,0x4f,0xe2,0x4f,0xe8,0x4f,0xee,0x4f,0xf4,0x50,0x48,0x4e,0xb0,0x50,0x06,0x50,0x0c,0x50,0x12,0x50,0x18,0x50,0x1e,0x50,0x24,\r\n0x4f,0xd0,0x4f,0xb8,0x4f,0xe2,0x50,0x06,0x50,0x36,0x4f,0xbe,0x4f,0xc4,0x4f,0xca,0x50,0x24,0x00,0x01,0x00,0x02,0x0b,0x53,0x0b,0x57,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,\r\n0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4c,0x94,0x00,0x50,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,\r\n0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,\r\n0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x4f,0x6a,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,\r\n0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4b,0xb2,0x00,0x50,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,\r\n0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xb2,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xbe,0x4e,0xdc,0x4e,0xb2,0x4e,0xe2,0x4e,0xe8,0x4e,0xee,0x4e,0xf4,0x4e,0xe8,0x4e,0xfa,0x4f,0x00,0x4e,0xdc,0x4e,0xca,0x4f,0x06,0x4f,0x0c,0x4e,0xb2,0x4e,0xb2,0x4e,0xb2,0x4e,0xca,0x4e,0xca,0x4e,0xd6,0x4e,0xd6,0x4e,0xb2,\r\n0x4e,0xee,0x4e,0x94,0x4e,0xa6,0x4e,0xac,0x4e,0xd0,0x4e,0xd6,0x4e,0xbe,0x4e,0xca,0x4f,0x0c,0x4f,0x06,0x4f,0x12,0x4f,0x06,0x4f,0x12,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4f,0x18,0x4e,0xf4,0x4e,0xc4,0x4f,0x18,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x4e,0xe8,0x4e,0xf4,0x4e,0xe8,0x4f,0x00,0x4e,0xdc,\r\n0x4e,0xca,0x4f,0x06,0x4f,0x0c,0x4f,0x1e,0x4f,0x24,0x4f,0x2a,0x4f,0x30,0x4e,0xd6,0x4f,0x36,0x4f,0x24,0x4f,0x3c,0x4f,0x42,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,\r\n0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x2c,0x00,0x32,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0xd0,0x00,0x0c,0x4e,0x66,0x4e,0x6c,0x4e,0x72,0x4e,0x6c,0x4e,0x6c,0x4e,0x78,0x4e,0x66,0x4e,0x7e,0x4e,0x78,0x4e,0x84,0x4e,0x78,0x4e,0x54,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,\r\n0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x01,0x5c,0x01,0x72,0x00,0x02,0x00,0x0c,0x00,0x1a,0x00,0x03,\r\n0x00,0x00,0x4a,0x64,0x00,0x00,0x4a,0x64,0x00,0x01,0x4a,0x64,0x00,0x50,0x4e,0x16,0x4e,0x1c,0x4e,0x22,0x4e,0x28,0x4e,0x2e,0x4e,0x34,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4e,0x5e,0x4e,0x64,0x4e,0x6a,0x4e,0x70,0x4e,0x76,0x4e,0x7c,0x4e,0x82,0x4e,0x88,0x4e,0x5e,0x4e,0x64,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,\r\n0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0x7c,0x4e,0x16,0x4e,0x58,0x4e,0x5e,0x4e,0x64,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xca,0x4e,0xd0,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x4e,0xc4,0x4e,0xca,0x4e,0xe8,0x4e,0xee,0x4e,0xf4,0x4e,0xfa,0x4f,0x00,0x4e,0x58,0x4e,0x8e,0x4e,0x94,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4e,0x5e,\r\n0x4e,0x7c,0x4e,0x5e,0x4e,0x7c,0x4e,0x5e,0x4e,0x7c,0x4e,0x8e,0x4e,0x94,0x4e,0x8e,0x4e,0x94,0x4e,0xa6,0x4e,0xac,0x4e,0xa6,0x4e,0xac,0x4e,0x5e,0x4e,0x7c,0x4e,0xd0,0x4e,0xd6,0x4e,0x22,0x4e,0x28,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4e,0xb2,0x4e,0x7c,0x4e,0x8e,0x4e,0x94,0x4f,0x12,\r\n0x4f,0x18,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x06,0x4f,0x0c,0x4f,0x1e,0x4f,0x24,0x4e,0x2e,0x4f,0x2a,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4f,0x30,0x4f,0x36,0x4f,0x3c,0x4f,0x42,0x4e,0x82,0x4e,0x88,0x4f,0x30,0x4f,0x36,0x4e,0x8e,0x4e,0x94,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,\r\n0x4e,0xac,0x4e,0x16,0x4e,0x58,0x4e,0xb8,0x4e,0xbe,0x4e,0xc4,0x4e,0xca,0x4e,0xdc,0x4e,0xe2,0x4e,0xc4,0x4e,0xca,0x4e,0xf4,0x4e,0xfa,0x4f,0x00,0x4e,0x58,0x4e,0x8e,0x4e,0x94,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4e,0x5e,0x4e,0x64,0x4e,0x2e,0x4e,0x34,0x4f,0x48,0x4e,0xa0,0x4e,0xc4,0x4e,0xca,0x4e,0xa6,0x4e,0xac,0x4e,0x3a,\r\n0x4e,0x40,0x4e,0x46,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4f,0x12,0x4f,0x18,0x00,0x02,0x00,0x03,0x0b,0xc0,0x0b,0xc0,0x00,0x00,0x0b,0xd7,0x0b,0xd7,0x00,0x01,0x0b,0xdc,0x0b,0xdc,0x00,0x02,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,\r\n0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x48,0xca,0x00,0x00,0x48,0xca,0x00,0x50,0x4a,0x76,0x4d,0xb8,0x4d,0xbe,0x4d,0xc4,0x4d,0xbe,0x4d,0xca,0x4b,0xc6,0x4d,0xd0,0x4b,0x8a,0x4d,0xd6,0x4b,0xc6,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,\r\n0x4d,0xee,0x4d,0xf4,0x4b,0xc6,0x4d,0xfa,0x4e,0x00,0x4b,0x1e,0x4e,0x06,0x4e,0x0c,0x4e,0x12,0x4e,0x18,0x4e,0x1e,0x4d,0xdc,0x4e,0x24,0x4e,0x2a,0x49,0x68,0x49,0x68,0x49,0x68,0x4d,0xdc,0x4d,0xdc,0x4d,0xe8,0x4d,0xe8,0x4e,0x30,0x4b,0x1e,0x4d,0xb8,0x4d,0xbe,0x4d,0xca,0x4d,0xe2,0x4d,0xe8,0x4d,0xee,0x4d,0xdc,0x4e,0x2a,0x4e,0x24,\r\n0x4e,0x24,0x4e,0x24,0x4e,0x24,0x4d,0xb8,0x4d,0xbe,0x4d,0xc4,0x4d,0xbe,0x4d,0xca,0x4c,0x2c,0x4e,0x36,0x4d,0xd6,0x4c,0x2c,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,0x4d,0xf4,0x4d,0xfa,0x4e,0x00,0x4e,0x06,0x4e,0x0c,0x4e,0x18,0x4e,0x1e,0x4d,0xdc,0x4e,0x24,0x4e,0x2a,0x4e,0x3c,0x4e,0x42,0x4e,0x48,0x4e,0x4e,0x4e,0x54,0x4e,0x5a,0x4e,0x42,\r\n0x4e,0x60,0x4e,0x66,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,\r\n0x00,0x02,0x00,0x00,0x47,0xe2,0x00,0x00,0x47,0xe2,0x00,0x0c,0x4d,0x84,0x4d,0x8a,0x49,0xbe,0x4d,0x8a,0x4d,0x8a,0x4d,0x90,0x4d,0x84,0x48,0xfe,0x4d,0x90,0x4d,0x96,0x4d,0x90,0x4d,0x72,0x00,0x01,0x00,0x02,0x0b,0xc0,0x0b,0xd7,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,\r\n0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x47,0x70,0x00,0x50,0x49,0x20,0x4c,0x62,0x4c,0x68,\r\n0x4c,0x6e,0x4c,0x68,0x4c,0x74,0x4a,0x70,0x4c,0x7a,0x4a,0x34,0x4c,0x80,0x4a,0x70,0x4c,0x86,0x4c,0x8c,0x4d,0x2e,0x4c,0x98,0x4c,0x9e,0x4a,0x70,0x4c,0xa4,0x4c,0xaa,0x49,0xc8,0x4c,0xb0,0x4c,0xb6,0x4c,0xbc,0x4c,0xc2,0x4c,0xc8,0x4c,0x86,0x4c,0xce,0x4c,0xd4,0x48,0x12,0x48,0x12,0x48,0x12,0x4c,0x86,0x4c,0x86,0x4d,0x2e,0x4d,0x2e,\r\n0x4c,0xda,0x49,0xc8,0x4c,0x62,0x4c,0x68,0x4c,0x74,0x4c,0x8c,0x4d,0x2e,0x4c,0x98,0x4c,0x86,0x4c,0xd4,0x4c,0xce,0x4c,0xce,0x4c,0xce,0x4c,0xce,0x4c,0x62,0x4c,0x68,0x4c,0x6e,0x4c,0x68,0x4c,0x74,0x4a,0xd6,0x4c,0xe0,0x4c,0x80,0x4a,0xd6,0x4c,0x86,0x4c,0x8c,0x4d,0x2e,0x4c,0x9e,0x4c,0xa4,0x4c,0xaa,0x4c,0xb0,0x4c,0xb6,0x4c,0xc2,\r\n0x4c,0xc8,0x4c,0x86,0x4c,0xce,0x4c,0xd4,0x4d,0x34,0x4c,0xec,0x4c,0xf2,0x4c,0xf8,0x4c,0xfe,0x4d,0x04,0x4c,0xec,0x4d,0x0a,0x4d,0x10,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,\r\n0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x2c,0x00,0x32,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x46,0x8e,0x00,0x0c,0x4c,0x58,0x4c,0x5e,0x4c,0x64,0x4c,0x5e,0x4c,0x5e,0x4c,0x6a,0x4c,0x58,0x4c,0x70,0x4c,0x6a,0x4c,0x76,0x4c,0x6a,0x4c,0x22,0x00,0x01,0x00,0x01,0x0b,0xce,0x00,0x02,0x00,0x09,0x0b,0x6a,\r\n0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0x64,0x00,0xa4,0x00,0x01,0x00,0x0c,0x00,0x4a,\r\n0x00,0x0f,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x00,0x46,0x22,0x00,0x0c,\r\n0x46,0x50,0x4b,0xd8,0x47,0xfa,0x4b,0xd8,0x4b,0xd8,0x4b,0xde,0x46,0x50,0x4b,0xe4,0x4b,0xde,0x4b,0xea,0x4b,0xde,0x4b,0x7e,0x00,0x02,0x00,0x0a,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcc,0x00,0x06,0x0b,0xcf,0x0b,0xcf,0x00,0x07,0x0b,0xd6,0x0b,0xd6,0x00,0x08,\r\n0x0b,0xd9,0x0b,0xda,0x00,0x09,0x0b,0xdd,0x0b,0xdd,0x00,0x0b,0x0b,0xe1,0x0b,0xe1,0x00,0x0c,0x12,0x5c,0x12,0x5d,0x00,0x0d,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,\r\n0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x45,0x44,0x00,0x00,0x45,0x44,0x00,0x50,0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4a,0x3e,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4a,0x3e,\r\n0x4a,0x8c,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x47,0xaa,0x45,0x88,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,0x4b,0xac,0x45,0x9a,0x4b,0xb2,0x4b,0xb8,0x47,0xf8,0x46,0x24,0x46,0x24,0x46,0x24,0x4a,0x8c,0x4a,0x8c,0x4b,0x82,0x4b,0x82,0x48,0x04,0x46,0x8a,0x4b,0x4c,0x4b,0x5e,0x4b,0x64,0x4b,0xbe,0x4b,0x82,0x4b,0x88,\r\n0x4b,0xb2,0x47,0xf8,0x4b,0xb8,0x4b,0xb8,0x4b,0xb8,0x4b,0xb8,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0xc4,0x4b,0x0a,0x4b,0x76,0x4b,0xc4,0x4a,0x8c,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x94,0x47,0xaa,0x4b,0x9a,0x4b,0xa0,0x4b,0xac,0x45,0x9a,0x4b,0xb2,0x4b,0xb8,0x47,0xf8,0x4a,0x3e,0x4b,0x52,0x4b,0x7c,0x4b,0xa0,\r\n0x46,0x8a,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x47,0xf8,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,\r\n0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x44,0x5c,0x00,0x00,0x44,0x5c,0x00,0x50,0x4a,0xe2,0x4a,0xe8,0x4a,0xee,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4a,0xfa,0x49,0x92,0x4b,0x00,0x4b,0x06,0x4a,0xfa,0x4b,0x0c,0x46,0x14,0x46,0x02,0x4b,0x12,0x4b,0x12,0x4a,0xa6,0x4b,0x18,0x4b,0x1e,0x4b,0x24,0x47,0x22,0x4b,0x2a,0x4a,0xbe,\r\n0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x4e,0x4b,0x4e,0x4b,0x0c,0x4b,0x0c,0x46,0x02,0x46,0x02,0x4b,0x54,0x4b,0x5a,0x4a,0xe8,0x44,0xdc,0x4a,0xf4,0x4b,0x60,0x46,0x02,0x4b,0x12,0x4b,0x3c,0x4b,0x48,0x4b,0x42,0x4b,0x42,0x4b,0x42,0x4b,0x42,0x4a,0xe8,0x4a,0xee,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4b,0x66,\r\n0x4b,0x6c,0x4b,0x06,0x4b,0x66,0x4b,0x0c,0x46,0x14,0x46,0x02,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x47,0x22,0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4a,0xfa,0x4a,0xee,0x46,0x14,0x4b,0x2a,0x4b,0x5a,0x46,0xd4,0x44,0xdc,0x4a,0xf4,0x4b,0x48,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,\r\n0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb8,0x00,0xc0,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x43,0x74,0x00,0x00,0x43,0x74,0x00,0x50,0x4a,0x8a,0x4a,0x90,0x4a,0x96,\r\n0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4a,0xa2,0x4a,0xa8,0x4a,0xae,0x4a,0xb4,0x4a,0xa2,0x4a,0xba,0x4a,0xc0,0x46,0x04,0x46,0x16,0x46,0x16,0x4a,0xc6,0x43,0x82,0x4a,0xcc,0x4a,0xd2,0x45,0xb6,0x4a,0xd8,0x4a,0xde,0x45,0xfe,0x4a,0xe4,0x4a,0xea,0x4a,0xf0,0x4a,0xf6,0x4a,0xfc,0x4a,0xfc,0x4a,0xfc,0x4a,0xba,0x4a,0xba,0x46,0x04,0x46,0x04,\r\n0x4b,0x02,0x4b,0x08,0x4a,0x90,0x4a,0x9c,0x46,0x1c,0x4b,0x0e,0x46,0x04,0x46,0x16,0x4a,0xea,0x4a,0xf6,0x4a,0xf0,0x4a,0xf0,0x4a,0xf0,0x4a,0xf0,0x4a,0x90,0x4a,0x96,0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4b,0x14,0x4a,0x72,0x4a,0xb4,0x4b,0x14,0x4a,0xba,0x4a,0xc0,0x46,0x04,0x46,0x16,0x43,0x82,0x4a,0xcc,0x45,0xb6,0x4a,0xd8,0x45,0xfe,\r\n0x4a,0xe4,0x4a,0xea,0x4a,0xf0,0x4a,0xf6,0x4a,0xa2,0x4a,0x96,0x4a,0xc0,0x4a,0xd8,0x4b,0x08,0x49,0xb8,0x4a,0x9c,0x46,0x1c,0x4a,0xf6,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,\r\n0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xe0,0x01,0x0e,0x00,0x01,0x00,0x0c,0x00,0x3e,0x00,0x0c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,\r\n0x00,0x00,0x42,0x8c,0x00,0x00,0x42,0x8c,0x00,0x50,0x48,0x90,0x43,0xe6,0x4a,0x0a,0x47,0xee,0x4a,0x10,0x4a,0x16,0x4a,0x1c,0x4a,0x22,0x4a,0x28,0x4a,0x2e,0x4a,0x1c,0x43,0x80,0x4a,0x34,0x47,0x64,0x48,0xf0,0x48,0xf0,0x4a,0x3a,0x4a,0x40,0x4a,0x46,0x4a,0x4c,0x4a,0x52,0x4a,0x58,0x4a,0x5e,0x4a,0x64,0x4a,0x6a,0x4a,0x70,0x4a,0x76,\r\n0x4a,0x7c,0x4a,0x82,0x4a,0x82,0x4a,0x82,0x43,0x80,0x43,0x80,0x47,0x64,0x47,0x64,0x4a,0x88,0x4a,0x8e,0x43,0xe6,0x4a,0x10,0x4a,0x16,0x4a,0x94,0x47,0x64,0x48,0xf0,0x4a,0x70,0x4a,0x7c,0x4a,0x76,0x4a,0x76,0x4a,0x76,0x4a,0x76,0x43,0xe6,0x4a,0x0a,0x47,0xee,0x4a,0x10,0x4a,0x16,0x47,0x82,0x4a,0x9a,0x4a,0x2e,0x47,0x82,0x43,0x80,\r\n0x4a,0x34,0x47,0x64,0x48,0xf0,0x4a,0x40,0x4a,0x46,0x4a,0x52,0x4a,0x58,0x4a,0x64,0x4a,0x6a,0x4a,0x70,0x4a,0x76,0x4a,0x7c,0x4a,0x1c,0x4a,0x0a,0x4a,0x34,0x4a,0x58,0x4a,0x8e,0x47,0xee,0x4a,0x10,0x4a,0x16,0x4a,0x7c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,\r\n0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,\r\n0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x41,0x56,0x00,0x00,0x41,0x56,0x00,0x0c,0x49,0x92,0x49,0x98,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x49,0x9e,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,\r\n0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x40,0xf0,0x00,0x00,0x40,0xf0,0x00,0x0c,0x46,0x2c,\r\n0x46,0x2c,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x49,0x3e,0x46,0xf2,0x49,0x3e,0x49,0x3e,0x00,0x01,0x00,0x02,0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,\r\n0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x30,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x40,0x8a,0x00,0x00,0x40,0x8a,0x00,0x0c,0x46,0x8c,0x46,0x8c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x47,0x1c,0x48,0xde,0x47,0x1c,0x47,0x1c,0x00,0x01,0x00,0x02,\r\n0x0b,0xc8,0x0b,0xdb,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0xf8,0x01,0x32,0x00,0x01,0x00,0x0c,0x00,0x56,0x00,0x12,\r\n0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,\r\n0x00,0x00,0x40,0x24,0x00,0x00,0x40,0x24,0x00,0x50,0x48,0x3e,0x48,0x44,0x40,0x28,0x48,0x4a,0x40,0x28,0x48,0x50,0x40,0x88,0x48,0x56,0x48,0x5c,0x48,0x62,0x40,0x88,0x45,0x08,0x41,0x2a,0x42,0x32,0x48,0x68,0x48,0x6e,0x40,0x88,0x42,0x38,0x48,0x74,0x48,0x7a,0x48,0x80,0x46,0x28,0x40,0x76,0x48,0x86,0x48,0x8c,0x45,0x08,0x47,0x00,\r\n0x48,0x92,0x48,0x98,0x48,0x98,0x48,0x98,0x45,0x08,0x45,0x08,0x42,0x32,0x42,0x32,0x47,0xd8,0x48,0x7a,0x48,0x44,0x40,0x28,0x48,0x50,0x41,0x2a,0x42,0x32,0x48,0x68,0x45,0x08,0x48,0x92,0x42,0x56,0x46,0xc4,0x42,0x56,0x46,0xc4,0x48,0x44,0x40,0x28,0x48,0x4a,0x40,0x28,0x48,0x50,0x48,0x9e,0x48,0xa4,0x48,0x62,0x48,0x9e,0x45,0x08,\r\n0x41,0x2a,0x42,0x32,0x48,0x6e,0x42,0x38,0x48,0x74,0x48,0x80,0x46,0x28,0x48,0x86,0x48,0x8c,0x45,0x08,0x47,0x00,0x48,0x92,0x48,0xaa,0x48,0xb0,0x48,0xb6,0x48,0xbc,0x46,0x52,0x48,0xc2,0x48,0xc8,0x48,0xce,0x48,0xd4,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,\r\n0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,\r\n0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x3e,0xca,0x00,0x50,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,\r\n0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,\r\n0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,0x3f,0xc0,\r\n0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x12,0xf4,0x13,0x46,0x00,0x03,0x00,0x0c,0x01,0xbe,0x00,0x6c,0x00,0x00,0x46,0xe8,\r\n0x00,0x02,0x46,0xee,0x00,0x00,0x46,0xf4,0x00,0x00,0x46,0xf4,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x00,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x06,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x0c,0x00,0x00,0x47,0x0c,0x00,0x00,0x47,0x12,\r\n0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x18,0x00,0x00,0x47,0x1e,0x00,0x00,0x47,0x24,0x00,0x01,0x47,0x2a,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x30,0x00,0x02,0x47,0x36,0x00,0x00,0x47,0x3c,0x00,0x02,0x47,0x42,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x48,0x00,0x02,0x47,0x4e,\r\n0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x54,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x54,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x5a,0x00,0x02,0x47,0x60,0x00,0x02,0x47,0x66,0x00,0x02,0x47,0x6c,0x00,0x02,0x3d,0xe8,\r\n0x00,0x02,0x47,0x72,0x00,0x02,0x3d,0xe8,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x78,0x00,0x00,0x47,0x00,0x00,0x00,0x47,0x7e,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x3c,0x00,0x02,0x43,0xb2,0x00,0x00,0x46,0xfa,0x00,0x02,0x47,0x84,0x00,0x02,0x3d,0xe8,0x00,0x02,0x47,0x8a,0x00,0x00,0x46,0xfa,0x00,0x00,0x46,0xfa,0x00,0x00,0x47,0x90,\r\n0x00,0x02,0x47,0x96,0x00,0x02,0x47,0x9c,0x00,0x00,0x47,0xa2,0x00,0x00,0x47,0xa8,0x00,0x00,0x47,0xae,0x00,0x00,0x47,0xae,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,\r\n0x00,0x00,0x47,0xb4,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0x3c,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xc0,0x00,0x00,0x46,0xfa,0x00,0x02,0x47,0xc6,0x00,0x02,0x47,0xcc,0x00,0x02,0x47,0xcc,0x00,0x02,0x47,0xcc,0x00,0x00,0x47,0xd2,0x00,0x02,0x47,0xd8,0x00,0x02,0x47,0x5a,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xba,0x00,0x00,0x47,0xba,\r\n0x00,0x02,0x47,0xde,0x00,0x00,0x47,0xe4,0x00,0x00,0x47,0xea,0x00,0x00,0x47,0xea,0x00,0x00,0x47,0xf0,0x00,0x00,0x47,0xf0,0x00,0x00,0x47,0xf6,0x00,0x00,0x47,0xf6,0x00,0x02,0x47,0xfc,0x00,0x00,0x48,0x02,0x00,0x02,0x48,0x08,0x02,0xde,0x46,0x5c,0x46,0x62,0x46,0x68,0x46,0x6e,0x46,0x74,0x46,0x7a,0x46,0x80,0x46,0x86,0x46,0x8c,\r\n0x46,0x92,0x46,0x98,0x46,0x9e,0x46,0xa4,0x46,0xaa,0x46,0xb0,0x46,0xa4,0x46,0xaa,0x46,0xb0,0x46,0xb6,0x46,0xbc,0x46,0xc2,0x46,0xc8,0x46,0xce,0x46,0xd4,0x46,0xda,0x46,0xe0,0x46,0xe6,0x46,0xec,0x46,0xf2,0x46,0xf8,0x46,0xfe,0x47,0x04,0x47,0x0a,0x47,0x10,0x47,0x16,0x47,0x1c,0x47,0x22,0x47,0x28,0x47,0x2e,0x46,0xb6,0x47,0x34,\r\n0x47,0x3a,0x47,0x40,0x47,0x46,0x47,0x4c,0x47,0x52,0x46,0x74,0x47,0x58,0x47,0x40,0x47,0x46,0x47,0x5e,0x47,0x52,0x47,0x64,0x46,0x68,0x47,0x6a,0x46,0xaa,0x47,0x70,0x47,0x76,0x47,0x7c,0x47,0x82,0x46,0x92,0x47,0x46,0x47,0x88,0x47,0x8e,0x47,0x46,0x47,0x94,0x47,0x9a,0x47,0xa0,0x47,0xa6,0x47,0xac,0x46,0x98,0x47,0xb2,0x47,0xb8,\r\n0x47,0x04,0x47,0xbe,0x46,0xfe,0x47,0x04,0x47,0xbe,0x47,0xc4,0x47,0xca,0x47,0xd0,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x47,0xe8,0x47,0xee,0x47,0xf4,0x47,0xfa,0x48,0x00,0x48,0x06,0x48,0x0c,0x47,0xca,0x47,0xf4,0x48,0x12,0x46,0x80,0x48,0x18,0x48,0x0c,0x48,0x1e,0x48,0x24,0x47,0xd6,0x47,0xdc,0x47,0x1c,0x48,0x2a,0x48,0x30,0x48,0x36,\r\n0x48,0x3c,0x48,0x30,0x48,0x42,0x47,0xd6,0x48,0x48,0x47,0x1c,0x48,0x2a,0x48,0x4e,0x48,0x36,0x48,0x54,0x48,0x5a,0x48,0x60,0x48,0x66,0x48,0x6c,0x47,0x1c,0x48,0x72,0x48,0x6c,0x48,0x78,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x66,0x48,0x8a,0x48,0x84,0x48,0x90,0x48,0x96,0x48,0x36,0x48,0x9c,0x48,0xa2,0x48,0xa8,0x48,0xae,0x48,0xb4,\r\n0x48,0xba,0x47,0xe8,0x48,0xc0,0x47,0x70,0x48,0xc6,0x48,0xcc,0x48,0xd2,0x48,0xd8,0x48,0xde,0x48,0xe4,0x48,0xea,0x48,0xf0,0x48,0xf6,0x48,0xfc,0x48,0x7e,0x49,0x02,0x49,0x08,0x47,0xee,0x49,0x0e,0x49,0x14,0x49,0x1a,0x46,0x68,0x49,0x14,0x49,0x1a,0x46,0x68,0x46,0x80,0x46,0x86,0x49,0x20,0x49,0x26,0x49,0x2c,0x46,0xb0,0x49,0x32,\r\n0x49,0x38,0x47,0x3a,0x49,0x3e,0x49,0x44,0x47,0x4c,0x49,0x4a,0x49,0x50,0x47,0x88,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x5c,0x47,0xd0,0x49,0x62,0x49,0x5c,0x49,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x49,0x56,0x49,0x74,0x47,0xd0,0x47,0xe8,0x47,0xee,0x49,0x7a,0x49,0x80,0x49,0x5c,0x47,0xf4,\r\n0x49,0x80,0x49,0x5c,0x47,0xf4,0x49,0x86,0x49,0x5c,0x49,0x8c,0x49,0x92,0x49,0x5c,0x47,0x70,0x48,0x2a,0x49,0x98,0x48,0x36,0x48,0x2a,0x49,0x9e,0x48,0x36,0x49,0xa4,0x49,0xaa,0x48,0x36,0x49,0xb0,0x49,0xaa,0x48,0x36,0x49,0xb6,0x49,0xbc,0x47,0x1c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x49,0xc2,0x49,0xbc,0x48,0x78,0x49,0xc8,0x49,0xbc,\r\n0x49,0xce,0x49,0xd4,0x49,0xbc,0x48,0x78,0x49,0xd4,0x49,0xbc,0x48,0x78,0x49,0xda,0x49,0xe0,0x47,0x70,0x49,0xda,0x49,0xe0,0x47,0x70,0x49,0x80,0x49,0xe0,0x47,0xf4,0x49,0xe6,0x49,0xe0,0x47,0xf4,0x49,0xec,0x49,0xf2,0x49,0xf8,0x49,0xfe,0x4a,0x04,0x4a,0x0a,0x47,0x40,0x49,0x44,0x47,0x4c,0x4a,0x10,0x4a,0x16,0x4a,0x1c,0x48,0x72,\r\n0x49,0xbc,0x48,0x78,0x4a,0x22,0x4a,0x28,0x4a,0x2e,0x4a,0x34,0x49,0x1a,0x46,0x68,0x49,0x14,0x4a,0x3a,0x46,0x68,0x49,0x3e,0x49,0x44,0x47,0x4c,0x4a,0x40,0x4a,0x46,0x4a,0x4c,0x4a,0x52,0x4a,0x58,0x4a,0x5e,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x4a,0x70,0x4a,0x76,0x47,0xbe,0x4a,0x34,0x49,0x1a,0x46,0x68,0x4a,0x7c,0x4a,0x82,0x4a,0x88,\r\n0x4a,0x34,0x4a,0x8e,0x46,0x68,0x4a,0x94,0x4a,0x9a,0x4a,0x88,0x49,0x26,0x4a,0x82,0x46,0xb0,0x4a,0xa0,0x4a,0xa6,0x46,0xe6,0x4a,0xac,0x4a,0xa6,0x4a,0xb2,0x4a,0xb8,0x4a,0xbe,0x46,0xe6,0x4a,0xa0,0x4a,0xc4,0x46,0xe6,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xca,0x49,0x50,0x47,0x4c,0x4a,0xd0,0x49,0x50,\r\n0x47,0x88,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4a,0xd6,0x4a,0xdc,0x48,0x36,0x47,0x10,0x47,0x16,0x47,0x1c,0x4a,0xe2,0x4a,0xe8,0x4a,0xee,0x4a,0xf4,0x4a,0xfa,0x47,0x70,0x4b,0x00,0x4b,0x06,0x48,0xa8,0x4b,0x0c,0x4b,0x12,0x47,0xbe,0x4b,0x18,0x4b,0x1e,0x49,0x0e,0x46,0x92,0x46,0x98,0x46,0x9e,0x4b,0x24,\r\n0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x4b,0x3c,0x4a,0x6a,0x49,0x02,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x54,0x4b,0x5a,0x4b,0x60,0x4b,0x66,0x4b,0x6c,0x46,0xc2,0x49,0x80,0x4b,0x72,0x48,0x24,0x4b,0x78,0x4b,0x7e,0x4a,0xb2,0x47,0x6a,0x46,0xaa,0x4b,0x84,0x48,0x9c,0x48,0xa2,0x4b,0x8a,0x4b,0x90,0x4b,0x96,0x46,0x8c,\r\n0x49,0xda,0x4b,0x1e,0x47,0xf4,0x4b,0x9c,0x4b,0x96,0x4b,0xa2,0x4b,0xa8,0x4b,0x1e,0x4b,0xae,0x47,0xfa,0x48,0x00,0x48,0x06,0x4a,0x34,0x4a,0x3a,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,0x4b,0xb4,0x46,0x62,0x4b,0xba,0x47,0xc4,0x47,0xca,0x4b,0xc0,0x4b,0xc6,0x4b,0xcc,0x4b,0xd2,0x47,0xfa,0x48,0x00,0x48,0x06,0x46,0x92,0x46,0x98,\r\n0x46,0x9e,0x46,0xa4,0x46,0xaa,0x4b,0xd8,0x48,0x0c,0x47,0xca,0x4b,0xde,0x4a,0x7c,0x4a,0xfa,0x46,0xb0,0x49,0x80,0x49,0x5c,0x47,0xf4,0x4b,0xe4,0x4b,0xea,0x47,0x1c,0x4b,0xf0,0x4b,0xf6,0x48,0x36,0x47,0x10,0x4b,0xfc,0x47,0x1c,0x48,0x2a,0x4c,0x02,0x48,0x36,0x47,0x10,0x47,0x16,0x47,0x1c,0x48,0x2a,0x48,0x4e,0x48,0x36,0x4b,0x66,\r\n0x4c,0x08,0x47,0x3a,0x4c,0x0e,0x49,0xbc,0x47,0x1c,0x4a,0xca,0x4c,0x08,0x4c,0x14,0x49,0xc2,0x49,0xbc,0x46,0xb0,0x4a,0xca,0x4c,0x1a,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x4c,0x20,0x4c,0x26,0x46,0x68,0x4c,0x2c,0x4c,0x32,0x48,0x36,0x4c,0x20,0x4c,0x26,0x46,0x68,0x4c,0x38,0x4c,0x32,0x48,0x36,0x4c,0x3e,0x4a,0xfa,0x47,0x70,\r\n0x4c,0x38,0x4b,0x06,0x48,0xa8,0x47,0x76,0x47,0x7c,0x4b,0x84,0x48,0xae,0x48,0xb4,0x4c,0x44,0x4a,0xf4,0x4c,0x4a,0x47,0x82,0x4c,0x50,0x4c,0x56,0x48,0xba,0x4b,0xc6,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4c,0x62,0x4c,0x68,0x47,0xbe,0x4c,0x6e,0x4b,0x1e,\r\n0x49,0x0e,0x4c,0x74,0x4c,0x7a,0x47,0x1c,0x4c,0x80,0x4b,0x1e,0x49,0x0e,0x4c,0x86,0x4c,0x8c,0x4c,0x92,0x4c,0x98,0x4c,0x9e,0x4c,0xa4,0x4c,0xaa,0x4c,0xb0,0x4c,0xb6,0x4c,0xbc,0x4a,0x3a,0x46,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x4c,0xc2,0x4b,0x96,0x4c,0xc8,0x49,0xda,0x4b,0x1e,0x47,0xf4,0x49,0x3e,0x4c,0xce,0x47,0x4c,0x49,0xd4,\r\n0x4b,0x1e,0x48,0x78,0x4c,0xd4,0x4a,0x9a,0x47,0xbe,0x49,0xe6,0x4c,0xda,0x47,0xf4,0x4c,0xe0,0x4a,0x9a,0x46,0xb0,0x49,0xda,0x49,0x5c,0x47,0x70,0x4c,0xe6,0x4c,0xec,0x47,0x82,0x49,0xe6,0x49,0x5c,0x47,0xf4,0x4b,0x9c,0x4c,0xf2,0x4b,0xa2,0x4b,0xa8,0x4b,0x72,0x4c,0xf8,0x49,0x32,0x4b,0x6c,0x46,0xc2,0x49,0xe6,0x4b,0x72,0x48,0x24,\r\n0x46,0xb6,0x46,0xbc,0x4c,0xfe,0x4d,0x04,0x4d,0x0a,0x48,0x24,0x4d,0x10,0x4c,0x08,0x46,0xd4,0x4d,0x16,0x4d,0x1c,0x47,0xb2,0x4d,0x22,0x4d,0x28,0x4d,0x2e,0x4d,0x34,0x4d,0x3a,0x4d,0x40,0x4d,0x46,0x4a,0xbe,0x4a,0xee,0x4d,0x4c,0x49,0xaa,0x48,0x36,0x4d,0x52,0x4a,0xbe,0x46,0xe6,0x4d,0x58,0x49,0xaa,0x48,0x36,0x4d,0x5e,0x4a,0xc4,\r\n0x4a,0xee,0x4d,0x64,0x49,0x9e,0x48,0x36,0x4d,0x6a,0x46,0xe0,0x4d,0x70,0x48,0x2a,0x48,0x30,0x4d,0x76,0x4d,0x7c,0x4d,0x82,0x46,0xf8,0x48,0x3c,0x4d,0x88,0x48,0x42,0x46,0xfe,0x47,0x04,0x4d,0x8e,0x47,0xd6,0x48,0x48,0x4d,0x94,0x4d,0x9a,0x4d,0xa0,0x4d,0xa6,0x47,0x10,0x47,0x16,0x4d,0xac,0x48,0x2a,0x48,0x4e,0x4d,0xb2,0x46,0xb6,\r\n0x47,0x34,0x4c,0xfe,0x48,0x66,0x48,0x6c,0x4d,0x94,0x46,0xb6,0x47,0x34,0x4d,0xb8,0x48,0x66,0x48,0x6c,0x48,0x84,0x4d,0xbe,0x49,0x44,0x47,0x4c,0x49,0xd4,0x49,0xbc,0x48,0x78,0x4a,0xca,0x49,0x44,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x47,0x52,0x47,0x64,0x4d,0xc4,0x48,0x90,0x48,0x96,0x4d,0xca,0x4a,0xf4,0x4a,0xfa,0x47,0x70,\r\n0x4c,0x38,0x4b,0x06,0x48,0xa8,0x4d,0xd0,0x4d,0xd6,0x4d,0xdc,0x4d,0xe2,0x4d,0xe8,0x48,0xba,0x49,0x4a,0x49,0x50,0x47,0x88,0x49,0x92,0x49,0xe0,0x47,0x70,0x4d,0xee,0x49,0x50,0x47,0x88,0x49,0x92,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x49,0x50,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x46,0x92,0x47,0x46,0x4d,0xf4,0x47,0xe8,0x48,0xc0,\r\n0x4d,0xfa,0x4e,0x00,0x4e,0x06,0x47,0xa6,0x4e,0x0c,0x4e,0x12,0x48,0xe4,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x49,0x56,0x4a,0x6a,0x4e,0x18,0x4e,0x1e,0x4e,0x24,0x48,0x36,0x4e,0x2a,0x4e,0x06,0x47,0xa6,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4e,0x2a,0x4e,0x06,0x47,0xa6,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4e,0x36,0x4e,0x06,0x47,0xa6,0x4e,0x3c,\r\n0x4e,0x12,0x48,0xe4,0x4b,0x36,0x4a,0x76,0x47,0xbe,0x4b,0x3c,0x4e,0x42,0x49,0x02,0x47,0x40,0x4e,0x48,0x47,0x4c,0x48,0x72,0x4e,0x4e,0x48,0x78,0x4e,0x54,0x4e,0x5a,0x47,0x88,0x4e,0x60,0x4e,0x66,0x47,0x70,0x4b,0xb4,0x46,0x62,0x4e,0x6c,0x4e,0x72,0x47,0xca,0x4e,0x78,0x4a,0x34,0x4a,0x8e,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,\r\n0x47,0xb8,0x46,0xaa,0x4e,0x7e,0x48,0x66,0x47,0xca,0x4e,0x84,0x4a,0xf4,0x4a,0xfa,0x47,0x82,0x49,0x80,0x49,0x5c,0x47,0xf4,0x4c,0xe6,0x4a,0x9a,0x47,0x82,0x49,0xe6,0x4c,0xda,0x47,0xf4,0x4a,0xa0,0x4e,0x8a,0x46,0xe6,0x48,0x2a,0x4e,0x90,0x48,0x36,0x46,0xda,0x46,0xe0,0x4e,0x96,0x48,0x2a,0x48,0x30,0x4e,0x9c,0x47,0x40,0x47,0x46,\r\n0x4e,0xa2,0x48,0x72,0x48,0x6c,0x4e,0xa8,0x4a,0xca,0x4c,0x5c,0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x46,0x92,0x47,0x46,0x4e,0xae,0x47,0xe8,0x48,0xc0,0x4e,0xb4,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x47,0xb8,0x47,0x04,0x4e,0x7e,0x48,0xfc,0x48,0x7e,0x49,0x02,0x4b,0x36,0x4b,0x12,0x47,0xbe,0x4b,0x3c,\r\n0x4e,0x42,0x49,0x02,0x4a,0x70,0x4a,0x76,0x47,0xbe,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x47,0x76,0x47,0x7c,0x4e,0xba,0x48,0xae,0x48,0xb4,0x4e,0xc0,0x4e,0xc6,0x4e,0xcc,0x4e,0xd2,0x4e,0xd8,0x4e,0xde,0x4e,0xe4,0x46,0xa4,0x46,0xaa,0x4e,0xea,0x48,0x0c,0x47,0xca,0x49,0x7a,0x4b,0xb4,0x46,0x62,0x4e,0xf0,0x47,0xc4,0x47,0xca,0x4e,0xf6,\r\n0x4e,0xfc,0x4f,0x02,0x46,0x7a,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x4f,0x08,0x46,0x74,0x4f,0x0e,0x47,0xd6,0x47,0xdc,0x4f,0x14,0x47,0xb8,0x46,0x74,0x4f,0x1a,0x47,0xd6,0x47,0xdc,0x4f,0x20,0x49,0x14,0x4f,0x26,0x46,0x68,0x47,0xfa,0x48,0x00,0x48,0x06,0x4f,0x2c,0x46,0x98,0x4f,0x32,0x4f,0x38,0x48,0x00,0x4e,0xa8,0x46,0xfe,0x46,0x98,\r\n0x4f,0x3e,0x47,0xd6,0x48,0x00,0x4f,0x44,0x46,0x92,0x46,0x98,0x4f,0x4a,0x47,0xfa,0x48,0x00,0x4f,0x50,0x4f,0x56,0x46,0x98,0x4f,0x5c,0x47,0xd6,0x48,0x00,0x48,0x84,0x47,0x10,0x46,0xaa,0x48,0x84,0x4f,0x62,0x47,0xca,0x4c,0xf8,0x4f,0x08,0x46,0xaa,0x4f,0x68,0x48,0x0c,0x47,0xca,0x4b,0xde,0x4f,0x6e,0x4a,0x82,0x4f,0x74,0x4f,0x7a,\r\n0x4f,0x80,0x48,0x18,0x4f,0x86,0x49,0x38,0x46,0xc2,0x49,0xe6,0x4b,0x72,0x48,0x24,0x4f,0x8c,0x4f,0x92,0x46,0xd4,0x4f,0x98,0x4f,0x9e,0x47,0x1c,0x46,0xc8,0x46,0xce,0x4f,0xa4,0x4f,0xaa,0x47,0xdc,0x4f,0xb0,0x4f,0x8c,0x49,0x38,0x46,0xd4,0x4f,0xb6,0x4f,0xbc,0x47,0x94,0x46,0xc8,0x46,0xce,0x4f,0xc2,0x47,0xd6,0x47,0xdc,0x48,0x84,\r\n0x46,0xc8,0x46,0xce,0x4f,0xc8,0x47,0xd6,0x47,0xdc,0x4f,0xce,0x46,0xda,0x46,0xe0,0x4f,0xd4,0x48,0x2a,0x48,0x30,0x4d,0x76,0x4f,0xda,0x4c,0x68,0x47,0x0a,0x4f,0xe0,0x49,0x2c,0x47,0x1c,0x47,0x8e,0x47,0x04,0x4f,0xe6,0x4f,0xec,0x48,0x48,0x4e,0xb4,0x46,0xfe,0x47,0x04,0x4f,0x3e,0x4f,0xf2,0x48,0x48,0x4f,0xf8,0x47,0x76,0x47,0x16,\r\n0x4e,0xb4,0x48,0x2a,0x48,0x4e,0x4e,0x9c,0x4f,0xfe,0x50,0x04,0x4e,0xb4,0x50,0x0a,0x4b,0xf6,0x4e,0x9c,0x4f,0x08,0x47,0x16,0x4f,0xf8,0x48,0x2a,0x48,0x4e,0x50,0x10,0x50,0x16,0x47,0x16,0x50,0x1c,0x48,0x2a,0x48,0x4e,0x50,0x22,0x50,0x28,0x50,0x2e,0x47,0x2e,0x50,0x34,0x50,0x3a,0x48,0x60,0x50,0x40,0x50,0x46,0x47,0x2e,0x50,0x34,\r\n0x50,0x3a,0x48,0x60,0x47,0x22,0x47,0x28,0x50,0x4c,0x48,0x54,0x48,0x5a,0x50,0x52,0x50,0x58,0x49,0x38,0x50,0x5e,0x49,0xd4,0x49,0xbc,0x46,0xb0,0x50,0x64,0x47,0x34,0x50,0x6a,0x48,0x72,0x48,0x6c,0x4e,0xa8,0x50,0x64,0x47,0x34,0x50,0x70,0x48,0x72,0x48,0x6c,0x50,0x76,0x47,0x40,0x47,0x34,0x50,0x7c,0x48,0x66,0x48,0x6c,0x48,0x84,\r\n0x4c,0x20,0x50,0x82,0x47,0x58,0x4c,0x0e,0x4a,0x6a,0x48,0x84,0x4a,0x94,0x50,0x88,0x4a,0x88,0x50,0x8e,0x4a,0x6a,0x50,0x94,0x50,0x9a,0x50,0xa0,0x46,0xb0,0x50,0xa6,0x4c,0x32,0x48,0x36,0x47,0x52,0x47,0x64,0x50,0xac,0x48,0x90,0x48,0x96,0x4e,0x9c,0x47,0x52,0x47,0x64,0x50,0xb2,0x48,0x90,0x48,0x96,0x50,0x10,0x4c,0x74,0x4a,0x82,\r\n0x50,0xb8,0x4c,0x2c,0x4b,0x06,0x50,0xbe,0x47,0x6a,0x46,0xaa,0x4e,0xb4,0x50,0xc4,0x48,0xa2,0x50,0xca,0x4c,0x3e,0x50,0xd0,0x47,0x70,0x4c,0x38,0x50,0xd6,0x48,0xa8,0x50,0xdc,0x50,0xd0,0x4b,0xae,0x50,0xe2,0x50,0xd6,0x48,0xa8,0x50,0xe8,0x4a,0x82,0x50,0xee,0x4c,0x2c,0x4b,0x06,0x50,0xf4,0x4c,0xe6,0x4a,0x9a,0x47,0x82,0x50,0xfa,\r\n0x4c,0x56,0x48,0xba,0x47,0x76,0x47,0x7c,0x4e,0xb4,0x48,0xae,0x48,0xb4,0x51,0x00,0x47,0x76,0x47,0x7c,0x51,0x06,0x48,0xae,0x48,0xb4,0x51,0x0c,0x47,0x76,0x47,0x7c,0x51,0x12,0x48,0xae,0x48,0xb4,0x51,0x18,0x46,0x92,0x47,0x46,0x4e,0xae,0x51,0x1e,0x48,0xc0,0x51,0x24,0x46,0x92,0x47,0x46,0x4e,0xae,0x47,0xe8,0x48,0xc0,0x4e,0xb4,\r\n0x4f,0x56,0x47,0x46,0x4f,0x5c,0x51,0x2a,0x48,0xc0,0x50,0x1c,0x51,0x30,0x51,0x36,0x47,0x94,0x49,0x62,0x51,0x3c,0x48,0xd2,0x47,0x8e,0x47,0x46,0x4f,0xe6,0x48,0xc6,0x48,0xcc,0x51,0x42,0x51,0x48,0x51,0x4e,0x47,0xa6,0x51,0x54,0x4e,0x12,0x48,0xe4,0x47,0x9a,0x47,0xa0,0x51,0x5a,0x48,0xd8,0x48,0xde,0x51,0x60,0x51,0x66,0x51,0x6c,\r\n0x47,0xb2,0x51,0x72,0x51,0x78,0x48,0xf6,0x51,0x66,0x4f,0x26,0x47,0xb2,0x51,0x72,0x4e,0x42,0x48,0xf6,0x4a,0x70,0x4c,0x7a,0x47,0xbe,0x4a,0x64,0x4e,0x42,0x49,0x02,0x49,0x26,0x4b,0x12,0x46,0xb0,0x4c,0x6e,0x4b,0x1e,0x51,0x7e,0x46,0xfe,0x47,0x04,0x4e,0xa8,0x49,0x08,0x47,0xee,0x51,0x84,0x46,0xfe,0x47,0x04,0x4f,0x1a,0x48,0x90,\r\n0x47,0xee,0x51,0x8a,0x47,0xd6,0x47,0xdc,0x4f,0x44,0x51,0x90,0x51,0x96,0x48,0xba,0x4e,0x30,0x4e,0x12,0x48,0xe4,0x4b,0x3c,0x4a,0x6a,0x49,0x02,0x49,0x56,0x51,0x9c,0x47,0xd0,0x51,0xa2,0x51,0xa8,0x51,0xae,0x4b,0x54,0x51,0xb4,0x51,0xba,0x51,0xc0,0x51,0xc6,0x51,0xcc,0x51,0xd2,0x51,0xd8,0x51,0xde,0x4b,0x54,0x51,0xe4,0x51,0xba,\r\n0x51,0xea,0x51,0xf0,0x51,0xf6,0x4b,0x54,0x51,0xb4,0x51,0xba,0x51,0xfc,0x52,0x02,0x52,0x08,0x52,0x0e,0x52,0x14,0x52,0x1a,0x52,0x20,0x52,0x26,0x4b,0x30,0x52,0x2c,0x52,0x32,0x46,0x9e,0x52,0x38,0x52,0x3e,0x52,0x44,0x52,0x4a,0x52,0x50,0x52,0x56,0x4b,0x54,0x52,0x5c,0x51,0xba,0x52,0x62,0x52,0x68,0x52,0x6e,0x52,0x74,0x52,0x7a,\r\n0x51,0x7e,0x52,0x80,0x52,0x86,0x48,0x78,0x52,0x8c,0x52,0x92,0x52,0x98,0x52,0x9e,0x52,0xa4,0x46,0xc2,0x52,0xaa,0x52,0xb0,0x52,0xb6,0x52,0xbc,0x52,0xc2,0x52,0xc8,0x52,0xce,0x52,0xd4,0x48,0x18,0x52,0xda,0x52,0xe0,0x4a,0xb2,0x52,0xe6,0x52,0xec,0x52,0xf2,0x52,0xf8,0x52,0xfe,0x53,0x04,0x53,0x0a,0x53,0x10,0x53,0x16,0x53,0x1c,\r\n0x53,0x22,0x53,0x04,0x53,0x28,0x53,0x2e,0x53,0x34,0x53,0x3a,0x53,0x40,0x53,0x46,0x53,0x4c,0x53,0x52,0x53,0x58,0x53,0x5e,0x53,0x64,0x53,0x6a,0x53,0x70,0x53,0x76,0x53,0x7c,0x53,0x82,0x53,0x88,0x53,0x8e,0x53,0x94,0x53,0x9a,0x53,0xa0,0x53,0xa6,0x53,0xac,0x4b,0x60,0x53,0xb2,0x53,0xb8,0x53,0xbe,0x47,0x6a,0x46,0xaa,0x47,0x70,\r\n0x48,0x9c,0x48,0xa2,0x48,0xa8,0x53,0xc4,0x53,0xca,0x53,0xd0,0x53,0xd6,0x53,0xdc,0x53,0xe2,0x53,0xe8,0x53,0xee,0x53,0xf4,0x53,0xfa,0x54,0x00,0x54,0x06,0x54,0x0c,0x54,0x12,0x54,0x18,0x53,0xfa,0x54,0x00,0x54,0x1e,0x54,0x24,0x54,0x2a,0x54,0x30,0x54,0x36,0x54,0x3c,0x54,0x42,0x54,0x48,0x54,0x4e,0x54,0x54,0x54,0x5a,0x54,0x60,\r\n0x54,0x66,0x46,0xfe,0x47,0x04,0x47,0xbe,0x49,0x08,0x47,0xee,0x49,0x0e,0x47,0x76,0x47,0x04,0x51,0x12,0x46,0x80,0x46,0xce,0x54,0x6c,0x54,0x72,0x54,0x78,0x54,0x7e,0x54,0x84,0x54,0x8a,0x54,0x90,0x54,0x96,0x54,0x9c,0x54,0xa2,0x54,0xa8,0x54,0xae,0x54,0xb4,0x54,0xba,0x54,0xc0,0x54,0xc6,0x54,0xcc,0x54,0xd2,0x54,0xd8,0x54,0xde,\r\n0x54,0xe4,0x54,0xea,0x54,0xf0,0x54,0xf6,0x54,0xfc,0x55,0x02,0x55,0x08,0x55,0x0e,0x55,0x14,0x55,0x1a,0x55,0x20,0x55,0x26,0x55,0x2c,0x55,0x32,0x55,0x38,0x55,0x3e,0x55,0x44,0x4a,0x34,0x4a,0x8e,0x46,0x68,0x55,0x4a,0x49,0x5c,0x55,0x50,0x4a,0xa0,0x4a,0xa6,0x46,0xe6,0x48,0x2a,0x55,0x56,0x48,0x36,0x4a,0xca,0x4c,0x5c,0x47,0x4c,\r\n0x49,0xc2,0x49,0xbc,0x48,0x78,0x55,0x5c,0x4c,0x5c,0x55,0x62,0x4b,0xa8,0x49,0xe0,0x4b,0xae,0x4e,0x72,0x47,0xca,0x52,0x08,0x55,0x68,0x55,0x6e,0x55,0x74,0x55,0x7a,0x55,0x80,0x55,0x86,0x46,0xb6,0x46,0xbc,0x46,0xc2,0x48,0x0c,0x48,0x1e,0x48,0x24,0x55,0x8c,0x4c,0xf2,0x55,0x92,0x4b,0xa8,0x4b,0x72,0x4c,0xf8,0x49,0x26,0x4c,0x68,\r\n0x46,0xb0,0x55,0x98,0x49,0x2c,0x53,0x04,0x47,0x40,0x47,0x46,0x55,0x9e,0x48,0x72,0x48,0x6c,0x55,0xa4,0x4d,0xbe,0x49,0x44,0x55,0x9e,0x49,0xd4,0x49,0xbc,0x55,0xa4,0x55,0xaa,0x4c,0x68,0x4e,0x18,0x55,0xb0,0x4b,0x1e,0x55,0xb6,0x48,0x3c,0x55,0xbc,0x48,0x42,0x55,0xc2,0x55,0xc8,0x55,0xce,0x55,0xd4,0x55,0xda,0x54,0xc6,0x55,0xe0,\r\n0x55,0xe6,0x54,0xd8,0x4b,0x66,0x4c,0xf2,0x46,0xc2,0x49,0x80,0x4b,0x72,0x48,0x24,0x46,0x92,0x55,0xec,0x46,0x9e,0x55,0xf2,0x55,0xf8,0x55,0xfe,0x4b,0x66,0x49,0x38,0x47,0x3a,0x4c,0x0e,0x49,0xbc,0x47,0x1c,0x4a,0x34,0x56,0x04,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,0x4a,0x34,0x4a,0x3a,0x46,0x68,0x49,0x56,0x49,0x5c,0x47,0xd0,\r\n0x4c,0xe0,0x56,0x0a,0x46,0xb0,0x49,0xda,0x49,0x5c,0x47,0xf4,0x4a,0x7c,0x4a,0x9a,0x4a,0x88,0x49,0xda,0x49,0x5c,0x47,0x70,0x4a,0xa0,0x56,0x10,0x46,0xe6,0x48,0x2a,0x56,0x16,0x48,0x36,0x4a,0xa0,0x4a,0xbe,0x46,0xe6,0x48,0x2a,0x49,0xaa,0x48,0x36,0x4b,0x90,0x49,0x44,0x47,0x4c,0x49,0x80,0x49,0xbc,0x48,0x78,0x4a,0xca,0x49,0x44,\r\n0x47,0x4c,0x49,0xc2,0x49,0xbc,0x48,0x78,0x4a,0xf4,0x4c,0x26,0x46,0xb0,0x4b,0x00,0x4c,0x32,0x48,0x36,0x4c,0x20,0x50,0xa0,0x46,0x68,0x56,0x1c,0x4c,0x32,0x48,0x36,0x4a,0xd0,0x4c,0x5c,0x47,0x88,0x49,0xda,0x49,0xe0,0x47,0x70,0x4a,0xd0,0x49,0x50,0x47,0x88,0x4b,0xa8,0x49,0xe0,0x4b,0xae,0x56,0x22,0x56,0x28,0x56,0x2e,0x56,0x34,\r\n0x56,0x3a,0x56,0x40,0x4d,0x10,0x4c,0x08,0x46,0xd4,0x55,0x98,0x56,0x46,0x47,0x1c,0x56,0x4c,0x56,0x52,0x56,0x58,0x56,0x5e,0x56,0x64,0x56,0x6a,0x56,0x70,0x56,0x76,0x4b,0xae,0x46,0xfe,0x47,0x04,0x56,0x7c,0x49,0x08,0x47,0xee,0x56,0x82,0x49,0x14,0x49,0x1a,0x46,0x68,0x49,0x6e,0x49,0x5c,0x47,0xd0,0x49,0x3e,0x49,0x50,0x47,0x4c,\r\n0x49,0xd4,0x49,0xbc,0x48,0x78,0x4a,0x70,0x4f,0x92,0x47,0xbe,0x4a,0x64,0x4a,0x6a,0x49,0x02,0x56,0x88,0x56,0x8e,0x56,0x94,0x56,0x9a,0x56,0xa0,0x56,0xa6,0x56,0x9a,0x56,0xac,0x56,0xa6,0x56,0xb2,0x56,0xb8,0x56,0xbe,0x56,0xc4,0x56,0xca,0x56,0xd0,0x56,0xd6,0x56,0xca,0x56,0xdc,0x56,0xe2,0x56,0xe8,0x56,0xee,0x56,0xe2,0x56,0xf4,\r\n0x56,0xbe,0x56,0xfa,0x4e,0xde,0x57,0x00,0x57,0x06,0x57,0x0c,0x57,0x12,0x57,0x18,0x57,0x1e,0x57,0x24,0x57,0x2a,0x57,0x1e,0x57,0x30,0x57,0x2a,0x57,0x36,0x57,0x30,0x57,0x3c,0x57,0x42,0x57,0x48,0x57,0x4e,0x57,0x54,0x57,0x5a,0x57,0x60,0x56,0xf4,0x48,0x24,0x48,0x0c,0x48,0x1e,0x48,0x24,0x57,0x66,0x57,0x6c,0x57,0x72,0x57,0x78,\r\n0x57,0x7e,0x57,0x84,0x57,0x8a,0x57,0x90,0x57,0x96,0x57,0x9c,0x57,0xa2,0x57,0xa8,0x57,0xae,0x57,0xb4,0x47,0x1c,0x57,0xae,0x57,0xb4,0x57,0xa8,0x57,0xba,0x57,0xc0,0x57,0xc6,0x57,0xcc,0x57,0xd2,0x48,0x18,0x57,0xd8,0x57,0xde,0x57,0xe4,0x57,0xea,0x57,0xf0,0x57,0xf6,0x57,0xfc,0x58,0x02,0x58,0x08,0x58,0x0e,0x58,0x14,0x58,0x1a,\r\n0x58,0x20,0x58,0x26,0x58,0x2c,0x58,0x32,0x58,0x38,0x4c,0x92,0x58,0x32,0x58,0x38,0x58,0x3e,0x48,0x54,0x48,0x5a,0x58,0x44,0x48,0x66,0x48,0x6c,0x48,0x84,0x48,0x66,0x48,0x6c,0x48,0x84,0x58,0x4a,0x58,0x50,0x46,0xb0,0x58,0x56,0x58,0x5c,0x48,0x78,0x58,0x62,0x58,0x68,0x58,0x6e,0x58,0x74,0x58,0x7a,0x58,0x80,0x58,0x86,0x58,0x8c,\r\n0x58,0x92,0x58,0x98,0x58,0x9e,0x58,0xa4,0x58,0xaa,0x58,0xb0,0x58,0xa4,0x58,0x98,0x58,0x9e,0x58,0xb6,0x58,0xbc,0x48,0x96,0x50,0x22,0x58,0xbc,0x48,0x96,0x57,0x5a,0x58,0xc2,0x58,0xc8,0x58,0xce,0x58,0xd4,0x58,0xda,0x58,0xe0,0x58,0xe6,0x58,0xec,0x58,0xf2,0x58,0xe6,0x58,0xf8,0x58,0xf2,0x48,0x9c,0x48,0xa2,0x58,0xfe,0x59,0x04,\r\n0x59,0x0a,0x59,0x10,0x59,0x16,0x59,0x1c,0x59,0x22,0x59,0x28,0x59,0x2e,0x59,0x34,0x59,0x3a,0x59,0x40,0x59,0x46,0x59,0x4c,0x59,0x52,0x59,0x58,0x48,0xae,0x48,0xb4,0x59,0x5e,0x59,0x64,0x59,0x6a,0x59,0x70,0x59,0x76,0x59,0x7c,0x59,0x82,0x59,0x88,0x59,0x8e,0x59,0x94,0x59,0x9a,0x59,0xa0,0x48,0xd2,0x59,0xa6,0x59,0xac,0x59,0xb2,\r\n0x59,0xb8,0x59,0xbe,0x58,0xf2,0x59,0xc4,0x59,0xca,0x59,0xd0,0x49,0x08,0x47,0xee,0x59,0xd6,0x49,0x08,0x47,0xee,0x59,0xdc,0x59,0xe2,0x47,0xee,0x56,0x40,0x59,0xe2,0x47,0xee,0x56,0x40,0x59,0xe8,0x59,0xee,0x59,0xf4,0x59,0xe8,0x59,0xfa,0x5a,0x00,0x57,0xea,0x5a,0x06,0x5a,0x0c,0x5a,0x12,0x5a,0x18,0x48,0x24,0x5a,0x1e,0x5a,0x24,\r\n0x5a,0x2a,0x58,0xe6,0x5a,0x30,0x58,0xf2,0x5a,0x36,0x5a,0x3c,0x5a,0x42,0x5a,0x48,0x5a,0x4e,0x5a,0x54,0x5a,0x5a,0x57,0xa2,0x4d,0x40,0x5a,0x60,0x5a,0x66,0x5a,0x6c,0x5a,0x72,0x5a,0x78,0x5a,0x7e,0x5a,0x84,0x5a,0x8a,0x51,0x7e,0x47,0xd6,0x5a,0x90,0x48,0x84,0x59,0xe8,0x59,0xee,0x59,0xf4,0x59,0xe8,0x59,0xfa,0x5a,0x00,0x5a,0x96,\r\n0x5a,0x9c,0x5a,0xa2,0x5a,0x96,0x5a,0xa8,0x5a,0xae,0x5a,0x96,0x5a,0xb4,0x5a,0xba,0x5a,0xc0,0x5a,0xc6,0x5a,0xcc,0x5a,0xd2,0x5a,0xd8,0x5a,0xde,0x5a,0xe4,0x5a,0xea,0x5a,0xf0,0x5a,0xf6,0x53,0x64,0x5a,0xfc,0x5b,0x02,0x5b,0x08,0x5b,0x0e,0x5b,0x14,0x5b,0x1a,0x5b,0x20,0x5b,0x26,0x5b,0x2c,0x5b,0x32,0x5b,0x38,0x5b,0x2c,0x5b,0x32,\r\n0x5b,0x3e,0x5b,0x44,0x48,0x42,0x5b,0x4a,0x5b,0x44,0x46,0xe6,0x5b,0x50,0x5b,0x56,0x5b,0x5c,0x5b,0x62,0x5b,0x68,0x50,0x22,0x5b,0x6e,0x5b,0x74,0x48,0x84,0x5b,0x7a,0x5b,0x80,0x5b,0x86,0x52,0x62,0x5b,0x8c,0x52,0x6e,0x52,0x62,0x5b,0x8c,0x52,0x6e,0x5b,0x92,0x5b,0x98,0x5b,0x9e,0x5b,0xa4,0x5b,0xaa,0x5b,0xb0,0x5b,0xb6,0x5b,0xbc,\r\n0x5b,0xc2,0x5b,0xc8,0x5b,0xce,0x5b,0xd4,0x5b,0xda,0x5b,0xe0,0x5b,0xe6,0x47,0x10,0x47,0x16,0x47,0x1c,0x5b,0xec,0x5b,0xf2,0x5b,0xf8,0x48,0x9c,0x48,0xa2,0x5b,0xfe,0x49,0x08,0x47,0xee,0x5c,0x04,0x5c,0x0a,0x5c,0x10,0x48,0xd2,0x47,0xd6,0x47,0xdc,0x47,0xe2,0x47,0xfa,0x48,0x00,0x48,0x06,0x48,0x12,0x46,0x80,0x48,0x18,0x48,0x54,\r\n0x48,0x5a,0x48,0x60,0x48,0x66,0x48,0x6c,0x47,0x1c,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x90,0x48,0x96,0x48,0x36,0x5c,0x16,0x5c,0x1c,0x5c,0x22,0x48,0x9c,0x48,0xa2,0x48,0xa8,0x48,0xae,0x48,0xb4,0x48,0xba,0x49,0x08,0x47,0xee,0x49,0x0e,0x5c,0x28,0x5c,0x2e,0x56,0xee,0x5c,0x34,0x5c,0x3a,0x5c,0x40,0x5c,0x46,0x5c,0x4c,0x5c,0x52,\r\n0x5c,0x58,0x5c,0x5e,0x5c,0x64,0x5c,0x6a,0x57,0xde,0x5c,0x70,0x4a,0xd6,0x5c,0x76,0x48,0x36,0x48,0x66,0x48,0x7e,0x48,0x84,0x5c,0x7c,0x5c,0x82,0x5c,0x88,0x59,0x76,0x59,0x7c,0x59,0x82,0x47,0xd6,0x47,0xdc,0x5c,0x8e,0x47,0xfa,0x48,0x00,0x5c,0x94,0x48,0x12,0x46,0x80,0x5c,0x9a,0x48,0x0c,0x48,0x1e,0x48,0x24,0x47,0xd6,0x48,0x48,\r\n0x5c,0xa0,0x48,0x2a,0x48,0x4e,0x4d,0x76,0x48,0x54,0x48,0x5a,0x5c,0xa6,0x48,0x66,0x48,0x6c,0x5c,0xa0,0x48,0x66,0x48,0x7e,0x48,0x84,0x48,0x90,0x48,0x96,0x4d,0x76,0x48,0x9c,0x48,0xa2,0x58,0xfe,0x59,0x04,0x59,0x0a,0x59,0x10,0x48,0xc6,0x48,0xcc,0x5c,0xac,0x48,0xea,0x48,0xf0,0x5c,0xb2,0x49,0x08,0x47,0xee,0x5c,0xb8,0x47,0xc4,\r\n0x47,0xca,0x4b,0xc0,0x48,0x66,0x48,0x8a,0x5c,0xa0,0x47,0xd6,0x5a,0x90,0x5c,0xa0,0x48,0x0c,0x47,0xca,0x4b,0xde,0x57,0x18,0x57,0x1e,0x5c,0xbe,0x57,0x2a,0x57,0x1e,0x5c,0xc4,0x48,0x0c,0x47,0xca,0x47,0xf4,0x48,0x2a,0x48,0x30,0x4d,0x76,0x5c,0xca,0x47,0xee,0x5c,0xd0,0x59,0x04,0x59,0x0a,0x59,0x10,0x47,0xe8,0x48,0xc0,0x4d,0xfa,\r\n0x5c,0xd6,0x5c,0xdc,0x5c,0xe2,0x5c,0xe8,0x5c,0xee,0x5c,0xf4,0x5c,0xfa,0x5d,0x00,0x57,0xe4,0x46,0x6e,0x46,0x74,0x46,0x7a,0x46,0x92,0x47,0x46,0x47,0x88,0x46,0xfe,0x46,0x62,0x47,0x0a,0x46,0xa4,0x46,0xaa,0x5d,0x06,0x5d,0x0c,0x5d,0x12,0x4b,0xde,0x46,0xec,0x46,0xf2,0x46,0xf8,0x48,0x3c,0x48,0x30,0x48,0x42,0x5d,0x18,0x5d,0x1e,\r\n0x5d,0x24,0x5d,0x2a,0x5d,0x30,0x5d,0x36,0x47,0x52,0x47,0x64,0x46,0x68,0x48,0x90,0x48,0x96,0x48,0x36,0x47,0xb8,0x47,0x04,0x47,0xbe,0x48,0xfc,0x48,0x7e,0x49,0x02,0x5d,0x3c,0x5d,0x42,0x5d,0x48,0x47,0x10,0x47,0x16,0x47,0x1c,0x5d,0x4e,0x48,0x4e,0x5d,0x54,0x47,0x10,0x47,0x16,0x47,0x1c,0x47,0x52,0x46,0x74,0x47,0x58,0x47,0x52,\r\n0x47,0x64,0x5d,0x5a,0x5d,0x60,0x5d,0x66,0x4b,0xc0,0x5d,0x6c,0x5d,0x72,0x5d,0x78,0x48,0x66,0x5d,0x7e,0x47,0x1c,0x5d,0x84,0x5d,0x8a,0x5d,0x90,0x4a,0xd6,0x4a,0xdc,0x4d,0x76,0x00,0x02,0x00,0x0d,0x02,0x44,0x02,0x47,0x00,0x00,0x04,0x62,0x04,0x79,0x00,0x04,0x04,0x7b,0x04,0x7f,0x00,0x1c,0x04,0x82,0x04,0x84,0x00,0x21,0x04,0x87,\r\n0x04,0x91,0x00,0x24,0x04,0x97,0x04,0x9d,0x00,0x2f,0x04,0xa0,0x04,0xac,0x00,0x36,0x05,0xfd,0x06,0x00,0x00,0x43,0x06,0x66,0x06,0x72,0x00,0x47,0x07,0x55,0x07,0x5c,0x00,0x54,0x07,0xed,0x07,0xef,0x00,0x5c,0x08,0x4c,0x08,0x4f,0x00,0x5f,0x0a,0xdb,0x0a,0xe3,0x00,0x63,0x00,0x02,0x00,0x36,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,\r\n0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,\r\n0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0x5a,0x00,0xff,0x02,0x6f,0x02,0x74,0x01,0x03,0x02,0x7f,0x02,0x86,0x01,0x09,0x02,0x9b,0x02,0x9e,0x01,0x11,0x02,0xa9,0x02,0xb0,\r\n0x01,0x15,0x02,0xcd,0x02,0xce,0x01,0x1d,0x02,0xe1,0x02,0xea,0x01,0x1f,0x02,0xed,0x02,0xf6,0x01,0x29,0x02,0xfb,0x02,0xfe,0x01,0x33,0x03,0x01,0x03,0x10,0x01,0x37,0x03,0x13,0x03,0x2e,0x01,0x47,0x03,0x37,0x03,0x3e,0x01,0x63,0x03,0x41,0x03,0x5a,0x01,0x6b,0x03,0x5f,0x03,0x78,0x01,0x85,0x04,0xb0,0x04,0xe2,0x01,0x9f,0x04,0xe6,\r\n0x04,0xe7,0x01,0xd2,0x04,0xe9,0x04,0xe9,0x01,0xd4,0x04,0xee,0x04,0xfe,0x01,0xd5,0x05,0x07,0x05,0x07,0x01,0xe6,0x05,0x0c,0x05,0x46,0x01,0xe7,0x05,0x4b,0x05,0x4c,0x02,0x22,0x05,0x4f,0x05,0x50,0x02,0x24,0x05,0x56,0x05,0xb2,0x02,0x26,0x06,0xac,0x06,0xad,0x02,0x83,0x07,0x3e,0x07,0x43,0x02,0x85,0x07,0xe1,0x07,0xe2,0x02,0x8b,\r\n0x07,0xe4,0x07,0xeb,0x02,0x8d,0x07,0xf7,0x08,0x05,0x02,0x95,0x08,0x07,0x08,0x26,0x02,0xa4,0x0a,0x43,0x0a,0x43,0x02,0xc4,0x0a,0xbf,0x0a,0xcc,0x02,0xc5,0x0a,0xe5,0x0a,0xe5,0x02,0xd3,0x0a,0xe7,0x0a,0xed,0x02,0xd4,0x0a,0xf4,0x0a,0xf4,0x02,0xdb,0x0a,0xf7,0x0a,0xf7,0x02,0xdc,0x11,0x8c,0x11,0x8c,0x02,0xdd,0x00,0x01,0x00,0x98,\r\n0x00,0xc0,0x00,0x02,0x00,0x0c,0x00,0x2e,0x00,0x08,0x00,0x00,0x4a,0xba,0x00,0x00,0x4a,0xc0,0x00,0x01,0x4a,0xc6,0x00,0x00,0x4a,0xcc,0x00,0x01,0x4a,0xc6,0x00,0x00,0x4a,0xc6,0x00,0x01,0x4a,0xc6,0x00,0x01,0x4a,0xc6,0x00,0x1a,0x4a,0xb0,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x4a,0xc2,0x4a,0xc2,0x4a,0xc8,0x4a,0xc8,0x4a,0xce,0x4a,0xce,\r\n0x4a,0xd4,0x4a,0xda,0x4a,0xe0,0x4a,0xe6,0x4a,0xec,0x4a,0xf2,0x4a,0xf8,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x4b,0x10,0x40,0xb4,0x40,0xb4,0x4b,0x16,0x4b,0x1c,0x4b,0x22,0x4b,0x22,0x4b,0x28,0x4b,0x2e,0x4b,0x34,0x4b,0x3a,0x4b,0x40,0x4b,0x40,0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,\r\n0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0x22,0x4b,0x22,0x00,0x02,0x00,0x06,0x02,0x46,0x02,0x47,0x00,0x00,0x04,0x63,0x04,0x64,0x00,0x02,0x04,0x66,0x04,0x66,0x00,0x04,0x04,0x6b,0x04,0x6b,0x00,0x05,0x04,0x6e,0x04,0x6e,0x00,0x06,0x04,0x70,0x04,0x70,0x00,0x07,0x00,0x02,0x00,0x12,\r\n0x01,0xdb,0x01,0xdb,0x00,0x00,0x01,0xe5,0x01,0xe5,0x00,0x01,0x01,0xe7,0x01,0xe7,0x00,0x02,0x01,0xec,0x01,0xec,0x00,0x03,0x01,0xef,0x01,0xf0,0x00,0x04,0x01,0xf5,0x01,0xf5,0x00,0x06,0x01,0xfa,0x01,0xfa,0x00,0x07,0x02,0x02,0x02,0x02,0x00,0x08,0x02,0x04,0x02,0x07,0x00,0x09,0x02,0x0c,0x02,0x0c,0x00,0x0d,0x02,0x0f,0x02,0x10,\r\n0x00,0x0e,0x02,0x15,0x02,0x15,0x00,0x10,0x02,0x1a,0x02,0x1a,0x00,0x11,0x02,0x22,0x02,0x22,0x00,0x12,0x02,0x24,0x02,0x27,0x00,0x13,0x02,0x31,0x02,0x31,0x00,0x17,0x02,0xcd,0x02,0xcd,0x00,0x18,0x05,0x07,0x05,0x07,0x00,0x19,0x00,0x01,0x00,0xd8,0x00,0xde,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x92,0x00,0x62,\r\n0x4a,0x92,0x4a,0x98,0x4a,0x9e,0x4a,0xa4,0x4a,0xaa,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x4a,0xc2,0x4a,0xc8,0x4a,0xce,0x4a,0xd4,0x4a,0xda,0x4a,0xe0,0x4a,0xe6,0x4a,0xec,0x4a,0xe6,0x4a,0xf2,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x4b,0x10,0x42,0x52,0x4b,0x16,0x4b,0x1c,0x4b,0x22,0x4b,0x28,0x4b,0x2e,0x4b,0x34,0x4b,0x3a,0x4b,0x40,\r\n0x4b,0x46,0x4b,0x4c,0x4b,0x52,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,0x4b,0xac,0x4b,0xb2,0x4b,0xb8,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x22,0x4b,0x3a,0x4b,0x3a,0x4b,0x3a,0x4b,0x3a,0x4b,0x52,0x4b,0x52,\r\n0x4b,0x52,0x4b,0x52,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x76,0x4b,0x9a,0x4b,0x9a,0x4b,0x9a,0x4b,0x9a,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xb2,0x4b,0xd0,0x4b,0xb2,0x4b,0xd6,0x4b,0xdc,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4b,0xf4,0x4b,0xfa,0x4c,0x00,0x4c,0x06,0x4c,0x0c,0x4c,0x12,0x4c,0x18,0x4b,0x76,0x4c,0x1e,0x4c,0x24,\r\n0x4c,0x2a,0x4c,0x30,0x00,0x01,0x00,0x01,0x06,0x9b,0x00,0x02,0x00,0x16,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x69,0x00,0x6e,0x00,0x34,0x00,0x70,0x00,0x77,0x00,0x3a,0x00,0x79,0x00,0x81,0x00,0x42,0x00,0xa0,0x00,0xa1,0x00,0x4b,0x00,0xb1,0x00,0xb1,0x00,0x4d,0x00,0xba,0x00,0xba,0x00,0x4e,0x00,0xd6,\r\n0x00,0xd6,0x00,0x4f,0x00,0xeb,0x00,0xeb,0x00,0x50,0x05,0x07,0x05,0x07,0x00,0x51,0x05,0x56,0x05,0x58,0x00,0x52,0x05,0x5a,0x05,0x5a,0x00,0x55,0x05,0x5e,0x05,0x5e,0x00,0x56,0x05,0x60,0x05,0x61,0x00,0x57,0x05,0x63,0x05,0x63,0x00,0x59,0x05,0x69,0x05,0x69,0x00,0x5a,0x05,0x6d,0x05,0x6d,0x00,0x5b,0x05,0x6f,0x05,0x6f,0x00,0x5c,\r\n0x05,0x7a,0x05,0x7b,0x00,0x5d,0x05,0x8e,0x05,0x8f,0x00,0x5f,0x05,0x91,0x05,0x91,0x00,0x61,0x00,0x01,0x00,0x9c,0x00,0xa6,0x00,0x01,0x00,0x0c,0x00,0x22,0x00,0x05,0x00,0x00,0x4a,0xd6,0x00,0x00,0x4a,0xd6,0x00,0x00,0x26,0xc4,0x00,0x00,0x4a,0xdc,0x00,0x00,0x4a,0xe2,0x00,0x3c,0x4a,0xd2,0x4a,0xd8,0x4a,0xde,0x4a,0xe4,0x4a,0xea,\r\n0x4a,0xf0,0x4a,0xf6,0x4a,0xfc,0x4b,0x02,0x4b,0x08,0x4b,0x0e,0x4b,0x14,0x4b,0x1a,0x4b,0x20,0x4b,0x26,0x4b,0x2c,0x4b,0x32,0x4b,0x2c,0x4b,0x38,0x4b,0x3e,0x4b,0x44,0x4b,0x4a,0x4b,0x50,0x4b,0x56,0x4b,0x5c,0x4b,0x62,0x4b,0x68,0x4b,0x6e,0x4b,0x74,0x4b,0x7a,0x4b,0x80,0x4b,0x86,0x4b,0x8c,0x4b,0x92,0x4b,0x98,0x4b,0x9e,0x4b,0xa4,\r\n0x4b,0xaa,0x4b,0xb0,0x4b,0xb6,0x4b,0xbc,0x4b,0xc2,0x4b,0xc8,0x4b,0xce,0x4b,0xd4,0x4b,0xda,0x4b,0xe0,0x4b,0xe6,0x4b,0xec,0x4b,0xf2,0x4b,0xf8,0x4b,0xfe,0x4c,0x04,0x4c,0x0a,0x4c,0x10,0x4c,0x16,0x4c,0x1c,0x4c,0x22,0x4c,0x28,0x4c,0x2e,0x00,0x02,0x00,0x01,0x04,0x92,0x04,0x96,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x24,0x00,0x3d,\r\n0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x79,0x00,0x79,0x00,0x34,0x00,0xd0,0x00,0xd0,0x00,0x35,0x00,0xe4,0x00,0xe4,0x00,0x36,0x00,0xe6,0x00,0xe6,0x00,0x37,0x00,0xe9,0x00,0xe9,0x00,0x38,0x05,0x83,0x05,0x83,0x00,0x39,0x05,0x88,0x05,0x88,0x00,0x3a,0x05,0x97,0x05,0x97,0x00,0x3b,0x00,0x01,0x0c,0xf8,0x0d,0x0e,0x00,0x02,\r\n0x00,0x0c,0x00,0x2a,0x00,0x07,0x00,0x00,0x4b,0x64,0x00,0x00,0x4b,0x6a,0x00,0x01,0x2f,0x68,0x00,0x00,0x4b,0x6a,0x00,0x00,0x4b,0x6a,0x00,0x01,0x4b,0x70,0x00,0x01,0x2f,0x8c,0x03,0x33,0x4b,0x58,0x4b,0x5e,0x4b,0x64,0x4b,0x6a,0x4b,0x70,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4b,0x94,0x4b,0x9a,0x4b,0xa0,0x4b,0xa6,\r\n0x4b,0xac,0x4b,0xb2,0x4b,0xb8,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xd0,0x4b,0xd6,0x4b,0xdc,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4b,0xf4,0x4b,0xfa,0x4c,0x00,0x4c,0x06,0x4c,0x0c,0x4c,0x12,0x4c,0x18,0x4c,0x1e,0x4c,0x24,0x4c,0x2a,0x4c,0x30,0x4c,0x36,0x4c,0x3c,0x4c,0x42,0x4c,0x48,0x4c,0x4e,0x4c,0x54,0x4c,0x5a,0x4c,0x60,0x4c,0x66,\r\n0x4c,0x6c,0x4c,0x72,0x4c,0x78,0x4c,0x7e,0x4c,0x84,0x4c,0x8a,0x4c,0x90,0x4c,0x96,0x4c,0x9c,0x4c,0xa2,0x4c,0xa8,0x4c,0xae,0x4c,0xb4,0x4c,0xba,0x4c,0xc0,0x4c,0xc6,0x4c,0xcc,0x4c,0xd2,0x4c,0xb4,0x4c,0xba,0x4c,0xd8,0x4c,0xde,0x4c,0xe4,0x4c,0xea,0x4c,0xe4,0x4c,0xea,0x4c,0xd8,0x4c,0xde,0x4c,0xf0,0x4c,0xf6,0x4c,0xfc,0x4d,0x02,\r\n0x4c,0xd8,0x4c,0xde,0x4d,0x08,0x4d,0x0e,0x4c,0x9c,0x4c,0xa2,0x4c,0xb4,0x4c,0xba,0x4d,0x14,0x4d,0x1a,0x4d,0x20,0x4d,0x26,0x4d,0x2c,0x4d,0x32,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x4d,0x4a,0x4d,0x50,0x4d,0x56,0x4d,0x5c,0x4d,0x62,0x4d,0x68,0x4d,0x6e,0x4d,0x74,0x4d,0x7a,0x4d,0x80,0x4b,0x5e,0x4d,0x80,0x4b,0x5e,0x4b,0x70,0x4b,0x76,\r\n0x4b,0x88,0x4b,0x8e,0x4d,0x86,0x4b,0xfa,0x4d,0x8c,0x4c,0x06,0x4d,0x92,0x4c,0x4e,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x4c,0xa8,0x4c,0xae,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4c,0xc0,0x4c,0xc6,0x4d,0x98,0x4d,0x9e,\r\n0x4d,0xa4,0x4d,0xaa,0x4d,0xb0,0x4d,0xb6,0x4d,0xbc,0x4d,0xc2,0x4c,0xd8,0x4c,0xde,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x08,0x4d,0x0e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0x38,0x4d,0x3e,0x4d,0xc8,0x4d,0xce,0x4d,0xd4,0x4d,0xda,0x4c,0x00,0x4c,0x06,\r\n0x4d,0xe0,0x4d,0xe6,0x4d,0xec,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4d,0x80,0x4b,0x5e,0x4d,0x80,0x4b,0x5e,0x4d,0x8c,0x4c,0x06,0x4e,0x04,0x4e,0x0a,0x4e,0x10,0x4e,0x16,0x4d,0x68,0x4d,0x6e,0x4c,0x78,0x4c,0x7e,0x4d,0x80,0x4b,0x5e,0x4e,0x1c,0x4b,0x8e,0x4d,0x80,0x4b,0x5e,0x4e,0x1c,0x4b,0x8e,0x4e,0x1c,0x4b,0x8e,0x4e,0x22,0x4e,0x28,\r\n0x4e,0x2e,0x4e,0x34,0x4e,0x3a,0x4e,0x40,0x4e,0x46,0x4b,0xbe,0x4d,0x8c,0x4c,0x06,0x4d,0x8c,0x4c,0x06,0x4d,0x8c,0x4c,0x06,0x4d,0x92,0x4c,0x4e,0x4d,0x92,0x4c,0x4e,0x4d,0x92,0x4c,0x4e,0x4c,0xf0,0x4c,0xf6,0x4b,0xdc,0x4b,0xe2,0x4e,0x4c,0x4e,0x52,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,\r\n0x4b,0x7c,0x4b,0x82,0x4e,0x64,0x4e,0x6a,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4c,0x0c,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4b,0xb8,0x4b,0xbe,0x4c,0x30,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4b,0x70,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4e,0x82,0x4e,0x88,\r\n0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4e,0x8e,0x4b,0x82,0x4e,0x94,0x4e,0x9a,0x4b,0x7c,0x4b,0x82,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0xa0,0x4b,0xe2,0x4e,0xa6,0x4e,0xac,0x4b,0xdc,0x4b,0xe2,0x4e,0xb2,0x4e,0xb8,0x4b,0xdc,0x4b,0xe2,\r\n0x4e,0xbe,0x4e,0xc4,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,0x4e,0xd0,0x4e,0xd6,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x3c,0x4c,0x42,0x4e,0xdc,0x4e,0xe2,0x4e,0xe8,0x4c,0x42,\r\n0x4e,0xee,0x4e,0xf4,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4e,0xfa,0x4f,0x00,0x4f,0x06,0x4f,0x0c,0x4f,0x12,0x4f,0x18,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,\r\n0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4b,0xa0,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,\r\n0x4f,0x2a,0x4f,0x30,0x4c,0xd8,0x4c,0xde,0x4f,0x36,0x4f,0x3c,0x4f,0x42,0x4f,0x48,0x4f,0x4e,0x4f,0x54,0x4f,0x5a,0x4f,0x60,0x4f,0x66,0x4f,0x6c,0x4f,0x72,0x4f,0x78,0x4b,0xb8,0x4b,0xbe,0x4c,0xe4,0x4c,0xea,0x4f,0x7e,0x4f,0x84,0x4f,0x4e,0x4f,0x54,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4c,0xd8,0x4c,0xde,0x4b,0xdc,0x4b,0xe2,\r\n0x4d,0x98,0x4d,0x9e,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4c,0x24,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4d,0x92,0x4c,0x4e,\r\n0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x60,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4f,0x8a,0x4f,0x90,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,\r\n0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4f,0x9c,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4f,0xb4,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xcc,0x4f,0xd2,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,\r\n0x4d,0x80,0x4b,0x5e,0x4f,0xd8,0x4f,0xde,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4f,0xe4,0x4c,0x96,0x4d,0x80,0x4b,0x5e,0x4c,0x90,0x4c,0x96,\r\n0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4f,0xea,0x4f,0xf0,0x4f,0xf6,0x4f,0xfc,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x50,0x02,0x50,0x08,0x50,0x0e,0x50,0x14,0x4e,0x1c,0x4b,0x8e,0x50,0x1a,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,\r\n0x4e,0x46,0x4b,0xbe,0x50,0x20,0x50,0x26,0x4b,0xb8,0x4b,0xbe,0x4c,0xe4,0x4c,0xea,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4e,0x82,0x4e,0x88,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x50,0x2c,0x4d,0x0e,\r\n0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x50,0x32,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4f,0x9c,0x4f,0xa2,0x4f,0xa8,0x4f,0xae,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,\r\n0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x50,0x38,0x4f,0xba,0x4f,0xc0,0x4f,0xc6,0x4c,0x78,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,\r\n0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x50,0x3e,0x50,0x44,0x50,0x4a,0x50,0x50,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4b,0x58,0x4b,0x5e,0x4c,0x90,0x4c,0x96,0x50,0x56,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4b,0x64,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4b,0x64,0x4b,0x6a,0x4c,0x9c,0x4c,0xa2,0x4e,0x7c,0x4b,0x76,0x4c,0xa8,0x4c,0xae,\r\n0x4e,0x8e,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4b,0x7c,0x4b,0x82,0x4c,0xb4,0x4c,0xba,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,\r\n0x4b,0x88,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x50,0x5c,0x4b,0x9a,0x50,0x62,0x4c,0xd2,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x4f,0x1e,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,\r\n0x4b,0xac,0x4b,0xb2,0x4c,0xd8,0x4c,0xde,0x50,0x68,0x50,0x6e,0x50,0x74,0x50,0x7a,0x50,0x80,0x50,0x86,0x50,0x8c,0x50,0x92,0x50,0x98,0x4b,0xd6,0x4f,0x24,0x4c,0xde,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x4b,0xdc,0x4b,0xe2,0x50,0x9e,0x50,0xa4,0x4e,0xa0,0x4b,0xe2,0x50,0xaa,0x50,0xb0,\r\n0x4b,0xdc,0x4b,0xe2,0x50,0xb6,0x50,0xbc,0x4b,0xdc,0x4b,0xe2,0x4e,0xa6,0x4e,0xac,0x50,0xc2,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x50,0xc2,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x4b,0xe8,0x4b,0xee,0x4c,0xfc,0x4d,0x02,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,\r\n0x4b,0xf4,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x50,0x2c,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x50,0xc8,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x50,0xc8,0x4c,0x12,0x4c,0x9c,0x4c,0xa2,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,\r\n0x4c,0x24,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4c,0x24,0x4c,0x2a,0x50,0xce,0x50,0xd4,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4c,0x30,0x4c,0x36,0x4d,0x20,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x50,0xda,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x50,0xda,0x4d,0x26,0x4e,0x58,0x4c,0x36,0x4d,0x20,0x4d,0x26,\r\n0x4e,0xe8,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x50,0xe0,0x50,0xe6,0x4c,0x3c,0x4c,0x42,0x50,0xec,0x50,0xf2,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4c,0x48,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,\r\n0x4d,0x92,0x4c,0x4e,0x50,0xf8,0x4d,0x3e,0x50,0xfe,0x4c,0x5a,0x4d,0x44,0x4d,0x4a,0x4c,0x54,0x4c,0x5a,0x4d,0x44,0x4d,0x4a,0x4f,0x96,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x4c,0x60,0x4c,0x66,0x4d,0x50,0x4d,0x56,0x51,0x04,0x4c,0x72,0x4d,0x5c,0x4d,0x62,0x51,0x04,0x4c,0x72,0x4d,0x5c,0x4d,0x62,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,\r\n0x4e,0x5e,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x4c,0xd8,0x4c,0xde,0x4d,0x2c,0x4d,0x32,0x4d,0x50,0x4d,0x56,0x4d,0x68,0x4d,0x6e,0x4c,0x90,0x4c,0x96,0x51,0x0a,0x4f,0x90,0x4c,0x9c,0x4c,0xa2,0x51,0x10,0x51,0x16,0x51,0x1c,0x51,0x22,0x4c,0x9c,0x4c,0xa2,\r\n0x51,0x1c,0x51,0x22,0x4c,0x9c,0x4c,0xa2,0x4e,0x82,0x4e,0x88,0x51,0x28,0x51,0x2e,0x51,0x34,0x51,0x3a,0x4b,0x7c,0x4b,0x82,0x51,0x40,0x51,0x46,0x51,0x4c,0x51,0x52,0x51,0x34,0x51,0x3a,0x51,0x58,0x51,0x5e,0x51,0x64,0x51,0x6a,0x51,0x70,0x51,0x76,0x4b,0x94,0x4b,0x9a,0x51,0x7c,0x51,0x82,0x4c,0x54,0x4c,0x5a,0x51,0x88,0x51,0x8e,\r\n0x51,0x94,0x51,0x9a,0x4d,0xbc,0x4d,0xc2,0x4b,0xd0,0x4b,0xd6,0x4c,0xd8,0x4c,0xde,0x51,0xa0,0x51,0xa6,0x51,0xac,0x51,0xb2,0x51,0xb8,0x51,0xbe,0x51,0x28,0x51,0x2e,0x4c,0xd8,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x51,0xc4,0x51,0xca,0x51,0xd0,0x51,0xd6,0x51,0xdc,0x51,0xe2,0x4c,0x9c,0x4c,0xa2,0x51,0xe8,0x51,0xee,0x51,0xf4,0x51,0xfa,\r\n0x52,0x00,0x52,0x06,0x52,0x0c,0x52,0x12,0x4e,0xbe,0x4e,0xc4,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x4d,0x2c,0x4d,0x32,0x4c,0x3c,0x4c,0x42,0x52,0x18,0x52,0x1e,0x52,0x24,0x52,0x2a,0x52,0x30,0x52,0x36,0x4c,0x78,0x4c,0x7e,0x4c,0x84,0x4c,0x8a,0x4d,0x74,0x4d,0x7a,0x52,0x3c,0x52,0x42,0x52,0x48,0x52,0x4e,0x52,0x54,0x52,0x5a,\r\n0x52,0x60,0x52,0x66,0x52,0x6c,0x52,0x72,0x52,0x78,0x52,0x7e,0x52,0x84,0x52,0x8a,0x52,0x90,0x52,0x96,0x52,0x9c,0x52,0xa2,0x52,0xa8,0x52,0xae,0x52,0xb4,0x52,0xba,0x52,0xc0,0x52,0xc6,0x52,0xcc,0x52,0xd2,0x52,0xd8,0x52,0xde,0x52,0xe4,0x52,0xea,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,0x52,0xfc,0x53,0x02,0x53,0x08,0x53,0x0e,\r\n0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x50,0x4a,0x50,0x50,0x53,0x14,0x4d,0xda,0x53,0x1a,0x53,0x20,0x53,0x26,0x53,0x2c,0x53,0x32,0x53,0x38,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x50,0x98,0x4b,0xd6,0x4f,0x24,0x4c,0xde,0x4c,0x00,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,\r\n0x4d,0x08,0x4d,0x0e,0x53,0x3e,0x52,0x42,0x53,0x44,0x53,0x4a,0x4d,0xbc,0x4d,0xc2,0x53,0x50,0x52,0x8a,0x53,0x56,0x53,0x5c,0x53,0x62,0x53,0x68,0x4e,0x76,0x4b,0xa6,0x4c,0xb4,0x4c,0xba,0x53,0x6e,0x53,0x74,0x53,0x7a,0x53,0x80,0x4d,0x86,0x4b,0xfa,0x4c,0xd8,0x4c,0xde,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,0x4d,0x80,0x4b,0x5e,\r\n0x52,0xf0,0x52,0xf6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x1c,0x4b,0x8e,0x4c,0xc0,0x4c,0xc6,0x4e,0x46,0x4b,0xbe,0x53,0x86,0x53,0x8c,0x53,0x92,0x53,0x98,0x53,0x9e,0x53,0xa4,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0xca,0x4c,0x2a,0x4d,0x14,0x4d,0x1a,0x4e,0xca,0x4c,0x2a,\r\n0x53,0xaa,0x53,0xb0,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x92,0x4c,0x4e,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x4d,0x4a,0x53,0xb6,0x53,0xbc,0x4f,0x1e,0x4b,0xb2,0x4f,0x24,0x4c,0xde,0x53,0x7a,0x53,0x80,0x51,0x10,0x51,0x16,0x53,0xc2,0x53,0xc8,0x51,0xdc,0x51,0xe2,0x53,0xce,0x53,0xd4,0x4d,0x80,0x4b,0x5e,0x52,0xf0,0x52,0xf6,\r\n0x4d,0x8c,0x4c,0x06,0x4d,0x08,0x4d,0x0e,0x4e,0x70,0x4c,0x7e,0x4d,0x68,0x4d,0x6e,0x4d,0xf8,0x4d,0xfe,0x4c,0xb4,0x4c,0xba,0x4c,0x9c,0x4c,0xa2,0x53,0xda,0x53,0xe0,0x53,0xe6,0x53,0xec,0x53,0xf2,0x53,0xf8,0x53,0xfe,0x54,0x04,0x53,0xfe,0x54,0x04,0x50,0x4a,0x50,0x50,0x54,0x0a,0x54,0x10,0x54,0x16,0x54,0x1c,0x54,0x22,0x54,0x28,\r\n0x54,0x2e,0x54,0x34,0x4c,0x3c,0x4c,0x42,0x54,0x3a,0x54,0x40,0x53,0xfe,0x54,0x04,0x4c,0xb4,0x4c,0xba,0x54,0x46,0x54,0x4c,0x54,0x52,0x54,0x58,0x53,0xce,0x53,0xd4,0x4d,0x38,0x4d,0x3e,0x4c,0xd8,0x4c,0xde,0x4c,0xd8,0x4c,0xde,0x54,0x5e,0x54,0x64,0x54,0x6a,0x54,0x70,0x54,0x76,0x54,0x7c,0x54,0x82,0x54,0x88,0x54,0x22,0x54,0x28,\r\n0x54,0x8e,0x54,0x94,0x54,0x9a,0x54,0xa0,0x4c,0xfc,0x4d,0x02,0x4c,0xfc,0x4d,0x02,0x4c,0xfc,0x4d,0x02,0x4c,0xd8,0x4c,0xde,0x54,0xa6,0x54,0xac,0x54,0xb2,0x54,0xb8,0x4d,0x08,0x4d,0x0e,0x54,0xbe,0x54,0xc4,0x54,0xca,0x54,0xd0,0x54,0xd6,0x54,0xdc,0x54,0xe2,0x4f,0x6c,0x54,0xe2,0x4f,0x6c,0x54,0xe8,0x54,0xee,0x4d,0x14,0x4d,0x1a,\r\n0x4d,0x14,0x4d,0x1a,0x54,0xf4,0x54,0xfa,0x55,0x00,0x55,0x06,0x4c,0x90,0x4c,0x96,0x4c,0x90,0x4c,0x96,0x55,0x0c,0x55,0x12,0x55,0x18,0x55,0x1e,0x55,0x24,0x55,0x2a,0x55,0x30,0x55,0x36,0x55,0x3c,0x55,0x42,0x55,0x3c,0x55,0x42,0x4d,0x2c,0x4d,0x32,0x55,0x48,0x55,0x4e,0x51,0xe8,0x51,0xee,0x52,0x78,0x52,0x7e,0x52,0x54,0x52,0x5a,\r\n0x4d,0x50,0x4d,0x56,0x55,0x54,0x55,0x5a,0x55,0x60,0x55,0x66,0x55,0x6c,0x55,0x72,0x55,0x78,0x55,0x7e,0x53,0x44,0x53,0x4a,0x55,0x84,0x55,0x8a,0x55,0x90,0x55,0x96,0x55,0x9c,0x55,0xa2,0x55,0xa8,0x55,0xae,0x55,0xb4,0x55,0xba,0x55,0xc0,0x55,0xc6,0x55,0xcc,0x55,0xd2,0x55,0xd8,0x55,0xde,0x4c,0x9c,0x4c,0xa2,0x4d,0x38,0x4d,0x3e,\r\n0x55,0xe4,0x4e,0x40,0x55,0xea,0x55,0xf0,0x55,0xf6,0x55,0xfc,0x53,0xfe,0x54,0x04,0x55,0x90,0x55,0x96,0x55,0x9c,0x55,0xa2,0x56,0x02,0x56,0x08,0x56,0x0e,0x56,0x14,0x56,0x1a,0x56,0x20,0x56,0x26,0x56,0x2c,0x56,0x32,0x56,0x38,0x4c,0x00,0x4c,0x06,0x56,0x3e,0x56,0x44,0x4d,0x08,0x4d,0x0e,0x4c,0x78,0x4c,0x7e,0x56,0x4a,0x56,0x50,\r\n0x55,0xcc,0x55,0xd2,0x4c,0xf0,0x4c,0xf6,0x54,0x5e,0x54,0x64,0x56,0x56,0x56,0x5c,0x55,0xea,0x55,0xf0,0x56,0x62,0x56,0x68,0x55,0x84,0x55,0x8a,0x52,0x78,0x52,0x7e,0x53,0x7a,0x53,0x80,0x56,0x6e,0x56,0x74,0x56,0x6e,0x56,0x74,0x4b,0x58,0x4b,0x5e,0x56,0x7a,0x56,0x80,0x56,0x86,0x56,0x8c,0x4b,0xdc,0x4b,0xe2,0x56,0x92,0x56,0x98,\r\n0x4d,0x20,0x4d,0x26,0x4d,0x74,0x4d,0x7a,0x56,0x9e,0x56,0xa4,0x4c,0x9c,0x4c,0xa2,0x56,0xaa,0x56,0xb0,0x4c,0xcc,0x4c,0xd2,0x52,0xd8,0x52,0xde,0x56,0xb6,0x56,0xbc,0x4c,0x9c,0x4c,0xa2,0x4d,0x14,0x4d,0x1a,0x54,0xf4,0x54,0xfa,0x56,0xc2,0x56,0xc8,0x4d,0x2c,0x4d,0x32,0x4d,0x74,0x4d,0x7a,0x53,0xda,0x53,0xe0,0x56,0xce,0x56,0xd4,\r\n0x56,0xda,0x56,0xe0,0x56,0xe6,0x56,0xec,0x56,0xf2,0x56,0xf8,0x56,0xfe,0x57,0x04,0x4c,0x48,0x4c,0x4e,0x57,0x0a,0x57,0x10,0x57,0x16,0x57,0x1c,0x4c,0x9c,0x4c,0xa2,0x4f,0xa8,0x4f,0xae,0x4c,0xcc,0x4c,0xd2,0x57,0x22,0x57,0x28,0x57,0x2e,0x57,0x34,0x57,0x3a,0x57,0x40,0x57,0x46,0x57,0x4c,0x57,0x52,0x57,0x58,0x4c,0x9c,0x4c,0xa2,\r\n0x4d,0x14,0x4d,0x1a,0x57,0x5e,0x57,0x64,0x57,0x6a,0x57,0x70,0x57,0x76,0x57,0x7c,0x4d,0x5c,0x4d,0x62,0x4d,0x74,0x4d,0x7a,0x57,0x82,0x57,0x88,0x57,0x8e,0x57,0x94,0x53,0xfe,0x54,0x04,0x57,0x9a,0x57,0xa0,0x4c,0x0c,0x4c,0x12,0x57,0xa6,0x57,0xac,0x57,0xb2,0x57,0xb8,0x57,0xbe,0x57,0xc4,0x53,0xe6,0x53,0xec,0x55,0x18,0x55,0x1e,\r\n0x57,0xca,0x57,0xd0,0x53,0x44,0x53,0x4a,0x57,0xd6,0x57,0xdc,0x54,0x16,0x54,0x1c,0x4d,0xec,0x4d,0xf2,0x57,0xe2,0x57,0xe8,0x57,0xee,0x57,0xf4,0x4c,0x3c,0x4c,0x42,0x4b,0x64,0x4b,0x6a,0x55,0x0c,0x55,0x12,0x4b,0xb8,0x4b,0xbe,0x57,0xfa,0x58,0x00,0x53,0x32,0x53,0x38,0x56,0x92,0x56,0x98,0x58,0x06,0x58,0x0c,0x58,0x12,0x58,0x18,\r\n0x51,0xac,0x51,0xb2,0x58,0x1e,0x58,0x24,0x58,0x2a,0x58,0x30,0x58,0x36,0x58,0x3c,0x58,0x42,0x58,0x48,0x51,0xdc,0x51,0xe2,0x56,0x92,0x56,0x98,0x58,0x4e,0x58,0x54,0x58,0x5a,0x58,0x60,0x58,0x66,0x58,0x6c,0x58,0x72,0x58,0x78,0x4c,0xf0,0x4c,0xea,0x00,0x02,0x00,0x03,0x04,0xad,0x04,0xaf,0x00,0x00,0x07,0x5d,0x07,0x5f,0x00,0x03,\r\n0x07,0xf0,0x07,0xf0,0x00,0x06,0x00,0x02,0x00,0x2a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,\r\n0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,\r\n0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,0x02,0x3c,0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,\r\n0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,0x0a,0xcc,0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,\r\n0x11,0x8c,0x11,0x8c,0x03,0x32,0x00,0x01,0x00,0xa4,0x00,0xaa,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x8e,0x00,0x48,0x4a,0x8e,0x4a,0x94,0x4a,0x9a,0x4a,0xa0,0x4a,0xa6,0x4a,0xa6,0x4a,0xac,0x4a,0xb2,0x4a,0xb8,0x4a,0xbe,0x4a,0xc4,0x4a,0xca,0x4a,0xd0,0x4a,0xd6,0x4a,0xdc,0x4a,0xe2,0x4a,0xdc,0x4a,0xe8,0x4a,0xee,\r\n0x4a,0xf4,0x4a,0xfa,0x4b,0x00,0x4b,0x06,0x3a,0xbc,0x3a,0xbc,0x3a,0xbc,0x4b,0x0c,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x4b,0x24,0x4b,0x2a,0x4b,0x30,0x4b,0x36,0x4b,0x3c,0x4b,0x42,0x4b,0x48,0x4b,0x4e,0x4b,0x54,0x4b,0x5a,0x4b,0x60,0x4b,0x66,0x4b,0x6c,0x4b,0x72,0x4b,0x78,0x4b,0x7e,0x4b,0x84,0x4b,0x8a,0x4b,0x90,0x4b,0x96,0x4b,0x9c,\r\n0x4b,0xa2,0x4b,0x60,0x4b,0x60,0x4b,0x60,0x4b,0x84,0x4b,0x84,0x4a,0xdc,0x4a,0xdc,0x4a,0xdc,0x4a,0xfa,0x4a,0xfa,0x4a,0xfa,0x4b,0x84,0x4a,0xdc,0x4b,0x60,0x4a,0xdc,0x4b,0x60,0x4a,0xfa,0x4b,0x84,0x4a,0xfa,0x4b,0x84,0x00,0x01,0x00,0x01,0x04,0x7a,0x00,0x02,0x00,0x0b,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,\r\n0x00,0x79,0x00,0x7a,0x00,0x34,0x00,0x7d,0x00,0x7f,0x00,0x36,0x00,0xaf,0x00,0xaf,0x00,0x39,0x00,0xd0,0x00,0xd0,0x00,0x3a,0x00,0xd2,0x00,0xd3,0x00,0x3b,0x00,0xd5,0x00,0xd5,0x00,0x3d,0x01,0x78,0x01,0x79,0x00,0x3e,0x02,0x83,0x02,0x86,0x00,0x40,0x02,0x9b,0x02,0x9e,0x00,0x44,0x00,0x01,0x00,0x58,0x00,0x5e,0x00,0x01,0x00,0x0c,\r\n0x00,0x12,0x00,0x01,0x00,0x00,0x1e,0xc0,0x00,0x22,0x4a,0xb8,0x4a,0xbe,0x17,0x16,0x2b,0x02,0x19,0xec,0x4a,0xc4,0x18,0x30,0x4a,0xca,0x4a,0xd0,0x4a,0xd6,0x4a,0xdc,0x17,0x70,0x4a,0xe2,0x23,0xb2,0x4a,0xe8,0x4a,0xee,0x4a,0xf4,0x4a,0xfa,0x4b,0x00,0x4b,0x06,0x4b,0x0c,0x21,0x54,0x4b,0x12,0x4b,0x18,0x4b,0x1e,0x32,0xe8,0x4b,0x06,\r\n0x4b,0x06,0x32,0xe8,0x32,0xe8,0x19,0xec,0x4a,0xe2,0x4a,0xe2,0x4b,0x06,0x00,0x01,0x00,0x01,0x04,0x85,0x00,0x02,0x00,0x17,0x00,0x24,0x00,0x24,0x00,0x00,0x00,0x26,0x00,0x26,0x00,0x01,0x00,0x28,0x00,0x28,0x00,0x02,0x00,0x2a,0x00,0x2a,0x00,0x03,0x00,0x2c,0x00,0x2c,0x00,0x04,0x00,0x2e,0x00,0x2f,0x00,0x05,0x00,0x31,0x00,0x32,\r\n0x00,0x07,0x00,0x35,0x00,0x38,0x00,0x09,0x00,0x44,0x00,0x44,0x00,0x0d,0x00,0x46,0x00,0x46,0x00,0x0e,0x00,0x48,0x00,0x48,0x00,0x0f,0x00,0x4a,0x00,0x4a,0x00,0x10,0x00,0x4c,0x00,0x4c,0x00,0x11,0x00,0x4e,0x00,0x4f,0x00,0x12,0x00,0x51,0x00,0x52,0x00,0x14,0x00,0x55,0x00,0x58,0x00,0x16,0x00,0x74,0x00,0x74,0x00,0x1a,0x00,0x76,\r\n0x00,0x76,0x00,0x1b,0x00,0x7e,0x00,0x7e,0x00,0x1c,0x00,0x80,0x00,0x80,0x00,0x1d,0x00,0xcd,0x00,0xcd,0x00,0x1e,0x00,0xd3,0x00,0xd4,0x00,0x1f,0x01,0x0f,0x01,0x0f,0x00,0x21,0x00,0x01,0x06,0x78,0x06,0x7e,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x4a,0x3e,0x03,0x32,0x4a,0x3e,0x4a,0x44,0x4a,0x4a,0x4a,0x44,0x1d,0x98,\r\n0x4a,0x50,0x4a,0x56,0x4a,0x5c,0x4a,0x50,0x4a,0x62,0x4a,0x68,0x4a,0x6e,0x4a,0x74,0x4a,0x7a,0x4a,0x80,0x4a,0x50,0x4a,0x86,0x4a,0x8c,0x4a,0x92,0x4a,0x98,0x1d,0x98,0x16,0x2a,0x4a,0x9e,0x4a,0x68,0x4a,0xa4,0x4a,0xaa,0x1b,0xfa,0x4a,0xb0,0x4a,0xb6,0x4a,0xbc,0x16,0x7e,0x19,0x24,0x4a,0xc2,0x4a,0xc8,0x4a,0x50,0x4a,0xce,0x4a,0xd4,\r\n0x19,0x12,0x4a,0xda,0x4a,0xc8,0x16,0x7e,0x4a,0xe0,0x4a,0xe6,0x19,0x12,0x4a,0x98,0x4a,0xec,0x4a,0xf2,0x4a,0xf8,0x4a,0xfe,0x4b,0x04,0x4b,0x0a,0x16,0x7e,0x4a,0x3e,0x4a,0x3e,0x4b,0x10,0x1d,0x98,0x4b,0x16,0x4a,0x80,0x1d,0x98,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x1b,0xfa,0x4b,0x1c,0x16,0x7e,0x16,0x7e,0x16,0x7e,\r\n0x16,0x7e,0x19,0x12,0x19,0x12,0x19,0x12,0x19,0x12,0x4a,0xc8,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x16,0x7e,0x4a,0xf2,0x4a,0xf2,0x4a,0xf2,0x4a,0xf2,0x17,0xe0,0x4a,0xda,0x4a,0x80,0x4b,0x22,0x16,0x7e,0x4b,0x28,0x4a,0x3e,0x4a,0x3e,0x4a,0x80,0x4b,0x2e,0x4b,0x34,0x4b,0x0a,0x4a,0xa4,0x4a,0x3e,0x1d,0x98,0x4a,0x3e,0x1d,0x98,\r\n0x1d,0x98,0x4a,0x50,0x19,0x24,0x4a,0x50,0x4b,0x3a,0x4a,0x80,0x4a,0x80,0x4a,0x80,0x1d,0x98,0x1d,0x98,0x1d,0x98,0x19,0x12,0x4a,0x6e,0x4a,0x62,0x4a,0x92,0x4a,0x98,0x4a,0xaa,0x16,0x7e,0x4b,0x40,0x4b,0x46,0x4a,0xa4,0x4b,0x0a,0x19,0x36,0x4b,0x4c,0x4a,0x56,0x4a,0xc2,0x4a,0x50,0x4b,0x52,0x4b,0x58,0x4a,0x4a,0x4a,0xb6,0x4a,0x4a,\r\n0x4a,0xb6,0x4a,0xbc,0x4a,0x3e,0x1b,0xfa,0x4b,0x5e,0x29,0x80,0x4a,0x44,0x4a,0xbc,0x4a,0x44,0x4b,0x64,0x4b,0x6a,0x1d,0x98,0x16,0x7e,0x4a,0x6e,0x19,0x12,0x4a,0x6e,0x19,0x12,0x4a,0x6e,0x19,0x12,0x4a,0x7a,0x4a,0xc8,0x4a,0x7a,0x4a,0xc8,0x4a,0x80,0x16,0x7e,0x4a,0x8c,0x19,0x12,0x4a,0x8c,0x19,0x12,0x4a,0x92,0x4a,0x98,0x47,0x32,\r\n0x4b,0x70,0x4a,0x98,0x4a,0xec,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4a,0xaa,0x16,0x7e,0x4a,0xaa,0x16,0x7e,0x4b,0x76,0x4b,0x7c,0x4b,0x82,0x4a,0x3e,0x1b,0xfa,0x4a,0x4a,0x4a,0xb6,0x4a,0x4a,0x4a,0xb6,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4a,0x56,0x4a,0xc2,0x4a,0x56,0x4a,0xc2,0x4b,0x88,0x4a,0xc2,\r\n0x4a,0x5c,0x4a,0xc8,0x4a,0x5c,0x4a,0xc8,0x4a,0x50,0x19,0x12,0x4a,0x50,0x19,0x12,0x4a,0x50,0x4b,0x8e,0x2c,0x50,0x4b,0x94,0x4a,0x62,0x4a,0xce,0x4a,0x68,0x1d,0xda,0x16,0x4e,0x4b,0x1c,0x4b,0x9a,0x4a,0x7a,0x4a,0xaa,0x4b,0xa0,0x4b,0xa6,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x8c,0x4b,0x8e,0x4a,0x92,0x4a,0x98,0x4a,0x98,\r\n0x4a,0xec,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4b,0x64,0x4b,0xac,0x4a,0x9e,0x4a,0xfe,0x4a,0xa4,0x4b,0x0a,0x19,0x12,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4a,0xfe,0x4a,0xa4,0x4b,0x0a,0x4a,0x80,0x16,0x7e,0x1d,0x98,0x4a,0xf2,0x4a,0x3e,0x4b,0xb2,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,\r\n0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x4b,0xb2,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x4b,0xb2,0x1c,0x8a,0x4b,0xb8,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,\r\n0x1c,0x8a,0x4b,0xb8,0x19,0x36,0x19,0x12,0x4b,0xbe,0x4b,0xc4,0x4b,0xca,0x4b,0xd0,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4b,0xd6,0x4b,0xdc,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4b,0xe2,0x4b,0xe8,0x4b,0xee,0x4a,0xbc,\r\n0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x4b,0xf4,0x4a,0xbc,0x4b,0xfa,0x4c,0x00,0x4a,0xa4,0x4b,0x0a,0x4a,0xa4,0x4b,0x0a,0x4c,0x06,0x4c,0x0c,0x4a,0xf2,0x16,0x2a,0x3e,0x62,0x4c,0x12,0x4a,0x3e,0x4a,0xd4,0x4a,0x44,0x4a,0xb0,0x4c,0x18,0x4c,0x1e,0x4c,0x24,0x4c,0x2a,\r\n0x42,0xa0,0x4c,0x30,0x4a,0x44,0x4a,0xbc,0x4c,0x36,0x4a,0xaa,0x4c,0x3c,0x4c,0x42,0x4c,0x48,0x4a,0xaa,0x4c,0x4e,0x23,0x32,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4c,0x54,0x4c,0x54,0x4c,0x5a,0x4c,0x60,0x4c,0x66,0x4c,0x12,0x19,0x36,0x19,0x24,0x4a,0x56,0x4a,0xc2,0x4a,0x5c,0x4a,0xc8,0x4a,0x5c,0x1e,0x4c,0x4a,0x5c,0x4a,0xc8,\r\n0x4a,0x5c,0x4a,0xc8,0x4c,0x6c,0x4c,0x72,0x4c,0x78,0x4c,0x7e,0x4a,0x50,0x19,0x12,0x4a,0x68,0x4a,0xd4,0x4a,0x68,0x4c,0x84,0x4c,0x8a,0x4c,0x90,0x4a,0xf2,0x4c,0x96,0x4a,0xf2,0x4c,0x9c,0x4c,0xa2,0x29,0xc8,0x4c,0xa8,0x4c,0xae,0x4a,0x74,0x4a,0xda,0x4a,0x74,0x4a,0xda,0x4a,0x74,0x4c,0xb4,0x4a,0x7a,0x4a,0xc8,0x4a,0x7a,0x4a,0xaa,\r\n0x4c,0xba,0x28,0xfc,0x22,0xd8,0x4c,0xc0,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x19,0x36,0x4c,0xc6,0x19,0x36,0x4c,0xc6,0x4a,0x8c,0x19,0x12,0x4a,0x8c,0x4b,0x8e,0x4a,0x8c,0x4b,0x8e,0x4c,0xcc,0x4c,0xd2,0x4a,0x92,0x4a,0x98,0x4c,0xd8,0x4c,0xde,0x4a,0x92,0x4a,0x98,0x4a,0x92,0x4a,0x98,\r\n0x4c,0xe4,0x4c,0xea,0x4a,0x98,0x4a,0xec,0x4c,0xf0,0x4c,0xf6,0x4c,0xfc,0x4d,0x02,0x4d,0x08,0x4d,0x0e,0x4d,0x14,0x4d,0x1a,0x4d,0x20,0x4d,0x26,0x4c,0x4e,0x4c,0xa8,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x16,0x2a,0x4a,0xf8,0x4c,0x60,0x33,0x8e,0x4a,0x9e,0x4a,0xfe,0x4a,0x9e,0x4d,0x2c,0x4a,0x68,0x4b,0x04,0x4a,0x68,0x4b,0x04,\r\n0x4a,0xa4,0x4b,0x0a,0x4a,0xaa,0x16,0x7e,0x4d,0x32,0x4d,0x38,0x4d,0x3e,0x4d,0x44,0x28,0xfc,0x4a,0xec,0x4a,0xfe,0x4b,0x0a,0x1b,0xfa,0x19,0x12,0x4a,0xb0,0x4d,0x4a,0x4d,0x50,0x4a,0xb0,0x1b,0xdc,0x4a,0xb0,0x4d,0x56,0x4a,0x4a,0x4d,0x5c,0x4a,0x44,0x1c,0x4e,0x4d,0x62,0x4d,0x68,0x4d,0x6e,0x4d,0x74,0x4d,0x7a,0x4d,0x80,0x4a,0x56,\r\n0x29,0x02,0x4d,0x86,0x4d,0x8c,0x19,0x36,0x4a,0x68,0x4a,0xd4,0x19,0x12,0x4a,0xf2,0x4a,0x74,0x4a,0x7a,0x4d,0x92,0x4a,0x80,0x4d,0x98,0x4d,0x9e,0x4d,0xa4,0x4d,0xaa,0x4d,0xb0,0x1d,0x26,0x4d,0xb6,0x4b,0xb2,0x4d,0xbc,0x4d,0xc2,0x4a,0x98,0x4a,0xec,0x4d,0xc8,0x4d,0xce,0x4d,0xd4,0x17,0xc2,0x4b,0x0a,0x4a,0xaa,0x16,0x7e,0x4d,0xda,\r\n0x4d,0xe0,0x17,0xe6,0x4d,0xe6,0x4d,0xec,0x4b,0x4c,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4e,0x04,0x47,0xaa,0x4b,0x7c,0x4e,0x0a,0x4e,0x10,0x4e,0x16,0x4a,0x3e,0x1b,0xfa,0x4a,0x50,0x19,0x12,0x4a,0x80,0x16,0x7e,0x1d,0x98,0x4a,0xf2,0x1c,0x0c,0x4e,0x1c,0x4e,0x22,0x4a,0x56,0x4a,0xc2,0x4a,0x56,0x4a,0xc2,0x4a,0x68,0x4a,0xd4,0x4e,0x28,\r\n0x4e,0x2e,0x4e,0x28,0x4e,0x2e,0x4d,0x6e,0x4e,0x34,0x4a,0xce,0x4d,0xf2,0x4d,0xf8,0x4d,0xfe,0x4a,0x56,0x4a,0xc2,0x4e,0x3a,0x4e,0x40,0x4b,0x16,0x4a,0xc8,0x4a,0x3e,0x1b,0xfa,0x4a,0x3e,0x1b,0xfa,0x1d,0x98,0x16,0x7e,0x1d,0x98,0x16,0x7e,0x4a,0x50,0x19,0x12,0x4a,0x50,0x19,0x12,0x4a,0x80,0x16,0x7e,0x4a,0x80,0x16,0x7e,0x4a,0x8c,\r\n0x19,0x12,0x4a,0x8c,0x19,0x12,0x1d,0x98,0x4a,0xf2,0x1d,0x98,0x4a,0xf2,0x29,0x20,0x36,0x4c,0x4a,0x5c,0x4a,0xc8,0x4e,0x46,0x4a,0xb0,0x16,0x7e,0x1a,0xe6,0x4a,0xa4,0x4a,0x3e,0x1b,0xfa,0x4a,0x80,0x16,0x7e,0x4a,0xa4,0x4b,0x0a,0x4e,0x4c,0x4e,0x52,0x1e,0x46,0x4b,0x04,0x4e,0x58,0x1b,0x82,0x4e,0x5e,0x4a,0xbc,0x16,0x2a,0x4e,0x64,\r\n0x15,0xfa,0x4d,0xec,0x4e,0x6a,0x4e,0x70,0x4e,0x76,0x4a,0xc2,0x4a,0xc2,0x1b,0x22,0x4e,0x7c,0x4e,0x82,0x4e,0x88,0x4a,0xc8,0x44,0x56,0x18,0xe2,0x4d,0x8c,0x4e,0x8e,0x4b,0x3a,0x4e,0x94,0x2f,0xf8,0x4e,0x9a,0x4e,0xa0,0x4e,0xa6,0x4e,0xac,0x4a,0xc8,0x4e,0xb2,0x1e,0x9a,0x16,0x7e,0x4e,0xb8,0x4d,0x2c,0x26,0xb0,0x4e,0xbe,0x4e,0xc4,\r\n0x2a,0x4c,0x32,0xc8,0x2f,0xf8,0x19,0x9c,0x4e,0xca,0x4e,0xd0,0x1b,0xee,0x4e,0xd6,0x4e,0xdc,0x4e,0xe2,0x20,0xb0,0x4e,0xe8,0x4e,0xee,0x2f,0xe6,0x4d,0x68,0x1e,0x46,0x4e,0xf4,0x4b,0xb2,0x4e,0x22,0x4b,0xb2,0x4e,0xfa,0x4f,0x00,0x4b,0x04,0x4f,0x06,0x4f,0x0c,0x18,0xd6,0x4f,0x12,0x4f,0x18,0x4f,0x1e,0x4f,0x24,0x17,0xc2,0x1b,0x9a,\r\n0x1a,0xe6,0x1c,0x18,0x4f,0x2a,0x4f,0x30,0x1c,0x0c,0x4f,0x36,0x18,0xd6,0x4f,0x3c,0x4f,0x42,0x4f,0x48,0x4d,0x98,0x4a,0xf2,0x4f,0x4e,0x4f,0x54,0x4f,0x5a,0x4f,0x60,0x4a,0xaa,0x1d,0xe6,0x4f,0x60,0x4a,0xce,0x19,0x12,0x4e,0x16,0x4f,0x66,0x4f,0x6c,0x44,0x6e,0x4f,0x72,0x4e,0x5e,0x4f,0x78,0x4f,0x7e,0x4a,0x3e,0x4a,0x4a,0x4a,0xb6,\r\n0x4a,0x6e,0x4a,0x98,0x4c,0xde,0x4f,0x84,0x4d,0xec,0x4a,0xb0,0x4a,0xbc,0x19,0x24,0x4a,0xda,0x4a,0xc8,0x4a,0xe0,0x19,0x12,0x4b,0x8e,0x4a,0xa4,0x4a,0xec,0x16,0x7e,0x4f,0x8a,0x4f,0x90,0x2f,0x56,0x4f,0x96,0x4f,0x9c,0x1e,0x34,0x4a,0xe0,0x4f,0xa2,0x1e,0x46,0x4f,0xa8,0x4f,0xae,0x27,0x28,0x4a,0xc2,0x4f,0xb4,0x4f,0xba,0x4f,0xc0,\r\n0x4f,0xc6,0x4a,0xe0,0x4f,0xba,0x25,0x72,0x4e,0xdc,0x4f,0xb4,0x4f,0xcc,0x25,0x90,0x4f,0xd2,0x4f,0xd8,0x4f,0xde,0x4f,0xe4,0x4f,0xea,0x4f,0xf0,0x1c,0x0c,0x25,0x78,0x27,0x28,0x21,0xfa,0x4f,0xf6,0x1a,0xe6,0x4f,0xfc,0x50,0x02,0x4a,0x44,0x1d,0x98,0x50,0x08,0x1d,0x98,0x16,0x7e,0x4a,0x62,0x4a,0xce,0x50,0x0e,0x50,0x14,0x4a,0x8c,\r\n0x19,0x12,0x4a,0xa4,0x50,0x1a,0x4a,0xb6,0x4a,0x6e,0x4b,0x3a,0x4a,0x6e,0x4a,0x62,0x4a,0x8c,0x1b,0xfa,0x4a,0xec,0x4d,0xb6,0x50,0x20,0x00,0x01,0x00,0x01,0x04,0x86,0x00,0x02,0x00,0x29,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,0x00,0x92,\r\n0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,0x01,0x45,\r\n0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,0x02,0x3c,\r\n0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,0x0a,0xcc,\r\n0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,0x00,0x01,0x00,0x68,0x00,0x70,0x00,0x02,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x48,0xb4,0x00,0x01,0x48,0xba,0x00,0x14,0x48,0xb6,0x48,0xb6,0x48,0xbc,0x48,0xbc,0x48,0xc2,0x48,0xc8,0x48,0xce,\r\n0x48,0xce,0x48,0xd4,0x48,0xda,0x48,0xe0,0x48,0xe0,0x48,0xe6,0x48,0xe6,0x48,0xec,0x48,0xec,0x42,0x9e,0x42,0x9e,0x48,0xf2,0x48,0xf2,0x48,0xf8,0x48,0xe0,0x48,0xfe,0x48,0xfe,0x49,0x04,0x49,0x04,0x49,0x0a,0x49,0x0a,0x49,0x10,0x49,0x10,0x0f,0x62,0x0f,0x62,0x14,0xf0,0x14,0xf0,0x49,0x16,0x49,0x16,0x49,0x1c,0x49,0x22,0x49,0x28,\r\n0x49,0x2e,0x00,0x01,0x00,0x02,0x04,0x80,0x04,0x81,0x00,0x02,0x00,0x05,0x00,0x45,0x00,0x47,0x00,0x00,0x00,0x49,0x00,0x4b,0x00,0x03,0x00,0x4d,0x00,0x51,0x00,0x06,0x00,0x53,0x00,0x5a,0x00,0x0b,0x00,0x5d,0x00,0x5d,0x00,0x13,0x00,0x01,0x0c,0xec,0x0c,0xf6,0x00,0x02,0x00,0x0c,0x00,0x1e,0x00,0x04,0x00,0x00,0x48,0xac,0x00,0x01,\r\n0x48,0xb2,0x00,0x00,0x48,0xb8,0x00,0x01,0x48,0xbe,0x03,0x33,0x48,0xb2,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x48,0xca,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x48,0xee,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x48,0xfa,0x48,0xb8,\r\n0x49,0x00,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x54,0x48,0xb8,\r\n0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x49,0x60,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x66,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x84,0x48,0xb8,\r\n0x49,0x8a,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x37,0x00,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,\r\n0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x54,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,\r\n0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0xae,0x48,0xb8,0x49,0xb4,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0xba,0x48,0xb8,0x49,0x78,0x48,0xb8,0x38,0x44,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x06,0x48,0xb8,\r\n0x49,0xc0,0x48,0xb8,0x49,0xc6,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x37,0x00,0x48,0xb8,0x37,0x00,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x06,0x48,0xb8,\r\n0x49,0x24,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x24,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xcc,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0xd2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,\r\n0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0xd8,0x48,0xb8,\r\n0x48,0xca,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xde,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0xe4,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8,\r\n0x49,0x78,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0xea,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x42,0x48,0xb8,\r\n0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0xf0,0x48,0xb8,0x49,0xf6,0x48,0xb8,0x49,0xfc,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,\r\n0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,\r\n0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8,\r\n0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,\r\n0x49,0x66,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,\r\n0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,\r\n0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,\r\n0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,\r\n0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,\r\n0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x4a,0x08,0x48,0xb8,0x4a,0x0e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,\r\n0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x35,0xa4,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x4a,0x14,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,\r\n0x48,0xb2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,\r\n0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xca,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x49,0x60,0x48,0xb8,\r\n0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,\r\n0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,\r\n0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,0x4a,0x1a,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,\r\n0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x0c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,\r\n0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,\r\n0x49,0x1e,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x49,0x90,0x48,0xb8,\r\n0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x30,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0x36,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,\r\n0x49,0x66,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x49,0x48,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x20,0x48,0xb8,0x4a,0x26,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x2c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x32,0x48,0xb8,0x4a,0x32,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x48,0xca,0x48,0xb8,\r\n0x4a,0x3e,0x48,0xb8,0x4a,0x44,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4a,0x50,0x48,0xb8,0x4a,0x56,0x48,0xb8,0x48,0xd0,0x48,0xb8,0x4a,0x5c,0x48,0xb8,0x49,0x2a,0x48,0xb8,0x4a,0x62,0x48,0xb8,0x4a,0x68,0x48,0xb8,0x4a,0x6e,0x48,0xb8,0x48,0xee,0x48,0xb8,0x4a,0x74,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x74,0x48,0xb8,\r\n0x4a,0x7a,0x48,0xb8,0x49,0x00,0x48,0xb8,0x39,0x1c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x4a,0x80,0x48,0xb8,0x4a,0x86,0x48,0xb8,0x4a,0x8c,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4a,0x92,0x48,0xb8,0x49,0x18,0x48,0xb8,0x49,0x84,0x48,0xb8,0x4a,0x98,0x48,0xb8,0x4a,0x9e,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4a,0xaa,0x48,0xb8,0x4a,0xa4,0x48,0xb8,\r\n0x4a,0xaa,0x48,0xb8,0x4a,0xb0,0x48,0xb8,0x4a,0xb6,0x48,0xb8,0x4a,0xbc,0x48,0xb8,0x4a,0xc2,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x38,0x44,0x48,0xb8,0x4a,0xce,0x48,0xb8,0x4a,0xd4,0x48,0xb8,0x4a,0xda,0x48,0xb8,0x4a,0xe0,0x48,0xb8,0x4a,0xe6,0x48,0xb8,0x4a,0xec,0x48,0xb8,\r\n0x4a,0xf2,0x48,0xb8,0x4a,0xf8,0x48,0xb8,0x4a,0xfe,0x48,0xb8,0x4b,0x04,0x48,0xb8,0x4b,0x0a,0x48,0xb8,0x4b,0x10,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x49,0xb4,0x48,0xb8,\r\n0x4b,0x1c,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x48,0xee,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4a,0xc8,0x48,0xb8,0x4b,0x22,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0xe0,0x48,0xb8,0x4a,0xe6,0x48,0xb8,\r\n0x4a,0xec,0x48,0xb8,0x48,0xd6,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0x28,0x48,0xb8,0x4b,0x2e,0x48,0xb8,0x49,0x00,0x48,0xb8,0x49,0x66,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe2,0x48,0xb8,\r\n0x36,0x5e,0x48,0xb8,0x48,0xe2,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x39,0x1c,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x24,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x34,0x48,0xb8,\r\n0x4b,0x3a,0x48,0xb8,0x48,0xdc,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x40,0x48,0xb8,0x49,0x36,0x48,0xb8,0x4b,0x46,0x48,0xb8,0x49,0x42,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x49,0x06,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0x16,0x48,0xb8,0x37,0x36,0x48,0xb8,\r\n0x37,0x36,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x39,0x16,0x48,0xb8,0x4b,0x4c,0x48,0xb8,0x4b,0x4c,0x48,0xb8,0x4a,0x50,0x48,0xb8,0x4b,0x52,0x48,0xb8,0x36,0x52,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0x58,0x48,0xb8,\r\n0x49,0x90,0x48,0xb8,0x4b,0x5e,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x64,0x48,0xb8,0x4a,0x6e,0x48,0xb8,0x4b,0x6a,0x48,0xb8,0x4b,0x70,0x48,0xb8,0x4b,0x76,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x4b,0x7c,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x72,0x48,0xb8,0x4b,0x82,0x48,0xb8,\r\n0x4b,0x82,0x48,0xb8,0x49,0x78,0x48,0xb8,0x49,0x78,0x48,0xb8,0x4b,0x88,0x48,0xb8,0x4a,0x14,0x48,0xb8,0x4b,0x8e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4b,0x9a,0x48,0xb8,0x4b,0x9a,0x48,0xb8,0x4b,0xa0,0x48,0xb8,\r\n0x4b,0xa6,0x48,0xb8,0x4b,0xac,0x48,0xb8,0x4a,0x68,0x48,0xb8,0x4b,0xb2,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4a,0xa4,0x48,0xb8,0x4b,0xb8,0x48,0xb8,0x4b,0xbe,0x48,0xb8,0x4b,0xc4,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x96,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0xca,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4b,0xd0,0x48,0xb8,0x4b,0x22,0x48,0xb8,\r\n0x4b,0x22,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x37,0x36,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4b,0xdc,0x48,0xb8,0x4b,0x58,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4a,0x02,0x48,0xb8,0x4a,0x74,0x48,0xb8,0x4b,0xe2,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4b,0xd6,0x48,0xb8,0x4b,0xd6,0x48,0xb8,\r\n0x4b,0xe8,0x48,0xb8,0x4b,0xee,0x48,0xb8,0x4b,0xf4,0x48,0xb8,0x4a,0x20,0x48,0xb8,0x4b,0xfa,0x48,0xb8,0x4c,0x00,0x48,0xb8,0x4c,0x06,0x48,0xb8,0x48,0xee,0x48,0xb8,0x4a,0xbc,0x48,0xb8,0x4c,0x0c,0x48,0xb8,0x4c,0x0c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4b,0x64,0x48,0xb8,0x4c,0x12,0x48,0xb8,0x4c,0x18,0x48,0xb8,0x4c,0x1e,0x48,0xb8,\r\n0x49,0x8a,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4a,0x4a,0x48,0xb8,0x4c,0x24,0x48,0xb8,0x4c,0x24,0x48,0xb8,0x48,0xb2,0x48,0xb8,0x48,0xc4,0x48,0xb8,0x49,0x54,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x49,0x1e,0x48,0xb8,0x49,0x84,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x4c,0x2a,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x60,0x48,0xb8,\r\n0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x4b,0x94,0x48,0xb8,0x4c,0x30,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x49,0xa8,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x4c,0x36,0x48,0xb8,0x4c,0x3c,0x48,0xb8,0x4c,0x42,0x48,0xb8,0x4b,0x6a,0x48,0xb8,0x4c,0x48,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x4c,0x4e,0x48,0xb8,\r\n0x4b,0xbe,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x60,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x6c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x49,0x72,0x48,0xb8,0x49,0x66,0x48,0xb8,0x49,0x4e,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x84,0x48,0xb8,0x4c,0x54,0x48,0xb8,0x49,0x90,0x48,0xb8,0x49,0x9c,0x48,0xb8,0x49,0xa8,0x48,0xb8,\r\n0x49,0x48,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x4c,0x5a,0x48,0xb8,0x4c,0x60,0x48,0xb8,0x4c,0x66,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4a,0x38,0x48,0xb8,0x4b,0xa6,0x48,0xb8,0x49,0x66,0x48,0xb8,0x4b,0x22,0x48,0xb8,0x4c,0x6c,0x48,0xb8,0x4c,0x72,0x48,0xb8,0x48,0xbe,0x48,0xb8,0x49,0x24,0x48,0xb8,\r\n0x4c,0x78,0x48,0xb8,0x37,0x00,0x48,0xb8,0x38,0x6e,0x48,0xb8,0x48,0xe8,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x4c,0x7e,0x48,0xb8,0x49,0x5a,0x48,0xb8,0x49,0x12,0x48,0xb8,0x49,0x7e,0x48,0xb8,0x49,0x3c,0x48,0xb8,0x49,0xa2,0x48,0xb8,0x4c,0x84,0x48,0xb8,0x48,0xf4,0x48,0xb8,0x4c,0x8a,0x48,0xb8,0x4c,0x90,0x48,0xb8,0x49,0x0c,0x48,0xb8,\r\n0x49,0x12,0x48,0xb8,0x49,0x48,0x48,0xb8,0x49,0x8a,0x48,0xb8,0x4c,0x96,0x48,0xb8,0x4c,0x9c,0x48,0xb8,0x36,0x5e,0x48,0xb8,0x00,0x02,0x00,0x01,0x07,0x3a,0x07,0x3d,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x24,0x00,0x3d,0x00,0x00,0x00,0x44,0x00,0x5d,0x00,0x1a,0x00,0x62,0x00,0x81,0x00,0x34,0x00,0x89,0x00,0x89,0x00,0x54,0x00,0x91,\r\n0x00,0x92,0x00,0x55,0x00,0xa0,0x00,0xa1,0x00,0x57,0x00,0xa7,0x00,0xa7,0x00,0x59,0x00,0xad,0x00,0xb1,0x00,0x5a,0x00,0xba,0x00,0xbb,0x00,0x5f,0x00,0xc7,0x00,0xd6,0x00,0x61,0x00,0xe1,0x00,0xe6,0x00,0x71,0x00,0xe8,0x00,0xed,0x00,0x77,0x00,0xf7,0x01,0x00,0x00,0x7d,0x01,0x03,0x01,0x2b,0x00,0x87,0x01,0x39,0x01,0x3b,0x00,0xb0,\r\n0x01,0x45,0x01,0x84,0x00,0xb3,0x01,0x8c,0x01,0x93,0x00,0xf3,0x02,0x40,0x02,0x43,0x00,0xfb,0x02,0x57,0x02,0xb0,0x00,0xff,0x02,0xcd,0x02,0xce,0x01,0x59,0x02,0xe1,0x03,0x78,0x01,0x5b,0x04,0xb0,0x04,0xe2,0x01,0xf3,0x04,0xe6,0x04,0xe9,0x02,0x26,0x04,0xee,0x04,0xfe,0x02,0x2a,0x05,0x07,0x05,0x07,0x02,0x3b,0x05,0x0c,0x05,0x46,\r\n0x02,0x3c,0x05,0x4b,0x05,0x4c,0x02,0x77,0x05,0x4f,0x05,0x50,0x02,0x79,0x05,0x56,0x05,0xb2,0x02,0x7b,0x06,0xac,0x06,0xad,0x02,0xd8,0x07,0x3e,0x07,0x43,0x02,0xda,0x07,0xe1,0x07,0xe2,0x02,0xe0,0x07,0xe4,0x07,0xeb,0x02,0xe2,0x07,0xf7,0x08,0x05,0x02,0xea,0x08,0x07,0x08,0x26,0x02,0xf9,0x0a,0x43,0x0a,0x43,0x03,0x19,0x0a,0xbf,\r\n0x0a,0xcc,0x03,0x1a,0x0a,0xe5,0x0a,0xe5,0x03,0x28,0x0a,0xe7,0x0a,0xed,0x03,0x29,0x0a,0xf4,0x0a,0xf4,0x03,0x30,0x0a,0xf7,0x0a,0xf7,0x03,0x31,0x11,0x8c,0x11,0x8c,0x03,0x32,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x00,0x00,0x01,0x02,0x47,0x00,0x00,0x00,0x01,0x01,0xc1,0x00,0x00,0x00,0x01,0x03,0x0a,0x00,0x00,\r\n0x00,0x01,0x02,0x6d,0x00,0x00,0x00,0x01,0x01,0xe7,0x00,0x00,0x00,0x01,0x02,0xb9,0x00,0x00,0x00,0x01,0x02,0x1c,0x00,0x00,0x00,0x01,0x01,0x96,0x00,0x00,0x00,0x01,0x02,0x30,0x00,0x00,0x00,0x01,0x01,0x93,0x00,0x00,0x00,0x01,0x01,0x0d,0x00,0x00,0x00,0x01,0x02,0xf2,0x00,0x00,0x00,0x01,0x02,0x23,0x00,0x00,0x00,0x01,0x01,0x61,\r\n0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x02,0xa0,0x00,0x00,0x00,0x01,0x02,0x1a,0x00,0x00,0x00,0x01,0x00,0xf9,0x00,0x00,0x00,0x01,0x00,0x73,0x00,0x00,0x00,0x01,0x01,0x4b,0x00,0x00,0x00,0x01,0x00,0xcf,0x00,0x00,0x00,0x01,0x03,0x3b,0x00,0x00,0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x18,0x00,0x00,0x00,0x01,\r\n0x03,0x3a,0x00,0x00,0x00,0x01,0x02,0x9d,0x00,0x00,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0xfc,0x00,0x00,0x00,0x01,0xff,0xf5,0x00,0x00,0x00,0x01,0x02,0x48,0x00,0x00,0x00,0x01,0x01,0xab,0x00,0x00,0x00,0x01,0x01,0x39,0x00,0x00,0x00,0x01,0x02,0x4d,0x00,0x00,0x00,0x01,0x01,0xb0,0x00,0x00,\r\n0x00,0x01,0x01,0x2a,0x00,0x00,0x00,0x01,0x03,0x42,0x00,0x00,0x00,0x01,0x02,0xa5,0x00,0x00,0x00,0x01,0x02,0x1f,0x00,0x00,0x00,0x01,0xff,0xb5,0x00,0x00,0x00,0x01,0xfe,0x98,0x00,0x00,0x00,0x01,0xfd,0x91,0x00,0x00,0x00,0x01,0x01,0xee,0x00,0x00,0x00,0x01,0x01,0x51,0x00,0x00,0x00,0x01,0x00,0xcb,0x00,0x00,0x00,0x01,0x03,0x37,\r\n0x00,0x00,0x00,0x01,0x02,0x9a,0x00,0x00,0x00,0x01,0x02,0x14,0x00,0x00,0x00,0x01,0x02,0xe8,0x00,0x00,0x00,0x01,0x02,0x4b,0x00,0x00,0x00,0x01,0x01,0xc5,0x00,0x00,0x00,0x01,0x02,0x85,0x00,0x00,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x01,0x02,0xcf,0x00,0x00,0x00,0x01,0x02,0x32,0x00,0x00,0x00,0x01,\r\n0x01,0xac,0x00,0x00,0x00,0x01,0x00,0xd3,0x00,0x00,0x00,0x01,0xff,0xb6,0x00,0x00,0x00,0x01,0xfe,0xaf,0x00,0x00,0x00,0x01,0x02,0x8e,0x00,0x00,0x00,0x01,0x01,0xf1,0x00,0x00,0x00,0x01,0x01,0x6b,0x00,0x00,0x00,0x01,0x03,0x89,0x00,0x00,0x00,0x01,0x03,0x6b,0x00,0x00,0x00,0x01,0x03,0x61,0x00,0x00,0x00,0x01,0x03,0xe7,0x00,0x00,\r\n0x00,0x01,0x03,0x18,0x00,0x00,0x00,0x01,0x02,0x06,0x00,0x00,0x00,0x01,0x03,0x83,0x00,0x00,0x00,0x01,0x02,0xe6,0x00,0x00,0x00,0x01,0x02,0x60,0x00,0x00,0x00,0x01,0x03,0x7e,0x00,0x00,0x00,0x01,0x02,0xe1,0x00,0x00,0x00,0x01,0x02,0x5b,0x00,0x00,0x00,0x01,0x02,0x9b,0x00,0x00,0x00,0x01,0x01,0xfe,0x00,0x00,0x00,0x01,0x01,0x78,\r\n0x00,0x00,0x00,0x01,0x02,0xad,0x00,0x00,0x00,0x01,0x02,0x10,0x00,0x00,0x00,0x01,0x01,0x8a,0x00,0x00,0x00,0x01,0x02,0xc5,0x00,0x00,0x00,0x01,0x02,0x28,0x00,0x00,0x00,0x01,0x01,0xa2,0x00,0x00,0x00,0x01,0x02,0x34,0x00,0x00,0x00,0x01,0x01,0x97,0x00,0x00,0x00,0x01,0x01,0x11,0x00,0x00,0x00,0x01,0x01,0xdc,0x00,0x00,0x00,0x01,\r\n0x01,0x3f,0x00,0x00,0x00,0x01,0x00,0xb9,0x00,0x00,0x00,0x01,0x02,0x42,0x00,0x00,0x00,0x01,0x01,0x73,0x00,0x00,0x00,0x01,0x00,0xf7,0x00,0x00,0x00,0x01,0x03,0xbf,0x00,0x00,0x00,0x01,0x03,0xe5,0x00,0x00,0x00,0x01,0x03,0x9a,0x00,0x00,0x00,0x01,0x03,0x0b,0x00,0x00,0x00,0x01,0x03,0x5b,0x00,0x00,0x00,0x01,0x04,0x18,0x00,0x00,\r\n0x00,0x01,0x02,0x71,0x00,0x00,0x00,0x01,0x04,0x16,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x01,0x03,0x41,0x00,0x00,0x00,0x01,0x03,0x28,0x00,0x00,0x00,0x01,0x04,0x1d,0x00,0x00,0x00,0x01,0x02,0xc9,0x00,0x00,0x00,0x01,0x04,0x12,0x00,0x00,0x00,0x01,0x03,0xa1,0x00,0x00,0x00,0x01,0x03,0xaa,0x00,0x00,0x00,0x01,0x03,0x69,\r\n0x00,0x00,0x00,0x01,0x05,0x40,0x00,0x00,0x00,0x01,0x03,0xab,0x00,0x00,0x00,0x01,0x04,0x5e,0x00,0x00,0x00,0x01,0x04,0x59,0x00,0x00,0x00,0x01,0x03,0x76,0x00,0x00,0x00,0x01,0x03,0x88,0x00,0x00,0x00,0x01,0x03,0xa0,0x00,0x00,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xf7,0x00,0x00,0x00,0x01,0x04,0x11,0x00,0x00,0x00,0x01,\r\n0xfe,0xfd,0x00,0x00,0x00,0x01,0x00,0xe6,0xff,0x9c,0x00,0x01,0x00,0xef,0x00,0x00,0x00,0x01,0x00,0xb8,0x00,0x00,0x00,0x01,0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x8a,0x00,0x00,0x00,0x01,0x01,0x1d,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,0x00,0x01,0x01,0x10,0x00,0x00,0x00,0x01,0x00,0xf2,0x00,0x00,\r\n0x00,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x01,0xff,0xac,0x00,0x00,0x00,0x01,0x01,0x17,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x98,0x00,0x00,0x00,0x01,0x00,0xc0,\r\n0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,0xff,0xb4,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x01,0xff,0xc4,0x00,0x00,0x00,0x01,0x00,0xd2,0x00,0x00,0x00,0x01,0x01,0x18,0x00,0x00,0x00,0x01,\r\n0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x00,0x01,0x00,0xa0,0x00,0x00,0x00,0x01,0x00,0x7c,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0xf0,0x00,0x01,0x01,0xa6,0x00,0xf0,0x00,0x01,0x00,0xe4,0x00,0xf0,0x00,0x01,0x01,0x9d,0x00,0xf0,0x00,0x01,0x00,0x8e,0x00,0xf0,\r\n0x00,0x01,0x01,0x47,0x00,0xf0,0x00,0x01,0x00,0x3c,0x00,0xf0,0x00,0x01,0x00,0xf5,0x00,0xf0,0x00,0x01,0x00,0x60,0x00,0xf0,0x00,0x01,0x01,0x19,0x00,0xf0,0x00,0x01,0x01,0x11,0x00,0xf0,0x00,0x01,0x01,0x97,0x00,0xf0,0x00,0x01,0x00,0x84,0x00,0xf0,0x00,0x01,0x01,0x3d,0x00,0xf0,0x00,0x01,0x00,0x6c,0x00,0xf0,0x00,0x01,0x01,0x25,\r\n0x00,0xf0,0x00,0x01,0x01,0x0e,0x00,0xf0,0x00,0x01,0x01,0x90,0x00,0xf0,0x00,0x01,0x00,0xf0,0x00,0xf0,0x00,0x01,0x01,0x72,0x00,0xf0,0x00,0x01,0x00,0x6d,0x00,0xf0,0x00,0x01,0x01,0x26,0x00,0xf0,0x00,0x01,0x00,0x8a,0x00,0xf0,0x00,0x01,0x01,0x43,0x00,0xf0,0x00,0x01,0xff,0x1e,0x00,0xf0,0x00,0x01,0xff,0xd7,0x00,0xf0,0x00,0x01,\r\n0x01,0x04,0x00,0xf0,0x00,0x01,0x00,0x62,0x00,0xf0,0x00,0x01,0x01,0x1b,0x00,0xf0,0x00,0x01,0x00,0xdc,0x00,0xf0,0x00,0x01,0x01,0x68,0x00,0xf0,0x00,0x01,0x00,0xb3,0x00,0xf0,0x00,0x01,0x01,0x6c,0x00,0xf0,0x00,0x01,0x00,0xb2,0x00,0xf0,0x00,0x01,0x01,0x3e,0x00,0xf0,0x00,0x01,0x00,0x64,0x00,0xf0,0x00,0x01,0x01,0x1d,0x00,0xf0,\r\n0x00,0x01,0x00,0xaa,0x00,0xf0,0x00,0x01,0x01,0x63,0x00,0xf0,0x00,0x01,0x01,0x0b,0x00,0xf0,0x00,0x01,0x00,0xbe,0x00,0xf0,0x00,0x01,0x01,0x77,0x00,0xf0,0x00,0x01,0x00,0xf2,0x00,0xf0,0x00,0x01,0x01,0xab,0x00,0xf0,0x00,0x01,0x00,0xe3,0x00,0xf0,0x00,0x01,0x01,0x9c,0x00,0xf0,0x00,0x01,0x01,0x01,0x00,0xf0,0x00,0x01,0x00,0xca,\r\n0x00,0xf0,0x00,0x01,0x01,0x83,0x00,0xf0,0x00,0x01,0x00,0x94,0x00,0xf0,0x00,0x01,0x01,0x4d,0x00,0xf0,0x00,0x01,0xff,0x5e,0x00,0xf0,0x00,0x01,0x02,0xa8,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0x00,0x00,0x01,0x01,0x56,0x00,0x00,0x00,0x01,0x02,0xc1,0x00,0x00,0x00,0x01,\r\n0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x02,0x3d,0x00,0x00,0x00,0x01,0x02,0xbf,0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x01,0x6a,0x00,0x00,0x00,0x01,0x02,0xb3,0x00,0x00,0x00,0x01,0x02,0x26,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0x00,0x00,0x01,0x02,0x33,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,\r\n0x00,0x01,0x02,0xaf,0x00,0x00,0x00,0x01,0x03,0x1f,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0x00,0x00,0x01,0x02,0x29,0x00,0x00,0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0xf0,0x00,0x01,0x01,0xeb,0x00,0xdc,0x00,0x01,0x01,0xc8,0x00,0xdc,0x00,0x01,0x02,0x45,0x00,0xdc,0x00,0x01,0x02,0x91,0x00,0x00,0x00,0x01,0x01,0xa0,\r\n0x00,0xdc,0x00,0x01,0x02,0xae,0x00,0xdc,0x00,0x01,0x02,0xf4,0x00,0xdc,0x00,0x01,0x02,0x4e,0x00,0x00,0x00,0x01,0x01,0xcf,0x00,0x00,0x00,0x01,0x02,0x38,0x00,0x00,0x00,0x01,0x02,0x15,0x00,0x00,0x00,0x01,0x02,0x3b,0x00,0x00,0x00,0x01,0xff,0xa6,0x00,0x00,0x00,0x01,0x02,0x4c,0x00,0x00,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,\r\n0x02,0x0e,0x00,0x00,0x00,0x01,0x02,0x36,0x00,0x00,0x00,0x01,0x02,0x12,0x00,0x00,0x00,0x01,0x02,0x13,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x01,0x01,0xe0,0x00,0x00,0x00,0x01,0x01,0xe1,0x00,0x00,0x00,0x01,0x02,0xee,0x00,0x00,0x00,0x01,0x03,0x14,0x00,0x00,0x00,0x01,0x02,0xc3,0x00,0x00,\r\n0x00,0x01,0x02,0x3a,0x00,0x00,0x00,0x01,0x03,0x10,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x00,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x01,0x03,0x44,0x00,0x00,0x00,0x01,0x02,0x52,0x00,0x00,0x00,0x01,0x02,0x57,0x00,0x00,0x00,0x01,0x03,0x4c,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x01,0x01,0xf8,\r\n0x00,0x00,0x00,0x01,0x02,0xbb,0x00,0x00,0x00,0x01,0x02,0xd9,0x00,0x00,0x00,0x01,0x01,0x45,0x00,0x00,0x00,0x01,0x02,0x98,0x00,0x00,0x00,0x01,0x04,0x05,0x00,0x00,0x00,0x01,0x03,0x8d,0x00,0x00,0x00,0x01,0x02,0x3e,0x00,0x00,0x00,0x01,0x01,0xe6,0x00,0x00,0x00,0x01,0x03,0x7d,0x00,0x00,0x00,0x01,0x03,0xa3,0x00,0x00,0x00,0x01,\r\n0x03,0x52,0x00,0x00,0x00,0x01,0x03,0xd6,0x00,0x00,0x00,0x01,0x02,0x2f,0x00,0x00,0x00,0x01,0x03,0xd4,0x00,0x00,0x00,0x01,0x03,0xd3,0x00,0x00,0x00,0x01,0x02,0x8b,0x00,0x00,0x00,0x01,0x03,0xdb,0x00,0x00,0x00,0x01,0x02,0x87,0x00,0x00,0x00,0x01,0x03,0xd0,0x00,0x00,0x00,0x01,0x03,0x81,0x00,0x00,0x00,0x01,0x03,0x68,0x00,0x00,\r\n0x00,0x01,0x03,0x27,0x00,0x00,0x00,0x01,0x04,0x2b,0x00,0x00,0x00,0x01,0x04,0x30,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x17,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x5e,0x00,0x00,0x00,0x01,0x02,0xcd,0x00,0x00,0x00,0x01,0x02,0x75,0x00,0x00,0x00,0x01,0x02,0xdb,\r\n0x00,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x00,0x01,0x04,0x26,0x00,0x00,0x00,0x01,0x03,0xd5,0x00,0x00,0x00,0x01,0x03,0x8c,0x00,0x00,0x00,0x01,0x02,0xb2,0x00,0x00,0x00,0x01,0x03,0x36,0x00,0x00,0x00,0x01,0x04,0x57,0x00,0x00,0x00,0x01,0x04,0x56,0x00,0x00,0x00,0x01,0x02,0x9f,0x00,0x00,0x00,0x01,0x03,0x64,0x00,0x00,0x00,0x01,\r\n0x00,0x3b,0x00,0x00,0x00,0x01,0x04,0x53,0x00,0x00,0x00,0x01,0x04,0x04,0x00,0x00,0x00,0x01,0x03,0xeb,0x00,0x00,0x00,0x01,0x01,0x59,0x00,0x00,0x00,0x01,0x05,0x1e,0x00,0x00,0x00,0x01,0x04,0x4f,0x00,0x00,0x00,0x01,0x04,0x9f,0x00,0x00,0x00,0x01,0x04,0x9a,0x00,0x00,0x00,0x01,0x03,0xb7,0x00,0x00,0x00,0x01,0x03,0xc9,0x00,0x00,\r\n0x00,0x01,0x03,0xe1,0x00,0x00,0x00,0x01,0x03,0x50,0x00,0x00,0x00,0x01,0x02,0xf8,0x00,0x00,0x00,0x01,0x03,0x1a,0x00,0x00,0x00,0x01,0x03,0x03,0x00,0x00,0x00,0x01,0x03,0x9e,0x00,0x00,0x00,0x01,0x01,0xf7,0x00,0x00,0x00,0x01,0x02,0x7b,0x00,0x00,0x00,0x01,0x03,0x9c,0x00,0x00,0x00,0x01,0x03,0x9b,0x00,0x00,0x00,0x01,0x02,0xa9,\r\n0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x00,0x00,0x01,0x02,0x4f,0x00,0x00,0x00,0x01,0x03,0x98,0x00,0x00,0x00,0x01,0x03,0x49,0x00,0x00,0x00,0x01,0x02,0x80,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x00,0xce,0x00,0x00,0x00,0x01,0x02,0xef,0x00,0x00,0x00,0x01,0x04,0x46,0x00,0x00,0x00,0x01,0x03,0xf8,0x00,0x00,0x00,0x01,\r\n0x03,0xe4,0x00,0x00,0x00,0x01,0x03,0xdf,0x00,0x00,0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x03,0x0e,0x00,0x00,0x00,0x01,0x03,0x26,0x00,0x00,0x00,0x01,0x02,0x95,0x00,0x00,0x00,0x01,0x02,0xa3,0x00,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x01,0x5e,0x00,0x00,0x00,0x01,0x01,0xc2,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00,\r\n0x00,0x01,0x03,0x84,0x00,0x00,0x00,0x01,0x03,0x67,0x00,0x00,0x00,0x01,0x03,0xaf,0x00,0x00,0x00,0x01,0x02,0xa7,0x00,0x00,0x00,0x01,0x03,0xb5,0x00,0x00,0x00,0x01,0x02,0x5d,0x00,0x00,0x00,0x01,0x03,0xbe,0x00,0x00,0x00,0x01,0x03,0xc8,0x00,0x00,0x00,0x01,0x03,0xc6,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x00,0x00,0x01,0x03,0xba,\r\n0x00,0x00,0x00,0x01,0x03,0x78,0x00,0x00,0x00,0x01,0x03,0x2d,0x00,0x00,0x00,0x01,0x03,0x65,0x00,0x00,0x00,0x01,0x03,0xb6,0x00,0x00,0x00,0x01,0x03,0xfb,0x00,0x00,0x00,0x01,0x03,0x1e,0x00,0x00,0x00,0x01,0x02,0x5f,0x00,0x00,0x00,0x01,0x02,0x86,0x00,0x00,0x00,0x01,0x02,0x5f,0x00,0xf0,0x00,0x01,0x02,0xf2,0x00,0xd0,0x00,0x01,\r\n0x02,0xcf,0x00,0xd0,0x00,0x01,0x03,0x4c,0x00,0xd0,0x00,0x01,0x02,0xa7,0x00,0xd0,0x00,0x01,0x02,0xf2,0x00,0xdc,0x00,0x01,0x03,0xb5,0x00,0xd0,0x00,0x01,0x03,0xfb,0x00,0xd0,0x00,0x01,0x01,0x04,0x04,0xb0,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x01,0x13,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0xb0,0x00,0x01,0x00,0x00,0x05,0x64,\r\n0x00,0x01,0xff,0xce,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x88,0x00,0x01,0x00,0x46,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x60,0x00,0x01,0x00,0x00,0x03,0xde,0x00,0x01,0x00,0x00,0x03,0xe8,0x00,0x01,0xff,0xc4,0x03,0xe8,0x00,0x01,0xff,0xf6,0x00,0x41,0x00,0x01,0x00,0x0a,0x00,0x41,0x00,0x01,0x00,0x00,0x04,0x7e,0x00,0x01,0x00,0x0f,\r\n0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x41,0x00,0x01,0xff,0xfb,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0xff,0xc9,0x00,0x01,0x00,0x00,0xff,0xe2,0x00,0x01,0xff,0xf1,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0x00,0x00,0x04,0xec,0x00,0x01,0x00,0x00,0xff,0xec,0x00,0x01,\r\n0x01,0xae,0x00,0x82,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x01,0x00,0x1e,0x04,0xb0,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,0x01,0x93,0x04,0xb0,0x00,0x01,0x01,0xa6,0x04,0xb0,0x00,0x01,0x01,0xb2,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x6f,0x00,0x01,0x00,0x00,0x04,0xa6,0x00,0x01,0x00,0x0f,0x04,0x7e,\r\n0x00,0x01,0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0xff,0xf1,0x04,0x7e,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0x00,0x04,0xc4,0x00,0x01,0x01,0xd9,0x04,0xba,0x00,0x01,0x01,0xd9,0x03,0xca,0x00,0x01,0x02,0x07,0x04,0x74,0x00,0x01,0x00,0xd9,0x00,0x82,0x00,0x01,0x01,0x53,\r\n0x04,0x06,0x00,0x01,0x02,0x80,0x00,0x82,0x00,0x01,0x02,0x8c,0x06,0x40,0x00,0x01,0x03,0x93,0x05,0xdc,0x00,0x01,0x02,0x9e,0xff,0xf1,0x00,0x01,0x02,0x1c,0x06,0x40,0x00,0x01,0x03,0xe8,0x05,0xdc,0x00,0x01,0x02,0x1c,0xff,0xf1,0x00,0x01,0x02,0xee,0x06,0x40,0x00,0x01,0x04,0xc4,0x05,0xdc,0x00,0x01,0x02,0xee,0xff,0xe7,0x00,0x01,\r\n0x02,0xbc,0x06,0x40,0x00,0x01,0x04,0xce,0x05,0xdc,0x00,0x01,0x02,0xbc,0xff,0xf1,0x00,0x01,0x02,0x58,0x06,0x40,0x00,0x01,0x03,0xd4,0x05,0xdc,0x00,0x01,0x02,0x58,0xff,0xf1,0x00,0x01,0x03,0x20,0x06,0x40,0x00,0x01,0x05,0x00,0x05,0xdc,0x00,0x01,0x03,0x20,0xff,0xe7,0x00,0x01,0x02,0xd0,0x06,0x40,0x00,0x01,0x05,0x28,0x05,0xdc,\r\n0x00,0x01,0x02,0xd0,0xff,0xf1,0x00,0x01,0x01,0x09,0x06,0x40,0x00,0x01,0x02,0x08,0x05,0xdc,0x00,0x01,0x01,0x09,0xff,0xf1,0x00,0x01,0x01,0xd6,0x06,0x40,0x00,0x01,0x02,0x58,0x05,0xdc,0x00,0x01,0x01,0x7c,0xff,0xf1,0x00,0x01,0x02,0x8a,0x06,0x40,0x00,0x01,0x04,0xb0,0x05,0xdc,0x00,0x01,0x02,0x8a,0xff,0xf1,0x00,0x01,0x02,0x4e,\r\n0x06,0x40,0x00,0x01,0x03,0x84,0x05,0xdc,0x00,0x01,0x02,0x4e,0xff,0xf1,0x00,0x01,0x03,0x93,0x06,0x40,0x00,0x01,0x06,0xa4,0x05,0xdc,0x00,0x01,0x03,0x93,0xff,0xf1,0x00,0x01,0x05,0x78,0x05,0xdc,0x00,0x01,0x03,0x20,0xff,0xf1,0x00,0x01,0x03,0x02,0x06,0x40,0x00,0x01,0x05,0x14,0x05,0xdc,0x00,0x01,0x03,0x02,0xff,0xe7,0x00,0x01,\r\n0x02,0x62,0x06,0x40,0x00,0x01,0x02,0x62,0xff,0xf1,0x00,0x01,0x03,0x02,0xfe,0xf2,0x00,0x01,0x04,0x10,0x05,0xdc,0x00,0x01,0x02,0x3a,0x06,0x40,0x00,0x01,0x02,0x26,0xff,0xe7,0x00,0x01,0x02,0x26,0x06,0x40,0x00,0x01,0x04,0x4c,0x05,0xdc,0x00,0x01,0x02,0x26,0xff,0xf1,0x00,0x01,0x02,0xbc,0xff,0xe7,0x00,0x01,0x02,0x80,0x06,0x40,\r\n0x00,0x01,0x02,0x80,0xff,0xf1,0x00,0x01,0x03,0xca,0x06,0x40,0x00,0x01,0x07,0x9e,0x05,0xdc,0x00,0x01,0x03,0xca,0xff,0xf1,0x00,0x01,0x02,0x6c,0x06,0x40,0x00,0x01,0x02,0x6c,0xff,0xf1,0x00,0x01,0x02,0x44,0x06,0x40,0x00,0x01,0x02,0x44,0xff,0xf1,0x00,0x01,0x02,0x08,0x05,0x14,0x00,0x01,0x03,0x84,0x04,0xb0,0x00,0x01,0x02,0x08,\r\n0xff,0xe7,0x00,0x01,0x02,0x4e,0x06,0x72,0x00,0x01,0x03,0xca,0x05,0x78,0x00,0x01,0x02,0x6c,0xff,0xe7,0x00,0x01,0x02,0x26,0x05,0x14,0x00,0x01,0x03,0x98,0x04,0xb0,0x00,0x01,0x02,0x3a,0xff,0xe7,0x00,0x01,0x02,0x1c,0x06,0x72,0x00,0x01,0x04,0x4c,0x06,0x40,0x00,0x01,0x02,0x1c,0xff,0xe7,0x00,0x01,0x02,0x3a,0x05,0x14,0x00,0x01,\r\n0x01,0xe0,0x06,0x72,0x00,0x01,0x01,0x36,0xff,0xf1,0x00,0x01,0x04,0x38,0x04,0xb0,0x00,0x01,0x02,0x3a,0xfe,0x2a,0x00,0x01,0x00,0xfa,0x06,0x72,0x00,0x01,0x01,0xa4,0x06,0x0e,0x00,0x01,0x00,0xfa,0xff,0xf1,0x00,0x01,0x00,0xf0,0x06,0x72,0x00,0x01,0x00,0x50,0xfe,0x2a,0x00,0x01,0x03,0x84,0x05,0x78,0x00,0x01,0x01,0x7c,0x06,0x40,\r\n0x00,0x01,0x03,0x7a,0x05,0x14,0x00,0x01,0x06,0x40,0x04,0xb0,0x00,0x01,0x03,0x7a,0xff,0xf1,0x00,0x01,0x02,0x4e,0x05,0x14,0x00,0x01,0x03,0xe8,0x04,0xb0,0x00,0x01,0x02,0x58,0x05,0x14,0x00,0x01,0x02,0x58,0xff,0xe7,0x00,0x01,0x04,0x1a,0x04,0xb0,0x00,0x01,0x02,0x4e,0xfe,0x2a,0x00,0x01,0x04,0x42,0x04,0xb0,0x00,0x01,0x01,0xcc,\r\n0x05,0x14,0x00,0x01,0x02,0xe4,0x04,0xb0,0x00,0x01,0x01,0xae,0x05,0x14,0x00,0x01,0x03,0x02,0x04,0xb0,0x00,0x01,0x01,0xae,0xff,0xe7,0x00,0x01,0x01,0x2c,0x05,0xdc,0x00,0x01,0x01,0xe0,0x05,0x78,0x00,0x01,0x01,0x80,0xff,0xe7,0x00,0x01,0x04,0x06,0x04,0xb0,0x00,0x01,0x01,0xf4,0x05,0x14,0x00,0x01,0x04,0x10,0x04,0xb0,0x00,0x01,\r\n0x01,0xf4,0xff,0xf1,0x00,0x01,0x02,0xf3,0x05,0x14,0x00,0x01,0x05,0xf0,0x04,0xb0,0x00,0x01,0x02,0xf3,0xff,0xf1,0x00,0x01,0x01,0xd6,0x05,0x14,0x00,0x01,0x03,0xca,0x04,0xb0,0x00,0x01,0x01,0xd6,0xff,0xf1,0x00,0x01,0x01,0xf9,0x05,0x14,0x00,0x01,0x01,0xf9,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x05,0x14,0x00,0x01,0x01,0xc2,0xff,0xf1,\r\n0x00,0x01,0x02,0x9e,0x07,0x80,0x00,0x01,0x04,0x33,0x06,0x7c,0x00,0x01,0x02,0xee,0xfe,0x48,0x00,0x01,0x02,0x58,0x07,0xb0,0x00,0x01,0x03,0xd4,0x06,0xa4,0x00,0x01,0x03,0x20,0x07,0x80,0x00,0x01,0x05,0x78,0x06,0x7c,0x00,0x01,0x03,0x02,0x07,0x80,0x00,0x01,0x05,0x8c,0x06,0x7c,0x00,0x01,0x02,0xbc,0x07,0x80,0x00,0x01,0x05,0x64,\r\n0x06,0x7c,0x00,0x01,0x02,0x08,0x06,0x54,0x00,0x01,0x03,0xd4,0x05,0x50,0x00,0x01,0x01,0xf4,0x06,0x04,0x00,0x01,0x01,0xf4,0xff,0xe7,0x00,0x01,0x02,0x08,0x06,0x04,0x00,0x01,0x03,0x84,0x05,0x50,0x00,0x01,0x02,0x3a,0xfe,0x48,0x00,0x01,0x02,0x3a,0x06,0x54,0x00,0x01,0x02,0x2b,0x06,0x54,0x00,0x01,0x02,0x2b,0xff,0xe7,0x00,0x01,\r\n0x02,0x26,0x06,0x04,0x00,0x01,0x02,0x44,0x05,0x46,0x00,0x01,0x01,0xf4,0x05,0x1e,0x00,0x01,0x00,0xe6,0x06,0x72,0x00,0x01,0x02,0x44,0x05,0x1e,0x00,0x01,0x00,0xe6,0x06,0x0e,0x00,0x01,0x02,0x4e,0x06,0x04,0x00,0x01,0x04,0x38,0x05,0x50,0x00,0x01,0x02,0x58,0x06,0x54,0x00,0x01,0x02,0x53,0x06,0x54,0x00,0x01,0x02,0x53,0xff,0xe7,\r\n0x00,0x01,0x02,0x58,0x06,0x04,0x00,0x01,0x02,0x26,0x06,0x54,0x00,0x01,0x04,0x56,0x05,0x50,0x00,0x01,0x02,0x3a,0x06,0x04,0x00,0x01,0x02,0x2d,0x06,0xa2,0x00,0x01,0x04,0x5a,0x06,0x02,0x00,0x01,0x02,0x2d,0xff,0xe7,0x00,0x01,0x03,0xe8,0x06,0x40,0x00,0x01,0x06,0xe2,0x05,0xdc,0x00,0x01,0x03,0xe8,0xff,0xf1,0x00,0x01,0x03,0x48,\r\n0x05,0x14,0x00,0x01,0x06,0xa8,0x04,0xb0,0x00,0x01,0x03,0x48,0xff,0xe7,0x00,0x01,0x03,0x02,0x06,0x72,0x00,0x01,0x04,0x00,0x05,0x9a,0x00,0x01,0x01,0x4b,0xfe,0xd4,0x00,0x01,0x02,0x9e,0x07,0xb0,0x00,0x01,0x04,0x83,0x06,0x7c,0x00,0x01,0x04,0x74,0x06,0x40,0x00,0x01,0x07,0x72,0x05,0xdc,0x00,0x01,0x04,0x74,0xff,0xe7,0x00,0x01,\r\n0x03,0xfc,0x05,0x14,0x00,0x01,0x07,0x6c,0x04,0xb0,0x00,0x01,0x03,0xfc,0xff,0xe7,0x00,0x01,0x01,0xf9,0x06,0x04,0x00,0x01,0x04,0x6a,0x05,0x50,0x00,0x01,0x02,0x44,0x07,0x80,0x00,0x01,0x05,0x00,0x06,0x7c,0x00,0x01,0x02,0x30,0x07,0xb0,0x00,0x01,0x04,0x24,0x06,0x7c,0x00,0x01,0x02,0x30,0xff,0xf1,0x00,0x01,0x04,0x33,0x06,0xa4,\r\n0x00,0x01,0x02,0x30,0x07,0x80,0x00,0x01,0x04,0x4c,0x06,0x7c,0x00,0x01,0x01,0x09,0x07,0xb0,0x00,0x01,0x02,0x80,0x06,0xa4,0x00,0x01,0x01,0x1d,0x07,0xb0,0x00,0x01,0x01,0x1d,0xff,0xf1,0x00,0x01,0x01,0x09,0x07,0x80,0x00,0x01,0x02,0x80,0x06,0x7c,0x00,0x01,0x02,0x30,0x06,0x7c,0x00,0x01,0x03,0x02,0x07,0xb0,0x00,0x01,0x02,0xbc,\r\n0x07,0xb0,0x00,0x01,0x00,0xfa,0x04,0xa0,0x00,0x01,0x01,0x7c,0x04,0x50,0x00,0x01,0x01,0x0e,0x06,0x72,0x00,0x01,0x01,0xa4,0x06,0x40,0x00,0x01,0x01,0x0e,0xff,0xf1,0x00,0x01,0x02,0x26,0x07,0xb0,0x00,0x01,0x04,0x24,0x06,0xa4,0x00,0x01,0x01,0x90,0x06,0x54,0x00,0x01,0x03,0x52,0x05,0x50,0x00,0x01,0x02,0x6c,0x07,0xb0,0x00,0x01,\r\n0x05,0x00,0x06,0xa4,0x00,0x01,0x01,0xf4,0x06,0x54,0x00,0x01,0x03,0xe8,0x05,0x50,0x00,0x01,0x02,0x3c,0x06,0x94,0x00,0x01,0x04,0x79,0x05,0xf4,0x00,0x01,0x02,0x3c,0xff,0xe7,0x00,0x01,0x02,0x44,0x07,0xb0,0x00,0x01,0x01,0xf9,0x06,0x54,0x00,0x01,0x02,0x3d,0x06,0x3a,0x00,0x01,0x04,0x7b,0x04,0xfa,0x00,0x01,0x02,0x3d,0xff,0xf1,\r\n0x00,0x01,0x02,0x5a,0x06,0x8c,0x00,0x01,0x04,0xb4,0x05,0x4c,0x00,0x01,0x02,0x5a,0xfe,0x2a,0x00,0x01,0x03,0x20,0x07,0xb0,0x00,0x01,0x05,0x50,0x06,0x7c,0x00,0x01,0x04,0x88,0x05,0x50,0x00,0x01,0x01,0x1d,0x07,0x08,0x00,0x01,0x02,0x21,0x06,0x42,0x00,0x01,0x02,0x26,0xfe,0x48,0x00,0x01,0x01,0xae,0xfe,0x48,0x00,0x01,0x02,0xee,\r\n0x07,0xb0,0x00,0x01,0x05,0x14,0x06,0xa4,0x00,0x01,0x03,0x0c,0x07,0xb0,0x00,0x01,0x03,0x0c,0xff,0xe7,0x00,0x01,0x02,0x44,0x06,0x54,0x00,0x01,0x02,0x44,0xff,0xe7,0x00,0x01,0x02,0x9e,0x06,0x40,0x00,0x01,0x02,0x9e,0xfe,0xa2,0x00,0x01,0x02,0x08,0xfe,0xa2,0x00,0x01,0x02,0xa8,0x07,0xb0,0x00,0x01,0x05,0x1e,0x06,0xa4,0x00,0x01,\r\n0x02,0xa8,0xff,0xf1,0x00,0x01,0x02,0x58,0xfe,0xa2,0x00,0x01,0x02,0x3a,0xfe,0xa2,0x00,0x01,0x02,0x4e,0x07,0xb0,0x00,0x01,0x03,0x84,0x06,0xa4,0x00,0x01,0x00,0xfa,0x08,0x02,0x00,0x01,0x01,0xf4,0x06,0xe0,0x00,0x01,0x03,0xc4,0x05,0xdc,0x00,0x01,0x02,0x75,0x06,0x40,0x00,0x01,0x05,0x78,0x06,0xa4,0x00,0x01,0x02,0x4e,0x06,0x54,\r\n0x00,0x01,0x03,0x02,0xff,0xf1,0x00,0x01,0x05,0x8c,0x06,0xa4,0x00,0x01,0x02,0x62,0x07,0xb0,0x00,0x01,0x04,0x60,0x06,0xa4,0x00,0x01,0x01,0xcc,0x06,0x54,0x00,0x01,0x03,0x34,0x05,0x50,0x00,0x01,0x01,0xae,0x06,0x54,0x00,0x01,0x02,0x3a,0x07,0xb0,0x00,0x01,0x01,0x80,0xfe,0x48,0x00,0x01,0x04,0x9c,0x06,0xa4,0x00,0x01,0x01,0x2c,\r\n0x06,0x0e,0x00,0x01,0x02,0x30,0x06,0x18,0x00,0x01,0x05,0x64,0x06,0xa4,0x00,0x01,0x02,0x8a,0x07,0x80,0x00,0x01,0x04,0xb0,0x06,0xa4,0x00,0x01,0x01,0xe0,0x06,0x54,0x00,0x01,0x02,0x4e,0x07,0x80,0x00,0x01,0x04,0xb0,0x06,0x7c,0x00,0x01,0x01,0xe0,0x06,0x04,0x00,0x01,0x03,0xf8,0x06,0x3a,0x00,0x01,0x04,0xac,0x06,0x3a,0x00,0x01,\r\n0x03,0x7a,0xff,0xe7,0x00,0x01,0x03,0x0c,0x06,0x79,0x00,0x01,0x03,0xf6,0x06,0x29,0x00,0x01,0x02,0x8a,0xfe,0x2a,0x00,0x01,0x02,0xe8,0x05,0xb2,0x00,0x01,0x04,0x39,0x04,0xb0,0x00,0x01,0x02,0xe8,0xff,0xf1,0x00,0x01,0x02,0x9e,0x07,0x30,0x00,0x01,0x02,0xf8,0x07,0xb0,0x00,0x01,0x02,0xf8,0xff,0xe7,0x00,0x01,0x04,0xc4,0x06,0x7c,\r\n0x00,0x01,0x02,0x44,0x07,0x30,0x00,0x01,0x03,0xfc,0x05,0x50,0x00,0x01,0x02,0x1c,0x07,0xb0,0x00,0x01,0x02,0x26,0x07,0x80,0x00,0x01,0x03,0xd4,0x06,0x40,0x00,0x01,0x05,0x50,0x06,0xa4,0x00,0x01,0x02,0x44,0xfe,0x2a,0x00,0x01,0x03,0x20,0xfe,0x70,0x00,0x01,0x02,0x3a,0x06,0x16,0x00,0x01,0x04,0x66,0x05,0xa0,0x00,0x01,0x02,0xd0,\r\n0x07,0xb0,0x00,0x01,0x02,0x6c,0x07,0xb2,0x00,0x01,0x04,0x1a,0x06,0x18,0x00,0x01,0x02,0xd7,0x06,0x3a,0x00,0x01,0x05,0x5e,0x05,0xea,0x00,0x01,0x02,0xd7,0xff,0xf1,0x00,0x01,0x02,0x43,0x06,0x3c,0x00,0x01,0x04,0x37,0x05,0x4c,0x00,0x01,0x02,0x43,0xff,0xf1,0x00,0x01,0x01,0x0e,0x07,0x80,0x00,0x01,0x00,0xfa,0x06,0x0e,0x00,0x01,\r\n0x01,0x09,0x07,0x30,0x00,0x01,0x00,0xfa,0x05,0xd2,0x00,0x01,0x01,0x0e,0x07,0xb0,0x00,0x01,0x00,0xe1,0x06,0x72,0x00,0x01,0x01,0x0e,0x06,0x40,0x00,0x01,0x01,0x0e,0xfe,0xa2,0x00,0x01,0x00,0xfa,0xfe,0xa2,0x00,0x01,0x01,0xd6,0x07,0xb0,0x00,0x01,0x02,0xd0,0x06,0xa4,0x00,0x01,0x01,0xf4,0x05,0x6e,0x00,0x01,0x02,0x8a,0xfe,0x70,\r\n0x00,0x01,0x02,0x4e,0xfe,0x70,0x00,0x01,0x01,0xfd,0x04,0xa0,0x00,0x01,0x03,0xfa,0x04,0xa0,0x00,0x01,0x01,0xfd,0xff,0xf1,0x00,0x01,0x02,0x4e,0xfe,0x48,0x00,0x01,0x00,0xfa,0xfe,0x48,0x00,0x01,0x03,0x20,0xfe,0x2a,0x00,0x01,0x03,0x02,0x07,0x30,0x00,0x01,0x02,0x9e,0xfe,0x70,0x00,0x01,0x00,0xfa,0xfe,0x70,0x00,0x01,0x02,0x18,\r\n0x05,0xea,0x00,0x01,0x04,0x81,0x05,0xea,0x00,0x01,0x02,0x18,0xff,0xf1,0x00,0x01,0x01,0x2c,0x05,0x7f,0x00,0x01,0x02,0xb6,0x05,0x2f,0x00,0x01,0x02,0xbc,0x07,0x30,0x00,0x01,0x02,0xbc,0xfe,0xa2,0x00,0x01,0x02,0x26,0xfe,0xa2,0x00,0x01,0x03,0xd4,0x07,0xb0,0x00,0x01,0x07,0x9e,0x06,0x7c,0x00,0x01,0x02,0xf8,0x06,0x54,0x00,0x01,\r\n0x05,0xf0,0x05,0x50,0x00,0x01,0x02,0x08,0xfe,0x2a,0x00,0x01,0x01,0x7c,0x06,0x72,0x00,0x01,0x02,0x8e,0x06,0x52,0x00,0x01,0x03,0xca,0x07,0xb0,0x00,0x01,0x02,0xf3,0x06,0x54,0x00,0x01,0x03,0xca,0x07,0x80,0x00,0x01,0x02,0xf3,0x06,0x04,0x00,0x01,0x04,0x1a,0x05,0x50,0x00,0x01,0x06,0x1a,0x06,0x7c,0x00,0x01,0x04,0xc7,0x04,0xb0,\r\n0x00,0x01,0x02,0xbc,0x06,0xd6,0x00,0x01,0x05,0xfa,0x06,0x7c,0x00,0x01,0x02,0x26,0x05,0x46,0x00,0x01,0x05,0x04,0x05,0x00,0x00,0x01,0x02,0xb2,0xfe,0xc0,0x00,0x01,0x02,0x12,0x05,0x14,0x00,0x01,0x02,0x12,0xfe,0xc0,0x00,0x01,0x02,0x44,0xfe,0xc0,0x00,0x01,0x02,0x4e,0xfe,0xc0,0x00,0x01,0x02,0x30,0x06,0xc2,0x00,0x01,0x01,0xf4,\r\n0x05,0x82,0x00,0x01,0x01,0x09,0xfe,0xc0,0x00,0x01,0x00,0xfa,0xfe,0xc0,0x00,0x01,0x03,0x02,0xfe,0xc0,0x00,0x01,0x02,0x58,0xfe,0xc0,0x00,0x01,0x02,0xbc,0xfe,0xc0,0x00,0x01,0x02,0x26,0xfe,0xc0,0x00,0x01,0x02,0x26,0xfe,0x84,0x00,0x01,0x01,0x80,0xfe,0x84,0x00,0x01,0x02,0xe2,0x06,0x52,0x00,0x01,0x05,0x74,0x05,0x62,0x00,0x01,\r\n0x02,0xe2,0xff,0xe7,0x00,0x01,0x02,0x03,0x04,0xb8,0x00,0x01,0x03,0xdf,0x03,0xc8,0x00,0x01,0x02,0x03,0xff,0xe7,0x00,0x01,0x02,0x58,0xfe,0x48,0x00,0x01,0x02,0x9e,0xfe,0x02,0x00,0x01,0x02,0x08,0xfe,0x02,0x00,0x01,0x02,0x1c,0x07,0x80,0x00,0x01,0x03,0xe8,0x06,0x7c,0x00,0x01,0x02,0x30,0x06,0x40,0x00,0x01,0x02,0x30,0xfe,0xc0,\r\n0x00,0x01,0x02,0x6c,0xfe,0xc0,0x00,0x01,0x02,0x44,0xff,0x24,0x00,0x01,0x02,0x6c,0xff,0x24,0x00,0x01,0x05,0x1e,0x06,0x7c,0x00,0x01,0x02,0xa8,0x06,0x40,0x00,0x01,0x02,0xa8,0xfe,0xc0,0x00,0x01,0x02,0x58,0x06,0x72,0x00,0x01,0x02,0x8a,0xff,0x24,0x00,0x01,0x02,0x4e,0xff,0x24,0x00,0x01,0x02,0xbc,0xfe,0x70,0x00,0x01,0x02,0x1c,\r\n0xfe,0x70,0x00,0x01,0x02,0xb2,0x06,0x40,0x00,0x01,0x02,0xb2,0xfe,0x2a,0x00,0x01,0x02,0x44,0x05,0x14,0x00,0x01,0x02,0x30,0xfe,0xa2,0x00,0x01,0x02,0x12,0x07,0x80,0x00,0x01,0x02,0x12,0xff,0xf1,0x00,0x01,0x01,0xe0,0x07,0x62,0x00,0x01,0x02,0xee,0x06,0xe0,0x00,0x01,0x03,0x20,0x07,0x30,0x00,0x01,0x02,0xd0,0x07,0x80,0x00,0x01,\r\n0x05,0x28,0x06,0x7c,0x00,0x01,0x02,0x4e,0x06,0xd6,0x00,0x01,0x03,0xca,0x06,0x18,0x00,0x01,0x02,0xee,0xfe,0xc0,0x00,0x01,0x02,0x3a,0x06,0x72,0x00,0x01,0x02,0x3a,0xfe,0xc0,0x00,0x01,0x02,0x80,0x07,0xb2,0x00,0x01,0x04,0x1a,0x06,0x54,0x00,0x01,0x02,0xd0,0xfe,0x2a,0x00,0x01,0x02,0xd0,0xfe,0x84,0x00,0x01,0x02,0x4e,0xfe,0x84,\r\n0x00,0x01,0x01,0x09,0xfe,0xa2,0x00,0x01,0x02,0x8a,0x07,0xb0,0x00,0x01,0x02,0x4e,0x07,0xb2,0x00,0x01,0x02,0x80,0xfe,0xc0,0x00,0x01,0x02,0x26,0x06,0x72,0x00,0x01,0x02,0x30,0x06,0x72,0x00,0x01,0x02,0x30,0xff,0x24,0x00,0x01,0x02,0x26,0x07,0x30,0x00,0x01,0x03,0xd4,0x06,0x7c,0x00,0x01,0x00,0xfa,0x07,0x12,0x00,0x01,0x00,0xfa,\r\n0xff,0x24,0x00,0x01,0x02,0x2b,0x06,0x40,0x00,0x01,0x02,0x2b,0xfe,0x2a,0x00,0x01,0x00,0xfa,0xfe,0x2a,0x00,0x01,0x03,0x93,0x07,0xb0,0x00,0x01,0x06,0xa4,0x06,0xa4,0x00,0x01,0x03,0x7a,0x06,0x54,0x00,0x01,0x06,0x40,0x05,0x50,0x00,0x01,0x03,0x5c,0x07,0x80,0x00,0x01,0x06,0xa4,0x06,0x7c,0x00,0x01,0x03,0x5c,0xfe,0xc0,0x00,0x01,\r\n0x03,0x7a,0xfe,0xc0,0x00,0x01,0x02,0xf8,0x07,0x80,0x00,0x01,0x02,0xf8,0xff,0xf1,0x00,0x01,0x02,0xf8,0x06,0x40,0x00,0x01,0x02,0xf8,0xfe,0xc0,0x00,0x01,0x02,0xf8,0xff,0x24,0x00,0x01,0x02,0x58,0xff,0x24,0x00,0x01,0x03,0x02,0xfe,0x2a,0x00,0x01,0x04,0x38,0x06,0xa4,0x00,0x01,0x04,0x38,0x06,0x7c,0x00,0x01,0x02,0x6c,0x06,0x04,\r\n0x00,0x01,0x02,0x6c,0xfe,0x2a,0x00,0x01,0x02,0x58,0x07,0x80,0x00,0x01,0x04,0x60,0x06,0x7c,0x00,0x01,0x01,0x90,0x06,0x04,0x00,0x01,0x02,0x8a,0xfe,0xc0,0x00,0x01,0x02,0x9e,0xff,0x24,0x00,0x01,0x02,0x4e,0xff,0xe7,0x00,0x01,0x01,0xcc,0xff,0xe7,0x00,0x01,0x01,0xc2,0x05,0x14,0x00,0x01,0x01,0xc2,0xfe,0xc0,0x00,0x01,0x04,0x24,\r\n0x07,0x1c,0x00,0x01,0x03,0x52,0x05,0xf0,0x00,0x01,0x02,0x44,0x07,0xd0,0x00,0x01,0x01,0xae,0x06,0xa4,0x00,0x01,0x02,0x62,0x07,0x80,0x00,0x01,0x02,0x62,0xfe,0xc0,0x00,0x01,0x01,0xd6,0xfe,0xc0,0x00,0x01,0x01,0x2c,0x07,0x1c,0x00,0x01,0x01,0x68,0xfe,0xc0,0x00,0x01,0x02,0x26,0xff,0x24,0x00,0x01,0x01,0x80,0xff,0x24,0x00,0x01,\r\n0x02,0x26,0xfe,0x2a,0x00,0x01,0x01,0x68,0xfe,0x2a,0x00,0x01,0x02,0x1c,0x05,0x14,0x00,0x01,0x02,0x1c,0xfe,0xc0,0x00,0x01,0x02,0x2b,0x05,0x14,0x00,0x01,0x02,0x80,0x07,0x80,0x00,0x01,0x05,0x14,0x06,0x7c,0x00,0x01,0x04,0x60,0x05,0x50,0x00,0x01,0x01,0xf4,0xfe,0xc0,0x00,0x01,0x03,0xde,0x07,0x80,0x00,0x01,0x07,0xee,0x06,0x7c,\r\n0x00,0x01,0x02,0xf8,0x06,0x04,0x00,0x01,0x03,0xca,0xfe,0xc0,0x00,0x01,0x02,0xf3,0xfe,0xc0,0x00,0x01,0x02,0x6c,0x07,0x80,0x00,0x01,0x04,0xce,0x06,0x7c,0x00,0x01,0x01,0xd6,0x06,0x24,0x00,0x01,0x03,0xca,0x05,0x50,0x00,0x01,0x01,0xe0,0xff,0xf1,0x00,0x01,0x01,0xe0,0xfe,0xc0,0x00,0x01,0x01,0xcc,0xff,0x24,0x00,0x01,0x01,0x54,\r\n0x07,0x1c,0x00,0x01,0x02,0xd0,0x06,0x18,0x00,0x01,0x03,0xd4,0x05,0x82,0x00,0x01,0x01,0x8b,0x07,0xb2,0x00,0x01,0x02,0x8e,0x06,0x92,0x00,0x01,0x00,0xf7,0xff,0xf1,0x00,0x01,0x04,0x64,0x05,0x4c,0x00,0x01,0x02,0x5a,0xff,0xe7,0x00,0x01,0x02,0x74,0x06,0x3a,0x00,0x01,0x04,0x98,0x05,0x4a,0x00,0x01,0x02,0x74,0xff,0xf1,0x00,0x01,\r\n0x02,0x49,0x06,0x3a,0x00,0x01,0x04,0x93,0x05,0x9a,0x00,0x01,0x02,0x49,0xff,0xe7,0x00,0x01,0x04,0xb4,0x05,0xec,0x00,0x01,0x02,0x4f,0x06,0x52,0x00,0x01,0x04,0x4e,0x05,0x12,0x00,0x01,0x02,0x4f,0xff,0xe7,0x00,0x01,0x02,0x12,0x06,0x52,0x00,0x01,0x04,0xa6,0x05,0x62,0x00,0x01,0x02,0x12,0xff,0xe7,0x00,0x01,0x02,0xfa,0x06,0xd6,\r\n0x00,0x01,0x05,0x96,0x06,0x83,0x00,0x01,0x02,0xfa,0xff,0xe7,0x00,0x01,0x02,0x3c,0x05,0x46,0x00,0x01,0x04,0x5a,0x05,0x25,0x00,0x01,0x02,0xce,0x06,0x3a,0x00,0x01,0x05,0x4c,0x05,0x4a,0x00,0x01,0x03,0x2a,0x06,0x3a,0x00,0x01,0x05,0x9e,0x05,0x4a,0x00,0x01,0x03,0x2a,0xff,0xf1,0x00,0x01,0x02,0x4a,0x06,0x3a,0x00,0x01,0x04,0x44,\r\n0x05,0xea,0x00,0x01,0x02,0x4a,0xff,0xe7,0x00,0x01,0x04,0xb4,0x06,0x3c,0x00,0x01,0x02,0x5e,0x04,0xb8,0x00,0x01,0x04,0x6c,0x03,0xc8,0x00,0x01,0x02,0x5e,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x06,0x3a,0x00,0x01,0x03,0xbe,0x05,0xea,0x00,0x01,0x02,0x58,0x06,0x52,0x00,0x01,0x04,0x04,0x05,0xb2,0x00,0x01,0x02,0x44,0x06,0x3a,0x00,0x01,\r\n0x03,0xe8,0x05,0xea,0x00,0x01,0x01,0x2c,0xfe,0x84,0x00,0x01,0x03,0x20,0x06,0xd6,0x00,0x01,0x05,0xd9,0x06,0x83,0x00,0x01,0x02,0x7c,0x06,0x3a,0x00,0x01,0x05,0x48,0x05,0xea,0x00,0x01,0x02,0x7c,0xfe,0x2a,0x00,0x01,0x03,0x7f,0x06,0x8c,0x00,0x01,0x06,0xae,0x05,0x4c,0x00,0x01,0x03,0x7f,0xff,0xe7,0x00,0x01,0x01,0x36,0x06,0x72,\r\n0x00,0x01,0x01,0xfe,0x05,0xea,0x00,0x01,0x01,0x1d,0x06,0x3a,0x00,0x01,0x02,0x3a,0x05,0xea,0x00,0x01,0x02,0x52,0x06,0x52,0x00,0x01,0x04,0xf4,0x06,0x02,0x00,0x01,0x02,0x52,0xff,0xf1,0x00,0x01,0x01,0xfe,0x06,0xa2,0x00,0x01,0x03,0xfc,0x06,0xa2,0x00,0x01,0x01,0xfe,0xff,0xf1,0x00,0x01,0x00,0xf8,0x06,0x8c,0x00,0x01,0x01,0xa0,\r\n0x06,0x3c,0x00,0x01,0x00,0xf8,0xff,0xf1,0x00,0x01,0x01,0xfe,0x06,0x8e,0x00,0x01,0x03,0xac,0x05,0x4e,0x00,0x01,0x03,0x91,0x06,0x3a,0x00,0x01,0x06,0xd3,0x05,0xea,0x00,0x01,0x03,0x91,0xff,0xe7,0x00,0x01,0x02,0xfe,0x06,0x3a,0x00,0x01,0x05,0xac,0x05,0xea,0x00,0x01,0x03,0x97,0xff,0xf1,0x00,0x01,0x02,0x4d,0x04,0xb8,0x00,0x01,\r\n0x04,0x4a,0x04,0x18,0x00,0x01,0x02,0x4d,0xfe,0x70,0x00,0x01,0x03,0x04,0x06,0x52,0x00,0x01,0x05,0xb8,0x05,0x62,0x00,0x01,0x03,0x04,0xff,0xe7,0x00,0x01,0x03,0xe0,0x06,0x52,0x00,0x01,0x07,0x48,0x06,0x02,0x00,0x01,0x03,0xe0,0xff,0xe7,0x00,0x01,0x03,0x29,0x04,0xb8,0x00,0x01,0x06,0x02,0x04,0x68,0x00,0x01,0x03,0x29,0xff,0xe7,\r\n0x00,0x01,0x02,0x67,0x06,0x3a,0x00,0x01,0x04,0x7f,0x05,0x9a,0x00,0x01,0x02,0x67,0xff,0xf1,0x00,0x01,0x02,0x5a,0x06,0xa2,0x00,0x01,0x04,0x64,0x05,0x62,0x00,0x01,0x02,0x4e,0x06,0x3a,0x00,0x01,0x04,0x4c,0x04,0xfa,0x00,0x01,0x02,0x4e,0xff,0x51,0x00,0x01,0x02,0x10,0x06,0x3a,0x00,0x01,0x03,0xd1,0x05,0xea,0x00,0x01,0x02,0x10,\r\n0xff,0xf1,0x00,0x01,0x00,0xaa,0x06,0xa2,0x00,0x01,0x02,0x0e,0x05,0xb2,0x00,0x01,0x01,0x6b,0xfe,0x2a,0x00,0x01,0x01,0x5c,0x05,0xcf,0x00,0x01,0x02,0xb8,0x05,0x2f,0x00,0x01,0x01,0x5c,0xfe,0x84,0x00,0x01,0x02,0x19,0x06,0x3a,0x00,0x01,0x04,0x33,0x05,0xea,0x00,0x01,0x02,0x19,0xff,0xf1,0x00,0x01,0x01,0x5c,0x06,0xa2,0x00,0x01,\r\n0x03,0x08,0x06,0x52,0x00,0x01,0x01,0x5c,0xff,0xe7,0x00,0x01,0x02,0x19,0xfe,0x84,0x00,0x01,0x03,0x05,0x06,0x3a,0x00,0x01,0x06,0x0a,0x05,0xea,0x00,0x01,0x03,0x05,0xff,0xe7,0x00,0x01,0x02,0xd9,0x06,0x52,0x00,0x01,0x05,0x12,0x06,0x02,0x00,0x01,0x02,0xd9,0xff,0xe7,0x00,0x01,0x02,0x81,0x06,0x52,0x00,0x01,0x04,0xde,0x06,0x02,\r\n0x00,0x01,0x02,0x81,0xff,0xf1,0x00,0x01,0x02,0x7b,0x05,0x14,0x00,0x01,0x04,0xc3,0x04,0x18,0x00,0x01,0x02,0x7b,0xfe,0x2a,0x00,0x01,0x02,0xee,0xfe,0x2a,0x00,0x01,0x02,0x28,0x06,0x3a,0x00,0x01,0x03,0xb0,0x06,0x3a,0x00,0x01,0x02,0x28,0xff,0xe7,0x00,0x01,0x01,0x85,0x04,0xa0,0x00,0x01,0x02,0xba,0x04,0xa0,0x00,0x01,0x01,0x85,\r\n0xff,0xe7,0x00,0x01,0x02,0x2f,0x04,0xb8,0x00,0x01,0x04,0x5e,0x04,0x18,0x00,0x01,0x01,0x4b,0xfe,0x2a,0x00,0x01,0x07,0xbc,0x07,0xb0,0x00,0x01,0x09,0xe8,0x06,0xa4,0x00,0x01,0x07,0xbc,0xff,0xf1,0x00,0x01,0x07,0x6c,0x06,0x54,0x00,0x01,0x09,0x1c,0x05,0x50,0x00,0x01,0x07,0x6c,0xff,0xf1,0x00,0x01,0x06,0x86,0x06,0x54,0x00,0x01,\r\n0x08,0x33,0x05,0x50,0x00,0x01,0x06,0x86,0xff,0xf1,0x00,0x01,0x05,0xd2,0x06,0x3a,0x00,0x01,0x06,0x89,0x05,0xdc,0x00,0x01,0x05,0x7b,0xff,0xe7,0x00,0x01,0x04,0xc4,0x06,0x79,0x00,0x01,0x05,0x72,0x06,0x0e,0x00,0x01,0x04,0x6e,0xfe,0x2a,0x00,0x01,0x03,0x0c,0x06,0x8c,0x00,0x01,0x03,0xb1,0x06,0x0e,0x00,0x01,0x02,0xa8,0xfe,0x2a,\r\n0x00,0x01,0x07,0x8f,0x06,0x3a,0x00,0x01,0x08,0x44,0x05,0xdc,0x00,0x01,0x07,0x40,0xff,0xe7,0x00,0x01,0x06,0xc2,0x06,0x79,0x00,0x01,0x07,0x6e,0x06,0x0e,0x00,0x01,0x06,0x72,0xfe,0x2a,0x00,0x01,0x05,0x78,0x06,0x79,0x00,0x01,0x06,0x27,0x06,0x0e,0x00,0x01,0x05,0x23,0xfe,0x2a,0x00,0x01,0x01,0xfe,0x06,0x54,0x00,0x01,0x01,0xfe,\r\n0xff,0xe7,0x00,0x01,0x02,0x44,0x05,0x82,0x00,0x01,0x02,0xc6,0x07,0xb0,0x00,0x01,0x02,0xc6,0xff,0xe7,0x00,0x01,0x04,0x92,0x07,0x30,0x00,0x01,0x06,0x92,0x06,0x7c,0x00,0x01,0x04,0x92,0xff,0xf1,0x00,0x01,0x03,0x50,0x06,0x04,0x00,0x01,0x06,0x50,0x05,0x50,0x00,0x01,0x03,0x50,0xff,0xe7,0x00,0x01,0x02,0xda,0x07,0xb0,0x00,0x01,\r\n0x02,0xda,0xff,0xe7,0x00,0x01,0x01,0xfe,0x07,0xb2,0x00,0x01,0x03,0x02,0xfe,0x70,0x00,0x01,0x02,0x58,0xfe,0x70,0x00,0x01,0x02,0x08,0x07,0xb0,0x00,0x01,0x01,0x7c,0x06,0x54,0x00,0x01,0x01,0x7c,0xfe,0x2a,0x00,0x01,0x02,0x94,0x06,0x0e,0x00,0x01,0x07,0xda,0x06,0xe0,0x00,0x01,0x09,0xe8,0x05,0xdc,0x00,0x01,0x07,0xda,0xff,0xf1,\r\n0x00,0x01,0x07,0x6c,0x05,0xb4,0x00,0x01,0x09,0x1c,0x04,0xb0,0x00,0x01,0x06,0x86,0x05,0xb4,0x00,0x01,0x08,0x33,0x04,0xb0,0x00,0x01,0x07,0xae,0x05,0xdc,0x00,0x01,0x02,0xc1,0x06,0x52,0x00,0x01,0x05,0x83,0x05,0xb2,0x00,0x01,0x01,0x62,0xfe,0x2a,0x00,0x01,0x04,0x83,0x06,0xa4,0x00,0x01,0x04,0x4c,0x06,0xa4,0x00,0x01,0x02,0x30,\r\n0x06,0xa4,0x00,0x01,0x01,0xf4,0x05,0x50,0x00,0x01,0x01,0xb8,0x06,0x54,0x00,0x01,0x01,0xb8,0x06,0x52,0x00,0x01,0x03,0xb8,0x05,0x62,0x00,0x01,0x01,0xb8,0xfe,0x2a,0x00,0x01,0x01,0x90,0x04,0xb8,0x00,0x01,0x03,0x20,0x03,0xc8,0x00,0x01,0x01,0x90,0xfe,0x2a,0x00,0x01,0x04,0x1a,0x06,0xa4,0x00,0x01,0x02,0xef,0x06,0x52,0x00,0x01,\r\n0x05,0x3f,0x05,0xb2,0x00,0x01,0x02,0xef,0xfe,0x2a,0x00,0x01,0x02,0x5c,0x06,0x3a,0x00,0x01,0x04,0x68,0x05,0x9a,0x00,0x01,0x02,0x5c,0xff,0xe7,0x00,0x01,0x02,0x44,0x06,0x8c,0x00,0x01,0x04,0x39,0x05,0xec,0x00,0x01,0x02,0x48,0xff,0x24,0x00,0x01,0x01,0xcf,0xff,0x24,0x00,0x01,0x02,0x05,0x04,0xb8,0x00,0x01,0x03,0xba,0x03,0xc8,\r\n0x00,0x01,0x02,0x05,0xff,0xe7,0x00,0x01,0x02,0x79,0x04,0xb8,0x00,0x01,0x04,0xa2,0x04,0x68,0x00,0x01,0x02,0x79,0xff,0xe7,0x00,0x01,0x04,0xa2,0x04,0x18,0x00,0x01,0x02,0x5b,0x06,0xa2,0x00,0x01,0x04,0x66,0x05,0xaa,0x00,0x01,0x02,0x5b,0xff,0xe7,0x00,0x01,0x01,0xab,0x04,0xb8,0x00,0x01,0x03,0x6a,0x03,0xc8,0x00,0x01,0x01,0xab,\r\n0xff,0xe7,0x00,0x01,0x02,0x08,0x04,0xb8,0x00,0x01,0x02,0x08,0xff,0x51,0x00,0x01,0x02,0x5b,0x06,0x8c,0x00,0x01,0x04,0x66,0x05,0xec,0x00,0x01,0x02,0x5b,0xfe,0x2a,0x00,0x01,0x05,0x56,0x06,0x52,0x00,0x01,0x02,0x17,0x04,0xb8,0x00,0x01,0x02,0x17,0xff,0xe7,0x00,0x01,0x01,0xf5,0x04,0xb8,0x00,0x01,0x04,0x96,0x03,0xc8,0x00,0x01,\r\n0x01,0xf5,0xff,0xe7,0x00,0x01,0x01,0xbb,0x04,0xb8,0x00,0x01,0x02,0xfe,0x03,0xc8,0x00,0x01,0x01,0xbb,0xff,0xe7,0x00,0x01,0x01,0x93,0x04,0xb8,0x00,0x01,0x01,0x93,0xff,0xe7,0x00,0x01,0x03,0xa0,0x03,0xc8,0x00,0x01,0x02,0x34,0x04,0xb8,0x00,0x01,0x04,0x18,0x03,0xc8,0x00,0x01,0x02,0x34,0xff,0xe7,0x00,0x01,0x01,0x1c,0x04,0xa0,\r\n0x00,0x01,0x02,0x38,0x04,0x50,0x00,0x01,0x01,0x1c,0xfe,0x2a,0x00,0x01,0x02,0x5b,0x06,0x72,0x00,0x01,0x02,0x1e,0x04,0xb8,0x00,0x01,0x03,0xec,0x04,0x18,0x00,0x01,0x02,0x1e,0xff,0xe7,0x00,0x01,0x01,0xea,0x04,0xa0,0x00,0x01,0x03,0xd5,0x04,0x50,0x00,0x01,0x01,0xea,0xfe,0x2a,0x00,0x01,0x01,0xd4,0x04,0xb8,0x00,0x01,0x03,0xa8,\r\n0x04,0x68,0x00,0x01,0x01,0xd4,0xff,0xe7,0x00,0x01,0x02,0x43,0x04,0xe2,0x00,0x01,0x04,0x37,0x04,0x50,0x00,0x01,0x02,0x43,0xfe,0x2a,0x00,0x01,0x02,0x43,0x06,0xa2,0x00,0x01,0x04,0x1a,0x05,0x78,0x00,0x01,0x01,0x0c,0x06,0x29,0x00,0x01,0x01,0xc8,0x05,0x89,0x00,0x01,0x01,0x0c,0xff,0xf1,0x00,0x01,0x00,0xe1,0x04,0xa0,0x00,0x01,\r\n0x01,0xea,0x04,0x50,0x00,0x01,0x01,0x40,0x04,0xa0,0x00,0x01,0x02,0x90,0x04,0x50,0x00,0x01,0x01,0x40,0xff,0xf1,0x00,0x01,0x01,0x18,0x06,0x8c,0x00,0x01,0x02,0x3e,0x05,0x9c,0x00,0x01,0x01,0x18,0xff,0xf1,0x00,0x01,0x01,0x9a,0x06,0x8c,0x00,0x01,0x03,0x02,0x05,0x9c,0x00,0x01,0x01,0x9a,0xff,0xf1,0x00,0x01,0x00,0xf7,0x06,0x8c,\r\n0x00,0x01,0x01,0xee,0x05,0x9c,0x00,0x01,0x01,0x3f,0xfe,0x2a,0x00,0x01,0x02,0xf8,0x06,0x72,0x00,0x01,0x04,0xd3,0x04,0xb0,0x00,0x01,0x02,0xf8,0xfe,0x2a,0x00,0x01,0x03,0x7a,0x04,0xa0,0x00,0x01,0x06,0x94,0x04,0x50,0x00,0x01,0x03,0x7a,0xfe,0x2a,0x00,0x01,0x02,0x11,0xff,0xf1,0x00,0x01,0x02,0x58,0x04,0xa0,0x00,0x01,0x04,0x60,\r\n0x04,0x50,0x00,0x01,0x02,0x58,0x04,0xb8,0x00,0x01,0x04,0x60,0x03,0xc8,0x00,0x01,0x03,0x6b,0x04,0xb6,0x00,0x01,0x05,0x96,0x04,0x66,0x00,0x01,0x03,0x6b,0xff,0xe7,0x00,0x01,0x02,0xdf,0x04,0xb8,0x00,0x01,0x05,0x74,0x03,0xc8,0x00,0x01,0x02,0xdf,0xff,0xe7,0x00,0x01,0x02,0x8d,0x06,0x8c,0x00,0x01,0x04,0xca,0x05,0x4c,0x00,0x01,\r\n0x02,0x8d,0xfe,0x2a,0x00,0x01,0x01,0xd1,0x04,0xa0,0x00,0x01,0x02,0x78,0x04,0x50,0x00,0x01,0x01,0x64,0xff,0xe7,0x00,0x01,0x01,0xd1,0x06,0x8c,0x00,0x01,0x02,0x78,0x06,0x3c,0x00,0x01,0x01,0x64,0xfe,0x2a,0x00,0x01,0x01,0xcc,0x04,0xb2,0x00,0x01,0x01,0x86,0x04,0xb8,0x00,0x01,0x02,0xfe,0x04,0x68,0x00,0x01,0x00,0xe1,0xff,0xf1,\r\n0x00,0x01,0x01,0x18,0x04,0xb8,0x00,0x01,0x02,0x5e,0x04,0x18,0x00,0x01,0x01,0xcc,0xff,0xf1,0x00,0x01,0x01,0xef,0x04,0xa0,0x00,0x01,0x03,0xa2,0x04,0x00,0x00,0x01,0x01,0xef,0xff,0xf1,0x00,0x01,0x03,0xa2,0x04,0x50,0x00,0x01,0x01,0xae,0xfe,0xa2,0x00,0x01,0x01,0x4a,0x06,0xa2,0x00,0x01,0x02,0x9a,0x06,0x52,0x00,0x01,0x00,0xb4,\r\n0xfe,0x2a,0x00,0x01,0x01,0x5e,0x06,0xa2,0x00,0x01,0x02,0xb0,0x06,0x52,0x00,0x01,0x00,0xc8,0xfe,0x2a,0x00,0x01,0x00,0xb4,0x06,0xa2,0x00,0x01,0x01,0xfe,0x05,0xb2,0x00,0x01,0x01,0x4a,0xff,0xe7,0x00,0x01,0x01,0x68,0x06,0xa2,0x00,0x01,0x02,0xe4,0x06,0x52,0x00,0x01,0x00,0xdc,0xfe,0x2a,0x00,0x01,0x01,0x2c,0x04,0xb6,0x00,0x01,\r\n0x02,0x68,0x03,0xc6,0x00,0x01,0x01,0x90,0xfe,0xd4,0x00,0x01,0x01,0x80,0xfe,0x2a,0x00,0x01,0x02,0x65,0x04,0xa0,0x00,0x01,0x04,0x7b,0x04,0x50,0x00,0x01,0x02,0x65,0xff,0xe7,0x00,0x01,0x02,0x61,0x04,0xa0,0x00,0x01,0x04,0xc2,0x04,0x50,0x00,0x01,0x02,0x61,0xff,0xe7,0x00,0x01,0x02,0x3b,0x04,0xb8,0x00,0x01,0x04,0x27,0x04,0x68,\r\n0x00,0x01,0x02,0x3b,0xff,0xe7,0x00,0x01,0x01,0xf4,0x04,0xa0,0x00,0x01,0x03,0x35,0x04,0x50,0x00,0x01,0x02,0xe4,0x04,0xa0,0x00,0x01,0x05,0x28,0x04,0x50,0x00,0x01,0x02,0xe4,0xff,0xf1,0x00,0x01,0x01,0xef,0x06,0x8c,0x00,0x01,0x03,0xdf,0x05,0x9c,0x00,0x01,0x01,0xab,0x04,0xa0,0x00,0x01,0x03,0x56,0x04,0x50,0x00,0x01,0x01,0xab,\r\n0xff,0xf1,0x00,0x01,0x01,0xc2,0xfe,0xd4,0x00,0x01,0x02,0x0c,0xff,0x51,0x00,0x01,0x01,0x90,0x05,0x14,0x00,0x01,0x01,0x76,0x06,0xa2,0x00,0x01,0x03,0x3c,0x05,0xb2,0x00,0x01,0x01,0x2c,0xff,0xf1,0x00,0x01,0x02,0xec,0x05,0xb2,0x00,0x01,0x01,0xa4,0xff,0xf1,0x00,0x01,0x02,0x9c,0x05,0x4c,0x00,0x01,0x01,0x58,0xff,0xe7,0x00,0x01,\r\n0x02,0x3a,0x04,0xb8,0x00,0x01,0x03,0xba,0x04,0x68,0x00,0x01,0x02,0x71,0x06,0xa4,0x00,0x01,0x04,0x74,0x05,0xdc,0x00,0x01,0x02,0x71,0xff,0xe7,0x00,0x01,0x03,0x8f,0x04,0x00,0x00,0x01,0x02,0x31,0x04,0xb8,0x00,0x01,0x04,0x12,0x03,0xc8,0x00,0x01,0x02,0x31,0xff,0xe7,0x00,0x01,0x02,0x8a,0x05,0x46,0x00,0x01,0x04,0xdc,0x04,0xe2,\r\n0x00,0x01,0x02,0x8a,0xff,0xe7,0x00,0x01,0x02,0x43,0x04,0xa0,0x00,0x01,0x01,0x04,0x06,0x79,0x00,0x01,0x01,0x9e,0x05,0x89,0x00,0x01,0x00,0x62,0xfe,0x2a,0x00,0x01,0x01,0xfe,0x04,0xa0,0x00,0x01,0x03,0xac,0x04,0x50,0x00,0x01,0x01,0xfe,0xfe,0x2a,0x00,0x01,0x01,0xe0,0x04,0xa0,0x00,0x01,0x03,0x14,0x03,0xb0,0x00,0x01,0x05,0x56,\r\n0x06,0x02,0x00,0x01,0x05,0xaa,0x06,0x72,0x00,0x01,0x07,0x54,0x04,0xb0,0x00,0x01,0x05,0xaa,0xff,0xf1,0x00,0x01,0x07,0x98,0x04,0xb0,0x00,0x01,0x05,0xaa,0xfe,0x2a,0x00,0x01,0x07,0x7f,0x04,0xb0,0x00,0x01,0x05,0xaa,0xff,0x51,0x00,0x01,0x03,0x6f,0x05,0x78,0x00,0x01,0x04,0x98,0x04,0xb0,0x00,0x01,0x03,0x6f,0xff,0xf1,0x00,0x01,\r\n0x02,0xaa,0x06,0x52,0x00,0x01,0x04,0x6f,0x06,0x52,0x00,0x01,0x02,0xaa,0xfe,0x2a,0x00,0x01,0x04,0x05,0x05,0x78,0x00,0x01,0x05,0x6e,0x04,0x8f,0x00,0x01,0x04,0x05,0xff,0xe7,0x00,0x01,0x04,0x70,0x06,0x72,0x00,0x01,0x04,0x70,0xfe,0x2a,0x00,0x01,0x03,0x3f,0x06,0x72,0x00,0x01,0x04,0x54,0x04,0xb0,0x00,0x01,0x03,0x3f,0xff,0xe7,\r\n0x00,0x01,0x02,0xee,0x06,0x72,0x00,0x01,0x04,0x8e,0x04,0xb0,0x00,0x01,0x02,0xee,0xff,0xf1,0x00,0x01,0x02,0x08,0x06,0x3a,0x00,0x01,0x04,0x44,0x05,0x9a,0x00,0x01,0x01,0xfa,0xff,0xf1,0x00,0x01,0x01,0xfa,0x06,0x3a,0x00,0x01,0x00,0xf0,0x05,0x14,0x00,0x01,0x01,0xa4,0x04,0xb0,0x00,0x01,0x01,0x09,0x05,0x14,0x00,0x01,0x02,0x1c,\r\n0x06,0x8c,0x00,0x01,0x04,0x87,0x06,0x8c,0x00,0x01,0x02,0x1c,0xfe,0x2a,0x00,0x01,0x00,0xfa,0x06,0x8c,0x00,0x01,0x01,0x96,0x06,0x8c,0x00,0x01,0x02,0x4e,0x04,0xb8,0x00,0x01,0x03,0xec,0x04,0xb8,0x00,0x01,0x01,0x2c,0x05,0xcf,0x00,0x01,0x01,0xe5,0x05,0x7f,0x00,0x01,0x01,0x2c,0xfe,0x2a,0x00,0x01,0x04,0x6c,0x04,0x68,0x00,0x01,\r\n0x03,0xbd,0x06,0x72,0x00,0x01,0x06,0xba,0x05,0x78,0x00,0x01,0x03,0xbd,0xff,0xe7,0x00,0x01,0x03,0xbd,0x05,0x14,0x00,0x01,0x06,0xba,0x04,0xb0,0x00,0x01,0x03,0xbd,0xfe,0x2a,0x00,0x01,0x02,0x8c,0x06,0x90,0x00,0x01,0x03,0x93,0x06,0x7c,0x00,0x01,0x02,0x9e,0xff,0xa1,0x00,0x01,0x02,0xee,0x06,0x90,0x00,0x01,0x04,0x7c,0x06,0x2c,\r\n0x00,0x01,0x02,0xee,0xff,0x97,0x00,0x01,0x02,0x26,0x05,0xb4,0x00,0x01,0x04,0x52,0x04,0xd1,0x00,0x01,0x02,0x3a,0xff,0x97,0x00,0x01,0x02,0x26,0x06,0x90,0x00,0x01,0x04,0x9c,0x06,0x2c,0x00,0x01,0x02,0x26,0xff,0xa1,0x00,0x01,0x01,0xae,0xfe,0x8e,0x00,0x01,0x01,0xc2,0xfe,0x8e,0x00,0x01,0x02,0x0b,0x06,0x7a,0x00,0x01,0x03,0xc6,\r\n0x06,0x02,0x00,0x01,0x01,0x9b,0x05,0x14,0x00,0x01,0x02,0xd6,0x04,0xb0,0x00,0x01,0x00,0xe6,0xff,0xf1,0x00,0x01,0x02,0x5b,0x04,0xb8,0x00,0x01,0x04,0xb6,0x04,0x18,0x00,0x01,0x01,0xd8,0x06,0x3a,0x00,0x01,0x03,0xb1,0x05,0x9a,0x00,0x01,0x01,0xd8,0xff,0xf1,0x00,0x01,0x02,0x4f,0x04,0xa0,0x00,0x01,0x04,0x9f,0x04,0x50,0x00,0x01,\r\n0x02,0x4f,0xfe,0x2a,0x00,0x01,0x05,0x11,0x06,0xc2,0x00,0x01,0x06,0x83,0x05,0x78,0x00,0x01,0x05,0x11,0xff,0xf1,0x00,0x01,0x01,0x48,0x04,0xa0,0x00,0x01,0x01,0x48,0xff,0xf1,0x00,0x01,0x01,0xa4,0x04,0xa0,0x00,0x01,0x02,0x23,0x04,0xa0,0x00,0x01,0x03,0xf6,0x04,0x50,0x00,0x01,0x02,0x23,0xff,0xe7,0x00,0x01,0x02,0x6c,0xfe,0xa2,\r\n0x00,0x01,0x02,0x1c,0xfe,0xa2,0x00,0x01,0x01,0x36,0xfe,0xa2,0x00,0x01,0x02,0x4e,0xfe,0xa2,0x00,0x01,0x03,0x7a,0xfe,0xa2,0x00,0x01,0x01,0xf4,0xfe,0xa2,0x00,0x01,0x01,0xd6,0xfe,0xa2,0x00,0x01,0x01,0xc2,0xfe,0xa2,0x00,0x01,0x01,0xbb,0xfe,0xa2,0x00,0x01,0x01,0x93,0xfe,0xa2,0x00,0x01,0x01,0xdd,0x05,0x14,0x00,0x01,0x01,0xdd,\r\n0xfe,0xa2,0x00,0x01,0x01,0xc4,0x04,0xa0,0x00,0x01,0x03,0x89,0x04,0x50,0x00,0x01,0x01,0xc4,0xfe,0x2a,0x00,0x01,0x02,0x60,0x04,0xee,0x00,0x01,0x04,0x71,0x04,0x4e,0x00,0x01,0x02,0x60,0xff,0xe7,0x00,0x01,0x01,0x7a,0x05,0xd0,0x00,0x01,0x02,0xa4,0x05,0x30,0x00,0x01,0x02,0x58,0xff,0x6a,0x00,0x01,0x02,0x3a,0x05,0x8d,0x00,0x01,\r\n0x04,0x2f,0x05,0x00,0x00,0x01,0x03,0x00,0x06,0x52,0x00,0x01,0x05,0x4d,0x06,0x02,0x00,0x01,0x03,0x00,0xff,0x06,0x00,0x01,0x02,0x5b,0x05,0x14,0x00,0x01,0x04,0x34,0x04,0x68,0x00,0x01,0x02,0x5b,0xff,0x06,0x00,0x01,0x01,0xce,0x04,0xa1,0x00,0x01,0x03,0x20,0x04,0xa1,0x00,0x01,0x01,0xce,0xff,0xf1,0x00,0x01,0x01,0x22,0x06,0x72,\r\n0x00,0x01,0x01,0x22,0xff,0xf1,0x00,0x01,0x02,0x9e,0xfe,0x8e,0x00,0x01,0x02,0x08,0x05,0x8d,0x00,0x01,0x03,0x9a,0x05,0x00,0x00,0x01,0x01,0x2c,0x05,0xea,0x00,0x01,0x02,0x66,0x05,0xc8,0x00,0x01,0x01,0x80,0xff,0x06,0x00,0x01,0x04,0x4c,0x04,0xb0,0x00,0x01,0x02,0xcc,0x04,0xb8,0x00,0x01,0x04,0xb0,0x04,0xb0,0x00,0x01,0x02,0xcc,\r\n0xff,0xe7,0x00,0x01,0x01,0x18,0x04,0xba,0x00,0x01,0x01,0x04,0x04,0xba,0x00,0x01,0x00,0x00,0x04,0xba,0x00,0x01,0xff,0xf6,0x04,0xb0,0x00,0x01,0x02,0x26,0x07,0x33,0x00,0x01,0x02,0x58,0x07,0x62,0x00,0x01,0x02,0x76,0x07,0xa8,0x00,0x01,0x02,0x94,0x06,0x3a,0x00,0x01,0x02,0x06,0x06,0x3a,0x00,0x01,0x02,0xff,0x06,0x3a,0x00,0x01,\r\n0x02,0xee,0x07,0x4a,0x00,0x01,0x03,0x0c,0x07,0xa8,0x00,0x01,0x03,0x04,0x06,0x6a,0x00,0x01,0x03,0x04,0x06,0x3a,0x00,0x01,0x02,0x40,0x06,0x52,0x00,0x01,0x02,0x40,0x06,0x3a,0x00,0x01,0x03,0x22,0x06,0x3a,0x00,0x01,0x02,0x77,0x06,0x6a,0x00,0x01,0x02,0x58,0x06,0x3a,0x00,0x01,0x04,0x13,0x06,0x6a,0x00,0x01,0x03,0xd4,0x06,0x3a,\r\n0x00,0x01,0x02,0x09,0x04,0xd0,0x00,0x01,0x02,0x08,0x04,0xd0,0x00,0x01,0x02,0x17,0x04,0xd0,0x00,0x01,0x02,0x53,0x04,0xa0,0x00,0x01,0x02,0x53,0x04,0xd0,0x00,0x01,0x02,0x3f,0x05,0xee,0x00,0x01,0x02,0x58,0x06,0x5e,0x00,0x01,0x02,0x58,0x04,0xd0,0x00,0x01,0x01,0xef,0x05,0x4a,0x00,0x01,0x01,0xef,0x04,0xd0,0x00,0x01,0x02,0xd6,\r\n0x04,0xa0,0x00,0x01,0x02,0xd0,0x04,0xd0,0x00,0x01,0x01,0xd9,0x04,0xd0,0x00,0x01,0x03,0x40,0x04,0xd0,0x00,0x01,0x03,0x20,0x04,0xd0,0x00,0x01,0x02,0x03,0x04,0xa0,0x00,0x01,0x02,0x03,0x04,0xd0,0x00,0x01,0x02,0x17,0x05,0x9f,0x00,0x01,0x02,0x17,0x06,0x2c,0x00,0x01,0x01,0xdc,0x06,0x19,0x00,0x01,0x01,0xf4,0x06,0x5e,0x00,0x01,\r\n0x02,0xe2,0x06,0x6a,0x00,0x01,0x02,0xe2,0x06,0x3a,0x00,0x01,0x00,0xc8,0x02,0xf8,0x00,0x01,0x03,0x0c,0x05,0x9a,0x00,0x01,0x03,0xc0,0x05,0x22,0x00,0x01,0x04,0x8e,0x05,0x82,0x00,0x01,0x04,0xaf,0x05,0x07,0x00,0x01,0x03,0x94,0x05,0x9a,0x00,0x01,0x03,0x9d,0x05,0x9a,0x00,0x01,0x04,0xcf,0x05,0x40,0x00,0x01,0x04,0xf7,0x05,0x9a,\r\n0x00,0x01,0x01,0xe0,0x05,0x9a,0x00,0x01,0x02,0x2d,0x05,0xa0,0x00,0x01,0x04,0x2c,0x05,0x9a,0x00,0x01,0x01,0x6a,0x05,0x9a,0x00,0x01,0x06,0x6d,0x05,0x9a,0x00,0x01,0x05,0x45,0x05,0x9a,0x00,0x01,0x05,0x51,0x04,0x94,0x00,0x01,0x04,0x03,0x05,0x22,0x00,0x01,0x03,0xf7,0x05,0x22,0x00,0x01,0x03,0xad,0x05,0x82,0x00,0x01,0x04,0x01,\r\n0x05,0x9a,0x00,0x01,0x04,0xd1,0x05,0xa0,0x00,0x01,0x04,0xd1,0x05,0x9a,0x00,0x01,0x07,0x47,0x05,0x9a,0x00,0x01,0x04,0x38,0x05,0x9a,0x00,0x01,0x04,0x4c,0x05,0x9a,0x00,0x01,0x03,0x70,0x03,0x8e,0x00,0x01,0x04,0x0f,0x03,0x92,0x00,0x01,0x03,0x5d,0x03,0xdf,0x00,0x01,0x04,0x08,0x05,0xe9,0x00,0x01,0x03,0x98,0x03,0x8e,0x00,0x01,\r\n0x02,0xa2,0x05,0xf0,0x00,0x01,0x04,0x08,0x03,0xff,0x00,0x01,0x03,0xe2,0x03,0x35,0x00,0x01,0x01,0x4a,0x03,0xfc,0x00,0x01,0x01,0x4b,0x03,0xf8,0x00,0x01,0x03,0x82,0x04,0x02,0x00,0x01,0x01,0x40,0x05,0xe9,0x00,0x01,0x06,0x40,0x03,0xa0,0x00,0x01,0x03,0xd4,0x03,0xa0,0x00,0x01,0x03,0xfc,0x03,0x8e,0x00,0x01,0x03,0xfc,0x03,0xaf,\r\n0x00,0x01,0x04,0x08,0x04,0x03,0x00,0x01,0x02,0xb3,0x04,0x06,0x00,0x01,0x02,0xe4,0x03,0xfc,0x00,0x01,0x02,0x74,0x03,0xfe,0x00,0x01,0x03,0xde,0x03,0xfc,0x00,0x01,0x03,0xc1,0x04,0x00,0x00,0x01,0x05,0xa0,0x04,0x00,0x00,0x01,0x03,0x66,0x04,0x00,0x00,0x01,0x03,0xc0,0x03,0xfc,0x00,0x01,0x03,0x52,0x04,0x00,0x00,0x01,0x06,0x30,\r\n0x03,0x8e,0x00,0x01,0x04,0x3e,0x03,0x07,0x00,0x01,0x06,0xf4,0x03,0x8e,0x00,0x01,0x01,0x40,0x04,0x06,0x00,0x01,0x03,0x84,0x03,0xb8,0x00,0x01,0x03,0x6e,0x04,0x0c,0x00,0x01,0x04,0x9e,0x04,0x0c,0x00,0x01,0x03,0xd8,0x03,0xf1,0x00,0x01,0x02,0xf1,0x03,0xb8,0x00,0x01,0x03,0x42,0x03,0xe8,0x00,0x01,0x02,0xd6,0x03,0xfc,0x00,0x01,\r\n0x02,0x80,0x03,0xfc,0x00,0x01,0x03,0xde,0x03,0xb8,0x00,0x01,0x03,0x9c,0x04,0x1a,0x00,0x01,0x01,0x61,0x03,0xfc,0x00,0x01,0x02,0x33,0x04,0x00,0x00,0x01,0x05,0x39,0x04,0x08,0x00,0x01,0x04,0x02,0x03,0xfc,0x00,0x01,0x04,0x5c,0x04,0x0f,0x00,0x01,0x02,0x56,0x03,0xfd,0x00,0x01,0x00,0x00,0x02,0x21,0x00,0x01,0x00,0x00,0x02,0x12,\r\n0x00,0x01,0x00,0x00,0x02,0x58,0x00,0x01,0x02,0x94,0x02,0xcd,0x00,0x01,0x02,0x4b,0x02,0xcd,0x00,0x01,0x02,0xde,0x02,0xe5,0x00,0x01,0x02,0xee,0x02,0xcd,0x00,0x01,0x02,0x06,0x02,0xcd,0x00,0x01,0x01,0xf4,0x02,0xcd,0x00,0x01,0x02,0xbe,0x02,0xe5,0x00,0x01,0x02,0xd7,0x02,0xcd,0x00,0x01,0x01,0x10,0x02,0xcd,0x00,0x01,0x01,0xd1,\r\n0x02,0xd9,0x00,0x01,0x00,0xed,0x03,0xeb,0x00,0x01,0x01,0x0e,0x02,0xcd,0x00,0x01,0x03,0xa2,0x03,0x42,0x00,0x01,0x02,0xfe,0x02,0xcd,0x00,0x01,0x03,0x04,0x02,0xe5,0x00,0x01,0x02,0x64,0x03,0xeb,0x00,0x01,0x03,0x04,0x02,0xe2,0x00,0x01,0x02,0x20,0x02,0xe5,0x00,0x01,0x02,0x18,0x02,0xcd,0x00,0x01,0x02,0xbf,0x02,0xd9,0x00,0x01,\r\n0x02,0x7c,0x02,0xcd,0x00,0x01,0x03,0xbc,0x02,0xcd,0x00,0x01,0x02,0x5c,0x02,0xcd,0x00,0x01,0x02,0x36,0x01,0xae,0x00,0x01,0x02,0x48,0x02,0xcd,0x00,0x01,0x02,0x09,0x01,0x41,0x00,0x01,0x02,0x80,0x01,0xce,0x00,0x01,0x02,0x3d,0x02,0x18,0x00,0x01,0x02,0x44,0x02,0x1b,0x00,0x01,0x02,0x35,0x02,0x58,0x00,0x01,0x01,0x40,0x02,0x67,\r\n0x00,0x01,0x02,0x37,0x01,0xfc,0x00,0x01,0x01,0x01,0x04,0x71,0x00,0x01,0x01,0x03,0x02,0x26,0x00,0x01,0x00,0xf8,0x01,0xef,0x00,0x01,0x00,0xfa,0x04,0x25,0x00,0x01,0x00,0xfa,0x02,0xf9,0x00,0x01,0x03,0x72,0x02,0x0c,0x00,0x01,0x02,0x4c,0x02,0x0c,0x00,0x01,0x02,0x53,0x02,0x18,0x00,0x01,0x02,0x7c,0x01,0xef,0x00,0x01,0x02,0x3d,\r\n0x02,0x13,0x00,0x01,0x01,0x01,0x01,0xe5,0x00,0x01,0x01,0xb2,0x02,0x18,0x00,0x01,0x01,0x2c,0x02,0x1b,0x00,0x01,0x02,0x39,0x02,0x0c,0x00,0x01,0x02,0x17,0x02,0x6c,0x00,0x01,0x02,0xe4,0x02,0x00,0x00,0x01,0x01,0xd6,0x02,0x00,0x00,0x01,0x01,0xef,0x02,0x5a,0x00,0x01,0x01,0xcf,0x02,0x00,0x00,0x01,0x02,0x58,0x01,0xd7,0x00,0x01,\r\n0x03,0x04,0x02,0xff,0x00,0x01,0x01,0xb2,0x01,0xd7,0x00,0x01,0x01,0x9d,0x01,0xd0,0x00,0x01,0x02,0x3c,0x01,0xcf,0x00,0x01,0x00,0xe5,0x02,0x0c,0x00,0x01,0x00,0xfd,0x03,0x28,0x00,0x01,0x02,0xf6,0x00,0x6f,0x00,0x01,0x00,0x00,0x05,0xc8,0x00,0x01,0x00,0x00,0x05,0xbe,0x00,0x01,0x00,0x00,0xff,0x6a,0x00,0x01,0x05,0x12,0x07,0x6c,\r\n0x00,0x01,0x05,0x12,0xfe,0x5c,0x00,0x01,0x04,0x2f,0x07,0x6c,0x00,0x01,0x04,0x2f,0xfe,0x5c,0x00,0x01,0x04,0x8c,0x07,0x6c,0x00,0x01,0x04,0x8c,0xfe,0x5c,0x00,0x01,0x05,0x3e,0x07,0x6c,0x00,0x01,0x05,0x3e,0xfe,0x5c,0x00,0x01,0x03,0xb4,0x07,0x6c,0x00,0x01,0x03,0xb4,0xfe,0x5c,0x00,0x01,0x03,0x94,0x07,0x6c,0x00,0x01,0x03,0x94,\r\n0xfe,0x5c,0x00,0x01,0x04,0xec,0x07,0x6c,0x00,0x01,0x04,0xec,0xfe,0x5c,0x00,0x01,0x04,0xf2,0x07,0x6c,0x00,0x01,0x04,0xf2,0xfe,0x5c,0x00,0x01,0x01,0xf0,0x07,0x6c,0x00,0x01,0x01,0xf0,0xfe,0x5c,0x00,0x01,0x02,0x2b,0x07,0x6c,0x00,0x01,0x02,0x2b,0xfe,0x5c,0x00,0x01,0x04,0xa2,0x07,0x6c,0x00,0x01,0x04,0xa2,0xfe,0x5c,0x00,0x01,\r\n0x03,0xa4,0x07,0x6c,0x00,0x01,0x03,0xa4,0xfe,0x5c,0x00,0x01,0x06,0x72,0x07,0x6c,0x00,0x01,0x06,0x72,0xfe,0x5c,0x00,0x01,0x05,0x40,0x07,0x6c,0x00,0x01,0x05,0x40,0xfe,0x5c,0x00,0x01,0x05,0xaa,0x07,0x6c,0x00,0x01,0x05,0xaa,0xfe,0x5c,0x00,0x01,0x04,0x29,0x07,0x6c,0x00,0x01,0x04,0x29,0xfe,0x5c,0x00,0x01,0x05,0xcc,0x07,0x6c,\r\n0x00,0x01,0x05,0xcc,0xfe,0x5c,0x00,0x01,0x04,0xc0,0x07,0x6c,0x00,0x01,0x04,0xc0,0xfe,0x5c,0x00,0x01,0x03,0xde,0x07,0x6c,0x00,0x01,0x03,0xde,0xfe,0x5c,0x00,0x01,0x04,0x0c,0x07,0x6c,0x00,0x01,0x04,0x0c,0xfe,0x5c,0x00,0x01,0x04,0xd5,0x07,0x6c,0x00,0x01,0x04,0xd5,0xfe,0x5c,0x00,0x01,0x04,0xe6,0x07,0x6c,0x00,0x01,0x04,0xe6,\r\n0xfe,0x5c,0x00,0x01,0x07,0x60,0x07,0x6c,0x00,0x01,0x07,0x60,0xfe,0x5c,0x00,0x01,0x04,0x9a,0x07,0x6c,0x00,0x01,0x04,0x9a,0xfe,0x5c,0x00,0x01,0x04,0x60,0x07,0x6c,0x00,0x01,0x04,0x60,0xfe,0x5c,0x00,0x01,0x04,0x64,0x07,0x6c,0x00,0x01,0x04,0x64,0xfe,0x5c,0x00,0x01,0x03,0x83,0x07,0x6c,0x00,0x01,0x03,0x83,0xfe,0x5c,0x00,0x01,\r\n0x04,0x54,0x07,0x6c,0x00,0x01,0x04,0x54,0xfe,0x5c,0x00,0x01,0x03,0x62,0x07,0x6c,0x00,0x01,0x03,0x62,0xfe,0x5c,0x00,0x01,0x04,0x10,0x07,0x6c,0x00,0x01,0x04,0x10,0xfe,0x5c,0x00,0x01,0x03,0xdd,0x07,0x6c,0x00,0x01,0x03,0xdd,0xfe,0x5c,0x00,0x01,0x02,0xa0,0x07,0x6c,0x00,0x01,0x02,0xa0,0xfe,0x5c,0x00,0x01,0x03,0xf8,0x07,0x6c,\r\n0x00,0x01,0x03,0xf8,0xfe,0x5c,0x00,0x01,0x01,0x66,0x07,0x6c,0x00,0x01,0x01,0x66,0xfe,0x5c,0x00,0x01,0x01,0x4a,0x07,0x6c,0x00,0x01,0x01,0x4a,0xfe,0x5c,0x00,0x01,0x06,0x54,0x07,0x6c,0x00,0x01,0x06,0x54,0xfe,0x5c,0x00,0x01,0x04,0x50,0x07,0x6c,0x00,0x01,0x04,0x50,0xfe,0x5c,0x00,0x01,0x02,0xbc,0x07,0x6c,0x00,0x01,0x02,0xbc,\r\n0xfe,0x5c,0x00,0x01,0x03,0x0f,0x07,0x6c,0x00,0x01,0x03,0x0f,0xfe,0x5c,0x00,0x01,0x02,0x81,0x07,0x6c,0x00,0x01,0x02,0x81,0xfe,0x5c,0x00,0x01,0x03,0xe2,0x07,0x6c,0x00,0x01,0x03,0xe2,0xfe,0x5c,0x00,0x01,0x03,0xcb,0x07,0x6c,0x00,0x01,0x03,0xcb,0xfe,0x5c,0x00,0x01,0x05,0xb0,0x07,0x6c,0x00,0x01,0x05,0xb0,0xfe,0x5c,0x00,0x01,\r\n0x03,0x92,0x07,0x6c,0x00,0x01,0x03,0x92,0xfe,0x5c,0x00,0x01,0x03,0xd5,0x07,0x6c,0x00,0x01,0x03,0xd5,0xfe,0x5c,0x00,0x01,0x03,0x70,0x07,0x6c,0x00,0x01,0x03,0x70,0xfe,0x5c,0x00,0x01,0x05,0x12,0x08,0x34,0x00,0x01,0x05,0x40,0x08,0x34,0x00,0x01,0x05,0xaa,0x08,0x34,0x00,0x01,0x04,0xd5,0x08,0x34,0x00,0x01,0x01,0xdd,0x07,0x6c,\r\n0x00,0x01,0x01,0xdd,0xfe,0x5c,0x00,0x01,0x01,0x71,0x07,0x6c,0x00,0x01,0x01,0x71,0xfe,0x5c,0x00,0x01,0x02,0x07,0x07,0x6c,0x00,0x01,0x02,0x07,0xfe,0x5c,0x00,0x01,0x02,0x10,0x07,0x6c,0x00,0x01,0x02,0x10,0xfe,0x5c,0x00,0x01,0x04,0x14,0x07,0x6c,0x00,0x01,0x04,0x14,0xfe,0x5c,0x00,0x01,0x06,0x83,0x07,0x6c,0x00,0x01,0x06,0x83,\r\n0xfe,0x5c,0x00,0x01,0x06,0x56,0x07,0x6c,0x00,0x01,0x06,0x56,0xfe,0x5c,0x00,0x01,0x04,0x96,0x07,0x6c,0x00,0x01,0x04,0x96,0xfe,0x5c,0x00,0x01,0x03,0xb8,0x07,0x6c,0x00,0x01,0x03,0xb8,0xfe,0x5c,0x00,0x01,0x07,0x12,0x07,0x6c,0x00,0x01,0x07,0x12,0xfe,0x5c,0x00,0x01,0x07,0x21,0x07,0x6c,0x00,0x01,0x07,0x21,0xfe,0x5c,0x00,0x01,\r\n0x03,0xb4,0x08,0x34,0x00,0x01,0x01,0xfd,0x08,0x34,0x00,0x01,0x01,0xfd,0xfe,0x5c,0x00,0x01,0x02,0x30,0x08,0x34,0x00,0x01,0x02,0x30,0xfe,0x5c,0x00,0x01,0x02,0x38,0x08,0x34,0x00,0x01,0x02,0x38,0xfe,0x5c,0x00,0x01,0x01,0xf0,0x08,0x34,0x00,0x01,0x02,0x12,0x07,0x6c,0x00,0x01,0x02,0x12,0xfe,0x5c,0x00,0x01,0x03,0xde,0x08,0x34,\r\n0x00,0x01,0x04,0x64,0x08,0x34,0x00,0x01,0x04,0x18,0x07,0x6c,0x00,0x01,0x04,0x18,0xfe,0x5c,0x00,0x01,0x04,0x60,0x08,0x34,0x00,0x01,0x04,0xec,0x08,0x34,0x00,0x01,0x04,0x8c,0x08,0x34,0x00,0x01,0x04,0x98,0x07,0x6c,0x00,0x01,0x04,0x98,0xfe,0x5c,0x00,0x01,0x05,0x3e,0x08,0x34,0x00,0x01,0x05,0xb3,0x07,0x6c,0x00,0x01,0x05,0xb3,\r\n0xfe,0x5c,0x00,0x01,0x03,0xa4,0x08,0x34,0x00,0x01,0x02,0x13,0x07,0x6c,0x00,0x01,0x02,0x13,0xfe,0x5c,0x00,0x01,0x02,0xc3,0x07,0x6c,0x00,0x01,0x02,0xc3,0xfe,0x5c,0x00,0x01,0x02,0x87,0x07,0x6c,0x00,0x01,0x02,0x87,0xfe,0x5c,0x00,0x01,0x04,0xc0,0x08,0x34,0x00,0x01,0x02,0xc9,0x07,0x6c,0x00,0x01,0x02,0xc9,0xfe,0x5c,0x00,0x01,\r\n0x02,0x9a,0x07,0x6c,0x00,0x01,0x02,0x9a,0xfe,0x5c,0x00,0x01,0x04,0x0c,0x08,0x34,0x00,0x01,0x03,0xd3,0x07,0x6c,0x00,0x01,0x03,0xd3,0xfe,0x5c,0x00,0x01,0x04,0x4e,0x07,0x6c,0x00,0x01,0x04,0x4e,0xfe,0x5c,0x00,0x01,0x03,0x6c,0x07,0x6c,0x00,0x01,0x03,0x6c,0xfe,0x5c,0x00,0x01,0x04,0x4a,0x07,0x6c,0x00,0x01,0x04,0x4a,0xfe,0x5c,\r\n0x00,0x01,0x04,0xf2,0x08,0x34,0x00,0x01,0x03,0xf8,0x08,0x34,0x00,0x01,0x05,0x92,0x07,0x6c,0x00,0x01,0x05,0x92,0xfe,0x5c,0x00,0x01,0x02,0x51,0x07,0x6c,0x00,0x01,0x02,0x51,0xfe,0x5c,0x00,0x01,0x02,0x2e,0x07,0x6c,0x00,0x01,0x02,0x2e,0xfe,0x5c,0x00,0x01,0x02,0x0f,0x07,0x6c,0x00,0x01,0x02,0x0f,0xfe,0x5c,0x00,0x01,0x01,0xeb,\r\n0x07,0x6c,0x00,0x01,0x01,0xeb,0xfe,0x5c,0x00,0x01,0x02,0x23,0x08,0x34,0x00,0x01,0x02,0x23,0xfe,0x5c,0x00,0x01,0x02,0x00,0x07,0x6c,0x00,0x01,0x02,0x00,0xfe,0x5c,0x00,0x01,0x02,0xf2,0x07,0x6c,0x00,0x01,0x02,0xf2,0xfe,0x5c,0x00,0x01,0x02,0x62,0x07,0x6c,0x00,0x01,0x02,0x62,0xfe,0x5c,0x00,0x01,0x07,0x60,0x08,0x34,0x00,0x01,\r\n0x06,0x3a,0x07,0x6c,0x00,0x01,0x06,0x3a,0xfe,0x5c,0x00,0x01,0x04,0xa9,0x07,0x6c,0x00,0x01,0x04,0xa9,0xfe,0x5c,0x00,0x01,0x05,0xd0,0x07,0x6c,0x00,0x01,0x05,0xd0,0xfe,0x5c,0x00,0x01,0x04,0xc7,0x07,0x6c,0x00,0x01,0x04,0xc7,0xfe,0x5c,0x00,0x01,0x04,0x52,0x07,0x6c,0x00,0x01,0x04,0x52,0xfe,0x5c,0x00,0x01,0x03,0xe9,0x07,0x6c,\r\n0x00,0x01,0x03,0xe9,0xfe,0x5c,0x00,0x01,0x03,0x83,0x08,0x34,0x00,0x01,0x04,0x6f,0x08,0x34,0x00,0x01,0x04,0x6f,0xfe,0x5c,0x00,0x01,0x04,0x5a,0x07,0x6c,0x00,0x01,0x04,0x5a,0xfe,0x5c,0x00,0x01,0x04,0x20,0x08,0x34,0x00,0x01,0x04,0x20,0xfe,0x5c,0x00,0x01,0x04,0x32,0x07,0x6c,0x00,0x01,0x04,0x32,0xfe,0x5c,0x00,0x01,0x03,0xdd,\r\n0x08,0x34,0x00,0x01,0x01,0xa1,0x07,0x6c,0x00,0x01,0x01,0xa1,0xfe,0x5c,0x00,0x01,0x04,0x50,0x08,0x34,0x00,0x01,0x06,0x3a,0x08,0x34,0x00,0x01,0x05,0xd0,0x08,0x34,0x00,0x01,0x05,0x66,0x07,0x6c,0x00,0x01,0x05,0x66,0xfe,0x5c,0x00,0x01,0x03,0xcf,0x07,0x6c,0x00,0x01,0x03,0xcf,0xfe,0x5c,0x00,0x01,0x04,0x2f,0x08,0x34,0x00,0x01,\r\n0x03,0x94,0x08,0x34,0x00,0x01,0x02,0xa0,0x08,0x34,0x00,0x01,0x02,0x50,0x07,0x6c,0x00,0x01,0x02,0x50,0xfe,0x5c,0x00,0x01,0x02,0x3a,0x07,0x6c,0x00,0x01,0x02,0x3a,0xfe,0x5c,0x00,0x01,0x02,0x39,0x08,0x34,0x00,0x01,0x02,0x39,0xfe,0x5c,0x00,0x01,0x02,0x1b,0x08,0x34,0x00,0x01,0x02,0x1b,0xfe,0x5c,0x00,0x01,0x04,0xa2,0x08,0x34,\r\n0x00,0x01,0x01,0x5b,0x07,0x6c,0x00,0x01,0x01,0x5b,0xfe,0x5c,0x00,0x01,0x01,0xf6,0x08,0x34,0x00,0x01,0x01,0xf6,0xfe,0x5c,0x00,0x01,0x01,0xf8,0x07,0x6c,0x00,0x01,0x01,0xf8,0xfe,0x5c,0x00,0x01,0x06,0x72,0x08,0x34,0x00,0x01,0x04,0x29,0x08,0x34,0x00,0x01,0x02,0xc7,0x07,0x6c,0x00,0x01,0x02,0xc7,0xfe,0x5c,0x00,0x01,0x03,0x0f,\r\n0x08,0x34,0x00,0x01,0x02,0x95,0x07,0x6c,0x00,0x01,0x02,0x95,0xfe,0x5c,0x00,0x01,0x02,0x86,0x07,0x6c,0x00,0x01,0x02,0x86,0xfe,0x5c,0x00,0x01,0x03,0xe2,0x08,0x34,0x00,0x01,0x04,0xe6,0x08,0x34,0x00,0x01,0x04,0x9a,0x08,0x34,0x00,0x01,0x02,0x62,0x08,0x34,0x00,0x01,0x04,0x81,0x07,0x6c,0x00,0x01,0x04,0x81,0xfe,0x5c,0x00,0x01,\r\n0x04,0x38,0x07,0x6c,0x00,0x01,0x04,0x38,0xfe,0x5c,0x00,0x01,0x05,0x42,0x07,0x6c,0x00,0x01,0x05,0x42,0xfe,0x5c,0x00,0x01,0x04,0x0e,0x07,0x6c,0x00,0x01,0x04,0x0e,0xfe,0x5c,0x00,0x01,0x05,0x90,0x07,0x6c,0x00,0x01,0x05,0x90,0xfe,0x5c,0x00,0x01,0x03,0xd7,0x07,0x6c,0x00,0x01,0x03,0xd7,0xfe,0x5c,0x00,0x01,0x04,0x5c,0x07,0x6c,\r\n0x00,0x01,0x04,0x5c,0xfe,0x5c,0x00,0x01,0x03,0x52,0x07,0x6c,0x00,0x01,0x03,0x52,0xfe,0x5c,0x00,0x01,0x03,0xf4,0x07,0x6c,0x00,0x01,0x03,0xf4,0xfe,0x5c,0x00,0x01,0x05,0x85,0x07,0x6c,0x00,0x01,0x05,0x85,0xfe,0x5c,0x00,0x01,0x06,0x87,0x07,0x6c,0x00,0x01,0x06,0x87,0xfe,0x5c,0x00,0x01,0x02,0x25,0x07,0x6c,0x00,0x01,0x02,0x25,\r\n0xfe,0x5c,0x00,0x01,0x01,0xdb,0x07,0x6c,0x00,0x01,0x01,0xdb,0xfe,0x5c,0x00,0x01,0x03,0xdf,0x07,0x6c,0x00,0x01,0x03,0xdf,0xfe,0x5c,0x00,0x01,0x06,0x66,0x07,0x6c,0x00,0x01,0x06,0x66,0xfe,0x5c,0x00,0x01,0x07,0x04,0x07,0x6c,0x00,0x01,0x07,0x04,0xfe,0x5c,0x00,0x01,0x05,0xac,0x07,0x6c,0x00,0x01,0x05,0xac,0xfe,0x5c,0x00,0x01,\r\n0x04,0x7b,0x07,0x6c,0x00,0x01,0x04,0x7b,0xfe,0x5c,0x00,0x01,0x04,0x62,0x07,0x6c,0x00,0x01,0x04,0x62,0xfe,0x5c,0x00,0x01,0x03,0xc7,0x07,0x6c,0x00,0x01,0x03,0xc7,0xfe,0x5c,0x00,0x01,0x02,0xfd,0x07,0x6c,0x00,0x01,0x02,0xfd,0xfe,0x5c,0x00,0x01,0x03,0xf0,0x07,0x6c,0x00,0x01,0x03,0xf0,0xfe,0x5c,0x00,0x01,0x05,0xa8,0x07,0x6c,\r\n0x00,0x01,0x05,0xa8,0xfe,0x5c,0x00,0x01,0x05,0x54,0x07,0x6c,0x00,0x01,0x05,0x54,0xfe,0x5c,0x00,0x01,0x04,0x7f,0x07,0x6c,0x00,0x01,0x04,0x7f,0xfe,0x5c,0x00,0x01,0x04,0x83,0x07,0x6c,0x00,0x01,0x04,0x83,0xfe,0x5c,0x00,0x01,0x04,0xd7,0x07,0x6c,0x00,0x01,0x04,0xd7,0xfe,0x5c,0x00,0x01,0x03,0xc8,0x07,0x6c,0x00,0x01,0x03,0xc8,\r\n0xfe,0x5c,0x00,0x01,0x02,0xcd,0x07,0x6c,0x00,0x01,0x02,0xcd,0xfe,0x5c,0x00,0x01,0x02,0xe4,0x07,0x6c,0x00,0x01,0x02,0xe4,0xfe,0x5c,0x00,0x01,0x04,0x16,0x07,0x6c,0x00,0x01,0x04,0x16,0xfe,0x5c,0x00,0x01,0x09,0xbc,0x08,0x34,0x00,0x01,0x09,0xbc,0xfe,0x5c,0x00,0x01,0x08,0xef,0x07,0x6c,0x00,0x01,0x08,0xef,0xfe,0x5c,0x00,0x01,\r\n0x08,0x05,0x07,0x6c,0x00,0x01,0x08,0x05,0xfe,0x5c,0x00,0x01,0x06,0x29,0x07,0x6c,0x00,0x01,0x06,0x29,0xfe,0x5c,0x00,0x01,0x05,0x39,0x07,0x6c,0x00,0x01,0x05,0x39,0xfe,0x5c,0x00,0x01,0x03,0x77,0x07,0x6c,0x00,0x01,0x03,0x77,0xfe,0x5c,0x00,0x01,0x07,0xe4,0x07,0x6c,0x00,0x01,0x07,0xe4,0xfe,0x5c,0x00,0x01,0x07,0x34,0x07,0x6c,\r\n0x00,0x01,0x07,0x34,0xfe,0x5c,0x00,0x01,0x05,0xed,0x07,0x6c,0x00,0x01,0x05,0xed,0xfe,0x5c,0x00,0x01,0x03,0x7b,0x07,0x6c,0x00,0x01,0x03,0x7b,0xfe,0x5c,0x00,0x01,0x02,0x29,0x08,0x34,0x00,0x01,0x02,0x29,0xfe,0x5c,0x00,0x01,0x02,0x11,0x07,0x6c,0x00,0x01,0x02,0x11,0xfe,0x5c,0x00,0x01,0x06,0x83,0x08,0x34,0x00,0x01,0x06,0x4e,\r\n0x07,0x6c,0x00,0x01,0x06,0x4e,0xfe,0x5c,0x00,0x01,0x05,0x7d,0x07,0x6c,0x00,0x01,0x05,0x7d,0xfe,0x5c,0x00,0x01,0x04,0xb6,0x07,0x6c,0x00,0x01,0x04,0xb6,0xfe,0x5c,0x00,0x01,0x04,0x83,0x08,0x34,0x00,0x01,0x03,0x68,0x07,0x6c,0x00,0x01,0x03,0x68,0xfe,0x5c,0x00,0x01,0x09,0xbc,0x07,0x6c,0x00,0x01,0x08,0xf0,0x07,0x6c,0x00,0x01,\r\n0x08,0xf0,0xfe,0x5c,0x00,0x01,0x08,0x06,0x07,0x6c,0x00,0x01,0x08,0x06,0xfe,0x5c,0x00,0x01,0x07,0x79,0x07,0x6c,0x00,0x01,0x07,0x79,0xfe,0x5c,0x00,0x01,0x05,0x27,0x07,0x6c,0x00,0x01,0x05,0x27,0xfe,0x5c,0x00,0x01,0x01,0xb6,0x07,0x6c,0x00,0x01,0x01,0xb6,0xfe,0x5c,0x00,0x01,0x02,0x28,0x08,0x34,0x00,0x01,0x02,0x28,0xfe,0x5c,\r\n0x00,0x01,0x02,0x0a,0x07,0x6c,0x00,0x01,0x02,0x0a,0xfe,0x5c,0x00,0x01,0x02,0xca,0x07,0x6c,0x00,0x01,0x02,0xca,0xfe,0x5c,0x00,0x01,0x03,0x3e,0x07,0x6c,0x00,0x01,0x03,0x3e,0xfe,0x5c,0x00,0x01,0x04,0x42,0x07,0x6c,0x00,0x01,0x04,0x42,0xfe,0x5c,0x00,0x01,0x03,0x9e,0x07,0x6c,0x00,0x01,0x03,0x9e,0xfe,0x5c,0x00,0x01,0x04,0x56,\r\n0x07,0x6c,0x00,0x01,0x04,0x56,0xfe,0x5c,0x00,0x01,0x03,0x5a,0x07,0x6c,0x00,0x01,0x03,0x5a,0xfe,0x5c,0x00,0x01,0x03,0xa0,0x07,0x6c,0x00,0x01,0x03,0xa0,0xfe,0x5c,0x00,0x01,0x05,0x21,0x07,0x6c,0x00,0x01,0x05,0x21,0xfe,0x5c,0x00,0x01,0x05,0x16,0x07,0x6c,0x00,0x01,0x05,0x16,0xfe,0x5c,0x00,0x01,0x02,0xf4,0x07,0x6c,0x00,0x01,\r\n0x02,0xf4,0xfe,0x5c,0x00,0x01,0x02,0xee,0x07,0x6c,0x00,0x01,0x02,0xee,0xfe,0x5c,0x00,0x01,0x04,0x35,0x07,0x6c,0x00,0x01,0x04,0x35,0xfe,0x5c,0x00,0x01,0x02,0x1c,0x07,0x6c,0x00,0x01,0x02,0x1c,0xfe,0x5c,0x00,0x01,0x03,0xcd,0x07,0x6c,0x00,0x01,0x03,0xcd,0xfe,0x5c,0x00,0x01,0x03,0xc6,0x07,0x6c,0x00,0x01,0x03,0xc6,0xfe,0x5c,\r\n0x00,0x01,0x02,0x0e,0x07,0x6c,0x00,0x01,0x02,0x0e,0xfe,0x5c,0x00,0x01,0x02,0x2f,0x07,0x6c,0x00,0x01,0x02,0x2f,0xfe,0x5c,0x00,0x01,0x02,0x44,0x07,0x6c,0x00,0x01,0x02,0x44,0xfe,0x5c,0x00,0x01,0x02,0x52,0x07,0x6c,0x00,0x01,0x02,0x52,0xfe,0x5c,0x00,0x01,0x02,0x5a,0x07,0x6c,0x00,0x01,0x02,0x5a,0xfe,0x5c,0x00,0x01,0x04,0xb2,\r\n0x07,0x6c,0x00,0x01,0x04,0xb2,0xfe,0x5c,0x00,0x01,0x05,0x08,0x07,0x6c,0x00,0x01,0x05,0x08,0xfe,0x5c,0x00,0x01,0x04,0x0a,0x07,0x6c,0x00,0x01,0x04,0x0a,0xfe,0x5c,0x00,0x01,0x05,0x60,0x07,0x6c,0x00,0x01,0x05,0x60,0xfe,0x5c,0x00,0x01,0x05,0x64,0x07,0x6c,0x00,0x01,0x05,0x64,0xfe,0x5c,0x00,0x01,0x04,0xba,0x07,0x6c,0x00,0x01,\r\n0x04,0xba,0xfe,0x5c,0x00,0x01,0x02,0x23,0x07,0x6c,0x00,0x01,0x03,0x33,0x07,0x6c,0x00,0x01,0x03,0x33,0xfe,0x5c,0x00,0x01,0x02,0xa2,0x07,0x6c,0x00,0x01,0x02,0xa2,0xfe,0x5c,0x00,0x01,0x02,0x1e,0x07,0x6c,0x00,0x01,0x02,0x1e,0xfe,0x5c,0x00,0x01,0x02,0xdb,0x07,0x6c,0x00,0x01,0x02,0xdb,0xfe,0x5c,0x00,0x01,0x02,0x68,0x07,0x6c,\r\n0x00,0x01,0x02,0x68,0xfe,0x5c,0x00,0x01,0x02,0x72,0x07,0x6c,0x00,0x01,0x02,0x72,0xfe,0x5c,0x00,0x01,0x02,0x48,0x07,0x6c,0x00,0x01,0x02,0x48,0xfe,0x5c,0x00,0x01,0x02,0x8e,0x07,0x6c,0x00,0x01,0x02,0x8e,0xfe,0x5c,0x00,0x01,0x04,0xa4,0x07,0x6c,0x00,0x01,0x04,0xa4,0xfe,0x5c,0x00,0x01,0x03,0xd1,0x07,0x6c,0x00,0x01,0x03,0xd1,\r\n0xfe,0x5c,0x00,0x01,0x03,0x4c,0x07,0x6c,0x00,0x01,0x03,0x4c,0xfe,0x5c,0x00,0x01,0x03,0xfe,0x07,0x6c,0x00,0x01,0x03,0xfe,0xfe,0x5c,0x00,0x01,0x04,0x25,0x07,0x6c,0x00,0x01,0x04,0x25,0xfe,0x5c,0x00,0x01,0x03,0x8c,0x07,0x6c,0x00,0x01,0x03,0x8c,0xfe,0x5c,0x00,0x01,0x02,0xe8,0x07,0x6c,0x00,0x01,0x02,0xe8,0xfe,0x5c,0x00,0x01,\r\n0x02,0xcf,0x07,0x6c,0x00,0x01,0x02,0xcf,0xfe,0x5c,0x00,0x01,0x02,0xcb,0x07,0x6c,0x00,0x01,0x02,0xcb,0xfe,0x5c,0x00,0x01,0x03,0x60,0x07,0x6c,0x00,0x01,0x03,0x60,0xfe,0x5c,0x00,0x01,0x04,0x92,0x07,0x6c,0x00,0x01,0x04,0x92,0xfe,0x5c,0x00,0x01,0x03,0x7f,0x07,0x6c,0x00,0x01,0x03,0x7f,0xfe,0x5c,0x00,0x01,0x04,0x02,0x07,0x6c,\r\n0x00,0x01,0x04,0x02,0xfe,0x5c,0x00,0x01,0x02,0x38,0x07,0x6c,0x00,0x01,0x03,0x56,0x07,0x6c,0x00,0x01,0x03,0x56,0xfe,0x5c,0x00,0x01,0x02,0xf8,0x07,0x6c,0x00,0x01,0x02,0xf8,0xfe,0x5c,0x00,0x01,0x07,0x27,0x07,0x6c,0x00,0x01,0x07,0x27,0xfe,0x5c,0x00,0x01,0x07,0x77,0x07,0x6c,0x00,0x01,0x07,0x77,0xfe,0x5c,0x00,0x01,0x07,0xdb,\r\n0x07,0x6c,0x00,0x01,0x07,0xdb,0xfe,0x5c,0x00,0x01,0x04,0x94,0x07,0x6c,0x00,0x01,0x04,0x94,0xfe,0x5c,0x00,0x01,0x04,0x3e,0x07,0x6c,0x00,0x01,0x04,0x3e,0xfe,0x5c,0x00,0x01,0x05,0xc8,0x07,0x6c,0x00,0x01,0x05,0xc8,0xfe,0x5c,0x00,0x01,0x03,0xc2,0x07,0x6c,0x00,0x01,0x03,0xc2,0xfe,0x5c,0x00,0x01,0x06,0x1c,0x07,0x6c,0x00,0x01,\r\n0x06,0x1c,0xfe,0x5c,0x00,0x01,0x06,0x04,0x07,0x6c,0x00,0x01,0x06,0x04,0xfe,0x5c,0x00,0x01,0x07,0x1a,0x07,0x6c,0x00,0x01,0x07,0x1a,0xfe,0x5c,0x00,0x01,0x04,0xf0,0x07,0x6c,0x00,0x01,0x04,0xf0,0xfe,0x5c,0x00,0x01,0x04,0x0b,0x07,0x6c,0x00,0x01,0x04,0x0b,0xfe,0x5c,0x00,0x01,0x04,0xc9,0x07,0x6c,0x00,0x01,0x04,0xc9,0xfe,0x5c,\r\n0x00,0x01,0x03,0xf6,0x07,0x6c,0x00,0x01,0x03,0xf6,0xfe,0x5c,0x00,0x01,0x04,0xff,0x07,0x6c,0x00,0x01,0x04,0xff,0xfe,0x5c,0x00,0x01,0x04,0xdc,0x07,0x6c,0x00,0x01,0x04,0xdc,0xfe,0x5c,0x00,0x01,0x03,0xac,0x07,0x6c,0x00,0x01,0x03,0xac,0xfe,0x5c,0x00,0x01,0x03,0x37,0x07,0x6c,0x00,0x01,0x03,0x37,0xfe,0x5c,0x00,0x01,0x04,0x3f,\r\n0x07,0x6c,0x00,0x01,0x04,0x3f,0xfe,0x5c,0x00,0x01,0x06,0xae,0x07,0x6c,0x00,0x01,0x06,0xae,0xfe,0x5c,0x00,0x01,0x02,0x46,0x07,0x6c,0x00,0x01,0x02,0x46,0xfe,0x5c,0x00,0x01,0x02,0x08,0x07,0x6c,0x00,0x01,0x02,0x08,0xfe,0x5c,0x00,0x01,0x04,0x24,0x07,0x6c,0x00,0x01,0x04,0x24,0xfe,0x5c,0x00,0x01,0x04,0xae,0x07,0x6c,0x00,0x01,\r\n0x04,0xae,0xfe,0x5c,0x00,0x01,0x05,0xfc,0x07,0x6c,0x00,0x01,0x05,0xfc,0xfe,0x5c,0x00,0x01,0x03,0xf9,0x07,0x6c,0x00,0x01,0x03,0xf9,0xfe,0x5c,0x00,0x01,0x01,0xe3,0x07,0x6c,0x00,0x01,0x01,0xe3,0xfe,0x5c,0x00,0x01,0x06,0xed,0x07,0x6c,0x00,0x01,0x06,0xed,0xfe,0x5c,0x00,0x01,0x04,0x91,0x07,0x6c,0x00,0x01,0x04,0x91,0xfe,0x5c,\r\n0x00,0x01,0x03,0xad,0x07,0x6c,0x00,0x01,0x03,0xad,0xfe,0x5c,0x00,0x01,0x03,0x4b,0x07,0x6c,0x00,0x01,0x03,0x4b,0xfe,0x5c,0x00,0x01,0x04,0x06,0x07,0x6c,0x00,0x01,0x04,0x06,0xfe,0x5c,0x00,0x01,0x04,0x71,0x07,0x6c,0x00,0x01,0x04,0x71,0xfe,0x5c,0x00,0x01,0x04,0xfe,0x07,0x6c,0x00,0x01,0x04,0xfe,0xfe,0x5c,0x00,0x01,0x04,0x84,\r\n0x07,0x6c,0x00,0x01,0x04,0x84,0xfe,0x5c,0x00,0x01,0x03,0x3b,0x07,0x6c,0x00,0x01,0x03,0x3b,0xfe,0x5c,0x00,0x01,0x05,0xe0,0x07,0x6c,0x00,0x01,0x05,0xe0,0xfe,0x5c,0x00,0x01,0x02,0xd1,0x07,0x6c,0x00,0x01,0x02,0xd1,0xfe,0x5c,0x00,0x01,0x04,0xd0,0x07,0x6c,0x00,0x01,0x04,0xd0,0xfe,0x5c,0x00,0x01,0x04,0xc1,0x07,0x6c,0x00,0x01,\r\n0x04,0xc1,0xfe,0x5c,0x00,0x01,0x05,0x7f,0x07,0x6c,0x00,0x01,0x05,0x7f,0xfe,0x5c,0x00,0x01,0x05,0x07,0x07,0x6c,0x00,0x01,0x05,0x07,0xfe,0x5c,0x00,0x01,0x06,0x01,0x07,0x6c,0x00,0x01,0x06,0x01,0xfe,0x5c,0x00,0x01,0x02,0xc8,0x07,0x6c,0x00,0x01,0x02,0xc8,0xfe,0x5c,0x00,0x01,0x04,0x6c,0x07,0x6c,0x00,0x01,0x04,0x6c,0xfe,0x5c,\r\n0x00,0x01,0x03,0x9c,0x07,0x6c,0x00,0x01,0x03,0x9c,0xfe,0x5c,0x00,0x01,0x03,0xc4,0x07,0x6c,0x00,0x01,0x03,0xc4,0xfe,0x5c,0x00,0x01,0x02,0x4a,0x07,0x6c,0x00,0x01,0x02,0x4a,0xfe,0x5c,0x00,0x01,0x04,0x19,0x07,0x6c,0x00,0x01,0x04,0x19,0xfe,0x5c,0x00,0x01,0x04,0x12,0x07,0x6c,0x00,0x01,0x04,0x12,0xfe,0x5c,0x00,0x01,0x02,0xb6,\r\n0x07,0x6c,0x00,0x01,0x02,0xb6,0xfe,0x5c,0x00,0x01,0x04,0x8d,0x07,0x6c,0x00,0x01,0x04,0x8d,0xfe,0x5c,0x00,0x01,0x05,0x98,0x07,0x6c,0x00,0x01,0x05,0x98,0xfe,0x5c,0x00,0x01,0xff,0x9c,0x05,0x14,0x00,0x01,0x03,0x34,0x05,0x9a,0x00,0x01,0x03,0xf6,0x04,0xfa,0x00,0x01,0x04,0x81,0x05,0x79,0x00,0x01,0x04,0xb0,0x04,0xfa,0x00,0x01,\r\n0x03,0x70,0x05,0x9a,0x00,0x01,0x04,0xd4,0x05,0x69,0x00,0x01,0x05,0x0e,0x05,0x9a,0x00,0x01,0x01,0xfe,0x05,0x9a,0x00,0x01,0x02,0x3b,0x05,0x9a,0x00,0x01,0x04,0x04,0x05,0x9a,0x00,0x01,0x01,0x42,0x05,0x9a,0x00,0x01,0x06,0xae,0x05,0x9a,0x00,0x01,0x05,0x5c,0x05,0x9a,0x00,0x01,0x04,0xd8,0x05,0x28,0x00,0x01,0x03,0xdb,0x04,0xfa,\r\n0x00,0x01,0x04,0x29,0x04,0xfa,0x00,0x01,0x03,0xa0,0x05,0x94,0x00,0x01,0x04,0x06,0x05,0xa3,0x00,0x01,0x04,0xda,0x05,0x9f,0x00,0x01,0x04,0xa9,0x05,0x9a,0x00,0x01,0x07,0x58,0x05,0x9a,0x00,0x01,0x03,0x20,0x03,0xf1,0x00,0x01,0x04,0x14,0x03,0xb6,0x00,0x01,0x03,0x59,0x03,0xf1,0x00,0x01,0x04,0x04,0x05,0xf2,0x00,0x01,0x03,0x71,\r\n0x03,0xcd,0x00,0x01,0x02,0x9e,0x06,0x02,0x00,0x01,0x04,0x0d,0x04,0x04,0x00,0x01,0x03,0xd5,0x03,0xaa,0x00,0x01,0x01,0x59,0x04,0x01,0x00,0x01,0x01,0x50,0x04,0x01,0x00,0x01,0x03,0xb4,0x04,0x0b,0x00,0x01,0x01,0x67,0x05,0xf2,0x00,0x01,0x06,0x44,0x03,0x78,0x00,0x01,0x03,0xe7,0x03,0x78,0x00,0x01,0x03,0xde,0x03,0x84,0x00,0x01,\r\n0x04,0x14,0x03,0x87,0x00,0x01,0x04,0x04,0x04,0x03,0x00,0x01,0x02,0xc1,0x04,0x02,0x00,0x01,0x02,0xe0,0x03,0xf3,0x00,0x01,0x02,0x70,0x04,0x03,0x00,0x01,0x03,0xd4,0x03,0xfc,0x00,0x01,0x03,0xb3,0x04,0x00,0x00,0x01,0x05,0xa6,0x04,0x00,0x00,0x01,0x03,0x6f,0x04,0x00,0x00,0x01,0x03,0xb4,0x04,0x0c,0x00,0x01,0x03,0x34,0x04,0x00,\r\n0x00,0x01,0x02,0x94,0xff,0xce,0x00,0x01,0x02,0xde,0xff,0xf1,0x00,0x01,0x02,0x52,0xff,0xce,0x00,0x01,0x02,0xfe,0xff,0xce,0x00,0x01,0x03,0x04,0xff,0xf1,0x00,0x01,0x02,0x64,0xff,0xce,0x00,0x01,0x02,0x20,0xff,0xf1,0x00,0x01,0x02,0xbf,0xff,0xf1,0x00,0x01,0x02,0x3a,0xff,0xf1,0x00,0x01,0x02,0x2b,0xff,0xf1,0x00,0x01,0x02,0x44,\r\n0xfe,0x3e,0x00,0x01,0x00,0xfa,0x00,0x14,0x00,0x01,0x01,0xfd,0xff,0xce,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x01,0x02,0x43,0xff,0xce,0x00,0x01,0x00,0xf6,0x00,0x00,0x00,0x01,0x01,0xa8,0xff,0xf1,0x00,0x01,0x01,0xbf,0x00,0x00,0x00,0x01,0x00,0x00,0xff,0xf6,0x00,0x01,0x04,0x65,0x00,0x00,0x00,0x01,0x02,0x58,0x00,0x00,0x00,0x01,\r\n0x03,0x5c,0xff,0xf1,0x00,0x01,0x00,0xe6,0x00,0x00,0x00,0x01,0x03,0xa7,0x00,0x00,0x00,0x01,0x04,0x4c,0x00,0x00,0x00,0x01,0x00,0xc8,0x00,0x00,0x00,0x01,0x03,0xca,0x00,0x00,0x00,0x01,0x02,0xda,0x00,0x00,0x00,0x01,0x05,0xd2,0x00,0x00,0x00,0x01,0x04,0x88,0x00,0x00,0x00,0x01,0x03,0x3e,0xff,0xf1,0x00,0x01,0x03,0x70,0xff,0x4c,\r\n0x00,0x01,0x04,0x10,0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x01,0xcc,0x00,0x00,0x00,0x01,0x05,0x19,0x00,0x00,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x03,0x8e,0x00,0x00,0x00,0x01,0x02,0xc6,0x00,0x00,0x00,0x01,0x02,0x94,0x00,0x00,0x00,0x01,0x03,0x66,0x00,0x00,0x00,0x01,0x02,0xd2,0xfe,0x70,0x00,0x01,0x03,0x5c,\r\n0x00,0x00,0x00,0x01,0x00,0x32,0xfe,0x5c,0x00,0x01,0x03,0x16,0x00,0x00,0x00,0x01,0x05,0xaa,0x00,0x00,0x00,0x01,0x00,0xaa,0xfe,0x20,0x00,0x01,0x03,0x70,0xfe,0x20,0x00,0x01,0x01,0xb8,0xff,0xf1,0x00,0x01,0x03,0x3e,0x00,0x00,0x00,0x01,0x01,0xa4,0x00,0x00,0x00,0x01,0x03,0xde,0x00,0x00,0x00,0x01,0x02,0xd0,0x00,0x00,0x00,0x01,\r\n0x00,0xdc,0xfe,0x48,0x00,0x01,0x02,0xf8,0xfe,0x70,0x00,0x01,0x04,0x6a,0x00,0x00,0x00,0x01,0x02,0x44,0xfe,0x70,0x00,0x01,0x05,0x80,0x00,0x27,0x00,0x01,0x00,0xf1,0xff,0x0e,0x00,0x01,0x06,0x4a,0x00,0x00,0x00,0x01,0x05,0xf0,0x00,0x00,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x02,0xf0,0x00,0x1b,0x00,0x01,0x02,0x9a,0x00,0x09,\r\n0x00,0x01,0x00,0xaa,0xfe,0x2a,0x00,0x01,0x02,0x3a,0xfe,0x70,0x00,0x01,0x01,0xcc,0xfe,0x70,0x00,0x01,0x04,0x4c,0xfe,0x84,0x00,0x01,0x02,0xe4,0xfe,0x84,0x00,0x01,0x02,0x76,0xfe,0x84,0x00,0x01,0x01,0xb8,0xfe,0x5c,0x00,0x01,0x02,0xeb,0x00,0x03,0x00,0x01,0x02,0x4e,0xfe,0x5c,0x00,0x01,0x03,0xb2,0x00,0x00,0x00,0x01,0x02,0x76,\r\n0xfe,0x99,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x84,0x00,0x01,0x01,0x18,0xfe,0x70,0x00,0x01,0x03,0xd6,0xfe,0x5c,0x00,0x01,0x02,0xa3,0xfe,0x5c,0x00,0x01,0x03,0x66,0xfe,0x84,0x00,0x01,0x03,0x20,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x3f,0x00,0x01,0x00,0xfd,0xfe,0xee,0x00,0x01,0x00,0xdc,0xfe,0xdc,0x00,0x01,\r\n0x02,0xed,0xfe,0xec,0x00,0x01,0x02,0x4d,0xfe,0xfb,0x00,0x01,0x02,0xdb,0xfe,0xec,0x00,0x01,0x02,0x44,0xfe,0xf2,0x00,0x01,0x02,0xf6,0xfe,0xf5,0x00,0x01,0x02,0x3b,0xfe,0xf2,0x00,0x01,0x02,0xab,0xfe,0xfb,0x00,0x01,0x02,0x99,0xfe,0xf2,0x00,0x01,0x02,0x0f,0xfe,0xe5,0x00,0x01,0x01,0x00,0xfe,0x67,0x00,0x01,0x01,0x86,0xfe,0x98,\r\n0x00,0x01,0x01,0x18,0xfe,0x98,0x00,0x01,0x02,0x17,0xfe,0x5c,0x00,0x01,0x02,0x08,0xfe,0xd4,0x00,0x01,0x02,0x48,0xfe,0xd4,0x00,0x01,0x02,0x2a,0xff,0x24,0x00,0x01,0x02,0x63,0xff,0x24,0x00,0x01,0x02,0x26,0xfe,0x5c,0x00,0x01,0x02,0x72,0xfe,0xd4,0x00,0x01,0x02,0x60,0xff,0x24,0x00,0x01,0x02,0x3d,0xff,0x24,0x00,0x01,0x02,0x3e,\r\n0xfe,0x92,0x00,0x01,0x02,0x9e,0xfe,0x48,0x00,0x01,0x02,0x35,0xfe,0x48,0x00,0x01,0x02,0x2a,0xfe,0xd4,0x00,0x01,0x02,0x4e,0xfe,0xd4,0x00,0x01,0x02,0x2a,0xfe,0x5c,0x00,0x01,0x02,0xe4,0xfe,0xa2,0x00,0x01,0x02,0x76,0xfe,0xa2,0x00,0x01,0x01,0x22,0xfe,0xd4,0x00,0x01,0x00,0xf0,0xfe,0xd4,0x00,0x01,0x03,0x7a,0x00,0x00,0x00,0x01,\r\n0x04,0x3f,0x00,0x00,0x00,0x01,0x02,0x23,0xff,0x24,0x00,0x01,0x00,0xd2,0xfe,0xd4,0x00,0x01,0x00,0xc8,0xfe,0xd4,0x00,0x01,0x02,0x1c,0xff,0x24,0x00,0x01,0x02,0x17,0xfe,0x48,0x00,0x01,0x00,0xe6,0xfe,0x48,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x02,0xf3,0xff,0x24,0x00,0x01,0x02,0x44,0xfe,0x48,0x00,0x01,0x00,0xb4,0xfe,0x20,\r\n0x00,0x01,0x02,0x84,0xff,0x24,0x00,0x01,0x01,0x9e,0xff,0x24,0x00,0x01,0x01,0xf9,0xfe,0xd4,0x00,0x01,0x01,0x9a,0xfe,0xd4,0x00,0x01,0x02,0x2b,0xfe,0xd4,0x00,0x01,0x01,0xa9,0xfe,0xd4,0x00,0x01,0x01,0xf4,0xfe,0xd4,0x00,0x01,0x01,0x3b,0xfe,0xd4,0x00,0x01,0x01,0xf0,0xff,0x24,0x00,0x01,0x01,0x82,0xff,0x24,0x00,0x01,0x02,0x12,\r\n0xfe,0x48,0x00,0x01,0x01,0x54,0xfe,0x48,0x00,0x01,0x02,0xb2,0xfe,0xac,0x00,0x01,0x02,0x1c,0xfe,0xac,0x00,0x01,0x02,0xb4,0xfe,0xd4,0x00,0x01,0x02,0x4b,0xfe,0xd4,0x00,0x01,0x04,0x1a,0x00,0x00,0x00,0x01,0x02,0x26,0xfe,0xd4,0x00,0x01,0x01,0xae,0xfe,0xd4,0x00,0x01,0x02,0x3a,0xff,0x24,0x00,0x01,0x01,0xc2,0xff,0x24,0x00,0x01,\r\n0x02,0x9c,0x00,0x00,0x00,0x01,0x02,0x0d,0x00,0x00,0x00,0x01,0x01,0xd7,0xff,0xf1,0x00,0x01,0x02,0x7d,0xff,0xf1,0x00,0x01,0x03,0x54,0x00,0x00,0x00,0x01,0x03,0x74,0x00,0x00,0x00,0x01,0x02,0xe4,0xfe,0x70,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x01,0x02,0xca,0x00,0x00,0x00,0x01,0x00,0x5c,0xfe,0xb6,0x00,0x01,0x05,0x00,0x00,0x00,\r\n0x00,0x01,0x01,0x54,0xff,0xf1,0x00,0x01,0x03,0x52,0xfe,0x70,0x00,0x01,0x06,0x72,0x00,0x00,0x00,0x01,0x05,0x0a,0x00,0x00,0x00,0x01,0x01,0x25,0x00,0x00,0x00,0x01,0x00,0xb9,0xfe,0x2a,0x00,0x01,0x03,0x98,0xff,0x74,0x00,0x01,0x02,0x08,0x00,0x00,0x00,0x01,0x01,0xe4,0xfe,0x2a,0x00,0x01,0x01,0x78,0xfe,0xab,0x00,0x01,0x02,0xe8,\r\n0xfe,0x9b,0x00,0x01,0x03,0x39,0xff,0xf1,0x00,0x01,0x02,0xe9,0xff,0xfa,0x00,0x01,0x02,0x58,0xfe,0x3a,0x00,0x01,0x03,0x66,0xfe,0x2f,0x00,0x01,0x01,0x90,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x00,0x00,0x01,0x08,0xde,0x00,0x00,0x00,0x01,0x08,0x20,0x00,0x00,0x00,0x01,0x07,0x30,0x00,0x00,0x00,0x01,0x04,0xce,0x00,0x00,0x00,0x01,\r\n0x06,0x86,0x00,0x00,0x00,0x01,0x05,0xfa,0xfe,0x5c,0x00,0x01,0x04,0xb0,0xfe,0x5c,0x00,0x01,0x05,0xa2,0x00,0x00,0x00,0x01,0x05,0x14,0x00,0x00,0x00,0x01,0x02,0xda,0xfe,0x84,0x00,0x01,0x02,0x3a,0xfe,0x84,0x00,0x01,0x01,0xcc,0xfe,0x48,0x00,0x01,0x06,0x18,0x00,0x00,0x00,0x01,0x00,0xbe,0xfe,0x2a,0x00,0x01,0x04,0x88,0xfe,0x2a,\r\n0x00,0x01,0x02,0x66,0x00,0x00,0x00,0x01,0x03,0x70,0x00,0x00,0x00,0x01,0x01,0xa5,0xff,0xf7,0x00,0x01,0x04,0x4c,0xfe,0x2a,0x00,0x01,0x02,0x22,0x00,0x00,0x00,0x01,0x01,0xb6,0x00,0x00,0x00,0x01,0x02,0xc2,0x00,0x00,0x00,0x01,0x00,0x8c,0xfe,0x75,0x00,0x01,0x01,0xd8,0xfe,0x5c,0x00,0x01,0x01,0xd4,0x00,0x00,0x00,0x01,0x03,0x47,\r\n0xfe,0x2a,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x01,0x48,0x00,0x00,0x00,0x01,0x03,0x0c,0xfe,0x48,0x00,0x01,0x05,0xa4,0x00,0x00,0x00,0x01,0x05,0xa4,0xfe,0x2a,0x00,0x01,0x04,0xff,0xfe,0x35,0x00,0x01,0x04,0x3d,0xfe,0x2a,0x00,0x01,0x04,0x9c,0x00,0x00,0x00,0x01,0x01,0x91,0x00,0x00,0x00,0x01,0x01,0x88,0x00,0x00,0x00,0x01,\r\n0x01,0x84,0x00,0x09,0x00,0x01,0x02,0xde,0x00,0x09,0x00,0x01,0x01,0x8d,0xfe,0xe0,0x00,0x01,0x00,0x91,0xfe,0x7e,0x00,0x01,0x00,0x8a,0xfe,0x63,0x00,0x01,0x00,0xa4,0xfe,0x5c,0x00,0x01,0x01,0x5c,0xfe,0xfb,0x00,0x01,0x02,0x76,0x00,0x00,0x00,0x01,0x01,0x6c,0x00,0x09,0x00,0x01,0x03,0x52,0xff,0x06,0x00,0x01,0x01,0xc2,0xfe,0x41,\r\n0x00,0x01,0x01,0xc2,0xfe,0x4a,0x00,0x01,0x01,0x5b,0x00,0x00,0x00,0x01,0x01,0x47,0x00,0x00,0x00,0x01,0x02,0x7d,0xfe,0x48,0x00,0x01,0x02,0xa5,0xff,0xfa,0x00,0x01,0x00,0x43,0xfe,0x41,0x00,0x01,0x02,0xbc,0xfe,0x16,0x00,0x01,0x03,0x76,0xfe,0x2a,0x00,0x01,0x01,0x64,0x00,0x00,0x00,0x01,0x06,0x5e,0x00,0x00,0x00,0x01,0x05,0xb4,\r\n0xfe,0x36,0x00,0x01,0x02,0x14,0xfe,0x4a,0x00,0x01,0x04,0xb0,0x00,0x00,0x00,0x01,0x04,0xb0,0xfe,0x48,0x00,0x01,0x03,0x02,0x00,0x00,0x00,0x01,0x01,0xf4,0xfe,0x5c,0x00,0x01,0x04,0x9c,0xfe,0x5c,0x00,0x01,0x03,0x84,0xfe,0x2a,0x00,0x01,0x05,0x82,0x00,0x00,0x00,0x01,0x03,0x7a,0xfe,0x20,0x00,0x01,0x02,0x1f,0xfe,0xd4,0x00,0x01,\r\n0x02,0x9e,0xfe,0x2a,0x00,0x01,0x02,0xd0,0x01,0xf6,0x00,0x01,0x06,0x1a,0x00,0x00,0x00,0x01,0x01,0x22,0x00,0x00,0x00,0x01,0x02,0x6c,0x00,0x00,0x00,0x01,0x02,0xd0,0xfe,0xa2,0x00,0x01,0x03,0x98,0xfe,0xa2,0x00,0x01,0x02,0xee,0xfe,0xa2,0x00,0x01,0x00,0xd2,0xfe,0xa2,0x00,0x01,0x05,0xdc,0xfe,0xa2,0x00,0x01,0x03,0x84,0xfe,0xa2,\r\n0x00,0x01,0x02,0x80,0xfe,0xa2,0x00,0x01,0x03,0xa2,0xfe,0xa2,0x00,0x01,0x04,0x2e,0xfe,0xa2,0x00,0x01,0x04,0x38,0xfe,0xa2,0x00,0x01,0x03,0xb6,0xfe,0xc0,0x00,0x01,0x03,0x52,0xfe,0xa2,0x00,0x01,0x02,0x7f,0x00,0x46,0x00,0x01,0x03,0xfc,0xfe,0xa2,0x00,0x01,0x04,0x21,0x00,0x00,0x00,0x01,0x00,0xe6,0x00,0x8c,0x00,0x01,0x04,0x42,\r\n0x00,0x00,0x00,0x01,0x05,0xbe,0xfe,0xa2,0x00,0x01,0x04,0xba,0xfe,0xa2,0x00,0x01,0x00,0xc8,0xfe,0x48,0x00,0x01,0x03,0xa2,0x00,0x0f,0x00,0x01,0x00,0x8c,0x00,0x1e,0x00,0x01,0xff,0x6a,0x00,0x1e,0x00,0x01,0x03,0x4a,0x00,0x50,0x00,0x01,0x02,0xd5,0x00,0x1a,0x00,0x01,0x03,0xbc,0x00,0x09,0x00,0x01,0x03,0xbc,0x00,0x00,0x00,0x01,\r\n0x01,0x40,0x00,0x00,0x00,0x01,0x03,0x3a,0xfe,0x93,0x00,0x01,0x03,0x48,0xfe,0xc0,0x00,0x01,0x03,0xa8,0x00,0x00,0x00,0x01,0x00,0x83,0xfe,0x89,0x00,0x01,0x03,0x5a,0x00,0x00,0x00,0x01,0x05,0xfc,0x00,0x00,0x00,0x01,0x03,0xa2,0x00,0x09,0x00,0x01,0x03,0x5c,0x00,0x3f,0x00,0x01,0x03,0xb3,0xfe,0x42,0x00,0x01,0x00,0xf8,0x00,0x00,\r\n0x00,0x01,0x02,0x60,0x00,0x50,0x00,0x01,0x01,0xea,0x00,0x00,0x00,0x01,0x04,0x27,0x00,0x09,0x00,0x01,0x04,0x27,0x00,0x00,0x00,0x01,0x03,0x07,0xff,0xf7,0x00,0x01,0x03,0x07,0x00,0x00,0x00,0x01,0x02,0x58,0x06,0xea,0x00,0x01,0xff,0x6f,0x06,0xea,0x00,0x01,0x00,0xaa,0x06,0x40,0x00,0x01,0xff,0x7e,0x06,0x40,0x00,0x01,0x05,0x29,\r\n0x08,0x34,0x00,0x01,0x00,0x00,0x08,0x34,0x00,0x01,0x04,0x96,0x08,0x34,0x00,0x01,0x04,0xf4,0x08,0x34,0x00,0x01,0x05,0x9c,0x08,0x34,0x00,0x01,0x03,0xe8,0x08,0x34,0x00,0x01,0x05,0x7d,0x08,0x34,0x00,0x01,0x05,0xae,0x08,0x34,0x00,0x01,0x02,0x21,0x08,0x34,0x00,0x01,0x02,0xdb,0x08,0x34,0x00,0x01,0x04,0xa4,0x08,0x34,0x00,0x01,\r\n0x03,0xc4,0x08,0x34,0x00,0x01,0x07,0x2f,0x08,0x34,0x00,0x01,0x05,0xfc,0x08,0x34,0x00,0x01,0x06,0x08,0x08,0x34,0x00,0x01,0x04,0x7b,0x08,0x34,0x00,0x01,0x04,0xc9,0x08,0x34,0x00,0x01,0x04,0x40,0x08,0x34,0x00,0x01,0x04,0x31,0x08,0x34,0x00,0x01,0x05,0x7f,0x08,0x34,0x00,0x01,0x04,0xf8,0x08,0x34,0x00,0x01,0x07,0x79,0x08,0x34,\r\n0x00,0x01,0x04,0xb8,0x08,0x34,0x00,0x01,0x04,0x6c,0x08,0x34,0x00,0x01,0x04,0x90,0x08,0x34,0x00,0x01,0x04,0x12,0x08,0x34,0x00,0x01,0x04,0xb4,0x08,0x34,0x00,0x01,0x03,0xb2,0x08,0x34,0x00,0x01,0x04,0xb6,0x08,0x34,0x00,0x01,0x02,0x81,0x08,0x34,0x00,0x01,0x04,0x87,0x08,0x34,0x00,0x01,0x03,0xfa,0x08,0x34,0x00,0x01,0x06,0xe4,\r\n0x08,0x34,0x00,0x01,0x04,0xb0,0x08,0x34,0x00,0x01,0x02,0xc8,0x08,0x34,0x00,0x01,0x03,0x65,0x08,0x34,0x00,0x01,0x02,0xb6,0x08,0x34,0x00,0x01,0x03,0xd5,0x08,0x34,0x00,0x01,0x05,0xc8,0x08,0x34,0x00,0x01,0x03,0xac,0x08,0x34,0x00,0x01,0x03,0xdf,0x08,0x34,0x00,0x01,0x03,0x9e,0x08,0x34,0x00,0x01,0x04,0x5a,0x08,0x34,0x00,0x01,\r\n0x06,0xe2,0x08,0x34,0x00,0x01,0x06,0xa8,0x08,0x34,0x00,0x01,0x07,0x72,0x08,0x34,0x00,0x01,0x07,0x6c,0x08,0x34,0x00,0x01,0x02,0x31,0x08,0x34,0x00,0x01,0x04,0x79,0x08,0x34,0x00,0x01,0x05,0x65,0x08,0x34,0x00,0x01,0x02,0x75,0x08,0x34,0x00,0x01,0x02,0x85,0x08,0x34,0x00,0x01,0x03,0x85,0x08,0x34,0x00,0x01,0x04,0xfc,0x08,0x34,\r\n0x00,0x01,0x03,0xf6,0x08,0x34,0x00,0x01,0x04,0xd9,0x08,0x34,0x00,0x01,0x01,0xee,0x08,0x34,0x00,0x01,0x06,0x1a,0x08,0x34,0x00,0x01,0x04,0xc7,0x08,0x34,0x00,0x01,0x05,0xc4,0x08,0x34,0x00,0x01,0x06,0x8e,0x08,0x34,0x00,0x01,0x04,0xe8,0x08,0x34,0x00,0x01,0x04,0x93,0x08,0x34,0x00,0x01,0x04,0x9e,0x08,0x34,0x00,0x01,0x04,0xf6,\r\n0x08,0x34,0x00,0x01,0x03,0xba,0x08,0x34,0x00,0x01,0x05,0xee,0x08,0x34,0x00,0x01,0x04,0x94,0x08,0x34,0x00,0x01,0x04,0xbc,0x08,0x34,0x00,0x01,0x04,0x0e,0x08,0x34,0x00,0x01,0x04,0x54,0x08,0x34,0x00,0x01,0x05,0x89,0x08,0x34,0x00,0x01,0x06,0xfe,0x08,0x34,0x00,0x01,0x02,0x4e,0x08,0x34,0x00,0x01,0x02,0x3a,0x08,0x34,0x00,0x01,\r\n0x03,0xfc,0x08,0x34,0x00,0x01,0x07,0x23,0x08,0x34,0x00,0x01,0x07,0xc0,0x08,0x34,0x00,0x01,0x06,0x52,0x08,0x34,0x00,0x01,0x04,0xcf,0x08,0x34,0x00,0x01,0x04,0x9c,0x08,0x34,0x00,0x01,0x04,0x21,0x08,0x34,0x00,0x01,0x02,0x5e,0x08,0x34,0x00,0x01,0x02,0xb8,0x08,0x34,0x00,0x01,0x04,0x33,0x08,0x34,0x00,0x01,0x06,0x0a,0x08,0x34,\r\n0x00,0x01,0x05,0xb2,0x08,0x34,0x00,0x01,0x04,0x8e,0x08,0x34,0x00,0x01,0x04,0x23,0x08,0x34,0x00,0x01,0x04,0xe2,0x08,0x34,0x00,0x01,0x03,0x0a,0x08,0x34,0x00,0x01,0x03,0x27,0x08,0x34,0x00,0x01,0x04,0x5e,0x08,0x34,0x00,0x01,0x09,0xe8,0x08,0x34,0x00,0x01,0x09,0x1c,0x08,0x34,0x00,0x01,0x08,0x33,0x08,0x34,0x00,0x01,0x06,0xd9,\r\n0x08,0x34,0x00,0x01,0x05,0xc2,0x08,0x34,0x00,0x01,0x04,0x01,0x08,0x34,0x00,0x01,0x08,0x94,0x08,0x34,0x00,0x01,0x07,0xbe,0x08,0x34,0x00,0x01,0x06,0x77,0x08,0x34,0x00,0x01,0x04,0x0a,0x08,0x34,0x00,0x01,0x06,0xa0,0x08,0x34,0x00,0x01,0x03,0x89,0x08,0x34,0x00,0x01,0x07,0xfe,0x08,0x34,0x00,0x01,0x05,0x83,0x08,0x34,0x00,0x01,\r\n0x04,0x08,0x08,0x34,0x00,0x01,0x03,0x70,0x08,0x34,0x00,0x01,0x05,0xdf,0x08,0x34,0x00,0x01,0x04,0x89,0x08,0x34,0x00,0x01,0x03,0x4e,0x08,0x34,0x00,0x01,0x04,0x68,0x08,0x34,0x00,0x01,0x04,0x3c,0x08,0x34,0x00,0x01,0x03,0xa8,0x08,0x34,0x00,0x01,0x02,0x18,0x08,0x34,0x00,0x01,0x02,0x90,0x08,0x34,0x00,0x01,0x02,0x3e,0x08,0x34,\r\n0x00,0x01,0x03,0x02,0x08,0x34,0x00,0x01,0x04,0xd3,0x08,0x34,0x00,0x01,0x04,0x72,0x08,0x34,0x00,0x01,0x05,0x96,0x08,0x34,0x00,0x01,0x05,0x1a,0x08,0x34,0x00,0x01,0x02,0xae,0x08,0x34,0x00,0x01,0x03,0xa2,0x08,0x34,0x00,0x01,0x03,0x2f,0x08,0x34,0x00,0x01,0x01,0xfa,0x08,0x34,0x00,0x01,0x02,0x10,0x08,0x34,0x00,0x01,0x02,0x44,\r\n0x08,0x34,0x00,0x01,0x04,0xcb,0x08,0x34,0x00,0x01,0x04,0xc2,0x08,0x34,0x00,0x01,0x04,0x77,0x08,0x34,0x00,0x01,0x03,0x56,0x08,0x34,0x00,0x01,0x04,0x18,0x08,0x34,0x00,0x01,0x02,0xec,0x08,0x34,0x00,0x01,0x04,0x62,0x08,0x34,0x00,0x01,0x03,0x14,0x08,0x34,0x00,0x01,0x07,0x54,0x08,0x34,0x00,0x01,0x07,0x98,0x08,0x34,0x00,0x01,\r\n0x07,0xcf,0x08,0x34,0x00,0x01,0x03,0xcf,0x08,0x34,0x00,0x01,0x05,0xbe,0x08,0x34,0x00,0x01,0x06,0x58,0x08,0x34,0x00,0x01,0x03,0xf4,0x08,0x34,0x00,0x01,0x05,0x27,0x08,0x34,0x00,0x01,0x02,0x60,0x08,0x34,0x00,0x01,0x05,0x0e,0x08,0x34,0x00,0x01,0x07,0x7a,0x08,0x34,0x00,0x01,0x04,0x16,0x08,0x34,0x00,0x01,0x03,0xb5,0x08,0x34,\r\n0x00,0x01,0x03,0xb1,0x08,0x34,0x00,0x01,0x04,0x9f,0x08,0x34,0x00,0x01,0x07,0x3d,0x08,0x34,0x00,0x01,0x02,0x22,0x08,0x34,0x00,0x01,0x04,0x46,0x08,0x34,0x00,0x01,0x03,0x76,0x08,0x34,0x00,0x01,0x03,0x81,0x08,0x34,0x00,0x01,0x03,0x91,0x08,0x34,0x00,0x01,0x05,0xe0,0x08,0x34,0x00,0x01,0x04,0xc1,0x08,0x34,0x00,0x01,0x02,0xf4,\r\n0x08,0x34,0x00,0x01,0x05,0x07,0x08,0x34,0x00,0x01,0x06,0x01,0x08,0x34,0x00,0x01,0x03,0x9c,0x08,0x34,0x00,0x01,0x02,0x4a,0x08,0x34,0x00,0x01,0x04,0x19,0x08,0x34,0x00,0x01,0x04,0x8d,0x08,0x34,0x00,0x01,0x05,0x98,0x08,0x34,0x00,0x01,0x01,0x90,0x01,0xfa,0x00,0x01,0x00,0x0c,0x01,0x0e,0x00,0x40,0x00,0x00,0x2b,0xce,0x00,0x00,\r\n0x2b,0xd4,0x00,0x00,0x2b,0xd4,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xe0,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xe6,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xec,0x00,0x00,0x2b,0xec,0x00,0x00,0x2b,0xf2,0x00,0x00,0x2b,0xda,0x00,0x00,\r\n0x2b,0xda,0x00,0x00,0x2b,0xf8,0x00,0x00,0x2b,0xfe,0x00,0x00,0x2c,0x04,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x10,0x00,0x00,0x2b,0xe0,0x00,0x00,0x2c,0x16,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x1c,0x00,0x00,0x2c,0x22,0x00,0x00,\r\n0x2c,0x28,0x00,0x00,0x2c,0x2e,0x00,0x00,0x2c,0x2e,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x34,0x00,0x00,0x2c,0x0a,0x00,0x00,0x2c,0x0a,0x00,0x00,\r\n0x2c,0x3a,0x00,0x00,0x2c,0x40,0x00,0x00,0x2b,0xda,0x00,0x00,0x2c,0x46,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x3a,0x00,0x00,0x2c,0x4c,0x00,0x00,0x2c,0x52,0x00,0x00,0x2c,0x52,0x00,0x00,0x2c,0x58,0x00,0x00,0x2c,0x58,0x00,0x00,0x2c,0x5e,0x00,0x00,0x2c,0x5e,0x00,0x00,0x2c,0x64,0x00,0x40,0x2b,0x68,0x2b,0x6e,\r\n0x2b,0x74,0x2b,0x7a,0x2b,0x80,0x2b,0x86,0x2b,0x8c,0x2b,0x92,0x2b,0x98,0x2b,0x9e,0x2b,0xa4,0x2b,0xaa,0x2b,0xb0,0x2b,0xaa,0x2b,0xaa,0x2b,0xaa,0x2b,0xb6,0x2b,0x92,0x2b,0xbc,0x2b,0xc2,0x2b,0xc2,0x2b,0xb6,0x2b,0xc8,0x2b,0xce,0x2b,0xd4,0x2b,0xda,0x2b,0xe0,0x2b,0xaa,0x2b,0xe6,0x2b,0xec,0x2b,0xf2,0x2b,0xf8,0x2b,0xfe,0x2c,0x04,\r\n0x2c,0x0a,0x2c,0x0a,0x2c,0x10,0x2c,0x10,0x2c,0x16,0x2c,0x10,0x2c,0x10,0x2c,0x10,0x2c,0x1c,0x2c,0x1c,0x2c,0x10,0x2c,0x10,0x2c,0x22,0x2c,0x10,0x2c,0x10,0x2c,0x28,0x2c,0x2e,0x2b,0xb6,0x2c,0x2e,0x2c,0x34,0x2c,0x3a,0x2c,0x3a,0x2b,0x92,0x2c,0x40,0x2c,0x40,0x2c,0x46,0x2c,0x46,0x2c,0x4c,0x2c,0x4c,0x2c,0x52,0x00,0x02,0x00,0x11,\r\n0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79,0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,\r\n0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f,0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x02,0x00,0x11,0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79,\r\n0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f,\r\n0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x01,0x01,0x12,0x01,0x6a,0x00,0x01,0x00,0x0c,0x00,0xba,0x00,0x2b,0x00,0x00,0x2a,0xf6,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x02,0x00,0x00,0x2b,0x08,0x00,0x00,0x2b,0x0e,0x00,0x00,0x2b,0x14,0x00,0x00,0x2b,0x14,0x00,0x00,\r\n0x2b,0x14,0x00,0x00,0x2b,0x1a,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x20,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x20,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x26,0x00,0x00,0x2b,0x2c,0x00,0x00,0x2b,0x32,0x00,0x00,\r\n0x2b,0x38,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x3e,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x44,0x00,0x00,0x2b,0x4a,0x00,0x00,0x2a,0xfc,0x00,0x00,0x2b,0x50,0x00,0x00,0x2b,0x56,0x00,0x00,0x2b,0x5c,0x00,0x00,0x2b,0x62,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x68,0x00,0x00,0x2b,0x6e,0x00,0x00,0x2b,0x26,0x00,0x00,\r\n0x2b,0x74,0x00,0x00,0x2b,0x7a,0x00,0x00,0x2b,0x80,0x00,0x2b,0x2a,0xd8,0x2a,0xde,0x2a,0xde,0x2a,0xde,0x2a,0xde,0x2a,0xe4,0x2a,0xde,0x2a,0xde,0x2a,0xe4,0x2a,0xea,0x2a,0xf0,0x2a,0xf6,0x2a,0xe4,0x2a,0xfc,0x2a,0xe4,0x2b,0x02,0x2a,0xde,0x2a,0xde,0x2b,0x08,0x2b,0x0e,0x2b,0x14,0x2b,0x1a,0x2b,0x20,0x2b,0x26,0x2a,0xe4,0x2a,0xe4,\r\n0x2b,0x2c,0x2b,0x14,0x2b,0x32,0x2b,0x38,0x2a,0xfc,0x2a,0xde,0x2a,0xe4,0x2a,0xe4,0x2b,0x3e,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xe4,0x2a,0xde,0x2b,0x44,0x2b,0x4a,0x00,0x02,0x00,0x0e,0x02,0x45,0x02,0x45,0x00,0x00,0x04,0x75,0x04,0x78,0x00,0x01,0x04,0x7b,0x04,0x7f,0x00,0x05,0x04,0x82,0x04,0x84,0x00,0x0a,0x04,0x87,\r\n0x04,0x91,0x00,0x0d,0x04,0x97,0x04,0x9a,0x00,0x18,0x04,0xa3,0x04,0xa3,0x00,0x1c,0x04,0xa5,0x04,0xa7,0x00,0x1d,0x04,0xab,0x04,0xac,0x00,0x20,0x07,0x58,0x07,0x5b,0x00,0x22,0x07,0xed,0x07,0xee,0x00,0x26,0x08,0x4e,0x08,0x4e,0x00,0x28,0x0a,0xe1,0x0a,0xe1,0x00,0x29,0x0a,0xe3,0x0a,0xe3,0x00,0x2a,0x00,0x02,0x00,0x0e,0x02,0x45,\r\n0x02,0x45,0x00,0x00,0x04,0x75,0x04,0x78,0x00,0x01,0x04,0x7b,0x04,0x7f,0x00,0x05,0x04,0x82,0x04,0x84,0x00,0x0a,0x04,0x87,0x04,0x91,0x00,0x0d,0x04,0x97,0x04,0x9a,0x00,0x18,0x04,0xa3,0x04,0xa3,0x00,0x1c,0x04,0xa5,0x04,0xa7,0x00,0x1d,0x04,0xab,0x04,0xac,0x00,0x20,0x07,0x58,0x07,0x5b,0x00,0x22,0x07,0xed,0x07,0xee,0x00,0x26,\r\n0x08,0x4e,0x08,0x4e,0x00,0x28,0x0a,0xe1,0x0a,0xe1,0x00,0x29,0x0a,0xe3,0x0a,0xe3,0x00,0x2a,0x00,0x01,0x00,0x18,0x00,0x1e,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x27,0xb4,0x00,0x02,0x2a,0x36,0x2a,0x3c,0x00,0x01,0x00,0x01,0x04,0x64,0x00,0x01,0x00,0x02,0x02,0xcf,0x02,0xd0,0x00,0x01,0x0e,0xec,0x0f,0x62,0x00,0x02,\r\n0x00,0x0c,0x01,0xca,0x00,0x6f,0x00,0x00,0x2a,0x22,0x00,0x00,0x2a,0x28,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0x34,0x00,0x00,0x2a,0x3a,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0x40,0x00,0x00,0x2a,0x40,0x00,0x00,0x2a,0x46,0x00,0x00,0x2a,0x22,0x00,0x00,0x2a,0x4c,0x00,0x00,0x2a,0x52,0x00,0x01,0x2a,0x58,0x00,0x00,0x2a,0x5e,0x00,0x01,\r\n0x2a,0x64,0x00,0x00,0x2a,0x4c,0x00,0x00,0x2a,0x52,0x00,0x00,0x2a,0x6a,0x00,0x00,0x2a,0x70,0x00,0x00,0x2a,0x76,0x00,0x00,0x2a,0x7c,0x00,0x00,0x2a,0x82,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0x8e,0x00,0x01,0x2a,0x94,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0x9a,0x00,0x00,0x2a,0x88,0x00,0x01,0x2a,0xa0,0x00,0x00,0x2a,0xa6,0x00,0x01,\r\n0x2a,0xac,0x00,0x00,0x2a,0xb2,0x00,0x00,0x2a,0xb8,0x00,0x00,0x2a,0xbe,0x00,0x00,0x2a,0xc4,0x00,0x00,0x2a,0xca,0x00,0x01,0x2a,0xd0,0x00,0x00,0x2a,0x3a,0x00,0x00,0x2a,0x88,0x00,0x00,0x2a,0xd6,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xe2,0x00,0x00,0x2a,0xe8,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xe8,0x00,0x00,0x2a,0x22,0x00,0x00,\r\n0x2a,0x22,0x00,0x00,0x2a,0x22,0x00,0x01,0x2a,0xee,0x00,0x00,0x2a,0xf4,0x00,0x00,0x2a,0xfa,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x06,0x00,0x00,0x2a,0x22,0x00,0x00,0x2b,0x0c,0x00,0x01,0x2a,0x2e,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2b,0x12,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2a,0xdc,0x00,0x00,0x2b,0x18,0x00,0x00,0x2b,0x1e,0x00,0x00,\r\n0x2b,0x18,0x00,0x00,0x2b,0x1e,0x00,0x00,0x2b,0x1e,0x00,0x01,0x2b,0x24,0x00,0x01,0x2b,0x24,0x00,0x00,0x2b,0x2a,0x00,0x00,0x2b,0x2a,0x00,0x01,0x2b,0x30,0x00,0x00,0x2b,0x36,0x00,0x00,0x2b,0x3c,0x00,0x01,0x2b,0x42,0x00,0x00,0x2b,0x48,0x00,0x00,0x2b,0x4e,0x00,0x00,0x2b,0x54,0x00,0x01,0x2b,0x5a,0x00,0x01,0x2b,0x60,0x00,0x01,\r\n0x2b,0x66,0x00,0x00,0x2b,0x6c,0x00,0x00,0x2b,0x72,0x00,0x01,0x2b,0x78,0x00,0x00,0x2b,0x7e,0x00,0x00,0x2b,0x54,0x00,0x00,0x2b,0x54,0x00,0x01,0x2b,0x84,0x00,0x00,0x2b,0x48,0x00,0x00,0x2b,0x8a,0x00,0x01,0x2b,0x90,0x00,0x01,0x2b,0x90,0x00,0x00,0x2b,0x36,0x00,0x00,0x2b,0x96,0x00,0x00,0x2b,0x9c,0x00,0x00,0x2b,0x6c,0x00,0x00,\r\n0x2b,0xa2,0x00,0x00,0x2b,0xa8,0x00,0x00,0x2b,0xae,0x00,0x00,0x2b,0xb4,0x00,0x00,0x2b,0xba,0x00,0x00,0x2b,0xc0,0x00,0x00,0x2b,0xc6,0x00,0x01,0x2b,0xcc,0x00,0x00,0x2b,0xd2,0x00,0x00,0x2b,0xd8,0x00,0x00,0x2b,0xde,0x00,0x00,0x2b,0xe4,0x00,0x00,0x2b,0xea,0x00,0x00,0x2b,0xf0,0x00,0x00,0x2b,0xf6,0x00,0x00,0x2b,0xfc,0x00,0x01,\r\n0x2c,0x02,0x03,0x48,0x2a,0x4a,0x2a,0x50,0x2a,0x56,0x2a,0x50,0x2a,0x5c,0x2a,0x50,0x2a,0x4a,0x2a,0x62,0x2a,0x68,0x2a,0x6e,0x2a,0x74,0x2a,0x7a,0x2a,0x80,0x2a,0x7a,0x2a,0x86,0x2a,0x8c,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0xa4,0x2a,0x9e,0x2a,0xaa,0x2a,0x98,0x2a,0xb0,0x2a,0xb6,0x2a,0xbc,0x2a,0xb6,\r\n0x2a,0xc2,0x2a,0xc8,0x2a,0xc2,0x2a,0xc8,0x2a,0xce,0x2a,0xd4,0x2a,0xda,0x2a,0xd4,0x2a,0xe0,0x2a,0xe6,0x2a,0xec,0x2a,0xd4,0x2a,0xf2,0x2a,0xd4,0x2a,0xf8,0x2a,0xe6,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2b,0x0a,0x2b,0x04,0x2b,0x0a,0x2b,0x04,0x2b,0x10,0x2b,0x16,0x2b,0x1c,0x2b,0x22,0x2b,0x28,0x2b,0x2e,0x2b,0x34,0x2a,0x7a,\r\n0x2b,0x3a,0x2b,0x40,0x2b,0x46,0x2b,0x4c,0x2b,0x52,0x2b,0x58,0x2a,0x68,0x2b,0x5e,0x2b,0x64,0x2b,0x6a,0x2b,0x70,0x2b,0x58,0x2b,0x64,0x2b,0x76,0x2b,0x7c,0x2a,0x7a,0x2b,0x82,0x2b,0x88,0x2b,0x8e,0x2b,0x94,0x2a,0x5c,0x2b,0x9a,0x2a,0x56,0x2b,0x9a,0x2b,0xa0,0x2b,0xa6,0x2a,0x4a,0x2a,0x62,0x2b,0xac,0x2b,0xb2,0x2a,0x4a,0x2b,0x9a,\r\n0x2b,0xb8,0x2b,0xbe,0x2b,0xc4,0x2b,0xca,0x2b,0xd0,0x2b,0xd6,0x2b,0xdc,0x2b,0xd6,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0xaa,0x2a,0x98,0x2b,0xe2,0x2b,0xe8,0x2b,0xee,0x2b,0xe8,0x2b,0xf4,0x2b,0xfa,0x2c,0x00,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x2c,0x12,0x2c,0x18,0x2c,0x12,0x2c,0x18,0x2c,0x1e,0x2c,0x24,\r\n0x2c,0x1e,0x2c,0x24,0x2c,0x2a,0x2a,0xe6,0x2c,0x30,0x2a,0xe6,0x2c,0x36,0x2c,0x3c,0x2c,0x42,0x2c,0x48,0x2c,0x4e,0x2c,0x54,0x2c,0x5a,0x2c,0x60,0x2c,0x66,0x2c,0x6c,0x2c,0x72,0x2c,0x78,0x2c,0x7e,0x2c,0x84,0x2c,0x8a,0x2b,0xca,0x2c,0x90,0x2b,0xa6,0x2c,0x96,0x2c,0x9c,0x2c,0x96,0x2c,0xa2,0x2a,0x68,0x2a,0x7a,0x2c,0xa8,0x2b,0x04,\r\n0x2c,0xa8,0x2b,0x04,0x2b,0xb8,0x2b,0xd6,0x2b,0x1c,0x2b,0x16,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2c,0xb4,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,0x2c,0xc0,0x2b,0xfa,0x2c,0xc6,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x2c,0x96,0x2c,0x9c,0x2b,0x64,0x2b,0x76,0x2a,0x68,0x2b,0x5e,\r\n0x2c,0xde,0x2b,0x58,0x2c,0xe4,0x2b,0xca,0x2c,0x66,0x2c,0x6c,0x2c,0xea,0x2b,0xd6,0x2c,0xf0,0x2a,0x7a,0x2c,0xf6,0x2b,0xe8,0x2c,0xfc,0x2b,0xfa,0x2d,0x02,0x2c,0x84,0x2d,0x08,0x2b,0xca,0x2a,0x68,0x2d,0x0e,0x2d,0x14,0x2d,0x1a,0x2c,0xe4,0x2b,0xca,0x2b,0xc4,0x2b,0xca,0x2d,0x20,0x2d,0x26,0x2d,0x2c,0x2d,0x32,0x2d,0x38,0x2d,0x26,\r\n0x2d,0x3e,0x2d,0x32,0x2d,0x44,0x2c,0x48,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x2d,0x50,0x2d,0x56,0x2d,0x5c,0x2c,0x54,0x2d,0x62,0x2b,0x9a,0x2d,0x62,0x2a,0x50,0x2a,0x56,0x2b,0x9a,0x2a,0x56,0x2a,0x50,0x2a,0x4a,0x2d,0x68,0x2a,0x4a,0x2d,0x68,0x2a,0x4a,0x2b,0x9a,0x2a,0x4a,0x2a,0x50,0x2d,0x6e,0x2b,0xa6,0x2d,0x74,0x2d,0x7a,\r\n0x2d,0x80,0x2c,0x9c,0x2d,0x86,0x2b,0x76,0x2d,0x8c,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2d,0x98,0x2b,0xd0,0x2d,0x9e,0x2a,0x74,0x2d,0xa4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2d,0x98,0x2d,0xb0,0x2a,0x98,0x2d,0xb0,0x2a,0x98,\r\n0x2d,0xb6,0x2a,0x9e,0x2d,0xbc,0x2a,0x98,0x2d,0xbc,0x2a,0x98,0x2d,0xc2,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2a,0x8c,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,0x2d,0xc8,0x2a,0x98,0x2d,0xc8,0x2a,0x98,0x2d,0xc2,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,\r\n0x2b,0xe2,0x2d,0xce,0x2b,0xe2,0x2d,0xd4,0x2b,0xee,0x2d,0xd4,0x2b,0xee,0x2b,0xe8,0x2b,0xe2,0x2d,0xd4,0x2d,0xda,0x2b,0xe8,0x2d,0xda,0x2b,0xe8,0x2d,0xda,0x2b,0xe8,0x2d,0xe0,0x2b,0xfa,0x2b,0xf4,0x2b,0xfa,0x2b,0xf4,0x2d,0xe6,0x2b,0xf4,0x2d,0xec,0x2c,0x00,0x2d,0xe6,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0x06,0x2d,0xf2,\r\n0x2d,0xf8,0x2d,0xfe,0x2c,0x06,0x2e,0x04,0x2a,0xb0,0x2e,0x0a,0x2c,0x06,0x2e,0x04,0x2a,0xbc,0x2e,0x0a,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2e,0x16,0x2e,0x1c,0x2c,0x18,0x2e,0x22,0x2a,0xc8,0x2e,0x28,0x2c,0x24,0x2e,0x2e,0x2a,0xe6,0x2e,0x34,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,0x2e,0x40,0x2a,0xd4,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,\r\n0x2c,0xa8,0x2e,0x46,0x2c,0xa8,0x2e,0x46,0x2c,0x42,0x2c,0x48,0x2a,0xfe,0x2e,0x46,0x2a,0xfe,0x2e,0x46,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x4c,0x2c,0xa8,0x2e,0x4c,0x2d,0x44,0x2c,0x48,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x2e,0x52,0x2c,0x54,0x2e,0x58,0x2c,0x54,0x2e,0x5e,0x2e,0x64,0x2e,0x6a,0x2e,0x70,0x2c,0xc6,0x2c,0xcc,\r\n0x2b,0x10,0x2b,0x16,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x82,0x2c,0x60,0x2e,0x88,0x2b,0x16,0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2d,0x98,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x2e,0x8e,0x2c,0xcc,0x2e,0x94,0x2b,0x16,0x2c,0xd2,0x2e,0x9a,0x2c,0xd8,0x2e,0xa0,0x2c,0xd2,0x2e,0xa6,0x2c,0xd8,0x2d,0x98,0x2e,0xac,0x2c,0xcc,\r\n0x2e,0xb2,0x2b,0x16,0x2c,0x66,0x2c,0x6c,0x2e,0xb8,0x2b,0x22,0x2c,0x66,0x2c,0x6c,0x2e,0xbe,0x2b,0x22,0x2c,0x66,0x2c,0x6c,0x2e,0xc4,0x2b,0x22,0x2c,0x66,0x2e,0xca,0x2b,0x1c,0x2e,0xd0,0x2e,0xd6,0x2e,0xdc,0x2b,0x34,0x2a,0x6e,0x2e,0xe2,0x2c,0x84,0x2e,0xd6,0x2e,0xe8,0x2b,0x34,0x2d,0xa4,0x2e,0xee,0x2c,0x84,0x2a,0xaa,0x2a,0x98,\r\n0x2a,0xaa,0x2a,0x98,0x2a,0xa4,0x2c,0xba,0x2c,0x90,0x2b,0xa6,0x2e,0xf4,0x2e,0xfa,0x2f,0x00,0x2b,0xa6,0x2f,0x06,0x2b,0xa6,0x2f,0x0c,0x2b,0xa6,0x2f,0x00,0x2b,0xa6,0x2f,0x12,0x2b,0xa6,0x2f,0x18,0x2b,0xa6,0x2f,0x1e,0x2f,0x24,0x2f,0x2a,0x2b,0x88,0x2f,0x30,0x2c,0x9c,0x2f,0x36,0x2b,0x76,0x2f,0x3c,0x2b,0x5e,0x2f,0x12,0x2b,0xa6,\r\n0x2f,0x42,0x2f,0x48,0x2f,0x4e,0x2f,0x54,0x2f,0x42,0x2f,0x5a,0x2f,0x4e,0x2f,0x60,0x2c,0x06,0x2d,0xf2,0x2a,0xbc,0x2d,0xfe,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2f,0x66,0x2c,0x30,0x2a,0xe6,0x2f,0x6c,0x2a,0xe6,0x2a,0xec,0x2f,0x72,0x2a,0xf2,0x2f,0x72,0x2c,0x72,0x2f,0x78,0x2f,0x7e,0x2c,0xcc,0x2f,0x7e,0x2c,0xcc,0x2f,0x84,0x2f,0x8a,\r\n0x2f,0x90,0x2b,0xe8,0x2f,0x96,0x2b,0xe8,0x2d,0xe0,0x2b,0xfa,0x2d,0xe0,0x2b,0xfa,0x2f,0x9c,0x2b,0x40,0x2f,0xa2,0x2b,0x4c,0x2f,0xa8,0x2f,0xae,0x2f,0xb4,0x2f,0xba,0x2e,0xb8,0x2b,0x16,0x2e,0xbe,0x2b,0x16,0x2e,0xc4,0x2b,0x16,0x2b,0x1c,0x2e,0xd0,0x2b,0xb8,0x2f,0xc0,0x2a,0x68,0x2f,0xc6,0x2b,0xdc,0x2b,0xbe,0x2a,0x80,0x2a,0x6e,\r\n0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2c,0xb4,0x2b,0xd0,0x2d,0x92,0x2a,0x74,0x2c,0xb4,0x2b,0xd0,0x2e,0x9a,0x2b,0x34,0x2f,0xcc,0x2b,0xb8,0x2f,0xd2,0x2a,0x68,0x2f,0xd8,0x2f,0xde,0x2b,0xd6,0x2f,0x3c,0x2a,0x7a,0x2a,0xaa,0x2a,0x98,0x2a,0xaa,0x2a,0x98,0x2a,0xa4,0x2a,0x9e,0x2a,0x92,0x2a,0x98,0x2a,0x92,0x2a,0x98,0x2a,0x86,0x2c,0xba,\r\n0x2b,0xe2,0x2f,0xe4,0x2b,0xe2,0x2f,0xea,0x2b,0xf4,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2f,0xf0,0x2a,0xb6,0x2f,0xf6,0x2a,0xe6,0x2f,0xfc,0x2a,0xe6,0x2a,0xec,0x2a,0xd4,0x2a,0xf2,0x2a,0xd4,0x30,0x02,0x2a,0xe6,0x30,0x08,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,0x2e,0x40,0x2a,0xd4,0x30,0x02,0x2a,0xe6,0x30,0x08,0x2a,0xe6,0x2e,0x3a,0x2a,0xd4,\r\n0x2e,0x40,0x2a,0xd4,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x30,0x0e,0x2c,0xa8,0x30,0x0e,0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x4c,0x2c,0xa8,0x30,0x14,0x30,0x1a,0x2c,0xcc,0x2e,0x7c,0x2b,0x16,0x2e,0x7c,0x2b,0x16,0x30,0x20,0x2c,0xcc,0x2e,0x88,0x2b,0x16,0x2e,0x88,0x2b,0x16,0x2c,0xc6,0x2c,0xae,0x2b,0x10,0x30,0x26,0x2b,0x10,0x30,0x26,\r\n0x30,0x2c,0x2c,0x78,0x30,0x32,0x2b,0x2e,0x2c,0x72,0x30,0x38,0x2b,0x28,0x30,0x3e,0x2e,0xd6,0x30,0x44,0x2b,0x34,0x2b,0x5e,0x30,0x4a,0x2c,0x84,0x30,0x50,0x2a,0x7a,0x30,0x56,0x2c,0x84,0x30,0x5c,0x2a,0x7a,0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2c,0x6c,0x2b,0x1c,0x2b,0x22,0x2b,0x1c,0x2b,0x16,0x2c,0xc0,0x2b,0xfa,0x30,0x62,0x2b,0xfa,\r\n0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2b,0xf4,0x2b,0xfa,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0xfc,0x2b,0xfa,0x2d,0xe0,0x2b,0xfa,0x2b,0xf4,0x2b,0xfa,0x2b,0xf4,0x2d,0xe6,0x2b,0xf4,0x2d,0xec,0x2c,0x00,0x2d,0xe6,0x2c,0x00,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x2c,0xc0,0x2b,0xfa,0x30,0x62,0x2b,0xfa,0x30,0x68,0x30,0x6e,\r\n0x2b,0x64,0x30,0x74,0x2a,0x68,0x2d,0xa4,0x2a,0x68,0x2d,0xa4,0x2b,0xa0,0x2b,0xa6,0x2b,0x7c,0x2a,0x7a,0x2b,0xb8,0x2b,0xbe,0x2a,0x68,0x2a,0x6e,0x2b,0xd0,0x2b,0xd6,0x2a,0x74,0x2a,0x7a,0x2b,0xdc,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2a,0x86,0x2a,0x8c,0x2a,0x86,0x2a,0x9e,0x2a,0xa4,0x2a,0x9e,0x30,0x7a,0x2b,0xe8,0x30,0x80,0x2b,0xe8,\r\n0x2c,0x06,0x2c,0x0c,0x2a,0xb0,0x2a,0xb6,0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2c,0x12,0x2c,0x18,0x2a,0xc2,0x2a,0xc8,0x2c,0x12,0x2c,0x18,0x2a,0xc2,0x2a,0xc8,0x2c,0x1e,0x2c,0x24,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x2c,0x24,0x2c,0x1e,0x30,0x86,0x2c,0x1e,0x30,0x86,0x30,0x8c,0x2c,0x9c,0x30,0x92,0x2b,0x76,\r\n0x2a,0x74,0x2b,0x5e,0x2a,0x74,0x2b,0x5e,0x30,0x98,0x2c,0x9c,0x30,0x9e,0x2b,0x76,0x2a,0x80,0x2b,0x5e,0x2a,0x80,0x2b,0x5e,0x2c,0x42,0x2c,0x48,0x2c,0x4e,0x2c,0x54,0x2c,0x5a,0x2c,0x60,0x2b,0x10,0x2b,0x16,0x2c,0x72,0x2c,0x78,0x2b,0x28,0x2b,0x2e,0x2c,0x7e,0x2c,0x84,0x2b,0x34,0x2a,0x7a,0x30,0xa4,0x2a,0x9e,0x30,0xaa,0x2b,0x40,\r\n0x30,0xb0,0x30,0xb6,0x2c,0x90,0x2b,0xa6,0x2a,0x68,0x2a,0x7a,0x2a,0x68,0x2a,0x7a,0x2a,0x68,0x2b,0x5e,0x2b,0xb8,0x2b,0xd6,0x2a,0x68,0x2a,0x7a,0x2d,0x5c,0x2c,0x54,0x2c,0xa8,0x2b,0x04,0x2c,0xa8,0x2b,0x04,0x2d,0x6e,0x2b,0xa6,0x2d,0x74,0x2d,0x7a,0x30,0xbc,0x2a,0x7a,0x30,0xbc,0x2a,0x7a,0x2c,0xea,0x2b,0xd6,0x2c,0xf0,0x2a,0x7a,\r\n0x2d,0x8c,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2d,0x98,0x2b,0xd0,0x2d,0x9e,0x2a,0x74,0x2d,0xa4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2c,0xb4,0x2d,0xaa,0x2b,0xd6,0x2a,0x80,0x2a,0x7a,0x2b,0xb8,0x2c,0xae,0x2a,0x68,0x2d,0x98,0x2d,0xb6,0x2a,0x9e,0x2d,0xc2,0x2a,0x9e,\r\n0x2a,0x86,0x2a,0x8c,0x2a,0x86,0x2c,0xba,0x2d,0xc2,0x2a,0x9e,0x2a,0x86,0x2c,0xba,0x2a,0x86,0x2c,0xba,0x30,0xc2,0x2b,0xe8,0x30,0x7a,0x2d,0xce,0x30,0x7a,0x2d,0xd4,0x30,0x80,0x2d,0xd4,0x30,0x80,0x2b,0xe8,0x30,0x7a,0x2d,0xd4,0x30,0xc8,0x2b,0xe8,0x30,0xc8,0x2b,0xe8,0x30,0xc8,0x2b,0xe8,0x2c,0x06,0x2d,0xf2,0x2d,0xf8,0x2d,0xfe,\r\n0x2c,0x06,0x2e,0x04,0x2a,0xb0,0x2e,0x0a,0x2c,0x06,0x2e,0x04,0x2a,0xbc,0x2e,0x0a,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2e,0x16,0x2e,0x1c,0x2c,0x18,0x2e,0x22,0x2a,0xc8,0x2e,0x28,0x2c,0x24,0x2e,0x28,0x30,0x86,0x2e,0x28,0x30,0x86,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x2d,0x44,0x2c,0x48,0x2c,0x42,0x2c,0x48,\r\n0x2d,0x44,0x2c,0x48,0x2e,0x52,0x2c,0x54,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2e,0x58,0x2c,0x54,0x2d,0x4a,0x2b,0x04,0x2d,0x4a,0x2b,0x04,0x30,0xce,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2e,0x5e,0x2e,0x64,0x2e,0x6a,0x2e,0x70,0x30,0xce,0x2c,0xcc,0x2b,0x10,0x2b,0x16,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x82,0x2c,0x60,\r\n0x2e,0x88,0x2b,0x16,0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2d,0x98,0x2c,0xd2,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x30,0xd4,0x2c,0xcc,0x2c,0xd8,0x2b,0x16,0x30,0xda,0x2c,0xcc,0x2e,0x94,0x2b,0x16,0x30,0xd4,0x2e,0x9a,0x2c,0xd8,0x2e,0xa0,0x30,0xd4,0x2e,0xa6,0x2c,0xd8,0x2d,0x98,0x30,0xe0,0x2c,0xcc,0x2e,0xb2,0x2b,0x16,0x2c,0x66,0x2c,0x6c,\r\n0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2c,0x6c,0x2c,0x66,0x2e,0xca,0x30,0xe6,0x30,0xec,0x2b,0x34,0x2a,0x6e,0x2d,0x02,0x2c,0x84,0x2e,0xe2,0x2c,0x84,0x2c,0xf0,0x2a,0x7a,0x2c,0xf0,0x2a,0x7a,0x30,0xe6,0x2e,0xe8,0x2b,0x34,0x2d,0xa4,0x2e,0xee,0x2c,0x84,0x30,0xa4,0x2a,0x9e,0x30,0xb0,0x30,0xb6,0x2a,0xa4,0x2c,0xba,0x30,0xf2,0x2d,0x56,\r\n0x30,0xf8,0x2d,0x56,0x2c,0x90,0x2b,0xa6,0x2e,0xf4,0x2e,0xfa,0x2f,0x00,0x2b,0xa6,0x2f,0x06,0x2b,0xa6,0x2f,0x0c,0x2b,0xa6,0x2f,0x00,0x2b,0xa6,0x2f,0x12,0x2b,0xa6,0x2f,0x18,0x2b,0xa6,0x2a,0x68,0x2b,0x5e,0x2f,0x3c,0x2b,0x5e,0x2f,0x12,0x2b,0xa6,0x2a,0x68,0x2d,0x98,0x2a,0x68,0x2d,0x98,0x2a,0x68,0x2c,0xb4,0x2a,0x68,0x2c,0xb4,\r\n0x2c,0x06,0x2d,0xf2,0x2a,0xbc,0x2d,0xfe,0x2c,0x12,0x2e,0x10,0x2a,0xc2,0x2f,0x66,0x2b,0xb8,0x2f,0xc0,0x2a,0x68,0x2a,0x6e,0x2b,0xdc,0x2b,0xbe,0x2a,0x80,0x2a,0x6e,0x2b,0xb8,0x2d,0x92,0x2a,0x68,0x2c,0xb4,0x2b,0xd0,0x2d,0x92,0x2a,0x74,0x2c,0xb4,0x2b,0xd0,0x2e,0x9a,0x2b,0x34,0x2f,0xcc,0x2b,0xb8,0x2f,0xd2,0x2a,0x68,0x2f,0xd8,\r\n0x2f,0xde,0x2b,0xd6,0x2f,0x3c,0x2a,0x7a,0x2a,0xa4,0x2a,0x9e,0x2a,0x86,0x2c,0xba,0x30,0xfe,0x2f,0xe4,0x30,0x7a,0x2f,0xea,0x2b,0xf4,0x2b,0xfa,0x2c,0x06,0x2c,0x0c,0x2f,0xf0,0x2a,0xb6,0x2c,0x42,0x2c,0x48,0x2c,0x42,0x2c,0x48,0x31,0x04,0x2c,0xcc,0x31,0x0a,0x2c,0xcc,0x30,0xce,0x2c,0xae,0x30,0x2c,0x2c,0x78,0x30,0x32,0x2b,0x2e,\r\n0x2c,0x72,0x30,0x38,0x2b,0x28,0x30,0x3e,0x30,0xe6,0x31,0x10,0x2b,0x34,0x2b,0x5e,0x30,0x4a,0x2c,0x84,0x30,0x50,0x2a,0x7a,0x30,0x56,0x2c,0x84,0x30,0x5c,0x2a,0x7a,0x2c,0x06,0x2c,0x0c,0x2a,0xbc,0x2a,0xb6,0x2a,0x92,0x31,0x16,0x2a,0x92,0x31,0x16,0x2a,0x86,0x31,0x1c,0x2a,0x86,0x31,0x1c,0x2a,0x92,0x31,0x22,0x2a,0x92,0x31,0x22,\r\n0x31,0x28,0x31,0x2e,0x31,0x28,0x31,0x2e,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0x34,0x2a,0xb6,0x31,0x34,0x2a,0xb6,0x31,0x3a,0x2b,0xfa,0x31,0x3a,0x2b,0xfa,0x31,0x40,0x2a,0x98,0x31,0x40,0x2a,0x98,0x31,0x46,0x2a,0x9e,0x31,0x46,0x2a,0x9e,0x31,0x4c,0x31,0x52,0x31,0x4c,0x31,0x58,0x31,0x4c,0x31,0x52,0x31,0x4c,0x31,0x58,\r\n0x31,0x5e,0x2c,0x9c,0x31,0x64,0x2b,0x76,0x31,0x6a,0x2b,0x5e,0x31,0x6a,0x2b,0x5e,0x31,0x5e,0x2c,0x9c,0x31,0x64,0x2b,0x76,0x31,0x6a,0x2b,0x5e,0x31,0x6a,0x2b,0x5e,0x2f,0x42,0x31,0x70,0x31,0x76,0x31,0x70,0x2a,0x68,0x31,0x7c,0x2a,0x68,0x31,0x7c,0x31,0x82,0x31,0x88,0x31,0x82,0x31,0x88,0x31,0x8e,0x31,0x94,0x31,0x8e,0x31,0x94,\r\n0x31,0x9a,0x2d,0x26,0x31,0xa0,0x2d,0x32,0x31,0x9a,0x2d,0x26,0x31,0xa0,0x2d,0x32,0x2a,0x92,0x31,0x16,0x2a,0x92,0x31,0x16,0x2a,0x86,0x31,0xa6,0x2a,0x86,0x31,0xa6,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0xac,0x2a,0xb6,0x31,0xac,0x2a,0xb6,0x2c,0x06,0x2c,0x0c,0x2c,0x06,0x2c,0x0c,0x31,0xb2,0x2a,0xb6,0x31,0xb2,0x2a,0xb6,\r\n0x2e,0x76,0x2c,0x60,0x2e,0x76,0x2c,0x60,0x2e,0x7c,0x2b,0x16,0x2e,0x7c,0x2b,0x16,0x31,0xb8,0x31,0xbe,0x31,0xc4,0x31,0xbe,0x31,0xca,0x31,0xd0,0x31,0xca,0x31,0xbe,0x31,0xd6,0x31,0xbe,0x31,0xd6,0x31,0xbe,0x31,0xca,0x31,0xd0,0x31,0xdc,0x31,0xbe,0x31,0xe2,0x31,0xbe,0x31,0xe2,0x31,0xbe,0x31,0xe8,0x2a,0xd4,0x31,0xe8,0x2a,0xd4,\r\n0x31,0xee,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x31,0xf4,0x31,0xfa,0x31,0xf4,0x31,0xfa,0x31,0xe8,0x32,0x00,0x31,0xe8,0x32,0x00,0x31,0xee,0x32,0x00,0x31,0xee,0x32,0x00,0x31,0xee,0x31,0xfa,0x31,0xee,0x31,0xfa,0x32,0x06,0x2a,0xd4,0x32,0x06,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x31,0xee,0x2a,0xd4,0x32,0x0c,0x2a,0xd4,0x32,0x0c,0x2a,0xd4,\r\n0x32,0x12,0x2a,0xd4,0x32,0x12,0x2a,0xd4,0x32,0x18,0x2a,0xd4,0x32,0x18,0x2a,0xd4,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x2a,0xc8,0x32,0x1e,0x32,0x24,0x32,0x1e,0x32,0x24,0x32,0x2a,0x2a,0xc8,0x32,0x2a,0x2a,0xc8,0x32,0x1e,0x2e,0x16,0x32,0x1e,0x2e,0x16,0x32,0x30,0x32,0x36,0x32,0x30,0x32,0x3c,\r\n0x32,0x42,0x32,0x36,0x32,0x42,0x32,0x3c,0x32,0x48,0x32,0x36,0x32,0x48,0x32,0x3c,0x32,0x4e,0x32,0x36,0x32,0x4e,0x32,0x3c,0x32,0x30,0x32,0x54,0x32,0x30,0x32,0x5a,0x32,0x30,0x32,0x36,0x32,0x30,0x32,0x3c,0x32,0x60,0x32,0x66,0x32,0x6c,0x32,0x66,0x32,0x72,0x32,0x66,0x32,0x78,0x32,0x66,0x32,0x60,0x32,0x66,0x32,0x60,0x32,0x7e,\r\n0x32,0x60,0x32,0x84,0x32,0x6c,0x32,0x7e,0x32,0x6c,0x32,0x66,0x32,0x8a,0x32,0x66,0x32,0x78,0x32,0x66,0x32,0x60,0x32,0x66,0x32,0x8a,0x32,0x66,0x32,0x90,0x32,0x66,0x32,0x96,0x32,0x66,0x2b,0x82,0x2b,0x88,0x32,0x9c,0x2b,0x76,0x32,0xa2,0x2b,0x76,0x32,0xa8,0x2b,0x76,0x32,0xae,0x2b,0x76,0x32,0xae,0x32,0xb4,0x2d,0x86,0x2b,0x76,\r\n0x32,0xba,0x2b,0x88,0x2f,0x36,0x2b,0x76,0x31,0x76,0x32,0xc0,0x31,0x64,0x2b,0x76,0x31,0x64,0x2b,0x76,0x31,0x76,0x32,0xc6,0x31,0x76,0x32,0xcc,0x32,0xd2,0x2d,0x32,0x32,0xd2,0x2d,0x32,0x2d,0x3e,0x2d,0x32,0x2d,0x3e,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x31,0xa0,0x2d,0x32,0x32,0xae,0x2b,0x76,\r\n0x31,0x76,0x32,0xd8,0x32,0xae,0x32,0xde,0x32,0xe4,0x32,0xea,0x32,0xf0,0x32,0xf6,0x2b,0x52,0x2b,0x58,0x32,0x8a,0x32,0x66,0x32,0xfc,0x33,0x02,0x2a,0x68,0x33,0x08,0x32,0xfc,0x33,0x02,0x2a,0x68,0x33,0x08,0x33,0x0e,0x33,0x14,0x33,0x0e,0x33,0x14,0x33,0x1a,0x2a,0x8c,0x33,0x1a,0x2a,0x8c,0x33,0x20,0x2c,0x24,0x33,0x20,0x2c,0x24,\r\n0x33,0x20,0x2c,0x24,0x33,0x20,0x2c,0x24,0x2c,0x42,0x33,0x26,0x33,0x2c,0x33,0x32,0x33,0x2c,0x33,0x32,0x33,0x38,0x33,0x26,0x33,0x3e,0x33,0x44,0x33,0x4a,0x33,0x32,0x33,0x4a,0x33,0x32,0x33,0x3e,0x33,0x44,0x33,0x50,0x33,0x56,0x33,0x5c,0x32,0xea,0x33,0x5c,0x2b,0x16,0x33,0x50,0x33,0x56,0x33,0x62,0x33,0x68,0x33,0x6e,0x2b,0x2e,\r\n0x33,0x6e,0x2b,0x2e,0x33,0x62,0x33,0x68,0x33,0x74,0x33,0x7a,0x33,0x80,0x33,0x86,0x33,0x80,0x33,0x8c,0x33,0x92,0x33,0x98,0x33,0x9e,0x33,0x7a,0x33,0xa4,0x33,0x8c,0x33,0xa4,0x33,0x8c,0x33,0xaa,0x33,0x98,0x33,0xb0,0x33,0xb6,0x33,0xb0,0x33,0xb6,0x2c,0x90,0x33,0xbc,0x2c,0x90,0x33,0xbc,0x33,0xc2,0x33,0xc8,0x33,0xc2,0x33,0xc8,\r\n0x2b,0xd0,0x33,0x02,0x33,0x80,0x33,0x8c,0x33,0x80,0x33,0x8c,0x2b,0xd0,0x33,0x02,0x30,0x7a,0x33,0xce,0x30,0x7a,0x33,0xce,0x2c,0x12,0x33,0xd4,0x2a,0xc2,0x33,0xda,0x2a,0xc2,0x33,0xda,0x2c,0x12,0x33,0xd4,0x2c,0xd2,0x2c,0xcc,0x33,0xe0,0x2b,0x16,0x33,0xe0,0x2b,0x16,0x2c,0xd2,0x2c,0xcc,0x2c,0x90,0x33,0xe6,0x2c,0x90,0x33,0xe6,\r\n0x33,0xec,0x2b,0xfa,0x33,0xec,0x2b,0xfa,0x2c,0x2a,0x2a,0xe6,0x2c,0x5a,0x2c,0xae,0x33,0xf2,0x2b,0xbe,0x33,0xf2,0x2c,0xae,0x33,0xf2,0x2b,0xd6,0x33,0xf8,0x2b,0xfa,0x33,0xfe,0x2c,0xa2,0x2c,0x42,0x2c,0x48,0x2d,0x5c,0x2c,0x54,0x2d,0x02,0x2c,0x84,0x34,0x04,0x27,0x56,0x2a,0xe0,0x2a,0xe6,0x2a,0xda,0x34,0x0a,0x2a,0xce,0x34,0x10,\r\n0x2c,0x5a,0x2c,0xae,0x2b,0x10,0x2e,0xa0,0x2b,0x10,0x2e,0xa0,0x33,0xf2,0x2b,0xbe,0x34,0x16,0x2a,0x6e,0x34,0x16,0x2a,0x6e,0x33,0xf2,0x2c,0xae,0x34,0x16,0x2c,0xb4,0x34,0x16,0x2c,0xb4,0x33,0xf2,0x2b,0xd6,0x34,0x1c,0x2b,0x16,0x34,0x1c,0x2b,0x16,0x33,0xf8,0x2b,0xfa,0x34,0x22,0x2b,0x6a,0x2a,0x80,0x2b,0x5e,0x2a,0x80,0x2b,0x5e,\r\n0x2c,0x42,0x2c,0x48,0x2c,0xa8,0x2e,0x46,0x2c,0xa8,0x2e,0x46,0x2d,0x5c,0x2c,0x54,0x2a,0xfe,0x2b,0x04,0x2a,0xfe,0x2b,0x04,0x2d,0x02,0x2c,0x84,0x27,0x56,0x27,0x56,0x27,0x56,0x27,0x56,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,\r\n0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,\r\n0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x25,0x08,0xc7,0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe9,0x00,0x10,0x08,0xeb,0x08,0xf7,0x00,0x19,0x08,0xf9,0x08,0xf9,0x00,0x26,0x09,0x02,0x09,0x02,0x00,0x27,0x09,0x07,0x09,0x2b,\r\n0x00,0x28,0x09,0x3b,0x09,0x4e,0x00,0x4d,0x09,0x59,0x09,0x59,0x00,0x61,0x09,0x5b,0x09,0x68,0x00,0x62,0x09,0x6c,0x09,0x6e,0x00,0x70,0x09,0x72,0x09,0x72,0x00,0x73,0x09,0x7c,0x09,0x7c,0x00,0x74,0x09,0x80,0x09,0xf8,0x00,0x75,0x09,0xfa,0x0a,0x0e,0x00,0xee,0x0a,0x24,0x0a,0x2b,0x01,0x03,0x0a,0x2d,0x0a,0x2d,0x01,0x0b,0x0a,0x3e,\r\n0x0a,0x3f,0x01,0x0c,0x0a,0x43,0x0a,0x43,0x01,0x0e,0x0a,0x54,0x0a,0x5b,0x01,0x0f,0x0a,0x5f,0x0a,0x62,0x01,0x17,0x0a,0x72,0x0a,0xb7,0x01,0x1b,0x0b,0x0c,0x0b,0x18,0x01,0x61,0x0e,0x20,0x0e,0x3e,0x01,0x6e,0x0e,0x4b,0x0e,0x61,0x01,0x8d,0x0e,0x6e,0x0e,0x72,0x01,0xa4,0x0e,0x74,0x0e,0xd5,0x01,0xa9,0x0e,0xd7,0x0e,0xea,0x02,0x0b,\r\n0x0e,0xec,0x0f,0x4f,0x02,0x1f,0x0f,0x62,0x0f,0xc3,0x02,0x83,0x13,0x00,0x13,0x29,0x02,0xe5,0x14,0x04,0x14,0x07,0x03,0x0f,0x14,0x09,0x14,0x16,0x03,0x13,0x14,0x53,0x14,0x5c,0x03,0x21,0x14,0x6b,0x14,0x6b,0x03,0x2b,0x14,0x6d,0x14,0x7b,0x03,0x2c,0x14,0x7d,0x14,0x87,0x03,0x3b,0x14,0xad,0x14,0xae,0x03,0x46,0x00,0x01,0x02,0x2c,\r\n0x02,0xa2,0x00,0x02,0x00,0x0c,0x01,0xca,0x00,0x6f,0x00,0x00,0x19,0xde,0x00,0x00,0x19,0xe4,0x00,0x01,0x19,0xea,0x00,0x00,0x19,0xf0,0x00,0x00,0x19,0xf6,0x00,0x01,0x19,0xea,0x00,0x00,0x19,0xfc,0x00,0x00,0x19,0xfc,0x00,0x00,0x1a,0x02,0x00,0x00,0x19,0xde,0x00,0x00,0x1a,0x08,0x00,0x00,0x1a,0x0e,0x00,0x01,0x1a,0x14,0x00,0x00,\r\n0x1a,0x1a,0x00,0x01,0x1a,0x20,0x00,0x00,0x1a,0x08,0x00,0x00,0x1a,0x0e,0x00,0x00,0x1a,0x26,0x00,0x00,0x1a,0x2c,0x00,0x00,0x1a,0x32,0x00,0x00,0x1a,0x38,0x00,0x00,0x1a,0x3e,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x4a,0x00,0x01,0x1a,0x50,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x56,0x00,0x00,0x1a,0x44,0x00,0x01,0x1a,0x5c,0x00,0x00,\r\n0x1a,0x62,0x00,0x01,0x1a,0x68,0x00,0x00,0x1a,0x6e,0x00,0x00,0x1a,0x74,0x00,0x00,0x1a,0x7a,0x00,0x00,0x1a,0x80,0x00,0x00,0x1a,0x86,0x00,0x01,0x1a,0x8c,0x00,0x00,0x19,0xf6,0x00,0x00,0x1a,0x44,0x00,0x00,0x1a,0x92,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0x9e,0x00,0x00,0x1a,0xa4,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xa4,0x00,0x00,\r\n0x19,0xde,0x00,0x00,0x19,0xde,0x00,0x00,0x19,0xde,0x00,0x01,0x1a,0xaa,0x00,0x00,0x1a,0xb0,0x00,0x00,0x1a,0xb6,0x00,0x00,0x1a,0xbc,0x00,0x00,0x1a,0xc2,0x00,0x00,0x19,0xde,0x00,0x00,0x1a,0xc8,0x00,0x01,0x19,0xea,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xce,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0x98,0x00,0x00,0x1a,0xd4,0x00,0x00,\r\n0x1a,0xda,0x00,0x00,0x1a,0xd4,0x00,0x00,0x1a,0xda,0x00,0x00,0x1a,0xda,0x00,0x01,0x1a,0xe0,0x00,0x01,0x1a,0xe0,0x00,0x00,0x1a,0xe6,0x00,0x00,0x1a,0xe6,0x00,0x01,0x1a,0xec,0x00,0x00,0x1a,0xf2,0x00,0x00,0x1a,0xf8,0x00,0x01,0x1a,0xfe,0x00,0x00,0x1b,0x04,0x00,0x00,0x1b,0x0a,0x00,0x00,0x1b,0x10,0x00,0x01,0x1b,0x16,0x00,0x01,\r\n0x1b,0x1c,0x00,0x01,0x1b,0x22,0x00,0x00,0x1b,0x28,0x00,0x00,0x1b,0x2e,0x00,0x01,0x1b,0x34,0x00,0x00,0x1b,0x3a,0x00,0x00,0x1b,0x10,0x00,0x00,0x1b,0x10,0x00,0x01,0x1b,0x40,0x00,0x00,0x1b,0x04,0x00,0x00,0x1b,0x46,0x00,0x01,0x1b,0x4c,0x00,0x01,0x1b,0x4c,0x00,0x00,0x1a,0xf2,0x00,0x00,0x1b,0x52,0x00,0x00,0x1b,0x58,0x00,0x00,\r\n0x1b,0x28,0x00,0x00,0x1b,0x5e,0x00,0x00,0x1b,0x64,0x00,0x00,0x1b,0x6a,0x00,0x00,0x1b,0x70,0x00,0x00,0x1b,0x76,0x00,0x00,0x1b,0x7c,0x00,0x00,0x1b,0x82,0x00,0x01,0x1b,0x88,0x00,0x00,0x1b,0x8e,0x00,0x00,0x1b,0x94,0x00,0x00,0x1b,0x9a,0x00,0x00,0x1b,0xa0,0x00,0x00,0x1b,0xa6,0x00,0x00,0x1b,0xac,0x00,0x00,0x1b,0xb2,0x00,0x00,\r\n0x1b,0xb8,0x00,0x01,0x1b,0xbe,0x00,0x05,0x00,0x0c,0x00,0x1a,0x00,0x2c,0x00,0x3e,0x00,0x50,0x00,0x03,0x23,0xd8,0x23,0xde,0x23,0xe4,0x23,0xea,0x1b,0x02,0x1b,0x08,0x00,0x04,0x23,0xe2,0x23,0xe8,0x23,0xca,0x23,0xd0,0x23,0xd6,0x23,0xdc,0x1a,0xf4,0x1a,0xfa,0x00,0x04,0x23,0xdc,0x23,0xe2,0x23,0xe8,0x23,0xee,0x23,0xf4,0x23,0xfa,\r\n0x1b,0xf6,0x1b,0xfc,0x00,0x04,0x23,0xee,0x23,0xf4,0x23,0xa6,0x23,0xac,0x23,0xb2,0x23,0xb8,0x1a,0xd0,0x1a,0xd6,0x00,0x04,0x23,0xdc,0x23,0xe2,0x23,0xe8,0x23,0x9a,0x23,0xee,0x23,0xa6,0x1a,0xbe,0x1a,0xc4,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,\r\n0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,\r\n0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x03,0x09,0x71,0x09,0x71,0x00,0x00,0x0a,0x63,0x0a,0x64,0x00,0x01,0x14,0x97,0x14,0x98,0x00,0x03,0x00,0x01,0x02,0x20,0x02,0xd2,0x00,0x01,0x00,0x0c,0x01,0x6e,\r\n0x00,0x58,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x2c,0x00,0x00,0x17,0x38,0x00,0x00,0x17,0x3e,0x00,0x00,0x17,0x44,0x00,0x00,0x17,0x44,0x00,0x00,0x17,0x4a,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x50,0x00,0x00,0x17,0x56,0x00,0x00,0x17,0x62,0x00,0x00,0x17,0x50,0x00,0x00,0x17,0x56,0x00,0x00,0x17,0x6e,0x00,0x00,0x17,0x74,0x00,0x00,\r\n0x17,0x7a,0x00,0x00,0x17,0x80,0x00,0x00,0x17,0x86,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0x92,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0x9e,0x00,0x00,0x17,0x8c,0x00,0x00,0x17,0xaa,0x00,0x00,0x17,0xb6,0x00,0x00,0x17,0xbc,0x00,0x00,0x17,0xc2,0x00,0x00,0x17,0xc8,0x00,0x00,0x17,0xce,0x00,0x00,0x17,0x3e,0x00,0x00,0x17,0x8c,0x00,0x00,\r\n0x17,0xda,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xe6,0x00,0x00,0x17,0xec,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xec,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0x26,0x00,0x00,0x17,0xf8,0x00,0x00,0x17,0xfe,0x00,0x00,0x18,0x04,0x00,0x00,0x18,0x0a,0x00,0x00,0x17,0x26,0x00,0x00,0x18,0x10,0x00,0x00,0x17,0xe0,0x00,0x00,\r\n0x18,0x16,0x00,0x00,0x17,0xe0,0x00,0x00,0x17,0xe0,0x00,0x00,0x18,0x1c,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x1c,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x22,0x00,0x00,0x18,0x2e,0x00,0x00,0x18,0x2e,0x00,0x00,0x18,0x3a,0x00,0x00,0x18,0x40,0x00,0x00,0x18,0x4c,0x00,0x00,0x18,0x52,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x70,0x00,0x00,\r\n0x18,0x76,0x00,0x00,0x18,0x82,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x58,0x00,0x00,0x18,0x4c,0x00,0x00,0x18,0x8e,0x00,0x00,0x18,0x3a,0x00,0x00,0x18,0x9a,0x00,0x00,0x18,0xa0,0x00,0x00,0x18,0x70,0x00,0x00,0x18,0xa6,0x00,0x00,0x18,0xac,0x00,0x00,0x18,0xb2,0x00,0x00,0x18,0xb8,0x00,0x00,0x18,0xbe,0x00,0x00,0x18,0xc4,0x00,0x00,\r\n0x18,0xca,0x00,0x00,0x18,0xd6,0x00,0x00,0x18,0xdc,0x00,0x00,0x18,0xe2,0x00,0x00,0x18,0xe8,0x00,0x00,0x18,0xee,0x00,0x00,0x18,0xf4,0x00,0x00,0x18,0xfa,0x00,0x00,0x19,0x00,0x00,0x58,0x21,0xe8,0x21,0xee,0x21,0xf4,0x21,0xfa,0x21,0xe8,0x22,0x00,0x22,0x06,0x22,0x0c,0x22,0x12,0x22,0x18,0x22,0x1e,0x22,0x24,0x22,0x2a,0x22,0x30,\r\n0x22,0x36,0x22,0x3c,0x22,0x42,0x22,0x36,0x22,0x48,0x22,0x4e,0x22,0x06,0x22,0x54,0x22,0x5a,0x22,0x0c,0x22,0x60,0x22,0x66,0x22,0x6c,0x22,0x72,0x22,0x78,0x22,0x7e,0x22,0x84,0x22,0x8a,0x22,0x90,0x22,0x96,0x22,0x90,0x22,0x84,0x22,0x9c,0x22,0xa2,0x22,0x42,0x22,0x42,0x22,0xa8,0x22,0xae,0x22,0xb4,0x22,0xba,0x22,0xc0,0x22,0xc6,\r\n0x22,0x9c,0x22,0xcc,0x22,0xcc,0x22,0x84,0x22,0xd2,0x22,0xd8,0x22,0xde,0x22,0xe4,0x22,0xea,0x22,0xf0,0x22,0xf6,0x22,0xfc,0x23,0x02,0x23,0x08,0x23,0x0e,0x23,0x14,0x23,0x1a,0x23,0x20,0x23,0x26,0x23,0x2c,0x23,0x32,0x23,0x38,0x23,0x3e,0x23,0x44,0x23,0x4a,0x23,0x50,0x23,0x56,0x23,0x5c,0x22,0xe4,0x23,0x62,0x23,0x68,0x23,0x6e,\r\n0x23,0x74,0x23,0x7a,0x23,0x80,0x23,0x86,0x23,0x8c,0x23,0x92,0x23,0x98,0x23,0x9e,0x23,0xa4,0x23,0xaa,0x00,0x02,0x00,0x1d,0x09,0x2c,0x09,0x2d,0x00,0x00,0x09,0x2f,0x09,0x30,0x00,0x02,0x09,0x32,0x09,0x33,0x00,0x04,0x09,0x37,0x09,0x37,0x00,0x06,0x09,0x73,0x09,0x75,0x00,0x07,0x09,0x7e,0x09,0x7e,0x00,0x0a,0x0a,0x0f,0x0a,0x13,\r\n0x00,0x0b,0x0a,0x16,0x0a,0x19,0x00,0x10,0x0a,0x1b,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x15,0x0a,0x22,0x0a,0x22,0x00,0x17,0x0a,0x4b,0x0a,0x4f,0x00,0x18,0x0a,0x51,0x0a,0x53,0x00,0x1d,0x0a,0x65,0x0a,0x69,0x00,0x20,0x0a,0x6c,0x0a,0x6e,0x00,0x25,0x0a,0x70,0x0a,0x71,0x00,0x28,0x0e,0x1a,0x0e,0x1d,0x00,0x2a,0x0e,0x62,\r\n0x0e,0x6a,0x00,0x2e,0x13,0x2a,0x13,0x2b,0x00,0x37,0x13,0x2d,0x13,0x2e,0x00,0x39,0x13,0x30,0x13,0x32,0x00,0x3b,0x13,0x36,0x13,0x37,0x00,0x3e,0x13,0x39,0x13,0x3b,0x00,0x40,0x13,0x3d,0x13,0x3e,0x00,0x43,0x13,0x41,0x13,0x44,0x00,0x45,0x13,0xe9,0x13,0xe9,0x00,0x49,0x14,0x17,0x14,0x17,0x00,0x4a,0x14,0x5d,0x14,0x61,0x00,0x4b,\r\n0x14,0x63,0x14,0x6a,0x00,0x50,0x00,0x02,0x00,0x1d,0x09,0x2c,0x09,0x2d,0x00,0x00,0x09,0x2f,0x09,0x30,0x00,0x02,0x09,0x32,0x09,0x33,0x00,0x04,0x09,0x37,0x09,0x37,0x00,0x06,0x09,0x73,0x09,0x75,0x00,0x07,0x09,0x7e,0x09,0x7e,0x00,0x0a,0x0a,0x0f,0x0a,0x13,0x00,0x0b,0x0a,0x16,0x0a,0x19,0x00,0x10,0x0a,0x1b,0x0a,0x1b,0x00,0x14,\r\n0x0a,0x1e,0x0a,0x1f,0x00,0x15,0x0a,0x22,0x0a,0x22,0x00,0x17,0x0a,0x4b,0x0a,0x4f,0x00,0x18,0x0a,0x51,0x0a,0x53,0x00,0x1d,0x0a,0x65,0x0a,0x69,0x00,0x20,0x0a,0x6c,0x0a,0x6e,0x00,0x25,0x0a,0x70,0x0a,0x71,0x00,0x28,0x0e,0x1a,0x0e,0x1d,0x00,0x2a,0x0e,0x62,0x0e,0x6a,0x00,0x2e,0x13,0x2a,0x13,0x2b,0x00,0x37,0x13,0x2d,0x13,0x2e,\r\n0x00,0x39,0x13,0x30,0x13,0x32,0x00,0x3b,0x13,0x36,0x13,0x37,0x00,0x3e,0x13,0x39,0x13,0x3b,0x00,0x40,0x13,0x3d,0x13,0x3e,0x00,0x43,0x13,0x41,0x13,0x44,0x00,0x45,0x13,0xe9,0x13,0xe9,0x00,0x49,0x14,0x17,0x14,0x17,0x00,0x4a,0x14,0x5d,0x14,0x61,0x00,0x4b,0x14,0x63,0x14,0x6a,0x00,0x50,0x00,0x01,0x00,0x9a,0x01,0x10,0x00,0x01,\r\n0x00,0x0c,0x00,0x6a,0x00,0x17,0x00,0x00,0x13,0xae,0x00,0x00,0x13,0xae,0x00,0x00,0x13,0xd8,0x00,0x00,0x13,0xe4,0x00,0x00,0x14,0x14,0x00,0x00,0x14,0x20,0x00,0x00,0x14,0x2c,0x00,0x00,0x14,0x50,0x00,0x00,0x14,0x6e,0x00,0x00,0x13,0xae,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xb0,0x00,0x00,0x14,0xc2,0x00,0x00,\r\n0x14,0xda,0x00,0x00,0x14,0xe0,0x00,0x00,0x14,0xe6,0x00,0x00,0x14,0xf8,0x00,0x00,0x15,0x04,0x00,0x00,0x15,0x10,0x00,0x00,0x15,0x10,0x00,0x00,0x15,0x4c,0x00,0x00,0x15,0x82,0x00,0x17,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x42,0x21,0x4e,0x21,0x42,0x21,0x54,0x21,0x36,0x21,0x42,0x21,0x5a,0x21,0x60,0x21,0x66,\r\n0x21,0x6c,0x21,0x72,0x21,0x78,0x21,0x7e,0x21,0x84,0x21,0x8a,0x21,0x8a,0x21,0x90,0x21,0x96,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,\r\n0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f,0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,\r\n0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f,\r\n0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x01,\r\n0x00,0x32,0x00,0x38,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,0x11,0x0e,0x00,0x0f,0x20,0x6e,0x20,0x74,0x20,0x7a,0x20,0x80,0x20,0x86,0x20,0x8c,0x20,0x92,0x20,0x98,0x20,0x9e,0x20,0xa4,0x20,0xaa,0x20,0xb0,0x20,0x7a,0x20,0xb6,0x20,0xbc,0x00,0x01,0x00,0x01,0x0b,0x5e,0x00,0x02,0x00,0x07,0x0a,0x43,0x0a,0x43,0x00,0x00,\r\n0x0b,0x6f,0x0b,0x6f,0x00,0x01,0x0b,0x75,0x0b,0x75,0x00,0x02,0x0b,0x77,0x0b,0x77,0x00,0x03,0x0b,0x7a,0x0b,0x7a,0x00,0x04,0x0b,0x7d,0x0b,0x7d,0x00,0x05,0x0b,0x8d,0x0b,0x95,0x00,0x06,0x00,0x01,0x02,0xc8,0x02,0xe4,0x00,0x04,0x00,0x0c,0x00,0x46,0x00,0x0e,0x00,0x00,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x02,\r\n0x10,0xa8,0x00,0x00,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x02,0x10,0xa8,0x00,0x01,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x03,0x10,0xa8,0x00,0x50,0x20,0x28,0x20,0x2e,0x20,0x34,0x20,0x3a,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x58,0x20,0x5e,\r\n0x20,0x64,0x20,0x6a,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x20,0xb8,0x20,0xbe,0x20,0xc4,0x20,0xca,0x20,0xd0,0x20,0xd6,0x20,0xdc,0x20,0xe2,0x20,0xe8,0x20,0xee,0x20,0xf4,0x20,0xfa,0x21,0x00,0x21,0x06,0x21,0x0c,0x21,0x12,0x20,0xb8,0x20,0xbe,\r\n0x20,0xc4,0x20,0xca,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x20,0xc4,0x21,0x78,0x21,0x7e,0x21,0x84,0x21,0x8a,0x21,0x90,0x21,0x42,0x21,0x96,0x21,0x9c,0x21,0xa2,\r\n0x21,0xa8,0x21,0xae,0x21,0xb4,0x21,0xba,0x21,0x72,0x21,0xc0,0x21,0xc6,0x21,0xa8,0x21,0xcc,0x21,0xd2,0x21,0xd8,0x21,0xde,0x21,0xe4,0x21,0xea,0x21,0xf0,0x21,0xf6,0x21,0xfc,0x22,0x02,0x22,0x08,0x22,0x0e,0x21,0xc0,0x20,0x9a,0x22,0x14,0x22,0x1a,0x22,0x20,0x22,0x26,0x22,0x2c,0x22,0x32,0x22,0x38,0x22,0x3e,0x22,0x44,0x22,0x4a,\r\n0x22,0x50,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x22,0x6e,0x22,0x74,0x22,0x7a,0x22,0x80,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x18,0x21,0x1e,0x21,0x24,0x21,0x2a,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x48,0x21,0x4e,\r\n0x21,0x54,0x21,0x5a,0x22,0x86,0x22,0x8c,0x22,0x92,0x22,0x98,0x22,0x9e,0x22,0xa4,0x22,0xaa,0x22,0xb0,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x10,0x68,0x22,0xb6,0x20,0x9a,0x22,0xbc,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,\r\n0x21,0x6c,0x21,0x72,0x22,0x2c,0x22,0x32,0x22,0xc2,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x20,0x40,0x20,0x46,0x20,0x4c,0x20,0x52,0x20,0x58,0x20,0x5e,\r\n0x20,0x64,0x20,0x6a,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x22,0xc8,0x22,0xce,0x22,0xd4,0x22,0xda,0x22,0xe0,0x22,0xe6,0x22,0xec,0x20,0xdc,0x21,0x00,0x21,0x06,0x21,0x0c,0x21,0x12,0x22,0xc8,0x22,0xce,0x22,0xd4,0x22,0xda,0x21,0x18,0x21,0x1e,\r\n0x21,0x24,0x21,0x2a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0x48,0x21,0x4e,0x21,0x54,0x21,0x5a,0x21,0x60,0x21,0x66,0x21,0x6c,0x21,0x72,0x21,0x8a,0x21,0x90,0x21,0x42,0x21,0x96,0x21,0x9c,0x21,0xa2,0x21,0xa8,0x21,0xae,0x21,0xc6,0x21,0xa8,0x21,0xcc,0x21,0xd2,0x21,0xd8,0x21,0xde,0x21,0xe4,0x21,0xea,0x22,0x08,0x22,0x0e,\r\n0x21,0xc0,0x20,0x9a,0x22,0x14,0x22,0x1a,0x22,0x20,0x22,0x26,0x22,0x2c,0x22,0x32,0x22,0x38,0x22,0x3e,0x22,0x44,0x22,0x4a,0x22,0x50,0x22,0x3e,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x20,0xb8,0x20,0xbe,0x20,0xc4,0x20,0xca,0x20,0x58,0x20,0x5e,0x20,0x64,0x20,0x6a,0x21,0x30,0x21,0x36,0x21,0x3c,0x21,0x42,0x21,0xd8,0x21,0xde,\r\n0x21,0xe4,0x21,0xea,0x22,0x9e,0x22,0xa4,0x22,0xaa,0x22,0xb0,0x20,0x70,0x20,0x76,0x20,0x7c,0x20,0x82,0x20,0x88,0x20,0x8e,0x20,0x94,0x20,0x9a,0x20,0xa0,0x20,0xa6,0x20,0xac,0x20,0xb2,0x22,0x56,0x22,0x5c,0x22,0x62,0x22,0x68,0x00,0x02,0x00,0x04,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,\r\n0x00,0x0a,0x12,0x59,0x12,0x5b,0x00,0x0b,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0xb4,0x00,0xba,0x00,0x01,0x00,0x0c,0x00,0x12,0x00,0x01,0x00,0x00,\r\n0x0d,0x9c,0x00,0x50,0x20,0x1a,0x1d,0x5c,0x1f,0xba,0x20,0x20,0x20,0x26,0x20,0x2c,0x20,0x32,0x20,0x38,0x20,0x3e,0x20,0x44,0x20,0x32,0x20,0x4a,0x20,0x50,0x20,0x56,0x20,0x3e,0x20,0x5c,0x20,0x32,0x20,0x62,0x1e,0xd6,0x20,0x68,0x20,0x6e,0x1e,0xd6,0x20,0x74,0x20,0x7a,0x20,0x5c,0x20,0x4a,0x20,0x80,0x20,0x86,0x20,0x32,0x20,0x32,\r\n0x20,0x32,0x20,0x4a,0x20,0x4a,0x20,0x56,0x20,0x56,0x20,0x32,0x20,0x68,0x1d,0x5c,0x20,0x26,0x20,0x2c,0x20,0x50,0x20,0x56,0x20,0x3e,0x20,0x4a,0x20,0x86,0x20,0x80,0x20,0x8c,0x20,0x80,0x20,0x8c,0x1d,0x5c,0x1f,0xba,0x20,0x20,0x20,0x26,0x20,0x2c,0x20,0x92,0x20,0x6e,0x20,0x44,0x20,0x92,0x20,0x4a,0x20,0x50,0x20,0x56,0x20,0x5c,\r\n0x20,0x62,0x1e,0xd6,0x20,0x6e,0x1e,0xd6,0x20,0x7a,0x20,0x5c,0x20,0x4a,0x20,0x80,0x20,0x86,0x20,0x98,0x20,0x9e,0x20,0xa4,0x20,0xaa,0x20,0x56,0x20,0xb0,0x20,0x9e,0x20,0xb6,0x20,0xbc,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,\r\n0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x04,0xda,0x05,0x14,0x00,0x07,0x00,0x0c,0x00,0x6a,0x00,0x17,0x00,0x01,0x0c,0xba,0x00,0x00,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x06,0x0c,0xba,\r\n0x00,0x01,0x0c,0xba,0x00,0x04,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x03,0x0c,0xba,0x00,0x02,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x00,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x05,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x01,0x0c,0xba,0x00,0x51,0x1f,0x88,\r\n0x1f,0x8e,0x1f,0x94,0x1f,0x8e,0x1f,0x9a,0x1f,0xa0,0x1f,0xa6,0x1f,0xac,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x1f,0xc4,0x1f,0xc4,0x1f,0xca,0x1f,0xd0,0x1f,0xd6,0x1f,0xd0,0x1f,0xdc,0x1f,0xe2,0x1f,0xe2,0x1f,0xe8,0x1f,0xee,0x1f,0xf4,0x1f,0xee,0x1f,0xfa,0x20,0x00,0x20,0x06,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,\r\n0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x20,0x42,0x1e,0xf8,0x20,0x48,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x20,0x5a,0x1e,0x92,0x20,0x60,0x1e,0x92,0x20,0x66,0x20,0x6c,0x20,0x24,0x1d,0x78,0x1b,0xc8,0x20,0x72,0x1b,0xc8,0x20,0x78,0x20,0x7e,0x1d,0xf6,0x1f,0x28,0x20,0x84,\r\n0x20,0x8a,0x20,0x84,0x20,0x90,0x20,0x96,0x20,0x7e,0x20,0x42,0x1e,0xf8,0x20,0x9c,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,\r\n0x20,0xf0,0x20,0xf6,0x20,0xfc,0x21,0x02,0x20,0xfc,0x21,0x08,0x20,0x7e,0x1d,0xf6,0x1f,0x88,0x21,0x0e,0x21,0x14,0x21,0x0e,0x21,0x1a,0x1c,0x7c,0x21,0x20,0x20,0x42,0x1e,0xf8,0x20,0x9c,0x1e,0xf8,0x20,0x4e,0x20,0x54,0x1f,0xe2,0x21,0x26,0x21,0x2c,0x21,0x32,0x21,0x2c,0x21,0x38,0x21,0x3e,0x21,0x44,0x21,0x4a,0x21,0x50,0x21,0x56,\r\n0x21,0x50,0x21,0x5c,0x1d,0x1e,0x21,0x62,0x21,0x68,0x21,0x6e,0x21,0x74,0x21,0x6e,0x21,0x7a,0x21,0x80,0x21,0x86,0x21,0x8c,0x1c,0x76,0x21,0x92,0x1c,0x76,0x21,0x98,0x1e,0x7a,0x21,0x9e,0x21,0x4a,0x21,0xa4,0x21,0xaa,0x21,0xa4,0x21,0xb0,0x1d,0x1e,0x21,0x62,0x21,0xb6,0x21,0xbc,0x21,0xc2,0x21,0xbc,0x21,0xc8,0x1e,0xf2,0x20,0x06,\r\n0x21,0xce,0x21,0xd4,0x21,0xda,0x21,0xd4,0x21,0xe0,0x21,0xe6,0x21,0xec,0x21,0xf2,0x21,0xf8,0x21,0xfe,0x21,0xf8,0x22,0x04,0x1c,0x7c,0x20,0x3c,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1f,0x34,0x22,0x0a,0x22,0x10,0x22,0x0a,0x22,0x16,0x22,0x1c,0x21,0xe6,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,\r\n0x22,0x2e,0x21,0x20,0x1c,0x7c,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x20,0x42,0x22,0x34,0x22,0x3a,0x22,0x34,0x22,0x40,0x20,0x7e,0x1d,0xf6,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xbc,\r\n0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x22,0x46,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x22,0x4c,0x22,0x52,0x22,0x46,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x22,0x4c,0x22,0x52,0x20,0x42,0x22,0x58,0x22,0x5e,0x22,0x58,0x22,0x64,0x20,0x7e,0x1d,0xf6,0x21,0x68,0x21,0x6e,0x21,0x74,0x21,0x6e,0x21,0x7a,\r\n0x21,0x80,0x21,0x86,0x1f,0xac,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x1f,0xc4,0x1f,0xc4,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,\r\n0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,0x20,0xf0,0x20,0xf6,0x20,0xfc,0x21,0x02,0x20,0xfc,0x21,0x08,0x20,0x7e,0x1d,0xf6,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,0x22,0x2e,0x21,0x20,0x1c,0x7c,0x1f,0x34,0x22,0x0a,0x22,0x6a,0x22,0x70,0x22,0x76,0x22,0x1c,\r\n0x21,0xe6,0x22,0x7c,0x22,0x0a,0x22,0x10,0x22,0x82,0x22,0x16,0x22,0x88,0x22,0x8e,0x1f,0x34,0x22,0x0a,0x22,0x6a,0x22,0x70,0x22,0x76,0x22,0x1c,0x21,0xe6,0x22,0x7c,0x22,0x0a,0x22,0x10,0x22,0x82,0x22,0x16,0x22,0x88,0x22,0x8e,0x22,0x94,0x1f,0xb2,0x1f,0xb8,0x1f,0xb2,0x1f,0xbe,0x22,0x9a,0x22,0x9a,0x1f,0xca,0x1f,0xd0,0x1f,0xd6,\r\n0x1f,0xd0,0x1f,0xdc,0x22,0xa0,0x1f,0xe2,0x1f,0xe8,0x1f,0xee,0x1f,0xf4,0x1f,0xee,0x1f,0xfa,0x20,0x00,0x20,0x06,0x20,0x0c,0x1f,0xd0,0x20,0x12,0x1f,0xd0,0x20,0x18,0x20,0x1e,0x20,0x1e,0x20,0x24,0x20,0x2a,0x20,0x30,0x20,0x2a,0x20,0x36,0x1c,0x7c,0x20,0x3c,0x1e,0xe6,0x1f,0x58,0x22,0xa6,0x1f,0x58,0x22,0xac,0x22,0xb2,0x22,0xb8,\r\n0x22,0xbe,0x22,0xc4,0x21,0x32,0x22,0xc4,0x1c,0x16,0x1d,0x5a,0x21,0x44,0x1f,0x28,0x20,0x84,0x20,0x8a,0x20,0x84,0x20,0x90,0x20,0x96,0x20,0x7e,0x1e,0xe6,0x1f,0x58,0x22,0xa6,0x1f,0x58,0x22,0xac,0x22,0xb2,0x22,0xb8,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,0x20,0xb4,0x20,0xb4,0x1e,0xec,0x1d,0x90,0x20,0xba,0x1d,0x90,\r\n0x20,0xc0,0x20,0xc6,0x20,0xc6,0x20,0xcc,0x20,0xd2,0x20,0xd8,0x20,0xde,0x20,0xe4,0x20,0xea,0x20,0xf0,0x1f,0x88,0x21,0x0e,0x21,0x14,0x21,0x0e,0x21,0x1a,0x1c,0x7c,0x21,0x20,0x21,0x26,0x21,0x2c,0x21,0x32,0x21,0x2c,0x21,0x38,0x21,0x3e,0x21,0x44,0x21,0x4a,0x21,0x50,0x21,0x56,0x21,0x50,0x21,0x5c,0x1d,0x1e,0x21,0x62,0x21,0x8c,\r\n0x1c,0x76,0x21,0x92,0x1c,0x76,0x21,0x98,0x1e,0x7a,0x21,0x9e,0x21,0x4a,0x21,0xa4,0x21,0xaa,0x21,0xa4,0x21,0xb0,0x1d,0x1e,0x21,0x62,0x21,0xce,0x21,0xd4,0x21,0xda,0x21,0xd4,0x21,0xe0,0x21,0xe6,0x21,0xec,0x21,0xf2,0x21,0xf8,0x21,0xfe,0x21,0xf8,0x22,0x04,0x1c,0x7c,0x20,0x3c,0x1e,0xbc,0x20,0xa2,0x20,0xa8,0x20,0xa2,0x20,0xae,\r\n0x20,0xb4,0x20,0xb4,0x1f,0x34,0x22,0x0a,0x22,0x10,0x22,0x0a,0x22,0x16,0x22,0x1c,0x21,0xe6,0x1f,0x0a,0x22,0x22,0x22,0x28,0x22,0x22,0x22,0x2e,0x21,0x20,0x1c,0x7c,0x22,0xca,0x20,0xea,0x22,0xd0,0x22,0xd6,0x22,0xdc,0x22,0xe2,0x22,0xe8,0x22,0xee,0x22,0xf4,0x22,0xfa,0x22,0xf4,0x23,0x00,0x23,0x06,0x1e,0x98,0x23,0x0c,0x23,0x12,\r\n0x23,0x18,0x23,0x12,0x23,0x1e,0x23,0x24,0x23,0x2a,0x23,0x30,0x23,0x36,0x23,0x3c,0x23,0x36,0x21,0xb0,0x22,0xbe,0x23,0x42,0x20,0xcc,0x23,0x48,0x23,0x4e,0x23,0x54,0x23,0x5a,0x20,0xea,0x20,0xf0,0x23,0x60,0x23,0x66,0x1b,0xc8,0x23,0x66,0x23,0x6c,0x23,0x72,0x1c,0x34,0x23,0x78,0x23,0x7e,0x23,0x84,0x23,0x7e,0x23,0x8a,0x23,0x90,\r\n0x23,0x96,0x22,0xee,0x22,0xf4,0x22,0xfa,0x22,0xf4,0x23,0x00,0x23,0x06,0x1e,0x98,0x23,0x9c,0x23,0xa2,0x23,0xa8,0x23,0xa2,0x20,0x36,0x23,0xae,0x23,0xb4,0x1e,0xec,0x23,0xba,0x23,0xc0,0x23,0xba,0x22,0x2e,0x20,0xc6,0x1c,0x7c,0x00,0x02,0x00,0x09,0x0b,0x61,0x0b,0x61,0x00,0x00,0x0b,0xc0,0x0b,0xc3,0x00,0x01,0x0b,0xc5,0x0b,0xc7,\r\n0x00,0x05,0x0b,0xca,0x0b,0xcf,0x00,0x08,0x0b,0xd6,0x0b,0xd7,0x00,0x0e,0x0b,0xd9,0x0b,0xda,0x00,0x10,0x0b,0xdc,0x0b,0xdd,0x00,0x12,0x0b,0xe1,0x0b,0xe1,0x00,0x14,0x12,0x5c,0x12,0x5d,0x00,0x15,0x00,0x02,0x00,0x07,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,\r\n0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x0b,0xdf,0x0b,0xdf,0x00,0x4c,0x12,0x5f,0x12,0x62,0x00,0x4d,0x00,0x01,0x01,0x88,0x01,0xbc,0x00,0x02,0x00,0x0c,0x00,0x46,0x00,0x0e,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,\r\n0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x00,0x07,0x78,0x00,0x50,0x1a,0x70,0x1a,0x7c,0x1e,0xa8,0x1e,0xae,0x1e,0xb4,0x1e,0xba,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x19,0xda,0x1b,0x30,0x1c,0x1a,0x1e,0xd8,0x16,0xaa,0x1e,0xde,\r\n0x1e,0xe4,0x1e,0xea,0x19,0xda,0x1b,0x30,0x1e,0xf0,0x1e,0xf6,0x18,0xea,0x1c,0xaa,0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x08,0x1b,0xf0,0x1f,0x0e,0x1f,0x14,0x1f,0x1a,0x1c,0x0e,0x17,0x5e,0x1c,0x32,0x1f,0x20,0x1f,0x26,0x1f,0x2c,0x1f,0x32,0x1f,0x38,0x1f,0x3e,0x1f,0x44,0x1f,0x4a,0x1c,0x50,0x1f,0x50,0x1f,0x56,0x1c,0xda,0x1f,0x5c,\r\n0x1f,0x62,0x1f,0x02,0x1f,0x68,0x1f,0x6e,0x1f,0x74,0x1f,0x7a,0x1d,0x16,0x1f,0x80,0x1d,0x16,0x1f,0x80,0x1d,0x16,0x1f,0x80,0x1e,0xf0,0x1e,0xf6,0x1e,0xf0,0x1e,0xf6,0x1e,0xfc,0x1f,0x02,0x1e,0xfc,0x1f,0x02,0x1d,0x3a,0x1f,0x86,0x1f,0x8c,0x1f,0x2c,0x1e,0xa8,0x1e,0xae,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1f,0x92,0x1f,0x98,0x1c,0xaa,\r\n0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x9e,0x1f,0x62,0x1f,0x02,0x1f,0x74,0x1f,0x7a,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1f,0x68,0x1f,0x6e,0x1e,0xa8,0x1e,0xae,0x1e,0xb4,0x1e,0xba,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x1a,0x3a,0x1d,0x8e,0x18,0xf0,0x17,0x5e,0x1e,0xe4,0x1e,0xea,\r\n0x1a,0x3a,0x1d,0x8e,0x1e,0xf0,0x1e,0xf6,0x18,0xea,0x1c,0xaa,0x1e,0xfc,0x1f,0x02,0x1b,0xf0,0x1f,0x0e,0x1c,0x0e,0x17,0x5e,0x1c,0x32,0x1f,0x20,0x1f,0x32,0x1f,0x38,0x1f,0x3e,0x1f,0x44,0x1f,0x50,0x1f,0x56,0x1c,0xda,0x1f,0x5c,0x1f,0x62,0x1f,0x02,0x1f,0x68,0x1f,0x6e,0x1f,0x74,0x1f,0x7a,0x19,0xda,0x1b,0x30,0x1e,0xb4,0x1e,0xba,\r\n0x18,0xea,0x1c,0xaa,0x1f,0x3e,0x1f,0x44,0x1f,0x8c,0x1f,0xa4,0x1e,0xc0,0x1e,0xc6,0x1d,0x88,0x1e,0xcc,0x1e,0xd2,0x1b,0x8a,0x1f,0x74,0x1f,0x7a,0x00,0x02,0x00,0x08,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc8,0x0b,0xc9,0x00,0x04,0x0b,0xd0,\r\n0x0b,0xd5,0x00,0x06,0x0b,0xd8,0x0b,0xd8,0x00,0x0c,0x0b,0xdb,0x0b,0xdb,0x00,0x0d,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,0x00,0x4c,0x00,0x01,0x00,0x40,0x00,0x56,0x00,0x01,\r\n0x00,0x0c,0x00,0x3a,0x00,0x0b,0x00,0x00,0x05,0x94,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x05,0x94,0x00,0x00,0x18,0x2a,0x00,0x00,0x18,0x2a,0x00,0x00,0x1e,0x06,0x00,0x00,0x1e,0x06,0x00,0x00,0x17,0x46,0x00,0x00,0x1e,0x06,0x00,0x02,0x1d,0xde,0x16,0x70,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,\r\n0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x01,0x00,0x02,0x0b,0x5f,0x0b,0x67,0x00,0x01,0x00,0xb4,0x00,0xe8,0x00,0x04,0x00,0x0c,0x00,0x42,0x00,0x0d,0x00,0x00,0x05,0x36,0x00,0x00,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x03,0x05,0x36,0x00,0x01,0x05,0x36,0x00,0x01,0x05,0x36,\r\n0x00,0x01,0x1d,0xb4,0x00,0x01,0x05,0x36,0x00,0x02,0x05,0x36,0x00,0x01,0x1d,0xba,0x00,0x01,0x05,0x36,0x00,0x03,0x1d,0xc0,0x00,0x0e,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x17,0xa2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x15,0xf2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xa2,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xa8,0x1d,0x90,0x1d,0x96,0x1d,0x9c,\r\n0x17,0xa2,0x1d,0x90,0x1d,0xae,0x1d,0x9c,0x1d,0xb4,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x1d,0xb4,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0x90,0x1d,0xae,0x1d,0x9c,0x1d,0xba,0x1d,0x90,0x1d,0x96,0x1d,0x9c,0x19,0x22,0x1d,0xc0,0x1d,0xae,0x1d,0xc6,0x1d,0x06,0x1d,0xc0,0x1d,0xcc,0x1d,0xc6,\r\n0x1a,0x84,0x1d,0xc0,0x1d,0xcc,0x1d,0xc6,0x1a,0x84,0x00,0x02,0x00,0x08,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc8,0x0b,0xc9,0x00,0x04,0x0b,0xd1,0x0b,0xd5,0x00,0x06,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x0b,0xdb,0x0b,0xdb,0x00,0x0c,0x00,0x02,\r\n0x00,0x04,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x12,0x59,0x12,0x5b,0x00,0x0b,0x00,0x01,0x00,0x78,0x00,0x8e,0x00,0x02,0x00,0x0c,0x00,0x1e,0x00,0x04,0x00,0x00,0x04,0x32,0x00,0x00,0x04,0x32,0x00,0x01,0x04,0x32,0x00,0x01,0x04,0x32,0x00,0x16,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,\r\n0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0xf2,0x1c,0xf8,0x1c,0x98,0x1c,0xfe,0x1c,0xf2,0x1c,0xf8,0x1d,0x04,0x1d,0x0a,0x1d,0x04,0x1d,0x10,0x1d,0x16,0x1d,0x10,0x1d,0x1c,0x1d,0x22,0x1d,0x28,0x1d,0x2e,0x1d,0x28,\r\n0x1d,0x34,0x1d,0x3a,0x1c,0xfe,0x1d,0x40,0x1d,0x46,0x1d,0x4c,0x1d,0x52,0x1d,0x04,0x1d,0x22,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x57,0x0b,0x58,0x00,0x01,0x0b,0x5a,0x0b,0x5a,0x00,0x03,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x67,0x0b,0x67,0x00,0x0a,0x0b,0xb9,\r\n0x0b,0xb9,0x00,0x0b,0x0b,0xbf,0x0b,0xbf,0x00,0x0c,0x0b,0xc4,0x0b,0xc4,0x00,0x0d,0x0b,0xc9,0x0b,0xc9,0x00,0x0e,0x0b,0xd0,0x0b,0xd5,0x00,0x0f,0x0b,0xd8,0x0b,0xd8,0x00,0x15,0x00,0x01,0x00,0x70,0x00,0x9e,0x00,0x02,0x00,0x0c,0x00,0x3e,0x00,0x0c,0x00,0x00,0x1b,0xe8,0x00,0x00,0x03,0x6a,0x00,0x00,0x16,0xf6,0x00,0x00,0x1c,0xa2,\r\n0x00,0x00,0x1c,0xa2,0x00,0x00,0x1c,0xa2,0x00,0x00,0x1c,0xa8,0x00,0x00,0x1c,0xa8,0x00,0x00,0x1c,0xa2,0x00,0x01,0x03,0x6a,0x00,0x00,0x1c,0xae,0x00,0x00,0x1c,0xa2,0x00,0x0c,0x1c,0x82,0x1c,0x52,0x1c,0x88,0x1c,0x2e,0x1c,0x8e,0x1c,0x94,0x1c,0x8e,0x1c,0x10,0x1c,0x8e,0x1c,0x10,0x1c,0x8e,0x1c,0x9a,0x14,0x42,0x1c,0xa0,0x1c,0xa6,\r\n0x1c,0xac,0x1c,0x8e,0x1c,0xa0,0x1c,0xb2,0x1c,0xb8,0x14,0x42,0x1c,0xbe,0x1c,0x8e,0x1c,0x9a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,\r\n0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x7c,0x00,0xb6,0x00,0x01,0x00,0x0c,0x00,0x56,0x00,0x12,0x00,0x00,0x1b,0x1c,\r\n0x00,0x00,0x1a,0x74,0x00,0x00,0x02,0x9e,0x00,0x00,0x1c,0x2a,0x00,0x00,0x17,0xf8,0x00,0x00,0x1c,0x2a,0x00,0x00,0x16,0x2a,0x00,0x00,0x1c,0x30,0x00,0x00,0x1b,0xe2,0x00,0x00,0x15,0xac,0x00,0x00,0x02,0x9e,0x00,0x00,0x02,0x9e,0x00,0x00,0x1c,0x2a,0x00,0x00,0x02,0x9e,0x00,0x00,0x1b,0xe2,0x00,0x00,0x1c,0x36,0x00,0x00,0x1b,0x1c,\r\n0x00,0x00,0x1c,0x36,0x00,0x12,0x1b,0x6e,0x1b,0x80,0x1b,0xf2,0x1b,0x38,0x1b,0xf8,0x1b,0xc8,0x1b,0xfe,0x1c,0x04,0x1c,0x0a,0x1c,0x0a,0x1c,0x0a,0x1c,0x10,0x1b,0x6e,0x1b,0x4a,0x1b,0xc8,0x1b,0xfe,0x1b,0x80,0x1b,0xd4,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,\r\n0x0b,0xcc,0x0b,0xcf,0x00,0x06,0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x02,0x00,0x09,0x0b,0xc1,0x0b,0xc3,0x00,0x00,0x0b,0xc5,0x0b,0xc6,0x00,0x03,0x0b,0xca,0x0b,0xca,0x00,0x05,0x0b,0xcc,0x0b,0xcf,0x00,0x06,\r\n0x0b,0xd6,0x0b,0xd7,0x00,0x0a,0x0b,0xd9,0x0b,0xda,0x00,0x0c,0x0b,0xdd,0x0b,0xdd,0x00,0x0e,0x0b,0xe1,0x0b,0xe1,0x00,0x0f,0x12,0x5c,0x12,0x5d,0x00,0x10,0x00,0x01,0x00,0x1a,0x00,0x22,0x00,0x01,0x00,0x0c,0x00,0x16,0x00,0x02,0x00,0x00,0x01,0xae,0x00,0x00,0x01,0xae,0x00,0x01,0x1b,0x66,0x00,0x01,0x00,0x02,0x0b,0x63,0x0b,0x64,\r\n0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x01,0x04,0x04,0xb0,0x00,0x01,0x01,0x13,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0xb0,0x00,0x01,0x00,0x00,0x05,0x64,0x00,0x01,0xff,0xce,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x88,0x00,0x01,0x00,0x46,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x60,0x00,0x01,0x00,0x00,0x03,0xde,0x00,0x01,0x00,0x00,\r\n0x03,0xe8,0x00,0x01,0x00,0x00,0x04,0x7e,0x00,0x01,0x00,0x00,0x04,0xec,0x00,0x01,0x00,0x00,0xff,0xec,0x00,0x01,0x00,0x1e,0x04,0xb0,0x00,0x01,0x01,0x93,0x04,0xb0,0x00,0x01,0x01,0xa6,0x04,0xb0,0x00,0x01,0x01,0xa8,0x04,0xb0,0x00,0x01,0x00,0x00,0x04,0x6f,0x00,0x01,0x00,0x00,0x04,0xa6,0x00,0x01,0x00,0x0f,0x04,0x7e,0x00,0x01,\r\n0xff,0xf1,0x04,0x7e,0x00,0x01,0x00,0x00,0x04,0xc4,0x00,0x01,0x01,0xd9,0x04,0xba,0x00,0x01,0x01,0xd9,0x03,0xca,0x00,0x01,0x02,0x07,0x04,0x74,0x00,0x01,0x01,0x53,0x04,0x06,0x00,0x01,0x01,0x18,0x06,0x77,0x00,0x01,0x00,0xe1,0x06,0x08,0x00,0x01,0x01,0x0e,0x06,0x08,0x00,0x01,0x00,0x00,0x06,0x5e,0x00,0x01,0x00,0x00,0x05,0xdc,\r\n0x00,0x01,0x00,0x00,0x05,0x7f,0x00,0x01,0x00,0x00,0x06,0x3c,0x00,0x01,0x00,0x00,0x06,0x0e,0x00,0x01,0x00,0x00,0x05,0xd5,0x00,0x01,0x00,0x00,0x05,0xd7,0x00,0x01,0x00,0x00,0x06,0x6c,0x00,0x01,0x00,0x00,0x06,0x50,0x00,0x01,0x00,0x00,0x06,0x5c,0x00,0x01,0x00,0x00,0x06,0xb8,0x00,0x01,0x00,0x00,0x06,0x73,0x00,0x01,0x00,0x00,\r\n0x05,0xf0,0x00,0x01,0x00,0x00,0x06,0xb5,0x00,0x01,0x00,0x00,0x07,0x6c,0x00,0x01,0x00,0x00,0x07,0x54,0x00,0x01,0x00,0x00,0x01,0x4d,0x00,0x01,0x00,0x00,0x06,0x3a,0x00,0x01,0x00,0x00,0x06,0x40,0x00,0x01,0x00,0x00,0x06,0xc4,0x00,0x01,0x00,0x00,0x07,0xb2,0x00,0x01,0x00,0x00,0x06,0xf0,0x00,0x01,0x01,0x93,0x06,0x22,0x00,0x01,\r\n0x01,0xa6,0x06,0x18,0x00,0x01,0x01,0xa8,0x06,0x4a,0x00,0x01,0x00,0x00,0x06,0xfe,0x00,0x01,0x00,0x00,0x07,0xda,0x00,0x01,0x00,0x00,0x07,0xe4,0x00,0x01,0x00,0x00,0x07,0x80,0x00,0x01,0x00,0x00,0x06,0xa8,0x00,0x01,0x00,0x00,0x06,0x54,0x00,0x01,0x00,0x00,0x06,0xc2,0x00,0x01,0x00,0x00,0x06,0x27,0x00,0x01,0x01,0xd9,0x06,0x5a,\r\n0x00,0x01,0x01,0xd9,0x05,0x80,0x00,0x01,0x02,0x07,0x06,0x22,0x00,0x01,0x01,0x53,0x06,0xc9,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x41,0x00,0x01,0x00,0x0a,0x00,0x41,0x00,0x01,0x00,0x0f,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x41,0x00,0x01,0xff,0xfb,0x00,0x32,0x00,0x01,0x00,0x00,\r\n0x00,0x78,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x00,0x00,0xff,0xc9,0x00,0x01,0x00,0x00,0xff,0xe2,0x00,0x01,0xff,0xf1,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0xff,0xa6,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x82,0x00,0x01,0x00,0x00,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x32,0x00,0x01,0x00,0x00,0x00,0x50,0x00,0x01,\r\n0x00,0x00,0x00,0x1e,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x00,0x00,0x64,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x01,0x00,0xd9,0x00,0x82,0x00,0x01,0x02,0x80,0x00,0x82,0x00,0x01,0x01,0x54,0xfe,0xc0,0x00,0x01,0x00,0x00,0xfe,0x48,0x00,0x01,0x00,0x00,0xfe,0x5c,0x00,0x01,0xff,0xfb,0xff,0x4c,0x00,0x01,0x00,0x00,0xfe,0xc0,\r\n0x00,0x01,0x00,0x00,0xfe,0x7a,0x00,0x01,0x00,0x00,0xfe,0x20,0x00,0x01,0x00,0x00,0xfe,0xb6,0x00,0x01,0x00,0x00,0xfe,0x84,0x00,0x01,0x00,0x00,0xff,0x10,0x00,0x01,0x00,0x00,0xfe,0xa2,0x00,0x01,0x00,0x00,0xff,0x56,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x01,0x00,0x00,0xfd,0xf8,0x00,0x01,0x00,0x00,0xfe,0x16,0x00,0x01,0x00,0x00,\r\n0xfe,0x3e,0x00,0x01,0x01,0xa9,0xfe,0xa2,0x00,0x01,0x00,0x00,0xfe,0x0c,0x00,0x01,0x00,0xd9,0xfe,0x02,0x00,0x01,0x02,0x80,0xfe,0x02,0x00,0x01,0x03,0x16,0x06,0x0e,0x00,0x01,0x02,0x67,0x04,0xb0,0x00,0x01,0x01,0x03,0x06,0x7c,0x00,0x01,0x00,0x7e,0x06,0x73,0x00,0x01,0x01,0x03,0xff,0x71,0x00,0x01,0x01,0x03,0x06,0x5e,0x00,0x01,\r\n0x00,0xc4,0x06,0x73,0x00,0x01,0x01,0x03,0x06,0x76,0x00,0x01,0x01,0x03,0x06,0x62,0x00,0x01,0x01,0x03,0x06,0x1d,0x00,0x01,0x00,0xef,0x06,0x71,0x00,0x01,0x00,0xb2,0xff,0x6b,0x00,0x01,0x00,0xf5,0x06,0x7c,0x00,0x01,0x01,0x03,0xff,0x6b,0x00,0x01,0x00,0xe9,0x06,0x1e,0x00,0x01,0x01,0x03,0x06,0x70,0x00,0x01,0x00,0xec,0x06,0x1f,\r\n0x00,0x01,0x01,0x03,0x06,0x8f,0x00,0x01,0x01,0x03,0x06,0x7b,0x00,0x01,0x01,0x03,0x06,0x71,0x00,0x01,0x01,0x1f,0x06,0x65,0x00,0x01,0x00,0xec,0x00,0x05,0x00,0x01,0x01,0x0c,0x06,0x70,0x00,0x01,0x01,0x03,0xff,0xc1,0x00,0x01,0x01,0x03,0x06,0x35,0x00,0x01,0x01,0x1f,0x00,0x34,0x00,0x01,0x00,0xf9,0x06,0x55,0x00,0x01,0x00,0xeb,\r\n0x06,0x55,0x00,0x01,0x01,0x11,0x06,0x1f,0x00,0x01,0x01,0x1c,0x06,0x1f,0x00,0x01,0x00,0xf3,0x06,0x71,0x00,0x01,0x01,0x03,0xff,0x7e,0x00,0x01,0x00,0xf9,0x06,0x7c,0x00,0x01,0x01,0x03,0x05,0x16,0x00,0x01,0x01,0x03,0x05,0x20,0x00,0x01,0x01,0x03,0x05,0x28,0x00,0x01,0x01,0x03,0xff,0x69,0x00,0x01,0x01,0x42,0x06,0x73,0x00,0x01,\r\n0x01,0x03,0x06,0x67,0x00,0x01,0x00,0xf8,0x06,0x1d,0x00,0x01,0x00,0xd7,0x06,0x1f,0x00,0x01,0x00,0xe1,0x06,0x7a,0x00,0x01,0x01,0x03,0x06,0x60,0x00,0x01,0x01,0x03,0x05,0x26,0x00,0x01,0x00,0xfa,0x05,0x26,0x00,0x01,0x01,0x03,0x00,0xc1,0x00,0x01,0x01,0x18,0x06,0x72,0x00,0x01,0x00,0xfa,0xff,0xce,0x00,0x01,0x01,0x40,0x06,0x72,\r\n0x00,0x01,0x01,0x7c,0x06,0x72,0x00,0x01,0x01,0x2c,0xff,0xce,0x00,0x01,0x00,0xc8,0x06,0x72,0x00,0x01,0x01,0x68,0x06,0x72,0x00,0x01,0x00,0xfa,0x06,0x72,0x00,0x01,0x00,0xbe,0xff,0x74,0x00,0x01,0x01,0x5e,0xff,0x74,0x00,0x01,0x00,0xc8,0xff,0x74,0x00,0x01,0x01,0x2c,0x06,0x72,0x00,0x01,0x01,0xe0,0x06,0x72,0x00,0x01,0x01,0x7c,\r\n0xff,0x74,0x00,0x01,0x00,0xdc,0x06,0x72,0x00,0x01,0x01,0x04,0xff,0x74,0x00,0x01,0x00,0xa0,0x06,0x72,0x00,0x01,0x00,0x8c,0xff,0x4c,0x00,0x01,0x02,0x80,0x06,0x72,0x00,0x01,0x01,0x4a,0x06,0x72,0x00,0x01,0x01,0x03,0x03,0xb8,0x00,0x01,0x00,0xfa,0x06,0x5e,0x00,0x01,0x02,0x5a,0x06,0x71,0x00,0x01,0x01,0x05,0x06,0x1f,0x00,0x01,\r\n0x00,0xdd,0x06,0x1e,0x00,0x01,0x00,0xfa,0x06,0x71,0x00,0x01,0x01,0x03,0x05,0xd1,0x00,0x01,0x01,0x03,0xff,0x90,0x00,0x01,0x00,0x1d,0x07,0x1d,0x00,0x01,0xff,0x8e,0x07,0x1d,0x00,0x01,0xff,0x97,0x07,0x1d,0x00,0x01,0xff,0x47,0x07,0x1d,0x00,0x01,0xff,0x79,0x07,0x1d,0x00,0x01,0xff,0xcd,0x07,0x1d,0x00,0x01,0x01,0x7a,0x06,0x71,\r\n0x00,0x01,0x01,0x93,0x06,0x71,0x00,0x01,0xff,0xda,0x00,0x0c,0x00,0x01,0x00,0xfa,0x06,0x1e,0x00,0x01,0x00,0xfa,0xff,0x5c,0x00,0x01,0x00,0xfa,0x08,0x1b,0x00,0x01,0x00,0xfa,0x07,0x62,0x00,0x01,0x00,0xfa,0xfd,0xcc,0x00,0x01,0x00,0xfa,0x04,0x09,0x00,0x01,0x01,0x2c,0xfe,0x42,0x00,0x01,0x01,0x90,0x05,0x48,0x00,0x01,0x00,0xfa,\r\n0xff,0x2a,0x00,0x01,0x01,0x90,0x06,0x2e,0x00,0x01,0x01,0xf4,0x04,0x09,0x00,0x01,0x02,0x26,0xfe,0x42,0x00,0x01,0x02,0x0e,0x04,0x4e,0x00,0x01,0x02,0xa4,0xfd,0xcd,0x00,0x01,0x02,0x26,0xff,0x2a,0x00,0x01,0x01,0xf4,0x04,0xf7,0x00,0x01,0x02,0x0e,0x05,0x3e,0x00,0x01,0x01,0xc2,0x04,0x3b,0x00,0x01,0x02,0x58,0xff,0x2a,0x00,0x01,\r\n0x01,0x5e,0x04,0x89,0x00,0x01,0x01,0x2c,0x03,0xd2,0x00,0x01,0x02,0xbc,0xff,0x22,0x00,0x01,0x01,0xc2,0x04,0xb6,0x00,0x01,0x01,0xf4,0xff,0x2a,0x00,0x01,0x01,0xf4,0x04,0x8a,0x00,0x01,0x01,0xf5,0x04,0x5d,0x00,0x01,0x02,0x8b,0xfd,0xcd,0x00,0x01,0x01,0xc2,0x05,0x48,0x00,0x01,0x01,0xf4,0x05,0x16,0x00,0x01,0x01,0xf5,0x05,0x65,\r\n0x00,0x01,0x01,0x90,0x05,0x88,0x00,0x01,0x01,0x90,0xff,0x2a,0x00,0x01,0x01,0xc2,0x05,0x88,0x00,0x01,0x00,0xfa,0x05,0x9e,0x00,0x01,0x01,0x5e,0xff,0x2a,0x00,0x01,0x01,0x5e,0x06,0x1e,0x00,0x01,0x01,0x2c,0xff,0x2a,0x00,0x01,0x01,0x4a,0x03,0xdb,0x00,0x01,0x02,0x44,0xfe,0xf8,0x00,0x01,0x01,0x5e,0x05,0x48,0x00,0x01,0x01,0x7f,\r\n0x04,0xe9,0x00,0x01,0x02,0x79,0xff,0x2a,0x00,0x01,0x01,0xc5,0x04,0x50,0x00,0x01,0x03,0x55,0xfd,0xcd,0x00,0x01,0x01,0xff,0x04,0x9f,0x00,0x01,0x02,0x31,0xff,0x2a,0x00,0x01,0x01,0x40,0xfe,0x42,0x00,0x01,0x01,0xc6,0x03,0x3f,0x00,0x01,0x00,0x64,0xfe,0xff,0x00,0x01,0x01,0xff,0x05,0xc8,0x00,0x01,0x01,0xf8,0xfe,0x9e,0x00,0x01,\r\n0x01,0x5e,0x05,0xd4,0x00,0x01,0x01,0xae,0x04,0xb7,0x00,0x01,0x01,0xe0,0xfe,0x9e,0x00,0x01,0x01,0x22,0x03,0x7c,0x00,0x01,0x01,0x81,0xff,0x38,0x00,0x01,0x00,0xfa,0xff,0x9c,0x00,0x01,0x01,0x90,0x05,0xa2,0x00,0x01,0x01,0x90,0xfd,0xcd,0x00,0x01,0x01,0xae,0x05,0x62,0x00,0x01,0x01,0xe0,0xfe,0xf1,0x00,0x01,0x02,0x3b,0x03,0xd7,\r\n0x00,0x01,0x01,0x73,0xff,0x0a,0x00,0x01,0x01,0xa5,0x05,0xc1,0x00,0x01,0x02,0x09,0xff,0x22,0x00,0x01,0x02,0x3b,0x05,0x48,0x00,0x01,0x01,0xd7,0xff,0x22,0x00,0x01,0x01,0x73,0x05,0x02,0x00,0x01,0x01,0x1a,0x04,0x82,0x00,0x01,0x01,0xb0,0xff,0x22,0x00,0x01,0x01,0x1a,0x05,0xc1,0x00,0x01,0x01,0x90,0x03,0x26,0x00,0x01,0x01,0x2c,\r\n0xfd,0xcd,0x00,0x01,0x01,0x90,0x04,0x6b,0x00,0x01,0x02,0x8f,0x03,0xd7,0x00,0x01,0x06,0x13,0xff,0x2b,0x00,0x01,0x02,0x8f,0x03,0xd2,0x00,0x01,0x06,0xdb,0xff,0x2b,0x00,0x01,0x03,0xe8,0x05,0x24,0x00,0x01,0x02,0xee,0xff,0x22,0x00,0x01,0x01,0x91,0x04,0xf2,0x00,0x01,0x01,0x91,0x05,0xf3,0x00,0x01,0x00,0x96,0x02,0x29,0x00,0x01,\r\n0x00,0x96,0xfe,0x62,0x00,0x01,0x02,0x9f,0x04,0x2a,0x00,0x01,0x02,0x3b,0xff,0x22,0x00,0x01,0x01,0x31,0x04,0x79,0x00,0x01,0x02,0xc1,0xfd,0xcd,0x00,0x01,0x02,0x3b,0x05,0x24,0x00,0x01,0x03,0x03,0xff,0x22,0x00,0x01,0x01,0xc7,0x05,0x24,0x00,0x01,0x02,0x8f,0xfe,0x48,0x00,0x01,0x01,0x33,0x03,0x81,0x00,0x01,0x02,0x5f,0xff,0x2b,\r\n0x00,0x01,0x02,0x5d,0x04,0x24,0x00,0x01,0x02,0x8f,0xfd,0xcd,0x00,0x01,0x01,0xa5,0x04,0x96,0x00,0x01,0x01,0xc2,0x03,0xe3,0x00,0x01,0x01,0xc6,0x04,0x15,0x00,0x01,0x01,0xf8,0xfe,0xf1,0x00,0x01,0x00,0x64,0xff,0x27,0x00,0x01,0x01,0x90,0x04,0x5c,0x00,0x01,0x01,0x41,0xff,0x27,0x00,0x01,0x01,0x72,0xfd,0x97,0x00,0x01,0x02,0x26,\r\n0xfd,0x97,0x00,0x01,0x01,0x90,0x05,0x83,0x00,0x01,0x01,0xd7,0x04,0xa4,0x00,0x01,0x03,0x67,0xff,0x22,0x00,0x01,0x01,0xd7,0x05,0x76,0x00,0x01,0x00,0xfa,0x06,0xa2,0x00,0x01,0x01,0xff,0x06,0x7d,0x00,0x01,0x01,0xa5,0x06,0x76,0x00,0x01,0x01,0x73,0x04,0x8d,0x00,0x01,0x01,0x5e,0x06,0x96,0x00,0x01,0x00,0xe8,0x07,0x41,0x00,0x01,\r\n0x01,0x5e,0x06,0x1d,0x00,0x01,0x02,0x5d,0x02,0xed,0x00,0x01,0x01,0xa5,0x04,0xc8,0x00,0x01,0x00,0xfa,0xfd,0xd8,0x00,0x01,0x01,0x5e,0x03,0x2d,0x00,0x01,0x01,0x90,0xfd,0xc8,0x00,0x01,0x01,0x6c,0x03,0xf1,0x00,0x01,0x02,0x66,0xff,0x22,0x00,0x01,0x01,0x6c,0x01,0x2f,0x00,0x01,0x02,0x66,0xfd,0xf6,0x00,0x01,0x01,0x6c,0x05,0xa2,\r\n0x00,0x01,0x01,0x6c,0x03,0xa1,0x00,0x01,0x02,0x9f,0x04,0xf2,0x00,0x01,0x01,0xc2,0x06,0xa0,0x00,0x01,0x01,0x83,0x02,0xe7,0x00,0x01,0x02,0x19,0xff,0x19,0x00,0x01,0x01,0xf9,0x03,0x7f,0x00,0x01,0x00,0xfa,0x08,0x1a,0x00,0x01,0x00,0x96,0xfd,0xcc,0x00,0x01,0x01,0xc2,0x05,0xa2,0x00,0x01,0x01,0xa9,0x05,0xc7,0x00,0x01,0x01,0x77,\r\n0xfd,0xcd,0x00,0x01,0x01,0xc6,0x04,0x8b,0x00,0x01,0x01,0xc6,0x03,0x4a,0x00,0x01,0x01,0x73,0x04,0x9e,0x00,0x01,0x01,0x73,0xff,0x27,0x00,0x01,0x01,0x5e,0xfd,0x97,0x00,0x01,0x01,0xd7,0xff,0x20,0x00,0x01,0x00,0xfa,0xfe,0xa1,0x00,0x01,0x01,0x41,0x04,0x9e,0x00,0x01,0x02,0x0e,0x05,0xf3,0x00,0x01,0x01,0xf4,0x05,0x7a,0x00,0x01,\r\n0x02,0x0e,0x06,0x56,0x00,0x01,0x01,0xf4,0x05,0xdd,0x00,0x01,0x01,0xdc,0x06,0x56,0x00,0x01,0x01,0xb0,0xfe,0x90,0x00,0x01,0x01,0xb0,0xfe,0x42,0x00,0x01,0x01,0x1a,0x06,0xd9,0x00,0x01,0x01,0x90,0x05,0x13,0x00,0x01,0x01,0x2c,0xfd,0xc9,0x00,0x01,0x01,0x2c,0xfd,0xaf,0x00,0x01,0x06,0x13,0xfe,0x63,0x00,0x01,0x01,0xc2,0x04,0x39,\r\n0x00,0x01,0x01,0xc2,0xff,0x3c,0x00,0x01,0x06,0x13,0xfd,0x97,0x00,0x01,0x01,0x5e,0xff,0x27,0x00,0x01,0x07,0x3f,0xfe,0x63,0x00,0x01,0x02,0x26,0xff,0x0a,0x00,0x01,0x02,0x8f,0x04,0x68,0x00,0x01,0x01,0x2c,0x04,0x68,0x00,0x01,0x03,0xe8,0x06,0x1e,0x00,0x01,0x01,0x91,0x06,0xd9,0x00,0x01,0x01,0xf5,0x06,0x74,0x00,0x01,0x01,0xc2,\r\n0x06,0x60,0x00,0x01,0x01,0xf4,0x06,0x2e,0x00,0x01,0x01,0x90,0xfe,0x42,0x00,0x01,0x01,0xc2,0xfd,0x97,0x00,0x01,0x01,0x95,0x04,0x47,0x00,0x01,0x01,0x63,0x04,0xc9,0x00,0x01,0x01,0xdb,0x04,0x4b,0x00,0x01,0x03,0x6b,0xfe,0xf0,0x00,0x01,0x01,0x5e,0x04,0x7d,0x00,0x01,0x02,0x8a,0xfe,0xf0,0x00,0x01,0x02,0x3b,0x06,0xe5,0x00,0x01,\r\n0x01,0x2c,0x06,0xe5,0x00,0x01,0x01,0xa5,0x07,0x35,0x00,0x01,0x01,0x2c,0x07,0xfd,0x00,0x01,0x01,0xd7,0x05,0x9d,0x00,0x01,0x01,0x2c,0x07,0xf5,0x00,0x01,0x01,0x41,0xff,0x0a,0x00,0x01,0x01,0x5e,0xfe,0x42,0x00,0x01,0x01,0xa5,0xff,0x27,0x00,0x01,0x01,0xd7,0x05,0x6b,0x00,0x01,0x00,0xfa,0x08,0xef,0x00,0x01,0x01,0x90,0x08,0x40,\r\n0x00,0x01,0x01,0x5e,0x07,0x99,0x00,0x01,0x01,0x90,0x08,0xb1,0x00,0x01,0x02,0x8f,0xfd,0x92,0x00,0x01,0x01,0x2c,0xfd,0x97,0x00,0x01,0x02,0x5d,0x05,0x7a,0x00,0x01,0x00,0xcd,0xfe,0xf5,0x00,0x01,0x02,0x5d,0x05,0x72,0x00,0x01,0x00,0xcd,0xfe,0xb9,0x00,0x01,0x02,0x5d,0x05,0x0a,0x00,0x01,0x01,0xc2,0x04,0x48,0x00,0x01,0x01,0x90,\r\n0xfd,0xcc,0x00,0x01,0x01,0xc2,0x05,0x95,0x00,0x01,0x01,0xc2,0x05,0xc7,0x00,0x01,0x01,0xc2,0x05,0xbd,0x00,0x01,0x01,0xc2,0x04,0xdd,0x00,0x01,0x01,0x90,0x05,0xf5,0x00,0x01,0x01,0xc2,0x04,0x15,0x00,0x01,0x01,0xf4,0xfe,0xf1,0x00,0x01,0x01,0xae,0x03,0x3f,0x00,0x01,0x01,0xc6,0x06,0x40,0x00,0x01,0x01,0xc6,0x04,0x90,0x00,0x01,\r\n0x01,0x90,0x05,0xbe,0x00,0x01,0x01,0xc6,0x04,0xdc,0x00,0x01,0x01,0x2c,0xff,0x27,0x00,0x01,0x01,0xc6,0x03,0xe9,0x00,0x01,0x00,0xfa,0xff,0x22,0x00,0x01,0x00,0xc8,0xff,0x27,0x00,0x01,0x00,0xc8,0xff,0x22,0x00,0x01,0x02,0x8a,0xff,0x0a,0x00,0x01,0x01,0xf5,0x05,0x8e,0x00,0x01,0x01,0xf4,0xfe,0x42,0x00,0x01,0x02,0x5f,0xfd,0xcd,\r\n0x00,0x01,0x01,0xd7,0x05,0x41,0x00,0x01,0x02,0x62,0x05,0x16,0x00,0x01,0x02,0x62,0xff,0x92,0x00,0x01,0x01,0x1a,0x06,0x69,0x00,0x01,0x01,0x7e,0x06,0x69,0x00,0x01,0x01,0x7f,0x06,0x40,0x00,0x01,0x01,0xc5,0x05,0xaa,0x00,0x01,0x00,0xe6,0x06,0x40,0x00,0x01,0x01,0xe0,0xff,0x2a,0x00,0x01,0x01,0x18,0x06,0x0e,0x00,0x01,0x02,0x12,\r\n0xfd,0xcd,0x00,0x01,0x01,0x0f,0xff,0x3c,0x00,0x01,0x00,0xfa,0xfe,0x42,0x00,0x01,0x01,0x72,0xfe,0x42,0x00,0x01,0x01,0x41,0xff,0x0d,0x00,0x01,0x01,0x5e,0xfd,0xe1,0x00,0x01,0x02,0x3b,0x05,0xbe,0x00,0x01,0x01,0xb0,0xfd,0x97,0x00,0x01,0x01,0xb0,0xfd,0xe1,0x00,0x01,0x01,0x2c,0x04,0x89,0x00,0x01,0x01,0x91,0x06,0x07,0x00,0x01,\r\n0x01,0xf5,0x05,0x84,0x00,0x01,0x01,0x91,0x06,0xed,0x00,0x01,0x01,0xf5,0x06,0x6a,0x00,0x01,0x01,0xc2,0xfe,0x42,0x00,0x01,0x01,0xf4,0xfd,0x83,0x00,0x01,0x01,0xd7,0x05,0x55,0x00,0x01,0x01,0xd7,0x04,0xdd,0x00,0x01,0x01,0x90,0xfd,0x97,0x00,0x01,0x01,0x01,0x04,0xdd,0x00,0x01,0x01,0x4a,0x04,0xdd,0x00,0x01,0x02,0x5f,0xfe,0x63,\r\n0x00,0x01,0x02,0x44,0xfe,0x42,0x00,0x01,0x00,0x9b,0xfe,0x91,0x00,0x01,0x02,0x5d,0x06,0xc8,0x00,0x01,0x01,0x5e,0x08,0x1e,0x00,0x01,0x02,0x5d,0x05,0xc7,0x00,0x01,0x01,0x90,0x07,0x1d,0x00,0x01,0x01,0x90,0x05,0x20,0x00,0x01,0x01,0xc6,0x04,0x47,0x00,0x01,0x00,0xfa,0xff,0x2b,0x00,0x01,0x00,0xfa,0xfe,0xd6,0x00,0x01,0x01,0x7e,\r\n0x04,0x82,0x00,0x01,0x01,0x7e,0x05,0xc1,0x00,0x01,0x02,0xee,0xff,0x25,0x00,0x01,0x02,0x2a,0x05,0x78,0x00,0x01,0x02,0x2a,0x04,0x2c,0x00,0x01,0x02,0x2a,0x06,0x84,0x00,0x01,0x02,0x2a,0x05,0x58,0x00,0x01,0x01,0x5e,0x04,0xe9,0x00,0x01,0x01,0x7f,0x05,0x1b,0x00,0x01,0x01,0x5e,0x04,0x50,0x00,0x01,0x02,0x26,0xfd,0xcd,0x00,0x01,\r\n0x00,0xfa,0x05,0x70,0x00,0x01,0x01,0x7e,0x07,0x41,0x00,0x01,0x01,0x7e,0x06,0xd9,0x00,0x01,0x02,0x09,0x04,0xa4,0x00,0x01,0x02,0x09,0x05,0x76,0x00,0x01,0x02,0x09,0x05,0x9d,0x00,0x01,0x02,0x09,0x05,0x6b,0x00,0x01,0x02,0x5d,0x05,0x7e,0x00,0x01,0x00,0xcd,0xfe,0xf0,0x00,0x01,0x01,0x83,0x04,0x75,0x00,0x01,0x01,0x83,0x03,0xc0,\r\n0x00,0x01,0x01,0x7e,0x06,0x40,0x00,0x01,0x02,0x09,0x05,0x55,0x00,0x01,0x02,0x09,0x04,0xdd,0x00,0x01,0x00,0x9b,0xfe,0x8c,0x00,0x01,0x02,0xa4,0xfd,0xcc,0x00,0x01,0x02,0x26,0xfd,0xd1,0x00,0x01,0x02,0xa4,0xfd,0xc8,0x00,0x01,0x01,0xf4,0x03,0xd5,0x00,0x01,0x02,0x26,0xfd,0xc8,0x00,0x01,0x01,0x2c,0x05,0xaf,0x00,0x01,0x01,0x90,\r\n0x07,0x3f,0x00,0x01,0x01,0xaa,0x06,0xbe,0x00,0x01,0x01,0xf4,0x06,0x77,0x00,0x01,0x00,0xfa,0x07,0xa0,0x00,0x01,0x01,0x90,0xff,0x9c,0x00,0x01,0x01,0x90,0xff,0x5c,0x00,0x01,0x01,0xc6,0x05,0xee,0x00,0x01,0x01,0xc6,0x05,0x43,0x00,0x01,0x01,0x90,0x06,0x5a,0x00,0x01,0x00,0xc8,0xff,0x08,0x00,0x01,0x01,0xc6,0x03,0xb7,0x00,0x01,\r\n0x00,0xfa,0xfd,0x46,0x00,0x01,0x01,0xd9,0x05,0x27,0x00,0x01,0x02,0x3d,0xfd,0xcd,0x00,0x01,0x01,0xd8,0x05,0x27,0x00,0x01,0x02,0x3c,0xfd,0xcd,0x00,0x01,0x01,0x6c,0x05,0xd2,0x00,0x01,0x01,0x6c,0x03,0xd1,0x00,0x01,0x02,0x26,0xfd,0x46,0x00,0x01,0x01,0x2c,0x04,0xba,0x00,0x01,0x01,0x5e,0x04,0x54,0x00,0x01,0x00,0xc8,0x06,0xf1,\r\n0x00,0x01,0x01,0x2c,0xff,0x2c,0x00,0x01,0x00,0xc8,0x07,0xaa,0x00,0x01,0x00,0xc8,0x05,0x8a,0x00,0x01,0x01,0x2c,0xfd,0xcc,0x00,0x01,0x00,0xc8,0x07,0xa9,0x00,0x01,0x00,0xc8,0x06,0x1b,0x00,0x01,0x00,0xc8,0x07,0x28,0x00,0x01,0x01,0x5e,0x04,0x3b,0x00,0x01,0x00,0xfa,0x04,0x89,0x00,0x01,0x01,0x5e,0x04,0x39,0x00,0x01,0x01,0x5e,\r\n0xff,0x0a,0x00,0x01,0x00,0xfa,0xff,0x27,0x00,0x01,0x01,0x5e,0x05,0x83,0x00,0x01,0x00,0xfa,0x05,0xaf,0x00,0x01,0x00,0xfa,0x04,0xec,0x00,0x01,0x00,0xfa,0x04,0x54,0x00,0x01,0x01,0x2c,0x04,0x36,0x00,0x01,0x01,0x90,0xff,0x0a,0x00,0x01,0x01,0x2c,0x04,0xfe,0x00,0x01,0x00,0xf8,0x06,0x1e,0x00,0x01,0x00,0x94,0xff,0x86,0x00,0x01,\r\n0x00,0xc6,0xff,0x86,0x00,0x01,0x00,0xf8,0x08,0x40,0x00,0x01,0x00,0xf8,0x07,0x99,0x00,0x01,0x00,0xf8,0x08,0xb1,0x00,0x01,0x00,0x94,0xfd,0x97,0x00,0x01,0x00,0xc6,0xfd,0x97,0x00,0x01,0x01,0xc9,0x02,0xd2,0x00,0x01,0x01,0x65,0xfd,0xcd,0x00,0x01,0x01,0xc9,0x04,0x6b,0x00,0x01,0x01,0x97,0x06,0x1d,0x00,0x01,0x01,0xc9,0x05,0x13,\r\n0x00,0x01,0x01,0x65,0xfd,0xc9,0x00,0x01,0x01,0x65,0xfd,0xaf,0x00,0x01,0x01,0xc9,0x05,0x83,0x00,0x01,0x01,0xc9,0x05,0x20,0x00,0x01,0x01,0xc9,0x07,0x3f,0x00,0x01,0x01,0xc6,0x04,0xc2,0x00,0x01,0x01,0xc6,0x04,0x4f,0x00,0x01,0x01,0xc6,0x05,0x67,0x00,0x01,0x01,0xc6,0x03,0x04,0x00,0x01,0x00,0xcc,0xfe,0xcd,0x00,0x01,0x01,0xae,\r\n0x03,0x04,0x00,0x01,0x00,0x9a,0xfe,0xf0,0x00,0x01,0x00,0x9a,0xff,0x08,0x00,0x01,0x01,0xf8,0xff,0x6e,0x00,0x01,0x01,0x6c,0x01,0xc5,0x00,0x01,0x00,0xcc,0xff,0x22,0x00,0x01,0x01,0x30,0xfe,0xa4,0x00,0x01,0x00,0xc8,0x05,0xe2,0x00,0x01,0x00,0xc8,0xff,0x2a,0x00,0x01,0x00,0x64,0x05,0x4c,0x00,0x01,0x00,0xb4,0xff,0x2a,0x00,0x01,\r\n0x02,0x3a,0x03,0xd7,0x00,0x01,0x01,0x40,0xff,0x24,0x00,0x01,0x01,0x86,0xfd,0x8a,0x00,0x01,0x02,0x58,0x05,0x32,0x00,0x01,0x02,0xbc,0xfd,0xcd,0x00,0x01,0x02,0x26,0x05,0x32,0x00,0x01,0x03,0xde,0x05,0x50,0x00,0x01,0x02,0x3a,0xff,0x22,0x00,0x01,0x01,0xe0,0x06,0xc2,0x00,0x01,0x01,0xe0,0xfe,0x52,0x00,0x01,0x02,0x9e,0x04,0x2a,\r\n0x00,0x01,0x01,0x68,0x04,0x47,0x00,0x01,0x02,0xe4,0xfc,0x7c,0x00,0x01,0x01,0xd6,0x05,0xaa,0x00,0x01,0x01,0x68,0x05,0x24,0x00,0x01,0x02,0x8a,0xfe,0x48,0x00,0x01,0x01,0x7c,0x06,0x54,0x00,0x01,0x02,0x9e,0x05,0xfa,0x00,0x01,0x02,0x6c,0xff,0x2b,0x00,0x01,0x02,0x94,0x06,0x0e,0x00,0x01,0x01,0x36,0x05,0x1e,0x00,0x01,0x00,0x6e,\r\n0xff,0x10,0x00,0x01,0x01,0x72,0x05,0x96,0x00,0x01,0x01,0x40,0xfe,0x52,0x00,0x01,0x01,0x4a,0xfe,0x52,0x00,0x01,0x01,0x40,0x04,0xf6,0x00,0x01,0x00,0x64,0xfe,0xd4,0x00,0x01,0x02,0x08,0x05,0x0a,0x00,0x01,0x01,0x72,0x05,0x64,0x00,0x01,0x01,0xf4,0x04,0x38,0x00,0x01,0x01,0x90,0x03,0x20,0x00,0x01,0x00,0xdc,0xfd,0xcd,0x00,0x01,\r\n0x01,0x72,0xfd,0xcd,0x00,0x01,0x01,0xea,0x04,0x10,0x00,0x01,0x02,0x58,0xfe,0x52,0x00,0x01,0x01,0xce,0xfd,0x94,0x00,0x01,0x07,0x43,0xfd,0x6c,0x00,0x01,0x04,0xa4,0xfd,0x6c,0x00,0x01,0x01,0x6b,0x05,0xd8,0x00,0x01,0x01,0xc3,0xfe,0xe2,0x00,0x01,0x01,0x90,0x06,0x40,0x00,0x01,0x02,0x3b,0x04,0xb0,0x00,0x01,0x01,0x90,0x05,0xc3,\r\n0x00,0x01,0x02,0x2a,0x06,0x40,0x00,0x01,0x02,0x32,0x05,0x46,0x00,0x01,0x02,0x8a,0xfd,0x7a,0x00,0x01,0x02,0x26,0xfd,0x7a,0x00,0x01,0x01,0x90,0x05,0xaa,0x00,0x01,0x01,0x5e,0x05,0x91,0x00,0x01,0x02,0x2a,0x04,0x90,0x00,0x01,0x06,0xf4,0x06,0xc2,0x00,0x01,0x06,0xf4,0xff,0x2a,0x00,0x01,0x05,0x0a,0x08,0x7a,0x00,0x01,0x04,0xb0,\r\n0xff,0x2a,0x00,0x01,0x08,0xfc,0x06,0x32,0x00,0x01,0x08,0xfc,0xff,0x9c,0x00,0x01,0x0a,0x0a,0x03,0x26,0x00,0x01,0x09,0xa6,0xfd,0xcd,0x00,0x01,0x07,0xd0,0x03,0xe8,0x00,0x01,0x07,0x62,0xfe,0x3e,0x00,0x01,0x06,0x5e,0x06,0x54,0x00,0x01,0x05,0x46,0xfe,0x70,0x00,0x01,0x09,0x92,0x05,0x88,0x00,0x01,0x09,0x92,0xff,0x2a,0x00,0x01,\r\n0x07,0x08,0x06,0x5e,0x00,0x01,0x04,0xe2,0x05,0xbe,0x00,0x01,0x01,0x03,0x07,0xda,0x00,0x01,0x00,0x7e,0x08,0x52,0x00,0x01,0x01,0x03,0x07,0x26,0x00,0x01,0x00,0xc4,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0x2a,0x00,0x01,0x01,0x03,0x07,0x6c,0x00,0x01,0x01,0x03,0x08,0x3e,0x00,0x01,0x01,0x03,0x08,0x98,0x00,0x01,0x00,0xef,0x09,0x24,\r\n0x00,0x01,0x00,0xf5,0x08,0x3e,0x00,0x01,0x01,0x03,0x09,0x38,0x00,0x01,0x00,0xef,0x08,0x5c,0x00,0x01,0x00,0xe9,0x08,0x98,0x00,0x01,0x01,0x03,0x08,0x66,0x00,0x01,0x00,0xec,0x08,0x2a,0x00,0x01,0x01,0x03,0x08,0x16,0x00,0x01,0x01,0x03,0x07,0xf8,0x00,0x01,0x01,0x1f,0x08,0x8e,0x00,0x01,0x01,0x0c,0x08,0x66,0x00,0x01,0x01,0x03,\r\n0x08,0xde,0x00,0x01,0x00,0xf9,0x08,0x34,0x00,0x01,0x00,0xeb,0x08,0x34,0x00,0x01,0x01,0x11,0x08,0x3e,0x00,0x01,0x01,0x1c,0x08,0xd4,0x00,0x01,0x00,0xf3,0x07,0xf8,0x00,0x01,0x00,0xc4,0x08,0x70,0x00,0x01,0x01,0x03,0x08,0x34,0x00,0x01,0x00,0xf9,0x09,0x1a,0x00,0x01,0x01,0x03,0x07,0x30,0x00,0x01,0x01,0x03,0x08,0x48,0x00,0x01,\r\n0x01,0x03,0x07,0xe4,0x00,0x01,0x01,0x03,0x07,0x3a,0x00,0x01,0x01,0x42,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0x7a,0x00,0x01,0x00,0xf8,0x09,0x1a,0x00,0x01,0x00,0xd7,0x08,0xfc,0x00,0x01,0x01,0x03,0x07,0x12,0x00,0x01,0x00,0xe1,0x08,0x34,0x00,0x01,0x01,0x03,0x08,0x52,0x00,0x01,0x01,0x03,0x08,0xb6,0x00,0x01,0x00,0xfa,0x07,0x9e,\r\n0x00,0x01,0x01,0x03,0x08,0xca,0x00,0x01,0x00,0xfa,0x08,0x52,0x00,0x01,0x00,0xfa,0x08,0x98,0x00,0x01,0x01,0x18,0x07,0xd0,0x00,0x01,0x01,0x18,0x08,0x61,0x00,0x01,0x01,0x40,0x08,0x98,0x00,0x01,0x01,0x7c,0x09,0x47,0x00,0x01,0x00,0xc8,0x07,0x78,0x00,0x01,0x01,0x68,0x07,0x78,0x00,0x01,0x00,0xfa,0x08,0x27,0x00,0x01,0x01,0x2c,\r\n0x08,0x98,0x00,0x01,0x01,0xe0,0x08,0x5b,0x00,0x01,0x00,0xdc,0x09,0x2a,0x00,0x01,0x00,0xfa,0x08,0x69,0x00,0x01,0x00,0xfa,0x08,0x2c,0x00,0x01,0x00,0xc8,0x08,0x95,0x00,0x01,0x00,0xa0,0x08,0x95,0x00,0x01,0x01,0x40,0x08,0x95,0x00,0x01,0x02,0x80,0x08,0x95,0x00,0x01,0x01,0x4a,0x08,0x95,0x00,0x01,0x01,0x2c,0x08,0x5b,0x00,0x01,\r\n0x01,0x03,0x06,0xf4,0x00,0x01,0x02,0x5a,0x09,0xc4,0x00,0x01,0x01,0x05,0x08,0x65,0x00,0x01,0x00,0xc9,0x09,0x2a,0x00,0x01,0x00,0xfa,0x09,0x8b,0x00,0x01,0x01,0x03,0x08,0xd9,0x00,0x01,0x00,0x1d,0x0a,0x5b,0x00,0x01,0xff,0x8e,0x09,0xe7,0x00,0x01,0xff,0x97,0x09,0xe7,0x00,0x01,0xff,0x47,0x09,0xff,0x00,0x01,0xff,0x79,0x09,0xa9,\r\n0x00,0x01,0xff,0xcd,0x09,0xa9,0x00,0x01,0x01,0x7a,0x08,0x53,0x00,0x01,0x01,0x93,0x08,0x38,0x00,0x01,0x01,0x03,0xfe,0x0c,0x00,0x01,0x01,0x03,0xfe,0xd4,0x00,0x01,0x00,0xb2,0xfd,0xbc,0x00,0x01,0x01,0x03,0xfd,0xbc,0x00,0x01,0x00,0xec,0xfd,0xc6,0x00,0x01,0x01,0x1f,0xfd,0xc6,0x00,0x01,0x01,0x03,0xfe,0x48,0x00,0x01,0x01,0x03,\r\n0xfe,0x70,0x00,0x01,0x00,0xfa,0xfe,0x53,0x00,0x01,0x01,0x2c,0xfd,0x8b,0x00,0x01,0x00,0xbe,0xfe,0x5c,0x00,0x01,0x01,0x5e,0xfe,0x5c,0x00,0x01,0x00,0xc8,0xfd,0xa5,0x00,0x01,0x01,0x7c,0xfd,0x5e,0x00,0x01,0x01,0x04,0xfd,0xbd,0x00,0x01,0x00,0x8c,0xfd,0x3a,0x00,0x01,0x01,0x03,0xfc,0x8b,0x00,0x01,0x00,0x00,0xfe,0x09,0x00,0x01,\r\n0x02,0x62,0xff,0xe2,0x00,0x01,0x02,0xb7,0x00,0x00,0x00,0x01,0x02,0xc9,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x02,0xad,0x00,0x50,0x00,0x01,0x00,0xdf,0xff,0x44,0x00,0x01,0x02,0xb2,0x00,0x50,0x00,0x01,0x02,0x3a,0xfe,0x42,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x02,0xb8,0x00,0x00,0x00,0x01,0x01,0xa4,0x00,0x00,\r\n0x00,0x01,0x01,0xc6,0x00,0x00,0x00,0x01,0x01,0xb3,0x00,0x00,0x00,0x01,0x03,0x20,0x00,0x00,0x00,0x01,0x02,0x04,0x00,0x00,0x00,0x01,0x01,0x75,0x00,0x00,0x00,0x01,0x00,0xef,0x00,0x00,0x00,0x01,0x00,0x95,0x00,0x00,0x00,0x01,0x02,0x2a,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x01,0x15,0x00,0x00,0x00,0x01,0x00,0xbb,\r\n0x00,0x00,0x00,0x01,0x01,0xd9,0x00,0x00,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x01,0x00,0xc4,0x00,0x00,0x00,0x01,0x00,0x6a,0x00,0x00,0x00,0x01,0x01,0x50,0x00,0x00,0x00,0x01,0x00,0xc1,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x01,0xff,0xe1,0x00,0x00,0x00,0x01,0x02,0x26,0x00,0x00,0x00,0x01,0x01,0x97,0x00,0x00,0x00,0x01,\r\n0x00,0xdf,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x01,0x02,0x5d,0x00,0x00,0x00,0x01,0x01,0xce,0x00,0x00,0x00,0x01,0x01,0x48,0x00,0x00,0x00,0x01,0x00,0xee,0x00,0x00,0x00,0x01,0x00,0xb6,0x00,0x00,0x00,0x01,0x00,0x27,0x00,0x00,0x00,0x01,0xff,0xa1,0x00,0x00,0x00,0x01,0xff,0x47,0x00,0x00,0x00,0x01,0x01,0x3a,0x00,0x00,\r\n0x00,0x01,0x00,0xab,0x00,0x00,0x00,0x01,0xff,0xf3,0x00,0x00,0x00,0x01,0xff,0xcb,0x00,0x00,0x00,0x01,0x02,0x5b,0x00,0x00,0x00,0x01,0x01,0xcc,0x00,0x00,0x00,0x01,0x01,0x46,0x00,0x00,0x00,0x01,0x00,0xec,0x00,0x00,0x00,0x01,0x02,0x5a,0x00,0x00,0x00,0x01,0x01,0xcb,0x00,0x00,0x00,0x01,0x01,0x45,0x00,0x00,0x00,0x01,0x00,0xeb,\r\n0x00,0x00,0x00,0x01,0x01,0x49,0x00,0x00,0x00,0x01,0x00,0xba,0x00,0x00,0x00,0x01,0xff,0xf5,0x00,0x00,0x00,0x01,0xff,0x3b,0x00,0x00,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x53,0x00,0x00,0x00,0x01,0xff,0xf9,0x00,0x00,0x00,0x01,0x01,0x6d,0x00,0x00,0x00,0x01,0x00,0xde,0x00,0x00,0x00,0x01,\r\n0x00,0x58,0x00,0x00,0x00,0x01,0xff,0xfe,0x00,0x00,0x00,0x01,0x02,0x62,0x00,0x00,0x00,0x01,0x01,0xd3,0x00,0x00,0x00,0x01,0x01,0x4d,0x00,0x00,0x00,0x01,0x00,0xf3,0x00,0x00,0x00,0x01,0xfe,0x98,0x00,0x00,0x00,0x01,0xfd,0x91,0x00,0x00,0x00,0x01,0xfc,0xd7,0x00,0x00,0x00,0x01,0x01,0x0e,0x00,0x00,0x00,0x01,0x00,0x7f,0x00,0x00,\r\n0x00,0x01,0xff,0x9f,0x00,0x00,0x00,0x01,0x02,0x57,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x01,0x42,0x00,0x00,0x00,0x01,0x00,0xe8,0x00,0x00,0x00,0x01,0x02,0x08,0x00,0x00,0x00,0x01,0x01,0x79,0x00,0x00,0x00,0x01,0x00,0x99,0x00,0x00,0x00,0x01,0x01,0xd1,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x00,0x01,0xff,0xa7,\r\n0x00,0x00,0x00,0x01,0x01,0xef,0x00,0x00,0x00,0x01,0x01,0x60,0x00,0x00,0x00,0x01,0x00,0xda,0x00,0x00,0x00,0x01,0x00,0x80,0x00,0x00,0x00,0x01,0x00,0xbf,0x00,0x00,0x00,0x01,0xff,0xb6,0x00,0x00,0x00,0x01,0xfe,0xaf,0x00,0x00,0x00,0x01,0xfd,0xf5,0x00,0x00,0x00,0x01,0x01,0xae,0x00,0x00,0x00,0x01,0x01,0x1f,0x00,0x00,0x00,0x01,\r\n0x02,0x53,0x00,0x00,0x00,0x01,0x01,0xc4,0x00,0x00,0x00,0x01,0x01,0xbe,0x00,0x00,0x00,0x01,0x01,0xaa,0x00,0x00,0x00,0x01,0x03,0x1b,0x00,0x00,0x00,0x01,0x02,0x8c,0x00,0x00,0x00,0x01,0x01,0xc0,0x00,0x00,0x00,0x01,0x01,0x34,0x00,0x00,0x00,0x01,0x02,0xa3,0x00,0x00,0x00,0x01,0x02,0x14,0x00,0x00,0x00,0x01,0x01,0x8e,0x00,0x00,\r\n0x00,0x01,0x02,0x9e,0x00,0x00,0x00,0x01,0x02,0x0f,0x00,0x00,0x00,0x01,0x01,0x89,0x00,0x00,0x00,0x01,0x01,0x2f,0x00,0x00,0x00,0x01,0x01,0xbb,0x00,0x00,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x00,0xa6,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,0x01,0x3e,0x00,0x00,0x00,0x01,0x00,0xb8,\r\n0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x00,0x01,0x01,0xe5,0x00,0x00,0x00,0x01,0x01,0x56,0x00,0x00,0x00,0x01,0x00,0xd0,0x00,0x00,0x00,0x01,0x00,0x76,0x00,0x00,0x00,0x01,0x00,0xc5,0x00,0x00,0x00,0x01,0xff,0xe5,0x00,0x00,0x00,0x01,0x01,0xd4,0x00,0x00,0x00,0x01,0x00,0xfc,0x00,0x00,0x00,0x01,0x00,0x6d,0x00,0x00,0x00,0x01,\r\n0xff,0xe7,0x00,0x00,0x00,0x01,0xff,0x8d,0x00,0x00,0x00,0x01,0x01,0x62,0x00,0x00,0x00,0x01,0x00,0xd3,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0xe6,0xff,0x9c,0x00,0x01,0x00,0xca,0x00,0x00,0x00,0x01,0x00,0x8a,0x00,0x00,0x00,0x01,0x01,0x1d,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0x00,\r\n0x00,0x01,0x01,0x10,0x00,0x00,0x00,0x01,0x00,0xf2,0x00,0x00,0x00,0x01,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x01,0xff,0xac,0x00,0x00,0x00,0x01,0x01,0x17,0x00,0x00,0x00,0x01,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0xb5,0x00,0x00,0x00,0x01,0x00,0xbe,0x00,0x00,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x01,0x00,0x98,\r\n0x00,0x00,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x01,0x01,0x80,0x00,0x00,0x00,0x01,0xff,0xb4,0x00,0x00,0x00,0x01,0x01,0x58,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x00,0x01,0xff,0xc4,0x00,0x00,0x00,0x01,0x00,0xd2,0x00,0x00,0x00,0x01,\r\n0x01,0x18,0x00,0x00,0x00,0x01,0x00,0xed,0x00,0x00,0x00,0x01,0x02,0x60,0x00,0x00,0x00,0x01,0x03,0xd5,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x01,0x01,0xa6,0x00,0x00,0x00,0x01,0x01,0x98,0x00,0x00,0x00,0x01,0x00,0xe4,0x00,0x00,0x00,0x01,0x02,0xa8,0x00,0x00,0x00,0x01,0x04,0x6c,0x00,0x00,0x00,0x01,0x03,0x7a,0x00,0x00,\r\n0x00,0x01,0x01,0x9d,0x00,0x00,0x00,0x01,0x00,0x8e,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0x00,0x00,0x01,0x03,0xee,0x00,0x00,0x00,0x01,0x02,0xfc,0x00,0x00,0x00,0x01,0x01,0x47,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x02,0xf8,0x00,0x00,0x00,0x01,0x02,0x0d,0x00,0x00,0x00,0x01,0x00,0xf5,\r\n0x00,0x00,0x00,0x01,0x01,0x13,0x00,0x00,0x00,0x01,0x00,0x60,0x00,0x00,0x00,0x01,0x03,0xa2,0x00,0x00,0x00,0x01,0x02,0xba,0x00,0x00,0x00,0x01,0x01,0x19,0x00,0x00,0x00,0x01,0x01,0x11,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0x00,0x00,0x01,0x04,0xc1,0x00,0x00,0x00,0x01,0x03,0xcf,0x00,0x00,0x00,0x01,0x01,0xb5,0x00,0x00,0x00,0x01,\r\n0x00,0x84,0x00,0x00,0x00,0x01,0x02,0x3b,0x00,0x00,0x00,0x01,0x01,0x0c,0x00,0x00,0x00,0x01,0x01,0x3d,0x00,0x00,0x00,0x01,0x00,0x6c,0x00,0x00,0x00,0x01,0x02,0xc4,0x00,0x00,0x00,0x01,0x01,0xdc,0x00,0x00,0x00,0x01,0x01,0x25,0x00,0x00,0x00,0x01,0x04,0xbb,0x00,0x00,0x00,0x01,0x03,0xc9,0x00,0x00,0x00,0x01,0x01,0x90,0x00,0x00,\r\n0x00,0x01,0x02,0xc1,0x00,0x00,0x00,0x01,0x05,0x02,0x00,0x00,0x00,0x01,0x04,0x10,0x00,0x00,0x00,0x01,0x01,0x72,0x00,0x00,0x00,0x01,0x02,0x3c,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x03,0xce,0x00,0x00,0x00,0x01,0x02,0xdc,0x00,0x00,0x00,0x01,0x01,0x26,0x00,0x00,0x00,0x01,0x03,0xc4,0x00,0x00,0x00,0x01,0x02,0xd2,\r\n0x00,0x00,0x00,0x01,0x01,0x43,0x00,0x00,0x00,0x01,0xff,0x1e,0x00,0x00,0x00,0x01,0x02,0x2b,0x00,0x00,0x00,0x01,0x03,0xec,0x00,0x00,0x00,0x01,0x03,0x38,0x00,0x00,0x00,0x01,0x02,0xe6,0x00,0x00,0x00,0x01,0xff,0xd7,0x00,0x00,0x00,0x01,0x00,0x59,0x00,0x00,0x00,0x01,0x01,0x04,0x00,0x00,0x00,0x01,0x02,0xbf,0x00,0x00,0x00,0x01,\r\n0x04,0xe3,0x00,0x00,0x00,0x01,0x03,0xf1,0x00,0x00,0x00,0x01,0x02,0xbe,0x00,0x00,0x00,0x01,0x04,0xe9,0x00,0x00,0x00,0x01,0x03,0xf7,0x00,0x00,0x00,0x01,0x01,0xab,0x00,0x00,0x00,0x01,0x00,0x62,0x00,0x00,0x00,0x01,0x01,0x6a,0x00,0x00,0x00,0x01,0x02,0xec,0x00,0x00,0x00,0x01,0x01,0x96,0x00,0x00,0x00,0x01,0x01,0x1b,0x00,0x00,\r\n0x00,0x01,0x01,0x39,0x00,0x00,0x00,0x01,0x00,0xdc,0x00,0x00,0x00,0x01,0x02,0xb3,0x00,0x00,0x00,0x01,0x04,0xd0,0x00,0x00,0x00,0x01,0x03,0xde,0x00,0x00,0x00,0x01,0x01,0x86,0x00,0x00,0x00,0x01,0x00,0xb3,0x00,0x00,0x00,0x01,0x02,0x71,0x00,0x00,0x00,0x01,0x04,0x2c,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x01,0x01,0x6c,\r\n0x00,0x00,0x00,0x01,0x01,0x4e,0x00,0x00,0x00,0x01,0x00,0xb2,0x00,0x00,0x00,0x01,0x04,0x3a,0x00,0x00,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x01,0x5c,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0x00,0x00,0x01,0x04,0x75,0x00,0x00,0x00,0x01,0x03,0x83,0x00,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x00,0x01,0x02,0x33,0x00,0x00,0x00,0x01,\r\n0x04,0x04,0x00,0x00,0x00,0x01,0x02,0xd3,0x00,0x00,0x00,0x01,0x00,0xaa,0x00,0x00,0x00,0x01,0x02,0x5e,0x00,0x00,0x00,0x01,0x04,0x26,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x01,0x63,0x00,0x00,0x00,0x01,0x01,0x4f,0x00,0x00,0x00,0x01,0x01,0x0b,0x00,0x00,0x00,0x01,0x02,0xaf,0x00,0x00,0x00,0x01,0x04,0xd3,0x00,0x00,\r\n0x00,0x01,0x03,0xcd,0x00,0x00,0x00,0x01,0x03,0x1f,0x00,0x00,0x00,0x01,0x05,0xd9,0x00,0x00,0x00,0x01,0x04,0xe5,0x00,0x00,0x00,0x01,0x01,0x77,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0x00,0x00,0x01,0x05,0x24,0x00,0x00,0x00,0x01,0x04,0x32,0x00,0x00,0x00,0x01,0x02,0x17,0x00,0x00,0x00,0x01,0x03,0x71,0x00,0x00,0x00,0x01,0x02,0x7f,\r\n0x00,0x00,0x00,0x01,0xff,0x1e,0x01,0x04,0x00,0x01,0xff,0xd7,0x00,0xdc,0x00,0x01,0x00,0x59,0x00,0xf0,0x00,0x01,0x02,0x29,0x00,0x00,0x00,0x01,0x03,0x96,0x00,0x00,0x00,0x01,0x02,0xa4,0x00,0x00,0x00,0x01,0x07,0x17,0x00,0x00,0x00,0x01,0x02,0xf1,0x00,0x00,0x00,0x01,0x05,0xca,0x00,0x00,0x00,0x01,0xff,0x26,0x00,0x00,0x00,0x01,\r\n0x03,0x4e,0x00,0x00,0x00,0x01,0x01,0x77,0x00,0xdc,0x00,0x01,0x00,0x75,0x00,0x00,0x00,0x01,0x00,0xe3,0x00,0x00,0x00,0x01,0x01,0x9c,0x00,0x00,0x00,0x01,0x01,0x01,0x00,0x00,0x00,0x01,0x02,0x82,0x00,0x00,0x00,0x01,0x01,0x52,0x00,0x00,0x00,0x01,0x01,0x83,0x00,0x00,0x00,0x01,0x01,0x8d,0x00,0x00,0x00,0x01,0x00,0x94,0x00,0x00,\r\n0x00,0x01,0x01,0x7f,0x00,0x00,0x00,0x01,0xff,0x7a,0x00,0x00,0x00,0x01,0x02,0xa7,0x00,0x00,0x00,0x01,0x01,0x12,0x00,0xf0,0x00,0x01,0x01,0x5a,0x00,0x00,0x00,0x01,0x01,0x3d,0x00,0xdc,0x00,0x01,0x00,0xc9,0x00,0x00,0x00,0x01,0xff,0x81,0x00,0x00,0x00,0x01,0x01,0xeb,0x00,0xdc,0x00,0x01,0x04,0x54,0x00,0x00,0x00,0x01,0x03,0x07,\r\n0x00,0x00,0x00,0x01,0x00,0x3a,0x00,0x00,0x00,0x01,0xff,0x5e,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0xdc,0x00,0x01,0x04,0x31,0x00,0x00,0x00,0x01,0x02,0xe4,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0xad,0x00,0x00,0x00,0x01,0xff,0xdb,0x00,0x00,0x00,0x01,0x02,0x45,0x00,0xdc,0x00,0x01,0x04,0xae,0x00,0x00,0x00,0x01,\r\n0x01,0x2a,0x00,0x00,0x00,0x01,0x02,0x91,0x00,0x00,0x00,0x01,0x04,0x8a,0x00,0x00,0x00,0x01,0x03,0x39,0x00,0x00,0x00,0x01,0x03,0x98,0x00,0x00,0x00,0x01,0x00,0xd6,0x00,0x00,0x00,0x01,0x01,0xe0,0x00,0x00,0x00,0x01,0x02,0x0b,0x00,0x00,0x00,0x01,0x01,0x7d,0x00,0x00,0x00,0x01,0xff,0x36,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0xdc,\r\n0x00,0x01,0x04,0x09,0x00,0x00,0x00,0x01,0x02,0xbc,0x00,0x00,0x00,0x01,0xff,0xef,0x00,0x00,0x00,0x01,0x00,0x85,0x00,0x00,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x02,0xae,0x00,0xdc,0x00,0x01,0x05,0x17,0x00,0x00,0x00,0x01,0x00,0xfd,0x00,0x00,0x00,0x01,0x01,0x93,0x00,0x00,0x00,0x01,0x02,0xf4,0x00,0xdc,0x00,0x01,0x05,0x5d,\r\n0x00,0x00,0x00,0x01,0x02,0x86,0x00,0x00,0x00,0x01,0x03,0x99,0x00,0x00,0x00,0x01,0x02,0x35,0x00,0x00,0x00,0x01,0x03,0x36,0x00,0x00,0x00,0x01,0x01,0xac,0x00,0x00,0x00,0x01,0x02,0x2c,0x00,0x00,0x00,0x01,0x02,0x02,0x00,0x00,0x00,0x01,0x02,0xb9,0x00,0x00,0x00,0x01,0x01,0x6f,0x00,0x00,0x00,0x01,0x03,0xca,0x00,0x00,0x00,0x01,\r\n0x02,0xb6,0x00,0x00,0x00,0x01,0x04,0x11,0x00,0x00,0x00,0x01,0x01,0xa5,0x00,0x00,0x00,0x01,0x03,0xb9,0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x02,0xdd,0x00,0x00,0x00,0x01,0x03,0xf0,0x00,0x00,0x00,0x01,0x03,0xf8,0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x00,0x00,0x01,0x01,0x53,0x00,0x00,0x00,0x01,0x03,0xdf,0x00,0x00,\r\n0x00,0x01,0x02,0x64,0x00,0x00,0x00,0x01,0x03,0x3b,0x00,0x00,0x00,0x01,0x02,0x2d,0x00,0x00,0x00,0x01,0x04,0x25,0x00,0x00,0x00,0x01,0x02,0x4b,0x00,0x00,0x00,0x01,0x03,0x84,0x00,0x00,0x00,0x01,0x00,0xce,0x00,0x00,0x00,0x01,0x02,0x0a,0x00,0x00,0x00,0x01,0x02,0xed,0x00,0x00,0x00,0x01,0x03,0xba,0x00,0x00,0x00,0x01,0x03,0x77,\r\n0x00,0x00,0x00,0x01,0x02,0xff,0x00,0x00,0x00,0x01,0x04,0x51,0x00,0x00,0x00,0x01,0x02,0xfa,0x00,0x00,0x00,0x01,0x04,0x33,0x00,0x00,0x00,0x01,0x02,0x80,0x00,0x00,0x00,0x01,0x02,0xa5,0x00,0x00,0x00,0x01,0x02,0x41,0x00,0x00,0x00,0x01,0x03,0xd0,0x00,0x00,0x00,0x01,0x01,0xb0,0x00,0x00,0x00,0x01,0x03,0xf2,0x00,0x00,0x00,0x01,\r\n0x03,0xb2,0x00,0x00,0x00,0x01,0x02,0x24,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x00,0x01,0xfe,0xac,0x00,0x00,0x00,0x01,0xff,0xce,0x00,0x00,0x00,0x01,0xff,0xd8,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x00,0x00,0x01,0xff,0x74,0x00,0x00,0x00,0x01,0xfe,0xf2,0x00,0x00,0x00,0x01,0xfe,0xca,0x00,0x00,0x00,0x01,0x02,0x3a,0x00,0x00,\r\n0x00,0x01,0x02,0x44,0x00,0x00,0x00,0x01,0xff,0x06,0x00,0x00,0x00,0x01,0x01,0x9a,0x00,0x00,0x00,0x01,0x02,0x4e,0x00,0x00,0x00,0x01,0xff,0x6a,0x00,0x00,0x00,0x01,0xfe,0xa2,0x00,0x00,0x00,0x01,0xff,0x1a,0x00,0x00,0x00,0x01,0xfe,0xe8,0x00,0x00,0x00,0x01,0xfd,0xd0,0x00,0x00,0x00,0x01,0xfd,0x76,0x00,0x00,0x00,0x01,0xfe,0x34,\r\n0x00,0x00,0x00,0x01,0xfd,0x44,0x00,0x00,0x00,0x01,0xfd,0x1c,0x00,0x00,0x00,0x01,0xfe,0x2a,0x00,0x00,0x00,0x01,0xfe,0x52,0x00,0x00,0x00,0x01,0xfd,0x12,0x00,0x00,0x00,0x01,0xfe,0x66,0x00,0x00,0x00,0x01,0xfd,0x80,0x00,0x00,0x00,0x01,0xfd,0x62,0x00,0x00,0x00,0x01,0xfe,0x3e,0x00,0x00,0x00,0x01,0xfd,0xe4,0x00,0x00,0x00,0x01,\r\n0xfd,0x3a,0x00,0x00,0x00,0x01,0xfe,0x5c,0x00,0x00,0x00,0x01,0xfd,0x4e,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x00,0x01,0xfe,0xd4,0x00,0x00,0x00,0x01,0xfe,0xc0,0x00,0x00,0x00,0x01,0xfe,0x70,0x00,0x00,0x00,0x01,0xfd,0xda,0x00,0x00,0x00,0x01,0xfd,0xc6,0x00,0x00,\r\n0x00,0x01,0xfe,0x20,0x00,0x00,0x00,0x01,0xfe,0x8e,0x00,0x00,0x00,0x01,0xfd,0xf8,0x00,0x00,0x00,0x01,0xfe,0x16,0x00,0x00,0x00,0x01,0xfd,0xbc,0x00,0x00,0x00,0x01,0xfe,0x02,0x00,0x00,0x00,0x01,0xff,0xe2,0x00,0x00,0x00,0x01,0x00,0xfa,0x00,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x00,0x01,0xfd,0xf1,0x00,0x00,0x00,0x01,0xfd,0x8a,\r\n0x00,0x00,0x00,0x01,0xfd,0xa8,0x00,0x00,0x00,0x01,0xfc,0xe0,0x00,0x00,0x00,0x01,0xfe,0x0c,0x00,0x00,0x00,0x01,0xfd,0xee,0x00,0x00,0x00,0x01,0x02,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x02,0xbc,0x0a,0x6a,0x00,0x15,0x61,0x72,0x61,0x62,0x00,0x80,0x62,0x6e,0x67,0x32,0x01,0x3c,0x63,0x79,0x72,0x6c,0x01,0x48,0x64,0x65,\r\n0x76,0x32,0x01,0x70,0x67,0x6a,0x72,0x32,0x01,0xa4,0x67,0x72,0x65,0x6b,0x01,0x7c,0x67,0x75,0x72,0x32,0x01,0xb0,0x68,0x65,0x62,0x72,0x01,0xbc,0x6b,0x68,0x6d,0x72,0x01,0xd8,0x6b,0x6e,0x64,0x32,0x01,0xcc,0x6c,0x61,0x6f,0x20,0x01,0xe4,0x6c,0x61,0x74,0x6e,0x01,0xf0,0x6d,0x6c,0x6d,0x32,0x02,0x46,0x6d,0x6f,0x6e,0x67,0x02,0x52,\r\n0x6d,0x79,0x6d,0x72,0x02,0x5e,0x6f,0x72,0x79,0x32,0x02,0x76,0x74,0x61,0x6c,0x75,0x02,0x6a,0x74,0x65,0x6c,0x32,0x02,0x8e,0x74,0x68,0x61,0x69,0x02,0x9a,0x74,0x69,0x62,0x74,0x02,0xa6,0x74,0x6d,0x6c,0x32,0x02,0x82,0x00,0x3c,0x00,0x05,0x41,0x52,0x41,0x20,0x00,0x22,0x4d,0x4c,0x59,0x20,0x00,0x54,0x4d,0x4f,0x52,0x20,0x00,0x6e,\r\n0x53,0x4e,0x44,0x20,0x00,0x88,0x55,0x52,0x44,0x20,0x00,0xa2,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x04,0x00,0x13,0x00,0x0a,0x00,0x28,0x00,0x2e,0x00,0x3d,0x00,0x4b,0x00,0x51,0x00,0x2f,0x00,0x1e,0x00,0x00,0xff,0xff,0x00,0x09,0x00,0x05,0x00,0x14,0x00,0x0b,0x00,0x29,0x00,0x3e,0x00,0x4c,0x00,0x52,0x00,0x30,0x00,0x1f,0x00,0x00,\r\n0xff,0xff,0x00,0x0a,0x00,0x06,0x00,0x15,0x00,0x0c,0x00,0x2a,0x00,0x39,0x00,0x3f,0x00,0x4d,0x00,0x53,0x00,0x31,0x00,0x20,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x07,0x00,0x16,0x00,0x0d,0x00,0x2b,0x00,0x3a,0x00,0x40,0x00,0x4e,0x00,0x54,0x00,0x32,0x00,0x21,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x08,0x00,0x17,0x00,0x0e,0x00,0x2c,\r\n0x00,0x3b,0x00,0x41,0x00,0x4f,0x00,0x55,0x00,0x33,0x00,0x22,0x00,0x00,0xff,0xff,0x00,0x0a,0x00,0x09,0x00,0x18,0x00,0x0f,0x00,0x2d,0x00,0x3c,0x00,0x42,0x00,0x50,0x00,0x56,0x00,0x34,0x00,0x23,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x78,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x19,0x00,0x24,\r\n0x00,0x35,0x00,0x43,0x00,0x47,0x00,0x5c,0x00,0x00,0x00,0x58,0x00,0x60,0x00,0x64,0x00,0x68,0x00,0x6c,0x00,0x70,0x00,0x74,0x00,0x79,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7a,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x1a,0x00,0x25,0x00,0x36,0x00,0x44,0x00,0x48,0x00,0x5d,0x00,0x01,0x00,0x59,\r\n0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x7b,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7c,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7d,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x03,0x00,0x1b,0x00,0x10,0x00,0x57,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,\r\n0x00,0x7e,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x7f,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x80,0x00,0x0a,0x00,0x01,0x54,0x52,0x4b,0x20,0x00,0x30,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x1c,0x00,0x26,0x00,0x11,0x00,0x37,0x00,0x45,0x00,0x49,0x00,0x5e,0x00,0x02,0x00,0x5a,0x00,0x62,0x00,0x66,\r\n0x00,0x6a,0x00,0x6e,0x00,0x72,0x00,0x76,0x00,0x81,0x00,0x00,0xff,0xff,0x00,0x10,0x00,0x1d,0x00,0x27,0x00,0x12,0x00,0x38,0x00,0x46,0x00,0x4a,0x00,0x5f,0x00,0x03,0x00,0x5b,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x77,0x00,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x83,0x00,0x04,0x00,0x00,\r\n0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x84,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x85,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x86,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x87,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x88,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,\r\n0x00,0x01,0x00,0x89,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x8a,0x00,0x04,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x01,0x00,0x8b,0x00,0x8c,0x63,0x32,0x73,0x63,0x03,0x4a,0x63,0x32,0x73,0x63,0x03,0x50,0x63,0x32,0x73,0x63,0x03,0x56,0x63,0x32,0x73,0x63,0x03,0x60,0x63,0x61,0x6c,0x74,0x03,0x6a,0x63,0x61,0x6c,0x74,\r\n0x03,0x70,0x63,0x61,0x6c,0x74,0x03,0x76,0x63,0x61,0x6c,0x74,0x03,0x7c,0x63,0x61,0x6c,0x74,0x03,0x82,0x63,0x61,0x6c,0x74,0x03,0x88,0x63,0x63,0x6d,0x70,0x03,0x8e,0x63,0x63,0x6d,0x70,0x03,0x98,0x63,0x63,0x6d,0x70,0x03,0xaa,0x63,0x63,0x6d,0x70,0x03,0xb4,0x63,0x63,0x6d,0x70,0x03,0xbe,0x63,0x63,0x6d,0x70,0x03,0xc8,0x63,0x63,\r\n0x6d,0x70,0x03,0xda,0x63,0x63,0x6d,0x70,0x04,0x0c,0x63,0x63,0x6d,0x70,0x04,0x1a,0x64,0x6c,0x69,0x67,0x04,0x24,0x64,0x6c,0x69,0x67,0x04,0x2a,0x64,0x6c,0x69,0x67,0x04,0x30,0x64,0x6c,0x69,0x67,0x04,0x36,0x64,0x6c,0x69,0x67,0x04,0x3c,0x64,0x6c,0x69,0x67,0x04,0x42,0x64,0x6c,0x69,0x67,0x04,0x48,0x64,0x6c,0x69,0x67,0x04,0x4e,\r\n0x64,0x6c,0x69,0x67,0x04,0x54,0x64,0x6c,0x69,0x67,0x04,0x5a,0x64,0x6c,0x69,0x67,0x04,0x62,0x66,0x69,0x6e,0x61,0x04,0x68,0x66,0x69,0x6e,0x61,0x04,0x6e,0x66,0x69,0x6e,0x61,0x04,0x74,0x66,0x69,0x6e,0x61,0x04,0x7a,0x66,0x69,0x6e,0x61,0x04,0x80,0x66,0x69,0x6e,0x61,0x04,0x86,0x66,0x72,0x61,0x63,0x04,0x8c,0x66,0x72,0x61,0x63,\r\n0x04,0x96,0x66,0x72,0x61,0x63,0x04,0xa0,0x66,0x72,0x61,0x63,0x04,0xaa,0x69,0x6e,0x69,0x74,0x04,0xb4,0x69,0x6e,0x69,0x74,0x04,0xba,0x69,0x6e,0x69,0x74,0x04,0xc0,0x69,0x6e,0x69,0x74,0x04,0xc6,0x69,0x6e,0x69,0x74,0x04,0xcc,0x69,0x6e,0x69,0x74,0x04,0xd2,0x69,0x73,0x6f,0x6c,0x04,0xd8,0x6c,0x69,0x67,0x61,0x04,0xde,0x6c,0x69,\r\n0x67,0x61,0x04,0xe8,0x6c,0x69,0x67,0x61,0x04,0xf2,0x6c,0x69,0x67,0x61,0x04,0xfa,0x6c,0x69,0x67,0x61,0x05,0x04,0x6c,0x69,0x67,0x61,0x05,0x0c,0x6c,0x6e,0x75,0x6d,0x05,0x16,0x6c,0x6e,0x75,0x6d,0x05,0x1e,0x6c,0x6e,0x75,0x6d,0x05,0x26,0x6c,0x6e,0x75,0x6d,0x05,0x2e,0x6c,0x6f,0x63,0x6c,0x05,0x36,0x6c,0x6f,0x63,0x6c,0x05,0x3c,\r\n0x6c,0x6f,0x63,0x6c,0x05,0x42,0x6c,0x6f,0x63,0x6c,0x05,0x48,0x6d,0x65,0x64,0x69,0x05,0x4e,0x6d,0x65,0x64,0x69,0x05,0x54,0x6d,0x65,0x64,0x69,0x05,0x5a,0x6d,0x65,0x64,0x69,0x05,0x60,0x6d,0x65,0x64,0x69,0x05,0x66,0x6d,0x65,0x64,0x69,0x05,0x6c,0x6f,0x6e,0x75,0x6d,0x05,0x72,0x6f,0x6e,0x75,0x6d,0x05,0x7a,0x6f,0x6e,0x75,0x6d,\r\n0x05,0x82,0x6f,0x6e,0x75,0x6d,0x05,0x8a,0x70,0x6e,0x75,0x6d,0x05,0x92,0x70,0x6e,0x75,0x6d,0x05,0x9a,0x70,0x6e,0x75,0x6d,0x05,0xa2,0x70,0x6e,0x75,0x6d,0x05,0xaa,0x72,0x63,0x6c,0x74,0x05,0xb2,0x72,0x63,0x6c,0x74,0x05,0xb8,0x72,0x63,0x6c,0x74,0x05,0xbe,0x72,0x63,0x6c,0x74,0x05,0xc4,0x72,0x63,0x6c,0x74,0x05,0xca,0x72,0x63,\r\n0x6c,0x74,0x05,0xd0,0x72,0x6c,0x69,0x67,0x05,0xd6,0x72,0x6c,0x69,0x67,0x05,0xde,0x72,0x6c,0x69,0x67,0x05,0xe6,0x72,0x6c,0x69,0x67,0x05,0xee,0x72,0x6c,0x69,0x67,0x05,0xf6,0x72,0x6c,0x69,0x67,0x05,0xfe,0x72,0x6c,0x69,0x67,0x06,0x06,0x73,0x61,0x6c,0x74,0x06,0x0c,0x73,0x61,0x6c,0x74,0x06,0x18,0x73,0x61,0x6c,0x74,0x06,0x24,\r\n0x73,0x61,0x6c,0x74,0x06,0x30,0x73,0x6d,0x63,0x70,0x06,0x3c,0x73,0x6d,0x63,0x70,0x06,0x42,0x73,0x6d,0x63,0x70,0x06,0x48,0x73,0x6d,0x63,0x70,0x06,0x54,0x73,0x73,0x30,0x31,0x06,0x60,0x73,0x73,0x30,0x31,0x06,0x66,0x73,0x73,0x30,0x31,0x06,0x6c,0x73,0x73,0x30,0x31,0x06,0x72,0x73,0x73,0x31,0x38,0x06,0x78,0x73,0x73,0x31,0x38,\r\n0x06,0x80,0x73,0x73,0x31,0x38,0x06,0x88,0x73,0x73,0x31,0x38,0x06,0x90,0x73,0x73,0x31,0x39,0x06,0x98,0x73,0x73,0x31,0x39,0x06,0x9e,0x73,0x73,0x31,0x39,0x06,0xa4,0x73,0x73,0x31,0x39,0x06,0xaa,0x73,0x73,0x32,0x30,0x06,0xb0,0x73,0x73,0x32,0x30,0x06,0xba,0x73,0x73,0x32,0x30,0x06,0xc4,0x73,0x73,0x32,0x30,0x06,0xce,0x73,0x75,\r\n0x62,0x73,0x06,0xd8,0x73,0x75,0x62,0x73,0x06,0xde,0x73,0x75,0x62,0x73,0x06,0xe4,0x73,0x75,0x62,0x73,0x06,0xea,0x73,0x75,0x70,0x73,0x06,0xf0,0x73,0x75,0x70,0x73,0x06,0xf6,0x73,0x75,0x70,0x73,0x06,0xfc,0x73,0x75,0x70,0x73,0x07,0x02,0x74,0x6e,0x75,0x6d,0x07,0x08,0x74,0x6e,0x75,0x6d,0x07,0x0e,0x74,0x6e,0x75,0x6d,0x07,0x16,\r\n0x74,0x6e,0x75,0x6d,0x07,0x1c,0x74,0x6e,0x75,0x6d,0x07,0x24,0x74,0x6e,0x75,0x6d,0x07,0x2a,0x74,0x6e,0x75,0x6d,0x07,0x30,0x74,0x6e,0x75,0x6d,0x07,0x36,0x74,0x6e,0x75,0x6d,0x07,0x3c,0x74,0x6e,0x75,0x6d,0x07,0x42,0x74,0x6e,0x75,0x6d,0x07,0x6e,0x74,0x6e,0x75,0x6d,0x07,0x76,0x74,0x6e,0x75,0x6d,0x07,0x7c,0x74,0x6e,0x75,0x6d,\r\n0x07,0x82,0x74,0x6e,0x75,0x6d,0x07,0x8a,0x74,0x6e,0x75,0x6d,0x07,0x90,0x74,0x6e,0x75,0x6d,0x07,0x96,0x74,0x6e,0x75,0x6d,0x07,0x9c,0x74,0x6e,0x75,0x6d,0x07,0xa2,0x74,0x6e,0x75,0x6d,0x07,0xa8,0x00,0x00,0x00,0x01,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x1f,0x00,0x00,0x00,0x03,0x00,0x1d,0x00,0x1f,0x00,0x21,0x00,0x00,0x00,0x03,\r\n0x00,0x1d,0x00,0x1f,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x08,0x00,0x09,0x00,0x0a,\r\n0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x08,0x00,0x0c,0x00,0x00,0x00,0x07,0x00,0x05,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x00,0x00,0x17,0x00,0x4e,0x00,0x4f,0x00,0x50,\r\n0x00,0x51,0x00,0x52,0x00,0x53,0x00,0x54,0x00,0x55,0x00,0x56,0x00,0x57,0x00,0x58,0x00,0x59,0x00,0x5a,0x00,0x5b,0x00,0x5c,0x00,0x5d,0x00,0x5e,0x00,0x5f,0x00,0x60,0x00,0x61,0x00,0x62,0x00,0x63,0x00,0x64,0x00,0x00,0x00,0x05,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x39,0x00,0x3a,0x00,0x00,0x00,0x03,0x00,0x18,0x00,0x19,0x00,0x1a,\r\n0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x4d,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x26,0x00,0x00,\r\n0x00,0x01,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x0e,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,\r\n0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x03,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x10,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x13,\r\n0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x13,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x13,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x03,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,\r\n0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x02,0x00,0x2f,0x00,0x31,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,\r\n0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2a,0x00,0x2b,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,\r\n0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x02,0x00,0x2c,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x17,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,\r\n0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x02,0x00,0x11,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,\r\n0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x04,0x00,0x34,0x00,0x35,0x00,0x36,0x00,0x37,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x00,0x00,0x04,0x00,0x1e,0x00,0x20,0x00,0x22,0x00,0x23,0x00,0x00,0x00,0x04,0x00,0x1e,0x00,0x20,0x00,0x22,0x00,0x24,0x00,0x00,0x00,0x01,\r\n0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x01,0x00,0x35,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x36,\r\n0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x03,0x00,0x34,0x00,0x37,0x00,0x38,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1b,\r\n0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x3d,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x3b,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,\r\n0x00,0x00,0x00,0x01,0x00,0x3e,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x49,0x00,0x00,0x00,0x01,0x00,0x45,0x00,0x00,0x00,0x14,0x00,0x2d,0x00,0x30,0x00,0x3b,0x00,0x3c,0x00,0x3d,0x00,0x3e,0x00,0x3f,0x00,0x40,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,0x00,0x45,0x00,0x46,0x00,0x47,\r\n0x00,0x48,0x00,0x49,0x00,0x4a,0x00,0x4b,0x00,0x4c,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x30,0x00,0x00,0x00,0x01,0x00,0x43,0x00,0x00,0x00,0x01,0x00,0x4a,0x00,0x00,0x00,0x02,0x00,0x47,0x00,0x48,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x00,0x01,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,\r\n0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x46,0x00,0x84,0x01,0x0a,0x01,0x1a,0x01,0x2a,0x01,0x3a,0x01,0x4a,0x01,0x64,0x01,0x74,0x01,0x84,0x01,0x94,0x01,0xb8,0x01,0xe6,0x02,0x00,0x02,0x1a,0x02,0x2a,0x02,0x44,0x02,0x54,0x02,0x64,0x02,0x74,0x02,0x84,0x02,0x94,0x02,0xa4,0x02,0xb4,0x02,0xc4,0x02,0xd4,0x02,0xf8,0x03,0x08,\r\n0x03,0x18,0x03,0x28,0x03,0x38,0x03,0x48,0x03,0x58,0x03,0x68,0x03,0x78,0x03,0x88,0x03,0x98,0x03,0xa8,0x03,0xb8,0x03,0xc8,0x03,0xd8,0x03,0xe8,0x03,0xf8,0x04,0x08,0x04,0x18,0x04,0x28,0x04,0x38,0x04,0x48,0x04,0x58,0x04,0x68,0x04,0x78,0x04,0x88,0x04,0x98,0x04,0xa8,0x04,0xb8,0x04,0xc8,0x04,0xd8,0x04,0xe8,0x04,0xf8,0x05,0x08,\r\n0x05,0x18,0x05,0x28,0x05,0x38,0x05,0x48,0x05,0x58,0x05,0x68,0x05,0x78,0x05,0x88,0x05,0x98,0x05,0xa8,0x05,0xb8,0x05,0xc8,0x05,0xd8,0x05,0xe8,0x05,0xf8,0x06,0x08,0x06,0x18,0x06,0x28,0x06,0x38,0x06,0x48,0x06,0x58,0x06,0x68,0x06,0x96,0x07,0xbe,0x07,0xce,0x07,0xde,0x07,0xee,0x07,0xfe,0x08,0x0e,0x08,0x1e,0x08,0x2e,0x08,0x3e,\r\n0x08,0x4e,0x08,0x5e,0x08,0x6e,0x08,0x7e,0x08,0x8e,0x09,0x84,0x09,0x94,0x09,0xa4,0x0a,0x72,0x0a,0x82,0x0a,0x92,0x0b,0x06,0x0b,0x98,0x0b,0xa8,0x0b,0xb8,0x0b,0xc8,0x0b,0xd8,0x0b,0xe8,0x0b,0xf8,0x0c,0x08,0x0c,0x18,0x0c,0x28,0x0c,0x38,0x0c,0x48,0x0c,0x58,0x0c,0x68,0x0c,0x78,0x0c,0x88,0x0c,0x98,0x0c,0xa8,0x0c,0xb8,0x0c,0xc8,\r\n0x0c,0xd8,0x0c,0xe8,0x0c,0xf8,0x0d,0x08,0x0d,0x18,0x0d,0x28,0x0d,0x38,0x0d,0x48,0x0d,0x58,0x0d,0x68,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x66,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x80,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,\r\n0x00,0x00,0x0c,0x7e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x0c,0x80,0x00,0x07,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,0x0c,0x92,0x00,0x01,0x00,0x06,0x00,0x00,0x0c,0x98,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x11,0x58,0x00,0x07,\r\n0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x12,0x72,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x12,0x82,0x00,0x07,0x00,0x09,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x12,0xc6,0x00,0x01,0x00,0x06,0x00,0x00,0x12,0xd0,0x00,0x01,0x00,0x06,0x00,0x00,\r\n0x12,0xdc,0x00,0x07,0x00,0x09,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x0a,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x14,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x2e,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,\r\n0x13,0x6a,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0x74,0x00,0x07,0x00,0x01,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xa2,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xac,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x13,0xde,0x00,0x07,0x00,0x09,0x00,0x02,0x00,0x0a,0x00,0x12,0x00,0x01,\r\n0x00,0x06,0x00,0x00,0x14,0x0e,0x00,0x01,0x00,0x06,0x00,0x00,0x14,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x14,0x44,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x19,0x4e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x1d,0x54,0x00,0x07,\r\n0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x21,0x62,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x21,0xc6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x22,0x00,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x22,0x68,0x00,0x07,\r\n0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x22,0xa2,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x23,0xcc,0x00,0x07,0x01,0x01,0x00,0x03,0x00,0x0c,0x00,0x14,0x00,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x24,0x5c,0x00,0x01,0x00,0x06,0x00,0x00,0x27,0x74,0x00,0x01,0x00,0x06,0x00,0x00,\r\n0x27,0x80,0x00,0x07,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x2f,0x74,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x2f,0xf6,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x35,0x5a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x36,0xf2,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x06,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x2a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x37,0x94,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x37,0xfe,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x38,0x52,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x38,0xa8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3b,0x78,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x3e,0x4c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0x4a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3e,0x48,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3e,0x62,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x3e,0x82,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x3e,0x80,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0x9c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xb0,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x3e,0xc4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xd8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3e,0xec,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x00,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x3f,0x14,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x28,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x3f,0x3c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x3f,0x50,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x3f,0xf6,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x41,0x0c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x41,0x62,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x42,0x9a,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x43,0x42,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0x40,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0x48,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x43,0xd2,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x44,0x5c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x70,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x84,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0x98,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x44,0xac,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xc0,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xd4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x44,0xe8,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x44,0xfc,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x10,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x24,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x38,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x45,0x4c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x60,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x74,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0x88,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x45,0x9c,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x45,0xb0,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x45,0xc4,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x45,0xcc,0x00,0x07,0x00,0x01,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x26,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xd0,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xda,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xe6,0x00,0x01,0x00,0x06,0x00,0x00,0x45,0xf2,0x00,0x07,0x00,0x01,0x00,0x1d,0x00,0x40,0x00,0x48,0x00,0x50,0x00,0x58,0x00,0x60,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,\r\n0x00,0xa8,0x00,0xb0,0x00,0xb8,0x00,0xc0,0x00,0xc8,0x00,0xd0,0x00,0xd8,0x00,0xe0,0x00,0xe8,0x00,0xf0,0x00,0xf8,0x01,0x00,0x01,0x08,0x01,0x10,0x01,0x18,0x01,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x44,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x52,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x62,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x72,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x84,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x90,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0x9e,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xac,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xbc,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xcc,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xde,0x00,0x01,0x00,0x06,0x00,0x00,0x46,0xee,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x0c,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x1a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x2a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x3a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x48,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x58,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x6a,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x7c,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0x9a,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xaa,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xba,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xcc,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xde,0x00,0x01,0x00,0x06,0x00,0x00,0x47,0xf2,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x48,0x04,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x48,0xde,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x48,0xdc,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x48,0xe8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x00,0x49,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x49,0x36,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x4a,0xd6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x4b,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x00,0x4b,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x59,0xc8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5a,0x70,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5b,0xe2,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,\r\n0x00,0x01,0x00,0x04,0x00,0x00,0x5c,0x08,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x5c,0x10,0x00,0x07,0x00,0x01,0x00,0x18,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,\r\n0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe6,0x00,0xee,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xe0,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xec,0x00,0x01,0x00,0x06,0x00,0x00,0x5b,0xfa,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x0a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x1c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x2a,0x00,0x01,\r\n0x00,0x06,0x00,0x00,0x5c,0x3a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x4c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x60,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x6c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x7a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0x9c,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xaa,0x00,0x01,\r\n0x00,0x06,0x00,0x00,0x5c,0xb8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xc8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xd8,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xea,0x00,0x01,0x00,0x06,0x00,0x00,0x5c,0xfc,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x10,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x30,0x00,0x01,\r\n0x00,0x06,0x00,0x00,0x5d,0x3e,0x00,0x01,0x00,0x06,0x00,0x00,0x5d,0x4a,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x5e,0x3a,0x00,0x07,0x00,0x01,0x00,0x14,0x00,0x2e,0x00,0x36,0x00,0x3e,0x00,0x46,0x00,0x4e,0x00,0x56,\r\n0x00,0x5e,0x00,0x66,0x00,0x6e,0x00,0x76,0x00,0x7e,0x00,0x86,0x00,0x8e,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x34,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x42,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x52,0x00,0x01,0x00,0x06,\r\n0x00,0x00,0x5e,0x60,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x70,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x7e,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x8e,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0x9c,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xac,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xba,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xca,0x00,0x01,0x00,0x06,\r\n0x00,0x00,0x5e,0xd8,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xe8,0x00,0x01,0x00,0x06,0x00,0x00,0x5e,0xf6,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x06,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x14,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x24,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x32,0x00,0x01,0x00,0x06,0x00,0x00,0x5f,0x42,0x00,0x07,0x00,0x01,\r\n0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x06,0x00,0x00,0x60,0x46,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x60,0xc4,0x00,0x07,0x00,0x01,0x00,0x0b,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x44,0x00,0x4c,0x00,0x54,0x00,0x5c,0x00,0x64,0x00,0x6c,0x00,0x01,0x00,0x06,0x00,0x00,0x60,0xec,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x60,0xfc,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x0c,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x1a,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x28,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x36,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x44,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x52,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x60,\r\n0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x6e,0x00,0x01,0x00,0x06,0x00,0x00,0x61,0x7c,0x00,0x07,0x00,0x01,0x00,0x0e,0x00,0x22,0x00,0x2a,0x00,0x32,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x8a,0x00,0x01,0x00,0x06,0x00,0x00,0x62,0x5e,0x00,0x01,0x00,0x06,0x00,0x00,\r\n0x62,0x6a,0x00,0x01,0x00,0x06,0x00,0x00,0x63,0x06,0x00,0x01,0x00,0x06,0x00,0x00,0x63,0x2e,0x00,0x01,0x00,0x06,0x00,0x00,0x64,0x20,0x00,0x01,0x00,0x06,0x00,0x00,0x64,0x42,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0x22,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0x36,0x00,0x01,0x00,0x06,0x00,0x00,0x65,0xee,0x00,0x01,0x00,0x06,0x00,0x00,\r\n0x66,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x66,0xb0,0x00,0x01,0x00,0x06,0x00,0x00,0x66,0xe0,0x00,0x01,0x00,0x06,0x00,0x00,0x67,0xd6,0x00,0x01,0x00,0x06,0x00,0x00,0x68,0x00,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x68,0xe2,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x68,0xe0,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x69,0x18,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x69,0x50,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6a,0x0c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,\r\n0x6a,0xc8,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6b,0x84,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6b,0xa8,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6b,0xea,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x6c,0x22,0x00,0x07,0x00,0x09,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6c,0xfe,0x00,0x07,0x01,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6d,0xc0,0x00,0x07,0x01,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6d,0xda,0x00,0x07,0x02,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x6d,0xf4,0x00,0x07,0x00,0x00,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x08,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x1c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,0x6e,0x1a,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x6e,0x18,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x16,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x6e,0x2c,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6e,0x34,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,\r\n0x6e,0xb8,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x00,0x6f,0x58,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0xb4,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x73,0xc0,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,\r\n0x74,0x38,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0x9e,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xc6,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,0x74,0xea,0x00,0x07,0x00,0x01,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x00,0x00,\r\n0x75,0x1a,0x00,0x02,0x00,0x0e,0x00,0x04,0x0e,0x19,0x0e,0x1f,0x0e,0x63,0x0e,0x64,0x00,0x02,0x00,0x04,0x08,0xf8,0x08,0xf8,0x00,0x00,0x09,0x05,0x09,0x05,0x00,0x01,0x09,0x2d,0x09,0x2d,0x00,0x02,0x0a,0x68,0x0a,0x68,0x00,0x03,0x00,0x02,0x00,0x08,0x00,0x01,0x0a,0x3e,0x00,0x01,0x00,0x01,0x09,0xdd,0x00,0x02,0x00,0x0a,0x00,0x02,\r\n0x0e,0x19,0x0e,0x1f,0x00,0x01,0x00,0x02,0x08,0xf8,0x09,0x05,0x00,0x02,0x00,0x0e,0x00,0x04,0x0a,0x3c,0x08,0xdd,0x0a,0x3d,0x0e,0x15,0x00,0x02,0x00,0x03,0x09,0x53,0x09,0x53,0x00,0x00,0x09,0x55,0x09,0x56,0x00,0x01,0x0e,0x14,0x0e,0x14,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x1e,0x00,0x01,0x04,0xd8,0x00,0x00,0x00,0x00,0x00,0x03,\r\n0x00,0x00,0x00,0x01,0x04,0xca,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x02,0x00,0xc9,0x08,0xc7,0x08,0xca,0x00,0x00,0x08,0xcf,0x08,0xcf,0x00,0x04,0x08,0xd1,0x08,0xd1,0x00,0x05,0x08,0xd3,0x08,0xd3,0x00,0x06,0x08,0xe4,0x08,0xe4,0x00,0x07,0x08,0xe7,0x08,0xe7,0x00,0x08,0x08,0xf1,0x08,0xf3,0x00,0x09,0x08,0xf5,0x08,0xf7,\r\n0x00,0x0c,0x08,0xfa,0x08,0xfb,0x00,0x0f,0x08,0xff,0x09,0x00,0x00,0x11,0x09,0x02,0x09,0x02,0x00,0x13,0x09,0x08,0x09,0x20,0x00,0x14,0x09,0x22,0x09,0x2b,0x00,0x2d,0x09,0x34,0x09,0x35,0x00,0x37,0x09,0x3e,0x09,0x3e,0x00,0x39,0x09,0x40,0x09,0x40,0x00,0x3a,0x09,0x42,0x09,0x43,0x00,0x3b,0x09,0x45,0x09,0x46,0x00,0x3d,0x09,0x48,\r\n0x09,0x48,0x00,0x3f,0x09,0x4a,0x09,0x4b,0x00,0x40,0x09,0x4d,0x09,0x4e,0x00,0x42,0x09,0x59,0x09,0x59,0x00,0x44,0x09,0x5b,0x09,0x5b,0x00,0x45,0x09,0x5d,0x09,0x60,0x00,0x46,0x09,0x63,0x09,0x68,0x00,0x4a,0x09,0x6c,0x09,0x6c,0x00,0x50,0x09,0x72,0x09,0x72,0x00,0x51,0x09,0x7c,0x09,0x7c,0x00,0x52,0x09,0x80,0x09,0x8c,0x00,0x53,\r\n0x09,0x8e,0x09,0x8e,0x00,0x60,0x09,0x90,0x09,0x90,0x00,0x61,0x09,0x92,0x09,0x92,0x00,0x62,0x09,0x94,0x09,0x94,0x00,0x63,0x09,0x96,0x09,0x96,0x00,0x64,0x09,0x98,0x09,0x99,0x00,0x65,0x09,0x9b,0x09,0x9c,0x00,0x67,0x09,0x9e,0x09,0x9f,0x00,0x69,0x09,0xa1,0x09,0xa2,0x00,0x6b,0x09,0xa4,0x09,0xa5,0x00,0x6d,0x09,0xa7,0x09,0xa8,\r\n0x00,0x6f,0x09,0xaa,0x09,0xb9,0x00,0x71,0x09,0xbb,0x09,0xbb,0x00,0x81,0x09,0xbd,0x09,0xbd,0x00,0x82,0x09,0xbf,0x09,0xbf,0x00,0x83,0x09,0xc1,0x09,0xc1,0x00,0x84,0x09,0xc3,0x09,0xc5,0x00,0x85,0x09,0xc8,0x09,0xc9,0x00,0x88,0x09,0xcc,0x09,0xcc,0x00,0x8a,0x09,0xcf,0x09,0xcf,0x00,0x8b,0x09,0xd2,0x09,0xd2,0x00,0x8c,0x09,0xd5,\r\n0x09,0xd7,0x00,0x8d,0x09,0xd9,0x09,0xd9,0x00,0x90,0x09,0xdb,0x09,0xdb,0x00,0x91,0x09,0xdd,0x09,0xdd,0x00,0x92,0x09,0xdf,0x09,0xdf,0x00,0x93,0x09,0xe1,0x09,0xe1,0x00,0x94,0x09,0xe3,0x09,0xe3,0x00,0x95,0x09,0xe5,0x09,0xe5,0x00,0x96,0x09,0xe7,0x09,0xe7,0x00,0x97,0x09,0xe9,0x09,0xe9,0x00,0x98,0x09,0xeb,0x09,0xeb,0x00,0x99,\r\n0x09,0xed,0x09,0xed,0x00,0x9a,0x09,0xef,0x09,0xef,0x00,0x9b,0x09,0xf1,0x09,0xf1,0x00,0x9c,0x09,0xf3,0x09,0xf3,0x00,0x9d,0x09,0xf5,0x09,0xf6,0x00,0x9e,0x09,0xf8,0x09,0xf8,0x00,0xa0,0x09,0xfa,0x09,0xfb,0x00,0xa1,0x09,0xfd,0x0a,0x08,0x00,0xa3,0x0a,0x0a,0x0a,0x0e,0x00,0xaf,0x0a,0x24,0x0a,0x24,0x00,0xb4,0x0a,0x26,0x0a,0x26,\r\n0x00,0xb5,0x0a,0x28,0x0a,0x29,0x00,0xb6,0x0a,0x32,0x0a,0x3b,0x00,0xb8,0x0a,0x3e,0x0a,0x3f,0x00,0xc2,0x0a,0x41,0x0a,0x42,0x00,0xc4,0x0a,0x54,0x0a,0x59,0x00,0xc6,0x0a,0x72,0x0a,0x72,0x00,0xcc,0x0a,0x74,0x0a,0x74,0x00,0xcd,0x0a,0x76,0x0a,0x76,0x00,0xce,0x0a,0x78,0x0a,0x78,0x00,0xcf,0x0a,0x7a,0x0a,0x7a,0x00,0xd0,0x0a,0x7c,\r\n0x0a,0x7c,0x00,0xd1,0x0a,0x7e,0x0a,0x7e,0x00,0xd2,0x0a,0x80,0x0a,0x81,0x00,0xd3,0x0a,0x83,0x0a,0x84,0x00,0xd5,0x0a,0x86,0x0a,0x89,0x00,0xd7,0x0a,0x8b,0x0a,0x8c,0x00,0xdb,0x0a,0x8f,0x0a,0x90,0x00,0xdd,0x0a,0x93,0x0a,0x94,0x00,0xdf,0x0a,0x97,0x0a,0x97,0x00,0xe1,0x0a,0x9a,0x0a,0x9a,0x00,0xe2,0x0a,0x9d,0x0a,0x9d,0x00,0xe3,\r\n0x0a,0xa0,0x0a,0xa0,0x00,0xe4,0x0a,0xa3,0x0a,0xa3,0x00,0xe5,0x0a,0xa6,0x0a,0xa6,0x00,0xe6,0x0a,0xa8,0x0a,0xa8,0x00,0xe7,0x0a,0xaa,0x0a,0xaa,0x00,0xe8,0x0a,0xac,0x0a,0xac,0x00,0xe9,0x0a,0xae,0x0a,0xae,0x00,0xea,0x0a,0xb0,0x0a,0xb1,0x00,0xeb,0x0a,0xb4,0x0a,0xb6,0x00,0xed,0x0a,0xb9,0x0a,0xba,0x00,0xf0,0x0b,0x0c,0x0b,0x1a,\r\n0x00,0xf2,0x0e,0x20,0x0e,0x21,0x01,0x01,0x0e,0x24,0x0e,0x24,0x01,0x03,0x0e,0x26,0x0e,0x26,0x01,0x04,0x0e,0x28,0x0e,0x28,0x01,0x05,0x0e,0x2a,0x0e,0x2a,0x01,0x06,0x0e,0x2f,0x0e,0x31,0x01,0x07,0x0e,0x33,0x0e,0x33,0x01,0x0a,0x0e,0x35,0x0e,0x35,0x01,0x0b,0x0e,0x37,0x0e,0x37,0x01,0x0c,0x0e,0x39,0x0e,0x39,0x01,0x0d,0x0e,0x3c,\r\n0x0e,0x3c,0x01,0x0e,0x0e,0x3f,0x0e,0x40,0x01,0x0f,0x0e,0x43,0x0e,0x44,0x01,0x11,0x0e,0x47,0x0e,0x48,0x01,0x13,0x0e,0x4b,0x0e,0x4c,0x01,0x15,0x0e,0x4f,0x0e,0x50,0x01,0x17,0x0e,0x53,0x0e,0x55,0x01,0x19,0x0e,0x57,0x0e,0x57,0x01,0x1c,0x0e,0x59,0x0e,0x59,0x01,0x1d,0x0e,0x5e,0x0e,0x5e,0x01,0x1e,0x0e,0x6e,0x0e,0x6e,0x01,0x1f,\r\n0x0e,0x70,0x0e,0x70,0x01,0x20,0x0e,0x74,0x0e,0x75,0x01,0x21,0x0e,0x78,0x0e,0x78,0x01,0x23,0x0e,0x7a,0x0e,0x7a,0x01,0x24,0x0e,0x7c,0x0e,0x7c,0x01,0x25,0x0e,0x7e,0x0e,0x7e,0x01,0x26,0x0e,0x80,0x0e,0x80,0x01,0x27,0x0e,0x82,0x0e,0x82,0x01,0x28,0x0e,0x84,0x0e,0x84,0x01,0x29,0x0e,0x86,0x0e,0x86,0x01,0x2a,0x0e,0x8f,0x0e,0x98,\r\n0x01,0x2b,0x0e,0x9a,0x0e,0x9a,0x01,0x35,0x0e,0x9c,0x0e,0x9c,0x01,0x36,0x0e,0x9e,0x0e,0x9e,0x01,0x37,0x0e,0xa0,0x0e,0xa0,0x01,0x38,0x0e,0xa2,0x0e,0xa2,0x01,0x39,0x0e,0xa5,0x0e,0xab,0x01,0x3a,0x0e,0xae,0x0e,0xae,0x01,0x41,0x0e,0xb1,0x0e,0xb1,0x01,0x42,0x0e,0xb3,0x0e,0xb3,0x01,0x43,0x0e,0xb5,0x0e,0xb5,0x01,0x44,0x0e,0xb7,\r\n0x0e,0xb7,0x01,0x45,0x0e,0xb9,0x0e,0xb9,0x01,0x46,0x0e,0xbb,0x0e,0xbb,0x01,0x47,0x0e,0xbd,0x0e,0xbd,0x01,0x48,0x0e,0xbf,0x0e,0xbf,0x01,0x49,0x0e,0xc1,0x0e,0xc1,0x01,0x4a,0x0e,0xc3,0x0e,0xc3,0x01,0x4b,0x0e,0xc5,0x0e,0xc5,0x01,0x4c,0x0e,0xc7,0x0e,0xc7,0x01,0x4d,0x0e,0xc9,0x0e,0xcd,0x01,0x4e,0x0e,0xcf,0x0e,0xd0,0x01,0x53,\r\n0x0e,0xd3,0x0e,0xd3,0x01,0x55,0x0e,0xd5,0x0e,0xd5,0x01,0x56,0x0e,0xda,0x0e,0xe3,0x01,0x57,0x0e,0xe6,0x0e,0xe6,0x01,0x61,0x0e,0xec,0x0e,0xec,0x01,0x62,0x0e,0xee,0x0e,0xee,0x01,0x63,0x0e,0xf0,0x0e,0xf0,0x01,0x64,0x0e,0xf2,0x0e,0xf2,0x01,0x65,0x0e,0xf4,0x0e,0xf4,0x01,0x66,0x0e,0xf6,0x0e,0xf6,0x01,0x67,0x0e,0xf8,0x0e,0xf8,\r\n0x01,0x68,0x0e,0xfa,0x0e,0xfa,0x01,0x69,0x0e,0xfc,0x0e,0xfc,0x01,0x6a,0x0f,0x00,0x0f,0x03,0x01,0x6b,0x0f,0x05,0x0f,0x0a,0x01,0x6f,0x0f,0x0c,0x0f,0x0c,0x01,0x75,0x0f,0x0e,0x0f,0x0e,0x01,0x76,0x0f,0x10,0x0f,0x10,0x01,0x77,0x0f,0x12,0x0f,0x12,0x01,0x78,0x0f,0x14,0x0f,0x14,0x01,0x79,0x0f,0x16,0x0f,0x17,0x01,0x7a,0x0f,0x1a,\r\n0x0f,0x1b,0x01,0x7c,0x0f,0x1e,0x0f,0x1f,0x01,0x7e,0x0f,0x22,0x0f,0x25,0x01,0x80,0x0f,0x28,0x0f,0x2d,0x01,0x84,0x0f,0x30,0x0f,0x31,0x01,0x8a,0x0f,0x34,0x0f,0x35,0x01,0x8c,0x0f,0x38,0x0f,0x41,0x01,0x8e,0x0f,0x44,0x0f,0x45,0x01,0x98,0x0f,0x48,0x0f,0x49,0x01,0x9a,0x0f,0x4c,0x0f,0x4d,0x01,0x9c,0x0f,0x62,0x0f,0x6b,0x01,0x9e,\r\n0x0f,0x98,0x0f,0xa4,0x01,0xa8,0x0f,0xa6,0x0f,0xb3,0x01,0xb5,0x0f,0xb5,0x0f,0xbc,0x01,0xc3,0x14,0x55,0x14,0x5c,0x01,0xcb,0x14,0x73,0x14,0x73,0x01,0xd3,0x14,0x76,0x14,0x76,0x01,0xd4,0x14,0x79,0x14,0x79,0x01,0xd5,0x14,0x7d,0x14,0x7e,0x01,0xd6,0x14,0x81,0x14,0x81,0x01,0xd8,0x14,0x84,0x14,0x84,0x01,0xd9,0x14,0x87,0x14,0x87,\r\n0x01,0xda,0x14,0xad,0x14,0xae,0x01,0xdb,0x00,0x01,0x00,0x01,0x09,0x28,0x00,0x01,0x01,0x0e,0x00,0x0c,0x00,0x1e,0x00,0x30,0x00,0x42,0x00,0x4c,0x00,0x5e,0x00,0x70,0x00,0x7a,0x00,0xb4,0x00,0xbe,0x00,0xd0,0x00,0xf2,0x01,0x04,0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x62,0x00,0x02,0x09,0x32,0x0e,0x69,0x00,0x02,0x09,0x7e,0x00,0x02,\r\n0x00,0x06,0x00,0x0c,0x0a,0x68,0x00,0x02,0x09,0x32,0x0e,0x66,0x00,0x02,0x09,0x7e,0x00,0x01,0x00,0x04,0x0e,0x6b,0x00,0x02,0x09,0x7f,0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x65,0x00,0x02,0x09,0x32,0x0e,0x67,0x00,0x02,0x09,0x7e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x66,0x00,0x02,0x09,0x32,0x0e,0x68,0x00,0x02,0x09,0x7e,0x00,0x01,\r\n0x00,0x04,0x0e,0x6c,0x00,0x02,0x09,0x7f,0x00,0x07,0x00,0x10,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x2e,0x00,0x34,0x0a,0x65,0x00,0x02,0x09,0x2f,0x0a,0x66,0x00,0x02,0x09,0x30,0x0a,0x68,0x00,0x02,0x09,0x2d,0x0e,0x62,0x00,0x02,0x09,0x2c,0x0e,0x64,0x00,0x02,0x0e,0x63,0x0e,0x65,0x00,0x02,0x09,0x73,0x13,0xe9,0x00,0x02,\r\n0x09,0x73,0x00,0x01,0x00,0x04,0x0e,0x6a,0x00,0x02,0x09,0x7e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x65,0x00,0x02,0x09,0x32,0x13,0xe9,0x00,0x02,0x09,0x32,0x00,0x04,0x00,0x0a,0x00,0x10,0x00,0x16,0x00,0x1c,0x0e,0x66,0x00,0x02,0x09,0x2d,0x0e,0x67,0x00,0x02,0x09,0x2f,0x0e,0x68,0x00,0x02,0x09,0x30,0x0e,0x6a,0x00,0x02,0x09,0x33,\r\n0x00,0x02,0x00,0x06,0x00,0x0c,0x0e,0x6b,0x00,0x02,0x09,0x2e,0x0e,0x6c,0x00,0x02,0x09,0x31,0x00,0x01,0x00,0x04,0x0e,0x64,0x00,0x02,0x09,0x32,0x00,0x02,0x00,0x04,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x73,0x09,0x73,0x00,0x08,0x09,0x7e,0x09,0x7f,0x00,0x09,0x0e,0x63,0x0e,0x63,0x00,0x0b,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08,\r\n0x00,0x02,0x00,0x06,0x00,0x0c,0x0a,0x67,0x00,0x02,0x09,0x31,0x0a,0x69,0x00,0x02,0x09,0x2e,0x00,0x01,0x00,0x01,0x09,0x32,0x00,0x01,0x00,0x52,0x00,0x01,0x00,0x08,0x00,0x09,0x00,0x14,0x00,0x1a,0x00,0x20,0x00,0x26,0x00,0x2c,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x11,0x9a,0x00,0x02,0x08,0xd8,0x11,0x9b,0x00,0x02,0x08,0xd9,\r\n0x11,0x9c,0x00,0x02,0x08,0xda,0x11,0x9d,0x00,0x02,0x08,0xdb,0x11,0x9e,0x00,0x02,0x08,0xdc,0x11,0x9f,0x00,0x02,0x08,0xdd,0x11,0xa0,0x00,0x02,0x08,0xde,0x11,0xa1,0x00,0x02,0x08,0xdf,0x11,0xa2,0x00,0x02,0x08,0xe0,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x3c,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0x00,0x67,0x00,0x03,0x00,0x02,0x00,0x48,0x00,0x52,0x00,0x01,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x03,0x00,0x03,0x00,0x34,0x00,0x34,0x00,0x3e,0x00,0x01,0x00,0x1e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x67,0x00,0x01,0x00,0x02,0x0a,0x14,0x14,0x6b,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,\r\n0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x88,0x14,0x96,0x00,0x00,0x00,0x01,0x00,0x01,0x0a,0x14,0x00,0x03,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x6a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x02,0x00,0x6e,0x00,0x42,0x00,0x01,0x00,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,\r\n0x00,0x03,0x00,0x03,0x00,0x5a,0x00,0x5a,0x00,0x2e,0x00,0x01,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x03,0x00,0x04,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x18,0x00,0x01,0x00,0x2e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x00,0x03,0x0a,0x44,0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,\r\n0x13,0x45,0x00,0x02,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x03,0x00,0x01,0x00,0x26,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x03,0x00,0x02,0x00,0x30,0x00,0x3a,0x00,0x01,\r\n0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x01,0x00,0x01,0x0a,0x45,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x14,0x9a,0x00,0x03,0x00,0x01,0x00,0x26,0x00,0x01,0x00,0x2e,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x03,0x00,0x02,0x00,0x32,0x00,0x3c,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6a,0x00,0x01,0x00,0x02,0x0a,0x45,0x0a,0x46,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x01,0x14,0x9e,\r\n0x14,0xac,0x00,0x00,0x00,0x01,0x00,0x01,0x14,0x9a,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x24,0x00,0x01,0x00,0x2c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x02,0x00,0x02,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x53,0x09,0x55,0x00,0x0a,0x00,0x01,0x00,0x02,0x14,0x03,0x14,0x2b,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,\r\n0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2e,0x00,0x03,0x00,0x44,0x00,0x44,0x00,0x44,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x04,0x00,0x2e,0x00,0x2e,0x00,0x2e,0x00,0x2e,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x02,0x00,0x03,0x0a,0x44,\r\n0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,0x13,0x45,0x00,0x02,0x00,0x02,0x00,0x01,0x14,0x9e,0x14,0xac,0x00,0x00,0x00,0x02,0x01,0xc8,0x00,0xe1,0x08,0xf2,0x08,0xc9,0x08,0xc8,0x0e,0x24,0x08,0xca,0x09,0x02,0x08,0xc7,0x0e,0x26,0x08,0xf6,0x0e,0x28,0x0e,0x2a,0x08,0xcf,0x08,0xd1,0x08,0xd3,0x0e,0x2f,0x0e,0x30,\r\n0x0b,0x0c,0x0b,0x0d,0x0e,0x31,0x0e,0x33,0x0e,0x35,0x0e,0x37,0x0e,0x39,0x0e,0x3c,0x08,0xe4,0x08,0xe7,0x0e,0x53,0x0e,0x54,0x0e,0x55,0x09,0x59,0x0e,0x57,0x0e,0x59,0x08,0xf3,0x0e,0x5e,0x08,0xf7,0x08,0xf5,0x0e,0x6e,0x0e,0x82,0x09,0x43,0x0b,0x0e,0x0e,0xb1,0x0e,0xbd,0x09,0x4b,0x09,0x4d,0x0e,0x78,0x0e,0x8f,0x0b,0x0f,0x0e,0xcf,\r\n0x09,0x72,0x0e,0xda,0x0e,0xdb,0x09,0x66,0x09,0x68,0x0e,0xa8,0x0e,0x70,0x09,0x81,0x09,0x83,0x09,0x85,0x09,0x87,0x0e,0x74,0x0e,0x75,0x09,0x8b,0x0e,0x7a,0x0e,0x7c,0x0e,0x7e,0x0e,0x80,0x0e,0x84,0x0e,0x86,0x09,0x99,0x09,0x9c,0x09,0x9f,0x09,0xa2,0x09,0xa5,0x09,0xa8,0x0e,0x90,0x0e,0x91,0x0e,0x92,0x0e,0x93,0x0e,0x94,0x0e,0x95,\r\n0x0e,0x96,0x0e,0x97,0x0b,0x10,0x0b,0x11,0x0b,0x12,0x0b,0x13,0x0b,0x14,0x0b,0x15,0x0b,0x16,0x0e,0x98,0x0e,0x9a,0x0e,0x9c,0x0e,0x9e,0x0e,0xa0,0x0e,0xa2,0x09,0xc5,0x0e,0xa5,0x0e,0xa6,0x0e,0xa7,0x0e,0xa9,0x0e,0xaa,0x0e,0xab,0x0e,0xae,0x0e,0xb3,0x0e,0xb5,0x0e,0xb7,0x0e,0xb9,0x0e,0xbb,0x0e,0xbf,0x0e,0xc1,0x0e,0xc3,0x0e,0xc5,\r\n0x0e,0xc7,0x0e,0xc9,0x0e,0xca,0x0e,0xcb,0x0e,0xcc,0x0e,0xcd,0x0e,0xd0,0x0e,0xd3,0x0e,0xd5,0x09,0xfb,0x0e,0xdc,0x0e,0xdd,0x0e,0xde,0x0e,0xdf,0x0e,0xe0,0x0e,0xe1,0x0e,0xe2,0x0e,0xe3,0x0a,0x06,0x0a,0x08,0x0e,0xe6,0x0a,0x0c,0x0a,0x0e,0x0e,0xec,0x0e,0xee,0x0a,0x29,0x0a,0x3f,0x0a,0x55,0x0a,0x57,0x0a,0x59,0x0e,0xf0,0x0e,0xf2,\r\n0x0e,0xf4,0x0e,0xf6,0x0e,0xf8,0x0e,0xfa,0x0e,0xfc,0x0a,0x81,0x0a,0x84,0x0f,0x00,0x0f,0x01,0x0f,0x02,0x0f,0x03,0x0a,0x8c,0x0a,0x90,0x0a,0x94,0x0f,0x05,0x0f,0x06,0x0f,0x07,0x0f,0x08,0x0f,0x09,0x0f,0x0a,0x0f,0x0c,0x0f,0x0e,0x0f,0x10,0x0f,0x12,0x0a,0xb1,0x0b,0x17,0x0b,0x18,0x0f,0x14,0x0b,0x1a,0x0e,0x21,0x0e,0x40,0x0e,0x44,\r\n0x0e,0x48,0x0e,0x4c,0x0e,0x50,0x0f,0x17,0x0f,0x1b,0x0f,0x1f,0x0f,0x23,0x0f,0x25,0x0f,0x29,0x0f,0x2b,0x0f,0x2d,0x0f,0x31,0x0f,0x35,0x0f,0x39,0x0f,0x3b,0x0f,0x3d,0x0f,0x3f,0x0f,0x41,0x0f,0x45,0x0f,0x49,0x0f,0x4d,0x13,0x00,0x13,0x05,0x13,0x0b,0x13,0x0f,0x13,0x13,0x13,0x17,0x13,0x1b,0x13,0x1f,0x13,0x23,0x13,0x25,0x13,0x27,\r\n0x13,0x29,0x14,0x07,0x14,0x0a,0x14,0x0e,0x14,0x12,0x14,0x14,0x14,0x16,0x14,0x6d,0x14,0x70,0x14,0x73,0x14,0x76,0x14,0x79,0x14,0x7d,0x14,0x7e,0x14,0x81,0x14,0x84,0x14,0x87,0x00,0x02,0x00,0x8d,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x08,0x09,0x20,0x00,0x01,0x09,0x22,0x09,0x2b,0x00,0x1a,0x09,0x3e,0x09,0x3e,0x00,0x24,0x09,0x40,\r\n0x09,0x40,0x00,0x25,0x09,0x42,0x09,0x42,0x00,0x26,0x09,0x45,0x09,0x46,0x00,0x27,0x09,0x48,0x09,0x48,0x00,0x29,0x09,0x4a,0x09,0x4a,0x00,0x2a,0x09,0x4e,0x09,0x4e,0x00,0x2b,0x09,0x5b,0x09,0x5b,0x00,0x2c,0x09,0x5d,0x09,0x60,0x00,0x2d,0x09,0x63,0x09,0x65,0x00,0x31,0x09,0x67,0x09,0x67,0x00,0x34,0x09,0x6c,0x09,0x6c,0x00,0x35,\r\n0x09,0x7c,0x09,0x7c,0x00,0x36,0x09,0x80,0x09,0x80,0x00,0x37,0x09,0x82,0x09,0x82,0x00,0x38,0x09,0x84,0x09,0x84,0x00,0x39,0x09,0x86,0x09,0x86,0x00,0x3a,0x09,0x88,0x09,0x8a,0x00,0x3b,0x09,0x8c,0x09,0x8c,0x00,0x3e,0x09,0x8e,0x09,0x8e,0x00,0x3f,0x09,0x90,0x09,0x90,0x00,0x40,0x09,0x92,0x09,0x92,0x00,0x41,0x09,0x94,0x09,0x94,\r\n0x00,0x42,0x09,0x96,0x09,0x96,0x00,0x43,0x09,0x98,0x09,0x98,0x00,0x44,0x09,0x9b,0x09,0x9b,0x00,0x45,0x09,0x9e,0x09,0x9e,0x00,0x46,0x09,0xa1,0x09,0xa1,0x00,0x47,0x09,0xa4,0x09,0xa4,0x00,0x48,0x09,0xa7,0x09,0xa7,0x00,0x49,0x09,0xaa,0x09,0xb9,0x00,0x4a,0x09,0xbb,0x09,0xbb,0x00,0x5a,0x09,0xbd,0x09,0xbd,0x00,0x5b,0x09,0xbf,\r\n0x09,0xbf,0x00,0x5c,0x09,0xc1,0x09,0xc1,0x00,0x5d,0x09,0xc3,0x09,0xc4,0x00,0x5e,0x09,0xc8,0x09,0xc9,0x00,0x60,0x09,0xcc,0x09,0xcc,0x00,0x62,0x09,0xcf,0x09,0xcf,0x00,0x63,0x09,0xd2,0x09,0xd2,0x00,0x64,0x09,0xd5,0x09,0xd7,0x00,0x65,0x09,0xd9,0x09,0xd9,0x00,0x68,0x09,0xdb,0x09,0xdb,0x00,0x69,0x09,0xdd,0x09,0xdd,0x00,0x6a,\r\n0x09,0xdf,0x09,0xdf,0x00,0x6b,0x09,0xe1,0x09,0xe1,0x00,0x6c,0x09,0xe3,0x09,0xe3,0x00,0x6d,0x09,0xe5,0x09,0xe5,0x00,0x6e,0x09,0xe7,0x09,0xe7,0x00,0x6f,0x09,0xe9,0x09,0xe9,0x00,0x70,0x09,0xeb,0x09,0xeb,0x00,0x71,0x09,0xed,0x09,0xed,0x00,0x72,0x09,0xef,0x09,0xef,0x00,0x73,0x09,0xf1,0x09,0xf1,0x00,0x74,0x09,0xf3,0x09,0xf3,\r\n0x00,0x75,0x09,0xf5,0x09,0xf6,0x00,0x76,0x09,0xf8,0x09,0xf8,0x00,0x78,0x09,0xfa,0x09,0xfa,0x00,0x79,0x09,0xfd,0x0a,0x05,0x00,0x7a,0x0a,0x07,0x0a,0x07,0x00,0x83,0x0a,0x0a,0x0a,0x0b,0x00,0x84,0x0a,0x0d,0x0a,0x0d,0x00,0x86,0x0a,0x24,0x0a,0x24,0x00,0x87,0x0a,0x26,0x0a,0x26,0x00,0x88,0x0a,0x28,0x0a,0x28,0x00,0x89,0x0a,0x3e,\r\n0x0a,0x3e,0x00,0x8a,0x0a,0x54,0x0a,0x54,0x00,0x8b,0x0a,0x56,0x0a,0x56,0x00,0x8c,0x0a,0x58,0x0a,0x58,0x00,0x8d,0x0a,0x72,0x0a,0x72,0x00,0x8e,0x0a,0x74,0x0a,0x74,0x00,0x8f,0x0a,0x76,0x0a,0x76,0x00,0x90,0x0a,0x78,0x0a,0x78,0x00,0x91,0x0a,0x7a,0x0a,0x7a,0x00,0x92,0x0a,0x7c,0x0a,0x7c,0x00,0x93,0x0a,0x7e,0x0a,0x7e,0x00,0x94,\r\n0x0a,0x80,0x0a,0x80,0x00,0x95,0x0a,0x83,0x0a,0x83,0x00,0x96,0x0a,0x86,0x0a,0x89,0x00,0x97,0x0a,0x8b,0x0a,0x8b,0x00,0x9b,0x0a,0x8f,0x0a,0x8f,0x00,0x9c,0x0a,0x93,0x0a,0x93,0x00,0x9d,0x0a,0x97,0x0a,0x97,0x00,0x9e,0x0a,0x9a,0x0a,0x9a,0x00,0x9f,0x0a,0x9d,0x0a,0x9d,0x00,0xa0,0x0a,0xa0,0x0a,0xa0,0x00,0xa1,0x0a,0xa3,0x0a,0xa3,\r\n0x00,0xa2,0x0a,0xa6,0x0a,0xa6,0x00,0xa3,0x0a,0xa8,0x0a,0xa8,0x00,0xa4,0x0a,0xaa,0x0a,0xaa,0x00,0xa5,0x0a,0xac,0x0a,0xac,0x00,0xa6,0x0a,0xae,0x0a,0xae,0x00,0xa7,0x0a,0xb0,0x0a,0xb0,0x00,0xa8,0x0a,0xb4,0x0a,0xb6,0x00,0xa9,0x0b,0x19,0x0b,0x19,0x00,0xac,0x0e,0x20,0x0e,0x20,0x00,0xad,0x0e,0x3f,0x0e,0x3f,0x00,0xae,0x0e,0x43,\r\n0x0e,0x43,0x00,0xaf,0x0e,0x47,0x0e,0x47,0x00,0xb0,0x0e,0x4b,0x0e,0x4b,0x00,0xb1,0x0e,0x4f,0x0e,0x4f,0x00,0xb2,0x0f,0x16,0x0f,0x16,0x00,0xb3,0x0f,0x1a,0x0f,0x1a,0x00,0xb4,0x0f,0x1e,0x0f,0x1e,0x00,0xb5,0x0f,0x22,0x0f,0x22,0x00,0xb6,0x0f,0x24,0x0f,0x24,0x00,0xb7,0x0f,0x28,0x0f,0x28,0x00,0xb8,0x0f,0x2a,0x0f,0x2a,0x00,0xb9,\r\n0x0f,0x2c,0x0f,0x2c,0x00,0xba,0x0f,0x30,0x0f,0x30,0x00,0xbb,0x0f,0x34,0x0f,0x34,0x00,0xbc,0x0f,0x38,0x0f,0x38,0x00,0xbd,0x0f,0x3a,0x0f,0x3a,0x00,0xbe,0x0f,0x3c,0x0f,0x3c,0x00,0xbf,0x0f,0x3e,0x0f,0x3e,0x00,0xc0,0x0f,0x40,0x0f,0x40,0x00,0xc1,0x0f,0x44,0x0f,0x44,0x00,0xc2,0x0f,0x48,0x0f,0x48,0x00,0xc3,0x0f,0x4c,0x0f,0x4c,\r\n0x00,0xc4,0x13,0x02,0x13,0x02,0x00,0xc5,0x13,0x04,0x13,0x04,0x00,0xc6,0x13,0x08,0x13,0x08,0x00,0xc7,0x13,0x0c,0x13,0x0c,0x00,0xc8,0x13,0x10,0x13,0x10,0x00,0xc9,0x13,0x14,0x13,0x14,0x00,0xca,0x13,0x18,0x13,0x18,0x00,0xcb,0x13,0x1c,0x13,0x1c,0x00,0xcc,0x13,0x20,0x13,0x20,0x00,0xcd,0x13,0x24,0x13,0x24,0x00,0xce,0x13,0x26,\r\n0x13,0x26,0x00,0xcf,0x13,0x28,0x13,0x28,0x00,0xd0,0x14,0x04,0x14,0x04,0x00,0xd1,0x14,0x09,0x14,0x09,0x00,0xd2,0x14,0x0b,0x14,0x0b,0x00,0xd3,0x14,0x0f,0x14,0x0f,0x00,0xd4,0x14,0x13,0x14,0x13,0x00,0xd5,0x14,0x15,0x14,0x15,0x00,0xd6,0x14,0x53,0x14,0x5c,0x00,0xd7,0x00,0x02,0x01,0x36,0x00,0x98,0x0e,0xd8,0x0e,0x25,0x0e,0x27,\r\n0x0e,0x29,0x0e,0x2b,0x0e,0x2c,0x0e,0x2d,0x0e,0x2e,0x0e,0x32,0x0e,0x34,0x0e,0x36,0x0e,0x38,0x0e,0x3b,0x0e,0x3e,0x08,0xe3,0x08,0xe6,0x08,0xe9,0x08,0xec,0x0e,0x56,0x09,0x3f,0x0e,0x58,0x0e,0x5a,0x0e,0x5d,0x0e,0x60,0x0e,0x61,0x09,0x3b,0x0e,0x83,0x0e,0x8d,0x0e,0xb2,0x0e,0xbe,0x0e,0xe4,0x0e,0x79,0x09,0x62,0x09,0x6e,0x0e,0x72,\r\n0x0e,0x77,0x0e,0x7b,0x0e,0x7d,0x0e,0x7f,0x0e,0x81,0x0e,0x85,0x0e,0x87,0x0e,0x88,0x0e,0x89,0x0e,0x8a,0x0e,0x8b,0x0e,0x8c,0x0e,0x8e,0x0e,0x99,0x0e,0x9b,0x0e,0x9d,0x0e,0x9f,0x0e,0xa1,0x0e,0xa4,0x09,0xc7,0x09,0x3d,0x09,0xcb,0x09,0xce,0x09,0xd1,0x09,0xd4,0x0e,0xad,0x0e,0xb0,0x0e,0xb4,0x0e,0xb6,0x0e,0xb8,0x0e,0xba,0x0e,0xbc,\r\n0x0e,0xc0,0x0e,0xc2,0x0e,0xc4,0x0e,0xc6,0x0e,0xc8,0x0a,0x5f,0x0a,0x60,0x0a,0x61,0x0a,0x62,0x0e,0xce,0x0e,0xd2,0x0e,0xd4,0x0e,0xd6,0x0e,0xd9,0x0e,0xe5,0x0e,0xe8,0x0e,0xea,0x0e,0xed,0x0e,0xef,0x0a,0x2b,0x0e,0xba,0x0a,0x5b,0x0e,0xf1,0x0e,0xf3,0x0e,0xf5,0x0e,0xf7,0x0e,0xf9,0x0e,0xfb,0x0e,0xfd,0x0e,0xfe,0x0e,0xff,0x0f,0x04,\r\n0x0a,0x8e,0x0a,0x92,0x0a,0x96,0x0a,0x99,0x0a,0x9c,0x0a,0x9f,0x0a,0xa2,0x0a,0xa5,0x0f,0x0b,0x0f,0x0d,0x0f,0x0f,0x0f,0x11,0x0f,0x13,0x0a,0xb3,0x0f,0x15,0x0e,0x23,0x0e,0x42,0x0e,0x46,0x0e,0x4a,0x0e,0x4e,0x0e,0x52,0x0f,0x19,0x0f,0x1d,0x0f,0x21,0x0f,0x27,0x0f,0x2f,0x0f,0x33,0x0f,0x37,0x0f,0x43,0x0f,0x47,0x0f,0x4b,0x0f,0x4f,\r\n0x13,0x01,0x13,0x07,0x13,0x0a,0x13,0x0e,0x13,0x12,0x13,0x16,0x13,0x1a,0x13,0x1e,0x13,0x22,0x14,0x06,0x14,0x0d,0x14,0x11,0x14,0x6e,0x14,0x71,0x14,0x74,0x14,0x77,0x14,0x7a,0x14,0x7f,0x14,0x82,0x14,0x85,0x0e,0x5a,0x00,0x02,0x00,0x7a,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x0c,0x09,0x0c,0x00,0x01,0x09,0x0e,0x09,0x0e,0x00,0x02,\r\n0x09,0x10,0x09,0x14,0x00,0x03,0x09,0x19,0x09,0x20,0x00,0x08,0x09,0x22,0x09,0x28,0x00,0x10,0x09,0x2a,0x09,0x2b,0x00,0x17,0x09,0x3e,0x09,0x3e,0x00,0x19,0x09,0x40,0x09,0x40,0x00,0x1a,0x09,0x42,0x09,0x42,0x00,0x1b,0x09,0x46,0x09,0x46,0x00,0x1c,0x09,0x48,0x09,0x48,0x00,0x1d,0x09,0x4a,0x09,0x4a,0x00,0x1e,0x09,0x5b,0x09,0x5b,\r\n0x00,0x1f,0x09,0x60,0x09,0x60,0x00,0x20,0x09,0x6c,0x09,0x6c,0x00,0x21,0x09,0x7c,0x09,0x7c,0x00,0x22,0x09,0x8a,0x09,0x8a,0x00,0x23,0x09,0x8c,0x09,0x8c,0x00,0x24,0x09,0x8e,0x09,0x8e,0x00,0x25,0x09,0x90,0x09,0x90,0x00,0x26,0x09,0x92,0x09,0x92,0x00,0x27,0x09,0x94,0x09,0x94,0x00,0x28,0x09,0x96,0x09,0x96,0x00,0x29,0x09,0x98,\r\n0x09,0x98,0x00,0x2a,0x09,0x9b,0x09,0x9b,0x00,0x2b,0x09,0x9e,0x09,0x9e,0x00,0x2c,0x09,0xa1,0x09,0xa1,0x00,0x2d,0x09,0xa4,0x09,0xa4,0x00,0x2e,0x09,0xa7,0x09,0xa7,0x00,0x2f,0x09,0xb9,0x09,0xb9,0x00,0x30,0x09,0xbb,0x09,0xbb,0x00,0x31,0x09,0xbd,0x09,0xbd,0x00,0x32,0x09,0xbf,0x09,0xbf,0x00,0x33,0x09,0xc1,0x09,0xc1,0x00,0x34,\r\n0x09,0xc3,0x09,0xc4,0x00,0x35,0x09,0xc8,0x09,0xc9,0x00,0x37,0x09,0xcc,0x09,0xcc,0x00,0x39,0x09,0xcf,0x09,0xcf,0x00,0x3a,0x09,0xd2,0x09,0xd2,0x00,0x3b,0x09,0xd5,0x09,0xd7,0x00,0x3c,0x09,0xd9,0x09,0xd9,0x00,0x3f,0x09,0xdb,0x09,0xdb,0x00,0x40,0x09,0xdd,0x09,0xdd,0x00,0x41,0x09,0xdf,0x09,0xdf,0x00,0x42,0x09,0xe1,0x09,0xe1,\r\n0x00,0x43,0x09,0xe3,0x09,0xe3,0x00,0x44,0x09,0xe5,0x09,0xe5,0x00,0x45,0x09,0xe7,0x09,0xe7,0x00,0x46,0x09,0xe9,0x09,0xe9,0x00,0x47,0x09,0xeb,0x09,0xeb,0x00,0x48,0x09,0xed,0x09,0xed,0x00,0x49,0x09,0xef,0x09,0xef,0x00,0x4a,0x09,0xf1,0x09,0xf1,0x00,0x4b,0x09,0xf3,0x09,0xf3,0x00,0x4c,0x09,0xf5,0x09,0xf6,0x00,0x4d,0x09,0xf8,\r\n0x09,0xf8,0x00,0x4f,0x09,0xfa,0x09,0xfa,0x00,0x50,0x0a,0x07,0x0a,0x07,0x00,0x51,0x0a,0x0b,0x0a,0x0b,0x00,0x52,0x0a,0x0d,0x0a,0x0d,0x00,0x53,0x0a,0x24,0x0a,0x24,0x00,0x54,0x0a,0x26,0x0a,0x26,0x00,0x55,0x0a,0x28,0x0a,0x28,0x00,0x56,0x0a,0x3e,0x0a,0x3e,0x00,0x57,0x0a,0x58,0x0a,0x58,0x00,0x58,0x0a,0x72,0x0a,0x72,0x00,0x59,\r\n0x0a,0x74,0x0a,0x74,0x00,0x5a,0x0a,0x76,0x0a,0x76,0x00,0x5b,0x0a,0x78,0x0a,0x78,0x00,0x5c,0x0a,0x7a,0x0a,0x7a,0x00,0x5d,0x0a,0x7c,0x0a,0x7c,0x00,0x5e,0x0a,0x7e,0x0a,0x7e,0x00,0x5f,0x0a,0x80,0x0a,0x80,0x00,0x60,0x0a,0x83,0x0a,0x83,0x00,0x61,0x0a,0x89,0x0a,0x89,0x00,0x62,0x0a,0x8b,0x0a,0x8b,0x00,0x63,0x0a,0x8f,0x0a,0x8f,\r\n0x00,0x64,0x0a,0x93,0x0a,0x93,0x00,0x65,0x0a,0x97,0x0a,0x97,0x00,0x66,0x0a,0x9a,0x0a,0x9a,0x00,0x67,0x0a,0x9d,0x0a,0x9d,0x00,0x68,0x0a,0xa0,0x0a,0xa0,0x00,0x69,0x0a,0xa3,0x0a,0xa3,0x00,0x6a,0x0a,0xa6,0x0a,0xa6,0x00,0x6b,0x0a,0xa8,0x0a,0xa8,0x00,0x6c,0x0a,0xaa,0x0a,0xaa,0x00,0x6d,0x0a,0xac,0x0a,0xac,0x00,0x6e,0x0a,0xae,\r\n0x0a,0xae,0x00,0x6f,0x0a,0xb0,0x0a,0xb0,0x00,0x70,0x0a,0xb6,0x0a,0xb6,0x00,0x71,0x0e,0x20,0x0e,0x20,0x00,0x72,0x0e,0x3f,0x0e,0x3f,0x00,0x73,0x0e,0x43,0x0e,0x43,0x00,0x74,0x0e,0x47,0x0e,0x47,0x00,0x75,0x0e,0x4b,0x0e,0x4b,0x00,0x76,0x0e,0x4f,0x0e,0x4f,0x00,0x77,0x0f,0x16,0x0f,0x16,0x00,0x78,0x0f,0x1a,0x0f,0x1a,0x00,0x79,\r\n0x0f,0x1e,0x0f,0x1e,0x00,0x7a,0x0f,0x24,0x0f,0x24,0x00,0x7b,0x0f,0x2c,0x0f,0x2c,0x00,0x7c,0x0f,0x30,0x0f,0x30,0x00,0x7d,0x0f,0x34,0x0f,0x34,0x00,0x7e,0x0f,0x40,0x0f,0x40,0x00,0x7f,0x0f,0x44,0x0f,0x44,0x00,0x80,0x0f,0x48,0x0f,0x48,0x00,0x81,0x0f,0x4c,0x0f,0x4c,0x00,0x82,0x13,0x02,0x13,0x02,0x00,0x83,0x13,0x04,0x13,0x04,\r\n0x00,0x84,0x13,0x08,0x13,0x08,0x00,0x85,0x13,0x0c,0x13,0x0c,0x00,0x86,0x13,0x10,0x13,0x10,0x00,0x87,0x13,0x14,0x13,0x14,0x00,0x88,0x13,0x18,0x13,0x18,0x00,0x89,0x13,0x1c,0x13,0x1c,0x00,0x8a,0x13,0x20,0x13,0x20,0x00,0x8b,0x14,0x04,0x14,0x04,0x00,0x8c,0x14,0x0b,0x14,0x0b,0x00,0x8d,0x14,0x0f,0x14,0x0f,0x00,0x8e,0x14,0x53,\r\n0x14,0x57,0x00,0x8f,0x14,0x59,0x14,0x5c,0x00,0x94,0x00,0x02,0x01,0x38,0x00,0x99,0x0e,0xd7,0x08,0xf9,0x08,0xcb,0x08,0xcc,0x08,0xcd,0x08,0xce,0x08,0xd0,0x08,0xd2,0x08,0xd4,0x08,0xd5,0x08,0xd6,0x08,0xe1,0x0e,0x3a,0x0e,0x3d,0x08,0xe2,0x08,0xe5,0x08,0xe8,0x08,0xeb,0x08,0xed,0x08,0xee,0x08,0xef,0x08,0xf0,0x0e,0x5b,0x0e,0x5f,\r\n0x08,0xf4,0x0e,0x6f,0x09,0x41,0x09,0x44,0x09,0x47,0x09,0x49,0x09,0x4c,0x09,0x5c,0x09,0x61,0x09,0x6d,0x0e,0x71,0x0e,0x76,0x09,0x8d,0x09,0x8f,0x09,0x91,0x09,0x93,0x09,0x95,0x09,0x97,0x09,0x9a,0x09,0x9d,0x09,0xa0,0x09,0xa3,0x09,0xa6,0x09,0xa9,0x09,0xba,0x09,0xbc,0x09,0xbe,0x09,0xc0,0x09,0xc2,0x0e,0xa3,0x09,0xc6,0x09,0x3c,\r\n0x09,0xca,0x09,0xcd,0x09,0xd0,0x09,0xd3,0x0e,0xac,0x0e,0xaf,0x09,0xd8,0x09,0xda,0x09,0xdc,0x09,0xde,0x09,0xe0,0x09,0xe2,0x09,0xe4,0x09,0xe6,0x09,0xe8,0x09,0xea,0x09,0xec,0x09,0xee,0x09,0xf0,0x09,0xf2,0x09,0xf4,0x0e,0xd1,0x09,0xf7,0x09,0xf9,0x09,0xfc,0x0a,0x09,0x0e,0xe7,0x0e,0xe9,0x0a,0x10,0x0a,0x25,0x0a,0x27,0x0a,0x2a,\r\n0x09,0xde,0x0a,0x5a,0x0a,0x73,0x0a,0x75,0x0a,0x77,0x0a,0x79,0x0a,0x7b,0x0a,0x7d,0x0a,0x7f,0x0a,0x82,0x0a,0x85,0x0a,0x8a,0x0a,0x8d,0x0a,0x91,0x0a,0x95,0x0a,0x98,0x0a,0x9b,0x0a,0x9e,0x0a,0xa1,0x0a,0xa4,0x0a,0xa7,0x0a,0xa9,0x0a,0xab,0x0a,0xad,0x0a,0xaf,0x0a,0xb2,0x0a,0xb7,0x0e,0x22,0x0e,0x41,0x0e,0x45,0x0e,0x49,0x0e,0x4d,\r\n0x0e,0x51,0x0f,0x18,0x0f,0x1c,0x0f,0x20,0x0f,0x26,0x0f,0x2e,0x0f,0x32,0x0f,0x36,0x0f,0x42,0x0f,0x46,0x0f,0x4a,0x0f,0x4e,0x13,0x03,0x13,0x06,0x13,0x09,0x13,0x0d,0x13,0x11,0x13,0x15,0x13,0x19,0x13,0x1d,0x13,0x21,0x14,0x05,0x14,0x0c,0x14,0x10,0x14,0x6f,0x14,0x72,0x14,0x75,0x14,0x78,0x14,0x7b,0x14,0x80,0x14,0x83,0x14,0x86,\r\n0x08,0xf0,0x00,0x02,0x00,0x7b,0x08,0xf1,0x08,0xf1,0x00,0x00,0x09,0x0c,0x09,0x0c,0x00,0x01,0x09,0x0e,0x09,0x0e,0x00,0x02,0x09,0x10,0x09,0x14,0x00,0x03,0x09,0x19,0x09,0x20,0x00,0x08,0x09,0x22,0x09,0x28,0x00,0x10,0x09,0x2a,0x09,0x2b,0x00,0x17,0x09,0x3e,0x09,0x3e,0x00,0x19,0x09,0x40,0x09,0x40,0x00,0x1a,0x09,0x42,0x09,0x42,\r\n0x00,0x1b,0x09,0x46,0x09,0x46,0x00,0x1c,0x09,0x48,0x09,0x48,0x00,0x1d,0x09,0x4a,0x09,0x4a,0x00,0x1e,0x09,0x5b,0x09,0x5b,0x00,0x1f,0x09,0x60,0x09,0x60,0x00,0x20,0x09,0x6c,0x09,0x6c,0x00,0x21,0x09,0x7c,0x09,0x7c,0x00,0x22,0x09,0x8a,0x09,0x8a,0x00,0x23,0x09,0x8c,0x09,0x8c,0x00,0x24,0x09,0x8e,0x09,0x8e,0x00,0x25,0x09,0x90,\r\n0x09,0x90,0x00,0x26,0x09,0x92,0x09,0x92,0x00,0x27,0x09,0x94,0x09,0x94,0x00,0x28,0x09,0x96,0x09,0x96,0x00,0x29,0x09,0x98,0x09,0x98,0x00,0x2a,0x09,0x9b,0x09,0x9b,0x00,0x2b,0x09,0x9e,0x09,0x9e,0x00,0x2c,0x09,0xa1,0x09,0xa1,0x00,0x2d,0x09,0xa4,0x09,0xa4,0x00,0x2e,0x09,0xa7,0x09,0xa7,0x00,0x2f,0x09,0xb9,0x09,0xb9,0x00,0x30,\r\n0x09,0xbb,0x09,0xbb,0x00,0x31,0x09,0xbd,0x09,0xbd,0x00,0x32,0x09,0xbf,0x09,0xbf,0x00,0x33,0x09,0xc1,0x09,0xc1,0x00,0x34,0x09,0xc3,0x09,0xc4,0x00,0x35,0x09,0xc8,0x09,0xc9,0x00,0x37,0x09,0xcc,0x09,0xcc,0x00,0x39,0x09,0xcf,0x09,0xcf,0x00,0x3a,0x09,0xd2,0x09,0xd2,0x00,0x3b,0x09,0xd5,0x09,0xd7,0x00,0x3c,0x09,0xd9,0x09,0xd9,\r\n0x00,0x3f,0x09,0xdb,0x09,0xdb,0x00,0x40,0x09,0xdd,0x09,0xdd,0x00,0x41,0x09,0xdf,0x09,0xdf,0x00,0x42,0x09,0xe1,0x09,0xe1,0x00,0x43,0x09,0xe3,0x09,0xe3,0x00,0x44,0x09,0xe5,0x09,0xe5,0x00,0x45,0x09,0xe7,0x09,0xe7,0x00,0x46,0x09,0xe9,0x09,0xe9,0x00,0x47,0x09,0xeb,0x09,0xeb,0x00,0x48,0x09,0xed,0x09,0xed,0x00,0x49,0x09,0xef,\r\n0x09,0xef,0x00,0x4a,0x09,0xf1,0x09,0xf1,0x00,0x4b,0x09,0xf3,0x09,0xf3,0x00,0x4c,0x09,0xf5,0x09,0xf6,0x00,0x4d,0x09,0xf8,0x09,0xf8,0x00,0x4f,0x09,0xfa,0x09,0xfa,0x00,0x50,0x0a,0x07,0x0a,0x07,0x00,0x51,0x0a,0x0b,0x0a,0x0b,0x00,0x52,0x0a,0x0d,0x0a,0x0d,0x00,0x53,0x0a,0x10,0x0a,0x10,0x00,0x54,0x0a,0x24,0x0a,0x24,0x00,0x55,\r\n0x0a,0x26,0x0a,0x26,0x00,0x56,0x0a,0x28,0x0a,0x28,0x00,0x57,0x0a,0x3e,0x0a,0x3e,0x00,0x58,0x0a,0x58,0x0a,0x58,0x00,0x59,0x0a,0x72,0x0a,0x72,0x00,0x5a,0x0a,0x74,0x0a,0x74,0x00,0x5b,0x0a,0x76,0x0a,0x76,0x00,0x5c,0x0a,0x78,0x0a,0x78,0x00,0x5d,0x0a,0x7a,0x0a,0x7a,0x00,0x5e,0x0a,0x7c,0x0a,0x7c,0x00,0x5f,0x0a,0x7e,0x0a,0x7e,\r\n0x00,0x60,0x0a,0x80,0x0a,0x80,0x00,0x61,0x0a,0x83,0x0a,0x83,0x00,0x62,0x0a,0x89,0x0a,0x89,0x00,0x63,0x0a,0x8b,0x0a,0x8b,0x00,0x64,0x0a,0x8f,0x0a,0x8f,0x00,0x65,0x0a,0x93,0x0a,0x93,0x00,0x66,0x0a,0x97,0x0a,0x97,0x00,0x67,0x0a,0x9a,0x0a,0x9a,0x00,0x68,0x0a,0x9d,0x0a,0x9d,0x00,0x69,0x0a,0xa0,0x0a,0xa0,0x00,0x6a,0x0a,0xa3,\r\n0x0a,0xa3,0x00,0x6b,0x0a,0xa6,0x0a,0xa6,0x00,0x6c,0x0a,0xa8,0x0a,0xa8,0x00,0x6d,0x0a,0xaa,0x0a,0xaa,0x00,0x6e,0x0a,0xac,0x0a,0xac,0x00,0x6f,0x0a,0xae,0x0a,0xae,0x00,0x70,0x0a,0xb0,0x0a,0xb0,0x00,0x71,0x0a,0xb6,0x0a,0xb6,0x00,0x72,0x0e,0x20,0x0e,0x20,0x00,0x73,0x0e,0x3f,0x0e,0x3f,0x00,0x74,0x0e,0x43,0x0e,0x43,0x00,0x75,\r\n0x0e,0x47,0x0e,0x47,0x00,0x76,0x0e,0x4b,0x0e,0x4b,0x00,0x77,0x0e,0x4f,0x0e,0x4f,0x00,0x78,0x0f,0x16,0x0f,0x16,0x00,0x79,0x0f,0x1a,0x0f,0x1a,0x00,0x7a,0x0f,0x1e,0x0f,0x1e,0x00,0x7b,0x0f,0x24,0x0f,0x24,0x00,0x7c,0x0f,0x2c,0x0f,0x2c,0x00,0x7d,0x0f,0x30,0x0f,0x30,0x00,0x7e,0x0f,0x34,0x0f,0x34,0x00,0x7f,0x0f,0x40,0x0f,0x40,\r\n0x00,0x80,0x0f,0x44,0x0f,0x44,0x00,0x81,0x0f,0x48,0x0f,0x48,0x00,0x82,0x0f,0x4c,0x0f,0x4c,0x00,0x83,0x13,0x02,0x13,0x02,0x00,0x84,0x13,0x04,0x13,0x04,0x00,0x85,0x13,0x08,0x13,0x08,0x00,0x86,0x13,0x0c,0x13,0x0c,0x00,0x87,0x13,0x10,0x13,0x10,0x00,0x88,0x13,0x14,0x13,0x14,0x00,0x89,0x13,0x18,0x13,0x18,0x00,0x8a,0x13,0x1c,\r\n0x13,0x1c,0x00,0x8b,0x13,0x20,0x13,0x20,0x00,0x8c,0x14,0x04,0x14,0x04,0x00,0x8d,0x14,0x0b,0x14,0x0b,0x00,0x8e,0x14,0x0f,0x14,0x0f,0x00,0x8f,0x14,0x53,0x14,0x57,0x00,0x90,0x14,0x59,0x14,0x5c,0x00,0x95,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x46,0x00,0x01,0x00,0x00,0x00,0x6d,0x00,0x02,0x00,0x08,0x08,0xee,\r\n0x08,0xee,0x00,0x00,0x09,0x3f,0x09,0x3f,0x00,0x01,0x09,0xec,0x09,0xec,0x00,0x02,0x09,0xee,0x09,0xee,0x00,0x03,0x09,0xf0,0x09,0xf0,0x00,0x04,0x09,0xf2,0x09,0xf2,0x00,0x05,0x0a,0x5f,0x0a,0x62,0x00,0x06,0x0a,0xb2,0x0a,0xb3,0x00,0x0a,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83,\r\n0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x02,0x00,0x01,0x0f,0x8c,0x0f,0x97,0x00,0x00,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,\r\n0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83,0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x01,0x00,0x62,0x00,0x03,0x00,0x0c,0x00,0x2a,0x00,0x44,0x00,0x02,0x00,0x06,0x00,0x14,0x14,0x97,0x00,0x06,0x09,0x3f,0x09,0x3f,\r\n0x09,0x32,0x09,0x73,0x08,0xf3,0x14,0x97,0x00,0x04,0x09,0x3f,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x06,0x00,0x12,0x09,0x71,0x00,0x05,0x09,0x3f,0x09,0x32,0x09,0x73,0x08,0xf3,0x09,0x71,0x00,0x03,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x06,0x00,0x14,0x0a,0x63,0x00,0x06,0x08,0xee,0x09,0x3f,0x09,0x32,0x09,0x73,0x08,0xf3,0x0a,0x63,\r\n0x00,0x04,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x02,0x00,0x03,0x08,0xe8,0x08,0xe8,0x00,0x00,0x08,0xee,0x08,0xee,0x00,0x01,0x09,0x0d,0x09,0x0d,0x00,0x02,0x00,0x01,0x00,0x34,0x00,0x03,0x00,0x0c,0x00,0x1a,0x00,0x26,0x00,0x01,0x00,0x04,0x14,0x97,0x00,0x04,0x09,0x3f,0x09,0x3f,0x09,0x72,0x00,0x01,0x00,0x04,0x09,0x71,0x00,0x03,\r\n0x09,0x3f,0x09,0x72,0x00,0x01,0x00,0x04,0x0a,0x63,0x00,0x04,0x08,0xee,0x09,0x3f,0x09,0x72,0x00,0x02,0x00,0x03,0x08,0xe8,0x08,0xe8,0x00,0x00,0x08,0xee,0x08,0xee,0x00,0x01,0x09,0x0d,0x09,0x0d,0x00,0x02,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0xb8,0x00,0x01,0x00,0x00,0x00,0x6f,0x00,0x02,0x00,0x1b,0x08,0xd4,\r\n0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe1,0x00,0x03,0x09,0xba,0x09,0xba,0x00,0x04,0x09,0xbc,0x09,0xbc,0x00,0x05,0x09,0xbe,0x09,0xbe,0x00,0x06,0x09,0xc0,0x09,0xc0,0x00,0x07,0x09,0xc2,0x09,0xc2,0x00,0x08,0x0a,0x25,0x0a,0x25,0x00,0x09,0x0a,0x27,0x0a,0x27,0x00,0x0a,0x0a,0x8a,0x0a,0x8a,0x00,0x0b,0x0a,0xb7,0x0a,0xb7,0x00,0x0c,\r\n0x0e,0x32,0x0e,0x32,0x00,0x0d,0x0e,0x34,0x0e,0x34,0x00,0x0e,0x0e,0x36,0x0e,0x36,0x00,0x0f,0x0e,0x38,0x0e,0x38,0x00,0x10,0x0e,0x99,0x0e,0x99,0x00,0x11,0x0e,0x9b,0x0e,0x9b,0x00,0x12,0x0e,0x9d,0x0e,0x9d,0x00,0x13,0x0e,0x9f,0x0e,0x9f,0x00,0x14,0x0e,0xa1,0x0e,0xa1,0x00,0x15,0x0e,0xed,0x0e,0xed,0x00,0x16,0x0e,0xef,0x0e,0xef,\r\n0x00,0x17,0x0f,0x04,0x0f,0x04,0x00,0x18,0x0f,0x15,0x0f,0x15,0x00,0x19,0x0f,0x20,0x0f,0x21,0x00,0x1a,0x0f,0x46,0x0f,0x47,0x00,0x1c,0x0f,0x4a,0x0f,0x4b,0x00,0x1e,0x00,0x02,0x00,0x15,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,\r\n0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,0x0a,0x0e,0x0a,0x0e,0x00,0x07,0x0a,0x57,0x0a,0x57,0x00,0x08,0x0a,0xb5,0x0a,0xb5,0x00,0x09,0x0b,0x0c,0x0b,0x0d,0x00,0x0a,0x0b,0x0f,0x0b,0x17,0x00,0x0c,0x0e,0x48,0x0e,0x48,0x00,0x15,0x0e,0x4c,0x0e,0x4c,0x00,0x16,0x0e,0x50,0x0e,0x50,0x00,0x17,0x0f,0x02,\r\n0x0f,0x02,0x00,0x18,0x0f,0x23,0x0f,0x23,0x00,0x19,0x0f,0x2d,0x0f,0x2d,0x00,0x1a,0x0f,0x31,0x0f,0x31,0x00,0x1b,0x0f,0x35,0x0f,0x35,0x00,0x1c,0x14,0x7d,0x14,0x7e,0x00,0x1d,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x1c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x02,0x00,0x01,0x0f,0x6c,0x0f,0x8b,0x00,0x00,0x00,0x02,\r\n0x00,0x16,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,0x0a,0x0c,0x0a,0x0c,0x00,0x07,0x0a,0x0e,0x0a,0x0e,0x00,0x08,0x0a,0x57,0x0a,0x57,0x00,0x09,0x0a,0xb5,\r\n0x0a,0xb5,0x00,0x0a,0x0b,0x0c,0x0b,0x17,0x00,0x0b,0x0e,0x21,0x0e,0x21,0x00,0x17,0x0e,0x48,0x0e,0x48,0x00,0x18,0x0e,0x4c,0x0e,0x4c,0x00,0x19,0x0e,0x50,0x0e,0x50,0x00,0x1a,0x0f,0x02,0x0f,0x02,0x00,0x1b,0x0f,0x23,0x0f,0x23,0x00,0x1c,0x0f,0x2d,0x0f,0x2d,0x00,0x1d,0x0f,0x31,0x0f,0x31,0x00,0x1e,0x0f,0x35,0x0f,0x35,0x00,0x1f,\r\n0x14,0x7d,0x14,0x7e,0x00,0x20,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x03,0x04,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x71,0x00,0x02,0x00,0x7d,0x08,0xca,0x08,0xcb,0x00,0x00,0x08,0xce,0x08,0xce,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x03,0x09,0x0a,0x09,0x0b,0x00,0x04,0x09,0x17,0x09,0x18,0x00,0x06,0x09,0x29,0x09,0x29,0x00,0x08,\r\n0x09,0x2e,0x09,0x2e,0x00,0x09,0x09,0x31,0x09,0x31,0x00,0x0a,0x09,0x41,0x09,0x41,0x00,0x0b,0x09,0x44,0x09,0x45,0x00,0x0c,0x09,0x4c,0x09,0x4c,0x00,0x0e,0x09,0x5e,0x09,0x5e,0x00,0x0f,0x09,0x61,0x09,0x62,0x00,0x10,0x09,0x77,0x09,0x77,0x00,0x12,0x09,0x7f,0x09,0x7f,0x00,0x13,0x09,0x84,0x09,0x85,0x00,0x14,0x09,0x88,0x09,0x89,\r\n0x00,0x16,0x09,0x8f,0x09,0x8f,0x00,0x18,0x09,0x91,0x09,0x91,0x00,0x19,0x09,0x97,0x09,0x97,0x00,0x1a,0x09,0xa0,0x09,0xa0,0x00,0x1b,0x09,0xa3,0x09,0xa3,0x00,0x1c,0x09,0xa9,0x09,0xac,0x00,0x1d,0x09,0xae,0x09,0xae,0x00,0x21,0x09,0xb2,0x09,0xb8,0x00,0x22,0x09,0xba,0x09,0xba,0x00,0x29,0x09,0xbc,0x09,0xbc,0x00,0x2a,0x09,0xbe,\r\n0x09,0xbe,0x00,0x2b,0x09,0xc0,0x09,0xc0,0x00,0x2c,0x09,0xca,0x09,0xcb,0x00,0x2d,0x09,0xcd,0x09,0xce,0x00,0x2f,0x09,0xd0,0x09,0xd1,0x00,0x31,0x09,0xe0,0x09,0xe0,0x00,0x33,0x09,0xe6,0x09,0xe6,0x00,0x34,0x09,0xe8,0x09,0xe8,0x00,0x35,0x09,0xf2,0x09,0xf2,0x00,0x36,0x09,0xf4,0x09,0xf4,0x00,0x37,0x09,0xf7,0x09,0xf7,0x00,0x38,\r\n0x09,0xfc,0x0a,0x04,0x00,0x39,0x0a,0x0a,0x0a,0x0a,0x00,0x42,0x0a,0x1a,0x0a,0x1a,0x00,0x43,0x0a,0x21,0x0a,0x21,0x00,0x44,0x0a,0x23,0x0a,0x23,0x00,0x45,0x0a,0x25,0x0a,0x25,0x00,0x46,0x0a,0x27,0x0a,0x27,0x00,0x47,0x0a,0x2a,0x0a,0x2b,0x00,0x48,0x0a,0x50,0x0a,0x50,0x00,0x4a,0x0a,0x56,0x0a,0x57,0x00,0x4b,0x0a,0x5b,0x0a,0x5b,\r\n0x00,0x4d,0x0a,0x62,0x0a,0x62,0x00,0x4e,0x0a,0x6f,0x0a,0x6f,0x00,0x4f,0x0a,0x73,0x0a,0x73,0x00,0x50,0x0a,0x75,0x0a,0x75,0x00,0x51,0x0a,0x77,0x0a,0x77,0x00,0x52,0x0a,0x79,0x0a,0x79,0x00,0x53,0x0a,0x7b,0x0a,0x7b,0x00,0x54,0x0a,0x7d,0x0a,0x7d,0x00,0x55,0x0a,0x85,0x0a,0x88,0x00,0x56,0x0a,0x98,0x0a,0x99,0x00,0x5a,0x0a,0x9b,\r\n0x0a,0x9c,0x00,0x5c,0x0a,0xa4,0x0a,0xa5,0x00,0x5e,0x0a,0xa9,0x0a,0xa9,0x00,0x60,0x0a,0xab,0x0a,0xab,0x00,0x61,0x0a,0xb4,0x0a,0xb5,0x00,0x62,0x0b,0x0c,0x0b,0x18,0x00,0x64,0x0e,0x1e,0x0e,0x1e,0x00,0x71,0x0e,0x22,0x0e,0x23,0x00,0x72,0x0e,0x27,0x0e,0x27,0x00,0x74,0x0e,0x2c,0x0e,0x2c,0x00,0x75,0x0e,0x45,0x0e,0x46,0x00,0x76,\r\n0x0e,0x49,0x0e,0x4a,0x00,0x78,0x0e,0x4d,0x0e,0x4e,0x00,0x7a,0x0e,0x51,0x0e,0x52,0x00,0x7c,0x0e,0x61,0x0e,0x61,0x00,0x7e,0x0e,0x6b,0x0e,0x6c,0x00,0x7f,0x0e,0x74,0x0e,0x75,0x00,0x81,0x0e,0x7d,0x0e,0x7d,0x00,0x83,0x0e,0x7f,0x0e,0x7f,0x00,0x84,0x0e,0x83,0x0e,0x83,0x00,0x85,0x0e,0x87,0x0e,0x87,0x00,0x86,0x0e,0x8a,0x0e,0x8b,\r\n0x00,0x87,0x0e,0x8d,0x0e,0x8e,0x00,0x89,0x0e,0x90,0x0e,0x92,0x00,0x8b,0x0e,0x94,0x0e,0x94,0x00,0x8e,0x0e,0x99,0x0e,0x99,0x00,0x8f,0x0e,0x9b,0x0e,0x9b,0x00,0x90,0x0e,0x9d,0x0e,0x9d,0x00,0x91,0x0e,0x9f,0x0e,0x9f,0x00,0x92,0x0e,0xbc,0x0e,0xbc,0x00,0x93,0x0e,0xc4,0x0e,0xc4,0x00,0x94,0x0e,0xc6,0x0e,0xc6,0x00,0x95,0x0e,0xce,\r\n0x0e,0xce,0x00,0x96,0x0e,0xd4,0x0e,0xd4,0x00,0x97,0x0e,0xd8,0x0e,0xd9,0x00,0x98,0x0e,0xdc,0x0e,0xe4,0x00,0x9a,0x0e,0xe6,0x0e,0xea,0x00,0xa3,0x0e,0xed,0x0e,0xed,0x00,0xa8,0x0e,0xef,0x0e,0xef,0x00,0xa9,0x0e,0xf1,0x0e,0xf1,0x00,0xaa,0x0e,0xf3,0x0e,0xf3,0x00,0xab,0x0e,0xf5,0x0e,0xf5,0x00,0xac,0x0e,0xf7,0x0e,0xf7,0x00,0xad,\r\n0x0e,0xf9,0x0e,0xf9,0x00,0xae,0x0e,0xfb,0x0e,0xfb,0x00,0xaf,0x0e,0xff,0x0f,0x02,0x00,0xb0,0x0f,0x0d,0x0f,0x0d,0x00,0xb4,0x0f,0x0f,0x0f,0x0f,0x00,0xb5,0x0f,0x18,0x0f,0x19,0x00,0xb6,0x0f,0x1c,0x0f,0x1d,0x00,0xb8,0x0f,0x22,0x0f,0x23,0x00,0xba,0x0f,0x2e,0x0f,0x2f,0x00,0xbc,0x0f,0x32,0x0f,0x33,0x00,0xbe,0x0f,0x36,0x0f,0x3b,\r\n0x00,0xc0,0x0f,0x42,0x0f,0x43,0x00,0xc6,0x0f,0x64,0x0f,0x64,0x00,0xc8,0x0f,0x68,0x0f,0x68,0x00,0xc9,0x0f,0x98,0x0f,0xa6,0x00,0xca,0x13,0x2c,0x13,0x2c,0x00,0xd9,0x13,0x2f,0x13,0x2f,0x00,0xda,0x13,0x33,0x13,0x35,0x00,0xdb,0x13,0x38,0x13,0x38,0x00,0xde,0x13,0x3c,0x13,0x3c,0x00,0xdf,0x13,0x3f,0x13,0x40,0x00,0xe0,0x14,0x62,\r\n0x14,0x62,0x00,0xe2,0x14,0x6c,0x14,0x6c,0x00,0xe3,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x03,0x00,0x02,0x00,0x28,0x04,0xfa,0x00,0x01,0x07,0x86,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x03,0x00,0x02,0x00,0x14,\r\n0x07,0x8e,0x00,0x01,0x07,0x72,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x72,0x00,0x02,0x00,0xcd,0x08,0xcb,0x08,0xce,0x00,0x00,0x08,0xd0,0x08,0xd0,0x00,0x04,0x08,0xd2,0x08,0xd2,0x00,0x05,0x08,0xd4,0x08,0xd6,0x00,0x06,0x08,0xe1,0x08,0xe3,0x00,0x09,0x08,0xe5,0x08,0xe6,0x00,0x0c,0x08,0xe8,0x08,0xe9,0x00,0x0e,0x08,0xeb,0x08,0xf0,\r\n0x00,0x10,0x08,0xf4,0x08,0xf4,0x00,0x16,0x08,0xf9,0x08,0xfb,0x00,0x17,0x08,0xff,0x09,0x00,0x00,0x1a,0x09,0x21,0x09,0x21,0x00,0x1c,0x09,0x34,0x09,0x35,0x00,0x1d,0x09,0x3b,0x09,0x3d,0x00,0x1f,0x09,0x3f,0x09,0x3f,0x00,0x22,0x09,0x41,0x09,0x41,0x00,0x23,0x09,0x44,0x09,0x44,0x00,0x24,0x09,0x47,0x09,0x47,0x00,0x25,0x09,0x49,\r\n0x09,0x49,0x00,0x26,0x09,0x4c,0x09,0x4c,0x00,0x27,0x09,0x5c,0x09,0x5c,0x00,0x28,0x09,0x61,0x09,0x62,0x00,0x29,0x09,0x6d,0x09,0x6e,0x00,0x2b,0x09,0x8d,0x09,0x8d,0x00,0x2d,0x09,0x8f,0x09,0x8f,0x00,0x2e,0x09,0x91,0x09,0x91,0x00,0x2f,0x09,0x93,0x09,0x93,0x00,0x30,0x09,0x95,0x09,0x95,0x00,0x31,0x09,0x97,0x09,0x97,0x00,0x32,\r\n0x09,0x9a,0x09,0x9a,0x00,0x33,0x09,0x9d,0x09,0x9d,0x00,0x34,0x09,0xa0,0x09,0xa0,0x00,0x35,0x09,0xa3,0x09,0xa3,0x00,0x36,0x09,0xa6,0x09,0xa6,0x00,0x37,0x09,0xa9,0x09,0xa9,0x00,0x38,0x09,0xba,0x09,0xba,0x00,0x39,0x09,0xbc,0x09,0xbc,0x00,0x3a,0x09,0xbe,0x09,0xbe,0x00,0x3b,0x09,0xc0,0x09,0xc0,0x00,0x3c,0x09,0xc2,0x09,0xc2,\r\n0x00,0x3d,0x09,0xc6,0x09,0xc7,0x00,0x3e,0x09,0xca,0x09,0xcb,0x00,0x40,0x09,0xcd,0x09,0xce,0x00,0x42,0x09,0xd0,0x09,0xd1,0x00,0x44,0x09,0xd3,0x09,0xd4,0x00,0x46,0x09,0xd8,0x09,0xd8,0x00,0x48,0x09,0xda,0x09,0xda,0x00,0x49,0x09,0xdc,0x09,0xdc,0x00,0x4a,0x09,0xde,0x09,0xde,0x00,0x4b,0x09,0xe0,0x09,0xe0,0x00,0x4c,0x09,0xe2,\r\n0x09,0xe2,0x00,0x4d,0x09,0xe4,0x09,0xe4,0x00,0x4e,0x09,0xe6,0x09,0xe6,0x00,0x4f,0x09,0xe8,0x09,0xe8,0x00,0x50,0x09,0xea,0x09,0xea,0x00,0x51,0x09,0xec,0x09,0xec,0x00,0x52,0x09,0xee,0x09,0xee,0x00,0x53,0x09,0xf0,0x09,0xf0,0x00,0x54,0x09,0xf2,0x09,0xf2,0x00,0x55,0x09,0xf4,0x09,0xf4,0x00,0x56,0x09,0xf7,0x09,0xf7,0x00,0x57,\r\n0x09,0xf9,0x09,0xf9,0x00,0x58,0x09,0xfc,0x09,0xfc,0x00,0x59,0x0a,0x09,0x0a,0x09,0x00,0x5a,0x0a,0x10,0x0a,0x10,0x00,0x5b,0x0a,0x25,0x0a,0x25,0x00,0x5c,0x0a,0x27,0x0a,0x27,0x00,0x5d,0x0a,0x2a,0x0a,0x2b,0x00,0x5e,0x0a,0x32,0x0a,0x3b,0x00,0x60,0x0a,0x41,0x0a,0x42,0x00,0x6a,0x0a,0x5a,0x0a,0x5b,0x00,0x6c,0x0a,0x5f,0x0a,0x62,\r\n0x00,0x6e,0x0a,0x73,0x0a,0x73,0x00,0x72,0x0a,0x75,0x0a,0x75,0x00,0x73,0x0a,0x77,0x0a,0x77,0x00,0x74,0x0a,0x79,0x0a,0x79,0x00,0x75,0x0a,0x7b,0x0a,0x7b,0x00,0x76,0x0a,0x7d,0x0a,0x7d,0x00,0x77,0x0a,0x7f,0x0a,0x7f,0x00,0x78,0x0a,0x82,0x0a,0x82,0x00,0x79,0x0a,0x85,0x0a,0x85,0x00,0x7a,0x0a,0x8a,0x0a,0x8a,0x00,0x7b,0x0a,0x8d,\r\n0x0a,0x8e,0x00,0x7c,0x0a,0x91,0x0a,0x92,0x00,0x7e,0x0a,0x95,0x0a,0x96,0x00,0x80,0x0a,0x98,0x0a,0x99,0x00,0x82,0x0a,0x9b,0x0a,0x9c,0x00,0x84,0x0a,0x9e,0x0a,0x9f,0x00,0x86,0x0a,0xa1,0x0a,0xa2,0x00,0x88,0x0a,0xa4,0x0a,0xa5,0x00,0x8a,0x0a,0xa7,0x0a,0xa7,0x00,0x8c,0x0a,0xa9,0x0a,0xa9,0x00,0x8d,0x0a,0xab,0x0a,0xab,0x00,0x8e,\r\n0x0a,0xad,0x0a,0xad,0x00,0x8f,0x0a,0xaf,0x0a,0xaf,0x00,0x90,0x0a,0xb2,0x0a,0xb3,0x00,0x91,0x0a,0xb7,0x0a,0xb7,0x00,0x93,0x0a,0xb9,0x0a,0xba,0x00,0x94,0x0e,0x22,0x0e,0x23,0x00,0x96,0x0e,0x25,0x0e,0x25,0x00,0x98,0x0e,0x27,0x0e,0x27,0x00,0x99,0x0e,0x29,0x0e,0x29,0x00,0x9a,0x0e,0x2b,0x0e,0x2e,0x00,0x9b,0x0e,0x32,0x0e,0x32,\r\n0x00,0x9f,0x0e,0x34,0x0e,0x34,0x00,0xa0,0x0e,0x36,0x0e,0x36,0x00,0xa1,0x0e,0x38,0x0e,0x38,0x00,0xa2,0x0e,0x3a,0x0e,0x3b,0x00,0xa3,0x0e,0x3d,0x0e,0x3e,0x00,0xa5,0x0e,0x41,0x0e,0x42,0x00,0xa7,0x0e,0x45,0x0e,0x46,0x00,0xa9,0x0e,0x49,0x0e,0x4a,0x00,0xab,0x0e,0x4d,0x0e,0x4e,0x00,0xad,0x0e,0x51,0x0e,0x52,0x00,0xaf,0x0e,0x56,\r\n0x0e,0x56,0x00,0xb1,0x0e,0x58,0x0e,0x58,0x00,0xb2,0x0e,0x5a,0x0e,0x5b,0x00,0xb3,0x0e,0x5d,0x0e,0x5d,0x00,0xb5,0x0e,0x5f,0x0e,0x61,0x00,0xb6,0x0e,0x6f,0x0e,0x6f,0x00,0xb9,0x0e,0x71,0x0e,0x72,0x00,0xba,0x0e,0x76,0x0e,0x77,0x00,0xbc,0x0e,0x79,0x0e,0x79,0x00,0xbe,0x0e,0x7b,0x0e,0x7b,0x00,0xbf,0x0e,0x7d,0x0e,0x7d,0x00,0xc0,\r\n0x0e,0x7f,0x0e,0x7f,0x00,0xc1,0x0e,0x81,0x0e,0x81,0x00,0xc2,0x0e,0x83,0x0e,0x83,0x00,0xc3,0x0e,0x85,0x0e,0x85,0x00,0xc4,0x0e,0x87,0x0e,0x8e,0x00,0xc5,0x0e,0x99,0x0e,0x99,0x00,0xcd,0x0e,0x9b,0x0e,0x9b,0x00,0xce,0x0e,0x9d,0x0e,0x9d,0x00,0xcf,0x0e,0x9f,0x0e,0x9f,0x00,0xd0,0x0e,0xa1,0x0e,0xa1,0x00,0xd1,0x0e,0xa3,0x0e,0xa4,\r\n0x00,0xd2,0x0e,0xac,0x0e,0xad,0x00,0xd4,0x0e,0xaf,0x0e,0xb0,0x00,0xd6,0x0e,0xb2,0x0e,0xb2,0x00,0xd8,0x0e,0xb4,0x0e,0xb4,0x00,0xd9,0x0e,0xb6,0x0e,0xb6,0x00,0xda,0x0e,0xb8,0x0e,0xb8,0x00,0xdb,0x0e,0xba,0x0e,0xba,0x00,0xdc,0x0e,0xbc,0x0e,0xbc,0x00,0xdd,0x0e,0xbe,0x0e,0xbe,0x00,0xde,0x0e,0xc0,0x0e,0xc0,0x00,0xdf,0x0e,0xc2,\r\n0x0e,0xc2,0x00,0xe0,0x0e,0xc4,0x0e,0xc4,0x00,0xe1,0x0e,0xc6,0x0e,0xc6,0x00,0xe2,0x0e,0xc8,0x0e,0xc8,0x00,0xe3,0x0e,0xce,0x0e,0xce,0x00,0xe4,0x0e,0xd1,0x0e,0xd2,0x00,0xe5,0x0e,0xd4,0x0e,0xd4,0x00,0xe7,0x0e,0xd6,0x0e,0xd9,0x00,0xe8,0x0e,0xe4,0x0e,0xe5,0x00,0xec,0x0e,0xe7,0x0e,0xea,0x00,0xee,0x0e,0xed,0x0e,0xed,0x00,0xf2,\r\n0x0e,0xef,0x0e,0xef,0x00,0xf3,0x0e,0xf1,0x0e,0xf1,0x00,0xf4,0x0e,0xf3,0x0e,0xf3,0x00,0xf5,0x0e,0xf5,0x0e,0xf5,0x00,0xf6,0x0e,0xf7,0x0e,0xf7,0x00,0xf7,0x0e,0xf9,0x0e,0xf9,0x00,0xf8,0x0e,0xfb,0x0e,0xfb,0x00,0xf9,0x0e,0xfd,0x0e,0xff,0x00,0xfa,0x0f,0x04,0x0f,0x04,0x00,0xfd,0x0f,0x0b,0x0f,0x0b,0x00,0xfe,0x0f,0x0d,0x0f,0x0d,\r\n0x00,0xff,0x0f,0x0f,0x0f,0x0f,0x01,0x00,0x0f,0x11,0x0f,0x11,0x01,0x01,0x0f,0x13,0x0f,0x13,0x01,0x02,0x0f,0x15,0x0f,0x15,0x01,0x03,0x0f,0x18,0x0f,0x19,0x01,0x04,0x0f,0x1c,0x0f,0x1d,0x01,0x06,0x0f,0x20,0x0f,0x21,0x01,0x08,0x0f,0x26,0x0f,0x27,0x01,0x0a,0x0f,0x2e,0x0f,0x2f,0x01,0x0c,0x0f,0x32,0x0f,0x33,0x01,0x0e,0x0f,0x36,\r\n0x0f,0x37,0x01,0x10,0x0f,0x42,0x0f,0x43,0x01,0x12,0x0f,0x46,0x0f,0x47,0x01,0x14,0x0f,0x4a,0x0f,0x4b,0x01,0x16,0x0f,0x4e,0x0f,0x4f,0x01,0x18,0x0f,0x6c,0x0f,0x6c,0x01,0x1a,0x0f,0x6e,0x0f,0x6e,0x01,0x1b,0x0f,0x70,0x0f,0x70,0x01,0x1c,0x0f,0x72,0x0f,0x72,0x01,0x1d,0x0f,0x74,0x0f,0x74,0x01,0x1e,0x0f,0x76,0x0f,0x76,0x01,0x1f,\r\n0x0f,0x78,0x0f,0x78,0x01,0x20,0x0f,0x7a,0x0f,0x7a,0x01,0x21,0x0f,0x7c,0x0f,0x7c,0x01,0x22,0x0f,0x7e,0x0f,0x7e,0x01,0x23,0x0f,0x80,0x0f,0x80,0x01,0x24,0x0f,0x82,0x0f,0x82,0x01,0x25,0x0f,0x84,0x0f,0x84,0x01,0x26,0x0f,0x86,0x0f,0x86,0x01,0x27,0x0f,0x88,0x0f,0x88,0x01,0x28,0x0f,0x8a,0x0f,0x8a,0x01,0x29,0x0f,0x8c,0x0f,0x8c,\r\n0x01,0x2a,0x0f,0x8e,0x0f,0x8e,0x01,0x2b,0x0f,0x90,0x0f,0x90,0x01,0x2c,0x0f,0x92,0x0f,0x92,0x01,0x2d,0x0f,0x94,0x0f,0x94,0x01,0x2e,0x0f,0x96,0x0f,0x96,0x01,0x2f,0x00,0x02,0x00,0x6c,0x08,0xca,0x08,0xcb,0x00,0x00,0x08,0xce,0x08,0xce,0x00,0x02,0x08,0xf4,0x08,0xf4,0x00,0x03,0x09,0x0a,0x09,0x0b,0x00,0x04,0x09,0x17,0x09,0x18,\r\n0x00,0x06,0x09,0x29,0x09,0x29,0x00,0x08,0x09,0x41,0x09,0x41,0x00,0x09,0x09,0x44,0x09,0x45,0x00,0x0a,0x09,0x4c,0x09,0x4c,0x00,0x0c,0x09,0x5e,0x09,0x5e,0x00,0x0d,0x09,0x61,0x09,0x62,0x00,0x0e,0x09,0x77,0x09,0x77,0x00,0x10,0x09,0x7f,0x09,0x7f,0x00,0x11,0x09,0x84,0x09,0x85,0x00,0x12,0x09,0x88,0x09,0x89,0x00,0x14,0x09,0x8f,\r\n0x09,0x8f,0x00,0x16,0x09,0x91,0x09,0x91,0x00,0x17,0x09,0x97,0x09,0x97,0x00,0x18,0x09,0xa0,0x09,0xa0,0x00,0x19,0x09,0xa3,0x09,0xa3,0x00,0x1a,0x09,0xa9,0x09,0xac,0x00,0x1b,0x09,0xae,0x09,0xae,0x00,0x1f,0x09,0xb2,0x09,0xb8,0x00,0x20,0x09,0xba,0x09,0xba,0x00,0x27,0x09,0xbc,0x09,0xbc,0x00,0x28,0x09,0xbe,0x09,0xbe,0x00,0x29,\r\n0x09,0xc0,0x09,0xc0,0x00,0x2a,0x09,0xca,0x09,0xcb,0x00,0x2b,0x09,0xcd,0x09,0xce,0x00,0x2d,0x09,0xd0,0x09,0xd1,0x00,0x2f,0x09,0xe0,0x09,0xe0,0x00,0x31,0x09,0xe6,0x09,0xe6,0x00,0x32,0x09,0xe8,0x09,0xe8,0x00,0x33,0x09,0xf2,0x09,0xf2,0x00,0x34,0x09,0xf4,0x09,0xf4,0x00,0x35,0x09,0xf7,0x09,0xf7,0x00,0x36,0x09,0xfc,0x0a,0x04,\r\n0x00,0x37,0x0a,0x0a,0x0a,0x0a,0x00,0x40,0x0a,0x25,0x0a,0x25,0x00,0x41,0x0a,0x27,0x0a,0x27,0x00,0x42,0x0a,0x2a,0x0a,0x2b,0x00,0x43,0x0a,0x56,0x0a,0x57,0x00,0x45,0x0a,0x5b,0x0a,0x5b,0x00,0x47,0x0a,0x62,0x0a,0x62,0x00,0x48,0x0a,0x73,0x0a,0x73,0x00,0x49,0x0a,0x75,0x0a,0x75,0x00,0x4a,0x0a,0x77,0x0a,0x77,0x00,0x4b,0x0a,0x79,\r\n0x0a,0x79,0x00,0x4c,0x0a,0x7b,0x0a,0x7b,0x00,0x4d,0x0a,0x7d,0x0a,0x7d,0x00,0x4e,0x0a,0x85,0x0a,0x88,0x00,0x4f,0x0a,0x98,0x0a,0x99,0x00,0x53,0x0a,0x9b,0x0a,0x9c,0x00,0x55,0x0a,0xa4,0x0a,0xa5,0x00,0x57,0x0a,0xa9,0x0a,0xa9,0x00,0x59,0x0a,0xab,0x0a,0xab,0x00,0x5a,0x0a,0xb4,0x0a,0xb5,0x00,0x5b,0x0b,0x0c,0x0b,0x18,0x00,0x5d,\r\n0x0e,0x22,0x0e,0x23,0x00,0x6a,0x0e,0x27,0x0e,0x27,0x00,0x6c,0x0e,0x2c,0x0e,0x2c,0x00,0x6d,0x0e,0x45,0x0e,0x46,0x00,0x6e,0x0e,0x49,0x0e,0x4a,0x00,0x70,0x0e,0x4d,0x0e,0x4e,0x00,0x72,0x0e,0x51,0x0e,0x52,0x00,0x74,0x0e,0x61,0x0e,0x61,0x00,0x76,0x0e,0x74,0x0e,0x75,0x00,0x77,0x0e,0x7d,0x0e,0x7d,0x00,0x79,0x0e,0x7f,0x0e,0x7f,\r\n0x00,0x7a,0x0e,0x83,0x0e,0x83,0x00,0x7b,0x0e,0x87,0x0e,0x87,0x00,0x7c,0x0e,0x8a,0x0e,0x8b,0x00,0x7d,0x0e,0x8d,0x0e,0x8e,0x00,0x7f,0x0e,0x90,0x0e,0x92,0x00,0x81,0x0e,0x94,0x0e,0x94,0x00,0x84,0x0e,0x99,0x0e,0x99,0x00,0x85,0x0e,0x9b,0x0e,0x9b,0x00,0x86,0x0e,0x9d,0x0e,0x9d,0x00,0x87,0x0e,0x9f,0x0e,0x9f,0x00,0x88,0x0e,0xbc,\r\n0x0e,0xbc,0x00,0x89,0x0e,0xc4,0x0e,0xc4,0x00,0x8a,0x0e,0xc6,0x0e,0xc6,0x00,0x8b,0x0e,0xce,0x0e,0xce,0x00,0x8c,0x0e,0xd4,0x0e,0xd4,0x00,0x8d,0x0e,0xd8,0x0e,0xd9,0x00,0x8e,0x0e,0xdc,0x0e,0xe4,0x00,0x90,0x0e,0xe6,0x0e,0xea,0x00,0x99,0x0e,0xed,0x0e,0xed,0x00,0x9e,0x0e,0xef,0x0e,0xef,0x00,0x9f,0x0e,0xf1,0x0e,0xf1,0x00,0xa0,\r\n0x0e,0xf3,0x0e,0xf3,0x00,0xa1,0x0e,0xf5,0x0e,0xf5,0x00,0xa2,0x0e,0xf7,0x0e,0xf7,0x00,0xa3,0x0e,0xf9,0x0e,0xf9,0x00,0xa4,0x0e,0xfb,0x0e,0xfb,0x00,0xa5,0x0e,0xff,0x0f,0x02,0x00,0xa6,0x0f,0x0d,0x0f,0x0d,0x00,0xaa,0x0f,0x0f,0x0f,0x0f,0x00,0xab,0x0f,0x18,0x0f,0x19,0x00,0xac,0x0f,0x1c,0x0f,0x1d,0x00,0xae,0x0f,0x22,0x0f,0x23,\r\n0x00,0xb0,0x0f,0x2e,0x0f,0x2f,0x00,0xb2,0x0f,0x32,0x0f,0x33,0x00,0xb4,0x0f,0x36,0x0f,0x3b,0x00,0xb6,0x0f,0x42,0x0f,0x43,0x00,0xbc,0x0f,0x64,0x0f,0x64,0x00,0xbe,0x0f,0x68,0x0f,0x68,0x00,0xbf,0x0f,0x98,0x0f,0xa6,0x00,0xc0,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,\r\n0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x13,0x09,0x2e,0x09,0x2e,0x00,0x00,0x09,0x31,0x09,0x31,0x00,0x01,0x09,0x77,0x09,0x77,0x00,0x02,0x09,0x7f,0x09,0x7f,0x00,0x03,0x0a,0x1a,0x0a,0x1a,0x00,0x04,0x0a,0x21,0x0a,0x21,0x00,0x05,0x0a,0x23,0x0a,0x23,0x00,0x06,0x0a,0x50,0x0a,0x50,0x00,0x07,0x0a,0x6f,0x0a,0x6f,\r\n0x00,0x08,0x0e,0x1e,0x0e,0x1e,0x00,0x09,0x0e,0x6b,0x0e,0x6c,0x00,0x0a,0x13,0x2c,0x13,0x2c,0x00,0x0c,0x13,0x2f,0x13,0x2f,0x00,0x0d,0x13,0x33,0x13,0x35,0x00,0x0e,0x13,0x38,0x13,0x38,0x00,0x11,0x13,0x3c,0x13,0x3c,0x00,0x12,0x13,0x3f,0x13,0x40,0x00,0x13,0x14,0x62,0x14,0x62,0x00,0x15,0x14,0x6c,0x14,0x6c,0x00,0x16,0x00,0x03,\r\n0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x28,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x02,0x00,0x03,0x00,0x4c,0x00,0x4d,0x00,0x00,0x01,0x62,0x01,0x62,0x00,0x02,0x05,0x6d,0x05,0x6d,0x00,0x03,0x00,0x02,0x00,0x11,0x02,0x44,0x02,0x44,0x00,0x00,0x02,0x46,0x02,0x47,0x00,0x01,0x04,0x62,0x04,0x73,0x00,0x03,0x04,0x79,0x04,0x79,\r\n0x00,0x15,0x04,0x9b,0x04,0x9d,0x00,0x16,0x04,0xa0,0x04,0xa2,0x00,0x19,0x04,0xa4,0x04,0xa4,0x00,0x1c,0x04,0xa8,0x04,0xaa,0x00,0x1d,0x05,0xfd,0x06,0x00,0x00,0x20,0x06,0x66,0x06,0x72,0x00,0x24,0x07,0x55,0x07,0x57,0x00,0x31,0x07,0x5c,0x07,0x5c,0x00,0x34,0x07,0xef,0x07,0xef,0x00,0x35,0x08,0x4c,0x08,0x4d,0x00,0x36,0x08,0x4f,\r\n0x08,0x4f,0x00,0x38,0x0a,0xdb,0x0a,0xe0,0x00,0x39,0x0a,0xe2,0x0a,0xe2,0x00,0x3f,0x00,0x01,0x05,0x6a,0x00,0x05,0x00,0x10,0x01,0x22,0x02,0x34,0x03,0x46,0x04,0x58,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x6a,0x00,0x72,0x00,0x7a,0x00,0x82,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,\r\n0x00,0xb0,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xae,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xaf,0x00,0x03,0x06,0xa2,0x06,0xa4,0x06,0xb0,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xb1,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xb2,0x00,0x03,0x06,0xa3,\r\n0x06,0xa2,0x06,0xb3,0x00,0x03,0x06,0xa3,0x06,0xa3,0x06,0xb4,0x00,0x03,0x06,0xa3,0x06,0xa4,0x06,0xb5,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xb6,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xb7,0x00,0x02,0x06,0xa3,0x06,0xb8,0x00,0x03,0x06,0xa4,0x06,0xa2,0x06,0xb9,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xba,0x00,0x03,0x06,0xa4,0x06,0xa4,\r\n0x06,0xbb,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xbc,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xbd,0x00,0x02,0x06,0xa4,0x06,0xbe,0x00,0x03,0x06,0xa5,0x06,0xa2,0x06,0xbf,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xc0,0x00,0x03,0x06,0xa5,0x06,0xa4,0x06,0xc1,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xc2,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xc3,\r\n0x00,0x02,0x06,0xa5,0x06,0xc4,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xc5,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xc6,0x00,0x03,0x06,0xa6,0x06,0xa4,0x06,0xc7,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xc8,0x00,0x03,0x06,0xa6,0x06,0xa6,0x06,0xc9,0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,\r\n0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x98,0x00,0xa0,0x00,0xa8,0x00,0xb0,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xca,0x00,0x03,0x06,0xa2,0x06,0xa2,0x06,0xcb,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xcc,0x00,0x03,\r\n0x06,0xa2,0x06,0xa4,0x06,0xcd,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xce,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xcf,0x00,0x02,0x06,0xa2,0x06,0xd0,0x00,0x03,0x06,0xa3,0x06,0xa2,0x06,0xd1,0x00,0x03,0x06,0xa3,0x06,0xa4,0x06,0xd2,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xd3,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xd4,0x00,0x03,0x06,0xa4,\r\n0x06,0xa2,0x06,0xd5,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xd6,0x00,0x03,0x06,0xa4,0x06,0xa4,0x06,0xd7,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xd8,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xd9,0x00,0x02,0x06,0xa4,0x06,0xda,0x00,0x03,0x06,0xa5,0x06,0xa2,0x06,0xdb,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xdc,0x00,0x03,0x06,0xa5,0x06,0xa4,\r\n0x06,0xdd,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xde,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xdf,0x00,0x02,0x06,0xa5,0x06,0xe0,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xe1,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xe2,0x00,0x03,0x06,0xa6,0x06,0xa4,0x06,0xe3,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xe4,0x00,0x03,0x06,0xa6,0x06,0xa6,0x06,0xe5,\r\n0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc6,0x00,0xce,0x00,0xd6,0x00,0xde,0x00,0xe4,0x00,0xec,0x00,0xf4,0x00,0xfc,0x01,0x04,0x01,0x0c,0x06,0xe6,\r\n0x00,0x03,0x06,0xa2,0x06,0xa2,0x06,0xe7,0x00,0x03,0x06,0xa2,0x06,0xa3,0x06,0xe8,0x00,0x03,0x06,0xa2,0x06,0xa4,0x06,0xe9,0x00,0x03,0x06,0xa2,0x06,0xa5,0x06,0xea,0x00,0x03,0x06,0xa2,0x06,0xa6,0x06,0xeb,0x00,0x02,0x06,0xa2,0x06,0xeb,0x00,0x03,0x06,0xa3,0x06,0xa2,0x06,0xec,0x00,0x03,0x06,0xa3,0x06,0xa3,0x06,0xed,0x00,0x03,\r\n0x06,0xa3,0x06,0xa4,0x06,0xee,0x00,0x03,0x06,0xa3,0x06,0xa5,0x06,0xef,0x00,0x03,0x06,0xa3,0x06,0xa6,0x06,0xf0,0x00,0x02,0x06,0xa3,0x06,0xf1,0x00,0x03,0x06,0xa4,0x06,0xa2,0x06,0xf2,0x00,0x03,0x06,0xa4,0x06,0xa3,0x06,0xf3,0x00,0x03,0x06,0xa4,0x06,0xa5,0x06,0xf4,0x00,0x03,0x06,0xa4,0x06,0xa6,0x06,0xf5,0x00,0x03,0x06,0xa5,\r\n0x06,0xa2,0x06,0xf6,0x00,0x03,0x06,0xa5,0x06,0xa3,0x06,0xf7,0x00,0x03,0x06,0xa5,0x06,0xa4,0x06,0xf8,0x00,0x03,0x06,0xa5,0x06,0xa5,0x06,0xf9,0x00,0x03,0x06,0xa5,0x06,0xa6,0x06,0xfa,0x00,0x02,0x06,0xa5,0x06,0xfb,0x00,0x03,0x06,0xa6,0x06,0xa2,0x06,0xfc,0x00,0x03,0x06,0xa6,0x06,0xa3,0x06,0xfd,0x00,0x03,0x06,0xa6,0x06,0xa4,\r\n0x06,0xfe,0x00,0x03,0x06,0xa6,0x06,0xa5,0x06,0xff,0x00,0x03,0x06,0xa6,0x06,0xa6,0x07,0x00,0x00,0x02,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc4,0x00,0xcc,\r\n0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xea,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x07,0x01,0x00,0x03,0x06,0xa2,0x06,0xa2,0x07,0x02,0x00,0x03,0x06,0xa2,0x06,0xa3,0x07,0x03,0x00,0x03,0x06,0xa2,0x06,0xa4,0x07,0x04,0x00,0x03,0x06,0xa2,0x06,0xa5,0x07,0x05,0x00,0x03,0x06,0xa2,0x06,0xa6,0x07,0x06,0x00,0x02,0x06,0xa2,0x07,0x07,\r\n0x00,0x03,0x06,0xa3,0x06,0xa2,0x07,0x08,0x00,0x03,0x06,0xa3,0x06,0xa3,0x07,0x09,0x00,0x03,0x06,0xa3,0x06,0xa4,0x07,0x0a,0x00,0x03,0x06,0xa3,0x06,0xa5,0x07,0x0b,0x00,0x03,0x06,0xa3,0x06,0xa6,0x07,0x0c,0x00,0x02,0x06,0xa3,0x07,0x0d,0x00,0x03,0x06,0xa4,0x06,0xa2,0x07,0x0e,0x00,0x03,0x06,0xa4,0x06,0xa3,0x07,0x0f,0x00,0x03,\r\n0x06,0xa4,0x06,0xa4,0x07,0x10,0x00,0x03,0x06,0xa4,0x06,0xa5,0x07,0x11,0x00,0x03,0x06,0xa4,0x06,0xa6,0x07,0x12,0x00,0x02,0x06,0xa4,0x07,0x13,0x00,0x03,0x06,0xa5,0x06,0xa2,0x07,0x14,0x00,0x03,0x06,0xa5,0x06,0xa3,0x07,0x15,0x00,0x03,0x06,0xa5,0x06,0xa4,0x07,0x16,0x00,0x03,0x06,0xa5,0x06,0xa6,0x07,0x1c,0x00,0x02,0x06,0xa6,\r\n0x07,0x17,0x00,0x03,0x06,0xa6,0x06,0xa2,0x07,0x18,0x00,0x03,0x06,0xa6,0x06,0xa3,0x07,0x19,0x00,0x03,0x06,0xa6,0x06,0xa4,0x07,0x1a,0x00,0x03,0x06,0xa6,0x06,0xa5,0x07,0x1b,0x00,0x03,0x06,0xa6,0x06,0xa6,0x00,0x1c,0x00,0x3a,0x00,0x42,0x00,0x4a,0x00,0x52,0x00,0x5a,0x00,0x62,0x00,0x68,0x00,0x70,0x00,0x78,0x00,0x80,0x00,0x88,\r\n0x00,0x90,0x00,0x96,0x00,0x9e,0x00,0xa6,0x00,0xae,0x00,0xb6,0x00,0xbe,0x00,0xc4,0x00,0xcc,0x00,0xd4,0x00,0xdc,0x00,0xe4,0x00,0xec,0x00,0xf2,0x00,0xfa,0x01,0x02,0x01,0x0a,0x07,0x1d,0x00,0x03,0x06,0xa2,0x06,0xa2,0x07,0x1e,0x00,0x03,0x06,0xa2,0x06,0xa3,0x07,0x1f,0x00,0x03,0x06,0xa2,0x06,0xa4,0x07,0x20,0x00,0x03,0x06,0xa2,\r\n0x06,0xa5,0x07,0x21,0x00,0x03,0x06,0xa2,0x06,0xa6,0x07,0x22,0x00,0x02,0x06,0xa2,0x07,0x23,0x00,0x03,0x06,0xa3,0x06,0xa2,0x07,0x24,0x00,0x03,0x06,0xa3,0x06,0xa3,0x07,0x25,0x00,0x03,0x06,0xa3,0x06,0xa4,0x07,0x26,0x00,0x03,0x06,0xa3,0x06,0xa5,0x07,0x27,0x00,0x03,0x06,0xa3,0x06,0xa6,0x07,0x28,0x00,0x02,0x06,0xa3,0x07,0x29,\r\n0x00,0x03,0x06,0xa4,0x06,0xa2,0x07,0x2a,0x00,0x03,0x06,0xa4,0x06,0xa3,0x07,0x2b,0x00,0x03,0x06,0xa4,0x06,0xa4,0x07,0x2c,0x00,0x03,0x06,0xa4,0x06,0xa5,0x07,0x2d,0x00,0x03,0x06,0xa4,0x06,0xa6,0x07,0x2e,0x00,0x02,0x06,0xa4,0x07,0x2f,0x00,0x03,0x06,0xa5,0x06,0xa2,0x07,0x30,0x00,0x03,0x06,0xa5,0x06,0xa3,0x07,0x31,0x00,0x03,\r\n0x06,0xa5,0x06,0xa4,0x07,0x32,0x00,0x03,0x06,0xa5,0x06,0xa5,0x07,0x33,0x00,0x03,0x06,0xa5,0x06,0xa6,0x07,0x34,0x00,0x02,0x06,0xa5,0x07,0x35,0x00,0x03,0x06,0xa6,0x06,0xa2,0x07,0x36,0x00,0x03,0x06,0xa6,0x06,0xa3,0x07,0x37,0x00,0x03,0x06,0xa6,0x06,0xa4,0x07,0x38,0x00,0x03,0x06,0xa6,0x06,0xa5,0x00,0x02,0x00,0x01,0x06,0xa2,\r\n0x06,0xa6,0x00,0x00,0x00,0x01,0x01,0x92,0x00,0x03,0x00,0x0c,0x00,0x6e,0x01,0x00,0x00,0x08,0x00,0x12,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x08,0x62,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x63,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x64,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,\r\n0x08,0x65,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x66,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x67,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x68,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x69,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x00,0x0c,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x38,0x00,0x42,0x00,0x4c,\r\n0x00,0x56,0x00,0x60,0x00,0x6a,0x00,0x74,0x00,0x7e,0x00,0x88,0x08,0x6a,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x6b,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x6c,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,0x08,0x6d,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x6e,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x6f,\r\n0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x70,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x71,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x08,0x7a,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x46,0x08,0x7b,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x47,0x08,0x7c,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x46,0x08,0x7d,0x00,0x04,0x04,0x68,\r\n0x04,0x66,0x02,0x47,0x00,0x0c,0x00,0x1a,0x00,0x24,0x00,0x2e,0x00,0x38,0x00,0x42,0x00,0x4c,0x00,0x56,0x00,0x60,0x00,0x6a,0x00,0x74,0x00,0x7e,0x00,0x88,0x08,0x72,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x46,0x08,0x73,0x00,0x04,0x04,0x64,0x04,0x72,0x02,0x47,0x08,0x74,0x00,0x04,0x04,0x64,0x04,0x73,0x02,0x46,0x08,0x75,0x00,0x04,\r\n0x04,0x64,0x04,0x73,0x02,0x47,0x08,0x76,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x46,0x08,0x77,0x00,0x04,0x04,0x66,0x04,0x72,0x02,0x47,0x08,0x78,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x46,0x08,0x79,0x00,0x04,0x04,0x66,0x04,0x73,0x02,0x47,0x08,0x7e,0x00,0x04,0x04,0x68,0x04,0x64,0x02,0x46,0x08,0x7f,0x00,0x04,0x04,0x68,0x04,0x64,\r\n0x02,0x47,0x08,0x80,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x46,0x08,0x81,0x00,0x04,0x04,0x68,0x04,0x66,0x02,0x47,0x00,0x02,0x00,0x03,0x01,0x2f,0x01,0x2f,0x00,0x00,0x01,0xc9,0x01,0xc9,0x00,0x01,0x01,0xd2,0x01,0xd2,0x00,0x02,0x00,0x02,0x00,0x1a,0x00,0x0a,0x08,0xa5,0x08,0xa6,0x08,0xa7,0x08,0xa8,0x08,0xa9,0x08,0xaa,0x08,0xab,\r\n0x08,0xac,0x08,0xad,0x08,0xae,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x0c,0x08,0x99,0x08,0x98,0x08,0x96,0x08,0x97,0x08,0x9a,0x08,0x9b,0x08,0x9c,0x08,0x9d,0x08,0x9e,0x08,0x9f,0x08,0x95,0x01,0x37,0x00,0x02,0x00,0x03,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x4c,0x00,0x4c,0x00,0x0a,0x00,0x51,\r\n0x00,0x51,0x00,0x0b,0x00,0x02,0x00,0x64,0x00,0x2f,0x0d,0x8a,0x0d,0x8b,0x0d,0x8c,0x0d,0x8d,0x0d,0x8e,0x0d,0x90,0x0d,0x92,0x0d,0x93,0x0d,0x94,0x0d,0x95,0x0d,0x96,0x0d,0x97,0x0d,0x98,0x0d,0x99,0x0d,0x9a,0x0d,0x9b,0x0d,0x9c,0x0d,0x9d,0x0d,0x9e,0x0d,0x9f,0x0d,0xa0,0x0d,0xa1,0x0d,0xa2,0x0d,0xa3,0x0d,0xa4,0x0d,0xa5,0x0d,0xa6,\r\n0x0d,0xa7,0x0d,0xa8,0x0d,0xa9,0x0d,0xaa,0x0d,0xab,0x0d,0xac,0x0d,0xad,0x0d,0xae,0x0d,0xaf,0x0d,0xb0,0x0d,0xb1,0x0d,0xb2,0x0d,0xb3,0x0d,0xb4,0x0d,0xb5,0x0d,0xb6,0x0d,0xb7,0x0d,0xb8,0x0d,0x8f,0x0d,0x91,0x00,0x02,0x00,0x03,0x01,0xdb,0x02,0x06,0x00,0x00,0x02,0x33,0x02,0x33,0x00,0x2c,0x02,0xb5,0x02,0xb6,0x00,0x2d,0x00,0x02,\r\n0x00,0x64,0x00,0x2f,0x0d,0x98,0x0d,0x99,0x0d,0x9a,0x0d,0x9b,0x0d,0x9c,0x0d,0x9d,0x0d,0x9e,0x0d,0x9f,0x0d,0xa0,0x0d,0xa1,0x0d,0xa2,0x0d,0xa3,0x0d,0xa4,0x0d,0xa5,0x0d,0xa6,0x0d,0xa7,0x0d,0xa8,0x0d,0xa9,0x0d,0xaa,0x0d,0xab,0x0d,0xac,0x0d,0xad,0x0d,0xae,0x0d,0xaf,0x0d,0xb0,0x0d,0xb1,0x0d,0xb2,0x0d,0xb3,0x0d,0xb4,0x0d,0xb5,\r\n0x0d,0xb6,0x0d,0xb7,0x0d,0x8a,0x0d,0x8b,0x0d,0x8c,0x0d,0x8d,0x0d,0x8e,0x0d,0x90,0x0d,0x92,0x0d,0x93,0x0d,0x94,0x0d,0x95,0x0d,0x96,0x0d,0x97,0x0d,0xb8,0x0d,0x8f,0x0d,0x91,0x00,0x02,0x00,0x03,0x02,0x07,0x02,0x32,0x00,0x00,0x02,0x34,0x02,0x34,0x00,0x2c,0x02,0xb7,0x02,0xb8,0x00,0x2d,0x00,0x02,0x00,0x48,0x00,0x21,0x0d,0x6c,\r\n0x0d,0x6b,0x0d,0x70,0x0d,0x7d,0x0d,0x81,0x0d,0x82,0x0d,0x83,0x0d,0x84,0x0d,0x85,0x0d,0x86,0x0d,0x87,0x0d,0x69,0x0d,0x6a,0x0d,0x6d,0x0d,0x6e,0x0d,0x6f,0x0d,0x71,0x0d,0x72,0x0d,0x73,0x0d,0x74,0x0d,0x75,0x0d,0x76,0x0d,0x77,0x0d,0x78,0x0d,0x79,0x0d,0x7a,0x0d,0x7b,0x0d,0x7c,0x0d,0x7e,0x0d,0x7f,0x0d,0x80,0x0d,0x88,0x0d,0x89,\r\n0x00,0x02,0x00,0x04,0x00,0xa9,0x00,0xa9,0x00,0x00,0x01,0x2c,0x01,0x2e,0x00,0x01,0x01,0xa1,0x01,0xa7,0x00,0x04,0x01,0xa9,0x01,0xbe,0x00,0x0b,0x00,0x02,0x00,0x4a,0x00,0x22,0x0d,0x69,0x0d,0x6c,0x0d,0x6d,0x0d,0x7a,0x0d,0x7b,0x0d,0x7d,0x0d,0x81,0x0d,0x82,0x0d,0x83,0x0d,0x84,0x0d,0x6a,0x0d,0x6b,0x0d,0x6e,0x0d,0x6f,0x0d,0x70,\r\n0x0d,0x71,0x0d,0x72,0x0d,0x73,0x0d,0x74,0x0d,0x75,0x0d,0x76,0x0d,0x77,0x0d,0x79,0x0d,0x7a,0x0d,0x7c,0x0d,0x7e,0x0d,0x7f,0x0d,0x80,0x0d,0x88,0x0d,0x89,0x0d,0x85,0x0d,0x86,0x0d,0x87,0x0d,0x78,0x00,0x02,0x00,0x04,0x01,0x2f,0x01,0x34,0x00,0x00,0x01,0xbf,0x01,0xc2,0x00,0x06,0x01,0xc4,0x01,0xda,0x00,0x0a,0x02,0x37,0x02,0x37,\r\n0x00,0x21,0x00,0x02,0x01,0x08,0x00,0x81,0x0d,0xbe,0x0c,0xeb,0x0c,0xec,0x0c,0xed,0x0c,0xee,0x0c,0xef,0x0c,0xf0,0x0c,0xf1,0x0c,0xf2,0x0c,0xf3,0x0c,0xf4,0x0c,0xf5,0x0c,0xf6,0x0c,0xf7,0x0c,0xf8,0x0c,0xf9,0x0c,0xfa,0x0c,0xfb,0x0c,0xfc,0x0c,0xfd,0x0c,0xfe,0x0c,0xff,0x0d,0x00,0x0d,0x01,0x0d,0x02,0x0d,0x03,0x0d,0x04,0x0d,0x10,\r\n0x0d,0x11,0x0d,0x12,0x0d,0x14,0x0d,0x1b,0x0d,0x20,0x0d,0x24,0x0d,0x05,0x0d,0x08,0x0d,0x0c,0x0d,0x0f,0x0d,0x1f,0x0d,0x06,0x0d,0x61,0x0d,0x0e,0x0d,0x15,0x0d,0x0d,0x0d,0x16,0x0d,0x13,0x0d,0x18,0x0d,0x19,0x0d,0x1a,0x0d,0x17,0x0d,0x1d,0x0d,0x1e,0x0d,0x1c,0x0d,0x22,0x0d,0x23,0x0d,0x21,0x0d,0x07,0x0d,0x51,0x0d,0x65,0x0d,0x0a,\r\n0x0d,0x25,0x0d,0x09,0x0d,0x33,0x0d,0x3c,0x0d,0x50,0x0d,0x29,0x0d,0x2a,0x0d,0x27,0x0d,0x28,0x0d,0x2c,0x0d,0x2d,0x0d,0x31,0x0d,0x32,0x0d,0x40,0x0d,0x42,0x0d,0x43,0x0d,0x44,0x0d,0x46,0x0d,0x4a,0x0d,0x4b,0x0d,0x4d,0x0d,0x4e,0x0d,0x52,0x0d,0x54,0x0d,0x59,0x0d,0x5a,0x0d,0x63,0x0d,0x64,0x0d,0x3d,0x0d,0x26,0x0d,0xbf,0x0d,0x35,\r\n0x0d,0x2e,0x0d,0x2f,0x0d,0x30,0x0d,0xc0,0x0d,0x2b,0x0d,0x34,0x0d,0x36,0x0d,0x37,0x0d,0x38,0x0d,0x39,0x0d,0x3a,0x0d,0x3b,0x0d,0x3e,0x0d,0x3f,0x0d,0x41,0x0d,0x45,0x0d,0x47,0x0d,0x48,0x0d,0x49,0x0d,0x4c,0x0d,0x4f,0x0d,0x55,0x0d,0x56,0x0d,0x57,0x0d,0x58,0x0d,0x5b,0x0d,0x5c,0x0d,0x60,0x0d,0x66,0x0d,0x67,0x0d,0x68,0x0d,0x5d,\r\n0x0d,0x5e,0x0d,0x5f,0x0d,0x62,0x0d,0xc1,0x0d,0x0b,0x00,0x02,0x00,0x4e,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x24,0x00,0x3d,0x00,0x01,0x00,0x62,0x00,0x68,0x00,0x1b,0x00,0x91,0x00,0x92,0x00,0x22,0x00,0xad,0x00,0xb0,0x00,0x24,0x00,0xbb,0x00,0xbb,0x00,0x28,0x00,0xc7,0x00,0xd5,0x00,0x29,0x00,0xe1,0x00,0xe1,0x00,0x38,0x00,0xe3,\r\n0x00,0xe3,0x00,0x39,0x00,0xe5,0x00,0xe5,0x00,0x3a,0x00,0xe8,0x00,0xe8,0x00,0x3b,0x00,0xea,0x00,0xea,0x00,0x3c,0x00,0xec,0x00,0xec,0x00,0x3d,0x00,0xf7,0x00,0xf7,0x00,0x3e,0x00,0xf9,0x00,0xfa,0x00,0x3f,0x00,0xfc,0x00,0xfc,0x00,0x41,0x00,0xfe,0x00,0xfe,0x00,0x42,0x01,0x03,0x01,0x03,0x00,0x43,0x01,0x05,0x01,0x05,0x00,0x44,\r\n0x01,0x07,0x01,0x07,0x00,0x45,0x01,0x09,0x01,0x0a,0x00,0x46,0x01,0x0c,0x01,0x0c,0x00,0x48,0x01,0x0e,0x01,0x0e,0x00,0x49,0x01,0x10,0x01,0x10,0x00,0x4a,0x01,0x12,0x01,0x12,0x00,0x4b,0x01,0x14,0x01,0x14,0x00,0x4c,0x01,0x16,0x01,0x16,0x00,0x4d,0x01,0x18,0x01,0x18,0x00,0x4e,0x01,0x1a,0x01,0x1a,0x00,0x4f,0x01,0x1c,0x01,0x1c,\r\n0x00,0x50,0x01,0x1e,0x01,0x1e,0x00,0x51,0x01,0x20,0x01,0x20,0x00,0x52,0x01,0x22,0x01,0x22,0x00,0x53,0x01,0x24,0x01,0x24,0x00,0x54,0x01,0x26,0x01,0x26,0x00,0x55,0x01,0x28,0x01,0x28,0x00,0x56,0x01,0x2a,0x01,0x2a,0x00,0x57,0x01,0x39,0x01,0x39,0x00,0x58,0x01,0x45,0x01,0x45,0x00,0x59,0x01,0x47,0x01,0x47,0x00,0x5a,0x01,0x49,\r\n0x01,0x49,0x00,0x5b,0x01,0x4b,0x01,0x4b,0x00,0x5c,0x01,0x4d,0x01,0x4d,0x00,0x5d,0x01,0x4f,0x01,0x4f,0x00,0x5e,0x01,0x51,0x01,0x51,0x00,0x5f,0x01,0x53,0x01,0x53,0x00,0x60,0x01,0x55,0x01,0x55,0x00,0x61,0x01,0x57,0x01,0x57,0x00,0x62,0x01,0x59,0x01,0x59,0x00,0x63,0x01,0x5b,0x01,0x5b,0x00,0x64,0x01,0x5d,0x01,0x5d,0x00,0x65,\r\n0x01,0x5f,0x01,0x5f,0x00,0x66,0x01,0x61,0x01,0x61,0x00,0x67,0x01,0x63,0x01,0x63,0x00,0x68,0x01,0x65,0x01,0x65,0x00,0x69,0x01,0x68,0x01,0x68,0x00,0x6a,0x01,0x6a,0x01,0x6a,0x00,0x6b,0x01,0x6c,0x01,0x6c,0x00,0x6c,0x01,0x6e,0x01,0x6e,0x00,0x6d,0x01,0x70,0x01,0x70,0x00,0x6e,0x01,0x72,0x01,0x72,0x00,0x6f,0x01,0x74,0x01,0x74,\r\n0x00,0x70,0x01,0x76,0x01,0x76,0x00,0x71,0x01,0x78,0x01,0x78,0x00,0x72,0x01,0x7a,0x01,0x7a,0x00,0x73,0x01,0x7c,0x01,0x7c,0x00,0x74,0x01,0x7e,0x01,0x7e,0x00,0x75,0x01,0x80,0x01,0x80,0x00,0x76,0x01,0x82,0x01,0x82,0x00,0x77,0x01,0x85,0x01,0x85,0x00,0x78,0x01,0x87,0x01,0x87,0x00,0x79,0x01,0x89,0x01,0x89,0x00,0x7a,0x01,0x8c,\r\n0x01,0x8c,0x00,0x7b,0x01,0x8e,0x01,0x8e,0x00,0x7c,0x01,0x90,0x01,0x90,0x00,0x7d,0x01,0x92,0x01,0x92,0x00,0x7e,0x02,0x3d,0x02,0x3d,0x00,0x7f,0x0b,0x21,0x0b,0x21,0x00,0x80,0x00,0x02,0x01,0x06,0x00,0x80,0x0d,0xbe,0x0c,0xeb,0x0c,0xec,0x0c,0xed,0x0c,0xee,0x0c,0xef,0x0c,0xf0,0x0c,0xf1,0x0c,0xf2,0x0c,0xf4,0x0c,0xf5,0x0c,0xf6,\r\n0x0c,0xf7,0x0c,0xf8,0x0c,0xf9,0x0c,0xfa,0x0c,0xfb,0x0c,0xfc,0x0c,0xfd,0x0c,0xfe,0x0c,0xff,0x0d,0x00,0x0d,0x01,0x0d,0x02,0x0d,0x03,0x0d,0x04,0x0d,0x0d,0x0d,0x0c,0x0d,0x0e,0x0d,0x10,0x0d,0x0f,0x0d,0x11,0x0d,0x12,0x0d,0x14,0x0d,0x13,0x0d,0x15,0x0d,0x16,0x0d,0x18,0x0d,0x17,0x0d,0x19,0x0d,0x1a,0x0d,0x1b,0x0d,0x1d,0x0d,0x1c,\r\n0x0d,0x1e,0x0d,0x20,0x0d,0x1f,0x0d,0x22,0x0d,0x21,0x0d,0x23,0x0d,0x24,0x0d,0x0b,0x0d,0x05,0x0d,0x08,0x0d,0x06,0x0d,0x61,0x0c,0xf3,0x0d,0x07,0x0d,0x51,0x0d,0x65,0x0d,0x0a,0x0d,0x25,0x0d,0x09,0x0d,0x33,0x0d,0x50,0x0d,0x29,0x0d,0x2a,0x0d,0x2d,0x0d,0x27,0x0d,0x28,0x0d,0x2c,0x0d,0x31,0x0d,0x32,0x0d,0x40,0x0d,0x42,0x0d,0x43,\r\n0x0d,0x44,0x0d,0x46,0x0d,0x4a,0x0d,0x4b,0x0d,0x4d,0x0d,0x4e,0x0d,0x52,0x0d,0x54,0x0d,0x59,0x0d,0x5a,0x0d,0x63,0x0d,0x64,0x0d,0x3d,0x0d,0x26,0x0d,0xbf,0x0d,0x35,0x0d,0x2e,0x0d,0x2f,0x0d,0x30,0x0d,0xc0,0x0d,0x2b,0x0d,0x34,0x0d,0x36,0x0d,0x37,0x0d,0x38,0x0d,0x39,0x0d,0x3a,0x0d,0x3b,0x0d,0x3e,0x0d,0x3f,0x0d,0x41,0x0d,0x45,\r\n0x0d,0x47,0x0d,0x48,0x0d,0x49,0x0d,0x4c,0x0d,0x4f,0x0d,0x55,0x0d,0x56,0x0d,0x57,0x0d,0x58,0x0d,0x5b,0x0d,0x5c,0x0d,0x60,0x0d,0x66,0x0d,0x67,0x0d,0x68,0x0d,0x5d,0x0d,0x5e,0x0d,0x5f,0x0d,0x62,0x0d,0xc1,0x00,0x02,0x00,0x4f,0x00,0x09,0x00,0x09,0x00,0x00,0x00,0x44,0x00,0x4b,0x00,0x01,0x00,0x4d,0x00,0x5d,0x00,0x09,0x00,0x69,\r\n0x00,0x81,0x00,0x1a,0x00,0x89,0x00,0x89,0x00,0x33,0x00,0xa0,0x00,0xa1,0x00,0x34,0x00,0xb1,0x00,0xb1,0x00,0x36,0x00,0xba,0x00,0xba,0x00,0x37,0x00,0xd6,0x00,0xd6,0x00,0x38,0x00,0xe2,0x00,0xe2,0x00,0x39,0x00,0xe4,0x00,0xe4,0x00,0x3a,0x00,0xe6,0x00,0xe6,0x00,0x3b,0x00,0xe9,0x00,0xe9,0x00,0x3c,0x00,0xeb,0x00,0xeb,0x00,0x3d,\r\n0x00,0xed,0x00,0xed,0x00,0x3e,0x00,0xf8,0x00,0xf8,0x00,0x3f,0x00,0xfb,0x00,0xfb,0x00,0x40,0x00,0xfd,0x00,0xfd,0x00,0x41,0x00,0xff,0x01,0x00,0x00,0x42,0x01,0x04,0x01,0x04,0x00,0x44,0x01,0x06,0x01,0x06,0x00,0x45,0x01,0x08,0x01,0x08,0x00,0x46,0x01,0x0b,0x01,0x0b,0x00,0x47,0x01,0x0d,0x01,0x0d,0x00,0x48,0x01,0x0f,0x01,0x0f,\r\n0x00,0x49,0x01,0x11,0x01,0x11,0x00,0x4a,0x01,0x13,0x01,0x13,0x00,0x4b,0x01,0x15,0x01,0x15,0x00,0x4c,0x01,0x17,0x01,0x17,0x00,0x4d,0x01,0x19,0x01,0x19,0x00,0x4e,0x01,0x1b,0x01,0x1b,0x00,0x4f,0x01,0x1d,0x01,0x1d,0x00,0x50,0x01,0x1f,0x01,0x1f,0x00,0x51,0x01,0x21,0x01,0x21,0x00,0x52,0x01,0x23,0x01,0x23,0x00,0x53,0x01,0x25,\r\n0x01,0x25,0x00,0x54,0x01,0x27,0x01,0x27,0x00,0x55,0x01,0x29,0x01,0x29,0x00,0x56,0x01,0x2b,0x01,0x2b,0x00,0x57,0x01,0x3a,0x01,0x3a,0x00,0x58,0x01,0x46,0x01,0x46,0x00,0x59,0x01,0x48,0x01,0x48,0x00,0x5a,0x01,0x4a,0x01,0x4a,0x00,0x5b,0x01,0x4c,0x01,0x4c,0x00,0x5c,0x01,0x4e,0x01,0x4e,0x00,0x5d,0x01,0x50,0x01,0x50,0x00,0x5e,\r\n0x01,0x52,0x01,0x52,0x00,0x5f,0x01,0x54,0x01,0x54,0x00,0x60,0x01,0x56,0x01,0x56,0x00,0x61,0x01,0x58,0x01,0x58,0x00,0x62,0x01,0x5a,0x01,0x5a,0x00,0x63,0x01,0x5c,0x01,0x5c,0x00,0x64,0x01,0x5e,0x01,0x5e,0x00,0x65,0x01,0x60,0x01,0x60,0x00,0x66,0x01,0x62,0x01,0x62,0x00,0x67,0x01,0x64,0x01,0x64,0x00,0x68,0x01,0x66,0x01,0x66,\r\n0x00,0x69,0x01,0x69,0x01,0x69,0x00,0x6a,0x01,0x6b,0x01,0x6b,0x00,0x6b,0x01,0x6d,0x01,0x6d,0x00,0x6c,0x01,0x6f,0x01,0x6f,0x00,0x6d,0x01,0x71,0x01,0x71,0x00,0x6e,0x01,0x73,0x01,0x73,0x00,0x6f,0x01,0x75,0x01,0x75,0x00,0x70,0x01,0x77,0x01,0x77,0x00,0x71,0x01,0x79,0x01,0x79,0x00,0x72,0x01,0x7b,0x01,0x7b,0x00,0x73,0x01,0x7d,\r\n0x01,0x7d,0x00,0x74,0x01,0x7f,0x01,0x7f,0x00,0x75,0x01,0x81,0x01,0x81,0x00,0x76,0x01,0x83,0x01,0x83,0x00,0x77,0x01,0x86,0x01,0x86,0x00,0x78,0x01,0x88,0x01,0x88,0x00,0x79,0x01,0x8a,0x01,0x8a,0x00,0x7a,0x01,0x8d,0x01,0x8d,0x00,0x7b,0x01,0x8f,0x01,0x8f,0x00,0x7c,0x01,0x91,0x01,0x91,0x00,0x7d,0x01,0x93,0x01,0x93,0x00,0x7e,\r\n0x02,0x3e,0x02,0x3e,0x00,0x7f,0x00,0x02,0x00,0x08,0x00,0x01,0x0c,0xf3,0x00,0x01,0x00,0x01,0x00,0x4c,0x00,0x02,0x00,0x08,0x00,0x01,0x0d,0x3c,0x00,0x01,0x00,0x01,0x00,0x4c,0x00,0x01,0x00,0x24,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x10,0x00,0x16,0x0d,0xbd,0x00,0x03,0x00,0x49,0x00,0x4f,0x0d,0xbb,0x00,0x02,0x00,0x49,\r\n0x0d,0xba,0x00,0x02,0x00,0x4f,0x00,0x01,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x28,0x00,0x02,0x00,0x0a,0x00,0x1e,0x00,0x02,0x00,0x06,0x00,0x0e,0x0d,0xbc,0x00,0x03,0x00,0x49,0x00,0x4c,0x0d,0xb9,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x04,0x0d,0xbc,0x00,0x02,0x00,0x4c,0x00,0x01,0x00,0x02,0x00,0x49,0x0d,0xbb,0x00,0x02,0x00,0x08,\r\n0x00,0x01,0x00,0xbc,0x00,0x01,0x00,0x01,0x00,0x12,0x00,0x03,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x74,0x00,0x02,0x00,0x02,0x00,0xbc,0x00,0xbc,0x00,0x00,0x0c,0xe1,0x0c,0xea,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x08,0x8d,0x00,0xf0,\r\n0x00,0xf1,0x00,0xf2,0x02,0x38,0x02,0x39,0x08,0x8e,0x02,0x3a,0x02,0x3b,0x08,0x8f,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xc3,0x0c,0xc4,0x0c,0xc5,0x0c,0xc6,0x0c,0xc7,0x0c,0xc8,0x0c,0xc9,0x0c,0xca,0x0c,0xcb,0x0c,0xcc,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,\r\n0x00,0x1a,0x00,0x0a,0x0c,0xb9,0x0c,0xba,0x0c,0xbb,0x0c,0xbc,0x0c,0xbd,0x0c,0xbe,0x0c,0xbf,0x0c,0xc0,0x0c,0xc1,0x0c,0xc2,0x00,0x02,0x00,0x01,0x0c,0xcd,0x0c,0xd6,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x01,\r\n0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x02,0x00,0x01,0x0c,0xcd,0x0c,0xd6,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xb9,0x0c,0xba,0x0c,0xbb,0x0c,0xbc,0x0c,0xbd,0x0c,0xbe,0x0c,0xbf,0x0c,0xc0,\r\n0x0c,0xc1,0x0c,0xc2,0x00,0x02,0x00,0x01,0x0c,0xc3,0x0c,0xcc,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x00,0x02,0x00,0x01,0x0c,0xc3,0x0c,0xcc,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xc3,0x0c,0xc4,0x0c,0xc5,0x0c,0xc6,\r\n0x0c,0xc7,0x0c,0xc8,0x0c,0xc9,0x0c,0xca,0x0c,0xcb,0x0c,0xcc,0x00,0x02,0x00,0x01,0x0c,0xb9,0x0c,0xc2,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x01,0x0c,0xb9,0x0c,0xc2,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x06,\r\n0x00,0x12,0x00,0x38,0x00,0x44,0x00,0x50,0x00,0x6a,0x00,0x76,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1c,0x10,0xb9,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x14,0x10,0xba,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x15,0x10,0xbb,0x00,0x04,0x00,0x39,0x00,0x36,0x00,0x16,0x00,0x01,0x00,0x04,0x08,0xc5,0x00,0x03,0x00,0x35,0x00,0x30,0x00,0x01,\r\n0x00,0x04,0x10,0xbc,0x00,0x03,0x00,0x39,0x00,0x36,0x00,0x02,0x00,0x06,0x00,0x10,0x10,0xfb,0x00,0x04,0x00,0x25,0x00,0x36,0x00,0x33,0x10,0xfd,0x00,0x04,0x00,0x31,0x00,0x25,0x00,0x36,0x00,0x01,0x00,0x04,0x08,0xc6,0x00,0x03,0x00,0x2f,0x00,0x30,0x00,0x03,0x00,0x08,0x00,0x12,0x00,0x1a,0x10,0xfc,0x00,0x04,0x00,0x3a,0x00,0x36,\r\n0x00,0x33,0x08,0xc4,0x00,0x03,0x00,0x3a,0x00,0x2d,0x08,0xc3,0x00,0x04,0x00,0x3a,0x00,0x31,0x00,0x2d,0x00,0x02,0x00,0x04,0x00,0x29,0x00,0x29,0x00,0x00,0x00,0x2f,0x00,0x31,0x00,0x01,0x00,0x35,0x00,0x35,0x00,0x04,0x00,0x3d,0x00,0x3d,0x00,0x05,0x00,0x02,0x00,0x80,0x00,0x3d,0x10,0xe5,0x10,0xbd,0x10,0xbe,0x10,0xbf,0x10,0xe6,\r\n0x10,0xe7,0x10,0xe8,0x10,0xe9,0x10,0xea,0x10,0xeb,0x10,0xec,0x10,0xed,0x10,0xc0,0x10,0xc1,0x10,0xf9,0x10,0xc2,0x10,0xc3,0x10,0xc4,0x10,0xee,0x10,0xef,0x10,0xf0,0x10,0xf1,0x10,0xf2,0x10,0xf3,0x10,0xf4,0x10,0xc5,0x10,0xf5,0x10,0xf6,0x10,0xc6,0x10,0xc7,0x10,0xc8,0x10,0xc9,0x10,0xca,0x10,0xf7,0x10,0xcb,0x10,0xcc,0x10,0xcd,\r\n0x10,0xce,0x10,0xcf,0x10,0xd0,0x10,0xd1,0x10,0xd2,0x10,0xd3,0x10,0xd4,0x10,0xd5,0x10,0xd6,0x10,0xd7,0x10,0xd8,0x10,0xd9,0x10,0xda,0x10,0xdb,0x10,0xdc,0x10,0xdd,0x10,0xde,0x10,0xdf,0x10,0xe0,0x10,0xe1,0x10,0xf8,0x10,0xe2,0x10,0xe3,0x10,0xe4,0x00,0x02,0x00,0x1b,0x00,0x05,0x00,0x05,0x00,0x00,0x00,0x07,0x00,0x0a,0x00,0x01,\r\n0x00,0x0d,0x00,0x0d,0x00,0x05,0x00,0x0f,0x00,0x11,0x00,0x06,0x00,0x1d,0x00,0x1e,0x00,0x09,0x00,0x42,0x00,0x42,0x00,0x0b,0x00,0x85,0x00,0x86,0x00,0x0c,0x00,0x8c,0x00,0x8c,0x00,0x0e,0x00,0x97,0x00,0x98,0x00,0x0f,0x00,0x9a,0x00,0x9a,0x00,0x11,0x00,0xaa,0x00,0xab,0x00,0x12,0x00,0xb2,0x00,0xb2,0x00,0x14,0x00,0xb4,0x00,0xb7,\r\n0x00,0x15,0x00,0xbd,0x00,0xbd,0x00,0x19,0x00,0xc4,0x00,0xc5,0x00,0x1a,0x00,0xf3,0x00,0xf6,0x00,0x1c,0x01,0x38,0x01,0x38,0x00,0x20,0x01,0x94,0x01,0x94,0x00,0x21,0x01,0x96,0x01,0x96,0x00,0x22,0x01,0x98,0x01,0x9b,0x00,0x23,0x07,0xd2,0x07,0xd8,0x00,0x27,0x07,0xda,0x07,0xdf,0x00,0x2e,0x08,0x56,0x08,0x59,0x00,0x34,0x08,0x8c,\r\n0x08,0x8c,0x00,0x38,0x08,0xbd,0x08,0xbd,0x00,0x39,0x0a,0x64,0x0a,0x64,0x00,0x3a,0x0b,0x2a,0x0b,0x2b,0x00,0x3b,0x00,0x02,0x00,0x56,0x00,0x28,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,\r\n0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x0c,0xcd,0x0c,0xce,0x0c,0xcf,0x0c,0xd0,0x0c,0xd1,0x0c,0xd2,0x0c,0xd3,0x0c,0xd4,0x0c,0xd5,0x0c,0xd6,0x00,0x02,0x00,0x02,0x00,0x13,0x00,0x1c,0x00,0x00,0x0c,0xb9,0x0c,0xd6,0x00,0x0a,0x00,0x02,0x00,0xa2,\r\n0x00,0x4e,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0d,0xf2,0x0d,0xf3,0x10,0x9a,0x10,0x9b,0x10,0xa5,0x10,0xaf,0x10,0xb6,0x10,0xac,0x10,0xad,0x10,0xb7,0x10,0xb8,0x10,0xa9,0x10,0xb1,0x10,0x99,0x10,0xa6,0x10,0xa7,0x10,0xab,0x10,0xae,0x10,0xa8,0x10,0x96,0x10,0xb2,\r\n0x10,0xa3,0x10,0xa2,0x10,0x9c,0x10,0x9e,0x10,0x9d,0x10,0xa0,0x10,0x9f,0x10,0xa1,0x10,0xa4,0x10,0xb4,0x10,0xb5,0x10,0xb0,0x10,0xb3,0x10,0x98,0x10,0x97,0x10,0xaa,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,\r\n0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x0c,0xd7,0x0c,0xd8,0x0c,0xd9,0x0c,0xda,0x0c,0xdb,0x0c,0xdc,0x0c,0xdd,0x0c,0xde,0x0c,0xdf,0x0c,0xe0,0x10,0x95,0x00,0x02,0x00,0x1b,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x2c,0x00,0x2c,0x00,0x0a,0x00,0x34,0x00,0x34,0x00,0x0b,0x00,0xcc,0x00,0xcf,0x00,0x0c,0x00,0xf9,0x00,0xf9,0x00,0x10,\r\n0x01,0x39,0x01,0x39,0x00,0x11,0x01,0x5b,0x01,0x5b,0x00,0x12,0x01,0x5d,0x01,0x5d,0x00,0x13,0x01,0x5f,0x01,0x5f,0x00,0x14,0x01,0x61,0x01,0x61,0x00,0x15,0x01,0xa4,0x01,0xa4,0x00,0x16,0x01,0xae,0x01,0xae,0x00,0x17,0x01,0xbd,0x01,0xbd,0x00,0x18,0x01,0xe0,0x01,0xe0,0x00,0x19,0x02,0x7f,0x02,0x7f,0x00,0x1a,0x02,0x81,0x02,0x81,\r\n0x00,0x1b,0x02,0xb5,0x02,0xb5,0x00,0x1c,0x03,0x0f,0x03,0x0f,0x00,0x1d,0x03,0x11,0x03,0x11,0x00,0x1e,0x03,0xad,0x03,0xb4,0x00,0x1f,0x04,0x3f,0x04,0x42,0x00,0x27,0x04,0xf9,0x04,0xf9,0x00,0x2b,0x05,0x2c,0x05,0x2c,0x00,0x2c,0x05,0x2e,0x05,0x2e,0x00,0x2d,0x06,0x21,0x06,0x21,0x00,0x2e,0x0c,0xb9,0x0c,0xd6,0x00,0x2f,0x0d,0xe4,\r\n0x0d,0xe4,0x00,0x4d,0x00,0x02,0x00,0x42,0x00,0x1e,0x0d,0xf5,0x0d,0xf6,0x0d,0xf7,0x0d,0xf8,0x0d,0xf9,0x0d,0xfa,0x0d,0xfb,0x0d,0xfc,0x0d,0xfd,0x0d,0xfe,0x0d,0xff,0x0e,0x00,0x0e,0x01,0x0e,0x0b,0x0e,0x02,0x0e,0x03,0x0e,0x04,0x0e,0x05,0x0e,0x06,0x0e,0x07,0x0e,0x08,0x0e,0x09,0x0e,0x0a,0x0e,0x0f,0x0e,0x10,0x0e,0x0e,0x0e,0x0c,\r\n0x0e,0x0d,0x0e,0x11,0x0e,0x12,0x00,0x02,0x00,0x13,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x0f,0x00,0x0f,0x00,0x01,0x00,0x1e,0x00,0x1e,0x00,0x02,0x00,0x22,0x00,0x22,0x00,0x03,0x00,0xb4,0x00,0xb7,0x00,0x04,0x00,0xc4,0x00,0xc5,0x00,0x08,0x01,0x08,0x01,0x08,0x00,0x0a,0x01,0x10,0x01,0x11,0x00,0x0b,0x01,0x23,0x01,0x23,0x00,0x0d,\r\n0x01,0x3b,0x01,0x3b,0x00,0x0e,0x01,0x55,0x01,0x56,0x00,0x0f,0x01,0x65,0x01,0x66,0x00,0x11,0x01,0x6a,0x01,0x6b,0x00,0x13,0x01,0x72,0x01,0x73,0x00,0x15,0x01,0x94,0x01,0x94,0x00,0x17,0x01,0x9c,0x01,0x9c,0x00,0x18,0x01,0x9e,0x01,0x9e,0x00,0x19,0x02,0x3d,0x02,0x3e,0x00,0x1a,0x02,0xaf,0x02,0xb0,0x00,0x1c,0x00,0x02,0x00,0x08,\r\n0x00,0x01,0x0d,0xf4,0x00,0x01,0x00,0x01,0x00,0x09,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x11,0x84,0x00,0x02,0x11,0x83,0x00,0x01,0x00,0x01,0x11,0x82,0x00,0x01,0x00,0x8a,0x00,0x0b,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x00,0x62,0x00,0x6c,0x00,0x76,0x00,0x80,0x00,0x01,\r\n0x00,0x04,0x11,0x8e,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x98,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x8f,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x90,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x91,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x92,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x93,\r\n0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x94,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x95,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x96,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x97,0x00,0x02,0x11,0x8d,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x00,0x0c,0xcd,0x0c,0xd6,0x00,0x01,0x00,0x01,0x00,0x8a,\r\n0x00,0x0b,0x00,0x1c,0x00,0x26,0x00,0x30,0x00,0x3a,0x00,0x44,0x00,0x4e,0x00,0x58,0x00,0x62,0x00,0x6c,0x00,0x76,0x00,0x80,0x00,0x01,0x00,0x04,0x11,0x8e,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x98,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x8f,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x90,0x00,0x02,0x11,0x8d,\r\n0x00,0x01,0x00,0x04,0x11,0x91,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x92,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x93,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x94,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x95,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,0x11,0x96,0x00,0x02,0x11,0x8d,0x00,0x01,0x00,0x04,\r\n0x11,0x97,0x00,0x02,0x11,0x8d,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x13,0x00,0x1c,0x00,0x01,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xa4,0x11,0xa5,0x11,0xa6,0x11,0xa7,0x11,0xa8,0x11,0xa9,0x11,0xaa,0x11,0xab,0x11,0xac,0x11,0xad,0x00,0x02,0x00,0x01,0x0f,0xd6,0x0f,0xdf,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,\r\n0x11,0xb8,0x11,0xb9,0x11,0xba,0x11,0xbb,0x11,0xbc,0x11,0xbd,0x11,0xbe,0x11,0xbf,0x11,0xc0,0x11,0xc1,0x00,0x02,0x00,0x01,0x0f,0xea,0x0f,0xf3,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xae,0x11,0xaf,0x11,0xb0,0x11,0xb1,0x11,0xb2,0x11,0xb3,0x11,0xb4,0x11,0xb5,0x11,0xb6,0x11,0xb7,0x00,0x02,0x00,0x01,0x0f,0xe0,0x0f,0xe9,\r\n0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xc2,0x11,0xc3,0x11,0xc4,0x11,0xc5,0x11,0xc6,0x11,0xc7,0x11,0xc8,0x11,0xc9,0x11,0xca,0x11,0xcb,0x00,0x02,0x00,0x01,0x0f,0xf4,0x0f,0xfd,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xcc,0x11,0xcd,0x11,0xce,0x11,0xcf,0x11,0xd0,0x11,0xd1,0x11,0xd2,0x11,0xd3,0x11,0xd4,0x11,0xd5,\r\n0x00,0x02,0x00,0x01,0x0f,0xfe,0x10,0x07,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xd6,0x11,0xd7,0x11,0xd8,0x11,0xd9,0x11,0xda,0x11,0xdb,0x11,0xdc,0x11,0xdd,0x11,0xde,0x11,0xdf,0x00,0x02,0x00,0x01,0x10,0x08,0x10,0x11,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xe0,0x11,0xe1,0x11,0xe2,0x11,0xe3,0x11,0xe4,0x11,0xe5,\r\n0x11,0xe6,0x11,0xe7,0x11,0xe8,0x11,0xe9,0x00,0x02,0x00,0x01,0x10,0x12,0x10,0x1b,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xea,0x11,0xeb,0x11,0xec,0x11,0xed,0x11,0xee,0x11,0xef,0x11,0xf0,0x11,0xf1,0x11,0xf2,0x11,0xf3,0x00,0x02,0x00,0x01,0x10,0x1c,0x10,0x25,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xf4,0x11,0xf5,\r\n0x11,0xf6,0x11,0xf7,0x11,0xf8,0x11,0xf9,0x11,0xfa,0x11,0xfb,0x11,0xfc,0x11,0xfd,0x00,0x02,0x00,0x01,0x10,0x26,0x10,0x2f,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x11,0xfe,0x11,0xff,0x12,0x00,0x12,0x01,0x12,0x02,0x12,0x03,0x12,0x04,0x12,0x05,0x12,0x06,0x12,0x07,0x00,0x02,0x00,0x01,0x10,0x30,0x10,0x39,0x00,0x00,0x00,0x02,\r\n0x00,0x1a,0x00,0x0a,0x12,0x08,0x12,0x09,0x12,0x0a,0x12,0x0b,0x12,0x0c,0x12,0x0d,0x12,0x0e,0x12,0x0f,0x12,0x10,0x12,0x11,0x00,0x02,0x00,0x01,0x10,0x3a,0x10,0x43,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x12,0x12,0x13,0x12,0x14,0x12,0x15,0x12,0x16,0x12,0x17,0x12,0x18,0x12,0x19,0x12,0x1a,0x12,0x1b,0x00,0x02,0x00,0x01,\r\n0x10,0x44,0x10,0x4d,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x1c,0x12,0x1d,0x12,0x1e,0x12,0x1f,0x12,0x20,0x12,0x21,0x12,0x22,0x12,0x23,0x12,0x24,0x12,0x25,0x00,0x02,0x00,0x01,0x10,0x4e,0x10,0x57,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x26,0x12,0x27,0x12,0x28,0x12,0x29,0x12,0x2a,0x12,0x2b,0x12,0x2c,0x12,0x2d,\r\n0x12,0x2e,0x12,0x2f,0x00,0x02,0x00,0x01,0x10,0x58,0x10,0x61,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x30,0x12,0x31,0x12,0x32,0x12,0x33,0x12,0x34,0x12,0x35,0x12,0x36,0x12,0x37,0x12,0x38,0x12,0x39,0x00,0x02,0x00,0x01,0x10,0x62,0x10,0x6b,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x3a,0x12,0x3b,0x12,0x3c,0x12,0x3d,\r\n0x12,0x3e,0x12,0x3f,0x12,0x40,0x12,0x41,0x12,0x42,0x12,0x43,0x00,0x02,0x00,0x01,0x10,0x6c,0x10,0x75,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,0x12,0x44,0x12,0x45,0x12,0x46,0x12,0x47,0x12,0x48,0x12,0x49,0x12,0x4a,0x12,0x4b,0x12,0x4c,0x12,0x4d,0x00,0x02,0x00,0x01,0x10,0x76,0x10,0x7f,0x00,0x00,0x00,0x02,0x00,0x1a,0x00,0x0a,\r\n0x12,0x4f,0x12,0x50,0x12,0x51,0x12,0x52,0x12,0x53,0x12,0x54,0x12,0x55,0x12,0x56,0x12,0x57,0x12,0x58,0x00,0x02,0x00,0x01,0x10,0x81,0x10,0x8a,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0xb7,0x00,0x02,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x01,0x00,0x14,0x00,0x01,0x00,0x08,0x00,0x01,\r\n0x00,0x04,0x0b,0xb7,0x00,0x03,0x08,0xc4,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x01,0x00,0x54,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x02,0x00,0x82,0x00,0x88,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x02,\r\n0x00,0x6e,0x00,0xa2,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x14,0x00,0x02,0x00,0x5a,0x00,0x94,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x00,0x01,0x0b,0x7a,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,\r\n0x0b,0xb9,0x0b,0xb9,0x00,0x0c,0x0b,0xbf,0x0b,0xbf,0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,\r\n0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0xc8,0x00,0x03,0x00,0x02,0x02,0xbc,0x02,0xea,0x00,0x01,0x02,0xf0,0x00,0x01,0x02,0xf6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x02,0xa6,\r\n0x02,0xa6,0x02,0xd4,0x00,0x01,0x02,0xda,0x00,0x01,0x02,0xe0,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x02,0x8e,0x02,0xf0,0x02,0xbc,0x00,0x01,0x02,0xc2,0x00,0x01,0x02,0xc8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x02,0x76,0x02,0x76,0x02,0xd8,0x02,0xa4,0x00,0x01,0x02,0xaa,0x00,0x01,0x02,0xb0,0x00,0x01,\r\n0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0xc6,0x00,0x01,0x02,0x90,0x00,0x01,0x02,0xcc,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x02,0x48,0x02,0xb2,0x00,0x01,0x02,0x7c,0x00,0x01,0x02,0xb8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x9c,0x00,0x01,0x02,0x66,0x00,0x02,0x02,0xdc,0x02,0x32,0x00,0x01,\r\n0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x02,0x1c,0x02,0x86,0x00,0x01,0x02,0x50,0x00,0x02,0x02,0xc6,0x02,0x1c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x6e,0x00,0x01,0x02,0x38,0x00,0x03,0x02,0xae,0x02,0xb4,0x02,0xba,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0xec,0x02,0x56,0x00,0x01,0x02,0x20,\r\n0x00,0x03,0x02,0x96,0x02,0x9c,0x02,0xa2,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x3c,0x00,0x01,0x02,0x06,0x00,0x03,0x02,0x7c,0x02,0x82,0x02,0x3c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0xba,0x02,0x24,0x00,0x01,0x01,0xee,0x00,0x03,0x02,0x64,0x02,0x6a,0x02,0x24,0x00,0x01,0x00,0x00,0x00,0x76,\r\n0x00,0x03,0x00,0x01,0x02,0x5c,0x00,0x01,0x01,0xd4,0x00,0x01,0x02,0x10,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x48,0x00,0x01,0x01,0xc0,0x00,0x02,0x02,0x36,0x01,0x8c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x32,0x00,0x01,0x01,0xaa,0x00,0x03,0x02,0x20,0x02,0x26,0x01,0xe0,0x00,0x01,0x00,0x00,\r\n0x00,0x76,0x00,0x03,0x00,0x01,0x02,0x1a,0x00,0x01,0x01,0x92,0x00,0x03,0x02,0x08,0x02,0x0e,0x02,0x14,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x46,0x02,0x02,0x00,0x01,0x01,0x7a,0x00,0x01,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x30,0x01,0xec,0x00,0x01,0x01,0x64,0x00,0x02,0x01,0xda,\r\n0x01,0x30,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x01,0x18,0x01,0xd4,0x00,0x01,0x01,0x4c,0x00,0x03,0x01,0xc2,0x01,0xc8,0x01,0x82,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,0x00,0xfe,0x01,0xba,0x00,0x01,0x01,0x32,0x00,0x03,0x01,0xa8,0x01,0xae,0x01,0xb4,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x02,\r\n0x01,0xa6,0x01,0xac,0x00,0x01,0x01,0x18,0x00,0x01,0x01,0x1e,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x01,0x90,0x01,0x84,0x01,0x96,0x00,0x01,0x01,0x02,0x00,0x01,0x01,0x08,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x03,0x01,0x6c,0x01,0x78,0x01,0x7e,0x00,0x01,0x00,0xea,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0x00,\r\n0x00,0x76,0x00,0x03,0x00,0x03,0x00,0x9e,0x01,0x60,0x01,0x66,0x00,0x01,0x00,0xd2,0x00,0x01,0x00,0xd8,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x86,0x00,0x86,0x01,0x48,0x01,0x4e,0x00,0x01,0x00,0xba,0x00,0x01,0x00,0xc0,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x6c,0x01,0x2e,0x01,0x22,0x01,0x34,\r\n0x00,0x01,0x00,0xa0,0x00,0x01,0x00,0xa6,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x52,0x00,0x52,0x01,0x14,0x01,0x08,0x01,0x1a,0x00,0x01,0x00,0x86,0x00,0x01,0x00,0x8c,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x04,0x00,0x36,0x00,0xec,0x00,0xf8,0x00,0xfe,0x00,0x01,0x00,0x6a,0x00,0x01,0x00,0x70,0x00,0x01,\r\n0x00,0x00,0x00,0x76,0x00,0x03,0x00,0x05,0x00,0x1c,0x00,0x1c,0x00,0xd2,0x00,0xde,0x00,0xe4,0x00,0x01,0x00,0x50,0x00,0x01,0x00,0x56,0x00,0x01,0x00,0x00,0x00,0x76,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,\r\n0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0x74,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,0x00,0x06,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x68,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1f,0x0b,0x97,0x0b,0x9a,0x00,0x2d,0x0b,0x9d,0x0b,0xb7,0x00,0x31,0x12,0x5f,0x12,0x62,\r\n0x00,0x4c,0x00,0x01,0x00,0x02,0x0b,0x5e,0x0b,0x61,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,\r\n0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0x5e,0x00,0x01,0x00,0x01,0x0b,0xde,0x00,0x01,0x00,0x01,0x0b,0x64,0x00,0x01,0x00,0x01,0x0b,0x81,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0xd8,0x00,0x01,0x00,0x01,0x0b,0xd0,0x00,0x01,0x00,0x16,\r\n0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x8c,0x00,0x04,0x08,0xc4,0x0b,0x71,0x0b,0x5a,0x00,0x01,0x00,0x01,0x0b,0x71,0x00,0x01,0x00,0x2a,0x00,0x03,0x00,0x0c,0x00,0x16,0x00,0x20,0x00,0x01,0x00,0x04,0x12,0x59,0x00,0x02,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5a,0x00,0x02,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5b,0x00,0x02,\r\n0x0b,0x5f,0x00,0x02,0x00,0x01,0x0b,0x54,0x0b,0x56,0x00,0x00,0x00,0x01,0x00,0x30,0x00,0x03,0x00,0x0c,0x00,0x18,0x00,0x24,0x00,0x01,0x00,0x04,0x12,0x59,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5a,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x01,0x00,0x04,0x12,0x5b,0x00,0x03,0x08,0xc4,0x0b,0x5f,0x00,0x02,0x00,0x01,\r\n0x0b,0x54,0x0b,0x56,0x00,0x00,0x00,0x01,0x01,0xaa,0x00,0x01,0x00,0x08,0x00,0x34,0x00,0x6a,0x00,0x70,0x00,0x76,0x00,0x7c,0x00,0x82,0x00,0x88,0x00,0x8e,0x00,0x94,0x00,0x9a,0x00,0xa0,0x00,0xa6,0x00,0xac,0x00,0xb2,0x00,0xb8,0x00,0xbe,0x00,0xc4,0x00,0xca,0x00,0xd0,0x00,0xd6,0x00,0xdc,0x00,0xe2,0x00,0xe8,0x00,0xee,0x00,0xf4,\r\n0x00,0xfa,0x01,0x00,0x01,0x06,0x01,0x0c,0x01,0x12,0x01,0x18,0x01,0x1e,0x01,0x24,0x01,0x2a,0x01,0x30,0x01,0x36,0x01,0x3c,0x01,0x42,0x01,0x48,0x01,0x4e,0x01,0x54,0x01,0x5a,0x01,0x60,0x01,0x66,0x01,0x6c,0x01,0x72,0x01,0x78,0x01,0x7e,0x01,0x84,0x01,0x8a,0x01,0x90,0x01,0x96,0x01,0x9c,0x0b,0x53,0x00,0x02,0x0b,0x53,0x0b,0x54,\r\n0x00,0x02,0x0b,0x54,0x0b,0x55,0x00,0x02,0x0b,0x55,0x0b,0x56,0x00,0x02,0x0b,0x56,0x0b,0x57,0x00,0x02,0x0b,0x57,0x0b,0x58,0x00,0x02,0x0b,0x58,0x0b,0x59,0x00,0x02,0x0b,0x59,0x0b,0x5a,0x00,0x02,0x0b,0x5a,0x0b,0x5b,0x00,0x02,0x0b,0x5b,0x0b,0x5c,0x00,0x02,0x0b,0x5c,0x0b,0x5d,0x00,0x02,0x0b,0x5d,0x0b,0x5e,0x00,0x02,0x0b,0x5e,\r\n0x0b,0x5f,0x00,0x02,0x0b,0x5f,0x0b,0x61,0x00,0x02,0x0b,0x61,0x0b,0x66,0x00,0x02,0x0b,0x66,0x0b,0x67,0x00,0x02,0x0b,0x67,0x0b,0xb9,0x00,0x02,0x0b,0xb9,0x0b,0xbf,0x00,0x02,0x0b,0xbf,0x0b,0xc0,0x00,0x02,0x0b,0xc0,0x0b,0xc1,0x00,0x02,0x0b,0xc1,0x0b,0xc2,0x00,0x02,0x0b,0xc2,0x0b,0xc3,0x00,0x02,0x0b,0xc3,0x0b,0xc4,0x00,0x02,\r\n0x0b,0xc4,0x0b,0xc5,0x00,0x02,0x0b,0xc5,0x0b,0xc6,0x00,0x02,0x0b,0xc6,0x0b,0xc7,0x00,0x02,0x0b,0xc7,0x0b,0xc8,0x00,0x02,0x0b,0xc8,0x0b,0xc9,0x00,0x02,0x0b,0xc9,0x0b,0xca,0x00,0x02,0x0b,0xca,0x0b,0xcb,0x00,0x02,0x0b,0xcb,0x0b,0xcc,0x00,0x02,0x0b,0xcc,0x0b,0xcd,0x00,0x02,0x0b,0xcd,0x0b,0xce,0x00,0x02,0x0b,0xce,0x0b,0xcf,\r\n0x00,0x02,0x0b,0xcf,0x0b,0xd0,0x00,0x02,0x0b,0xd0,0x0b,0xd1,0x00,0x02,0x0b,0xd1,0x0b,0xd2,0x00,0x02,0x0b,0xd2,0x0b,0xd3,0x00,0x02,0x0b,0xd3,0x0b,0xd4,0x00,0x02,0x0b,0xd4,0x0b,0xd5,0x00,0x02,0x0b,0xd5,0x0b,0xd6,0x00,0x02,0x0b,0xd6,0x0b,0xd7,0x00,0x02,0x0b,0xd7,0x0b,0xd8,0x00,0x02,0x0b,0xd8,0x0b,0xd9,0x00,0x02,0x0b,0xd9,\r\n0x0b,0xda,0x00,0x02,0x0b,0xda,0x0b,0xdb,0x00,0x02,0x0b,0xdb,0x0b,0xdc,0x00,0x02,0x0b,0xdc,0x0b,0xdd,0x00,0x02,0x0b,0xdd,0x0b,0xe1,0x00,0x02,0x0b,0xe1,0x12,0x5c,0x00,0x02,0x12,0x5c,0x12,0x5d,0x00,0x02,0x12,0x5d,0x12,0x5e,0x00,0x02,0x12,0x5e,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x12,0x00,0x01,\r\n0x00,0x18,0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x02,0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x1a,\r\n0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xdf,0x00,0x02,0x07,0x39,0x0b,0xdf,0x00,0x02,0x08,0xc4,0x00,0x01,0x00,0x01,0x0b,0x78,0x00,0x01,0x0e,0x76,0x00,0x84,0x01,0x0e,0x01,0x28,0x01,0x42,0x01,0x5c,0x01,0x76,0x01,0x90,0x01,0xaa,0x01,0xc4,0x01,0xde,0x01,0xf8,0x02,0x12,0x02,0x2c,0x02,0x46,0x02,0x60,0x02,0x7a,\r\n0x02,0x94,0x02,0xae,0x02,0xc8,0x02,0xe2,0x02,0xfc,0x03,0x16,0x03,0x30,0x03,0x4a,0x03,0x64,0x03,0x7e,0x03,0x98,0x03,0xb2,0x03,0xcc,0x03,0xe6,0x04,0x00,0x04,0x1a,0x04,0x34,0x04,0x4e,0x04,0x68,0x04,0x82,0x04,0x9c,0x04,0xb6,0x04,0xd0,0x04,0xea,0x05,0x04,0x05,0x1e,0x05,0x38,0x05,0x52,0x05,0x6c,0x05,0x86,0x05,0xa0,0x05,0xba,\r\n0x05,0xd4,0x05,0xee,0x06,0x08,0x06,0x22,0x06,0x3c,0x06,0x56,0x06,0x70,0x06,0x8a,0x06,0xa4,0x06,0xbe,0x06,0xd8,0x06,0xf2,0x07,0x0c,0x07,0x26,0x07,0x40,0x07,0x5a,0x07,0x74,0x07,0x8e,0x07,0xa8,0x07,0xc2,0x07,0xdc,0x07,0xf6,0x08,0x10,0x08,0x2a,0x08,0x44,0x08,0x5e,0x08,0x78,0x08,0x92,0x08,0xac,0x08,0xc6,0x08,0xe0,0x08,0xfa,\r\n0x09,0x14,0x09,0x2e,0x09,0x48,0x09,0x62,0x09,0x7c,0x09,0x96,0x09,0xb0,0x09,0xca,0x09,0xe4,0x09,0xfe,0x0a,0x18,0x0a,0x32,0x0a,0x4c,0x0a,0x66,0x0a,0x80,0x0a,0x9a,0x0a,0xb4,0x0a,0xce,0x0a,0xe8,0x0b,0x02,0x0b,0x1c,0x0b,0x36,0x0b,0x50,0x0b,0x6a,0x0b,0x84,0x0b,0x9e,0x0b,0xb8,0x0b,0xd2,0x0b,0xec,0x0c,0x06,0x0c,0x20,0x0c,0x3a,\r\n0x0c,0x54,0x0c,0x6e,0x0c,0x88,0x0c,0xa2,0x0c,0xbc,0x0c,0xd6,0x0c,0xf0,0x0d,0x0a,0x0d,0x24,0x0d,0x3e,0x0d,0x58,0x0d,0x72,0x0d,0x8c,0x0d,0xa6,0x0d,0xc0,0x0d,0xda,0x0d,0xf4,0x0e,0x0e,0x0e,0x28,0x0e,0x42,0x0e,0x5c,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0a,0x43,0x00,0x02,0x07,0x39,0x0a,0x43,0x00,0x02,0x08,0xc4,0x0a,0x43,\r\n0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x53,0x00,0x02,0x07,0x39,0x0b,0x53,0x00,0x02,0x08,0xc4,0x0b,0x53,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x54,0x00,0x02,0x07,0x39,0x0b,0x54,0x00,0x02,0x08,0xc4,0x0b,0x54,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,\r\n0x0b,0x55,0x00,0x02,0x07,0x39,0x0b,0x55,0x00,0x02,0x08,0xc4,0x0b,0x55,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x56,0x00,0x02,0x07,0x39,0x0b,0x56,0x00,0x02,0x08,0xc4,0x0b,0x56,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x57,0x00,0x02,0x07,0x39,0x0b,0x57,0x00,0x02,0x08,0xc4,\r\n0x0b,0x57,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x58,0x00,0x02,0x07,0x39,0x0b,0x58,0x00,0x02,0x08,0xc4,0x0b,0x58,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x59,0x00,0x02,0x07,0x39,0x0b,0x59,0x00,0x02,0x08,0xc4,0x0b,0x59,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,\r\n0x00,0x14,0x0b,0x5a,0x00,0x02,0x07,0x39,0x0b,0x5a,0x00,0x02,0x08,0xc4,0x0b,0x5a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5b,0x00,0x02,0x07,0x39,0x0b,0x5b,0x00,0x02,0x08,0xc4,0x0b,0x5b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5c,0x00,0x02,0x07,0x39,0x0b,0x5c,0x00,0x02,\r\n0x08,0xc4,0x0b,0x5c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5d,0x00,0x02,0x07,0x39,0x0b,0x5d,0x00,0x02,0x08,0xc4,0x0b,0x5d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x5e,0x00,0x02,0x07,0x39,0x0b,0x5e,0x00,0x02,0x08,0xc4,0x0b,0x5e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,\r\n0x00,0x0e,0x00,0x14,0x0b,0x5f,0x00,0x02,0x07,0x39,0x0b,0x5f,0x00,0x02,0x08,0xc4,0x0b,0x5f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x61,0x00,0x02,0x07,0x39,0x0b,0x61,0x00,0x02,0x08,0xc4,0x0b,0x61,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x66,0x00,0x02,0x07,0x39,0x0b,0x66,\r\n0x00,0x02,0x08,0xc4,0x0b,0x66,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x67,0x00,0x02,0x07,0x39,0x0b,0x67,0x00,0x02,0x08,0xc4,0x0b,0x67,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x68,0x00,0x02,0x07,0x39,0x0b,0x68,0x00,0x02,0x08,0xc4,0x0b,0x68,0x00,0x02,0x08,0xc3,0x00,0x03,\r\n0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x69,0x00,0x02,0x07,0x39,0x0b,0x69,0x00,0x02,0x08,0xc4,0x0b,0x69,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6a,0x00,0x02,0x07,0x39,0x0b,0x6a,0x00,0x02,0x08,0xc4,0x0b,0x6a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6b,0x00,0x02,0x07,0x39,\r\n0x0b,0x6b,0x00,0x02,0x08,0xc4,0x0b,0x6b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6c,0x00,0x02,0x07,0x39,0x0b,0x6c,0x00,0x02,0x08,0xc4,0x0b,0x6c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6d,0x00,0x02,0x07,0x39,0x0b,0x6d,0x00,0x02,0x08,0xc4,0x0b,0x6d,0x00,0x02,0x08,0xc3,\r\n0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6e,0x00,0x02,0x07,0x39,0x0b,0x6e,0x00,0x02,0x08,0xc4,0x0b,0x6e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x6f,0x00,0x02,0x07,0x39,0x0b,0x6f,0x00,0x02,0x08,0xc4,0x0b,0x6f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x70,0x00,0x02,\r\n0x07,0x39,0x0b,0x70,0x00,0x02,0x08,0xc4,0x0b,0x70,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x71,0x00,0x02,0x07,0x39,0x0b,0x71,0x00,0x02,0x08,0xc4,0x0b,0x71,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x72,0x00,0x02,0x07,0x39,0x0b,0x72,0x00,0x02,0x08,0xc4,0x0b,0x72,0x00,0x02,\r\n0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x73,0x00,0x02,0x07,0x39,0x0b,0x73,0x00,0x02,0x08,0xc4,0x0b,0x73,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x74,0x00,0x02,0x07,0x39,0x0b,0x74,0x00,0x02,0x08,0xc4,0x0b,0x74,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x75,\r\n0x00,0x02,0x07,0x39,0x0b,0x75,0x00,0x02,0x08,0xc4,0x0b,0x75,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x76,0x00,0x02,0x07,0x39,0x0b,0x76,0x00,0x02,0x08,0xc4,0x0b,0x76,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x77,0x00,0x02,0x07,0x39,0x0b,0x77,0x00,0x02,0x08,0xc4,0x0b,0x77,\r\n0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x78,0x00,0x02,0x07,0x39,0x0b,0x78,0x00,0x02,0x08,0xc4,0x0b,0x78,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x79,0x00,0x02,0x07,0x39,0x0b,0x79,0x00,0x02,0x08,0xc4,0x0b,0x79,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,\r\n0x0b,0x7a,0x00,0x02,0x07,0x39,0x0b,0x7a,0x00,0x02,0x08,0xc4,0x0b,0x7a,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7b,0x00,0x02,0x07,0x39,0x0b,0x7b,0x00,0x02,0x08,0xc4,0x0b,0x7b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7c,0x00,0x02,0x07,0x39,0x0b,0x7c,0x00,0x02,0x08,0xc4,\r\n0x0b,0x7c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7d,0x00,0x02,0x07,0x39,0x0b,0x7d,0x00,0x02,0x08,0xc4,0x0b,0x7d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x7e,0x00,0x02,0x07,0x39,0x0b,0x7e,0x00,0x02,0x08,0xc4,0x0b,0x7e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,\r\n0x00,0x14,0x0b,0x7f,0x00,0x02,0x07,0x39,0x0b,0x7f,0x00,0x02,0x08,0xc4,0x0b,0x7f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x80,0x00,0x02,0x07,0x39,0x0b,0x80,0x00,0x02,0x08,0xc4,0x0b,0x80,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x81,0x00,0x02,0x07,0x39,0x0b,0x81,0x00,0x02,\r\n0x08,0xc4,0x0b,0x81,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x82,0x00,0x02,0x07,0x39,0x0b,0x82,0x00,0x02,0x08,0xc4,0x0b,0x82,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x83,0x00,0x02,0x07,0x39,0x0b,0x83,0x00,0x02,0x08,0xc4,0x0b,0x83,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,\r\n0x00,0x0e,0x00,0x14,0x0b,0x84,0x00,0x02,0x07,0x39,0x0b,0x84,0x00,0x02,0x08,0xc4,0x0b,0x84,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x85,0x00,0x02,0x07,0x39,0x0b,0x85,0x00,0x02,0x08,0xc4,0x0b,0x85,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x88,0x00,0x02,0x07,0x39,0x0b,0x88,\r\n0x00,0x02,0x08,0xc4,0x0b,0x88,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x89,0x00,0x02,0x07,0x39,0x0b,0x89,0x00,0x02,0x08,0xc4,0x0b,0x89,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8a,0x00,0x02,0x07,0x39,0x0b,0x8a,0x00,0x02,0x08,0xc4,0x0b,0x8a,0x00,0x02,0x08,0xc3,0x00,0x03,\r\n0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8b,0x00,0x02,0x07,0x39,0x0b,0x8b,0x00,0x02,0x08,0xc4,0x0b,0x8b,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8c,0x00,0x02,0x07,0x39,0x0b,0x8c,0x00,0x02,0x08,0xc4,0x0b,0x8c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8d,0x00,0x02,0x07,0x39,\r\n0x0b,0x8d,0x00,0x02,0x08,0xc4,0x0b,0x8d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8e,0x00,0x02,0x07,0x39,0x0b,0x8e,0x00,0x02,0x08,0xc4,0x0b,0x8e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x8f,0x00,0x02,0x07,0x39,0x0b,0x8f,0x00,0x02,0x08,0xc4,0x0b,0x8f,0x00,0x02,0x08,0xc3,\r\n0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x90,0x00,0x02,0x07,0x39,0x0b,0x90,0x00,0x02,0x08,0xc4,0x0b,0x90,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x91,0x00,0x02,0x07,0x39,0x0b,0x91,0x00,0x02,0x08,0xc4,0x0b,0x91,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x92,0x00,0x02,\r\n0x07,0x39,0x0b,0x92,0x00,0x02,0x08,0xc4,0x0b,0x92,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x93,0x00,0x02,0x07,0x39,0x0b,0x93,0x00,0x02,0x08,0xc4,0x0b,0x93,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x94,0x00,0x02,0x07,0x39,0x0b,0x94,0x00,0x02,0x08,0xc4,0x0b,0x94,0x00,0x02,\r\n0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x95,0x00,0x02,0x07,0x39,0x0b,0x95,0x00,0x02,0x08,0xc4,0x0b,0x95,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x97,0x00,0x02,0x07,0x39,0x0b,0x97,0x00,0x02,0x08,0xc4,0x0b,0x97,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x98,\r\n0x00,0x02,0x07,0x39,0x0b,0x98,0x00,0x02,0x08,0xc4,0x0b,0x98,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x99,0x00,0x02,0x07,0x39,0x0b,0x99,0x00,0x02,0x08,0xc4,0x0b,0x99,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9a,0x00,0x02,0x07,0x39,0x0b,0x9a,0x00,0x02,0x08,0xc4,0x0b,0x9a,\r\n0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9d,0x00,0x02,0x07,0x39,0x0b,0x9d,0x00,0x02,0x08,0xc4,0x0b,0x9d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0x9e,0x00,0x02,0x07,0x39,0x0b,0x9e,0x00,0x02,0x08,0xc4,0x0b,0x9e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,\r\n0x0b,0x9f,0x00,0x02,0x07,0x39,0x0b,0x9f,0x00,0x02,0x08,0xc4,0x0b,0x9f,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa0,0x00,0x02,0x07,0x39,0x0b,0xa0,0x00,0x02,0x08,0xc4,0x0b,0xa0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa1,0x00,0x02,0x07,0x39,0x0b,0xa1,0x00,0x02,0x08,0xc4,\r\n0x0b,0xa1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa2,0x00,0x02,0x07,0x39,0x0b,0xa2,0x00,0x02,0x08,0xc4,0x0b,0xa2,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa3,0x00,0x02,0x07,0x39,0x0b,0xa3,0x00,0x02,0x08,0xc4,0x0b,0xa3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,\r\n0x00,0x14,0x0b,0xa4,0x00,0x02,0x07,0x39,0x0b,0xa4,0x00,0x02,0x08,0xc4,0x0b,0xa4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa5,0x00,0x02,0x07,0x39,0x0b,0xa5,0x00,0x02,0x08,0xc4,0x0b,0xa5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa6,0x00,0x02,0x07,0x39,0x0b,0xa6,0x00,0x02,\r\n0x08,0xc4,0x0b,0xa6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa7,0x00,0x02,0x07,0x39,0x0b,0xa7,0x00,0x02,0x08,0xc4,0x0b,0xa7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xa8,0x00,0x02,0x07,0x39,0x0b,0xa8,0x00,0x02,0x08,0xc4,0x0b,0xa8,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,\r\n0x00,0x0e,0x00,0x14,0x0b,0xa9,0x00,0x02,0x07,0x39,0x0b,0xa9,0x00,0x02,0x08,0xc4,0x0b,0xa9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xaa,0x00,0x02,0x07,0x39,0x0b,0xaa,0x00,0x02,0x08,0xc4,0x0b,0xaa,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xab,0x00,0x02,0x07,0x39,0x0b,0xab,\r\n0x00,0x02,0x08,0xc4,0x0b,0xab,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xac,0x00,0x02,0x07,0x39,0x0b,0xac,0x00,0x02,0x08,0xc4,0x0b,0xac,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xad,0x00,0x02,0x07,0x39,0x0b,0xad,0x00,0x02,0x08,0xc4,0x0b,0xad,0x00,0x02,0x08,0xc3,0x00,0x03,\r\n0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xae,0x00,0x02,0x07,0x39,0x0b,0xae,0x00,0x02,0x08,0xc4,0x0b,0xae,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xaf,0x00,0x02,0x07,0x39,0x0b,0xaf,0x00,0x02,0x08,0xc4,0x0b,0xaf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb0,0x00,0x02,0x07,0x39,\r\n0x0b,0xb0,0x00,0x02,0x08,0xc4,0x0b,0xb0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb1,0x00,0x02,0x07,0x39,0x0b,0xb1,0x00,0x02,0x08,0xc4,0x0b,0xb1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb2,0x00,0x02,0x07,0x39,0x0b,0xb2,0x00,0x02,0x08,0xc4,0x0b,0xb2,0x00,0x02,0x08,0xc3,\r\n0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb3,0x00,0x02,0x07,0x39,0x0b,0xb3,0x00,0x02,0x08,0xc4,0x0b,0xb3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb4,0x00,0x02,0x07,0x39,0x0b,0xb4,0x00,0x02,0x08,0xc4,0x0b,0xb4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb5,0x00,0x02,\r\n0x07,0x39,0x0b,0xb5,0x00,0x02,0x08,0xc4,0x0b,0xb5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb6,0x00,0x02,0x07,0x39,0x0b,0xb6,0x00,0x02,0x08,0xc4,0x0b,0xb6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb7,0x00,0x02,0x07,0x39,0x0b,0xb7,0x00,0x02,0x08,0xc4,0x0b,0xb7,0x00,0x02,\r\n0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xb9,0x00,0x02,0x07,0x39,0x0b,0xb9,0x00,0x02,0x08,0xc4,0x0b,0xb9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xbf,0x00,0x02,0x07,0x39,0x0b,0xbf,0x00,0x02,0x08,0xc4,0x0b,0xbf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc0,\r\n0x00,0x02,0x07,0x39,0x0b,0xc0,0x00,0x02,0x08,0xc4,0x0b,0xc0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc1,0x00,0x02,0x07,0x39,0x0b,0xc1,0x00,0x02,0x08,0xc4,0x0b,0xc1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc2,0x00,0x02,0x07,0x39,0x0b,0xc2,0x00,0x02,0x08,0xc4,0x0b,0xc2,\r\n0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc3,0x00,0x02,0x07,0x39,0x0b,0xc3,0x00,0x02,0x08,0xc4,0x0b,0xc3,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc4,0x00,0x02,0x07,0x39,0x0b,0xc4,0x00,0x02,0x08,0xc4,0x0b,0xc4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,\r\n0x0b,0xc5,0x00,0x02,0x07,0x39,0x0b,0xc5,0x00,0x02,0x08,0xc4,0x0b,0xc5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc6,0x00,0x02,0x07,0x39,0x0b,0xc6,0x00,0x02,0x08,0xc4,0x0b,0xc6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc7,0x00,0x02,0x07,0x39,0x0b,0xc7,0x00,0x02,0x08,0xc4,\r\n0x0b,0xc7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc8,0x00,0x02,0x07,0x39,0x0b,0xc8,0x00,0x02,0x08,0xc4,0x0b,0xc8,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xc9,0x00,0x02,0x07,0x39,0x0b,0xc9,0x00,0x02,0x08,0xc4,0x0b,0xc9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,\r\n0x00,0x14,0x0b,0xca,0x00,0x02,0x07,0x39,0x0b,0xca,0x00,0x02,0x08,0xc4,0x0b,0xca,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcb,0x00,0x02,0x07,0x39,0x0b,0xcb,0x00,0x02,0x08,0xc4,0x0b,0xcb,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcc,0x00,0x02,0x07,0x39,0x0b,0xcc,0x00,0x02,\r\n0x08,0xc4,0x0b,0xcc,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xcd,0x00,0x02,0x07,0x39,0x0b,0xcd,0x00,0x02,0x08,0xc4,0x0b,0xcd,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xce,0x00,0x02,0x07,0x39,0x0b,0xce,0x00,0x02,0x08,0xc4,0x0b,0xce,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,\r\n0x00,0x0e,0x00,0x14,0x0b,0xcf,0x00,0x02,0x07,0x39,0x0b,0xcf,0x00,0x02,0x08,0xc4,0x0b,0xcf,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd0,0x00,0x02,0x07,0x39,0x0b,0xd0,0x00,0x02,0x08,0xc4,0x0b,0xd0,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd1,0x00,0x02,0x07,0x39,0x0b,0xd1,\r\n0x00,0x02,0x08,0xc4,0x0b,0xd1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd2,0x00,0x02,0x07,0x39,0x0b,0xd2,0x00,0x02,0x08,0xc4,0x0b,0xd2,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd3,0x00,0x02,0x07,0x39,0x0b,0xd3,0x00,0x02,0x08,0xc4,0x0b,0xd3,0x00,0x02,0x08,0xc3,0x00,0x03,\r\n0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd4,0x00,0x02,0x07,0x39,0x0b,0xd4,0x00,0x02,0x08,0xc4,0x0b,0xd4,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd5,0x00,0x02,0x07,0x39,0x0b,0xd5,0x00,0x02,0x08,0xc4,0x0b,0xd5,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd6,0x00,0x02,0x07,0x39,\r\n0x0b,0xd6,0x00,0x02,0x08,0xc4,0x0b,0xd6,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd7,0x00,0x02,0x07,0x39,0x0b,0xd7,0x00,0x02,0x08,0xc4,0x0b,0xd7,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd8,0x00,0x02,0x07,0x39,0x0b,0xd8,0x00,0x02,0x08,0xc4,0x0b,0xd8,0x00,0x02,0x08,0xc3,\r\n0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xd9,0x00,0x02,0x07,0x39,0x0b,0xd9,0x00,0x02,0x08,0xc4,0x0b,0xd9,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xda,0x00,0x02,0x07,0x39,0x0b,0xda,0x00,0x02,0x08,0xc4,0x0b,0xda,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdb,0x00,0x02,\r\n0x07,0x39,0x0b,0xdb,0x00,0x02,0x08,0xc4,0x0b,0xdb,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdc,0x00,0x02,0x07,0x39,0x0b,0xdc,0x00,0x02,0x08,0xc4,0x0b,0xdc,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xdd,0x00,0x02,0x07,0x39,0x0b,0xdd,0x00,0x02,0x08,0xc4,0x0b,0xdd,0x00,0x02,\r\n0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x0b,0xe1,0x00,0x02,0x07,0x39,0x0b,0xe1,0x00,0x02,0x08,0xc4,0x0b,0xe1,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5c,0x00,0x02,0x07,0x39,0x12,0x5c,0x00,0x02,0x08,0xc4,0x12,0x5c,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5d,\r\n0x00,0x02,0x07,0x39,0x12,0x5d,0x00,0x02,0x08,0xc4,0x12,0x5d,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5e,0x00,0x02,0x07,0x39,0x12,0x5e,0x00,0x02,0x08,0xc4,0x12,0x5e,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x5f,0x00,0x02,0x07,0x39,0x12,0x5f,0x00,0x02,0x08,0xc4,0x12,0x5f,\r\n0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x60,0x00,0x02,0x07,0x39,0x12,0x60,0x00,0x02,0x08,0xc4,0x12,0x60,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,0x12,0x61,0x00,0x02,0x07,0x39,0x12,0x61,0x00,0x02,0x08,0xc4,0x12,0x61,0x00,0x02,0x08,0xc3,0x00,0x03,0x00,0x08,0x00,0x0e,0x00,0x14,\r\n0x12,0x62,0x00,0x02,0x07,0x39,0x12,0x62,0x00,0x02,0x08,0xc4,0x12,0x62,0x00,0x02,0x08,0xc3,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,\r\n0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x01,0x00,0xa2,0x00,0x0d,0x00,0x20,0x00,0x2a,0x00,0x34,0x00,0x3e,0x00,0x48,0x00,0x52,0x00,0x5c,0x00,0x66,0x00,0x70,0x00,0x7a,0x00,0x84,0x00,0x8e,0x00,0x98,0x00,0x01,0x00,0x04,0x0b,0x53,0x00,0x02,\r\n0x0b,0x53,0x00,0x01,0x00,0x04,0x0b,0x54,0x00,0x02,0x0b,0x54,0x00,0x01,0x00,0x04,0x0b,0x55,0x00,0x02,0x0b,0x55,0x00,0x01,0x00,0x04,0x0b,0x56,0x00,0x02,0x0b,0x56,0x00,0x01,0x00,0x04,0x0b,0x57,0x00,0x02,0x0b,0x57,0x00,0x01,0x00,0x04,0x0b,0x58,0x00,0x02,0x0b,0x58,0x00,0x01,0x00,0x04,0x0b,0x59,0x00,0x02,0x0b,0x59,0x00,0x01,\r\n0x00,0x04,0x0b,0x5a,0x00,0x02,0x0b,0x5a,0x00,0x01,0x00,0x04,0x0b,0x5b,0x00,0x02,0x0b,0x5b,0x00,0x01,0x00,0x04,0x0b,0x5c,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x04,0x0b,0x5d,0x00,0x02,0x0b,0x5d,0x00,0x01,0x00,0x04,0x0b,0xb9,0x00,0x02,0x0b,0xb9,0x00,0x01,0x00,0x04,0x0b,0xde,0x00,0x02,0x0b,0xde,0x00,0x02,0x00,0x03,0x0b,0x53,\r\n0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x0b,0xde,0x0b,0xde,0x00,0x0c,0x00,0x01,0x01,0x5a,0x00,0x16,0x00,0x32,0x00,0x3c,0x00,0x4e,0x00,0x60,0x00,0x72,0x00,0x84,0x00,0x8e,0x00,0x98,0x00,0xa2,0x00,0xac,0x00,0xb6,0x00,0xc8,0x00,0xd2,0x00,0xdc,0x00,0xe6,0x00,0xf0,0x00,0xfa,0x01,0x0c,0x01,0x16,0x01,0x20,0x01,0x2a,\r\n0x01,0x48,0x00,0x01,0x00,0x04,0x0b,0x9d,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x9e,0x00,0x02,0x0b,0x5e,0x0b,0xb4,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x9f,0x00,0x02,0x0b,0x5e,0x12,0x5f,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa0,0x00,0x02,0x0b,0x5e,0x12,0x60,0x00,0x02,\r\n0x0b,0x61,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa1,0x00,0x02,0x0b,0x5e,0x12,0x61,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xa2,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa3,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa4,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa5,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,\r\n0x0b,0xa6,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xa7,0x00,0x02,0x0b,0x5e,0x0b,0xb5,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xa8,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xa9,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xaa,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xab,0x00,0x02,0x0b,0x5e,\r\n0x00,0x01,0x00,0x04,0x0b,0xac,0x00,0x02,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xad,0x00,0x02,0x0b,0x5e,0x0b,0xb6,0x00,0x02,0x0b,0x61,0x00,0x01,0x00,0x04,0x0b,0xae,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xaf,0x00,0x02,0x0b,0x5e,0x00,0x01,0x00,0x04,0x0b,0xb0,0x00,0x02,0x0b,0x5e,0x00,0x03,0x00,0x08,0x00,0x0e,\r\n0x00,0x16,0x0b,0xb1,0x00,0x02,0x0b,0x5e,0x0b,0x99,0x00,0x03,0x0b,0x63,0x0b,0x5e,0x0b,0x9a,0x00,0x03,0x0b,0x64,0x0b,0x5e,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0xb2,0x00,0x02,0x0b,0x5e,0x12,0x62,0x00,0x02,0x0b,0x61,0x00,0x02,0x00,0x06,0x0b,0x68,0x0b,0x6e,0x00,0x00,0x0b,0x70,0x0b,0x74,0x00,0x07,0x0b,0x76,0x0b,0x76,0x00,0x0c,\r\n0x0b,0x78,0x0b,0x79,0x00,0x0d,0x0b,0x7b,0x0b,0x7c,0x00,0x0f,0x0b,0x7e,0x0b,0x82,0x00,0x11,0x00,0x01,0x00,0x2e,0x00,0x02,0x00,0x0a,0x00,0x1c,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x97,0x00,0x02,0x0b,0x63,0x0b,0x98,0x00,0x02,0x0b,0x64,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x99,0x00,0x02,0x0b,0x63,0x0b,0x9a,0x00,0x02,0x0b,0x64,\r\n0x00,0x01,0x00,0x02,0x0b,0x81,0x0b,0xb1,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0xb3,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0x5c,0x00,0x01,0x00,0x01,0x0b,0xde,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x38,0x02,0x40,0x00,0x01,0x02,0x46,0x00,0x01,0x00,0x00,\r\n0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x24,0x02,0x2c,0x00,0x02,0x02,0x6c,0x02,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x02,0x0e,0x02,0x16,0x00,0x03,0x02,0x56,0x02,0x56,0x02,0x1c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xf6,0x01,0xfe,0x00,0x04,0x02,0x3e,0x02,0x3e,\r\n0x02,0x3e,0x02,0x04,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xdc,0x01,0xe4,0x00,0x02,0x02,0x46,0x02,0x4c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xc6,0x01,0xce,0x00,0x03,0x02,0x0e,0x02,0x30,0x02,0x36,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0xae,\r\n0x01,0xb6,0x00,0x04,0x01,0xf6,0x01,0xf6,0x02,0x18,0x02,0x1e,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x94,0x01,0x9c,0x00,0x05,0x01,0xdc,0x01,0xdc,0x01,0xdc,0x01,0xfe,0x02,0x04,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x78,0x01,0x80,0x00,0x01,0x01,0xf8,0x00,0x01,0x00,0x00,\r\n0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x64,0x01,0x6c,0x00,0x02,0x01,0xac,0x01,0xe4,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x4e,0x01,0x56,0x00,0x03,0x01,0x96,0x01,0x96,0x01,0xce,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x36,0x01,0x3e,0x00,0x04,0x01,0x7e,0x01,0x7e,\r\n0x01,0x7e,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x1c,0x01,0x24,0x00,0x02,0x01,0x86,0x01,0xa2,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x01,0x06,0x01,0x0e,0x00,0x02,0x01,0x70,0x01,0x92,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0xf8,\r\n0x00,0x03,0x01,0x38,0x01,0x5a,0x01,0x76,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xd8,0x00,0xe0,0x00,0x03,0x01,0x20,0x01,0x42,0x01,0x64,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xc0,0x00,0xc8,0x00,0x04,0x01,0x08,0x01,0x08,0x01,0x2a,0x01,0x46,0x00,0x01,0x00,0x00,0x00,0x78,\r\n0x00,0x03,0x00,0x00,0x00,0x02,0x00,0xa6,0x00,0xae,0x00,0x04,0x00,0xee,0x00,0xee,0x01,0x10,0x01,0x32,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x94,0x00,0x05,0x00,0xd4,0x00,0xd4,0x00,0xd4,0x00,0xf6,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x70,0x00,0x78,\r\n0x00,0x05,0x00,0xb8,0x00,0xb8,0x00,0xb8,0x00,0xda,0x00,0xfc,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x54,0x00,0x5c,0x00,0x01,0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x48,0x00,0x02,0x00,0xd8,0x00,0xd2,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,\r\n0x00,0x02,0x00,0x2a,0x00,0x32,0x00,0x01,0x00,0xf0,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x03,0x00,0x00,0x00,0x02,0x00,0x16,0x00,0x1e,0x00,0x02,0x00,0xae,0x00,0xdc,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x00,0x02,0x0b,0x74,0x0b,0xa8,0x00,0x01,0x00,0x01,0x0b,0x5c,0x00,0x02,0x00,0x09,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x69,\r\n0x0b,0x85,0x00,0x01,0x0b,0x88,0x0b,0x95,0x00,0x1e,0x0b,0x97,0x0b,0x9a,0x00,0x2c,0x0b,0x9d,0x0b,0xa6,0x00,0x30,0x0b,0xa8,0x0b,0xb2,0x00,0x3a,0x0b,0xb4,0x0b,0xb7,0x00,0x45,0x0b,0xe0,0x0b,0xe0,0x00,0x49,0x12,0x5f,0x12,0x62,0x00,0x4a,0x00,0x02,0x00,0x05,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,\r\n0x0b,0xdd,0x00,0x02,0x0b,0xe1,0x0b,0xe1,0x00,0x21,0x12,0x5c,0x12,0x5d,0x00,0x22,0x00,0x01,0x00,0x01,0x0b,0x68,0x00,0x02,0x00,0x02,0x0b,0x53,0x0b,0x5d,0x00,0x00,0x0b,0xb9,0x0b,0xb9,0x00,0x0b,0x00,0x01,0x00,0x01,0x0b,0x9d,0x00,0x01,0x00,0x01,0x0b,0xb3,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,\r\n0x00,0x07,0x0b,0x53,0x0b,0x5f,0x00,0x00,0x0b,0x61,0x0b,0x61,0x00,0x0d,0x0b,0x66,0x0b,0x67,0x00,0x0e,0x0b,0xb9,0x0b,0xb9,0x00,0x10,0x0b,0xbf,0x0b,0xdd,0x00,0x11,0x0b,0xe1,0x0b,0xe1,0x00,0x30,0x12,0x5c,0x12,0x5e,0x00,0x31,0x00,0x01,0x00,0x01,0x0b,0xdc,0x00,0x03,0x00,0x02,0x00,0x16,0x00,0x1c,0x00,0x02,0x00,0x22,0x00,0x28,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x79,0x00,0x01,0x00,0x01,0x0b,0x53,0x00,0x01,0x00,0x01,0x0b,0x7e,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x01,0x0b,0x57,0x00,0x01,0x00,0x1a,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x0c,0x0b,0x88,0x00,0x02,0x0b,0x53,0x0b,0x89,0x00,0x02,0x0b,0x5b,0x00,0x01,0x00,0x01,0x0b,0x72,\r\n0x00,0x03,0x00,0x02,0x01,0xcc,0x01,0xe8,0x00,0x01,0x01,0xee,0x00,0x02,0x02,0x1c,0x02,0x56,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0xb4,0x01,0xd0,0x00,0x01,0x01,0xd6,0x00,0x01,0x02,0x54,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x9e,0x02,0x66,0x00,0x01,0x01,0xc0,0x00,0x02,0x01,0xee,0x02,0x28,\r\n0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x86,0x02,0x4e,0x00,0x01,0x01,0xa8,0x00,0x01,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x70,0x02,0x3e,0x00,0x01,0x01,0x92,0x00,0x02,0x01,0xc0,0x01,0xfa,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x58,0x02,0x26,0x00,0x01,0x01,0x7a,\r\n0x00,0x01,0x01,0xf8,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x42,0x02,0x16,0x00,0x01,0x01,0x64,0x00,0x02,0x01,0x92,0x01,0xcc,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x2a,0x01,0xfe,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0xca,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x01,0x14,0x01,0xee,\r\n0x00,0x01,0x01,0x36,0x00,0x02,0x01,0x64,0x01,0x9e,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xfc,0x01,0xd6,0x00,0x01,0x01,0x1e,0x00,0x01,0x01,0x9c,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xe6,0x01,0xc6,0x00,0x01,0x01,0x08,0x00,0x02,0x01,0x36,0x01,0x70,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,\r\n0x00,0x02,0x00,0xce,0x01,0xae,0x00,0x01,0x00,0xf0,0x00,0x01,0x01,0x6e,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xb8,0x01,0x9e,0x00,0x01,0x00,0xda,0x00,0x02,0x01,0x08,0x01,0x42,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0xa0,0x01,0x86,0x00,0x01,0x00,0xc2,0x00,0x01,0x01,0x40,0x00,0x01,0x00,0x00,\r\n0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x8a,0x01,0x76,0x00,0x01,0x00,0xac,0x00,0x02,0x00,0xda,0x01,0x14,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x72,0x01,0x5e,0x00,0x01,0x00,0x94,0x00,0x01,0x01,0x12,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x5c,0x01,0x4e,0x00,0x01,0x00,0x7e,0x00,0x02,0x00,0xac,\r\n0x00,0xe6,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x44,0x01,0x36,0x00,0x01,0x00,0x66,0x00,0x01,0x00,0xe4,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x2e,0x01,0x26,0x00,0x01,0x00,0x50,0x00,0x02,0x00,0x7e,0x00,0xb8,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x03,0x00,0x02,0x00,0x16,0x01,0x0e,0x00,0x01,\r\n0x00,0x38,0x00,0x01,0x00,0xb6,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x02,0x00,0x04,0x0b,0x54,0x0b,0x56,0x00,0x00,0x0b,0x58,0x0b,0x5b,0x00,0x03,0x0b,0x5d,0x0b,0x5d,0x00,0x07,0x0b,0xb9,0x0b,0xb9,0x00,0x08,0x00,0x01,0x00,0x01,0x0b,0x6a,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,\r\n0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6b,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x02,0x0b,0x71,0x0b,0x71,0x00,0x04,0x0b,0x7d,0x0b,0x7d,0x00,0x05,0x0b,0x7f,0x0b,0x80,0x00,0x06,0x0b,0x9f,\r\n0x0b,0xa0,0x00,0x08,0x0b,0xa2,0x0b,0xa3,0x00,0x0a,0x0b,0xa5,0x0b,0xa5,0x00,0x0c,0x0b,0xaf,0x0b,0xb0,0x00,0x0d,0x00,0x02,0x00,0x03,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0xb9,0x0b,0xb9,0x00,0x0a,0x00,0x02,0x00,0x06,0x0b,0x72,0x0b,0x72,0x00,0x00,0x0b,0x77,0x0b,0x77,0x00,0x01,0x0b,0x7b,0x0b,0x7b,\r\n0x00,0x02,0x0b,0x88,0x0b,0x89,0x00,0x03,0x0b,0xa6,0x0b,0xa6,0x00,0x05,0x0b,0xac,0x0b,0xac,0x00,0x06,0x00,0x01,0x00,0x01,0x0b,0x9f,0x00,0x01,0x00,0x01,0x0b,0x6d,0x00,0x01,0x00,0x01,0x0b,0xa2,0x00,0x01,0x00,0x01,0x0b,0x71,0x00,0x01,0x00,0x01,0x0b,0xa5,0x00,0x01,0x00,0x01,0x0b,0x78,0x00,0x01,0x00,0x01,0x0b,0xaa,0x00,0x01,\r\n0x00,0x01,0x0b,0x6e,0x00,0x01,0x00,0x01,0x0b,0xa3,0x00,0x03,0x00,0x02,0x00,0x14,0x00,0x14,0x00,0x01,0x00,0x54,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,0x0b,0xb9,0x0b,0xb9,0x00,0x0c,\r\n0x0b,0xbf,0x0b,0xbf,0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x5a,0x0b,0x5a,0x00,0x01,0x0b,0x5f,0x0b,0x5f,0x00,0x02,0x0b,0x67,0x0b,0x67,0x00,0x03,0x0b,0xbf,0x0b,0xbf,0x00,0x04,\r\n0x0b,0xc4,0x0b,0xc4,0x00,0x05,0x0b,0xc9,0x0b,0xc9,0x00,0x06,0x0b,0xd0,0x0b,0xd5,0x00,0x07,0x0b,0xd8,0x0b,0xd8,0x00,0x0d,0x00,0x01,0x00,0x36,0x00,0x04,0x00,0x0e,0x00,0x16,0x00,0x26,0x00,0x2e,0x00,0x01,0x00,0x04,0x0b,0x67,0x00,0x01,0x00,0x02,0x00,0x06,0x00,0x0c,0x12,0x5d,0x00,0x02,0x04,0x67,0x12,0x5c,0x00,0x01,0x00,0x01,\r\n0x00,0x04,0x12,0x5d,0x00,0x01,0x00,0x01,0x00,0x04,0x12,0x5c,0x00,0x01,0x00,0x02,0x00,0x03,0x02,0x45,0x02,0x45,0x00,0x00,0x04,0x67,0x04,0x68,0x00,0x01,0x0b,0x66,0x0b,0x66,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xf6,0x00,0x04,0x01,0x3c,0x01,0x76,0x01,0x76,0x01,0xb6,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,\r\n0x00,0x01,0x00,0xde,0x00,0x04,0x01,0x24,0x01,0x5e,0x01,0x5e,0x01,0xa4,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xc6,0x00,0x03,0x01,0x0c,0x01,0x92,0x01,0x86,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0xb0,0x00,0x03,0x00,0xf6,0x01,0x7c,0x01,0x76,0x00,0x01,0x00,0x00,0x00,0x7c,\r\n0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x9a,0x00,0x03,0x00,0xe0,0x01,0x6c,0x01,0x5a,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x84,0x00,0x03,0x00,0xca,0x01,0x56,0x01,0x4a,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x03,0x00,0xb4,0x01,0x46,0x01,0x2e,0x00,0x01,0x00,0x00,\r\n0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x58,0x00,0x03,0x00,0x9e,0x01,0x30,0x01,0x1e,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x03,0x00,0x88,0x01,0x20,0x01,0x26,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x2c,0x00,0x03,0x00,0x72,0x01,0x0a,0x01,0x16,0x00,0x01,\r\n0x00,0x00,0x00,0x7c,0x00,0x03,0x00,0x00,0x00,0x01,0x00,0x16,0x00,0x03,0x00,0x5c,0x00,0xf4,0x01,0x06,0x00,0x01,0x00,0x00,0x00,0x7c,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,\r\n0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x02,0x00,0x09,0x0b,0x6a,0x0b,0x6a,0x00,0x00,0x0b,0x6d,0x0b,0x6e,0x00,0x01,0x0b,0x71,0x0b,0x71,0x00,0x03,0x0b,0x77,0x0b,0x78,0x00,0x04,0x0b,0x9f,0x0b,0x9f,\r\n0x00,0x06,0x0b,0xa2,0x0b,0xa3,0x00,0x07,0x0b,0xa5,0x0b,0xa5,0x00,0x09,0x0b,0xaa,0x0b,0xaa,0x00,0x0a,0x12,0x5f,0x12,0x5f,0x00,0x0b,0x00,0x02,0x00,0x0a,0x0b,0x53,0x0b,0x5b,0x00,0x00,0x0b,0x5d,0x0b,0x5d,0x00,0x09,0x0b,0x5f,0x0b,0x5f,0x00,0x0a,0x0b,0x67,0x0b,0x67,0x00,0x0b,0x0b,0xb9,0x0b,0xb9,0x00,0x0c,0x0b,0xbf,0x0b,0xbf,\r\n0x00,0x0d,0x0b,0xc4,0x0b,0xc4,0x00,0x0e,0x0b,0xc9,0x0b,0xc9,0x00,0x0f,0x0b,0xd0,0x0b,0xd5,0x00,0x10,0x0b,0xd8,0x0b,0xd8,0x00,0x16,0x00,0x01,0x00,0x01,0x0b,0xdb,0x00,0x01,0x00,0x01,0x0b,0xc8,0x00,0x01,0x00,0x01,0x12,0x5b,0x00,0x01,0x00,0x01,0x12,0x59,0x00,0x01,0x00,0x01,0x12,0x5a,0x00,0x01,0x00,0x01,0x0b,0x5f,0x00,0x01,\r\n0x00,0x01,0x0b,0x55,0x00,0x01,0x00,0x01,0x0b,0x54,0x00,0x01,0x00,0x01,0x0b,0x56,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x04,0x00,0x16,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x01,0x00,0x01,0x08,0xef,\r\n0x00,0x01,0x00,0x01,0x0e,0x2d,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x2f,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,\r\n0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,\r\n0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x76,0x00,0x7c,0x00,0x82,0x00,0x68,0x00,0x88,0x00,0x76,0x00,0x90,0x00,0x68,0x00,0x96,0x00,0x9c,0x00,0x76,0x00,0xa2,0x00,0xa8,0x00,0x68,0x00,0xae,0x00,0x01,0x00,0xb4,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x12,0x00,0x32,\r\n0x00,0x38,0x00,0x3e,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x38,0x00,0x58,0x00,0x46,0x00,0x60,0x00,0x38,0x00,0x66,0x00,0x6c,0x00,0x46,0x00,0x72,0x00,0x78,0x00,0x38,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x02,0x08,0xf7,0x09,0x4b,0x00,0x01,\r\n0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xe2,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x01,0x00,0x01,0x08,0xf3,0x00,0x01,0x00,0x01,0x09,0x29,0x00,0x01,0x00,0x01,0x08,0xd4,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x02,0x00,0x13,\r\n0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,\r\n0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x0f,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x6a,\r\n0x00,0x70,0x00,0x6a,0x00,0x76,0x00,0x5c,0x00,0x7c,0x00,0x82,0x00,0x6a,0x00,0x8a,0x00,0x90,0x00,0x5c,0x00,0x96,0x00,0x01,0x00,0x9c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x0f,0x00,0x2c,0x00,0x32,0x00,0x38,0x00,0x40,0x00,0x46,0x00,0x40,0x00,0x4c,0x00,0x32,0x00,0x52,0x00,0x58,0x00,0x40,0x00,0x60,0x00,0x66,0x00,0x32,0x00,0x6c,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x02,0x08,0xf7,0x09,0x4b,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x0a,0x63,0x00,0x01,0x00,0x01,0x08,0xe2,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x01,0x00,0x01,\r\n0x09,0x29,0x00,0x01,0x00,0x01,0x08,0xd4,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,\r\n0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,\r\n0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x3a,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x01,0x00,0x66,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x08,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x1e,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x80,0x00,0x01,\r\n0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x01,0x09,0x59,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x01,0x08,0xc7,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,\r\n0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,\r\n0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x07,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x36,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x01,0x00,0x5c,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x07,\r\n0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x1c,0x00,0x2e,0x00,0x34,0x00,0x3a,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x01,0x09,0x59,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x08,0xfb,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x02,0x08,0xf3,0x09,0x60,0x00,0x02,0x00,0x13,\r\n0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,\r\n0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x72,0x00,0x78,0x00,0x7e,0x00,0x84,\r\n0x00,0x8a,0x00,0x90,0x00,0x96,0x00,0x9c,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0xa2,0x00,0xa8,0x00,0xae,0x00,0xb4,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0xa2,0x00,0xa8,0x00,0xba,0x00,0x7e,0x00,0x01,0x00,0xc0,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x16,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,\r\n0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x6a,0x00,0x70,0x00,0x76,0x00,0x7c,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x6a,0x00,0x70,0x00,0x82,0x00,0x46,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x01,0x0e,0x32,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,\r\n0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x01,0x09,0x3f,0x00,0x01,0x00,0x01,0x08,0xf3,0x00,0x01,0x00,0x01,0x0b,0x0c,0x00,0x01,0x00,0x01,0x08,0xd0,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x59,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,\r\n0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,\r\n0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x03,0x00,0x00,0x00,0x13,0x00,0x66,0x00,0x6c,0x00,0x72,0x00,0x78,0x00,0x7e,0x00,0x78,0x00,0x84,0x00,0x8a,0x00,0x90,\r\n0x00,0x96,0x00,0x9c,0x00,0xa2,0x00,0x78,0x00,0x84,0x00,0x8a,0x00,0x90,0x00,0x96,0x00,0xa8,0x00,0x72,0x00,0x01,0x00,0xae,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x13,0x00,0x34,0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x46,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x46,0x00,0x52,0x00,0x58,0x00,0x5e,\r\n0x00,0x64,0x00,0x76,0x00,0x40,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x83,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x01,0x0e,0x32,0x00,0x01,0x00,0x01,0x0e,0x57,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x01,0x0a,0x63,0x00,0x01,0x00,0x01,0x09,0x0d,0x00,0x01,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x01,0x0b,0x0c,0x00,0x01,\r\n0x00,0x01,0x08,0xd0,0x00,0x01,0x00,0x01,0x0e,0x58,0x00,0x01,0x00,0x01,0x0e,0x59,0x00,0x01,0x00,0x01,0x0e,0x61,0x00,0x02,0x00,0x13,0x09,0x2c,0x09,0x33,0x00,0x00,0x09,0x37,0x09,0x37,0x00,0x08,0x09,0x73,0x09,0x75,0x00,0x09,0x09,0x77,0x09,0x77,0x00,0x0c,0x09,0x7e,0x09,0x7f,0x00,0x0d,0x0a,0x0f,0x0a,0x13,0x00,0x0f,0x0a,0x16,\r\n0x0a,0x1b,0x00,0x14,0x0a,0x1e,0x0a,0x1f,0x00,0x1a,0x0a,0x21,0x0a,0x23,0x00,0x1c,0x0a,0x4b,0x0a,0x53,0x00,0x1f,0x0a,0x65,0x0a,0x69,0x00,0x28,0x0a,0x6c,0x0a,0x71,0x00,0x2d,0x0e,0x1a,0x0e,0x1e,0x00,0x33,0x0e,0x62,0x0e,0x6c,0x00,0x38,0x13,0x2a,0x13,0x44,0x00,0x43,0x13,0xe9,0x13,0xe9,0x00,0x5e,0x14,0x17,0x14,0x17,0x00,0x5f,\r\n0x14,0x5d,0x14,0x6a,0x00,0x60,0x14,0x6c,0x14,0x6c,0x00,0x6e,0x00,0x02,0x00,0x08,0x00,0x01,0x0e,0x5c,0x00,0x01,0x00,0x01,0x09,0x28,0x00,0x02,0x00,0x32,0x00,0x16,0x14,0x88,0x14,0x89,0x14,0x8a,0x14,0x8b,0x14,0x8c,0x14,0x8d,0x14,0x8e,0x14,0x8f,0x14,0x90,0x14,0x91,0x14,0x88,0x14,0x89,0x14,0x8a,0x14,0x8b,0x14,0x92,0x14,0x93,\r\n0x14,0x94,0x14,0x8f,0x14,0x90,0x14,0x91,0x14,0x95,0x14,0x96,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x02,0x00,0x32,0x00,0x16,0x14,0x9e,0x14,0x9f,0x14,0xa0,0x14,0xa1,0x14,0xa2,0x14,0xa3,0x14,0xa4,0x14,0xa5,0x14,0xa6,0x14,0xa7,0x14,0x9e,0x14,0x9f,\r\n0x14,0xa0,0x14,0xa1,0x14,0xa8,0x14,0xa9,0x14,0xaa,0x14,0xa5,0x14,0xa6,0x14,0xa7,0x14,0xab,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,\r\n0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,0x14,0xa2,0x00,0x02,0x14,0x9a,0x14,0xa3,\r\n0x00,0x02,0x14,0x9a,0x14,0xa4,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,0x14,0xa8,0x00,0x02,0x14,0x9a,0x14,0xa9,0x00,0x02,0x14,0x9a,\r\n0x14,0xaa,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0xab,0x00,0x02,0x14,0x9a,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,\r\n0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,\r\n0x00,0x02,0x14,0x9a,0x14,0xa2,0x00,0x02,0x14,0x9a,0x14,0xa3,0x00,0x02,0x14,0x9a,0x14,0xa4,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0x9e,0x00,0x02,0x14,0x9a,0x14,0x9f,0x00,0x02,0x14,0x9a,0x14,0xa0,0x00,0x02,0x14,0x9a,0x14,0xa1,0x00,0x02,0x14,0x9a,\r\n0x14,0xa8,0x00,0x02,0x14,0x9a,0x14,0xa9,0x00,0x02,0x14,0x9a,0x14,0xaa,0x00,0x02,0x14,0x9a,0x14,0xa5,0x00,0x02,0x14,0x9a,0x14,0xa6,0x00,0x02,0x14,0x9a,0x14,0xa7,0x00,0x02,0x14,0x9a,0x14,0xab,0x00,0x02,0x14,0x9a,0x14,0xac,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,\r\n0x00,0x14,0x00,0x01,0x00,0xb6,0x00,0x16,0x00,0x32,0x00,0x38,0x00,0x3e,0x00,0x44,0x00,0x4a,0x00,0x50,0x00,0x56,0x00,0x5c,0x00,0x62,0x00,0x68,0x00,0x6e,0x00,0x74,0x00,0x7a,0x00,0x80,0x00,0x86,0x00,0x8c,0x00,0x92,0x00,0x98,0x00,0x9e,0x00,0xa4,0x00,0xaa,0x00,0xb0,0x00,0x02,0x14,0x2b,0x08,0xd7,0x00,0x02,0x14,0x2b,0x08,0xd8,\r\n0x00,0x02,0x14,0x2b,0x08,0xd9,0x00,0x02,0x14,0x2b,0x08,0xda,0x00,0x02,0x14,0x2b,0x08,0xdb,0x00,0x02,0x14,0x2b,0x08,0xdc,0x00,0x02,0x14,0x2b,0x08,0xdd,0x00,0x02,0x14,0x2b,0x08,0xde,0x00,0x02,0x14,0x2b,0x08,0xdf,0x00,0x02,0x14,0x2b,0x08,0xe0,0x00,0x02,0x14,0x2b,0x08,0xd7,0x00,0x02,0x14,0x2b,0x08,0xd8,0x00,0x02,0x14,0x2b,\r\n0x08,0xd9,0x00,0x02,0x14,0x2b,0x08,0xda,0x00,0x02,0x14,0x2b,0x09,0x53,0x00,0x02,0x14,0x2b,0x09,0x54,0x00,0x02,0x14,0x2b,0x09,0x55,0x00,0x02,0x14,0x2b,0x08,0xde,0x00,0x02,0x14,0x2b,0x08,0xdf,0x00,0x02,0x14,0x2b,0x08,0xe0,0x00,0x02,0x14,0x2b,0x0a,0x3c,0x00,0x02,0x14,0x2b,0x0a,0x3d,0x00,0x02,0x00,0x03,0x08,0xd7,0x08,0xe0,\r\n0x00,0x00,0x09,0x4f,0x09,0x58,0x00,0x0a,0x0a,0x3c,0x0a,0x3d,0x00,0x14,0x00,0x01,0x00,0x1e,0x00,0x03,0x00,0x0c,0x00,0x12,0x00,0x18,0x00,0x02,0x14,0x99,0x0a,0x44,0x00,0x02,0x14,0x9c,0x0a,0x47,0x00,0x02,0x14,0x9d,0x13,0x45,0x00,0x02,0x00,0x03,0x0a,0x44,0x0a,0x44,0x00,0x00,0x0a,0x47,0x0a,0x47,0x00,0x01,0x13,0x45,0x13,0x45,\r\n0x00,0x02,0x00,0x02,0x00,0x1e,0x00,0x0c,0x0f,0x8c,0x0f,0x8d,0x0f,0x8e,0x0f,0x90,0x0f,0x92,0x0f,0x94,0x0f,0x8f,0x0f,0x91,0x0f,0x93,0x0f,0x95,0x0f,0x96,0x0f,0x97,0x00,0x02,0x00,0x08,0x08,0xee,0x08,0xee,0x00,0x00,0x09,0x3f,0x09,0x3f,0x00,0x01,0x09,0xec,0x09,0xec,0x00,0x02,0x09,0xee,0x09,0xee,0x00,0x03,0x09,0xf0,0x09,0xf0,\r\n0x00,0x04,0x09,0xf2,0x09,0xf2,0x00,0x05,0x0a,0x5f,0x0a,0x62,0x00,0x06,0x0a,0xb2,0x0a,0xb3,0x00,0x0a,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0f,0x65,0x0f,0x63,0x0f,0x62,0x0f,0x64,0x0f,0x66,0x0f,0x67,0x0f,0x68,0x0f,0x69,0x0f,0x6a,0x0f,0x6b,0x00,0x02,0x00,0x07,0x08,0xc7,0x08,0xca,0x00,0x00,0x09,0x81,0x09,0x81,0x00,0x04,0x09,0x83,\r\n0x09,0x83,0x00,0x05,0x09,0x85,0x09,0x85,0x00,0x06,0x09,0x87,0x09,0x87,0x00,0x07,0x0f,0x29,0x0f,0x29,0x00,0x08,0x0f,0x2b,0x0f,0x2b,0x00,0x09,0x00,0x02,0x00,0x46,0x00,0x20,0x0f,0x6c,0x0f,0x6e,0x0f,0x82,0x0f,0x84,0x0f,0x70,0x0f,0x72,0x0f,0x74,0x0f,0x86,0x0f,0x88,0x0f,0x76,0x0f,0x8a,0x0f,0x78,0x0f,0x7a,0x0f,0x6d,0x0f,0x6f,\r\n0x0f,0x83,0x0f,0x85,0x0f,0x71,0x0f,0x73,0x0f,0x75,0x0f,0x87,0x0f,0x89,0x0f,0x77,0x0f,0x8b,0x0f,0x79,0x0f,0x7b,0x0f,0x7c,0x0f,0x7d,0x0f,0x7e,0x0f,0x7f,0x0f,0x80,0x0f,0x81,0x00,0x02,0x00,0x1b,0x08,0xd4,0x08,0xd6,0x00,0x00,0x08,0xe1,0x08,0xe1,0x00,0x03,0x09,0xba,0x09,0xba,0x00,0x04,0x09,0xbc,0x09,0xbc,0x00,0x05,0x09,0xbe,\r\n0x09,0xbe,0x00,0x06,0x09,0xc0,0x09,0xc0,0x00,0x07,0x09,0xc2,0x09,0xc2,0x00,0x08,0x0a,0x25,0x0a,0x25,0x00,0x09,0x0a,0x27,0x0a,0x27,0x00,0x0a,0x0a,0x8a,0x0a,0x8a,0x00,0x0b,0x0a,0xb7,0x0a,0xb7,0x00,0x0c,0x0e,0x32,0x0e,0x32,0x00,0x0d,0x0e,0x34,0x0e,0x34,0x00,0x0e,0x0e,0x36,0x0e,0x36,0x00,0x0f,0x0e,0x38,0x0e,0x38,0x00,0x10,\r\n0x0e,0x99,0x0e,0x99,0x00,0x11,0x0e,0x9b,0x0e,0x9b,0x00,0x12,0x0e,0x9d,0x0e,0x9d,0x00,0x13,0x0e,0x9f,0x0e,0x9f,0x00,0x14,0x0e,0xa1,0x0e,0xa1,0x00,0x15,0x0e,0xed,0x0e,0xed,0x00,0x16,0x0e,0xef,0x0e,0xef,0x00,0x17,0x0f,0x04,0x0f,0x04,0x00,0x18,0x0f,0x15,0x0f,0x15,0x00,0x19,0x0f,0x20,0x0f,0x21,0x00,0x1a,0x0f,0x46,0x0f,0x47,\r\n0x00,0x1c,0x0f,0x4a,0x0f,0x4b,0x00,0x1e,0x00,0x02,0x00,0x4a,0x00,0x22,0x0f,0xac,0x0f,0xab,0x0f,0xa7,0x0f,0xbd,0x0f,0xad,0x0f,0xae,0x0f,0xaf,0x0f,0xbe,0x0f,0xb0,0x0f,0xa2,0x0f,0xa5,0x0f,0x98,0x0f,0x99,0x0f,0xc3,0x0f,0x9a,0x0f,0x9b,0x0f,0x9c,0x0f,0x9d,0x0f,0x9e,0x0f,0x9f,0x0f,0xa0,0x0f,0xa1,0x0f,0xa4,0x0f,0xbf,0x0f,0xa8,\r\n0x0f,0xa9,0x0f,0xaa,0x0f,0xa3,0x0f,0xa6,0x0f,0xb1,0x0f,0xb2,0x0f,0xb3,0x14,0xad,0x14,0xae,0x00,0x02,0x00,0x16,0x08,0xf5,0x08,0xf5,0x00,0x00,0x08,0xf7,0x08,0xf7,0x00,0x01,0x09,0x02,0x09,0x02,0x00,0x02,0x09,0x4b,0x09,0x4b,0x00,0x03,0x09,0x8b,0x09,0x8b,0x00,0x04,0x0a,0x06,0x0a,0x06,0x00,0x05,0x0a,0x08,0x0a,0x08,0x00,0x06,\r\n0x0a,0x0c,0x0a,0x0c,0x00,0x07,0x0a,0x0e,0x0a,0x0e,0x00,0x08,0x0a,0x57,0x0a,0x57,0x00,0x09,0x0a,0xb5,0x0a,0xb5,0x00,0x0a,0x0b,0x0c,0x0b,0x17,0x00,0x0b,0x0e,0x21,0x0e,0x21,0x00,0x17,0x0e,0x48,0x0e,0x48,0x00,0x18,0x0e,0x4c,0x0e,0x4c,0x00,0x19,0x0e,0x50,0x0e,0x50,0x00,0x1a,0x0f,0x02,0x0f,0x02,0x00,0x1b,0x0f,0x23,0x0f,0x23,\r\n0x00,0x1c,0x0f,0x2d,0x0f,0x2d,0x00,0x1d,0x0f,0x31,0x0f,0x31,0x00,0x1e,0x0f,0x35,0x0f,0x35,0x00,0x1f,0x14,0x7d,0x14,0x7e,0x00,0x20,0x00,0x02,0x00,0x0e,0x00,0x04,0x0f,0xb6,0x0f,0xb8,0x0f,0xba,0x0f,0xbc,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,\r\n0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x04,0x0f,0xb5,0x0f,0xb7,0x0f,0xb9,0x0f,0xbb,0x00,0x02,0x00,0x04,0x09,0x66,0x09,0x66,0x00,0x00,0x09,0x68,0x09,0x68,0x00,0x01,0x0f,0x3d,0x0f,0x3d,0x00,0x02,0x0f,0x3f,0x0f,0x3f,0x00,0x03,0x00,0x02,0x00,0x0e,0x00,0x04,0x00,0xd6,0x06,0xac,0x11,0x8c,0x06,0xad,0x00,0x02,0x00,0x03,\r\n0x00,0x4c,0x00,0x4d,0x00,0x00,0x01,0x62,0x01,0x62,0x00,0x02,0x05,0x6d,0x05,0x6d,0x00,0x03,0x00,0x02,0x00,0x1a,0x00,0x0a,0x0c,0xe1,0x0c,0xe2,0x0c,0xe3,0x0c,0xe4,0x0c,0xe5,0x0c,0xe6,0x0c,0xe7,0x0c,0xe8,0x0c,0xe9,0x0c,0xea,0x00,0x02,0x00,0x01,0x00,0x13,0x00,0x1c,0x00,0x00,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0x8d,0x00,0x01,\r\n0x00,0x01,0x0b,0x7a,0x00,0x02,0x00,0x08,0x00,0x01,0x0b,0xd6,0x00,0x01,0x00,0x01,0x0b,0xc7,0x00,0x02,0x00,0x08,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x1e,0x00,0x02,0x00,0x0a,0x00,0x14,0x00,0x01,0x00,0x04,0x0b,0x8a,0x00,0x02,0x0b,0x5c,0x00,0x01,0x00,0x04,0x0b,0x8b,0x00,0x02,0x0b,0x5c,0x00,0x01,\r\n0x00,0x02,0x0b,0x74,0x0b,0xa8,0x00,0x01,0x00,0x12,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x0b,0x57,0x00,0x02,0x0b,0x57,0x00,0x01,0x00,0x01,0x0a,0x43,0x00,0x01,0x00,0x66,0x00,0x0c,0x00,0x1e,0x00,0x24,0x00,0x2a,0x00,0x30,0x00,0x36,0x00,0x3c,0x00,0x42,0x00,0x48,0x00,0x4e,0x00,0x54,0x00,0x5a,0x00,0x60,0x00,0x02,0x0b,0x5f,\r\n0x0b,0x07,0x00,0x02,0x0b,0x67,0x0b,0x07,0x00,0x02,0x0b,0xbf,0x0b,0x07,0x00,0x02,0x0b,0xc4,0x0b,0x07,0x00,0x02,0x0b,0xc9,0x0b,0x07,0x00,0x02,0x0b,0xd0,0x0b,0x07,0x00,0x02,0x0b,0xd1,0x0b,0x07,0x00,0x02,0x0b,0xd2,0x0b,0x07,0x00,0x02,0x0b,0xd3,0x0b,0x07,0x00,0x02,0x0b,0xd4,0x0b,0x07,0x00,0x02,0x0b,0xd5,0x0b,0x07,0x00,0x02,\r\n0x0b,0xd8,0x0b,0x07,0x00,0x02,0x00,0x07,0x0b,0x5f,0x0b,0x5f,0x00,0x00,0x0b,0x67,0x0b,0x67,0x00,0x01,0x0b,0xbf,0x0b,0xbf,0x00,0x02,0x0b,0xc4,0x0b,0xc4,0x00,0x03,0x0b,0xc9,0x0b,0xc9,0x00,0x04,0x0b,0xd0,0x0b,0xd5,0x00,0x05,0x0b,0xd8,0x0b,0xd8,0x00,0x0b,0x00,0x01,0x00,0x76,0x00,0x0e,0x00,0x22,0x00,0x28,0x00,0x2e,0x00,0x34,\r\n0x00,0x3a,0x00,0x40,0x00,0x46,0x00,0x4c,0x00,0x52,0x00,0x58,0x00,0x5e,0x00,0x64,0x00,0x6a,0x00,0x70,0x00,0x02,0x0b,0x53,0x11,0x86,0x00,0x02,0x0b,0x5a,0x11,0x86,0x00,0x02,0x0b,0x5f,0x11,0x86,0x00,0x02,0x0b,0x67,0x11,0x86,0x00,0x02,0x0b,0xbf,0x11,0x86,0x00,0x02,0x0b,0xc4,0x11,0x86,0x00,0x02,0x0b,0xc9,0x11,0x86,0x00,0x02,\r\n0x0b,0xd0,0x11,0x86,0x00,0x02,0x0b,0xd1,0x11,0x86,0x00,0x02,0x0b,0xd2,0x11,0x86,0x00,0x02,0x0b,0xd3,0x11,0x86,0x00,0x02,0x0b,0xd4,0x11,0x86,0x00,0x02,0x0b,0xd5,0x11,0x86,0x00,0x02,0x0b,0xd8,0x11,0x86,0x00,0x02,0x00,0x09,0x0b,0x53,0x0b,0x53,0x00,0x00,0x0b,0x5a,0x0b,0x5a,0x00,0x01,0x0b,0x5f,0x0b,0x5f,0x00,0x02,0x0b,0x67,\r\n0x0b,0x67,0x00,0x03,0x0b,0xbf,0x0b,0xbf,0x00,0x04,0x0b,0xc4,0x0b,0xc4,0x00,0x05,0x0b,0xc9,0x0b,0xc9,0x00,0x06,0x0b,0xd0,0x0b,0xd5,0x00,0x07,0x0b,0xd8,0x0b,0xd8,0x00,0x0d,0x00,0x01,0x04,0x26,0x00,0x84,0x01,0x0e,0x01,0x14,0x01,0x1a,0x01,0x20,0x01,0x26,0x01,0x2c,0x01,0x32,0x01,0x38,0x01,0x3e,0x01,0x44,0x01,0x4a,0x01,0x50,\r\n0x01,0x56,0x01,0x5c,0x01,0x62,0x01,0x68,0x01,0x6e,0x01,0x74,0x01,0x7a,0x01,0x80,0x01,0x86,0x01,0x8c,0x01,0x92,0x01,0x98,0x01,0x9e,0x01,0xa4,0x01,0xaa,0x01,0xb0,0x01,0xb6,0x01,0xbc,0x01,0xc2,0x01,0xc8,0x01,0xce,0x01,0xd4,0x01,0xda,0x01,0xe0,0x01,0xe6,0x01,0xec,0x01,0xf2,0x01,0xf8,0x01,0xfe,0x02,0x04,0x02,0x0a,0x02,0x10,\r\n0x02,0x16,0x02,0x1c,0x02,0x22,0x02,0x28,0x02,0x2e,0x02,0x34,0x02,0x3a,0x02,0x40,0x02,0x46,0x02,0x4c,0x02,0x52,0x02,0x58,0x02,0x5e,0x02,0x64,0x02,0x6a,0x02,0x70,0x02,0x76,0x02,0x7c,0x02,0x82,0x02,0x88,0x02,0x8e,0x02,0x94,0x02,0x9a,0x02,0xa0,0x02,0xa6,0x02,0xac,0x02,0xb2,0x02,0xb8,0x02,0xbe,0x02,0xc4,0x02,0xca,0x02,0xd0,\r\n0x02,0xd6,0x02,0xdc,0x02,0xe2,0x02,0xe8,0x02,0xee,0x02,0xf4,0x02,0xfa,0x03,0x00,0x03,0x06,0x03,0x0c,0x03,0x12,0x03,0x18,0x03,0x1e,0x03,0x24,0x03,0x2a,0x03,0x30,0x03,0x36,0x03,0x3c,0x03,0x42,0x03,0x48,0x03,0x4e,0x03,0x54,0x03,0x5a,0x03,0x60,0x03,0x66,0x03,0x6c,0x03,0x72,0x03,0x78,0x03,0x7e,0x03,0x84,0x03,0x8a,0x03,0x90,\r\n0x03,0x96,0x03,0x9c,0x03,0xa2,0x03,0xa8,0x03,0xae,0x03,0xb4,0x03,0xba,0x03,0xc0,0x03,0xc6,0x03,0xcc,0x03,0xd2,0x03,0xd8,0x03,0xde,0x03,0xe4,0x03,0xea,0x03,0xf0,0x03,0xf6,0x03,0xfc,0x04,0x02,0x04,0x08,0x04,0x0e,0x04,0x14,0x04,0x1a,0x04,0x20,0x00,0x02,0x0a,0x43,0x11,0x86,0x00,0x02,0x0b,0x53,0x11,0x86,0x00,0x02,0x0b,0x54,\r\n0x11,0x86,0x00,0x02,0x0b,0x55,0x11,0x86,0x00,0x02,0x0b,0x56,0x11,0x86,0x00,0x02,0x0b,0x57,0x11,0x86,0x00,0x02,0x0b,0x58,0x11,0x86,0x00,0x02,0x0b,0x59,0x11,0x86,0x00,0x02,0x0b,0x5a,0x11,0x86,0x00,0x02,0x0b,0x5b,0x11,0x86,0x00,0x02,0x0b,0x5c,0x11,0x86,0x00,0x02,0x0b,0x5d,0x11,0x86,0x00,0x02,0x0b,0x5e,0x11,0x86,0x00,0x02,\r\n0x0b,0x5f,0x11,0x86,0x00,0x02,0x0b,0x61,0x11,0x86,0x00,0x02,0x0b,0x66,0x11,0x86,0x00,0x02,0x0b,0x67,0x11,0x86,0x00,0x02,0x0b,0x68,0x11,0x86,0x00,0x02,0x0b,0x69,0x11,0x86,0x00,0x02,0x0b,0x6a,0x11,0x86,0x00,0x02,0x0b,0x6b,0x11,0x86,0x00,0x02,0x0b,0x6c,0x11,0x86,0x00,0x02,0x0b,0x6d,0x11,0x86,0x00,0x02,0x0b,0x6e,0x11,0x86,\r\n0x00,0x02,0x0b,0x6f,0x11,0x86,0x00,0x02,0x0b,0x70,0x11,0x86,0x00,0x02,0x0b,0x71,0x11,0x86,0x00,0x02,0x0b,0x72,0x11,0x86,0x00,0x02,0x0b,0x73,0x11,0x86,0x00,0x02,0x0b,0x74,0x11,0x86,0x00,0x02,0x0b,0x75,0x11,0x86,0x00,0x02,0x0b,0x76,0x11,0x86,0x00,0x02,0x0b,0x77,0x11,0x86,0x00,0x02,0x0b,0x78,0x11,0x86,0x00,0x02,0x0b,0x79,\r\n0x11,0x86,0x00,0x02,0x0b,0x7a,0x11,0x86,0x00,0x02,0x0b,0x7b,0x11,0x86,0x00,0x02,0x0b,0x7c,0x11,0x86,0x00,0x02,0x0b,0x7d,0x11,0x86,0x00,0x02,0x0b,0x7e,0x11,0x86,0x00,0x02,0x0b,0x7f,0x11,0x86,0x00,0x02,0x0b,0x80,0x11,0x86,0x00,0x02,0x0b,0x81,0x11,0x86,0x00,0x02,0x0b,0x82,0x11,0x86,0x00,0x02,0x0b,0x83,0x11,0x86,0x00,0x02,\r\n0x0b,0x84,0x11,0x86,0x00,0x02,0x0b,0x85,0x11,0x86,0x00,0x02,0x0b,0x88,0x11,0x86,0x00,0x02,0x0b,0x89,0x11,0x86,0x00,0x02,0x0b,0x8a,0x11,0x86,0x00,0x02,0x0b,0x8b,0x11,0x86,0x00,0x02,0x0b,0x8c,0x11,0x86,0x00,0x02,0x0b,0x8d,0x11,0x86,0x00,0x02,0x0b,0x8e,0x11,0x86,0x00,0x02,0x0b,0x8f,0x11,0x86,0x00,0x02,0x0b,0x90,0x11,0x86,\r\n0x00,0x02,0x0b,0x91,0x11,0x86,0x00,0x02,0x0b,0x92,0x11,0x86,0x00,0x02,0x0b,0x93,0x11,0x86,0x00,0x02,0x0b,0x94,0x11,0x86,0x00,0x02,0x0b,0x95,0x11,0x86,0x00,0x02,0x0b,0x97,0x11,0x86,0x00,0x02,0x0b,0x98,0x11,0x86,0x00,0x02,0x0b,0x99,0x11,0x86,0x00,0x02,0x0b,0x9a,0x11,0x86,0x00,0x02,0x0b,0x9d,0x11,0x86,0x00,0x02,0x0b,0x9e,\r\n0x11,0x86,0x00,0x02,0x0b,0x9f,0x11,0x86,0x00,0x02,0x0b,0xa0,0x11,0x86,0x00,0x02,0x0b,0xa1,0x11,0x86,0x00,0x02,0x0b,0xa2,0x11,0x86,0x00,0x02,0x0b,0xa3,0x11,0x86,0x00,0x02,0x0b,0xa4,0x11,0x86,0x00,0x02,0x0b,0xa5,0x11,0x86,0x00,0x02,0x0b,0xa6,0x11,0x86,0x00,0x02,0x0b,0xa7,0x11,0x86,0x00,0x02,0x0b,0xa8,0x11,0x86,0x00,0x02,\r\n0x0b,0xa9,0x11,0x86,0x00,0x02,0x0b,0xaa,0x11,0x86,0x00,0x02,0x0b,0xab,0x11,0x86,0x00,0x02,0x0b,0xac,0x11,0x86,0x00,0x02,0x0b,0xad,0x11,0x86,0x00,0x02,0x0b,0xae,0x11,0x86,0x00,0x02,0x0b,0xaf,0x11,0x86,0x00,0x02,0x0b,0xb0,0x11,0x86,0x00,0x02,0x0b,0xb1,0x11,0x86,0x00,0x02,0x0b,0xb2,0x11,0x86,0x00,0x02,0x0b,0xb3,0x11,0x86,\r\n0x00,0x02,0x0b,0xb4,0x11,0x86,0x00,0x02,0x0b,0xb5,0x11,0x86,0x00,0x02,0x0b,0xb6,0x11,0x86,0x00,0x02,0x0b,0xb7,0x11,0x86,0x00,0x02,0x0b,0xb9,0x11,0x86,0x00,0x02,0x0b,0xbf,0x11,0x86,0x00,0x02,0x0b,0xc0,0x11,0x86,0x00,0x02,0x0b,0xc1,0x11,0x86,0x00,0x02,0x0b,0xc2,0x11,0x86,0x00,0x02,0x0b,0xc3,0x11,0x86,0x00,0x02,0x0b,0xc4,\r\n0x11,0x86,0x00,0x02,0x0b,0xc5,0x11,0x86,0x00,0x02,0x0b,0xc6,0x11,0x86,0x00,0x02,0x0b,0xc7,0x11,0x86,0x00,0x02,0x0b,0xc8,0x11,0x86,0x00,0x02,0x0b,0xc9,0x11,0x86,0x00,0x02,0x0b,0xca,0x11,0x86,0x00,0x02,0x0b,0xcb,0x11,0x86,0x00,0x02,0x0b,0xcc,0x11,0x86,0x00,0x02,0x0b,0xcd,0x11,0x86,0x00,0x02,0x0b,0xce,0x11,0x86,0x00,0x02,\r\n0x0b,0xcf,0x11,0x86,0x00,0x02,0x0b,0xd0,0x11,0x86,0x00,0x02,0x0b,0xd1,0x11,0x86,0x00,0x02,0x0b,0xd2,0x11,0x86,0x00,0x02,0x0b,0xd3,0x11,0x86,0x00,0x02,0x0b,0xd4,0x11,0x86,0x00,0x02,0x0b,0xd5,0x11,0x86,0x00,0x02,0x0b,0xd6,0x11,0x86,0x00,0x02,0x0b,0xd7,0x11,0x86,0x00,0x02,0x0b,0xd8,0x11,0x86,0x00,0x02,0x0b,0xd9,0x11,0x86,\r\n0x00,0x02,0x0b,0xda,0x11,0x86,0x00,0x02,0x0b,0xdb,0x11,0x86,0x00,0x02,0x0b,0xdc,0x11,0x86,0x00,0x02,0x0b,0xdd,0x11,0x86,0x00,0x02,0x0b,0xe1,0x11,0x86,0x00,0x02,0x12,0x5c,0x11,0x86,0x00,0x02,0x12,0x5d,0x11,0x86,0x00,0x02,0x12,0x5e,0x11,0x86,0x00,0x02,0x12,0x5f,0x11,0x86,0x00,0x02,0x12,0x60,0x11,0x86,0x00,0x02,0x12,0x61,\r\n0x11,0x86,0x00,0x02,0x12,0x62,0x11,0x86,0x00,0x02,0x00,0x0b,0x0a,0x43,0x0a,0x43,0x00,0x00,0x0b,0x53,0x0b,0x5f,0x00,0x01,0x0b,0x61,0x0b,0x61,0x00,0x0e,0x0b,0x66,0x0b,0x85,0x00,0x0f,0x0b,0x88,0x0b,0x95,0x00,0x2f,0x0b,0x97,0x0b,0x9a,0x00,0x3d,0x0b,0x9d,0x0b,0xb7,0x00,0x41,0x0b,0xb9,0x0b,0xb9,0x00,0x5c,0x0b,0xbf,0x0b,0xdd,\r\n0x00,0x5d,0x0b,0xe1,0x0b,0xe1,0x00,0x7c,0x12,0x5c,0x12,0x62,0x00,0x7d,0x00,0x01,0x00,0x16,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xef,0x00,0x04,0x0e,0x2d,0x0e,0x58,0x0e,0x2f,0x00,0x01,0x00,0x01,0x08,0xef,0x00,0x01,0x00,0x82,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x2e,0x00,0x54,0x13,0xf0,0x00,0x12,0x09,0x3f,\r\n0x08,0xf7,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x12,0x09,0x3f,0x09,0x4b,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,\r\n0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x12,0x09,0x3f,0x09,0x4b,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x09,0x60,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x70,0x00,0x01,0x00,0x08,0x00,0x03,0x00,0x08,0x00,0x28,\r\n0x00,0x48,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x08,0xf7,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x09,0x4b,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x08,0xf3,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,\r\n0x0e,0x57,0x13,0xf0,0x00,0x0f,0x09,0x3f,0x09,0x4b,0x00,0x03,0x0a,0x63,0x00,0x03,0x08,0xe2,0x09,0x3f,0x0e,0x61,0x09,0x60,0x00,0x03,0x09,0x29,0x08,0xd4,0x09,0x3f,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xd6,0x00,0x01,0x00,0x32,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x18,0x13,0xf1,0x00,0x08,0x09,0x59,0x00,0x03,0x08,0xce,\r\n0x09,0x3f,0x08,0xc7,0x08,0xee,0x08,0xf3,0x13,0xf1,0x00,0x08,0x09,0x59,0x00,0x03,0x08,0xce,0x09,0x3f,0x08,0xc7,0x08,0xee,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x2e,0x00,0x01,0x00,0x08,0x00,0x02,0x00,0x06,0x00,0x16,0x13,0xf1,0x00,0x07,0x09,0x59,0x00,0x03,0x08,0xce,0x08,0xfb,0x08,0xee,0x08,0xf3,0x13,0xf1,\r\n0x00,0x07,0x09,0x59,0x00,0x03,0x08,0xce,0x08,0xfb,0x08,0xee,0x09,0x60,0x00,0x01,0x00,0x01,0x08,0xce,0x00,0x01,0x00,0x3a,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xf2,0x00,0x16,0x0e,0x32,0x0e,0x57,0x00,0x03,0x09,0x0d,0x08,0xee,0x09,0x3f,0x08,0xf3,0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x58,0x0e,0x59,\r\n0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x61,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x01,0x00,0x34,0x00,0x01,0x00,0x08,0x00,0x01,0x00,0x04,0x13,0xf2,0x00,0x13,0x0e,0x32,0x0e,0x57,0x00,0x03,0x0a,0x63,0x00,0x03,0x09,0x0d,0x08,0xee,0x0b,0x0c,0x08,0xd0,0x0e,0x58,0x0e,0x59,0x00,0x03,0x09,0x0d,0x08,0xee,\r\n0x0b,0x0c,0x08,0xd0,0x0e,0x61,0x0e,0x57,0x00,0x01,0x00,0x01,0x08,0xcb,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x02,0x64,0x6c,0x6e,0x67,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x2c,0x73,0x6c,0x6e,0x67,0x00,0x00,0x00,0x54,\r\n0x00,0x00,0x00,0x2c,0x4c,0x61,0x74,0x6e,0x2c,0x47,0x72,0x65,0x6b,0x2c,0x43,0x79,0x72,0x6c,0x2c,0x41,0x72,0x6d,0x6e,0x2c,0x47,0x65,0x6f,0x72,0x2c,0x47,0x65,0x6f,0x6b,0x2c,0x41,0x72,0x61,0x62,0x2c,0x48,0x65,0x62,0x72,0x2c,0x4c,0x69,0x73,0x75,0x4c,0x61,0x74,0x6e,0x2c,0x47,0x72,0x65,0x6b,0x2c,0x43,0x79,0x72,0x6c,0x2c,0x41,\r\n0x72,0x6d,0x6e,0x2c,0x47,0x65,0x6f,0x72,0x2c,0x47,0x65,0x6f,0x6b,0x2c,0x41,0x72,0x61,0x62,0x2c,0x48,0x65,0x62,0x72,0x2c,0x4c,0x69,0x73,0x75,\r\n};\r\n\r\nread_only global String8 rd_default_main_font_bytes = {rd_default_main_font_bytes__data, sizeof(rd_default_main_font_bytes__data)};\r\nread_only global U8 rd_default_code_font_bytes__data[] =\r\n{\r\n0x00,0x01,0x00,0x00,0x00,0x11,0x01,0x00,0x00,0x04,0x00,0x10,0x47,0x44,0x45,0x46,0x14,0xdc,0x05,0x92,0x00,0x03,0xa6,0x14,0x00,0x00,0x02,0x2a,0x47,0x50,0x4f,0x53,0x68,0xe9,0x9a,0x47,0x00,0x03,0xa8,0x40,0x00,0x00,0x23,0x96,0x47,0x53,0x55,0x42,0x28,0xdb,0xc9,0x88,0x00,0x03,0xcb,0xd8,0x00,0x00,0x62,0x14,0x4f,0x53,0x2f,0x32,\r\n0x12,0x35,0x0b,0x84,0x00,0x00,0x01,0x98,0x00,0x00,0x00,0x60,0x63,0x6d,0x61,0x70,0x5a,0x24,0x58,0xda,0x00,0x00,0x1d,0x34,0x00,0x00,0x42,0x6a,0x63,0x76,0x74,0x20,0x27,0x58,0x0f,0x1a,0x00,0x00,0x6e,0x84,0x00,0x00,0x00,0xa8,0x66,0x70,0x67,0x6d,0x62,0x2f,0x03,0x7f,0x00,0x00,0x5f,0xa0,0x00,0x00,0x0e,0x0c,0x67,0x61,0x73,0x70,\r\n0x00,0x00,0x00,0x10,0x00,0x03,0xa6,0x0c,0x00,0x00,0x00,0x08,0x67,0x6c,0x79,0x66,0x6c,0x17,0x21,0x7d,0x00,0x00,0x8a,0x6c,0x00,0x02,0xc9,0x3c,0x68,0x65,0x61,0x64,0x1b,0x2b,0x60,0x84,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x36,0x68,0x68,0x65,0x61,0x00,0x35,0x07,0x57,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x24,0x68,0x6d,0x74,0x78,\r\n0x54,0xf6,0x4a,0x0f,0x00,0x00,0x01,0xf8,0x00,0x00,0x1b,0x3c,0x6c,0x6f,0x63,0x61,0x08,0x34,0x21,0x64,0x00,0x00,0x6f,0x2c,0x00,0x00,0x1b,0x40,0x6d,0x61,0x78,0x70,0x0f,0xc8,0x14,0x44,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0x20,0x6e,0x61,0x6d,0x65,0x94,0x4b,0x4e,0x5d,0x00,0x03,0x53,0xa8,0x00,0x00,0x06,0x2f,0x70,0x6f,0x73,0x74,\r\n0x5d,0x5a,0x9a,0x04,0x00,0x03,0x59,0xd8,0x00,0x00,0x4c,0x33,0x70,0x72,0x65,0x70,0x8a,0xcd,0x9c,0x1e,0x00,0x00,0x6d,0xac,0x00,0x00,0x00,0xd6,0x00,0x01,0x00,0x00,0x00,0x02,0x4d,0xd3,0x13,0x13,0x3d,0xf7,0x5f,0x0f,0x3c,0xf5,0x00,0x0f,0x03,0xe8,0x00,0x00,0x00,0x00,0xdf,0xe8,0x66,0x79,0x00,0x00,0x00,0x00,0xdf,0xe8,0x68,0x84,\r\n0xf9,0x39,0xfe,0x70,0x02,0xfd,0x04,0x60,0x00,0x00,0x00,0x06,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x03,0xfc,0xfe,0xd4,0x00,0x00,0x02,0x58,0xf9,0x39,0xff,0x5b,0x02,0xfd,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcf,0x00,0x01,0x00,0x00,0x06,0xcf,0x01,0xb8,\r\n0x00,0x6e,0x00,0x87,0x00,0x06,0x00,0x02,0x02,0x94,0x03,0xf6,0x00,0x8d,0x00,0x00,0x05,0x60,0x0e,0x0c,0x00,0x03,0x00,0x01,0x00,0x04,0x02,0x58,0x01,0x90,0x00,0x05,0x00,0x00,0x02,0x8a,0x02,0x58,0x00,0x00,0x00,0x4b,0x02,0x8a,0x02,0x58,0x00,0x00,0x01,0x5e,0x00,0x32,0x01,0x40,0x00,0x00,0x02,0x00,0x00,0x09,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0xa0,0x04,0x02,0xff,0x12,0x00,0xf9,0xfb,0x02,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x4a,0x42,0x00,0x00,0x00,0xc0,0x00,0x0d,0xff,0xff,0x03,0xfc,0xfe,0xd4,0x00,0x00,0x03,0xfc,0x01,0x2c,0x20,0x00,0x01,0x9f,0xdf,0xd7,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x00,0x00,0x20,0x00,0x06,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x32,\r\n0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,\r\n0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,\r\n0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,\r\n0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x0a,\r\n0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x5c,\r\n0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x75,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,\r\n0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,\r\n0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x48,\r\n0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x32,\r\n0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x55,\r\n0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,\r\n0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,\r\n0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3f,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x54,\r\n0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x58,\r\n0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xd4,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,\r\n0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x61,0x02,0x58,0x00,0x61,\r\n0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c,\r\n0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,\r\n0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x70,0x02,0x58,0x00,0x70,\r\n0x02,0x58,0x00,0x70,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,\r\n0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,\r\n0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x22,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,\r\n0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0xaf,0x02,0x58,0x00,0xb9,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x06,\r\n0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x2e,\r\n0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5e,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x35,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,\r\n0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x38,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x51,0x02,0x58,0x00,0x59,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x06,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x56,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x82,\r\n0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,\r\n0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x30,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x55,\r\n0x02,0x58,0x00,0x57,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3f,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5b,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x49,0x02,0x58,0x00,0x64,\r\n0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,\r\n0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5c,\r\n0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0x8d,0x02,0x58,0xff,0xb0,0x02,0x58,0xff,0x83,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x23,\r\n0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x67,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x36,\r\n0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x5a,\r\n0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x54,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x5c,0x02,0x58,0x00,0x30,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x1a,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x4b,\r\n0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x4b,\r\n0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x4a,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x36,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4b,\r\n0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x1e,\r\n0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x4c,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x40,0x02,0x58,0x00,0x52,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x40,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x49,\r\n0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,\r\n0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,\r\n0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0x8d,0x02,0x58,0x00,0x86,0x02,0x58,0x00,0x94,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8b,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,\r\n0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x9a,0x02,0x58,0x00,0x90,0x02,0x58,0x00,0x84,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x8a,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x05,\r\n0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x89,0x02,0x58,0x00,0x91,0x02,0x58,0x00,0x4c,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xd9,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xe1,0x02,0x58,0x00,0xe1,0x02,0x58,0x00,0x82,0x02,0x58,0x00,0x73,\r\n0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x24,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x87,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xda,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xd9,0x00,0x00,0xff,0x1a,\r\n0x00,0x00,0xff,0x79,0x02,0x58,0x00,0xb9,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x5f,0x02,0x58,0x00,0x6e,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x87,\r\n0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xdc,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xd2,\r\n0x02,0x58,0x00,0xdc,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x8f,0x02,0x58,0x00,0xf9,0x02,0x58,0xfe,0x34,0x02,0x58,0xfb,0xdc,0x02,0x58,0xf9,0x4d,0x02,0x58,0xfb,0xa6,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfd,0xfd,\r\n0x02,0x58,0xfb,0xa5,0x02,0x58,0xfd,0xfd,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfe,0x11,0x02,0x58,0xfe,0x0c,0x02,0x58,0xf9,0x7f,0x02,0x58,0xf9,0x7f,0x02,0x58,0xfc,0x09,0x02,0x58,0xfe,0x43,0x02,0x58,0xfe,0x34,0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0x8e,0x02,0x58,0xfe,0x3e,0x02,0x58,0xfe,0xd4,0x02,0x58,0xfc,0x90,0x02,0x58,0xfc,0x71,\r\n0x02,0x58,0xfe,0x82,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfe,0xd1,0x02,0x58,0xfc,0xc9,0x02,0x58,0xfc,0x44,0x02,0x58,0xfe,0xb3,0x02,0x58,0xfc,0x2c,0x02,0x58,0xfe,0x52,0x02,0x58,0xfe,0x81,0x02,0x58,0xfe,0x81,0x02,0x58,0xfe,0xc5,0x02,0x58,0xfc,0xbd,0x02,0x58,0xfe,0xc5,0x02,0x58,0xfc,0x68,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa5,\r\n0x02,0x58,0xfe,0x90,0x02,0x58,0xfe,0x90,0x02,0x58,0xfe,0x5c,0x02,0x58,0xfb,0xfa,0x02,0x58,0xfe,0x52,0x02,0x58,0xfb,0x9c,0x02,0x58,0xfd,0xe5,0x02,0x58,0xfd,0xcc,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xe9,0x02,0x58,0xfb,0x91,\r\n0x02,0x58,0xf9,0x39,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfd,0xcb,0x02,0x58,0xfb,0x73,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x11,0x02,0x58,0xfb,0xa0,0x02,0x58,0xfe,0x16,0x02,0x58,0xfe,0x3e,0x02,0x58,0xfb,0xfa,0x02,0x58,0xfc,0x13,0x02,0x58,0xfe,0x66,0x02,0x58,0xfe,0x66,0x02,0x58,0xfc,0x22,0x02,0x58,0xfd,0xe4,\r\n0x02,0x58,0xfe,0x5c,0x02,0x58,0xfc,0x0e,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x2e,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x13,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x58,0x02,0x58,0x00,0x48,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x1d,\r\n0x02,0x58,0x00,0x9e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xda,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x9b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x1b,0x02,0x58,0x00,0x9f,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xf6,\r\n0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0xe6,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0x97,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x2d,\r\n0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x41,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x46,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2d,\r\n0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,\r\n0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x64,\r\n0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x2b,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x5d,0x02,0x58,0x00,0x9b,\r\n0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0e,0x02,0x58,0xff,0xfb,0x02,0x58,0x00,0x78,0x02,0x58,0x00,0xa0,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0xd9,0x02,0x58,0x00,0x23,\r\n0x02,0x58,0x00,0x1e,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x73,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,\r\n0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,\r\n0x02,0x58,0x00,0x43,0x02,0x58,0x00,0x1d,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x28,\r\n0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x2f,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x6e,\r\n0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x6e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x0a,\r\n0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x05,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x0a,0x02,0x58,0xff,0xd8,0x02,0x58,0xff,0xd8,0x02,0x58,0xff,0xb0,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,\r\n0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x01,0x2c,0x02,0x58,0x02,0x0d,0x02,0x58,0x00,0x00,0x02,0x58,0x01,0x2c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,\r\n0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x01,0x2c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,\r\n0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0xb4,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,\r\n0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x96,\r\n0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x8c,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,\r\n0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,\r\n0x02,0x58,0x00,0x4b,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,\r\n0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,\r\n0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x19,\r\n0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,\r\n0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,\r\n0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x96,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xc8,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,\r\n0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0xfa,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x44,0x02,0x58,0x00,0x44,0x02,0x58,0x00,0x3c,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x32,\r\n0x02,0x58,0x00,0x32,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x1e,\r\n0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,\r\n0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x5e,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0xaa,0x02,0x58,0x00,0x7d,\r\n0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x46,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x58,0x02,0x58,0xff,0xf6,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x42,0x02,0x58,0x00,0x1f,0x02,0x58,0x00,0x27,\r\n0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x19,0x02,0x58,0x00,0x41,0x02,0x58,0x00,0x4d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0f,0x02,0x58,0x00,0x96,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0xff,0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x46,\r\n0x02,0x58,0x00,0x50,0x02,0x58,0x00,0x1e,0x02,0x58,0x00,0x3c,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x28,0x02,0x58,0x00,0x14,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0xc3,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0xc3,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,\r\n0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x34,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x3e,0x02,0x58,0x00,0x20,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x51,\r\n0x02,0x58,0x00,0x14,0x02,0x58,0xff,0x5b,0x02,0x58,0xff,0xc9,0x02,0x58,0xff,0xa9,0x02,0x58,0x00,0x0a,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x64,0x02,0x58,0x00,0x00,0x02,0x58,0xff,0xec,0x02,0x58,0x00,0x52,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,0x02,0x58,0xff,0xec,\r\n0x02,0x58,0x00,0xf5,0x02,0x58,0x00,0x06,0x02,0x58,0x00,0x23,0x02,0x58,0x00,0x2d,0x02,0x58,0xff,0xf6,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x25,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x49,0x02,0x58,0x00,0x2d,0x02,0x58,0x00,0x0f,\r\n0x02,0x58,0x00,0x37,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0xfe,0x13,0x02,0x58,0xfe,0x07,0x02,0x58,0xfb,0xc8,0x02,0x58,0xfd,0xda,0x02,0x58,0xfb,0x82,0x02,0x58,0xfd,0xdf,0x02,0x58,0xfd,0xd5,0x02,0x58,0xfd,0xc6,0x02,0x58,0xfb,0x73,0x02,0x58,0xfd,0xd5,0x02,0x58,0xfe,0xa7,0x02,0x58,0xfb,0xd2,0x02,0x58,0xfe,0xbb,\r\n0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0xe3,0x02,0x58,0xfc,0xa4,0x02,0x58,0xfc,0xc7,0x02,0x58,0xfa,0xc9,0x02,0x58,0xfc,0xa4,0x02,0x58,0xfc,0xd6,0x02,0x58,0xfe,0xa7,0x02,0x58,0xfb,0xd2,0x02,0x58,0xfe,0xbb,0x02,0x58,0xfe,0x13,0x02,0x58,0xfe,0x20,0x02,0x58,0xfb,0xff,0x02,0x58,0xfd,0xda,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xa0,\r\n0x02,0x58,0xfb,0xa0,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfd,0xfd,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa5,0x02,0x58,0xfb,0xa1,0x02,0x58,0xfe,0x0c,0x02,0x58,0xfb,0xb3,0x02,0x58,0xfe,0x61,0x02,0x58,0xfe,0x89,0x02,0x58,0xfe,0xcf,0x02,0x58,0xfb,0xb3,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xb3,\r\n0x02,0x58,0xfb,0xb3,0x02,0x58,0xfc,0x6d,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x89,0x02,0x58,0xfb,0xcd,0x02,0x58,0xf9,0x43,0x02,0x58,0xfd,0xee,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfe,0x98,0x02,0x58,0xfc,0x77,0x02,0x58,0xfa,0x7e,0x02,0x58,0xfb,0xe6,\r\n0x02,0x58,0xfe,0x07,0x02,0x58,0xfb,0xbe,0x02,0x58,0xf9,0x43,0x02,0x58,0xfd,0xee,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfe,0xcf,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xf9,0x43,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x34,0x02,0x58,0xfe,0x47,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfb,0xf5,\r\n0x02,0x58,0xfb,0x9b,0x02,0x58,0xfd,0xf3,0x02,0x58,0xfb,0xb4,0x02,0x58,0xfb,0x9b,0x02,0x58,0xfe,0x2a,0x02,0x58,0xfb,0xf5,0x02,0x58,0xfe,0x11,0x02,0x58,0xfd,0xee,0x02,0x58,0xfd,0xee,0x02,0x58,0xfe,0x57,0x02,0x58,0xfb,0x96,0x02,0x58,0xfe,0x39,0x02,0x58,0xfd,0xf8,0x02,0x58,0xfb,0xa0,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x41,\r\n0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xa5,0x02,0x58,0x00,0x37,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xa5,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x4a,0x00,0x00,0xfe,0x90,0x00,0x00,0xfe,0x3b,0x00,0x00,0xff,0x60,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x5c,\r\n0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xfd,0xf0,0x00,0x00,0xfe,0x7a,0x00,0x00,0xff,0x18,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x5c,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x75,0x00,0x00,0xfe,0x61,0x00,0x00,0xfd,0x8a,0x00,0x00,0xfd,0xcb,0x00,0x00,0xfe,0x16,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0xe5,\r\n0x02,0x58,0x00,0xa2,0x02,0x58,0x00,0xe8,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xcd,0x02,0x58,0x00,0xb9,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x4a,0x00,0x00,0xfe,0x90,\r\n0x00,0x00,0xfe,0x3b,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x1f,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x5c,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xfd,0xf0,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x7a,0x00,0x00,0xff,0x1b,0x00,0x00,0xfe,0x8d,0x00,0x00,0xfe,0x25,0x00,0x00,0xfe,0x66,0x00,0x00,0xfe,0x75,\r\n0x00,0x00,0xfe,0x61,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x34,0x02,0x58,0x00,0x7d,0x02,0x58,0x00,0xe5,0x02,0x58,0x00,0xa2,0x02,0x58,0x00,0xe8,0x02,0x58,0x00,0x93,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x77,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xb4,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0x8c,0x02,0x58,0x00,0xd2,0x02,0x58,0x00,0xe1,\r\n0x02,0x58,0x00,0x7d,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x2a,0x00,0x00,0xfe,0x34,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x2f,0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,\r\n0x00,0x00,0xfe,0x20,0x00,0x00,0xfe,0x20,0x02,0x58,0x00,0x5a,0x02,0x58,0x00,0x69,0x02,0x58,0x00,0x32,0x02,0x58,0xff,0xd8,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x00,0x02,0x58,0x00,0x55,0x02,0x58,0x00,0x55,0x00,0x00,0x00,0x00,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x24,\r\n0x00,0x00,0x00,0x04,0x00,0x00,0x0f,0x12,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x03,0x00,0x0a,0x00,0x00,0x0f,0x12,0x00,0x04,0x0e,0xee,0x00,0x00,0x01,0xa8,0x01,0x00,0x00,0x07,0x00,0xa8,0x00,0x0d,0x00,0x2f,0x00,0x39,0x00,0x7e,0x01,0x31,0x01,0x7f,0x01,0x90,0x01,0x92,0x01,0x9b,0x01,0xa1,0x01,0xb0,0x01,0xce,0x01,0xd0,\r\n0x01,0xd2,0x01,0xd4,0x01,0xd6,0x01,0xd8,0x01,0xda,0x01,0xdc,0x01,0xe7,0x01,0xeb,0x01,0xf5,0x01,0xff,0x02,0x1b,0x02,0x33,0x02,0x37,0x02,0x59,0x02,0xba,0x02,0xbc,0x02,0xc7,0x02,0xc9,0x02,0xdd,0x02,0xf3,0x02,0xf7,0x03,0x04,0x03,0x0c,0x03,0x0f,0x03,0x12,0x03,0x1b,0x03,0x23,0x03,0x28,0x03,0x38,0x03,0x75,0x03,0x7e,0x03,0x8a,\r\n0x03,0x8c,0x03,0x90,0x03,0xa1,0x03,0xa9,0x03,0xb0,0x03,0xc9,0x03,0xcf,0x03,0xd7,0x04,0x0c,0x04,0x1a,0x04,0x23,0x04,0x3a,0x04,0x43,0x04,0x4f,0x04,0x5c,0x04,0x5f,0x04,0x93,0x04,0x9b,0x04,0xa3,0x04,0xb1,0x04,0xb7,0x04,0xbb,0x04,0xd9,0x04,0xdf,0x04,0xe9,0x04,0xf5,0x0a,0xea,0x1e,0x85,0x1e,0x9e,0x1e,0xf9,0x20,0x01,0x20,0x0b,\r\n0x20,0x10,0x20,0x14,0x20,0x16,0x20,0x22,0x20,0x24,0x20,0x26,0x20,0x30,0x20,0x34,0x20,0x3a,0x20,0x3f,0x20,0x46,0x20,0x70,0x20,0x79,0x20,0x7a,0x20,0x7c,0x20,0x89,0x20,0xac,0x20,0xae,0x20,0xb4,0x20,0xbd,0x20,0xbf,0x21,0x02,0x21,0x0d,0x21,0x13,0x21,0x16,0x21,0x1a,0x21,0x1d,0x21,0x22,0x21,0x24,0x21,0x2e,0x21,0x40,0x21,0x8b,\r\n0x21,0x99,0x21,0x9e,0x21,0xa0,0x21,0xa3,0x21,0xa7,0x21,0xaa,0x21,0xad,0x21,0xbe,0x21,0xc9,0x21,0xd4,0x21,0xdb,0x21,0xdf,0x21,0xe5,0x21,0xe8,0x21,0xea,0x22,0x0c,0x22,0x13,0x22,0x15,0x22,0x1a,0x22,0x1e,0x22,0x25,0x22,0x2b,0x22,0x39,0x22,0x3c,0x22,0x3e,0x22,0x43,0x22,0x45,0x22,0x49,0x22,0x4b,0x22,0x4d,0x22,0x54,0x22,0x57,\r\n0x22,0x65,0x22,0x73,0x22,0x7c,0x22,0x89,0x22,0x99,0x22,0xa5,0x22,0xb4,0x22,0xb8,0x22,0xbd,0x22,0xc4,0x22,0xc6,0x22,0xca,0x22,0xce,0x22,0xd0,0x22,0xe2,0x22,0xf1,0x23,0x05,0x23,0x0b,0x23,0x18,0x23,0x1f,0x23,0x26,0x23,0x28,0x23,0x2b,0x23,0x7a,0x23,0x8b,0x23,0x95,0x23,0xad,0x23,0xce,0x23,0xfe,0x24,0x21,0x24,0x24,0x25,0x94,\r\n0x25,0x9f,0x25,0xa1,0x25,0xab,0x25,0xcc,0x25,0xcf,0x25,0xd5,0x25,0xe6,0x25,0xeb,0x25,0xef,0x25,0xf6,0x26,0x6d,0x26,0x6f,0x26,0x87,0x26,0xa1,0x27,0x13,0x27,0x15,0x27,0x17,0x27,0x36,0x27,0x71,0x27,0x94,0x27,0x9e,0x27,0xc6,0x27,0xdc,0x27,0xeb,0x27,0xf7,0x29,0x16,0x29,0x4a,0x29,0x88,0x2a,0x00,0x2a,0x06,0x2b,0x58,0xe0,0xa2,\r\n0xe0,0xb3,0xfe,0x62,0xfe,0xff,0xff,0x5b,0xff,0x5d,0xff,0xfd,0xff,0xff,0x00,0x00,0x00,0x0d,0x00,0x20,0x00,0x30,0x00,0x3a,0x00,0xa0,0x01,0x34,0x01,0x8f,0x01,0x92,0x01,0x9b,0x01,0xa0,0x01,0xaf,0x01,0xcd,0x01,0xd0,0x01,0xd2,0x01,0xd4,0x01,0xd6,0x01,0xd8,0x01,0xda,0x01,0xdc,0x01,0xe6,0x01,0xea,0x01,0xf4,0x01,0xfc,0x02,0x18,\r\n0x02,0x32,0x02,0x37,0x02,0x59,0x02,0xb9,0x02,0xbc,0x02,0xc6,0x02,0xc9,0x02,0xd8,0x02,0xf3,0x02,0xf7,0x03,0x00,0x03,0x06,0x03,0x0f,0x03,0x12,0x03,0x1b,0x03,0x23,0x03,0x25,0x03,0x36,0x03,0x74,0x03,0x7e,0x03,0x84,0x03,0x8c,0x03,0x8e,0x03,0x91,0x03,0xa3,0x03,0xaa,0x03,0xb1,0x03,0xca,0x03,0xd5,0x04,0x01,0x04,0x0e,0x04,0x1b,\r\n0x04,0x24,0x04,0x3b,0x04,0x44,0x04,0x51,0x04,0x5e,0x04,0x90,0x04,0x9a,0x04,0xa2,0x04,0xae,0x04,0xb6,0x04,0xba,0x04,0xd8,0x04,0xdc,0x04,0xe4,0x04,0xf4,0x0a,0xea,0x1e,0x80,0x1e,0x9e,0x1e,0xa0,0x20,0x01,0x20,0x0b,0x20,0x10,0x20,0x13,0x20,0x16,0x20,0x18,0x20,0x24,0x20,0x26,0x20,0x30,0x20,0x32,0x20,0x39,0x20,0x3c,0x20,0x44,\r\n0x20,0x70,0x20,0x74,0x20,0x7a,0x20,0x7c,0x20,0x80,0x20,0xab,0x20,0xae,0x20,0xb4,0x20,0xbd,0x20,0xbf,0x21,0x02,0x21,0x0d,0x21,0x13,0x21,0x15,0x21,0x19,0x21,0x1d,0x21,0x22,0x21,0x24,0x21,0x2e,0x21,0x40,0x21,0x8a,0x21,0x90,0x21,0x9d,0x21,0xa0,0x21,0xa2,0x21,0xa5,0x21,0xa9,0x21,0xad,0x21,0xbe,0x21,0xc9,0x21,0xd0,0x21,0xdb,\r\n0x21,0xde,0x21,0xe5,0x21,0xe7,0x21,0xea,0x22,0x00,0x22,0x0e,0x22,0x15,0x22,0x18,0x22,0x1e,0x22,0x23,0x22,0x27,0x22,0x34,0x22,0x3c,0x22,0x3e,0x22,0x43,0x22,0x45,0x22,0x47,0x22,0x4b,0x22,0x4d,0x22,0x54,0x22,0x57,0x22,0x5f,0x22,0x6a,0x22,0x7a,0x22,0x82,0x22,0x8e,0x22,0x9b,0x22,0xb4,0x22,0xb8,0x22,0xbb,0x22,0xc2,0x22,0xc6,\r\n0x22,0xc8,0x22,0xce,0x22,0xd0,0x22,0xe2,0x22,0xee,0x23,0x02,0x23,0x08,0x23,0x18,0x23,0x1c,0x23,0x24,0x23,0x28,0x23,0x2b,0x23,0x36,0x23,0x89,0x23,0x95,0x23,0x9b,0x23,0xce,0x23,0xfb,0x24,0x00,0x24,0x23,0x25,0x00,0x25,0x95,0x25,0xa0,0x25,0xaa,0x25,0xb2,0x25,0xce,0x25,0xd4,0x25,0xe6,0x25,0xe7,0x25,0xef,0x25,0xf6,0x26,0x6d,\r\n0x26,0x6f,0x26,0x87,0x26,0xa0,0x27,0x13,0x27,0x15,0x27,0x17,0x27,0x36,0x27,0x6e,0x27,0x94,0x27,0x9c,0x27,0xc5,0x27,0xdc,0x27,0xe6,0x27,0xf5,0x29,0x16,0x29,0x4a,0x29,0x87,0x2a,0x00,0x2a,0x05,0x2b,0x58,0xe0,0xa0,0xe0,0xb0,0xfe,0x62,0xfe,0xff,0xff,0x5b,0xff,0x5d,0xff,0xfd,0xff,0xff,0x03,0xb3,0x00,0x00,0x02,0xa4,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x36,0xff,0x7a,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x33,0xff,0x53,0xff,0x80,0xff,0x84,0xff,0x7f,0xff,0x7e,0xff,0x7d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xd7,0xfe,0x9a,0x00,0x00,0x03,0xa8,0x03,0xbf,0x03,0x9d,0x00,0x00,0x03,0x10,0x03,0x0d,0x00,0x00,0x00,0x00,\r\n0x03,0x66,0x03,0x64,0x03,0x5c,0x03,0x55,0x03,0x54,0x03,0x47,0x02,0xee,0x00,0x3d,0x00,0x00,0xfe,0xe1,0x00,0x00,0xfe,0xc0,0xfe,0xbf,0x00,0x00,0xfe,0xc4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfd,0xbc,0x00,0x00,0xfd,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x3e,0x00,0x00,0xe1,0xe9,0x00,0x00,0xe3,0xbb,0xe3,0xb2,0xe3,0x4b,0xe3,0x46,0xe3,0x21,0x00,0x00,0xe3,0x17,0xe3,0x07,0xe4,0x09,0x00,0x00,0xe3,0x2e,0x00,0x00,0x00,0x00,0xe2,0x92,0xe2,0x92,0xe3,0xc1,0xe3,0x6a,0xe2,0x64,0xe3,0x1b,0xe3,0x1e,0xe3,0x15,0xe3,0x0d,0xe3,0x03,0xe1,0xa0,0xe1,0x9a,\r\n0xe4,0xae,0x00,0x00,0xe1,0x96,0xe1,0x94,0xe4,0x98,0xe1,0x95,0xe4,0x96,0xe3,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xde,0xe2,0xdd,0xe2,0xdc,0xe2,0xdc,0xe2,0xcf,0xe2,0xc9,0xe2,0xbf,0x00,0x00,0xe2,0xb3,0x00,0x00,0xe2,0x9f,0xe2,0xa8,0xe3,0xf8,0x00,0x00,0x00,0x00,0xe1,0xc8,0x00,0x00,0xe2,0x06,0x00,0x00,0xe1,0xff,0x00,0x00,\r\n0xe2,0x12,0xe1,0xaf,0xe1,0x8d,0xe1,0x92,0x00,0x00,0xe2,0x19,0xe1,0x9b,0xe1,0x81,0xe1,0xf5,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe1,0x54,0xe1,0x44,0x00,0x00,0x00,0x00,0xe1,0x93,0x00,0x00,0xe1,0x0c,0xe1,0x10,0xe1,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0xe2,0xd1,0x00,0x00,0x00,0x00,0xe2,0xbd,0xe2,0xb8,\r\n0x00,0x00,0x00,0x00,0xe1,0xf0,0x00,0x00,0xe2,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xdf,0x17,0xdf,0x28,0xdf,0x20,0x00,0x00,0x00,0x00,0xde,0xe9,0xde,0xdd,0xde,0xe5,0xde,0xcd,0xde,0xc9,0xdf,0xf3,0xdf,0xf2,0xdf,0x24,0xdf,0x0c,0xde,0x9b,0xde,0x9a,0xde,0x99,0xde,0x7b,0x00,0x00,0xdc,0xff,0xdc,0xf8,0x00,0x00,0xdc,0x13,\r\n0x00,0x00,0xdc,0xa2,0xdb,0x2d,0xda,0xa4,0xd9,0xce,0xd9,0xfe,0xd9,0xfa,0xda,0x99,0x26,0x24,0x26,0x17,0x05,0xd8,0x04,0xc2,0x03,0xee,0x03,0xed,0x05,0xf9,0x00,0x01,0x00,0x00,0x01,0xa6,0x00,0x00,0x01,0xc2,0x02,0x4a,0x03,0x6c,0x04,0x02,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xf8,0x03,0xfa,0x03,0xfc,0x03,0xfe,0x04,0x04,0x04,0x0a,0x00,0x00,0x00,0x00,0x04,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x00,0x00,0x00,0x00,0x04,0x0a,0x04,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x0e,0x00,0x00,0x04,0x18,0x00,0x00,\r\n0x00,0x00,0x04,0x18,0x00,0x00,0x04,0x22,0x04,0x2c,0x04,0x30,0x04,0x46,0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x86,0x04,0x9c,0x04,0xb2,0x04,0xb4,0x04,0xba,0x04,0xbc,0x04,0xbe,0x04,0xc4,0x04,0xc6,0x04,0xc8,0x04,0xca,0x04,0xd0,0x04,0xda,0x00,0x00,0x04,0xda,0x00,0x00,0x04,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x05,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x98,0x00,0x00,0x05,0x9a,0x05,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x8a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x80,0x05,0x82,0x05,0x94,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x88,0x00,0x00,0x05,0x8e,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x8a,0x05,0xa2,0x00,0x00,0x05,0xaa,0x00,0x00,0x05,0xac,0x00,0x00,0x05,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xb0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0xac,0x05,0xb8,0x05,0xca,\r\n0x05,0xce,0x05,0xdc,0x05,0xf2,0x00,0x00,0x00,0x00,0x06,0x02,0x06,0x06,0x00,0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x06,0x0c,0x06,0x12,0x00,0x00,0x06,0x16,0x06,0x1c,0x00,0x00,0x00,0x00,0x06,0x1c,0x06,0xa4,0x00,0x00,0x06,0xa6,0x00,0x00,0x06,0xc8,0x06,0xce,0x07,0x10,0x07,0x12,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x08,0x34,0x08,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x50,0x00,0x00,0x00,0x00,0x08,0x52,0x00,0x00,0x08,0x52,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xbe,0x03,0x2e,0x03,0x6a,0x03,0x3a,0x03,0xc5,0x04,0x38,0x05,0xb5,0x03,0x6b,0x03,0x43,0x03,0x44,0x03,0x34,0x04,0x15,0x03,0x2a,0x03,0x57,0x03,0x29,0x03,0x3d,0x03,0x2b,0x03,0x2c,0x04,0x1c,0x04,0x19,0x04,0x1b,0x03,0x30,0x05,0xb4,0x00,0x01,0x00,0x1a,0x00,0x1b,0x00,0x21,0x00,0x25,\r\n0x00,0x38,0x00,0x39,0x00,0x40,0x00,0x43,0x00,0x4f,0x00,0x51,0x00,0x53,0x00,0x59,0x00,0x5a,0x00,0x60,0x00,0x7a,0x00,0x7c,0x00,0x7d,0x00,0x81,0x00,0x89,0x00,0x8e,0x00,0xa1,0x00,0xa2,0x00,0xa7,0x00,0xa8,0x00,0xb1,0x03,0x47,0x03,0x3e,0x03,0x48,0x04,0x23,0x03,0x5c,0x06,0x82,0x00,0xbd,0x00,0xd6,0x00,0xd7,0x00,0xdd,0x00,0xe1,\r\n0x00,0xf4,0x00,0xf5,0x00,0xfc,0x00,0xff,0x01,0x0d,0x01,0x10,0x01,0x13,0x01,0x1a,0x01,0x1b,0x01,0x22,0x01,0x3d,0x01,0x3f,0x01,0x40,0x01,0x44,0x01,0x4c,0x01,0x51,0x01,0x69,0x01,0x6a,0x01,0x6f,0x01,0x70,0x01,0x79,0x03,0x45,0x05,0xbe,0x03,0x46,0x04,0x22,0x03,0xbf,0x03,0x2f,0x03,0xc3,0x03,0xcb,0x03,0xc4,0x03,0xcd,0x05,0xbf,\r\n0x05,0xb7,0x06,0x80,0x05,0xb8,0x01,0xc6,0x03,0x65,0x04,0x21,0x03,0x58,0x05,0xb9,0x06,0x8a,0x05,0xbb,0x04,0x1f,0x03,0x04,0x03,0x05,0x06,0x83,0x04,0x30,0x05,0xb6,0x03,0x32,0x06,0x8b,0x03,0x03,0x01,0xc7,0x03,0x66,0x03,0x22,0x03,0x21,0x03,0x23,0x03,0x31,0x00,0x12,0x00,0x02,0x00,0x0a,0x00,0x17,0x00,0x10,0x00,0x16,0x00,0x18,\r\n0x00,0x1e,0x00,0x32,0x00,0x26,0x00,0x29,0x00,0x2f,0x00,0x4a,0x00,0x44,0x00,0x46,0x00,0x47,0x00,0x22,0x00,0x5f,0x00,0x6b,0x00,0x61,0x00,0x63,0x00,0x78,0x00,0x69,0x04,0x17,0x00,0x76,0x00,0x94,0x00,0x8f,0x00,0x91,0x00,0x92,0x00,0xa9,0x00,0x7b,0x01,0x4a,0x00,0xce,0x00,0xbe,0x00,0xc6,0x00,0xd3,0x00,0xcc,0x00,0xd2,0x00,0xd4,\r\n0x00,0xda,0x00,0xee,0x00,0xe2,0x00,0xe5,0x00,0xeb,0x01,0x08,0x01,0x01,0x01,0x04,0x01,0x05,0x00,0xde,0x01,0x21,0x01,0x2e,0x01,0x23,0x01,0x26,0x01,0x3b,0x01,0x2c,0x04,0x18,0x01,0x39,0x01,0x5c,0x01,0x52,0x01,0x55,0x01,0x56,0x01,0x71,0x01,0x3e,0x01,0x73,0x00,0x14,0x00,0xd0,0x00,0x03,0x00,0xbf,0x00,0x15,0x00,0xd1,0x00,0x1c,\r\n0x00,0xd8,0x00,0x1f,0x00,0xdb,0x00,0x20,0x00,0xdc,0x00,0x1d,0x00,0xd9,0x00,0x23,0x00,0xdf,0x00,0x24,0x00,0xe0,0x00,0x34,0x00,0xf0,0x00,0x27,0x00,0xe3,0x00,0x30,0x00,0xec,0x00,0x35,0x00,0xf1,0x00,0x28,0x00,0xe4,0x00,0x3d,0x00,0xf9,0x00,0x3b,0x00,0xf7,0x00,0x3f,0x00,0xfb,0x00,0x3e,0x00,0xfa,0x00,0x42,0x00,0xfe,0x00,0x41,\r\n0x00,0xfd,0x00,0x4e,0x01,0x0c,0x00,0x4c,0x01,0x0a,0x00,0x45,0x01,0x02,0x00,0x4d,0x01,0x0b,0x00,0x48,0x01,0x00,0x00,0x50,0x01,0x0f,0x00,0x52,0x01,0x11,0x01,0x12,0x00,0x54,0x01,0x14,0x00,0x56,0x01,0x17,0x00,0x55,0x01,0x16,0x00,0x57,0x01,0x18,0x00,0x58,0x01,0x19,0x00,0x5b,0x01,0x1c,0x00,0x5d,0x01,0x1f,0x00,0x5c,0x01,0x1e,\r\n0x01,0x1d,0x00,0x5e,0x01,0x20,0x00,0x74,0x01,0x37,0x00,0x62,0x01,0x24,0x00,0x73,0x01,0x36,0x00,0x79,0x01,0x3c,0x00,0x7e,0x01,0x41,0x00,0x80,0x01,0x43,0x00,0x7f,0x01,0x42,0x00,0x82,0x01,0x45,0x00,0x85,0x01,0x48,0x00,0x84,0x01,0x47,0x00,0x83,0x01,0x46,0x00,0x8c,0x01,0x4f,0x00,0x8b,0x01,0x4e,0x00,0x8a,0x01,0x4d,0x00,0xa0,\r\n0x01,0x68,0x00,0x9d,0x01,0x65,0x00,0x90,0x01,0x53,0x00,0x9f,0x01,0x67,0x00,0x9c,0x01,0x64,0x00,0x9e,0x01,0x66,0x00,0xa4,0x01,0x6c,0x00,0xaa,0x01,0x72,0x00,0xab,0x00,0xb2,0x01,0x7a,0x00,0xb4,0x01,0x7c,0x00,0xb3,0x01,0x7b,0x01,0x4b,0x00,0x88,0x00,0x36,0x00,0x6d,0x01,0x30,0x00,0x96,0x01,0x5e,0x00,0x09,0x00,0xc5,0x00,0x3c,\r\n0x00,0xf8,0x00,0x75,0x01,0x38,0x00,0x3a,0x00,0xf6,0x00,0x19,0x00,0xd5,0x00,0x77,0x01,0x3a,0x00,0x86,0x01,0x49,0x00,0x8d,0x01,0x50,0x00,0xaf,0x01,0x77,0x06,0x67,0x06,0x65,0x06,0x87,0x06,0x81,0x06,0x88,0x06,0x8c,0x06,0x89,0x06,0x84,0x06,0x6a,0x06,0x6b,0x06,0x6e,0x06,0x72,0x06,0x73,0x06,0x70,0x06,0x69,0x06,0x68,0x06,0x74,\r\n0x06,0x71,0x06,0x6c,0x06,0x6f,0x06,0xb0,0x06,0xb2,0x02,0x69,0x03,0xba,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6e,0x02,0x6f,0x02,0x90,0x02,0x70,0x02,0x71,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x8e,0x02,0x93,0x02,0x8f,0x02,0x92,0x02,0x94,0x02,0x91,0x02,0x95,0x02,0x72,0x02,0x9a,0x02,0x9b,0x02,0x99,0x01,0xd0,0x01,0xf6,0x01,0xcc,\r\n0x01,0xee,0x01,0xed,0x01,0xf0,0x01,0xf1,0x01,0xf2,0x01,0xeb,0x01,0xec,0x01,0xf3,0x01,0xd6,0x01,0xe0,0x01,0xe7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xce,0x01,0xcf,0x01,0xd1,0x01,0xd2,0x01,0xd3,0x01,0xd4,0x01,0xd5,0x01,0xe1,0x01,0xe2,0x01,0xe4,0x01,0xe3,0x01,0xe5,0x01,0xe6,0x01,0xe9,0x01,0xea,0x01,0xe8,0x01,0xef,\r\n0x01,0xf4,0x01,0xf5,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x12,0x02,0x13,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x25,0x02,0x26,0x02,0x28,0x02,0x27,0x02,0x29,0x02,0x2a,0x02,0x2d,0x02,0x2e,0x02,0x2c,0x02,0x33,0x02,0x38,0x02,0x39,0x02,0x14,0x02,0x3a,0x02,0x10,0x02,0x32,0x02,0x31,0x02,0x34,0x02,0x35,\r\n0x02,0x36,0x02,0x2f,0x02,0x30,0x02,0x37,0x02,0x1a,0x02,0x24,0x02,0x2b,0x01,0xcd,0x02,0x11,0x01,0xf7,0x02,0x3b,0x01,0xf8,0x02,0x3c,0x01,0xf9,0x02,0x3d,0x01,0xfa,0x02,0x3e,0x01,0xfb,0x02,0x3f,0x01,0xfc,0x02,0x40,0x01,0xfd,0x02,0x41,0x01,0xfe,0x02,0x42,0x01,0xff,0x02,0x43,0x02,0x00,0x02,0x44,0x02,0x01,0x02,0x45,0x02,0x02,\r\n0x02,0x46,0x02,0x03,0x02,0x47,0x02,0x04,0x02,0x48,0x00,0xa6,0x01,0x6e,0x00,0xa3,0x01,0x6b,0x00,0xa5,0x01,0x6d,0x00,0x11,0x00,0xcd,0x00,0x13,0x00,0xcf,0x00,0x0b,0x00,0xc7,0x00,0x0d,0x00,0xc9,0x00,0x0e,0x00,0xca,0x00,0x0f,0x00,0xcb,0x00,0x0c,0x00,0xc8,0x00,0x04,0x00,0xc0,0x00,0x06,0x00,0xc2,0x00,0x07,0x00,0xc3,0x00,0x08,\r\n0x00,0xc4,0x00,0x05,0x00,0xc1,0x00,0x31,0x00,0xed,0x00,0x33,0x00,0xef,0x00,0x37,0x00,0xf2,0x00,0x2a,0x00,0xe6,0x00,0x2c,0x00,0xe8,0x00,0x2d,0x00,0xe9,0x00,0x2e,0x00,0xea,0x00,0x2b,0x00,0xe7,0x00,0x4b,0x01,0x09,0x00,0x49,0x01,0x07,0x00,0x6a,0x01,0x2d,0x00,0x6c,0x01,0x2f,0x00,0x64,0x01,0x27,0x00,0x66,0x01,0x29,0x00,0x67,\r\n0x01,0x2a,0x00,0x68,0x01,0x2b,0x00,0x65,0x01,0x28,0x00,0x6e,0x01,0x31,0x00,0x70,0x01,0x33,0x00,0x71,0x01,0x34,0x00,0x72,0x01,0x35,0x00,0x6f,0x01,0x32,0x00,0x93,0x01,0x5b,0x00,0x95,0x01,0x5d,0x00,0x97,0x01,0x5f,0x00,0x99,0x01,0x61,0x00,0x9a,0x01,0x62,0x00,0x9b,0x01,0x63,0x00,0x98,0x01,0x60,0x00,0xad,0x01,0x75,0x00,0xac,\r\n0x01,0x74,0x00,0xae,0x01,0x76,0x00,0xb0,0x01,0x78,0x03,0x61,0x03,0x62,0x03,0x5d,0x03,0x63,0x03,0x5f,0x03,0x60,0x03,0x5e,0x03,0x64,0x05,0xc0,0x05,0xc2,0x03,0x33,0x05,0xbc,0x05,0xbd,0x03,0x69,0x03,0x38,0x03,0x39,0x03,0x3c,0x03,0x3f,0x03,0x20,0x03,0x35,0x03,0x36,0x02,0xad,0x05,0xc3,0x05,0xff,0x05,0xfe,0x04,0x77,0x04,0x71,\r\n0x04,0x73,0x04,0x75,0x04,0x79,0x04,0x7a,0x04,0x78,0x04,0x72,0x04,0x74,0x04,0x76,0x04,0x7b,0x04,0x7d,0x04,0x8c,0x04,0x89,0x04,0x8a,0x04,0x8b,0x04,0x8d,0x05,0xe8,0x05,0xe7,0x04,0x65,0x03,0xd6,0x04,0x2f,0x03,0xea,0x04,0x62,0x04,0x25,0x04,0x2b,0x03,0xeb,0x03,0xe2,0x04,0x0b,0x03,0xe3,0x04,0x5d,0x04,0x0a,0x03,0xe5,0x04,0x2c,\r\n0x03,0xd8,0x04,0x2d,0x04,0x16,0x03,0xf9,0x04,0x4d,0x03,0xd4,0x04,0x2e,0x03,0xdc,0x03,0xde,0x04,0x31,0x04,0x63,0x03,0xd1,0x04,0x40,0x04,0x3e,0x03,0xdf,0x03,0xe9,0x04,0x04,0x04,0x20,0x04,0x09,0x04,0x3f,0x04,0x1a,0x03,0xe7,0x04,0x0f,0x04,0x5a,0x04,0x1e,0x04,0x1d,0x03,0xfb,0x03,0xfa,0x03,0xd2,0x04,0x0c,0x04,0x10,0x04,0x0d,\r\n0x04,0x11,0x04,0x0e,0x03,0xf7,0x03,0xec,0x04,0x3c,0x04,0x5c,0x04,0x3d,0x04,0x5b,0x04,0x5f,0x04,0x13,0x04,0x14,0x04,0x41,0x04,0x42,0x04,0x05,0x04,0x06,0x03,0xfd,0x04,0x55,0x04,0x57,0x04,0x56,0x04,0x58,0x04,0x4f,0x04,0x50,0x04,0x70,0x04,0x6d,0x04,0x6e,0x04,0x6c,0x04,0x6f,0x04,0x69,0x04,0x6b,0x04,0x6a,0x04,0x53,0x04,0x52,\r\n0x04,0x54,0x04,0x51,0x04,0x4b,0x04,0x61,0x04,0x60,0x04,0x67,0x04,0x68,0x04,0x01,0x04,0x07,0x04,0x02,0x04,0x03,0x03,0xdb,0x03,0xd3,0x03,0xf3,0x04,0x47,0x03,0xe4,0x03,0xf8,0x04,0x66,0x03,0xe1,0x05,0xe1,0x05,0xca,0x04,0x91,0x05,0xf4,0x03,0x4f,0x03,0x52,0x03,0x50,0x03,0x53,0x05,0xce,0x05,0xcd,0x05,0xcb,0x05,0xcc,0x04,0x92,\r\n0x05,0xe6,0x05,0xe4,0x05,0x65,0x05,0xa0,0x05,0x8f,0x05,0x8c,0x05,0x8b,0x05,0x91,0x05,0x87,0x05,0x6d,0x05,0x6b,0x05,0x9f,0x05,0x68,0x05,0x97,0x05,0x86,0x05,0x93,0x05,0x90,0x05,0x82,0x05,0x9d,0x05,0x92,0x05,0x96,0x05,0x69,0x05,0x79,0x05,0x72,0x05,0x8e,0x05,0x8a,0x05,0x78,0x05,0xa9,0x05,0x98,0x05,0xa8,0x05,0x71,0x05,0x99,\r\n0x05,0x89,0x05,0xa7,0x05,0x7a,0x05,0x8d,0x05,0x9b,0x05,0x73,0x05,0x75,0x05,0x80,0x05,0x6e,0x05,0xa5,0x05,0x9a,0x05,0x6c,0x05,0x88,0x05,0xa6,0x05,0x70,0x05,0xa1,0x05,0x7f,0x05,0x6a,0x05,0x77,0x05,0x81,0x05,0xa3,0x05,0x7c,0x05,0x6f,0x05,0x74,0x05,0xaa,0x05,0xa2,0x05,0x9e,0x05,0x94,0x05,0x95,0x05,0x76,0x05,0xa4,0x05,0x7d,\r\n0x05,0x9c,0x05,0x83,0x05,0x67,0x05,0x7b,0x05,0x7e,0x05,0x84,0x05,0x66,0x05,0xe0,0x05,0xd5,0x05,0xc7,0x04,0x34,0x04,0x32,0x04,0x33,0x04,0x37,0x04,0x35,0x04,0x36,0x03,0xf6,0x03,0xf4,0x03,0xf5,0x04,0x4a,0x04,0x48,0x04,0x49,0x03,0xf2,0x03,0xf1,0x03,0xf0,0x03,0xd9,0x04,0x46,0x04,0x45,0x04,0x44,0x05,0xef,0x05,0xf0,0x05,0xf2,\r\n0x05,0xf3,0x05,0xee,0x05,0xfa,0x05,0xfb,0x05,0xd7,0x05,0xd8,0x05,0xda,0x05,0xb2,0x05,0xc5,0x05,0xb3,0x05,0xdf,0x05,0xeb,0x06,0x01,0x05,0xdd,0x05,0xc9,0x05,0xf8,0x05,0xf7,0x05,0xcf,0x05,0xd2,0x05,0xd4,0x05,0xd3,0x05,0xd1,0x05,0xec,0x05,0xfd,0x05,0xd9,0x05,0xc8,0x05,0xd6,0x05,0xfc,0x05,0xdb,0x05,0xdc,0x05,0xde,0x05,0xf5,\r\n0x06,0x00,0x05,0xf9,0x05,0xd0,0x05,0xc6,0x05,0xed,0x05,0x2e,0x05,0x08,0x05,0x3b,0x05,0x15,0x05,0x34,0x05,0x0e,0x05,0x35,0x05,0x0f,0x05,0x31,0x05,0x0b,0x05,0x32,0x05,0x0c,0x05,0x2d,0x04,0xfc,0x04,0xf6,0x05,0x07,0x05,0x2c,0x04,0xfa,0x04,0xf4,0x05,0x06,0x05,0x3a,0x05,0x55,0x05,0x4f,0x05,0x14,0x05,0x39,0x05,0x53,0x05,0x4d,\r\n0x05,0x12,0x05,0x3e,0x05,0x61,0x05,0x4e,0x04,0xf7,0x05,0x5e,0x04,0xfd,0x05,0x54,0x05,0x18,0x05,0x3d,0x05,0x60,0x05,0x4c,0x04,0xf5,0x05,0x5d,0x04,0xfb,0x05,0x52,0x05,0x17,0x05,0x2b,0x05,0x1a,0x05,0x40,0x04,0xf9,0x04,0xf3,0x05,0x43,0x05,0x1d,0x05,0x05,0x05,0x38,0x05,0x1b,0x05,0x41,0x05,0x51,0x05,0x4b,0x05,0x44,0x05,0x1e,\r\n0x05,0x11,0x05,0x3c,0x05,0x1c,0x05,0x42,0x05,0x5f,0x05,0x4a,0x04,0xf8,0x05,0x5c,0x05,0x20,0x05,0x46,0x05,0x19,0x05,0x3f,0x04,0xfe,0x05,0x50,0x05,0x45,0x05,0x1f,0x05,0x16,0x05,0x28,0x05,0x02,0x05,0x29,0x05,0x03,0x04,0xe8,0x04,0xec,0x05,0x01,0x04,0xf2,0x04,0xe7,0x05,0x00,0x04,0xf1,0x04,0xe6,0x05,0x58,0x05,0x49,0x04,0xeb,\r\n0x05,0x57,0x05,0x48,0x04,0xea,0x05,0x64,0x05,0x5b,0x04,0xef,0x05,0x63,0x05,0x5a,0x04,0xee,0x04,0xff,0x04,0xf0,0x04,0xe5,0x05,0x56,0x05,0x47,0x04,0xe9,0x05,0x62,0x05,0x59,0x04,0xed,0x05,0x22,0x05,0x21,0x05,0x23,0x05,0x24,0x05,0x27,0x05,0x26,0x05,0x25,0x05,0x2f,0x05,0x36,0x05,0x33,0x05,0x2a,0x05,0x09,0x05,0x10,0x05,0x0d,\r\n0x05,0x04,0x05,0x30,0x05,0x37,0x05,0x0a,0x05,0x13,0x04,0xa2,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xaa,0x04,0xa9,0x04,0xa8,0x04,0xa7,0x04,0xa6,0x04,0xa5,0x04,0xa4,0x04,0xab,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xa3,0x04,0xd1,0x04,0xd5,0x04,0xdd,0x04,0xe1,0x04,0xd2,0x04,0xd6,\r\n0x04,0xde,0x04,0xe2,0x04,0xd9,0x04,0xdb,0x04,0xd3,0x04,0xd7,0x04,0xdf,0x04,0xe3,0x04,0xd4,0x04,0xd8,0x04,0xe0,0x04,0xe4,0x04,0xda,0x04,0xdc,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc1,0x04,0xc7,0x04,0xbb,0x04,0xc0,0x04,0xc2,0x04,0xba,0x03,0x4c,0x03,0x4e,0x03,0x4b,0x03,0x4d,0x03,0x51,0x03,0x54,0x03,0xb6,0x03,0xb9,0x03,0xb4,\r\n0x03,0xb7,0x03,0xb5,0x03,0xb8,0x00,0x0c,0x00,0x00,0x00,0x00,0x33,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x46,0x00,0x00,0x00,0x0d,0x00,0x00,0x00,0x0d,0x00,0x00,0x03,0xc0,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x00,0x00,0x03,0xbe,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x21,0x00,0x00,0x03,0x2e,0x00,0x00,0x00,0x22,0x00,0x00,\r\n0x00,0x22,0x00,0x00,0x03,0x6a,0x00,0x00,0x00,0x23,0x00,0x00,0x00,0x23,0x00,0x00,0x03,0x3a,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x03,0xc5,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x25,0x00,0x00,0x04,0x38,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0x26,0x00,0x00,0x05,0xb5,0x00,0x00,0x00,0x27,0x00,0x00,0x00,0x27,0x00,0x00,\r\n0x03,0x6b,0x00,0x00,0x00,0x28,0x00,0x00,0x00,0x29,0x00,0x00,0x03,0x43,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x03,0x34,0x00,0x00,0x00,0x2b,0x00,0x00,0x00,0x2b,0x00,0x00,0x04,0x15,0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x2c,0x00,0x00,0x03,0x2a,0x00,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x00,0x00,0x03,0x57,0x00,0x00,\r\n0x00,0x2e,0x00,0x00,0x00,0x2e,0x00,0x00,0x03,0x29,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x2f,0x00,0x00,0x03,0x3d,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x39,0x00,0x00,0x02,0xd4,0x00,0x00,0x00,0x3a,0x00,0x00,0x00,0x3b,0x00,0x00,0x03,0x2b,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x3c,0x00,0x00,0x04,0x1c,0x00,0x00,0x00,0x3d,0x00,0x00,\r\n0x00,0x3d,0x00,0x00,0x04,0x19,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x3e,0x00,0x00,0x04,0x1b,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x3f,0x00,0x00,0x03,0x30,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x05,0xb4,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x41,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x00,0x00,0x43,0x00,0x00,\r\n0x00,0x1a,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x45,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x47,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x49,0x00,0x00,0x00,0x43,0x00,0x00,\r\n0x00,0x4a,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x4b,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x4c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x4d,0x00,0x00,0x00,0x4e,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x50,0x00,0x00,\r\n0x00,0x50,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x51,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x53,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x00,0x00,0x00,0x89,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x8e,0x00,0x00,0x00,0x56,0x00,0x00,0x00,0x57,0x00,0x00,\r\n0x00,0xa1,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0x5a,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0x5b,0x00,0x00,0x00,0x5b,0x00,0x00,0x03,0x47,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x5c,0x00,0x00,0x03,0x3e,0x00,0x00,0x00,0x5d,0x00,0x00,0x00,0x5d,0x00,0x00,0x03,0x48,0x00,0x00,\r\n0x00,0x5e,0x00,0x00,0x00,0x5e,0x00,0x00,0x04,0x23,0x00,0x00,0x00,0x5f,0x00,0x00,0x00,0x5f,0x00,0x00,0x03,0x5c,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x60,0x00,0x00,0x06,0x82,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x64,0x00,0x00,\r\n0x00,0x64,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0x66,0x00,0x00,0x00,0x67,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xfc,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0x69,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x6a,0x00,0x00,0x00,0x6a,0x00,0x00,\r\n0x01,0x0d,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x6b,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x6c,0x00,0x00,0x00,0x6c,0x00,0x00,0x01,0x13,0x00,0x00,0x00,0x6d,0x00,0x00,0x00,0x6e,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x6f,0x00,0x00,0x00,0x6f,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x01,0x3d,0x00,0x00,\r\n0x00,0x71,0x00,0x00,0x00,0x72,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x73,0x00,0x00,0x00,0x73,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x74,0x00,0x00,0x00,0x74,0x00,0x00,0x01,0x4c,0x00,0x00,0x00,0x75,0x00,0x00,0x00,0x75,0x00,0x00,0x01,0x51,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x77,0x00,0x00,0x01,0x69,0x00,0x00,0x00,0x78,0x00,0x00,\r\n0x00,0x79,0x00,0x00,0x01,0x6f,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x7a,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0x7b,0x00,0x00,0x03,0x45,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x7c,0x00,0x00,0x05,0xbe,0x00,0x00,0x00,0x7d,0x00,0x00,0x00,0x7d,0x00,0x00,0x03,0x46,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x7e,0x00,0x00,\r\n0x04,0x22,0x00,0x00,0x00,0xa0,0x00,0x00,0x00,0xa0,0x00,0x00,0x03,0xbf,0x00,0x00,0x00,0xa1,0x00,0x00,0x00,0xa1,0x00,0x00,0x03,0x2f,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0xa2,0x00,0x00,0x03,0xc3,0x00,0x00,0x00,0xa3,0x00,0x00,0x00,0xa3,0x00,0x00,0x03,0xcb,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0xa4,0x00,0x00,0x03,0xc4,0x00,0x00,\r\n0x00,0xa5,0x00,0x00,0x00,0xa5,0x00,0x00,0x03,0xcd,0x00,0x00,0x00,0xa6,0x00,0x00,0x00,0xa6,0x00,0x00,0x05,0xbf,0x00,0x00,0x00,0xa7,0x00,0x00,0x00,0xa7,0x00,0x00,0x05,0xb7,0x00,0x00,0x00,0xa8,0x00,0x00,0x00,0xa8,0x00,0x00,0x06,0x80,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xa9,0x00,0x00,0x05,0xb8,0x00,0x00,0x00,0xaa,0x00,0x00,\r\n0x00,0xaa,0x00,0x00,0x01,0xc6,0x00,0x00,0x00,0xab,0x00,0x00,0x00,0xab,0x00,0x00,0x03,0x65,0x00,0x00,0x00,0xac,0x00,0x00,0x00,0xac,0x00,0x00,0x04,0x21,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0xad,0x00,0x00,0x03,0x58,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x05,0xb9,0x00,0x00,0x00,0xaf,0x00,0x00,0x00,0xaf,0x00,0x00,\r\n0x06,0x8a,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0xb0,0x00,0x00,0x05,0xbb,0x00,0x00,0x00,0xb1,0x00,0x00,0x00,0xb1,0x00,0x00,0x04,0x1f,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0xb3,0x00,0x00,0x03,0x04,0x00,0x00,0x00,0xb4,0x00,0x00,0x00,0xb4,0x00,0x00,0x06,0x83,0x00,0x00,0x00,0xb5,0x00,0x00,0x00,0xb5,0x00,0x00,0x04,0x30,0x00,0x00,\r\n0x00,0xb6,0x00,0x00,0x00,0xb6,0x00,0x00,0x05,0xb6,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0xb7,0x00,0x00,0x03,0x32,0x00,0x00,0x00,0xb8,0x00,0x00,0x00,0xb8,0x00,0x00,0x06,0x8b,0x00,0x00,0x00,0xb9,0x00,0x00,0x00,0xb9,0x00,0x00,0x03,0x03,0x00,0x00,0x00,0xba,0x00,0x00,0x00,0xba,0x00,0x00,0x01,0xc7,0x00,0x00,0x00,0xbb,0x00,0x00,\r\n0x00,0xbb,0x00,0x00,0x03,0x66,0x00,0x00,0x00,0xbc,0x00,0x00,0x00,0xbc,0x00,0x00,0x03,0x22,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0xbd,0x00,0x00,0x03,0x21,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xbe,0x00,0x00,0x03,0x23,0x00,0x00,0x00,0xbf,0x00,0x00,0x00,0xbf,0x00,0x00,0x03,0x31,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0xc0,0x00,0x00,\r\n0x00,0x12,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0xc1,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x0a,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0xc3,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0xc4,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0xc5,0x00,0x00,0x00,0x16,0x00,0x00,\r\n0x00,0xc6,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0xc7,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0xc8,0x00,0x00,0x00,0x32,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x26,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0xca,0x00,0x00,0x00,0x29,0x00,0x00,0x00,0xcb,0x00,0x00,\r\n0x00,0xcb,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x4a,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0xcd,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xcf,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x22,0x00,0x00,0x00,0xd1,0x00,0x00,0x00,0xd1,0x00,0x00,\r\n0x00,0x5f,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0x61,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0x63,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0xd6,0x00,0x00,0x00,0x69,0x00,0x00,\r\n0x00,0xd7,0x00,0x00,0x00,0xd7,0x00,0x00,0x04,0x17,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0xd8,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x94,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0xda,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0xdb,0x00,0x00,0x00,0xdc,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0xdd,0x00,0x00,\r\n0x00,0xdd,0x00,0x00,0x00,0xa9,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0x7b,0x00,0x00,0x00,0xdf,0x00,0x00,0x00,0xdf,0x00,0x00,0x01,0x4a,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xe1,0x00,0x00,0x00,0xbe,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xe2,0x00,0x00,\r\n0x00,0xc6,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xe3,0x00,0x00,0x00,0xd3,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xe6,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xe7,0x00,0x00,0x00,0xda,0x00,0x00,\r\n0x00,0xe8,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe9,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xea,0x00,0x00,0x00,0xe5,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0xec,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0xed,0x00,0x00,\r\n0x00,0xed,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xee,0x00,0x00,0x00,0xef,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xde,0x00,0x00,0x00,0xf1,0x00,0x00,0x00,0xf1,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0xf2,0x00,0x00,0x00,0xf2,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0xf3,0x00,0x00,\r\n0x01,0x23,0x00,0x00,0x00,0xf4,0x00,0x00,0x00,0xf4,0x00,0x00,0x01,0x26,0x00,0x00,0x00,0xf5,0x00,0x00,0x00,0xf5,0x00,0x00,0x01,0x3b,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0xf6,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0xf7,0x00,0x00,0x00,0xf7,0x00,0x00,0x04,0x18,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x00,0x00,0x01,0x39,0x00,0x00,\r\n0x00,0xf9,0x00,0x00,0x00,0xf9,0x00,0x00,0x01,0x5c,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0xfa,0x00,0x00,0x01,0x52,0x00,0x00,0x00,0xfb,0x00,0x00,0x00,0xfc,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0xfd,0x00,0x00,0x01,0x71,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x3e,0x00,0x00,0x00,0xff,0x00,0x00,\r\n0x00,0xff,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x14,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x01,0x00,0x00,0x00,0xd0,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0x03,0x00,0x00,0x00,0xbf,0x00,0x00,0x01,0x04,0x00,0x00,0x01,0x04,0x00,0x00,\r\n0x00,0x15,0x00,0x00,0x01,0x05,0x00,0x00,0x01,0x05,0x00,0x00,0x00,0xd1,0x00,0x00,0x01,0x06,0x00,0x00,0x01,0x06,0x00,0x00,0x00,0x1c,0x00,0x00,0x01,0x07,0x00,0x00,0x01,0x07,0x00,0x00,0x00,0xd8,0x00,0x00,0x01,0x08,0x00,0x00,0x01,0x08,0x00,0x00,0x00,0x1f,0x00,0x00,0x01,0x09,0x00,0x00,0x01,0x09,0x00,0x00,0x00,0xdb,0x00,0x00,\r\n0x01,0x0a,0x00,0x00,0x01,0x0a,0x00,0x00,0x00,0x20,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x0b,0x00,0x00,0x00,0xdc,0x00,0x00,0x01,0x0c,0x00,0x00,0x01,0x0c,0x00,0x00,0x00,0x1d,0x00,0x00,0x01,0x0d,0x00,0x00,0x01,0x0d,0x00,0x00,0x00,0xd9,0x00,0x00,0x01,0x0e,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x23,0x00,0x00,0x01,0x0f,0x00,0x00,\r\n0x01,0x0f,0x00,0x00,0x00,0xdf,0x00,0x00,0x01,0x10,0x00,0x00,0x01,0x10,0x00,0x00,0x00,0x24,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x11,0x00,0x00,0x00,0xe0,0x00,0x00,0x01,0x12,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x34,0x00,0x00,0x01,0x13,0x00,0x00,0x01,0x13,0x00,0x00,0x00,0xf0,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x14,0x00,0x00,\r\n0x00,0x27,0x00,0x00,0x01,0x15,0x00,0x00,0x01,0x15,0x00,0x00,0x00,0xe3,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x16,0x00,0x00,0x00,0x30,0x00,0x00,0x01,0x17,0x00,0x00,0x01,0x17,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0x18,0x00,0x00,0x00,0x35,0x00,0x00,0x01,0x19,0x00,0x00,0x01,0x19,0x00,0x00,0x00,0xf1,0x00,0x00,\r\n0x01,0x1a,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x28,0x00,0x00,0x01,0x1b,0x00,0x00,0x01,0x1b,0x00,0x00,0x00,0xe4,0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x1c,0x00,0x00,0x00,0x3d,0x00,0x00,0x01,0x1d,0x00,0x00,0x01,0x1d,0x00,0x00,0x00,0xf9,0x00,0x00,0x01,0x1e,0x00,0x00,0x01,0x1e,0x00,0x00,0x00,0x3b,0x00,0x00,0x01,0x1f,0x00,0x00,\r\n0x01,0x1f,0x00,0x00,0x00,0xf7,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x3f,0x00,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x00,0x00,0x00,0xfb,0x00,0x00,0x01,0x22,0x00,0x00,0x01,0x22,0x00,0x00,0x00,0x3e,0x00,0x00,0x01,0x23,0x00,0x00,0x01,0x23,0x00,0x00,0x00,0xfa,0x00,0x00,0x01,0x24,0x00,0x00,0x01,0x24,0x00,0x00,\r\n0x00,0x42,0x00,0x00,0x01,0x25,0x00,0x00,0x01,0x25,0x00,0x00,0x00,0xfe,0x00,0x00,0x01,0x26,0x00,0x00,0x01,0x26,0x00,0x00,0x00,0x41,0x00,0x00,0x01,0x27,0x00,0x00,0x01,0x27,0x00,0x00,0x00,0xfd,0x00,0x00,0x01,0x28,0x00,0x00,0x01,0x28,0x00,0x00,0x00,0x4e,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x29,0x00,0x00,0x01,0x0c,0x00,0x00,\r\n0x01,0x2a,0x00,0x00,0x01,0x2a,0x00,0x00,0x00,0x4c,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x2b,0x00,0x00,0x01,0x0a,0x00,0x00,0x01,0x2c,0x00,0x00,0x01,0x2c,0x00,0x00,0x00,0x45,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x2d,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x2e,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0x4d,0x00,0x00,0x01,0x2f,0x00,0x00,\r\n0x01,0x2f,0x00,0x00,0x01,0x0b,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0x30,0x00,0x00,0x00,0x48,0x00,0x00,0x01,0x31,0x00,0x00,0x01,0x31,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x34,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x50,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x35,0x00,0x00,0x01,0x0f,0x00,0x00,0x01,0x36,0x00,0x00,0x01,0x36,0x00,0x00,\r\n0x00,0x52,0x00,0x00,0x01,0x37,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x39,0x00,0x00,0x01,0x39,0x00,0x00,0x00,0x54,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x3a,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x3b,0x00,0x00,0x01,0x3b,0x00,0x00,0x00,0x56,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x17,0x00,0x00,\r\n0x01,0x3d,0x00,0x00,0x01,0x3d,0x00,0x00,0x00,0x55,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x3e,0x00,0x00,0x01,0x16,0x00,0x00,0x01,0x3f,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x57,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x40,0x00,0x00,0x01,0x18,0x00,0x00,0x01,0x41,0x00,0x00,0x01,0x41,0x00,0x00,0x00,0x58,0x00,0x00,0x01,0x42,0x00,0x00,\r\n0x01,0x42,0x00,0x00,0x01,0x19,0x00,0x00,0x01,0x43,0x00,0x00,0x01,0x43,0x00,0x00,0x00,0x5b,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x44,0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x45,0x00,0x00,0x01,0x45,0x00,0x00,0x00,0x5d,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x1f,0x00,0x00,0x01,0x47,0x00,0x00,0x01,0x47,0x00,0x00,\r\n0x00,0x5c,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x1e,0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x49,0x00,0x00,0x01,0x1d,0x00,0x00,0x01,0x4a,0x00,0x00,0x01,0x4a,0x00,0x00,0x00,0x5e,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x4c,0x00,0x00,0x01,0x4c,0x00,0x00,0x00,0x74,0x00,0x00,\r\n0x01,0x4d,0x00,0x00,0x01,0x4d,0x00,0x00,0x01,0x37,0x00,0x00,0x01,0x4e,0x00,0x00,0x01,0x4e,0x00,0x00,0x00,0x62,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x24,0x00,0x00,0x01,0x50,0x00,0x00,0x01,0x50,0x00,0x00,0x00,0x73,0x00,0x00,0x01,0x51,0x00,0x00,0x01,0x51,0x00,0x00,0x01,0x36,0x00,0x00,0x01,0x52,0x00,0x00,\r\n0x01,0x52,0x00,0x00,0x00,0x79,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x54,0x00,0x00,0x01,0x54,0x00,0x00,0x00,0x7e,0x00,0x00,0x01,0x55,0x00,0x00,0x01,0x55,0x00,0x00,0x01,0x41,0x00,0x00,0x01,0x56,0x00,0x00,0x01,0x56,0x00,0x00,0x00,0x80,0x00,0x00,0x01,0x57,0x00,0x00,0x01,0x57,0x00,0x00,\r\n0x01,0x43,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0x58,0x00,0x00,0x00,0x7f,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0x42,0x00,0x00,0x01,0x5a,0x00,0x00,0x01,0x5a,0x00,0x00,0x00,0x82,0x00,0x00,0x01,0x5b,0x00,0x00,0x01,0x5b,0x00,0x00,0x01,0x45,0x00,0x00,0x01,0x5c,0x00,0x00,0x01,0x5c,0x00,0x00,0x00,0x85,0x00,0x00,\r\n0x01,0x5d,0x00,0x00,0x01,0x5d,0x00,0x00,0x01,0x48,0x00,0x00,0x01,0x5e,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x84,0x00,0x00,0x01,0x5f,0x00,0x00,0x01,0x5f,0x00,0x00,0x01,0x47,0x00,0x00,0x01,0x60,0x00,0x00,0x01,0x60,0x00,0x00,0x00,0x83,0x00,0x00,0x01,0x61,0x00,0x00,0x01,0x61,0x00,0x00,0x01,0x46,0x00,0x00,0x01,0x62,0x00,0x00,\r\n0x01,0x62,0x00,0x00,0x00,0x8c,0x00,0x00,0x01,0x63,0x00,0x00,0x01,0x63,0x00,0x00,0x01,0x4f,0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x64,0x00,0x00,0x00,0x8b,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x4e,0x00,0x00,0x01,0x66,0x00,0x00,0x01,0x66,0x00,0x00,0x00,0x8a,0x00,0x00,0x01,0x67,0x00,0x00,0x01,0x67,0x00,0x00,\r\n0x01,0x4d,0x00,0x00,0x01,0x68,0x00,0x00,0x01,0x68,0x00,0x00,0x00,0xa0,0x00,0x00,0x01,0x69,0x00,0x00,0x01,0x69,0x00,0x00,0x01,0x68,0x00,0x00,0x01,0x6a,0x00,0x00,0x01,0x6a,0x00,0x00,0x00,0x9d,0x00,0x00,0x01,0x6b,0x00,0x00,0x01,0x6b,0x00,0x00,0x01,0x65,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x6c,0x00,0x00,0x00,0x90,0x00,0x00,\r\n0x01,0x6d,0x00,0x00,0x01,0x6d,0x00,0x00,0x01,0x53,0x00,0x00,0x01,0x6e,0x00,0x00,0x01,0x6e,0x00,0x00,0x00,0x9f,0x00,0x00,0x01,0x6f,0x00,0x00,0x01,0x6f,0x00,0x00,0x01,0x67,0x00,0x00,0x01,0x70,0x00,0x00,0x01,0x70,0x00,0x00,0x00,0x9c,0x00,0x00,0x01,0x71,0x00,0x00,0x01,0x71,0x00,0x00,0x01,0x64,0x00,0x00,0x01,0x72,0x00,0x00,\r\n0x01,0x72,0x00,0x00,0x00,0x9e,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x73,0x00,0x00,0x01,0x66,0x00,0x00,0x01,0x74,0x00,0x00,0x01,0x74,0x00,0x00,0x00,0xa4,0x00,0x00,0x01,0x75,0x00,0x00,0x01,0x75,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x76,0x00,0x00,0x01,0x76,0x00,0x00,0x00,0xaa,0x00,0x00,0x01,0x77,0x00,0x00,0x01,0x77,0x00,0x00,\r\n0x01,0x72,0x00,0x00,0x01,0x78,0x00,0x00,0x01,0x78,0x00,0x00,0x00,0xab,0x00,0x00,0x01,0x79,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0xb2,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7a,0x00,0x00,0x01,0x7b,0x00,0x00,0x01,0x7b,0x00,0x00,0x00,0xb4,0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x7c,0x00,0x00,0x01,0x7c,0x00,0x00,\r\n0x01,0x7d,0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0xb3,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x7e,0x00,0x00,0x01,0x7b,0x00,0x00,0x01,0x7f,0x00,0x00,0x01,0x7f,0x00,0x00,0x01,0x4b,0x00,0x00,0x01,0x8f,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x88,0x00,0x00,0x01,0x90,0x00,0x00,0x01,0x90,0x00,0x00,0x00,0x36,0x00,0x00,0x01,0x92,0x00,0x00,\r\n0x01,0x92,0x00,0x00,0x03,0xc8,0x00,0x00,0x01,0x9b,0x00,0x00,0x01,0x9b,0x00,0x00,0x01,0x15,0x00,0x00,0x01,0xa0,0x00,0x00,0x01,0xa0,0x00,0x00,0x00,0x6d,0x00,0x00,0x01,0xa1,0x00,0x00,0x01,0xa1,0x00,0x00,0x01,0x30,0x00,0x00,0x01,0xaf,0x00,0x00,0x01,0xaf,0x00,0x00,0x00,0x96,0x00,0x00,0x01,0xb0,0x00,0x00,0x01,0xb0,0x00,0x00,\r\n0x01,0x5e,0x00,0x00,0x01,0xcd,0x00,0x00,0x01,0xcd,0x00,0x00,0x00,0x09,0x00,0x00,0x01,0xce,0x00,0x00,0x01,0xce,0x00,0x00,0x00,0xc5,0x00,0x00,0x01,0xd0,0x00,0x00,0x01,0xd0,0x00,0x00,0x01,0x03,0x00,0x00,0x01,0xd2,0x00,0x00,0x01,0xd2,0x00,0x00,0x01,0x25,0x00,0x00,0x01,0xd4,0x00,0x00,0x01,0xd4,0x00,0x00,0x01,0x54,0x00,0x00,\r\n0x01,0xd6,0x00,0x00,0x01,0xd6,0x00,0x00,0x01,0x5a,0x00,0x00,0x01,0xd8,0x00,0x00,0x01,0xd8,0x00,0x00,0x01,0x57,0x00,0x00,0x01,0xda,0x00,0x00,0x01,0xda,0x00,0x00,0x01,0x58,0x00,0x00,0x01,0xdc,0x00,0x00,0x01,0xdc,0x00,0x00,0x01,0x59,0x00,0x00,0x01,0xe6,0x00,0x00,0x01,0xe6,0x00,0x00,0x00,0x3c,0x00,0x00,0x01,0xe7,0x00,0x00,\r\n0x01,0xe7,0x00,0x00,0x00,0xf8,0x00,0x00,0x01,0xea,0x00,0x00,0x01,0xea,0x00,0x00,0x00,0x75,0x00,0x00,0x01,0xeb,0x00,0x00,0x01,0xeb,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0xf4,0x00,0x00,0x01,0xf4,0x00,0x00,0x00,0x3a,0x00,0x00,0x01,0xf5,0x00,0x00,0x01,0xf5,0x00,0x00,0x00,0xf6,0x00,0x00,0x01,0xfc,0x00,0x00,0x01,0xfc,0x00,0x00,\r\n0x00,0x19,0x00,0x00,0x01,0xfd,0x00,0x00,0x01,0xfd,0x00,0x00,0x00,0xd5,0x00,0x00,0x01,0xfe,0x00,0x00,0x01,0xfe,0x00,0x00,0x00,0x77,0x00,0x00,0x01,0xff,0x00,0x00,0x01,0xff,0x00,0x00,0x01,0x3a,0x00,0x00,0x02,0x18,0x00,0x00,0x02,0x18,0x00,0x00,0x00,0x86,0x00,0x00,0x02,0x19,0x00,0x00,0x02,0x19,0x00,0x00,0x01,0x49,0x00,0x00,\r\n0x02,0x1a,0x00,0x00,0x02,0x1a,0x00,0x00,0x00,0x8d,0x00,0x00,0x02,0x1b,0x00,0x00,0x02,0x1b,0x00,0x00,0x01,0x50,0x00,0x00,0x02,0x32,0x00,0x00,0x02,0x32,0x00,0x00,0x00,0xaf,0x00,0x00,0x02,0x33,0x00,0x00,0x02,0x33,0x00,0x00,0x01,0x77,0x00,0x00,0x02,0x37,0x00,0x00,0x02,0x37,0x00,0x00,0x01,0x0e,0x00,0x00,0x02,0x59,0x00,0x00,\r\n0x02,0x59,0x00,0x00,0x00,0xf3,0x00,0x00,0x02,0xb9,0x00,0x00,0x02,0xb9,0x00,0x00,0x06,0x67,0x00,0x00,0x02,0xba,0x00,0x00,0x02,0xba,0x00,0x00,0x06,0x65,0x00,0x00,0x02,0xbc,0x00,0x00,0x02,0xbc,0x00,0x00,0x06,0x64,0x00,0x00,0x02,0xc6,0x00,0x00,0x02,0xc7,0x00,0x00,0x06,0x85,0x00,0x00,0x02,0xc9,0x00,0x00,0x02,0xc9,0x00,0x00,\r\n0x06,0x66,0x00,0x00,0x02,0xd8,0x00,0x00,0x02,0xd8,0x00,0x00,0x06,0x87,0x00,0x00,0x02,0xd9,0x00,0x00,0x02,0xd9,0x00,0x00,0x06,0x81,0x00,0x00,0x02,0xda,0x00,0x00,0x02,0xda,0x00,0x00,0x06,0x88,0x00,0x00,0x02,0xdb,0x00,0x00,0x02,0xdb,0x00,0x00,0x06,0x8c,0x00,0x00,0x02,0xdc,0x00,0x00,0x02,0xdc,0x00,0x00,0x06,0x89,0x00,0x00,\r\n0x02,0xdd,0x00,0x00,0x02,0xdd,0x00,0x00,0x06,0x84,0x00,0x00,0x02,0xf3,0x00,0x00,0x02,0xf3,0x00,0x00,0x06,0x03,0x00,0x00,0x02,0xf7,0x00,0x00,0x02,0xf7,0x00,0x00,0x06,0x04,0x00,0x00,0x03,0x00,0x00,0x00,0x03,0x01,0x00,0x00,0x06,0x6a,0x00,0x00,0x03,0x02,0x00,0x00,0x03,0x02,0x00,0x00,0x06,0x6e,0x00,0x00,0x03,0x03,0x00,0x00,\r\n0x03,0x04,0x00,0x00,0x06,0x72,0x00,0x00,0x03,0x06,0x00,0x00,0x03,0x06,0x00,0x00,0x06,0x70,0x00,0x00,0x03,0x07,0x00,0x00,0x03,0x07,0x00,0x00,0x06,0x69,0x00,0x00,0x03,0x08,0x00,0x00,0x03,0x08,0x00,0x00,0x06,0x68,0x00,0x00,0x03,0x09,0x00,0x00,0x03,0x09,0x00,0x00,0x06,0x74,0x00,0x00,0x03,0x0a,0x00,0x00,0x03,0x0a,0x00,0x00,\r\n0x06,0x71,0x00,0x00,0x03,0x0b,0x00,0x00,0x03,0x0b,0x00,0x00,0x06,0x6c,0x00,0x00,0x03,0x0c,0x00,0x00,0x03,0x0c,0x00,0x00,0x06,0x6f,0x00,0x00,0x03,0x0f,0x00,0x00,0x03,0x0f,0x00,0x00,0x06,0x75,0x00,0x00,0x03,0x12,0x00,0x00,0x03,0x12,0x00,0x00,0x06,0x76,0x00,0x00,0x03,0x1b,0x00,0x00,0x03,0x1b,0x00,0x00,0x06,0x77,0x00,0x00,\r\n0x03,0x23,0x00,0x00,0x03,0x23,0x00,0x00,0x06,0x78,0x00,0x00,0x03,0x25,0x00,0x00,0x03,0x28,0x00,0x00,0x06,0x79,0x00,0x00,0x03,0x36,0x00,0x00,0x03,0x38,0x00,0x00,0x06,0x7d,0x00,0x00,0x03,0x74,0x00,0x00,0x03,0x75,0x00,0x00,0x06,0x62,0x00,0x00,0x03,0x7e,0x00,0x00,0x03,0x7e,0x00,0x00,0x03,0xbb,0x00,0x00,0x03,0x84,0x00,0x00,\r\n0x03,0x84,0x00,0x00,0x06,0xb0,0x00,0x00,0x03,0x85,0x00,0x00,0x03,0x85,0x00,0x00,0x06,0xb2,0x00,0x00,0x03,0x86,0x00,0x00,0x03,0x86,0x00,0x00,0x02,0x69,0x00,0x00,0x03,0x87,0x00,0x00,0x03,0x87,0x00,0x00,0x03,0xba,0x00,0x00,0x03,0x88,0x00,0x00,0x03,0x8a,0x00,0x00,0x02,0x6a,0x00,0x00,0x03,0x8c,0x00,0x00,0x03,0x8c,0x00,0x00,\r\n0x02,0x6d,0x00,0x00,0x03,0x8e,0x00,0x00,0x03,0x8f,0x00,0x00,0x02,0x6e,0x00,0x00,0x03,0x90,0x00,0x00,0x03,0x90,0x00,0x00,0x02,0x90,0x00,0x00,0x03,0x91,0x00,0x00,0x03,0xa1,0x00,0x00,0x02,0x51,0x00,0x00,0x03,0xa3,0x00,0x00,0x03,0xa9,0x00,0x00,0x02,0x62,0x00,0x00,0x03,0xaa,0x00,0x00,0x03,0xab,0x00,0x00,0x02,0x70,0x00,0x00,\r\n0x03,0xac,0x00,0x00,0x03,0xae,0x00,0x00,0x02,0x96,0x00,0x00,0x03,0xaf,0x00,0x00,0x03,0xaf,0x00,0x00,0x02,0x8e,0x00,0x00,0x03,0xb0,0x00,0x00,0x03,0xb0,0x00,0x00,0x02,0x93,0x00,0x00,0x03,0xb1,0x00,0x00,0x03,0xc9,0x00,0x00,0x02,0x75,0x00,0x00,0x03,0xca,0x00,0x00,0x03,0xca,0x00,0x00,0x02,0x8f,0x00,0x00,0x03,0xcb,0x00,0x00,\r\n0x03,0xcb,0x00,0x00,0x02,0x92,0x00,0x00,0x03,0xcc,0x00,0x00,0x03,0xcc,0x00,0x00,0x02,0x94,0x00,0x00,0x03,0xcd,0x00,0x00,0x03,0xcd,0x00,0x00,0x02,0x91,0x00,0x00,0x03,0xce,0x00,0x00,0x03,0xce,0x00,0x00,0x02,0x95,0x00,0x00,0x03,0xcf,0x00,0x00,0x03,0xcf,0x00,0x00,0x02,0x72,0x00,0x00,0x03,0xd5,0x00,0x00,0x03,0xd6,0x00,0x00,\r\n0x02,0x9a,0x00,0x00,0x03,0xd7,0x00,0x00,0x03,0xd7,0x00,0x00,0x02,0x99,0x00,0x00,0x04,0x01,0x00,0x00,0x04,0x01,0x00,0x00,0x01,0xd0,0x00,0x00,0x04,0x02,0x00,0x00,0x04,0x02,0x00,0x00,0x01,0xf6,0x00,0x00,0x04,0x03,0x00,0x00,0x04,0x03,0x00,0x00,0x01,0xcc,0x00,0x00,0x04,0x04,0x00,0x00,0x04,0x04,0x00,0x00,0x01,0xee,0x00,0x00,\r\n0x04,0x05,0x00,0x00,0x04,0x05,0x00,0x00,0x01,0xed,0x00,0x00,0x04,0x06,0x00,0x00,0x04,0x08,0x00,0x00,0x01,0xf0,0x00,0x00,0x04,0x09,0x00,0x00,0x04,0x0a,0x00,0x00,0x01,0xeb,0x00,0x00,0x04,0x0b,0x00,0x00,0x04,0x0b,0x00,0x00,0x01,0xf3,0x00,0x00,0x04,0x0c,0x00,0x00,0x04,0x0c,0x00,0x00,0x01,0xd6,0x00,0x00,0x04,0x0e,0x00,0x00,\r\n0x04,0x0e,0x00,0x00,0x01,0xe0,0x00,0x00,0x04,0x0f,0x00,0x00,0x04,0x0f,0x00,0x00,0x01,0xe7,0x00,0x00,0x04,0x10,0x00,0x00,0x04,0x13,0x00,0x00,0x01,0xc8,0x00,0x00,0x04,0x14,0x00,0x00,0x04,0x15,0x00,0x00,0x01,0xce,0x00,0x00,0x04,0x16,0x00,0x00,0x04,0x1a,0x00,0x00,0x01,0xd1,0x00,0x00,0x04,0x1b,0x00,0x00,0x04,0x23,0x00,0x00,\r\n0x01,0xd7,0x00,0x00,0x04,0x24,0x00,0x00,0x04,0x25,0x00,0x00,0x01,0xe1,0x00,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x00,0x00,0x01,0xe4,0x00,0x00,0x04,0x27,0x00,0x00,0x04,0x27,0x00,0x00,0x01,0xe3,0x00,0x00,0x04,0x28,0x00,0x00,0x04,0x29,0x00,0x00,0x01,0xe5,0x00,0x00,0x04,0x2a,0x00,0x00,0x04,0x2b,0x00,0x00,0x01,0xe9,0x00,0x00,\r\n0x04,0x2c,0x00,0x00,0x04,0x2c,0x00,0x00,0x01,0xe8,0x00,0x00,0x04,0x2d,0x00,0x00,0x04,0x2d,0x00,0x00,0x01,0xef,0x00,0x00,0x04,0x2e,0x00,0x00,0x04,0x2f,0x00,0x00,0x01,0xf4,0x00,0x00,0x04,0x30,0x00,0x00,0x04,0x33,0x00,0x00,0x02,0x0c,0x00,0x00,0x04,0x34,0x00,0x00,0x04,0x35,0x00,0x00,0x02,0x12,0x00,0x00,0x04,0x36,0x00,0x00,\r\n0x04,0x3a,0x00,0x00,0x02,0x15,0x00,0x00,0x04,0x3b,0x00,0x00,0x04,0x43,0x00,0x00,0x02,0x1b,0x00,0x00,0x04,0x44,0x00,0x00,0x04,0x45,0x00,0x00,0x02,0x25,0x00,0x00,0x04,0x46,0x00,0x00,0x04,0x46,0x00,0x00,0x02,0x28,0x00,0x00,0x04,0x47,0x00,0x00,0x04,0x47,0x00,0x00,0x02,0x27,0x00,0x00,0x04,0x48,0x00,0x00,0x04,0x49,0x00,0x00,\r\n0x02,0x29,0x00,0x00,0x04,0x4a,0x00,0x00,0x04,0x4b,0x00,0x00,0x02,0x2d,0x00,0x00,0x04,0x4c,0x00,0x00,0x04,0x4c,0x00,0x00,0x02,0x2c,0x00,0x00,0x04,0x4d,0x00,0x00,0x04,0x4d,0x00,0x00,0x02,0x33,0x00,0x00,0x04,0x4e,0x00,0x00,0x04,0x4f,0x00,0x00,0x02,0x38,0x00,0x00,0x04,0x51,0x00,0x00,0x04,0x51,0x00,0x00,0x02,0x14,0x00,0x00,\r\n0x04,0x52,0x00,0x00,0x04,0x52,0x00,0x00,0x02,0x3a,0x00,0x00,0x04,0x53,0x00,0x00,0x04,0x53,0x00,0x00,0x02,0x10,0x00,0x00,0x04,0x54,0x00,0x00,0x04,0x54,0x00,0x00,0x02,0x32,0x00,0x00,0x04,0x55,0x00,0x00,0x04,0x55,0x00,0x00,0x02,0x31,0x00,0x00,0x04,0x56,0x00,0x00,0x04,0x58,0x00,0x00,0x02,0x34,0x00,0x00,0x04,0x59,0x00,0x00,\r\n0x04,0x5a,0x00,0x00,0x02,0x2f,0x00,0x00,0x04,0x5b,0x00,0x00,0x04,0x5b,0x00,0x00,0x02,0x37,0x00,0x00,0x04,0x5c,0x00,0x00,0x04,0x5c,0x00,0x00,0x02,0x1a,0x00,0x00,0x04,0x5e,0x00,0x00,0x04,0x5e,0x00,0x00,0x02,0x24,0x00,0x00,0x04,0x5f,0x00,0x00,0x04,0x5f,0x00,0x00,0x02,0x2b,0x00,0x00,0x04,0x90,0x00,0x00,0x04,0x90,0x00,0x00,\r\n0x01,0xcd,0x00,0x00,0x04,0x91,0x00,0x00,0x04,0x91,0x00,0x00,0x02,0x11,0x00,0x00,0x04,0x92,0x00,0x00,0x04,0x92,0x00,0x00,0x01,0xf7,0x00,0x00,0x04,0x93,0x00,0x00,0x04,0x93,0x00,0x00,0x02,0x3b,0x00,0x00,0x04,0x9a,0x00,0x00,0x04,0x9a,0x00,0x00,0x01,0xf8,0x00,0x00,0x04,0x9b,0x00,0x00,0x04,0x9b,0x00,0x00,0x02,0x3c,0x00,0x00,\r\n0x04,0xa2,0x00,0x00,0x04,0xa2,0x00,0x00,0x01,0xf9,0x00,0x00,0x04,0xa3,0x00,0x00,0x04,0xa3,0x00,0x00,0x02,0x3d,0x00,0x00,0x04,0xae,0x00,0x00,0x04,0xae,0x00,0x00,0x01,0xfa,0x00,0x00,0x04,0xaf,0x00,0x00,0x04,0xaf,0x00,0x00,0x02,0x3e,0x00,0x00,0x04,0xb0,0x00,0x00,0x04,0xb0,0x00,0x00,0x01,0xfb,0x00,0x00,0x04,0xb1,0x00,0x00,\r\n0x04,0xb1,0x00,0x00,0x02,0x3f,0x00,0x00,0x04,0xb6,0x00,0x00,0x04,0xb6,0x00,0x00,0x01,0xfc,0x00,0x00,0x04,0xb7,0x00,0x00,0x04,0xb7,0x00,0x00,0x02,0x40,0x00,0x00,0x04,0xba,0x00,0x00,0x04,0xba,0x00,0x00,0x01,0xfd,0x00,0x00,0x04,0xbb,0x00,0x00,0x04,0xbb,0x00,0x00,0x02,0x41,0x00,0x00,0x04,0xd8,0x00,0x00,0x04,0xd8,0x00,0x00,\r\n0x01,0xfe,0x00,0x00,0x04,0xd9,0x00,0x00,0x04,0xd9,0x00,0x00,0x02,0x42,0x00,0x00,0x04,0xdc,0x00,0x00,0x04,0xdc,0x00,0x00,0x01,0xff,0x00,0x00,0x04,0xdd,0x00,0x00,0x04,0xdd,0x00,0x00,0x02,0x43,0x00,0x00,0x04,0xde,0x00,0x00,0x04,0xde,0x00,0x00,0x02,0x00,0x00,0x00,0x04,0xdf,0x00,0x00,0x04,0xdf,0x00,0x00,0x02,0x44,0x00,0x00,\r\n0x04,0xe4,0x00,0x00,0x04,0xe4,0x00,0x00,0x02,0x01,0x00,0x00,0x04,0xe5,0x00,0x00,0x04,0xe5,0x00,0x00,0x02,0x45,0x00,0x00,0x04,0xe6,0x00,0x00,0x04,0xe6,0x00,0x00,0x02,0x02,0x00,0x00,0x04,0xe7,0x00,0x00,0x04,0xe7,0x00,0x00,0x02,0x46,0x00,0x00,0x04,0xe8,0x00,0x00,0x04,0xe8,0x00,0x00,0x02,0x03,0x00,0x00,0x04,0xe9,0x00,0x00,\r\n0x04,0xe9,0x00,0x00,0x02,0x47,0x00,0x00,0x04,0xf4,0x00,0x00,0x04,0xf4,0x00,0x00,0x02,0x04,0x00,0x00,0x04,0xf5,0x00,0x00,0x04,0xf5,0x00,0x00,0x02,0x48,0x00,0x00,0x0a,0xea,0x00,0x00,0x0a,0xea,0x00,0x00,0x03,0x28,0x00,0x00,0x1e,0x80,0x00,0x00,0x1e,0x80,0x00,0x00,0x00,0xa6,0x00,0x00,0x1e,0x81,0x00,0x00,0x1e,0x81,0x00,0x00,\r\n0x01,0x6e,0x00,0x00,0x1e,0x82,0x00,0x00,0x1e,0x82,0x00,0x00,0x00,0xa3,0x00,0x00,0x1e,0x83,0x00,0x00,0x1e,0x83,0x00,0x00,0x01,0x6b,0x00,0x00,0x1e,0x84,0x00,0x00,0x1e,0x84,0x00,0x00,0x00,0xa5,0x00,0x00,0x1e,0x85,0x00,0x00,0x1e,0x85,0x00,0x00,0x01,0x6d,0x00,0x00,0x1e,0x9e,0x00,0x00,0x1e,0x9e,0x00,0x00,0x00,0x87,0x00,0x00,\r\n0x1e,0xa0,0x00,0x00,0x1e,0xa0,0x00,0x00,0x00,0x11,0x00,0x00,0x1e,0xa1,0x00,0x00,0x1e,0xa1,0x00,0x00,0x00,0xcd,0x00,0x00,0x1e,0xa2,0x00,0x00,0x1e,0xa2,0x00,0x00,0x00,0x13,0x00,0x00,0x1e,0xa3,0x00,0x00,0x1e,0xa3,0x00,0x00,0x00,0xcf,0x00,0x00,0x1e,0xa4,0x00,0x00,0x1e,0xa4,0x00,0x00,0x00,0x0b,0x00,0x00,0x1e,0xa5,0x00,0x00,\r\n0x1e,0xa5,0x00,0x00,0x00,0xc7,0x00,0x00,0x1e,0xa6,0x00,0x00,0x1e,0xa6,0x00,0x00,0x00,0x0d,0x00,0x00,0x1e,0xa7,0x00,0x00,0x1e,0xa7,0x00,0x00,0x00,0xc9,0x00,0x00,0x1e,0xa8,0x00,0x00,0x1e,0xa8,0x00,0x00,0x00,0x0e,0x00,0x00,0x1e,0xa9,0x00,0x00,0x1e,0xa9,0x00,0x00,0x00,0xca,0x00,0x00,0x1e,0xaa,0x00,0x00,0x1e,0xaa,0x00,0x00,\r\n0x00,0x0f,0x00,0x00,0x1e,0xab,0x00,0x00,0x1e,0xab,0x00,0x00,0x00,0xcb,0x00,0x00,0x1e,0xac,0x00,0x00,0x1e,0xac,0x00,0x00,0x00,0x0c,0x00,0x00,0x1e,0xad,0x00,0x00,0x1e,0xad,0x00,0x00,0x00,0xc8,0x00,0x00,0x1e,0xae,0x00,0x00,0x1e,0xae,0x00,0x00,0x00,0x04,0x00,0x00,0x1e,0xaf,0x00,0x00,0x1e,0xaf,0x00,0x00,0x00,0xc0,0x00,0x00,\r\n0x1e,0xb0,0x00,0x00,0x1e,0xb0,0x00,0x00,0x00,0x06,0x00,0x00,0x1e,0xb1,0x00,0x00,0x1e,0xb1,0x00,0x00,0x00,0xc2,0x00,0x00,0x1e,0xb2,0x00,0x00,0x1e,0xb2,0x00,0x00,0x00,0x07,0x00,0x00,0x1e,0xb3,0x00,0x00,0x1e,0xb3,0x00,0x00,0x00,0xc3,0x00,0x00,0x1e,0xb4,0x00,0x00,0x1e,0xb4,0x00,0x00,0x00,0x08,0x00,0x00,0x1e,0xb5,0x00,0x00,\r\n0x1e,0xb5,0x00,0x00,0x00,0xc4,0x00,0x00,0x1e,0xb6,0x00,0x00,0x1e,0xb6,0x00,0x00,0x00,0x05,0x00,0x00,0x1e,0xb7,0x00,0x00,0x1e,0xb7,0x00,0x00,0x00,0xc1,0x00,0x00,0x1e,0xb8,0x00,0x00,0x1e,0xb8,0x00,0x00,0x00,0x31,0x00,0x00,0x1e,0xb9,0x00,0x00,0x1e,0xb9,0x00,0x00,0x00,0xed,0x00,0x00,0x1e,0xba,0x00,0x00,0x1e,0xba,0x00,0x00,\r\n0x00,0x33,0x00,0x00,0x1e,0xbb,0x00,0x00,0x1e,0xbb,0x00,0x00,0x00,0xef,0x00,0x00,0x1e,0xbc,0x00,0x00,0x1e,0xbc,0x00,0x00,0x00,0x37,0x00,0x00,0x1e,0xbd,0x00,0x00,0x1e,0xbd,0x00,0x00,0x00,0xf2,0x00,0x00,0x1e,0xbe,0x00,0x00,0x1e,0xbe,0x00,0x00,0x00,0x2a,0x00,0x00,0x1e,0xbf,0x00,0x00,0x1e,0xbf,0x00,0x00,0x00,0xe6,0x00,0x00,\r\n0x1e,0xc0,0x00,0x00,0x1e,0xc0,0x00,0x00,0x00,0x2c,0x00,0x00,0x1e,0xc1,0x00,0x00,0x1e,0xc1,0x00,0x00,0x00,0xe8,0x00,0x00,0x1e,0xc2,0x00,0x00,0x1e,0xc2,0x00,0x00,0x00,0x2d,0x00,0x00,0x1e,0xc3,0x00,0x00,0x1e,0xc3,0x00,0x00,0x00,0xe9,0x00,0x00,0x1e,0xc4,0x00,0x00,0x1e,0xc4,0x00,0x00,0x00,0x2e,0x00,0x00,0x1e,0xc5,0x00,0x00,\r\n0x1e,0xc5,0x00,0x00,0x00,0xea,0x00,0x00,0x1e,0xc6,0x00,0x00,0x1e,0xc6,0x00,0x00,0x00,0x2b,0x00,0x00,0x1e,0xc7,0x00,0x00,0x1e,0xc7,0x00,0x00,0x00,0xe7,0x00,0x00,0x1e,0xc8,0x00,0x00,0x1e,0xc8,0x00,0x00,0x00,0x4b,0x00,0x00,0x1e,0xc9,0x00,0x00,0x1e,0xc9,0x00,0x00,0x01,0x09,0x00,0x00,0x1e,0xca,0x00,0x00,0x1e,0xca,0x00,0x00,\r\n0x00,0x49,0x00,0x00,0x1e,0xcb,0x00,0x00,0x1e,0xcb,0x00,0x00,0x01,0x07,0x00,0x00,0x1e,0xcc,0x00,0x00,0x1e,0xcc,0x00,0x00,0x00,0x6a,0x00,0x00,0x1e,0xcd,0x00,0x00,0x1e,0xcd,0x00,0x00,0x01,0x2d,0x00,0x00,0x1e,0xce,0x00,0x00,0x1e,0xce,0x00,0x00,0x00,0x6c,0x00,0x00,0x1e,0xcf,0x00,0x00,0x1e,0xcf,0x00,0x00,0x01,0x2f,0x00,0x00,\r\n0x1e,0xd0,0x00,0x00,0x1e,0xd0,0x00,0x00,0x00,0x64,0x00,0x00,0x1e,0xd1,0x00,0x00,0x1e,0xd1,0x00,0x00,0x01,0x27,0x00,0x00,0x1e,0xd2,0x00,0x00,0x1e,0xd2,0x00,0x00,0x00,0x66,0x00,0x00,0x1e,0xd3,0x00,0x00,0x1e,0xd3,0x00,0x00,0x01,0x29,0x00,0x00,0x1e,0xd4,0x00,0x00,0x1e,0xd4,0x00,0x00,0x00,0x67,0x00,0x00,0x1e,0xd5,0x00,0x00,\r\n0x1e,0xd5,0x00,0x00,0x01,0x2a,0x00,0x00,0x1e,0xd6,0x00,0x00,0x1e,0xd6,0x00,0x00,0x00,0x68,0x00,0x00,0x1e,0xd7,0x00,0x00,0x1e,0xd7,0x00,0x00,0x01,0x2b,0x00,0x00,0x1e,0xd8,0x00,0x00,0x1e,0xd8,0x00,0x00,0x00,0x65,0x00,0x00,0x1e,0xd9,0x00,0x00,0x1e,0xd9,0x00,0x00,0x01,0x28,0x00,0x00,0x1e,0xda,0x00,0x00,0x1e,0xda,0x00,0x00,\r\n0x00,0x6e,0x00,0x00,0x1e,0xdb,0x00,0x00,0x1e,0xdb,0x00,0x00,0x01,0x31,0x00,0x00,0x1e,0xdc,0x00,0x00,0x1e,0xdc,0x00,0x00,0x00,0x70,0x00,0x00,0x1e,0xdd,0x00,0x00,0x1e,0xdd,0x00,0x00,0x01,0x33,0x00,0x00,0x1e,0xde,0x00,0x00,0x1e,0xde,0x00,0x00,0x00,0x71,0x00,0x00,0x1e,0xdf,0x00,0x00,0x1e,0xdf,0x00,0x00,0x01,0x34,0x00,0x00,\r\n0x1e,0xe0,0x00,0x00,0x1e,0xe0,0x00,0x00,0x00,0x72,0x00,0x00,0x1e,0xe1,0x00,0x00,0x1e,0xe1,0x00,0x00,0x01,0x35,0x00,0x00,0x1e,0xe2,0x00,0x00,0x1e,0xe2,0x00,0x00,0x00,0x6f,0x00,0x00,0x1e,0xe3,0x00,0x00,0x1e,0xe3,0x00,0x00,0x01,0x32,0x00,0x00,0x1e,0xe4,0x00,0x00,0x1e,0xe4,0x00,0x00,0x00,0x93,0x00,0x00,0x1e,0xe5,0x00,0x00,\r\n0x1e,0xe5,0x00,0x00,0x01,0x5b,0x00,0x00,0x1e,0xe6,0x00,0x00,0x1e,0xe6,0x00,0x00,0x00,0x95,0x00,0x00,0x1e,0xe7,0x00,0x00,0x1e,0xe7,0x00,0x00,0x01,0x5d,0x00,0x00,0x1e,0xe8,0x00,0x00,0x1e,0xe8,0x00,0x00,0x00,0x97,0x00,0x00,0x1e,0xe9,0x00,0x00,0x1e,0xe9,0x00,0x00,0x01,0x5f,0x00,0x00,0x1e,0xea,0x00,0x00,0x1e,0xea,0x00,0x00,\r\n0x00,0x99,0x00,0x00,0x1e,0xeb,0x00,0x00,0x1e,0xeb,0x00,0x00,0x01,0x61,0x00,0x00,0x1e,0xec,0x00,0x00,0x1e,0xec,0x00,0x00,0x00,0x9a,0x00,0x00,0x1e,0xed,0x00,0x00,0x1e,0xed,0x00,0x00,0x01,0x62,0x00,0x00,0x1e,0xee,0x00,0x00,0x1e,0xee,0x00,0x00,0x00,0x9b,0x00,0x00,0x1e,0xef,0x00,0x00,0x1e,0xef,0x00,0x00,0x01,0x63,0x00,0x00,\r\n0x1e,0xf0,0x00,0x00,0x1e,0xf0,0x00,0x00,0x00,0x98,0x00,0x00,0x1e,0xf1,0x00,0x00,0x1e,0xf1,0x00,0x00,0x01,0x60,0x00,0x00,0x1e,0xf2,0x00,0x00,0x1e,0xf2,0x00,0x00,0x00,0xad,0x00,0x00,0x1e,0xf3,0x00,0x00,0x1e,0xf3,0x00,0x00,0x01,0x75,0x00,0x00,0x1e,0xf4,0x00,0x00,0x1e,0xf4,0x00,0x00,0x00,0xac,0x00,0x00,0x1e,0xf5,0x00,0x00,\r\n0x1e,0xf5,0x00,0x00,0x01,0x74,0x00,0x00,0x1e,0xf6,0x00,0x00,0x1e,0xf6,0x00,0x00,0x00,0xae,0x00,0x00,0x1e,0xf7,0x00,0x00,0x1e,0xf7,0x00,0x00,0x01,0x76,0x00,0x00,0x1e,0xf8,0x00,0x00,0x1e,0xf8,0x00,0x00,0x00,0xb0,0x00,0x00,0x1e,0xf9,0x00,0x00,0x1e,0xf9,0x00,0x00,0x01,0x78,0x00,0x00,0x20,0x01,0x00,0x00,0x20,0x01,0x00,0x00,\r\n0x03,0xbc,0x00,0x00,0x20,0x0b,0x00,0x00,0x20,0x0b,0x00,0x00,0x03,0xbd,0x00,0x00,0x20,0x10,0x00,0x00,0x20,0x10,0x00,0x00,0x03,0x5b,0x00,0x00,0x20,0x13,0x00,0x00,0x20,0x14,0x00,0x00,0x03,0x59,0x00,0x00,0x20,0x16,0x00,0x00,0x20,0x16,0x00,0x00,0x03,0x37,0x00,0x00,0x20,0x18,0x00,0x00,0x20,0x19,0x00,0x00,0x03,0x61,0x00,0x00,\r\n0x20,0x1a,0x00,0x00,0x20,0x1a,0x00,0x00,0x03,0x5d,0x00,0x00,0x20,0x1b,0x00,0x00,0x20,0x1b,0x00,0x00,0x03,0x63,0x00,0x00,0x20,0x1c,0x00,0x00,0x20,0x1d,0x00,0x00,0x03,0x5f,0x00,0x00,0x20,0x1e,0x00,0x00,0x20,0x1e,0x00,0x00,0x03,0x5e,0x00,0x00,0x20,0x1f,0x00,0x00,0x20,0x1f,0x00,0x00,0x03,0x64,0x00,0x00,0x20,0x20,0x00,0x00,\r\n0x20,0x20,0x00,0x00,0x05,0xc0,0x00,0x00,0x20,0x21,0x00,0x00,0x20,0x21,0x00,0x00,0x05,0xc2,0x00,0x00,0x20,0x22,0x00,0x00,0x20,0x22,0x00,0x00,0x03,0x33,0x00,0x00,0x20,0x24,0x00,0x00,0x20,0x24,0x00,0x00,0x03,0x3b,0x00,0x00,0x20,0x26,0x00,0x00,0x20,0x26,0x00,0x00,0x03,0x2d,0x00,0x00,0x20,0x30,0x00,0x00,0x20,0x30,0x00,0x00,\r\n0x04,0x39,0x00,0x00,0x20,0x32,0x00,0x00,0x20,0x33,0x00,0x00,0x05,0xbc,0x00,0x00,0x20,0x34,0x00,0x00,0x20,0x34,0x00,0x00,0x03,0x69,0x00,0x00,0x20,0x39,0x00,0x00,0x20,0x3a,0x00,0x00,0x03,0x67,0x00,0x00,0x20,0x3c,0x00,0x00,0x20,0x3d,0x00,0x00,0x03,0x38,0x00,0x00,0x20,0x3e,0x00,0x00,0x20,0x3e,0x00,0x00,0x03,0x3c,0x00,0x00,\r\n0x20,0x3f,0x00,0x00,0x20,0x3f,0x00,0x00,0x03,0x3f,0x00,0x00,0x20,0x44,0x00,0x00,0x20,0x44,0x00,0x00,0x03,0x20,0x00,0x00,0x20,0x45,0x00,0x00,0x20,0x46,0x00,0x00,0x03,0x35,0x00,0x00,0x20,0x70,0x00,0x00,0x20,0x70,0x00,0x00,0x03,0x02,0x00,0x00,0x20,0x74,0x00,0x00,0x20,0x79,0x00,0x00,0x03,0x06,0x00,0x00,0x20,0x7a,0x00,0x00,\r\n0x20,0x7a,0x00,0x00,0x04,0x3b,0x00,0x00,0x20,0x7c,0x00,0x00,0x20,0x7c,0x00,0x00,0x03,0xe6,0x00,0x00,0x20,0x80,0x00,0x00,0x20,0x89,0x00,0x00,0x02,0xe4,0x00,0x00,0x20,0xab,0x00,0x00,0x20,0xac,0x00,0x00,0x03,0xc6,0x00,0x00,0x20,0xae,0x00,0x00,0x20,0xae,0x00,0x00,0x03,0xcc,0x00,0x00,0x20,0xb4,0x00,0x00,0x20,0xb4,0x00,0x00,\r\n0x03,0xc9,0x00,0x00,0x20,0xbd,0x00,0x00,0x20,0xbd,0x00,0x00,0x03,0xca,0x00,0x00,0x20,0xbf,0x00,0x00,0x20,0xbf,0x00,0x00,0x03,0xc2,0x00,0x00,0x21,0x02,0x00,0x00,0x21,0x02,0x00,0x00,0x02,0xa2,0x00,0x00,0x21,0x0d,0x00,0x00,0x21,0x0d,0x00,0x00,0x02,0xa7,0x00,0x00,0x21,0x13,0x00,0x00,0x21,0x13,0x00,0x00,0x05,0xc1,0x00,0x00,\r\n0x21,0x15,0x00,0x00,0x21,0x15,0x00,0x00,0x02,0xad,0x00,0x00,0x21,0x16,0x00,0x00,0x21,0x16,0x00,0x00,0x05,0xc3,0x00,0x00,0x21,0x19,0x00,0x00,0x21,0x1a,0x00,0x00,0x02,0xaf,0x00,0x00,0x21,0x1d,0x00,0x00,0x21,0x1d,0x00,0x00,0x02,0xb1,0x00,0x00,0x21,0x22,0x00,0x00,0x21,0x22,0x00,0x00,0x05,0xba,0x00,0x00,0x21,0x24,0x00,0x00,\r\n0x21,0x24,0x00,0x00,0x02,0xb9,0x00,0x00,0x21,0x2e,0x00,0x00,0x21,0x2e,0x00,0x00,0x05,0xc4,0x00,0x00,0x21,0x40,0x00,0x00,0x21,0x40,0x00,0x00,0x04,0x5e,0x00,0x00,0x21,0x8a,0x00,0x00,0x21,0x8a,0x00,0x00,0x05,0xff,0x00,0x00,0x21,0x8b,0x00,0x00,0x21,0x8b,0x00,0x00,0x05,0xfe,0x00,0x00,0x21,0x90,0x00,0x00,0x21,0x90,0x00,0x00,\r\n0x04,0x77,0x00,0x00,0x21,0x91,0x00,0x00,0x21,0x91,0x00,0x00,0x04,0x71,0x00,0x00,0x21,0x92,0x00,0x00,0x21,0x92,0x00,0x00,0x04,0x73,0x00,0x00,0x21,0x93,0x00,0x00,0x21,0x93,0x00,0x00,0x04,0x75,0x00,0x00,0x21,0x94,0x00,0x00,0x21,0x95,0x00,0x00,0x04,0x79,0x00,0x00,0x21,0x96,0x00,0x00,0x21,0x96,0x00,0x00,0x04,0x78,0x00,0x00,\r\n0x21,0x97,0x00,0x00,0x21,0x97,0x00,0x00,0x04,0x72,0x00,0x00,0x21,0x98,0x00,0x00,0x21,0x98,0x00,0x00,0x04,0x74,0x00,0x00,0x21,0x99,0x00,0x00,0x21,0x99,0x00,0x00,0x04,0x76,0x00,0x00,0x21,0x9d,0x00,0x00,0x21,0x9d,0x00,0x00,0x04,0x7b,0x00,0x00,0x21,0x9e,0x00,0x00,0x21,0x9e,0x00,0x00,0x04,0x7d,0x00,0x00,0x21,0xa0,0x00,0x00,\r\n0x21,0xa0,0x00,0x00,0x04,0x7e,0x00,0x00,0x21,0xa2,0x00,0x00,0x21,0xa3,0x00,0x00,0x04,0x7f,0x00,0x00,0x21,0xa5,0x00,0x00,0x21,0xa7,0x00,0x00,0x04,0x81,0x00,0x00,0x21,0xa9,0x00,0x00,0x21,0xaa,0x00,0x00,0x04,0x85,0x00,0x00,0x21,0xad,0x00,0x00,0x21,0xad,0x00,0x00,0x04,0x7c,0x00,0x00,0x21,0xbe,0x00,0x00,0x21,0xbe,0x00,0x00,\r\n0x04,0x87,0x00,0x00,0x21,0xc9,0x00,0x00,0x21,0xc9,0x00,0x00,0x04,0x88,0x00,0x00,0x21,0xd0,0x00,0x00,0x21,0xd0,0x00,0x00,0x04,0x8c,0x00,0x00,0x21,0xd1,0x00,0x00,0x21,0xd3,0x00,0x00,0x04,0x89,0x00,0x00,0x21,0xd4,0x00,0x00,0x21,0xd4,0x00,0x00,0x04,0x8d,0x00,0x00,0x21,0xdb,0x00,0x00,0x21,0xdb,0x00,0x00,0x04,0x8e,0x00,0x00,\r\n0x21,0xde,0x00,0x00,0x21,0xde,0x00,0x00,0x05,0xe8,0x00,0x00,0x21,0xdf,0x00,0x00,0x21,0xdf,0x00,0x00,0x05,0xe7,0x00,0x00,0x21,0xe5,0x00,0x00,0x21,0xe5,0x00,0x00,0x04,0x84,0x00,0x00,0x21,0xe7,0x00,0x00,0x21,0xe8,0x00,0x00,0x04,0x8f,0x00,0x00,0x21,0xea,0x00,0x00,0x21,0xea,0x00,0x00,0x05,0xe2,0x00,0x00,0x22,0x00,0x00,0x00,\r\n0x22,0x00,0x00,0x00,0x04,0x65,0x00,0x00,0x22,0x01,0x00,0x00,0x22,0x01,0x00,0x00,0x03,0xd6,0x00,0x00,0x22,0x02,0x00,0x00,0x22,0x02,0x00,0x00,0x04,0x2f,0x00,0x00,0x22,0x03,0x00,0x00,0x22,0x03,0x00,0x00,0x03,0xea,0x00,0x00,0x22,0x04,0x00,0x00,0x22,0x04,0x00,0x00,0x04,0x62,0x00,0x00,0x22,0x05,0x00,0x00,0x22,0x05,0x00,0x00,\r\n0x04,0x25,0x00,0x00,0x22,0x06,0x00,0x00,0x22,0x06,0x00,0x00,0x04,0x2b,0x00,0x00,0x22,0x07,0x00,0x00,0x22,0x07,0x00,0x00,0x03,0xeb,0x00,0x00,0x22,0x08,0x00,0x00,0x22,0x08,0x00,0x00,0x03,0xe2,0x00,0x00,0x22,0x09,0x00,0x00,0x22,0x09,0x00,0x00,0x04,0x0b,0x00,0x00,0x22,0x0a,0x00,0x00,0x22,0x0a,0x00,0x00,0x03,0xe3,0x00,0x00,\r\n0x22,0x0b,0x00,0x00,0x22,0x0b,0x00,0x00,0x04,0x5d,0x00,0x00,0x22,0x0c,0x00,0x00,0x22,0x0c,0x00,0x00,0x04,0x0a,0x00,0x00,0x22,0x0e,0x00,0x00,0x22,0x0e,0x00,0x00,0x03,0xe5,0x00,0x00,0x22,0x0f,0x00,0x00,0x22,0x0f,0x00,0x00,0x04,0x2c,0x00,0x00,0x22,0x10,0x00,0x00,0x22,0x10,0x00,0x00,0x03,0xd8,0x00,0x00,0x22,0x11,0x00,0x00,\r\n0x22,0x11,0x00,0x00,0x04,0x2d,0x00,0x00,0x22,0x12,0x00,0x00,0x22,0x12,0x00,0x00,0x04,0x16,0x00,0x00,0x22,0x13,0x00,0x00,0x22,0x13,0x00,0x00,0x03,0xf9,0x00,0x00,0x22,0x15,0x00,0x00,0x22,0x15,0x00,0x00,0x03,0xdd,0x00,0x00,0x22,0x18,0x00,0x00,0x22,0x18,0x00,0x00,0x04,0x4d,0x00,0x00,0x22,0x19,0x00,0x00,0x22,0x19,0x00,0x00,\r\n0x03,0xd4,0x00,0x00,0x22,0x1a,0x00,0x00,0x22,0x1a,0x00,0x00,0x04,0x2e,0x00,0x00,0x22,0x1e,0x00,0x00,0x22,0x1e,0x00,0x00,0x04,0x24,0x00,0x00,0x22,0x23,0x00,0x00,0x22,0x23,0x00,0x00,0x03,0xdc,0x00,0x00,0x22,0x24,0x00,0x00,0x22,0x24,0x00,0x00,0x03,0xde,0x00,0x00,0x22,0x25,0x00,0x00,0x22,0x25,0x00,0x00,0x04,0x31,0x00,0x00,\r\n0x22,0x27,0x00,0x00,0x22,0x2b,0x00,0x00,0x04,0x26,0x00,0x00,0x22,0x34,0x00,0x00,0x22,0x34,0x00,0x00,0x04,0x63,0x00,0x00,0x22,0x35,0x00,0x00,0x22,0x35,0x00,0x00,0x03,0xd1,0x00,0x00,0x22,0x36,0x00,0x00,0x22,0x36,0x00,0x00,0x04,0x40,0x00,0x00,0x22,0x37,0x00,0x00,0x22,0x37,0x00,0x00,0x04,0x3e,0x00,0x00,0x22,0x38,0x00,0x00,\r\n0x22,0x38,0x00,0x00,0x03,0xdf,0x00,0x00,0x22,0x39,0x00,0x00,0x22,0x39,0x00,0x00,0x03,0xe9,0x00,0x00,0x22,0x3c,0x00,0x00,0x22,0x3c,0x00,0x00,0x04,0x4e,0x00,0x00,0x22,0x3e,0x00,0x00,0x22,0x3e,0x00,0x00,0x03,0xed,0x00,0x00,0x22,0x43,0x00,0x00,0x22,0x43,0x00,0x00,0x03,0xd0,0x00,0x00,0x22,0x45,0x00,0x00,0x22,0x45,0x00,0x00,\r\n0x03,0xd7,0x00,0x00,0x22,0x47,0x00,0x00,0x22,0x47,0x00,0x00,0x04,0x04,0x00,0x00,0x22,0x48,0x00,0x00,0x22,0x48,0x00,0x00,0x04,0x20,0x00,0x00,0x22,0x49,0x00,0x00,0x22,0x49,0x00,0x00,0x04,0x09,0x00,0x00,0x22,0x4b,0x00,0x00,0x22,0x4b,0x00,0x00,0x04,0x64,0x00,0x00,0x22,0x4d,0x00,0x00,0x22,0x4d,0x00,0x00,0x03,0xe8,0x00,0x00,\r\n0x22,0x54,0x00,0x00,0x22,0x54,0x00,0x00,0x03,0xd5,0x00,0x00,0x22,0x57,0x00,0x00,0x22,0x57,0x00,0x00,0x04,0x4c,0x00,0x00,0x22,0x5f,0x00,0x00,0x22,0x5f,0x00,0x00,0x04,0x3f,0x00,0x00,0x22,0x60,0x00,0x00,0x22,0x60,0x00,0x00,0x04,0x1a,0x00,0x00,0x22,0x61,0x00,0x00,0x22,0x61,0x00,0x00,0x03,0xe7,0x00,0x00,0x22,0x62,0x00,0x00,\r\n0x22,0x62,0x00,0x00,0x04,0x0f,0x00,0x00,0x22,0x63,0x00,0x00,0x22,0x63,0x00,0x00,0x04,0x5a,0x00,0x00,0x22,0x64,0x00,0x00,0x22,0x64,0x00,0x00,0x04,0x1e,0x00,0x00,0x22,0x65,0x00,0x00,0x22,0x65,0x00,0x00,0x04,0x1d,0x00,0x00,0x22,0x6a,0x00,0x00,0x22,0x6a,0x00,0x00,0x03,0xfb,0x00,0x00,0x22,0x6b,0x00,0x00,0x22,0x6b,0x00,0x00,\r\n0x03,0xfa,0x00,0x00,0x22,0x6c,0x00,0x00,0x22,0x6c,0x00,0x00,0x03,0xd2,0x00,0x00,0x22,0x6d,0x00,0x00,0x22,0x6d,0x00,0x00,0x04,0x0c,0x00,0x00,0x22,0x6e,0x00,0x00,0x22,0x6e,0x00,0x00,0x04,0x10,0x00,0x00,0x22,0x6f,0x00,0x00,0x22,0x6f,0x00,0x00,0x04,0x0d,0x00,0x00,0x22,0x70,0x00,0x00,0x22,0x70,0x00,0x00,0x04,0x11,0x00,0x00,\r\n0x22,0x71,0x00,0x00,0x22,0x71,0x00,0x00,0x04,0x0e,0x00,0x00,0x22,0x72,0x00,0x00,0x22,0x72,0x00,0x00,0x03,0xf7,0x00,0x00,0x22,0x73,0x00,0x00,0x22,0x73,0x00,0x00,0x03,0xec,0x00,0x00,0x22,0x7a,0x00,0x00,0x22,0x7a,0x00,0x00,0x04,0x3c,0x00,0x00,0x22,0x7b,0x00,0x00,0x22,0x7b,0x00,0x00,0x04,0x5c,0x00,0x00,0x22,0x7c,0x00,0x00,\r\n0x22,0x7c,0x00,0x00,0x04,0x3d,0x00,0x00,0x22,0x82,0x00,0x00,0x22,0x82,0x00,0x00,0x04,0x5b,0x00,0x00,0x22,0x83,0x00,0x00,0x22,0x83,0x00,0x00,0x04,0x5f,0x00,0x00,0x22,0x84,0x00,0x00,0x22,0x85,0x00,0x00,0x04,0x13,0x00,0x00,0x22,0x86,0x00,0x00,0x22,0x87,0x00,0x00,0x04,0x41,0x00,0x00,0x22,0x88,0x00,0x00,0x22,0x89,0x00,0x00,\r\n0x04,0x05,0x00,0x00,0x22,0x8e,0x00,0x00,0x22,0x8e,0x00,0x00,0x03,0xfd,0x00,0x00,0x22,0x8f,0x00,0x00,0x22,0x8f,0x00,0x00,0x04,0x55,0x00,0x00,0x22,0x90,0x00,0x00,0x22,0x90,0x00,0x00,0x04,0x57,0x00,0x00,0x22,0x91,0x00,0x00,0x22,0x91,0x00,0x00,0x04,0x56,0x00,0x00,0x22,0x92,0x00,0x00,0x22,0x92,0x00,0x00,0x04,0x58,0x00,0x00,\r\n0x22,0x93,0x00,0x00,0x22,0x94,0x00,0x00,0x04,0x4f,0x00,0x00,0x22,0x95,0x00,0x00,0x22,0x95,0x00,0x00,0x04,0x70,0x00,0x00,0x22,0x96,0x00,0x00,0x22,0x97,0x00,0x00,0x04,0x6d,0x00,0x00,0x22,0x98,0x00,0x00,0x22,0x98,0x00,0x00,0x04,0x6c,0x00,0x00,0x22,0x99,0x00,0x00,0x22,0x99,0x00,0x00,0x04,0x6f,0x00,0x00,0x22,0x9b,0x00,0x00,\r\n0x22,0x9b,0x00,0x00,0x04,0x69,0x00,0x00,0x22,0x9c,0x00,0x00,0x22,0x9c,0x00,0x00,0x04,0x6b,0x00,0x00,0x22,0x9d,0x00,0x00,0x22,0x9d,0x00,0x00,0x04,0x6a,0x00,0x00,0x22,0x9e,0x00,0x00,0x22,0x9e,0x00,0x00,0x04,0x53,0x00,0x00,0x22,0x9f,0x00,0x00,0x22,0x9f,0x00,0x00,0x04,0x52,0x00,0x00,0x22,0xa0,0x00,0x00,0x22,0xa0,0x00,0x00,\r\n0x04,0x54,0x00,0x00,0x22,0xa1,0x00,0x00,0x22,0xa1,0x00,0x00,0x04,0x51,0x00,0x00,0x22,0xa2,0x00,0x00,0x22,0xa2,0x00,0x00,0x04,0x4b,0x00,0x00,0x22,0xa3,0x00,0x00,0x22,0xa3,0x00,0x00,0x04,0x61,0x00,0x00,0x22,0xa4,0x00,0x00,0x22,0xa4,0x00,0x00,0x04,0x60,0x00,0x00,0x22,0xa5,0x00,0x00,0x22,0xa5,0x00,0x00,0x04,0x67,0x00,0x00,\r\n0x22,0xb4,0x00,0x00,0x22,0xb4,0x00,0x00,0x04,0x08,0x00,0x00,0x22,0xb8,0x00,0x00,0x22,0xb8,0x00,0x00,0x03,0xfc,0x00,0x00,0x22,0xbb,0x00,0x00,0x22,0xbb,0x00,0x00,0x04,0x68,0x00,0x00,0x22,0xbc,0x00,0x00,0x22,0xbc,0x00,0x00,0x04,0x01,0x00,0x00,0x22,0xbd,0x00,0x00,0x22,0xbd,0x00,0x00,0x04,0x07,0x00,0x00,0x22,0xc2,0x00,0x00,\r\n0x22,0xc3,0x00,0x00,0x04,0x02,0x00,0x00,0x22,0xc4,0x00,0x00,0x22,0xc4,0x00,0x00,0x03,0xdb,0x00,0x00,0x22,0xc6,0x00,0x00,0x22,0xc6,0x00,0x00,0x04,0x59,0x00,0x00,0x22,0xc8,0x00,0x00,0x22,0xc8,0x00,0x00,0x03,0xd3,0x00,0x00,0x22,0xc9,0x00,0x00,0x22,0xc9,0x00,0x00,0x03,0xf3,0x00,0x00,0x22,0xca,0x00,0x00,0x22,0xca,0x00,0x00,\r\n0x04,0x47,0x00,0x00,0x22,0xce,0x00,0x00,0x22,0xce,0x00,0x00,0x03,0xda,0x00,0x00,0x22,0xd0,0x00,0x00,0x22,0xd0,0x00,0x00,0x03,0xe0,0x00,0x00,0x22,0xe2,0x00,0x00,0x22,0xe2,0x00,0x00,0x04,0x12,0x00,0x00,0x22,0xee,0x00,0x00,0x22,0xee,0x00,0x00,0x03,0xe4,0x00,0x00,0x22,0xef,0x00,0x00,0x22,0xef,0x00,0x00,0x03,0xf8,0x00,0x00,\r\n0x22,0xf0,0x00,0x00,0x22,0xf0,0x00,0x00,0x04,0x66,0x00,0x00,0x22,0xf1,0x00,0x00,0x22,0xf1,0x00,0x00,0x03,0xe1,0x00,0x00,0x23,0x02,0x00,0x00,0x23,0x02,0x00,0x00,0x05,0xe1,0x00,0x00,0x23,0x03,0x00,0x00,0x23,0x03,0x00,0x00,0x05,0xca,0x00,0x00,0x23,0x04,0x00,0x00,0x23,0x04,0x00,0x00,0x04,0x91,0x00,0x00,0x23,0x05,0x00,0x00,\r\n0x23,0x05,0x00,0x00,0x05,0xf4,0x00,0x00,0x23,0x08,0x00,0x00,0x23,0x08,0x00,0x00,0x03,0x4f,0x00,0x00,0x23,0x09,0x00,0x00,0x23,0x09,0x00,0x00,0x03,0x52,0x00,0x00,0x23,0x0a,0x00,0x00,0x23,0x0a,0x00,0x00,0x03,0x50,0x00,0x00,0x23,0x0b,0x00,0x00,0x23,0x0b,0x00,0x00,0x03,0x53,0x00,0x00,0x23,0x18,0x00,0x00,0x23,0x18,0x00,0x00,\r\n0x05,0xe9,0x00,0x00,0x23,0x1c,0x00,0x00,0x23,0x1c,0x00,0x00,0x05,0xce,0x00,0x00,0x23,0x1d,0x00,0x00,0x23,0x1d,0x00,0x00,0x05,0xcd,0x00,0x00,0x23,0x1e,0x00,0x00,0x23,0x1f,0x00,0x00,0x05,0xcb,0x00,0x00,0x23,0x24,0x00,0x00,0x23,0x24,0x00,0x00,0x04,0x92,0x00,0x00,0x23,0x25,0x00,0x00,0x23,0x25,0x00,0x00,0x05,0xe6,0x00,0x00,\r\n0x23,0x26,0x00,0x00,0x23,0x26,0x00,0x00,0x05,0xe4,0x00,0x00,0x23,0x28,0x00,0x00,0x23,0x28,0x00,0x00,0x05,0xe5,0x00,0x00,0x23,0x2b,0x00,0x00,0x23,0x2b,0x00,0x00,0x05,0xe3,0x00,0x00,0x23,0x36,0x00,0x00,0x23,0x36,0x00,0x00,0x05,0x65,0x00,0x00,0x23,0x37,0x00,0x00,0x23,0x37,0x00,0x00,0x05,0xa0,0x00,0x00,0x23,0x38,0x00,0x00,\r\n0x23,0x38,0x00,0x00,0x05,0x8f,0x00,0x00,0x23,0x39,0x00,0x00,0x23,0x39,0x00,0x00,0x05,0x8c,0x00,0x00,0x23,0x3a,0x00,0x00,0x23,0x3a,0x00,0x00,0x05,0x8b,0x00,0x00,0x23,0x3b,0x00,0x00,0x23,0x3b,0x00,0x00,0x05,0x91,0x00,0x00,0x23,0x3c,0x00,0x00,0x23,0x3c,0x00,0x00,0x05,0x87,0x00,0x00,0x23,0x3d,0x00,0x00,0x23,0x3d,0x00,0x00,\r\n0x05,0x6d,0x00,0x00,0x23,0x3e,0x00,0x00,0x23,0x3e,0x00,0x00,0x05,0x6b,0x00,0x00,0x23,0x3f,0x00,0x00,0x23,0x3f,0x00,0x00,0x05,0x9f,0x00,0x00,0x23,0x40,0x00,0x00,0x23,0x40,0x00,0x00,0x05,0x68,0x00,0x00,0x23,0x41,0x00,0x00,0x23,0x41,0x00,0x00,0x05,0x97,0x00,0x00,0x23,0x42,0x00,0x00,0x23,0x42,0x00,0x00,0x05,0x86,0x00,0x00,\r\n0x23,0x43,0x00,0x00,0x23,0x43,0x00,0x00,0x05,0x93,0x00,0x00,0x23,0x44,0x00,0x00,0x23,0x44,0x00,0x00,0x05,0x90,0x00,0x00,0x23,0x45,0x00,0x00,0x23,0x45,0x00,0x00,0x05,0x82,0x00,0x00,0x23,0x46,0x00,0x00,0x23,0x46,0x00,0x00,0x05,0x9d,0x00,0x00,0x23,0x47,0x00,0x00,0x23,0x47,0x00,0x00,0x05,0x92,0x00,0x00,0x23,0x48,0x00,0x00,\r\n0x23,0x48,0x00,0x00,0x05,0x96,0x00,0x00,0x23,0x49,0x00,0x00,0x23,0x49,0x00,0x00,0x05,0x69,0x00,0x00,0x23,0x4a,0x00,0x00,0x23,0x4a,0x00,0x00,0x05,0x79,0x00,0x00,0x23,0x4b,0x00,0x00,0x23,0x4b,0x00,0x00,0x05,0x72,0x00,0x00,0x23,0x4c,0x00,0x00,0x23,0x4c,0x00,0x00,0x05,0x8e,0x00,0x00,0x23,0x4d,0x00,0x00,0x23,0x4d,0x00,0x00,\r\n0x05,0x8a,0x00,0x00,0x23,0x4e,0x00,0x00,0x23,0x4e,0x00,0x00,0x05,0x78,0x00,0x00,0x23,0x4f,0x00,0x00,0x23,0x4f,0x00,0x00,0x05,0xa9,0x00,0x00,0x23,0x50,0x00,0x00,0x23,0x50,0x00,0x00,0x05,0x98,0x00,0x00,0x23,0x51,0x00,0x00,0x23,0x51,0x00,0x00,0x05,0xa8,0x00,0x00,0x23,0x52,0x00,0x00,0x23,0x52,0x00,0x00,0x05,0x71,0x00,0x00,\r\n0x23,0x53,0x00,0x00,0x23,0x53,0x00,0x00,0x05,0x99,0x00,0x00,0x23,0x54,0x00,0x00,0x23,0x54,0x00,0x00,0x05,0x89,0x00,0x00,0x23,0x55,0x00,0x00,0x23,0x55,0x00,0x00,0x05,0xa7,0x00,0x00,0x23,0x56,0x00,0x00,0x23,0x56,0x00,0x00,0x05,0x7a,0x00,0x00,0x23,0x57,0x00,0x00,0x23,0x57,0x00,0x00,0x05,0x8d,0x00,0x00,0x23,0x58,0x00,0x00,\r\n0x23,0x58,0x00,0x00,0x05,0x9b,0x00,0x00,0x23,0x59,0x00,0x00,0x23,0x59,0x00,0x00,0x05,0x73,0x00,0x00,0x23,0x5a,0x00,0x00,0x23,0x5a,0x00,0x00,0x05,0x75,0x00,0x00,0x23,0x5b,0x00,0x00,0x23,0x5b,0x00,0x00,0x05,0x80,0x00,0x00,0x23,0x5c,0x00,0x00,0x23,0x5c,0x00,0x00,0x05,0x6e,0x00,0x00,0x23,0x5d,0x00,0x00,0x23,0x5d,0x00,0x00,\r\n0x05,0xa5,0x00,0x00,0x23,0x5e,0x00,0x00,0x23,0x5e,0x00,0x00,0x05,0x9a,0x00,0x00,0x23,0x5f,0x00,0x00,0x23,0x5f,0x00,0x00,0x05,0x6c,0x00,0x00,0x23,0x60,0x00,0x00,0x23,0x60,0x00,0x00,0x05,0x88,0x00,0x00,0x23,0x61,0x00,0x00,0x23,0x61,0x00,0x00,0x05,0xa6,0x00,0x00,0x23,0x62,0x00,0x00,0x23,0x62,0x00,0x00,0x05,0x70,0x00,0x00,\r\n0x23,0x63,0x00,0x00,0x23,0x63,0x00,0x00,0x05,0xa1,0x00,0x00,0x23,0x64,0x00,0x00,0x23,0x64,0x00,0x00,0x05,0x7f,0x00,0x00,0x23,0x65,0x00,0x00,0x23,0x65,0x00,0x00,0x05,0x6a,0x00,0x00,0x23,0x66,0x00,0x00,0x23,0x66,0x00,0x00,0x05,0x77,0x00,0x00,0x23,0x67,0x00,0x00,0x23,0x67,0x00,0x00,0x05,0x81,0x00,0x00,0x23,0x68,0x00,0x00,\r\n0x23,0x68,0x00,0x00,0x05,0xa3,0x00,0x00,0x23,0x69,0x00,0x00,0x23,0x69,0x00,0x00,0x05,0x7c,0x00,0x00,0x23,0x6a,0x00,0x00,0x23,0x6a,0x00,0x00,0x05,0x6f,0x00,0x00,0x23,0x6b,0x00,0x00,0x23,0x6b,0x00,0x00,0x05,0x74,0x00,0x00,0x23,0x6c,0x00,0x00,0x23,0x6c,0x00,0x00,0x05,0xaa,0x00,0x00,0x23,0x6d,0x00,0x00,0x23,0x6d,0x00,0x00,\r\n0x05,0xa2,0x00,0x00,0x23,0x6e,0x00,0x00,0x23,0x6e,0x00,0x00,0x05,0x9e,0x00,0x00,0x23,0x6f,0x00,0x00,0x23,0x70,0x00,0x00,0x05,0x94,0x00,0x00,0x23,0x71,0x00,0x00,0x23,0x71,0x00,0x00,0x05,0x76,0x00,0x00,0x23,0x72,0x00,0x00,0x23,0x72,0x00,0x00,0x05,0xa4,0x00,0x00,0x23,0x73,0x00,0x00,0x23,0x73,0x00,0x00,0x05,0x7d,0x00,0x00,\r\n0x23,0x74,0x00,0x00,0x23,0x74,0x00,0x00,0x05,0x9c,0x00,0x00,0x23,0x75,0x00,0x00,0x23,0x75,0x00,0x00,0x05,0x83,0x00,0x00,0x23,0x76,0x00,0x00,0x23,0x76,0x00,0x00,0x05,0x67,0x00,0x00,0x23,0x77,0x00,0x00,0x23,0x77,0x00,0x00,0x05,0x7b,0x00,0x00,0x23,0x78,0x00,0x00,0x23,0x78,0x00,0x00,0x05,0x7e,0x00,0x00,0x23,0x79,0x00,0x00,\r\n0x23,0x79,0x00,0x00,0x05,0x84,0x00,0x00,0x23,0x7a,0x00,0x00,0x23,0x7a,0x00,0x00,0x05,0x66,0x00,0x00,0x23,0x89,0x00,0x00,0x23,0x89,0x00,0x00,0x05,0xe0,0x00,0x00,0x23,0x8a,0x00,0x00,0x23,0x8a,0x00,0x00,0x05,0xd5,0x00,0x00,0x23,0x8b,0x00,0x00,0x23,0x8b,0x00,0x00,0x05,0xc7,0x00,0x00,0x23,0x95,0x00,0x00,0x23,0x95,0x00,0x00,\r\n0x05,0x85,0x00,0x00,0x23,0x9b,0x00,0x00,0x23,0x9b,0x00,0x00,0x04,0x34,0x00,0x00,0x23,0x9c,0x00,0x00,0x23,0x9d,0x00,0x00,0x04,0x32,0x00,0x00,0x23,0x9e,0x00,0x00,0x23,0x9e,0x00,0x00,0x04,0x37,0x00,0x00,0x23,0x9f,0x00,0x00,0x23,0xa0,0x00,0x00,0x04,0x35,0x00,0x00,0x23,0xa1,0x00,0x00,0x23,0xa1,0x00,0x00,0x03,0xf6,0x00,0x00,\r\n0x23,0xa2,0x00,0x00,0x23,0xa3,0x00,0x00,0x03,0xf4,0x00,0x00,0x23,0xa4,0x00,0x00,0x23,0xa4,0x00,0x00,0x04,0x4a,0x00,0x00,0x23,0xa5,0x00,0x00,0x23,0xa6,0x00,0x00,0x04,0x48,0x00,0x00,0x23,0xa7,0x00,0x00,0x23,0xa7,0x00,0x00,0x03,0xf2,0x00,0x00,0x23,0xa8,0x00,0x00,0x23,0xa8,0x00,0x00,0x03,0xf1,0x00,0x00,0x23,0xa9,0x00,0x00,\r\n0x23,0xa9,0x00,0x00,0x03,0xf0,0x00,0x00,0x23,0xaa,0x00,0x00,0x23,0xaa,0x00,0x00,0x03,0xd9,0x00,0x00,0x23,0xab,0x00,0x00,0x23,0xab,0x00,0x00,0x04,0x46,0x00,0x00,0x23,0xac,0x00,0x00,0x23,0xac,0x00,0x00,0x04,0x45,0x00,0x00,0x23,0xad,0x00,0x00,0x23,0xad,0x00,0x00,0x04,0x44,0x00,0x00,0x23,0xce,0x00,0x00,0x23,0xce,0x00,0x00,\r\n0x05,0xea,0x00,0x00,0x23,0xfb,0x00,0x00,0x23,0xfc,0x00,0x00,0x05,0xef,0x00,0x00,0x23,0xfd,0x00,0x00,0x23,0xfe,0x00,0x00,0x05,0xf2,0x00,0x00,0x24,0x00,0x00,0x00,0x24,0x00,0x00,0x00,0x05,0xee,0x00,0x00,0x24,0x01,0x00,0x00,0x24,0x02,0x00,0x00,0x05,0xfa,0x00,0x00,0x24,0x03,0x00,0x00,0x24,0x04,0x00,0x00,0x05,0xd7,0x00,0x00,\r\n0x24,0x05,0x00,0x00,0x24,0x05,0x00,0x00,0x05,0xda,0x00,0x00,0x24,0x06,0x00,0x00,0x24,0x06,0x00,0x00,0x05,0xb2,0x00,0x00,0x24,0x07,0x00,0x00,0x24,0x07,0x00,0x00,0x05,0xc5,0x00,0x00,0x24,0x08,0x00,0x00,0x24,0x08,0x00,0x00,0x05,0xb3,0x00,0x00,0x24,0x09,0x00,0x00,0x24,0x09,0x00,0x00,0x05,0xdf,0x00,0x00,0x24,0x0a,0x00,0x00,\r\n0x24,0x0a,0x00,0x00,0x05,0xeb,0x00,0x00,0x24,0x0b,0x00,0x00,0x24,0x0b,0x00,0x00,0x06,0x01,0x00,0x00,0x24,0x0c,0x00,0x00,0x24,0x0c,0x00,0x00,0x05,0xdd,0x00,0x00,0x24,0x0d,0x00,0x00,0x24,0x0d,0x00,0x00,0x05,0xc9,0x00,0x00,0x24,0x0e,0x00,0x00,0x24,0x0e,0x00,0x00,0x05,0xf8,0x00,0x00,0x24,0x0f,0x00,0x00,0x24,0x0f,0x00,0x00,\r\n0x05,0xf7,0x00,0x00,0x24,0x10,0x00,0x00,0x24,0x10,0x00,0x00,0x05,0xcf,0x00,0x00,0x24,0x11,0x00,0x00,0x24,0x11,0x00,0x00,0x05,0xd2,0x00,0x00,0x24,0x12,0x00,0x00,0x24,0x12,0x00,0x00,0x05,0xd4,0x00,0x00,0x24,0x13,0x00,0x00,0x24,0x13,0x00,0x00,0x05,0xd3,0x00,0x00,0x24,0x14,0x00,0x00,0x24,0x14,0x00,0x00,0x05,0xd1,0x00,0x00,\r\n0x24,0x15,0x00,0x00,0x24,0x15,0x00,0x00,0x05,0xec,0x00,0x00,0x24,0x16,0x00,0x00,0x24,0x16,0x00,0x00,0x05,0xfd,0x00,0x00,0x24,0x17,0x00,0x00,0x24,0x17,0x00,0x00,0x05,0xd9,0x00,0x00,0x24,0x18,0x00,0x00,0x24,0x18,0x00,0x00,0x05,0xc8,0x00,0x00,0x24,0x19,0x00,0x00,0x24,0x19,0x00,0x00,0x05,0xd6,0x00,0x00,0x24,0x1a,0x00,0x00,\r\n0x24,0x1a,0x00,0x00,0x05,0xfc,0x00,0x00,0x24,0x1b,0x00,0x00,0x24,0x1c,0x00,0x00,0x05,0xdb,0x00,0x00,0x24,0x1d,0x00,0x00,0x24,0x1d,0x00,0x00,0x05,0xde,0x00,0x00,0x24,0x1e,0x00,0x00,0x24,0x1e,0x00,0x00,0x05,0xf5,0x00,0x00,0x24,0x1f,0x00,0x00,0x24,0x1f,0x00,0x00,0x06,0x00,0x00,0x00,0x24,0x20,0x00,0x00,0x24,0x20,0x00,0x00,\r\n0x05,0xf9,0x00,0x00,0x24,0x21,0x00,0x00,0x24,0x21,0x00,0x00,0x05,0xd0,0x00,0x00,0x24,0x23,0x00,0x00,0x24,0x23,0x00,0x00,0x05,0xc6,0x00,0x00,0x24,0x24,0x00,0x00,0x24,0x24,0x00,0x00,0x05,0xed,0x00,0x00,0x25,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x05,0x2e,0x00,0x00,0x25,0x01,0x00,0x00,0x25,0x01,0x00,0x00,0x05,0x08,0x00,0x00,\r\n0x25,0x02,0x00,0x00,0x25,0x02,0x00,0x00,0x05,0x3b,0x00,0x00,0x25,0x03,0x00,0x00,0x25,0x03,0x00,0x00,0x05,0x15,0x00,0x00,0x25,0x04,0x00,0x00,0x25,0x04,0x00,0x00,0x05,0x34,0x00,0x00,0x25,0x05,0x00,0x00,0x25,0x05,0x00,0x00,0x05,0x0e,0x00,0x00,0x25,0x06,0x00,0x00,0x25,0x06,0x00,0x00,0x05,0x35,0x00,0x00,0x25,0x07,0x00,0x00,\r\n0x25,0x07,0x00,0x00,0x05,0x0f,0x00,0x00,0x25,0x08,0x00,0x00,0x25,0x08,0x00,0x00,0x05,0x31,0x00,0x00,0x25,0x09,0x00,0x00,0x25,0x09,0x00,0x00,0x05,0x0b,0x00,0x00,0x25,0x0a,0x00,0x00,0x25,0x0a,0x00,0x00,0x05,0x32,0x00,0x00,0x25,0x0b,0x00,0x00,0x25,0x0b,0x00,0x00,0x05,0x0c,0x00,0x00,0x25,0x0c,0x00,0x00,0x25,0x0c,0x00,0x00,\r\n0x05,0x2d,0x00,0x00,0x25,0x0d,0x00,0x00,0x25,0x0d,0x00,0x00,0x04,0xfc,0x00,0x00,0x25,0x0e,0x00,0x00,0x25,0x0e,0x00,0x00,0x04,0xf6,0x00,0x00,0x25,0x0f,0x00,0x00,0x25,0x0f,0x00,0x00,0x05,0x07,0x00,0x00,0x25,0x10,0x00,0x00,0x25,0x10,0x00,0x00,0x05,0x2c,0x00,0x00,0x25,0x11,0x00,0x00,0x25,0x11,0x00,0x00,0x04,0xfa,0x00,0x00,\r\n0x25,0x12,0x00,0x00,0x25,0x12,0x00,0x00,0x04,0xf4,0x00,0x00,0x25,0x13,0x00,0x00,0x25,0x13,0x00,0x00,0x05,0x06,0x00,0x00,0x25,0x14,0x00,0x00,0x25,0x14,0x00,0x00,0x05,0x3a,0x00,0x00,0x25,0x15,0x00,0x00,0x25,0x15,0x00,0x00,0x05,0x55,0x00,0x00,0x25,0x16,0x00,0x00,0x25,0x16,0x00,0x00,0x05,0x4f,0x00,0x00,0x25,0x17,0x00,0x00,\r\n0x25,0x17,0x00,0x00,0x05,0x14,0x00,0x00,0x25,0x18,0x00,0x00,0x25,0x18,0x00,0x00,0x05,0x39,0x00,0x00,0x25,0x19,0x00,0x00,0x25,0x19,0x00,0x00,0x05,0x53,0x00,0x00,0x25,0x1a,0x00,0x00,0x25,0x1a,0x00,0x00,0x05,0x4d,0x00,0x00,0x25,0x1b,0x00,0x00,0x25,0x1b,0x00,0x00,0x05,0x12,0x00,0x00,0x25,0x1c,0x00,0x00,0x25,0x1c,0x00,0x00,\r\n0x05,0x3e,0x00,0x00,0x25,0x1d,0x00,0x00,0x25,0x1d,0x00,0x00,0x05,0x61,0x00,0x00,0x25,0x1e,0x00,0x00,0x25,0x1e,0x00,0x00,0x05,0x4e,0x00,0x00,0x25,0x1f,0x00,0x00,0x25,0x1f,0x00,0x00,0x04,0xf7,0x00,0x00,0x25,0x20,0x00,0x00,0x25,0x20,0x00,0x00,0x05,0x5e,0x00,0x00,0x25,0x21,0x00,0x00,0x25,0x21,0x00,0x00,0x04,0xfd,0x00,0x00,\r\n0x25,0x22,0x00,0x00,0x25,0x22,0x00,0x00,0x05,0x54,0x00,0x00,0x25,0x23,0x00,0x00,0x25,0x23,0x00,0x00,0x05,0x18,0x00,0x00,0x25,0x24,0x00,0x00,0x25,0x24,0x00,0x00,0x05,0x3d,0x00,0x00,0x25,0x25,0x00,0x00,0x25,0x25,0x00,0x00,0x05,0x60,0x00,0x00,0x25,0x26,0x00,0x00,0x25,0x26,0x00,0x00,0x05,0x4c,0x00,0x00,0x25,0x27,0x00,0x00,\r\n0x25,0x27,0x00,0x00,0x04,0xf5,0x00,0x00,0x25,0x28,0x00,0x00,0x25,0x28,0x00,0x00,0x05,0x5d,0x00,0x00,0x25,0x29,0x00,0x00,0x25,0x29,0x00,0x00,0x04,0xfb,0x00,0x00,0x25,0x2a,0x00,0x00,0x25,0x2a,0x00,0x00,0x05,0x52,0x00,0x00,0x25,0x2b,0x00,0x00,0x25,0x2b,0x00,0x00,0x05,0x17,0x00,0x00,0x25,0x2c,0x00,0x00,0x25,0x2c,0x00,0x00,\r\n0x05,0x2b,0x00,0x00,0x25,0x2d,0x00,0x00,0x25,0x2d,0x00,0x00,0x05,0x1a,0x00,0x00,0x25,0x2e,0x00,0x00,0x25,0x2e,0x00,0x00,0x05,0x40,0x00,0x00,0x25,0x2f,0x00,0x00,0x25,0x2f,0x00,0x00,0x04,0xf9,0x00,0x00,0x25,0x30,0x00,0x00,0x25,0x30,0x00,0x00,0x04,0xf3,0x00,0x00,0x25,0x31,0x00,0x00,0x25,0x31,0x00,0x00,0x05,0x43,0x00,0x00,\r\n0x25,0x32,0x00,0x00,0x25,0x32,0x00,0x00,0x05,0x1d,0x00,0x00,0x25,0x33,0x00,0x00,0x25,0x33,0x00,0x00,0x05,0x05,0x00,0x00,0x25,0x34,0x00,0x00,0x25,0x34,0x00,0x00,0x05,0x38,0x00,0x00,0x25,0x35,0x00,0x00,0x25,0x35,0x00,0x00,0x05,0x1b,0x00,0x00,0x25,0x36,0x00,0x00,0x25,0x36,0x00,0x00,0x05,0x41,0x00,0x00,0x25,0x37,0x00,0x00,\r\n0x25,0x37,0x00,0x00,0x05,0x51,0x00,0x00,0x25,0x38,0x00,0x00,0x25,0x38,0x00,0x00,0x05,0x4b,0x00,0x00,0x25,0x39,0x00,0x00,0x25,0x39,0x00,0x00,0x05,0x44,0x00,0x00,0x25,0x3a,0x00,0x00,0x25,0x3a,0x00,0x00,0x05,0x1e,0x00,0x00,0x25,0x3b,0x00,0x00,0x25,0x3b,0x00,0x00,0x05,0x11,0x00,0x00,0x25,0x3c,0x00,0x00,0x25,0x3c,0x00,0x00,\r\n0x05,0x3c,0x00,0x00,0x25,0x3d,0x00,0x00,0x25,0x3d,0x00,0x00,0x05,0x1c,0x00,0x00,0x25,0x3e,0x00,0x00,0x25,0x3e,0x00,0x00,0x05,0x42,0x00,0x00,0x25,0x3f,0x00,0x00,0x25,0x3f,0x00,0x00,0x05,0x5f,0x00,0x00,0x25,0x40,0x00,0x00,0x25,0x40,0x00,0x00,0x05,0x4a,0x00,0x00,0x25,0x41,0x00,0x00,0x25,0x41,0x00,0x00,0x04,0xf8,0x00,0x00,\r\n0x25,0x42,0x00,0x00,0x25,0x42,0x00,0x00,0x05,0x5c,0x00,0x00,0x25,0x43,0x00,0x00,0x25,0x43,0x00,0x00,0x05,0x20,0x00,0x00,0x25,0x44,0x00,0x00,0x25,0x44,0x00,0x00,0x05,0x46,0x00,0x00,0x25,0x45,0x00,0x00,0x25,0x45,0x00,0x00,0x05,0x19,0x00,0x00,0x25,0x46,0x00,0x00,0x25,0x46,0x00,0x00,0x05,0x3f,0x00,0x00,0x25,0x47,0x00,0x00,\r\n0x25,0x47,0x00,0x00,0x04,0xfe,0x00,0x00,0x25,0x48,0x00,0x00,0x25,0x48,0x00,0x00,0x05,0x50,0x00,0x00,0x25,0x49,0x00,0x00,0x25,0x49,0x00,0x00,0x05,0x45,0x00,0x00,0x25,0x4a,0x00,0x00,0x25,0x4a,0x00,0x00,0x05,0x1f,0x00,0x00,0x25,0x4b,0x00,0x00,0x25,0x4b,0x00,0x00,0x05,0x16,0x00,0x00,0x25,0x4c,0x00,0x00,0x25,0x4c,0x00,0x00,\r\n0x05,0x28,0x00,0x00,0x25,0x4d,0x00,0x00,0x25,0x4d,0x00,0x00,0x05,0x02,0x00,0x00,0x25,0x4e,0x00,0x00,0x25,0x4e,0x00,0x00,0x05,0x29,0x00,0x00,0x25,0x4f,0x00,0x00,0x25,0x4f,0x00,0x00,0x05,0x03,0x00,0x00,0x25,0x50,0x00,0x00,0x25,0x50,0x00,0x00,0x04,0xe8,0x00,0x00,0x25,0x51,0x00,0x00,0x25,0x51,0x00,0x00,0x04,0xec,0x00,0x00,\r\n0x25,0x52,0x00,0x00,0x25,0x52,0x00,0x00,0x05,0x01,0x00,0x00,0x25,0x53,0x00,0x00,0x25,0x53,0x00,0x00,0x04,0xf2,0x00,0x00,0x25,0x54,0x00,0x00,0x25,0x54,0x00,0x00,0x04,0xe7,0x00,0x00,0x25,0x55,0x00,0x00,0x25,0x55,0x00,0x00,0x05,0x00,0x00,0x00,0x25,0x56,0x00,0x00,0x25,0x56,0x00,0x00,0x04,0xf1,0x00,0x00,0x25,0x57,0x00,0x00,\r\n0x25,0x57,0x00,0x00,0x04,0xe6,0x00,0x00,0x25,0x58,0x00,0x00,0x25,0x58,0x00,0x00,0x05,0x58,0x00,0x00,0x25,0x59,0x00,0x00,0x25,0x59,0x00,0x00,0x05,0x49,0x00,0x00,0x25,0x5a,0x00,0x00,0x25,0x5a,0x00,0x00,0x04,0xeb,0x00,0x00,0x25,0x5b,0x00,0x00,0x25,0x5b,0x00,0x00,0x05,0x57,0x00,0x00,0x25,0x5c,0x00,0x00,0x25,0x5c,0x00,0x00,\r\n0x05,0x48,0x00,0x00,0x25,0x5d,0x00,0x00,0x25,0x5d,0x00,0x00,0x04,0xea,0x00,0x00,0x25,0x5e,0x00,0x00,0x25,0x5e,0x00,0x00,0x05,0x64,0x00,0x00,0x25,0x5f,0x00,0x00,0x25,0x5f,0x00,0x00,0x05,0x5b,0x00,0x00,0x25,0x60,0x00,0x00,0x25,0x60,0x00,0x00,0x04,0xef,0x00,0x00,0x25,0x61,0x00,0x00,0x25,0x61,0x00,0x00,0x05,0x63,0x00,0x00,\r\n0x25,0x62,0x00,0x00,0x25,0x62,0x00,0x00,0x05,0x5a,0x00,0x00,0x25,0x63,0x00,0x00,0x25,0x63,0x00,0x00,0x04,0xee,0x00,0x00,0x25,0x64,0x00,0x00,0x25,0x64,0x00,0x00,0x04,0xff,0x00,0x00,0x25,0x65,0x00,0x00,0x25,0x65,0x00,0x00,0x04,0xf0,0x00,0x00,0x25,0x66,0x00,0x00,0x25,0x66,0x00,0x00,0x04,0xe5,0x00,0x00,0x25,0x67,0x00,0x00,\r\n0x25,0x67,0x00,0x00,0x05,0x56,0x00,0x00,0x25,0x68,0x00,0x00,0x25,0x68,0x00,0x00,0x05,0x47,0x00,0x00,0x25,0x69,0x00,0x00,0x25,0x69,0x00,0x00,0x04,0xe9,0x00,0x00,0x25,0x6a,0x00,0x00,0x25,0x6a,0x00,0x00,0x05,0x62,0x00,0x00,0x25,0x6b,0x00,0x00,0x25,0x6b,0x00,0x00,0x05,0x59,0x00,0x00,0x25,0x6c,0x00,0x00,0x25,0x6c,0x00,0x00,\r\n0x04,0xed,0x00,0x00,0x25,0x6d,0x00,0x00,0x25,0x6d,0x00,0x00,0x05,0x22,0x00,0x00,0x25,0x6e,0x00,0x00,0x25,0x6e,0x00,0x00,0x05,0x21,0x00,0x00,0x25,0x6f,0x00,0x00,0x25,0x70,0x00,0x00,0x05,0x23,0x00,0x00,0x25,0x71,0x00,0x00,0x25,0x71,0x00,0x00,0x05,0x27,0x00,0x00,0x25,0x72,0x00,0x00,0x25,0x72,0x00,0x00,0x05,0x26,0x00,0x00,\r\n0x25,0x73,0x00,0x00,0x25,0x73,0x00,0x00,0x05,0x25,0x00,0x00,0x25,0x74,0x00,0x00,0x25,0x74,0x00,0x00,0x05,0x2f,0x00,0x00,0x25,0x75,0x00,0x00,0x25,0x75,0x00,0x00,0x05,0x36,0x00,0x00,0x25,0x76,0x00,0x00,0x25,0x76,0x00,0x00,0x05,0x33,0x00,0x00,0x25,0x77,0x00,0x00,0x25,0x77,0x00,0x00,0x05,0x2a,0x00,0x00,0x25,0x78,0x00,0x00,\r\n0x25,0x78,0x00,0x00,0x05,0x09,0x00,0x00,0x25,0x79,0x00,0x00,0x25,0x79,0x00,0x00,0x05,0x10,0x00,0x00,0x25,0x7a,0x00,0x00,0x25,0x7a,0x00,0x00,0x05,0x0d,0x00,0x00,0x25,0x7b,0x00,0x00,0x25,0x7b,0x00,0x00,0x05,0x04,0x00,0x00,0x25,0x7c,0x00,0x00,0x25,0x7c,0x00,0x00,0x05,0x30,0x00,0x00,0x25,0x7d,0x00,0x00,0x25,0x7d,0x00,0x00,\r\n0x05,0x37,0x00,0x00,0x25,0x7e,0x00,0x00,0x25,0x7e,0x00,0x00,0x05,0x0a,0x00,0x00,0x25,0x7f,0x00,0x00,0x25,0x7f,0x00,0x00,0x05,0x13,0x00,0x00,0x25,0x80,0x00,0x00,0x25,0x80,0x00,0x00,0x04,0xa2,0x00,0x00,0x25,0x81,0x00,0x00,0x25,0x88,0x00,0x00,0x04,0x9a,0x00,0x00,0x25,0x89,0x00,0x00,0x25,0x89,0x00,0x00,0x04,0xaa,0x00,0x00,\r\n0x25,0x8a,0x00,0x00,0x25,0x8a,0x00,0x00,0x04,0xa9,0x00,0x00,0x25,0x8b,0x00,0x00,0x25,0x8b,0x00,0x00,0x04,0xa8,0x00,0x00,0x25,0x8c,0x00,0x00,0x25,0x8c,0x00,0x00,0x04,0xa7,0x00,0x00,0x25,0x8d,0x00,0x00,0x25,0x8d,0x00,0x00,0x04,0xa6,0x00,0x00,0x25,0x8e,0x00,0x00,0x25,0x8e,0x00,0x00,0x04,0xa5,0x00,0x00,0x25,0x8f,0x00,0x00,\r\n0x25,0x8f,0x00,0x00,0x04,0xa4,0x00,0x00,0x25,0x90,0x00,0x00,0x25,0x90,0x00,0x00,0x04,0xab,0x00,0x00,0x25,0x91,0x00,0x00,0x25,0x93,0x00,0x00,0x04,0xb7,0x00,0x00,0x25,0x94,0x00,0x00,0x25,0x94,0x00,0x00,0x04,0xa3,0x00,0x00,0x25,0x95,0x00,0x00,0x25,0x9f,0x00,0x00,0x04,0xac,0x00,0x00,0x25,0xa0,0x00,0x00,0x25,0xa1,0x00,0x00,\r\n0x04,0xc8,0x00,0x00,0x25,0xaa,0x00,0x00,0x25,0xab,0x00,0x00,0x04,0xca,0x00,0x00,0x25,0xb2,0x00,0x00,0x25,0xb2,0x00,0x00,0x04,0xd1,0x00,0x00,0x25,0xb3,0x00,0x00,0x25,0xb3,0x00,0x00,0x04,0xd5,0x00,0x00,0x25,0xb4,0x00,0x00,0x25,0xb4,0x00,0x00,0x04,0xdd,0x00,0x00,0x25,0xb5,0x00,0x00,0x25,0xb5,0x00,0x00,0x04,0xe1,0x00,0x00,\r\n0x25,0xb6,0x00,0x00,0x25,0xb6,0x00,0x00,0x04,0xd2,0x00,0x00,0x25,0xb7,0x00,0x00,0x25,0xb7,0x00,0x00,0x04,0xd6,0x00,0x00,0x25,0xb8,0x00,0x00,0x25,0xb8,0x00,0x00,0x04,0xde,0x00,0x00,0x25,0xb9,0x00,0x00,0x25,0xb9,0x00,0x00,0x04,0xe2,0x00,0x00,0x25,0xba,0x00,0x00,0x25,0xba,0x00,0x00,0x04,0xd9,0x00,0x00,0x25,0xbb,0x00,0x00,\r\n0x25,0xbb,0x00,0x00,0x04,0xdb,0x00,0x00,0x25,0xbc,0x00,0x00,0x25,0xbc,0x00,0x00,0x04,0xd3,0x00,0x00,0x25,0xbd,0x00,0x00,0x25,0xbd,0x00,0x00,0x04,0xd7,0x00,0x00,0x25,0xbe,0x00,0x00,0x25,0xbe,0x00,0x00,0x04,0xdf,0x00,0x00,0x25,0xbf,0x00,0x00,0x25,0xbf,0x00,0x00,0x04,0xe3,0x00,0x00,0x25,0xc0,0x00,0x00,0x25,0xc0,0x00,0x00,\r\n0x04,0xd4,0x00,0x00,0x25,0xc1,0x00,0x00,0x25,0xc1,0x00,0x00,0x04,0xd8,0x00,0x00,0x25,0xc2,0x00,0x00,0x25,0xc2,0x00,0x00,0x04,0xe0,0x00,0x00,0x25,0xc3,0x00,0x00,0x25,0xc3,0x00,0x00,0x04,0xe4,0x00,0x00,0x25,0xc4,0x00,0x00,0x25,0xc4,0x00,0x00,0x04,0xda,0x00,0x00,0x25,0xc5,0x00,0x00,0x25,0xc5,0x00,0x00,0x04,0xdc,0x00,0x00,\r\n0x25,0xc6,0x00,0x00,0x25,0xc8,0x00,0x00,0x04,0xc4,0x00,0x00,0x25,0xc9,0x00,0x00,0x25,0xc9,0x00,0x00,0x04,0xc1,0x00,0x00,0x25,0xca,0x00,0x00,0x25,0xca,0x00,0x00,0x04,0xc7,0x00,0x00,0x25,0xcb,0x00,0x00,0x25,0xcb,0x00,0x00,0x04,0xbb,0x00,0x00,0x25,0xcc,0x00,0x00,0x25,0xcc,0x00,0x00,0x04,0xc0,0x00,0x00,0x25,0xce,0x00,0x00,\r\n0x25,0xce,0x00,0x00,0x04,0xc2,0x00,0x00,0x25,0xcf,0x00,0x00,0x25,0xcf,0x00,0x00,0x04,0xba,0x00,0x00,0x25,0xd4,0x00,0x00,0x25,0xd5,0x00,0x00,0x04,0xbd,0x00,0x00,0x25,0xe6,0x00,0x00,0x25,0xe6,0x00,0x00,0x04,0xc3,0x00,0x00,0x25,0xe7,0x00,0x00,0x25,0xeb,0x00,0x00,0x04,0xcc,0x00,0x00,0x25,0xef,0x00,0x00,0x25,0xef,0x00,0x00,\r\n0x04,0xbc,0x00,0x00,0x25,0xf6,0x00,0x00,0x25,0xf6,0x00,0x00,0x04,0xbf,0x00,0x00,0x26,0x6d,0x00,0x00,0x26,0x6d,0x00,0x00,0x06,0x60,0x00,0x00,0x26,0x6f,0x00,0x00,0x26,0x6f,0x00,0x00,0x06,0x61,0x00,0x00,0x26,0x87,0x00,0x00,0x26,0x87,0x00,0x00,0x05,0xab,0x00,0x00,0x26,0xa0,0x00,0x00,0x26,0xa1,0x00,0x00,0x05,0xac,0x00,0x00,\r\n0x27,0x13,0x00,0x00,0x27,0x13,0x00,0x00,0x05,0xae,0x00,0x00,0x27,0x15,0x00,0x00,0x27,0x15,0x00,0x00,0x05,0xaf,0x00,0x00,0x27,0x17,0x00,0x00,0x27,0x17,0x00,0x00,0x05,0xb0,0x00,0x00,0x27,0x36,0x00,0x00,0x27,0x36,0x00,0x00,0x05,0xb1,0x00,0x00,0x27,0x6e,0x00,0x00,0x27,0x6e,0x00,0x00,0x03,0x4c,0x00,0x00,0x27,0x6f,0x00,0x00,\r\n0x27,0x6f,0x00,0x00,0x03,0x4e,0x00,0x00,0x27,0x70,0x00,0x00,0x27,0x70,0x00,0x00,0x03,0x4b,0x00,0x00,0x27,0x71,0x00,0x00,0x27,0x71,0x00,0x00,0x03,0x4d,0x00,0x00,0x27,0x94,0x00,0x00,0x27,0x94,0x00,0x00,0x04,0x93,0x00,0x00,0x27,0x9c,0x00,0x00,0x27,0x9e,0x00,0x00,0x04,0x94,0x00,0x00,0x27,0xc5,0x00,0x00,0x27,0xc5,0x00,0x00,\r\n0x03,0x51,0x00,0x00,0x27,0xc6,0x00,0x00,0x27,0xc6,0x00,0x00,0x03,0x54,0x00,0x00,0x27,0xdc,0x00,0x00,0x27,0xdc,0x00,0x00,0x03,0xef,0x00,0x00,0x27,0xe6,0x00,0x00,0x27,0xe6,0x00,0x00,0x03,0xb6,0x00,0x00,0x27,0xe7,0x00,0x00,0x27,0xe7,0x00,0x00,0x03,0xb9,0x00,0x00,0x27,0xe8,0x00,0x00,0x27,0xe8,0x00,0x00,0x03,0xb4,0x00,0x00,\r\n0x27,0xe9,0x00,0x00,0x27,0xe9,0x00,0x00,0x03,0xb7,0x00,0x00,0x27,0xea,0x00,0x00,0x27,0xea,0x00,0x00,0x03,0xb5,0x00,0x00,0x27,0xeb,0x00,0x00,0x27,0xeb,0x00,0x00,0x03,0xb8,0x00,0x00,0x27,0xf5,0x00,0x00,0x27,0xf7,0x00,0x00,0x04,0x97,0x00,0x00,0x29,0x16,0x00,0x00,0x29,0x16,0x00,0x00,0x04,0x43,0x00,0x00,0x29,0x4a,0x00,0x00,\r\n0x29,0x4a,0x00,0x00,0x03,0xee,0x00,0x00,0x29,0x87,0x00,0x00,0x29,0x88,0x00,0x00,0x03,0x55,0x00,0x00,0x2a,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x03,0xfe,0x00,0x00,0x2a,0x05,0x00,0x00,0x2a,0x06,0x00,0x00,0x03,0xff,0x00,0x00,0x2b,0x58,0x00,0x00,0x2b,0x58,0x00,0x00,0x05,0xf1,0x00,0x00,0xe0,0xa0,0x00,0x00,0xe0,0xa2,0x00,0x00,\r\n0x06,0xc4,0x00,0x00,0xe0,0xb0,0x00,0x00,0xe0,0xb3,0x00,0x00,0x06,0xc7,0x00,0x00,0xfe,0x62,0x00,0x00,0xfe,0x62,0x00,0x00,0x04,0x3a,0x00,0x00,0xfe,0xff,0x00,0x00,0xfe,0xff,0x00,0x00,0x03,0xc1,0x00,0x00,0xff,0x5b,0x00,0x00,0xff,0x5b,0x00,0x00,0x03,0x49,0x00,0x00,0xff,0x5d,0x00,0x00,0xff,0x5d,0x00,0x00,0x03,0x4a,0x00,0x00,\r\n0xff,0xfd,0x00,0x00,0xff,0xfd,0x00,0x00,0x05,0xf6,0x00,0x01,0x69,0x10,0x00,0x01,0x69,0x10,0x00,0x00,0x02,0x9f,0x00,0x01,0xd5,0x38,0x00,0x01,0xd5,0x39,0x00,0x00,0x02,0xa0,0x00,0x01,0xd5,0x3b,0x00,0x01,0xd5,0x3e,0x00,0x00,0x02,0xa3,0x00,0x01,0xd5,0x40,0x00,0x01,0xd5,0x44,0x00,0x00,0x02,0xa8,0x00,0x01,0xd5,0x46,0x00,0x01,\r\n0xd5,0x46,0x00,0x00,0x02,0xae,0x00,0x01,0xd5,0x4a,0x00,0x01,0xd5,0x50,0x00,0x00,0x02,0xb2,0x00,0x01,0xd5,0x52,0x00,0x01,0xd5,0x6b,0x00,0x00,0x02,0xba,0x00,0x00,0xb0,0x00,0x2c,0x20,0xb0,0x00,0x55,0x58,0x45,0x59,0x20,0x20,0x4b,0xb8,0x00,0x0e,0x51,0x4b,0xb0,0x06,0x53,0x5a,0x58,0xb0,0x34,0x1b,0xb0,0x28,0x59,0x60,0x66,0x20,\r\n0x8a,0x55,0x58,0xb0,0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x62,0x1b,0x21,0x21,0xb0,0x00,0x59,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x01,0x2c,0xb0,0x20,0x60,0x66,0x2d,0xb0,0x02,0x2c,0x23,0x21,0x23,0x21,0x2d,0xb0,0x03,0x2c,0x20,0x64,0xb3,0x03,0x14,0x15,0x00,0x42,0x43,0xb0,\r\n0x13,0x43,0x20,0x60,0x60,0x42,0xb1,0x02,0x14,0x43,0x42,0xb1,0x25,0x03,0x43,0xb0,0x02,0x43,0x54,0x78,0x20,0xb0,0x0c,0x23,0xb0,0x02,0x43,0x43,0x61,0x64,0xb0,0x04,0x50,0x78,0xb2,0x02,0x02,0x02,0x43,0x60,0x42,0xb0,0x21,0x65,0x1c,0x21,0xb0,0x02,0x43,0x43,0xb2,0x0e,0x15,0x01,0x42,0x1c,0x20,0xb0,0x02,0x43,0x23,0x42,0xb2,0x13,\r\n0x01,0x13,0x43,0x60,0x42,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb2,0x16,0x01,0x02,0x43,0x60,0x42,0x2d,0xb0,0x04,0x2c,0xb0,0x03,0x2b,0xb0,0x15,0x43,0x58,0x23,0x21,0x23,0x21,0xb0,0x16,0x43,0x43,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x1b,0x20,0x64,0x20,0xb0,0xc0,0x50,0xb0,0x04,0x26,0x5a,0xb2,0x28,0x01,0x0d,0x43,0x45,0x63,0x45,\r\n0xb0,0x06,0x45,0x58,0x21,0xb0,0x03,0x25,0x59,0x52,0x5b,0x58,0x21,0x23,0x21,0x1b,0x8a,0x58,0x20,0xb0,0x50,0x50,0x58,0x21,0xb0,0x40,0x59,0x1b,0x20,0xb0,0x38,0x50,0x58,0x21,0xb0,0x38,0x59,0x59,0x20,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x61,0x64,0xb0,0x28,0x50,0x58,0x21,0xb1,0x01,0x0d,0x43,0x45,0x63,0x45,0x20,0xb0,0x30,0x50,\r\n0x58,0x21,0xb0,0x30,0x59,0x1b,0x20,0xb0,0xc0,0x50,0x58,0x20,0x66,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x0a,0x50,0x58,0x60,0x1b,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x0a,0x60,0x1b,0x20,0xb0,0x36,0x50,0x58,0x21,0xb0,0x36,0x60,0x1b,0x60,0x59,0x59,0x59,0x1b,0xb0,0x02,0x25,0xb0,0x0c,0x43,0x63,0xb0,0x00,0x52,0x58,0xb0,0x00,0x4b,0xb0,\r\n0x0a,0x50,0x58,0x21,0xb0,0x0c,0x43,0x1b,0x4b,0xb0,0x1e,0x50,0x58,0x21,0xb0,0x1e,0x4b,0x61,0xb8,0x10,0x00,0x63,0xb0,0x0c,0x43,0x63,0xb8,0x05,0x00,0x62,0x59,0x59,0x64,0x61,0x59,0xb0,0x01,0x2b,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x59,0x20,0x64,0xb0,0x16,0x43,0x23,0x42,0x59,0x2d,0xb0,0x05,0x2c,0x20,0x45,0x20,0xb0,\r\n0x04,0x25,0x61,0x64,0x20,0xb0,0x07,0x43,0x50,0x58,0xb0,0x07,0x23,0x42,0xb0,0x08,0x23,0x42,0x1b,0x21,0x21,0x59,0xb0,0x01,0x60,0x2d,0xb0,0x06,0x2c,0x23,0x21,0x23,0x21,0xb0,0x03,0x2b,0x20,0x64,0xb1,0x07,0x62,0x42,0x20,0xb0,0x08,0x23,0x42,0xb0,0x06,0x45,0x58,0x1b,0xb1,0x01,0x0d,0x43,0x45,0x63,0xb1,0x01,0x0d,0x43,0xb0,0x05,\r\n0x60,0x45,0x63,0xb0,0x05,0x2a,0x21,0x20,0xb0,0x08,0x43,0x20,0x8a,0x20,0x8a,0xb0,0x01,0x2b,0xb1,0x30,0x05,0x25,0xb0,0x04,0x26,0x51,0x58,0x60,0x50,0x1b,0x61,0x52,0x59,0x58,0x23,0x59,0x21,0x59,0x20,0xb0,0x40,0x53,0x58,0xb0,0x01,0x2b,0x1b,0x21,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0x2d,0xb0,0x07,0x2c,0xb0,0x09,\r\n0x43,0x2b,0xb2,0x00,0x02,0x00,0x43,0x60,0x42,0x2d,0xb0,0x08,0x2c,0xb0,0x09,0x23,0x42,0x23,0x20,0xb0,0x00,0x23,0x42,0x61,0xb0,0x02,0x62,0x66,0xb0,0x01,0x63,0xb0,0x01,0x60,0xb0,0x07,0x2a,0x2d,0xb0,0x09,0x2c,0x20,0x20,0x45,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,\r\n0x01,0x63,0x60,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0a,0x2c,0xb2,0x09,0x0e,0x00,0x43,0x45,0x42,0x2a,0x21,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0b,0x2c,0xb0,0x00,0x43,0x23,0x44,0xb2,0x00,0x01,0x00,0x43,0x60,0x42,0x2d,0xb0,0x0c,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,\r\n0x8a,0x23,0x61,0x20,0x64,0x20,0xb0,0x20,0x50,0x58,0x21,0xb0,0x00,0x1b,0xb0,0x30,0x50,0x58,0xb0,0x20,0x1b,0xb0,0x40,0x59,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0d,0x2c,0x20,0x20,0x45,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x00,0x43,0xb0,0x04,0x25,0x60,0x20,0x45,0x8a,\r\n0x23,0x61,0x20,0x64,0xb0,0x24,0x50,0x58,0xb0,0x00,0x1b,0xb0,0x40,0x59,0x23,0xb0,0x00,0x50,0x58,0x65,0x59,0xb0,0x03,0x25,0x23,0x61,0x44,0x44,0xb0,0x01,0x60,0x2d,0xb0,0x0e,0x2c,0x20,0xb0,0x00,0x23,0x42,0xb3,0x0d,0x0c,0x00,0x03,0x45,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x2a,0x21,0x2d,0xb0,0x0f,0x2c,0xb1,0x02,0x02,0x45,0xb0,\r\n0x64,0x61,0x44,0x2d,0xb0,0x10,0x2c,0xb0,0x01,0x60,0x20,0x20,0xb0,0x0f,0x43,0x4a,0xb0,0x00,0x50,0x58,0x20,0xb0,0x0f,0x23,0x42,0x59,0xb0,0x10,0x43,0x4a,0xb0,0x00,0x52,0x58,0x20,0xb0,0x10,0x23,0x42,0x59,0x2d,0xb0,0x11,0x2c,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0x20,0xb8,0x04,0x00,0x63,0x8a,0x23,0x61,0xb0,0x11,0x43,0x60,\r\n0x20,0x8a,0x60,0x20,0xb0,0x11,0x23,0x42,0x23,0x2d,0xb0,0x12,0x2c,0x4b,0x54,0x58,0xb1,0x04,0x64,0x44,0x59,0x24,0xb0,0x0d,0x65,0x23,0x78,0x2d,0xb0,0x13,0x2c,0x4b,0x51,0x58,0x4b,0x53,0x58,0xb1,0x04,0x64,0x44,0x59,0x1b,0x21,0x59,0x24,0xb0,0x13,0x65,0x23,0x78,0x2d,0xb0,0x14,0x2c,0xb1,0x00,0x12,0x43,0x55,0x58,0xb1,0x12,0x12,\r\n0x43,0xb0,0x01,0x61,0x42,0xb0,0x11,0x2b,0x59,0xb0,0x00,0x43,0xb0,0x02,0x25,0x42,0xb1,0x0f,0x02,0x25,0x42,0xb1,0x10,0x02,0x25,0x42,0xb0,0x01,0x16,0x23,0x20,0xb0,0x03,0x25,0x50,0x58,0xb1,0x01,0x00,0x43,0x60,0xb0,0x04,0x25,0x42,0x8a,0x8a,0x20,0x8a,0x23,0x61,0xb0,0x10,0x2a,0x21,0x23,0xb0,0x01,0x61,0x20,0x8a,0x23,0x61,0xb0,\r\n0x10,0x2a,0x21,0x1b,0xb1,0x01,0x00,0x43,0x60,0xb0,0x02,0x25,0x42,0xb0,0x02,0x25,0x61,0xb0,0x10,0x2a,0x21,0x59,0xb0,0x0f,0x43,0x47,0xb0,0x10,0x43,0x47,0x60,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,\r\n0x59,0x66,0xb0,0x01,0x63,0x60,0xb1,0x00,0x00,0x13,0x23,0x44,0xb0,0x01,0x43,0xb0,0x00,0x3e,0xb2,0x01,0x01,0x01,0x43,0x60,0x42,0x2d,0xb0,0x15,0x2c,0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x05,0x60,0x42,0x20,0x60,0xb7,0x18,0x18,0x01,0x00,0x11,0x00,0x13,0x00,\r\n0x42,0x42,0x42,0x8a,0x60,0x20,0xb0,0x14,0x23,0x42,0xb0,0x01,0x61,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x16,0x2c,0xb1,0x00,0x15,0x2b,0x2d,0xb0,0x17,0x2c,0xb1,0x01,0x15,0x2b,0x2d,0xb0,0x18,0x2c,0xb1,0x02,0x15,0x2b,0x2d,0xb0,0x19,0x2c,0xb1,0x03,0x15,0x2b,0x2d,0xb0,0x1a,0x2c,0xb1,0x04,0x15,0x2b,0x2d,\r\n0xb0,0x1b,0x2c,0xb1,0x05,0x15,0x2b,0x2d,0xb0,0x1c,0x2c,0xb1,0x06,0x15,0x2b,0x2d,0xb0,0x1d,0x2c,0xb1,0x07,0x15,0x2b,0x2d,0xb0,0x1e,0x2c,0xb1,0x08,0x15,0x2b,0x2d,0xb0,0x1f,0x2c,0xb1,0x09,0x15,0x2b,0x2d,0xb0,0x2b,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x06,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x5d,\r\n0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2c,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x16,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x71,0x1b,0x21,0x21,0x59,0x2d,0xb0,0x2d,0x2c,0x23,0x20,0xb0,0x10,0x62,0x66,0xb0,0x01,0x63,0xb0,0x26,0x60,0x4b,0x54,0x58,0x23,0x20,0x2e,0xb0,0x01,0x72,0x1b,0x21,0x21,0x59,0x2d,0xb0,\r\n0x20,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb0,0x12,0x23,0x42,0x20,0x45,0xb0,0x0e,0x23,0x42,0xb0,0x0d,0x23,0xb0,0x05,0x60,0x42,0x20,0x60,0xb0,0x01,0x61,0xb5,0x18,0x18,0x01,0x00,0x11,0x00,0x42,0x42,0x8a,0x60,0xb1,0x14,0x08,0x2b,0xb0,0x8b,0x2b,0x1b,0x22,0x59,0x2d,0xb0,0x21,0x2c,0xb1,0x00,0x20,0x2b,0x2d,\r\n0xb0,0x22,0x2c,0xb1,0x01,0x20,0x2b,0x2d,0xb0,0x23,0x2c,0xb1,0x02,0x20,0x2b,0x2d,0xb0,0x24,0x2c,0xb1,0x03,0x20,0x2b,0x2d,0xb0,0x25,0x2c,0xb1,0x04,0x20,0x2b,0x2d,0xb0,0x26,0x2c,0xb1,0x05,0x20,0x2b,0x2d,0xb0,0x27,0x2c,0xb1,0x06,0x20,0x2b,0x2d,0xb0,0x28,0x2c,0xb1,0x07,0x20,0x2b,0x2d,0xb0,0x29,0x2c,0xb1,0x08,0x20,0x2b,0x2d,\r\n0xb0,0x2a,0x2c,0xb1,0x09,0x20,0x2b,0x2d,0xb0,0x2e,0x2c,0x20,0x3c,0xb0,0x01,0x60,0x2d,0xb0,0x2f,0x2c,0x20,0x60,0xb0,0x18,0x60,0x20,0x43,0x23,0xb0,0x01,0x60,0x43,0xb0,0x02,0x25,0x61,0xb0,0x01,0x60,0xb0,0x2e,0x2a,0x21,0x2d,0xb0,0x30,0x2c,0xb0,0x2f,0x2b,0xb0,0x2f,0x2a,0x2d,0xb0,0x31,0x2c,0x20,0x20,0x47,0x20,0x20,0xb0,0x0e,\r\n0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x23,0x20,0x8a,0x55,0x58,0x20,0x47,0x20,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x61,0x38,0x1b,0x21,0x59,0x2d,0xb0,0x32,0x2c,\r\n0x00,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,0x59,0x2d,0xb0,0x33,0x2c,0x00,0xb0,0x0f,0x2b,0xb1,0x00,0x02,0x45,0x54,0x58,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x16,0xb0,0x31,0x2a,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x1b,0x22,\r\n0x59,0x2d,0xb0,0x34,0x2c,0x20,0x35,0xb0,0x01,0x60,0x2d,0xb0,0x35,0x2c,0x00,0xb1,0x0e,0x06,0x45,0x42,0xb0,0x01,0x45,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x01,0x2b,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,\r\n0x63,0xb0,0x01,0x2b,0xb0,0x00,0x16,0xb4,0x00,0x00,0x00,0x00,0x00,0x44,0x3e,0x23,0x38,0xb1,0x34,0x01,0x15,0x2a,0x21,0x2d,0xb0,0x36,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0x38,0x2d,0xb0,0x37,0x2c,0x2e,\r\n0x17,0x3c,0x2d,0xb0,0x38,0x2c,0x20,0x3c,0x20,0x47,0x20,0xb0,0x0e,0x43,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0xb0,0x00,0x43,0x61,0xb0,0x01,0x43,0x63,0x38,0x2d,0xb0,0x39,0x2c,0xb1,0x02,0x00,0x16,0x25,0x20,0x2e,0x20,0x47,0xb0,0x00,0x23,0x42,0xb0,0x02,0x25,0x49,0x8a,\r\n0x8a,0x47,0x23,0x47,0x23,0x61,0x20,0x58,0x62,0x1b,0x21,0x59,0xb0,0x01,0x23,0x42,0xb2,0x38,0x01,0x01,0x15,0x14,0x2a,0x2d,0xb0,0x3a,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x65,0x8a,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,\r\n0x3b,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0xb0,0x0a,0x43,\r\n0x20,0x8a,0x23,0x47,0x23,0x47,0x23,0x61,0x23,0x46,0x60,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,0xb0,0x05,0x43,0x60,0x59,0xb0,\r\n0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0x23,0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x1b,0x23,0xb0,0x0a,0x43,0x46,0xb0,0x02,0x25,0xb0,0x0a,0x43,0x47,0x23,0x47,0x23,0x61,0x60,0x20,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,\r\n0xb0,0x01,0x63,0x60,0x23,0x20,0xb0,0x01,0x2b,0x23,0xb0,0x06,0x43,0x60,0xb0,0x01,0x2b,0xb0,0x05,0x25,0x61,0xb0,0x05,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0xb0,0x04,0x26,0x61,0x20,0xb0,0x04,0x25,0x60,0x64,0x23,0xb0,0x03,0x25,0x60,0x64,0x50,0x58,0x21,0x1b,0x23,0x21,0x59,0x23,\r\n0x20,0x20,0xb0,0x04,0x26,0x23,0x46,0x61,0x38,0x59,0x2d,0xb0,0x3c,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0x20,0x20,0xb0,0x05,0x26,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x23,0x3c,0x38,0x2d,0xb0,0x3d,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x23,0x42,0x20,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,\r\n0x38,0x2d,0xb0,0x3e,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0xb0,0x03,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x00,0x54,0x58,0x2e,0x20,0x3c,0x23,0x21,0x1b,0xb0,0x02,0x25,0xb0,0x02,0x25,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x05,0x25,0xb0,0x04,0x25,0x47,0x23,0x47,0x23,0x61,0xb0,0x06,0x25,0xb0,0x05,0x25,0x49,0xb0,\r\n0x02,0x25,0x61,0xb9,0x08,0x00,0x08,0x00,0x63,0x63,0x23,0x20,0x58,0x62,0x1b,0x21,0x59,0x63,0xb8,0x04,0x00,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x23,0x2e,0x23,0x20,0x20,0x3c,0x8a,0x38,0x23,0x21,0x59,0x2d,0xb0,0x3f,0x2c,0xb0,0x00,0x16,0xb0,0x17,0x23,0x42,0x20,0xb0,0x0a,0x43,0x20,0x2e,\r\n0x47,0x23,0x47,0x23,0x61,0x20,0x60,0xb0,0x20,0x60,0x66,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x23,0x20,0x20,0x3c,0x8a,0x38,0x2d,0xb0,0x40,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,\r\n0xb0,0x41,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x42,0x2c,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,\r\n0x58,0x52,0x1b,0x50,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x43,0x2c,0xb0,0x3a,0x2b,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x44,0x2c,0xb0,0x3b,0x2b,0x8a,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x8a,\r\n0x38,0x23,0x20,0x2e,0x46,0xb0,0x02,0x25,0x46,0xb0,0x17,0x43,0x58,0x50,0x1b,0x52,0x59,0x58,0x20,0x3c,0x59,0x2e,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x45,0x2c,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x26,0x20,0x20,0x20,0x46,0x23,0x47,0x61,0xb0,0x0c,0x23,0x42,0x2e,0x47,0x23,0x47,0x23,0x61,\r\n0xb0,0x0b,0x43,0x2b,0x23,0x20,0x3c,0x20,0x2e,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x46,0x2c,0xb1,0x0a,0x04,0x25,0x42,0xb0,0x00,0x16,0xb0,0x04,0x25,0xb0,0x04,0x25,0x20,0x2e,0x47,0x23,0x47,0x23,0x61,0x20,0xb0,0x06,0x23,0x42,0xb1,0x0c,0x00,0x42,0xb0,0x0b,0x43,0x2b,0x20,0xb0,0x60,0x50,0x58,0x20,0xb0,0x40,0x51,0x58,\r\n0xb3,0x04,0x20,0x05,0x20,0x1b,0xb3,0x04,0x26,0x05,0x1a,0x59,0x42,0x42,0x23,0x20,0x47,0xb0,0x06,0x43,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x60,0x20,0xb0,0x01,0x2b,0x20,0x8a,0x8a,0x61,0x20,0xb0,0x04,0x43,0x60,0x64,0x23,0xb0,0x05,0x43,0x61,0x64,0x50,0x58,0xb0,0x04,0x43,0x61,0x1b,\r\n0xb0,0x05,0x43,0x60,0x59,0xb0,0x03,0x25,0xb0,0x02,0x62,0x20,0xb0,0x00,0x50,0x58,0xb0,0x40,0x60,0x59,0x66,0xb0,0x01,0x63,0x61,0xb0,0x02,0x25,0x46,0x61,0x38,0x23,0x20,0x3c,0x23,0x38,0x1b,0x21,0x20,0x20,0x46,0x23,0x47,0xb0,0x01,0x2b,0x23,0x61,0x38,0x21,0x59,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x47,0x2c,0xb1,0x00,0x3a,0x2b,\r\n0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x48,0x2c,0xb1,0x00,0x3b,0x2b,0x21,0x23,0x20,0x20,0x3c,0xb0,0x06,0x23,0x42,0x23,0x38,0xb1,0x30,0x01,0x14,0x2b,0xb0,0x06,0x43,0x2e,0xb0,0x30,0x2b,0x2d,0xb0,0x49,0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4a,\r\n0x2c,0xb0,0x00,0x15,0x20,0x47,0xb0,0x00,0x23,0x42,0xb2,0x00,0x01,0x01,0x15,0x14,0x13,0x2e,0xb0,0x36,0x2a,0x2d,0xb0,0x4b,0x2c,0xb1,0x00,0x01,0x14,0x13,0xb0,0x37,0x2a,0x2d,0xb0,0x4c,0x2c,0xb0,0x39,0x2a,0x2d,0xb0,0x4d,0x2c,0xb0,0x00,0x16,0x45,0x23,0x20,0x2e,0x20,0x46,0x8a,0x23,0x61,0x38,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,\r\n0x4e,0x2c,0xb0,0x0a,0x23,0x42,0xb0,0x4d,0x2b,0x2d,0xb0,0x4f,0x2c,0xb2,0x00,0x00,0x46,0x2b,0x2d,0xb0,0x50,0x2c,0xb2,0x00,0x01,0x46,0x2b,0x2d,0xb0,0x51,0x2c,0xb2,0x01,0x00,0x46,0x2b,0x2d,0xb0,0x52,0x2c,0xb2,0x01,0x01,0x46,0x2b,0x2d,0xb0,0x53,0x2c,0xb2,0x00,0x00,0x47,0x2b,0x2d,0xb0,0x54,0x2c,0xb2,0x00,0x01,0x47,0x2b,0x2d,\r\n0xb0,0x55,0x2c,0xb2,0x01,0x00,0x47,0x2b,0x2d,0xb0,0x56,0x2c,0xb2,0x01,0x01,0x47,0x2b,0x2d,0xb0,0x57,0x2c,0xb3,0x00,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x58,0x2c,0xb3,0x00,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x59,0x2c,0xb3,0x01,0x00,0x00,0x43,0x2b,0x2d,0xb0,0x5a,0x2c,0xb3,0x01,0x01,0x00,0x43,0x2b,0x2d,0xb0,0x5b,0x2c,0xb3,0x00,0x00,\r\n0x01,0x43,0x2b,0x2d,0xb0,0x5c,0x2c,0xb3,0x00,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5d,0x2c,0xb3,0x01,0x00,0x01,0x43,0x2b,0x2d,0xb0,0x5e,0x2c,0xb3,0x01,0x01,0x01,0x43,0x2b,0x2d,0xb0,0x5f,0x2c,0xb2,0x00,0x00,0x45,0x2b,0x2d,0xb0,0x60,0x2c,0xb2,0x00,0x01,0x45,0x2b,0x2d,0xb0,0x61,0x2c,0xb2,0x01,0x00,0x45,0x2b,0x2d,0xb0,0x62,0x2c,\r\n0xb2,0x01,0x01,0x45,0x2b,0x2d,0xb0,0x63,0x2c,0xb2,0x00,0x00,0x48,0x2b,0x2d,0xb0,0x64,0x2c,0xb2,0x00,0x01,0x48,0x2b,0x2d,0xb0,0x65,0x2c,0xb2,0x01,0x00,0x48,0x2b,0x2d,0xb0,0x66,0x2c,0xb2,0x01,0x01,0x48,0x2b,0x2d,0xb0,0x67,0x2c,0xb3,0x00,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x68,0x2c,0xb3,0x00,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x69,\r\n0x2c,0xb3,0x01,0x00,0x00,0x44,0x2b,0x2d,0xb0,0x6a,0x2c,0xb3,0x01,0x01,0x00,0x44,0x2b,0x2d,0xb0,0x6b,0x2c,0xb3,0x00,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6c,0x2c,0xb3,0x00,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6d,0x2c,0xb3,0x01,0x00,0x01,0x44,0x2b,0x2d,0xb0,0x6e,0x2c,0xb3,0x01,0x01,0x01,0x44,0x2b,0x2d,0xb0,0x6f,0x2c,0xb1,0x00,0x3c,\r\n0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x70,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x71,0x2c,0xb1,0x00,0x3c,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x72,0x2c,0xb0,0x00,0x16,0xb1,0x00,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x73,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x74,0x2c,0xb1,0x01,0x3c,0x2b,0xb0,0x41,\r\n0x2b,0x2d,0xb0,0x75,0x2c,0xb0,0x00,0x16,0xb1,0x01,0x3c,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x76,0x2c,0xb1,0x00,0x3d,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x77,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x78,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x79,0x2c,0xb1,0x00,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,\r\n0x7a,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7b,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x7c,0x2c,0xb1,0x01,0x3d,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x7d,0x2c,0xb1,0x00,0x3e,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x7e,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x7f,0x2c,0xb1,0x00,0x3e,0x2b,\r\n0xb0,0x41,0x2b,0x2d,0xb0,0x80,0x2c,0xb1,0x00,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x81,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x82,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x83,0x2c,0xb1,0x01,0x3e,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x84,0x2c,0xb1,0x00,0x3f,0x2b,0x2e,0xb1,0x30,0x01,0x14,0x2b,0x2d,0xb0,0x85,\r\n0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x86,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x87,0x2c,0xb1,0x00,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,0xb0,0x88,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x40,0x2b,0x2d,0xb0,0x89,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x41,0x2b,0x2d,0xb0,0x8a,0x2c,0xb1,0x01,0x3f,0x2b,0xb0,0x42,0x2b,0x2d,\r\n0xb0,0x8b,0x2c,0xb2,0x0b,0x00,0x03,0x45,0x50,0x58,0xb0,0x06,0x1b,0xb2,0x04,0x02,0x03,0x45,0x58,0x23,0x21,0x1b,0x21,0x59,0x59,0x42,0x2b,0xb0,0x08,0x65,0xb0,0x03,0x24,0x50,0x78,0xb1,0x05,0x01,0x15,0x45,0x58,0x30,0x59,0x2d,0x00,0x4b,0xb8,0x00,0xc8,0x52,0x58,0xb1,0x01,0x01,0x8e,0x59,0xb0,0x01,0xb9,0x08,0x00,0x08,0x00,0x63,\r\n0x70,0xb1,0x00,0x07,0x42,0xb6,0x00,0x00,0x41,0x31,0x21,0x05,0x00,0x2a,0xb1,0x00,0x07,0x42,0x40,0x0c,0x4e,0x04,0x46,0x04,0x36,0x08,0x26,0x08,0x18,0x07,0x05,0x0a,0x2a,0xb1,0x00,0x07,0x42,0x40,0x0c,0x52,0x02,0x4a,0x02,0x3e,0x06,0x2e,0x06,0x1f,0x05,0x05,0x0a,0x2a,0xb1,0x00,0x0c,0x42,0xbe,0x13,0xc0,0x11,0xc0,0x0d,0xc0,0x09,\r\n0xc0,0x06,0x40,0x00,0x05,0x00,0x0b,0x2a,0xb1,0x00,0x11,0x42,0xbe,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x05,0x00,0x0b,0x2a,0xb9,0x00,0x03,0x00,0x00,0x44,0xb1,0x24,0x01,0x88,0x51,0x58,0xb0,0x40,0x88,0x58,0xb9,0x00,0x03,0x00,0x64,0x44,0xb1,0x28,0x01,0x88,0x51,0x58,0xb8,0x08,0x00,0x88,0x58,0xb9,0x00,0x03,\r\n0x00,0x00,0x44,0x59,0x1b,0xb1,0x27,0x01,0x88,0x51,0x58,0xba,0x08,0x80,0x00,0x01,0x04,0x40,0x88,0x63,0x54,0x58,0xb9,0x00,0x03,0x00,0x00,0x44,0x59,0x59,0x59,0x59,0x59,0x40,0x0c,0x50,0x02,0x48,0x02,0x38,0x06,0x28,0x06,0x1a,0x05,0x05,0x0e,0x2a,0xb8,0x01,0xff,0x85,0xb0,0x04,0x8d,0xb1,0x02,0x00,0x44,0xb3,0x05,0x64,0x06,0x00,\r\n0x44,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0x26,0x00,0x00,\r\n0xff,0x4c,0x02,0xe4,0xff,0xf6,0x02,0x30,0xff,0xf8,0xff,0x4c,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0xda,0x02,0x26,0x00,0x00,0xff,0x4c,0x02,0xe4,0xff,0xf6,0x02,0xe4,0x02,0x2e,0xff,0xf8,0xff,0x4c,0x00,0x5a,0x00,0x5a,0x00,0x50,0x00,0x50,0x02,0xda,0x00,0x00,0x02,0xda,0x02,0x26,0x00,0x00,0xff,0x4c,\r\n0x02,0xe4,0xff,0xf6,0x03,0x09,0x02,0x30,0xff,0xf8,0xff,0x4c,0x00,0x47,0x00,0x47,0x00,0x40,0x00,0x40,0x01,0x3b,0xff,0x7b,0x01,0x40,0xff,0x76,0x00,0x47,0x00,0x47,0x00,0x40,0x00,0x40,0x03,0x3e,0x01,0x7e,0x03,0x43,0x01,0x79,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x00,0x00,0x00,0xd4,0x00,0x00,0x00,0xec,0x00,0x00,0x01,0x04,\r\n0x00,0x00,0x01,0x1c,0x00,0x00,0x01,0x3c,0x00,0x00,0x01,0x54,0x00,0x00,0x01,0x6c,0x00,0x00,0x01,0x84,0x00,0x00,0x01,0x9c,0x00,0x00,0x01,0xb4,0x00,0x00,0x01,0xcc,0x00,0x00,0x01,0xec,0x00,0x00,0x02,0x04,0x00,0x00,0x02,0x1c,0x00,0x00,0x02,0x34,0x00,0x00,0x02,0x4c,0x00,0x00,0x02,0x64,0x00,0x00,0x02,0x7c,0x00,0x00,0x02,0x94,\r\n0x00,0x00,0x02,0xac,0x00,0x00,0x03,0x78,0x00,0x00,0x03,0x90,0x00,0x00,0x03,0xa8,0x00,0x00,0x04,0x28,0x00,0x00,0x04,0x40,0x00,0x00,0x04,0xe0,0x00,0x00,0x05,0x70,0x00,0x00,0x05,0x88,0x00,0x00,0x05,0xa0,0x00,0x00,0x06,0xb8,0x00,0x00,0x06,0xd0,0x00,0x00,0x06,0xe8,0x00,0x00,0x07,0x58,0x00,0x00,0x07,0xe8,0x00,0x00,0x08,0x00,\r\n0x00,0x00,0x08,0x90,0x00,0x00,0x08,0xec,0x00,0x00,0x09,0x04,0x00,0x00,0x09,0x1c,0x00,0x00,0x09,0x34,0x00,0x00,0x09,0x4c,0x00,0x00,0x09,0x64,0x00,0x00,0x09,0x84,0x00,0x00,0x09,0x9c,0x00,0x00,0x09,0xb4,0x00,0x00,0x09,0xcc,0x00,0x00,0x09,0xe4,0x00,0x00,0x09,0xfc,0x00,0x00,0x0a,0x14,0x00,0x00,0x0a,0x2c,0x00,0x00,0x0a,0x44,\r\n0x00,0x00,0x0a,0x5c,0x00,0x00,0x0b,0x20,0x00,0x00,0x0b,0xf0,0x00,0x00,0x0c,0x08,0x00,0x00,0x0c,0x5c,0x00,0x00,0x0c,0xf4,0x00,0x00,0x0d,0x0c,0x00,0x00,0x0d,0x24,0x00,0x00,0x0d,0x3c,0x00,0x00,0x0d,0x54,0x00,0x00,0x0d,0x6c,0x00,0x00,0x0d,0x84,0x00,0x00,0x0d,0xd8,0x00,0x00,0x0e,0x58,0x00,0x00,0x0e,0x70,0x00,0x00,0x0e,0xc4,\r\n0x00,0x00,0x0e,0xdc,0x00,0x00,0x0e,0xf4,0x00,0x00,0x0f,0x0c,0x00,0x00,0x0f,0x24,0x00,0x00,0x0f,0x3c,0x00,0x00,0x0f,0x54,0x00,0x00,0x0f,0x6c,0x00,0x00,0x0f,0x84,0x00,0x00,0x0f,0x9c,0x00,0x00,0x10,0x50,0x00,0x00,0x10,0x68,0x00,0x00,0x10,0xcc,0x00,0x00,0x10,0xe4,0x00,0x00,0x11,0x44,0x00,0x00,0x11,0x5c,0x00,0x00,0x11,0x98,\r\n0x00,0x00,0x11,0xb0,0x00,0x00,0x11,0xc8,0x00,0x00,0x11,0xe0,0x00,0x00,0x12,0x04,0x00,0x00,0x12,0x64,0x00,0x00,0x12,0xdc,0x00,0x00,0x13,0x40,0x00,0x00,0x13,0x58,0x00,0x00,0x13,0x70,0x00,0x00,0x13,0x88,0x00,0x00,0x14,0x08,0x00,0x00,0x14,0x20,0x00,0x00,0x14,0xa4,0x00,0x00,0x14,0xbc,0x00,0x00,0x14,0xd4,0x00,0x00,0x14,0xec,\r\n0x00,0x00,0x15,0x04,0x00,0x00,0x15,0x24,0x00,0x00,0x15,0x3c,0x00,0x00,0x15,0x54,0x00,0x00,0x15,0x6c,0x00,0x00,0x15,0x84,0x00,0x00,0x15,0x9c,0x00,0x00,0x15,0xb4,0x00,0x00,0x15,0xcc,0x00,0x00,0x16,0x74,0x00,0x00,0x16,0x8c,0x00,0x00,0x16,0xa4,0x00,0x00,0x16,0xbc,0x00,0x00,0x16,0xd4,0x00,0x00,0x16,0xec,0x00,0x00,0x17,0x04,\r\n0x00,0x00,0x17,0x1c,0x00,0x00,0x18,0x00,0x00,0x00,0x18,0xec,0x00,0x00,0x19,0x04,0x00,0x00,0x19,0x1c,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1a,0xe8,0x00,0x00,0x1b,0x5c,0x00,0x00,0x1b,0xfc,0x00,0x00,0x1c,0x7c,0x00,0x00,0x1c,0x94,0x00,0x00,0x1c,0xac,0x00,0x00,0x1c,0xc4,0x00,0x00,0x1d,0x78,0x00,0x00,0x1d,0x90,0x00,0x00,0x1d,0xa8,\r\n0x00,0x00,0x1e,0xe4,0x00,0x00,0x1e,0xfc,0x00,0x00,0x1f,0x14,0x00,0x00,0x1f,0xac,0x00,0x00,0x20,0x4c,0x00,0x00,0x20,0x90,0x00,0x00,0x20,0xf4,0x00,0x00,0x21,0x0c,0x00,0x00,0x21,0xc8,0x00,0x00,0x21,0xe0,0x00,0x00,0x22,0x40,0x00,0x00,0x22,0x58,0x00,0x00,0x22,0x70,0x00,0x00,0x22,0x88,0x00,0x00,0x22,0xa0,0x00,0x00,0x22,0xb8,\r\n0x00,0x00,0x22,0xd0,0x00,0x00,0x22,0xe8,0x00,0x00,0x23,0x6c,0x00,0x00,0x23,0x84,0x00,0x00,0x23,0x9c,0x00,0x00,0x23,0xb4,0x00,0x00,0x23,0xcc,0x00,0x00,0x23,0xe4,0x00,0x00,0x23,0xfc,0x00,0x00,0x24,0x14,0x00,0x00,0x24,0xcc,0x00,0x00,0x24,0xe4,0x00,0x00,0x24,0xfc,0x00,0x00,0x25,0x54,0x00,0x00,0x25,0xe8,0x00,0x00,0x26,0x00,\r\n0x00,0x00,0x26,0x18,0x00,0x00,0x26,0x30,0x00,0x00,0x26,0x48,0x00,0x00,0x26,0xc4,0x00,0x00,0x27,0x24,0x00,0x00,0x27,0x3c,0x00,0x00,0x27,0x54,0x00,0x00,0x27,0x6c,0x00,0x00,0x27,0x84,0x00,0x00,0x27,0x9c,0x00,0x00,0x27,0xb4,0x00,0x00,0x27,0xcc,0x00,0x00,0x27,0xe4,0x00,0x00,0x28,0x3c,0x00,0x00,0x28,0x54,0x00,0x00,0x28,0x6c,\r\n0x00,0x00,0x28,0x84,0x00,0x00,0x29,0x10,0x00,0x00,0x29,0x28,0x00,0x00,0x29,0x40,0x00,0x00,0x29,0x58,0x00,0x00,0x29,0x70,0x00,0x00,0x29,0xcc,0x00,0x00,0x29,0xe4,0x00,0x00,0x2a,0x94,0x00,0x00,0x2b,0x88,0x00,0x00,0x2b,0xa0,0x00,0x00,0x2b,0xb8,0x00,0x00,0x2b,0xd0,0x00,0x00,0x2b,0xf0,0x00,0x00,0x2c,0x08,0x00,0x00,0x2c,0x20,\r\n0x00,0x00,0x2c,0x38,0x00,0x00,0x2c,0x50,0x00,0x00,0x2c,0x68,0x00,0x00,0x2c,0x80,0x00,0x00,0x2c,0xa0,0x00,0x00,0x2c,0xb8,0x00,0x00,0x2c,0xd0,0x00,0x00,0x2c,0xe8,0x00,0x00,0x2d,0x00,0x00,0x00,0x2d,0x18,0x00,0x00,0x2d,0x30,0x00,0x00,0x2d,0x48,0x00,0x00,0x2d,0x60,0x00,0x00,0x2e,0xe0,0x00,0x00,0x2e,0xf8,0x00,0x00,0x2f,0x10,\r\n0x00,0x00,0x30,0x6c,0x00,0x00,0x30,0x84,0x00,0x00,0x31,0x54,0x00,0x00,0x31,0xe4,0x00,0x00,0x31,0xfc,0x00,0x00,0x32,0x14,0x00,0x00,0x33,0x2c,0x00,0x00,0x33,0x44,0x00,0x00,0x33,0x5c,0x00,0x00,0x34,0x2c,0x00,0x00,0x35,0x00,0x00,0x00,0x35,0xf8,0x00,0x00,0x36,0xf0,0x00,0x00,0x37,0x94,0x00,0x00,0x37,0xac,0x00,0x00,0x37,0xc4,\r\n0x00,0x00,0x37,0xdc,0x00,0x00,0x37,0xf4,0x00,0x00,0x38,0x0c,0x00,0x00,0x38,0x2c,0x00,0x00,0x38,0x44,0x00,0x00,0x38,0x5c,0x00,0x00,0x38,0x74,0x00,0x00,0x38,0x8c,0x00,0x00,0x38,0xa4,0x00,0x00,0x38,0xbc,0x00,0x00,0x38,0xd4,0x00,0x00,0x38,0xec,0x00,0x00,0x39,0x04,0x00,0x00,0x3a,0x0c,0x00,0x00,0x3a,0x24,0x00,0x00,0x3a,0xc4,\r\n0x00,0x00,0x3b,0x28,0x00,0x00,0x3c,0x10,0x00,0x00,0x3c,0x28,0x00,0x00,0x3c,0x40,0x00,0x00,0x3c,0x58,0x00,0x00,0x3c,0x70,0x00,0x00,0x3c,0x88,0x00,0x00,0x3c,0xa0,0x00,0x00,0x3d,0x10,0x00,0x00,0x3d,0x20,0x00,0x00,0x3d,0x44,0x00,0x00,0x3d,0x5c,0x00,0x00,0x3d,0xa8,0x00,0x00,0x3d,0xc0,0x00,0x00,0x3d,0xd8,0x00,0x00,0x3d,0xf0,\r\n0x00,0x00,0x3e,0x08,0x00,0x00,0x3e,0x20,0x00,0x00,0x3e,0x38,0x00,0x00,0x3e,0x58,0x00,0x00,0x3e,0x70,0x00,0x00,0x3e,0x88,0x00,0x00,0x3e,0xa0,0x00,0x00,0x3f,0xc8,0x00,0x00,0x3f,0xe0,0x00,0x00,0x3f,0xf8,0x00,0x00,0x40,0x50,0x00,0x00,0x40,0x68,0x00,0x00,0x40,0xcc,0x00,0x00,0x40,0xe4,0x00,0x00,0x40,0xf4,0x00,0x00,0x41,0x4c,\r\n0x00,0x00,0x41,0x64,0x00,0x00,0x41,0xe0,0x00,0x00,0x41,0xf8,0x00,0x00,0x42,0x10,0x00,0x00,0x42,0x34,0x00,0x00,0x42,0xa4,0x00,0x00,0x43,0x64,0x00,0x00,0x43,0xf4,0x00,0x00,0x44,0x0c,0x00,0x00,0x44,0x30,0x00,0x00,0x44,0x48,0x00,0x00,0x44,0x60,0x00,0x00,0x45,0x14,0x00,0x00,0x45,0x2c,0x00,0x00,0x45,0xac,0x00,0x00,0x45,0xc4,\r\n0x00,0x00,0x45,0xdc,0x00,0x00,0x45,0xf4,0x00,0x00,0x46,0x0c,0x00,0x00,0x46,0x24,0x00,0x00,0x46,0x44,0x00,0x00,0x46,0x5c,0x00,0x00,0x46,0x74,0x00,0x00,0x46,0x8c,0x00,0x00,0x46,0xa4,0x00,0x00,0x46,0xbc,0x00,0x00,0x46,0xd4,0x00,0x00,0x46,0xec,0x00,0x00,0x47,0xc8,0x00,0x00,0x47,0xe0,0x00,0x00,0x47,0xf8,0x00,0x00,0x48,0x10,\r\n0x00,0x00,0x48,0x28,0x00,0x00,0x48,0x40,0x00,0x00,0x48,0x58,0x00,0x00,0x48,0x70,0x00,0x00,0x49,0x54,0x00,0x00,0x4a,0x18,0x00,0x00,0x4a,0x30,0x00,0x00,0x4a,0x48,0x00,0x00,0x4b,0x50,0x00,0x00,0x4c,0x1c,0x00,0x00,0x4c,0xf0,0x00,0x00,0x4d,0xc0,0x00,0x00,0x4e,0x58,0x00,0x00,0x4e,0x70,0x00,0x00,0x4e,0x88,0x00,0x00,0x4e,0xa0,\r\n0x00,0x00,0x4f,0x50,0x00,0x00,0x4f,0x68,0x00,0x00,0x4f,0x80,0x00,0x00,0x50,0xb4,0x00,0x00,0x50,0xcc,0x00,0x00,0x50,0xe4,0x00,0x00,0x51,0x90,0x00,0x00,0x51,0xdc,0x00,0x00,0x52,0x4c,0x00,0x00,0x52,0xd4,0x00,0x00,0x52,0xf8,0x00,0x00,0x53,0xe8,0x00,0x00,0x54,0x00,0x00,0x00,0x54,0x60,0x00,0x00,0x54,0x78,0x00,0x00,0x54,0x90,\r\n0x00,0x00,0x54,0xa8,0x00,0x00,0x54,0xc0,0x00,0x00,0x54,0xd8,0x00,0x00,0x55,0x04,0x00,0x00,0x55,0x30,0x00,0x00,0x55,0x5c,0x00,0x00,0x55,0x88,0x00,0x00,0x55,0xa0,0x00,0x00,0x55,0xb8,0x00,0x00,0x55,0xd0,0x00,0x00,0x56,0x6c,0x00,0x00,0x56,0x84,0x00,0x00,0x56,0x9c,0x00,0x00,0x56,0xb4,0x00,0x00,0x56,0xcc,0x00,0x00,0x56,0xe4,\r\n0x00,0x00,0x56,0xfc,0x00,0x00,0x57,0x14,0x00,0x00,0x57,0xc8,0x00,0x00,0x57,0xe0,0x00,0x00,0x57,0xf8,0x00,0x00,0x58,0x50,0x00,0x00,0x58,0xe8,0x00,0x00,0x59,0x00,0x00,0x00,0x59,0x18,0x00,0x00,0x59,0x30,0x00,0x00,0x59,0x48,0x00,0x00,0x59,0xc4,0x00,0x00,0x5a,0x24,0x00,0x00,0x5a,0x3c,0x00,0x00,0x5a,0x54,0x00,0x00,0x5a,0x6c,\r\n0x00,0x00,0x5a,0x84,0x00,0x00,0x5a,0x9c,0x00,0x00,0x5a,0xb4,0x00,0x00,0x5a,0xcc,0x00,0x00,0x5a,0xe4,0x00,0x00,0x5b,0x3c,0x00,0x00,0x5b,0x54,0x00,0x00,0x5b,0x6c,0x00,0x00,0x5b,0x84,0x00,0x00,0x5b,0x94,0x00,0x00,0x5b,0xe0,0x00,0x00,0x5b,0xf8,0x00,0x00,0x5c,0x10,0x00,0x00,0x5c,0x28,0x00,0x00,0x5c,0x4c,0x00,0x00,0x5c,0xbc,\r\n0x00,0x00,0x5d,0x48,0x00,0x00,0x5d,0xe8,0x00,0x00,0x5e,0x0c,0x00,0x00,0x5f,0x20,0x00,0x00,0x5f,0x38,0x00,0x00,0x60,0xbc,0x00,0x00,0x60,0xd4,0x00,0x00,0x60,0xec,0x00,0x00,0x61,0x04,0x00,0x00,0x61,0x1c,0x00,0x00,0x61,0x34,0x00,0x00,0x61,0x4c,0x00,0x00,0x61,0x64,0x00,0x00,0x62,0x04,0x00,0x00,0x62,0x1c,0x00,0x00,0x62,0x90,\r\n0x00,0x00,0x62,0xa8,0x00,0x00,0x62,0xc0,0x00,0x00,0x62,0xd8,0x00,0x00,0x63,0x7c,0x00,0x00,0x64,0x04,0x00,0x00,0x64,0xd0,0x00,0x00,0x65,0x5c,0x00,0x00,0x65,0x74,0x00,0x00,0x65,0x8c,0x00,0x00,0x65,0xa4,0x00,0x00,0x65,0xbc,0x00,0x00,0x66,0x1c,0x00,0x00,0x66,0x34,0x00,0x00,0x66,0x44,0x00,0x00,0x66,0xb8,0x00,0x00,0x67,0x64,\r\n0x00,0x00,0x67,0x7c,0x00,0x00,0x67,0x94,0x00,0x00,0x67,0xac,0x00,0x00,0x68,0x1c,0x00,0x00,0x68,0x34,0x00,0x00,0x68,0x4c,0x00,0x00,0x68,0x64,0x00,0x00,0x68,0x7c,0x00,0x00,0x68,0x94,0x00,0x00,0x68,0xac,0x00,0x00,0x68,0xc4,0x00,0x00,0x68,0xdc,0x00,0x00,0x69,0x6c,0x00,0x00,0x6a,0x28,0x00,0x00,0x6b,0x0c,0x00,0x00,0x6b,0xdc,\r\n0x00,0x00,0x6d,0x00,0x00,0x00,0x6d,0xcc,0x00,0x00,0x6e,0x8c,0x00,0x00,0x6f,0x9c,0x00,0x00,0x70,0x80,0x00,0x00,0x70,0x98,0x00,0x00,0x70,0xb0,0x00,0x00,0x70,0xc8,0x00,0x00,0x70,0xe0,0x00,0x00,0x70,0xf8,0x00,0x00,0x71,0xd0,0x00,0x00,0x72,0xb8,0x00,0x00,0x73,0xc0,0x00,0x00,0x74,0xc8,0x00,0x00,0x76,0x48,0x00,0x00,0x76,0xcc,\r\n0x00,0x00,0x77,0x44,0x00,0x00,0x77,0xac,0x00,0x00,0x78,0xa8,0x00,0x00,0x79,0x30,0x00,0x00,0x79,0x40,0x00,0x00,0x79,0xb8,0x00,0x00,0x79,0xc8,0x00,0x00,0x7a,0x08,0x00,0x00,0x7a,0x20,0x00,0x00,0x7a,0x8c,0x00,0x00,0x7b,0x0c,0x00,0x00,0x7b,0x1c,0x00,0x00,0x7b,0x34,0x00,0x00,0x7b,0xb8,0x00,0x00,0x7c,0x88,0x00,0x00,0x7c,0xec,\r\n0x00,0x00,0x7d,0x04,0x00,0x00,0x7d,0x14,0x00,0x00,0x7d,0x2c,0x00,0x00,0x7d,0xb4,0x00,0x00,0x7d,0xc4,0x00,0x00,0x7d,0xd4,0x00,0x00,0x7d,0xe4,0x00,0x00,0x7e,0x28,0x00,0x00,0x7e,0x38,0x00,0x00,0x7e,0x48,0x00,0x00,0x7e,0x58,0x00,0x00,0x7e,0xb4,0x00,0x00,0x7e,0xcc,0x00,0x00,0x7f,0xf0,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x5c,\r\n0x00,0x00,0x80,0xb4,0x00,0x00,0x81,0x08,0x00,0x00,0x81,0x6c,0x00,0x00,0x81,0xe4,0x00,0x00,0x82,0x54,0x00,0x00,0x82,0xd0,0x00,0x00,0x83,0x58,0x00,0x00,0x84,0x28,0x00,0x00,0x84,0xb4,0x00,0x00,0x84,0xc4,0x00,0x00,0x85,0x68,0x00,0x00,0x85,0xfc,0x00,0x00,0x86,0x0c,0x00,0x00,0x86,0x24,0x00,0x00,0x86,0x34,0x00,0x00,0x86,0xb0,\r\n0x00,0x00,0x87,0x8c,0x00,0x00,0x88,0x14,0x00,0x00,0x88,0xac,0x00,0x00,0x89,0x08,0x00,0x00,0x89,0x7c,0x00,0x00,0x89,0xe0,0x00,0x00,0x89,0xf0,0x00,0x00,0x8a,0x68,0x00,0x00,0x8a,0xd4,0x00,0x00,0x8b,0x30,0x00,0x00,0x8b,0xd0,0x00,0x00,0x8b,0xe8,0x00,0x00,0x8c,0x00,0x00,0x00,0x8c,0x18,0x00,0x00,0x8c,0x30,0x00,0x00,0x8c,0xcc,\r\n0x00,0x00,0x8c,0xe4,0x00,0x00,0x8d,0x64,0x00,0x00,0x8d,0x74,0x00,0x00,0x8d,0x8c,0x00,0x00,0x8d,0xfc,0x00,0x00,0x8e,0x70,0x00,0x00,0x8e,0x88,0x00,0x00,0x8f,0x60,0x00,0x00,0x8f,0x70,0x00,0x00,0x90,0x14,0x00,0x00,0x90,0xb4,0x00,0x00,0x90,0xf4,0x00,0x00,0x91,0x0c,0x00,0x00,0x91,0x78,0x00,0x00,0x91,0xf8,0x00,0x00,0x92,0x08,\r\n0x00,0x00,0x92,0x20,0x00,0x00,0x92,0x9c,0x00,0x00,0x93,0x68,0x00,0x00,0x93,0xc8,0x00,0x00,0x93,0xe0,0x00,0x00,0x94,0x3c,0x00,0x00,0x94,0x54,0x00,0x00,0x94,0xdc,0x00,0x00,0x95,0x4c,0x00,0x00,0x95,0x9c,0x00,0x00,0x95,0xac,0x00,0x00,0x95,0xf0,0x00,0x00,0x96,0x00,0x00,0x00,0x96,0x10,0x00,0x00,0x96,0x54,0x00,0x00,0x96,0x64,\r\n0x00,0x00,0x96,0x7c,0x00,0x00,0x97,0x34,0x00,0x00,0x97,0x44,0x00,0x00,0x97,0x9c,0x00,0x00,0x97,0xf4,0x00,0x00,0x98,0x48,0x00,0x00,0x98,0xac,0x00,0x00,0x99,0x24,0x00,0x00,0x99,0x90,0x00,0x00,0x9a,0x04,0x00,0x00,0x9a,0x88,0x00,0x00,0x9b,0x8c,0x00,0x00,0x9c,0x14,0x00,0x00,0x9c,0x24,0x00,0x00,0x9c,0xc8,0x00,0x00,0x9d,0x6c,\r\n0x00,0x00,0x9d,0x84,0x00,0x00,0x9d,0x9c,0x00,0x00,0x9d,0xb4,0x00,0x00,0x9e,0x40,0x00,0x00,0x9f,0x18,0x00,0x00,0x9f,0x98,0x00,0x00,0xa0,0x40,0x00,0x00,0xa0,0x9c,0x00,0x00,0xa1,0x08,0x00,0x00,0xa1,0x68,0x00,0x00,0xa1,0x78,0x00,0x00,0xa1,0xf0,0x00,0x00,0xa2,0x5c,0x00,0x00,0xa2,0xb8,0x00,0x00,0xa3,0x5c,0x00,0x00,0xa3,0x74,\r\n0x00,0x00,0xa3,0x8c,0x00,0x00,0xa3,0xa4,0x00,0x00,0xa3,0xbc,0x00,0x00,0xa4,0x58,0x00,0x00,0xa4,0x70,0x00,0x00,0xa4,0x88,0x00,0x00,0xa5,0x08,0x00,0x00,0xa5,0x64,0x00,0x00,0xa5,0x7c,0x00,0x00,0xa5,0xe8,0x00,0x00,0xa5,0xf8,0x00,0x00,0xa6,0x10,0x00,0x00,0xa6,0xbc,0x00,0x00,0xa6,0xcc,0x00,0x00,0xa6,0xdc,0x00,0x00,0xa6,0xec,\r\n0x00,0x00,0xa7,0x50,0x00,0x00,0xa7,0x60,0x00,0x00,0xa7,0x70,0x00,0x00,0xa7,0x80,0x00,0x00,0xa8,0x20,0x00,0x00,0xa8,0x30,0x00,0x00,0xa8,0x40,0x00,0x00,0xa8,0x90,0x00,0x00,0xa8,0xa0,0x00,0x00,0xa8,0xb0,0x00,0x00,0xa9,0x24,0x00,0x00,0xa9,0x34,0x00,0x00,0xa9,0x44,0x00,0x00,0xa9,0x54,0x00,0x00,0xa9,0xbc,0x00,0x00,0xa9,0xcc,\r\n0x00,0x00,0xa9,0xdc,0x00,0x00,0xa9,0xec,0x00,0x00,0xa9,0xfc,0x00,0x00,0xaa,0x78,0x00,0x00,0xab,0x44,0x00,0x00,0xab,0x5c,0x00,0x00,0xab,0x74,0x00,0x00,0xab,0x8c,0x00,0x00,0xab,0xa4,0x00,0x00,0xab,0xbc,0x00,0x00,0xab,0xd4,0x00,0x00,0xab,0xec,0x00,0x00,0xac,0x04,0x00,0x00,0xac,0x1c,0x00,0x00,0xac,0xac,0x00,0x00,0xac,0xbc,\r\n0x00,0x00,0xad,0x48,0x00,0x00,0xae,0x14,0x00,0x00,0xae,0xe8,0x00,0x00,0xaf,0x48,0x00,0x00,0xaf,0xf4,0x00,0x00,0xb0,0xc4,0x00,0x00,0xb1,0x40,0x00,0x00,0xb1,0x50,0x00,0x00,0xb1,0xec,0x00,0x00,0xb2,0x44,0x00,0x00,0xb2,0x54,0x00,0x00,0xb2,0xb0,0x00,0x00,0xb3,0x54,0x00,0x00,0xb3,0x64,0x00,0x00,0xb4,0x2c,0x00,0x00,0xb4,0x3c,\r\n0x00,0x00,0xb4,0xd4,0x00,0x00,0xb5,0x6c,0x00,0x00,0xb5,0xf0,0x00,0x00,0xb6,0x88,0x00,0x00,0xb6,0xe8,0x00,0x00,0xb6,0xf8,0x00,0x00,0xb7,0xa8,0x00,0x00,0xb7,0xb8,0x00,0x00,0xb8,0x30,0x00,0x00,0xb8,0xe4,0x00,0x00,0xb8,0xfc,0x00,0x00,0xb9,0x14,0x00,0x00,0xb9,0x2c,0x00,0x00,0xb9,0x44,0x00,0x00,0xb9,0x5c,0x00,0x00,0xb9,0x74,\r\n0x00,0x00,0xb9,0x8c,0x00,0x00,0xb9,0xa4,0x00,0x00,0xba,0x9c,0x00,0x00,0xbc,0x6c,0x00,0x00,0xbc,0x84,0x00,0x00,0xbd,0x10,0x00,0x00,0xbd,0x20,0x00,0x00,0xbd,0xe4,0x00,0x00,0xbd,0xf4,0x00,0x00,0xbe,0x6c,0x00,0x00,0xbf,0x20,0x00,0x00,0xbf,0x20,0x00,0x00,0xbf,0xac,0x00,0x00,0xc0,0x98,0x00,0x00,0xc1,0x48,0x00,0x00,0xc1,0xe8,\r\n0x00,0x00,0xc2,0x58,0x00,0x00,0xc2,0xc0,0x00,0x00,0xc3,0x90,0x00,0x00,0xc4,0x18,0x00,0x00,0xc4,0x7c,0x00,0x00,0xc5,0x0c,0x00,0x00,0xc5,0xa0,0x00,0x00,0xc5,0xf4,0x00,0x00,0xc6,0x9c,0x00,0x00,0xc7,0x1c,0x00,0x00,0xc7,0xd8,0x00,0x00,0xc8,0x78,0x00,0x00,0xc9,0x50,0x00,0x00,0xca,0x20,0x00,0x00,0xcb,0x18,0x00,0x00,0xcb,0x70,\r\n0x00,0x00,0xcb,0xf0,0x00,0x00,0xcc,0x64,0x00,0x00,0xcd,0x3c,0x00,0x00,0xcd,0xb8,0x00,0x00,0xce,0x3c,0x00,0x00,0xce,0xb8,0x00,0x00,0xd0,0x00,0x00,0x00,0xd1,0x24,0x00,0x00,0xd1,0xd0,0x00,0x00,0xd2,0xf0,0x00,0x00,0xd3,0xc4,0x00,0x00,0xd4,0x54,0x00,0x00,0xd5,0x88,0x00,0x00,0xd6,0x24,0x00,0x00,0xd7,0x24,0x00,0x00,0xd8,0x30,\r\n0x00,0x00,0xd8,0xc4,0x00,0x00,0xd9,0x30,0x00,0x00,0xda,0x80,0x00,0x00,0xdb,0x54,0x00,0x00,0xdc,0x0c,0x00,0x00,0xdd,0x28,0x00,0x00,0xde,0x48,0x00,0x00,0xdf,0x14,0x00,0x00,0xe0,0x10,0x00,0x00,0xe0,0xac,0x00,0x00,0xe1,0x2c,0x00,0x00,0xe1,0xa0,0x00,0x00,0xe2,0x80,0x00,0x00,0xe2,0xf4,0x00,0x00,0xe3,0x84,0x00,0x00,0xe3,0xf0,\r\n0x00,0x00,0xe4,0xa8,0x00,0x00,0xe4,0xfc,0x00,0x00,0xe5,0x80,0x00,0x00,0xe6,0x18,0x00,0x00,0xe6,0x78,0x00,0x00,0xe7,0x08,0x00,0x00,0xe7,0xac,0x00,0x00,0xe8,0x28,0x00,0x00,0xe9,0x0c,0x00,0x00,0xe9,0xac,0x00,0x00,0xea,0x50,0x00,0x00,0xea,0xe4,0x00,0x00,0xeb,0xa4,0x00,0x00,0xec,0x68,0x00,0x00,0xed,0x48,0x00,0x00,0xed,0xf8,\r\n0x00,0x00,0xee,0x18,0x00,0x00,0xee,0x38,0x00,0x00,0xee,0x58,0x00,0x00,0xee,0x78,0x00,0x00,0xee,0x98,0x00,0x00,0xee,0xb8,0x00,0x00,0xee,0xd8,0x00,0x00,0xee,0xf8,0x00,0x00,0xef,0x18,0x00,0x00,0xef,0x38,0x00,0x00,0xef,0x58,0x00,0x00,0xef,0x78,0x00,0x00,0xef,0x98,0x00,0x00,0xef,0xb8,0x00,0x00,0xef,0xd8,0x00,0x00,0xef,0xf8,\r\n0x00,0x00,0xf0,0x18,0x00,0x00,0xf0,0x38,0x00,0x00,0xf0,0x58,0x00,0x00,0xf0,0x78,0x00,0x00,0xf0,0x94,0x00,0x00,0xf0,0xb0,0x00,0x00,0xf0,0xcc,0x00,0x00,0xf0,0xe8,0x00,0x00,0xf1,0x04,0x00,0x00,0xf1,0x20,0x00,0x00,0xf1,0x3c,0x00,0x00,0xf1,0x58,0x00,0x00,0xf1,0x74,0x00,0x00,0xf1,0x90,0x00,0x00,0xf2,0x14,0x00,0x00,0xf2,0x68,\r\n0x00,0x00,0xf2,0xf0,0x00,0x00,0xf3,0x84,0x00,0x00,0xf3,0xe4,0x00,0x00,0xf4,0x70,0x00,0x00,0xf5,0x04,0x00,0x00,0xf5,0x80,0x00,0x00,0xf6,0x58,0x00,0x00,0xf6,0xec,0x00,0x00,0xf7,0x0c,0x00,0x00,0xf7,0x2c,0x00,0x00,0xf7,0x4c,0x00,0x00,0xf7,0x6c,0x00,0x00,0xf7,0x8c,0x00,0x00,0xf7,0xac,0x00,0x00,0xf7,0xc8,0x00,0x00,0xf7,0xe4,\r\n0x00,0x00,0xf8,0x00,0x00,0x00,0xf8,0x88,0x00,0x00,0xf9,0x48,0x00,0x00,0xfa,0x04,0x00,0x00,0xfa,0x24,0x00,0x00,0xfa,0x44,0x00,0x00,0xfa,0x60,0x00,0x00,0xfb,0x44,0x00,0x00,0xfb,0x64,0x00,0x00,0xfb,0x80,0x00,0x00,0xfb,0x9c,0x00,0x00,0xfc,0x4c,0x00,0x00,0xfc,0x84,0x00,0x00,0xfd,0x78,0x00,0x00,0xfe,0x44,0x00,0x00,0xff,0x98,\r\n0x00,0x00,0xff,0xb8,0x00,0x00,0xff,0xc8,0x00,0x00,0xff,0xe8,0x00,0x01,0x00,0x70,0x00,0x01,0x01,0x10,0x00,0x01,0x01,0x58,0x00,0x01,0x01,0xa8,0x00,0x01,0x02,0x24,0x00,0x01,0x02,0xb4,0x00,0x01,0x03,0x5c,0x00,0x01,0x03,0xc8,0x00,0x01,0x04,0x38,0x00,0x01,0x05,0x0c,0x00,0x01,0x05,0xe8,0x00,0x01,0x06,0x08,0x00,0x01,0x06,0x54,\r\n0x00,0x01,0x07,0x00,0x00,0x01,0x07,0x5c,0x00,0x01,0x07,0xb4,0x00,0x01,0x07,0xfc,0x00,0x01,0x08,0x14,0x00,0x01,0x08,0xbc,0x00,0x01,0x09,0x60,0x00,0x01,0x09,0x70,0x00,0x01,0x09,0xb0,0x00,0x01,0x09,0xe4,0x00,0x01,0x0a,0x1c,0x00,0x01,0x0a,0x74,0x00,0x01,0x0a,0xf4,0x00,0x01,0x0b,0x14,0x00,0x01,0x0b,0x34,0x00,0x01,0x0b,0x78,\r\n0x00,0x01,0x0b,0xbc,0x00,0x01,0x0c,0x6c,0x00,0x01,0x0d,0x1c,0x00,0x01,0x0d,0x68,0x00,0x01,0x0d,0xb4,0x00,0x01,0x0d,0xc4,0x00,0x01,0x0d,0xd4,0x00,0x01,0x0e,0x14,0x00,0x01,0x0e,0x58,0x00,0x01,0x0e,0x94,0x00,0x01,0x0e,0xd0,0x00,0x01,0x0f,0x14,0x00,0x01,0x0f,0x58,0x00,0x01,0x10,0x24,0x00,0x01,0x10,0x68,0x00,0x01,0x10,0xac,\r\n0x00,0x01,0x11,0x70,0x00,0x01,0x11,0xbc,0x00,0x01,0x12,0x04,0x00,0x01,0x12,0x3c,0x00,0x01,0x12,0x4c,0x00,0x01,0x12,0x84,0x00,0x01,0x12,0xbc,0x00,0x01,0x12,0xcc,0x00,0x01,0x13,0x0c,0x00,0x01,0x13,0x7c,0x00,0x01,0x13,0x94,0x00,0x01,0x14,0x20,0x00,0x01,0x14,0x50,0x00,0x01,0x14,0xa4,0x00,0x01,0x14,0xc4,0x00,0x01,0x15,0x14,\r\n0x00,0x01,0x15,0x94,0x00,0x01,0x15,0xfc,0x00,0x01,0x16,0x64,0x00,0x01,0x16,0xac,0x00,0x01,0x16,0xf0,0x00,0x01,0x17,0x30,0x00,0x01,0x17,0x48,0x00,0x01,0x17,0x80,0x00,0x01,0x17,0xd0,0x00,0x01,0x18,0x38,0x00,0x01,0x19,0xa4,0x00,0x01,0x1a,0x04,0x00,0x01,0x1a,0x70,0x00,0x01,0x1a,0xd8,0x00,0x01,0x1b,0x78,0x00,0x01,0x1b,0xd4,\r\n0x00,0x01,0x1c,0x58,0x00,0x01,0x1d,0x1c,0x00,0x01,0x1d,0x34,0x00,0x01,0x1e,0xa8,0x00,0x01,0x20,0x1c,0x00,0x01,0x20,0x3c,0x00,0x01,0x21,0x00,0x00,0x01,0x21,0x18,0x00,0x01,0x21,0x7c,0x00,0x01,0x21,0xa0,0x00,0x01,0x22,0x74,0x00,0x01,0x22,0x8c,0x00,0x01,0x22,0xac,0x00,0x01,0x22,0xd0,0x00,0x01,0x22,0xe8,0x00,0x01,0x23,0x0c,\r\n0x00,0x01,0x23,0x24,0x00,0x01,0x23,0x48,0x00,0x01,0x23,0x7c,0x00,0x01,0x23,0x94,0x00,0x01,0x25,0xa8,0x00,0x01,0x26,0x8c,0x00,0x01,0x26,0xb0,0x00,0x01,0x26,0xd4,0x00,0x01,0x26,0xec,0x00,0x01,0x27,0x10,0x00,0x01,0x27,0x28,0x00,0x01,0x27,0x48,0x00,0x01,0x27,0xc4,0x00,0x01,0x28,0x70,0x00,0x01,0x28,0x88,0x00,0x01,0x28,0xa0,\r\n0x00,0x01,0x28,0xb8,0x00,0x01,0x28,0xd8,0x00,0x01,0x2a,0x04,0x00,0x01,0x2a,0x30,0x00,0x01,0x2a,0x48,0x00,0x01,0x2a,0x6c,0x00,0x01,0x2b,0x50,0x00,0x01,0x2c,0xe8,0x00,0x01,0x2d,0xc0,0x00,0x01,0x2f,0x0c,0x00,0x01,0x30,0x54,0x00,0x01,0x32,0x24,0x00,0x01,0x33,0x30,0x00,0x01,0x34,0xa8,0x00,0x01,0x36,0x88,0x00,0x01,0x37,0xe0,\r\n0x00,0x01,0x38,0x98,0x00,0x01,0x39,0x88,0x00,0x01,0x39,0xac,0x00,0x01,0x39,0xe0,0x00,0x01,0x3a,0x48,0x00,0x01,0x3a,0xb0,0x00,0x01,0x3b,0x1c,0x00,0x01,0x3b,0x34,0x00,0x01,0x3b,0xb8,0x00,0x01,0x3b,0xd8,0x00,0x01,0x3c,0x28,0x00,0x01,0x3c,0x78,0x00,0x01,0x3c,0xe0,0x00,0x01,0x3d,0x18,0x00,0x01,0x3d,0xc0,0x00,0x01,0x3e,0x94,\r\n0x00,0x01,0x3e,0xdc,0x00,0x01,0x3f,0x50,0x00,0x01,0x3f,0xb0,0x00,0x01,0x3f,0xf8,0x00,0x01,0x40,0x5c,0x00,0x01,0x40,0xbc,0x00,0x01,0x40,0xdc,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x40,0xec,0x00,0x01,0x41,0xc4,0x00,0x01,0x42,0x78,\r\n0x00,0x01,0x43,0x68,0x00,0x01,0x44,0x40,0x00,0x01,0x45,0x5c,0x00,0x01,0x46,0x2c,0x00,0x01,0x46,0xa8,0x00,0x01,0x47,0x94,0x00,0x01,0x48,0x30,0x00,0x01,0x48,0xe8,0x00,0x01,0x49,0x68,0x00,0x01,0x4a,0x00,0x00,0x01,0x4a,0xa8,0x00,0x01,0x4b,0x68,0x00,0x01,0x4c,0x48,0x00,0x01,0x4c,0xf0,0x00,0x01,0x4d,0x8c,0x00,0x01,0x4d,0xd4,\r\n0x00,0x01,0x4d,0xf0,0x00,0x01,0x4e,0xa8,0x00,0x01,0x4f,0x74,0x00,0x01,0x50,0x7c,0x00,0x01,0x50,0xd4,0x00,0x01,0x51,0x08,0x00,0x01,0x51,0x64,0x00,0x01,0x51,0x98,0x00,0x01,0x51,0xc8,0x00,0x01,0x51,0xd8,0x00,0x01,0x52,0x34,0x00,0x01,0x52,0xa0,0x00,0x01,0x53,0x5c,0x00,0x01,0x54,0x08,0x00,0x01,0x54,0x94,0x00,0x01,0x55,0x10,\r\n0x00,0x01,0x55,0xbc,0x00,0x01,0x55,0xec,0x00,0x01,0x56,0x44,0x00,0x01,0x56,0xb8,0x00,0x01,0x57,0x5c,0x00,0x01,0x57,0xf8,0x00,0x01,0x58,0x58,0x00,0x01,0x58,0xc0,0x00,0x01,0x59,0xb8,0x00,0x01,0x5a,0x50,0x00,0x01,0x5a,0xa0,0x00,0x01,0x5b,0x2c,0x00,0x01,0x5b,0x7c,0x00,0x01,0x5b,0xf8,0x00,0x01,0x5c,0x48,0x00,0x01,0x5c,0x90,\r\n0x00,0x01,0x5c,0xc4,0x00,0x01,0x5d,0x08,0x00,0x01,0x5d,0x4c,0x00,0x01,0x5e,0x04,0x00,0x01,0x5e,0xa4,0x00,0x01,0x5f,0x04,0x00,0x01,0x5f,0x68,0x00,0x01,0x5f,0xd0,0x00,0x01,0x60,0x60,0x00,0x01,0x61,0x00,0x00,0x01,0x61,0xc4,0x00,0x01,0x62,0x0c,0x00,0x01,0x62,0x58,0x00,0x01,0x62,0xdc,0x00,0x01,0x63,0x40,0x00,0x01,0x63,0xa0,\r\n0x00,0x01,0x64,0xe8,0x00,0x01,0x66,0x2c,0x00,0x01,0x67,0x3c,0x00,0x01,0x67,0xc0,0x00,0x01,0x68,0x30,0x00,0x01,0x69,0xc0,0x00,0x01,0x6a,0xd4,0x00,0x01,0x6b,0xe4,0x00,0x01,0x6c,0xb0,0x00,0x01,0x6d,0x2c,0x00,0x01,0x6e,0x08,0x00,0x01,0x6f,0x24,0x00,0x01,0x6f,0xa8,0x00,0x01,0x70,0x84,0x00,0x01,0x71,0xa8,0x00,0x01,0x72,0x50,\r\n0x00,0x01,0x72,0xfc,0x00,0x01,0x73,0x74,0x00,0x01,0x73,0x84,0x00,0x01,0x73,0xbc,0x00,0x01,0x74,0x58,0x00,0x01,0x74,0xb0,0x00,0x01,0x75,0x2c,0x00,0x01,0x75,0x68,0x00,0x01,0x75,0xa8,0x00,0x01,0x76,0x14,0x00,0x01,0x76,0x84,0x00,0x01,0x77,0x08,0x00,0x01,0x77,0x34,0x00,0x01,0x77,0x98,0x00,0x01,0x78,0x50,0x00,0x01,0x78,0xb0,\r\n0x00,0x01,0x79,0x9c,0x00,0x01,0x7a,0x78,0x00,0x01,0x7a,0xd0,0x00,0x01,0x7b,0x28,0x00,0x01,0x7b,0x8c,0x00,0x01,0x7b,0xec,0x00,0x01,0x7c,0x50,0x00,0x01,0x7c,0x60,0x00,0x01,0x7c,0xb8,0x00,0x01,0x7d,0x28,0x00,0x01,0x7d,0x94,0x00,0x01,0x7e,0x48,0x00,0x01,0x7e,0x58,0x00,0x01,0x7e,0xa0,0x00,0x01,0x7e,0xd4,0x00,0x01,0x7f,0x10,\r\n0x00,0x01,0x7f,0x54,0x00,0x01,0x7f,0x64,0x00,0x01,0x7f,0xa0,0x00,0x01,0x7f,0xdc,0x00,0x01,0x81,0x28,0x00,0x01,0x82,0xd8,0x00,0x01,0x83,0x30,0x00,0x01,0x83,0x88,0x00,0x01,0x83,0xfc,0x00,0x01,0x84,0x94,0x00,0x01,0x85,0x68,0x00,0x01,0x86,0x88,0x00,0x01,0x86,0x98,0x00,0x01,0x87,0x28,0x00,0x01,0x87,0xb4,0x00,0x01,0x88,0x94,\r\n0x00,0x01,0x88,0xe4,0x00,0x01,0x89,0x58,0x00,0x01,0x89,0xa0,0x00,0x01,0x89,0xe4,0x00,0x01,0x89,0xf4,0x00,0x01,0x8a,0x30,0x00,0x01,0x8a,0x6c,0x00,0x01,0x8a,0xb8,0x00,0x01,0x8b,0x70,0x00,0x01,0x8b,0xec,0x00,0x01,0x8b,0xfc,0x00,0x01,0x8c,0x48,0x00,0x01,0x8c,0x90,0x00,0x01,0x8d,0x14,0x00,0x01,0x8d,0x84,0x00,0x01,0x8e,0x00,\r\n0x00,0x01,0x8e,0x98,0x00,0x01,0x8e,0xe4,0x00,0x01,0x8f,0x50,0x00,0x01,0x8f,0x98,0x00,0x01,0x90,0x04,0x00,0x01,0x90,0x48,0x00,0x01,0x90,0xdc,0x00,0x01,0x91,0x4c,0x00,0x01,0x91,0xc0,0x00,0x01,0x92,0x48,0x00,0x01,0x92,0xcc,0x00,0x01,0x93,0x38,0x00,0x01,0x93,0x80,0x00,0x01,0x93,0xc8,0x00,0x01,0x94,0xb8,0x00,0x01,0x95,0x60,\r\n0x00,0x01,0x97,0x44,0x00,0x01,0x97,0xb8,0x00,0x01,0x98,0x68,0x00,0x01,0x98,0xac,0x00,0x01,0x99,0x2c,0x00,0x01,0x9a,0x64,0x00,0x01,0x9b,0x18,0x00,0x01,0x9b,0xec,0x00,0x01,0x9c,0xa0,0x00,0x01,0x9d,0x54,0x00,0x01,0x9e,0x3c,0x00,0x01,0x9f,0x00,0x00,0x01,0x9f,0xd0,0x00,0x01,0xa0,0x24,0x00,0x01,0xa0,0x88,0x00,0x01,0xa0,0xf4,\r\n0x00,0x01,0xa1,0x54,0x00,0x01,0xa1,0xa8,0x00,0x01,0xa2,0x10,0x00,0x01,0xa2,0x74,0x00,0x01,0xa2,0xd4,0x00,0x01,0xa3,0x60,0x00,0x01,0xa3,0xc4,0x00,0x01,0xa4,0xa0,0x00,0x01,0xa5,0x8c,0x00,0x01,0xa6,0x34,0x00,0x01,0xa6,0xd4,0x00,0x01,0xa7,0x6c,0x00,0x01,0xa8,0x00,0x00,0x01,0xa8,0x64,0x00,0x01,0xa8,0xf8,0x00,0x01,0xa9,0x58,\r\n0x00,0x01,0xa9,0xd0,0x00,0x01,0xaa,0x6c,0x00,0x01,0xab,0x00,0x00,0x01,0xab,0x38,0x00,0x01,0xab,0xf0,0x00,0x01,0xac,0x48,0x00,0x01,0xac,0xec,0x00,0x01,0xad,0x38,0x00,0x01,0xad,0xd4,0x00,0x01,0xae,0x98,0x00,0x01,0xaf,0x54,0x00,0x01,0xaf,0xd0,0x00,0x01,0xb0,0x48,0x00,0x01,0xb0,0x70,0x00,0x01,0xb0,0xe8,0x00,0x01,0xb1,0x64,\r\n0x00,0x01,0xb2,0x18,0x00,0x01,0xb2,0x60,0x00,0x01,0xb2,0xa8,0x00,0x01,0xb3,0x30,0x00,0x01,0xb3,0xb8,0x00,0x01,0xb4,0x7c,0x00,0x01,0xb4,0xb4,0x00,0x01,0xb4,0xe8,0x00,0x01,0xb5,0x1c,0x00,0x01,0xb5,0x50,0x00,0x01,0xb5,0x84,0x00,0x01,0xb5,0xb8,0x00,0x01,0xb5,0xec,0x00,0x01,0xb6,0x20,0x00,0x01,0xb6,0x54,0x00,0x01,0xb6,0x8c,\r\n0x00,0x01,0xb6,0xbc,0x00,0x01,0xb6,0xec,0x00,0x01,0xb7,0x1c,0x00,0x01,0xb7,0x50,0x00,0x01,0xb7,0x84,0x00,0x01,0xb7,0xb8,0x00,0x01,0xb7,0xec,0x00,0x01,0xb8,0x20,0x00,0x01,0xb8,0x54,0x00,0x01,0xb8,0x88,0x00,0x01,0xb8,0xbc,0x00,0x01,0xb8,0xf0,0x00,0x01,0xb9,0x30,0x00,0x01,0xb9,0x84,0x00,0x01,0xb9,0xc4,0x00,0x01,0xba,0x04,\r\n0x00,0x01,0xba,0x38,0x00,0x01,0xba,0x90,0x00,0x01,0xba,0xd0,0x00,0x01,0xbd,0x1c,0x00,0x01,0xc1,0xbc,0x00,0x01,0xc4,0x08,0x00,0x01,0xc4,0x58,0x00,0x01,0xc4,0xec,0x00,0x01,0xc5,0x80,0x00,0x01,0xc6,0x1c,0x00,0x01,0xc6,0x98,0x00,0x01,0xc7,0x4c,0x00,0x01,0xc8,0x80,0x00,0x01,0xc9,0x58,0x00,0x01,0xca,0x64,0x00,0x01,0xca,0xe0,\r\n0x00,0x01,0xcb,0x08,0x00,0x01,0xcb,0x40,0x00,0x01,0xcb,0x88,0x00,0x01,0xcc,0x10,0x00,0x01,0xcc,0x40,0x00,0x01,0xcc,0x94,0x00,0x01,0xcc,0xc8,0x00,0x01,0xcd,0x18,0x00,0x01,0xcd,0x6c,0x00,0x01,0xcd,0xc0,0x00,0x01,0xce,0x10,0x00,0x01,0xce,0x64,0x00,0x01,0xce,0xc8,0x00,0x01,0xce,0xf8,0x00,0x01,0xcf,0x18,0x00,0x01,0xcf,0x3c,\r\n0x00,0x01,0xcf,0x60,0x00,0x01,0xcf,0xac,0x00,0x01,0xcf,0xdc,0x00,0x01,0xd0,0x1c,0x00,0x01,0xd0,0x50,0x00,0x01,0xd0,0x70,0x00,0x01,0xd0,0x90,0x00,0x01,0xd0,0xc0,0x00,0x01,0xd0,0xec,0x00,0x01,0xd1,0x1c,0x00,0x01,0xd1,0x3c,0x00,0x01,0xd1,0x64,0x00,0x01,0xd1,0x84,0x00,0x01,0xd1,0xcc,0x00,0x01,0xd1,0xf8,0x00,0x01,0xd2,0x34,\r\n0x00,0x01,0xd2,0x60,0x00,0x01,0xd2,0xe4,0x00,0x01,0xd3,0x50,0x00,0x01,0xd3,0xbc,0x00,0x01,0xd4,0x14,0x00,0x01,0xd4,0x94,0x00,0x01,0xd4,0xfc,0x00,0x01,0xd5,0x64,0x00,0x01,0xd5,0xb0,0x00,0x01,0xd6,0x60,0x00,0x01,0xd6,0xec,0x00,0x01,0xd7,0x74,0x00,0x01,0xd7,0xcc,0x00,0x01,0xd8,0x20,0x00,0x01,0xd8,0x74,0x00,0x01,0xd8,0xc0,\r\n0x00,0x01,0xd9,0x04,0x00,0x01,0xd9,0x5c,0x00,0x01,0xd9,0xa0,0x00,0x01,0xd9,0xf8,0x00,0x01,0xda,0x58,0x00,0x01,0xda,0xa4,0x00,0x01,0xda,0xe8,0x00,0x01,0xdb,0x40,0x00,0x01,0xdb,0x84,0x00,0x01,0xdb,0xdc,0x00,0x01,0xdc,0x3c,0x00,0x01,0xdc,0xa8,0x00,0x01,0xdd,0x00,0x00,0x01,0xdd,0x58,0x00,0x01,0xdd,0xa8,0x00,0x01,0xdd,0xfc,\r\n0x00,0x01,0xde,0x30,0x00,0x01,0xde,0x7c,0x00,0x01,0xde,0xc0,0x00,0x01,0xdf,0x04,0x00,0x01,0xdf,0x3c,0x00,0x01,0xdf,0x74,0x00,0x01,0xdf,0xc0,0x00,0x01,0xe0,0x3c,0x00,0x01,0xe0,0xcc,0x00,0x01,0xe1,0x04,0x00,0x01,0xe1,0x68,0x00,0x01,0xe1,0xdc,0x00,0x01,0xe2,0x10,0x00,0x01,0xe2,0x5c,0x00,0x01,0xe2,0xa0,0x00,0x01,0xe2,0xe4,\r\n0x00,0x01,0xe3,0x28,0x00,0x01,0xe3,0x5c,0x00,0x01,0xe3,0xb8,0x00,0x01,0xe4,0x08,0x00,0x01,0xe4,0x58,0x00,0x01,0xe4,0xc0,0x00,0x01,0xe5,0x18,0x00,0x01,0xe5,0x70,0x00,0x01,0xe5,0xd4,0x00,0x01,0xe6,0x2c,0x00,0x01,0xe6,0x80,0x00,0x01,0xe6,0xe0,0x00,0x01,0xe7,0x48,0x00,0x01,0xe7,0xa0,0x00,0x01,0xe7,0xf8,0x00,0x01,0xe8,0x50,\r\n0x00,0x01,0xe8,0xac,0x00,0x01,0xe9,0x18,0x00,0x01,0xe9,0x58,0x00,0x01,0xe9,0x98,0x00,0x01,0xe9,0xe8,0x00,0x01,0xea,0x3c,0x00,0x01,0xea,0x70,0x00,0x01,0xea,0xbc,0x00,0x01,0xeb,0x00,0x00,0x01,0xeb,0x44,0x00,0x01,0xeb,0x7c,0x00,0x01,0xeb,0xb4,0x00,0x01,0xec,0x00,0x00,0x01,0xec,0x7c,0x00,0x01,0xed,0x0c,0x00,0x01,0xed,0x44,\r\n0x00,0x01,0xed,0xa8,0x00,0x01,0xee,0x1c,0x00,0x01,0xee,0x50,0x00,0x01,0xee,0x94,0x00,0x01,0xee,0xe0,0x00,0x01,0xef,0x24,0x00,0x01,0xef,0x68,0x00,0x01,0xef,0x9c,0x00,0x01,0xef,0xfc,0x00,0x01,0xf0,0x4c,0x00,0x01,0xf0,0x9c,0x00,0x01,0xf1,0x04,0x00,0x01,0xf1,0x5c,0x00,0x01,0xf1,0xb4,0x00,0x01,0xf2,0x18,0x00,0x01,0xf2,0x70,\r\n0x00,0x01,0xf2,0xc4,0x00,0x01,0xf3,0x24,0x00,0x01,0xf3,0x8c,0x00,0x01,0xf3,0xe4,0x00,0x01,0xf4,0x38,0x00,0x01,0xf4,0x8c,0x00,0x01,0xf4,0xec,0x00,0x01,0xf5,0x38,0x00,0x01,0xf5,0x90,0x00,0x01,0xf5,0xd4,0x00,0x01,0xf6,0x2c,0x00,0x01,0xf6,0x70,0x00,0x01,0xf6,0xd0,0x00,0x01,0xf7,0x1c,0x00,0x01,0xf7,0x74,0x00,0x01,0xf7,0xb8,\r\n0x00,0x01,0xf8,0x10,0x00,0x01,0xf8,0x54,0x00,0x01,0xf8,0xbc,0x00,0x01,0xf9,0x14,0x00,0x01,0xf9,0x6c,0x00,0x01,0xf9,0xe4,0x00,0x01,0xfa,0x48,0x00,0x01,0xfa,0xb0,0x00,0x01,0xfb,0x0c,0x00,0x01,0xfb,0x5c,0x00,0x01,0xfb,0xac,0x00,0x01,0xfc,0x0c,0x00,0x01,0xfc,0x5c,0x00,0x01,0xfc,0xac,0x00,0x01,0xfd,0x30,0x00,0x01,0xfd,0x94,\r\n0x00,0x01,0xfd,0xf8,0x00,0x01,0xfe,0x54,0x00,0x01,0xff,0x0c,0x00,0x01,0xff,0xe0,0x00,0x02,0x00,0x40,0x00,0x02,0x00,0x58,0x00,0x02,0x01,0x48,0x00,0x02,0x02,0x3c,0x00,0x02,0x03,0x08,0x00,0x02,0x03,0xac,0x00,0x02,0x04,0x60,0x00,0x02,0x04,0xc0,0x00,0x02,0x05,0x7c,0x00,0x02,0x06,0x04,0x00,0x02,0x06,0x88,0x00,0x02,0x07,0x0c,\r\n0x00,0x02,0x08,0x20,0x00,0x02,0x08,0x84,0x00,0x02,0x08,0x9c,0x00,0x02,0x09,0x14,0x00,0x02,0x09,0xd8,0x00,0x02,0x0a,0x3c,0x00,0x02,0x0a,0x98,0x00,0x02,0x0b,0x84,0x00,0x02,0x0b,0x9c,0x00,0x02,0x0b,0xac,0x00,0x02,0x0c,0x28,0x00,0x02,0x0d,0x00,0x00,0x02,0x0d,0x9c,0x00,0x02,0x0e,0x3c,0x00,0x02,0x0e,0xa8,0x00,0x02,0x0f,0x58,\r\n0x00,0x02,0x10,0x24,0x00,0x02,0x10,0x78,0x00,0x02,0x10,0xe0,0x00,0x02,0x11,0xb0,0x00,0x02,0x12,0x64,0x00,0x02,0x13,0x10,0x00,0x02,0x13,0xc0,0x00,0x02,0x14,0x44,0x00,0x02,0x15,0x1c,0x00,0x02,0x15,0xc8,0x00,0x02,0x16,0x58,0x00,0x02,0x16,0xe8,0x00,0x02,0x17,0x80,0x00,0x02,0x17,0xa0,0x00,0x02,0x18,0x60,0x00,0x02,0x18,0xf4,\r\n0x00,0x02,0x19,0xc4,0x00,0x02,0x1a,0xec,0x00,0x02,0x1b,0xac,0x00,0x02,0x1c,0x20,0x00,0x02,0x1c,0xd0,0x00,0x02,0x1d,0x6c,0x00,0x02,0x1d,0xf0,0x00,0x02,0x1e,0x54,0x00,0x02,0x1e,0xf0,0x00,0x02,0x1f,0x60,0x00,0x02,0x1f,0xf8,0x00,0x02,0x20,0x58,0x00,0x02,0x20,0xa8,0x00,0x02,0x21,0x54,0x00,0x02,0x22,0x4c,0x00,0x02,0x22,0x70,\r\n0x00,0x02,0x22,0x88,0x00,0x02,0x23,0x4c,0x00,0x02,0x23,0xf4,0x00,0x02,0x24,0xbc,0x00,0x02,0x25,0x14,0x00,0x02,0x25,0x74,0x00,0x02,0x26,0x54,0x00,0x02,0x27,0x44,0x00,0x02,0x27,0xdc,0x00,0x02,0x28,0x20,0x00,0x02,0x28,0x4c,0x00,0x02,0x28,0x84,0x00,0x02,0x28,0xbc,0x00,0x02,0x28,0xf4,0x00,0x02,0x29,0xbc,0x00,0x02,0x2a,0xfc,\r\n0x00,0x02,0x2b,0xdc,0x00,0x02,0x2d,0x04,0x00,0x02,0x2d,0x64,0x00,0x02,0x2e,0x78,0x00,0x02,0x2f,0x90,0x00,0x02,0x30,0x98,0x00,0x02,0x31,0x60,0x00,0x02,0x31,0xe8,0x00,0x02,0x32,0x08,0x00,0x02,0x32,0x38,0x00,0x02,0x32,0x68,0x00,0x02,0x32,0xc0,0x00,0x02,0x33,0x18,0x00,0x02,0x33,0xc8,0x00,0x02,0x34,0x40,0x00,0x02,0x35,0x5c,\r\n0x00,0x02,0x36,0x18,0x00,0x02,0x36,0xe0,0x00,0x02,0x37,0x4c,0x00,0x02,0x37,0xfc,0x00,0x02,0x38,0xe4,0x00,0x02,0x39,0xe4,0x00,0x02,0x3a,0x20,0x00,0x02,0x3a,0x5c,0x00,0x02,0x3a,0xa0,0x00,0x02,0x3a,0xdc,0x00,0x02,0x3b,0x20,0x00,0x02,0x3b,0xd8,0x00,0x02,0x3c,0x74,0x00,0x02,0x3d,0x30,0x00,0x02,0x3d,0xe0,0x00,0x02,0x3f,0x0c,\r\n0x00,0x02,0x3f,0xe8,0x00,0x02,0x40,0xc4,0x00,0x02,0x41,0x98,0x00,0x02,0x42,0x64,0x00,0x02,0x42,0xf4,0x00,0x02,0x43,0xd4,0x00,0x02,0x45,0x18,0x00,0x02,0x45,0xf4,0x00,0x02,0x46,0xf0,0x00,0x02,0x47,0x88,0x00,0x02,0x48,0xc0,0x00,0x02,0x49,0x50,0x00,0x02,0x4a,0x34,0x00,0x02,0x4a,0x8c,0x00,0x02,0x4b,0x3c,0x00,0x02,0x4b,0xbc,\r\n0x00,0x02,0x4c,0x3c,0x00,0x02,0x4d,0x3c,0x00,0x02,0x4d,0xa0,0x00,0x02,0x4e,0x20,0x00,0x02,0x4e,0xa4,0x00,0x02,0x50,0x10,0x00,0x02,0x50,0xa8,0x00,0x02,0x51,0x28,0x00,0x02,0x51,0xe0,0x00,0x02,0x52,0x74,0x00,0x02,0x53,0x28,0x00,0x02,0x54,0x00,0x00,0x02,0x54,0xd8,0x00,0x02,0x55,0x74,0x00,0x02,0x55,0xc0,0x00,0x02,0x56,0x28,\r\n0x00,0x02,0x56,0x90,0x00,0x02,0x57,0xb8,0x00,0x02,0x58,0xa8,0x00,0x02,0x59,0xa8,0x00,0x02,0x5a,0xd4,0x00,0x02,0x5b,0xe8,0x00,0x02,0x5c,0xec,0x00,0x02,0x5e,0x14,0x00,0x02,0x5f,0x54,0x00,0x02,0x60,0x64,0x00,0x02,0x61,0x00,0x00,0x02,0x61,0x84,0x00,0x02,0x62,0x88,0x00,0x02,0x63,0x10,0x00,0x02,0x63,0xbc,0x00,0x02,0x63,0xd0,\r\n0x00,0x02,0x64,0x88,0x00,0x02,0x65,0x70,0x00,0x02,0x66,0x5c,0x00,0x02,0x67,0x68,0x00,0x02,0x68,0x80,0x00,0x02,0x6a,0x00,0x00,0x02,0x6a,0xc8,0x00,0x02,0x6b,0xcc,0x00,0x02,0x6d,0x9c,0x00,0x02,0x70,0x14,0x00,0x02,0x71,0x70,0x00,0x02,0x71,0xdc,0x00,0x02,0x72,0x54,0x00,0x02,0x73,0x14,0x00,0x02,0x73,0x78,0x00,0x02,0x73,0x90,\r\n0x00,0x02,0x74,0x18,0x00,0x02,0x74,0x78,0x00,0x02,0x75,0x34,0x00,0x02,0x75,0xd8,0x00,0x02,0x76,0x78,0x00,0x02,0x77,0x00,0x00,0x02,0x77,0x98,0x00,0x02,0x78,0x1c,0x00,0x02,0x79,0x14,0x00,0x02,0x79,0xa8,0x00,0x02,0x7a,0x60,0x00,0x02,0x7a,0xf0,0x00,0x02,0x7b,0xcc,0x00,0x02,0x7c,0xe4,0x00,0x02,0x7d,0xbc,0x00,0x02,0x7e,0x14,\r\n0x00,0x02,0x7e,0x88,0x00,0x02,0x7f,0x40,0x00,0x02,0x7f,0xf8,0x00,0x02,0x80,0xb0,0x00,0x02,0x81,0x4c,0x00,0x02,0x81,0xc8,0x00,0x02,0x82,0x30,0x00,0x02,0x82,0xc0,0x00,0x02,0x82,0xe4,0x00,0x02,0x83,0x08,0x00,0x02,0x83,0x58,0x00,0x02,0x83,0xfc,0x00,0x02,0x84,0x20,0x00,0x02,0x84,0xa0,0x00,0x02,0x85,0x38,0x00,0x02,0x85,0x58,\r\n0x00,0x02,0x85,0xc4,0x00,0x02,0x86,0x30,0x00,0x02,0x86,0x98,0x00,0x02,0x87,0x08,0x00,0x02,0x87,0x78,0x00,0x02,0x87,0x9c,0x00,0x02,0x87,0xc8,0x00,0x02,0x88,0xa4,0x00,0x02,0x88,0xbc,0x00,0x02,0x88,0xdc,0x00,0x02,0x89,0x60,0x00,0x02,0x8a,0x00,0x00,0x02,0x8a,0xbc,0x00,0x02,0x8b,0x60,0x00,0x02,0x8c,0x68,0x00,0x02,0x8d,0x94,\r\n0x00,0x02,0x8e,0x9c,0x00,0x02,0x8f,0x30,0x00,0x02,0x8f,0xf4,0x00,0x02,0x90,0x44,0x00,0x02,0x90,0xc8,0x00,0x02,0x91,0x6c,0x00,0x02,0x92,0x34,0x00,0x02,0x92,0xfc,0x00,0x02,0x93,0x8c,0x00,0x02,0x93,0xe4,0x00,0x02,0x93,0xfc,0x00,0x02,0x94,0x7c,0x00,0x02,0x95,0x14,0x00,0x02,0x95,0x34,0x00,0x02,0x96,0xb8,0x00,0x02,0x98,0x00,\r\n0x00,0x02,0x99,0x80,0x00,0x02,0x9b,0x3c,0x00,0x02,0x9b,0xa8,0x00,0x02,0x9c,0x44,0x00,0x02,0x9d,0x0c,0x00,0x02,0x9e,0xb0,0x00,0x02,0x9f,0xf4,0x00,0x02,0xa0,0xfc,0x00,0x02,0xa2,0xec,0x00,0x02,0xa3,0x74,0x00,0x02,0xa3,0xf8,0x00,0x02,0xa4,0xa8,0x00,0x02,0xa5,0x20,0x00,0x02,0xa5,0xc0,0x00,0x02,0xa5,0xf8,0x00,0x02,0xa6,0x08,\r\n0x00,0x02,0xa6,0x44,0x00,0x02,0xa6,0x9c,0x00,0x02,0xa6,0xb0,0x00,0x02,0xa6,0xec,0x00,0x02,0xa7,0x6c,0x00,0x02,0xa7,0xc0,0x00,0x02,0xa7,0xfc,0x00,0x02,0xa8,0x38,0x00,0x02,0xa8,0x94,0x00,0x02,0xa8,0xc8,0x00,0x02,0xa9,0x14,0x00,0x02,0xa9,0x60,0x00,0x02,0xa9,0xc4,0x00,0x02,0xaa,0x4c,0x00,0x02,0xab,0x04,0x00,0x02,0xab,0x44,\r\n0x00,0x02,0xab,0xc8,0x00,0x02,0xac,0x14,0x00,0x02,0xac,0x50,0x00,0x02,0xac,0xc8,0x00,0x02,0xad,0x1c,0x00,0x02,0xad,0xa0,0x00,0x02,0xad,0xdc,0x00,0x02,0xae,0x50,0x00,0x02,0xae,0xb8,0x00,0x02,0xae,0xf8,0x00,0x02,0xaf,0x38,0x00,0x02,0xaf,0x78,0x00,0x02,0xaf,0x8c,0x00,0x02,0xaf,0xa0,0x00,0x02,0xaf,0xb4,0x00,0x02,0xaf,0xc8,\r\n0x00,0x02,0xaf,0xdc,0x00,0x02,0xaf,0xf0,0x00,0x02,0xb0,0x04,0x00,0x02,0xb0,0x18,0x00,0x02,0xb0,0x2c,0x00,0x02,0xb0,0x40,0x00,0x02,0xb0,0x54,0x00,0x02,0xb0,0x68,0x00,0x02,0xb0,0x7c,0x00,0x02,0xb0,0x8c,0x00,0x02,0xb1,0x04,0x00,0x02,0xb1,0x50,0x00,0x02,0xb1,0x84,0x00,0x02,0xb1,0xb8,0x00,0x02,0xb2,0x0c,0x00,0x02,0xb2,0x50,\r\n0x00,0x02,0xb2,0x94,0x00,0x02,0xb2,0xf0,0x00,0x02,0xb3,0x70,0x00,0x02,0xb4,0x20,0x00,0x02,0xb4,0x58,0x00,0x02,0xb4,0xd4,0x00,0x02,0xb5,0x18,0x00,0x02,0xb5,0x70,0x00,0x02,0xb5,0xac,0x00,0x02,0xb6,0x14,0x00,0x02,0xb6,0x60,0x00,0x02,0xb6,0xd4,0x00,0x02,0xb7,0x08,0x00,0x02,0xb7,0x94,0x00,0x02,0xb8,0x10,0x00,0x02,0xb8,0x6c,\r\n0x00,0x02,0xb8,0xa4,0x00,0x02,0xb8,0xb8,0x00,0x02,0xb8,0xcc,0x00,0x02,0xb8,0xe0,0x00,0x02,0xb8,0xf4,0x00,0x02,0xb9,0x08,0x00,0x02,0xb9,0x1c,0x00,0x02,0xb9,0x30,0x00,0x02,0xb9,0x44,0x00,0x02,0xb9,0x58,0x00,0x02,0xb9,0x6c,0x00,0x02,0xb9,0x80,0x00,0x02,0xb9,0xbc,0x00,0x02,0xb9,0xf0,0x00,0x02,0xba,0xc0,0x00,0x02,0xbb,0x1c,\r\n0x00,0x02,0xbb,0x98,0x00,0x02,0xbc,0x14,0x00,0x02,0xbc,0xe8,0x00,0x02,0xbd,0xec,0x00,0x02,0xbe,0x50,0x00,0x02,0xbe,0xc0,0x00,0x02,0xbf,0x80,0x00,0x02,0xc0,0x74,0x00,0x02,0xc0,0xf4,0x00,0x02,0xc1,0x74,0x00,0x02,0xc2,0x4c,0x00,0x02,0xc3,0x18,0x00,0x02,0xc3,0x7c,0x00,0x02,0xc3,0xec,0x00,0x02,0xc4,0xac,0x00,0x02,0xc5,0x68,\r\n0x00,0x02,0xc5,0xec,0x00,0x02,0xc6,0x9c,0x00,0x02,0xc7,0x70,0x00,0x02,0xc7,0xa8,0x00,0x02,0xc7,0xf0,0x00,0x02,0xc8,0x30,0x00,0x02,0xc8,0x78,0x00,0x02,0xc9,0x24,0x00,0x02,0xc9,0x3c,0x00,0x02,0xc9,0x3c,0x00,0x02,0xc9,0x3c,0x00,0x03,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x31,0x40,0x2e,\r\n0x09,0x04,0x02,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x33,0x11,0x21,0x11,0x25,0x01,0x21,0x13,0x21,0x11,0x5a,0x01,0xa4,0xfe,0x8e,0x01,0x2c,\r\n0xfe,0xd4,0x14,0x01,0x2c,0x02,0xda,0xfd,0x26,0x6d,0x02,0x3b,0xfd,0x8a,0x02,0x3b,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x2c,0x40,0x29,0x0d,0x01,0x04,0x00,0x01,0x4c,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x68,0x00,0x00,0x00,0x38,0x4d,0x05,0x03,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x09,\r\n0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x06,0x09,0x19,0x2b,0x33,0x13,0x33,0x13,0x23,0x27,0x23,0x07,0x13,0x33,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x32,0xbe,0x79,0xbd,0x5b,0x30,0xdd,0x30,0x42,0xb8,0x38,0x10,0x12,0x02,0x02,0x12,0x10,0x02,0xda,0xfd,0x26,0xc2,0xc2,0x01,0x0e,0xe1,0x40,0x56,0x0d,0x0d,0x56,0x3f,0x00,0x00,0x00,\r\n0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x00,0x27,0x06,0xbc,0x02,0x58,\r\n0x00,0x00,0x02,0x06,0x00,0x01,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26,0x03,0xb6,0x00,0x27,0x06,0x95,0x02,0x58,0x00,0x00,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbd,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbe,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xbf,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,\r\n0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x67,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26,\r\n0x03,0xb6,0x00,0x27,0x06,0x93,0x02,0x58,0x00,0x00,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc1,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,\r\n0x00,0x07,0x06,0xc2,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb1,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x2b,0x02,0x26,\r\n0x02,0xda,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xd4,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0x93,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x32,0xff,0x35,0x02,0x49,0x02,0xda,0x00,0x16,0x00,0x1f,0x00,0x65,0x40,0x0a,0x1c,0x01,0x06,0x00,0x13,0x01,0x01,0x04,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1f,0x00,0x06,0x00,0x04,0x01,\r\n0x06,0x04,0x68,0x00,0x00,0x00,0x38,0x4d,0x07,0x05,0x02,0x01,0x01,0x39,0x4d,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x1c,0x00,0x06,0x00,0x04,0x01,0x06,0x04,0x68,0x00,0x02,0x00,0x03,0x02,0x03,0x63,0x00,0x00,0x00,0x38,0x4d,0x07,0x05,0x02,0x01,0x01,0x39,0x01,0x4e,0x59,0x40,0x10,0x00,0x00,0x18,0x17,\r\n0x00,0x16,0x00,0x16,0x16,0x21,0x25,0x11,0x11,0x08,0x09,0x1b,0x2b,0x33,0x13,0x33,0x13,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x27,0x23,0x07,0x13,0x33,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x32,0xbe,0x79,0xbd,0x11,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x21,0x29,0x30,0xdd,0x30,0x42,\r\n0xb8,0x38,0x10,0x12,0x02,0x02,0x12,0x10,0x02,0xda,0xfd,0x26,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1b,0x36,0x1f,0xc0,0xc2,0x01,0x0e,0xe1,0x40,0x56,0x0d,0x0d,0x56,0x3f,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xe2,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x96,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,\r\n0x00,0x00,0x02,0x26,0x03,0xb1,0x02,0x26,0x00,0x01,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0f,0x00,0x13,0x00,0x3f,0x40,0x3c,0x00,0x02,0x00,0x03,0x08,0x02,0x03,0x67,0x00,0x08,0x00,0x06,0x04,0x08,0x06,0x67,0x09,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,\r\n0x4d,0x00,0x04,0x04,0x05,0x5f,0x0a,0x07,0x02,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x13,0x12,0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1d,0x2b,0x33,0x13,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x21,0x35,0x23,0x07,0x13,0x33,0x11,0x23,0x1e,0x91,0x01,0x8b,0xb6,0x9d,0x9d,0xb6,0xfe,\r\n0xf4,0x8d,0x28,0x36,0x7f,0x38,0x02,0xda,0x52,0xe4,0x52,0xff,0x00,0x52,0xcb,0xcb,0x01,0x16,0x01,0x72,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x3a,0x03,0xb6,0x02,0x26,0x00,0x18,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0x00,0x03,0x00,0x5d,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x10,0x00,0x19,0x00,0x22,0x00,0x39,0x40,0x36,\r\n0x08,0x01,0x05,0x02,0x01,0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x01,0x5f,0x06,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x22,0x20,0x1c,0x1a,0x19,0x17,0x13,0x11,0x00,0x10,0x00,0x0f,0x21,0x07,0x09,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,\r\n0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5d,0xcf,0x64,0x71,0x47,0x39,0x2b,0x41,0x25,0x73,0x64,0x86,0x76,0x3a,0x43,0x42,0x3a,0x77,0x7c,0x3f,0x49,0x49,0x3f,0x7c,0x02,0xda,0x64,0x59,0x38,0x5a,0x0b,0x03,0x05,0x32,0x4d,0x2e,0x5e,0x6d,0x01,\r\n0xa3,0x3e,0x35,0x35,0x3e,0xfd,0xc8,0x43,0x3a,0x3c,0x4b,0x00,0x00,0x01,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x1b,0x00,0x3b,0x40,0x38,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,\r\n0x4e,0x01,0x00,0x19,0x18,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,\r\n0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,\r\n0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x5d,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x35,0x02,0x0a,0x02,0xe4,0x00,0x2f,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x05,0x28,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,\r\n0x07,0x01,0x72,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,\r\n0x01,0x08,0x00,0x08,0x63,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x2f,0x00,0x2e,0x12,0x12,0x25,0x22,0x12,0x27,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd2,0x46,0x16,0x1b,0x37,0x32,0x18,0x49,0x53,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x62,0x03,0x01,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,\r\n0x37,0x17,0x0d,0x11,0x1a,0x41,0x10,0x6a,0x52,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x43,0x3e,0x61,0x71,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x03,0xb6,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c,\r\n0xff,0xf6,0x02,0x0a,0x03,0xb0,0x02,0x26,0x00,0x1b,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0b,0x00,0x15,0x00,0x27,0x40,0x24,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x15,0x13,\r\n0x0e,0x0c,0x00,0x0b,0x00,0x0a,0x21,0x05,0x09,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x5c,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x02,0xda,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,\r\n0x4a,0x00,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0f,0x00,0x1d,0x00,0x37,0x40,0x34,0x06,0x01,0x01,0x07,0x01,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x08,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x17,0x12,0x10,\r\n0x00,0x0f,0x00,0x0e,0x21,0x11,0x11,0x09,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x15,0x33,0x15,0x23,0x5c,0x52,0x52,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x6c,0x6c,0x01,0x4f,0x4b,0x01,\r\n0x40,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,0x4a,0xf0,0x4b,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x21,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x00,0x02,0xda,0x00,0x0f,0x00,0x1d,0x00,0x37,0x40,0x34,0x06,0x01,\r\n0x01,0x07,0x01,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x08,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x17,0x12,0x10,0x00,0x0f,0x00,0x0e,0x21,0x11,0x11,0x09,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x11,0x14,\r\n0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x23,0x15,0x33,0x15,0x23,0x5c,0x52,0x52,0xbd,0x47,0x67,0x39,0x39,0x67,0x47,0x63,0x63,0x42,0x4b,0x4b,0x42,0x63,0x6c,0x6c,0x01,0x4f,0x4b,0x01,0x40,0x36,0x62,0x43,0xfe,0xdd,0x43,0x63,0x36,0x50,0x4a,0x42,0x01,0x23,0x41,0x4a,0xf0,0x4b,0x00,0x00,0x00,0x01,0x00,0x64,\r\n0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x06,0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,\r\n0x15,0x21,0x11,0x21,0x15,0x64,0x01,0xa4,0xfe,0xb5,0x01,0x28,0xfe,0xd8,0x01,0x4b,0x02,0xda,0x52,0xe2,0x50,0xfe,0xfc,0x52,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,\r\n0x00,0x07,0x06,0x95,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x71,\r\n0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x2b,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x27,0x06,0x9e,0x02,0x62,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,\r\n0x00,0x07,0x06,0xc1,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x30,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc2,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xfc,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,\r\n0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb0,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x2b,0x02,0x08,0x02,0xda,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x62,0x00,0x00,\r\n0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb6,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xd4,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0x93,0x02,0x26,0x00,0x25,0x00,0x00,\r\n0x00,0x07,0x06,0x98,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0x35,0x02,0x0d,0x02,0xda,0x00,0x1b,0x00,0x6e,0x4b,0xb0,0x15,0x50,0x58,0x40,0x29,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x4d,0x00,0x06,0x06,0x07,0x5f,\r\n0x00,0x07,0x07,0x3d,0x07,0x4e,0x1b,0x40,0x26,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x06,0x00,0x07,0x06,0x07,0x63,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x05,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x1b,0x00,0x1b,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x11,\r\n0x0a,0x09,0x1e,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x21,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x64,0x01,0xa4,0xfe,0xb5,0x01,0x28,0xfe,0xd8,0x01,0x4b,0x2f,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x02,0xda,0x52,0xe2,0x50,0xfe,0xfc,0x52,0x1b,0x2d,\r\n0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0x00,0x01,0x00,0x42,0xff,0xf6,0x02,0x24,0x02,0xe4,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x07,0x01,0x05,0x04,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,\r\n0x01,0x01,0x3e,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x2a,0x29,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x16,0x14,0x13,0x10,0x0e,0x00,0x2d,0x01,0x2d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,\r\n0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x0e,0x02,0x01,0x35,0x48,0x6d,0x3e,0x4e,0x3e,0x34,0x41,0x37,0x61,0x40,0x42,0x65,0x38,0x5a,0x4a,0x3b,0x38,0x46,0x47,0x39,0x57,0x56,0x43,0x53,0x53,0x43,0x41,0x54,0x01,0x5a,0x01,0x3d,0x6b,0x0a,0x35,0x5e,0x3e,0x47,0x67,0x0b,0x03,\r\n0x0d,0x5b,0x3c,0x38,0x55,0x30,0x35,0x5e,0x3f,0x3a,0x48,0x41,0x35,0x36,0x44,0x50,0x4b,0x3c,0x3c,0x4b,0x48,0x3a,0x3e,0x5f,0x35,0x00,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x5f,0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x09,\r\n0x00,0x29,0x40,0x26,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x5f,0x01,0xae,0xfe,0xaa,0x01,0x3c,0xfe,0xc6,0x02,0xda,\r\n0x52,0xf2,0x52,0xfe,0xbc,0x00,0x00,0x00,0x00,0x01,0x00,0x58,0xff,0xf6,0x02,0x06,0x02,0xe4,0x00,0x1f,0x00,0x3e,0x40,0x3b,0x00,0x02,0x03,0x06,0x03,0x02,0x06,0x80,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,\r\n0x1c,0x1b,0x1a,0x19,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,0x01,0x1f,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x15,0x14,0x06,0x01,0x30,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,\r\n0x43,0x43,0x3b,0x3b,0x41,0x94,0xee,0x74,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x71,0x61,0x3e,0x43,0x42,0x3e,0xfe,0xb5,0x3e,0x44,0x44,0x3e,0x64,0x52,0xb6,0x61,0x71,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,\r\n0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb6,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x58,0xff,0x10,0x02,0x06,0x02,0xe4,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x5c,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x06,0x03,0xb0,0x02,0x26,0x00,0x39,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x00,0x0b,0x00,0x27,0x40,0x24,\r\n0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x38,0x4d,0x06,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x5d,0x5a,0xea,0x5a,0x5a,0xea,0x02,0xda,0xfe,0xc8,0x01,0x38,0xfd,0x26,0x01,\r\n0x50,0xfe,0xb0,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x13,0x00,0x17,0x00,0x3b,0x40,0x38,0x05,0x03,0x02,0x01,0x0b,0x06,0x02,0x00,0x0a,0x01,0x00,0x67,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x67,0x04,0x01,0x02,0x02,0x38,0x4d,0x0c,0x09,0x02,0x07,0x07,0x39,0x07,0x4e,0x00,0x00,0x17,0x16,0x15,0x14,0x00,0x13,\r\n0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1f,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x11,0x33,0x35,0x23,0x5d,0x53,0x53,0x5a,0xea,0x5a,0x53,0x53,0x5a,0xea,0xea,0xea,0x02,0x0d,0x4b,0x82,0x82,0x82,0x82,0x4b,0xfd,0xf3,0x01,0x50,0xfe,\r\n0xb0,0x01,0xa2,0x6b,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x03,0xb6,0x02,0x26,0x00,0x40,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x00,0x0b,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,\r\n0x05,0x39,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x69,0x95,0x95,0x01,0x86,0x95,0x95,0x52,0x02,0x36,0x52,0x52,0xfd,0xca,0x52,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,\r\n0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,\r\n0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb0,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0xff,0x2b,0x01,0xef,0x02,0xda,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb6,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xd4,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0x93,0x02,0x26,0x00,0x43,0x00,0x00,\r\n0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x35,0x01,0xef,0x02,0xda,0x00,0x1b,0x00,0x62,0x4b,0xb0,0x15,0x50,0x58,0x40,0x23,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x4d,0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x07,0x3d,0x07,0x4e,\r\n0x1b,0x40,0x20,0x00,0x06,0x00,0x07,0x06,0x07,0x63,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x00,0x00,0x05,0x5f,0x09,0x08,0x02,0x05,0x05,0x39,0x05,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x1b,0x00,0x1b,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,\r\n0x23,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x69,0x95,0x95,0x01,0x86,0x95,0x95,0xa2,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x52,0x02,0x36,0x52,0x52,0xfd,0xca,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x69,\r\n0x00,0x00,0x01,0xef,0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x2d,0xff,0xf6,0x01,0xef,0x02,0xda,0x00,0x0f,0x00,0x2b,0x40,0x28,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x03,0x03,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0c,\r\n0x0b,0x08,0x06,0x04,0x03,0x00,0x0f,0x01,0x0f,0x05,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x0e,0x69,0x78,0x5a,0x47,0x40,0x40,0x47,0x5a,0x79,0x0a,0x76,0x66,0x43,0x49,0x49,0x43,0x02,0x08,0xfd,0xf8,0x66,0x76,0x00,0x00,0x00,0xff,0xff,0x00,0x2d,0xff,0xf6,0x02,0x77,\r\n0x03,0xb6,0x02,0x26,0x00,0x4f,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0xee,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x0c,0x00,0x2d,0x40,0x2a,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x38,0x4d,0x06,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0c,\r\n0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x23,0x03,0x23,0x11,0x5c,0x5a,0x6c,0xa2,0x62,0xb5,0xbf,0x67,0xaa,0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0x86,0x01,0x51,0xfe,0xaf,0xff,0xff,0x00,0x5c,0xff,0x10,0x02,0x30,0x02,0xda,0x02,0x26,0x00,0x51,0x00,0x00,\r\n0x00,0x07,0x06,0xa0,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x05,0x00,0x1f,0x40,0x1c,0x00,0x00,0x00,0x38,0x4d,0x00,0x01,0x01,0x02,0x60,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x09,0x18,0x2b,0x33,0x11,0x33,0x11,0x21,0x15,0x82,0x5a,0x01,0x4a,0x02,\r\n0xda,0xfd,0x78,0x52,0xff,0xff,0x00,0x75,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x06,0x91,0x01,0xe5,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x53,0x00,0x00,0x00,0x07,0x06,0x6d,0x01,0xf9,0x00,0x00,0xff,0xff,0x00,0x82,0xff,0x10,0x02,0x26,0x02,0xda,0x02,0x26,\r\n0x00,0x53,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x80,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x53,0x00,0x00,0x01,0x07,0x03,0x29,0x00,0xa5,0x01,0x13,0x00,0x09,0xb1,0x01,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x2c,0x40,0x29,\r\n0x0a,0x09,0x08,0x07,0x04,0x03,0x02,0x01,0x08,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x01,0x01,0x02,0x60,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x15,0x15,0x04,0x09,0x18,0x2b,0x33,0x11,0x07,0x35,0x37,0x11,0x33,0x11,0x37,0x15,0x07,0x11,0x21,0x15,0x82,0x6e,0x6e,0x5a,0xaa,0xaa,0x01,0x4a,\r\n0x01,0x30,0x4a,0x50,0x4a,0x01,0x5a,0xfe,0xe3,0x73,0x50,0x73,0xfe,0xe5,0x52,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0xda,0x00,0x13,0x00,0x2e,0x40,0x2b,0x0f,0x0c,0x03,0x03,0x03,0x00,0x01,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x01,0x01,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,\r\n0x00,0x13,0x00,0x13,0x16,0x11,0x12,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x13,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x36,0x37,0x03,0x23,0x03,0x16,0x16,0x15,0x11,0x48,0x85,0x5d,0x61,0x85,0x57,0x03,0x06,0x04,0x76,0x4e,0x71,0x08,0x06,0x02,0xda,0xfe,0xc4,0x01,0x3c,0xfd,0x26,0x01,0x59,0x31,0x7f,0x82,0x34,0xfe,0x87,0x01,0x70,\r\n0x4a,0xb0,0x63,0xfe,0xa7,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x11,0x00,0x24,0x40,0x21,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x05,0x09,0x19,0x2b,0x33,0x11,0x33,0x13,0x2e,0x02,\r\n0x35,0x11,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x11,0x5a,0x78,0xdf,0x02,0x05,0x03,0x57,0x78,0xde,0x02,0x04,0x03,0x02,0xda,0xfd,0x8f,0x19,0x49,0x51,0x24,0x01,0x9a,0xfd,0x26,0x02,0x71,0x18,0x49,0x51,0x25,0xfe,0x66,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x91,\r\n0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x10,0x01,0xfe,0x02,0xda,0x02,0x26,0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x4c,0x01,0xfe,0x02,0xda,0x00,0x19,\r\n0x00,0x2f,0x40,0x2c,0x0f,0x06,0x05,0x03,0x01,0x02,0x01,0x4c,0x03,0x01,0x02,0x02,0x38,0x4d,0x00,0x01,0x01,0x39,0x4d,0x00,0x00,0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x3d,0x04,0x4e,0x00,0x00,0x00,0x19,0x00,0x18,0x16,0x11,0x18,0x21,0x06,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x03,0x1e,0x02,0x15,0x11,0x23,0x11,0x33,0x13,\r\n0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0xf0,0x41,0x35,0x3e,0xfc,0x02,0x04,0x03,0x57,0x78,0xdf,0x02,0x05,0x03,0x57,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x02,0x62,0x18,0x49,0x51,0x25,0xfe,0x66,0x02,0xda,0xfd,0xdb,0x19,0x49,0x52,0x24,0x01,0x4d,0xfd,0x35,0x58,0x6b,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb1,0x02,0x26,\r\n0x00,0x5a,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,\r\n0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x0a,0x72,0x6a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,\r\n0xc9,0x6a,0x72,0x51,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x67,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc0,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,\r\n0x00,0x27,0x06,0x9e,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x1c,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc1,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x26,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc2,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xfc,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0xc3,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x00,0x02,0xe4,0x02,0x26,0x00,0x60,0x00,0x00,\r\n0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xd4,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0xf6,0x02,0x12,\r\n0x03,0x2a,0x00,0x15,0x00,0x23,0x00,0x3e,0x40,0x3b,0x09,0x01,0x04,0x01,0x10,0x01,0x03,0x04,0x02,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x0d,0x0c,0x08,0x06,0x00,0x15,\r\n0x01,0x15,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x36,0x35,0x35,0x33,0x15,0x14,0x07,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x50,0x35,0x16,0x4b,0x30,0x1e,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x0a,\r\n0x72,0x6a,0x01,0x36,0x6a,0x72,0x26,0x07,0x1a,0x4b,0x50,0x3a,0x19,0x33,0x4b,0xfe,0xc9,0x6a,0x72,0x51,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb6,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x2b,0x02,0x12,\r\n0x03,0x2a,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb6,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x44,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xd4,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x4e,0x00,0x00,\r\n0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x12,0x03,0xb1,0x02,0x26,0x00,0x6d,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0x93,0x02,0x26,0x00,0x60,0x00,0x00,\r\n0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0xe4,0x00,0x1d,0x00,0x2b,0x00,0x64,0x4b,0xb0,0x15,0x50,0x58,0x40,0x21,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x03,0x03,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,\r\n0x1b,0x40,0x1e,0x00,0x03,0x06,0x01,0x00,0x03,0x00,0x63,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x17,0x1f,0x1e,0x01,0x00,0x26,0x24,0x1e,0x2b,0x1f,0x2b,0x1c,0x1a,0x0e,0x0c,0x07,0x05,0x00,0x1d,0x01,0x1d,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,\r\n0x34,0x37,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0x7b,0x37,0x43,0x38,0x0d,0x62,0x72,0x72,0x62,0x62,0x72,0x2b,0x27,0x1d,0x21,0x1a,0x1e,0x19,0x3c,0x9d,0x3b,0x3f,0x3f,\r\n0x3b,0x3a,0x40,0x40,0xcb,0x35,0x28,0x2e,0x36,0x70,0x62,0x01,0x4a,0x62,0x70,0x6f,0x62,0xfe,0xb5,0x3b,0x5a,0x1a,0x18,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x01,0x12,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x00,0x00,0x03,0x00,0x23,0xff,0xd8,0x02,0x35,0x02,0xee,0x00,0x15,0x00,0x1c,0x00,0x23,0x00,0x75,0x40,0x13,\r\n0x09,0x01,0x04,0x00,0x22,0x21,0x18,0x17,0x0c,0x01,0x06,0x05,0x04,0x14,0x01,0x02,0x05,0x03,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x01,0x01,0x00,0x00,0x3e,0x4d,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x1b,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x06,\r\n0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3e,0x4d,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x59,0x40,0x14,0x1e,0x1d,0x00,0x00,0x1d,0x23,0x1e,0x23,0x1b,0x19,0x00,0x15,0x00,0x15,0x26,0x12,0x26,0x08,0x09,0x19,0x2b,0x17,0x37,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x17,0x37,0x33,0x07,\r\n0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x27,0x07,0x13,0x11,0x13,0x26,0x23,0x22,0x06,0x13,0x32,0x36,0x35,0x11,0x03,0x16,0x23,0x4c,0x17,0x72,0x62,0x5c,0x38,0x21,0x54,0x46,0x11,0x72,0x62,0x55,0x37,0x29,0x3b,0xe0,0x1f,0x47,0x3a,0x40,0x7a,0x3b,0x3f,0xda,0x20,0x28,0x86,0x2d,0x3d,0x01,0x4a,0x62,0x70,0x31,0x3b,0x7d,0x29,0x35,0xfe,\r\n0xb5,0x62,0x70,0x2b,0x49,0x02,0x3a,0xfe,0xc3,0x01,0x8d,0x31,0x43,0xfd,0xf7,0x43,0x3e,0x01,0x29,0xfe,0x7e,0x28,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0xd8,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0x76,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,\r\n0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x28,0xff,0xf6,0x02,0x3f,0x02,0xe4,0x00,0x1d,0x00,0x2b,0x00,0xe3,0x4b,0xb0,0x15,0x50,0x58,0x40,0x0a,0x0b,0x01,0x03,0x01,0x19,0x01,0x00,0x06,0x02,0x4c,0x1b,0x40,0x0a,0x0b,0x01,0x03,0x09,0x19,0x01,0x08,0x06,0x02,0x4c,0x59,0x4b,0xb0,0x15,0x50,0x58,0x40,0x23,0x00,0x04,\r\n0x00,0x05,0x06,0x04,0x05,0x67,0x09,0x01,0x03,0x03,0x01,0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x0b,0x08,0x02,0x06,0x06,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x38,0x00,0x04,0x00,0x05,0x06,0x04,0x05,0x67,0x00,0x09,0x09,0x01,0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x00,0x03,0x03,0x01,\r\n0x61,0x02,0x01,0x01,0x01,0x3e,0x4d,0x00,0x06,0x06,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x33,0x00,0x04,0x00,0x05,0x06,0x04,0x05,0x67,0x00,0x09,0x09,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,\r\n0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x1f,0x1f,0x1e,0x01,0x00,0x26,0x24,0x1e,0x2b,0x1f,0x2b,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1d,0x01,0x1d,0x0c,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x11,\r\n0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x33,0x35,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x21,0x35,0x23,0x0e,0x02,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0xc3,0x48,0x53,0x53,0x48,0x23,0x2e,0x1a,0x03,0x05,0x01,0x09,0xb1,0x98,0x98,0xb1,0xfe,0xf7,0x05,0x03,0x1a,0x2e,0x0a,0x2a,0x30,0x30,\r\n0x2a,0x2a,0x30,0x30,0x0a,0x66,0x58,0x01,0x72,0x58,0x66,0x1d,0x29,0x14,0x50,0x52,0xe6,0x52,0xfe,0x52,0x50,0x13,0x2a,0x1d,0x50,0x3b,0x33,0x01,0x72,0x33,0x3b,0x3b,0x33,0xfe,0x8e,0x33,0x3b,0x00,0x00,0x00,0x00,0x02,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2b,0x40,0x28,0x00,0x03,0x00,0x01,0x02,0x03,\r\n0x01,0x67,0x00,0x04,0x04,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x0a,0x24,0x21,0x06,0x09,0x18,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5c,0xeb,0x66,0x79,0x79,0x66,0x91,0x91,0x3b,\r\n0x47,0x47,0x3b,0x91,0x02,0xda,0x75,0x62,0x62,0x75,0xfe,0xd4,0x01,0x7d,0x49,0x3d,0x3e,0x48,0x00,0x00,0x00,0x02,0x00,0x5a,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x2f,0x40,0x2c,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x67,0x00,0x04,0x00,0x02,0x03,0x04,0x02,0x67,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x03,0x03,0x39,\r\n0x03,0x4e,0x00,0x00,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0d,0x25,0x21,0x11,0x07,0x09,0x19,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5a,0x5a,0x99,0x42,0x61,0x36,0x76,0x63,0x99,0x99,0x3a,0x42,0x43,0x39,0x99,0x02,0xda,0x96,0x32,0x5a,0x3c,0x5b,\r\n0x6d,0xb4,0x01,0x04,0x41,0x37,0x38,0x40,0x00,0x02,0x00,0x50,0xff,0x4c,0x02,0x0e,0x02,0xe4,0x00,0x13,0x00,0x21,0x00,0x38,0x40,0x35,0x12,0x01,0x00,0x03,0x01,0x4c,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x05,0x01,0x02,0x02,0x3d,0x02,0x4e,0x15,0x14,0x00,0x00,\r\n0x1c,0x1a,0x14,0x21,0x15,0x21,0x00,0x13,0x00,0x13,0x25,0x23,0x07,0x09,0x18,0x2b,0x05,0x27,0x22,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x17,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x01,0xa6,0x67,0x04,0x0a,0x05,0x65,0x77,0x77,0x65,0x65,0x77,0x3a,0x35,\r\n0x75,0xe2,0x3b,0x47,0x47,0x3b,0x3b,0x47,0x47,0xb4,0xab,0x01,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x43,0x64,0x19,0xc1,0xfa,0x4a,0x3d,0x01,0x40,0x3e,0x49,0x49,0x3e,0xfe,0xc0,0x3d,0x4a,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x02,0x21,0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x33,0x40,0x30,0x09,0x01,0x02,0x04,0x01,0x4c,\r\n0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x03,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x17,0x15,0x11,0x0f,0x00,0x0e,0x00,0x0e,0x11,0x17,0x21,0x07,0x09,0x19,0x2b,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x13,0x23,0x03,0x23,0x11,0x11,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x23,0x5d,0xe1,0x41,0x62,0x36,0x4c,0x3f,0x95,0x63,0x8f,0x79,0x88,0x38,0x44,0x44,0x38,0x88,0x02,0xda,0x35,0x5e,0x3f,0x4a,0x6a,0x15,0xfe,0xc1,0x01,0x36,0xfe,0xca,0x01,0x87,0x47,0x3a,0x3b,0x46,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,\r\n0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5d,0xff,0x10,0x02,0x21,0x02,0xda,0x02,0x26,0x00,0x7d,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0xf6,0x02,0x10,0x02,0xe4,0x00,0x29,0x00,0x3b,0x40,0x38,\r\n0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3e,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1c,0x1a,0x19,0x16,0x14,0x08,0x06,0x04,0x03,0x00,0x29,0x01,0x29,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x01,0x30,0x6a,0x7e,0x5a,0x4e,0x40,0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x34,0x5e,0x3d,0x3e,0x5f,0x36,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,\r\n0x51,0x7a,0x0a,0x70,0x62,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x3a,0x58,0x31,0x31,0x57,0x39,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x60,0x72,0x00,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x48,\r\n0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0x35,0x02,0x10,0x02,0xe4,0x00,0x3d,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x03,0x36,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,\r\n0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3e,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,\r\n0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3e,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x3d,0x00,0x3c,0x1b,0x22,0x13,0x2c,0x22,0x14,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,\r\n0x37,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xcd,0x46,0x16,0x1b,0x37,0x32,0x18,0x4f,0x5c,0x5a,0x4e,0x40,\r\n0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x34,0x5e,0x3d,0x3e,0x5f,0x36,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,0x51,0x7a,0x66,0x03,0x02,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x40,0x0f,0x6b,0x53,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x3a,0x58,0x31,0x31,0x57,0x39,0x32,0x3f,0x3f,0x32,\r\n0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x60,0x72,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x48,0xff,0x10,0x02,0x10,0x02,0xe4,0x02,0x26,0x00,0x81,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,\r\n0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x20,0x00,0x38,0x40,0x35,0x1a,0x07,0x02,0x01,0x05,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x61,0x07,0x06,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x20,0x00,0x20,0x22,0x24,0x21,0x25,\r\n0x12,0x24,0x08,0x09,0x1c,0x2b,0x33,0x11,0x34,0x36,0x36,0x33,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x22,0x06,0x15,0x11,0x5c,0x34,0x5f,0x3f,0xe3,0xa2,0x4e,0x5f,0x36,0x60,0x41,0x43,0x39,0x3c,0x46,0x46,0x3c,0x2d,0xa4,0x84,0x37,0x41,0x02,0x0c,0x3e,\r\n0x5d,0x33,0x58,0xdb,0x05,0x70,0x5b,0x40,0x61,0x36,0x52,0x48,0x3d,0x3c,0x46,0x4e,0xe1,0x42,0x3a,0xfd,0xf4,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x16,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,0x02,0x04,0x61,0x00,\r\n0x04,0x04,0x3e,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x11,0x0f,0x0d,0x0c,0x0a,0x08,0x05,0x04,0x00,0x16,0x01,0x16,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11,\r\n0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x61,0x71,0x01,0x4a,0x3d,0x3b,0x3a,0x3e,0x5a,0x70,0x62,0x64,0x6e,0x70,0x62,0x3e,0x3a,0xf0,0x3b,0x0a,0x73,0x5f,0xc8,0x83,0x3e,0x43,0x44,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x5f,0x73,0x4b,0x46,0x41,0x82,0x82,0x41,0x46,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x21,\r\n0x02,0xda,0x00,0x07,0x00,0x21,0x40,0x1e,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xc8,0x01,0xea,0xc8,0x02,0x88,0x52,0x52,0xfd,0x78,0x00,0x00,0x00,0x01,0x00,0x37,\r\n0x00,0x00,0x02,0x21,0x02,0xda,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x05,0x01,0x01,0x06,0x01,0x00,0x07,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x23,\r\n0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0xff,0x91,0x91,0xc8,0x01,0xea,0xc8,0x91,0x91,0x01,0x27,0x4b,0x01,0x16,0x52,0x52,0xfe,0xea,0x4b,0xfe,0xd9,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x03,0xb6,0x02,0x26,0x00,0x89,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0x35,0x02,0x21,\r\n0x02,0xda,0x00,0x19,0x00,0x6f,0x40,0x0b,0x08,0x01,0x05,0x06,0x01,0x4c,0x07,0x01,0x06,0x01,0x4b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x24,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x4d,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,\r\n0x21,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x00,0x04,0x00,0x03,0x04,0x03,0x63,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x59,0x40,0x0f,0x00,0x00,0x00,0x19,0x00,0x19,0x14,0x21,0x28,0x11,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x07,0x1e,0x02,\r\n0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0xff,0xc8,0x01,0xea,0xc8,0x0c,0x1a,0x38,0x26,0x42,0x36,0x55,0x46,0x16,0x1b,0x37,0x32,0x19,0x02,0x88,0x52,0x52,0xfd,0x78,0x23,0x03,0x14,0x24,0x1a,0x22,0x31,0x37,0x17,0x0d,0x11,0x1a,0x45,0x00,0xff,0xff,0x00,0x37,0xff,0x10,0x02,0x21,0x02,0xda,0x02,0x26,\r\n0x00,0x89,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x11,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x05,0x09,0x16,0x2b,0x05,0x22,\r\n0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x2c,0x66,0x6c,0x5a,0x3b,0x3d,0x3c,0x3c,0x5a,0x6b,0x0a,0x71,0x61,0x02,0x12,0xfd,0xee,0x3c,0x46,0x46,0x3c,0x02,0x12,0xfd,0xee,0x62,0x70,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x91,\r\n0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb1,0x02,0x26,\r\n0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x01,0xfe,0x02,0xda,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,\r\n0xff,0xf6,0x01,0xfe,0x03,0xd4,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0x48,0x00,0x1a,0x00,0x31,0x40,0x2e,0x17,0x01,0x02,0x01,0x01,0x4c,0x00,0x04,0x01,0x04,0x85,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,\r\n0x4e,0x01,0x00,0x13,0x12,0x0f,0x0d,0x0a,0x08,0x05,0x04,0x00,0x1a,0x01,0x1a,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x11,0x14,0x06,0x01,0x2c,0x66,0x6c,0x5a,0x3b,0x3d,0x3c,0x3c,0x41,0x10,0x13,0x4b,0x2e,0x27,0x6b,0x0a,0x71,\r\n0x61,0x02,0x12,0xfd,0xee,0x3c,0x46,0x46,0x3c,0x02,0x12,0x13,0x10,0x4b,0x50,0x27,0x31,0x06,0xfe,0x2e,0x62,0x70,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xb6,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x53,0x03,0x48,0x02,0x26,0x00,0x96,0x00,0x00,\r\n0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xb6,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,0x03,0xd4,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x53,\r\n0x03,0xb1,0x02,0x26,0x00,0x96,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0xb6,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x93,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,\r\n0x00,0x01,0x00,0x5a,0xff,0x35,0x01,0xfe,0x02,0xda,0x00,0x20,0x00,0x56,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x19,0x00,0x05,0x06,0x01,0x00,0x05,0x00,0x63,0x04,0x01,0x02,0x02,\r\n0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x13,0x01,0x00,0x1f,0x1d,0x14,0x13,0x10,0x0e,0x0b,0x0a,0x07,0x05,0x00,0x20,0x01,0x20,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x37,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x07,0x07,0x06,0x06,0x15,\r\n0x14,0x16,0x33,0x33,0x15,0x01,0x7b,0x37,0x43,0x38,0x0d,0x62,0x70,0x5a,0x3e,0x3a,0x3b,0x3d,0x5a,0x50,0x1d,0x21,0x1a,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x2e,0x36,0x70,0x62,0x02,0x12,0xfd,0xee,0x3e,0x43,0x43,0x3e,0x02,0x12,0xfd,0xee,0x79,0x36,0x18,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,\r\n0x03,0xe2,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x96,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xb1,0x02,0x26,0x00,0x8e,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x21,0x40,0x1e,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,\r\n0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xee,0xbc,0x5c,0x7d,0x0d,0x11,0x04,0x04,0x13,0x0d,0x78,0x5d,0xbd,0x02,0xda,0xfe,0x0f,0x34,0x58,0x17,0x17,0x59,0x34,0x01,0xf0,0xfd,0x26,0x00,\r\n0x00,0x01,0x00,0x14,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x1e,0x00,0x26,0x40,0x23,0x1a,0x06,0x02,0x03,0x00,0x01,0x4c,0x02,0x01,0x02,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x1e,0x00,0x1e,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,\r\n0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x6b,0x57,0x53,0x39,0x04,0x04,0x01,0x02,0x07,0x04,0x48,0x61,0x42,0x04,0x08,0x02,0x02,0x05,0x04,0x3b,0x4f,0x59,0x71,0x42,0x04,0x04,0x02,0x02,0x04,0x05,0x47,0x02,0xda,0xfd,0xe4,0x21,0x47,0x15,0x15,0x47,0x21,0x02,0x1c,0xfd,0xe4,\r\n0x21,0x47,0x15,0x15,0x47,0x21,0x02,0x1c,0xfd,0x26,0x02,0x26,0x22,0x41,0x12,0x12,0x41,0x22,0xfd,0xda,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x93,\r\n0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb1,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0xb6,0x02,0x26,0x00,0xa2,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0x00,0x01,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x17,\r\n0x00,0x26,0x40,0x23,0x13,0x0d,0x07,0x01,0x04,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x18,0x12,0x05,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x13,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,\r\n0x28,0xd2,0xc7,0x68,0x71,0x09,0x13,0x06,0x05,0x13,0x09,0x73,0x63,0xc7,0xd2,0x67,0x7d,0x09,0x13,0x05,0x05,0x13,0x09,0x7e,0x01,0x72,0x01,0x68,0xd8,0x11,0x27,0x0b,0x0b,0x27,0x11,0xd8,0xfe,0x9e,0xfe,0x88,0xe8,0x11,0x27,0x0c,0x0c,0x26,0x11,0xe9,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x0e,0x00,0x23,0x40,0x20,\r\n0x0d,0x07,0x01,0x03,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x18,0x12,0x04,0x09,0x18,0x2b,0x33,0x11,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x11,0xff,0xdc,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xdc,0x01,0x11,0x01,\r\n0xc9,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x37,0xfe,0xef,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb1,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x2b,0x02,0x35,0x02,0xda,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x9e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb6,0x02,0x26,0x00,0xa8,0x00,0x00,\r\n0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xd4,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x99,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0x93,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,\r\n0x03,0xb1,0x02,0x26,0x00,0xa8,0x00,0x00,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xda,0x00,0x09,0x00,0x2c,0x40,0x29,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,\r\n0x09,0x00,0x09,0x12,0x11,0x12,0x05,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x55,0x01,0x49,0xfe,0xbc,0x01,0x9f,0xfe,0xb7,0x01,0x53,0x5a,0x02,0x2e,0x52,0x5a,0xfd,0xd2,0x52,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb6,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,\r\n0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb6,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x03,0xb0,0x02,0x26,0x00,0xb1,0x00,0x00,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x19,0x00,0x00,0x02,0x3f,0x02,0xda,0x00,0x18,0x00,0x2d,0x40,0x2a,\r\n0x17,0x06,0x02,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x02,0x01,0x00,0x00,0x38,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,\r\n0x03,0x23,0x03,0x03,0x62,0x49,0x53,0x30,0x03,0x03,0x01,0x02,0x04,0x07,0x4c,0x66,0x45,0x06,0x07,0x01,0x01,0x05,0x03,0x32,0x4f,0x4b,0x73,0x53,0x59,0x02,0xda,0xfd,0xe4,0x21,0x3d,0x15,0x15,0x3c,0x22,0x01,0x90,0xfe,0x70,0x22,0x3c,0x15,0x15,0x3d,0x21,0x02,0x1c,0xfd,0x26,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x00,0xff,0xff,0x00,0x19,\r\n0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x93,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb1,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x8e,\r\n0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x19,0x00,0x00,0x02,0x3f,0x03,0xb6,0x02,0x26,0x00,0xb5,0x00,0x00,0x00,0x07,0x06,0x90,0x02,0x4e,0x00,0x00,0x00,0x02,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x38,0x4d,0x05,0x03,0x04,0x03,0x01,\r\n0x01,0x39,0x01,0x4e,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x11,0x33,0x11,0x01,0xbf,0xf9,0xf9,0x67,0xf0,0xfa,0xfe,0x2d,0x5a,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0x84,0x02,0xda,0xfd,0x26,0x00,0xff,0xff,0x00,0x5d,0xff,0x10,0x02,0x30,\r\n0x02,0xda,0x02,0x26,0x00,0xba,0x00,0x00,0x00,0x07,0x06,0xa0,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x4c,0x02,0x00,0x02,0xe4,0x00,0x18,0x00,0x26,0x00,0x3e,0x40,0x3b,0x12,0x04,0x02,0x02,0x03,0x01,0x4c,0x06,0x01,0x03,0x04,0x02,0x04,0x03,0x02,0x80,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x02,0x02,0x00,\r\n0x60,0x05,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1a,0x19,0x01,0x00,0x21,0x1f,0x19,0x26,0x1a,0x26,0x17,0x15,0x0c,0x0a,0x00,0x18,0x01,0x18,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x15,0x14,0x16,0x33,0x33,0x15,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x11,0x14,0x16,0x01,0x8b,0x44,0x52,0x4a,0x53,0x72,0x62,0x62,0x72,0x5e,0x53,0x21,0x1b,0x6e,0xcd,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0xb4,0x4f,0x42,0x1e,0x0f,0x6e,0x5a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,0xc9,0x60,0x70,0x0a,0x1b,0x1c,0x23,0x52,0xfb,0x43,0x3e,0x01,0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0x00,\r\n0x00,0x02,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0x30,0x00,0x1b,0x00,0x26,0x00,0x84,0xb5,0x18,0x01,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x28,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x05,0x08,\r\n0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x05,0x05,0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1b,0x1d,0x1c,0x01,0x00,0x22,0x20,0x1c,0x26,\r\n0x1d,0x26,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x0a,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x35,0x34,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xfc,0x55,0x64,0x2e,0x52,\r\n0x35,0xaa,0x75,0x34,0x40,0x02,0x5a,0x05,0x6f,0x5c,0x64,0x6b,0x59,0x02,0x08,0x56,0x31,0x42,0x4e,0xa0,0x2c,0x37,0x3d,0x0a,0x5f,0x4d,0x33,0x4c,0x2b,0x2b,0x6b,0x26,0x22,0x41,0x55,0x60,0x56,0xfe,0x86,0x64,0x33,0x3b,0x4c,0x40,0x37,0x4d,0x35,0x2c,0x2e,0x35,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,\r\n0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x7a,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb4,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,\r\n0xff,0x2b,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x5d,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x7a,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb5,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0xa2,0x02,0x26,\r\n0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb6,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0xa0,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb7,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,\r\n0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x76,0x03,0x84,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0x2b,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x27,0x06,0x78,\r\n0x02,0x5d,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x26,0x03,0x84,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xb9,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x02,0x2b,0x03,0xa2,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xba,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,\r\n0xff,0xf6,0x01,0xfc,0x03,0xa0,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x09,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0x2b,0x01,0xfc,0x02,0x30,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x78,\r\n0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x11,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x53,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x39,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0xe9,0x02,0x26,\r\n0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x43,0xff,0x35,0x02,0x31,0x02,0x30,0x00,0x2b,0x00,0x36,0x00,0xea,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0a,0x28,0x01,0x08,0x09,0x16,0x01,0x00,0x08,0x02,0x4c,0x1b,0x40,0x0b,0x28,0x01,0x08,0x09,0x01,0x4c,0x16,0x01,0x07,0x01,0x4b,0x59,0x4b,0xb0,0x15,0x50,\r\n0x58,0x40,0x32,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x4d,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3d,0x06,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2f,0x00,0x03,0x02,\r\n0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x67,0x00,\r\n0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x1f,0x2d,0x2c,0x01,0x00,0x32,0x30,0x2c,0x36,0x2d,0x36,0x27,0x26,0x21,0x1f,0x1e,0x1c,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x08,0x06,0x00,0x2b,\r\n0x01,0x2b,0x0c,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x35,0x34,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x33,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xfc,0x55,0x64,\r\n0x2e,0x52,0x35,0xaa,0x75,0x34,0x40,0x02,0x5a,0x05,0x6f,0x5c,0x64,0x6b,0x02,0x22,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x0d,0x02,0x08,0x56,0x31,0x42,0x4e,0xa0,0x2c,0x37,0x3d,0x0a,0x5f,0x4d,0x33,0x4c,0x2b,0x2b,0x6b,0x26,0x22,0x41,0x55,0x60,0x56,0xfe,0x86,0x1c,0x2c,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x64,\r\n0x33,0x3b,0x4c,0x40,0x37,0x4d,0x35,0x2c,0x2e,0x35,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x44,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x71,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x03,0x0c,0x02,0x26,0x00,0xbd,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x5d,0x00,0x00,0x00,0x03,0x00,0x1f,\r\n0xff,0xf6,0x02,0x35,0x02,0x30,0x00,0x2d,0x00,0x36,0x00,0x41,0x00,0xa9,0x40,0x0a,0x15,0x01,0x03,0x02,0x2b,0x01,0x07,0x08,0x02,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x72,0x00,0x08,0x06,0x07,0x07,0x08,0x72,0x0a,0x01,0x01,0x0d,0x01,0x06,0x08,0x01,0x06,0x67,0x0b,0x01,0x02,0x02,0x04,0x61,0x05,\r\n0x01,0x04,0x04,0x41,0x4d,0x0f,0x0c,0x02,0x07,0x07,0x00,0x62,0x09,0x0e,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x35,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x0a,0x01,0x01,0x0d,0x01,0x06,0x08,0x01,0x06,0x67,0x0b,0x01,0x02,0x02,0x04,0x61,0x05,0x01,0x04,0x04,0x41,0x4d,0x0f,0x0c,0x02,\r\n0x07,0x07,0x00,0x62,0x09,0x0e,0x02,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x27,0x38,0x37,0x01,0x00,0x3d,0x3b,0x37,0x41,0x38,0x41,0x34,0x32,0x2f,0x2e,0x29,0x27,0x25,0x24,0x22,0x20,0x1d,0x1c,0x19,0x17,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x2d,0x01,0x2d,0x10,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x13,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x03,0x32,0x36,0x35,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0xb2,0x41,0x52,0x54,0x43,0x51,0x24,\r\n0x20,0x1f,0x26,0x4f,0x4b,0x3c,0x31,0x44,0x05,0x05,0x41,0x2e,0x41,0x50,0xde,0x25,0x20,0x20,0x25,0x54,0x50,0x41,0x2b,0x41,0x08,0x08,0x46,0x75,0x8a,0x25,0x20,0x1f,0x26,0x98,0x21,0x27,0x4f,0x1f,0x26,0x29,0x0a,0x5e,0x4b,0x4a,0x5b,0x4b,0x29,0x2d,0x27,0x20,0x41,0x51,0x31,0x28,0x28,0x31,0x59,0x47,0x90,0x6a,0x28,0x2d,0x28,0x20,\r\n0x41,0x52,0x32,0x28,0x28,0x32,0x01,0x4e,0x4c,0x27,0x2e,0x2e,0x27,0xfe,0xb1,0x2e,0x27,0x6a,0x34,0x2c,0x2b,0x34,0x00,0x00,0xff,0xff,0x00,0x1f,0xff,0xf6,0x02,0x35,0x03,0x11,0x02,0x26,0x00,0xd4,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0x00,0x02,0x00,0x5c,0xff,0xf6,0x02,0x01,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6b,\r\n0xb6,0x0a,0x03,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x01,0x06,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x01,\r\n0x01,0x39,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x17,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x0f,0x0d,0x08,0x07,0x06,0x05,0x00,0x14,0x01,0x14,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x23,0x15,0x23,0x11,0x33,0x15,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,\r\n0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x4c,0x3e,0x50,0x07,0x01,0x5a,0x5a,0x02,0x01,0x08,0x51,0x3e,0x53,0x62,0x62,0x71,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0x0a,0x3d,0x36,0x69,0x02,0xda,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5e,0x6e,0x4e,0x3c,0x43,0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,\r\n0x00,0x01,0x00,0x58,0xff,0xf6,0x02,0x0b,0x02,0x30,0x00,0x1b,0x00,0x3b,0x40,0x38,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x19,0x18,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,\r\n0x06,0x00,0x1b,0x01,0x1b,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x34,0x64,0x78,0x78,0x64,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x0a,0x70,0x62,0x96,\r\n0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x58,0x66,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x6a,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x60,0x00,0x00,\r\n0x00,0x01,0x00,0x58,0xff,0x35,0x02,0x0b,0x02,0x30,0x00,0x2f,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x05,0x28,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x41,\r\n0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x03,0x04,0x06,0x04,0x03,0x06,0x80,0x00,0x06,0x05,0x04,0x06,0x05,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x04,0x04,0x02,0x61,0x00,0x02,\r\n0x02,0x41,0x4d,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,0x2f,0x00,0x2e,0x12,0x12,0x25,0x22,0x12,0x27,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,\r\n0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd1,0x46,0x16,0x1b,0x37,0x32,0x18,0x49,0x56,0x78,0x64,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x5f,0x03,0x02,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x41,0x10,0x6a,\r\n0x52,0x96,0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x58,0x66,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x11,0x02,0x26,0x00,0xd7,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x60,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x03,0x09,0x02,0x26,0x00,0xd7,0x00,0x00,\r\n0x00,0x07,0x06,0x69,0x02,0x60,0x00,0x00,0x00,0x02,0x00,0x57,0xff,0xf6,0x01,0xfc,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6b,0xb6,0x11,0x0a,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x03,0x06,0x02,0x00,\r\n0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x39,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x17,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x14,0x01,0x14,0x08,\r\n0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x63,0x62,0x53,0x3e,0x51,0x08,0x01,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x40,0x40,0x0a,0x6e,\r\n0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xfd,0x26,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,0x3b,0x44,0xa0,0x43,0x3c,0x00,0x02,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0xdf,0x00,0x20,0x00,0x2c,0x00,0x4c,0x40,0x49,0x19,0x18,0x16,0x13,0x12,0x11,0x10,0x07,0x01,0x03,0x01,0x4c,0x17,0x01,0x03,0x4a,0x00,0x02,0x01,0x05,0x01,0x02,\r\n0x05,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x6a,0x00,0x03,0x03,0x38,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x22,0x21,0x01,0x00,0x28,0x26,0x21,0x2c,0x22,0x2c,0x15,0x14,0x0c,0x0b,0x09,0x07,0x00,0x20,0x01,0x20,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,\r\n0x33,0x26,0x26,0x27,0x27,0x07,0x35,0x37,0x27,0x33,0x17,0x37,0x15,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2b,0x44,0x68,0x39,0x35,0x5f,0x3f,0x2c,0x3b,0x0b,0x0e,0x04,0x20,0x1c,0x41,0xa3,0x78,0x48,0x68,0x2c,0x94,0x6a,0x4e,0x2c,0x35,0x3a,0x67,0x46,0x40,0x4d,\r\n0x4d,0x40,0x3e,0x4d,0x4d,0x0a,0x38,0x66,0x43,0x43,0x63,0x37,0x26,0x12,0x0a,0x35,0x25,0x5b,0x4c,0x50,0x38,0x63,0x40,0x45,0x50,0x31,0x71,0x40,0x8e,0x40,0x46,0x69,0x3a,0x50,0x50,0x41,0x41,0x50,0x50,0x41,0x41,0x50,0x00,0x00,0x00,0x03,0x00,0x3f,0xff,0xf6,0x02,0x5c,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x26,0x00,0x81,0xb6,0x11,\r\n0x0a,0x02,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x09,0x01,0x05,0x05,0x02,0x5f,0x04,0x01,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x0a,0x01,0x06,0x06,0x00,0x61,0x03,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x28,0x09,0x01,0x05,0x05,0x02,0x5f,0x04,0x01,0x02,0x02,0x38,0x4d,\r\n0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x39,0x4d,0x0a,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1f,0x1a,0x19,0x15,0x15,0x01,0x00,0x21,0x1f,0x19,0x26,0x1a,0x26,0x15,0x18,0x15,0x18,0x17,0x16,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x14,0x01,0x14,0x0b,0x09,0x16,0x2b,0x17,\r\n0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x13,0x37,0x33,0x07,0x01,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xe4,0x4c,0x59,0x59,0x4c,0x39,0x47,0x06,0x03,0x02,0x5a,0x5a,0x01,0x06,0x47,0xdc,0x0f,0x54,0x18,0xfe,0xbe,0x32,0x37,0x37,0x32,0x31,\r\n0x38,0x38,0x0a,0x6c,0x5b,0xab,0x5c,0x6c,0x3e,0x35,0x7d,0xa0,0xfd,0x26,0x69,0x35,0x3e,0x02,0x30,0xb4,0xb4,0xfe,0x1e,0x43,0x3c,0xa0,0x3c,0x43,0x43,0x3c,0xa0,0x3c,0x43,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x02,0x58,0x02,0xda,0x00,0x1c,0x00,0x2a,0x00,0x83,0xb6,0x19,0x0a,0x02,0x08,0x09,0x01,0x4c,0x4b,0xb0,0x18,0x50,\r\n0x58,0x40,0x25,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x00,0x04,0x04,0x38,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x07,0x0a,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x29,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x00,0x04,0x04,\r\n0x38,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0b,0x01,0x08,0x08,0x00,0x61,0x0a,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1f,0x1e,0x1d,0x01,0x00,0x25,0x23,0x1d,0x2a,0x1e,0x2a,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1c,0x01,0x1c,0x0c,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x17,0x33,0x27,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x60,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0xa6,0xa6,0x5a,0x5e,0x5e,0x5a,0x01,0x07,0x4e,0x20,0x38,0x3e,0x3e,0x38,0x39,0x3d,0x3d,0x0a,0x6e,\r\n0x5e,0x65,0x5f,0x6e,0x3e,0x35,0x7d,0x3c,0x4b,0x55,0x55,0x4b,0xfd,0xc6,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x5a,0x3e,0x46,0x44,0x40,0x5a,0x40,0x44,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x00,0x17,0x00,0x20,0x00,0x3e,0x40,0x3b,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x06,\r\n0x06,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1c,0x19,0x18,0x15,0x14,0x12,0x10,0x0d,0x0c,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,\r\n0x06,0x06,0x03,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x2c,0x61,0x77,0x77,0x61,0x41,0x61,0x36,0xfe,0xa8,0x46,0x3a,0x32,0x41,0x07,0x5a,0x09,0x74,0xd7,0x01,0x00,0x43,0x3d,0x3d,0x43,0x0a,0x75,0x67,0x82,0x67,0x75,0x34,0x5e,0x40,0x62,0x34,0x3d,0x47,0x27,0x21,0x45,0x51,0x01,0x4c,0x1c,0x41,0x47,0x47,0x41,0x00,0x00,0x00,\r\n0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,\r\n0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x71,0x03,0x84,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,\r\n0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x21,0x03,0x84,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xb9,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x26,0x03,0xa2,0x02,0x26,0x00,0xe1,0x00,0x00,\r\n0x00,0x07,0x06,0xba,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0xa0,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x09,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,\r\n0x03,0x09,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x02,0x30,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x11,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,\r\n0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x39,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0xe9,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0x30,0x00,0x25,0x00,0x2e,0x00,0x84,\r\n0x4b,0xb0,0x15,0x50,0x58,0x40,0x30,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x07,0x00,0x03,0x05,0x07,0x03,0x67,0x00,0x08,0x08,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x06,0x06,0x00,0x60,0x09,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x2d,0x00,0x05,0x03,0x04,0x03,0x05,\r\n0x04,0x80,0x00,0x07,0x00,0x03,0x05,0x07,0x03,0x67,0x00,0x06,0x09,0x01,0x00,0x06,0x00,0x64,0x00,0x08,0x08,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x19,0x01,0x00,0x2c,0x2a,0x27,0x26,0x24,0x22,0x19,0x18,0x17,0x15,0x12,0x11,0x0e,0x0c,0x07,0x05,0x00,0x25,0x01,0x25,\r\n0x0a,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x37,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x14,0x16,0x33,0x32,0x37,0x33,0x06,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x01,0x75,0x37,0x43,0x3b,0x0a,0x61,0x73,0x73,0x61,0x62,0x72,0xfe,\r\n0xb0,0x3f,0x3d,0x69,0x0f,0x5a,0x05,0x32,0x27,0x10,0x22,0x1e,0x1e,0x19,0x3c,0xfe,0xed,0xf8,0x3e,0x3e,0x3d,0x3f,0xcb,0x35,0x28,0x2f,0x35,0x73,0x5f,0x96,0x5f,0x73,0x73,0x5f,0x61,0x35,0x41,0x45,0x4a,0x2b,0x40,0x13,0x0d,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x02,0x0c,0x1d,0x41,0x46,0x46,0x41,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,\r\n0x03,0x0c,0x02,0x26,0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x30,0x00,0x15,0x00,0x1e,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x08,0x01,0x05,0x05,\r\n0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1b,0x1a,0x16,0x1e,0x17,0x1e,0x10,0x0e,0x0c,0x0b,0x0a,0x08,0x05,0x04,0x00,0x15,0x01,0x15,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,\r\n0x14,0x16,0x01,0x2c,0x61,0x71,0x01,0x4c,0x3c,0x3e,0x67,0x0f,0x5a,0x09,0x70,0x57,0x62,0x70,0x70,0x62,0x3e,0x3c,0xf4,0x3d,0x0a,0x73,0x5f,0x61,0x35,0x41,0x45,0x4a,0x45,0x51,0x73,0x5f,0x96,0x5f,0x73,0x4b,0x46,0x41,0x1d,0x1d,0x41,0x46,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x12,0x00,0x2d,0x40,0x2a,\r\n0x04,0x01,0x01,0x05,0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x12,0x21,0x23,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0xd7,0xa0,\r\n0xa0,0x52,0x48,0xa1,0xa1,0x40,0xe1,0xe1,0x01,0x89,0x52,0x73,0x41,0x4b,0x52,0x3a,0x73,0x52,0xfe,0x77,0x00,0x02,0x00,0x58,0xff,0x4c,0x01,0xfb,0x02,0x30,0x00,0x1c,0x00,0x2a,0x00,0x6f,0xb6,0x15,0x07,0x02,0x05,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x20,0x08,0x01,0x05,0x00,0x01,0x00,0x05,0x01,0x69,0x00,0x06,0x06,0x02,\r\n0x61,0x03,0x01,0x02,0x02,0x41,0x4d,0x00,0x00,0x00,0x04,0x5f,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x1b,0x40,0x24,0x08,0x01,0x05,0x00,0x01,0x00,0x05,0x01,0x69,0x00,0x03,0x03,0x3b,0x4d,0x00,0x06,0x06,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x00,0x00,0x04,0x5f,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x59,0x40,0x15,0x1e,0x1d,0x00,\r\n0x00,0x25,0x23,0x1d,0x2a,0x1e,0x2a,0x00,0x1c,0x00,0x1b,0x14,0x25,0x27,0x21,0x09,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x35,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x33,0x11,0x14,0x06,0x23,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xa1,0x9b,\r\n0x2f,0x36,0x02,0x03,0x08,0x4e,0x3b,0x55,0x62,0x62,0x55,0x3b,0x4e,0x08,0x02,0x59,0x67,0x59,0x11,0x38,0x40,0x40,0x38,0x39,0x3f,0x3f,0xb4,0x52,0x35,0x2d,0x32,0x5a,0x31,0x35,0x6c,0x5e,0x74,0x5e,0x6e,0x38,0x31,0x5f,0xfd,0xda,0x53,0x61,0x01,0x25,0x46,0x3e,0x69,0x3e,0x46,0x42,0x38,0x7d,0x38,0x42,0x00,0x00,0xff,0xff,0x00,0x58,\r\n0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x5f,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6f,\r\n0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x11,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x70,0x02,0x26,0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x76,0x02,0x55,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0x4c,0x01,0xfb,0x03,0x09,0x02,0x26,\r\n0x00,0xf5,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x55,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x14,0x00,0x2d,0x40,0x2a,0x03,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x23,\r\n0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x5c,0x5a,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x02,0xda,0xfe,0xe3,0x37,0x3c,0x66,0x58,0xfe,0x8e,0x01,0x63,0x3e,0x43,0x46,0x40,0xfe,0xa2,0x00,0xff,0xff,0x00,0x00,\r\n0x00,0x00,0x01,0xfe,0x02,0xda,0x02,0x06,0x02,0x37,0x00,0x00,0xff,0xff,0xff,0xd4,0x00,0x00,0x01,0xfe,0x03,0xc5,0x02,0x26,0x00,0xfc,0x00,0x00,0x01,0x07,0x06,0x6e,0x01,0xb5,0x00,0xb4,0x00,0x08,0xb1,0x01,0x01,0xb0,0xb4,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,\r\n0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0x00,0x01,0x00,0x55,0x00,0x00,0x02,0x2b,0x02,0x26,0x00,0x09,0x00,0x27,0x40,0x24,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,\r\n0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x55,0xc3,0xaf,0x01,0x09,0xb9,0x52,0x01,0x82,0x52,0xfe,0x2c,0x52,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x71,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x70,\r\n0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,\r\n0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x2b,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x27,0x06,0x69,0x02,0x67,0x00,0x00,0x00,0x07,0x06,0x78,\r\n0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x11,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x39,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x02,0xe9,0x02,0x26,\r\n0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x67,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0x35,0x02,0x2b,0x03,0x09,0x00,0x0b,0x00,0x25,0x00,0xb6,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2d,0x0a,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,\r\n0x02,0x06,0x06,0x39,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x3d,0x08,0x4e,0x1b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x2b,0x00,0x01,0x0a,0x01,0x00,0x04,0x01,0x00,0x69,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,0x02,0x06,0x06,0x39,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,\r\n0x3d,0x08,0x4e,0x1b,0x40,0x28,0x00,0x01,0x0a,0x01,0x00,0x04,0x01,0x00,0x69,0x00,0x07,0x00,0x08,0x07,0x08,0x63,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x05,0x01,0x02,0x02,0x06,0x5f,0x0b,0x09,0x02,0x06,0x06,0x39,0x06,0x4e,0x59,0x59,0x40,0x1f,0x0c,0x0c,0x01,0x00,0x0c,0x25,0x0c,0x25,0x20,0x1e,0x1d,0x1b,0x16,0x15,\r\n0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x01,0x3b,0x21,0x26,0x26,0x21,0x21,0x26,\r\n0x26,0xfe,0xf9,0xc3,0xaf,0x01,0x09,0xb9,0xcf,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x77,0x52,0x01,0x82,0x52,0xfe,0x2c,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x0c,0x02,0x26,\r\n0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x4c,0x01,0xc3,0x03,0x09,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x4c,0x01,0xb3,0x02,0x26,0x00,0x0d,0x00,0x25,0x40,0x22,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x00,0x00,\r\n0x00,0x03,0x5f,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0c,0x11,0x13,0x21,0x05,0x09,0x19,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,0x21,0x35,0x21,0x11,0x14,0x06,0x23,0x5a,0x7c,0x3e,0x45,0xfe,0xfc,0x01,0x5e,0x78,0x65,0xb4,0x52,0x44,0x3d,0x01,0xb5,0x52,0xfd,0xf9,0x61,0x72,0x00,0x00,0xff,0xff,0x00,0x55,\r\n0xff,0x4c,0x02,0x31,0x03,0x11,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x61,0x00,0x00,0x02,0x2f,0x02,0xda,0x00,0x0c,0x00,0x31,0x40,0x2e,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x06,0x05,0x02,0x03,\r\n0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x61,0x5a,0x69,0x9a,0x67,0xb1,0xbb,0x69,0xa0,0x6b,0x02,0xda,0xfe,0x69,0xe3,0xfe,0xfa,0xfe,0xe0,0xf5,0xf5,0x00,0x00,0x00,0xff,0xff,0x00,0x61,0xff,0x10,0x02,0x2f,\r\n0x02,0xda,0x02,0x26,0x01,0x10,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x02,0x06,0x02,0x19,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x28,0x40,0x25,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x5f,0x04,\r\n0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x7c,0x49,0x57,0xbe,0x01,0x18,0x26,0x20,0xaa,0x55,0x46,0x01,0xed,0x52,0xfd,0xc1,0x22,0x27,0x52,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x26,\r\n0x03,0xb6,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x26,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xe4,0x00,0x15,0x00,0x2c,0x40,0x29,0x11,0x0b,0x0a,0x08,0x05,0x04,0x03,0x02,0x08,0x01,0x00,0x01,0x4c,0x09,0x01,0x00,0x4a,0x00,0x00,0x00,0x38,0x4d,0x03,0x02,0x02,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,\r\n0x00,0x15,0x00,0x15,0x15,0x16,0x04,0x09,0x18,0x2b,0x33,0x13,0x27,0x07,0x35,0x37,0x27,0x33,0x17,0x37,0x15,0x07,0x13,0x23,0x03,0x26,0x26,0x27,0x14,0x06,0x07,0x03,0x32,0xcc,0x04,0xa0,0x86,0x2c,0x60,0x1b,0xa7,0x8d,0xdd,0x60,0x83,0x0d,0x0c,0x05,0x08,0x0c,0x7e,0x02,0x1d,0x09,0x50,0x50,0x43,0x71,0x49,0x53,0x50,0x47,0xfd,0xb3,\r\n0x01,0x65,0x23,0x36,0x0f,0x0f,0x36,0x23,0xfe,0x9b,0x00,0x00,0xff,0xff,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x6d,0x02,0x3a,0x00,0x00,0xff,0xff,0x00,0x1e,0xff,0x10,0x02,0x26,0x02,0xda,0x02,0x26,0x01,0x13,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x0a,\r\n0x00,0x00,0x02,0x75,0x02,0xda,0x00,0x26,0x01,0x13,0xec,0x00,0x01,0x07,0x03,0x29,0x00,0xf7,0x01,0x13,0x00,0x09,0xb1,0x01,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x15,0x00,0x2c,0x40,0x29,0x15,0x0a,0x09,0x08,0x07,0x02,0x01,0x00,0x08,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,\r\n0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x39,0x03,0x4e,0x21,0x27,0x11,0x13,0x04,0x09,0x1a,0x2b,0x37,0x35,0x37,0x11,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x35,0x64,0x78,0xbe,0x01,0x18,0xa0,0xa0,0x26,0x20,0xaa,0xaa,0x49,0x57,0xe6,0x50,0x51,\r\n0x01,0x01,0x52,0xfe,0xea,0x6c,0x50,0x6c,0xd9,0x22,0x27,0x52,0x55,0x46,0x9c,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x30,0x00,0x24,0x00,0x56,0xb6,0x0a,0x03,0x02,0x03,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x16,0x06,0x01,0x04,0x04,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x08,0x07,0x05,0x03,0x03,0x03,\r\n0x39,0x03,0x4e,0x1b,0x40,0x1a,0x00,0x00,0x00,0x3b,0x4d,0x06,0x01,0x04,0x04,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x08,0x07,0x05,0x03,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x10,0x00,0x00,0x00,0x24,0x00,0x24,0x23,0x13,0x23,0x13,0x25,0x24,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x33,\r\n0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x3c,0x4e,0x02,0x05,0x31,0x26,0x24,0x32,0x0b,0x01,0x07,0x31,0x26,0x35,0x3f,0x54,0x20,0x1c,0x1b,0x20,0x4a,0x20,0x1b,0x1c,0x20,0x02,0x26,0x49,0x25,0x2e,0x2a,0x24,0x24,0x2a,0x4f,0x3f,0xfe,0x5e,0x01,\r\n0xa3,0x21,0x27,0x26,0x21,0xfe,0x5c,0x01,0xa3,0x21,0x27,0x26,0x21,0xfe,0x5c,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0x30,0x00,0x14,0x00,0x4c,0xb5,0x03,0x01,0x02,0x03,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x13,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x1b,\r\n0x40,0x17,0x00,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x5c,\r\n0x5a,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x02,0x26,0x69,0x37,0x3c,0x66,0x58,0xfe,0x8e,0x01,0x62,0x3f,0x43,0x46,0x40,0xfe,0xa2,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x67,0x00,0x00,0xff,0xff,0xff,0xf6,0x00,0x00,0x01,0xfe,\r\n0x03,0x16,0x02,0x26,0x01,0x1b,0x00,0x00,0x01,0x07,0x06,0x7a,0x01,0x90,0x03,0x75,0x00,0x09,0xb1,0x01,0x01,0xb8,0x03,0x75,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x5d,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0x10,0x01,0xfe,0x02,0x30,0x02,0x26,\r\n0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5e,0xff,0x4c,0x01,0xfc,0x02,0x30,0x00,0x1c,0x00,0x5f,0xb5,0x11,0x01,0x02,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1c,0x00,0x01,0x01,0x03,0x61,0x04,0x01,0x03,0x03,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,\r\n0x05,0x3d,0x05,0x4e,0x1b,0x40,0x20,0x00,0x03,0x03,0x3b,0x4d,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x1c,0x00,0x1b,0x24,0x11,0x13,0x25,0x21,0x07,0x09,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0xf0,0x3f,0x35,0x3e,0x3d,0x36,0x38,0x3f,0x5a,0x5a,0x01,0x06,0x4b,0x3f,0x53,0x60,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x01,0x59,0x3b,0x41,0x46,0x40,0xfe,0xa2,0x02,0x26,0x69,0x37,0x3c,0x66,0x58,0xfe,0x9d,0x58,0x6b,0x00,\r\n0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x0c,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x5d,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x42,0x00,\r\n0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x63,0x75,0x74,0x64,0x64,0x74,0x75,0x63,0x3b,0x43,0x43,0x3b,0x3a,\r\n0x44,0x44,0x08,0x74,0x68,0x7e,0x69,0x73,0x73,0x69,0x7e,0x68,0x74,0x50,0x42,0x40,0x92,0x40,0x42,0x42,0x40,0x92,0x40,0x42,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,\r\n0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x71,\r\n0x03,0x84,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xb8,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x27,0x06,0x78,0x02,0x58,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x21,0x03,0x84,0x02,0x26,0x01,0x22,0x00,0x00,\r\n0x00,0x07,0x06,0xb9,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x26,0x03,0xa2,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xba,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0xa0,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0xbb,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,\r\n0x03,0x09,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x04,0x02,0x2e,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,\r\n0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x39,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf8,0x02,0x1c,0x02,0x80,0x00,0x17,0x00,0x25,0x00,0x71,0xb5,0x12,0x01,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x21,0x00,0x03,0x01,0x03,0x85,0x00,0x02,0x02,0x3b,0x4d,\r\n0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,0x4e,0x1b,0x40,0x24,0x00,0x03,0x01,0x03,0x85,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,0x4e,0x59,0x40,\r\n0x17,0x19,0x18,0x01,0x00,0x20,0x1e,0x18,0x25,0x19,0x25,0x0e,0x0d,0x0b,0x09,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,\r\n0x2c,0x63,0x75,0x74,0x64,0x45,0x32,0x0b,0x23,0x4b,0x20,0x1c,0x24,0x75,0x63,0x3b,0x43,0x43,0x3b,0x3a,0x44,0x44,0x08,0x74,0x68,0x7e,0x69,0x73,0x1c,0x23,0x4b,0x50,0x1f,0x2e,0x0a,0x36,0x51,0x7e,0x68,0x74,0x50,0x42,0x40,0x92,0x40,0x42,0x42,0x40,0x92,0x40,0x42,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x11,0x02,0x26,\r\n0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0x2b,0x02,0x1c,0x02,0x80,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x11,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x44,0x00,0x00,0xff,0xff,0x00,0x54,\r\n0xff,0xf8,0x02,0x1c,0x03,0x39,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x1c,0x03,0x0c,0x02,0x26,0x01,0x30,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x10,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x6c,\r\n0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0xe9,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x35,0x02,0x00,0x02,0x30,0x00,0x1e,0x00,0x2c,0x00,0x64,0x4b,0xb0,0x15,0x50,0x58,0x40,0x21,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x07,0x01,0x04,\r\n0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x03,0x03,0x00,0x5f,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x1e,0x00,0x03,0x06,0x01,0x00,0x03,0x00,0x63,0x00,0x05,0x05,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x07,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x17,0x20,0x1f,0x01,0x00,0x27,0x25,0x1f,0x2c,\r\n0x20,0x2c,0x1d,0x1b,0x0f,0x0d,0x08,0x06,0x00,0x1e,0x01,0x1e,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x74,0x37,\r\n0x43,0x19,0x22,0x09,0x62,0x72,0x72,0x62,0x62,0x72,0x2e,0x2b,0x18,0x22,0x1e,0x1e,0x19,0x3c,0x96,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0xcb,0x35,0x28,0x16,0x2f,0x1f,0x70,0x62,0x96,0x62,0x70,0x6f,0x62,0x97,0x3e,0x5b,0x1a,0x14,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x01,0x11,0x42,0x40,0x96,0x40,0x42,0x42,0x40,0x96,0x40,0x42,0x00,0x00,\r\n0x00,0x03,0x00,0x23,0xff,0xe2,0x02,0x35,0x02,0x4e,0x00,0x15,0x00,0x1e,0x00,0x27,0x00,0x4a,0x40,0x47,0x09,0x01,0x04,0x00,0x26,0x25,0x19,0x0c,0x01,0x05,0x05,0x04,0x14,0x01,0x02,0x05,0x03,0x4c,0x00,0x01,0x00,0x01,0x85,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x41,0x4d,0x07,0x01,0x05,0x05,0x02,\r\n0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x20,0x1f,0x00,0x00,0x1f,0x27,0x20,0x27,0x1c,0x1a,0x00,0x15,0x00,0x15,0x26,0x12,0x26,0x08,0x09,0x19,0x2b,0x17,0x37,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x33,0x07,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x27,0x07,0x37,0x14,0x17,0x13,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,\r\n0x34,0x27,0x03,0x16,0x23,0x51,0x1c,0x72,0x62,0x4c,0x34,0x2e,0x5b,0x54,0x1f,0x72,0x62,0x50,0x36,0x29,0x30,0x03,0xcc,0x20,0x30,0x3c,0x43,0x7f,0x3c,0x43,0x04,0xd0,0x20,0x1e,0x72,0x31,0x43,0x96,0x62,0x70,0x22,0x40,0x76,0x32,0x47,0x97,0x62,0x70,0x26,0x3a,0xe6,0x11,0x0e,0x01,0x20,0x17,0x44,0x3e,0xfe,0xe8,0x45,0x3d,0x96,0x15,\r\n0x13,0xfe,0xdb,0x1b,0xff,0xff,0x00,0x23,0xff,0xe2,0x02,0x35,0x03,0x11,0x02,0x26,0x01,0x39,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x0c,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x23,0xff,0xf6,0x02,0x35,0x02,0x30,0x00,0x28,\r\n0x00,0x36,0x00,0x3f,0x00,0x59,0x40,0x56,0x0b,0x01,0x09,0x08,0x24,0x01,0x04,0x05,0x02,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x09,0x00,0x03,0x05,0x09,0x03,0x67,0x0a,0x01,0x08,0x08,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0c,0x07,0x02,0x04,0x04,0x00,0x61,0x06,0x0b,0x02,0x00,0x00,0x3f,0x00,0x4e,0x2a,0x29,0x01,\r\n0x00,0x3d,0x3b,0x38,0x37,0x31,0x2f,0x29,0x36,0x2a,0x36,0x21,0x1f,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x11,0x0f,0x08,0x06,0x00,0x28,0x01,0x28,0x0d,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x33,0x3e,0x02,0x33,0x32,0x16,0x15,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x23,0x22,\r\n0x26,0x26,0x27,0x23,0x0e,0x02,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x13,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0xb4,0x43,0x4e,0x4e,0x43,0x28,0x33,0x1a,0x01,0x04,0x02,0x19,0x33,0x28,0x43,0x4e,0xde,0x24,0x1f,0x1a,0x25,0x04,0x55,0x0a,0x4c,0x38,0x28,0x33,0x19,0x02,0x04,0x01,0x1a,0x33,0x1e,\r\n0x1f,0x24,0x24,0x1f,0x20,0x26,0x26,0xb9,0x89,0x26,0x20,0x1f,0x24,0x0a,0x57,0x49,0xfa,0x4a,0x56,0x1a,0x25,0x11,0x11,0x25,0x1a,0x56,0x4a,0x96,0x64,0x26,0x2d,0x20,0x1a,0x3e,0x49,0x1a,0x25,0x11,0x11,0x25,0x1a,0x4d,0x2d,0x26,0xfa,0x26,0x2d,0x2d,0x26,0xfa,0x26,0x2d,0x01,0x00,0x4d,0x26,0x2d,0x2d,0x26,0x00,0x00,0x02,0x00,0x5c,\r\n0xff,0x4c,0x02,0x01,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x68,0xb6,0x11,0x03,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x05,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x00,0x00,0x00,0x3b,0x4d,\r\n0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x14,0x16,0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x25,0x24,0x11,0x08,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,\r\n0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5c,0x5a,0x01,0x07,0x50,0x3e,0x53,0x62,0x62,0x53,0x3e,0x50,0x07,0x03,0x02,0x78,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0xb4,0x02,0xda,0x69,0x36,0x3d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x3c,0x43,\r\n0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,0x00,0x02,0x00,0x57,0xff,0x56,0x01,0xfc,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x6c,0xb6,0x12,0x04,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x31,0x50,0x58,0x40,0x21,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,\r\n0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x59,0x40,0x14,0x16,0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x25,0x25,0x11,\r\n0x08,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x07,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x11,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x57,0x5a,0x02,0x01,0x08,0x51,0x3e,0x53,0x62,0x62,0x53,0x3e,0x50,0x07,0x01,0x78,0x39,0x40,0x40,0x39,0x37,0x41,0x41,0xaa,0x03,\r\n0x84,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5e,0x6e,0x3d,0x36,0xfe,0xed,0xee,0x3c,0x43,0xa0,0x44,0x3b,0x46,0x3e,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x02,0x00,0x57,0xff,0x4c,0x01,0xfc,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x68,0xb6,0x10,0x02,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x05,0x01,0x61,\r\n0x02,0x01,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x3b,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x06,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x14,0x16,\r\n0x15,0x00,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x00,0x14,0x00,0x14,0x14,0x25,0x25,0x08,0x09,0x19,0x2b,0x05,0x35,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x33,0x11,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0xa2,0x02,0x03,0x07,0x50,0x3e,0x53,0x62,\r\n0x63,0x52,0x3e,0x50,0x07,0x01,0x5a,0xd2,0x38,0x40,0x40,0x38,0x39,0x40,0x40,0xb4,0xa0,0x7d,0x35,0x3e,0x6e,0x5f,0xa1,0x5f,0x6d,0x3d,0x36,0x69,0xfd,0x26,0xf8,0x46,0x3e,0x96,0x3e,0x46,0x3a,0x40,0xaa,0x40,0x3a,0x00,0x00,0x00,0x00,0x01,0x00,0x70,0x00,0x00,0x02,0x12,0x02,0x30,0x00,0x13,0x00,0x5a,0xb5,0x03,0x01,0x02,0x03,0x01,\r\n0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x1e,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x04,0x04,\r\n0x39,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x13,0x00,0x13,0x22,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x23,0x22,0x06,0x15,0x11,0x70,0x5a,0x02,0x07,0x4c,0x40,0x56,0x5d,0x5a,0x75,0x3b,0x3e,0x02,0x26,0x69,0x35,0x3e,0x67,0x5f,0x2f,0x2f,0x78,0x44,0x40,\r\n0xfe,0xa2,0x00,0x00,0xff,0xff,0x00,0x70,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x76,0x00,0x00,0xff,0xff,0x00,0x70,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x6c,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x10,0x02,0x12,0x02,0x30,0x02,0x26,\r\n0x01,0x40,0x00,0x00,0x00,0x07,0x06,0x7a,0x01,0xbd,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xf8,0x02,0x03,0x02,0x2e,0x00,0x28,0x00,0x3b,0x40,0x38,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x42,0x00,\r\n0x4e,0x01,0x00,0x1e,0x1b,0x19,0x18,0x16,0x13,0x09,0x06,0x04,0x03,0x00,0x28,0x01,0x27,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x15,0x14,0x06,0x23,0x01,0x16,\r\n0x5c,0x65,0x5a,0x36,0x31,0x2c,0x32,0x37,0x41,0x98,0x38,0x3e,0x63,0x57,0x2c,0x50,0x65,0x04,0x5b,0x02,0x33,0x29,0x2c,0x2e,0x34,0x35,0x8e,0x8c,0x65,0x5c,0x08,0x53,0x4c,0x26,0x2b,0x2c,0x28,0x47,0x09,0x16,0x08,0x4d,0x3f,0x48,0x52,0x4f,0x40,0x1d,0x26,0x2a,0x24,0x3a,0x08,0x14,0x14,0x90,0x4d,0x55,0x00,0x00,0xff,0xff,0x00,0x55,\r\n0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x35,0x02,0x03,0x02,0x2e,0x00,0x3a,0x00,0x95,0x40,0x0a,0x09,0x01,0x07,0x03,\r\n0x33,0x01,0x01,0x07,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x72,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x42,0x4d,0x00,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,\r\n0x3d,0x08,0x4e,0x1b,0x40,0x34,0x00,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x02,0x03,0x06,0x02,0x03,0x7e,0x00,0x01,0x07,0x00,0x07,0x01,0x00,0x80,0x00,0x00,0x09,0x01,0x08,0x00,0x08,0x63,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x03,0x03,0x07,0x61,0x00,0x07,0x07,0x42,0x07,0x4e,0x59,0x40,0x11,0x00,0x00,0x00,\r\n0x3a,0x00,0x39,0x29,0x32,0x12,0x3a,0x32,0x14,0x14,0x21,0x0a,0x09,0x1e,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x15,0x14,0x06,\r\n0x23,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xd7,0x46,0x16,0x1b,0x37,0x32,0x17,0x50,0x57,0x5a,0x36,0x31,0x2c,0x32,0x37,0x41,0x98,0x38,0x3e,0x63,0x57,0x2c,0x50,0x65,0x04,0x5b,0x02,0x33,0x29,0x2c,0x2e,0x34,0x35,0x8e,0x8c,0x65,0x5c,0x0d,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x3e,0x06,0x51,0x47,0x26,\r\n0x2b,0x2c,0x28,0x47,0x09,0x16,0x08,0x4d,0x3f,0x48,0x52,0x4f,0x40,0x1d,0x26,0x2a,0x24,0x3a,0x08,0x14,0x14,0x90,0x4d,0x55,0x1b,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x03,0x11,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x10,0x02,0x03,\r\n0x02,0x2e,0x02,0x26,0x01,0x44,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x02,0x18,0x02,0xe4,0x00,0x2a,0x00,0x37,0x40,0x34,0x0c,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x69,0x00,0x05,0x05,0x00,0x61,0x00,0x00,0x00,0x3e,0x4d,0x00,0x02,0x02,0x01,0x61,0x07,0x06,0x02,\r\n0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x00,0x2a,0x00,0x2a,0x24,0x21,0x24,0x21,0x2d,0x24,0x08,0x09,0x1c,0x2b,0x33,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,\r\n0x5c,0x35,0x5f,0x3f,0x3f,0x5e,0x35,0x41,0x34,0x3e,0x4e,0x38,0x63,0x42,0x3a,0x30,0x3e,0x4d,0x48,0x3a,0x39,0x2e,0x35,0x43,0x43,0x35,0x36,0x43,0x02,0x16,0x3d,0x5d,0x34,0x2f,0x52,0x37,0x3b,0x5a,0x0d,0x03,0x0b,0x68,0x48,0x3c,0x5c,0x34,0x52,0x48,0x3a,0x3a,0x48,0x50,0x42,0x35,0x35,0x42,0x46,0x38,0xfd,0xea,0x00,0x01,0x00,0xa5,\r\n0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x0b,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x21,0x23,0x04,0x09,0x18,0x2b,0x33,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x11,0xa5,0x5d,0x4c,0xb0,0xb0,0x23,0x2c,0x02,0x3b,0x47,0x58,\r\n0x50,0x2c,0x24,0xfd,0xc6,0x00,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,0x02,0xc1,0x00,0x13,0x00,0x35,0x40,0x32,0x00,0x03,0x02,0x03,0x85,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x60,0x07,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x12,0x10,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,\r\n0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x08,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x63,0x44,0x52,0x9e,0x9e,0x5a,0xe1,0xe1,0x21,0x1b,0xa0,0x4f,0x42,0x01,0x43,0x52,0x9b,0x9b,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,\r\n0x02,0xc1,0x00,0x1b,0x00,0x3e,0x40,0x3b,0x00,0x03,0x02,0x03,0x85,0x06,0x01,0x00,0x0b,0x0a,0x02,0x07,0x08,0x00,0x07,0x67,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x08,0x08,0x09,0x60,0x00,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x1b,0x00,0x1b,0x18,0x16,0x23,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,\r\n0x0c,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x35,0x55,0x78,0x9e,0x9e,0x5a,0xe1,0xe1,0xb4,0xb4,0x21,0x1b,0xa0,0xa0,0x44,0x52,0xef,0x4b,0x9a,0x52,0x9b,0x9b,0x52,0x9a,0x4b,0x5e,0x1c,0x23,0x52,0x4f,0x42,0x5e,0x00,\r\n0xff,0xff,0x00,0x2f,0x00,0x00,0x02,0x08,0x03,0x21,0x02,0x26,0x01,0x4c,0x00,0x00,0x01,0x07,0x06,0x6d,0x02,0x12,0x00,0x47,0x00,0x08,0xb1,0x01,0x01,0xb0,0x47,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0x2f,0xff,0x35,0x02,0x08,0x02,0xc1,0x00,0x25,0x00,0x87,0x40,0x0a,0x09,0x01,0x08,0x07,0x1e,0x01,0x01,0x08,0x02,0x4c,0x4b,0xb0,\r\n0x15,0x50,0x58,0x40,0x2f,0x00,0x04,0x03,0x04,0x85,0x00,0x01,0x08,0x00,0x08,0x01,0x00,0x80,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x39,0x4d,0x00,0x00,0x00,0x09,0x5f,0x0a,0x01,0x09,0x09,0x3d,0x09,0x4e,0x1b,0x40,0x2c,0x00,0x04,0x03,0x04,0x85,0x00,0x01,0x08,0x00,\r\n0x08,0x01,0x00,0x80,0x00,0x00,0x0a,0x01,0x09,0x00,0x09,0x63,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x08,0x39,0x08,0x4e,0x59,0x40,0x12,0x00,0x00,0x00,0x25,0x00,0x24,0x11,0x23,0x11,0x11,0x11,0x11,0x15,0x14,0x21,0x0b,0x09,0x1f,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0x01,0x09,0x46,0x16,0x1b,0x37,0x32,0x1c,0x30,0x36,0x9e,0x9e,0x5a,0xe1,0xe1,0x21,0x1b,0xa0,0x99,0x0c,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x4b,0x0d,0x49,\r\n0x35,0x01,0x43,0x52,0x9b,0x9b,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x23,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0xff,0xff,0x00,0x2f,0xff,0x10,0x02,0x08,0x02,0xc1,0x02,0x26,0x01,0x4c,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x94,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x26,0x00,0x11,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x01,\r\n0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x05,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x01,0x2b,0x5f,0x72,0x5a,0x40,0x37,0x38,0x41,0x5a,0x74,0x0a,0x71,0x61,0x01,0x5e,\r\n0xfe,0xa2,0x3c,0x47,0x47,0x3c,0x01,0x5e,0xfe,0xa2,0x61,0x71,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,\r\n0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x68,\r\n0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6b,0x02,0x62,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,\r\n0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6f,0x02,0x58,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xf4,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x6a,0x02,0x4e,0x00,0xe3,0x00,0x08,0xb1,0x03,\r\n0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0xcc,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x27,0x06,0x68,0x02,0x58,0x00,0x00,0x01,0x07,0x06,0x73,0x02,0x58,0x00,0xe3,0x00,0x08,0xb1,0x03,0x01,0xb0,0xe3,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x01,0xfe,0x02,0x26,0x02,0x26,\r\n0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x39,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,\r\n0xff,0xf6,0x02,0x58,0x02,0x94,0x00,0x19,0x00,0x4e,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1c,0x00,0x03,0x00,0x00,0x03,0x70,0x00,0x04,0x04,0x00,0x61,0x02,0x01,0x00,0x00,0x3b,0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x00,0x03,0x85,0x00,0x04,0x04,0x00,0x61,0x02,0x01,0x00,0x00,0x3b,0x4d,\r\n0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x09,0x23,0x13,0x12,0x23,0x23,0x11,0x06,0x09,0x1c,0x2b,0x37,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x11,0x14,0x06,0x23,0x22,0x26,0x5a,0x5a,0x40,0x37,0x38,0x41,0x46,0x23,0x4b,0x2b,0x2f,0x74,0x5f,0x5f,\r\n0x72,0xc8,0x01,0x5e,0xfe,0xa2,0x3e,0x45,0x45,0x3e,0x01,0x5e,0x23,0x4b,0x50,0x2b,0x34,0xfe,0xe3,0x61,0x71,0x71,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x58,0x02,0x94,0x02,0x26,0x01,0x5e,0x00,0x00,\r\n0x00,0x07,0x06,0x78,0x02,0x57,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x39,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,\r\n0x03,0x0c,0x02,0x26,0x01,0x5e,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x6c,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe9,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,\r\n0x00,0x01,0x00,0x5a,0xff,0x35,0x01,0xfe,0x02,0x26,0x00,0x1f,0x00,0x56,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x05,0x05,0x00,0x60,0x06,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x19,0x00,0x05,0x06,0x01,0x00,0x05,0x00,0x64,0x04,0x01,0x02,0x02,\r\n0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x13,0x01,0x00,0x1e,0x1c,0x13,0x12,0x10,0x0e,0x0c,0x0b,0x08,0x06,0x00,0x1f,0x01,0x1f,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x07,0x07,0x06,0x06,0x15,0x14,\r\n0x16,0x33,0x33,0x15,0x01,0x74,0x37,0x43,0x19,0x22,0x09,0x62,0x70,0x5a,0x78,0x78,0x5a,0x57,0x18,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x16,0x2f,0x1f,0x70,0x62,0x01,0x5e,0xfe,0xa2,0x82,0x82,0x01,0x5e,0xfe,0xa2,0x7f,0x34,0x14,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x44,0x02,0x26,\r\n0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x71,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x0c,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0x26,0x00,0x0c,0x00,0x21,0x40,0x1e,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,\r\n0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xf1,0xbb,0x61,0x78,0x0b,0x10,0x04,0x05,0x0e,0x0a,0x78,0x5f,0xbb,0x02,0x26,0xfe,0x8e,0x21,0x3d,0x11,0x11,0x3d,0x21,0x01,0x72,0xfd,0xda,0x00,0x00,0x01,0x00,0x1f,\r\n0x00,0x00,0x02,0x39,0x02,0x26,0x00,0x1e,0x00,0x27,0x40,0x24,0x1a,0x0f,0x06,0x03,0x03,0x00,0x01,0x4c,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x1e,0x00,0x1e,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,\r\n0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x79,0x5a,0x4e,0x38,0x03,0x06,0x01,0x02,0x05,0x04,0x45,0x5a,0x45,0x04,0x07,0x01,0x02,0x06,0x03,0x3a,0x4a,0x5e,0x63,0x3f,0x04,0x07,0x02,0x01,0x08,0x05,0x42,0x02,0x26,0xfe,0x7c,0x16,0x35,0x11,0x11,0x35,0x16,0x01,0x84,0xfe,0x7c,0x16,0x35,0x11,\r\n0x11,0x35,0x16,0x01,0x84,0xfd,0xda,0x01,0x7c,0x1c,0x3f,0x11,0x11,0x3f,0x1c,0xfe,0x84,0x00,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6e,\r\n0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x09,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x1f,0x00,0x00,0x02,0x39,0x03,0x11,0x02,0x26,0x01,0x6a,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x00,0x17,\r\n0x00,0x26,0x40,0x23,0x13,0x0d,0x07,0x01,0x04,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,0x04,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x18,0x12,0x05,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x13,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,\r\n0x32,0xc3,0xb7,0x6a,0x6d,0x07,0x0d,0x04,0x03,0x0d,0x07,0x6d,0x6a,0xb7,0xc2,0x6a,0x76,0x07,0x0d,0x05,0x04,0x0f,0x08,0x76,0x01,0x1b,0x01,0x0b,0xaa,0x0b,0x1a,0x08,0x08,0x1a,0x0b,0xaa,0xfe,0xf4,0xfe,0xe6,0xb4,0x0b,0x1d,0x09,0x09,0x1d,0x0b,0xb4,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x0d,0x00,0x22,0x40,0x1f,\r\n0x07,0x01,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x3b,0x4d,0x03,0x01,0x02,0x02,0x3d,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x18,0x12,0x04,0x09,0x18,0x2b,0x17,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x01,0xb2,0x51,0xcd,0x61,0x82,0x08,0x0e,0x03,0x03,0x0e,0x07,0x79,0x5f,0xfe,0xee,0xb4,0xd6,0x02,\r\n0x04,0xfe,0xac,0x14,0x2c,0x10,0x10,0x2c,0x14,0x01,0x54,0xfd,0x26,0x00,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,\r\n0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x09,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x2b,0x02,0x22,0x02,0x26,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0xf8,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,\r\n0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x39,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0xe9,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,\r\n0x03,0x0c,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0x26,0x00,0x09,0x00,0x2c,0x40,0x29,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,\r\n0x09,0x00,0x09,0x12,0x11,0x12,0x05,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x5a,0x01,0x34,0xfe,0xd4,0x01,0x91,0xfe,0xc6,0x01,0x45,0x5a,0x01,0x7a,0x52,0x5a,0xfe,0x86,0x52,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,\r\n0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x79,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x1c,0x02,0xda,0x02,0x06,0x00,0x87,0x00,0x00,\r\n0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x09,0x00,0x27,0x40,0x24,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x41,\r\n0xc8,0xb4,0x01,0x0e,0xc8,0x52,0x02,0x36,0x52,0xfd,0x78,0x52,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0x2b,0x03,0xb6,0x02,0x26,0x01,0x7e,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x53,0x00,0x00,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0x2b,0x02,0xda,0x02,0x26,0x01,0x7e,0x00,0x00,0x00,0x07,0x06,0x6d,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x41,\r\n0xff,0x10,0x02,0x2b,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x5d,0x00,0x00,0x02,0x06,0x01,0x7e,0x00,0x00,0xff,0xff,0x00,0x41,0x00,0x00,0x02,0xa7,0x02,0xda,0x00,0x27,0x03,0x29,0x01,0x29,0x01,0x13,0x03,0x06,0x01,0x7e,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x2b,\r\n0x02,0xda,0x00,0x11,0x00,0x34,0x40,0x31,0x0e,0x0d,0x0c,0x0b,0x06,0x05,0x04,0x03,0x08,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x15,0x11,0x15,0x11,0x06,0x09,0x1a,0x2b,0x33,0x35,0x33,0x35,0x07,0x35,\r\n0x37,0x35,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x11,0x33,0x15,0x41,0xc8,0x8c,0x8c,0xb4,0x01,0x0e,0x8c,0x8c,0xc8,0x52,0xf3,0x5f,0x50,0x5f,0xf3,0x52,0xfe,0xf7,0x5f,0x50,0x5f,0xfe,0xd1,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0xf6,0x02,0x24,0x02,0xc1,0x00,0x19,0x00,0x3f,0x40,0x3c,0x00,0x03,0x02,0x03,0x85,0x00,0x07,0x01,\r\n0x06,0x01,0x07,0x06,0x80,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x16,0x14,0x12,0x10,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x19,0x01,0x19,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,\r\n0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x70,0x54,0x63,0x96,0x96,0x5a,0xe1,0xe1,0x32,0x2b,0x2b,0x31,0x58,0x61,0x0a,0x62,0x54,0x01,0x28,0x52,0x9b,0x9b,0x52,0xfe,0xd8,0x2f,0x37,0x37,0x2f,0x03,0x03,0x54,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0xf6,0x02,0x24,0x02,0xc1,0x00,0x21,\r\n0x00,0x48,0x40,0x45,0x00,0x03,0x02,0x03,0x85,0x00,0x09,0x07,0x08,0x07,0x09,0x08,0x80,0x06,0x01,0x00,0x0c,0x0b,0x02,0x07,0x09,0x00,0x07,0x67,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x08,0x08,0x0a,0x61,0x00,0x0a,0x0a,0x3f,0x0a,0x4e,0x00,0x00,0x00,0x21,0x00,0x21,0x1e,0x1c,0x19,0x17,0x23,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x55,0x64,0x96,0x96,0x5a,0xe1,0xe1,0xc8,0xc8,0x32,0x2b,0x2b,0x31,0x58,0x61,0x53,0x54,0x63,0xef,0x4b,\r\n0x9a,0x52,0x9b,0x9b,0x52,0x9a,0x4b,0x43,0x2f,0x37,0x37,0x2f,0x03,0x03,0x54,0x62,0x62,0x54,0x43,0x00,0xff,0xff,0x00,0x23,0xff,0xf6,0x02,0x24,0x03,0x21,0x02,0x26,0x01,0x84,0x00,0x00,0x01,0x07,0x06,0x6d,0x02,0x12,0x00,0x47,0x00,0x08,0xb1,0x01,0x01,0xb0,0x47,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0x23,0xff,0x35,0x02,0x24,\r\n0x02,0xc1,0x00,0x2d,0x00,0x98,0x40,0x0a,0x09,0x01,0x09,0x07,0x26,0x01,0x01,0x09,0x02,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x36,0x00,0x04,0x03,0x04,0x85,0x00,0x08,0x02,0x07,0x02,0x08,0x07,0x80,0x00,0x01,0x09,0x00,0x09,0x01,0x72,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x09,0x61,0x00,0x09,\r\n0x09,0x3f,0x4d,0x00,0x00,0x00,0x0a,0x5f,0x0b,0x01,0x0a,0x0a,0x3d,0x0a,0x4e,0x1b,0x40,0x34,0x00,0x04,0x03,0x04,0x85,0x00,0x08,0x02,0x07,0x02,0x08,0x07,0x80,0x00,0x01,0x09,0x00,0x09,0x01,0x00,0x80,0x00,0x00,0x0b,0x01,0x0a,0x00,0x0a,0x63,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3b,0x4d,0x00,0x07,0x07,0x09,0x61,\r\n0x00,0x09,0x09,0x3f,0x09,0x4e,0x59,0x40,0x14,0x00,0x00,0x00,0x2d,0x00,0x2c,0x25,0x22,0x22,0x23,0x11,0x11,0x11,0x11,0x15,0x14,0x21,0x0c,0x09,0x1f,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x26,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,\r\n0x06,0x23,0x22,0x23,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0x01,0x09,0x46,0x16,0x1b,0x37,0x32,0x19,0x38,0x3f,0x96,0x96,0x5a,0xe1,0xe1,0x32,0x2b,0x2b,0x31,0x58,0x61,0x53,0x05,0x04,0x09,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x44,0x10,0x5a,0x43,0x01,0x28,0x52,0x9b,0x9b,0x52,0xfe,0xd8,0x2f,0x37,0x37,0x2f,0x03,\r\n0x03,0x54,0x62,0x19,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0xff,0xff,0x00,0x23,0xff,0x10,0x02,0x24,0x02,0xc1,0x02,0x26,0x01,0x84,0x00,0x00,0x00,0x07,0x06,0x7a,0x02,0x94,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0x42,0x02,0x46,0x02,0x30,0x00,0x26,0x00,0x32,0x00,0x40,0x00,0xd1,0x40,0x0a,0x08,0x01,0x04,0x06,0x07,0x01,0x09,0x05,\r\n0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2a,0x0b,0x01,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,0x67,0x07,0x01,0x03,0x03,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0c,0x01,0x08,0x08,0x00,0x5f,0x0a,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x4b,0xb0,0x31,0x50,0x58,0x40,0x32,0x0b,0x01,0x06,0x00,0x04,\r\n0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,0x67,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x0c,0x01,0x08,0x08,0x00,0x5f,0x0a,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x2f,0x0b,0x01,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x05,0x00,0x09,0x08,0x05,0x09,\r\n0x67,0x0c,0x01,0x08,0x0a,0x01,0x00,0x08,0x00,0x63,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x3b,0x03,0x4e,0x59,0x59,0x40,0x23,0x35,0x33,0x28,0x27,0x01,0x00,0x3c,0x39,0x33,0x40,0x35,0x40,0x2e,0x2c,0x27,0x32,0x28,0x32,0x1f,0x1d,0x1b,0x19,0x13,0x12,0x11,0x10,0x0f,0x0d,0x00,\r\n0x26,0x01,0x25,0x0d,0x09,0x16,0x2b,0x17,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x33,0x15,0x23,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x23,0x15,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0xe2,0x33,0x50,0x2d,0x51,0x40,0x34,0x3a,0x6e,0x5e,0x2e,0x19,0xde,0xb9,0x29,0x33,0x6c,0x5c,0x09,0x08,0x77,0x34,0x4f,0x2e,0x2e,0x4f,0x34,0x66,0x38,0x40,0x40,0x38,0x38,0x42,0x42,0x07,0xa6,0x26,0x31,0x31,0x26,0xa6,0x25,0x32,0x32,0xbe,0x29,0x49,0x30,0x42,0x57,0x0a,0x5f,0x13,0x50,0x39,\r\n0x50,0x5e,0x0a,0x4a,0x01,0x05,0x2d,0x30,0x4b,0x57,0x4e,0x2a,0x4a,0x31,0x30,0x49,0x29,0x01,0xdc,0x36,0x2e,0x2e,0x36,0x36,0x2e,0x2e,0x36,0xfe,0x72,0x30,0x27,0x27,0x30,0x30,0x27,0x27,0x30,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,\r\n0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x11,0x02,0x26,0x01,0x89,0x00,0x00,\r\n0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x70,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x76,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x32,0xff,0x42,0x02,0x46,0x03,0x09,0x02,0x26,0x01,0x89,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x01,0xfe,\r\n0x03,0x09,0x02,0x26,0x01,0x91,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xe3,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x42,0x01,0xee,0x02,0x26,0x00,0x15,0x00,0x58,0x4b,0xb0,0x31,0x50,0x58,0x40,0x1e,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,\r\n0x3d,0x00,0x4e,0x1b,0x40,0x1b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x02,0x05,0x01,0x00,0x02,0x00,0x65,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x3b,0x03,0x4e,0x59,0x40,0x11,0x01,0x00,0x11,0x10,0x0f,0x0e,0x0b,0x09,0x06,0x05,0x00,0x15,0x01,0x15,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x33,0x15,0x14,0x16,\r\n0x33,0x32,0x36,0x35,0x11,0x21,0x35,0x21,0x11,0x14,0x06,0x06,0x01,0x24,0x3c,0x5b,0x33,0x5a,0x3f,0x31,0x32,0x3e,0xfe,0xf3,0x01,0x67,0x33,0x5b,0xbe,0x32,0x58,0x3a,0x4a,0x4a,0x34,0x40,0x40,0x34,0x01,0xce,0x52,0xfd,0xe0,0x3a,0x58,0x32,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x02,0x6c,0x03,0x11,0x02,0x26,0x01,0x91,0x00,0x00,\r\n0x00,0x07,0x06,0x6e,0x02,0xe3,0x00,0x00,0x00,0x01,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x13,0x00,0x32,0x40,0x2f,0x00,0x04,0x01,0x03,0x01,0x04,0x03,0x80,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,\r\n0x00,0x13,0x01,0x13,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x60,0x58,0x67,0xa6,0x01,0x00,0x36,0x2f,0x2f,0x36,0x5a,0x66,0x0a,0x66,0x57,0x01,0xd5,0x52,0xfd,0xd9,0x31,0x3c,0x3c,0x31,0x4b,0x4b,0x57,0x66,0x00,0x00,0x00,0xff,0xff,0xff,0xfb,\r\n0xff,0xf6,0x02,0x1f,0x03,0xb6,0x02,0x26,0x01,0x93,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x30,0x00,0x00,0xff,0xff,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x27,0x06,0x6d,0x02,0x58,0x00,0x00,0x02,0x06,0x01,0x93,0x00,0x00,0xff,0xff,0xff,0xfb,0xff,0x10,0x02,0x1f,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x5d,0x00,0x00,0x02,0x06,\r\n0x01,0x93,0x00,0x00,0x00,0x02,0xff,0xfb,0xff,0xf6,0x02,0x4d,0x02,0xda,0x00,0x13,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x04,0x05,0x03,0x05,0x04,0x03,0x80,0x00,0x06,0x08,0x01,0x05,0x04,0x06,0x05,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x15,0x14,0x01,\r\n0x00,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x61,0x58,0x68,0xa6,0x01,0x00,0x37,0x2f,\r\n0x2f,0x37,0x5a,0x67,0x41,0x25,0x2d,0x2d,0x25,0x25,0x2d,0x2d,0x0a,0x66,0x57,0x01,0xd5,0x52,0xfd,0xd9,0x31,0x3a,0x3a,0x31,0x29,0x29,0x57,0x66,0x01,0x23,0x2c,0x23,0x25,0x2e,0x2e,0x25,0x23,0x2c,0x00,0x00,0x00,0x01,0xff,0xfb,0xff,0xf6,0x02,0x1f,0x02,0xda,0x00,0x1b,0x00,0x38,0x40,0x35,0x1b,0x0a,0x09,0x08,0x07,0x02,0x01,0x07,\r\n0x03,0x00,0x00,0x01,0x02,0x03,0x02,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x3f,0x04,0x4e,0x23,0x13,0x27,0x11,0x13,0x05,0x09,0x1b,0x2b,0x37,0x35,0x37,0x35,0x23,0x35,0x21,0x11,0x37,0x15,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0x35,\r\n0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x23,0x7e,0xa6,0x01,0x00,0x9a,0x9a,0x36,0x2f,0x2f,0x36,0x5a,0x66,0x59,0x58,0x67,0xe6,0x50,0x55,0xfd,0x52,0xfe,0xee,0x68,0x50,0x68,0xc5,0x31,0x3c,0x3c,0x31,0x4b,0x4b,0x57,0x66,0x66,0x57,0x88,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x30,0x00,0x23,0x00,0x64,0xb6,0x0a,\r\n0x03,0x02,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x06,0x01,0x04,0x04,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x08,0x07,0x02,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x21,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x00,0x00,0x00,0x3b,0x4d,0x06,0x01,0x04,0x04,0x01,0x61,\r\n0x02,0x01,0x01,0x01,0x41,0x4d,0x08,0x07,0x02,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x10,0x00,0x00,0x00,0x23,0x00,0x23,0x23,0x13,0x23,0x13,0x24,0x24,0x11,0x09,0x09,0x1d,0x2b,0x33,0x11,0x33,0x17,0x33,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x15,0x11,0x3c,0x51,0x02,0x01,0x05,0x2e,0x25,0x24,0x32,0x0b,0x07,0x31,0x26,0x35,0x40,0x56,0x1d,0x1a,0x1b,0x20,0x50,0x1f,0x1a,0x1a,0x1f,0x02,0x26,0x49,0x26,0x2d,0x29,0x23,0x23,0x29,0x4f,0x3f,0xfe,0x5e,0x01,0xa3,0x21,0x27,0x26,0x21,0xcd,0xcc,0x21,0x27,0x26,0x21,0xfe,0x5c,0x00,0x00,0x00,0x01,0x00,0x22,\r\n0x00,0x00,0x02,0x36,0x02,0x26,0x00,0x18,0x00,0x2e,0x40,0x2b,0x17,0x0f,0x06,0x03,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x02,0x01,0x00,0x00,0x3b,0x4d,0x05,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x11,0x18,0x18,0x11,0x06,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,\r\n0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x03,0x03,0x6c,0x4a,0x52,0x2f,0x03,0x06,0x01,0x02,0x08,0x06,0x45,0x58,0x43,0x05,0x0c,0x01,0x02,0x06,0x03,0x2e,0x4e,0x4b,0x67,0x57,0x5a,0x02,0x26,0xfe,0x84,0x16,0x39,0x0b,0x0b,0x39,0x16,0x01,0x0f,0xfe,0xf1,0x16,0x37,0x0c,0x0c,0x37,0x16,0x01,0x7c,\r\n0xfd,0xda,0x01,0x5f,0xfe,0xa1,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,\r\n0x03,0x09,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x02,0x36,0x03,0x11,0x02,0x26,0x01,0x9a,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0xda,0x00,0x03,0x00,0x09,0x00,0x2f,0x40,0x2c,0x08,0x05,0x02,0x01,0x02,0x01,\r\n0x4c,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x05,0x03,0x04,0x03,0x01,0x01,0x39,0x01,0x4e,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x33,0x11,0x33,0x11,0x21,0x03,0x13,0x33,0x03,0x13,0x64,0x5a,0x01,0x04,0xf6,0xe6,0x71,0xe5,0xf9,0x02,0xda,0xfd,0x26,0x01,0x22,\r\n0x01,0x04,0xfe,0xfd,0xfe,0xdd,0x00,0x00,0xff,0xff,0x00,0x64,0xff,0x10,0x02,0x37,0x02,0xda,0x00,0x27,0x06,0x7a,0x02,0x58,0x00,0x00,0x02,0x06,0x01,0x9f,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x02,0x06,0x02,0x4b,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x09,0x02,0xda,0x00,0x16,0x00,0x35,0x40,0x32,\r\n0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x07,0x01,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x11,0x11,0x12,0x21,0x23,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,\r\n0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x41,0x9b,0x9b,0x9b,0x52,0x48,0x93,0x93,0x40,0xd3,0xd3,0xd3,0x52,0x01,0x39,0x50,0x75,0x41,0x49,0x50,0x3a,0x75,0x50,0xfe,0xc7,0x52,0x00,0x01,0x00,0x46,0x00,0x00,0x02,0x23,0x02,0x27,0x00,0x14,0x00,0x6e,0x4b,0xb0,0x1e,0x50,0x58,0xb5,0x07,0x01,0x00,0x01,0x01,0x4c,0x1b,0xb5,\r\n0x07,0x01,0x00,0x04,0x01,0x4c,0x59,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x19,0x04,0x01,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,0x05,0x01,0x00,0x00,0x06,0x5f,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x40,0x23,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,0x00,0x04,0x04,0x02,0x5f,0x03,0x01,0x02,0x02,0x3b,0x4d,\r\n0x05,0x01,0x00,0x00,0x06,0x5f,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x59,0x40,0x0f,0x00,0x00,0x00,0x14,0x00,0x14,0x13,0x21,0x24,0x11,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x15,0x33,0x36,0x36,0x37,0x37,0x15,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x46,0x91,0x87,0xda,0x01,0x0d,0x4e,0x39,0x64,0x63,0x42,\r\n0x4d,0xd3,0x52,0x01,0x82,0x52,0x88,0x3e,0x49,0x01,0x01,0x5b,0x43,0x3a,0xfd,0x52,0xff,0xff,0x00,0x46,0x00,0x00,0x02,0x23,0x03,0x11,0x00,0x27,0x06,0x6b,0x02,0x76,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,0xff,0xff,0x00,0x46,0x00,0x00,0x02,0x23,0x03,0x11,0x00,0x27,0x06,0x6f,0x02,0x6c,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,\r\n0xff,0xff,0x00,0x46,0xff,0x10,0x02,0x23,0x02,0x27,0x00,0x27,0x06,0x7a,0x02,0x1c,0x00,0x00,0x02,0x06,0x01,0xa3,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x15,0x00,0x22,0x40,0x1f,0x0b,0x05,0x02,0x00,0x01,0x01,0x4c,0x02,0x01,0x01,0x01,0x3b,0x4d,0x00,0x00,0x00,0x03,0x60,0x00,0x03,0x03,0x3d,0x03,0x4e,\r\n0x23,0x18,0x14,0x20,0x04,0x09,0x1a,0x2b,0x17,0x33,0x32,0x36,0x37,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x06,0x06,0x23,0x23,0x42,0x66,0x19,0x25,0x0b,0x12,0xcd,0x61,0x82,0x07,0x0f,0x03,0x03,0x0e,0x07,0x79,0x5f,0xdb,0x13,0x4c,0x31,0x75,0x61,0x1e,0x19,0x2a,0x02,0x26,0xfe,0x8a,0x14,0x2c,0x10,0x10,\r\n0x2c,0x14,0x01,0x76,0xfd,0x9a,0x37,0x3d,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,\r\n0x03,0x09,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x2b,0x02,0x22,0x02,0x26,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0xf8,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,\r\n0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x39,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0xe9,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x0c,0x02,0x26,0x01,0xa7,0x00,0x00,\r\n0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x02,0x26,0x00,0x14,0x00,0x4c,0xb5,0x03,0x01,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x13,0x05,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x39,0x00,0x4e,0x1b,0x40,0x17,0x05,0x04,0x02,0x02,0x02,0x3b,\r\n0x4d,0x00,0x00,0x00,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x06,0x09,0x1a,0x2b,0x01,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0xfc,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,\r\n0x5a,0x3f,0x36,0x38,0x41,0x02,0x26,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x14,0x00,0x18,0x00,0x6a,0xb5,0x03,0x01,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x00,0x05,0x06,0x05,0x85,0x08,0x01,0x06,0x02,0x06,\r\n0x85,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x39,0x00,0x4e,0x1b,0x40,0x22,0x00,0x05,0x06,0x05,0x85,0x08,0x01,0x06,0x02,0x06,0x85,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x00,0x00,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x40,0x15,0x15,0x15,0x00,0x00,\r\n0x15,0x18,0x15,0x18,0x17,0x16,0x00,0x14,0x00,0x14,0x23,0x13,0x24,0x11,0x09,0x09,0x1a,0x2b,0x01,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x27,0x37,0x33,0x07,0x01,0xfc,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0xb0,0x6a,0x61,0x6f,0x02,0x26,0xfd,\r\n0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x5f,0x8c,0x8c,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x0d,0x00,0x22,0x00,0x7a,0xb5,0x11,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x22,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x09,0x01,0x00,0x06,0x02,0x00,\r\n0x69,0x0a,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x62,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x0a,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x62,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x1d,\r\n0x0e,0x0e,0x01,0x00,0x0e,0x22,0x0e,0x22,0x1f,0x1d,0x1a,0x19,0x16,0x14,0x10,0x0f,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x0b,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,\r\n0x11,0x01,0x2c,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x88,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x80,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x5a,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,\r\n0x03,0x11,0x00,0x06,0x00,0x1b,0x00,0x75,0x40,0x0a,0x05,0x01,0x01,0x00,0x0a,0x01,0x06,0x05,0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x00,0x00,0x01,0x00,0x85,0x08,0x02,0x02,0x01,0x05,0x01,0x85,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x62,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x23,0x00,0x00,0x01,\r\n0x00,0x85,0x08,0x02,0x02,0x01,0x05,0x01,0x85,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x03,0x03,0x39,0x4d,0x00,0x06,0x06,0x04,0x62,0x00,0x04,0x04,0x3f,0x04,0x4e,0x59,0x40,0x19,0x07,0x07,0x00,0x00,0x07,0x1b,0x07,0x1b,0x18,0x16,0x13,0x12,0x0f,0x0d,0x09,0x08,0x00,0x06,0x00,0x06,0x11,0x11,0x0a,0x09,0x18,0x2b,0x13,0x37,0x33,\r\n0x17,0x23,0x27,0x07,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x77,0x8b,0x53,0x8c,0x63,0x52,0x50,0x01,0x20,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x4e,0x4e,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,\r\n0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x2c,0x00,0xa2,0xb5,0x1b,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x21,0x0a,0x02,0x09,0x03,0x00,0x00,0x01,0x61,0x03,0x01,0x01,0x01,0x40,0x4d,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,\r\n0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x03,0x01,0x01,0x0a,0x02,0x09,0x03,0x00,0x06,0x01,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x23,0x03,0x01,0x01,0x0a,0x02,0x09,0x03,0x00,0x06,0x01,0x00,0x69,0x0b,\r\n0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x2c,0x18,0x2c,0x29,0x27,0x24,0x23,0x20,0x1e,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x01,0x22,0x5a,0x01,0x07,0x4c,\r\n0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x63,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x02,0x00,0x5a,0xff,0x2b,0x01,0xfc,0x02,0x26,0x00,0x0b,0x00,0x20,0x00,0x68,0xb5,0x0f,0x01,0x05,\r\n0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1b,0x00,0x01,0x07,0x01,0x00,0x01,0x00,0x65,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x61,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x1f,0x00,0x01,0x07,0x01,0x00,0x01,0x00,0x65,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,\r\n0x61,0x00,0x03,0x03,0x3f,0x03,0x4e,0x59,0x40,0x19,0x0c,0x0c,0x01,0x00,0x0c,0x20,0x0c,0x20,0x1d,0x1b,0x18,0x17,0x14,0x12,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,\r\n0x33,0x32,0x36,0x35,0x11,0x01,0x2c,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xaf,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x02,0xfb,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,\r\n0x03,0x11,0x00,0x03,0x00,0x18,0x00,0x6d,0xb5,0x07,0x01,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x04,0x01,0x85,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x62,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x22,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x04,\r\n0x01,0x85,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x62,0x00,0x03,0x03,0x3f,0x03,0x4e,0x59,0x40,0x18,0x04,0x04,0x00,0x00,0x04,0x18,0x04,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x17,0x11,0x23,0x35,0x23,0x06,0x06,\r\n0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x0b,0x73,0x64,0x6e,0x92,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,\r\n0x03,0x39,0x00,0x0e,0x00,0x23,0x00,0xa6,0xb5,0x12,0x01,0x06,0x05,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x23,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x72,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x61,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,\r\n0x24,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,0x00,0x06,0x06,0x03,0x61,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x28,0x08,0x01,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x09,0x07,0x02,0x05,0x05,0x3b,0x4d,\r\n0x00,0x03,0x03,0x39,0x4d,0x00,0x06,0x06,0x04,0x61,0x00,0x04,0x04,0x3f,0x04,0x4e,0x59,0x59,0x40,0x19,0x0f,0x0f,0x00,0x00,0x0f,0x23,0x0f,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x0a,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x17,0x11,0x23,\r\n0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x02,0x32,0x0e,0x20,0x50,0x69,0x26,0x2f,0x11,0x28,0xa5,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x3f,0x13,0x0d,0x14,0x41,0x27,0x23,0x20,0x16,0x34,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,\r\n0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x01,0x00,0x5a,0xff,0xf6,0x02,0x58,0x02,0x94,0x00,0x1c,0x00,0x8f,0xb5,0x19,0x01,0x02,0x05,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1e,0x00,0x04,0x01,0x01,0x04,0x70,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x07,0x02,0x00,0x00,0x3f,\r\n0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x00,0x04,0x01,0x04,0x85,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x07,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x04,0x01,0x04,0x85,0x00,0x05,0x05,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,\r\n0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x59,0x40,0x15,0x01,0x00,0x18,0x17,0x16,0x15,0x12,0x11,0x0f,0x0d,0x0a,0x08,0x05,0x04,0x00,0x1c,0x01,0x1c,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x11,0x23,0x35,0x23,\r\n0x06,0x06,0x01,0x0f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x48,0x23,0x4b,0x2d,0x2f,0x5a,0x01,0x07,0x4c,0x0a,0x66,0x58,0x01,0x72,0xfe,0x98,0x3a,0x40,0x44,0x40,0x01,0x5e,0x23,0x4b,0x50,0x2b,0x34,0xfe,0x1b,0x69,0x37,0x3c,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x6b,\r\n0x02,0x62,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x2b,0x02,0x58,0x02,0x94,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x57,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x11,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x6a,0x02,0x4e,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x39,0x02,0x26,\r\n0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x74,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x02,0x58,0x03,0x0c,0x02,0x26,0x01,0xb8,0x00,0x00,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x02,0x10,0x03,0x11,0x00,0x03,0x00,0x07,0x00,0x1c,0x00,0x77,0xb5,0x0b,0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,\r\n0x50,0x58,0x40,0x1f,0x02,0x01,0x00,0x0a,0x03,0x09,0x03,0x01,0x06,0x00,0x01,0x67,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x23,0x02,0x01,0x00,0x0a,0x03,0x09,0x03,0x01,0x06,0x00,0x01,0x67,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,\r\n0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x20,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x1c,0x08,0x1c,0x19,0x17,0x14,0x13,0x10,0x0e,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x05,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,\r\n0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x46,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x01,0x12,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x85,0x8c,0x8c,0x8c,0x8c,0x5f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,\r\n0xff,0xf6,0x01,0xfc,0x02,0xe9,0x00,0x03,0x00,0x18,0x00,0x96,0xb5,0x07,0x01,0x05,0x04,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x05,0x05,0x02,0x61,0x03,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x22,\r\n0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3f,0x03,0x4e,0x1b,0x40,0x20,0x00,0x00,0x07,0x01,0x01,0x04,0x00,0x01,0x67,0x08,0x06,0x02,0x04,0x04,0x3b,0x4d,0x00,0x02,0x02,0x39,0x4d,0x00,0x05,0x05,0x03,0x61,0x00,\r\n0x03,0x03,0x3f,0x03,0x4e,0x59,0x59,0x40,0x18,0x04,0x04,0x00,0x00,0x04,0x18,0x04,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x8c,0x01,0x40,0x30,0x5a,\r\n0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x9e,0x4b,0x4b,0x78,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x35,0x02,0x20,0x02,0x26,0x00,0x23,0x00,0xa0,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0a,0x07,0x01,0x03,0x02,0x06,0x01,0x01,\r\n0x03,0x02,0x4c,0x1b,0x40,0x0a,0x07,0x01,0x03,0x02,0x06,0x01,0x05,0x03,0x02,0x4c,0x59,0x4b,0xb0,0x15,0x50,0x58,0x40,0x1d,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x05,0x01,0x01,0x01,0x3f,0x4d,0x00,0x06,0x06,0x00,0x5f,0x07,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x00,0x06,0x07,\r\n0x01,0x00,0x06,0x00,0x63,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x03,0x03,0x01,0x61,0x05,0x01,0x01,0x01,0x3f,0x01,0x4e,0x1b,0x40,0x1e,0x00,0x06,0x07,0x01,0x00,0x06,0x00,0x63,0x04,0x01,0x02,0x02,0x3b,0x4d,0x00,0x05,0x05,0x39,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3f,0x01,0x4e,0x59,0x59,0x40,0x15,0x01,0x00,0x22,0x20,\r\n0x1b,0x1a,0x19,0x18,0x15,0x13,0x10,0x0f,0x0c,0x0a,0x00,0x23,0x01,0x23,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0xd2,0x37,0x43,0x21,0x29,0x01,0x07,0x4c,0x3f,\r\n0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x5a,0x10,0x21,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1b,0x37,0x1e,0x67,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0xfd,0xda,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x44,0x00,0x0b,0x00,0x17,0x00,0x2c,0x00,0x84,0xb5,0x1b,\r\n0x01,0x07,0x06,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x25,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x07,0x07,0x04,0x61,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x29,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,\r\n0x01,0x00,0x06,0x02,0x00,0x69,0x0b,0x08,0x02,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x39,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x2c,0x18,0x2c,0x29,0x27,0x24,0x23,0x20,0x1e,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,\r\n0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x2c,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,\r\n0xeb,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x60,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x6f,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfc,0x03,0x0c,0x00,0x19,\r\n0x00,0x2e,0x00,0xfc,0xb5,0x1d,0x01,0x09,0x08,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2a,0x00,0x01,0x01,0x03,0x61,0x05,0x01,0x03,0x03,0x40,0x4d,0x02,0x0b,0x02,0x00,0x00,0x04,0x61,0x00,0x04,0x04,0x38,0x4d,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x09,0x09,0x06,0x61,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x4b,0xb0,0x18,\r\n0x50,0x58,0x40,0x28,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x02,0x0b,0x02,0x00,0x00,0x04,0x61,0x00,0x04,0x04,0x38,0x4d,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x09,0x09,0x06,0x61,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2a,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,\r\n0x0b,0x02,0x00,0x08,0x04,0x00,0x6a,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,0x09,0x09,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x40,0x38,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x0b,0x01,0x00,0x08,0x04,\r\n0x00,0x6a,0x0c,0x0a,0x02,0x08,0x08,0x3b,0x4d,0x00,0x06,0x06,0x39,0x4d,0x00,0x09,0x09,0x07,0x61,0x00,0x07,0x07,0x3f,0x07,0x4e,0x59,0x59,0x59,0x40,0x21,0x1a,0x1a,0x01,0x00,0x1a,0x2e,0x1a,0x2e,0x2b,0x29,0x26,0x25,0x22,0x20,0x1c,0x1b,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0d,0x09,0x16,0x2b,\r\n0x01,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x17,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,\r\n0x61,0x5a,0x01,0x07,0x4c,0x3f,0x52,0x63,0x5a,0x3f,0x36,0x38,0x41,0x02,0x8a,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x64,0xfd,0xda,0x69,0x37,0x3c,0x66,0x58,0x01,0x72,0xfe,0x9e,0x3f,0x43,0x46,0x40,0x01,0x5e,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x2e,0x02,0xe4,0x00,0x17,\r\n0x00,0x3d,0x40,0x3a,0x00,0x01,0x02,0x03,0x02,0x01,0x03,0x80,0x07,0x01,0x03,0x06,0x01,0x04,0x05,0x03,0x04,0x67,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x3e,0x4d,0x00,0x05,0x05,0x39,0x05,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x08,0x06,0x04,0x03,0x00,0x17,0x01,0x17,0x09,0x09,0x16,0x2b,0x01,\r\n0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x01,0x75,0x53,0x66,0x58,0x36,0x2b,0x2b,0x37,0xe1,0xe1,0x5a,0x96,0x96,0x68,0x02,0xe4,0x62,0x54,0x2f,0x37,0x37,0x2f,0x8f,0x52,0xfe,0xb3,0x01,0x4d,0x52,0x8f,0x54,0x62,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x09,\r\n0x02,0xda,0x00,0x16,0x00,0x37,0x40,0x34,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x06,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x3b,0x4d,0x07,0x01,0x00,0x00,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x11,0x11,0x12,0x21,0x23,0x11,0x11,0x11,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x33,\r\n0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x41,0x9b,0x9b,0x9b,0x52,0x48,0x93,0x93,0x40,0xd3,0xd3,0xd3,0x52,0x01,0x84,0x50,0x2a,0x41,0x49,0x50,0x3a,0x2a,0x50,0xfe,0x7c,0x52,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x12,0x00,0x2f,0x40,0x2c,\r\n0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x05,0x01,0x00,0x00,0x01,0x5f,0x04,0x01,0x01,0x01,0x3b,0x4d,0x07,0x01,0x06,0x06,0x39,0x06,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x12,0x21,0x23,0x11,0x11,0x08,0x09,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,\r\n0xd7,0xa0,0xa0,0x52,0x48,0xa1,0xa1,0x40,0xe1,0xe1,0x01,0xd4,0x52,0x28,0x41,0x4b,0x52,0x3a,0x28,0x52,0xfe,0x2c,0x00,0x00,0x00,0x02,0x00,0xaf,0x01,0xc2,0x01,0xa4,0x02,0xe4,0x00,0x1b,0x00,0x25,0x00,0x8f,0xb5,0x18,0x01,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x04,\r\n0x00,0x02,0x03,0x04,0x02,0x69,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x67,0x09,0x01,0x06,0x00,0x00,0x06,0x59,0x09,0x01,0x06,0x06,0x00,0x61,0x05,0x08,0x02,0x00,0x06,0x00,0x51,0x1b,0x40,0x33,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x05,0x06,0x00,0x06,0x05,0x00,0x80,0x00,0x04,0x00,0x02,0x03,0x04,0x02,0x69,0x00,0x01,0x00,\r\n0x07,0x06,0x01,0x07,0x67,0x09,0x01,0x06,0x05,0x00,0x06,0x59,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x06,0x00,0x51,0x59,0x40,0x1b,0x1d,0x1c,0x01,0x00,0x22,0x20,0x1c,0x25,0x1d,0x25,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x1b,0x01,0x1b,0x0a,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,\r\n0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x22,0x15,0x14,0x16,0x01,0x12,0x2d,0x36,0x38,0x31,0x5a,0x23,0x1e,0x1a,0x24,0x03,0x32,0x05,0x3d,0x31,0x35,0x3e,0x2f,0x03,0x0a,0x33,0x16,0x27,0x2c,0x5a,0x37,0x22,0x01,0xc2,0x2f,0x27,0x27,0x2e,0x1d,\r\n0x17,0x1b,0x16,0x12,0x26,0x2a,0x30,0x2a,0xc3,0x37,0x1c,0x20,0x26,0x24,0x1f,0x1a,0x2d,0x16,0x1a,0x00,0x00,0x02,0x00,0xb9,0x01,0xbd,0x01,0x9f,0x02,0xdf,0x00,0x0d,0x00,0x1b,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,\r\n0x51,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x34,0x3f,0x3f,0x34,0x34,0x3f,0x3f,0x34,0x1d,0x24,0x24,0x1d,0x1d,\r\n0x24,0x24,0x01,0xbd,0x3a,0x2f,0x50,0x2f,0x3a,0x3a,0x2f,0x50,0x2f,0x3a,0x28,0x24,0x1d,0x50,0x1d,0x24,0x24,0x1d,0x50,0x1d,0x24,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x5e,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x0c,0x00,0x15,0x00,0x31,0x40,0x2e,0x00,0x02,\r\n0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x15,0x13,0x0f,0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x11,0x07,0x07,0x19,0x2b,0x33,0x11,0x21,0x15,0x21,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x23,0x5e,0x01,0x96,0xfe,0xc4,0x79,0x68,0x79,0x79,0x68,0x79,0x79,0x3e,0x46,0x46,0x3e,0x79,0x02,0xda,0x52,0xd8,0x76,0x62,0x61,0x77,0x52,0x49,0x3d,0x3e,0x48,0x00,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x12,0x02,0xda,0x02,0x06,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x05,\r\n0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x07,0x18,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x82,0x01,0xa9,0xfe,0xb1,0x02,0xda,0x52,0xfd,0x78,0x00,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x2b,0x03,0xb6,0x02,0x26,\r\n0x01,0xcb,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x76,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x2b,0x03,0x39,0x00,0x07,0x00,0x47,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,\r\n0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x35,0x33,0x15,0x21,0x11,0x82,0x01,0x54,0x55,0xfe,0xb1,0x02,0xda,0x5f,0xb1,0xfd,0x78,0x00,0x00,0x00,0x00,0x02,0x00,0x19,0xff,0x74,0x02,0x3f,\r\n0x02,0xda,0x00,0x0e,0x00,0x15,0x00,0x33,0x40,0x30,0x08,0x05,0x02,0x03,0x00,0x03,0x53,0x00,0x07,0x07,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x02,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x00,0x0e,0x00,0x0e,0x11,0x11,0x11,0x14,0x11,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x36,0x36,\r\n0x37,0x13,0x21,0x11,0x33,0x15,0x23,0x35,0x21,0x15,0x37,0x33,0x11,0x23,0x03,0x06,0x06,0x19,0x2d,0x11,0x24,0x01,0x07,0x01,0x76,0x46,0x50,0xfe,0x7a,0x3b,0xfb,0xc6,0x05,0x01,0x20,0x8c,0xd9,0x1e,0x79,0x46,0x01,0xb0,0xfd,0x73,0xd9,0x8c,0x8c,0xd9,0x02,0x3d,0xfe,0xa0,0x4d,0x76,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,\r\n0x02,0xda,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x08,0x03,0xb1,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x06,0x00,0x00,0x02,0x52,0x02,0xda,0x00,0x15,0x00,0x36,0x40,0x33,0x0c,0x01,0x02,0x06,0x01,0x01,0x4c,0x03,0x01,0x01,0x08,0x01,0x06,0x05,0x01,0x06,\r\n0x67,0x04,0x02,0x02,0x00,0x00,0x1a,0x4d,0x0a,0x09,0x07,0x03,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x15,0x00,0x15,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x0b,0x07,0x1f,0x2b,0x33,0x13,0x03,0x33,0x13,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x23,0x03,0x23,0x11,0x23,0x11,0x23,0x03,0x06,0x86,0x7c,0x5e,0x6a,0x2e,\r\n0x4c,0x30,0x68,0x5e,0x7d,0x87,0x5d,0x75,0x2e,0x4c,0x30,0x74,0x01,0x7b,0x01,0x5f,0xfe,0xc1,0x01,0x3f,0xfe,0xc1,0x01,0x3f,0xfe,0xa0,0xfe,0x86,0x01,0x57,0xfe,0xa9,0x01,0x57,0xfe,0xa9,0x00,0x01,0x00,0x34,0xff,0xf6,0x02,0x16,0x02,0xe4,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x26,0x01,0x03,0x04,0x01,0x4c,0x00,0x06,0x05,0x04,0x05,0x06,\r\n0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x1f,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x20,0x1e,0x1b,0x1a,0x18,0x16,0x12,0x10,0x0f,0x0d,0x09,0x07,0x05,0x04,0x00,0x2d,0x01,0x2d,0x09,0x07,0x16,0x2b,\r\n0x05,0x22,0x26,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x23,0x46,0x6b,0x3d,0x01,0x5a,0x02,0x53,0x41,0x43,0x53,0x53,0x43,0x56,0x57,0x39,0x47,\r\n0x46,0x38,0x3b,0x4a,0x5a,0x39,0x64,0x42,0x40,0x61,0x37,0x41,0x34,0x3e,0x4e,0x3d,0x6e,0x0a,0x35,0x5f,0x3e,0x3a,0x48,0x4b,0x3c,0x3c,0x4b,0x50,0x44,0x36,0x35,0x41,0x48,0x3a,0x3f,0x5e,0x35,0x30,0x55,0x38,0x3c,0x5b,0x0d,0x03,0x0b,0x67,0x47,0x3e,0x5e,0x35,0x00,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x11,\r\n0x00,0x24,0x40,0x21,0x10,0x07,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1a,0x4d,0x04,0x03,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x06,0x07,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x36,0x37,0x03,0x5a,0x57,0x03,0x04,0x02,0xde,0x78,0x57,\r\n0x03,0x05,0x02,0xdf,0x02,0xda,0xfe,0x66,0x24,0x51,0x49,0x19,0x02,0x71,0xfd,0x26,0x01,0x9a,0x25,0x51,0x49,0x18,0xfd,0x8f,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb6,0x02,0x26,0x01,0xd3,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0x51,0x00,0x00,\r\n0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x03,0xb6,0x02,0x26,0x00,0x51,0x00,0x00,0x00,0x07,0x06,0x91,0x02,0x62,0x00,0x00,0x00,0x01,0x00,0x14,0xff,0xfb,0x01,0xfa,0x02,0xda,0x00,0x0f,0x00,0x4d,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x17,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x00,0x00,0x02,0x61,0x05,0x04,0x02,0x02,\r\n0x02,0x1b,0x02,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x22,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x0f,0x00,0x0e,0x11,0x11,0x13,0x21,0x06,0x07,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x23,0x11,0x23,0x03,\r\n0x06,0x06,0x23,0x14,0x12,0x2c,0x27,0x01,0x08,0x01,0x78,0x5a,0xc5,0x07,0x02,0x51,0x56,0x05,0x54,0x4f,0x60,0x01,0xdc,0xfd,0x26,0x02,0x88,0xfe,0x76,0x86,0x7d,0x00,0xff,0xff,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0xda,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x02,0x06,0x00,0x40,0x00,0x00,\r\n0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x02,0x06,0x00,0x60,0x00,0x00,0x00,0x01,0x00,0x5e,0x00,0x00,0x01,0xfa,0x02,0xda,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x04,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,\r\n0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x5e,0x01,0x9c,0x5a,0xe8,0x02,0xda,0xfd,0x26,0x02,0x88,0xfd,0x78,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x7a,0x00,0x00,0xff,0xff,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x02,0x06,0x00,0x1b,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x02,0xda,0x02,0x06,\r\n0x00,0x89,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x22,0x40,0x1f,0x07,0x01,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1a,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x18,0x12,0x04,0x07,0x18,0x2b,0x33,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,\r\n0x33,0x01,0xbf,0x4a,0xd7,0x62,0x83,0x0d,0x10,0x02,0x02,0x0e,0x0b,0x73,0x62,0xfe,0xf9,0xbd,0x02,0x1d,0xfe,0x9b,0x22,0x3d,0x0f,0x0f,0x3d,0x22,0x01,0x65,0xfd,0x26,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x01,0xdf,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x2e,0xff,0xe7,0x02,0x2a,\r\n0x03,0x02,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0xb2,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x2c,0x00,0x02,0x01,0x01,0x02,0x70,0x0a,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x1b,0x4b,0xb0,\r\n0x11,0x50,0x58,0x40,0x2b,0x00,0x02,0x01,0x01,0x02,0x70,0x0a,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x1b,0x40,0x2a,0x00,0x02,0x01,0x02,0x85,0x0a,0x01,0x05,0x00,0x05,0x86,0x03,0x01,\r\n0x01,0x09,0x01,0x06,0x07,0x01,0x06,0x6a,0x08,0x0b,0x02,0x07,0x00,0x00,0x07,0x59,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x07,0x00,0x51,0x59,0x59,0x40,0x1a,0x18,0x18,0x00,0x00,0x27,0x26,0x21,0x20,0x18,0x1f,0x18,0x1f,0x1a,0x19,0x00,0x17,0x00,0x17,0x17,0x11,0x11,0x17,0x11,0x0c,0x07,0x1b,0x2b,0x17,0x35,0x22,0x26,\r\n0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x35,0x33,0x15,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x15,0x27,0x11,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0xff,0x3c,0x5e,0x37,0x36,0x5f,0x3c,0x5a,0x3d,0x5e,0x36,0x37,0x5e,0x3c,0x56,0x38,0x49,0x49,0x8a,0x38,0x49,0x49,0x38,0x19,0x50,0x34,0x5d,0x3f,\r\n0xdb,0x41,0x5f,0x35,0x4b,0x4b,0x35,0x5f,0x41,0xdb,0x3f,0x5d,0x34,0x50,0x9c,0x01,0xe8,0x49,0x40,0xdb,0x3d,0x47,0x47,0x3d,0xdb,0x40,0x49,0x00,0xff,0xff,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x01,0xf9,0x02,0xda,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x02,0x00,0x00,\r\n0x04,0x02,0x00,0x67,0x03,0x01,0x01,0x01,0x1a,0x4d,0x05,0x01,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x21,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x01,0x9f,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x01,0x0f,0x60,0x54,0x01,0x17,0xfe,\r\n0xe9,0x30,0x34,0x01,0x7b,0xfd,0x26,0x00,0x00,0x01,0x00,0x5e,0xff,0x74,0x02,0x35,0x02,0xda,0x00,0x0b,0x00,0x29,0x40,0x26,0x06,0x01,0x05,0x02,0x05,0x54,0x03,0x01,0x01,0x01,0x1a,0x4d,0x04,0x01,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x05,\r\n0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0xe5,0xfe,0x79,0x5a,0xd8,0x5a,0x4b,0x8c,0x8c,0x02,0xda,0xfd,0x76,0x02,0x8a,0xfd,0x76,0xdc,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x25,0x40,0x22,0x04,0x02,0x02,0x00,0x00,0x1a,0x4d,0x03,0x01,0x01,0x01,0x05,0x60,0x06,0x01,0x05,\r\n0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x03,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x3e,0x02,0x55,0x77,0x4a,0x76,0x54,0x02,0xda,0xfd,0x74,0x02,0x8c,0xfd,0x74,0x02,0x8c,0xfd,0x26,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x74,0x02,0x53,0x02,0xda,0x00,0x0f,\r\n0x00,0x2d,0x40,0x2a,0x08,0x01,0x07,0x02,0x07,0x54,0x05,0x03,0x02,0x01,0x01,0x1a,0x4d,0x06,0x04,0x02,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x02,\r\n0x03,0xfe,0x39,0x51,0x78,0x46,0x78,0x51,0x3f,0x8c,0x8c,0x02,0xda,0xfd,0x74,0x02,0x8c,0xfd,0x74,0x02,0x8c,0xfd,0x74,0xda,0x00,0x01,0x00,0x5e,0xff,0x83,0x01,0xfa,0x02,0xda,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x19,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,\r\n0x01,0x00,0x00,0x1b,0x00,0x4e,0x1b,0x40,0x18,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x01,0x1a,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,0x01,0x00,0x00,0x1b,0x00,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x17,0x35,0x23,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x15,0xff,\r\n0xa1,0x5a,0xe8,0x5a,0xa1,0x7d,0x7d,0x02,0xda,0xfd,0x78,0x02,0x88,0xfd,0x26,0x7d,0x00,0x02,0x00,0x5e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x15,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x1a,0x4d,0x00,0x03,0x03,0x02,0x60,0x05,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x15,0x13,0x0f,\r\n0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x06,0x07,0x18,0x2b,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5e,0x5a,0x92,0x42,0x63,0x37,0x37,0x63,0x42,0x92,0x8d,0x3b,0x49,0x49,0x3b,0x8d,0x02,0xda,0xfe,0xd4,0x36,0x60,0x41,0x40,0x61,0x36,0x52,0x49,0x3c,0x3c,0x49,\r\n0x00,0x02,0xff,0xfb,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x17,0x15,0x11,0x0f,0x00,0x0e,0x00,0x0d,0x21,0x11,0x11,0x07,0x07,0x19,\r\n0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x87,0x8c,0xe6,0x69,0x42,0x63,0x37,0x37,0x63,0x42,0x69,0x64,0x3b,0x49,0x49,0x3b,0x64,0x02,0x88,0x52,0xfe,0xd4,0x36,0x60,0x41,0x40,0x61,0x36,0x52,0x49,0x3c,0x3c,0x49,0x00,0x00,0x00,0x03,0x00,0x3c,\r\n0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x19,0x00,0x36,0x40,0x33,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x03,0x01,0x00,0x00,0x1a,0x4d,0x00,0x05,0x05,0x02,0x60,0x08,0x04,0x07,0x03,0x02,0x02,0x1b,0x02,0x4e,0x0c,0x0c,0x00,0x00,0x19,0x17,0x12,0x10,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0a,0x21,0x11,\r\n0x09,0x07,0x18,0x2b,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x3c,0x54,0x2e,0x5a,0x6a,0x6a,0x5a,0x01,0x0a,0x54,0xfe,0x74,0x2e,0x33,0x3d,0x3d,0x33,0x2e,0x02,0xda,0xfe,0xd4,0x66,0x58,0x33,0x57,0x66,0x02,0xda,0xfd,0x26,0x4f,0x3c,0x33,\r\n0x32,0x33,0x3c,0x00,0x00,0x02,0xff,0xfb,0xff,0xfb,0x02,0x44,0x02,0xda,0x00,0x17,0x00,0x21,0x00,0x6a,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x20,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x01,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x2a,0x00,0x02,\r\n0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x06,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x03,0x1b,0x4d,0x06,0x01,0x00,0x00,0x05,0x61,0x08,0x01,0x05,0x05,0x22,0x05,0x4e,0x59,0x40,0x12,0x00,0x00,0x21,0x1f,0x1a,0x18,0x00,0x17,0x00,0x16,0x11,0x25,0x21,0x13,0x21,0x09,0x07,0x1b,0x2b,0x07,0x35,\r\n0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x03,0x06,0x06,0x23,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x05,0x12,0x1d,0x1a,0x01,0x05,0x01,0x1e,0x3c,0x48,0x58,0x58,0x48,0x8c,0x7b,0x04,0x01,0x46,0x48,0x01,0x5e,0x3c,0x24,0x28,0x28,0x24,0x3c,0x05,0x50,0x39,0x3e,0x02,\r\n0x18,0xfe,0xd4,0x55,0x46,0x78,0x46,0x55,0x02,0x8f,0xfe,0x33,0x68,0x5f,0x50,0x2c,0x24,0x78,0x24,0x2c,0x00,0x02,0x00,0x35,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x13,0x00,0x1d,0x00,0x33,0x40,0x30,0x03,0x01,0x01,0x08,0x01,0x05,0x07,0x01,0x05,0x69,0x02,0x01,0x00,0x00,0x1a,0x4d,0x00,0x07,0x07,0x04,0x60,0x09,0x06,0x02,0x04,0x04,\r\n0x1b,0x04,0x4e,0x00,0x00,0x1d,0x1b,0x16,0x14,0x00,0x13,0x00,0x13,0x11,0x25,0x21,0x11,0x11,0x11,0x0a,0x07,0x1c,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x37,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x35,0x50,0x93,0x50,0x3c,0x4a,0x56,0x56,0x4a,0x8c,0x93,\r\n0xe3,0x3c,0x26,0x2a,0x2a,0x26,0x3c,0x02,0xda,0xfe,0xd4,0x01,0x2c,0xfe,0xd4,0x54,0x47,0x78,0x47,0x54,0x01,0x63,0xfe,0x9d,0x4b,0x2b,0x25,0x78,0x26,0x2a,0x00,0x00,0xff,0xff,0x00,0x48,0xff,0xf6,0x02,0x10,0x02,0xe4,0x02,0x06,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x1f,0x00,0x48,0x40,0x45,\r\n0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x1f,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x13,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,\r\n0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0xdf,0xdf,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,0x01,0x4a,\r\n0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0x6f,0x52,0x89,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x4e,0xff,0xf6,0x01,0xfc,0x02,0xe4,0x00,0x1f,0x00,0x3b,0x40,0x38,0x00,0x05,0x04,0x03,0x04,0x05,0x03,0x80,0x00,0x00,0x02,0x01,0x02,0x00,0x01,0x80,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x04,0x04,0x06,\r\n0x61,0x00,0x06,0x06,0x1f,0x4d,0x00,0x01,0x01,0x07,0x61,0x00,0x07,0x07,0x20,0x07,0x4e,0x25,0x22,0x12,0x23,0x11,0x13,0x22,0x10,0x08,0x07,0x1e,0x2b,0x37,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x4e,0x5a,0x42,\r\n0x3a,0x3b,0x43,0xdf,0xdf,0x43,0x3b,0x3a,0x42,0x5a,0x74,0x62,0x64,0x74,0x74,0x64,0x62,0x74,0xc8,0x3e,0x43,0x43,0x3e,0x89,0x52,0x6f,0x3e,0x43,0x43,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x62,0x70,0x71,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,\r\n0x03,0xb1,0x02,0x26,0x00,0x43,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x2d,0xff,0xf6,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x16,0x00,0x34,0x40,0x31,0x15,0x07,0x02,0x04,0x05,0x01,0x4c,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x02,\r\n0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1a,0x4d,0x07,0x06,0x02,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x16,0x00,0x16,0x22,0x13,0x23,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x23,0x22,0x07,0x07,0x11,0x6e,0x6e,0x01,0x40,0x78,0x10,0x4c,\r\n0x57,0x47,0x55,0x5a,0x57,0x31,0x3a,0x33,0x02,0x8b,0x4f,0x4f,0xfa,0x11,0x52,0x61,0x52,0xfe,0xbf,0x01,0x2d,0x77,0x3d,0x36,0xfe,0xcf,0x00,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x3a,0x02,0xe4,0x00,0x15,0x00,0x23,0x00,0x73,0x4b,0xb0,0x18,0x50,0x58,0x40,0x21,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x07,0x07,0x03,0x61,\r\n0x05,0x01,0x03,0x03,0x1a,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x02,0x08,0x02,0x00,0x00,0x20,0x00,0x4e,0x1b,0x40,0x29,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x03,0x03,0x1a,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x1f,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,\r\n0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x15,0x01,0x15,0x0a,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x11,0x23,0x11,0x33,0x11,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,\r\n0x11,0x14,0x16,0x01,0x90,0x4b,0x58,0x5e,0x53,0x53,0x5e,0x58,0x4b,0x4e,0x5c,0x5c,0x4e,0x29,0x2e,0x2e,0x29,0x29,0x2e,0x2e,0x0a,0x64,0x55,0xa2,0xfe,0xaf,0x02,0xda,0xfe,0xc7,0x8a,0x56,0x63,0x63,0x56,0xfe,0x84,0x55,0x64,0x4a,0x3a,0x35,0x01,0x7c,0x35,0x3a,0x3a,0x35,0xfe,0x84,0x35,0x3a,0x00,0x02,0x00,0x38,0x00,0x00,0x01,0xf9,\r\n0x02,0xda,0x00,0x0e,0x00,0x17,0x00,0x38,0x40,0x35,0x01,0x01,0x02,0x04,0x01,0x4c,0x07,0x01,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x1a,0x4d,0x06,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x10,0x0f,0x00,0x00,0x13,0x11,0x0f,0x17,0x10,0x17,0x00,0x0e,0x00,0x0e,0x11,0x11,0x27,0x08,0x07,0x19,0x2b,\r\n0x33,0x13,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x11,0x23,0x11,0x23,0x03,0x13,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x38,0x96,0x42,0x4c,0x36,0x62,0x41,0xe0,0x5a,0x74,0x8b,0x79,0x86,0x86,0x37,0x45,0x44,0x01,0x40,0x14,0x6a,0x4a,0x3f,0x5e,0x35,0xfd,0x26,0x01,0x36,0xfe,0xca,0x01,0x86,0x01,0x04,0x47,0x3b,0x3a,0x48,0x00,\r\n0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x1e,0x00,0x3e,0x40,0x3b,0x14,0x0b,0x02,0x02,0x01,0x01,0x4c,0x00,0x06,0x00,0x01,0x02,0x06,0x01,0x69,0x05,0x01,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x07,0x61,0x08,0x01,0x07,0x07,0x1e,0x07,0x4e,0x00,0x00,0x00,0x1e,0x00,\r\n0x1d,0x23,0x11,0x11,0x11,0x13,0x24,0x21,0x09,0x07,0x1d,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x23,0x22,0x07,0x07,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x04,0x46,0x35,0x3e,0x57,0x31,0x3a,0x33,0x5a,0x6e,0x01,0x40,0x78,0x10,0x4c,0x57,0x47,0x55,0x70,0x5d,\r\n0xb4,0x52,0x3d,0x34,0x01,0x1e,0x77,0x3d,0x36,0xfe,0xcf,0x02,0x8b,0x4f,0x4f,0xfa,0x11,0x52,0x61,0x52,0xfe,0xce,0x58,0x6b,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x04,0x01,0x01,0x05,0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x1a,0x4d,0x07,0x01,0x06,0x06,\r\n0x1b,0x06,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x11,0x82,0x64,0x64,0x01,0xa9,0xfe,0xb1,0xa0,0xa0,0x01,0x46,0x50,0x01,0x44,0x52,0xf2,0x50,0xfe,0xba,0x00,0x01,0x00,0x51,0xff,0x74,0x02,0x49,0x02,0xda,0x00,0x10,\r\n0x00,0x36,0x40,0x33,0x07,0x01,0x06,0x01,0x01,0x4c,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1a,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x10,0x00,0x10,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,\r\n0x13,0x33,0x15,0x23,0x35,0x23,0x03,0x23,0x11,0x51,0x5a,0x6c,0xa2,0x62,0xb5,0x97,0x4c,0x50,0x3b,0xaa,0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0xd6,0xdc,0x8c,0x01,0x51,0xfe,0xaf,0x00,0x00,0x00,0x00,0x01,0x00,0x59,0xff,0x74,0x02,0x26,0x02,0xda,0x00,0x0f,0x00,0x30,0x40,0x2d,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,\r\n0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1a,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x23,0x11,0x23,0x11,0x59,0x5a,0xea,0x5a,0x2f,0x50,0x39,0xea,0x02,0xda,\r\n0xfe,0xc8,0x01,0x38,0xfd,0x76,0xdc,0x8c,0x01,0x50,0xfe,0xb0,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x02,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x14,0x00,0x2f,0x40,0x2c,0x08,0x01,0x00,0x01,0x01,0x4c,0x03,0x01,0x00,0x07,0x06,0x02,0x04,0x05,0x00,0x04,0x68,0x02,0x01,0x01,\r\n0x01,0x1a,0x4d,0x00,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x18,0x11,0x11,0x08,0x07,0x1c,0x2b,0x37,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x23,0x35,0x7d,0x82,0xdc,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xdc,0x82,0x82,0x5a,0xc6,\r\n0x4b,0x01,0xc9,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x37,0x4b,0xc6,0xc6,0x00,0x00,0x00,0x01,0x00,0x41,0xff,0x74,0x02,0x1e,0x02,0xda,0x00,0x13,0x00,0x2e,0x40,0x2b,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x00,0x05,0x04,0x05,0x63,0x03,0x01,0x01,0x01,0x1a,0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,\r\n0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x23,0x13,0x21,0x08,0x07,0x1c,0x2b,0x21,0x11,0x23,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x01,0x95,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x2f,0x50,0x01,0x0f,0x60,0x54,0x01,0x17,0xfe,0xe9,0x30,0x34,0x01,0x7b,0xfd,0x76,0xdc,0x8c,\r\n0x00,0x01,0x00,0x5f,0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x67,0x05,0x01,0x04,0x04,0x1a,0x4d,0x03,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,\r\n0x11,0x23,0x11,0xb9,0x8c,0x5e,0x6a,0x5a,0x3f,0x39,0x82,0x5a,0x02,0xda,0xfe,0xf1,0x60,0x54,0xfe,0xe9,0x01,0x17,0x30,0x34,0xfe,0x85,0x02,0xda,0x00,0x02,0x00,0x54,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x16,0x00,0x1f,0x00,0x43,0x40,0x40,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x67,0x00,0x02,\r\n0x02,0x04,0x61,0x00,0x04,0x04,0x1f,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x11,0x0f,0x0d,0x0c,0x0a,0x08,0x05,0x04,0x00,0x16,0x01,0x16,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x21,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x29,0x62,0x73,0x01,0x50,0x42,0x39,0x39,0x42,0x5a,0x73,0x62,0x62,0x73,0x73,0x62,0x39,0x42,0xf6,0x42,0x0a,0x71,0x61,0xd1,0x7a,0x3b,0x46,0x46,0x3c,0x61,0x71,0x71,0x61,0xfe,0xb6,0x61,0x71,0x50,0x46,0x3c,0x7f,0x7f,0x3c,0x46,0xff,0xff,0x00,0x06,\r\n0x00,0x00,0x02,0x52,0x03,0xb1,0x02,0x26,0x01,0xd1,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x34,0xff,0xf6,0x02,0x16,0x03,0xb1,0x02,0x26,0x01,0xd2,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x03,0xb1,0x02,0x26,0x01,0xd3,0x00,0x00,0x00,0x07,0x06,0x8e,\r\n0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x03,0xb1,0x02,0x26,0x00,0x60,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xe4,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,\r\n0x1f,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,0x0d,0x01,0x0d,0x08,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,\r\n0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x62,0x70,0x70,0x62,0x62,0x70,0x70,0xdb,0xf2,0x3e,0x3b,0x3b,0x3e,0x79,0x3b,0x3e,0xf2,0x3f,0x0a,0x71,0x62,0x01,0x49,0x62,0x70,0x70,0x62,0xfe,0xb7,0x61,0x72,0x01,0xa8,0x74,0x40,0x43,0x43,0x40,0xfe,0x33,0x44,0x40,0x85,0x85,0x40,0x44,0x00,0xff,0xff,0x00,0x4b,0x00,0x00,0x01,0xf9,\r\n0x03,0xb1,0x02,0x26,0x01,0xe3,0x00,0x00,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x38,0x40,0x35,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x04,0x02,0x02,0x00,0x00,0x38,0x4d,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x39,0x01,0x4e,0x0c,\r\n0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x09,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x13,0x03,0x33,0x13,0x03,0x33,0x11,0x33,0x11,0x01,0xf1,0x8b,0x8b,0x53,0x88,0x92,0xfd,0xbc,0x92,0x88,0x54,0x8a,0x8b,0x9f,0x4c,0x01,0x7c,0x01,0x5e,0xfe,0xa2,\r\n0xfe,0x84,0x01,0x7e,0x01,0x5c,0xfe,0xa2,0xfe,0x84,0x02,0xda,0xfd,0x26,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xba,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x03,0xb6,0x00,0x27,0x06,0x91,0x02,0x62,0x00,0x00,0x02,0x06,0x00,0xba,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x74,0x02,0x47,\r\n0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x34,0x40,0x31,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x38,0x4d,0x07,0x05,0x06,0x03,0x03,0x03,0x39,0x03,0x4e,0x0b,0x0b,0x00,0x00,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x0a,0x11,0x22,0x12,0x08,0x09,0x19,0x2b,0x21,0x03,0x13,0x33,\r\n0x03,0x13,0x35,0x33,0x15,0x23,0x35,0x21,0x11,0x33,0x11,0x01,0xba,0xf9,0xf9,0x67,0xf0,0xc6,0x50,0x50,0xfe,0x61,0x5a,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0xd3,0x01,0xdc,0x8c,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x14,0x00,0x28,0x40,0x25,0x0b,0x05,0x02,0x00,0x01,0x01,0x4c,0x02,\r\n0x01,0x01,0x01,0x38,0x4d,0x00,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x14,0x00,0x13,0x18,0x13,0x21,0x05,0x09,0x19,0x2b,0x33,0x35,0x33,0x32,0x37,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x06,0x06,0x23,0x42,0x6a,0x33,0x16,0x14,0xd7,0x62,0x83,0x0d,0x10,0x02,0x02,0x0e,\r\n0x0b,0x73,0x62,0xda,0x13,0x4d,0x31,0x53,0x37,0x33,0x02,0x1d,0xfe,0x9b,0x22,0x3d,0x0f,0x0f,0x3d,0x22,0x01,0x65,0xfd,0x9a,0x37,0x3d,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb6,0x02,0x26,0x02,0x09,0x00,0x00,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,\r\n0x00,0x1f,0x00,0x77,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x08,0x01,0x01,0x02,0x01,0x63,0x00,0x03,0x03,0x06,0x5f,0x00,0x06,0x06,0x3b,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x06,0x00,0x03,0x04,0x06,\r\n0x03,0x67,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x01,0x01,0x02,0x59,0x09,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x59,0x40,0x1a,0x05,0x04,0x00,0x00,0x1a,0x18,0x16,0x15,0x13,0x11,0x0c,0x0a,0x08,0x07,0x04,0x1f,0x05,0x1f,0x00,0x03,0x00,0x03,0x11,0x0a,0x09,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,\r\n0x32,0x36,0x35,0x23,0x14,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x33,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x02,0x58,0xfe,0xdc,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x62,0x64,0x74,0x74,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x01,0x22,0x71,0x61,0x3e,0x43,0x43,0x3e,0x01,0x4a,\r\n0x3e,0x43,0x43,0x3e,0x61,0x71,0x70,0x62,0xfe,0xb6,0x62,0x70,0xff,0xff,0x00,0x43,0xff,0xf6,0x01,0xfc,0x02,0x30,0x02,0x06,0x00,0xbd,0x00,0x00,0x00,0x02,0x00,0x56,0xff,0xf6,0x02,0x02,0x02,0xe4,0x00,0x16,0x00,0x24,0x00,0x36,0x40,0x33,0x0d,0x01,0x02,0x03,0x01,0x4c,0x09,0x08,0x02,0x01,0x4a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,\r\n0x69,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1f,0x1d,0x17,0x24,0x18,0x24,0x11,0x0f,0x00,0x16,0x01,0x16,0x06,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x37,0x15,0x07,0x06,0x15,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,\r\n0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x63,0x73,0x6d,0x6a,0xb6,0xa8,0x9a,0x0c,0x51,0x3e,0x5f,0x67,0x73,0x63,0x3a,0x42,0x42,0x3a,0x3a,0x42,0x42,0x0a,0x74,0x63,0xfd,0x79,0x86,0x0a,0x11,0x59,0x0f,0x0e,0xa4,0x2d,0x30,0x37,0x74,0x61,0x62,0x63,0x74,0x50,0x49,0x3e,0x62,0x3e,0x49,0x49,0x3e,0x62,0x3e,0x49,0x00,0x00,0x00,\r\n0x00,0x03,0x00,0x5c,0x00,0x00,0x02,0x0d,0x02,0x26,0x00,0x0f,0x00,0x18,0x00,0x21,0x00,0x39,0x40,0x36,0x08,0x01,0x05,0x02,0x01,0x4c,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x00,0x04,0x04,0x01,0x5f,0x06,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x21,0x1f,0x1b,0x19,0x18,0x16,\r\n0x12,0x10,0x00,0x0f,0x00,0x0e,0x21,0x07,0x07,0x17,0x2b,0x33,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x5c,0xf1,0x53,0x60,0x3f,0x32,0x3c,0x42,0x66,0x57,0x9c,0x99,0x2a,0x30,0x30,0x2a,0x99,0x9c,0x2f,\r\n0x35,0x35,0x2f,0x9c,0x02,0x26,0x4a,0x40,0x2e,0x3f,0x04,0x04,0x04,0x4c,0x3c,0x47,0x54,0x01,0x40,0x28,0x24,0x23,0x28,0xfe,0x78,0x2c,0x28,0x27,0x2c,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0x00,0x00,0x02,0x12,0x02,0x26,0x00,0x05,0x00,0x1f,0x40,0x1c,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x03,0x01,0x02,0x02,0x1b,0x02,\r\n0x4e,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x07,0x18,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x87,0x01,0x8b,0xfe,0xcf,0x02,0x26,0x52,0xfe,0x2c,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0x00,0x00,0x02,0x12,0x03,0x11,0x02,0x26,0x02,0x0f,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x80,0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x00,0x02,0x0d,\r\n0x02,0x8f,0x00,0x07,0x00,0x47,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x59,0x40,0x0c,\r\n0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x35,0x33,0x15,0x21,0x11,0x82,0x01,0x36,0x55,0xfe,0xcf,0x02,0x26,0x69,0xbb,0xfe,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,0x1b,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x0f,0x00,0x17,0x00,0x33,0x40,0x30,0x08,0x05,0x02,0x03,0x00,0x03,0x53,0x00,0x07,0x07,\r\n0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x06,0x02,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x13,0x12,0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x15,0x11,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x3e,0x02,0x37,0x37,0x21,0x11,0x33,0x15,0x23,0x35,0x21,0x15,0x37,0x33,0x11,0x23,0x07,0x0e,0x02,0x1b,0x2a,0x0d,\r\n0x19,0x12,0x01,0x04,0x01,0x6d,0x4b,0x50,0xfe,0x81,0x34,0xf6,0xbe,0x02,0x01,0x10,0x17,0x8c,0xdc,0x0c,0x31,0x58,0x48,0xf9,0xfe,0x2a,0xdc,0x8c,0x8c,0xdc,0x01,0x88,0xad,0x47,0x58,0x31,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x02,0x06,0x00,0xe1,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf6,0x02,0x04,0x03,0x09,0x02,0x26,\r\n0x00,0xe1,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0x26,0x00,0x15,0x00,0x36,0x40,0x33,0x0c,0x01,0x02,0x06,0x01,0x01,0x4c,0x03,0x01,0x01,0x08,0x01,0x06,0x05,0x01,0x06,0x67,0x04,0x02,0x02,0x00,0x00,0x1c,0x4d,0x0a,0x09,0x07,0x03,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,\r\n0x15,0x00,0x15,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x11,0x12,0x0b,0x07,0x1f,0x2b,0x33,0x13,0x03,0x33,0x17,0x33,0x35,0x33,0x15,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x23,0x35,0x23,0x07,0x0f,0x7b,0x73,0x56,0x65,0x35,0x4a,0x33,0x68,0x55,0x73,0x7b,0x59,0x69,0x36,0x4a,0x36,0x6a,0x01,0x1c,0x01,0x0a,0xed,0xed,0xed,0xed,\r\n0xfe,0xf9,0xfe,0xe1,0xfb,0xfb,0xfb,0xfb,0x00,0x01,0x00,0x46,0xff,0xf9,0x02,0x0d,0x02,0x2d,0x00,0x2d,0x00,0x4e,0x40,0x4b,0x26,0x01,0x03,0x04,0x01,0x4c,0x00,0x06,0x05,0x04,0x05,0x06,0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x21,0x4d,\r\n0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x22,0x00,0x4e,0x01,0x00,0x21,0x1e,0x1c,0x1b,0x19,0x16,0x12,0x10,0x0f,0x0d,0x09,0x06,0x04,0x03,0x00,0x2d,0x01,0x2c,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x22,0x06,0x07,\r\n0x23,0x36,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x23,0x01,0x0a,0x5a,0x6a,0x5a,0x39,0x31,0x35,0x34,0x3c,0x3c,0x34,0x78,0x75,0x2f,0x37,0x36,0x2f,0x2f,0x2c,0x35,0x02,0x5a,0x02,0x66,0x55,0x2f,0x5a,0x69,0x3f,0x32,0x3c,0x42,0x6f,0x5f,0x07,0x55,0x49,0x23,0x2a,0x2d,0x27,0x29,0x2f,0x4e,0x2a,\r\n0x24,0x23,0x29,0x22,0x1d,0x41,0x4d,0x4a,0x45,0x2e,0x3f,0x04,0x04,0x04,0x4c,0x3c,0x4b,0x59,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x0f,0x00,0x24,0x40,0x21,0x0e,0x06,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x1c,0x4d,0x04,0x03,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,\r\n0x15,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x07,0x13,0x33,0x11,0x23,0x11,0x34,0x36,0x37,0x03,0x5c,0x56,0x03,0x08,0xe5,0x70,0x56,0x03,0x08,0xe5,0x02,0x26,0xfe,0xd8,0x2b,0x5c,0x1d,0x01,0xcc,0xfd,0xda,0x01,0x29,0x2c,0x5c,0x1d,0xfe,0x32,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfc,0x03,0x11,0x02,0x26,\r\n0x02,0x17,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x01,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x00,0x0c,0x00,0x2d,0x40,0x2a,0x07,0x01,0x04,0x01,0x01,0x4c,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x1c,0x4d,0x06,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x12,\r\n0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x11,0x33,0x15,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x15,0x67,0x5a,0x6b,0x98,0x67,0xb2,0xbc,0x69,0x9f,0x6c,0x02,0x26,0xe3,0xe3,0xfe,0xf8,0xfe,0xe2,0xf1,0xf1,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x03,0x11,0x02,0x26,0x02,0x19,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x65,0x00,0x00,\r\n0x00,0x01,0x00,0x19,0xff,0xf9,0x01,0xfc,0x02,0x26,0x00,0x0f,0x00,0x4d,0x4b,0xb0,0x21,0x50,0x58,0x40,0x17,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x00,0x00,0x02,0x61,0x05,0x04,0x02,0x02,0x02,0x1b,0x02,0x4e,0x1b,0x40,0x1b,0x00,0x03,0x03,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,\r\n0x00,0x04,0x61,0x05,0x01,0x04,0x04,0x22,0x04,0x4e,0x59,0x40,0x0d,0x00,0x00,0x00,0x0f,0x00,0x0e,0x11,0x11,0x13,0x21,0x06,0x07,0x1a,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x11,0x23,0x11,0x23,0x07,0x06,0x06,0x23,0x19,0x0f,0x2e,0x25,0x01,0x06,0x01,0x7a,0x5a,0xc7,0x05,0x03,0x4e,0x58,0x07,0x54,0x48,0x5d,0x01,0x34,0xfd,\r\n0xda,0x01,0xd4,0xe6,0x83,0x72,0x00,0x00,0x00,0x01,0x00,0x48,0x00,0x00,0x02,0x10,0x02,0x26,0x00,0x12,0x00,0x2e,0x40,0x2b,0x0e,0x0b,0x03,0x03,0x03,0x00,0x01,0x4c,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x01,0x01,0x00,0x00,0x1c,0x4d,0x05,0x04,0x02,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x00,0x12,0x00,0x12,0x15,0x11,0x12,0x11,\r\n0x06,0x07,0x1a,0x2b,0x33,0x11,0x33,0x13,0x13,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x03,0x23,0x03,0x16,0x16,0x15,0x15,0x48,0x76,0x6c,0x6d,0x79,0x56,0x03,0x0a,0x75,0x52,0x6e,0x09,0x03,0x02,0x26,0xfe,0xf3,0x01,0x0d,0xfd,0xda,0x55,0x8f,0xd0,0x46,0xfe,0xdd,0x01,0x13,0x3e,0xc0,0x97,0x55,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,\r\n0x02,0x26,0x00,0x0b,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x02,0x01,0x00,0x00,0x1c,0x4d,0x06,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x15,0x5c,0x5a,0xec,0x5a,0x5a,0xec,0x02,\r\n0x26,0xe3,0xe3,0xfd,0xda,0xf1,0xf1,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x02,0x06,0x01,0x22,0x00,0x00,0x00,0x01,0x00,0x5c,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x04,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,\r\n0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x21,0x11,0x23,0x11,0x23,0x11,0x5c,0x01,0xa0,0x5a,0xec,0x02,0x26,0xfd,0xda,0x01,0xd4,0xfe,0x2c,0xff,0xff,0x00,0x5c,0xff,0x4c,0x02,0x01,0x02,0x30,0x02,0x06,0x01,0x3d,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x0b,0x02,0x30,0x02,0x06,0x00,0xd7,0x00,0x00,0x00,0x01,0x00,0x37,\r\n0x00,0x00,0x02,0x21,0x02,0x26,0x00,0x07,0x00,0x21,0x40,0x1e,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x04,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x07,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xc8,0x01,0xea,0xc8,0x01,0xd4,0x52,0x52,0xfe,0x2c,0x00,0x00,\r\n0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0x70,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0x70,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x30,0xff,0x4c,0x02,0x28,0x02,0xda,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x42,0x40,0x3f,0x00,0x02,0x02,0x1a,\r\n0x4d,0x09,0x01,0x06,0x06,0x01,0x61,0x03,0x01,0x01,0x01,0x1c,0x4d,0x08,0x0b,0x02,0x07,0x07,0x00,0x61,0x04,0x01,0x00,0x00,0x1b,0x4d,0x0a,0x01,0x05,0x05,0x1e,0x05,0x4e,0x18,0x18,0x00,0x00,0x27,0x26,0x21,0x20,0x18,0x1f,0x18,0x1f,0x1a,0x19,0x00,0x17,0x00,0x17,0x17,0x11,0x11,0x17,0x11,0x0c,0x07,0x1b,0x2b,0x17,0x35,0x2e,0x02,\r\n0x35,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x1e,0x02,0x15,0x15,0x14,0x06,0x06,0x07,0x15,0x27,0x11,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0xff,0x3d,0x5e,0x34,0x34,0x5e,0x3d,0x5a,0x3e,0x5d,0x34,0x34,0x5d,0x3e,0x53,0x3c,0x45,0x45,0x88,0x3c,0x45,0x45,0x3c,0xb4,0xb4,0x02,0x36,0x5f,0x3d,0x80,\r\n0x3d,0x5e,0x36,0x01,0xb4,0xb4,0x01,0x36,0x5e,0x3d,0x80,0x3d,0x5f,0x36,0x02,0xb4,0xfb,0x01,0x98,0x46,0x3b,0x94,0x3c,0x47,0x47,0x3c,0x94,0x3b,0x46,0x00,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x4e,0x00,0x00,0x01,0xf4,0x02,0x26,0x00,0x0f,0x00,0x25,0x40,0x22,\r\n0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x03,0x01,0x01,0x01,0x1c,0x4d,0x05,0x01,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x21,0x35,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x01,0x9a,0x93,0x55,0x64,0x5a,0x35,0x2d,0x90,0x5a,0xbf,0x5a,0x4c,\r\n0xc1,0xc1,0x27,0x2e,0x01,0x16,0xfd,0xda,0x00,0x01,0x00,0x5c,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x0b,0x00,0x29,0x40,0x26,0x06,0x01,0x05,0x02,0x05,0x54,0x03,0x01,0x01,0x01,0x1c,0x4d,0x04,0x01,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x05,\r\n0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0xea,0xfe,0x72,0x5a,0xdf,0x5a,0x4b,0x8c,0x8c,0x02,0x26,0xfe,0x2a,0x01,0xd6,0xfe,0x2a,0xdc,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x26,0x00,0x0b,0x00,0x25,0x40,0x22,0x04,0x02,0x02,0x00,0x00,0x1c,0x4d,0x03,0x01,0x01,0x01,0x05,0x60,0x06,0x01,0x05,\r\n0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x33,0x03,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x3e,0x02,0x55,0x77,0x4a,0x76,0x54,0x02,0x26,0xfe,0x26,0x01,0xda,0xfe,0x26,0x01,0xda,0xfd,0xda,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x74,0x02,0x53,0x02,0x26,0x00,0x0f,\r\n0x00,0x2d,0x40,0x2a,0x08,0x01,0x07,0x02,0x07,0x54,0x05,0x03,0x02,0x01,0x01,0x1c,0x4d,0x06,0x04,0x02,0x02,0x02,0x00,0x60,0x00,0x00,0x00,0x1b,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x02,\r\n0x03,0xfe,0x39,0x51,0x76,0x46,0x76,0x51,0x43,0x8c,0x8c,0x02,0x26,0xfe,0x26,0x01,0xda,0xfe,0x26,0x01,0xda,0xfe,0x26,0xd8,0x00,0x01,0x00,0x5c,0xff,0x83,0x01,0xfc,0x02,0x26,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x19,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x03,0x01,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,\r\n0x01,0x00,0x00,0x1b,0x00,0x4e,0x1b,0x40,0x18,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x01,0x1c,0x4d,0x00,0x02,0x02,0x00,0x60,0x04,0x01,0x00,0x00,0x1b,0x00,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x07,0x1b,0x2b,0x17,0x35,0x23,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x15,0xff,\r\n0xa3,0x5a,0xec,0x5a,0xa3,0x7d,0x7d,0x02,0x26,0xfe,0x2c,0x01,0xd4,0xfd,0xda,0x7d,0x00,0x02,0x00,0x69,0x00,0x00,0x02,0x28,0x02,0x26,0x00,0x0a,0x00,0x13,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x00,0x00,0x1c,0x4d,0x00,0x03,0x03,0x02,0x60,0x05,0x01,0x02,0x02,0x1b,0x02,0x4e,0x00,0x00,0x13,0x11,0x0d,\r\n0x0b,0x00,0x0a,0x00,0x09,0x21,0x11,0x06,0x07,0x18,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x69,0x5a,0x9d,0x5d,0x6b,0x6c,0x5c,0x9d,0x9d,0x34,0x37,0x37,0x34,0x9d,0x02,0x26,0xca,0x5d,0x51,0x50,0x5e,0x52,0x2f,0x2d,0x2d,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x19,\r\n0x00,0x00,0x02,0x3a,0x02,0x26,0x00,0x0c,0x00,0x15,0x00,0x31,0x40,0x2e,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x1b,0x03,0x4e,0x00,0x00,0x15,0x13,0x0f,0x0d,0x00,0x0c,0x00,0x0b,0x21,0x11,0x11,0x07,0x07,0x19,0x2b,0x33,0x11,0x23,\r\n0x35,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xa5,0x8c,0xe6,0x73,0x5d,0x6b,0x6c,0x5c,0x73,0x73,0x34,0x37,0x37,0x34,0x73,0x01,0xd6,0x50,0xca,0x5d,0x51,0x50,0x5e,0x52,0x2f,0x2d,0x2d,0x2f,0x00,0x00,0x03,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x26,0x00,0x0a,0x00,0x0e,0x00,0x17,\r\n0x00,0x36,0x40,0x33,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x03,0x01,0x00,0x00,0x1c,0x4d,0x00,0x05,0x05,0x02,0x60,0x08,0x04,0x07,0x03,0x02,0x02,0x1b,0x02,0x4e,0x0b,0x0b,0x00,0x00,0x17,0x15,0x11,0x0f,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x09,0x21,0x11,0x09,0x07,0x18,0x2b,0x33,0x11,0x33,0x15,0x33,0x32,0x16,0x15,\r\n0x14,0x06,0x23,0x21,0x11,0x33,0x11,0x25,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x3c,0x54,0x37,0x59,0x67,0x67,0x59,0x01,0x01,0x54,0xfe,0x74,0x37,0x34,0x3c,0x3c,0x34,0x37,0x02,0x26,0xca,0x5e,0x50,0x50,0x5e,0x02,0x26,0xfd,0xda,0x48,0x37,0x2f,0x2f,0x37,0x00,0x00,0x00,0x02,0x00,0x05,0xff,0xfb,0x02,0x42,0x02,0x26,0x00,0x17,\r\n0x00,0x21,0x00,0x9c,0x4b,0xb0,0x27,0x50,0x58,0x40,0x20,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x06,0x01,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2b,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,\r\n0x00,0x01,0x01,0x1c,0x4d,0x00,0x00,0x00,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x4d,0x00,0x06,0x06,0x03,0x61,0x08,0x05,0x02,0x03,0x03,0x1b,0x03,0x4e,0x1b,0x40,0x28,0x00,0x02,0x00,0x07,0x00,0x02,0x07,0x69,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x1c,0x4d,0x00,0x06,0x06,0x03,0x5f,0x00,0x03,0x03,0x1b,0x4d,0x00,0x00,0x00,\r\n0x05,0x61,0x08,0x01,0x05,0x05,0x22,0x05,0x4e,0x59,0x59,0x40,0x12,0x00,0x00,0x21,0x1f,0x1a,0x18,0x00,0x17,0x00,0x16,0x11,0x25,0x21,0x13,0x21,0x09,0x07,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x13,0x21,0x15,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x03,0x06,0x06,0x23,0x25,0x33,0x32,0x36,0x35,0x35,0x34,0x26,\r\n0x23,0x23,0x05,0x12,0x19,0x1e,0x01,0x04,0x01,0x11,0x3e,0x48,0x58,0x58,0x48,0x8b,0x71,0x03,0x01,0x4d,0x41,0x01,0x50,0x3e,0x24,0x27,0x27,0x24,0x3e,0x05,0x55,0x3e,0x34,0x01,0x64,0xc8,0x55,0x45,0x2a,0x45,0x55,0x01,0xd9,0xfe,0xe9,0x5b,0x6c,0x4f,0x2c,0x24,0x2a,0x24,0x2c,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x02,0x42,\r\n0x02,0x26,0x00,0x13,0x00,0x1d,0x00,0x33,0x40,0x30,0x03,0x01,0x01,0x08,0x01,0x05,0x07,0x01,0x05,0x69,0x02,0x01,0x00,0x00,0x1c,0x4d,0x00,0x07,0x07,0x04,0x60,0x09,0x06,0x02,0x04,0x04,0x1b,0x04,0x4e,0x00,0x00,0x1d,0x1b,0x16,0x14,0x00,0x13,0x00,0x13,0x11,0x25,0x21,0x11,0x11,0x11,0x0a,0x07,0x1c,0x2b,0x33,0x11,0x33,0x15,0x33,\r\n0x35,0x33,0x15,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x23,0x11,0x23,0x11,0x37,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x3e,0x53,0x8b,0x49,0x3d,0x48,0x58,0x58,0x48,0x86,0x8b,0xd4,0x3d,0x24,0x29,0x29,0x24,0x3d,0x02,0x26,0xc8,0xc8,0xc8,0x55,0x46,0x28,0x46,0x55,0x01,0x13,0xfe,0xed,0x4b,0x2c,0x24,0x28,0x24,0x2c,0x00,\r\n0xff,0xff,0x00,0x55,0xff,0xf8,0x02,0x03,0x02,0x2e,0x02,0x06,0x01,0x44,0x00,0x00,0x00,0x01,0x00,0x57,0xff,0xf6,0x02,0x08,0x02,0x30,0x00,0x1f,0x00,0x48,0x40,0x45,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,\r\n0x21,0x4d,0x00,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1d,0x1c,0x1a,0x18,0x15,0x14,0x13,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1f,0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,\r\n0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x32,0x64,0x77,0x77,0x64,0x5f,0x74,0x03,0x5a,0x03,0x41,0x38,0x3b,0x46,0xb7,0xb7,0x46,0x3b,0x38,0x41,0x03,0x5a,0x03,0x74,0x0a,0x70,0x62,0x96,0x62,0x70,0x65,0x54,0x31,0x38,0x44,0x3e,0x1e,0x50,0x29,0x3d,0x44,0x39,0x31,0x55,0x65,0x00,0x01,0x00,0x50,0xff,0xf6,0x02,0x01,0x02,0x30,0x00,0x1f,\r\n0x00,0x48,0x40,0x45,0x00,0x06,0x05,0x04,0x05,0x06,0x04,0x80,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x03,0x01,0x04,0x03,0x67,0x00,0x05,0x05,0x07,0x61,0x00,0x07,0x07,0x21,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x01,0x00,0x1a,0x18,0x16,0x15,0x13,0x11,0x0e,0x0d,0x0c,0x0b,0x08,0x06,\r\n0x04,0x03,0x00,0x1f,0x01,0x1f,0x09,0x07,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x23,0x35,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x26,0x5f,0x74,0x03,0x5a,0x03,0x42,0x37,0x3b,0x46,0xb7,0xb7,0x46,0x3b,0x37,0x42,0x03,0x5a,0x03,0x74,0x5f,\r\n0x64,0x77,0x77,0x0a,0x65,0x55,0x31,0x39,0x44,0x3d,0x29,0x50,0x1e,0x3e,0x44,0x38,0x31,0x54,0x65,0x70,0x62,0x96,0x62,0x70,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x2b,0x03,0x09,0x02,0x26,0x01,0x00,0x00,0x00,\r\n0x00,0x07,0x06,0x68,0x02,0x67,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x4c,0x01,0xc3,0x03,0x09,0x02,0x26,0x01,0x0e,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xa8,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0xfe,0x02,0xda,0x00,0x1c,0x00,0x39,0x40,0x36,0x09,0x01,0x05,0x06,0x01,0x4c,0x02,0x01,0x00,0x09,0x08,0x02,0x03,0x04,0x00,0x03,\r\n0x67,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x00,0x01,0x01,0x1a,0x4d,0x07,0x01,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x1c,0x00,0x1c,0x13,0x23,0x13,0x24,0x11,0x11,0x11,0x11,0x0a,0x07,0x1e,0x2b,0x11,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,\r\n0x15,0x11,0x23,0x11,0x5c,0x5a,0xa8,0xa8,0x01,0x07,0x4c,0x3f,0x53,0x62,0x5a,0x3f,0x36,0x38,0x41,0x5a,0x02,0x3a,0x4b,0x55,0x55,0x4b,0xb9,0x37,0x3c,0x66,0x58,0xfe,0xca,0x01,0x2c,0x3b,0x41,0x46,0x40,0xfe,0xde,0x02,0x3a,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x30,0x02,0x30,0x00,0x15,0x00,0x23,0x00,0x73,0x4b,0xb0,0x18,0x50,\r\n0x58,0x40,0x21,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x07,0x07,0x03,0x61,0x05,0x01,0x03,0x03,0x1c,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x02,0x08,0x02,0x00,0x00,0x20,0x00,0x4e,0x1b,0x40,0x29,0x00,0x04,0x00,0x01,0x06,0x04,0x01,0x67,0x00,0x03,0x03,0x1c,0x4d,0x00,0x07,0x07,0x05,0x61,0x00,0x05,0x05,0x21,0x4d,0x00,0x02,\r\n0x02,0x1b,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x20,0x00,0x4e,0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x15,0x01,0x15,0x0a,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x15,0x23,0x11,0x33,0x15,0x33,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x8b,0x47,0x53,0x62,0x53,0x53,0x62,0x53,0x47,0x4c,0x59,0x59,0x4b,0x26,0x2b,0x2b,0x26,0x25,0x2a,0x2a,0x0a,0x5c,0x4e,0x53,0xf3,0x02,0x26,0xeb,0x4b,0x4e,0x5c,0x5c,0x4e,0xe6,0x4e,0x5c,0x46,0x36,0x2e,0xe6,0x2e,0x36,0x36,0x2e,\r\n0xe6,0x2e,0x36,0x00,0x00,0x02,0x00,0x3f,0x00,0x00,0x01,0xfc,0x02,0x26,0x00,0x0d,0x00,0x16,0x00,0x38,0x40,0x35,0x01,0x01,0x02,0x04,0x01,0x4c,0x07,0x01,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x1c,0x4d,0x06,0x03,0x02,0x01,0x01,0x1b,0x01,0x4e,0x0f,0x0e,0x00,0x00,0x12,0x10,0x0e,0x16,0x0f,\r\n0x16,0x00,0x0d,0x00,0x0d,0x11,0x11,0x26,0x08,0x07,0x19,0x2b,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x11,0x23,0x35,0x23,0x07,0x13,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x3f,0x8d,0x3a,0x46,0x6c,0x5c,0xe8,0x5a,0x74,0x82,0x68,0x8e,0x8e,0x31,0x3b,0x3b,0xd6,0x0e,0x59,0x3d,0x50,0x5c,0xfd,0xda,0xd0,0xd0,0x01,0x1e,0xb9,\r\n0x31,0x2c,0x2b,0x31,0x00,0x01,0x00,0x00,0xff,0x4c,0x01,0xfc,0x02,0xda,0x00,0x24,0x00,0x43,0x40,0x40,0x19,0x01,0x02,0x01,0x01,0x4c,0x06,0x01,0x04,0x07,0x01,0x03,0x08,0x04,0x03,0x67,0x00,0x08,0x00,0x01,0x02,0x08,0x01,0x69,0x00,0x05,0x05,0x1a,0x4d,0x00,0x02,0x02,0x1b,0x4d,0x00,0x00,0x00,0x09,0x61,0x0a,0x01,0x09,0x09,0x1e,\r\n0x09,0x4e,0x00,0x00,0x00,0x24,0x00,0x23,0x24,0x11,0x11,0x11,0x11,0x11,0x13,0x25,0x21,0x0b,0x07,0x1f,0x2b,0x17,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0xfa,0x25,0x3e,0x45,0x3d,0x36,\r\n0x38,0x3f,0x5a,0x5e,0x5e,0x5a,0xa6,0xa6,0x01,0x06,0x4b,0x3f,0x53,0x60,0x78,0x65,0xb4,0x53,0x43,0x3d,0x01,0x0d,0x3b,0x41,0x46,0x40,0xfe,0xde,0x02,0x3a,0x4b,0x55,0x55,0x4b,0xb9,0x37,0x3c,0x66,0x58,0xfe,0xe9,0x61,0x72,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x21,0x02,0x26,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x04,0x01,0x01,0x05,\r\n0x01,0x00,0x06,0x01,0x00,0x67,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x1c,0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x07,0x1c,0x2b,0x33,0x35,0x23,0x35,0x33,0x35,0x21,0x15,0x21,0x15,0x33,0x15,0x23,0x15,0x96,0x64,0x64,0x01,0x8b,0xfe,0xcf,0xaf,0xaf,0xeb,0x52,\r\n0xe9,0x52,0x97,0x52,0xeb,0x00,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x10,0x00,0x36,0x40,0x33,0x07,0x01,0x06,0x01,0x01,0x4c,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1c,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x10,0x00,\r\n0x10,0x11,0x11,0x11,0x12,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x37,0x33,0x03,0x17,0x33,0x15,0x23,0x35,0x23,0x27,0x23,0x15,0x5c,0x5a,0x62,0xa0,0x67,0xb9,0x88,0x4c,0x50,0x31,0xa0,0x63,0x02,0x26,0xe3,0xe3,0xfe,0xfa,0xd0,0xdc,0x8c,0xf5,0xf5,0x00,0x01,0x00,0x5b,0xff,0x74,0x02,0x26,0x02,0x26,0x00,0x0f,\r\n0x00,0x30,0x40,0x2d,0x00,0x01,0x00,0x06,0x03,0x01,0x06,0x67,0x00,0x03,0x00,0x04,0x03,0x04,0x63,0x02,0x01,0x00,0x00,0x1c,0x4d,0x08,0x07,0x02,0x05,0x05,0x1b,0x05,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x07,0x1d,0x2b,0x33,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x33,0x15,0x23,0x35,0x23,0x35,\r\n0x23,0x15,0x5b,0x5a,0xe8,0x5a,0x2f,0x50,0x39,0xe8,0x02,0x26,0xe5,0xe5,0xfe,0x2a,0xdc,0x8c,0xef,0xef,0xff,0xff,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x02,0x06,0x02,0x77,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x00,0x14,0x00,0x2f,0x40,0x2c,0x08,0x01,0x00,0x01,0x01,0x4c,0x03,0x01,0x00,0x07,0x06,0x02,\r\n0x04,0x05,0x00,0x04,0x68,0x02,0x01,0x01,0x01,0x1c,0x4d,0x00,0x05,0x05,0x1e,0x05,0x4e,0x00,0x00,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x18,0x11,0x11,0x08,0x07,0x1c,0x2b,0x17,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x23,0x35,0x7d,0x82,0xc3,0x5f,0x7c,0x0c,0x0a,0x03,0x03,0x09,\r\n0x0b,0x79,0x5c,0xc3,0x82,0x82,0x5a,0x4b,0x4b,0x02,0x26,0xfe,0x93,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0x4b,0x69,0x69,0x00,0x00,0x00,0x01,0x00,0x49,0xff,0x74,0x02,0x1c,0x02,0x26,0x00,0x13,0x00,0x2e,0x40,0x2b,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x00,0x05,0x04,0x05,0x63,0x03,0x01,0x01,0x01,0x1c,\r\n0x4d,0x07,0x01,0x06,0x06,0x1b,0x06,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x23,0x13,0x21,0x08,0x07,0x1c,0x2b,0x21,0x35,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x35,0x01,0x95,0x93,0x55,0x64,0x5a,0x35,0x2d,0x90,0x5a,0x2d,0x50,0xbf,0x5a,0x4c,0xc1,0xc1,0x27,0x2e,0x01,\r\n0x16,0xfe,0x2a,0xdc,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x64,0x00,0x00,0x02,0x0a,0x02,0x26,0x00,0x0f,0x00,0x25,0x40,0x22,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x67,0x05,0x01,0x04,0x04,0x1c,0x4d,0x03,0x01,0x01,0x01,0x1b,0x01,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x23,0x13,0x21,0x06,0x07,0x1a,0x2b,0x13,0x15,0x33,0x32,0x16,\r\n0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x23,0x11,0x23,0x11,0xbe,0x93,0x56,0x63,0x5a,0x35,0x2d,0x90,0x5a,0x02,0x26,0xbf,0x59,0x4d,0xc1,0xc1,0x27,0x2e,0xfe,0xea,0x02,0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0x30,0x00,0x17,0x00,0x20,0x00,0x3e,0x40,0x3b,0x00,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x02,\r\n0x00,0x05,0x06,0x02,0x05,0x67,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x00,0x21,0x4d,0x00,0x06,0x06,0x01,0x61,0x00,0x01,0x01,0x20,0x01,0x4e,0x01,0x00,0x1e,0x1c,0x19,0x18,0x15,0x14,0x12,0x10,0x0d,0x0c,0x08,0x06,0x00,0x17,0x01,0x17,0x08,0x07,0x16,0x2b,0x01,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x26,0x35,0x35,0x21,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x13,0x21,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x01,0x2c,0x62,0x76,0x76,0x62,0x41,0x61,0x36,0x01,0x58,0x45,0x3b,0x32,0x41,0x07,0x5a,0x09,0x74,0xd7,0xff,0x00,0x43,0x3d,0x3d,0x43,0x02,0x30,0x75,0x67,0x82,0x67,0x75,0x34,0x5f,0x3f,0x62,0x34,0x3d,0x47,0x27,0x21,0x45,0x51,0xfe,\r\n0xb4,0x1c,0x41,0x47,0x47,0x41,0x00,0x00,0xff,0xff,0x00,0x0f,0x00,0x00,0x02,0x49,0x03,0x09,0x02,0x26,0x02,0x15,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x46,0xff,0xf9,0x02,0x0d,0x03,0x09,0x02,0x26,0x02,0x16,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfc,\r\n0x03,0x09,0x02,0x26,0x02,0x17,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x09,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x30,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,\r\n0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x21,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x20,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,0x0d,0x01,0x0d,0x08,0x07,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,\r\n0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x61,0x71,0x71,0x61,0x60,0x72,0x72,0xda,0xf4,0x3f,0x3b,0x3a,0x40,0x7a,0x3b,0x3f,0xf4,0x40,0x0a,0x72,0x61,0x95,0x62,0x70,0x72,0x5f,0x96,0x61,0x72,0x01,0x45,0x23,0x3f,0x44,0x44,0x3f,0xfe,0xe7,0x44,0x40,0x27,0x27,0x40,\r\n0x44,0x00,0x00,0x00,0xff,0xff,0x00,0x4e,0x00,0x00,0x01,0xf4,0x03,0x09,0x02,0x26,0x02,0x27,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0x42,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x91,0x00,0x00,0x00,0x07,0x06,0x69,0x02,0xe3,0x00,0x00,0x00,0x03,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0x26,0x00,0x05,\r\n0x00,0x0b,0x00,0x0f,0x00,0x38,0x40,0x35,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x04,0x02,0x02,0x00,0x00,0x3b,0x4d,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x39,0x01,0x4e,0x0c,0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x09,0x09,0x17,0x2b,0x21,0x03,\r\n0x13,0x33,0x03,0x13,0x21,0x13,0x03,0x33,0x13,0x03,0x33,0x11,0x33,0x11,0x01,0xf7,0x97,0x87,0x53,0x86,0x9a,0xfd,0xbc,0x9a,0x86,0x53,0x87,0x97,0xa5,0x4c,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xfe,0xe5,0x01,0x1b,0x01,0x0b,0xfe,0xf4,0xfe,0xe6,0x02,0x26,0xfd,0xda,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x00,0x05,\r\n0x00,0x09,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x3b,0x4d,0x05,0x03,0x04,0x03,0x01,0x01,0x39,0x01,0x4e,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x21,0x11,0x33,0x11,0x01,0xc2,0xf6,0xe6,0x71,0xe5,0xf9,\r\n0xfe,0x2d,0x5a,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xfe,0xe5,0x02,0x26,0xfd,0xda,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x03,0x11,0x02,0x26,0x02,0x4b,0x00,0x00,0x00,0x07,0x06,0x6b,0x02,0x62,0x00,0x00,0x00,0x02,0x00,0x64,0xff,0x74,0x02,0x3a,0x02,0x26,0x00,0x09,0x00,0x0d,0x00,0x34,0x40,0x31,0x04,0x01,0x02,0x01,0x00,0x01,\r\n0x4c,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x04,0x01,0x00,0x00,0x3b,0x4d,0x07,0x05,0x06,0x03,0x03,0x03,0x39,0x03,0x4e,0x0a,0x0a,0x00,0x00,0x0a,0x0d,0x0a,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x11,0x12,0x12,0x08,0x09,0x19,0x2b,0x21,0x03,0x13,0x33,0x03,0x17,0x33,0x15,0x23,0x35,0x21,0x11,0x33,0x11,0x01,0xc2,0xf6,0xe6,0x71,0xe5,\r\n0xb3,0x49,0x50,0xfe,0x7a,0x5a,0x01,0x1a,0x01,0x0c,0xfe,0xf5,0xcb,0xdc,0x8c,0x02,0x26,0xfd,0xda,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0xa7,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0x4c,0x02,0x22,0x03,0x11,0x02,0x26,0x01,0xa7,0x00,0x00,0x00,0x07,0x06,0x70,0x02,0x58,0x00,0x00,0x00,0x02,0x00,0x00,\r\n0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x1f,0x00,0x48,0x40,0x45,0x00,0x00,0x00,0x07,0x05,0x00,0x07,0x69,0x00,0x06,0x00,0x03,0x04,0x06,0x03,0x67,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x01,0x01,0x02,0x59,0x09,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x05,0x04,0x00,0x00,0x1a,0x18,0x16,\r\n0x15,0x13,0x11,0x0c,0x0a,0x08,0x07,0x04,0x1f,0x05,0x1f,0x00,0x03,0x00,0x03,0x11,0x0a,0x09,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x32,0x36,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x02,0x58,0xfe,0xdc,0x5f,0x75,0x03,0x5a,0x03,0x42,0x38,0x3b,\r\n0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x75,0x5f,0x64,0x78,0x78,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x01,0x22,0x66,0x58,0x34,0x3a,0x44,0x3e,0x97,0x3e,0x43,0x39,0x35,0x58,0x66,0x70,0x62,0x96,0x62,0x70,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x01,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x12,\r\n0x02,0xda,0x02,0x06,0x00,0x1a,0x00,0x00,0xff,0xff,0x00,0x82,0x00,0x00,0x02,0x2b,0x02,0xda,0x02,0x06,0x01,0xcb,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x03,0x00,0x0c,0x00,0x26,0x40,0x23,0x0a,0x01,0x02,0x00,0x01,0x4c,0x00,0x00,0x00,0x28,0x4d,0x00,0x02,0x02,0x01,0x60,0x03,0x01,0x01,0x01,0x29,0x01,\r\n0x4e,0x00,0x00,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x04,0x08,0x17,0x2b,0x33,0x13,0x33,0x13,0x01,0x03,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x32,0xbe,0x79,0xbd,0xfe,0xe2,0x66,0x01,0x15,0x67,0x0d,0x12,0x05,0x04,0x13,0x02,0xda,0xfd,0x26,0x01,0xf0,0xfe,0x60,0x01,0x9f,0x34,0x5b,0x16,0x16,0x5a,0x00,0x00,0x00,0xff,0xff,0x00,0x64,\r\n0x00,0x00,0x02,0x08,0x02,0xda,0x02,0x06,0x00,0x25,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xda,0x02,0x06,0x00,0xb1,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x01,0xfb,0x02,0xda,0x02,0x06,0x00,0x40,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1b,0x00,0x1f,0x00,0x3e,0x40,0x3b,\r\n0x00,0x04,0x08,0x01,0x05,0x02,0x04,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x1c,0x1c,0x0f,0x0e,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x09,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,\r\n0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x27,0x35,0x33,0x15,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0x62,0x3b,0x3f,0x3f,0x3b,0x3a,0x40,0x40,0x20,0xb4,0x0a,0x70,0x62,0x01,0x4a,0x62,0x70,0x6f,0x62,0xfe,0xb5,0x62,0x70,0x51,0x43,0x3e,0x01,\r\n0x4a,0x3e,0x43,0x43,0x3e,0xfe,0xb6,0x3e,0x43,0xfe,0x52,0x52,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x02,0xda,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0x51,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0c,0x00,0x1b,0x40,0x18,0x00,0x00,0x00,0x28,\r\n0x4d,0x03,0x02,0x02,0x01,0x01,0x29,0x01,0x4e,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x08,0x18,0x2b,0x33,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x31,0x30,0x06,0x07,0x03,0x32,0xbe,0x79,0xbd,0x5b,0x7b,0x11,0x13,0x13,0x11,0x7a,0x02,0xda,0xfd,0x26,0x01,0xef,0x47,0x5e,0x5d,0x47,0xfe,0x10,0x00,0x00,0x00,0xff,0xff,0x00,0x48,\r\n0x00,0x00,0x02,0x10,0x02,0xda,0x02,0x06,0x00,0x59,0x00,0x00,0xff,0xff,0x00,0x5a,0x00,0x00,0x01,0xfe,0x02,0xda,0x02,0x06,0x00,0x5a,0x00,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x06,0x01,0x01,0x01,0x00,0x5f,0x00,\r\n0x00,0x00,0x28,0x4d,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x05,0x29,0x05,0x4e,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x08,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x35,0x21,0x15,0x01,0x35,0x21,0x15,0x50,0x01,0xb8,0xfe,0x66,0x01,0x7c,0xfe,0x66,\r\n0x01,0xb8,0x02,0x88,0x52,0x52,0xfe,0xc1,0x52,0x52,0xfe,0xb7,0x52,0x52,0x00,0x00,0xff,0xff,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x02,0x06,0x00,0x60,0x00,0x00,0xff,0xff,0x00,0x5e,0x00,0x00,0x01,0xfa,0x02,0xda,0x02,0x06,0x01,0xdb,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x00,0x7a,0x00,0x00,\r\n0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0b,0x00,0x34,0x40,0x31,0x08,0x02,0x02,0x02,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x01,0x02,0x02,0x4b,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x28,0x4d,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x03,0x29,0x03,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x05,0x08,\r\n0x19,0x2b,0x33,0x35,0x13,0x03,0x35,0x21,0x15,0x21,0x13,0x03,0x21,0x15,0x4b,0xe8,0xe8,0x01,0xdb,0xfe,0x8f,0xeb,0xec,0x01,0x72,0x50,0x01,0x23,0x01,0x17,0x50,0x50,0xfe,0xed,0xfe,0xd9,0x50,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x21,0x02,0xda,0x02,0x06,0x00,0x89,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,\r\n0x02,0xda,0x02,0x06,0x00,0xa8,0x00,0x00,0xff,0xff,0x00,0x2e,0xff,0xe7,0x02,0x2a,0x03,0x02,0x02,0x06,0x01,0xe1,0x00,0x00,0xff,0xff,0x00,0x28,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xa7,0x00,0x00,0x00,0x01,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0xda,0x00,0x19,0x00,0x2b,0x40,0x28,0x04,0x01,0x02,0x06,0x01,0x00,0x07,0x02,\r\n0x00,0x6a,0x05,0x03,0x02,0x01,0x01,0x28,0x4d,0x08,0x01,0x07,0x07,0x29,0x07,0x4e,0x00,0x00,0x00,0x19,0x00,0x19,0x14,0x13,0x11,0x11,0x13,0x14,0x11,0x09,0x08,0x1d,0x2b,0x33,0x35,0x22,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x11,0x33,0x11,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x15,0xff,0x3c,0x5a,0x33,0x54,\r\n0x43,0x38,0x4e,0x38,0x43,0x54,0x32,0x5b,0x3c,0xaa,0x34,0x5d,0x3f,0x01,0x60,0xfe,0xa0,0x3d,0x45,0x01,0xe2,0xfe,0x1e,0x45,0x3d,0x01,0x60,0xfe,0xa0,0x3f,0x5d,0x34,0xaa,0x00,0x00,0x00,0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x27,0x02,0xe4,0x00,0x27,0x00,0x5f,0x4b,0xb0,0x2a,0x50,0x58,0x40,0x20,0x06,0x01,0x04,0x05,0x00,0x00,0x04,\r\n0x72,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x08,0x07,0x02,0x03,0x03,0x29,0x03,0x4e,0x1b,0x40,0x21,0x06,0x01,0x04,0x05,0x00,0x05,0x04,0x00,0x80,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x2e,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x08,0x07,0x02,0x03,0x03,0x29,0x03,0x4e,0x59,0x40,0x10,\r\n0x00,0x00,0x00,0x27,0x00,0x27,0x15,0x25,0x11,0x11,0x27,0x28,0x11,0x09,0x08,0x1d,0x2b,0x33,0x35,0x33,0x35,0x2e,0x02,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x07,0x15,0x33,0x15,0x23,0x35,0x32,0x36,0x35,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x15,0x32,0x91,0x18,0x36,0x25,0x77,0x65,0x65,\r\n0x77,0x25,0x35,0x19,0x92,0xd3,0x28,0x32,0x47,0x3b,0x3b,0x47,0x32,0x28,0x50,0x05,0x03,0x23,0x45,0x35,0x01,0x18,0x62,0x75,0x75,0x62,0xfe,0xe8,0x35,0x44,0x23,0x03,0x06,0x50,0x6e,0x49,0x39,0x01,0x1d,0x3e,0x49,0x49,0x3e,0xfe,0xe3,0x39,0x49,0x6e,0xff,0xff,0x00,0x0a,0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x26,0x00,0x01,0x00,0x00,\r\n0x00,0x07,0x06,0xb1,0xff,0x29,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x02,0x08,0x02,0xda,0x02,0x26,0x00,0x25,0x00,0x00,0x00,0x07,0x06,0xb1,0xfe,0xac,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x01,0xfb,0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xac,0x00,0x00,0x02,0x06,0x00,0x40,0x00,0x00,0xff,0xff,0xff,0x8d,0x00,0x00,0x01,0xef,\r\n0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xac,0x00,0x00,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0xff,0xb0,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x27,0x06,0xb1,0xfe,0xcf,0x00,0x00,0x02,0x06,0x00,0x60,0x00,0x00,0xff,0xff,0xff,0x83,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x27,0x06,0xb1,0xfe,0xa2,0x00,0x00,0x02,0x06,0x00,0xa8,0x00,0x00,\r\n0xff,0xff,0xff,0xb0,0x00,0x00,0x02,0x27,0x02,0xe4,0x02,0x26,0x02,0x68,0x00,0x00,0x00,0x07,0x06,0xb1,0xfe,0xcf,0x00,0x00,0xff,0xff,0x00,0x69,0x00,0x00,0x01,0xef,0x03,0xb1,0x00,0x27,0x06,0x8e,0x02,0x58,0x00,0x00,0x02,0x06,0x00,0x43,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x02,0x35,0x03,0xb1,0x00,0x27,0x06,0x8e,0x02,0x58,\r\n0x00,0x00,0x02,0x06,0x00,0xa8,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x4c,0x02,0x44,0x02,0xda,0x00,0x17,0x00,0x42,0x40,0x3f,0x07,0x01,0x07,0x01,0x01,0x4c,0x00,0x03,0x07,0x06,0x07,0x03,0x06,0x80,0x00,0x01,0x00,0x07,0x03,0x01,0x07,0x67,0x02,0x01,0x00,0x00,0x28,0x4d,0x09,0x08,0x02,0x06,0x06,0x29,0x4d,0x00,0x05,0x05,0x04,0x61,\r\n0x00,0x04,0x04,0x2d,0x04,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x12,0x21,0x23,0x12,0x11,0x11,0x11,0x0a,0x08,0x1e,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x03,0x13,0x33,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x23,0x03,0x23,0x11,0x5c,0x5a,0x6c,0xa2,0x62,0xb5,0x9b,0x38,0x5f,0x5c,0x1d,0x1d,0x2d,0x38,0x25,0xaa,\r\n0x69,0x02,0xda,0xfe,0xc6,0x01,0x3a,0xfe,0xa0,0xfe,0xcd,0x47,0x58,0x5c,0x4f,0x37,0x2e,0x01,0x51,0xfe,0xaf,0x00,0x00,0x00,0xff,0xff,0x00,0x5d,0x00,0x00,0x02,0x30,0x02,0xda,0x02,0x06,0x00,0xba,0x00,0x00,0x00,0x02,0x00,0x5d,0xff,0x4c,0x02,0x44,0x02,0xda,0x00,0x10,0x00,0x14,0x00,0x40,0x40,0x3d,0x0a,0x07,0x02,0x03,0x02,0x01,\r\n0x4c,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x05,0x01,0x02,0x02,0x38,0x4d,0x08,0x06,0x02,0x01,0x01,0x39,0x4d,0x00,0x00,0x00,0x04,0x61,0x07,0x01,0x04,0x04,0x3d,0x04,0x4e,0x11,0x11,0x00,0x00,0x11,0x14,0x11,0x14,0x13,0x12,0x00,0x10,0x00,0x0f,0x12,0x12,0x12,0x21,0x09,0x09,0x1a,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x23,0x03,\r\n0x13,0x33,0x03,0x13,0x33,0x15,0x14,0x06,0x23,0x25,0x11,0x33,0x11,0x01,0x6c,0x1d,0x2d,0x38,0x2f,0xf9,0xf9,0x67,0xf0,0xcb,0x43,0x5f,0x5c,0xfe,0xd4,0x5a,0xb4,0x4f,0x37,0x2e,0x01,0x7c,0x01,0x5e,0xfe,0xa2,0xfe,0xcb,0x47,0x58,0x5c,0xb4,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xf6,0x01,0xfc,0x02,0x30,0x00,0x13,\r\n0x00,0x21,0x00,0x67,0xb6,0x10,0x0a,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x19,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x31,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x03,0x06,0x02,0x00,0x00,0x2f,0x00,0x4e,0x1b,0x40,0x21,0x00,0x02,0x02,0x2b,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x31,0x4d,0x00,0x03,\r\n0x03,0x29,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x59,0x40,0x17,0x15,0x14,0x01,0x00,0x1c,0x1a,0x14,0x21,0x15,0x21,0x0f,0x0e,0x0d,0x0c,0x08,0x06,0x00,0x13,0x01,0x13,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,\r\n0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x0c,0x52,0x65,0x64,0x53,0x3e,0x50,0x07,0x03,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x42,0x42,0x0a,0x6e,0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x69,0xfd,0xda,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,0x44,0x40,0x96,0x40,0x44,0x00,0x00,\r\n0x00,0x02,0x00,0x5c,0xff,0x4c,0x02,0x1a,0x02,0xe4,0x00,0x1b,0x00,0x31,0x00,0x48,0x40,0x45,0x0c,0x01,0x04,0x05,0x18,0x01,0x03,0x04,0x02,0x4c,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x69,0x00,0x06,0x06,0x00,0x61,0x00,0x00,0x00,0x2e,0x4d,0x08,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2f,0x4d,0x07,0x01,0x02,0x02,0x2d,0x02,0x4e,\r\n0x1d,0x1c,0x00,0x00,0x2c,0x2a,0x26,0x24,0x23,0x21,0x1c,0x31,0x1d,0x31,0x00,0x1b,0x00,0x1b,0x2e,0x24,0x09,0x08,0x18,0x2b,0x17,0x11,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x1e,0x02,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x35,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x5c,0x34,0x5e,0x3d,0x3d,0x5b,0x34,0x40,0x33,0x2d,0x43,0x26,0x35,0x60,0x3f,0x3c,0x4d,0x07,0x03,0x03,0x86,0x3a,0x48,0x48,0x3b,0x37,0x27,0x34,0x40,0x40,0x34,0x34,0x41,0x4b,0xb4,0x02,0xc5,0x3f,0x5f,0x35,0x2d,0x51,0x35,0x38,0x56,0x0d,0x03,0x06,0x36,0x53,0x33,0x41,0x63,0x37,0x3c,\r\n0x34,0x7a,0xa0,0xfc,0x4f,0x3f,0x3f,0x4f,0x4c,0x3f,0x33,0x33,0x3f,0x48,0x3b,0xfe,0xc5,0x3f,0x4f,0x00,0x00,0x01,0x00,0x3c,0xff,0x4c,0x02,0x1c,0x02,0x26,0x00,0x0e,0x00,0x23,0x40,0x20,0x0d,0x07,0x01,0x03,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x00,0x2b,0x4d,0x03,0x01,0x02,0x02,0x2d,0x02,0x4e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x18,\r\n0x12,0x04,0x08,0x18,0x2b,0x17,0x35,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x15,0xff,0xc3,0x5f,0x7c,0x0c,0x0a,0x03,0x03,0x09,0x0b,0x79,0x5c,0xc3,0xb4,0xb4,0x02,0x26,0xfe,0x93,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0xb4,0x00,0x00,0x00,0x02,0x00,0x54,0xff,0xf6,0x02,0x04,0x02,0xda,0x00,0x16,\r\n0x00,0x24,0x00,0x3f,0x40,0x3c,0x0c,0x01,0x01,0x03,0x01,0x4c,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x28,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1f,0x1d,0x17,0x24,0x18,0x24,0x10,0x0f,0x0e,0x0d,0x08,0x07,0x00,0x16,0x01,0x16,0x08,\r\n0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x26,0x26,0x27,0x35,0x21,0x15,0x21,0x1e,0x02,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x61,0x77,0x31,0x58,0x3a,0x06,0x22,0x57,0x38,0x01,0x89,0xfe,0xdc,0x61,0x89,0x49,0x76,0x62,0x39,0x43,0x1b,0x23,0x3f,\r\n0x37,0x46,0x45,0x0a,0x73,0x64,0x61,0x3f,0x5e,0x35,0x1c,0x42,0x2a,0x52,0x4b,0x43,0x78,0x86,0x59,0x82,0x7d,0x50,0x51,0x5e,0x3f,0x58,0x29,0x4b,0x3c,0x61,0x40,0x47,0x00,0x01,0x00,0x4b,0xff,0xf9,0x02,0x12,0x02,0x2d,0x00,0x2d,0x00,0x52,0x40,0x4f,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,\r\n0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x09,0x01,0x00,0x00,0x32,0x00,0x4e,0x02,0x00,0x2b,0x2a,0x28,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x15,0x13,0x12,0x10,0x0d,0x07,0x06,0x00,0x2d,0x02,0x2d,0x0a,0x08,0x16,0x2b,\r\n0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x4e,0x35,0x5f,0x6f,0x42,0x3c,0x32,0x3f,0x69,0x5a,0x2f,0x56,0x66,0x01,0x5a,0x01,0x36,\r\n0x2c,0x2f,0x2e,0x37,0x37,0x2f,0x75,0x78,0x34,0x3c,0x3c,0x34,0x35,0x31,0x39,0x5a,0x6a,0x07,0x59,0x4b,0x3c,0x4c,0x04,0x04,0x04,0x3f,0x2e,0x45,0x4a,0x4d,0x41,0x1d,0x22,0x29,0x23,0x24,0x2a,0x4e,0x2f,0x29,0x27,0x2d,0x2a,0x23,0x49,0x55,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x47,0x02,0x30,0x02,0xda,0x00,0x1e,0x00,0x18,0x40,0x15,\r\n0x12,0x01,0x02,0x00,0x49,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x28,0x00,0x4e,0x11,0x1e,0x02,0x08,0x18,0x2b,0x05,0x27,0x37,0x36,0x35,0x34,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x21,0x35,0x21,0x15,0x07,0x06,0x06,0x15,0x14,0x17,0x17,0x16,0x16,0x15,0x14,0x07,0x01,0xe4,0x46,0x2e,0x0a,0x22,0x84,0x65,0x62,0x62,0x6d,\r\n0x86,0xfe,0xba,0x01,0xb3,0xba,0x5a,0x52,0x89,0x81,0x2f,0x32,0x1b,0xb9,0x2a,0x49,0x10,0x0e,0x1a,0x0b,0x26,0x1d,0x62,0x49,0x43,0x8d,0x5c,0x71,0x52,0x5a,0xa6,0x50,0x6f,0x2f,0x4d,0x28,0x25,0x0d,0x3c,0x26,0x27,0x29,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x02,0x30,0x02,0x06,0x01,0x1b,0x00,0x00,0x00,0x03,0x00,0x58,\r\n0xff,0xf6,0x02,0x00,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x28,0x4d,0x07,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x2f,0x00,0x4e,0x18,0x17,0x01,0x00,0x1c,0x1b,0x17,0x1f,0x18,0x1f,0x14,0x12,0x0f,0x0e,0x08,0x06,0x00,\r\n0x0d,0x01,0x0d,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x13,0x32,0x36,0x35,0x35,0x23,0x15,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,0x72,0xdc,0xf4,0x3f,0x3b,0x3a,0x40,0x7a,0x3b,0x3f,0xf4,0x40,0x0a,0x70,0x62,0x01,0x40,\r\n0x62,0x70,0x6f,0x62,0xfe,0xbf,0x62,0x70,0x01,0x9d,0x75,0x40,0x42,0x42,0x40,0xfe,0x3e,0x42,0x40,0x7d,0x7d,0x40,0x42,0x00,0x00,0x01,0x00,0x37,0x00,0x00,0x02,0x26,0x02,0x26,0x00,0x0d,0x00,0x28,0x40,0x25,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x00,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x00,0x29,0x00,0x4e,0x01,0x00,\r\n0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x05,0x08,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x9a,0x49,0x57,0xc3,0x01,0x1d,0x26,0x20,0x8c,0x55,0x46,0x01,0x39,0x52,0xfe,0x75,0x22,0x27,0x52,0xff,0xff,0x00,0x67,0x00,0x00,0x02,0x35,0x02,0x26,0x02,0x06,0x02,0x19,0x00,0x00,\r\n0x00,0x01,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0d,0x00,0x22,0x40,0x1f,0x09,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x00,0x28,0x4d,0x03,0x02,0x02,0x01,0x01,0x29,0x01,0x4e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x04,0x08,0x18,0x2b,0x33,0x13,0x27,0x33,0x01,0x23,0x03,0x26,0x26,0x27,0x14,0x06,0x07,0x03,0x32,0xcc,\r\n0x4a,0x60,0x01,0x12,0x60,0x83,0x0d,0x0c,0x05,0x08,0x0c,0x7e,0x02,0x1d,0xbd,0xfd,0x26,0x01,0x65,0x23,0x36,0x0f,0x0f,0x36,0x23,0xfe,0x9b,0x00,0x00,0x01,0x00,0x5d,0xff,0x4c,0x01,0xfb,0x02,0x26,0x00,0x18,0x00,0x57,0xb5,0x0e,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x18,0x02,0x01,0x00,0x00,0x2b,0x4d,0x00,0x01,\r\n0x01,0x03,0x61,0x04,0x01,0x03,0x03,0x29,0x4d,0x06,0x01,0x05,0x05,0x2d,0x05,0x4e,0x1b,0x40,0x1c,0x02,0x01,0x00,0x00,0x2b,0x4d,0x00,0x03,0x03,0x29,0x4d,0x00,0x01,0x01,0x04,0x61,0x00,0x04,0x04,0x2f,0x4d,0x06,0x01,0x05,0x05,0x2d,0x05,0x4e,0x59,0x40,0x0e,0x00,0x00,0x00,0x18,0x00,0x18,0x24,0x11,0x13,0x23,0x11,0x07,0x08,0x1b,\r\n0x2b,0x17,0x11,0x33,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x5d,0x5a,0x3c,0x37,0x38,0x3f,0x5a,0x58,0x03,0x03,0x36,0x3e,0x3e,0x30,0x03,0x03,0x02,0xb4,0x02,0xda,0xfe,0xa2,0x3e,0x46,0x46,0x3e,0x01,0x5e,0xfd,0xda,0x69,0x35,0x3e,0x3e,0x35,0x7d,0xa0,0x00,\r\n0xff,0xff,0x00,0x36,0x00,0x00,0x02,0x22,0x02,0x26,0x02,0x06,0x01,0x69,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x47,0x02,0x1f,0x02,0xe4,0x00,0x2e,0x00,0x3a,0x40,0x37,0x1f,0x01,0x02,0x01,0x01,0x4c,0x14,0x13,0x02,0x02,0x49,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x80,0x00,0x01,0x00,0x02,0x01,0x02,0x63,0x05,0x01,0x00,0x00,0x03,0x61,\r\n0x00,0x03,0x03,0x2e,0x00,0x4e,0x01,0x00,0x2c,0x2b,0x28,0x26,0x0a,0x08,0x07,0x05,0x00,0x2e,0x01,0x2e,0x06,0x08,0x16,0x2b,0x01,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x16,0x16,0x07,0x07,0x27,0x37,0x36,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,\r\n0x32,0x16,0x16,0x17,0x23,0x26,0x26,0x01,0x45,0x37,0x44,0x44,0x37,0x92,0x8e,0x42,0x53,0x74,0x8f,0x4a,0x1e,0x2a,0x29,0x46,0x2b,0x0e,0x0a,0x1c,0x8b,0x5e,0x5b,0x4e,0x3e,0x34,0x41,0x37,0x62,0x40,0x40,0x5e,0x36,0x02,0x5a,0x04,0x40,0x02,0x92,0x42,0x32,0x31,0x39,0x50,0x46,0x38,0x4e,0x23,0x2c,0x17,0x65,0x44,0x42,0x27,0x46,0x18,\r\n0x24,0x09,0x2c,0x1e,0x5e,0x45,0x42,0x60,0x0b,0x03,0x0d,0x51,0x39,0x35,0x53,0x2f,0x2d,0x4e,0x33,0x29,0x33,0x00,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x02,0x2e,0x02,0x06,0x01,0x22,0x00,0x00,0x00,0x01,0x00,0x19,0xff,0xfb,0x02,0x2b,0x02,0x26,0x00,0x13,0x00,0x59,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x19,0x05,0x03,0x02,\r\n0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x2b,0x4d,0x00,0x06,0x06,0x00,0x61,0x02,0x07,0x02,0x00,0x00,0x32,0x00,0x4e,0x1b,0x40,0x1d,0x05,0x03,0x02,0x01,0x01,0x04,0x5f,0x00,0x04,0x04,0x2b,0x4d,0x00,0x02,0x02,0x29,0x4d,0x00,0x06,0x06,0x00,0x61,0x07,0x01,0x00,0x00,0x32,0x00,0x4e,0x59,0x40,0x15,0x01,0x00,0x12,0x10,0x0d,0x0c,0x0b,\r\n0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x13,0x01,0x13,0x08,0x08,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x02,0x18,0x4c,0x5b,0xad,0x57,0x54,0x02,0x11,0x63,0x29,0x23,0x18,0x05,0x60,0x4f,0x01,0x2c,0xfe,0x2a,0x01,0xd6,0x50,0x50,0xfe,0xce,0x29,0x2c,0x54,\r\n0x00,0x02,0x00,0x5e,0xff,0x4c,0x01,0xfe,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x38,0x40,0x35,0x0e,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x31,0x4d,0x06,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x2f,0x4d,0x05,0x01,0x02,0x02,0x2d,0x02,0x4e,0x13,0x12,0x00,0x00,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,\r\n0x00,0x11,0x25,0x23,0x07,0x08,0x18,0x2b,0x17,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5e,0x70,0x61,0x61,0x6e,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x76,0x39,0x3d,0x3d,0x39,0x39,0x3d,0x3f,0xb4,0x02,0x18,0x5f,\r\n0x6d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x44,0x40,0x96,0x40,0x44,0x44,0x40,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x5a,0xff,0x47,0x02,0x0b,0x02,0x30,0x00,0x1f,0x00,0x1d,0x40,0x1a,0x1f,0x01,0x01,0x49,0x00,0x01,0x02,0x01,0x86,0x00,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x31,0x02,0x4e,0x22,0x12,0x2b,0x03,\r\n0x08,0x19,0x2b,0x05,0x37,0x36,0x26,0x27,0x27,0x26,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x07,0x07,0x01,0x59,0x2b,0x0e,0x0a,0x1c,0x76,0x4a,0x52,0x77,0x64,0x5f,0x74,0x03,0x5a,0x03,0x41,0x38,0x3b,0x46,0x31,0x2b,0x7a,0x4a,0x1e,0x2a,0x29,0x92,0x46,\r\n0x18,0x24,0x09,0x25,0x17,0x63,0x44,0x82,0x62,0x70,0x66,0x58,0x35,0x39,0x43,0x3e,0x83,0x25,0x3a,0x0e,0x26,0x17,0x65,0x44,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xf6,0x02,0x3a,0x02,0x26,0x00,0x14,0x00,0x22,0x00,0x30,0x40,0x2d,0x04,0x01,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x2b,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,\r\n0x01,0x00,0x00,0x2f,0x00,0x4e,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x0c,0x0b,0x0a,0x08,0x00,0x14,0x01,0x14,0x07,0x08,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x23,0x15,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,\r\n0x29,0x40,0x5f,0x35,0x35,0x5f,0x40,0x01,0x11,0xa9,0x32,0x3a,0x35,0x5f,0x40,0x39,0x41,0x41,0x39,0x39,0x41,0x41,0x0a,0x35,0x5e,0x3f,0x8c,0x3f,0x5f,0x34,0x52,0x03,0x04,0x43,0x36,0x8c,0x3f,0x5e,0x35,0x50,0x46,0x3c,0x8c,0x3c,0x46,0x46,0x3c,0x8c,0x3c,0x46,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x08,0x02,0x26,0x00,0x0f,\r\n0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x00,0x04,0x04,0x00,0x5f,0x05,0x01,0x00,0x00,0x29,0x00,0x4e,0x01,0x00,0x0e,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x0f,0x01,0x0f,0x06,0x08,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x16,0x33,0x33,0x15,0x01,0x6d,0x44,\r\n0x52,0xa8,0x01,0xd9,0xd7,0x21,0x1b,0x96,0x4f,0x42,0x01,0x43,0x52,0x52,0xfe,0xbd,0x1c,0x23,0x52,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0x26,0x02,0x06,0x01,0x51,0x00,0x00,0x00,0x02,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x2b,0x00,0x1e,0x00,0x27,0x00,0x3b,0x40,0x38,0x0b,0x01,0x01,0x06,0x01,0x4c,0x0a,0x01,0x02,0x4a,\r\n0x00,0x06,0x06,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x05,0x01,0x01,0x01,0x00,0x61,0x03,0x01,0x00,0x00,0x29,0x4d,0x07,0x01,0x04,0x04,0x2d,0x04,0x4e,0x00,0x00,0x26,0x25,0x20,0x1f,0x00,0x1e,0x00,0x1e,0x17,0x21,0x1f,0x11,0x08,0x08,0x1a,0x2b,0x17,0x35,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x15,0x06,0x06,0x15,0x07,0x06,\r\n0x16,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x15,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0xff,0x3b,0x5b,0x33,0x22,0x3e,0x28,0x16,0x1d,0x01,0x01,0x46,0x38,0x50,0x3c,0x5b,0x34,0x33,0x5a,0x3c,0x08,0x38,0x45,0x42,0x35,0x06,0xb4,0xb4,0x34,0x5e,0x3d,0x92,0x34,0x56,0x39,0x07,0x5f,0x05,0x3b,0x26,0x9c,\r\n0x3a,0x49,0x01,0xdf,0x32,0x58,0x3b,0x92,0x3d,0x5e,0x34,0xb4,0xfb,0x49,0x3a,0x9c,0x36,0x44,0x00,0x00,0xff,0xff,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0x4c,0x02,0x22,0x02,0x26,0x00,0x17,0x00,0x2d,0x40,0x2a,0x05,0x03,0x02,0x01,0x01,0x2b,0x4d,0x04,0x01,0x02,0x02,0x00,\r\n0x62,0x06,0x01,0x00,0x00,0x29,0x4d,0x08,0x01,0x07,0x07,0x2d,0x07,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x13,0x13,0x11,0x11,0x13,0x13,0x11,0x09,0x08,0x1d,0x2b,0x17,0x35,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x33,0x11,0x33,0x11,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x15,0xff,0x5c,0x6d,0x54,0x3e,0x3d,0x4e,0x3d,0x3e,\r\n0x54,0x6d,0x5c,0xb4,0xb4,0x6c,0x5e,0x01,0x5c,0xfe,0xa4,0x3d,0x44,0x01,0xdd,0xfe,0x23,0x44,0x3d,0x01,0x5c,0xfe,0xa4,0x5e,0x6c,0xb4,0x00,0x00,0x00,0x01,0x00,0x36,0xff,0xf6,0x02,0x22,0x02,0x30,0x00,0x2d,0x00,0x34,0x40,0x31,0x2a,0x01,0x01,0x02,0x01,0x4c,0x20,0x1f,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,\r\n0x01,0x01,0x00,0x61,0x04,0x05,0x02,0x00,0x00,0x2f,0x00,0x4e,0x01,0x00,0x28,0x26,0x19,0x17,0x14,0x13,0x10,0x0e,0x00,0x2d,0x01,0x2d,0x06,0x08,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x27,0x35,0x16,\r\n0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x06,0x06,0xb5,0x3a,0x45,0x4c,0x41,0x19,0x1f,0x22,0x1c,0x1c,0x20,0x4e,0x20,0x1c,0x1d,0x21,0x21,0x1c,0x44,0x4e,0x44,0x3b,0x31,0x41,0x05,0x02,0x04,0x40,0x0a,0x5c,0x4f,0xbb,0x57,0x73,0x0a,0x5f,0x05,0x3c,0x2e,0xc7,0x29,0x30,0x30,0x29,0xbe,0xbe,0x29,0x30,0x30,0x29,0xc7,0x2b,\r\n0x39,0x06,0x5f,0x0a,0x70,0x55,0xbb,0x4f,0x5c,0x3f,0x35,0x35,0x3f,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x11,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x06,0x06,0xb0,0x19,0x00,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x09,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x07,0x06,0x68,0x02,0x53,0x00,0x00,\r\n0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x03,0x84,0x02,0x26,0x02,0x7d,0x00,0x00,0x00,0x06,0x06,0xb2,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x06,0x06,0xb0,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x09,0x02,0x26,0x01,0x51,0x00,0x00,\r\n0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x03,0x84,0x02,0x26,0x01,0x51,0x00,0x00,0x00,0x06,0x06,0xb2,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x54,0xff,0xf8,0x02,0x04,0x03,0x11,0x02,0x26,0x01,0x22,0x00,0x00,0x00,0x06,0x06,0xb0,0x1e,0x00,0x00,0x00,0xff,0xff,0x00,0x36,0xff,0xf6,0x02,0x22,\r\n0x03,0x11,0x02,0x26,0x02,0x8d,0x00,0x00,0x00,0x06,0x06,0xb0,0x14,0x00,0x00,0x00,0x00,0x03,0x00,0x55,0xff,0xf6,0x01,0xfc,0x03,0x11,0x00,0x03,0x00,0x17,0x00,0x25,0x00,0x84,0xb6,0x14,0x0e,0x02,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x00,0x01,0x00,0x85,0x08,0x01,0x01,0x03,0x01,0x85,0x00,0x07,0x07,0x03,\r\n0x61,0x04,0x01,0x03,0x03,0x31,0x4d,0x0a,0x01,0x06,0x06,0x02,0x61,0x05,0x09,0x02,0x02,0x02,0x2f,0x02,0x4e,0x1b,0x40,0x2c,0x00,0x00,0x01,0x00,0x85,0x08,0x01,0x01,0x03,0x01,0x85,0x00,0x04,0x04,0x2b,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x31,0x4d,0x00,0x05,0x05,0x29,0x4d,0x0a,0x01,0x06,0x06,0x02,0x61,0x09,0x01,0x02,\r\n0x02,0x2f,0x02,0x4e,0x59,0x40,0x1e,0x19,0x18,0x05,0x04,0x00,0x00,0x20,0x1e,0x18,0x25,0x19,0x25,0x13,0x12,0x11,0x10,0x0c,0x0a,0x04,0x17,0x05,0x17,0x00,0x03,0x00,0x03,0x11,0x0b,0x08,0x17,0x2b,0x13,0x37,0x33,0x07,0x03,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x33,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,\r\n0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xea,0x6a,0x64,0x6f,0x3d,0x52,0x65,0x64,0x53,0x3e,0x50,0x07,0x03,0x02,0x5a,0x5a,0x01,0x07,0x50,0x20,0x38,0x40,0x40,0x38,0x39,0x42,0x42,0x02,0x85,0x8c,0x8c,0xfd,0x71,0x6e,0x5e,0xa1,0x5f,0x6e,0x3e,0x35,0x69,0xfd,0xda,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x96,0x3e,0x46,\r\n0x44,0x40,0x96,0x40,0x44,0x00,0x00,0x00,0x00,0x02,0x00,0x4b,0xff,0xf9,0x02,0x12,0x03,0x11,0x00,0x2d,0x00,0x31,0x01,0x43,0x4b,0xb0,0x13,0x50,0x58,0x40,0x40,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,0x03,0x72,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,\r\n0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x4b,0xb0,0x14,0x50,0x58,0x40,0x41,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,\r\n0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x4b,0xb0,0x15,0x50,0x58,0x40,0x40,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,0x04,0x05,0x04,\r\n0x03,0x72,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x1b,0x40,0x41,0x00,0x09,0x0a,0x09,0x85,0x0c,0x01,0x0a,0x02,0x0a,0x85,0x00,0x03,\r\n0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x01,0x05,0x06,0x05,0x01,0x06,0x80,0x00,0x08,0x06,0x07,0x06,0x08,0x07,0x80,0x00,0x05,0x00,0x06,0x08,0x05,0x06,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x31,0x4d,0x00,0x07,0x07,0x00,0x62,0x0b,0x01,0x00,0x00,0x32,0x00,0x4e,0x59,0x59,0x59,0x40,0x21,0x2e,0x2e,0x02,0x00,0x2e,0x31,0x2e,\r\n0x31,0x30,0x2f,0x2b,0x2a,0x28,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x15,0x13,0x12,0x10,0x0d,0x07,0x06,0x00,0x2d,0x02,0x2d,0x0d,0x08,0x16,0x2b,0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x03,0x37,0x33,0x07,0x01,0x4e,0x35,0x5f,0x6f,0x42,0x3c,0x32,0x3f,0x69,0x5a,0x2f,0x56,0x66,0x01,0x5a,0x01,0x36,0x2c,0x2f,0x2e,0x37,0x37,0x2f,0x75,0x78,0x34,0x3c,0x3c,0x34,0x35,0x31,0x39,0x5a,0x6a,0xb8,0x6a,0x64,0x6f,0x07,0x59,0x4b,0x3c,0x4c,0x04,0x04,0x04,0x3f,0x2e,0x45,0x4a,\r\n0x4d,0x41,0x1d,0x22,0x29,0x23,0x24,0x2a,0x4e,0x2f,0x29,0x27,0x2d,0x2a,0x23,0x49,0x55,0x02,0x8c,0x8c,0x8c,0x00,0x00,0x00,0xff,0xff,0x00,0x5c,0x00,0x00,0x01,0xfe,0x03,0x11,0x02,0x26,0x01,0x1b,0x00,0x00,0x00,0x06,0x06,0xb0,0x23,0x00,0x00,0x00,0x00,0x01,0x00,0x5c,0xff,0x4c,0x02,0x26,0x02,0x26,0x00,0x1a,0x00,0x39,0x40,0x36,\r\n0x19,0x06,0x02,0x02,0x00,0x01,0x4c,0x00,0x02,0x00,0x05,0x00,0x02,0x05,0x80,0x01,0x01,0x00,0x00,0x2b,0x4d,0x07,0x06,0x02,0x05,0x05,0x29,0x4d,0x00,0x04,0x04,0x03,0x61,0x00,0x03,0x03,0x2d,0x03,0x4e,0x00,0x00,0x00,0x1a,0x00,0x1a,0x12,0x21,0x23,0x11,0x15,0x11,0x08,0x08,0x1c,0x2b,0x33,0x11,0x33,0x11,0x14,0x06,0x07,0x13,0x33,\r\n0x11,0x33,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x23,0x11,0x34,0x36,0x37,0x03,0x5c,0x56,0x03,0x08,0xe5,0x70,0x2a,0x5f,0x5c,0x1d,0x1d,0x2d,0x38,0x2a,0x03,0x08,0xe5,0x02,0x26,0xfe,0xd8,0x2b,0x5c,0x1d,0x01,0xcc,0xfe,0x21,0x47,0x58,0x5c,0x4f,0x37,0x2e,0x01,0x29,0x2c,0x5c,0x1d,0xfe,0x32,0x00,0xff,0xff,0x00,0x30,\r\n0xff,0x4c,0x02,0x28,0x02,0xda,0x02,0x06,0x02,0x25,0x00,0x00,0x00,0x02,0x00,0x0f,0xff,0xf6,0x02,0x49,0x02,0x26,0x00,0x18,0x00,0x2c,0x00,0x49,0x40,0x46,0x16,0x01,0x05,0x06,0x01,0x4c,0x00,0x06,0x01,0x05,0x01,0x06,0x05,0x80,0x08,0x03,0x02,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x2b,0x4d,0x07,0x0a,0x02,0x05,0x05,0x00,0x61,0x04,\r\n0x09,0x02,0x00,0x00,0x2f,0x00,0x4e,0x1a,0x19,0x01,0x00,0x29,0x26,0x23,0x21,0x1e,0x1d,0x19,0x2c,0x1a,0x2c,0x14,0x12,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x00,0x18,0x01,0x18,0x0b,0x08,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x23,0x35,0x21,0x15,0x23,0x16,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x27,0x32,\r\n0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x23,0x23,0x22,0x15,0x15,0x14,0xb5,0x3a,0x44,0x27,0x24,0x73,0x02,0x3a,0x73,0x24,0x27,0x43,0x3b,0x31,0x3e,0x08,0x07,0x3e,0x1e,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x3d,0xc6,0x3d,0x0a,0x56,0x4b,0xbc,0x2e,0x42,0x11,0x52,0x52,0x11,0x42,0x2e,0xbc,0x4b,0x56,0x39,0x32,0x32,\r\n0x39,0x4c,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xea,0x54,0x54,0xea,0x54,0x00,0x00,0xff,0xff,0x00,0x64,0x00,0x00,0x02,0x37,0x02,0x26,0x02,0x06,0x02,0x4b,0x00,0x00,0x00,0x01,0x00,0x1a,0xff,0x4c,0x02,0x21,0x02,0x2a,0x00,0x15,0x00,0x29,0x40,0x26,0x14,0x0e,0x01,0x03,0x03,0x00,0x01,0x4c,0x00,0x00,0x00,0x01,0x61,0x02,0x01,0x01,\r\n0x01,0x3b,0x4d,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x00,0x15,0x00,0x15,0x1a,0x21,0x23,0x05,0x09,0x19,0x2b,0x05,0x35,0x03,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x17,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x15,0x01,0x09,0x8b,0x11,0x35,0x1e,0x1e,0x3a,0x51,0x10,0x4e,0x0b,0x09,0x03,0x03,0x0b,0x0b,0x74,0x5c,\r\n0xbe,0xb4,0xb4,0x01,0xa7,0x31,0x52,0x36,0x35,0xfe,0xfa,0x22,0x35,0x11,0x11,0x35,0x22,0x01,0x6d,0xfd,0xda,0xb4,0x00,0x00,0x00,0x01,0x00,0x2f,0xff,0xfb,0x02,0x44,0x02,0xdf,0x00,0x1a,0x00,0x59,0xb6,0x0d,0x07,0x02,0x04,0x02,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x17,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,\r\n0x04,0x04,0x00,0x61,0x01,0x05,0x02,0x00,0x00,0x42,0x00,0x4e,0x1b,0x40,0x1b,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,0x01,0x01,0x39,0x4d,0x00,0x04,0x04,0x00,0x61,0x05,0x01,0x00,0x00,0x42,0x00,0x4e,0x59,0x40,0x11,0x01,0x00,0x19,0x17,0x14,0x12,0x11,0x0f,0x0c,0x0b,0x00,0x1a,0x01,0x1a,0x06,0x09,0x16,0x2b,0x05,\r\n0x22,0x26,0x27,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x23,0x13,0x27,0x26,0x23,0x23,0x35,0x33,0x32,0x17,0x13,0x16,0x33,0x33,0x15,0x02,0x1c,0x3a,0x50,0x11,0x48,0x07,0x0b,0x03,0x03,0x0c,0x08,0x7d,0x61,0xca,0x23,0x12,0x30,0x3c,0x4b,0x66,0x24,0xa9,0x11,0x35,0x28,0x05,0x37,0x34,0xea,0x19,0x2b,0x10,0x10,0x2c,0x14,0xfe,0xac,\r\n0x02,0x04,0x5b,0x2d,0x53,0x6a,0xfe,0x09,0x31,0x52,0x00,0x00,0x00,0x03,0x00,0x2e,0x00,0x00,0x02,0x2a,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x14,0x00,0x3a,0x40,0x37,0x11,0x01,0x06,0x05,0x01,0x4c,0x00,0x06,0x00,0x02,0x04,0x06,0x02,0x67,0x00,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x01,0x5f,0x07,0x03,0x02,\r\n0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x33,0x13,0x33,0x13,0x23,0x27,0x23,0x07,0x25,0x33,0x03,0x23,0x03,0x33,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x2e,0xaa,0xa8,0xaa,0x98,0x32,0xd4,0x32,0x01,0x5c,0x3e,0x98,0x3d,0x8a,0xc1,0x43,0x0c,0x0e,0x02,\r\n0x02,0x10,0x0c,0x02,0xda,0xfd,0x26,0xd5,0xd5,0x28,0x02,0x8a,0xfe,0x4b,0x01,0x29,0x37,0x46,0x0d,0x0b,0x49,0x36,0x00,0x00,0x00,0x06,0x00,0x4b,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x0e,0x00,0x12,0x00,0x1c,0x00,0x23,0x00,0x2b,0x00,0x32,0x00,0x4d,0x40,0x4a,0x23,0x1d,0x18,0x17,0x04,0x04,0x03,0x08,0x01,0x07,0x04,0x32,0x2c,0x28,\r\n0x27,0x04,0x02,0x07,0x03,0x4c,0x00,0x04,0x00,0x07,0x02,0x04,0x07,0x67,0x05,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x2b,0x29,0x26,0x24,0x1c,0x1a,0x15,0x13,0x12,0x11,0x10,0x0f,0x00,0x0e,0x00,0x0d,0x21,0x09,0x09,0x17,0x2b,0x33,0x11,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x4b,0xf2,0x5c,0x6c,0x3c,0x35,0x3e,0x45,0x74,0x63,0xcb,0x3c,0x3c,0x66,0x67,0x0d,\r\n0x18,0x0a,0x0a,0x18,0x0d,0x67,0xbf,0x1f,0x22,0x22,0x1f,0xbf,0x6a,0x19,0x13,0x13,0x19,0x6a,0xbf,0x27,0x2c,0x2c,0x27,0x02,0xda,0x64,0x56,0x43,0x58,0x0e,0x0d,0x5c,0x47,0x5b,0x6c,0x28,0x02,0x8a,0xfe,0xd9,0x03,0x02,0x01,0x1d,0x02,0x03,0xfe,0xef,0x12,0x41,0x2b,0x2b,0x40,0x12,0xfd,0x8c,0x04,0x01,0x33,0x04,0xfe,0xd6,0x13,0x48,\r\n0x32,0x32,0x47,0x13,0x00,0x02,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x19,0x00,0x21,0x00,0x4a,0x40,0x47,0x1b,0x10,0x02,0x02,0x03,0x1a,0x11,0x02,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,\r\n0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x04,0x00,0x51,0x01,0x00,0x17,0x16,0x14,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x19,0x01,0x19,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,\r\n0x01,0x2c,0x67,0x7b,0x7b,0x67,0x69,0x79,0x2a,0x62,0x56,0x2e,0x24,0x24,0x2e,0x56,0x62,0x2a,0x79,0xe5,0x1c,0x20,0x20,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0x53,0x61,0x0f,0xfd,0x80,0x0f,0x61,0x53,0x65,0x77,0x4f,0x02,0x50,0x18,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x00,0x04,0x00,0x4b,0x00,0x00,0x02,0x0e,0x02,0xda,0x00,0x09,\r\n0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x36,0x40,0x33,0x1f,0x18,0x13,0x12,0x04,0x02,0x03,0x01,0x4c,0x05,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x04,0x01,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x17,0x15,0x10,0x0e,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x08,0x21,0x07,0x09,0x17,0x2b,0x33,0x11,\r\n0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x23,0x13,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x4b,0xdb,0x6b,0x7d,0x7d,0x6b,0xb1,0x3c,0x3c,0x66,0x4b,0x19,0x2c,0x13,0x13,0x2c,0x19,0x4b,0xcd,0x1d,0x1f,0x1f,0x1d,0x02,0xda,0x77,0x65,0xfe,0xde,0x65,0x77,0x28,0x02,0x8a,\r\n0xfd,0x76,0x09,0x07,0x02,0x6a,0x08,0x08,0xfd,0x9f,0x17,0x47,0x2d,0x01,0x22,0x2d,0x47,0x17,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x35,0x40,0x32,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x07,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x06,0x01,0x04,0x04,0x05,0x5f,0x08,\r\n0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1b,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x25,0x33,0x11,0x23,0x55,0x01,0xbd,0xfe,0xd5,0x01,0x08,0xfe,0xf8,0x01,0x2b,0xfe,0x6e,0x3c,0x3c,0x02,0xda,0x28,0xfe,0xdf,0x28,0xfe,0xbf,\r\n0x28,0x28,0x02,0x8a,0x00,0x02,0x00,0x5a,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x09,0x00,0x0d,0x00,0x33,0x40,0x30,0x00,0x02,0x00,0x03,0x05,0x02,0x03,0x67,0x06,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x05,0x05,0x04,0x5f,0x07,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x09,0x11,\r\n0x11,0x11,0x11,0x08,0x09,0x1a,0x2b,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x21,0x11,0x27,0x33,0x11,0x23,0x5a,0x01,0xbd,0xfe,0xd5,0x01,0x08,0xfe,0xf8,0x67,0x3c,0x3c,0x02,0xda,0x28,0xfe,0xdf,0x28,0xfe,0x97,0x28,0x02,0x8a,0x00,0x03,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x1c,0x00,0x24,0x00,0x2a,0x00,0x4f,0x40,0x4c,\r\n0x1e,0x10,0x02,0x02,0x03,0x25,0x1d,0x15,0x11,0x04,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x06,0x03,0x02,0x06,0x80,0x00,0x06,0x07,0x01,0x05,0x04,0x06,0x05,0x67,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x04,0x04,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x2a,0x29,0x19,0x18,0x17,0x16,0x14,0x12,0x0f,\r\n0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1c,0x01,0x1c,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x37,0x11,0x23,0x35,0x33,0x15,0x14,0x06,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x35,0x23,0x01,0x2c,0x67,0x7b,0x7b,0x67,0x69,0x79,\r\n0x2a,0x62,0x56,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x50,0xe0,0x7a,0xe4,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x3c,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0x53,0x61,0x0f,0xfd,0x80,0x0f,0x0f,0x01,0x1d,0x28,0xa0,0x65,0x77,0x4f,0x02,0x50,0x18,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x18,0x18,0x47,0x2e,0x78,0x00,0x00,0x00,0x03,0x00,0x4b,\r\n0x00,0x00,0x02,0x0d,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x3f,0x40,0x3c,0x02,0x01,0x00,0x09,0x01,0x07,0x01,0x00,0x07,0x67,0x00,0x01,0x00,0x04,0x06,0x01,0x04,0x67,0x08,0x01,0x06,0x03,0x03,0x06,0x57,0x08,0x01,0x06,0x06,0x03,0x5f,0x0a,0x05,0x02,0x03,0x06,0x03,0x4f,0x00,0x00,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,\r\n0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x23,0x11,0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x23,0x4b,0x90,0xa2,0x90,0x90,0xa2,0x66,0x3c,0x3c,0x01,0x32,0x3c,0x3c,0x02,0xda,0xfe,0xb5,0x01,0x4b,0xfd,0x26,0x01,0x67,0xfe,0x99,0x28,0x02,0x8a,0xfd,0x76,0x02,\r\n0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x07,0x03,0x02,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x06,0x04,0x02,0x00,0x00,0x05,0x5f,0x08,0x01,0x05,0x05,0x39,0x05,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,\r\n0x09,0x1b,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x15,0x27,0x33,0x11,0x23,0x50,0x95,0x95,0x01,0xb8,0x93,0x93,0xf9,0x3c,0x3c,0x28,0x02,0x8a,0x28,0x28,0xfd,0x76,0x28,0x28,0x02,0x8a,0x00,0x02,0x00,0x1b,0xff,0xf6,0x02,0x49,0x02,0xda,0x00,0x12,0x00,0x18,0x00,0x3f,0x40,0x3c,0x13,0x09,0x02,0x02,0x01,0x01,\r\n0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x06,0x05,0x02,0x03,0x03,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x18,0x17,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x12,0x01,0x12,0x08,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,\r\n0x37,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x14,0x06,0x37,0x36,0x36,0x35,0x11,0x23,0xff,0x69,0x7b,0x2a,0x65,0x55,0x30,0x24,0xa1,0x01,0x97,0x66,0x7b,0x15,0x1d,0x1f,0x3c,0x0a,0x77,0x65,0x53,0x61,0x0f,0x02,0x85,0x28,0x28,0xfe,0x20,0x65,0x77,0x50,0x17,0x47,0x2e,0x01,0xe0,0x00,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x45,\r\n0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x43,0x40,0x40,0x13,0x07,0x02,0x01,0x07,0x14,0x01,0x04,0x01,0x02,0x4c,0x00,0x01,0x00,0x04,0x06,0x01,0x04,0x67,0x00,0x07,0x07,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x4d,0x08,0x01,0x06,0x06,0x03,0x60,0x09,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x0e,0x0d,\r\n0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x13,0x33,0x07,0x13,0x23,0x03,0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x03,0x07,0x4b,0x90,0x3a,0xe3,0x33,0xa1,0xbb,0xa0,0x7e,0x4c,0x66,0x3c,0x3c,0x01,0x50,0x42,0x99,0x29,0x02,0xda,0xfe,0xad,0x01,0x53,0xf0,0xfe,0x16,0x01,0x5f,0xfe,\r\n0xa1,0x28,0x02,0x8a,0xfd,0x76,0x01,0x98,0x3d,0x00,0x00,0x00,0x00,0x02,0x00,0x64,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x29,0x40,0x26,0x00,0x04,0x04,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x03,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x09,0x08,0x07,0x06,0x00,0x05,0x00,0x05,0x11,\r\n0x11,0x06,0x09,0x18,0x2b,0x33,0x11,0x33,0x11,0x21,0x15,0x25,0x33,0x11,0x23,0x64,0x90,0x01,0x32,0xfe,0x68,0x3c,0x3c,0x02,0xda,0xfd,0x4e,0x28,0x28,0x02,0x8a,0x00,0x00,0x03,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x1c,0x00,0x43,0x40,0x40,0x0f,0x0c,0x02,0x05,0x00,0x16,0x03,0x02,0x03,0x05,0x02,0x4c,\r\n0x00,0x03,0x05,0x06,0x05,0x03,0x06,0x80,0x07,0x01,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x00,0x14,0x00,0x14,0x16,0x11,0x12,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x17,0x37,0x33,0x11,0x23,0x11,0x34,0x36,\r\n0x36,0x37,0x03,0x23,0x03,0x1e,0x02,0x15,0x11,0x13,0x37,0x27,0x23,0x01,0x33,0x11,0x23,0x32,0xad,0x50,0x4f,0xa8,0x90,0x02,0x02,0x01,0x88,0x32,0x8b,0x02,0x02,0x02,0x9f,0x20,0x57,0x40,0x01,0x3c,0x3c,0x3c,0x02,0xda,0xdf,0xdf,0xfd,0x26,0x01,0xb8,0x33,0x65,0x56,0x1b,0xfe,0x84,0x01,0x7c,0x1b,0x56,0x65,0x33,0xfe,0x48,0x01,0x68,\r\n0x59,0xf1,0xfd,0x76,0x02,0x8a,0x00,0x00,0x00,0x02,0x00,0x5f,0x00,0x00,0x01,0xf9,0x02,0xda,0x00,0x0f,0x00,0x13,0x00,0x35,0x40,0x32,0x0b,0x03,0x02,0x04,0x05,0x01,0x4c,0x01,0x01,0x00,0x00,0x05,0x04,0x00,0x05,0x67,0x00,0x04,0x02,0x02,0x04,0x57,0x00,0x04,0x04,0x02,0x5f,0x06,0x03,0x02,0x02,0x04,0x02,0x4f,0x00,0x00,0x13,0x12,\r\n0x11,0x10,0x00,0x0f,0x00,0x0f,0x11,0x15,0x11,0x07,0x06,0x19,0x2b,0x33,0x11,0x33,0x13,0x26,0x26,0x35,0x11,0x33,0x11,0x23,0x03,0x16,0x16,0x15,0x11,0x25,0x33,0x01,0x23,0x5f,0x7c,0xf9,0x03,0x02,0x2a,0x7e,0xf7,0x02,0x02,0x01,0x10,0x43,0xfe,0xe4,0x42,0x02,0xda,0xfd,0xc7,0x20,0x50,0x1b,0x01,0xae,0xfd,0x26,0x02,0x3a,0x21,0x4f,\r\n0x1c,0xfe,0x52,0x27,0x02,0x8c,0x00,0x00,0x00,0x04,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xe4,0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x3a,0x40,0x37,0x27,0x20,0x19,0x18,0x16,0x15,0x11,0x10,0x08,0x02,0x03,0x01,0x4c,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,\r\n0x00,0x4e,0x0f,0x0e,0x01,0x00,0x14,0x12,0x0e,0x17,0x0f,0x17,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0x2c,\r\n0x68,0x7a,0x7a,0x68,0x68,0x7a,0x7a,0x68,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x4e,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x1f,0x1d,0x0a,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0xfe,0xca,0x65,0x77,0x28,0x0f,0x02,0x80,0x0f,0x0f,0xfd,0x80,0x0f,0x27,0x02,0x50,0x17,0x48,0x2e,0xfe,0xca,0x2e,0x48,0x17,0x17,0x48,0x2e,0x01,0x36,0x2e,\r\n0x48,0x17,0x00,0x00,0x00,0x04,0x00,0x4b,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x16,0x00,0x1b,0x00,0x41,0x40,0x3e,0x1b,0x17,0x13,0x12,0x04,0x05,0x04,0x01,0x4c,0x00,0x00,0x06,0x01,0x04,0x05,0x00,0x04,0x67,0x00,0x05,0x00,0x01,0x03,0x05,0x01,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x07,\r\n0x01,0x02,0x03,0x02,0x4f,0x00,0x00,0x16,0x14,0x11,0x0f,0x0e,0x0d,0x0c,0x0b,0x00,0x0a,0x00,0x0a,0x24,0x21,0x08,0x06,0x18,0x2b,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x11,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x13,0x36,0x35,0x34,0x27,0x4b,0x01,0x09,0x60,0x72,0x73,0x5f,0x79,0x66,0x3c,0x3c,\r\n0x66,0x79,0x1e,0x16,0x16,0x1e,0x79,0xd7,0x42,0x42,0x02,0xda,0x6e,0x5c,0x5c,0x6e,0xfe,0xba,0x28,0x02,0x8a,0xfe,0xbc,0x07,0x01,0x36,0x07,0xfe,0xd6,0x2c,0x5c,0x5e,0x2a,0x00,0x00,0x00,0x00,0x04,0x00,0x4a,0xff,0x4c,0x02,0x0e,0x02,0xe4,0x00,0x12,0x00,0x1c,0x00,0x24,0x00,0x2c,0x00,0x47,0x40,0x44,0x2c,0x25,0x1e,0x1d,0x1b,0x1a,\r\n0x16,0x15,0x08,0x03,0x04,0x11,0x01,0x00,0x03,0x02,0x4c,0x05,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x00,0x00,0x03,0x00,0x51,0x14,0x13,0x00,0x00,0x19,0x17,0x13,0x1c,0x14,0x1c,0x00,0x12,0x00,0x12,0x25,0x22,0x07,0x06,0x18,0x2b,0x05,\r\n0x27,0x06,0x23,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x17,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x11,0x14,0x16,0x05,0x36,0x36,0x35,0x11,0x34,0x26,0x27,0x01,0xc1,0x6a,0x13,0x18,0x67,0x7b,0x7b,0x67,0x67,0x7b,0x43,0x3e,0x71,0xd2,0x2e,0x24,0x24,0x2e,0x2e,\r\n0x24,0x24,0x4e,0x1c,0x20,0x20,0x01,0x14,0x1d,0x1f,0x1f,0x1d,0xb4,0xad,0x03,0x77,0x65,0x01,0x36,0x65,0x77,0x77,0x65,0xfe,0xca,0x4b,0x6a,0x17,0xba,0xd2,0x0f,0x02,0x80,0x0f,0x0f,0xfd,0x80,0x0f,0x28,0x02,0x4e,0x17,0x47,0x2e,0xfe,0xca,0x2e,0x47,0x17,0x17,0x47,0x2e,0x01,0x36,0x2e,0x47,0x17,0x00,0x00,0x00,0x00,0x05,0x00,0x4b,\r\n0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0d,0x00,0x11,0x00,0x19,0x00,0x20,0x00,0x26,0x00,0x4e,0x40,0x4b,0x1e,0x1d,0x16,0x15,0x04,0x06,0x05,0x08,0x01,0x02,0x06,0x02,0x4c,0x00,0x00,0x07,0x01,0x05,0x06,0x00,0x05,0x67,0x00,0x06,0x09,0x01,0x02,0x04,0x06,0x02,0x69,0x08,0x01,0x04,0x01,0x01,0x04,0x57,0x08,0x01,0x04,0x04,0x01,0x5f,\r\n0x0a,0x03,0x02,0x01,0x04,0x01,0x4f,0x00,0x00,0x26,0x24,0x22,0x21,0x19,0x17,0x14,0x12,0x11,0x10,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x16,0x21,0x0b,0x06,0x19,0x2b,0x33,0x11,0x21,0x32,0x16,0x15,0x14,0x06,0x07,0x13,0x23,0x03,0x23,0x11,0x27,0x33,0x11,0x23,0x13,0x33,0x32,0x37,0x11,0x26,0x23,0x23,0x05,0x34,0x26,0x27,0x11,0x36,\r\n0x36,0x03,0x33,0x03,0x06,0x23,0x23,0x4b,0x01,0x04,0x60,0x72,0x4e,0x44,0xab,0xa7,0x9e,0x1a,0x66,0x3c,0x3c,0x66,0x74,0x1e,0x1a,0x1a,0x1e,0x74,0x01,0x1c,0x25,0x21,0x20,0x26,0x46,0x43,0x8f,0x0b,0x0b,0x2d,0x02,0xda,0x6e,0x5c,0x4c,0x66,0x11,0xfe,0xb3,0x01,0x46,0xfe,0xba,0x28,0x02,0x8a,0xfe,0xbc,0x08,0x01,0x34,0x08,0xa2,0x2d,\r\n0x45,0x15,0xfe,0xf2,0x15,0x46,0xfe,0x44,0x01,0x1f,0x01,0x00,0x00,0x02,0x00,0x41,0xff,0xf6,0x02,0x17,0x02,0xe4,0x00,0x27,0x00,0x41,0x00,0x3a,0x40,0x37,0x3f,0x01,0x03,0x04,0x32,0x01,0x01,0x00,0x02,0x4c,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x00,0x01,0x04,0x00,0x01,0x7e,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,\r\n0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,0x4e,0x2b,0x22,0x12,0x2b,0x22,0x10,0x06,0x09,0x1c,0x2b,0x37,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x13,0x14,\r\n0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x06,0x06,0x41,0x2a,0x61,0x52,0x3a,0x44,0x31,0x2b,0x6d,0x3e,0x49,0x81,0x6d,0x5c,0x6b,0x2a,0x57,0x4a,0x37,0x40,0x32,0x2b,0x6e,0x41,0x4c,0x86,0x73,0x66,0x77,0x35,0x3b,0x33,0x6d,0x36,0x3f,0x23,0x1f,0x31,0x39,0x3f,\r\n0x35,0x6c,0x38,0x41,0x27,0x20,0x2f,0x37,0xc0,0x4a,0x57,0x4c,0x40,0x24,0x40,0x13,0x31,0x1c,0x67,0x3d,0x60,0x71,0x65,0x56,0x44,0x4f,0x3f,0x36,0x1f,0x39,0x13,0x31,0x1d,0x72,0x46,0x67,0x79,0x6d,0x01,0xb5,0x31,0x55,0x17,0x32,0x19,0x53,0x2f,0x2b,0x4a,0x14,0x12,0x5e,0x3e,0x3a,0x5f,0x17,0x30,0x19,0x4e,0x2a,0x29,0x3d,0x0b,0x0b,\r\n0x54,0x00,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x2b,0x40,0x28,0x05,0x02,0x02,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x00,0x04,0x04,0x03,0x5f,0x06,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x07,0x09,0x19,0x2b,0x33,\r\n0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x27,0x33,0x11,0x23,0xe5,0xb3,0x01,0xf4,0xb1,0x66,0x3c,0x3c,0x02,0xb2,0x28,0x28,0xfd,0x4e,0x28,0x02,0x8a,0x00,0x02,0x00,0x4a,0xff,0xf6,0x02,0x0e,0x02,0xda,0x00,0x10,0x00,0x16,0x00,0x32,0x40,0x2f,0x11,0x06,0x02,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,\r\n0x00,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x13,0x12,0x0d,0x0c,0x09,0x07,0x05,0x04,0x00,0x10,0x01,0x10,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x27,0x11,0x23,0x11,0x14,0x16,0x01,0x2c,0x67,0x7b,0x90,0x24,0x2e,0x56,0x62,0x2a,0x7a,\r\n0xe4,0x3c,0x20,0x0a,0x77,0x65,0x02,0x08,0xfd,0x53,0x0f,0x61,0x53,0x02,0x08,0xfd,0xf8,0x65,0x77,0x4f,0x02,0x6d,0xfe,0x20,0x2e,0x47,0x00,0x00,0x00,0x02,0x00,0x2e,0x00,0x00,0x02,0x2a,0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x2f,0x40,0x2c,0x06,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,\r\n0x03,0x03,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x18,0x11,0x06,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x27,0x33,0x03,0x23,0xdd,0xaf,0x98,0x7f,0x0d,0x0e,0x01,0x02,0x0f,0x0d,0x7f,0x2c,0xaf,0x7b,0x3d,0x9a,0x3e,0x02,0xda,0xfd,\r\n0xe4,0x37,0x42,0x11,0x11,0x43,0x36,0x02,0x1c,0xfd,0x26,0x28,0x02,0x8a,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x1f,0x00,0x23,0x00,0x2d,0x00,0x3a,0x40,0x37,0x2d,0x29,0x1a,0x0f,0x06,0x05,0x05,0x06,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x02,0x01,0x02,0x00,0x00,0x38,0x4d,0x07,0x01,0x05,0x05,0x03,0x60,\r\n0x08,0x04,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x11,0x18,0x18,0x11,0x09,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x23,0x27,0x26,0x26,0x35,0x23,0x06,0x06,0x07,0x07,0x27,0x33,0x03,0x23,\r\n0x01,0x33,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x59,0x59,0x92,0x45,0x04,0x01,0x03,0x05,0x04,0x04,0x56,0x38,0x5f,0x05,0x04,0x03,0x04,0x02,0x03,0x40,0x2a,0x5d,0x8e,0x28,0x08,0x0d,0x02,0x02,0x0b,0x08,0x30,0x69,0x3c,0x51,0x3c,0x01,0x5f,0x3e,0x59,0x07,0x09,0x04,0x04,0x0b,0x05,0x08,0x02,0xda,0xfd,0xe4,0x1b,0x25,0x22,0x22,\r\n0x25,0x1b,0x02,0x1c,0xfd,0xe4,0x1b,0x25,0x22,0x22,0x25,0x1b,0x02,0x1c,0xfd,0x26,0xd5,0x2e,0x65,0x21,0x28,0x66,0x26,0xd5,0x27,0x02,0x8c,0xfd,0x74,0x01,0xeb,0x27,0x46,0x1e,0x1c,0x48,0x27,0x3b,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x0f,0x00,0x34,0x40,0x31,0x0a,0x07,0x04,0x01,0x04,0x04,\r\n0x05,0x01,0x4c,0x00,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x04,0x04,0x02,0x60,0x06,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x07,0x09,0x19,0x2b,0x33,0x13,0x03,0x33,0x13,0x13,0x33,0x03,0x13,0x23,0x03,0x03,0x25,0x33,0x01,0x23,0x22,0xcb,0xcf,0xa9,\r\n0x85,0xa2,0x31,0xbd,0xd8,0xa9,0x8e,0xb1,0x01,0x5c,0x46,0xfe,0xb6,0x45,0x01,0x43,0x01,0x97,0xfe,0xfb,0x01,0x05,0xfe,0xcf,0xfe,0x57,0x01,0x17,0xfe,0xe9,0x28,0x02,0x8a,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,0x00,0x02,0x44,0x02,0xda,0x00,0x0e,0x00,0x14,0x00,0x33,0x40,0x30,0x14,0x11,0x0d,0x07,0x01,0x05,0x03,0x04,0x01,0x4c,\r\n0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x5f,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x13,0x12,0x10,0x0f,0x00,0x0e,0x00,0x0e,0x18,0x12,0x06,0x09,0x18,0x2b,0x33,0x11,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x11,0x27,0x33,0x35,0x03,0x23,0x13,0xe6,0xd2,0xa2,0x92,\r\n0x0a,0x0f,0x03,0x03,0x12,0x0a,0x92,0x2f,0xce,0x66,0x3c,0xb4,0x42,0xba,0x01,0x04,0x01,0xd6,0xfe,0xba,0x16,0x2a,0x0a,0x0b,0x2c,0x16,0x01,0x43,0xfe,0x45,0xfe,0xe1,0x28,0xf7,0x01,0x93,0xfe,0x60,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x09,0x00,0x0d,0x00,0x3c,0x40,0x39,0x06,0x01,0x02,0x02,0x00,0x01,\r\n0x4c,0x00,0x01,0x04,0x01,0x00,0x02,0x01,0x00,0x67,0x07,0x05,0x02,0x02,0x03,0x03,0x02,0x57,0x07,0x05,0x02,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x0a,0x0a,0x00,0x00,0x0a,0x0d,0x0a,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x12,0x11,0x12,0x08,0x06,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x25,0x01,\r\n0x23,0x01,0x46,0x01,0x2e,0xfe,0xdc,0x01,0xbd,0xfe,0xd2,0x01,0x33,0xfe,0xa0,0x01,0x30,0x41,0xfe,0xd0,0x2c,0x02,0x86,0x28,0x2c,0xfd,0x7a,0x28,0x28,0x02,0x8a,0xfd,0x76,0x00,0x00,0x00,0x00,0x04,0x00,0x36,0xff,0xf6,0x02,0x10,0x02,0x30,0x00,0x1a,0x00,0x23,0x00,0x2d,0x00,0x32,0x00,0xb2,0x4b,0xb0,0x18,0x50,0x58,0x40,0x11,0x20,\r\n0x01,0x02,0x04,0x2f,0x2e,0x2b,0x18,0x04,0x06,0x08,0x2c,0x01,0x00,0x06,0x03,0x4c,0x1b,0x40,0x11,0x20,0x01,0x02,0x04,0x2f,0x2e,0x2b,0x18,0x04,0x06,0x08,0x2c,0x01,0x07,0x06,0x03,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x29,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x06,0x01,0x08,0x67,0x00,0x02,0x02,0x04,\r\n0x61,0x00,0x04,0x04,0x41,0x4d,0x0a,0x07,0x02,0x06,0x06,0x00,0x61,0x05,0x09,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x31,0x00,0x03,0x02,0x01,0x02,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x06,0x01,0x08,0x67,0x00,0x02,0x02,0x04,0x61,0x00,0x04,0x04,0x41,0x4d,0x00,0x06,0x06,0x05,0x5f,0x00,0x05,0x05,0x39,0x4d,0x0a,0x01,0x07,0x07,\r\n0x00,0x61,0x09,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1d,0x25,0x24,0x01,0x00,0x2a,0x28,0x24,0x2d,0x25,0x2d,0x1c,0x1b,0x17,0x16,0x13,0x11,0x0f,0x0e,0x0c,0x0a,0x07,0x05,0x00,0x1a,0x01,0x1a,0x0b,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x36,0x36,0x33,0x32,0x16,0x15,\r\n0x11,0x23,0x35,0x06,0x06,0x37,0x33,0x11,0x34,0x26,0x27,0x16,0x16,0x15,0x03,0x32,0x36,0x35,0x35,0x23,0x22,0x07,0x15,0x16,0x27,0x35,0x06,0x15,0x14,0xe7,0x52,0x5f,0x5e,0x52,0x9a,0x44,0x3b,0x39,0x49,0x03,0x2a,0x03,0x68,0x67,0x73,0x79,0x90,0x10,0x50,0x8a,0x3c,0x4a,0x44,0x26,0x2c,0xc0,0x45,0x51,0x9a,0x11,0x0f,0x11,0x3b,0x3c,\r\n0x0a,0x5a,0x4d,0x4b,0x57,0x38,0x44,0x4a,0x45,0x3a,0x4a,0x60,0x5f,0x5a,0xfe,0x89,0x53,0x2b,0x32,0x32,0x01,0x4f,0x3e,0x4e,0x0a,0x10,0x51,0x35,0xfe,0xa7,0x4a,0x3f,0x70,0x03,0xf3,0x03,0x11,0xd8,0x20,0x4a,0x4e,0x00,0x00,0x00,0x00,0x04,0x00,0x4b,0xff,0xf6,0x02,0x17,0x02,0xda,0x00,0x11,0x00,0x15,0x00,0x23,0x00,0x2a,0x00,0x9e,\r\n0x4b,0xb0,0x18,0x50,0x58,0x40,0x0e,0x2a,0x24,0x1a,0x08,0x03,0x05,0x04,0x07,0x19,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0e,0x2a,0x24,0x1a,0x08,0x03,0x05,0x04,0x07,0x19,0x01,0x06,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,\r\n0x41,0x4d,0x09,0x06,0x02,0x04,0x04,0x00,0x61,0x01,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x01,0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,\r\n0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x15,0x14,0x13,0x12,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x11,0x01,0x11,0x0a,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x15,0x23,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x25,0x33,0x11,0x23,0x13,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x06,0x15,0x15,\r\n0x14,0x16,0x37,0x36,0x35,0x35,0x34,0x26,0x27,0x01,0x6e,0x37,0x4c,0x10,0x90,0x90,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0xfe,0xb9,0x3c,0x3c,0xef,0x09,0x12,0x08,0x08,0x12,0x09,0x3f,0x4a,0x4a,0x8c,0x3c,0x1f,0x1d,0x0a,0x30,0x2a,0x50,0x02,0xda,0xfe,0xfc,0x2a,0x30,0x6c,0x5c,0xab,0x5b,0x6c,0x32,0x02,0x8a,0xfd,0x6c,0x02,0x02,0x01,0xe2,\r\n0x02,0x02,0x56,0x4a,0xab,0x49,0x56,0x16,0x29,0x60,0xab,0x2f,0x47,0x14,0x00,0x00,0x00,0x02,0x00,0x4b,0xff,0xf6,0x02,0x0d,0x02,0x30,0x00,0x19,0x00,0x21,0x00,0x47,0x40,0x44,0x1b,0x10,0x02,0x02,0x03,0x1a,0x11,0x02,0x04,0x05,0x02,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x03,0x03,\r\n0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x17,0x16,0x14,0x12,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x33,0x32,0x36,0x35,0x33,0x14,\r\n0x06,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x01,0x2f,0x69,0x7b,0x7b,0x69,0x66,0x78,0x2a,0x61,0x53,0x2f,0x25,0x25,0x2f,0x53,0x61,0x2a,0x78,0xe4,0x1c,0x20,0x20,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x4e,0x5c,0x0e,0xfe,0x32,0x0e,0x5b,0x4e,0x60,0x71,0x4d,0x01,0x9f,0x16,0x43,0x2b,0x97,0x2b,0x42,0x00,0x00,0x04,0x00,0x41,\r\n0xff,0xf6,0x02,0x0d,0x02,0xda,0x00,0x11,0x00,0x15,0x00,0x23,0x00,0x2a,0x00,0x9e,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0e,0x25,0x24,0x20,0x0f,0x0a,0x05,0x04,0x07,0x21,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0e,0x25,0x24,0x20,0x0f,0x0a,0x05,0x04,0x07,0x21,0x01,0x06,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x05,\r\n0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x09,0x06,0x02,0x04,0x04,0x00,0x61,0x03,0x08,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,\r\n0x39,0x4d,0x09,0x01,0x06,0x06,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1b,0x17,0x16,0x01,0x00,0x1e,0x1c,0x16,0x23,0x17,0x23,0x15,0x14,0x13,0x12,0x0e,0x0d,0x0c,0x0b,0x08,0x06,0x00,0x11,0x01,0x11,0x0a,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x23,0x35,0x06,0x06,\r\n0x37,0x33,0x11,0x23,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x16,0x16,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0xea,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x90,0x90,0x10,0x4c,0x86,0x3c,0x3c,0xb3,0x3f,0x4a,0x4a,0x3f,0x09,0x12,0x08,0x08,0x12,0x44,0x1c,0x20,0x0a,0x6c,0x5b,0xab,0x5c,0x6c,0x30,0x2a,0x01,0x04,0xfd,\r\n0x26,0x50,0x2a,0x30,0x32,0x02,0x8a,0xfd,0x6c,0x56,0x49,0xab,0x4a,0x56,0x02,0x02,0xfe,0x1e,0x02,0x02,0x16,0x01,0xbe,0x14,0x47,0x2f,0xab,0x60,0x00,0x04,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0x30,0x00,0x15,0x00,0x1c,0x00,0x22,0x00,0x2a,0x00,0x4f,0x40,0x4c,0x24,0x22,0x1c,0x18,0x04,0x05,0x06,0x23,0x0d,0x02,0x03,0x04,0x02,0x4c,\r\n0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x07,0x01,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x06,0x06,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1e,0x1d,0x1b,0x19,0x17,0x16,0x13,0x12,0x10,0x0e,0x0c,0x0b,0x08,0x06,0x00,0x15,0x01,0x15,0x09,0x09,0x16,0x2b,0x05,\r\n0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x21,0x15,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x33,0x35,0x26,0x23,0x22,0x07,0x17,0x33,0x35,0x34,0x26,0x27,0x01,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x01,0x2e,0x6b,0x7d,0x7d,0x6b,0x69,0x7b,0xfe,0xc4,0x26,0x32,0x53,0x64,0x03,0x2a,0x03,0x7b,0xbe,0xac,0x25,0x2f,\r\n0x32,0x26,0xd6,0x3c,0x1f,0x1d,0xff,0x00,0x1c,0x20,0x20,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x5a,0xd7,0x0f,0x56,0x49,0x5b,0x6c,0x01,0x36,0xce,0x0e,0x0f,0xcd,0x32,0x2b,0x43,0x16,0xfe,0x62,0x01,0x9d,0x16,0x42,0x2b,0x97,0x2b,0x42,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x14,0x00,0x1a,0x00,0x40,\r\n0x40,0x3d,0x17,0x01,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x06,0x01,0x01,0x01,0x02,0x5f,0x05,0x01,0x02,0x02,0x3b,0x4d,0x09,0x07,0x02,0x00,0x00,0x08,0x5f,0x0a,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x16,0x15,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x11,0x23,0x11,0x11,0x11,0x0b,0x09,0x1e,0x2b,\r\n0x33,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x25,0x33,0x11,0x06,0x06,0x15,0x41,0x8d,0x8d,0x8d,0x3d,0x3d,0xca,0xb4,0xb4,0xb4,0xb4,0xfe,0xe6,0x3c,0x1d,0x1f,0x28,0x01,0xd6,0x28,0x37,0x3b,0x42,0x28,0x8c,0x28,0xfe,0x2a,0x28,0x28,0x02,0x89,0x04,0x2f,0x21,0x00,0x00,\r\n0x00,0x04,0x00,0x41,0xff,0x4c,0x02,0x0d,0x02,0x30,0x00,0x19,0x00,0x25,0x00,0x2a,0x00,0x32,0x00,0x9f,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x2c,0x2b,0x24,0x23,0x13,0x06,0x06,0x05,0x06,0x26,0x01,0x00,0x01,0x02,0x4c,0x1b,0x40,0x12,0x23,0x01,0x07,0x06,0x2c,0x2b,0x24,0x13,0x06,0x05,0x05,0x07,0x26,0x01,0x00,0x01,0x03,0x4c,0x59,\r\n0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x06,0x06,0x02,0x61,0x03,0x01,0x02,0x02,0x41,0x4d,0x09,0x01,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x00,0x00,0x04,0x5f,0x08,0x01,0x04,0x04,0x3d,0x04,0x4e,0x1b,0x40,0x2b,0x00,0x06,0x06,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x07,0x07,0x03,0x5f,0x00,0x03,0x03,0x3b,\r\n0x4d,0x09,0x01,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x3f,0x4d,0x00,0x00,0x00,0x04,0x5f,0x08,0x01,0x04,0x04,0x3d,0x04,0x4e,0x59,0x40,0x17,0x1b,0x1a,0x00,0x00,0x2a,0x29,0x22,0x20,0x1a,0x25,0x1b,0x25,0x00,0x19,0x00,0x18,0x13,0x25,0x24,0x31,0x0a,0x09,0x1a,0x2b,0x17,0x35,0x33,0x32,0x32,0x37,0x35,0x06,0x06,0x23,0x22,0x26,0x35,\r\n0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x14,0x06,0x23,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x07,0x11,0x16,0x17,0x36,0x35,0x11,0x23,0x01,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x6d,0xfd,0x05,0x0a,0x04,0x10,0x4a,0x37,0x4f,0x5c,0x5c,0x4f,0x37,0x4a,0x10,0x90,0x58,0x4b,0x74,0x40,0x47,0x47,0x40,0x15,0x10,0x10,\r\n0xc6,0x3c,0x3c,0xff,0x00,0x1c,0x20,0x20,0xb4,0x28,0x01,0xd8,0x29,0x2e,0x6c,0x5b,0xab,0x5c,0x6c,0x2e,0x29,0x4d,0xfd,0xcb,0x4c,0x59,0xd2,0x56,0x49,0xab,0x4a,0x56,0x04,0xfe,0x1e,0x04,0x9c,0x1e,0x51,0x02,0x0d,0xfe,0x37,0x01,0xbc,0x14,0x46,0x2f,0xab,0x2f,0x45,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x10,0x02,0xda,0x00,0x12,\r\n0x00,0x16,0x00,0x1b,0x00,0x40,0x40,0x3d,0x1b,0x0c,0x03,0x03,0x05,0x03,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x12,0x00,0x12,0x22,0x13,\r\n0x23,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x11,0x36,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x26,0x23,0x22,0x06,0x15,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x34,0x27,0x4b,0x90,0x11,0x48,0x34,0x4d,0x5b,0x90,0x0f,0x13,0x3d,0x46,0x66,0x3c,0x3c,0x01,0x35,0x3c,0x3c,0x02,0xda,0xfe,0xfe,0x2a,0x2e,0x6c,0x5c,0xfe,0x98,0x02,\r\n0x04,0x04,0x56,0x4a,0xfe,0x98,0x28,0x02,0x8a,0xfd,0x76,0x01,0x40,0x60,0x29,0x00,0x00,0x04,0x00,0x41,0x00,0x00,0x02,0x26,0x03,0x19,0x00,0x0b,0x00,0x17,0x00,0x21,0x00,0x25,0x00,0x8b,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2d,0x0c,0x01,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x0a,\r\n0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x09,0x07,0x02,0x04,0x04,0x08,0x5f,0x0d,0x01,0x08,0x08,0x39,0x08,0x4e,0x1b,0x40,0x2b,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0c,0x01,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x0a,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x09,0x07,0x02,0x04,0x04,0x08,0x5f,0x0d,\r\n0x01,0x08,0x08,0x39,0x08,0x4e,0x59,0x40,0x25,0x18,0x18,0x0d,0x0c,0x01,0x00,0x25,0x24,0x23,0x22,0x18,0x21,0x18,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0e,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x25,0x33,0x11,0x23,0x01,0x3b,0x29,0x31,0x31,0x29,0x29,0x31,0x31,0x29,0x17,0x1b,0x1b,0x17,0x17,0x1b,0x1b,0xe3,0xb3,0x9a,0x01,0x2a,0xa2,0xfe,0xf8,0x3c,0x3c,0x02,0x7d,0x2a,0x24,0x24,0x2a,0x2a,0x24,0x24,0x2a,0x23,0x18,0x13,0x14,0x17,0x17,\r\n0x14,0x13,0x18,0xfd,0x60,0x28,0x01,0xd6,0x28,0xfe,0x02,0x28,0x28,0x01,0xd6,0x00,0x00,0x04,0x00,0x4b,0xff,0x4c,0x01,0xbd,0x03,0x19,0x00,0x0b,0x00,0x17,0x00,0x24,0x00,0x29,0x00,0x8b,0xb6,0x25,0x1c,0x02,0x04,0x05,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x2b,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x03,0x03,\r\n0x01,0x61,0x00,0x01,0x01,0x40,0x4d,0x08,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x00,0x04,0x04,0x07,0x5f,0x0b,0x01,0x07,0x07,0x3d,0x07,0x4e,0x1b,0x40,0x29,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x0a,0x01,0x02,0x09,0x01,0x00,0x06,0x02,0x00,0x69,0x08,0x01,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3b,0x4d,0x00,0x04,\r\n0x04,0x07,0x5f,0x0b,0x01,0x07,0x07,0x3d,0x07,0x4e,0x59,0x40,0x21,0x18,0x18,0x0d,0x0c,0x01,0x00,0x29,0x28,0x18,0x24,0x18,0x23,0x20,0x1f,0x1e,0x1d,0x1b,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x35,0x33,0x32,0x37,0x11,0x23,0x35,0x21,0x11,0x14,0x06,0x23,0x37,0x36,0x35,0x11,0x23,0x01,0x63,0x29,0x31,0x31,0x29,0x29,0x31,0x31,0x29,0x17,0x1b,0x1b,0x17,0x17,0x1b,0x1b,0xfe,0xff,0x9f,0x1c,0x16,0xbd,0x01,0x4d,0x66,0x5c,0x5c,0x3c,0x3c,0x02,0x7d,0x2a,0x24,0x24,0x2a,0x2a,0x24,0x24,\r\n0x2a,0x23,0x18,0x13,0x14,0x17,0x17,0x14,0x13,0x18,0xfc,0xac,0x28,0x06,0x02,0x84,0x28,0xfd,0xe4,0x59,0x65,0x40,0x26,0x58,0x01,0xf4,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x32,0x02,0xda,0x00,0x0c,0x00,0x10,0x00,0x14,0x00,0x47,0x40,0x44,0x13,0x07,0x02,0x01,0x02,0x14,0x01,0x04,0x01,0x02,0x4c,0x00,0x01,0x00,0x04,0x06,\r\n0x01,0x04,0x67,0x00,0x07,0x07,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x02,0x02,0x3b,0x4d,0x08,0x01,0x06,0x06,0x03,0x60,0x09,0x05,0x02,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x33,0x11,0x33,0x11,0x33,0x37,0x33,0x07,0x13,0x23,0x03,\r\n0x23,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x03,0x07,0x4b,0x90,0x37,0xd6,0x3e,0x99,0xa5,0xa8,0x67,0x48,0x66,0x3c,0x3c,0x01,0x36,0x44,0x82,0x2a,0x02,0xda,0xfe,0x51,0xfb,0xaf,0xfe,0x89,0x01,0x03,0xfe,0xfd,0x28,0x02,0x8a,0xfd,0x76,0x01,0x2a,0x2f,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x0f,0x00,0x31,\r\n0x40,0x2e,0x0b,0x01,0x03,0x01,0x01,0x4c,0x04,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x03,0x03,0x00,0x5f,0x05,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x0d,0x0c,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x0a,0x01,0x0a,0x06,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x27,0x11,0x23,0x11,\r\n0x14,0x01,0x6a,0x43,0x49,0xac,0x01,0x3d,0xb7,0xe1,0x3c,0x47,0x40,0x02,0x26,0x2d,0xfd,0x53,0x2d,0x30,0x02,0x7d,0xfd,0xda,0x48,0x00,0x00,0x00,0x00,0x04,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0x30,0x00,0x1c,0x00,0x22,0x00,0x28,0x00,0x2c,0x00,0xc1,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x0e,0x28,0x22,0x09,0x03,0x04,0x07,0x05,0x01,0x4c,\r\n0x12,0x01,0x05,0x01,0x4b,0x1b,0x40,0x11,0x28,0x22,0x02,0x0a,0x05,0x09,0x03,0x02,0x07,0x0a,0x02,0x4c,0x12,0x01,0x05,0x01,0x4b,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1d,0x0a,0x01,0x05,0x05,0x00,0x61,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x4b,\r\n0xb0,0x1a,0x50,0x58,0x40,0x27,0x0a,0x01,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x0a,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x25,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x00,0x0a,0x0a,0x00,0x5f,\r\n0x00,0x00,0x00,0x3b,0x4d,0x09,0x08,0x02,0x07,0x07,0x03,0x60,0x0b,0x06,0x04,0x03,0x03,0x03,0x39,0x03,0x4e,0x59,0x59,0x40,0x17,0x00,0x00,0x2c,0x2b,0x2a,0x29,0x24,0x23,0x1e,0x1d,0x00,0x1c,0x00,0x1c,0x11,0x15,0x13,0x24,0x23,0x11,0x0c,0x09,0x1c,0x2b,0x33,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,\r\n0x15,0x11,0x23,0x11,0x06,0x06,0x15,0x11,0x23,0x11,0x06,0x06,0x15,0x11,0x25,0x33,0x11,0x34,0x26,0x27,0x03,0x33,0x11,0x34,0x26,0x27,0x03,0x33,0x11,0x23,0x0f,0x8c,0x07,0x34,0x29,0x26,0x38,0x0a,0x06,0x39,0x2d,0x36,0x40,0x8e,0x24,0x2a,0x82,0x24,0x2a,0x01,0x46,0x3c,0x20,0x1c,0xd0,0x32,0x1b,0x17,0xda,0x3c,0x3c,0x02,0x26,0x42,\r\n0x23,0x29,0x2a,0x24,0x24,0x2a,0x46,0x3b,0xfe,0x51,0x02,0x07,0x04,0x32,0x28,0xfe,0x57,0x02,0x08,0x02,0x34,0x29,0xfe,0x57,0x28,0x01,0x81,0x23,0x31,0x07,0xfe,0x24,0x01,0x81,0x21,0x2e,0x0a,0xfe,0x26,0x01,0xd6,0x00,0x00,0x00,0x00,0x03,0x00,0x4b,0x00,0x00,0x02,0x10,0x02,0x30,0x00,0x12,0x00,0x16,0x00,0x1b,0x00,0x7a,0x4b,0xb0,\r\n0x18,0x50,0x58,0xb7,0x1b,0x0c,0x03,0x03,0x05,0x03,0x01,0x4c,0x1b,0x40,0x0b,0x0c,0x01,0x06,0x03,0x1b,0x03,0x02,0x05,0x06,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1a,0x06,0x01,0x03,0x03,0x00,0x61,0x01,0x01,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x22,0x00,\r\n0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x06,0x06,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x02,0x5f,0x08,0x04,0x02,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x13,0x00,0x00,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x12,0x00,0x12,0x22,0x13,0x23,0x11,0x09,0x09,0x1a,0x2b,0x33,0x11,0x33,0x15,0x36,0x36,0x33,0x32,\r\n0x16,0x15,0x11,0x23,0x11,0x26,0x23,0x22,0x06,0x15,0x11,0x27,0x33,0x11,0x23,0x01,0x33,0x11,0x34,0x27,0x4b,0x90,0x11,0x48,0x34,0x4d,0x5b,0x90,0x0f,0x13,0x3d,0x46,0x66,0x3c,0x3c,0x01,0x35,0x3c,0x3c,0x02,0x26,0x4b,0x29,0x2c,0x6c,0x5c,0xfe,0x98,0x02,0x04,0x04,0x56,0x4a,0xfe,0x98,0x28,0x01,0xd6,0xfe,0x2a,0x01,0x40,0x60,0x29,\r\n0x00,0x04,0x00,0x46,0xff,0xf6,0x02,0x12,0x02,0x30,0x00,0x0d,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x3a,0x40,0x37,0x27,0x20,0x19,0x18,0x16,0x15,0x11,0x10,0x08,0x02,0x03,0x01,0x4c,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x14,0x12,\r\n0x0e,0x17,0x0f,0x17,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x37,0x11,0x26,0x23,0x22,0x07,0x11,0x16,0x27,0x11,0x06,0x06,0x15,0x15,0x14,0x16,0x05,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x01,0x2c,0x6a,0x7c,0x7c,0x6a,0x6a,0x7c,0x7c,0x6a,\r\n0x31,0x25,0x25,0x31,0x30,0x26,0x26,0x50,0x1c,0x20,0x20,0x01,0x1c,0x1d,0x1f,0x1f,0x1d,0x0a,0x71,0x60,0x97,0x61,0x71,0x71,0x61,0x97,0x60,0x71,0x28,0x0f,0x01,0xcc,0x0f,0x0f,0xfe,0x34,0x0f,0x26,0x01,0x9e,0x16,0x43,0x2b,0x97,0x2b,0x42,0x16,0x16,0x42,0x2b,0x97,0x2b,0x43,0x16,0x00,0x00,0x00,0x04,0x00,0x4b,0xff,0x4c,0x02,0x17,\r\n0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x23,0x00,0x2a,0x00,0x98,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x2a,0x24,0x16,0x15,0x10,0x03,0x06,0x04,0x05,0x01,0x4c,0x1b,0x40,0x0e,0x16,0x01,0x07,0x05,0x2a,0x24,0x15,0x10,0x03,0x05,0x04,0x07,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x05,0x05,0x00,0x61,0x01,0x01,0x00,\r\n0x00,0x3b,0x4d,0x09,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x07,0x07,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x09,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3f,0x4d,0x00,0x06,0x06,0x03,\r\n0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x18,0x13,0x12,0x00,0x00,0x23,0x22,0x21,0x20,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,0x00,0x11,0x25,0x23,0x11,0x0a,0x09,0x19,0x2b,0x17,0x11,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x37,0x32,0x36,0x37,0x11,0x26,0x26,0x23,0x22,0x06,\r\n0x15,0x15,0x14,0x16,0x07,0x33,0x11,0x23,0x01,0x36,0x36,0x35,0x35,0x34,0x27,0x4b,0x90,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x89,0x09,0x12,0x08,0x08,0x12,0x09,0x3f,0x4a,0x4a,0xb0,0x3c,0x3c,0x01,0x3c,0x1d,0x1f,0x3c,0xb4,0x02,0xda,0x50,0x2a,0x30,0x6b,0x5c,0xab,0x5c,0x6c,0x30,0x2a,0xfe,0xfc,0xd2,0x02,0x02,0x01,\r\n0xe2,0x02,0x02,0x55,0x4a,0xab,0x49,0x57,0xaa,0x02,0x8a,0xfe,0x36,0x14,0x47,0x2f,0xab,0x60,0x29,0x00,0x00,0x04,0x00,0x41,0xff,0x4c,0x02,0x0d,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x23,0x00,0x2a,0x00,0x98,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0b,0x25,0x24,0x1d,0x1c,0x0e,0x01,0x06,0x04,0x05,0x01,0x4c,0x1b,0x40,0x0e,0x1c,0x01,0x07,\r\n0x05,0x25,0x24,0x1d,0x0e,0x01,0x05,0x04,0x07,0x02,0x4c,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x07,0x01,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x41,0x4d,0x09,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x2b,0x00,0x05,0x05,0x01,0x61,0x00,0x01,\r\n0x01,0x41,0x4d,0x00,0x07,0x07,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x09,0x01,0x04,0x04,0x00,0x61,0x00,0x00,0x00,0x3f,0x4d,0x00,0x06,0x06,0x03,0x5f,0x08,0x01,0x03,0x03,0x3d,0x03,0x4e,0x59,0x40,0x18,0x13,0x12,0x00,0x00,0x23,0x22,0x21,0x20,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x00,0x11,0x00,0x11,0x13,0x25,0x23,0x0a,0x09,0x19,0x2b,\r\n0x05,0x11,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x35,0x33,0x11,0x25,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x11,0x16,0x16,0x17,0x33,0x11,0x23,0x01,0x11,0x06,0x15,0x15,0x14,0x16,0x01,0x7d,0x10,0x4c,0x37,0x4e,0x5b,0x5b,0x4e,0x37,0x4c,0x10,0x90,0xfe,0xe7,0x3f,0x4a,0x4a,0x3f,0x09,0x12,\r\n0x08,0x08,0x12,0xbc,0x3c,0x3c,0xff,0x00,0x3c,0x20,0xb4,0x01,0x04,0x2a,0x30,0x6c,0x5c,0xab,0x5c,0x6b,0x30,0x2a,0x50,0xfd,0x26,0xd2,0x57,0x49,0xab,0x4a,0x55,0x02,0x02,0xfe,0x1e,0x02,0x02,0xaa,0x02,0x8a,0xfe,0x36,0x01,0xbe,0x29,0x60,0xab,0x2f,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x30,0x02,0x30,0x00,0x19,\r\n0x00,0x1d,0x00,0x77,0xb5,0x07,0x01,0x04,0x01,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x23,0x00,0x04,0x01,0x00,0x01,0x04,0x00,0x80,0x09,0x05,0x02,0x01,0x01,0x02,0x61,0x03,0x01,0x02,0x02,0x3b,0x4d,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x0a,0x01,0x07,0x07,0x39,0x07,0x4e,0x1b,0x40,0x2b,0x00,0x04,0x01,0x00,0x01,0x04,0x00,0x80,\r\n0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x41,0x4d,0x09,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x08,0x06,0x02,0x00,0x00,0x07,0x5f,0x0a,0x01,0x07,0x07,0x39,0x07,0x4e,0x59,0x40,0x14,0x00,0x00,0x1d,0x1c,0x1b,0x1a,0x00,0x19,0x00,0x19,0x13,0x23,0x13,0x23,0x11,0x11,0x11,0x0b,0x09,0x1d,0x2b,0x33,0x35,0x33,0x11,0x23,\r\n0x35,0x33,0x15,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x33,0x15,0x27,0x33,0x11,0x23,0x2d,0x5f,0x5f,0xef,0x0f,0x40,0x2f,0x4e,0x48,0x2a,0x35,0x3f,0x3b,0x3b,0x78,0xde,0x3c,0x3c,0x28,0x01,0xd6,0x28,0x48,0x27,0x2b,0x6c,0x5c,0x23,0x23,0x4a,0x56,0x56,0x4a,0xfe,0xc0,0x28,0x28,0x01,0xd6,\r\n0x00,0x02,0x00,0x4b,0xff,0xf6,0x02,0x0d,0x02,0x30,0x00,0x27,0x00,0x41,0x00,0x3b,0x40,0x38,0x3f,0x01,0x04,0x02,0x01,0x4c,0x32,0x01,0x01,0x01,0x4b,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x00,0x01,0x04,0x00,0x01,0x7e,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x41,0x4d,0x00,0x01,0x01,0x05,0x61,0x00,0x05,0x05,0x3f,0x05,\r\n0x4e,0x2b,0x22,0x12,0x2b,0x22,0x10,0x06,0x09,0x1c,0x2b,0x37,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x13,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x36,0x36,\r\n0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x06,0x06,0x4b,0x2a,0x05,0x5b,0x48,0x34,0x3c,0x22,0x1d,0x8f,0x33,0x3b,0x77,0x65,0x56,0x6f,0x0a,0x2a,0x09,0x4f,0x39,0x34,0x3c,0x1e,0x19,0x86,0x3b,0x44,0x7c,0x6b,0x60,0x76,0x2b,0x2b,0x25,0x90,0x2b,0x31,0x1d,0x17,0x2c,0x34,0x35,0x2d,0x85,0x27,0x2e,0x21,0x1a,0x2e,0x39,\r\n0x8f,0x34,0x3c,0x2d,0x26,0x1c,0x2a,0x09,0x2b,0x0f,0x52,0x37,0x50,0x5c,0x4b,0x41,0x2f,0x35,0x2d,0x26,0x18,0x25,0x08,0x27,0x11,0x5c,0x3d,0x4e,0x5b,0x53,0x01,0x42,0x2b,0x3f,0x0b,0x2b,0x0d,0x3c,0x26,0x1f,0x32,0x0c,0x09,0x42,0x2f,0x30,0x49,0x0d,0x27,0x0b,0x37,0x24,0x1d,0x34,0x0d,0x0a,0x44,0x00,0x00,0x00,0x00,0x03,0x00,0x37,\r\n0x00,0x00,0x02,0x12,0x02,0xc1,0x00,0x10,0x00,0x14,0x00,0x1a,0x00,0x46,0x40,0x43,0x15,0x01,0x06,0x01,0x01,0x4c,0x00,0x03,0x00,0x08,0x02,0x03,0x08,0x67,0x09,0x05,0x02,0x01,0x01,0x02,0x5f,0x07,0x04,0x02,0x02,0x02,0x3b,0x4d,0x00,0x06,0x06,0x00,0x5f,0x0a,0x01,0x00,0x00,0x39,0x00,0x4e,0x01,0x00,0x17,0x16,0x14,0x13,0x12,0x11,\r\n0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x10,0x01,0x10,0x0b,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x01,0x33,0x35,0x23,0x13,0x11,0x23,0x11,0x14,0x16,0x01,0x3b,0x3f,0x3b,0x8a,0x8a,0x90,0xc1,0xc1,0xbc,0xfe,0xde,0x3c,0x3c,0x3c,0x3c,0x1f,\r\n0x40,0x3d,0x01,0x81,0x28,0x9b,0x9b,0x28,0xfe,0x2a,0x28,0x02,0x26,0x73,0xfd,0x91,0x01,0xd4,0xfe,0x7f,0x22,0x2c,0x00,0x00,0x00,0x02,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0x26,0x00,0x10,0x00,0x16,0x00,0x32,0x40,0x2f,0x11,0x06,0x02,0x02,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,0x03,0x01,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x00,\r\n0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x13,0x12,0x0d,0x0c,0x09,0x07,0x05,0x04,0x00,0x10,0x01,0x10,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x16,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x27,0x11,0x23,0x11,0x14,0x16,0x01,0x2d,0x66,0x77,0x90,0x24,0x29,0x52,0x5f,0x2a,0x76,0xdc,0x3c,0x20,0x0a,\r\n0x77,0x65,0x01,0x54,0xfe,0x06,0x0e,0x61,0x53,0x01,0x54,0xfe,0xac,0x65,0x77,0x4e,0x01,0xba,0xfe,0xd4,0x2e,0x49,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0x26,0x00,0x0c,0x00,0x10,0x00,0x2f,0x40,0x2c,0x06,0x01,0x03,0x04,0x01,0x4c,0x00,0x04,0x04,0x00,0x5f,0x01,0x01,0x00,0x00,0x3b,0x4d,0x00,0x03,0x03,0x02,0x5f,\r\n0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x18,0x11,0x06,0x09,0x18,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x27,0x33,0x03,0x23,0xdc,0xaf,0x99,0x76,0x11,0x14,0x02,0x02,0x15,0x10,0x75,0x2c,0xae,0x81,0x3e,0x94,0x3f,0x02,0x26,0xfe,0x8e,0x35,0x48,0x0b,\r\n0x0b,0x49,0x34,0x01,0x72,0xfd,0xda,0x28,0x01,0xd6,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x26,0x00,0x21,0x00,0x25,0x00,0x30,0x00,0x39,0x40,0x36,0x30,0x2b,0x10,0x06,0x04,0x05,0x06,0x01,0x4c,0x00,0x06,0x06,0x00,0x5f,0x02,0x01,0x02,0x00,0x00,0x3b,0x4d,0x07,0x01,0x05,0x05,0x03,0x60,0x08,0x04,0x02,0x03,0x03,\r\n0x39,0x03,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x00,0x21,0x00,0x21,0x11,0x1a,0x19,0x11,0x09,0x09,0x1a,0x2b,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x3e,0x02,0x37,0x13,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x26,0x36,0x37,0x13,0x33,0x03,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x27,0x33,0x03,0x23,0x01,0x33,0x03,0x26,\r\n0x26,0x27,0x23,0x06,0x06,0x07,0x07,0x62,0x62,0x92,0x49,0x04,0x05,0x02,0x01,0x03,0x06,0x04,0x4c,0x34,0x5f,0x05,0x06,0x02,0x03,0x01,0x02,0x01,0x03,0x44,0x2e,0x61,0x98,0x24,0x04,0x0b,0x02,0x01,0x09,0x05,0x20,0x75,0x3d,0x55,0x3d,0x01,0x50,0x3d,0x50,0x06,0x0b,0x02,0x02,0x02,0x0c,0x05,0x0b,0x02,0x26,0xfe,0x71,0x16,0x21,0x15,\r\n0x0e,0x10,0x17,0x16,0x01,0x90,0xfe,0x70,0x16,0x20,0x15,0x14,0x10,0x09,0x0e,0x11,0x01,0x8f,0xfd,0xda,0xa2,0x12,0x41,0x1e,0x16,0x43,0x18,0xa2,0x28,0x01,0xd6,0xfe,0x2a,0x01,0x5f,0x1b,0x43,0x16,0x16,0x43,0x1b,0x3a,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x3a,0x02,0x26,0x00,0x0b,0x00,0x0f,0x00,0x34,0x40,0x31,0x0a,0x07,\r\n0x04,0x01,0x04,0x04,0x05,0x01,0x4c,0x00,0x05,0x05,0x00,0x5f,0x01,0x01,0x00,0x00,0x3b,0x4d,0x00,0x04,0x04,0x02,0x60,0x06,0x03,0x02,0x02,0x02,0x39,0x02,0x4e,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x07,0x09,0x19,0x2b,0x33,0x37,0x03,0x33,0x17,0x37,0x33,0x07,0x13,0x23,0x27,0x07,0x25,0x33,0x01,0x23,\r\n0x3a,0xb2,0xce,0xb2,0x7e,0x8b,0x35,0xa9,0xd5,0xb2,0x84,0x94,0x01,0x30,0x4a,0xfe,0xcc,0x48,0xed,0x01,0x39,0xbf,0xbf,0xe3,0xfe,0xbd,0xc8,0xc8,0x28,0x01,0xd6,0x00,0x00,0x02,0x00,0x2d,0xff,0x4c,0x02,0x2b,0x02,0x26,0x00,0x0f,0x00,0x19,0x00,0x31,0x40,0x2e,0x13,0x10,0x09,0x06,0x04,0x00,0x04,0x01,0x4c,0x00,0x04,0x04,0x01,0x5f,\r\n0x02,0x01,0x01,0x01,0x3b,0x4d,0x00,0x00,0x00,0x03,0x61,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x00,0x00,0x15,0x14,0x00,0x0f,0x00,0x0e,0x12,0x14,0x21,0x06,0x09,0x19,0x2b,0x17,0x35,0x33,0x32,0x36,0x37,0x37,0x03,0x33,0x13,0x13,0x33,0x01,0x06,0x06,0x23,0x37,0x36,0x36,0x37,0x03,0x23,0x13,0x1e,0x02,0x4f,0x2b,0x2f,0x3d,0x13,0x1e,\r\n0xea,0x9f,0x99,0x98,0x2e,0xfe,0xf1,0x18,0x54,0x36,0xb4,0x05,0x10,0x0a,0x9e,0x42,0x8e,0x08,0x14,0x13,0xb4,0x28,0x31,0x2b,0x44,0x02,0x12,0xfe,0xa5,0x01,0x5b,0xfd,0x9b,0x36,0x3f,0xf9,0x0c,0x2c,0x18,0x01,0x69,0xfe,0xb7,0x12,0x2c,0x27,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0x26,0x00,0x09,0x00,0x0d,0x00,0x32,\r\n0x40,0x2f,0x06,0x01,0x02,0x02,0x00,0x01,0x4c,0x05,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x3b,0x4d,0x04,0x01,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x0d,0x0c,0x0b,0x0a,0x00,0x09,0x00,0x09,0x12,0x11,0x12,0x07,0x09,0x19,0x2b,0x33,0x35,0x01,0x21,0x35,0x21,0x15,0x01,0x21,0x15,0x25,0x33,0x01,0x23,\r\n0x46,0x01,0x1e,0xfe,0xeb,0x01,0xb6,0xfe,0xe4,0x01,0x29,0xfe,0x62,0x47,0x01,0x1d,0x46,0x29,0x01,0xd5,0x28,0x2a,0xfe,0x2c,0x28,0x28,0x01,0xd6,0x00,0x03,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0xe4,0x00,0x0e,0x00,0x1c,0x00,0x28,0x00,0x3e,0x40,0x3b,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,\r\n0x01,0x3e,0x4d,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1e,0x1d,0x10,0x0f,0x01,0x00,0x24,0x22,0x1d,0x28,0x1e,0x28,0x17,0x15,0x0f,0x1c,0x10,0x1c,0x08,0x06,0x00,0x0e,0x01,0x0e,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x11,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x65,0x77,0x77,0x65,0x65,0x77,0x36,0x63,0x43,0x3c,0x49,0x49,0x3c,0x3c,0x49,0x49,0x3c,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0x0a,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x41,0x61,0x35,0x4d,0x4d,0x3d,\r\n0x01,0x40,0x3d,0x4d,0x4d,0x3d,0xfe,0xc0,0x3d,0x4d,0xf3,0x1e,0x1c,0x1b,0x1d,0x1d,0x1b,0x1c,0x1e,0x00,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0x1c,0x02,0xda,0x00,0x0a,0x00,0x29,0x40,0x26,0x05,0x04,0x03,0x03,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x38,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,\r\n0x00,0x0a,0x00,0x0a,0x11,0x14,0x11,0x05,0x09,0x19,0x2b,0x33,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x5a,0xc6,0xc6,0xa5,0x7b,0xa2,0x52,0x02,0x3a,0x94,0x67,0x7b,0xfd,0x78,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x4c,0x00,0x00,0x02,0x0f,0x02,0xe4,0x00,0x18,0x00,0x34,0x40,0x31,0x01,0x01,0x03,0x01,0x01,0x4c,0x00,0x01,\r\n0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x16,0x22,0x12,0x27,0x06,0x09,0x1a,0x2b,0x33,0x35,0x13,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,\r\n0x07,0x21,0x15,0x56,0xf3,0x35,0x2c,0x45,0x3b,0x3d,0x47,0x5a,0x03,0x78,0x63,0x65,0x77,0x39,0x45,0xc5,0x01,0x4c,0x53,0x01,0x04,0x38,0x58,0x2a,0x3c,0x47,0x49,0x3e,0x63,0x74,0x72,0x62,0x34,0x74,0x48,0xce,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x46,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x1c,0x00,0x43,0x40,0x40,0x16,0x15,0x10,0x03,\r\n0x03,0x04,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x02,0x04,0x01,0x02,0x7e,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1c,0x01,0x1c,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,\r\n0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x21,0x35,0x21,0x15,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x01,0x21,0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x46,0x3c,0x4f,0xb3,0xfe,0xd4,0x01,0x92,0xb0,0x5a,0x68,0x77,0x0a,0x71,0x61,0x3c,0x46,0x46,0x3c,0x32,0x3c,0x46,0x4e,0xbe,0x52,0x54,0xbb,0x07,0x6f,\r\n0x5b,0x32,0x61,0x71,0x00,0x01,0x00,0x46,0x00,0x00,0x01,0xea,0x02,0xda,0x00,0x0b,0x00,0x30,0x40,0x2d,0x06,0x03,0x02,0x02,0x03,0x01,0x4c,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x68,0x00,0x01,0x01,0x38,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x12,0x12,0x11,0x06,0x09,\r\n0x1a,0x2b,0x21,0x35,0x21,0x35,0x01,0x33,0x01,0x15,0x33,0x35,0x33,0x11,0x01,0x90,0xfe,0xb6,0x01,0x0a,0x66,0xfe,0xea,0xf0,0x5a,0xa0,0x8d,0x01,0xad,0xfe,0x3f,0x27,0xb2,0xfe,0x5c,0x00,0x00,0x01,0x00,0x4b,0xff,0xf6,0x02,0x03,0x02,0xda,0x00,0x1b,0x00,0x3e,0x40,0x3b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x06,0x00,0x03,\r\n0x01,0x06,0x03,0x67,0x00,0x05,0x05,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x16,0x14,0x13,0x12,0x11,0x10,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1b,0x01,0x1b,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x23,\r\n0x11,0x21,0x15,0x21,0x17,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x26,0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x44,0x3a,0xc7,0x01,0x85,0xfe,0xcf,0x02,0x76,0x65,0x6e,0x77,0x0a,0x71,0x61,0x3c,0x46,0x46,0x3c,0x2d,0x3c,0x46,0x01,0x63,0x52,0xbf,0x6f,0x65,0x2d,0x61,0x71,0x00,0x02,0x00,0x40,0xff,0xf6,0x02,0x18,0x02,0xda,0x00,0x15,\r\n0x00,0x21,0x00,0x38,0x40,0x35,0x0a,0x01,0x04,0x02,0x01,0x4c,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x6a,0x00,0x01,0x01,0x38,0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x3f,0x00,0x4e,0x17,0x16,0x01,0x00,0x1d,0x1b,0x16,0x21,0x17,0x21,0x0f,0x0d,0x09,0x08,0x00,0x15,0x01,0x15,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,\r\n0x35,0x34,0x36,0x37,0x13,0x33,0x03,0x17,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2d,0x46,0x6b,0x3c,0x24,0x1f,0xa9,0x64,0xb4,0x03,0x0d,0x34,0x1f,0x41,0x61,0x37,0x3c,0x69,0x47,0x41,0x51,0x51,0x41,0x41,0x51,0x51,0x0a,0x3b,0x69,0x45,0x30,0x65,0x37,\r\n0x01,0x2f,0xfe,0xc7,0x02,0x11,0x12,0x39,0x64,0x42,0x46,0x6b,0x3c,0x50,0x56,0x45,0x45,0x56,0x56,0x45,0x45,0x56,0x00,0x00,0x00,0x01,0x00,0x52,0x00,0x00,0x02,0x22,0x02,0xda,0x00,0x08,0x00,0x52,0xb5,0x07,0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x18,0x00,0x01,0x00,0x03,0x00,0x01,0x72,0x00,0x00,0x00,0x02,0x5f,\r\n0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x19,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x59,0x40,0x0c,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x33,0x01,0x21,0x15,0x23,0x35,0x21,0x15,\r\n0x01,0xbe,0x01,0x04,0xfe,0xea,0x5a,0x01,0xd0,0xfe,0xfe,0x02,0x88,0x76,0xc8,0x54,0xfd,0x7a,0x00,0x00,0x00,0x03,0x00,0x42,0xff,0xf6,0x02,0x16,0x02,0xe4,0x00,0x1d,0x00,0x29,0x00,0x35,0x00,0x45,0x40,0x42,0x16,0x07,0x02,0x05,0x02,0x01,0x4c,0x07,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,\r\n0x3e,0x4d,0x08,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x3f,0x00,0x4e,0x2b,0x2a,0x1f,0x1e,0x01,0x00,0x31,0x2f,0x2a,0x35,0x2b,0x35,0x25,0x23,0x1e,0x29,0x1f,0x29,0x10,0x0e,0x00,0x1d,0x01,0x1d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,\r\n0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x45,0x6a,0x3b,0x4f,0x42,0x39,0x44,0x36,0x61,0x3f,0x40,0x60,0x36,0x44,0x39,0x42,0x4f,0x3b,0x69,0x46,0x38,0x44,0x44,0x38,0x37,0x45,0x45,0x37,0x40,\r\n0x50,0x50,0x40,0x40,0x50,0x50,0x0a,0x36,0x61,0x3f,0x45,0x64,0x0b,0x03,0x0d,0x59,0x3a,0x39,0x57,0x31,0x31,0x57,0x39,0x3a,0x59,0x0d,0x03,0x0b,0x64,0x45,0x3f,0x61,0x36,0x01,0xb0,0x42,0x35,0x35,0x42,0x42,0x35,0x35,0x42,0xfe,0xa1,0x4b,0x3c,0x3d,0x4b,0x4b,0x3d,0x3c,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,0x02,0x18,\r\n0x02,0xe4,0x00,0x15,0x00,0x21,0x00,0x36,0x40,0x33,0x01,0x01,0x00,0x03,0x01,0x4c,0x06,0x01,0x03,0x00,0x00,0x02,0x03,0x00,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x02,0x02,0x39,0x02,0x4e,0x17,0x16,0x00,0x00,0x1d,0x1b,0x16,0x21,0x17,0x21,0x00,0x15,0x00,0x15,0x26,0x24,0x07,0x09,0x18,0x2b,0x33,0x13,\r\n0x27,0x06,0x06,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x03,0x11,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xc3,0xb4,0x03,0x0a,0x36,0x20,0x3f,0x5f,0x36,0x3c,0x6a,0x45,0x47,0x6a,0x3c,0x24,0x1f,0xa9,0x41,0x51,0x51,0x41,0x41,0x51,0x51,0x01,0x39,0x02,0x10,0x13,0x39,0x64,\r\n0x42,0x47,0x6a,0x3c,0x3b,0x69,0x45,0x30,0x65,0x37,0xfe,0xd1,0x01,0x5e,0x56,0x45,0x45,0x56,0x56,0x45,0x45,0x56,0x00,0x00,0x00,0x03,0x00,0x50,0xff,0xf6,0x02,0x08,0x02,0xe4,0x00,0x0e,0x00,0x16,0x00,0x1e,0x00,0x36,0x40,0x33,0x1c,0x1b,0x11,0x10,0x04,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,\r\n0x01,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x18,0x17,0x01,0x00,0x17,0x1e,0x18,0x1e,0x15,0x13,0x08,0x06,0x00,0x0e,0x01,0x0e,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x06,0x03,0x11,0x01,0x26,0x26,0x23,0x22,0x06,0x13,0x32,0x36,0x35,0x11,0x01,0x16,0x16,0x01,\r\n0x2c,0x65,0x77,0x77,0x65,0x65,0x77,0x36,0x63,0xc8,0x01,0x05,0x0b,0x44,0x31,0x3c,0x49,0x85,0x3c,0x49,0xfe,0xfb,0x0b,0x44,0x0a,0x75,0x62,0x01,0x40,0x62,0x75,0x75,0x62,0xfe,0xc0,0x41,0x61,0x35,0x02,0x17,0xfe,0xec,0x01,0x3c,0x2d,0x35,0x4d,0xfd,0xf9,0x4d,0x3d,0x01,0x14,0xfe,0xc4,0x2d,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x58,\r\n0x00,0x00,0x02,0x13,0x02,0xe4,0x00,0x22,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x39,0x04,0x4e,0x00,0x00,0x00,0x22,0x00,0x22,0x1b,0x23,0x12,0x2b,0x06,0x09,0x1a,0x2b,0x33,0x35,0x34,0x36,0x36,0x37,0x37,0x36,\r\n0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x3e,0x02,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x15,0x21,0x15,0x59,0x2b,0x4a,0x2d,0x64,0x28,0x2f,0x48,0x3a,0x3a,0x48,0x5a,0x02,0x39,0x62,0x3f,0x42,0x64,0x38,0x4a,0x40,0x66,0x2b,0x44,0x01,0x60,0x80,0x34,0x57,0x42,0x13,0x2b,0x11,0x48,0x29,0x3c,0x4b,0x4b,\r\n0x3c,0x40,0x60,0x37,0x37,0x60,0x40,0x44,0x72,0x1c,0x2c,0x13,0x4c,0x35,0x29,0x52,0x00,0x02,0x00,0x55,0xff,0xf6,0x02,0x11,0x02,0xe4,0x00,0x1b,0x00,0x29,0x00,0x49,0x40,0x46,0x12,0x01,0x05,0x06,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,\r\n0x3e,0x4d,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x36,0x33,0x32,\r\n0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x34,0x67,0x78,0x76,0x65,0x5b,0x72,0x07,0x5a,0x05,0x43,0x33,0x3b,0x45,0x0b,0x4f,0x3d,0x5e,0x6d,0x77,0x67,0x3d,0x47,0x47,0x3d,0x3d,0x47,0x47,0x0a,0x74,0x63,0x01,0x40,0x63,0x74,0x59,0x47,0x22,0x2e,0x49,0x3e,0xa5,0x30,0x37,\r\n0x74,0x63,0x2b,0x63,0x74,0x50,0x49,0x3e,0x2b,0x3e,0x49,0x49,0x3e,0x2b,0x3e,0x49,0x00,0x02,0x00,0x49,0xff,0xf6,0x02,0x03,0x02,0xe4,0x00,0x1b,0x00,0x29,0x00,0x49,0x40,0x46,0x0b,0x01,0x05,0x06,0x01,0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x08,0x01,0x05,0x00,0x03,0x01,0x05,0x03,0x69,0x00,0x06,0x06,0x04,0x61,0x00,0x04,\r\n0x04,0x3e,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x06,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x11,0x14,0x06,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x28,0x5b,0x72,0x07,0x5a,0x05,0x43,0x33,0x3b,0x45,0x0a,0x4e,0x3e,0x5e,0x6c,0x76,0x66,0x67,0x77,0x76,0x67,0x3d,0x46,0x46,0x3d,0x3d,0x46,0x46,0x0a,0x5b,0x4a,0x25,0x30,0x49,0x3e,0xb8,0x32,0x39,0x74,0x63,0x1c,0x63,0x74,0x74,\r\n0x63,0xfe,0xc0,0x63,0x74,0x01,0x74,0x49,0x3e,0x1c,0x3e,0x49,0x49,0x3e,0x1c,0x3e,0x49,0x00,0x00,0x00,0x00,0x03,0x00,0x42,0xff,0xf6,0x02,0x16,0x02,0xe5,0x00,0x1b,0x00,0x29,0x00,0x37,0x00,0x36,0x40,0x33,0x31,0x1d,0x15,0x07,0x04,0x03,0x02,0x01,0x4c,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x05,0x01,0x03,0x03,0x00,\r\n0x61,0x04,0x01,0x00,0x00,0x3f,0x00,0x4e,0x2b,0x2a,0x01,0x00,0x2a,0x37,0x2b,0x37,0x25,0x23,0x0f,0x0d,0x00,0x1b,0x01,0x1b,0x06,0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x17,0x37,0x36,0x36,0x35,0x34,0x26,\r\n0x23,0x22,0x06,0x15,0x14,0x16,0x13,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x01,0x2c,0x46,0x6a,0x3a,0x4f,0x42,0x41,0x40,0x39,0x62,0x3f,0x3f,0x63,0x38,0x40,0x41,0x42,0x4f,0x3a,0x69,0x64,0x1d,0x19,0x2f,0x3a,0x48,0x3a,0x3a,0x48,0x38,0x4a,0x42,0x50,0x36,0x31,0x2b,0x2e,0x30,0x34,0x50,0x0a,0x31,0x57,\r\n0x39,0x3e,0x6b,0x1e,0x20,0x59,0x33,0x37,0x54,0x30,0x30,0x54,0x37,0x32,0x59,0x21,0x1e,0x6b,0x3e,0x39,0x57,0x31,0x01,0xb5,0x0b,0x0a,0x12,0x43,0x28,0x31,0x3d,0x3e,0x30,0x29,0x42,0xfe,0x8a,0x45,0x38,0x2c,0x47,0x13,0x11,0x12,0x13,0x47,0x2b,0x38,0x45,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xf6,0x02,0x03,0x02,0xda,0x00,0x20,\r\n0x00,0x4d,0x40,0x4a,0x17,0x01,0x03,0x07,0x01,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x07,0x00,0x03,0x04,0x07,0x03,0x69,0x00,0x06,0x06,0x05,0x5f,0x00,0x05,0x05,0x38,0x4d,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x1b,0x19,0x16,0x15,0x14,0x13,0x12,\r\n0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x20,0x01,0x20,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x11,0x21,0x15,0x21,0x17,0x36,0x36,0x33,0x36,0x16,0x15,0x15,0x14,0x06,0x01,0x2a,0x5b,0x73,0x07,0x5a,0x05,0x43,0x34,0x3a,0x44,0x44,0x3a,0x27,0x39,0x0d,\r\n0x5a,0x01,0x85,0xfe,0xcf,0x02,0x0d,0x48,0x35,0x5b,0x64,0x75,0x0a,0x5c,0x4e,0x29,0x31,0x46,0x3c,0x47,0x3c,0x46,0x28,0x1e,0x01,0x8f,0x52,0xf5,0x24,0x29,0x01,0x6f,0x63,0x47,0x61,0x71,0xff,0xff,0x00,0x89,0xff,0x76,0x01,0xcf,0x01,0x40,0x03,0x07,0x03,0x02,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x96,0xff,0x7b,0x01,0xe0,0x01,0x3b,0x03,0x07,0x03,0x03,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0xff,0x7b,0x01,0xc9,0x01,0x40,0x03,0x07,0x03,0x04,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x76,0x01,0xce,0x01,0x3b,0x03,0x07,0x03,0x05,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8f,0xff,0x7b,0x01,0xbd,0x01,0x3b,0x03,0x07,0x03,0x06,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8d,0xff,0x76,0x01,0xcf,0x01,0x3b,0x03,0x07,0x03,0x07,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x86,0xff,0x76,0x01,0xd2,0x01,0x3b,0x03,0x07,0x03,0x08,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x94,0xff,0x7b,0x01,0xce,0x01,0x3b,0x03,0x07,0x03,0x09,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0x6c,0x01,0xd1,0x01,0x36,0x03,0x07,0x03,0x0a,0x00,0x00,0xfd,0xf3,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfd,0xf3,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0x7b,0x01,0xcd,0x01,0x40,0x03,0x07,0x03,0x0b,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xfb,0x01,0xcf,0x01,0xc5,0x03,0x07,0x03,0x02,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x96,0x00,0x00,0x01,0xe0,0x01,0xc0,0x03,0x07,0x03,0x03,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x00,0x00,0x01,0xc9,0x01,0xc5,0x03,0x07,0x03,0x04,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0xff,0xfb,0x01,0xce,0x01,0xc0,0x03,0x07,0x03,0x05,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8f,0x00,0x00,0x01,0xbd,0x01,0xc0,0x03,0x07,0x03,0x06,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8d,0xff,0xfb,0x01,0xcf,0x01,0xc0,0x03,0x07,0x03,0x07,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x86,0xff,0xfb,0x01,0xd2,0x01,0xc0,0x03,0x07,0x03,0x08,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x94,0x00,0x00,0x01,0xce,0x01,0xc0,0x03,0x07,0x03,0x09,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xfb,0x01,0xd1,0x01,0xc5,0x03,0x07,0x03,0x0a,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfe,0x82,0xb0,0x35,\r\n0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8b,0x00,0x00,0x01,0xcd,0x01,0xc5,0x03,0x07,0x03,0x0b,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0x01,0x15,0x01,0xcf,0x02,0xdf,0x03,0x06,0x03,0x02,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,\r\n0xff,0xff,0x00,0x96,0x01,0x1a,0x01,0xe0,0x02,0xda,0x03,0x06,0x03,0x03,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x93,0x01,0x1a,0x01,0xc9,0x02,0xdf,0x03,0x06,0x03,0x04,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8b,0x01,0x15,0x01,0xce,\r\n0x02,0xda,0x03,0x06,0x03,0x05,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8f,0x01,0x1a,0x01,0xbd,0x02,0xda,0x03,0x06,0x03,0x06,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8d,0x01,0x15,0x01,0xcf,0x02,0xda,0x03,0x06,0x03,0x07,0x00,0x9c,\r\n0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x86,0x01,0x15,0x01,0xd2,0x02,0xda,0x03,0x06,0x03,0x08,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x94,0x01,0x1a,0x01,0xce,0x02,0xda,0x03,0x06,0x03,0x09,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,\r\n0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x87,0x01,0x15,0x01,0xd1,0x02,0xdf,0x03,0x06,0x03,0x0a,0x00,0x9c,0x00,0x09,0xb1,0x00,0x03,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8b,0x01,0x1a,0x01,0xcd,0x02,0xdf,0x03,0x06,0x03,0x0b,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0x00,0x02,0x00,0x89,\r\n0x01,0x79,0x01,0xcf,0x03,0x43,0x00,0x0d,0x00,0x1b,0x00,0x2d,0x40,0x2a,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x00,0x53,0x00,0x4e,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,\r\n0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x49,0x5a,0x5a,0x49,0x49,0x5a,0x5a,0x49,0x29,0x33,0x33,0x29,0x29,0x33,0x33,0x01,0x79,0x5c,0x49,0x81,0x49,0x5b,0x5b,0x49,0x81,0x49,0x5c,0x40,0x38,0x2d,0x81,0x2c,0x38,0x38,0x2c,0x81,0x2d,0x38,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x96,0x01,0x7e,0x01,0xe0,0x03,0x3e,0x00,0x0a,0x00,0x29,0x40,0x26,0x05,0x04,0x03,0x03,0x00,0x01,0x01,0x4c,0x00,0x01,0x01,0x50,0x4d,0x02,0x01,0x00,0x00,0x03,0x60,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,0x00,0x00,0x00,0x0a,0x00,0x0a,0x11,0x14,0x11,0x05,0x0b,0x19,0x2b,0x13,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x11,\r\n0x33,0x15,0x96,0x90,0x8d,0x74,0x60,0x73,0x01,0x7e,0x41,0x01,0x44,0x55,0x49,0x47,0xfe,0x81,0x41,0x00,0x00,0x01,0x00,0x93,0x01,0x7e,0x01,0xc9,0x03,0x43,0x00,0x1a,0x00,0x34,0x40,0x31,0x01,0x01,0x03,0x01,0x01,0x4c,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x52,0x4d,0x00,0x03,0x03,0x04,\r\n0x5f,0x05,0x01,0x04,0x04,0x51,0x04,0x4e,0x00,0x00,0x00,0x1a,0x00,0x1a,0x17,0x23,0x12,0x27,0x06,0x0b,0x1a,0x2b,0x13,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x3e,0x02,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x9c,0xb7,0x14,0x18,0x2f,0x23,0x22,0x31,0x47,0x02,0x2a,0x45,0x29,0x2c,0x45,0x29,\r\n0x2a,0x24,0x8c,0xdc,0x01,0x7e,0x4d,0x9e,0x11,0x25,0x16,0x23,0x2b,0x2c,0x24,0x2b,0x40,0x25,0x23,0x3f,0x2a,0x24,0x3e,0x1f,0x77,0x41,0x00,0x00,0x00,0x01,0x00,0x8b,0x01,0x79,0x01,0xce,0x03,0x3e,0x00,0x1a,0x00,0x43,0x40,0x40,0x15,0x14,0x0f,0x03,0x03,0x04,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x02,0x04,\r\n0x01,0x02,0x7e,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x05,0x50,0x4d,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,0x53,0x00,0x4e,0x01,0x00,0x13,0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x07,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,\r\n0x21,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x01,0x2c,0x47,0x5a,0x47,0x32,0x28,0x28,0x32,0x32,0x28,0x29,0x73,0xd5,0x01,0x1d,0x75,0x3c,0x49,0x5a,0x01,0x79,0x52,0x42,0x25,0x2f,0x2f,0x25,0x25,0x2e,0x45,0x58,0x41,0x48,0x5c,0x07,0x4c,0x3a,0x42,0x52,0x00,0x01,0x00,0x8f,0x01,0x7e,0x01,0xbd,0x03,0x3e,0x00,0x0b,0x00,0x30,0x40,0x2d,\r\n0x06,0x03,0x02,0x02,0x03,0x01,0x4c,0x00,0x02,0x00,0x00,0x04,0x02,0x00,0x68,0x00,0x01,0x01,0x50,0x4d,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x51,0x04,0x4e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x12,0x12,0x11,0x06,0x0b,0x1a,0x2b,0x01,0x35,0x23,0x35,0x37,0x33,0x03,0x15,0x33,0x35,0x33,0x11,0x01,0x76,0xe7,0xae,0x50,0xb8,\r\n0xa1,0x47,0x01,0x7e,0x69,0x5d,0xfa,0xfe,0xf6,0x0d,0x72,0xfe,0xe5,0x00,0x00,0x00,0x00,0x01,0x00,0x8d,0x01,0x79,0x01,0xcf,0x03,0x3e,0x00,0x19,0x00,0x3e,0x40,0x3b,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x06,0x00,0x03,0x01,0x06,0x03,0x67,0x00,0x05,0x05,0x04,0x5f,0x00,0x04,0x04,0x50,0x4d,0x00,0x02,0x02,0x00,0x61,0x07,\r\n0x01,0x00,0x00,0x53,0x00,0x4e,0x01,0x00,0x15,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x19,0x01,0x19,0x08,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2f,0x49,0x59,0x46,0x32,0x2a,0x28,0x30,0x30,\r\n0x28,0x8b,0x01,0x1a,0xd7,0x48,0x4a,0x56,0x58,0x01,0x79,0x50,0x44,0x28,0x2c,0x2f,0x25,0x26,0x2e,0xdd,0x3f,0x62,0x4e,0x42,0x42,0x52,0x00,0x00,0x00,0x02,0x00,0x86,0x01,0x79,0x01,0xd2,0x03,0x3e,0x00,0x10,0x00,0x1c,0x00,0x38,0x40,0x35,0x08,0x01,0x04,0x02,0x01,0x4c,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x6a,0x00,0x01,0x01,0x50,\r\n0x4d,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x00,0x53,0x00,0x4e,0x12,0x11,0x01,0x00,0x18,0x16,0x11,0x1c,0x12,0x1c,0x0c,0x0a,0x07,0x06,0x00,0x10,0x01,0x10,0x07,0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x37,0x37,0x33,0x07,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,\r\n0x16,0x01,0x2d,0x4b,0x5c,0x24,0x7e,0x4d,0x81,0x04,0x1b,0x31,0x40,0x4e,0x5b,0x4b,0x2a,0x34,0x34,0x2a,0x29,0x35,0x34,0x01,0x79,0x55,0x43,0x32,0x39,0xc2,0xc5,0x25,0x4e,0x3f,0x43,0x55,0x40,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0x00,0x00,0x00,0x00,0x01,0x00,0x94,0x01,0x7e,0x01,0xce,0x03,0x3e,0x00,0x08,0x00,0x52,0xb5,0x07,\r\n0x01,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x18,0x00,0x01,0x00,0x03,0x00,0x01,0x72,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x50,0x4d,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,0x1b,0x40,0x19,0x00,0x01,0x00,0x03,0x00,0x01,0x03,0x80,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x02,0x50,0x4d,0x04,0x01,0x03,0x03,0x51,0x03,0x4e,\r\n0x59,0x40,0x0c,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x11,0x05,0x0b,0x19,0x2b,0x13,0x13,0x23,0x15,0x23,0x35,0x21,0x15,0x03,0xd8,0xb1,0xaf,0x46,0x01,0x3a,0xa8,0x01,0x7e,0x01,0x80,0x4e,0x8e,0x4c,0xfe,0x8c,0x00,0x00,0x00,0x00,0x03,0x00,0x87,0x01,0x79,0x01,0xd1,0x03,0x43,0x00,0x19,0x00,0x25,0x00,0x31,0x00,0x45,0x40,0x42,\r\n0x13,0x06,0x02,0x05,0x02,0x01,0x4c,0x07,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x08,0x01,0x04,0x04,0x00,0x61,0x06,0x01,0x00,0x00,0x53,0x00,0x4e,0x27,0x26,0x1b,0x1a,0x01,0x00,0x2d,0x2b,0x26,0x31,0x27,0x31,0x21,0x1f,0x1a,0x25,0x1b,0x25,0x0e,0x0c,0x00,0x19,0x01,0x19,0x09,\r\n0x0b,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x15,0x16,0x16,0x15,0x14,0x06,0x03,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x49,0x5c,0x3a,0x2e,0x2a,0x33,0x55,0x45,0x46,\r\n0x56,0x34,0x2c,0x2f,0x3a,0x5b,0x4a,0x27,0x30,0x30,0x27,0x26,0x2f,0x2f,0x26,0x2a,0x36,0x36,0x2a,0x2a,0x36,0x36,0x01,0x79,0x49,0x3a,0x2e,0x3d,0x04,0x04,0x08,0x34,0x22,0x35,0x41,0x41,0x35,0x22,0x34,0x08,0x04,0x04,0x3d,0x2e,0x3a,0x49,0x01,0x0b,0x24,0x1d,0x1d,0x25,0x25,0x1d,0x1d,0x24,0xce,0x29,0x21,0x21,0x29,0x29,0x21,0x21,\r\n0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x8b,0x01,0x7e,0x01,0xcd,0x03,0x43,0x00,0x12,0x00,0x1e,0x00,0x36,0x40,0x33,0x01,0x01,0x00,0x03,0x01,0x4c,0x06,0x01,0x03,0x00,0x00,0x02,0x03,0x00,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x52,0x4d,0x05,0x01,0x02,0x02,0x51,0x02,0x4e,0x14,0x13,0x00,0x00,0x1a,0x18,0x13,0x1e,0x14,0x1e,\r\n0x00,0x12,0x00,0x12,0x24,0x24,0x07,0x0b,0x18,0x2b,0x13,0x37,0x23,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xe7,0x7e,0x04,0x0a,0x26,0x1d,0x3f,0x4a,0x57,0x49,0x4a,0x58,0x16,0x16,0x6d,0x08,0x26,0x33,0x30,0x29,0x29,0x30,0x30,\r\n0x01,0x7e,0xc5,0x10,0x15,0x4f,0x3e,0x44,0x54,0x54,0x44,0x21,0x3c,0x23,0xad,0xd5,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0xff,0xff,0x00,0x9a,0xff,0x7b,0x01,0xce,0x01,0x40,0x03,0x07,0x03,0x15,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0x76,0x01,0xd4,\r\n0x01,0x40,0x03,0x07,0x03,0x16,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x84,0xff,0x76,0x01,0xc8,0x01,0x40,0x03,0x07,0x03,0x17,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x9a,0x00,0x00,0x01,0xce,\r\n0x01,0xc5,0x03,0x07,0x03,0x15,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x90,0xff,0xfb,0x01,0xd4,0x01,0xc5,0x03,0x07,0x03,0x16,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x84,0xff,0xfb,0x01,0xc8,\r\n0x01,0xc5,0x03,0x07,0x03,0x17,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x9a,0x01,0x1a,0x01,0xce,0x02,0xdf,0x03,0x06,0x03,0x15,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x90,0x01,0x15,0x01,0xd4,0x02,0xdf,0x03,0x06,\r\n0x03,0x16,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x84,0x01,0x15,0x01,0xc8,0x02,0xdf,0x03,0x06,0x03,0x17,0x00,0x9c,0x00,0x09,0xb1,0x00,0x02,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x9a,0x01,0x7e,0x01,0xce,0x03,0x43,0x00,0x1e,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,\r\n0x00,0x01,0x03,0x80,0x00,0x02,0x00,0x00,0x01,0x02,0x00,0x69,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x1e,0x00,0x1e,0x19,0x22,0x12,0x2a,0x06,0x09,0x1a,0x2b,0x13,0x35,0x34,0x3e,0x04,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x0e,\r\n0x04,0x15,0x33,0x15,0xa0,0x21,0x35,0x3a,0x35,0x21,0x2d,0x23,0x26,0x2e,0x48,0x56,0x46,0x43,0x55,0x22,0x34,0x3c,0x34,0x22,0xe7,0x01,0x7e,0x39,0x2f,0x3b,0x26,0x1b,0x1a,0x24,0x1c,0x20,0x27,0x2d,0x23,0x40,0x50,0x4a,0x3d,0x29,0x34,0x22,0x1a,0x1c,0x28,0x20,0x41,0x00,0x00,0x02,0x00,0x90,0x01,0x79,0x01,0xd4,0x03,0x43,0x00,0x1a,\r\n0x00,0x26,0x00,0x4d,0x40,0x4a,0x12,0x01,0x05,0x06,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x08,0x01,0x05,0x00,0x00,0x05,0x59,0x08,0x01,0x05,0x05,0x00,0x61,0x07,0x01,0x00,0x05,0x00,0x51,0x1c,0x1b,0x01,0x00,0x22,0x20,0x1b,0x26,0x1c,\r\n0x26,0x16,0x14,0x0f,0x0d,0x0b,0x0a,0x08,0x06,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x32,0x49,0x59,0x56,0x4c,0x44,0x56,\r\n0x04,0x45,0x04,0x31,0x24,0x2b,0x32,0x01,0x16,0x54,0x41,0x53,0x59,0x49,0x29,0x32,0x32,0x2a,0x2a,0x32,0x33,0x01,0x79,0x54,0x43,0x94,0x4a,0x55,0x45,0x37,0x1b,0x23,0x34,0x2d,0x50,0x4c,0x4f,0x41,0x43,0x54,0x3f,0x31,0x27,0x27,0x31,0x31,0x27,0x27,0x31,0x00,0x00,0x00,0x00,0x02,0x00,0x84,0x01,0x79,0x01,0xc8,0x03,0x43,0x00,0x1a,\r\n0x00,0x26,0x00,0x4c,0x40,0x49,0x0b,0x01,0x05,0x06,0x01,0x4c,0x00,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x69,0x08,0x01,0x05,0x00,0x03,0x01,0x05,0x03,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x07,0x01,0x00,0x02,0x00,0x51,0x1c,0x1b,0x01,0x00,0x22,0x20,0x1b,0x26,0x1c,0x26,\r\n0x15,0x13,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x31,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x26,0x43,0x57,0x04,0x45,0x05,0x30,0x24,\r\n0x2c,0x31,0x16,0x55,0x41,0x53,0x59,0x49,0x49,0x59,0x56,0x4b,0x2a,0x32,0x33,0x2a,0x29,0x32,0x32,0x01,0x79,0x44,0x34,0x18,0x21,0x34,0x2c,0x55,0x4c,0x4e,0x40,0x42,0x52,0x52,0x42,0x97,0x49,0x56,0xe0,0x2f,0x27,0x26,0x30,0x30,0x26,0x26,0x30,0x00,0xff,0xff,0x00,0x87,0xff,0x6c,0x01,0xd1,0x01,0x36,0x03,0x07,0x03,0x1b,0x00,0x00,\r\n0xfd,0xf3,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfd,0xf3,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0xff,0xfb,0x01,0xd1,0x01,0xc5,0x03,0x07,0x03,0x1b,0x00,0x00,0xfe,0x82,0x00,0x09,0xb1,0x00,0x03,0xb8,0xfe,0x82,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x87,0x01,0x10,0x01,0xd1,0x02,0xda,0x03,0x06,0x03,0x1b,0x00,0x97,\r\n0x00,0x09,0xb1,0x00,0x03,0xb8,0xff,0x97,0xb0,0x35,0x2b,0x00,0x00,0x03,0x00,0x87,0x01,0x79,0x01,0xd1,0x03,0x43,0x00,0x1b,0x00,0x29,0x00,0x37,0x00,0x3a,0x40,0x37,0x31,0x1d,0x15,0x07,0x04,0x03,0x02,0x01,0x4c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x69,0x05,0x01,0x03,0x00,0x00,0x03,0x59,0x05,0x01,0x03,0x03,0x00,0x61,0x04,0x01,\r\n0x00,0x03,0x00,0x51,0x2b,0x2a,0x01,0x00,0x2a,0x37,0x2b,0x37,0x25,0x23,0x0f,0x0d,0x00,0x1b,0x01,0x1b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x37,0x37,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x03,0x17,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x16,0x17,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x07,0x06,0x06,0x15,0x14,0x16,0x01,0x2c,0x49,0x5c,0x28,0x20,0x26,0x1a,0x1f,0x2a,0x56,0x44,0x44,0x56,0x25,0x1d,0x1c,0x20,0x22,0x27,0x5b,0x72,0x2a,0x2b,0x11,0x17,0x2f,0x26,0x25,0x30,0x1a,0x3b,0x2b,0x35,0x19,0x14,0x31,0x35,0x14,0x19,0x35,0x01,0x79,0x49,0x3a,0x1f,0x2d,0x0e,\r\n0x10,0x0c,0x0e,0x2f,0x1b,0x36,0x43,0x43,0x36,0x1e,0x2e,0x0d,0x0c,0x0f,0x0f,0x2d,0x1e,0x3a,0x49,0x01,0x19,0x13,0x12,0x08,0x1c,0x13,0x1c,0x23,0x23,0x1c,0x12,0x1b,0xe4,0x25,0x1e,0x14,0x1e,0x09,0x17,0x17,0x08,0x1e,0x14,0x1e,0x26,0x00,0x00,0x00,0xff,0xff,0x00,0x8a,0xff,0x76,0x01,0xcc,0x01,0x3b,0x03,0x07,0x03,0x1f,0x00,0x00,\r\n0xfd,0xfd,0x00,0x09,0xb1,0x00,0x01,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x8a,0x01,0x15,0x01,0xcc,0x02,0xda,0x03,0x06,0x03,0x1f,0x00,0x9c,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0x9c,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8a,0x01,0x10,0x01,0xcc,0x02,0xd5,0x03,0x06,0x03,0x1f,0x00,0x97,0x00,0x09,0xb1,0x00,\r\n0x01,0xb8,0xff,0x97,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x8a,0x01,0x79,0x01,0xcc,0x03,0x3e,0x00,0x1e,0x00,0x50,0x40,0x4d,0x16,0x01,0x03,0x07,0x01,0x4c,0x00,0x04,0x03,0x01,0x03,0x04,0x01,0x80,0x00,0x01,0x02,0x03,0x01,0x02,0x7e,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x00,0x03,0x04,0x07,0x03,0x69,0x00,0x02,0x00,\r\n0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x1a,0x18,0x15,0x14,0x13,0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1e,0x01,0x1e,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x07,0x23,0x11,0x21,0x15,0x23,0x15,0x36,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x01,0x2a,0x40,0x59,0x07,0x48,0x05,0x31,0x22,0x28,0x32,0x32,0x28,0x1b,0x29,0x0b,0x41,0x01,0x1c,0xd9,0x0d,0x34,0x22,0x3e,0x4e,0x5a,0x01,0x79,0x43,0x35,0x19,0x1f,0x33,0x25,0x26,0x32,0x1a,0x12,0x01,0x01,0x40,0x88,0x14,0x1a,0x53,0x40,0x42,0x56,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x00,0x02,0x53,\r\n0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x00,0x00,0x00,0x38,0x4d,0x02,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x33,0x01,0x33,0x01,0x05,0x01,0xf9,0x55,0xfe,0x07,0x02,0xda,0xfd,0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x12,0x00,0x2e,0x00,0x6a,\r\n0xb1,0x06,0x64,0x44,0x40,0x5f,0x0a,0x09,0x05,0x03,0x01,0x02,0x28,0x14,0x02,0x09,0x07,0x29,0x01,0x05,0x09,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,0x00,0x07,0x06,0x09,0x06,0x07,0x09,0x80,0x03,0x01,0x01,0x00,0x00,0x08,0x01,0x00,0x68,0x00,0x08,0x00,0x06,0x07,0x08,0x06,0x69,0x00,0x09,0x05,0x05,0x09,0x57,0x00,0x09,0x09,0x05,\r\n0x5f,0x0c,0x0a,0x0b,0x03,0x05,0x09,0x05,0x4f,0x13,0x13,0x00,0x00,0x13,0x2e,0x13,0x2e,0x2d,0x2b,0x22,0x20,0x1e,0x1d,0x1b,0x19,0x00,0x12,0x00,0x12,0x12,0x11,0x17,0x11,0x11,0x0d,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x33,0x01,0x23,0x35,0x33,0x35,0x06,0x06,0x07,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x13,0x33,0x01,0x33,0x35,0x37,\r\n0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x15,0x36,0x36,0x33,0x33,0x15,0x05,0x01,0x18,0xff,0x76,0x04,0x12,0x0b,0x3e,0x46,0x55,0x6b,0xc3,0x55,0xfe,0x07,0xe1,0x78,0x46,0x24,0x1d,0x1d,0x24,0x3c,0x02,0x45,0x36,0x38,0x45,0x2d,0x29,0x5d,0x0b,0x2a,0x16,0x6d,0x01,0x95,0x32,\r\n0xec,0x07,0x15,0x0a,0x36,0x46,0x3d,0xfe,0xed,0x07,0x01,0x1a,0xfd,0x26,0x40,0x45,0x28,0x2b,0x1d,0x23,0x23,0x1d,0x34,0x3e,0x3e,0x32,0x1f,0x3c,0x17,0x34,0x0a,0x02,0x06,0x32,0x00,0x00,0x00,0x02,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x12,0x00,0x1e,0x00,0x6a,0xb1,0x06,0x64,0x44,0x40,0x5f,0x0a,0x09,0x05,0x03,0x01,0x02,\r\n0x0f,0x01,0x00,0x01,0x19,0x16,0x02,0x08,0x09,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,0x00,0x07,0x00,0x09,0x00,0x07,0x09,0x80,0x03,0x01,0x01,0x00,0x00,0x07,0x01,0x00,0x68,0x00,0x09,0x08,0x05,0x09,0x57,0x00,0x08,0x00,0x06,0x05,0x08,0x06,0x68,0x00,0x09,0x09,0x05,0x5f,0x0c,0x0a,0x0b,0x03,0x05,0x09,0x05,0x4f,0x13,0x13,0x00,\r\n0x00,0x13,0x1e,0x13,0x1e,0x1d,0x1c,0x1b,0x1a,0x18,0x17,0x15,0x14,0x00,0x12,0x00,0x12,0x12,0x11,0x17,0x11,0x11,0x0d,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x33,0x01,0x23,0x35,0x33,0x35,0x06,0x06,0x07,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x13,0x33,0x01,0x21,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,0x05,0x01,0x18,\r\n0xff,0x76,0x04,0x12,0x0b,0x3e,0x46,0x55,0x61,0xcd,0x55,0xfe,0x07,0x01,0x86,0xaf,0x7e,0x45,0x87,0x73,0x3c,0x01,0x95,0x32,0xec,0x07,0x15,0x0a,0x36,0x46,0x3d,0xfe,0xed,0x15,0x01,0x28,0xfd,0x26,0x46,0x50,0xaf,0xbd,0x10,0x59,0xd1,0x00,0x00,0x00,0x00,0x03,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x1a,0x00,0x1e,0x00,0x2a,\r\n0x00,0xd3,0xb1,0x06,0x64,0x44,0x40,0x0d,0x15,0x14,0x0f,0x03,0x03,0x04,0x25,0x22,0x02,0x0a,0x0b,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x42,0x00,0x03,0x04,0x01,0x04,0x03,0x72,0x00,0x09,0x00,0x0b,0x00,0x09,0x0b,0x80,0x06,0x01,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x01,0x02,0x07,0x01,0x57,0x00,0x02,0x0d,0x01,0x00,0x09,\r\n0x02,0x00,0x69,0x00,0x0b,0x0a,0x07,0x0b,0x57,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x68,0x00,0x0b,0x0b,0x07,0x60,0x0f,0x0c,0x0e,0x03,0x07,0x0b,0x07,0x50,0x1b,0x40,0x43,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x09,0x00,0x0b,0x00,0x09,0x0b,0x80,0x06,0x01,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x01,0x02,0x07,0x01,0x57,\r\n0x00,0x02,0x0d,0x01,0x00,0x09,0x02,0x00,0x69,0x00,0x0b,0x0a,0x07,0x0b,0x57,0x00,0x0a,0x00,0x08,0x07,0x0a,0x08,0x68,0x00,0x0b,0x0b,0x07,0x60,0x0f,0x0c,0x0e,0x03,0x07,0x0b,0x07,0x50,0x59,0x40,0x29,0x1f,0x1f,0x1b,0x1b,0x01,0x00,0x1f,0x2a,0x1f,0x2a,0x29,0x28,0x27,0x26,0x24,0x23,0x21,0x20,0x1b,0x1e,0x1b,0x1e,0x1d,0x1c,0x13,\r\n0x12,0x11,0x10,0x0e,0x0c,0x08,0x06,0x04,0x03,0x00,0x1a,0x01,0x1a,0x10,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x13,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x21,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,\r\n0x9a,0x3a,0x46,0x3c,0x25,0x1f,0x1e,0x25,0x25,0x1d,0x1e,0x51,0x9c,0xd7,0x55,0x2d,0x38,0x46,0xce,0x01,0xf9,0x55,0xfe,0x07,0x01,0x86,0xaf,0x7e,0x45,0x87,0x73,0x3c,0x01,0x90,0x3a,0x2f,0x19,0x1e,0x1e,0x19,0x19,0x1e,0x39,0x3f,0x32,0x37,0x42,0x06,0x38,0x2a,0x2f,0x3a,0xfe,0x70,0x02,0xda,0xfd,0x26,0x46,0x50,0xaf,0xbd,0x10,0x59,\r\n0xd1,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0x76,0x01,0xcf,0x01,0x40,0x03,0x07,0x03,0x02,0x00,0x00,0xfd,0xfd,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfd,0xfd,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x89,0x01,0x79,0x01,0xcf,0x03,0x43,0x02,0x06,0x03,0x02,0x00,0x00,0xff,0xff,0x00,0x89,0xff,0xe4,0x01,0xcf,0x01,0xae,0x03,0x07,\r\n0x03,0x02,0x00,0x00,0xfe,0x6b,0x00,0x09,0xb1,0x00,0x02,0xb8,0xfe,0x6b,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x02,0x00,0x91,0x01,0x8b,0x01,0xc7,0x03,0x48,0x00,0x0d,0x00,0x1b,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,\r\n0x51,0x0f,0x0e,0x01,0x00,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x48,0x53,0x53,0x48,0x48,0x53,0x53,0x48,0x28,0x2d,0x2d,0x28,0x28,\r\n0x2d,0x2d,0x01,0x8b,0x4f,0x46,0x94,0x45,0x4f,0x4f,0x45,0x94,0x46,0x4f,0x3f,0x2e,0x28,0x94,0x28,0x2d,0x2d,0x28,0x94,0x28,0x2e,0x00,0x00,0x00,0x00,0x02,0x00,0x4c,0xff,0xf6,0x02,0x0c,0x02,0x8a,0x00,0x15,0x00,0x22,0x00,0x32,0x40,0x2f,0x1f,0x0e,0x0b,0x08,0x04,0x03,0x01,0x01,0x4c,0x02,0x01,0x01,0x03,0x01,0x85,0x00,0x03,0x00,\r\n0x00,0x03,0x59,0x00,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x03,0x00,0x51,0x01,0x00,0x1a,0x18,0x0d,0x0c,0x0a,0x09,0x00,0x15,0x01,0x15,0x05,0x06,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x27,0x33,0x17,0x37,0x33,0x07,0x17,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x27,0x27,0x07,0x06,\r\n0x06,0x01,0x2c,0x43,0x63,0x36,0x2b,0x22,0x5b,0xac,0x68,0x79,0x79,0x66,0xac,0x5d,0x23,0x28,0x36,0x62,0xc6,0x46,0x3c,0x3c,0x46,0x30,0x52,0x53,0x16,0x19,0x0a,0x32,0x56,0x34,0x2e,0x51,0x28,0x69,0xc8,0x8b,0x8b,0xc7,0x6b,0x29,0x51,0x2c,0x34,0x56,0x32,0xc4,0x30,0x44,0x44,0x30,0x37,0x36,0x60,0x60,0x19,0x37,0x00,0x01,0x00,0xda,\r\n0xff,0xf6,0x01,0x7e,0x00,0x98,0x00,0x0b,0x00,0x1a,0x40,0x17,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2d,0x2d,0x25,0x25,0x2d,0x2d,0x0a,0x2c,0x23,0x25,0x2e,0x2e,0x25,\r\n0x23,0x2c,0x00,0x00,0x00,0x01,0x00,0xd2,0xff,0x60,0x01,0x75,0x00,0x92,0x00,0x03,0x00,0x35,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x3d,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x03,\r\n0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x17,0x13,0x33,0x03,0xd2,0x37,0x6c,0x46,0xa0,0x01,0x32,0xfe,0xce,0x00,0x02,0x00,0xd9,0xff,0xf6,0x01,0x7f,0x02,0x30,0x00,0x0b,0x00,0x17,0x00,0x2d,0x40,0x2a,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x02,0x3f,0x02,0x4e,0x0d,0x0c,0x01,\r\n0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x29,0x29,0x2a,0x2a,0x01,0x9c,0x28,0x22,0x22,0x28,\r\n0x28,0x22,0x22,0x28,0xfe,0x5a,0x28,0x22,0x22,0x28,0x28,0x22,0x22,0x28,0x00,0x00,0x00,0x02,0x00,0xcd,0xff,0x60,0x01,0x81,0x02,0x30,0x00,0x0d,0x00,0x11,0x00,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x17,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x4d,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,\r\n0x14,0x00,0x02,0x05,0x01,0x03,0x02,0x03,0x63,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x13,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x13,0x33,0x03,0x01,0x22,\r\n0x21,0x2a,0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x69,0x37,0x6c,0x46,0x01,0x9a,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfd,0xc6,0x01,0x32,0xfe,0xce,0x00,0x00,0x00,0x00,0x03,0x00,0x3c,0xff,0xf6,0x02,0x1c,0x00,0xaa,0x00,0x0d,0x00,0x1b,0x00,0x29,0x00,0x30,0x40,0x2d,0x05,0x03,0x02,0x01,0x01,0x00,0x61,0x08,0x04,0x07,0x02,0x06,\r\n0x05,0x00,0x00,0x3f,0x00,0x4e,0x1d,0x1c,0x0f,0x0e,0x01,0x00,0x24,0x22,0x1c,0x29,0x1d,0x29,0x16,0x14,0x0e,0x1b,0x0f,0x1b,0x08,0x06,0x00,0x0d,0x01,0x0d,0x09,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x33,0x22,\r\n0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0xea,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0xfe,0x6d,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0xa7,0x16,0x1c,0x1c,0x16,0x17,0x1b,0x1b,0x0a,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,0x1e,0x19,0x46,0x19,0x1e,\r\n0x1e,0x19,0x46,0x19,0x1e,0x00,0x00,0x00,0x00,0x02,0x00,0xe1,0xff,0xfb,0x01,0x77,0x02,0xda,0x00,0x03,0x00,0x11,0x00,0x2c,0x40,0x29,0x04,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x02,0x42,0x02,0x4e,0x05,0x04,0x00,0x00,0x0c,0x09,0x04,0x11,0x05,0x10,0x00,0x03,0x00,0x03,0x11,\r\n0x06,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x01,0x03,0x0c,0x6a,0x0c,0x38,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xdc,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0xe1,0xff,0x4c,0x01,0x77,0x02,0x2b,0x00,0x0d,\r\n0x00,0x11,0x00,0x2d,0x40,0x2a,0x04,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x03,0x3d,0x03,0x4e,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,\r\n0x13,0x33,0x13,0x01,0x1d,0x1a,0x22,0x22,0x1a,0x1e,0x1a,0x22,0x1f,0x1d,0x44,0x0c,0x52,0x0c,0x01,0xb3,0x22,0x1a,0x1a,0x22,0x23,0x1a,0x19,0x22,0xfd,0x99,0x02,0x03,0xfd,0xfd,0x00,0x00,0x00,0x02,0x00,0x82,0xff,0xfb,0x01,0xe5,0x02,0xda,0x00,0x14,0x00,0x22,0x00,0x70,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x26,0x07,0x01,0x04,0x03,0x06,\r\n0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x06,0x06,0x05,0x61,0x08,0x01,0x05,0x05,0x42,0x05,0x4e,0x1b,0x40,0x27,0x07,0x01,0x04,0x03,0x06,0x03,0x04,0x06,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,\r\n0x06,0x06,0x05,0x61,0x08,0x01,0x05,0x05,0x42,0x05,0x4e,0x59,0x40,0x15,0x16,0x15,0x00,0x00,0x1d,0x1a,0x15,0x22,0x16,0x21,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x09,0x09,0x1a,0x2b,0x37,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xce,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x3d,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0xdc,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0x73,0xff,0x4c,0x01,0xd6,\r\n0x02,0x2b,0x00,0x0d,0x00,0x22,0x00,0x74,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x26,0x00,0x04,0x00,0x03,0x03,0x04,0x72,0x00,0x03,0x00,0x05,0x06,0x03,0x05,0x6a,0x07,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x01,0x02,0x02,0x3d,0x02,0x4e,0x1b,0x40,0x27,0x00,0x04,0x00,0x03,0x00,0x04,0x03,0x80,\r\n0x00,0x03,0x00,0x05,0x06,0x03,0x05,0x6a,0x07,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x3b,0x4d,0x00,0x06,0x06,0x02,0x5f,0x08,0x01,0x02,0x02,0x3d,0x02,0x4e,0x59,0x40,0x19,0x0f,0x0e,0x01,0x00,0x21,0x1f,0x1b,0x19,0x18,0x17,0x16,0x15,0x0e,0x22,0x0f,0x22,0x08,0x05,0x00,0x0d,0x01,0x0c,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x4f,0x1c,0x20,0x22,0x1a,0x1e,0x1a,0x22,0x22,0x1a,0x14,0x46,0x67,0x39,0x30,0x55,0x38,0x5a,0x32,0x40,0x4b,0x4c,0x40,0x7d,0x01,0xb3,0x22,0x19,0x1a,0x23,0x22,0x1a,\r\n0x1a,0x22,0xfd,0x99,0x35,0x61,0x41,0x3a,0x5a,0x36,0x03,0x5f,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x00,0x00,0xff,0xff,0x00,0xda,0x01,0x04,0x01,0x7e,0x01,0xa6,0x03,0x07,0x03,0x29,0x00,0x00,0x01,0x0e,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x0e,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0xf5,0x01,0xa4,0x01,0xe5,0x00,0x0b,\r\n0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0xf5,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x00,\r\n0x00,0x01,0x00,0x24,0x00,0x67,0x02,0x34,0x02,0x6c,0x00,0x2c,0x00,0x1b,0x40,0x18,0x29,0x25,0x24,0x20,0x1c,0x1b,0x17,0x0e,0x0a,0x09,0x05,0x01,0x0c,0x00,0x49,0x00,0x00,0x00,0x76,0x13,0x12,0x01,0x09,0x16,0x2b,0x37,0x27,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x37,0x17,0x16,0x16,0x17,0x26,0x26,0x35,0x35,0x33,0x15,0x14,0x06,\r\n0x07,0x36,0x36,0x37,0x37,0x17,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x07,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0xb1,0x45,0x41,0x0d,0x2d,0x14,0x1c,0x3e,0x12,0x6b,0x1c,0x6c,0x11,0x38,0x17,0x05,0x05,0x54,0x06,0x05,0x18,0x37,0x12,0x6c,0x1c,0x6b,0x12,0x3e,0x1c,0x14,0x2e,0x0c,0x41,0x45,0x41,0x0c,0x22,0x0c,0x0c,0x22,0x0c,0x67,\r\n0x31,0x5d,0x12,0x34,0x14,0x04,0x10,0x07,0x28,0x4f,0x28,0x06,0x1a,0x0e,0x1a,0x37,0x13,0x7d,0x7d,0x13,0x37,0x1a,0x0e,0x1a,0x06,0x28,0x4f,0x28,0x07,0x10,0x04,0x14,0x35,0x11,0x5d,0x31,0x5e,0x11,0x3c,0x1a,0x1a,0x3b,0x12,0x00,0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x0b,0x00,0x32,0x40,0x2f,0x00,0x00,0x00,0x01,\r\n0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x06,0x01,0x05,0x04,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x17,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0xcd,0xf5,0x9b,0x9b,0x9b,0x96,0x6e,0x03,\r\n0xac,0x50,0xfe,0xb1,0x50,0xfe,0x93,0x50,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x0b,0x00,0x2c,0x40,0x29,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x11,0x11,0x10,0x06,0x09,\r\n0x1c,0x2b,0x05,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x01,0x8b,0xf0,0x96,0x9b,0x9b,0x9b,0xf5,0x6e,0x50,0x01,0x6d,0x50,0x01,0x4f,0x50,0x00,0x00,0x00,0x02,0x00,0x7d,0xff,0x92,0x01,0xdb,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,\r\n0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x7d,0x5a,0xaa,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x00,0xff,0xff,0x00,0x69,0xff,0xfb,0x01,0xef,0x02,0xda,0x00,0x26,0x03,0x2e,0x88,0x00,0x00,0x06,0x03,0x2e,0x78,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x87,0xff,0xfb,0x01,0xea,0x02,0xda,0x00,0x16,0x00,0x24,0x00,0x3f,0x40,0x3c,0x15,0x05,0x02,0x03,0x00,0x01,0x4c,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x06,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x00,0x3b,0x4d,0x00,0x05,0x05,0x04,0x61,0x07,0x01,0x04,0x04,0x42,0x04,0x4e,0x18,0x17,0x00,0x00,0x1f,0x1c,\r\n0x17,0x24,0x18,0x23,0x00,0x16,0x00,0x16,0x21,0x27,0x12,0x08,0x09,0x19,0x2b,0x37,0x27,0x35,0x33,0x15,0x07,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xdf,0x0d,0x5a,0x03,0x30,0x37,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,\r\n0x6a,0x5b,0x06,0x2f,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xcd,0xf5,0x64,0x64,0x3e,0x0a,0x43,0x32,0x3b,0x47,0x55,0x35,0x60,0x42,0x57,0x6e,0x07,0x6a,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x1b,0x00,0x1f,0x00,0x47,0x40,0x44,0x07,0x05,0x02,0x03,0x0f,0x08,\r\n0x02,0x02,0x01,0x03,0x02,0x68,0x0e,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x0b,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x10,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x00,0x00,0x1f,0x1e,0x1d,0x1c,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x1f,0x2b,0x33,\r\n0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x53,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xd2,0x41,0xb4,0x41,0xd2,\r\n0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xff,0xff,0x00,0xda,0xff,0xf6,0x01,0x7e,0x00,0x98,0x02,0x06,0x03,0x29,0x00,0x00,0x00,0x01,0xff,0xf6,0x02,0xee,0x02,0x62,0x03,0x3e,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,\r\n0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x03,0x35,0x21,0x15,0x0a,0x02,0x6c,0x02,0xee,0x50,0x50,0x00,0x00,0x01,0x00,0x4b,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,\r\n0x2b,0x17,0x01,0x33,0x01,0x4b,0x01,0x63,0x5f,0xfe,0x9d,0x6e,0x03,0xac,0xfc,0x54,0x00,0x01,0x00,0x4b,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x01,0x33,0x01,0x01,0xae,0xfe,0x9d,0x5f,0x01,0x63,\r\n0x6e,0x03,0xac,0xfc,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0xff,0x4c,0x02,0x4e,0x00,0x00,0x00,0x0f,0x00,0x24,0x40,0x21,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x02,0x00,0x5f,0x04,0x01,0x00,0x00,0x3d,0x00,0x4e,0x01,0x00,0x0c,0x0b,0x09,0x06,0x04,0x03,0x00,0x0f,0x01,0x0e,0x05,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x33,0x14,\r\n0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xb4,0x4e,0x5c,0x5a,0x31,0x29,0xdc,0x29,0x31,0x5a,0x5c,0x4e,0xb4,0x61,0x53,0x2e,0x36,0x36,0x2e,0x53,0x61,0x00,0x00,0x02,0x00,0xd9,0x00,0x46,0x01,0x7f,0x02,0x80,0x00,0x0b,0x00,0x17,0x00,0x30,0x40,0x2d,0x00,0x01,0x04,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x02,0x02,0x03,\r\n0x59,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x03,0x02,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,\r\n0x2d,0x26,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x01,0xea,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xfe,0x5c,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0xff,0xff,0xff,0x1a,0x01,0x09,0xff,0xbe,0x01,0xab,0x01,0x07,0x03,0x29,0xfe,0x40,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,\r\n0xff,0xff,0xff,0x79,0x01,0x09,0x00,0x1d,0x01,0xab,0x01,0x07,0x03,0x29,0xfe,0x9f,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xb9,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x11,0x00,0x06,0xb3,0x07,0x00,0x01,0x32,0x2b,0x05,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x0e,0x02,0x15,\r\n0x15,0x14,0x16,0x16,0x17,0x01,0xe5,0x8f,0x9d,0x9d,0x8f,0x40,0x5f,0x33,0x33,0x5f,0x40,0x78,0x20,0xcc,0x9a,0xb4,0x9a,0xcc,0x20,0x57,0x0f,0x54,0x7d,0x4f,0xb4,0x4e,0x7e,0x54,0x0f,0x00,0x00,0x01,0x00,0x73,0xff,0x88,0x01,0x9f,0x03,0x48,0x00,0x11,0x00,0x06,0xb3,0x0b,0x00,0x01,0x32,0x2b,0x17,0x35,0x3e,0x02,0x35,0x35,0x34,0x26,\r\n0x26,0x27,0x35,0x16,0x16,0x15,0x15,0x14,0x06,0x73,0x41,0x5e,0x33,0x33,0x5e,0x41,0x8f,0x9d,0x9d,0x78,0x57,0x0f,0x54,0x7e,0x4e,0xb4,0x4f,0x7d,0x54,0x0f,0x57,0x20,0xcc,0x9a,0xb4,0x9a,0xcc,0x00,0x00,0x00,0x00,0x01,0x00,0x4b,0xff,0x92,0x01,0xf9,0x03,0x3e,0x00,0x24,0x00,0x3d,0x40,0x3a,0x1b,0x01,0x01,0x02,0x01,0x4c,0x00,0x03,\r\n0x00,0x04,0x02,0x03,0x04,0x69,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x00,0x05,0x59,0x00,0x05,0x05,0x00,0x61,0x06,0x01,0x00,0x05,0x00,0x51,0x01,0x00,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x07,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,\r\n0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0xcc,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x05,0x42,0x4b,0x4b,0x42,0x05,0x0f,0x04,0x34,0x2f,0x2d,0x6e,0x57,0x4f,0xa4,0x35,\r\n0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x3b,0x47,0x07,0x07,0x4e,0x3a,0xa4,0x2b,0x2b,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x5f,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x26,0x00,0x38,0x40,0x35,0x09,0x01,0x04,0x03,0x01,0x4c,0x00,0x02,0x00,0x01,0x03,0x02,0x01,0x69,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x00,\r\n0x05,0x05,0x00,0x59,0x00,0x00,0x00,0x05,0x61,0x06,0x01,0x05,0x00,0x05,0x51,0x00,0x00,0x00,0x26,0x00,0x25,0x21,0x26,0x21,0x2c,0x21,0x07,0x09,0x1b,0x2b,0x17,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,\r\n0x17,0x16,0x06,0x06,0x23,0x5f,0x2d,0x2f,0x37,0x07,0x19,0x09,0x3a,0x33,0x33,0x3a,0x09,0x19,0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x6e,0x50,0x2b,0x2b,0xa4,0x39,0x4f,0x09,0x08,0x46,0x39,0xa4,0x2b,0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,\r\n0x35,0xa4,0x34,0x4b,0x27,0x00,0x00,0x00,0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x17,0x11,\r\n0x33,0x15,0x23,0x11,0x33,0x15,0xcd,0xf5,0x9b,0x9b,0x6e,0x03,0xac,0x50,0xfc,0xf4,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,\r\n0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x17,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x96,0x9b,0x9b,0xf5,0x6e,0x50,0x03,0x0c,0x50,0xfc,0x54,0x00,0x00,0x00,0xff,0xff,0x00,0x4b,0xff,0x92,0x01,0xf9,0x03,0x3e,0x02,0x06,0x03,0x45,0x00,0x00,0xff,0xff,0x00,0x5f,0xff,0x92,0x02,0x0d,0x03,0x3e,0x02,0x06,0x03,0x46,0x00,0x00,\r\n0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xef,0x02,0xda,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x33,0x03,0x13,0x33,0x03,0x13,0xf3,0x85,0x85,0xfc,0x85,0x85,0x01,0x6b,0x01,0x6f,0xfe,0x93,0xfe,0x93,\r\n0x00,0x01,0x00,0x96,0x00,0x00,0x01,0xc5,0x02,0xda,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x21,0x03,0x13,0x33,0x03,0x13,0x01,0x1d,0x87,0x87,0xa8,0x87,0x87,0x01,0x6b,0x01,0x6f,0xfe,0x93,0xfe,\r\n0x93,0x00,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x00,0x01,0xea,0x02,0xda,0x00,0x05,0x00,0x18,0x40,0x15,0x05,0x02,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x12,0x10,0x02,0x06,0x18,0x2b,0x21,0x23,0x13,0x03,0x33,0x13,0x01,0x65,0xfc,0x85,0x85,0xfc,0x85,0x01,0x6d,0x01,0x6d,0xfe,0x91,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x93,0x00,0x00,0x01,0xc2,0x02,0xda,0x00,0x05,0x00,0x18,0x40,0x15,0x05,0x02,0x02,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x12,0x10,0x02,0x06,0x18,0x2b,0x21,0x23,0x13,0x03,0x33,0x13,0x01,0x3b,0xa8,0x87,0x87,0xa8,0x87,0x01,0x6d,0x01,0x6d,0xfe,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0xcd,\r\n0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x15,0x23,0x11,0xcd,0xf5,0x9b,0x6e,0x03,0xac,0x50,0xfc,0xa4,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0xcd,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x11,0x33,0x15,0xcd,0x5a,0x9b,0x6e,0x03,0xac,0xfc,0xa4,\r\n0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x87,0xff,0x92,0x01,0xea,0x03,0x48,0x00,0x26,0x00,0x5c,0x4b,0xb0,0x0e,0x50,0x58,0x40,0x20,0x05,0x01,0x04,0x03,0x01,0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x1b,0x40,0x21,0x05,0x01,0x04,0x03,\r\n0x01,0x03,0x04,0x01,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x59,0x40,0x0d,0x00,0x00,0x00,0x26,0x00,0x26,0x2c,0x21,0x2b,0x23,0x06,0x06,0x1a,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x14,0x16,0x33,\r\n0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x36,0x37,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0xb9,0x54,0x46,0x45,0x52,0x22,0x14,0x79,0x36,0x24,0x41,0x37,0x87,0x87,0x5f,0x73,0x09,0x21,0x25,0x85,0x21,0x14,0x1e,0x1f,0x1c,0x24,0x02,0x9c,0x1b,0x42,0x4f,0x4e,0x41,0x2b,0x53,0x21,0xca,0x5a,0x6e,0x25,0x3c,0x45,0x50,\r\n0x70,0x5f,0x10,0x43,0x61,0x3b,0xd6,0x35,0x49,0x13,0x1a,0x27,0x24,0x1d,0x1b,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,\r\n0x18,0x2b,0x05,0x11,0x23,0x35,0x33,0x11,0x01,0x31,0x9b,0xf5,0x6e,0x03,0x5c,0x50,0xfc,0x54,0x00,0x00,0x00,0x01,0x00,0x96,0xff,0x92,0x01,0x8b,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,\r\n0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x35,0x33,0x11,0x33,0x11,0x96,0x9b,0x5a,0x6e,0x50,0x03,0x5c,0xfc,0x54,0x00,0x00,0x00,0x00,0x01,0x00,0x78,0xff,0x92,0x01,0xdb,0x03,0x48,0x00,0x26,0x00,0x54,0x4b,0xb0,0x0e,0x50,0x58,0x40,0x1f,0x00,0x00,0x01,0x03,0x01,0x00,0x72,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x69,0x00,0x03,0x02,0x02,\r\n0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x1b,0x40,0x20,0x00,0x00,0x01,0x03,0x01,0x00,0x03,0x80,0x00,0x04,0x00,0x01,0x00,0x04,0x01,0x69,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x59,0xb7,0x2b,0x21,0x2c,0x23,0x10,0x05,0x06,0x1b,0x2b,0x01,0x23,0x35,0x34,0x26,0x23,\r\n0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x1e,0x02,0x15,0x14,0x06,0x23,0x23,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x01,0xa9,0x5a,0x23,0x1d,0x1f,0x1e,0x14,0x21,0x85,0x25,0x21,0x09,0x73,0x5f,0x87,0x87,0x37,0x41,0x24,0x36,0x79,0x14,0x22,0x52,0x45,0x46,0x54,0x02,0x9c,0x1b,0x1d,\r\n0x24,0x27,0x1a,0x13,0x49,0x35,0xd6,0x3b,0x61,0x43,0x10,0x5f,0x70,0x50,0x45,0x3c,0x25,0x6e,0x5a,0xca,0x21,0x53,0x2b,0x41,0x4e,0x4f,0x42,0x00,0x00,0x02,0x00,0xa0,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x09,0x00,0x11,0x00,0x08,0xb5,0x0b,0x0a,0x09,0x00,0x02,0x32,0x2b,0x05,0x2e,0x02,0x35,0x35,0x34,0x36,0x36,0x37,0x03,0x11,0x06,\r\n0x06,0x15,0x15,0x14,0x16,0x01,0xe5,0x62,0x93,0x50,0x50,0x93,0x62,0x55,0x46,0x50,0x50,0x78,0x10,0x6b,0xa5,0x66,0xb4,0x67,0xa4,0x6b,0x10,0xfc,0xb3,0x02,0xde,0x24,0x92,0x61,0xb4,0x5f,0x91,0x00,0x00,0x00,0x00,0x02,0x00,0x73,0xff,0x88,0x01,0xb8,0x03,0x48,0x00,0x09,0x00,0x11,0x00,0x08,0xb5,0x11,0x0a,0x01,0x00,0x02,0x32,0x2b,\r\n0x17,0x11,0x1e,0x02,0x15,0x15,0x14,0x06,0x06,0x27,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x73,0x63,0x92,0x50,0x50,0x92,0x0e,0x46,0x50,0x50,0x46,0x78,0x03,0xc0,0x10,0x6b,0xa4,0x67,0xb4,0x66,0xa5,0x6b,0x63,0x23,0x91,0x5f,0xb4,0x61,0x92,0x24,0x00,0x00,0x01,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b,\r\n0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x8c,0x01,0x40,0x01,0x22,0x50,0x50,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x50,0x01,0x22,0x02,0x08,\r\n0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x50,0x01,0xb8,0x01,0x22,0x50,0x50,0x00,0x00,0x01,0x00,0x00,0x01,0x22,0x02,0x58,0x01,0x72,0x00,0x03,0x00,0x1e,0x40,0x1b,\r\n0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0x01,0x22,0x50,0x50,0x00,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x9c,0x02,0x1c,\r\n0xff,0xe7,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x17,0x35,0x21,0x15,0x3c,0x01,0xe0,0x64,0x4b,0x4b,0x00,0x00,0x00,0x01,0x00,0xdc,0xff,0x60,0x01,0x86,\r\n0x00,0x91,0x00,0x0f,0x00,0x35,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x3d,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x0f,0x00,0x0f,0x17,0x03,0x09,0x17,0x2b,0x17,0x37,0x36,0x36,0x35,\r\n0x34,0x26,0x27,0x33,0x16,0x16,0x15,0x14,0x06,0x07,0x07,0xdc,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0xa0,0x7b,0x14,0x2a,0x0f,0x1d,0x39,0x13,0x14,0x38,0x1d,0x14,0x38,0x19,0x63,0x00,0x00,0xff,0xff,0x00,0x69,0xff,0x60,0x02,0x05,0x00,0x91,0x00,0x26,0x03,0x5d,0x8d,0x00,0x00,0x06,0x03,0x5d,0x7f,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x69,0x01,0xa9,0x01,0xed,0x02,0xda,0x00,0x0f,0x00,0x1f,0x00,0x24,0x40,0x21,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x01,0x38,0x00,0x4e,0x10,0x10,0x00,0x00,0x10,0x1f,0x10,0x1f,0x18,0x17,0x00,0x0f,0x00,0x0f,0x17,0x06,0x09,0x17,0x2b,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,\r\n0x34,0x36,0x37,0x37,0x23,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0xed,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0x76,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,0x02,0xda,0x7b,0x13,0x2b,0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0x7b,0x13,0x2b,\r\n0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0x00,0xff,0xff,0x00,0x69,0x01,0xaf,0x01,0xef,0x02,0xe0,0x00,0x27,0x03,0x5d,0xff,0x8d,0x02,0x4f,0x01,0x07,0x03,0x5d,0x00,0x69,0x02,0x4f,0x00,0x12,0xb1,0x00,0x01,0xb8,0x02,0x4f,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x4f,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0xd2,\r\n0x01,0xa9,0x01,0x7c,0x02,0xda,0x00,0x0f,0x00,0x19,0x40,0x16,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x01,0x38,0x00,0x4e,0x00,0x00,0x00,0x0f,0x00,0x0f,0x17,0x03,0x09,0x17,0x2b,0x01,0x07,0x06,0x06,0x15,0x14,0x16,0x17,0x23,0x26,0x26,0x35,0x34,0x36,0x37,0x37,0x01,0x7c,0x38,0x09,0x0a,0x1c,0x19,0x65,0x16,0x19,0x0e,0x0b,0x2d,\r\n0x02,0xda,0x7b,0x13,0x2b,0x0f,0x1d,0x39,0x13,0x14,0x39,0x1c,0x14,0x38,0x19,0x63,0xff,0xff,0x00,0xdc,0x01,0xa9,0x01,0x86,0x02,0xda,0x03,0x07,0x03,0x5d,0x00,0x00,0x02,0x49,0x00,0x09,0xb1,0x00,0x01,0xb8,0x02,0x49,0xb0,0x35,0x2b,0x00,0x00,0x00,0x00,0x01,0x00,0xd2,0x01,0xa9,0x01,0x7c,0x02,0xda,0x00,0x0f,0x00,0x13,0x40,0x10,\r\n0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x01,0x38,0x00,0x4e,0x17,0x10,0x02,0x09,0x18,0x2b,0x01,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0x7c,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0x01,0xa9,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x69,0x01,0xa9,0x01,0xef,0x02,0xda,0x00,0x0f,0x00,0x1f,0x00,0x17,0x40,0x14,0x02,0x01,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x00,0x4e,0x17,0x17,0x17,0x10,0x04,0x09,0x1a,0x2b,0x01,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x23,0x27,0x26,0x26,0x35,0x34,0x36,0x37,\r\n0x33,0x06,0x06,0x15,0x14,0x16,0x17,0x01,0xef,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0xa4,0x64,0x2d,0x0b,0x0e,0x19,0x16,0x65,0x19,0x1c,0x0a,0x09,0x01,0xa9,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x7b,0x63,0x19,0x38,0x14,0x1d,0x38,0x14,0x13,0x39,0x1d,0x0f,0x2a,0x14,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x1e,0x00,0x28,0x02,0x33,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x33,0x40,0x30,0x0a,0x07,0x04,0x01,0x04,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x06,\r\n0x09,0x17,0x2b,0x25,0x27,0x37,0x33,0x07,0x17,0x21,0x27,0x37,0x33,0x07,0x17,0x01,0xcc,0xc0,0xbf,0x68,0xc4,0xc4,0xfe,0xab,0xc0,0xbf,0x6a,0xc4,0xc4,0x28,0xf0,0xf0,0xee,0xf2,0xf0,0xf0,0xee,0xf2,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x28,0x02,0x3a,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x33,0x40,0x30,0x0a,0x07,0x04,0x01,0x04,0x01,\r\n0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x09,0x08,0x00,0x05,0x00,0x05,0x12,0x06,0x09,0x17,0x2b,0x25,0x37,0x27,0x33,0x17,0x07,0x21,0x37,0x27,0x33,0x17,0x07,0x01,0x12,0xc0,0xc1,0x69,0xc0,0xbf,0xfe,0xab,\r\n0xc0,0xc1,0x67,0xc0,0xbf,0x28,0xf1,0xef,0xf0,0xf0,0xf1,0xef,0xf0,0xf0,0x00,0x00,0x00,0x01,0x00,0x93,0x00,0x28,0x01,0xc6,0x02,0x08,0x00,0x05,0x00,0x25,0x40,0x22,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,\r\n0x09,0x17,0x2b,0x25,0x27,0x37,0x33,0x07,0x17,0x01,0x5d,0xca,0xca,0x66,0xcc,0xcf,0x28,0xf0,0xf0,0xee,0xf2,0x00,0x00,0x00,0x00,0x01,0x00,0x93,0x00,0x28,0x01,0xc6,0x02,0x08,0x00,0x05,0x00,0x25,0x40,0x22,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,\r\n0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x09,0x17,0x2b,0x37,0x37,0x27,0x33,0x17,0x07,0x96,0xcc,0xcf,0x69,0xca,0xca,0x28,0xee,0xf2,0xf0,0xf0,0xff,0xff,0x00,0x14,0x01,0xa3,0x02,0x44,0x02,0xd5,0x00,0x27,0x03,0x2a,0xff,0x42,0x02,0x43,0x00,0x27,0x03,0x2a,0x00,0x09,0x02,0x43,0x01,0x07,0x03,0x2a,0x00,0xcf,0x02,0x43,0x00,0x1b,\r\n0xb1,0x00,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0xb1,0x02,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x8f,0x01,0xae,0x01,0xc9,0x02,0xda,0x00,0x26,0x03,0x6b,0x96,0x00,0x00,0x06,0x03,0x6b,0x6a,0x00,0x00,0x00,0x00,0x01,0x00,0xf9,0x01,0xae,0x01,0x5f,0x02,0xda,0x00,0x03,\r\n0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x03,0x33,0x03,0x01,0x01,0x08,0x66,0x07,0x01,0xae,0x01,0x2c,0xfe,0xd4,0x00,0x00,0x00,0x02,0xfe,0x34,0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,\r\n0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x2d,0x01,0x9f,0xfc,0x68,0x01,0x9f,0x01,0x22,0x50,0x50,0x50,0x50,0x00,0x00,0x03,0xfb,0xdc,\r\n0x01,0x22,0x01,0xcc,0x01,0x72,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,\r\n0x09,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x0f,0x01,0xbd,0xfa,0x10,0x01,0xbd,0x5f,0x01,0xb8,0x01,0x22,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x02,0xf9,0x4d,0xff,0x74,0x01,0xf4,0x03,0x20,0x00,0x29,0x00,0x50,0x00,0x84,0xb5,0x33,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,\r\n0x40,0x24,0x0b,0x05,0x02,0x02,0x0c,0x06,0x02,0x01,0x00,0x02,0x01,0x67,0x08,0x01,0x00,0x0f,0x0d,0x0e,0x03,0x07,0x00,0x07,0x65,0x09,0x01,0x03,0x03,0x04,0x61,0x0a,0x01,0x04,0x04,0x40,0x03,0x4e,0x1b,0x40,0x2b,0x0a,0x01,0x04,0x09,0x01,0x03,0x02,0x04,0x03,0x69,0x0b,0x05,0x02,0x02,0x0c,0x06,0x02,0x01,0x00,0x02,0x01,0x67,0x08,\r\n0x01,0x00,0x07,0x07,0x00,0x59,0x08,0x01,0x00,0x00,0x07,0x61,0x0f,0x0d,0x0e,0x03,0x07,0x00,0x07,0x51,0x59,0x40,0x20,0x2a,0x2a,0x00,0x00,0x2a,0x50,0x2a,0x4f,0x49,0x47,0x46,0x44,0x3e,0x3c,0x3b,0x39,0x2d,0x2b,0x00,0x29,0x00,0x28,0x21,0x26,0x21,0x26,0x11,0x16,0x21,0x10,0x09,0x1d,0x2b,0x05,0x35,0x33,0x32,0x36,0x27,0x27,0x26,\r\n0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x06,0x23,0x21,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,\r\n0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x06,0x23,0xfe,0x34,0x2d,0x2f,0x37,0x07,0x19,0x04,0x0c,0x0f,0xfa,0x8f,0x05,0x75,0x11,0x0f,0x05,0x19,0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x01,0xe5,0x2d,0x2f,0x37,0x07,0x19,0x09,0x3a,0x33,0x33,0x3a,0x09,0x19,\r\n0x07,0x37,0x2f,0x2d,0x2d,0x3b,0x59,0x2d,0x08,0x19,0x08,0x2b,0x41,0x7d,0x7d,0x40,0x2c,0x08,0x19,0x08,0x2d,0x59,0x3b,0x8c,0x50,0x2b,0x2b,0xa4,0x1e,0x33,0x13,0x50,0x11,0x33,0x20,0xa4,0x2b,0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x34,0x4b,0x27,0x50,0x2b,0x2b,0xa4,0x39,0x4f,0x09,0x08,0x46,0x39,0xa4,0x2b,\r\n0x2b,0x50,0x27,0x4a,0x35,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x34,0x4b,0x27,0x00,0x00,0x01,0xfb,0xa6,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0c,0x00,0x2a,0x40,0x27,0x02,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x03,0x00,0x85,0x00,0x01,0x02,0x01,0x86,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x60,0x00,0x02,0x03,0x02,0x50,\r\n0x11,0x13,0x12,0x10,0x04,0x09,0x1a,0x2b,0x13,0x33,0x13,0x03,0x23,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x27,0xbc,0x6a,0xe7,0xe8,0x69,0xbe,0x08,0x08,0xfa,0x1c,0x05,0xe4,0x0a,0x0a,0x02,0x71,0xfe,0xd9,0xfe,0xd9,0xef,0x0a,0x06,0x50,0x08,0x0c,0x00,0x00,0x01,0xfe,0x5c,0xff,0xab,0x01,0x59,0x02,0xee,0x00,0x07,0x00,0x47,0x4b,0xb0,\r\n0x18,0x50,0x58,0x40,0x14,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x04,0x01,0x03,0x03,0x02,0x5f,0x00,0x02,0x02,0x38,0x03,0x4e,0x1b,0x40,0x19,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,\r\n0x11,0x05,0x09,0x19,0x2b,0x17,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xff,0xfd,0x5d,0x02,0xa3,0x5a,0x55,0x01,0x77,0x50,0x01,0x7c,0xfc,0xbd,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0e,0x00,0x2a,0x40,0x27,0x02,0x01,0x02,0x03,0x01,0x4c,0x00,0x00,0x03,0x00,0x85,0x00,0x01,0x02,0x01,0x86,0x00,0x03,0x02,0x02,\r\n0x03,0x57,0x00,0x03,0x03,0x02,0x60,0x00,0x02,0x03,0x02,0x50,0x11,0x23,0x12,0x10,0x04,0x09,0x1a,0x2b,0x13,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0xbc,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfc,0x76,0x03,0x8a,0x04,0x08,0x05,0x02,0x71,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0x50,0x05,0x0a,\r\n0x05,0x00,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0e,0x00,0x1a,0x00,0x3c,0x40,0x39,0x19,0x13,0x0d,0x03,0x00,0x01,0x01,0x4c,0x04,0x01,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x68,0x04,0x01,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x0f,0x0f,0x00,0x00,0x0f,\r\n0x1a,0x0f,0x1a,0x18,0x17,0x00,0x0e,0x00,0x0e,0x14,0x11,0x23,0x08,0x09,0x19,0x2b,0x27,0x37,0x36,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x33,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x70,0xbe,0x03,0x07,0x03,0xfb,0x4a,0x04,0xb6,0x04,0x08,0x05,0xba,0x6a,0xe7,0xe8,0xc3,0xbe,0x13,0x1a,0x05,\r\n0x05,0x1c,0x15,0xba,0x6a,0xe7,0xe8,0x23,0xef,0x04,0x08,0x04,0x50,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0a,0x00,0x2e,0x40,0x2b,0x08,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x03,0x02,0x57,\r\n0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x0a,0x00,0x0a,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x25,0x27,0x21,0x35,0x21,0x37,0x33,0x07,0x07,0x17,0x17,0x01,0x8a,0xc8,0xfd,0x3b,0x02,0xc5,0xc9,0x69,0xbe,0x2e,0x32,0xba,0x23,0xff,0x50,0xff,0xef,0x37,0x3d,0xeb,\r\n0x00,0x02,0xfb,0xa5,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0a,0x00,0x12,0x00,0x3c,0x40,0x39,0x10,0x0c,0x08,0x03,0x00,0x01,0x01,0x4c,0x04,0x01,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x0b,0x0b,0x00,0x00,0x0b,0x12,0x0b,0x12,0x0e,\r\n0x0d,0x00,0x0a,0x00,0x0a,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x37,0x27,0x21,0x35,0x21,0x37,0x33,0x07,0x07,0x17,0x17,0x33,0x03,0x13,0x33,0x07,0x07,0x17,0x17,0x5e,0xc8,0xfc,0x0f,0x03,0xf1,0xc9,0x69,0xbe,0x2e,0x32,0xba,0xc2,0xe7,0xe8,0x69,0xbe,0x2e,0x32,0xba,0x23,0xff,0x50,0xff,0xef,0x37,0x3d,0xeb,0x01,0x27,0x01,0x27,0xef,\r\n0x37,0x3d,0xeb,0x00,0x00,0x01,0xfe,0x11,0x00,0xdc,0x01,0xef,0x01,0xb8,0x00,0x1d,0x00,0x6e,0x4b,0xb0,0x11,0x50,0x58,0x40,0x22,0x00,0x04,0x00,0x06,0x03,0x04,0x06,0x69,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x03,0x03,0x00,0x61,0x05,0x07,0x02,0x00,0x03,0x00,0x51,0x1b,0x40,0x29,0x00,0x05,\r\n0x01,0x00,0x01,0x05,0x00,0x80,0x00,0x04,0x00,0x06,0x03,0x04,0x06,0x69,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x59,0x40,0x15,0x01,0x00,0x19,0x17,0x14,0x13,0x10,0x0e,0x0a,0x08,0x05,0x04,0x03,0x02,0x00,0x1d,0x01,0x1d,0x08,0x09,0x16,0x2b,\r\n0x37,0x22,0x27,0x21,0x35,0x21,0x15,0x14,0x16,0x33,0x32,0x3e,0x03,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x0e,0x03,0x64,0x62,0x27,0xfe,0x36,0x02,0x0d,0x27,0x1f,0x1a,0x27,0x23,0x29,0x39,0x2a,0x46,0x55,0x55,0x26,0x20,0x1b,0x27,0x24,0x29,0x38,0xdc,0x46,0x50,0x05,0x22,0x24,0x1d,0x2b,0x2c,0x1d,0x50,0x41,0x3c,\r\n0x3c,0x20,0x26,0x1d,0x2b,0x2c,0x1d,0x00,0xff,0xff,0xfe,0x0c,0xff,0x92,0x01,0xcc,0x03,0x3e,0x00,0x27,0x03,0x45,0xfd,0xc1,0x00,0x00,0x00,0x06,0x03,0x45,0xd3,0x00,0x00,0x03,0xf9,0x7f,0xff,0x74,0x02,0x03,0x03,0x20,0x00,0x24,0x00,0x4a,0x00,0x4f,0x00,0x8d,0xb7,0x4e,0x4d,0x1b,0x03,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,\r\n0x40,0x24,0x0b,0x08,0x02,0x02,0x0c,0x07,0x02,0x01,0x05,0x02,0x01,0x67,0x0d,0x01,0x05,0x0f,0x06,0x0e,0x03,0x00,0x05,0x00,0x65,0x0a,0x01,0x04,0x04,0x03,0x61,0x09,0x01,0x03,0x03,0x40,0x04,0x4e,0x1b,0x40,0x2b,0x09,0x01,0x03,0x0a,0x01,0x04,0x02,0x03,0x04,0x69,0x0b,0x08,0x02,0x02,0x0c,0x07,0x02,0x01,0x05,0x02,0x01,0x67,0x0d,\r\n0x01,0x05,0x00,0x00,0x05,0x59,0x0d,0x01,0x05,0x05,0x00,0x61,0x0f,0x06,0x0e,0x03,0x00,0x05,0x00,0x51,0x59,0x40,0x27,0x26,0x25,0x01,0x00,0x49,0x47,0x42,0x41,0x40,0x3f,0x3a,0x38,0x37,0x35,0x30,0x2e,0x2d,0x2b,0x25,0x4a,0x26,0x4a,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x10,0x09,0x16,0x2b,0x05,\r\n0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x21,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x07,0x21,\r\n0x15,0x21,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0x16,0x17,0x35,0x06,0xfb,0x00,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x05,0x42,0x4b,0x4b,0x42,0x05,0x0f,0x04,0x34,0x2f,0x2d,0x01,0xe8,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,\r\n0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x06,0x27,0x05,0x5f,0xfa,0xa3,0x25,0x06,0x0f,0x04,0x34,0x2f,0x2d,0xfe,0xfb,0x17,0x14,0x14,0x8c,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x3b,0x47,0x07,0x07,0x4e,0x3a,0xa4,0x2b,0x2b,0x50,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,\r\n0x57,0x50,0x2b,0x2b,0xa4,0x41,0x23,0x50,0x25,0x3f,0xa4,0x2b,0x2b,0x50,0x01,0xd9,0x02,0x06,0x0f,0x05,0x00,0x05,0xf9,0x7f,0xff,0x74,0x02,0x03,0x03,0x20,0x00,0x25,0x00,0x29,0x00,0x2d,0x00,0x32,0x00,0x40,0x00,0xaf,0xb6,0x30,0x2e,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x36,0x0a,0x05,0x02,0x02,0x10,0x0b,0x06,\r\n0x03,0x01,0x09,0x02,0x01,0x67,0x00,0x07,0x0e,0x01,0x00,0x07,0x00,0x65,0x00,0x04,0x04,0x03,0x61,0x00,0x03,0x03,0x40,0x4d,0x0f,0x01,0x09,0x09,0x08,0x5f,0x00,0x08,0x08,0x38,0x4d,0x00,0x0d,0x0d,0x0c,0x61,0x11,0x01,0x0c,0x0c,0x42,0x0c,0x4e,0x1b,0x40,0x34,0x00,0x03,0x00,0x04,0x02,0x03,0x04,0x69,0x0a,0x05,0x02,0x02,0x10,0x0b,\r\n0x06,0x03,0x01,0x09,0x02,0x01,0x67,0x00,0x07,0x0e,0x01,0x00,0x07,0x00,0x65,0x0f,0x01,0x09,0x09,0x08,0x5f,0x00,0x08,0x08,0x38,0x4d,0x00,0x0d,0x0d,0x0c,0x61,0x11,0x01,0x0c,0x0c,0x42,0x0c,0x4e,0x59,0x40,0x2f,0x34,0x33,0x2a,0x2a,0x26,0x26,0x01,0x00,0x3b,0x38,0x33,0x40,0x34,0x3f,0x2a,0x2d,0x2a,0x2d,0x2c,0x2b,0x26,0x29,0x26,\r\n0x29,0x28,0x27,0x24,0x22,0x1d,0x1c,0x1b,0x1a,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x25,0x01,0x25,0x12,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x07,0x21,0x15,0x21,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,\r\n0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x25,0x16,0x17,0x35,0x06,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfb,0x00,0x58,0x68,0x07,0x0f,0x05,0x28,0x41,0x73,0x73,0x41,0x28,0x05,0x0f,0x07,0x68,0x58,0x2d,0x2d,0x2f,0x34,0x04,0x0f,0x06,0x27,0x01,0x25,0xfe,0xdd,0x25,0x06,0x0f,0x04,0x34,0x2f,0x2d,0x01,\r\n0x28,0x0c,0x6a,0x0c,0x9d,0x04,0xbf,0xf8,0x25,0x0e,0x0c,0x0c,0x02,0x39,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0x8c,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x41,0x23,0x50,0x25,0x3f,0xa4,0x2b,0x2b,0x50,0x01,0x63,0x02,0x03,0xfd,0xfd,0x4b,0x50,0x50,0x2b,0x01,0x03,0x08,0x02,0xfe,0xac,\r\n0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0xff,0xff,0xfc,0x09,0xff,0x92,0x01,0x40,0x03,0x3e,0x00,0x27,0x03,0x45,0xfb,0xbe,0x00,0x00,0x00,0x27,0x03,0x2e,0xfd,0xf3,0x00,0x00,0x00,0x06,0x03,0x2e,0xc9,0x00,0x00,0x02,0xfe,0x43,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x24,0x00,0x28,0x00,0x48,0x40,0x45,0x1b,0x01,0x01,0x02,0x01,0x4c,\r\n0x06,0x01,0x03,0x00,0x04,0x02,0x03,0x04,0x67,0x00,0x02,0x00,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x09,0x07,0x08,0x03,0x00,0x05,0x00,0x4f,0x25,0x25,0x01,0x00,0x25,0x28,0x25,0x28,0x27,0x26,0x23,0x21,0x15,0x13,0x12,0x10,0x0b,0x09,0x08,0x06,0x00,0x24,0x01,0x24,0x0a,0x09,0x16,0x2b,\r\n0x07,0x22,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x33,0x11,0x33,0x11,0x3c,0x58,0x65,0x04,0x0a,0x03,0x26,0x41,0x6e,0x6e,0x41,0x26,0x03,0x0a,0x04,0x65,0x58,0x73,0x73,0x2f,0x32,0x02,0x0a,\r\n0x03,0x35,0x32,0x31,0x36,0x03,0x0a,0x02,0x32,0x2f,0x73,0xb4,0x5a,0x6e,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x50,0x2b,0x2b,0xa4,0x39,0x4a,0x09,0x09,0x4a,0x39,0xa4,0x2b,0x2b,0x50,0x03,0xac,0xfc,0x54,0x00,0xff,0xff,0xfe,0x34,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x27,0x03,0x46,0xfd,0xd5,0x00,0x00,0x00,0x06,\r\n0x03,0x46,0xe7,0x00,0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,\r\n0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x05,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x33,0x11,0x33,0x11,0xfe,0xbb,0x01,0x81,0xfe,0xd9,0x01,0x27,0xaf,0x5a,0x6e,0x03,0xac,0x50,0xfc,0xf4,0x50,0x03,0xac,0xfc,0x54,0xff,0xff,0xfe,0x8e,0xff,0x92,0x01,0x9f,0x03,0x3e,0x00,0x27,0x03,0x47,0xfd,0xc1,0x00,0x00,0x01,0x06,0x04,0x1c,0x9c,0x0f,\r\n0x00,0x08,0xb1,0x01,0x01,0xb0,0x0f,0xb0,0x35,0x2b,0x00,0x00,0x00,0x03,0xfe,0x3e,0xff,0x92,0x02,0x35,0x03,0x3e,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x5e,0x40,0x5b,0x00,0x04,0x00,0x03,0x06,0x04,0x03,0x67,0x09,0x07,0x02,0x05,0x13,0x10,0x02,0x0a,0x0b,0x05,0x0a,0x68,0x12,0x11,0x02,0x0b,0x0e,0x0c,0x02,0x00,0x0d,0x0b,0x00,0x67,\r\n0x00,0x02,0x00,0x01,0x02,0x01,0x63,0x08,0x01,0x06,0x06,0x38,0x4d,0x14,0x0f,0x02,0x0d,0x0d,0x39,0x0d,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x15,0x09,0x1f,0x2b,0x33,0x37,0x21,0x11,\r\n0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x11,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x21,0x15,0x21,0x33,0x33,0x37,0x23,0x53,0x27,0xfe,0xb9,0xf5,0x9b,0x9b,0xf5,0x01,0x7f,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x0e,\r\n0xfe,0x8c,0x01,0x52,0x46,0xa0,0x22,0xa0,0xd2,0xfe,0xc0,0x50,0x03,0x0c,0x50,0xfe,0xca,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0xc7,0xb4,0xb4,0x00,0xff,0xff,0xfe,0xd4,0xff,0xf6,0x01,0x2e,0x00,0x98,0x00,0x27,0x03,0x29,0xfd,0xfa,0x00,0x00,0x00,0x06,0x03,0x29,0xb0,0x00,0xff,0xff,0xfc,0x90,0xff,0xf6,0x01,0x1a,\r\n0x00,0x98,0x00,0x27,0x03,0x29,0xfb,0xb6,0x00,0x00,0x00,0x27,0x03,0x29,0xfd,0xa9,0x00,0x00,0x00,0x06,0x03,0x29,0x9c,0x00,0xff,0xff,0xfc,0x71,0xff,0xf6,0x01,0x45,0x02,0x53,0x00,0x27,0x04,0x1c,0xff,0x42,0x00,0x00,0x00,0x27,0x03,0x29,0xfb,0x97,0x00,0x00,0x00,0x07,0x03,0x29,0xfd,0x4d,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0x82,\r\n0xff,0xf6,0x01,0x81,0x02,0xda,0x00,0x27,0x03,0x29,0xfd,0xa8,0x00,0x00,0x00,0x06,0x03,0x30,0x9c,0x00,0xff,0xff,0xfe,0x5c,0x00,0xaa,0x02,0x03,0x01,0xea,0x00,0x27,0x03,0x33,0xfd,0xa8,0xff,0xdd,0x03,0x06,0x04,0x19,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0xdd,0xb0,0x35,0x2b,0x00,0xff,0xff,0xfe,0xd1,0xff,0xf6,0x01,0x2f,\r\n0x02,0x30,0x00,0x27,0x03,0x2b,0xfd,0xf8,0x00,0x00,0x00,0x06,0x03,0x2b,0xb0,0x00,0xff,0xff,0xfc,0xc9,0xff,0xf6,0x00,0xdf,0x02,0x30,0x00,0x27,0x03,0x2b,0xfb,0xf0,0x00,0x00,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x00,0x00,0x07,0x03,0x2b,0xff,0x60,0x00,0x00,0x00,0x00,0xff,0xff,0xfc,0x44,0x00,0x2d,0x01,0x81,0x02,0x67,0x00,0x27,\r\n0x03,0x2b,0xfb,0x6b,0x00,0x37,0x00,0x27,0x03,0x2b,0xfd,0x2f,0x00,0x37,0x01,0x07,0x04,0x19,0xff,0x7e,0x00,0x00,0x00,0x10,0xb1,0x00,0x02,0xb0,0x37,0xb0,0x35,0x2b,0xb1,0x02,0x02,0xb0,0x37,0xb0,0x35,0x2b,0xff,0xff,0xfe,0xb3,0xff,0xf6,0x01,0x81,0x02,0xda,0x00,0x26,0x03,0x30,0x9c,0x00,0x00,0x07,0x03,0x2b,0xfd,0xda,0x00,0x00,\r\n0x00,0x05,0xfc,0x2c,0xff,0xf6,0x01,0xae,0x02,0xda,0x00,0x14,0x00,0x21,0x00,0x2f,0x00,0x3d,0x00,0x4b,0x01,0x3b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x1f,0x01,0x06,0x01,0x1e,0x01,0x05,0x06,0x20,0x1a,0x02,0x03,0x00,0x21,0x01,0x04,0x03,0x16,0x01,0x08,0x04,0x15,0x01,0x07,0x0a,0x06,0x4c,0x1b,0x40,0x1b,0x1f,0x01,0x06,0x01,0x1e,\r\n0x01,0x05,0x06,0x20,0x1a,0x02,0x03,0x00,0x21,0x01,0x04,0x03,0x16,0x01,0x08,0x04,0x15,0x01,0x09,0x0a,0x06,0x4c,0x59,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x40,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x72,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,\r\n0x06,0x41,0x4d,0x00,0x08,0x08,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x4d,0x00,0x0a,0x0a,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x41,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,\r\n0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,0x06,0x41,0x4d,0x00,0x08,0x08,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x4d,0x00,0x0a,0x0a,0x07,0x61,0x0e,0x09,0x0d,0x03,0x07,0x07,0x3f,0x07,0x4e,0x1b,0x40,0x3d,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x01,0x01,0x02,0x5f,\r\n0x00,0x02,0x02,0x38,0x4d,0x0c,0x01,0x05,0x05,0x06,0x61,0x00,0x06,0x06,0x41,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x4d,0x00,0x08,0x08,0x07,0x61,0x0d,0x01,0x07,0x07,0x3f,0x07,0x4e,0x59,0x59,0x40,0x25,0x3f,0x3e,0x31,0x30,0x23,0x22,0x00,0x00,0x46,0x43,0x3e,0x4b,0x3f,0x4a,0x38,0x35,0x30,0x3d,0x31,0x3c,0x2a,\r\n0x27,0x22,0x2f,0x23,0x2e,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x0f,0x09,0x1a,0x2b,0x25,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x23,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0x09,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x01,0x9d,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfa,0xc9,0x21,0x2a,0x2b,0x20,\r\n0x14,0x20,0x2b,0x2a,0x21,0x14,0x21,0x2a,0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x01,0x9b,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0x96,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0xd7,0x64,0x82,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfe,\r\n0x5c,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0x05,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x00,0x04,0xfe,0x52,0x00,0x64,0x01,0xd6,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x7b,0x4b,0xb0,0x18,0x50,0x58,0x40,0x24,0x00,0x02,0x00,0x00,0x02,0x57,0x0b,0x01,0x07,0x04,0x05,0x07,0x57,0x06,0x01,0x05,0x0a,\r\n0x01,0x04,0x05,0x04,0x65,0x09,0x03,0x08,0x03,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,0x4e,0x1b,0x40,0x26,0x00,0x02,0x09,0x01,0x03,0x00,0x02,0x03,0x67,0x00,0x06,0x0b,0x01,0x07,0x04,0x06,0x07,0x67,0x00,0x05,0x0a,0x01,0x04,0x05,0x04,0x65,0x08,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x23,0x1c,\r\n0x1c,0x11,0x10,0x0c,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,\r\n0x35,0x21,0x15,0xfe,0xa2,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xea,0x02,0x26,0xfc,0xcc,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xea,0x02,0x26,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0x50,0xfe,0xca,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x46,0x50,0x50,0x00,0x00,0x00,0xff,0xff,0xfe,0x81,0x00,0x2d,0x01,0x9f,\r\n0x02,0x67,0x00,0x26,0x04,0x1b,0x9c,0x00,0x01,0x07,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfe,0x81,0x00,0x2d,0x01,0x77,0x02,0x67,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x01,0x07,0x04,0x1c,0xff,0x74,0x00,0x00,0x00,0x08,0xb1,0x00,0x02,0xb0,0x37,0xb0,0x35,0x2b,\r\n0xff,0xff,0xfe,0xc5,0xff,0x60,0x01,0x31,0x02,0x30,0x00,0x27,0x03,0x2c,0xfd,0xf8,0x00,0x00,0x00,0x06,0x03,0x2c,0xb0,0x00,0xff,0xff,0xfc,0xbd,0xff,0x60,0x00,0xe1,0x02,0x30,0x00,0x27,0x03,0x2c,0xfd,0xa8,0x00,0x00,0x00,0x27,0x03,0x2c,0xff,0x60,0x00,0x00,0x00,0x07,0x03,0x2c,0xfb,0xf0,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0xc5,\r\n0xff,0xfb,0x01,0x3b,0x02,0xda,0x00,0x27,0x03,0x2e,0xfd,0xe4,0x00,0x00,0x00,0x06,0x03,0x2e,0xc4,0x00,0xff,0xff,0xfc,0x68,0xff,0x92,0x01,0x9f,0x03,0x3e,0x00,0x27,0x03,0x2e,0xfb,0x87,0x00,0x00,0x00,0x27,0x03,0x2e,0xfd,0x5d,0x00,0x00,0x00,0x06,0x03,0x46,0x92,0x00,0x00,0x01,0xfd,0xf8,0x00,0x00,0x02,0x08,0x02,0x99,0x00,0x13,\r\n0x00,0x35,0x40,0x32,0x00,0x04,0x03,0x04,0x85,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x68,0x07,0x01,0x01,0x08,0x01,0x00,0x09,0x01,0x00,0x67,0x0a,0x01,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x23,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,\r\n0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x98,0x3e,0xfe,0x52,0x01,0xcc,0x3a,0xfd,0xfa,0x02,0x24,0x40,0x46,0x40,0x01,0xa6,0xfe,0x3c,0x3a,0x01,0xfe,0xfd,0xe4,0x3e,0xaa,0x50,0xa0,0x50,0xaf,0xaf,0x50,0xa0,0x50,0xaa,0x00,0x00,0x00,0x00,0x01,0xfb,0xa5,0xff,0x92,0x02,0x03,0x03,0x3e,0x00,0x1b,0x00,0x4f,0x40,0x4c,\r\n0x00,0x06,0x05,0x06,0x85,0x0e,0x01,0x0d,0x00,0x0d,0x86,0x07,0x01,0x05,0x08,0x01,0x04,0x03,0x05,0x04,0x68,0x09,0x01,0x03,0x0a,0x01,0x02,0x01,0x03,0x02,0x67,0x0b,0x01,0x01,0x00,0x00,0x01,0x57,0x0b,0x01,0x01,0x01,0x00,0x5f,0x0c,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x09,0x1f,0x2b,0x05,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0xfe,0x1f,0x44,0xfd,0x42,0x02,0xda,0x34,0xfc,0xf2,0x03,0x29,0x34,0xfc,0xa3,0x03,0x79,0x5a,0x46,0x5a,0x02,0x9f,0xfd,\r\n0x45,0x34,0x02,0xef,0xfc,0xf6,0x34,0x03,0x3e,0xfc,0xa6,0x44,0x6e,0xba,0x4c,0x8c,0x4c,0x8c,0x4c,0xf6,0xf6,0x4c,0x8c,0x4c,0x8c,0x4c,0xba,0x00,0xff,0xff,0xfe,0x90,0xff,0xf6,0x01,0x2d,0x02,0xda,0x00,0x27,0x03,0x30,0xfe,0x0e,0x00,0x00,0x00,0x06,0x03,0x29,0xaf,0x00,0xff,0xff,0xfe,0x90,0xff,0xf6,0x01,0x4d,0x02,0xda,0x00,0x27,\r\n0x03,0x30,0xfe,0x0e,0x00,0x00,0x00,0x06,0x03,0x2b,0xce,0x00,0xff,0xff,0xfe,0x5c,0xff,0xfb,0x01,0xb8,0x02,0xda,0x00,0x27,0x03,0x30,0xfd,0xda,0x00,0x00,0x00,0x06,0x03,0x30,0xd3,0x00,0xff,0xff,0xfb,0xfa,0xff,0xfb,0x01,0xbd,0x02,0xda,0x00,0x27,0x03,0x30,0xfb,0x78,0x00,0x00,0x00,0x27,0x03,0x30,0xfd,0xa8,0x00,0x00,0x00,0x06,\r\n0x03,0x30,0xd8,0x00,0x00,0x04,0xfe,0x52,0xff,0xfb,0x01,0xcc,0x02,0xda,0x00,0x14,0x00,0x18,0x00,0x1e,0x00,0x2c,0x00,0xa5,0xb5,0x1a,0x01,0x04,0x07,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x32,0x00,0x05,0x0c,0x01,0x06,0x00,0x05,0x06,0x67,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x69,0x00,0x07,0x0d,0x08,0x0b,0x03,0x04,0x0a,0x07,\r\n0x04,0x67,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x09,0x4e,0x1b,0x40,0x39,0x0b,0x01,0x04,0x07,0x08,0x07,0x04,0x08,0x80,0x00,0x05,0x0c,0x01,0x06,0x00,0x05,0x06,0x67,0x00,0x00,0x00,0x03,0x07,0x00,0x03,0x69,0x00,0x07,0x0d,0x01,0x08,0x0a,0x07,0x08,0x67,0x00,0x01,\r\n0x01,0x02,0x5f,0x00,0x02,0x02,0x38,0x4d,0x00,0x0a,0x0a,0x09,0x61,0x0e,0x01,0x09,0x09,0x42,0x09,0x4e,0x59,0x40,0x25,0x20,0x1f,0x19,0x19,0x15,0x15,0x00,0x00,0x27,0x24,0x1f,0x2c,0x20,0x2b,0x19,0x1e,0x19,0x1e,0x1d,0x1c,0x15,0x18,0x15,0x18,0x17,0x16,0x00,0x14,0x00,0x14,0x16,0x21,0x24,0x21,0x0f,0x09,0x1a,0x2b,0x25,0x35,0x33,\r\n0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x25,0x35,0x21,0x15,0x05,0x35,0x36,0x37,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0x9e,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x01,0x1c,0x01,0xb8,0xfd,0xa8,0x27,\r\n0x09,0x02,0x28,0xfc,0xef,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0xaa,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x5f,0xe6,0x50,0x50,0xf0,0x24,0x13,0x19,0x50,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0xff,0xff,0xfb,0x9c,0x00,0x67,0x02,0x0c,0x03,0x0c,0x00,0x27,0x03,0x34,0xfb,0x78,\r\n0x00,0x00,0x00,0x27,0x03,0x34,0xfd,0xa8,0x00,0xa0,0x01,0x06,0x03,0x34,0xd8,0x00,0x00,0x08,0xb1,0x01,0x01,0xb0,0xa0,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfd,0xe5,0x00,0x41,0x02,0x12,0x02,0x6c,0x00,0x26,0x04,0x1b,0x0f,0x00,0x00,0x07,0x03,0x34,0xfd,0xc1,0x00,0x00,0xff,0xff,0xfd,0xcc,0xff,0x92,0x02,0x0d,0x03,0x3e,0x00,0x27,\r\n0x03,0x34,0xfd,0xa8,0xff,0xb0,0x03,0x06,0x03,0x3d,0x00,0x00,0x00,0x09,0xb1,0x00,0x01,0xb8,0xff,0xb0,0xb0,0x35,0x2b,0x00,0x00,0x03,0xfd,0xcb,0xff,0x88,0x01,0xe5,0x03,0x48,0x00,0x27,0x00,0x2d,0x00,0x31,0x00,0x4c,0x40,0x49,0x1e,0x1d,0x02,0x08,0x4a,0x27,0x00,0x02,0x01,0x49,0x0b,0x09,0x02,0x07,0x0f,0x0d,0x02,0x06,0x05,0x07,\r\n0x06,0x68,0x0e,0x0c,0x02,0x05,0x04,0x02,0x02,0x00,0x01,0x05,0x00,0x67,0x0a,0x01,0x08,0x08,0x38,0x4d,0x03,0x01,0x01,0x01,0x39,0x01,0x4e,0x31,0x30,0x2f,0x2e,0x2d,0x2a,0x29,0x28,0x1a,0x19,0x18,0x17,0x16,0x15,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x10,0x09,0x1f,0x2b,0x05,0x26,0x26,0x27,0x21,0x07,0x23,0x37,0x23,0x07,\r\n0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x36,0x36,0x37,0x15,0x0e,0x02,0x15,0x15,0x14,0x16,0x16,0x17,0x01,0x21,0x35,0x34,0x35,0x21,0x05,0x33,0x37,0x23,0x01,0xe5,0x81,0x99,0x0f,0xfe,0x92,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,\r\n0x27,0x01,0x38,0x10,0x99,0x7e,0x40,0x5f,0x33,0x33,0x5f,0x40,0xfd,0x74,0x01,0x60,0xfe,0xc2,0xfe,0xf8,0xa0,0x22,0xa0,0x78,0x1d,0xac,0x81,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x7d,0xa7,0x1c,0x57,0x0f,0x54,0x7d,0x4f,0xb4,0x4e,0x7e,0x54,0x0f,0x01,0x34,0xaf,0x03,0x02,0xb4,0xb4,0x00,0x00,0x00,0x03,0xfd,0xcb,\r\n0xff,0x92,0x02,0x03,0x03,0x3e,0x00,0x33,0x00,0x3f,0x00,0x43,0x00,0xd3,0xb5,0x26,0x01,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x44,0x00,0x0f,0x13,0x12,0x07,0x0f,0x72,0x00,0x0d,0x00,0x0e,0x09,0x0d,0x0e,0x69,0x0c,0x0a,0x02,0x08,0x16,0x14,0x02,0x07,0x13,0x08,0x07,0x68,0x00,0x13,0x00,0x12,0x06,0x13,0x12,0x67,0x15,\r\n0x11,0x02,0x06,0x05,0x03,0x02,0x01,0x02,0x06,0x01,0x67,0x00,0x10,0x17,0x01,0x00,0x10,0x00,0x65,0x0b,0x01,0x09,0x09,0x38,0x4d,0x04,0x01,0x02,0x02,0x39,0x02,0x4e,0x1b,0x40,0x45,0x00,0x0f,0x13,0x12,0x13,0x0f,0x12,0x80,0x00,0x0d,0x00,0x0e,0x09,0x0d,0x0e,0x69,0x0c,0x0a,0x02,0x08,0x16,0x14,0x02,0x07,0x13,0x08,0x07,0x68,0x00,\r\n0x13,0x00,0x12,0x06,0x13,0x12,0x67,0x15,0x11,0x02,0x06,0x05,0x03,0x02,0x01,0x02,0x06,0x01,0x67,0x00,0x10,0x17,0x01,0x00,0x10,0x00,0x65,0x0b,0x01,0x09,0x09,0x38,0x4d,0x04,0x01,0x02,0x02,0x39,0x02,0x4e,0x59,0x40,0x35,0x01,0x00,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3c,0x3a,0x39,0x37,0x35,0x34,0x32,0x30,0x29,0x28,0x23,0x21,0x20,\r\n0x1e,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x33,0x01,0x33,0x18,0x09,0x16,0x2b,0x05,0x22,0x26,0x37,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x27,0x26,0x36,\r\n0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x07,0x15,0x16,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x01,0x21,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x37,0x21,0x05,0x33,0x37,0x23,0x01,0xd6,0x58,0x65,0x04,0x09,0xfe,0x28,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,\r\n0x01,0xa0,0x09,0x05,0x66,0x58,0x2d,0x2d,0x2f,0x33,0x03,0x0a,0x04,0x3c,0x3b,0x3c,0x3a,0x03,0x0a,0x02,0x32,0x2f,0x2d,0xfd,0x56,0x01,0xcb,0x06,0x2c,0x2f,0x4b,0x4b,0x2e,0x2d,0x06,0xfe,0x57,0xfe,0xf8,0xa0,0x22,0xa0,0x6e,0x57,0x4f,0x9a,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x90,0x4f,0x57,0x50,0x2b,0x2b,0x9f,\r\n0x37,0x4f,0x02,0x05,0x02,0x52,0x37,0xa9,0x2b,0x2b,0x50,0x01,0x81,0x1a,0x18,0x50,0x18,0x1a,0xb4,0xb4,0x00,0x03,0xfd,0xcb,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x5e,0x40,0x5b,0x00,0x0c,0x00,0x0d,0x08,0x0c,0x0d,0x67,0x0b,0x09,0x02,0x07,0x13,0x11,0x02,0x06,0x05,0x07,0x06,0x68,0x12,0x10,0x02,0x05,\r\n0x04,0x02,0x02,0x00,0x01,0x05,0x00,0x67,0x00,0x0e,0x14,0x01,0x0f,0x0e,0x0f,0x63,0x0a,0x01,0x08,0x08,0x38,0x4d,0x03,0x01,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x00,0x1f,0x00,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,\r\n0x15,0x09,0x1f,0x2b,0x17,0x11,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x11,0x33,0x15,0x23,0x11,0x33,0x15,0x01,0x21,0x35,0x21,0x05,0x33,0x37,0x23,0xcd,0xfe,0x81,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,\r\n0x46,0x27,0x01,0x47,0xf5,0x9b,0x9b,0xfd,0x97,0x01,0x74,0xfe,0xae,0xfe,0xf8,0xa0,0x22,0xa0,0x6e,0x01,0x40,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x01,0x36,0x50,0xfc,0xf4,0x50,0x01,0x81,0xb4,0xb4,0xb4,0x00,0x00,0x04,0xfd,0xcb,0x00,0x00,0x01,0x7c,0x02,0xda,0x00,0x1b,0x00,0x27,0x00,0x2b,0x00,0x37,0x00,0xab,\r\n0x4b,0xb0,0x11,0x50,0x58,0x40,0x37,0x07,0x05,0x02,0x03,0x11,0x08,0x02,0x02,0x0e,0x03,0x02,0x68,0x00,0x0f,0x15,0x01,0x0e,0x01,0x0f,0x0e,0x69,0x0c,0x0a,0x02,0x00,0x12,0x01,0x00,0x57,0x13,0x10,0x09,0x03,0x01,0x16,0x01,0x12,0x0b,0x01,0x12,0x69,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x40,\r\n0x38,0x07,0x05,0x02,0x03,0x11,0x08,0x02,0x02,0x0e,0x03,0x02,0x68,0x00,0x0f,0x15,0x01,0x0e,0x13,0x0f,0x0e,0x69,0x10,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x12,0x01,0x00,0x67,0x00,0x13,0x16,0x01,0x12,0x0b,0x13,0x12,0x69,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x59,0x40,0x2e,0x2d,0x2c,0x1d,0x1c,\r\n0x00,0x00,0x33,0x31,0x2c,0x37,0x2d,0x37,0x2b,0x2a,0x29,0x28,0x23,0x21,0x1c,0x27,0x1d,0x27,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,\r\n0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x33,0x37,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x02,0xeb,0x24,0x2c,\r\n0x2c,0x24,0x24,0x2c,0x2c,0xfd,0x23,0xa0,0x22,0xa0,0x02,0x97,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0xae,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x9b,0xb4,0xfe,0xbb,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x00,0x00,0x04,0xfd,0xcb,0xff,0xfb,0x01,0x8b,\r\n0x02,0xda,0x00,0x03,0x00,0x1f,0x00,0x23,0x00,0x31,0x00,0xaf,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x30,0x09,0x07,0x02,0x05,0x11,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x10,0x0b,0x02,0x03,0x0e,0x0c,0x02,0x14,0x04,0x01,0x13,0x03,0x01,0x67,0x08,0x06,0x02,0x00,0x00,0x38,0x4d,0x00,0x13,0x13,0x0d,0x5f,0x16,0x12,0x15,0x0f,0x04,0x0d,0x0d,\r\n0x39,0x0d,0x4e,0x1b,0x40,0x3b,0x14,0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x09,0x07,0x02,0x05,0x11,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x10,0x0b,0x02,0x03,0x0e,0x0c,0x02,0x02,0x13,0x03,0x02,0x67,0x08,0x06,0x02,0x00,0x00,0x38,0x4d,0x15,0x0f,0x02,0x0d,0x0d,0x39,0x4d,0x00,0x13,0x13,0x12,0x61,0x16,0x01,0x12,0x12,0x42,0x12,\r\n0x4e,0x59,0x40,0x36,0x25,0x24,0x04,0x04,0x00,0x00,0x2c,0x29,0x24,0x31,0x25,0x30,0x23,0x22,0x21,0x20,0x04,0x1f,0x04,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x17,0x09,0x17,0x2b,0x37,0x13,0x33,0x03,0x05,\r\n0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x01,0x22,0x26,0x37,0x36,0x36,0x33,0x33,0x32,0x16,0x07,0x06,0x06,0x23,0xc9,0x58,0x6a,0x70,0xfc,0xe0,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,\r\n0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0x02,0x23,0x1a,0x1b,0x05,0x05,0x28,0x1a,0x1e,0x1d,0x19,0x05,0x05,0x29,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xd7,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xfe,0x34,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,\r\n0x00,0x03,0xfd,0xcb,0xff,0xfb,0x02,0x08,0x02,0xe4,0x00,0x34,0x00,0x38,0x00,0x46,0x01,0x0e,0x4b,0xb0,0x18,0x50,0x58,0x40,0x3c,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,0x11,0x0f,0x0a,0x03,0x00,0x16,0x01,0x00,0x67,0x00,0x0c,0x0c,0x04,0x5f,0x08,\r\n0x06,0x02,0x04,0x04,0x38,0x4d,0x00,0x16,0x16,0x10,0x5f,0x18,0x15,0x17,0x12,0x04,0x10,0x10,0x39,0x10,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x40,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,0x11,0x0f,0x0a,0x03,0x00,0x16,0x01,0x00,0x67,0x06,0x01,\r\n0x04,0x04,0x38,0x4d,0x00,0x0c,0x0c,0x08,0x61,0x00,0x08,0x08,0x3e,0x4d,0x00,0x16,0x16,0x10,0x5f,0x18,0x15,0x17,0x12,0x04,0x10,0x10,0x39,0x10,0x4e,0x1b,0x40,0x4b,0x00,0x0a,0x00,0x16,0x00,0x0a,0x16,0x80,0x07,0x05,0x02,0x03,0x14,0x0d,0x02,0x02,0x0b,0x03,0x02,0x68,0x00,0x0b,0x00,0x09,0x01,0x0b,0x09,0x69,0x13,0x0e,0x02,0x01,\r\n0x11,0x0f,0x02,0x00,0x0a,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x00,0x0c,0x0c,0x08,0x61,0x00,0x08,0x08,0x3e,0x4d,0x17,0x12,0x02,0x10,0x10,0x39,0x4d,0x00,0x16,0x16,0x15,0x61,0x18,0x01,0x15,0x15,0x42,0x15,0x4e,0x59,0x59,0x40,0x30,0x3a,0x39,0x00,0x00,0x41,0x3e,0x39,0x46,0x3a,0x45,0x38,0x37,0x36,0x35,0x00,0x34,0x00,\r\n0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x27,0x25,0x21,0x1f,0x1e,0x1d,0x1c,0x1b,0x24,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x21,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xa2,0x3d,0x6c,0x47,0x49,0x6c,0x3b,0x67,0x56,0x5a,\r\n0x32,0x41,0x48,0x50,0x44,0x45,0x51,0xfe,0xf9,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0x02,0x7e,0x1d,0x24,0x24,0x1d,0x14,0x1d,0x24,0x24,0x1d,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x01,0x41,0x63,0x37,0x36,0x63,0x43,0x5b,0x76,0x06,0x64,0xaf,0x4a,0x42,0x41,0x4b,0x4b,0x41,0x41,0xb4,0x41,0xd2,0xd2,0xd2,\r\n0x01,0x13,0xb4,0xfe,0x34,0x1f,0x1c,0x1b,0x22,0x22,0x1b,0x1b,0x20,0x00,0x00,0x00,0x00,0x04,0xfd,0xe9,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x6b,0x40,0x68,0x0b,0x09,0x07,0x05,0x04,0x03,0x1b,0x19,0x17,0x0c,0x04,0x02,0x01,0x03,0x02,0x68,0x1a,0x18,0x16,0x0d,0x04,0x01,0x14,0x12,0x10,0x0e,\r\n0x04,0x00,0x0f,0x01,0x00,0x67,0x0a,0x08,0x06,0x03,0x04,0x04,0x38,0x4d,0x1c,0x15,0x13,0x11,0x04,0x0f,0x0f,0x39,0x0f,0x4e,0x00,0x00,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x00,0x2b,0x00,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,\r\n0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x1d,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x17,\r\n0x33,0x37,0x23,0x05,0x33,0x37,0x23,0xfe,0x19,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xf0,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xf0,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0xf0,0x22,0xf0,0x01,0x14,0xa0,0x22,0xa0,0xd2,0x41,0xb4,\r\n0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x00,0x06,0xfb,0x91,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x8f,0x40,0x8c,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x06,0x03,0x27,0x25,\r\n0x23,0x21,0x1f,0x10,0x06,0x02,0x01,0x03,0x02,0x68,0x26,0x24,0x22,0x20,0x1e,0x11,0x06,0x01,0x1c,0x1a,0x18,0x16,0x14,0x12,0x06,0x00,0x13,0x01,0x00,0x67,0x0e,0x0c,0x0a,0x08,0x06,0x05,0x04,0x04,0x38,0x4d,0x28,0x1d,0x1b,0x19,0x17,0x15,0x06,0x13,0x13,0x39,0x13,0x4e,0x00,0x00,0x4f,0x4e,0x4d,0x4c,0x4b,0x4a,0x49,0x48,0x47,0x46,\r\n0x45,0x44,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x00,0x3b,0x00,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x29,\r\n0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x13,\r\n0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0xfb,0xc1,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x0e,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x0e,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,\r\n0xfe,0xf2,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xf2,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x0e,0x22,0xfe,0xf2,0x01,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x0e,0x22,0xfe,0xf2,0x01,0x32,0xa0,0x22,0xa0,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,\r\n0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x00,0x08,0xf9,0x39,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0xb3,0x40,0xb0,0x13,0x11,0x0f,0x0d,0x0b,0x09,0x07,0x05,0x08,0x03,0x33,0x31,0x2f,0x2d,\r\n0x2b,0x29,0x27,0x14,0x08,0x02,0x01,0x03,0x02,0x68,0x32,0x30,0x2e,0x2c,0x2a,0x28,0x26,0x15,0x08,0x01,0x24,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16,0x08,0x00,0x17,0x01,0x00,0x67,0x12,0x10,0x0e,0x0c,0x0a,0x08,0x06,0x07,0x04,0x04,0x38,0x4d,0x34,0x25,0x23,0x21,0x1f,0x1d,0x1b,0x19,0x08,0x17,0x17,0x39,0x17,0x4e,0x00,0x00,0x67,0x66,\r\n0x65,0x64,0x63,0x62,0x61,0x60,0x5f,0x5e,0x5d,0x5c,0x5b,0x5a,0x59,0x58,0x57,0x56,0x55,0x54,0x53,0x52,0x51,0x50,0x4f,0x4e,0x4d,0x4c,0x00,0x4b,0x00,0x4b,0x4a,0x49,0x48,0x47,0x46,0x45,0x44,0x43,0x42,0x41,0x40,0x3f,0x3e,0x3d,0x3c,0x3b,0x3a,0x39,0x38,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,\r\n0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x35,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,\r\n0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x23,0x37,0x21,0x07,0x23,0x37,0x23,0x07,0x13,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,\r\n0x33,0x37,0x23,0x17,0x21,0x37,0x21,0x05,0x33,0x37,0x23,0xf9,0x69,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x01,0x18,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,\r\n0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0xfe,0xe8,0x27,0x46,0x27,0xa0,0x27,0x32,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xc4,0x01,0x18,0x22,0xfe,0xe8,0x01,0x3c,0xa0,0x22,0xa0,0xd2,\r\n0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0xd2,0x01,0x13,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0xb4,0x00,0x04,0xfd,0xcb,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x1b,\r\n0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0xdf,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2c,0x0e,0x07,0x05,0x03,0x03,0x11,0x15,0x0f,0x08,0x04,0x02,0x01,0x03,0x02,0x68,0x12,0x10,0x09,0x03,0x01,0x16,0x13,0x0c,0x0a,0x04,0x00,0x0b,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x4b,0xb0,0x2e,0x50,\r\n0x58,0x40,0x36,0x00,0x0e,0x03,0x02,0x0e,0x57,0x07,0x05,0x02,0x03,0x11,0x15,0x0f,0x08,0x04,0x02,0x01,0x03,0x02,0x68,0x0c,0x0a,0x02,0x00,0x13,0x01,0x00,0x57,0x12,0x10,0x09,0x03,0x01,0x16,0x01,0x13,0x0b,0x01,0x13,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x1b,0x40,0x38,0x07,0x05,0x02,0x03,\r\n0x11,0x08,0x02,0x02,0x0f,0x03,0x02,0x68,0x00,0x0e,0x15,0x01,0x0f,0x12,0x0e,0x0f,0x67,0x10,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x13,0x01,0x00,0x67,0x00,0x12,0x16,0x01,0x13,0x0b,0x12,0x13,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x14,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x59,0x59,0x40,0x2e,0x24,0x24,0x1c,0x1c,0x00,0x00,0x24,0x27,\r\n0x24,0x27,0x26,0x25,0x23,0x22,0x21,0x20,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x17,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,\r\n0x37,0x23,0x07,0x01,0x35,0x21,0x15,0x05,0x33,0x37,0x23,0x05,0x35,0x21,0x15,0xfd,0xfb,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x02,0x0f,0x01,0xb8,0xfc,0x6b,0xa0,0x22,0xa0,0x01,0xbb,0x01,0xb8,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,\r\n0xd2,0xd2,0xd2,0x01,0xc2,0x50,0x50,0xaf,0xb4,0xff,0x50,0x50,0x00,0x02,0xfd,0xcb,0xff,0x9c,0x02,0x1c,0x02,0xda,0x00,0x1d,0x00,0x21,0x00,0x4f,0x40,0x4c,0x09,0x07,0x02,0x05,0x10,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x0f,0x0b,0x02,0x03,0x0c,0x02,0x02,0x00,0x01,0x03,0x00,0x67,0x00,0x0d,0x11,0x01,0x0e,0x0d,0x0e,0x63,0x08,0x01,\r\n0x06,0x06,0x38,0x4d,0x00,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x21,0x20,0x1f,0x1e,0x00,0x1d,0x00,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x09,0x1f,0x2b,0x05,0x13,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,\r\n0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x21,0x15,0x01,0x33,0x37,0x23,0xfe,0xce,0x3a,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x2c,0x02,0xfa,0xfc,0x57,0xa0,0x22,0xa0,0x64,0x01,0x36,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xeb,0x4b,0x01,0x77,\r\n0xb4,0x00,0x00,0x00,0x00,0x02,0xfb,0x73,0xff,0x9c,0x01,0xdb,0x03,0x43,0x00,0x2f,0x00,0x33,0x00,0x59,0x40,0x56,0x2e,0x01,0x0d,0x01,0x4b,0x25,0x24,0x02,0x06,0x4a,0x09,0x07,0x02,0x05,0x10,0x0a,0x02,0x04,0x03,0x05,0x04,0x68,0x0f,0x0b,0x02,0x03,0x0c,0x02,0x02,0x00,0x01,0x03,0x00,0x67,0x00,0x0d,0x11,0x01,0x0e,0x0d,0x0e,0x63,\r\n0x08,0x01,0x06,0x06,0x38,0x4d,0x00,0x01,0x01,0x39,0x01,0x4e,0x00,0x00,0x33,0x32,0x31,0x30,0x00,0x2f,0x00,0x2f,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x09,0x1f,0x2b,0x05,0x13,0x23,0x07,0x23,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,\r\n0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x21,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x37,0x15,0x0e,0x02,0x15,0x15,0x14,0x16,0x16,0x17,0x15,0x01,0x33,0x37,0x23,0xfc,0x76,0x3a,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x2c,0x04,0x73,0x42,0x4c,0x49,0x87,0x5c,\r\n0x40,0x5e,0x34,0x32,0x5d,0x3f,0xfa,0x44,0xa0,0x22,0xa0,0x64,0x01,0x36,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xeb,0x2a,0x9f,0x63,0xaa,0x62,0x9f,0x6e,0x17,0x55,0x0f,0x55,0x7e,0x4f,0xaa,0x4c,0x7c,0x54,0x10,0x4b,0x01,0x77,0xb4,0x00,0x00,0x00,0xff,0xff,0xfd,0xf3,0xff,0x92,0x02,0x34,0x03,0x3e,0x00,0x27,\r\n0x03,0x3d,0xfd,0xa8,0x00,0x00,0x03,0x07,0x03,0x34,0x00,0x00,0x00,0x82,0x00,0x08,0xb1,0x01,0x01,0xb0,0x82,0xb0,0x35,0x2b,0xff,0xff,0xfb,0x9b,0xff,0x92,0x02,0x34,0x03,0x3e,0x00,0x27,0x03,0x3d,0xfb,0x50,0x00,0x00,0x00,0x27,0x03,0x34,0xfd,0xa8,0x00,0x82,0x03,0x07,0x03,0x34,0x00,0x00,0x00,0x82,0x00,0x10,0xb1,0x01,0x01,0xb0,\r\n0x82,0xb0,0x35,0x2b,0xb1,0x02,0x01,0xb0,0x82,0xb0,0x35,0x2b,0x00,0x01,0xfe,0x11,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,\r\n0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x03,0xfe,0x11,0x01,0x63,0x5f,0x80,0x02,0x97,0xfd,0x4a,0x3c,0x02,0xf2,0xfc,0xf0,0x6a,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x00,0x01,0xfb,0xa0,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x0b,\r\n0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,\r\n0x21,0x03,0xfb,0xa0,0x01,0x63,0x5f,0x80,0x05,0x08,0xfa,0xd9,0x3c,0x05,0x63,0xfa,0x7f,0x6a,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x00,0x01,0xfe,0x16,0xff,0x92,0x01,0xd6,0x03,0x3e,0x00,0x10,0x00,0x23,0x40,0x20,0x0f,0x0b,0x07,0x06,0x05,0x04,0x03,0x07,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x10,0x00,0x10,0x11,0x03,0x09,0x17,0x2b,0x05,0x01,0x33,0x07,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x01,0xfe,0x16,0x01,0x63,0x5f,0x41,0x02,0x3f,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x21,0x12,0xfe,0x1d,0xfe,0xfa,0x6e,0x03,0xac,0xad,0xfe,0xeb,0x64,0xd7,0x5a,0x97,0x09,0x0b,\r\n0x02,0x02,0x0b,0x09,0xe9,0xfd,0x4b,0x00,0xff,0xff,0xfe,0x3e,0xff,0x92,0x01,0xc2,0x03,0x3e,0x00,0x26,0x03,0x3d,0xb5,0x00,0x00,0x07,0x03,0x3d,0xfd,0xf3,0x00,0x00,0x00,0x02,0xfb,0xfa,0xff,0x92,0x01,0xd6,0x03,0x3e,0x00,0x0b,0x00,0x0f,0x00,0x3f,0x40,0x3c,0x06,0x01,0x00,0x01,0x00,0x85,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x86,\r\n0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x05,0x01,0x33,0x03,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x03,0x21,0x01,0x33,0x01,0xfd,\r\n0xbd,0x01,0x63,0x5f,0x80,0x02,0xd7,0xfd,0x0a,0x3c,0x03,0x32,0xfc,0xb0,0x6a,0xfd,0xde,0x01,0x63,0x5f,0xfe,0x9d,0x6e,0x03,0xac,0xfe,0xac,0x50,0xa0,0x50,0xfe,0xe8,0x03,0xac,0xfc,0x54,0xff,0xff,0xfc,0x13,0xff,0x92,0x01,0x95,0x03,0x3e,0x00,0x27,0x03,0x3d,0xfb,0xc8,0x00,0x00,0x00,0x27,0x03,0x3d,0xfd,0xa8,0x00,0x00,0x00,0x06,\r\n0x03,0x3d,0x88,0x00,0x00,0x01,0xfe,0x66,0xff,0x92,0x01,0x9a,0x03,0x3e,0x00,0x08,0x00,0x1f,0x40,0x1c,0x06,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x08,0x00,0x08,0x11,0x11,0x04,0x09,0x18,0x2b,0x05,0x01,0x33,0x01,0x23,0x01,0x27,0x07,0x01,0xfe,0x66,0x01,0x63,0x6e,0x01,\r\n0x63,0x5f,0xfe,0xdc,0x17,0x16,0xfe,0xdc,0x6e,0x03,0xac,0xfc,0x54,0x03,0x0a,0x44,0x44,0xfc,0xf6,0x00,0x00,0x01,0xfe,0x66,0xff,0x92,0x01,0x9a,0x03,0x3e,0x00,0x08,0x00,0x1f,0x40,0x1c,0x04,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x08,0x00,0x08,0x14,0x11,0x04,0x09,0x18,\r\n0x2b,0x07,0x01,0x33,0x01,0x17,0x37,0x01,0x33,0x01,0x37,0xfe,0x9d,0x5f,0x01,0x24,0x17,0x16,0x01,0x24,0x60,0xfe,0x9d,0x6e,0x03,0xac,0xfc,0xf6,0x44,0x44,0x03,0x0a,0xfc,0x54,0x00,0x00,0x00,0x01,0xfc,0x22,0xff,0x9c,0x01,0x86,0x02,0xee,0x00,0x07,0x00,0x41,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x02,0x01,0x00,0x04,0x01,0x03,0x00,\r\n0x03,0x63,0x00,0x01,0x01,0x38,0x01,0x4e,0x1b,0x40,0x18,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x05,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0xfc,0x22,0x02,0x85,0x5a,\r\n0x02,0x85,0x64,0x4b,0x03,0x07,0xfc,0xf9,0x4b,0x00,0x00,0x00,0x00,0x01,0xfd,0xe4,0xff,0x9c,0x02,0x1c,0xff,0xe7,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x35,0x21,0x15,0xfd,0xe4,0x04,0x38,\r\n0x64,0x4b,0x4b,0x00,0x00,0x04,0xfe,0x5c,0xff,0xfb,0x01,0x90,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x19,0x00,0x4e,0x40,0x4b,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x07,0x04,0x05,0x67,0x08,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x07,0x07,0x06,0x61,0x0b,0x01,0x06,0x06,\r\n0x42,0x06,0x4e,0x0d,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x14,0x11,0x0c,0x19,0x0d,0x18,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,\r\n0xfe,0x7e,0x0c,0x6a,0x0c,0xcc,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfd,0x08,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0xf0,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x06,0xfc,0x0e,0xff,0xfb,0x01,0x90,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,\r\n0x00,0x21,0x00,0x64,0x40,0x61,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x06,0x02,0x03,0x67,0x08,0x01,0x06,0x10,0x09,0x0f,0x03,0x07,0x0b,0x06,0x07,0x67,0x0c,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x0b,0x0b,0x0a,0x61,0x11,0x01,0x0a,0x0a,0x42,0x0a,0x4e,0x15,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,\r\n0x00,0x1c,0x19,0x14,0x21,0x15,0x20,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x22,0x26,0x35,\r\n0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfc,0x30,0x0c,0x6a,0x0c,0xcc,0x01,0xe5,0x78,0x01,0xe5,0xfb,0xbe,0x01,0xe5,0x78,0x01,0xe5,0xfa,0xba,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,\r\n0x00,0x01,0x00,0x7d,0xff,0x8d,0x01,0xe5,0x03,0x2f,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x02,0x01,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x13,0x03,0x06,0x17,0x2b,0x05,0x03,0x35,0x13,0x33,0x01,0x01,0x01,0x79,0xfc,0xfc,0x66,0xfe,0xe8,0x01,0x1e,0x73,0x01,0x95,\r\n0x7a,0x01,0x93,0xfe,0x2d,0xfe,0x31,0x00,0x00,0x02,0x00,0x64,0xff,0x92,0x02,0x2a,0x03,0x3e,0x00,0x06,0x00,0x0d,0x00,0x2d,0x40,0x2a,0x0c,0x09,0x08,0x05,0x02,0x01,0x06,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x07,0x07,0x00,0x00,0x07,0x0d,0x07,0x0d,0x0b,0x0a,0x00,0x06,0x00,0x06,\r\n0x13,0x06,0x06,0x17,0x2b,0x05,0x01,0x35,0x01,0x33,0x01,0x01,0x33,0x01,0x35,0x01,0x33,0x01,0x01,0x01,0x75,0xfe,0xef,0x01,0x11,0x37,0xfe,0xe2,0x01,0x1e,0x47,0xfe,0xef,0x01,0x11,0x37,0xfe,0xe2,0x01,0x1e,0x6e,0x01,0xbc,0x33,0x01,0xbd,0xfe,0x2a,0xfe,0x2a,0x01,0xbc,0x33,0x01,0xbd,0xfe,0x2a,0xfe,0x2a,0x00,0x00,0x02,0x00,0xa0,\r\n0xff,0x92,0x01,0xef,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x00,0x01,0x06,0x05,0x02,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x00,0x00,0x03,0x57,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x08,0x08,0x08,0x0b,0x08,0x0b,0x12,0x11,0x11,0x11,0x10,0x07,0x06,0x1b,0x2b,0x05,0x21,0x11,0x21,0x15,0x23,0x11,\r\n0x33,0x01,0x11,0x33,0x11,0x01,0xef,0xfe,0xb1,0x01,0x4f,0xaf,0xaf,0xfe,0xe3,0x3c,0x6e,0x03,0xac,0x2d,0xfc,0xae,0x03,0x52,0xfc,0xae,0x03,0x52,0x00,0x01,0x00,0x73,0xff,0x8d,0x01,0xdb,0x03,0x2f,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x04,0x01,0x03,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,\r\n0x00,0x06,0x00,0x06,0x12,0x03,0x06,0x17,0x2b,0x17,0x01,0x01,0x33,0x13,0x15,0x03,0x73,0x01,0x1e,0xfe,0xe8,0x66,0xfc,0xfc,0x73,0x01,0xcf,0x01,0xd3,0xfe,0x6d,0x7a,0xfe,0x6b,0x00,0x00,0x00,0x02,0x00,0x2e,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x06,0x00,0x0d,0x00,0x20,0x40,0x1d,0x0d,0x0c,0x09,0x06,0x05,0x02,0x06,0x00,0x01,0x01,\r\n0x4c,0x03,0x01,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x12,0x13,0x12,0x10,0x04,0x06,0x1a,0x2b,0x17,0x23,0x01,0x01,0x33,0x01,0x15,0x01,0x23,0x01,0x01,0x33,0x01,0x15,0xe3,0x37,0x01,0x1e,0xfe,0xe2,0x37,0x01,0x11,0xfe,0x71,0x37,0x01,0x1e,0xfe,0xe2,0x37,0x01,0x11,0x6e,0x01,0xd6,0x01,0xd6,0xfe,0x43,0x33,0xfe,0x44,0x01,\r\n0xd6,0x01,0xd6,0xfe,0x43,0x33,0x00,0x00,0x00,0x02,0x00,0x69,0xff,0x92,0x01,0xb8,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x04,0x01,0x01,0x00,0x02,0x01,0x67,0x05,0x01,0x00,0x03,0x03,0x00,0x57,0x05,0x01,0x00,0x00,0x03,0x5f,0x06,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x0b,0x0a,0x09,0x08,0x00,0x07,0x00,0x07,\r\n0x11,0x11,0x11,0x07,0x06,0x19,0x2b,0x17,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x03,0x23,0x11,0x33,0x69,0xaf,0xaf,0x01,0x4f,0x32,0x3c,0x3c,0x6e,0x2d,0x03,0x52,0x2d,0xfc,0x54,0x03,0x7f,0xfc,0xae,0x00,0x00,0xff,0xff,0x00,0xda,0x01,0x09,0x01,0x7e,0x01,0xab,0x03,0x07,0x03,0x29,0x00,0x00,0x01,0x13,0x00,0x09,0xb1,0x00,0x01,0xb8,\r\n0x01,0x13,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0xcd,0xff,0x60,0x01,0x81,0x02,0x30,0x02,0x06,0x03,0x2c,0x00,0x00,0x00,0x03,0x00,0x5d,0xff,0x74,0x02,0x12,0x03,0x67,0x00,0x1c,0x00,0x25,0x00,0x2e,0x00,0x55,0x40,0x52,0x0b,0x01,0x09,0x01,0x11,0x01,0x0b,0x08,0x17,0x01,0x00,0x0a,0x03,0x4c,0x04,0x01,0x02,0x01,0x02,0x85,\r\n0x0c,0x07,0x02,0x05,0x00,0x05,0x86,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x09,0x09,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,0x00,0x0a,0x0a,0x00,0x5f,0x06,0x01,0x00,0x00,0x39,0x00,0x4e,0x00,0x00,0x2e,0x2c,0x28,0x26,0x25,0x23,0x1f,0x1d,0x00,0x1c,0x00,0x1c,0x11,0x1e,0x11,0x11,0x11,0x11,0x11,0x0d,0x09,0x1d,0x2b,0x17,\r\n0x35,0x23,0x11,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x16,0x16,0x15,0x14,0x06,0x07,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x23,0x15,0x03,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xb3,0x56,0x56,0x3c,0x46,0x3c,0x44,0x4c,0x3a,0x34,0x3b,0x44,0x55,0x4c,0x3c,0x46,0x3a,0x76,\r\n0x3a,0x43,0x42,0x3a,0x77,0x7c,0x3f,0x49,0x49,0x3f,0x7c,0x8c,0x8c,0x02,0xda,0x8d,0x8d,0x8d,0x94,0x10,0x5e,0x48,0x3b,0x52,0x0e,0x10,0x60,0x47,0x50,0x68,0x0e,0x91,0x8c,0x8c,0x02,0x2f,0x3e,0x35,0x35,0x3e,0xfd,0xc8,0x43,0x3a,0x3c,0x4b,0x00,0x00,0x00,0x02,0x00,0x58,0xff,0x74,0x02,0x0b,0x02,0xb2,0x00,0x1b,0x00,0x23,0x00,0x3f,\r\n0x40,0x3c,0x20,0x12,0x0b,0x08,0x04,0x01,0x00,0x1f,0x1a,0x13,0x01,0x04,0x03,0x02,0x02,0x4c,0x00,0x01,0x00,0x02,0x00,0x01,0x02,0x80,0x00,0x02,0x03,0x00,0x02,0x03,0x7e,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1b,0x17,0x14,0x19,0x05,0x09,0x19,0x2b,0x05,\r\n0x35,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x26,0x26,0x27,0x11,0x36,0x36,0x37,0x33,0x06,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x11,0x06,0x06,0x15,0x01,0x11,0x55,0x64,0x64,0x55,0x3c,0x55,0x66,0x03,0x5a,0x03,0x34,0x2d,0x2d,0x34,0x03,0x5a,0x03,0x66,0x55,0x9b,0x33,0x2c,0x2c,0x33,0x8c,0x84,0x0a,\r\n0x6d,0x59,0x96,0x59,0x6d,0x0a,0x84,0x83,0x07,0x64,0x52,0x2e,0x38,0x06,0xfe,0x6a,0x06,0x38,0x2e,0x52,0x64,0x07,0x83,0x01,0x54,0x34,0x41,0x0a,0x01,0x94,0x0a,0x40,0x34,0x00,0x00,0x00,0x00,0x02,0x00,0x2b,0x00,0x71,0x02,0x2e,0x02,0x7b,0x00,0x1c,0x00,0x2a,0x00,0x6a,0x40,0x20,0x15,0x13,0x0f,0x0d,0x04,0x03,0x01,0x1b,0x16,0x0c,\r\n0x08,0x04,0x02,0x03,0x1c,0x07,0x05,0x01,0x04,0x00,0x02,0x03,0x4c,0x14,0x0e,0x02,0x01,0x4a,0x06,0x01,0x00,0x49,0x4b,0xb0,0x21,0x50,0x58,0x40,0x13,0x04,0x01,0x02,0x00,0x00,0x02,0x00,0x65,0x00,0x03,0x03,0x01,0x61,0x00,0x01,0x01,0x41,0x03,0x4e,0x1b,0x40,0x1a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x04,0x01,0x02,0x00,0x00,\r\n0x02,0x59,0x04,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x02,0x00,0x51,0x59,0x40,0x0d,0x1e,0x1d,0x24,0x22,0x1d,0x2a,0x1e,0x2a,0x2c,0x22,0x05,0x09,0x18,0x2b,0x25,0x27,0x06,0x23,0x22,0x27,0x07,0x27,0x37,0x26,0x35,0x34,0x37,0x27,0x37,0x17,0x36,0x33,0x32,0x17,0x37,0x17,0x07,0x16,0x15,0x14,0x06,0x07,0x17,0x25,0x32,0x36,0x35,0x34,\r\n0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0xef,0x57,0x2e,0x3d,0x3e,0x2f,0x55,0x3e,0x53,0x21,0x22,0x56,0x3f,0x58,0x30,0x3b,0x3f,0x30,0x54,0x3d,0x53,0x1f,0x11,0x0f,0x55,0xfe,0xff,0x38,0x4a,0x4a,0x38,0x25,0x3c,0x23,0x23,0x3c,0x71,0x57,0x1d,0x1d,0x55,0x3e,0x54,0x31,0x3f,0x40,0x31,0x56,0x3f,0x58,0x1c,0x1f,0x54,0x3d,\r\n0x53,0x32,0x3d,0x1f,0x39,0x18,0x55,0x40,0x4c,0x39,0x39,0x4c,0x23,0x3c,0x26,0x26,0x3c,0x23,0x00,0x00,0x00,0x03,0x00,0x48,0xff,0x74,0x02,0x10,0x03,0x66,0x00,0x23,0x00,0x2a,0x00,0x32,0x00,0x3a,0x40,0x37,0x28,0x1a,0x13,0x10,0x04,0x02,0x01,0x32,0x27,0x1b,0x09,0x04,0x00,0x02,0x2b,0x22,0x08,0x01,0x04,0x03,0x00,0x03,0x4c,0x00,\r\n0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x02,0x85,0x00,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x23,0x00,0x23,0x14,0x1c,0x14,0x05,0x09,0x19,0x2b,0x05,0x35,0x26,0x26,0x27,0x33,0x14,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x34,0x26,0x27,0x15,0x17,0x16,0x16,0x15,\r\n0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x01,0x13,0x5e,0x6b,0x02,0x5a,0x3b,0x36,0x1b,0x4b,0x51,0x63,0x54,0x3c,0x53,0x64,0x01,0x5a,0x31,0x2d,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x2f,0x2c,0x0c,0x8c,0x83,0x08,0x69,0x56,0x31,0x3e,0x07,0x01,\r\n0x06,0x08,0x17,0x6c,0x49,0x50,0x68,0x08,0x84,0x83,0x08,0x68,0x52,0x2f,0x3b,0x07,0xf8,0x0d,0x17,0x6e,0x4a,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x41,0x0e,0x04,0x00,0x00,0x00,0x03,0x00,0x5a,0xff,0xb0,0x02,0x58,0x02,0xda,0x00,0x1c,0x00,0x2a,0x00,0x2e,0x00,0x9a,0xb6,0x19,\r\n0x0a,0x02,0x08,0x09,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2e,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x0d,0x01,0x08,0x00,0x00,0x08,0x59,0x00,0x0a,0x0e,0x01,0x0b,0x0a,0x0b,0x63,0x07,0x0c,0x02,0x00,0x00,0x04,0x5f,0x00,0x04,0x04,0x38,0x04,0x4e,0x1b,0x40,0x2f,0x05,0x01,\r\n0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x09,0x08,0x01,0x09,0x69,0x0d,0x01,0x08,0x0c,0x01,0x00,0x0a,0x08,0x00,0x69,0x00,0x0a,0x0e,0x01,0x0b,0x0a,0x0b,0x63,0x00,0x07,0x07,0x04,0x5f,0x00,0x04,0x04,0x38,0x07,0x4e,0x59,0x40,0x27,0x2b,0x2b,0x1e,0x1d,0x01,0x00,0x2b,0x2e,0x2b,0x2e,0x2d,0x2c,0x25,0x23,0x1d,0x2a,\r\n0x1e,0x2a,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x08,0x06,0x00,0x1c,0x01,0x1c,0x0f,0x09,0x16,0x2b,0x25,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x27,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x23,0x35,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,\r\n0x15,0x14,0x16,0x07,0x35,0x21,0x15,0x01,0x0c,0x52,0x60,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x74,0x74,0x5a,0x5e,0x5e,0x5a,0x01,0x07,0x4e,0x20,0x38,0x3e,0x3e,0x38,0x39,0x3d,0x3d,0x97,0x01,0xa4,0x32,0x6e,0x5e,0x29,0x5f,0x6e,0x3e,0x35,0x7d,0x3c,0x4b,0x55,0x55,0x4b,0xfe,0x02,0x69,0x36,0x3d,0x4e,0x46,0x3e,0x1e,0x3e,0x46,0x44,\r\n0x40,0x1e,0x40,0x44,0xd0,0x50,0x50,0x00,0x00,0x01,0x00,0x13,0xff,0xf6,0x02,0x0a,0x02,0xe4,0x00,0x2b,0x00,0x60,0x40,0x5d,0x00,0x06,0x07,0x04,0x07,0x06,0x04,0x80,0x00,0x0d,0x01,0x0c,0x01,0x0d,0x0c,0x80,0x08,0x01,0x04,0x09,0x01,0x03,0x02,0x04,0x03,0x67,0x0a,0x01,0x02,0x0b,0x01,0x01,0x0d,0x02,0x01,0x67,0x00,0x07,0x07,0x05,\r\n0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x0c,0x0c,0x00,0x61,0x0e,0x01,0x00,0x00,0x3f,0x00,0x4e,0x01,0x00,0x29,0x28,0x26,0x24,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x17,0x15,0x13,0x12,0x10,0x0e,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x2b,0x01,0x2b,0x0f,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x23,0x35,0x33,0x35,0x23,\r\n0x35,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x34,0x64,0x74,0x49,0x49,0x49,0x49,0x74,0x64,0x62,0x74,0x5a,0x41,0x3b,0x3b,0x43,0xad,0xad,0xad,0xad,0x43,0x3b,0x3b,0x41,0x5a,0x74,0x0a,0x70,0x62,\r\n0x2d,0x41,0x64,0x41,0x37,0x62,0x70,0x71,0x61,0x3e,0x43,0x43,0x3e,0x37,0x41,0x64,0x41,0x2d,0x3e,0x43,0x43,0x3e,0x61,0x71,0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x1a,0x00,0x33,0x40,0x30,0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x03,0x38,0x4d,0x00,0x00,0x00,0x07,\r\n0x5f,0x08,0x01,0x07,0x07,0x3d,0x07,0x4e,0x00,0x00,0x00,0x1a,0x00,0x19,0x11,0x12,0x21,0x23,0x11,0x13,0x21,0x09,0x09,0x1d,0x2b,0x15,0x35,0x33,0x32,0x36,0x35,0x11,0x23,0x35,0x33,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x15,0x33,0x15,0x23,0x11,0x14,0x06,0x23,0x69,0x35,0x3e,0xa0,0xa0,0x51,0x49,0xa1,0xa1,0x40,0xe1,0xe1,\r\n0x70,0x5d,0xb4,0x52,0x3d,0x34,0x01,0x2a,0x52,0xc4,0x42,0x49,0x50,0x3c,0xc3,0x52,0xfe,0xd6,0x58,0x6b,0x00,0x02,0x00,0x32,0xff,0xf6,0x02,0x26,0x02,0xe4,0x00,0x19,0x00,0x31,0x00,0x5a,0x40,0x57,0x00,0x02,0x01,0x00,0x01,0x02,0x00,0x80,0x00,0x09,0x07,0x08,0x07,0x09,0x08,0x80,0x04,0x01,0x00,0x0c,0x01,0x05,0x06,0x00,0x05,0x67,\r\n0x00,0x06,0x0d,0x0b,0x02,0x07,0x09,0x06,0x07,0x67,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x03,0x3e,0x4d,0x00,0x08,0x08,0x0a,0x61,0x00,0x0a,0x0a,0x3f,0x0a,0x4e,0x1a,0x1a,0x00,0x00,0x1a,0x31,0x1a,0x31,0x2d,0x2b,0x29,0x28,0x26,0x24,0x1e,0x1d,0x1c,0x1b,0x00,0x19,0x00,0x19,0x16,0x22,0x12,0x26,0x11,0x0e,0x09,0x1b,0x2b,0x13,0x35,\r\n0x21,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x05,0x35,0x21,0x15,0x21,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x37,0x32,0x01,0x17,0x25,0x15,0x1c,0x38,0x31,0x38,0x41,0x59,0x02,0x6e,0x61,0x59,0x69,\r\n0x25,0x1e,0x09,0x7b,0xfe,0x0c,0x01,0xf4,0xfe,0xd2,0x10,0x16,0x1b,0x3b,0x31,0x38,0x44,0x59,0x01,0x72,0x61,0x59,0x6c,0x33,0x01,0x8e,0x46,0x20,0x12,0x2b,0x18,0x26,0x27,0x35,0x31,0x55,0x5f,0x4e,0x48,0x22,0x35,0x1b,0x08,0x46,0x92,0x46,0x46,0x0c,0x10,0x2d,0x18,0x25,0x32,0x3f,0x31,0x55,0x69,0x58,0x48,0x3b,0x2b,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x18,0x00,0x21,0x00,0x3d,0x40,0x3a,0x09,0x01,0x03,0x05,0x01,0x02,0x01,0x03,0x02,0x67,0x06,0x01,0x01,0x07,0x01,0x00,0x08,0x01,0x00,0x67,0x00,0x0a,0x0a,0x04,0x5f,0x00,0x04,0x04,0x38,0x4d,0x0b,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x21,0x1f,0x1b,0x19,0x00,0x18,0x00,\r\n0x18,0x11,0x11,0x26,0x21,0x11,0x11,0x11,0x11,0x0c,0x09,0x1e,0x2b,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x15,0x33,0x15,0x23,0x15,0x11,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x6e,0x50,0x50,0x50,0x50,0xdf,0x42,0x61,0x36,0x36,0x61,0x42,0x85,0xe6,0xe6,0x85,0x39,\r\n0x43,0x43,0x39,0x85,0x9b,0x50,0x55,0x50,0x01,0x4a,0x33,0x5c,0x3e,0x3d,0x5d,0x33,0x55,0x50,0x9b,0x01,0x90,0x44,0x39,0x39,0x44,0x00,0x00,0x00,0x00,0x01,0x00,0x4b,0x00,0x00,0x02,0x17,0x02,0xe4,0x00,0x2a,0x00,0x42,0x40,0x3f,0x01,0x01,0x07,0x00,0x01,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x05,0x01,0x01,0x06,0x01,0x00,\r\n0x07,0x01,0x00,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x07,0x07,0x08,0x5f,0x09,0x01,0x08,0x08,0x39,0x08,0x4e,0x00,0x00,0x00,0x2a,0x00,0x2a,0x16,0x11,0x16,0x22,0x12,0x26,0x11,0x17,0x0a,0x09,0x1e,0x2b,0x33,0x35,0x3e,0x02,0x35,0x34,0x27,0x23,0x35,0x33,0x2e,0x02,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x23,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x16,0x17,0x33,0x15,0x23,0x16,0x15,0x14,0x06,0x06,0x07,0x21,0x15,0x4b,0x18,0x32,0x23,0x05,0x68,0x4b,0x0e,0x1e,0x14,0x74,0x62,0x63,0x73,0x01,0x5f,0x42,0x37,0x3a,0x40,0x18,0x22,0x0f,0xb9,0xa3,0x03,0x23,0x33,0x18,0x01,0x72,0x64,0x13,0x35,0x39,0x19,0x1b,0x18,0x50,0x1a,0x31,0x39,0x26,\r\n0x55,0x64,0x65,0x59,0x32,0x3c,0x39,0x35,0x23,0x33,0x30,0x1f,0x50,0x14,0x16,0x2b,0x49,0x35,0x0e,0x50,0x00,0x01,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0xda,0x00,0x17,0x00,0x36,0x40,0x33,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x10,0x03,0x00,0x01,0x4c,0x02,0x01,0x00,0x00,0x01,0x5f,0x00,\r\n0x01,0x01,0x38,0x4d,0x04,0x01,0x03,0x03,0x39,0x03,0x4e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x19,0x05,0x09,0x19,0x2b,0x21,0x35,0x07,0x35,0x37,0x35,0x07,0x35,0x37,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x37,0x15,0x07,0x15,0x37,0x15,0x07,0x15,0x01,0x00,0xb0,0xb0,0xb0,0xb0,0xd3,0x01,0xfe,0xd3,0xb0,0xb0,0xb0,0xb0,0xb7,0x30,\r\n0x4b,0x30,0x64,0x30,0x4b,0x30,0xda,0x4f,0x4f,0xc2,0x30,0x4b,0x30,0x64,0x30,0x4b,0x30,0xcf,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x00,0x02,0x35,0x02,0xda,0x00,0x1c,0x00,0x3e,0x40,0x3b,0x0c,0x01,0x02,0x03,0x01,0x4c,0x05,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x68,0x07,0x01,0x00,0x0b,0x0a,0x02,0x08,0x09,0x00,0x08,0x67,0x04,\r\n0x01,0x03,0x03,0x38,0x4d,0x00,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x1c,0x00,0x1c,0x1b,0x1a,0x11,0x11,0x11,0x11,0x18,0x11,0x11,0x11,0x11,0x0c,0x09,0x1f,0x2b,0x37,0x35,0x33,0x35,0x23,0x35,0x33,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x3c,0xc3,0xc3,\r\n0xa0,0xb9,0x60,0x8e,0x0c,0x0e,0x02,0x02,0x0f,0x0c,0x8e,0x5d,0xb9,0xa0,0xc3,0xc3,0xc3,0x5a,0x78,0x4b,0x4b,0x4b,0x01,0x81,0xfe,0xd4,0x19,0x23,0x08,0x08,0x23,0x19,0x01,0x2c,0xfe,0x7f,0x4b,0x4b,0x4b,0x78,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x58,0xff,0x4c,0x02,0x0b,0x02,0xda,0x00,0x21,0x00,0x42,0x40,0x3f,0x0b,0x08,0x02,0x02,\r\n0x00,0x20,0x01,0x02,0x05,0x03,0x02,0x4c,0x00,0x01,0x02,0x04,0x02,0x01,0x04,0x80,0x00,0x04,0x03,0x02,0x04,0x03,0x7e,0x00,0x02,0x02,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x03,0x03,0x05,0x5f,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x00,0x00,0x00,0x21,0x00,0x21,0x12,0x25,0x22,0x14,0x19,0x07,0x09,0x1b,0x2b,0x05,0x35,0x26,0x26,\r\n0x35,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x07,0x15,0x01,0x02,0x4e,0x5c,0x5c,0x4e,0x5a,0x4e,0x5e,0x03,0x5a,0x03,0x42,0x38,0x3b,0x47,0x47,0x3b,0x38,0x42,0x03,0x5a,0x03,0x5e,0x4e,0xb4,0xae,0x0d,0x6c,0x55,0x96,0x55,0x6c,0x0d,\r\n0xae,0xad,0x0a,0x63,0x4e,0x35,0x39,0x43,0x3e,0x97,0x3e,0x44,0x3a,0x34,0x4e,0x63,0x0a,0xad,0x00,0x00,0x00,0x01,0x00,0x48,0xff,0x4c,0x02,0x10,0x03,0x84,0x00,0x2d,0x00,0x3a,0x40,0x37,0x2d,0x02,0x02,0x02,0x00,0x19,0x16,0x02,0x03,0x05,0x02,0x4c,0x00,0x01,0x02,0x04,0x02,0x01,0x04,0x80,0x00,0x04,0x05,0x02,0x04,0x05,0x7e,0x00,\r\n0x00,0x00,0x02,0x01,0x00,0x02,0x69,0x00,0x05,0x05,0x03,0x5f,0x00,0x03,0x03,0x3d,0x03,0x4e,0x22,0x14,0x1d,0x22,0x14,0x10,0x06,0x09,0x1c,0x2b,0x01,0x33,0x15,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,\r\n0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x01,0x05,0x5a,0x47,0x56,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x49,0x51,0x5f,0x52,0x5a,0x57,0x66,0x5a,0x4e,0x40,0x3e,0x4a,0x2f,0x2c,0x6f,0x45,0x4f,0x5e,0x4d,0x03,0x84,0xa5,0x0f,0x65,0x48,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x6f,0x4c,0x54,0x6e,0x0c,0xae,0xad,\r\n0x0b,0x6c,0x58,0x3d,0x45,0x48,0x3a,0x2c,0x41,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0x00,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0xaa,0x02,0x12,0x02,0x39,0x00,0x1b,0x00,0x1f,0x00,0x86,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x08,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,\r\n0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x1b,0x40,0x32,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x08,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,\r\n0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x59,0x40,0x16,0x1c,0x1c,0x00,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x0a,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,\r\n0x15,0x15,0x07,0x35,0x21,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x01,0xcc,0x01,0x71,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0xc7,0x50,0x50,0x00,0x03,0x00,0x1d,0xff,0xf6,0x02,0x3b,0x02,0x30,0x00,0x0b,\r\n0x00,0x17,0x00,0x23,0x00,0x3b,0x40,0x38,0x03,0x01,0x01,0x07,0x02,0x06,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,\r\n0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x64,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0x6f,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xe9,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0xb0,\r\n0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0x46,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x02,0x00,0x9e,0xff,0xc9,0x01,0xc6,0x02,0x5d,0x00,0x21,0x00,0x2f,0x00,0x08,0xb5,0x2c,0x25,0x0d,0x00,0x02,0x32,0x2b,0x17,0x35,0x36,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x37,0x26,\r\n0x27,0x35,0x16,0x17,0x36,0x37,0x15,0x06,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x07,0x16,0x17,0x15,0x26,0x27,0x06,0x03,0x14,0x16,0x17,0x36,0x36,0x35,0x35,0x34,0x26,0x27,0x06,0x06,0x15,0xa8,0x34,0x29,0x38,0x2f,0x2f,0x38,0x29,0x34,0x50,0x3a,0x3a,0x50,0x34,0x29,0x38,0x2f,0x2f,0x38,0x29,0x34,0x50,0x3a,0x3a,0x28,0x2b,0x37,0x37,\r\n0x2b,0x2b,0x37,0x37,0x2b,0x37,0x2d,0x0b,0x12,0x2d,0x7e,0x4b,0x14,0x4b,0x7e,0x2d,0x12,0x0b,0x2d,0x0e,0x1f,0x1f,0x0e,0x2d,0x0b,0x12,0x2d,0x7e,0x4b,0x14,0x4b,0x7e,0x2d,0x12,0x0b,0x2d,0x0e,0x1f,0x1f,0x01,0x32,0x43,0x71,0x28,0x28,0x71,0x43,0x14,0x43,0x71,0x28,0x28,0x71,0x43,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x32,0x02,0x58,\r\n0x02,0x9b,0x00,0x05,0x00,0x08,0x00,0x0b,0x00,0x0a,0xb7,0x0b,0x09,0x07,0x06,0x01,0x00,0x03,0x32,0x2b,0x35,0x11,0x01,0x01,0x11,0x01,0x17,0x11,0x07,0x05,0x37,0x27,0x01,0x2c,0x01,0x2c,0xfe,0xd3,0xfb,0xd6,0xfe,0xe2,0xd5,0xd5,0x32,0x02,0x69,0xfe,0xef,0x01,0x11,0xfd,0x97,0x01,0x13,0xa0,0x01,0x86,0xc3,0xc5,0xc4,0xc2,0x00,0x00,\r\n0xff,0xff,0x00,0xda,0x00,0xf0,0x01,0x7e,0x01,0x92,0x03,0x07,0x03,0x29,0x00,0x00,0x00,0xfa,0x00,0x08,0xb1,0x00,0x01,0xb0,0xfa,0xb0,0x35,0x2b,0x00,0x04,0x00,0x00,0x00,0x64,0x02,0x58,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x52,0x40,0x4f,0x00,0x02,0x09,0x01,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x08,0x01,0x00,\r\n0x05,0x01,0x00,0x69,0x00,0x05,0x06,0x04,0x05,0x59,0x00,0x06,0x0b,0x01,0x07,0x04,0x06,0x07,0x67,0x00,0x05,0x05,0x04,0x61,0x0a,0x01,0x04,0x05,0x04,0x51,0x1c,0x1c,0x11,0x10,0x0c,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,\r\n0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x50,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x86,0x01,0x5e,0xfd,0xf8,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x86,0x01,0x5e,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,\r\n0x24,0x25,0x2b,0x0a,0x50,0x50,0xfe,0xca,0x2c,0x24,0x25,0x2b,0x2b,0x25,0x24,0x2c,0x46,0x50,0x50,0x00,0x00,0x01,0x00,0x9b,0xff,0xf6,0x01,0xc7,0x02,0x30,0x00,0x1f,0x00,0x6f,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x26,0x00,0x02,0x03,0x05,0x03,0x02,0x72,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,\r\n0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x1b,0x40,0x28,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x1c,\r\n0x1b,0x18,0x16,0x11,0x0f,0x0c,0x0b,0x08,0x06,0x00,0x1f,0x01,0x1f,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x23,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x31,0x44,0x52,0x52,0x44,0x44,0x52,0x5a,0x21,0x1b,0x1b,0x21,0x21,0x1b,\r\n0x1b,0x21,0x5a,0x52,0x0a,0x52,0x44,0x01,0x0e,0x44,0x52,0x52,0x44,0x28,0x32,0x1b,0x21,0x21,0x1b,0xfe,0xde,0x1b,0x21,0x21,0x1b,0x32,0x28,0x44,0x52,0x00,0x00,0x00,0x00,0x03,0x00,0x46,0x00,0x4c,0x02,0x12,0x02,0x9e,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0xa0,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x39,0x00,0x02,0x00,0x04,0x01,0x02,0x72,\r\n0x0a,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x0b,0x01,0x07,0x08,0x06,0x07,0x67,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0c,0x01,0x09,0x08,0x09,0x4f,0x1b,0x40,0x3b,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x0a,0x01,0x05,\r\n0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x0b,0x01,0x07,0x08,0x06,0x07,0x67,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0c,0x01,0x09,0x08,0x09,0x4f,0x59,0x40,0x1e,0x20,0x20,0x1c,0x1c,0x00,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x1c,\r\n0x1f,0x1c,0x1f,0x1e,0x1d,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x0d,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,\r\n0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x01,0xcc,0xfe,0x34,0x01,0xcc,0x01,0xd6,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0xb2,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x02,0xda,0x00,0x0b,0x00,0x2c,0x40,0x29,0x03,0x01,0x01,0x00,0x01,0x85,0x04,0x02,\r\n0x02,0x00,0x05,0x05,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x17,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x28,0x41,0x5a,0xd2,0x5a,0x41,0xb4,0x52,0x03,0x3c,0xfc,0xc4,0x03,0x3c,0xfc,0xc4,0x52,0x00,\r\n0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x1b,0x00,0x00,0x02,0x3c,0x02,0x2a,0x00,0x14,\r\n0x00,0x13,0x40,0x10,0x14,0x10,0x0c,0x0b,0x00,0x05,0x00,0x4a,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x01,0x0e,0x02,0x15,0x15,0x23,0x35,0x34,0x26,0x26,0x27,0x35,0x1e,0x02,0x17,0x3e,0x02,0x37,0x02,0x3c,0x44,0x66,0x37,0x64,0x36,0x63,0x43,0x4d,0x76,0x45,0x06,0x07,0x47,0x78,0x4d,0x01,0xd0,0x08,0x63,0xa2,0x69,0x5a,0x5a,\r\n0x69,0xa2,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x00,0x00,0x00,0x00,0x02,0x00,0x9f,0x00,0xbe,0x01,0xb9,0x01,0xd8,0x00,0x03,0x00,0x07,0x00,0x08,0xb5,0x06,0x04,0x02,0x00,0x02,0x32,0x2b,0x25,0x27,0x37,0x17,0x07,0x37,0x27,0x07,0x01,0x2c,0x8d,0x8d,0x8d,0x8d,0x54,0x54,0x54,0xbe,0x8d,0x8d,0x8d,0x54,0x54,0x54,\r\n0x54,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0x00,0x00,0x01,0x59,0x02,0xda,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x33,0x11,0x33,0x11,0xff,0x5a,0x02,0xda,0xfd,0x26,0x00,0xff,0xff,0x00,0x05,0x00,0x00,0x02,0x53,0x02,0xda,0x02,0x06,\r\n0x03,0x20,0x00,0x00,0x00,0x01,0x00,0x7d,0x00,0x00,0x01,0xdb,0x02,0xda,0x00,0x0b,0x00,0x2c,0x40,0x29,0x0a,0x07,0x04,0x01,0x04,0x03,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x01,0x85,0x04,0x01,0x03,0x02,0x03,0x85,0x00,0x02,0x02,0x76,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x12,0x12,0x05,0x06,0x19,0x2b,0x37,0x37,\r\n0x11,0x33,0x15,0x37,0x33,0x07,0x11,0x23,0x35,0x07,0x7d,0x82,0x5a,0x3c,0x46,0x82,0x5a,0x3c,0x8c,0xd1,0x01,0x7d,0xec,0x60,0xd1,0xfe,0x83,0xec,0x60,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0xaa,0x01,0xcc,0x01,0xea,0x00,0x0b,0x00,0x0f,0x00,0x30,0x40,0x2d,0x00,0x01,0x04,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x03,0x03,0x02,\r\n0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x0c,0x0c,0x01,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xc6,0x01,0x40,0x01,0x54,0x29,0x22,\r\n0x22,0x29,0x29,0x22,0x22,0x29,0xaa,0x50,0x50,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x46,0x02,0x35,0x02,0x8a,0x00,0x15,0x00,0x29,0x00,0x48,0x40,0x45,0x00,0x01,0x00,0x02,0x05,0x01,0x02,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x09,0x01,0x04,0x03,0x07,0x04,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,\r\n0x00,0x5f,0x08,0x01,0x00,0x03,0x00,0x4f,0x17,0x16,0x01,0x00,0x28,0x26,0x21,0x1f,0x1e,0x1c,0x16,0x29,0x17,0x29,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x0a,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x27,0x22,0x26,0x35,0x35,0x34,\r\n0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x18,0x4a,0x6f,0x3c,0x3c,0x6f,0x4a,0x01,0x1d,0xfe,0xe3,0x4b,0x5a,0x5a,0x4b,0x01,0x1d,0xf4,0x38,0x40,0x40,0x38,0xf4,0xea,0x17,0x1b,0x1b,0x17,0xea,0x46,0x3c,0x6c,0x48,0x64,0x49,0x6b,0x3c,0x46,0x5d,0x4d,0x64,0x4d,0x5d,0x46,0x9b,0x3d,0x36,0x28,0x36,\r\n0x3d,0x46,0x1b,0x17,0x1e,0x17,0x1b,0x46,0x00,0x03,0xff,0xf6,0x00,0x19,0x02,0x62,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,\r\n0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x3d,\r\n0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xd0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xcf,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x01,0x00,0x23,0x00,0x46,0x02,0x3a,0x02,0x8a,0x00,0x1b,\r\n0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x05,0x00,0x4f,0x01,0x00,0x1a,0x18,0x14,0x13,0x12,0x11,0x0d,0x0b,0x0a,0x08,0x00,0x1b,0x01,0x1b,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,\r\n0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x06,0x15,0x15,0x21,0x15,0x21,0x15,0x14,0x16,0x16,0x33,0x21,0x15,0x01,0x09,0x3e,0x69,0x3f,0x3f,0x69,0x3e,0x01,0x31,0xfe,0xcf,0x27,0x40,0x25,0x01,0xbd,0xfe,0x43,0x25,0x40,0x27,0x01,0x31,0x46,0x39,0x63,0x3e,0x90,0x3e,0x63,0x39,0x50,0x27,0x40,0x25,0x1e,0x50,0x1e,0x25,0x40,0x27,0x50,\r\n0x00,0x01,0x00,0xa5,0x00,0xb6,0x01,0xbd,0x01,0xe2,0x00,0x17,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x05,0x00,0x00,0x05,0x57,0x00,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x05,0x00,0x4f,0x01,0x00,0x16,0x14,0x11,0x10,0x0f,0x0e,0x0b,0x09,0x08,0x06,0x00,0x17,0x01,\r\n0x17,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x15,0x33,0x15,0x23,0x15,0x14,0x16,0x33,0x33,0x15,0x01,0x1a,0x36,0x3f,0x3f,0x36,0xa3,0xa3,0x1f,0x24,0xe6,0xe6,0x24,0x1f,0xa3,0xb6,0x3f,0x36,0x42,0x36,0x3f,0x2d,0x24,0x1f,0x11,0x2a,0x11,0x1f,0x24,0x2d,0x00,0x00,0x03,0x00,0xe6,\r\n0x00,0x19,0x01,0x73,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,\r\n0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2d,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x20,0x20,0x27,0x27,\r\n0x20,0x20,0x26,0x26,0x20,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x01,0x00,0x78,0x00,0x00,0x01,0xe0,0x01,0xfe,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x33,0x11,0x21,0x11,0x78,0x01,0x68,0x01,0xfe,0xfe,0x02,0x00,0x02,0x00,0x97,0x01,0xd2,0x01,0xc4,0x02,0xb2,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,\r\n0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x0b,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x97,0x01,0x2d,0xfe,0xd3,0x01,0x2d,0x02,0x7a,0x38,0x38,0xa8,0x38,0x38,0x00,0x00,0x00,0x00,0x03,0x00,0x55,0x00,0x4c,0x02,0x03,0x02,0x48,0x00,0x03,0x00,0x07,0x00,0x0b,\r\n0x00,0x40,0x40,0x3d,0x00,0x00,0x06,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,\r\n0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0x01,0xfc,0x4c,0x4c,0xd8,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x02,0x00,0x2d,0x00,0x73,0x02,0x2b,0x02,0x21,0x00,0x0f,0x00,0x1f,0x00,0x44,0x40,0x41,0x03,0x01,0x01,0x02,0x01,0x85,0x09,0x07,0x02,0x05,\r\n0x06,0x05,0x86,0x00,0x02,0x08,0x01,0x00,0x04,0x02,0x00,0x67,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x00,0x06,0x04,0x06,0x4f,0x10,0x10,0x01,0x00,0x10,0x1f,0x10,0x1f,0x1d,0x1a,0x18,0x17,0x15,0x12,0x0c,0x0b,0x09,0x06,0x04,0x03,0x00,0x0f,0x01,0x0e,0x0a,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x33,0x14,0x16,0x33,\r\n0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0x01,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0xf5,0x5c,0x6c,0x5a,0x3b,0x33,0x6e,0x33,0x3b,0x5a,0x6c,0x5c,0xfe,0xca,0x6c,0x5c,0x6e,0x5c,0x6c,0x5a,0x3b,0x33,0x6e,0x33,0x3b,0x01,0x77,0x5c,0x4e,0x29,0x31,0x31,0x29,0x4e,0x5c,0xfe,0xfc,0x4e,0x5c,0x5c,\r\n0x4e,0x29,0x31,0x31,0x29,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x69,0x02,0x58,0x02,0x2b,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x07,0x01,0x03,0x05,0x02,0x03,0x67,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x11,\r\n0x10,0x0c,0x0c,0x01,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x35,0x21,0x15,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x08,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,\r\n0xfd,0xd4,0x01,0x5e,0xaa,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0x01,0x95,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x73,0x50,0x50,0xb9,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0x01,0x00,0x50,0x00,0x00,0x01,0xf4,0x02,0xda,0x00,0x0b,0x00,0x32,0x40,0x2f,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x00,0x02,0x00,0x01,\r\n0x00,0x02,0x01,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x21,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x50,0x01,0x4a,0xfe,0xd9,0x01,0x27,0xfe,0xb6,0x01,0xa4,0x52,0x01,0x02,0x52,0xe2,\r\n0x52,0xfd,0x26,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x03,0x00,0x0c,0x00,0x2a,0x40,0x27,0x08,0x01,0x01,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x04,0x04,0x04,0x0c,0x04,0x0c,0x11,0x10,0x04,0x06,0x18,0x2b,0x13,0x21,\r\n0x03,0x23,0x03,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x32,0x01,0xf4,0xbd,0x7b,0x4c,0x69,0x0d,0x11,0x04,0x04,0x13,0x0d,0x65,0x02,0xda,0xfd,0x26,0x02,0x8a,0xfe,0x5f,0x34,0x58,0x17,0x17,0x59,0x34,0x01,0xa0,0x00,0x00,0x00,0x00,0x02,0x00,0x50,0xff,0xfb,0x02,0x08,0x02,0xd0,0x00,0x0c,0x00,0x28,0x00,0x7d,0x40,0x0a,0x0c,0x0b,\r\n0x0a,0x09,0x05,0x01,0x00,0x07,0x00,0x4a,0x4b,0xb0,0x11,0x50,0x58,0x40,0x27,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x06,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x1b,0x40,0x29,0x00,0x02,0x00,0x04,0x00,0x02,0x04,\r\n0x80,0x06,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x59,0x40,0x13,0x0d,0x0d,0x0d,0x28,0x0d,0x28,0x25,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x12,0x10,0x07,0x06,0x16,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,\r\n0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfe,0x4d,0x47,0x3b,0x23,0x30,0x26,0x23,0x16,0x16,0x19,0x55,0x47,0x3b,0x23,0x31,0x25,0x24,0x15,\r\n0x16,0x19,0xbe,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0xfe,0x6b,0x14,0x3b,0x47,0x18,0x20,0x18,0x19,0x16,0x1c,0x14,0x3b,0x47,0x18,0x20,0x18,0x19,0x16,0x1c,0x00,0x00,0x01,0x00,0x23,0x00,0xb5,0x02,0x34,0x01,0xdf,0x00,0x25,0x00,0x2b,0x40,0x28,0x04,0x01,0x01,0x06,0x01,0x03,0x02,0x01,0x03,0x69,0x07,0x01,\r\n0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x02,0x00,0x51,0x14,0x24,0x24,0x11,0x14,0x24,0x24,0x10,0x08,0x06,0x1e,0x2b,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x17,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x35,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x27,0x26,0x23,0x22,0x06,0x15,\r\n0x14,0x16,0x33,0xb1,0x43,0x4b,0x4a,0x43,0x35,0x4d,0x13,0x16,0x16,0x36,0x20,0x22,0x23,0x20,0x44,0x4a,0x49,0x44,0x37,0x50,0x12,0x17,0x14,0x33,0x1f,0x23,0x23,0x20,0xb5,0x4e,0x46,0x47,0x4f,0x39,0x34,0x3d,0x3d,0x2b,0x28,0x26,0x2a,0x44,0x4d,0x47,0x47,0x4f,0x3a,0x34,0x42,0x38,0x2c,0x28,0x26,0x2a,0x00,0x00,0x00,0x01,0xff,0xb0,\r\n0x00,0x71,0x02,0xa8,0x02,0x24,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x01,0x02,0x01,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x60,0x00,0x00,0x02,0x00,0x50,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x25,0x37,0x21,0x37,0x33,0x07,0x21,0x07,0x01,0x7f,0xbd,0xfd,\r\n0x74,0xe9,0x40,0xbd,0x02,0x8c,0xe9,0x71,0xc3,0xf0,0xc3,0xf0,0x00,0x02,0x00,0x0a,0x00,0xeb,0x02,0x44,0x01,0xa9,0x00,0x0e,0x00,0x1a,0x00,0x34,0x40,0x31,0x00,0x02,0x00,0x05,0x03,0x02,0x05,0x69,0x00,0x03,0x00,0x00,0x04,0x03,0x00,0x67,0x06,0x01,0x04,0x01,0x01,0x04,0x59,0x06,0x01,0x04,0x04,0x01,0x61,0x00,0x01,0x04,0x01,0x51,\r\n0x10,0x0f,0x16,0x14,0x0f,0x1a,0x10,0x1a,0x12,0x24,0x22,0x10,0x07,0x06,0x1a,0x2b,0x01,0x21,0x06,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x21,0x05,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x02,0x44,0xfe,0x82,0x07,0x33,0x23,0x28,0x37,0x37,0x28,0x23,0x33,0x07,0x01,0x7e,0xfe,0x25,0x18,0x1f,0x1f,\r\n0x18,0x18,0x1f,0x1f,0x01,0x35,0x21,0x29,0x37,0x28,0x29,0x36,0x29,0x21,0x4c,0x1f,0x18,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0xe5,0x03,0xfc,0x00,0x0a,0x00,0x26,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x01,0x00,\r\n0x09,0x07,0x05,0x04,0x00,0x0a,0x01,0x0a,0x04,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x33,0x11,0x14,0x33,0x33,0x15,0x01,0xb8,0x58,0x61,0x5a,0x5f,0x2d,0x6e,0x57,0x4f,0x03,0xc4,0xfc,0x3c,0x56,0x50,0x00,0x00,0x01,0x00,0x2d,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x16,0x00,0x30,0x40,0x2d,0x12,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,\r\n0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x14,0x21,0x24,0x05,0x06,0x19,0x2b,0x13,0x11,0x34,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x07,0x16,0x16,0x15,0x11,0xff,0x0e,0x2b,\r\n0x2b,0x6e,0x6e,0x2c,0x2a,0x0e,0x5a,0x33,0x32,0x31,0x34,0xfe,0xd4,0x02,0x08,0x24,0x2c,0x14,0x50,0x14,0x2d,0x23,0x02,0x08,0xfd,0xf8,0x39,0x4a,0x09,0x09,0x4a,0x39,0xfd,0xf8,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0xe5,0x03,0x3e,0x00,0x0a,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x59,\r\n0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x00,0x00,0x00,0x0a,0x00,0x0a,0x21,0x23,0x04,0x06,0x18,0x2b,0x13,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x11,0xff,0x61,0x58,0x2d,0x2d,0x5f,0xfe,0xd4,0x03,0xc4,0x4f,0x57,0x50,0x56,0xfc,0x3c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x58,0x02,0x9b,0x00,0x08,\r\n0x00,0x0b,0x00,0x08,0xb5,0x0b,0x09,0x04,0x03,0x02,0x32,0x2b,0x25,0x07,0x25,0x01,0x11,0x01,0x25,0x17,0x05,0x05,0x37,0x27,0x02,0x58,0x22,0xfe,0xf5,0xfe,0xd5,0x01,0x2c,0x01,0x0b,0x21,0xfe,0xf8,0xfe,0xe2,0xd5,0xd5,0x75,0x26,0xf6,0xfe,0xed,0x02,0x69,0xfe,0xef,0xf2,0x24,0xf0,0xc5,0xc4,0xc2,0x00,0x00,0x00,0x00,0x01,0x00,0xff,\r\n0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0xf4,0x03,0xfc,0x00,0x05,0x00,0x24,0x40,0x21,\r\n0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x17,0x11,0x33,0x11,0x33,0x15,0xff,0x5a,0x9b,0x6e,0x04,0x6a,0xfb,0xe6,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0xf4,0x03,0x3e,0x00,0x05,\r\n0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x15,0x23,0x11,0xff,0xf5,0x9b,0xfe,0xd4,0x04,0x6a,0x50,0xfb,0xe6,0x00,0x00,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x17,\r\n0x02,0xd0,0x00,0x0c,0x00,0x28,0x00,0x3b,0x40,0x38,0x0c,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x01,0x04,0x03,0x01,0x59,0x02,0x01,0x00,0x00,0x04,0x03,0x00,0x04,0x69,0x00,0x01,0x01,0x03,0x62,0x06,0x05,0x02,0x03,0x01,0x03,0x52,0x0d,0x0d,0x0d,0x28,0x0d,0x28,0x25,0x23,0x20,0x1e,0x1b,0x1a,0x17,0x15,0x12,0x10,0x07,\r\n0x06,0x16,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0xfe,0x3e,0x47,0x3b,0x23,0x39,\r\n0x32,0x2c,0x16,0x16,0x19,0x55,0x47,0x3b,0x23,0x3a,0x31,0x2d,0x15,0x16,0x19,0xbe,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0xfe,0xe8,0x0f,0x3b,0x47,0x15,0x1c,0x15,0x19,0x16,0x17,0x0f,0x3b,0x47,0x15,0x1c,0x15,0x19,0x16,0x17,0x00,0x03,0xff,0xf6,0x01,0x08,0x02,0x62,0x01,0x94,0x00,0x0b,0x00,0x17,0x00,0x23,\r\n0x00,0x37,0x40,0x34,0x05,0x03,0x02,0x01,0x00,0x00,0x01,0x59,0x05,0x03,0x02,0x01,0x01,0x00,0x61,0x08,0x04,0x07,0x02,0x06,0x05,0x00,0x01,0x00,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x3d,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xd0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xcf,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0x08,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x27,\r\n0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x01,0x00,0x41,0xff,0xec,0x02,0x17,0x02,0x26,0x00,0x0f,0x00,0x2f,0x40,0x2c,0x00,0x04,0x03,0x04,0x86,0x00,0x00,0x07,0x01,0x01,0x02,0x00,0x01,0x67,0x06,0x01,0x02,0x03,0x03,0x02,0x57,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,\r\n0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x08,0x06,0x1e,0x2b,0x13,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x23,0x46,0x01,0xcc,0xba,0xbf,0xbf,0x58,0xbf,0xbf,0xba,0x02,0x26,0x46,0xe1,0x50,0xc3,0xc3,0x50,0xe1,0x00,0x02,0x00,0x00,0x00,0x41,0x02,0x58,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x08,\r\n0xb5,0x17,0x0d,0x0a,0x00,0x02,0x32,0x2b,0x25,0x35,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x35,0x05,0x15,0x05,0x35,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x35,0x05,0x15,0x01,0x0e,0xd2,0x11,0x21,0x0a,0x0a,0x21,0x11,0xd2,0x01,0x4a,0xfd,0xa8,0xd2,0x11,0x21,0x0a,0x0a,0x21,0x11,0xd2,0x01,0x4a,0x41,0x53,0x96,0x0c,0x11,0x04,\r\n0x04,0x14,0x0b,0x8f,0x56,0xe0,0x4e,0xe4,0x53,0x96,0x0c,0x11,0x04,0x04,0x14,0x0b,0x8f,0x56,0xe0,0x4e,0x00,0x02,0x00,0x00,0x00,0x41,0x02,0x58,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x08,0xb5,0x10,0x0d,0x03,0x00,0x02,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x05,0x25,0x35,0x25,0x15,0x07,0x06,\r\n0x06,0x07,0x16,0x16,0x17,0x17,0x02,0x58,0xfe,0xb6,0x01,0x4a,0xd2,0x10,0x22,0x0a,0x0a,0x21,0x11,0xd2,0xfe,0xf2,0xfe,0xb6,0x01,0x4a,0xd2,0x10,0x22,0x0a,0x0a,0x21,0x11,0xd2,0x41,0xe4,0x4e,0xe0,0x56,0x8f,0x0b,0x14,0x04,0x04,0x11,0x0c,0x96,0x53,0xe4,0x4e,0xe0,0x56,0x8f,0x0b,0x14,0x04,0x04,0x11,0x0c,0x96,0x00,0x02,0x00,0x14,\r\n0x00,0xeb,0x02,0x4e,0x01,0xa9,0x00,0x0e,0x00,0x1a,0x00,0x3a,0x40,0x37,0x00,0x01,0x00,0x05,0x00,0x01,0x05,0x69,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x07,0x01,0x04,0x02,0x02,0x04,0x59,0x07,0x01,0x04,0x04,0x02,0x61,0x00,0x02,0x04,0x02,0x51,0x10,0x0f,0x00,0x00,0x16,0x14,0x0f,0x1a,0x10,0x1a,0x00,0x0e,0x00,0x0e,0x24,\r\n0x22,0x11,0x08,0x06,0x19,0x2b,0x13,0x35,0x21,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x14,0x01,0x7e,0x07,0x33,0x23,0x29,0x36,0x36,0x29,0x23,0x33,0x07,0x5d,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x1f,0x01,0x35,0x2a,0x21,0x29,0x36,0x29,0x28,0x37,0x29,\r\n0x21,0x22,0x1f,0x18,0x18,0x1f,0x1f,0x18,0x18,0x1f,0x00,0x00,0x00,0x02,0x00,0x46,0x00,0x00,0x02,0x12,0x02,0xda,0x00,0x13,0x00,0x1f,0x00,0x43,0x40,0x40,0x02,0x01,0x00,0x06,0x00,0x85,0x00,0x06,0x05,0x06,0x85,0x0a,0x01,0x09,0x04,0x01,0x04,0x09,0x01,0x80,0x07,0x01,0x05,0x08,0x01,0x04,0x09,0x05,0x04,0x67,0x00,0x01,0x03,0x03,\r\n0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x14,0x14,0x14,0x1f,0x14,0x1f,0x11,0x11,0x11,0x11,0x14,0x33,0x13,0x33,0x10,0x0b,0x06,0x1f,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x17,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x46,\r\n0x32,0x51,0x4a,0x32,0x4a,0x51,0x32,0x68,0x63,0x36,0x63,0x68,0xd2,0x78,0x78,0x28,0x78,0x78,0x02,0xda,0xfd,0xee,0x4a,0x51,0x51,0x4a,0x02,0x12,0xfd,0xee,0x61,0x67,0x67,0x61,0x73,0x79,0x26,0x79,0x79,0x26,0x79,0x00,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x42,0x40,0x3f,\r\n0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,\r\n0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,\r\n0x4a,0x76,0x44,0x44,0x76,0x4a,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xcc,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x07,0x00,0x20,0x40,0x1d,\r\n0x03,0x01,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x00,0x02,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x21,0x11,0x23,0x11,0x21,0x11,0x23,0x2b,0x02,0x02,0x5a,0xfe,0xb2,0x5a,0x02,0xda,0xfd,0x26,0x02,0x88,0xfd,0x78,0x00,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,\r\n0x02,0xda,0x00,0x07,0x00,0x26,0x40,0x23,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x5f,0x04,0x01,0x03,0x01,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x2b,0x5a,0x01,0x4e,0x5a,0x02,0xda,0xfd,0x78,0x02,0x88,0xfd,\r\n0x26,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x50,0x02,0x2b,0x02,0xf0,0x00,0x03,0x00,0x10,0x00,0x3c,0x40,0x39,0x0c,0x01,0x03,0x02,0x01,0x4c,0x00,0x02,0x01,0x03,0x01,0x02,0x03,0x80,0x06,0x04,0x02,0x03,0x03,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x05,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,\r\n0x10,0x04,0x10,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x2d,0x01,0xfe,0xfe,0x11,0xb3,0x7a,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x02,0xa5,0x4b,0x4b,0xfd,0xab,0x01,0xf4,0xfe,0x0c,0x01,0x40,0x20,0x3f,\r\n0x10,0x10,0x3f,0x20,0xfe,0xc0,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x13,0x00,0x13,0x33,0x13,0x33,0x05,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,\r\n0x33,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x11,0x2b,0x75,0x6f,0x3a,0x6f,0x75,0x5a,0x48,0x44,0x36,0x44,0x48,0x01,0xfe,0x6b,0x71,0x71,0x6b,0xfe,0x02,0x01,0xfe,0x44,0x48,0x48,0x44,0xfe,0x02,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,\r\n0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x33,0x13,0x33,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x2b,0x5a,0x48,0x44,0x36,0x44,0x48,0x5a,0x75,0x6f,0x3a,0x6f,0x75,0x02,0xda,0xfe,0x02,0x44,\r\n0x48,0x48,0x44,0x01,0xfe,0xfe,0x02,0x6b,0x71,0x71,0x6b,0x00,0x00,0x01,0x00,0x46,0xff,0x9c,0x02,0x12,0x03,0x0c,0x00,0x2f,0x00,0xc6,0x40,0x0a,0x17,0x01,0x07,0x03,0x07,0x01,0x04,0x07,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x46,0x00,0x06,0x05,0x06,0x85,0x00,0x08,0x05,0x03,0x07,0x08,0x72,0x00,0x04,0x07,0x09,0x03,0x04,0x72,\r\n0x00,0x0e,0x0d,0x0e,0x86,0x00,0x05,0x00,0x03,0x07,0x05,0x03,0x69,0x00,0x07,0x00,0x09,0x02,0x07,0x09,0x6a,0x0a,0x01,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x0d,0x0d,0x00,0x57,0x0c,0x01,0x00,0x00,0x0d,0x5f,0x10,0x0f,0x02,0x0d,0x00,0x0d,0x4f,0x1b,0x40,0x48,0x00,0x06,0x05,0x06,0x85,0x00,0x08,0x05,0x03,0x05,\r\n0x08,0x03,0x80,0x00,0x04,0x07,0x09,0x07,0x04,0x09,0x80,0x00,0x0e,0x0d,0x0e,0x86,0x00,0x05,0x00,0x03,0x07,0x05,0x03,0x69,0x00,0x07,0x00,0x09,0x02,0x07,0x09,0x6a,0x0a,0x01,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x0d,0x0d,0x00,0x57,0x0c,0x01,0x00,0x00,0x0d,0x5f,0x10,0x0f,0x02,0x0d,0x00,0x0d,0x4f,0x59,0x40,\r\n0x1e,0x00,0x00,0x00,0x2f,0x00,0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x23,0x21,0x12,0x11,0x14,0x23,0x12,0x24,0x11,0x11,0x11,0x11,0x06,0x1f,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x17,0x37,0x33,0x07,0x36,0x35,0x35,0x33,0x15,0x14,\r\n0x06,0x23,0x22,0x27,0x07,0x33,0x15,0x23,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x46,0x87,0x2f,0xb6,0xd0,0x29,0x1a,0x22,0x21,0x18,0x2f,0x55,0x47,0x3b,0x2b,0x35,0x23,0x0f,0x47,0x3f,0x51,0x2e,0x55,0x47,0x3b,0x0e,0x0c,0x21,0xbd,0xd7,0x2f,0x01,0x06,0xfe,0xe0,0x3b,0x3f,0x3b,0x4c,0x4c,0x8c,0x4c,0x7a,0x13,0x31,0x25,0x37,0x46,0x46,\r\n0x3b,0x47,0x21,0x2f,0x13,0xd1,0xf0,0x01,0x36,0x46,0x46,0x3a,0x48,0x02,0x63,0x4c,0x8c,0x4c,0xb0,0xb0,0x00,0x02,0x00,0x23,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x1d,0x00,0x26,0x00,0xcc,0x40,0x0a,0x21,0x01,0x06,0x05,0x05,0x01,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x32,0x00,0x03,0x02,0x02,0x03,0x70,0x0c,0x01,0x0a,\r\n0x00,0x00,0x0a,0x71,0x04,0x01,0x02,0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x1b,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x31,0x00,0x03,0x02,0x03,0x85,0x0c,0x01,0x0a,0x00,0x00,0x0a,0x71,0x04,0x01,0x02,\r\n0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x1b,0x40,0x30,0x00,0x03,0x02,0x03,0x85,0x0c,0x01,0x0a,0x00,0x0a,0x86,0x04,0x01,0x02,0x0b,0x01,0x05,0x06,0x02,0x05,0x68,0x00,0x06,0x00,0x07,0x01,0x06,\r\n0x07,0x67,0x08,0x01,0x01,0x00,0x00,0x01,0x57,0x08,0x01,0x01,0x01,0x00,0x5f,0x09,0x01,0x00,0x01,0x00,0x4f,0x59,0x59,0x40,0x16,0x00,0x00,0x24,0x22,0x00,0x1d,0x00,0x1d,0x1c,0x1b,0x11,0x11,0x11,0x11,0x11,0x11,0x28,0x11,0x11,0x0d,0x06,0x1f,0x2b,0x17,0x37,0x23,0x35,0x33,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,\r\n0x33,0x07,0x33,0x15,0x23,0x03,0x33,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x03,0x14,0x16,0x17,0x13,0x23,0x22,0x06,0x15,0x66,0x28,0x5c,0x7a,0x2d,0x53,0x63,0x3a,0x67,0x45,0x7f,0x37,0x46,0x37,0x6c,0x8a,0x74,0xfe,0xfe,0xe4,0x2c,0x01,0x48,0xfe,0x9a,0x28,0x2f,0x3f,0x3a,0x74,0x61,0x43,0x49,0x6e,0x6e,0x52,0x7a,0x0d,0x73,0x56,0x2c,\r\n0x42,0x62,0x36,0x96,0x96,0x52,0xfe,0xc4,0x52,0x76,0x52,0x6e,0x02,0x12,0x3d,0x47,0x05,0x01,0x3b,0x48,0x42,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0xff,0x92,0x02,0x35,0x03,0x3e,0x00,0x21,0x00,0x29,0x00,0x91,0x40,0x0a,0x11,0x01,0x03,0x04,0x24,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x31,0x00,0x05,0x04,0x05,0x85,\r\n0x00,0x09,0x08,0x08,0x09,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0b,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x69,0x07,0x01,0x00,0x08,0x08,0x00,0x57,0x07,0x01,0x00,0x00,0x08,0x5f,0x0c,0x0a,0x02,0x08,0x00,0x08,0x4f,0x1b,0x40,0x30,0x00,0x05,0x04,0x05,0x85,0x00,0x09,0x08,0x09,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,\r\n0x67,0x0b,0x01,0x02,0x06,0x01,0x01,0x00,0x02,0x01,0x69,0x07,0x01,0x00,0x08,0x08,0x00,0x57,0x07,0x01,0x00,0x00,0x08,0x5f,0x0c,0x0a,0x02,0x08,0x00,0x08,0x4f,0x59,0x40,0x16,0x00,0x00,0x27,0x25,0x00,0x21,0x00,0x21,0x20,0x1f,0x11,0x11,0x28,0x12,0x21,0x22,0x11,0x11,0x11,0x0d,0x06,0x1f,0x2b,0x33,0x35,0x33,0x37,0x23,0x35,0x33,\r\n0x13,0x26,0x23,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x01,0x34,0x27,0x03,0x33,0x32,0x36,0x35,0x1e,0x8e,0x2c,0xba,0xd8,0x73,0x0c,0x0e,0xfe,0xcf,0x01,0x31,0x1d,0x1a,0x39,0x46,0x40,0x34,0x3c,0x3a,0x67,0x45,0x31,0x2c,0x01,0x34,0xfe,0xae,0x28,\r\n0x46,0x28,0x01,0x4d,0x34,0x6b,0x13,0x43,0x49,0x52,0x76,0x52,0x01,0x3a,0x02,0x52,0x05,0x9b,0xb0,0x1a,0x63,0x43,0x2c,0x41,0x63,0x36,0x76,0x52,0x6e,0x6e,0x01,0xcc,0x4f,0x23,0xfe,0xdc,0x48,0x42,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x50,0x02,0x2b,0x02,0xf0,0x00,0x03,0x00,0x10,0x00,0x3c,0x40,0x39,0x0a,0x01,0x04,0x02,0x01,0x4c,\r\n0x03,0x01,0x02,0x01,0x04,0x01,0x02,0x04,0x80,0x06,0x01,0x04,0x04,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x05,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x10,0x04,0x10,0x0f,0x0e,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x03,0x33,0x13,0x16,0x16,0x17,0x36,\r\n0x36,0x37,0x13,0x33,0x03,0x2d,0x01,0xfe,0xfe,0xc4,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x5b,0xb3,0x02,0xa5,0x4b,0x4b,0xfd,0xab,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0x00,0x00,0x00,0x03,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x03,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,\r\n0x09,0x05,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x25,0x25,0x35,0x25,0x03,0x11,0x07,0x06,0x06,0x07,0x16,0x16,0x17,0x03,0x35,0x21,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0x4c,0xea,0x13,\r\n0x21,0x08,0x09,0x22,0x11,0x78,0x01,0xae,0xbe,0xd7,0x64,0xd7,0xfe,0x6f,0x01,0x13,0x72,0x09,0x0c,0x02,0x02,0x0e,0x08,0xfe,0x4f,0x50,0x50,0x00,0x00,0x01,0x00,0x46,0xff,0xc4,0x02,0x12,0x03,0x0c,0x00,0x3f,0x00,0xe4,0x40,0x18,0x15,0x01,0x01,0x06,0x18,0x01,0x05,0x01,0x26,0x07,0x02,0x02,0x05,0x27,0x06,0x02,0x0c,0x09,0x37,0x01,\r\n0x08,0x0c,0x05,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x4f,0x00,0x04,0x03,0x04,0x85,0x00,0x06,0x03,0x01,0x05,0x06,0x72,0x00,0x02,0x05,0x07,0x01,0x02,0x72,0x00,0x09,0x00,0x0c,0x08,0x09,0x72,0x0e,0x01,0x0d,0x08,0x0a,0x0c,0x0d,0x72,0x00,0x0b,0x0a,0x0b,0x86,0x00,0x03,0x00,0x01,0x05,0x03,0x01,0x69,0x00,0x05,0x00,0x07,0x00,0x05,\r\n0x07,0x6a,0x00,0x00,0x00,0x0c,0x08,0x00,0x0c,0x69,0x00,0x08,0x0d,0x0a,0x08,0x59,0x00,0x08,0x08,0x0a,0x62,0x00,0x0a,0x08,0x0a,0x52,0x1b,0x40,0x53,0x00,0x04,0x03,0x04,0x85,0x00,0x06,0x03,0x01,0x03,0x06,0x01,0x80,0x00,0x02,0x05,0x07,0x05,0x02,0x07,0x80,0x00,0x09,0x00,0x0c,0x00,0x09,0x0c,0x80,0x0e,0x01,0x0d,0x08,0x0a,0x08,\r\n0x0d,0x0a,0x80,0x00,0x0b,0x0a,0x0b,0x86,0x00,0x03,0x00,0x01,0x05,0x03,0x01,0x69,0x00,0x05,0x00,0x07,0x00,0x05,0x07,0x6a,0x00,0x00,0x00,0x0c,0x08,0x00,0x0c,0x69,0x00,0x08,0x0d,0x0a,0x08,0x59,0x00,0x08,0x08,0x0a,0x62,0x00,0x0a,0x08,0x0a,0x52,0x59,0x40,0x1a,0x00,0x00,0x00,0x3f,0x00,0x3f,0x3d,0x3b,0x39,0x38,0x34,0x32,0x2f,\r\n0x2e,0x26,0x23,0x12,0x23,0x13,0x23,0x12,0x24,0x23,0x0f,0x06,0x1f,0x2b,0x37,0x35,0x34,0x36,0x33,0x32,0x17,0x37,0x26,0x26,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x13,0x33,0x03,0x16,0x16,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x07,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,\r\n0x23,0x22,0x26,0x26,0x27,0x07,0x23,0x13,0x26,0x23,0x22,0x15,0x15,0x46,0x48,0x3a,0x1a,0x16,0x25,0x15,0x23,0x1b,0x2f,0x55,0x48,0x3a,0x2c,0x36,0x12,0x65,0x3f,0x78,0x08,0x13,0x0b,0x2f,0x55,0x47,0x3b,0x14,0x21,0x0d,0x23,0x13,0x1d,0x1e,0x15,0x2f,0x55,0x47,0x3b,0x24,0x30,0x21,0x0e,0x56,0x3f,0x67,0x0a,0x0b,0x2f,0x6e,0x46,0x3b,\r\n0x47,0x08,0x6a,0x1a,0x2e,0x37,0x46,0x46,0x3b,0x47,0x25,0x17,0x01,0x1d,0xfe,0xad,0x07,0x09,0x37,0x46,0x46,0x3a,0x48,0x09,0x07,0x61,0x13,0x29,0x1d,0x37,0x46,0x46,0x3a,0x48,0x18,0x25,0x12,0xf4,0x01,0x22,0x05,0x37,0x46,0x00,0x00,0x03,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x1c,0x00,0x22,0x00,0x2a,0x00,0x92,0x40,0x0a,\r\n0x10,0x01,0x03,0x04,0x20,0x01,0x02,0x03,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x31,0x00,0x05,0x04,0x05,0x85,0x00,0x07,0x06,0x06,0x07,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x09,0x01,0x02,0x0a,0x01,0x01,0x00,0x02,0x01,0x67,0x0b,0x01,0x00,0x06,0x06,0x00,0x57,0x0b,0x01,0x00,0x00,0x06,0x5f,0x0c,0x08,0x02,0x06,0x00,\r\n0x06,0x4f,0x1b,0x40,0x30,0x00,0x05,0x04,0x05,0x85,0x00,0x07,0x06,0x07,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x09,0x01,0x02,0x0a,0x01,0x01,0x00,0x02,0x01,0x67,0x0b,0x01,0x00,0x06,0x06,0x00,0x57,0x0b,0x01,0x00,0x00,0x06,0x5f,0x0c,0x08,0x02,0x06,0x00,0x06,0x4f,0x59,0x40,0x17,0x00,0x00,0x27,0x25,0x24,0x23,0x22,0x21,\r\n0x00,0x1c,0x00,0x1c,0x11,0x28,0x12,0x21,0x21,0x11,0x11,0x11,0x0d,0x06,0x1e,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x23,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x01,0x34,0x26,0x27,0x07,0x33,0x15,0x23,0x07,0x33,0x32,0x36,0x36,0x35,0x23,0x9f,0x3c,0xdb,0xf8,\r\n0x3c,0x03,0xfe,0xcf,0x01,0x31,0x0f,0x0f,0x2f,0x3f,0x34,0x3e,0x50,0x3f,0x68,0x3f,0x6f,0x2e,0x3f,0x2e,0x01,0x3a,0x2c,0x23,0x37,0x86,0xa3,0x3c,0x53,0x28,0x3f,0x25,0x46,0x50,0xaa,0x50,0xaa,0x50,0x02,0x84,0x92,0x19,0x6b,0x46,0x90,0x3e,0x63,0x39,0x82,0x82,0x01,0x68,0x28,0x45,0x11,0x9c,0x50,0xaa,0x27,0x40,0x25,0x00,0x00,0x00,\r\n0x00,0x03,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x1d,0x00,0x25,0x00,0x2b,0x00,0x90,0x40,0x0a,0x29,0x01,0x06,0x05,0x01,0x01,0x07,0x06,0x02,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x30,0x00,0x01,0x00,0x00,0x01,0x70,0x0c,0x01,0x08,0x07,0x08,0x86,0x02,0x01,0x00,0x0a,0x01,0x03,0x04,0x00,0x03,0x68,0x09,0x01,0x04,0x0b,0x01,\r\n0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x00,0x07,0x06,0x07,0x4f,0x1b,0x40,0x2f,0x00,0x01,0x00,0x01,0x85,0x0c,0x01,0x08,0x07,0x08,0x86,0x02,0x01,0x00,0x0a,0x01,0x03,0x04,0x00,0x03,0x68,0x09,0x01,0x04,0x0b,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,\r\n0x07,0x5f,0x00,0x07,0x06,0x07,0x4f,0x59,0x40,0x17,0x00,0x00,0x2b,0x2a,0x22,0x20,0x1f,0x1e,0x00,0x1d,0x00,0x1d,0x21,0x31,0x11,0x11,0x11,0x11,0x11,0x28,0x0d,0x06,0x1e,0x2b,0x17,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x32,0x33,0x21,0x15,0x21,0x22,0x27,0x07,\r\n0x03,0x33,0x37,0x23,0x22,0x06,0x06,0x15,0x15,0x14,0x16,0x17,0x37,0x23,0x78,0x34,0x3c,0x4d,0x3f,0x69,0x3e,0x6a,0x2e,0x3f,0x2e,0x88,0xa4,0x3c,0xe0,0xfd,0x3c,0x04,0x04,0x01,0x31,0xfe,0xcf,0x12,0x11,0x2f,0x3a,0x9e,0x3c,0x4e,0x27,0x40,0x25,0x29,0x22,0x36,0x81,0x3c,0x94,0x19,0x6a,0x45,0x90,0x3e,0x63,0x39,0x82,0x82,0x50,0xaa,\r\n0x50,0xaa,0x50,0x03,0x85,0x01,0xcc,0xaa,0x27,0x40,0x25,0x8c,0x27,0x43,0x12,0x9a,0x00,0x01,0x00,0x2d,0x00,0x00,0x02,0x2b,0x02,0x99,0x00,0x29,0x00,0x57,0x40,0x54,0x11,0x01,0x03,0x02,0x26,0x01,0x08,0x09,0x02,0x4c,0x00,0x04,0x02,0x04,0x85,0x05,0x01,0x02,0x03,0x02,0x85,0x0c,0x0b,0x02,0x08,0x09,0x0a,0x09,0x08,0x0a,0x80,0x00,\r\n0x0a,0x0a,0x84,0x00,0x03,0x06,0x01,0x01,0x00,0x03,0x01,0x69,0x07,0x01,0x00,0x09,0x09,0x00,0x59,0x07,0x01,0x00,0x00,0x09,0x61,0x00,0x09,0x00,0x09,0x51,0x00,0x00,0x00,0x29,0x00,0x29,0x25,0x24,0x23,0x21,0x12,0x22,0x12,0x14,0x11,0x22,0x12,0x22,0x12,0x0d,0x06,0x1f,0x2b,0x37,0x34,0x36,0x33,0x33,0x37,0x23,0x22,0x26,0x35,0x33,\r\n0x14,0x16,0x33,0x33,0x37,0x33,0x07,0x36,0x36,0x35,0x33,0x14,0x06,0x23,0x23,0x07,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x23,0x07,0x23,0x37,0x06,0x06,0x15,0x2d,0x6c,0x5c,0x04,0x21,0x25,0x5c,0x6c,0x5a,0x3b,0x33,0x42,0x4d,0x46,0x4c,0x27,0x2c,0x5a,0x6c,0x5c,0x03,0x21,0x24,0x5c,0x6c,0x5a,0x3b,0x33,0x42,0x4b,0x46,0x4b,0x28,\r\n0x2c,0x73,0x4e,0x5c,0x5a,0x5c,0x4e,0x29,0x31,0xd2,0xd0,0x06,0x2e,0x24,0x4e,0x5c,0x5a,0x5c,0x4e,0x29,0x31,0xcd,0xcb,0x06,0x2e,0x24,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0xba,0x02,0x03,0x02,0xda,0x00,0x0f,0x00,0x18,0x00,0x23,0x40,0x20,0x16,0x12,0x11,0x0f,0x0b,0x0a,0x09,0x06,0x05,0x04,0x03,0x01,0x00,0x0d,0x01,0x00,0x01,0x4c,\r\n0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x15,0x17,0x02,0x06,0x18,0x2b,0x37,0x35,0x37,0x37,0x27,0x35,0x17,0x37,0x33,0x03,0x17,0x15,0x07,0x07,0x23,0x37,0x37,0x27,0x07,0x37,0x36,0x36,0x37,0x26,0x26,0x55,0x87,0x41,0xc8,0xe2,0x56,0x3f,0x5f,0x96,0xff,0x4d,0x3f,0x40,0xd3,0x38,0x2b,0x63,0x13,0x21,0x08,0x09,0x22,0x41,0x57,\r\n0x42,0xbc,0x63,0x5a,0x71,0xf8,0xfe,0xed,0x4b,0x64,0x7f,0xdf,0xb8,0xee,0x1c,0x7d,0x31,0x09,0x0d,0x02,0x02,0x0e,0x00,0x00,0x00,0x02,0x00,0x55,0xff,0x92,0x02,0x03,0x03,0x0c,0x00,0x17,0x00,0x20,0x00,0x6d,0x40,0x12,0x1e,0x1a,0x19,0x0f,0x0e,0x0d,0x0a,0x09,0x08,0x07,0x05,0x04,0x03,0x0d,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x0c,0x50,\r\n0x58,0x40,0x1f,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x03,0x04,0x71,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x1b,0x40,0x1e,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,\r\n0x00,0x03,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x15,0x19,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x33,0x37,0x07,0x35,0x37,0x37,0x27,0x35,0x05,0x37,0x33,0x07,0x17,0x15,0x07,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x13,0x27,0x07,0x37,0x36,0x36,0x37,0x26,0x26,0x55,0x63,0x40,0xa3,0xc5,0x2d,0xf2,0x01,0x0c,0x40,\r\n0x3f,0x49,0x6c,0xc0,0x4c,0x01,0x0c,0xfe,0xd9,0x25,0x3f,0x25,0xee,0x0e,0x18,0x26,0x13,0x21,0x08,0x09,0x22,0x52,0xbe,0x51,0x57,0x60,0x89,0x78,0x5a,0x86,0xc1,0xdc,0x36,0x64,0x60,0xe4,0x52,0x6e,0x6e,0x01,0xde,0x07,0x4a,0x13,0x09,0x0d,0x02,0x02,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xc4,0x02,0x03,0x02,0xd9,0x00,0x1b,\r\n0x00,0xca,0x4b,0xb0,0x09,0x50,0x58,0x40,0x34,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x0c,0x0b,0x0b,0x0c,0x71,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x1b,0x4b,0xb0,\r\n0x0a,0x50,0x58,0x40,0x33,0x00,0x05,0x04,0x05,0x85,0x00,0x0c,0x0b,0x0b,0x0c,0x71,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x1b,0x40,0x32,0x00,0x05,0x04,0x05,0x85,\r\n0x00,0x0c,0x0b,0x0c,0x86,0x06,0x01,0x04,0x07,0x01,0x03,0x02,0x04,0x03,0x68,0x08,0x01,0x02,0x09,0x01,0x01,0x00,0x02,0x01,0x67,0x0a,0x01,0x00,0x0b,0x0b,0x00,0x57,0x0a,0x01,0x00,0x00,0x0b,0x5f,0x0e,0x0d,0x02,0x0b,0x00,0x0b,0x4f,0x59,0x59,0x40,0x1a,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x37,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x21,0x07,0x23,0x37,0x55,0x7c,0x2e,0xaa,0xc2,0x2e,0xf0,0x01,0x09,0x2f,0x3f,0x2f,0x66,0x7f,0x2e,0xad,0xc5,0x2e,0xf3,0xfe,0xf4,0x2c,0x3f,0x2c,\r\n0x4c,0x4c,0x8c,0x4c,0x8c,0x4c,0x91,0x91,0x4c,0x8c,0x4c,0x8c,0x4c,0x88,0x88,0x00,0x00,0x02,0x00,0x55,0xff,0xba,0x02,0x03,0x02,0xda,0x00,0x0f,0x00,0x18,0x00,0x29,0x40,0x26,0x16,0x12,0x11,0x0e,0x0d,0x0c,0x0b,0x09,0x08,0x07,0x03,0x02,0x01,0x0d,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,\r\n0x00,0x0f,0x00,0x0f,0x15,0x03,0x06,0x17,0x2b,0x17,0x13,0x27,0x35,0x37,0x37,0x33,0x07,0x37,0x15,0x07,0x07,0x17,0x15,0x27,0x03,0x13,0x17,0x37,0x07,0x06,0x06,0x07,0x16,0x16,0x78,0x62,0x85,0xe7,0x51,0x3f,0x44,0x7b,0x9f,0x3a,0xd9,0xf3,0x59,0x16,0x27,0x24,0x4b,0x13,0x21,0x08,0x09,0x22,0x46,0x01,0x1b,0x43,0x64,0x73,0xeb,0xc5,\r\n0x3e,0x57,0x4e,0xa8,0x6b,0x5a,0x7a,0xfe,0xff,0x01,0x7a,0x13,0x68,0x25,0x09,0x0d,0x02,0x02,0x0d,0x00,0x00,0x02,0x00,0x55,0xff,0x92,0x02,0x03,0x03,0x0c,0x00,0x17,0x00,0x20,0x00,0x6d,0x40,0x12,0x1e,0x1a,0x19,0x10,0x0f,0x0e,0x0d,0x0b,0x0a,0x09,0x05,0x04,0x03,0x0d,0x00,0x01,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x1f,0x00,\r\n0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x03,0x04,0x71,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x1b,0x40,0x1e,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x59,\r\n0x40,0x0e,0x00,0x00,0x00,0x17,0x00,0x17,0x11,0x11,0x19,0x15,0x11,0x07,0x06,0x1b,0x2b,0x33,0x35,0x33,0x37,0x27,0x35,0x25,0x37,0x33,0x07,0x37,0x15,0x07,0x07,0x17,0x15,0x27,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x13,0x17,0x37,0x07,0x06,0x06,0x07,0x16,0x16,0x55,0x63,0x4e,0xb1,0x01,0x20,0x2c,0x3f,0x1f,0x42,0x64,0x49,0xad,0xc7,\r\n0x45,0x01,0x0c,0xfe,0xd9,0x25,0x3f,0x25,0x30,0x53,0x33,0x86,0x13,0x21,0x08,0x09,0x22,0x52,0xea,0x59,0x64,0x90,0x83,0x5d,0x21,0x57,0x31,0xda,0x56,0x5a,0x63,0xcf,0x52,0x6e,0x6e,0x01,0xb1,0x29,0x9b,0x42,0x09,0x0d,0x02,0x02,0x0d,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x17,0x00,0x1b,0x00,0xca,\r\n0x4b,0xb0,0x09,0x50,0x58,0x40,0x34,0x00,0x03,0x02,0x02,0x03,0x70,0x00,0x0a,0x09,0x09,0x0a,0x71,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x1b,0x4b,0xb0,0x0c,0x50,\r\n0x58,0x40,0x33,0x00,0x03,0x02,0x03,0x85,0x00,0x0a,0x09,0x09,0x0a,0x71,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x1b,0x40,0x32,0x00,0x03,0x02,0x03,0x85,0x00,0x0a,\r\n0x09,0x0a,0x86,0x04,0x01,0x02,0x0d,0x01,0x05,0x06,0x02,0x05,0x68,0x0c,0x01,0x06,0x07,0x01,0x01,0x00,0x06,0x01,0x67,0x08,0x01,0x00,0x09,0x09,0x00,0x57,0x08,0x01,0x00,0x00,0x09,0x5f,0x0e,0x0b,0x02,0x09,0x00,0x09,0x4f,0x59,0x59,0x40,0x1a,0x00,0x00,0x1b,0x1a,0x19,0x18,0x00,0x17,0x00,0x17,0x16,0x15,0x14,0x13,0x11,0x11,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x33,0x35,0x33,0x37,0x23,0x11,0x21,0x37,0x33,0x07,0x33,0x15,0x23,0x03,0x33,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0x23,0x37,0x03,0x33,0x13,0x23,0x23,0x88,0x2c,0xb4,0x01,0x64,0x37,0x46,0x37,0x6d,0x8b,0x74,0xff,0xfe,0xe3,0x2c,0x01,0x49,0xfe,0x99,0x28,0x46,0x28,0x10,0x78,0x74,\r\n0xec,0x52,0x76,0x01,0xe0,0x96,0x96,0x52,0xfe,0xc4,0x52,0x76,0x52,0x6e,0x6e,0x01,0x1a,0x01,0x3c,0x00,0x00,0x02,0x00,0x23,0xff,0xc4,0x02,0x3a,0x03,0x0c,0x00,0x17,0x00,0x1f,0x00,0x43,0x40,0x40,0x1a,0x01,0x04,0x03,0x01,0x01,0x05,0x04,0x02,0x4c,0x00,0x01,0x00,0x01,0x85,0x08,0x01,0x06,0x05,0x06,0x86,0x02,0x01,0x00,0x07,0x01,\r\n0x03,0x04,0x00,0x03,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x00,0x00,0x1d,0x1b,0x00,0x17,0x00,0x17,0x21,0x11,0x11,0x11,0x11,0x28,0x09,0x06,0x1c,0x2b,0x17,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x03,0x21,0x15,0x21,0x22,0x27,0x07,0x03,\r\n0x14,0x17,0x13,0x23,0x22,0x06,0x15,0x78,0x43,0x46,0x52,0x3a,0x67,0x45,0x58,0x40,0x3f,0x40,0x9a,0xb7,0x6f,0x01,0x26,0xfe,0xcf,0x09,0x09,0x40,0x3a,0x5a,0x6d,0x3b,0x43,0x49,0x3c,0xbe,0x14,0x6e,0x4e,0x2c,0x42,0x62,0x36,0xb4,0xb4,0x52,0xfe,0xc4,0x52,0x01,0xb5,0x01,0x90,0x6b,0x19,0x01,0x36,0x48,0x42,0x00,0x00,0x02,0x00,0x1e,\r\n0xff,0xc4,0x02,0x35,0x03,0x0c,0x00,0x17,0x00,0x1f,0x00,0x44,0x40,0x41,0x0b,0x01,0x01,0x02,0x1a,0x01,0x00,0x01,0x02,0x4c,0x00,0x03,0x02,0x03,0x85,0x00,0x05,0x04,0x05,0x86,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x07,0x01,0x00,0x04,0x04,0x00,0x59,0x07,0x01,0x00,0x00,0x04,0x5f,0x08,0x06,0x02,0x04,0x00,0x04,0x4f,0x00,0x00,\r\n0x1d,0x1b,0x00,0x17,0x00,0x17,0x11,0x28,0x12,0x21,0x11,0x11,0x09,0x06,0x1c,0x2b,0x37,0x35,0x33,0x13,0x21,0x35,0x21,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x01,0x34,0x27,0x03,0x33,0x32,0x36,0x35,0x1e,0xb7,0x6f,0xfe,0xda,0x01,0x31,0x09,0x09,0x40,0x3f,0x43,0x46,0x52,0x3a,0x67,\r\n0x45,0x58,0x40,0x3f,0x40,0x01,0x23,0x5a,0x6d,0x3b,0x43,0x49,0x78,0x52,0x01,0x3c,0x52,0x01,0xb5,0xbe,0x14,0x6e,0x4e,0x2c,0x41,0x63,0x36,0xb4,0xb4,0x01,0x04,0x6b,0x19,0xfe,0xca,0x48,0x42,0x00,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x5f,0x02,0x17,0x02,0x35,0x00,0x0b,0x00,0x4d,0x4b,0xb0,0x21,0x50,0x58,0x40,0x16,0x03,0x01,0x01,\r\n0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x05,0x05,0x02,0x5f,0x00,0x02,0x02,0x3b,0x05,0x4e,0x1b,0x40,0x1b,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,\r\n0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x00,0xbf,0xbf,0x58,0xbf,0xbf,0x5f,0xc3,0x50,0xc3,0xc3,0x50,0xc3,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x01,0x22,0x01,0xcc,0x01,0x72,0x02,0x06,0x03,0x57,0x00,0x00,0x00,0x01,0x00,0x69,0x00,0x88,0x01,0xee,0x02,0x0e,0x00,0x0b,0x00,0x06,0xb3,0x06,\r\n0x00,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x9c,0x33,0x8d,0x8d,0x33,0x8e,0x91,0x33,0x91,0x8e,0x34,0x8d,0x88,0x34,0x8d,0x8e,0x33,0x8d,0x91,0x34,0x91,0x8d,0x34,0x8e,0x00,0x03,0x00,0x64,0x00,0x37,0x01,0xf4,0x02,0x62,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,\r\n0x00,0x02,0x01,0x00,0x69,0x00,0x02,0x07,0x01,0x03,0x05,0x02,0x03,0x67,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x11,0x10,0x0c,0x0c,0x01,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xee,0x01,0x90,0xc8,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x01,0xcc,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xa5,0x4b,0x4b,0xf0,0x29,0x22,0x22,0x29,0x29,0x22,0x22,\r\n0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0xaa,0x02,0x03,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,\r\n0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0x01,0x9a,0x50,0x50,0xf0,0x50,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0xc4,0x02,0x03,0x03,0x0c,0x00,0x13,0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,\r\n0x67,0x07,0x01,0x01,0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x17,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x78,0x51,0x74,0x91,0x38,\r\n0xc9,0xe5,0x67,0x3f,0x67,0x8a,0xa6,0x38,0xde,0xfb,0x51,0x3c,0xe6,0x50,0xa0,0x50,0x01,0x22,0xfe,0xde,0x50,0xa0,0x50,0xe6,0x00,0x01,0x00,0x55,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x0c,0x00,0x06,0xb3,0x0a,0x00,0x01,0x32,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,\r\n0x22,0x11,0xfe,0xca,0x01,0xae,0x41,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x00,0x01,0x00,0x55,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x0c,0x00,0x06,0xb3,0x03,0x00,0x01,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,\r\n0x09,0x22,0x11,0x01,0x36,0x41,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x00,0x00,0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,0x0c,0x0b,0x0a,0x09,0x05,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,\r\n0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x37,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x21,0x15,0x55,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0xfe,0x52,0x01,0xae,0xbe,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0xfe,0x6b,0x50,0x50,0x00,\r\n0x00,0x02,0x00,0x55,0x00,0x00,0x02,0x03,0x02,0xd0,0x00,0x0c,0x00,0x10,0x00,0x28,0x40,0x25,0x0c,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x0d,0x0d,0x0d,0x10,0x0d,0x10,0x1e,0x03,0x06,0x17,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,\r\n0x07,0x16,0x16,0x17,0x05,0x01,0x35,0x21,0x15,0x02,0x03,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0xfe,0x52,0x01,0xae,0xbe,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0xfe,0xe8,0x50,0x50,0x00,0x00,0x00,0x01,0x00,0x41,0x00,0x00,0x02,0x17,0x02,0x3a,0x00,0x0f,0x00,0x56,0x4b,0xb0,\r\n0x18,0x50,0x58,0x40,0x1c,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x00,0x03,0x03,0x3b,0x4d,0x06,0x01,0x00,0x00,0x07,0x60,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,0x1b,0x40,0x1c,0x00,0x03,0x02,0x03,0x85,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x06,0x01,0x00,0x00,0x07,0x60,0x08,0x01,0x07,0x07,0x39,0x07,0x4e,\r\n0x59,0x40,0x10,0x00,0x00,0x00,0x0f,0x00,0x0f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x46,0xba,0xbf,0xbf,0x58,0xbf,0xbf,0xba,0x46,0xe1,0x50,0xc3,0xc3,0x50,0xe1,0x46,0xff,0xff,0x00,0x46,0x00,0x69,0x02,0x12,0x02,0x2b,0x02,0x26,\r\n0x04,0x22,0x00,0x64,0x01,0x07,0x04,0x22,0x00,0x00,0xff,0x6f,0x00,0x11,0xb1,0x00,0x01,0xb0,0x64,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0xff,0x6f,0xb0,0x35,0x2b,0x00,0x00,0x01,0x00,0x64,0x00,0xb9,0x01,0xf4,0x01,0x8b,0x00,0x05,0x00,0x46,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,\r\n0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x09,0x18,0x2b,0x25,0x35,0x21,0x35,0x21,0x15,0x01,0x9f,0xfe,0xc5,0x01,0x90,\r\n0xb9,0x82,0x50,0xd2,0x00,0x01,0x00,0x46,0x00,0xfa,0x02,0x12,0x01,0xc7,0x00,0x1b,0x00,0x68,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x02,0x01,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x06,0x05,0x02,0x03,0x01,0x03,0x52,0x1b,0x40,0x29,0x00,0x02,0x00,0x04,0x00,\r\n0x02,0x04,0x80,0x06,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x05,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x62,0x00,0x03,0x01,0x03,0x52,0x59,0x40,0x0e,0x00,0x00,0x00,0x1b,0x00,0x1b,0x24,0x23,0x12,0x24,0x23,0x07,0x09,0x1b,0x2b,0xb1,0x06,0x00,0x44,0x37,0x35,0x34,0x36,0x33,0x32,\r\n0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x46,0x48,0x3a,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0xff,0x46,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x37,0x46,0x46,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x37,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x50,\r\n0x01,0x54,0x02,0x08,0x02,0xda,0x00,0x0c,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x08,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x50,0xb3,\r\n0x54,0xb1,0x51,0x70,0x08,0x0d,0x03,0x04,0x0e,0x09,0x73,0x01,0x54,0x01,0x86,0xfe,0x7a,0x01,0x02,0x14,0x25,0x0a,0x0a,0x25,0x14,0xfe,0xfe,0x00,0x00,0x03,0x00,0x23,0x00,0xa0,0x02,0x35,0x01,0xf9,0x00,0x1b,0x00,0x2a,0x00,0x39,0x00,0x4b,0x40,0x48,0x17,0x09,0x02,0x04,0x05,0x01,0x4c,0x02,0x01,0x01,0x07,0x01,0x05,0x04,0x01,0x05,\r\n0x69,0x0a,0x06,0x09,0x03,0x04,0x00,0x00,0x04,0x59,0x0a,0x06,0x09,0x03,0x04,0x04,0x00,0x61,0x03,0x08,0x02,0x00,0x04,0x00,0x51,0x2c,0x2b,0x1d,0x1c,0x01,0x00,0x33,0x31,0x2b,0x39,0x2c,0x39,0x25,0x23,0x1c,0x2a,0x1d,0x2a,0x16,0x14,0x0f,0x0d,0x08,0x06,0x00,0x1b,0x01,0x1b,0x0b,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x35,0x34,0x36,\r\n0x33,0x32,0x17,0x33,0x3e,0x02,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x27,0x23,0x0e,0x02,0x27,0x32,0x3e,0x02,0x37,0x27,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x0e,0x02,0x07,0x17,0x16,0xa6,0x3b,0x48,0x4c,0x3d,0x66,0x24,0x03,0x05,0x1d,0x33,0x24,0x3b,0x48,0x4b,0x3e,0x66,\r\n0x24,0x03,0x04,0x1e,0x32,0x1c,0x1d,0x24,0x15,0x0a,0x01,0x1f,0x16,0x2c,0x1f,0x27,0x27,0x01,0x19,0x20,0x26,0x26,0x20,0x1c,0x25,0x15,0x0a,0x01,0x1f,0x16,0xa0,0x4a,0x3d,0x4b,0x3d,0x4a,0x63,0x16,0x2d,0x20,0x4a,0x3d,0x4b,0x3d,0x4a,0x63,0x15,0x2e,0x20,0x3c,0x17,0x20,0x1c,0x06,0x54,0x34,0x29,0x22,0x4b,0x22,0x29,0x29,0x22,0x4b,\r\n0x22,0x29,0x17,0x20,0x1c,0x06,0x54,0x34,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x18,0x00,0x22,0x00,0x2c,0x00,0x4f,0x40,0x4c,0x0d,0x0a,0x02,0x04,0x00,0x2b,0x2a,0x1d,0x1c,0x04,0x05,0x04,0x17,0x01,0x02,0x02,0x05,0x03,0x4c,0x00,0x01,0x00,0x01,0x85,0x06,0x01,0x03,0x02,0x03,0x86,0x00,0x00,0x00,0x04,0x05,0x00,\r\n0x04,0x69,0x07,0x01,0x05,0x02,0x02,0x05,0x59,0x07,0x01,0x05,0x05,0x02,0x61,0x00,0x02,0x05,0x02,0x51,0x24,0x23,0x00,0x00,0x23,0x2c,0x24,0x2c,0x20,0x1e,0x00,0x18,0x00,0x18,0x27,0x12,0x27,0x08,0x06,0x19,0x2b,0x33,0x37,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x17,0x37,0x33,0x07,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x22,0x26,\r\n0x27,0x07,0x03,0x14,0x16,0x17,0x13,0x26,0x23,0x22,0x06,0x06,0x13,0x32,0x36,0x36,0x35,0x34,0x26,0x27,0x03,0x16,0x14,0x50,0x33,0x3b,0x51,0x8d,0x58,0x4f,0x43,0x3f,0x47,0x54,0x35,0x3d,0x51,0x8c,0x59,0x2a,0x4c,0x21,0x3a,0x0b,0x24,0x20,0xfc,0x2e,0x36,0x3f,0x63,0x3a,0xdc,0x3f,0x63,0x3a,0x27,0x21,0xfd,0x30,0x77,0x2a,0x7d,0x4a,\r\n0x59,0x8c,0x51,0x22,0x5e,0x7e,0x2a,0x7e,0x4c,0x58,0x8d,0x51,0x13,0x12,0x57,0x01,0x68,0x33,0x57,0x1f,0x01,0x78,0x17,0x3c,0x68,0xfe,0xd8,0x3c,0x69,0x41,0x35,0x59,0x1f,0xfe,0x87,0x1a,0x00,0x01,0x00,0x3c,0x00,0x32,0x02,0x1c,0x02,0x26,0x00,0x0c,0x00,0x1f,0x40,0x1c,0x08,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,\r\n0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x11,0x11,0x04,0x06,0x18,0x2b,0x37,0x13,0x33,0x13,0x23,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x3c,0xb3,0x7a,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x32,0x01,0xf4,0xfe,0x0c,0x01,0x40,0x20,0x3f,0x10,0x10,0x3f,0x20,0xfe,0xc0,0x00,0x00,0x00,0x01,0x00,0x3c,\r\n0x00,0x32,0x02,0x1c,0x02,0x26,0x00,0x0c,0x00,0x1f,0x40,0x1c,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x0c,0x00,0x0c,0x18,0x11,0x04,0x06,0x18,0x2b,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0xef,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,\r\n0x72,0x5b,0xb3,0x32,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0x00,0x00,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,0x02,0xda,0x00,0x13,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x13,0x00,\r\n0x13,0x33,0x13,0x33,0x05,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x11,0x2b,0x75,0x6f,0x3a,0x6f,0x75,0x5a,0x48,0x44,0x36,0x44,0x48,0x01,0xfe,0x6b,0x71,0x71,0x6b,0xfe,0x02,0x01,0xfe,0x44,0x48,0x48,0x44,0xfe,0x02,0x00,0x01,0x00,0x2b,0x00,0x00,0x02,0x2d,\r\n0x02,0xda,0x00,0x13,0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x33,0x13,0x33,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x2b,0x5a,0x48,0x44,0x36,0x44,\r\n0x48,0x5a,0x75,0x6f,0x3a,0x6f,0x75,0x02,0xda,0xfe,0x02,0x44,0x48,0x48,0x44,0x01,0xfe,0xfe,0x02,0x6b,0x71,0x71,0x6b,0x00,0x00,0x01,0x00,0x00,0xff,0x4c,0x02,0x17,0x02,0xda,0x00,0x12,0x00,0x28,0x40,0x25,0x00,0x01,0x00,0x02,0x00,0x01,0x02,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,\r\n0x4f,0x00,0x00,0x00,0x12,0x00,0x11,0x21,0x25,0x21,0x05,0x06,0x19,0x2b,0x15,0x35,0x33,0x32,0x36,0x35,0x11,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x15,0x11,0x14,0x06,0x23,0x69,0x35,0x3e,0x51,0x49,0xa1,0xa1,0x40,0x70,0x5d,0xb4,0x52,0x3d,0x34,0x02,0x40,0x42,0x49,0x50,0x3c,0xfd,0xc1,0x58,0x6b,0x00,0x00,0x00,0xff,0xff,0x00,0x32,\r\n0x00,0x00,0x02,0x26,0x02,0xda,0x02,0x06,0x02,0x54,0x00,0x00,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x02,0xda,0x00,0x0b,0x00,0x2a,0x40,0x27,0x06,0x05,0x02,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,\r\n0x07,0x06,0x1b,0x2b,0x17,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x6e,0x46,0x02,0x08,0x46,0x5a,0xc8,0xb4,0x03,0x3c,0x52,0x52,0xfc,0xc4,0x03,0x3c,0xfc,0xc4,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0x4c,0x02,0x1c,0x02,0xda,0x00,0x0b,0x00,0x37,0x40,0x34,0x08,0x02,0x02,0x02,0x01,0x01,0x4c,0x03,0x01,0x01,0x01,0x01,\r\n0x02,0x02,0x4b,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x05,0x06,0x19,0x2b,0x17,0x35,0x01,0x01,0x35,0x21,0x15,0x21,0x01,0x01,0x21,0x15,0x37,0x01,0x13,0xfe,0xed,0x01,0xe5,0xfe,0x89,0x01,0x12,\r\n0xfe,0xec,0x01,0x79,0xb4,0x52,0x01,0x75,0x01,0x75,0x52,0x52,0xfe,0x8b,0xfe,0x8b,0x52,0x00,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0f,0x00,0x2e,0x40,0x2b,0x00,0x03,0x01,0x03,0x85,0x00,0x01,0x00,0x00,0x02,0x01,0x00,0x67,0x00,0x02,0x04,0x04,0x02,0x57,0x00,0x02,0x02,0x04,0x5f,0x05,0x01,0x04,0x02,\r\n0x04,0x4f,0x00,0x00,0x00,0x0f,0x00,0x0f,0x14,0x14,0x11,0x11,0x06,0x06,0x1a,0x2b,0x21,0x03,0x23,0x35,0x33,0x13,0x16,0x16,0x07,0x33,0x26,0x36,0x37,0x13,0x33,0x03,0x01,0x0c,0x7f,0x6f,0xaf,0x63,0x08,0x06,0x01,0x09,0x01,0x07,0x09,0xa0,0x54,0xd4,0x01,0xd6,0x50,0xfe,0x7b,0x22,0x33,0x0b,0x0b,0x34,0x21,0x02,0x39,0xfd,0x26,0x00,\r\n0x00,0x02,0x00,0x5a,0xff,0xf6,0x01,0xfe,0x02,0xda,0x00,0x1b,0x00,0x29,0x00,0x3f,0x40,0x3c,0x0c,0x0a,0x02,0x03,0x04,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x05,0x01,0x00,0x03,0x00,0x51,0x1d,0x1c,0x01,0x00,0x24,0x22,0x1c,\r\n0x29,0x1d,0x29,0x12,0x11,0x08,0x06,0x00,0x1b,0x01,0x1b,0x07,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x2e,0x02,0x27,0x33,0x30,0x1e,0x03,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x2c,0x62,0x70,0x61,0x57,0x3e,0x4b,0x07,0x02,\r\n0x31,0x4e,0x5a,0x2a,0x87,0x2b,0x40,0x40,0x2b,0x70,0x62,0x3a,0x3e,0x3d,0x3b,0x3a,0x3e,0x3e,0x0a,0x73,0x64,0x50,0x62,0x70,0x37,0x32,0x19,0x36,0x62,0x52,0x3e,0x13,0x1b,0x36,0x4e,0x67,0x3f,0xc8,0x64,0x73,0x50,0x46,0x41,0x50,0x42,0x45,0x46,0x41,0x50,0x41,0x46,0x00,0xff,0xff,0x00,0x5d,0xff,0x4c,0x01,0xfb,0x02,0x26,0x02,0x06,\r\n0x02,0x80,0x00,0x00,0x00,0x02,0x00,0x9b,0x00,0x00,0x01,0xbd,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x63,\r\n0x5a,0xfe,0xde,0x5a,0x02,0xda,0xfd,0x26,0x02,0xda,0xfd,0x26,0x00,0x01,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xff,0x5a,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0xff,0xff,0x88,0x02,0x2b,0x03,0xfc,0x00,0x0a,0x00,0x10,0x40,0x0d,0x0a,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x05,0x2e,0x02,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x02,0x2b,0x5d,0x86,0x49,0x5a,0x71,0x61,0x78,0x17,0x6e,0xa0,0x61,0x02,0xee,0xfd,0x12,0x75,0xa2,0x17,0x00,0x01,0x00,0xff,\r\n0xfe,0xd4,0x02,0x2b,0x03,0x48,0x00,0x0a,0x00,0x16,0x40,0x13,0x06,0x05,0x02,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x0a,0x00,0x0a,0x02,0x06,0x16,0x2b,0x13,0x11,0x34,0x36,0x36,0x37,0x15,0x06,0x06,0x15,0x11,0xff,0x49,0x86,0x5d,0x61,0x71,0xfe,0xd4,0x02,0xee,0x62,0x9f,0x6e,0x17,0x58,0x17,0xa2,0x75,0xfd,0x12,0x00,\r\n0xff,0xff,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x02,0x06,0x04,0x32,0x00,0x00,0x00,0x01,0x00,0x2d,0xff,0x88,0x01,0x59,0x03,0xfc,0x00,0x0a,0x00,0x10,0x40,0x0d,0x01,0x00,0x02,0x00,0x49,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x17,0x35,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x2d,0x62,0x70,0x5a,0x48,0x87,0x78,\r\n0x58,0x17,0xa2,0x75,0x02,0xee,0xfd,0x12,0x61,0xa0,0x6e,0x00,0x00,0x01,0x00,0x2d,0xfe,0xd4,0x01,0x59,0x03,0x48,0x00,0x0a,0x00,0x10,0x40,0x0d,0x06,0x05,0x02,0x00,0x4a,0x00,0x00,0x00,0x76,0x10,0x01,0x06,0x17,0x2b,0x01,0x23,0x11,0x34,0x26,0x27,0x35,0x1e,0x02,0x15,0x01,0x59,0x5a,0x70,0x62,0x5d,0x87,0x48,0xfe,0xd4,0x02,0xee,\r\n0x75,0xa2,0x17,0x58,0x17,0x6e,0x9f,0x62,0x00,0x05,0x00,0x0e,0xff,0xfb,0x02,0x4a,0x02,0xdf,0x00,0x0d,0x00,0x11,0x00,0x1f,0x00,0x2d,0x00,0x3b,0x00,0x99,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x2c,0x0c,0x01,0x04,0x0a,0x01,0x00,0x07,0x04,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,\r\n0x38,0x4d,0x0e,0x01,0x08,0x08,0x03,0x61,0x0d,0x06,0x0b,0x03,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x34,0x0c,0x01,0x04,0x0a,0x01,0x00,0x07,0x04,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x38,0x4d,0x0b,0x01,0x03,0x03,0x39,0x4d,0x0e,0x01,0x08,0x08,0x06,\r\n0x61,0x0d,0x01,0x06,0x06,0x42,0x06,0x4e,0x59,0x40,0x2b,0x2f,0x2e,0x21,0x20,0x13,0x12,0x0e,0x0e,0x01,0x00,0x36,0x34,0x2e,0x3b,0x2f,0x3b,0x28,0x26,0x20,0x2d,0x21,0x2d,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x0f,0x09,0x16,0x2b,0x13,0x22,0x26,0x37,0x35,0x26,0x36,0x33,0x32,\r\n0x16,0x17,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x13,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x22,0x26,0x35,0x35,0x26,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x99,0x40,0x4b,0x01,0x01,0x4b,0x40,0x40,0x4b,0x01,0x4b,0xcc,0x01,\r\n0xf2,0x4a,0xfe,0x0e,0x42,0x1e,0x23,0x23,0x1e,0x1e,0x23,0x23,0x01,0x42,0x40,0x4b,0x01,0x4c,0x40,0x40,0x4b,0x4b,0x40,0x1e,0x23,0x23,0x1f,0x1d,0x23,0x01,0x23,0x01,0x90,0x49,0x3e,0x41,0x3e,0x49,0x49,0x3e,0x41,0x3e,0x49,0xfe,0x70,0x02,0xda,0xfd,0x26,0x01,0xd4,0x24,0x1f,0x41,0x1f,0x24,0x24,0x1f,0x41,0x1f,0x24,0xfe,0x27,0x49,\r\n0x3e,0x41,0x3e,0x49,0x49,0x3e,0x41,0x3e,0x49,0x45,0x23,0x1f,0x41,0x1f,0x24,0x24,0x1f,0x41,0x1f,0x23,0x00,0x06,0xff,0xfb,0xff,0xfb,0x02,0x72,0x02,0xdf,0x00,0x0d,0x00,0x11,0x00,0x1f,0x00,0x39,0x00,0x47,0x00,0x55,0x00,0xb7,0xb6,0x37,0x2a,0x02,0x0a,0x0b,0x01,0x4c,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x31,0x10,0x01,0x04,0x0e,0x01,\r\n0x00,0x07,0x04,0x00,0x69,0x08,0x01,0x07,0x0d,0x01,0x0b,0x0a,0x07,0x0b,0x6a,0x00,0x05,0x05,0x01,0x61,0x02,0x01,0x01,0x01,0x38,0x4d,0x13,0x0c,0x12,0x03,0x0a,0x0a,0x03,0x61,0x09,0x11,0x06,0x0f,0x04,0x03,0x03,0x39,0x03,0x4e,0x1b,0x40,0x39,0x10,0x01,0x04,0x0e,0x01,0x00,0x07,0x04,0x00,0x69,0x08,0x01,0x07,0x0d,0x01,0x0b,0x0a,\r\n0x07,0x0b,0x6a,0x00,0x02,0x02,0x38,0x4d,0x00,0x05,0x05,0x01,0x61,0x00,0x01,0x01,0x38,0x4d,0x0f,0x01,0x03,0x03,0x39,0x4d,0x13,0x0c,0x12,0x03,0x0a,0x0a,0x06,0x61,0x09,0x11,0x02,0x06,0x06,0x42,0x06,0x4e,0x59,0x40,0x37,0x49,0x48,0x3b,0x3a,0x21,0x20,0x13,0x12,0x0e,0x0e,0x01,0x00,0x50,0x4e,0x48,0x55,0x49,0x55,0x42,0x40,0x3a,\r\n0x47,0x3b,0x47,0x35,0x33,0x2e,0x2c,0x28,0x26,0x20,0x39,0x21,0x39,0x1a,0x18,0x12,0x1f,0x13,0x1f,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x14,0x09,0x16,0x2b,0x13,0x22,0x26,0x27,0x35,0x26,0x36,0x33,0x32,0x16,0x17,0x15,0x14,0x06,0x03,0x01,0x33,0x01,0x13,0x32,0x36,0x35,0x35,0x26,0x26,0x23,0x22,0x06,0x15,\r\n0x15,0x14,0x16,0x13,0x22,0x26,0x37,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x27,0x32,0x36,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x33,0x32,0x36,0x37,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x06,0x16,0x7d,0x37,0x40,0x01,0x01,0x41,0x37,\r\n0x37,0x41,0x01,0x40,0xba,0x01,0xb6,0x43,0xfe,0x4a,0x3f,0x1a,0x1f,0x01,0x1e,0x1a,0x1a,0x1f,0x1f,0xf6,0x32,0x3b,0x01,0x3b,0x31,0x26,0x2e,0x02,0x03,0x2f,0x25,0x32,0x3a,0x3a,0x32,0x26,0x2e,0x02,0x04,0x2f,0x1f,0x17,0x1b,0x01,0x1c,0x17,0x17,0x1c,0x01,0x1c,0xbb,0x17,0x1b,0x01,0x1c,0x17,0x17,0x1c,0x01,0x1c,0x01,0xb8,0x3e,0x35,\r\n0x41,0x35,0x3e,0x3e,0x35,0x41,0x35,0x3e,0xfe,0x48,0x02,0xda,0xfd,0x26,0x01,0xf3,0x1f,0x19,0x41,0x1a,0x1e,0x1e,0x1a,0x41,0x19,0x1f,0xfe,0x08,0x40,0x37,0x38,0x38,0x40,0x26,0x20,0x20,0x26,0x40,0x38,0x38,0x37,0x40,0x26,0x20,0x20,0x26,0x35,0x23,0x1f,0x38,0x1f,0x24,0x24,0x1f,0x38,0x1f,0x23,0x23,0x1f,0x38,0x1f,0x24,0x24,0x1f,\r\n0x38,0x1f,0x23,0x00,0x00,0x01,0x00,0x78,0x00,0x00,0x01,0xe0,0x01,0x65,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,\r\n0x2b,0x21,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x07,0x8f,0x8f,0x4a,0x8f,0x8f,0x93,0x40,0x92,0x92,0x40,0x93,0x00,0x00,0x00,0x01,0x00,0xa0,0x01,0x31,0x01,0xb8,0x02,0x49,0x00,0x0b,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,\r\n0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x0b,0x1b,0x2b,0x01,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x01,0x04,0x64,0x64,0x50,0x64,0x64,0x01,0x31,0x69,0x46,0x69,0x69,0x46,0x69,0x00,0x00,0x00,0x00,0x01,0x00,0x37,0x00,0x37,0x02,0x08,0x02,0x58,0x00,0x12,\r\n0x00,0x33,0x40,0x30,0x00,0x02,0x01,0x02,0x85,0x00,0x03,0x01,0x00,0x01,0x03,0x00,0x80,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x03,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x00,0x00,0x00,0x12,0x00,0x12,0x13,0x13,0x11,0x13,0x06,0x06,0x1a,0x2b,0x25,0x2e,0x02,0x23,0x35,0x32,0x36,0x36,0x37,0x33,0x0e,\r\n0x02,0x07,0x1e,0x02,0x17,0x01,0xae,0x08,0x63,0xa3,0x69,0x69,0xa3,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x37,0x45,0x65,0x37,0x64,0x36,0x63,0x43,0x4c,0x73,0x45,0x05,0x07,0x48,0x7a,0x4f,0x00,0x02,0x00,0x37,0x00,0x00,0x02,0x08,0x02,0xd5,0x00,0x12,0x00,0x16,0x00,0x47,0x40,0x44,0x00,0x02,0x01,0x02,0x85,0x00,\r\n0x03,0x01,0x00,0x01,0x03,0x00,0x80,0x07,0x01,0x04,0x00,0x05,0x00,0x04,0x05,0x80,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x13,0x13,0x00,0x00,0x13,0x16,0x13,0x16,0x15,0x14,0x00,0x12,0x00,0x12,0x13,0x13,0x11,0x13,0x09,0x06,0x1a,0x2b,0x25,\r\n0x2e,0x02,0x23,0x35,0x32,0x36,0x36,0x37,0x33,0x0e,0x02,0x07,0x1e,0x02,0x17,0x05,0x35,0x21,0x15,0x01,0xae,0x08,0x63,0xa3,0x69,0x69,0xa3,0x63,0x08,0x5a,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0xfe,0x2f,0x01,0xcc,0xb4,0x45,0x65,0x37,0x64,0x36,0x63,0x43,0x4c,0x73,0x45,0x05,0x07,0x48,0x7a,0x4f,0xb4,0x50,0x50,0x00,0x00,0x00,\r\n0x00,0x04,0x00,0x37,0xff,0xf6,0x02,0x20,0x01,0xfe,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x47,0x40,0x44,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x07,0x01,0x05,0x04,0x04,0x05,0x59,0x07,0x01,0x05,0x05,0x04,0x61,0x0b,0x06,0x0a,0x03,0x04,0x05,0x04,0x51,0x25,0x24,0x19,0x18,0x0d,0x0c,0x01,0x00,0x2b,\r\n0x29,0x24,0x2f,0x25,0x2f,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0xce,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0xfe,0x97,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x01,0x21,0x24,0x2e,0x2e,0x24,0x24,0x2e,0x2e,0x01,0x5c,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,\r\n0xfe,0x9a,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x2d,0x24,0x24,0x2d,0x00,0x00,0x00,0x04,0x00,0x55,0x00,0x4c,0x02,0x03,0x03,0x17,0x00,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0xaa,0x4b,0xb0,0x24,0x50,0x58,0x40,0x3b,0x0b,0x01,0x04,0x03,0x06,0x03,0x04,0x72,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,\r\n0x00,0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x06,0x0c,0x01,0x05,0x07,0x06,0x05,0x69,0x00,0x07,0x0d,0x01,0x08,0x09,0x07,0x08,0x67,0x00,0x09,0x0a,0x0a,0x09,0x57,0x00,0x09,0x09,0x0a,0x5f,0x0e,0x01,0x0a,0x09,0x0a,0x4f,0x1b,0x40,0x3c,0x0b,0x01,0x04,0x03,0x06,0x03,0x04,0x06,0x80,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,\r\n0x00,0x03,0x04,0x00,0x03,0x69,0x00,0x06,0x0c,0x01,0x05,0x07,0x06,0x05,0x69,0x00,0x07,0x0d,0x01,0x08,0x09,0x07,0x08,0x67,0x00,0x09,0x0a,0x0a,0x09,0x57,0x00,0x09,0x09,0x0a,0x5f,0x0e,0x01,0x0a,0x09,0x0a,0x4f,0x59,0x40,0x25,0x24,0x24,0x20,0x20,0x15,0x14,0x00,0x00,0x24,0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x22,0x21,\r\n0x1b,0x19,0x14,0x1f,0x15,0x1f,0x00,0x13,0x00,0x13,0x24,0x21,0x24,0x21,0x0f,0x06,0x1a,0x2b,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xff,0x49,0x18,0x1d,0x1d,0x18,\r\n0x86,0x87,0x33,0x3d,0x3d,0x33,0x13,0x1c,0x12,0x15,0x15,0x12,0x12,0x15,0x15,0xd7,0x01,0xae,0xfe,0x52,0x01,0xae,0x02,0x21,0x55,0x1d,0x18,0x18,0x1d,0x37,0x3a,0x32,0x2f,0x38,0x23,0x73,0x14,0x10,0x11,0x13,0x13,0x11,0x10,0x14,0x8a,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0xff,0xff,0x00,0xd9,0xff,0xf6,0x01,0x7f,0x02,0x30,0x02,0x06,\r\n0x03,0x2b,0x00,0x00,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x3a,0x02,0xa8,0x00,0x15,0x00,0x19,0x00,0x3c,0x40,0x39,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x06,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x16,0x16,0x01,0x00,0x16,0x19,0x16,0x19,\r\n0x18,0x17,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x08,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x05,0x35,0x21,0x15,0x01,0x09,0x45,0x67,0x3a,0x3a,0x67,0x45,0x01,0x31,0xfe,0xcf,0x43,0x49,0x49,0x43,0x01,0x31,0xfd,0xf8,0x02,0x08,\r\n0xc8,0x36,0x63,0x41,0x2c,0x42,0x62,0x36,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0xc8,0x52,0x52,0x00,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x35,0x02,0xa8,0x00,0x15,0x00,0x19,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,\r\n0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x16,0x16,0x00,0x00,0x16,0x19,0x16,0x19,0x18,0x17,0x00,0x15,0x00,0x14,0x21,0x25,0x21,0x08,0x06,0x19,0x2b,0x37,0x35,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x05,0x35,0x21,0x15,0x1e,0x01,0x31,0x43,0x49,0x49,0x43,0xfe,0xcf,\r\n0x01,0x31,0x45,0x67,0x3a,0x3a,0x67,0x45,0xfe,0xcf,0x02,0x08,0xc8,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x36,0x62,0x42,0x2c,0x41,0x63,0x36,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0xff,0xb0,0x00,0x4b,0x02,0xa8,0x01,0xdb,0x00,0x31,0x00,0x4c,0x40,0x49,0x14,0x09,0x02,0x01,0x00,0x2c,0x21,0x1a,0x13,0x08,0x01,0x06,0x06,0x01,0x2b,0x20,\r\n0x02,0x05,0x06,0x03,0x4c,0x04,0x02,0x02,0x00,0x01,0x00,0x85,0x0a,0x09,0x07,0x03,0x05,0x06,0x05,0x86,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,0x01,0x06,0x52,0x00,0x00,0x00,0x31,0x00,0x31,0x27,0x11,0x27,0x12,0x17,0x21,0x17,0x21,0x12,0x0b,0x06,0x1f,0x2b,0x27,0x37,0x27,0x33,0x17,0x33,\r\n0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x33,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x07,0x50,0x9f,0x9f,0x6a,0x7d,0x88,0x11,0x28,0x0d,0x07,0x19,0x0d,0x57,0x6a,0x7d,0x18,0x11,0x28,0x0d,0x07,\r\n0x19,0x0d,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0x18,0x7d,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0x88,0x7d,0x4b,0xc8,0xc8,0xa0,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xa0,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xc8,0xc8,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0xa0,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0xa0,0x00,\r\n0x00,0x01,0x00,0x73,0xff,0x92,0x01,0x59,0x03,0xfc,0x00,0x0a,0x00,0x26,0x40,0x23,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x03,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x06,0x04,0x02,0x00,0x0a,0x01,0x0a,0x04,0x06,0x16,0x2b,0x17,0x23,0x35,0x33,0x32,0x35,0x11,0x33,0x11,0x14,0x06,0xa0,\r\n0x2d,0x2d,0x5f,0x5a,0x60,0x6e,0x50,0x56,0x03,0xc4,0xfc,0x3c,0x4f,0x57,0x00,0x00,0x00,0x01,0x00,0xff,0xfe,0xd4,0x02,0x2b,0x03,0xfc,0x00,0x16,0x00,0x2a,0x40,0x27,0x05,0x01,0x03,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x03,0x00,0x86,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,\r\n0x21,0x24,0x18,0x10,0x04,0x06,0x1a,0x2b,0x01,0x23,0x11,0x34,0x36,0x37,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x01,0x59,0x5a,0x34,0x31,0x32,0x33,0x5a,0x0e,0x2b,0x2b,0x6e,0x6e,0x2b,0x2b,0x0e,0xfe,0xd4,0x02,0x08,0x39,0x4a,0x09,0x09,0x4a,0x39,0x02,0x08,0xfd,0xf8,0x23,0x2d,0x14,\r\n0x50,0x14,0x2c,0x24,0x00,0x01,0x00,0x73,0xfe,0xd4,0x01,0x59,0x03,0x3e,0x00,0x0a,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x59,0x00,0x02,0x02,0x01,0x61,0x00,0x01,0x02,0x01,0x51,0x21,0x22,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x11,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x01,0x59,0x5a,0x5f,0x2d,\r\n0x2d,0x59,0x60,0xfe,0xd4,0x03,0xc4,0x56,0x50,0x57,0x4f,0x00,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x58,0x02,0x9b,0x00,0x08,0x00,0x0b,0x00,0x08,0xb5,0x0a,0x09,0x04,0x03,0x02,0x32,0x2b,0x11,0x37,0x05,0x01,0x11,0x01,0x05,0x27,0x25,0x05,0x11,0x07,0x23,0x01,0x09,0x01,0x2c,0xfe,0xd3,0xfe,0xf7,0x22,0x01,0x07,0x01,0x1f,0xd6,0x02,\r\n0x58,0x25,0xf3,0x01,0x11,0xfd,0x97,0x01,0x13,0xf1,0x23,0xf0,0xc2,0x01,0x86,0xc3,0xff,0xff,0x00,0xff,0xfe,0xd4,0x01,0x59,0x03,0xfc,0x02,0x06,0x03,0xf4,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0x92,0x01,0x59,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,\r\n0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x05,0x23,0x35,0x33,0x11,0x33,0x01,0x59,0xf5,0x9b,0x5a,0x6e,0x50,0x04,0x1a,0x00,0x00,0x01,0x00,0x64,0xfe,0xd4,0x01,0x59,0x03,0x3e,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,\r\n0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x11,0x23,0x35,0x33,0x01,0x59,0x5a,0x9b,0xf5,0xfe,0xd4,0x04,0x1a,0x50,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,\r\n0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x31,0x11,0x33,0x15,0x21,0x15,0x21,0x11,0x5a,0x01,0xfe,0xfe,0x02,0x02,0x58,0xff,0x50,0xfe,0xf7,0x00,0x00,0x04,0x00,0x55,0x00,0x4c,0x02,0x03,0x02,0xd1,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x52,0x40,0x4f,0x00,0x01,0x00,0x03,0x02,0x01,\r\n0x03,0x69,0x09,0x01,0x02,0x08,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x1c,0x1c,0x18,0x18,0x0d,0x0c,0x01,0x00,0x1c,0x1f,0x1c,0x1f,0x1e,0x1d,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,\r\n0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x07,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x01,0x2c,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0xbc,0x01,0xae,0xfe,0x52,\r\n0x01,0xae,0x01,0xed,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0xfe,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x00,0x02,0x00,0xb4,0x00,0xd2,0x01,0xa4,0x01,0xc2,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,\r\n0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,\r\n0x2d,0x2d,0x23,0x23,0x2d,0x2d,0xd2,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0xff,0xff,0x00,0x46,0x00,0xfa,0x02,0x12,0x01,0xc7,0x02,0x06,0x04,0x22,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x17,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,\r\n0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x00,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x21,0x11,0x23,0x11,0x21,0x11,0x3c,0x01,0xe0,0x5a,0xfe,0xd4,0x02,0x17,0xfd,0xe9,0x01,0xc5,0xfe,0x3b,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0x17,0x00,0x07,\r\n0x00,0x20,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x5f,0x00,0x03,0x01,0x03,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x3c,0x5a,0x01,0x2c,0x5a,0xfe,0x20,0x02,0x17,0xfe,0x3b,0x01,0xc5,0xfd,0xe9,0x00,0x00,0x00,0x00,0x03,0x00,0x00,\r\n0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x07,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x09,0x08,0x00,0x00,0x0f,0x0d,0x08,0x13,0x09,0x13,0x07,0x06,0x05,0x04,\r\n0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xfa,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x1e,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0xce,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,\r\n0x00,0x03,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3b,0x40,0x38,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x07,0x01,0x05,0x02,0x04,0x05,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,\r\n0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x35,0x21,0x15,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x5a,0x01,0x40,0x1e,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0xde,0x50,0x50,0x00,0x05,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x06,0x00,0x09,\r\n0x00,0x0c,0x00,0x0f,0x00,0x33,0x40,0x30,0x0c,0x0b,0x09,0x08,0x04,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x0f,0x0e,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x01,0x37,0x21,\r\n0x17,0x17,0x11,0x05,0x27,0x11,0x37,0x07,0x21,0x02,0x58,0xfe,0xd2,0xc2,0xfe,0x7a,0xf7,0xc9,0xfe,0xd0,0xc4,0xf8,0xcb,0x01,0x94,0x1e,0x02,0x58,0xfd,0xa8,0x01,0x64,0xc2,0xf6,0xc7,0x01,0x90,0xc9,0xc6,0xfe,0x76,0x91,0xcb,0x00,0x00,0x05,0x00,0x00,0x00,0x1e,0x02,0x58,0x02,0x76,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,\r\n0x00,0x4e,0x40,0x4b,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x04,0x0b,0x02,0x03,0x09,0x01,0x06,0x07,0x03,0x06,0x67,0x08,0x0c,0x02,0x07,0x01,0x01,0x07,0x57,0x08,0x0c,0x02,0x07,0x07,0x01,0x5f,0x0a,0x01,0x01,0x07,0x01,0x4f,0x0c,0x0c,0x04,0x04,0x00,0x00,0x13,0x12,0x11,0x10,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x0b,0x0a,0x09,\r\n0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0d,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x01,0x35,0x23,0x15,0x21,0x33,0x35,0x23,0x13,0x35,0x23,0x15,0x21,0x33,0x35,0x23,0x02,0x58,0xfe,0xa8,0xce,0x01,0x26,0xce,0xce,0xce,0xce,0xfe,0xda,0xce,0xce,0x1e,0x02,0x58,0xfd,0xa8,0x01,0x54,0xd2,0xd2,0xd2,0xfe,0x0c,0xd2,\r\n0xd2,0xd2,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x5a,0x02,0x3a,0x02,0x3a,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x37,0x11,0x21,0x15,0x21,0x11,\r\n0x21,0x15,0x23,0x02,0x17,0xfe,0x43,0x01,0xbd,0x5a,0x01,0xe0,0x52,0xfe,0xc4,0x52,0x00,0x02,0x00,0x23,0x00,0x00,0x02,0x3a,0x02,0xa8,0x00,0x07,0x00,0x0b,0x00,0x39,0x40,0x36,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x06,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,\r\n0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x37,0x11,0x21,0x15,0x21,0x11,0x21,0x15,0x05,0x35,0x21,0x15,0x23,0x02,0x17,0xfe,0x43,0x01,0xbd,0xfd,0xe9,0x02,0x17,0xc8,0x01,0xe0,0x52,0xfe,0xc4,0x52,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0x00,0x1e,\r\n0x00,0x5a,0x02,0x35,0x02,0x3a,0x00,0x07,0x00,0x22,0x40,0x1f,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x25,0x21,0x35,0x21,0x11,0x21,0x35,0x21,0x02,0x35,0xfd,0xe9,0x01,0xbd,0xfe,0x43,0x02,0x17,0x5a,0x52,\r\n0x01,0x3c,0x52,0x00,0x00,0x02,0x00,0x1e,0x00,0x00,0x02,0x35,0x02,0xa8,0x00,0x07,0x00,0x0b,0x00,0x39,0x40,0x36,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,\r\n0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x37,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x05,0x35,0x21,0x15,0x1e,0x01,0xbd,0xfe,0x43,0x02,0x17,0xfd,0xe9,0x02,0x17,0xc8,0x52,0x01,0x3c,0x52,0xfe,0x20,0xc8,0x52,0x52,0x00,0x00,0x00,0x01,0x00,0xb4,0x00,0xda,0x01,0xa4,0x01,0xd0,0x00,0x09,0x00,0x18,0x40,0x15,\r\n0x04,0x01,0x00,0x4a,0x09,0x08,0x07,0x01,0x04,0x00,0x49,0x01,0x01,0x00,0x00,0x76,0x12,0x12,0x02,0x06,0x18,0x2b,0x37,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0xe3,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0xda,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,0x00,0x00,0x00,0x04,0x00,0x55,0x00,0x54,0x02,0x03,0x02,0x40,0x00,0x03,\r\n0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00,0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,\r\n0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x55,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0xfe,0x52,0x01,0xae,0x02,0x04,0x3c,0x3c,0x90,0x3c,0x3c,0x90,\r\n0x3c,0x3c,0x90,0x3c,0x3c,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x00,0x78,0x02,0x3a,0x02,0x58,0x00,0x15,0x00,0x2b,0x40,0x28,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x03,0x00,0x4f,0x01,0x00,0x14,0x12,0x0d,0x0b,0x0a,0x08,0x00,0x15,0x01,0x15,0x05,0x06,0x16,\r\n0x2b,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x21,0x15,0x01,0x09,0x45,0x67,0x3a,0x3a,0x67,0x45,0x01,0x31,0xfe,0xcf,0x43,0x49,0x49,0x43,0x01,0x31,0x78,0x36,0x63,0x41,0x2c,0x42,0x62,0x36,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x00,0x01,0x00,0x50,0x00,0x37,0x02,0x21,\r\n0x02,0x58,0x00,0x12,0x00,0x33,0x40,0x30,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x02,0x03,0x02,0x00,0x03,0x80,0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x00,0x03,0x02,0x59,0x00,0x02,0x02,0x03,0x61,0x00,0x03,0x02,0x03,0x51,0x00,0x00,0x00,0x12,0x00,0x12,0x11,0x13,0x13,0x14,0x06,0x06,0x1a,0x2b,0x37,0x3e,0x02,0x37,0x2e,0x02,0x27,\r\n0x33,0x1e,0x02,0x33,0x15,0x22,0x06,0x06,0x07,0x50,0x09,0x56,0x8f,0x5c,0x5c,0x8f,0x56,0x09,0x5a,0x09,0x62,0xa3,0x69,0x69,0xa3,0x62,0x09,0x37,0x4f,0x7a,0x48,0x07,0x05,0x45,0x73,0x4c,0x43,0x63,0x36,0x64,0x37,0x65,0x45,0x00,0x00,0x01,0x00,0x23,0x00,0x46,0x02,0x3a,0x02,0x8a,0x00,0x1b,0x00,0x32,0x40,0x2f,0x00,0x04,0x00,0x03,\r\n0x02,0x04,0x03,0x67,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x1b,0x00,0x1a,0x21,0x24,0x11,0x14,0x21,0x07,0x06,0x1b,0x2b,0x37,0x35,0x21,0x32,0x36,0x36,0x35,0x35,0x21,0x35,0x21,0x35,0x34,0x26,0x26,0x23,0x21,0x35,0x21,0x32,\r\n0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x23,0x23,0x01,0x31,0x28,0x3f,0x25,0xfe,0x43,0x01,0xbd,0x25,0x3f,0x28,0xfe,0xcf,0x01,0x31,0x3f,0x68,0x3f,0x3f,0x68,0x3f,0x46,0x50,0x27,0x40,0x25,0x1e,0x50,0x1e,0x25,0x40,0x27,0x50,0x39,0x63,0x3e,0x90,0x3e,0x63,0x39,0x00,0x00,0x00,0x02,0x00,0x37,0xff,0x4c,0x02,0x1c,0x02,0xda,0x00,0x0b,\r\n0x00,0x11,0x00,0x3a,0x40,0x37,0x11,0x0e,0x08,0x03,0x02,0x01,0x06,0x02,0x01,0x01,0x4c,0x00,0x00,0x05,0x01,0x01,0x02,0x00,0x01,0x67,0x04,0x01,0x02,0x03,0x03,0x02,0x57,0x04,0x01,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x10,0x0f,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x12,0x11,0x14,0x07,0x06,0x19,0x2b,0x17,0x35,\r\n0x13,0x03,0x35,0x21,0x15,0x21,0x13,0x03,0x21,0x15,0x25,0x33,0x13,0x03,0x23,0x13,0x37,0xfa,0xfa,0x01,0xe5,0xfe,0xb4,0xfa,0xfa,0x01,0x4c,0xfe,0x46,0x41,0xfd,0xfd,0x41,0xfc,0xb4,0x32,0x01,0x94,0x01,0x96,0x32,0x2e,0xfe,0x62,0xfe,0x6c,0x2e,0x2e,0x01,0x98,0x01,0x9a,0xfe,0x66,0x00,0x00,0x00,0x01,0x00,0x1e,0x00,0x78,0x02,0x35,\r\n0x02,0x58,0x00,0x15,0x00,0x28,0x40,0x25,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x15,0x00,0x14,0x21,0x25,0x21,0x05,0x06,0x19,0x2b,0x37,0x35,0x21,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x21,0x35,0x21,0x32,0x16,0x16,0x15,0x15,\r\n0x14,0x06,0x06,0x23,0x1e,0x01,0x31,0x43,0x49,0x49,0x43,0xfe,0xcf,0x01,0x31,0x45,0x67,0x3a,0x3a,0x67,0x45,0x78,0x52,0x48,0x42,0x28,0x42,0x48,0x52,0x36,0x62,0x42,0x2c,0x41,0x63,0x36,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,\r\n0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x33,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xff,0xff,0x02,0x58,0xff,0x02,0x08,0x50,0x50,0xfd,0xf8,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x24,0x40,0x21,0x00,0x03,0x02,0x03,\r\n0x85,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x10,0x04,0x06,0x1a,0x2b,0x21,0x23,0x11,0x21,0x35,0x21,0x35,0x33,0x02,0x58,0x5a,0xfe,0x02,0x01,0xfe,0x5a,0x01,0x09,0x50,0xff,0x00,0x00,0x00,0x03,0x00,0x43,0xff,0x92,0x01,0xf4,0x03,0x3e,0x00,0x13,\r\n0x00,0x16,0x00,0x1a,0x00,0x96,0xb5,0x15,0x01,0x02,0x03,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x33,0x00,0x05,0x04,0x05,0x85,0x00,0x08,0x07,0x07,0x08,0x71,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0e,0x0a,0x02,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x07,0x07,0x00,0x57,0x0c,0x01,0x00,0x00,0x07,0x5f,\r\n0x0d,0x09,0x02,0x07,0x00,0x07,0x4f,0x1b,0x40,0x32,0x00,0x05,0x04,0x05,0x85,0x00,0x08,0x07,0x08,0x86,0x06,0x01,0x04,0x00,0x03,0x02,0x04,0x03,0x67,0x0e,0x0a,0x02,0x02,0x0b,0x01,0x01,0x00,0x02,0x01,0x67,0x0c,0x01,0x00,0x07,0x07,0x00,0x57,0x0c,0x01,0x00,0x00,0x07,0x5f,0x0d,0x09,0x02,0x07,0x00,0x07,0x4f,0x59,0x40,0x1c,0x14,\r\n0x14,0x00,0x00,0x1a,0x19,0x18,0x17,0x14,0x16,0x14,0x16,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x06,0x1f,0x2b,0x33,0x35,0x33,0x13,0x23,0x35,0x33,0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x33,0x11,0x21,0x07,0x23,0x37,0x01,0x35,0x07,0x17,0x23,0x03,0x33,0x50,0x39,0x5f,0x75,0x93,0x53,0xfe,0xf7,0x01,\r\n0x27,0x25,0x46,0x25,0x37,0xfe,0xbd,0x28,0x46,0x28,0x01,0x2f,0x4e,0x4e,0x6c,0x5f,0xcb,0x52,0x01,0x02,0x52,0xe2,0x52,0x64,0x64,0xfd,0x26,0x6e,0x6e,0x01,0xa6,0xd4,0xd4,0x52,0xfe,0xfe,0x00,0x03,0x00,0x1d,0xff,0xf6,0x02,0x3b,0x02,0x30,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x3c,0x40,0x39,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,\r\n0x69,0x05,0x01,0x03,0x02,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x61,0x08,0x04,0x07,0x03,0x02,0x03,0x02,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,\r\n0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xe9,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0x6f,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x01,0xb0,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0xfe,0x46,0x23,0x1e,0x1d,0x22,\r\n0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x00,0x03,0x00,0x41,0x00,0x26,0x02,0x17,0x02,0x6f,0x00,0x1b,0x00,0x37,0x00,0x53,0x01,0x0c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x65,0x00,0x02,0x00,0x04,0x01,0x02,0x72,0x12,0x01,0x05,0x01,0x03,0x04,0x05,0x72,0x00,0x08,0x06,0x0a,0x07,0x08,0x72,0x13,0x01,0x0b,0x07,0x09,\r\n0x0a,0x0b,0x72,0x00,0x0e,0x0c,0x10,0x0d,0x0e,0x72,0x14,0x01,0x11,0x0d,0x0f,0x10,0x11,0x72,0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x00,0x0a,0x07,0x06,0x0a,0x69,0x00,0x07,0x00,0x09,0x0c,0x07,0x09,0x6a,0x00,0x0c,0x00,0x10,0x0d,0x0c,0x10,0x69,0x00,0x0d,0x11,0x0f,0x0d,0x59,\r\n0x00,0x0d,0x0d,0x0f,0x62,0x00,0x0f,0x0d,0x0f,0x52,0x1b,0x40,0x6b,0x00,0x02,0x00,0x04,0x00,0x02,0x04,0x80,0x12,0x01,0x05,0x01,0x03,0x01,0x05,0x03,0x80,0x00,0x08,0x06,0x0a,0x06,0x08,0x0a,0x80,0x13,0x01,0x0b,0x07,0x09,0x07,0x0b,0x09,0x80,0x00,0x0e,0x0c,0x10,0x0c,0x0e,0x10,0x80,0x14,0x01,0x11,0x0d,0x0f,0x0d,0x11,0x0f,0x80,\r\n0x00,0x00,0x00,0x04,0x01,0x00,0x04,0x69,0x00,0x01,0x00,0x03,0x06,0x01,0x03,0x6a,0x00,0x06,0x00,0x0a,0x07,0x06,0x0a,0x69,0x00,0x07,0x00,0x09,0x0c,0x07,0x09,0x6a,0x00,0x0c,0x00,0x10,0x0d,0x0c,0x10,0x69,0x00,0x0d,0x11,0x0f,0x0d,0x59,0x00,0x0d,0x0d,0x0f,0x62,0x00,0x0f,0x0d,0x0f,0x52,0x59,0x40,0x2e,0x38,0x38,0x1c,0x1c,0x00,\r\n0x00,0x38,0x53,0x38,0x53,0x50,0x4e,0x4b,0x49,0x46,0x45,0x42,0x40,0x3d,0x3b,0x1c,0x37,0x1c,0x37,0x34,0x32,0x2f,0x2d,0x2a,0x29,0x26,0x24,0x21,0x1f,0x00,0x1b,0x00,0x1b,0x23,0x23,0x13,0x23,0x23,0x15,0x06,0x1b,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,\r\n0x22,0x06,0x15,0x15,0x07,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x07,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x41,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,\r\n0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2e,0x2b,0x18,0x16,0x19,0x55,0x46,0x3c,0x26,0x39,0x2f,0x2b,0x17,0x16,0x19,0x01,0xd9,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,\r\n0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0xd7,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0xd7,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x18,0x20,0x18,0x18,0x15,0x1e,0x00,0x00,0x00,0x02,0x00,0x32,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x33,\r\n0x40,0x30,0x0b,0x01,0x03,0x04,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x01,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x01,0x04,0x4f,0x00,0x00,0x10,0x0f,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x06,0x06,0x19,0x2b,0x33,0x03,0x33,0x17,0x33,0x37,0x33,0x03,0x27,0x16,0x16,0x17,0x36,\r\n0x36,0x37,0x37,0x23,0xef,0xbd,0x5b,0x32,0xd9,0x32,0x5c,0xbe,0x60,0x0d,0x13,0x04,0x05,0x12,0x0d,0x36,0xb4,0x02,0xda,0xca,0xca,0xfd,0x26,0xeb,0x34,0x5a,0x17,0x17,0x59,0x34,0xda,0x00,0x00,0x03,0xff,0xf6,0x00,0x19,0x02,0x62,0x02,0x83,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x06,0x01,0x00,0x03,0x01,0x00,\r\n0x69,0x00,0x03,0x07,0x01,0x02,0x05,0x03,0x02,0x69,0x00,0x05,0x04,0x04,0x05,0x59,0x00,0x05,0x05,0x04,0x61,0x08,0x01,0x04,0x05,0x04,0x51,0x19,0x18,0x0d,0x0c,0x01,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,\r\n0x15,0x14,0x06,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x1c,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xfe,0xf1,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0xfe,0xf0,0x20,0x27,0x27,0x20,0x20,0x26,0x26,0x01,0xf7,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,\r\n0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0xef,0x27,0x1f,0x20,0x26,0x26,0x20,0x1f,0x27,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x21,0x40,0x1e,0x00,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x02,0x02,0x01,0x57,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x11,0x11,0x11,0x10,0x04,\r\n0x06,0x1a,0x2b,0x13,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0xff,0x5a,0xff,0xfd,0xa8,0xff,0x02,0x58,0xfd,0xf8,0x50,0x50,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xbc,0x00,0x0c,0x00,0x10,0x00,0x39,0x40,0x36,0x06,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x05,0x01,0x02,0x03,0x02,0x85,0x00,0x03,0x04,0x04,\r\n0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x06,0x01,0x04,0x03,0x04,0x4f,0x0d,0x0d,0x00,0x00,0x0d,0x10,0x0d,0x10,0x0f,0x0e,0x00,0x0c,0x00,0x0c,0x18,0x11,0x07,0x06,0x18,0x2b,0x37,0x03,0x33,0x13,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x33,0x03,0x05,0x35,0x21,0x15,0xef,0xb3,0x5c,0x75,0x0c,0x11,0x04,0x04,0x12,0x0b,0x72,0x5b,0xb3,0xfe,\r\n0xec,0x01,0xae,0xc8,0x01,0xf4,0xfe,0xc0,0x20,0x3e,0x11,0x11,0x3e,0x20,0x01,0x40,0xfe,0x0c,0xc8,0x50,0x50,0x00,0x00,0x00,0x00,0x06,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x1a,0x00,0x25,0x00,0x32,0x00,0x3f,0x00,0x4b,0x00,0x40,0x40,0x3d,0x4a,0x46,0x42,0x3e,0x3a,0x36,0x30,0x2c,0x27,0x25,0x22,0x1e,0x1a,0x17,\r\n0x13,0x0f,0x02,0x01,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x04,0x01,0x02,0x00,0x00,0x02,0x59,0x04,0x01,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x41,0x40,0x01,0x00,0x40,0x4b,0x41,0x4b,0x09,0x07,0x00,0x0f,0x01,0x0f,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,\r\n0x03,0x16,0x16,0x17,0x26,0x26,0x35,0x35,0x06,0x06,0x07,0x25,0x14,0x06,0x07,0x36,0x36,0x37,0x37,0x26,0x26,0x27,0x13,0x17,0x36,0x36,0x35,0x34,0x27,0x07,0x06,0x06,0x07,0x16,0x16,0x25,0x14,0x16,0x17,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x06,0x01,0x32,0x37,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x16,0x01,0x2c,0x58,0x8d,\r\n0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xd9,0x11,0x38,0x17,0x05,0x05,0x3c,0x60,0x1c,0x01,0x0c,0x06,0x05,0x18,0x37,0x12,0x62,0x1c,0x60,0x3c,0x55,0x3b,0x23,0x27,0x05,0x62,0x12,0x3e,0x1c,0x14,0x2e,0xfe,0x89,0x27,0x23,0x3b,0x0d,0x2d,0x14,0x1c,0x3e,0x12,0x62,0x05,0x01,0x04,0x3f,0x36,0x3b,0x0c,0x22,0x0c,0x0c,0x22,0x0c,\r\n0x3b,0x36,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x96,0x06,0x1a,0x0e,0x1a,0x37,0x13,0x6b,0x09,0x42,0x32,0x12,0x13,0x37,0x1a,0x0e,0x1a,0x06,0x24,0x32,0x42,0x09,0xfe,0x9b,0x55,0x23,0x5f,0x37,0x1b,0x1b,0x25,0x07,0x10,0x04,0x14,0x35,0x53,0x37,0x5f,0x23,0x55,0x12,0x34,0x14,0x04,0x10,0x07,0x25,\r\n0x1b,0xfe,0xe1,0x1a,0x56,0x11,0x3c,0x1a,0x1a,0x3b,0x12,0x56,0x1a,0x00,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x18,0x00,0x21,0x00,0x42,0x40,0x3f,0x00,0x01,0x07,0x01,0x02,0x03,0x01,0x02,0x69,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x67,0x08,0x01,0x04,0x00,0x00,0x04,0x59,0x08,0x01,0x04,0x04,\r\n0x00,0x61,0x06,0x01,0x00,0x04,0x00,0x51,0x1a,0x19,0x11,0x10,0x01,0x00,0x1e,0x1d,0x19,0x21,0x1a,0x21,0x15,0x14,0x10,0x18,0x11,0x18,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x06,0x07,0x21,0x2e,0x02,0x03,0x32,0x36,0x36,\r\n0x37,0x21,0x1e,0x02,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x43,0x6e,0x47,0x09,0x02,0x02,0x09,0x47,0x6e,0x43,0x43,0x6e,0x47,0x09,0xfd,0xfe,0x09,0x47,0x6e,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x39,0x63,0x40,0x40,0x63,0x39,0xfd,0xf8,0x39,0x63,0x40,0x40,\r\n0x63,0x39,0x00,0x00,0x00,0x04,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x16,0x00,0x20,0x00,0x27,0x00,0x4e,0x40,0x4b,0x00,0x01,0x09,0x01,0x02,0x03,0x01,0x02,0x69,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x67,0x0a,0x01,0x06,0x00,0x00,0x06,0x59,0x0a,0x01,0x06,0x06,0x00,0x61,\r\n0x08,0x01,0x00,0x06,0x00,0x51,0x22,0x21,0x11,0x10,0x01,0x00,0x25,0x24,0x21,0x27,0x22,0x27,0x1f,0x1e,0x1a,0x19,0x14,0x13,0x10,0x16,0x11,0x16,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0b,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x21,0x26,0x26,0x01,0x14,0x17,\r\n0x21,0x36,0x35,0x34,0x27,0x21,0x06,0x01,0x32,0x36,0x37,0x21,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4b,0x78,0x20,0x01,0xc6,0x20,0x78,0xfe,0xb1,0x04,0x02,0x00,0x04,0x04,0xfe,0x00,0x04,0x01,0x04,0x4b,0x78,0x20,0xfe,0x3a,0x20,0x78,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,\r\n0x58,0x8d,0x51,0x02,0x3a,0x47,0x3b,0x3b,0x47,0xfe,0xfc,0x1a,0x18,0x18,0x1a,0x1a,0x18,0x18,0xfe,0xe2,0x47,0x3b,0x3b,0x47,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x19,0x00,0x23,0x00,0x3a,0x40,0x37,0x22,0x21,0x14,0x13,0x04,0x03,0x02,0x01,0x4c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x69,0x05,0x01,0x03,\r\n0x00,0x00,0x03,0x59,0x05,0x01,0x03,0x03,0x00,0x61,0x04,0x01,0x00,0x03,0x00,0x51,0x1b,0x1a,0x01,0x00,0x1a,0x23,0x1b,0x23,0x17,0x15,0x09,0x07,0x00,0x0f,0x01,0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x14,0x16,0x17,0x01,0x26,0x23,0x22,0x06,0x06,0x01,0x32,\r\n0x36,0x36,0x35,0x34,0x26,0x27,0x01,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xfe,0xa3,0x2f,0x28,0x01,0x21,0x36,0x3e,0x4a,0x76,0x44,0x01,0x04,0x4a,0x76,0x44,0x33,0x2b,0xfe,0xde,0x39,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,0x3c,0x66,0x23,0x01,0xaf,0x1a,0x44,\r\n0x76,0xfe,0xb2,0x44,0x76,0x4a,0x3f,0x69,0x23,0xfe,0x4f,0x1e,0x00,0x03,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x42,0x40,0x3f,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x00,0x04,0x08,0x01,0x05,0x02,0x04,0x05,0x67,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,\r\n0x00,0x02,0x00,0x51,0x20,0x20,0x11,0x10,0x01,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,\r\n0x27,0x35,0x21,0x15,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x56,0x01,0x40,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xdc,0x50,0x50,0x00,0x00,0x00,\r\n0x00,0x05,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x17,0x00,0x1f,0x00,0x27,0x00,0x2f,0x00,0x46,0x40,0x43,0x2d,0x2c,0x2b,0x25,0x24,0x23,0x1f,0x19,0x15,0x14,0x13,0x0b,0x03,0x02,0x01,0x4c,0x00,0x01,0x05,0x01,0x02,0x03,0x01,0x02,0x69,0x06,0x01,0x03,0x00,0x00,0x03,0x59,0x06,0x01,0x03,0x03,0x00,0x61,0x04,0x01,\r\n0x00,0x03,0x00,0x51,0x29,0x28,0x11,0x10,0x01,0x00,0x28,0x2f,0x29,0x2f,0x10,0x17,0x11,0x17,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x17,0x37,0x26,0x26,0x13,0x17,0x36,0x36,0x35,0x34,0x26,0x27,0x05,0x14,0x16,0x17,\r\n0x37,0x27,0x06,0x06,0x01,0x32,0x36,0x37,0x27,0x07,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x2e,0x51,0x21,0x9e,0x9f,0x20,0x50,0x04,0x9f,0x19,0x1b,0x1b,0x18,0xfe,0x2b,0x1a,0x18,0x9c,0x9c,0x18,0x1a,0x01,0x04,0x2d,0x4f,0x20,0x9e,0x9d,0x21,0x50,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,\r\n0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x1b,0x19,0x9d,0x9f,0x18,0x1a,0xfe,0xfb,0x9e,0x20,0x51,0x2e,0x2e,0x50,0x21,0x9f,0x2d,0x50,0x20,0x9c,0x9d,0x20,0x4f,0xfe,0xcf,0x1a,0x17,0x9f,0x9d,0x18,0x1b,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0x6c,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x42,0x40,0x3f,0x00,0x01,0x00,0x03,\r\n0x05,0x01,0x03,0x69,0x00,0x05,0x08,0x01,0x04,0x02,0x05,0x04,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x21,0x22,0x26,0x26,\r\n0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,\r\n0x76,0x4a,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xcc,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x00,0x05,0xff,0xf6,0x00,0x14,0x02,0x62,0x02,0x80,0x00,0x0f,0x00,0x15,0x00,0x1b,0x00,0x21,0x00,0x27,\r\n0x00,0x4b,0x40,0x48,0x17,0x15,0x02,0x02,0x01,0x27,0x1d,0x02,0x00,0x04,0x02,0x4c,0x00,0x01,0x02,0x01,0x85,0x06,0x01,0x00,0x04,0x00,0x86,0x07,0x03,0x02,0x02,0x04,0x04,0x02,0x57,0x07,0x03,0x02,0x02,0x02,0x04,0x5f,0x05,0x08,0x02,0x04,0x02,0x04,0x4f,0x1c,0x1c,0x16,0x16,0x01,0x00,0x23,0x22,0x1c,0x21,0x1c,0x21,0x16,0x1b,0x16,\r\n0x1b,0x11,0x10,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x33,0x2e,0x02,0x27,0x07,0x35,0x0e,0x02,0x07,0x05,0x15,0x3e,0x02,0x37,0x21,0x23,0x1e,0x02,0x17,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x2d,0xd5,\r\n0x08,0x3a,0x5b,0x38,0x58,0x38,0x5b,0x3a,0x08,0x01,0x2d,0x38,0x5b,0x3a,0x08,0xfe,0xd3,0xd5,0x08,0x3a,0x5b,0x38,0x14,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x5e,0x39,0x5b,0x3c,0x09,0xd9,0xd9,0x09,0x3c,0x5b,0x39,0x50,0xd9,0x09,0x3c,0x5b,0x39,0x39,0x5b,0x3c,0x09,0x00,0x00,0x00,0x00,0x01,0x00,0x28,\r\n0x00,0x00,0x02,0x30,0x02,0xe4,0x00,0x0e,0x00,0x15,0x40,0x12,0x0e,0x0d,0x0c,0x0b,0x07,0x04,0x00,0x07,0x00,0x4a,0x00,0x00,0x00,0x76,0x15,0x01,0x06,0x17,0x2b,0x01,0x27,0x26,0x26,0x27,0x11,0x23,0x11,0x06,0x06,0x07,0x07,0x35,0x25,0x05,0x02,0x30,0xb4,0x10,0x16,0x02,0x50,0x04,0x14,0x0e,0xb6,0x01,0x03,0x01,0x05,0x01,0x99,0xa0,\r\n0x0e,0x1c,0x07,0xfd,0x96,0x02,0x6a,0x09,0x1c,0x0c,0xa2,0x6b,0xe2,0xe1,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0xed,0x02,0x1c,0x02,0xda,0x00,0x0e,0x00,0x26,0x40,0x23,0x0a,0x09,0x08,0x04,0x03,0x05,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0c,0x11,\r\n0x03,0x06,0x17,0x2b,0x13,0x37,0x21,0x11,0x07,0x11,0x34,0x36,0x37,0x01,0x27,0x01,0x06,0x06,0x23,0x4c,0x4f,0x01,0x81,0x53,0x05,0x05,0xfe,0x95,0x39,0x01,0x6e,0x0a,0x24,0x14,0x02,0x8b,0x4f,0xfe,0x7b,0x53,0x01,0x1a,0x10,0x22,0x0b,0xfe,0x94,0x39,0x01,0x6e,0x07,0x02,0x00,0x01,0x00,0x14,0x00,0x32,0x02,0x4e,0x02,0x62,0x00,0x0d,\r\n0x00,0x30,0x40,0x2d,0x0c,0x01,0x00,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x14,0x11,0x13,0x05,0x06,0x19,0x2b,0x25,0x37,0x36,0x37,0x21,0x35,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,\r\n0x01,0x0a,0x9e,0x1a,0x1a,0xfe,0x38,0x01,0xc3,0x0c,0x19,0x0a,0x9e,0x69,0xdb,0xdc,0x32,0xc9,0x22,0x05,0x50,0x05,0x14,0x0d,0xca,0xfe,0xe9,0xfe,0xe7,0x00,0x00,0x00,0x00,0x01,0x00,0x2f,0x00,0x00,0x02,0x1c,0x01,0xed,0x00,0x0e,0x00,0x20,0x40,0x1d,0x0c,0x0b,0x07,0x06,0x05,0x05,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,\r\n0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x1a,0x30,0x02,0x06,0x18,0x2b,0x37,0x21,0x32,0x16,0x17,0x01,0x37,0x01,0x26,0x26,0x35,0x11,0x17,0x11,0x21,0x4c,0x01,0x0f,0x14,0x24,0x0a,0xfe,0x92,0x39,0x01,0x6b,0x05,0x05,0x53,0xfe,0x7f,0x4f,0x02,0x07,0x01,0x6e,0x39,0xfe,0x94,0x0b,0x22,0x10,0x01,0x1a,0x53,0xfe,0x7b,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x28,0xff,0xf6,0x02,0x30,0x02,0xda,0x00,0x0e,0x00,0x15,0x40,0x12,0x0b,0x08,0x04,0x03,0x02,0x01,0x00,0x07,0x00,0x49,0x00,0x00,0x00,0x76,0x19,0x01,0x06,0x17,0x2b,0x01,0x15,0x05,0x25,0x35,0x17,0x16,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x37,0x02,0x30,0xfe,0xfb,0xfe,0xfd,0xb6,0x0e,0x14,0x04,0x50,0x02,0x16,0x10,\r\n0x01,0x41,0x6a,0xe1,0xe2,0x6b,0xa2,0x0c,0x1c,0x09,0x02,0x6a,0xfd,0x96,0x08,0x1b,0x0e,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0x00,0x02,0x29,0x01,0xed,0x00,0x0e,0x00,0x27,0x40,0x24,0x0a,0x09,0x08,0x04,0x03,0x05,0x01,0x4a,0x02,0x01,0x01,0x00,0x00,0x01,0x57,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,\r\n0x00,0x0e,0x00,0x0c,0x11,0x03,0x06,0x17,0x2b,0x25,0x07,0x21,0x11,0x37,0x11,0x14,0x06,0x07,0x01,0x17,0x01,0x36,0x36,0x33,0x02,0x0c,0x4f,0xfe,0x7f,0x53,0x05,0x05,0x01,0x6b,0x39,0xfe,0x92,0x0b,0x23,0x14,0x4f,0x4f,0x01,0x85,0x53,0xfe,0xe6,0x10,0x22,0x0b,0x01,0x6c,0x39,0xfe,0x92,0x07,0x02,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,\r\n0x00,0x32,0x02,0x44,0x02,0x62,0x00,0x0d,0x00,0x2a,0x40,0x27,0x02,0x01,0x03,0x02,0x01,0x4c,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x03,0x00,0x86,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x11,0x14,0x12,0x10,0x04,0x06,0x1a,0x2b,0x25,0x23,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,\r\n0x16,0x17,0x01,0x4e,0x68,0xdc,0xdb,0x69,0x9e,0x0a,0x19,0x0c,0x01,0xc3,0xfe,0x38,0x1a,0x1a,0x32,0x01,0x19,0x01,0x17,0xca,0x0d,0x14,0x05,0x50,0x05,0x22,0x00,0x00,0x00,0x01,0x00,0x3c,0x00,0xed,0x02,0x29,0x02,0xda,0x00,0x0e,0x00,0x20,0x40,0x1d,0x0c,0x0b,0x07,0x06,0x05,0x05,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,\r\n0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1a,0x30,0x02,0x06,0x18,0x2b,0x01,0x21,0x22,0x26,0x27,0x01,0x07,0x01,0x16,0x16,0x15,0x11,0x27,0x11,0x21,0x02,0x0c,0xfe,0xf1,0x14,0x23,0x0b,0x01,0x6e,0x39,0xfe,0x95,0x05,0x05,0x53,0x01,0x81,0x02,0x8b,0x02,0x07,0xfe,0x92,0x39,0x01,0x6c,0x0b,0x22,0x10,0xfe,0xe6,0x53,0x01,0x85,0x00,\r\n0x00,0x01,0xff,0xb0,0x00,0x32,0x02,0xa8,0x02,0x62,0x00,0x17,0x00,0x35,0x40,0x32,0x12,0x05,0x02,0x05,0x02,0x01,0x4c,0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x17,0x00,0x17,0x12,0x14,0x14,0x12,0x13,0x07,\r\n0x06,0x1b,0x2b,0x13,0x16,0x17,0x17,0x23,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x37,0x22,0x1a,0x1a,0x9e,0x68,0xdc,0xdb,0x69,0x9e,0x0a,0x19,0x0c,0x02,0x0a,0x0c,0x19,0x0a,0x9e,0x69,0xdb,0xdc,0x68,0x9e,0x1a,0x1a,0x01,0x22,0x05,0x22,0xc9,0x01,0x19,0x01,0x17,0xca,0x0d,0x14,\r\n0x05,0x05,0x14,0x0d,0xca,0xfe,0xe9,0xfe,0xe7,0xc9,0x22,0x05,0x00,0x01,0x00,0x28,0xff,0x56,0x02,0x30,0x03,0x84,0x00,0x19,0x00,0x06,0xb3,0x19,0x0c,0x01,0x32,0x2b,0x37,0x35,0x17,0x16,0x16,0x17,0x11,0x06,0x06,0x07,0x07,0x35,0x25,0x05,0x15,0x27,0x26,0x26,0x27,0x11,0x36,0x36,0x37,0x37,0x15,0x05,0x28,0xb6,0x0e,0x14,0x04,0x04,\r\n0x14,0x0e,0xb6,0x01,0x03,0x01,0x05,0xb4,0x10,0x16,0x02,0x02,0x16,0x10,0xb4,0xfe,0xfb,0x38,0x6b,0xa2,0x0c,0x1c,0x09,0x03,0x3a,0x09,0x1c,0x0c,0xa2,0x6b,0xe2,0xe1,0x6a,0xa0,0x0e,0x1c,0x07,0xfc,0xc6,0x08,0x1b,0x0e,0xa0,0x6a,0xe1,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0xa0,0x02,0x4e,0x01,0xbd,0x00,0x21,0x00,0x7d,0x40,0x0a,\r\n0x11,0x01,0x02,0x03,0x14,0x01,0x06,0x00,0x02,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x29,0x08,0x01,0x07,0x01,0x04,0x06,0x07,0x72,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x00,0x00,0x06,0x01,0x00,0x06,0x69,0x00,0x01,0x07,0x04,0x01,0x59,0x00,0x01,0x01,0x04,0x61,0x05,0x01,0x04,0x01,0x04,0x51,0x1b,0x40,0x2a,0x08,0x01,0x07,\r\n0x01,0x04,0x01,0x07,0x04,0x80,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x00,0x00,0x06,0x01,0x00,0x06,0x69,0x00,0x01,0x07,0x04,0x01,0x59,0x00,0x01,0x01,0x04,0x61,0x05,0x01,0x04,0x01,0x04,0x51,0x59,0x40,0x10,0x00,0x00,0x00,0x21,0x00,0x21,0x24,0x23,0x12,0x11,0x12,0x24,0x23,0x09,0x06,0x1d,0x2b,0x37,0x35,0x34,0x36,0x33,\r\n0x32,0x1e,0x03,0x33,0x32,0x37,0x37,0x23,0x35,0x33,0x17,0x15,0x23,0x35,0x07,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x0a,0x4c,0x3a,0x23,0x2c,0x1d,0x15,0x17,0x11,0x1d,0x1c,0x55,0x8c,0xcd,0x46,0x50,0x4d,0x33,0x47,0x22,0x2c,0x1c,0x16,0x18,0x12,0x14,0x1f,0xa5,0x31,0x3d,0x4b,0x17,0x21,0x21,0x17,0x21,0x60,0x4e,0x46,\r\n0xd7,0xa1,0x60,0x41,0x17,0x21,0x21,0x17,0x20,0x1a,0x31,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x25,0x00,0x7f,0x40,0x0c,0x14,0x02,0x02,0x01,0x07,0x15,0x01,0x02,0x06,0x01,0x02,0x4c,0x4b,0xb0,0x0b,0x50,0x58,0x40,0x29,0x04,0x01,0x00,0x02,0x00,0x85,0x0a,0x09,0x02,0x05,0x06,0x06,0x05,0x71,0x00,0x02,0x00,\r\n0x07,0x01,0x02,0x07,0x69,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,0x01,0x06,0x52,0x1b,0x40,0x28,0x04,0x01,0x00,0x02,0x00,0x85,0x0a,0x09,0x02,0x05,0x06,0x05,0x86,0x00,0x02,0x00,0x07,0x01,0x02,0x07,0x69,0x03,0x01,0x01,0x06,0x06,0x01,0x59,0x03,0x01,0x01,0x01,0x06,0x62,0x08,0x01,0x06,\r\n0x01,0x06,0x52,0x59,0x40,0x12,0x00,0x00,0x00,0x25,0x00,0x25,0x23,0x23,0x21,0x13,0x11,0x23,0x23,0x21,0x13,0x0b,0x06,0x1f,0x2b,0x37,0x27,0x35,0x37,0x33,0x07,0x33,0x32,0x3e,0x02,0x33,0x32,0x1e,0x02,0x33,0x33,0x27,0x33,0x17,0x15,0x07,0x23,0x37,0x23,0x22,0x2e,0x02,0x23,0x22,0x0e,0x02,0x23,0x23,0x17,0x8d,0x83,0x83,0x5e,0x98,\r\n0x34,0x11,0x1e,0x22,0x2b,0x1f,0x1f,0x2b,0x22,0x1e,0x11,0x47,0x98,0x69,0x79,0x79,0x68,0x6e,0x1e,0x24,0x2b,0x1c,0x1b,0x15,0x15,0x1b,0x1b,0x29,0x23,0x0d,0x6e,0x5f,0x91,0x46,0x91,0xa5,0x20,0x2b,0x20,0x20,0x2b,0x20,0xa5,0x91,0x46,0x91,0x74,0x20,0x29,0x20,0x20,0x29,0x20,0x74,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,\r\n0x01,0xc7,0x00,0x11,0x00,0x68,0xb6,0x04,0x03,0x02,0x05,0x02,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x22,0x03,0x01,0x01,0x02,0x02,0x01,0x70,0x06,0x01,0x00,0x05,0x05,0x00,0x71,0x04,0x01,0x02,0x05,0x05,0x02,0x57,0x04,0x01,0x02,0x02,0x05,0x60,0x08,0x07,0x02,0x05,0x02,0x05,0x50,0x1b,0x40,0x20,0x03,0x01,0x01,0x02,0x01,0x85,\r\n0x06,0x01,0x00,0x05,0x00,0x86,0x04,0x01,0x02,0x05,0x05,0x02,0x57,0x04,0x01,0x02,0x02,0x05,0x60,0x08,0x07,0x02,0x05,0x02,0x05,0x50,0x59,0x40,0x10,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x11,0x11,0x11,0x13,0x11,0x09,0x06,0x1d,0x2b,0x37,0x17,0x23,0x27,0x35,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x21,0x15,0x21,0x17,0x23,0x27,\r\n0x69,0x82,0x5e,0x83,0x83,0x5f,0x83,0x81,0x81,0x61,0x88,0x01,0x0a,0xfe,0xf5,0x88,0x60,0x81,0xeb,0x8c,0x91,0x46,0x91,0x8c,0x8c,0x8c,0x50,0x8c,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x11,0x00,0x61,0xb6,0x0f,0x0e,0x02,0x00,0x03,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x21,0x06,0x01,0x04,\r\n0x03,0x03,0x04,0x70,0x07,0x01,0x01,0x00,0x00,0x01,0x71,0x05,0x01,0x03,0x00,0x00,0x03,0x57,0x05,0x01,0x03,0x03,0x00,0x60,0x02,0x01,0x00,0x03,0x00,0x50,0x1b,0x40,0x1f,0x06,0x01,0x04,0x03,0x04,0x85,0x07,0x01,0x01,0x00,0x01,0x86,0x05,0x01,0x03,0x00,0x00,0x03,0x57,0x05,0x01,0x03,0x03,0x00,0x60,0x02,0x01,0x00,0x03,0x00,0x50,\r\n0x59,0x40,0x0b,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x08,0x06,0x1e,0x2b,0x25,0x23,0x07,0x23,0x37,0x21,0x35,0x21,0x27,0x33,0x17,0x33,0x27,0x33,0x17,0x15,0x07,0x23,0x01,0xef,0x81,0x81,0x60,0x88,0xfe,0xf5,0x01,0x0a,0x88,0x61,0x81,0x81,0x83,0x5f,0x83,0x83,0x5e,0xeb,0x8c,0x8c,0x50,0x8c,0x8c,0x8c,0x91,0x46,0x91,0x00,0x00,\r\n0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0e,0x00,0x61,0xb7,0x0b,0x04,0x03,0x03,0x05,0x02,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1f,0x03,0x01,0x01,0x02,0x02,0x01,0x70,0x04,0x01,0x00,0x05,0x05,0x00,0x71,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x06,0x01,0x05,0x02,0x05,0x50,0x1b,0x40,0x1d,\r\n0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x06,0x01,0x05,0x02,0x05,0x50,0x59,0x40,0x0e,0x00,0x00,0x00,0x0e,0x00,0x0e,0x12,0x11,0x11,0x13,0x11,0x07,0x06,0x1b,0x2b,0x37,0x17,0x23,0x27,0x35,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0x17,0x23,0x27,0x69,0x82,\r\n0x5e,0x83,0x83,0x5f,0x83,0x01,0x00,0x7d,0x68,0x9c,0x9c,0x67,0x7d,0xeb,0x8c,0x91,0x46,0x91,0x8c,0x8c,0xb3,0xb5,0x8c,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0e,0x00,0x5a,0xb7,0x0c,0x0b,0x04,0x03,0x00,0x03,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1e,0x04,0x01,0x02,0x03,0x03,0x02,0x70,0x05,0x01,0x01,\r\n0x00,0x00,0x01,0x71,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x60,0x00,0x00,0x03,0x00,0x50,0x1b,0x40,0x1c,0x04,0x01,0x02,0x03,0x02,0x85,0x05,0x01,0x01,0x00,0x01,0x86,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x60,0x00,0x00,0x03,0x00,0x50,0x59,0x40,0x09,0x13,0x11,0x11,0x12,0x11,0x10,0x06,0x06,0x1c,0x2b,\r\n0x25,0x21,0x07,0x23,0x37,0x27,0x33,0x17,0x21,0x27,0x33,0x17,0x15,0x07,0x23,0x01,0xef,0xfe,0xff,0x7d,0x67,0x9c,0x9c,0x68,0x7d,0x01,0x00,0x83,0x5f,0x83,0x83,0x5e,0xeb,0x8c,0xb5,0xb3,0x8c,0x8c,0x91,0x46,0x91,0x00,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xea,0x02,0x26,0x00,0x0d,0x00,0x32,0x40,0x2f,0x0a,0x09,0x08,0x05,\r\n0x04,0x03,0x06,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x14,0x14,0x11,0x05,0x06,0x19,0x2b,0x33,0x35,0x33,0x11,0x07,0x35,0x37,0x33,0x17,0x15,0x27,0x11,0x33,0x15,0x6e,0x92,0x92,0x9c,0x46,0x9a,\r\n0x92,0x92,0x50,0x01,0x6a,0x84,0x65,0x8b,0x8a,0x66,0x83,0xfe,0x97,0x50,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x5f,0x02,0x4e,0x01,0xc7,0x00,0x0d,0x00,0x60,0xb6,0x08,0x07,0x02,0x04,0x01,0x01,0x4c,0x4b,0xb0,0x09,0x50,0x58,0x40,0x1f,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x06,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x04,0x04,\r\n0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x1b,0x40,0x1d,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x13,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x37,0x11,\r\n0x33,0x15,0x21,0x27,0x33,0x17,0x15,0x07,0x23,0x37,0x21,0x15,0x0a,0x52,0x01,0x93,0x83,0x5f,0x83,0x83,0x5e,0x82,0xfe,0x6d,0x5f,0x01,0x68,0x8c,0x8c,0x91,0x46,0x91,0x8c,0x8c,0x00,0x00,0x00,0x01,0x00,0x6e,0x00,0x00,0x01,0xea,0x02,0x26,0x00,0x0d,0x00,0x2b,0x40,0x28,0x0b,0x0a,0x09,0x06,0x05,0x04,0x06,0x02,0x01,0x01,0x4c,0x00,\r\n0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x14,0x14,0x11,0x10,0x04,0x06,0x1a,0x2b,0x13,0x21,0x15,0x23,0x11,0x37,0x15,0x07,0x23,0x27,0x35,0x17,0x11,0x23,0x6e,0x01,0x7c,0x92,0x92,0x9a,0x46,0x9c,0x92,0x92,0x02,0x26,0x50,0xfe,0x97,0x83,0x66,0x8a,0x8b,0x65,0x84,\r\n0x01,0x6a,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x82,0x02,0x44,0x02,0x12,0x00,0x03,0x00,0x12,0x00,0x2e,0x40,0x2b,0x0b,0x01,0x05,0x02,0x01,0x4c,0x03,0x01,0x01,0x02,0x01,0x85,0x04,0x01,0x00,0x05,0x00,0x86,0x00,0x02,0x05,0x05,0x02,0x57,0x00,0x02,0x02,0x05,0x60,0x00,0x05,0x02,0x05,0x50,0x14,0x12,0x14,0x11,0x11,0x10,0x06,0x06,\r\n0x1c,0x2b,0x25,0x23,0x11,0x33,0x05,0x21,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x21,0x02,0x44,0x55,0x55,0xfd,0xbc,0x01,0x57,0x05,0x15,0x0b,0x65,0x61,0xa0,0xa0,0x61,0x66,0x08,0x14,0x08,0xfe,0xa9,0x82,0x01,0x90,0xa0,0x02,0x14,0x0d,0x7d,0xc8,0xc8,0x80,0x0a,0x12,0x04,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,\r\n0x00,0x6e,0x02,0x4e,0x02,0xda,0x00,0x1e,0x00,0x3d,0x40,0x3a,0x01,0x01,0x04,0x01,0x01,0x4c,0x00,0x00,0x02,0x01,0x02,0x00,0x01,0x80,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x69,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x00,0x00,0x00,0x1e,0x00,0x1e,0x26,0x21,\r\n0x24,0x33,0x12,0x07,0x06,0x1b,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x23,0x16,0x16,0x17,0x17,0xaa,0xa0,0xa0,0x61,0x65,0x0a,0x16,0x05,0xcb,0x4b,0x5d,0x5d,0x4b,0x1e,0x1e,0x4d,0x74,0x41,0x41,0x74,0x4d,0xcb,0x08,0x14,0x08,0x66,\r\n0x6e,0xc8,0xc8,0x7d,0x0d,0x14,0x02,0x50,0x46,0x45,0x51,0x50,0x3f,0x69,0x3e,0x46,0x68,0x38,0x04,0x12,0x0a,0x80,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x6e,0x02,0x4e,0x02,0xda,0x00,0x1e,0x00,0x37,0x40,0x34,0x1e,0x01,0x01,0x04,0x01,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x00,0x03,0x05,\r\n0x02,0x03,0x69,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x60,0x00,0x01,0x04,0x01,0x50,0x14,0x24,0x21,0x26,0x24,0x10,0x06,0x06,0x1c,0x2b,0x25,0x23,0x37,0x36,0x36,0x37,0x23,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x26,0x26,0x27,0x27,0x33,0x17,0x01,0xae,0x61,0x66,\r\n0x08,0x14,0x08,0xcb,0x4c,0x75,0x41,0x41,0x75,0x4c,0x1e,0x1e,0x4b,0x5d,0x5d,0x4b,0xcb,0x05,0x15,0x0b,0x65,0x61,0xa0,0x6e,0x80,0x0a,0x12,0x04,0x38,0x68,0x46,0x3e,0x69,0x3f,0x50,0x51,0x45,0x46,0x50,0x02,0x14,0x0d,0x7d,0xc8,0x00,0x01,0x00,0xff,0xff,0x4c,0x01,0xf4,0x03,0x47,0x00,0x05,0x00,0x18,0x40,0x15,0x04,0x03,0x02,0x01,\r\n0x04,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x02,0x06,0x16,0x2b,0x17,0x11,0x17,0x15,0x27,0x11,0xff,0xf5,0xc3,0xb4,0x03,0xfb,0xee,0x41,0xbd,0xfc,0x77,0x00,0x00,0x01,0x00,0x0a,0xff,0xd9,0x02,0x4e,0x02,0x52,0x00,0x11,0x00,0x77,0x40,0x11,0x0d,0x0c,0x02,0x02,0x03,0x0e,0x05,0x02,0x01,0x02,0x10,0x0f,\r\n0x02,0x00,0x01,0x03,0x4c,0x4b,0xb0,0x0b,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,\r\n0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x11,0x00,0x11,0x11,0x11,0x12,0x11,0x11,0x07,0x06,0x1b,0x2b,0x05,0x37,0x21,0x35,0x21,0x27,0x37,0x21,0x35,0x21,0x27,0x33,0x17,0x15,0x07,0x17,0x15,0x07,0x01,0x8b,0x62,0xfe,0x1d,\r\n0x01,0xe3,0x62,0x62,0xfe,0x1d,0x01,0xe3,0x62,0x62,0x61,0x61,0x61,0x61,0x27,0x77,0x50,0x77,0x74,0x50,0x77,0x7d,0x44,0x7a,0x7d,0x44,0x7d,0x00,0x00,0x02,0xff,0xf6,0xff,0x4c,0x02,0x62,0x03,0x47,0x00,0x05,0x00,0x0b,0x00,0x24,0x40,0x21,0x0a,0x09,0x08,0x07,0x04,0x03,0x02,0x01,0x08,0x00,0x4a,0x03,0x01,0x02,0x03,0x00,0x00,0x76,\r\n0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x00,0x05,0x00,0x05,0x04,0x06,0x16,0x2b,0x05,0x11,0x17,0x15,0x27,0x11,0x23,0x11,0x07,0x35,0x37,0x11,0x01,0x6d,0xf5,0xc3,0xe6,0xc3,0xf5,0xb4,0x03,0xfb,0xee,0x41,0xbd,0xfc,0x77,0x03,0x89,0xbd,0x41,0xee,0xfc,0x05,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x0d,\r\n0x00,0x6c,0xb6,0x0c,0x05,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,\r\n0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x12,0x11,0x11,0x07,0x06,0x1b,0x2b,0x25,0x37,0x21,0x35,0x21,0x37,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x01,0x07,0x6a,0xfe,\r\n0x8f,0x01,0xb0,0x3f,0x3f,0xfe,0x50,0x01,0x71,0x6a,0x69,0xe8,0xe7,0x23,0x87,0x50,0x50,0x50,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x02,0xff,0xf6,0xff,0x42,0x02,0x62,0x03,0x3d,0x00,0x05,0x00,0x0b,0x00,0x18,0x40,0x15,0x0b,0x0a,0x09,0x08,0x05,0x04,0x03,0x02,0x08,0x00,0x49,0x01,0x01,0x00,0x00,0x76,0x15,0x10,0x02,0x06,0x18,0x2b,\r\n0x01,0x33,0x11,0x37,0x15,0x07,0x03,0x33,0x11,0x27,0x35,0x17,0x01,0x6d,0x32,0xc3,0xf5,0xb4,0x32,0xf5,0xc3,0x03,0x3d,0xfc,0x77,0xbd,0x41,0xee,0x03,0xfb,0xfc,0x05,0xee,0x41,0xbd,0x00,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x0d,0x00,0x65,0xb6,0x09,0x02,0x02,0x04,0x03,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,\r\n0x24,0x00,0x01,0x02,0x02,0x01,0x70,0x00,0x00,0x05,0x05,0x00,0x71,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x68,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x1b,0x40,0x22,0x00,0x01,0x02,0x01,0x85,0x00,0x00,0x05,0x00,0x86,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x68,0x00,0x04,0x05,0x05,0x04,0x57,\r\n0x00,0x04,0x04,0x05,0x5f,0x00,0x05,0x04,0x05,0x4f,0x59,0x40,0x09,0x11,0x12,0x11,0x11,0x12,0x10,0x06,0x06,0x1c,0x2b,0x25,0x23,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x01,0x51,0x6a,0xe7,0xe8,0x69,0x6a,0x01,0x71,0xfe,0x50,0x3f,0x3f,0x01,0xb0,0xfe,0x8f,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x50,0x50,0x50,\r\n0x00,0x02,0xff,0xb0,0x00,0x23,0x02,0xa8,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,\r\n0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,\r\n0x11,0x11,0x12,0x09,0x06,0x1b,0x2b,0x37,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0x97,0xe7,0xe8,0x69,0x6a,0x01,0x2a,0x6a,0x69,0xe8,0xe7,0x6a,0x6a,0xfe,0xd6,0x6a,0xa9,0x01,0xa8,0x3f,0x3f,0xfe,0x58,0x3f,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,\r\n0xd7,0x50,0x50,0x50,0x00,0x01,0x00,0x00,0x00,0x23,0x02,0x58,0x02,0x71,0x00,0x10,0x00,0x7d,0xb5,0x0d,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x2d,0x00,0x05,0x04,0x04,0x05,0x70,0x00,0x06,0x07,0x07,0x06,0x71,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x68,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x07,0x07,\r\n0x00,0x57,0x00,0x00,0x00,0x07,0x5f,0x08,0x01,0x07,0x00,0x07,0x4f,0x1b,0x40,0x2b,0x00,0x05,0x04,0x05,0x85,0x00,0x06,0x07,0x06,0x86,0x00,0x04,0x00,0x03,0x02,0x04,0x03,0x68,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x07,0x07,0x00,0x57,0x00,0x00,0x00,0x07,0x5f,0x08,0x01,0x07,0x00,0x07,0x4f,0x59,0x40,0x10,0x00,0x00,\r\n0x00,0x10,0x00,0x10,0x12,0x11,0x11,0x11,0x11,0x11,0x11,0x09,0x06,0x1d,0x2b,0x35,0x35,0x21,0x37,0x21,0x35,0x21,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x01,0x87,0x49,0xfe,0x30,0x01,0xd0,0x49,0xfe,0x79,0x01,0x4a,0x43,0x69,0xe8,0xe7,0x6a,0x43,0x78,0x4e,0x5d,0x4e,0x5d,0x4e,0x55,0xfe,0xd9,0xfe,0xd9,0x55,0x00,0x00,\r\n0x00,0x02,0x00,0x14,0x00,0x00,0x02,0x44,0x03,0x16,0x00,0x0c,0x00,0x13,0x00,0x31,0x40,0x2e,0x0e,0x0c,0x02,0x03,0x4a,0x06,0x05,0x02,0x03,0x02,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x00,0x01,0x04,0x01,0x4f,0x0d,0x0d,0x0d,0x13,0x0d,0x13,0x11,0x14,0x13,0x33,0x10,0x07,0x06,0x1b,\r\n0x2b,0x01,0x23,0x11,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x11,0x23,0x01,0x13,0x27,0x07,0x33,0x11,0x33,0x11,0x02,0x44,0x9b,0x21,0x1b,0x82,0x1b,0x21,0x9b,0x01,0x18,0xc0,0xbf,0xbf,0x70,0x9c,0x01,0xe5,0xfe,0x57,0x1b,0x21,0x21,0x1b,0x01,0xa9,0x01,0x31,0xfe,0xf4,0xcf,0xcf,0xfe,0x21,0x01,0xdf,0x00,0x00,0x00,0x00,0x02,0x00,0x00,\r\n0x00,0x32,0x02,0x58,0x02,0x6c,0x00,0x0c,0x00,0x13,0x00,0x33,0x40,0x30,0x0e,0x0c,0x02,0x03,0x02,0x01,0x4c,0x0f,0x0b,0x02,0x01,0x4a,0x0d,0x00,0x02,0x00,0x49,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x11,0x16,0x25,0x21,0x04,0x06,0x1a,0x2b,0x25,\r\n0x35,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x35,0x01,0x05,0x37,0x27,0x15,0x21,0x15,0x21,0x01,0x27,0xeb,0x1b,0x21,0x21,0x1b,0xeb,0x01,0x31,0xfe,0xfb,0xc7,0xc7,0xfe,0xdc,0x01,0x24,0x32,0xa4,0x21,0x1b,0x7a,0x1b,0x21,0xa4,0xfe,0xe3,0xbb,0xbb,0xba,0x6c,0x9c,0x00,0x01,0x00,0x0a,0xff,0xf6,0x02,0x4e,0x01,0x56,0x00,0x05,\r\n0x00,0x06,0xb3,0x04,0x00,0x01,0x32,0x2b,0x05,0x25,0x35,0x05,0x25,0x15,0x01,0x2b,0xfe,0xdf,0x01,0x27,0x01,0x1d,0x0a,0xf6,0x69,0xf9,0xfa,0x69,0x00,0x03,0xff,0xf6,0x01,0xae,0x02,0x62,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x3e,0x40,0x3b,0x0c,0x01,0x04,0x01,0x01,0x4c,0x09,0x01,0x00,0x4a,0x07,0x05,0x02,0x04,0x01,0x04,\r\n0x86,0x03,0x01,0x00,0x01,0x01,0x00,0x57,0x03,0x01,0x00,0x00,0x01,0x5f,0x02,0x06,0x02,0x01,0x00,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0b,0x0a,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x03,0x35,0x33,0x15,0x21,0x23,0x35,0x33,0x01,0x13,0x13,0x23,0x27,0x07,0x0a,0xb4,0x01,0xb8,0xb4,0xb4,\r\n0xfd,0xd5,0xf5,0xf5,0x5f,0x96,0x96,0x02,0x8a,0x50,0x50,0x50,0xfe,0xd4,0x01,0x2c,0xfe,0xd4,0xb9,0xb9,0x00,0x01,0x00,0x0a,0x00,0x78,0x02,0x4e,0x02,0x1c,0x00,0x16,0x00,0x2f,0x40,0x2c,0x16,0x01,0x01,0x02,0x01,0x4c,0x05,0x01,0x01,0x01,0x4b,0x00,0x03,0x02,0x03,0x85,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,\r\n0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x16,0x31,0x27,0x10,0x04,0x06,0x1a,0x2b,0x25,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x01,0x9e,0x95,0x56,0x0c,0x1c,0x0c,0x13,0x26,0x0b,0xfe,0xbb,0x01,0x41,0x1a,0x26,0x06,0x05,0x18,0x10,0x57,0x91,0xb0,0x78,\r\n0x68,0x0f,0x1c,0x08,0x04,0x01,0x03,0x6e,0x01,0x02,0x04,0x05,0x19,0x13,0x69,0xd2,0x00,0x01,0x00,0x05,0x00,0x64,0x02,0x4e,0x02,0x30,0x00,0x27,0x00,0x39,0x40,0x36,0x25,0x18,0x02,0x01,0x02,0x01,0x4c,0x09,0x01,0x01,0x01,0x4b,0x00,0x03,0x02,0x03,0x85,0x04,0x01,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,\r\n0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x01,0x00,0x23,0x21,0x17,0x13,0x0f,0x0c,0x00,0x27,0x01,0x27,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x37,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x17,0x17,0x07,0x06,0x01,\r\n0x75,0x17,0x22,0x0e,0x08,0x1a,0x26,0x06,0x13,0x28,0x11,0xfe,0xf5,0x19,0x23,0x23,0x19,0x01,0x07,0x1a,0x2a,0x0c,0x0a,0x23,0x14,0x11,0x0d,0x22,0x17,0x1d,0x11,0xae,0xad,0x10,0x64,0x22,0x17,0x14,0x10,0x09,0x1e,0x27,0x04,0x04,0x01,0x03,0x20,0x17,0x17,0x20,0x02,0x02,0x04,0x09,0x23,0x15,0x13,0x10,0x14,0x17,0x20,0x19,0xcd,0xcf,\r\n0x17,0x00,0x00,0x00,0x00,0x01,0x00,0x0a,0x00,0x69,0x02,0x4e,0x02,0x2b,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x00,0x01,0x01,0x4c,0x05,0x01,0x01,0x4a,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x02,0x06,0x18,0x2b,0x25,0x35,0x21,0x35,0x21,0x35,0x17,0x01,\r\n0x8f,0xfe,0x7b,0x01,0x85,0xbf,0x69,0xbe,0x46,0xbe,0xe1,0x00,0x00,0x01,0x00,0x0a,0x00,0x69,0x02,0x4e,0x02,0x2b,0x00,0x06,0x00,0x26,0x40,0x23,0x06,0x01,0x00,0x01,0x01,0x4c,0x05,0x01,0x01,0x4a,0x00,0x01,0x00,0x49,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x11,0x11,0x02,0x06,0x18,0x2b,\r\n0x25,0x35,0x21,0x35,0x21,0x35,0x17,0x01,0x8f,0xfe,0x7b,0x01,0x85,0xbf,0x69,0xaa,0x6e,0xaa,0xe1,0x00,0x00,0x01,0xff,0xd8,0x00,0x4b,0x02,0x80,0x02,0x49,0x00,0x16,0x00,0x3a,0x40,0x37,0x07,0x01,0x01,0x00,0x11,0x08,0x01,0x03,0x02,0x01,0x12,0x01,0x03,0x02,0x03,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,\r\n0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x21,0x36,0x12,0x05,0x06,0x19,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,0x33,0x21,0x15,0x21,0x22,0x26,0x27,0x15,0x16,0x16,0x17,0x17,0xa7,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x29,0x10,0x01,0xe0,\r\n0xfe,0x20,0x10,0x29,0x0d,0x07,0x19,0x0d,0x89,0x4b,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x02,0x02,0x50,0x04,0x01,0x09,0x06,0x1a,0x0f,0xa4,0x00,0x00,0x01,0xff,0xd8,0x00,0x4b,0x02,0x80,0x02,0x49,0x00,0x16,0x00,0x3a,0x40,0x37,0x0f,0x01,0x01,0x02,0x15,0x0e,0x05,0x03,0x00,0x01,0x04,0x01,0x03,0x00,0x03,0x4c,0x00,0x02,0x01,0x02,\r\n0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x17,0x21,0x27,0x05,0x06,0x19,0x2b,0x25,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x35,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x01,0x4b,0x86,0x0a,0x1a,\r\n0x09,0x0d,0x28,0x11,0xfe,0x20,0x01,0xe0,0x11,0x28,0x0d,0x07,0x19,0x0d,0x89,0x69,0xcf,0xce,0x4b,0xa5,0x0c,0x1a,0x07,0x09,0x01,0x03,0x50,0x03,0x02,0x09,0x06,0x1a,0x0f,0xa4,0xff,0xff,0x00,0x01,0xff,0xb0,0x00,0x4b,0x02,0xa8,0x02,0x49,0x00,0x29,0x00,0x43,0x40,0x40,0x10,0x07,0x02,0x01,0x00,0x24,0x1d,0x16,0x0f,0x08,0x01,0x06,\r\n0x04,0x01,0x25,0x1c,0x02,0x03,0x04,0x03,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x5f,0x00,0x04,0x01,0x04,0x4f,0x00,0x00,0x00,0x29,0x00,0x29,0x37,0x12,0x17,0x46,0x12,0x07,0x06,0x1b,0x2b,0x37,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,\r\n0x33,0x21,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x21,0x22,0x26,0x27,0x15,0x16,0x16,0x17,0x17,0x7f,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x29,0x10,0x01,0x68,0x11,0x28,0x0d,0x07,0x19,0x0d,0x89,0x69,0xcf,0xce,0x67,0x86,0x0a,0x1a,0x09,0x0d,0x28,0x11,0xfe,0x98,\r\n0x10,0x29,0x0d,0x07,0x19,0x0d,0x89,0x4b,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x02,0x02,0x03,0x02,0x09,0x06,0x1a,0x0f,0xa4,0xff,0xff,0xa5,0x0c,0x1a,0x07,0x09,0x01,0x03,0x04,0x01,0x09,0x06,0x1a,0x0f,0xa4,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0xff,0x79,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,\r\n0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0xfe,0xd4,0xa5,0xa5,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x00,0x1e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,\r\n0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x01,0x4a,0xfe,0xb6,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x00,0xc3,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,\r\n0xd4,0x01,0xef,0xfe,0x11,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x01,0x68,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0xfe,0xd4,0x02,0x58,0x02,0x0d,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x03,0x39,0xfc,0xc7,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x02,0xb2,0x00,0x03,0x00,0x17,0x40,0x14,\r\n0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x03,0xde,0xfc,0x22,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0x57,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,\r\n0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0x04,0x83,0xfb,0x7d,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,\r\n0x11,0x02,0x58,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x68,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x58,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x03,0x57,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x35,0x21,0x15,0x02,0x58,0x03,0x57,0xa5,0xa5,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x4b,\r\n0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,0x11,0x4b,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0x96,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,0x11,0x96,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x00,0xc8,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x33,\r\n0x11,0xc8,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0x2c,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0xfe,0xd4,0x01,0x77,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x77,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0xc2,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,\r\n0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0xc2,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x0d,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,\r\n0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x02,0x0d,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x00,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,\r\n0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,0x01,0x02,0x0d,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x33,0x11,0x02,0x0d,0x4b,0xfe,0xd4,0x05,0x28,0xfa,0xd8,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0xfe,0xd4,0x01,0x2c,0x01,0x68,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x01,0x2c,0xfe,0xd4,0x02,0x58,0x01,0x68,0x00,0x03,\r\n0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x02,0x94,0xfd,0x6c,0x00,0x00,0x01,0x00,0x00,0x01,0x68,0x01,0x2c,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x11,0x11,0x21,0x11,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x01,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,\r\n0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,\r\n0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x11,0x11,0x21,0x19,0x02,0x21,0x11,0x01,0x2c,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0xfd,0x6c,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,\r\n0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x01,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x02,0x58,0xfe,0xd4,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,\r\n0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x01,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0xfe,0xca,0x02,0x62,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x01,0x01,0x2c,0x01,0x68,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x17,0x40,0x14,\r\n0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0x00,0x00,0x02,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,\r\n0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfd,0xa8,0x01,0x2c,0x01,0x68,0x02,0x94,0xfd,0x6c,0xfd,0x6c,0x02,0x94,0xfd,0x6c,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1d,0x40,0x1a,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x11,0x11,0x21,0x11,0x21,0x11,0x01,0x2c,0x01,0x2c,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x00,0x00,0x37,0x00,0x3c,\r\n0xff,0x10,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,\r\n0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x83,0x00,0x87,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xa3,0x00,0xa7,0x00,0xab,0x00,0xaf,0x00,0xb3,0x00,0xb7,0x00,0xbb,0x00,0xbf,0x00,0xc3,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0xd3,0x00,0xd7,0x00,0xdb,0x00,0x00,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,\r\n0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,\r\n0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,\r\n0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,\r\n0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x02,0x1c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0xfd,0xe4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x03,0xc0,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x6e,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1b,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x2b,0x00,0x2f,0x00,0x33,0x00,0x37,0x00,0x3b,0x00,0x3f,0x00,0x43,0x00,0x47,0x00,0x4b,0x00,0x4f,0x00,0x53,0x00,0x57,0x00,0x5b,\r\n0x00,0x5f,0x00,0x63,0x00,0x67,0x00,0x6b,0x00,0x6f,0x00,0x73,0x00,0x77,0x00,0x7b,0x00,0x7f,0x00,0x83,0x00,0x87,0x00,0x8b,0x00,0x8f,0x00,0x93,0x00,0x97,0x00,0x9b,0x00,0x9f,0x00,0xa3,0x00,0xa7,0x00,0xab,0x00,0xaf,0x00,0xb3,0x00,0xb7,0x00,0xbb,0x00,0xbf,0x00,0xc3,0x00,0xc7,0x00,0xcb,0x00,0xcf,0x00,0xd3,0x00,0xd7,0x00,0xdb,\r\n0x00,0xdf,0x00,0xe3,0x00,0xe7,0x00,0xeb,0x00,0xef,0x00,0xf3,0x00,0xf7,0x00,0xfb,0x00,0xff,0x01,0x03,0x01,0x07,0x01,0x0b,0x01,0x0f,0x01,0x13,0x01,0x17,0x01,0x1b,0x01,0x1f,0x01,0x23,0x01,0x27,0x01,0x2b,0x01,0x2f,0x01,0x33,0x01,0x37,0x01,0x3b,0x01,0x3f,0x01,0x43,0x01,0x47,0x01,0x4b,0x01,0x4f,0x01,0x53,0x01,0x57,0x01,0x5b,\r\n0x01,0x5f,0x01,0x63,0x01,0x67,0x01,0x6b,0x01,0x6f,0x01,0x73,0x01,0x77,0x01,0x7b,0x01,0x7f,0x01,0x83,0x01,0x87,0x01,0x8b,0x01,0x8f,0x01,0x93,0x01,0x97,0x01,0x9b,0x01,0x9f,0x01,0xa3,0x01,0xa7,0x01,0xab,0x01,0xaf,0x01,0xb3,0x01,0xb7,0x00,0x00,0x01,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,\r\n0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,\r\n0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,\r\n0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,\r\n0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,\r\n0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,\r\n0x21,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x05,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x07,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,\r\n0x05,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x17,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x23,0x35,0x33,0x15,0x02,0x1c,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x68,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0xe0,\r\n0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xf0,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x78,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0x78,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0x3c,\r\n0x3c,0xb4,0x3c,0xfd,0xe4,0x3c,0xf0,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0xfe,0x20,0x3c,0x01,0xa4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0xf0,0x3c,0x3c,0x3c,0xfe,0x5c,0x3c,0x3c,0x3c,0x01,0x2c,0x3c,0xf0,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0x01,0x2c,\r\n0x3c,0xb4,0x3c,0x78,0x3c,0xfe,0xd4,0x3c,0x01,0x2c,0x3c,0xfe,0xd4,0x3c,0xfe,0xd4,0x3c,0x01,0x68,0x3c,0xfe,0xd4,0x3c,0x3c,0x3c,0xb4,0x3c,0xfd,0xe4,0x3c,0x01,0x68,0x3c,0xfd,0xe4,0x3c,0xb4,0x3c,0x3c,0x3c,0xfe,0xd4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xb4,0x3c,0x01,0x2c,0x3c,0x78,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,\r\n0xb4,0x3c,0x01,0x68,0x3c,0xb4,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0x78,0x3c,0x01,0x2c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x01,0xe0,0x3c,0xfe,0x5c,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0x78,0x3c,0xb4,0x3c,0xb4,0x3c,0xfe,0xd4,0x3c,0xb4,0x3c,0x03,0xc0,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x29,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x3d,0x00,0x41,0x00,0x45,0x00,0x49,0x00,0x4d,0x00,0x51,0x00,0x55,\r\n0x00,0x59,0x00,0x5d,0x00,0x61,0x00,0x65,0x00,0x69,0x00,0x6d,0x00,0x71,0x00,0x75,0x00,0x79,0x00,0x7d,0x00,0x81,0x00,0x85,0x00,0x89,0x00,0x8d,0x00,0x91,0x00,0x95,0x00,0x99,0x00,0x9d,0x00,0xa1,0x00,0xa5,0x00,0xa9,0x00,0xad,0x00,0xb1,0x00,0xb5,0x00,0xb9,0x00,0xbd,0x00,0xc1,0x00,0xc5,0x00,0xc9,0x00,0xcd,0x00,0xd1,0x00,0xd5,\r\n0x00,0xd9,0x00,0xdd,0x00,0x00,0x11,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,\r\n0x33,0x35,0x33,0x11,0x03,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x17,0x33,0x35,0x23,\r\n0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,\r\n0x07,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x15,0x33,0x35,0x23,0x05,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x07,0x33,0x35,0x23,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0xfe,0x98,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,\r\n0x3c,0x3c,0x3c,0x3c,0xf0,0x3c,0x3c,0x78,0x3c,0x3c,0xf0,0x3c,0x3c,0xfe,0x98,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0x3c,0x3c,0x01,0x68,0x3c,0x3c,0x78,0x3c,0x3c,0x78,0x3c,0x3c,0xfe,0xd4,\r\n0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xfa,0xd8,0x04,0x74,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,\r\n0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0xb4,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x3c,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,\r\n0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x09,0x07,0x00,0x0f,0x01,0x0f,0x03,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,\r\n0x59,0x58,0x8d,0x51,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,\r\n0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,\r\n0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,\r\n0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,\r\n0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1d,0x00,0x3b,0x40,0x38,0x00,0x03,\r\n0x04,0x02,0x04,0x03,0x02,0x80,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x69,0x06,0x01,0x02,0x00,0x00,0x02,0x59,0x06,0x01,0x02,0x02,0x00,0x61,0x05,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x17,0x16,0x15,0x14,0x10,0x1d,0x11,0x1d,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,\r\n0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x21,0x11,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0xfe,0xfc,0x4a,0x76,0x44,0x44,0x76,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x01,0x04,\r\n0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x15,0x00,0x2f,0x40,0x2c,0x00,0x02,0x03,0x00,0x03,0x02,0x00,0x80,0x04,0x01,0x00,0x00,0x84,0x00,0x01,0x03,0x03,0x01,0x59,0x00,0x01,0x01,0x03,0x61,0x00,0x03,0x01,0x03,0x51,0x01,0x00,0x13,0x12,0x11,0x10,0x09,0x07,0x00,\r\n0x0f,0x01,0x0f,0x05,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x21,0x11,0x22,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0xfe,0xa3,0x01,0x04,0x4a,0x76,0x44,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,\r\n0x01,0x04,0x44,0x76,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1d,0x00,0x23,0x00,0x3e,0x40,0x3b,0x1f,0x14,0x02,0x00,0x04,0x01,0x4c,0x05,0x01,0x00,0x04,0x00,0x86,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x02,0x04,0x04,0x02,0x57,0x00,0x02,0x02,0x04,0x5f,0x06,0x01,0x04,0x02,0x04,0x4f,0x1e,0x1e,\r\n0x01,0x00,0x1e,0x23,0x1e,0x23,0x1b,0x19,0x16,0x15,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x14,0x16,0x16,0x17,0x11,0x21,0x2e,0x02,0x23,0x22,0x06,0x06,0x05,0x15,0x3e,0x02,0x37,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,\r\n0x51,0x51,0x8c,0xfe,0xa3,0x3d,0x6a,0x44,0x01,0x1c,0x06,0x46,0x71,0x46,0x4a,0x76,0x44,0x01,0x1d,0x40,0x65,0x3f,0x06,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x01,0x36,0x46,0x71,0x46,0x06,0x01,0x1c,0x44,0x6a,0x3d,0x44,0x76,0x63,0xea,0x06,0x3f,0x65,0x40,0x00,0x00,0x08,0xff,0xf6,0x00,0x32,0x02,0x62,\r\n0x02,0x9e,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x35,0x00,0x3b,0x00,0x47,0x00,0x48,0x40,0x45,0x13,0x0e,0x04,0x03,0x01,0x00,0x43,0x3d,0x39,0x38,0x33,0x31,0x2f,0x2b,0x2a,0x22,0x21,0x1b,0x1a,0x16,0x15,0x11,0x0f,0x0b,0x05,0x13,0x02,0x01,0x44,0x3b,0x34,0x03,0x03,0x02,0x03,0x4c,0x00,0x00,0x00,0x01,0x02,0x00,\r\n0x01,0x69,0x00,0x02,0x03,0x03,0x02,0x59,0x00,0x02,0x02,0x03,0x61,0x00,0x03,0x02,0x03,0x51,0x47,0x45,0x41,0x3f,0x24,0x21,0x04,0x06,0x18,0x2b,0x13,0x36,0x33,0x32,0x17,0x07,0x26,0x26,0x23,0x22,0x06,0x07,0x07,0x36,0x37,0x17,0x06,0x07,0x25,0x37,0x16,0x17,0x07,0x26,0x05,0x34,0x37,0x17,0x06,0x06,0x15,0x14,0x16,0x17,0x07,0x26,\r\n0x05,0x36,0x36,0x35,0x34,0x26,0x27,0x37,0x16,0x15,0x14,0x07,0x05,0x37,0x16,0x17,0x07,0x26,0x25,0x36,0x37,0x17,0x06,0x07,0x07,0x37,0x16,0x16,0x33,0x32,0x36,0x37,0x17,0x06,0x23,0x22,0xdb,0x25,0x2c,0x2c,0x25,0x0d,0x10,0x22,0x12,0x12,0x21,0x11,0xcb,0x29,0x4a,0x19,0x3d,0x23,0x01,0x66,0x19,0x4a,0x29,0x2c,0x23,0xfe,0x0a,0x0a,\r\n0x30,0x04,0x04,0x04,0x04,0x30,0x0a,0x02,0x32,0x04,0x04,0x04,0x04,0x30,0x0a,0x0a,0xfd,0xc5,0x2c,0x23,0x3d,0x19,0x4a,0x01,0x69,0x3d,0x23,0x2c,0x29,0x4a,0xed,0x0d,0x11,0x21,0x12,0x12,0x22,0x10,0x0d,0x25,0x2c,0x2c,0x02,0x94,0x0a,0x0a,0x30,0x04,0x04,0x04,0x04,0x60,0x4a,0x29,0x2c,0x23,0x3d,0x60,0x2c,0x29,0x4a,0x19,0x3d,0xc0,\r\n0x2c,0x25,0x0d,0x10,0x22,0x12,0x12,0x21,0x11,0x0d,0x25,0x18,0x11,0x21,0x12,0x12,0x22,0x10,0x0d,0x25,0x2c,0x2c,0x25,0x4b,0x19,0x3d,0x23,0x2c,0x29,0x03,0x23,0x3d,0x19,0x4a,0x29,0x1d,0x30,0x04,0x04,0x04,0x04,0x30,0x0a,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x49,0x40,0x46,\r\n0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x08,0x01,0x04,0x02,0x03,0x04,0x02,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x21,0x20,0x11,0x10,0x01,0x00,0x29,0x27,0x20,0x2f,0x21,0x2f,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,\r\n0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,\r\n0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x37,0x59,0x35,0x35,0x59,0x37,0x39,0x59,0x33,0x35,0x59,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x3f,0x35,0x59,0x37,0x37,0x59,0x35,0x33,0x59,0x39,\r\n0x37,0x59,0x35,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2f,0x00,0x3f,0x00,0x53,0x40,0x50,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x0a,0x01,0x04,0x02,0x06,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,\r\n0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x31,0x30,0x21,0x20,0x11,0x10,0x01,0x00,0x39,0x37,0x30,0x3f,0x31,0x3f,0x29,0x27,0x20,0x2f,0x21,0x2f,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,\r\n0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,\r\n0x76,0x44,0x44,0x76,0x4a,0x37,0x59,0x35,0x35,0x59,0x37,0x39,0x59,0x33,0x35,0x59,0x37,0x2b,0x44,0x27,0x27,0x44,0x2b,0x2b,0x44,0x27,0x27,0x44,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x3f,0x35,0x59,0x37,0x37,0x59,0x35,0x33,0x59,0x39,\r\n0x37,0x59,0x35,0x2f,0x27,0x44,0x2b,0x2b,0x44,0x27,0x27,0x44,0x2b,0x2b,0x44,0x27,0x00,0x02,0x00,0xb4,0x00,0xf5,0x01,0xa4,0x01,0xe5,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,\r\n0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0xf5,0x44,0x34,0x35,0x43,0x43,\r\n0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x25,0x09,0x02,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,\r\n0x00,0x07,0x00,0x08,0xb5,0x06,0x04,0x02,0x00,0x02,0x32,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0x00,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0a,0xb7,0x0a,\r\n0x08,0x06,0x04,0x02,0x00,0x03,0x32,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x17,0x27,0x37,0x17,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0xe8,0x8d,0x8d,0x8d,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0x8d,0x8d,0x8d,0x8d,0x00,0x00,0x02,0x00,0x3c,0x00,0x00,0x02,0x1c,0x02,0xd0,0x00,0x07,\r\n0x00,0x1b,0x00,0x25,0x40,0x22,0x18,0x17,0x12,0x0e,0x0d,0x06,0x05,0x02,0x01,0x09,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x13,0x03,0x06,0x17,0x2b,0x33,0x03,0x35,0x13,0x33,0x13,0x15,0x03,0x27,0x33,0x36,0x36,0x37,0x37,0x35,0x27,0x26,0x26,0x27,0x23,0x06,0x06,0x07,\r\n0x07,0x15,0x17,0x16,0x16,0xf0,0xb4,0xb4,0x7e,0xae,0xae,0x43,0x04,0x07,0x1b,0x0f,0x62,0x62,0x0f,0x1b,0x07,0x04,0x07,0x1c,0x0f,0x63,0x63,0x10,0x1b,0x01,0x44,0x47,0x01,0x45,0xfe,0xbb,0x47,0xfe,0xbc,0x3c,0x0e,0x36,0x1d,0xbb,0x1f,0xbc,0x1d,0x36,0x0e,0x0e,0x36,0x1d,0xbc,0x1f,0xbb,0x1e,0x35,0x00,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x02,0x58,0x3c,0x02,0x58,0xfd,0xa8,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,\r\n0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x00,\r\n0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x37,0x11,0x21,0x11,0x96,0x01,0x2c,0xd2,0x01,0x2c,0xfe,0xd4,0x00,0x00,0x00,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x03,\r\n0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x37,0x11,0x21,0x11,0x27,0x33,0x35,0x23,0x96,0x01,0x2c,0xfa,0xc8,0xc8,0xd2,0x01,0x2c,0xfe,\r\n0xd4,0x32,0xc8,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x29,0x40,0x26,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x00,0x00,0x03,0x57,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,0x00,0x03,0x00,0x4f,0x04,0x04,0x04,0x07,0x04,0x07,0x12,0x11,0x10,0x05,0x06,0x19,0x2b,0x25,0x21,0x11,\r\n0x21,0x03,0x11,0x21,0x11,0x02,0x58,0xfd,0xa8,0x02,0x58,0x32,0xfe,0xfc,0x3c,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,\r\n0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0x04,0xfe,0xfc,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x06,0x00,0x2b,0x40,0x28,0x06,0x01,\r\n0x02,0x00,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x03,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x04,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x21,0x11,0x02,0x58,0xfd,0xda,0x01,0xf4,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0x00,0x02,0x00,0x00,\r\n0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x06,0x00,0x2c,0x40,0x29,0x06,0x01,0x00,0x02,0x01,0x4c,0x00,0x00,0x02,0x00,0x86,0x03,0x01,0x01,0x02,0x02,0x01,0x57,0x03,0x01,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x04,0x06,0x17,0x2b,0x01,0x11,0x21,0x11,0x05,0x21,0x11,0x02,\r\n0x58,0xfd,0xa8,0x02,0x26,0xfe,0x0c,0x02,0x94,0xfd,0xa8,0x02,0x58,0x32,0xfe,0x0c,0x00,0x03,0x00,0x00,0x00,0x3c,0x02,0x58,0x02,0x94,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x31,0x40,0x2e,0x00,0x00,0x04,0x01,0x03,0x02,0x00,0x03,0x67,0x05,0x01,0x02,0x01,0x01,0x02,0x57,0x05,0x01,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,\r\n0x00,0x00,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x35,0x11,0x21,0x11,0x25,0x33,0x11,0x23,0x21,0x23,0x11,0x33,0x02,0x58,0xfd,0xda,0xe1,0xe1,0x01,0xf4,0xe1,0xe1,0x3c,0x02,0x58,0xfd,0xa8,0x32,0x01,0xf4,0xfe,0x0c,0x00,0x00,0x01,0xff,0xf6,0x00,0x3c,0x02,0x62,0x02,0x9e,0x00,0x02,\r\n0x00,0x15,0x40,0x12,0x01,0x01,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x06,0x16,0x2b,0x27,0x01,0x01,0x0a,0x01,0x36,0x01,0x36,0x3c,0x02,0x62,0xfd,0x9e,0x00,0x01,0x00,0x00,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x35,0x11,0x01,0x02,0x62,0x32,0x02,0x6c,\r\n0xfe,0xca,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x94,0x00,0x02,0x00,0x0a,0xb7,0x00,0x00,0x00,0x76,0x11,0x01,0x06,0x17,0x2b,0x25,0x01,0x21,0x01,0x2c,0xfe,0xca,0x02,0x6c,0x32,0x02,0x62,0x00,0x01,0xff,0xf6,0x00,0x31,0x02,0x58,0x02,0x9e,0x00,0x02,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x25,0x01,0x01,0x02,\r\n0x58,0xfd,0x9e,0x02,0x62,0x31,0x01,0x37,0x01,0x36,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x3c,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x24,0x40,0x21,0x05,0x01,0x02,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x04,0x03,0x00,0x02,0x00,0x02,0x03,0x06,0x16,0x2b,\r\n0x27,0x01,0x01,0x25,0x21,0x03,0x0a,0x01,0x36,0x01,0x36,0xfd,0xe7,0x01,0xc6,0xe3,0x3c,0x02,0x62,0xfd,0x9e,0x32,0x01,0xbf,0x00,0x02,0x00,0x00,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x35,0x11,0x01,0x05,0x25,0x25,0x02,0x62,0xfd,0xd0,0x01,0xc0,0xfe,0x40,0x32,0x02,\r\n0x6c,0xfe,0xca,0xe3,0xe3,0xe3,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x94,0x00,0x02,0x00,0x05,0x00,0x18,0x40,0x15,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x25,0x01,0x21,0x01,0x13,0x21,0x01,0x2c,0xfe,0xca,0x02,0x6c,0xfe,0xca,0xe3,0xfe,\r\n0x3a,0x32,0x02,0x62,0xfe,0x0f,0x01,0xbf,0x00,0x02,0xff,0xf6,0x00,0x32,0x02,0x58,0x02,0x9e,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,0x00,0x02,0x32,0x2b,0x25,0x01,0x01,0x03,0x11,0x05,0x02,0x58,0xfd,0x9e,0x02,0x62,0x32,0xfe,0x40,0x32,0x01,0x36,0x01,0x36,0xfd,0xe7,0x01,0xc6,0xe3,0x00,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0x00,0xd2,0x02,0x62,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x35,0x11,0x05,0x02,0x62,0xd2,0x01,0x2c,0x96,0x00,0x00,0x00,0x00,0x01,0xff,0xf6,0x00,0xd2,0x02,0x58,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x02,0x00,0x01,0x32,0x2b,0x2d,0x02,0x02,0x58,0xfd,0x9e,0x02,0x62,0xd2,0x96,0x96,0x00,0x00,0x02,0x00,0x00,\r\n0x00,0xd2,0x02,0x62,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x35,0x11,0x05,0x05,0x25,0x25,0x02,0x62,0xfd,0xd0,0x01,0x8e,0xfe,0x72,0xd2,0x01,0x2c,0x96,0x56,0x56,0x56,0x00,0x00,0x00,0x00,0x02,0xff,0xf6,0x00,0xd2,0x02,0x58,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,\r\n0x00,0x02,0x32,0x2b,0x2d,0x02,0x07,0x35,0x05,0x02,0x58,0xfd,0x9e,0x02,0x62,0x32,0xfe,0x72,0xd2,0x96,0x96,0xec,0xac,0x56,0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xc2,0x02,0x08,0x00,0x02,0x00,0x15,0x40,0x12,0x01,0x01,0x00,0x4a,0x01,0x01,0x00,0x00,0x76,0x00,0x00,0x00,0x02,0x00,0x02,0x02,0x06,0x16,0x2b,0x37,0x13,0x13,0x96,0x96,\r\n0x96,0xd2,0x01,0x36,0xfe,0xca,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0xd2,0x01,0xcc,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x37,0x11,0x05,0x96,0x01,0x36,0xd2,0x01,0x2c,0x96,0x00,0x00,0x00,0x01,0x00,0x96,0x00,0xc8,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x0f,0x40,0x0c,0x02,0x01,0x00,0x49,0x00,0x00,0x00,0x76,\r\n0x10,0x01,0x06,0x17,0x2b,0x13,0x21,0x03,0x96,0x01,0x2c,0x96,0x01,0xfe,0xfe,0xca,0x00,0x01,0x00,0x8c,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x06,0xb3,0x01,0x00,0x01,0x32,0x2b,0x01,0x11,0x25,0x01,0xc2,0xfe,0xca,0x01,0xfe,0xfe,0xd4,0x96,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xc2,0x02,0x08,0x00,0x02,0x00,0x05,0x00,0x24,\r\n0x40,0x21,0x05,0x01,0x02,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x04,0x03,0x00,0x02,0x00,0x02,0x03,0x06,0x16,0x2b,0x37,0x13,0x13,0x27,0x33,0x27,0x96,0x96,0x96,0xec,0xac,0x56,0xd2,0x01,0x36,0xfe,0xca,0x28,0xb2,0x00,0x00,0x02,0x00,0x96,0x00,0xd2,0x01,0xcc,\r\n0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x05,0x03,0x01,0x00,0x02,0x32,0x2b,0x37,0x11,0x05,0x05,0x37,0x27,0x96,0x01,0x36,0xfe,0xf2,0xb2,0xb2,0xd2,0x01,0x2c,0x96,0x56,0x56,0x56,0x00,0x02,0x00,0x96,0x00,0xc8,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x18,0x40,0x15,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,\r\n0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x25,0x03,0x21,0x07,0x37,0x23,0x01,0x2c,0x96,0x01,0x2c,0x96,0x56,0xac,0xc8,0x01,0x36,0xda,0xb2,0x00,0x00,0x02,0x00,0x8c,0x00,0xd2,0x01,0xc2,0x01,0xfe,0x00,0x02,0x00,0x05,0x00,0x08,0xb5,0x04,0x03,0x02,0x00,0x02,0x32,0x2b,0x2d,0x02,0x07,0x35,0x07,0x01,0xc2,0xfe,\r\n0xca,0x01,0x36,0x28,0xb2,0xd2,0x96,0x96,0xec,0xac,0x56,0x00,0x00,0x03,0xff,0xec,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x45,0x40,0x42,0x0a,0x07,0x09,0x03,0x04,0x03,0x04,0x86,0x00,0x00,0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x06,0x01,0x02,0x03,0x03,0x02,0x57,0x06,0x01,0x02,0x02,0x03,0x5f,0x05,0x01,\r\n0x03,0x02,0x03,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x01,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x14,0x02,0x80,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0xd4,0xaa,0x01,0x0e,\r\n0x01,0xa4,0x64,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x02,0x6c,0x64,0xfd,0x30,0x00,0x02,0xff,0xec,0xfe,0x70,0x01,0xc2,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x07,0x05,0x06,0x03,0x02,0x03,0x02,0x86,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x04,0x03,0x03,0x04,0x57,0x00,0x04,0x04,0x03,0x5f,0x00,0x03,0x04,\r\n0x03,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x01,0x11,0x21,0x35,0x21,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x01,0x5e,0xfe,0x8e,0x01,0xd6,0xfe,0xd4,0xaa,0x01,0x0e,0xfe,0x70,0x03,0x34,0x64,0xfc,0x68,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x02,0x00,0x96,\r\n0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x07,0x05,0x06,0x03,0x02,0x04,0x02,0x86,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,\r\n0x08,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0x96,0x01,0xd6,0xfe,0x8e,0x64,0x01,0x0e,0xaa,0xfe,0x70,0x03,0x98,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0x00,0xdc,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,\r\n0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x14,0x02,0x80,0xfd,0x80,0x02,0x80,0x01,0xa4,0x64,0x64,0xc8,0x64,0x64,0x00,0x00,0x00,\r\n0x00,0x03,0xff,0xec,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x0f,0x00,0x43,0x40,0x40,0x04,0x01,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x09,0x05,0x08,0x03,0x02,0x06,0x01,0x02,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0a,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x06,0x06,0x00,0x00,0x0c,0x0f,0x0c,\r\n0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0b,0x06,0x18,0x2b,0x01,0x11,0x33,0x11,0x33,0x15,0x21,0x35,0x33,0x11,0x33,0x11,0x05,0x35,0x21,0x15,0x01,0x5e,0x64,0xaa,0xfd,0x80,0xaa,0x64,0xfe,0xf2,0x02,0x80,0x01,0xa4,0x02,0xbc,0xfd,0xa8,0x64,0x64,0x02,0x58,0xfd,0x44,0xc8,0x64,0x64,\r\n0x00,0x02,0xff,0xec,0x00,0xdc,0x01,0xc2,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x04,0x01,0x01,0x03,0x01,0x85,0x00,0x03,0x07,0x01,0x05,0x00,0x03,0x05,0x67,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x06,0x01,0x02,0x00,0x02,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,\r\n0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x27,0x35,0x21,0x11,0x33,0x11,0x25,0x35,0x33,0x11,0x33,0x11,0x14,0x01,0x72,0x64,0xfe,0x2a,0xaa,0x64,0xdc,0x64,0x03,0x20,0xfc,0x7c,0xc8,0x64,0x02,0x58,0xfd,0x44,0x00,0x02,0x00,0x96,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x38,0x40,0x35,0x03,0x01,0x00,0x04,0x00,0x85,\r\n0x00,0x04,0x07,0x01,0x05,0x01,0x04,0x05,0x67,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x06,0x01,0x02,0x01,0x02,0x4f,0x06,0x06,0x00,0x00,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x08,0x06,0x18,0x2b,0x37,0x11,0x33,0x11,0x21,0x15,0x25,0x11,0x33,0x11,0x33,0x15,0x96,0x64,0x01,0x72,\r\n0xfe,0xf2,0x64,0xaa,0xdc,0x03,0x84,0xfc,0xe0,0x64,0xc8,0x02,0xbc,0xfd,0xa8,0x64,0x00,0x02,0x00,0x96,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x03,0x00,0x07,0x00,0x22,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,\r\n0x17,0x2b,0x01,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x01,0x5e,0x64,0xfe,0xd4,0x64,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x04,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x0b,0x00,0x11,0x00,0x17,0x00,0x59,0x40,0x56,0x03,0x01,0x01,0x00,0x01,0x85,0x0f,0x0b,0x0e,0x03,0x08,0x07,0x08,0x86,\r\n0x04,0x01,0x00,0x0d,0x05,0x0c,0x03,0x02,0x06,0x00,0x02,0x67,0x0a,0x01,0x06,0x07,0x07,0x06,0x57,0x0a,0x01,0x06,0x06,0x07,0x5f,0x09,0x01,0x07,0x06,0x07,0x4f,0x12,0x12,0x0c,0x0c,0x06,0x06,0x00,0x00,0x12,0x17,0x12,0x17,0x16,0x15,0x14,0x13,0x0c,0x11,0x0c,0x11,0x10,0x0f,0x0e,0x0d,0x06,0x0b,0x06,0x0b,0x0a,0x09,0x08,0x07,0x00,\r\n0x05,0x00,0x05,0x11,0x11,0x10,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x01,0x11,0x21,0x15,0x23,0x11,0x21,0x11,0x23,0x35,0x21,0x11,0x14,0xaa,0x64,0x64,0x64,0xaa,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0xd4,0xaa,0x01,0x0e,0x01,0xa4,0x64,0x02,0x58,0xfd,0x44,0x02,0xbc,0xfd,0xa8,0x64,0xfc,0xcc,0x02,\r\n0xd0,0x64,0xfd,0x94,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x03,0xff,0xec,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x48,0x40,0x45,0x03,0x01,0x00,0x02,0x00,0x85,0x0a,0x07,0x08,0x03,0x01,0x05,0x01,0x86,0x00,0x02,0x09,0x01,0x04,0x06,0x02,0x04,0x67,0x00,0x06,0x05,0x05,0x06,0x57,0x00,0x06,0x06,\r\n0x05,0x5f,0x00,0x05,0x06,0x05,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x01,0x11,0x33,0x11,0x01,0x35,0x33,0x11,0x33,0x11,0x03,0x11,0x23,0x35,0x21,0x11,0x01,0x5e,0x64,0xfe,0x2a,0xaa,0x64,0x64,0xaa,0x01,\r\n0x0e,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x03,0x34,0x64,0x02,0x58,0xfd,0x44,0xfc,0xcc,0x02,0x6c,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x03,0x00,0x96,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x03,0x00,0x09,0x00,0x0f,0x00,0x48,0x40,0x45,0x02,0x01,0x00,0x03,0x00,0x85,0x0a,0x07,0x08,0x03,0x01,0x06,0x01,0x86,0x00,0x03,0x09,0x01,0x04,0x05,\r\n0x03,0x04,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x05,0x06,0x4f,0x0a,0x0a,0x04,0x04,0x00,0x00,0x0a,0x0f,0x0a,0x0f,0x0e,0x0d,0x0c,0x0b,0x04,0x09,0x04,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x13,0x11,0x33,0x11,0x33,0x15,0x01,0x11,0x21,0x15,\r\n0x23,0x11,0x96,0x64,0x64,0x64,0xaa,0xfe,0xf2,0x01,0x0e,0xaa,0xfe,0x70,0x05,0xf0,0xfa,0x10,0x03,0x34,0x02,0xbc,0xfd,0xa8,0x64,0xfc,0xcc,0x02,0xd0,0x64,0xfd,0x94,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x0b,0x00,0x2a,0x40,0x27,0x06,0x05,0x02,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,\r\n0x00,0x5f,0x04,0x02,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0x02,0x80,0xaa,0x64,0x64,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0xc2,\r\n0x01,0xa4,0x00,0x09,0x00,0x28,0x40,0x25,0x05,0x04,0x02,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0x01,0xd6,0x64,0x64,0xfe,0x70,\r\n0x02,0xd0,0x64,0xfc,0xcc,0x02,0xd0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x09,0x00,0x28,0x40,0x25,0x05,0x04,0x02,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,\r\n0x1a,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0x01,0xd6,0xaa,0x64,0x64,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,\r\n0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0x02,0x80,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,\r\n0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0xc8,0xdc,0x01,0xa4,0xfe,0x70,0x02,0xd0,0x64,0xfc,0xcc,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x03,0xfc,0x00,0x09,0x00,0x2d,0x40,0x2a,\r\n0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xfe,0x70,0x02,0xd0,0x64,\r\n0x02,0x58,0xfd,0xa8,0xfc,0xcc,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,\r\n0xc8,0x01,0xa4,0xdc,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x01,0x00,0x01,0x85,0x05,0x01,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,\r\n0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x03,0x34,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,\r\n0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,\r\n0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x11,\r\n0xfa,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,\r\n0x18,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0x9e,0xc8,0xfc,0x9a,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,\r\n0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfc,0xae,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,\r\n0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0xfe,0x70,0x03,0x66,0xc8,0xfd,0x62,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,\r\n0x00,0x01,0x02,0x01,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x5f,0x03,0x01,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0x32,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0x03,0x52,\r\n0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,\r\n0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x03,0x00,0x0b,0x00,0x39,0x40,0x36,0x07,0x01,0x05,0x02,0x05,0x86,\r\n0x00,0x00,0x06,0x01,0x01,0x03,0x00,0x01,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x04,0x01,0x02,0x03,0x02,0x4f,0x04,0x04,0x00,0x00,0x04,0x0b,0x04,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x01,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x14,0x02,0x80,\r\n0xfe,0x8e,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0x01,0xa4,0x64,0x64,0xfc,0xcc,0x02,0x6c,0x64,0x64,0xfd,0x94,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x02,0x08,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,\r\n0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0xfc,0x68,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x02,0x08,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x03,\r\n0x04,0x86,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x03,0x98,0x64,\r\n0x64,0x64,0xfd,0x94,0x00,0x02,0x00,0x4b,0x01,0x0e,0x02,0x0d,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x35,\r\n0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x77,0x96,0xfe,0x3e,0x96,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0x00,0x00,0x00,0x02,0x00,0xc8,0xff,0x6f,0x01,0x90,0x03,0x69,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,\r\n0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xc8,0xc8,0xc8,0xc8,0x01,0xcc,0x01,0x9d,0xfe,0x63,0xfd,0xa3,0x01,0x9f,0xfe,0x61,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x01,0xa4,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0xfe,0x70,0x03,0x34,0xfc,0xcc,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,\r\n0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0x02,0x80,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,\r\n0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0xc8,0xdc,0x01,0xa4,0xfe,0x70,0x02,0x9e,0xc8,0xfc,0x9a,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,\r\n0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x11,0xc8,0x01,0xa4,0xdc,0xfe,0x70,0x03,0x66,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,\r\n0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x02,0x80,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x5e,0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,\r\n0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x01,0x72,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,\r\n0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x15,0x21,0x15,0x21,0x15,0x14,0x01,0x72,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xc8,0x32,0x64,0x32,0x00,0x00,0x04,0x00,0x19,0x01,0x0e,0x02,0x3f,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x42,\r\n0x40,0x3f,0x06,0x04,0x02,0x03,0x00,0x01,0x01,0x00,0x57,0x06,0x04,0x02,0x03,0x00,0x00,0x01,0x5f,0x0b,0x07,0x0a,0x05,0x09,0x03,0x08,0x07,0x01,0x00,0x01,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,\r\n0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0xdb,0x64,0xfd,0xda,0x64,0x32,0x64,0x32,0x64,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x00,0x00,0x00,0x04,0x00,0xc8,0xff,0x3d,0x01,0x90,0x03,0xa7,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00,\r\n0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,\r\n0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x02,0xd0,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0x01,0x0e,0x02,0x6c,\r\n0x01,0xd6,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0xfa,0x01,0x72,0x01,0x0e,0xc8,0xc8,0x00,0x00,0x03,0x00,0x25,0x01,0x0e,0x02,0x33,0x01,0xd6,0x00,0x03,0x00,0x07,0x00,0x0b,\r\n0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,\r\n0x33,0x35,0x33,0x15,0x01,0xb5,0x7e,0xfd,0xf2,0x7e,0x4a,0x7e,0x01,0x0e,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x00,0x03,0x00,0xc8,0xff,0x25,0x01,0x90,0x03,0xaa,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x07,0x01,0x03,0x04,0x03,0x85,0x00,0x04,\r\n0x05,0x04,0x85,0x08,0x01,0x05,0x05,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xc8,0xc8,0xc8,0xc8,0xc8,0xc8,0x02,0x64,0x01,0x46,0xfe,0xba,0xfe,0x52,0x01,0x65,0xfe,\r\n0x9b,0xfe,0x6f,0x01,0x46,0xfe,0xba,0x00,0x00,0x01,0x00,0xc8,0x01,0x40,0x01,0x90,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0x01,0x40,0x03,0x20,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0xff,0xec,\r\n0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xdc,0xc8,0xdc,0x01,0x0e,0xc8,\r\n0x02,0x8a,0xfd,0x76,0xc8,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x90,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,\r\n0x14,0xdc,0xc8,0x01,0x0e,0xc8,0x02,0x8a,0xfc,0xae,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,0x23,\r\n0x11,0xfa,0x32,0xc8,0x32,0xfe,0x70,0x02,0xd0,0x03,0x20,0xfc,0xe0,0xfd,0x30,0x00,0x00,0x01,0x00,0xc8,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,\r\n0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0xc8,0xc8,0xdc,0x01,0x0e,0x03,0x52,0xfd,0x76,0xc8,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xc8,0xc8,0xfe,\r\n0x70,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,\r\n0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,\r\n0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0xc8,0xdc,0xdc,0xc8,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,\r\n0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xc8,0xdc,0xdc,0xfe,0x70,0x05,0xf0,0xfd,0x76,0xc8,0xfd,\r\n0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x37,0x40,0x34,0x00,0x02,0x01,0x02,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x03,0x01,0x01,0x04,0x00,0x01,0x57,0x00,0x04,0x00,0x05,0x00,0x04,0x05,0x67,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,\r\n0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x15,0x33,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0x32,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,\r\n0x04,0x86,0x00,0x01,0x02,0x00,0x01,0x57,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,\r\n0x32,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x04,0x00,0x57,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,\r\n0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,\r\n0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0xfd,0x30,\r\n0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,\r\n0x33,0x35,0x21,0x15,0x23,0x11,0xc8,0xdc,0xdc,0x01,0xa4,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x32,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,\r\n0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0xc8,0xdc,0xdc,0xc8,0xdc,0x01,0x0e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x03,0x02,\r\n0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,\r\n0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x36,0x40,0x33,0x00,0x02,0x01,0x02,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x05,0x01,0x00,0x01,0x00,0x4f,\r\n0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xdc,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x0d,\r\n0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x21,0x24,0x04,0x06,0x18,0x2b,0x13,0x11,0x34,0x26,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x16,0x15,0x11,0xfa,0x3a,0x69,0x48,0x23,0x23,0x66,0x96,0x53,0xfe,0x70,0x01,\r\n0xe0,0x49,0x6c,0x3b,0x64,0x54,0x99,0x67,0xfe,0x20,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x0d,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x59,0x00,0x00,0x00,0x01,0x61,0x00,0x01,0x00,0x01,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x21,0x24,0x04,0x06,0x18,0x2b,0x13,0x11,\r\n0x34,0x36,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x06,0x15,0x11,0xfa,0x53,0x97,0x65,0x23,0x23,0x47,0x6a,0x3a,0xfe,0x70,0x01,0xe0,0x67,0x99,0x54,0x64,0x3b,0x6c,0x49,0xfe,0x20,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x0d,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x59,0x00,\r\n0x00,0x00,0x02,0x61,0x03,0x01,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x0d,0x00,0x0c,0x14,0x21,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x32,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x06,0x23,0x14,0x23,0x48,0x69,0x3a,0x64,0x53,0x96,0x66,0x01,0x40,0x64,0x3b,0x6c,0x49,0x01,0xcc,0xfe,0x34,0x67,0x99,0x54,0x00,0x00,0x00,0x01,0x00,0xfa,\r\n0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x26,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x03,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0c,0x0a,0x06,0x05,0x00,0x0d,0x01,0x0d,0x04,0x06,0x16,0x2b,0x01,0x22,0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x16,0x33,0x33,0x15,0x02,0x49,\r\n0x65,0x97,0x53,0x64,0x3a,0x6a,0x47,0x23,0x01,0x40,0x54,0x99,0x67,0x01,0xcc,0xfe,0x34,0x49,0x6c,0x3b,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x0f,0x00,0x28,0x40,0x25,0x0e,0x0b,0x0a,0x09,0x06,0x03,0x02,0x01,0x08,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x04,0x03,0x02,0x02,0x02,\r\n0x76,0x00,0x00,0x00,0x0f,0x00,0x0f,0x14,0x12,0x14,0x05,0x06,0x19,0x2b,0x07,0x35,0x01,0x01,0x35,0x33,0x13,0x13,0x33,0x15,0x01,0x01,0x15,0x23,0x03,0x03,0x14,0x01,0x0d,0xfe,0xf3,0x50,0xf0,0xf0,0x50,0xfe,0xf3,0x01,0x0d,0x50,0xf0,0xf0,0xa0,0x28,0x01,0xe0,0x01,0xe0,0x28,0xfe,0x57,0x01,0xa9,0x28,0xfe,0x20,0xfe,0x20,0x28,0x01,\r\n0xa9,0xfe,0x57,0x00,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x05,0x01,0x35,0x33,0x01,0x15,0x02,0x1c,0xfd,0xd0,0x50,0x02,0x30,0xa0,0x03,0xe8,\r\n0x28,0xfc,0x18,0x28,0x00,0x01,0xff,0xec,0xff,0x60,0x02,0x6c,0x03,0x70,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x07,0x35,0x01,0x33,0x15,0x01,0x14,0x02,0x30,0x50,0xfd,0xd0,0xa0,0x28,0x03,0xe8,\r\n0x28,0xfc,0x18,0x00,0x00,0x02,0x00,0x46,0x01,0x40,0x02,0x12,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x01,0x35,\r\n0x33,0x15,0x21,0x35,0x33,0x15,0x01,0x72,0xa0,0xfe,0x34,0xa0,0x01,0x40,0x64,0x64,0x64,0x64,0x00,0x00,0x00,0x02,0x00,0xfa,0xff,0x5b,0x01,0x5e,0x03,0x7d,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x05,0x01,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,\r\n0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xfa,0x64,0x64,0x64,0x01,0xb8,0x01,0xc5,0xfe,0x3b,0xfd,0xa3,0x01,0xc7,0xfe,0x39,0x00,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0xfe,0x70,0x03,0x34,0xfc,0xcc,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x07,0x00,0x26,0x40,0x23,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,\r\n0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x02,0x80,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,\r\n0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x72,0xfe,0x70,0x02,0xd0,0x64,0xfc,0xcc,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x01,0xa4,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,\r\n0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x21,0x11,0xfa,0x01,0x72,0xfe,0xf2,0xfe,0x70,0x03,0x34,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,\r\n0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x02,0x80,0x01,0x40,0x64,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,\r\n0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x03,0x35,0x21,0x15,0x14,0x01,0x72,0x01,0x40,0x64,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x01,0xd6,0x00,0x07,0x00,0x28,0x40,0x25,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,\r\n0x02,0x03,0x5f,0x04,0x01,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x35,0x21,0x35,0x21,0x35,0x21,0x15,0xfa,0xfe,0xf2,0x01,0x0e,0x01,0x72,0x01,0x0e,0x32,0x64,0x32,0xc8,0x00,0x00,0x04,0x00,0x19,0x01,0x40,0x02,0x3f,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x42,\r\n0x40,0x3f,0x06,0x04,0x02,0x03,0x00,0x01,0x01,0x00,0x57,0x06,0x04,0x02,0x03,0x00,0x00,0x01,0x5f,0x0b,0x07,0x0a,0x05,0x09,0x03,0x08,0x07,0x01,0x00,0x01,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,\r\n0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x33,0x35,0x33,0x15,0x01,0xdb,0x64,0xfd,0xda,0x64,0x32,0x64,0x32,0x64,0x01,0x40,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x00,0x00,0x00,0x04,0x00,0xfa,0xff,0x3d,0x01,0x5e,0x03,0xa7,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x51,0x40,0x4e,0x00,0x00,\r\n0x08,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x09,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x0a,0x01,0x05,0x06,0x04,0x05,0x67,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,0x5f,0x0b,0x01,0x07,0x06,0x07,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,\r\n0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x06,0x17,0x2b,0x13,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0x03,0x35,0x33,0x15,0xfa,0x64,0x64,0x64,0x64,0x64,0x64,0x64,0x02,0xd0,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0xfe,0xcf,0xd7,0xd7,0x00,0x00,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x02,0x6c,\r\n0x01,0xa4,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0xfa,0x01,0x72,0x01,0x40,0x64,0x64,0x00,0x00,0x03,0x00,0x25,0x01,0x40,0x02,0x33,0x01,0xa4,0x00,0x03,0x00,0x07,0x00,0x0b,\r\n0x00,0x36,0x40,0x33,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x01,0x35,0x33,0x15,0x21,0x35,0x33,0x15,\r\n0x33,0x35,0x33,0x15,0x01,0xb5,0x7e,0xfd,0xf2,0x7e,0x4a,0x7e,0x01,0x40,0x64,0x64,0x64,0x64,0x64,0x64,0x00,0x03,0x00,0xfa,0xff,0x25,0x01,0x5e,0x03,0xaa,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x3d,0x40,0x3a,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x03,0x02,0x85,0x07,0x01,0x03,0x04,0x03,0x85,0x00,0x04,\r\n0x05,0x04,0x85,0x08,0x01,0x05,0x05,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xfa,0x64,0x64,0x64,0x64,0x64,0x02,0x58,0x01,0x52,0xfe,0xae,0xfe,0x69,0x01,0x4e,0xfe,\r\n0xb2,0xfe,0x64,0x01,0x51,0xfe,0xaf,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0x01,0x40,0x03,0x20,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,\r\n0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x07,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0xc8,0x32,0x64,0x32,0xfe,0x70,0x03,0x34,0x02,0xbc,0xfd,0x44,0xfc,0xcc,0x00,\r\n0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x14,0x01,0x0e,\r\n0x64,0x01,0x0e,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0x5e,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,\r\n0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0x64,0x01,0x40,0x64,0x02,0xbc,0xfc,0xe0,0x00,0x00,0x01,0x00,0xfa,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,\r\n0x18,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0xfa,0x64,0x01,0x0e,0x01,0x40,0x03,0x20,0xfd,0x44,0x64,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x06,0x17,0x2b,0x13,0x11,0x33,0x11,0xfa,0x64,0xfe,\r\n0x70,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,\r\n0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,\r\n0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfa,0x10,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,\r\n0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,\r\n0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x37,0x40,0x34,0x00,0x03,0x02,0x03,0x85,0x07,0x01,0x06,0x05,0x06,0x86,0x04,0x01,0x02,0x01,0x05,0x02,0x57,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x05,0x5f,0x00,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,\r\n0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x33,0x35,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0xdc,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x32,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,\r\n0x05,0x01,0x04,0x03,0x04,0x86,0x00,0x02,0x01,0x03,0x02,0x57,0x00,0x01,0x00,0x00,0x03,0x01,0x00,0x67,0x00,0x02,0x02,0x03,0x5f,0x00,0x03,0x02,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x01,0x72,0xfe,0xf2,0xfe,\r\n0x70,0x02,0xd0,0x64,0x32,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x01,0x04,0x03,0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,\r\n0x06,0x06,0x1a,0x2b,0x13,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0x01,0x0e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x02,0x03,0x02,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x03,0x01,0x04,0x03,\r\n0x57,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,\r\n0x76,0xc8,0xfd,0x62,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x01,0xd6,0x00,0x09,0x00,0x2e,0x40,0x2b,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x02,0x00,0x01,0x57,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,\r\n0x13,0x11,0x23,0x35,0x21,0x15,0x33,0x15,0x23,0x11,0xc8,0xdc,0x01,0xa4,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x32,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x04,0x00,0x57,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,\r\n0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x14,0xdc,0xc8,0xdc,0xdc,0x01,0x0e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0x32,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,\r\n0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x01,0x03,0x00,0x01,0x57,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,\r\n0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x44,0x64,0xfd,0x30,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0d,0x00,0x36,0x40,0x33,0x00,0x03,0x04,0x03,0x85,0x07,0x01,0x06,0x00,0x06,0x86,0x00,0x04,0x02,0x00,0x04,0x57,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x04,0x04,0x00,0x5f,0x05,0x01,\r\n0x00,0x04,0x00,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x11,0x11,0x11,0x11,0x11,0x08,0x06,0x1c,0x2b,0x13,0x11,0x23,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,0x11,0xfa,0x32,0xdc,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0x32,0x64,0x02,0xbc,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,\r\n0x04,0x60,0x00,0x0b,0x00,0x2c,0x40,0x29,0x03,0x01,0x01,0x00,0x01,0x85,0x04,0x02,0x02,0x00,0x05,0x05,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xaa,\r\n0x64,0x64,0x64,0xaa,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0x00,0x01,0xff,0xec,0x01,0x40,0x01,0xc2,0x04,0x60,0x00,0x09,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x04,0x04,0x00,0x57,0x02,0x01,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,\r\n0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x14,0xaa,0x64,0x64,0x64,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfc,0xe0,0x00,0x00,0x00,0x00,0x01,0x00,0x96,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x29,0x40,0x26,0x02,0x01,0x00,0x01,0x00,0x85,0x03,0x01,0x01,0x04,0x04,0x01,\r\n0x57,0x03,0x01,0x01,0x01,0x04,0x5f,0x05,0x01,0x04,0x01,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x96,0x64,0x64,0x64,0xaa,0x01,0x40,0x03,0x20,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,\r\n0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x21,\r\n0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,\r\n0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x14,0xdc,0xc8,0xdc,0x01,0x40,0x64,0x02,0xbc,0xfd,0x44,0x64,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,\r\n0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x03,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x21,0x35,0x33,0x11,0x33,0x11,0x23,0x11,0xfa,0xfe,0xf2,0xdc,0xc8,0x32,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfc,0xe0,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,\r\n0x01,0x40,0x01,0x90,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x33,0x11,0x33,0x11,0x14,0xdc,0xc8,0x01,0x40,0x64,0x02,0xbc,0xfc,0xe0,0x00,0x00,\r\n0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2c,0x40,0x29,0x00,0x01,0x02,0x01,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x02,0x00,0x00,0x02,0x57,0x00,0x02,0x02,0x00,0x5f,0x03,0x01,0x00,0x02,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x23,0x11,0x33,0x11,\r\n0x33,0x15,0x21,0x11,0xfa,0x32,0xc8,0xdc,0xfe,0xf2,0xfe,0x70,0x02,0xd0,0x03,0x20,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0x01,0x40,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,\r\n0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0xc8,0xc8,0xdc,0x01,0x40,0x03,0x20,0xfd,0x44,0x64,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,\r\n0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x00,0x01,0xff,0xec,\r\n0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x27,0x40,0x24,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0x01,\r\n0x0e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,\r\n0x06,0x1a,0x2b,0x13,0x11,0x23,0x35,0x21,0x11,0x33,0x11,0x33,0x11,0xc8,0xdc,0x01,0x0e,0x64,0x32,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xfc,0x9a,0x00,0x00,0x00,0x01,0xff,0xec,0x01,0x0e,0x01,0x5e,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x57,0x00,0x00,0x00,0x02,0x5f,\r\n0x03,0x01,0x02,0x00,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0x64,0x01,0x0e,0xc8,0x02,0x8a,0xfc,0xae,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2d,0x40,0x2a,0x00,0x01,0x00,0x01,0x85,0x05,0x01,0x04,0x03,0x04,0x86,0x02,\r\n0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x00,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x13,0x11,0x33,0x11,0x33,0x11,0x21,0x15,0x23,0x11,0xc8,0x32,0x64,0x01,0x0e,0xdc,0xfe,0x70,0x03,0x66,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x00,0x01,0x00,0xfa,\r\n0x01,0x0e,0x02,0x6c,0x04,0x60,0x00,0x05,0x00,0x24,0x40,0x21,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x03,0x01,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0xfa,0x64,0x01,0x0e,0x01,0x0e,0x03,0x52,0xfd,0x76,0xc8,0x00,\r\n0x00,0x02,0xff,0xec,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x0b,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,\r\n0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x03,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x05,0x35,0x21,0x15,0x14,0x01,0x0e,0x64,0x01,0x0e,0xfd,0x80,0x02,0x80,0x01,0xa4,0x64,0x02,0x58,0xfd,0xa8,0x64,0xc8,0x64,0x64,0x00,0x01,0xff,0xec,0x00,0xdc,0x01,0x5e,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x03,0x02,0x03,0x85,0x00,0x02,0x00,\r\n0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x04,0x04,0x00,0x57,0x00,0x00,0x00,0x04,0x5f,0x05,0x01,0x04,0x00,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x27,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x14,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0x64,0xdc,0x64,0x64,0x64,0x02,0x58,0xfc,0x7c,0x00,0x00,\r\n0x00,0x01,0x00,0xfa,0x00,0xdc,0x02,0x6c,0x04,0x60,0x00,0x09,0x00,0x2e,0x40,0x2b,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x06,0x06,0x1a,0x2b,0x37,0x11,0x33,0x11,\r\n0x21,0x15,0x21,0x15,0x21,0x15,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xdc,0x03,0x84,0xfd,0xa8,0x64,0x64,0x64,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x13,0x00,0x38,0x40,0x35,0x04,0x01,0x02,0x01,0x02,0x85,0x0a,0x09,0x02,0x07,0x00,0x07,0x86,0x05,0x03,0x02,0x01,0x00,0x00,0x01,0x57,0x05,0x03,0x02,\r\n0x01,0x01,0x00,0x5f,0x08,0x06,0x02,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0x23,0x11,0x23,0x11,0x96,0xaa,0xaa,0x64,0x64,0x64,0xaa,0xaa,0x64,0x64,0xfe,0x70,0x02,0xd0,\r\n0x64,0x02,0xbc,0xfd,0x44,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x02,0xd0,0xfd,0x30,0x00,0x02,0xff,0xec,0xfe,0x70,0x01,0xc2,0x04,0x60,0x00,0x07,0x00,0x0b,0x00,0x35,0x40,0x32,0x04,0x01,0x02,0x01,0x02,0x85,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,\r\n0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x11,0x33,0x11,0x96,0xaa,0xaa,0x64,0x64,0x64,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfa,0x10,0x05,0xf0,0xfa,0x10,0x00,0x02,0x00,0x96,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,\r\n0x00,0x0b,0x00,0x35,0x40,0x32,0x04,0x01,0x00,0x01,0x00,0x85,0x07,0x05,0x06,0x03,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x01,0x11,0x33,0x11,0x33,0x15,0x23,\r\n0x11,0x21,0x11,0x33,0x11,0x01,0x5e,0x64,0xaa,0xaa,0xfe,0xd4,0x64,0xfe,0x70,0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x05,0xf0,0xfa,0x10,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,\r\n0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xdc,0xdc,0xc8,0xdc,0xdc,0xfe,0x70,0x02,0xd0,0x64,0x02,0xbc,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x90,\r\n0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0xc8,0xdc,0xdc,0xc8,0xfe,0x70,0x02,0xd0,\r\n0x64,0x02,0xbc,0xfa,0x10,0x00,0x00,0x00,0x00,0x01,0x00,0xc8,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,\r\n0x13,0x11,0x33,0x11,0x33,0x15,0x23,0x11,0xc8,0xc8,0xdc,0xdc,0xfe,0x70,0x05,0xf0,0xfd,0x44,0x64,0xfd,0x30,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,\r\n0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x9e,0xc8,0x02,0x8a,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,\r\n0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,\r\n0x02,0x9e,0xc8,0x02,0x8a,0xfa,0x10,0x00,0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,\r\n0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x05,0xf0,0xfd,0x76,0xc8,0xfd,0x62,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x13,0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,\r\n0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x06,0x1f,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x0e,\r\n0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0x02,0x58,0xfd,0xa8,0x64,0x64,0x64,0xfd,0x94,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0xfe,0x70,0x01,0x5e,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x67,0x00,\r\n0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x11,0x21,0x35,0x21,0x35,0x21,0x35,0x21,0x11,0x33,0x11,0xfa,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0x64,0xfe,0x70,0x02,0x6c,0x64,0x64,0x64,0x02,0x58,0xfa,0x10,0x00,\r\n0x00,0x01,0x00,0xfa,0xfe,0x70,0x02,0x6c,0x04,0x60,0x00,0x0b,0x00,0x34,0x40,0x31,0x00,0x00,0x01,0x00,0x85,0x06,0x01,0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,\r\n0x1b,0x2b,0x13,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0xfa,0x64,0x01,0x0e,0xfe,0xf2,0x01,0x0e,0xfe,0xf2,0xfe,0x70,0x05,0xf0,0xfd,0xa8,0x64,0x64,0x64,0xfd,0x94,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x00,0x02,0x03,0x01,0x01,0x00,0x02,0x01,0x67,0x04,0x01,0x00,\r\n0x05,0x05,0x00,0x57,0x04,0x01,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x31,0x35,0x21,0x11,0x21,0x35,0x21,0x15,0x21,0x11,0x21,0x15,0x01,0x13,0xfe,0xed,0x02,0x58,0xfe,0xed,0x01,0x13,0x2d,0x02,0x80,0x2d,0x2d,0xfd,0x80,0x2d,0x00,0x00,0x00,\r\n0x00,0x02,0x00,0x44,0xff,0xf5,0x02,0x2e,0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x4d,0x40,0x4a,0x11,0x0e,0x0a,0x03,0x04,0x05,0x01,0x4c,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x07,0x01,0x04,0x03,0x00,0x04,0x59,0x07,0x01,0x04,0x04,0x00,0x61,0x06,\r\n0x01,0x00,0x04,0x00,0x51,0x16,0x15,0x01,0x00,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0d,0x0c,0x08,0x06,0x00,0x14,0x01,0x14,0x08,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x06,0x06,0x27,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,\r\n0xf9,0x50,0x65,0x65,0x50,0x45,0x59,0x05,0x02,0x36,0x53,0x65,0x6c,0x55,0x3c,0x01,0x06,0x59,0x3f,0x2c,0x34,0x34,0x2c,0x2c,0x34,0x34,0x0b,0x67,0x57,0xbf,0x57,0x67,0x58,0x48,0x96,0xfe,0xf5,0xfe,0xe5,0xa6,0x50,0x61,0x4e,0x3c,0x34,0xbf,0x34,0x3c,0x3c,0x34,0xbf,0x34,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x44,0xff,0x5b,0x02,0x2e,\r\n0x02,0x30,0x00,0x14,0x00,0x22,0x00,0x26,0x00,0x5d,0x40,0x5a,0x11,0x0e,0x0a,0x03,0x04,0x05,0x01,0x4c,0x00,0x02,0x01,0x05,0x01,0x02,0x05,0x80,0x00,0x03,0x04,0x00,0x04,0x03,0x00,0x80,0x00,0x01,0x00,0x05,0x04,0x01,0x05,0x69,0x09,0x01,0x04,0x08,0x01,0x00,0x06,0x04,0x00,0x69,0x00,0x06,0x07,0x07,0x06,0x57,0x00,0x06,0x06,0x07,\r\n0x5f,0x0a,0x01,0x07,0x06,0x07,0x4f,0x23,0x23,0x16,0x15,0x01,0x00,0x23,0x26,0x23,0x26,0x25,0x24,0x1d,0x1b,0x15,0x22,0x16,0x22,0x10,0x0f,0x0d,0x0c,0x08,0x06,0x00,0x14,0x01,0x14,0x0b,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x37,0x33,0x03,0x13,0x23,0x27,0x23,0x06,0x06,0x27,0x32,0x36,0x35,\r\n0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x07,0x35,0x21,0x15,0xf9,0x50,0x65,0x65,0x50,0x45,0x59,0x05,0x02,0x36,0x53,0x65,0x6c,0x55,0x3c,0x01,0x06,0x59,0x3f,0x2c,0x34,0x34,0x2c,0x2c,0x34,0x34,0x87,0x01,0xe0,0x0b,0x67,0x57,0xbf,0x57,0x67,0x58,0x48,0x96,0xfe,0xf5,0xfe,0xe5,0xa6,0x50,0x61,0x4e,0x3c,0x34,0xbf,0x34,\r\n0x3c,0x3c,0x34,0xbf,0x34,0x3c,0xe8,0x4b,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x92,0x02,0x1c,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x01,0x00,0x01,0x85,0x00,0x04,0x03,0x04,0x86,0x02,0x01,0x00,0x03,0x03,0x00,0x57,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,\r\n0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x13,0x35,0x33,0x03,0x33,0x13,0x33,0x15,0x23,0x13,0x23,0x03,0x3c,0xbd,0xae,0x5f,0xae,0xc4,0xa6,0x97,0x5f,0x97,0x01,0x22,0x50,0x01,0xcc,0xfe,0x34,0x50,0xfe,0x70,0x01,0x90,0x00,0xff,0xff,0xff,0xf6,0xff,0x92,0x02,0x62,0x03,0x3e,0x02,0x26,0x03,0x3e,0x00,0x00,0x00,0x06,0x04,0xbb,\r\n0x00,0x00,0x00,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x27,0x00,0x37,0x00,0x4d,0x40,0x4a,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x04,0x04,0x06,0x59,0x0b,0x01,0x06,0x06,0x04,0x61,0x0a,0x01,0x04,0x06,0x04,\r\n0x51,0x29,0x28,0x19,0x18,0x0d,0x0c,0x01,0x00,0x31,0x2f,0x28,0x37,0x29,0x37,0x21,0x1f,0x18,0x27,0x19,0x27,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,\r\n0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x52,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,\r\n0x4a,0x4a,0x76,0x44,0x44,0x76,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x01,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x00,0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,\r\n0x00,0x1f,0x00,0x2b,0x00,0x37,0x00,0x53,0x40,0x50,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,0x06,0x0a,0x01,0x04,0x02,0x06,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x2d,0x2c,0x21,0x20,0x11,0x10,0x01,0x00,0x33,\r\n0x31,0x2c,0x37,0x2d,0x37,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x34,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x36,0x49,0x49,0x36,0x36,0x49,0x49,0x36,0x23,0x2e,0x2e,0x23,0x22,0x2f,0x2f,0x32,0x51,0x8d,0x58,\r\n0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x85,0x49,0x36,0x36,0x49,0x49,0x36,0x36,0x49,0x2e,0x2f,0x22,0x23,0x2e,0x2e,0x23,0x22,0x2f,0x00,0x03,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x29,0x00,0x4b,0x40,0x48,0x24,0x01,0x04,0x03,\r\n0x29,0x28,0x27,0x21,0x04,0x02,0x04,0x02,0x4c,0x05,0x01,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x11,0x10,0x01,0x00,0x26,0x25,0x23,0x22,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,\r\n0x0f,0x08,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,\r\n0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x01,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x95,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,0x00,0x03,0xff,0xf6,0xff,0x92,0x02,0x62,0x03,0x3e,0x00,0x15,\r\n0x00,0x1e,0x00,0x27,0x00,0x24,0x40,0x21,0x24,0x23,0x1b,0x1a,0x14,0x0c,0x09,0x01,0x08,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x15,0x00,0x15,0x1a,0x03,0x06,0x17,0x2b,0x05,0x35,0x2e,0x02,0x35,0x34,0x36,0x36,0x37,0x35,0x33,0x15,0x1e,0x02,0x15,0x14,0x06,0x06,0x07,0x15,0x01,0x14,\r\n0x16,0x16,0x17,0x11,0x0e,0x02,0x05,0x34,0x26,0x26,0x27,0x11,0x3e,0x02,0x01,0x13,0x52,0x81,0x4a,0x4a,0x81,0x52,0x32,0x52,0x81,0x4a,0x4a,0x81,0x52,0xfe,0xe3,0x3d,0x6a,0x44,0x44,0x6a,0x3d,0x02,0x08,0x3d,0x6a,0x44,0x44,0x6a,0x3d,0x6e,0xa1,0x06,0x53,0x88,0x54,0x54,0x88,0x53,0x06,0xa1,0xa1,0x06,0x53,0x88,0x54,0x54,0x88,0x53,\r\n0x06,0xa1,0x01,0xd6,0x46,0x71,0x46,0x06,0x02,0x06,0x06,0x46,0x71,0x46,0x46,0x71,0x46,0x06,0xfd,0xfa,0x06,0x46,0x71,0x00,0x00,0x03,0xff,0xf6,0xff,0x5b,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x23,0x00,0x41,0x40,0x3e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x07,0x01,0x02,0x06,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,\r\n0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x20,0x20,0x11,0x10,0x01,0x00,0x20,0x23,0x20,0x23,0x22,0x21,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x09,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,\r\n0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x03,0x35,0x21,0x15,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0xce,0x02,0x30,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,\r\n0x76,0x4a,0x4a,0x76,0x44,0xfe,0xf7,0x4b,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x8c,0x00,0x68,0x01,0xcc,0x02,0x26,0x00,0x03,0x00,0x07,0x00,0x33,0x40,0x30,0x00,0x02,0x01,0x03,0x01,0x02,0x03,0x80,0x05,0x01,0x03,0x03,0x84,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x04,0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,\r\n0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x01,0x13,0x33,0x03,0x8c,0x01,0x40,0xfe,0xd9,0x50,0x82,0x82,0x01,0xdb,0x4b,0x4b,0xfe,0x8d,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0x00,0x04,0x00,0x32,0x00,0x00,0x02,0x26,0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x24,0x00,0x42,\r\n0x40,0x3f,0x09,0x01,0x05,0x06,0x05,0x86,0x03,0x01,0x01,0x08,0x02,0x07,0x03,0x00,0x04,0x01,0x00,0x69,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x00,0x06,0x04,0x06,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x21,0x20,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0a,0x06,\r\n0x16,0x2b,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x33,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x03,0x21,0x03,0x27,0x36,0x36,0x37,0x13,0x21,0x13,0x16,0x16,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xc1,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xca,0xbc,0x01,0xf4,0xbd,0x3c,0x04,0x13,0x0d,\r\n0x65,0xfe,0xec,0x69,0x0d,0x11,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfc,0xcf,0x02,0xda,0xfd,0x26,0x46,0x17,0x59,0x34,0x01,0xa0,0xfe,0x5f,0x34,0x58,0x00,0x03,0x00,0x32,0xff,0x92,0x02,0x26,0x03,0x3e,0x00,0x0b,0x00,0x0e,0x00,0x11,0x00,0x42,0x40,0x3f,0x0f,0x0c,0x02,0x00,\r\n0x06,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x00,0x06,0x05,0x06,0x00,0x05,0x80,0x08,0x01,0x05,0x05,0x84,0x03,0x01,0x01,0x06,0x06,0x01,0x57,0x03,0x01,0x01,0x01,0x06,0x5f,0x07,0x01,0x06,0x01,0x06,0x4f,0x00,0x00,0x11,0x10,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x06,0x1b,0x2b,0x05,0x35,0x23,0x03,\r\n0x33,0x35,0x33,0x15,0x33,0x03,0x23,0x15,0x03,0x03,0x23,0x13,0x13,0x23,0x01,0x13,0x25,0xbc,0xe1,0x32,0xe1,0xbd,0x24,0x2d,0x04,0x72,0xa2,0x72,0x72,0x6e,0x6e,0x02,0xda,0x64,0x64,0xfd,0x26,0x6e,0x01,0x21,0x01,0xd7,0xfe,0x29,0x01,0xd7,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0x92,0x02,0x26,0x03,0x3e,0x00,0x0b,0x00,0x0e,0x00,0x11,\r\n0x00,0x40,0x40,0x3d,0x11,0x0e,0x02,0x06,0x01,0x01,0x4c,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x06,0x01,0x85,0x08,0x01,0x05,0x00,0x05,0x86,0x07,0x01,0x06,0x00,0x00,0x06,0x57,0x07,0x01,0x06,0x06,0x00,0x5f,0x04,0x01,0x00,0x06,0x00,0x4f,0x00,0x00,0x10,0x0f,0x0d,0x0c,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x09,0x06,\r\n0x1b,0x2b,0x05,0x35,0x23,0x13,0x33,0x35,0x33,0x15,0x33,0x13,0x23,0x15,0x27,0x33,0x11,0x13,0x33,0x03,0x01,0x13,0xe1,0xbe,0x23,0x32,0x24,0xbd,0xe1,0xa3,0x72,0x30,0x73,0x73,0x6e,0x6e,0x02,0xda,0x64,0x64,0xfd,0x26,0x6e,0xbe,0x01,0xd3,0xfe,0x2d,0x01,0xd2,0x00,0x00,0x00,0x03,0x00,0x2d,0xff,0x5b,0x02,0x2b,0x02,0xda,0x00,0x03,\r\n0x00,0x0c,0x00,0x10,0x00,0x3c,0x40,0x39,0x09,0x01,0x02,0x00,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x05,0x01,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x06,0x01,0x04,0x03,0x04,0x4f,0x0d,0x0d,0x00,0x00,0x0d,0x10,0x0d,0x10,0x0f,0x0e,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x07,0x06,\r\n0x17,0x2b,0x33,0x13,0x33,0x13,0x25,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x35,0x21,0x15,0x32,0xbe,0x79,0xbd,0xfe,0x7c,0x01,0x15,0x67,0x0d,0x12,0x05,0x04,0x13,0x0d,0xdb,0x01,0xfe,0x02,0xda,0xfd,0x26,0x50,0x01,0x9f,0x34,0x5a,0x17,0x16,0x5a,0x34,0xfd,0x6b,0x4b,0x4b,0x00,0x00,0x00,0x03,0x00,0x32,0x00,0x00,0x02,0x26,\r\n0x03,0xb1,0x00,0x19,0x00,0x1d,0x00,0x26,0x00,0x97,0x4b,0xb0,0x14,0x50,0x58,0x40,0x35,0x00,0x05,0x03,0x01,0x04,0x05,0x72,0x00,0x02,0x04,0x00,0x01,0x02,0x72,0x0a,0x01,0x07,0x08,0x07,0x86,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x09,0x01,0x00,0x06,0x04,0x00,0x6a,0x00,0x06,0x08,0x08,0x06,0x57,0x00,0x06,0x06,0x08,\r\n0x5f,0x00,0x08,0x06,0x08,0x4f,0x1b,0x40,0x37,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x0a,0x01,0x07,0x08,0x07,0x86,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x09,0x01,0x00,0x06,0x04,0x00,0x6a,0x00,0x06,0x08,0x08,0x06,0x57,0x00,0x06,0x06,0x08,0x5f,0x00,0x08,0x06,0x08,0x4f,\r\n0x59,0x40,0x1d,0x1a,0x1a,0x01,0x00,0x23,0x22,0x1a,0x1d,0x1a,0x1d,0x1c,0x1b,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0b,0x06,0x16,0x2b,0x01,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x03,0x03,0x21,0x03,0x27,0x36,0x36,\r\n0x37,0x13,0x21,0x13,0x16,0x16,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0xad,0xbc,0x01,0xf4,0xbd,0x3c,0x04,0x13,0x0d,0x65,0xfe,0xec,0x69,0x0d,0x11,0x03,0x2f,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0xfc,0xd1,0x02,0xda,0xfd,0x26,\r\n0x46,0x17,0x59,0x34,0x01,0xa0,0xfe,0x5f,0x34,0x58,0x00,0x00,0x00,0x03,0xff,0xf6,0xff,0x5b,0x02,0x62,0x02,0x9f,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x27,0x40,0x24,0x07,0x06,0x05,0x03,0x02,0x01,0x06,0x00,0x4a,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x08,0x08,0x08,0x0b,0x08,0x0b,\r\n0x19,0x03,0x06,0x17,0x2b,0x25,0x09,0x02,0x05,0x37,0x27,0x07,0x03,0x35,0x21,0x15,0x01,0x2c,0xfe,0xca,0x01,0x36,0x01,0x36,0xfe,0xca,0xe8,0xe8,0xe8,0x30,0x02,0x30,0x32,0x01,0x36,0x01,0x37,0xfe,0xc9,0xe8,0xe8,0xe9,0xe9,0xfd,0xf3,0x4b,0x4b,0x00,0xff,0xff,0x00,0x3c,0x00,0x32,0x02,0x1c,0x03,0x0c,0x00,0x27,0x06,0x72,0x02,0x58,\r\n0x00,0x00,0x02,0x06,0x04,0x27,0x00,0x00,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x17,0x00,0x28,0x40,0x25,0x16,0x0d,0x0a,0x01,0x04,0x03,0x00,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x03,0x00,0x85,0x04,0x01,0x03,0x03,0x76,0x00,0x00,0x00,0x17,0x00,0x17,0x15,0x15,0x15,0x05,0x06,0x19,0x2b,0x05,0x35,\r\n0x26,0x26,0x35,0x11,0x33,0x11,0x14,0x16,0x17,0x11,0x33,0x11,0x36,0x36,0x35,0x11,0x33,0x11,0x14,0x06,0x07,0x15,0x01,0x13,0x5a,0x69,0x32,0x4e,0x43,0x32,0x43,0x4e,0x32,0x69,0x5a,0x6e,0xc9,0x08,0x75,0x5e,0x01,0x40,0xfe,0xbb,0x47,0x5a,0x08,0x02,0xb6,0xfd,0x4a,0x08,0x5a,0x47,0x01,0x45,0xfe,0xc0,0x5e,0x75,0x08,0xc9,0x00,0x00,\r\n0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x4b,0x40,0x48,0x00,0x00,0x01,0x00,0x85,0x07,0x01,0x01,0x0b,0x0c,0x02,0x08,0x09,0x01,0x08,0x69,0x0d,0x0a,0x02,0x09,0x06,0x01,0x02,0x03,0x09,0x02,0x69,0x05,0x01,0x03,0x04,0x04,0x03,0x57,0x05,0x01,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,\r\n0x4f,0x24,0x23,0x1b,0x1a,0x29,0x28,0x23,0x2b,0x24,0x2b,0x20,0x1f,0x1a,0x22,0x1b,0x22,0x14,0x21,0x11,0x11,0x12,0x14,0x21,0x10,0x0e,0x06,0x1e,0x2b,0x13,0x33,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x33,0x15,0x21,0x35,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x07,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x35,\r\n0x17,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0xff,0x5a,0x05,0x35,0x43,0x43,0x35,0x05,0xff,0xfd,0xa8,0xff,0x05,0x34,0x44,0x44,0x34,0x05,0x05,0x23,0x2d,0x2d,0x23,0x05,0x5f,0x23,0x2d,0x2d,0x23,0x05,0x02,0x58,0x91,0x43,0x35,0x34,0x44,0x87,0x50,0x50,0x87,0x44,0x34,0x35,0x43,0x28,0x2d,0x23,0x23,0x2d,0xa0,0xa0,0x2d,0x23,0x23,\r\n0x2d,0xa0,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x5b,0x02,0x58,0x02,0x58,0x00,0x07,0x00,0x0b,0x00,0x37,0x40,0x34,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,\r\n0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x31,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x05,0x35,0x21,0x15,0xff,0x5a,0xff,0xfd,0xa8,0x02,0x58,0x50,0x02,0x08,0xfd,0xf8,0x50,0xa5,0x4b,0x4b,0x00,0x00,0x01,0x00,0x00,0xff,0xf6,0x02,0x58,0x02,0xda,0x00,0x0e,0x00,0x2b,0x40,0x28,0x00,0x03,0x02,0x03,0x85,0x06,0x01,0x00,\r\n0x01,0x00,0x86,0x04,0x01,0x02,0x01,0x01,0x02,0x57,0x04,0x01,0x02,0x02,0x01,0x5f,0x05,0x01,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1d,0x2b,0x05,0x27,0x33,0x35,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x15,0x33,0x01,0x2d,0xc9,0x9b,0xff,0xff,0x5a,0xff,0xff,0x9b,0x0a,0xa9,0xa6,0x50,0x01,0x45,\r\n0xfe,0xbb,0x50,0xa6,0x00,0x02,0x00,0x50,0xff,0x5b,0x02,0x17,0x02,0x2d,0x00,0x2c,0x00,0x30,0x00,0x62,0x40,0x5f,0x07,0x01,0x05,0x04,0x01,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x07,0x05,0x06,0x05,0x07,0x06,0x80,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x05,0x07,0x04,0x05,0x67,0x00,0x06,0x0a,0x01,\r\n0x00,0x08,0x06,0x00,0x69,0x00,0x08,0x09,0x09,0x08,0x57,0x00,0x08,0x08,0x09,0x5f,0x0b,0x01,0x09,0x08,0x09,0x4f,0x2d,0x2d,0x02,0x00,0x2d,0x30,0x2d,0x30,0x2f,0x2e,0x2a,0x29,0x27,0x24,0x20,0x1e,0x1d,0x1b,0x18,0x15,0x13,0x12,0x10,0x0d,0x00,0x2c,0x02,0x2c,0x0c,0x06,0x16,0x2b,0x05,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,\r\n0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x05,0x35,0x21,0x15,0x01,0x4b,0x34,0x5b,0x6c,0x41,0x46,0x3a,0x3b,0x64,0x58,0x2e,0x53,0x6b,0x09,0x5f,0x05,0x38,0x2b,0x2e,0x5d,0x30,0x2e,0x7b,0x83,\r\n0x33,0x35,0x37,0x31,0x34,0x2e,0x3b,0x04,0x5f,0x0a,0x6d,0xfe,0xc2,0x01,0x9e,0x07,0x58,0x49,0x3e,0x47,0x05,0x04,0x04,0x3a,0x31,0x47,0x4f,0x4c,0x42,0x1d,0x21,0x4b,0x24,0x2a,0x4e,0x30,0x28,0x25,0x30,0x1f,0x1a,0x40,0x49,0x9e,0x4b,0x4b,0x00,0x00,0xff,0xff,0x00,0x55,0x00,0x41,0x02,0x03,0x03,0x09,0x02,0x26,0x04,0x1b,0x00,0x00,\r\n0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0xff,0xff,0x00,0x37,0x00,0x00,0x02,0x26,0x02,0x26,0x02,0x06,0x02,0x7d,0x00,0x00,0x00,0x02,0x00,0x37,0xff,0x5b,0x02,0x26,0x02,0x26,0x00,0x0d,0x00,0x11,0x00,0x3c,0x40,0x39,0x00,0x02,0x00,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x06,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x05,0x05,0x04,\r\n0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x0e,0x0e,0x01,0x00,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x0c,0x0a,0x07,0x06,0x05,0x04,0x00,0x0d,0x01,0x0d,0x08,0x06,0x16,0x2b,0x21,0x22,0x26,0x35,0x11,0x23,0x35,0x21,0x11,0x14,0x16,0x33,0x33,0x15,0x05,0x35,0x21,0x15,0x01,0x9f,0x49,0x57,0xc8,0x01,0x22,0x26,0x20,0x87,\r\n0xfe,0x16,0x01,0xea,0x55,0x46,0x01,0x39,0x52,0xfe,0x75,0x22,0x27,0x52,0xa5,0x4b,0x4b,0x00,0x00,0x00,0x00,0x04,0x00,0x7d,0x00,0xd2,0x01,0xdb,0x02,0xaf,0x00,0x0b,0x00,0x17,0x00,0x23,0x00,0x2f,0x00,0x4d,0x40,0x4a,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0b,0x01,\r\n0x06,0x04,0x04,0x06,0x59,0x0b,0x01,0x06,0x06,0x04,0x61,0x0a,0x01,0x04,0x06,0x04,0x51,0x25,0x24,0x19,0x18,0x0d,0x0c,0x01,0x00,0x2b,0x29,0x24,0x2f,0x25,0x2f,0x1f,0x1d,0x18,0x23,0x19,0x23,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0c,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,\r\n0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x52,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,\r\n0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x02,0x2f,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0xa3,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x00,0x03,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x01,0xc2,0x00,0x0b,0x00,0x17,0x00,0x1b,0x00,0x41,0x40,0x3e,\r\n0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x07,0x01,0x02,0x06,0x01,0x00,0x04,0x02,0x00,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x09,0x06,0x16,0x2b,0x25,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x03,0x35,0x21,0x15,0x01,0x2c,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x7d,0x01,0x40,0xd2,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,\r\n0x2d,0xfe,0x61,0x4b,0x4b,0x00,0x00,0x00,0x00,0x02,0x00,0x1e,0xff,0x92,0x02,0x3a,0x03,0x3e,0x00,0x14,0x00,0x1d,0x00,0x45,0x40,0x42,0x00,0x02,0x01,0x02,0x85,0x0a,0x01,0x07,0x00,0x07,0x86,0x03,0x01,0x01,0x09,0x01,0x04,0x05,0x01,0x04,0x69,0x0b,0x08,0x02,0x05,0x00,0x00,0x05,0x59,0x0b,0x08,0x02,0x05,0x05,0x00,0x61,0x06,0x01,\r\n0x00,0x05,0x00,0x51,0x16,0x15,0x00,0x00,0x19,0x17,0x15,0x1d,0x16,0x1d,0x00,0x14,0x00,0x14,0x11,0x11,0x11,0x11,0x11,0x24,0x21,0x0c,0x06,0x1d,0x2b,0x05,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x11,0x03,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2a,0x30,0x65,0x77,\r\n0x77,0x65,0x30,0x32,0xde,0xde,0xde,0xde,0x67,0x35,0x35,0x4c,0x59,0x59,0x6e,0x01,0x04,0x75,0x62,0x62,0x75,0xfa,0xfa,0x2d,0xfe,0xac,0x2d,0xfe,0xfc,0x01,0x31,0x01,0x54,0x5c,0x4e,0x4e,0x5c,0x00,0x00,0x00,0x00,0x01,0xff,0xec,0x00,0x00,0x02,0x58,0x02,0xda,0x00,0x0e,0x00,0x37,0x40,0x34,0x06,0x01,0x02,0x03,0x05,0x01,0x01,0x02,\r\n0x04,0x01,0x00,0x01,0x03,0x4c,0x00,0x03,0x02,0x03,0x85,0x00,0x00,0x01,0x00,0x86,0x04,0x01,0x02,0x01,0x01,0x02,0x57,0x04,0x01,0x02,0x02,0x01,0x5f,0x05,0x01,0x01,0x02,0x01,0x4f,0x11,0x11,0x11,0x14,0x11,0x10,0x06,0x06,0x1c,0x2b,0x21,0x23,0x11,0x23,0x15,0x27,0x37,0x15,0x33,0x11,0x33,0x11,0x33,0x15,0x23,0x01,0x59,0x5a,0x77,\r\n0x9c,0x9c,0x77,0x5a,0xff,0xff,0x01,0x45,0xa0,0xc8,0xc8,0xa0,0x01,0x45,0xfe,0xbb,0x50,0x00,0x00,0x00,0x00,0x01,0x00,0x37,0xff,0xf6,0x02,0x21,0x02,0x30,0x00,0x2a,0x00,0x3a,0x40,0x37,0x28,0x01,0x01,0x02,0x01,0x4c,0x1e,0x1d,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,\r\n0x01,0x00,0x61,0x04,0x05,0x02,0x00,0x01,0x00,0x51,0x01,0x00,0x26,0x24,0x18,0x16,0x13,0x12,0x0f,0x0d,0x00,0x2a,0x01,0x2a,0x06,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x26,0x27,0x35,0x16,0x16,0x15,0x15,0x14,\r\n0x06,0x23,0x22,0x26,0x27,0x06,0x06,0xb5,0x3a,0x44,0x4b,0x41,0x1a,0x1d,0x3d,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x1f,0x1d,0x44,0x4d,0x43,0x3b,0x31,0x3f,0x07,0x07,0x3f,0x0a,0x56,0x4b,0xcf,0x53,0x6d,0x0a,0x5f,0x05,0x3a,0x2c,0xd0,0x54,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xd0,0x29,0x37,0x06,0x5f,0x0a,0x6a,0x51,0xcf,0x4b,0x56,0x39,\r\n0x32,0x32,0x39,0x00,0x00,0x02,0x00,0x37,0xff,0x5b,0x02,0x21,0x02,0x30,0x00,0x2a,0x00,0x2e,0x00,0x4a,0x40,0x47,0x28,0x01,0x01,0x02,0x01,0x4c,0x1e,0x1d,0x08,0x07,0x04,0x02,0x4a,0x00,0x02,0x01,0x02,0x85,0x03,0x01,0x01,0x04,0x07,0x02,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,\r\n0x06,0x05,0x06,0x4f,0x2b,0x2b,0x01,0x00,0x2b,0x2e,0x2b,0x2e,0x2d,0x2c,0x26,0x24,0x18,0x16,0x13,0x12,0x0f,0x0d,0x00,0x2a,0x01,0x2a,0x09,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x15,0x06,0x06,0x15,0x15,0x14,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x35,0x35,0x34,0x26,0x27,0x35,0x16,0x16,0x15,\r\n0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x06,0x06,0x07,0x35,0x21,0x15,0xb5,0x3a,0x44,0x4b,0x41,0x1a,0x1d,0x3d,0x1d,0x21,0x4a,0x21,0x1d,0x3d,0x1f,0x1d,0x44,0x4d,0x43,0x3b,0x31,0x3f,0x07,0x07,0x3f,0xaf,0x01,0xea,0x0a,0x56,0x4b,0xcf,0x53,0x6d,0x0a,0x5f,0x05,0x3a,0x2c,0xd0,0x54,0x2c,0x28,0xc3,0xc3,0x28,0x2c,0x54,0xd0,0x29,0x37,\r\n0x06,0x5f,0x0a,0x6a,0x51,0xcf,0x4b,0x56,0x39,0x32,0x32,0x39,0x9b,0x4b,0x4b,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,\r\n0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x31,0x40,0x2e,0x09,0x06,0x02,0x03,0x02,0x01,0x4c,0x00,\r\n0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x08,0x07,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x03,0x21,0x01,0x05,0x21,0x01,0x02,0x58,0x32,0xfe,0x2a,0x01,0xd6,0xfe,0x0c,0x01,0xd8,0xfe,0x28,0x6f,0x03,\r\n0xad,0xfc,0x53,0x03,0x80,0xfc,0xda,0x2d,0x03,0x29,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x0c,0x00,0x1c,0x00,0x25,0x00,0x55,0x40,0x52,0x25,0x1f,0x0a,0x07,0x04,0x04,0x05,0x01,0x4c,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x09,0x01,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x0a,0x01,0x04,0x00,\r\n0x07,0x06,0x04,0x07,0x69,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x08,0x01,0x01,0x06,0x01,0x4f,0x0e,0x0d,0x05,0x04,0x00,0x00,0x23,0x21,0x1e,0x1d,0x16,0x14,0x0d,0x1c,0x0e,0x1c,0x09,0x08,0x04,0x0c,0x05,0x0c,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x32,0x16,0x17,0x35,0x21,0x15,\r\n0x36,0x36,0x13,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x07,0x21,0x35,0x06,0x06,0x23,0x22,0x26,0x27,0x02,0x58,0xfe,0xd4,0x50,0x83,0x27,0xfe,0x0c,0x28,0x82,0x50,0x48,0x71,0x41,0x41,0x71,0x48,0x47,0x71,0x42,0x42,0x71,0xb3,0x01,0xf4,0x27,0x83,0x50,0x50,0x82,0x28,0x6f,0x03,0xad,0xfc,0x53,\r\n0x03,0x04,0x46,0x3b,0xfd,0xfd,0x3c,0x45,0xfd,0xd9,0x42,0x71,0x47,0x47,0x71,0x42,0x42,0x71,0x47,0x47,0x71,0x42,0xb0,0xfe,0x3b,0x46,0x45,0x3c,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x13,0x00,0x1f,0x00,0x4c,0x40,0x49,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x09,0x01,0x04,0x07,\r\n0x05,0x04,0x69,0x00,0x07,0x0a,0x01,0x06,0x02,0x07,0x06,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x15,0x14,0x09,0x08,0x00,0x00,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x0f,0x0d,0x08,0x13,0x09,0x13,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x0b,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,\r\n0x25,0x21,0x11,0x21,0x13,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x26,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfe,0xde,0x29,0x22,\r\n0x22,0x29,0x29,0x22,0x22,0x29,0xfe,0x5c,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x4c,0x40,0x49,0x0d,0x0a,0x02,0x06,0x02,0x01,0x4c,0x00,0x05,0x06,0x04,0x06,0x05,0x04,0x80,0x00,0x00,0x08,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x02,\r\n0x00,0x06,0x05,0x02,0x06,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x07,0x01,0x01,0x04,0x01,0x4f,0x04,0x04,0x00,0x00,0x13,0x12,0x0c,0x0b,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x21,0x35,0x01,0x21,0x11,0x03,0x23,0x03,0x13,0x36,\r\n0x36,0x37,0x13,0x21,0x13,0x16,0x16,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xbd,0x79,0xbe,0xfe,0x05,0x0f,0x0e,0x70,0xfe,0xd9,0x6f,0x0e,0x14,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0x37,0x37,0xfc,0xad,0x02,0xf7,0xfd,0x4b,0x02,0xb6,0xfd,0x90,0x17,0x5a,0x34,0x01,0x9f,0xfe,0x60,0x34,0x59,0x00,0x00,0x00,0x04,0x00,0x00,\r\n0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x16,0x00,0x50,0x40,0x4d,0x0f,0x01,0x04,0x02,0x08,0x05,0x02,0x06,0x04,0x02,0x4c,0x00,0x02,0x03,0x04,0x03,0x02,0x04,0x80,0x00,0x00,0x08,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x04,0x00,0x06,0x05,0x04,0x06,0x67,0x00,0x05,0x01,0x01,0x05,0x57,0x00,0x05,0x05,0x01,\r\n0x5f,0x07,0x01,0x01,0x05,0x01,0x4f,0x04,0x04,0x00,0x00,0x16,0x15,0x14,0x13,0x0b,0x0a,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x13,0x33,0x13,0x11,0x01,0x21,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x21,0x35,0x21,0x02,0x58,0xfd,0xda,0xbe,0x79,0xbd,0xfe,0x73,\r\n0x01,0x27,0x70,0x0d,0x12,0x05,0x04,0x12,0x0e,0xd6,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfd,0x14,0x02,0xb5,0xfd,0x4b,0x02,0xec,0xfd,0x3f,0x01,0x9f,0x34,0x5b,0x16,0x16,0x5a,0x34,0xfd,0xce,0x42,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x08,0x00,0x0c,0x00,0x11,0x00,0x37,\r\n0x40,0x34,0x11,0x10,0x0f,0x0c,0x0b,0x0a,0x08,0x05,0x08,0x03,0x02,0x01,0x4c,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x0e,0x0d,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x17,0x11,0x21,0x11,\r\n0x13,0x37,0x27,0x07,0x03,0x21,0x11,0x07,0x27,0x02,0x58,0xfe,0xd4,0xfa,0xfe,0x0c,0xfa,0xe8,0xe8,0xe8,0x12,0x01,0xf4,0xfa,0xfa,0x6f,0x03,0xad,0xfc,0x53,0x03,0x0e,0xfb,0x01,0x6d,0xfe,0x93,0xfe,0xdc,0xe8,0xe9,0xe9,0xfe,0x56,0x01,0x6e,0xfa,0xfa,0x00,0x05,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x13,\r\n0x00,0x17,0x00,0x23,0x00,0x5d,0x40,0x5a,0x00,0x00,0x0b,0x01,0x03,0x05,0x00,0x03,0x67,0x00,0x05,0x0c,0x01,0x04,0x02,0x05,0x04,0x69,0x00,0x02,0x00,0x07,0x09,0x02,0x07,0x67,0x00,0x09,0x0d,0x01,0x08,0x06,0x09,0x08,0x69,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x0a,0x01,0x01,0x06,0x01,0x4f,0x19,0x18,0x09,0x08,\r\n0x04,0x04,0x00,0x00,0x1f,0x1d,0x18,0x23,0x19,0x23,0x17,0x16,0x15,0x14,0x0f,0x0d,0x08,0x13,0x09,0x13,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0e,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x21,0x11,0x21,0x17,0x22,0x26,0x35,0x34,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0xfe,0xe0,0x01,0xf4,0xfe,0x0c,0xfa,0x25,0x2e,0x2e,0x25,0x26,0x2d,0x2d,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0x7c,0x01,0x84,0xfe,0xd4,0x29,0x22,0x22,0x29,0x29,0x22,0x22,0x29,0xfd,0xd9,0x01,0x84,0xf2,0x29,0x22,0x22,\r\n0x29,0x29,0x22,0x22,0x29,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x47,0x40,0x44,0x14,0x13,0x11,0x10,0x04,0x04,0x03,0x12,0x01,0x02,0x04,0x02,0x4c,0x05,0x01,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x00,0x06,0x01,0x03,0x04,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,\r\n0x02,0x02,0x01,0x60,0x07,0x01,0x01,0x02,0x01,0x50,0x00,0x00,0x1e,0x1d,0x19,0x18,0x0c,0x0b,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x23,0x11,0x14,0x06,0x07,0x33,0x36,0x36,0x37,0x37,0x15,0x07,0x27,0x35,0x17,0x16,0x16,0x17,0x33,0x26,0x26,0x35,0x11,0x23,0x02,0x58,\r\n0xfd,0xda,0x01,0xf4,0xcd,0x03,0x02,0x0a,0x05,0x1b,0x16,0x60,0xc7,0xc9,0x5f,0x16,0x1d,0x04,0x0a,0x01,0x04,0xcd,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfd,0xc1,0x16,0x2d,0x0d,0x06,0x1d,0x12,0x51,0x69,0xa9,0xa9,0x69,0x50,0x12,0x1d,0x07,0x0d,0x2d,0x16,0x02,0x3f,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,\r\n0x00,0x0e,0x00,0x14,0x00,0x3e,0x40,0x3b,0x14,0x11,0x0e,0x0b,0x07,0x05,0x04,0x02,0x01,0x4c,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x00,0x00,0x02,0x04,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x05,0x01,0x01,0x03,0x01,0x4f,0x00,0x00,0x13,0x12,0x10,0x0f,0x0d,0x0c,0x00,0x03,0x00,0x03,0x11,\r\n0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x16,0x16,0x17,0x36,0x36,0x37,0x13,0x35,0x21,0x15,0x11,0x21,0x11,0x03,0x23,0x03,0x02,0x58,0xfe,0xb4,0x0b,0x12,0x04,0x05,0x13,0x0a,0xd7,0xfe,0x0c,0x01,0xf4,0xdb,0x3e,0xdb,0x6f,0x03,0xad,0xfc,0x53,0xf0,0x1c,0x3a,0x11,0x11,0x3b,0x1b,0x02,0x49,0x47,0x3c,0xfc,0xe9,0x02,0x8f,0xfd,\r\n0xa8,0x02,0x58,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x47,0x40,0x44,0x00,0x00,0x09,0x01,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x67,0x00,0x06,0x01,0x01,0x06,0x57,0x00,0x06,0x06,0x01,0x5f,0x08,0x01,\r\n0x01,0x06,0x01,0x4f,0x04,0x04,0x00,0x00,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0a,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x21,0x11,0x01,0x21,0x35,0x21,0x11,0x21,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfe,0x0c,0x01,0xf4,0xfe,0x0c,0x6f,\r\n0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0xf7,0x01,0x09,0xfe,0x07,0xa0,0xfe,0x06,0x01,0x0a,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x3b,0x40,0x38,0x14,0x13,0x0e,0x0a,0x09,0x06,0x05,0x07,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x00,\r\n0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x04,0x04,0x00,0x00,0x12,0x11,0x04,0x07,0x04,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x15,0x05,0x11,0x03,0x25,0x11,0x25,0x36,0x36,0x37,0x26,0x26,0x01,0x21,0x11,0x05,0x02,0x58,0xfd,0xda,0x01,0xf4,0x78,0xfe,\r\n0x84,0x01,0x7c,0x13,0x21,0x08,0x09,0x22,0xfe,0x73,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0x7c,0xfa,0x01,0x76,0xfe,0x6e,0xbc,0xfe,0x59,0xbb,0x09,0x0d,0x02,0x02,0x0e,0xfe,0x47,0x01,0x79,0xfa,0x00,0x00,0x00,0xff,0xff,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x02,0x26,0x04,0x4d,0x00,0x28,0x01,0x06,0x05,0x85,\r\n0x00,0x00,0x00,0x08,0xb1,0x00,0x02,0xb0,0x28,0xb0,0x35,0x2b,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x5a,0x40,0x57,0x17,0x01,0x06,0x05,0x18,0x11,0x0a,0x03,0x03,0x06,0x0b,0x01,0x04,0x03,0x03,0x4c,0x00,0x05,0x07,0x06,0x07,0x05,0x06,0x80,0x00,0x04,0x03,0x02,0x03,0x04,0x02,0x80,0x00,0x00,\r\n0x00,0x07,0x05,0x00,0x07,0x67,0x00,0x06,0x00,0x03,0x04,0x06,0x03,0x68,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1d,0x1c,0x1a,0x13,0x12,0x10,0x0f,0x08,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x09,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x23,0x22,0x26,\r\n0x27,0x15,0x16,0x16,0x17,0x17,0x23,0x27,0x37,0x33,0x07,0x06,0x06,0x07,0x15,0x36,0x36,0x33,0x33,0x11,0x21,0x02,0x58,0xfd,0xda,0x01,0xf4,0xf4,0x10,0x29,0x0d,0x09,0x1a,0x0a,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0d,0x19,0x07,0x0d,0x29,0x10,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x01,0x82,0x03,0x01,0x09,0x07,0x19,0x0d,0x6e,\r\n0xc8,0xc8,0x6d,0x10,0x19,0x06,0x09,0x02,0x03,0x01,0x81,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x10,0x00,0x14,0x00,0x3b,0x40,0x38,0x14,0x13,0x0e,0x0a,0x09,0x06,0x05,0x07,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x00,0x03,0x01,0x01,0x03,0x57,0x00,0x03,0x03,\r\n0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x04,0x04,0x00,0x00,0x12,0x11,0x04,0x07,0x04,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x25,0x35,0x01,0x05,0x11,0x05,0x06,0x06,0x07,0x16,0x16,0x03,0x21,0x35,0x25,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x84,0x01,0x7c,0xfe,0x84,0x13,0x21,0x08,0x09,\r\n0x22,0x67,0x01,0xf4,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,0xfe,0x89,0xfa,0x7d,0xfe,0x41,0xbc,0x01,0xa7,0xbb,0x09,0x0d,0x02,0x02,0x0e,0xfe,0x64,0x7e,0xfa,0x00,0x05,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x1b,0x00,0x67,0x40,0x64,0x0f,0x01,0x05,0x03,0x02,0x03,0x05,0x02,\r\n0x80,0x00,0x0c,0x0b,0x0a,0x0b,0x0c,0x0a,0x80,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x04,0x01,0x02,0x09,0x01,0x07,0x06,0x02,0x07,0x67,0x08,0x01,0x06,0x0d,0x01,0x0b,0x0c,0x06,0x0b,0x67,0x00,0x0a,0x01,0x01,0x0a,0x57,0x00,0x0a,0x0a,0x01,0x5f,0x0e,0x01,0x01,0x0a,0x01,0x4f,0x04,0x04,0x00,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,\r\n0x15,0x14,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x04,0x0b,0x04,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x10,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x03,0x07,0x33,0x11,0x21,0x11,0x21,0x37,0x01,0x33,0x37,0x23,0x05,0x33,0x35,0x23,0x01,0x21,0x11,0x21,0x07,0x23,0x37,0x23,0x02,0x58,0x8e,0x40,0x9c,0xfe,0x0c,\r\n0x01,0x12,0x40,0xfe,0xae,0xba,0x3a,0xf4,0x01,0x00,0xf4,0xba,0xfe,0xc6,0x01,0xf4,0xfe,0xee,0x3e,0x46,0x3e,0x9c,0x6f,0x03,0xad,0xfc,0x53,0x03,0x26,0xaf,0x01,0x09,0xfe,0xf7,0xaf,0xfe,0x61,0xa0,0xa0,0xa0,0xfe,0x06,0x01,0x0a,0xaa,0xaa,0x00,0x00,0x00,0x04,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x1c,\r\n0x00,0x2a,0x00,0xa7,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x3a,0x0c,0x01,0x08,0x07,0x0a,0x07,0x08,0x72,0x00,0x00,0x00,0x03,0x06,0x00,0x03,0x67,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x04,0x00,0x07,0x08,0x04,0x07,0x69,0x00,0x0a,0x0d,0x01,0x09,0x02,0x0a,0x09,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x0b,\r\n0x01,0x01,0x02,0x01,0x4f,0x1b,0x40,0x3b,0x0c,0x01,0x08,0x07,0x0a,0x07,0x08,0x0a,0x80,0x00,0x00,0x00,0x03,0x06,0x00,0x03,0x67,0x00,0x06,0x00,0x05,0x04,0x06,0x05,0x67,0x00,0x04,0x00,0x07,0x08,0x04,0x07,0x69,0x00,0x0a,0x0d,0x01,0x09,0x02,0x0a,0x09,0x69,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x0b,0x01,0x01,\r\n0x02,0x01,0x4f,0x59,0x40,0x24,0x1e,0x1d,0x08,0x08,0x00,0x00,0x25,0x22,0x1d,0x2a,0x1e,0x29,0x08,0x1c,0x08,0x1c,0x1b,0x1a,0x14,0x12,0x11,0x0f,0x0b,0x09,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x0e,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x33,0x32,\r\n0x16,0x16,0x15,0x14,0x06,0x06,0x07,0x15,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0x95,0x32,0x40,0x4b,0x4b,0x41,0x7d,0x7d,0x46,0x67,0x39,0x30,0x55,0x38,0x3d,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfd,0xbc,\r\n0xb4,0x47,0x3b,0x3b,0x47,0x55,0x35,0x60,0x42,0x39,0x5b,0x36,0x03,0x69,0xd2,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x5a,0x40,0x57,0x0d,0x01,0x04,0x05,0x1a,0x13,0x0c,0x03,0x07,0x04,0x19,0x01,0x06,0x07,0x03,0x4c,0x00,0x05,0x03,0x04,0x03,0x05,\r\n0x04,0x80,0x00,0x06,0x07,0x02,0x07,0x06,0x02,0x80,0x00,0x00,0x00,0x03,0x05,0x00,0x03,0x67,0x00,0x04,0x00,0x07,0x06,0x04,0x07,0x68,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x08,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1c,0x15,0x14,0x12,0x11,0x0a,0x08,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x09,0x06,\r\n0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x11,0x33,0x32,0x16,0x17,0x35,0x26,0x26,0x27,0x27,0x33,0x17,0x07,0x23,0x37,0x36,0x36,0x37,0x35,0x06,0x06,0x23,0x23,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xf4,0x11,0x28,0x0d,0x07,0x19,0x0d,0x57,0x6a,0x9c,0x9c,0x6a,0x57,0x0a,0x1a,0x09,0x0d,0x28,0x11,0xf4,0x6f,0x03,0xad,\r\n0xfc,0x53,0x2d,0x03,0x53,0xfe,0x7f,0x03,0x02,0x09,0x06,0x19,0x10,0x6d,0xc8,0xc8,0x6e,0x0d,0x19,0x07,0x09,0x01,0x03,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x06,0x00,0x09,0x00,0x3c,0x40,0x39,0x08,0x05,0x02,0x03,0x02,0x01,0x4c,0x00,0x00,0x05,0x01,0x02,0x03,0x00,0x02,0x67,0x06,0x01,0x03,0x01,\r\n0x01,0x03,0x57,0x06,0x01,0x03,0x03,0x01,0x5f,0x04,0x01,0x01,0x03,0x01,0x4f,0x07,0x07,0x04,0x04,0x00,0x00,0x07,0x09,0x07,0x09,0x04,0x06,0x04,0x06,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x11,0x01,0x13,0x11,0x01,0x02,0x58,0xfd,0xda,0x01,0xd8,0x1c,0xfe,0x28,0x6f,0x03,0xad,0xfc,0x53,0x03,0x80,\r\n0xfc,0xd6,0x03,0x2a,0xfc,0xad,0x03,0x29,0xfc,0xd7,0x00,0x00,0x00,0x02,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x1e,0x00,0x48,0x40,0x45,0x10,0x01,0x03,0x06,0x12,0x11,0x0f,0x0e,0x04,0x02,0x03,0x02,0x4c,0x04,0x01,0x03,0x06,0x02,0x06,0x03,0x02,0x80,0x00,0x00,0x00,0x06,0x03,0x00,0x06,0x67,0x05,0x01,0x02,0x01,\r\n0x01,0x02,0x57,0x05,0x01,0x02,0x02,0x01,0x5f,0x07,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x1e,0x1d,0x1c,0x1b,0x17,0x16,0x0a,0x09,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x33,0x11,0x34,0x36,0x37,0x23,0x06,0x06,0x07,0x07,0x35,0x37,0x17,0x15,0x27,0x26,0x26,0x27,0x23,0x16,0x16,0x15,0x11,\r\n0x33,0x11,0x21,0x02,0x58,0xfd,0xda,0xcd,0x04,0x01,0x0a,0x04,0x1d,0x16,0x5f,0xc9,0xc7,0x60,0x16,0x1b,0x05,0x0a,0x02,0x03,0xcd,0xfe,0x0c,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x02,0x40,0x16,0x2d,0x0d,0x07,0x1d,0x12,0x50,0x69,0xa9,0xa9,0x69,0x51,0x12,0x1d,0x06,0x0d,0x2d,0x16,0xfd,0xc0,0x03,0x53,0x00,0x00,0x00,0x00,0x03,0x00,0x00,\r\n0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x09,0x00,0x14,0x00,0x43,0x40,0x40,0x14,0x10,0x0c,0x08,0x05,0x05,0x04,0x03,0x01,0x4c,0x06,0x01,0x03,0x02,0x04,0x02,0x03,0x04,0x80,0x00,0x00,0x00,0x02,0x03,0x00,0x02,0x67,0x00,0x04,0x01,0x01,0x04,0x57,0x00,0x04,0x04,0x01,0x5f,0x05,0x01,0x01,0x04,0x01,0x4f,0x04,0x04,0x00,0x00,\r\n0x0b,0x0a,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x07,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x01,0x13,0x11,0x21,0x11,0x13,0x03,0x21,0x35,0x03,0x26,0x26,0x27,0x06,0x06,0x07,0x03,0x02,0x58,0xfe,0xf3,0xdb,0xfe,0x0c,0xdb,0xdb,0x01,0xf4,0xd9,0x0a,0x13,0x05,0x04,0x12,0x0b,0xd8,0x6f,0x03,0xad,0xfc,0x53,0x03,0x49,\r\n0xfd,0xa8,0x02,0x8f,0xfd,0x71,0x02,0x58,0xfc,0xe4,0x42,0x02,0x4e,0x1b,0x3b,0x11,0x11,0x3a,0x1c,0xfd,0xb2,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0xff,0x91,0x02,0x58,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x49,0x40,0x46,0x0c,0x09,0x02,0x05,0x04,0x01,0x4c,0x00,0x04,0x03,0x05,0x03,0x04,0x05,0x80,0x07,0x01,0x05,0x02,0x03,\r\n0x05,0x02,0x7e,0x00,0x00,0x00,0x03,0x04,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x06,0x01,0x01,0x02,0x01,0x4f,0x08,0x08,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0b,0x0a,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x08,0x06,0x17,0x2b,0x15,0x11,0x21,0x11,0x25,0x21,0x11,0x21,0x13,0x27,0x35,0x33,0x15,\r\n0x07,0x02,0x58,0xfd,0xda,0x01,0xf4,0xfe,0x0c,0xd6,0x0c,0x60,0x0b,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0xfe,0x9d,0x96,0x96,0x96,0x96,0x00,0x00,0x02,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x02,0xda,0x00,0x05,0x00,0x09,0x00,0x38,0x40,0x35,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x01,0x02,0x01,0x85,\r\n0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x06,0x06,0x00,0x00,0x06,0x09,0x06,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x12,0x06,0x06,0x17,0x2b,0x01,0x27,0x35,0x33,0x15,0x07,0x03,0x35,0x21,0x15,0x01,0x08,0x0c,0x60,0x0b,0xc5,0x01,0x40,0x01,0xae,0x96,0x96,0x96,0x96,0xfd,0xad,0x4b,0x4b,\r\n0x00,0x02,0x00,0x5e,0xff,0x4c,0x01,0xfe,0x02,0x30,0x00,0x11,0x00,0x1f,0x00,0x3c,0x40,0x39,0x0e,0x01,0x03,0x04,0x01,0x4c,0x05,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x00,0x04,0x03,0x00,0x04,0x69,0x06,0x01,0x03,0x01,0x01,0x03,0x59,0x06,0x01,0x03,0x03,0x01,0x61,0x00,0x01,0x03,0x01,0x51,0x13,0x12,0x00,0x00,0x1a,0x18,0x12,0x1f,\r\n0x13,0x1f,0x00,0x11,0x00,0x11,0x25,0x23,0x07,0x06,0x18,0x2b,0x17,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x23,0x17,0x15,0x37,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x5e,0x70,0x61,0x61,0x6e,0x5f,0x53,0x3e,0x4e,0x07,0x03,0x02,0x76,0x39,0x3d,0x3d,0x39,0x39,0x3d,0x3f,\r\n0xb4,0x02,0x18,0x5f,0x6d,0x6d,0x5f,0xa1,0x5f,0x6e,0x3e,0x35,0x7d,0xa0,0xf8,0x44,0x40,0x96,0x40,0x44,0x44,0x40,0x96,0x3e,0x46,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x6c,0x02,0xda,0x00,0x0e,0x00,0x3d,0x40,0x3a,0x09,0x01,0x01,0x02,0x0a,0x01,0x00,0x01,0x0b,0x01,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x02,0x85,0x06,\r\n0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0e,0x14,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x33,0x11,0x23,0x35,0x33,0x11,0x33,0x11,0x33,0x35,0x17,0x07,0x35,0x23,0x11,0xff,0xff,0xff,0x5a,0x77,0x9c,0x9c,0x77,0x01,0x45,\r\n0x50,0x01,0x45,0xfe,0xbb,0xa0,0xc8,0xc8,0xa0,0xfe,0xbb,0x00,0x00,0x03,0x00,0x8c,0xff,0x5b,0x01,0xcc,0x02,0xe4,0x00,0x0d,0x00,0x11,0x00,0x15,0x00,0x48,0x40,0x45,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x80,0x07,0x01,0x03,0x04,0x00,0x03,0x04,0x7e,0x00,0x01,0x06,0x01,0x00,0x02,0x01,0x00,0x69,0x00,0x04,0x05,0x05,0x04,0x57,0x00,\r\n0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x12,0x12,0x0e,0x0e,0x01,0x00,0x12,0x15,0x12,0x15,0x14,0x13,0x0e,0x11,0x0e,0x11,0x10,0x0f,0x08,0x05,0x00,0x0d,0x01,0x0c,0x09,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x03,0x13,0x33,0x03,0x07,0x35,0x21,0x15,0x01,0x22,0x21,0x2a,\r\n0x2b,0x20,0x14,0x20,0x2b,0x2a,0x21,0x8c,0x50,0x82,0x82,0x6e,0x01,0x40,0x02,0x4e,0x2a,0x21,0x20,0x2b,0x2b,0x20,0x21,0x2a,0xfd,0xc6,0x01,0x37,0xfe,0xc9,0xb9,0x4b,0x4b,0x00,0x00,0x00,0x00,0x01,0x00,0x3c,0xff,0x92,0x02,0x1c,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,\r\n0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1b,0x2b,0x17,0x13,0x23,0x35,0x33,0x13,0x33,0x03,0x33,0x15,0x23,0x03,0x4b,0x97,0xa6,0xc4,0xae,0x5f,0xae,0xbd,0xdb,0x97,0x6e,0x01,0x90,0x50,0x01,0xcc,0xfe,0x34,0x50,\r\n0xfe,0x70,0x00,0x00,0x00,0x02,0x00,0xaa,0xff,0x91,0x01,0xae,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x04,0x01,0x01,0x02,0x01,0x4f,0x00,0x00,0x07,0x06,0x05,0x04,0x00,0x03,0x00,0x03,0x11,0x05,0x06,0x17,0x2b,0x17,0x11,\r\n0x21,0x11,0x27,0x33,0x11,0x23,0xaa,0x01,0x04,0xd2,0xa0,0xa0,0x6f,0x03,0xad,0xfc,0x53,0x2d,0x03,0x53,0x00,0x03,0x00,0x7d,0x00,0xda,0x01,0xdb,0x02,0xaf,0x00,0x0b,0x00,0x17,0x00,0x21,0x00,0x42,0x40,0x3f,0x1c,0x01,0x04,0x00,0x01,0x4c,0x21,0x20,0x1f,0x19,0x04,0x04,0x49,0x05,0x01,0x04,0x00,0x04,0x86,0x03,0x01,0x01,0x00,0x00,\r\n0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x07,0x02,0x06,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x1e,0x1d,0x1b,0x1a,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x08,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,\r\n0x13,0x37,0x27,0x33,0x37,0x17,0x33,0x07,0x17,0x27,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x09,0x1e,0x4d,0x5b,0x1d,0x1d,0x5b,0x4d,0x1e,0x49,0x02,0x2f,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfe,0xab,0x63,0x36,0x5d,0x5d,0x36,0x63,0x43,\r\n0x00,0x01,0x00,0x41,0xff,0x92,0x02,0x17,0x03,0x3e,0x00,0x23,0x00,0x90,0x40,0x0c,0x0a,0x07,0x02,0x06,0x03,0x1c,0x19,0x02,0x07,0x02,0x02,0x4c,0x4b,0xb0,0x11,0x50,0x58,0x40,0x31,0x00,0x01,0x00,0x01,0x85,0x00,0x03,0x00,0x06,0x02,0x03,0x72,0x08,0x01,0x07,0x02,0x04,0x06,0x07,0x72,0x00,0x05,0x04,0x05,0x86,0x00,0x00,0x00,0x06,\r\n0x02,0x00,0x06,0x69,0x00,0x02,0x07,0x04,0x02,0x59,0x00,0x02,0x02,0x04,0x62,0x00,0x04,0x02,0x04,0x52,0x1b,0x40,0x33,0x00,0x01,0x00,0x01,0x85,0x00,0x03,0x00,0x06,0x00,0x03,0x06,0x80,0x08,0x01,0x07,0x02,0x04,0x02,0x07,0x04,0x80,0x00,0x05,0x04,0x05,0x86,0x00,0x00,0x00,0x06,0x02,0x00,0x06,0x69,0x00,0x02,0x07,0x04,0x02,0x59,\r\n0x00,0x02,0x02,0x04,0x62,0x00,0x04,0x02,0x04,0x52,0x59,0x40,0x10,0x00,0x00,0x00,0x23,0x00,0x23,0x23,0x13,0x23,0x13,0x23,0x13,0x23,0x09,0x06,0x1d,0x2b,0x13,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x11,0x33,0x11,0x16,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x26,0x27,0x11,0x23,0x11,0x26,0x26,0x23,0x22,0x06,\r\n0x15,0x15,0x41,0x46,0x3c,0x17,0x28,0x11,0x32,0x14,0x25,0x15,0x16,0x19,0x55,0x46,0x3c,0x17,0x28,0x11,0x32,0x14,0x26,0x14,0x16,0x19,0x01,0x02,0x0f,0x3e,0x49,0x0b,0x08,0x01,0xb9,0xfe,0x2a,0x0d,0x13,0x18,0x15,0x1e,0x0f,0x3e,0x49,0x0a,0x08,0xfe,0x83,0x01,0x9a,0x0d,0x14,0x18,0x15,0x1e,0xff,0xff,0x00,0x46,0x00,0xfa,0x02,0x12,\r\n0x02,0xaf,0x02,0x26,0x04,0x22,0x00,0x00,0x01,0x07,0x06,0x68,0x02,0x58,0xff,0xa6,0x00,0x09,0xb1,0x01,0x02,0xb8,0xff,0xa6,0xb0,0x35,0x2b,0x00,0xff,0xff,0x00,0x3c,0x00,0x32,0x02,0x1c,0x03,0x0c,0x00,0x27,0x06,0x72,0x02,0x58,0x00,0x00,0x02,0x06,0x04,0x26,0x00,0x00,0x00,0x03,0x00,0x50,0x00,0x00,0x02,0x08,0x02,0x30,0x00,0x11,\r\n0x00,0x1d,0x00,0x29,0x00,0x49,0x40,0x46,0x08,0x03,0x02,0x01,0x04,0x01,0x86,0x00,0x00,0x00,0x02,0x05,0x00,0x02,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x0a,0x01,0x06,0x04,0x04,0x06,0x59,0x0a,0x01,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,0x51,0x1f,0x1e,0x13,0x12,0x00,0x00,0x25,0x23,0x1e,0x29,0x1f,0x29,0x19,0x17,\r\n0x12,0x1d,0x13,0x1d,0x00,0x11,0x00,0x11,0x23,0x13,0x23,0x0b,0x06,0x19,0x2b,0x33,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x23,0x11,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x50,0x77,0x65,0x65,0x77,0x32,0x5c,\r\n0x4e,0x4e,0x5c,0xaa,0x34,0x44,0x44,0x34,0x35,0x43,0x43,0x35,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x2d,0x01,0x54,0x65,0x77,0x77,0x65,0xfe,0xac,0x01,0x59,0x4e,0x5c,0x5c,0x4e,0xfe,0xa7,0xe6,0x44,0x34,0x35,0x43,0x43,0x35,0x34,0x44,0x28,0x2d,0x23,0x23,0x2d,0x2d,0x23,0x23,0x2d,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,\r\n0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x1f,0x00,0x45,0x40,0x42,0x0a,0x01,0x07,0x04,0x07,0x86,0x03,0x01,0x01,0x09,0x02,0x08,0x03,0x00,0x05,0x01,0x00,0x69,0x00,0x05,0x04,0x04,0x05,0x57,0x00,0x05,0x05,0x04,0x5f,0x06,0x01,0x04,0x05,0x04,0x4f,0x18,0x18,0x0d,0x0c,0x01,0x00,0x18,0x1f,0x18,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x13,\r\n0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0b,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x01,0x9b,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,\r\n0x25,0xff,0x02,0x58,0xff,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0xfd,0x77,0x02,0x08,0x50,0x50,0xfd,0xf8,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0x58,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x52,0x40,0x4f,0x0c,0x01,0x07,0x00,0x07,0x86,0x00,0x03,0x04,0x01,0x02,0x01,\r\n0x03,0x02,0x67,0x05,0x01,0x01,0x0e,0x0b,0x02,0x08,0x09,0x01,0x08,0x69,0x0a,0x0d,0x02,0x09,0x00,0x00,0x09,0x59,0x0a,0x0d,0x02,0x09,0x09,0x00,0x61,0x06,0x01,0x00,0x09,0x00,0x51,0x23,0x23,0x1a,0x1a,0x00,0x00,0x23,0x2b,0x23,0x2b,0x27,0x25,0x1a,0x22,0x1a,0x22,0x1e,0x1c,0x00,0x19,0x00,0x19,0x14,0x21,0x11,0x11,0x12,0x14,0x21,\r\n0x0f,0x06,0x1d,0x2b,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x27,0x33,0x35,0x23,0x22,0x06,0x15,0x14,0x16,0x37,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0xff,0x05,0x34,0x44,0x44,0x34,0x05,0xff,0x02,0x58,0xff,0x05,0x35,0x43,0x43,0x35,\r\n0x05,0x5f,0x05,0x05,0x23,0x2d,0x2d,0x87,0x05,0x05,0x23,0x2d,0x2d,0x91,0x44,0x34,0x35,0x43,0x87,0x50,0x50,0x87,0x43,0x35,0x34,0x44,0x91,0xb9,0xa0,0x2d,0x23,0x23,0x2d,0xa0,0xa0,0x2d,0x23,0x23,0x2d,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xfd,0x00,0x07,0x00,0x0b,0x00,0x2a,0x40,0x27,0x00,0x02,0x01,0x02,0x86,0x00,\r\n0x04,0x00,0x05,0x00,0x04,0x05,0x67,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x11,0x11,0x11,0x11,0x11,0x10,0x06,0x06,0x1c,0x2b,0x11,0x21,0x15,0x23,0x11,0x23,0x11,0x23,0x35,0x21,0x15,0x21,0x02,0x58,0xff,0x5a,0xff,0x02,0x58,0xfd,0xa8,0x02,0x58,0x50,0xfd,0xf8,0x02,0x08,0xf5,0x4b,\r\n0x00,0x01,0x00,0x00,0x00,0x00,0x02,0x58,0x02,0xe4,0x00,0x0e,0x00,0x2b,0x40,0x28,0x06,0x01,0x00,0x01,0x00,0x85,0x00,0x03,0x02,0x03,0x86,0x05,0x01,0x01,0x02,0x02,0x01,0x57,0x05,0x01,0x01,0x01,0x02,0x5f,0x04,0x01,0x02,0x01,0x02,0x4f,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x07,0x06,0x1d,0x2b,0x01,0x17,0x23,0x15,0x33,0x15,0x23,\r\n0x11,0x23,0x11,0x23,0x35,0x33,0x35,0x23,0x01,0x2d,0xc7,0x9b,0xff,0xff,0x5a,0xff,0xff,0x9b,0x02,0xe4,0xa9,0xa6,0x50,0xfe,0xbb,0x01,0x45,0x50,0xa6,0x00,0x00,0x00,0x00,0x03,0x00,0x58,0xff,0xf6,0x02,0x00,0x02,0xe4,0x00,0x0d,0x00,0x1e,0x00,0x2f,0x00,0x58,0x40,0x55,0x1d,0x01,0x07,0x02,0x23,0x01,0x06,0x03,0x02,0x4c,0x00,0x01,\r\n0x00,0x04,0x02,0x01,0x04,0x69,0x09,0x01,0x02,0x00,0x07,0x03,0x02,0x07,0x69,0x00,0x03,0x00,0x06,0x05,0x03,0x06,0x69,0x0a,0x01,0x05,0x00,0x00,0x05,0x59,0x0a,0x01,0x05,0x05,0x00,0x61,0x08,0x01,0x00,0x05,0x00,0x51,0x20,0x1f,0x0f,0x0e,0x01,0x00,0x2b,0x29,0x26,0x24,0x1f,0x2f,0x20,0x2f,0x1a,0x18,0x14,0x12,0x0e,0x1e,0x0f,0x1e,\r\n0x08,0x06,0x00,0x0d,0x01,0x0d,0x0b,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x03,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x36,0x13,0x32,0x36,0x35,0x35,0x06,0x23,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x14,0x16,0x01,0x2c,0x62,0x72,0x72,0x62,0x62,0x72,\r\n0x72,0x9a,0x1a,0x23,0x1b,0x1e,0x14,0x28,0x3f,0x3b,0x3a,0x40,0x0e,0x6c,0x3b,0x3f,0x0e,0x34,0x1a,0x23,0x1b,0x1e,0x14,0x28,0x40,0x0a,0x72,0x6a,0x01,0x36,0x6a,0x72,0x72,0x69,0xfe,0xc9,0x6a,0x72,0x01,0xd3,0x1d,0x25,0x1d,0x2d,0x7b,0x3e,0x43,0x43,0x3e,0x8c,0x43,0xfe,0x7e,0x43,0x3e,0x9a,0x43,0x1d,0x25,0x1d,0x2d,0x89,0x3e,0x43,\r\n0x00,0x04,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x1f,0x00,0x2b,0x00,0x37,0x00,0x4d,0x40,0x4a,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x05,0x0b,0x06,0x0a,0x03,0x04,0x02,0x05,0x04,0x69,0x09,0x01,0x02,0x00,0x00,0x02,0x59,0x09,0x01,0x02,0x02,0x00,0x61,0x08,0x01,0x00,0x02,0x00,0x51,0x2d,0x2c,0x21,\r\n0x20,0x11,0x10,0x01,0x00,0x33,0x31,0x2c,0x37,0x2d,0x37,0x27,0x25,0x20,0x2b,0x21,0x2b,0x19,0x17,0x10,0x1f,0x11,0x1f,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0c,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,\r\n0x16,0x37,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x21,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0xda,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0xfe,0xc8,0x18,0x20,0x20,0x18,\r\n0x18,0x20,0x20,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x32,0x44,0x76,0x4a,0x4a,0x76,0x44,0x44,0x76,0x4a,0x4a,0x76,0x44,0xd1,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x20,0x18,0x18,0x20,0x00,0x00,0x00,0x03,0xff,0xf6,0x00,0x00,0x02,0x62,0x02,0xe4,0x00,0x0e,0x00,0x14,0x00,0x1c,\r\n0x00,0x3d,0x40,0x3a,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x69,0x07,0x01,0x04,0x00,0x00,0x04,0x59,0x07,0x01,0x04,0x04,0x00,0x5f,0x06,0x01,0x00,0x04,0x00,0x4f,0x16,0x15,0x01,0x00,0x1a,0x18,0x15,0x1c,0x16,0x1c,0x13,0x12,0x10,0x0f,0x08,0x06,0x00,0x0e,0x01,0x0d,0x08,0x06,0x16,0x2b,0x33,\r\n0x22,0x35,0x34,0x37,0x13,0x36,0x33,0x32,0x17,0x13,0x16,0x15,0x14,0x23,0x25,0x33,0x13,0x35,0x23,0x15,0x13,0x32,0x35,0x34,0x23,0x22,0x15,0x14,0x3b,0x45,0x13,0xf2,0x10,0x21,0x21,0x10,0xf1,0x14,0x45,0xfe,0xf6,0x31,0x0a,0x44,0x21,0x2c,0x2c,0x2c,0x38,0x1a,0x2e,0x02,0x3e,0x26,0x26,0xfd,0xc2,0x2e,0x1a,0x38,0xc8,0x01,0x17,0x47,\r\n0x47,0xfe,0x5e,0x2a,0x2a,0x2a,0x2a,0x00,0x00,0x01,0x00,0x14,0xff,0x92,0x02,0x44,0x03,0x48,0x00,0x05,0x00,0x1c,0x40,0x19,0x03,0x01,0x01,0x49,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x12,0x11,0x02,0x06,0x18,0x2b,0x01,0x03,0x21,0x01,0x13,0x21,0x01,0xd6,0xb4,0x01,0x22,0xfd,0xee,0xf5,\r\n0xfe,0xed,0x03,0x48,0xfe,0x70,0xfd,0xda,0x01,0xa4,0x00,0x00,0x00,0x01,0x00,0x25,0x00,0x73,0x02,0x34,0x02,0x6e,0x00,0x05,0x00,0x06,0xb3,0x05,0x03,0x01,0x32,0x2b,0x13,0x37,0x17,0x13,0x17,0x01,0x25,0x3f,0x90,0xfb,0x45,0xfe,0xc9,0x01,0x48,0x42,0x8e,0x01,0x72,0x30,0xfe,0x35,0x00,0x00,0x00,0x01,0x00,0x42,0x00,0x64,0x02,0x16,\r\n0x02,0x38,0x00,0x0b,0x00,0x06,0xb3,0x0a,0x04,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x7b,0x38,0xb0,0xb1,0x3a,0xb1,0xb0,0x38,0xb0,0xb1,0x3a,0xb1,0x65,0x38,0xb0,0xb1,0x3a,0xb1,0xb0,0x38,0xb0,0xb1,0x3a,0xb1,0x00,0x01,0x00,0x1f,0x00,0x5b,0x02,0x39,0x02,0x75,0x00,0x0b,0x00,0x06,0xb3,0x0a,\r\n0x04,0x01,0x32,0x2b,0x37,0x27,0x37,0x27,0x37,0x17,0x37,0x17,0x07,0x17,0x07,0x27,0x59,0x39,0xd3,0xd4,0x3a,0xd4,0xd2,0x39,0xd3,0xd4,0x3a,0xd4,0x5c,0x39,0xd2,0xd4,0x3a,0xd4,0xd3,0x39,0xd2,0xd4,0x3a,0xd4,0x00,0x01,0x00,0x27,0x00,0x3c,0x02,0x30,0x02,0x94,0x00,0x0b,0x00,0x06,0xb3,0x0a,0x04,0x01,0x32,0x2b,0x37,0x37,0x27,0x17,\r\n0x37,0x17,0x37,0x07,0x17,0x27,0x07,0x27,0x27,0xab,0xaa,0xd7,0x2d,0x2c,0xd7,0xaa,0xab,0xd7,0x2d,0x2d,0xd2,0x96,0x96,0x49,0xdf,0xde,0x48,0x96,0x96,0x49,0xdf,0xdf,0x00,0x03,0x00,0x0f,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x07,0x00,0x10,0x00,0x1d,0x00,0x61,0x40,0x5e,0x0b,0x01,0x04,0x02,0x18,0x01,0x09,0x06,0x02,0x4c,0x00,0x02,\r\n0x04,0x02,0x85,0x0b,0x03,0x02,0x01,0x00,0x05,0x00,0x01,0x05,0x80,0x07,0x01,0x05,0x06,0x00,0x05,0x06,0x7e,0x0c,0x0a,0x02,0x08,0x09,0x08,0x86,0x00,0x04,0x00,0x00,0x01,0x04,0x00,0x67,0x00,0x06,0x09,0x09,0x06,0x57,0x00,0x06,0x06,0x09,0x5f,0x00,0x09,0x06,0x09,0x4f,0x11,0x11,0x00,0x00,0x11,0x1d,0x11,0x1d,0x1c,0x1b,0x1a,0x19,\r\n0x17,0x16,0x15,0x14,0x13,0x12,0x10,0x0f,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x0d,0x06,0x19,0x2b,0x01,0x27,0x23,0x07,0x23,0x13,0x33,0x13,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x33,0x03,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x17,0x23,0x27,0x23,0x15,0x01,0x3c,0x1c,0xb0,0x1b,0x46,0x94,0x4a,0x94,0x9e,0x08,0x12,0x02,0x02,0x12,\r\n0x08,0x22,0x7d,0x11,0x42,0x4f,0x60,0x4a,0x71,0x7b,0x4e,0x66,0x4f,0x01,0x8b,0x41,0x41,0x01,0x4f,0xfe,0xb1,0xce,0x13,0x2a,0x0d,0x0d,0x2a,0x13,0x52,0xfd,0xf9,0x01,0x4f,0x86,0x86,0xa1,0xae,0x8f,0x8f,0x00,0x00,0x04,0x00,0x2d,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x4b,0x00,0x6c,0x40,0x69,0x07,0x01,\r\n0x05,0x02,0x01,0x4c,0x00,0x0a,0x0b,0x07,0x0b,0x0a,0x07,0x80,0x00,0x07,0x08,0x0b,0x07,0x08,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x0c,0x01,0x01,0x09,0x04,0x01,0x67,0x00,0x09,0x00,0x0b,0x0a,0x09,0x0b,0x69,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0d,\r\n0x01,0x06,0x08,0x06,0x51,0x21,0x20,0x00,0x00,0x3f,0x3c,0x3a,0x39,0x37,0x34,0x29,0x26,0x24,0x23,0x20,0x4b,0x21,0x4a,0x1f,0x1d,0x19,0x17,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0c,0x21,0x0e,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,\r\n0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x2d,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,\r\n0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0x15,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,\r\n0x19,0xdb,0x19,0x13,0x13,0x17,0xfd,0xe1,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x2d,0xff,0x4c,0x02,0x30,0x02,0xe4,0x00,0x27,0x00,0x35,0x00,0x4b,0x40,0x48,0x19,0x01,0x07,0x03,0x01,0x4c,\r\n0x00,0x03,0x00,0x07,0x06,0x03,0x07,0x69,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x05,0x05,0x00,0x5f,0x08,0x01,0x00,0x00,0x3d,0x00,0x4e,0x29,0x28,0x01,0x00,0x30,0x2e,0x28,0x35,0x29,0x35,0x26,0x24,0x1f,0x1d,0x17,0x15,0x10,0x0e,0x09,0x07,0x00,0x27,0x01,0x27,0x0a,\r\n0x09,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x33,0x15,0x03,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0x45,0x55,0x7e,0x45,0x90,0x7e,\r\n0x72,0x83,0x56,0x4a,0x49,0x57,0x46,0x40,0x29,0x36,0x09,0x02,0x55,0x50,0x5a,0x64,0x6b,0x5d,0x6e,0x23,0x26,0x2a,0x2a,0x26,0x26,0x2a,0x2a,0xb4,0x47,0x83,0x58,0x01,0x54,0x87,0x9b,0x83,0x72,0xfe,0xf1,0x4e,0x5b,0x58,0x47,0x74,0x4a,0x51,0x20,0x1c,0x46,0x55,0x5a,0x74,0x68,0xfe,0xac,0x64,0x73,0x4b,0x01,0x2e,0x31,0x2b,0x75,0x2c,\r\n0x2f,0x30,0x2c,0x74,0x2b,0x31,0x00,0x00,0x00,0x02,0x00,0x19,0xff,0xf7,0x02,0x67,0x02,0xe4,0x00,0x24,0x00,0x30,0x00,0x9b,0x40,0x09,0x28,0x21,0x1e,0x1b,0x04,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x34,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x07,0x01,0x08,0x69,0x00,0x04,0x04,0x02,0x61,0x00,\r\n0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x00,0x61,0x06,0x09,0x02,0x00,0x00,0x3f,0x4d,0x0a,0x01,0x07,0x07,0x00,0x61,0x06,0x09,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x31,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x01,0x00,0x08,0x07,0x01,0x08,0x69,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,\r\n0x00,0x06,0x06,0x39,0x4d,0x0a,0x01,0x07,0x07,0x00,0x61,0x09,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x1d,0x26,0x25,0x01,0x00,0x2b,0x29,0x25,0x30,0x26,0x30,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x0b,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,\r\n0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x27,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xd7,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,0x61,0x2b,0x22,0x53,\r\n0x26,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x00,0x00,0x02,0x00,0x41,0xff,0x4c,0x01,0xf9,0x02,0xda,0x00,0x0a,0x00,0x0e,0x00,0x2a,\r\n0x40,0x27,0x00,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x01,0x38,0x4d,0x06,0x04,0x05,0x03,0x02,0x02,0x3d,0x02,0x4e,0x0b,0x0b,0x00,0x00,0x0b,0x0e,0x0b,0x0e,0x0d,0x0c,0x00,0x0a,0x00,0x0a,0x25,0x11,0x07,0x09,0x18,0x2b,0x17,0x11,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x33,0x11,0x33,0x11,0x33,0x11,0xff,0x55,0x69,0x69,0x55,0x50,0x5a,\r\n0x50,0xb4,0x01,0xea,0x5e,0x4c,0x50,0x4d,0x5d,0xfc,0x72,0x03,0x8e,0xfc,0x72,0x00,0x00,0x02,0x00,0x4d,0xff,0x66,0x02,0x0b,0x02,0xe4,0x00,0x3b,0x00,0x49,0x00,0x47,0x40,0x44,0x16,0x01,0x06,0x04,0x01,0x4c,0x00,0x04,0x05,0x06,0x05,0x04,0x06,0x80,0x00,0x06,0x01,0x05,0x06,0x01,0x7e,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x02,\r\n0x07,0x01,0x00,0x02,0x00,0x65,0x00,0x05,0x05,0x03,0x61,0x00,0x03,0x03,0x3e,0x05,0x4e,0x01,0x00,0x33,0x32,0x27,0x24,0x22,0x21,0x1f,0x1c,0x09,0x06,0x04,0x03,0x00,0x3b,0x01,0x3a,0x08,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x2e,0x02,0x35,0x34,0x36,0x37,0x35,0x26,0x26,\r\n0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x1e,0x02,0x15,0x14,0x06,0x23,0x13,0x16,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x06,0x15,0x14,0x16,0x17,0x01,0x13,0x5b,0x6b,0x5f,0x38,0x2f,0x32,0x32,0x39,0x33,0x32,0x5c,0x2e,0x44,0x26,0x3b,\r\n0x34,0x34,0x38,0x66,0x57,0x32,0x4f,0x66,0x07,0x5f,0x04,0x32,0x27,0x32,0x2e,0x35,0x24,0x20,0x78,0x47,0x51,0x44,0x2f,0x15,0x37,0x2a,0x6a,0x5c,0x05,0x2c,0x38,0x2c,0x23,0x4a,0x2c,0x38,0x2b,0x22,0x9a,0x53,0x47,0x22,0x28,0x2e,0x28,0x24,0x33,0x08,0x0f,0x08,0x34,0x4a,0x28,0x3a,0x48,0x07,0x02,0x0c,0x4c,0x38,0x4a,0x57,0x4e,0x43,\r\n0x1e,0x23,0x2c,0x26,0x21,0x2e,0x06,0x17,0x0d,0x62,0x3d,0x3a,0x45,0x03,0x02,0x02,0x21,0x41,0x33,0x4e,0x5b,0x01,0x55,0x07,0x42,0x35,0x23,0x36,0x06,0x0d,0x08,0x40,0x33,0x26,0x38,0x06,0x00,0x03,0x00,0x2d,0x00,0x6e,0x02,0x2b,0x02,0xe4,0x00,0x11,0x00,0x23,0x00,0x3f,0x00,0x69,0xb1,0x06,0x64,0x44,0x40,0x5e,0x00,0x06,0x07,0x09,\r\n0x07,0x06,0x09,0x80,0x00,0x09,0x08,0x07,0x09,0x08,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x00,0x05,0x00,0x07,0x06,0x05,0x07,0x69,0x00,0x08,0x0c,0x01,0x04,0x02,0x08,0x04,0x69,0x0b,0x01,0x02,0x00,0x00,0x02,0x59,0x0b,0x01,0x02,0x02,0x00,0x62,0x0a,0x01,0x00,0x02,0x00,0x52,0x25,0x24,0x13,0x12,0x01,0x00,0x3d,0x3c,0x3a,\r\n0x38,0x33,0x31,0x2f,0x2e,0x2c,0x2a,0x24,0x3f,0x25,0x3f,0x1c,0x1a,0x12,0x23,0x13,0x23,0x0a,0x08,0x00,0x11,0x01,0x11,0x0d,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x14,0x06,0x06,0x27,0x32,0x36,0x36,0x35,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x15,\r\n0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x01,0x2c,0x4c,0x73,0x40,0x40,0x73,0x4c,0x4d,0x72,0x40,0x40,0x72,0x4d,0x3c,0x5a,0x32,0x32,0x5a,0x3c,0x3c,0x5a,0x32,0x32,0x5a,0x41,0x38,0x45,0x45,0x38,0x38,0x44,0x41,\r\n0x21,0x1a,0x1b,0x21,0x21,0x1b,0x1a,0x21,0x41,0x44,0x6e,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x32,0x2f,0x56,0x39,0x96,0x39,0x55,0x30,0x30,0x55,0x39,0x96,0x39,0x56,0x2f,0x55,0x3f,0x34,0x82,0x34,0x3f,0x3f,0x34,0x1b,0x21,0x21,0x1b,0x82,0x1b,0x21,0x21,0x1b,0x34,0x3f,0x00,0x00,0x04,0x00,0x2d,\r\n0x00,0x6e,0x02,0x2b,0x02,0xe4,0x00,0x11,0x00,0x23,0x00,0x30,0x00,0x39,0x00,0x63,0xb1,0x06,0x64,0x44,0x40,0x58,0x2b,0x01,0x06,0x08,0x01,0x4c,0x0b,0x07,0x02,0x05,0x06,0x02,0x06,0x05,0x02,0x80,0x00,0x01,0x00,0x03,0x04,0x01,0x03,0x69,0x00,0x04,0x00,0x09,0x08,0x04,0x09,0x69,0x00,0x08,0x00,0x06,0x05,0x08,0x06,0x67,0x00,0x02,\r\n0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x24,0x24,0x01,0x00,0x39,0x37,0x33,0x31,0x24,0x30,0x24,0x30,0x2f,0x2e,0x2d,0x2c,0x27,0x25,0x20,0x1e,0x17,0x15,0x0a,0x08,0x00,0x11,0x01,0x11,0x0c,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x25,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,\r\n0x15,0x15,0x14,0x06,0x06,0x25,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x17,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x2c,0x4c,0x73,0x40,0x40,0x73,0x4c,0x4d,0x72,0x40,0x40,0x72,0xfe,0xeb,0x32,0x5a,0x3c,0x3c,\r\n0x5a,0x32,0x32,0x5a,0x3c,0x3c,0x5a,0x32,0x5a,0x72,0x36,0x3f,0x3c,0x42,0x40,0x3b,0x36,0x36,0x1a,0x1e,0x1e,0x1a,0x36,0x6e,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0x3c,0x6c,0x48,0x96,0x48,0x6c,0x3c,0xf0,0x39,0x56,0x2f,0x2f,0x56,0x39,0x96,0x39,0x55,0x30,0x30,0x55,0x39,0xfa,0x01,0x5e,0x39,0x30,0x45,0x1a,0x96,0x8c,0x8c,0xbe,0x1d,\r\n0x1a,0x1a,0x1d,0x00,0x00,0x02,0x00,0x0f,0x01,0x72,0x02,0x35,0x02,0xda,0x00,0x07,0x00,0x26,0x00,0x4d,0x40,0x4a,0x22,0x19,0x02,0x00,0x01,0x0e,0x01,0x07,0x00,0x02,0x4c,0x00,0x07,0x00,0x03,0x00,0x07,0x03,0x80,0x0a,0x08,0x06,0x09,0x04,0x03,0x03,0x84,0x05,0x04,0x02,0x01,0x00,0x00,0x01,0x57,0x05,0x04,0x02,0x01,0x01,0x00,0x5f,\r\n0x02,0x01,0x00,0x01,0x00,0x4f,0x08,0x08,0x00,0x00,0x08,0x26,0x08,0x26,0x1e,0x1d,0x15,0x14,0x13,0x12,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x0b,0x06,0x19,0x2b,0x13,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x33,0x11,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x06,0x06,0x07,0x07,0x23,\r\n0x27,0x26,0x26,0x27,0x16,0x16,0x15,0x15,0x73,0x64,0x01,0x04,0x64,0x87,0x50,0x22,0x05,0x09,0x02,0x02,0x07,0x05,0x21,0x4e,0x37,0x05,0x02,0x06,0x0e,0x03,0x1e,0x33,0x21,0x03,0x0e,0x06,0x02,0x06,0x01,0x72,0x01,0x36,0x32,0x32,0xfe,0xca,0x01,0x68,0x66,0x0e,0x2b,0x0e,0x0e,0x2b,0x0e,0x66,0xfe,0x98,0xdd,0x1c,0x3e,0x13,0x14,0x33,\r\n0x09,0x67,0x68,0x09,0x32,0x14,0x13,0x3e,0x1c,0xdd,0x00,0x00,0x00,0x02,0x00,0x96,0x01,0xc2,0x01,0xc2,0x02,0xe4,0x00,0x0b,0x00,0x17,0x00,0x39,0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,\r\n0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x2c,0x43,0x53,0x53,0x43,0x43,0x53,0x53,0x43,0x26,0x2f,0x2f,0x26,0x25,0x30,0x30,0x01,0xc2,\r\n0x51,0x40,0x41,0x50,0x50,0x41,0x40,0x51,0x38,0x31,0x28,0x28,0x32,0x32,0x28,0x28,0x31,0x00,0x00,0x00,0xff,0xff,0x00,0xd2,0x01,0xa3,0x01,0x75,0x02,0xd5,0x03,0x07,0x03,0x2a,0x00,0x00,0x02,0x43,0x00,0x09,0xb1,0x00,0x01,0xb8,0x02,0x43,0xb0,0x35,0x2b,0x00,0x00,0x00,0xff,0xff,0x00,0x69,0x01,0xa4,0x01,0xef,0x02,0xd6,0x00,0x27,\r\n0x03,0x2a,0xff,0x97,0x02,0x44,0x01,0x07,0x03,0x2a,0x00,0x7a,0x02,0x44,0x00,0x12,0xb1,0x00,0x01,0xb8,0x02,0x44,0xb0,0x35,0x2b,0xb1,0x01,0x01,0xb8,0x02,0x44,0xb0,0x35,0x2b,0x00,0x00,0x00,0x01,0x00,0xff,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,\r\n0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0xff,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x00,0x02,0x00,0xff,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,\r\n0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x33,0x11,0xff,0x5a,0x5a,0x5a,0x01,0xc2,0x01,0x7c,0xfe,0x84,0xfd,0xd0,0x01,0x7c,0xfe,0x84,0x00,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x0b,0x00,0x2f,0x40,0x2c,0x00,0x02,0x01,0x02,\r\n0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x04,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x17,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0xff,0xaf,0xaf,0x5a,0xaf,0xaf,0x6e,0x02,0x76,0x50,0xe6,\r\n0xe6,0x50,0xfd,0x8a,0x00,0x02,0x00,0x46,0x00,0x00,0x01,0xf4,0x02,0xe4,0x00,0x1e,0x00,0x28,0x00,0x38,0x40,0x35,0x20,0x1b,0x1a,0x13,0x07,0x06,0x05,0x04,0x08,0x02,0x03,0x01,0x4c,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x27,0x25,\r\n0x18,0x16,0x0c,0x0a,0x00,0x1e,0x01,0x1e,0x05,0x06,0x16,0x2b,0x21,0x22,0x26,0x35,0x35,0x07,0x27,0x37,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x07,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x17,0x0e,0x02,0x03,0x15,0x37,0x36,0x35,0x35,0x34,0x23,0x22,0x06,0x01,0x51,0x4d,0x5a,0x46,0x1e,0x64,0x58,0x48,0x49,0x57,0x4f,\r\n0x46,0x51,0x29,0x24,0x22,0x32,0x0b,0x44,0x09,0x2d,0x42,0x78,0x35,0x57,0x46,0x21,0x25,0x57,0x49,0x4a,0x1b,0x51,0x25,0x01,0x04,0x46,0x55,0x54,0x47,0x55,0x43,0x6c,0x1a,0x1f,0x6c,0x25,0x29,0x2a,0x13,0x2a,0x15,0x2f,0x21,0x02,0x49,0xe3,0x13,0x21,0x5a,0x55,0x49,0x26,0x00,0x01,0x00,0x50,0xff,0x92,0x02,0x08,0x03,0x3e,0x00,0x13,\r\n0x00,0x3d,0x40,0x3a,0x00,0x04,0x03,0x04,0x85,0x0a,0x01,0x09,0x00,0x09,0x86,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x67,0x07,0x01,0x01,0x00,0x00,0x01,0x57,0x07,0x01,0x01,0x01,0x00,0x5f,0x08,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x17,\r\n0x35,0x23,0x35,0x33,0x11,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x11,0x33,0x15,0x23,0x15,0xff,0xaf,0xaf,0xaf,0xaf,0x5a,0xaf,0xaf,0xaf,0xaf,0x6e,0xfa,0x50,0x01,0x22,0x50,0xf0,0xf0,0x50,0xfe,0xde,0x50,0xfa,0x00,0x00,0x00,0x03,0x00,0x1e,0x00,0x00,0x02,0x58,0x02,0xe4,0x00,0x0d,0x00,0x27,0x00,0x35,0x00,0x79,0x40,0x0a,\r\n0x22,0x01,0x06,0x07,0x15,0x01,0x04,0x00,0x02,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1e,0x0a,0x01,0x06,0x08,0x01,0x00,0x04,0x06,0x00,0x69,0x00,0x07,0x07,0x01,0x5f,0x03,0x02,0x02,0x01,0x01,0x38,0x4d,0x09,0x05,0x02,0x04,0x04,0x39,0x04,0x4e,0x1b,0x40,0x22,0x0a,0x01,0x06,0x08,0x01,0x00,0x04,0x06,0x00,0x69,0x03,0x01,0x02,0x02,\r\n0x38,0x4d,0x00,0x07,0x07,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x09,0x05,0x02,0x04,0x04,0x39,0x04,0x4e,0x59,0x40,0x1f,0x29,0x28,0x0e,0x0e,0x01,0x00,0x30,0x2e,0x28,0x35,0x29,0x35,0x0e,0x27,0x0e,0x27,0x1d,0x1c,0x1b,0x1a,0x10,0x0f,0x08,0x06,0x00,0x0d,0x01,0x0d,0x0b,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,\r\n0x16,0x15,0x15,0x14,0x06,0x01,0x11,0x33,0x13,0x1e,0x02,0x17,0x2e,0x02,0x35,0x11,0x33,0x11,0x23,0x03,0x2e,0x02,0x27,0x1e,0x02,0x15,0x11,0x01,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x01,0xf9,0x28,0x37,0x37,0x28,0x29,0x36,0x36,0xfd,0xfc,0x5f,0x75,0x06,0x10,0x11,0x06,0x02,0x06,0x04,0x46,0x5f,0x72,\r\n0x05,0x11,0x11,0x07,0x02,0x05,0x03,0x01,0x95,0x0e,0x15,0x15,0x0e,0x0d,0x16,0x16,0x01,0x2c,0x3a,0x2f,0xe6,0x2f,0x3a,0x3a,0x2f,0xe6,0x2f,0x3a,0xfe,0xd4,0x02,0xda,0xfe,0x3b,0x15,0x44,0x4a,0x1d,0x1d,0x4c,0x4b,0x19,0x01,0xb8,0xfd,0x26,0x01,0xc6,0x17,0x44,0x49,0x1c,0x1c,0x4b,0x4b,0x1c,0xfe,0x48,0x01,0x63,0x12,0x16,0xfa,0x12,\r\n0x16,0x16,0x12,0xfa,0x16,0x12,0x00,0x00,0x00,0x02,0x00,0x3c,0xff,0xf6,0x02,0x1c,0x02,0xe4,0x00,0x1a,0x00,0x23,0x00,0x4c,0x40,0x49,0x1e,0x1b,0x02,0x05,0x06,0x10,0x01,0x03,0x04,0x02,0x4c,0x00,0x04,0x02,0x03,0x02,0x04,0x03,0x80,0x00,0x01,0x00,0x06,0x05,0x01,0x06,0x69,0x00,0x05,0x00,0x02,0x04,0x05,0x02,0x67,0x00,0x03,0x00,\r\n0x00,0x03,0x59,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x01,0x00,0x22,0x20,0x1d,0x1c,0x17,0x16,0x14,0x12,0x0f,0x0e,0x0a,0x08,0x00,0x1a,0x01,0x1a,0x08,0x06,0x16,0x2b,0x05,0x22,0x26,0x26,0x35,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x21,0x11,0x16,0x16,0x33,0x32,0x36,0x37,0x33,0x0e,0x02,0x03,0x15,\r\n0x21,0x35,0x26,0x26,0x23,0x22,0x06,0x01,0x2c,0x47,0x6d,0x3c,0x3c,0x6d,0x47,0x49,0x6b,0x3c,0xfe,0x84,0x0c,0x49,0x37,0x3b,0x62,0x14,0x32,0x10,0x44,0x5b,0xc0,0x01,0x18,0x0c,0x48,0x38,0x37,0x49,0x0a,0x41,0x76,0x4d,0xe6,0x4e,0x75,0x41,0x41,0x74,0x4f,0x79,0xfe,0xfd,0x15,0x2c,0x3d,0x31,0x2e,0x46,0x27,0x02,0x80,0xdd,0xdd,0x15,\r\n0x2c,0x2c,0x00,0x00,0x00,0x04,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x1f,0x00,0x25,0x00,0x57,0x40,0x54,0x07,0x01,0x05,0x02,0x01,0x4c,0x00,0x06,0x01,0x07,0x01,0x06,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x00,0x05,0x04,0x02,0x05,0x67,0x00,0x04,0x09,0x01,0x01,0x06,0x04,0x01,\r\n0x67,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,0x08,0x07,0x08,0x4f,0x20,0x20,0x00,0x00,0x20,0x25,0x20,0x25,0x24,0x23,0x22,0x21,0x1f,0x1d,0x19,0x17,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0c,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,\r\n0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0xab,0x42,0xde,0x01,0x8b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,\r\n0xdb,0x19,0x13,0x13,0x17,0xfd,0xe5,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x01,0x00,0x28,0xff,0x4c,0x02,0x30,0x00,0x00,0x00,0x07,0x00,0x49,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x18,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x60,0x04,0x01,0x03,0x01,0x03,0x50,0x1b,0x40,0x17,0x02,0x01,0x00,0x01,\r\n0x00,0x85,0x00,0x01,0x03,0x03,0x01,0x57,0x00,0x01,0x01,0x03,0x60,0x04,0x01,0x03,0x01,0x03,0x50,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x06,0x19,0x2b,0x17,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x28,0x5a,0x01,0x54,0x5a,0xb4,0xb4,0x64,0x64,0xb4,0x00,0x00,0x00,0x00,0x02,0x00,0x14,0x00,0x56,0x02,0x4e,\r\n0x02,0x89,0x00,0x06,0x00,0x20,0x00,0x47,0x40,0x44,0x05,0x02,0x01,0x03,0x02,0x04,0x06,0x01,0x03,0x02,0x02,0x4c,0x00,0x00,0x05,0x00,0x85,0x00,0x02,0x04,0x03,0x04,0x02,0x03,0x80,0x00,0x05,0x00,0x04,0x02,0x05,0x04,0x69,0x00,0x03,0x01,0x01,0x03,0x59,0x00,0x03,0x03,0x01,0x61,0x06,0x01,0x01,0x03,0x01,0x51,0x08,0x07,0x1a,0x19,\r\n0x18,0x17,0x11,0x0f,0x0c,0x0b,0x07,0x20,0x08,0x20,0x13,0x07,0x06,0x17,0x2b,0x01,0x27,0x07,0x35,0x33,0x07,0x17,0x07,0x22,0x26,0x26,0x35,0x33,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x35,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x01,0x55,0xe1,0x60,0xf9,0x65,0xe2,0x4f,0x4e,0x7d,0x48,0x4e,0x33,0x5a,0x38,0x39,\r\n0x59,0x33,0x33,0x59,0x39,0x4f,0x7c,0x48,0x48,0x7c,0x01,0x18,0xd8,0x60,0xf9,0x65,0xd8,0xf6,0x47,0x7c,0x4d,0x39,0x5a,0x35,0x35,0x5a,0x39,0x39,0x5b,0x34,0x47,0x47,0x7a,0x4e,0x4d,0x7c,0x47,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0x00,0x00,0x02,0x2b,0x02,0xdf,0x00,0x1b,0x00,0x2d,0x00,0x60,0x40,0x5d,0x28,0x1f,0x02,0x08,0x06,0x01,\r\n0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x61,0x0a,0x01,0x00,0x04,0x00,0x51,0x1c,0x1c,0x01,0x00,0x1c,0x2d,0x1c,0x2d,\r\n0x27,0x26,0x25,0x24,0x1e,0x1d,0x19,0x18,0x16,0x14,0x10,0x0e,0x0c,0x0b,0x09,0x07,0x00,0x1b,0x01,0x1b,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,\r\n0x1e,0x02,0x15,0x15,0xcf,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,0x13,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x86,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0xfe,0x7a,0x01,0x4f,\r\n0xfe,0xf7,0x1e,0x26,0x30,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0x00,0x03,0x00,0x20,0x00,0x00,0x02,0x3f,0x02,0xdf,0x00,0x1b,0x00,0x29,0x00,0x32,0x00,0x6b,0x40,0x68,0x24,0x01,0x08,0x0a,0x01,0x4c,0x00,0x02,0x03,0x05,0x03,0x02,0x05,0x80,0x00,0x05,0x04,0x03,0x05,0x04,0x7e,0x0d,0x09,0x02,0x07,0x08,0x07,0x86,\r\n0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x00,0x04,0x0c,0x01,0x00,0x06,0x04,0x00,0x69,0x00,0x06,0x00,0x0b,0x0a,0x06,0x0b,0x68,0x00,0x0a,0x08,0x08,0x0a,0x57,0x00,0x0a,0x0a,0x08,0x5f,0x00,0x08,0x0a,0x08,0x4f,0x1c,0x1c,0x01,0x00,0x32,0x30,0x2c,0x2a,0x1c,0x29,0x1c,0x29,0x28,0x27,0x26,0x25,0x1f,0x1d,0x19,0x18,0x16,0x14,0x10,\r\n0x0e,0x0c,0x0b,0x09,0x07,0x00,0x1b,0x01,0x1b,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x03,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,\r\n0xcf,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,0x13,0xc6,0x38,0x44,0x34,0x2b,0x67,0x50,0x64,0x54,0x85,0x19,0x1f,0x1e,0x19,0x86,0x01,0x86,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0xfe,0x7a,0x01,0x4f,\r\n0x3d,0x2f,0x28,0x32,0x06,0x83,0x81,0x81,0xb3,0x1b,0x15,0x16,0x1c,0x00,0x00,0x00,0x00,0x01,0x00,0x23,0x01,0xd6,0x02,0x35,0x02,0xe4,0x00,0x05,0x00,0x18,0x40,0x15,0x04,0x01,0x02,0x00,0x4a,0x02,0x01,0x02,0x00,0x00,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x13,0x01,0x01,0x23,0x27,0x07,0x23,0x01,0x09,0x01,\r\n0x09,0x6e,0x9a,0x9e,0x01,0xd6,0x01,0x0e,0xfe,0xf2,0xa2,0xa2,0x00,0x01,0x00,0xc3,0xff,0x92,0x01,0xef,0x00,0xbe,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x01,0x02,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x37,0x33,0x15,0x33,0x15,0x21,0xc3,0x5a,\r\n0xd2,0xfe,0xd4,0xbe,0xdc,0x50,0x00,0x00,0x00,0x01,0x00,0x69,0xff,0x92,0x01,0x95,0x00,0xbe,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x85,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x25,0x11,0x21,0x35,0x33,0x35,\r\n0x01,0x95,0xfe,0xd4,0xd2,0xbe,0xfe,0xd4,0x50,0xdc,0x00,0x00,0x00,0x01,0x00,0x69,0x02,0x12,0x01,0x95,0x03,0x3e,0x00,0x05,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x00,0x86,0x00,0x02,0x01,0x01,0x02,0x57,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x02,0x01,0x4f,0x11,0x11,0x10,0x03,0x06,0x19,0x2b,0x01,0x23,0x35,0x23,0x35,0x21,0x01,0x95,\r\n0x5a,0xd2,0x01,0x2c,0x02,0x12,0xdc,0x50,0x00,0x01,0x00,0xc3,0x02,0x12,0x01,0xef,0x03,0x3e,0x00,0x05,0x00,0x24,0x40,0x21,0x03,0x01,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x00,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x11,0x04,0x06,0x18,0x2b,0x13,0x11,0x21,0x15,0x23,0x15,\r\n0xc3,0x01,0x2c,0xd2,0x02,0x12,0x01,0x2c,0x50,0xdc,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x26,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1f,0x00,0x54,0x40,0x51,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x0a,0x01,0x01,0x05,0x02,0x01,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x00,0x08,0x09,0x07,0x08,\r\n0x67,0x0b,0x01,0x09,0x04,0x04,0x09,0x57,0x0b,0x01,0x09,0x09,0x04,0x5f,0x00,0x04,0x09,0x04,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0c,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,\r\n0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x01,0xb7,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x9a,0x3a,0x01,0x4f,0x3a,0x56,\r\n0x2f,0x56,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x19,0x00,0x45,0x40,0x42,0x00,0x04,0x01,0x05,0x01,0x04,0x05,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x07,0x01,0x01,0x04,0x02,0x01,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x08,0x01,0x06,0x05,\r\n0x06,0x4f,0x14,0x14,0x00,0x00,0x14,0x19,0x14,0x19,0x18,0x17,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x09,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,\r\n0x3e,0x3e,0x2d,0x54,0xab,0x42,0xde,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x0e,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1f,0x00,0x58,0x40,0x55,0x1a,0x17,0x02,0x06,0x07,0x01,0x4c,0x00,0x05,0x01,0x07,0x01,\r\n0x05,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x09,0x01,0x01,0x05,0x02,0x01,0x67,0x00,0x07,0x06,0x08,0x07,0x57,0x00,0x06,0x00,0x04,0x08,0x06,0x04,0x67,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,0x08,0x07,0x08,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1e,0x1d,0x1c,0x1b,0x19,0x18,0x16,0x15,0x13,0x11,0x0d,\r\n0x0b,0x00,0x0a,0x00,0x09,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x35,0x23,0x35,0x37,0x33,0x07,0x15,0x33,0x35,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x01,0x5f,0xcd,0xa3,0x4e,0xb2,0x8e,\r\n0x40,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,0x42,0x59,0xb4,0xc7,0x0a,0x63,0xe1,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x1e,0x00,0x51,0x40,0x4e,0x19,0x18,0x17,0x03,0x04,0x05,0x01,0x4c,0x00,0x05,0x01,0x04,0x01,0x05,0x04,0x80,\r\n0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x08,0x01,0x01,0x05,0x02,0x01,0x67,0x06,0x01,0x04,0x07,0x07,0x04,0x57,0x06,0x01,0x04,0x04,0x07,0x5f,0x09,0x01,0x07,0x04,0x07,0x4f,0x14,0x14,0x00,0x00,0x14,0x1e,0x14,0x1e,0x1d,0x1c,0x1b,0x1a,0x16,0x15,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0a,0x06,0x17,0x2b,0x13,\r\n0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x35,0x33,0x35,0x07,0x35,0x37,0x33,0x11,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x94,0x83,0x7a,0x61,0x5b,0x68,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,\r\n0x31,0x3d,0xfd,0x60,0x3c,0xd8,0x57,0x4b,0x47,0xfe,0xed,0x3c,0x00,0x03,0x00,0x2d,0xff,0xfb,0x02,0x15,0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2e,0x00,0xa6,0xb7,0x29,0x28,0x23,0x03,0x07,0x08,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x38,0x00,0x07,0x08,0x05,0x08,0x07,0x72,0x00,0x05,0x06,0x08,0x05,0x06,0x7e,0x00,0x00,0x00,0x03,\r\n0x02,0x00,0x03,0x67,0x00,0x02,0x0a,0x01,0x01,0x09,0x02,0x01,0x67,0x00,0x09,0x00,0x08,0x07,0x09,0x08,0x67,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x1b,0x40,0x39,0x00,0x07,0x08,0x05,0x08,0x07,0x05,0x80,0x00,0x05,0x06,0x08,0x05,0x06,0x7e,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,\r\n0x00,0x02,0x0a,0x01,0x01,0x09,0x02,0x01,0x67,0x00,0x09,0x00,0x08,0x07,0x09,0x08,0x67,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x59,0x40,0x1e,0x15,0x14,0x00,0x00,0x27,0x26,0x25,0x24,0x22,0x20,0x1c,0x1a,0x18,0x17,0x14,0x2e,0x15,0x2e,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,\r\n0x0c,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x35,0x37,0x23,0x35,0x33,0x15,0x07,0x16,0x16,0x15,0x14,0x06,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,\r\n0x2d,0x54,0x01,0x11,0x42,0x52,0x42,0x2d,0x25,0x25,0x2e,0x2d,0x25,0x1e,0x56,0xba,0xfa,0x4c,0x2f,0x39,0x53,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x5b,0x4a,0x3a,0x21,0x29,0x20,0x19,0x19,0x1e,0x35,0x39,0x3c,0x46,0x34,0x08,0x37,0x28,0x32,0x41,0x00,0x03,0x00,0x2d,0x00,0x00,0x02,0x22,\r\n0x02,0xda,0x00,0x0a,0x00,0x13,0x00,0x2c,0x00,0x57,0x40,0x54,0x15,0x01,0x07,0x05,0x01,0x4c,0x00,0x05,0x04,0x07,0x04,0x05,0x07,0x80,0x00,0x00,0x00,0x03,0x02,0x00,0x03,0x67,0x00,0x02,0x09,0x01,0x01,0x06,0x02,0x01,0x67,0x00,0x06,0x00,0x04,0x05,0x06,0x04,0x69,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x0a,0x01,\r\n0x08,0x07,0x08,0x4f,0x14,0x14,0x00,0x00,0x14,0x2c,0x14,0x2c,0x2b,0x2a,0x24,0x22,0x20,0x1f,0x1d,0x1b,0x13,0x11,0x0d,0x0b,0x00,0x0a,0x00,0x09,0x21,0x0b,0x06,0x17,0x2b,0x13,0x11,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x13,0x35,0x37,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,\r\n0x15,0x23,0x36,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x07,0x07,0x33,0x15,0x2d,0x96,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x54,0x54,0x2d,0x3e,0x3e,0x2d,0x54,0x9b,0x9a,0x17,0x1c,0x26,0x23,0x25,0x2c,0x42,0x03,0x50,0x40,0x41,0x4a,0x2c,0x24,0x54,0xad,0x01,0x8b,0x01,0x4f,0x2b,0x4b,0x32,0x31,0x4b,0x2b,0x39,0x3d,0x31,0x31,0x3d,0xfd,0x60,\r\n0x3e,0x5b,0x0e,0x20,0x11,0x1e,0x23,0x2a,0x24,0x3f,0x4a,0x42,0x38,0x23,0x3a,0x14,0x2d,0x3c,0x00,0x00,0x00,0x05,0xff,0xf6,0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x16,0x00,0x1f,0x00,0x26,0x00,0x2d,0x00,0x40,0x40,0x3d,0x2c,0x2b,0x23,0x22,0x04,0x00,0x04,0x01,0x4c,0x05,0x01,0x00,0x04,0x00,0x86,0x00,0x01,0x06,0x01,0x02,\r\n0x03,0x01,0x02,0x69,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x11,0x10,0x01,0x00,0x1c,0x1b,0x14,0x13,0x10,0x16,0x11,0x16,0x09,0x07,0x00,0x0f,0x01,0x0f,0x07,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x07,0x21,0x26,\r\n0x26,0x03,0x36,0x36,0x37,0x37,0x21,0x17,0x16,0x16,0x25,0x34,0x27,0x03,0x3e,0x02,0x25,0x14,0x16,0x16,0x17,0x03,0x06,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x45,0x70,0x23,0x01,0xb0,0x23,0x70,0x45,0x0c,0x1b,0x0d,0x88,0xfe,0x89,0x88,0x0d,0x1a,0x01,0x10,0x14,0xd6,0x43,0x6a,0x3d,0xfd,0xf8,0x3c,\r\n0x68,0x42,0xd3,0x13,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x58,0x8d,0x51,0x02,0x3a,0x3c,0x33,0x33,0x3c,0xfe,0x20,0x17,0x2f,0x16,0xe8,0xe8,0x16,0x2f,0xc5,0x37,0x30,0xfe,0x96,0x06,0x47,0x70,0x46,0x45,0x70,0x46,0x07,0x01,0x67,0x2f,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x25,0x00,0x5f,\r\n0x40,0x5c,0x20,0x1d,0x12,0x03,0x09,0x06,0x01,0x4c,0x07,0x01,0x06,0x00,0x09,0x00,0x06,0x09,0x80,0x00,0x09,0x08,0x00,0x09,0x08,0x7e,0x0c,0x0a,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0b,0x01,0x05,0x00,0x00,0x05,0x57,0x0b,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,\r\n0x00,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x25,0x0c,0x25,0x1f,0x1e,0x19,0x18,0x17,0x16,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0d,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x11,0x23,0x35,0x34,0x36,0x37,0x07,0x23,0x27,\r\n0x1e,0x02,0x15,0x15,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x70,0x5b,0x37,0x0a,0x0b,0x04,0x04,0x0c,0x0a,0x35,0x5a,0x40,0x04,0x0a,0x56,0x43,0x58,0x05,0x07,0x04,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x4f,0x7b,0x16,0x1b,0x11,0x11,0x1a,0x18,0x7a,0xfe,0xb1,0x5f,0x44,0x61,0x26,0xca,0xc7,0x19,0x35,\r\n0x46,0x34,0x5f,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x23,0x00,0x57,0x40,0x54,0x1f,0x19,0x13,0x0d,0x04,0x08,0x06,0x01,0x4c,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0a,0x01,\r\n0x05,0x00,0x00,0x05,0x57,0x0a,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x05,0x00,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x23,0x0c,0x23,0x1b,0x1a,0x18,0x17,0x0f,0x0e,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x37,0x27,0x33,0x17,0x16,0x16,0x17,0x36,\r\n0x36,0x37,0x37,0x33,0x07,0x17,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x70,0x7e,0x7d,0x4e,0x42,0x0d,0x08,0x07,0x05,0x09,0x0c,0x40,0x4d,0x7d,0x7d,0x4f,0x41,0x0d,0x0a,0x06,0x05,0x06,0x0d,0x42,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0xa9,0xa6,0x56,0x10,0x18,\r\n0x0e,0x0e,0x18,0x10,0x56,0xa8,0xa7,0x55,0x11,0x1a,0x0d,0x0d,0x19,0x11,0x56,0x00,0x00,0x02,0x00,0x34,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0b,0x00,0x13,0x00,0x4d,0x40,0x4a,0x0b,0x01,0x09,0x06,0x09,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0a,0x01,0x05,0x00,0x00,0x07,0x05,0x00,\r\n0x67,0x00,0x07,0x06,0x06,0x07,0x57,0x00,0x07,0x07,0x06,0x5f,0x08,0x01,0x06,0x07,0x06,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x13,0x0c,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x23,0x35,0x21,0x15,0x23,\r\n0x11,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0xf9,0x98,0x01,0x72,0x98,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x04,0x00,0x34,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x19,0x00,0x22,0x00,0x2b,0x00,0x61,0x40,0x5e,0x13,0x01,0x0b,0x08,0x01,0x4c,0x00,0x01,0x00,0x02,\r\n0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x06,0x05,0x00,0x67,0x00,0x06,0x00,0x09,0x08,0x06,0x09,0x67,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x0a,0x07,0x07,0x0a,0x57,0x00,0x0a,0x0a,0x07,0x5f,0x0d,0x01,0x07,0x0a,0x07,0x4f,0x0c,0x0c,0x00,0x00,0x2b,0x29,0x25,0x23,0x22,0x20,\r\n0x1c,0x1a,0x0c,0x19,0x0c,0x18,0x0f,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,\r\n0x23,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x7f,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x3b,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,0xdb,0x19,0x13,0x13,0x17,\r\n0x00,0x02,0x00,0x34,0xff,0xc6,0x02,0x46,0x02,0xda,0x00,0x0b,0x00,0x2f,0x00,0xb7,0x40,0x0c,0x29,0x1b,0x1a,0x03,0x09,0x0a,0x2e,0x01,0x06,0x09,0x02,0x4c,0x4b,0xb0,0x12,0x50,0x58,0x40,0x3e,0x00,0x0a,0x08,0x09,0x09,0x0a,0x72,0x00,0x0b,0x06,0x0b,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,\r\n0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,0x00,0x08,0x0a,0x07,0x08,0x69,0x00,0x09,0x06,0x06,0x09,0x59,0x00,0x09,0x09,0x06,0x62,0x0d,0x01,0x06,0x09,0x06,0x52,0x1b,0x40,0x3f,0x00,0x0a,0x08,0x09,0x08,0x0a,0x09,0x80,0x00,0x0b,0x06,0x0b,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,\r\n0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,0x00,0x08,0x0a,0x07,0x08,0x69,0x00,0x09,0x06,0x06,0x09,0x59,0x00,0x09,0x09,0x06,0x62,0x0d,0x01,0x06,0x09,0x06,0x52,0x59,0x40,0x1e,0x0d,0x0c,0x00,0x00,0x2d,0x2c,0x2b,0x2a,0x28,0x26,0x22,0x20,0x15,0x13,0x0c,0x2f,0x0d,0x2f,0x00,0x0b,0x00,0x0b,0x11,0x11,\r\n0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x07,0x27,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x37,0x27,0x33,0x17,0x23,0x27,0x06,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,\r\n0x01,0x1a,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x32,0x4f,0x2e,0x21,0x2d,0x05,0x05,0x3e,0x2d,0x2d,0x3e,0x3e,0x2d,0x0a,0x09,0x36,0x4b,0x8e,0x4b,0x30,0x1c,0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x36,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x2d,0x4e,0x32,0x3a,0x2e,0x36,0x0b,0x1a,0x0d,0x31,0x41,0x41,0x31,0x31,0x41,0x02,0x46,0xb7,\r\n0x3e,0x09,0x00,0x00,0x00,0x02,0x00,0x34,0xff,0xfb,0x02,0x3a,0x02,0xda,0x00,0x0b,0x00,0x27,0x00,0x62,0x40,0x5f,0x00,0x08,0x09,0x0b,0x09,0x08,0x0b,0x80,0x00,0x0b,0x0a,0x09,0x0b,0x0a,0x7e,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x0c,0x01,0x05,0x00,0x00,0x07,0x05,0x00,0x67,0x00,0x07,\r\n0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x0a,0x06,0x06,0x0a,0x59,0x00,0x0a,0x0a,0x06,0x61,0x0d,0x01,0x06,0x0a,0x06,0x51,0x0d,0x0c,0x00,0x00,0x25,0x24,0x22,0x20,0x1c,0x1a,0x18,0x17,0x15,0x13,0x0c,0x27,0x0d,0x27,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0e,0x06,0x1b,0x2b,0x01,0x15,0x21,0x11,0x21,0x15,0x23,0x15,0x33,0x15,\r\n0x23,0x15,0x01,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x33,0x06,0x06,0x01,0x5e,0xfe,0xd6,0x01,0x2a,0xe8,0xca,0xca,0x01,0x21,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x39,0x5a,0x10,0x44,0x0b,0x35,0x1f,0x2e,0x3d,0x3d,0x2e,0x1f,0x35,0x0b,0x44,0x10,0x5a,\r\n0x01,0xc5,0x3a,0x01,0x4f,0x3a,0x56,0x2f,0x56,0xfe,0x36,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x3e,0x32,0x18,0x1e,0x41,0x32,0x31,0x41,0x1e,0x18,0x31,0x3f,0x00,0x00,0x00,0x00,0x02,0x00,0x3e,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x09,0x00,0x35,0x00,0x61,0x40,0x5e,0x0b,0x01,0x04,0x03,0x08,0x03,0x04,0x08,0x80,0x00,0x09,0x0a,0x06,0x0a,\r\n0x09,0x06,0x80,0x00,0x06,0x07,0x0a,0x06,0x07,0x7e,0x00,0x00,0x00,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x08,0x00,0x0a,0x09,0x08,0x0a,0x69,0x00,0x07,0x05,0x05,0x07,0x59,0x00,0x07,0x07,0x05,0x61,0x0c,0x01,0x05,0x07,0x05,0x51,0x0b,0x0a,0x00,0x00,0x29,0x26,0x24,0x23,0x21,0x1e,0x13,0x10,0x0e,\r\n0x0d,0x0a,0x35,0x0b,0x34,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x0d,0x06,0x1a,0x2b,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,\r\n0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x3e,0x01,0x2a,0xe8,0xca,0xca,0x01,0x04,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x3a,0x56,0x3a,0x85,0xfe,0x71,0x3a,0x31,0x16,0x1b,\r\n0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x3e,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x09,0x00,0x13,0x00,0x55,0x40,0x52,0x0a,0x01,0x04,0x03,0x05,0x03,0x04,0x05,0x80,0x0b,0x01,0x09,0x08,0x09,0x86,0x00,0x00,0x00,\r\n0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x00,0x03,0x04,0x02,0x03,0x67,0x00,0x05,0x00,0x06,0x07,0x05,0x06,0x67,0x00,0x07,0x08,0x08,0x07,0x57,0x00,0x07,0x07,0x08,0x5f,0x00,0x08,0x07,0x08,0x4f,0x0a,0x0a,0x00,0x00,0x0a,0x13,0x0a,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x0c,0x0b,0x00,0x09,0x00,0x09,0x11,0x11,0x11,0x11,0x0c,0x06,0x1a,\r\n0x2b,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x13,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x3e,0x01,0x2a,0xe8,0xca,0xca,0x86,0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0x3a,0x56,0x3a,0x85,0xfe,0x75,0x01,0x4f,0x3a,0x56,0x3a,0x85,0x00,0x00,0x00,0x00,0x02,0x00,0x20,0xff,0xfc,0x02,0x2f,0x02,0xdf,0x00,0x1f,\r\n0x00,0x4b,0x00,0x65,0x40,0x62,0x00,0x01,0x02,0x05,0x02,0x01,0x05,0x80,0x00,0x0b,0x0c,0x08,0x0c,0x0b,0x08,0x80,0x00,0x08,0x09,0x0c,0x08,0x09,0x7e,0x00,0x00,0x00,0x02,0x01,0x00,0x02,0x69,0x00,0x05,0x00,0x04,0x03,0x05,0x04,0x67,0x00,0x03,0x00,0x06,0x0a,0x03,0x06,0x69,0x00,0x0a,0x00,0x0c,0x0b,0x0a,0x0c,0x69,0x00,0x09,0x07,\r\n0x07,0x09,0x59,0x00,0x09,0x09,0x07,0x61,0x0d,0x01,0x07,0x09,0x07,0x51,0x21,0x20,0x3f,0x3c,0x3a,0x39,0x37,0x34,0x29,0x26,0x24,0x23,0x20,0x4b,0x21,0x4a,0x24,0x11,0x12,0x24,0x22,0x12,0x23,0x0e,0x06,0x1d,0x2b,0x13,0x34,0x36,0x36,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x37,0x23,0x35,\r\n0x33,0x15,0x14,0x06,0x06,0x23,0x22,0x26,0x26,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x20,0x2e,0x4f,0x32,0x39,0x59,0x10,0x44,0x0b,0x34,0x1f,\r\n0x2e,0x3d,0x3d,0x2e,0x20,0x36,0x0d,0x63,0xa7,0x2c,0x4b,0x30,0x32,0x4f,0x2e,0x01,0x64,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x02,0x32,0x32,0x4e,0x2d,0x3d,0x2d,0x14,0x1c,0x41,0x32,0x31,\r\n0x41,0x20,0x27,0x39,0x0e,0x33,0x4d,0x2c,0x2d,0x4e,0xfd,0xfb,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0b,0x00,0x13,0x00,0x4c,0x40,0x49,0x02,0x01,\r\n0x00,0x01,0x00,0x85,0x0a,0x05,0x02,0x03,0x04,0x07,0x04,0x03,0x07,0x80,0x0b,0x01,0x09,0x06,0x09,0x86,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x67,0x00,0x07,0x06,0x06,0x07,0x57,0x00,0x07,0x07,0x06,0x5f,0x08,0x01,0x06,0x07,0x06,0x4f,0x0c,0x0c,0x00,0x00,0x0c,0x13,0x0c,0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,\r\n0x11,0x11,0x11,0x11,0x0c,0x06,0x1b,0x2b,0x13,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,0x23,0x15,0x01,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0x2d,0x42,0xb2,0x42,0x42,0xb2,0x01,0x00,0x98,0x01,0x72,0x98,0x01,0x8b,0x01,0x4f,0x84,0x84,0xfe,0xb1,0x8f,0x8f,0xfe,0x75,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x00,0x00,0x04,0xff,0xf6,\r\n0x00,0x32,0x02,0x62,0x02,0x9e,0x00,0x0f,0x00,0x21,0x00,0x27,0x00,0x2d,0x00,0x50,0x40,0x4d,0x2c,0x23,0x19,0x03,0x00,0x05,0x01,0x4c,0x07,0x01,0x00,0x05,0x00,0x86,0x00,0x01,0x08,0x01,0x02,0x03,0x01,0x02,0x69,0x04,0x01,0x03,0x05,0x05,0x03,0x57,0x04,0x01,0x03,0x03,0x05,0x5f,0x0a,0x06,0x09,0x03,0x05,0x03,0x05,0x4f,0x28,0x28,\r\n0x22,0x22,0x11,0x10,0x01,0x00,0x28,0x2d,0x28,0x2d,0x22,0x27,0x22,0x27,0x1e,0x1d,0x15,0x14,0x10,0x21,0x11,0x21,0x09,0x07,0x00,0x0f,0x01,0x0f,0x0b,0x06,0x16,0x2b,0x25,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x14,0x06,0x06,0x03,0x22,0x06,0x06,0x07,0x33,0x17,0x16,0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x2e,\r\n0x02,0x13,0x07,0x3e,0x02,0x37,0x21,0x1e,0x02,0x17,0x27,0x01,0x2c,0x58,0x8d,0x51,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,0x59,0x46,0x71,0x47,0x05,0x77,0x59,0x0e,0x19,0x0c,0x0c,0x1b,0x0d,0x59,0x76,0x05,0x47,0x71,0x60,0x8c,0x40,0x66,0x3e,0x05,0xfd,0xfa,0x05,0x3d,0x64,0x3f,0x8b,0x32,0x51,0x8d,0x58,0x59,0x8c,0x51,0x51,0x8c,\r\n0x59,0x58,0x8d,0x51,0x02,0x3a,0x3e,0x6b,0x44,0x97,0x16,0x2f,0x17,0x17,0x2f,0x16,0x97,0x44,0x6b,0x3e,0xfe,0xe6,0xed,0x06,0x40,0x67,0x40,0x40,0x66,0x40,0x06,0xec,0x00,0x02,0x00,0x51,0x00,0x00,0x02,0x07,0x02,0x30,0x00,0x04,0x00,0x09,0x00,0x28,0x40,0x25,0x09,0x08,0x07,0x03,0x02,0x01,0x06,0x01,0x4a,0x00,0x01,0x00,0x00,0x01,\r\n0x57,0x00,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x00,0x00,0x06,0x05,0x00,0x04,0x00,0x04,0x03,0x06,0x16,0x2b,0x33,0x11,0x37,0x17,0x11,0x25,0x21,0x11,0x27,0x07,0x51,0xdb,0xdb,0xfe,0x7c,0x01,0x52,0xa9,0xa9,0x01,0x5b,0xd5,0xd5,0xfe,0xa5,0x32,0x01,0x11,0xa5,0xa5,0x00,0x00,0x00,0x04,0x00,0x14,0x00,0x00,0x02,0x44,\r\n0x03,0x16,0x00,0x06,0x00,0x0d,0x00,0x17,0x00,0x1b,0x00,0x53,0x40,0x50,0x08,0x06,0x02,0x03,0x4a,0x0a,0x05,0x02,0x03,0x02,0x01,0x00,0x04,0x03,0x00,0x67,0x00,0x04,0x00,0x01,0x07,0x04,0x01,0x67,0x0b,0x01,0x07,0x0c,0x01,0x09,0x08,0x07,0x09,0x67,0x00,0x08,0x06,0x06,0x08,0x57,0x00,0x08,0x08,0x06,0x5f,0x00,0x06,0x08,0x06,0x4f,\r\n0x18,0x18,0x0e,0x0e,0x07,0x07,0x18,0x1b,0x18,0x1b,0x1a,0x19,0x0e,0x17,0x0e,0x17,0x14,0x11,0x07,0x0d,0x07,0x0d,0x11,0x14,0x11,0x11,0x10,0x0d,0x06,0x1b,0x2b,0x01,0x23,0x15,0x23,0x35,0x23,0x01,0x13,0x27,0x07,0x33,0x15,0x33,0x35,0x13,0x15,0x14,0x06,0x23,0x23,0x22,0x26,0x35,0x35,0x17,0x15,0x33,0x35,0x02,0x44,0x9b,0xfa,0x9b,\r\n0x01,0x18,0xba,0xba,0xba,0x6c,0x9c,0x2f,0x21,0x1b,0x82,0x1b,0x21,0x2f,0x9c,0x01,0xe5,0xd6,0xd6,0x01,0x31,0xfe,0xf5,0xcd,0xcd,0xd6,0xd6,0xfe,0xb4,0x83,0x1b,0x21,0x21,0x1b,0x83,0x26,0x71,0x71,0x00,0x00,0x00,0x02,0xff,0x5b,0x00,0x41,0x02,0x8f,0x02,0xa3,0x00,0x0a,0x00,0x16,0x00,0x29,0x40,0x26,0x16,0x15,0x14,0x13,0x12,0x11,\r\n0x10,0x0f,0x0e,0x0d,0x0c,0x02,0x0c,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x05,0x03,0x00,0x0a,0x01,0x0a,0x03,0x06,0x16,0x2b,0x25,0x21,0x01,0x01,0x21,0x32,0x16,0x15,0x11,0x14,0x06,0x27,0x27,0x37,0x27,0x07,0x27,0x07,0x17,0x07,0x17,0x37,0x17,0x02,0x2e,0xfe,0x5c,0xfe,0xd1,0x01,0x33,\r\n0x01,0xa0,0x2c,0x35,0x35,0x17,0x9e,0x9b,0x43,0x9b,0x9a,0x48,0x9c,0x99,0x45,0x98,0x9b,0x41,0x01,0x2c,0x01,0x36,0x36,0x2c,0xfe,0x62,0x2b,0x37,0x96,0x9c,0x9c,0x43,0x9b,0x9b,0x47,0x9c,0x99,0x44,0x99,0x9b,0x00,0x02,0xff,0xc9,0x00,0x41,0x02,0xfd,0x02,0xa3,0x00,0x0a,0x00,0x16,0x00,0x29,0x40,0x26,0x16,0x15,0x14,0x13,0x12,0x11,\r\n0x10,0x0f,0x0e,0x0d,0x0c,0x09,0x0c,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x08,0x06,0x00,0x0a,0x01,0x0a,0x03,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x01,0x01,0x25,0x17,0x37,0x17,0x37,0x27,0x37,0x27,0x07,0x27,0x07,0x17,0x2a,0x2b,0x36,0x36,0x2b,0x01,0xa0,0x01,\r\n0x33,0xfe,0xd1,0xfe,0x47,0x48,0x9b,0x98,0x45,0x99,0x9c,0x48,0x9a,0x9b,0x43,0x9b,0x41,0x37,0x2b,0x01,0x9e,0x2c,0x36,0xfe,0xca,0xfe,0xd4,0x96,0x47,0x9b,0x99,0x44,0x99,0x9c,0x47,0x9b,0x9b,0x43,0x9c,0x00,0x00,0x09,0xff,0xa9,0x00,0x41,0x02,0xaf,0x02,0xa3,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x1d,0x00,0x21,0x00,0x25,0x00,0x29,\r\n0x00,0x2d,0x00,0x31,0x00,0x64,0x40,0x61,0x00,0x01,0x0a,0x07,0x05,0x03,0x03,0x02,0x01,0x03,0x67,0x09,0x08,0x04,0x03,0x02,0x10,0x0e,0x02,0x0c,0x06,0x02,0x0c,0x67,0x0f,0x0d,0x0b,0x03,0x06,0x00,0x12,0x11,0x06,0x12,0x67,0x00,0x11,0x00,0x00,0x11,0x57,0x00,0x11,0x11,0x00,0x60,0x13,0x01,0x00,0x11,0x00,0x50,0x01,0x00,0x31,0x30,\r\n0x2f,0x2e,0x2d,0x2c,0x2b,0x2a,0x29,0x28,0x27,0x26,0x25,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x1d,0x1c,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,0x12,0x11,0x10,0x09,0x06,0x00,0x0f,0x01,0x0e,0x14,0x06,0x16,0x2b,0x37,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x21,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x33,0x35,0x23,0x17,0x33,\r\n0x35,0x23,0x01,0x33,0x11,0x23,0x15,0x33,0x23,0x33,0x35,0x23,0x03,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x17,0x33,0x35,0x23,0x01,0x21,0x35,0x21,0x14,0x2f,0x3c,0x36,0x2b,0x02,0x44,0x2c,0x35,0x35,0x2c,0xfd,0x9f,0x6c,0x6c,0x98,0x6c,0x6c,0x01,0x7a,0x6c,0xb6,0x4a,0xe2,0x6c,0x6c,0xe6,0x6c,0x6c,0x98,0x6c,0x6c,0x98,0x6c,0x6c,0xfe,\r\n0x86,0x01,0xe6,0xfe,0x1a,0x41,0x3c,0x2f,0x01,0x95,0x2c,0x36,0x36,0x2c,0xfe,0x61,0x2b,0x36,0x01,0x9e,0x80,0x80,0x80,0xfe,0xd4,0x01,0x2c,0x80,0x80,0xfe,0xd4,0x80,0x80,0x80,0x80,0x80,0xfe,0xd4,0x80,0x00,0x00,0x02,0x00,0x0a,0x00,0x00,0x02,0x4e,0x02,0xda,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x01,0x07,0x05,0x02,\r\n0x00,0x02,0x01,0x00,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x06,0x01,0x03,0x02,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x06,0x19,0x2b,0x21,0x03,0x23,0x35,0x33,0x13,0x33,0x15,0x03,0x35,0x33,0x15,0x01,0x69,0xbc,0xa3,0xe5,0xbd,0xa2,0xcc,0xcc,\r\n0x02,0x8a,0x50,0xfd,0x76,0x50,0x02,0x8a,0x50,0x50,0x00,0x00,0x00,0x01,0x00,0x64,0xff,0xe2,0x01,0xf4,0x02,0xdb,0x00,0x16,0x00,0x3f,0x40,0x3c,0x12,0x01,0x08,0x49,0x00,0x03,0x02,0x03,0x85,0x09,0x01,0x08,0x07,0x08,0x86,0x04,0x01,0x02,0x05,0x01,0x01,0x00,0x02,0x01,0x67,0x06,0x01,0x00,0x07,0x07,0x00,0x57,0x06,0x01,0x00,0x00,\r\n0x07,0x5f,0x0a,0x01,0x07,0x00,0x07,0x4f,0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x10,0x0b,0x06,0x1f,0x2b,0x13,0x33,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x07,0x27,0x33,0x35,0x23,0x6e,0x93,0x93,0x93,0x56,0x93,0x93,0x93,0x93,0x9d,0xc2,0xce,0x9d,0x93,0x01,0x94,\r\n0x59,0x50,0x9e,0x9e,0x50,0x59,0x50,0x7e,0xe4,0xe4,0x7e,0x00,0x00,0x01,0x00,0x64,0xff,0xff,0x01,0xf4,0x02,0xf8,0x00,0x16,0x00,0x44,0x40,0x41,0x05,0x01,0x01,0x4a,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x07,0x06,0x07,0x86,0x03,0x01,0x00,0x0b,0x0a,0x02,0x04,0x05,0x00,0x04,0x67,0x09,0x01,0x05,0x06,0x06,0x05,0x57,0x09,0x01,0x05,\r\n0x05,0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x00,0x00,0x00,0x16,0x00,0x16,0x15,0x14,0x11,0x11,0x11,0x11,0x11,0x11,0x12,0x11,0x11,0x0c,0x06,0x1f,0x2b,0x13,0x35,0x33,0x35,0x23,0x37,0x17,0x23,0x15,0x33,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x23,0x35,0x33,0x35,0x6e,0x93,0x9d,0xce,0xc2,0x9d,0x93,0x93,0x93,0x93,0x56,\r\n0x93,0x93,0x01,0x46,0x50,0x7e,0xe4,0xe4,0x7e,0x50,0x59,0x50,0x9e,0x9e,0x50,0x59,0x00,0x06,0x00,0x00,0x00,0x48,0x02,0x58,0x02,0x9c,0x00,0x0a,0x00,0x0e,0x00,0x19,0x00,0x24,0x00,0x2f,0x00,0x5f,0x00,0x6e,0x40,0x6b,0x0f,0x01,0x0d,0x05,0x01,0x01,0x00,0x0d,0x01,0x69,0x0e,0x14,0x04,0x03,0x00,0x10,0x0c,0x02,0x03,0x02,0x00,0x03,\r\n0x69,0x11,0x0b,0x02,0x02,0x13,0x08,0x15,0x03,0x06,0x07,0x02,0x06,0x69,0x09,0x01,0x07,0x0a,0x0a,0x07,0x59,0x09,0x01,0x07,0x07,0x0a,0x61,0x12,0x16,0x02,0x0a,0x07,0x0a,0x51,0x31,0x30,0x1b,0x1a,0x10,0x0f,0x5c,0x5b,0x58,0x56,0x52,0x50,0x4f,0x4d,0x49,0x47,0x44,0x43,0x40,0x3e,0x3a,0x38,0x37,0x35,0x30,0x5f,0x31,0x5f,0x2e,0x2c,\r\n0x28,0x26,0x20,0x1e,0x1a,0x24,0x1b,0x24,0x15,0x13,0x0f,0x19,0x10,0x19,0x11,0x12,0x24,0x21,0x17,0x06,0x1a,0x2b,0x01,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x03,0x33,0x35,0x23,0x27,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x05,0x23,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x05,0x35,0x23,0x22,0x06,\r\n0x15,0x14,0x16,0x33,0x32,0x36,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x35,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x33,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x23,0x15,0x14,0x06,0x01,0x9c,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0xa6,\r\n0x6c,0x6c,0x7b,0x41,0x25,0x1c,0x1c,0x25,0x25,0x01,0x7e,0x41,0x25,0x1c,0x1c,0x25,0x25,0xfe,0xc3,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0x41,0x34,0x47,0x47,0x34,0x41,0x41,0x34,0x47,0x47,0x34,0x35,0x46,0x6c,0x47,0x34,0x35,0x46,0x46,0x35,0x41,0x41,0x35,0x46,0x46,0x35,0x34,0x47,0x6c,0x46,0x02,0x24,0x41,0x25,0x1c,0x1c,0x25,0x25,\r\n0xfe,0xf8,0x74,0x37,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0xe2,0x41,0x1c,0x25,0x25,0x1c,0x1c,0x25,0x41,0x41,0x25,0x1c,0x1c,0x25,0x25,0x5c,0x44,0x34,0x34,0x44,0x74,0x44,0x34,0x34,0x44,0x44,0x34,0x41,0x41,0x34,0x44,0x44,0x34,0x34,0x44,0x74,0x44,0x34,0x34,0x44,0x44,0x34,0x41,0x41,0x34,0x44,0x00,0x00,0x00,0x00,0x02,0xff,0xec,\r\n0x00,0x32,0x02,0x67,0x02,0xda,0x00,0x11,0x00,0x1a,0x00,0x3d,0x40,0x3a,0x19,0x02,0x02,0x00,0x04,0x1a,0x01,0x02,0x03,0x05,0x02,0x4c,0x12,0x00,0x02,0x02,0x49,0x00,0x01,0x00,0x04,0x00,0x01,0x04,0x67,0x00,0x00,0x00,0x05,0x03,0x00,0x05,0x67,0x00,0x03,0x02,0x02,0x03,0x57,0x00,0x03,0x03,0x02,0x5f,0x00,0x02,0x03,0x02,0x4f,0x11,\r\n0x11,0x12,0x25,0x33,0x13,0x06,0x06,0x1c,0x2b,0x25,0x01,0x01,0x15,0x33,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x21,0x07,0x35,0x21,0x11,0x23,0x11,0x23,0x35,0x07,0x01,0x1d,0xfe,0xcf,0x01,0x31,0x4c,0x21,0x1b,0x86,0x1b,0x21,0x21,0x1b,0xfe,0xf2,0x2c,0x01,0x47,0xa0,0xa7,0xc5,0x32,0x01,0x1d,0x01,0x1d,0xa5,\r\n0xd7,0x1b,0x21,0x21,0x1b,0xfe,0x76,0x1b,0x21,0x40,0x6b,0x01,0xaa,0xfe,0xee,0x6c,0xb8,0x00,0x00,0x00,0x00,0x02,0x00,0x52,0x00,0x00,0x02,0x30,0x02,0xda,0x00,0x05,0x00,0x0f,0x00,0x48,0x40,0x45,0x00,0x00,0x01,0x00,0x85,0x09,0x01,0x07,0x06,0x07,0x86,0x00,0x01,0x08,0x01,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,\r\n0x04,0x67,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x05,0x06,0x4f,0x06,0x06,0x00,0x00,0x06,0x0f,0x06,0x0f,0x0e,0x0d,0x0c,0x0b,0x0a,0x09,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0a,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x03,0x11,0x21,0x15,0x23,0x15,0x33,0x15,0x23,0x15,0x52,0x42,0xde,0x6c,\r\n0x01,0x2a,0xe8,0xca,0xca,0x01,0x8b,0x01,0x4f,0xfe,0xed,0x3c,0xfe,0x75,0x01,0x4f,0x3a,0x56,0x3a,0x85,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x11,0x00,0x1e,0x00,0x54,0x40,0x51,0x0c,0x03,0x02,0x02,0x00,0x19,0x01,0x08,0x05,0x02,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x0a,0x03,0x02,0x02,0x04,0x02,0x85,0x06,0x01,\r\n0x04,0x05,0x04,0x85,0x0b,0x09,0x02,0x07,0x08,0x07,0x86,0x00,0x05,0x08,0x08,0x05,0x57,0x00,0x05,0x05,0x08,0x5f,0x00,0x08,0x05,0x08,0x4f,0x12,0x12,0x00,0x00,0x12,0x1e,0x12,0x1e,0x1d,0x1c,0x1b,0x1a,0x18,0x17,0x16,0x15,0x14,0x13,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x0c,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,\r\n0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0x13,0x11,0x33,0x15,0x33,0x37,0x33,0x07,0x17,0x23,0x27,0x23,0x15,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x87,0x42,0x4f,0x60,0x4a,0x71,0x7b,0x4e,0x66,0x4f,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0xfe,\r\n0x75,0x01,0x4f,0x86,0x86,0xa1,0xae,0x8f,0x8f,0x00,0x00,0x00,0x00,0x02,0x00,0x2d,0x00,0x00,0x02,0x3a,0x02,0xda,0x00,0x11,0x00,0x17,0x00,0x43,0x40,0x40,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x07,0x03,0x02,0x02,0x04,0x02,0x85,0x00,0x04,0x05,0x04,0x85,0x00,0x05,0x06,0x06,0x05,0x57,0x00,0x05,0x05,\r\n0x06,0x5f,0x08,0x01,0x06,0x05,0x06,0x4f,0x12,0x12,0x00,0x00,0x12,0x17,0x12,0x17,0x16,0x15,0x14,0x13,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x09,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0x13,0x11,0x33,0x11,0x33,0x15,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,\r\n0x02,0xac,0x42,0xde,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0xfe,0x75,0x01,0x4f,0xfe,0xed,0x3c,0x00,0x00,0x02,0x00,0x2d,0xff,0xf6,0x02,0x2b,0x02,0xda,0x00,0x11,0x00,0x23,0x00,0x46,0x40,0x43,0x0c,0x03,0x02,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x08,\r\n0x03,0x02,0x02,0x05,0x02,0x85,0x07,0x01,0x05,0x06,0x05,0x85,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,0x51,0x13,0x12,0x00,0x00,0x20,0x1f,0x1c,0x1a,0x17,0x16,0x12,0x23,0x13,0x23,0x00,0x11,0x00,0x11,0x11,0x16,0x11,0x0a,0x06,0x19,0x2b,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,\r\n0x23,0x03,0x1e,0x02,0x15,0x15,0x01,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x2d,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x22,0x45,0x56,0x42,0x31,0x28,0x28,0x31,0x42,0x56,0x01,0x8b,0x01,0x4f,0xfe,0xf7,0x1e,0x25,0x31,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,\r\n0x31,0x2d,0x69,0xfe,0x6b,0x53,0x47,0xbf,0xbf,0x2c,0x32,0x32,0x2c,0xbf,0xbf,0x47,0x53,0x00,0x00,0x00,0x00,0x02,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0xd5,0x00,0x0d,0x00,0x37,0x00,0x32,0x40,0x2f,0x00,0x01,0x00,0x01,0x85,0x04,0x01,0x00,0x03,0x00,0x85,0x00,0x03,0x02,0x02,0x03,0x59,0x00,0x03,0x03,0x02,0x61,0x05,0x01,0x02,0x03,\r\n0x02,0x51,0x0f,0x0e,0x01,0x00,0x24,0x22,0x0e,0x37,0x0f,0x37,0x08,0x06,0x00,0x0d,0x01,0x0d,0x06,0x06,0x16,0x2b,0x25,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x07,0x22,0x2e,0x02,0x35,0x34,0x36,0x37,0x36,0x36,0x17,0x16,0x06,0x07,0x06,0x06,0x15,0x14,0x16,0x16,0x33,0x32,0x36,0x36,0x35,0x34,0x26,0x27,\r\n0x26,0x26,0x37,0x36,0x16,0x17,0x16,0x16,0x15,0x14,0x0e,0x02,0x01,0x2c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x17,0x43,0x74,0x58,0x31,0x32,0x2a,0x15,0x33,0x10,0x10,0x07,0x14,0x19,0x1d,0x34,0x5d,0x3c,0x3c,0x5d,0x34,0x1c,0x1a,0x14,0x07,0x10,0x11,0x32,0x15,0x2b,0x31,0x31,0x58,0x74,0xe1,0x23,0x19,0x01,0x7c,0x19,0x23,0x23,0x19,\r\n0xfe,0x84,0x19,0x23,0xeb,0x30,0x57,0x72,0x42,0x41,0x72,0x2b,0x16,0x07,0x11,0x10,0x30,0x17,0x1c,0x4b,0x2c,0x3d,0x5f,0x36,0x36,0x5f,0x3d,0x2c,0x4b,0x1c,0x17,0x30,0x10,0x11,0x07,0x16,0x2a,0x73,0x41,0x42,0x72,0x57,0x30,0x00,0x00,0x03,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0x6c,0x00,0x13,0x00,0x23,0x00,0x31,0x00,0x49,0x40,0x46,\r\n0x00,0x05,0x03,0x04,0x03,0x05,0x04,0x80,0x08,0x01,0x04,0x02,0x03,0x04,0x02,0x7e,0x00,0x01,0x00,0x03,0x05,0x01,0x03,0x69,0x07,0x01,0x02,0x00,0x00,0x02,0x59,0x07,0x01,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x02,0x00,0x51,0x25,0x24,0x15,0x14,0x01,0x00,0x2c,0x2a,0x24,0x31,0x25,0x31,0x1d,0x1b,0x14,0x23,0x15,0x23,0x0b,0x09,0x00,\r\n0x13,0x01,0x13,0x09,0x06,0x16,0x2b,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x37,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x01,0x2c,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x43,\r\n0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x3c,0x62,0x39,0x39,0x62,0x3c,0x3c,0x61,0x3a,0x3a,0x61,0x3c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x0a,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x5f,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x46,0x23,0x19,0xb4,0x19,0x23,0x23,0x19,\r\n0xb4,0x19,0x23,0x00,0x00,0x02,0xff,0xec,0xff,0xf6,0x02,0x6c,0x02,0x6c,0x00,0x13,0x00,0x23,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x15,0x14,0x01,0x00,0x1d,0x1b,0x14,0x23,0x15,0x23,0x0b,0x09,0x00,0x13,0x01,\r\n0x13,0x06,0x06,0x16,0x2b,0x05,0x22,0x2e,0x02,0x35,0x34,0x3e,0x02,0x33,0x32,0x1e,0x02,0x15,0x14,0x0e,0x02,0x27,0x32,0x36,0x36,0x35,0x34,0x26,0x26,0x23,0x22,0x06,0x06,0x15,0x14,0x16,0x16,0x01,0x2c,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x43,0x74,0x58,0x31,0x31,0x58,0x74,0x43,0x3c,0x62,0x39,0x39,0x62,0x3c,0x3c,0x61,0x3a,\r\n0x3a,0x61,0x0a,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x30,0x57,0x72,0x42,0x42,0x72,0x57,0x30,0x5f,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x3b,0x64,0x3d,0x3d,0x64,0x3b,0x00,0x01,0x00,0xf5,0xff,0xfb,0x01,0x63,0x02,0x67,0x00,0x0d,0x00,0x18,0x40,0x15,0x00,0x01,0x00,0x01,0x85,0x02,0x01,0x00,0x00,0x76,0x01,0x00,0x08,0x06,0x00,0x0d,\r\n0x01,0x0d,0x03,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x01,0x2c,0x16,0x21,0x21,0x16,0x17,0x20,0x20,0x05,0x23,0x19,0x01,0xf4,0x19,0x23,0x23,0x19,0xfe,0x0c,0x19,0x23,0x00,0x00,0x00,0x01,0x00,0x06,0xff,0xf7,0x02,0x66,0x02,0x57,0x00,0x15,0x00,0x16,0x40,0x13,0x0f,0x07,0x02,0x00,\r\n0x4a,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x01,0x76,0x15,0x1d,0x02,0x06,0x18,0x2b,0x37,0x26,0x26,0x36,0x36,0x37,0x36,0x37,0x06,0x06,0x16,0x17,0x16,0x16,0x36,0x37,0x06,0x07,0x0e,0x02,0x26,0x64,0x2f,0x2f,0x01,0x30,0x30,0x27,0x2b,0x1e,0x05,0x2e,0x2e,0x2f,0x82,0x89,0x3a,0x16,0x27,0x30,0x75,0x7c,0x75,0x55,0x2f,0x75,0x7c,0x75,\r\n0x30,0x27,0x16,0x39,0x8a,0x82,0x2e,0x2f,0x2e,0x05,0x1e,0x2b,0x27,0x30,0x30,0x01,0x2f,0x00,0x00,0x00,0x00,0x02,0x00,0x23,0x01,0x4a,0x02,0x35,0x02,0xda,0x00,0x03,0x00,0x09,0x00,0x34,0x40,0x31,0x08,0x05,0x02,0x02,0x01,0x01,0x4c,0x05,0x03,0x02,0x02,0x01,0x02,0x86,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x04,\r\n0x01,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x06,0x06,0x17,0x2b,0x13,0x35,0x21,0x15,0x09,0x02,0x23,0x27,0x07,0x37,0x01,0xea,0xfe,0x02,0x01,0x09,0x01,0x09,0x6e,0x9a,0x9e,0x02,0x8a,0x50,0x50,0xfe,0xc0,0x01,0x0e,0xfe,0xf2,0xa2,0xa2,0x00,0x00,0x00,0x00,0x03,0x00,0x2d,\r\n0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x0d,0x00,0x16,0x00,0x42,0x00,0x6b,0x40,0x68,0x08,0x01,0x02,0x04,0x01,0x4c,0x0c,0x03,0x02,0x01,0x02,0x09,0x02,0x01,0x09,0x80,0x00,0x0a,0x0b,0x07,0x0b,0x0a,0x07,0x80,0x00,0x07,0x08,0x0b,0x07,0x08,0x7e,0x00,0x00,0x00,0x05,0x04,0x00,0x05,0x67,0x00,0x04,0x00,0x02,0x01,0x04,0x02,0x67,0x00,\r\n0x09,0x00,0x0b,0x0a,0x09,0x0b,0x69,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0d,0x01,0x06,0x08,0x06,0x51,0x18,0x17,0x00,0x00,0x36,0x33,0x31,0x30,0x2e,0x2b,0x20,0x1d,0x1b,0x1a,0x17,0x42,0x18,0x41,0x16,0x14,0x10,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x16,0x21,0x0e,0x06,0x19,0x2b,0x13,0x11,0x33,0x32,0x16,0x15,0x14,\r\n0x06,0x07,0x17,0x23,0x27,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x01,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x2d,0xc6,0x38,0x44,\r\n0x34,0x2b,0x67,0x50,0x64,0x54,0x85,0x19,0x1f,0x1e,0x19,0x86,0x01,0x15,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x01,0x8b,0x01,0x4f,0x3d,0x2f,0x28,0x32,0x06,0x83,0x81,0x81,0xb3,0x1b,0x15,\r\n0x16,0x1c,0xfd,0x5c,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x00,0x03,0xff,0xf6,0xff,0xf5,0x02,0x62,0x02,0xe4,0x00,0x14,0x00,0x27,0x00,0x35,0x00,0x53,0x40,0x50,0x00,0x03,0x06,0x02,0x06,0x03,0x02,0x80,\r\n0x00,0x01,0x00,0x04,0x05,0x01,0x04,0x69,0x00,0x05,0x00,0x06,0x03,0x05,0x06,0x69,0x00,0x02,0x00,0x08,0x07,0x02,0x08,0x69,0x0a,0x01,0x07,0x00,0x00,0x07,0x59,0x0a,0x01,0x07,0x07,0x00,0x61,0x09,0x01,0x00,0x07,0x00,0x51,0x2a,0x28,0x01,0x00,0x31,0x2e,0x28,0x35,0x2a,0x35,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x18,0x17,0x16,0x15,0x0b,\r\n0x09,0x00,0x14,0x01,0x14,0x0b,0x06,0x16,0x2b,0x05,0x22,0x27,0x03,0x26,0x35,0x34,0x37,0x13,0x36,0x33,0x32,0x17,0x13,0x16,0x16,0x15,0x14,0x07,0x03,0x06,0x03,0x33,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x17,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x01,\r\n0x2c,0x23,0x23,0xd4,0x1c,0x1b,0xd5,0x23,0x23,0x23,0x23,0xd5,0x0e,0x0d,0x1c,0xd4,0x22,0x48,0x35,0x2c,0x33,0x3e,0x35,0x3f,0x3f,0x1c,0x21,0x21,0x1c,0x21,0x13,0x12,0x0e,0x11,0x11,0x0e,0x12,0x0d,0x11,0x11,0x0b,0x2a,0x01,0x03,0x23,0x23,0x24,0x22,0x01,0x0b,0x2b,0x2b,0xfe,0xf5,0x11,0x24,0x11,0x23,0x23,0xfe,0xfd,0x2a,0x01,0x20,\r\n0x35,0x02,0x38,0x2d,0x32,0x3a,0x32,0x20,0x1d,0x1c,0x23,0xc5,0x13,0x0d,0x0e,0x12,0x12,0x0e,0x0d,0x13,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2e,0x02,0xde,0x00,0x2b,0x00,0x37,0x00,0x62,0x40,0x5f,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,\r\n0x01,0x00,0x08,0x02,0x00,0x69,0x00,0x08,0x09,0x01,0x07,0x06,0x08,0x07,0x67,0x0a,0x01,0x06,0x0b,0x0b,0x06,0x57,0x0a,0x01,0x06,0x06,0x0b,0x5f,0x0d,0x01,0x0b,0x06,0x0b,0x4f,0x2c,0x2c,0x01,0x00,0x2c,0x37,0x2c,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,\r\n0x01,0x2a,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x35,0x33,0x35,0x23,0x35,0x21,0x15,0x23,0x15,0x33,0x15,0xbc,0x40,\r\n0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x1d,0x7d,0x7d,0x01,0x3c,0x7d,0x7d,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,\r\n0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x3c,0xd7,0x3c,0x3c,0xd7,0x3c,0x00,0x00,0x00,0x00,0x03,0x00,0x25,0xff,0xfb,0x02,0x3f,0x02,0xde,0x00,0x2b,0x00,0x3b,0x00,0x47,0x00,0x61,0x40,0x5e,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,\r\n0x02,0x0a,0x01,0x00,0x07,0x02,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x0c,0x01,0x08,0x06,0x06,0x08,0x59,0x0c,0x01,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x3d,0x3c,0x2d,0x2c,0x01,0x00,0x43,0x41,0x3c,0x47,0x3d,0x47,0x35,0x33,0x2c,0x3b,0x2d,0x3b,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,\r\n0x2b,0x01,0x2a,0x0d,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x22,0x26,0x26,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,\r\n0x14,0x06,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0xbb,0x32,0x4f,0x2e,0x2e,0x4f,0x32,0x32,0x4f,0x2e,0x2e,0x4f,0x32,\r\n0x2d,0x3e,0x3e,0x2d,0x2d,0x3e,0x3e,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x74,0x2d,0x4e,0x31,0x32,0x4e,0x2d,0x2d,0x4e,0x32,0x31,0x4e,0x2d,0x3a,0x41,0x31,0x31,0x42,0x42,0x31,0x31,0x41,0x00,0x00,\r\n0x00,0x03,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x36,0x00,0x3f,0x00,0x62,0x40,0x5f,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x0c,0x01,0x08,0x07,0x08,0x86,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0b,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x06,0x00,0x0a,0x09,0x06,\r\n0x0a,0x67,0x00,0x09,0x07,0x07,0x09,0x57,0x00,0x09,0x09,0x07,0x5f,0x00,0x07,0x09,0x07,0x4f,0x2c,0x2c,0x01,0x00,0x3f,0x3d,0x39,0x37,0x2c,0x36,0x2c,0x36,0x35,0x33,0x2f,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0d,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,\r\n0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x23,0x15,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,\r\n0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x2a,0xbf,0x38,0x44,0x44,0x38,0x7d,0x7e,0x19,0x1f,0x1e,0x19,0x7f,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,\r\n0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x3f,0x2f,0x2e,0x3e,0x75,0xaf,0x1d,0x15,0x16,0x1e,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2b,0x02,0xde,0x00,0x2b,0x00,0x37,0x00,0x66,0x40,0x63,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x08,0x01,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0d,0x0b,\r\n0x02,0x09,0x0a,0x09,0x86,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x07,0x0a,0x0a,0x07,0x57,0x00,0x07,0x07,0x0a,0x5f,0x00,0x0a,0x07,0x0a,0x4f,0x2c,0x2c,0x01,0x00,0x2c,0x37,0x2c,0x37,0x36,0x35,0x34,0x33,0x32,0x31,0x30,0x2f,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,\r\n0x04,0x03,0x00,0x2b,0x01,0x2a,0x0e,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x15,0x33,0x35,0x33,0x11,0x23,0x35,\r\n0x23,0x15,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0x42,0xb2,0x42,0x42,0xb2,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,\r\n0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x84,0x84,0xfe,0xb1,0x8f,0x8f,0x00,0x00,0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x43,0x00,0x62,0x40,0x5f,0x3f,0x39,0x33,0x2d,0x04,0x08,0x06,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,\r\n0x02,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x2c,0x2c,0x01,0x00,0x2c,0x43,0x2c,0x43,0x3b,0x3a,0x38,0x37,0x2f,0x2e,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,\r\n0x04,0x03,0x00,0x2b,0x01,0x2a,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x37,0x27,0x33,0x17,0x16,0x16,0x17,0x36,0x36,\r\n0x37,0x37,0x33,0x07,0x17,0x23,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x11,0x7e,0x7d,0x4e,0x42,0x0d,0x08,0x07,0x05,0x09,0x0c,0x40,0x4d,0x7d,\r\n0x7d,0x4f,0x41,0x0d,0x0a,0x06,0x05,0x06,0x0d,0x42,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0xa9,0xa6,0x56,0x10,0x18,0x0e,0x0e,0x18,0x10,0x56,0xa8,0xa7,0x55,0x11,0x1a,0x0d,0x0d,0x19,0x11,0x56,\r\n0x00,0x04,0x00,0x25,0x00,0x00,0x02,0x3a,0x02,0xde,0x00,0x2b,0x00,0x39,0x00,0x42,0x00,0x4b,0x00,0x6d,0x40,0x6a,0x33,0x01,0x0b,0x08,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,0x02,0x0c,0x01,0x00,0x06,0x02,0x00,0x69,0x00,0x06,0x00,0x09,\r\n0x08,0x06,0x09,0x67,0x00,0x08,0x00,0x0b,0x0a,0x08,0x0b,0x67,0x00,0x0a,0x07,0x07,0x0a,0x57,0x00,0x0a,0x0a,0x07,0x5f,0x0d,0x01,0x07,0x0a,0x07,0x4f,0x2c,0x2c,0x01,0x00,0x4b,0x49,0x45,0x43,0x42,0x40,0x3c,0x3a,0x2c,0x39,0x2c,0x38,0x2f,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0e,0x06,0x16,\r\n0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x32,0x16,0x15,0x14,0x07,0x16,0x16,0x15,0x14,0x06,0x23,0x27,0x33,0x32,0x36,0x35,\r\n0x34,0x26,0x23,0x23,0x15,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x23,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0xc2,0x33,0x3f,0x37,0x21,0x27,0x40,0x34,0x8f,0x81,0x14,0x1a,0x19,0x14,\r\n0x82,0x8c,0x17,0x1d,0x1d,0x17,0x8c,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,0x2e,0x26,0x39,0x14,0x08,0x2b,0x1e,0x29,0x34,0xbf,0x17,0x13,0x13,0x19,0xdb,0x19,0x13,0x13,0x17,0x00,0x00,\r\n0x00,0x02,0x00,0x25,0x00,0x00,0x02,0x2b,0x02,0xde,0x00,0x2b,0x00,0x3d,0x00,0x60,0x40,0x5d,0x38,0x2f,0x02,0x08,0x06,0x01,0x4c,0x00,0x04,0x05,0x01,0x05,0x04,0x01,0x80,0x00,0x01,0x02,0x05,0x01,0x02,0x7e,0x07,0x01,0x06,0x00,0x08,0x00,0x06,0x08,0x80,0x0b,0x09,0x02,0x08,0x08,0x84,0x00,0x03,0x00,0x05,0x04,0x03,0x05,0x69,0x00,\r\n0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x0a,0x01,0x00,0x02,0x00,0x51,0x2c,0x2c,0x01,0x00,0x2c,0x3d,0x2c,0x3d,0x37,0x36,0x35,0x34,0x2e,0x2d,0x1f,0x1c,0x1a,0x19,0x17,0x14,0x09,0x06,0x04,0x03,0x00,0x2b,0x01,0x2a,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,\r\n0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0x13,0x11,0x33,0x13,0x2e,0x02,0x35,0x35,0x33,0x11,0x23,0x03,0x1e,0x02,0x15,0x15,0xbc,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,\r\n0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,0x58,0x33,0x3b,0x4e,0x44,0x20,0x50,0xb2,0x05,0x06,0x02,0x41,0x50,0xb2,0x06,0x05,0x02,0x01,0x87,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0xfe,0x79,0x01,0x4f,\r\n0xfe,0xf7,0x1e,0x26,0x30,0x2c,0x69,0xfe,0xb1,0x01,0x09,0x1c,0x26,0x31,0x2d,0x69,0x00,0x01,0x00,0x5a,0x00,0x00,0x02,0x12,0x02,0xe4,0x00,0x1c,0x00,0x43,0x40,0x40,0x16,0x15,0x10,0x03,0x04,0x03,0x01,0x4c,0x00,0x01,0x02,0x03,0x02,0x01,0x03,0x80,0x00,0x03,0x04,0x02,0x03,0x04,0x7e,0x00,0x02,0x02,0x00,0x61,0x06,0x01,0x00,0x00,\r\n0x3e,0x4d,0x00,0x04,0x04,0x05,0x60,0x00,0x05,0x05,0x39,0x05,0x4e,0x01,0x00,0x14,0x13,0x12,0x11,0x0f,0x0d,0x08,0x06,0x04,0x03,0x00,0x1c,0x01,0x1c,0x07,0x09,0x16,0x2b,0x01,0x32,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x33,0x33,0x15,0x07,0x21,0x15,0x21,0x35,0x37,0x26,0x26,0x35,0x35,0x34,0x36,0x01,0x37,\r\n0x65,0x76,0x5a,0x46,0x3c,0x3c,0x46,0x46,0x3c,0x4f,0xb3,0x01,0x2c,0xfe,0x6e,0xb0,0x5a,0x68,0x77,0x02,0xe4,0x71,0x61,0x3c,0x46,0x46,0x3c,0x32,0x3c,0x46,0x4e,0xbe,0x52,0x54,0xbb,0x07,0x6f,0x5b,0x32,0x61,0x71,0x00,0x00,0x00,0x00,0x01,0x00,0x49,0xff,0xf6,0x02,0x0c,0x02,0xda,0x00,0x18,0x00,0x34,0x40,0x31,0x01,0x01,0x01,0x03,\r\n0x01,0x4c,0x00,0x01,0x03,0x00,0x03,0x01,0x00,0x80,0x00,0x03,0x03,0x04,0x5f,0x05,0x01,0x04,0x04,0x38,0x4d,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x02,0x3f,0x02,0x4e,0x00,0x00,0x00,0x18,0x00,0x18,0x16,0x22,0x12,0x27,0x06,0x09,0x1a,0x2b,0x01,0x15,0x03,0x06,0x06,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x06,0x06,0x23,0x22,0x26,\r\n0x35,0x34,0x36,0x37,0x37,0x21,0x35,0x02,0x02,0xf3,0x34,0x2d,0x45,0x3b,0x3d,0x47,0x5a,0x03,0x78,0x63,0x65,0x77,0x39,0x45,0xc5,0xfe,0xb4,0x02,0xda,0x53,0xfe,0xfc,0x37,0x59,0x2a,0x3c,0x47,0x49,0x3e,0x63,0x74,0x73,0x61,0x35,0x73,0x48,0xce,0x52,0x00,0x02,0x00,0x2d,0xff,0xfc,0x02,0x2f,0x02,0xda,0x00,0x11,0x00,0x3d,0x00,0x59,\r\n0x40,0x56,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x08,0x09,0x05,0x09,0x08,0x05,0x80,0x00,0x05,0x06,0x09,0x05,0x06,0x7e,0x00,0x02,0x0a,0x01,0x00,0x07,0x02,0x00,0x69,0x00,0x07,0x00,0x09,0x08,0x07,0x09,0x69,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x0b,0x01,0x04,0x06,0x04,0x51,0x13,0x12,0x01,0x00,0x31,0x2e,0x2c,\r\n0x2b,0x29,0x26,0x1b,0x18,0x16,0x15,0x12,0x3d,0x13,0x3c,0x0e,0x0d,0x0a,0x08,0x05,0x04,0x00,0x11,0x01,0x11,0x0c,0x06,0x16,0x2b,0x13,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x16,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x13,0x22,0x26,0x27,0x33,0x16,0x16,0x33,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,\r\n0x33,0x33,0x32,0x16,0x17,0x23,0x26,0x26,0x23,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x23,0xc8,0x45,0x56,0x42,0x31,0x28,0x28,0x31,0x42,0x56,0x77,0x40,0x52,0x05,0x42,0x03,0x2e,0x24,0x19,0x25,0x2b,0x1c,0x19,0x58,0x31,0x39,0x4a,0x3f,0x19,0x3d,0x4e,0x07,0x42,0x04,0x2b,0x21,0x19,0x21,0x26,0x1b,0x16,\r\n0x58,0x33,0x3b,0x4e,0x44,0x01,0x81,0x53,0x47,0xbf,0xbf,0x2c,0x32,0x32,0x2c,0xbf,0xbf,0x47,0x53,0xfe,0x7b,0x3a,0x31,0x16,0x1b,0x18,0x14,0x10,0x16,0x03,0x0a,0x05,0x32,0x25,0x2d,0x35,0x33,0x2c,0x11,0x14,0x13,0x11,0x0f,0x14,0x02,0x0a,0x06,0x34,0x26,0x31,0x39,0x00,0x00,0x02,0x00,0x0f,0x00,0x00,0x02,0x49,0x02,0xda,0x00,0x0c,\r\n0x00,0x14,0x00,0x3a,0x40,0x37,0x03,0x01,0x01,0x00,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x00,0x01,0x04,0x01,0x85,0x07,0x01,0x06,0x03,0x06,0x86,0x00,0x04,0x03,0x03,0x04,0x57,0x00,0x04,0x04,0x03,0x5f,0x05,0x01,0x03,0x04,0x03,0x4f,0x0d,0x0d,0x0d,0x14,0x0d,0x14,0x11,0x11,0x12,0x11,0x11,0x17,0x08,0x06,0x1c,0x2b,0x13,0x16,\r\n0x16,0x17,0x36,0x36,0x37,0x37,0x33,0x03,0x23,0x03,0x33,0x01,0x11,0x23,0x35,0x21,0x15,0x23,0x11,0xad,0x08,0x12,0x02,0x02,0x10,0x07,0x57,0x48,0x94,0x4a,0x94,0x45,0x01,0x1b,0x98,0x01,0x72,0x98,0x02,0x0c,0x13,0x29,0x0e,0x0e,0x29,0x13,0xce,0xfe,0xb1,0x01,0x4f,0xfd,0x26,0x01,0x13,0x3c,0x3c,0xfe,0xed,0x00,0x00,0x02,0x00,0x37,\r\n0x00,0x00,0x02,0x53,0x02,0xda,0x00,0x1a,0x00,0x23,0x00,0x42,0x40,0x3f,0x06,0x01,0x04,0x03,0x01,0x4c,0x00,0x03,0x06,0x01,0x04,0x05,0x03,0x04,0x67,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x08,0x01,0x05,0x05,0x00,0x5f,0x07,0x01,0x00,0x00,0x39,0x00,0x4e,0x1c,0x1b,0x01,0x00,0x1f,0x1d,0x1b,0x23,0x1c,0x23,0x19,0x18,\r\n0x17,0x15,0x11,0x0f,0x0e,0x0c,0x00,0x1a,0x01,0x1a,0x09,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,0x11,0x27,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x17,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xad,0xad,0x35,0x3e,\r\n0x3f,0x36,0x01,0x3c,0x73,0xca,0x70,0x70,0x3c,0x47,0x47,0x70,0x5f,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x56,0x66,0x52,0x3d,0x35,0x34,0x3e,0x50,0xfe,0xac,0x52,0x01,0x02,0x46,0x3b,0x3b,0x46,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0xff,0x06,0x01,0xa4,0xff,0xce,0x00,0x07,0x06,0x79,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x8c,\r\n0xff,0x2e,0x01,0xcc,0xff,0xb0,0x00,0x19,0x00,0x6d,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,\r\n0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,\r\n0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x01,0x72,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0xd2,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x13,0xff,0x4c,0x01,0xf9,0x03,0x84,0x00,0x36,\r\n0x00,0x41,0x40,0x3e,0x36,0x02,0x02,0x01,0x00,0x0c,0x06,0x05,0x03,0x03,0x01,0x08,0x01,0x04,0x03,0x22,0x1f,0x07,0x03,0x02,0x04,0x04,0x4c,0x00,0x03,0x01,0x04,0x01,0x03,0x04,0x80,0x00,0x00,0x00,0x01,0x03,0x00,0x01,0x69,0x00,0x04,0x04,0x02,0x5f,0x00,0x02,0x02,0x3d,0x02,0x4e,0x2a,0x28,0x26,0x25,0x21,0x20,0x13,0x11,0x10,0x05,\r\n0x09,0x17,0x2b,0x01,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x23,0x35,0x26,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0xfe,0xd0,0x5a,0x40,0x41,0x02,\r\n0x4e,0xfe,0x61,0x01,0x27,0x13,0x20,0x08,0x09,0x21,0x11,0xfe,0x08,0x4c,0x49,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5f,0x52,0x5a,0x57,0x66,0x5a,0x4e,0x40,0x3e,0x4a,0x31,0x2a,0x6f,0x45,0x4f,0x5e,0x4d,0x03,0x84,0xa4,0x0b,0x23,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,0x01,0x0a,0x2a,0x3f,0x32,0x28,0x39,0x0b,\r\n0x20,0x14,0x71,0x4d,0x52,0x6d,0x0c,0xae,0xad,0x0b,0x6c,0x58,0x3d,0x45,0x47,0x38,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0x00,0x00,0x00,0x01,0xfe,0x07,0xff,0x4c,0x02,0x01,0x03,0x84,0x00,0x36,0x00,0x48,0x40,0x45,0x21,0x1e,0x02,0x04,0x02,0x06,0x01,0x03,0x04,0x0b,0x07,0x05,0x04,0x04,0x01,0x03,0x35,0x01,0x00,0x01,\r\n0x04,0x4c,0x00,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x00,0x02,0x00,0x04,0x03,0x02,0x04,0x69,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x4d,0x06,0x01,0x05,0x05,0x3d,0x05,0x4e,0x00,0x00,0x00,0x36,0x00,0x36,0x22,0x14,0x1d,0x2e,0x11,0x07,0x09,0x1b,0x2b,0x17,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,\r\n0x17,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0xf6,0x6d,0x90,0xfe,0x0e,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0x9b,0x8e,0x65,0x48,0x54,0x31,0x2a,\r\n0x6f,0x45,0x4f,0x5e,0x4d,0x5a,0x47,0x56,0x5a,0x44,0x35,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5e,0x53,0xb4,0xab,0x06,0x3f,0xdc,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0a,0x08,0xb3,0x3e,0x45,0x3a,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0xa2,0xa5,0x0f,0x65,0x48,0x32,0x3f,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x71,\r\n0x4d,0x50,0x6a,0x0f,0xb0,0x00,0x00,0x00,0x00,0x01,0xfb,0xc8,0xff,0x4c,0x01,0xe0,0x03,0x84,0x00,0x40,0x00,0x42,0x40,0x3f,0x21,0x1e,0x02,0x03,0x02,0x2b,0x27,0x25,0x24,0x0b,0x07,0x06,0x05,0x04,0x09,0x01,0x03,0x3f,0x26,0x02,0x00,0x01,0x03,0x4c,0x00,0x02,0x00,0x03,0x01,0x02,0x03,0x69,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,\r\n0x42,0x4d,0x05,0x01,0x04,0x04,0x3d,0x04,0x4e,0x00,0x00,0x00,0x40,0x00,0x40,0x33,0x31,0x1d,0x2e,0x11,0x06,0x09,0x19,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x33,0x32,0x36,0x35,0x34,0x26,0x27,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,\r\n0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0xfe,0xb7,0x6d,0x90,0xfe,0x0e,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0x9b,0x8e,0x65,0x4d,0x4f,0x31,0x2a,0x6f,0x45,0x4f,0x5e,0x4d,0x5a,0x3f,0x42,0x02,0x4e,0xfe,0x61,0x01,0x27,0x13,\r\n0x20,0x08,0x09,0x21,0x11,0xfe,0x08,0x26,0x4c,0x23,0x35,0x42,0x2b,0x27,0x72,0x47,0x53,0x5c,0x55,0xb4,0xab,0x06,0x3f,0xdc,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0a,0x08,0xb3,0x3e,0x47,0x38,0x2d,0x43,0x0c,0x1f,0x14,0x67,0x46,0x4e,0x68,0x0b,0xa2,0xa5,0x0a,0x23,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,\r\n0x01,0x0a,0x14,0x16,0x3f,0x32,0x28,0x39,0x0b,0x20,0x14,0x71,0x4d,0x4f,0x6b,0x0f,0xb0,0x00,0x00,0x00,0x00,0x03,0xfd,0xda,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x32,0x00,0x3b,0x00,0x44,0x00,0x5c,0x40,0x59,0x0e,0x01,0x01,0x05,0x01,0x4c,0x08,0x01,0x05,0x0d,0x0b,0x09,0x03,0x01,0x0a,0x05,0x01,0x67,0x07,0x01,0x04,0x04,0x03,0x5f,\r\n0x06,0x01,0x03,0x03,0x38,0x4d,0x10,0x0c,0x0f,0x03,0x0a,0x0a,0x00,0x5f,0x02,0x0e,0x02,0x00,0x00,0x39,0x00,0x4e,0x3d,0x3c,0x34,0x33,0x01,0x00,0x40,0x3e,0x3c,0x44,0x3d,0x44,0x37,0x35,0x33,0x3b,0x34,0x3b,0x31,0x30,0x2f,0x2d,0x29,0x27,0x26,0x24,0x1f,0x1d,0x19,0x17,0x16,0x14,0x09,0x07,0x06,0x05,0x00,0x32,0x01,0x32,0x11,0x09,\r\n0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,0x11,0x25,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,\r\n0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x12,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xaa,0xaa,0x35,0x3e,0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,0x41,0x34,0x01,0x50,0x74,0xfc,0xcb,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,\r\n0x61,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x50,0xfe,0xac,0x50,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x00,0x00,0x00,0x00,0x04,0xfb,0x82,0x00,0x00,0x02,0x62,0x02,0xda,0x00,0x4a,0x00,0x53,0x00,0x5c,0x00,0x65,0x00,0x76,\r\n0x40,0x73,0x16,0x01,0x01,0x07,0x01,0x4c,0x0d,0x0a,0x02,0x07,0x14,0x12,0x10,0x0e,0x03,0x05,0x01,0x0f,0x07,0x01,0x67,0x0c,0x09,0x02,0x06,0x06,0x05,0x5f,0x0b,0x08,0x02,0x05,0x05,0x38,0x4d,0x18,0x13,0x17,0x11,0x16,0x05,0x0f,0x0f,0x00,0x5f,0x04,0x02,0x15,0x03,0x00,0x00,0x39,0x00,0x4e,0x5e,0x5d,0x55,0x54,0x4c,0x4b,0x01,0x00,\r\n0x61,0x5f,0x5d,0x65,0x5e,0x65,0x58,0x56,0x54,0x5c,0x55,0x5c,0x4f,0x4d,0x4b,0x53,0x4c,0x53,0x49,0x48,0x47,0x45,0x41,0x3f,0x3e,0x3c,0x37,0x35,0x31,0x2f,0x2e,0x2c,0x27,0x25,0x21,0x1f,0x1e,0x1c,0x11,0x0f,0x0e,0x0d,0x09,0x07,0x06,0x05,0x00,0x4a,0x01,0x4a,0x19,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,\r\n0x26,0x35,0x34,0x37,0x23,0x11,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x23,\r\n0x11,0x25,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x21,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x01,0x12,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x40,0xdc,0xdc,0x67,0x79,0x51,0x40,0x39,0x47,0x6f,0x5e,0xaa,0xaa,0x35,0x3e,0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,\r\n0x41,0x34,0x01,0xcd,0x20,0x24,0x6f,0x5e,0xb4,0xb4,0x35,0x3e,0x41,0x34,0x01,0x50,0x74,0xfa,0x73,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x02,0x94,0x83,0x83,0x3c,0x47,0x47,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,0x61,0x54,0x31,0xfe,0xac,0x6e,0x61,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x59,0x63,0x50,0x3b,0x38,\r\n0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x15,0x3e,0x27,0x59,0x63,0x50,0x3b,0x38,0x36,0x3d,0x50,0xfe,0xac,0x50,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x01,0x04,0x44,0x3e,0x3e,0x44,0x00,0x03,0xfd,0xdf,0x00,0x00,0x02,0x08,0x02,0xda,0x00,0x1a,0x00,0x23,0x00,0x27,0x00,0x53,0x40,0x50,\r\n0x06,0x01,0x04,0x03,0x01,0x4c,0x00,0x03,0x06,0x01,0x04,0x07,0x03,0x04,0x67,0x00,0x07,0x0b,0x01,0x08,0x05,0x07,0x08,0x67,0x00,0x02,0x02,0x01,0x5f,0x00,0x01,0x01,0x38,0x4d,0x0a,0x01,0x05,0x05,0x00,0x5f,0x09,0x01,0x00,0x00,0x39,0x00,0x4e,0x24,0x24,0x1c,0x1b,0x01,0x00,0x24,0x27,0x24,0x27,0x26,0x25,0x1f,0x1d,0x1b,0x23,0x1c,\r\n0x23,0x19,0x18,0x17,0x15,0x11,0x0f,0x0e,0x0c,0x00,0x1a,0x01,0x1a,0x0c,0x09,0x16,0x2b,0x21,0x22,0x26,0x35,0x34,0x36,0x37,0x35,0x26,0x26,0x35,0x34,0x36,0x33,0x33,0x15,0x23,0x22,0x06,0x15,0x14,0x16,0x33,0x21,0x15,0x21,0x11,0x27,0x33,0x11,0x23,0x22,0x06,0x15,0x14,0x16,0x25,0x35,0x21,0x15,0xfe,0xbf,0x67,0x79,0x51,0x40,0x39,\r\n0x47,0x6f,0x5e,0xad,0xad,0x35,0x3e,0x3f,0x36,0x03,0x49,0xfd,0x80,0xca,0x70,0x70,0x3c,0x47,0x47,0x01,0xab,0x01,0xdb,0x70,0x5f,0x45,0x61,0x08,0x03,0x0b,0x59,0x3a,0x56,0x66,0x52,0x3d,0x35,0x34,0x3e,0x50,0xfe,0xac,0x52,0x01,0x02,0x46,0x3b,0x3b,0x46,0x12,0x50,0x50,0x00,0x02,0xfd,0xd5,0xff,0x9c,0x02,0x1c,0x02,0xe4,0x00,0x27,\r\n0x00,0x31,0x00,0x7a,0xb5,0x19,0x01,0x07,0x03,0x01,0x4c,0x4b,0xb0,0x21,0x50,0x58,0x40,0x26,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x05,0x08,0x01,0x00,0x05,0x00,0x63,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x4d,0x00,0x07,0x07,0x03,0x61,0x00,0x03,0x03,0x3b,0x07,0x4e,0x1b,0x40,0x24,0x00,0x03,0x00,0x07,0x06,\r\n0x03,0x07,0x69,0x09,0x01,0x06,0x00,0x02,0x05,0x06,0x02,0x69,0x00,0x05,0x08,0x01,0x00,0x05,0x00,0x63,0x00,0x04,0x04,0x01,0x61,0x00,0x01,0x01,0x3e,0x04,0x4e,0x59,0x40,0x1b,0x29,0x28,0x01,0x00,0x2e,0x2c,0x28,0x31,0x29,0x31,0x26,0x24,0x1f,0x1d,0x17,0x15,0x10,0x0e,0x09,0x07,0x00,0x27,0x01,0x27,0x0a,0x09,0x16,0x2b,0x05,0x22,\r\n0x26,0x26,0x35,0x11,0x34,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x21,0x15,0x01,0x32,0x35,0x35,0x34,0x23,0x22,0x15,0x15,0x14,0xfe,0xed,0x55,0x7e,0x45,0x90,0x7e,0x75,0x80,0x56,0x4a,0x49,0x57,0x46,0x40,0x29,\r\n0x36,0x09,0x02,0x56,0x4f,0x5a,0x64,0x6b,0x5d,0x03,0x2f,0xfd,0x1c,0x50,0x50,0x50,0x64,0x47,0x83,0x58,0x01,0x04,0x87,0x9b,0x7d,0x73,0xe2,0x4e,0x5b,0x56,0x49,0x74,0x4a,0x51,0x20,0x1c,0x23,0x4d,0x53,0x74,0x68,0xfe,0xfc,0x64,0x73,0x4b,0x01,0x10,0x5c,0x75,0x5b,0x5c,0x74,0x5c,0x00,0x00,0x00,0x04,0xfd,0xc6,0xff,0xf7,0x02,0x62,\r\n0x02,0xe4,0x00,0x24,0x00,0x45,0x00,0x51,0x00,0x5d,0x00,0xcc,0x40,0x0b,0x55,0x49,0x42,0x21,0x1e,0x1b,0x06,0x0d,0x0e,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x41,0x0a,0x01,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x08,0x01,0x01,0x10,0x01,0x0e,0x0d,0x01,0x0e,0x69,0x0b,0x01,0x04,0x04,0x02,0x61,0x09,0x01,0x02,0x02,0x3e,0x4d,0x00,\r\n0x05,0x05,0x00,0x61,0x0c,0x12,0x07,0x06,0x11,0x05,0x00,0x00,0x3f,0x4d,0x14,0x0f,0x13,0x03,0x0d,0x0d,0x00,0x61,0x0c,0x12,0x07,0x06,0x11,0x05,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x3b,0x0a,0x01,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x08,0x01,0x01,0x10,0x01,0x0e,0x0d,0x01,0x0e,0x69,0x0b,0x01,0x04,0x04,0x02,0x61,0x09,0x01,0x02,\r\n0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,0x0c,0x01,0x06,0x06,0x39,0x4d,0x14,0x0f,0x13,0x03,0x0d,0x0d,0x00,0x61,0x12,0x07,0x11,0x03,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x35,0x53,0x52,0x47,0x46,0x26,0x25,0x01,0x00,0x58,0x56,0x52,0x5d,0x53,0x5d,0x4c,0x4a,0x46,0x51,0x47,0x51,0x41,0x40,0x3b,0x39,0x37,0x36,0x33,0x31,0x2c,0x2b,\r\n0x25,0x45,0x26,0x45,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x15,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x21,0x22,0x26,\r\n0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,0x27,0x07,0x06,0x06,0x25,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xd2,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,\r\n0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,0x61,0x2b,0x22,0x53,0xfd,0x86,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0x02,0x28,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0xfd,0xe3,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,\r\n0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,\r\n0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x00,0x06,0xfb,0x73,0xff,0xf7,0x02,0x5d,0x02,0xe4,0x00,0x24,0x00,0x45,0x00,0x66,0x00,0x72,0x00,0x7e,0x00,0x8a,0x00,0xfd,0x40,0x0d,0x82,0x76,0x6a,0x63,0x42,0x21,0x1e,0x1b,0x08,0x13,0x14,0x01,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x4e,0x10,0x0a,0x02,0x03,0x04,0x01,0x04,0x03,0x01,0x80,\r\n0x0e,0x08,0x02,0x01,0x18,0x16,0x02,0x14,0x13,0x01,0x14,0x69,0x11,0x0b,0x02,0x04,0x04,0x02,0x61,0x0f,0x09,0x02,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x00,0x61,0x12,0x1b,0x0d,0x0c,0x1a,0x07,0x06,0x19,0x08,0x00,0x00,0x3f,0x4d,0x1e,0x17,0x1d,0x15,0x1c,0x05,0x13,0x13,0x00,0x61,0x12,0x1b,0x0d,0x0c,0x1a,0x07,0x06,0x19,0x08,0x00,\r\n0x00,0x3f,0x00,0x4e,0x1b,0x40,0x45,0x10,0x0a,0x02,0x03,0x04,0x01,0x04,0x03,0x01,0x80,0x0e,0x08,0x02,0x01,0x18,0x16,0x02,0x14,0x13,0x01,0x14,0x69,0x11,0x0b,0x02,0x04,0x04,0x02,0x61,0x0f,0x09,0x02,0x02,0x02,0x3e,0x4d,0x00,0x05,0x05,0x06,0x5f,0x12,0x0c,0x02,0x06,0x06,0x39,0x4d,0x1e,0x17,0x1d,0x15,0x1c,0x05,0x13,0x13,0x00,\r\n0x61,0x1b,0x0d,0x1a,0x07,0x19,0x05,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x4d,0x80,0x7f,0x74,0x73,0x68,0x67,0x47,0x46,0x26,0x25,0x01,0x00,0x85,0x83,0x7f,0x8a,0x80,0x8a,0x79,0x77,0x73,0x7e,0x74,0x7e,0x6d,0x6b,0x67,0x72,0x68,0x72,0x62,0x61,0x5c,0x5a,0x58,0x57,0x54,0x52,0x4d,0x4c,0x46,0x66,0x47,0x66,0x41,0x40,0x3b,0x39,0x37,\r\n0x36,0x33,0x31,0x2c,0x2b,0x25,0x45,0x26,0x45,0x20,0x1f,0x1d,0x1c,0x16,0x14,0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x24,0x01,0x24,0x1f,0x09,0x16,0x2b,0x17,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x33,0x07,0x17,0x23,0x27,0x07,\r\n0x06,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,0x27,0x07,0x06,0x06,0x21,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x01,0x23,\r\n0x27,0x07,0x06,0x06,0x25,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x21,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0xcd,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0x5b,0x64,0x8f,0x91,0x63,\r\n0x61,0x2b,0x22,0x53,0xfb,0x38,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0x02,0x22,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0x01,0x84,0x63,0x61,0x2b,0x22,0x53,0xfd,0x8c,0x39,0x28,0x34,0x7d,0x1e,0x2f,\r\n0x37,0x3b,0x02,0x7f,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x02,0x7f,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0x72,0xb0,0xbd,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,\r\n0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfe,0x09,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,\r\n0x00,0x03,0xfd,0xd5,0xff,0xf7,0x02,0x1c,0x02,0xe4,0x00,0x26,0x00,0x32,0x00,0x36,0x00,0xbc,0x40,0x0f,0x1b,0x01,0x0a,0x09,0x2a,0x20,0x02,0x0b,0x0a,0x23,0x01,0x08,0x0b,0x03,0x4c,0x4b,0xb0,0x1a,0x50,0x58,0x40,0x39,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x05,0x00,0x06,0x09,0x05,0x06,0x67,0x00,0x01,0x00,0x09,0x0a,0x01,\r\n0x09,0x69,0x00,0x0a,0x0e,0x01,0x0b,0x08,0x0a,0x0b,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x0d,0x01,0x08,0x08,0x00,0x61,0x07,0x0c,0x02,0x00,0x00,0x3f,0x00,0x4e,0x1b,0x40,0x3d,0x00,0x03,0x04,0x05,0x04,0x03,0x05,0x80,0x00,0x05,0x00,0x06,0x09,0x05,0x06,0x67,0x00,0x01,0x00,0x09,0x0a,0x01,0x09,0x69,0x00,0x0a,\r\n0x0e,0x01,0x0b,0x08,0x0a,0x0b,0x67,0x00,0x04,0x04,0x02,0x61,0x00,0x02,0x02,0x3e,0x4d,0x00,0x07,0x07,0x39,0x4d,0x0d,0x01,0x08,0x08,0x00,0x61,0x0c,0x01,0x00,0x00,0x3f,0x00,0x4e,0x59,0x40,0x27,0x33,0x33,0x28,0x27,0x01,0x00,0x33,0x36,0x33,0x36,0x35,0x34,0x2d,0x2b,0x27,0x32,0x28,0x32,0x22,0x21,0x1f,0x1e,0x1d,0x1c,0x16,0x14,\r\n0x12,0x11,0x0e,0x0c,0x07,0x06,0x00,0x26,0x01,0x26,0x0f,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x35,0x34,0x36,0x37,0x27,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x16,0x15,0x23,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x17,0x17,0x37,0x21,0x15,0x21,0x07,0x17,0x23,0x27,0x07,0x06,0x06,0x27,0x32,0x37,0x37,0x27,0x23,0x22,0x06,0x15,0x15,0x14,\r\n0x16,0x25,0x35,0x21,0x15,0xfe,0x93,0x58,0x66,0x5a,0x4c,0x1c,0x36,0x60,0x4d,0x37,0x53,0x2f,0x58,0x35,0x2c,0x25,0x2f,0x1d,0xc3,0xbf,0x01,0xfb,0xfe,0x2a,0xb4,0x91,0x63,0x61,0x2b,0x22,0x53,0x26,0x39,0x28,0x34,0x7d,0x1e,0x2f,0x37,0x3b,0x01,0xd9,0x01,0xdb,0x09,0x67,0x58,0x39,0x50,0x60,0x04,0x24,0x47,0x37,0x47,0x58,0x30,0x55,\r\n0x39,0x32,0x3f,0x2e,0x26,0x27,0x25,0xfc,0xef,0x50,0xdd,0xbd,0x80,0x36,0x2a,0x29,0x51,0x33,0x42,0xa0,0x3b,0x33,0x39,0x33,0x3b,0x62,0x50,0x50,0x00,0x01,0xfe,0xa7,0xff,0xab,0x01,0xa4,0x02,0xee,0x00,0x07,0x00,0x47,0x4b,0xb0,0x18,0x50,0x58,0x40,0x14,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x03,0x03,0x00,0x5f,0x00,\r\n0x00,0x00,0x38,0x03,0x4e,0x1b,0x40,0x19,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x59,0x40,0x0c,0x00,0x00,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x05,0x09,0x19,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0xfe,0xa7,0x5a,0x02,0xa3,0xfd,0x5d,\r\n0x55,0x03,0x43,0xfe,0x84,0x50,0xfe,0x89,0x00,0x01,0xfb,0xd2,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x12,0x00,0x33,0x40,0x30,0x0a,0x01,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x12,0x00,0x12,\r\n0x23,0x12,0x14,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x11,0x33,0x15,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x15,0xfb,0xd2,0x5a,0x05,0x5b,0x04,0x08,0x05,0xba,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfa,0xa5,0x23,0x02,0x4e,0xff,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0xff,\r\n0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0xbd,0x03,0x3e,0x00,0x24,0x00,0x28,0x00,0x43,0x40,0x40,0x09,0x01,0x04,0x03,0x01,0x4c,0x06,0x01,0x02,0x00,0x01,0x03,0x02,0x01,0x67,0x00,0x03,0x00,0x04,0x00,0x03,0x04,0x67,0x00,0x00,0x05,0x05,0x00,0x57,0x00,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x25,0x25,0x00,0x00,\r\n0x25,0x28,0x25,0x28,0x27,0x26,0x00,0x24,0x00,0x23,0x21,0x25,0x21,0x2c,0x21,0x0a,0x09,0x1b,0x2b,0x07,0x35,0x33,0x32,0x36,0x27,0x27,0x26,0x36,0x37,0x26,0x26,0x37,0x37,0x36,0x26,0x23,0x23,0x35,0x33,0x32,0x16,0x07,0x07,0x06,0x16,0x33,0x33,0x15,0x23,0x22,0x06,0x17,0x17,0x16,0x06,0x23,0x21,0x11,0x33,0x11,0x37,0x73,0x2f,0x32,\r\n0x02,0x0a,0x03,0x36,0x31,0x32,0x35,0x03,0x0a,0x02,0x32,0x2f,0x73,0x73,0x59,0x65,0x05,0x0a,0x03,0x26,0x41,0x6e,0x6e,0x40,0x27,0x03,0x0a,0x05,0x65,0x59,0xfe,0x7f,0x5a,0x6e,0x50,0x2b,0x2b,0xa4,0x39,0x4a,0x09,0x09,0x4a,0x39,0xa4,0x2b,0x2b,0x50,0x57,0x4f,0xa4,0x35,0x2f,0x50,0x2f,0x35,0xa4,0x4f,0x57,0x03,0xac,0xfc,0x54,0x00,\r\n0x00,0x02,0xfe,0xbb,0xff,0x92,0x01,0x45,0x03,0x3e,0x00,0x07,0x00,0x0b,0x00,0x33,0x40,0x30,0x04,0x01,0x02,0x00,0x01,0x00,0x02,0x01,0x67,0x00,0x00,0x03,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,\r\n0x09,0x19,0x2b,0x07,0x35,0x21,0x11,0x21,0x35,0x21,0x11,0x21,0x11,0x33,0x11,0x3c,0x01,0x27,0xfe,0xd9,0x01,0x81,0xfd,0x76,0x5a,0x6e,0x50,0x03,0x0c,0x50,0xfc,0x54,0x03,0xac,0xfc,0x54,0xff,0xff,0xfe,0xe3,0xff,0x92,0x01,0x1d,0x03,0x3e,0x00,0x26,0x05,0xbe,0xc4,0x00,0x00,0x07,0x05,0xbe,0xfd,0xe4,0x00,0x00,0x00,0x02,0xfc,0xa4,\r\n0xff,0xab,0x01,0x72,0x02,0xee,0x00,0x07,0x00,0x0b,0x00,0x56,0x4b,0xb0,0x18,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x07,0x05,0x06,0x03,0x03,0x03,0x00,0x5f,0x04,0x01,0x00,0x00,0x38,0x03,0x4e,0x1b,0x40,0x1d,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x00,0x00,\r\n0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x59,0x40,0x14,0x08,0x08,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x00,0x07,0x00,0x07,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x11,0x21,0x11,0x33,0x11,0xfe,0x52,0x5a,0x02,0xc6,0xfd,0x3a,0xfd,0xf8,0x5a,0x55,0x03,0x43,0xfe,0x84,0x50,0xfe,0x89,\r\n0x03,0x43,0xfc,0xbd,0x00,0x03,0xfc,0xc7,0xff,0x92,0x00,0xe1,0x03,0x3e,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x2d,0x40,0x2a,0x04,0x02,0x02,0x00,0x01,0x00,0x85,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x76,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,\r\n0x06,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x87,0x5a,0xfb,0xe6,0x5a,0x01,0x86,0x5a,0x6e,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x03,0xac,0xfc,0x54,0x00,0x04,0xfa,0xc9,0xff,0xab,0x00,0xd2,0x02,0xee,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x5f,0x40,0x0a,0x16,0x12,0x0e,0x0c,0x0b,0x05,\r\n0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x12,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x19,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,0x4f,0x59,0x40,0x1a,0x08,0x08,0x04,0x04,\r\n0x00,0x00,0x08,0x0d,0x08,0x0d,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfc,0x77,0x5a,0xfd,0xf8,0x5a,0x03,0x02,0x5a,0x02,0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,\r\n0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x02,0xfc,0xa4,0xff,0xab,0x01,0x72,0x02,0xee,0x00,0x0b,0x00,0x0f,0x00,0x68,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1f,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,\r\n0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x09,0x07,0x08,0x03,0x05,0x05,0x00,0x5f,0x06,0x01,0x00,0x00,0x38,0x05,0x4e,0x1b,0x40,0x25,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x59,0x40,\r\n0x16,0x0c,0x0c,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x11,0x33,0x11,0xfe,0x52,0x5a,0x02,0xc6,0xfd,0x3a,0x02,0xc6,0xfd,0x3a,0xfd,0xf8,0x5a,0x55,0x03,0x43,0xfe,0xfc,0x50,0xa0,0x50,0xff,0x03,\r\n0x43,0xfc,0xbd,0x00,0x00,0x03,0xfc,0xd6,0xff,0xab,0x01,0x31,0x02,0xee,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x50,0x40,0x0a,0x12,0x0e,0x0a,0x08,0x07,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x05,0x03,0x04,0x03,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x15,0x02,0x01,0x00,0x01,0x01,\r\n0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x59,0x40,0x12,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x21,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfc,0xd6,0x5a,0x01,0x54,0x5a,0x02,\r\n0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x01,0xfe,0xa7,0xff,0xab,0x01,0xa4,0x02,0xee,0x00,0x0b,0x00,0x59,0x4b,0xb0,0x18,0x50,0x58,0x40,0x1c,0x00,0x01,0x00,0x02,0x03,0x01,0x02,\r\n0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x05,0x05,0x00,0x5f,0x00,0x00,0x00,0x38,0x05,0x4e,0x1b,0x40,0x21,0x00,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x00,0x00,0x00,0x05,0x5f,0x06,0x01,0x05,0x00,0x05,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0b,\r\n0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x05,0x11,0x33,0x11,0x21,0x15,0x21,0x15,0x21,0x15,0x21,0x15,0xfe,0xa7,0x5a,0x02,0xa3,0xfd,0x5d,0x02,0xa3,0xfd,0x5d,0x55,0x03,0x43,0xfe,0xfc,0x50,0xa0,0x50,0xff,0x00,0x00,0x02,0xfb,0xd2,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0c,0x00,0x17,0x00,0x40,0x40,0x3d,0x12,0x07,\r\n0x02,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x17,0x16,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x12,0x11,0x11,0x11,0x09,0x09,0x1b,0x2b,0x25,0x11,0x33,0x15,\r\n0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x15,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0xfb,0xd2,0x5a,0x04,0xfb,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x05,0x05,0x3b,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfa,0xc6,0x23,0x02,0x4e,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,\r\n0x14,0x00,0x00,0x00,0x00,0x02,0xfe,0xbb,0xff,0xab,0x01,0x68,0x02,0xee,0x00,0x05,0x00,0x0e,0x00,0x41,0x40,0x0a,0x0e,0x0a,0x06,0x04,0x03,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,\r\n0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x05,0x00,0x05,0x11,0x03,0x09,0x17,0x2b,0x05,0x11,0x33,0x01,0x15,0x01,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0xfe,0xbb,0x5a,0x02,0x53,0xfd,0xad,0x01,0xbd,0x16,0x27,0x0a,0x0a,0x27,0x16,0xfe,0x43,0x55,0x03,0x43,0xfe,0x8e,0x64,0xfe,0x93,0x68,0x01,0x0e,\r\n0x0e,0x15,0x04,0x05,0x17,0x0d,0x01,0x12,0x00,0x03,0xfe,0x13,0xff,0x74,0x01,0xf9,0x03,0x66,0x00,0x2d,0x00,0x34,0x00,0x3c,0x00,0x36,0x40,0x33,0x3c,0x32,0x31,0x25,0x24,0x1d,0x17,0x16,0x13,0x10,0x09,0x0b,0x00,0x01,0x35,0x2c,0x19,0x18,0x08,0x01,0x06,0x02,0x00,0x02,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x03,\r\n0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x2d,0x00,0x2d,0x1c,0x14,0x04,0x09,0x18,0x2b,0x05,0x35,0x26,0x26,0x27,0x33,0x14,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,\r\n0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0xfe,0xde,0x5e,0x6b,0x02,0x5a,0x3b,0x36,0x1b,0x4b,0x51,0x63,0x54,0x3c,0x44,0x4d,0x02,0x4e,0xfe,0x61,0x01,0x27,0x13,0x20,0x08,0x09,0x21,0x11,0xfe,0x0d,0x26,0x35,0x19,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x2f,0x2c,0x0c,0x8c,0x83,\r\n0x08,0x69,0x56,0x31,0x3e,0x07,0x01,0x06,0x08,0x17,0x6c,0x49,0x50,0x68,0x08,0x84,0x84,0x08,0x28,0xfe,0xca,0x64,0xd7,0x5a,0x97,0x0a,0x0d,0x02,0x02,0x0a,0x09,0x01,0x08,0x14,0x14,0x02,0xf8,0x0d,0x17,0x6e,0x4a,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x42,0x0d,0x04,0x00,0x00,\r\n0x00,0x01,0xfe,0x20,0x00,0x5f,0x01,0xe0,0x02,0x35,0x00,0x13,0x00,0x5a,0x4b,0xb0,0x21,0x50,0x58,0x40,0x1a,0x05,0x03,0x02,0x01,0x08,0x06,0x02,0x00,0x07,0x01,0x00,0x67,0x0a,0x09,0x02,0x07,0x07,0x02,0x5f,0x04,0x01,0x02,0x02,0x3b,0x07,0x4e,0x1b,0x40,0x20,0x04,0x01,0x02,0x01,0x07,0x02,0x57,0x05,0x03,0x02,0x01,0x08,0x06,0x02,\r\n0x00,0x07,0x01,0x00,0x67,0x04,0x01,0x02,0x02,0x07,0x5f,0x0a,0x09,0x02,0x07,0x02,0x07,0x4f,0x59,0x40,0x12,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x15,0xfe,0xdf,0xbf,0xbf,\r\n0x58,0x01,0x92,0x58,0xbf,0xbf,0x58,0xfe,0x6e,0x5f,0xc3,0x50,0xc3,0xc3,0xc3,0xc3,0x50,0xc3,0xc3,0xc3,0x00,0x01,0xfb,0xff,0x00,0x5f,0x01,0xa9,0x02,0x35,0x00,0x1b,0x00,0x6b,0x4b,0xb0,0x21,0x50,0x58,0x40,0x1e,0x07,0x05,0x03,0x03,0x01,0x0c,0x0a,0x08,0x03,0x00,0x09,0x01,0x00,0x67,0x0e,0x0d,0x0b,0x03,0x09,0x09,0x02,0x5f,0x06,\r\n0x04,0x02,0x02,0x02,0x3b,0x09,0x4e,0x1b,0x40,0x25,0x06,0x04,0x02,0x02,0x01,0x09,0x02,0x57,0x07,0x05,0x03,0x03,0x01,0x0c,0x0a,0x08,0x03,0x00,0x09,0x01,0x00,0x67,0x06,0x04,0x02,0x02,0x02,0x09,0x5f,0x0e,0x0d,0x0b,0x03,0x09,0x02,0x09,0x4f,0x59,0x40,0x1a,0x00,0x00,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,0x16,0x15,0x14,0x13,\r\n0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0f,0x09,0x1f,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x21,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x23,0x35,0x21,0x15,0x23,0x35,0x21,0x15,0xfc,0xbe,0xbf,0xbf,0x58,0x01,0x92,0x58,0x01,0x92,0x58,0xbf,0xbf,0x58,0xfe,0x6e,0x58,0xfe,0x6e,0x5f,0xc3,0x50,0xc3,\r\n0xc3,0xc3,0xc3,0xc3,0xc3,0x50,0xc3,0xc3,0xc3,0xc3,0xc3,0x00,0x00,0x02,0xfd,0xda,0x00,0x2d,0x02,0x12,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x3e,0x40,0x3b,0x17,0x16,0x15,0x03,0x01,0x02,0x11,0x01,0x00,0x01,0x18,0x0d,0x0c,0x03,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,\r\n0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0xfe,0xcb,0xf1,0xf1,0x58,0xf1,0xf1,0x01,0x41,0x01,0x36,0x13,0x21,\r\n0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0x2d,0xf5,0x50,0xf5,0xf5,0x50,0xf5,0x14,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x04,0xfe,0x2a,0x00,0x64,0x01,0xae,0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x1b,0x00,0x1f,0x00,0x6f,0x4b,0xb0,0x18,0x50,0x58,0x40,0x22,0x00,0x03,0x00,0x00,0x03,0x57,0x00,0x06,0x04,\r\n0x05,0x06,0x57,0x07,0x01,0x05,0x09,0x01,0x04,0x05,0x04,0x65,0x02,0x08,0x02,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,0x4e,0x1b,0x40,0x24,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x67,0x00,0x07,0x00,0x06,0x04,0x07,0x06,0x67,0x00,0x05,0x09,0x01,0x04,0x05,0x04,0x65,0x08,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,\r\n0x59,0x40,0x1b,0x11,0x10,0x01,0x00,0x1f,0x1e,0x1d,0x1c,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0f,0x0e,0x0d,0x0c,0x07,0x05,0x00,0x0b,0x01,0x0b,0x0a,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x21,0x35,0x21,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x21,0x35,0x21,0x01,\r\n0x5e,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfe,0xce,0xfd,0xda,0x02,0x26,0x01,0x0e,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfe,0xce,0xfd,0xda,0x02,0x26,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0xfe,0x7a,0x2c,0x25,0x24,0x2b,0x2b,0x24,0x25,0x2c,0x46,0x50,0x00,0x00,0x00,0x00,0x06,0xfb,0xa0,0x00,0x64,0x02,0x08,\r\n0x02,0x30,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x1f,0x00,0x23,0x00,0x27,0x00,0x97,0x4b,0xb0,0x18,0x50,0x58,0x40,0x2a,0x04,0x01,0x02,0x00,0x00,0x02,0x57,0x11,0x0b,0x10,0x03,0x09,0x06,0x07,0x09,0x57,0x0a,0x08,0x02,0x07,0x0f,0x01,0x06,0x07,0x06,0x65,0x0e,0x05,0x0d,0x03,0x0c,0x05,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x01,\r\n0x4e,0x1b,0x40,0x2c,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x00,0x02,0x03,0x67,0x0a,0x01,0x08,0x11,0x0b,0x10,0x03,0x09,0x06,0x08,0x09,0x67,0x00,0x07,0x0f,0x01,0x06,0x07,0x06,0x65,0x0c,0x01,0x00,0x00,0x01,0x61,0x00,0x01,0x01,0x41,0x00,0x4e,0x59,0x40,0x33,0x24,0x24,0x20,0x20,0x15,0x14,0x10,0x10,0x0c,0x0c,0x01,0x00,0x24,\r\n0x27,0x24,0x27,0x26,0x25,0x20,0x23,0x20,0x23,0x22,0x21,0x1b,0x19,0x14,0x1f,0x15,0x1f,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x07,0x05,0x00,0x0b,0x01,0x0b,0x12,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x37,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x01,0x22,0x26,0x35,0x34,\r\n0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x25,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0xfe,0xd4,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xef,0x02,0x21,0xf9,0x98,0x02,0x21,0x01,0x13,0x24,0x2c,0x2c,0x24,0x24,0x2c,0x2c,0xfc,0xa8,0x02,0x21,0x02,0x26,0x02,0x21,0x01,0x90,0x2b,0x25,0x24,0x2c,0x2c,0x24,0x25,0x2b,0x0a,0x50,0x50,0x50,0x50,0xfe,\r\n0xca,0x2c,0x24,0x25,0x2b,0x2b,0x25,0x24,0x2c,0x46,0x50,0x50,0x50,0x50,0x00,0x00,0x00,0x06,0xfb,0xa0,0xff,0xfb,0x02,0x08,0x02,0xda,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x21,0x00,0x64,0x40,0x61,0x04,0x01,0x02,0x0e,0x05,0x0d,0x03,0x03,0x06,0x02,0x03,0x67,0x08,0x01,0x06,0x10,0x09,0x0f,0x03,0x07,0x0b,0x06,\r\n0x07,0x67,0x0c,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x0b,0x0b,0x0a,0x61,0x11,0x01,0x0a,0x0a,0x42,0x0a,0x4e,0x15,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x1c,0x19,0x14,0x21,0x15,0x20,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,\r\n0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x37,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfe,0xab,0x0c,0x6a,0x0c,0xea,0x02,0x21,0xf9,0x98,0x02,0x21,0xfd,0xdf,0x02,0x21,0x02,0x26,\r\n0x02,0x21,0xfc,0xbd,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xc3,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0xaf,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0x00,0x00,0x02,0xfd,0xf8,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x2f,0x40,0x2c,0x00,0x00,0x04,0x01,0x01,0x02,\r\n0x00,0x01,0x67,0x00,0x02,0x03,0x03,0x02,0x57,0x00,0x02,0x02,0x03,0x5f,0x05,0x01,0x03,0x02,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xfd,0xf8,0x04,0x10,0xfb,0xf0,0x04,0x10,0x01,0x9a,0x50,0x50,0xf0,0x50,0x50,0x00,0x00,\r\n0x00,0x03,0xfb,0xa5,0x00,0x4c,0x02,0x03,0x02,0x48,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x40,0x40,0x3d,0x00,0x00,0x06,0x01,0x01,0x02,0x00,0x01,0x67,0x00,0x02,0x07,0x01,0x03,0x04,0x02,0x03,0x67,0x00,0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x08,0x01,0x05,0x04,0x05,0x4f,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0b,0x08,\r\n0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0xfb,0xa5,0x06,0x5e,0xf9,0xa2,0x06,0x5e,0xf9,0xa2,0x06,0x5e,0x01,0xfc,0x4c,0x4c,0xd8,0x4c,0x4c,0xd8,0x4c,0x4c,0x00,0x01,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,\r\n0x00,0x6c,0xb6,0x12,0x08,0x02,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,\r\n0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x37,0x21,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,\r\n0x13,0x03,0xbc,0x6b,0xfa,0x7e,0x05,0xc2,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfa,0x3f,0x05,0x82,0x6b,0x6a,0xe7,0xe8,0x23,0x87,0x50,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x01,0xfd,0xfd,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,0x00,0x6c,0xb6,0x12,0x08,0x02,0x01,0x02,\r\n0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x04,0x03,0x03,0x04,0x70,0x06,0x01,0x05,0x00,0x00,0x05,0x71,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x23,0x00,0x04,0x03,0x04,0x85,0x06,0x01,0x05,0x00,0x05,0x86,0x00,0x03,0x00,0x02,\r\n0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x37,0x21,0x35,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0xbc,0x6b,0xfc,0xd6,0x03,0x6a,\r\n0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfc,0x97,0x03,0x2a,0x6b,0x6a,0xe7,0xe8,0x23,0x87,0x50,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x13,0x00,0x1f,0x00,0x47,0x40,0x44,0x1e,0x18,0x12,0x08,0x04,0x01,0x02,0x01,0x4c,0x06,\r\n0x01,0x04,0x03,0x05,0x04,0x57,0x00,0x03,0x00,0x02,0x01,0x03,0x02,0x68,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x4f,0x14,0x14,0x00,0x00,0x14,0x1f,0x14,0x1f,0x1d,0x1c,0x00,0x13,0x00,0x13,0x11,0x11,0x18,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x27,0x37,0x21,0x35,0x21,\r\n0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x35,0x21,0x27,0x33,0x13,0x03,0x33,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x70,0x6b,0xfb,0xaa,0x04,0x96,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfb,0x6b,0x04,0x56,0x6b,0x6a,0xe7,0xe8,0xc3,0xbe,0x13,0x1a,0x05,0x05,0x1c,0x15,0xba,0x6a,0xe7,0xe8,0x23,0x87,0x50,\r\n0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x87,0xfe,0xd9,0xfe,0xd9,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x02,0xfb,0xa5,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0f,0x00,0x17,0x00,0x47,0x40,0x44,0x15,0x11,0x0d,0x05,0x04,0x01,0x02,0x01,0x4c,0x06,0x01,0x04,0x03,0x05,0x04,0x57,0x00,0x03,\r\n0x00,0x02,0x01,0x03,0x02,0x67,0x00,0x01,0x00,0x00,0x05,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x04,0x05,0x4f,0x10,0x10,0x00,0x00,0x10,0x17,0x10,0x17,0x13,0x12,0x00,0x0f,0x00,0x0f,0x11,0x11,0x12,0x11,0x11,0x0a,0x09,0x1b,0x2b,0x37,0x27,0x21,0x35,0x21,0x27,0x37,0x21,0x35,0x21,0x37,0x33,0x07,\r\n0x07,0x17,0x17,0x33,0x03,0x13,0x33,0x07,0x07,0x17,0x17,0x72,0x6a,0xfb,0x9d,0x04,0x25,0x3f,0x3f,0xfb,0xdb,0x04,0x64,0x6a,0x69,0xbe,0x2e,0x32,0xba,0xae,0xe7,0xe8,0x69,0xbe,0x2e,0x32,0xba,0x23,0x87,0x50,0x50,0x50,0x50,0x87,0xef,0x37,0x3d,0xeb,0x01,0x27,0x01,0x27,0xef,0x37,0x3d,0xeb,0x00,0x01,0xfb,0xa1,0x00,0x00,0x02,0x09,\r\n0x02,0x99,0x00,0x13,0x00,0x35,0x40,0x32,0x00,0x04,0x03,0x04,0x85,0x05,0x01,0x03,0x06,0x01,0x02,0x01,0x03,0x02,0x68,0x07,0x01,0x01,0x08,0x01,0x00,0x09,0x01,0x00,0x67,0x0a,0x01,0x09,0x09,0x39,0x09,0x4e,0x00,0x00,0x00,0x13,0x00,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x0b,0x09,0x1f,0x2b,0x21,0x37,0x21,0x35,0x21,\r\n0x37,0x21,0x35,0x21,0x37,0x33,0x07,0x21,0x15,0x21,0x07,0x21,0x15,0x21,0x07,0xfe,0x53,0x3e,0xfd,0x10,0x03,0x0e,0x3a,0xfc,0xb8,0x03,0x66,0x40,0x48,0x40,0x02,0xba,0xfd,0x28,0x3a,0x03,0x12,0xfc,0xd0,0x3e,0xaa,0x50,0xa0,0x50,0xaf,0xaf,0x50,0xa0,0x50,0xaa,0x00,0x00,0x00,0x01,0xfe,0x0c,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0e,\r\n0x00,0x2e,0x40,0x2b,0x04,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x11,0x18,0x05,0x09,0x19,0x2b,0x25,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x17,0x21,0x15,0x21,0x07,0xfe,\r\n0x0c,0xbe,0x13,0x1a,0x05,0x05,0x1c,0x15,0xba,0x6a,0xc8,0x02,0xc5,0xfd,0x3b,0xc9,0x23,0xef,0x17,0x1c,0x04,0x05,0x1f,0x19,0xeb,0xff,0x50,0xff,0x00,0x01,0xfb,0xb3,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x19,0x00,0x34,0x40,0x31,0x11,0x04,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,\r\n0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x19,0x00,0x19,0x23,0x12,0x14,0x11,0x18,0x07,0x09,0x1b,0x2b,0x25,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x33,0x17,0x21,0x26,0x26,0x27,0x27,0x33,0x13,0x03,0x23,0x37,0x36,0x36,0x37,0x21,0x07,0xfb,0xb3,0xbe,0x13,0x1a,0x05,0x05,0x1d,\r\n0x14,0xba,0x6a,0xc8,0x04,0xa1,0x04,0x07,0x05,0xba,0x6a,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0xfb,0x5e,0xc9,0x23,0xef,0x17,0x1c,0x04,0x05,0x1e,0x1a,0xeb,0xff,0x05,0x0a,0x05,0xeb,0xfe,0xd9,0xfe,0xd9,0xef,0x04,0x08,0x04,0xff,0xff,0xff,0xfe,0x61,0xff,0x92,0x01,0x59,0x03,0x3e,0x00,0x27,0x04,0x1b,0xfe,0x0c,0x00,0x0f,0x01,0x06,\r\n0x03,0x48,0xce,0x00,0x00,0x08,0xb1,0x00,0x01,0xb0,0x0f,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfe,0x89,0x00,0x2d,0x01,0x7f,0x02,0x67,0x00,0x27,0x04,0x1b,0xfe,0x34,0x00,0x00,0x03,0x06,0x03,0x2b,0x00,0x37,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0x00,0x02,0xfe,0xcf,0xff,0xb6,0x01,0x31,0x02,0xbc,0x00,0x0d,\r\n0x00,0x11,0x00,0x08,0xb5,0x10,0x0e,0x0b,0x00,0x02,0x32,0x2b,0x25,0x35,0x25,0x36,0x36,0x37,0x35,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x01,0x35,0x25,0x15,0xfe,0xcf,0x01,0xea,0x11,0x1f,0x07,0x07,0x1f,0x11,0xfe,0x16,0x02,0x62,0xfd,0x9e,0x02,0x62,0x96,0x5a,0xa8,0x06,0x06,0x01,0x07,0x01,0x06,0x06,0xab,0x58,0xe1,0x64,0xfe,0x3f,\r\n0x5a,0xe1,0x5a,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x19,0x00,0x42,0x40,0x3f,0x19,0x13,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,\r\n0x00,0x03,0x4f,0x00,0x00,0x18,0x17,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x07,0x37,0x21,0x37,0x36,0x36,0x37,0x26,0x26,0x27,0x27,0x21,0x17,0xfb,0xb3,0xeb,0xeb,0x6a,0x6a,0x04,0xa0,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x5f,\r\n0x6a,0xa9,0x04,0xa2,0x13,0x13,0x1a,0x05,0x05,0x1c,0x15,0x10,0xfb,0x5f,0x3f,0x23,0x01,0x26,0x01,0x28,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x18,0x17,0x1c,0x04,0x05,0x1f,0x19,0x14,0x50,0x00,0x00,0xff,0xff,0xfe,0x2a,0x00,0x40,0x01,0xd7,0x02,0x53,0x00,0x26,0x04,0x1b,0xd4,0x00,0x01,0x07,0x04,0x1b,0xfd,0xd5,0xff,0xff,\r\n0x00,0x09,0xb1,0x01,0x01,0xb8,0xff,0xff,0xb0,0x35,0x2b,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x08,0x00,0x0e,0x00,0x3c,0x40,0x39,0x0d,0x0a,0x01,0x03,0x02,0x01,0x01,0x4c,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x04,0x01,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,\r\n0x00,0x03,0x4f,0x09,0x09,0x00,0x00,0x09,0x0e,0x09,0x0e,0x0c,0x0b,0x00,0x08,0x00,0x08,0x11,0x11,0x12,0x08,0x09,0x19,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x15,0x21,0x07,0x21,0x13,0x03,0x33,0x13,0x03,0xfc,0xdf,0xeb,0xeb,0x6a,0xc8,0x03,0xf2,0xfc,0x0e,0xc9,0xfe,0x6b,0xeb,0xeb,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x01,0x28,0xff,0x50,\r\n0xff,0x01,0x26,0x01,0x28,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x00,0x00,0x02,0xfb,0xb3,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x47,0x40,0x44,0x12,0x0f,0x08,0x01,0x04,0x03,0x02,0x01,0x4c,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x67,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,\r\n0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x0e,0x0e,0x00,0x00,0x0e,0x13,0x0e,0x13,0x11,0x10,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x0a,0x09,0x1b,0x2b,0x25,0x13,0x03,0x33,0x17,0x21,0x15,0x21,0x17,0x07,0x21,0x15,0x21,0x07,0x21,0x13,0x03,0x33,0x13,0x03,0xfc,0xdf,0xeb,0xeb,0x6a,0x6a,0x04,0x50,0xfb,\r\n0xee,0x3f,0x3f,0x04,0x12,0xfb,0xaf,0x6a,0xfe,0x6b,0xeb,0xeb,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x01,0x28,0x87,0x50,0x50,0x50,0x50,0x87,0x01,0x26,0x01,0x28,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0xff,0xff,0xfc,0x6d,0x00,0x41,0x02,0x03,0x02,0x53,0x00,0x27,0x04,0x1b,0xfc,0x18,0x00,0x00,0x00,0x27,0x04,0x1b,0xfe,0x0c,0x00,0x00,0x02,0x06,\r\n0x04,0x1b,0x00,0x00,0x00,0x01,0xfd,0xf3,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0e,0x00,0x30,0x40,0x2d,0x01,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x23,0x12,0x05,0x09,\r\n0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x17,0x17,0xfe,0xda,0xe7,0xe8,0x69,0xbe,0x03,0x07,0x03,0x03,0x7b,0xfc,0x86,0x04,0x08,0x04,0xba,0x23,0x01,0x27,0x01,0x27,0xef,0x04,0x08,0x04,0x50,0x04,0x0b,0x05,0xeb,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0e,0x00,0x30,0x40,0x2d,\r\n0x01,0x01,0x02,0x01,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x04,0x01,0x03,0x02,0x03,0x86,0x00,0x01,0x02,0x02,0x01,0x57,0x00,0x01,0x01,0x02,0x60,0x00,0x02,0x01,0x02,0x50,0x00,0x00,0x00,0x0e,0x00,0x0e,0x11,0x23,0x12,0x05,0x09,0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x06,0x06,0x07,0x21,0x15,0x21,0x16,0x16,0x17,0x17,0xfc,0x82,0xe7,\r\n0xe8,0x69,0xbe,0x03,0x07,0x03,0x05,0xe2,0xfa,0x1a,0x05,0x0a,0x06,0xba,0x23,0x01,0x27,0x01,0x27,0xef,0x04,0x08,0x04,0x4b,0x05,0x0d,0x07,0xeb,0x00,0x01,0xfb,0x9b,0x00,0x23,0x01,0xd6,0x02,0x71,0x00,0x0c,0x00,0x33,0x40,0x30,0x09,0x01,0x02,0x05,0x01,0x4c,0x04,0x01,0x00,0x05,0x01,0x00,0x57,0x06,0x01,0x05,0x00,0x02,0x01,0x05,\r\n0x02,0x68,0x04,0x01,0x00,0x00,0x01,0x5f,0x03,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x0c,0x00,0x0c,0x12,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x01,0x35,0x33,0x11,0x23,0x35,0x21,0x17,0x23,0x03,0x13,0x33,0x07,0x01,0x7c,0x5a,0x5a,0xfa,0xa6,0xca,0x6a,0xe7,0xe8,0x69,0xcb,0x01,0x72,0xff,0xfd,0xb2,0xff,0xff,0x01,0x27,0x01,\r\n0x27,0xff,0x00,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x35,0x40,0x32,0x08,0x01,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x00,0x85,0x06,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x04,0x04,0x01,0x57,0x00,0x01,0x01,0x04,0x60,0x00,0x04,0x01,0x04,0x50,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,\r\n0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0xfc,0x82,0xe7,0xe8,0x69,0xcb,0x05,0x66,0xcb,0x6a,0xe7,0xe8,0x69,0xcb,0xfa,0x9b,0xca,0x23,0x01,0x27,0x01,0x27,0xff,0xff,0xfe,0xd9,0xfe,0xd9,0xff,0xff,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0d,\r\n0x00,0x34,0x40,0x31,0x08,0x01,0x02,0x04,0x01,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x04,0x03,0x01,0x04,0x68,0x02,0x01,0x00,0x00,0x03,0x5f,0x06,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x37,0x33,0x03,0x13,\r\n0x23,0x27,0x21,0x17,0xfc,0x82,0xe7,0xe8,0x69,0xcb,0x04,0xa1,0xc9,0x69,0xe7,0xe7,0x6a,0xc8,0xfb,0x60,0xca,0x23,0x01,0x27,0x01,0x27,0xff,0xff,0xfe,0xda,0xfe,0xd8,0xff,0xff,0x00,0x00,0xff,0xff,0xfe,0x89,0x00,0x2d,0x01,0x7f,0x02,0x67,0x00,0x27,0x04,0x1c,0xfe,0x34,0x00,0x00,0x03,0x06,0x03,0x2b,0x00,0x37,0x00,0x08,0xb1,0x01,\r\n0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0xff,0xff,0xfb,0xcd,0x00,0x2d,0x01,0xa9,0x02,0x67,0x00,0x27,0x04,0x1c,0xfb,0x78,0x00,0x00,0x00,0x27,0x03,0x2b,0xfd,0xa8,0x00,0x37,0x01,0x06,0x04,0x1c,0xa6,0x00,0x00,0x08,0xb1,0x01,0x02,0xb0,0x37,0xb0,0x35,0x2b,0x00,0x00,0x00,0x04,0xf9,0x43,0xff,0xfb,0x02,0x03,0x02,0xda,0x00,0x03,\r\n0x00,0x10,0x00,0x14,0x00,0x22,0x00,0x62,0x40,0x5f,0x05,0x01,0x04,0x03,0x01,0x4c,0x00,0x02,0x00,0x03,0x00,0x02,0x03,0x80,0x0b,0x01,0x05,0x09,0x08,0x09,0x05,0x08,0x80,0x06,0x01,0x03,0x0c,0x07,0x02,0x04,0x01,0x03,0x04,0x68,0x0a,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x4d,0x00,0x09,0x09,0x08,0x61,0x0d,0x01,0x08,0x08,\r\n0x42,0x08,0x4e,0x16,0x15,0x11,0x11,0x04,0x04,0x00,0x00,0x1d,0x1a,0x15,0x22,0x16,0x21,0x11,0x14,0x11,0x14,0x13,0x12,0x04,0x10,0x04,0x10,0x0d,0x0c,0x0b,0x0a,0x07,0x06,0x00,0x03,0x00,0x03,0x11,0x0e,0x09,0x17,0x2b,0x25,0x03,0x33,0x03,0x05,0x03,0x13,0x33,0x07,0x06,0x07,0x21,0x15,0x21,0x16,0x17,0x17,0x25,0x35,0x21,0x15,0x01,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0xfc,0x53,0x0c,0x6a,0x0c,0xfd,0x85,0xe7,0xe8,0x69,0xbe,0x07,0x06,0x01,0xeb,0xfe,0x16,0x08,0x08,0xba,0x02,0xb0,0x04,0xbf,0xfa,0x6a,0x1a,0x22,0x22,0x1a,0x1e,0x1d,0x1f,0x22,0x1a,0xd7,0x02,0x03,0xfd,0xfd,0xb4,0x01,0x27,0x01,0x27,0xef,0x08,0x08,0x50,0x0a,0x0a,\r\n0xeb,0xff,0x50,0x50,0xfe,0xd9,0x22,0x1a,0x1a,0x22,0x21,0x1a,0x1a,0x23,0x00,0x00,0xff,0xff,0xfd,0xee,0x00,0x41,0x02,0x20,0x02,0x6c,0x00,0x27,0x04,0x1c,0xfd,0x99,0x00,0x00,0x00,0x06,0x03,0x34,0xec,0x00,0xff,0xff,0xfb,0xb4,0x00,0x41,0x01,0xf4,0x02,0x6c,0x00,0x27,0x04,0x1c,0xfb,0x5f,0x00,0x00,0x00,0x26,0x04,0x1b,0xf1,0x00,\r\n0x00,0x07,0x03,0x34,0xfd,0xa8,0x00,0x00,0x00,0x02,0xfe,0x98,0xff,0xab,0x01,0x45,0x02,0xee,0x00,0x05,0x00,0x0e,0x00,0x41,0x40,0x0a,0x0b,0x07,0x06,0x02,0x01,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0c,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x11,0x00,0x00,0x01,0x01,0x00,0x57,\r\n0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x59,0x40,0x0a,0x00,0x00,0x00,0x05,0x00,0x05,0x13,0x03,0x09,0x17,0x2b,0x17,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,0x17,0xeb,0xfd,0xad,0x02,0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,\r\n0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x03,0xfc,0x77,0xff,0xab,0x00,0xd2,0x02,0xee,0x00,0x03,0x00,0x09,0x00,0x12,0x00,0x50,0x40,0x0a,0x0f,0x0b,0x0a,0x06,0x05,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x0f,0x05,0x03,0x04,0x03,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x00,0x38,0x01,0x4e,\r\n0x1b,0x40,0x15,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x59,0x40,0x12,0x04,0x04,0x00,0x00,0x04,0x09,0x04,0x09,0x08,0x07,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,\r\n0x17,0x78,0x5a,0xfd,0xf8,0xfd,0xad,0x02,0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x03,0x43,0xfc,0xbd,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x04,0xfa,0x7e,0xff,0xab,0x00,0x87,0x02,0xee,0x00,0x03,0x00,0x07,0x00,0x0d,0x00,0x16,0x00,0x5f,\r\n0x40,0x0a,0x13,0x0f,0x0e,0x0a,0x09,0x05,0x01,0x00,0x01,0x4c,0x4b,0xb0,0x18,0x50,0x58,0x40,0x12,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x01,0x00,0x5f,0x04,0x02,0x02,0x00,0x00,0x38,0x01,0x4e,0x1b,0x40,0x19,0x04,0x02,0x02,0x00,0x01,0x01,0x00,0x57,0x04,0x02,0x02,0x00,0x00,0x01,0x5f,0x08,0x05,0x07,0x03,0x06,0x05,0x01,0x00,0x01,\r\n0x4f,0x59,0x40,0x1a,0x08,0x08,0x04,0x04,0x00,0x00,0x08,0x0d,0x08,0x0d,0x0c,0x0b,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x09,0x09,0x17,0x2b,0x17,0x11,0x33,0x11,0x21,0x11,0x33,0x11,0x21,0x01,0x35,0x01,0x33,0x11,0x27,0x11,0x01,0x06,0x06,0x07,0x16,0x16,0x17,0x2d,0x5a,0xfd,0xf8,0x5a,0xfd,0xf8,0xfd,0xad,0x02,\r\n0x53,0x5a,0x5a,0xfe,0x43,0x16,0x27,0x0a,0x0a,0x27,0x16,0x55,0x03,0x43,0xfc,0xbd,0x03,0x43,0xfc,0xbd,0x01,0x6d,0x64,0x01,0x72,0xfc,0xbd,0x68,0x02,0x70,0xfe,0xee,0x0d,0x17,0x05,0x04,0x15,0x0e,0x00,0x00,0x00,0x03,0xfb,0xe6,0xff,0x92,0x01,0xc2,0x03,0x0c,0x00,0x03,0x00,0x10,0x00,0x1d,0x00,0x2a,0x40,0x27,0x1d,0x19,0x15,0x14,\r\n0x13,0x12,0x11,0x10,0x0f,0x0e,0x0d,0x09,0x05,0x04,0x0e,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x11,0x33,0x11,0x37,0x35,0x01,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x35,0x01,0x15,0x01,0x01,0x35,0x01,0x15,0x01,0x06,0x06,0x07,0x16,0x16,\r\n0x17,0x01,0xfe,0xa7,0x5a,0x6e,0x01,0xbd,0x14,0x27,0x0a,0x0a,0x27,0x14,0xfe,0x43,0x02,0x53,0xfc,0x77,0xfd,0xad,0x02,0x53,0xfe,0x43,0x13,0x26,0x0b,0x0b,0x26,0x13,0x01,0xbd,0x6e,0x03,0x7a,0xfc,0x86,0x18,0x6b,0x01,0x10,0x0c,0x15,0x04,0x05,0x16,0x0c,0x01,0x16,0x67,0xfe,0x8e,0x64,0xfe,0x91,0x01,0x6f,0x64,0x01,0x72,0x6b,0xfe,\r\n0xeb,0x0c,0x16,0x05,0x05,0x15,0x0b,0xfe,0xee,0x00,0x00,0x00,0x00,0x03,0xfe,0x07,0xff,0x74,0x02,0x01,0x03,0x66,0x00,0x2d,0x00,0x34,0x00,0x3c,0x00,0x49,0x40,0x46,0x32,0x24,0x1d,0x1a,0x06,0x05,0x03,0x02,0x3c,0x31,0x25,0x13,0x0b,0x07,0x05,0x04,0x08,0x01,0x03,0x2c,0x01,0x04,0x00,0x03,0x4c,0x35,0x01,0x01,0x01,0x4b,0x00,0x02,\r\n0x03,0x02,0x85,0x00,0x03,0x01,0x03,0x85,0x05,0x01,0x04,0x00,0x04,0x86,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x00,0x4e,0x00,0x00,0x00,0x2d,0x00,0x2d,0x14,0x19,0x1f,0x11,0x06,0x09,0x1a,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x16,0x17,0x11,0x27,0x26,0x26,0x35,0x34,\r\n0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x23,0x34,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0x01,0x04,0x79,0x69,0xfd,0xe5,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x21,0x12,0x01,0xc5,0x2c,0x5d,0x37,0x1b,0x4a,0x52,0x63,0x54,0x3c,0x53,\r\n0x64,0x01,0x5a,0x31,0x2d,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x30,0x2b,0x0c,0x8c,0x83,0x04,0x2f,0xee,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,0x0c,0x08,0xc4,0x13,0x15,0x02,0x01,0x07,0x08,0x17,0x6b,0x4a,0x50,0x68,0x08,0x84,0x83,0x08,0x68,0x52,0x2f,0x3b,0x07,0xf8,0x0d,0x17,0x6d,0x4b,0x52,0x6c,\r\n0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x42,0x0d,0x04,0x00,0x00,0x03,0xfb,0xbe,0xff,0x74,0x01,0xea,0x03,0x66,0x00,0x37,0x00,0x3e,0x00,0x46,0x00,0x48,0x40,0x45,0x46,0x3c,0x3b,0x2f,0x2e,0x28,0x24,0x22,0x21,0x1d,0x1a,0x13,0x0b,0x07,0x06,0x05,0x04,0x11,0x01,0x02,0x23,0x01,0x00,0x01,\r\n0x36,0x01,0x03,0x00,0x03,0x4c,0x3f,0x01,0x01,0x01,0x4b,0x00,0x02,0x01,0x02,0x85,0x04,0x01,0x03,0x00,0x03,0x86,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x00,0x42,0x00,0x4e,0x00,0x00,0x00,0x37,0x00,0x37,0x19,0x1f,0x11,0x05,0x09,0x19,0x2b,0x05,0x35,0x26,0x27,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x16,0x16,\r\n0x17,0x11,0x27,0x26,0x26,0x35,0x34,0x36,0x37,0x35,0x33,0x15,0x16,0x16,0x17,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x01,0x26,0x27,0x15,0x17,0x16,0x16,0x15,0x14,0x06,0x07,0x15,0x03,0x14,0x16,0x17,0x35,0x06,0x06,0x13,0x36,0x36,0x35,0x34,0x26,0x27,0x27,0xfe,0xbb,0x79,0x69,0xfd,0xe5,0x01,0xae,0xfe,0xca,0x13,\r\n0x21,0x08,0x09,0x21,0x12,0x01,0xc5,0x2c,0x5d,0x37,0x1b,0x4a,0x52,0x63,0x54,0x3c,0x23,0x50,0x25,0x02,0x5b,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfd,0xf8,0x3f,0x34,0x28,0x49,0x50,0x69,0x58,0x99,0x30,0x2d,0x2c,0x31,0x99,0x31,0x36,0x30,0x2b,0x0c,0x8c,0x83,0x04,0x2f,0xee,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x03,\r\n0x0c,0x08,0xc4,0x13,0x15,0x02,0x01,0x07,0x08,0x16,0x6c,0x4a,0x50,0x67,0x08,0x85,0x85,0x04,0x19,0x13,0xfe,0xcb,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x01,0x0a,0x20,0x08,0xf8,0x0d,0x17,0x6d,0x4b,0x52,0x6c,0x09,0x83,0x02,0xb6,0x2d,0x42,0x0e,0xe5,0x07,0x36,0xfd,0xf3,0x08,0x3c,0x30,0x2c,0x41,0x0e,0x04,0x00,0x00,\r\n0x00,0x04,0xf9,0x43,0x00,0x00,0x02,0x03,0x02,0xda,0x00,0x1b,0x00,0x24,0x00,0x28,0x00,0x2c,0x00,0x7d,0x40,0x7a,0x1d,0x01,0x10,0x0f,0x01,0x4c,0x00,0x0e,0x04,0x03,0x04,0x0e,0x03,0x80,0x17,0x01,0x11,0x00,0x0b,0x00,0x11,0x0b,0x80,0x07,0x05,0x02,0x03,0x13,0x08,0x02,0x02,0x0f,0x03,0x02,0x68,0x14,0x01,0x0f,0x18,0x15,0x02,0x10,\r\n0x01,0x0f,0x10,0x68,0x12,0x09,0x02,0x01,0x0c,0x0a,0x02,0x00,0x11,0x01,0x00,0x67,0x06,0x01,0x04,0x04,0x38,0x4d,0x16,0x0d,0x02,0x0b,0x0b,0x39,0x0b,0x4e,0x29,0x29,0x1c,0x1c,0x00,0x00,0x29,0x2c,0x29,0x2c,0x2b,0x2a,0x28,0x27,0x26,0x25,0x1c,0x24,0x1c,0x24,0x23,0x22,0x21,0x20,0x1f,0x1e,0x00,0x1b,0x00,0x1b,0x1a,0x19,0x18,0x17,\r\n0x16,0x15,0x14,0x13,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x11,0x19,0x09,0x1f,0x2b,0x21,0x37,0x23,0x35,0x33,0x37,0x23,0x35,0x33,0x37,0x33,0x07,0x33,0x37,0x33,0x07,0x33,0x15,0x23,0x07,0x33,0x15,0x23,0x07,0x23,0x37,0x23,0x07,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x17,0x25,0x33,0x37,0x23,0x05,0x35,0x21,0x15,0xfb,0xa3,\r\n0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0x46,0x27,0x57,0x62,0x22,0x61,0x6c,0x27,0x46,0x27,0xa0,0x27,0xfe,0x41,0xe7,0xe8,0x69,0xcb,0x01,0x69,0xfe,0x98,0xca,0x01,0x87,0xa0,0x22,0xa0,0x01,0x93,0x04,0x33,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0xd2,0x41,0xb4,0x41,0xd2,0xd2,0xd2,0x23,0x01,0x27,0x01,0x27,0xff,0x50,\r\n0xff,0xf0,0xb4,0xa5,0x50,0x50,0x00,0x00,0x00,0x02,0xfd,0xee,0x00,0x2d,0x02,0x26,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x3e,0x40,0x3b,0x10,0x0f,0x0e,0x03,0x01,0x02,0x14,0x01,0x00,0x01,0x18,0x0d,0x0c,0x03,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,\r\n0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x37,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0xdd,0xf1,0xf1,0x58,0xf1,0xf1,0xfe,0x67,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,\r\n0x09,0x22,0x11,0x01,0x36,0x2d,0xf5,0x50,0xf5,0xf5,0x50,0xf5,0x14,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x00,0x00,0x00,0x00,0x03,0xfb,0xb4,0x00,0x2d,0x01,0xf4,0x02,0x67,0x00,0x0b,0x00,0x18,0x00,0x25,0x00,0x45,0x40,0x42,0x24,0x23,0x22,0x10,0x0f,0x0e,0x06,0x01,0x02,0x1e,0x14,0x02,0x00,0x01,0x25,0x1a,\r\n0x19,0x18,0x0d,0x0c,0x06,0x05,0x00,0x03,0x4c,0x00,0x02,0x01,0x05,0x02,0x57,0x03,0x01,0x01,0x04,0x01,0x00,0x05,0x01,0x00,0x67,0x00,0x02,0x02,0x05,0x5f,0x06,0x01,0x05,0x02,0x05,0x4f,0x00,0x00,0x00,0x0b,0x00,0x0b,0x11,0x11,0x11,0x11,0x11,0x07,0x09,0x1b,0x2b,0x25,0x35,0x23,0x35,0x33,0x35,0x33,0x15,0x33,0x15,0x23,0x15,0x25,\r\n0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0xfe,0xa8,0xf1,0xf1,0x58,0xf1,0xf1,0xfe,0x62,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0x02,0xe4,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,0x01,0xae,0x2d,0xf5,\r\n0x50,0xf5,0xf5,0x50,0xf5,0x14,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0x57,0x98,0x09,0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x00,0x00,0x02,0xfe,0xcf,0xff,0xb6,0x01,0x31,0x02,0xbc,0x00,0x0d,0x00,0x11,0x00,0x08,0xb5,0x10,0x0e,0x03,0x00,0x02,0x32,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,\r\n0x07,0x15,0x32,0x16,0x17,0x05,0x11,0x25,0x35,0x05,0x01,0x31,0xfd,0x9e,0x02,0x62,0xfe,0x16,0x11,0x1e,0x08,0x08,0x1e,0x11,0x01,0xea,0xfd,0x9e,0x02,0x62,0x96,0xe1,0x64,0xe1,0x5a,0xa8,0x06,0x06,0x01,0x07,0x06,0x06,0xab,0xfe,0xc7,0xe2,0x58,0xe2,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xd6,0x02,0x71,0x00,0x0c,0x00,0x11,0x00,0x40,\r\n0x40,0x3d,0x11,0x01,0x02,0x06,0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x10,0x0f,0x0e,0x0d,0x00,0x0c,0x00,0x0c,0x11,0x11,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,\r\n0x25,0x03,0x13,0x33,0x07,0x21,0x35,0x33,0x11,0x23,0x35,0x21,0x17,0x27,0x21,0x35,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,0x6b,0x04,0xfb,0x5a,0x5a,0xfb,0x05,0x6b,0xaa,0x05,0x3a,0xfa,0xc5,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfd,0xb2,0x87,0x87,0xd7,0xa0,0x4f,0x00,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x0d,\r\n0x00,0x6c,0xb6,0x08,0x01,0x02,0x03,0x02,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x25,0x00,0x00,0x01,0x01,0x00,0x70,0x06,0x01,0x05,0x04,0x04,0x05,0x71,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x1b,0x40,0x23,0x00,0x00,0x01,0x00,0x85,0x06,0x01,\r\n0x05,0x04,0x05,0x86,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x04,0x04,0x03,0x57,0x00,0x03,0x03,0x04,0x5f,0x00,0x04,0x03,0x04,0x4f,0x59,0x40,0x0e,0x00,0x00,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x07,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x17,0xfc,0x82,0xe7,0xe8,\r\n0x69,0x6b,0x05,0x82,0xfa,0x3e,0x3d,0x3e,0x05,0xc1,0xfa,0x7e,0x6b,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x4f,0x51,0x50,0x87,0x00,0x02,0xf9,0x43,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,\r\n0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,\r\n0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0xfa,0x2a,0xe7,0xe8,0x69,0x6b,0x06,0xfe,0x6b,0x6a,0xe7,0xe8,0x69,\r\n0x6b,0xf9,0x02,0x6b,0xaa,0x07,0x7d,0x41,0x42,0xf8,0x83,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x4f,0x51,0x4f,0x00,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x77,0x40,0x09,0x13,0x10,0x08,0x01,0x04,0x06,0x07,0x01,0x4c,0x4b,0xb0,0x0a,0x50,0x58,\r\n0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x70,0x08,0x05,0x02,0x03,0x04,0x04,0x03,0x71,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x1b,0x40,0x25,0x02,0x01,0x00,0x01,0x00,0x85,0x08,0x05,0x02,0x03,0x04,0x03,0x86,0x00,0x01,0x00,0x07,0x06,0x01,0x07,\r\n0x68,0x00,0x06,0x04,0x04,0x06,0x57,0x00,0x06,0x06,0x04,0x5f,0x00,0x04,0x06,0x04,0x4f,0x59,0x40,0x12,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x27,0x33,0x13,0x03,0x23,0x37,0x21,0x17,0x27,0x21,0x37,0x27,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,\r\n0x6b,0x04,0xa6,0x6b,0x6a,0xe7,0xe8,0x69,0x6b,0xfb,0x5a,0x6b,0xaa,0x05,0x25,0x41,0x42,0xfa,0xdb,0x3e,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xd9,0xfe,0xd9,0x87,0x87,0xd7,0x4f,0x51,0x4f,0x00,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xf4,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x42,0x40,0x3f,0x13,0x10,0x08,0x01,0x04,0x06,\r\n0x07,0x01,0x4c,0x02,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x07,0x06,0x01,0x07,0x68,0x00,0x06,0x00,0x04,0x03,0x06,0x04,0x67,0x02,0x01,0x00,0x00,0x03,0x5f,0x08,0x05,0x02,0x03,0x00,0x03,0x4f,0x00,0x00,0x12,0x11,0x0f,0x0e,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x09,0x09,0x1b,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,\r\n0x37,0x33,0x03,0x13,0x23,0x27,0x21,0x17,0x27,0x21,0x27,0x37,0x21,0x07,0xfc,0x82,0xe7,0xe8,0x69,0x6b,0x04,0xa0,0x6a,0x69,0xe8,0xe8,0x6a,0x6a,0xfb,0x61,0x6b,0xaa,0x04,0xa0,0x3f,0x3f,0xfb,0x5f,0x3d,0x23,0x01,0x27,0x01,0x27,0x87,0x87,0xfe,0xda,0xfe,0xd8,0x87,0x87,0xd7,0x50,0x50,0x4f,0x00,0x02,0xfe,0x34,0x00,0x28,0x01,0xcc,\r\n0x02,0x6c,0x00,0x05,0x00,0x13,0x00,0x08,0xb5,0x0e,0x06,0x03,0x00,0x02,0x32,0x2b,0x35,0x25,0x35,0x25,0x05,0x15,0x05,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x05,0x06,0x07,0x16,0x17,0xfe,0x34,0x01,0xcc,0x01,0xcc,0xfe,0x38,0x01,0x4e,0x14,0x17,0x04,0x04,0x18,0x11,0xfe,0xab,0xfe,0xb7,0x25,0x0c,0x0c,0x25,0x28,0xf0,0x64,0xf0,\r\n0xf0,0x64,0x91,0xaa,0x0a,0x0c,0x02,0x02,0x0a,0x09,0xb0,0xac,0x13,0x03,0x03,0x13,0xff,0xff,0xfe,0x47,0x00,0x41,0x01,0xd6,0x02,0x53,0x00,0x27,0x04,0x1c,0xfd,0xf2,0x00,0x00,0x00,0x06,0x04,0x1c,0xd3,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x03,0x02,0x71,0x00,0x08,0x00,0x0e,0x00,0x3c,0x40,0x39,0x0d,0x0a,0x01,0x03,0x02,0x01,\r\n0x01,0x4c,0x04,0x01,0x00,0x01,0x03,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x04,0x01,0x00,0x00,0x03,0x5f,0x07,0x05,0x06,0x03,0x03,0x00,0x03,0x4f,0x09,0x09,0x00,0x00,0x09,0x0e,0x09,0x0e,0x0c,0x0b,0x00,0x08,0x00,0x08,0x11,0x11,0x12,0x08,0x09,0x19,0x2b,0x25,0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x13,0x21,0x03,0x13,\r\n0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0xcb,0x04,0xb6,0xfb,0x46,0xcf,0xfe,0x6a,0xe7,0xe8,0x69,0xea,0xea,0x23,0x01,0x27,0x01,0x27,0xff,0x4b,0xfe,0xfc,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x01,0xdb,0x02,0x71,0x00,0x0d,0x00,0x13,0x00,0x47,0x40,0x44,0x12,0x0f,0x08,0x01,0x04,0x03,\r\n0x02,0x01,0x4c,0x06,0x01,0x00,0x01,0x05,0x00,0x57,0x00,0x01,0x00,0x02,0x03,0x01,0x02,0x68,0x00,0x03,0x00,0x04,0x05,0x03,0x04,0x67,0x06,0x01,0x00,0x00,0x05,0x5f,0x09,0x07,0x08,0x03,0x05,0x00,0x05,0x4f,0x0e,0x0e,0x00,0x00,0x0e,0x13,0x0e,0x13,0x11,0x10,0x00,0x0d,0x00,0x0d,0x11,0x12,0x11,0x11,0x12,0x0a,0x09,0x1b,0x2b,0x25,\r\n0x03,0x13,0x33,0x07,0x21,0x15,0x21,0x07,0x17,0x21,0x15,0x21,0x17,0x21,0x03,0x13,0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0x6b,0x04,0x2e,0xfb,0x92,0x3f,0x40,0x04,0x6d,0xfb,0xd2,0x6b,0xfe,0x6a,0xe7,0xe8,0x69,0xe9,0xe9,0x23,0x01,0x27,0x01,0x27,0x87,0x50,0x4f,0x51,0x50,0x87,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x00,\r\n0xff,0xff,0xfb,0xf5,0x00,0x41,0x01,0xbd,0x02,0x53,0x00,0x27,0x04,0x1c,0xfb,0xa0,0x00,0x00,0x00,0x27,0x04,0x1c,0xfd,0xad,0x00,0x00,0x00,0x06,0x04,0x1c,0xba,0x00,0x00,0x02,0xfb,0x9b,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x4c,0x00,0x52,0x00,0xa6,0x40,0x09,0x51,0x4e,0x4b,0x01,0x04,0x02,0x09,0x01,0x4c,0x4b,0xb0,0x0d,0x50,0x58,\r\n0x40,0x34,0x00,0x07,0x01,0x09,0x02,0x07,0x72,0x0f,0x01,0x00,0x01,0x0e,0x00,0x57,0x05,0x03,0x02,0x01,0x0d,0x0b,0x02,0x09,0x02,0x01,0x09,0x6a,0x06,0x04,0x02,0x02,0x0c,0x0a,0x02,0x08,0x0e,0x02,0x08,0x6a,0x0f,0x01,0x00,0x00,0x0e,0x5f,0x12,0x10,0x11,0x03,0x0e,0x00,0x0e,0x4f,0x1b,0x40,0x35,0x00,0x07,0x01,0x09,0x01,0x07,0x09,\r\n0x80,0x0f,0x01,0x00,0x01,0x0e,0x00,0x57,0x05,0x03,0x02,0x01,0x0d,0x0b,0x02,0x09,0x02,0x01,0x09,0x6a,0x06,0x04,0x02,0x02,0x0c,0x0a,0x02,0x08,0x0e,0x02,0x08,0x6a,0x0f,0x01,0x00,0x00,0x0e,0x5f,0x12,0x10,0x11,0x03,0x0e,0x00,0x0e,0x4f,0x59,0x40,0x24,0x4d,0x4d,0x00,0x00,0x4d,0x52,0x4d,0x52,0x50,0x4f,0x00,0x4c,0x00,0x4c,0x4a,\r\n0x48,0x44,0x42,0x3e,0x3c,0x38,0x36,0x32,0x30,0x23,0x12,0x24,0x24,0x24,0x24,0x24,0x21,0x12,0x13,0x09,0x1f,0x2b,0x25,0x03,0x13,0x33,0x07,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,\r\n0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x23,0x07,0x13,0x21,0x03,0x13,0x33,0x03,0x13,0xfd,0xae,0xe7,0xe8,0x69,0x98,0x1e,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,\r\n0x21,0x1b,0x1e,0x15,0x15,0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x26,0x31,0x22,0x1c,0x1e,0x15,0x5a,0x16,0xea,0xfe,0x6a,0xe7,0xe8,0x69,0xe9,0xe9,0x23,0x01,0x27,0x01,0x27,0xbf,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,\r\n0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1c,0xfe,0xd8,0x01,0x27,0x01,0x27,0xfe,0xda,0xfe,0xd8,0x00,0x01,0xfd,0xf3,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x3d,0x00,0xa0,0x40,0x0b,0x3c,0x01,0x07,0x03,0x01,0x4c,0x01,0x01,0x01,0x01,0x4b,0x4b,\r\n0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x00,0x02,0x00,0x85,0x00,0x06,0x02,0x08,0x03,0x06,0x72,0x00,0x01,0x08,0x03,0x08,0x01,0x03,0x80,0x0c,0x01,0x0b,0x07,0x0b,0x86,0x04,0x01,0x02,0x0a,0x01,0x08,0x01,0x02,0x08,0x6a,0x05,0x01,0x03,0x07,0x07,0x03,0x59,0x05,0x01,0x03,0x03,0x07,0x62,0x09,0x01,0x07,0x03,0x07,0x52,0x1b,0x40,0x38,\r\n0x00,0x00,0x02,0x00,0x85,0x00,0x06,0x02,0x08,0x02,0x06,0x08,0x80,0x00,0x01,0x08,0x03,0x08,0x01,0x03,0x80,0x0c,0x01,0x0b,0x07,0x0b,0x86,0x04,0x01,0x02,0x0a,0x01,0x08,0x01,0x02,0x08,0x6a,0x05,0x01,0x03,0x07,0x07,0x03,0x59,0x05,0x01,0x03,0x03,0x07,0x62,0x09,0x01,0x07,0x03,0x07,0x52,0x59,0x40,0x16,0x00,0x00,0x00,0x3d,0x00,\r\n0x3d,0x38,0x36,0x32,0x30,0x24,0x23,0x12,0x24,0x24,0x24,0x24,0x21,0x12,0x0d,0x09,0x1f,0x2b,0x25,0x03,0x13,0x33,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x02,0x07,\r\n0x17,0xfe,0xda,0xe7,0xe8,0x69,0xeb,0x0d,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x17,0x22,0x20,0x29,0x1e,0xb6,0x23,0x01,0x27,0x01,\r\n0x27,0xfe,0xd9,0x15,0x1f,0x1f,0x15,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x38,0x28,0x28,0x3a,0x49,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x17,0x21,0x1f,0x07,0xe6,0x00,0x00,0x00,0x00,0x03,0xfb,0xb4,0x00,0x41,0x01,0xf4,0x02,0x53,0x00,0x0c,0x00,0x19,0x00,0x4d,0x00,0xa4,0x40,0x1f,\r\n0x18,0x02,0x02,0x01,0x07,0x12,0x08,0x02,0x04,0x01,0x19,0x01,0x02,0x02,0x04,0x03,0x4c,0x17,0x16,0x04,0x03,0x04,0x03,0x4a,0x0e,0x0d,0x0c,0x00,0x04,0x00,0x49,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x2c,0x00,0x07,0x03,0x01,0x04,0x07,0x72,0x00,0x02,0x04,0x00,0x01,0x02,0x72,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,\r\n0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x2e,0x00,0x07,0x03,0x01,0x03,0x07,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,\r\n0x04,0x00,0x52,0x59,0x40,0x1b,0x1b,0x1a,0x49,0x47,0x43,0x41,0x3e,0x3d,0x3b,0x39,0x35,0x33,0x2f,0x2d,0x29,0x27,0x24,0x23,0x21,0x1f,0x1a,0x4d,0x1b,0x4d,0x0b,0x09,0x16,0x2b,0x25,0x25,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x35,0x05,0x15,0x05,0x22,0x2e,0x03,\r\n0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0xfd,0x62,0xfe,0x52,0x01,0xae,0xfe,0xca,0x13,0x21,0x08,0x09,0x22,0x11,0x01,0x36,0x02,0xe4,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0xca,\r\n0x01,0xae,0xfc,0x81,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x48,0x3a,0x25,0x31,0x22,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x32,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x31,0x41,0xd7,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0x99,0x5a,0x57,0x98,0x09,\r\n0x0d,0x02,0x02,0x0e,0x08,0x99,0x5a,0xd7,0x64,0x33,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x01,0xfb,0x9b,0x00,0x23,0x02,0x12,0x02,0x71,0x00,0x66,0x00,0xb3,0x40,0x0b,0x12,0x01,0x0a,0x04,\r\n0x0f,0x06,0x02,0x03,0x0c,0x02,0x4c,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x02,0x04,0x02,0x85,0x00,0x0a,0x04,0x0c,0x03,0x0a,0x72,0x00,0x01,0x00,0x01,0x86,0x08,0x06,0x02,0x04,0x10,0x0e,0x02,0x0c,0x03,0x04,0x0c,0x69,0x09,0x07,0x05,0x03,0x03,0x00,0x00,0x03,0x59,0x09,0x07,0x05,0x03,0x03,0x03,0x00,0x62,0x0f,0x0d,0x0b,0x11,\r\n0x04,0x00,0x03,0x00,0x52,0x1b,0x40,0x38,0x00,0x02,0x04,0x02,0x85,0x00,0x0a,0x04,0x0c,0x04,0x0a,0x0c,0x80,0x00,0x01,0x00,0x01,0x86,0x08,0x06,0x02,0x04,0x10,0x0e,0x02,0x0c,0x03,0x04,0x0c,0x69,0x09,0x07,0x05,0x03,0x03,0x00,0x00,0x03,0x59,0x09,0x07,0x05,0x03,0x03,0x03,0x00,0x62,0x0f,0x0d,0x0b,0x11,0x04,0x00,0x03,0x00,0x52,\r\n0x59,0x40,0x29,0x01,0x00,0x62,0x60,0x5c,0x5a,0x56,0x54,0x50,0x4e,0x4a,0x48,0x44,0x42,0x3f,0x3e,0x3c,0x3a,0x36,0x34,0x30,0x2e,0x2a,0x28,0x24,0x22,0x1e,0x1c,0x18,0x16,0x11,0x10,0x0e,0x0d,0x00,0x66,0x01,0x66,0x12,0x09,0x16,0x2b,0x25,0x22,0x2e,0x03,0x27,0x06,0x06,0x07,0x16,0x16,0x17,0x17,0x23,0x03,0x13,0x33,0x07,0x1e,0x03,\r\n0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0xfc,0xd6,0x24,0x30,0x22,0x1b,0x1b,0x13,\r\n0x09,0x0c,0x02,0x04,0x19,0x15,0xba,0x6a,0xe7,0xe8,0x69,0xa2,0x1a,0x23,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x32,0x25,0x25,0x34,0x24,0x1d,0x1f,0x14,0x15,0x1f,0x1d,0x24,0x33,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,0x15,\r\n0x1f,0x1e,0x24,0x33,0x26,0x25,0x33,0x24,0x1d,0x1f,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,0x31,0xe5,0x18,0x24,0x26,0x1c,0x03,0x0b,0x0d,0x03,0x04,0x1f,0x1a,0xeb,0x01,0x27,0x01,0x27,0xcc,0x0c,0x27,0x27,0x1b,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,\r\n0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x00,0x01,0xfe,0x2a,0xff,0x92,0x01,0xea,0x03,0x3e,0x00,0x10,0x00,0x23,0x40,0x20,0x0d,0x09,0x05,0x04,0x03,0x02,0x01,0x07,\r\n0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x10,0x00,0x10,0x1e,0x03,0x09,0x17,0x2b,0x17,0x37,0x01,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x33,0x01,0x28,0x2b,0xfd,0xd7,0x01,0xae,0xfe,0xca,0x11,0x1c,0x07,0x07,0x1c,0x11,0x01,0xcd,0x01,0x1c,0x5f,0xfe,0x9d,0x6e,\r\n0x71,0x01,0x15,0x64,0xd7,0x5a,0x97,0x09,0x0c,0x02,0x02,0x0c,0x09,0xe6,0x02,0xf0,0xfc,0x54,0x00,0x00,0x00,0x01,0xfb,0xf5,0xff,0x92,0x01,0xb3,0x03,0x3e,0x00,0x1d,0x00,0x2a,0x40,0x27,0x1c,0x18,0x14,0x13,0x12,0x11,0x10,0x0d,0x09,0x05,0x04,0x03,0x02,0x01,0x0e,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,\r\n0x76,0x00,0x00,0x00,0x1d,0x00,0x1d,0x1e,0x03,0x09,0x17,0x2b,0x05,0x37,0x01,0x35,0x25,0x15,0x05,0x06,0x06,0x07,0x16,0x16,0x17,0x05,0x01,0x33,0x07,0x01,0x15,0x05,0x35,0x25,0x36,0x36,0x37,0x26,0x26,0x27,0x25,0x01,0xfd,0xf3,0x2b,0xfd,0xd7,0x01,0xae,0xfe,0xca,0x11,0x1c,0x07,0x07,0x1c,0x11,0x01,0xcd,0x01,0x1c,0x5f,0x3d,0x02,\r\n0x3b,0xfe,0x52,0x01,0x36,0x13,0x21,0x08,0x09,0x22,0x11,0xfe,0x20,0xfe,0xf7,0x6e,0x71,0x01,0x15,0x64,0xd7,0x5a,0x97,0x09,0x0c,0x02,0x02,0x0c,0x09,0xe6,0x02,0xf0,0xa3,0xfe,0xe1,0x64,0xd7,0x57,0x98,0x09,0x0d,0x02,0x02,0x0d,0x09,0xf0,0xfd,0x42,0x00,0x01,0xfe,0x11,0x00,0xdc,0x01,0xf4,0x01,0xb8,0x00,0x1e,0x00,0x6e,0x4b,0xb0,\r\n0x11,0x50,0x58,0x40,0x22,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x06,0x00,0x04,0x59,0x00,0x05,0x00,0x06,0x00,0x05,0x06,0x67,0x00,0x04,0x04,0x00,0x61,0x02,0x07,0x02,0x00,0x04,0x00,0x51,0x1b,0x40,0x29,0x00,0x02,0x06,0x00,0x06,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x06,0x00,0x04,0x59,\r\n0x00,0x05,0x00,0x06,0x02,0x05,0x06,0x67,0x00,0x04,0x04,0x00,0x61,0x07,0x01,0x00,0x04,0x00,0x51,0x59,0x40,0x15,0x01,0x00,0x1c,0x1b,0x1a,0x18,0x16,0x14,0x10,0x0e,0x0b,0x0a,0x07,0x05,0x00,0x1e,0x01,0x1e,0x08,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x36,\r\n0x35,0x35,0x21,0x15,0x21,0x06,0x06,0x64,0x29,0x38,0x29,0x24,0x27,0x1b,0x1f,0x27,0x55,0x55,0x46,0x2a,0x39,0x29,0x23,0x27,0x1a,0x20,0x26,0x02,0x12,0xfe,0x2f,0x13,0x46,0xdc,0x1d,0x2b,0x2c,0x1d,0x26,0x20,0x3c,0x3c,0x41,0x50,0x1d,0x2b,0x2c,0x1d,0x28,0x1e,0x05,0x50,0x21,0x25,0x00,0x00,0x00,0x02,0xfd,0xee,0xff,0x4c,0x02,0x30,\r\n0x02,0xe4,0x00,0x44,0x00,0x52,0x00,0xcb,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x0b,0x2e,0x19,0x02,0x0c,0x03,0x42,0x01,0x00,0x04,0x02,0x4c,0x1b,0x40,0x0b,0x2e,0x19,0x02,0x0c,0x03,0x42,0x01,0x02,0x04,0x02,0x4c,0x59,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x38,0x00,0x07,0x00,0x0c,0x01,0x07,0x0c,0x69,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,\r\n0x00,0x04,0x02,0x0d,0x02,0x00,0x0b,0x04,0x00,0x69,0x0e,0x01,0x0b,0x00,0x06,0x09,0x0b,0x06,0x69,0x00,0x08,0x08,0x05,0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x09,0x09,0x0a,0x5f,0x00,0x0a,0x0a,0x3d,0x0a,0x4e,0x1b,0x40,0x3f,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x07,0x00,0x0c,0x01,0x07,0x0c,0x69,0x00,0x03,0x00,0x01,0x04,\r\n0x03,0x01,0x69,0x00,0x04,0x0d,0x01,0x00,0x0b,0x04,0x00,0x69,0x0e,0x01,0x0b,0x00,0x06,0x09,0x0b,0x06,0x69,0x00,0x08,0x08,0x05,0x61,0x00,0x05,0x05,0x3e,0x4d,0x00,0x09,0x09,0x0a,0x5f,0x00,0x0a,0x0a,0x3d,0x0a,0x4e,0x59,0x40,0x25,0x46,0x45,0x01,0x00,0x4d,0x4b,0x45,0x52,0x46,0x52,0x3e,0x3c,0x3b,0x39,0x34,0x32,0x2c,0x2a,0x25,\r\n0x23,0x1e,0x1c,0x17,0x15,0x11,0x0f,0x0b,0x0a,0x07,0x05,0x00,0x44,0x01,0x44,0x0f,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x36,0x33,0x32,0x1e,0x03,0x33,0x32,0x36,0x37,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x22,0x26,0x35,0x35,0x34,0x36,0x33,0x32,0x16,0x17,0x33,0x35,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0x11,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x26,0x35,0x35,0x06,0x06,0x05,0x32,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x15,0x14,0x16,0x62,0x31,0x45,0x32,0x29,0x2a,0x1a,0x1e,0x28,0x55,0x28,0x46,0x2b,0x2c,0x3c,0x2e,0x2a,0x33,0x24,0x39,0x4c,0x0a,0x90,0x7e,0x72,0x83,0x56,0x4a,0x49,0x57,\r\n0x46,0x40,0x29,0x36,0x09,0x02,0x55,0x50,0x5a,0x64,0x6b,0x5d,0x6e,0x6e,0x55,0x7e,0x45,0x19,0x49,0x01,0xc5,0x26,0x2a,0x2a,0x26,0x26,0x2a,0x2a,0xfa,0x1a,0x27,0x27,0x1a,0x25,0x1c,0x3c,0x3c,0x28,0x3f,0x25,0x1a,0x27,0x27,0x1a,0x3e,0x33,0x0c,0x87,0x9b,0x83,0x72,0xfe,0xf1,0x4e,0x5b,0x58,0x47,0x74,0x4a,0x51,0x20,0x1c,0x46,0x55,\r\n0x5a,0x74,0x68,0xfe,0xac,0x64,0x73,0x4b,0x47,0x83,0x58,0xcf,0x20,0x23,0x80,0x31,0x2b,0x75,0x2c,0x2f,0x30,0x2c,0x74,0x2b,0x31,0x00,0x00,0x00,0x00,0x01,0xfd,0xee,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x3d,0x00,0xa0,0x40,0x0b,0x01,0x01,0x01,0x05,0x01,0x4c,0x3c,0x01,0x09,0x01,0x4b,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x37,0x00,0x0a,\r\n0x06,0x0a,0x85,0x00,0x04,0x06,0x00,0x05,0x04,0x72,0x00,0x09,0x00,0x05,0x00,0x09,0x05,0x80,0x0c,0x01,0x0b,0x01,0x0b,0x86,0x08,0x01,0x06,0x02,0x01,0x00,0x09,0x06,0x00,0x6a,0x07,0x01,0x05,0x01,0x01,0x05,0x59,0x07,0x01,0x05,0x05,0x01,0x62,0x03,0x01,0x01,0x05,0x01,0x52,0x1b,0x40,0x38,0x00,0x0a,0x06,0x0a,0x85,0x00,0x04,0x06,\r\n0x00,0x06,0x04,0x00,0x80,0x00,0x09,0x00,0x05,0x00,0x09,0x05,0x80,0x0c,0x01,0x0b,0x01,0x0b,0x86,0x08,0x01,0x06,0x02,0x01,0x00,0x09,0x06,0x00,0x6a,0x07,0x01,0x05,0x01,0x01,0x05,0x59,0x07,0x01,0x05,0x05,0x01,0x62,0x03,0x01,0x01,0x05,0x01,0x52,0x59,0x40,0x16,0x00,0x00,0x00,0x3d,0x00,0x3d,0x3b,0x3a,0x39,0x37,0x24,0x24,0x24,\r\n0x22,0x13,0x24,0x24,0x24,0x25,0x0d,0x09,0x1f,0x2b,0x37,0x37,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x33,0x03,0x33,0x13,0x03,0xbc,0xb6,0x1e,0x29,0x20,0x22,0x17,0x15,\r\n0x1f,0x1d,0x24,0x32,0x26,0x25,0x34,0x24,0x1e,0x1f,0x15,0x15,0x1e,0x1b,0x21,0x31,0x26,0x3a,0x48,0x55,0x2f,0x14,0x1e,0x1b,0x22,0x32,0x25,0x25,0x33,0x24,0x1d,0x1f,0x15,0x14,0x1f,0x1d,0x24,0x34,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x10,0xee,0x6a,0xe7,0xe8,0x23,0xe5,0x08,0x1e,0x22,0x17,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,\r\n0x1a,0x27,0x27,0x1a,0x48,0x3a,0x28,0x28,0x37,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x15,0x1f,0x1f,0x15,0x01,0x27,0xfe,0xd9,0xfe,0xd9,0x00,0x00,0x01,0xfe,0x57,0x00,0xe6,0x01,0xae,0x01,0xb3,0x00,0x33,0x00,0x83,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x2c,0x00,0x07,0x03,0x01,0x04,0x07,0x72,0x00,0x02,0x04,0x00,\r\n0x01,0x02,0x72,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x2e,0x00,0x07,0x03,0x01,0x03,0x07,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x05,0x01,0x03,0x09,0x01,0x01,0x04,0x03,0x01,0x69,0x06,0x01,\r\n0x04,0x02,0x00,0x04,0x59,0x06,0x01,0x04,0x04,0x00,0x62,0x08,0x0a,0x02,0x00,0x04,0x00,0x52,0x59,0x40,0x1b,0x01,0x00,0x2f,0x2d,0x29,0x27,0x24,0x23,0x21,0x1f,0x1b,0x19,0x15,0x13,0x0f,0x0d,0x0a,0x09,0x07,0x05,0x00,0x33,0x01,0x33,0x0b,0x09,0x16,0x2b,0x27,0x22,0x2e,0x03,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,\r\n0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x5f,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x48,0x3a,0x25,0x31,0x22,0x1b,0x1e,0x15,0x15,0x1d,0x1b,0x21,0x32,0x25,0x25,0x32,0x22,0x1b,0x1e,0x14,0x2f,0x55,0x47,0x3b,0x25,0x32,0x21,0x1b,0x1e,0x15,\r\n0x15,0x1d,0x1b,0x21,0x31,0xe6,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3b,0x47,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x37,0x28,0x28,0x3a,0x48,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x00,0x01,0xfb,0x96,0x00,0x23,0x02,0x0d,0x02,0x71,0x00,0x61,0x00,0xf7,0x40,0x0b,0x5d,0x01,0x08,0x0a,0x60,0x01,0x02,0x09,\r\n0x00,0x02,0x4c,0x4b,0xb0,0x0d,0x50,0x58,0x40,0x38,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x00,0x09,0x08,0x72,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x03,0x00,0x09,0x0a,0x00,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,0x03,0x03,0x01,0x09,\r\n0x01,0x52,0x1b,0x4b,0xb0,0x17,0x50,0x58,0x40,0x39,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x00,0x0a,0x08,0x00,0x80,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x03,0x00,0x09,0x0a,0x00,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,0x03,0x03,0x01,\r\n0x09,0x01,0x52,0x1b,0x40,0x40,0x00,0x10,0x0a,0x10,0x85,0x00,0x08,0x0a,0x02,0x0a,0x08,0x02,0x80,0x00,0x00,0x02,0x09,0x02,0x00,0x09,0x80,0x12,0x01,0x11,0x01,0x11,0x86,0x0e,0x0c,0x02,0x0a,0x06,0x04,0x02,0x02,0x00,0x0a,0x02,0x69,0x0f,0x0d,0x0b,0x03,0x09,0x01,0x01,0x09,0x59,0x0f,0x0d,0x0b,0x03,0x09,0x09,0x01,0x62,0x07,0x05,\r\n0x03,0x03,0x01,0x09,0x01,0x52,0x59,0x59,0x40,0x22,0x00,0x00,0x00,0x61,0x00,0x61,0x5f,0x5e,0x59,0x57,0x53,0x51,0x4d,0x4b,0x47,0x45,0x41,0x3f,0x3b,0x39,0x35,0x33,0x13,0x24,0x24,0x24,0x24,0x24,0x24,0x24,0x12,0x13,0x09,0x1f,0x2b,0x37,0x13,0x27,0x0e,0x04,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,\r\n0x0e,0x03,0x23,0x22,0x2e,0x03,0x23,0x22,0x0e,0x03,0x23,0x22,0x26,0x35,0x35,0x33,0x15,0x14,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x03,0x33,0x32,0x1e,0x03,0x33,0x32,0x3e,0x02,0x37,0x27,0x33,0x13,0x03,0xbc,0xee,0x12,0x14,0x1e,0x1b,0x22,0x32,0x25,0x25,0x32,0x22,0x1c,\r\n0x1e,0x15,0x15,0x1e,0x1c,0x22,0x31,0x26,0x25,0x32,0x22,0x1c,0x1e,0x15,0x15,0x1f,0x1d,0x24,0x32,0x26,0x25,0x34,0x24,0x1e,0x1f,0x15,0x15,0x1e,0x1b,0x21,0x31,0x26,0x3a,0x48,0x55,0x2f,0x14,0x1e,0x1b,0x22,0x32,0x25,0x26,0x32,0x24,0x1d,0x1f,0x15,0x14,0x1f,0x1d,0x24,0x34,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x15,0x1e,0x1c,0x22,\r\n0x32,0x25,0x26,0x31,0x22,0x1c,0x1e,0x15,0x16,0x1e,0x1d,0x24,0x1c,0xa7,0x6a,0xe7,0xe8,0x23,0x01,0x26,0x14,0x01,0x18,0x24,0x23,0x18,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x48,0x3a,0x28,0x28,0x37,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,\r\n0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x27,0x27,0x1a,0x1a,0x25,0x25,0x0a,0xd3,0xfe,0xd9,0xfe,0xd9,0x00,0x02,0xfe,0x39,0x00,0xaa,0x01,0x9f,0x02,0xf8,0x00,0x0e,0x00,0x12,0x00,0x3d,0x40,0x3a,0x0a,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x06,0x03,0x02,0x02,0x04,0x01,0x02,0x67,0x00,\r\n0x04,0x05,0x05,0x04,0x57,0x00,0x04,0x04,0x05,0x5f,0x07,0x01,0x05,0x04,0x05,0x4f,0x0f,0x0f,0x00,0x00,0x0f,0x12,0x0f,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x11,0x11,0x11,0x08,0x09,0x19,0x2b,0x01,0x13,0x33,0x13,0x21,0x15,0x21,0x27,0x26,0x26,0x27,0x06,0x06,0x07,0x07,0x05,0x35,0x21,0x15,0xfe,0x39,0xc8,0x54,0x9b,0x01,0xaf,0xfe,\r\n0x1b,0x77,0x0a,0x0b,0x02,0x02,0x0d,0x0b,0x7c,0x01,0x24,0x01,0xe5,0x01,0x9a,0x01,0x5e,0xfe,0xf2,0x50,0xe1,0x14,0x1e,0x07,0x07,0x1e,0x14,0xe1,0xf0,0x50,0x50,0x00,0x00,0x04,0xfd,0xf8,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x46,0x40,0x43,0x02,0x01,0x00,0x09,0x03,0x08,0x03,0x01,0x04,0x00,\r\n0x01,0x67,0x06,0x01,0x04,0x05,0x05,0x04,0x57,0x06,0x01,0x04,0x04,0x05,0x5f,0x0b,0x07,0x0a,0x03,0x05,0x04,0x05,0x4f,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x0c,0x0f,0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x0c,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0x33,0x35,\r\n0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0xfd,0xf8,0x01,0xcc,0x78,0x01,0xcc,0xfb,0xf0,0x01,0xcc,0x78,0x01,0xcc,0x01,0x9a,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0x00,0x00,0x06,0xfb,0xa0,0x00,0xaa,0x02,0x08,0x01,0xea,0x00,0x03,0x00,0x07,0x00,0x0b,0x00,0x0f,0x00,0x13,0x00,0x17,0x00,0x5d,0x40,0x5a,0x04,0x02,\r\n0x02,0x00,0x0e,0x05,0x0d,0x03,0x0c,0x05,0x01,0x06,0x00,0x01,0x67,0x0a,0x08,0x02,0x06,0x07,0x07,0x06,0x57,0x0a,0x08,0x02,0x06,0x06,0x07,0x5f,0x11,0x0b,0x10,0x09,0x0f,0x05,0x07,0x06,0x07,0x4f,0x14,0x14,0x10,0x10,0x0c,0x0c,0x08,0x08,0x04,0x04,0x00,0x00,0x14,0x17,0x14,0x17,0x16,0x15,0x10,0x13,0x10,0x13,0x12,0x11,0x0c,0x0f,\r\n0x0c,0x0f,0x0e,0x0d,0x08,0x0b,0x08,0x0b,0x0a,0x09,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x12,0x09,0x17,0x2b,0x13,0x35,0x21,0x15,0x21,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x05,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x33,0x35,0x21,0x15,0x3c,0x01,0xcc,0xf9,0x98,0x01,0xcc,0x8c,0x01,0xcc,0xfb,0xdc,0x01,0xcc,0x8c,\r\n0x01,0xcc,0x78,0x01,0xcc,0x01,0x9a,0x50,0x50,0x50,0x50,0x50,0x50,0xf0,0x50,0x50,0x50,0x50,0x50,0x50,0x00,0x02,0x00,0x8c,0xff,0xf6,0x01,0xcc,0x02,0xda,0x00,0x0e,0x00,0x1a,0x00,0x24,0x40,0x21,0x0f,0x03,0x00,0x03,0x02,0x49,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x02,0x02,0x01,0x59,0x00,0x01,0x01,0x02,0x61,0x00,0x02,0x01,0x02,\r\n0x51,0x2e,0x24,0x11,0x03,0x06,0x19,0x2b,0x17,0x11,0x33,0x11,0x33,0x36,0x36,0x33,0x32,0x16,0x15,0x15,0x14,0x06,0x07,0x27,0x37,0x36,0x36,0x35,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x8c,0x5a,0x01,0x06,0x36,0x29,0x3a,0x46,0x4f,0x46,0x51,0x35,0x29,0x2e,0x25,0x21,0x21,0x25,0x0a,0x02,0xe4,0xfe,0xc0,0x27,0x2f,0x54,0x47,0x55,0x43,\r\n0x6c,0x1a,0x3a,0x14,0x10,0x40,0x2b,0x55,0x23,0x26,0x26,0x23,0x00,0x02,0x00,0x41,0x00,0x00,0x02,0x17,0x02,0xda,0x00,0x1b,0x00,0x1f,0x00,0x40,0x40,0x3d,0x0e,0x01,0x00,0x01,0x1f,0x1e,0x1d,0x1c,0x1b,0x18,0x17,0x14,0x13,0x12,0x11,0x10,0x0f,0x0d,0x0a,0x09,0x06,0x05,0x04,0x03,0x02,0x01,0x16,0x02,0x00,0x00,0x01,0x03,0x02,0x03,\r\n0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x03,0x02,0x85,0x00,0x03,0x03,0x76,0x13,0x19,0x13,0x17,0x04,0x06,0x1a,0x2b,0x37,0x35,0x37,0x35,0x07,0x35,0x37,0x35,0x33,0x15,0x37,0x35,0x33,0x15,0x37,0x15,0x07,0x15,0x37,0x15,0x07,0x15,0x23,0x35,0x07,0x15,0x23,0x35,0x13,0x15,0x37,0x35,0x41,0x69,0x69,0x69,\r\n0x3c,0x8c,0x3c,0x69,0x69,0x69,0x69,0x3c,0x8c,0x3c,0x3c,0x8c,0x50,0x41,0x37,0xc1,0x37,0x41,0x37,0xb6,0x96,0x49,0xa7,0x87,0x37,0x41,0x37,0xc1,0x37,0x41,0x37,0xb6,0x96,0x49,0xa7,0x87,0x01,0x22,0xc1,0x49,0xc1,0x00,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0x9a,0x01,0x77,0x02,0xd1,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x00,\r\n0x01,0x86,0x00,0x00,0x00,0x28,0x00,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x08,0x17,0x2b,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0x9a,0x01,0x37,0xfe,0xc9,0x00,0x00,0x00,0xff,0xff,0x00,0xd2,0xff,0x60,0x01,0x75,0x00,0x92,0x02,0x06,0x03,0x2a,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0xd1,0x01,0x77,0x03,0x08,0x00,0x03,\r\n0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0xd1,0x01,0x37,0xfe,0xc9,0x00,0x00,0x02,0x00,0x37,0x01,0x99,0x02,0x1c,0x02,0xd0,0x00,0x03,0x00,0x07,0x00,0x2a,\r\n0xb1,0x06,0x64,0x44,0x40,0x1f,0x02,0x01,0x00,0x01,0x00,0x85,0x05,0x03,0x04,0x03,0x01,0x01,0x76,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x13,0x33,0x03,0x21,0x13,0x33,0x03,0x01,0x4a,0x50,0x82,0x82,0xfe,0x9d,0x50,0x82,0x82,0x01,0x99,0x01,0x37,\r\n0xfe,0xc9,0x01,0x37,0xfe,0xc9,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x9e,0x01,0xcc,0x02,0xe9,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xa5,0x01,0x9a,0x01,0x77,0x02,0xd1,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,\r\n0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x13,0x33,0x03,0xa5,0x50,0x82,0x82,0x01,0x9a,0x01,0x37,0xfe,0xc9,0x00,0x00,0x02,0xfe,0x25,0x02,0x89,0xff,0x83,0x03,0x09,0x00,0x0b,0x00,0x17,0x00,0x33,0xb1,0x06,0x64,0x44,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,\r\n0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,\r\n0x1d,0x23,0x23,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0x02,0x89,0xff,0x1b,0x03,0x09,0x00,0x0b,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,\r\n0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x02,0x89,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x01,0xfe,0x4a,0x02,0x85,0xff,0x1c,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,\r\n0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x27,0x33,0x17,0xfe,0xbd,0x73,0x64,0x6e,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x90,0x02,0x85,0xff,0x5b,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,\r\n0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0xfe,0x90,0x6a,0x61,0x6f,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x02,0xfe,0x3b,0x02,0x85,0xff,0xb8,0x03,0x11,0x00,0x03,0x00,0x07,0x00,0x32,0xb1,0x06,0x64,0x44,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,\r\n0x57,0x02,0x01,0x00,0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0xfe,0xee,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x02,0x85,0x8c,0x8c,0x8c,0x8c,0x00,0x00,\r\n0x00,0x01,0xff,0x60,0x02,0x26,0xff,0xc3,0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0xa0,0x0f,0x54,0x18,0x02,0x26,0xb4,0xb4,0x00,0x00,0x01,0xfe,0x1f,0x02,0x85,0xff,0x89,0x03,0x11,0x00,0x06,\r\n0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x05,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x17,0x23,0x27,0x07,0xfe,0x1f,0x8b,0x53,0x8c,0x63,0x52,0x50,0x02,0x85,0x8c,0x8c,0x4e,0x4e,0x00,0x00,\r\n0x00,0x01,0xfe,0x1f,0x02,0x85,0xff,0x89,0x03,0x11,0x00,0x06,0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x03,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x12,0x11,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x27,0x33,0x17,0x37,0x33,0x07,0xfe,0xab,0x8c,0x63,\r\n0x52,0x50,0x65,0x8b,0x02,0x85,0x8c,0x4e,0x4e,0x8c,0x00,0x00,0x00,0x01,0xfe,0x34,0x02,0x80,0xff,0x74,0x03,0x11,0x00,0x0d,0x00,0x31,0xb1,0x06,0x64,0x44,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,\r\n0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x02,0x80,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x5c,0x02,0x60,0xff,0x4c,0x03,0x44,0x00,0x0b,0x00,0x17,0x00,0x39,\r\n0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x01,0x22,0x26,0x35,0x34,0x36,0x33,\r\n0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,0x21,0x21,0x1b,0x1b,0x21,0x21,0x02,0x60,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0x02,0x8a,0xff,0x74,\r\n0x03,0x0c,0x00,0x19,0x00,0x6d,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,\r\n0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,\r\n0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0xe6,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0x02,0x8a,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x34,0x02,0x9e,0xff,0x74,0x02,0xe9,0x00,0x03,0x00,0x26,0xb1,0x06,\r\n0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,0x02,0x9e,0x4b,0x4b,0x00,0x01,0xfe,0x7a,0x02,0x85,0xff,0x38,0x03,0x39,0x00,0x0e,0x00,0x4e,0xb1,0x06,\r\n0x64,0x44,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x0e,\r\n0x00,0x0e,0x21,0x24,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0xfe,0xaa,0x32,0x0e,0x20,0x50,0x69,0x26,0x2f,0x11,0x28,0x02,0x85,0x3f,0x13,0x0d,0x14,0x41,0x27,0x23,0x20,0x16,0x34,0x00,0x00,0x00,0x02,0xfd,0xf0,0x02,0x85,0xff,0x6d,0x03,0x11,0x00,0x03,\r\n0x00,0x07,0x00,0x25,0xb1,0x06,0x64,0x44,0x40,0x1a,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x09,0x1a,0x2b,0xb1,0x06,0x00,0x44,0x01,0x23,0x27,0x33,0x05,0x23,0x27,0x33,0xfe,0xba,0x57,0x73,0x5c,0x01,0x21,0x57,0x73,0x5c,0x02,0x85,0x8c,0x8c,0x8c,\r\n0x00,0x01,0xfe,0x7a,0x02,0x85,0xff,0x47,0x03,0x70,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x02,0x01,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x03,0x07,0x23,0x37,0xb9,0x50,0x7d,0x82,0x03,0x70,0xeb,0xeb,0x00,0x00,0x00,0x00,0x01,0xff,0x18,\r\n0x01,0xe5,0xff,0xa0,0x02,0x94,0x00,0x0a,0x00,0x4e,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x00,0x01,0x00,0x00,0x01,0x70,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x62,0x03,0x01,0x02,0x00,0x02,0x52,0x1b,0x40,0x16,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x62,0x03,\r\n0x01,0x02,0x00,0x02,0x52,0x59,0x40,0x0b,0x00,0x00,0x00,0x0a,0x00,0x09,0x12,0x21,0x04,0x09,0x18,0x2b,0xb1,0x06,0x00,0x44,0x03,0x35,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0xe8,0x1a,0x23,0x4b,0x3a,0x2f,0x01,0xe5,0x41,0x23,0x4b,0x50,0x2b,0x34,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0xff,0x2b,0xff,0x1b,0xff,0xab,0x00,0x0b,\r\n0x00,0x27,0xb1,0x06,0x64,0x44,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0xd5,0x22,\r\n0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x02,0xfe,0x5c,0xff,0x06,0xff,0x4c,0xff,0xce,0x00,0x0b,0x00,0x17,0x00,0x39,0xb1,0x06,0x64,0x44,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,\r\n0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x37,0x1c,0x21,0x20,0x1d,0x1a,0x21,0x21,0xfa,0x37,0x2d,0x2d,0x37,0x37,\r\n0x2d,0x2d,0x37,0x33,0x1b,0x16,0x1a,0x18,0x1b,0x17,0x16,0x1b,0x00,0x01,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x37,0x33,0x07,0xfe,0x66,0x5f,\r\n0x69,0x69,0xf0,0x91,0x91,0x00,0x00,0x00,0x00,0x01,0xfe,0x75,0xff,0x35,0xff,0x42,0x00,0x1a,0x00,0x12,0x00,0x36,0xb1,0x06,0x64,0x44,0x40,0x2b,0x0b,0x01,0x01,0x02,0x01,0x4c,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x03,0x03,0x00,0x59,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,0x00,0x00,0x00,0x12,0x00,\r\n0x11,0x11,0x14,0x21,0x05,0x09,0x19,0x2b,0xb1,0x06,0x00,0x44,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x33,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xfe,0x75,0x46,0x16,0x1b,0x37,0x32,0x23,0x39,0x15,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x5f,0x3d,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,0x00,0x01,0xfe,0x61,\r\n0xff,0x35,0xff,0x29,0x00,0x0a,0x00,0x10,0x00,0x2e,0xb1,0x06,0x64,0x44,0x40,0x23,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x02,0x00,0x50,0x01,0x00,0x0f,0x0d,0x07,0x06,0x00,0x10,0x01,0x10,0x04,0x09,0x16,0x2b,0xb1,0x06,0x00,0x44,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x33,\r\n0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0xfe,0xdb,0x37,0x43,0x26,0x2f,0x4b,0x0b,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1d,0x3a,0x21,0x09,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x01,0xfd,0x8a,0x01,0x22,0x00,0x1e,0x01,0x68,0x00,0x03,0x00,0x26,0xb1,0x06,0x64,0x44,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,\r\n0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x35,0x21,0x15,0xfd,0x8a,0x02,0x94,0x01,0x22,0x46,0x46,0x00,0x01,0xfd,0xcb,0xff,0xe2,0xff,0xdd,0x02,0x4e,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x01,0x33,0x01,0xfd,0xcb,0x01,0xb7,0x5b,0xfe,0x48,0x1e,0x02,0x6c,0xfd,0x94,0x00,0x00,0x00,0x00,0x01,0xfe,0x16,0xff,0x92,0xff,0x92,0x02,0x94,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,\r\n0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0xb1,0x06,0x00,0x44,0x05,0x01,0x33,0x01,0xfe,0x16,0x01,0x3d,0x3f,0xfe,0xc3,0x6e,0x03,0x02,0xfc,0xfe,0x00,0x00,0x00,0xff,0xff,0x00,0x7d,0x02,0x89,0x01,0xdb,0x03,0x09,0x00,0x07,0x06,0x68,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe5,0x02,0x89,0x01,0x73,\r\n0x03,0x09,0x00,0x07,0x06,0x69,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa2,0x02,0x85,0x01,0x74,0x03,0x11,0x00,0x07,0x06,0x6a,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe8,0x02,0x85,0x01,0xb3,0x03,0x11,0x00,0x07,0x06,0x6b,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x02,0x85,0x02,0x10,0x03,0x11,0x00,0x07,\r\n0x06,0x6c,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x02,0x85,0x01,0xe1,0x03,0x11,0x00,0x07,0x06,0x6e,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x02,0x85,0x01,0xe1,0x03,0x11,0x00,0x07,0x06,0x6f,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x80,0x01,0xcc,0x03,0x11,0x00,0x07,0x06,0x70,0x02,0x58,\r\n0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0x02,0x60,0x01,0xa4,0x03,0x44,0x00,0x07,0x06,0x71,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x8a,0x01,0xcc,0x03,0x0c,0x00,0x07,0x06,0x72,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x02,0x9e,0x01,0xcc,0x02,0xe9,0x00,0x07,0x06,0x73,0x02,0x58,0x00,0x00,0x00,0x00,\r\n0xff,0xff,0x00,0xcd,0xff,0x35,0x01,0x9a,0x00,0x1a,0x00,0x07,0x06,0x7b,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb9,0xff,0x35,0x01,0x81,0x00,0x0a,0x00,0x07,0x06,0x7c,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x02,0x06,0x06,0x7a,0x00,0x00,0x00,0x02,0xfe,0x25,0x03,0x31,0xff,0x83,\r\n0x03,0xb1,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x03,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,\r\n0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x03,0x31,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x00,0x00,0x01,0xfe,0x8d,0x03,0x30,0xff,0x1b,0x03,0xb0,0x00,0x0b,0x00,0x1f,0x40,0x1c,\r\n0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,0x26,0x26,0x03,0x30,0x23,0x1d,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x00,0x01,0xfe,0x4a,\r\n0x03,0x2a,0xff,0x1c,0x03,0xb6,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0xfe,0xbd,0x73,0x64,0x6e,0x03,0x2a,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x90,0x03,0x2a,0xff,0x5b,0x03,0xb6,0x00,0x03,0x00,0x17,0x40,0x14,\r\n0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0xfe,0x90,0x6a,0x61,0x6f,0x03,0x2a,0x8c,0x8c,0x00,0x00,0x00,0x02,0xfe,0x3b,0x03,0x2a,0xff,0xb8,0x03,0xb6,0x00,0x03,0x00,0x07,0x00,0x2a,0x40,0x27,0x02,0x01,0x00,0x01,0x01,0x00,0x57,0x02,0x01,0x00,\r\n0x00,0x01,0x5f,0x05,0x03,0x04,0x03,0x01,0x00,0x01,0x4f,0x04,0x04,0x00,0x00,0x04,0x07,0x04,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x06,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x21,0x37,0x33,0x07,0xfe,0xee,0x6e,0x5c,0x73,0xfe,0xf6,0x6e,0x5c,0x73,0x03,0x2a,0x8c,0x8c,0x8c,0x8c,0x00,0x00,0x00,0x01,0xfe,0x1f,0x03,0x2a,0xff,0x89,\r\n0x03,0xb6,0x00,0x06,0x00,0x1f,0x40,0x1c,0x05,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x03,0x02,0x02,0x01,0x01,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x11,0x11,0x04,0x09,0x18,0x2b,0x01,0x37,0x33,0x17,0x23,0x27,0x07,0xfe,0x1f,0x8b,0x53,0x8c,0x63,0x52,0x50,0x03,0x2a,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x01,0xfe,0x1f,\r\n0x03,0x2a,0xff,0x89,0x03,0xb6,0x00,0x06,0x00,0x1f,0x40,0x1c,0x03,0x01,0x02,0x00,0x01,0x4c,0x01,0x01,0x00,0x02,0x00,0x85,0x03,0x01,0x02,0x02,0x76,0x00,0x00,0x00,0x06,0x00,0x06,0x12,0x11,0x04,0x09,0x18,0x2b,0x01,0x27,0x33,0x17,0x37,0x33,0x07,0xfe,0xab,0x8c,0x63,0x52,0x50,0x65,0x8b,0x03,0x2a,0x8c,0x4e,0x4e,0x8c,0x00,0x00,\r\n0x00,0x01,0xfe,0x34,0x03,0x25,0xff,0x74,0x03,0xb6,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,\r\n0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x03,0x25,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x5c,0x02,0xfe,0xff,0x4c,0x03,0xe2,0x00,0x0b,0x00,0x17,0x00,0x31,0x40,0x2e,0x00,0x01,0x00,0x03,0x02,0x01,0x03,0x69,0x05,0x01,0x02,0x00,0x00,0x02,0x59,0x05,0x01,0x02,\r\n0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,0x0b,0x01,0x0b,0x06,0x09,0x16,0x2b,0x01,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x27,0x32,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0xfe,0xd4,0x36,0x42,0x42,0x36,0x36,0x42,0x42,0x36,0x1b,\r\n0x21,0x21,0x1b,0x1b,0x21,0x21,0x02,0xfe,0x3f,0x33,0x33,0x3f,0x3f,0x33,0x33,0x3f,0x35,0x21,0x1c,0x1c,0x22,0x22,0x1c,0x1c,0x21,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0x03,0x2f,0xff,0x74,0x03,0xb1,0x00,0x19,0x00,0x65,0x4b,0xb0,0x2e,0x50,0x58,0x40,0x1b,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,\r\n0x00,0x04,0x04,0x00,0x62,0x02,0x06,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x29,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x06,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x13,0x01,0x00,0x16,0x15,0x13,\r\n0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x07,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0xe6,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x32,0x28,0x1e,0x26,0x1a,0x18,0x11,0x1e,0x41,0x31,0x03,0x2f,0x15,0x1c,0x15,0x23,0x1e,\r\n0x1e,0x2d,0x32,0x15,0x1c,0x15,0x23,0x1e,0x1e,0x2d,0x32,0x00,0x00,0x01,0xfe,0x34,0x03,0x48,0xff,0x74,0x03,0x93,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x01,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,\r\n0x03,0x48,0x4b,0x4b,0x00,0x01,0xfe,0x7a,0x03,0x20,0xff,0x33,0x03,0xd4,0x00,0x0e,0x00,0x46,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x17,0x03,0x01,0x02,0x00,0x00,0x02,0x71,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x1b,0x40,0x16,0x03,0x01,0x02,0x00,0x02,0x86,0x00,0x01,0x00,0x00,0x01,0x57,0x00,\r\n0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x59,0x40,0x0b,0x00,0x00,0x00,0x0e,0x00,0x0e,0x21,0x24,0x04,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0xfe,0xaa,0x2d,0x0e,0x20,0x4b,0x50,0x2f,0x3a,0x11,0x23,0x03,0x20,0x3f,0x14,0x0c,0x14,0x41,0x29,0x22,0x1c,0x19,0x34,0x00,0x00,\r\n0x00,0x02,0xfd,0xf0,0x03,0x2a,0xff,0x6d,0x03,0xb6,0x00,0x03,0x00,0x07,0x00,0x1d,0x40,0x1a,0x03,0x01,0x01,0x00,0x00,0x01,0x57,0x03,0x01,0x01,0x01,0x00,0x5f,0x02,0x01,0x00,0x01,0x00,0x4f,0x11,0x11,0x11,0x10,0x04,0x09,0x1a,0x2b,0x01,0x23,0x27,0x33,0x05,0x23,0x27,0x33,0xfe,0xba,0x57,0x73,0x5c,0x01,0x21,0x57,0x73,0x5c,0x03,\r\n0x2a,0x8c,0x8c,0x8c,0x00,0x01,0xfe,0x34,0x03,0x25,0xff,0x74,0x03,0xb6,0x00,0x0d,0x00,0x26,0x40,0x23,0x04,0x03,0x02,0x01,0x02,0x01,0x86,0x00,0x00,0x02,0x02,0x00,0x59,0x00,0x00,0x00,0x02,0x61,0x00,0x02,0x00,0x02,0x51,0x00,0x00,0x00,0x0d,0x00,0x0d,0x22,0x12,0x22,0x05,0x06,0x19,0x2b,0x01,0x34,0x36,0x33,0x32,0x16,0x15,0x23,\r\n0x34,0x26,0x23,0x22,0x06,0x15,0xfe,0x34,0x58,0x48,0x48,0x58,0x47,0x31,0x29,0x28,0x30,0x03,0x25,0x41,0x50,0x50,0x41,0x27,0x30,0x30,0x27,0x00,0x00,0x01,0xfe,0x7a,0x03,0x2a,0xff,0x38,0x03,0xfc,0x00,0x03,0x00,0x1f,0x40,0x1c,0x02,0x01,0x01,0x00,0x00,0x01,0x57,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,0x01,0x00,0x4f,0x00,0x00,\r\n0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x03,0x07,0x23,0x37,0xc8,0x41,0x7d,0x73,0x03,0xfc,0xd2,0xd2,0x00,0x00,0x00,0x00,0x01,0xff,0x1b,0x02,0x99,0xff,0xa6,0x03,0x48,0x00,0x0b,0x00,0x3c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x12,0x00,0x01,0x00,0x00,0x01,0x70,0x03,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x38,0x02,0x4e,0x1b,\r\n0x40,0x11,0x00,0x01,0x00,0x01,0x85,0x03,0x01,0x02,0x02,0x00,0x61,0x00,0x00,0x00,0x38,0x02,0x4e,0x59,0x40,0x0b,0x00,0x00,0x00,0x0b,0x00,0x0a,0x13,0x21,0x04,0x09,0x18,0x2b,0x03,0x35,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x23,0xe5,0x1d,0x10,0x13,0x4b,0x39,0x30,0x02,0x99,0x41,0x13,0x10,0x4b,0x50,0x2b,0x34,0x00,0x00,\r\n0x00,0x01,0xfe,0x8d,0xff,0x2b,0xff,0x1b,0xff,0xab,0x00,0x0b,0x00,0x1f,0x40,0x1c,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x02,0x01,0x00,0x01,0x00,0x51,0x01,0x00,0x07,0x05,0x00,0x0b,0x01,0x0b,0x03,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xfe,0xd4,0x21,0x26,0x26,0x21,0x21,\r\n0x26,0x26,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x02,0xfe,0x25,0xff,0x2b,0xff,0x83,0xff,0xab,0x00,0x0b,0x00,0x17,0x00,0x2b,0x40,0x28,0x03,0x01,0x01,0x00,0x00,0x01,0x59,0x03,0x01,0x01,0x01,0x00,0x61,0x05,0x02,0x04,0x03,0x00,0x01,0x00,0x51,0x0d,0x0c,0x01,0x00,0x13,0x11,0x0c,0x17,0x0d,0x17,0x07,0x05,0x00,\r\n0x0b,0x01,0x0b,0x06,0x06,0x16,0x2b,0x07,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0xbd,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xd5,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,\r\n0x00,0x01,0xfe,0x66,0xff,0x10,0xff,0x2e,0xff,0xa1,0x00,0x03,0x00,0x17,0x40,0x14,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x05,0x37,0x33,0x07,0xfe,0x66,0x5f,0x69,0x69,0xf0,0x91,0x91,0x00,0x00,0x00,0x00,0x01,0xfe,0x75,0xff,0x35,0xff,0x42,0x00,0x1a,0x00,0x12,\r\n0x00,0x4e,0xb5,0x0b,0x01,0x01,0x02,0x01,0x4c,0x4b,0xb0,0x15,0x50,0x58,0x40,0x14,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x03,0x3d,0x03,0x4e,0x1b,0x40,0x19,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x00,0x03,0x03,0x00,0x59,0x00,0x00,0x00,0x03,0x5f,0x04,0x01,0x03,0x00,0x03,0x4f,\r\n0x59,0x40,0x0c,0x00,0x00,0x00,0x12,0x00,0x11,0x11,0x14,0x21,0x05,0x09,0x19,0x2b,0x05,0x35,0x33,0x32,0x36,0x35,0x34,0x26,0x23,0x37,0x33,0x07,0x1e,0x02,0x15,0x14,0x06,0x23,0xfe,0x75,0x46,0x16,0x1b,0x37,0x32,0x23,0x39,0x15,0x1a,0x38,0x26,0x42,0x36,0xcb,0x37,0x17,0x0d,0x11,0x1a,0x5f,0x3d,0x03,0x14,0x24,0x1a,0x22,0x31,0x00,\r\n0x00,0x01,0xfe,0x61,0xff,0x35,0xff,0x29,0x00,0x0a,0x00,0x10,0x00,0x42,0x4b,0xb0,0x15,0x50,0x58,0x40,0x11,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x00,0x3d,0x00,0x4e,0x1b,0x40,0x16,0x00,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x60,0x03,0x01,0x00,0x02,0x00,0x50,0x59,\r\n0x40,0x0d,0x01,0x00,0x0f,0x0d,0x07,0x06,0x00,0x10,0x01,0x10,0x04,0x09,0x16,0x2b,0x05,0x22,0x26,0x35,0x34,0x36,0x37,0x33,0x07,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0xfe,0xdb,0x37,0x43,0x26,0x2f,0x4b,0x0b,0x22,0x1e,0x1e,0x19,0x3c,0xcb,0x35,0x28,0x1d,0x3a,0x21,0x09,0x1c,0x2d,0x15,0x16,0x1c,0x3c,0x00,0x00,0x01,0xfe,0x34,\r\n0xff,0x10,0xff,0x74,0xff,0xa1,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x06,0x16,0x2b,0x05,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,\r\n0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0xf0,0x50,0x41,0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x00,0x01,0xfe,0x34,0xff,0x3d,0xff,0x74,0xff,0x88,0x00,0x03,0x00,0x1e,0x40,0x1b,0x00,0x00,0x01,0x01,0x00,0x57,0x00,0x00,0x00,0x01,0x5f,0x02,0x01,0x01,0x00,0x01,0x4f,0x00,0x00,0x00,0x03,0x00,0x03,0x11,\r\n0x03,0x06,0x17,0x2b,0x05,0x35,0x21,0x15,0xfe,0x34,0x01,0x40,0xc3,0x4b,0x4b,0x00,0xff,0xff,0x00,0x7d,0x03,0x31,0x01,0xdb,0x03,0xb1,0x00,0x07,0x06,0x8e,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe5,0x03,0x30,0x01,0x73,0x03,0xb0,0x00,0x07,0x06,0x8f,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xa2,0x03,0x2a,0x01,0x74,\r\n0x03,0xb6,0x00,0x07,0x06,0x90,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xe8,0x03,0x2a,0x01,0xb3,0x03,0xb6,0x00,0x07,0x06,0x91,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x93,0x03,0x2a,0x02,0x10,0x03,0xb6,0x00,0x07,0x06,0x92,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x03,0x2a,0x01,0xe1,0x03,0xb6,0x00,0x07,\r\n0x06,0x93,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x77,0x03,0x2a,0x01,0xe1,0x03,0xb6,0x00,0x07,0x06,0x94,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x25,0x01,0xcc,0x03,0xb6,0x00,0x07,0x06,0x95,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xb4,0x02,0xfe,0x01,0xa4,0x03,0xe2,0x00,0x07,0x06,0x96,0x02,0x58,\r\n0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x2f,0x01,0xcc,0x03,0xb1,0x00,0x07,0x06,0x97,0x02,0x58,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0x8c,0x03,0x48,0x01,0xcc,0x03,0x93,0x00,0x07,0x06,0x98,0x02,0x58,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xd2,0x02,0x85,0x01,0xa0,0x03,0x11,0x00,0x03,0x00,0x1f,0xb1,0x06,0x64,0x44,0x40,0x14,\r\n0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x08,0x17,0x2b,0xb1,0x06,0x00,0x44,0x13,0x37,0x33,0x07,0xd2,0x6a,0x64,0x6f,0x02,0x85,0x8c,0x8c,0x00,0x00,0x00,0x00,0x01,0x00,0xe1,0x02,0x3a,0x01,0x77,0x02,0xda,0x00,0x03,0x00,0x19,0x40,0x16,0x02,0x01,0x01,0x01,0x00,0x5f,0x00,0x00,\r\n0x00,0x38,0x01,0x4e,0x00,0x00,0x00,0x03,0x00,0x03,0x11,0x03,0x09,0x17,0x2b,0x13,0x37,0x33,0x07,0xe1,0x38,0x5e,0x40,0x02,0x3a,0xa0,0xa0,0x00,0x00,0x03,0x00,0x7d,0x02,0x89,0x01,0xdb,0x03,0x84,0x00,0x03,0x00,0x0f,0x00,0x1b,0x00,0x77,0xb1,0x06,0x64,0x44,0x4b,0xb0,0x0a,0x50,0x58,0x40,0x24,0x00,0x00,0x03,0x03,0x00,0x70,0x06,\r\n0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x05,0x01,0x03,0x01,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x62,0x08,0x04,0x07,0x03,0x02,0x03,0x02,0x52,0x1b,0x40,0x23,0x00,0x00,0x03,0x00,0x85,0x06,0x01,0x01,0x03,0x02,0x03,0x01,0x02,0x80,0x05,0x01,0x03,0x01,0x02,0x03,0x59,0x05,0x01,0x03,0x03,0x02,0x62,0x08,0x04,0x07,0x03,0x02,\r\n0x03,0x02,0x52,0x59,0x40,0x1a,0x11,0x10,0x05,0x04,0x00,0x00,0x17,0x15,0x10,0x1b,0x11,0x1b,0x0b,0x09,0x04,0x0f,0x05,0x0f,0x00,0x03,0x00,0x03,0x11,0x09,0x08,0x17,0x2b,0xb1,0x06,0x00,0x44,0x01,0x37,0x33,0x07,0x17,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,0x06,0x23,0x22,0x26,0x35,0x34,0x36,0x33,0x32,0x16,0x15,0x14,\r\n0x06,0x01,0x03,0x4e,0x50,0x58,0x52,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0xfb,0x1d,0x23,0x23,0x1d,0x1d,0x23,0x23,0x03,0x01,0x83,0x83,0x78,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x22,0x1d,0x1e,0x23,0x23,0x1e,0x1d,0x22,0x00,0x00,0x01,0xfe,0x34,0x02,0x80,0xff,0x74,0x03,0x11,0x00,0x0d,0x00,0x29,0x40,0x26,0x03,0x01,0x01,0x02,\r\n0x01,0x85,0x00,0x02,0x00,0x00,0x02,0x59,0x00,0x02,0x02,0x00,0x61,0x04,0x01,0x00,0x02,0x00,0x51,0x01,0x00,0x0b,0x0a,0x08,0x06,0x04,0x03,0x00,0x0d,0x01,0x0d,0x05,0x06,0x16,0x2b,0x01,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xd4,0x48,0x58,0x47,0x30,0x28,0x29,0x31,0x47,0x58,0x02,0x80,0x50,0x41,\r\n0x27,0x30,0x30,0x27,0x41,0x50,0x00,0x00,0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0x7a,0x00,0x03,0x00,0x11,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,\r\n0x0f,0x0e,0x0c,0x0a,0x08,0x07,0x04,0x11,0x05,0x11,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0x95,0x73,0x60,0x78,0x1c,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x82,0x82,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,\r\n0x48,0x00,0x00,0x00,0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0x7a,0x00,0x03,0x00,0x11,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x0f,0x0e,0x0c,0x0a,\r\n0x08,0x07,0x04,0x11,0x05,0x11,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xb8,0x78,0x60,0x73,0x3f,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x82,0x82,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,0x48,0x00,0x00,0x00,\r\n0x00,0x02,0xfe,0x2a,0x02,0x80,0xff,0x7e,0x03,0xa2,0x00,0x0f,0x00,0x1d,0x00,0x78,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x29,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x70,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,\r\n0x1b,0x40,0x2a,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x05,0x7e,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x69,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x59,0x40,0x17,0x11,0x10,0x00,0x00,0x1b,0x1a,0x18,0x16,0x14,0x13,0x10,0x1d,0x11,0x1d,0x00,0x0f,\r\n0x00,0x0f,0x21,0x24,0x09,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xfe,0xa5,0x2d,0x09,0x1b,0x37,0x41,0x2b,0x33,0x09,0x08,0x23,0x20,0x4c,0x5e,0x46,0x37,0x2d,0x2d,0x37,0x46,0x5d,0x02,0xf8,0x3d,0x0c,0x0d,\r\n0x18,0x3c,0x27,0x20,0x0d,0x19,0x0b,0x32,0x78,0x48,0x3a,0x1f,0x27,0x27,0x1f,0x3a,0x48,0x00,0x00,0x00,0x00,0x02,0xfe,0x34,0x02,0x85,0xff,0x74,0x03,0xa0,0x00,0x19,0x00,0x27,0x00,0x95,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x2d,0x09,0x01,0x07,0x00,0x08,0x00,0x07,0x08,0x80,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,\r\n0x0a,0x02,0x00,0x07,0x04,0x00,0x6a,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x1b,0x40,0x3b,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,0x04,0x00,0x04,0x02,0x00,0x80,0x09,0x01,0x07,0x00,0x08,0x00,0x07,0x08,0x80,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x0a,0x01,\r\n0x00,0x07,0x04,0x00,0x6a,0x00,0x08,0x06,0x06,0x08,0x59,0x00,0x08,0x08,0x06,0x61,0x0b,0x01,0x06,0x08,0x06,0x51,0x59,0x40,0x1f,0x1b,0x1a,0x01,0x00,0x25,0x24,0x22,0x20,0x1e,0x1d,0x1a,0x27,0x1b,0x27,0x16,0x15,0x13,0x11,0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0c,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,\r\n0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0xea,0x1f,0x25,0x18,0x16,0x11,0x1e,0x41,0x34,0x2a,0x20,0x25,0x17,0x16,0x11,0x1e,0x41,0x34,0x6c,0x48,0x58,0x41,0x34,0x2a,0x2b,0x35,0x41,0x58,0x03,0x2c,0x13,0x19,0x13,\r\n0x1e,0x19,0x14,0x28,0x30,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0xa7,0x48,0x3a,0x1f,0x28,0x28,0x1f,0x3a,0x48,0x00,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0x00,0x19,0x03,0x84,0x00,0x03,0x00,0x0a,0x00,0x33,0x40,0x30,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x01,0x03,0x01,0x85,\r\n0x06,0x04,0x02,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xbe,0x73,0x64,0x78,0xfe,0x7f,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x8c,0x8c,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,\r\n0x02,0x85,0xff,0xc9,0x03,0x84,0x00,0x03,0x00,0x0a,0x00,0x3f,0x40,0x3c,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x80,0x05,0x01,0x01,0x03,0x00,0x01,0x03,0x7e,0x00,0x00,0x02,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x06,0x04,0x02,0x03,0x00,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,\r\n0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x27,0x33,0x17,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0x96,0x82,0x64,0x7d,0xfe,0x57,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x8c,0x8c,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0xff,0xce,0x03,0xa2,0x00,0x0e,0x00,0x15,0x00,0x75,0xb5,0x14,0x01,0x04,\r\n0x02,0x01,0x4c,0x4b,0xb0,0x0c,0x50,0x58,0x40,0x25,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,0x70,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1b,0x40,0x26,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,\r\n0x04,0x7e,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x59,0x40,0x15,0x0f,0x0f,0x00,0x00,0x0f,0x15,0x0f,0x15,0x13,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x08,0x09,0x18,0x2b,0x03,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,\r\n0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xb1,0x2d,0x09,0x20,0x32,0x37,0x2e,0x36,0x11,0x23,0xfe,0x86,0x8a,0x54,0x8b,0x65,0x50,0x51,0x02,0xf8,0x3d,0x0e,0x0a,0x19,0x3c,0x28,0x23,0x15,0x18,0x32,0x73,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x20,0x02,0x85,0xff,0x89,0x03,0xa0,0x00,0x19,0x00,0x20,0x00,0x92,0xb5,0x1f,0x01,0x07,\r\n0x06,0x01,0x4c,0x4b,0xb0,0x1e,0x50,0x58,0x40,0x29,0x00,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0a,0x08,0x02,0x07,0x07,0x84,0x05,0x01,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x00,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x02,0x09,0x02,0x00,0x04,0x00,0x52,0x1b,0x40,0x37,0x00,0x05,0x03,0x01,0x03,0x05,0x01,0x80,0x00,0x02,\r\n0x04,0x00,0x04,0x02,0x00,0x80,0x00,0x06,0x00,0x07,0x00,0x06,0x07,0x80,0x0a,0x08,0x02,0x07,0x07,0x84,0x00,0x03,0x00,0x01,0x04,0x03,0x01,0x69,0x00,0x04,0x02,0x00,0x04,0x59,0x00,0x04,0x04,0x00,0x62,0x09,0x01,0x00,0x04,0x00,0x52,0x59,0x40,0x1d,0x1a,0x1a,0x01,0x00,0x1a,0x20,0x1a,0x20,0x1e,0x1d,0x1c,0x1b,0x16,0x15,0x13,0x11,\r\n0x0e,0x0c,0x09,0x08,0x06,0x04,0x00,0x19,0x01,0x19,0x0b,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x35,0x35,0x33,0x15,0x14,0x06,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xea,0x1f,0x25,0x18,0x16,0x11,0x1e,0x41,0x34,0x2a,0x20,0x25,0x17,0x16,0x11,0x1e,0x41,0x34,0xfe,\r\n0xe0,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x2c,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0x13,0x19,0x13,0x1e,0x19,0x14,0x28,0x30,0xa7,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x03,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,\r\n0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x10,0x0f,0x0d,0x0a,0x08,0x07,0x04,0x13,0x05,0x12,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x37,0x33,0x07,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe,\r\n0x95,0x69,0x60,0x6e,0x35,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x84,0x78,0x78,0x78,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x03,0x00,0x13,0x00,0x3b,0x40,0x38,0x00,0x00,0x03,0x00,0x85,0x05,0x01,0x03,0x01,0x03,0x85,0x06,0x01,0x01,\r\n0x04,0x01,0x85,0x00,0x04,0x02,0x02,0x04,0x59,0x00,0x04,0x04,0x02,0x62,0x07,0x01,0x02,0x04,0x02,0x52,0x05,0x04,0x00,0x00,0x10,0x0f,0x0d,0x0a,0x08,0x07,0x04,0x13,0x05,0x12,0x00,0x03,0x00,0x03,0x11,0x08,0x09,0x17,0x2b,0x01,0x27,0x33,0x17,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe,\r\n0xb8,0x64,0x60,0x5f,0x58,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x84,0x78,0x78,0x78,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,0x03,0xfc,0x00,0x0f,0x00,0x1f,0x00,0x78,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x29,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,\r\n0x07,0x01,0x02,0x05,0x00,0x02,0x70,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x03,0x03,0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x1b,0x40,0x2a,0x06,0x01,0x04,0x00,0x02,0x00,0x04,0x02,0x80,0x07,0x01,0x02,0x05,0x00,0x02,0x05,0x7e,0x00,0x01,0x00,0x00,0x04,0x01,0x00,0x67,0x00,0x05,0x03,0x03,\r\n0x05,0x59,0x00,0x05,0x05,0x03,0x61,0x08,0x01,0x03,0x05,0x03,0x51,0x59,0x40,0x17,0x11,0x10,0x00,0x00,0x1c,0x1b,0x19,0x16,0x14,0x13,0x10,0x1f,0x11,0x1e,0x00,0x0f,0x00,0x0f,0x21,0x24,0x09,0x09,0x18,0x2b,0x01,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x06,0x0f,0x02,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,\r\n0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xfe,0xa6,0x2f,0x07,0x0a,0x49,0x61,0x1a,0x1d,0x08,0x08,0x20,0x36,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x70,0x38,0x08,0x08,0x08,0x3c,0x19,0x17,0x0d,0x1c,0x0b,0x28,0x64,0x46,0x3c,0x20,0x26,0x26,0x20,0x3c,0x46,0x00,0x00,0x00,0x00,0x02,0xfe,0x2f,0x03,0x0c,0xff,0x79,\r\n0x03,0xfc,0x00,0x1b,0x00,0x2b,0x00,0x55,0x40,0x52,0x18,0x16,0x02,0x03,0x02,0x0a,0x08,0x02,0x00,0x01,0x02,0x4c,0x07,0x01,0x05,0x00,0x06,0x00,0x05,0x06,0x80,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x03,0x08,0x01,0x00,0x05,0x03,0x00,0x69,0x00,0x06,0x04,0x04,0x06,0x59,0x00,0x06,0x06,0x04,0x61,0x09,0x01,0x04,0x06,0x04,\r\n0x51,0x1d,0x1c,0x01,0x00,0x28,0x27,0x25,0x22,0x20,0x1f,0x1c,0x2b,0x1d,0x2a,0x14,0x12,0x0f,0x0d,0x06,0x04,0x00,0x1b,0x01,0x1b,0x0a,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x07,0x22,0x26,0x35,0x33,0x14,0x16,0x33,0x33,\r\n0x32,0x36,0x35,0x33,0x14,0x06,0x23,0xdf,0x1f,0x2a,0x1e,0x1b,0x11,0x0d,0x11,0x41,0x31,0x29,0x20,0x29,0x1d,0x1a,0x11,0x0e,0x10,0x41,0x2f,0x8f,0x40,0x4c,0x46,0x26,0x20,0x31,0x21,0x26,0x46,0x4c,0x41,0x03,0x98,0x0e,0x13,0x0e,0x10,0x0e,0x07,0x07,0x26,0x2d,0x0e,0x13,0x0e,0x11,0x0d,0x07,0x07,0x26,0x2d,0x8c,0x3c,0x3c,0x20,0x1c,\r\n0x1c,0x20,0x3c,0x3c,0x00,0x02,0xfe,0x20,0x03,0x0c,0x00,0x0f,0x03,0xfc,0x00,0x03,0x00,0x0a,0x00,0x33,0x40,0x30,0x09,0x01,0x03,0x01,0x01,0x4c,0x00,0x00,0x02,0x00,0x85,0x00,0x02,0x01,0x02,0x85,0x05,0x01,0x01,0x03,0x01,0x85,0x06,0x04,0x02,0x03,0x03,0x76,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,\r\n0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x37,0x33,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xc0,0x69,0x66,0x6e,0xfe,0x7f,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x84,0x78,0x78,0x78,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0xc4,0x03,0xfc,0x00,0x03,0x00,0x0a,0x00,0x3f,0x40,0x3c,0x09,0x01,0x03,0x01,0x01,0x4c,\r\n0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x80,0x05,0x01,0x01,0x03,0x00,0x01,0x03,0x7e,0x00,0x00,0x02,0x03,0x00,0x57,0x00,0x00,0x00,0x03,0x5f,0x06,0x04,0x02,0x03,0x00,0x03,0x4f,0x04,0x04,0x00,0x00,0x04,0x0a,0x04,0x0a,0x08,0x07,0x06,0x05,0x00,0x03,0x00,0x03,0x11,0x07,0x09,0x17,0x2b,0x03,0x27,0x33,0x17,0x05,0x37,0x33,0x17,0x23,\r\n0x27,0x07,0x9b,0x78,0x64,0x73,0xfe,0x5c,0x8a,0x54,0x8b,0x65,0x50,0x51,0x03,0x84,0x78,0x78,0x78,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0xce,0x03,0xfc,0x00,0x0e,0x00,0x15,0x00,0x75,0xb5,0x14,0x01,0x04,0x02,0x01,0x4c,0x4b,0xb0,0x0f,0x50,0x58,0x40,0x25,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,\r\n0x02,0x04,0x00,0x02,0x70,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,0x00,0x01,0x00,0x51,0x1b,0x40,0x26,0x00,0x03,0x00,0x02,0x00,0x03,0x02,0x80,0x06,0x01,0x02,0x04,0x00,0x02,0x04,0x7e,0x07,0x05,0x02,0x04,0x04,0x84,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x01,0x00,0x61,0x00,\r\n0x00,0x01,0x00,0x51,0x59,0x40,0x15,0x0f,0x0f,0x00,0x00,0x0f,0x15,0x0f,0x15,0x13,0x12,0x11,0x10,0x00,0x0e,0x00,0x0e,0x21,0x24,0x08,0x09,0x18,0x2b,0x03,0x37,0x36,0x35,0x34,0x23,0x23,0x35,0x33,0x32,0x16,0x15,0x14,0x07,0x07,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xb4,0x30,0x08,0x0f,0x42,0x55,0x20,0x26,0x10,0x24,0xfe,0x86,0x8a,\r\n0x54,0x8b,0x65,0x50,0x51,0x03,0x70,0x2f,0x08,0x0b,0x10,0x3a,0x22,0x1c,0x1c,0x10,0x22,0x64,0x8c,0x8c,0x4e,0x4e,0x00,0x00,0x00,0x02,0xfe,0x20,0x03,0x0c,0xff,0x88,0x03,0xfc,0x00,0x1b,0x00,0x22,0x00,0x53,0x40,0x50,0x18,0x16,0x02,0x03,0x02,0x0a,0x08,0x02,0x00,0x01,0x21,0x01,0x05,0x04,0x03,0x4c,0x00,0x04,0x00,0x05,0x00,0x04,\r\n0x05,0x80,0x08,0x06,0x02,0x05,0x05,0x84,0x00,0x03,0x01,0x00,0x03,0x59,0x00,0x02,0x00,0x01,0x00,0x02,0x01,0x69,0x00,0x03,0x03,0x00,0x61,0x07,0x01,0x00,0x03,0x00,0x51,0x1c,0x1c,0x01,0x00,0x1c,0x22,0x1c,0x22,0x20,0x1f,0x1e,0x1d,0x14,0x12,0x0f,0x0d,0x06,0x04,0x00,0x1b,0x01,0x1b,0x09,0x09,0x16,0x2b,0x03,0x22,0x2e,0x02,0x23,\r\n0x22,0x06,0x15,0x15,0x23,0x35,0x34,0x36,0x33,0x32,0x1e,0x02,0x33,0x32,0x36,0x35,0x35,0x33,0x15,0x14,0x06,0x05,0x37,0x33,0x17,0x23,0x27,0x07,0xdf,0x1f,0x2a,0x1e,0x1b,0x11,0x0d,0x11,0x41,0x31,0x29,0x20,0x29,0x1d,0x1a,0x11,0x0e,0x10,0x41,0x2f,0xfe,0xd6,0x74,0x80,0x74,0x65,0x4f,0x51,0x03,0x98,0x0e,0x13,0x0e,0x10,0x0e,0x07,\r\n0x07,0x26,0x2d,0x0e,0x13,0x0e,0x11,0x0d,0x07,0x07,0x26,0x2d,0x8c,0x6e,0x6e,0x49,0x49,0x00,0x00,0x00,0x00,0x02,0x00,0x5a,0xfe,0xf2,0x02,0x58,0x03,0xca,0x00,0x03,0x00,0x1a,0x00,0x2a,0x40,0x27,0x0f,0x01,0x01,0x00,0x03,0x00,0x02,0x03,0x01,0x02,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x03,0x01,0x85,0x04,0x01,0x03,0x03,\r\n0x76,0x04,0x04,0x04,0x1a,0x04,0x1a,0x12,0x1b,0x11,0x05,0x06,0x19,0x2b,0x13,0x11,0x33,0x11,0x03,0x11,0x34,0x36,0x37,0x37,0x36,0x36,0x35,0x35,0x23,0x37,0x17,0x23,0x15,0x14,0x06,0x07,0x07,0x06,0x06,0x15,0x11,0x5a,0x78,0x78,0x2c,0x25,0x91,0x19,0x1d,0x6e,0xaa,0xaa,0x6e,0x28,0x20,0x9b,0x19,0x1c,0x01,0x6c,0x02,0x5e,0xfd,0xfb,\r\n0xfd,0x2d,0x01,0x7d,0x2c,0x59,0x1b,0x6c,0x12,0x2d,0x13,0xaa,0xaa,0xaa,0xb4,0x25,0x4b,0x18,0x73,0x13,0x34,0x1d,0xfe,0x8e,0x00,0x02,0x00,0x69,0xff,0x42,0x01,0xef,0x03,0x7a,0x00,0x05,0x00,0x1e,0x00,0x47,0x40,0x44,0x00,0x00,0x01,0x00,0x85,0x00,0x01,0x09,0x01,0x02,0x03,0x01,0x02,0x67,0x05,0x01,0x03,0x00,0x07,0x04,0x03,0x07,\r\n0x67,0x00,0x04,0x06,0x06,0x04,0x57,0x00,0x04,0x04,0x06,0x5f,0x0a,0x08,0x02,0x06,0x04,0x06,0x4f,0x06,0x06,0x00,0x00,0x06,0x1e,0x06,0x1e,0x1a,0x19,0x15,0x14,0x13,0x12,0x0d,0x0c,0x08,0x07,0x00,0x05,0x00,0x05,0x11,0x11,0x0b,0x06,0x18,0x2b,0x13,0x11,0x33,0x11,0x33,0x15,0x03,0x11,0x33,0x13,0x16,0x16,0x17,0x33,0x32,0x26,0x26,\r\n0x35,0x11,0x33,0x11,0x23,0x03,0x26,0x26,0x27,0x23,0x16,0x16,0x15,0x11,0x69,0x50,0xdd,0xf1,0x5d,0x81,0x0c,0x15,0x05,0x0a,0x01,0x08,0x08,0x4b,0x5c,0x80,0x0c,0x17,0x06,0x0a,0x05,0x0b,0x01,0x90,0x01,0xea,0xfe,0x61,0x4b,0xfd,0xb2,0x01,0xea,0xfe,0xdb,0x1c,0x47,0x17,0x30,0x41,0x1b,0x01,0x13,0xfe,0x16,0x01,0x25,0x1c,0x47,0x17,\r\n0x1b,0x51,0x20,0xfe,0xed,0x00,0x00,0x00,0x00,0x03,0x00,0x32,0xff,0xb0,0x02,0x26,0x03,0x6b,0x00,0x1a,0x00,0x23,0x00,0x32,0x00,0x44,0x40,0x41,0x32,0x26,0x02,0x06,0x07,0x01,0x4c,0x00,0x02,0x00,0x05,0x01,0x02,0x05,0x69,0x04,0x03,0x02,0x01,0x00,0x07,0x06,0x01,0x07,0x69,0x00,0x06,0x00,0x00,0x06,0x57,0x00,0x06,0x06,0x00,0x5f,\r\n0x08,0x01,0x00,0x06,0x00,0x4f,0x01,0x00,0x2d,0x2b,0x25,0x24,0x21,0x1f,0x1c,0x1b,0x14,0x12,0x0e,0x0c,0x08,0x06,0x00,0x1a,0x01,0x19,0x09,0x06,0x16,0x2b,0x17,0x22,0x26,0x35,0x11,0x34,0x36,0x33,0x33,0x35,0x34,0x36,0x36,0x33,0x32,0x16,0x16,0x15,0x15,0x33,0x32,0x16,0x15,0x11,0x14,0x06,0x23,0x01,0x33,0x35,0x34,0x26,0x23,0x22,\r\n0x06,0x15,0x13,0x33,0x35,0x36,0x36,0x35,0x34,0x26,0x23,0x22,0x06,0x15,0x14,0x16,0x17,0x6e,0x19,0x23,0x23,0x19,0x0a,0x30,0x51,0x33,0x35,0x51,0x2e,0x0a,0x19,0x23,0x23,0x19,0xfe,0xde,0xc8,0x37,0x2d,0x2d,0x37,0x37,0x59,0x12,0x26,0x37,0x2d,0x2d,0x37,0x25,0x12,0x50,0x23,0x19,0x01,0xb2,0x19,0x23,0xe7,0x33,0x4d,0x2a,0x2c,0x4c,\r\n0x32,0xe7,0x23,0x19,0xfe,0x4e,0x19,0x23,0x02,0x2b,0xe6,0x2d,0x37,0x37,0x2d,0xfd,0x71,0xa0,0x07,0x28,0x22,0x28,0x31,0x31,0x28,0x22,0x28,0x07,0x00,0x01,0xff,0xd8,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x04,0x00,0x17,0x40,0x14,0x04,0x01,0x00,0x01,0x01,0x4c,0x00,0x01,0x00,0x01,0x85,0x00,0x00,0x00,0x76,0x11,0x10,0x02,0x06,0x18,\r\n0x2b,0x13,0x23,0x11,0x33,0x01,0x0a,0x32,0x32,0x02,0x4e,0xfe,0xd4,0x05,0x28,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,\r\n0x11,0x01,0x01,0x33,0x01,0x01,0x01,0xe2,0xfe,0x24,0x70,0x01,0xe2,0xfe,0x1e,0xfe,0xd4,0x02,0x92,0x02,0x96,0xfd,0x6c,0xfd,0x6c,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x80,0x03,0xfc,0x00,0x04,0x00,0x1d,0x40,0x1a,0x01,0x01,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,0x04,\r\n0x00,0x04,0x12,0x03,0x06,0x17,0x2b,0x09,0x02,0x33,0x11,0x02,0x4e,0xfd,0xb2,0x02,0x4e,0x32,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfa,0xd8,0x00,0x00,0x00,0x01,0x00,0x00,0xfe,0xd4,0x02,0x58,0x03,0xfc,0x00,0x05,0x00,0x1e,0x40,0x1b,0x04,0x01,0x02,0x01,0x00,0x01,0x4c,0x00,0x00,0x01,0x00,0x85,0x02,0x01,0x01,0x01,0x76,0x00,0x00,0x00,\r\n0x05,0x00,0x05,0x12,0x03,0x06,0x17,0x2b,0x09,0x02,0x33,0x01,0x01,0x01,0xe2,0xfe,0x1e,0x01,0xe2,0x70,0xfe,0x24,0x01,0xe2,0xfe,0xd4,0x02,0x94,0x02,0x94,0xfd,0x6a,0xfd,0x6e,0x00,0x00,0x00,0x01,0x00,0x55,0xff,0x35,0x02,0x2b,0x02,0x26,0x00,0x19,0x00,0x5f,0x4b,0xb0,0x15,0x50,0x58,0x40,0x22,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,\r\n0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x08,0x07,0x02,0x04,0x04,0x39,0x4d,0x00,0x05,0x05,0x06,0x5f,0x00,0x06,0x06,0x3d,0x06,0x4e,0x1b,0x40,0x1f,0x00,0x05,0x00,0x06,0x05,0x06,0x63,0x00,0x01,0x01,0x02,0x5f,0x00,0x02,0x02,0x3b,0x4d,0x03,0x01,0x00,0x00,0x04,0x5f,0x08,0x07,0x02,0x04,0x04,0x39,0x04,0x4e,0x59,0x40,0x10,\r\n0x00,0x00,0x00,0x19,0x00,0x19,0x21,0x25,0x11,0x11,0x11,0x11,0x11,0x09,0x09,0x1d,0x2b,0x33,0x35,0x33,0x11,0x23,0x35,0x21,0x11,0x33,0x15,0x23,0x06,0x06,0x15,0x14,0x16,0x33,0x33,0x15,0x23,0x22,0x26,0x35,0x34,0x36,0x37,0x55,0xc3,0xaf,0x01,0x09,0xb9,0xcf,0x21,0x1e,0x1e,0x19,0x3c,0x4e,0x37,0x43,0x20,0x27,0x52,0x01,0x82,0x52,\r\n0xfe,0x2c,0x52,0x1b,0x2d,0x15,0x16,0x1c,0x3c,0x35,0x28,0x1a,0x36,0x1e,0x00,0x00,0xff,0xff,0x00,0x55,0xff,0x2b,0x02,0x2b,0x02,0x26,0x02,0x26,0x01,0x00,0x00,0x00,0x00,0x07,0x06,0x78,0x02,0x67,0x00,0x00,0x00,0x00,0x00,0x16,0x01,0x0e,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,\r\n0x01,0x01,0x00,0x13,0x00,0x14,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x02,0x00,0x17,0x00,0x27,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x03,0x00,0x0b,0x00,0x3e,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x00,0x00,0xbc,0x00,0x49,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x01,0x00,0x1c,0x01,0x05,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x02,0x00,0x0e,\r\n0x01,0x21,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x03,0x00,0x3c,0x01,0x2f,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x04,0x00,0x2c,0x01,0x6b,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x05,0x00,0x54,0x01,0x97,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x06,0x00,0x2a,0x01,0xeb,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x07,0x00,0x62,0x02,0x15,0x00,0x03,\r\n0x00,0x01,0x04,0x09,0x00,0x08,0x00,0x12,0x02,0x77,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x09,0x00,0x4a,0x02,0x89,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0b,0x00,0x32,0x02,0xd3,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0c,0x00,0x32,0x03,0x05,0x00,0x03,0x00,0x01,0x04,0x09,0x00,0x0d,0x01,0x22,0x03,0x37,0x00,0x03,0x00,0x01,0x04,0x09,\r\n0x00,0x0e,0x00,0x36,0x04,0x59,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x00,0x00,0x28,0x04,0x8f,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x01,0x00,0x26,0x04,0xb7,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x02,0x00,0x2e,0x04,0xdd,0x00,0x03,0x00,0x01,0x04,0x09,0x01,0x03,0x00,0x16,0x05,0x0b,0x43,0x6c,0x61,0x73,0x73,0x69,0x63,0x20,0x63,0x6f,\r\n0x6e,0x73,0x74,0x72,0x75,0x63,0x74,0x69,0x6f,0x6e,0x43,0x6c,0x6f,0x73,0x65,0x64,0x20,0x63,0x6f,0x6e,0x73,0x74,0x72,0x75,0x63,0x74,0x69,0x6f,0x6e,0x42,0x72,0x6f,0x6b,0x65,0x6e,0x20,0x65,0x71,0x75,0x61,0x6c,0x73,0x20,0x6c,0x69,0x67,0x61,0x74,0x75,0x72,0x65,0x73,0x52,0x61,0x73,0x65,0x64,0x20,0x62,0x61,0x72,0x20,0x66,0x00,\r\n0x43,0x00,0x6f,0x00,0x70,0x00,0x79,0x00,0x72,0x00,0x69,0x00,0x67,0x00,0x68,0x00,0x74,0x00,0x20,0x00,0x32,0x00,0x30,0x00,0x32,0x00,0x30,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x65,0x00,0x20,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,\r\n0x6f,0x00,0x20,0x00,0x50,0x00,0x72,0x00,0x6f,0x00,0x6a,0x00,0x65,0x00,0x63,0x00,0x74,0x00,0x20,0x00,0x41,0x00,0x75,0x00,0x74,0x00,0x68,0x00,0x6f,0x00,0x72,0x00,0x73,0x00,0x20,0x00,0x28,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x67,0x00,0x69,0x00,0x74,0x00,0x68,0x00,0x75,0x00,\r\n0x62,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x2f,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2f,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x29,0x00,0x4a,0x00,0x65,0x00,\r\n0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x32,0x00,0x2e,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x3b,0x00,0x4a,0x00,0x42,0x00,0x3b,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,\r\n0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x2d,0x00,0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00,\r\n0x52,0x00,0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x32,0x00,0x2e,0x00,0x33,0x00,0x30,0x00,0x34,0x00,0x3b,0x00,0x20,0x00,0x74,0x00,0x74,0x00,0x66,0x00,0x61,0x00,0x75,0x00,0x74,0x00,0x6f,0x00,0x68,0x00,0x69,0x00,0x6e,0x00,\r\n0x74,0x00,0x20,0x00,0x28,0x00,0x76,0x00,0x31,0x00,0x2e,0x00,0x38,0x00,0x2e,0x00,0x34,0x00,0x2e,0x00,0x37,0x00,0x2d,0x00,0x35,0x00,0x64,0x00,0x35,0x00,0x62,0x00,0x29,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x2d,0x00,0x52,0x00,\r\n0x65,0x00,0x67,0x00,0x75,0x00,0x6c,0x00,0x61,0x00,0x72,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x4d,0x00,0x6f,0x00,0x6e,0x00,0x6f,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x74,0x00,0x72,0x00,0x61,0x00,0x64,0x00,0x65,0x00,0x6d,0x00,\r\n0x61,0x00,0x72,0x00,0x6b,0x00,0x20,0x00,0x6f,0x00,0x66,0x00,0x20,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x20,0x00,0x73,0x00,0x2e,0x00,0x72,0x00,0x2e,0x00,0x6f,0x00,0x2e,0x00,0x4a,0x00,0x65,0x00,0x74,0x00,0x42,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,\r\n0x50,0x00,0x68,0x00,0x69,0x00,0x6c,0x00,0x69,0x00,0x70,0x00,0x70,0x00,0x20,0x00,0x4e,0x00,0x75,0x00,0x72,0x00,0x75,0x00,0x6c,0x00,0x6c,0x00,0x69,0x00,0x6e,0x00,0x2c,0x00,0x20,0x00,0x4b,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x61,0x00,0x6e,0x00,0x74,0x00,0x69,0x00,0x6e,0x00,0x20,0x00,0x42,0x00,0x75,0x00,0x6c,0x00,\r\n0x65,0x00,0x6e,0x00,0x6b,0x00,0x6f,0x00,0x76,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x6a,0x00,0x65,0x00,0x74,0x00,0x62,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x68,0x00,0x74,0x00,\r\n0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x77,0x00,0x77,0x00,0x77,0x00,0x2e,0x00,0x6a,0x00,0x65,0x00,0x74,0x00,0x62,0x00,0x72,0x00,0x61,0x00,0x69,0x00,0x6e,0x00,0x73,0x00,0x2e,0x00,0x63,0x00,0x6f,0x00,0x6d,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,\r\n0x20,0x00,0x53,0x00,0x6f,0x00,0x66,0x00,0x74,0x00,0x77,0x00,0x61,0x00,0x72,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x75,0x00,0x6e,0x00,0x64,0x00,0x65,0x00,0x72,0x00,0x20,0x00,0x74,0x00,0x68,0x00,0x65,0x00,0x20,0x00,\r\n0x53,0x00,0x49,0x00,0x4c,0x00,0x20,0x00,0x4f,0x00,0x70,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x46,0x00,0x6f,0x00,0x6e,0x00,0x74,0x00,0x20,0x00,0x4c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x2c,0x00,0x20,0x00,0x56,0x00,0x65,0x00,0x72,0x00,0x73,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x20,0x00,0x31,0x00,\r\n0x2e,0x00,0x31,0x00,0x2e,0x00,0x20,0x00,0x54,0x00,0x68,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x63,0x00,0x65,0x00,0x6e,0x00,0x73,0x00,0x65,0x00,0x20,0x00,0x69,0x00,0x73,0x00,0x20,0x00,0x61,0x00,0x76,0x00,0x61,0x00,0x69,0x00,0x6c,0x00,0x61,0x00,0x62,0x00,0x6c,0x00,0x65,0x00,0x20,0x00,0x77,0x00,0x69,0x00,\r\n0x74,0x00,0x68,0x00,0x20,0x00,0x61,0x00,0x20,0x00,0x46,0x00,0x41,0x00,0x51,0x00,0x20,0x00,0x61,0x00,0x74,0x00,0x3a,0x00,0x20,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x73,0x00,0x2e,0x00,0x73,0x00,0x69,0x00,0x6c,0x00,\r\n0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,0x4f,0x00,0x46,0x00,0x4c,0x00,0x68,0x00,0x74,0x00,0x74,0x00,0x70,0x00,0x73,0x00,0x3a,0x00,0x2f,0x00,0x2f,0x00,0x73,0x00,0x63,0x00,0x72,0x00,0x69,0x00,0x70,0x00,0x74,0x00,0x73,0x00,0x2e,0x00,0x73,0x00,0x69,0x00,0x6c,0x00,0x2e,0x00,0x6f,0x00,0x72,0x00,0x67,0x00,0x2f,0x00,\r\n0x4f,0x00,0x46,0x00,0x4c,0x00,0x43,0x00,0x6c,0x00,0x61,0x00,0x73,0x00,0x73,0x00,0x69,0x00,0x63,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x43,0x00,0x6c,0x00,0x6f,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x63,0x00,0x6f,0x00,\r\n0x6e,0x00,0x73,0x00,0x74,0x00,0x72,0x00,0x75,0x00,0x63,0x00,0x74,0x00,0x69,0x00,0x6f,0x00,0x6e,0x00,0x42,0x00,0x72,0x00,0x6f,0x00,0x6b,0x00,0x65,0x00,0x6e,0x00,0x20,0x00,0x65,0x00,0x71,0x00,0x75,0x00,0x61,0x00,0x6c,0x00,0x73,0x00,0x20,0x00,0x6c,0x00,0x69,0x00,0x67,0x00,0x61,0x00,0x74,0x00,0x75,0x00,0x72,0x00,0x65,0x00,\r\n0x73,0x00,0x52,0x00,0x61,0x00,0x73,0x00,0x65,0x00,0x64,0x00,0x20,0x00,0x62,0x00,0x61,0x00,0x72,0x00,0x20,0x00,0x66,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x65,0x00,0x32,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xcf,0x00,0x00,0x00,0x24,0x00,0xc9,\r\n0x01,0x02,0x01,0x03,0x01,0x04,0x01,0x05,0x01,0x06,0x01,0x07,0x01,0x08,0x00,0xc7,0x01,0x09,0x01,0x0a,0x01,0x0b,0x01,0x0c,0x01,0x0d,0x00,0x62,0x01,0x0e,0x00,0xad,0x01,0x0f,0x01,0x10,0x01,0x11,0x00,0x63,0x00,0xae,0x00,0x90,0x01,0x12,0x00,0x25,0x00,0x26,0x00,0xfd,0x00,0xff,0x00,0x64,0x01,0x13,0x01,0x14,0x00,0x27,0x00,0xe9,\r\n0x01,0x15,0x01,0x16,0x00,0x28,0x00,0x65,0x01,0x17,0x01,0x18,0x00,0xc8,0x01,0x19,0x01,0x1a,0x01,0x1b,0x01,0x1c,0x01,0x1d,0x00,0xca,0x01,0x1e,0x01,0x1f,0x00,0xcb,0x01,0x20,0x01,0x21,0x01,0x22,0x01,0x23,0x01,0x24,0x00,0x29,0x00,0x2a,0x01,0x25,0x00,0xf8,0x01,0x26,0x01,0x27,0x01,0x28,0x01,0x29,0x00,0x2b,0x01,0x2a,0x01,0x2b,\r\n0x00,0x2c,0x00,0xcc,0x01,0x2c,0x00,0xcd,0x00,0xce,0x00,0xfa,0x01,0x2d,0x00,0xcf,0x01,0x2e,0x01,0x2f,0x01,0x30,0x01,0x31,0x00,0x2d,0x01,0x32,0x00,0x2e,0x01,0x33,0x00,0x2f,0x01,0x34,0x01,0x35,0x01,0x36,0x01,0x37,0x00,0xe2,0x00,0x30,0x00,0x31,0x01,0x38,0x01,0x39,0x01,0x3a,0x01,0x3b,0x00,0x66,0x00,0x32,0x00,0xd0,0x01,0x3c,\r\n0x00,0xd1,0x01,0x3d,0x01,0x3e,0x01,0x3f,0x01,0x40,0x01,0x41,0x00,0x67,0x01,0x42,0x00,0xd3,0x01,0x43,0x01,0x44,0x01,0x45,0x01,0x46,0x01,0x47,0x01,0x48,0x01,0x49,0x01,0x4a,0x01,0x4b,0x01,0x4c,0x00,0x91,0x01,0x4d,0x00,0xaf,0x00,0xb0,0x00,0x33,0x00,0xed,0x00,0x34,0x00,0x35,0x01,0x4e,0x01,0x4f,0x01,0x50,0x00,0x36,0x01,0x51,\r\n0x00,0xe4,0x00,0xfb,0x01,0x52,0x01,0x53,0x01,0x54,0x01,0x55,0x00,0x37,0x01,0x56,0x01,0x57,0x01,0x58,0x01,0x59,0x00,0x38,0x00,0xd4,0x01,0x5a,0x00,0xd5,0x00,0x68,0x01,0x5b,0x00,0xd6,0x01,0x5c,0x01,0x5d,0x01,0x5e,0x01,0x5f,0x01,0x60,0x01,0x61,0x01,0x62,0x01,0x63,0x01,0x64,0x01,0x65,0x01,0x66,0x01,0x67,0x00,0x39,0x00,0x3a,\r\n0x01,0x68,0x01,0x69,0x01,0x6a,0x01,0x6b,0x00,0x3b,0x00,0x3c,0x00,0xeb,0x01,0x6c,0x00,0xbb,0x01,0x6d,0x01,0x6e,0x01,0x6f,0x01,0x70,0x01,0x71,0x00,0x3d,0x01,0x72,0x00,0xe6,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0x79,0x01,0x7a,0x01,0x7b,0x00,0x44,0x00,0x69,0x01,0x7c,0x01,0x7d,0x01,0x7e,0x01,0x7f,\r\n0x01,0x80,0x01,0x81,0x01,0x82,0x00,0x6b,0x01,0x83,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x00,0x6c,0x01,0x88,0x00,0x6a,0x01,0x89,0x01,0x8a,0x01,0x8b,0x00,0x6e,0x00,0x6d,0x00,0xa0,0x01,0x8c,0x00,0x45,0x00,0x46,0x00,0xfe,0x01,0x00,0x00,0x6f,0x01,0x8d,0x01,0x8e,0x00,0x47,0x00,0xea,0x01,0x8f,0x01,0x01,0x00,0x48,0x00,0x70,\r\n0x01,0x90,0x01,0x91,0x00,0x72,0x01,0x92,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x00,0x73,0x01,0x97,0x01,0x98,0x00,0x71,0x01,0x99,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x00,0x49,0x00,0x4a,0x01,0x9e,0x00,0xf9,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0xa2,0x00,0x4b,0x01,0xa3,0x01,0xa4,0x00,0x4c,0x00,0xd7,0x00,0x74,0x01,0xa5,\r\n0x01,0xa6,0x00,0x76,0x00,0x77,0x01,0xa7,0x01,0xa8,0x00,0x75,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x00,0x4d,0x01,0xad,0x01,0xae,0x00,0x4e,0x01,0xaf,0x01,0xb0,0x00,0x4f,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,0x01,0xb5,0x00,0xe3,0x00,0x50,0x00,0x51,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x00,0x78,0x00,0x52,\r\n0x00,0x79,0x01,0xbb,0x01,0xbc,0x00,0x7b,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x00,0x7c,0x01,0xc2,0x00,0x7a,0x01,0xc3,0x01,0xc4,0x01,0xc5,0x01,0xc6,0x01,0xc7,0x01,0xc8,0x01,0xc9,0x01,0xca,0x01,0xcb,0x01,0xcc,0x00,0xa1,0x01,0xcd,0x00,0x7d,0x00,0xb1,0x00,0x53,0x00,0xee,0x00,0x54,0x00,0x55,0x01,0xce,0x01,0xcf,\r\n0x01,0xd0,0x00,0x56,0x01,0xd1,0x00,0xe5,0x00,0xfc,0x01,0xd2,0x01,0xd3,0x00,0x89,0x01,0xd4,0x00,0x57,0x01,0xd5,0x01,0xd6,0x01,0xd7,0x01,0xd8,0x00,0x58,0x00,0x7e,0x01,0xd9,0x01,0xda,0x00,0x80,0x00,0x81,0x01,0xdb,0x01,0xdc,0x01,0xdd,0x01,0xde,0x01,0xdf,0x00,0x7f,0x01,0xe0,0x01,0xe1,0x01,0xe2,0x01,0xe3,0x01,0xe4,0x01,0xe5,\r\n0x01,0xe6,0x01,0xe7,0x01,0xe8,0x01,0xe9,0x01,0xea,0x01,0xeb,0x00,0x59,0x00,0x5a,0x01,0xec,0x01,0xed,0x01,0xee,0x01,0xef,0x00,0x5b,0x00,0x5c,0x00,0xec,0x01,0xf0,0x00,0xba,0x01,0xf1,0x01,0xf2,0x01,0xf3,0x01,0xf4,0x01,0xf5,0x00,0x5d,0x01,0xf6,0x00,0xe7,0x01,0xf7,0x01,0xf8,0x01,0xf9,0x01,0xfa,0x01,0xfb,0x01,0xfc,0x01,0xfd,\r\n0x01,0xfe,0x01,0xff,0x02,0x00,0x02,0x01,0x02,0x02,0x02,0x03,0x02,0x04,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x09,0x02,0x0a,0x02,0x0b,0x02,0x0c,0x02,0x0d,0x02,0x0e,0x02,0x0f,0x02,0x10,0x02,0x11,0x02,0x12,0x02,0x13,0x02,0x14,0x02,0x15,0x02,0x16,0x02,0x17,0x02,0x18,0x02,0x19,0x02,0x1a,0x02,0x1b,0x02,0x1c,0x02,0x1d,\r\n0x02,0x1e,0x02,0x1f,0x02,0x20,0x02,0x21,0x02,0x22,0x02,0x23,0x02,0x24,0x02,0x25,0x02,0x26,0x02,0x27,0x02,0x28,0x02,0x29,0x02,0x2a,0x02,0x2b,0x02,0x2c,0x02,0x2d,0x02,0x2e,0x02,0x2f,0x02,0x30,0x02,0x31,0x02,0x32,0x02,0x33,0x02,0x34,0x02,0x35,0x02,0x36,0x02,0x37,0x02,0x38,0x02,0x39,0x02,0x3a,0x02,0x3b,0x02,0x3c,0x02,0x3d,\r\n0x02,0x3e,0x02,0x3f,0x02,0x40,0x00,0x9d,0x00,0x9e,0x02,0x41,0x02,0x42,0x02,0x43,0x02,0x44,0x02,0x45,0x02,0x46,0x02,0x47,0x02,0x48,0x02,0x49,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x4e,0x02,0x4f,0x02,0x50,0x02,0x51,0x02,0x52,0x02,0x53,0x02,0x54,0x02,0x55,0x02,0x56,0x02,0x57,0x02,0x58,0x02,0x59,0x02,0x5a,0x02,0x5b,\r\n0x02,0x5c,0x02,0x5d,0x02,0x5e,0x02,0x5f,0x02,0x60,0x02,0x61,0x02,0x62,0x02,0x63,0x02,0x64,0x02,0x65,0x02,0x66,0x02,0x67,0x02,0x68,0x02,0x69,0x02,0x6a,0x02,0x6b,0x02,0x6c,0x02,0x6d,0x02,0x6e,0x02,0x6f,0x02,0x70,0x02,0x71,0x02,0x72,0x02,0x73,0x02,0x74,0x02,0x75,0x02,0x76,0x02,0x77,0x02,0x78,0x02,0x79,0x02,0x7a,0x02,0x7b,\r\n0x02,0x7c,0x02,0x7d,0x02,0x7e,0x02,0x7f,0x02,0x80,0x02,0x81,0x02,0x82,0x02,0x83,0x02,0x84,0x02,0x85,0x02,0x86,0x02,0x87,0x02,0x88,0x02,0x89,0x02,0x8a,0x02,0x8b,0x02,0x8c,0x02,0x8d,0x02,0x8e,0x02,0x8f,0x02,0x90,0x02,0x91,0x02,0x92,0x02,0x93,0x02,0x94,0x02,0x95,0x02,0x96,0x02,0x97,0x02,0x98,0x02,0x99,0x02,0x9a,0x02,0x9b,\r\n0x02,0x9c,0x02,0x9d,0x02,0x9e,0x02,0x9f,0x02,0xa0,0x02,0xa1,0x02,0xa2,0x02,0xa3,0x02,0xa4,0x02,0xa5,0x02,0xa6,0x02,0xa7,0x02,0xa8,0x02,0xa9,0x02,0xaa,0x02,0xab,0x02,0xac,0x02,0xad,0x02,0xae,0x02,0xaf,0x02,0xb0,0x02,0xb1,0x02,0xb2,0x02,0xb3,0x02,0xb4,0x02,0xb5,0x02,0xb6,0x02,0xb7,0x02,0xb8,0x02,0xb9,0x02,0xba,0x02,0xbb,\r\n0x02,0xbc,0x02,0xbd,0x02,0xbe,0x02,0xbf,0x02,0xc0,0x02,0xc1,0x02,0xc2,0x02,0xc3,0x02,0xc4,0x02,0xc5,0x02,0xc6,0x02,0xc7,0x02,0xc8,0x02,0xc9,0x02,0xca,0x02,0xcb,0x02,0xcc,0x02,0xcd,0x02,0xce,0x02,0xcf,0x02,0xd0,0x02,0xd1,0x02,0xd2,0x02,0xd3,0x02,0xd4,0x02,0xd5,0x02,0xd6,0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02,0xdb,\r\n0x02,0xdc,0x02,0xdd,0x02,0xde,0x02,0xdf,0x02,0xe0,0x02,0xe1,0x02,0xe2,0x02,0xe3,0x02,0xe4,0x02,0xe5,0x02,0xe6,0x02,0xe7,0x02,0xe8,0x02,0xe9,0x02,0xea,0x02,0xeb,0x02,0xec,0x02,0xed,0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x02,0xf8,0x02,0xf9,0x02,0xfa,0x02,0xfb,\r\n0x02,0xfc,0x00,0x9b,0x02,0xfd,0x02,0xfe,0x02,0xff,0x03,0x00,0x03,0x01,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,0x03,0x0a,0x03,0x0b,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10,0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x03,0x18,0x03,0x19,0x03,0x1a,\r\n0x03,0x1b,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x03,0x20,0x03,0x21,0x03,0x22,0x03,0x23,0x03,0x24,0x03,0x25,0x03,0x26,0x03,0x27,0x03,0x28,0x03,0x29,0x03,0x2a,0x03,0x2b,0x03,0x2c,0x03,0x2d,0x03,0x2e,0x03,0x2f,0x03,0x30,0x03,0x31,0x03,0x32,0x03,0x33,0x03,0x34,0x03,0x35,0x03,0x36,0x03,0x37,0x03,0x38,0x03,0x39,0x03,0x3a,\r\n0x03,0x3b,0x03,0x3c,0x03,0x3d,0x03,0x3e,0x03,0x3f,0x03,0x40,0x03,0x41,0x03,0x42,0x03,0x43,0x03,0x44,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x49,0x03,0x4a,0x03,0x4b,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x1b,0x00,0x1c,0x03,0x4c,0x03,0x4d,0x03,0x4e,0x03,0x4f,0x03,0x50,\r\n0x03,0x51,0x03,0x52,0x03,0x53,0x03,0x54,0x03,0x55,0x03,0x56,0x03,0x57,0x03,0x58,0x03,0x59,0x03,0x5a,0x03,0x5b,0x03,0x5c,0x03,0x5d,0x03,0x5e,0x03,0x5f,0x03,0x60,0x03,0x61,0x03,0x62,0x03,0x63,0x03,0x64,0x03,0x65,0x03,0x66,0x03,0x67,0x03,0x68,0x03,0x69,0x03,0x6a,0x03,0x6b,0x03,0x6c,0x03,0x6d,0x03,0x6e,0x03,0x6f,0x03,0x70,\r\n0x03,0x71,0x03,0x72,0x03,0x73,0x03,0x74,0x03,0x75,0x03,0x76,0x03,0x77,0x03,0x78,0x03,0x79,0x03,0x7a,0x03,0x7b,0x03,0x7c,0x03,0x7d,0x03,0x7e,0x03,0x7f,0x03,0x80,0x03,0x81,0x03,0x82,0x03,0x83,0x03,0x84,0x03,0x85,0x03,0x86,0x03,0x87,0x03,0x88,0x03,0x89,0x03,0x8a,0x03,0x8b,0x03,0x8c,0x03,0x8d,0x00,0xbc,0x00,0xf4,0x00,0xf5,\r\n0x00,0xf6,0x03,0x8e,0x03,0x8f,0x03,0x90,0x03,0x91,0x03,0x92,0x00,0x11,0x00,0x0f,0x00,0x1d,0x00,0x1e,0x00,0xab,0x00,0x04,0x00,0xa3,0x00,0x22,0x00,0xa2,0x00,0xc3,0x00,0x87,0x00,0x0d,0x03,0x93,0x03,0x94,0x03,0x95,0x03,0x96,0x03,0x97,0x00,0x06,0x03,0x98,0x03,0x99,0x00,0x12,0x00,0x3f,0x03,0x9a,0x03,0x9b,0x03,0x9c,0x03,0x9d,\r\n0x00,0x0b,0x00,0x0c,0x00,0x5e,0x00,0x60,0x00,0x3e,0x00,0x40,0x03,0x9e,0x03,0x9f,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x03,0xa3,0x03,0xa4,0x03,0xa5,0x03,0xa6,0x03,0xa7,0x03,0xa8,0x03,0xa9,0x03,0xaa,0x03,0xab,0x00,0x10,0x03,0xac,0x00,0xb2,0x00,0xb3,0x03,0xad,0x00,0x42,0x00,0xc4,0x00,0xc5,0x00,0xb4,0x00,0xb5,0x00,0xb6,0x00,0xb7,\r\n0x03,0xae,0x03,0xaf,0x00,0xa9,0x00,0xaa,0x00,0xbe,0x00,0xbf,0x03,0xb0,0x00,0x05,0x00,0x0a,0x03,0xb1,0x03,0xb2,0x03,0xb3,0x03,0xb4,0x03,0xb5,0x03,0xb6,0x03,0xb7,0x03,0xb8,0x03,0xb9,0x03,0xba,0x03,0xbb,0x03,0xbc,0x03,0xbd,0x03,0xbe,0x03,0xbf,0x03,0xc0,0x03,0xc1,0x03,0xc2,0x03,0xc3,0x03,0xc4,0x03,0xc5,0x03,0xc6,0x03,0xc7,\r\n0x03,0xc8,0x03,0xc9,0x03,0xca,0x03,0xcb,0x03,0xcc,0x03,0xcd,0x03,0xce,0x03,0xcf,0x03,0xd0,0x03,0xd1,0x03,0xd2,0x03,0xd3,0x03,0xd4,0x03,0xd5,0x03,0xd6,0x03,0xd7,0x03,0xd8,0x03,0xd9,0x03,0xda,0x03,0xdb,0x03,0xdc,0x03,0xdd,0x03,0xde,0x03,0xdf,0x03,0xe0,0x03,0xe1,0x03,0xe2,0x03,0xe3,0x03,0xe4,0x03,0xe5,0x03,0xe6,0x03,0xe7,\r\n0x03,0xe8,0x03,0xe9,0x03,0xea,0x03,0xeb,0x03,0xec,0x03,0xed,0x03,0xee,0x03,0xef,0x03,0xf0,0x03,0xf1,0x03,0xf2,0x03,0xf3,0x03,0xf4,0x03,0xf5,0x03,0xf6,0x03,0xf7,0x03,0xf8,0x03,0xf9,0x03,0xfa,0x03,0xfb,0x03,0xfc,0x03,0xfd,0x03,0xfe,0x03,0xff,0x04,0x00,0x04,0x01,0x04,0x02,0x00,0x03,0x04,0x03,0x04,0x04,0x04,0x05,0x04,0x06,\r\n0x00,0x84,0x00,0xbd,0x00,0x07,0x04,0x07,0x04,0x08,0x00,0xa6,0x04,0x09,0x04,0x0a,0x00,0x85,0x04,0x0b,0x00,0x96,0x04,0x0c,0x04,0x0d,0x04,0x0e,0x04,0x0f,0x04,0x10,0x04,0x11,0x04,0x12,0x04,0x13,0x04,0x14,0x04,0x15,0x04,0x16,0x04,0x17,0x04,0x18,0x04,0x19,0x04,0x1a,0x04,0x1b,0x04,0x1c,0x04,0x1d,0x04,0x1e,0x04,0x1f,0x04,0x20,\r\n0x04,0x21,0x04,0x22,0x04,0x23,0x04,0x24,0x04,0x25,0x04,0x26,0x04,0x27,0x04,0x28,0x04,0x29,0x04,0x2a,0x04,0x2b,0x04,0x2c,0x04,0x2d,0x04,0x2e,0x04,0x2f,0x04,0x30,0x04,0x31,0x04,0x32,0x04,0x33,0x04,0x34,0x04,0x35,0x04,0x36,0x04,0x37,0x04,0x38,0x04,0x39,0x04,0x3a,0x04,0x3b,0x04,0x3c,0x04,0x3d,0x04,0x3e,0x04,0x3f,0x04,0x40,\r\n0x04,0x41,0x04,0x42,0x04,0x43,0x04,0x44,0x04,0x45,0x04,0x46,0x04,0x47,0x04,0x48,0x04,0x49,0x04,0x4a,0x04,0x4b,0x04,0x4c,0x04,0x4d,0x04,0x4e,0x04,0x4f,0x04,0x50,0x04,0x51,0x04,0x52,0x00,0x0e,0x00,0xef,0x00,0xf0,0x00,0xb8,0x00,0x20,0x00,0x8f,0x00,0x21,0x00,0x1f,0x00,0x95,0x00,0x94,0x00,0x93,0x00,0xa7,0x00,0xa4,0x00,0x61,\r\n0x00,0x41,0x00,0x92,0x04,0x53,0x04,0x54,0x04,0x55,0x04,0x56,0x04,0x57,0x00,0x9c,0x04,0x58,0x00,0x9a,0x00,0x99,0x00,0xa5,0x00,0x98,0x04,0x59,0x04,0x5a,0x04,0x5b,0x04,0x5c,0x04,0x5d,0x04,0x5e,0x04,0x5f,0x04,0x60,0x00,0x08,0x00,0xc6,0x04,0x61,0x04,0x62,0x04,0x63,0x04,0x64,0x04,0x65,0x04,0x66,0x04,0x67,0x04,0x68,0x04,0x69,\r\n0x04,0x6a,0x04,0x6b,0x04,0x6c,0x04,0x6d,0x04,0x6e,0x04,0x6f,0x04,0x70,0x04,0x71,0x04,0x72,0x04,0x73,0x04,0x74,0x04,0x75,0x04,0x76,0x04,0x77,0x04,0x78,0x04,0x79,0x04,0x7a,0x04,0x7b,0x04,0x7c,0x04,0x7d,0x04,0x7e,0x04,0x7f,0x04,0x80,0x04,0x81,0x04,0x82,0x04,0x83,0x04,0x84,0x04,0x85,0x04,0x86,0x04,0x87,0x04,0x88,0x04,0x89,\r\n0x04,0x8a,0x04,0x8b,0x04,0x8c,0x04,0x8d,0x04,0x8e,0x04,0x8f,0x04,0x90,0x04,0x91,0x04,0x92,0x04,0x93,0x04,0x94,0x04,0x95,0x04,0x96,0x04,0x97,0x04,0x98,0x04,0x99,0x04,0x9a,0x04,0x9b,0x04,0x9c,0x04,0x9d,0x04,0x9e,0x04,0x9f,0x04,0xa0,0x04,0xa1,0x04,0xa2,0x04,0xa3,0x04,0xa4,0x04,0xa5,0x04,0xa6,0x04,0xa7,0x04,0xa8,0x04,0xa9,\r\n0x04,0xaa,0x04,0xab,0x04,0xac,0x04,0xad,0x04,0xae,0x04,0xaf,0x04,0xb0,0x04,0xb1,0x04,0xb2,0x04,0xb3,0x04,0xb4,0x04,0xb5,0x04,0xb6,0x04,0xb7,0x04,0xb8,0x04,0xb9,0x04,0xba,0x04,0xbb,0x04,0xbc,0x04,0xbd,0x04,0xbe,0x04,0xbf,0x04,0xc0,0x04,0xc1,0x04,0xc2,0x04,0xc3,0x04,0xc4,0x04,0xc5,0x04,0xc6,0x04,0xc7,0x04,0xc8,0x04,0xc9,\r\n0x04,0xca,0x04,0xcb,0x04,0xcc,0x04,0xcd,0x04,0xce,0x04,0xcf,0x04,0xd0,0x04,0xd1,0x04,0xd2,0x04,0xd3,0x04,0xd4,0x04,0xd5,0x04,0xd6,0x04,0xd7,0x04,0xd8,0x04,0xd9,0x04,0xda,0x04,0xdb,0x04,0xdc,0x04,0xdd,0x04,0xde,0x04,0xdf,0x04,0xe0,0x04,0xe1,0x04,0xe2,0x04,0xe3,0x04,0xe4,0x04,0xe5,0x04,0xe6,0x04,0xe7,0x04,0xe8,0x04,0xe9,\r\n0x04,0xea,0x04,0xeb,0x04,0xec,0x04,0xed,0x00,0xb9,0x04,0xee,0x04,0xef,0x04,0xf0,0x04,0xf1,0x04,0xf2,0x04,0xf3,0x04,0xf4,0x04,0xf5,0x04,0xf6,0x04,0xf7,0x04,0xf8,0x04,0xf9,0x04,0xfa,0x04,0xfb,0x04,0xfc,0x04,0xfd,0x04,0xfe,0x04,0xff,0x05,0x00,0x05,0x01,0x05,0x02,0x05,0x03,0x05,0x04,0x05,0x05,0x05,0x06,0x05,0x07,0x05,0x08,\r\n0x05,0x09,0x05,0x0a,0x05,0x0b,0x05,0x0c,0x05,0x0d,0x05,0x0e,0x05,0x0f,0x05,0x10,0x05,0x11,0x05,0x12,0x05,0x13,0x05,0x14,0x05,0x15,0x05,0x16,0x05,0x17,0x05,0x18,0x05,0x19,0x05,0x1a,0x05,0x1b,0x05,0x1c,0x05,0x1d,0x05,0x1e,0x05,0x1f,0x05,0x20,0x05,0x21,0x05,0x22,0x05,0x23,0x05,0x24,0x05,0x25,0x05,0x26,0x05,0x27,0x05,0x28,\r\n0x05,0x29,0x05,0x2a,0x05,0x2b,0x05,0x2c,0x05,0x2d,0x05,0x2e,0x05,0x2f,0x05,0x30,0x05,0x31,0x05,0x32,0x05,0x33,0x05,0x34,0x05,0x35,0x05,0x36,0x05,0x37,0x05,0x38,0x05,0x39,0x05,0x3a,0x05,0x3b,0x05,0x3c,0x05,0x3d,0x05,0x3e,0x05,0x3f,0x05,0x40,0x05,0x41,0x05,0x42,0x05,0x43,0x05,0x44,0x05,0x45,0x05,0x46,0x05,0x47,0x05,0x48,\r\n0x05,0x49,0x05,0x4a,0x05,0x4b,0x05,0x4c,0x05,0x4d,0x05,0x4e,0x05,0x4f,0x05,0x50,0x05,0x51,0x05,0x52,0x05,0x53,0x05,0x54,0x05,0x55,0x05,0x56,0x05,0x57,0x05,0x58,0x05,0x59,0x05,0x5a,0x05,0x5b,0x05,0x5c,0x05,0x5d,0x05,0x5e,0x05,0x5f,0x05,0x60,0x05,0x61,0x05,0x62,0x05,0x63,0x05,0x64,0x05,0x65,0x05,0x66,0x05,0x67,0x05,0x68,\r\n0x05,0x69,0x05,0x6a,0x05,0x6b,0x05,0x6c,0x05,0x6d,0x05,0x6e,0x05,0x6f,0x05,0x70,0x05,0x71,0x05,0x72,0x05,0x73,0x05,0x74,0x05,0x75,0x05,0x76,0x05,0x77,0x05,0x78,0x05,0x79,0x05,0x7a,0x05,0x7b,0x05,0x7c,0x05,0x7d,0x05,0x7e,0x05,0x7f,0x05,0x80,0x05,0x81,0x05,0x82,0x05,0x83,0x05,0x84,0x05,0x85,0x05,0x86,0x05,0x87,0x05,0x88,\r\n0x05,0x89,0x05,0x8a,0x05,0x8b,0x05,0x8c,0x05,0x8d,0x05,0x8e,0x05,0x8f,0x05,0x90,0x05,0x91,0x05,0x92,0x05,0x93,0x05,0x94,0x05,0x95,0x05,0x96,0x05,0x97,0x05,0x98,0x05,0x99,0x05,0x9a,0x05,0x9b,0x05,0x9c,0x05,0x9d,0x05,0x9e,0x05,0x9f,0x05,0xa0,0x05,0xa1,0x05,0xa2,0x05,0xa3,0x05,0xa4,0x05,0xa5,0x05,0xa6,0x05,0xa7,0x05,0xa8,\r\n0x05,0xa9,0x05,0xaa,0x05,0xab,0x05,0xac,0x05,0xad,0x05,0xae,0x05,0xaf,0x05,0xb0,0x05,0xb1,0x05,0xb2,0x05,0xb3,0x05,0xb4,0x05,0xb5,0x05,0xb6,0x05,0xb7,0x05,0xb8,0x05,0xb9,0x05,0xba,0x05,0xbb,0x05,0xbc,0x05,0xbd,0x05,0xbe,0x05,0xbf,0x05,0xc0,0x05,0xc1,0x05,0xc2,0x05,0xc3,0x05,0xc4,0x05,0xc5,0x05,0xc6,0x05,0xc7,0x05,0xc8,\r\n0x05,0xc9,0x05,0xca,0x05,0xcb,0x05,0xcc,0x05,0xcd,0x05,0xce,0x05,0xcf,0x05,0xd0,0x05,0xd1,0x05,0xd2,0x05,0xd3,0x05,0xd4,0x05,0xd5,0x05,0xd6,0x05,0xd7,0x05,0xd8,0x05,0xd9,0x00,0x23,0x00,0x09,0x00,0x88,0x00,0x86,0x00,0x8b,0x00,0x8a,0x00,0x8c,0x00,0x83,0x05,0xda,0x05,0xdb,0x00,0x5f,0x00,0xe8,0x00,0x82,0x05,0xdc,0x00,0xc2,\r\n0x05,0xdd,0x05,0xde,0x05,0xdf,0x05,0xe0,0x05,0xe1,0x05,0xe2,0x05,0xe3,0x05,0xe4,0x05,0xe5,0x05,0xe6,0x05,0xe7,0x05,0xe8,0x05,0xe9,0x05,0xea,0x05,0xeb,0x05,0xec,0x05,0xed,0x05,0xee,0x05,0xef,0x05,0xf0,0x05,0xf1,0x05,0xf2,0x05,0xf3,0x05,0xf4,0x05,0xf5,0x05,0xf6,0x05,0xf7,0x05,0xf8,0x05,0xf9,0x05,0xfa,0x05,0xfb,0x05,0xfc,\r\n0x05,0xfd,0x05,0xfe,0x05,0xff,0x06,0x00,0x06,0x01,0x06,0x02,0x06,0x03,0x06,0x04,0x06,0x05,0x06,0x06,0x06,0x07,0x06,0x08,0x06,0x09,0x06,0x0a,0x06,0x0b,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x06,0x0f,0x06,0x10,0x06,0x11,0x06,0x12,0x06,0x13,0x06,0x14,0x06,0x15,0x06,0x16,0x06,0x17,0x06,0x18,0x06,0x19,0x06,0x1a,0x06,0x1b,0x06,0x1c,\r\n0x06,0x1d,0x06,0x1e,0x06,0x1f,0x06,0x20,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x25,0x06,0x26,0x06,0x27,0x06,0x28,0x06,0x29,0x06,0x2a,0x06,0x2b,0x06,0x2c,0x06,0x2d,0x06,0x2e,0x06,0x2f,0x06,0x30,0x06,0x31,0x06,0x32,0x06,0x33,0x06,0x34,0x06,0x35,0x06,0x36,0x06,0x37,0x06,0x38,0x06,0x39,0x06,0x3a,0x06,0x3b,0x06,0x3c,\r\n0x06,0x3d,0x06,0x3e,0x06,0x3f,0x06,0x40,0x06,0x41,0x06,0x42,0x06,0x43,0x06,0x44,0x06,0x45,0x06,0x46,0x06,0x47,0x06,0x48,0x06,0x49,0x06,0x4a,0x06,0x4b,0x06,0x4c,0x06,0x4d,0x06,0x4e,0x06,0x4f,0x06,0x50,0x06,0x51,0x06,0x52,0x06,0x53,0x06,0x54,0x06,0x55,0x06,0x56,0x06,0x57,0x06,0x58,0x06,0x59,0x06,0x5a,0x06,0x5b,0x06,0x5c,\r\n0x06,0x5d,0x06,0x5e,0x06,0x5f,0x06,0x60,0x06,0x61,0x06,0x62,0x06,0x63,0x06,0x64,0x06,0x65,0x06,0x66,0x06,0x67,0x06,0x68,0x06,0x69,0x06,0x6a,0x06,0x6b,0x06,0x6c,0x06,0x6d,0x06,0x6e,0x06,0x6f,0x06,0x70,0x06,0x71,0x06,0x72,0x06,0x73,0x06,0x74,0x06,0x75,0x06,0x76,0x06,0x77,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x7c,\r\n0x06,0x7d,0x06,0x7e,0x06,0x7f,0x06,0x80,0x06,0x81,0x06,0x82,0x06,0x83,0x06,0x84,0x06,0x85,0x06,0x86,0x06,0x87,0x06,0x88,0x06,0x89,0x06,0x8a,0x06,0x8b,0x06,0x8c,0x06,0x8d,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x00,0x8e,0x00,0xdc,0x00,0x43,\r\n0x00,0x8d,0x00,0xdf,0x00,0xd8,0x00,0xe1,0x00,0xdb,0x00,0xdd,0x00,0xd9,0x00,0xda,0x00,0xde,0x00,0xe0,0x06,0x9a,0x06,0x9b,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa3,0x06,0xa4,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,\r\n0x06,0xb0,0x06,0xb1,0x06,0xb2,0x06,0xb3,0x06,0xb4,0x06,0xb5,0x06,0xb6,0x06,0xb7,0x06,0xb8,0x06,0xb9,0x06,0xba,0x06,0xbb,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x06,0xc4,0x06,0xc5,0x06,0xc6,0x06,0xc7,0x06,0xc8,0x06,0xc9,0x06,0xca,0x06,0xcb,0x06,0xcc,0x06,0xcd,0x06,0xce,0x06,0xcf,\r\n0x06,0xd0,0x06,0xd1,0x06,0xd2,0x06,0xd3,0x06,0xd4,0x06,0xd5,0x06,0xd6,0x06,0xd7,0x06,0xd8,0x06,0xd9,0x06,0xda,0x06,0xdb,0x06,0x41,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x32,0x07,\r\n0x75,0x6e,0x69,0x31,0x45,0x42,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x30,0x07,\r\n0x75,0x6e,0x69,0x31,0x45,0x41,0x32,0x07,0x41,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x41,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x41,0x45,0x61,0x63,0x75,0x74,0x65,0x0b,0x43,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x43,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x44,0x63,0x61,0x72,0x6f,0x6e,0x06,0x44,0x63,\r\n0x72,0x6f,0x61,0x74,0x06,0x45,0x62,0x72,0x65,0x76,0x65,0x06,0x45,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x34,0x0a,0x45,0x64,0x6f,0x74,0x61,\r\n0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x41,0x07,0x45,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x45,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x34,0x06,0x47,0x63,\r\n0x61,0x72,0x6f,0x6e,0x0b,0x47,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x32,0x32,0x0a,0x47,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x04,0x48,0x62,0x61,0x72,0x0b,0x48,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x49,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,\r\n0x45,0x43,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x38,0x07,0x49,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x49,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x49,0x74,0x69,0x6c,0x64,0x65,0x0b,0x4a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x36,0x06,0x4c,0x61,0x63,0x75,0x74,0x65,0x06,0x4c,0x63,\r\n0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x42,0x04,0x4c,0x64,0x6f,0x74,0x06,0x4e,0x61,0x63,0x75,0x74,0x65,0x06,0x4e,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x34,0x35,0x03,0x45,0x6e,0x67,0x06,0x4f,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,\r\n0x44,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x45,0x05,0x4f,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x32,\r\n0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x30,0x0d,0x4f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x4f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x41,0x0b,0x4f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75,\r\n0x74,0x65,0x06,0x52,0x61,0x63,0x75,0x74,0x65,0x06,0x52,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x35,0x36,0x06,0x53,0x61,0x63,0x75,0x74,0x65,0x0b,0x53,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x39,0x45,0x07,0x75,0x6e,0x69,0x30,\r\n0x31,0x38,0x46,0x04,0x54,0x62,0x61,0x72,0x06,0x54,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x36,0x32,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x41,0x06,0x55,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x34,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x36,0x05,0x55,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,\r\n0x31,0x45,0x45,0x38,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x30,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x41,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x43,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x45,0x0d,0x55,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x55,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x55,0x6f,0x67,0x6f,0x6e,\r\n0x65,0x6b,0x05,0x55,0x72,0x69,0x6e,0x67,0x06,0x55,0x74,0x69,0x6c,0x64,0x65,0x06,0x57,0x61,0x63,0x75,0x74,0x65,0x0b,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x09,0x57,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x06,0x57,0x67,0x72,0x61,0x76,0x65,0x0b,0x59,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,\r\n0x75,0x6e,0x69,0x31,0x45,0x46,0x34,0x06,0x59,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x36,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x38,0x06,0x5a,0x61,0x63,0x75,0x74,0x65,0x0a,0x5a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x57,0x2e,0x63,0x76,0x30,0x37,0x0b,\r\n0x57,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x37,0x10,0x57,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x37,0x0e,0x57,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x30,0x37,0x0b,0x57,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x30,0x37,0x06,0x4b,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,\r\n0x6e,0x69,0x30,0x31,0x33,0x36,0x2e,0x63,0x76,0x30,0x38,0x06,0x51,0x2e,0x63,0x76,0x31,0x36,0x06,0x61,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,\r\n0x35,0x07,0x75,0x6e,0x69,0x30,0x31,0x43,0x45,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x41,\r\n0x33,0x07,0x61,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x61,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x61,0x65,0x61,0x63,0x75,0x74,0x65,0x0b,0x63,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x0a,0x63,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x06,0x64,0x63,0x61,0x72,0x6f,0x6e,0x06,0x65,0x62,0x72,0x65,0x76,0x65,0x06,0x65,\r\n0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x35,0x0a,0x65,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x39,\r\n0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x42,0x07,0x65,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x65,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x07,0x75,0x6e,0x69,0x31,0x45,0x42,0x44,0x07,0x75,0x6e,0x69,0x30,0x32,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x06,0x67,0x63,0x61,0x72,0x6f,0x6e,0x0b,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,\r\n0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x31,0x32,0x33,0x0a,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x04,0x68,0x62,0x61,0x72,0x0b,0x68,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x06,0x69,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x30,0x09,0x69,0x2e,0x6c,0x6f,0x63,0x6c,0x54,0x52,0x4b,\r\n0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x39,0x07,0x69,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x06,0x69,0x74,0x69,0x6c,0x64,0x65,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x37,0x0b,0x6a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,\r\n0x31,0x33,0x37,0x0c,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,0x06,0x6c,0x61,0x63,0x75,0x74,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x39,0x42,0x06,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x33,0x43,0x04,0x6c,0x64,0x6f,0x74,0x06,0x6e,0x61,0x63,0x75,0x74,0x65,0x0b,0x6e,0x61,0x70,0x6f,0x73,\r\n0x74,0x72,0x6f,0x70,0x68,0x65,0x06,0x6e,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x34,0x36,0x03,0x65,0x6e,0x67,0x06,0x6f,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x32,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x33,\r\n0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x37,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x43,0x46,0x05,0x6f,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x44,0x44,0x07,0x75,\r\n0x6e,0x69,0x31,0x45,0x44,0x46,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x31,0x0d,0x6f,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x6f,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x45,0x42,0x0b,0x6f,0x73,0x6c,0x61,0x73,0x68,0x61,0x63,0x75,0x74,0x65,0x06,0x72,0x61,0x63,0x75,0x74,0x65,0x06,\r\n0x72,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,0x31,0x35,0x37,0x06,0x73,0x61,0x63,0x75,0x74,0x65,0x0b,0x73,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x39,0x05,0x6c,0x6f,0x6e,0x67,0x73,0x04,0x74,0x62,0x61,0x72,0x06,0x74,0x63,0x61,0x72,0x6f,0x6e,0x07,0x75,0x6e,0x69,0x30,\r\n0x31,0x36,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x31,0x42,0x06,0x75,0x62,0x72,0x65,0x76,0x65,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x34,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x41,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x31,0x44,0x36,0x07,0x75,0x6e,0x69,0x31,0x45,\r\n0x45,0x35,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x05,0x75,0x68,0x6f,0x72,0x6e,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x07,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x0d,0x75,0x68,0x75,0x6e,0x67,0x61,0x72,\r\n0x75,0x6d,0x6c,0x61,0x75,0x74,0x07,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x07,0x75,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x05,0x75,0x72,0x69,0x6e,0x67,0x06,0x75,0x74,0x69,0x6c,0x64,0x65,0x06,0x77,0x61,0x63,0x75,0x74,0x65,0x0b,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x09,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,\r\n0x06,0x77,0x67,0x72,0x61,0x76,0x65,0x0b,0x79,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x06,0x79,0x67,0x72,0x61,0x76,0x65,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x07,0x75,0x6e,0x69,0x30,0x32,0x33,0x33,0x07,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x06,0x7a,0x61,0x63,0x75,0x74,\r\n0x65,0x0a,0x7a,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x0f,0x67,0x65,0x72,0x6d,0x61,0x6e,0x64,0x62,0x6c,0x73,0x2e,0x63,0x61,0x6c,0x74,0x06,0x6c,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x31,0x0c,0x75,0x6e,0x69,0x30,\r\n0x31,0x33,0x43,0x2e,0x63,0x76,0x30,0x31,0x09,0x6c,0x64,0x6f,0x74,0x2e,0x63,0x76,0x30,0x31,0x0b,0x6c,0x73,0x6c,0x61,0x73,0x68,0x2e,0x63,0x76,0x30,0x31,0x06,0x74,0x2e,0x63,0x76,0x30,0x32,0x09,0x74,0x62,0x61,0x72,0x2e,0x63,0x76,0x30,0x32,0x0b,0x74,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x32,0x0c,0x75,0x6e,0x69,0x30,\r\n0x31,0x36,0x33,0x2e,0x63,0x76,0x30,0x32,0x0c,0x75,0x6e,0x69,0x30,0x32,0x31,0x42,0x2e,0x63,0x76,0x30,0x32,0x06,0x67,0x2e,0x63,0x76,0x30,0x33,0x0c,0x75,0x6e,0x69,0x30,0x31,0x46,0x35,0x2e,0x63,0x76,0x30,0x33,0x0b,0x67,0x62,0x72,0x65,0x76,0x65,0x2e,0x63,0x76,0x30,0x33,0x0b,0x67,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,\r\n0x33,0x10,0x67,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x33,0x0c,0x75,0x6e,0x69,0x30,0x31,0x32,0x33,0x2e,0x63,0x76,0x30,0x33,0x0f,0x67,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x2e,0x63,0x76,0x30,0x33,0x06,0x6a,0x2e,0x63,0x76,0x30,0x34,0x0c,0x75,0x6e,0x69,0x30,0x32,0x33,0x37,0x2e,0x63,\r\n0x76,0x30,0x34,0x10,0x6a,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,0x34,0x06,0x6c,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x30,0x35,0x0c,0x75,0x6e,0x69,0x30,0x31,0x33,0x43,0x2e,0x63,0x76,0x30,0x35,\r\n0x09,0x6c,0x64,0x6f,0x74,0x2e,0x63,0x76,0x30,0x35,0x0b,0x6c,0x73,0x6c,0x61,0x73,0x68,0x2e,0x63,0x76,0x30,0x35,0x06,0x6d,0x2e,0x63,0x76,0x30,0x36,0x06,0x77,0x2e,0x63,0x76,0x30,0x37,0x0b,0x77,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x30,0x37,0x10,0x77,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x30,\r\n0x37,0x0e,0x77,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x30,0x37,0x0b,0x77,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x30,0x37,0x06,0x6b,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x31,0x33,0x37,0x2e,0x63,0x76,0x30,0x38,0x11,0x6b,0x67,0x72,0x65,0x65,0x6e,0x6c,0x61,0x6e,0x64,0x69,0x63,0x2e,0x63,0x76,\r\n0x30,0x38,0x06,0x66,0x2e,0x63,0x76,0x30,0x39,0x06,0x72,0x2e,0x63,0x76,0x31,0x30,0x0b,0x72,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x30,0x0b,0x72,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x31,0x30,0x0c,0x75,0x6e,0x69,0x30,0x31,0x35,0x37,0x2e,0x63,0x76,0x31,0x30,0x06,0x79,0x2e,0x63,0x76,0x31,0x31,0x0b,0x79,0x61,0x63,\r\n0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x31,0x10,0x79,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x31,0x31,0x0e,0x79,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x35,0x2e,0x63,0x76,0x31,0x31,0x0b,0x79,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x31,\r\n0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x37,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x32,0x33,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x39,0x2e,0x63,0x76,0x31,0x31,0x06,0x75,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x62,0x72,0x65,\r\n0x76,0x65,0x2e,0x63,0x76,0x31,0x32,0x10,0x75,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x76,0x31,0x32,0x0e,0x75,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x35,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x76,0x31,0x32,\r\n0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x37,0x2e,0x63,0x76,0x31,0x32,0x0a,0x75,0x68,0x6f,0x72,0x6e,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x39,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x46,0x31,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x42,0x2e,0x63,0x76,0x31,0x32,0x0c,\r\n0x75,0x6e,0x69,0x31,0x45,0x45,0x44,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6e,0x69,0x31,0x45,0x45,0x46,0x2e,0x63,0x76,0x31,0x32,0x12,0x75,0x68,0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x2e,0x63,0x76,0x31,0x32,0x0c,0x75,0x6f,0x67,0x6f,0x6e,0x65,\r\n0x6b,0x2e,0x63,0x76,0x31,0x32,0x0a,0x75,0x72,0x69,0x6e,0x67,0x2e,0x63,0x76,0x31,0x32,0x0b,0x75,0x74,0x69,0x6c,0x64,0x65,0x2e,0x63,0x76,0x31,0x32,0x06,0x66,0x2e,0x63,0x76,0x31,0x37,0x0b,0x66,0x2e,0x63,0x76,0x30,0x39,0x2e,0x73,0x73,0x32,0x30,0x06,0x66,0x2e,0x73,0x73,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x30,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x31,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x31,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x31,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x43,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x31,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x31,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x45,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x32,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x43,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x32,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x36,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x30,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x32,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x41,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x45,0x07,\r\n0x75,0x6e,0x69,0x30,0x34,0x45,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x34,0x0c,0x75,0x6e,0x69,0x30,0x34,0x31,0x36,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x31,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x30,\r\n0x43,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x39,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x32,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x30,0x45,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x32,0x31,0x2e,0x63,0x76,0x39,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x33,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x35,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x33,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x33,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x30,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x35,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x34,0x43,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x41,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x34,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x35,0x36,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x38,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x45,0x07,0x75,0x6e,0x69,0x30,0x34,0x34,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x35,0x32,0x07,0x75,0x6e,0x69,0x30,0x34,0x39,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x39,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x33,0x07,0x75,0x6e,0x69,0x30,0x34,0x41,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x31,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x42,0x42,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x44,0x44,0x07,0x75,0x6e,0x69,0x30,0x34,\r\n0x44,0x46,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x35,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x37,0x07,0x75,0x6e,0x69,0x30,0x34,0x45,0x39,0x07,0x75,0x6e,0x69,0x30,0x34,0x46,0x35,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x38,0x2e,0x63,0x76,0x30,0x34,0x0c,0x75,0x6e,0x69,0x30,0x34,0x33,0x36,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,\r\n0x30,0x34,0x33,0x41,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x43,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x39,0x42,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x34,0x34,0x33,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,0x69,0x30,0x34,0x35,0x45,0x2e,0x63,0x76,0x31,0x31,0x0c,0x75,0x6e,\r\n0x69,0x30,0x34,0x34,0x31,0x2e,0x63,0x76,0x39,0x39,0x05,0x41,0x6c,0x70,0x68,0x61,0x04,0x42,0x65,0x74,0x61,0x05,0x47,0x61,0x6d,0x6d,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x39,0x34,0x07,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x5a,0x65,0x74,0x61,0x03,0x45,0x74,0x61,0x05,0x54,0x68,0x65,0x74,0x61,0x04,0x49,0x6f,0x74,0x61,0x05,\r\n0x4b,0x61,0x70,0x70,0x61,0x06,0x4c,0x61,0x6d,0x62,0x64,0x61,0x02,0x4d,0x75,0x02,0x4e,0x75,0x02,0x58,0x69,0x07,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x02,0x50,0x69,0x03,0x52,0x68,0x6f,0x05,0x53,0x69,0x67,0x6d,0x61,0x03,0x54,0x61,0x75,0x07,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x50,0x68,0x69,0x03,0x43,0x68,0x69,0x03,0x50,\r\n0x73,0x69,0x07,0x75,0x6e,0x69,0x30,0x33,0x41,0x39,0x0a,0x41,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x45,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x45,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x09,0x49,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x4f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x74,0x6f,0x6e,\r\n0x6f,0x73,0x0c,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x4f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x49,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x0f,0x55,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x43,0x46,0x0a,\r\n0x4b,0x61,0x70,0x70,0x61,0x2e,0x63,0x76,0x30,0x38,0x0c,0x75,0x6e,0x69,0x30,0x33,0x43,0x46,0x2e,0x63,0x76,0x30,0x38,0x05,0x61,0x6c,0x70,0x68,0x61,0x04,0x62,0x65,0x74,0x61,0x05,0x67,0x61,0x6d,0x6d,0x61,0x05,0x64,0x65,0x6c,0x74,0x61,0x07,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x04,0x7a,0x65,0x74,0x61,0x03,0x65,0x74,0x61,0x05,\r\n0x74,0x68,0x65,0x74,0x61,0x04,0x69,0x6f,0x74,0x61,0x05,0x6b,0x61,0x70,0x70,0x61,0x06,0x6c,0x61,0x6d,0x62,0x64,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x42,0x43,0x02,0x6e,0x75,0x02,0x78,0x69,0x07,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e,0x03,0x72,0x68,0x6f,0x07,0x75,0x6e,0x69,0x30,0x33,0x43,0x32,0x05,0x73,0x69,0x67,0x6d,0x61,0x03,\r\n0x74,0x61,0x75,0x07,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x03,0x70,0x68,0x69,0x03,0x63,0x68,0x69,0x03,0x70,0x73,0x69,0x05,0x6f,0x6d,0x65,0x67,0x61,0x09,0x69,0x6f,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x11,0x69,0x6f,0x74,0x61,0x64,0x69,0x65,0x72,0x65,0x73,0x69,\r\n0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x0f,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x14,0x75,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x6f,0x6d,0x69,0x63,0x72,0x6f,0x6e,\r\n0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x6f,0x6d,0x65,0x67,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x61,0x6c,0x70,0x68,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x0c,0x65,0x70,0x73,0x69,0x6c,0x6f,0x6e,0x74,0x6f,0x6e,0x6f,0x73,0x08,0x65,0x74,0x61,0x74,0x6f,0x6e,0x6f,0x73,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,\r\n0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x44,0x36,0x0a,0x6b,0x61,0x70,0x70,0x61,0x2e,0x63,0x76,0x30,0x38,0x0a,0x67,0x61,0x6d,0x6d,0x61,0x2e,0x63,0x76,0x31,0x31,0x0b,0x6c,0x61,0x6d,0x62,0x64,0x61,0x2e,0x63,0x76,0x31,0x31,0x06,0x75,0x31,0x36,0x39,0x31,0x30,0x06,0x75,0x31,0x44,0x35,0x33,0x38,0x06,0x75,0x31,0x44,0x35,0x33,0x39,\r\n0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x32,0x06,0x75,0x31,0x44,0x35,0x33,0x42,0x06,0x75,0x31,0x44,0x35,0x33,0x43,0x06,0x75,0x31,0x44,0x35,0x33,0x44,0x06,0x75,0x31,0x44,0x35,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x30,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x30,0x06,0x75,0x31,0x44,0x35,0x34,0x31,0x06,0x75,0x31,0x44,0x35,0x34,\r\n0x32,0x06,0x75,0x31,0x44,0x35,0x34,0x33,0x06,0x75,0x31,0x44,0x35,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x35,0x06,0x75,0x31,0x44,0x35,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x41,0x06,0x75,0x31,\r\n0x44,0x35,0x34,0x42,0x06,0x75,0x31,0x44,0x35,0x34,0x43,0x06,0x75,0x31,0x44,0x35,0x34,0x44,0x06,0x75,0x31,0x44,0x35,0x34,0x45,0x06,0x75,0x31,0x44,0x35,0x34,0x46,0x06,0x75,0x31,0x44,0x35,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x32,0x34,0x06,0x75,0x31,0x44,0x35,0x35,0x32,0x06,0x75,0x31,0x44,0x35,0x35,0x33,0x06,0x75,0x31,\r\n0x44,0x35,0x35,0x34,0x06,0x75,0x31,0x44,0x35,0x35,0x35,0x06,0x75,0x31,0x44,0x35,0x35,0x36,0x06,0x75,0x31,0x44,0x35,0x35,0x37,0x06,0x75,0x31,0x44,0x35,0x35,0x38,0x06,0x75,0x31,0x44,0x35,0x35,0x39,0x06,0x75,0x31,0x44,0x35,0x35,0x41,0x06,0x75,0x31,0x44,0x35,0x35,0x42,0x06,0x75,0x31,0x44,0x35,0x35,0x43,0x06,0x75,0x31,0x44,\r\n0x35,0x35,0x44,0x06,0x75,0x31,0x44,0x35,0x35,0x45,0x06,0x75,0x31,0x44,0x35,0x35,0x46,0x06,0x75,0x31,0x44,0x35,0x36,0x30,0x06,0x75,0x31,0x44,0x35,0x36,0x31,0x06,0x75,0x31,0x44,0x35,0x36,0x32,0x06,0x75,0x31,0x44,0x35,0x36,0x33,0x06,0x75,0x31,0x44,0x35,0x36,0x34,0x06,0x75,0x31,0x44,0x35,0x36,0x35,0x06,0x75,0x31,0x44,0x35,\r\n0x36,0x36,0x06,0x75,0x31,0x44,0x35,0x36,0x37,0x06,0x75,0x31,0x44,0x35,0x36,0x38,0x06,0x75,0x31,0x44,0x35,0x36,0x39,0x06,0x75,0x31,0x44,0x35,0x36,0x41,0x06,0x75,0x31,0x44,0x35,0x36,0x42,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x7a,0x65,0x72,0x6f,0x08,0x74,0x77,0x6f,0x2e,0x63,0x76,0x31,0x38,0x08,0x73,0x69,0x78,0x2e,0x63,0x76,0x31,\r\n0x38,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x63,0x76,0x31,0x38,0x0a,0x65,0x69,0x67,0x68,0x74,0x2e,0x63,0x76,0x31,0x39,0x09,0x66,0x69,0x76,0x65,0x2e,0x63,0x76,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x33,\r\n0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x30,0x38,0x39,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x08,0x6f,0x6e,0x65,0x2e,0x64,\r\n0x6e,0x6f,0x6d,0x08,0x74,0x77,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,0x74,0x68,0x72,0x65,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x66,0x6f,0x75,0x72,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x66,0x69,0x76,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x08,0x73,0x69,0x78,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,0x73,0x65,0x76,0x65,0x6e,0x2e,0x64,0x6e,0x6f,0x6d,0x0a,\r\n0x65,0x69,0x67,0x68,0x74,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x09,0x7a,0x65,0x72,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x6f,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x74,0x77,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x74,0x68,0x72,0x65,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x09,0x66,0x6f,0x75,0x72,\r\n0x2e,0x6e,0x75,0x6d,0x72,0x09,0x66,0x69,0x76,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x08,0x73,0x69,0x78,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x73,0x65,0x76,0x65,0x6e,0x2e,0x6e,0x75,0x6d,0x72,0x0a,0x65,0x69,0x67,0x68,0x74,0x2e,0x6e,0x75,0x6d,0x72,0x09,0x6e,0x69,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x30,\r\n0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x32,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x38,\r\n0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x32,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x36,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x39,0x2e,0x63,0x76,0x31,0x38,0x0d,0x74,0x77,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0d,0x73,0x69,\r\n0x78,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0e,0x6e,0x69,0x6e,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x38,0x0d,0x74,0x77,0x6f,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x38,0x0d,0x73,0x69,0x78,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x38,0x0e,0x6e,0x69,0x6e,0x65,0x2e,0x6e,0x75,0x6d,0x72,\r\n0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x30,0x30,0x42,0x32,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x36,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x39,0x2e,0x63,0x76,0x31,0x38,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x38,0x2e,0x63,0x76,0x31,0x39,0x0f,0x65,0x69,0x67,0x68,0x74,0x2e,\r\n0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,0x31,0x39,0x0f,0x65,0x69,0x67,0x68,0x74,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x31,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x38,0x2e,0x63,0x76,0x31,0x39,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x35,0x2e,0x63,0x76,0x32,0x30,0x0e,0x66,0x69,0x76,0x65,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x63,0x76,\r\n0x32,0x30,0x0e,0x66,0x69,0x76,0x65,0x2e,0x6e,0x75,0x6d,0x72,0x2e,0x63,0x76,0x32,0x30,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x35,0x2e,0x63,0x76,0x32,0x30,0x0c,0x75,0x6e,0x69,0x32,0x30,0x38,0x30,0x2e,0x7a,0x65,0x72,0x6f,0x0e,0x7a,0x65,0x72,0x6f,0x2e,0x64,0x6e,0x6f,0x6d,0x2e,0x7a,0x65,0x72,0x6f,0x0e,0x7a,0x65,0x72,0x6f,0x2e,\r\n0x6e,0x75,0x6d,0x72,0x2e,0x7a,0x65,0x72,0x6f,0x0c,0x75,0x6e,0x69,0x32,0x30,0x37,0x30,0x2e,0x7a,0x65,0x72,0x6f,0x07,0x75,0x6e,0x69,0x30,0x41,0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x30,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x36,0x09,0x65,0x78,0x63,0x6c,0x61,0x6d,0x64,0x62,0x6c,\r\n0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x44,0x0e,0x6f,0x6e,0x65,0x64,0x6f,0x74,0x65,0x6e,0x6c,0x65,0x61,0x64,0x65,0x72,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x33,0x46,0x0a,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x1b,0x70,0x65,0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65,\r\n0x64,0x2e,0x6c,0x6f,0x63,0x6c,0x43,0x41,0x54,0x2e,0x63,0x61,0x73,0x65,0x16,0x70,0x65,0x72,0x69,0x6f,0x64,0x63,0x65,0x6e,0x74,0x65,0x72,0x65,0x64,0x2e,0x6c,0x6f,0x63,0x6c,0x43,0x41,0x54,0x07,0x75,0x6e,0x69,0x46,0x46,0x35,0x42,0x07,0x75,0x6e,0x69,0x46,0x46,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x30,0x07,0x75,0x6e,\r\n0x69,0x32,0x37,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x37,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x42,0x07,0x75,0x6e,\r\n0x69,0x32,0x37,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x39,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x39,0x38,0x38,0x07,0x75,0x6e,0x69,0x30,0x30,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x30,0x0d,0x71,0x75,0x6f,0x74,0x65,0x72,0x65,0x76,0x65,0x72,0x73,0x65,0x64,0x07,0x75,0x6e,0x69,0x32,0x30,0x31,0x46,0x07,0x75,0x6e,0x69,0x32,\r\n0x30,0x33,0x34,0x12,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x19,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x28,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x62,\r\n0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x62,0x61,0x72,0x2e,\r\n0x6c,0x69,0x67,0x61,0x13,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,\r\n0x2e,0x6c,0x69,0x67,0x61,0x15,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x16,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x18,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x72,0x61,\r\n0x63,0x65,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x26,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x23,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x65,0x78,0x63,\r\n0x6c,0x61,0x6d,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x12,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x5f,0x62,0x61,\r\n0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,0x66,0x74,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,\r\n0x66,0x74,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x19,0x70,0x65,0x72,\r\n0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x17,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x14,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,\r\n0x69,0x67,0x61,0x11,0x70,0x65,0x72,0x69,0x6f,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x10,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x63,0x6f,\r\n0x6c,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,\r\n0x6c,0x69,0x67,0x61,0x10,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x12,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x18,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,\r\n0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x22,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x73,0x65,0x6d,0x69,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,\r\n0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x1d,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x11,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x17,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,\r\n0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x14,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x70,0x65,0x72,0x69,0x6f,0x64,0x2e,0x6c,0x69,0x67,0x61,0x13,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,\r\n0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x13,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,\r\n0x69,0x67,0x61,0x1f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x15,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x61,0x73,0x74,0x65,0x72,0x69,\r\n0x73,0x6b,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x70,0x61,0x72,0x65,0x6e,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x62,0x72,0x61,0x63,0x65,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,\r\n0x61,0x1b,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x65,\r\n0x78,0x63,0x6c,0x61,0x6d,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x71,0x75,0x65,0x73,0x74,0x69,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x25,0x6e,\r\n0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x30,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,\r\n0x72,0x73,0x69,0x67,0x6e,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,\r\n0x65,0x2e,0x6c,0x69,0x67,0x61,0x24,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x70,0x61,0x72,0x65,0x6e,0x6c,0x65,0x66,0x74,0x2e,0x6c,0x69,0x67,0x61,0x13,0x73,0x6c,0x61,0x73,0x68,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x1c,\r\n0x73,0x6c,0x61,0x73,0x68,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x10,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,\r\n0x6c,0x69,0x67,0x61,0x12,0x73,0x6c,0x61,0x73,0x68,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x16,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,\r\n0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x14,0x73,0x6c,0x61,0x73,0x68,0x5f,0x62,0x61,0x63,0x6b,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x61,0x63,0x6b,0x73,0x6c,0x61,0x73,0x68,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,\r\n0x1e,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x62,0x61,0x72,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x78,0x63,0x6c,0x61,\r\n0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x1c,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x41,0x07,0x75,\r\n0x6e,0x69,0x32,0x37,0x45,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x42,0x07,0x75,0x6e,0x69,0x32,0x37,0x45,0x37,0x09,0x61,0x6e,0x6f,0x74,0x65,0x6c,0x65,0x69,0x61,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x45,0x06,0x45,0x4d,0x71,0x75,0x61,0x64,0x0e,0x5a,0x45,0x52,0x4f,0x57,0x49,0x44,0x54,\r\n0x48,0x53,0x50,0x41,0x43,0x45,0x07,0x75,0x6e,0x69,0x30,0x30,0x41,0x30,0x02,0x43,0x52,0x07,0x75,0x6e,0x69,0x46,0x45,0x46,0x46,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x46,0x04,0x64,0x6f,0x6e,0x67,0x04,0x45,0x75,0x72,0x6f,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x30,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,\r\n0x30,0x41,0x45,0x09,0x63,0x65,0x6e,0x74,0x2e,0x63,0x76,0x31,0x34,0x0b,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x63,0x76,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,\r\n0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x31,0x09,0x63,0x6f,0x6e,0x67,0x72,0x75,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x34,0x07,0x75,0x6e,0x69,0x32,\r\n0x32,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x44,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x46,0x31,0x07,0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,\r\n0x32,0x45,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x43,0x0b,0x65,0x71,0x75,0x69,0x76,0x61,0x6c,0x65,0x6e,0x63,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x39,0x0b,0x65,0x78,0x69,0x73,0x74,0x65,0x6e,0x74,0x69,0x61,0x6c,0x08,0x67,0x72,0x61,0x64,\r\n0x69,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x39,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x37,0x44,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x37,0x07,0x75,0x6e,0x69,\r\n0x32,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x42,0x07,0x75,0x6e,0x69,\r\n0x32,0x32,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x30,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x41,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x32,0x07,0x75,0x6e,0x69,\r\n0x32,0x32,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x38,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x43,0x0a,0x6e,0x6f,0x74,\r\n0x65,0x6c,0x65,0x6d,0x65,0x6e,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x45,0x32,0x09,\r\n0x6e,0x6f,0x74,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x35,0x08,0x65,0x6d,0x70,0x74,0x79,0x73,0x65,0x74,0x0a,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x61,0x6e,0x64,0x09,0x6c,0x6f,0x67,0x69,0x63,0x61,0x6c,0x6f,0x72,0x0c,0x69,0x6e,0x74,0x65,0x72,0x73,0x65,0x63,0x74,0x69,0x6f,0x6e,0x05,0x75,0x6e,0x69,\r\n0x6f,0x6e,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x36,0x07,0x75,0x6e,0x69,0x30,0x30,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,\r\n0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x45,0x07,0x75,0x6e,0x69,0x46,0x45,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x30,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,\r\n0x33,0x36,0x0c,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x62,0x73,0x65,0x74,0x0e,0x72,0x65,0x66,0x6c,0x65,0x78,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x39,0x31,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x42,0x07,0x75,\r\n0x6e,0x69,0x32,0x32,0x43,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x32,0x31,0x38,0x07,0x73,0x69,0x6d,0x69,0x6c,0x61,0x72,0x07,0x75,\r\n0x6e,0x69,0x32,0x32,0x39,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x31,0x07,0x75,\r\n0x6e,0x69,0x32,0x32,0x39,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x32,0x07,0x75,0x6e,0x69,0x32,0x32,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x32,0x36,0x33,0x0c,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x62,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x37,0x42,0x08,0x73,0x75,0x63,0x68,0x74,0x68,0x61,0x74,0x07,0x75,0x6e,0x69,\r\n0x32,0x31,0x34,0x30,0x0e,0x70,0x72,0x6f,0x70,0x65,0x72,0x73,0x75,0x70,0x65,0x72,0x73,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x34,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x32,0x30,0x34,0x09,0x74,0x68,0x65,0x72,0x65,0x66,0x6f,0x72,0x65,0x07,0x75,0x6e,0x69,0x32,0x32,0x34,0x42,0x09,0x75,0x6e,\r\n0x69,0x76,0x65,0x72,0x73,0x61,0x6c,0x07,0x75,0x6e,0x69,0x32,0x32,0x46,0x30,0x07,0x75,0x6e,0x69,0x32,0x32,0x41,0x35,0x07,0x75,0x6e,0x69,0x32,0x32,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x38,0x07,\r\n0x75,0x6e,0x69,0x32,0x32,0x39,0x36,0x0e,0x63,0x69,0x72,0x63,0x6c,0x65,0x6d,0x75,0x6c,0x74,0x69,0x70,0x6c,0x79,0x07,0x75,0x6e,0x69,0x32,0x32,0x39,0x39,0x0a,0x63,0x69,0x72,0x63,0x6c,0x65,0x70,0x6c,0x75,0x73,0x07,0x61,0x72,0x72,0x6f,0x77,0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x37,0x0a,0x61,0x72,0x72,0x6f,0x77,0x72,\r\n0x69,0x67,0x68,0x74,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x38,0x09,0x61,0x72,0x72,0x6f,0x77,0x64,0x6f,0x77,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x39,0x09,0x61,0x72,0x72,0x6f,0x77,0x6c,0x65,0x66,0x74,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x36,0x09,0x61,0x72,0x72,0x6f,0x77,0x62,0x6f,0x74,0x68,0x09,0x61,0x72,0x72,0x6f,0x77,\r\n0x75,0x70,0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x44,0x07,0x75,0x6e,0x69,0x32,0x31,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x32,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x35,0x07,0x75,0x6e,0x69,\r\n0x32,0x31,0x41,0x36,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x39,0x07,0x75,0x6e,0x69,0x32,0x31,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x31,0x42,0x45,0x07,0x75,0x6e,0x69,0x32,0x31,0x43,0x39,0x0a,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x75,0x70,0x0d,\r\n0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x72,0x69,0x67,0x68,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x64,0x6f,0x77,0x6e,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x6c,0x65,0x66,0x74,0x0c,0x61,0x72,0x72,0x6f,0x77,0x64,0x62,0x6c,0x62,0x6f,0x74,0x68,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x42,0x07,0x75,0x6e,0x69,\r\n0x32,0x31,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x37,0x39,0x45,0x07,0x75,0x6e,0x69,\r\n0x32,0x37,0x46,0x35,0x07,0x75,0x6e,0x69,0x32,0x37,0x46,0x36,0x07,0x75,0x6e,0x69,0x32,0x37,0x46,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x33,0x07,0x64,0x6e,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x35,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x38,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x37,0x05,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x70,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x44,0x07,0x6c,0x66,0x62,0x6c,0x6f,\r\n0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x38,0x39,0x07,0x72,0x74,0x62,0x6c,0x6f,0x63,0x6b,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,\r\n0x39,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x39,0x46,0x07,0x6c,0x74,0x73,0x68,0x61,\r\n0x64,0x65,0x05,0x73,0x68,0x61,0x64,0x65,0x07,0x64,0x6b,0x73,0x68,0x61,0x64,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x46,0x06,0x63,0x69,0x72,0x63,0x6c,0x65,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x44,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x46,0x36,0x07,\r\n0x75,0x6e,0x69,0x32,0x35,0x43,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x45,0x0a,0x6f,0x70,0x65,0x6e,0x62,0x75,0x6c,0x6c,0x65,0x74,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x38,0x09,0x66,0x69,0x6c,0x6c,0x65,\r\n0x64,0x62,0x6f,0x78,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x41,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x45,0x41,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x45,0x42,0x07,0x74,0x72,0x69,0x61,0x67,0x75,0x70,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x36,0x07,0x74,0x72,0x69,0x61,0x67,0x64,0x6e,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x44,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x43,0x31,0x07,0x74,0x72,0x69,0x61,0x67,0x72,0x74,0x07,0x74,0x72,0x69,0x61,0x67,0x6c,0x66,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x45,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x43,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x42,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x43,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x34,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x30,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x46,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x34,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x34,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x35,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x46,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x30,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x37,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x42,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x41,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x31,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x34,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x37,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x37,0x44,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x33,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x30,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x36,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x32,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x38,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x36,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x42,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x35,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x38,0x07,0x75,0x6e,0x69,0x32,0x35,0x32,0x30,0x07,0x75,0x6e,0x69,0x32,0x35,0x33,0x46,0x07,0x75,0x6e,0x69,\r\n0x32,0x35,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x35,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x41,0x07,0x75,0x6e,0x69,0x32,0x35,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x35,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x36,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x34,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x41,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x36,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x36,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x34,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x34,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x35,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x39,0x35,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x43,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x36,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x39,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x43,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x38,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x34,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x31,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x35,0x30,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x33,0x46,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x37,0x32,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x35,0x35,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x35,0x31,0x07,0x75,0x6e,0x69,0x32,0x33,0x34,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x36,0x43,0x07,0x75,0x6e,0x69,0x32,0x36,0x38,0x37,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x30,0x07,0x75,0x6e,0x69,0x32,0x36,0x41,0x31,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x37,0x31,0x35,0x07,0x75,0x6e,0x69,\r\n0x32,0x37,0x31,0x37,0x07,0x75,0x6e,0x69,0x32,0x37,0x33,0x36,0x12,0x61,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64,0x67,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x10,0x62,0x61,0x63,0x6b,0x73,0x70,0x61,0x63,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x06,0x6d,0x69,0x6e,0x75,0x74,0x65,0x06,0x73,0x65,0x63,0x6f,0x6e,0x64,0x07,0x75,\r\n0x6e,0x69,0x32,0x31,0x31,0x33,0x07,0x75,0x6e,0x69,0x32,0x31,0x31,0x36,0x09,0x65,0x73,0x74,0x69,0x6d,0x61,0x74,0x65,0x64,0x0b,0x62,0x65,0x6c,0x6c,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x34,0x32,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x42,0x0d,0x63,0x61,0x6e,0x63,0x65,0x6c,0x63,0x6f,0x6e,0x74,0x72,\r\n0x6f,0x6c,0x15,0x63,0x61,0x72,0x72,0x69,0x61,0x67,0x65,0x52,0x65,0x74,0x75,0x72,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x33,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x46,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x43,\r\n0x15,0x64,0x61,0x74,0x61,0x4c,0x69,0x6e,0x6b,0x45,0x73,0x63,0x61,0x70,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0d,0x64,0x65,0x6c,0x65,0x74,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x18,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x46,0x6f,0x75,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x17,0x64,0x65,\r\n0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x4f,0x6e,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x19,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x54,0x68,0x72,0x65,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x17,0x64,0x65,0x76,0x69,0x63,0x65,0x43,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x54,0x77,0x6f,\r\n0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x41,0x12,0x65,0x6e,0x64,0x4f,0x66,0x4d,0x65,0x64,0x69,0x75,0x6d,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x10,0x65,0x6e,0x64,0x4f,0x66,0x54,0x65,0x78,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x18,0x65,0x6e,0x64,0x4f,0x66,0x54,0x72,0x61,0x6e,0x73,0x6d,0x69,\r\n0x73,0x73,0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x1d,0x65,0x6e,0x64,0x4f,0x66,0x54,0x72,0x61,0x6e,0x73,0x6d,0x69,0x73,0x73,0x69,0x6f,0x6e,0x42,0x6c,0x6f,0x63,0x6b,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x65,0x6e,0x71,0x75,0x69,0x72,0x79,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0d,0x65,0x73,0x63,0x61,0x70,0x65,\r\n0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x14,0x66,0x69,0x6c,0x65,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0f,0x66,0x6f,0x72,0x6d,0x46,0x65,0x65,0x64,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x15,0x67,0x72,0x6f,0x75,0x70,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,\r\n0x6f,0x6c,0x1b,0x68,0x6f,0x72,0x69,0x7a,0x6f,0x6e,0x74,0x61,0x6c,0x54,0x61,0x62,0x75,0x6c,0x61,0x74,0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,0x38,0x39,0x05,0x68,0x6f,0x75,0x73,0x65,0x07,0x75,0x6e,0x69,0x32,0x31,0x45,0x41,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x42,0x07,0x75,0x6e,0x69,\r\n0x32,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x46,0x07,0x75,0x6e,0x69,0x32,0x31,0x44,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x31,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x43,0x45,0x0f,0x6c,0x69,0x6e,0x65,0x46,0x65,0x65,0x64,0x63,0x6f,0x6e,\r\n0x74,0x72,0x6f,0x6c,0x1a,0x6e,0x65,0x67,0x61,0x74,0x69,0x76,0x65,0x41,0x63,0x6b,0x6e,0x6f,0x77,0x6c,0x65,0x64,0x67,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x6e,0x65,0x77,0x6c,0x69,0x6e,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0b,0x6e,0x75,0x6c,0x6c,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x33,\r\n0x46,0x42,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x43,0x07,0x75,0x6e,0x69,0x32,0x42,0x35,0x38,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x44,0x07,0x75,0x6e,0x69,0x32,0x33,0x46,0x45,0x07,0x75,0x6e,0x69,0x32,0x33,0x30,0x35,0x16,0x72,0x65,0x63,0x6f,0x72,0x64,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,\r\n0x6c,0x0b,0x72,0x65,0x70,0x6c,0x61,0x63,0x65,0x6d,0x65,0x6e,0x74,0x0e,0x73,0x68,0x69,0x66,0x74,0x49,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0f,0x73,0x68,0x69,0x66,0x74,0x4f,0x75,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0c,0x73,0x70,0x61,0x63,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x15,0x73,0x74,0x61,0x72,0x74,0x4f,\r\n0x66,0x48,0x65,0x61,0x64,0x69,0x6e,0x67,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x12,0x73,0x74,0x61,0x72,0x74,0x4f,0x66,0x54,0x65,0x78,0x74,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x11,0x73,0x75,0x62,0x73,0x74,0x69,0x74,0x75,0x74,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x16,0x73,0x79,0x6e,0x63,0x68,0x72,0x6f,0x6e,0x6f,0x75,0x73,\r\n0x49,0x64,0x6c,0x65,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x42,0x07,0x75,0x6e,0x69,0x32,0x31,0x38,0x41,0x14,0x75,0x6e,0x69,0x74,0x53,0x65,0x70,0x61,0x72,0x61,0x74,0x6f,0x72,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x19,0x76,0x65,0x72,0x74,0x69,0x63,0x61,0x6c,0x54,0x61,0x62,0x75,0x6c,0x61,0x74,\r\n0x69,0x6f,0x6e,0x63,0x6f,0x6e,0x74,0x72,0x6f,0x6c,0x0e,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x63,0x76,0x31,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x33,0x07,0x75,0x6e,0x69,0x30,0x32,0x46,0x37,0x18,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,\r\n0x31,0x34,0x15,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x34,0x1d,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x34,0x1d,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,\r\n0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x27,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x19,0x61,0x6d,0x70,\r\n0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x63,0x76,0x31,0x35,0x12,0x61,0x74,0x5f,0x75,0x6e,0x64,0x65,0x72,0x73,0x63,0x6f,0x72,0x65,0x2e,0x6c,0x69,0x67,0x61,0x18,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,\r\n0x67,0x61,0x22,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x2e,0x6c,0x69,0x67,0x61,0x14,0x61,0x6d,0x70,0x65,0x72,0x73,0x61,0x6e,0x64,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x62,0x61,0x72,0x5f,0x68,\r\n0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x17,0x62,0x61,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x62,0x61,0x72,0x5f,0x62,0x72,0x61,0x63,0x65,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x15,0x62,0x61,0x72,0x5f,0x62,0x72,0x61,0x63,0x6b,\r\n0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x0c,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x10,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x62,\r\n0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x12,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x14,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0e,\r\n0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x62,0x61,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x13,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,\r\n0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0e,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x13,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x11,0x70,0x6c,0x75,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,\r\n0x65,0x71,0x75,0x61,0x6c,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x17,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x10,\r\n0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x18,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,\r\n0x12,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x65,0x71,0x75,0x61,0x6c,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,\r\n0x69,0x67,0x61,0x16,0x65,0x71,0x75,0x61,0x6c,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,\r\n0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x19,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x62,0x72,0x61,0x63,0x6b,0x65,0x74,0x72,0x69,0x67,0x68,0x74,0x2e,0x6c,0x69,0x67,0x61,0x12,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,\r\n0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1b,0x67,0x72,0x65,0x61,0x74,\r\n0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1c,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,\r\n0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,\r\n0x68,0x65,0x6e,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,0x73,0x73,\r\n0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x63,0x6f,0x6c,0x6f,0x6e,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x1e,0x6c,0x65,0x73,0x73,0x5f,0x65,0x78,0x63,0x6c,0x61,0x6d,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,\r\n0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x74,0x65,0x72,0x69,0x73,0x6b,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0d,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x11,0x6c,0x65,0x73,0x73,\r\n0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x62,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x10,0x6c,0x65,0x73,0x73,0x5f,0x64,\r\n0x6f,0x6c,0x6c,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x18,0x6c,0x65,0x73,0x73,0x5f,0x64,0x6f,0x6c,0x6c,0x61,0x72,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x22,0x6c,0x65,0x73,0x73,0x5f,0x6e,0x75,0x6d,0x62,0x65,0x72,0x73,0x69,0x67,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x5f,0x68,0x79,0x70,0x68,0x65,\r\n0x6e,0x2e,0x6c,0x69,0x67,0x61,0x0e,0x6c,0x65,0x73,0x73,0x5f,0x70,0x6c,0x75,0x73,0x2e,0x6c,0x69,0x67,0x61,0x16,0x6c,0x65,0x73,0x73,0x5f,0x70,0x6c,0x75,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x6c,0x65,0x73,\r\n0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x62,0x61,0x72,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x1d,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,\r\n0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x11,0x6c,0x65,0x73,0x73,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,\r\n0x69,0x67,0x61,0x0e,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x15,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x13,0x6c,0x65,\r\n0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x2e,0x6c,0x69,0x67,0x61,0x19,0x6c,0x65,0x73,0x73,0x5f,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x14,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,\r\n0x1c,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1f,0x6c,0x65,0x73,0x73,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,0x67,0x61,0x0f,0x6c,0x65,\r\n0x73,0x73,0x5f,0x73,0x6c,0x61,0x73,0x68,0x2e,0x6c,0x69,0x67,0x61,0x17,0x6c,0x65,0x73,0x73,0x5f,0x73,0x6c,0x61,0x73,0x68,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x16,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x68,0x79,0x70,0x68,0x65,0x6e,0x2e,0x6c,0x69,0x67,0x61,0x12,0x61,0x73,0x63,\r\n0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x74,0x2e,0x6c,0x69,0x67,0x61,0x17,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x1a,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x2e,0x6c,0x69,\r\n0x67,0x61,0x22,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x61,0x73,0x63,0x69,0x69,0x74,0x69,0x6c,0x64,0x65,0x5f,0x67,0x72,0x65,0x61,0x74,0x65,0x72,0x2e,0x6c,0x69,0x67,0x61,0x16,0x61,0x73,0x63,0x69,0x69,0x63,0x69,0x72,0x63,0x75,0x6d,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x15,0x65,0x71,0x75,\r\n0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x1b,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x5f,0x65,0x71,0x75,0x61,0x6c,0x2e,0x6c,0x69,0x67,0x61,0x2e,0x73,0x73,0x31,0x39,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x44,0x07,0x75,0x6e,0x69,0x32,0x36,0x36,0x46,0x07,0x75,\r\n0x6e,0x69,0x30,0x33,0x37,0x34,0x07,0x75,0x6e,0x69,0x30,0x33,0x37,0x35,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x43,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x41,0x07,0x75,0x6e,0x69,0x30,0x32,0x43,0x39,0x07,0x75,0x6e,0x69,0x30,0x32,0x42,0x39,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x09,0x67,\r\n0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x09,0x61,0x63,0x75,0x74,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x2e,0x61,0x6c,0x74,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x07,0x75,\r\n0x6e,0x69,0x30,0x33,0x30,0x41,0x09,0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x0d,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x07,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x0c,0x64,\r\n0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x63,0x6f,0x6d,0x62,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x35,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x37,0x07,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x36,0x07,0x75,0x6e,0x69,0x30,0x33,0x33,0x37,0x07,0x75,0x6e,0x69,0x30,\r\n0x33,0x33,0x38,0x0b,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x2e,0x61,0x6c,0x74,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x38,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x37,0x2e,0x63,0x61,0x73,0x65,0x0e,0x67,0x72,0x61,0x76,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0e,0x61,0x63,0x75,0x74,0x65,0x63,0x6f,\r\n0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x42,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x43,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,\r\n0x33,0x30,0x41,0x2e,0x63,0x61,0x73,0x65,0x0e,0x74,0x69,0x6c,0x64,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x34,0x2e,0x63,0x61,0x73,0x65,0x12,0x68,0x6f,0x6f,0x6b,0x61,0x62,0x6f,0x76,0x65,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x30,0x46,0x2e,\r\n0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x31,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x32,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x31,0x42,0x2e,0x63,0x61,0x73,0x65,0x11,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x63,0x6f,0x6d,0x62,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,\r\n0x69,0x30,0x33,0x32,0x34,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x36,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x37,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x38,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,0x6e,0x69,0x30,0x33,0x32,0x45,0x2e,0x63,0x61,0x73,0x65,0x0c,0x75,\r\n0x6e,0x69,0x30,0x33,0x33,0x31,0x2e,0x63,0x61,0x73,0x65,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x2e,0x63,0x61,0x73,0x65,0x0e,0x64,0x6f,0x74,0x61,0x63,0x63,0x65,0x6e,0x74,0x2e,0x63,0x61,0x73,0x65,0x0a,0x67,0x72,0x61,0x76,0x65,0x2e,0x63,0x61,0x73,0x65,0x0a,0x61,0x63,0x75,0x74,0x65,0x2e,0x63,0x61,0x73,0x65,0x11,0x68,\r\n0x75,0x6e,0x67,0x61,0x72,0x75,0x6d,0x6c,0x61,0x75,0x74,0x2e,0x63,0x61,0x73,0x65,0x0f,0x63,0x69,0x72,0x63,0x75,0x6d,0x66,0x6c,0x65,0x78,0x2e,0x63,0x61,0x73,0x65,0x0a,0x63,0x61,0x72,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x0a,0x62,0x72,0x65,0x76,0x65,0x2e,0x63,0x61,0x73,0x65,0x09,0x72,0x69,0x6e,0x67,0x2e,0x63,0x61,0x73,0x65,\r\n0x0a,0x74,0x69,0x6c,0x64,0x65,0x2e,0x63,0x61,0x73,0x65,0x0b,0x6d,0x61,0x63,0x72,0x6f,0x6e,0x2e,0x63,0x61,0x73,0x65,0x05,0x74,0x6f,0x6e,0x6f,0x73,0x0a,0x74,0x6f,0x6e,0x6f,0x73,0x2e,0x63,0x61,0x73,0x65,0x0d,0x64,0x69,0x65,0x72,0x65,0x73,0x69,0x73,0x74,0x6f,0x6e,0x6f,0x73,0x0b,0x62,0x72,0x65,0x76,0x65,0x63,0x6f,0x6d,0x62,\r\n0x63,0x79,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x31,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x0b,0x75,\r\n0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x30,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x0b,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x31,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x30,0x2e,\r\n0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x39,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x36,0x30,0x33,0x30,0x33,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x31,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,\r\n0x33,0x30,0x30,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x39,0x2e,0x63,0x61,0x73,0x65,0x10,0x75,0x6e,0x69,0x30,0x33,0x30,0x32,0x30,0x33,0x30,0x33,0x2e,0x63,0x61,0x73,0x65,0x07,0x75,0x6e,0x69,0x45,0x30,0x41,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x41,0x31,0x07,0x75,0x6e,0x69,0x45,0x30,\r\n0x41,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x30,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x31,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x32,0x07,0x75,0x6e,0x69,0x45,0x30,0x42,0x33,0x0e,0x69,0x6f,0x67,0x6f,0x6e,0x65,0x6b,0x64,0x6f,0x74,0x6c,0x65,0x73,0x73,0x10,0x69,0x64,0x6f,0x74,0x62,0x65,0x6c,0x6f,0x77,0x64,0x6f,0x74,0x6c,0x65,\r\n0x73,0x73,0x04,0x4e,0x55,0x4c,0x4c,0x03,0x53,0x50,0x43,0x00,0x00,0x01,0x00,0x01,0xff,0xff,0x00,0x0f,0x00,0x01,0x00,0x02,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xe0,0x00,0x02,0x00,0x4d,0x00,0x01,0x00,0x5d,0x00,0x01,0x00,0x5f,0x00,0x78,0x00,0x01,0x00,0x7a,0x00,0x7a,0x00,0x01,0x00,0x7c,0x00,0x86,0x00,0x01,0x00,0x89,\r\n0x00,0xdd,0x00,0x01,0x00,0xe1,0x00,0xf2,0x00,0x01,0x00,0xf4,0x00,0xfc,0x00,0x01,0x00,0xfe,0x01,0x14,0x00,0x01,0x01,0x16,0x01,0x1f,0x00,0x01,0x01,0x21,0x01,0x3b,0x00,0x01,0x01,0x3d,0x01,0x49,0x00,0x01,0x01,0x4c,0x01,0x7c,0x00,0x01,0x01,0x7e,0x01,0xc2,0x00,0x01,0x01,0xc4,0x01,0xc5,0x00,0x01,0x01,0xc8,0x01,0xc8,0x00,0x01,\r\n0x01,0xca,0x01,0xcc,0x00,0x01,0x01,0xcf,0x01,0xd6,0x00,0x01,0x01,0xd8,0x01,0xda,0x00,0x01,0x01,0xdc,0x01,0xe0,0x00,0x01,0x01,0xe2,0x01,0xe3,0x00,0x01,0x01,0xe9,0x01,0xea,0x00,0x01,0x01,0xed,0x01,0xf2,0x00,0x01,0x01,0xf4,0x01,0xf5,0x00,0x01,0x01,0xf7,0x01,0xfd,0x00,0x01,0x01,0xff,0x02,0x02,0x00,0x01,0x02,0x04,0x02,0x04,\r\n0x00,0x01,0x02,0x06,0x02,0x0a,0x00,0x01,0x02,0x0c,0x02,0x0c,0x00,0x01,0x02,0x0f,0x02,0x10,0x00,0x01,0x02,0x13,0x02,0x1a,0x00,0x01,0x02,0x1e,0x02,0x1e,0x00,0x01,0x02,0x20,0x02,0x24,0x00,0x01,0x02,0x26,0x02,0x27,0x00,0x01,0x02,0x2e,0x02,0x2e,0x00,0x01,0x02,0x31,0x02,0x36,0x00,0x01,0x02,0x38,0x02,0x39,0x00,0x01,0x02,0x3b,\r\n0x02,0x3b,0x00,0x01,0x02,0x3d,0x02,0x3d,0x00,0x01,0x02,0x40,0x02,0x46,0x00,0x01,0x02,0x48,0x02,0x49,0x00,0x01,0x02,0x4b,0x02,0x4f,0x00,0x01,0x02,0x51,0x02,0x53,0x00,0x01,0x02,0x55,0x02,0x57,0x00,0x01,0x02,0x59,0x02,0x5a,0x00,0x01,0x02,0x5c,0x02,0x5d,0x00,0x01,0x02,0x5f,0x02,0x5f,0x00,0x01,0x02,0x61,0x02,0x61,0x00,0x01,\r\n0x02,0x63,0x02,0x64,0x00,0x01,0x02,0x66,0x02,0x66,0x00,0x01,0x02,0x69,0x02,0x6e,0x00,0x01,0x02,0x70,0x02,0x75,0x00,0x01,0x02,0x79,0x02,0x79,0x00,0x01,0x02,0x7b,0x02,0x7b,0x00,0x01,0x02,0x7d,0x02,0x7e,0x00,0x01,0x02,0x81,0x02,0x81,0x00,0x01,0x02,0x83,0x02,0x83,0x00,0x01,0x02,0x89,0x02,0x89,0x00,0x01,0x02,0x8b,0x02,0x8b,\r\n0x00,0x01,0x02,0x8e,0x02,0x94,0x00,0x01,0x02,0x96,0x02,0x99,0x00,0x01,0x02,0x9c,0x02,0x9c,0x00,0x01,0x02,0xb0,0x02,0xb0,0x00,0x01,0x02,0xcc,0x02,0xcc,0x00,0x01,0x03,0xc3,0x03,0xc3,0x00,0x01,0x03,0xc7,0x03,0xc7,0x00,0x01,0x03,0xcd,0x03,0xcf,0x00,0x01,0x05,0x7d,0x05,0x7e,0x00,0x01,0x05,0xaa,0x05,0xaa,0x00,0x01,0x05,0xc5,\r\n0x05,0xc5,0x00,0x01,0x05,0xd0,0x05,0xd0,0x00,0x01,0x05,0xeb,0x05,0xeb,0x00,0x01,0x05,0xed,0x05,0xed,0x00,0x01,0x06,0x05,0x06,0x06,0x00,0x02,0x06,0x68,0x06,0x7f,0x00,0x03,0x06,0x8d,0x06,0xa4,0x00,0x03,0x06,0xb3,0x06,0xc3,0x00,0x03,0x06,0xcb,0x06,0xcc,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2a,\r\n0x00,0x00,0x00,0x40,0x00,0x01,0x00,0x0b,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x8d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa3,0x06,0xa4,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x76,0x00,0x00,0x06,0x8e,0x06,0x9c,0x00,0x0f,0x06,0xb3,0x06,0xc3,0x00,0x1e,0x00,0x01,0x00,0x03,0x06,0x6d,0x06,0x77,0x06,0x9d,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x16,0x00,0x24,0x00,0x0a,0x00,0x05,0x00,0x2c,0x00,0x34,0x00,0x3c,0x00,0x46,0x00,0x50,0x00,0x02,0x44,0x46,0x4c,0x54,0x00,0x1c,0x6c,0x61,0x74,0x6e,0x00,0x60,0x00,0x02,0x6d,0x61,0x72,0x6b,0x00,0x40,0x6d,0x6b,0x6d,0x6b,0x00,0x48,0x00,0x78,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x01,0x00,0x7e,0x00,0x04,\r\n0x00,0x00,0x00,0x01,0x00,0x82,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x86,0x00,0x00,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x88,0x00,0x01,0x00,0x06,0x00,0x10,0x00,0x01,0x00,0x8a,0x00,0x02,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x34,0x00,0x08,0x41,0x5a,0x45,0x20,0x00,0x34,\r\n0x43,0x41,0x54,0x20,0x00,0x34,0x43,0x52,0x54,0x20,0x00,0x34,0x4b,0x41,0x5a,0x20,0x00,0x34,0x4d,0x4f,0x4c,0x20,0x00,0x34,0x52,0x4f,0x4d,0x20,0x00,0x34,0x54,0x41,0x54,0x20,0x00,0x34,0x54,0x52,0x4b,0x20,0x00,0x34,0x00,0x00,0xff,0xff,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x42,0x01,0x66,0x00,0x01,0x00,0x54,0x02,0xca,\r\n0x00,0x01,0x00,0x56,0x04,0xc6,0x00,0x05,0x03,0xc0,0x06,0x68,0x00,0x01,0x00,0x8e,0x00,0x8e,0x00,0x01,0x00,0xc4,0x00,0x76,0x00,0x01,0x00,0x54,0x00,0x9c,0x00,0x01,0x01,0xe8,0x00,0xe6,0x00,0x01,0x00,0x12,0x00,0x1c,0x00,0x01,0x00,0x24,0x00,0x0c,0x00,0x02,0x1d,0x1e,0x1d,0x24,0x00,0x01,0x00,0x03,0x06,0x6d,0x06,0x77,0x06,0x9d,\r\n0x00,0x01,0x00,0x02,0x06,0x77,0x06,0x9d,0x00,0x03,0x00,0x00,0x1d,0x12,0x00,0x00,0x1d,0x18,0x00,0x00,0x1d,0x1e,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x7f,0x00,0x00,0x06,0x8d,0x06,0xa4,0x00,0x18,0x06,0xb3,0x06,0xc3,0x00,0x30,0x00,0x02,0x00,0x03,0x06,0x68,0x06,0x76,0x00,0x00,0x06,0x8e,0x06,0x9c,0x00,0x0f,0x06,0xb3,0x06,0xc3,\r\n0x00,0x1e,0x00,0x0b,0x1c,0xf0,0x1c,0xea,0x1c,0xf6,0x1c,0xfc,0x1c,0xf6,0x1c,0xf0,0x1c,0xf0,0x1c,0xf6,0x1c,0xfc,0x1d,0x02,0x1d,0x08,0x00,0x01,0x00,0x0b,0x06,0x78,0x06,0x79,0x06,0x7a,0x06,0x7b,0x06,0x8d,0x06,0x9e,0x06,0x9f,0x06,0xa0,0x06,0xa1,0x06,0xa3,0x06,0xa4,0x00,0x02,0x00,0x04,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,\r\n0x06,0x76,0x00,0x05,0x06,0x8e,0x06,0x9c,0x00,0x0e,0x06,0xb4,0x06,0xc3,0x00,0x1d,0x00,0x0b,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc0,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x00,0x1c,0xc6,0x00,0x2d,\r\n0x1c,0x9e,0x1c,0x9e,0x1c,0xa4,0x1c,0xaa,0x1c,0xb0,0x1c,0xb6,0x1c,0xb6,0x1c,0xb6,0x1c,0xbc,0x1c,0xc2,0x1c,0xc8,0x1c,0xce,0x1c,0xd4,0x1c,0xda,0x1c,0xfe,0x1c,0xe0,0x1c,0xe6,0x1c,0xec,0x1c,0xf2,0x1d,0x16,0x1d,0x16,0x1d,0x16,0x1c,0xf8,0x1c,0xfe,0x1d,0x04,0x1d,0x0a,0x1d,0x10,0x1d,0x16,0x1d,0x1c,0x1d,0x22,0x1d,0x22,0x1d,0x28,\r\n0x1d,0x40,0x1d,0x2e,0x1d,0x34,0x1d,0x3a,0x1d,0x40,0x1d,0x58,0x1d,0x58,0x1d,0x58,0x1d,0x58,0x1d,0x46,0x1d,0x4c,0x1d,0x52,0x1d,0x58,0x00,0x02,0x00,0x1b,0x00,0x60,0x00,0x74,0x00,0x00,0x00,0x78,0x00,0x78,0x00,0x15,0x00,0x8e,0x00,0x9d,0x00,0x16,0x00,0x9f,0x00,0xa0,0x00,0x26,0x00,0xbc,0x00,0xbc,0x00,0x28,0x00,0xdd,0x00,0xdd,\r\n0x00,0x29,0x01,0x22,0x01,0x37,0x00,0x2a,0x01,0x3b,0x01,0x3b,0x00,0x40,0x01,0x4c,0x01,0x5d,0x00,0x41,0x01,0x64,0x01,0x65,0x00,0x53,0x01,0x67,0x01,0x68,0x00,0x55,0x01,0x84,0x01,0x88,0x00,0x57,0x01,0xb0,0x01,0xc2,0x00,0x5c,0x01,0xda,0x01,0xda,0x00,0x6f,0x02,0x02,0x02,0x02,0x00,0x70,0x02,0x1e,0x02,0x1e,0x00,0x71,0x02,0x46,\r\n0x02,0x46,0x00,0x72,0x02,0x5f,0x02,0x5f,0x00,0x73,0x02,0x6d,0x02,0x6d,0x00,0x74,0x02,0x83,0x02,0x83,0x00,0x75,0x02,0x89,0x02,0x89,0x00,0x76,0x02,0x91,0x02,0x94,0x00,0x77,0x05,0xaa,0x05,0xaa,0x00,0x7b,0x05,0xc5,0x05,0xc5,0x00,0x7c,0x05,0xd0,0x05,0xd0,0x00,0x7d,0x05,0xeb,0x05,0xeb,0x00,0x7e,0x05,0xed,0x05,0xed,0x00,0x7f,\r\n0x00,0x2f,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x5c,0x00,0x00,0x1c,0x62,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x68,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,\r\n0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x6e,0x00,0x00,0x1c,0x74,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x7a,0x00,0x00,\r\n0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x7a,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x00,0x1c,0x80,0x00,0x80,\r\n0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,\r\n0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,\r\n0x1b,0xce,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xc8,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,\r\n0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xd4,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xce,0x1b,0xd4,0x1b,0xe0,0x1b,0xe0,0x1b,0xda,0x1b,0xe0,\r\n0x00,0x41,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0x9c,0x00,0x00,0x1a,0xa2,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xa8,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x01,\r\n0x1a,0xe4,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x03,0x19,0xd6,0x00,0x04,0x1a,0xea,0x00,0x04,0x1a,0xf0,0x00,0x04,0x1a,0xf6,0x00,0x02,0x19,0xd0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xae,0x00,0x00,0x1a,0xb4,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,\r\n0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x01,0x1a,0xc0,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x03,0x19,0xd6,0x00,0x02,0x19,0xd6,0x00,0x02,\r\n0x19,0xd6,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xba,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x00,\r\n0x1a,0xc0,0x00,0x00,0x1a,0xc0,0x00,0x02,0x00,0x45,0x00,0x01,0x00,0x5d,0x00,0x00,0x00,0x5f,0x00,0x78,0x00,0x5d,0x00,0x7a,0x00,0x7a,0x00,0x77,0x00,0x7c,0x00,0x86,0x00,0x78,0x00,0x89,0x00,0xdd,0x00,0x83,0x00,0xe1,0x00,0xf2,0x00,0xd8,0x00,0xf4,0x00,0xfc,0x00,0xea,0x00,0xfe,0x01,0x14,0x00,0xf3,0x01,0x16,0x01,0x1f,0x01,0x0a,\r\n0x01,0x21,0x01,0x3b,0x01,0x14,0x01,0x3d,0x01,0x49,0x01,0x2f,0x01,0x4c,0x01,0x7c,0x01,0x3c,0x01,0x7e,0x01,0xc2,0x01,0x6d,0x01,0xc4,0x01,0xc5,0x01,0xb2,0x01,0xc8,0x01,0xc8,0x01,0xb4,0x01,0xca,0x01,0xcc,0x01,0xb5,0x01,0xcf,0x01,0xd6,0x01,0xb8,0x01,0xd8,0x01,0xda,0x01,0xc0,0x01,0xdc,0x01,0xe0,0x01,0xc3,0x01,0xe2,0x01,0xe3,\r\n0x01,0xc8,0x01,0xe9,0x01,0xea,0x01,0xca,0x01,0xed,0x01,0xf2,0x01,0xcc,0x01,0xf4,0x01,0xf5,0x01,0xd2,0x01,0xf7,0x01,0xfd,0x01,0xd4,0x01,0xff,0x02,0x02,0x01,0xdb,0x02,0x04,0x02,0x04,0x01,0xdf,0x02,0x06,0x02,0x0a,0x01,0xe0,0x02,0x0c,0x02,0x0c,0x01,0xe5,0x02,0x0f,0x02,0x10,0x01,0xe6,0x02,0x13,0x02,0x1a,0x01,0xe8,0x02,0x1e,\r\n0x02,0x1e,0x01,0xf0,0x02,0x20,0x02,0x21,0x01,0xf1,0x02,0x23,0x02,0x24,0x01,0xf3,0x02,0x26,0x02,0x27,0x01,0xf5,0x02,0x2e,0x02,0x2e,0x01,0xf7,0x02,0x31,0x02,0x36,0x01,0xf8,0x02,0x38,0x02,0x39,0x01,0xfe,0x02,0x3b,0x02,0x3b,0x02,0x00,0x02,0x40,0x02,0x46,0x02,0x01,0x02,0x48,0x02,0x49,0x02,0x08,0x02,0x4b,0x02,0x4f,0x02,0x0a,\r\n0x02,0x51,0x02,0x53,0x02,0x0f,0x02,0x55,0x02,0x57,0x02,0x12,0x02,0x59,0x02,0x5a,0x02,0x15,0x02,0x5c,0x02,0x5d,0x02,0x17,0x02,0x5f,0x02,0x5f,0x02,0x19,0x02,0x61,0x02,0x61,0x02,0x1a,0x02,0x63,0x02,0x64,0x02,0x1b,0x02,0x66,0x02,0x66,0x02,0x1d,0x02,0x69,0x02,0x6e,0x02,0x1e,0x02,0x70,0x02,0x75,0x02,0x24,0x02,0x79,0x02,0x79,\r\n0x02,0x2a,0x02,0x7b,0x02,0x7b,0x02,0x2b,0x02,0x7d,0x02,0x7e,0x02,0x2c,0x02,0x81,0x02,0x81,0x02,0x2e,0x02,0x83,0x02,0x83,0x02,0x2f,0x02,0x89,0x02,0x89,0x02,0x30,0x02,0x8b,0x02,0x8b,0x02,0x31,0x02,0x8e,0x02,0x94,0x02,0x32,0x02,0x96,0x02,0x99,0x02,0x39,0x02,0x9c,0x02,0x9c,0x02,0x3d,0x02,0xb0,0x02,0xb0,0x02,0x3e,0x02,0xcc,\r\n0x02,0xcc,0x02,0x3f,0x03,0xc3,0x03,0xc3,0x02,0x40,0x03,0xc7,0x03,0xc7,0x02,0x41,0x03,0xcd,0x03,0xcf,0x02,0x42,0x05,0x7d,0x05,0x7e,0x02,0x45,0x05,0xaa,0x05,0xaa,0x02,0x47,0x06,0xcb,0x06,0xcc,0x02,0x48,0x02,0x4a,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,\r\n0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,\r\n0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xd2,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0x66,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x18,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xde,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x18,0xe4,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,\r\n0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,0x1b,0xba,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x19,0x08,0x00,0x00,\r\n0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x54,0x00,0x00,0x1c,0x1a,0x00,0x00,\r\n0x00,0x00,0x18,0x5a,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x5a,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,\r\n0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x66,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x1b,0xc6,\r\n0x1b,0xcc,0x00,0x00,0x18,0x6c,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x72,0x00,0x00,0x18,0x90,0x1b,0xcc,0x00,0x00,0x18,0x78,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x7e,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x84,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,\r\n0x18,0x8a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0xc0,0x00,0x00,0x18,0x90,0x1b,0xcc,0x00,0x00,0x18,0x96,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0x9c,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x18,0xa2,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,\r\n0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,\r\n0x00,0x00,0x1b,0x66,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x18,0xa8,0x00,0x00,0x00,0x00,0x19,0x20,0x00,0x00,0x18,0xae,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,\r\n0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x20,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,\r\n0x1b,0xd2,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x30,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,\r\n0x18,0xb4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xba,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,\r\n0x18,0xc0,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x18,0xc6,0x00,0x00,0x18,0xcc,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x54,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xd2,\r\n0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x66,0x1c,0x3e,0x1a,0xe8,0x1c,0x4a,0x1c,0x50,0x18,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xde,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xe4,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x1c,0x3e,0x1a,0xe8,\r\n0x1c,0x4a,0x1c,0x50,0x19,0x26,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x14,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x4e,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xea,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0x4e,0x1c,0x3e,0x1a,0xe8,0x1c,0x4a,0x1c,0x50,0x18,0xf0,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,\r\n0x18,0xf6,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x18,0xfc,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x02,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x19,0x1a,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x1c,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x1b,0xb4,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x1b,0xb4,\r\n0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,\r\n0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x1c,0x50,0x1c,0x38,0x19,0x0e,0x1c,0x44,\r\n0x1c,0x4a,0x00,0x00,0x1b,0x54,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x66,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x66,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x19,0x26,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,\r\n0x19,0x14,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x54,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x19,0x26,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x14,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,\r\n0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x02,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x19,0x1a,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x19,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0x08,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xd8,0x19,0x0e,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,\r\n0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xe8,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x14,0x00,0x00,0x1c,0x44,\r\n0x00,0x00,0x00,0x00,0x19,0x1a,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x19,0x20,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,\r\n0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x26,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,\r\n0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0xfe,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x2c,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x19,0x56,0x1b,0x6c,\r\n0x00,0x00,0x19,0x2c,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x32,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x4a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x38,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x0a,\r\n0x00,0x00,0x19,0x56,0x1b,0x6c,0x00,0x00,0x19,0x3e,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x44,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x4a,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x50,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x02,0x00,0x00,0x19,0x56,0x1b,0x6c,0x00,0x00,0x19,0x5c,0x00,0x00,0x1c,0x1a,\r\n0x1b,0x6c,0x00,0x00,0x19,0x62,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x68,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x19,0x6e,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1a,0x10,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x1b,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x74,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x7a,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x7a,0x00,0x00,\r\n0x1c,0x26,0x00,0x00,0x00,0x00,0x19,0x80,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,\r\n0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x16,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0x1c,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x22,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x28,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,\r\n0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0x86,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x8c,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,\r\n0x19,0x92,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x98,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0x9e,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x19,0xa4,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x19,0xaa,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1b,0x84,0x00,0x00,0x1c,0x44,0x1c,0x68,0x00,0x00,0x1c,0x5c,0x00,0x00,\r\n0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb0,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xb6,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,\r\n0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x62,0x1c,0x68,0x00,0x00,0x19,0xbc,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xc2,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xc8,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x19,0xce,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x8a,\r\n0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x19,0xd4,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x19,0xda,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x19,0xf8,0x00,0x00,0x1b,0xd2,\r\n0x00,0x00,0x1c,0x50,0x19,0xe0,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x19,0xf8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x19,0xf8,0x00,0x00,0x19,0xe6,0x00,0x00,0x1c,0x50,0x19,0xec,0x00,0x00,0x1c,0x44,0x00,0x00,0x19,0xf2,0x19,0xf8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x1c,0x50,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,\r\n0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x19,0xfe,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1a,0x04,0x00,0x00,0x00,0x00,0x1a,0x0a,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1a,0x10,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,\r\n0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xa8,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x16,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xae,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,\r\n0x1b,0xfc,0x1a,0x1c,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x22,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x28,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xea,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,0x1b,0xfc,0x1a,0xf4,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0xfa,\r\n0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x34,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x2e,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x34,0x1b,0xf6,0x1a,0xe8,0x1c,0x4a,0x1b,0xfc,0x1a,0x3a,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x40,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1a,0x46,0x1b,0xf6,0x1c,0x44,\r\n0x1c,0x4a,0x1b,0xfc,0x1b,0x06,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0x0c,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf6,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x1b,0xf6,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,\r\n0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x5a,0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xc4,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xca,0x00,0x00,0x1a,0x4c,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,\r\n0x1a,0x52,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xbe,0x00,0x00,\r\n0x00,0x00,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x82,0x00,0x00,0x1b,0xfc,0x1a,0x58,0x00,0x00,0x1a,0x88,0x00,0x00,0x1b,0xfc,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xa8,\r\n0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x5e,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x64,0x1b,0xf0,0x1c,0x44,\r\n0x1c,0x4a,0x00,0x00,0x1a,0x6a,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0x70,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xe8,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,\r\n0x1b,0xa8,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xee,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1b,0x00,0x00,0x00,0x00,0x00,0x1b,0x06,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x0c,0x1b,0xf0,\r\n0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x12,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,\r\n0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe2,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,\r\n0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x1b,0xfc,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x76,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,\r\n0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1a,0xb2,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x1a,0x7c,0x00,0x00,0x1b,0xc6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,\r\n0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x82,0x00,0x00,0x1a,0x8e,0x00,0x00,0x00,0x00,0x1a,0x88,0x00,0x00,0x1a,0x8e,0x1c,0x32,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,\r\n0x00,0x00,0x1b,0xae,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1a,0x94,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1a,0x9a,0x00,0x00,0x00,0x00,0x1b,0x9c,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xa0,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xa6,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1a,0xb8,\r\n0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xac,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1a,0xb2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1a,0xb8,0x00,0x00,0x1b,0xd2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,\r\n0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,\r\n0x1c,0x38,0x00,0x00,0x1a,0xbe,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xc4,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xca,0x00,0x00,0x1a,0xd0,0x00,0x00,0x00,0x00,0x1a,0xd6,0x00,0x00,\r\n0x1a,0xdc,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1a,0xe2,0x00,0x00,0x00,0x00,0x1a,0xf4,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1a,0xfa,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x0c,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x18,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xa8,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xae,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xae,\r\n0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xe8,0x1b,0x1e,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0xa8,0x1b,0xf0,0x1b,0x00,\r\n0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1a,0xee,0x1c,0x4a,0x00,0x00,0x1a,0xf4,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1a,0xfa,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1b,0x00,0x1c,0x4a,0x00,0x00,0x1b,0x06,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x0c,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,\r\n0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x12,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1b,0x18,0x1b,0xf0,0x1c,0x44,0x1b,0x1e,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,\r\n0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1b,0x2a,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,\r\n0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,\r\n0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1b,0x5a,0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,\r\n0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0x30,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x36,0x00,0x00,\r\n0x1b,0x3c,0x00,0x00,0x00,0x00,0x1b,0x42,0x00,0x00,0x1c,0x0e,0x00,0x00,0x1b,0x48,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x4e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xd8,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1b,0xd8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x54,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0x5a,\r\n0x00,0x00,0x1b,0x60,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x1a,0x1b,0x6c,0x00,0x00,0x1b,0x72,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,\r\n0x1c,0x4a,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r\n0x1b,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,\r\n0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,\r\n0x00,0x00,0x1b,0x84,0x00,0x00,0x1c,0x56,0x1c,0x68,0x00,0x00,0x1b,0x8a,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,\r\n0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x32,0x1b,0x96,0x00,0x00,0x1b,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xea,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xea,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1b,0xea,0x00,0x00,0x00,0x00,\r\n0x00,0x00,0x00,0x00,0x1b,0x9c,0x00,0x00,0x1b,0xa2,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xa8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xae,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,\r\n0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xb4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,\r\n0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xba,0x00,0x00,0x1b,0xc0,0x00,0x00,0x1b,0xc6,0x1b,0xcc,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1c,0x38,\r\n0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x1b,0xd2,0x00,0x00,0x1b,0xd8,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,\r\n0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xde,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,\r\n0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1b,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x1b,0xf0,\r\n0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1b,0xea,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf0,0x1c,0x44,0x1c,0x4a,0x00,0x00,0x1c,0x32,0x1b,0xf6,0x1c,0x44,0x1c,0x4a,0x1b,0xfc,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x02,0x00,0x00,0x1c,0x44,0x00,0x00,\r\n0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x08,0x00,0x00,0x1c,0x0e,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x14,0x00,0x00,0x1c,0x1a,0x00,0x00,0x00,0x00,0x1c,0x38,\r\n0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x20,0x00,0x00,0x1c,0x26,0x00,0x00,0x00,0x00,0x1c,0x38,0x00,0x00,0x1c,0x44,0x00,0x00,0x00,0x00,0x1c,0x2c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x32,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x38,0x1c,0x3e,0x1c,0x44,0x1c,0x4a,0x1c,0x50,0x1c,0x5c,0x00,0x00,0x1c,0x56,\r\n0x1c,0x68,0x00,0x00,0x1c,0x5c,0x00,0x00,0x1c,0x62,0x1c,0x68,0x00,0x00,0x00,0x01,0xff,0xb4,0x02,0x94,0x00,0x01,0xff,0xba,0x03,0x48,0x00,0x01,0xff,0x51,0x02,0x26,0x00,0x01,0xff,0x04,0x02,0x26,0x00,0x01,0xff,0x07,0x02,0xda,0x00,0x01,0xfe,0xd4,0xff,0x06,0x00,0x01,0xfe,0xd4,0xff,0x2b,0x00,0x01,0xfe,0xca,0xff,0x10,0x00,0x01,\r\n0xfe,0xdb,0xff,0x35,0x00,0x01,0xfe,0xd4,0xff,0x10,0x00,0x01,0xfe,0xd4,0xff,0x3d,0x00,0x01,0xfe,0xca,0x00,0x00,0x00,0x01,0xfe,0xd4,0x00,0x00,0x00,0x01,0xfe,0xd4,0x03,0x09,0x00,0x01,0xfe,0xb3,0x03,0x11,0x00,0x01,0xfe,0xf5,0x03,0x11,0x00,0x01,0xfe,0xf9,0x03,0x11,0x00,0x01,0xfe,0xd4,0x03,0x11,0x00,0x01,0xfe,0xd4,0x03,0x44,\r\n0x00,0x01,0xfe,0xd4,0x03,0x0c,0x00,0x01,0xfe,0xd4,0x02,0xe9,0x00,0x01,0xfe,0xd9,0x03,0x39,0x00,0x01,0xfe,0xae,0x03,0x11,0x00,0x01,0xfe,0xe0,0x03,0x70,0x00,0x01,0xfe,0xd4,0x03,0xb0,0x00,0x01,0xfe,0xb3,0x03,0xb6,0x00,0x01,0xfe,0xf5,0x03,0xb6,0x00,0x01,0xfe,0xf9,0x03,0xb6,0x00,0x01,0xfe,0xd4,0x03,0xe2,0x00,0x01,0xfe,0xd4,\r\n0x03,0xb1,0x00,0x01,0xfe,0xd4,0x03,0x93,0x00,0x01,0xfe,0xd6,0x03,0xd4,0x00,0x01,0xfe,0xae,0x03,0xb6,0x00,0x01,0xfe,0xd4,0x03,0xb6,0x00,0x01,0xfe,0xd9,0x03,0xfc,0x00,0x01,0xfe,0xd4,0x03,0x7a,0x00,0x01,0xfe,0xd4,0x03,0xa2,0x00,0x01,0xff,0x1c,0x03,0x84,0x00,0x01,0xfe,0xf4,0x03,0x84,0x00,0x01,0xfe,0xf7,0x03,0xa2,0x00,0x01,\r\n0xfe,0xd4,0x03,0xa0,0x00,0x01,0xff,0x17,0x03,0xfc,0x00,0x01,0xfe,0xf2,0x03,0xfc,0x00,0x01,0xfe,0xf7,0x03,0xfc,0x00,0x01,0xfe,0xd4,0x03,0xfc,0x00,0x01,0xfe,0xde,0x02,0x26,0x00,0x01,0xfe,0xca,0x02,0x26,0x00,0x01,0xfe,0xb6,0x02,0xda,0x00,0x01,0xfe,0xde,0x02,0xda,0x00,0x01,0xfe,0xca,0x02,0xda,0x00,0x01,0xfe,0xd4,0x02,0x26,\r\n0x00,0x01,0xfe,0xd4,0x02,0xda,0x00,0x01,0x01,0x63,0x02,0x6d,0x00,0x01,0x02,0x44,0x02,0x26,0x00,0x01,0x02,0x44,0x02,0xda,0x00,0x01,0x02,0x44,0x04,0x65,0x00,0x01,0x03,0x0c,0x02,0xda,0x00,0x01,0xfe,0xec,0x02,0x26,0x00,0x01,0xfe,0xd4,0x01,0x45,0x00,0x01,0xfe,0xd4,0x01,0x18,0x00,0x01,0xfe,0xd4,0x01,0x13,0x00,0x01,0x01,0x5c,\r\n0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0xb0,0x00,0x01,0x01,0x61,0x03,0xb6,0x00,0x01,0x01,0x79,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xb6,0x00,0x01,0x01,0x54,0x03,0xfc,0x00,0x01,0x01,0x59,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xfc,0x00,0x01,0x01,0x36,0x03,0xb0,0x00,0x01,0x01,0x36,0xff,0x2b,0x00,0x01,\r\n0x01,0x0b,0x03,0xb6,0x00,0x01,0x01,0x38,0x03,0xd4,0x00,0x01,0x01,0x36,0x03,0x93,0x00,0x01,0x01,0x26,0xff,0x10,0x00,0x01,0x01,0x30,0x00,0x00,0x00,0x01,0x01,0xc2,0x03,0xb6,0x00,0x01,0x00,0xda,0x03,0xb6,0x00,0x01,0x01,0x4a,0xff,0x10,0x00,0x01,0x00,0xaf,0x02,0xda,0x00,0x01,0x01,0x54,0x00,0x00,0x00,0x01,0x01,0x6f,0x03,0xfc,\r\n0x00,0x01,0x01,0x4a,0x03,0xfc,0x00,0x01,0x01,0x4f,0x03,0xfc,0x00,0x01,0x01,0x2c,0x03,0xfc,0x00,0x01,0x01,0x4d,0x03,0xb6,0x00,0x01,0x00,0xf7,0x03,0xb6,0x00,0x01,0x01,0x24,0x03,0xd4,0x00,0x01,0x01,0x22,0x03,0xb1,0x00,0x01,0x01,0x51,0x03,0xb6,0x00,0x01,0x01,0x2c,0x03,0xe2,0x00,0x01,0x01,0x81,0x02,0xda,0x00,0x01,0x01,0x2e,\r\n0x03,0xd4,0x00,0x01,0x01,0x2c,0x03,0x93,0x00,0x01,0x01,0x2c,0x03,0xb0,0x00,0x01,0x01,0x01,0x03,0xb6,0x00,0x01,0x01,0x31,0x03,0x7a,0x00,0x01,0x01,0x31,0x03,0xa2,0x00,0x01,0x01,0x79,0x03,0x84,0x00,0x01,0x01,0x51,0x03,0x84,0x00,0x01,0x01,0x54,0x03,0xa2,0x00,0x01,0x01,0x31,0x03,0xa0,0x00,0x01,0x01,0x31,0x03,0x09,0x00,0x01,\r\n0x01,0x31,0xff,0x2b,0x00,0x01,0x01,0x06,0x03,0x11,0x00,0x01,0x01,0x36,0x03,0x39,0x00,0x01,0x01,0x31,0x02,0xe9,0x00,0x01,0x01,0x31,0x03,0x44,0x00,0x01,0x01,0x5f,0x03,0x11,0x00,0x01,0x01,0x34,0x03,0x11,0x00,0x01,0x01,0x34,0x03,0x09,0x00,0x01,0x01,0x29,0x02,0x26,0x00,0x01,0x01,0x54,0x03,0x11,0x00,0x01,0x01,0x29,0x03,0x11,\r\n0x00,0x01,0x01,0x35,0x03,0x70,0x00,0x01,0x01,0x29,0x03,0x09,0x00,0x01,0x00,0x89,0x02,0xda,0x00,0x01,0x00,0x89,0x03,0xc5,0x00,0x01,0x01,0x66,0x03,0x11,0x00,0x01,0x01,0x3b,0x03,0x11,0x00,0x01,0x01,0x10,0x03,0x11,0x00,0x01,0x01,0x40,0x03,0x39,0x00,0x01,0x01,0x3b,0x02,0xe9,0x00,0x01,0x01,0x3b,0x03,0x0c,0x00,0x01,0x01,0x7c,\r\n0x02,0x26,0x00,0x01,0x01,0x7c,0x03,0x11,0x00,0x01,0x01,0x1b,0x03,0xb6,0x00,0x01,0x01,0x36,0xff,0x10,0x00,0x01,0x00,0xdc,0x02,0xda,0x00,0x01,0x01,0x18,0x01,0x6d,0x00,0x01,0x00,0xf0,0x02,0xda,0x00,0x01,0x01,0x5c,0x03,0x11,0x00,0x01,0x00,0x5a,0x02,0x85,0x00,0x01,0x01,0x31,0x03,0x11,0x00,0x01,0x01,0x31,0x03,0x0c,0x00,0x01,\r\n0x01,0x74,0x03,0x84,0x00,0x01,0x01,0x4c,0x03,0x84,0x00,0x01,0x01,0x4f,0x03,0xa2,0x00,0x01,0x01,0x2c,0x03,0xa0,0x00,0x01,0x01,0x4d,0x03,0x11,0x00,0x01,0x01,0x22,0x02,0x26,0x00,0x01,0x00,0xf7,0x03,0x11,0x00,0x01,0x01,0x27,0x03,0x39,0x00,0x01,0x01,0x22,0x03,0x0c,0x00,0x01,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x87,0xff,0x10,\r\n0x00,0x01,0x00,0xfa,0x02,0xc1,0x00,0x01,0x01,0x57,0x03,0xf4,0x00,0x01,0x01,0x2c,0x03,0xf4,0x00,0x01,0x01,0x01,0x03,0xf4,0x00,0x01,0x01,0x2c,0x03,0xcc,0x00,0x01,0x01,0x48,0x03,0xb6,0x00,0x01,0x01,0x1d,0x02,0xda,0x00,0x01,0x01,0x68,0x00,0x00,0x00,0x01,0x01,0x5e,0xff,0x10,0x00,0x01,0x01,0x13,0x01,0x13,0x00,0x01,0x01,0x38,\r\n0x03,0x70,0x00,0x01,0x01,0x2c,0xfe,0xf2,0x00,0x01,0x01,0xb7,0x02,0x26,0x00,0x01,0x01,0xb7,0x03,0x11,0x00,0x01,0x01,0x25,0x03,0xb6,0x00,0x01,0x01,0x27,0xff,0x10,0x00,0x01,0x00,0xfa,0x02,0xda,0x00,0x01,0x01,0x22,0xff,0x10,0x00,0x01,0x01,0x6b,0x03,0x11,0x00,0x01,0x01,0x40,0x03,0x11,0x00,0x01,0x00,0xf5,0x00,0x00,0x00,0x01,\r\n0x01,0x40,0x02,0x26,0x00,0x01,0x00,0xe6,0xff,0x10,0x00,0x01,0x01,0xcc,0xff,0x2b,0x00,0x01,0x01,0x2c,0xff,0x2b,0x00,0x01,0x01,0x2b,0xff,0x2b,0x00,0x01,0x01,0x01,0x03,0x11,0x00,0x01,0x01,0x31,0x03,0x39,0x00,0x01,0x01,0x2b,0x00,0x00,0x00,0x01,0x01,0x51,0x03,0x11,0x00,0x01,0x01,0x2c,0x02,0xe9,0x00,0x01,0x01,0x2c,0x03,0x44,\r\n0x00,0x01,0x01,0x2c,0x03,0x0c,0x00,0x01,0x01,0xcd,0x00,0x00,0x00,0x01,0x01,0x6b,0x03,0xb6,0x00,0x01,0x01,0x36,0x03,0xb1,0x00,0x01,0x01,0xc2,0x02,0xda,0x00,0x01,0x01,0x21,0x02,0xda,0x00,0x01,0x01,0x21,0x00,0x00,0x00,0x01,0x01,0x28,0x02,0xda,0x00,0x01,0x01,0x28,0x01,0x6d,0x00,0x01,0x01,0x22,0x02,0xda,0x00,0x01,0x01,0x57,\r\n0x03,0xb6,0x00,0x01,0x01,0x27,0x02,0xda,0x00,0x01,0x01,0x27,0x00,0x00,0x00,0x01,0x01,0x2c,0x03,0xb6,0x00,0x01,0x01,0xd1,0x00,0x00,0x00,0x01,0x01,0x4a,0x02,0x26,0x00,0x01,0x01,0x75,0x03,0x11,0x00,0x01,0x01,0x5a,0x03,0x11,0x00,0x01,0x01,0x3b,0x03,0x09,0x00,0x01,0x01,0x7c,0x03,0x09,0x00,0x01,0x01,0x4f,0x02,0x26,0x00,0x01,\r\n0x00,0xfa,0x02,0x26,0x00,0x01,0x01,0xb7,0x03,0x09,0x00,0x01,0x01,0x27,0xfe,0xf2,0x00,0x01,0x01,0x57,0x03,0x11,0x00,0x01,0x01,0x2c,0x03,0x11,0x00,0x01,0x01,0x40,0x02,0xda,0x00,0x01,0x01,0xf4,0x00,0x00,0x00,0x01,0x01,0x36,0x02,0xda,0x00,0x01,0x01,0x36,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0x40,0x00,0x00,\r\n0x00,0x01,0x01,0x2c,0x03,0xb1,0x00,0x01,0x01,0x2f,0x02,0x26,0x00,0x01,0x01,0x27,0x03,0x09,0x00,0x01,0x01,0x2c,0x03,0x09,0x00,0x01,0x01,0xa4,0x02,0x26,0x00,0x01,0x01,0x4c,0x02,0x26,0x00,0x01,0x01,0x2c,0x01,0x13,0x00,0x01,0x01,0x31,0x02,0x26,0x00,0x01,0x01,0x28,0x02,0x26,0x00,0x01,0x01,0x28,0x00,0x00,0x00,0x01,0x01,0x31,\r\n0x02,0xda,0x00,0x01,0x01,0x31,0x00,0x00,0x00,0x01,0x01,0x34,0x02,0x26,0x00,0x01,0x01,0x34,0x00,0x00,0x00,0x01,0x01,0x27,0x02,0x26,0x00,0x01,0x01,0x2c,0x02,0x26,0x00,0x01,0x01,0x2c,0x02,0xda,0x00,0x01,0x01,0x40,0x02,0xbc,0x00,0x01,0x01,0x2c,0x00,0x00,0x00,0x01,0x01,0x5e,0x00,0x00,0x00,0x01,0x01,0x2c,0x01,0x6d,0x00,0x01,\r\n0x01,0x3b,0x00,0x00,0x00,0x01,0x01,0x3b,0x02,0x26,0x00,0x01,0x01,0x3b,0xff,0x2b,0x00,0x01,0x01,0x4a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0a,0x00,0x18,0x01,0x1c,0x00,0x02,0x44,0x46,0x4c,0x54,0x04,0xac,0x6c,0x61,0x74,0x6e,0x04,0xb0,0x00,0x2b,0x61,0x61,0x6c,0x74,0x05,0xb4,0x63,0x61,0x6c,0x74,0x05,0xe4,0x63,0x61,\r\n0x73,0x65,0x04,0xd6,0x63,0x63,0x6d,0x70,0x05,0xc4,0x63,0x63,0x6d,0x70,0x05,0xd8,0x63,0x76,0x30,0x31,0x04,0xdc,0x63,0x76,0x30,0x32,0x04,0xe2,0x63,0x76,0x30,0x33,0x04,0xe8,0x63,0x76,0x30,0x34,0x04,0xee,0x63,0x76,0x30,0x35,0x04,0xf4,0x63,0x76,0x30,0x36,0x04,0xfa,0x63,0x76,0x30,0x37,0x05,0x00,0x63,0x76,0x30,0x38,0x05,0x06,\r\n0x63,0x76,0x30,0x39,0x05,0x0c,0x63,0x76,0x31,0x30,0x05,0x12,0x63,0x76,0x31,0x31,0x05,0x18,0x63,0x76,0x31,0x32,0x05,0x1e,0x63,0x76,0x31,0x34,0x05,0x24,0x63,0x76,0x31,0x35,0x05,0x2a,0x63,0x76,0x31,0x36,0x05,0x30,0x63,0x76,0x31,0x37,0x05,0x36,0x63,0x76,0x31,0x38,0x05,0x3c,0x63,0x76,0x31,0x39,0x05,0x42,0x63,0x76,0x32,0x30,\r\n0x05,0x48,0x63,0x76,0x39,0x39,0x05,0x4e,0x66,0x72,0x61,0x63,0x05,0xce,0x6c,0x6f,0x63,0x6c,0x05,0x54,0x6c,0x6f,0x63,0x6c,0x05,0x5a,0x6c,0x6f,0x63,0x6c,0x05,0x60,0x6c,0x6f,0x63,0x6c,0x05,0x66,0x6c,0x6f,0x63,0x6c,0x05,0x6c,0x6c,0x6f,0x63,0x6c,0x05,0x72,0x6c,0x6f,0x63,0x6c,0x05,0x78,0x6c,0x6f,0x63,0x6c,0x05,0x7e,0x6f,0x72,\r\n0x64,0x6e,0x05,0xbc,0x73,0x69,0x6e,0x66,0x05,0x84,0x73,0x73,0x30,0x31,0x05,0x8a,0x73,0x73,0x30,0x32,0x05,0x90,0x73,0x73,0x31,0x39,0x05,0x96,0x73,0x73,0x32,0x30,0x05,0x9c,0x73,0x75,0x62,0x73,0x05,0xa2,0x73,0x75,0x70,0x73,0x05,0xa8,0x7a,0x65,0x72,0x6f,0x05,0xae,0x01,0xcc,0x06,0x18,0x06,0x20,0x06,0x28,0x06,0x30,0x06,0x38,\r\n0x06,0x40,0x06,0x40,0x06,0x48,0x06,0x50,0x06,0x58,0x06,0x60,0x06,0x68,0x06,0x70,0x06,0x78,0x06,0x80,0x06,0x88,0x06,0x90,0x06,0x98,0x06,0xa0,0x06,0xa8,0x06,0xb0,0x0a,0x90,0x06,0xb8,0x06,0xc0,0x0a,0x90,0x06,0xc8,0x06,0xd0,0x0c,0x60,0x06,0xd8,0x06,0xe0,0x06,0xe8,0x06,0xf0,0x06,0xf8,0x07,0x00,0x07,0x28,0x07,0x08,0x07,0x10,\r\n0x07,0x28,0x07,0x28,0x07,0x18,0x07,0x20,0x07,0x28,0x07,0x28,0x07,0x28,0x07,0x30,0x07,0x38,0x07,0x40,0x07,0x48,0x07,0x50,0x07,0x58,0x07,0x60,0x07,0x68,0x07,0x70,0x07,0x78,0x11,0xb0,0x07,0x80,0x11,0xba,0x07,0x88,0x07,0x90,0x07,0x98,0x07,0xd0,0x07,0xa0,0x07,0xa8,0x07,0xd0,0x07,0xd0,0x07,0xb0,0x07,0xb8,0x07,0xc0,0x07,0xc8,\r\n0x07,0xd0,0x07,0xd8,0x07,0xe0,0x0d,0x70,0x07,0xe8,0x07,0xf0,0x07,0xf8,0x08,0x00,0x08,0x28,0x08,0x08,0x08,0x10,0x08,0x18,0x08,0x20,0x08,0x28,0x08,0x28,0x08,0x30,0x08,0x38,0x08,0x50,0x08,0x40,0x08,0x48,0x08,0x50,0x08,0x50,0x08,0x58,0x08,0x60,0x08,0x68,0x08,0x70,0x08,0x98,0x08,0x78,0x08,0x80,0x08,0x98,0x08,0x98,0x08,0x88,\r\n0x08,0x90,0x08,0x98,0x08,0xa0,0x08,0xa8,0x0c,0x60,0x08,0xb0,0x08,0xb8,0x0e,0x40,0x08,0xc0,0x08,0xc8,0x08,0xd0,0x08,0xd8,0x0c,0x60,0x08,0xe0,0x08,0xe8,0x08,0xf0,0x08,0xf8,0x09,0x00,0x09,0x08,0x0e,0x40,0x09,0x10,0x09,0x18,0x0e,0x40,0x09,0x20,0x09,0x28,0x0e,0x40,0x0e,0x40,0x09,0x30,0x09,0x38,0x0e,0x40,0x09,0x40,0x09,0x48,\r\n0x09,0x50,0x09,0x58,0x09,0x60,0x09,0x68,0x0c,0x28,0x0c,0x28,0x09,0x70,0x09,0x78,0x0c,0x28,0x09,0x80,0x09,0x88,0x09,0x90,0x09,0x98,0x09,0xa0,0x09,0xa8,0x0d,0xd8,0x09,0xb0,0x09,0xb8,0x0c,0x60,0x09,0xc0,0x09,0xc8,0x09,0xd0,0x09,0xd8,0x0d,0xd8,0x09,0xe0,0x09,0xe8,0x0d,0xd8,0x0d,0xd8,0x09,0xf0,0x09,0xf8,0x0a,0x00,0x0a,0x08,\r\n0x0a,0x10,0x0a,0x18,0x0a,0x20,0x0a,0x28,0x0a,0x30,0x0a,0x38,0x0e,0x40,0x0a,0x40,0x0a,0x48,0x0d,0x70,0x0a,0x50,0x0a,0x58,0x0a,0x60,0x0a,0x68,0x0d,0x18,0x0a,0x70,0x0a,0x78,0x0a,0x80,0x0a,0x88,0x0a,0x90,0x0a,0x98,0x0a,0xa0,0x0d,0x70,0x0a,0xa8,0x0a,0xb0,0x0d,0x70,0x0a,0xb8,0x0a,0xc0,0x0a,0xc8,0x0a,0xd0,0x0d,0x70,0x0a,0xd8,\r\n0x0a,0xe0,0x0d,0x70,0x0d,0x70,0x0a,0xe8,0x0a,0xf0,0x0d,0x70,0x0a,0xf8,0x0b,0x00,0x0b,0x08,0x0b,0x10,0x0b,0x18,0x0b,0x20,0x0b,0x28,0x0b,0x30,0x0b,0xa0,0x0b,0x38,0x0b,0x40,0x0b,0x58,0x0b,0x48,0x0b,0x50,0x0b,0x58,0x0b,0x58,0x0b,0x60,0x0b,0x68,0x0b,0xa0,0x0b,0xa0,0x0b,0x70,0x0b,0x78,0x0b,0x80,0x0b,0x88,0x0b,0x90,0x0b,0x98,\r\n0x0b,0xa0,0x0b,0xa8,0x0b,0xb0,0x0c,0x28,0x0c,0x28,0x0b,0xb8,0x0b,0xc0,0x0c,0x28,0x0b,0xc8,0x0b,0xd0,0x0b,0xd8,0x0b,0xe0,0x0c,0x28,0x0b,0xe8,0x0b,0xf0,0x0c,0x28,0x0b,0xf8,0x0c,0x00,0x0c,0x08,0x0c,0x10,0x0c,0x18,0x0c,0x20,0x0c,0x28,0x0c,0x30,0x0c,0x38,0x0c,0x60,0x0c,0x40,0x0c,0x48,0x0c,0x60,0x0c,0x50,0x0c,0x58,0x0c,0x60,\r\n0x0c,0x60,0x0c,0x68,0x0c,0x70,0x0c,0x88,0x0c,0x78,0x0c,0x80,0x0c,0x88,0x0c,0x88,0x0c,0x90,0x0c,0x98,0x0c,0xa0,0x0c,0xa8,0x0c,0xb0,0x0c,0xb8,0x0c,0xc0,0x0c,0xc8,0x0c,0xf0,0x0c,0xd0,0x0c,0xd8,0x0c,0xe0,0x0c,0xe8,0x0c,0xf0,0x0c,0xf0,0x0c,0xf8,0x0d,0x00,0x0d,0x08,0x0d,0x10,0x0d,0x18,0x0d,0x20,0x0d,0x28,0x0d,0x70,0x0d,0x30,\r\n0x0d,0x38,0x0e,0x40,0x0d,0x40,0x0d,0x48,0x0e,0x40,0x0d,0x50,0x0d,0x58,0x0d,0x70,0x0d,0x60,0x0d,0x68,0x0d,0x70,0x0d,0x78,0x0d,0x80,0x0d,0xd8,0x0d,0x88,0x0d,0x90,0x0d,0xd8,0x0d,0x98,0x0d,0xa0,0x0d,0xd8,0x0d,0xa8,0x0d,0xb0,0x0d,0xd8,0x0d,0xb8,0x0d,0xc0,0x0d,0xc8,0x0d,0xd0,0x0d,0xd8,0x0d,0xe0,0x0d,0xe8,0x0d,0xf0,0x0d,0xf8,\r\n0x0e,0xb8,0x0e,0x00,0x0e,0x08,0x0e,0x10,0x0e,0x18,0x0e,0x20,0x0e,0x28,0x0e,0x40,0x0e,0x30,0x0e,0x38,0x0e,0x40,0x0e,0x48,0x0e,0x50,0x0e,0x58,0x0e,0x60,0x0e,0x68,0x0e,0x70,0x0e,0x78,0x0e,0x80,0x0e,0x88,0x0e,0x90,0x0e,0xb8,0x0e,0x98,0x0e,0xa0,0x0e,0xa8,0x0e,0xb0,0x0e,0xb8,0x0e,0xc0,0x0e,0xc8,0x0e,0xd0,0x0e,0xd8,0x0e,0xe0,\r\n0x0e,0xe8,0x0e,0xf0,0x0e,0xf8,0x0f,0x00,0x0f,0x08,0x0f,0x10,0x0f,0x18,0x0f,0x20,0x0f,0x28,0x0f,0x30,0x0f,0x38,0x0f,0x40,0x0f,0x48,0x0f,0x50,0x0f,0x58,0x0f,0x60,0x0f,0x68,0x0f,0x70,0x0f,0x78,0x0f,0x80,0x0f,0x88,0x0f,0x90,0x0f,0x98,0x0f,0xa0,0x0f,0xa8,0x0f,0xb0,0x0f,0xb8,0x0f,0xc0,0x0f,0xc8,0x0f,0xd0,0x0f,0xd8,0x0f,0xe0,\r\n0x0f,0xe8,0x0f,0xf0,0x0f,0xf8,0x10,0x00,0x10,0x08,0x10,0x10,0x10,0x18,0x10,0x20,0x10,0x28,0x10,0x30,0x10,0x38,0x10,0x40,0x10,0x48,0x10,0x50,0x10,0x58,0x11,0xd8,0x10,0x60,0x10,0x60,0x10,0x68,0x10,0x70,0x10,0x70,0x10,0x78,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x88,0x10,0x88,0x10,0x90,0x10,0xa0,0x10,0x98,\r\n0x10,0xa0,0x10,0xa0,0x10,0xa8,0x10,0xa8,0x10,0xb0,0x10,0xb8,0x10,0xc0,0x11,0xc4,0x10,0xc8,0x10,0xc8,0x11,0xce,0x10,0xd0,0x10,0xd8,0x10,0xe0,0x10,0xe8,0x10,0xf0,0x10,0xf8,0x11,0x00,0x11,0x08,0x11,0x10,0x11,0x18,0x11,0x20,0x11,0x28,0x11,0x30,0x11,0x38,0x11,0x40,0x11,0x48,0x11,0x50,0x11,0x58,0x11,0x60,0x11,0x68,0x11,0x70,\r\n0x11,0x78,0x11,0x80,0x11,0x88,0x11,0x90,0x11,0x98,0x11,0xa0,0x11,0xa8,0x0e,0x4c,0x00,0x00,0x0e,0x92,0x00,0x08,0x41,0x5a,0x45,0x20,0x0e,0xdc,0x43,0x41,0x54,0x20,0x0f,0x28,0x43,0x52,0x54,0x20,0x0f,0x74,0x4b,0x41,0x5a,0x20,0x0f,0xc0,0x4d,0x4f,0x4c,0x20,0x10,0x0c,0x52,0x4f,0x4d,0x20,0x10,0x58,0x54,0x41,0x54,0x20,0x10,0xa4,\r\n0x54,0x52,0x4b,0x20,0x10,0xf0,0x00,0x00,0x00,0x01,0x01,0xb2,0x00,0x00,0x00,0x01,0x01,0xb8,0x00,0x00,0x00,0x01,0x01,0xb9,0x00,0x00,0x00,0x01,0x01,0xba,0x00,0x00,0x00,0x01,0x01,0xbb,0x00,0x00,0x00,0x01,0x01,0xbc,0x00,0x00,0x00,0x01,0x01,0xbd,0x00,0x00,0x00,0x01,0x01,0xbe,0x00,0x00,0x00,0x01,0x01,0xbf,0x00,0x00,0x00,0x01,\r\n0x01,0xc0,0x00,0x00,0x00,0x01,0x01,0xc1,0x00,0x00,0x00,0x01,0x01,0xc2,0x00,0x00,0x00,0x01,0x01,0xc3,0x00,0x00,0x00,0x01,0x01,0xc4,0x00,0x00,0x00,0x01,0x01,0xc5,0x00,0x00,0x00,0x01,0x01,0xc6,0x00,0x00,0x00,0x01,0x01,0xc7,0x00,0x00,0x00,0x01,0x01,0xc8,0x00,0x00,0x00,0x01,0x01,0xc9,0x00,0x00,0x00,0x01,0x01,0xca,0x00,0x00,\r\n0x00,0x01,0x01,0xcb,0x00,0x00,0x00,0x01,0x01,0x9b,0x00,0x00,0x00,0x01,0x01,0xa2,0x00,0x00,0x00,0x01,0x01,0x9c,0x00,0x00,0x00,0x01,0x01,0x9d,0x00,0x00,0x00,0x01,0x01,0xa1,0x00,0x00,0x00,0x01,0x01,0xa0,0x00,0x00,0x00,0x01,0x01,0x9e,0x00,0x00,0x00,0x01,0x01,0x9f,0x00,0x00,0x00,0x01,0x01,0xa8,0x10,0x54,0x00,0x01,0x01,0xb4,\r\n0x10,0x52,0x00,0x01,0x01,0xb5,0x10,0x50,0x00,0x01,0x01,0xb6,0x10,0x4e,0x00,0x01,0x01,0xb7,0x00,0x00,0x00,0x01,0x01,0xa7,0x00,0x00,0x00,0x01,0x01,0xa9,0x00,0x00,0x00,0x01,0x01,0xb3,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x01,0xaf,0x01,0xb1,0x00,0x00,0x00,0x03,0x01,0x94,0x01,0x97,0x01,0x9a,0x00,0x00,\r\n0x00,0x03,0x01,0xaa,0x01,0xab,0x01,0xac,0x00,0x00,0x00,0x04,0x01,0x94,0x01,0x97,0x01,0x9a,0x01,0x9a,0x00,0x00,0x00,0x9a,0x00,0x02,0x00,0x04,0x00,0x07,0x00,0x0a,0x00,0x0d,0x00,0x10,0x00,0x13,0x00,0x16,0x00,0x19,0x00,0x1c,0x00,0x1e,0x00,0x20,0x00,0x23,0x00,0x27,0x00,0x2c,0x00,0x2e,0x00,0x30,0x00,0x32,0x00,0x34,0x00,0x36,\r\n0x00,0x38,0x00,0x3a,0x00,0x3d,0x00,0x41,0x00,0x43,0x00,0x46,0x00,0x49,0x00,0x4b,0x00,0x4e,0x00,0x50,0x00,0x54,0x00,0x57,0x00,0x5b,0x00,0x5d,0x00,0x60,0x00,0x64,0x00,0x67,0x00,0x6a,0x00,0x6d,0x00,0x6f,0x00,0x72,0x00,0x74,0x00,0x76,0x00,0x79,0x00,0x7c,0x00,0x80,0x00,0x83,0x00,0x85,0x00,0x87,0x00,0x8b,0x00,0x8e,0x00,0x90,\r\n0x00,0x92,0x00,0x95,0x00,0x98,0x00,0x9a,0x00,0x9d,0x00,0xa1,0x00,0xa3,0x00,0xa5,0x00,0xa7,0x00,0xa9,0x00,0xac,0x00,0xaf,0x00,0xb1,0x00,0xb4,0x00,0xb6,0x00,0xb9,0x00,0xbc,0x00,0xbf,0x00,0xc1,0x00,0xc4,0x00,0xc8,0x00,0xcb,0x00,0xcd,0x00,0xcf,0x00,0xd1,0x00,0xd4,0x00,0xd7,0x00,0xdb,0x00,0xdf,0x00,0xe1,0x00,0xe3,0x00,0xe6,\r\n0x00,0xea,0x00,0xed,0x00,0xef,0x00,0xf2,0x00,0xf5,0x00,0xf7,0x00,0xf9,0x00,0xfc,0x00,0xff,0x01,0x02,0x01,0x06,0x01,0x09,0x01,0x0d,0x01,0x0f,0x01,0x11,0x01,0x13,0x01,0x16,0x01,0x18,0x01,0x1c,0x01,0x1e,0x01,0x21,0x01,0x24,0x01,0x27,0x01,0x2a,0x01,0x2d,0x01,0x30,0x01,0x33,0x01,0x36,0x01,0x39,0x01,0x3c,0x01,0x3e,0x01,0x41,\r\n0x01,0x43,0x01,0x46,0x01,0x48,0x01,0x4a,0x01,0x4d,0x01,0x50,0x01,0x52,0x01,0x54,0x01,0x56,0x01,0x58,0x01,0x5b,0x01,0x5d,0x01,0x60,0x01,0x62,0x01,0x64,0x01,0x66,0x01,0x68,0x01,0x6a,0x01,0x6c,0x01,0x6e,0x01,0x70,0x01,0x72,0x01,0x74,0x01,0x76,0x01,0x78,0x01,0x7a,0x01,0x7c,0x01,0x7e,0x01,0x80,0x01,0x82,0x01,0x84,0x01,0x86,\r\n0x01,0x88,0x01,0x8a,0x01,0x8c,0x01,0x8e,0x01,0x90,0x01,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x20,0x00,0x00,0x03,0x00,0x00,0x00,0x01,0x1d,0xcc,0x00,0x06,0x00,0x00,0x00,0x01,0x1b,0xf6,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xba,0x00,0x06,0x00,0x00,0x00,0x01,0x1b,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xb0,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x10,0x3a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xa6,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0xa4,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x2a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x98,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x1c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x11,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x26,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x28,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x2a,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x2c,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x18,0xcc,0x00,0x01,0x00,0x00,0x00,0x01,0x18,0xd0,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x1e,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x20,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x0e,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0f,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0e,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xf2,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0xf4,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xf6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xfc,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xfe,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x02,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x11,0x04,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x8e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x84,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xe8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x62,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xe8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xec,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x10,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xf4,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0xa2,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x0c,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x8a,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0d,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0x00,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xb6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xb8,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xe6,0x00,0x06,0x00,0x00,0x00,0x01,0x0e,0x62,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xdc,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x10,0x9a,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0xca,0x00,0x06,0x00,0x00,0x00,0x01,0x17,0x0c,0x00,0x01,0x00,0x00,0x00,0x01,0x17,0x10,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x86,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x88,0x00,0x06,0x00,0x00,0x00,0x01,0x19,0x28,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0x82,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x16,0xf8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x74,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x76,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x78,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x7a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x7c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0x7e,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0xd2,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x50,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0xca,0x00,0x01,0x00,0x00,0x00,0x01,0x0c,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x62,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0x9c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x16,0xa0,0x00,0x06,0x00,0x00,0x00,0x01,0x16,0xa4,0x00,0x01,0x00,0x00,0x00,0x01,0x16,0xa8,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x44,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x50,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x5a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x5c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0x5e,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x0b,0x9c,0x00,0x06,0x00,0x00,0x00,0x01,0x0d,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x0b,0x92,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x42,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x44,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0x46,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x50,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x15,0xbc,0x00,0x01,0x00,0x00,0x00,0x01,0x15,0xc0,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x4c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x4e,0x00,0x06,0x00,0x00,0x00,0x01,0x0c,0x82,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0a,0xf8,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xf6,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x38,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x3a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x3c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x3e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x42,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0c,0x42,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xbc,0x00,0x06,0x00,0x00,0x00,0x01,0x0c,0x3a,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0xb2,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x2a,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x10,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x2e,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x32,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x68,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x5e,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0b,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x52,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0xd2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x48,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xee,0x00,0x06,0x00,0x00,0x00,0x01,0x14,0xa4,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x14,0xa8,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x0a,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xdc,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xde,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe2,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0f,0xe4,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xe6,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xe8,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xea,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xee,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xf0,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xf2,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0f,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0xf6,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0b,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x90,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0xd0,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0xd2,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xfa,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x76,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x74,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xe2,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x60,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x09,0x5e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x96,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x98,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x9e,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0xa2,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x09,0x24,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x90,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x92,0x00,0x06,0x00,0x00,0x00,0x01,0x0a,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x0a,0x00,0x01,0x00,0x00,0x00,0x01,0x09,0x08,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x7c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x7e,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0a,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0xee,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0xec,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x68,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0xec,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x64,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x66,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x9a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x60,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x62,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0f,0x64,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x66,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x68,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x6c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x6e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0f,0x74,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x76,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x38,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x70,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x72,0x00,0x06,0x00,0x00,0x00,0x01,0x09,0x8a,0x00,0x01,0x00,0x00,0x00,0x01,0x08,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x54,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x12,0x58,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x56,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x5a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x5c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x5e,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0xdc,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x12,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x28,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x30,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x34,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x38,0x00,0x06,0x00,0x00,0x00,0x01,0x12,0x3c,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x40,0x00,0x06,0x00,0x00,\r\n0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x01,0x00,0x00,0x00,0x01,0x07,0x6a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x2a,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0xcc,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x11,0xd0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0xb4,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xb8,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x14,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x9c,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xa0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x0c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x0e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x10,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0x12,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x84,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0x88,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x04,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x06,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x08,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x0a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x0c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0x0e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x10,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x12,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x14,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x16,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1a,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0f,0x1e,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x20,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x22,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x24,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x26,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x28,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x2a,0x00,0x06,0x00,0x00,0x00,0x01,0x10,0xec,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0xf0,0x00,0x06,0x00,0x00,0x00,0x01,0x0f,0x1c,0x00,0x01,0x00,0x00,0x00,0x01,0x0f,0x1e,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0xd8,0x00,0x06,0x00,0x00,0x00,0x01,0x11,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0x1c,0x00,0x04,0x00,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0xa8,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x10,0xca,0x00,0x06,0x00,0x00,0x00,0x01,0x06,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x96,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x94,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x92,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x86,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x88,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x86,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x05,0x84,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x90,0x00,0x04,0x00,0x00,0x00,0x01,0x06,0xb2,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x6a,0x00,0x01,0x00,0x00,0x00,0x01,0x14,0xac,0x00,0x01,0x00,0x00,0x00,0x01,0x13,0x42,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x6e,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x0e,0x78,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xea,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x40,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x3e,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x54,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0xdc,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x2c,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xc8,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x12,0x52,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x1a,0x00,0x01,0x00,0x00,0x00,0x01,0x05,0x18,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xf2,0x00,0x01,0x00,0x00,0x00,0x01,0x12,0x58,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x48,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x12,0x00,0x01,0x00,0x00,0x00,0x01,0x04,0xf6,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x04,0xf4,0x00,0x01,0x00,0x00,0x00,0x01,0x11,0xe6,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x30,0x00,0x01,0x00,0x00,0x00,0x01,0x10,0x38,0x00,0x01,0x00,0x00,0x00,0x01,0x0d,0xe2,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0xca,0x10,0xe0,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0xec,0x11,0x02,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0x6e,\r\n0x10,0x80,0x00,0x06,0x00,0x00,0x00,0x02,0x10,0x88,0x10,0x9a,0x00,0x06,0x00,0x00,0x00,0x04,0x10,0xfa,0x11,0x4a,0x11,0x0c,0x11,0x1e,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,\r\n0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x22,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,\r\n0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,\r\n0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1a,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,\r\n0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1b,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,\r\n0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1c,\r\n0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,\r\n0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1d,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,\r\n0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1e,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,\r\n0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x1f,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,\r\n0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x20,0x00,0x22,0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,\r\n0x00,0x2a,0x00,0x00,0xff,0xff,0x00,0x23,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x06,0x00,0x07,0x00,0x08,0x00,0x09,0x00,0x0a,0x00,0x0b,0x00,0x0c,0x00,0x0d,0x00,0x0e,0x00,0x0f,0x00,0x10,0x00,0x11,0x00,0x12,0x00,0x13,0x00,0x14,0x00,0x15,0x00,0x16,0x00,0x17,0x00,0x18,0x00,0x19,0x00,0x21,0x00,0x22,0x00,0x23,\r\n0x00,0x24,0x00,0x25,0x00,0x26,0x00,0x27,0x00,0x28,0x00,0x29,0x00,0x2a,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x01,0x00,0x00,0x01,0x02,0x00,0x00,0x01,0x03,0x00,0x01,0x12,0x42,0x00,0x15,0x00,0x01,0x12,0x36,0x00,0x33,0x00,0x01,0x11,0xc0,0x00,0x31,0x00,0x01,0x11,0xba,0x03,0x89,0x00,0x01,0x11,0xba,0x00,0x35,0x00,0x01,0x11,0xb4,\r\n0x03,0x88,0x00,0x01,0x11,0xb4,0x00,0x66,0x00,0x01,0x11,0xae,0x00,0x67,0x00,0x01,0x11,0xa8,0x00,0x68,0x00,0x01,0x11,0xa2,0x03,0x94,0x00,0x01,0x12,0x0c,0x00,0x6e,0x00,0x01,0x12,0x06,0x00,0x70,0x00,0x01,0x12,0x00,0x03,0x91,0x00,0x01,0x11,0x90,0x00,0x63,0x00,0x01,0x11,0x8a,0x03,0x9a,0x00,0x01,0x11,0x8a,0x02,0x08,0x00,0x01,\r\n0x11,0x84,0x02,0x09,0x00,0x01,0x11,0x7e,0x02,0xb9,0x00,0x01,0x11,0x7e,0x00,0x56,0x00,0x01,0x11,0x78,0x00,0x57,0x00,0x01,0x11,0x72,0x03,0xa5,0x00,0x01,0x11,0x72,0x02,0x32,0x00,0x01,0x11,0x6c,0x02,0x35,0x00,0x01,0x11,0x6c,0x02,0x15,0x00,0x01,0x11,0x66,0x02,0x18,0x00,0x01,0x11,0x66,0x00,0x60,0x00,0x01,0x11,0x60,0x03,0xa0,\r\n0x00,0x01,0x11,0x60,0x02,0x0a,0x00,0x01,0x11,0x5a,0x02,0x0b,0x00,0x01,0x11,0x94,0x00,0x59,0x00,0x01,0x11,0x54,0x00,0x60,0x00,0x01,0x11,0x4e,0x00,0x61,0x00,0x01,0x11,0x48,0x03,0xa2,0x00,0x01,0x11,0x7c,0x00,0x5a,0x00,0x01,0x11,0x76,0x03,0xa3,0x00,0x01,0x11,0x3c,0x00,0x55,0x00,0x01,0x11,0x36,0x01,0x10,0x00,0x01,0x11,0x36,\r\n0x00,0x15,0x00,0x01,0x11,0x30,0x00,0x16,0x00,0x01,0x11,0x2a,0x03,0x77,0x00,0x01,0x11,0x2a,0x00,0x64,0x00,0x01,0x11,0x24,0x00,0x65,0x00,0x01,0x11,0x1e,0x03,0x9e,0x00,0x01,0x11,0x1e,0x00,0x57,0x00,0x01,0x11,0x18,0x00,0x58,0x00,0x01,0x11,0x12,0x01,0x19,0x00,0x01,0x11,0x12,0x00,0x55,0x00,0x01,0x11,0x0c,0x03,0x72,0x00,0x01,\r\n0x10,0xe2,0x02,0xb5,0x00,0x01,0x10,0xd0,0x02,0xb3,0x00,0x01,0x11,0x00,0x02,0x39,0x00,0x01,0x10,0xbe,0x02,0xb2,0x00,0x01,0x10,0xf4,0x02,0xac,0x00,0x01,0x10,0x70,0x00,0x07,0x00,0x01,0x10,0xee,0x00,0x0f,0x00,0x01,0x10,0xe8,0x00,0x10,0x00,0x01,0x13,0x50,0x00,0x10,0x00,0x01,0x10,0xf2,0xff,0xe3,0x00,0x01,0x13,0x44,0x00,0x24,\r\n0x00,0x01,0x13,0x34,0xff,0xf6,0x00,0x01,0x10,0x4c,0x00,0x0a,0x00,0x01,0x12,0x30,0x00,0x38,0x00,0x01,0x12,0x34,0x00,0x94,0x00,0x01,0x10,0x40,0x00,0x7f,0x00,0x01,0x10,0x46,0x00,0xae,0x00,0x01,0x12,0x2c,0x00,0x63,0x00,0x01,0x10,0x34,0x00,0x40,0x00,0x01,0x10,0x34,0x00,0xcf,0x00,0x01,0x10,0x34,0x00,0x01,0x13,0x12,0x00,0x01,\r\n0x10,0x32,0x00,0x01,0x13,0x14,0x00,0x01,0x10,0x30,0x00,0x01,0x13,0x16,0x00,0x01,0x10,0x28,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x20,0x00,0x01,0x18,0xee,0x00,0x01,0x10,0x88,0x00,0x01,0x16,0x72,0x00,0x01,0x10,0x80,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x0e,0x00,0x01,0x16,0x7a,0x00,0x01,0x10,0x0c,0x00,0x01,0x12,0xf0,0x00,0x01,\r\n0x10,0x04,0x00,0x01,0x16,0x76,0x00,0x01,0x10,0x02,0x00,0x01,0x16,0x7a,0x00,0x01,0x0f,0xfa,0x00,0x01,0x16,0x7e,0x00,0x01,0x0f,0xf8,0x00,0x01,0x1b,0x08,0x00,0x01,0x0f,0xf0,0x00,0x01,0x16,0x7a,0x00,0x01,0x0f,0xee,0x00,0x01,0x1b,0x0a,0x00,0x01,0x0f,0xe6,0x00,0x01,0x16,0x76,0x00,0x01,0x0f,0xe4,0x00,0x01,0x18,0x9c,0x00,0x01,\r\n0x0f,0xe2,0x00,0x01,0x1a,0x4a,0x00,0x01,0x0f,0xda,0x00,0x01,0x1a,0xfc,0x00,0x01,0x10,0x12,0x00,0x01,0x16,0x62,0x00,0x01,0x0f,0xd0,0x00,0x01,0x12,0x9a,0x00,0x01,0x0f,0xc8,0x00,0x01,0x16,0x5e,0x00,0x01,0x0f,0xfa,0x00,0x01,0x16,0x62,0x00,0x01,0x0f,0xbe,0x00,0x01,0x18,0x72,0x00,0x01,0x0f,0xbc,0x00,0x01,0x1a,0x22,0x00,0x01,\r\n0x0f,0xb4,0x00,0x01,0x18,0x70,0x00,0x01,0x0f,0xb2,0x00,0x01,0x12,0x74,0x00,0x01,0x0f,0xaa,0x00,0x01,0x16,0x46,0x00,0x01,0x0f,0xa8,0x00,0x01,0x12,0x6e,0x00,0x01,0x0f,0xa0,0x00,0x01,0x16,0x42,0x00,0x01,0x0f,0x9e,0x00,0x01,0x12,0x68,0x00,0x01,0x0f,0x9c,0x00,0x01,0x18,0x4e,0x00,0x01,0x0f,0x9a,0x00,0x01,0x12,0x62,0x00,0x01,\r\n0x21,0xd0,0x00,0x01,0x0f,0x98,0x00,0x01,0x12,0x6c,0x00,0x02,0x12,0x5c,0x12,0x64,0x00,0x02,0x12,0x62,0x00,0x02,0x06,0xce,0x03,0x77,0x00,0x02,0x12,0x58,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x12,0x56,0x00,0x02,0x10,0xf6,0x16,0x08,0x00,0x02,0x12,0x4c,0x00,0x02,0x03,0x6e,0x06,0xce,0x00,0x02,0x12,0x42,0x00,0x02,0x06,0xce,\r\n0x06,0xce,0x00,0x01,0x12,0x48,0x00,0x02,0x10,0xde,0x12,0x40,0x00,0x02,0x12,0x3e,0x00,0x02,0x03,0x79,0x06,0xce,0x00,0x01,0x12,0x3c,0x00,0x02,0x15,0xe0,0x0f,0x56,0x00,0x02,0x12,0x32,0x00,0x02,0x06,0xce,0x03,0x8f,0x00,0x01,0x13,0x08,0x00,0x02,0x0f,0x46,0x15,0xd6,0x00,0x02,0x12,0xfe,0x00,0x02,0x06,0x20,0x06,0xce,0x00,0x01,\r\n0x12,0x24,0x00,0x02,0x0f,0x36,0x12,0x1c,0x00,0x02,0x12,0x1a,0x00,0x02,0x06,0x0b,0x06,0xce,0x00,0x01,0x12,0x20,0x00,0x02,0x0f,0x26,0x12,0x18,0x00,0x02,0x12,0x16,0x00,0x02,0x06,0x11,0x06,0xce,0x00,0x01,0x12,0x14,0x00,0x02,0x10,0x80,0x0f,0x16,0x00,0x02,0x12,0x0a,0x00,0x02,0x06,0xce,0x03,0x7c,0x00,0x01,0x12,0x08,0x00,0x02,\r\n0x0f,0x06,0x10,0x72,0x00,0x02,0x11,0xfe,0x00,0x02,0x06,0x12,0x06,0xce,0x00,0x01,0x11,0xfc,0x00,0x02,0x1a,0x28,0x0e,0xf6,0x00,0x02,0x11,0xf2,0x00,0x02,0x06,0xce,0x03,0x7d,0x00,0x01,0x11,0xf8,0x00,0x02,0x11,0xf0,0x0e,0xe6,0x00,0x02,0x11,0xee,0x00,0x02,0x06,0xce,0x03,0x7a,0x00,0x02,0x11,0xec,0x00,0x02,0x03,0xaf,0x06,0xce,\r\n0x00,0x02,0x11,0xe2,0x00,0x02,0x06,0xce,0x03,0xae,0x00,0x01,0x12,0xd0,0x00,0x02,0x15,0x40,0x0e,0xc2,0x00,0x02,0x12,0xc6,0x00,0x02,0x06,0xce,0x03,0xa8,0x00,0x01,0x12,0xbc,0x00,0x02,0x17,0x2c,0x0e,0xb2,0x00,0x02,0x12,0xb2,0x00,0x02,0x06,0xce,0x03,0xac,0x00,0x01,0x12,0xa8,0x00,0x02,0x11,0xb8,0x10,0x00,0x00,0x02,0x12,0x9e,\r\n0x00,0x02,0x06,0xce,0x03,0xa9,0x00,0x01,0x11,0xac,0x00,0x02,0x0e,0x8e,0x18,0xa2,0x00,0x02,0x11,0xa2,0x00,0x02,0x03,0xa6,0x06,0xce,0x00,0x01,0x11,0x98,0x00,0x02,0x0f,0xde,0x18,0x9c,0x00,0x02,0x11,0x8e,0x00,0x02,0x03,0xa7,0x06,0xce,0x00,0x01,0x11,0x84,0x00,0x02,0x18,0x96,0x0e,0x6a,0x00,0x02,0x11,0x7a,0x00,0x02,0x06,0xce,\r\n0x03,0x99,0x00,0x01,0x12,0x38,0x00,0x02,0x11,0x78,0x0e,0x5a,0x00,0x02,0x12,0x2e,0x00,0x02,0x06,0xce,0x03,0x82,0x00,0x01,0x11,0x6c,0x00,0x02,0x14,0xbe,0x0e,0x4a,0x00,0x02,0x11,0x62,0x00,0x02,0x06,0xce,0x03,0x81,0x00,0x01,0x13,0xd0,0x00,0x02,0x0e,0x3a,0x14,0xb4,0x00,0x02,0x13,0xc6,0x00,0x02,0x06,0x4f,0x06,0xce,0x00,0x02,\r\n0x13,0xbc,0x00,0x02,0x06,0x34,0x06,0xce,0x00,0x01,0x11,0x4a,0x00,0x02,0x0e,0x20,0x11,0x42,0x00,0x02,0x11,0x40,0x00,0x02,0x06,0x4d,0x06,0xce,0x00,0x01,0x11,0x8e,0x00,0x02,0x0e,0x10,0x14,0x8c,0x00,0x02,0x11,0x84,0x00,0x02,0x06,0x39,0x06,0xce,0x00,0x01,0x11,0x7a,0x00,0x02,0x0e,0x00,0x14,0x82,0x00,0x02,0x11,0x70,0x00,0x02,\r\n0x06,0xce,0x06,0x3a,0x00,0x01,0x11,0xfe,0x00,0x02,0x14,0x78,0x0d,0xf0,0x00,0x02,0x11,0xf4,0x00,0x02,0x06,0xce,0x06,0x52,0x00,0x01,0x11,0x12,0x00,0x02,0x11,0x02,0x11,0x0a,0x00,0x02,0x11,0x08,0x00,0x02,0x06,0xce,0x06,0x40,0x00,0x01,0x10,0xfe,0x00,0x02,0x14,0x5a,0x0f,0x12,0x00,0x02,0x10,0xf4,0x00,0x02,0x06,0xce,0x06,0x3f,\r\n0x00,0x01,0x10,0xea,0x00,0x02,0x14,0x50,0x0d,0xb8,0x00,0x02,0x10,0xe0,0x00,0x02,0x06,0xce,0x06,0x3e,0x00,0x01,0x11,0x36,0x00,0x02,0x14,0x46,0x0d,0xa8,0x00,0x02,0x11,0x2c,0x00,0x02,0x06,0xce,0x03,0x70,0x00,0x01,0x11,0x82,0x00,0x02,0x10,0xca,0x0e,0xdc,0x00,0x02,0x11,0x78,0x00,0x02,0x06,0xce,0x03,0x72,0x00,0x01,0x11,0x6e,\r\n0x00,0x02,0x15,0xda,0x0d,0x84,0x00,0x02,0x11,0x64,0x00,0x02,0x06,0xce,0x03,0x6f,0x00,0x01,0x11,0x5a,0x00,0x02,0x18,0x04,0x0d,0x74,0x00,0x02,0x11,0x50,0x00,0x02,0x06,0xce,0x03,0x71,0x00,0x01,0x11,0x3e,0x00,0x02,0x0d,0x64,0x15,0xbe,0x00,0x02,0x11,0x34,0x00,0x02,0x06,0x2e,0x06,0xce,0x00,0x01,0x10,0xaa,0x00,0x02,0x0d,0x54,\r\n0x10,0x82,0x00,0x02,0x10,0xa0,0x00,0x02,0x06,0x2d,0x06,0xce,0x00,0x01,0x10,0x76,0x00,0x02,0x0d,0x44,0x18,0x3c,0x00,0x02,0x10,0x6c,0x00,0x02,0x06,0x2c,0x06,0xce,0x00,0x01,0x11,0x1a,0x00,0x02,0x0d,0x34,0x17,0x32,0x00,0x02,0x11,0x10,0x00,0x02,0x06,0x47,0x06,0xce,0x00,0x01,0x11,0x06,0x00,0x02,0x0d,0x24,0x13,0xb0,0x00,0x02,\r\n0x10,0xfc,0x00,0x02,0x06,0x50,0x06,0xce,0x00,0x01,0x10,0xf2,0x00,0x02,0x0e,0x42,0x15,0x66,0x00,0x02,0x10,0xe8,0x00,0x02,0x06,0x49,0x06,0xce,0x00,0x01,0x10,0x2e,0x00,0x02,0x13,0x92,0x0d,0x00,0x00,0x02,0x10,0x24,0x00,0x02,0x03,0xb0,0x06,0xce,0x00,0x01,0x10,0x22,0x00,0x02,0x16,0xf0,0x0c,0xf0,0x00,0x02,0x10,0x18,0x00,0x02,\r\n0x06,0xce,0x03,0x90,0x00,0x01,0x10,0x0e,0x00,0x02,0x15,0x36,0x0e,0x0c,0x00,0x02,0x10,0x04,0x00,0x02,0x06,0xce,0x03,0x91,0x00,0x01,0x0f,0xfa,0x00,0x02,0x0c,0xcc,0x15,0x2e,0x00,0x02,0x0f,0xf0,0x00,0x02,0x06,0xce,0x06,0x22,0x00,0x01,0x10,0x76,0x00,0x02,0x17,0xd0,0x0c,0xbc,0x00,0x02,0x10,0x6c,0x00,0x02,0x06,0xce,0x06,0x26,\r\n0x00,0x01,0x0f,0xf2,0x00,0x02,0x0c,0xac,0x15,0x12,0x00,0x02,0x0f,0xe8,0x00,0x02,0x06,0xce,0x06,0x21,0x00,0x01,0x0f,0xde,0x00,0x02,0x13,0x24,0x0c,0x9c,0x00,0x02,0x0f,0xd4,0x00,0x02,0x06,0xce,0x03,0x89,0x00,0x01,0x0f,0xba,0x00,0x02,0x0f,0xb2,0x0c,0x8c,0x00,0x02,0x0f,0xb0,0x00,0x02,0x06,0xce,0x03,0x8a,0x00,0x01,0x0f,0xae,\r\n0x00,0x02,0x13,0x06,0x0c,0x7c,0x00,0x02,0x0f,0xa4,0x00,0x02,0x06,0xce,0x03,0x8b,0x00,0x01,0x0f,0xd2,0x00,0x02,0x12,0xfc,0x0c,0x6c,0x00,0x02,0x0f,0xc8,0x00,0x02,0x06,0xce,0x03,0x87,0x00,0x01,0x0f,0x8e,0x00,0x02,0x12,0xf2,0x0c,0x5c,0x00,0x02,0x0f,0x84,0x00,0x02,0x06,0xce,0x03,0x86,0x00,0x01,0x0f,0x8a,0x00,0x02,0x0c,0x4c,\r\n0x14,0xa6,0x00,0x02,0x0f,0x80,0x00,0x02,0x06,0x16,0x06,0xce,0x00,0x01,0x0f,0x76,0x00,0x02,0x0c,0x3c,0x14,0x9e,0x00,0x02,0x0f,0x6c,0x00,0x02,0x06,0x18,0x06,0xce,0x00,0x01,0x0f,0x62,0x00,0x02,0x0c,0x2c,0x0f,0x5a,0x00,0x02,0x0f,0x58,0x00,0x02,0x06,0x1b,0x06,0xce,0x00,0x01,0x0f,0x56,0x00,0x02,0x0c,0x1c,0x12,0xac,0x00,0x02,\r\n0x0f,0x4c,0x00,0x02,0x06,0x14,0x06,0xce,0x00,0x01,0x0f,0x4a,0x00,0x02,0x0c,0x0c,0x12,0xa2,0x00,0x02,0x0f,0x40,0x00,0x02,0x06,0x17,0x06,0xce,0x00,0x01,0x0f,0x2e,0x00,0x02,0x0b,0xfc,0x12,0x98,0x00,0x02,0x0f,0x24,0x00,0x02,0x06,0x0f,0x06,0xce,0x00,0x01,0x0f,0x22,0x00,0x02,0x0b,0xec,0x12,0x8e,0x00,0x02,0x0f,0x18,0x00,0x02,\r\n0x06,0x19,0x06,0xce,0x00,0x01,0x10,0xf6,0x00,0x02,0x0c,0xd2,0x0f,0x16,0x00,0x02,0x10,0xec,0x00,0x02,0x06,0x35,0x06,0xce,0x00,0x01,0x0f,0x0a,0x00,0x02,0x0b,0xc8,0x12,0x70,0x00,0x02,0x0f,0x00,0x00,0x02,0x03,0x93,0x06,0xce,0x00,0x01,0x0e,0xfe,0x00,0x02,0x16,0x6e,0x0b,0xb8,0x00,0x02,0x0e,0xf4,0x00,0x02,0x06,0xce,0x03,0x96,\r\n0x00,0x01,0x0e,0xfa,0x00,0x02,0x0b,0xa8,0x0e,0xf2,0x00,0x02,0x0e,0xf0,0x00,0x02,0x03,0x92,0x06,0xce,0x00,0x01,0x0e,0xee,0x00,0x02,0x0b,0x98,0x12,0x3e,0x00,0x02,0x0e,0xe4,0x00,0x02,0x06,0x0e,0x06,0xce,0x00,0x01,0x0e,0xea,0x00,0x02,0x0e,0xe2,0x0b,0x88,0x00,0x02,0x0e,0xe0,0x00,0x02,0x06,0xce,0x03,0x83,0x00,0x01,0x0e,0xde,\r\n0x00,0x02,0x0b,0x78,0x13,0xba,0x00,0x02,0x0e,0xd4,0x00,0x02,0x06,0xce,0x06,0x29,0x00,0x01,0x10,0x6a,0x00,0x02,0x0b,0x68,0x12,0x0c,0x00,0x02,0x10,0x60,0x00,0x02,0x06,0xce,0x06,0x38,0x00,0x01,0x0e,0xd6,0x00,0x02,0x0b,0x58,0x13,0x9e,0x00,0x02,0x0e,0xcc,0x00,0x02,0x06,0xce,0x06,0x4c,0x00,0x01,0x0e,0xaa,0x00,0x02,0x15,0x6c,\r\n0x0b,0x48,0x00,0x02,0x0e,0xa0,0x00,0x02,0x06,0xce,0x06,0x25,0x00,0x01,0x0e,0x96,0x00,0x02,0x11,0xda,0x0c,0x10,0x00,0x02,0x0e,0x8c,0x00,0x02,0x06,0xce,0x06,0x27,0x00,0x01,0x0e,0x82,0x00,0x02,0x0b,0x24,0x11,0xd0,0x00,0x02,0x0e,0x78,0x00,0x02,0x06,0xce,0x06,0x2f,0x00,0x01,0x0e,0x6e,0x00,0x02,0x0b,0x14,0x11,0xc6,0x00,0x02,\r\n0x0e,0x64,0x00,0x02,0x06,0x32,0x06,0xce,0x00,0x01,0x0e,0x62,0x00,0x02,0x0b,0x04,0x11,0xbc,0x00,0x02,0x0e,0x58,0x00,0x02,0x06,0x31,0x06,0xce,0x00,0x01,0x0e,0x4e,0x00,0x02,0x0a,0xf4,0x13,0x32,0x00,0x02,0x0e,0x44,0x00,0x02,0x06,0x2a,0x06,0xce,0x00,0x01,0x0e,0x3a,0x00,0x02,0x0a,0xe4,0x11,0x9e,0x00,0x02,0x0e,0x30,0x00,0x02,\r\n0x06,0xce,0x06,0x2b,0x00,0x01,0x0e,0x3e,0x00,0x02,0x11,0x94,0x0a,0xd4,0x00,0x02,0x0e,0x34,0x00,0x02,0x06,0xce,0x06,0x53,0x00,0x01,0x0f,0xa2,0x00,0x02,0x13,0x02,0x0a,0xc4,0x00,0x02,0x0f,0x98,0x00,0x02,0x06,0xce,0x03,0x73,0x00,0x01,0x0f,0x8e,0x00,0x02,0x0e,0x06,0x0b,0x76,0x00,0x02,0x0f,0x84,0x00,0x02,0x06,0xce,0x03,0x74,\r\n0x00,0x01,0x0d,0xfa,0x00,0x02,0x11,0x62,0x0b,0x68,0x00,0x02,0x0d,0xf0,0x00,0x02,0x06,0xce,0x06,0x28,0x00,0x01,0x0d,0xee,0x00,0x02,0x11,0x58,0x0b,0x5a,0x00,0x02,0x0d,0xe4,0x00,0x02,0x06,0xce,0x06,0x55,0x00,0x01,0x0d,0xfa,0x00,0x02,0x11,0x4e,0x0a,0x78,0x00,0x02,0x0d,0xf0,0x00,0x02,0x06,0xce,0x03,0x75,0x00,0x01,0x0d,0xd6,\r\n0x00,0x02,0x0a,0x68,0x11,0x44,0x00,0x02,0x0d,0xcc,0x00,0x02,0x06,0x5c,0x06,0xce,0x00,0x01,0x0d,0xc2,0x00,0x02,0x0a,0x58,0x0d,0xba,0x00,0x02,0x0d,0xb8,0x00,0x02,0x06,0x5a,0x06,0xce,0x00,0x01,0x0d,0xbe,0x00,0x02,0x0a,0x48,0x0d,0xb6,0x00,0x02,0x0d,0xb4,0x00,0x02,0x06,0x58,0x06,0xce,0x00,0x01,0x0d,0xba,0x00,0x02,0x0d,0xb2,\r\n0x0a,0x38,0x00,0x02,0x0d,0xb0,0x00,0x02,0x06,0xce,0x06,0x59,0x00,0x01,0x0d,0xb6,0x00,0x02,0x0a,0x28,0x0d,0xae,0x00,0x02,0x0d,0xac,0x00,0x02,0x06,0x5d,0x06,0xce,0x00,0x01,0x0d,0xb2,0x00,0x02,0x0a,0x18,0x0d,0xaa,0x00,0x02,0x0d,0xa8,0x00,0x02,0x06,0x42,0x06,0xce,0x00,0x01,0x0d,0xae,0x00,0x02,0x0d,0xa6,0x0a,0x08,0x00,0x02,\r\n0x0d,0xa4,0x00,0x02,0x06,0xce,0x06,0x1c,0x00,0x01,0x0d,0xaa,0x00,0x02,0x09,0xf8,0x0d,0xa2,0x00,0x02,0x0d,0xa0,0x00,0x02,0x06,0x45,0x06,0xce,0x00,0x01,0x0d,0xa6,0x00,0x02,0x0d,0x9e,0x09,0xe8,0x00,0x02,0x0d,0x9c,0x00,0x02,0x06,0xce,0x06,0x1f,0x00,0x01,0x0d,0xa2,0x00,0x02,0x09,0xd8,0x0d,0x9a,0x00,0x02,0x0d,0x98,0x00,0x02,\r\n0x06,0x3c,0x06,0xce,0x00,0x01,0x0d,0x9e,0x00,0x02,0x0d,0x96,0x09,0xc8,0x00,0x02,0x0d,0x94,0x00,0x02,0x06,0xce,0x03,0x98,0x00,0x01,0x0d,0x9a,0x00,0x02,0x09,0xb8,0x0d,0x92,0x00,0x02,0x0d,0x90,0x00,0x02,0x06,0x56,0x06,0xce,0x00,0x01,0x0d,0x96,0x00,0x02,0x0d,0x8e,0x09,0xa8,0x00,0x02,0x0d,0x8c,0x00,0x02,0x06,0xce,0x03,0xaa,\r\n0x00,0x01,0x0d,0x92,0x00,0x02,0x0d,0x8a,0x09,0x98,0x00,0x02,0x0d,0x88,0x00,0x02,0x06,0xce,0x03,0x9b,0x00,0x01,0x0d,0x8e,0x00,0x02,0x0d,0x86,0x09,0x88,0x00,0x02,0x0d,0x84,0x00,0x02,0x06,0xce,0x03,0x9c,0x00,0x01,0x0d,0x8a,0x00,0x02,0x0d,0x82,0x09,0x78,0x00,0x02,0x0d,0x80,0x00,0x02,0x06,0xce,0x03,0x9a,0x00,0x01,0x0d,0x86,\r\n0x00,0x02,0x09,0x68,0x0d,0x7e,0x00,0x02,0x0d,0x7c,0x00,0x02,0x03,0x9f,0x06,0xce,0x00,0x01,0x0d,0x7a,0x00,0x02,0x0f,0xfa,0x09,0x58,0x00,0x02,0x0d,0x70,0x00,0x02,0x06,0xce,0x03,0xa4,0x00,0x01,0x0d,0x76,0x00,0x02,0x09,0x48,0x0d,0x6e,0x00,0x02,0x0d,0x6c,0x00,0x02,0x03,0x9e,0x06,0xce,0x00,0x01,0x0d,0x72,0x00,0x02,0x09,0x38,\r\n0x0d,0x6a,0x00,0x02,0x0d,0x68,0x00,0x02,0x03,0x9d,0x06,0xce,0x00,0x01,0x0d,0x6e,0x00,0x02,0x0d,0x66,0x09,0x28,0x00,0x02,0x0d,0x64,0x00,0x02,0x06,0xce,0x03,0xa3,0x00,0x01,0x0d,0x6a,0x00,0x02,0x09,0x18,0x0d,0x62,0x00,0x02,0x0d,0x60,0x00,0x02,0x03,0x7e,0x06,0xce,0x00,0x02,0x0d,0x5e,0x00,0x02,0x01,0xc5,0x01,0xc4,0x00,0x02,\r\n0x0d,0x5c,0x00,0x02,0x02,0x0b,0x02,0x50,0x00,0x01,0x10,0xde,0x00,0x03,0x09,0x6c,0x0f,0x8c,0x0d,0x5a,0x00,0x02,0x10,0xd2,0x00,0x03,0x06,0xce,0x06,0xce,0x03,0x78,0x00,0x01,0x10,0xda,0x00,0x03,0x09,0x58,0x0d,0x48,0x10,0xd0,0x00,0x02,0x10,0xce,0x00,0x03,0x06,0xce,0x06,0x3b,0x06,0xce,0x00,0x01,0x10,0xcc,0x00,0x03,0x09,0x44,\r\n0x0d,0x36,0x0f,0x64,0x00,0x02,0x10,0xc0,0x00,0x03,0x06,0xce,0x06,0x44,0x06,0xce,0x00,0x01,0x10,0xf0,0x00,0x03,0x09,0x30,0x09,0x34,0x10,0xbe,0x00,0x02,0x10,0xe4,0x00,0x03,0x06,0xce,0x06,0x4b,0x06,0xce,0x00,0x01,0x10,0xb0,0x00,0x03,0x09,0x20,0x09,0x24,0x0f,0x3c,0x00,0x02,0x10,0xa4,0x00,0x03,0x06,0xce,0x06,0x37,0x06,0xce,\r\n0x00,0x01,0x10,0xa2,0x00,0x03,0x09,0x10,0x0f,0x2c,0x09,0x14,0x00,0x02,0x10,0x96,0x00,0x03,0x06,0x41,0x06,0xce,0x06,0xce,0x00,0x01,0x10,0x94,0x00,0x03,0x0f,0x1c,0x09,0x00,0x09,0x04,0x00,0x02,0x10,0x88,0x00,0x03,0x06,0xce,0x06,0xce,0x03,0x88,0x00,0x01,0x10,0x90,0x00,0x03,0x0c,0xc4,0x08,0xf0,0x10,0x86,0x00,0x02,0x10,0x84,\r\n0x00,0x03,0x06,0xce,0x06,0x4a,0x06,0xce,0x00,0x01,0x10,0x82,0x00,0x03,0x08,0xdc,0x0e,0xf4,0x08,0xe0,0x00,0x02,0x10,0x76,0x00,0x03,0x06,0x54,0x06,0xce,0x06,0xce,0x00,0x01,0x10,0x74,0x00,0x03,0x08,0xcc,0x0e,0xe4,0x08,0xd0,0x00,0x02,0x10,0x68,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0x36,0x00,0x01,0x10,0x70,0x00,0x03,0x08,0xbc,\r\n0x10,0x66,0x08,0xc0,0x00,0x02,0x10,0x64,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0x48,0x00,0x01,0x10,0x62,0x00,0x03,0x08,0xac,0x08,0xb0,0x0e,0xbc,0x00,0x02,0x10,0x56,0x00,0x03,0x06,0xce,0x06,0x1a,0x06,0xce,0x00,0x01,0x10,0x54,0x00,0x03,0x08,0x9c,0x08,0xa0,0x0e,0xac,0x00,0x02,0x10,0x48,0x00,0x03,0x06,0xce,0x06,0x10,0x06,0xce,\r\n0x00,0x01,0x10,0x46,0x00,0x03,0x08,0x8c,0x08,0x90,0x0e,0x9c,0x00,0x02,0x10,0x3a,0x00,0x03,0x06,0xce,0x06,0x43,0x06,0xce,0x00,0x01,0x10,0x38,0x00,0x03,0x08,0x7c,0x08,0x80,0x0e,0x8c,0x00,0x02,0x10,0x2c,0x00,0x03,0x06,0xce,0x06,0x46,0x06,0xce,0x00,0x01,0x10,0x2a,0x00,0x03,0x08,0x6c,0x08,0x70,0x0e,0x7c,0x00,0x02,0x10,0x1e,\r\n0x00,0x03,0x06,0xce,0x06,0x3d,0x06,0xce,0x00,0x01,0x10,0x1c,0x00,0x03,0x08,0x5c,0x08,0x60,0x0e,0x6c,0x00,0x02,0x10,0x10,0x00,0x03,0x06,0xce,0x06,0x57,0x06,0xce,0x00,0x01,0x10,0x0e,0x00,0x03,0x0e,0x5c,0x08,0x4c,0x08,0x50,0x00,0x02,0x10,0x02,0x00,0x03,0x06,0xce,0x03,0xa5,0x06,0xce,0x00,0x01,0x20,0x08,0x00,0x04,0x10,0x76,\r\n0x10,0x80,0x10,0x8a,0x10,0x94,0x00,0x02,0x10,0xee,0x00,0x04,0x00,0x86,0x00,0x8d,0x01,0x49,0x01,0x50,0x00,0x02,0x10,0xec,0x00,0x04,0x01,0xc6,0x01,0xc7,0x01,0xc6,0x01,0xc7,0x00,0x02,0x10,0xea,0x00,0x04,0x03,0xb2,0x03,0xb3,0x06,0x5e,0x06,0x5f,0x00,0x02,0x10,0xe8,0x00,0x04,0x01,0x90,0x01,0x91,0x01,0x92,0x02,0x49,0x00,0x02,\r\n0x10,0xe6,0x00,0x04,0x06,0x02,0x06,0x08,0x06,0x09,0x06,0x0a,0x00,0x02,0x05,0x8e,0x12,0x4c,0x10,0x4a,0x12,0x4c,0x00,0x02,0x0b,0x76,0x0f,0xac,0x00,0x02,0x12,0xb4,0x12,0x8c,0x12,0x64,0x12,0x8c,0x00,0x02,0x0b,0x66,0x0f,0xa2,0x00,0x02,0x11,0x24,0x00,0x05,0x03,0xce,0x03,0xcf,0x06,0x05,0x06,0x06,0x06,0x07,0x00,0x02,0x11,0x22,\r\n0x00,0x05,0x02,0xe2,0x03,0x18,0x03,0x19,0x03,0x1a,0x03,0x1b,0x00,0x02,0x11,0x20,0x00,0x05,0x02,0xe3,0x03,0x1c,0x03,0x1d,0x03,0x1e,0x03,0x1f,0x00,0x02,0x0b,0x1e,0x11,0x34,0x11,0x44,0x11,0xda,0x00,0x03,0x0b,0x26,0x11,0x64,0x0f,0x68,0x00,0x02,0x11,0x42,0x00,0x06,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,\r\n0x00,0x02,0x11,0x30,0x00,0x06,0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,0x00,0x03,0x00,0x01,0x12,0x8e,0x00,0x01,0x05,0x0e,0x00,0x01,0x12,0x8e,0x00,0x01,0x00,0x00,0x00,0x03,0x00,0x03,0x00,0x01,0x10,0x4a,0x00,0x01,0x07,0x4e,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xad,0x00,0x03,0x00,0x01,0x10,0xc2,0x00,0x01,\r\n0x07,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xae,0x00,0x03,0x00,0x01,0x07,0x34,0x00,0x01,0x10,0x62,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xb0,0x00,0x03,0x00,0x01,0x07,0x22,0x00,0x01,0x10,0x58,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0xb0,0x00,0x03,0x00,0x02,0x10,0x96,0x10,0xe6,0x00,0x01,0x04,0xb8,0x00,0x01,0x10,0xe6,0x00,0x01,\r\n0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x01,0x10,0xd0,0x00,0x01,0x10,0x86,0x00,0x02,0x04,0xa2,0x10,0xd0,0x00,0x01,0x00,0x00,0x00,0x37,0x00,0x03,0x00,0x02,0x10,0x6a,0x10,0xba,0x00,0x01,0x10,0x70,0x00,0x01,0x10,0xba,0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x01,0x10,0xa4,0x00,0x01,0x04,0x76,0x00,0x02,0x10,0x5a,0x10,0xa4,\r\n0x00,0x01,0x00,0x00,0x00,0x39,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0xcc,0x00,0x01,0x10,0x9c,0x00,0x01,0x00,0x00,0x01,0x95,0x00,0x03,0x00,0x01,0x11,0x78,0x00,0x01,0x11,0x78,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x95,0x00,0x03,0x00,0x01,0x11,0x8e,0x00,0x01,0x11,0x66,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x96,0x00,0x02,0x10,0x76,\r\n0x00,0x0a,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xb9,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x00,0x03,0x00,0x00,0x00,0x01,0x10,0x7c,0x00,0x02,0x10,0x6c,0x10,0x4c,0x00,0x01,0x00,0x00,0x01,0x96,0x00,0x02,0x10,0x7c,0x00,0x0b,0x03,0x02,0x03,0x03,0x03,0x04,0x03,0x05,0x03,0x06,0x03,0x07,0x03,0x08,0x03,0x09,\r\n0x03,0x0a,0x03,0x0b,0x04,0x3b,0x00,0x02,0x11,0x9e,0x00,0x0f,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x09,0x02,0x0a,0x02,0x4e,0x02,0x4f,0x02,0x9d,0x02,0x9e,0x00,0x02,0x11,0x9c,0x00,0x0f,0x02,0xdf,0x02,0xe0,0x02,0xe1,0x03,0x0c,0x03,0x0d,0x03,0x0e,0x03,0x0f,0x03,0x10,\r\n0x03,0x11,0x03,0x12,0x03,0x13,0x03,0x14,0x03,0x15,0x03,0x16,0x03,0x17,0x00,0x02,0x11,0x9a,0x00,0x10,0x00,0xba,0x00,0xbb,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x08,0x02,0x4a,0x02,0x4b,0x02,0x4c,0x02,0x4d,0x02,0x73,0x02,0x74,0x02,0x9c,0x00,0x02,0x11,0x1a,0x00,0x13,0x01,0xb0,0x01,0xb1,0x01,0xb2,\r\n0x01,0xb3,0x01,0xb4,0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x00,0x01,0x13,0xd6,0x00,0x24,0x11,0xf8,0x11,0x90,0x11,0x98,0x11,0xa0,0x11,0xa8,0x11,0xb0,0x11,0xb8,0x11,0xc0,0x11,0xc8,0x11,0xd0,0x12,0x02,0x12,0x7e,0x11,0xd8,\r\n0x12,0x0c,0x12,0x52,0x11,0x6c,0x12,0x16,0x12,0x22,0x12,0x6e,0x11,0x72,0x11,0x78,0x11,0xe0,0x12,0x2e,0x11,0x7e,0x11,0xe8,0x12,0xc2,0x12,0x3a,0x11,0x84,0x12,0x46,0x12,0xe2,0x13,0x4a,0x12,0xa8,0x12,0x60,0x11,0x8a,0x11,0xf0,0x12,0x92,0x00,0x02,0x13,0x42,0x00,0x26,0x00,0xb5,0x00,0xb6,0x00,0xb7,0x00,0xb8,0x00,0xb9,0x01,0xc3,\r\n0x01,0x93,0x01,0x94,0x01,0x95,0x01,0x96,0x01,0x97,0x01,0x98,0x01,0x99,0x01,0x84,0x01,0x85,0x01,0x86,0x01,0x87,0x01,0x88,0x01,0x9a,0x01,0x9b,0x01,0x9c,0x01,0x9d,0x01,0x9e,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x09,0x02,0x0a,0x02,0x4e,0x02,0x4f,0x02,0x9d,0x02,0x9e,\r\n0x00,0x02,0x0f,0xd0,0x00,0x27,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,\r\n0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0x22,0x00,0x29,0x03,0x40,0x03,0x41,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,\r\n0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0xd6,0x00,0x2f,0x01,0x00,0x06,0xcc,0x06,0xcb,0x01,0x0e,0x01,0x91,0x01,0x00,0x01,0x0e,\r\n0x01,0x91,0x06,0x8e,0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,\r\n0x06,0xbc,0x06,0xbd,0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x02,0x12,0xca,0x00,0x3b,0x00,0xba,0x00,0xbb,0x01,0xa2,0x01,0x9f,0x01,0xa0,0x01,0xa1,0x01,0x7e,0x01,0x7f,0x01,0x80,0x01,0x81,0x01,0x82,0x01,0x83,0x01,0xa3,0x01,0xa4,0x01,0xa5,0x01,0xa6,0x01,0xb0,0x01,0xb1,0x01,0xb2,0x01,0xb3,0x01,0xb4,\r\n0x01,0xb5,0x01,0xb6,0x01,0xb7,0x01,0xb8,0x01,0xb9,0x01,0xba,0x01,0xbb,0x01,0xbc,0x01,0xbd,0x01,0xbe,0x01,0xbf,0x01,0xc0,0x01,0xc1,0x01,0xc2,0x01,0xa7,0x01,0xa8,0x01,0xa9,0x01,0xaa,0x01,0xab,0x01,0xac,0x01,0xad,0x01,0xae,0x01,0xaf,0x02,0x05,0x02,0x06,0x02,0x07,0x02,0x09,0x02,0x0a,0x02,0x08,0x02,0x4a,0x02,0x4b,0x02,0x4c,\r\n0x02,0x4e,0x02,0x4f,0x02,0x4d,0x02,0x9d,0x02,0x9c,0x02,0x9e,0x00,0x02,0x12,0xc4,0x00,0x3d,0x01,0xc6,0x01,0xc7,0x00,0x86,0x00,0x8d,0x01,0xc6,0x01,0x06,0x01,0xc7,0x01,0x49,0x01,0x7d,0x01,0x50,0x02,0xee,0x02,0xef,0x02,0xf0,0x02,0xf1,0x02,0xf2,0x02,0xf3,0x02,0xf4,0x02,0xf5,0x02,0xf6,0x02,0xf7,0x03,0x41,0x06,0xce,0x06,0x8e,\r\n0x06,0x8f,0x06,0x90,0x06,0x91,0x06,0x92,0x06,0x93,0x06,0x94,0x06,0x95,0x06,0x96,0x06,0x97,0x06,0x98,0x06,0x99,0x06,0x9a,0x06,0x9c,0x06,0x9d,0x06,0x9e,0x06,0xa0,0x06,0xa1,0x06,0xa2,0x06,0xa5,0x06,0xa6,0x06,0xa7,0x06,0xa8,0x06,0xa9,0x06,0xaa,0x06,0xab,0x06,0xac,0x06,0xad,0x06,0xae,0x06,0xaf,0x06,0xb1,0x06,0xbc,0x06,0xbd,\r\n0x06,0xbe,0x06,0xbf,0x06,0xc0,0x06,0xc1,0x06,0xc2,0x06,0xc3,0x00,0x01,0x00,0x01,0x00,0xff,0x00,0x01,0x00,0x01,0x02,0xd4,0x00,0x01,0x00,0x01,0x01,0x1a,0x00,0x01,0x00,0x01,0x00,0x7c,0x00,0x01,0x00,0x01,0x00,0xf4,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,\r\n0x03,0x34,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,\r\n0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x03,0x32,0x00,0x01,0x12,0x30,0x00,0x01,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x15,0x88,0x00,0x01,0x12,0x24,0x00,0x01,0x12,0x2e,0x00,0x01,0x12,0x38,0x00,0x01,0x12,0x42,\r\n0x00,0x01,0x12,0x4c,0x00,0x01,0x12,0x56,0x00,0x01,0x12,0x60,0x00,0x01,0x12,0x6a,0x00,0x01,0x15,0x74,0x00,0x01,0x12,0x70,0x00,0x01,0x12,0x7a,0x00,0x01,0x12,0x84,0x00,0x01,0x15,0x74,0x00,0x01,0x15,0x80,0x00,0x01,0x12,0x86,0x00,0x01,0x12,0x90,0x00,0x01,0x15,0x84,0x00,0x01,0x15,0x90,0x00,0x01,0x12,0x92,0x00,0x01,0x12,0x9c,\r\n0x00,0x01,0x15,0x94,0x00,0x01,0x12,0xa2,0x00,0x01,0x12,0xac,0x00,0x01,0x12,0xb6,0x00,0x01,0x12,0xc0,0x00,0x01,0x12,0xca,0x00,0x01,0x12,0xd4,0x00,0x01,0x15,0x88,0x00,0x01,0x12,0xda,0x00,0x01,0x15,0x90,0x00,0x01,0x12,0xe0,0x00,0x01,0x15,0x98,0x00,0x01,0x12,0xe6,0x00,0x01,0x12,0xf0,0x00,0x01,0x12,0xfa,0x00,0x01,0x13,0x04,\r\n0x00,0x01,0x15,0x94,0x00,0x01,0x19,0xc4,0x00,0x01,0x15,0x9c,0x00,0x01,0x13,0x02,0x00,0x01,0x15,0xa4,0x00,0x01,0x15,0xb0,0x00,0x01,0x13,0x04,0x00,0x01,0x13,0x0e,0x00,0x01,0x13,0x18,0x00,0x01,0x13,0x22,0x00,0x01,0x13,0x2c,0x00,0x01,0x13,0x36,0x00,0x01,0x13,0x40,0x00,0x01,0x15,0xa0,0x00,0x01,0x15,0xac,0x00,0x01,0x15,0xb8,\r\n0x00,0x01,0x15,0xc4,0x00,0x01,0x15,0xd0,0x00,0x01,0x15,0xdc,0x00,0x01,0x15,0xe8,0x00,0x01,0x13,0x2e,0x00,0x01,0x15,0xf0,0x00,0x01,0x13,0x34,0x00,0x01,0x13,0x3e,0x00,0x01,0x13,0x48,0x00,0x01,0x15,0xf0,0x00,0x01,0x13,0x4e,0x00,0x01,0x13,0x58,0x00,0x01,0x13,0x62,0x00,0x01,0x13,0x6c,0x00,0x01,0x13,0x76,0x00,0x01,0x13,0x80,\r\n0x00,0x01,0x13,0x8a,0x00,0x01,0x13,0x94,0x00,0x01,0x13,0x9e,0x00,0x01,0x13,0xa8,0x00,0x01,0x13,0xb2,0x00,0x01,0x13,0xbc,0x00,0x01,0x13,0xc6,0x00,0x01,0x13,0xd0,0x00,0x01,0x13,0xda,0x00,0x01,0x13,0xe4,0x00,0x01,0x13,0xee,0x00,0x01,0x13,0xf8,0x00,0x01,0x14,0x02,0x00,0x01,0x14,0x0c,0x00,0x01,0x14,0x16,0x00,0x02,0x00,0x01,\r\n0x01,0x4c,0x01,0x50,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0xf5,0x00,0xfb,0x00,0x00,0x00,0x02,0x00,0x01,0x01,0x40,0x01,0x43,0x00,0x00,0x00,0x02,0x20,0xe0,0x20,0xf2,0x00,0x02,0x18,0xfa,0x19,0x0a,0x00,0x02,0x13,0xf6,0x15,0x7e,0x00,0x02,0x13,0xfc,0x15,0x86,0x00,0x02,0x19,0x08,0x19,0x18,0x00,0x02,0x19,0x22,0x19,0x32,0x00,0x02,\r\n0x19,0x3c,0x19,0x4c,0x00,0x02,0x19,0x56,0x19,0x66,0x00,0x02,0x19,0x70,0x19,0x80,0x00,0x02,0x19,0x8a,0x19,0x9a,0x00,0x02,0x19,0xa4,0x19,0xb4,0x00,0x02,0x19,0xbe,0x19,0xce,0x00,0x02,0x19,0xd8,0x19,0xe8,0x00,0x02,0x19,0xf2,0x1a,0x02,0x00,0x02,0x1a,0x0c,0x1a,0x1c,0x00,0x01,0x20,0xaa,0x00,0x01,0x20,0xb8,0x00,0x01,0x20,0xc6,\r\n0x00,0x01,0x1a,0x1a,0x00,0x01,0x1a,0x26,0x00,0x01,0x1a,0x32,0x00,0x01,0x1a,0x3e,0x00,0x01,0x1a,0x4a,0x00,0x01,0x1a,0x56,0x00,0x01,0x1a,0x62,0x00,0x01,0x1a,0x6e,0x00,0x01,0x1a,0x7a,0x00,0x01,0x1a,0x86,0x00,0x01,0x1a,0x92,0x00,0x01,0x1a,0x9e,0x00,0x01,0x1a,0xaa,0x00,0x01,0x1a,0xb6,0x00,0x01,0x1a,0xc2,0x00,0x01,0x1a,0xce,\r\n0x00,0x01,0x1a,0xda,0x00,0x01,0x1a,0xe6,0x00,0x01,0x1a,0xf2,0x00,0x01,0x1a,0xfe,0x00,0x01,0x1b,0x0a,0x00,0x01,0x1b,0x16,0x00,0x01,0x1b,0x22,0x00,0x01,0x1b,0x2e,0x00,0x01,0x1b,0x3a,0x00,0x01,0x1b,0x46,0x00,0x01,0x1b,0x52,0x00,0x01,0x1b,0x5e,0x00,0x01,0x1b,0x6a,0x00,0x02,0x00,0x01,0x02,0xf8,0x03,0x01,0x00,0x00,0x00,0x02,\r\n0x00,0x01,0x02,0xd4,0x02,0xdd,0x00,0x00,0x00,0x04,0x14,0xb8,0x14,0xc4,0x1b,0x62,0x1b,0x70,0x00,0x04,0x14,0xc6,0x14,0xd2,0x1b,0x74,0x1b,0x82,0x00,0x04,0x14,0xd4,0x16,0xcc,0x1b,0x86,0x1b,0x94,0x00,0x04,0x14,0xd6,0x16,0x0e,0x1b,0x98,0x1b,0xa6,0x00,0x04,0x14,0xd8,0x14,0xe4,0x1b,0xaa,0x1b,0xb8,0x00,0x04,0x14,0xe6,0x16,0xc6,\r\n0x1b,0xbc,0x1b,0xca,0x00,0x04,0x14,0xe8,0x14,0xf4,0x1b,0xce,0x1b,0xdc,0x00,0x04,0x14,0xf6,0x16,0xca,0x1b,0xe0,0x1b,0xee,0x00,0x04,0x1f,0xfc,0x20,0x0c,0x20,0x1c,0x20,0x2c,0x00,0x03,0x20,0x32,0x26,0xa4,0x26,0xb6,0x00,0x03,0x20,0x3a,0x26,0xc0,0x26,0xd2,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x46,\r\n0x03,0x57,0x00,0x03,0x1b,0xc8,0x1b,0xd6,0x20,0x32,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x45,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x03,0x14,0xb6,0x16,0x7e,0x1b,0xcc,0x00,0x01,0x00,0x02,0x03,0x5c,0x05,0xb4,0x00,0x03,0x14,0xb2,0x14,0xbe,0x1b,0xca,0x00,0x01,0x00,0x02,0x03,0x46,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x47,\r\n0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x48,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x47,0x04,0x1c,0x00,0x03,0x14,0xa2,0x16,0x5e,0x1b,0xb0,0x00,0x01,0x00,0x02,0x03,0x45,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3e,0x00,0x03,0x1b,0xa6,0x1e,0xf6,0x1f,0xda,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x3d,0x00,0x03,0x14,0x86,0x16,0x06,\r\n0x1b,0xa4,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x03,0x14,0x82,0x16,0xf2,0x1b,0xa2,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1c,0x00,0x03,0x1f,0xba,0x1f,0xca,0x26,0x34,0x00,0x03,0x26,0x3e,0x26,0x50,0x26,0x62,0x00,0x01,0x00,0x02,0x04,0x1c,0x05,0xbe,0x00,0x03,0x1b,0x88,0x1e,0x00,0x1f,0xc2,0x00,0x03,0x14,0x5e,0x15,0xd2,\r\n0x1b,0x8e,0x00,0x01,0x00,0x02,0x03,0x48,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x5c,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x03,0x14,0x4a,0x16,0xa2,0x1b,0x7c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x03,0x16,0x76,0x16,0x82,\r\n0x1b,0x6a,0x00,0x01,0x00,0x02,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x03,0x1b,0x58,0x1d,0xd8,0x1f,0x6a,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x30,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x19,0x00,0x03,0x13,0xfe,0x15,0x42,0x1b,0x4e,0x00,0x01,0x00,0x02,0x03,0x29,\r\n0x03,0x30,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xb5,0x00,0x03,0x13,0xf2,0x16,0x1a,0x1b,0x44,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x03,0x1b,0x2a,0x1d,0x4e,0x1f,0x22,0x00,0x01,0x00,0x02,0x04,0x19,\r\n0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x03,0x13,0xbe,0x15,0xf2,0x1b,0x20,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x22,0x00,0x03,0x13,0xba,0x15,0x22,0x1b,0x1e,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x22,0x00,0x03,0x13,0xb6,0x13,0xc2,0x1b,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x05,0xb4,0x00,0x03,0x13,0xbe,0x15,0xaa,\r\n0x1b,0x1a,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x23,0x00,0x03,0x13,0xba,0x13,0xc6,0x1b,0x18,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1c,0x00,0x03,0x13,0xc2,0x15,0xa2,0x1b,0x16,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,0x00,0x03,0x13,0xbe,0x13,0xca,0x1b,0x14,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1c,0x00,0x03,0x15,0x5e,0x15,0x82,\r\n0x1b,0x12,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x03,0x13,0xb6,0x14,0xbe,0x1b,0x10,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1c,0x00,0x03,0x13,0xb2,0x15,0x62,0x1b,0x0e,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x03,0x13,0xae,0x14,0xaa,0x1b,0x0c,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1c,0x00,0x03,0x15,0x12,0x15,0x42,\r\n0x1b,0x0a,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,0x00,0x03,0x13,0x9a,0x13,0xa6,0x1b,0x08,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x45,0x00,0x03,0x13,0xa2,0x13,0xae,0x1b,0x06,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x47,0x00,0x03,0x13,0xaa,0x13,0xb6,0x1b,0x04,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x43,0x00,0x03,0x13,0xb2,0x14,0x06,\r\n0x1b,0x02,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x5c,0x00,0x03,0x13,0xa6,0x14,0x12,0x1a,0xf8,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x3a,0x00,0x03,0x13,0xa2,0x13,0xea,0x1a,0xf6,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x3a,0x00,0x03,0x13,0x9e,0x14,0xb2,0x1a,0xf4,0x00,0x01,0x00,0x02,0x03,0x3a,\r\n0x04,0x19,0x00,0x03,0x13,0x9a,0x13,0xa6,0x1a,0xf2,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x48,0x00,0x01,0x00,0x02,0x00,0xf4,0x01,0xa2,0x00,0x01,0x00,0x02,0x01,0xdd,0x02,0x21,0x00,0x02,0x24,0x34,0x24,0x46,0x00,0x02,0x24,0x52,0x24,0x64,0x00,0x02,0x24,0x70,0x24,0x82,0x00,0x02,0x24,0x8e,0x24,0xa0,0x00,0x01,0x00,0x02,0x03,0x57,\r\n0x04,0x1c,0x00,0x00,0x00,0x05,0x1d,0xa0,0x1d,0xae,0x24,0xa2,0x24,0xb2,0x24,0xc2,0x00,0x05,0x1c,0x2c,0x13,0xc4,0x1a,0xb2,0x1d,0xb0,0x1d,0xbe,0x00,0x05,0x1d,0xc0,0x1d,0xce,0x24,0xba,0x24,0xca,0x24,0xda,0x00,0x05,0x23,0x1c,0x23,0x2a,0x24,0xde,0x24,0xee,0x24,0xfe,0x00,0x05,0x1d,0xc4,0x1d,0xd2,0x25,0x02,0x25,0x12,0x25,0x22,\r\n0x00,0x05,0x1a,0x8e,0x13,0x34,0x1a,0x9a,0x1d,0xd4,0x1d,0xe2,0x00,0x05,0x1d,0xe4,0x1d,0xf2,0x25,0x1a,0x25,0x2a,0x25,0x3a,0x00,0x05,0x1d,0xf4,0x1b,0x68,0x25,0x3e,0x25,0x4e,0x25,0x5e,0x00,0x05,0x1d,0xf6,0x1b,0x4e,0x25,0x62,0x25,0x72,0x25,0x82,0x00,0x05,0x1a,0x76,0x13,0x1c,0x1b,0x2a,0x1d,0xf8,0x1e,0x06,0x00,0x05,0x1e,0x08,\r\n0x1e,0x16,0x25,0x7a,0x25,0x8a,0x25,0x9a,0x00,0x05,0x1e,0x18,0x1e,0x26,0x25,0x9e,0x25,0xae,0x25,0xbe,0x00,0x05,0x1e,0x28,0x1e,0x36,0x25,0xc2,0x25,0xd2,0x25,0xe2,0x00,0x05,0x1e,0x38,0x1e,0x46,0x25,0xe6,0x25,0xf6,0x26,0x06,0x00,0x04,0x26,0x0a,0x26,0x1a,0x2b,0xfa,0x2c,0x0c,0x00,0x04,0x1e,0x3e,0x1e,0x4c,0x26,0x20,0x26,0x30,\r\n0x00,0x04,0x1a,0x32,0x12,0xcc,0x1a,0xda,0x1e,0x50,0x00,0x04,0x1a,0x34,0x1b,0x7e,0x13,0x9a,0x1e,0x54,0x00,0x04,0x1e,0x58,0x1e,0x66,0x26,0x22,0x26,0x32,0x00,0x04,0x1e,0x6a,0x1e,0x78,0x26,0x38,0x26,0x48,0x00,0x04,0x1a,0x22,0x1a,0x2e,0x12,0xa4,0x1e,0x7c,0x00,0x04,0x1e,0x80,0x1e,0x8e,0x26,0x44,0x26,0x54,0x00,0x04,0x1e,0x92,\r\n0x1e,0xa0,0x26,0x5a,0x26,0x6a,0x00,0x04,0x1e,0xa4,0x1e,0xc0,0x1e,0xb2,0x26,0x70,0x00,0x04,0x1a,0x2a,0x1e,0xb6,0x1a,0x12,0x1e,0xc4,0x00,0x04,0x1a,0x14,0x1a,0x20,0x12,0x96,0x1e,0xc8,0x00,0x04,0x1e,0xcc,0x1e,0xda,0x26,0x62,0x26,0x72,0x00,0x04,0x1e,0xde,0x1e,0xec,0x26,0x78,0x26,0x88,0x00,0x04,0x1b,0x10,0x1a,0x0e,0x13,0x2c,\r\n0x1e,0xf0,0x00,0x04,0x1a,0x10,0x1b,0x12,0x1b,0x2c,0x1e,0xf4,0x00,0x04,0x1a,0x12,0x12,0x34,0x1a,0x1e,0x1e,0xf8,0x00,0x04,0x1e,0xfc,0x21,0xa0,0x26,0x70,0x26,0x80,0x00,0x04,0x26,0x86,0x1f,0x00,0x26,0x96,0x26,0xa6,0x00,0x04,0x26,0xac,0x1f,0x04,0x26,0xbc,0x26,0xcc,0x00,0x04,0x1a,0x02,0x12,0x48,0x1a,0xb0,0x1f,0x08,0x00,0x04,\r\n0x1a,0x04,0x1a,0xb2,0x12,0xe6,0x1f,0x0c,0x00,0x04,0x1a,0x06,0x12,0x04,0x1a,0x12,0x1f,0x10,0x00,0x04,0x1a,0x14,0x12,0xd2,0x1a,0x9e,0x1f,0x14,0x00,0x04,0x1f,0x18,0x1f,0x26,0x26,0xaa,0x26,0xba,0x00,0x04,0x1f,0x2a,0x26,0xc0,0x1a,0x0c,0x26,0xd0,0x00,0x04,0x1f,0x2e,0x21,0xc8,0x26,0xd6,0x26,0xe6,0x00,0x04,0x1f,0x32,0x1f,0x40,\r\n0x26,0xec,0x26,0xfc,0x00,0x04,0x1f,0x44,0x1f,0x52,0x27,0x02,0x27,0x12,0x00,0x04,0x1f,0x56,0x21,0x0e,0x27,0x18,0x27,0x28,0x00,0x04,0x1a,0x28,0x1a,0x34,0x1a,0x40,0x1f,0x5a,0x00,0x04,0x1f,0x5e,0x27,0x24,0x19,0xde,0x27,0x34,0x00,0x04,0x1f,0x62,0x1f,0x70,0x1f,0x7e,0x27,0x3a,0x00,0x04,0x19,0xd8,0x1a,0x16,0x1a,0x22,0x1f,0x82,\r\n0x00,0x04,0x1f,0x86,0x1f,0xda,0x27,0x36,0x27,0x46,0x00,0x04,0x19,0xd0,0x11,0x8e,0x19,0xdc,0x1f,0x8a,0x00,0x03,0x27,0x42,0x29,0x66,0x2a,0xb6,0x00,0x03,0x27,0x4a,0x27,0x5a,0x2a,0xc0,0x00,0x03,0x1f,0x7e,0x20,0xb8,0x27,0x62,0x00,0x03,0x20,0xd8,0x20,0xe6,0x27,0x6a,0x00,0x03,0x1f,0x7c,0x1f,0x8a,0x27,0x72,0x00,0x03,0x1f,0x90,\r\n0x1f,0x9e,0x27,0x7a,0x00,0x03,0x1f,0xa4,0x1f,0xb2,0x27,0x82,0x00,0x03,0x1f,0xb8,0x21,0x2c,0x27,0x8a,0x00,0x03,0x1f,0xbe,0x20,0x88,0x27,0x92,0x00,0x03,0x1f,0xc4,0x1f,0xd2,0x27,0x9a,0x00,0x03,0x1f,0xd8,0x1f,0xe6,0x27,0xa2,0x00,0x03,0x1f,0xec,0x1f,0xfa,0x27,0xaa,0x00,0x03,0x20,0x00,0x20,0x0e,0x27,0xb2,0x00,0x03,0x20,0x14,\r\n0x20,0x22,0x27,0xba,0x00,0x06,0x2a,0x6a,0x2a,0x7a,0x2d,0xde,0x2d,0xf0,0x2e,0x02,0x2e,0x14,0x00,0x06,0x20,0x1a,0x27,0xb4,0x2a,0x7c,0x11,0x12,0x27,0xc2,0x27,0xd0,0x00,0x06,0x20,0x18,0x11,0x10,0x0c,0xfc,0x20,0x24,0x27,0xd0,0x27,0xde,0x00,0x06,0x2a,0x70,0x27,0xde,0x19,0x44,0x2a,0x80,0x2a,0x90,0x2a,0xa0,0x00,0x06,0x20,0x14,\r\n0x19,0x44,0x19,0x50,0x19,0x5c,0x27,0xde,0x27,0xec,0x00,0x05,0x27,0xec,0x28,0x5c,0x28,0x6a,0x2a,0x94,0x2a,0xa4,0x00,0x05,0x29,0x16,0x27,0xee,0x20,0x06,0x2a,0xa8,0x2a,0xb8,0x00,0x05,0x20,0x08,0x11,0x82,0x19,0x4e,0x20,0x7e,0x27,0xf0,0x00,0x05,0x29,0x9c,0x2d,0x0c,0x19,0x72,0x29,0xaa,0x2a,0xb0,0x00,0x05,0x27,0xe6,0x2d,0x00,\r\n0x2d,0xb0,0x19,0x66,0x2a,0xb4,0x00,0x05,0x27,0xe8,0x2a,0xb8,0x27,0xf6,0x2a,0xc8,0x2a,0xd8,0x00,0x05,0x27,0xf8,0x2a,0xdc,0x1f,0xe4,0x2a,0xec,0x2a,0xfc,0x00,0x05,0x2b,0x00,0x2b,0x10,0x2d,0x9e,0x2d,0xb0,0x2d,0xc2,0x00,0x05,0x27,0xee,0x1f,0xda,0x1f,0xe8,0x2b,0x14,0x2b,0x24,0x00,0x05,0x27,0xf0,0x2b,0x28,0x27,0xfe,0x2b,0x38,\r\n0x2b,0x48,0x00,0x05,0x28,0x00,0x2b,0x4c,0x28,0x0e,0x2b,0x5c,0x2b,0x6c,0x00,0x05,0x1f,0xd2,0x10,0x6e,0x18,0xd6,0x1f,0xde,0x28,0x10,0x00,0x05,0x20,0x12,0x18,0xfa,0x1f,0xde,0x19,0x14,0x28,0x12,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x45,0x03,0x57,0x00,0x04,0x2b,0x4e,0x2d,0x82,0x28,0x0a,0x2d,0x94,0x00,0x01,0x00,0x03,0x03,0x2e,\r\n0x03,0x57,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x04,0x1c,0x00,0x04,0x27,0xfc,0x2c,0x88,0x1f,0xea,0x2b,0x40,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1c,0x05,0xbe,0x00,0x01,0x00,0x03,0x03,0x2b,0x03,0x30,0x04,0x1b,0x00,0x04,0x2b,0x28,0x2d,0x60,0x2b,0x38,0x2d,0x72,\r\n0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1c,0x04,0x22,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1c,0x05,0xbe,0x00,0x04,0x27,0xba,0x2b,0x20,0x27,0xc8,0x2b,0x30,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x05,0xbe,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x03,\r\n0x03,0x57,0x04,0x1b,0x05,0xbe,0x00,0x01,0x00,0x03,0x03,0xc5,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x34,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x1b,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x43,0x03,0x5c,0x00,0x02,0x2a,0xe6,0x27,0x7c,0x00,0x02,\r\n0x27,0x84,0x27,0x92,0x00,0x01,0x27,0x9a,0x00,0x07,0x18,0x00,0x2d,0x02,0x2b,0x72,0x10,0x1c,0x17,0xe8,0x2a,0xe6,0x2a,0xf4,0x00,0x07,0x27,0x94,0x2e,0x02,0x27,0xa2,0x27,0xae,0x0f,0x64,0x2a,0xf2,0x2b,0x00,0x00,0x06,0x27,0xaa,0x27,0xb6,0x0f,0x60,0x27,0xc2,0x27,0xce,0x2a,0xfe,0x00,0x06,0x2a,0xfe,0x1e,0xce,0x1e,0xdc,0x2b,0x0c,\r\n0x2b,0x1a,0x2c,0xc4,0x00,0x06,0x27,0xbe,0x17,0xb8,0x27,0xca,0x0f,0x50,0x27,0xd6,0x2b,0x1a,0x00,0x06,0x1e,0xce,0x27,0xd4,0x27,0xe0,0x2b,0x28,0x0f,0xd2,0x2b,0x1a,0x00,0x06,0x27,0xde,0x2b,0x1a,0x2c,0xaa,0x17,0xa8,0x0f,0xc4,0x2b,0x28,0x00,0x04,0x0f,0x32,0x0f,0x38,0x0f,0x3e,0x0f,0x44,0x00,0x04,0x0f,0x40,0x0f,0x46,0x0f,0x4c,\r\n0x0f,0x52,0x00,0x04,0x0f,0x4e,0x0f,0x54,0x0f,0x5a,0x0f,0x60,0x00,0x04,0x0f,0x5c,0x0f,0x62,0x0f,0x68,0x0f,0x6e,0x00,0x01,0x01,0x4a,0x00,0x01,0x00,0x01,0x00,0x08,0x17,0x76,0x1e,0x8e,0x2a,0xf8,0x17,0x90,0x2b,0x48,0x2b,0x04,0x2c,0x7c,0x2c,0x8a,0x00,0x08,0x2b,0x5a,0x0f,0x8c,0x2b,0x66,0x2a,0xfe,0x2b,0x4e,0x0f,0x5c,0x2c,0x86,\r\n0x2c,0x94,0x00,0x08,0x2c,0x90,0x2a,0xf8,0x27,0x88,0x17,0x5e,0x27,0x96,0x2d,0x6a,0x2d,0x7a,0x2d,0x8a,0x00,0x07,0x2b,0x1e,0x2a,0xf6,0x2b,0x36,0x0f,0x5c,0x0f,0x68,0x0f,0x44,0x2c,0x8c,0x00,0x07,0x2c,0x8a,0x2c,0x98,0x2d,0xd0,0x2a,0xf2,0x1e,0x54,0x2d,0x78,0x2d,0x88,0x00,0x01,0x00,0x04,0x00,0x84,0x00,0x8c,0x01,0x47,0x01,0x4f,\r\n0x00,0x01,0x00,0x04,0x00,0x01,0x00,0x60,0x00,0xbd,0x01,0x22,0x00,0x01,0x00,0x04,0x03,0x90,0x03,0x91,0x06,0x23,0x06,0x24,0x00,0x01,0x00,0x04,0x01,0x0d,0x01,0x0e,0x01,0x0f,0x02,0x36,0x00,0x01,0x00,0x04,0x05,0xb5,0x06,0x0c,0x06,0x0d,0x06,0x0e,0x00,0x01,0x00,0x01,0x03,0x20,0x00,0x08,0x2c,0x54,0x16,0xf8,0x2c,0x60,0x2c,0x6c,\r\n0x2c,0x78,0x2c,0x84,0x2a,0xb0,0x2d,0x46,0x00,0x08,0x2c,0x7e,0x2c,0x8a,0x2c,0x96,0x2c,0xa2,0x2c,0xae,0x2c,0xba,0x0a,0x20,0x2d,0x42,0x00,0x08,0x2c,0xb4,0x0e,0xca,0x2d,0x6c,0x2d,0x7c,0x2d,0x8c,0x2d,0x9c,0x2d,0x3e,0x2d,0x4c,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0xbd,0x00,0x01,0x00,0x02,0x00,0x60,0x01,0x22,0x00,0x09,0x2a,0x76,\r\n0x2a,0x82,0x2a,0x8e,0x0e,0xb4,0x2d,0xa6,0x2d,0x8a,0x2a,0x9a,0x0e,0xc0,0x2d,0x98,0x00,0x01,0x00,0x05,0x03,0xc3,0x03,0xc5,0x06,0x1c,0x06,0x42,0x06,0x43,0x00,0x01,0x00,0x05,0x02,0xdc,0x02,0xec,0x02,0xf6,0x03,0x00,0x03,0x0a,0x00,0x01,0x00,0x05,0x02,0xd9,0x02,0xe9,0x02,0xf3,0x02,0xfd,0x03,0x07,0x00,0x02,0x00,0x01,0x02,0xee,\r\n0x02,0xf7,0x00,0x00,0x00,0x01,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3e,0x00,0x02,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x06,0xce,0x06,0xce,0x00,0x02,0x00,0x02,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x01,0x00,0x06,0x01,0x13,0x01,0x14,0x01,0x16,0x01,0x17,0x01,0x18,0x01,0x19,\r\n0x00,0x09,0x2d,0x32,0x2d,0x3e,0x2d,0x6e,0x2d,0x8a,0x2d,0x9a,0x2d,0x4a,0x2d,0x56,0x2d,0x62,0x2d,0x7c,0x00,0x01,0x00,0x05,0x03,0x29,0x03,0x32,0x03,0x33,0x03,0xbe,0x05,0xc6,0x00,0x02,0x00,0x02,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,0x06,0x76,0x00,0x05,0x00,0x02,0x00,0x02,0x00,0xa2,0x00,0xa6,0x00,0x00,0x01,0x6a,0x01,0x6e,\r\n0x00,0x05,0x00,0x02,0x00,0x02,0x06,0x77,0x06,0x79,0x00,0x00,0x06,0x7b,0x06,0x7f,0x00,0x03,0x00,0x01,0x00,0x08,0x00,0xff,0x01,0x07,0x01,0x0b,0x01,0x0d,0x01,0x90,0x02,0x34,0x02,0x36,0x02,0x49,0x00,0x02,0x00,0x02,0x02,0xd4,0x02,0xdd,0x00,0x00,0x04,0x15,0x04,0x15,0x00,0x0a,0x00,0x02,0x00,0x05,0x02,0xd4,0x02,0xde,0x00,0x01,\r\n0x03,0x57,0x03,0x57,0x00,0x03,0x04,0x1b,0x04,0x1b,0x00,0x04,0x04,0x1c,0x04,0x1c,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x05,0x00,0x02,0x00,0x06,0x00,0x01,0x00,0xbc,0x00,0x01,0x01,0xc8,0x01,0xfe,0x00,0x01,0x02,0x03,0x02,0x03,0x00,0x01,0x02,0x05,0x02,0x0a,0x00,0x01,0x02,0x51,0x02,0x74,0x00,0x01,0x02,0xa0,0x02,0xb9,0x00,0x01,\r\n0x00,0x02,0x00,0x06,0x06,0x68,0x06,0x6c,0x00,0x01,0x06,0x6e,0x06,0x78,0x00,0x01,0x06,0x7a,0x06,0x7c,0x00,0x01,0x06,0x80,0x06,0x8a,0x00,0x01,0x06,0xb0,0x06,0xb0,0x00,0x01,0x06,0xb4,0x06,0xbb,0x00,0x01,0x00,0x02,0x00,0x06,0x06,0x8e,0x06,0x9a,0x00,0x01,0x06,0x9c,0x06,0x9e,0x00,0x01,0x06,0xa0,0x06,0xa2,0x00,0x01,0x06,0xa5,\r\n0x06,0xaf,0x00,0x01,0x06,0xb1,0x06,0xb1,0x00,0x01,0x06,0xbc,0x06,0xc3,0x00,0x01,0x00,0x02,0x00,0x06,0x06,0x68,0x06,0x6c,0x00,0x00,0x06,0x6e,0x06,0x78,0x00,0x05,0x06,0x7a,0x06,0x7c,0x00,0x10,0x06,0x80,0x06,0x8a,0x00,0x13,0x06,0xb0,0x06,0xb0,0x00,0x1e,0x06,0xb4,0x06,0xbb,0x00,0x1f,0x00,0x02,0x00,0x06,0x00,0x01,0x00,0xbc,\r\n0x00,0x00,0x01,0xc8,0x01,0xfe,0x00,0xbc,0x02,0x03,0x02,0x03,0x00,0xf3,0x02,0x05,0x02,0x0a,0x00,0xf4,0x02,0x51,0x02,0x74,0x00,0xfa,0x02,0xa0,0x02,0xb9,0x01,0x1e,0x00,0x02,0x00,0x07,0x00,0x01,0x00,0xbc,0x00,0x00,0x01,0xc8,0x01,0xfe,0x00,0xbc,0x02,0x03,0x02,0x03,0x00,0xf3,0x02,0x05,0x02,0x0a,0x00,0xf4,0x02,0x51,0x02,0x74,\r\n0x00,0xfa,0x02,0xa0,0x02,0xb9,0x01,0x1e,0x02,0xd4,0x02,0xde,0x01,0x38,0x00,0x02,0x00,0x03,0x01,0x51,0x01,0x53,0x00,0x00,0x01,0x55,0x01,0x56,0x00,0x03,0x01,0x5b,0x01,0x68,0x00,0x05,0x00,0x01,0x00,0x0f,0x01,0x70,0x01,0x71,0x01,0x72,0x01,0x73,0x01,0x74,0x01,0x75,0x01,0x76,0x01,0x77,0x01,0x78,0x01,0xdf,0x01,0xe0,0x02,0x23,\r\n0x02,0x24,0x02,0x77,0x02,0x7f,0x00,0x01,0x00,0x0f,0x02,0xd6,0x02,0xda,0x02,0xdd,0x02,0xe6,0x02,0xea,0x02,0xed,0x02,0xf0,0x02,0xf4,0x02,0xf7,0x02,0xfa,0x02,0xfe,0x03,0x01,0x03,0x04,0x03,0x08,0x03,0x0b,0x00,0x01,0x00,0x10,0x00,0x51,0x00,0x52,0x01,0x10,0x01,0x11,0x01,0x12,0x01,0xd1,0x01,0xd5,0x01,0xd6,0x01,0xf8,0x02,0x15,\r\n0x02,0x19,0x02,0x1a,0x02,0x3c,0x02,0x5a,0x02,0x72,0x02,0x7e,0x00,0x02,0x03,0x41,0x03,0x42,0x00,0x02,0x03,0xae,0x06,0xce,0x00,0x02,0x03,0x9a,0x03,0xa5,0x00,0x02,0x03,0x9c,0x06,0xce,0x00,0x02,0x06,0x42,0x06,0xce,0x00,0x02,0x06,0x59,0x06,0xce,0x00,0x03,0x02,0xe5,0x02,0xf9,0x03,0x03,0x00,0x03,0x02,0xe6,0x02,0xfa,0x03,0x04,\r\n0x00,0x03,0x02,0xe7,0x02,0xfb,0x03,0x05,0x00,0x03,0x02,0xe8,0x02,0xfc,0x03,0x06,0x00,0x03,0x02,0xe9,0x02,0xfd,0x03,0x07,0x00,0x03,0x02,0xea,0x02,0xfe,0x03,0x08,0x00,0x03,0x02,0xeb,0x02,0xff,0x03,0x09,0x00,0x03,0x02,0xec,0x03,0x00,0x03,0x0a,0x00,0x03,0x02,0xed,0x03,0x01,0x03,0x0b,0x00,0x03,0x03,0x8c,0x03,0x8d,0x06,0xce,\r\n0x00,0x03,0x03,0x76,0x03,0x9b,0x06,0xce,0x00,0x03,0x06,0x12,0x06,0x2c,0x06,0xce,0x00,0x03,0x06,0x0c,0x06,0x0d,0x06,0xce,0x00,0x04,0x02,0xde,0x02,0xe4,0x02,0xf8,0x03,0x02,0x00,0x04,0x03,0x7f,0x03,0x80,0x03,0x92,0x06,0xce,0x00,0x04,0x03,0x79,0x03,0x8e,0x03,0x9e,0x06,0xce,0x00,0x05,0x03,0x97,0x03,0xa6,0x03,0xa7,0x06,0x3c,\r\n0x06,0xce,0x00,0x05,0x03,0x7e,0x03,0xa0,0x03,0xa1,0x03,0xa2,0x06,0xce,0x00,0x05,0x03,0x6e,0x03,0x7b,0x03,0x8f,0x06,0x11,0x06,0xce,0x00,0x05,0x03,0xa4,0x03,0xb0,0x03,0xb1,0x06,0x0b,0x06,0xce,0x00,0x05,0x04,0x3b,0x06,0x1d,0x06,0x1e,0x06,0x45,0x06,0xce,0x00,0x06,0x03,0x82,0x03,0x87,0x03,0x94,0x03,0x95,0x03,0x9f,0x06,0xce,\r\n0x00,0x06,0x03,0x75,0x06,0x52,0x06,0x53,0x06,0x55,0x06,0x5b,0x06,0xce,0x00,0x07,0x03,0x20,0x03,0x99,0x03,0xab,0x03,0xad,0x03,0xaf,0x06,0x56,0x06,0xce,0x00,0x09,0x03,0x40,0x03,0x84,0x03,0x85,0x03,0x93,0x03,0x9d,0x06,0x20,0x06,0x2d,0x06,0x39,0x06,0xce,0x00,0x0a,0x03,0x70,0x03,0x7a,0x03,0x7c,0x06,0x13,0x06,0x36,0x06,0x3e,\r\n0x06,0x3f,0x06,0x40,0x06,0x48,0x06,0xce,0x00,0x0c,0x03,0x73,0x03,0x74,0x03,0x7d,0x03,0x81,0x03,0x8b,0x06,0x28,0x06,0x38,0x06,0x3a,0x06,0x4c,0x06,0x4e,0x06,0x51,0x06,0xce,0x00,0x0f,0x03,0x6c,0x03,0x6d,0x03,0x77,0x03,0x78,0x06,0x0f,0x06,0x14,0x06,0x2a,0x06,0x31,0x06,0x34,0x06,0x35,0x06,0x3b,0x06,0x44,0x06,0x4f,0x06,0x58,\r\n0x06,0xce,0x00,0x19,0x03,0x83,0x03,0x86,0x03,0x89,0x03,0x90,0x03,0x91,0x03,0x96,0x03,0xa3,0x03,0xa8,0x03,0xa9,0x03,0xac,0x06,0x0e,0x06,0x17,0x06,0x19,0x06,0x21,0x06,0x22,0x06,0x23,0x06,0x24,0x06,0x29,0x06,0x2e,0x06,0x32,0x06,0x47,0x06,0x49,0x06,0x50,0x06,0x5d,0x06,0xce,0x00,0x02,0x00,0x08,0x03,0x2b,0x03,0x2b,0x00,0x00,\r\n0x03,0x42,0x03,0x42,0x00,0x01,0x06,0x68,0x06,0x6c,0x00,0x02,0x06,0x6e,0x06,0x78,0x00,0x07,0x06,0x7a,0x06,0x7c,0x00,0x12,0x06,0x80,0x06,0x8a,0x00,0x15,0x06,0xb0,0x06,0xb0,0x00,0x20,0x06,0xb4,0x06,0xbb,0x00,0x21,0x00,0x22,0x03,0x6f,0x03,0x71,0x03,0x72,0x03,0x88,0x03,0x8a,0x03,0x98,0x03,0xaa,0x06,0x10,0x06,0x16,0x06,0x18,\r\n0x06,0x1a,0x06,0x1b,0x06,0x1c,0x06,0x1f,0x06,0x25,0x06,0x26,0x06,0x27,0x06,0x2b,0x06,0x2f,0x06,0x30,0x06,0x33,0x06,0x37,0x06,0x3d,0x06,0x41,0x06,0x43,0x06,0x46,0x06,0x4a,0x06,0x4b,0x06,0x4d,0x06,0x54,0x06,0x57,0x06,0x5a,0x06,0x5c,0x06,0xce,0x00,0x02,0x00,0x0b,0x00,0xa2,0x00,0xa6,0x00,0x00,0x00,0xf4,0x00,0xf4,0x00,0x05,\r\n0x01,0x13,0x01,0x14,0x00,0x06,0x01,0x16,0x01,0x1a,0x00,0x08,0x01,0x4c,0x01,0x50,0x00,0x0d,0x01,0x6a,0x01,0x6e,0x00,0x12,0x01,0x70,0x01,0x78,0x00,0x17,0x01,0xdf,0x01,0xe0,0x00,0x20,0x02,0x23,0x02,0x24,0x00,0x22,0x02,0x77,0x02,0x77,0x00,0x24,0x02,0x7f,0x02,0x7f,0x00,0x25,0x00,0x01,0x00,0x24,0x02,0xd4,0x02,0xd5,0x02,0xd6,\r\n0x02,0xd7,0x02,0xd8,0x02,0xd9,0x02,0xda,0x02,0xdb,0x02,0xdc,0x02,0xdd,0x03,0x29,0x03,0x2b,0x03,0x2c,0x03,0x2e,0x03,0x30,0x03,0x32,0x03,0x34,0x03,0x3a,0x03,0x3d,0x03,0x3e,0x03,0x43,0x03,0x45,0x03,0x46,0x03,0x47,0x03,0x48,0x03,0x57,0x03,0x5c,0x03,0xc5,0x04,0x15,0x04,0x19,0x04,0x1b,0x04,0x1c,0x04,0x22,0x05,0xb4,0x05,0xb5,\r\n0x05,0xbe,0x00,0x02,0x00,0x0e,0x00,0xff,0x00,0xff,0x00,0x00,0x01,0x07,0x01,0x07,0x00,0x01,0x01,0x0b,0x01,0x0b,0x00,0x02,0x01,0x0d,0x01,0x0d,0x00,0x03,0x01,0x90,0x01,0x90,0x00,0x04,0x02,0x34,0x02,0x34,0x00,0x05,0x02,0x36,0x02,0x36,0x00,0x06,0x02,0x49,0x02,0x49,0x00,0x07,0x06,0x68,0x06,0x6c,0x00,0x08,0x06,0x6e,0x06,0x78,\r\n0x00,0x0d,0x06,0x7a,0x06,0x7c,0x00,0x18,0x06,0x80,0x06,0x8a,0x00,0x1b,0x06,0xb0,0x06,0xb0,0x00,0x26,0x06,0xb4,0x06,0xbb,0x00,0x27,0x00,0x02,0x00,0x13,0x00,0x51,0x00,0x52,0x00,0x00,0x00,0xf4,0x00,0xf4,0x00,0x02,0x01,0x10,0x01,0x14,0x00,0x03,0x01,0x16,0x01,0x19,0x00,0x08,0x01,0x40,0x01,0x43,0x00,0x0c,0x01,0x51,0x01,0x53,\r\n0x00,0x10,0x01,0x55,0x01,0x56,0x00,0x13,0x01,0x5b,0x01,0x68,0x00,0x15,0x01,0x70,0x01,0x78,0x00,0x23,0x01,0xd1,0x01,0xd1,0x00,0x2c,0x01,0xd5,0x01,0xd6,0x00,0x2d,0x01,0xdf,0x01,0xe0,0x00,0x2f,0x01,0xf8,0x01,0xf8,0x00,0x31,0x02,0x15,0x02,0x15,0x00,0x32,0x02,0x19,0x02,0x1a,0x00,0x33,0x02,0x23,0x02,0x24,0x00,0x35,0x02,0x3c,\r\n0x02,0x3c,0x00,0x37,0x02,0x77,0x02,0x77,0x00,0x38,0x02,0x7e,0x02,0x7f,0x00,0x39,0x00,0x02,0x00,0x13,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0x01,0x00,0x84,0x00,0x84,0x00,0x02,0x00,0x8c,0x00,0x8c,0x00,0x03,0x00,0xbd,0x00,0xbd,0x00,0x04,0x00,0xff,0x00,0xff,0x00,0x05,0x01,0x22,0x01,0x22,0x00,0x06,0x01,0x47,\r\n0x01,0x47,0x00,0x07,0x01,0x4a,0x01,0x4a,0x00,0x08,0x01,0x4f,0x01,0x4f,0x00,0x09,0x02,0xf8,0x03,0x01,0x00,0x0a,0x03,0x42,0x03,0x42,0x00,0x14,0x04,0x23,0x04,0x23,0x00,0x15,0x06,0x68,0x06,0x6c,0x00,0x16,0x06,0x6e,0x06,0x78,0x00,0x1b,0x06,0x7a,0x06,0x7c,0x00,0x26,0x06,0x80,0x06,0x8a,0x00,0x29,0x06,0xb0,0x06,0xb0,0x00,0x34,\r\n0x06,0xb4,0x06,0xbb,0x00,0x35,0x05,0xc3,0x00,0x03,0x01,0x22,0x03,0x29,0x00,0x01,0x00,0x01,0x00,0x5a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2d,0x00,0x01,\r\n0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x31,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0x42,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x99,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0x00,0xa2,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x01,0x06,0xce,0x00,0x01,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xcc,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xce,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd0,\r\n0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xee,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x01,0x0e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x10,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x12,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x17,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x1d,0x00,0x01,\r\n0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x42,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x49,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x5c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x01,0x61,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x63,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x65,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x67,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6b,0x00,0x01,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x71,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x73,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x77,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,\r\n0x01,0x79,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x81,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x83,0x00,0x01,0x06,0xce,0x00,0x01,\r\n0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x85,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x87,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x89,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8d,\r\n0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x8f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x93,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x48,0x03,0x48,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0x17,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x44,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,\r\n0x00,0x00,0x00,0x77,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,\r\n0x00,0x00,0x00,0xbd,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc9,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe4,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xeb,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0xf0,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xf3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x22,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x25,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,\r\n0x00,0x00,0x01,0x28,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x2e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x34,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x37,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x01,0x3a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x3f,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x2f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x00,0x00,0x31,\r\n0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x57,0x00,0x00,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x01,0x04,0x15,\r\n0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb5,\r\n0x05,0xb5,0x00,0x00,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x05,0xb4,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x46,0x00,0x00,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,\r\n0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x01,0x03,0x29,\r\n0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x05,0xb4,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb4,0x05,0xb4,0x00,0x00,0x00,0x01,0x04,0x23,0x00,0x01,0x00,0x01,\r\n0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0xc5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc5,0x03,0xc5,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x15,0x00,0x00,\r\n0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x45,0x03,0x45,0x00,0x00,0x00,0x01,0x03,0x3a,\r\n0x00,0x01,0x00,0x01,0x03,0x47,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x47,0x03,0x47,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x43,0x03,0x43,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,\r\n0x03,0x2e,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x00,\r\n0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,\r\n0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,0x00,0x00,0x06,0xb8,0x00,0x02,0x06,0x6b,0x06,0xb9,0x00,0x02,0x06,0x6a,0x06,0xba,0x00,0x02,0x06,0x74,0x06,0xbb,0x00,0x02,0x06,0x72,0x06,0xb4,0x00,0x02,0x06,0x6b,0x06,0xb5,\r\n0x00,0x02,0x06,0x6a,0x06,0xb6,0x00,0x02,0x06,0x74,0x06,0xb7,0x00,0x02,0x06,0x72,0x06,0xc0,0x00,0x02,0x06,0x91,0x06,0xc1,0x00,0x02,0x06,0x90,0x06,0xc2,0x00,0x02,0x06,0x99,0x06,0xc3,0x00,0x02,0x06,0x97,0x06,0xbc,0x00,0x02,0x06,0x91,0x06,0xbd,0x00,0x02,0x06,0x90,0x06,0xbe,0x00,0x02,0x06,0x99,0x06,0xbf,0x00,0x02,0x06,0x97,\r\n0x00,0x01,0x00,0x04,0x06,0x6e,0x06,0x70,0x06,0x93,0x06,0x95,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,\r\n0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe7,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x14,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0x15,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x48,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4d,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8d,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x93,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x94,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xae,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xba,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xbb,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x01,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x31,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x32,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x4b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x4e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4f,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x5a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x01,0x06,0xce,0x00,0x01,\r\n0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x01,0x06,0xce,0x00,0x01,\r\n0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x01,0x06,0xce,0x00,0x01,\r\n0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x02,0x06,0xce,0x06,0xce,\r\n0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x45,\r\n0x00,0x01,0x00,0x00,0x00,0x09,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x0c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x21,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x22,0x00,0x01,\r\n0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x55,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x56,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd5,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xd6,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x01,0x07,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x08,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x14,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x15,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x1f,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x01,0x20,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x2e,0x03,0x2e,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,\r\n0x00,0x2d,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x35,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x00,0x5c,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x73,0x00,0x01,0x03,0x57,0x00,0x01,\r\n0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0xa4,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xce,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xee,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,\r\n0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x00,0x01,0x12,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x1d,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x61,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,\r\n0x00,0x01,0x00,0x00,0x01,0x63,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xb4,0x00,0x01,0x00,0x00,0x01,0x65,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x67,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x00,0x01,0x6b,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6d,0x00,0x00,\r\n0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x01,0x71,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x73,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x01,0x77,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x79,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,\r\n0x00,0x00,0x01,0x7d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x00,0x01,0x81,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x00,0x01,0x83,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x00,0x01,0x85,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x87,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x01,0x8b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x01,0x8d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x8f,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x00,\r\n0x01,0x93,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x01,\r\n0x03,0x3d,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,\r\n0x00,0x01,0x05,0xbe,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x03,0x57,\r\n0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1b,0x04,0x1b,0x04,0x1b,0x00,0x00,\r\n0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x03,0x57,0x03,0x57,0x00,0x00,\r\n0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x3d,\r\n0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,\r\n0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,\r\n0x00,0x68,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x01,0x01,0x13,0x00,0x01,0x00,0x01,0x01,0x13,0x00,0x01,0x00,0x00,0x01,0xa3,0x00,0x01,0x00,0x53,0x00,0x01,0x00,0x01,0x00,0x53,0x00,0x01,0x00,0x00,0x01,0xa4,0x00,0x01,0x01,0x7e,0x00,0x01,0x00,0x01,0x01,0x7e,0x00,0x01,\r\n0x00,0x00,0x01,0xa5,0x00,0x01,0x01,0x93,0x00,0x01,0x00,0x01,0x01,0x93,0x00,0x01,0x00,0x00,0x01,0xa6,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x03,0x03,0x45,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x03,0x03,0x57,0x03,0x45,0x03,0x45,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x2e,0x00,0x01,\r\n0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x47,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x01,\r\n0x00,0x00,0x00,0x93,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4b,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,\r\n0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3b,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x3c,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x03,0x3d,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x02,\r\n0x04,0x15,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x15,0x04,0x15,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x5e,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x00,0x00,0x5f,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x03,0x03,0x29,0x03,0x29,0x03,0x29,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xd2,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,\r\n0x00,0x00,0x00,0xd3,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2c,0x03,0x2c,0x03,0x2c,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x03,0x2b,0x03,0x2b,0x00,0x00,0x00,0x01,0x03,0x30,\r\n0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x30,0x03,0x30,0x03,0x30,0x00,0x00,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x02,0x05,0xb5,0x05,0xb5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xb5,0x05,0xb5,0x05,0xb5,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x03,0x46,0x03,0x46,\r\n0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0x1d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x42,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,\r\n0x03,0x29,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0x75,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x00,\r\n0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,\r\n0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8f,0x00,0x00,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x91,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1c,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,\r\n0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x03,0x5c,0x03,0x5c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xcc,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,\r\n0x00,0x00,0x00,0xd0,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x00,0xe0,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xf6,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x00,0x01,0x0e,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x17,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,\r\n0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,\r\n0x04,0x1b,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x1b,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x42,\r\n0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x22,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,\r\n0x00,0x01,0x00,0x00,0x01,0x5c,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x5c,0x00,0x01,0x00,0x00,0x01,0x89,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x2b,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x03,0x03,0x30,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x22,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x05,0xbe,\r\n0x05,0xbe,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0xc5,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,\r\n0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x15,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,\r\n0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x5c,0x03,0x43,0x03,0x43,0x00,0x00,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x01,\r\n0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x48,0x00,0x00,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2b,0x04,0x19,\r\n0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,\r\n0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,\r\n0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x45,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x0e,0x00,0x02,0x06,0xce,\r\n0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x88,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x88,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,\r\n0x00,0x00,0x00,0x89,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0x8a,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1b,0x00,0x03,0x06,0xce,0x06,0xce,\r\n0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x69,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,\r\n0x00,0x71,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x24,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3a,\r\n0x00,0x01,0x00,0x00,0x00,0x25,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x26,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x3e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x3f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x3d,\r\n0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x51,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x52,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x53,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x58,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x59,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x15,0x00,0x01,0x00,0x00,0x00,0x5a,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x61,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x29,\r\n0x00,0x01,0x00,0x00,0x00,0x62,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x03,0x29,0x00,0x01,0x00,0x00,0x00,0x63,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7d,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,\r\n0x00,0x01,0x00,0x00,0x00,0x7f,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x9e,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x9f,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xa0,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0xd8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xd9,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2c,0x03,0x2c,0x00,0x01,0x00,0x00,0x00,0xda,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xdc,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x2b,\r\n0x00,0x01,0x00,0x00,0x00,0xdd,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x03,0x2b,0x00,0x01,0x00,0x00,0x00,0xde,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x0a,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x00,0x01,0x0b,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x03,0x30,\r\n0x00,0x01,0x00,0x00,0x01,0x0c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x19,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x1a,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xb5,0x05,0xb5,0x00,0x01,0x00,0x00,0x01,0x1b,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x03,0x03,0x57,\r\n0x03,0x46,0x03,0x46,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x57,0x03,0x46,0x03,0x46,0x03,0x46,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x17,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x18,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1c,\r\n0x00,0x01,0x00,0x00,0x00,0x65,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x29,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x66,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x6b,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x6c,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,\r\n0x00,0x01,0x00,0x00,0x00,0x77,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x78,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x01,0x00,0x00,0x00,0x82,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x05,0xbe,\r\n0x00,0x01,0x00,0x00,0x00,0x8c,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xaa,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xab,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb2,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x5c,\r\n0x00,0x01,0x00,0x00,0x00,0xb3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xe4,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xe5,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,\r\n0x00,0x01,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xf1,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xf3,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x19,\r\n0x00,0x01,0x00,0x00,0x00,0xf4,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x25,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x26,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x1b,\r\n0x00,0x01,0x00,0x00,0x01,0x31,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x34,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x35,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x37,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,\r\n0x00,0x01,0x00,0x00,0x01,0x38,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3a,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3b,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x3f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,\r\n0x00,0x01,0x00,0x00,0x01,0x40,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x4e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x59,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,\r\n0x00,0x01,0x00,0x00,0x01,0x5e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x5f,0x00,0x01,0x03,0x45,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x03,0x3a,0x03,0x57,\r\n0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x86,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xb0,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x30,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe2,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x22,0x04,0x1b,\r\n0x00,0x01,0x00,0x00,0x01,0x47,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x51,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x55,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x57,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0xc5,0x04,0x1b,\r\n0x00,0x01,0x00,0x00,0x01,0x69,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x15,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x6f,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x75,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x7b,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x5c,0x03,0x43,\r\n0x00,0x01,0x00,0x00,0x01,0x91,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xb7,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x00,0x00,0xb8,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfa,0x00,0x00,\r\n0x00,0x01,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x00,0x00,0xfb,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x44,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x22,0x00,0x01,0x00,0x00,0x01,0x45,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x3d,\r\n0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xa2,0x00,0x01,0x03,0x2e,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,\r\n0x00,0x03,0x03,0x2e,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3d,0x04,0x19,0x04,0x19,\r\n0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x3d,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x49,0x00,0x00,0x00,0x01,0x00,0x04,\r\n0x03,0x2e,0x03,0x57,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x05,0xbe,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,\r\n0x00,0x06,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x01,0x98,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x99,0x00,0x01,0x00,0x02,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,\r\n0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x29,\r\n0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x01,0x03,0x29,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,\r\n0x03,0x2e,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x46,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x11,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x57,\r\n0x03,0x46,0x03,0x46,0x00,0x01,0x00,0x00,0x00,0x12,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x1a,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x70,0x00,0x01,0x03,0x3a,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x04,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x00,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x2e,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x03,0x03,0x57,0x03,0x57,0x04,0x1b,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x03,0x00,0x01,\r\n0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x04,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x01,0x05,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x44,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0x45,0x00,0x01,\r\n0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x96,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x57,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x97,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xad,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xba,0x00,0x02,\r\n0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xbd,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2e,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xbe,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x02,\r\n0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc9,0x00,0x00,0x00,0x01,0x00,0x02,0x03,0x2b,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xca,0x00,0x01,0x05,0xbe,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x01,\r\n0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xeb,0x00,0x00,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xec,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x22,0x00,0x00,\r\n0x00,0x01,0x00,0x02,0x03,0x3d,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x23,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x28,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1c,0x00,0x01,0x00,0x00,0x01,0x29,0x00,0x01,\r\n0x04,0x1c,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x84,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x04,0x04,0x19,0x04,0x19,0x04,0x1b,0x04,0x1b,0x00,0x00,0x00,0x02,\r\n0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x05,0xbe,0x00,0x01,0x00,0x00,0x01,0x53,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x05,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc2,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc3,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfd,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0xfe,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4a,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x02,0x03,0x34,0x03,0x34,\r\n0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x3d,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x34,0x03,0x34,0x03,0x29,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x00,0x00,0x4f,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xa8,0x00,0x02,0x03,0x30,0x03,0x43,\r\n0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xb5,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x22,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x03,0x57,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,\r\n0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x57,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,\r\n0x04,0x19,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1b,0x04,0x19,0x00,0x00,0x00,0x03,0x06,0xce,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x28,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x01,0x03,0x3a,\r\n0x00,0x01,0x00,0x00,0x00,0x29,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x3a,0x03,0x3a,0x03,0x3a,0x00,0x01,0x00,0x00,0x00,0x2b,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x02,0x06,0xce,\r\n0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe7,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x02,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe8,0x00,0x00,0x00,0x01,0x00,0x03,0x05,0xbe,0x05,0xbe,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xe9,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,\r\n0x03,0x57,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x03,0x2e,0x03,0x57,0x03,0x57,0x00,0x01,0x00,0x00,0x00,0x68,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2b,0x00,0x00,0x00,0x01,0x00,0x02,\r\n0x03,0x34,0x03,0x34,0x00,0x01,0x00,0x00,0x00,0x4c,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x7a,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x7b,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,\r\n0x00,0x00,0x00,0x9b,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x9c,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0x99,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x04,0x19,\r\n0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x47,0x00,0x01,0x00,0x01,0x04,0x1c,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x04,0x15,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0x34,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x1c,0x03,0xc5,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,\r\n0x04,0x1c,0x03,0x3d,0x00,0x00,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x04,0x15,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x34,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0xc5,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x3d,0x00,0x01,0x00,0x01,0x03,0x48,\r\n0x00,0x00,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x00,0x00,0x01,0x03,0x30,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x00,0x00,0x04,0x03,0x2e,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x03,0x57,0x00,0x00,0x00,0x02,0x06,0xce,0x06,0xce,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xc5,0x00,0x01,0x06,0xce,\r\n0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc6,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x19,0x00,0x01,0x00,0x00,0x00,0xc7,0x00,0x01,0x06,0xce,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2e,0x00,0x00,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x01,0x00,0x00,0x01,0x2f,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x04,0x1c,0x00,0x01,0x00,0x00,0x00,0x33,0x00,0x00,0x00,0x01,0x00,0x01,0x03,0x48,0x00,0x01,0x00,0x00,0x00,0xa6,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x02,0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x19,0x00,0x01,0x00,0x00,0x01,0x10,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x02,\r\n0x04,0x19,0x04,0x1b,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x03,0x2b,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x03,0x2e,0x04,0x19,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,0x04,0x1c,0x04,0x1c,0x00,0x00,0x00,0x01,0x03,0x43,0x00,0x01,0x00,0x03,0x04,0x19,\r\n0x03,0x3d,0x04,0x19,0x00,0x00,0x00,0x02,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x01,0x00,0x00,0x00,0xc0,0x00,0x03,0x04,0x1c,0x03,0x30,0x03,0x43,0x00,0x01,0x00,0x01,0x04,0x1b,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x00,0x00,0x00,\r\n0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x02,0x00,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,\r\n0x00,0x01,0x00,0x03,0x00,0x01,0x00,0x00,0x00,0x6e,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x05,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x04,0x00,0x00,\r\n};\r\n\r\nread_only global String8 rd_default_code_font_bytes = {rd_default_code_font_bytes__data, sizeof(rd_default_code_font_bytes__data)};\r\nread_only global U8 rd_icon_file_bytes__data[] =\r\n{\r\n0x00,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x20,0x00,0x02,0x1e,0x00,0x00,0x16,0x00,0x00,0x00,0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a,0x00,0x00,0x00,0x0d,0x49,0x48,0x44,0x52,0x00,0x00,0x01,0x00,0x00,0x00,0x01,0x00,0x08,0x06,0x00,0x00,0x00,0x5c,0x72,0xa8,0x66,0x00,0x00,0x1d,0xc9,0x49,0x44,0x41,0x54,0x78,\r\n0x9c,0xed,0xdd,0x7b,0x7c,0x14,0xe5,0xbd,0xc7,0xf1,0xcf,0x6e,0xb2,0x9b,0x04,0x12,0x20,0x10,0xae,0xe2,0x25,0x52,0x06,0x05,0xe5,0x12,0x14,0x6f,0xc7,0x56,0x99,0x5a,0xd4,0xaa,0xd5,0xda,0x8b,0xb7,0xa2,0x55,0x4f,0x6d,0x6b,0xab,0xb5,0xf6,0x72,0x7a,0xb1,0xb5,0x1e,0x41,0xce,0xd1,0xb6,0x5a,0x4f,0xeb,0xa9,0x56,0x8b,0x37,0xb4,0x5a,\r\n0xfb,0xaa,0x56,0x5a,0xa4,0x1d,0xb5,0x20,0x2d,0x95,0x8a,0x8a,0xf5,0xa0,0x83,0x8a,0x37,0x10,0x08,0x90,0x70,0x0b,0xe4,0xb6,0x7b,0xfe,0x98,0x8d,0x44,0x48,0x42,0x36,0xf3,0xcc,0xfc,0x66,0x77,0x7e,0xef,0xd7,0x8b,0x57,0xbc,0x24,0xcf,0xf3,0xcb,0x32,0xcf,0x77,0x9f,0x99,0x9d,0x79,0x1e,0x50,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,\r\n0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x54,0xe1,0x4a,0x48,0x17,0xa0,0x82,0xe5,0x58,0x54,0x01,0xd5,0xc0,0xa0,0x4e,0x5f,0x3b,0xff,0x33,0x40,0x23,0xd0,0x90,0xfb,0xda,0xf9,0x9f,0x1b,0x6c,0x97,0x6d,0x61,0xd7,0xac,0xc2,0xa3,0x01,0x50,0xa0,0x1c,0x8b,0xa1,0xc0,0x54,0x60,0x0a,0x70,0x30,0x7b,\r\n0x0f,0xec,0x6a,0x60,0x20,0x50,0xe2,0xb3,0xab,0x76,0x60,0x0b,0x9d,0x42,0x81,0xdd,0x41,0xf1,0x06,0xf0,0x3c,0xf0,0x9c,0xed,0x52,0xef,0xb3,0x1f,0x25,0x40,0x03,0xa0,0x00,0x38,0x16,0xfb,0x03,0x75,0x78,0x83,0xbd,0x2e,0xf7,0x67,0x3f,0xd1,0xa2,0xf6,0xb6,0x06,0x58,0xde,0xf9,0x8f,0xed,0xf2,0xae,0x6c,0x49,0x6a,0x5f,0x34,0x00,0x22,\r\n0xc4,0xb1,0x48,0xe0,0xbd,0x9b,0xd7,0x75,0xfa,0x33,0x05,0x18,0x2a,0x59,0x97,0x0f,0xf5,0x78,0x33,0x84,0xce,0xa1,0xf0,0xba,0x6c,0x49,0xaa,0x33,0x0d,0x80,0x88,0x70,0x2c,0x7e,0x0f,0x9c,0x80,0x37,0x6d,0x2f,0x66,0x5b,0x80,0xa7,0x6d,0x97,0x33,0xa5,0x0b,0x51,0x1a,0x00,0x91,0xe0,0x58,0xd4,0xe2,0x9d,0x4f,0xc7,0x49,0xad,0xed,0xf2,\r\n0xa6,0x74,0x11,0x71,0x97,0x94,0x2e,0x40,0x01,0x30,0x5d,0xba,0x00,0x01,0x71,0xfc,0x9d,0x23,0x47,0x03,0x20,0x1a,0xe2,0x38,0x18,0xe2,0xf8,0x3b,0x47,0x8e,0x06,0x40,0x34,0x9c,0x28,0x5d,0x80,0x80,0x38,0xfe,0xce,0x91,0xa3,0x01,0x20,0xcc,0xb1,0x38,0x04,0x18,0x29,0x5d,0x87,0x80,0x51,0x8e,0xc5,0x38,0xe9,0x22,0xe2,0x4e,0x03,0x40,\r\n0x5e,0x9c,0xa7,0xc2,0x71,0xfe,0xdd,0x23,0x41,0x03,0x40,0x5e,0x9c,0x07,0x41,0x9c,0x7f,0xf7,0x48,0xd0,0x8f,0x01,0x05,0xe5,0x6e,0xfc,0xa9,0x07,0x86,0x48,0xd7,0x22,0x64,0x23,0x30,0xcc,0x76,0xc9,0x4a,0x17,0x12,0x57,0x3a,0x03,0x90,0x35,0x91,0xf8,0x0e,0x7e,0x80,0x1a,0xe0,0x70,0xe9,0x22,0xe2,0x4c,0x03,0x40,0x96,0x4e,0x81,0xf5,\r\n0x35,0x10,0xa5,0x01,0x20,0x4b,0x0f,0x7e,0x7d,0x0d,0x44,0xe9,0x35,0x00,0x21,0x8e,0x45,0x09,0xb0,0x19,0x18,0x20,0x5d,0x8b,0xb0,0x2d,0xc0,0x10,0xdb,0xa5,0x5d,0xba,0x90,0x38,0xd2,0x19,0x80,0x9c,0xa9,0xe8,0xe0,0x07,0xef,0xe1,0xa7,0x3a,0xe9,0x22,0xe2,0x4a,0x03,0x40,0x8e,0x4e,0x7d,0x77,0xd3,0xd7,0x42,0x88,0x06,0x80,0x1c,0x3d,\r\n0xe8,0x77,0xd3,0xd7,0x42,0x88,0x5e,0x03,0x10,0xe0,0x58,0xa4,0xf1,0x96,0xd6,0xea,0x27,0x5d,0x4b,0x44,0x34,0x01,0x83,0x6c,0x97,0x56,0xe9,0x42,0xe2,0x46,0x67,0x00,0x32,0x8e,0x42,0x07,0x7f,0x67,0xfd,0xf0,0x5e,0x13,0x15,0x32,0x0d,0x00,0x19,0x3a,0xe5,0xdd,0x9b,0xbe,0x26,0x02,0x34,0x00,0x64,0xe8,0xc1,0xbe,0x37,0x7d,0x4d,0x04,\r\n0xe8,0x35,0x80,0x90,0x39,0x16,0x15,0x78,0x4b,0x6a,0xa7,0xa5,0x6b,0x89,0x98,0x66,0xa0,0xda,0x76,0xd9,0x29,0x5d,0x48,0x9c,0xe8,0x0c,0x20,0x7c,0xc7,0xa1,0x83,0xbf,0x2b,0x65,0xc0,0xb1,0xd2,0x45,0xc4,0x8d,0x06,0x40,0xf8,0x74,0xaa,0xdb,0x3d,0x7d,0x6d,0x42,0xa6,0x01,0x10,0x3e,0x3d,0xc8,0xbb,0xa7,0xaf,0x4d,0xc8,0xf4,0x1a,0x40,\r\n0x88,0x1c,0x8b,0x01,0x78,0xf7,0xff,0xfb,0xdd,0xae,0xab,0x58,0xb5,0x01,0x83,0x75,0x3f,0xc2,0xf0,0xe8,0x0c,0x20,0x5c,0xc7,0xa3,0x83,0xbf,0x27,0xa5,0x78,0xaf,0x91,0x0a,0x89,0xce,0x00,0x42,0xe0,0x58,0x94,0x03,0x5f,0x00,0xbe,0x0d,0x8c,0x12,0x2e,0x27,0xea,0xd6,0x02,0x73,0x80,0x3b,0x6c,0x97,0x5d,0xd2,0xc5,0x14,0x3b,0x0d,0x80,\r\n0x00,0xe5,0x3e,0xf2,0xfb,0x22,0xf0,0x2d,0x60,0x84,0x70,0x39,0x85,0xe6,0x3d,0xe0,0x46,0xe0,0x7f,0xf5,0xa3,0xc1,0xe0,0x68,0x00,0x04,0xc0,0xb1,0xe8,0x0f,0x7c,0x19,0xb8,0x1a,0x18,0x2e,0x5c,0x4e,0xa1,0x5b,0x0f,0xdc,0x04,0xdc,0x66,0xbb,0xec,0x90,0x2e,0xa6,0xd8,0x68,0x00,0x18,0xe4,0x58,0x54,0x02,0x5f,0x01,0xbe,0x4e,0xe1,0xee,\r\n0xe8,0x1b,0x55,0xf5,0xc0,0x4f,0x80,0xff,0xb1,0x5d,0xb6,0x4b,0x17,0x53,0x2c,0x34,0x00,0x0c,0xc8,0x5d,0xdd,0xbf,0x02,0xf8,0x1a,0xf1,0x5e,0xe4,0x33,0x0c,0x9b,0x80,0x9b,0x81,0x9f,0xd9,0x2e,0x5b,0xa5,0x8b,0x29,0x74,0x05,0x15,0x00,0x8e,0x45,0x12,0xf8,0x11,0xb0,0x1a,0x58,0x60,0xbb,0xac,0x15,0xae,0x27,0x0d,0x7c,0x13,0xf8,0x06,\r\n0x30,0x48,0xb2,0x96,0x18,0x6a,0x00,0x7e,0x0c,0xdc,0x68,0xbb,0xb4,0x48,0x16,0xe2,0x58,0x8c,0x02,0x4e,0x06,0x0e,0x02,0xae,0xb5,0x5d,0x32,0x92,0xf5,0xe4,0xa3,0xd0,0x02,0xe0,0x66,0xe0,0xca,0x4e,0xff,0xe9,0x5f,0xc0,0x02,0xe0,0x09,0x60,0xb1,0xed,0xd2,0x1c,0x62,0x2d,0x75,0xc0,0x5c,0x74,0x59,0x6b,0x69,0x2f,0x01,0x17,0xda,0x2e,\r\n0xcf,0x87,0xd5,0xa1,0x63,0x51,0x86,0xf7,0x71,0xe5,0x0c,0xbc,0x81,0x7f,0x58,0xa7,0xff,0x7d,0xb3,0xed,0x72,0x55,0x58,0xb5,0xf8,0x55,0x30,0x01,0xe0,0x58,0x5c,0x89,0x37,0xf5,0xeb,0x4e,0x13,0xf0,0x34,0xb9,0x40,0xb0,0x5d,0xdc,0x80,0xea,0x48,0x01,0xd7,0x00,0xdf,0xc1,0xfb,0xdc,0x5a,0xc9,0x6b,0x03,0x6e,0x00,0xfe,0x33,0xa8,0x45,\r\n0x45,0x1c,0x0b,0x8b,0xdd,0x03,0xfe,0x04,0x7a,0x5e,0xcf,0xe1,0x4a,0xdb,0xe5,0x67,0x41,0xd4,0x61,0x5a,0x41,0x04,0x80,0x63,0x71,0x26,0xf0,0x08,0xf9,0xdd,0xb8,0xb4,0x1a,0x6f,0x66,0xb0,0x00,0x78,0xd2,0xc4,0xdd,0x65,0x8e,0xc5,0x14,0xbc,0x77,0xfd,0x89,0x7e,0xdb,0x52,0x81,0x58,0x01,0x5c,0x64,0x62,0x36,0xe0,0x58,0x54,0x01,0x36,\r\n0xde,0xa0,0x9f,0x01,0xd4,0xe6,0xf1,0xe3,0x19,0xe0,0x93,0xb6,0xcb,0xa3,0x7e,0xeb,0x08,0x5a,0xe4,0x03,0xc0,0xb1,0x98,0x86,0xf7,0xce,0x5e,0xe1,0xa3,0x99,0x56,0xe0,0x6f,0xec,0x0e,0x84,0x17,0xf2,0xd9,0x8e,0x2a,0xf7,0xae,0xff,0x7d,0xe0,0xbb,0xe8,0xbb,0x7e,0xd4,0xb5,0x02,0xb3,0x81,0x59,0xf9,0xcc,0x06,0x72,0xdb,0xb4,0x4d,0x61,\r\n0xf7,0xbb,0xfc,0x31,0x40,0xca,0x47,0x1d,0x4d,0xc0,0x09,0xb6,0xcb,0x32,0x1f,0x6d,0x04,0x2e,0xd2,0x01,0xe0,0x58,0xd4,0x02,0x4b,0x81,0x61,0x86,0x9b,0x5e,0x0f,0x2c,0xc4,0x0b,0x84,0x85,0xb6,0x4b,0x7d,0x0f,0x35,0x4c,0xc6,0x7b,0xd7,0x9f,0x64,0xb8,0x06,0x15,0xac,0x17,0xf1,0xae,0x0d,0xbc,0xd8,0xdd,0x37,0x38,0x16,0x43,0x81,0x8f,\r\n0xe1,0x0d,0xf8,0x93,0x30,0x7f,0xcf,0xc6,0x06,0xe0,0x68,0xdb,0x65,0xb5,0xe1,0x76,0x8d,0x89,0x6c,0x00,0x38,0x16,0xd5,0x78,0xef,0xda,0x87,0x04,0xdc,0x55,0x16,0x58,0xce,0xee,0xd9,0xc1,0xdf,0x6d,0x97,0xb6,0xdc,0xbb,0xfe,0xf7,0xf0,0xde,0xf5,0xfd,0xbc,0x13,0x28,0x39,0xad,0xc0,0x2c,0x60,0xb6,0xed,0xd2,0xea,0x58,0x94,0xe2,0xbd,\r\n0xb3,0x9f,0x8c,0xf7,0x4e,0x5f,0x47,0xf0,0x63,0xe0,0x15,0xe0,0x58,0xdb,0xa5,0x21,0xe0,0x7e,0xfa,0x24,0x92,0x01,0x90,0xbb,0xca,0xba,0x10,0xf8,0xb0,0x40,0xf7,0x5b,0x01,0x07,0xef,0x9c,0x6f,0xb2,0x40,0xff,0xca,0xbc,0x17,0xf0,0xae,0x09,0xd9,0xc8,0x6c,0xc6,0xb2,0x08,0x38,0x49,0xfa,0xe3,0xca,0xae,0x44,0x2e,0x00,0x72,0xe7,0x62,\r\n0xf7,0x03,0xe7,0x4a,0xd7,0xa2,0x94,0x41,0xf3,0x80,0x0b,0xa2,0xb6,0x15,0x7a,0x14,0x1f,0x07,0xbe,0x1e,0x1d,0xfc,0xaa,0xf8,0x9c,0x07,0xfc,0xa7,0x74,0x11,0x7b,0x8a,0xd4,0x0c,0xc0,0xb1,0xb8,0x14,0xb8,0x43,0xba,0x0e,0xa5,0x02,0x74,0xa9,0xed,0x72,0xa7,0x74,0x11,0x1d,0x22,0x13,0x00,0x8e,0xc5,0x47,0x81,0x3f,0xa1,0x1f,0xb3,0xa9,\r\n0xe2,0xd6,0x06,0x9c,0x62,0xbb,0xfc,0x45,0xba,0x10,0x88,0x48,0x00,0xe4,0xae,0xf8,0xbf,0x0c,0x8c,0x94,0xae,0x45,0xa9,0x10,0xbc,0x07,0x4c,0x88,0xc2,0x27,0x03,0x51,0xb9,0x06,0xf0,0x33,0x74,0xf0,0xab,0xf8,0x18,0x09,0xdc,0x22,0x5d,0x04,0x44,0x60,0x06,0xe0,0x58,0x9c,0x0e,0x3c,0x26,0x5d,0x87,0x52,0x02,0x4e,0xb7,0x5d,0x1e,0x97,\r\n0x2c,0x40,0x34,0x00,0x74,0xea,0xaf,0x62,0x4e,0xfc,0x54,0x40,0xfa,0x14,0xe0,0x16,0x74,0xf0,0xab,0xf8,0x1a,0x49,0xcf,0x4f,0xb8,0x06,0x4e,0x6c,0x06,0xa0,0x53,0x7f,0xa5,0xde,0x27,0x76,0x2a,0x20,0x12,0x00,0x3a,0xf5,0x57,0xea,0x03,0xd6,0xe2,0x9d,0x0a,0x34,0x86,0xdd,0xb1,0xd4,0x29,0x80,0x4e,0xfd,0x95,0xda,0x6d,0x14,0x42,0x9f,\r\n0x0a,0x84,0x3e,0x03,0xd0,0xa9,0xbf,0x52,0xdd,0x0a,0xfd,0x54,0x20,0xd4,0x00,0xd0,0xa9,0xbf,0x52,0x3d,0x0a,0xfd,0x54,0x20,0xec,0x53,0x00,0x9d,0xfa,0x2b,0xd5,0xbd,0xd0,0x4f,0x05,0x42,0x9b,0x01,0x38,0x16,0xa7,0x01,0x7f,0x08,0xab,0x3f,0xa5,0x0a,0x58,0x68,0xa7,0x02,0xa1,0x04,0x40,0x6e,0x81,0x8f,0x55,0xc0,0xfe,0x61,0xf4,0xa7,\r\n0x54,0x81,0x7b,0x07,0xf8,0x50,0x18,0x0b,0x88,0x84,0x75,0x0a,0x70,0x09,0x3a,0xf8,0x95,0xea,0xad,0xfd,0xf1,0xc6,0x4c,0xe0,0x02,0x9f,0x01,0xe4,0x76,0xcf,0x79,0x0d,0x0d,0x00,0xa5,0xf2,0xf1,0x36,0x30,0x36,0xe8,0x59,0x40,0x18,0x33,0x80,0xcf,0xa3,0x83,0x5f,0xa9,0x7c,0x1d,0x00,0x5c,0x14,0x74,0x27,0x81,0xce,0x00,0x72,0x2b,0xeb,\r\n0xae,0x02,0x0e,0x0c,0xb2,0x1f,0xa5,0x8a,0xd4,0x5b,0x78,0xb3,0x80,0x40,0x76,0x3b,0x82,0xe0,0x67,0x00,0x17,0xa2,0x83,0x5f,0xa9,0xbe,0x3a,0x10,0x98,0x19,0x64,0x07,0x81,0xcd,0x00,0x72,0x6b,0xb0,0xbb,0xe4,0xb7,0xa5,0x92,0x52,0xea,0x83,0x56,0x03,0x96,0xed,0xd2,0x16,0x44,0xe3,0x41,0xce,0x00,0x66,0xa2,0x83,0x5f,0x29,0xbf,0x6a,\r\n0x81,0xcf,0x05,0xd5,0x78,0x20,0x33,0x80,0xdc,0xbb,0xff,0xab,0xc0,0xc1,0x41,0xb4,0xaf,0x54,0xcc,0xbc,0x0e,0x8c,0xb3,0x5d,0xda,0x4d,0x37,0x1c,0xd4,0x0c,0xe0,0x7c,0x74,0xf0,0x2b,0x65,0xca,0x18,0xbc,0x31,0x65,0x9c,0xf1,0x19,0x80,0x63,0x51,0x82,0xb7,0x1f,0xda,0x87,0x4c,0xb7,0xad,0x54,0x8c,0xad,0x02,0x0e,0x35,0x3d,0x0b,0x08,\r\n0x62,0x0d,0xfe,0xf3,0xd0,0xc1,0xdf,0xa3,0x64,0x2a,0xcd,0x90,0xe9,0xa7,0x33,0xea,0xd3,0x97,0x52,0x7d,0xe4,0x47,0x00,0xc8,0x66,0xb3,0x40,0x16,0x32,0x19,0xef,0x9f,0x73,0x7f,0xb2,0xd9,0xcc,0xfb,0xff,0x4c,0x36,0x4b,0x36,0x93,0xf1,0xbe,0x2f,0x9b,0xf5,0xbe,0xaf,0xf3,0xf7,0x93,0xfb,0xff,0xdd,0xfc,0x7c,0xc7,0xf7,0x43,0x76,0xf7,\r\n0xcf,0x7c,0xa0,0xbf,0x3d,0xfa,0xee,0xa2,0x2f,0xb2,0x59,0xb2,0x74,0xf5,0xb3,0xbd,0xab,0xb5,0xf3,0xcf,0xaf,0x7b,0xf4,0x3e,0x36,0x3e,0xa9,0x4f,0x86,0xf7,0xd2,0x58,0xbc,0x1d,0xb3,0xee,0x33,0xd9,0xa8,0xd1,0x19,0x80,0x63,0x91,0x04,0x56,0x02,0x96,0xc9,0x76,0x8b,0x59,0xbf,0x03,0xc7,0x32,0xf2,0x33,0x97,0x32,0xf2,0xac,0x8b,0x48,\r\n0x0f,0x31,0xbd,0x0b,0x7a,0xb4,0x65,0xdb,0x5a,0x59,0xf1,0xc5,0x33,0xd8,0xb4,0x78,0x81,0x74,0x29,0x85,0xe2,0x55,0x60,0xbc,0xed,0x92,0x31,0xd5,0xa0,0xe9,0x00,0x38,0x07,0x78,0xc0,0x64,0x9b,0x71,0x91,0x4c,0xa5,0x19,0x72,0xe2,0x69,0x1c,0x70,0xf1,0x37,0x18,0x38,0xe5,0x18,0xe9,0x72,0x42,0x93,0x69,0xde,0xc5,0x8b,0x97,0x9e,0x42,\r\n0xc3,0xb3,0x4f,0x4b,0x97,0x52,0x28,0xce,0xb5,0x5d,0x1e,0x34,0xd5,0x98,0xe9,0x8b,0x80,0xa1,0x3c,0xc0,0x50,0x8c,0x32,0xad,0x2d,0xd4,0x2f,0xfc,0x1d,0xcb,0xcf,0x3f,0x9e,0x55,0x37,0x7c,0x9d,0x4c,0xf3,0x2e,0xe9,0x92,0x42,0x91,0x2c,0x2b,0x67,0xe2,0xed,0x8f,0x33,0x60,0xf2,0xd1,0xd2,0xa5,0x14,0x8a,0x8b,0x4d,0x36,0x66,0x6c,0x06,\r\n0xe0,0x58,0x0c,0xc3,0x5b,0xd1,0xa4,0xc4,0x54,0x9b,0x71,0xd6,0xef,0xe0,0x43,0x18,0x3f,0x67,0x2e,0x03,0x26,0x1d,0x25,0x5d,0x4a,0x28,0xda,0xb6,0x36,0xb2,0x7c,0xe6,0x89,0x6c,0x5f,0xf9,0x82,0x74,0x29,0x51,0xd7,0x0e,0x8c,0xb4,0x5d,0xea,0x4d,0x34,0x66,0x72,0x06,0xf0,0x69,0x74,0xf0,0x1b,0xd3,0xf4,0xc6,0x2b,0x3c,0x77,0xee,0xbf,\r\n0xf1,0xfa,0x8f,0xbf,0x43,0xa6,0x35,0xf0,0xc7,0xc2,0xc5,0x95,0x0e,0x18,0xc4,0x94,0x5f,0xff,0x99,0xfe,0x1f,0x1a,0x2f,0x5d,0x4a,0xd4,0x95,0xe0,0x8d,0x35,0x23,0x4c,0x06,0xc0,0x39,0x06,0xdb,0x52,0x40,0xb6,0xbd,0x8d,0xb7,0x6e,0x9f,0xc3,0xb2,0xb3,0xa6,0xd2,0xb4,0xfa,0x55,0xe9,0x72,0x02,0x97,0xaa,0xae,0x61,0xca,0xdc,0xbf,0x50,\r\n0x71,0xc0,0x18,0xe9,0x52,0xa2,0xce,0xd8,0x58,0x33,0x72,0x0a,0xe0,0x58,0x8c,0xc6,0x7b,0x7e,0x59,0x7c,0xaf,0xc1,0x62,0x55,0x36,0x7c,0x3f,0xea,0xe6,0x2d,0xa6,0x62,0x74,0xf1,0xdf,0x5d,0xbd,0x6b,0xed,0x5b,0x2c,0x3f,0xff,0xc3,0xec,0x5a,0xfb,0xb6,0x74,0x29,0x51,0x95,0x05,0xf6,0xb7,0x5d,0xd6,0xf8,0x6d,0xc8,0x54,0x00,0x5c,0x0d,\r\n0xdc,0x64,0xa2,0xad,0x42,0x52,0x5a,0x99,0xa0,0xfa,0xb0,0x34,0xe5,0x43,0x4b,0x28,0xab,0x4e,0x92,0xae,0x4e,0x52,0x36,0x38,0x49,0x32,0x95,0xa0,0x79,0x73,0x86,0x96,0xcd,0x19,0x9a,0x1b,0xda,0x69,0xde,0x94,0xa1,0x71,0x65,0x2b,0xbb,0xea,0xfd,0xdd,0xc3,0x51,0x31,0xba,0x96,0xba,0x79,0x8b,0x29,0x1b,0xbe,0x9f,0xa1,0xdf,0x20,0xba,\r\n0x9a,0xde,0x5a,0xc5,0xf2,0xf3,0x3e,0x4c,0xcb,0xc6,0x75,0xd2,0xa5,0x44,0xd5,0xd5,0xb6,0xcb,0x4f,0xfc,0x36,0x62,0x2a,0x00,0x96,0x01,0x47,0x98,0x68,0x2b,0xea,0xca,0x6b,0x4a,0xa8,0x99,0x96,0x66,0xe8,0xb4,0x32,0x06,0x8d,0x4f,0x93,0xc8,0xe3,0xaa,0xc7,0xf6,0xd5,0x6d,0xd4,0x3f,0xdb,0x4c,0xfd,0xb2,0x66,0xb6,0xbf,0xd9,0xe6,0xe5,\r\n0x78,0x9e,0xfa,0xd5,0x8e,0xa3,0xee,0xfe,0x45,0xb1,0xb8,0x67,0x60,0xc7,0xaa,0x97,0x59,0xfe,0xb9,0x13,0x68,0x6d,0xd8,0x28,0x5d,0x4a,0x14,0x2d,0xb3,0x5d,0xa6,0xf9,0x6d,0xc4,0x77,0x00,0x38,0x16,0x63,0xf0,0x96,0xfc,0x2a,0x6a,0xfd,0x46,0x95,0x30,0xe6,0x82,0x4a,0x86,0x1e,0x55,0x66,0xa4,0xbd,0x6d,0xaf,0xb7,0xf1,0xda,0xbd,0xdb,\r\n0x69,0x78,0x29,0xff,0x0b,0x7c,0x95,0xe3,0x26,0x52,0x77,0xdf,0xd3,0x94,0x0e,0xa8,0x36,0x52,0x4b,0x94,0x6d,0x7b,0x79,0x39,0xcf,0x5f,0x38,0x9d,0xb6,0x6d,0x5b,0xa4,0x4b,0x89,0xa2,0x31,0xb6,0xcb,0x1b,0x7e,0x1a,0x30,0x71,0x11,0xb0,0xa8,0x2f,0xfe,0xa5,0xab,0x93,0x8c,0xbb,0xac,0x8a,0xa3,0x6e,0x19,0x62,0x6c,0xf0,0x03,0x54,0x8d,\r\n0x29,0x65,0xca,0xb5,0x83,0x98,0x7c,0xcd,0x20,0x2a,0x0f,0xca,0xef,0x8e,0xec,0xed,0xaf,0xae,0xe0,0x85,0x4b,0x4e,0x8e,0xc5,0xbd,0x02,0x55,0x13,0xea,0x98,0x74,0xc7,0x1f,0x29,0xe9,0x57,0x29,0x5d,0x4a,0x14,0xf9,0x1e,0x7b,0xbe,0x3f,0xb6,0xbb,0x70,0x08,0xbf,0x00,0x8a,0x72,0x3e,0x3a,0xfc,0xdf,0xca,0x99,0x72,0xed,0x20,0x06,0x8e,\r\n0x4b,0x91,0x08,0xe8,0xf2,0x66,0xc5,0x88,0x12,0xf6,0xfb,0x58,0x05,0xc9,0x74,0x82,0xc6,0x7f,0xb5,0xf4,0xfa,0xb4,0xa0,0x79,0xfd,0x1a,0x48,0x24,0xa8,0x3e,0x7a,0x7a,0x30,0x85,0x45,0x48,0xf9,0xc8,0xfd,0x19,0x38,0xf9,0x68,0x36,0x2c,0x78,0x98,0x6c,0x5b,0x20,0xeb,0x62,0x14,0xaa,0x61,0xf7,0x6c,0xe2,0x36,0x3f,0x0d,0xf8,0x3a,0xac,\r\n0x1d,0x8b,0x09,0xc0,0xbf,0xfc,0xb4,0x11,0x45,0x89,0x04,0xd4,0x9e,0xdb,0x9f,0x83,0xce,0xee,0x1f,0x6a,0xbf,0x9b,0x9e,0x6b,0xe1,0xe5,0x9f,0x6e,0xa1,0x6d,0x67,0xef,0x52,0x20,0x99,0x2e,0x63,0xda,0xe3,0x2f,0xd1,0xef,0xc0,0xb1,0x01,0x57,0x16,0x0d,0x9b,0xfe,0xfa,0x47,0x5e,0xba,0xfc,0xac,0x58,0xdc,0x17,0x91,0x87,0x09,0xb6,0xcb,\r\n0xff,0xf5,0xf5,0x87,0xfd,0x9e,0x02,0x14,0xdd,0xf4,0xbf,0xa4,0x3c,0xc1,0x61,0xdf,0x1a,0x18,0xfa,0xe0,0x07,0x18,0x32,0x35,0xcd,0xd4,0x39,0xd5,0x54,0x0c,0xef,0xdd,0xc4,0x2c,0xd3,0xd2,0x8c,0x7b,0xdd,0x57,0x02,0xae,0x2a,0x3a,0x86,0x7c,0xe4,0x54,0xc6,0xff,0xf8,0x7e,0x12,0x25,0x41,0x3c,0xc4,0x5a,0xb0,0x7c,0x8d,0x41,0xbf,0x01,\r\n0xf0,0x59,0x9f,0x3f,0x1f,0x29,0x89,0x12,0x98,0xf8,0x9d,0x81,0x0c,0x9d,0x66,0xee,0x5c,0x3f,0x5f,0xfd,0x47,0x97,0x52,0x77,0x7d,0x35,0x65,0x83,0x7b,0xf7,0x57,0xb3,0xf9,0x99,0x85,0x6c,0x58,0xf0,0x70,0xc0,0x55,0x45,0xc7,0xb0,0x19,0x9f,0xe2,0xd0,0x1b,0xee,0x22,0x91,0x94,0xda,0xd9,0x3e,0x72,0x7c,0x8d,0xc1,0x3e,0xbf,0x8a,0x8e,\r\n0x45,0x1d,0xde,0x33,0xca,0x45,0xc3,0xba,0xa4,0x8a,0xea,0xc3,0xd2,0xd2,0x65,0x50,0x36,0x38,0xc9,0xe1,0xdf,0x1e,0x48,0x32,0xdd,0xbb,0x33,0xb4,0x55,0xb3,0xaf,0xa2,0xbd,0x69,0x7b,0xc0,0x55,0x45,0xc7,0x88,0x4f,0x7c,0x0e,0xeb,0x07,0x3f,0x27,0xb0,0x0b,0x33,0x85,0xc5,0xca,0x8d,0xc5,0x3e,0xe9,0xf3,0x45,0xc0,0x0b,0x87,0xd0,0x04,\r\n0x9c,0x08,0x8c,0xee,0x6b,0x1b,0x51,0xb2,0xdf,0xc9,0x15,0xd4,0x7e,0x26,0xfc,0x69,0x7f,0x77,0xca,0x06,0x97,0x50,0x31,0xbc,0x84,0xfa,0x7f,0x34,0xef,0xf3,0x7b,0xdb,0x77,0x6c,0xa3,0x75,0xd3,0x06,0x4a,0xaa,0x06,0xd0,0xb2,0x61,0x2d,0xad,0x9b,0xd6,0xd3,0xda,0xb0,0x91,0xb6,0xad,0x0d,0xb4,0x6d,0xdf,0x4a,0x66,0xe7,0x0e,0x32,0xcd,\r\n0xbb,0xc8,0xb6,0xb5,0x92,0xcd,0x64,0x48,0x24,0x13,0x05,0xff,0x0e,0x3a,0xe0,0xf0,0x23,0x28,0xe9,0x5f,0xc5,0xe6,0x25,0x7f,0x96,0x2e,0x45,0xda,0x52,0xe0,0xd6,0x7b,0x36,0xb1,0xef,0x03,0xa5,0x0b,0x7e,0x2f,0x02,0x0e,0x00,0xfe,0x04,0x1c,0xeb,0xa7,0x1d,0x69,0x03,0xac,0x14,0x53,0x67,0x55,0x93,0x88,0xe0,0x98,0x58,0x75,0xd7,0x76,\r\n0xde,0x99,0xdf,0x64,0xbc,0xdd,0x44,0x32,0x49,0xa2,0x34,0x45,0x22,0x95,0x26,0x99,0x4a,0xbf,0xff,0x35,0x99,0x4a,0x93,0x48,0x7f,0xf0,0xbf,0x75,0xf7,0x3d,0x89,0xd2,0xd4,0xee,0x7f,0xcf,0x7d,0x4d,0x0d,0x1a,0xc2,0x7e,0xe7,0x5f,0x4e,0xa2,0x24,0x9c,0xe7,0xc2,0x56,0x7c,0xf1,0x74,0x36,0x3e,0x15,0xca,0x46,0xba,0x51,0xb4,0x04,0x38,\r\n0xc5,0x76,0xd9,0xd6,0xd7,0x06,0x7c,0x5d,0x4d,0xb1,0x5d,0xb6,0x3a,0x16,0x33,0x80,0xf9,0xc0,0x87,0xfd,0xb4,0x25,0x26,0x01,0x63,0x2f,0xaa,0x8c,0xe4,0xe0,0x07,0xa8,0x3d,0xa7,0x3f,0xeb,0x16,0xed,0xa2,0x75,0x9b,0xb1,0x45,0x60,0x00,0xc8,0x66,0x32,0x64,0x5b,0x9a,0xa1,0xa5,0xd9,0xd8,0x22,0x73,0x65,0xc3,0x46,0x31,0xe9,0xf6,0xf9,\r\n0xa1,0x0d,0xfe,0x77,0xef,0xbd,0x95,0x8d,0x4f,0xcf,0x0f,0xa5,0xaf,0x08,0xfa,0x2b,0x70,0x9a,0xed,0xe2,0xeb,0xdc,0xcf,0xf7,0x61,0x9f,0x2b,0xe0,0x14,0xe0,0x49,0xbf,0x6d,0x49,0x18,0x3a,0xad,0x8c,0x81,0xe3,0x52,0xd2,0x65,0x74,0xab,0xb4,0x5f,0x82,0x03,0xcf,0xee,0x27,0x5d,0xc6,0x3e,0xf5,0x1f,0x7b,0x18,0x53,0x1f,0x5a,0x4a,0xe5,\r\n0xa1,0x93,0x43,0xe9,0xef,0xdd,0x7b,0x6f,0xc5,0x9d,0x75,0x65,0x6e,0x2d,0xc4,0xd8,0x71,0x80,0x53,0xfd,0x0e,0x7e,0x30,0xf4,0x38,0xb0,0xed,0xd2,0x04,0x9c,0x06,0x2c,0x34,0xd1,0x5e,0x58,0x12,0x25,0x30,0xe6,0x82,0xe8,0xdf,0x61,0x36,0xfa,0x94,0x0a,0xca,0x87,0x45,0x77,0xa9,0x85,0xea,0x63,0x6c,0xa6,0x3e,0xb8,0x84,0xf2,0x91,0xe1,\r\n0xec,0x01,0x1b,0xf3,0xc1,0xff,0x04,0x70,0x7a,0x6e,0xcc,0xf9,0x66,0x6c,0xe2,0x6b,0xbb,0xec,0x04,0xce,0x00,0xfe,0x68,0xaa,0xcd,0xa0,0x0d,0x3f,0xbe,0x9c,0x7e,0xa3,0xa2,0x3b,0xb0,0x3a,0x24,0x4b,0x13,0x1c,0xf4,0xc9,0x68,0xce,0x02,0x46,0x9c,0x39,0x93,0xc9,0x77,0x2e,0xa0,0xb4,0x72,0x40,0x28,0xfd,0xc5,0x7c,0xf0,0xcf,0x07,0x3e,\r\n0x91,0x1b,0x6b,0x46,0x18,0x3d,0xf3,0xb5,0x5d,0x9a,0x81,0xb3,0x80,0x82,0x58,0xeb,0x79,0xd8,0x31,0x72,0x9f,0xf7,0xe7,0x6b,0xe8,0xd1,0x65,0x79,0x3d,0x79,0x18,0xb8,0x44,0x82,0xda,0xcb,0x7f,0xc0,0xf8,0xff,0xba,0x3b,0xb4,0x1b,0x73,0x62,0x3e,0xf8,0x1f,0x05,0x3e,0x99,0x1b,0x63,0xc6,0x18,0xbf,0xf4,0x65,0xbb,0xb4,0x00,0x9f,0x02,\r\n0x1e,0x31,0xdd,0xb6,0x49,0x25,0xe5,0x09,0x06,0x4f,0x92,0xff,0xcc,0xbf,0xb7,0x52,0x55,0xc9,0xc8,0x5c,0xab,0x48,0x94,0xa6,0x38,0x74,0xd6,0x9d,0xd4,0x5e,0xf1,0xa3,0xd0,0xfa,0x8c,0xf9,0xe0,0x7f,0x04,0xf8,0x74,0x6e,0x6c,0x19,0x15,0xc8,0xb5,0xef,0xdc,0x7e,0xe6,0xe7,0x00,0x0f,0x05,0xd1,0xbe,0x09,0x83,0x27,0xa7,0x49,0xa6,0x0a,\r\n0xeb,0x46,0x12,0xc9,0x3b,0x14,0x3b,0x94,0x56,0x0e,0x60,0xd2,0xed,0xf3,0x19,0x79,0xf6,0xe7,0x43,0xeb,0x33,0xe6,0x83,0xff,0x37,0xc0,0x39,0xb9,0x31,0x65,0x5c,0x60,0x1f,0x7e,0xe5,0xb6,0x33,0x3e,0x0f,0xb8,0x3f,0xa8,0x3e,0xfc,0xa8,0x39,0x52,0x7e,0x30,0xe5,0xab,0x46,0x38,0x00,0xca,0x46,0x8c,0xa6,0x6e,0xde,0x62,0x06,0x1f,0x77,\r\n0x52,0x68,0x7d,0xc6,0x7c,0xf0,0xdf,0x07,0x9c,0x1f,0xd4,0xd6,0xe0,0x10,0xec,0xf6,0xe0,0xe4,0xf6,0x31,0x9b,0x09,0xcc,0x0d,0xb2,0x9f,0xbe,0xa8,0xdc,0xbf,0xf0,0x1e,0x28,0xa9,0x18,0x5e,0xd2,0xeb,0xdb,0x83,0x4d,0xab,0x1c,0x37,0x91,0x23,0x1e,0x5a,0x4a,0xe5,0xb8,0x89,0xa1,0xf5,0x19,0xf3,0xc1,0xff,0x6b,0xe0,0xc2,0x20,0x76,0x04,\r\n0xee,0x2c,0xf0,0xdb,0x5f,0x72,0xdb,0x18,0x5d,0x0c,0xdc,0x11,0x74,0x5f,0xf9,0xe8,0xed,0xc3,0x36,0x51,0x53,0x56,0x1d,0x7e,0xdd,0x83,0x8f,0x3b,0x89,0xa9,0x0f,0x3c,0x13,0xea,0x5a,0x84,0x31,0x1f,0xfc,0x77,0x00,0x97,0x98,0xdc,0x02,0xac,0x3b,0xa1,0x1c,0x4d,0xb6,0x4b,0x16,0xb8,0x0c,0xf8,0x45,0x18,0xfd,0xed,0x4b,0xa2,0x04,0x52,\r\n0x83,0x0a,0x34,0x00,0x42,0x0e,0xae,0x91,0x67,0x7f,0xde,0x5b,0x91,0xa7,0x7f,0x55,0x68,0x7d,0xc6,0x7c,0xf0,0xff,0x02,0xb8,0x2c,0x37,0x66,0x02,0x17,0xda,0x3c,0x38,0xf7,0x0b,0x5d,0xee,0x58,0xb4,0x02,0x57,0x86,0xd5,0x6f,0x57,0xd2,0x03,0x93,0x05,0xfb,0x20,0x59,0x3a,0xac,0x19,0x40,0x22,0x41,0xed,0x57,0xaf,0xa5,0xf6,0xf2,0x1f,\r\n0x84,0xd3,0x5f,0x4e,0xcc,0x07,0xff,0xcd,0xb6,0xcb,0x55,0x61,0x76,0x18,0xfa,0xdb,0xa0,0xed,0xf2,0x35,0x84,0x97,0x10,0x4f,0x55,0x15,0xe6,0xbb,0x3f,0x40,0x6a,0x40,0xf0,0xb5,0x27,0x53,0x69,0xc6,0xcf,0x99,0xab,0x83,0x3f,0x5c,0x37,0x86,0x3d,0xf8,0x41,0x20,0x00,0x00,0x6c,0x97,0x6f,0x02,0x37,0x48,0xf4,0x0d,0x18,0x7f,0xb0,0x26,\r\n0x4c,0xad,0x5b,0x83,0xad,0xbd,0xb4,0x6a,0x20,0x93,0x7e,0xf5,0x27,0x46,0x9c,0x39,0x33,0xd0,0x7e,0xf6,0x14,0xf3,0xc1,0x3f,0xdb,0x76,0xf9,0x96,0x44,0xc7,0x62,0x6f,0x85,0xb6,0xcb,0x77,0x81,0xeb,0x24,0xfa,0x6e,0xd9,0x92,0xe9,0xd3,0x9a,0xfc,0x51,0xd0,0xd2,0x10,0x5c,0x00,0x94,0x8f,0xdc,0x9f,0xa9,0x0f,0x3c,0x13,0xfa,0x42,0xa3,\r\n0x31,0x1f,0xfc,0x3f,0xb2,0x5d,0xbe,0x27,0xd5,0xb9,0xe8,0x5c,0xd8,0x76,0xf9,0x21,0x70,0x4d,0xd8,0xfd,0x66,0xdb,0x73,0x21,0x50,0x80,0x9a,0x03,0x0a,0x80,0xca,0x43,0x27,0x33,0xf5,0xa1,0xa5,0xf4,0x1f,0x7b,0x58,0x20,0xed,0x77,0x27,0xe6,0x83,0xff,0xfb,0xb6,0xcb,0xb5,0x92,0x05,0x88,0x9f,0x0c,0xdb,0x2e,0xd7,0x03,0xb7,0x84,0xdd,\r\n0x6f,0xf3,0xe6,0xc2,0x0c,0x80,0x20,0x66,0x00,0x43,0x8e,0x3f,0x99,0xa9,0xf3,0x16,0x53,0x36,0x6c,0x94,0xf1,0xb6,0x7b,0x12,0xf3,0xc1,0x7f,0xb3,0xed,0x32,0x4b,0xba,0x08,0xf1,0x00,0xc8,0x79,0x27,0xec,0x0e,0x77,0xbc,0x5b,0x78,0xeb,0xcb,0xef,0xda,0xd0,0x4e,0x7b,0xb3,0xd9,0xc1,0x32,0xea,0xd3,0x97,0x32,0xf1,0x97,0x8f,0x87,0xbe,\r\n0xf1,0x46,0xcc,0x07,0x3f,0x08,0x1c,0xf3,0x5d,0x89,0x4a,0x00,0x0c,0x0a,0xbb,0xc3,0x8d,0xcb,0x8c,0x3e,0x54,0x15,0x8a,0x8d,0xcb,0x0c,0x3e,0x0b,0x92,0x48,0x70,0xf0,0xd7,0xae,0xe7,0x90,0xeb,0xef,0x08,0x6d,0x05,0x9f,0x0e,0x3a,0xf8,0x01,0x81,0x63,0xbe,0x2b,0x51,0xb9,0x1f,0x36,0xf4,0x4d,0xee,0x36,0x3d,0xdf,0x42,0xa6,0x2d,0x4b,\r\n0xb2,0xb4,0x70,0x6e,0x08,0xa8,0x7f,0xd6,0x4c,0x68,0x25,0x53,0x69,0x0e,0x99,0x7d,0x27,0x23,0xce,0xb8,0xc0,0x48,0x7b,0xf9,0xd0,0xc1,0xff,0xbe,0x48,0x6c,0xec,0x18,0x95,0x19,0x40,0xe8,0x2f,0x46,0xfb,0xce,0x2c,0x0d,0x2b,0x02,0x79,0xc0,0x2a,0x10,0x6d,0xdb,0xb3,0x34,0xae,0xf4,0x3f,0x03,0x28,0x1d,0x30,0x88,0x49,0x77,0x2e,0xd0,\r\n0xc1,0x2f,0x4f,0x03,0xa0,0x13,0x91,0x17,0x63,0xc3,0xdf,0x0b,0x67,0x73,0xcd,0xfa,0x67,0x9b,0xc9,0xfa,0x7c,0x2c,0xa4,0x7c,0xd4,0x81,0x4c,0x7d,0x60,0x09,0xd5,0x47,0x9d,0x68,0xa6,0xa8,0x3c,0xe8,0xe0,0xdf,0x8b,0x06,0x40,0x27,0x22,0xe7,0x43,0xeb,0x17,0x35,0xb3,0x73,0x5d,0xa0,0x0f,0x5b,0x19,0x91,0x6d,0x87,0x37,0x7f,0xbb,0xc3,\r\n0x57,0x1b,0x55,0x13,0xea,0x38,0xe2,0xe1,0xa5,0xf4,0xff,0xd0,0x78,0x43,0x55,0xf5,0x9e,0x0e,0xfe,0x2e,0x45,0xe2,0x1a,0x40,0x54,0x02,0x40,0x24,0x0d,0x33,0x6d,0x59,0x5e,0xbf,0x3f,0xfa,0x3b,0xea,0xac,0x59,0xb0,0x93,0x9d,0xeb,0xfb,0x1e,0x54,0x43,0x3e,0x72,0x2a,0x75,0xf7,0x2f,0x22,0x5d,0x33,0xc2,0x60,0x55,0xbd,0xa3,0x83,0xbf,\r\n0x5b,0x3a,0x03,0xe8,0x44,0xec,0xc5,0xd8,0xf0,0xf7,0x66,0xb6,0xbe,0x16,0xdd,0x6b,0x01,0xed,0x3b,0xb3,0xac,0xf6,0xf1,0xee,0x3f,0xea,0xb3,0x5f,0x60,0xe2,0x6d,0x8f,0x51,0x52,0x11,0xfe,0xae,0x47,0x3a,0xf8,0x7b,0xa4,0x01,0xd0,0x89,0xdc,0x74,0x28,0x0b,0xaf,0xcd,0xdd,0x1e,0xd9,0x63,0x74,0xf5,0xc3,0x3b,0xfa,0x74,0xff,0x7f,0x22,\r\n0x99,0x64,0xcc,0xd7,0x67,0x73,0xc8,0x75,0xbf,0x0c,0xfd,0x63,0x3e,0xd0,0xc1,0xdf,0x0b,0x1a,0x00,0x00,0x8e,0x45,0x05,0x20,0xba,0xd6,0x55,0xe3,0xca,0x56,0x5e,0x9b,0x1b,0xbd,0x53,0x81,0x0d,0x7f,0x6f,0xe6,0x9d,0xc7,0xf2,0x5f,0xfe,0x3d,0x99,0x2e,0x63,0xfc,0x8d,0xf7,0x71,0xe0,0x65,0xdf,0x09,0xa0,0xaa,0x7d,0xd3,0xc1,0xdf,0x2b,\r\n0x65,0x8e,0x45,0xb9,0x74,0x11,0xe2,0x01,0x40,0x44,0x92,0xf0,0x9d,0xf9,0x4d,0xbc,0xf7,0x64,0x74,0x3e,0x15,0xd8,0xb6,0xba,0x8d,0x95,0xb7,0x6e,0xcd,0x7b,0x0c,0xa5,0x06,0x0e,0x66,0xf2,0x5d,0x0b,0x19,0x7e,0xda,0xb9,0xc1,0x14,0xb6,0x0f,0x3a,0xf8,0xf3,0x22,0x7e,0xec,0x6b,0x00,0x74,0xc8,0xc2,0xab,0xb7,0x6f,0xa3,0x71,0xa5,0xfc,\r\n0xf5,0x80,0x96,0xc6,0x0c,0x2f,0xcd,0xd9,0x92,0xf7,0x6d,0xbf,0x15,0xa3,0x6b,0x99,0xfa,0xe0,0x12,0x06,0x1d,0x29,0xb3,0x4d,0xa3,0x0e,0xfe,0xbc,0x89,0x1f,0xfb,0x51,0x08,0x80,0xc8,0xc8,0xb4,0x66,0x59,0x31,0xbb,0x91,0x4d,0xcb,0x8d,0x2f,0xbf,0xde,0x6b,0x4d,0xef,0xb5,0xb3,0xfc,0x07,0x0d,0xec,0xda,0x98,0xdf,0x55,0xff,0xaa,0xc3,\r\n0x8e,0x60,0xea,0x43,0x4b,0xe9,0x77,0xf0,0x21,0x01,0x55,0xd6,0x33,0x1d,0xfc,0x85,0x29,0x0a,0x01,0xd0,0x20,0x5d,0x40,0x67,0x6d,0x4d,0x59,0x56,0xdc,0xd0,0xc8,0xdb,0x7d,0x38,0xf7,0xf6,0x6b,0xf3,0x8b,0x2d,0xfc,0xf3,0x3f,0x36,0xd3,0xb4,0x26,0xbf,0xc1,0x5f,0x33,0xfd,0x74,0xea,0xee,0xfb,0x2b,0xe9,0x21,0xc3,0x02,0xaa,0xac,0x67,\r\n0x3a,0xf8,0xfb,0x4c,0xfc,0xd8,0xd7,0x00,0xe8,0x42,0x36,0x03,0xaf,0xdd,0xbd,0x9d,0x95,0xff,0xb3,0x95,0x4c,0x6b,0x38,0x07,0xf5,0x3b,0xf3,0x9b,0x78,0x71,0x56,0x23,0x6d,0xdb,0xf3,0xeb,0x6f,0xbf,0xf3,0xbe,0xcc,0xe1,0x3f,0xff,0x3d,0x25,0x15,0x32,0x7b,0x07,0xae,0xfb,0xfd,0x3d,0x3a,0xf8,0xfb,0x4e,0xfc,0xd8,0x8f,0xc4,0x93,0x30,\r\n0x8e,0xc5,0x2e,0x84,0x3f,0x09,0xe8,0x4e,0x79,0x4d,0x09,0xb5,0xe7,0xf4,0x67,0xe4,0x09,0xe5,0x81,0xbc,0x5a,0x8d,0x2f,0xb7,0xf2,0xda,0xbd,0xdb,0xd9,0xba,0x2a,0xbf,0x6b,0x0f,0x89,0x64,0x92,0x31,0x57,0xcf,0xe1,0x80,0x4b,0xbf,0x69,0xbe,0xa8,0x3c,0xb4,0x6c,0x5c,0xc7,0xf2,0xcf,0x9d,0x48,0xd3,0x1b,0xaf,0x88,0xd6,0x51,0x80,0x9a,\r\n0x6d,0x57,0xfe,0x53,0x80,0xa8,0x04,0xc0,0x3a,0x60,0xb8,0x74,0x1d,0x3d,0xa9,0x3c,0xb0,0x94,0x31,0x17,0x54,0x32,0xa4,0xce,0xcc,0x7e,0x82,0x3b,0xde,0x6e,0xe3,0xb5,0x7b,0xb7,0xb3,0xe9,0xf9,0x96,0xbc,0x97,0x27,0x4b,0x96,0x95,0x33,0xfe,0xbf,0xee,0x66,0xd8,0x29,0x9f,0x31,0x52,0x8b,0x5f,0x1a,0x02,0x7d,0xb2,0xce,0x76,0x19,0x29,\r\n0x5d,0x44,0x54,0x02,0x60,0x25,0x20,0x73,0xf5,0x2a,0x4f,0xfd,0x46,0x95,0x50,0x73,0x64,0x19,0x43,0xa7,0x95,0x79,0x9b,0x75,0xe6,0xf1,0x0a,0x36,0xad,0x69,0xa7,0xfe,0xd9,0x66,0xea,0x9f,0x6d,0x66,0xdb,0xaa,0xd6,0x3e,0xcd,0x9a,0x4b,0xab,0x06,0x32,0xf1,0xb6,0xc7,0xc4,0xae,0xf4,0x77,0x47,0x43,0x20,0x6f,0x2b,0x6d,0x97,0xf0,0x1f,\r\n0xcc,0xd8,0x43,0x54,0x02,0xe0,0x6f,0xc0,0x31,0xd2,0x75,0xe4,0x2b,0x3d,0x28,0xc9,0xe0,0x89,0x69,0xca,0x6a,0x92,0x94,0x0d,0x2e,0xa1,0xac,0x3a,0x49,0xba,0x3a,0x49,0x32,0x95,0xa0,0x79,0x73,0x3b,0x2d,0x0d,0x19,0x9a,0x37,0x67,0x68,0x6e,0xc8,0xd0,0xf8,0x72,0x0b,0x4d,0x6b,0xfd,0x3d,0x78,0x94,0xaa,0xae,0x61,0xf2,0x9d,0x4f,0x50,\r\n0x35,0xa1,0xce,0xd0,0x6f,0x60,0x96,0x86,0x40,0x5e,0xfe,0x66,0xbb,0x1c,0x27,0x5d,0x44,0x54,0x16,0x04,0x69,0x94,0x2e,0xa0,0x2f,0x5a,0x1a,0x33,0xac,0x5b,0x14,0xce,0xcd,0x43,0x65,0xc3,0x46,0x31,0xf9,0xd7,0x7f,0x16,0x79,0x9a,0xaf,0xb7,0xd2,0x35,0x23,0xa8,0xbb,0xf7,0x29,0x0d,0x81,0xde,0x89,0xc4,0x31,0x1f,0x85,0x4f,0x01,0x20,\r\n0x02,0x57,0x43,0xa3,0xac,0x62,0x74,0x2d,0x75,0xf3,0x16,0x47,0x7a,0xf0,0x77,0xe8,0x08,0x01,0xa9,0xfb,0x11,0x0a,0x48,0x24,0x8e,0x79,0x0d,0x80,0x28,0x4b,0x24,0x18,0x7e,0xea,0x67,0x39,0xe2,0x91,0x65,0x54,0xec,0x7f,0xb0,0x74,0x35,0xbd,0xa6,0x21,0xd0,0x2b,0x91,0x38,0xe6,0x35,0x00,0x22,0x2a,0x35,0x78,0x28,0x87,0xdd,0xf2,0x10,\r\n0x13,0x7e,0xfa,0x20,0xa9,0x41,0x43,0xa4,0xcb,0xc9,0x9b,0x86,0xc0,0x3e,0x45,0xe2,0x98,0x8f,0x4a,0x00,0x44,0xe2,0x7c,0x28,0x2a,0x86,0xce,0x38,0x9b,0xa3,0xe7,0xbf,0xcc,0xb0,0x19,0x9f,0x92,0x2e,0xc5,0x17,0x0d,0x81,0x1e,0x45,0xe2,0x98,0x8f,0x4a,0x00,0xec,0x2f,0x5d,0x80,0xb4,0x44,0x32,0x49,0xcd,0xf4,0x33,0xa8,0x9b,0xb7,0x98,\r\n0xc3,0x7f,0xf6,0x5b,0x52,0x83,0x87,0x4a,0x97,0x64,0x84,0x86,0x40,0xb7,0x22,0x71,0xcc,0x8b,0x7f,0x0c,0xe8,0x58,0x5c,0x83,0xd0,0x1e,0x81,0x51,0x90,0x2c,0x2b,0x67,0xc4,0x99,0x33,0x39,0xe0,0xe2,0xab,0xe9,0x77,0x90,0x25,0x5d,0x4e,0x60,0xf4,0x23,0xc2,0x2e,0x5d,0x93,0xdb,0x19,0x4b,0x8c,0x68,0x00,0x38,0x16,0xd7,0x21,0xb0,0x37,\r\n0xa0,0xb4,0x54,0x75,0x0d,0xd5,0x47,0x9d,0xc8,0xe0,0x63,0x3f,0x4a,0xcd,0x47,0xcf,0x14,0x7b,0x88,0x27,0x6c,0x1a,0x02,0x5d,0xba,0x2e,0xb7,0x47,0xa6,0x08,0xb1,0x00,0x70,0x2c,0x66,0x03,0x32,0x4b,0xd6,0x98,0x92,0x48,0xf4,0xfa,0x21,0x98,0x44,0x49,0x09,0x55,0xe3,0xeb,0xa8,0x3e,0xf6,0xa3,0x54,0x1d,0x3a,0xd9,0xfb,0xd9,0x8e,0x36,\r\n0xf6,0xfc,0xde,0xae,0xfe,0x5a,0xba,0xf8,0x3e,0x12,0x09,0x12,0x25,0x25,0x24,0x52,0x69,0x92,0xa5,0x29,0xef,0x6b,0x2a,0x9d,0xfb,0xba,0xc7,0xbf,0xef,0xf1,0xff,0x25,0x96,0x09,0x03,0x0d,0x81,0x6e,0xcc,0x96,0xda,0x21,0x58,0x24,0x00,0x1c,0x8b,0x9b,0x80,0xab,0x25,0xfa,0x56,0x9e,0x44,0x32,0x49,0xa2,0x53,0x28,0x54,0x1f,0x3d,0x9d,\r\n0x09,0x3f,0x99,0x47,0xa2,0x24,0xf8,0x7b,0xc3,0x34,0x04,0xba,0x74,0x93,0xed,0x12,0xfa,0x93,0x5d,0xa1,0x07,0x80,0x63,0x71,0x0b,0x70,0x45,0xd8,0xfd,0xaa,0x7d,0xab,0xb1,0x3f,0xc1,0xe1,0xb7,0xfe,0x56,0x43,0x40,0xce,0x2d,0xb6,0xcb,0xd7,0xc2,0xec,0x30,0xb4,0x00,0x70,0x2c,0x12,0xc0,0xcf,0x81,0x2f,0x85,0xd5,0xa7,0xca,0x9f,0x86,\r\n0x80,0xb8,0x5f,0x00,0x5f,0xb1,0xdd,0x7c,0x9f,0x11,0xed,0x9b,0x50,0x02,0xc0,0xb1,0x48,0x02,0xbf,0x04,0x2e,0x0d,0xa3,0x3f,0xe5,0x8f,0x86,0x80,0xb8,0x3b,0x80,0xcb,0xc2,0x08,0x81,0xc0,0x03,0x20,0x37,0xf8,0xef,0x02,0x2e,0x0c,0xba,0x2f,0x65,0x8e,0x86,0x80,0xb8,0xb9,0xc0,0x25,0xb6,0x4b,0xfe,0x9b,0x42,0xe4,0x21,0xd0,0x00,0x70,\r\n0x2c,0x4a,0x80,0xbb,0x81,0xf3,0x83,0xec,0x47,0x05,0x43,0x43,0x40,0xdc,0xfd,0xc0,0x85,0xb6,0x4b,0x60,0x1b,0x58,0x06,0x16,0x00,0x8e,0x45,0x29,0xde,0x2f,0x10,0x8d,0x65,0x6b,0x54,0x9f,0x68,0x08,0x88,0xfb,0x0d,0x70,0x81,0xed,0xd2,0x16,0x44,0xe3,0x81,0x04,0x80,0x63,0x91,0x02,0x1e,0x04,0x3e,0x19,0x44,0xfb,0x2a,0x5c,0x1a,0x02,\r\n0xe2,0x1e,0x01,0xce,0xb5,0x5d,0x8c,0x6f,0x5a,0x61,0x3c,0x00,0x1c,0x8b,0x34,0xf0,0x30,0x70,0x86,0xe9,0xb6,0x95,0x1c,0x0d,0x01,0x71,0x8f,0x02,0x9f,0xb1,0x5d,0x8c,0x6e,0x5a,0x61,0x34,0x00,0x1c,0x8b,0x32,0xe0,0x77,0xc0,0xa9,0x26,0xdb,0x55,0xd1,0xa0,0x21,0x20,0x6e,0x3e,0x70,0xb6,0xed,0xd2,0x6c,0xaa,0x41,0x63,0x01,0x90,0xdb,\r\n0xe4,0xf3,0xf7,0xc0,0xc7,0x4c,0xb5,0xa9,0xa2,0x47,0x43,0x40,0xdc,0x42,0xe0,0x4c,0xdb,0x65,0xa7,0x89,0xc6,0x8c,0x04,0x80,0x63,0xd1,0x0f,0xf8,0x03,0x30,0xdd,0x44,0x7b,0x2a,0xda,0x34,0x04,0xc4,0x3d,0x09,0x9c,0x6e,0xbb,0xf8,0xde,0xbe,0xca,0x77,0x00,0x38,0x16,0x95,0x78,0x53,0x93,0x68,0xad,0x53,0xad,0x02,0xa5,0x21,0x20,0x6e,\r\n0x11,0xf0,0x71,0xdb,0xc5,0xd7,0xbe,0xf6,0xbe,0x02,0xc0,0xb1,0x18,0x00,0xfc,0x09,0x38,0xd6,0x4f,0x3b,0xaa,0x30,0x69,0x08,0x88,0x5b,0x02,0x9c,0x62,0xbb,0x6c,0xeb,0x6b,0x03,0x7d,0x0e,0x00,0xc7,0x62,0x20,0xf0,0x04,0x70,0x54,0x5f,0xdb,0x50,0x85,0x4f,0x43,0x40,0xdc,0x3f,0x80,0x19,0xb6,0xcb,0x96,0xbe,0xfc,0xb0,0x9f,0x25,0xc1,\r\n0xc6,0xa0,0x83,0x3f,0xf6,0x36,0x3a,0x8f,0xf2,0xd2,0x57,0x3f,0x45,0xb6,0x3d,0x90,0xfb,0x54,0x3e,0x40,0x97,0x17,0xeb,0xd2,0x51,0x78,0x63,0xb1,0x4f,0xfc,0x9e,0x02,0xb8,0xc0,0x58,0x3f,0x6d,0xa8,0xe2,0xa0,0x33,0x01,0x31,0xae,0xed,0x32,0xae,0xaf,0x3f,0xec,0x77,0x51,0xd0,0xdf,0xf8,0xfc,0x79,0x55,0x24,0x74,0x26,0x20,0xc6,0xd7,\r\n0x18,0xf4,0x1b,0x00,0x0f,0xf8,0xfc,0x79,0x55,0x44,0x34,0x04,0x44,0xf8,0x1a,0x83,0xbe,0x02,0xc0,0x76,0xf9,0x3f,0xe0,0x5f,0x7e,0xda,0x50,0xc5,0x25,0xec,0x10,0x18,0x79,0x56,0xac,0x9f,0x32,0x7f,0xc9,0x76,0x59,0xe9,0xa7,0x01,0x13,0xfb,0x02,0x3c,0x68,0xa0,0x0d,0x55,0x44,0xc2,0x0c,0x81,0x4c,0xab,0xd1,0x5b,0xe3,0x0b,0x8d,0xef,\r\n0xb1,0xa7,0x01,0xa0,0x02,0x11,0x56,0x08,0x64,0x35,0x00,0x7c,0xf1,0x1d,0x00,0xb6,0xcb,0xeb,0xc0,0x3f,0xfd,0xb6,0xa3,0x8a,0x4f,0x18,0x21,0x10,0xe3,0x19,0xc0,0x32,0xdb,0xe5,0x0d,0xbf,0x8d,0x98,0xda,0x1a,0x4c,0x67,0x01,0xaa,0x4b,0x41,0x87,0x40,0xb6,0xd5,0xf8,0x23,0xf2,0x85,0xc2,0xc8,0x98,0x33,0x15,0x00,0xbf,0x81,0x70,0x56,\r\n0x31,0x55,0x85,0x27,0xc8,0x10,0x88,0xe9,0x0c,0x20,0x8b,0xa1,0x8f,0xe0,0x8d,0x04,0x80,0xed,0xf2,0x2e,0xde,0x7d,0xc9,0x4a,0x75,0x29,0xa8,0x10,0x88,0xe9,0x35,0x80,0x67,0x6c,0x97,0x35,0x26,0x1a,0x32,0xb9,0x3b,0xb0,0x9e,0x06,0xa8,0x1e,0x05,0x11,0x02,0x31,0x9d,0x01,0x18,0x1b,0x6b,0x26,0x03,0xe0,0x61,0x08,0x6e,0xf5,0x52,0x55,\r\n0x1c,0x4c,0x87,0x40,0xb6,0x2d,0x76,0xd7,0x00,0xda,0xf1,0xc6,0x9a,0x11,0xc6,0x02,0xc0,0x76,0xd9,0x00,0x3c,0x65,0xaa,0x3d,0x55,0xbc,0x4c,0x86,0x40,0x0c,0x67,0x00,0x4f,0xda,0x2e,0xf5,0xa6,0x1a,0x33,0x39,0x03,0x00,0xb8,0xd3,0x70,0x7b,0xaa,0x48,0x99,0x0a,0x81,0x18,0x5e,0x03,0xb8,0xcb,0x64,0x63,0xa6,0x03,0xe0,0x21,0xe0,0x55,\r\n0xc3,0x6d,0xaa,0x22,0x65,0x22,0x04,0x32,0x2d,0xb1,0x0a,0x80,0x57,0xf1,0xc6,0x98,0x31,0x46,0x03,0x20,0xb7,0x8d,0xd1,0x2c,0x93,0x6d,0xaa,0xe2,0xe6,0x37,0x04,0x62,0x76,0x0d,0xe0,0x7a,0xd3,0x5b,0x85,0x99,0x9e,0x01,0x00,0xcc,0x03,0x56,0x05,0xd0,0xae,0x2a,0x52,0x7e,0x42,0x20,0x46,0xa7,0x00,0xab,0x08,0xe0,0xe9,0x5b,0xe3,0x01,\r\n0x90,0xdb,0xc7,0x4c,0x67,0x01,0x2a,0x2f,0x7d,0x0d,0x81,0x18,0x5d,0x04,0xbc,0x3e,0x88,0x3d,0x02,0x83,0x98,0x01,0x80,0xb7,0x27,0xe0,0xeb,0x01,0xb5,0xad,0x8a,0x54,0x5f,0x42,0x20,0x26,0x01,0xf0,0x3a,0xde,0x98,0x32,0x2e,0x90,0x00,0xc8,0x6d,0x64,0x38,0x3b,0x88,0xb6,0x55,0x71,0xcb,0x37,0x04,0x62,0x72,0x0a,0x30,0x2b,0xa8,0x1d,\r\n0x82,0x83,0x9a,0x01,0x00,0xdc,0x03,0xac,0x0e,0xb0,0x7d,0x55,0xa4,0xf2,0x09,0x81,0x18,0x3c,0x0c,0xf4,0x06,0x70,0x6f,0x50,0x8d,0x07,0x16,0x00,0x3a,0x0b,0x50,0x7e,0xf4,0x36,0x04,0x62,0x70,0x0a,0x30,0x3b,0xa8,0xad,0xc1,0x21,0xd8,0x19,0x00,0xc0,0xdd,0xc0,0x5b,0x01,0xf7,0xa1,0x8a,0x54,0x6f,0x42,0xa0,0xc8,0x03,0xe0,0x4d,0xbc,\r\n0x99,0x74,0x60,0x02,0x0d,0x80,0xdc,0x7e,0xe6,0x37,0x04,0xd9,0x87,0x2a,0x6e,0xfb,0x0a,0x81,0x22,0xbf,0x06,0x70,0x43,0x6e,0x0c,0x05,0x26,0xe8,0x19,0x00,0xc0,0xaf,0x81,0x77,0x42,0xe8,0x47,0x15,0xa9,0x9e,0x42,0xa0,0x88,0x6f,0x04,0x7a,0x1b,0x6f,0xec,0x04,0x2a,0xf0,0x00,0xb0,0x5d,0x5a,0x80,0x39,0x41,0xf7,0xa3,0x8a,0x5b,0x77,\r\n0x21,0x50,0xc4,0xa7,0x00,0x73,0x82,0x7e,0xf7,0x87,0x70,0x66,0x00,0xe0,0x3d,0x24,0xa4,0xb3,0x00,0xe5,0x4b,0x57,0x21,0x50,0xa4,0x33,0x80,0x77,0x08,0xe9,0xc1,0xba,0x50,0x02,0xc0,0x76,0x69,0x06,0xbe,0x1c,0x46,0x5f,0xaa,0xb8,0x75,0x0e,0x81,0x6c,0x7b,0x3b,0xd9,0xf6,0xa2,0x5c,0x82,0xe2,0x4b,0xb9,0x99,0x73,0xe0,0xc2,0x9a,0x01,\r\n0x60,0xbb,0x3c,0x4e,0x80,0x9f,0x67,0xaa,0xf8,0xe8,0x08,0x81,0xf6,0x9d,0x3b,0xa4,0x4b,0x09,0xc2,0x3d,0xb6,0xcb,0xfc,0xb0,0x3a,0xf3,0xb5,0x39,0x68,0xbe,0x1c,0x8b,0x6a,0xe0,0x65,0x60,0x64,0x98,0xfd,0xaa,0xe2,0x34,0xf8,0xb8,0x93,0xd8,0xbc,0xe4,0xcf,0xd2,0x65,0x98,0xb4,0x16,0x98,0x60,0xbb,0x34,0x86,0xd5,0x61,0xa8,0x01,0x00,\r\n0xe0,0x58,0x9c,0x06,0xfc,0x21,0xec,0x7e,0x95,0x2a,0x00,0xa7,0xe7,0x66,0xca,0xa1,0x09,0xed,0x14,0xa0,0x83,0x9e,0x0a,0x28,0xd5,0xa5,0x7b,0xc2,0x1e,0xfc,0x20,0x10,0x00,0x39,0x57,0x02,0xef,0x09,0xf5,0xad,0x54,0xd4,0xac,0xc5,0x1b,0x13,0xa1,0x13,0x09,0x00,0xdb,0xa5,0x01,0xf8,0x82,0x44,0xdf,0x4a,0x45,0xd0,0x65,0x61,0x9e,0xf7,\r\n0x77,0x26,0x35,0x03,0xd0,0x53,0x01,0xa5,0x3c,0x22,0x53,0xff,0x0e,0x62,0x01,0x90,0xa3,0xa7,0x02,0x2a,0xce,0xc4,0xa6,0xfe,0x1d,0x44,0x03,0x20,0x77,0x2a,0x70,0x99,0x64,0x0d,0x4a,0x09,0x12,0x9b,0xfa,0x77,0x90,0x9e,0x01,0x60,0xbb,0xfc,0x01,0xb8,0x4f,0xba,0x0e,0xa5,0x42,0x76,0xaf,0xe4,0xd4,0xbf,0x83,0x78,0x00,0xe4,0x5c,0x81,\r\n0x9e,0x0a,0xa8,0xf8,0x78,0x0f,0xe1,0xa9,0x7f,0x87,0x48,0x04,0x40,0xee,0x54,0x60,0x26,0x04,0xb7,0xf2,0x89,0x52,0x11,0xd1,0x06,0xcc,0xcc,0x1d,0xf3,0xe2,0x22,0x11,0x00,0x00,0xb6,0xcb,0x5f,0x80,0x2f,0x49,0xd7,0xa1,0x54,0xc0,0xbe,0x98,0x3b,0xd6,0x23,0x21,0x32,0x01,0x00,0x60,0xbb,0xfc,0x0a,0x5d,0x47,0x50,0x15,0xaf,0x59,0xb6,\r\n0x1b,0xad,0xfd,0x33,0x23,0x15,0x00,0x39,0xdf,0xc7,0xdb,0x5d,0x48,0xa9,0x62,0x72,0xbf,0xed,0xf2,0x7d,0xe9,0x22,0xf6,0x14,0xb9,0x00,0xb0,0x5d,0xb2,0xc0,0xc5,0xc0,0x22,0xa1,0x12,0xb6,0x00,0xbf,0x03,0x5e,0x10,0xea,0x5f,0x99,0xf7,0x02,0xde,0xdf,0xe9,0x16,0xa1,0xfe,0xff,0x8a,0x77,0x4c,0x47,0x4e,0xe4,0x02,0x00,0xde,0x5f,0x40,\r\n0xe4,0x4c,0xe0,0x95,0x10,0xba,0xcb,0x02,0xff,0xc4,0xdb,0xce,0xec,0x78,0xa0,0xc6,0x76,0x39,0x1b,0x98,0x06,0x5c,0x0b,0xc1,0x2f,0xcb,0xa4,0x02,0xd3,0x0a,0xfc,0x10,0x38,0x32,0xf7,0x77,0x5a,0x83,0xf7,0x77,0x3c,0x0b,0xef,0xef,0x3c,0x1b,0x42,0x0d,0xaf,0x00,0x67,0x85,0xb5,0xc0,0x47,0xbe,0x42,0x7f,0x1c,0x38,0x1f,0x8e,0x45,0x2d,\r\n0xb0,0x14,0x18,0x66,0xb8,0xe9,0xf5,0xc0,0x13,0xb9,0x3f,0x0b,0x6d,0x97,0x8d,0x3d,0xd4,0x30,0x19,0x98,0x0b,0x4c,0x32,0x5c,0x83,0x0a,0xd6,0x0b,0xc0,0x45,0xb6,0xcb,0x8b,0xdd,0x7d,0x83,0x63,0x31,0x14,0x38,0x09,0x38,0x19,0xf8,0x18,0x30,0xdc,0x70,0x0d,0xeb,0x81,0xa3,0x6d,0x97,0x37,0x0d,0xb7,0x6b,0x4c,0xa4,0x03,0x00,0xc0,0xb1,\r\n0x98,0x06,0x3c,0x05,0xf4,0xf3,0xd1,0x4c,0x2b,0xb0,0x04,0x6f,0xc0,0x2f,0x00,0x5e,0xcc,0x9d,0x6a,0xf4,0xb6,0x86,0x14,0xf0,0x3d,0xe0,0xbb,0x40,0xca,0x47,0x1d,0x2a,0x78,0xad,0x78,0xef,0xf0,0xb3,0xf3,0x59,0x54,0xd3,0xb1,0x48,0x00,0x93,0x81,0x19,0x78,0x81,0x70,0x2c,0xfe,0xfe,0xae,0x9b,0x80,0x13,0x6c,0x97,0x65,0x3e,0xda,0x08,\r\n0x5c,0xe4,0x03,0x00,0xc0,0xb1,0xf8,0x04,0xde,0x39,0x5c,0x3e,0xa7,0x2c,0x6f,0xb0,0x7b,0xc0,0x3f,0x65,0xbb,0x6c,0x33,0x50,0xc7,0x64,0xbc,0xcd,0x4e,0x26,0xfa,0x6d,0x4b,0x05,0xe2,0x45,0xbc,0x77,0x7d,0xdf,0xd7,0x6f,0x1c,0x8b,0x2a,0x60,0x3a,0x5e,0x20,0xcc,0x00,0x0e,0xce,0xe3,0xc7,0x33,0x78,0xd3,0xfe,0xc7,0xfc,0xd6,0x11,0xb4,\r\n0x82,0x08,0x00,0x00,0xc7,0xe2,0x4a,0xe0,0xe6,0x1e,0xbe,0x65,0x07,0xf0,0x34,0xde,0x80,0x7f,0xc2,0x76,0x59,0x15,0x50,0x1d,0x29,0xbc,0x4f,0x2a,0xbe,0x0b,0x94,0x06,0xd1,0x87,0xca,0x5b,0xc7,0x36,0x74,0xd7,0x07,0xb5,0x94,0xb6,0x63,0x31,0x96,0xdd,0xb3,0x83,0x13,0x80,0xfe,0x3d,0x7c,0xfb,0x15,0xb6,0xcb,0xad,0x41,0xd4,0x61,0x5a,\r\n0xc1,0x04,0x00,0x80,0x63,0x71,0x33,0x1f,0xbc,0x85,0xf2,0x25,0x72,0x03,0x1e,0x58,0x1c,0xe6,0x85,0x16,0xc7,0xa2,0x0e,0xef,0xda,0xc0,0xe1,0x61,0xf5,0xa9,0xba,0xb4,0x02,0xef,0x5d,0xff,0xf9,0xb0,0x3a,0x74,0x2c,0xd2,0x78,0x17,0x13,0x3b,0x02,0xa1,0xf3,0x31,0x70,0xb3,0xed,0x72,0x55,0x58,0xb5,0xf8,0x55,0x68,0x01,0x90,0xc4,0xbb,\r\n0x32,0xbf,0x1a,0xef,0x5d,0x7e,0xad,0x70,0x3d,0x69,0xe0,0x9b,0xc0,0xd5,0x40,0xb5,0x64,0x2d,0x31,0xd4,0x00,0xdc,0x04,0xdc,0x18,0xc6,0x06,0x1a,0x3d,0x71,0x2c,0x46,0xe1,0x85,0x41,0x2d,0x70,0xad,0xed,0x92,0x91,0xac,0x27,0x1f,0x05,0x15,0x00,0x51,0xe5,0x58,0x0c,0x00,0xbe,0x0a,0x5c,0x05,0x0c,0x11,0x2e,0xa7,0xd8,0x6d,0x02,0x7e,\r\n0x0a,0xdc,0x6a,0xbb,0x6c,0x95,0x2e,0xa6,0xd0,0x69,0x00,0x18,0xe4,0x58,0x54,0x02,0x97,0xe3,0xcd,0x08,0x86,0x0a,0x97,0x53,0x6c,0xea,0x81,0x1f,0x03,0x3f,0xb7,0x5d,0xb6,0x4b,0x17,0x53,0x2c,0x34,0x00,0x02,0xe0,0x58,0xf4,0xc7,0x7b,0xb0,0xe9,0x1b,0x98,0xff,0x6c,0x39,0x6e,0xd6,0x03,0x37,0x02,0xb7,0xd9,0x2e,0x4d,0xd2,0xc5,0x14,\r\n0x1b,0x0d,0x80,0x00,0x39,0x16,0x15,0x78,0x2b,0x1e,0x7d,0x0b,0xdd,0x0c,0x25,0x5f,0xef,0x01,0xff,0x0d,0xfc,0xd2,0x76,0xd9,0x29,0x5d,0x4c,0xb1,0xd2,0x00,0x08,0x81,0x63,0x51,0x0e,0xfc,0x3b,0xf0,0x6d,0x60,0x3f,0xe1,0x72,0xa2,0x6e,0x0d,0xde,0x6e,0xd2,0xbf,0xb2,0x5d,0x76,0x49,0x17,0x53,0xec,0x34,0x00,0x42,0xe4,0x58,0x7c,0x1c,\r\n0xe4,0x97,0x81,0x8a,0xb8,0x8f,0xdb,0x2e,0x7f,0x94,0x2e,0x22,0x2e,0x22,0xf9,0x30,0x50,0x11,0x5b,0x84,0xae,0x7a,0xd4,0x93,0x36,0x60,0xb1,0x74,0x11,0x71,0xa2,0x01,0x10,0xa2,0xdc,0xed,0xc8,0xcf,0x49,0xd7,0x11,0x61,0xff,0x34,0x71,0xcb,0xb6,0xea,0x3d,0x0d,0x80,0xf0,0x3d,0x29,0x5d,0x40,0x84,0xe9,0x6b,0x13,0x32,0x0d,0x80,0xf0,\r\n0xe9,0x41,0xde,0x3d,0x7d,0x6d,0x42,0xa6,0x01,0x10,0xbe,0x25,0x10,0xcd,0xc5,0x21,0x84,0x35,0x03,0x7f,0x93,0x2e,0x22,0x6e,0x34,0x00,0x42,0x96,0xfb,0x4c,0x7b,0xa9,0x74,0x1d,0x11,0xb4,0x54,0x3f,0xef,0x0f,0x9f,0x06,0x80,0x0c,0x9d,0xea,0xee,0x4d,0x5f,0x13,0x01,0x1a,0x00,0x32,0xf4,0x60,0xdf,0x9b,0xbe,0x26,0x02,0x34,0x00,0x64,\r\n0xfc,0x03,0xf4,0xbe,0xf6,0x4e,0x9a,0xf0,0x5e,0x13,0x15,0x32,0x0d,0x00,0x01,0xb9,0x85,0x4b,0x96,0x48,0xd7,0x11,0x21,0xcf,0x48,0x3f,0xd3,0x1f,0x57,0x1a,0x00,0x72,0x74,0xca,0xbb,0x9b,0xbe,0x16,0x42,0x34,0x00,0xe4,0xe8,0x41,0xbf,0x9b,0xbe,0x16,0x42,0x34,0x00,0xe4,0x3c,0x07,0xba,0xa2,0x0d,0xde,0x6e,0x3d,0xcb,0xa5,0x8b,0x88,\r\n0x2b,0x0d,0x00,0x21,0xb6,0x4b,0x3b,0x72,0xdb,0x9f,0x45,0xc9,0xa2,0xdc,0x6b,0xa1,0x04,0x68,0x00,0xc8,0xd2,0xa9,0xaf,0xbe,0x06,0xa2,0x34,0x00,0x64,0xe9,0xc1,0xaf,0xaf,0x81,0x28,0x0d,0x00,0x59,0x2b,0xf0,0x56,0xb9,0x8d,0xab,0x8d,0x78,0x7b,0x3b,0x28,0x21,0x1a,0x00,0x82,0x72,0xfb,0x13,0x3e,0x2d,0x5d,0x87,0xa0,0xa7,0xf3,0xd9,\r\n0xa3,0x51,0x99,0xa7,0x01,0x20,0x2f,0xce,0x53,0xe0,0x38,0xff,0xee,0x91,0xa0,0x01,0x20,0x2f,0xce,0x83,0x20,0xce,0xbf,0x7b,0x24,0xe8,0xa2,0xa0,0x11,0xe0,0x58,0xac,0x25,0x7e,0xcb,0x86,0xaf,0xb5,0x5d,0x5d,0x21,0x59,0x9a,0xce,0x00,0xa2,0xe1,0x29,0xe9,0x02,0x04,0xc4,0xf1,0x77,0x8e,0x1c,0x0d,0x80,0x68,0x88,0xe3,0x54,0x38,0x8e,\r\n0xbf,0x73,0xe4,0x68,0x00,0x44,0x43,0x1c,0x07,0x83,0x23,0x5d,0x80,0xd2,0x00,0x88,0x04,0xdb,0x65,0x35,0xf0,0x28,0xde,0x7d,0xf1,0xc5,0xae,0x11,0x78,0xd4,0x76,0x79,0x4b,0xba,0x10,0xa5,0x17,0x01,0x23,0xc5,0xb1,0x48,0xe0,0xed,0x31,0x5f,0xb7,0xc7,0x9f,0x42,0xdd,0x69,0x78,0x03,0xf0,0x3c,0xde,0xc3,0x3e,0xcb,0x81,0xe5,0xb6,0xcb,\r\n0x1b,0xb2,0x25,0xa9,0xce,0x34,0x00,0x0a,0x80,0x63,0x31,0x1a,0x2f,0x08,0xa6,0xb0,0x3b,0x14,0x46,0x8b,0x16,0xb5,0xb7,0x77,0xe9,0x34,0xd0,0xf1,0x06,0xfb,0x1a,0xd9,0x92,0xd4,0xbe,0x68,0x00,0x14,0x28,0xc7,0x62,0x28,0xbb,0xc3,0xa0,0x16,0x18,0x94,0xfb,0x53,0xdd,0xe9,0xeb,0x40,0xa0,0xd4,0x67,0x57,0x6d,0x78,0xa7,0x26,0x0d,0x78,\r\n0xd3,0xf7,0x8e,0xaf,0x8d,0xc0,0x6a,0x76,0x0f,0xf6,0x7a,0x9f,0xfd,0x28,0x01,0x1a,0x00,0x45,0xce,0xb1,0xa8,0xe4,0x83,0xa1,0xb0,0x67,0x50,0xc0,0xde,0x03,0xfb,0xfd,0xc1,0x6e,0xbb,0x6c,0x0f,0xbb,0x66,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,0xa5,0x94,0x52,0x4a,0x29,\r\n0xd5,0x1b,0xff,0x0f,0x5c,0x56,0xd9,0x0b,0x64,0x90,0x3b,0x82,0x00,0x00,0x00,0x00,0x49,0x45,0x4e,0x44,0xae,0x42,0x60,0x82,\r\n};\r\n\r\nread_only global String8 rd_icon_file_bytes = {rd_icon_file_bytes__data, sizeof(rd_icon_file_bytes__data)};\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // RADDBG_META_H\r\n"
  },
  {
    "path": "src/raddbg/raddbg.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Embedded Data\r\n\r\n@embed_file rd_icon_font_bytes:         \"../data/icons.ttf\"\r\n\r\n//@embed_file rd_default_main_font_bytes: \"../data/Roboto-Regular.ttf\"\r\n@embed_file rd_default_main_font_bytes: \"../data/segoeui.ttf\"\r\n\r\n//@embed_file rd_default_main_font_bytes: \"../data/seguisb.ttf\"\r\n//@embed_file rd_default_code_font_bytes: \"../data/liberation-.ttf\"\r\n//@embed_file rd_default_code_font_bytes: \"../data/Inconsolata-Regular.ttf\"\r\n@embed_file rd_default_code_font_bytes: \"../data/JetBrainsMono-Regular.ttf\"\r\n\r\n@embed_file rd_icon_file_bytes:         \"../data/logo.ico\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Fixed Tab Tables\r\n\r\n@table(name   display_name    name_lower     is_query      icon     description)\r\nRD_WatchTabFastPathTable:\r\n{\r\n  {Watch           \"Watch\"             watches           0                 Binoculars            \"An editable table interface for entering one or many expressions to evaluate, and visualizing and exploring their values.\"}\r\n  {Locals          \"Locals\"            locals            1                 Binoculars            \"Like the Watch tab, but not editable, and displays the set of local variables found at the selected thread's current location.\"}\r\n  {Registers       \"Registers\"         registers         1                 Binoculars            \"Like the Watch tab, but not editable, and displays the set of registers for the selected thread.\"}\r\n  {Globals         \"Globals\"           globals           1                 Binoculars            \"Like the Watch tab, but not editable, and displays all global variables from all loaded modules.\"}\r\n  {ThreadLocals    \"Thread Locals\"     thread_locals     1                 Binoculars            \"Like the Watch tab, but not editable, and displays all thread-local variables from all loaded modules.\"}\r\n  {Types           \"Types\"             types             1                 Binoculars            \"Like the Watch tab, but not editable, and displays all types from all loaded modules.\"}\r\n  {Procedures      \"Procedures\"        procedures        1                 Binoculars            \"Like the Watch tab, but not editable, and displays all procedures from all loaded modules.\"}\r\n  {CallStack       \"Call Stack\"        call_stack        1                 Thread                \"Displays the currently selected thread's call stack, and allows selecting a frame in the call stack, which will unwind the selected thread's registers and evaluate expressions within that frame's context.\"}\r\n  {Targets         \"Targets\"           targets           1                 Target                \"Displays, and allows editing of, the list of all targets.\"}\r\n  {Breakpoints     \"Breakpoints\"       breakpoints       1                 CircleFilled          \"Displays, and allows editing of, the list of all breakpoints.\"}\r\n  {WatchPins       \"Watch Pins\"        watch_pins        1                 Pin                   \"Displays, and allows editing of, the list of all watch pins.\"}\r\n  {DebugInfos      \"Debug Info\"        debug_infos       1                 Module                \"Displays, and allows editing of, the list of all debug info files that the debugger has loaded.\"}\r\n  {Threads         \"Threads\"           threads           1                 Threads               \"Displays the list of all threads in all processes to which the debugger is attached.\"}\r\n  {Processes       \"Processes\"         processes         1                 Scheduler             \"Displays the list of all processes to which the debugger is attached.\"}\r\n  {Machines        \"Machines\"          machines          1                 Machine               \"Displays the list of all machines to which the debugger is connected.\"}\r\n  {Modules         \"Modules\"           modules           1                 Module                \"Displays the list of all modules in all processes to which the debugger is attached.\"}\r\n  {FilePathMaps    \"File Path Map\"     file_path_maps    1                 FileOutline           \"Displays, and allows editing of, the list of all file path maps. This allows remapping source code paths referenced by debug information to other paths on your local machine.\"}\r\n  {TypeViews       \"Type Views\"        type_views        1                 Binoculars            \"Displays, and allows editing of, the list of all type views, which allow automatically adjusting the visualizations for evaluations of a certain type.\"}\r\n}\r\n\r\n@table(name   display_name    name_lower     view     query     icon)\r\nRD_ViewTabFastPathTable:\r\n{\r\n  {Output          \"Output\"            output      text            \"query:output\"    List                  }\r\n  {Text            \"Text\"              text        text            \"\"                FileOutline           }\r\n  {Disasm          \"Disassembly\"       disasm      disasm          \"\"                Glasses               }\r\n  {Memory          \"Memory\"            memory      memory          \"\"                Grid                  }\r\n  {Bitmap          \"Bitmap\"            bitmap      bitmap          \"\"                Bitmap                }\r\n  {Color           \"Color\"             color       color           \"\"                Palette               }\r\n  {Geo3D           \"Geometry (3D)\"     geo3d       geo3d           \"\"                Cube                  }\r\n}\r\n\r\n@table(name   display_name    name_lower    icon)\r\nRD_FixedTabTable:\r\n{\r\n  {GettingStarted  \"Getting Started\"   getting_started   \"getting_started\"   QuestionMark  }\r\n}\r\n\r\n@gen\r\n{\r\n  `#define RD_FixedTabXList \\\\`;\r\n  @expand(RD_WatchTabFastPathTable a) `$(a.is_query -> 'X(' .. a.name_lower .. ')') $(a.is_query == 0 -> 'Y(' .. a.name_lower .. ', watch, \"\"' .. ')')\\\\`;\r\n  @expand(RD_ViewTabFastPathTable a) `Y($(a.name_lower), $(a.view), \"$(a.query)\")\\\\`;\r\n  @expand(RD_FixedTabTable a) `Z($(a.name_lower))\\\\`;\r\n  ``;\r\n}\r\n\r\n@data(String8) rd_tab_fast_path_view_name_table:\r\n{\r\n  @expand(RD_WatchTabFastPathTable a) `str8_lit_comp(\"watch\")`,\r\n  @expand(RD_ViewTabFastPathTable a) `str8_lit_comp(\"$(a.view)\")`,\r\n}\r\n\r\n@data(String8) rd_tab_fast_path_query_name_table:\r\n{\r\n  @expand(RD_WatchTabFastPathTable a) `str8_lit_comp(\"$(a.is_query -> 'query:' .. a.name_lower)\")`,\r\n  @expand(RD_ViewTabFastPathTable a) `str8_lit_comp(\"$(a.query)\")`,\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Vocabulary Map\r\n\r\n@table(code_name       code_name_plural            display_name                 display_name_plural  icon_kind)\r\nRD_VocabTable:\r\n// NOTE(rjf): the _ character is used as a fastpath for default rules. when\r\n// pluralizing, you just append an `s`, and so on.\r\n{\r\n  {type_view            _                           \"Type View\"                 _                     Binoculars                                     }\r\n  {file_path_map        _                           \"File Path Map\"             _                     FileOutline                                    }\r\n  {watch_pin            _                           \"Watch Pin\"                 _                     Pin                                            }\r\n  {debug_info           _                           \"Debug Info\"                \"Debug Info\"          Module                                         }\r\n  {watch                watches                     \"Watch\"                     \"Watches\"             Binoculars                                     }\r\n  {view                 _                           \"View\"                      _                     Binoculars                                     }\r\n  {breakpoint           _                           \"Breakpoint\"                _                     CircleFilled                                   }\r\n  {condition            _                           \"Condition\"                 _                     Null                                           }\r\n  {location             _                           \"Location\"                  _                     Null                                           }\r\n  {source_location      _                           \"Source Location\"           _                     Null                                           }\r\n  {address_location     _                           \"Address Location\"          _                     Null                                           }\r\n  {target               _                           \"Target\"                    _                     Target                                         }\r\n  {color                _                           \"Color\"                     _                     Palette                                        }\r\n  {theme_color          _                           \"Theme Color\"               _                     Palette                                        }\r\n  {executable           _                           \"Executable\"                _                     Module                                         }\r\n  {arguments            arguments                   \"Arguments\"                 \"Arguments\"           Null                                           }\r\n  {exe                  exes                        \"Executable\"                _                     Module                                         }\r\n  {dbg                  dbgs                        \"Debug Info Path\"           _                     Module                                         }\r\n  {vaddr_range          _                           \"Virtual Address Range\"     _                     Null                                           }\r\n  {min                  _                           \"Minimum\"                   _                     Null                                           }\r\n  {max                  _                           \"Maximum\"                   _                     Null                                           }\r\n  {working_directory    working_directories         \"Working Directory\"         \"Working Directories\" FolderClosedFilled                             }\r\n  {entry_point          _                           \"Entry Point\"               _                     Null                                           }\r\n  {stdout_path          _                           \"Standard Output Path\"      _                     Null                                           }\r\n  {stderr_path          _                           \"Standard Error Path\"       _                     Null                                           }\r\n  {stdin_path           _                           \"Standard Input Path\"       _                     Null                                           }\r\n  {window               _                           \"Window\"                    _                     Window                                         }\r\n  {panel                _                           \"Panel\"                     _                     Null                                           }\r\n  {tab                  _                           \"Tab\"                       _                     Null                                           }\r\n  {recent_project       _                           \"Recent Project\"            _                     Briefcase                                      }\r\n  {recent_file          _                           \"Recent File\"               _                     FileOutline                                    }\r\n  {src                  _                           \"Source\"                    _                     Null                                           }\r\n  {dst                  _                           \"Destination\"               _                     Null                                           }\r\n  {source               _                           \"Source\"                    _                     Null                                           }\r\n  {dest                 _                           \"Destination\"               _                     Null                                           }\r\n  {conversion_task      _                           \"Conversion Task\"           _                     Null                                           }\r\n  {conversion_fail      _                           \"Conversion Fail\"           _                     Null                                           }\r\n  {lang                 _                           \"Language\"                  _                     Null                                           }\r\n  {arch                 _                           \"Architecture\"              _                     Null                                           }\r\n  {expr                 _                           \"Expression\"                _                     Null                                           }\r\n  {expression           _                           \"Expression\"                _                     Null                                           }\r\n  {size                 _                           \"Size\"                      _                     Null                                           }\r\n  {count                _                           \"Count\"                     _                     Null                                           }\r\n  {bool                 _                           \"Boolean\"                   _                     Null                                           }\r\n  {w                    _                           \"Width\"                     _                     Null                                           }\r\n  {h                    _                           \"Height\"                    _                     Null                                           }\r\n  {fmt                  _                           \"Format\"                    _                     Null                                           }\r\n  {addresses            addresses                   \"Addresses\"                 \"Addresses\"           Null                                           }\r\n  {code_bytes           code_bytes                  \"Code Bytes\"                \"Code Bytes\"          Null                                           }\r\n  {vtx                  _                           \"Vertex Buffer\"             _                     Null                                           }\r\n  {vtx_size             _                           \"Vertex Buffer Size\"        _                     Null                                           }\r\n  {label                _                           \"Label\"                     _                     Null                                           }\r\n  {thread               _                           \"Thread\"                    _                     Thread                                         }\r\n  {threads              \"\"                          \"Threads\"                   \"\"                    Threads                                        }\r\n  {process              processes                   \"Process\"                   \"Processes\"           Scheduler                                      }\r\n  {processes            \"\"                          \"Processes\"                 \"\"                    Scheduler                                      }\r\n  {machine              _                           \"Machine\"                   _                     Machine                                        }\r\n  {module               _                           \"Module\"                    _                     Module                                         }\r\n  {getting_started      \"\"                          \"Getting Started\"           \"\"                    QuestionMark                                   }\r\n  {disasm               \"\"                          \"Disassembly\"               \"\"                    Glasses                                        }\r\n  {text                 \"\"                          \"Text\"                      \"\"                    FileOutline                                    }\r\n  {type                 _                           \"Type\"                      _                     Null                                           }\r\n  {procedure            _                           \"Procedure\"                 _                     Null                                           }\r\n  {global_variable      _                           \"Global Variable\"           _                     Null                                           }\r\n  {global               _                           \"Global\"                    _                     Null                                           }\r\n  {thread_variable      _                           \"Thread Variable\"           _                     Null                                           }\r\n  {thread_local         _                           \"Thread Local\"              _                     Null                                           }\r\n  {call_stack           _                           \"Call Stack\"                _                     Thread                                         }\r\n  {output               _                           \"Output\"                    _                     List                                           }\r\n  {scheduler            _                           \"Scheduler\"                 _                     Scheduler                                      }\r\n  {register             _                           \"Register\"                  _                     Null                                           }\r\n  {local                _                           \"Local\"                     _                     Null                                           }\r\n  {memory               memories                    \"Memory\"                    \"Memories\"            Grid                                           }\r\n  {hit_count            hit_counts                  \"Hit Count\"                 \"Hit Counts\"          Null                                           }\r\n  {enabled              \"\"                          \"Enabled\"                   \"Enabled\"             Null                                           }\r\n  {disabled             \"\"                          \"Disabled\"                  \"Disabled\"            Null                                           }\r\n  {debug_subprocesses   \"\"                          \"Debug Subprocesses\"        \"\"                    Null                                           }\r\n  {environment          _                           \"Environment\"               _                     Null                                           }\r\n  {frozen               \"\"                          \"Frozen\"                    \"\"                    Null                                           }\r\n  {id                   _                           \"ID\"                        _                     Null                                           }\r\n  {last_modified_time   _                           \"Last Modified Time\"        _                     Null                                           }\r\n  {creation_time        _                           \"Creation Time\"             _                     Null                                           }\r\n  {data                 _                           \"Data\"                      _                     Null                                           }\r\n  {unattached_processes \"\"                          \"Unattached Processes\"      \"\"                    Scheduler                                      }\r\n  {user                 _                           \"User\"                      _                     Person                                         }\r\n  {project              _                           \"Project\"                   _                     Briefcase                                      }\r\n  {recent_project       _                           \"Recent Project\"            _                     Briefcase                                      }\r\n  {recent_file          _                           \"Recent File\"               _                     FileOutline                                    }\r\n  {show_addresses       \"\"                          \"Show Addresses\"            \"\"                    Null                                           }\r\n  {show_code_bytes      \"\"                          \"Show Code Bytes\"           \"\"                    Null                                           }\r\n  {show_source_lines    \"\"                          \"Show Source Lines\"         \"\"                    Null                                           }\r\n  {show_symbol_names    \"\"                          \"Show Symbol Names\"         \"\"                    Null                                           }\r\n  {show_line_numbers    \"\"                          \"Show Line Numbers\"         \"\"                    Null                                           }\r\n  {syntax               syntaxes                    \"Syntax\"                    \"Syntaxes\"            Null                                           }\r\n  {num_columns          \"\"                          \"Number of Columns\"         \"\"                    Null                                           }\r\n  {bytes_per_cell       \"\"                          \"Bytes Per Cell\"            \"\"                    Null                                           }\r\n  {bitmap               _                           \"Bitmap\"                    _                     Bitmap                                         }\r\n  {geo3d                \"\"                          \"Geometry (3D)\"             \"\"                    Cube                                           }\r\n  {address_range_size   _                           \"Address Range Size\"        _                     Null                                           }\r\n  {break_on_read        \"\"                          \"Break On Read\"             \"\"                    Null                                           }\r\n  {break_on_write       \"\"                          \"Break On Write\"            \"\"                    Null                                           }\r\n  {break_on_execute     \"\"                          \"Break On Execution\"        \"\"                    Null                                           }\r\n  {yaw                  \"\"                          \"Yaw\"                       \"\"                    Null                                           }\r\n  {pitch                \"\"                          \"Pitch\"                     \"\"                    Null                                           }\r\n  {zoom                 \"\"                          \"Zoom\"                      \"\"                    Null                                           }\r\n  {font_size            \"\"                          \"Font Size\"                 \"\"                    Null                                           }\r\n  {row_height           \"\"                          \"Row Height\"                \"\"                    Null                                           }\r\n  {tab_height           \"\"                          \"Tab Height\"                \"\"                    Null                                           }\r\n  {rgba                 \"\"                          \"RGBA\"                      \"\"                    Palette                                        }\r\n  {path                 \"\"                          \"Path\"                      \"\"                    FileOutline                                    }\r\n  {guid                 \"\"                          \"GUID\"                      \"\"                    Null                                           }\r\n}\r\n\r\n@struct RD_VocabInfo:\r\n{\r\n  `String8 code_name`;\r\n  `String8 code_name_plural`;\r\n  `String8 display_name`;\r\n  `String8 display_name_plural`;\r\n  `RD_IconKind icon_kind`;\r\n}\r\n\r\n@data(RD_VocabInfo) rd_vocab_info_table:\r\n{\r\n  @expand(RD_VocabTable a)              `{str8_lit_comp(\"$(a.code_name)\"), str8_lit_comp(\"$(a.code_name_plural == _ -> a.code_name .. 's')$(a.code_name_plural != _ -> a.code_name_plural)\"), str8_lit_comp(\"$(a.display_name)\"), str8_lit_comp(\"$(a.display_name_plural == _ -> a.display_name .. 's')$(a.display_name_plural != _ -> a.display_name_plural)\"), RD_IconKind_$(a.icon_kind)}`;\r\n  @expand(D_CmdTable a)                 `{str8_lit_comp(\"$(a.string)\"), str8_lit_comp(\"\"), str8_lit_comp(\"$(a.display_name)\"), str8_lit_comp(\"\"), RD_IconKind_$(a.canonical_icon)}`;\r\n  @expand(RD_CmdTable a)                `{str8_lit_comp(\"$(a.string)\"), str8_lit_comp(\"\"), str8_lit_comp(\"$(a.display_name)\"), str8_lit_comp(\"\"), RD_IconKind_$(a.canonical_icon)}`;\r\n  @expand(RD_WatchTabFastPathTable a)   `{str8_lit_comp(\"$(a.name_lower)\"), str8_lit_comp(\"\"), str8_lit_comp(\"$(a.display_name)\"), str8_lit_comp(\"\"), RD_IconKind_$(a.icon)}`;\r\n  @expand(RD_ViewTabFastPathTable a)    `{str8_lit_comp(\"$(a.name_lower)\"), str8_lit_comp(\"\"), str8_lit_comp(\"$(a.display_name)\"), str8_lit_comp(\"\"), RD_IconKind_$(a.icon)}`;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Schemas\r\n\r\n@table(name schema) RD_SchemaTable:\r\n{\r\n  //- rjf: users / projects\r\n  {\r\n    user\r\n      ```\r\n      @expand_commands(edit_user_theme) x:\r\n    {\r\n      //- rjf: animations\r\n      @display_name('Animations') @description(\"Enables animations.\")\r\n        @default(1) 'animations': bool,\r\n      @display_name('Scrolling Animations') @description(\"Enables scrolling animations.\")\r\n        @expand_if(\"$.animations\") @default(1) 'scrolling_animations': bool,\r\n      @display_name('Tooltip Animations') @description(\"Enables tooltip animations.\")\r\n        @expand_if(\"$.animations\") @default(1) 'tooltip_animations': bool,\r\n      @display_name('Menu Animations') @description(\"Enables menu animations.\")\r\n        @expand_if(\"$.animations\") @default(1) 'menu_animations': bool,\r\n      \r\n      //- rjf: fonts\r\n      @display_name('UI Font') @description(\"The name of, or path to, the font used when displaying non-code UI elements.\")\r\n        @default('') 'main_font': string,\r\n      @display_name('Code Font') @description(\"The name of, or path to, the font used when displaying code.\")\r\n        @default('') 'code_font': string,\r\n      \r\n      //- rjf: theme\r\n      @default(\"Default (Dark)\") @display_name('User Theme')\r\n        @description(\"The user's theme, which describes all colors used throughout the UI.\")\r\n        'theme': string,\r\n      @no_expand @display_name('User Theme')\r\n        'theme_colors': query,\r\n      \r\n      //- rjf: autocompletion\r\n      @display_name('Autocompletion Lister') @description(\"Enables the autocompletion lister while typing expressions.\") @default(1)\r\n        'autocompletion_lister': bool,\r\n      @display_name('View Call Argument Helper') @description(\"Enables the view call argument helper, which shows view arguments and documentation, while typing expressions.\") @default(1)\r\n        'view_call_argument_helper': bool,\r\n      \r\n      //- rjf: scope decorations\r\n      @default(1) @display_name('Cursor Scope Lines') @description(\"Controls whether or not scopes containing the cursor in text views are drawn.\")\r\n        'cursor_scope_lines': bool,\r\n      \r\n      //- rjf: cursor decorations\r\n      @default(1) @display_name('Cursor Trail') @description(\"Controls whether or not a movement trail of the cursor is drawn.\")\r\n        'cursor_trail': bool,\r\n      \r\n      //- rjf: thread & breakpoint decorations\r\n      @default(1) @display_name('Thread Lines') @description(\"Controls whether or not a long horizontal line is drawn before the next line or instruction that the selected thread will execute in source and disassembly views.\")\r\n        'thread_lines': bool,\r\n      @default(1) @display_name('Thread Glow') @description(\"Controls whether or not a glowing effect is drawn on the selected thread in source and disassembly views.\")\r\n        'thread_glow': bool,\r\n      @default(1) @display_name('Breakpoint Lines') @description(\"Controls whether or not a long horizontal line is drawn before the line or instruction at which a breakpoint is placed, in source and disassembly views.\")\r\n        'breakpoint_lines': bool,\r\n      @default(1) @display_name('Breakpoint Glow') @description(\"Controls whether or not a glowing effect is drawn on breakpoints in source and disassembly views.\")\r\n        'breakpoint_glow': bool,\r\n      \r\n      //- rjf: occluding background settings\r\n      @default(0) @display_name('Opaque Backgrounds') @description(\"Controls whether or not all floating background colors are forced to be fully opaque.\")\r\n        'opaque_backgrounds': bool,\r\n      @default(1) @display_name('Background Blur') @description(\"Controls whether or not occluded regions behind floating elements are blurred.\")\r\n        'background_blur': bool,\r\n      \r\n      //- rjf: appearance settings\r\n      @default(1) @display_name('Drop Shadows') @description(\"Controls whether or not drop shadows are drawn.\")\r\n        'drop_shadows': bool,\r\n      @default(1.f) @display_name('Rounded Corner Amount') @description(\"Controls the degree to which UI corners are rounded.\")\r\n        'rounded_corner_amount': @range[0, 1] f32,\r\n      \r\n      //- rjf: code formatting settings\r\n      @default(2) @display_name('User Tab Width') 'tab_width': @range[1, 32] u64,\r\n      \r\n      //- rjf: windows style menu bar\r\n      @default(1) @display_name('Focus Menu Bar With Alt') @description(\"Mimics standard Windows behavior of focusing the menu bar using the Alt key.\")\r\n        'focus_menu_bar_with_alt': bool,\r\n      \r\n      //- rjf: native filesystem dialogues\r\n      @default(0) @display_name('Use Native File System Dialog') @description(\"Uses the operating system's file system dialog box, rather than the debugger's built-in UI.\")\r\n        'use_native_file_system_dialog': bool,\r\n    }\r\n    ```\r\n  }\r\n  \r\n  // TODO(rjf): the control codes could be fed from the CTRL_ExceptionCodeKindTable, but\r\n  // we do not support that in this generator - we'd need a way to form a table-generated\r\n  // string and put it into a table cell...\r\n  {\r\n    project\r\n      ```\r\n      @expand_commands(edit_project_theme) x:\r\n    {\r\n      @default(2) @display_name('Project Tab Width') 'tab_width': @range[1, 32] u64,\r\n      \r\n      //- rjf: visualizers\r\n      @display_name('Use Default C++ STL Type Visualizers') @description(\"Enables the built-in type views for C++ STL types.\")\r\n        @default(1) use_default_stl_type_views: bool,\r\n      @display_name('Use Default Unreal Engine Type Visualizers') @description(\"Enables the built-in type views for Unreal Engine types.\")\r\n        @default(1) use_default_ue_type_views: bool,\r\n      \r\n      //- rjf: theme\r\n      @default(\"None\") @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\r\n        'theme': string,\r\n      @no_expand @display_name('Project Theme') @description(\"The project's theme, which describes all colors used throughout the UI, and can override the user's theme.\")\r\n        'theme_colors': query,\r\n      \r\n      //- rjf: exception settings\r\n      @default(1) @display_name(\"Break On Win32 Control-C Exceptions\") @description(\"Code: 0x40010005\")\r\n        win32_ctrl_c: bool;\r\n      @default(1) @display_name(\"Break On Win32 Control-Break Exceptions\") @description(\"Code: 0x40010008\")\r\n        win32_ctrl_break: bool;\r\n      @default(0) @display_name(\"Break On Win32 WinRT Originate Error Exceptions\") @description(\"Code: 0x40080201\")\r\n        win32_win_rt_originate_error: bool;\r\n      @default(0) @display_name(\"Break On Win32 WinRT Transform Error Exceptions\") @description(\"Code: 0x40080202\")\r\n        win32_win_rt_transform_error: bool;\r\n      @default(0) @display_name(\"Break On Win32 RPC Call Cancelled Exceptions\") @description(\"Code: 0x0000071a\")\r\n        win32_rpc_call_cancelled: bool;\r\n      @default(0) @display_name(\"Break On Win32 Data Type Misalignment Exceptions\") @description(\"Code: 0x80000002\")\r\n        win32_datatype_misalignment: bool;\r\n      @default(1) @display_name(\"Break On Win32 Access Violation Exceptions\") @description(\"Code: 0xc0000005\")\r\n        win32_access_violation: bool;\r\n      @default(0) @display_name(\"Break On Win32 In Page Error Exceptions\") @description(\"Code: 0xc0000006\")\r\n        win32_in_page_error: bool;\r\n      @default(1) @display_name(\"Break On Win32 Invalid Handle Specified Exceptions\") @description(\"Code: 0xc0000008\")\r\n        win32_invalid_handle: bool;\r\n      @default(0) @display_name(\"Break On Win32 Not Enough Quota Exceptions\") @description(\"Code: 0xc0000017\")\r\n        win32_not_enough_quota: bool;\r\n      @default(0) @display_name(\"Break On Win32 Illegal Instruction Exceptions\") @description(\"Code: 0xc000001d\")\r\n        win32_illegal_instruction: bool;\r\n      @default(0) @display_name(\"Break On Win32 Cannot Continue From Exception Exceptions\") @description(\"Code: 0xc0000025\")\r\n        win32_cannot_continue_exception: bool;\r\n      @default(0) @display_name(\"Break On Win32 Invalid Exception Disposition Returned By Handler Exceptions\") @description(\"Code: 0xc0000026\")\r\n        win32_invalid_exception_disposition: bool;\r\n      @default(0) @display_name(\"Break On Win32 Array Bounds Exceeded Exceptions\") @description(\"Code: 0xc000008c\")\r\n        win32_array_bounds_exceeded: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Denormal Operand Exceptions\") @description(\"Code: 0xc000008d\")\r\n        win32_floating_point_denormal_operand: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Division By Zero Exceptions\") @description(\"Code: 0xc000008e\")\r\n        win32_floating_point_division_by_zero: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Inexact Result Exceptions\") @description(\"Code: 0xc000008f\")\r\n        win32_floating_point_inexact_result: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Invalid Operation Exceptions\") @description(\"Code: 0xc0000090\")\r\n        win32_floating_point_invalid_operation: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Overflow Exceptions\") @description(\"Code: 0xc0000091\")\r\n        win32_floating_point_overflow: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Stack Check Exceptions\") @description(\"Code: 0xc0000092\")\r\n        win32_floating_point_stack_check: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating-Point Underflow Exceptions\") @description(\"Code: 0xc0000093\")\r\n        win32_floating_point_underflow: bool;\r\n      @default(0) @display_name(\"Break On Win32 Integer Division By Zero Exceptions\") @description(\"Code: 0xc0000094\")\r\n        win32_integer_division_by_zero: bool;\r\n      @default(0) @display_name(\"Break On Win32 Integer Overflow Exceptions\") @description(\"Code: 0xc0000095\")\r\n        win32_integer_overflow: bool;\r\n      @default(0) @display_name(\"Break On Win32 Privileged Instruction Exceptions\") @description(\"Code: 0xc0000096\")\r\n        win32_privileged_instruction: bool;\r\n      @default(0) @display_name(\"Break On Win32 Stack Overflow Exceptions\") @description(\"Code: 0xc00000fd\")\r\n        win32_stack_overflow: bool;\r\n      @default(0) @display_name(\"Break On Win32 Unable To Locate DLL Exceptions\") @description(\"Code: 0xc0000135\")\r\n        win32_unable_to_locate_dll: bool;\r\n      @default(0) @display_name(\"Break On Win32 Ordinal Not Found Exceptions\") @description(\"Code: 0xc0000138\")\r\n        win32_ordinal_not_found: bool;\r\n      @default(0) @display_name(\"Break On Win32 Entry Point Not Found Exceptions\") @description(\"Code: 0xc0000139\")\r\n        win32_entry_point_not_found: bool;\r\n      @default(0) @display_name(\"Break On Win32 DLL Initialization Failed Exceptions\") @description(\"Code: 0xc0000142\")\r\n        win32_dll_initialization_failed: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Faults Exceptions\") @description(\"Code: 0xc00002b4\")\r\n        win32_floating_point_sse_multiple_faults: bool;\r\n      @default(0) @display_name(\"Break On Win32 Floating Point SSE Multiple Traps Exceptions\") @description(\"Code: 0xc00002b5\")\r\n        win32_floating_point_sse_multiple_traps: bool;\r\n      @default(1) @display_name(\"Break On Win32 Assertion Failed Exceptions\") @description(\"Code: 0xc0000420\")\r\n        win32_assertion_failed: bool;\r\n      @default(0) @display_name(\"Break On Win32 Module Not Found Exceptions\") @description(\"Code: 0xc06d007e\")\r\n        win32_module_not_found: bool;\r\n      @default(0) @display_name(\"Break On Win32 Procedure Not Found Exceptions\") @description(\"Code: 0xc06d007f\")\r\n        win32_procedure_not_found: bool;\r\n      @default(1) @display_name(\"Break On Win32 Sanitizer Error Detected Exceptions\") @description(\"Code: 0xe073616e\")\r\n        win32_sanitizer_error_detected: bool;\r\n      @default(0) @display_name(\"Break On Win32 Sanitizer Raw Access Violation Exceptions\") @description(\"Code: 0xe0736171\")\r\n        win32_sanitizer_raw_access_violation: bool;\r\n      @default(1) @display_name(\"Break On Win32 DirectX Debug Layer Exceptions\") @description(\"Code: 0x0000087a\")\r\n        win32_directx_debug_layer: bool;\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: theme colors\r\n  {\r\n    theme_color,\r\n    ```\r\n      @collection_commands(add_theme_color, fork_theme, save_theme, save_and_set_theme)\r\n      @row_commands(duplicate_cfg, remove_cfg)\r\n      x:\r\n    {\r\n      @display_name('Tags') tags: string,\r\n      @display_name('Value') value: @color @hex u32,\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: windows\r\n  {\r\n    window,\r\n    ```\r\n      x:\r\n    {\r\n      //- rjf: text rasterization settings\r\n      @default(1) @display_name('Smooth UI Text') @description(\"Controls whether or not UI text is fully anti-aliased, for a smoother appearance.\")\r\n        'smooth_ui_text': bool,\r\n      @default(1) @display_name('Hint UI Text') @description(\"Controls whether or not UI text is hinted, for better text readability at small sizes.\")\r\n        'hint_ui_text': bool,\r\n      @default(0) @display_name('Smooth Code Text') @description(\"Controls whether or not code text is fully anti-aliased, for a smoother appearance.\")\r\n        'smooth_code_text': bool,\r\n      @default(1) @display_name('Hint Code Text') @description(\"Controls whether or not code text is hinted, for better text readability at small sizes.\")\r\n        'hint_code_text': bool,\r\n      @default(11) @display_name('Window Font Size') @description(\"Controls the window's default font size. Does not apply to tabs with their own font size set.\")\r\n        'font_size': @range[6, 72] u64,\r\n      \r\n      //- rjf: size settings\r\n      @default(3.f) @display_name('Window Row Height') @description(\"Controls the window's default row height, in multiples of the font size. Does not apply to tabs with their own row height set.\")\r\n        'row_height': @range[1.75f, 5.f] f32,\r\n      @default(3.f) @description(\"Controls the height of tabs, in multiples of the font size.\")\r\n        'tab_height': @range[1.75f, 5.f] f32,\r\n      \r\n      //- rjf: theme settings\r\n      @default(1) @display_name('Use Project Theme') @description(\"Prefer using the project theme for this window, if any. If off, only the user's theme settings will be used.\")\r\n        'use_project_theme': bool,\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: tabs\r\n  {\r\n    tab,\r\n    ```\r\n      @row_commands(@file copy_tab_full_path, @file show_file_in_explorer, duplicate_tab, close_tab)\r\n      x:\r\n    {\r\n      @override @display_name('Tab Font Size') @description(\"Controls the tab's font size.\") @no_callee_helper\r\n        'font_size': @range[6, 72] u64,\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: views\r\n  {\r\n    watch,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n      @override @display_name('Tab Row Height') @description(\"Controls the tab's row height, in multiples of the font size.\")\r\n        'row_height': @range[1.75f, 5.f] f32,\r\n      'label': code_string,\r\n      @description(\"The root expression which is evaluated to produce the watch window.\")\r\n        'expression': expr_string,\r\n      @no_expand 'watches': query,\r\n    }\r\n    ```\r\n  }\r\n  {\r\n    list,\r\n    ```\r\n      x:\r\n    {\r\n      @description(\"An expression describing the first node in the list.\")\r\n        'expression': expr_string,\r\n      @order(0) @description(\"The name of the member which encodes the link to the next node.\")\r\n        'member_name': code_string,\r\n    }\r\n    ```\r\n  }\r\n  {\r\n    text,\r\n    ```\r\n      @inherit(tab) @expand_commands(@output clear_output) x:\r\n    {\r\n      @description(\"An expression to describe data which should be viewed as text or code.\")\r\n        'expression': expr_string,\r\n      @description(\"The language that the text should be interpreted as being within. Used for syntax highlighting and other parsing features.\")\r\n        'lang': code_string,\r\n      @default(1) @description(\"Controls whether or not line numbers are shown.\")\r\n        'show_line_numbers':bool,\r\n      @no_callee_helper @default(1) @display_name('Line Wrapping') @description(\"Splits textual lines into multiple visual lines, so that all text is within the visible area.\")\r\n        'line_wrapping': bool,\r\n      @no_callee_helper @default(0) @display_name('Scroll To Bottom On Change') @description(\"Scrolls to the bottom if the text is changed.\")\r\n        'scroll_to_bottom_on_change': bool,\r\n      @no_callee_helper @no_revert @default(0) @display_name('Transient') @description(\"Controls whether or not this tab will be automatically replaced by the debugger when it snaps to new source code locations.\")\r\n        'auto': bool,\r\n    }\r\n    ```\r\n  }\r\n  {\r\n    disasm,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n      @description(\"An expression to describe the base address or offset of the disassembly.\")\r\n        'expression': expr_string,\r\n      'arch':        code_string,\r\n      'syntax':      code_string,\r\n      'size':        expr_string,\r\n      @no_callee_helper @default(1) @description(\"Controls whether or not addresses are shown in the disassembly text.\")\r\n        'show_addresses':    bool,\r\n      @no_callee_helper @default(0) @description(\"Controls whether or not code bytes are shown in the disassembly text.\")\r\n        'show_code_bytes':   bool,\r\n      @no_callee_helper @default(1) @description(\"Controls whether or not source lines, corresponding to disassembly instruction ranges, are shown in the disassembly text.\")\r\n        'show_source_lines': bool,\r\n      @no_callee_helper @default(1) @description(\"Controls whether or not disassembly text is decorated with symbol names.\")\r\n        'show_symbol_names': bool,\r\n      @no_callee_helper @default(1) @description(\"Controls whether or not line numbers are shown.\")\r\n        'show_line_numbers': bool,\r\n      \r\n    }\r\n    ```\r\n  }\r\n  {\r\n    memory,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n      @description(\"An expression which refers to the base address of data which should be viewed as memory.\")\r\n        'expression': expr_string,\r\n      @display_name(\"Address Range Size\") @description(\"The number of bytes of the viewed memory range.\")\r\n        'size': expr_string,\r\n      @display_name(\"Cursor Address\") @description(\"The address of the cursor.\")\r\n        'cursor': expr_string,\r\n      @display_name(\"Cursor Size\") @description(\"The size, in bytes, of the cursor.\")\r\n        'cursor_size': @range[1, 16] u64,\r\n      @default(16) @description(\"The number of columns to build before building new rows.\")\r\n        'num_columns': @range[1, 64] u64,\r\n      @default(1) @display_name(\"Track Mark To Cursor\") @description(\"Ensures that the mark always follows the cursor, if the cursor value is updated.\")\r\n        'track_mark_to_cursor': bool,\r\n    }\r\n    ```\r\n  }\r\n  {\r\n    bitmap,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n      @description(\"An expression which refers to the base address of data which should be viewed as a bitmap.\")\r\n        'expression': expr_string,\r\n      @description(\"An expression describing the width of the bitmap, in pixels.\") @order(0) 'w': u64,\r\n      @description(\"An expression describing the height of the bitmap, in pixels.\") @order(1) 'h': u64,\r\n      @display_name(\"Bitmap Format\") @description(\"The pixel format that the bitmap data should be interpreted as being within.\")\r\n        'fmt': code_string,\r\n    }\r\n    ```\r\n  }\r\n  {\r\n    color,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n      @display_name(\"Value\") @description(\"An expression to describe the value or location of the color.\")\r\n        'expression': expr_string,\r\n    }\r\n    ```\r\n  }\r\n  {\r\n    geo3d,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n      @display_name(\"Expression\") @description(\"An expression to describe the base address of the index buffer.\")\r\n        'expression': expr_string,\r\n      'count': expr_string,\r\n      'vtx': expr_string,\r\n      'vtx_size': expr_string,\r\n      'yaw': @range[0, 1] f32,\r\n      'pitch': @range[-0.5, 0] f32,\r\n      'zoom': @range[0, 100] f32,\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: getting started\r\n  {\r\n    getting_started,\r\n    ```\r\n      @inherit(tab) x:\r\n    {\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: targets\r\n  {\r\n    target,\r\n    ```\r\n      @row_commands(@cmd_line save_cfg_to_project, enable_cfg, launch_and_run, launch_and_step_into, duplicate_cfg, remove_cfg)\r\n      @collection_commands(add_target)\r\n      x:\r\n    {\r\n      'label':              code_string,\r\n      'executable':         path,\r\n      'arguments':          string,\r\n      'working_directory':  path,\r\n      'entry_point':        expr_string,\r\n      'stdout_path':        @no_relativize path,\r\n      'stderr_path':        @no_relativize path,\r\n      'stdin_path':         @no_relativize path,\r\n      'environment':        query,\r\n      'debug_subprocesses': bool,\r\n      @no_revert @no_expand @default(0) 'enabled': bool,\r\n    }\r\n    ```,\r\n  }\r\n  \r\n  //- rjf: breakpoints\r\n  {\r\n    breakpoint,\r\n    ```\r\n      @row_commands(enable_cfg, duplicate_cfg, remove_cfg)\r\n      @collection_commands(toggle_breakpoint, add_breakpoint, add_address_breakpoint, add_function_breakpoint, clear_breakpoints)\r\n      x:\r\n    {\r\n      'label':            code_string,\r\n      'condition':        expr_string,\r\n      'source_location':  path_pt,\r\n      'address_location': expr_string,\r\n      'hit_count':        u64,\r\n      'address_range_size': @or(0, 1, 2, 4, 8) u64,\r\n      'break_on_write':   bool,\r\n      'break_on_read':    bool,\r\n      'break_on_execute': bool,\r\n      @no_revert @no_expand @default(1) 'enabled': bool,\r\n    }\r\n    ```,\r\n  }\r\n  \r\n  //- rjf: watch pins\r\n  {\r\n    watch_pin,\r\n    ```\r\n      @row_commands(duplicate_cfg, remove_cfg)\r\n      @collection_commands(add_watch_pin, toggle_watch_pin)\r\n      x:\r\n    {\r\n      'expression':       expr_string,\r\n      'source_location':  path_pt,\r\n      'address_location': expr_string,\r\n    }\r\n    ```,\r\n  }\r\n  \r\n  //- rjf: debug infos\r\n  {\r\n    debug_info,\r\n    ```\r\n      @row_commands(enable_cfg, duplicate_cfg, remove_cfg)\r\n      @collection_commands(load_debug_info)\r\n      x:\r\n    {\r\n      'path': @no_relativize path,\r\n      @query 'guid': string,\r\n      @no_revert @no_expand @default(1) 'enabled': bool,\r\n    }\r\n    ```,\r\n  }\r\n  \r\n  //- rjf: file path maps\r\n  {\r\n    file_path_map,\r\n    ```@collection_commands(add_file_path_map) @row_commands(remove_cfg) x:{'source': @no_relativize path, 'dest': @no_relativize path}```,\r\n  }\r\n  \r\n  //- rjf: type views\r\n  {\r\n    type_view,\r\n    ```@collection_commands(add_type_view) @row_commands(remove_cfg) x:{'type':expr_string, 'expr':expr_string}```,\r\n  }\r\n  \r\n  //- rjf: recent projects\r\n  {\r\n    recent_project,\r\n    ```x:{'path':path}```,\r\n  }\r\n  \r\n  //- rjf: recent files\r\n  {\r\n    recent_file,\r\n    ```x:{'path':path}```,\r\n  }\r\n  \r\n  //- rjf: control entities\r\n  {\r\n    machine,\r\n    ```x:{'label':code_string, @no_expand 'active':bool, 'unattached_processes':query, 'processes':query}```,\r\n  }\r\n  {\r\n    process,\r\n    ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'modules':query, 'threads':query}```,\r\n  }\r\n  {\r\n    module,\r\n    ```x:{'exe':path, 'dbg':path, 'vaddr_range':vaddr_range}```,\r\n  }\r\n  {\r\n    thread,\r\n    ```x:{'label':code_string, 'id':u64, @no_expand 'active':bool, 'call_stack':query}```,\r\n  }\r\n}\r\n\r\n@struct RD_NameSchemaInfo:\r\n{\r\n  `String8 name`;\r\n  `String8 schema`;\r\n}\r\n\r\n@data(RD_NameSchemaInfo) rd_name_schema_info_table:\r\n{\r\n  @expand(RD_SchemaTable a) `{str8_lit_comp(\"$(a.name)\"), str8_lit_comp(\"$(a.schema)\")}`\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Registers Type Table\r\n\r\n@table(c_type  name_lower  name)\r\nRD_RegTable:\r\n{\r\n  // rjf: ctrl entities\r\n  {CTRL_Handle       machine          Machine       }\r\n  {CTRL_Handle       module           Module        }\r\n  {CTRL_Handle       process          Process       }\r\n  {CTRL_Handle       thread           Thread        }\r\n  {CTRL_Handle       ctrl_entity      CtrlEntity    }\r\n  \r\n  // rjf: cfgs\r\n  {CFG_ID            window           Window        }\r\n  {CFG_ID            panel            Panel         }\r\n  {CFG_ID            tab              Tab           }\r\n  {CFG_ID            view             View          }\r\n  {CFG_ID            prev_tab         PrevTab       }\r\n  {CFG_ID            dst_panel        DstPanel      }\r\n  {CFG_ID            cfg              Cfg           }\r\n  {CFG_IDList        cfg_list         CfgList       }\r\n  \r\n  // rjf: evaluation space\r\n  {E_Space           eval_space       EvalSpace     }\r\n  \r\n  // rjf: frame selection\r\n  {U64               unwind_count     UnwindCount   }\r\n  {U64               inline_depth     InlineDepth   }\r\n  \r\n  // rjf: code / address location info\r\n  {String8           file_path        FilePath      }\r\n  {TxtPt             cursor           Cursor        }\r\n  {TxtPt             mark             Mark          }\r\n  {C_Key             text_key         TextKey       }\r\n  {TXT_LangKind      lang_kind        LangKind      }\r\n  {D_LineList        lines            Lines         }\r\n  {DI_Key           dbgi_key         DbgiKey       }\r\n  {U64               vaddr            Vaddr         }\r\n  {U64               voff             Voff          }\r\n  {Rng1U64           vaddr_range      VaddrRange    }\r\n  {Rng1U64           voff_range       VoffRange     }\r\n  \r\n  // rjf: evaluation\r\n  {String8           expr             Expr          }\r\n  \r\n  // rjf: ui context\r\n  {UI_Key            ui_key           UIKey         }\r\n  {UI_Key            src_ui_key       SrcUIKey      }\r\n  {Vec2F32           off_px           OffPx         }\r\n  {RD_RegSlot        reg_slot         RegSlot       }\r\n  \r\n  // rjf: general parameters\r\n  {U32               pid              PID           }\r\n  {B32               force_confirm    ForceConfirm  }\r\n  {B32               force_focus      ForceFocus    }\r\n  {B32               prefer_disasm    PreferDisasm  }\r\n  {B32               no_rich_tooltip  NoRichTooltip }\r\n  {B32               do_implicit_root DoImplicitRoot}\r\n  {B32               do_lister        DoLister      }\r\n  {B32               do_big_rows      DoBigRows     }\r\n  {B32               all_windows      AllWindows    }\r\n  {B32               non_graphical    NonGraphical  }\r\n  {B32               prefer_new_tab   PreferNewTab  }\r\n  {Dir2              dir2             Dir2          }\r\n  {String8           string           String        }\r\n  {String8           cmd_name         CmdName       }\r\n  {`OS_Event *`      os_event         OSEvent       }\r\n}\r\n\r\n@enum RD_RegSlot:\r\n{\r\n  Null,\r\n  @expand(RD_RegTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@struct RD_Regs:\r\n{\r\n  @expand(RD_RegTable a) `$(a.c_type) $(a.name_lower)`\r\n}\r\n\r\n@data(String8) rd_reg_slot_code_name_table:\r\n{\r\n  `{0}`,\r\n  @expand(RD_RegTable a) `str8_lit_comp(\"$(a.name_lower)\")`\r\n}\r\n\r\n@data(Rng1U64) rd_reg_slot_range_table:\r\n{\r\n  `{0}`,\r\n  @expand(RD_RegTable a) `{OffsetOf(RD_Regs, $(a.name_lower)), OffsetOf(RD_Regs, $(a.name_lower)) + sizeof($(a.c_type))}`\r\n}\r\n\r\n@gen\r\n{\r\n  `#define rd_regs_lit_init_top \\\\`\r\n  @expand(RD_RegTable a) `.$(a.name_lower) = rd_regs()->$(a.name_lower),\\\\`\r\n    ``;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Table\r\n\r\n@table(name                      ui_vis   ipc_docs_vis   text_pt_vis      text_rng_vis       q_expr          q_slot       q_view  q_ent_kind  q_ctrl_ent_kind  q_allow_files q_allow_folders  q_keep_oi   q_select_oi  q_is_code        q_floating        q_required                                canonical_icon        string                        display_name                                  desc                                                                                                               search_tags                      ctx_filter)\r\n//    /                          |        |              |                |               |             \\___                                                                                                          __________________________/                                |                     |                             |                                             |                                                                                                                  |                                |\r\n//   /                           |        |              |                |               |                 \\                                                                                                        /                                                           |                     |                             |                                             |                                                                                                                  |                                |\r\nRD_CmdTable:    //               |        |              |                |               |                  |                                                                                                       |                                                           |                     |                             |                                             |                                                                                                                  |                                |\r\n{\r\n  //- rjf: exiting\r\n  {Exit                           1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           X                     \"exit\"                        \"Exit\"                                        \"Exits the debugger.\"                                                                                              \"quit,close,abort\"               \"\"                                                               }\r\n  \r\n  //- rjf: palette\r\n  {OpenPalette                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           List                  \"open_palette\"                \"Open Palette\"                                \"Opens the palette.\"                                                                                               \"help,cmd,lister\"                \"\"                                                               }\r\n  \r\n  //- rjf: command runners\r\n  {RunCommand                     1        1              0                0               \"query:commands\"                                 CmdName            commands          Nil                     Null       0  0  0  0  0  1  1                                                           Null                  \"run_command\"                 \"Run Command\"                                 \"Runs a command from the command palette.\"                                                                         \"help,cmd\"                       \"\"                                                               }\r\n  {RunExternalDriverTextCommand   0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  1  1                                                           Null                  \"run_ext_driver_text_command\" \"Run External Driver Text Command\"            \"\"                                                                                                                 \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: os event passthrough\r\n  {OSEvent                        0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"os_event\"                    \"OS Event\"                                    \"\"                                                                                                                 \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: thread/frame selection\r\n  {SelectThread                   1        1              0                0               \"query:threads\"                                  Thread             null              Nil                     Thread     0  0  0  0  0  1  1                                                           Thread                \"select_thread\"               \"Select Thread\"                               \"Selects a thread.\"                                                                                                \"\"                               \"\"                                                               }\r\n  {SelectUnwind                   0        1              0                0               \"query:call_stack\"                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"select_unwind\"               \"Select Unwind\"                               \"Selects an unwind frame number for the selected thread.\"                                                          \"\"                               \"\"                                                               }\r\n  {UpOneFrame                     1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           UpArrow               \"up_one_frame\"                \"Up One Frame\"                                \"Selects the call stack frame above the currently selected.\"                                                       \"\"                               \"\"                                                               }\r\n  {DownOneFrame                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           DownArrow             \"down_one_frame\"              \"Down One Frame\"                              \"Selects the call stack frame below the currently selected.\"                                                       \"callstack,unwind\"               \"\"                                                               }\r\n  {SelectEntity                   0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RadioHollow           \"select_entity\"               \"Select\"                                      \"Selects a control entity.\"                                                                                        \"\"                               \"\"                                                               }\r\n  {DeselectEntity                 0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RadioFilled           \"deselect_entity\"             \"Deselect\"                                    \"Deselects a control entity.\"                                                                                      \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: font sizes\r\n  {IncWindowFontSize              1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"inc_window_font_size\"        \"Increase Window Font Size\"                   \"Increases the window's font size by one point.\"                                                                   \"\"                               \"\"                                                               }\r\n  {DecWindowFontSize              1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"dec_window_font_size\"        \"Decrease Window Font Size\"                   \"Decreases the window's font size by one point.\"                                                                   \"\"                               \"\"                                                               }\r\n  {IncViewFontSize                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"inc_view_font_size\"          \"Increase View Font Size\"                     \"Increases the view's font size by one point.\"                                                                     \"\"                               \"\"                                                               }\r\n  {DecViewFontSize                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"dec_view_font_size\"          \"Decrease View Font Size\"                     \"Decreases the view's font size by one point.\"                                                                     \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: windows\r\n  {OpenWindow                     1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"open_window\"                 \"Open New Window\"                             \"Opens a new window.\"                                                                                              \"\"                               \"\"                                                               }\r\n  {WindowSettings                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Gear                  \"window_settings\"             \"Window Settings\"                             \"Opens settings for a window.\"                                                                                     \"\"                               \"\"                                                               }\r\n  {CloseWindow                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"close_window\"                \"Close Window\"                                \"Closes an opened window.\"                                                                                         \"\"                               \"\"                                                               }\r\n  {ToggleFullscreen               1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"toggle_fullscreen\"           \"Toggle Fullscreen\"                           \"Toggles fullscreen view on the active window.\"                                                                    \"\"                               \"\"                                                               }\r\n  {BringToFront                   0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"bring_to_front\"              \"Bring To Front\"                              \"Brings all windows to the front, and focuses the most recently focused window.\"                                   \"top\"                            \"\"                                                               }\r\n  \r\n  //- rjf: popups\r\n  {PopupAccept                    0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"popup_accept\"                \"Popup Accept\"                                \"Accepts the active popup prompt.\"                                                                                 \"\"                               \"\"                                                               }\r\n  {PopupCancel                    0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"popup_cancel\"                \"Popup Cancel\"                                \"Cancels the active popup prompt.\"                                                                                 \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: keybindings\r\n  {ResetToDefaultBindings         1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"reset_to_default_bindings\"   \"Reset To Default Bindings\"                   \"Resets all keybindings to their defaults.\"                                                                        \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: panel splitting\r\n  {ResetToDefaultPanels           1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"reset_to_default_panels\"     \"Reset To Default Panel Layout\"               \"Resets the window to the default panel layout.\"                                                                   \"panel\"                          \"\"                                                               }\r\n  {ResetToCompactPanels           1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"reset_to_compact_panels\"     \"Reset To Compact Panel Layout\"               \"Resets the window to the compact panel layout.\"                                                                   \"panel\"                          \"\"                                                               }\r\n  {ResetToSimplePanels            1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Window                \"reset_to_simple_panels\"      \"Reset To Simple Panel Layout\"                \"Resets the window to the simple panel layout.\"                                                                    \"panel\"                          \"\"                                                               }\r\n  {NewPanelLeft                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           XSplit                \"new_panel_left\"              \"Split Panel Left\"                            \"Creates a new panel to the left of the active panel.\"                                                             \"panel\"                          \"\"                                                               }\r\n  {NewPanelUp                     1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           YSplit                \"new_panel_up\"                \"Split Panel Up\"                              \"Creates a new panel at the top of the active panel.\"                                                              \"panel\"                          \"\"                                                               }\r\n  {NewPanelRight                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           XSplit                \"new_panel_right\"             \"Split Panel Right\"                           \"Creates a new panel to the right of the active panel.\"                                                            \"panel\"                          \"\"                                                               }\r\n  {NewPanelDown                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           YSplit                \"new_panel_down\"              \"Split Panel Down\"                            \"Creates a new panel at the bottom of the active panel.\"                                                           \"panel\"                          \"\"                                                               }\r\n  {SplitPanel                     0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"split_panel\"                 \"Split Panel\"                                 \"Creates a new panel in a given direction, and moves a tab to it, if specified.\"                                   \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: panel rotation\r\n  {RotatePanelColumns             1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"rotate_panel_columns\"        \"Rotate Panel Columns\"                        \"Rotates all panels at the closest column level of the panel hierarchy.\"                                           \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: focused panel changing\r\n  {NextPanel                      1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RightArrow            \"next_panel\"                  \"Focus Next Panel\"                            \"Cycles the active panel forward.\"                                                                                 \"\"                               \"\"                                                               }\r\n  {PrevPanel                      1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           LeftArrow             \"prev_panel\"                  \"Focus Previous Panel\"                        \"Cycles the active panel backwards.\"                                                                               \"\"                               \"\"                                                               }\r\n  {FocusPanel                     0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"focus_panel\"                 \"Focus Panel\"                                 \"Focuses a new panel.\"                                                                                             \"\"                               \"\"                                                               }\r\n  {FocusPanelRight                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RightArrow            \"focus_panel_right\"           \"Focus Panel Right\"                           \"Focuses a panel rightward of the currently focused panel.\"                                                        \"\"                               \"\"                                                               }\r\n  {FocusPanelLeft                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           LeftArrow             \"focus_panel_left\"            \"Focus Panel Left\"                            \"Focuses a panel leftward of the currently focused panel.\"                                                         \"\"                               \"\"                                                               }\r\n  {FocusPanelUp                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           UpArrow               \"focus_panel_up\"              \"Focus Panel Up\"                              \"Focuses a panel upward of the currently focused panel.\"                                                           \"\"                               \"\"                                                               }\r\n  {FocusPanelDown                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           DownArrow             \"focus_panel_down\"            \"Focus Panel Down\"                            \"Focuses a panel downward of the currently focused panel.\"                                                         \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: undo/redo\r\n  {Undo                           0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Undo                  \"undo\"                        \"Undo\"                                        \"Undoes the previous action.\"                                                                                      \"\"                               \"\"                                                               }\r\n  {Redo                           0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Redo                  \"redo\"                        \"Redo\"                                        \"Redoes the first previously undone action.\"                                                                       \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: focus history\r\n  {GoBack                         0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           LeftArrow             \"go_back\"                     \"Go Back\"                                     \"Returns to the previously selected panel and tab in recorded history.\"                                            \"\"                               \"\"                                                               }\r\n  {GoForward                      0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RightArrow            \"go_forward\"                  \"Go Forward\"                                  \"Returns to the next selected panel and tab in recorded history.\"                                                  \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: panel removal\r\n  {ClosePanel                     1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           ClosePanel            \"close_panel\"                 \"Close Panel\"                                 \"Closes the currently active panel.\"                                                                               \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: panel tab\r\n  {FocusTab                       0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"focus_tab\"                   \"Focus Tab\"                                   \"Focuses the passed tab within its containing panel.\"                                                              \"\"                               \"\"                                                               }\r\n  {NextTab                        1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RightArrow            \"next_tab\"                    \"Focus Next Tab\"                              \"Focuses the next tab on the active panel.\"                                                                        \"\"                               \"\"                                                               }\r\n  {PrevTab                        1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           LeftArrow             \"prev_tab\"                    \"Focus Previous Tab\"                          \"Focuses the previous tab on the active panel.\"                                                                    \"\"                               \"\"                                                               }\r\n  {MoveTabRight                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RightArrow            \"move_tab_right\"              \"Move Tab Right\"                              \"Moves the selected tab right one slot.\"                                                                           \"\"                               \"$tab,\"                                                          }\r\n  {MoveTabLeft                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           LeftArrow             \"move_tab_left\"               \"Move Tab Left\"                               \"Moves the selected tab left one slot.\"                                                                            \"\"                               \"$tab,\"                                                          }\r\n  {OpenTab                        1        1              0                0               \"query:tab_commands\"                             CmdName            commands          Nil                     Null       0  0  0  0  0  1  1                                                           Null                  \"open_tab\"                    \"Open New Tab\"                                \"Opens a new tab.\"                                                                                                 \"\"                               \"\"                                                               }\r\n  {BuildTab                       0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"build_tab\"                   \"Build Tab\"                                   \"Opens a new tab with the parameterized view specification.\"                                                       \"\"                               \"\"                                                               }\r\n  {DuplicateTab                   1        1              0                0               \"\"                                               Tab                null              Nil                     Null       0  0  0  0  0  0  0                                                           Duplicate             \"duplicate_tab\"               \"Duplicate Tab\"                               \"Duplicates a tab.\"                                                                                                \"\"                               \"$tab,\"                                                          }\r\n  {CopyTabFullPath                0        0              0                0               \"\"                                               Tab                null              Nil                     Null       0  0  0  0  0  0  0                                                           Clipboard             \"copy_tab_full_path\"          \"Copy Full Path\"                              \"Copies the full path of the file being viewed by this tab.\"                                                       \"\"                               \"$tab,\"                                                          }\r\n  {CloseTab                       1        1              0                0               \"\"                                               Tab                null              Nil                     Null       0  0  0  0  0  0  0                                                           X                     \"close_tab\"                   \"Close Tab\"                                   \"Closes the currently opened tab.\"                                                                                 \"\"                               \"$tab,\"                                                          }\r\n  {MoveView                       0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_view\"                   \"Move View\"                                   \"Moves a view to a new panel.\"                                                                                     \"\"                               \"\"                                                               }\r\n  {TabBarTop                      1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           UpArrow               \"tab_bar_top\"                 \"Anchor Tab Bar To Top\"                       \"Anchors a panel's tab bar to the top of the panel.\"                                                               \"\"                               \"$tab,\"                                                          }\r\n  {TabBarBottom                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           DownArrow             \"tab_bar_bottom\"              \"Anchor Tab Bar To Bottom\"                    \"Anchors a panel's tab bar to the bottom of the panel.\"                                                            \"\"                               \"$tab,\"                                                          }\r\n  {TabSettings                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Gear                  \"tab_settings\"                \"Tab Settings\"                                \"Opens settings for a tab.\"                                                                                        \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: files\r\n  {SetCurrentPath                 0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           FileOutline           \"set_current_path\"            \"Set Current Path\"                            \"Sets the debugger's current path, which is used as a starting point when browsing for files.\"                     \"\"                               \"\"                                                               }\r\n  {Open                           1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           FileOutline           \"open\"                        \"Open\"                                        \"Opens a file.\"                                                                                                    \"code,source,file\"               \"\"                                                               }\r\n  {Switch                         1        0              0                0               \"query:recent_files, query:source_files\"         Cfg                null              RecentFile              Null       0  0  0  0  0  1  1                                                           FileOutline           \"switch\"                      \"Switch\"                                      \"Switches to a recent file.\"                                                                                       \"code,source,file\"               \"\"                                                               }\r\n  {SwitchToPartnerFile            1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           FileOutline           \"switch_to_partner_file\"      \"Switch To Partner File\"                      \"Switches to the focused file's partner; or from header to implementation or vice versa.\"                          \"code,source,file\"               \"\"                                                               }\r\n  {RecordFileInProject            0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           FileOutline           \"record_file_in_project\"      \"Record File In Project\"                      \"Records the passed file path as a recent file in the currently loaded project.\"                                   \"\"                               \"\"                                                               }\r\n  {ShowFileInExplorer             1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           FolderClosedFilled    \"show_file_in_explorer\"       \"Show File In Explorer\"                       \"Opens the operating system's file explorer and shows the selected file.\"                                          \"\"                               \"$file,\"                                                         }\r\n  \r\n  //- rjf: source <-> disasm\r\n  {GoToDisassembly                1        1              1                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Glasses               \"go_to_disassembly\"           \"Go To Disassembly\"                           \"Goes to the disassembly, if any, for a given source code line.\"                                                   \"code,source,disassembly,disasm\" \"$text_pt,\"                                                      }\r\n  {GoToSource                     1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           FileOutline           \"go_to_source\"                \"Go To Source\"                                \"Goes to the source code, if any, for a given disassembly line.\"                                                   \"code,source,disassembly,disasm\" \"\"                                                               }\r\n  \r\n  //- rjf: override file links\r\n  {SetFileReplacementPath         0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"set_file_replacement_path\"   \"Set File Replacement Path\"                   \"Sets the path which should be used as the replacement for the passed file.\"                                       \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: setting config paths\r\n  {NewUser                        1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Add                   \"new_user\"                    \"New User\"                                    \"Creates a new user file, and sets the current user path as that file's path.\"                                     \"new,user,project,layout\"        \"\"                                                               }\r\n  {NewProject                     1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Add                   \"new_project\"                 \"New Project\"                                 \"Creates a new project file, and sets the current project path as that file's path.\"                               \"new,user,project,layout\"        \"\"                                                               }\r\n  {OpenUser                       1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Person                \"open_user\"                   \"Open User\"                                   \"Opens a user file path, immediately loading it, and begins autosaving to it.\"                                     \"load,user,project,layout\"       \"\"                                                               }\r\n  {OpenProject                    1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Briefcase             \"open_project\"                \"Open Project\"                                \"Opens a project file path, immediately loading it, and begins autosaving to it.\"                                  \"project,project,session\"        \"\"                                                               }\r\n  {OpenRecentProject              1        1              0                0               \"query:recent_projects\"                          Cfg                null              RecentProject           Null       0  0  0  0  0  1  1                                                           Briefcase             \"open_recent_project\"         \"Open Recent Project\"                         \"Opens a recently used project file.\"                                                                              \"project,project,session\"        \"\"                                                               }\r\n  {SaveUser                       1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Save                  \"save_user\"                   \"Save User\"                                   \"Saves user data to a file, and sets the current user path as that path.\"                                          \"load,user,project,layout\"       \"\"                                                               }\r\n  {SaveProject                    1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Save                  \"save_project\"                \"Save Project\"                                \"Saves project data to a file, and sets the current project path as that path.\"                                    \"project,project,session\"        \"\"                                                               }\r\n  {RecordUserAsLastOpened         0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"record_user_as_last_opened\"  \"Record User As Last Opened\"                  \"Records a file path as the last opened user.\"                                                                     \"\"                               \"\"                                                               }\r\n  {RecordProjectInUser            0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"record_project_in_user\"      \"Records Project In User\"                     \"Records a file path as a recent project in user data.\"                                                            \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: writing config changes\r\n  {WriteUserData                  0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"write_user_data\"             \"Write User Data\"                             \"Writes user data to the active user file.\"                                                                        \"\"                               \"\"                                                               }\r\n  {WriteProjectData               0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"write_project_data\"          \"Write Project Data\"                          \"Writes project data to the active project file.\"                                                                  \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: opening user/project settings\r\n  {UserSettings                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Gear                  \"user_settings\"               \"User Settings\"                               \"Opens user settings.\"                                                                                             \"\"                               \"\"                                                               }\r\n  {ProjectSettings                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Gear                  \"project_settings\"            \"Project Settings\"                            \"Opens project settings.\"                                                                                          \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: meta controls\r\n  {Edit                           1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Pencil                \"edit\"                        \"Edit\"                                        \"Edits the current selection.\"                                                                                     \"\"                               \"\"                                                               }\r\n  {Accept                         1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           CheckFilled           \"accept\"                      \"Accept\"                                      \"Accepts current changes, or answers prompts in the affirmative.\"                                                  \"\"                               \"\"                                                               }\r\n  {Cancel                         1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           X                     \"cancel\"                      \"Cancel\"                                      \"Rejects current changes, exits temporary menus, or answers prompts in the negative.\"                              \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: directional movement & text controls\r\n  {MoveLeft                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_left\"                   \"Move Left\"                                   \"Moves the cursor or selection left.\"                                                                              \"\"                               \"\"                                                               }\r\n  {MoveRight                      1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_right\"                  \"Move Right\"                                  \"Moves the cursor or selection right.\"                                                                             \"\"                               \"\"                                                               }\r\n  {MoveUp                         1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up\"                     \"Move Up\"                                     \"Moves the cursor or selection up.\"                                                                                \"\"                               \"\"                                                               }\r\n  {MoveDown                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down\"                   \"Move Down\"                                   \"Moves the cursor or selection down.\"                                                                              \"\"                               \"\"                                                               }\r\n  {MoveLeftSelect                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_left_select\"            \"Move Left Select\"                            \"Moves the cursor or selection left, while selecting.\"                                                             \"\"                               \"\"                                                               }\r\n  {MoveRightSelect                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_right_select\"           \"Move Right Select\"                           \"Moves the cursor or selection right, while selecting.\"                                                            \"\"                               \"\"                                                               }\r\n  {MoveUpSelect                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_select\"              \"Move Up Select\"                              \"Moves the cursor or selection up, while selecting.\"                                                               \"\"                               \"\"                                                               }\r\n  {MoveDownSelect                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_select\"            \"Move Down Select\"                            \"Moves the cursor or selection down, while selecting.\"                                                             \"\"                               \"\"                                                               }\r\n  {MoveLeftChunk                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_left_chunk\"             \"Move Left Chunk\"                             \"Moves the cursor or selection left one chunk.\"                                                                    \"\"                               \"\"                                                               }\r\n  {MoveRightChunk                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_right_chunk\"            \"Move Right Chunk\"                            \"Moves the cursor or selection right one chunk.\"                                                                   \"\"                               \"\"                                                               }\r\n  {MoveUpChunk                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_chunk\"               \"Move Up Chunk\"                               \"Moves the cursor or selection up one chunk.\"                                                                      \"\"                               \"\"                                                               }\r\n  {MoveDownChunk                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_chunk\"             \"Move Down Chunk\"                             \"Moves the cursor or selection down one chunk.\"                                                                    \"\"                               \"\"                                                               }\r\n  {MoveUpPage                     1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_page\"                \"Move Up Page\"                                \"Moves the cursor or selection up one page.\"                                                                       \"\"                               \"\"                                                               }\r\n  {MoveDownPage                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_page\"              \"Move Down Page\"                              \"Moves the cursor or selection down one page.\"                                                                     \"\"                               \"\"                                                               }\r\n  {MoveUpWhole                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_whole\"               \"Move Up Whole\"                               \"Moves the cursor or selection to the beginning of the relevant content.\"                                          \"\"                               \"\"                                                               }\r\n  {MoveDownWhole                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_whole\"             \"Move Down Whole\"                             \"Moves the cursor or selection to the end of the relevant content.\"                                                \"\"                               \"\"                                                               }\r\n  {MoveLeftChunkSelect            1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_left_chunk_select\"      \"Move Left Chunk Select\"                      \"Moves the cursor or selection left one chunk.\"                                                                    \"\"                               \"\"                                                               }\r\n  {MoveRightChunkSelect           1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_right_chunk_select\"     \"Move Right Chunk Select\"                     \"Moves the cursor or selection right one chunk.\"                                                                   \"\"                               \"\"                                                               }\r\n  {MoveUpChunkSelect              1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_chunk_select\"        \"Move Up Chunk Select\"                        \"Moves the cursor or selection up one chunk.\"                                                                      \"\"                               \"\"                                                               }\r\n  {MoveDownChunkSelect            1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_chunk_select\"      \"Move Down Chunk Select\"                      \"Moves the cursor or selection down one chunk.\"                                                                    \"\"                               \"\"                                                               }\r\n  {MoveUpPageSelect               1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_page_select\"         \"Move Up Page Select\"                         \"Moves the cursor or selection up one page, while selecting.\"                                                      \"\"                               \"\"                                                               }\r\n  {MoveDownPageSelect             1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_page_select\"       \"Move Down Page Select\"                       \"Moves the cursor or selection down one page, while selecting.\"                                                    \"\"                               \"\"                                                               }\r\n  {MoveUpWholeSelect              1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_whole_select\"        \"Move Up Whole Select\"                        \"Moves the cursor or selection to the beginning of the relevant content, while selecting.\"                         \"\"                               \"\"                                                               }\r\n  {MoveDownWholeSelect            1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_whole_select\"      \"Move Down Whole Select\"                      \"Moves the cursor or selection to the end of the relevant content, while selecting.\"                               \"\"                               \"\"                                                               }\r\n  {MoveUpReorder                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_up_reorder\"             \"Move Up Reorder\"                             \"Moves the cursor or selection up, while swapping the currently selected element with that upward.\"                \"\"                               \"\"                                                               }\r\n  {MoveDownReorder                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_down_reorder\"           \"Move Down Reorder\"                           \"Moves the cursor or selection down, while swapping the currently selected element with that downward.\"            \"\"                               \"\"                                                               }\r\n  {MoveHome                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_home\"                   \"Move Home\"                                   \"Moves the cursor to the beginning of the line.\"                                                                   \"\"                               \"\"                                                               }\r\n  {MoveEnd                        1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_end\"                    \"Move End\"                                    \"Moves the cursor to the end of the line.\"                                                                         \"\"                               \"\"                                                               }\r\n  {MoveHomeSelect                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_home_select\"            \"Move Home Select\"                            \"Moves the cursor to the beginning of the line, while selecting.\"                                                  \"\"                               \"\"                                                               }\r\n  {MoveEndSelect                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_end_select\"             \"Move End Select\"                             \"Moves the cursor to the end of the line, while selecting.\"                                                        \"\"                               \"\"                                                               }\r\n  {SelectAll                      1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"select_all\"                  \"Select All\"                                  \"Selects everything possible.\"                                                                                     \"\"                               \"\"                                                               }\r\n  {DeleteSingle                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"delete_single\"               \"Delete Single\"                               \"Deletes a single element to the right of the cursor, or the active selection.\"                                    \"\"                               \"\"                                                               }\r\n  {DeleteChunk                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"delete_chunk\"                \"Delete Chunk\"                                \"Deletes a chunk to the right of the cursor, or the active selection.\"                                             \"\"                               \"\"                                                               }\r\n  {BackspaceSingle                1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"backspace_single\"            \"Backspace Single\"                            \"Deletes a single element to the left of the cursor, or the active selection.\"                                     \"\"                               \"\"                                                               }\r\n  {BackspaceChunk                 1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"backspace_chunk\"             \"Backspace Chunk\"                             \"Deletes a chunk to the left of the cursor, or the active selection.\"                                              \"\"                               \"\"                                                               }\r\n  {Copy                           1        1              0                1               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Clipboard             \"copy\"                        \"Copy\"                                        \"Copies the active selection to the clipboard.\"                                                                    \"\"                               \"$text_rng,\"                                                     }\r\n  {Cut                            1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Clipboard             \"cut\"                         \"Cut\"                                         \"Copies the active selection to the clipboard, then deletes it.\"                                                   \"\"                               \"\"                                                               }\r\n  {Paste                          1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Clipboard             \"paste\"                       \"Paste\"                                       \"Pastes the current contents of the clipboard.\"                                                                    \"\"                               \"\"                                                               }\r\n  {InsertText                     0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"insert_text\"                 \"Insert Text\"                                 \"Inserts the text that was used to cause this command.\"                                                            \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: directionless navigation\r\n  {MoveNext                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_next\"                   \"Move Next\"                                   \"Moves the cursor or selection to the next element.\"                                                               \"\"                               \"\"                                                               }\r\n  {MovePrev                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"move_prev\"                   \"Move Previous\"                               \"Moves the cursor or selection to the previous element.\"                                                           \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: code navigation\r\n  {GoToLine                       1        1              0                0               \"\"                                               Cursor             null              Nil                     Null       0  0  0  0  1  0  1                                                           Null                  \"goto_line\"                   \"Go To Line\"                                  \"Jumps to a line number in the current code file.\"                                                                 \"\"                               \"\"                                                               }\r\n  {GoToAddress                    1        1              0                0               \"\"                                               Vaddr              null              Nil                     Null       0  0  0  0  1  0  1                                                           Null                  \"goto_address\"                \"Go To Address\"                               \"Jumps to an address in the current memory or disassembly view.\"                                                   \"\"                               \"\"                                                               }\r\n  {CenterCursor                   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"center_cursor\"               \"Center Cursor\"                               \"Snaps the current code view to center the cursor.\"                                                                \"\"                               \"\"                                                               }\r\n  {ContainCursor                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"contain_cursor\"              \"Contain Cursor\"                              \"Snaps the current code view to contain the cursor.\"                                                               \"\"                               \"\"                                                               }\r\n  {FindNext                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  1  0  0  0  0                                                           Find                  \"find_next\"                   \"Find Next\"                                   \"Searches the current code file forward (from the cursor) for the last searched string.\"                           \"\"                               \"\"                                                               }\r\n  {FindPrev                       1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  1  0  0  0  0                                                           Find                  \"find_prev\"                   \"Find Previous\"                               \"Searches the current code file backwards (from the cursor) for the last searched string.\"                         \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: thread finding\r\n  {FindThread                     1        1              0                0               \"query:threads\"                                  Thread             null              Nil                     Thread     0  0  0  0  0  1  1                                                           Find                  \"find_thread\"                 \"Find Thread\"                                 \"Jumps to the passed thread in either source code, disassembly, or both if they're already open.\"                  \"\"                               \"\"                                                               }\r\n  {FindSelectedThread             1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Find                  \"find_selected_thread\"        \"Find Selected Thread\"                        \"Jumps to the selected thread in either source code, disassembly, or both if they're already open.\"                \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: name finding\r\n  {GoToName                       1        1              0                0               \"query:procedures\"                               String             symbol_lister     Nil                     Null       0  0  0  0  1  1  1                                                           Null                  \"goto_name\"                   \"Go To Name\"                                  \"Searches for the passed string as a file, a symbol in debug info, and more, then jumps to it if possible.\"        \"\"                               \"$text_pt,\"                                                      }\r\n  {GoToNameAtCursor               1        1              1                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"goto_name_at_cursor\"         \"Go To Name At Cursor\"                        \"Searches for the text at the cursor as a file, a symbol in debug info, and more, then jumps to it if possible.\"   \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: watch expressions\r\n  {ToggleWatchExpression          1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Binoculars            \"toggle_watch_expr\"           \"Toggle Watch Expression\"                     \"Adds or removes an expression to an opened watch view.\"                                                           \"\"                               \"$text_pt,\"                                                      }\r\n  {ToggleWatchExpressionAtCursor  1        1              1                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Binoculars            \"toggle_watch_expr_at_cursor\" \"Toggle Watch Expression At Cursor\"           \"Adds or removes the expression that the cursor or selection is currently over to an opened watch view.\"           \"\"                               \"\"                                                               }\r\n  {ToggleWatchExpressionAtMouse   1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Binoculars            \"toggle_watch_expr_at_mouse\"  \"Toggle Watch Expression At Mouse\"            \"Adds or removes the expression that the mouse is currently over to an opened watch view.\"                         \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: general config operations\r\n  {EnableCfg                      0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           CheckHollow           \"enable_cfg\"                  \"Enable\"                                      \"Enables a config tree.\"                                                                                           \"\"                               \"\"                                                               }\r\n  {DisableCfg                     0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           CheckFilled           \"disable_cfg\"                 \"Disable\"                                     \"Disables a config tree.\"                                                                                          \"\"                               \"\"                                                               }\r\n  {SelectCfg                      0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RadioHollow           \"select_cfg\"                  \"Select\"                                      \"Selects a config tree, disabling all others of the same kind.\"                                                    \"\"                               \"\"                                                               }\r\n  {DeselectCfg                    0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RadioFilled           \"deselect_cfg\"                \"Deselect\"                                    \"Deselects a config tree.\"                                                                                         \"\"                               \"\"                                                               }\r\n  {RemoveCfg                      0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Trash                 \"remove_cfg\"                  \"Remove\"                                      \"Removes a config tree.\"                                                                                           \"\"                               \"\"                                                               }\r\n  {NameCfg                        0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"name_cfg\"                    \"Name\"                                        \"Equips a config tree with a label.\"                                                                               \"\"                               \"\"                                                               }\r\n  {ConditionCfg                   0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"condition_cfg\"               \"Condition\"                                   \"Equips a config tree with a condition string.\"                                                                    \"\"                               \"\"                                                               }\r\n  {DuplicateCfg                   0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Duplicate             \"duplicate_cfg\"               \"Duplicate\"                                   \"Duplicates a config tree.\"                                                                                        \"\"                               \"\"                                                               }\r\n  {RelocateCfg                    0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"relocate_cfg\"                \"Relocate\"                                    \"Relocates a config tree.\"                                                                                         \"\"                               \"\"                                                               }\r\n  {SaveToProject                  0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Briefcase             \"save_cfg_to_project\"         \"Save To Project\"                             \"Saves the config tree to the project.\"                                                                            \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: breakpoints\r\n  {AddBreakpoint                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           CircleFilled          \"add_breakpoint\"              \"Add Line Breakpoint\"                         \"Places a breakpoint at a given location (file path and line number, address, or symbol name).\"                    \"\"                               \"\"                                                               }\r\n  {AddAddressBreakpoint           1        0              0                0               \"\"                                               Expr               null              Nil                     Null       0  0  0  0  1  1  1                                                           CircleFilled          \"add_address_breakpoint\"      \"Add Address Breakpoint\"                      \"Places a breakpoint on the specified address.\"                                                                    \"\"                               \"$breakpoints,\"                                                  }\r\n  {AddFunctionBreakpoint          1        0              0                0               \"query:procedures\"                               String             null              Nil                     Null       0  0  0  0  1  1  1                                                           CircleFilled          \"add_function_breakpoint\"     \"Add Function Breakpoint\"                     \"Places a breakpoint on the first address of the specified function.\"                                              \"\"                               \"$breakpoints,\"                                                  }\r\n  {ToggleBreakpoint               1        1              1                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           CircleFilled          \"toggle_breakpoint\"           \"Toggle Line Breakpoint\"                      \"Places or removes a breakpoint at a given location (file path and line number, address, or symbol name).\"         \"\"                               \"$text_pt,\"                                                      }\r\n  {RemoveBreakpoint               1        0              0                0               \"query:breakpoints\"                              Cfg                null              Nil                     Null       0  0  0  0  1  1  1                                                           Trash                 \"remove_breakpoint\"           \"Remove Breakpoint\"                           \"Removes an existing breakpoint.\"                                                                                  \"delete\"                         \"$breakpoints,\"                                                  }\r\n  {EnableBreakpoint               1        1              0                0               \"query:breakpoints\"                              Cfg                null              Breakpoint              Null       0  0  0  0  1  1  1                                                           CheckFilled           \"enable_breakpoint\"           \"Enable Breakpoint\"                           \"Enables a breakpoint.\"                                                                                            \"\"                               \"\"                                                               }\r\n  {DisableBreakpoint              1        1              0                0               \"query:breakpoints\"                              Cfg                null              Breakpoint              Null       0  0  0  0  1  1  1                                                           CheckHollow           \"disable_breakpoint\"          \"Disable Breakpoint\"                          \"Disables a breakpoint.\"                                                                                           \"\"                               \"\"                                                               }\r\n  {ClearBreakpoints               1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Trash                 \"clear_breakpoints\"           \"Clear Breakpoints\"                           \"Removes all breakpoints.\"                                                                                         \"\"                               \"\"                                                               }\r\n  {ListBreakpoints                0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"list_breakpoints\"            \"List Breakpoints\"                            \"Lists all breakpoints.\"                                                                                           \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: output\r\n  {ClearOutput                    1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"clear_output\"                \"Clear Output\"                                \"Clears all output.\"                                                                                               \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: watch pins\r\n  {AddWatchPin                    1        1              0                0               \"\"                                               Expr               null              Nil                     Null       0  0  0  0  1  1  1                                                           Pin                   \"add_watch_pin\"               \"Add Watch Pin\"                               \"Places a watch pin at a given location (file path and line number or address).\"                                   \"\"                               \"$watch_pins,\"                                                   }\r\n  {ToggleWatchPin                 1        0              0                0               \"\"                                               Expr               null              Nil                     Null       0  0  0  0  1  1  1                                                           Pin                   \"toggle_watch_pin\"            \"Toggle Watch Pin\"                            \"Places or removes a watch pin at a given location (file path and line number or address).\"                        \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: debug infos\r\n  {LoadDebugInfo                  1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Module                \"load_debug_info\"             \"Load Debug Info\"                             \"Loads a debug info file.\"                                                                                         \"\"                               \"$debug_infos,\"                                                  }\r\n  {UnloadDebugInfo                1        1              0                0               \"query:debug_infos\"                              Cfg                null              Nil                     Null       0  0  0  0  1  1  1                                                           Module                \"unload_debug_info\"           \"Unload Debug Info\"                           \"Unloads a debug info file.\"                                                                                       \"\"                               \"$debug_infos,\"                                                  }\r\n  \r\n  //- rjf: type views\r\n  {AddTypeView                    0        0              0                0               \"\"                                               String             null              Nil                     Null       0  0  0  0  0  0  0                                                           Binoculars            \"add_type_view\"               \"Add Type View\"                               \"Adds a new type view.\"                                                                                            \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: file path maps\r\n  {AddFilePathMap                 0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           FileOutline           \"add_file_path_map\"           \"Add File Path Map\"                           \"Adds a new file path map.\"                                                                                        \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: themes\r\n  {EditUserTheme                  0        0              0                0               \"query:themes\"                                   String             null              Nil                     Null       0  0  0  0  0  0  0                                                           Palette               \"edit_user_theme\"             \"Edit User Theme\"                             \"Edits the current user's theme.\"                                                                                  \"color\"                          \"\"                                                               }\r\n  {EditProjectTheme               0        0              0                0               \"query:themes\"                                   String             null              Nil                     Null       0  0  0  0  0  0  0                                                           Palette               \"edit_project_theme\"          \"Edit Project Theme\"                          \"Edits the current project's theme.\"                                                                               \"color\"                          \"\"                                                               }\r\n  {AddThemeColor                  0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Palette               \"add_theme_color\"             \"Add Theme Color\"                             \"Adds a new theme color.\"                                                                                          \"\"                               \"\"                                                               }\r\n  {ForkTheme                      0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Palette               \"fork_theme\"                  \"Fork Theme\"                                  \"Imports all colors from the current theme so they can be individually edited.\"                                    \"\"                               \"\"                                                               }\r\n  {SaveTheme                      0        0              0                0               \"\"                                               String             null              Nil                     Null       1  0  0  0  0  1  1                                                           Save                  \"save_theme\"                  \"Save Theme\"                                  \"Saves all theme colors to a new theme file.\"                                                                      \"\"                               \"\"                                                               }\r\n  {SaveAndSetTheme                0        0              0                0               \"\"                                               String             null              Nil                     Null       1  0  0  0  0  1  1                                                           Save                  \"save_and_set_theme\"          \"Save And Set Theme\"                          \"Saves all theme colors to a new theme file, and then sets that theme as the selected theme.\"                      \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: line operations\r\n  {SetNextStatement               1        1              1                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           RightArrow            \"set_next_statement\"          \"Set Next Statement\"                          \"Sets the selected thread's instruction pointer to the cursor's position.\"                                         \"\"                               \"$text_pt,\"                                                      }\r\n  \r\n  //- rjf: targets\r\n  {AddTarget                      1        1              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           Target                \"add_target\"                  \"Add Target\"                                  \"Adds a new target.\"                                                                                               \"application,executable,debug\"   \"$targets,\"                                                      }\r\n  {SelectTarget                   1        1              0                0               \"query:targets\"                                  Cfg                null              Target                  Null       0  0  0  0  0  1  1                                                           Target                \"select_target\"               \"Select Target\"                               \"Selects a target.\"                                                                                                \"\"                               \"\"                                                               }\r\n  {EnableTarget                   1        1              0                0               \"query:targets\"                                  Cfg                null              Target                  Null       0  0  0  0  0  1  1                                                           CheckFilled           \"enable_target\"               \"Enable Target\"                               \"Enables a target, in addition to all targets currently enabled.\"                                                  \"\"                               \"\"                                                               }\r\n  {DisableTarget                  1        1              0                0               \"query:targets\"                                  Cfg                null              Target                  Null       0  0  0  0  0  1  1                                                           CheckHollow           \"disable_target\"              \"Disable Target\"                              \"Disables a target.\"                                                                                               \"\"                               \"\"                                                               }\r\n  {RemoveTarget                   1        1              0                0               \"query:targets\"                                  Cfg                null              Target                  Null       0  0  0  0  0  1  1                                                           Trash                 \"remove_target\"               \"Remove Target\"                               \"Removes a target.\"                                                                                                \"delete\"                         \"\"                                                               }\r\n  \r\n  //- rjf: attaching\r\n  {RegisterAsJITDebugger          1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"register_as_jit_debugger\"    \"Register As Just-In-Time (JIT) Debugger\"     \"Registers the RAD debugger as the just-in-time (JIT) debugger used by the operating system.\"                      \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: snap-to-code-location\r\n  {FindCodeLocation               0        1              0                0               \"\"                                               FilePath           null              Nil                     Null       0  0  0  0  0  1  1                                                           FileOutline           \"find_code_location\"          \"Find Code Location\"                          \"Finds a specific source code location given file, line, and column coordinates. Opens the file if necessary.\"     \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: searching\r\n  {Search                         1        1              0                0               \"\"                                               String             null              Nil                     Null       0  0  1  1  1  0  1                                                           Find                  \"search\"                      \"Search\"                                      \"Begins searching within the active interface.\"                                                                    \"sort,search,filter,find\"        \"\"                                                               }\r\n  {SearchBackwards                1        1              0                0               \"\"                                               String             null              Nil                     Null       0  0  1  1  1  0  1                                                           Find                  \"search_backwards\"            \"Search Backwards\"                            \"Begins searching backwards within the active interface.\"                                                          \"sort,search,filter,find\"        \"\"                                                               }\r\n  \r\n  //- rjf: queries\r\n  {PickFile                       0        0              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  0  0  0  0  1  1                                                           FileOutline           \"pick_file\"                   \"Pick File\"                                   \"Opens the file browser to pick a file.\"                                                                           \"\"                               \"\"                                                               }\r\n  {PickFolder                     0        0              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       0  1  0  0  0  1  1                                                           FolderOpenFilled      \"pick_folder\"                 \"Pick Folder\"                                 \"Opens the file browser to pick a folder.\"                                                                         \"\"                               \"\"                                                               }\r\n  {PickFileOrFolder               0        0              0                0               `folder:\\\\\"$input\\\\\"`                            FilePath           null              Nil                     Null       1  1  0  0  0  1  1                                                           FileOutline           \"pick_file_or_folder\"         \"Pick File/Folder\"                            \"Opens the file browser to pick a file or folder.\"                                                                 \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: query stack\r\n  {PushQuery                      0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"push_query\"                  \"Push Query\"                                  \"Opens a new temporary query interface.\"                                                                           \"\"                               \"\"                                                               }\r\n  {CompleteQuery                  0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"complete_query\"              \"Complete Query\"                              \"Completes and closes a query.\"                                                                                    \"\"                               \"\"                                                               }\r\n  {CancelQuery                    0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"cancel_query\"                \"Cancel Query\"                                \"Closes a query.\"                                                                                                  \"\"                               \"\"                                                               }\r\n  {UpdateQuery                    0        0              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"update_query\"                \"Update Query\"                                \"Updates a query input.\"                                                                                           \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: event buffers\r\n  {OpenEventBuffer                0        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"open_event_buffer\"           \"Open Event Buffer\"                           \"Opens a new event buffer, to which debugger events will be written, for external processing.\"                     \"\"                               \"\"                                                               }\r\n  {CloseEventBuffer               0        1              0                0               \"\"                                               Cfg                null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"close_event_buffer\"          \"Close Event Buffer\"                          \"Closes an existing event buffer.\"                                                                                 \"\"                               \"\"                                                               }\r\n  \r\n  //- rjf: developer commands\r\n  {ToggleDevMenu                  1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"toggle_dev_menu\"             \"Toggle Developer Menu\"                       \"Opens and closes the developer menu.\"                                                                             \"\"                               \"\"                                                               }\r\n  {LogMarker                      1        1              0                0               \"\"                                               Null               null              Nil                     Null       0  0  0  0  0  0  0                                                           Null                  \"log_marker\"                  \"Log Marker\"                                  \"Logs a marker in the application log, to denote specific points in time within the log.\"                          \"\"                               \"\"                                                               }\r\n}\r\n\r\n@enum RD_CmdKind:\r\n{\r\n  `Null`,\r\n  @expand(D_CmdTable a) `$(a.name)`,\r\n  @expand(RD_CmdTable, a) `$(a.name)`,\r\n  @expand(RD_WatchTabFastPathTable, a) `Open$(a.name)`,\r\n  @expand(RD_ViewTabFastPathTable, a) `Open$(a.name)`,\r\n  COUNT,\r\n  \r\n  `FirstTabFastPathCmd = RD_CmdKind_OpenWatch`,\r\n}\r\n\r\n@struct RD_Query:\r\n{\r\n  `RD_QueryFlags flags`;\r\n  `RD_RegSlot slot`;\r\n  `String8 expr`;\r\n  `String8 view_name`;\r\n  `CTRL_EntityKind ctrl_entity_kind`;\r\n}\r\n\r\n@struct RD_CmdKindInfo:\r\n{\r\n  `String8 string`;\r\n  `String8 description`;\r\n  `String8 search_tags`;\r\n  `String8 ctx_filter`;\r\n  `RD_CmdKindFlags flags`;\r\n  `RD_Query query`;\r\n};\r\n\r\n@data(RD_CmdKindInfo) @c_file rd_cmd_kind_info_table:\r\n{\r\n  `{0}`,\r\n  @expand(D_CmdTable, a)\r\n    ```{ str8_lit_comp(\"$(a.string)\"), str8_lit_comp(\"$(a.desc)\"), str8_lit_comp(\"$(a.search_tags)\"), str8_lit_comp(\"$(a.ctx_filter)\"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp(\"$(a.q_expr)\"), str8_lit_comp(\"$(a.q_view != 'null' -> a.q_view)\"), CTRL_EntityKind_$(a.q_ctrl_ent_kind)}}```;\r\n  @expand(RD_CmdTable, a)\r\n    ```{ str8_lit_comp(\"$(a.string)\"), str8_lit_comp(\"$(a.desc)\"), str8_lit_comp(\"$(a.search_tags)\"), str8_lit_comp(\"$(a.ctx_filter)\"), (RD_CmdKindFlag_ListInUI*$(a.ui_vis))|(RD_CmdKindFlag_ListInIPCDocs*$(a.ipc_docs_vis))|(RD_CmdKindFlag_ListInTextPt*$(a.text_pt_vis))|(RD_CmdKindFlag_ListInTextRng*$(a.text_rng_vis)), {(RD_QueryFlag_AllowFiles*$(a.q_allow_files))|(RD_QueryFlag_AllowFolders*$(a.q_allow_folders))|(RD_QueryFlag_CodeInput*$(a.q_is_code))|(RD_QueryFlag_KeepOldInput*$(a.q_keep_oi))|(RD_QueryFlag_SelectOldInput*$(a.q_select_oi))|(RD_QueryFlag_Floating*$(a.q_floating))|(RD_QueryFlag_Required*$(a.q_required)), RD_RegSlot_$(a.q_slot), str8_lit_comp(\"$(a.q_expr)\"), str8_lit_comp(\"$(a.q_view != 'null' -> a.q_view)\"), CTRL_EntityKind_$(a.q_ctrl_ent_kind)}}```;\r\n  @expand(RD_WatchTabFastPathTable, a)\r\n    ```{ str8_lit_comp(\"$(a.name_lower)\"), str8_lit_comp(\"Opens a $(a.display_name) tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```;\r\n  @expand(RD_ViewTabFastPathTable, a)\r\n    ```{ str8_lit_comp(\"$(a.name_lower)\"), str8_lit_comp(\"Opens a $(a.display_name) tab.\"), {0}, {0}, RD_CmdKindFlag_ListInUI|RD_CmdKindFlag_ListInIPCDocs|RD_CmdKindFlag_ListInTab}```;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Default Bindings\r\n\r\n@table(name key ctrl shift alt)\r\nRD_DefaultBindingTable:\r\n{\r\n  //- rjf: low-level target control operations\r\n  { \"kill_all\"                    F5        0        shift     0          }\r\n  { \"step_into_inst\"              F11       0        0         alt        }\r\n  { \"step_over_inst\"              F10       0        0         alt        }\r\n  { \"step_out\"                    F11       0        shift     0          }\r\n  { \"halt\"                        X         ctrl     shift     0          }\r\n  { \"halt\"                        Pause     0        0         0          }\r\n  \r\n  //- rjf: high-level composite target control operations\r\n  { \"run\"                         F5        0        0         0          }\r\n  { \"restart\"                     F5        ctrl     shift     0          }\r\n  { \"step_into\"                   F11       0        0         0          }\r\n  { \"step_over\"                   F10       0        0         0          }\r\n  { \"run_to_line\"                 F10       ctrl     0         0          }\r\n  { \"set_next_statement\"          F10       ctrl     shift     0          }\r\n  \r\n  //- rjf: font sizes\r\n  { \"inc_window_font_size\"        Equal     0        0         alt        }\r\n  { \"dec_window_font_size\"        Minus     0        0         alt        }\r\n  \r\n  //- rjf: windows\r\n  { \"window\"                      N         ctrl     shift     0          }\r\n  { \"toggle_fullscreen\"           Return    ctrl     0         0          }\r\n  \r\n  //- rjf: panel splitting\r\n  { \"new_panel_right\"             P         ctrl     0         0          }\r\n  { \"new_panel_down\"              Minus     ctrl     0         0          }\r\n  \r\n  //- rjf: panel rotation\r\n  { \"rotate_panel_columns\"        2         ctrl     0         0          }\r\n  \r\n  //- rjf: focused panel changing\r\n  { \"next_panel\"                  Comma     ctrl     0         0          }\r\n  { \"prev_panel\"                  Comma     ctrl     shift     0          }\r\n  { \"focus_panel_right\"           Right     ctrl     0         alt        }\r\n  { \"focus_panel_left\"            Left      ctrl     0         alt        }\r\n  { \"focus_panel_up\"              Up        ctrl     0         alt        }\r\n  { \"focus_panel_down\"            Down      ctrl     0         alt        }\r\n  \r\n  //- rjf: undo/redo\r\n  { \"undo\"                        Z         ctrl     0         0          }\r\n  { \"redo\"                        Y         ctrl     0         0          }\r\n  \r\n  //- rjf: focus history\r\n  { \"go_back\"                     Left      0        0         alt        }\r\n  { \"go_forward\"                  Right     0        0         alt        }\r\n  \r\n  //- rjf: panel removal\r\n  { \"close_panel\"                 P         ctrl     shift     alt        }\r\n  \r\n  //- rjf: panel tab\r\n  { \"next_tab\"                    PageDown  ctrl     0         0          }\r\n  { \"prev_tab\"                    PageUp    ctrl     0         0          }\r\n  { \"next_tab\"                    Tab       ctrl     0         0          }\r\n  { \"prev_tab\"                    Tab       ctrl     shift     0          }\r\n  { \"move_tab_right\"              PageDown  ctrl     shift     0          }\r\n  { \"move_tab_left\"               PageUp    ctrl     shift     0          }\r\n  { \"close_tab\"                   W         ctrl     0         0          }\r\n  { \"tab_bar_top\"                 Up        ctrl     shift     alt        }\r\n  { \"tab_bar_bottom\"              Down      ctrl     shift     alt        }\r\n  { \"open_tab\"                    T         ctrl     0         0          }\r\n  \r\n  //- rjf: files\r\n  { \"open\"                        O         ctrl     0         0          }\r\n  { \"switch\"                      I         ctrl     0         0          }\r\n  { \"switch_to_partner_file\"      O         0        0         alt        }\r\n  \r\n  //- rjf: setting config paths\r\n  { \"open_user\"                   N         ctrl     shift     alt        }\r\n  { \"open_project\"                N         ctrl     0         alt        }\r\n  { \"open_user\"                   O         ctrl     shift     alt        }\r\n  { \"open_project\"                O         ctrl     0         alt        }\r\n  { \"save_user\"                   S         ctrl     shift     alt        }\r\n  { \"save_project\"                S         ctrl     shift     0          }\r\n  \r\n  //- rjf: meta controls\r\n  { \"edit\"                        F2        0        0         0          }\r\n  { \"accept\"                      Return    0        0         0          }\r\n  { \"accept\"                      Space     0        0         0          }\r\n  { \"cancel\"                      Esc       0        0         0          }\r\n  \r\n  //- rjf: directional movement & text controls\r\n  { \"move_left\"                   Left      0        0         0          }\r\n  { \"move_right\"                  Right     0        0         0          }\r\n  { \"move_up\"                     Up        0        0         0          }\r\n  { \"move_down\"                   Down      0        0         0          }\r\n  { \"move_left_select\"            Left      0        shift     0          }\r\n  { \"move_right_select\"           Right     0        shift     0          }\r\n  { \"move_up_select\"              Up        0        shift     0          }\r\n  { \"move_down_select\"            Down      0        shift     0          }\r\n  { \"move_left_chunk\"             Left      ctrl     0         0          }\r\n  { \"move_right_chunk\"            Right     ctrl     0         0          }\r\n  { \"move_up_chunk\"               Up        ctrl     0         0          }\r\n  { \"move_down_chunk\"             Down      ctrl     0         0          }\r\n  { \"move_up_page\"                PageUp    0        0         0          }\r\n  { \"move_down_page\"              PageDown  0        0         0          }\r\n  { \"move_up_whole\"               Home      ctrl     0         0          }\r\n  { \"move_down_whole\"             End       ctrl     0         0          }\r\n  { \"move_left_chunk_select\"      Left      ctrl     shift     0          }\r\n  { \"move_right_chunk_select\"     Right     ctrl     shift     0          }\r\n  { \"move_up_chunk_select\"        Up        ctrl     shift     0          }\r\n  { \"move_down_chunk_select\"      Down      ctrl     shift     0          }\r\n  { \"move_up_page_select\"         PageUp    0        shift     0          }\r\n  { \"move_down_page_select\"       PageDown  0        shift     0          }\r\n  { \"move_up_whole_select\"        Home      ctrl     shift     0          }\r\n  { \"move_down_whole_select\"      End       ctrl     shift     0          }\r\n  { \"move_up_reorder\"             Up        0        0         alt        }\r\n  { \"move_down_reorder\"           Down      0        0         alt        }\r\n  { \"move_home\"                   Home      0        0         0          }\r\n  { \"move_end\"                    End       0        0         0          }\r\n  { \"move_home_select\"            Home      0        shift     0          }\r\n  { \"move_end_select\"             End       0        shift     0          }\r\n  { \"select_all\"                  A         ctrl     0         0          }\r\n  { \"delete_single\"               Delete    0        0         0          }\r\n  { \"delete_chunk\"                Delete    ctrl     0         0          }\r\n  { \"backspace_single\"            Backspace 0        0         0          }\r\n  { \"backspace_chunk\"             Backspace ctrl     0         0          }\r\n  { \"copy\"                        C         ctrl     0         0          }\r\n  { \"copy\"                        Insert    ctrl     0         0          }\r\n  { \"cut\"                         X         ctrl     0         0          }\r\n  { \"paste\"                       V         ctrl     0         0          }\r\n  { \"paste\"                       Insert    0        shift     0          }\r\n  { \"insert_text\"                 Null      0        0         0          }\r\n  \r\n  //- rjf: secondary navigation\r\n  { \"move_next\"                   Tab       0        0         0          }\r\n  { \"move_prev\"                   Tab       0        shift     0          }\r\n  \r\n  //- rjf: code navigation\r\n  { \"goto_line\"                   G         ctrl     0         0          }\r\n  { \"goto_address\"                G         0        0         alt        }\r\n  { \"search\"                      F         ctrl     0         0          }\r\n  { \"search_backwards\"            R         ctrl     0         0          }\r\n  { \"find_next\"                   F3        0        0         0          }\r\n  { \"find_prev\"                   F3        shift    0         0          }\r\n  \r\n  //- rjf: thread finding\r\n  { \"find_selected_thread\"        F4        0        0         0          }\r\n  \r\n  //- rjf: name finding\r\n  { \"goto_name\"                   J         ctrl     0         0          }\r\n  { \"goto_name_at_cursor\"         F12       0        0         0          }\r\n  \r\n  //- rjf: watch expressions\r\n  { \"toggle_watch_expr_at_cursor\" W         0        0         alt        }\r\n  { \"toggle_watch_expr_at_mouse\"  D         ctrl     0         0          }\r\n  { \"toggle_watch_pin\"            F9        ctrl     0         0          }\r\n  \r\n  //- rjf: breakpoints\r\n  { \"toggle_breakpoint\"           F9        0        0         0          }\r\n  { \"add_address_breakpoint\"      F9        0        shift     0          }\r\n  { \"add_function_breakpoint\"     F9        ctrl     shift     0          }\r\n  \r\n  //- rjf: attaching\r\n  { \"attach\"                      F6        0        shift     0          }\r\n  \r\n  //- rjf: command lister\r\n  { \"open_palette\"                F1        0        0         0          }\r\n  { \"open_palette\"                P         ctrl     shift     0          }\r\n  \r\n  //- rjf: developer commands\r\n  { \"log_marker\"                  M         ctrl     shift     alt        }\r\n  { \"toggle_dev_menu\"             D         ctrl     shift     alt        }\r\n}\r\n\r\n@data(`struct {String8 string; CFG_Binding binding;}`) @c_file rd_default_binding_table:\r\n{\r\n  @expand(RD_DefaultBindingTable a) ```{str8_lit_comp(\"$(a.name)\"), {OS_Key_$(a.key), 0 $(a.ctrl != 0 -> `|OS_Modifier_Ctrl`) $(a.shift != 0 -> `|OS_Modifier_Shift`) $(a.alt != 0 -> `|OS_Modifier_Alt`)}}```;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Binding Version Remap Table\r\n\r\n@table(old_name new_name)\r\nRD_BindingVersionRemapTable:\r\n{\r\n  {\"commands\"     \"run_command\"}\r\n  {\"load_user\"    \"open_user\"}\r\n  {\"load_profile\" \"open_profile\"}\r\n  {\"load_project\" \"open_project\"}\r\n  {\"open_profile\" \"open_project\"}\r\n  {\"address_breakpoint\" \"add_address_breakpoint\"}\r\n  {\"function_breakpoint\" \"add_function_breakpoint\"}\r\n  {\"toggle_breakpoint_cursor\" \"toggle_breakpoint\"}\r\n}\r\n\r\n@data(String8) rd_binding_version_remap_old_name_table:\r\n{\r\n  @expand(RD_BindingVersionRemapTable a) `str8_lit_comp(\"$(a.old_name)\")`\r\n}\r\n\r\n@data(String8) rd_binding_version_remap_new_name_table:\r\n{\r\n  @expand(RD_BindingVersionRemapTable a) `str8_lit_comp(\"$(a.new_name)\")`\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Icons\r\n\r\n@table(name, text)\r\nRD_IconTable:\r\n{\r\n  (Null                     \"\")\r\n  (FolderOpenOutline        \"b\")\r\n  (FolderClosedOutline      \"c\")\r\n  (FolderOpenFilled         \"B\")\r\n  (FolderClosedFilled       \"C\")\r\n  (FileOutline              \"f\")\r\n  (FileFilled               \"F\")\r\n  (Play                     \"g\")\r\n  (PlayStepForward          \"h\")\r\n  (Pause                    \"r\")\r\n  (Stop                     \"s\")\r\n  (Info                     \"i\")\r\n  (WarningSmall             \"w\")\r\n  (WarningBig               \"W\")\r\n  (Unlocked                 \"k\")\r\n  (Locked                   \"K\")\r\n  (LeftArrow                \"L\")\r\n  (RightArrow               \"R\")\r\n  (UpArrow                  \"U\")\r\n  (DownArrow                \"D\")\r\n  (Gear                     \"G\")\r\n  (Pencil                   \"P\")\r\n  (Trash                    \"3\")\r\n  (Pin                      \"p\")\r\n  (RadioHollow              \"O\")\r\n  (RadioFilled              \"o\")\r\n  (CheckHollow              \"!\")\r\n  (CheckFilled              \"1\")\r\n  (Check                    \"V\")\r\n  (LeftCaret                \"<\")\r\n  (RightCaret               \">\")\r\n  (UpCaret                  \"^\")\r\n  (DownCaret                \"v\")\r\n  (UpScroll                 \"9\")\r\n  (DownScroll               \"0\")\r\n  (LeftScroll               \"7\")\r\n  (RightScroll              \"8\")\r\n  (Add                      \"+\")\r\n  (Minus                    \"-\")\r\n  (Thread                   \"'\")\r\n  (Threads                  '\\\\\"')\r\n  (Machine                  \"M\")\r\n  (CircleFilled             \".\")\r\n  (X                        \"x\")\r\n  (Refresh                  \"q\")\r\n  (Undo                     \"j\")\r\n  (Redo                     \"u\")\r\n  (Save                     \"m\")\r\n  (Window                   \"n\")\r\n  (Target                   \"l\")\r\n  (Clipboard                \"a\")\r\n  (Scheduler                \"z\")\r\n  (Module                   \"y\")\r\n  (XSplit                   \"X\")\r\n  (YSplit                   \"Y\")\r\n  (ClosePanel               \"S\")\r\n  (StepInto                 \"T\")\r\n  (StepOver                 \"Z\")\r\n  (StepOut                  \"d\")\r\n  (Find                     \"N\")\r\n  (Palette                  \"E\")\r\n  (Thumbnails               \"H\")\r\n  (Glasses                  \"e\")\r\n  (Binoculars               \"I\")\r\n  (List                     \"J\")\r\n  (Grid                     \"A\")\r\n  (QuestionMark             \"?\")\r\n  (Person                   \"4\")\r\n  (Briefcase                \"5\")\r\n  (Dot                      \"6\")\r\n  (Bitmap                   \"&\")\r\n  (Cube                     \"*\")\r\n  (WindowRestore            \"(\")\r\n  (WindowMinimize           \")\")\r\n  (Duplicate                \"#\")\r\n}\r\n\r\n@enum RD_IconKind:\r\n{\r\n  @expand(RD_IconTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@data(String8) rd_icon_kind_text_table:\r\n{\r\n  @expand(RD_IconTable a) `str8_lit_comp(\"$(a.text)\")`;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Theme Tables\r\n\r\n@table(name_upper  name_lower  display_string  cfg)\r\nRD_ThemePresetTable:\r\n{\r\n  //- rjf: default dark theme\r\n  {\r\n    DefaultDark default_dark \"Default (Dark)\",\r\n    ```theme:\r\n    {\r\n      theme_color: {tags:\"background\",                             value: 0x1b1b1bff }\r\n      theme_color: {tags:\"alt background\",                         value: 0x222222ff }\r\n      theme_color: {tags:\"pop background\",                         value: 0x355b6eff }\r\n      theme_color: {tags:\"fresh background\",                       value: 0x31393dff }\r\n      theme_color: {tags:\"match background\",                       value: 0x31393dff }\r\n      theme_color: {tags:\"border\",                                 value: 0x404040ff }\r\n      theme_color: {tags:\"text\",                                   value: 0xe5e5e5ff }\r\n      theme_color: {tags:\"weak text\",                              value: 0xa4a4a4ff }\r\n      theme_color: {tags:\"good text\",                              value: 0x32a852ff }\r\n      theme_color: {tags:\"neutral text\",                           value: 0x3a90bbff }\r\n      theme_color: {tags:\"bad text\",                               value: 0xcf5242ff }\r\n      theme_color: {tags:\"hover\",                                  value: 0xffffffff }\r\n      theme_color: {tags:\"focus overlay\",                          value: 0xfda20012 }\r\n      theme_color: {tags:\"focus border\",                           value: 0xfda200ff }\r\n      theme_color: {tags:\"cursor\",                                 value: 0x8aff00ff }\r\n      theme_color: {tags:\"selection\",                              value: 0x99ccff0f }\r\n      theme_color: {tags:\"inactive background\",                    value: 0x0000002f }\r\n      theme_color: {tags:\"drop_shadow\",                            value: 0x0000007f }\r\n      theme_color: {tags:\"good_pop background\",                    value: 0x2c5b36ff }\r\n      theme_color: {tags:\"good_pop border\",                        value: 0x568761ff }\r\n      theme_color: {tags:\"good_pop hover\",                         value: 0xe3f5d3ff }\r\n      theme_color: {tags:\"good_pop weak text\",                     value: 0xe3f5d3ff }\r\n      theme_color: {tags:\"bad_pop background\",                     value: 0x803425ff }\r\n      theme_color: {tags:\"bad_pop hover\",                          value: 0xff825cff }\r\n      theme_color: {tags:\"code_default\",                           value: 0xcbcbcbff }\r\n      theme_color: {tags:\"code_symbol\",                            value: 0x42a2cfff }\r\n      theme_color: {tags:\"code_type\",                              value: 0xfec746ff }\r\n      theme_color: {tags:\"code_local\",                             value: 0x98bc80ff }\r\n      theme_color: {tags:\"code_register\",                          value: 0xb7afd5ff }\r\n      theme_color: {tags:\"code_keyword\",                           value: 0xb38d4cff }\r\n      theme_color: {tags:\"code_delimiter_or_operator\",             value: 0x767676ff }\r\n      theme_color: {tags:\"code_numeric\",                           value: 0x98abb1ff }\r\n      theme_color: {tags:\"code_numeric_alt_digit_group\",           value: 0x738287ff }\r\n      theme_color: {tags:\"code_string\",                            value: 0x98abb1ff }\r\n      theme_color: {tags:\"code_meta\",                              value: 0xd96759ff }\r\n      theme_color: {tags:\"code_comment\",                           value: 0x717171ff }\r\n      theme_color: {tags:\"line_info_0\",                            value: 0x4f3022ff }\r\n      theme_color: {tags:\"line_info_1\",                            value: 0x4f3e15ff }\r\n      theme_color: {tags:\"line_info_2\",                            value: 0x434e2aff }\r\n      theme_color: {tags:\"line_info_3\",                            value: 0x36241fff }\r\n      theme_color: {tags:\"line_info_4\",                            value: 0x4f3022ff }\r\n      theme_color: {tags:\"line_info_5\",                            value: 0x4f3e15ff }\r\n      theme_color: {tags:\"line_info_6\",                            value: 0x434e2aff }\r\n      theme_color: {tags:\"line_info_7\",                            value: 0x36241fff }\r\n      theme_color: {tags:\"thread_0\",                               value: 0xffcb7fff }\r\n      theme_color: {tags:\"thread_1\",                               value: 0xb2ff65ff }\r\n      theme_color: {tags:\"thread_2\",                               value: 0xff99e5ff }\r\n      theme_color: {tags:\"thread_3\",                               value: 0x6598ffff }\r\n      theme_color: {tags:\"thread_4\",                               value: 0x65ffcbff }\r\n      theme_color: {tags:\"thread_5\",                               value: 0xff9819ff }\r\n      theme_color: {tags:\"thread_6\",                               value: 0x9932ffff }\r\n      theme_color: {tags:\"thread_7\",                               value: 0x65ff4cff }\r\n      theme_color: {tags:\"thread_unwound\",                         value: 0xb2ccd8ff }\r\n      theme_color: {tags:\"thread_error\",                           value: 0xb23219ff }\r\n      theme_color: {tags:\"breakpoint\",                             value: 0xa72911ff }\r\n      theme_color: {tags:\"floating background\",                    value: 0x1b1b1baf }\r\n      theme_color: {tags:\"floating background alt\",                value: 0x0000005f }\r\n      theme_color: {tags:\"floating background fresh\",              value: 0x31393d5f }\r\n      theme_color: {tags:\"floating border\",                        value: 0xbfbfbf1f }\r\n      theme_color: {tags:\"floating scroll_bar background\",         value: 0x3b3b3b5f }\r\n      theme_color: {tags:\"floating scroll_bar border\",             value: 0x5f5f5f5f }\r\n      theme_color: {tags:\"menu_bar background\",                    value: 0x2b3740ff }\r\n      theme_color: {tags:\"menu_bar border\",                        value: 0x3e4c57ff }\r\n      theme_color: {tags:\"scroll_bar background\",                  value: 0x2b2b2bff }\r\n      theme_color: {tags:\"scroll_bar border\",                      value: 0x3f3f3fff }\r\n      theme_color: {tags:\"implicit background\",                    value: 0x00000000 }\r\n      theme_color: {tags:\"implicit border\",                        value: 0x00000000 }\r\n      theme_color: {tags:\"hollow background\",                      value: 0x00000000 }\r\n      theme_color: {tags:\"hollow border\",                          value: 0xffffff1f }\r\n      theme_color: {tags:\"tab background\",                         value: 0x6f5135ff }\r\n      theme_color: {tags:\"tab border\",                             value: 0x8a6e54ff }\r\n      theme_color: {tags:\"tab inactive background\",                value: 0x2b3740ff }\r\n      theme_color: {tags:\"tab inactive border\",                    value: 0x3e4c57ff }\r\n      theme_color: {tags:\"tab auto background\",                    value: 0x693847ff }\r\n      theme_color: {tags:\"tab auto border\",                        value: 0x9e6274ff }\r\n      theme_color: {tags:\"tab auto inactive background\",           value: 0x2f2633ff }\r\n      theme_color: {tags:\"tab auto inactive border\",               value: 0x685073ff }\r\n      theme_color: {tags:\"drop_site background\",                   value: 0xffffff05 }\r\n      theme_color: {tags:\"drop_site border\",                       value: 0xffffff0f }\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: default light theme\r\n  { DefaultLight     default_light    \"Default (Light)\",\r\n    ```theme:\r\n    {\r\n      theme_color:{  tags: background  , value: 0xffffffff }\r\n      theme_color:{  tags: \"alt background\"  , value: 0xf8f8f8ff }\r\n      theme_color:{  tags: \"pop background\"  , value: 0xcbe4f2ff }\r\n      theme_color:{  tags: \"menu_bar pop background\"  , value: 0x5aabd9ff }\r\n      theme_color:{  tags: \"fresh background\"  , value: 0xeaddceff }\r\n      theme_color:{  tags: \"match background\"  , value: 0xc1e9c4ff }\r\n      theme_color:{  tags: border  , value: 0xcbcbcbff }\r\n      theme_color:{  tags: text  , value: 0xff }\r\n      theme_color:{  tags: \"weak text\"  , value: 0x727272ff }\r\n      theme_color:{  tags: \"good text\"  , value: 0x217538ff }\r\n      theme_color:{  tags: \"neutral text\"  , value: 0x1a5b7cff }\r\n      theme_color:{  tags: \"bad text\"  , value: 0x972717ff }\r\n      theme_color:{  tags: hover  , value: 0xff }\r\n      theme_color:{  tags: \"focus overlay\"  , value: 0x67ff4b }\r\n      theme_color:{  tags: \"focus border\"  , value: 0x67ffff }\r\n      theme_color:{  tags: cursor  , value: 0xff }\r\n      theme_color:{  tags: selection  , value: 0x283d5166 }\r\n      theme_color:{  tags: \"inactive background\"  , value: 0x8 }\r\n      theme_color:{  tags: drop_shadow  , value: 0xb }\r\n      theme_color:{  tags: \"good_pop background\"  , value: 0x90c09aff }\r\n      theme_color:{  tags: \"good_pop border\"  , value: 0x1e7231ff }\r\n      theme_color:{  tags: \"good_pop hover\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"good_pop weak text\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"good_pop text\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"bad_pop background\"  , value: 0xa93620ff }\r\n      theme_color:{  tags: \"bad_pop text\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"bad_pop text weak\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"menu_bar bad_pop background\"  , value: 0xff2a00ff }\r\n      theme_color:{  tags: \"menu_bar bad_pop text\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"bad_pop hover\"  , value: 0xff825cff }\r\n      theme_color:{  tags: code_default  , value: 0x80808ff }\r\n      theme_color:{  tags: code_symbol  , value: 0x4ac3ff }\r\n      theme_color:{  tags: code_type  , value: 0xf46200ff }\r\n      theme_color:{  tags: code_local  , value: 0x317c00ff }\r\n      theme_color:{  tags: code_register  , value: 0x9a00ffff }\r\n      theme_color:{  tags: code_keyword  , value: 0xff0600ff }\r\n      theme_color:{  tags: code_delimiter_or_operator  , value: 0x8a8a8aff }\r\n      theme_color:{  tags: code_numeric  , value: 0x7d49ff }\r\n      theme_color:{  tags: code_numeric_alt_digit_group  , value: 0xb56aff }\r\n      theme_color:{  tags: code_string  , value: 0x63549fff }\r\n      theme_color:{  tags: code_meta  , value: 0xd96759ff }\r\n      theme_color:{  tags: code_comment  , value: 0x717171ff }\r\n      theme_color:{  tags: line_info_0  , value: 0xe6d5cdff }\r\n      theme_color:{  tags: line_info_1  , value: 0xdbcfb2ff }\r\n      theme_color:{  tags: line_info_2  , value: 0xddeac1ff }\r\n      theme_color:{  tags: line_info_3  , value: 0xddc4bdff }\r\n      theme_color:{  tags: line_info_4  , value: 0xba917eff }\r\n      theme_color:{  tags: thread_0  , value: 0xffa700ff }\r\n      theme_color:{  tags: thread_1  , value: 0xb41fff }\r\n      theme_color:{  tags: thread_2  , value: 0xff99e5ff }\r\n      theme_color:{  tags: thread_3  , value: 0x6598ffff }\r\n      theme_color:{  tags: thread_4  , value: 0x65ffcbff }\r\n      theme_color:{  tags: thread_5  , value: 0xff9819ff }\r\n      theme_color:{  tags: thread_6  , value: 0x9932ffff }\r\n      theme_color:{  tags: thread_7  , value: 0x65ff4cff }\r\n      theme_color:{  tags: thread_unwound  , value: 0xb2ccd8ff }\r\n      theme_color:{  tags: thread_error  , value: 0xb23219ff }\r\n      theme_color:{  tags: breakpoint  , value: 0xff2800ff }\r\n      theme_color:{  tags: \"floating background\"  , value: 0xffffffc7 }\r\n      theme_color:{  tags: \"floating background alt\"  , value: 0x23 }\r\n      theme_color:{  tags: \"floating background fresh\"  , value: 0xeaddceff }\r\n      theme_color:{  tags: \"floating border\"  , value: 0x88888884 }\r\n      theme_color:{  tags: \"scroll_bar background\"  , value: 0xe9e9e9ff }\r\n      theme_color:{  tags: \"scroll_bar border\"  , value: 0x5f5f5f5f }\r\n      theme_color:{  tags: \"floating scroll_bar background\"  , value: 0xe9e9e9ff }\r\n      theme_color:{  tags: \"floating scroll_bar border\"  , value: 0x5f5f5f5f }\r\n      theme_color:{  tags: \"menu_bar background\"  , value: 0x2b6b9aff }\r\n      theme_color:{  tags: \"menu_bar border\"  , value: 0x4d }\r\n      theme_color:{  tags: \"menu_bar text\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"menu_bar text weak\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"good menu_bar text\"  , value: 0x70db8dff }\r\n      theme_color:{  tags: \"bad menu_bar text\"  , value: 0xffa79bff }\r\n      theme_color:{  tags: \"neutral menu_bar text\"  , value: 0xc4dbe7ff }\r\n      theme_color:{  tags: \"implicit background\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"implicit border\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"hollow background\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"hollow border\"  , value: 0xffffff1f }\r\n      theme_color:{  tags: \"tab text\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"tab text weak\"  , value: 0xffffffff }\r\n      theme_color:{  tags: \"tab background\"  , value: 0xb67e48ff }\r\n      theme_color:{  tags: \"tab border\"  , value: 0x875b31ff }\r\n      theme_color:{  tags: \"tab inactive background\"  , value: 0xcacacaff }\r\n      theme_color:{  tags: \"tab inactive border\"  , value: 0xb5b5b5ff }\r\n      theme_color:{  tags: \"tab auto background\"  , value: 0xc41c69ff }\r\n      theme_color:{  tags: \"tab auto border\"  , value: 0x981039ff }\r\n      theme_color:{  tags: \"tab auto inactive background\"  , value: 0x9b88a3ff }\r\n      theme_color:{  tags: \"tab auto inactive border\"  , value: 0x373737ff }\r\n      theme_color:{  tags: \"drop_site background\"  , value: 0xffffff05 }\r\n      theme_color:{  tags: \"drop_site border\"  , value: 0xffffff0f }\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: vs dark theme\r\n  {\r\n    VSDark vs_dark \"VS (Dark)\",\r\n    ```theme:\r\n    {\r\n      theme_color:{  tags: background  , value: 0x1f1f1fff }\r\n      theme_color:{  tags: \"alt background\"  , value: 0x222222ff }\r\n      theme_color:{  tags: \"pop background\"  , value: 0x383167ff }\r\n      theme_color:{  tags: \"fresh background\"  , value: 0x31393dff }\r\n      theme_color:{  tags: \"match background\"  , value: 0x31393dff }\r\n      theme_color:{  tags: border  , value: 0x404040ff }\r\n      theme_color:{  tags: text  , value: 0xe5e5e5ff }\r\n      theme_color:{  tags: \"weak text\"  , value: 0xa4a4a4ff }\r\n      theme_color:{  tags: \"good text\"  , value: 0x32a852ff }\r\n      theme_color:{  tags: \"neutral text\"  , value: 0x3a90bbff }\r\n      theme_color:{  tags: \"bad text\"  , value: 0xcf5242ff }\r\n      theme_color:{  tags: hover  , value: 0xffffffff }\r\n      theme_color:{  tags: \"focus overlay\"  , value: 0x7160e81e }\r\n      theme_color:{  tags: \"focus border\"  , value: 0x7160e8ff }\r\n      theme_color:{  tags: cursor  , value: 0x8aff00ff }\r\n      theme_color:{  tags: selection  , value: 0x99ccff0f }\r\n      theme_color:{  tags: \"inactive background\"  , value: 0x0000002f }\r\n      theme_color:{  tags: drop_shadow  , value: 0x0000007f }\r\n      theme_color:{  tags: \"good_pop background\"  , value: 0x2c5b36ff }\r\n      theme_color:{  tags: \"good_pop border\"  , value: 0x568761ff }\r\n      theme_color:{  tags: \"good_pop hover\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"good_pop weak text\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"bad_pop background\"  , value: 0x803425ff }\r\n      theme_color:{  tags: \"bad_pop hover\"  , value: 0xff825cff }\r\n      theme_color:{  tags: code_default  , value: 0xe0e0e0ff }\r\n      theme_color:{  tags: code_symbol  , value: 0xdcdcaaff }\r\n      theme_color:{  tags: code_type  , value: 0x4ec9b0ff }\r\n      theme_color:{  tags: code_local  , value: 0x9cdcfeff }\r\n      theme_color:{  tags: code_register  , value: 0xb7afd5ff }\r\n      theme_color:{  tags: code_keyword  , value: 0x569cd6ff }\r\n      theme_color:{  tags: code_delimiter_or_operator  , value: 0x767676ff }\r\n      theme_color:{  tags: code_numeric  , value: 0xb5cea8ff }\r\n      theme_color:{  tags: code_numeric_alt_digit_group  , value: 0x7c986dff }\r\n      theme_color:{  tags: code_string  , value: 0xd69d85ff }\r\n      theme_color:{  tags: code_meta  , value: 0x9b9b9bff }\r\n      theme_color:{  tags: code_comment  , value: 0x51a644ff }\r\n      theme_color:{  tags: line_info_0  , value: 0x4f3022ff }\r\n      theme_color:{  tags: line_info_1  , value: 0x4f3e15ff }\r\n      theme_color:{  tags: line_info_2  , value: 0x434e2aff }\r\n      theme_color:{  tags: line_info_3  , value: 0x36241fff }\r\n      theme_color:{  tags: line_info_4  , value: 0x4f3022ff }\r\n      theme_color:{  tags: line_info_5  , value: 0x4f3e15ff }\r\n      theme_color:{  tags: line_info_6  , value: 0x434e2aff }\r\n      theme_color:{  tags: line_info_7  , value: 0x36241fff }\r\n      theme_color:{  tags: thread_0  , value: 0xffdc48ff }\r\n      theme_color:{  tags: thread_1  , value: 0xb2ff65ff }\r\n      theme_color:{  tags: thread_2  , value: 0xff99e5ff }\r\n      theme_color:{  tags: thread_3  , value: 0x6598ffff }\r\n      theme_color:{  tags: thread_4  , value: 0x65ffcbff }\r\n      theme_color:{  tags: thread_5  , value: 0xff9819ff }\r\n      theme_color:{  tags: thread_6  , value: 0x9932ffff }\r\n      theme_color:{  tags: thread_7  , value: 0x65ff4cff }\r\n      theme_color:{  tags: thread_unwound  , value: 0xb2ccd8ff }\r\n      theme_color:{  tags: thread_error  , value: 0xb23219ff }\r\n      theme_color:{  tags: breakpoint  , value: 0xa72911ff }\r\n      theme_color:{  tags: \"floating background\"  , value: 0x1b1b1baf }\r\n      theme_color:{  tags: \"floating background alt\"  , value: 0x0000005f }\r\n      theme_color:{  tags: \"floating background fresh\"  , value: 0x31393d5f }\r\n      theme_color:{  tags: \"floating border\"  , value: 0xbfbfbf1f }\r\n      theme_color:{  tags: \"floating scroll_bar background\"  , value: 0x3b3b3b5f }\r\n      theme_color:{  tags: \"floating scroll_bar border\"  , value: 0x5f5f5f5f }\r\n      theme_color:{  tags: \"scroll_bar background\"  , value: 0x2b2b2bff }\r\n      theme_color:{  tags: \"scroll_bar border\"  , value: 0x3f3f3fff }\r\n      theme_color:{  tags: \"implicit background\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"implicit border\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"hollow background\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"hollow border\"  , value: 0xffffff1f }\r\n      theme_color:{  tags: \"tab background\"  , value: 0x333333ff }\r\n      theme_color:{  tags: \"tab border\"  , value: 0x7160e8ff }\r\n      theme_color:{  tags: \"tab inactive background\"  , value: 0x171717ff }\r\n      theme_color:{  tags: \"tab inactive border\"  , value: 0x3e4c57ff }\r\n      theme_color:{  tags: \"tab auto background\"  , value: 0x3f386dff }\r\n      theme_color:{  tags: \"tab auto border\"  , value: 0x7160e8ff }\r\n      theme_color:{  tags: \"tab auto inactive background\"  , value: 0x2f2633ff }\r\n      theme_color:{  tags: \"tab auto inactive border\"  , value: 0x685073ff }\r\n      theme_color:{  tags: \"drop_site background\"  , value: 0xffffff05 }\r\n      theme_color:{  tags: \"drop_site border\"  , value: 0xffffff0f }\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: to-do\r\n  { VSLight          vs_light         \"VS (Light)\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background, value: 0xffffffff}\r\n      theme_color:{tags: \"alt background\", value: 0xefefefff}\r\n      theme_color:{tags: \"pop background\", value: 0xe3eaf2ff}\r\n      theme_color:{tags: \"fresh background\", value: 0xeccbbeff}\r\n      theme_color:{tags: \"match background\", value: 0xedcbf9ff}\r\n      theme_color:{tags: border, value: 0xe7e7e7ff}\r\n      theme_color:{tags: text, value: 0xff}\r\n      theme_color:{tags: \"weak text\", value: 0x353535ff}\r\n      theme_color:{tags: \"good text\", value: 0x32a852ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\r\n      theme_color:{tags: \"bad text\", value: 0xcf5242ff}\r\n      theme_color:{tags: hover, value: 0xa7ffff}\r\n      theme_color:{tags: \"focus overlay\", value: 0x8eff3f}\r\n      theme_color:{tags: \"focus border\", value: 0x8effff}\r\n      theme_color:{tags: cursor, value: 0xff}\r\n      theme_color:{tags: selection, value: 0x56aaff77}\r\n      theme_color:{tags: \"inactive background\", value: 0x17}\r\n      theme_color:{tags: drop_shadow, value: 0xe7b27}\r\n      theme_color:{tags: \"good_pop background\", value: 0x21a43dff}\r\n      theme_color:{tags: \"good_pop border\", value: 0x21a43dff}\r\n      theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"good_pop text\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0xcb3f23ff}\r\n      theme_color:{tags: \"bad_pop text\", value: 0xffcdc4ff}\r\n      theme_color:{tags: \"bad_pop text weak\", value: 0xffcdc4ff}\r\n      theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\r\n      theme_color:{tags: code_default, value: 0x000000ff}\r\n      theme_color:{tags: code_symbol, value: 0x74531fff}\r\n      theme_color:{tags: code_type, value: 0x2b91afff}\r\n      theme_color:{tags: code_local, value: 0x1f377fff}\r\n      theme_color:{tags: code_register, value: 0x8a1bffff}\r\n      theme_color:{tags: code_keyword, value: 0x0000ffff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\r\n      theme_color:{tags: code_numeric, value: 0xff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0x1d1d1dff}\r\n      theme_color:{tags: code_string, value: 0xa61515ff}\r\n      theme_color:{tags: code_meta, value: 0x808080ff}\r\n      theme_color:{tags: code_comment, value: 0x008000ff}\r\n      theme_color:{tags: line_info_0, value: 0xb5d9c8ff}\r\n      theme_color:{tags: line_info_1, value: 0xa9c1d0ff}\r\n      theme_color:{tags: line_info_2, value: 0x99abc5ff}\r\n      theme_color:{tags: line_info_3, value: 0xc6bcd5ff}\r\n      theme_color:{tags: thread_0, value: 0xffb141ff}\r\n      theme_color:{tags: thread_1, value: 0x66c407ff}\r\n      theme_color:{tags: thread_unwound, value: 0x67b3d7ff}\r\n      theme_color:{tags: thread_error, value: 0xff2900ff}\r\n      theme_color:{tags: breakpoint, value: 0xff2800ff}\r\n      theme_color:{tags: \"floating background\", value: 0xffffffff}\r\n      theme_color:{tags: \"floating background alt\", value: 0x11}\r\n      theme_color:{tags: \"floating background fresh\", value: 0xa0c2d318}\r\n      theme_color:{tags: \"floating border\", value: 0x50}\r\n      theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\r\n      theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\r\n      theme_color:{tags: \"menu_bar background\", value: 0xccd5f0ff}\r\n      theme_color:{tags: \"menu_bar border\", value: 0xbabdc3ff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0xe4e4e4ff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0xf5cc84ff}\r\n      theme_color:{tags: \"tab border\", value: 0xae7718ff}\r\n      theme_color:{tags: \"tab inactive background\", value: 0x3b4f81ff}\r\n      theme_color:{tags: \"tab inactive text\", value: 0xffffffff}\r\n      theme_color:{tags: \"tab inactive border\", value: 0x3b4f81ff}\r\n      theme_color:{tags: \"tab auto background\", value: 0xe99595ff}\r\n      theme_color:{tags: \"tab auto border\", value: 0xff6262ff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0xac6060ff}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0xff6262ff}\r\n      theme_color:{tags: \"drop_site background\", value: 0xffffff05}\r\n      theme_color:{tags: \"drop_site border\", value: 0xa7ffff}\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: solarized (dark) theme\r\n  { SolarizedDark    solarized_dark   \"Solarized (Dark)\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background, value: 0x002a35ff}\r\n      theme_color:{tags: \"alt background\", value: 0x053542ff}\r\n      theme_color:{tags: \"pop background\", value: 0x355b6eff}\r\n      theme_color:{tags: \"fresh background\", value: 0x31393dff}\r\n      theme_color:{tags: \"match background\", value: 0x31393dff}\r\n      theme_color:{tags: border, value: 0x65166ff}\r\n      theme_color:{tags: text, value: 0xeee8d5ff}\r\n      theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\r\n      theme_color:{tags: \"good text\", value: 0x32a852ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\r\n      theme_color:{tags: \"bad text\", value: 0xcf5242ff}\r\n      theme_color:{tags: hover, value: 0xca4b16ff}\r\n      theme_color:{tags: \"focus overlay\", value: 0xca4b151f}\r\n      theme_color:{tags: \"focus border\", value: 0xca4b16ff}\r\n      theme_color:{tags: cursor, value: 0xca4b16ff}\r\n      theme_color:{tags: selection, value: 0x99ccff0f}\r\n      theme_color:{tags: \"inactive background\", value: 0x0000002f}\r\n      theme_color:{tags: drop_shadow, value: 0x0000007f}\r\n      theme_color:{tags: \"good_pop background\", value: 0x5f8700ff}\r\n      theme_color:{tags: \"good_pop border\", value: 0x5f8700ff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0x810000ff}\r\n      theme_color:{tags: code_default, value: 0x839496ff}\r\n      theme_color:{tags: code_symbol, value: 0xb3880eff}\r\n      theme_color:{tags: code_type, value: 0xb3880eff}\r\n      theme_color:{tags: code_local, value: 0xeee8d5ff}\r\n      theme_color:{tags: code_register, value: 0xeee8d5ff}\r\n      theme_color:{tags: code_keyword, value: 0x849804ff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\r\n      theme_color:{tags: code_numeric, value: 0x2aa198ff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\r\n      theme_color:{tags: code_string, value: 0x2aa198ff}\r\n      theme_color:{tags: code_meta, value: 0xca4b16ff}\r\n      theme_color:{tags: code_comment, value: 0x586e75ff}\r\n      theme_color:{tags: line_info_0, value: 0x4f3022ff}\r\n      theme_color:{tags: line_info_1, value: 0x4f3e15ff}\r\n      theme_color:{tags: line_info_2, value: 0x434e2aff}\r\n      theme_color:{tags: line_info_3, value: 0x36241fff}\r\n      theme_color:{tags: thread_0, value: 0xffcb7fff}\r\n      theme_color:{tags: thread_1, value: 0xb2ff65ff}\r\n      theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\r\n      theme_color:{tags: thread_error, value: 0xb23219ff}\r\n      theme_color:{tags: breakpoint, value: 0xa72911ff}\r\n      theme_color:{tags: \"floating background\", value: 0x2a3574}\r\n      theme_color:{tags: \"floating background alt\", value: 0x4f}\r\n      theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\r\n      theme_color:{tags: \"floating scroll_bar background\", value: 0x53542ff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0x53542ff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0x586e75ff}\r\n      theme_color:{tags: \"tab border\", value: 0x90abb3ff}\r\n      theme_color:{tags: \"tab inactive background\", value: 0x0}\r\n      theme_color:{tags: \"tab inactive border\", value: 0x33494fff}\r\n      theme_color:{tags: \"tab auto background\", value: 0x565ed2ff}\r\n      theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\r\n      theme_color:{tags: \"drop_site background\", value: 0xffffff05}\r\n      theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: solarized light\r\n  { SolarizedLight   solarized_light  \"Solarized (Light)\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background, value: 0xfdf6e3ff}\r\n      theme_color:{tags: \"alt background\", value: 0xeee8d5ff}\r\n      theme_color:{tags: \"pop background\", value: 0x29a19890}\r\n      theme_color:{tags: \"fresh background\", value: 0xf7d38dff}\r\n      theme_color:{tags: \"match background\", value: 0xdcddddff}\r\n      theme_color:{tags: border, value: 0xd1ccbdff}\r\n      theme_color:{tags: \"weak text\", value: 0x93a1a1ff}\r\n      theme_color:{tags: text, value: 0x657b83ff}\r\n      theme_color:{tags: \"good text\", value: 0x32a852ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\r\n      theme_color:{tags: \"bad text\", value: 0xcf5242ff}\r\n      theme_color:{tags: hover, value: 0xca4b16ff}\r\n      theme_color:{tags: \"focus overlay\", value: 0xca4b1454}\r\n      theme_color:{tags: \"focus border\", value: 0xca4b16ff}\r\n      theme_color:{tags: cursor, value: 0xca4b16ff}\r\n      theme_color:{tags: selection, value: 0x8594a264}\r\n      theme_color:{tags: \"inactive background\", value: 0x14}\r\n      theme_color:{tags: drop_shadow, value: 0x3a}\r\n      theme_color:{tags: \"good_pop background\", value: 0xd1e99aff}\r\n      theme_color:{tags: \"good_pop border\", value: 0xd1e99aff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0xd26c6cff}\r\n      theme_color:{tags: \"bad_pop border\", value: 0xd26c6cff}\r\n      theme_color:{tags: \"bad_pop weak text\", value: 0xffffffff}\r\n      theme_color:{tags: \"bad_pop text\", value: 0xffffffff}\r\n      theme_color:{tags: code_default, value: 0x839496ff}\r\n      theme_color:{tags: code_symbol, value: 0xb3880eff}\r\n      theme_color:{tags: code_type, value: 0xb3880eff}\r\n      theme_color:{tags: code_local, value: 0x657b83ff}\r\n      theme_color:{tags: code_register, value: 0x947298ff}\r\n      theme_color:{tags: code_keyword, value: 0x849804ff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0x839496ff}\r\n      theme_color:{tags: code_numeric, value: 0x2aa198ff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0x19766bff}\r\n      theme_color:{tags: code_string, value: 0x2aa198ff}\r\n      theme_color:{tags: code_meta, value: 0xca4b16ff}\r\n      theme_color:{tags: code_comment, value: 0x586e75ff}\r\n      theme_color:{tags: line_info_0, value: 0xeee1dbff}\r\n      theme_color:{tags: line_info_1, value: 0xe5d5b1ff}\r\n      theme_color:{tags: line_info_2, value: 0xd9e8b6ff}\r\n      theme_color:{tags: line_info_3, value: 0xf5d5ccff}\r\n      theme_color:{tags: thread_0, value: 0xffa100ff}\r\n      theme_color:{tags: thread_1, value: 0x6edd00ff}\r\n      theme_color:{tags: thread_unwound, value: 0x708f9eff}\r\n      theme_color:{tags: thread_error, value: 0xff5231ff}\r\n      theme_color:{tags: breakpoint, value: 0xff411dff}\r\n      theme_color:{tags: \"floating background\", value: 0xfdf6e3b1}\r\n      theme_color:{tags: \"floating background alt\", value: 0x22}\r\n      theme_color:{tags: \"floating background fresh\", value: 0xf7d38dff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0xeee6d0ff}\r\n      theme_color:{tags: \"scroll_bar floating background\", value: 0xd5ccb5ff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0xfdf6e3ff}\r\n      theme_color:{tags: \"tab inactive background\", value: 0xe0d6bbff}\r\n      theme_color:{tags: \"tab auto background\", value: 0xf5cfe1ff}\r\n      theme_color:{tags: \"tab auto border\", value: 0xa2a6dfff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0xc8a5b5ff}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0x595fbcff}\r\n      theme_color:{tags: \"drop_site background\", value: 0x29a19890}\r\n      theme_color:{tags: \"drop_site border\", value: 0x81ddd690}\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: handmade hero theme\r\n  { HandmadeHero     handmade_hero    \"Handmade Hero\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background, value: 0x0c0c0cff}\r\n      theme_color:{tags: \"alt background\", value: 0x161616ff}\r\n      theme_color:{tags: \"pop background\", value: 0x355b6eff}\r\n      theme_color:{tags: \"fresh background\", value: 0x31393dff}\r\n      theme_color:{tags: \"match background\", value: 0x31393dff}\r\n      theme_color:{tags: border, value: 0x404040ff}\r\n      theme_color:{tags: text, value: 0xcac1b6ff}\r\n      theme_color:{tags: \"weak text\", value: 0xa08563ff}\r\n      theme_color:{tags: \"good text\", value: 0x32a852ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\r\n      theme_color:{tags: \"bad text\", value: 0xcf5242ff}\r\n      theme_color:{tags: hover, value: 0xffffffff}\r\n      theme_color:{tags: \"focus overlay\", value: 0x7485971e}\r\n      theme_color:{tags: \"focus border\", value: 0x5e6b79ff}\r\n      theme_color:{tags: cursor, value: 0x00ee00ff}\r\n      theme_color:{tags: selection, value: 0x99ccff0f}\r\n      theme_color:{tags: \"inactive background\", value: 0x0000002f}\r\n      theme_color:{tags: drop_shadow, value: 0x0000007f}\r\n      theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\r\n      theme_color:{tags: \"good_pop border\", value: 0x568761ff}\r\n      theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\r\n      theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\r\n      theme_color:{tags: code_default, value: 0xa08563ff}\r\n      theme_color:{tags: code_symbol, value: 0xcc5735ff}\r\n      theme_color:{tags: code_type, value: 0xd8a51cff}\r\n      theme_color:{tags: code_local, value: 0xd6b995ff}\r\n      theme_color:{tags: code_register, value: 0xc04047ff}\r\n      theme_color:{tags: code_keyword, value: 0xac7b0aff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0x907553ff}\r\n      theme_color:{tags: code_numeric, value: 0x6b8e23ff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0x4f681cff}\r\n      theme_color:{tags: code_string, value: 0x6b8e23ff}\r\n      theme_color:{tags: code_meta, value: 0xdab98fff}\r\n      theme_color:{tags: code_comment, value: 0x686868ff}\r\n      theme_color:{tags: line_info_0, value: 0x4f3022ff}\r\n      theme_color:{tags: line_info_1, value: 0x4f3e15ff}\r\n      theme_color:{tags: line_info_2, value: 0x434e2aff}\r\n      theme_color:{tags: line_info_3, value: 0x36241fff}\r\n      theme_color:{tags: thread_0, value: 0xffcb7fff}\r\n      theme_color:{tags: thread_1, value: 0xb2ff65ff}\r\n      theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\r\n      theme_color:{tags: thread_error, value: 0xb23219ff}\r\n      theme_color:{tags: breakpoint, value: 0xa72911ff}\r\n      theme_color:{tags: \"floating background\", value: 0x18181980}\r\n      theme_color:{tags: \"floating background alt\", value: 0x0000005f}\r\n      theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\r\n      theme_color:{tags: \"floating border\", value: 0xbfbfbf1f}\r\n      theme_color:{tags: \"floating scroll_bar background\", value: 0x3b3b3b5f}\r\n      theme_color:{tags: \"floating scroll_bar border\", value: 0x5f5f5f5f}\r\n      theme_color:{tags: \"menu_bar background\", value: 0x1f1f27ff}\r\n      theme_color:{tags: \"menu_bar border\", value: 0x3d3d47ff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0x2b2b2bff}\r\n      theme_color:{tags: \"scroll_bar border\", value: 0x3f3f3fff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0x1f1f27ff}\r\n      theme_color:{tags: \"tab border\", value: 0x3d3d47ff}\r\n      theme_color:{tags: \"tab text\", value: 0xca9301ff}\r\n      theme_color:{tags: \"tab text weak\", value: 0x8c690eff}\r\n      theme_color:{tags: \"tab inactive background\", value: 0x171718ff}\r\n      theme_color:{tags: \"tab inactive border\", value: 0x1f1f27ff}\r\n      theme_color:{tags: \"tab auto background\", value: 0x243b38ff}\r\n      theme_color:{tags: \"tab auto border\", value: 0x478980ff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0x102623ff}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0x1e5850ff}\r\n      theme_color:{tags: \"drop_site background\", value: 0xffffff05}\r\n      theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: naysayer\r\n  { Naysayer        naysayer        \"Naysayer\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background, value: 0x042327ff}\r\n      theme_color:{tags: \"alt background\", value: 0x11b1fff}\r\n      theme_color:{tags: \"pop background\", value: 0x355b6eff}\r\n      theme_color:{tags: \"pop text\", value: 0xbad7e6ff}\r\n      theme_color:{tags: \"fresh background\", value: 0x31393dff}\r\n      theme_color:{tags: \"match background\", value: 0x31393dff}\r\n      theme_color:{tags: border, value: 0x334d50ff}\r\n      theme_color:{tags: text, value: 0xdad3beff}\r\n      theme_color:{tags: \"weak text\", value: 0xb0a688ff}\r\n      theme_color:{tags: \"good text\", value: 0x32a852ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\r\n      theme_color:{tags: \"bad text\", value: 0xcf5242ff}\r\n      theme_color:{tags: \"menu_bar good text\", value: 0x2a8242ff}\r\n      theme_color:{tags: \"menu_bar neutral text\", value: 0x5681ff}\r\n      theme_color:{tags: \"menu_bar bad text\", value: 0xa21200ff}\r\n      theme_color:{tags: \"menu_bar weak text\", value: 0x313131ff}\r\n      theme_color:{tags: \"menu_bar bad_pop text weak\", value: 0xffffffff}\r\n      theme_color:{tags: hover, value: 0xffffffff}\r\n      theme_color:{tags: \"focus overlay\", value: 0x86e08e20}\r\n      theme_color:{tags: \"focus border\", value: 0x86e08fff}\r\n      theme_color:{tags: cursor, value: 0x86e08fff}\r\n      theme_color:{tags: selection, value: 0x99ccff0f}\r\n      theme_color:{tags: \"inactive background\", value: 0x0000002f}\r\n      theme_color:{tags: drop_shadow, value: 0x0000007f}\r\n      theme_color:{tags: \"good_pop background\", value: 0x2c5b36ff}\r\n      theme_color:{tags: \"good_pop border\", value: 0x568761ff}\r\n      theme_color:{tags: \"good_pop hover\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"good_pop weak text\", value: 0xe3f5d3ff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0x803425ff}\r\n      theme_color:{tags: \"bad_pop hover\", value: 0xff825cff}\r\n      theme_color:{tags: code_default, value: 0xbdb395ff}\r\n      theme_color:{tags: code_symbol, value: 0xcbe0f5ff}\r\n      theme_color:{tags: code_type, value: 0xcbe0f5ff}\r\n      theme_color:{tags: code_local, value: 0xd9cfb3ff}\r\n      theme_color:{tags: code_register, value: 0xb7afd5ff}\r\n      theme_color:{tags: code_keyword, value: 0x9de3c0ff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0x767676ff}\r\n      theme_color:{tags: code_numeric, value: 0x2ca198ff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0x217770ff}\r\n      theme_color:{tags: code_string, value: 0x2ca198ff}\r\n      theme_color:{tags: code_meta, value: 0xB0FFB0ff}\r\n      theme_color:{tags: code_comment, value: 0x31b72cff}\r\n      theme_color:{tags: line_info_0, value: 0x4f3022ff}\r\n      theme_color:{tags: line_info_1, value: 0x4f3e15ff}\r\n      theme_color:{tags: line_info_2, value: 0x434e2aff}\r\n      theme_color:{tags: line_info_3, value: 0x36241fff}\r\n      theme_color:{tags: thread_0, value: 0xffcb7fff}\r\n      theme_color:{tags: thread_1, value: 0xb2ff65ff}\r\n      theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\r\n      theme_color:{tags: thread_error, value: 0xb23219ff}\r\n      theme_color:{tags: breakpoint, value: 0xa72911ff}\r\n      theme_color:{tags: \"floating background\", value: 0x3232792}\r\n      theme_color:{tags: \"floating background alt\", value: 0x0000005f}\r\n      theme_color:{tags: \"floating background fresh\", value: 0x31393d5f}\r\n      theme_color:{tags: \"floating scroll_bar background\", value: 0xe363bff}\r\n      theme_color:{tags: \"menu_bar background\", value: 0xb59e7aff}\r\n      theme_color:{tags: \"menu_bar text\", value: 0xff}\r\n      theme_color:{tags: \"menu_bar border\", value: 0x947d5aff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0xe363bff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0x13533aff}\r\n      theme_color:{tags: \"tab border\", value: 0x6c9182ff}\r\n      theme_color:{tags: \"tab inactive background\", value: 0x0}\r\n      theme_color:{tags: \"tab inactive border\", value: 0x947d5a6c}\r\n      theme_color:{tags: \"tab auto background\", value: 0x5b3939ff}\r\n      theme_color:{tags: \"tab auto border\", value: 0x875c5cff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0x251b1bff}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0x563d3dff}\r\n      theme_color:{tags: \"drop_site background\", value: 0xffffff05}\r\n      theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: 4coder theme\r\n  { FourCoder        four_coder       \"4coder\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background,value: 0xc0c0cff}\r\n      theme_color:{tags: \"alt background\", value: 0x131313ff}\r\n      theme_color:{tags: \"pop background\", value: 0x4c00ff}\r\n      theme_color:{tags: \"fresh background\", value: 0x4c00ff}\r\n      theme_color:{tags: \"match background\", value: 0x4c00ff}\r\n      theme_color:{tags: border, value: 0x272727ff}\r\n      theme_color:{tags: text, value: 0x90b080ff}\r\n      theme_color:{tags: \"weak text\", value: 0x6b845fff}\r\n      theme_color:{tags: \"menu_bar background\", value: 0x888888ff}\r\n      theme_color:{tags: \"menu_bar text\", value: 0x20202ff}\r\n      theme_color:{tags: \"menu_bar text weak\", value: 0x525252ff}\r\n      theme_color:{tags: \"good text\", value: 0x32a852ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x3a90bbff}\r\n      theme_color:{tags: \"bad text\", value: 0xcf5242ff}\r\n      theme_color:{tags: hover, value: 0xee00ff}\r\n      theme_color:{tags: \"focus overlay\", value: 0xee0012}\r\n      theme_color:{tags: \"focus border\", value: 0x00ee00ff}\r\n      theme_color:{tags: cursor, value: 0x00ee00ff}\r\n      theme_color:{tags: selection, value: 0x99ccff0f}\r\n      theme_color:{tags: \"inactive background\", value: 0x0000002f}\r\n      theme_color:{tags: drop_shadow, value: 0x0000007f}\r\n      theme_color:{tags: \"good_pop background\", value: 0x4900ff}\r\n      theme_color:{tags: \"good_pop border\", value: 0x4900ff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0x430b00ff}\r\n      theme_color:{tags: code_default, value: 0x90b080ff}\r\n      theme_color:{tags: code_symbol, value: 0xbfd9b2ff}\r\n      theme_color:{tags: code_type, value: 0xbfd9b2ff}\r\n      theme_color:{tags: code_local, value: 0xbfd9b2ff}\r\n      theme_color:{tags: code_register, value: 0xb84cffff}\r\n      theme_color:{tags: code_keyword, value: 0xd08f1fff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0x90b080ff}\r\n      theme_color:{tags: code_numeric, value: 0x50ff2fff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0x30af18ff}\r\n      theme_color:{tags: code_string, value: 0x50ff2fff}\r\n      theme_color:{tags: code_meta, value: 0x90b080ff}\r\n      theme_color:{tags: code_comment, value: 0x1f90f0ff}\r\n      theme_color:{tags: line_info_0, value: 0xa253dff}\r\n      theme_color:{tags: line_info_1, value: 0x9103dff}\r\n      theme_color:{tags: line_info_2, value: 0x1e083dff}\r\n      theme_color:{tags: line_info_3, value: 0x1e083dff}\r\n      theme_color:{tags: thread_0, value: 0xd08f1fff}\r\n      theme_color:{tags: thread_1, value: 0x1ea5d0ff}\r\n      theme_color:{tags: thread_unwound, value: 0xb2ccd8ff}\r\n      theme_color:{tags: thread_error, value: 0xb23219ff}\r\n      theme_color:{tags: breakpoint, value: 0xa72911ff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0x1d1d1dff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0x15490cff}\r\n      theme_color:{tags: \"tab border\", value: 0x15490cff}\r\n      theme_color:{tags: \"tab text\", value: 0x90b080ff}\r\n      theme_color:{tags: \"tab text weak\", value: 0x90b080ff}\r\n      theme_color:{tags: \"tab inactive background\", value: 0x21321eff}\r\n      theme_color:{tags: \"tab inactive border\", value: 0x21321eff}\r\n      theme_color:{tags: \"tab auto background\", value: 0x674f3eff}\r\n      theme_color:{tags: \"tab auto border\", value: 0x674f3eff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0x47382eff}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0x47382eff}\r\n      theme_color:{tags: \"drop_site background\", value: 0xffffff05}\r\n      theme_color:{tags: \"drop_site border\", value: 0xffffff0f}\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: grove theme\r\n  { Grove            grove            \"Grove\",\r\n    ```theme:\r\n    {\r\n      theme_color:{  tags: background  , value: 0x1b1f22ff }\r\n      theme_color:{  tags: \"alt background\"  , value: 0x232929ff }\r\n      theme_color:{  tags: \"pop background\"  , value: 0x2f4838ff }\r\n      theme_color:{  tags: \"fresh background\"  , value: 0x31393dff }\r\n      theme_color:{  tags: \"match background\"  , value: 0x31393dff }\r\n      theme_color:{  tags: border  , value: 0x485347ff }\r\n      theme_color:{  tags: text  , value: 0xffffffff }\r\n      theme_color:{  tags: \"weak text\"  , value: 0xa2a2a2ff }\r\n      theme_color:{  tags: \"good text\"  , value: 0x32a852ff }\r\n      theme_color:{  tags: \"neutral text\"  , value: 0x3a90bbff }\r\n      theme_color:{  tags: \"bad text\"  , value: 0xcf5242ff }\r\n      theme_color:{  tags: hover  , value: 0xffffffff }\r\n      theme_color:{  tags: \"focus overlay\"  , value: 0xfda20012 }\r\n      theme_color:{  tags: \"focus border\"  , value: 0xfda200ff }\r\n      theme_color:{  tags: cursor  , value: 0x8aff00ff }\r\n      theme_color:{  tags: selection  , value: 0x99ccff0f }\r\n      theme_color:{  tags: \"inactive background\"  , value: 0x0 }\r\n      theme_color:{  tags: drop_shadow  , value: 0x0000007f }\r\n      theme_color:{  tags: \"good_pop background\"  , value: 0x2c5b36ff }\r\n      theme_color:{  tags: \"good_pop border\"  , value: 0x568761ff }\r\n      theme_color:{  tags: \"good_pop hover\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"good_pop weak text\"  , value: 0xe3f5d3ff }\r\n      theme_color:{  tags: \"bad_pop background\"  , value: 0x803425ff }\r\n      theme_color:{  tags: \"bad_pop hover\"  , value: 0xff825cff }\r\n      theme_color:{  tags: code_default  , value: 0xad8b69ff }\r\n      theme_color:{  tags: code_symbol  , value: 0x87ad6aff }\r\n      theme_color:{  tags: code_type  , value: 0xb67474ff }\r\n      theme_color:{  tags: code_local  , value: 0xe9bf95ff }\r\n      theme_color:{  tags: code_register  , value: 0xa688b2ff }\r\n      theme_color:{  tags: code_keyword  , value: 0xe49e17ff }\r\n      theme_color:{  tags: code_delimiter_or_operator  , value: 0x795e43ff }\r\n      theme_color:{  tags: code_numeric  , value: 0x98b19eff }\r\n      theme_color:{  tags: code_numeric_alt_digit_group  , value: 0x688b71ff }\r\n      theme_color:{  tags: code_string  , value: 0x98b19eff }\r\n      theme_color:{  tags: code_meta  , value: 0xad5979ff }\r\n      theme_color:{  tags: code_comment  , value: 0x52675dff }\r\n      theme_color:{  tags: line_info_0  , value: 0x4f3022ff }\r\n      theme_color:{  tags: line_info_1  , value: 0x4f3e15ff }\r\n      theme_color:{  tags: line_info_2  , value: 0x434e2aff }\r\n      theme_color:{  tags: line_info_3  , value: 0x36241fff }\r\n      theme_color:{  tags: line_info_4  , value: 0x4f3022ff }\r\n      theme_color:{  tags: line_info_5  , value: 0x4f3e15ff }\r\n      theme_color:{  tags: line_info_6  , value: 0x434e2aff }\r\n      theme_color:{  tags: line_info_7  , value: 0x36241fff }\r\n      theme_color:{  tags: thread_0  , value: 0xffc258ff }\r\n      theme_color:{  tags: thread_1  , value: 0x82d331ff }\r\n      theme_color:{  tags: thread_2  , value: 0xff99e5ff }\r\n      theme_color:{  tags: thread_3  , value: 0x6598ffff }\r\n      theme_color:{  tags: thread_4  , value: 0x65ffcbff }\r\n      theme_color:{  tags: thread_5  , value: 0xff9819ff }\r\n      theme_color:{  tags: thread_6  , value: 0x9932ffff }\r\n      theme_color:{  tags: thread_7  , value: 0x65ff4cff }\r\n      theme_color:{  tags: thread_unwound  , value: 0xb2ccd8ff }\r\n      theme_color:{  tags: thread_error  , value: 0xb23219ff }\r\n      theme_color:{  tags: breakpoint  , value: 0xa72911ff }\r\n      theme_color:{  tags: \"floating background\"  , value: 0x1b1f2276 }\r\n      theme_color:{  tags: \"floating background alt\"  , value: 0x0000005f }\r\n      theme_color:{  tags: \"floating background fresh\"  , value: 0x31393d5f }\r\n      theme_color:{  tags: \"floating border\"  , value: 0xbfbfbf1f }\r\n      theme_color:{  tags: \"floating scroll_bar background\"  , value: 0x3b3b3b5f }\r\n      theme_color:{  tags: \"floating scroll_bar border\"  , value: 0x5f5f5f5f }\r\n      theme_color:{  tags: \"menu_bar background\"  , value: 0x243d32ff }\r\n      theme_color:{  tags: \"menu_bar border\"  , value: 0x597b63ff }\r\n      theme_color:{  tags: \"scroll_bar background\"  , value: 0x232929ff }\r\n      theme_color:{  tags: \"scroll_bar border\"  , value: 0x3c4a3fff }\r\n      theme_color:{  tags: \"implicit background\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"implicit border\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"hollow background\"  , value: 0x00000000 }\r\n      theme_color:{  tags: \"hollow border\"  , value: 0xffffff1f }\r\n      theme_color:{  tags: \"tab background\"  , value: 0x243d32ff }\r\n      theme_color:{  tags: \"tab border\"  , value: 0x597b63ff }\r\n      theme_color:{  tags: \"tab inactive background\"  , value: 0x30383eff }\r\n      theme_color:{  tags: \"tab inactive border\"  , value: 0x6b7680ff }\r\n      theme_color:{  tags: \"tab auto background\"  , value: 0x30636dff }\r\n      theme_color:{  tags: \"tab auto border\"  , value: 0x768f94ff }\r\n      theme_color:{  tags: \"tab auto inactive background\"  , value: 0x2f2633ff }\r\n      theme_color:{  tags: \"tab auto inactive border\"  , value: 0x685073ff }\r\n      theme_color:{  tags: \"drop_site background\"  , value: 0xffffff05 }\r\n      theme_color:{  tags: \"drop_site border\"  , value: 0xffffff0f }\r\n    }\r\n    ```\r\n  }\r\n  \r\n  //- rjf: todo\r\n  { FarManager       far_manager      \"Far Manager\",\r\n    ```theme:\r\n    {\r\n      theme_color:{tags: background, value: 0x000080ff}\r\n      theme_color:{tags: \"pop background\", value: 0x8080ff}\r\n      theme_color:{tags: \"fresh background\", value: 0x31393dff}\r\n      theme_color:{tags: \"match background\", value: 0x31393dff}\r\n      theme_color:{tags: border, value: 0x8080ff}\r\n      theme_color:{tags: text, value: 0xffffffff}\r\n      theme_color:{tags: \"weak text\", value: 0xffffffff}\r\n      theme_color:{tags: \"good text\", value: 0x00ff00ff}\r\n      theme_color:{tags: \"neutral text\", value: 0x00ffffff}\r\n      theme_color:{tags: \"bad text\", value: 0xff0000ff}\r\n      theme_color:{tags: hover, value: 0xffffffff}\r\n      theme_color:{tags: \"focus overlay\", value: 0xffff0012}\r\n      theme_color:{tags: \"focus border\", value: 0xffff00ff}\r\n      theme_color:{tags: cursor, value: 0xffff00ff}\r\n      theme_color:{tags: selection, value: 0xffff0018}\r\n      theme_color:{tags: \"inactive background\", value: 0x0000002f}\r\n      theme_color:{tags: drop_shadow, value: 0x0000007f}\r\n      theme_color:{tags: \"good_pop background\", value: 0x6c17ff}\r\n      theme_color:{tags: \"good_pop border\", value: 0x6c17ff}\r\n      theme_color:{tags: \"bad_pop background\", value: 0xff0000ff}\r\n      theme_color:{tags: code_default, value: 0xffffffff}\r\n      theme_color:{tags: code_symbol, value: 0xffffff}\r\n      theme_color:{tags: code_type, value: 0x00ff00ff}\r\n      theme_color:{tags: code_local, value: 0x00ffffff}\r\n      theme_color:{tags: code_register, value: 0xff00ffff}\r\n      theme_color:{tags: code_keyword, value: 0xffffffff}\r\n      theme_color:{tags: code_delimiter_or_operator, value: 0xffffffff}\r\n      theme_color:{tags: code_numeric, value: 0xffff00ff}\r\n      theme_color:{tags: code_numeric_alt_digit_group, value: 0xffff00ff}\r\n      theme_color:{tags: code_string, value: 0xffff00ff}\r\n      theme_color:{tags: code_meta, value: 0xff0000ff}\r\n      theme_color:{tags: code_comment, value: 0x008080ff}\r\n      theme_color:{tags: line_info_0, value: 0x8080ff}\r\n      theme_color:{tags: line_info_1, value: 0x800080ff}\r\n      theme_color:{tags: line_info_2, value: 0x800000ff}\r\n      theme_color:{tags: line_info_3, value: 0x08000ff}\r\n      theme_color:{tags: thread_0, value: 0xffff00ff}\r\n      theme_color:{tags: thread_1, value: 0x00ff00ff}\r\n      theme_color:{tags: thread_unwound, value: 0x00ffffff}\r\n      theme_color:{tags: thread_error, value: 0xff0000ff}\r\n      theme_color:{tags: breakpoint, value: 0xff0000ff}\r\n      theme_color:{tags: \"menu_bar background\", value: 0x008080ff}\r\n      theme_color:{tags: \"menu_bar border\", value: 0x8080ff}\r\n      theme_color:{tags: \"scroll_bar background\", value: 0x008080ff}\r\n      theme_color:{tags: \"implicit background\", value: 0x00000000}\r\n      theme_color:{tags: \"implicit border\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow background\", value: 0x00000000}\r\n      theme_color:{tags: \"hollow border\", value: 0xffffff1f}\r\n      theme_color:{tags: \"tab background\", value: 0x8080ff}\r\n      theme_color:{tags: \"tab border\", value: 0x8080ff}\r\n      theme_color:{tags: \"tab inactive background\", value:0}\r\n      theme_color:{tags: \"tab auto background\", value: 0x800000ff}\r\n      theme_color:{tags: \"tab auto border\", value: 0x8080ff}\r\n      theme_color:{tags: \"tab auto inactive background\", value: 0x300000ff}\r\n      theme_color:{tags: \"tab auto inactive border\", value: 0x8080ff}\r\n      theme_color:{tags: \"drop_site background\", value: 0x80ff}\r\n      theme_color:{tags: \"drop_site border\", value: 0xffffff}\r\n    }\r\n    ```\r\n  }\r\n}\r\n\r\n@table(name lower_name)\r\nRD_CodeColorTable:\r\n{\r\n  {CodeDefault               \"code_default\"}\r\n  {CodeSymbol                \"code_symbol\"}\r\n  {CodeType                  \"code_type\"}\r\n  {CodeLocal                 \"code_local\"}\r\n  {CodeRegister              \"code_register\"}\r\n  {CodeKeyword               \"code_keyword\"}\r\n  {CodeDelimiterOperator     \"code_delimiter_or_operator\"}\r\n  {CodeNumeric               \"code_numeric\"}\r\n  {CodeNumericAltDigitGroup  \"code_numeric_alt_digit_group\"}\r\n  {CodeString                \"code_string\"}\r\n  {CodeMeta                  \"code_meta\"}\r\n  {CodeComment               \"code_comment\"}\r\n  {CodeLineNumbers           \"code_line_numbers\"}\r\n  {CodeLineNumbersSelected   \"code_line_numbers_selected\"}\r\n}\r\n\r\n@enum RD_CodeColorSlot:\r\n{\r\n  @expand(RD_CodeColorTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@data(String8) rd_code_color_slot_name_table:\r\n{\r\n  @expand(RD_CodeColorTable a) `str8_lit_comp(\"$(a.lower_name)\")`\r\n}\r\n\r\n@enum RD_ThemePreset:\r\n{\r\n  @expand(RD_ThemePresetTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@data(String8) rd_theme_preset_display_string_table:\r\n{\r\n  @expand(RD_ThemePresetTable a) `str8_lit_comp(\"$(a.display_string)\")`,\r\n}\r\n\r\n@data(String8) rd_theme_preset_code_string_table:\r\n{\r\n  @expand(RD_ThemePresetTable a) `str8_lit_comp(\"$(a.name_lower)\")`,\r\n}\r\n\r\n@data(String8) rd_theme_preset_cfg_string_table:\r\n{\r\n  @expand(RD_ThemePresetTable a) `str8_lit_comp(\"$(a.cfg)\")`,\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Help/Docs/README\r\n\r\n@markdown\r\nraddbg_readme:\r\n{\r\n  @title \"The RAD Debugger (ALPHA)\";\r\n  @p \"The RAD Debugger is a native, user-mode, multi-process, graphical debugger. It currently only supports local-machine Windows x64 debugging with PDBs, but we're actively working on support and ports for other toolchains and platforms.\";\r\n  \r\n  @subtitle \"Getting Started\";\r\n  @p \"**Launching the debugger with your program information:** To launch the RAD Debugger with your executable and command line arguments, run `raddbg` from the command line like so:\";\r\n  @p \"```raddbg my_program.exe --foo --bar --baz```\";\r\n  @p \"For more information, see the **Command-Line Usage** section.\";\r\n  @p \"**Basic commands and keybindings:** Default keyboard shortcuts for common debugger controls include:\";\r\n  @unordered_list\r\n  {\r\n    @p \"**Ctrl + O**: Open Source Code File\";\r\n    @p \"**F10**: Step Over\";\r\n    @p \"**F11**: Step Into\";\r\n    @p \"**Shift + F11**: Step Out\";\r\n    @p \"**F5**: Run\";\r\n    @p \"**Ctrl + Shift + X**, or **Pause**: Halt All Processes\";\r\n    @p \"**Shift + F5**: Kill All Processes\";\r\n    @p \"**Shift + F6**: Attach To Process\";\r\n    @p \"**Ctrl + F**: Search For Text (Forwards)\";\r\n    @p \"**F9**: Toggle Breakpoint At Cursor\";\r\n    @p \"**Ctrl + Comma**: Focus Next Panel\";\r\n    @p \"**Ctrl + Shift + Comma**: Focus Previous Panel\";\r\n    @p \"**Ctrl + Alt + Arrow Key**: Focus Panel In Direction\";\r\n    @p \"**Ctrl + Tab**: Focus Next Tab\";\r\n    @p \"**Ctrl + Shift + Tab**: Focus Previous Tab\";\r\n    @p \"**Ctrl + W**: Close Tab\";\r\n    @p \"**F1**: Open Palette (lists commands, keybindings, settings, threads, processes, modules, types, and many other things)\";\r\n  }\r\n  @p \"For more information, see the **Commands** section.\";\r\n  \r\n  @p \"**Configuration files (users and projects):** The RAD Debugger stores configuration in two files. One is the 'user file', the other is the 'project file'. Both files are the same format and can store the same kinds of data, but the user file is preferred by the debugger for more likely user-related data (windows, keybindings, theme), and the project file is preferred by the debugger for more likely project-related data (executable debugging targets, breakpoints, recent source files). Project files are more likely to be what you'd check into source control, whereas a user file is more likely to have your personal debugger settings (which will apply identically regardless of which project file is opened).\";\r\n  \r\n  @p \"The debugger autosaves user and project files. You do not need to manually save them. To switch which path you are using for either, you can use the `Open User` (Ctrl + Alt + Shift + O, by default), or `Open Project` (Ctrl + Alt + O, by default) commands respectively. If a file does not exist at the path you enter for either, then a new one will be created, and the debugger will begin autosaving to it. If the initial paths to these files are not specified on the command line (via `--user` or `--project`), then the debugger uses default paths for them. The user file path, by default, will be `%appdata%/raddbg/default.raddbg_user`. The project file path will be whatever project path was last loaded for the user, or if no such path exists, `%appdata%/raddbg/default.raddbg_project`. If you suspect that your configuration files are corrupted or causing the debugger to behave poorly, it might help to delete your `%appdata%/raddbg` folder (although it'd also help if you [sent it to us in a bug report](https://github.com/EpicGamesExt/raddebugger/issues), so that we can investigate why they were corrupted to begin with!).\";\r\n  @p \"For more information, see the `**User & Project Files** section.\";\r\n  \r\n  @p \"**Watch tabs and visualizers:** 'Watch' tabs in the RAD Debugger allow entering expressions, which can reference variables in your program, and visualize what their value is when your program is stopped at a particular time. These expressions roughly follow C expression syntax, but there are a number of extensions which can be used to visualize expressions in a more useful way. Here are some examples:\";\r\n  @unordered_list\r\n  {\r\n    @p \"`array(pointer, 64)`: Visualizes `pointer` as pointing to a 256-element array.\";\r\n    @p \"`pointer, 64`: Visualizes `pointer` as pointing to a 256-element array.\";\r\n    @p \"`pointer, count`: Visualizes `pointer` as pointing to a `count`-element array.\";\r\n    @p \"`slice(some_slice_struct)`: Interprets a structure type as containing a base pointer and a count (either through an integer, or an 'end pointer'), and visualizes the base pointer, pointing to that many elements.\";\r\n    @p \"`rows(some_struct, a, b, c)`: Displays the value of `some_struct`, but only showing members `a`, `b`, and `c`.\";\r\n    @p \"`omit(some_struct, a, b, c)`: Displays the value of `some_struct`, but only showing members other than `a`, `b`, and `c`.\";\r\n    @p \"`hex(my_int)`: Visualizes the value of `my_int` in base-16 (hexadecimal) form.\";\r\n    @p \"`dec(my_int)`: Visualizes the value of `my_int` in base-10 (decimal) form.\";\r\n    @p \"`bin(my_int)`: Visualizes the value of `my_int` in base-2 (binary) form.\";\r\n    @p \"`oct(my_int)`: Visualizes the value of `my_int` in base-8 (octal) form.\";\r\n    @p \"`my_int, x`: Visualizes the value of `my_int` in base-16 (hexadecimal) form.\";\r\n    @p \"`my_int, d`: Visualizes the value of `my_int` in base-10 (decimal) form.\";\r\n    @p \"`my_int, b`: Visualizes the value of `my_int` in base-2 (binary) form.\";\r\n    @p \"`my_int, o`: Visualizes the value of `my_int` in base-8 (octal) form.\";\r\n    @p \"`digits(bin(my_int), 32)`: Visualizes the value of `my_int` in base-2 (binary) form, showing at minimum 32 bits.\";\r\n    @p \"`my_int.bin().digits(32)`: Visualizes the value of `my_int` in base-2 (binary) form, showing at minimum 32 bits.\";\r\n    @p \"`bitmap(base_pointer, width, height, fmt=rgba8)`: Visualizes the data starting at `base_pointer` as a bitmap, with width `width` and height `height`, with format `rgba8`.\";\r\n  }\r\n  @p \"For more information, see the **Views** section.\";\r\n  \r\n  @subtitle \"Command-Line Usage\";\r\n  @p \"When run normally, either by launching through a file explorer or running from a command line without arguments, `raddbg` will open a new instance of the debugger, and await further operations. But it also supports a number of command line options for a number of other purposes. These options are specified with a `-` or `--` prefix, followed by the name of the option, and if the option requires an argument value, followed by a `:` or `=`, followed by the argument value. A list of the possible options follows:\";\r\n  @unordered_list\r\n  {\r\n    @p \"`--help` Displays a help menu which documents the possible command line options.\";\r\n    @p \"`--user:<path>` Use to specify the location of a user file which should be used. User files are used by default to store user-related settings, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made. For more information on user files, see the **User & Project Files** section.\";\r\n    @p \"`--project:<path>` Use to specify the location of a project file which should be used. Project files are used by default to store project-related settings. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made. For more information on project files, read the 'User & Project Files' section.\";\r\n    @p \"`--auto_step` This will step into all active targets after the debugger initially starts.\";\r\n    @p \"`--auto_run` This will run all active targets after the debugger initially starts.\";\r\n    @p \"`--quit_after_success` (or `-q`) This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\";\r\n    @p \"`--ipc` This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger. For more information on the set of available commands, see the **Commands** section. For more information on driving another debugger instance with this argument, see the **Driving Another Debugger Instance** section.\";\r\n  }\r\n  @p \"On the command line, non-options (meaning any command line arguments *not* prefixed with a `-` or `--`) can also be specified. With normal usage, they are interpreted as the command line for a target (see the **Targets** section). When driving another debugger instance (using the `--ipc` argument), this additional command line text is used to encode a debugger command.\";\r\n  @p \"The debugger will stop parsing `-` and `--` prefixes as arguments after seeing a standalone `--`, *or* after seeing the first non-option argument, when reading the command line left-to-right. Some examples of command line usage and their interpretations are below:\";\r\n  @unordered_list\r\n  {\r\n    @p \"`raddbg --foo --bar --a:b --c=d test.exe`: All options are used to configure `raddbg`. `test.exe` is interpreted as a target executable. `b` is interpreted as the parameter for the `a` option. `d` is interpreted as the parameter for the `c` option.\";\r\n    @p \"`raddbg test.exe --foo --bar`: `test.exe`is interpreted as a target executable. `--foo --bar` is interpreted as arguments for `test.exe`, and thus are *not* used to configure `raddbg`.\";\r\n    @p \"`raddbg -- test.exe`: `test.exe` is interpreted as a target executable.\";\r\n    @p \"`raddbg --ipc find_code_location \\\"C:/foo/bar/baz.c:123:1\\\"`: `--ipc` configures `raddbg` to drive another instance of `raddbg`. The remainder of the text is interpreted as a command.\";\r\n    @p \"`raddbg \\\"C:/path with spaces/test.exe\\\" --foo --bar`: A target is formed from the `test.exe` path, and `--foo --bar` are interpreted as arguments to the `test.exe` target.\";\r\n  }\r\n  \r\n  @subtitle \"Windows, Panels, & Tabs\";\r\n  @p \"Each opened debugger window is subdivided into panels. Panels subdivide regions of their window without overlapping. Each panel can contain multiple tabs, and can have one tab selected at any time. Tabs can be dragged and dropped between panels. Each tab is used to view one of the many supported debugger interfaces, including source code, disassembly, memory, or watch tables. When a tab is selected, that interface will fill the tab's containing panel's region of the containing window.\";\r\n  @p \"There are no 'special' windows, panels, or tabs; the debugger is written such that the number of windows, each window's panel organization, and the placement and arrangement of tabs can all be organized in a large variety of ways.\";\r\n  @p \"A list of debugger interfaces, which can occupy tabs, are below:\";\r\n  @unordered_list\r\n  {\r\n    @expand(RD_WatchTabFastPathTable a) @p \"**$(a.display_name)**: $(a.description)\";\r\n  }\r\n  @p \"You can open one of these tabs in any panel by clicking the `+` icon next to that panel's tabs, or by executing the `Open Tab` command (bound to Ctrl + T) by default.\";\r\n  \r\n  @subtitle \"Commands\";\r\n  @p \"The debugger, including implicitly with its UI, is operated almost entirely through 'commands'. Commands may be manually executed in the debugger UI within the palette (which you can open with F1 by default), or within the commands list which is opened when you execute the 'Run Command' command. Operations in the debugger UI are implemented with commands, so if it's ever unclear how to accomplish some operation through the UI, a useful fallback is searching for and running the command through the palette.\";\r\n  @p \"Commands are also how a debugger instance launched with `--ipc` may communicate with a primary debugger instance.\";\r\n  @p \"A list of commands, how they're referred to textually (for the purposes of `--ipc` debugger instances), and their descriptions, are below:\";\r\n  @unordered_list\r\n  {\r\n    @expand(D_CmdTable a) @p \"$(a.ipc_docs_vis == 1 -> '`'..a.display_name..'` '..'(`'..a.string..'`) '..a.desc)\";\r\n    @expand(RD_CmdTable a) @p \"$(a.ipc_docs_vis == 1 -> '`'..a.display_name..'` '..'(`'..a.string..'`) '..a.desc)\";\r\n  }\r\n  \r\n  @subtitle \"Targets\";\r\n  @p \"A *target* is one executable and configuration for launching that executable, including command line arguments and working directory (the directory from which the executable is launched). Each target may also have a custom label (prioritized over the executable name when visualizing the target, and also allows evaluation of the target in a Watch tab), and the name of a custom entry point function (when the default entry points - `main`, `WinMain`, etc. - are not desired when stepping into the program upon launch). The debugger can have several targets at once. Each target can also be enabled or disabled. Some operations work on all enabled targets - for instance, the `Run` or `Kill All` commands (standardly bound as F5 or Shift + F5). Enabling and disabling targets allows one to filter which targets are currently being worked with.\";\r\n  @p \"To add a target, you can run the `Add Target` command. A target is also created automatically from command line arguments - the rules for how this happens can be found in the `Command-Line Usage` section.\";\r\n  @p \"Targets created through command line usage are temporary, meaning they are not persistently saved across runs of the debugger. To change this, find the target in the `Targets` tab, and click the `Save To Project` button on that target's row. After doing so, the target will be restored across runs, and will no longer need to be specified on the command-line.\";\r\n  \r\n  @subtitle \"Views\";\r\n  @p \"*Views* are used to transform the way that evaluations in the debugger are visualized. An evaluation is produced by taking an expression string - for instance, the name of a variable - and using debug info and information from an attached process' live runtime (memory, registers, and so on) to interpret it.\";\r\n  @p \"Evaluations may be visualized in a variety of ways. A 64-bit unsigned integer may be visualized as a textual representation of the value with a radix of 10. A 32-bit floating-point value may be visualized as a textual representation of the value. An array of 32-bit floating-point values can be visualized as a list of textual representations of those values.\";\r\n  @p \"But all of these cases may be visualized in a number of other ways, as well. A 64-bit unsigned integer may be more usefully represented with a radix of 16, 8, or 2. An array of 32-bit floating-point values may encode the R, G, B, and A components of a color, or vertex positions for 3D geometry, or samples for a waveform. An array of bytes may encode raw pixel data for an image, or image data in a compressed format. A struct may have several members which are not useful to look at all the time. A struct may form the head of a linked list, and a flat linked list representation may be more preferable than the traditional watch view representation, which adds an additional layer of hierarchical nesting with the expansion of each 'next' pointer in a linked list. When designing the debugger, we felt that the traditional memory view and watch view representations of data in a debugged-process were not sufficient. Views were added to the traditional watch table structure to allow per-expression specification of extra visualization parameters.\";\r\n  @p \"Views look just like function calls. They start with the name of the view, a `(`, then a list of expressions which form the arguments for the view (optionally delimited by `,`s), followed by a `)`. The meaning of these arguments can sometimes be inferred through their order; for example, in the case of `bitmap(ptr, 512, 256)`, the `bitmap` view uses the `ptr` as the primary expression to interpret as bitmap data, then assumes the widely-used pattern of width, then height, to interpret the following arguments as the dimensions of the bitmap. In other cases, arguments must be specifically named. For instance, the `fmt` argument in `bitmap(ptr, 512, 256, fmt=bgra8)` is required to override the `bitmap` view's default assumption of RGBA8 bitmap data.\";\r\n  @p \"A list of currently-supported views are below:\";\r\n  @unordered_list\r\n  {\r\n    // TODO(rjf): @lenses generate via metaprogram\r\n    @p \"`raw(expr)`: Ignores all views used in `expr`, including those automatically applied by type views.\";\r\n    @p \"`bin(expr)`: Visualizes all numeric values evaluated in `expr` as base-2 (binary).\";\r\n    @p \"`oct(expr)`: Visualizes all numeric values evaluated in `expr` as base-8 (octal).\";\r\n    @p \"`dec(expr)`: Visualizes all numeric values evaluated in `expr` as base-10 (decimal).\";\r\n    @p \"`hex(expr)`: Visualizes all numeric values evaluated in `expr` as base-16 (hexadecimal).\";\r\n    @p \"`digits(expr, num)`: Visualizes at least `num` digits in all numeric values evaluated in `expr`.\";\r\n    @p \"`no_string(expr)`: Disables textual string visualization with pointer evaluations in `expr`.\";\r\n    @p \"`no_char(expr)`: Disables character visualization with character or integer evaluations in `expr`.\";\r\n    @p \"`no_addr(expr)`: Disables explicit address visualization with pointer evaluations in `expr`.\";\r\n    @p \"`sequence(expr)`: Interprets `expr` as an integer, encoding how many sub-expressions `expr` should expand to produce. This can be used in combination with the `table` view to easily generate tables, indexing amongst many arrays.\";\r\n    @p \"`rows(expr, ...)`: Interpreting all post-`expr` arguments as member names, only expands to show those members of `expr`.\";\r\n    @p \"`omit(expr, ...)`: Interpreting all post-`expr` arguments as member names, expands to show all members of `expr`, except those with matching names.\";\r\n    @p \"`range1(expr, min, max)`: Expresses that `expr` is a bounded numeric value between `min` and `max`. Interpreted by the debugger to build slider UI for an evaluation.\";\r\n    @p \"`array(expr, count)`: Expresses that `expr` points to `count` values, rather than 1, or the fixed size implied by a static array. When expanded, displays only that many values.\";\r\n    @p \"`slice(expr)`: Expresses that `expr` evaluates to a structure type which bundles a base pointer and a count (encoding how many elements to which the base pointer points). This count can be expressed either as an integer, or as an 'end pointer'. When expanded, displays that many elements following that base pointer.\";\r\n    @p \"`table(expr, ...)`: Expresses that `expr` should be expanded normally, but interprets all post-`expr` arguments as expressions which should be used to form cells for rows which are generated by this expression's expansions. This replaces the normal cells which are generated for an expansion in a Watch table.\";\r\n    @p \"`text(expr, [lang = ...])`: Generates a text visualizer, interpreting `expr` as (being or pointing to) text.\";\r\n    @p \"`disasm(expr, [size = ...]`: Generates a disassembly visualizer, interpreting `expr` as (being or pointing to) machine code.\";\r\n    @p \"`memory(expr, [size = ...])`: Generates a memory visualizer, interpreting `expr` as (being or pointing to) raw bytes.\";\r\n    @p \"`bitmap(expr, width, height, [fmt = ...])`: Generates a bitmap visualizer, interpreting `expr` as (being or pointing to) raw bitmap data, with `width` and `height` as dimensions.\";\r\n    @p \"`color(expr)`: Generates a color picker, interpreting `expr` as a color value.\";\r\n  }\r\n  \r\n  @subtitle \"Breakpoints\";\r\n  @p \"Breakpoints interrupt execution of attached processes. They may be placed on arbitrary addresses (e.g. by placing a breakpoint on an instruction within a disassembly view, or with an arbitrary expression, like the name of a function), or on lines of source code. In the latter case, the source code location is resolved to code addresses. If there is no code associated with a line of source code, then the resolution path chooses to use the next closest line of source code in the same file.\";\r\n  @p \"Breakpoints may have stop conditions attached to them. When a breakpoint is hit by a thread, before it stops execution, the stop condition is evaluated, and if it evaluates to a nonzero value, only then is execution stopped.\";\r\n  @p \"Each breakpoint has a hit count. Every time a breakpoint causes execution to stop, this counter is increased.\";\r\n  @p \"Address breakpoints can also point to data, rather than code. This will cause execution to stop if some data is read from, written to, or executed. In this case, the debugger configures the hardware to use the available hardware data breakpoints feature. To enable this path, in the breakpoint's editor, express the number of bytes following the address that should be checked for writes/reads/executions (can be 1, 2, 4, or 8), and select whether or not you want to break on reads, writes, or executions.\";\r\n  \r\n  @subtitle \"User & Project Files\";\r\n  @p \"Applicable state controlling the debugger's appearance, behavior, targets, breakpoints, and other configurations is saved and reloaded across runs of the debugger through both *user files* and *project files*. These files are auto-saved. These files are written in a textual format which can be hand-edited as necessary, but they're also continuously re-read and re-written by the debugger. By default, the debugger uses `%appdata%/raddbg/default.raddbg_user` for its user file path, and `%appdata%/raddbg/default.raddbg_project` for its project file path. These paths can be overridden on the command line (see the 'Command-Line Usage' section).\";\r\n  @p \"The *user file* defaultly stores file path maps, windows (including their preferred monitor, placement, and size), each window's panel layout and tabs, keybindings, theme colors, and fonts.\";\r\n  @p \"The *project file* defaultly stores targets, breakpoints, watch pins, and exception code filters.\";\r\n  @p \"Because both can be hand-edited, however, if you want to store something normally stored in a user file in a project file, or vice versa, this can be done by hand transferring the textual data from one file to another. There is no path in the debugger's UI to support this transfer, currently, although this is planned.\";\r\n  \r\n  @subtitle \"Driving Another Debugger Instance\";\r\n  @p \"When the debugger is launched with the `--ipc` command-line argument, it does not launch another instance of the graphical debugger. Instead, it launches, sends a string encoding a command to a running instance of the graphical debugger, and then terminates. The set of commands which can be sent are identical to those which can be run from the debugger's UI itself, but these commands must be encoded textually (through the other command-line arguments). These commands are described in the 'Commands' section.\";\r\n}\r\n"
  },
  {
    "path": "src/raddbg/raddbg_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xf0a215ff\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/raddbg.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Registers Type Functions\r\n\r\ninternal void\r\nrd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src)\r\n{\r\n  MemoryCopyStruct(dst, src);\r\n  dst->cfg_list    = cfg_id_list_copy(arena, &src->cfg_list);\r\n  dst->file_path   = push_str8_copy(arena, src->file_path);\r\n  dst->lines       = d_line_list_copy(arena, &src->lines);\r\n  dst->expr        = push_str8_copy(arena, src->expr);\r\n  dst->string      = push_str8_copy(arena, src->string);\r\n  dst->cmd_name    = push_str8_copy(arena, src->cmd_name);\r\n  if(dst->cfg_list.count == 0 && dst->cfg != 0)\r\n  {\r\n    cfg_id_list_push(arena, &dst->cfg_list, dst->cfg);\r\n  }\r\n}\r\n\r\ninternal RD_Regs *\r\nrd_regs_copy(Arena *arena, RD_Regs *src)\r\n{\r\n  RD_Regs *dst = push_array(arena, RD_Regs, 1);\r\n  rd_regs_copy_contents(arena, dst, src);\r\n  return dst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Commands Type Functions\r\n\r\ninternal void\r\nrd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs)\r\n{\r\n  RD_CmdNode *n = push_array(arena, RD_CmdNode, 1);\r\n  n->cmd.name = push_str8_copy(arena, name);\r\n  n->cmd.regs = rd_regs_copy(arena, regs);\r\n  DLLPushBack(cmds->first, cmds->last, n);\r\n  cmds->count += 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: View UI Rule Functions\r\n\r\ninternal RD_ViewUIRuleMap *\r\nrd_view_ui_rule_map_make(Arena *arena, U64 slots_count)\r\n{\r\n  RD_ViewUIRuleMap *map = push_array(arena, RD_ViewUIRuleMap, 1);\r\n  map->slots_count = slots_count;\r\n  map->slots = push_array(arena, RD_ViewUIRuleSlot, map->slots_count);\r\n  return map;\r\n}\r\n\r\ninternal void\r\nrd_view_ui_rule_map_insert(Arena *arena, RD_ViewUIRuleMap *map, String8 string, RD_ViewUIFunctionType *ui)\r\n{\r\n  U64 hash = d_hash_from_string(string);\r\n  U64 slot_idx = hash%map->slots_count;\r\n  RD_ViewUIRuleNode *n = push_array(arena, RD_ViewUIRuleNode, 1);\r\n  n->v.name = push_str8_copy(arena, string);\r\n  n->v.ui = ui;\r\n  SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, n);\r\n}\r\n\r\ninternal RD_ViewUIRule *\r\nrd_view_ui_rule_from_string(String8 string)\r\n{\r\n  RD_ViewUIRule *rule = &rd_nil_view_ui_rule;\r\n  {\r\n    RD_ViewUIRuleMap *map = rd_state->view_ui_rule_map;\r\n    U64 hash = d_hash_from_string(string);\r\n    U64 slot_idx = hash%map->slots_count;\r\n    for(RD_ViewUIRuleNode *n = map->slots[slot_idx].first; n != 0; n = n->next)\r\n    {\r\n      if(str8_match(n->v.name, string, 0))\r\n      {\r\n        rule = &n->v;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return rule;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Global Cross-Window UI Interaction State Functions\r\n\r\ninternal B32\r\nrd_drag_is_active(void)\r\n{\r\n  return ((rd_state->drag_drop_state == RD_DragDropState_Dragging) ||\r\n          (rd_state->drag_drop_state == RD_DragDropState_Dropping));\r\n}\r\n\r\ninternal void\r\nrd_drag_begin(RD_RegSlot slot)\r\n{\r\n  if(!rd_drag_is_active())\r\n  {\r\n    arena_clear(rd_state->drag_drop_arena);\r\n    rd_state->drag_drop_regs = rd_regs_copy(rd_state->drag_drop_arena, rd_regs());\r\n    rd_state->drag_drop_regs_slot = slot;\r\n    rd_state->drag_drop_state = RD_DragDropState_Dragging;\r\n  }\r\n}\r\n\r\ninternal B32\r\nrd_drag_drop(void)\r\n{\r\n  B32 result = 0;\r\n  if(rd_state->drag_drop_state == RD_DragDropState_Dropping)\r\n  {\r\n    result = 1;\r\n    rd_state->drag_drop_state = RD_DragDropState_Null;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nrd_drag_kill(void)\r\n{\r\n  rd_state->drag_drop_state = RD_DragDropState_Null;\r\n}\r\n\r\ninternal void\r\nrd_set_hover_regs(RD_RegSlot slot)\r\n{\r\n  rd_state->next_hover_regs = rd_regs_copy(rd_frame_arena(), rd_regs());\r\n  rd_state->next_hover_regs_slot = slot;\r\n}\r\n\r\ninternal RD_Regs *\r\nrd_get_hover_regs(void)\r\n{\r\n  return rd_state->hover_regs;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Config Functions\r\n\r\ninternal B32\r\nrd_cfg_is_project_filtered(CFG_Node *cfg)\r\n{\r\n  CFG_Node *project = cfg_node_child_from_string(cfg, str8_lit(\"project\"));\r\n  B32 result = (project != &cfg_nil_node && !path_match_normalized(rd_state->project_path, project->first->string));\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nrd_hsva_from_cfg(CFG_Node *cfg)\r\n{\r\n  Vec4F32 hsva = {0};\r\n  CFG_Node *hsva_root = cfg_node_child_from_string(cfg, str8_lit(\"hsva\"));\r\n  CFG_Node *h = hsva_root->first;\r\n  CFG_Node *s = h->next;\r\n  CFG_Node *v = s->next;\r\n  CFG_Node *a = v->next;\r\n  hsva.x = (F32)f64_from_str8(h->string);\r\n  hsva.y = (F32)f64_from_str8(s->string);\r\n  hsva.z = (F32)f64_from_str8(v->string);\r\n  hsva.w = (F32)f64_from_str8(a->string);\r\n  return hsva;\r\n}\r\n\r\ninternal Vec4F32\r\nrd_color_from_cfg(CFG_Node *cfg)\r\n{\r\n  Vec4F32 hsva = rd_hsva_from_cfg(cfg);\r\n  Vec4F32 rgba = linear_from_srgba(rgba_from_hsva(hsva));\r\n  return rgba;\r\n}\r\n\r\ninternal B32\r\nrd_disabled_from_cfg(CFG_Node *cfg)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  MD_Node *child_schema = &md_nil_node;\r\n  MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, cfg->string);\r\n  for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)\r\n  {\r\n    child_schema = md_child_from_string(n->v, str8_lit(\"enabled\"), 0);\r\n  }\r\n  MD_Node *default_tag = md_tag_from_string(child_schema, str8_lit(\"default\"), 0);\r\n  String8 value_string = cfg_node_child_from_string(cfg, str8_lit(\"enabled\"))->first->string;\r\n  if(value_string.size == 0)\r\n  {\r\n    value_string = default_tag->first->string;\r\n  }\r\n  B32 is_enabled = !!e_value_from_string(value_string).u64;\r\n  B32 is_disabled = !is_enabled;\r\n  if(value_string.size == 0)\r\n  {\r\n    is_disabled = 0;\r\n  }\r\n  scratch_end(scratch);\r\n  return is_disabled;\r\n}\r\n\r\ninternal RD_Location\r\nrd_location_from_cfg(CFG_Node *cfg)\r\n{\r\n  RD_Location dst_loc = {0};\r\n  {\r\n    CFG_Node *src_loc = cfg_node_child_from_string(cfg, str8_lit(\"source_location\"));\r\n    CFG_Node *addr_loc = cfg_node_child_from_string(cfg, str8_lit(\"address_location\"));\r\n    if(src_loc != &cfg_nil_node)\r\n    {\r\n      String8TxtPtPair loc_description = str8_txt_pt_pair_from_string(src_loc->first->string);\r\n      dst_loc.file_path = loc_description.string;\r\n      dst_loc.pt = loc_description.pt;\r\n    }\r\n    else if(addr_loc != &cfg_nil_node)\r\n    {\r\n      dst_loc.expr = addr_loc->first->string;\r\n    }\r\n  }\r\n  return dst_loc;\r\n}\r\n\r\ninternal String8\r\nrd_label_from_cfg(CFG_Node *cfg)\r\n{\r\n  CFG_Node *label_root = cfg_node_child_from_string(cfg, str8_lit(\"label\"));\r\n  String8 result = label_root->first->string;\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_expr_from_cfg(CFG_Node *cfg)\r\n{\r\n  CFG_Node *expr_root = cfg_node_child_from_string(cfg, str8_lit(\"expression\"));\r\n  String8 result = expr_root->first->string;\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_path_from_cfg(CFG_Node *cfg)\r\n{\r\n  CFG_Node *root = cfg_node_child_from_string(cfg, str8_lit(\"path\"));\r\n  String8 result = root->first->string;\r\n  return result;\r\n}\r\n\r\ninternal D_Target\r\nrd_target_from_cfg(Arena *arena, CFG_Node *cfg)\r\n{\r\n  D_Target target = {0};\r\n  target.exe                        = cfg_node_child_from_string(cfg, str8_lit(\"executable\"))->first->string;\r\n  target.args                       = cfg_node_child_from_string(cfg, str8_lit(\"arguments\"))->first->string;\r\n  target.working_directory          = cfg_node_child_from_string(cfg, str8_lit(\"working_directory\"))->first->string;\r\n  target.custom_entry_point_name    = cfg_node_child_from_string(cfg, str8_lit(\"entry_point\"))->first->string;\r\n  target.stdout_path                = cfg_node_child_from_string(cfg, str8_lit(\"stdout_path\"))->first->string;\r\n  target.stderr_path                = cfg_node_child_from_string(cfg, str8_lit(\"stderr_path\"))->first->string;\r\n  target.stdin_path                 = cfg_node_child_from_string(cfg, str8_lit(\"stdin_path\"))->first->string;\r\n  target.debug_subprocesses         = !!e_value_from_string(cfg_node_child_from_string(cfg, str8_lit(\"debug_subprocesses\"))->first->string).u64;\r\n  for(CFG_Node *child = cfg->first; child != &cfg_nil_node; child = child->next)\r\n  {\r\n    if(str8_match(child->string, str8_lit(\"environment\"), 0))\r\n    {\r\n      str8_list_push(arena, &target.env, child->first->string);\r\n    }\r\n  }\r\n  return target;\r\n}\r\n\r\ninternal String8\r\nrd_default_setting_from_names(String8 schema_name, String8 setting_name)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    MD_Node *setting_schema = &md_nil_node;\r\n    MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, schema_name);\r\n    for(MD_NodePtrNode *n = schemas.first; n != 0 && setting_schema == &md_nil_node; n = n->next)\r\n    {\r\n      setting_schema = md_child_from_string(n->v, setting_name, 0);\r\n    }\r\n    if(setting_schema != &md_nil_node)\r\n    {\r\n      MD_Node *default_tag = md_tag_from_string(setting_schema, str8_lit(\"default\"), 0);\r\n      if(default_tag != &md_nil_node)\r\n      {\r\n        result = default_tag->first->string;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_setting_from_name(String8 name)\r\n{\r\n  String8 result = {0};\r\n  if(name.size != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    // rjf: find most-granular config scopes to begin looking for the setting\r\n    typedef struct CfgSeedTask CfgSeedTask;\r\n    struct CfgSeedTask\r\n    {\r\n      CfgSeedTask *next;\r\n      CFG_Node *cfg;\r\n      B32 allow_bucket_chains;\r\n    };\r\n    CFG_Node *view_cfg = cfg_node_from_id(rd_regs()->view);\r\n    if(view_cfg == &cfg_nil_node)\r\n    {\r\n      view_cfg = cfg_node_from_id(rd_regs()->tab);\r\n    }\r\n    CfgSeedTask panel_task = {0, &cfg_nil_node, 1};\r\n    if(panel_task.cfg == &cfg_nil_node) { panel_task.cfg = cfg_node_from_id(rd_regs()->panel); }\r\n    if(panel_task.cfg == &cfg_nil_node) { panel_task.cfg = cfg_node_from_id(rd_regs()->window); }\r\n    CfgSeedTask view_task = {&panel_task, view_cfg, 1};\r\n    CfgSeedTask *first_task = &view_task;\r\n    CfgSeedTask *last_task = &panel_task;\r\n    \r\n    // rjf: for each task, look for the setting, follow parent chain upwards\r\n    CFG_Node *setting = &cfg_nil_node;\r\n    for(CfgSeedTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      for(CFG_Node *cfg = t->cfg; cfg != &cfg_nil_node; cfg = cfg->parent)\r\n      {\r\n        setting = cfg_node_child_from_string(cfg, name);\r\n        if(setting != &cfg_nil_node)\r\n        {\r\n          goto break_all;\r\n        }\r\n        if(cfg->parent == cfg_node_root() && t->allow_bucket_chains)\r\n        {\r\n          String8 next_bucket = {0};\r\n          B32 allow_bucket_chains = 0;\r\n          if(str8_match(cfg->string, str8_lit(\"user\"), 0))\r\n          {\r\n            next_bucket = str8_lit(\"project\");\r\n          }\r\n          else if(str8_match(cfg->string, str8_lit(\"project\"), 0))\r\n          {\r\n            next_bucket = str8_lit(\"user\");\r\n          }\r\n          else\r\n          {\r\n            allow_bucket_chains = 1;\r\n            next_bucket = str8_lit(\"user\");\r\n          }\r\n          if(next_bucket.size != 0)\r\n          {\r\n            CfgSeedTask *task = push_array(scratch.arena, CfgSeedTask, 1);\r\n            SLLQueuePush(first_task, last_task, task);\r\n            task->cfg = cfg_node_child_from_string(cfg_node_root(), next_bucket);\r\n            task->allow_bucket_chains = allow_bucket_chains;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    break_all:;\r\n    \r\n    // rjf: return resultant child string stored under this key\r\n    result = setting->first->string;\r\n    \r\n    // rjf: no result -> look for default in schemas\r\n    if(result.size == 0)\r\n    {\r\n      for(CfgSeedTask *t = first_task; t != 0; t = t->next)\r\n      {\r\n        for(CFG_Node *cfg = t->cfg; cfg != &cfg_nil_node; cfg = cfg->parent)\r\n        {\r\n          result = rd_default_setting_from_names(cfg->string, name);\r\n          if(result.size != 0)\r\n          {\r\n            goto break_all2;\r\n          }\r\n        }\r\n      }\r\n      break_all2:;\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nrd_setting_b32_from_name(String8 name)\r\n{\r\n  B32 result = 0;\r\n  String8 value = rd_setting_from_name(name);\r\n  if(value.size != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 expr = push_str8f(scratch.arena, \"raw((bool)(%S))\", value);\r\n    E_Eval eval = e_eval_from_string(expr);\r\n    result = !!e_value_eval_from_eval(eval).value.u64;\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nrd_setting_u64_from_name(String8 name)\r\n{\r\n  U64 result = 0;\r\n  String8 value = rd_setting_from_name(name);\r\n  if(value.size != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 expr = push_str8f(scratch.arena, \"raw((uint64)(%S))\", value);\r\n    E_Eval eval = e_eval_from_string(expr);\r\n    result = e_value_eval_from_eval(eval).value.u64;\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal F32\r\nrd_setting_f32_from_name(String8 name)\r\n{\r\n  F32 result = 0.f;\r\n  String8 value = rd_setting_from_name(name);\r\n  if(value.size != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 expr = push_str8f(scratch.arena, \"raw((float32)(%S))\", value);\r\n    E_Eval eval = e_eval_from_string(expr);\r\n    result = e_value_eval_from_eval(eval).value.f32;\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\nrd_immediate_cfg_from_key(String8 string)\r\n{\r\n  CFG_Node *transient = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"transient\"));\r\n  CFG_Node *immediate = &cfg_nil_node;\r\n  CFG_Node *cfg = &cfg_nil_node;\r\n  for(CFG_Node *child = transient->first; child != &cfg_nil_node; child = child->next)\r\n  {\r\n    if(str8_match(child->string, str8_lit(\"immediate\"), 0))\r\n    {\r\n      cfg = cfg_node_child_from_string(child, string);\r\n      if(cfg != &cfg_nil_node)\r\n      {\r\n        immediate = child;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  if(cfg == &cfg_nil_node)\r\n  {\r\n    immediate = cfg_node_new(rd_state->cfg, transient, str8_lit(\"immediate\"));\r\n    cfg = cfg_node_new(rd_state->cfg, immediate, string);\r\n  }\r\n  cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate, str8_lit(\"hot\"));\r\n  return cfg;\r\n}\r\n\r\ninternal CFG_Node *\r\nrd_immediate_cfg_from_keyf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 key = push_str8fv(scratch.arena, fmt, args);\r\n  CFG_Node *result = rd_immediate_cfg_from_key(key);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_mapped_from_file_path(Arena *arena, String8 file_path)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  if(file_path.size != 0)\r\n  {\r\n    String8List file_path_parts = str8_split_path(scratch.arena, file_path);\r\n    CFG_NodePtrList maps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"file_path_map\"));\r\n    String8 best_map_dst = {0};\r\n    U64 best_map_match_length = max_U64;\r\n    String8Node *best_map_remaining_suffix_first = 0;\r\n    for(CFG_NodePtrNode *n = maps.first; n != 0; n = n->next)\r\n    {\r\n      String8 map_src = cfg_node_child_from_string(n->v, str8_lit(\"source\"))->first->string;\r\n      String8List map_src_parts = str8_split_path(scratch.arena, map_src);\r\n      B32 matches = 1;\r\n      U64 match_length = 0;\r\n      String8Node *file_path_part_n = file_path_parts.first;\r\n      for(String8Node *map_src_n = map_src_parts.first;\r\n          map_src_n != 0 && file_path_part_n != 0;\r\n          map_src_n = map_src_n->next, file_path_part_n = file_path_part_n->next)\r\n      {\r\n        if(!str8_match(map_src_n->string, file_path_part_n->string, 0))\r\n        {\r\n          matches = 0;\r\n          break;\r\n        }\r\n        match_length += 1;\r\n      }\r\n      if(matches && match_length < best_map_match_length)\r\n      {\r\n        best_map_match_length = match_length;\r\n        best_map_dst = cfg_node_child_from_string(n->v, str8_lit(\"dest\"))->first->string;\r\n        best_map_remaining_suffix_first = file_path_part_n;\r\n      }\r\n    }\r\n    if(best_map_dst.size != 0)\r\n    {\r\n      String8List best_map_dst_parts = str8_split_path(scratch.arena, best_map_dst);\r\n      for(String8Node *n = best_map_remaining_suffix_first; n != 0; n = n->next)\r\n      {\r\n        str8_list_push(scratch.arena, &best_map_dst_parts, n->string);\r\n      }\r\n      StringJoin join = {.sep = str8_lit(\"/\")};\r\n      file_path = str8_list_join(scratch.arena, &best_map_dst_parts, &join);\r\n    }\r\n  }\r\n  String8 result = push_str8_copy(arena, file_path);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8List\r\nrd_possible_overrides_from_file_path(Arena *arena, String8 file_path)\r\n{\r\n  // NOTE(rjf): This path, given some target file path, scans all file path map\r\n  // overrides, and collects the set of file paths which could've redirected\r\n  // to the target file path given the set of file path maps.\r\n  //\r\n  // For example, if I have a rule saying D:/devel/ maps to C:/devel/, and I\r\n  // feed in C:/devel/foo/bar.txt, then this path will construct\r\n  // D:/devel/foo/bar.txt, as a possible option.\r\n  //\r\n  // It will also preserve C:/devel/foo/bar.txt in the resultant list, so that\r\n  // overrideless files still work through this path, and both redirected\r\n  // files and non-redirected files can go through the same path.\r\n  //\r\n  String8List result = {0};\r\n  str8_list_push(arena, &result, file_path);\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  PathStyle pth_style = PathStyle_Relative;\r\n  String8List pth_parts = path_normalized_list_from_string(scratch.arena, file_path, &pth_style);\r\n  {\r\n    CFG_NodePtrList links = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"file_path_map\"));\r\n    for(CFG_NodePtrNode *n = links.first; n != 0; n = n->next)\r\n    {\r\n      //- rjf: unpack link\r\n      CFG_Node *link = n->v;\r\n      CFG_Node *src = cfg_node_child_from_string(link, str8_lit(\"source\"));\r\n      CFG_Node *dst = cfg_node_child_from_string(link, str8_lit(\"dest\"));\r\n      PathStyle src_style = PathStyle_Relative;\r\n      PathStyle dst_style = PathStyle_Relative;\r\n      String8List src_parts = path_normalized_list_from_string(scratch.arena, src->first->string, &src_style);\r\n      String8List dst_parts = path_normalized_list_from_string(scratch.arena, dst->first->string, &dst_style);\r\n      \r\n      //- rjf: determine if this link can possibly redirect to the target file path\r\n      B32 dst_redirects_to_pth = 0;\r\n      String8Node *non_redirected_pth_first = 0;\r\n      if(dst_style == pth_style && dst_parts.first != 0 && pth_parts.first != 0)\r\n      {\r\n        dst_redirects_to_pth = 1;\r\n        String8Node *dst_n = dst_parts.first;\r\n        String8Node *pth_n = pth_parts.first;\r\n        for(;dst_n != 0 && pth_n != 0; dst_n = dst_n->next, pth_n = pth_n->next)\r\n        {\r\n          if(!str8_match(dst_n->string, pth_n->string, StringMatchFlag_CaseInsensitive))\r\n          {\r\n            dst_redirects_to_pth = 0;\r\n            break;\r\n          }\r\n          non_redirected_pth_first = pth_n->next;\r\n        }\r\n      }\r\n      \r\n      //- rjf: if this link can redirect to this path via `src` -> `dst`, compute\r\n      // possible full source path, by taking `src` and appending non-redirected\r\n      // suffix (which did not show up in `dst`)\r\n      if(dst_redirects_to_pth)\r\n      {\r\n        String8List candidate_parts = src_parts;\r\n        for(String8Node *p = non_redirected_pth_first; p != 0; p = p->next)\r\n        {\r\n          str8_list_push(scratch.arena, &candidate_parts, p->string);\r\n        }\r\n        StringJoin join = {0};\r\n        join.sep = str8_lit(\"/\");\r\n        String8 candidate_path = str8_list_join(arena, &candidate_parts, &join);\r\n        str8_list_push(arena, &result, candidate_path);\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Control Entity Info Extraction\r\n\r\ninternal Vec4F32\r\nrd_color_from_ctrl_entity(CTRL_Entity *entity)\r\n{\r\n  Vec4F32 result = {0};\r\n  if(entity->rgba != 0)\r\n  {\r\n    result = linear_from_srgba(rgba_from_u32(entity->rgba));\r\n  }\r\n  if(entity->rgba == 0) switch(entity->kind)\r\n  {\r\n    default:{}break;\r\n    case CTRL_EntityKind_Thread:\r\n    {\r\n      CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);\r\n      CTRL_Entity *main_thread = ctrl_entity_child_from_kind(process, CTRL_EntityKind_Thread);\r\n      if(main_thread != entity)\r\n      {\r\n        result = ui_color_from_name(str8_lit(\"thread_1\"));\r\n      }\r\n      else\r\n      {\r\n        result = ui_color_from_name(str8_lit(\"thread_0\"));\r\n      }\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity)\r\n{\r\n  String8 string = entity->string;\r\n  if(string.size == 0)\r\n  {\r\n    string = str8_lit(\"unnamed\");\r\n  }\r\n  if(entity->kind == CTRL_EntityKind_Module)\r\n  {\r\n    string = str8_skip_last_slash(string);\r\n  }\r\n  return string;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Spaces\r\n\r\n//- rjf: cfg <-> eval space\r\n\r\ninternal CFG_Node *\r\nrd_cfg_from_eval_space(E_Space space)\r\n{\r\n  CFG_Node *cfg = &cfg_nil_node;\r\n  if(space.kind == RD_EvalSpaceKind_MetaCfg)\r\n  {\r\n    CFG_ID id = space.u64s[0];\r\n    cfg = cfg_node_from_id(id);\r\n  }\r\n  return cfg;\r\n}\r\n\r\ninternal E_Space\r\nrd_eval_space_from_cfg(CFG_Node *cfg)\r\n{\r\n  E_Space space = e_space_make(RD_EvalSpaceKind_MetaCfg);\r\n  space.u64s[0] = cfg->id;\r\n  return space;\r\n}\r\n\r\n//- rjf: ctrl entity <-> eval space\r\n\r\ninternal CTRL_Entity *\r\nrd_ctrl_entity_from_eval_space(E_Space space)\r\n{\r\n  CTRL_Entity *entity = &ctrl_entity_nil;\r\n  if(space.kind == CTRL_EvalSpaceKind_Entity ||\r\n     space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||\r\n     space.kind == RD_EvalSpaceKind_MetaUnattachedProcess)\r\n  {\r\n    CTRL_Handle handle;\r\n    handle.machine_id = space.u64s[0];\r\n    handle.dmn_handle.u64[0] = space.u64s[1];\r\n    entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, handle);\r\n  }\r\n  return entity;\r\n}\r\n\r\ninternal E_Space\r\nrd_eval_space_from_ctrl_entity(CTRL_Entity *entity, E_SpaceKind kind)\r\n{\r\n  E_Space space = e_space_make(kind);\r\n  space.u64s[0] = entity->handle.machine_id;\r\n  space.u64s[1] = entity->handle.dmn_handle.u64[0];\r\n  return space;\r\n}\r\n\r\n//- rjf: command name <-> eval space\r\n\r\ninternal String8\r\nrd_cmd_name_from_eval(E_Eval eval)\r\n{\r\n  String8 result = {0};\r\n  if(eval.space.kind == RD_EvalSpaceKind_MetaCmd)\r\n  {\r\n    result = e_string_from_id(eval.value.u64);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: eval space reads/writes\r\n\r\ninternal U64\r\nrd_eval_space_gen(E_Space space)\r\n{\r\n  U64 result = 0;\r\n  switch(space.kind)\r\n  {\r\n    default:\r\n    {\r\n      result = ctrl_eval_space_gen(space);\r\n    }break;\r\n    case RD_EvalSpaceKind_MetaCfg:\r\n    case RD_EvalSpaceKind_MetaQuery:\r\n    {\r\n      result = cfg_change_gen();\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nrd_eval_space_read(E_Space space, void *out, Rng1U64 range)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 result = 0;\r\n  switch(space.kind)\r\n  {\r\n    default:\r\n    {\r\n      result = ctrl_eval_space_read(space, out, range);\r\n    }break;\r\n    \r\n    //- rjf: interior control entity reads (inside process address space or thread register block)\r\n    case CTRL_EvalSpaceKind_Entity:\r\n    {\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);\r\n      switch(entity->kind)\r\n      {\r\n        default:{}break;\r\n        case CTRL_EntityKind_Process:\r\n        {\r\n          CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, range, 0, rd_state->frame_eval_memread_endt_us);\r\n          String8 data = slice.data;\r\n          if(data.size == dim_1u64(range))\r\n          {\r\n            result = 1;\r\n            MemoryCopy(out, data.str, data.size);\r\n          }\r\n        }break;\r\n        case CTRL_EntityKind_Thread:\r\n        {\r\n          Access *access = access_open();\r\n          CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, 1, rd_state->frame_eval_memread_endt_us);\r\n          U64 concrete_frame_idx = e_interpret_ctx->reg_unwind_count;\r\n          if(concrete_frame_idx < call_stack.concrete_frames_count)\r\n          {\r\n            CTRL_CallStackFrame *f = call_stack.concrete_frames[concrete_frame_idx];\r\n            U64 regs_size = regs_block_size_from_arch(e_interpret_ctx->reg_arch);\r\n            Rng1U64 legal_range = r1u64(0, regs_size);\r\n            Rng1U64 read_range = intersect_1u64(legal_range, range);\r\n            U64 read_size = dim_1u64(read_range);\r\n            MemoryCopy(out, (U8 *)f->regs + read_range.min, read_size);\r\n            result = (read_size == dim_1u64(range));\r\n          }\r\n          access_close(access);\r\n        }break;\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: meta-config reads\r\n    case RD_EvalSpaceKind_MetaCfg:\r\n    {\r\n      //- rjf: unpack cfg\r\n      CFG_Node *root_cfg = rd_cfg_from_eval_space(space);\r\n      String8 child_key = e_string_from_id(space.u64s[1]);\r\n      CFG_Node *cfg = root_cfg;\r\n      if(child_key.size != 0)\r\n      {\r\n        cfg = cfg_node_child_from_string(root_cfg, child_key);\r\n      }\r\n      \r\n      //- rjf: determine data to read from, depending on child type in schema\r\n      String8 read_data = {0};\r\n      if(child_key.size != 0)\r\n      {\r\n        // rjf: get schemas for the accessed child\r\n        MD_Node *child_schema = &md_nil_node;\r\n        MD_Node *expr_child_schema = &md_nil_node;\r\n        {\r\n          MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, root_cfg->string);\r\n          for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)\r\n          {\r\n            child_schema = md_child_from_string(n->v, child_key, 0);\r\n            if(child_schema != &md_nil_node)\r\n            {\r\n              expr_child_schema = md_child_from_string(n->v, str8_lit(\"expression\"), 0);\r\n            }\r\n          }\r\n        }\r\n        String8 child_type_name = child_schema->first->string;\r\n        \r\n        // rjf: get value string (or default fallback)\r\n        String8 value_string = cfg->first->string;\r\n        if(value_string.size == 0)\r\n        {\r\n          value_string = md_tag_from_string(child_schema, str8_lit(\"default\"), 0)->first->string;\r\n        }\r\n        \r\n        // rjf: if this is an override child to a parent, fall back on defaults from parents\r\n        if(value_string.size == 0 && !md_node_is_nil(md_tag_from_string(child_schema, str8_lit(\"override\"), 0)))\r\n        {\r\n          for(CFG_Node *parent = root_cfg->parent; parent != &cfg_nil_node; parent = parent->parent)\r\n          {\r\n            CFG_Node *parent_child_w_key = cfg_node_child_from_string(parent, child_key);\r\n            if(parent_child_w_key != &cfg_nil_node)\r\n            {\r\n              value_string = parent_child_w_key->first->string;\r\n              break;\r\n            }\r\n            value_string = rd_default_setting_from_names(parent->string, child_key);\r\n            if(value_string.size != 0)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: if this is a query -> compute the value string based on query path\r\n        if(md_node_has_tag(child_schema, str8_lit(\"query\"), 0))\r\n        {\r\n          // TODO(rjf): this needs to be replaced by hooks\r\n          if(str8_match(child_schema->string, str8_lit(\"guid\"), 0))\r\n          {\r\n            Access *access = access_open();\r\n            String8 path = rd_path_from_cfg(root_cfg);\r\n            U64 timestamp = 0;\r\n            try_u64_from_str8_c_rules(cfg_node_child_from_string(root_cfg, str8_lit(\"timestamp\"))->first->string, &timestamp);\r\n            DI_Key key = di_key_from_path_timestamp(path, timestamp);\r\n            RDI_Parsed *rdi = di_rdi_from_key(access, key, 0, 0);\r\n            RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);\r\n            Guid guid = {0};\r\n            MemoryCopy(&guid, &tli->guid, Min(sizeof guid, sizeof tli->guid));\r\n            value_string = string_from_guid(scratch.arena, guid);\r\n            access_close(access);\r\n          }\r\n        }\r\n        \r\n        // rjf: textual data\r\n        if(str8_match(child_type_name, str8_lit(\"path\"), 0) ||\r\n           str8_match(child_type_name, str8_lit(\"path_pt\"), 0) ||\r\n           str8_match(child_type_name, str8_lit(\"code_string\"), 0) ||\r\n           str8_match(child_type_name, str8_lit(\"expr_string\"), 0) ||\r\n           str8_match(child_type_name, str8_lit(\"string\"), 0))\r\n        {\r\n          read_data = value_string;\r\n        }\r\n        \r\n        // rjf: non-textual data\r\n        else\r\n        {\r\n          E_Key parent_key = {0};\r\n          if(expr_child_schema != &md_nil_node && child_schema != expr_child_schema)\r\n          {\r\n            parent_key = e_key_from_string(cfg_node_child_from_string(root_cfg, expr_child_schema->string)->first->string);\r\n          }\r\n          E_ParentKey(parent_key)\r\n          {\r\n            if(str8_match(child_type_name, str8_lit(\"bool\"), 0))\r\n            {\r\n              B32 value = !!e_value_from_stringf(\"(bool)(%S)\", value_string).u64;\r\n              read_data = push_str8_copy(scratch.arena, str8_struct(&value));\r\n            }\r\n            else if(str8_match(child_type_name, str8_lit(\"u64\"), 0))\r\n            {\r\n              U64 value = e_value_from_stringf(\"(uint64)(%S)\", value_string).u64;\r\n              read_data = push_str8_copy(scratch.arena, str8_struct(&value));\r\n            }\r\n            else if(str8_match(child_type_name, str8_lit(\"u32\"), 0))\r\n            {\r\n              U64 value = e_value_from_stringf(\"(uint32)(%S)\", value_string).u64;\r\n              read_data = push_str8_copy(scratch.arena, str8_struct(&value));\r\n            }\r\n            else if(str8_match(child_type_name, str8_lit(\"f32\"), 0))\r\n            {\r\n              F32 value = e_value_from_stringf(\"(float32)(%S)\", value_string).f32;\r\n              read_data = push_str8_copy(scratch.arena, str8_struct(&value));\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: if no child key? -> just read from this cfg's child string - first 8 bytes -> offset of string (just 8), then string's content\r\n      if(child_key.size == 0)\r\n      {\r\n        read_data = cfg->first->string;\r\n      }\r\n      \r\n      // rjf: perform read\r\n      Rng1U64 legal_range = r1u64(0, read_data.size);\r\n      Rng1U64 read_range = intersect_1u64(range, legal_range);\r\n      if(read_range.min < read_range.max)\r\n      {\r\n        result = 1;\r\n        MemoryCopy(out, read_data.str + read_range.min, dim_1u64(read_range));\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: meta-entity reads\r\n    case RD_EvalSpaceKind_MetaCtrlEntity:\r\n    {\r\n      // rjf: unpack cfg\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);\r\n      String8 child_key = e_string_from_id(space.u64s[2]);\r\n      \r\n      // rjf: determine data to read from, depending on child name in schema\r\n      String8 read_data = {0};\r\n      if(child_key.size != 0)\r\n      {\r\n        MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, ctrl_entity_kind_code_name_table[entity->kind]);\r\n        MD_Node *child_schema = &md_nil_node;\r\n        for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)\r\n        {\r\n          child_schema = md_child_from_string(n->v, child_key, 0);\r\n        }\r\n        if(str8_match(child_schema->string, str8_lit(\"exe\"), 0) ||\r\n           str8_match(child_schema->string, str8_lit(\"label\"), 0))\r\n        {\r\n          read_data = entity->string;\r\n        }\r\n        else if(str8_match(child_schema->string, str8_lit(\"dbg\"), 0))\r\n        {\r\n          read_data = ctrl_entity_child_from_kind(entity, CTRL_EntityKind_DebugInfoPath)->string;\r\n        }\r\n        else if(str8_match(child_schema->string, str8_lit(\"vaddr_range\"), 0))\r\n        {\r\n          read_data = str8_struct(&entity->vaddr_range);\r\n        }\r\n        else if(str8_match(child_schema->string, str8_lit(\"id\"), 0))\r\n        {\r\n          read_data = str8_struct(&entity->id);\r\n        }\r\n        else if(str8_match(child_schema->string, str8_lit(\"active\"), 0))\r\n        {\r\n          B32 is_frozen = ctrl_entity_tree_is_frozen(entity);\r\n          B32 is_active = !is_frozen;\r\n          read_data = push_str8_copy(scratch.arena, str8_struct(&is_active));\r\n        }\r\n      }\r\n      \r\n      // rjf: perform read\r\n      Rng1U64 legal_range = r1u64(0, read_data.size);\r\n      Rng1U64 read_range = intersect_1u64(range, legal_range);\r\n      if(read_range.min < read_range.max)\r\n      {\r\n        result = 1;\r\n        MemoryCopy(out, read_data.str + read_range.min, dim_1u64(read_range));\r\n      }\r\n    }break;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nrd_eval_space_write(E_Space space, void *in, Rng1U64 range)\r\n{\r\n  B32 result = 0;\r\n  switch(space.kind)\r\n  {\r\n    default:{}break;\r\n    \r\n    //- rjf: interior control entity writes (inside process address space or\r\n    // thread register block)\r\n    case CTRL_EvalSpaceKind_Entity:\r\n    {\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);\r\n      switch(entity->kind)\r\n      {\r\n        default:{}break;\r\n        case CTRL_EntityKind_Process:\r\n        {\r\n          result = ctrl_process_write(entity->handle, range, in);\r\n        }break;\r\n        case CTRL_EntityKind_Thread:\r\n        {\r\n          Temp scratch = scratch_begin(0, 0);\r\n          U64 regs_size = regs_block_size_from_arch(entity->arch);\r\n          Rng1U64 legal_range = r1u64(0, regs_size);\r\n          Rng1U64 write_range = intersect_1u64(legal_range, range);\r\n          U64 write_size = dim_1u64(write_range);\r\n          void *new_regs = ctrl_reg_block_from_thread(scratch.arena, &d_state->ctrl_entity_store->ctx, entity->handle);\r\n          MemoryCopy((U8 *)new_regs + write_range.min, in, write_size);\r\n          result = ctrl_thread_write_reg_block(entity->handle, new_regs);\r\n          scratch_end(scratch);\r\n        }break;\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: meta-config writes\r\n    case RD_EvalSpaceKind_MetaCfg:\r\n    {\r\n      result = 1;\r\n      \r\n      // rjf: unpack write info\r\n      String8 write_string = str8_cstring_capped(in, (U8 *)in + dim_1u64(range));\r\n      \r\n      // rjf: unpack cfg\r\n      CFG_Node *root_cfg = rd_cfg_from_eval_space(space);\r\n      String8 child_key = e_string_from_id(space.u64s[1]);\r\n      \r\n      // rjf: no child key? -> overwrite child string\r\n      if(child_key.size == 0)\r\n      {\r\n        cfg_node_new_replace(rd_state->cfg, root_cfg, write_string);\r\n      }\r\n      \r\n      // rjf: child key -> look up & edit child\r\n      else\r\n      {\r\n        // rjf: modifying a label? -> poison this identifier in the macro map\r\n        if(str8_match(child_key, str8_lit(\"label\"), 0))\r\n        {\r\n          String8 pre_edit_label = rd_label_from_cfg(root_cfg);\r\n          if(!str8_match(pre_edit_label, write_string, 0))\r\n          {\r\n            E_Expr *expr = e_string2expr_map_lookup(e_ir_ctx->macro_map, pre_edit_label);\r\n            if(expr != &e_expr_nil)\r\n            {\r\n              e_string2expr_map_inc_poison(e_ir_ctx->macro_map, pre_edit_label);\r\n              e_string2expr_map_insert(e_cache->arena, e_ir_ctx->macro_map, write_string, expr);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: zero-range? delete child\r\n        if(range.min == range.max)\r\n        {\r\n          cfg_node_release(rd_state->cfg, cfg_node_child_from_string(root_cfg, child_key));\r\n        }\r\n        \r\n        // rjf: non-zero-range? create child if needed & write value\r\n        else\r\n        {\r\n          CFG_Node *child_cfg = cfg_node_child_from_string_or_alloc(rd_state->cfg, root_cfg, child_key);\r\n          cfg_node_new_replace(rd_state->cfg, child_cfg, write_string);\r\n        }\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: meta-ctrl-entity writes\r\n    case RD_EvalSpaceKind_MetaCtrlEntity:\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      \r\n      // rjf: unpack write info\r\n      String8 write_string = str8_cstring_capped(in, (U8 *)in + dim_1u64(range));\r\n      \r\n      // rjf: unpack cfg\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);\r\n      String8 child_key = e_string_from_id(space.u64s[2]);\r\n      \r\n      // rjf: perform write, based on child name in schema\r\n      if(child_key.size != 0)\r\n      {\r\n        MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, ctrl_entity_kind_code_name_table[entity->kind]);\r\n        MD_Node *child_schema = &md_nil_node;\r\n        for(MD_NodePtrNode *n = schemas.first; n != 0 && child_schema == &md_nil_node; n = n->next)\r\n        {\r\n          child_schema = md_child_from_string(n->v, child_key, 0);\r\n        }\r\n        if(str8_match(child_schema->string, str8_lit(\"label\"), 0))\r\n        {\r\n          result = 1;\r\n          ctrl_entity_equip_string(d_state->ctrl_entity_store, entity, write_string);\r\n          rd_cmd(D_CmdKind_SetEntityName, .ctrl_entity = entity->handle, .string = write_string);\r\n        }\r\n        else if(str8_match(child_schema->string, str8_lit(\"dbg\"), 0))\r\n        {\r\n          // TODO(rjf)\r\n        }\r\n        else if(str8_match(child_schema->string, str8_lit(\"active\"), 0))\r\n        {\r\n          result = 1;\r\n          B32 new_active = 0;\r\n          MemoryCopy(&new_active, in, dim_1u64(range));\r\n          if(!new_active)\r\n          {\r\n            rd_cmd(D_CmdKind_FreezeEntity, .ctrl_entity = entity->handle);\r\n          }\r\n          else\r\n          {\r\n            rd_cmd(D_CmdKind_ThawEntity, .ctrl_entity = entity->handle);\r\n          }\r\n        }\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: asynchronous streamed reads -> hashes from spaces\r\n\r\ninternal C_Key\r\nrd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated)\r\n{\r\n  C_Key result = {0};\r\n  switch(space.kind)\r\n  {\r\n    case E_SpaceKind_HashStoreKey:\r\n    {\r\n      C_Root root = {space.u64_0};\r\n      C_ID id = {space.u128};\r\n      result = c_key_make(root, id);\r\n    }break;\r\n    case E_SpaceKind_File:\r\n    {\r\n      U64 file_path_string_id = space.u64_0;\r\n      String8 file_path = e_string_from_id(file_path_string_id);\r\n      result = fs_key_from_path_range(file_path, range, 0);\r\n    }break;\r\n    case CTRL_EvalSpaceKind_Entity:\r\n    {\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);\r\n      if(entity->kind == CTRL_EntityKind_Process)\r\n      {\r\n        result = ctrl_key_from_process_vaddr_range(entity->handle, range, zero_terminated, 0, 0, 0);\r\n      }\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: space -> entire range\r\n\r\ninternal Rng1U64\r\nrd_whole_range_from_eval_space(E_Space space)\r\n{\r\n  Rng1U64 result = {0};\r\n  switch(space.kind)\r\n  {\r\n    case E_SpaceKind_HashStoreKey:\r\n    {\r\n      C_Root root = {space.u64_0};\r\n      C_ID id = {space.u128};\r\n      C_Key key = c_key_make(root, id);\r\n      U128 hash = c_hash_from_key(key, 0);\r\n      Access *access = access_open();\r\n      {\r\n        String8 data = c_data_from_hash(access, hash);\r\n        result = r1u64(0, data.size);\r\n      }\r\n      access_close(access);\r\n    }break;\r\n    case E_SpaceKind_File:\r\n    {\r\n      U64 file_path_string_id = space.u64_0;\r\n      String8 file_path = e_string_from_id(file_path_string_id);\r\n      FileProperties props = os_properties_from_file_path(file_path);\r\n      result = r1u64(0, props.size);\r\n    }break;\r\n    case CTRL_EvalSpaceKind_Entity:\r\n    {\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(space);\r\n      if(entity->kind == CTRL_EntityKind_Process)\r\n      {\r\n        result = r1u64(0, 0x7FFFFFFFFFFFull);\r\n      }\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation View Visualization & Interaction\r\n\r\n//- rjf: writing values back to child processes\r\n\r\ninternal B32\r\nrd_commit_eval_value_string(E_Eval dst_eval, String8 string)\r\n{\r\n  B32 result = 0;\r\n  if(dst_eval.irtree.mode == E_Mode_Offset)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    //- rjf: unpack type of destination\r\n    E_TypeKey type_key = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n    E_TypeKind type_kind = e_type_kind_from_key(type_key);\r\n    E_TypeKey direct_type_key = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_All);\r\n    E_TypeKind direct_type_kind = e_type_kind_from_key(direct_type_key);\r\n    \r\n    //- rjf: determine data we'll write\r\n    B32 got_commit_data = 0;\r\n    String8 commit_data = {0};\r\n    B32 commit_at_ptr_dest = 0;\r\n    if(!e_type_key_match(e_type_key_zero(), type_key))\r\n    {\r\n      //- rjf: meta evaluations? -> always treat string as textual content, as-is,\r\n      // and commit that.\r\n      if(!got_commit_data && dst_eval.space.kind == RD_EvalSpaceKind_MetaCfg)\r\n      {\r\n        got_commit_data = 1;\r\n        commit_data = string;\r\n      }\r\n      \r\n      //- rjf: basic types or enums? treat string as an expression, cast to the\r\n      // destination type, and compute commit data as being the binary representation\r\n      // of the new value.\r\n      if(!got_commit_data &&\r\n         ((E_TypeKind_FirstBasic <= type_kind && type_kind <= E_TypeKind_LastBasic) ||\r\n          type_kind == E_TypeKind_Enum))\r\n      {\r\n        got_commit_data = 1;\r\n        E_Eval src_eval = e_eval_from_stringf(\"(%S)(%S)\", e_type_string_from_key(scratch.arena, type_key), string);\r\n        commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value));\r\n        commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key));\r\n      }\r\n      \r\n      //- rjf: pointer or array to characters/integers? -> try to treat\r\n      // new value string as textual data\r\n      if(!got_commit_data &&\r\n         ((type_kind == E_TypeKind_Ptr || type_kind == E_TypeKind_Array) &&\r\n          (direct_type_kind == E_TypeKind_Char8 ||\r\n           direct_type_kind == E_TypeKind_Char16 ||\r\n           direct_type_kind == E_TypeKind_Char32 ||\r\n           direct_type_kind == E_TypeKind_UChar8 ||\r\n           direct_type_kind == E_TypeKind_UChar16 ||\r\n           direct_type_kind == E_TypeKind_UChar32 ||\r\n           e_type_kind_is_integer(direct_type_kind))))\r\n      {\r\n        got_commit_data = 1;\r\n        B32 is_quoted = 0;\r\n        if(string.size >= 1 && string.str[0] == '\"')\r\n        {\r\n          string = str8_skip(string, 1);\r\n          is_quoted = 1;\r\n        }\r\n        if(string.size >= 1 && string.str[string.size-1] == '\"')\r\n        {\r\n          string = str8_chop(string, 1);\r\n        }\r\n        if(is_quoted)\r\n        {\r\n          commit_data = raw_from_escaped_str8(scratch.arena, string);\r\n        }\r\n        else\r\n        {\r\n          commit_data = push_str8_copy(scratch.arena, string);\r\n        }\r\n        commit_data.size += 1;\r\n        if(type_kind == E_TypeKind_Ptr)\r\n        {\r\n          commit_at_ptr_dest = 1;\r\n        }\r\n        switch(direct_type_kind)\r\n        {\r\n          default:{}break;\r\n          case E_TypeKind_S16:\r\n          case E_TypeKind_U16:\r\n          case E_TypeKind_Char16:\r\n          case E_TypeKind_UChar16:\r\n          {\r\n            String16 data16 = str16_from_8(scratch.arena, commit_data);\r\n            commit_data = str8((U8 *)data16.str, data16.size*sizeof(U16));\r\n          }break;\r\n          case E_TypeKind_Char32:\r\n          case E_TypeKind_UChar32:\r\n          case E_TypeKind_S32:\r\n          case E_TypeKind_U32:\r\n          {\r\n            String32 data32 = str32_from_8(scratch.arena, commit_data);\r\n            commit_data = str8((U8 *)data32.str, data32.size*sizeof(U32));\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      //- rjf: pointer? -> try to treat new value as numeric value\r\n      if(!got_commit_data && type_kind == E_TypeKind_Ptr)\r\n      {\r\n        E_Eval src_eval = e_eval_from_string(string);\r\n        E_Eval src_eval_value = e_value_eval_from_eval(src_eval);\r\n        E_TypeKind src_eval_value_type_kind = e_type_kind_from_key(src_eval_value.irtree.type_key);\r\n        if((e_type_kind_is_pointer_or_ref(src_eval_value_type_kind) ||\r\n            e_type_kind_is_integer(src_eval_value_type_kind)) &&\r\n           src_eval_value.irtree.mode == E_Mode_Value)\r\n        {\r\n          got_commit_data = 1;\r\n          commit_data = push_str8_copy(scratch.arena, str8_struct(&src_eval.value));\r\n          commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(src_eval.irtree.type_key));\r\n          commit_data.size = Min(commit_data.size, e_type_byte_size_from_key(type_key));\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: determine destination offset we'll write the new data to\r\n    U64 dst_offset = dst_eval.value.u64;\r\n    if(got_commit_data && commit_at_ptr_dest)\r\n    {\r\n      E_Eval dst_value_eval = e_value_eval_from_eval(dst_eval);\r\n      dst_offset = dst_value_eval.value.u64;\r\n    }\r\n    \r\n    //- rjf: if we have commit data, then write that data to the destination offset\r\n    if(got_commit_data)\r\n    {\r\n      result = e_space_write(dst_eval.space, commit_data.str, r1u64(dst_offset, dst_offset + commit_data.size));\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: eval <-> file path\r\n\r\ninternal String8\r\nrd_file_path_from_eval(Arena *arena, E_Eval eval)\r\n{\r\n  String8 result = {0};\r\n  switch(eval.space.kind)\r\n  {\r\n    default:{}break;\r\n    case E_SpaceKind_File:\r\n    {\r\n      result = push_str8_copy(arena, e_string_from_id(eval.space.u64_0));\r\n    }break;\r\n    case E_SpaceKind_FileSystem:\r\n    {\r\n      result = push_str8_copy(arena, e_string_from_id(eval.value.u64));\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_file_path_from_eval_string(Arena *arena, String8 string)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    E_Eval eval = e_eval_from_string(string);\r\n    result = rd_file_path_from_eval(arena, eval);\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nrd_eval_string_from_file_path(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8 string_escaped = escaped_from_raw_str8(scratch.arena, string);\r\n  String8 result = push_str8f(arena, \"file:\\\"%S\\\".data\", string_escaped);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: eval -> query\r\n\r\ninternal String8\r\nrd_query_from_eval_string(Arena *arena, String8 string)\r\n{\r\n  String8 result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    E_Expr *expr = e_parse_from_string(string).expr;\r\n    if(expr->kind == E_ExprKind_LeafIdentifier &&\r\n       str8_match(expr->qualifier, str8_lit(\"query\"), 0))\r\n    {\r\n      result = expr->string;\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: View Functions\r\n\r\ninternal CFG_Node *\r\nrd_view_from_eval(CFG_Node *parent, E_Eval eval)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  E_TypeKey type_key = eval.irtree.type_key;\r\n  E_Type *type = e_type_from_key(type_key);\r\n  String8 schema_name = str8_lit(\"watch\");\r\n  B32 type_is_visualizer = 0;\r\n  if(type->kind == E_TypeKind_Lens)\r\n  {\r\n    RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(type->name);\r\n    if(view_ui_rule != &rd_nil_view_ui_rule)\r\n    {\r\n      schema_name = type->name;\r\n      type_is_visualizer = 1;\r\n    }\r\n  }\r\n  CFG_Node *view = cfg_node_child_from_string_or_alloc(rd_state->cfg, parent, schema_name);\r\n  cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"selected\"));\r\n  {\r\n    // rjf: get expression evaluation\r\n    // TODO(rjf): we need to account for UFCS style expressions here...\r\n    E_Eval expr_eval = eval;\r\n    if(eval.expr->kind == E_ExprKind_Call && type_is_visualizer)\r\n    {\r\n      expr_eval = e_eval_from_expr(eval.expr->first->next);\r\n    }\r\n    \r\n    // rjf: get arguments to view\r\n    E_Expr **args = 0;\r\n    U64 args_count = 0;\r\n    if(type->args != 0)\r\n    {\r\n      args = type->args;\r\n      args_count = type->count;\r\n    }\r\n    \r\n    // rjf: reflect expr & arguments in cfg tree\r\n    CFG_Node *expr_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"expression\"));\r\n    cfg_node_new_replace(rd_state->cfg, expr_root, e_full_expr_string_from_key(scratch.arena, expr_eval.key));\r\n    {\r\n      MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, schema_name);\r\n      U64 unnamed_order_idx = 0;\r\n      for EachIndex(arg_idx, args_count)\r\n      {\r\n        E_Expr *arg = args[arg_idx];\r\n        String8 param_name = {0};\r\n        E_Expr *arg_expr = arg;\r\n        if(arg->kind == E_ExprKind_Define)\r\n        {\r\n          param_name = arg->first->string;\r\n          arg_expr = arg->first->next;\r\n        }\r\n        else if(schemas.last != 0)\r\n        {\r\n          for MD_EachNode(schema_child, schemas.last->v->first)\r\n          {\r\n            MD_Node *order_tag = md_tag_from_string(schema_child, str8_lit(\"order\"), 0);\r\n            if(order_tag != &md_nil_node)\r\n            {\r\n              U64 schema_child_order_idx = 0;\r\n              try_u64_from_str8_c_rules(order_tag->first->string, &schema_child_order_idx);\r\n              if(schema_child_order_idx == unnamed_order_idx)\r\n              {\r\n                param_name = schema_child->string;\r\n                arg_expr = arg;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          unnamed_order_idx += 1;\r\n        }\r\n        CFG_Node *arg_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, param_name);\r\n        cfg_node_new_replace(rd_state->cfg, arg_root, e_string_from_expr(scratch.arena, arg_expr, str8_zero()));\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return view;\r\n}\r\n\r\ninternal RD_ViewState *\r\nrd_view_state_from_cfg(CFG_Node *cfg)\r\n{\r\n  RD_ViewState *view_state = &rd_nil_view_state;\r\n  CFG_ID id = cfg->id;\r\n  if(id != 0 &&\r\n     id == rd_state->view_state_last_accessed_id &&\r\n     id == rd_state->view_state_last_accessed->cfg_id)\r\n  {\r\n    view_state = rd_state->view_state_last_accessed;\r\n  }\r\n  else\r\n  {\r\n    U64 hash = d_hash_from_string(str8_struct(&id));\r\n    U64 slot_idx = hash%rd_state->view_state_slots_count;\r\n    RD_ViewStateSlot *slot = &rd_state->view_state_slots[slot_idx];\r\n    for(RD_ViewState *v = slot->first; v != 0; v = v->hash_next)\r\n    {\r\n      if(v->cfg_id == id)\r\n      {\r\n        view_state = v;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  if(view_state == &rd_nil_view_state)\r\n  {\r\n    view_state = rd_state->free_view_state;\r\n    if(view_state)\r\n    {\r\n      SLLStackPop_N(rd_state->free_view_state, hash_next);\r\n    }\r\n    else\r\n    {\r\n      view_state = push_array(rd_state->arena, RD_ViewState, 1);\r\n    }\r\n    MemoryCopyStruct(view_state, &rd_nil_view_state);\r\n    U64 hash = d_hash_from_string(str8_struct(&id));\r\n    U64 slot_idx = hash%rd_state->view_state_slots_count;\r\n    RD_ViewStateSlot *slot = &rd_state->view_state_slots[slot_idx];\r\n    DLLPushBack_NP(slot->first, slot->last, view_state, hash_next, hash_prev);\r\n    view_state->cfg_id = id;\r\n    view_state->arena = arena_alloc();\r\n    view_state->arena_reset_pos = arena_pos(view_state->arena);\r\n    view_state->ev_view = ev_view_alloc();\r\n  }\r\n  if(view_state != &rd_nil_view_state)\r\n  {\r\n    view_state->last_frame_index_touched = rd_state->frame_index;\r\n  }\r\n  rd_state->view_state_last_accessed = view_state;\r\n  rd_state->view_state_last_accessed_id = id;\r\n  return view_state;\r\n}\r\n\r\ntypedef struct RD_WatchRowExtrasDrawData RD_WatchRowExtrasDrawData;\r\nstruct RD_WatchRowExtrasDrawData\r\n{\r\n  B32 breaks_from_prev;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(rd_watch_row_extras_custom_draw)\r\n{\r\n  RD_WatchRowExtrasDrawData *draw_data = (RD_WatchRowExtrasDrawData *)user_data;\r\n  if(draw_data->breaks_from_prev) DR_ClipScope(intersect_2f32(dr_top_clip(), box->rect))\r\n  {\r\n    Vec4F32 shadow_color = ui_color_from_name(str8_lit(\"drop_shadow\"));\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x1, (box->rect.y0+box->rect.y1)/2), shadow_color, 0, 0, 0);\r\n    inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(0, 0, 0, 0);\r\n  }\r\n}\r\n\r\ninternal void\r\nrd_view_ui(Rng2F32 rect)\r\n{\r\n  ProfBeginFunction();\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n  String8 view_name = view->string;\r\n  String8 expr_string = rd_expr_from_cfg(view);\r\n  B32 view_is_floating = 0;\r\n  for(CFG_Node *p = view->parent; p != &cfg_nil_node; p = p->parent)\r\n  {\r\n    if(str8_match(p->string, str8_lit(\"immediate\"), 0))\r\n    {\r\n      view_is_floating = 1;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: query extension\r\n  //\r\n  CFG_Node *query_root = cfg_node_child_from_string(view, str8_lit(\"query\"));\r\n  CFG_Node *input_root = cfg_node_child_from_string(query_root, str8_lit(\"input\"));\r\n  CFG_Node *cmd_root = cfg_node_child_from_string(query_root, str8_lit(\"cmd\"));\r\n  String8 current_input = input_root->first->string;\r\n  B32 search_row_is_open = (vs->query_is_open);\r\n  F32 search_row_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"search_row_open_%p\", view),\r\n                                  (F32)!!search_row_is_open,\r\n                                  .initial = (F32)!!search_row_is_open,\r\n                                  .epsilon = 0.01f,\r\n                                  .rate    = rd_state->menu_animation_rate);\r\n  if(search_row_open_t > 0.001f)\r\n  {\r\n    String8 cmd_name = cmd_root->first->string;\r\n    RD_IconKind icon = rd_icon_kind_from_code_name(cmd_name);\r\n    RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n    \r\n    //- rjf: store cfg's string into view's\r\n    vs->query_string_size = Min(sizeof(vs->query_buffer), current_input.size);\r\n    MemoryCopy(vs->query_buffer, current_input.str, vs->query_string_size);\r\n    \r\n    //- rjf: clamp cursor\r\n    if(vs->query_cursor.column == 0)\r\n    {\r\n      vs->query_mark = txt_pt(1, 1);\r\n      vs->query_cursor = txt_pt(1, vs->query_string_size+1);\r\n    }\r\n    \r\n    //- rjf: determine dimensions\r\n    F32 search_row_height_target = ui_top_px_height();\r\n    F32 search_row_height = search_row_open_t*search_row_height_target;\r\n    search_row_height = Min(search_row_height, dim_2f32(rect).y);\r\n    rect.y0 += search_row_height;\r\n    rect.y0 = floor_f32(rect.y0);\r\n    \r\n    //- rjf: build container\r\n    UI_Box *search_row = &ui_nil_box;\r\n    UI_PrefHeight(ui_px(search_row_height, 1.f))\r\n    {\r\n      search_row = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DrawDropShadow, \"###search\");\r\n    }\r\n    \r\n    //- rjf: build contents\r\n    UI_Parent(search_row) UI_WidthFill UI_HeightFill UI_Focus(vs->query_is_open && !vs->contents_are_focused ? UI_FocusKind_On : UI_FocusKind_Off)\r\n      RD_Font(cmd_kind_info->query.flags & RD_QueryFlag_CodeInput ? RD_FontSlot_Code : RD_FontSlot_Main)\r\n    {\r\n      if(cmd_name.size != 0)\r\n      {\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n          UI_Transparency(1-search_row_open_t)\r\n          UI_PrefWidth(ui_em(2.5f, 1.f))\r\n          UI_TagF(\"weak\")\r\n          RD_Font(RD_FontSlot_Icons)\r\n          ui_label(rd_icon_kind_text_table[icon == RD_IconKind_Null ? RD_IconKind_Find : icon]);\r\n        UI_Transparency(1-search_row_open_t)\r\n          RD_Font(RD_FontSlot_Main) UI_PrefWidth(ui_text_dim(1, 1))\r\n          ui_label(rd_display_from_code_name(cmd_name));\r\n        ui_spacer(ui_em(0.5f, 1.f));\r\n      }\r\n      UI_Key line_edit_key = {0};\r\n      RD_CellParams params = {0};\r\n      {\r\n        params.flags |= !!(cmd_kind_info->query.flags & RD_QueryFlag_CodeInput) * RD_CellFlag_CodeContents;\r\n        params.flags |= RD_CellFlag_Border;\r\n        params.cursor               = &vs->query_cursor;\r\n        params.mark                 = &vs->query_mark;\r\n        params.edit_buffer          = vs->query_buffer;\r\n        params.edit_string_size_out = &vs->query_string_size;\r\n        params.edit_buffer_size     = sizeof(vs->query_buffer);\r\n        params.pre_edit_value       = current_input;\r\n        params.line_edit_key_out    = &line_edit_key;\r\n      }\r\n      UI_Transparency(1-search_row_open_t)\r\n      {\r\n        UI_Signal sig = rd_cellf(&params, \"###search\");\r\n#if 0\r\n        // TODO(rjf)\r\n        if(ui_is_focus_active())\r\n        {\r\n          rd_set_autocomp_regs(e_eval_nil,\r\n                               .ui_key = line_edit_key,\r\n                               .string = str8(vs->query_buffer, vs->query_string_size), \r\n                               .cursor = vs->query_cursor);\r\n        }\r\n#endif\r\n        if(ui_pressed(sig))\r\n        {\r\n          vs->query_is_open = 1;\r\n          vs->contents_are_focused = 0;\r\n          rd_cmd(RD_CmdKind_FocusPanel);\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: commit string to view\r\n    if(input_root == &cfg_nil_node)\r\n    {\r\n      input_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, query_root, str8_lit(\"input\"));\r\n    }\r\n    cfg_node_new_replace(rd_state->cfg, input_root, str8(vs->query_buffer, vs->query_string_size));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build main view container\r\n  //\r\n  UI_Box *view_container = &ui_nil_box;\r\n  UI_WidthFill UI_HeightFill\r\n  {\r\n    view_container = ui_build_box_from_key(0, ui_key_zero());\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: fill view container\r\n  //\r\n  UI_Parent(view_container)\r\n    UI_FontSize(rd_font_size())\r\n    UI_PrefHeight(ui_px(floor_f32(ui_top_font_size()*rd_setting_f32_from_name(str8_lit(\"row_height\"))), 1.f))\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: special-case view: \"getting started\"\r\n    //\r\n    if(0){}\r\n    else if(str8_match(view_name, str8_lit(\"getting_started\"), 0))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      ui_set_next_flags(UI_BoxFlag_DefaultFocusNav);\r\n      UI_Focus(UI_FocusKind_On) UI_WidthFill UI_HeightFill UI_NamedColumn(str8_lit(\"empty_view\"))\r\n        UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null)\r\n      {\r\n        CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"target\"));\r\n        CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n        \r\n        //- rjf: icon & info\r\n        UI_Padding(ui_em(2.f, 1.f)) UI_TagF(\"weak\")\r\n        {\r\n          //- rjf: icon\r\n          {\r\n            F32 icon_dim = ui_top_font_size()*10.f;\r\n            UI_PrefHeight(ui_px(icon_dim, 1.f))\r\n              UI_Row\r\n              UI_Padding(ui_pct(1, 0))\r\n              UI_PrefWidth(ui_px(icon_dim, 1.f))\r\n            {\r\n              R_Handle texture = rd_state->icon_texture;\r\n              Vec2S32 texture_dim = r_size_from_tex2d(texture);\r\n              ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit(\"\"));\r\n            }\r\n          }\r\n          \r\n          //- rjf: info\r\n          UI_Padding(ui_em(2.f, 1.f))\r\n            UI_WidthFill UI_PrefHeight(ui_em(2.f, 1.f))\r\n            UI_Row\r\n            UI_Padding(ui_pct(1, 0))\r\n            UI_TextAlignment(UI_TextAlign_Center)\r\n            UI_PrefWidth(ui_text_dim(10, 1))\r\n          {\r\n            ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL));\r\n          }\r\n        }\r\n        \r\n        //- rjf: targets state dependent helper\r\n        B32 helper_built = 0;\r\n        if(processes.count == 0)\r\n        {\r\n          helper_built = 1;\r\n          switch(targets.count)\r\n          {\r\n            //- rjf: user has no targets. build helper for adding them\r\n            case 0:\r\n            {\r\n              UI_PrefHeight(ui_em(3.75f, 1.f))\r\n                UI_Row\r\n                UI_Padding(ui_pct(1, 0))\r\n                UI_TextAlignment(UI_TextAlign_Center)\r\n                UI_PrefWidth(ui_em(22.f, 1.f))\r\n                UI_CornerRadius(ui_top_font_size()/2.f)\r\n                UI_TagF(\"pop\")\r\n                if(ui_clicked(rd_icon_buttonf(RD_IconKind_Add, 0, \"Add Target\")))\r\n              {\r\n                rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string);\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: user has 1 target. build helper for launching it\r\n            case 1:\r\n            {\r\n              CFG_Node *target_cfg = cfg_node_ptr_list_first(&targets);\r\n              D_Target target = rd_target_from_cfg(scratch.arena, target_cfg);\r\n              String8 target_full_path = target.exe;\r\n              String8 target_name = str8_skip_last_slash(target_full_path);\r\n              UI_PrefHeight(ui_em(3.75f, 1.f))\r\n                UI_Row\r\n                UI_Padding(ui_pct(1, 0))\r\n                UI_TextAlignment(UI_TextAlign_Center)\r\n                UI_PrefWidth(ui_em(22.f, 1.f))\r\n                UI_CornerRadius(ui_top_font_size()/2.f)\r\n                UI_TagF(\"good_pop\")\r\n              {\r\n                if(ui_clicked(rd_icon_buttonf(RD_IconKind_Play, 0, \"Launch %S\", target_name)))\r\n                {\r\n                  rd_cmd(RD_CmdKind_LaunchAndRun, .cfg = target_cfg->id);\r\n                }\r\n                ui_spacer(ui_em(1.5f, 1));\r\n                if(ui_clicked(rd_icon_buttonf(RD_IconKind_StepInto, 0, \"Step Into %S\", target_name)))\r\n                {\r\n                  rd_cmd(RD_CmdKind_LaunchAndStepInto, .cfg = target_cfg->id);\r\n                }\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: user has N targets.\r\n            default:\r\n            {\r\n              helper_built = 0;\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        //- rjf: or text\r\n        if(helper_built)\r\n        {\r\n          UI_TagF(\"weak\")\r\n            UI_PrefHeight(ui_em(2.25f, 1.f))\r\n            UI_Row\r\n            UI_Padding(ui_pct(1, 0))\r\n            UI_TextAlignment(UI_TextAlign_Center)\r\n            UI_WidthFill\r\n            ui_labelf(\"- or -\");\r\n        }\r\n        \r\n        //- rjf: helper text for command lister activation\r\n        UI_TagF(\"weak\")\r\n          UI_PrefHeight(ui_em(2.25f, 1.f)) UI_Row\r\n          UI_PrefWidth(ui_text_dim(10, 1))\r\n          UI_TextAlignment(UI_TextAlign_Center)\r\n          UI_Padding(ui_pct(1, 0))\r\n        {\r\n          ui_labelf(\"use\");\r\n          UI_TextAlignment(UI_TextAlign_Center) rd_cmd_binding_buttons(rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string, str8_zero(), 1);\r\n          ui_labelf(\"to search for commands and options\");\r\n        }\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: special-case view: pending\r\n    //\r\n    else if(str8_match(view_name, str8_lit(\"pending\"), 0))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      typedef struct State State;\r\n      struct State\r\n      {\r\n        Arena *deferred_cmd_arena;\r\n        RD_CmdList deferred_cmds;\r\n      };\r\n      State *state = rd_view_state(State);\r\n      if(state->deferred_cmd_arena == 0)\r\n      {\r\n        state->deferred_cmd_arena = rd_push_view_arena();\r\n      }\r\n      rd_store_view_loading_info(1, 0, 0);\r\n      \r\n      // rjf: any commands sent to this view need to be deferred until loading is complete\r\n      for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);)\r\n      {\r\n        RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n        switch(kind)\r\n        {\r\n          default:{}break;\r\n          case RD_CmdKind_GoToLine:\r\n          case RD_CmdKind_GoToAddress:\r\n          case RD_CmdKind_CenterCursor:\r\n          case RD_CmdKind_ContainCursor:\r\n          {\r\n            rd_cmd_list_push_new(state->deferred_cmd_arena, &state->deferred_cmds, cmd->name, cmd->regs);\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: unpack view's target expression & hash\r\n      E_Eval eval = e_eval_from_string(expr_string);\r\n      Rng1U64 range = r1u64(0, 1024);\r\n      C_Key key = rd_key_from_eval_space_range(eval.space, range, 0);\r\n      U128 hash = c_hash_from_key(key, 0);\r\n      \r\n      // rjf: determine if hash's blob is ready, and which viewer to use\r\n      B32 data_is_ready = 0;\r\n      String8 new_view_name = {0};\r\n      {\r\n        Access *access = access_open();\r\n        if(!u128_match(hash, u128_zero()))\r\n        {\r\n          String8 data = c_data_from_hash(access, hash);\r\n          U64 num_utf8_bytes = 0;\r\n          U64 num_unknown_bytes = 0;\r\n          for(U64 idx = 0; idx < data.size && idx < range.max;)\r\n          {\r\n            UnicodeDecode decode = utf8_decode(data.str+idx, data.size-idx);\r\n            if(decode.codepoint != max_U32 && (decode.inc > 1 ||\r\n                                               (10 <= decode.codepoint && decode.codepoint <= 13) ||\r\n                                               (32 <= decode.codepoint && decode.codepoint <= 126)))\r\n            {\r\n              num_utf8_bytes += decode.inc;\r\n              idx += decode.inc;\r\n            }\r\n            else\r\n            {\r\n              num_unknown_bytes += 1;\r\n              idx += 1;\r\n            }\r\n          }\r\n          data_is_ready = 1;\r\n          if(num_utf8_bytes > num_unknown_bytes*4 || num_unknown_bytes == 0)\r\n          {\r\n            new_view_name = str8_lit(\"text\");\r\n          }\r\n          else\r\n          {\r\n            new_view_name = str8_lit(\"memory\");\r\n          }\r\n        }\r\n        access_close(access);\r\n      }\r\n      \r\n      // rjf: if we don't have a viewer, just use the memory viewer.\r\n      if(new_view_name.size == 0)\r\n      {\r\n        new_view_name = str8_lit(\"memory\");\r\n      }\r\n      \r\n      // rjf: if data is ready and we have the name of a new visualizer,\r\n      // dispatch deferred commands & change this view's string to be\r\n      // that of the new visualizer.\r\n      if(data_is_ready && new_view_name.size != 0)\r\n      {\r\n        for(RD_CmdNode *cmd_node = state->deferred_cmds.first;\r\n            cmd_node != 0;\r\n            cmd_node = cmd_node->next)\r\n        {\r\n          RD_Cmd *cmd = &cmd_node->cmd;\r\n          rd_push_cmd(cmd->name, cmd->regs);\r\n        }\r\n        CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n        cfg_node_equip_string(rd_state->cfg, view, new_view_name);\r\n        RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n        for(RD_ArenaExt *ext = vs->first_arena_ext; ext != 0; ext = ext->next)\r\n        {\r\n          arena_release(ext->arena);\r\n        }\r\n        arena_pop_to(vs->arena, vs->arena_reset_pos);\r\n        vs->user_data = 0;\r\n        vs->first_arena_ext = vs->last_arena_ext = 0;\r\n      }\r\n      \r\n      // rjf: if we don't have a viewer, for whatever reason, then just\r\n      // close the tab.\r\n      if(data_is_ready && new_view_name.size == 0)\r\n      {\r\n        rd_cmd(RD_CmdKind_CloseTab);\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: watch view\r\n    //\r\n    else if(str8_match(view_name, str8_lit(\"watch\"), 0))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      RD_Font(RD_FontSlot_Code)\r\n      {\r\n        if(expr_string.size == 0)\r\n        {\r\n          expr_string = push_str8f(scratch.arena, \"query:config.$%I64x.watches\", rd_regs()->view);\r\n        }\r\n        E_Eval eval = e_eval_from_string(expr_string);\r\n        RD_WatchViewState *ewv = rd_view_state(RD_WatchViewState);\r\n        UI_ScrollPt2 scroll_pos = rd_view_scroll_pos();\r\n        F32 entity_hover_t_rate = rd_setting_b32_from_name(str8_lit(\"hover_animations\")) ? (1 - pow_f32(2, (-60.f * rd_state->frame_dt))) : 1.f;\r\n        B32 is_first_frame = 0;\r\n        if(ewv->initialized == 0)\r\n        {\r\n          is_first_frame = 1;\r\n          ewv->initialized = 1;\r\n          ewv->filter_arena = rd_push_view_arena();\r\n          ewv->text_edit_arena = rd_push_view_arena();\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: unpack arguments\r\n        //\r\n        EV_View *eval_view = rd_view_eval_view();\r\n        F32 row_height_px = ui_top_px_height();\r\n        S64 num_possible_visible_rows = (S64)(dim_2f32(rect).y/row_height_px);\r\n        F32 row_string_max_size_px = dim_2f32(rect).x;\r\n        EV_StringFlags string_flags = EV_StringFlag_ReadOnlyDisplayRules;\r\n        String8 filter = rd_view_query_input();\r\n        Vec4F32 pop_background_rgba = {0};\r\n        UI_TagF(\"pop\") pop_background_rgba = ui_color_from_name(str8_lit(\"background\"));\r\n        \r\n        //////////////////////////////\r\n        //- rjf: whenever the filter changes, we want to reset the cursor/mark state\r\n        //\r\n        if(!str8_match(filter, ewv->last_filter, 0))\r\n        {\r\n          MemoryZeroStruct(&ewv->cursor);\r\n          MemoryZeroStruct(&ewv->mark);\r\n          MemoryZeroStruct(&ewv->next_cursor);\r\n          MemoryZeroStruct(&ewv->next_mark);\r\n          arena_clear(ewv->filter_arena);\r\n          ewv->last_filter = push_str8_copy(ewv->filter_arena, filter);\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: decide if root should be implicit\r\n        //\r\n        // \"implicit\" means -> root is automatically expanded, row depth is 1 less than the\r\n        // block tree structure would suggest. this would be used if the root is, for instance,\r\n        // the \"collection of all watches\", to build a watch window. but this behavior is not\r\n        // as desirable if we are just using some other expression as the root.\r\n        //\r\n        B32 implicit_root = (cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit(\"explicit_root\")) == &cfg_nil_node);\r\n        \r\n        //////////////////////////////\r\n        //- rjf: determine autocompletion string\r\n        //\r\n        String8 autocomplete_hint_string = ui_autocomplete_string();\r\n        \r\n        //////////////////////////////\r\n        //- rjf: process commands\r\n        //\r\n        for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);)\r\n        {\r\n          RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n          switch(kind)\r\n          {\r\n            default:{}break;\r\n            case RD_CmdKind_Search:\r\n            case RD_CmdKind_SearchBackwards:\r\n            {\r\n              vs->query_is_open = 0;\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: consume events & perform navigations/edits - calculate state\r\n        //\r\n        EV_BlockTree block_tree = {0};\r\n        EV_BlockRangeList block_ranges = {0};\r\n        UI_ScrollListRowBlockArray row_blocks = {0};\r\n        Vec2S64 cursor_tbl = {0};\r\n        Vec2S64 mark_tbl = {0};\r\n        Rng2S64 selection_tbl = {0};\r\n        ProfScope(\"consume events & perform navigations/edits - calculate state\") UI_Focus(UI_FocusKind_On)\r\n        {\r\n          B32 state_dirty = 1;\r\n          B32 snap_to_cursor = 0;\r\n          B32 cursor_dirty__tbl = 0;\r\n          for(UI_Event *event = 0;;)\r\n          {\r\n            //////////////////////////\r\n            //- rjf: state -> viz blocks\r\n            //\r\n            if(state_dirty) ProfScope(\"state -> viz blocks\")\r\n            {\r\n              eval = e_eval_from_string(eval.string);\r\n              MemoryZeroStruct(&block_tree);\r\n              MemoryZeroStruct(&block_ranges);\r\n              if(implicit_root || is_first_frame)\r\n              {\r\n                ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);\r\n              }\r\n              block_tree   = ev_block_tree_from_eval(scratch.arena, eval_view, filter, eval);\r\n              block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree);\r\n              if(implicit_root && block_ranges.first != 0)\r\n              {\r\n                block_ranges.count -= 1;\r\n                block_ranges.first = block_ranges.first->next;\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: block ranges -> ui row blocks\r\n            //\r\n            ProfScope(\"block ranges -> ui row blocks\")\r\n            {\r\n              UI_ScrollListRowBlockChunkList row_block_chunks = {0};\r\n              for(EV_BlockRangeNode *n = block_ranges.first; n != 0; n = n->next)\r\n              {\r\n                UI_ScrollListRowBlock block = {0};\r\n                block.row_count  = dim_1u64(n->v.range);\r\n                block.item_count = n->v.block->viz_expand_info.single_item ? 1 : dim_1u64(n->v.range);\r\n                ui_scroll_list_row_block_chunk_list_push(scratch.arena, &row_block_chunks, 256, &block);\r\n              }\r\n              row_blocks = ui_scroll_list_row_block_array_from_chunk_list(scratch.arena, &row_block_chunks);\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: conclude state update\r\n            //\r\n            if(state_dirty)\r\n            {\r\n              state_dirty = 0;\r\n            }\r\n            \r\n            //////////////////////////////\r\n            //- rjf: 2D table coordinates * blocks -> stable cursor state\r\n            //\r\n            if(cursor_dirty__tbl)\r\n            {\r\n              cursor_dirty__tbl = 0;\r\n              struct\r\n              {\r\n                RD_WatchPt *pt_state;\r\n                Vec2S64 pt_tbl;\r\n              }\r\n              points[] =\r\n              {\r\n                {&ewv->cursor, cursor_tbl},\r\n                {&ewv->mark, mark_tbl},\r\n              };\r\n              for(U64 point_idx = 0; point_idx < ArrayCount(points); point_idx += 1)\r\n              {\r\n                EV_Key last_key = points[point_idx].pt_state->key;\r\n                EV_Key last_parent_key = points[point_idx].pt_state->parent_key;\r\n                points[point_idx].pt_state[0] = rd_watch_pt_from_tbl(&block_ranges, points[point_idx].pt_tbl);\r\n                if(ev_key_match(ev_key_zero(), points[point_idx].pt_state->key) && points[point_idx].pt_tbl.y != 0)\r\n                {\r\n                  points[point_idx].pt_state->key = last_parent_key;\r\n                  EV_ExpandNode *node = ev_expand_node_from_key(eval_view, last_parent_key);\r\n                  for(EV_ExpandNode *n = node; n != 0; n = n->parent)\r\n                  {\r\n                    points[point_idx].pt_state->key = n->key;\r\n                    if(n->expanded == 0)\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                if(point_idx == 0 &&\r\n                   (!ev_key_match(ewv->cursor.key, last_key) ||\r\n                    !ev_key_match(ewv->cursor.parent_key, last_parent_key)))\r\n                {\r\n                  ewv->text_editing = 0;\r\n                }\r\n              }\r\n              ewv->next_cursor = ewv->cursor;\r\n              ewv->next_mark = ewv->mark;\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: stable cursor state * blocks -> 2D table coordinates\r\n            //\r\n            EV_WindowedRowList mark_rows = {0};\r\n            Rng2S64 cursor_tbl_range = {0};\r\n            {\r\n              // rjf: compute 2d table coordinates\r\n              cursor_tbl = rd_tbl_from_watch_pt(&block_ranges, ewv->cursor);\r\n              mark_tbl = rd_tbl_from_watch_pt(&block_ranges, ewv->mark);\r\n              \r\n              // rjf: compute legal coordinate range, given selection-defining row\r\n              Rng1S64 cursor_x_range = {0};\r\n              {\r\n                EV_Row *row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, mark_tbl.y);\r\n                RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n                cursor_x_range = r1s64(0, (S64)row_info.cells.count-1);\r\n              }\r\n              cursor_tbl_range = r2s64(v2s64(cursor_x_range.min, 0), v2s64(cursor_x_range.max, block_tree.total_item_count - implicit_root));\r\n              \r\n              // rjf: clamp x positions of cursor/mark tbl\r\n              for EachEnumVal(Axis2, axis)\r\n              {\r\n                cursor_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), cursor_tbl.v[axis]);\r\n                mark_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), mark_tbl.v[axis]);\r\n              }\r\n              \r\n              // rjf: form selection range table coordinates\r\n              selection_tbl = r2s64p(Min(cursor_tbl.x, mark_tbl.x), Min(cursor_tbl.y, mark_tbl.y),\r\n                                     Max(cursor_tbl.x, mark_tbl.x), Max(cursor_tbl.y, mark_tbl.y));\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] snap to cursor\r\n            //\r\n            if(snap_to_cursor)\r\n            {\r\n              Rng1S64 global_vnum_range  = r1s64(1, block_tree.total_row_count+1);\r\n              if(contains_1s64(global_vnum_range, cursor_tbl.y))\r\n              {\r\n                UI_ScrollPt *scroll_pt = &scroll_pos.y;\r\n                \r\n                //- rjf: compute visible row range\r\n                Rng1S64 visible_row_num_range = r1s64(scroll_pt->idx + 1 - !!(scroll_pt->off < 0),\r\n                                                      scroll_pt->idx + 1 + num_possible_visible_rows);\r\n                \r\n                //- rjf: compute cursor row range from cursor item\r\n                Rng1S64 cursor_visibility_row_num_range = {0};\r\n                cursor_visibility_row_num_range.min = ev_vnum_from_num(&block_ranges, cursor_tbl.y) - 1;\r\n                cursor_visibility_row_num_range.max = cursor_visibility_row_num_range.min + 3;\r\n                \r\n                //- rjf: compute deltas & apply\r\n                S64 min_delta = Min(0, cursor_visibility_row_num_range.min-visible_row_num_range.min);\r\n                S64 max_delta = Max(0, cursor_visibility_row_num_range.max-visible_row_num_range.max);\r\n                S64 new_num = (S64)scroll_pt->idx + 1 + min_delta + max_delta;\r\n                new_num = clamp_1s64(global_vnum_range, new_num);\r\n                if(new_num > 0)\r\n                {\r\n                  U64 new_idx = (U64)(new_num - 1);\r\n                  ui_scroll_pt_target_idx(scroll_pt, new_idx);\r\n                }\r\n              }\r\n            }\r\n            \r\n            //////////////////////////////\r\n            //- rjf: apply cursor/mark rugpull change\r\n            //\r\n            B32 cursor_rugpull = 0;\r\n            if(!rd_watch_pt_match(ewv->cursor, ewv->next_cursor))\r\n            {\r\n              cursor_rugpull = 1;\r\n              ewv->cursor = ewv->next_cursor;\r\n              ewv->mark = ewv->next_mark;\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: grab next event, if any - otherwise exit the loop, as we now have\r\n            // the most up-to-date state\r\n            //\r\n            B32 next_event_good = ui_next_event(&event);\r\n            if(!cursor_rugpull && (!next_event_good || !ui_is_focus_active()))\r\n            {\r\n              break;\r\n            }\r\n            UI_Event dummy_evt = zero_struct;\r\n            UI_Event *evt = &dummy_evt;\r\n            if(next_event_good)\r\n            {\r\n              evt = event;\r\n            }\r\n            B32 taken = 0;\r\n            \r\n            //////////////////////////////\r\n            //- rjf: consume query-completion events, if this view is being used as a lister\r\n            //\r\n            {\r\n              if(evt->kind == UI_EventKind_Press &&\r\n                 evt->slot == UI_EventActionSlot_Accept &&\r\n                 selection_tbl.min.y == selection_tbl.max.y &&\r\n                 (cfg_node_child_from_string(view, str8_lit(\"lister\")) != &cfg_nil_node))\r\n              {\r\n                CFG_Node *query = cfg_node_child_from_string(view, str8_lit(\"query\"));\r\n                CFG_Node *cmd = cfg_node_child_from_string(query, str8_lit(\"cmd\"));\r\n                String8 cmd_name = cmd->first->string;\r\n                \r\n                // rjf: if we have no selection, just pick the first row\r\n                EV_Row *row = 0;\r\n                if(selection_tbl.min.y == 0 && selection_tbl.max.y == 0)\r\n                {\r\n                  row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, 1);\r\n                }\r\n                \r\n                // rjf: if we do have a selection, compute that row\r\n                else\r\n                {\r\n                  row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, selection_tbl.min.y);\r\n                }\r\n                \r\n                // rjf: use row to complete query\r\n                if(row->eval.expr != &e_expr_nil)\r\n                {\r\n                  taken = 1;\r\n                  E_Eval eval = row->eval;\r\n                  \r\n                  // rjf: if we have a specific command we are trying to complete, then\r\n                  // fill registers based on this row's evaluation.\r\n                  if(cmd_name.size != 0) switch(eval.space.kind)\r\n                  {\r\n                    default:\r\n                    {\r\n                      U64 voff = 0;\r\n                      DI_Key dbgi_key = {0};\r\n                      if(eval.space.kind == CTRL_EvalSpaceKind_Entity)\r\n                      {\r\n                        U64 vaddr = eval.value.u64;\r\n                        CTRL_Entity *process = rd_ctrl_entity_from_eval_space(eval.space);\r\n                        CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);\r\n                        dbgi_key = ctrl_dbgi_key_from_module(module);\r\n                        voff = ctrl_voff_from_vaddr(module, vaddr);\r\n                      }\r\n                      else\r\n                      {\r\n                        voff = eval.value.u64;\r\n                        E_DbgInfo *dbg_info = e_dbg_info_from_type_key(eval.irtree.type_key);\r\n                        dbgi_key = dbg_info->dbgi_key;\r\n                      }\r\n                      {\r\n                        Access *access = access_open();\r\n                        RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n                        String8 name = {0};\r\n                        if(name.size == 0)\r\n                        {\r\n                          RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);\r\n                          name.str = rdi_name_from_procedure(rdi, procedure, &name.size);\r\n                        }\r\n                        if(name.size == 0)\r\n                        {\r\n                          RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);\r\n                          name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size);\r\n                        }\r\n                        if(name.size != 0)\r\n                        {\r\n                          rd_cmd(RD_CmdKind_CompleteQuery, .string = name);\r\n                        }\r\n                        access_close(access);\r\n                      }\r\n                    }break;\r\n                    case E_SpaceKind_File:\r\n                    case E_SpaceKind_FileSystem:\r\n                    {\r\n                      E_Type *type = e_type_from_key(eval.irtree.type_key);\r\n                      String8 file = rd_file_path_from_eval(scratch.arena, eval);\r\n                      if(str8_match(type->name, str8_lit(\"folder\"), 0))\r\n                      {\r\n                        String8 new_input_string = push_str8f(scratch.arena, \"%S/\", file);\r\n                        rd_cmd(RD_CmdKind_UpdateQuery, .string = new_input_string);\r\n                      }\r\n                      else\r\n                      {\r\n                        rd_cmd(RD_CmdKind_CompleteQuery, .file_path = file);\r\n                      }\r\n                    }break;\r\n                    case RD_EvalSpaceKind_MetaCfg:\r\n                    {\r\n                      CFG_Node *cfg = rd_cfg_from_eval_space(eval.space);\r\n                      rd_cmd(RD_CmdKind_CompleteQuery, .cfg = cfg->id);\r\n                    }break;\r\n                    case RD_EvalSpaceKind_MetaCtrlEntity:\r\n                    {\r\n                      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);\r\n                      RD_RegsScope(.ctrl_entity = entity->handle)\r\n                      {\r\n                        if(0){}\r\n                        else if(entity->kind == CTRL_EntityKind_Thread)  { rd_regs()->thread = entity->handle; }\r\n                        else if(entity->kind == CTRL_EntityKind_Module)  { rd_regs()->module = entity->handle; }\r\n                        else if(entity->kind == CTRL_EntityKind_Process) { rd_regs()->process = entity->handle; }\r\n                        else if(entity->kind == CTRL_EntityKind_Machine) { rd_regs()->machine = entity->handle; }\r\n                        rd_cmd(RD_CmdKind_CompleteQuery);\r\n                      }\r\n                    }break;\r\n                    case RD_EvalSpaceKind_MetaUnattachedProcess:\r\n                    {\r\n                      U64 pid = eval.value.u128.u64[0];\r\n                      rd_cmd(RD_CmdKind_CompleteQuery, .pid = pid);\r\n                    }break;\r\n                    case RD_EvalSpaceKind_MetaCmd:\r\n                    {\r\n                      String8 cmd_name = rd_cmd_name_from_eval(eval);\r\n                      rd_cmd(RD_CmdKind_CompleteQuery, .cmd_name = cmd_name);\r\n                    }break;\r\n                    case RD_EvalSpaceKind_MetaTheme:\r\n                    {\r\n                      String8 name = e_string_from_id(eval.value.u64);\r\n                      rd_cmd(RD_CmdKind_CompleteQuery, .string = name);\r\n                    }break;\r\n                  }\r\n                  \r\n                  // rjf: if we do not have a specific command, then we can just\r\n                  // pick a sensible default based on what was selected.\r\n                  if(cmd_name.size == 0)\r\n                  {\r\n                    B32 did_cmd = 1;\r\n                    switch(eval.space.kind)\r\n                    {\r\n                      default:\r\n                      {\r\n                        String8 name = {0};\r\n                        {\r\n                          U64 vaddr = eval.value.u64;\r\n                          CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process);\r\n                          CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);\r\n                          DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n                          U64 voff = ctrl_voff_from_vaddr(module, vaddr);\r\n                          {\r\n                            Access *access = access_open();\r\n                            RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 1, 0);\r\n                            if(name.size == 0)\r\n                            {\r\n                              RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);\r\n                              name.str = rdi_name_from_procedure(rdi, procedure, &name.size);\r\n                            }\r\n                            if(name.size == 0)\r\n                            {\r\n                              RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);\r\n                              name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &name.size);\r\n                            }\r\n                            access_close(access);\r\n                          }\r\n                        }\r\n                        if(name.size != 0)\r\n                        {\r\n                          rd_cmd(RD_CmdKind_GoToName, .string = name);\r\n                        }\r\n                        else\r\n                        {\r\n                          rd_cmd(RD_CmdKind_PushQuery, .expr = e_string_from_expr(scratch.arena, eval.expr, str8_zero()));\r\n                        }\r\n                      }break;\r\n                      case E_SpaceKind_File:\r\n                      case E_SpaceKind_FileSystem:\r\n                      {\r\n                        String8 file = rd_file_path_from_eval(scratch.arena, eval);\r\n                        rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = file, .vaddr = 0);\r\n                      }break;\r\n                      case RD_EvalSpaceKind_MetaCfg:\r\n                      {\r\n                        CFG_Node *cfg = rd_cfg_from_eval_space(eval.space);\r\n                        if(str8_match(cfg->string, str8_lit(\"recent_file\"), 0))\r\n                        {\r\n                          rd_cmd(RD_CmdKind_Switch, .cfg = cfg->id);\r\n                        }\r\n                        else if(str8_match(cfg->string, str8_lit(\"recent_project\"), 0))\r\n                        {\r\n                          rd_cmd(RD_CmdKind_OpenRecentProject, .cfg = cfg->id);\r\n                        }\r\n                        else if(e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)) == E_TypeKind_Set)\r\n                        {\r\n                          rd_cmd(RD_CmdKind_PushQuery, .expr = e_full_expr_string_from_key(scratch.arena, eval.key));\r\n                        }\r\n                        else\r\n                        {\r\n                          did_cmd = 0;\r\n                        }\r\n                      }break; \r\n                      case RD_EvalSpaceKind_MetaQuery:\r\n                      {\r\n                        rd_cmd(RD_CmdKind_PushQuery, .expr = e_full_expr_string_from_key(scratch.arena, eval.key));\r\n                      }break;\r\n                      case RD_EvalSpaceKind_MetaUnattachedProcess:\r\n                      {\r\n                        U64 pid = eval.value.u128.u64[0];\r\n                      }break;\r\n                      case RD_EvalSpaceKind_MetaCmd:\r\n                      {\r\n                        String8 cmd_name = rd_cmd_name_from_eval(eval);\r\n                        rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name);\r\n                      }break;\r\n                      case RD_EvalSpaceKind_MetaCtrlEntity:\r\n                      {\r\n                        CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);\r\n                        rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, \"query:control.%S\", ctrl_string_from_handle(scratch.arena, entity->handle)));\r\n                      }break;\r\n                    }\r\n                    if(did_cmd)\r\n                    {\r\n                      rd_cmd(RD_CmdKind_CompleteQuery);\r\n                    }\r\n                    else\r\n                    {\r\n                      taken = 0;\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: begin editing on some operations\r\n            //\r\n            if(!ewv->text_editing &&\r\n               (evt->kind == UI_EventKind_Text ||\r\n                evt->flags & UI_EventFlag_Paste ||\r\n                (evt->kind == UI_EventKind_Press && evt->slot == UI_EventActionSlot_Edit)) &&\r\n               selection_tbl.min.x == selection_tbl.max.x &&\r\n               (selection_tbl.min.y != 0 || selection_tbl.max.y != 0))\r\n            {\r\n              Vec2S64 selection_dim = dim_2s64(selection_tbl);\r\n              arena_clear(ewv->text_edit_arena);\r\n              ewv->text_edit_state_slots_count = u64_up_to_pow2(selection_dim.y+1);\r\n              ewv->text_edit_state_slots_count = Max(ewv->text_edit_state_slots_count, 64);\r\n              ewv->text_edit_state_slots = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState*, ewv->text_edit_state_slots_count);\r\n              EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));\r\n              EV_WindowedRowNode *row_node = rows.first;\r\n              B32 any_edits_started = 0;\r\n              for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next)\r\n              {\r\n                EV_Row *row = &row_node->row;\r\n                RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n                S64 cell_x = 0;\r\n                for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, cell_x += 1)\r\n                {\r\n                  if(cell_x < selection_tbl.min.x || selection_tbl.max.x < cell_x)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags & (~EV_StringFlag_ReadOnlyDisplayRules), &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);\r\n                  if(cell_info.flags & RD_WatchCellFlag_CanEdit)\r\n                  {\r\n                    any_edits_started = 1;\r\n                    String8 string = {0};\r\n                    if(cell_info.flags & RD_WatchCellFlag_NoEval)\r\n                    {\r\n                      string = cell->eval.string;\r\n                    }\r\n                    else\r\n                    {\r\n                      string = dr_string_from_fstrs(scratch.arena, &cell_info.eval_fstrs);\r\n                    }\r\n                    string.size = Min(string.size, sizeof(ewv->dummy_text_edit_state.input_buffer));\r\n                    RD_WatchPt pt = {row->block->key, row->key, rd_id_from_watch_cell(cell)};\r\n                    U64 hash = ev_hash_from_key(pt.key);\r\n                    U64 slot_idx = hash%ewv->text_edit_state_slots_count;\r\n                    RD_WatchViewTextEditState *edit_state = push_array(ewv->text_edit_arena, RD_WatchViewTextEditState, 1);\r\n                    SLLStackPush_N(ewv->text_edit_state_slots[slot_idx], edit_state, pt_hash_next);\r\n                    edit_state->pt           = pt;\r\n                    edit_state->cursor       = txt_pt(1, string.size+1);\r\n                    edit_state->mark         = txt_pt(1, 1);\r\n                    edit_state->input_size   = string.size;\r\n                    MemoryCopy(edit_state->input_buffer, string.str, string.size);\r\n                    edit_state->initial_size = string.size;\r\n                    MemoryCopy(edit_state->initial_buffer, string.str, string.size);\r\n                  }\r\n                }\r\n              }\r\n              ewv->text_editing = any_edits_started;\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] do cell-granularity multi-cursor 'accept' operations (expansions / etc.); if\r\n            // cannot apply to multi-cursor, then just don't take the event\r\n            //\r\n            if(!ewv->text_editing && evt->slot == UI_EventActionSlot_Accept &&\r\n               (selection_tbl.min.y != 0 || selection_tbl.max.y != 0) &&\r\n               (selection_tbl.max.y - selection_tbl.min.y > 0))\r\n            {\r\n              EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));\r\n              EV_WindowedRowNode *row_node = rows.first;\r\n              if(row_node != 0)\r\n              {\r\n                taken = 1;\r\n                for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row_node != 0; y += 1, row_node = row_node->next)\r\n                {\r\n                  // rjf: unpack row info\r\n                  EV_Row *row = &row_node->row;\r\n                  RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n                  \r\n                  // rjf: loop through X selections and perform operations for each\r\n                  for(S64 x = selection_tbl.min.x; x <= selection_tbl.max.x; x += 1)\r\n                  {\r\n#if 0 // TODO(rjf): @cfg (multicursor watch window press operations)\r\n                    //- rjf: determine operation for this cell\r\n                    typedef enum OpKind\r\n                    {\r\n                      OpKind_Null,\r\n                      OpKind_DoExpand,\r\n                    }\r\n                    OpKind;\r\n                    OpKind kind = OpKind_Null;\r\n                    switch(row_kind)\r\n                    {\r\n                      default:{}break;\r\n                      case RD_WatchViewRowKind_Normal:\r\n                      {\r\n                        RD_WatchViewColumn *col = rd_watch_view_column_from_x(ewv, x);\r\n                        switch(col->kind)\r\n                        {\r\n                          default:{}break;\r\n                          case RD_WatchViewColumnKind_Expr: {kind = OpKind_DoExpand;}break;\r\n                        }\r\n                      }break;\r\n                      case RD_WatchViewRowKind_PrettyEntityControls:\r\n                      if((!rd_entity_is_nil(row_info.collection_entity) || row_info.collection_ctrl_entity != &ctrl_entity_nil) && selection_tbl.min.x == 1 && selection_tbl.max.x == 1)\r\n                      {\r\n                        kind = OpKind_DoExpand;\r\n                      }break;\r\n                    }\r\n                    \r\n                    //- rjf: perform operation\r\n                    switch(kind)\r\n                    {\r\n                      default:{taken = 0;}break;\r\n                      case OpKind_DoExpand:\r\n                      if(ev_row_is_expandable(row))\r\n                      {\r\n                        B32 is_expanded = ev_expansion_from_key(eval_view, row->key);\r\n                        ev_key_set_expansion(eval_view, row->block->key, row->key, !is_expanded);\r\n                      }break;\r\n                    }\r\n#endif\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [text] apply textual edits\r\n            //\r\n            if(ewv->text_editing)\r\n            {\r\n              B32 editing_complete = ((evt->kind == UI_EventKind_Press && (evt->slot == UI_EventActionSlot_Cancel || evt->slot == UI_EventActionSlot_Accept)) ||\r\n                                      (evt->kind == UI_EventKind_Navigate && evt->delta_2s32.y != 0) ||\r\n                                      cursor_rugpull);\r\n              rd_state->text_edit_mode = 1;\r\n              if(editing_complete ||\r\n                 ((evt->kind == UI_EventKind_Edit ||\r\n                   evt->kind == UI_EventKind_Navigate ||\r\n                   evt->kind == UI_EventKind_Text) &&\r\n                  evt->delta_2s32.y == 0))\r\n              {\r\n                taken = 1;\r\n                EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));\r\n                EV_WindowedRowNode *row_node = rows.first;\r\n                for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next)\r\n                {\r\n                  EV_Row *row = &row_node->row;\r\n                  RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n                  S64 cell_x = 0;\r\n                  for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, cell_x += 1)\r\n                  {\r\n                    if(cell_x < selection_tbl.min.x || selection_tbl.max.x < cell_x)\r\n                    {\r\n                      continue;\r\n                    }\r\n                    RD_WatchPt pt = {row->block->key, row->key, rd_id_from_watch_cell(cell)};\r\n                    RD_WatchViewTextEditState *edit_state = rd_watch_view_text_edit_state_from_pt(ewv, pt);\r\n                    String8 string = str8(edit_state->input_buffer, edit_state->input_size);\r\n                    UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark);\r\n                    \r\n                    // rjf: copy\r\n                    if(op.flags & UI_TxtOpFlag_Copy && selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y)\r\n                    {\r\n                      os_set_clipboard_text(op.copy);\r\n                    }\r\n                    \r\n                    // rjf: any valid *additive* op & autocomplete hint? -> perform autocomplete first, then re-compute op\r\n                    if(!(evt->flags & UI_EventFlag_Delete) && autocomplete_hint_string.size != 0)\r\n                    {\r\n                      String8 autocomplete_string = ui_autocomplete();\r\n                      CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n                      RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n                      RD_AutocompCursorInfo *autocomp_cursor_info = &ws->autocomp_cursor_info;\r\n                      String8 new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(autocomp_cursor_info->replaced_range.min+1, autocomp_cursor_info->replaced_range.max+1), autocomplete_string);\r\n                      new_string.size = Min(sizeof(edit_state->input_buffer), new_string.size);\r\n                      MemoryCopy(edit_state->input_buffer, new_string.str, new_string.size);\r\n                      edit_state->input_size = new_string.size;\r\n                      edit_state->cursor = edit_state->mark = txt_pt(1, 1+autocomp_cursor_info->replaced_range.min+autocomplete_string.size);\r\n                      string = str8(edit_state->input_buffer, edit_state->input_size);\r\n                      op = ui_single_line_txt_op_from_event(scratch.arena, evt, string, edit_state->cursor, edit_state->mark);\r\n                    }\r\n                    \r\n                    // rjf: cancel? -> revert to initial string\r\n                    if(editing_complete && evt->slot == UI_EventActionSlot_Cancel)\r\n                    {\r\n                      string = str8(edit_state->initial_buffer, edit_state->initial_size);\r\n                    }\r\n                    \r\n                    // rjf: obtain edited string\r\n                    String8 new_string = string;\r\n                    if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0)\r\n                    {\r\n                      new_string = ui_push_string_replace_range(scratch.arena, string, r1s64(op.range.min.column, op.range.max.column), op.replace);\r\n                    }\r\n                    \r\n                    // rjf: commit to edit state\r\n                    new_string.size = Min(new_string.size, sizeof(edit_state->input_buffer));\r\n                    MemoryCopy(edit_state->input_buffer, new_string.str, new_string.size);\r\n                    edit_state->input_size = new_string.size;\r\n                    edit_state->cursor = op.cursor;\r\n                    edit_state->mark = op.mark;\r\n                    \r\n                    // rjf: commit edited cell string - first try to commit eval value, if that path is\r\n                    // enabled on this cell, next try to commit expression string, if that path is enabled\r\n                    if(cell->kind == RD_WatchCellKind_Eval)\r\n                    {\r\n                      if(cell->flags & RD_WatchCellFlag_Expr && cell->flags & RD_WatchCellFlag_NoEval)\r\n                      {\r\n                        CFG_Node *cfg = row_info.group_cfg_child;\r\n                        String8 child_key = {0}; // str8_lit(\"expression\");\r\n                        if(cfg == &cfg_nil_node && editing_complete && new_string.size != 0)\r\n                        {\r\n                          CFG_Node *new_cfg_parent = row_info.group_cfg_parent;\r\n                          if(new_cfg_parent != &cfg_nil_node)\r\n                          {\r\n                            child_key = str8_zero();\r\n                          }\r\n                          if(new_cfg_parent == &cfg_nil_node)\r\n                          {\r\n                            CFG_NodePtrList all_cfgs = cfg_node_top_level_list_from_string(scratch.arena, row_info.group_cfg_name);\r\n                            new_cfg_parent = cfg_node_ptr_list_last(&all_cfgs)->parent;\r\n                          }\r\n                          if(new_cfg_parent == &cfg_nil_node)\r\n                          {\r\n                            new_cfg_parent = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n                          }\r\n                          cfg = cfg_node_new(rd_state->cfg, new_cfg_parent, row_info.group_cfg_name);\r\n                          state_dirty = 1;\r\n                          snap_to_cursor = 1;\r\n                        }\r\n                        if(cfg != &cfg_nil_node)\r\n                        {\r\n                          CFG_Node *expr = child_key.size != 0 ? cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, child_key) : cfg;\r\n                          cfg_node_new_replace(rd_state->cfg, expr, new_string);\r\n                        }\r\n                      }\r\n                      else\r\n                      {\r\n                        B32 should_commit_asap = editing_complete;\r\n                        if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg)\r\n                        {\r\n                          should_commit_asap = 1;\r\n                        }\r\n                        else if(evt->slot != UI_EventActionSlot_Cancel)\r\n                        {\r\n                          should_commit_asap = editing_complete;\r\n                        }\r\n                        if(should_commit_asap)\r\n                        {\r\n                          B32 success = 0;\r\n                          success = rd_commit_eval_value_string(cell->eval, new_string);\r\n                          state_dirty = 1;\r\n                          if(!success)\r\n                          {\r\n                            log_user_error(str8_lit(\"Could not commit value successfully.\"));\r\n                          }\r\n                        }\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              if(editing_complete)\r\n              {\r\n                ewv->text_editing = 0;\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] do cell-granularity copies\r\n            //\r\n            if(!ewv->text_editing && evt->flags & UI_EventFlag_Copy)\r\n            {\r\n              taken = 1;\r\n              String8List strs = {0};\r\n              EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));\r\n              EV_WindowedRowNode *row_node = rows.first;\r\n              for(S64 y = selection_tbl.min.y; y <= selection_tbl.max.y && row_node != 0; y += 1, row_node = row_node->next)\r\n              {\r\n                EV_Row *row = &row_node->row;\r\n                RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n                S64 cell_x = 0;\r\n                for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, cell_x += 1)\r\n                {\r\n                  if(cell_x < selection_tbl.min.x || selection_tbl.max.x < cell_x)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, &row_info, cell, ui_top_font(), ui_top_font_size(), row_string_max_size_px);\r\n                  String8List cell_strings = {0};\r\n                  str8_list_push(scratch.arena, &cell_strings, dr_string_from_fstrs(scratch.arena, &cell_info.expr_fstrs));\r\n                  str8_list_push(scratch.arena, &cell_strings, dr_string_from_fstrs(scratch.arena, &cell_info.eval_fstrs));\r\n                  String8 cell_string = str8_list_join(scratch.arena, &cell_strings, &(StringJoin){.sep = str8_lit(\" \")});\r\n                  cell_string = str8_skip_chop_whitespace(cell_string);\r\n                  U64 comma_pos = str8_find_needle(cell_string, 0, str8_lit(\",\"), 0);\r\n                  if(selection_tbl.min.x != selection_tbl.max.x || selection_tbl.min.y != selection_tbl.max.y)\r\n                  {\r\n                    str8_list_pushf(scratch.arena, &strs, \"%s%S%s%s\",\r\n                                    comma_pos < cell_string.size ? \"\\\"\" : \"\",\r\n                                    cell_string,\r\n                                    comma_pos < cell_string.size ? \"\\\"\" : \"\",\r\n                                    cell_x+1 <= selection_tbl.max.x ? \",\" : \"\");\r\n                  }\r\n                  else\r\n                  {\r\n                    str8_list_push(scratch.arena, &strs, cell_string);\r\n                  }\r\n                }\r\n                if(y+1 <= selection_tbl.max.y)\r\n                {\r\n                  str8_list_push(scratch.arena, &strs, str8_lit(\"\\n\"));\r\n                }\r\n              }\r\n              String8 string = str8_list_join(scratch.arena, &strs, 0);\r\n              os_set_clipboard_text(string);\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] do cell-granularity deletions\r\n            //\r\n            if(!ewv->text_editing && evt->flags & UI_EventFlag_Delete)\r\n            {\r\n              taken = 1;\r\n              state_dirty = 1;\r\n              snap_to_cursor = 1;\r\n              CFG_NodePtrList cfgs_to_remove = {0};\r\n              RD_WatchPt next_cursor_pt = {0};\r\n              B32 next_cursor_set = 0;\r\n              EV_WindowedRowList rows = ev_rows_from_num_range(scratch.arena, eval_view, &block_ranges, r1u64(selection_tbl.min.y, selection_tbl.max.y+1));\r\n              EV_WindowedRowNode *row_node = rows.first;\r\n              for(S64 y = selection_tbl.min.y; row_node != 0 && y <= selection_tbl.max.y; y += 1, row_node = row_node->next)\r\n              {\r\n                EV_Row *row = &row_node->row;\r\n                RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n                S64 cell_x = 0;\r\n                for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, cell_x += 1)\r\n                {\r\n                  if(cell_x < selection_tbl.min.x || selection_tbl.max.x < cell_x)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  RD_WatchPt pt = {row->block->key, row->key, rd_id_from_watch_cell(cell)};\r\n                  if(cell->flags & RD_WatchCellFlag_Expr && cell->flags & RD_WatchCellFlag_NoEval)\r\n                  {\r\n                    CFG_Node *cfg = row_info.group_cfg_child;\r\n                    if(cfg != &cfg_nil_node)\r\n                    {\r\n                      cfg_node_ptr_list_push(scratch.arena, &cfgs_to_remove, cfg);\r\n                      U64 deleted_num = ev_block_num_from_id(row->block, row->key.child_id);\r\n                      if(deleted_num != 0)\r\n                      {\r\n                        EV_Key parent_key = row->block->parent->key;\r\n                        EV_Key key = row->block->key;\r\n                        U64 fallback_id_prev = ev_block_id_from_num(row->block, deleted_num-1);\r\n                        U64 fallback_id_next = ev_block_id_from_num(row->block, deleted_num+1);\r\n                        if(fallback_id_next != 0)\r\n                        {\r\n                          parent_key = row->block->key;\r\n                          key = ev_key_make(row->key.parent_hash, fallback_id_next);\r\n                        }\r\n                        else if(fallback_id_prev != 0)\r\n                        {\r\n                          parent_key = row->block->key;\r\n                          key = ev_key_make(row->key.parent_hash, fallback_id_prev);\r\n                        }\r\n                        RD_WatchPt new_pt = {parent_key, key, pt.cell_id};\r\n                        next_cursor_pt = new_pt;\r\n                        next_cursor_set = 1;\r\n                        state_dirty = 1;\r\n                      }\r\n                    }\r\n                  }\r\n                  else\r\n                  {\r\n                    rd_commit_eval_value_string(cell->eval, str8_zero());\r\n                  }\r\n                }\r\n              }\r\n              for(CFG_NodePtrNode *n = cfgs_to_remove.first; n != 0; n = n->next)\r\n              {\r\n                cfg_node_release(rd_state->cfg, n->v);\r\n              }\r\n              if(next_cursor_set)\r\n              {\r\n                ewv->cursor = ewv->mark = ewv->next_cursor = ewv->next_mark = next_cursor_pt;\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] apply deltas to cursor & mark\r\n            //\r\n            if(!ewv->text_editing && !(evt->flags & UI_EventFlag_Delete) && !(evt->flags & UI_EventFlag_Reorder))\r\n            {\r\n              B32 cursor_tbl_min_is_empty_selection[Axis2_COUNT] = {0, 1};\r\n              Vec2S32 delta = evt->delta_2s32;\r\n              if(evt->flags & UI_EventFlag_PickSelectSide && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max))\r\n              {\r\n                if(delta.x > 0 || delta.y > 0)\r\n                {\r\n                  cursor_tbl.x = selection_tbl.max.x;\r\n                  cursor_tbl.y = selection_tbl.max.y;\r\n                }\r\n                else if(delta.x < 0 || delta.y < 0)\r\n                {\r\n                  cursor_tbl.x = selection_tbl.min.x;\r\n                  cursor_tbl.y = selection_tbl.min.y;\r\n                }\r\n              }\r\n              if(evt->flags & UI_EventFlag_ZeroDeltaOnSelect && !MemoryMatchStruct(&selection_tbl.min, &selection_tbl.max))\r\n              {\r\n                MemoryZeroStruct(&delta);\r\n              }\r\n              B32 moved = 1;\r\n              switch(evt->delta_unit)\r\n              {\r\n                default:{moved = 0;}break;\r\n                case UI_EventDeltaUnit_Char:\r\n                {\r\n                  for EachEnumVal(Axis2, axis)\r\n                  {\r\n                    cursor_tbl.v[axis] += delta.v[axis];\r\n                    if(cursor_tbl.v[axis] < cursor_tbl_range.min.v[axis])\r\n                    {\r\n                      cursor_tbl.v[axis] = cursor_tbl_range.max.v[axis];\r\n                    }\r\n                    if(cursor_tbl.v[axis] > cursor_tbl_range.max.v[axis])\r\n                    {\r\n                      cursor_tbl.v[axis] = cursor_tbl_range.min.v[axis];\r\n                    }\r\n                    cursor_tbl.v[axis] = clamp_1s64(r1s64(cursor_tbl_range.min.v[axis], cursor_tbl_range.max.v[axis]), cursor_tbl.v[axis]);\r\n                  }\r\n                }break;\r\n                case UI_EventDeltaUnit_Word:\r\n                case UI_EventDeltaUnit_Line:\r\n                case UI_EventDeltaUnit_Page:\r\n                {\r\n                  cursor_tbl.x  = (delta.x>0 ? (cursor_tbl_range.max.x) :\r\n                                   delta.x<0 ? (cursor_tbl_range.min.x + !!cursor_tbl_min_is_empty_selection[Axis2_X]) :\r\n                                   cursor_tbl.x);\r\n                  cursor_tbl.y += ((delta.y>0 ? +(num_possible_visible_rows-3) :\r\n                                    delta.y<0 ? -(num_possible_visible_rows-3) :\r\n                                    0));\r\n                  cursor_tbl.y = clamp_1s64(r1s64(cursor_tbl_range.min.y + !!cursor_tbl_min_is_empty_selection[Axis2_Y],\r\n                                                  cursor_tbl_range.max.y),\r\n                                            cursor_tbl.y);\r\n                }break;\r\n                case UI_EventDeltaUnit_Whole:\r\n                {\r\n                  for EachEnumVal(Axis2, axis)\r\n                  {\r\n                    cursor_tbl.v[axis] = (delta.v[0]>0 ? cursor_tbl_range.max.v[axis] : delta.v[0]<0 ? cursor_tbl_range.min.v[axis] + !!cursor_tbl_min_is_empty_selection[axis] : cursor_tbl.v[axis]);\r\n                  }\r\n                }break;\r\n              }\r\n              if(moved)\r\n              {\r\n                taken = 1;\r\n                cursor_dirty__tbl = 1;\r\n                snap_to_cursor = 1;\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] stick table mark to cursor if needed\r\n            //\r\n            if(!ewv->text_editing)\r\n            {\r\n              if(taken && !(evt->flags & UI_EventFlag_KeepMark))\r\n              {\r\n                mark_tbl = cursor_tbl;\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: [table] do cell-granularity reorders\r\n            //\r\n            if(!ewv->text_editing && evt->flags & UI_EventFlag_Reorder)\r\n            {\r\n              taken = 1;\r\n              if(filter.size == 0)\r\n              {\r\n                // rjf: determine blocks of each endpoint of the table selection\r\n                EV_Block *selection_endpoint_blocks[2] =\r\n                {\r\n                  ev_block_range_from_num(&block_ranges, selection_tbl.min.y).block,\r\n                  ev_block_range_from_num(&block_ranges, selection_tbl.max.y).block,\r\n                };\r\n                \r\n                // rjf: pick shallowest block within which we can do reordering\r\n                U64 selection_depths[2] =\r\n                {\r\n                  ev_depth_from_block(selection_endpoint_blocks[0]),\r\n                  ev_depth_from_block(selection_endpoint_blocks[1]),\r\n                };\r\n                EV_Block *selection_block = (selection_depths[1] < selection_depths[0]\r\n                                             ? selection_endpoint_blocks[1]\r\n                                             : selection_endpoint_blocks[0]);\r\n                \r\n                // rjf: find selection keys within the block in which we are doing reordering\r\n                EV_Key selection_keys_in_block[2] = {0};\r\n                {\r\n                  for EachElement(idx, selection_endpoint_blocks)\r\n                  {\r\n                    EV_Block *endpoint_block = selection_endpoint_blocks[idx];\r\n                    if(endpoint_block == selection_block)\r\n                    {\r\n                      selection_keys_in_block[idx] = ev_key_from_num(&block_ranges, selection_tbl.v[idx].y);\r\n                    }\r\n                    else\r\n                    {\r\n                      for(;endpoint_block->parent != selection_block && endpoint_block != &ev_nil_block;)\r\n                      {\r\n                        endpoint_block = endpoint_block->parent;\r\n                      }\r\n                      if(endpoint_block->parent == selection_block)\r\n                      {\r\n                        selection_keys_in_block[idx] = endpoint_block->key;\r\n                      }\r\n                    }\r\n                  }\r\n                  EV_Key fallback_key = {0};\r\n                  for EachElement(idx, selection_endpoint_blocks)\r\n                  {\r\n                    if(!ev_key_match(selection_keys_in_block[idx], ev_key_zero()))\r\n                    {\r\n                      fallback_key = selection_keys_in_block[idx];\r\n                    }\r\n                  }\r\n                  for EachElement(idx, selection_endpoint_blocks)\r\n                  {\r\n                    if(ev_key_match(selection_keys_in_block[idx], ev_key_zero()))\r\n                    {\r\n                      selection_keys_in_block[idx] = fallback_key;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: determine collection info for the block\r\n                String8 group_cfg_name = {0};\r\n                {\r\n                  E_IRTreeAndType block_irtree = selection_block->eval.irtree;\r\n                  E_TypeKey block_type_key = e_type_key_unwrap(block_irtree.type_key, E_TypeUnwrapFlag_AllDecorative);\r\n                  E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key);\r\n                  if(block_type_kind == E_TypeKind_Set)\r\n                  {\r\n                    E_Type *block_type = e_type_from_key(block_type_key);\r\n                    group_cfg_name = rd_singular_from_code_name_plural(block_type->name);\r\n                    if(group_cfg_name.size == 0)\r\n                    {\r\n                      group_cfg_name = block_type->name;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: map selection endpoints to cfgs\r\n                CFG_Node *first_cfg = &cfg_nil_node;\r\n                CFG_Node *last_cfg = &cfg_nil_node;\r\n                if(group_cfg_name.size != 0)\r\n                {\r\n                  first_cfg = cfg_node_from_id(selection_keys_in_block[0].child_id);\r\n                  last_cfg  = cfg_node_from_id(selection_keys_in_block[1].child_id);\r\n                }\r\n                \r\n                // rjf: reorder\r\n                if(first_cfg != &cfg_nil_node && last_cfg != &cfg_nil_node)\r\n                {\r\n                  CFG_Node *first_cfg_prev = &cfg_nil_node;\r\n                  CFG_Node *last_cfg_next  = &cfg_nil_node;\r\n                  for(CFG_Node *prev = first_cfg->prev; prev != &cfg_nil_node; prev = prev->prev)\r\n                  {\r\n                    if(str8_match(prev->string, first_cfg->string, 0))\r\n                    {\r\n                      first_cfg_prev = prev;\r\n                      break;\r\n                    }\r\n                  }\r\n                  for(CFG_Node *next = last_cfg->next; next != &cfg_nil_node; next = next->next)\r\n                  {\r\n                    if(str8_match(next->string, last_cfg->string, 0))\r\n                    {\r\n                      last_cfg_next = next;\r\n                      break;\r\n                    }\r\n                  }\r\n                  if(evt->delta_2s32.y < 0 && first_cfg != &cfg_nil_node && first_cfg_prev != &cfg_nil_node)\r\n                  {\r\n                    state_dirty = 1;\r\n                    snap_to_cursor = 1;\r\n                    CFG_Node *parent = first_cfg_prev->parent;\r\n                    cfg_node_unhook(rd_state->cfg, parent, first_cfg_prev);\r\n                    cfg_node_insert_child(rd_state->cfg, parent, last_cfg, first_cfg_prev);\r\n                  }\r\n                  if(evt->delta_2s32.y > 0 && last_cfg != &cfg_nil_node && last_cfg_next != &cfg_nil_node)\r\n                  {\r\n                    state_dirty = 1;\r\n                    snap_to_cursor = 1;\r\n                    CFG_Node *parent = last_cfg_next->parent;\r\n                    cfg_node_unhook(rd_state->cfg, parent, last_cfg_next);\r\n                    cfg_node_insert_child(rd_state->cfg, parent, first_cfg_prev, last_cfg_next);\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            //////////////////////////\r\n            //- rjf: consume event, if taken\r\n            //\r\n            if(taken && evt != &dummy_evt)\r\n            {\r\n              ui_eat_event(evt);\r\n            }\r\n          }\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: autocomplete watches -> feed autocompletion info forward\r\n        //\r\n        if(rd_watch_pt_match(ewv->cursor, ewv->mark) &&\r\n           cfg_node_child_from_string(view, str8_lit(\"autocomplete\")) != &cfg_nil_node)\r\n        {\r\n          U64 row_num = ev_num_from_key(&block_ranges, ewv->cursor.key);\r\n          EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), &block_ranges, row_num);\r\n          RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n          RD_WatchCell *cell = row_info.cells.first;\r\n          if(cell != 0)\r\n          {\r\n            RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, 0, &row_info, cell, ui_top_font(), ui_top_font_size(), dim_2f32(rect).y);\r\n            String8 string = dr_string_from_fstrs(ui_build_arena(), &cell_info.eval_fstrs);\r\n            if(string.size != 0)\r\n            {\r\n              ui_set_autocomplete_string(string);\r\n            }\r\n          }\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: build ui\r\n        //\r\n        B32 pressed = 0;\r\n        ProfScope(\"build ui\")\r\n        {\r\n          Vec2F32 rect_dim = dim_2f32(rect);\r\n          F32 contents_width_px = (rect_dim.x - floor_f32(ui_bottom_font_size()*1.5f));\r\n          Rng1S64 visible_row_rng = {0};\r\n          UI_ScrollListParams scroll_list_params = {0};\r\n          {\r\n            scroll_list_params.flags         = UI_ScrollListFlag_All;\r\n            scroll_list_params.row_height_px = row_height_px;\r\n            scroll_list_params.dim_px        = rect_dim;\r\n            scroll_list_params.cursor_range  = r2s64(v2s64(0, 0), v2s64(0, 0));\r\n            scroll_list_params.item_range    = r1s64(0, block_tree.total_row_count - !!implicit_root);\r\n            scroll_list_params.cursor_min_is_empty_selection[Axis2_Y] = 1;\r\n            scroll_list_params.row_blocks    = row_blocks;\r\n          }\r\n          UI_BoxFlags disabled_flags = ui_top_flags();\r\n          if(d_ctrl_targets_running())\r\n          {\r\n            disabled_flags |= UI_BoxFlag_Disabled;\r\n          }\r\n          UI_ScrollListSignal scroll_list_sig = {0};\r\n          UI_Focus(UI_FocusKind_On)\r\n            UI_ScrollList(&scroll_list_params, &scroll_pos.y,\r\n                          0,\r\n                          0,\r\n                          &visible_row_rng,\r\n                          &scroll_list_sig)\r\n            UI_Focus(UI_FocusKind_Null)\r\n          {\r\n            ui_set_next_pref_height(ui_children_sum(1));\r\n            ui_set_next_child_layout_axis(Axis2_Y);\r\n            UI_Box *table = ui_build_box_from_string(0, str8_lit(\"table\"));\r\n            UI_Parent(table)\r\n            {\r\n              Vec2F32 scroll_list_view_off_px = ui_top_parent()->parent->view_off;\r\n              \r\n              ////////////////////////\r\n              //- rjf: viz blocks -> rows\r\n              //\r\n              EV_WindowedRowList rows = {0};\r\n              {\r\n                rows = ev_windowed_row_list_from_block_range_list(scratch.arena, eval_view, &block_ranges, r1u64(visible_row_rng.min+1, visible_row_rng.max+2));\r\n              }\r\n              \r\n              ////////////////////////\r\n              //- rjf: rows -> row infos\r\n              //\r\n              RD_WatchRowInfo *row_infos = push_array(scratch.arena, RD_WatchRowInfo, rows.count);\r\n              {\r\n                U64 idx = 0;\r\n                for(EV_WindowedRowNode *row_node = rows.first; row_node != 0; row_node = row_node->next, idx += 1)\r\n                {\r\n                  EV_Row *row = &row_node->row;\r\n                  row_infos[idx] = rd_watch_row_info_from_row(scratch.arena, row);\r\n                }\r\n              }\r\n              \r\n              ////////////////////////\r\n              //- rjf: build boundaries\r\n              //\r\n              B32 cell_pcts_are_dirty = 0;\r\n              ProfScope(\"build boundaries\")\r\n              {\r\n                U64 idx = 0;\r\n                U64 boundary_start_idx = 0;\r\n                EV_Row *last_row = 0;\r\n                RD_WatchRowInfo *last_row_info = 0;\r\n                for(EV_WindowedRowNode *row_node = rows.first;; row_node = row_node->next, idx += 1)\r\n                {\r\n                  //- rjf: determine if this row breaks the topology\r\n                  B32 is_new_topology = (row_node == 0);\r\n                  if(row_node != 0 && last_row_info != 0)\r\n                  {\r\n                    EV_Row *row = &row_node->row;\r\n                    RD_WatchRowInfo *row_info = &row_infos[idx];\r\n                    for(RD_WatchCell *last_cell = last_row_info->cells.first, *this_cell = row_info->cells.first;;\r\n                        last_cell = last_cell->next, this_cell = this_cell->next)\r\n                    {\r\n                      if(last_cell == 0 && this_cell == 0)\r\n                      {\r\n                        break;\r\n                      }\r\n                      if((last_cell == 0 && this_cell != 0) || (last_cell != 0 && this_cell == 0))\r\n                      {\r\n                        is_new_topology = 1;\r\n                        break;\r\n                      }\r\n                      if(rd_id_from_watch_cell(last_cell) != rd_id_from_watch_cell(this_cell))\r\n                      {\r\n                        is_new_topology = 1;\r\n                        break;\r\n                      }\r\n                    }\r\n                  }\r\n                  \r\n                  //- rjf: if we reached a new topology, or the end -> build boundaries for all cell separations\r\n                  if(is_new_topology)\r\n                  {\r\n                    EV_Row *row = last_row;\r\n                    RD_WatchRowInfo *row_info = last_row_info;\r\n                    F32 row_width_px = contents_width_px;\r\n                    if(row_info != 0)\r\n                    {\r\n                      U64 row_hash = ev_hash_from_key(row->key);\r\n                      F32 cell_x_px = 0;\r\n                      U64 cell_idx = 0;\r\n                      for(RD_WatchCell *cell = row_info->cells.first; cell != 0 && cell->next != 0; cell = cell->next, cell_idx += 1)\r\n                      {\r\n                        if(cell->pct == 0 || cell->next->pct == 0)\r\n                        {\r\n                          continue;\r\n                        }\r\n                        U64 cell_id = rd_id_from_watch_cell(cell);\r\n                        F32 cell_width_px = cell->px + cell->pct * row_width_px;\r\n                        F32 next_cell_x_px = cell_x_px + cell_width_px;\r\n                        {\r\n                          Rng2F32 rect = r2f32p(next_cell_x_px - ui_top_font_size()*0.4f,\r\n                                                boundary_start_idx*row_height_px,\r\n                                                next_cell_x_px + ui_top_font_size()*0.4f,\r\n                                                idx*row_height_px);\r\n                          UI_Rect(rect) UI_HoverCursor(OS_Cursor_LeftRight)\r\n                          {\r\n                            UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|UI_BoxFlag_Floating, \"boundary_%I64x_%I64x\", row_hash, cell_id);\r\n                            UI_Signal sig = ui_signal_from_box(box);\r\n                            if(ui_dragging(sig))\r\n                            {\r\n                              typedef struct DragData DragData;\r\n                              struct DragData\r\n                              {\r\n                                F32 min_pct;\r\n                                F32 max_pct;\r\n                              };\r\n                              if(ui_pressed(sig))\r\n                              {\r\n                                DragData drag_data = {cell->pct, cell->next->pct};\r\n                                ui_store_drag_struct(&drag_data);\r\n                              }\r\n                              DragData *drag_data = ui_get_drag_struct(DragData);\r\n                              F32 min_pct__pre = drag_data->min_pct;\r\n                              F32 max_pct__pre = drag_data->max_pct;\r\n                              F32 min_px__pre = min_pct__pre*row_width_px;\r\n                              F32 max_px__pre = max_pct__pre*row_width_px;\r\n                              F32 min_px__post = min_px__pre + ui_drag_delta().x;\r\n                              F32 max_px__post = max_px__pre - ui_drag_delta().x;\r\n                              F32 min_pct__post = min_px__post/row_width_px;\r\n                              F32 max_pct__post = max_px__post/row_width_px;\r\n                              if(min_pct__post < 0.05f)\r\n                              {\r\n                                min_pct__post = 0.05f;\r\n                                max_pct__post = (min_pct__pre + max_pct__pre) - min_pct__post;\r\n                              }\r\n                              if(max_pct__post < 0.05f)\r\n                              {\r\n                                max_pct__post = 0.05f;\r\n                                min_pct__post = (min_pct__pre + max_pct__pre) - max_pct__post;\r\n                              }\r\n                              if(ui_double_clicked(sig))\r\n                              {\r\n                                F32 default_sum = cell->default_pct + cell->next->default_pct;\r\n                                F32 current_sum = min_pct__pre + max_pct__pre;;\r\n                                min_pct__post = current_sum * (cell->default_pct / default_sum);\r\n                                max_pct__post = current_sum * (cell->next->default_pct / default_sum);\r\n                                ui_kill_action();\r\n                              }\r\n                              CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n                              CFG_Node *style = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, row_info->cell_style_key);\r\n                              CFG_Node *min_cfg = &cfg_nil_node;\r\n                              CFG_Node *max_cfg = &cfg_nil_node;\r\n                              {\r\n                                CFG_Node *pct_child = style->first;\r\n                                U64 c_idx = 0;\r\n                                for(RD_WatchCell *c = row_info->cells.first; c != 0; c = c->next, c_idx += 1)\r\n                                {\r\n                                  if(pct_child == &cfg_nil_node)\r\n                                  {\r\n                                    pct_child = cfg_node_newf(rd_state->cfg, style, \"%f\", c->pct);\r\n                                  }\r\n                                  if(c_idx == cell_idx)\r\n                                  {\r\n                                    min_cfg = pct_child;\r\n                                  }\r\n                                  if(c_idx == cell_idx+1)\r\n                                  {\r\n                                    max_cfg = pct_child;\r\n                                  }\r\n                                  pct_child = pct_child->next;\r\n                                }\r\n                                cfg_node_equip_stringf(rd_state->cfg, min_cfg, \"%f\", min_pct__post);\r\n                                cfg_node_equip_stringf(rd_state->cfg, max_cfg, \"%f\", max_pct__post);\r\n                                cell_pcts_are_dirty = 1;\r\n                              }\r\n                            }\r\n                          }\r\n                        }\r\n                        cell_x_px = next_cell_x_px;\r\n                      }\r\n                    }\r\n                    boundary_start_idx = idx;\r\n                  }\r\n                  \r\n                  //- rjf: advance\r\n                  if(row_node == 0)\r\n                  {\r\n                    break;\r\n                  }\r\n                  else\r\n                  {\r\n                    last_row = &row_node->row;\r\n                    last_row_info = &row_infos[idx];\r\n                  }\r\n                }\r\n              }\r\n              \r\n              ////////////////////////\r\n              //- rjf: if cell widths are dirty -> recompute row infos\r\n              //\r\n              if(cell_pcts_are_dirty)\r\n              {\r\n                U64 idx = 0;\r\n                for(EV_WindowedRowNode *row_node = rows.first; row_node != 0; row_node = row_node->next, idx += 1)\r\n                {\r\n                  EV_Row *row = &row_node->row;\r\n                  row_infos[idx] = rd_watch_row_info_from_row(scratch.arena, row);\r\n                }\r\n              }\r\n              \r\n              ////////////////////////\r\n              //- rjf: do drag/drops\r\n              //\r\n              if(rd_drag_is_active())\r\n              {\r\n                Vec2F32 rect_dim = dim_2f32(rect);\r\n                ui_set_next_rect(r2f32p(0, 0, rect_dim.x, rect_dim.y));\r\n                UI_Box *drop_target = ui_build_box_from_stringf(UI_BoxFlag_DropSite|UI_BoxFlag_Floating, \"watch_%I64x_drop\", rd_regs()->view);\r\n                UI_Signal sig = ui_signal_from_box(drop_target);\r\n                if(ui_key_match(ui_drop_hot_key(), drop_target->key))\r\n                {\r\n                  Vec2F32 drag_pos = sub_2f32(ui_mouse(), rect.p0);\r\n                  RD_RegSlot drag_slot = rd_state->drag_drop_regs_slot;\r\n                  RD_Regs *drag_regs = rd_state->drag_drop_regs;\r\n                  \r\n                  //- rjf: obtain best fit for target block & prev-row for this drag\r\n                  EV_Block *drag_block = &ev_nil_block;\r\n                  U64 best_prev_row_block_num = 0;\r\n                  F32 best_prev_row_y = 0;\r\n                  {\r\n                    F32 best_prev_row_distance = inf32();\r\n                    U64 local_row_idx = 0;\r\n                    F32 row_y = 0;\r\n                    for(EV_WindowedRowNode *row_node = rows.first; row_node != 0; row_node = row_node->next, local_row_idx += 1)\r\n                    {\r\n                      // rjf: unpack row\r\n                      EV_Row *row = &row_node->row;\r\n                      F32 row_height = row_height_px*row->visual_size;\r\n                      RD_WatchRowInfo *row_info = &row_infos[local_row_idx];\r\n                      E_Type *block_type = e_type_from_key(row->block->eval.irtree.type_key);\r\n                      \r\n                      // rjf: determine if this row's block is good for the current drag/drop\r\n                      B32 block_is_good_for_drop = 0;\r\n                      if(drag_slot == RD_RegSlot_Expr && block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches))\r\n                      {\r\n                        block_is_good_for_drop = (drag_regs->cfg == 0 || (drag_regs->cfg != row_info->group_cfg_child->id));\r\n                      }\r\n                      \r\n                      // rjf: if this block is good, then test this row/block & grab if appropriate\r\n                      if(block_is_good_for_drop)\r\n                      {\r\n                        if(drag_block == &ev_nil_block && row_y <= drag_pos.y && drag_pos.y <= row_y + row_height)\r\n                        {\r\n                          drag_block = row->block;\r\n                        }\r\n                        F32 row_distance = abs_f32(drag_pos.y - row_y);\r\n                        if(row_distance <= best_prev_row_distance)\r\n                        {\r\n                          U64 row_num = ev_block_num_from_id(row->block, row->key.child_id);\r\n                          best_prev_row_block_num = row_num-1;\r\n                          best_prev_row_distance = row_distance;\r\n                          best_prev_row_y = row_y;\r\n                          drag_block = row->block;\r\n                        }\r\n                      }\r\n                      row_y += row_height;\r\n                    }\r\n                  }\r\n                  \r\n                  //- rjf: unpack block/previous row info\r\n                  B32 drag_target_is_good = 0;\r\n                  CFG_Node *drag_parent_cfg = &cfg_nil_node;\r\n                  CFG_Node *drag_prev_cfg = &cfg_nil_node;\r\n                  if(drag_block != &ev_nil_block)\r\n                  {\r\n                    EV_Key prev_row_key = ev_key_make(ev_hash_from_key(drag_block->key), ev_block_id_from_num(drag_block, best_prev_row_block_num));\r\n                    U64 prev_row_num = ev_num_from_key(&block_ranges, prev_row_key);\r\n                    EV_Row *prev_row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, prev_row_num);\r\n                    RD_WatchRowInfo prev_row_info = rd_watch_row_info_from_row(scratch.arena, prev_row);\r\n                    drag_parent_cfg = rd_cfg_from_eval_space(drag_block->eval.space);\r\n                    drag_prev_cfg = prev_row_info.group_cfg_child;\r\n                    if(drag_regs->cfg == 0 || drag_prev_cfg->id != drag_regs->cfg)\r\n                    {\r\n                      drag_target_is_good = 1;\r\n                    }\r\n                  }\r\n                  \r\n                  //- rjf: drop\r\n                  if(drag_target_is_good && rd_drag_drop() && drag_parent_cfg != &cfg_nil_node)\r\n                  {\r\n                    switch(drag_slot)\r\n                    {\r\n                      default:{}break;\r\n                      case RD_RegSlot_Expr:\r\n                      {\r\n                        CFG_Node *cfg = cfg_node_from_id(drag_regs->cfg);\r\n                        if(cfg != &cfg_nil_node)\r\n                        {\r\n                          cfg_node_unhook(rd_state->cfg, cfg->parent, cfg);\r\n                        }\r\n                        if(cfg == &cfg_nil_node)\r\n                        {\r\n                          cfg = cfg_node_alloc(rd_state->cfg);\r\n                          cfg_node_equip_stringf(rd_state->cfg, cfg, \"watch\");\r\n                          cfg_node_new(rd_state->cfg, cfg, drag_regs->expr);\r\n                        }\r\n                        cfg_node_insert_child(rd_state->cfg, drag_parent_cfg, drag_prev_cfg, cfg);\r\n                      }break;\r\n                    }\r\n                  }\r\n                  \r\n                  //- rjf: draw drop position\r\n                  if(drag_target_is_good)\r\n                  {\r\n                    DR_Bucket *bucket = dr_bucket_make();\r\n                    DR_BucketScope(bucket) UI_TagF(\"pop\")\r\n                    {\r\n                      Vec4F32 color = ui_color_from_name(str8_lit(\"background\"));\r\n                      Rng2F32 drop_line_rect = r2f32p(rect.x0,\r\n                                                      rect.y0 + best_prev_row_y - ui_top_font_size()*0.5f,\r\n                                                      rect.x1, \r\n                                                      rect.y0 + best_prev_row_y + ui_top_font_size()*0.5f);\r\n                      R_Rect2DInst *inst = dr_rect(drop_line_rect, color, 0, 0, 1.f);\r\n                      inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0);\r\n                    }\r\n                    ui_box_equip_draw_bucket(drop_target, bucket);\r\n                  }\r\n                }\r\n              }\r\n              \r\n              ////////////////////////\r\n              //- rjf: build table\r\n              //\r\n              ProfScope(\"build table\")\r\n              {\r\n                UI_Key watch_rich_hover_key = ui_key_from_string(ui_active_seed_key(), str8_lit(\"###rich_hover\"));\r\n                F32 row_y_px = rect.y0;\r\n                U64 local_row_idx = 0;\r\n                U64 global_row_idx = rows.count_before_semantic;\r\n                RD_WatchRowInfo last_row_info = {0};\r\n                for(EV_WindowedRowNode *row_node = rows.first;\r\n                    row_node != 0;\r\n                    (row_y_px += row_height_px * (row_node->row.visual_size),\r\n                     row_node = row_node->next,\r\n                     global_row_idx += 1,\r\n                     local_row_idx += 1))\r\n                {\r\n                  ////////////////////////\r\n                  //- rjf: unpack row info\r\n                  //\r\n                  ProfBegin(\"unpack row info\");\r\n                  EV_Row *row = &row_node->row;\r\n                  RD_WatchRowInfo *row_info = &row_infos[local_row_idx]; \r\n                  U64 row_hash = ev_hash_from_key(row->key);\r\n                  U64 row_depth = ev_depth_from_block(row->block);\r\n                  B32 row_selected = (selection_tbl.min.y <= global_row_idx+1 && global_row_idx+1 <= selection_tbl.max.y);\r\n                  B32 row_expanded = ev_expansion_from_key(eval_view, row->key);\r\n                  B32 next_row_expanded = row_expanded;\r\n                  B32 row_is_expandable = row_info->can_expand;\r\n                  if(implicit_root && row_depth > 0)\r\n                  {\r\n                    row_depth -= 1;\r\n                  }\r\n                  ProfEnd();\r\n                  \r\n                  ////////////////////////\r\n                  //- rjf: determine if this row fits the last row's topology\r\n                  //\r\n                  B32 row_matches_last_row_topology = 1;\r\n                  if(row_node != rows.first)\r\n                  {\r\n                    for(RD_WatchCell *last_cell = last_row_info.cells.first, *this_cell = row_info->cells.first;;\r\n                        last_cell = last_cell->next, this_cell = this_cell->next)\r\n                    {\r\n                      if(last_cell == 0 && this_cell == 0)\r\n                      {\r\n                        break;\r\n                      }\r\n                      if((last_cell == 0 && this_cell != 0) || (last_cell != 0 && this_cell == 0))\r\n                      {\r\n                        row_matches_last_row_topology = 0;\r\n                        break;\r\n                      }\r\n                      if(rd_id_from_watch_cell(last_cell) != rd_id_from_watch_cell(this_cell))\r\n                      {\r\n                        row_matches_last_row_topology = 0;\r\n                        break;\r\n                      }\r\n                    }\r\n                  }\r\n                  \r\n                  ////////////////////////\r\n                  //- rjf: store last row's info, for next iteration\r\n                  //\r\n                  last_row_info = *row_info;\r\n                  \r\n                  ////////////////////////\r\n                  //- rjf: determine row's flags & color palette\r\n                  //\r\n                  ProfBegin(\"determine row's flags & color palette\");\r\n                  UI_BoxFlags row_flags = UI_BoxFlag_DisableFocusOverlay;\r\n                  {\r\n                    if(global_row_idx & 1)\r\n                    {\r\n                      ui_set_next_tag(str8_lit(\"alt\"));\r\n                      row_flags |= UI_BoxFlag_DrawBackground;\r\n                    }\r\n                    if(!row_matches_last_row_topology)\r\n                    {\r\n                      row_flags |= UI_BoxFlag_DrawSideTop;\r\n                    }\r\n                  }\r\n                  ProfEnd();\r\n                  \r\n                  ////////////////////////\r\n                  //- rjf: build row box\r\n                  //\r\n                  ui_set_next_flags(disabled_flags);\r\n                  ui_set_next_pref_width(ui_px(contents_width_px, 1.f));\r\n                  ui_set_next_pref_height(ui_px(row_height_px*row->visual_size, 1.f));\r\n                  ui_set_next_focus_hot(row_selected ? UI_FocusKind_On : UI_FocusKind_Off);\r\n                  UI_Box *row_box = ui_build_box_from_stringf(row_flags|((!row_node->next)*UI_BoxFlag_DrawSideBottom)|UI_BoxFlag_Clickable, \"row_%I64x\", row_hash);\r\n                  RD_WatchRowExtrasDrawData *row_draw_data = push_array(ui_build_arena(), RD_WatchRowExtrasDrawData, 1);\r\n                  row_draw_data->breaks_from_prev = !row_matches_last_row_topology;\r\n                  ui_box_equip_custom_draw(row_box, rd_watch_row_extras_custom_draw, row_draw_data);\r\n                  \r\n                  //////////////////////\r\n                  //- rjf: build row contents\r\n                  //\r\n                  RD_RegsScope(.module = row_info->module->handle) UI_Parent(row_box)\r\n                  {\r\n                    ////////////////////\r\n                    //- rjf: draw start of cache lines in expansions\r\n                    //\r\n                    if(row->eval.space.kind == CTRL_EvalSpaceKind_Entity && row_info->view_ui_rule == &rd_nil_view_ui_rule)\r\n                    {\r\n                      CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row->eval.space);\r\n                      if(space_entity->kind == CTRL_EntityKind_Process)\r\n                      {\r\n                        U64 row_offset = row->eval.value.u64;\r\n                        if((row->eval.irtree.mode == E_Mode_Offset || row->eval.irtree.mode == E_Mode_Null) &&\r\n                           row_offset%64 == 0 && row_depth > 0)\r\n                        {\r\n                          ui_set_next_fixed_x(0);\r\n                          ui_set_next_fixed_y(0);\r\n                          ui_set_next_fixed_height(ui_top_font_size()*0.2f);\r\n                          ui_set_next_tag(str8_lit(\"pop\"));\r\n                          ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground, ui_key_zero());\r\n                        }\r\n                      }\r\n                    }\r\n                    \r\n                    //////////////\r\n                    //- rjf: draw mid-row cache line boundaries in expansions\r\n                    //\r\n                    if(row->eval.space.kind == CTRL_EvalSpaceKind_Entity && row_info->view_ui_rule == &rd_nil_view_ui_rule)\r\n                    {\r\n                      CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(row->eval.space);\r\n                      if(space_entity->kind == CTRL_EntityKind_Process &&\r\n                         (row->eval.irtree.mode == E_Mode_Offset || row->eval.irtree.mode == E_Mode_Null) &&\r\n                         row->eval.value.u64%64 != 0 &&\r\n                         row_depth > 0 &&\r\n                         !row_expanded)\r\n                      {\r\n                        U64 next_off = (row->eval.value.u64 + e_type_byte_size_from_key(row->eval.irtree.type_key));\r\n                        if(next_off%64 != 0 && row->eval.value.u64/64 < next_off/64)\r\n                        {\r\n                          ui_set_next_fixed_x(0);\r\n                          ui_set_next_fixed_y(row_height_px - ui_top_font_size()*0.5f);\r\n                          ui_set_next_fixed_height(ui_top_font_size()*1.f);\r\n                          ui_set_next_tag(str8_lit(\"pop\"));\r\n                          ui_set_next_transparency(0.5f);\r\n                          ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawBackground, ui_key_zero());\r\n                        }\r\n                      }\r\n                    }\r\n                    \r\n                    //////////////\r\n                    //- rjf: build all cells\r\n                    //\r\n                    S64 cell_x = 0;\r\n                    F32 cell_x_px = 0;\r\n                    for(RD_WatchCell *cell = row_info->cells.first; cell != 0; cell = cell->next, cell_x += 1)\r\n                    {\r\n                      if(row_depth > 0) { ui_push_tagf(\"weak\"); }\r\n                      \r\n                      ////////////\r\n                      //- rjf: unpack cell info\r\n                      //\r\n                      F32 cell_width_px = cell->px + cell->pct * (dim_2f32(rect).x - floor_f32(ui_top_font_size()*1.5f));\r\n                      F32 next_cell_x_px = cell_x_px + cell_width_px;\r\n                      F32 cell_width_strictness = 0.f;\r\n                      if(cell->px != 0)\r\n                      {\r\n                        cell_width_strictness = 1.f;\r\n                      }\r\n                      F32 visual_row_string_max_size_px = cell_width_px * 1.5f;\r\n                      if(cell->flags & RD_WatchCellFlag_Expr && !(cell->flags & RD_WatchCellFlag_NoEval))\r\n                      {\r\n                        visual_row_string_max_size_px /= 2.f;\r\n                      }\r\n                      U64 cell_id = rd_id_from_watch_cell(cell);\r\n                      RD_WatchPt cell_pt = {row->block->key, row->key, cell_id};\r\n                      RD_WatchViewTextEditState *cell_edit_state = rd_watch_view_text_edit_state_from_pt(ewv, cell_pt);\r\n                      B32 cell_selected = (row_selected && selection_tbl.min.x <= cell_x && cell_x <= selection_tbl.max.x);\r\n                      RD_WatchRowCellInfo cell_info = rd_info_from_watch_row_cell(scratch.arena, row, string_flags, row_info, cell, ui_top_font(), ui_top_font_size(), visual_row_string_max_size_px);\r\n                      E_TypeKey cell_type_key = cell->eval.irtree.type_key;\r\n                      E_Type *cell_type = e_type_from_key(cell_type_key);\r\n                      E_Eval cell_value_eval = e_value_eval_from_eval(cell->eval);\r\n                      B32 cell_toggled = (cell_value_eval.value.u64 != 0);\r\n                      B32 next_cell_toggled = cell_toggled;\r\n                      \r\n                      ////////////////////////\r\n                      //- rjf: determine if cell evaluation's data is fresh and/or bad\r\n                      //\r\n                      ProfBegin(\"determine if cell evaluation's data is fresh and/or bad\");\r\n                      B32 cell_is_rich_hovered = 0;\r\n                      B32 cell_is_fresh = 0;\r\n                      B32 cell_is_bad = 0;\r\n                      U64 cell_vaddr_rng_size = e_type_byte_size_from_key(cell->eval.irtree.type_key);\r\n                      cell_vaddr_rng_size = Min(cell_vaddr_rng_size, 64);\r\n                      Rng1U64 cell_vaddr_rng = r1u64(cell->eval.value.u64, cell->eval.value.u64+cell_vaddr_rng_size);\r\n                      if(!(cell_info.flags & RD_WatchCellFlag_NoEval))\r\n                      {\r\n                        switch(cell->eval.irtree.mode)\r\n                        {\r\n                          default:{}break;\r\n                          case E_Mode_Offset:\r\n                          {\r\n                            if(rd_state->hover_regs_slot == RD_RegSlot_VaddrRange &&\r\n                               e_space_match(cell->eval.space, rd_get_hover_regs()->eval_space) &&\r\n                               !ui_key_match(rd_get_hover_regs()->src_ui_key, watch_rich_hover_key))\r\n                            {\r\n                              Rng1U64 intersection = intersect_1u64(cell_vaddr_rng, rd_get_hover_regs()->vaddr_range);\r\n                              cell_is_rich_hovered = (intersection.max > intersection.min);\r\n                            }\r\n                            CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(cell->eval.space);\r\n                            if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity && space_entity->kind == CTRL_EntityKind_Process)\r\n                            {\r\n                              CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, space_entity->handle, cell_vaddr_rng, 0, rd_state->frame_eval_memread_endt_us);\r\n                              for(U64 idx = 0; idx < (slice.data.size+63)/64; idx += 1)\r\n                              {\r\n                                if(slice.byte_changed_flags[idx] != 0)\r\n                                {\r\n                                  cell_is_fresh = 1;\r\n                                }\r\n                                if(slice.byte_bad_flags[idx] != 0)\r\n                                {\r\n                                  cell_is_bad = 1;\r\n                                }\r\n                              }\r\n                            }\r\n                          }break;\r\n                        }\r\n                      }\r\n                      ProfEnd();\r\n                      \r\n                      ////////////\r\n                      //- rjf: compute slider parameters\r\n                      //\r\n                      E_Value cell_slider_min = zero_struct;\r\n                      E_Value cell_slider_max = zero_struct;\r\n                      E_TypeKind slider_value_type_kind = E_TypeKind_Null;\r\n                      F32 cell_slider_value = 0.f;\r\n                      if(str8_match(cell_type->name, str8_lit(\"range1\"), 0) && cell_type->args != 0 && cell_type->count >= 2)\r\n                      {\r\n                        E_Key min_key = e_key_from_expr(cell_type->args[0]);\r\n                        E_Key max_key = e_key_from_expr(cell_type->args[1]);\r\n                        E_ParentKey(cell->eval.key)\r\n                        {\r\n                          E_TypeKey slider_value_type = e_type_key_unwrap(cell_type->direct_type_key, E_TypeUnwrapFlag_AllDecorative);\r\n                          slider_value_type_kind = e_type_kind_from_key(slider_value_type);\r\n                          String8 slider_type_name = e_type_string_from_key(scratch.arena, slider_value_type);\r\n                          cell_slider_min = e_value_from_key(e_key_wrapf(min_key, \"(%S)$\", slider_type_name));\r\n                          cell_slider_max = e_value_from_key(e_key_wrapf(max_key, \"(%S)$\", slider_type_name));\r\n                        }\r\n                      }\r\n                      switch(slider_value_type_kind)\r\n                      {\r\n                        default:\r\n                        if(e_type_kind_is_integer(slider_value_type_kind))\r\n                        {\r\n                          cell_slider_value = ((F32)(cell_value_eval.value.s64 - cell_slider_min.s64)) / (cell_slider_max.s64 - cell_slider_min.s64);\r\n                        }break;\r\n                        case E_TypeKind_F32:\r\n                        {\r\n                          cell_slider_value = (cell_value_eval.value.f32 - cell_slider_min.f32) / (cell_slider_max.f32 - cell_slider_min.f32);\r\n                        }break;\r\n                        case E_TypeKind_F64:\r\n                        {\r\n                          cell_slider_value = (F32)((cell_value_eval.value.f64 - cell_slider_min.f64) / (cell_slider_max.f64 - cell_slider_min.f64));\r\n                        }break;\r\n                      }\r\n                      F32 next_cell_slider_value = cell_slider_value;\r\n                      \r\n                      ////////////\r\n                      //- rjf: determine cell's palette\r\n                      //\r\n                      Vec4F32 cell_background_color_override = {0};\r\n                      {\r\n                        if(cell_info.cfg->id == rd_get_hover_regs()->cfg &&\r\n                           rd_state->hover_regs_slot == RD_RegSlot_Cfg)\r\n                        {\r\n                          CFG_Node *cfg = cell_info.cfg;\r\n                          Vec4F32 rgba = rd_color_from_cfg(cfg);\r\n                          rgba.w *= 0.05f;\r\n                          if(rgba.w == 0)\r\n                          {\r\n                            rgba = pop_background_rgba;\r\n                            rgba.w *= 0.5f;\r\n                          }\r\n                          rgba.w *= ui_anim(ui_key_from_stringf(ui_key_zero(), \"###cfg_hover_t_%p\", cfg), 1.f, .rate = entity_hover_t_rate);\r\n                          cell_background_color_override = rgba;\r\n                        }\r\n                        else if(ctrl_handle_match(cell_info.entity->handle, rd_get_hover_regs()->ctrl_entity) &&\r\n                                rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity)\r\n                        {\r\n                          CTRL_Entity *entity = cell_info.entity;\r\n                          Vec4F32 rgba = rd_color_from_ctrl_entity(entity);\r\n                          rgba.w *= 0.05f;\r\n                          if(rgba.w == 0)\r\n                          {\r\n                            rgba = pop_background_rgba;\r\n                            rgba.w *= 0.5f;\r\n                          }\r\n                          rgba.w *= ui_anim(ui_key_from_stringf(ui_key_zero(), \"###entity_hover_t_%p\", entity), 1.f, .rate = entity_hover_t_rate);\r\n                          cell_background_color_override = rgba;\r\n                        }\r\n                        else if(cell_is_rich_hovered)\r\n                        {\r\n                          UI_TagF(\".\") UI_TagF(\"pop\")\r\n                          {\r\n                            cell_background_color_override = ui_color_from_name(str8_lit(\"background\"));\r\n                          }\r\n                        }\r\n                        else if(cell_is_fresh)\r\n                        {\r\n                          UI_TagF(\".\") UI_TagF(\"fresh\")\r\n                          {\r\n                            cell_background_color_override = ui_color_from_name(str8_lit(\"background\"));\r\n                          }\r\n                        }\r\n                        else if(cell_is_bad)\r\n                        {\r\n                          UI_TagF(\".\") UI_TagF(\"bad_pop\")\r\n                          {\r\n                            cell_background_color_override = ui_color_from_name(str8_lit(\"background\"));\r\n                            cell_background_color_override.w *= 0.2f;\r\n                          }\r\n                        }\r\n                      }\r\n                      \r\n                      ////////////\r\n                      //- rjf: build cell container\r\n                      //\r\n                      UI_Box *cell_box = &ui_nil_box;\r\n                      UI_PrefWidth(ui_px(cell_width_px, cell_width_strictness))\r\n                      {\r\n                        ui_set_next_fixed_height(floor_f32(row->visual_size * row_height_px));\r\n                        cell_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideLeft, \"cell_%I64x_%I64x\", row_hash, cell_id);\r\n                      }\r\n                      \r\n                      ////////////\r\n                      //- rjf: build cell contents\r\n                      //\r\n                      CFG_Node *cell_view = &cfg_nil_node;\r\n                      B32 revert_cell = 0;\r\n                      UI_Signal sig = {0};\r\n                      ProfScope(\"build cell contents\")\r\n                        UI_Parent(cell_box)\r\n                        UI_FocusHot(cell_selected ? UI_FocusKind_On : UI_FocusKind_Off)\r\n                        UI_FocusActive((cell_selected && ewv->text_editing) ? UI_FocusKind_On : UI_FocusKind_Off)\r\n                        RD_Font(RD_FontSlot_Code)\r\n                        UI_TagF(\"weak\")\r\n                      {\r\n                        //- rjf: cell has hook? -> build ui by calling hook\r\n                        if(cell->kind == RD_WatchCellKind_ViewUI && cell_info.view_ui_rule != &rd_nil_view_ui_rule)\r\n                        {\r\n                          CFG_Node *root = rd_immediate_cfg_from_keyf(\"view%I64x_%I64x\", rd_regs()->view, row_hash);\r\n                          cell_view = rd_view_from_eval(root, cell->eval);\r\n                          Rng2F32 cell_rect = r2f32p(cell_x_px, row_y_px, next_cell_x_px, row_y_px + row_height_px*(row_node->visual_size_skipped + row->visual_size + row_node->visual_size_chopped));\r\n                          ui_set_next_fixed_y(-1.f * (row_node->visual_size_skipped) * row_height_px);\r\n                          ui_set_next_fixed_height((row_node->visual_size_skipped + row->visual_size + row_node->visual_size_chopped) * row_height_px);\r\n                          UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable|UI_BoxFlag_FloatingY, \"###val_%I64x\", row_hash);\r\n                          UI_Parent(box)\r\n                            RD_RegsScope(.view = cell_view->id, .file_path = rd_file_path_from_eval(scratch.arena, cell->eval))\r\n                            UI_PermissionFlags(UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX)\r\n                            UI_Flags(0)\r\n                          {\r\n                            // rjf: 'pull out' button\r\n                            UI_Signal pull_out_sig = {0};\r\n                            UI_TagF(\".\") UI_TagF(\"tab\") UI_Rect(r2f32p(floor_f32(ui_top_font_size()*1.5f),\r\n                                                                       floor_f32(ui_top_font_size()*1.5f),\r\n                                                                       floor_f32(ui_top_font_size()*1.5f + ui_top_font_size()*3.f),\r\n                                                                       floor_f32(ui_top_font_size()*1.5f + ui_top_font_size()*3.f)))\r\n                              UI_CornerRadius(floor_f32(ui_top_font_size()*1.5f))\r\n                              UI_TextAlignment(UI_TextAlign_Center)\r\n                              RD_Font(RD_FontSlot_Icons)\r\n                              UI_FontSize(floor_f32(ui_top_font_size()*0.9f))\r\n                            {\r\n                              UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                                      UI_BoxFlag_Floating|\r\n                                                                      UI_BoxFlag_DrawText|\r\n                                                                      UI_BoxFlag_DrawBorder|\r\n                                                                      UI_BoxFlag_DrawBackground|\r\n                                                                      UI_BoxFlag_DrawActiveEffects|\r\n                                                                      UI_BoxFlag_DrawHotEffects,\r\n                                                                      \"%S###pull_out\",\r\n                                                                      rd_icon_kind_text_table[RD_IconKind_Window]);\r\n                              pull_out_sig = ui_signal_from_box(box);\r\n                            }\r\n                            if(ui_hovering(pull_out_sig)) UI_Tooltip RD_Font(RD_FontSlot_Main)\r\n                            {\r\n                              ui_state->tooltip_anchor_key = pull_out_sig.box->key;\r\n                              ui_labelf(\"Pull Out As New Tab\");\r\n                            }\r\n                            if(ui_dragging(pull_out_sig) && !contains_2f32(pull_out_sig.box->rect, ui_mouse()))\r\n                            {\r\n                              rd_drag_begin(RD_RegSlot_View);\r\n                            }\r\n                            \r\n                            // rjf: loading animation container\r\n                            UI_Box *loading_overlay_container = &ui_nil_box;\r\n                            UI_Parent(box) UI_WidthFill UI_HeightFill\r\n                            {\r\n                              loading_overlay_container = ui_build_box_from_key(UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY, ui_key_zero());\r\n                            }\r\n                            \r\n                            // rjf: view ui contents\r\n                            E_ParentKey(cell->eval.key)\r\n                            {\r\n                              cell_info.view_ui_rule->ui(cell->eval, cell_rect);\r\n                            }\r\n                            \r\n                            // rjf: loading fill\r\n                            UI_Parent(loading_overlay_container)\r\n                            {\r\n                              RD_ViewState *vs = rd_view_state_from_cfg(cell_view);\r\n                              rd_loading_overlay(cell_rect, vs->loading_t, vs->loading_progress_v, vs->loading_progress_v_target);\r\n                            }\r\n                          }\r\n                          sig = ui_signal_from_box(box);\r\n                        }\r\n                        \r\n                        //- rjf: cell is call stack frame? -> build arrow if this is the selected frame, otherwise leave empty\r\n                        else if(cell->kind == RD_WatchCellKind_CallStackFrame)\r\n                        {\r\n                          UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"###%I64x_%I64x\", cell_id, row_hash);\r\n                          sig = ui_signal_from_box(box);\r\n                          if(ctrl_handle_match(row_info->callstack_thread->handle, rd_base_regs()->thread) &&\r\n                             row_info->callstack_unwind_index == rd_base_regs()->unwind_count &&\r\n                             row_info->callstack_inline_depth == rd_base_regs()->inline_depth)\r\n                          {\r\n                            UI_Parent(box) UI_Flags(0) UI_TextAlignment(UI_TextAlign_Center)\r\n                            {\r\n                              Vec4F32 color = rd_color_from_ctrl_entity(row_info->callstack_thread);\r\n                              RD_Font(RD_FontSlot_Icons)\r\n                                UI_Flags(UI_BoxFlag_DisableTextTrunc)\r\n                                UI_TextColor(color)\r\n                                ui_label(rd_icon_kind_text_table[RD_IconKind_RightArrow]);\r\n                            }\r\n                          }\r\n                        }\r\n                        \r\n                        //- rjf: build general cell\r\n                        else\r\n                        {\r\n                          // rjf: compute visual params\r\n                          ProfBegin(\"compute visual params\");\r\n                          B32 cell_has_fancy_editors = (!(cell->flags & RD_WatchCellFlag_NoEval));\r\n                          B32 is_button = !!(cell_info.flags & RD_WatchCellFlag_Button);\r\n                          B32 has_background = !!(cell_info.flags & RD_WatchCellFlag_Background);\r\n                          B32 is_toggle_switch = (cell_has_fancy_editors && cell->eval.irtree.mode != E_Mode_Null && e_type_kind_from_key(e_type_key_unwrap(cell->eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)) == E_TypeKind_Bool);\r\n                          B32 is_slider = (cell_has_fancy_editors && cell->eval.irtree.mode != E_Mode_Null && cell_type->kind == E_TypeKind_Lens && str8_match(cell_type->name, str8_lit(\"range1\"), 0));\r\n                          B32 is_activated_on_single_click = !!(cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick);\r\n                          B32 is_non_code = !!(cell_info.flags & RD_WatchCellFlag_IsNonCode);\r\n                          String8 ghost_text = {0};\r\n                          if(cell_selected && ewv->text_editing && cell->flags & RD_WatchCellFlag_Expr && cell->flags & RD_WatchCellFlag_NoEval)\r\n                          {\r\n                            is_non_code = 0;\r\n                            is_button = 0;\r\n                            is_activated_on_single_click = 0;\r\n                          }\r\n                          ProfEnd();\r\n                          \r\n                          // rjf: determine query needle\r\n                          String8 needle = rd_view_query_input();\r\n                          if(cell->eval.space.kind == E_SpaceKind_FileSystem)\r\n                          {\r\n                            needle = str8_skip_last_slash(needle);\r\n                          }\r\n                          \r\n                          // rjf: form cell build parameters\r\n                          UI_Key line_edit_key = {0};\r\n                          RD_CellParams cell_params = {0};\r\n                          ProfScope(\"form cell build parameters\")\r\n                          {\r\n                            E_Type *block_type = e_type_from_key(row->block->eval.irtree.type_key);\r\n                            B32 cells_are_editable = !!(block_type->flags & E_TypeFlag_EditableChildren);\r\n                            \r\n                            // rjf: set up base parameters\r\n                            cell_params.flags                = (RD_CellFlag_KeyboardClickable|RD_CellFlag_NoBackground|RD_CellFlag_CodeContents);\r\n                            cell_params.depth                = (cell->flags & RD_WatchCellFlag_Indented ? row_depth : 0);\r\n                            cell_params.cursor               = &cell_edit_state->cursor;\r\n                            cell_params.mark                 = &cell_edit_state->mark;\r\n                            cell_params.edit_buffer          = cell_edit_state->input_buffer;\r\n                            cell_params.edit_buffer_size     = sizeof(cell_edit_state->input_buffer);\r\n                            cell_params.edit_string_size_out = &cell_edit_state->input_size;\r\n                            cell_params.line_edit_key_out    = &line_edit_key;\r\n                            cell_params.expanded_out         = &next_row_expanded;\r\n                            cell_params.search_needle        = needle;\r\n                            cell_params.meta_fstrs           = cell_info.expr_fstrs;\r\n                            cell_params.value_fstrs          = cell_info.eval_fstrs;\r\n                            if(row_height_px > ui_top_font_size()*3.5f)\r\n                            {\r\n                              cell_params.description = cell_info.description;\r\n                            }\r\n                            if(cell_selected && ewv->text_editing && cell->flags & RD_WatchCellFlag_NoEval)\r\n                            {\r\n                              MemoryZeroStruct(&cell_params.meta_fstrs);\r\n                              MemoryZeroStruct(&cell_params.description);\r\n                            }\r\n                            \r\n                            // rjf: extra edit button for meta-cfg strings\r\n                            if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg)\r\n                            {\r\n                              cell_params.flags |= RD_CellFlag_EmptyEditButton;\r\n                            }\r\n                            \r\n                            // rjf: extra revert button for non-default meta-cfgs\r\n                            if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg &&\r\n                               !(cell->flags & RD_WatchCellFlag_NoEval))\r\n                            {\r\n                              CFG_Node *cfg = rd_cfg_from_eval_space(cell->eval.space);\r\n                              String8 child_key = e_string_from_id(cell->eval.space.u64s[1]);\r\n                              CFG_Node *child_cfg = cfg_node_child_from_string(cfg, child_key);\r\n                              if(child_cfg != &cfg_nil_node)\r\n                              {\r\n                                MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, cfg->string);\r\n                                if(schemas.count != 0)\r\n                                {\r\n                                  MD_Node *child_schema = &md_nil_node;\r\n                                  for(MD_NodePtrNode *n = schemas.first; md_node_is_nil(child_schema) && n != 0; n = n->next)\r\n                                  {\r\n                                    child_schema = md_child_from_string(n->v, child_key, 0);\r\n                                  }\r\n                                  if((md_node_has_tag(child_schema, str8_lit(\"override\"), 0) ||\r\n                                      md_node_has_tag(child_schema, str8_lit(\"default\"), 0)) &&\r\n                                     !md_node_has_tag(child_schema, str8_lit(\"no_revert\"), 0))\r\n                                  {\r\n                                    cell_params.flags |= RD_CellFlag_RevertButton;\r\n                                    cell_params.revert_out = &revert_cell;\r\n                                  }\r\n                                }\r\n                              }\r\n                            }\r\n                            \r\n                            // rjf: apply expander (or substitute space)\r\n                            if(!ewv->text_editing || !cell_selected || row_depth > 0)\r\n                            {\r\n                              if(row_is_expandable && cell == row_info->cells.first)\r\n                              {\r\n                                cell_params.flags |= RD_CellFlag_Expander;\r\n                              }\r\n                              else if(cells_are_editable && row_depth == !implicit_root && cell == row_info->cells.first)\r\n                              {\r\n                                cell_params.flags |= RD_CellFlag_ExpanderPlaceholder;\r\n                              }\r\n                              else if(row_depth != 0 && cell == row_info->cells.first)\r\n                              {\r\n                                cell_params.flags |= RD_CellFlag_ExpanderSpace;\r\n                              }\r\n                            }\r\n                            \r\n                            // rjf: apply blank cell ghost text\r\n                            if(row_info->cells.first == row_info->cells.last &&\r\n                               cells_are_editable &&\r\n                               row->eval.expr == &e_expr_nil)\r\n                            {\r\n                              ghost_text = str8_lit(\"Expression\");\r\n                              is_non_code = (!cell_selected || !ewv->text_editing);\r\n                              cell_params.flags &= ~(RD_CellFlag_Expander|RD_CellFlag_ExpanderSpace|RD_CellFlag_ExpanderPlaceholder);\r\n                            }\r\n                            \r\n                            // rjf: apply single-click-activation\r\n                            if(is_activated_on_single_click)\r\n                            {\r\n                              cell_params.flags |= RD_CellFlag_SingleClickActivate;\r\n                            }\r\n                            \r\n                            // rjf: apply code styles\r\n                            if(is_non_code)\r\n                            {\r\n                              cell_params.flags &= ~RD_CellFlag_CodeContents;\r\n                            }\r\n                            \r\n                            // rjf: apply button styles\r\n                            if(is_button)\r\n                            {\r\n                              cell_params.flags |= RD_CellFlag_Button;\r\n                              cell_params.flags &= ~RD_CellFlag_NoBackground;\r\n                              if(row_depth == 0)\r\n                              {\r\n                                cell_params.flags &= ~RD_CellFlag_ExpanderSpace;\r\n                              }\r\n                            }\r\n                            \r\n                            // rjf: apply background\r\n                            if(has_background)\r\n                            {\r\n                              cell_params.flags &= ~RD_CellFlag_NoBackground;\r\n                            }\r\n                            \r\n                            // rjf: apply toggle-switch\r\n                            if(is_toggle_switch)\r\n                            {\r\n                              cell_params.flags |= RD_CellFlag_ToggleSwitch;\r\n                              cell_params.toggled_out = &next_cell_toggled;\r\n                            }\r\n                            \r\n                            // rjf: apply slider\r\n                            if(is_slider)\r\n                            {\r\n                              cell_params.flags |= RD_CellFlag_Slider;\r\n                              cell_params.slider_value_out = &next_cell_slider_value;\r\n                            }\r\n                            \r\n                            // rjf: apply bindings\r\n                            if(cell->px == 0 && cell->eval.space.kind == RD_EvalSpaceKind_MetaCmd)\r\n                            {\r\n                              cell_params.flags |= RD_CellFlag_Bindings;\r\n                              cell_params.bindings_name = rd_cmd_name_from_eval(cell->eval);\r\n                            }\r\n                            \r\n                            // rjf: apply background override\r\n                            if(cell_background_color_override.w != 0)\r\n                            {\r\n                              cell_params.flags &= ~RD_CellFlag_NoBackground;\r\n                            }\r\n                            \r\n                            // rjf: apply type note\r\n                            if(!(cell_info.flags & RD_WatchCellFlag_NoEval) &&\r\n                               e_type_kind_from_key(cell->eval.irtree.type_key) != E_TypeKind_Null &&\r\n                               (cell->eval.space.kind == E_SpaceKind_Null ||\r\n                                cell->eval.space.kind == CTRL_EvalSpaceKind_Entity) &&\r\n                               row_info->callstack_thread == &ctrl_entity_nil &&\r\n                               e_type_kind_from_key(cell->eval.irtree.type_key) != E_TypeKind_Function)\r\n                              UI_FontSize(ui_top_font_size()*0.9f)\r\n                            {\r\n                              if(cell_width_px >= ui_top_font_size()*8.f)\r\n                              {\r\n                                E_TypeKey type_key = cell->eval.irtree.type_key;\r\n                                String8 note_string = {0};\r\n                                if(cell->eval.irtree.mode == E_Mode_Null && (row->block->eval.irtree.mode != E_Mode_Null || row->block->parent == &ev_nil_block))\r\n                                {\r\n                                  note_string = str8f(scratch.arena, \"type (size: %I64u)\", e_type_byte_size_from_key(type_key));\r\n                                }\r\n                                else if(cell->eval.irtree.mode == E_Mode_Null)\r\n                                {\r\n                                  note_string = str8f(scratch.arena, \"type (size: %I64u, offset: %I64u)\",\r\n                                                      e_type_byte_size_from_key(type_key),\r\n                                                      cell->eval.value.u64);\r\n                                }\r\n                                else\r\n                                {\r\n                                  note_string = e_type_string_from_key(scratch.arena, type_key);\r\n                                }\r\n                                DR_FStrList note_fstrs = rd_fstrs_from_code_string(scratch.arena, 1, 0, ui_color_from_name(str8_lit(\"text\")), note_string);\r\n                                F32 note_fstrs_width_px = dr_dim_from_fstrs(0, &note_fstrs).x + 10;\r\n                                note_fstrs_width_px = Min(note_fstrs_width_px, cell_width_px*0.5f);\r\n                                cell_params.note_fstrs = note_fstrs;\r\n                                cell_params.note_width = ui_px(note_fstrs_width_px, 1);\r\n                              }\r\n                            }\r\n                          }\r\n                          \r\n                          // rjf: build\r\n                          if(cell_background_color_override.w != 0)\r\n                          {\r\n                            ui_push_background_color(cell_background_color_override);\r\n                          }\r\n                          UI_TextAlignment(cell->px != 0 ? UI_TextAlign_Center : UI_TextAlign_Left)\r\n                            RD_Font(is_non_code ? RD_FontSlot_Main : RD_FontSlot_Code)\r\n                          {\r\n                            sig = rd_cellf(&cell_params, \"%S###%I64x_row_%I64x\", ghost_text, cell_x, row_hash);\r\n                          }\r\n                          if(cell_background_color_override.w != 0)\r\n                          {\r\n                            ui_pop_background_color();\r\n                          }\r\n                          if(ui_is_focus_active() &&\r\n                             selection_tbl.min.x == selection_tbl.max.x && selection_tbl.min.y == selection_tbl.max.y &&\r\n                             txt_pt_match(cell_edit_state->cursor, cell_edit_state->mark))\r\n                          {\r\n                            String8 input = str8(cell_edit_state->input_buffer, cell_edit_state->input_size);\r\n                            rd_set_autocomp_regs(cell->eval, .ui_key = line_edit_key, .string = input, .cursor = cell_edit_state->cursor);\r\n                          }\r\n                        }\r\n                      }\r\n                      \r\n                      ////////////\r\n                      //- rjf: handle interactions\r\n                      //\r\n                      {\r\n                        // rjf: hover -> debug log\r\n                        if(DEV_eval_compiler_tooltips)\r\n                        {\r\n                          if(ui_hovering(sig)) UI_Tooltip\r\n                          {\r\n                            String8 text = e_debug_log_from_expr_string(scratch.arena, cell->eval.string);\r\n                            String8List lines = str8_split(scratch.arena, text, (U8 *)\"\\n\", 1, StringSplitFlag_KeepEmpties);\r\n                            for(String8Node *n = lines.first; n != 0; n = n->next)\r\n                            {\r\n                              if(n->string.size != 0)\r\n                              {\r\n                                ui_label(n->string);\r\n                              }\r\n                            }\r\n                          }\r\n                        }\r\n                        \r\n                        // rjf: hover -> rich hover cfgs\r\n                        if(ui_hovering(sig) && cell_info.cfg != &cfg_nil_node)\r\n                        {\r\n                          RD_RegsScope(.cfg = cell_info.cfg->id, .no_rich_tooltip = 1) rd_set_hover_regs(RD_RegSlot_Cfg);\r\n                        }\r\n                        \r\n                        // rjf: hover -> rich hover entities\r\n                        else if(ui_hovering(sig) && cell_info.entity != &ctrl_entity_nil)\r\n                        {\r\n                          RD_RegsScope(.ctrl_entity = cell_info.entity->handle, .no_rich_tooltip = 1) rd_set_hover_regs(RD_RegSlot_CtrlEntity);\r\n                        }\r\n                        \r\n                        // rjf: hover -> rich hover commands (mini only)\r\n                        else if(ui_hovering(sig) && cell_info.cmd_name.size != 0 && cell->px != 0)\r\n                        {\r\n                          RD_RegsScope(.cmd_name = cell_info.cmd_name, .ui_key = sig.box->key) rd_set_hover_regs(RD_RegSlot_CmdName);\r\n                        }\r\n                        \r\n                        // rjf: hover -> rich hover address ranges\r\n                        else if(ui_hovering(sig) && !(cell_info.flags & RD_WatchCellFlag_Expr))\r\n                        {\r\n                          RD_RegsScope(.eval_space = cell->eval.space, .vaddr_range = cell_vaddr_rng, .src_ui_key = watch_rich_hover_key) rd_set_hover_regs(RD_RegSlot_VaddrRange);\r\n                        }\r\n                        \r\n                        // rjf: dragging -> drag/drop\r\n                        if(ui_dragging(sig) && !contains_2f32(sig.box->rect, ui_mouse()) &&\r\n                           (!cell_selected || !ewv->text_editing))\r\n                        {\r\n                          if(cell->eval.space.kind == E_SpaceKind_FileSystem)\r\n                          {\r\n                            String8 file_path = rd_file_path_from_eval(scratch.arena, cell->eval);\r\n                            RD_RegsScope(.file_path = file_path) rd_drag_begin(RD_RegSlot_FilePath);\r\n                          }\r\n                          else if(cell_info.cfg != &cfg_nil_node)\r\n                          {\r\n                            RD_RegsScope(.cfg = cell_info.cfg->id) rd_drag_begin(RD_RegSlot_Cfg);\r\n                          }\r\n                          else if(cell_info.entity != &ctrl_entity_nil)\r\n                          {\r\n                            RD_RegsScope(.ctrl_entity = cell_info.entity->handle) switch(cell_info.entity->kind)\r\n                            {\r\n                              default:{rd_drag_begin(RD_RegSlot_CtrlEntity);}break;\r\n                              case CTRL_EntityKind_Machine:{RD_RegsScope(.machine = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Machine);}break;\r\n                              case CTRL_EntityKind_Process:{RD_RegsScope(.process = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Process);}break;\r\n                              case CTRL_EntityKind_Module:{RD_RegsScope(.module = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Module);}break;\r\n                              case CTRL_EntityKind_Thread:{RD_RegsScope(.thread = cell_info.entity->handle) rd_drag_begin(RD_RegSlot_Thread);}break;\r\n                            }\r\n                          }\r\n                          else if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity ||\r\n                                  cell->eval.space.kind == E_SpaceKind_FileSystem ||\r\n                                  cell->eval.space.kind == E_SpaceKind_File ||\r\n                                  cell->eval.space.kind == E_SpaceKind_Null)\r\n                          {\r\n                            RD_RegsScope(.expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key))\r\n                            {\r\n                              if(cell->flags & RD_WatchCellFlag_Expr)\r\n                              {\r\n                                rd_regs()->cfg = row_info->group_cfg_child->id;\r\n                              }\r\n                              rd_drag_begin(RD_RegSlot_Expr);\r\n                            }\r\n                          }\r\n                        }\r\n                        \r\n                        // rjf: (normally) single-click -> move selection here\r\n                        if(!(cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick) && ui_pressed(sig))\r\n                        {\r\n                          ewv->next_cursor = ewv->next_mark = cell_pt;\r\n                          pressed = 1;\r\n                        }\r\n                        \r\n                        // rjf: reversion\r\n                        if(revert_cell && cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg)\r\n                        {\r\n                          CFG_Node *cfg = rd_cfg_from_eval_space(cell->eval.space);\r\n                          String8 child_key = e_string_from_id(cell->eval.space.u64s[1]);\r\n                          cfg_node_release(rd_state->cfg, cfg_node_child_from_string(cfg, child_key));\r\n                        }\r\n                        \r\n                        // rjf: activation (double-click normally, or single-clicks with special buttons)\r\n                        if((!(cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick) && ui_double_clicked(sig)) ||\r\n                           ((cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick) && ui_clicked(sig)) ||\r\n                           sig.f & UI_SignalFlag_KeyboardPressed)\r\n                        {\r\n                          // rjf: kill if a double-clickable cell\r\n                          if(!(cell_info.flags & RD_WatchCellFlag_ActivateWithSingleClick))\r\n                          {\r\n                            ui_kill_action();\r\n                          }\r\n                          \r\n                          // rjf: cell w/ a visualizer hook? ->\r\n                          // if keyboard: open in tab, if within tab\r\n                          // if double-click: focus this visualizer (via edit)\r\n                          if(cell->kind == RD_WatchCellKind_ViewUI &&\r\n                             cell_info.view_ui_rule != &rd_nil_view_ui_rule &&\r\n                             cell_view != &cfg_nil_node)\r\n                          {\r\n                            if(!view_is_floating && sig.f & UI_SignalFlag_KeyboardPressed)\r\n                            {\r\n                              cfg_node_unhook(rd_state->cfg, cell_view->parent, cell_view);\r\n                              cfg_node_insert_child(rd_state->cfg, view->parent, view, cell_view);\r\n                              rd_cmd(RD_CmdKind_FocusTab, .tab = cell_view->id);\r\n                            }\r\n                            else if(sig.f & UI_SignalFlag_DoubleClicked)\r\n                            {\r\n                              ewv->next_cursor = ewv->next_mark = cell_pt;\r\n                              if(!rd_watch_pt_match(ewv->cursor, cell_pt) && ewv->text_editing)\r\n                              {\r\n                                rd_cmd(RD_CmdKind_Accept);\r\n                              }\r\n                              rd_cmd(RD_CmdKind_Edit);\r\n                            }\r\n                          }\r\n                          \r\n                          // rjf: this watch window is a lister? -> move cursor & edit or accept\r\n                          else if(cfg_node_child_from_string(view, str8_lit(\"lister\")) != &cfg_nil_node ||\r\n                                  cfg_node_child_from_string(view, str8_lit(\"autocomplete\")) != &cfg_nil_node)\r\n                          {\r\n                            ewv->next_cursor = ewv->next_mark = cell_pt;\r\n                            if(cell_info.flags & RD_WatchCellFlag_CanEdit)\r\n                            {\r\n                              // TODO(rjf): @hack - we really want navigations to be event-like, but we need\r\n                              // to insert a dumb no-op here so that the \"rugpull\" cursor move can take effect\r\n                              // before the edit command we are queueing up...\r\n                              rd_cmd(RD_CmdKind_Edit);\r\n                              rd_cmd(RD_CmdKind_Edit);\r\n                            }\r\n                            else\r\n                            {\r\n                              rd_cmd(RD_CmdKind_Edit);\r\n                              ewv->next_cursor = ewv->next_mark = cell_pt;\r\n                              rd_cmd(RD_CmdKind_Accept);\r\n                            }\r\n                          }\r\n                          \r\n                          // rjf: has a command name? -> push command\r\n                          else if(cell_info.cmd_name.size != 0)\r\n                          {\r\n                            String8 cmd_name = cell_info.cmd_name;\r\n                            RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n                            CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(row->eval.space);\r\n                            CFG_Node *cfg = rd_cfg_from_eval_space(row->eval.space);\r\n                            if(cfg == &cfg_nil_node)\r\n                            {\r\n                              cfg = rd_cfg_from_eval_space(row->block->eval.space);\r\n                            }\r\n                            if(entity == &ctrl_entity_nil)\r\n                            {\r\n                              entity = rd_ctrl_entity_from_eval_space(row->eval.space);\r\n                            }\r\n                            RD_RegsScope(.cfg = cfg->id, .ctrl_entity = entity->handle)\r\n                            {\r\n                              if(cfg != &cfg_nil_node)\r\n                              {\r\n                                CFG_PanelTree panels = cfg_panel_tree_from_cfg(scratch.arena, cfg);\r\n                                CFG_PanelNode *parent_panel_node = cfg_panel_node_from_tree_cfg(panels.root, cfg->parent);\r\n                                if(parent_panel_node != &cfg_nil_panel_node)\r\n                                {\r\n                                  rd_regs()->tab = rd_regs()->view = cfg->id;\r\n                                }\r\n                              }\r\n                              if(!(cmd_kind_info->query.flags & RD_QueryFlag_Required) ||\r\n                                 (cmd_kind_info->query.slot == RD_RegSlot_Cfg && cfg != &cfg_nil_node) ||\r\n                                 (cmd_kind_info->query.slot == RD_RegSlot_CtrlEntity && entity != &ctrl_entity_nil))\r\n                              {\r\n                                rd_push_cmd(cell_info.cmd_name, rd_regs());\r\n                              }\r\n                              else\r\n                              {\r\n                                rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name);\r\n                              }\r\n                            }\r\n                          }\r\n                          \r\n                          // rjf: row has callstack info? -> select unwind\r\n                          else if(row_info->callstack_thread != &ctrl_entity_nil)\r\n                          {\r\n                            rd_cmd(RD_CmdKind_SelectThread, .thread = row_info->callstack_thread->handle);\r\n                            rd_cmd(RD_CmdKind_SelectUnwind,\r\n                                   .unwind_count = row_info->callstack_unwind_index,\r\n                                   .inline_depth = row_info->callstack_inline_depth);\r\n                          }\r\n                          \r\n                          // rjf: can edit? -> begin editing\r\n                          else if(!(sig.f & UI_SignalFlag_KeyboardPressed) && cell_info.flags & RD_WatchCellFlag_CanEdit)\r\n                          {\r\n                            ewv->next_cursor = ewv->next_mark = cell_pt;\r\n                            if(!rd_watch_pt_match(ewv->cursor, cell_pt))\r\n                            {\r\n                              // TODO(rjf): see above @hack\r\n                              rd_cmd(RD_CmdKind_Edit);\r\n                            }\r\n                            rd_cmd(RD_CmdKind_Edit);\r\n                          }\r\n                          \r\n                          // rjf: can expand? -> expand\r\n                          else if(sig.f & UI_SignalFlag_KeyboardPressed && row_is_expandable)\r\n                          {\r\n                            next_row_expanded = !row_expanded;\r\n                          }\r\n                          \r\n                          // rjf: can't edit, but has address info? -> go to address\r\n                          else if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity)\r\n                          {\r\n                            CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(cell->eval.space);\r\n                            CTRL_Entity *process = ctrl_process_from_entity(entity);\r\n                            if(process != &ctrl_entity_nil)\r\n                            {\r\n                              U64 vaddr = cell->eval.value.u64;\r\n                              CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);\r\n                              DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n                              U64 voff = ctrl_voff_from_vaddr(module, vaddr);\r\n                              D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff);\r\n                              String8 file_path = {0};\r\n                              TxtPt pt = {0};\r\n                              if(lines.first != 0)\r\n                              {\r\n                                file_path = lines.first->v.file_path;\r\n                                pt        = lines.first->v.pt;\r\n                                rd_cmd(RD_CmdKind_FindCodeLocation,\r\n                                       .process    = process->handle,\r\n                                       .vaddr      = vaddr,\r\n                                       .file_path  = file_path,\r\n                                       .cursor     = pt);\r\n                              }\r\n                            }\r\n                          }\r\n                          \r\n                          // rjf: can't edit, but has cfg? -> find or select\r\n                          else if(cell_info.cfg != &cfg_nil_node)\r\n                          {\r\n                            CFG_Node *cfg = cell_info.cfg;\r\n                            RD_Location loc = rd_location_from_cfg(cfg);\r\n                            if(loc.file_path.size != 0)\r\n                            {\r\n                              rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = 0, .file_path = loc.file_path, .cursor = loc.pt);\r\n                            }\r\n                            else if(loc.expr.size != 0)\r\n                            {\r\n                              U64 value = e_value_from_string(loc.expr).u64;\r\n                              rd_cmd(RD_CmdKind_FindCodeLocation, .vaddr = value);\r\n                            }\r\n                            else if(str8_match(cfg->string, str8_lit(\"target\"), 0) && sig.event_flags & OS_Modifier_Ctrl)\r\n                            {\r\n                              rd_cmd(RD_CmdKind_EnableCfg, .cfg = cfg->id);\r\n                            }\r\n                            else if(str8_match(cfg->string, str8_lit(\"target\"), 0))\r\n                            {\r\n                              rd_cmd(RD_CmdKind_SelectCfg, .cfg = cfg->id);\r\n                            }\r\n                          }\r\n                          \r\n                          // rjf: can't edit, but has thread? -> select\r\n                          else if(cell_info.entity->kind == CTRL_EntityKind_Thread)\r\n                          {\r\n                            rd_cmd(RD_CmdKind_SelectThread, .thread = cell_info.entity->handle);\r\n                          }\r\n                          \r\n                          // rjf: other cases, but this watch window is floating, and this has a cfg/entity? -> push query\r\n                          else if(view_is_floating && (cell_info.entity != &ctrl_entity_nil || cell_info.cfg != &cfg_nil_node))\r\n                          {\r\n                            rd_cmd(RD_CmdKind_PushQuery, .expr = e_full_expr_string_from_key(scratch.arena, cell->eval.key));\r\n                          }\r\n                        }\r\n                        \r\n                        // rjf: hovering with inheritance string -> show tooltip\r\n                        if(ui_hovering(sig) && cell_info.inheritance_tooltip.size != 0) UI_Tooltip\r\n                        {\r\n                          UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1)) UI_TextPadding(0)\r\n                          {\r\n                            ui_labelf(\"Inherited from \");\r\n                            RD_Font(RD_FontSlot_Code) rd_code_label(1.f, 0, ui_color_from_name(str8_lit(\"code_default\")), cell_info.inheritance_tooltip);\r\n                          }\r\n                        }\r\n                        \r\n                        // rjf: hovering with error tooltip -> show tooltip\r\n                        if(ui_hovering(sig) && cell_info.error_tooltip.size != 0) UI_Tooltip\r\n                        {\r\n                          UI_PrefWidth(ui_children_sum(1)) rd_error_label(cell_info.error_tooltip);\r\n                        }\r\n                      }\r\n                      \r\n                      ////////////\r\n                      //- rjf: commit toggle changes\r\n                      //\r\n                      if(next_cell_toggled != cell_toggled)\r\n                      {\r\n                        rd_commit_eval_value_string(cell->eval, next_cell_toggled ? str8_lit(\"1\") : str8_lit(\"0\"));\r\n                      }\r\n                      \r\n                      ////////////\r\n                      //- rjf: commit slider changes\r\n                      //\r\n                      if(next_cell_slider_value != cell_slider_value)\r\n                      {\r\n                        String8 new_value_string = {0};\r\n                        switch(slider_value_type_kind)\r\n                        {\r\n                          default:\r\n                          if(e_type_kind_is_integer(slider_value_type_kind))\r\n                          {\r\n                            S64 new_value = (S64)((next_cell_slider_value * (cell_slider_max.s64 - cell_slider_min.s64)) + cell_slider_min.s64);\r\n                            new_value = Clamp(cell_slider_min.s64, new_value, cell_slider_max.s64);\r\n                            new_value_string = push_str8f(scratch.arena, \"%I64d\", new_value);\r\n                          }break;\r\n                          case E_TypeKind_F32:\r\n                          {\r\n                            F32 new_value = (next_cell_slider_value * (cell_slider_max.f32 - cell_slider_min.f32)) + cell_slider_min.f32;\r\n                            new_value = Clamp(cell_slider_min.f32, new_value, cell_slider_max.f32);\r\n                            new_value_string = push_str8f(scratch.arena, \"%f\", new_value);\r\n                          }break;\r\n                          case E_TypeKind_F64:\r\n                          {\r\n                            F64 new_value = (F64)((next_cell_slider_value * (cell_slider_max.f64 - cell_slider_min.f64)) + cell_slider_min.f64);\r\n                            new_value = Clamp(cell_slider_min.f64, new_value, cell_slider_max.f64);\r\n                            new_value_string = push_str8f(scratch.arena, \"%f\", new_value);\r\n                          }break;\r\n                        }\r\n                        rd_commit_eval_value_string(cell->eval, new_value_string);\r\n                      }\r\n                      \r\n                      ////////////\r\n                      //- rjf: bump x pixel coordinate\r\n                      //\r\n                      cell_x_px = next_cell_x_px;\r\n                      \r\n                      if(row_depth > 0) { ui_pop_tag(); }\r\n                    }\r\n                  }\r\n                  \r\n                  //////////////////////\r\n                  //- rjf: commit expansion state changes\r\n                  //\r\n                  if(next_row_expanded != row_expanded)\r\n                  {\r\n                    if(!ev_key_match(ev_key_root(), row->key))\r\n                    {\r\n                      ev_key_set_expansion(eval_view, row->block->key, row->key, next_row_expanded);\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: general table-wide press logic\r\n        //\r\n        if(pressed)\r\n        {\r\n          rd_cmd(RD_CmdKind_FocusPanel);\r\n        }\r\n        \r\n        //////////////////////////////\r\n        //- rjf: disable query if text editing is occurring\r\n        //\r\n        vs->contents_are_focused = ewv->text_editing;\r\n        \r\n        rd_store_view_scroll_pos(scroll_pos);\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: visualizer hook\r\n    //\r\n    else\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(view_name);\r\n      E_Eval expr_eval = e_eval_from_string(expr_string);\r\n      \r\n      // rjf: peek presses, steal focus from query bar\r\n      for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n      {\r\n        if(evt->kind == UI_EventKind_Press && contains_2f32(rect, evt->pos))\r\n        {\r\n          vs->contents_are_focused = 1;\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: 'pull out' button, if floating\r\n      if(view_is_floating)\r\n      {\r\n        UI_Signal pull_out_sig = {0};\r\n        UI_TagF(\".\") UI_TagF(\"tab\") UI_Rect(r2f32p(floor_f32(ui_top_font_size()*1.5f),\r\n                                                   floor_f32(ui_top_font_size()*1.5f),\r\n                                                   floor_f32(ui_top_font_size()*1.5f + ui_top_font_size()*3.f),\r\n                                                   floor_f32(ui_top_font_size()*1.5f + ui_top_font_size()*3.f)))\r\n          UI_CornerRadius(floor_f32(ui_top_font_size()*1.5f))\r\n          UI_TextAlignment(UI_TextAlign_Center)\r\n          RD_Font(RD_FontSlot_Icons)\r\n          UI_FontSize(floor_f32(ui_top_font_size()*0.9f))\r\n        {\r\n          UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                  UI_BoxFlag_Floating|\r\n                                                  UI_BoxFlag_DrawText|\r\n                                                  UI_BoxFlag_DrawBorder|\r\n                                                  UI_BoxFlag_DrawBackground|\r\n                                                  UI_BoxFlag_DrawActiveEffects|\r\n                                                  UI_BoxFlag_DrawHotEffects,\r\n                                                  \"%S###pull_out\",\r\n                                                  rd_icon_kind_text_table[RD_IconKind_Window]);\r\n          pull_out_sig = ui_signal_from_box(box);\r\n        }\r\n        if(ui_dragging(pull_out_sig) && !contains_2f32(pull_out_sig.box->rect, ui_mouse()))\r\n        {\r\n          rd_drag_begin(RD_RegSlot_View);\r\n        }\r\n        if(ui_hovering(pull_out_sig)) UI_Tooltip RD_Font(RD_FontSlot_Main)\r\n        {\r\n          ui_state->tooltip_anchor_key = pull_out_sig.box->key;\r\n          ui_labelf(\"Pull Out As New Tab\");\r\n        }\r\n      }\r\n      \r\n      // rjf: build ui via hook\r\n      E_ParentKey(expr_eval.key)\r\n      {\r\n        view_ui_rule->ui(expr_eval, rect);\r\n      }\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: catchall completion controls\r\n  //\r\n  if(vs->query_is_open) UI_Focus(UI_FocusKind_On)\r\n  {\r\n    if(ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Cancel))\r\n    {\r\n      vs->query_is_open = 0;\r\n      vs->query_string_size = 0;\r\n    }\r\n    if(ui_is_focus_active() && ui_slot_press(UI_EventActionSlot_Accept))\r\n    {\r\n      String8 cmd_name = rd_view_query_cmd();\r\n      String8 input = rd_view_query_input();\r\n      RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n      RD_RegsScope()\r\n      {\r\n        rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, str8_zero(), input);\r\n        rd_cmd(RD_CmdKind_CompleteQuery);\r\n      }\r\n    }\r\n  }\r\n  \r\n  vs->last_frame_index_built = rd_state->frame_index;\r\n  ProfEnd();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: View Building API\r\n\r\n//- rjf: view info extraction\r\n\r\ninternal Arena *\r\nrd_view_arena(void)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  return view_state->arena;\r\n}\r\n\r\ninternal UI_ScrollPt2\r\nrd_view_scroll_pos(void)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  return view_state->scroll_pos;\r\n}\r\n\r\ninternal EV_View *\r\nrd_view_eval_view(void)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  return view_state->ev_view;\r\n}\r\n\r\ninternal String8\r\nrd_view_query_cmd(void)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  CFG_Node *query = cfg_node_child_from_string(view, str8_lit(\"query\"));\r\n  CFG_Node *cmd = cfg_node_child_from_string(query, str8_lit(\"cmd\"));\r\n  String8 string = cmd->first->string;\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nrd_view_query_input(void)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  CFG_Node *query = cfg_node_child_from_string(view, str8_lit(\"query\"));\r\n  CFG_Node *input = cfg_node_child_from_string(query, str8_lit(\"input\"));\r\n  String8 string = input->first->string;\r\n  return string;\r\n}\r\n\r\ninternal String8\r\nrd_view_setting_from_name(String8 name)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  String8 result = cfg_node_child_from_string(view, name)->first->string;\r\n  if(result.size == 0)\r\n  {\r\n    result = rd_default_setting_from_names(view->string, name);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal E_Value\r\nrd_view_setting_value_from_name(String8 name)\r\n{\r\n  String8 expr = rd_view_setting_from_name(name);\r\n  E_Eval eval = e_eval_from_string(expr);\r\n  E_Value result = e_value_eval_from_eval(eval).value;\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nrd_view_setting_b32_from_name(String8 name)\r\n{\r\n  String8 string = rd_view_setting_from_name(name);\r\n  B32 result = !!e_value_from_stringf(\"raw((bool)(%S))\", string).u64;\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nrd_view_setting_u64_from_name(String8 name)\r\n{\r\n  String8 string = rd_view_setting_from_name(name);\r\n  U64 result = e_value_from_stringf(\"raw((uint64)(%S))\", string).u64;\r\n  return result;\r\n}\r\n\r\ninternal F32\r\nrd_view_setting_f32_from_name(String8 name)\r\n{\r\n  String8 string = rd_view_setting_from_name(name);\r\n  F32 result = e_value_from_stringf(\"raw((float32)(%S))\", string).f32;\r\n  return result;\r\n}\r\n\r\n//- rjf: evaluation & tag (a view's 'call') parameter extraction\r\n\r\ninternal Rng1U64\r\nrd_space_range_from_eval(E_Eval eval)\r\n{\r\n  Rng1U64 range = e_range_from_eval(eval);\r\n  U64 size_setting = rd_view_setting_value_from_name(str8_lit(\"size\")).u64;\r\n  if(size_setting != 0)\r\n  {\r\n    range.max = range.min + size_setting;\r\n  }\r\n  return range;\r\n}\r\n\r\ninternal TXT_LangKind\r\nrd_lang_kind_from_eval(E_Eval eval)\r\n{\r\n  TXT_LangKind lang_kind = TXT_LangKind_Null;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 file_path = rd_file_path_from_eval(scratch.arena, eval);\r\n  if(file_path.size != 0)\r\n  {\r\n    lang_kind = txt_lang_kind_from_extension(str8_skip_last_dot(file_path));\r\n  }\r\n  scratch_end(scratch);\r\n  return lang_kind;\r\n}\r\n\r\ninternal Arch\r\nrd_arch_from_eval(E_Eval eval)\r\n{\r\n  // rjf: try implicitly from either `eval` itself, or from context\r\n  CTRL_Entity *ctrl_entity = rd_ctrl_entity_from_eval_space(eval.space);\r\n  CTRL_Entity *process = ctrl_process_from_entity(ctrl_entity);\r\n  if(process == &ctrl_entity_nil)\r\n  {\r\n    process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process);\r\n  }\r\n  Arch arch = process->arch;\r\n  if(arch == Arch_Null)\r\n  {\r\n    arch = Arch_CURRENT;\r\n  }\r\n  \r\n  // rjf: try arch arguments\r\n  E_Type *type = e_type_from_key(eval.irtree.type_key);\r\n  if(type->kind == E_TypeKind_Lens)\r\n  {\r\n    for EachIndex(idx, type->count)\r\n    {\r\n      E_Expr *arg = type->args[idx];\r\n      {\r\n        String8 arg_arch_string = arg->string;\r\n        if(arg->kind == E_ExprKind_Define && str8_match(arg->first->string, str8_lit(\"arch\"), 0))\r\n        {\r\n          arg_arch_string = arg->first->next->string;\r\n        }\r\n        if(str8_match(arg->first->next->string, str8_lit(\"x64\"), 0))\r\n        {\r\n          arch = Arch_x64;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return arch;\r\n}\r\n\r\n//- rjf: pushing/attaching view resources\r\n\r\ninternal void *\r\nrd_view_state_by_size(U64 size)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  if(view_state->user_data == 0)\r\n  {\r\n    view_state->user_data = push_array(view_state->arena, U8, size);\r\n  }\r\n  return view_state->user_data;\r\n}\r\n\r\ninternal Arena *\r\nrd_push_view_arena(void)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  RD_ArenaExt *ext = push_array(view_state->arena, RD_ArenaExt, 1);\r\n  ext->arena = arena_alloc();\r\n  SLLQueuePush(view_state->first_arena_ext, view_state->last_arena_ext, ext);\r\n  return ext->arena;\r\n}\r\n\r\n//- rjf: storing view-attached state\r\n\r\ninternal void\r\nrd_store_view_expr_string(String8 string)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"expression\"));\r\n  cfg_node_new_replace(rd_state->cfg, expr, string);\r\n}\r\n\r\ninternal void\r\nrd_store_view_loading_info(B32 is_loading, U64 progress_u64, U64 progress_u64_target)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  B32 loading_state_is_new = (is_loading && view_state->loading_t_target != (F32)!!is_loading);\r\n  view_state->loading_t_target = (F32)!!is_loading;\r\n  view_state->loading_progress_v = progress_u64;\r\n  view_state->loading_progress_v_target = progress_u64_target;\r\n  if(loading_state_is_new || view_state->last_frame_index_built+1 < rd_state->frame_index)\r\n  {\r\n    view_state->loading_t = view_state->loading_t_target;\r\n  }\r\n}\r\n\r\ninternal void\r\nrd_store_view_scroll_pos(UI_ScrollPt2 pos)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  RD_ViewState *view_state = rd_view_state_from_cfg(view);\r\n  view_state->scroll_pos = pos;\r\n}\r\n\r\ninternal void\r\nrd_store_view_param(String8 key, String8 value)\r\n{\r\n  CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n  CFG_Node *child = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, key);\r\n  cfg_node_new_replace(rd_state->cfg, child, value);\r\n}\r\n\r\ninternal void\r\nrd_store_view_paramf(String8 key, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  rd_store_view_param(key, string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Window Functions\r\n\r\ninternal String8\r\nrd_push_window_title(Arena *arena)\r\n{\r\n  String8 result = push_str8f(arena, \"%S - %s\", str8_skip_last_slash(rd_state->project_path), BUILD_TITLE \" (\" BUILD_VERSION_STRING_LITERAL \" \" BUILD_RELEASE_PHASE_STRING_LITERAL \")\");\r\n  return result;\r\n}\r\n\r\ninternal CFG_Node *\r\nrd_window_from_cfg(CFG_Node *cfg)\r\n{\r\n  CFG_Node *result = &cfg_nil_node;\r\n  for(CFG_Node *c = cfg; c != &cfg_nil_node; c = c->parent)\r\n  {\r\n    if(c->parent->parent == cfg_node_root() && str8_match(c->string, str8_lit(\"window\"), 0))\r\n    {\r\n      result = c;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RD_WindowState *\r\nrd_window_state_from_cfg(CFG_Node *cfg)\r\n{\r\n  //- rjf: unpack\r\n  CFG_Node *window_cfg = rd_window_from_cfg(cfg);\r\n  CFG_ID id = window_cfg->id;\r\n  \r\n  //- rjf: scan for existing window\r\n  RD_WindowState *ws = &rd_nil_window_state;\r\n  if(id != 0 &&\r\n     id == rd_state->window_state_last_accessed_id &&\r\n     id == rd_state->window_state_last_accessed->cfg_id)\r\n  {\r\n    ws = rd_state->window_state_last_accessed;\r\n  }\r\n  else\r\n  {\r\n    U64 hash = d_hash_from_string(str8_struct(&id));\r\n    U64 slot_idx = hash%rd_state->window_state_slots_count;\r\n    RD_WindowStateSlot *slot = &rd_state->window_state_slots[slot_idx];\r\n    for(RD_WindowState *w = slot->first; w != 0; w = w->hash_next)\r\n    {\r\n      if(w->cfg_id == id)\r\n      {\r\n        ws = w;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: allocate/open new window if one was not found\r\n  if(window_cfg != &cfg_nil_node && ws == &rd_nil_window_state)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    // rjf: unpack configuration options\r\n    B32 has_pos = 0;\r\n    Vec2F32 pos = {0};\r\n    Vec2F32 size = {0};\r\n    OS_Handle preferred_monitor = {0};\r\n    {\r\n      CFG_Node *pos_cfg = cfg_node_child_from_string(window_cfg, str8_lit(\"pos\"));\r\n      has_pos = (pos_cfg != &cfg_nil_node);\r\n      CFG_Node *size_cfg = cfg_node_child_from_string(window_cfg, str8_lit(\"size\"));\r\n      CFG_Node *monitor_cfg = cfg_node_child_from_string(window_cfg, str8_lit(\"monitor\"));\r\n      pos.x = (F32)f64_from_str8(pos_cfg->first->string);\r\n      pos.y = (F32)f64_from_str8(pos_cfg->first->next->string);\r\n      size.x = (F32)f64_from_str8(size_cfg->first->string);\r\n      size.y = (F32)f64_from_str8(size_cfg->first->next->string);\r\n      OS_HandleArray monitors = os_push_monitors_array(scratch.arena);\r\n      for EachIndex(idx, monitors.count)\r\n      {\r\n        String8 monitor_name = os_name_from_monitor(scratch.arena, monitors.v[idx]);\r\n        if(str8_match(monitor_name, monitor_cfg->first->string, StringMatchFlag_CaseInsensitive))\r\n        {\r\n          preferred_monitor = monitors.v[idx];\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: allocate window\r\n    ws = rd_state->free_window_state;\r\n    if(ws != 0)\r\n    {\r\n      SLLStackPop_N(rd_state->free_window_state, order_next);\r\n    }\r\n    else\r\n    {\r\n      ws = push_array_no_zero(rd_state->arena, RD_WindowState, 1);\r\n    }\r\n    MemoryZeroStruct(ws);\r\n    \r\n    // rjf: fill out window\r\n    ws->cfg_id = id;\r\n    ws->arena = arena_alloc();\r\n    {\r\n      String8 title = rd_push_window_title(scratch.arena);\r\n      ws->os = os_window_open(r2f32p(pos.x, pos.y, pos.x+size.x, pos.y+size.y), (!has_pos*OS_WindowFlag_UseDefaultPosition)|OS_WindowFlag_CustomBorder, title);\r\n    }\r\n    ws->r = r_window_equip(ws->os);\r\n    ws->ui = ui_state_alloc();\r\n    ws->drop_completion_arena = arena_alloc();\r\n    ws->query_arena = arena_alloc();\r\n    ws->hover_eval_arena = arena_alloc();\r\n    ws->autocomp_arena = arena_alloc();\r\n    ws->last_dpi = os_dpi_from_window(ws->os);\r\n    OS_Handle zero_monitor = {0};\r\n    if(!os_handle_match(zero_monitor, preferred_monitor))\r\n    {\r\n      os_window_set_monitor(ws->os, preferred_monitor);\r\n    }\r\n    if(cfg_node_child_from_string(window_cfg, str8_lit(\"fullscreen\")) != &cfg_nil_node)\r\n    {\r\n      os_window_set_fullscreen(ws->os, 1);\r\n    }\r\n    if(cfg_node_child_from_string(window_cfg, str8_lit(\"maximized\")) != &cfg_nil_node)\r\n    {\r\n      os_window_set_maximized(ws->os, 1);\r\n    }\r\n    \r\n    // rjf: hook up window links\r\n    U64 hash = d_hash_from_string(str8_struct(&id));\r\n    U64 slot_idx = hash%rd_state->window_state_slots_count;\r\n    RD_WindowStateSlot *slot = &rd_state->window_state_slots[slot_idx];\r\n    DLLPushBack_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev);\r\n    DLLPushBack_NP(slot->first, slot->last, ws, hash_next, hash_prev);\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //- rjf: touch window for this frame\r\n  if(ws != &rd_nil_window_state)\r\n  {\r\n    ws->last_frame_index_touched = rd_state->frame_index;\r\n  }\r\n  \r\n  rd_state->window_state_last_accessed_id = ws->cfg_id;\r\n  rd_state->window_state_last_accessed = ws;\r\n  return ws;\r\n}\r\n\r\ninternal RD_WindowState *\r\nrd_window_state_from_os_handle(OS_Handle os)\r\n{\r\n  RD_WindowState *ws = &rd_nil_window_state;\r\n  {\r\n    for(RD_WindowState *w = rd_state->first_window_state;\r\n        w != &rd_nil_window_state;\r\n        w = w->order_next)\r\n    {\r\n      if(os_handle_match(w->os, os))\r\n      {\r\n        ws = w;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return ws;\r\n}\r\n\r\n#if COMPILER_MSVC && !BUILD_DEBUG\r\nNO_OPTIMIZE_BEGIN\r\n#endif\r\n\r\ninternal void\r\nrd_window_frame(void)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  ProfBeginFunction();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part unpack context\r\n  //\r\n  CFG_Node *window          = cfg_node_from_id(rd_regs()->window);\r\n  RD_WindowState *ws      = rd_window_state_from_cfg(cfg_node_from_id(rd_regs()->window));\r\n  CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n  B32 window_is_focused   = (os_window_is_focused(ws->os) || ws->window_temporarily_focused_ipc);\r\n  B32 popup_is_open       = (rd_state->popup_active);\r\n  B32 query_is_open       = (ws->query_is_active);\r\n  U64 hover_eval_open_delay_us = 400000;\r\n  B32 hover_eval_is_open  = (!popup_is_open &&\r\n                             !query_is_open &&\r\n                             ws->hover_eval_string.size != 0 &&\r\n                             ws->hover_eval_firstt_us+hover_eval_open_delay_us < ws->hover_eval_lastt_us &&\r\n                             rd_state->time_in_us - ws->hover_eval_lastt_us < hover_eval_open_delay_us);\r\n  if(!window_is_focused || popup_is_open)\r\n  {\r\n    ws->menu_bar_key_held = 0;\r\n  }\r\n  ws->window_temporarily_focused_ipc = 0;\r\n  ui_select_state(ws->ui);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part fill panel/view interaction registers\r\n  //\r\n  rd_regs()->panel = panel_tree.focused->cfg->id;\r\n  rd_regs()->tab   = panel_tree.focused->selected_tab->id;\r\n  rd_regs()->view = panel_tree.focused->selected_tab->id;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part compute window's theme\r\n  //\r\n  {\r\n    Access *access = access_open();\r\n    \r\n    //- rjf: try to find theme settings from the project, then the user.\r\n    CFG_NodePtrList colors_cfgs = {0};\r\n    CFG_Node *theme_parents[] =\r\n    {\r\n      cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\")),\r\n      cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"))\r\n    };\r\n    CFG_Node *theme_cfgs[] =\r\n    {\r\n      &cfg_nil_node,\r\n      &cfg_nil_node,\r\n    };\r\n    for EachIndex(idx, ArrayCount(theme_parents))\r\n    {\r\n      CFG_Node *parent_cfg = theme_parents[idx];\r\n      if(theme_cfgs[idx] == &cfg_nil_node)\r\n      {\r\n        CFG_Node *possible_theme_cfg = cfg_node_child_from_string(parent_cfg, str8_lit(\"theme\"));\r\n        if(possible_theme_cfg != &cfg_nil_node)\r\n        {\r\n          theme_cfgs[idx] = possible_theme_cfg;\r\n        }\r\n      }\r\n      for(CFG_Node *child = parent_cfg->first; child != &cfg_nil_node; child = child->next)\r\n      {\r\n        if(str8_match(child->string, str8_lit(\"theme_color\"), 0))\r\n        {\r\n          cfg_node_ptr_list_push_front(scratch.arena, &colors_cfgs, child);\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: choose which theme cfg to use\r\n    CFG_Node *theme_cfg = theme_cfgs[1];\r\n    if(rd_setting_b32_from_name(str8_lit(\"use_project_theme\")))\r\n    {\r\n      theme_cfg = theme_cfgs[0];\r\n      if(theme_cfg == &cfg_nil_node)\r\n      {\r\n        theme_cfg = theme_cfgs[1];\r\n      }\r\n    }\r\n    \r\n    //- rjf: map the theme config to the associated tree (either from a preset, or from a file)\r\n    MD_Node *theme_tree = rd_theme_tree_from_name(scratch.arena, access, theme_cfg->first->string);\r\n    if(colors_cfgs.count == 0 && theme_tree == &md_nil_node)\r\n    {\r\n      theme_tree = rd_state->theme_preset_trees[RD_ThemePreset_DefaultDark];\r\n    }\r\n    \r\n    //- rjf: build tasks for color applications - each task comprises of a metadesk\r\n    // tree, describing the color patterns\r\n    typedef struct ThemeTask ThemeTask;\r\n    struct ThemeTask\r\n    {\r\n      ThemeTask *next;\r\n      MD_Node *tree;\r\n    };\r\n    ThemeTask start_task = {0, theme_tree};\r\n    ThemeTask *first_task = &start_task;\r\n    ThemeTask *last_task = first_task;\r\n    {\r\n      for(CFG_NodePtrNode *n = colors_cfgs.first; n != 0; n = n->next)\r\n      {\r\n        ThemeTask *t = push_array(scratch.arena, ThemeTask, 1);\r\n        SLLQueuePushFront(first_task, last_task, t);\r\n        t->tree = md_tree_from_string(scratch.arena, cfg_string_from_tree(scratch.arena, rd_state->cfg_schema_table, str8_zero(), n->v));\r\n      }\r\n    }\r\n    \r\n    //- rjf: apply theme tasks, build each color pattern for this window's\r\n    // structured theme\r\n    typedef struct ThemePatternNode ThemePatternNode;\r\n    struct ThemePatternNode\r\n    {\r\n      ThemePatternNode *next;\r\n      UI_ThemePattern pattern;\r\n    };\r\n    ThemePatternNode *first_pattern = 0;\r\n    ThemePatternNode *last_pattern = 0;\r\n    U64 pattern_count = 0;\r\n    for(ThemeTask *t = first_task; t != 0; t = t->next)\r\n    {\r\n      MD_Node *tree_root = t->tree;\r\n      for(MD_Node *n = tree_root; !md_node_is_nil(n); n = md_node_rec_depth_first_pre(n, tree_root).next)\r\n      {\r\n        if(str8_match(n->string, str8_lit(\"theme_color\"), 0))\r\n        {\r\n          MD_Node *tags_child = md_child_from_string(n, str8_lit(\"tags\"), 0);\r\n          MD_Node *value_child = md_child_from_string(n, str8_lit(\"value\"), 0);\r\n          U8 split_char = ' ';\r\n          String8List tags = str8_split(scratch.arena, tags_child->first->string, &split_char, 1, 0);\r\n          U32 color_u32 = e_value_from_stringf(\"raw(%S)\", value_child->first->string).u32;\r\n          Vec4F32 color_linear = linear_from_srgba(rgba_from_u32(color_u32));\r\n          ThemePatternNode *node = push_array(scratch.arena, ThemePatternNode, 1);\r\n          node->pattern.tags = str8_array_from_list(rd_frame_arena(), &tags);\r\n          node->pattern.linear = color_linear;\r\n          SLLQueuePush(first_pattern, last_pattern, node);\r\n          pattern_count += 1;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: convert to final pattern array\r\n    ws->theme = push_array(rd_frame_arena(), UI_Theme, 1);\r\n    ws->theme->patterns_count = pattern_count;\r\n    ws->theme->patterns = push_array(rd_frame_arena(), UI_ThemePattern, ws->theme->patterns_count);\r\n    {\r\n      U64 idx = 0;\r\n      for(ThemePatternNode *n = first_pattern; n != 0; n = n->next, idx += 1)\r\n      {\r\n        ws->theme->patterns[idx] = n->pattern;\r\n      }\r\n    }\r\n    \r\n    access_close(access);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part compute window's font raster flags\r\n  //\r\n  {\r\n    ws->font_slot_raster_flags[RD_FontSlot_Icons] = FNT_RasterFlag_Smooth;\r\n    ws->font_slot_raster_flags[RD_FontSlot_Main] = (rd_setting_b32_from_name(str8_lit(\"smooth_ui_text\"))*FNT_RasterFlag_Smooth)|(rd_setting_b32_from_name(str8_lit(\"hint_ui_text\"))*FNT_RasterFlag_Hinted);\r\n    ws->font_slot_raster_flags[RD_FontSlot_Code] = (rd_setting_b32_from_name(str8_lit(\"smooth_code_text\"))*FNT_RasterFlag_Smooth)|(rd_setting_b32_from_name(str8_lit(\"hint_code_text\"))*FNT_RasterFlag_Hinted);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part pre-emptively rasterize common glyphs on the first frame\r\n  //\r\n  if(rd_state->first_window_state == ws && rd_state->last_window_state == ws && ws->frames_alive == 0)\r\n  {\r\n    F32 font_size = rd_font_size();\r\n    RD_FontSlot english_font_slots[] = {RD_FontSlot_Main, RD_FontSlot_Code};\r\n    RD_FontSlot icon_font_slot = RD_FontSlot_Icons;\r\n    for(U64 idx = 0; idx < ArrayCount(english_font_slots); idx += 1)\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      RD_FontSlot slot = english_font_slots[idx];\r\n      String8 sample_text = str8_lit(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890~!@#$%^&*()-_+=[{]}\\\\|;:'\\\",<.>/?\");\r\n      fnt_run_from_string(rd_font_from_slot(slot),\r\n                          font_size,\r\n                          0, 0, 0,\r\n                          sample_text);\r\n      fnt_run_from_string(rd_font_from_slot(slot),\r\n                          font_size,\r\n                          0, 0, 0,\r\n                          sample_text);\r\n      scratch_end(scratch);\r\n    }\r\n    for(RD_IconKind icon_kind = RD_IconKind_Null; icon_kind < RD_IconKind_COUNT; icon_kind = (RD_IconKind)(icon_kind+1))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      fnt_run_from_string(rd_font_from_slot(icon_font_slot),\r\n                          font_size,\r\n                          0, 0, FNT_RasterFlag_Smooth,\r\n                          rd_icon_kind_text_table[icon_kind]);\r\n      fnt_run_from_string(rd_font_from_slot(icon_font_slot),\r\n                          font_size,\r\n                          0, 0, FNT_RasterFlag_Smooth,\r\n                          rd_icon_kind_text_table[icon_kind]);\r\n      fnt_run_from_string(rd_font_from_slot(icon_font_slot),\r\n                          font_size,\r\n                          0, 0, FNT_RasterFlag_Smooth,\r\n                          rd_icon_kind_text_table[icon_kind]);\r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part commit window's position/status to underlying cfg tree\r\n  //\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    B32 is_fullscreen = os_window_is_fullscreen(ws->os);\r\n    B32 is_maximized = os_window_is_maximized(ws->os);\r\n    B32 is_minimized = os_window_is_minimized(ws->os);\r\n    if(is_fullscreen)\r\n    {\r\n      cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"fullscreen\"));\r\n    }\r\n    else\r\n    {\r\n      cfg_node_release(rd_state->cfg, cfg_node_child_from_string(window, str8_lit(\"fullscreen\")));\r\n    }\r\n    if(is_maximized)\r\n    {\r\n      cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"maximized\"));\r\n    }\r\n    else\r\n    {\r\n      cfg_node_release(rd_state->cfg, cfg_node_child_from_string(window, str8_lit(\"maximized\")));\r\n    }\r\n    \r\n    //- rjf: DPI changes -> xform font size / window size\r\n    F32 dpi = os_dpi_from_window(ws->os);\r\n    if(dpi != ws->last_dpi)\r\n    {\r\n      fnt_reset();\r\n      F32 current_font_size = rd_font_size();\r\n      F32 new_font_size = current_font_size * (dpi / ws->last_dpi);\r\n      new_font_size = Clamp(6.f, new_font_size, 72.f);\r\n      CFG_Node *font_size_cfg = cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"font_size\"));\r\n      cfg_node_new_replacef(rd_state->cfg, font_size_cfg, \"%I64u\", (U64)new_font_size);\r\n      ws->last_dpi = dpi;\r\n    }\r\n    \r\n    //- rjf: commit position\r\n    Rng2F32 window_rect = os_rect_from_window(ws->os);\r\n    if(!is_fullscreen && !is_maximized && !is_minimized)\r\n    {\r\n      Vec2F32 pos = window_rect.p0;\r\n      CFG_Node *pos_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"pos\"));\r\n      if((S32)pos.x != (S32)f64_from_str8(pos_root->first->string) ||\r\n         (S32)pos.y != (S32)f64_from_str8(pos_root->last->string))\r\n      {\r\n        CFG_Node *x = pos_root->first;\r\n        if(x == &cfg_nil_node)\r\n        {\r\n          x= cfg_node_alloc(rd_state->cfg);\r\n          cfg_node_insert_child(rd_state->cfg, pos_root, &cfg_nil_node, x);\r\n        }\r\n        CFG_Node *y = x->next;\r\n        if(y == &cfg_nil_node)\r\n        {\r\n          y = cfg_node_alloc(rd_state->cfg);\r\n          cfg_node_insert_child(rd_state->cfg, pos_root, x, y);\r\n        }\r\n        cfg_node_equip_stringf(rd_state->cfg, x, \"%i\", (S32)pos.x);\r\n        cfg_node_equip_stringf(rd_state->cfg, y, \"%i\", (S32)pos.y);\r\n      }\r\n    }\r\n    \r\n    //- rjf: commit size\r\n    if(!is_fullscreen && !is_maximized && !is_minimized)\r\n    {\r\n      Vec2F32 size = dim_2f32(window_rect);\r\n      CFG_Node *size_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"size\"));\r\n      if((S32)size.x != (S32)f64_from_str8(size_root->first->string) ||\r\n         (S32)size.y != (S32)f64_from_str8(size_root->last->string))\r\n      {\r\n        CFG_Node *width = size_root->first;\r\n        if(width == &cfg_nil_node)\r\n        {\r\n          width = cfg_node_alloc(rd_state->cfg);\r\n          cfg_node_insert_child(rd_state->cfg, size_root, &cfg_nil_node, width);\r\n        }\r\n        CFG_Node *height = width->next;\r\n        if(height == &cfg_nil_node)\r\n        {\r\n          height = cfg_node_alloc(rd_state->cfg);\r\n          cfg_node_insert_child(rd_state->cfg, size_root, width, height);\r\n        }\r\n        cfg_node_equip_stringf(rd_state->cfg, width, \"%i\", (S32)size.x);\r\n        cfg_node_equip_stringf(rd_state->cfg, height, \"%i\", (S32)size.y);\r\n      }\r\n    }\r\n    \r\n    //- rjf: commit monitor\r\n    if(!is_minimized)\r\n    {\r\n      OS_Handle monitor = os_monitor_from_window(ws->os);\r\n      String8 monitor_name = os_name_from_monitor(scratch.arena, monitor);\r\n      CFG_Node *monitor_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"monitor\"));\r\n      if(!str8_match(monitor_root->first->string, monitor_name, 0))\r\n      {\r\n        cfg_node_new_replace(rd_state->cfg, monitor_root, monitor_name);\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part build UI\r\n  //\r\n  UI_Box *lister_box = &ui_nil_box;\r\n  ProfScope(\"build UI\")\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part set up\r\n    //\r\n    {\r\n      // rjf: get top-level font size info\r\n      F32 top_level_font_size = 0;\r\n      RD_RegsScope(.view = 0, .tab = 0) top_level_font_size = rd_font_size();\r\n      \r\n      // rjf: build icon info\r\n      UI_IconInfo icon_info = {0};\r\n      {\r\n        icon_info.icon_font = rd_font_from_slot(RD_FontSlot_Icons);\r\n        icon_info.icon_kind_text_map[UI_IconKind_RightArrow]     = rd_icon_kind_text_table[RD_IconKind_RightScroll];\r\n        icon_info.icon_kind_text_map[UI_IconKind_DownArrow]      = rd_icon_kind_text_table[RD_IconKind_DownScroll];\r\n        icon_info.icon_kind_text_map[UI_IconKind_LeftArrow]      = rd_icon_kind_text_table[RD_IconKind_LeftScroll];\r\n        icon_info.icon_kind_text_map[UI_IconKind_UpArrow]        = rd_icon_kind_text_table[RD_IconKind_UpScroll];\r\n        icon_info.icon_kind_text_map[UI_IconKind_RightCaret]     = rd_icon_kind_text_table[RD_IconKind_RightCaret];\r\n        icon_info.icon_kind_text_map[UI_IconKind_DownCaret]      = rd_icon_kind_text_table[RD_IconKind_DownCaret];\r\n        icon_info.icon_kind_text_map[UI_IconKind_LeftCaret]      = rd_icon_kind_text_table[RD_IconKind_LeftCaret];\r\n        icon_info.icon_kind_text_map[UI_IconKind_UpCaret]        = rd_icon_kind_text_table[RD_IconKind_UpCaret];\r\n        icon_info.icon_kind_text_map[UI_IconKind_CheckHollow]    = rd_icon_kind_text_table[RD_IconKind_CheckHollow];\r\n        icon_info.icon_kind_text_map[UI_IconKind_CheckFilled]    = rd_icon_kind_text_table[RD_IconKind_CheckFilled];\r\n      }\r\n      \r\n      // rjf: build animation info\r\n      UI_AnimationInfo animation_info = {0};\r\n      {\r\n        animation_info.hot_animation_rate      = rd_state->catchall_animation_rate;\r\n        animation_info.active_animation_rate   = rd_state->catchall_animation_rate;\r\n        animation_info.focus_animation_rate    = 1.f;\r\n        animation_info.tooltip_animation_rate  = rd_state->tooltip_animation_rate;\r\n        animation_info.menu_animation_rate     = rd_state->menu_animation_rate;\r\n        animation_info.scroll_animation_rate   = rd_state->scrolling_animation_rate;\r\n      }\r\n      \r\n      // rjf: begin & push initial stack values\r\n      ui_begin_build(ws->os, &ws->ui_events, &icon_info, ws->theme, &animation_info, rd_state->frame_dt, rd_state->frame_dt);\r\n      ui_push_font(rd_font_from_slot(RD_FontSlot_Main));\r\n      ui_push_font_size(top_level_font_size);\r\n      ui_push_text_padding(floor_f32(ui_top_font_size()*0.3f));\r\n      ui_push_pref_width(ui_px(floor_f32(ui_top_font_size()*20.f), 1.f));\r\n      ui_push_pref_height(ui_px(floor_f32(ui_top_font_size()*3.f), 1.f));\r\n      ui_push_blur_size(10.f);\r\n      FNT_RasterFlags text_raster_flags = 0;\r\n      if(rd_setting_b32_from_name(str8_lit(\"smooth_ui_text\"))) {text_raster_flags |= FNT_RasterFlag_Smooth;}\r\n      if(rd_setting_b32_from_name(str8_lit(\"hint_ui_text\"))) {text_raster_flags |= FNT_RasterFlag_Hinted;}\r\n      ui_push_text_raster_flags(text_raster_flags);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part calculate code color slot RGBAs\r\n    //\r\n    for EachEnumVal(RD_CodeColorSlot, s)\r\n    {\r\n      ws->theme_code_colors[s] = ui_color_from_name(rd_code_color_slot_name_table[s]);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part calculate top-level rectangles/sizes\r\n    //\r\n    Rng2F32 window_rect = os_client_rect_from_window(ws->os);\r\n    Vec2F32 window_rect_dim = dim_2f32(window_rect);\r\n    F32 top_bar_dim_px = floor_f32(ui_top_font_size()*3.f);\r\n    Rng2F32 top_bar_rect = r2f32p(window_rect.x0, window_rect.y0, window_rect.x0+window_rect_dim.x+1, window_rect.y0+top_bar_dim_px);\r\n    Rng2F32 bottom_bar_rect = r2f32p(window_rect.x0, window_rect_dim.y - top_bar_dim_px, window_rect.x0+window_rect_dim.x, window_rect.y0+window_rect_dim.y);\r\n    Rng2F32 content_rect = r2f32p(window_rect.x0, top_bar_rect.y1, window_rect.x0+window_rect_dim.x, bottom_bar_rect.y0);\r\n    F32 window_edge_px = os_dpi_from_window(ws->os)*0.035f;\r\n    content_rect = pad_2f32(content_rect, -window_edge_px);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part truncated string hover\r\n    //\r\n    if(ui_string_hover_active()) UI_Tooltip\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      DR_FStrList fstrs = ui_string_hover_fstrs(scratch.arena);\r\n      UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n      ui_box_equip_display_fstrs(box, &fstrs);\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part rich hover / drag/drop tooltips\r\n    //\r\n    if((rd_state->hover_regs_slot != RD_RegSlot_Null && !rd_state->hover_regs->no_rich_tooltip) || (rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      RD_RegSlot slot = ((rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()) ? rd_state->drag_drop_regs_slot : rd_state->hover_regs_slot);\r\n      RD_Regs *regs = (((rd_state->drag_drop_regs_slot != RD_RegSlot_Null && rd_drag_is_active()) ? rd_state->drag_drop_regs : rd_state->hover_regs));\r\n      CTRL_Entity *ctrl_entity = &ctrl_entity_nil;\r\n      ui_state->tooltip_anchor_key = regs->ui_key;\r\n      ui_state->tooltip_can_overflow_window = rd_drag_is_active();\r\n      switch(slot)\r\n      {\r\n        default:{}break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: command tooltips\r\n        //\r\n        case RD_RegSlot_CmdName:\r\n        UI_Tooltip\r\n        {\r\n          String8 cmd_name = regs->cmd_name;\r\n          DR_FStrList fstrs = rd_title_fstrs_from_code_name(scratch.arena, cmd_name);\r\n          UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(5, 1))\r\n          {\r\n            UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n            ui_box_equip_display_fstrs(box, &fstrs);\r\n            rd_cmd_binding_buttons(cmd_name, str8_zero(), 0);\r\n          }\r\n        }break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: file path tooltips\r\n        //\r\n        case RD_RegSlot_FilePath:\r\n        UI_Tooltip\r\n        {\r\n          FileProperties props = os_properties_from_file_path(regs->file_path);\r\n          ui_set_next_pref_width(ui_children_sum(1));\r\n          UI_Row\r\n          {\r\n            RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[props.flags & FilePropertyFlag_IsFolder ? RD_IconKind_FolderClosedFilled : RD_IconKind_FileOutline]);\r\n            ui_label(regs->file_path);\r\n          }\r\n        }break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: cfg tooltips\r\n        //\r\n        case RD_RegSlot_Cfg:\r\n        UI_Tooltip\r\n        {\r\n          // rjf: unpack\r\n          CFG_Node *cfg = cfg_node_from_id(regs->cfg);\r\n          DR_FStrList fstrs = rd_title_fstrs_from_cfg(scratch.arena, cfg, 0);\r\n          \r\n          // rjf: title\r\n          UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(5, 1))\r\n          {\r\n            UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n            ui_box_equip_display_fstrs(box, &fstrs);\r\n          }\r\n        }break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: control entity tooltips\r\n        //\r\n        case RD_RegSlot_Machine:   {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->machine);     }goto ctrl_entity_tooltip;\r\n        case RD_RegSlot_Process:   {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->process);     }goto ctrl_entity_tooltip;\r\n        case RD_RegSlot_Module:    {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->module);      }goto ctrl_entity_tooltip;\r\n        case RD_RegSlot_Thread:    {ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->thread);      }goto ctrl_entity_tooltip;\r\n        case RD_RegSlot_CtrlEntity:{ctrl_entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, regs->ctrl_entity); }goto ctrl_entity_tooltip;\r\n        ctrl_entity_tooltip:;\r\n        UI_Tooltip\r\n        {\r\n          // rjf: unpack\r\n          Arch arch = ctrl_entity->arch;\r\n          String8 arch_str = string_from_arch(arch);\r\n          DR_FStrList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, ctrl_entity, 0);\r\n          \r\n          // rjf: title\r\n          UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(5, 1))\r\n          {\r\n            UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n            ui_box_equip_display_fstrs(box, &fstrs);\r\n            ui_spacer(ui_em(0.5f, 1.f));\r\n            UI_FontSize(ui_top_font_size() - 1.f)\r\n              UI_CornerRadius(ui_top_font_size()*0.5f)\r\n            {\r\n              UI_TagF(\"weak\") UI_FlagsAdd(UI_BoxFlag_DrawBorder) ui_label(arch_str);\r\n              ui_spacer(ui_em(0.5f, 1.f));\r\n              if(ctrl_entity->kind == CTRL_EntityKind_Thread ||\r\n                 ctrl_entity->kind == CTRL_EntityKind_Process)\r\n              {\r\n                UI_TagF(\"weak\") UI_FlagsAdd(UI_BoxFlag_DrawBorder) ui_labelf(\"ID: %i\", (U32)ctrl_entity->id);\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: debug info status\r\n          if(ctrl_entity->kind == CTRL_EntityKind_Module) UI_TagF(\"weak\")\r\n          {\r\n            Access *access = access_open();\r\n            CTRL_Entity *dbg_info_entity = ctrl_entity_child_from_kind(ctrl_entity, CTRL_EntityKind_DebugInfoPath);\r\n            DI_Key dbgi_key = ctrl_dbgi_key_from_module(ctrl_entity);\r\n            RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n            if(rdi->raw_data_size != 0)\r\n            {\r\n              ui_labelf(\"Debug information successfully loaded from %S\", dbg_info_entity->string);\r\n            }\r\n            else if(dbg_info_entity->string.size != 0)\r\n            {\r\n              ui_labelf(\"Debug information not found at %S\", dbg_info_entity->string);\r\n            }\r\n            else if(dbg_info_entity->string.size == 0)\r\n            {\r\n              ui_labelf(\"Debug information location not found in module file\");\r\n            }\r\n            access_close(access);\r\n          }\r\n          \r\n          // rjf: unwind\r\n          if(ctrl_entity->kind == CTRL_EntityKind_Thread) RD_Font(RD_FontSlot_Code)\r\n          {\r\n            Access *access = access_open();\r\n            Vec4F32 code_color = ui_color_from_name(str8_lit(\"code_default\"));\r\n            Vec4F32 symbol_color = ui_color_from_name(str8_lit(\"code_symbol\"));\r\n            CTRL_Entity *process = ctrl_entity_ancestor_from_kind(ctrl_entity, CTRL_EntityKind_Process);\r\n            B32 call_stack_high_priority = ctrl_handle_match(ctrl_entity->handle, rd_base_regs()->thread);\r\n            CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, ctrl_entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0);\r\n            if(call_stack.frames_count != 0)\r\n            {\r\n              ui_spacer(ui_em(1.5f, 1.f));\r\n            }\r\n            EV_StringParams string_params = {EV_StringFlag_ReadOnlyDisplayRules, .radix = 16};\r\n            String8 thread_handle_string = ctrl_string_from_handle(scratch.arena, ctrl_entity->handle);\r\n            for(U64 idx = 0; idx < 16; idx += 1)\r\n            {\r\n              E_Eval rip_eval = e_eval_from_stringf(\"query:control.%S.call_stack[%I64u]\", thread_handle_string, idx);\r\n              if(rip_eval.irtree.mode != E_Mode_Value)\r\n              {\r\n                break;\r\n              }\r\n              String8 rip_value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*40.f, rip_eval);\r\n              rd_code_label(1, 0, code_color, rip_value_string);\r\n            }\r\n            access_close(access);\r\n          }\r\n          \r\n        }break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: expression tooltips\r\n        //\r\n        case RD_RegSlot_Expr:\r\n        UI_Tooltip RD_Font(RD_FontSlot_Code)\r\n        {\r\n          ui_set_next_pref_width(ui_children_sum(1));\r\n          UI_Row\r\n          {\r\n            rd_code_label(1.f, 0, ui_color_from_name(str8_lit(\"text\")), rd_state->drag_drop_regs->expr);\r\n            E_Eval eval = e_eval_from_string(rd_state->drag_drop_regs->expr);\r\n            if(eval.irtree.mode != E_Mode_Null)\r\n            {\r\n              EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};\r\n              String8 value_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, ui_top_font(), ui_top_font_size(), ui_top_font_size()*20.f, eval);\r\n              if(value_string.size != 0)\r\n              {\r\n                ui_spacer(ui_em(2.f, 1.f));\r\n                rd_code_label(1.f, 0, ui_color_from_name(str8_lit(\"text\")), value_string);\r\n              }\r\n            }\r\n          }\r\n        }break;\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part drag/drop visualization tooltips\r\n    //\r\n    if(rd_drag_is_active() && window_is_focused)\r\n      RD_RegsScope(.window = rd_state->drag_drop_regs->window,\r\n                   .panel = rd_state->drag_drop_regs->panel,\r\n                   .tab = 0,\r\n                   .view = rd_state->drag_drop_regs->view)\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      CFG_Node *view = cfg_node_from_id(rd_state->drag_drop_regs->view);\r\n      {\r\n        //- rjf: tab dragging\r\n        if(rd_state->drag_drop_regs_slot == RD_RegSlot_View && view != &cfg_nil_node)\r\n        {\r\n          CFG_Node *immediate_parent = &cfg_nil_node;\r\n          for(CFG_Node *p = view->parent; p != &cfg_nil_node; p = p->parent)\r\n          {\r\n            if(str8_match(p->parent->string, str8_lit(\"immediate\"), 0))\r\n            {\r\n              immediate_parent = p->parent;\r\n              break;\r\n            }\r\n          }\r\n          if(immediate_parent != &cfg_nil_node)\r\n          {\r\n            cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate_parent, str8_lit(\"hot\"));\r\n          }\r\n          UI_Size main_width = ui_top_pref_width();\r\n          UI_Size main_height = ui_top_pref_height();\r\n          UI_TextAlign main_text_align = ui_top_text_alignment();\r\n          UI_Tooltip\r\n            UI_PrefWidth(main_width)\r\n            UI_PrefHeight(main_height)\r\n            UI_TextAlignment(main_text_align)\r\n          {\r\n            ui_state->tooltip_can_overflow_window = 1;\r\n            ui_set_next_pref_width(ui_em(60.f, 1.f));\r\n            ui_set_next_pref_height(ui_em(40.f, 1.f));\r\n            ui_set_next_child_layout_axis(Axis2_Y);\r\n            UI_Box *container = ui_build_box_from_key(0, ui_key_zero());\r\n            UI_Parent(container)\r\n            {\r\n              UI_Row UI_PrefWidth(ui_text_dim(10, 1))\r\n              {\r\n                DR_FStrList fstrs = rd_title_fstrs_from_cfg(scratch.arena, view, 0);\r\n                UI_Box *name_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n                ui_box_equip_display_fstrs(name_box, &fstrs);\r\n              }\r\n              ui_set_next_pref_width(ui_pct(1, 0));\r\n              ui_set_next_pref_height(ui_pct(1, 0));\r\n              ui_set_next_child_layout_axis(Axis2_Y);\r\n              UI_Box *view_preview_container = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip, \"###view_preview_container\");\r\n              UI_Parent(view_preview_container) UI_Focus(UI_FocusKind_Off) UI_WidthFill\r\n              {\r\n                rd_view_ui(view_preview_container->rect);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part developer menu\r\n    //\r\n    if(ws->dev_menu_is_open) RD_Font(RD_FontSlot_Code)\r\n    {\r\n      ui_set_next_flags(UI_BoxFlag_ViewScrollY|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_ViewClamp);\r\n      UI_PaneF(r2f32p(30, 30, 30+ui_top_font_size()*100, ui_top_font_size()*60), \"###dev_ctx_menu\")\r\n      {\r\n        //- rjf: capture\r\n        if(!ProfIsCapturing() && ui_clicked(ui_buttonf(\"Begin Profiler Capture###prof_cap\")))\r\n        {\r\n          ProfBeginCapture(\"raddbg\");\r\n        }\r\n        else if(ProfIsCapturing() && ui_clicked(ui_buttonf(\"End Profiler Capture###prof_cap\")))\r\n        {\r\n          ProfEndCapture();\r\n        }\r\n        \r\n        //- rjf: toggles\r\n        for(U64 idx = 0; idx < ArrayCount(DEV_toggle_table); idx += 1)\r\n        {\r\n          if(ui_clicked(rd_icon_button(*DEV_toggle_table[idx].value_ptr ? RD_IconKind_CheckFilled : RD_IconKind_CheckHollow, 0, DEV_toggle_table[idx].name)))\r\n          {\r\n            *DEV_toggle_table[idx].value_ptr ^= 1;\r\n          }\r\n        }\r\n        \r\n        ui_divider(ui_em(1.f, 1.f));\r\n        \r\n        //- rjf: draw registers\r\n        ui_labelf(\"hover_reg_slot: %i\", rd_state->hover_regs_slot);\r\n        struct\r\n        {\r\n          String8 name;\r\n          RD_Regs *regs;\r\n        }\r\n        regs_info[] =\r\n        {\r\n          {str8_lit(\"regs\"),       rd_regs()},\r\n          {str8_lit(\"hover_regs\"), rd_state->hover_regs},\r\n        };\r\n        for EachElement(idx, regs_info)\r\n        {\r\n          ui_divider(ui_em(1.f, 1.f));\r\n          ui_label(regs_info[idx].name);\r\n          RD_Regs *regs = regs_info[idx].regs;\r\n#define ID(name) ui_labelf(\"%s: $0x%I64x\", #name, (regs->name))\r\n          ID(window);\r\n          ID(panel);\r\n          ID(view);\r\n#undef ID\r\n#define Handle(name) ui_labelf(\"%s: [0x%I64x, 0x%I64x]\", #name, (regs->name).machine_id, (regs->name).dmn_handle.u64[0])\r\n          Handle(machine);\r\n          Handle(process);\r\n          Handle(module);\r\n          Handle(thread);\r\n#undef Handle\r\n          ui_labelf(\"file_path: \\\"%S\\\"\", regs->file_path);\r\n          ui_labelf(\"cursor: (L:%I64d, C:%I64d)\", regs->cursor.line, regs->cursor.column);\r\n          ui_labelf(\"mark: (L:%I64d, C:%I64d)\", regs->mark.line, regs->mark.column);\r\n          ui_labelf(\"unwind_count: %I64u\", regs->unwind_count);\r\n          ui_labelf(\"inline_depth: %I64u\", regs->inline_depth);\r\n          ui_labelf(\"text_key: [0x%I64x / 0x%I64x:0x%I64x]\", regs->text_key.root.u64[0], regs->text_key.id.u128[0].u64[0], regs->text_key.id.u128[0].u64[1]);\r\n          ui_labelf(\"lang_kind: '%S'\", txt_extension_from_lang_kind(regs->lang_kind));\r\n          ui_labelf(\"vaddr_range: [0x%I64x, 0x%I64x)\", regs->vaddr_range.min, regs->vaddr_range.max);\r\n          ui_labelf(\"voff_range: [0x%I64x, 0x%I64x)\", regs->voff_range.min, regs->voff_range.max);\r\n        }\r\n        \r\n        ui_divider(ui_em(1.f, 1.f));\r\n        \r\n        //- rjf: draw per-window stats\r\n        for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next)\r\n        {\r\n          // rjf: calc ui hash chain length\r\n          F64 avg_ui_hash_chain_length = 0;\r\n          {\r\n            F64 chain_count = 0;\r\n            F64 chain_length_sum = 0;\r\n            for(U64 idx = 0; idx < w->ui->box_table_size; idx += 1)\r\n            {\r\n              F64 chain_length = 0;\r\n              for(UI_Box *b = w->ui->box_table[idx].hash_first; !ui_box_is_nil(b); b = b->hash_next)\r\n              {\r\n                chain_length += 1;\r\n              }\r\n              if(chain_length > 0)\r\n              {\r\n                chain_length_sum += chain_length;\r\n                chain_count += 1;\r\n              }\r\n            }\r\n            avg_ui_hash_chain_length = chain_length_sum / chain_count;\r\n          }\r\n          ui_labelf(\"Target Hz: %.2f\", 1.f/rd_state->frame_dt);\r\n          ui_labelf(\"Ctrl Run Index: %I64u\", ctrl_run_gen());\r\n          ui_labelf(\"Ctrl Mem Gen Index: %I64u\", ctrl_mem_gen());\r\n          ui_labelf(\"Window %p\", w);\r\n          ui_set_next_pref_width(ui_children_sum(1));\r\n          ui_set_next_pref_height(ui_children_sum(1));\r\n          UI_Row\r\n          {\r\n            ui_spacer(ui_em(2.f, 1.f));\r\n            ui_labelf(\"Box Count: %I64u\", w->ui->last_build_box_count);\r\n          }\r\n          ui_set_next_pref_width(ui_children_sum(1));\r\n          ui_set_next_pref_height(ui_children_sum(1));\r\n          UI_Row\r\n          {\r\n            ui_spacer(ui_em(2.f, 1.f));\r\n            ui_labelf(\"Average UI Hash Chain Length: %f\", avg_ui_hash_chain_length);\r\n          }\r\n        }\r\n        \r\n        ui_divider(ui_em(1.f, 1.f));\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part drop-completion context menu\r\n    //\r\n    if(ws->top_drop_completion_task != 0)\r\n    {\r\n      RD_DropCompletionTask *task = ws->top_drop_completion_task;\r\n      B32 done = 0;\r\n      UI_CtxMenu(rd_state->drop_completion_key) UI_PrefWidth(ui_em(40.f, 1.f)) UI_TagF(\"implicit\")\r\n      {\r\n        // rjf: file names\r\n        UI_TagF(\"weak\") UI_Row UI_Padding(ui_em(1.25f, 1.f))\r\n        {\r\n          String8List strings = {0};\r\n          U64 idx = 0;\r\n          for(String8Node *n = task->paths.first; n != 0 && idx < 20; n = n->next, idx += 1)\r\n          {\r\n            str8_list_push(scratch.arena, &strings, str8_skip_last_slash(n->string));\r\n            if(idx+1 == 20)\r\n            {\r\n              str8_list_push(scratch.arena, &strings, str8_lit(\"...\"));\r\n            }\r\n          }\r\n          StringJoin join = {.sep = str8_lit(\", \")};\r\n          String8 string = str8_list_join(scratch.arena, &strings, &join);\r\n          UI_PrefWidth(ui_pct(1, 0)) ui_label(string);\r\n        }\r\n        \r\n        // rjf: option to add EXEs as targets\r\n        if(task->exe)\r\n        {\r\n          if(ui_clicked(rd_icon_buttonf(RD_IconKind_Target, 0, \"Add as target%s\", (task->paths.node_count > 1) ? \"s\" : \"\")))\r\n          {\r\n            for(String8Node *n = task->paths.first; n != 0; n = n->next)\r\n            {\r\n              rd_cmd(RD_CmdKind_AddTarget, .file_path = n->string);\r\n            }\r\n            done = 1;\r\n          }\r\n        }\r\n        \r\n        // rjf: option to load files as debug info\r\n        if(task->dbg)\r\n        {\r\n          if(ui_clicked(rd_icon_buttonf(RD_IconKind_Module, 0, \"Load as debug info\")))\r\n          {\r\n            for(String8Node *n = task->paths.first; n != 0; n = n->next)\r\n            {\r\n              rd_cmd(RD_CmdKind_LoadDebugInfo, .file_path = n->string);\r\n            }\r\n            done = 1;\r\n          }\r\n        }\r\n        \r\n        // rjf: option to just open & view the file contents\r\n        if(ui_clicked(rd_icon_buttonf(RD_IconKind_FileOutline, 0, \"View file%s contents\", (task->paths.node_count > 1) ? \"s'\" : \"\")))\r\n        {\r\n          for(String8Node *n = task->paths.first; n != 0; n = n->next)\r\n          {\r\n            rd_cmd(RD_CmdKind_Open, .file_path = n->string);\r\n          }\r\n          done = 1;\r\n        }\r\n      }\r\n      \r\n      // rjf: pop task, close context menu if needed, when done\r\n      if(done)\r\n      {\r\n        SLLStackPop(ws->top_drop_completion_task);\r\n        if(ws->top_drop_completion_task == 0)\r\n        {\r\n          ui_ctx_menu_close();\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part popup\r\n    //\r\n    {\r\n      if(rd_state->popup_t > 0.005f) UI_TextAlignment(UI_TextAlign_Center) UI_Focus(rd_state->popup_active ? UI_FocusKind_Root : UI_FocusKind_Off)\r\n      {\r\n        Vec2F32 window_dim = dim_2f32(window_rect);\r\n        UI_Box *bg_box = &ui_nil_box;\r\n        UI_Rect(window_rect)\r\n          UI_ChildLayoutAxis(Axis2_X)\r\n          UI_Focus(UI_FocusKind_On)\r\n          UI_BlurSize(10*rd_state->popup_t)\r\n          UI_Transparency(1-rd_state->popup_t)\r\n          UI_TagF(\"floating\")\r\n        {\r\n          bg_box = ui_build_box_from_stringf(UI_BoxFlag_FixedSize|\r\n                                             UI_BoxFlag_Floating|\r\n                                             UI_BoxFlag_Clickable|\r\n                                             UI_BoxFlag_Scroll|\r\n                                             UI_BoxFlag_DefaultFocusNav|\r\n                                             UI_BoxFlag_DisableFocusOverlay|\r\n                                             UI_BoxFlag_DrawBackgroundBlur|\r\n                                             UI_BoxFlag_DrawBackground, \"###popup_%p\", ws);\r\n        }\r\n        if(rd_state->popup_active) UI_Parent(bg_box) UI_Transparency(1-rd_state->popup_t)\r\n        {\r\n          ui_ctx_menu_close();\r\n          UI_WidthFill UI_PrefHeight(ui_children_sum(1.f)) UI_Column UI_Padding(ui_pct(1, 0))\r\n          {\r\n            UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Main)) UI_FontSize(ui_top_font_size()*2.f) UI_PrefHeight(ui_em(3.f, 1.f)) ui_label(rd_state->popup_title);\r\n            UI_PrefHeight(ui_em(3.f, 1.f)) UI_TagF(\"weak\") ui_label(rd_state->popup_desc);\r\n            ui_spacer(ui_em(1.5f, 1.f));\r\n            UI_Row UI_Padding(ui_pct(1.f, 0.f)) UI_PrefWidth(ui_em(16.f, 1.f)) UI_PrefHeight(ui_em(3.5f, 1.f)) UI_CornerRadius(ui_top_font_size()*0.5f)\r\n            {\r\n              UI_TagF(\"pop\")\r\n                if(ui_clicked(ui_buttonf(\"OK\")) || (ui_key_match(bg_box->default_nav_focus_hot_key, ui_key_zero()) && ui_slot_press(UI_EventActionSlot_Accept)))\r\n              {\r\n                rd_cmd(RD_CmdKind_PopupAccept);\r\n              }\r\n              ui_spacer(ui_em(1.f, 1.f));\r\n              if(ui_clicked(ui_buttonf(\"Cancel\")) || ui_slot_press(UI_EventActionSlot_Cancel))\r\n              {\r\n                rd_cmd(RD_CmdKind_PopupCancel);\r\n              }\r\n            }\r\n            ui_spacer(ui_em(3.f, 1.f));\r\n          }\r\n        }\r\n        ui_signal_from_box(bg_box);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part build autocompletion callee info helper\r\n    //\r\n    F32 autocomp_callee_helper_height_px = 0;\r\n    if(rd_setting_b32_from_name(str8_lit(\"view_call_argument_helper\")) &&\r\n       ws->autocomp_regs != 0 && ws->autocomp_last_frame_index+1 >= rd_state->frame_index &&\r\n       ws->autocomp_cursor_info.callee_expr.size != 0)\r\n    {\r\n      E_Eval eval = e_eval_from_string(ws->autocomp_cursor_info.callee_expr);\r\n      E_Type *type = e_type_from_key(eval.irtree.type_key);\r\n      if(type->kind == E_TypeKind_LensSpec) UI_TagF(\"floating\")\r\n      {\r\n        F32 open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"autocomp_callee_helper_t\"), 1.f, .rate = rd_state->menu_animation_rate);\r\n        \r\n        //- rjf: determine rects/sizes\r\n        F32 row_height_px = ui_top_font_size()*2.f;\r\n        F32 padding_px = ui_top_font_size()*1.f;\r\n        Vec2F32 callee_helper_pos = {0};\r\n        {\r\n          UI_Box *anchor_box = ui_box_from_key(ws->autocomp_regs->ui_key);\r\n          callee_helper_pos.x = anchor_box->rect.x0;\r\n          callee_helper_pos.y = anchor_box->rect.y1;\r\n        }\r\n        F32 height_px_target = row_height_px*1.f + padding_px*2.f;\r\n        autocomp_callee_helper_height_px = height_px_target * open_t;\r\n        \r\n        //- rjf: build top-level callee helper box\r\n        UI_Box *callee_helper = &ui_nil_box;\r\n        UI_FixedPos(callee_helper_pos)\r\n          UI_Squish(0.1f-0.1f*open_t)\r\n          UI_Transparency(1.f-open_t)\r\n          UI_CornerRadius(ui_top_font_size()*0.25f)\r\n          UI_PrefWidth(ui_children_sum(1))\r\n          UI_PrefHeight(ui_px(height_px_target, 1.f))\r\n        {\r\n          callee_helper = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow|\r\n                                                    UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_SquishAnchored|UI_BoxFlag_Clickable,\r\n                                                    \"top_level_window_callee_helper\");\r\n        }\r\n        \r\n        //- rjf: fill helper\r\n        UI_Parent(callee_helper)\r\n          UI_Padding(ui_px(padding_px, 1.f))\r\n          UI_PrefWidth(ui_children_sum(1))\r\n          UI_HeightFill\r\n          UI_Column\r\n          UI_PrefHeight(ui_px(row_height_px, 1.f))\r\n          UI_Padding(ui_px(padding_px, 1.f))\r\n        {\r\n          // rjf: main name / args text\r\n          UI_Row UI_TextPadding(0) UI_PrefWidth(ui_text_dim(0, 1)) RD_Font(RD_FontSlot_Code)\r\n          {\r\n            Vec4F32 code_default = ui_color_from_name(str8_lit(\"code_default\"));\r\n            String8 opener = push_str8f(scratch.arena, \"%S(\", type->name);\r\n            rd_code_label(1, 0, code_default, opener);\r\n            MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, type->name);\r\n            B32 first = 1;\r\n            UI_TagF(\".\") for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)\r\n            {\r\n              for MD_EachNode(child, n->v->first)\r\n              {\r\n                if(md_node_has_tag(child, str8_lit(\"no_callee_helper\"), 0))\r\n                {\r\n                  continue;\r\n                }\r\n                if(!first)\r\n                {\r\n                  rd_code_label(1, 0, code_default, str8_lit(\", \"));\r\n                }\r\n                first = 0;\r\n                UI_Key arg_key = ui_key_from_stringf(ui_active_seed_key(), \"###arg_%p\", child);\r\n                DR_FStrList arg_fstrs = rd_fstrs_from_code_string(scratch.arena, 1.f, 0, code_default, child->string);\r\n                if(child == ws->autocomp_cursor_info.arg_schema)\r\n                {\r\n                  ui_set_next_flags(UI_BoxFlag_DrawSideBottom);\r\n                  ui_set_next_tag(str8_lit(\"good_pop\"));\r\n                }\r\n                UI_Box *arg_box = ui_build_box_from_key(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects, arg_key);\r\n                ui_box_equip_display_fstrs(arg_box, &arg_fstrs);\r\n                UI_Signal arg_sig = ui_signal_from_box(arg_box);\r\n                if(ui_hovering(arg_sig))\r\n                {\r\n                  String8 display_name = md_tag_from_string(child, str8_lit(\"display_name\"), 0)->first->string;\r\n                  String8 desc = md_tag_from_string(child, str8_lit(\"description\"), 0)->first->string;\r\n                  if(desc.size != 0)\r\n                    UI_Tooltip RD_Font(RD_FontSlot_Main)\r\n                  {\r\n                    ui_state->tooltip_anchor_key = arg_box->key;\r\n                    UI_Row\r\n                    {\r\n                      RD_Font(RD_FontSlot_Code) ui_label(child->string);\r\n                      if(display_name.size != 0)\r\n                      {\r\n                        ui_spacer(ui_em(0.5f, 1.f));\r\n                        UI_TagF(\"weak\") ui_label(display_name);\r\n                      }\r\n                    }\r\n                    UI_TagF(\"weak\") ui_label(desc);\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            rd_code_label(1, 0, code_default, str8_lit(\")\"));\r\n          }\r\n        }\r\n        \r\n        //- rjf: fall-through interactions with helper\r\n        UI_Signal sig = ui_signal_from_box(callee_helper);\r\n        (void)sig;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part gather all tasks to build floating views\r\n    //\r\n    typedef struct FloatingViewTask FloatingViewTask;\r\n    struct FloatingViewTask\r\n    {\r\n      FloatingViewTask *next;\r\n      CFG_Node *view;\r\n      RD_Regs *regs;\r\n      Rng2F32 rect;\r\n      B32 is_focused;\r\n      B32 is_anchored;\r\n      B32 force_inside_window_x;\r\n      B32 force_inside_window_y;\r\n      B32 only_secondary_navigation;\r\n      B32 reset_open;\r\n      UI_Signal signal; // NOTE(rjf): output, from build\r\n      B32 pressed;\r\n      B32 pressed_outside;\r\n    };\r\n    FloatingViewTask *autocomp_floating_view_task = 0;\r\n    FloatingViewTask *hover_eval_floating_view_task = 0;\r\n    FloatingViewTask *query_floating_view_task = 0;\r\n    FloatingViewTask *first_floating_view_task = 0;\r\n    FloatingViewTask *last_floating_view_task = 0;\r\n    RD_Font(RD_FontSlot_Code)\r\n    {\r\n      //- rjf: add autocompletion view task\r\n      if(ws->autocomp_regs != 0 && ws->autocomp_last_frame_index+1 >= rd_state->frame_index)\r\n      {\r\n        // rjf: build view\r\n        CFG_Node *root = rd_immediate_cfg_from_keyf(\"autocomp_view_%I64x\", window->id);\r\n        CFG_Node *view = cfg_node_child_from_string_or_alloc(rd_state->cfg, root, str8_lit(\"watch\"));\r\n        cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"autocomplete\"));\r\n        CFG_Node *query = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"query\"));\r\n        CFG_Node *input = cfg_node_child_from_string_or_alloc(rd_state->cfg, query, str8_lit(\"input\"));\r\n        cfg_node_new_replace(rd_state->cfg, input, ws->autocomp_cursor_info.filter);\r\n        CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"expression\"));\r\n        cfg_node_new_replace(rd_state->cfg, expr, ws->autocomp_cursor_info.list_expr);\r\n        \r\n        // rjf: determine container size\r\n        EV_BlockTree predicted_block_tree = {0};\r\n        RD_RegsScope(.view = view->id, .tab = 0)\r\n        {\r\n          String8 expr = rd_expr_from_cfg(view);\r\n          E_Eval list_eval = e_eval_from_string(expr);\r\n          ev_key_set_expansion(rd_view_eval_view(), ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);\r\n          predicted_block_tree = ev_block_tree_from_eval(scratch.arena, rd_view_eval_view(), rd_view_query_input(), list_eval);\r\n        }\r\n        F32 row_height_px = ui_top_px_height();\r\n        U64 max_row_count = (U64)floor_f32(ui_top_font_size()*30.f / row_height_px);\r\n        U64 needed_row_count = Min(max_row_count, predicted_block_tree.total_row_count - 1);\r\n        F32 width_px = floor_f32(30.f*ui_top_font_size());\r\n        F32 height_px = needed_row_count*row_height_px;\r\n        \r\n        // rjf: determine list top-level rect\r\n        Rng2F32 rect = r2f32p(0, 0, 0, 0);\r\n        if(!ui_key_match(ui_key_zero(), ws->autocomp_regs->ui_key))\r\n        {\r\n          UI_Box *anchor_box = ui_box_from_key(ws->autocomp_regs->ui_key);\r\n          rect.x0 = anchor_box->rect.x0;\r\n          rect.y0 = anchor_box->rect.y1 + autocomp_callee_helper_height_px;\r\n          rect.x1 = rect.x0 + width_px;\r\n          rect.y1 = rect.y0 + height_px;\r\n        }\r\n        \r\n        // rjf: push task\r\n        if(predicted_block_tree.total_row_count > 1)\r\n        {\r\n          FloatingViewTask *t = push_array(scratch.arena, FloatingViewTask, 1);\r\n          SLLQueuePush(first_floating_view_task, last_floating_view_task, t);\r\n          autocomp_floating_view_task = t;\r\n          t->view          = view;\r\n          t->rect          = rect;\r\n          t->is_focused    = 1;\r\n          t->is_anchored   = 1;\r\n          t->only_secondary_navigation = 1;\r\n        }\r\n      }\r\n      \r\n      //- rjf: try to add hover eval\r\n      {\r\n        B32 build_hover_eval = (hover_eval_is_open && !rd_drag_is_active());\r\n        \r\n        // rjf: disable hover eval if hovered view is actively scrolling\r\n        if(hover_eval_is_open)\r\n        {\r\n          for(CFG_PanelNode *panel = panel_tree.root;\r\n              panel != &cfg_nil_panel_node;\r\n              panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n          {\r\n            if(panel->first != &cfg_nil_panel_node) { continue; }\r\n            CFG_Node *tab = panel->selected_tab;\r\n            if(tab != &cfg_nil_node)\r\n            {\r\n              RD_ViewState *vs = rd_view_state_from_cfg(tab);\r\n              Rng2F32 panel_rect = cfg_target_rect_from_panel_node(content_rect, panel_tree.root, panel);\r\n              if(contains_2f32(panel_rect, ui_mouse()) &&\r\n                 (abs_f32(vs->scroll_pos.x.off) > 0.01f ||\r\n                  abs_f32(vs->scroll_pos.y.off) > 0.01f))\r\n              {\r\n                build_hover_eval = 0;\r\n                ws->hover_eval_firstt_us = rd_state->time_in_us;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: choose hover evaluation expression\r\n        String8 hover_eval_expr = ws->hover_eval_string;\r\n        \r\n        // rjf: evaluate hover evaluation expression, & determine if it evaluates\r\n        // such that we want to build a hover eval.\r\n        E_Eval hover_eval = e_eval_from_string(hover_eval_expr);\r\n        {\r\n          if(hover_eval.msgs.max_kind > E_MsgKind_Null)\r\n          {\r\n            build_hover_eval = 0;\r\n          }\r\n          else if(hover_eval.space.kind == RD_EvalSpaceKind_MetaCfg &&\r\n                  rd_cfg_from_eval_space(hover_eval.space) == &cfg_nil_node)\r\n          {\r\n            build_hover_eval = 0;\r\n          }\r\n          else if((hover_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||\r\n                   hover_eval.space.kind == CTRL_EvalSpaceKind_Entity) &&\r\n                  rd_ctrl_entity_from_eval_space(hover_eval.space) == &ctrl_entity_nil)\r\n          {\r\n            build_hover_eval = 0;\r\n          }\r\n        }\r\n        \r\n        // rjf: request frames if we're waiting to open\r\n        if(ws->hover_eval_string.size != 0 &&\r\n           !hover_eval_is_open &&\r\n           ws->hover_eval_lastt_us < ws->hover_eval_firstt_us+hover_eval_open_delay_us &&\r\n           rd_state->time_in_us - ws->hover_eval_lastt_us < hover_eval_open_delay_us*2)\r\n        {\r\n          rd_request_frame();\r\n        }\r\n        \r\n        // rjf: build hover eval task\r\n        if(build_hover_eval)\r\n        {\r\n          // rjf: determine if we have a top-level visualizer\r\n          EV_ExpandRule *expand_rule = ev_expand_rule_from_type_key(hover_eval.irtree.type_key);\r\n          RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(expand_rule->string);\r\n          \r\n          // rjf: build view\r\n          CFG_Node *root = rd_immediate_cfg_from_keyf(\"hover_eval_view_%I64x\", ws->cfg_id);\r\n          CFG_Node *view = rd_view_from_eval(root, hover_eval);\r\n          cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"explicit_root\"));\r\n          \r\n          // rjf: determine size of hover evaluation container\r\n          EV_BlockTree predicted_block_tree = {0};\r\n          RD_RegsScope(.view = view->id, .tab = 0)\r\n          {\r\n            ev_key_set_expansion(rd_view_eval_view(), ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);\r\n            predicted_block_tree = ev_block_tree_from_eval(scratch.arena, rd_view_eval_view(), str8_zero(), hover_eval);\r\n          }\r\n          F32 row_height_px = floor_f32(ui_top_font_size()*rd_setting_f32_from_name(str8_lit(\"row_height\")));\r\n          U64 max_row_count = 12;\r\n          U64 needed_row_count = Min(max_row_count, predicted_block_tree.total_row_count);\r\n          F32 width_px = floor_f32(70.f*ui_top_font_size());\r\n          F32 height_px = needed_row_count*row_height_px;\r\n          \r\n          // rjf: if arbitrary visualizer, pick catchall size\r\n          if(view_ui_rule != &rd_nil_view_ui_rule)\r\n          {\r\n            height_px = floor_f32(40.f*ui_top_font_size());\r\n          }\r\n          \r\n          // rjf: determine hover eval top-level rect\r\n          Rng2F32 rect = r2f32p(ws->hover_eval_spawn_pos.x,\r\n                                ws->hover_eval_spawn_pos.y,\r\n                                ws->hover_eval_spawn_pos.x + width_px,\r\n                                ws->hover_eval_spawn_pos.y + height_px);\r\n          \r\n          // rjf: push hover eval task\r\n          {\r\n            FloatingViewTask *t = push_array(scratch.arena, FloatingViewTask, 1);\r\n            SLLQueuePush(first_floating_view_task, last_floating_view_task, t);\r\n            hover_eval_floating_view_task = t;\r\n            t->view          = view;\r\n            t->rect          = rect;\r\n            t->is_focused    = ws->hover_eval_focused;\r\n            t->is_anchored   = 1;\r\n            t->force_inside_window_x = 1;\r\n          }\r\n        }\r\n        \r\n        // rjf: reset focus state if hover eval is not being built\r\n        if(!build_hover_eval || ws->hover_eval_string.size == 0 || !hover_eval_is_open)\r\n        {\r\n          ws->hover_eval_focused = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: force-close query, if it's anchored, but box is gone\r\n      if(query_is_open)\r\n      {\r\n        UI_Box *box = ui_box_from_key(ws->query_regs->ui_key);\r\n        if(!ui_key_match(ui_key_zero(), ws->query_regs->ui_key) && ui_box_is_nil(box))\r\n        {\r\n          query_is_open = 0;\r\n          rd_cmd(RD_CmdKind_CancelQuery);\r\n        }\r\n      }\r\n      \r\n      //- rjf: force-close query, if it has an expression, but that expression does not evaluate\r\n      if(query_is_open)\r\n      {\r\n        String8 expr = ws->query_regs->expr;\r\n        E_Eval eval = e_eval_from_string(expr);\r\n        if(eval.msgs.max_kind > E_MsgKind_Null)\r\n        {\r\n          query_is_open = 0;\r\n          rd_cmd(RD_CmdKind_CancelQuery);\r\n        }\r\n        else if(eval.space.kind == RD_EvalSpaceKind_MetaCfg &&\r\n                rd_cfg_from_eval_space(eval.space) == &cfg_nil_node)\r\n        {\r\n          query_is_open = 0;\r\n          rd_cmd(RD_CmdKind_CancelQuery);\r\n        }\r\n        else if((eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||\r\n                 eval.space.kind == CTRL_EvalSpaceKind_Entity) &&\r\n                rd_ctrl_entity_from_eval_space(eval.space) == &ctrl_entity_nil)\r\n        {\r\n          query_is_open = 0;\r\n          rd_cmd(RD_CmdKind_CancelQuery);\r\n        }\r\n      }\r\n      \r\n      //- rjf: try to add opened query\r\n      if(query_is_open)\r\n      {\r\n        // rjf: unpack view for query\r\n        CFG_Node *root = rd_immediate_cfg_from_keyf(\"window_query_%p\", window);\r\n        CFG_Node *view = cfg_node_child_from_string_or_alloc(rd_state->cfg, root, str8_lit(\"watch\"));\r\n        CFG_Node *query = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"query\"));\r\n        B32 is_lister = (cfg_node_child_from_string(view, str8_lit(\"lister\")) != &cfg_nil_node);\r\n        B32 root_is_explicit = (cfg_node_child_from_string(view, str8_lit(\"explicit_root\")) != &cfg_nil_node);\r\n        RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n        \r\n        // rjf: did this view ID change? -> reset open animation\r\n        B32 reset_open = 0;\r\n        if(view->id != ws->query_last_view_id)\r\n        {\r\n          ws->query_last_view_id = view->id;\r\n          reset_open = 1;\r\n        }\r\n        \r\n        // rjf: unpack query info\r\n        String8 cmd_name = ws->query_regs->cmd_name;\r\n        RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n        String8 query_expr = ws->query_regs->expr;\r\n        if(query_expr.size == 0 && cmd_name.size != 0)\r\n        {\r\n          query_expr = cmd_kind_info->query.expr;\r\n        }\r\n        B32 query_is_anchored = (!ui_box_is_nil(ui_box_from_key(ws->query_regs->ui_key)));\r\n        B32 size_query_by_expr_eval = (query_is_anchored || query_expr.size == 0);\r\n        \r\n        // rjf: compute query expression\r\n        if(query_expr.size == 0)\r\n        {\r\n          query_expr = str8(vs->query_buffer, vs->query_string_size);\r\n        }\r\n        else\r\n        {\r\n          U64 input_insertion_pos = str8_find_needle(query_expr, 0, str8_lit(\"$input\"), 0);\r\n          if(input_insertion_pos < query_expr.size)\r\n          {\r\n            String8 pre_insertion  = str8_prefix(query_expr, input_insertion_pos);\r\n            String8 post_insertion = str8_skip(query_expr, input_insertion_pos + 6);\r\n            String8 input_text = str8(vs->query_buffer, vs->query_string_size);\r\n            String8 input_text__escaped = escaped_from_raw_str8(scratch.arena, input_text);\r\n            // TODO(rjf): @hack need to escape because this is putting the user's input\r\n            // into a containing \"folder:\"...\"\" in all cases. but this is kinda shady\r\n            // and should be replaced long-term with something more solid...\r\n            query_expr = push_str8f(scratch.arena, \"%S%S%S\", pre_insertion, input_text__escaped, post_insertion);\r\n          }\r\n        }\r\n        \r\n        // rjf: store expression\r\n        CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"expression\"));\r\n        cfg_node_new_replace(rd_state->cfg, expr, query_expr);\r\n        \r\n        // rjf: evaluate query expression\r\n        E_Eval query_eval = e_eval_from_string(query_expr);\r\n        \r\n        // rjf: determine & store row-height setting\r\n        if(ws->query_regs->do_big_rows)\r\n        {\r\n          F32 row_height = 5.f;\r\n          F32 row_height_px = row_height * ui_top_font_size();\r\n          CFG_Node *row_height_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"row_height\"));\r\n          cfg_node_new_replacef(rd_state->cfg, row_height_root, \"%f\", row_height);\r\n        }\r\n        \r\n        // rjf: compute query view's top-level rectangle\r\n        Rng2F32 rect = {0};\r\n        RD_RegsScope(.view = view->id, .tab = 0)\r\n        {\r\n          F32 row_height_px = ui_top_font_size() * rd_setting_f32_from_name(str8_lit(\"row_height\"));\r\n          Vec2F32 content_rect_center = center_2f32(content_rect);\r\n          Vec2F32 content_rect_dim = dim_2f32(content_rect);\r\n          ev_key_set_expansion(rd_view_eval_view(), ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);\r\n          EV_BlockTree predicted_block_tree = ev_block_tree_from_eval(scratch.arena, rd_view_eval_view(), rd_view_query_input(), query_eval);\r\n          F32 query_width_px = floor_f32(content_rect_dim.x * 0.35f);\r\n          F32 max_query_height_px = content_rect_dim.y*0.8f;\r\n          F32 query_height_px = max_query_height_px;\r\n          if(size_query_by_expr_eval)\r\n          {\r\n            F32 search_row_open_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"search_row_open_%p\", view),\r\n                                            (F32)!!vs->query_is_open,\r\n                                            .initial = (F32)!!vs->query_is_open,\r\n                                            .epsilon = 0.01f,\r\n                                            .rate    = rd_state->menu_animation_rate);\r\n            query_height_px = row_height_px * (predicted_block_tree.total_row_count - !root_is_explicit) + ui_top_px_height()*search_row_open_t;\r\n            query_height_px = Min(query_height_px, max_query_height_px);\r\n          }\r\n          rect = r2f32p(content_rect_center.x - query_width_px/2,\r\n                        content_rect_center.y - max_query_height_px/2.f,\r\n                        content_rect_center.x + query_width_px/2,\r\n                        content_rect_center.y - max_query_height_px/2.f + query_height_px);\r\n          if(!ui_key_match(ui_key_zero(), ws->query_regs->ui_key))\r\n          {\r\n            UI_Box *anchor_box = ui_box_from_key(ws->query_regs->ui_key);\r\n            if(anchor_box != &ui_nil_box)\r\n            {\r\n              rect.x0 = anchor_box->rect.x0 + ws->query_regs->off_px.x;\r\n              rect.y0 = anchor_box->rect.y1 + ws->query_regs->off_px.y;\r\n              rect.x1 = rect.x0 + ui_top_font_size()*60.f;\r\n              rect.y1 = rect.y0 + query_height_px;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: push query task\r\n        {\r\n          FloatingViewTask *t = push_array(scratch.arena, FloatingViewTask, 1);\r\n          SLLQueuePush(first_floating_view_task, last_floating_view_task, t);\r\n          query_floating_view_task = t;\r\n          t->view          = view;\r\n          t->regs          = ws->query_regs;\r\n          t->rect          = rect;\r\n          t->is_focused    = 1;\r\n          t->is_anchored   = query_is_anchored;\r\n          t->reset_open    = reset_open;\r\n          t->force_inside_window_x = 1;\r\n          t->force_inside_window_y = 1;\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part build all floating views\r\n    //\r\n    ProfScope(\"build all floating views\")\r\n      RD_Font(RD_FontSlot_Code)\r\n      UI_TagF(\"floating\")\r\n      UI_Focus(ui_any_ctx_menu_is_open() || ws->menu_bar_focused ? UI_FocusKind_Off : UI_FocusKind_Null)\r\n    {\r\n      F32 fast_open_rate = rd_state->menu_animation_rate;\r\n      F32 slow_open_rate = rd_state->menu_animation_rate__slow;\r\n      for(FloatingViewTask *t = first_floating_view_task; t != 0; t = t->next)\r\n      {\r\n        // rjf: unpack\r\n        CFG_Node *view      = t->view;    \r\n        Rng2F32 rect      = t->rect;\r\n        B32 is_focused    = t->is_focused;\r\n        B32 is_anchored   = t->is_anchored;\r\n        B32 only_secondary_navigation = t->only_secondary_navigation;\r\n        F32 open_t        = ui_anim(ui_key_from_stringf(ui_key_zero(), \"floating_view_open_%p\", view), 1.f,\r\n                                    .rate = is_anchored ? fast_open_rate : slow_open_rate,\r\n                                    .reset = t->reset_open,\r\n                                    .initial = 0.f);\r\n        \r\n        // rjf: force rect inside window if needed\r\n        if(t->force_inside_window_x || t->force_inside_window_y)\r\n        {\r\n          B32 axis_mask[] = {t->force_inside_window_x, t->force_inside_window_y};\r\n          Rng2F32 window_rect = os_client_rect_from_window(ws->os);\r\n          for EachEnumVal(Axis2, axis)\r\n          {\r\n            if(!axis_mask[axis]) { continue; }\r\n            F32 max_delta = rect.p1.v[axis] - window_rect.p1.v[axis];\r\n            F32 min_delta = window_rect.p0.v[axis] - rect.p0.v[axis];\r\n            F32 total_delta = Max(min_delta, 0) - Max(max_delta, 0);\r\n            rect.p0.v[axis] += total_delta;\r\n            rect.p1.v[axis] += total_delta;\r\n          }\r\n        }\r\n        \r\n        // rjf: push view regs\r\n        rd_push_regs();\r\n        {\r\n          if(t->regs != 0)\r\n          {\r\n            rd_regs()->cfg = t->regs->cfg;\r\n          }\r\n          rd_regs()->view = view->id;\r\n          String8 view_expr = rd_expr_from_cfg(view);\r\n          String8 view_file_path = rd_file_path_from_eval_string(rd_frame_arena(), view_expr);\r\n          // NOTE(rjf): we want to only fill out this view's file path slot if it\r\n          // evaluates one - this way, a view can use the slot to know the selected\r\n          // file path (if there is one). this is useful when pushing commandas which\r\n          // apply to a cursor, for example.\r\n          if(view_file_path.size != 0)\r\n          {\r\n            rd_regs()->file_path = view_file_path;\r\n          }\r\n        }\r\n        \r\n        // rjf: build\r\n        UI_Focus(is_focused ? UI_FocusKind_On : UI_FocusKind_Off)\r\n          UI_PermissionFlags(only_secondary_navigation ?\r\n                             UI_PermissionFlag_KeyboardSecondary|UI_PermissionFlag_Clicks|UI_PermissionFlag_ScrollX|UI_PermissionFlag_ScrollY :\r\n                             UI_PermissionFlag_All)\r\n        {\r\n          // rjf: build top-level container box\r\n          UI_Box *container = &ui_nil_box;\r\n          UI_Rect(rect) UI_ChildLayoutAxis(Axis2_Y)\r\n            UI_Squish(0.1f-0.1f*open_t)\r\n            UI_Transparency(1.f-open_t)\r\n            UI_CornerRadius(ui_top_font_size()*0.25f)\r\n          {\r\n            container = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                  UI_BoxFlag_DrawBorder|\r\n                                                  UI_BoxFlag_DrawBackground|\r\n                                                  UI_BoxFlag_DrawBackgroundBlur|\r\n                                                  UI_BoxFlag_RoundChildrenByParent|\r\n                                                  UI_BoxFlag_DisableFocusOverlay|\r\n                                                  UI_BoxFlag_DrawDropShadow|\r\n                                                  (UI_BoxFlag_SquishAnchored*!!is_anchored),\r\n                                                  \"floating_view_container_%p\", view);\r\n          }\r\n          \r\n          // rjf: peek press inside/outside events\r\n          {\r\n            for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n            {\r\n              if(evt->kind == UI_EventKind_Press &&\r\n                 evt->key == OS_Key_LeftMouseButton)\r\n              {\r\n                if(contains_2f32(container->rect, evt->pos))\r\n                {\r\n                  t->pressed = 1;\r\n                }\r\n                else\r\n                {\r\n                  t->pressed_outside = 1;\r\n                }\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: build overlay container for loading animation\r\n          UI_Box *loading_overlay_container = &ui_nil_box;\r\n          UI_Parent(container) UI_WidthFill UI_HeightFill\r\n          {\r\n            loading_overlay_container = ui_build_box_from_key(UI_BoxFlag_Floating, ui_key_zero());\r\n          }\r\n          \r\n          // rjf: build contents\r\n          UI_Parent(container) UI_Focus(is_focused ? UI_FocusKind_Null : UI_FocusKind_Off)\r\n          {\r\n            ui_set_next_pref_width(ui_pct(1, 0));\r\n            ui_set_next_pref_height(ui_pct(1, 0));\r\n            ui_set_next_child_layout_axis(Axis2_Y);\r\n            UI_Box *view_contents_container = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clip, \"###view_contents_container\");\r\n            UI_Parent(view_contents_container) UI_WidthFill\r\n            {\r\n              rd_view_ui(rect);\r\n            }\r\n          }\r\n          \r\n          // rjf: build loading overlay\r\n          {\r\n            RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n            F32 loading_t = vs->loading_t;\r\n            if(loading_t > 0.01f) UI_Parent(loading_overlay_container)\r\n            {\r\n              rd_loading_overlay(rect, loading_t, vs->loading_progress_v, vs->loading_progress_v_target);\r\n            }\r\n          }\r\n          \r\n          // rjf: interact with container\r\n          UI_Signal sig = ui_signal_from_box(container);\r\n          t->signal = sig;\r\n        }\r\n        \r\n        // rjf: pop interaction registers; commit if this is focused\r\n        RD_Regs *view_regs = rd_pop_regs();\r\n        if(is_focused)\r\n        {\r\n          MemoryCopyStruct(rd_regs(), view_regs);\r\n        }\r\n        \r\n        // rjf: is not anchored? -> darken rest of screen\r\n        if(!is_anchored)\r\n        {\r\n          UI_TagF(\"inactive\") UI_Transparency(1-open_t) UI_Rect(content_rect) ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_Floating, ui_key_zero());\r\n        }\r\n        \r\n        //- rjf: autocompletion view early-closing rules\r\n        if(t == autocomp_floating_view_task)\r\n        {\r\n          B32 has_autocomplete_hint = ui_autocomplete_string().size != 0;\r\n          B32 has_accept_operation = 0;\r\n          for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n          {\r\n            if(evt->kind == UI_EventKind_Press && evt->slot == UI_EventActionSlot_Accept)\r\n            {\r\n              has_accept_operation = 1;\r\n              break;\r\n            }\r\n          }\r\n          if(has_autocomplete_hint && has_accept_operation)\r\n          {\r\n            autocomp_floating_view_task->signal.box->fixed_position = v2f32(10000, 10000);\r\n          }\r\n        }\r\n        \r\n        //- rjf: hover eval focus rules\r\n        if(t == hover_eval_floating_view_task)\r\n        {\r\n          UI_Signal sig = hover_eval_floating_view_task->signal;\r\n          if(ui_pressed(sig) || hover_eval_floating_view_task->pressed)\r\n          {\r\n            ws->hover_eval_focused = 1;\r\n          }\r\n          if(ui_mouse_over(sig) || ws->hover_eval_focused)\r\n          {\r\n            ws->hover_eval_lastt_us = rd_state->time_in_us;\r\n          }\r\n          else if(ws->hover_eval_lastt_us+1000000 < rd_state->time_in_us)\r\n          {\r\n            rd_request_frame();\r\n          }\r\n          if(hover_eval_floating_view_task->pressed_outside || ui_slot_press(UI_EventActionSlot_Cancel))\r\n          {\r\n            ws->hover_eval_focused = 0;\r\n            MemoryZeroStruct(&ws->hover_eval_string);\r\n            arena_clear(ws->hover_eval_arena);\r\n            rd_request_frame();\r\n          }\r\n        }\r\n        \r\n        //- rjf: query interactions\r\n        if(t == query_floating_view_task)\r\n        {\r\n          CFG_Node *view = query_floating_view_task->view;\r\n          RD_ViewState *vs = rd_view_state_from_cfg(query_floating_view_task->view);\r\n          String8 cmd_name = ws->query_regs->cmd_name;\r\n          RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n          \r\n          // rjf: close queries\r\n          if(query_floating_view_task->pressed_outside ||\r\n             (cfg_node_child_from_string(view, str8_lit(\"lister\")) != &cfg_nil_node && !vs->query_is_open) ||\r\n             (cmd_name.size != 0 && !vs->query_is_open) ||\r\n             ui_slot_press(UI_EventActionSlot_Cancel))\r\n          {\r\n            rd_cmd(RD_CmdKind_CancelQuery);\r\n          }\r\n          \r\n          // rjf: any queries which take a file path mutate the debugger's \"current path\"\r\n          if(cmd_kind_info->query.slot == RD_RegSlot_FilePath)\r\n          {\r\n            CFG_Node *query = cfg_node_child_from_string(view, str8_lit(\"query\"));\r\n            CFG_Node *input = cfg_node_child_from_string(query, str8_lit(\"input\"));\r\n            if(input != &cfg_nil_node)\r\n            {\r\n              String8 path_chopped = str8_chop_last_slash(input->first->string);\r\n              CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n              CFG_Node *current_path = cfg_node_child_from_string_or_alloc(rd_state->cfg, user, str8_lit(\"current_path\"));\r\n              if(!str8_match(current_path->first->string, path_chopped, 0))\r\n              {\r\n                rd_cmd(RD_CmdKind_SetCurrentPath, .file_path = path_chopped);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part top bar\r\n    //\r\n    ProfScope(\"build top bar\")\r\n    {\r\n      os_window_clear_custom_border_data(ws->os);\r\n      os_window_push_custom_edges(ws->os, window_edge_px);\r\n      os_window_push_custom_title_bar(ws->os, dim_2f32(top_bar_rect).y);\r\n      ui_set_next_flags(UI_BoxFlag_DefaultFocusNav|UI_BoxFlag_DisableFocusOverlay);\r\n      UI_Focus((ws->menu_bar_focused && window_is_focused && !ui_any_ctx_menu_is_open()) ? UI_FocusKind_On : UI_FocusKind_Null)\r\n        UI_TagF(\"menu_bar\")\r\n        UI_Pane(top_bar_rect, str8_lit(\"###top_bar\"))\r\n        UI_WidthFill UI_Row\r\n        UI_Focus(UI_FocusKind_Null)\r\n      {\r\n        UI_Key menu_bar_group_key = ui_key_from_string(ui_key_zero(), str8_lit(\"###top_bar_group\"));\r\n        MemoryZeroArray(ui_top_parent()->parent->corner_radii);\r\n        \r\n        //- rjf: left column\r\n        {\r\n          ui_set_next_flags(UI_BoxFlag_Clip|UI_BoxFlag_ViewScrollX|UI_BoxFlag_ViewClamp);\r\n          UI_WidthFill UI_NamedRow(str8_lit(\"###menu_bar\"))\r\n          {\r\n            //- rjf: icon\r\n            UI_Padding(ui_em(0.5f, 1.f))\r\n            {\r\n              UI_PrefWidth(ui_px(dim_2f32(top_bar_rect).y - ui_top_font_size()*0.8f, 1.f))\r\n                UI_Column\r\n                UI_Padding(ui_em(0.4f, 1.f))\r\n                UI_HeightFill\r\n              {\r\n                R_Handle texture = rd_state->icon_texture;\r\n                Vec2S32 texture_dim = r_size_from_tex2d(texture);\r\n                ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit(\"\"));\r\n              }\r\n            }\r\n            \r\n            //- rjf: menu items\r\n            if(dim_2f32(top_bar_rect).x > ui_top_font_size()*60)\r\n            {\r\n              ui_set_next_flags(UI_BoxFlag_DrawBackground);\r\n              UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(20, 1)) UI_GroupKey(menu_bar_group_key)\r\n              {\r\n                // rjf: file menu\r\n                UI_Key file_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_file_menu_key_\"));\r\n                UI_CtxMenu(file_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  String8 cmds[] =\r\n                  {\r\n                    rd_cmd_kind_info_table[RD_CmdKind_Open].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_Switch].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NewUser].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_SaveUser].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_UserSettings].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NewProject].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_OpenRecentProject].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_SaveProject].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_ProjectSettings].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_Exit].string,\r\n                  };\r\n                  U32 codepoints[] =\r\n                  {\r\n                    'o',\r\n                    'i',\r\n                    0,//-\r\n                    'w',\r\n                    'u',\r\n                    's',\r\n                    'e',\r\n                    0,//-\r\n                    'j',\r\n                    'p',\r\n                    'r',\r\n                    'a',\r\n                    't',\r\n                    0,//-\r\n                    'x',\r\n                  };\r\n                  Assert(ArrayCount(codepoints) == ArrayCount(cmds));\r\n                  rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints);\r\n                }\r\n                \r\n                // rjf: window menu\r\n                UI_Key window_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_window_menu_key_\"));\r\n                UI_CtxMenu(window_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  String8 cmds[] =\r\n                  {\r\n                    rd_cmd_kind_info_table[RD_CmdKind_OpenWindow].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_CloseWindow].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_ToggleFullscreen].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_WindowSettings].string,\r\n                  };\r\n                  U32 codepoints[] =\r\n                  {\r\n                    'w',\r\n                    'c',\r\n                    'f',\r\n                    0,//-\r\n                    's',\r\n                  };\r\n                  Assert(ArrayCount(codepoints) == ArrayCount(cmds));\r\n                  rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints);\r\n                }\r\n                \r\n                // rjf: panel menu\r\n                UI_Key panel_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_panel_menu_key_\"));\r\n                UI_CtxMenu(panel_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  String8 cmds[] =\r\n                  {\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NewPanelUp].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NewPanelDown].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NewPanelRight].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NewPanelLeft].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_ClosePanel].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NextPanel].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_PrevPanel].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_TabBarTop].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_TabBarBottom].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_ResetToDefaultPanels].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_ResetToCompactPanels].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_ResetToSimplePanels].string,\r\n                  };\r\n                  U32 codepoints[] =\r\n                  {\r\n                    'u',\r\n                    'd',\r\n                    'r',\r\n                    'l',\r\n                    'o',\r\n                    0,//-\r\n                    'n',\r\n                    'p',\r\n                    0,//-\r\n                    0,\r\n                    0,\r\n                    0,//-\r\n                    0,\r\n                    0,\r\n                    0,\r\n                  };\r\n                  Assert(ArrayCount(codepoints) == ArrayCount(cmds));\r\n                  rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints);\r\n                }\r\n                \r\n                // rjf: view menu\r\n                UI_Key tab_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_tab_menu_key_\"));\r\n                UI_CtxMenu(tab_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  String8 cmds[] =\r\n                  {\r\n                    rd_cmd_kind_info_table[RD_CmdKind_OpenTab].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_CloseTab].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_DuplicateTab].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_MoveTabLeft].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_MoveTabRight].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_NextTab].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_PrevTab].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[RD_CmdKind_TabSettings].string,\r\n                  };\r\n                  U32 codepoints[] =\r\n                  {\r\n                    'o',\r\n                    'c',\r\n                    'd',\r\n                    0,//-\r\n                    'l',\r\n                    'r',\r\n                    0,//-\r\n                    'n',\r\n                    'p',\r\n                    0,//-\r\n                    's',\r\n                  };\r\n                  Assert(ArrayCount(codepoints) == ArrayCount(cmds));\r\n                  rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints);\r\n                }\r\n                \r\n                // rjf: targets menu\r\n                UI_Key targets_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_targets_menu_key_\"));\r\n                UI_CtxMenu(targets_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  Temp scratch = scratch_begin(0, 0);\r\n                  String8 cmds[] =\r\n                  {\r\n                    rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_LaunchAndRun].string,\r\n                    rd_cmd_kind_info_table[RD_CmdKind_LaunchAndStepInto].string,\r\n                  };\r\n                  U32 codepoints[] =\r\n                  {\r\n                    'a',\r\n                    'r',\r\n                    's',\r\n                  };\r\n                  Assert(ArrayCount(codepoints) == ArrayCount(cmds));\r\n                  rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints);\r\n                  scratch_end(scratch);\r\n                }\r\n                \r\n                // rjf: ctrl menu\r\n                UI_Key ctrl_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_ctrl_menu_key_\"));\r\n                UI_CtxMenu(ctrl_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  String8 cmds[] =\r\n                  {\r\n                    rd_cmd_kind_info_table[D_CmdKind_Run].string,\r\n                    rd_cmd_kind_info_table[D_CmdKind_KillAll].string,\r\n                    rd_cmd_kind_info_table[D_CmdKind_Restart].string,\r\n                    rd_cmd_kind_info_table[D_CmdKind_Halt].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[D_CmdKind_StepInto].string,\r\n                    rd_cmd_kind_info_table[D_CmdKind_StepOver].string,\r\n                    rd_cmd_kind_info_table[D_CmdKind_StepOut].string,\r\n                    {0},//-\r\n                    rd_cmd_kind_info_table[D_CmdKind_Attach].string,\r\n                    rd_cmd_kind_info_table[D_CmdKind_Detach].string,\r\n                  };\r\n                  U32 codepoints[] =\r\n                  {\r\n                    'r',\r\n                    'k',\r\n                    's',\r\n                    'h',\r\n                    0,//-\r\n                    'i',\r\n                    'o',\r\n                    't',\r\n                    0,//-\r\n                    'a',\r\n                    'd',\r\n                  };\r\n                  Assert(ArrayCount(codepoints) == ArrayCount(cmds));\r\n                  rd_cmd_list_menu_buttons(ArrayCount(cmds), cmds, codepoints);\r\n                }\r\n                \r\n                // rjf: help menu\r\n                UI_Key help_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"_help_menu_key_\"));\r\n                UI_CtxMenu(help_menu_key) UI_PrefWidth(ui_em(50.f, 1.f)) UI_TagF(\"implicit\")\r\n                {\r\n                  UI_Row UI_TextAlignment(UI_TextAlign_Center) UI_TagF(\"weak\")\r\n                    ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL));\r\n                  ui_spacer(ui_em(1.f, 1.f));\r\n                  UI_PrefHeight(ui_children_sum(1)) UI_Row UI_Padding(ui_pct(1, 0))\r\n                  {\r\n                    R_Handle texture = rd_state->icon_texture;\r\n                    Vec2S32 texture_dim = r_size_from_tex2d(texture);\r\n                    UI_PrefWidth(ui_px(ui_top_font_size()*10.f, 1.f))\r\n                      UI_PrefHeight(ui_px(ui_top_font_size()*10.f, 1.f))\r\n                      ui_image(texture, R_Tex2DSampleKind_Linear, r2f32p(0, 0, texture_dim.x, texture_dim.y), v4f32(1, 1, 1, 1), 0, str8_lit(\"\"));\r\n                  }\r\n                  ui_spacer(ui_em(1.f, 1.f));\r\n                  CFG_KeyMapNodePtrList key_map_nodes = cfg_key_map_node_ptr_list_from_name(scratch.arena, rd_state->key_map, rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string);\r\n                  CFG_Binding binding = {0};\r\n                  String8 binding_str = {0};\r\n                  if(key_map_nodes.first != 0)\r\n                  {\r\n                    binding = key_map_nodes.first->v->binding;\r\n                    binding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key);\r\n                  }\r\n                  UI_TagF(\".\")\r\n                    UI_Row\r\n                    UI_TextAlignment(UI_TextAlign_Center)\r\n                    UI_Padding(ui_pct(1, 0))\r\n                  {\r\n                    UI_Signal sig = {0};\r\n                    UI_PrefWidth(ui_children_sum(1))\r\n                      UI_Flags(UI_BoxFlag_DrawBorder)\r\n                      UI_CornerRadius(ui_top_font_size()*0.5f)\r\n                      sig = ui_buttonf(\"###open_palette\");\r\n                    UI_Parent(sig.box) UI_PrefWidth(ui_text_dim(ui_top_font_size()*2.f, 1))\r\n                    {\r\n                      ui_labelf(\"Search for commands & settings\");\r\n                      if(binding_str.size != 0)\r\n                      {\r\n                        UI_TagF(\"weak\") ui_labelf(\"(%S)\", binding_str);\r\n                      }\r\n                    }\r\n                    if(ui_clicked(sig))\r\n                    {\r\n                      rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenPalette].string);\r\n                    }\r\n                  }\r\n                  ui_spacer(ui_em(1.f, 1.f));\r\n                  UI_TagF(\"pop\")\r\n                    UI_Row UI_Padding(ui_pct(1, 0)) UI_TextAlignment(UI_TextAlign_Center) UI_PrefWidth(ui_text_dim(ui_top_font_size()*2.f, 1))\r\n                    UI_CornerRadius(ui_top_font_size()*0.5f)\r\n                  {\r\n                    String8 url = str8_lit(\"https://github.com/EpicGamesExt/raddebugger/issues\");\r\n                    UI_Signal sig = ui_button(str8_lit(\"Submit request, issue, or bug report\"));\r\n                    if(ui_clicked(sig))\r\n                    {\r\n                      os_open_in_browser(url);\r\n                    }\r\n                  }\r\n                  ui_spacer(ui_em(0.5f, 1.f));\r\n                }\r\n                \r\n                // rjf: buttons\r\n                UI_TextAlignment(UI_TextAlign_Center) UI_HeightFill\r\n                {\r\n                  // rjf: set up table\r\n                  struct\r\n                  {\r\n                    String8 name;\r\n                    U32 codepoint;\r\n                    OS_Key key;\r\n                    UI_Key menu_key;\r\n                  }\r\n                  items[] =\r\n                  {\r\n                    {str8_lit(\"File\"),     'f', OS_Key_F, file_menu_key},\r\n                    {str8_lit(\"Window\"),   'w', OS_Key_W, window_menu_key},\r\n                    {str8_lit(\"Panel\"),    'p', OS_Key_P, panel_menu_key},\r\n                    {str8_lit(\"Tab\"),      'b', OS_Key_V, tab_menu_key},\r\n                    {str8_lit(\"Targets\"),  't', OS_Key_T, targets_menu_key},\r\n                    {str8_lit(\"Control\"),  'c', OS_Key_C, ctrl_menu_key},\r\n                    {str8_lit(\"Help\"),     'h', OS_Key_H, help_menu_key},\r\n                  };\r\n                  \r\n                  // rjf: determine if one of the menus is already open\r\n                  B32 menu_open = 0;\r\n                  U64 open_menu_idx = 0;\r\n                  for(U64 idx = 0; idx < ArrayCount(items); idx += 1)\r\n                  {\r\n                    if(ui_ctx_menu_is_open(items[idx].menu_key))\r\n                    {\r\n                      menu_open = 1;\r\n                      open_menu_idx = idx;\r\n                      break;\r\n                    }\r\n                  }\r\n                  \r\n                  // rjf: navigate between menus\r\n                  U64 open_menu_idx_prime = open_menu_idx;\r\n                  if(menu_open && ws->menu_bar_focused && window_is_focused)\r\n                  {\r\n                    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n                    {\r\n                      B32 taken = 0;\r\n                      if(evt->delta_2s32.x > 0)\r\n                      {\r\n                        taken = 1;\r\n                        open_menu_idx_prime += 1;\r\n                        open_menu_idx_prime = open_menu_idx_prime%ArrayCount(items);\r\n                      }\r\n                      if(evt->delta_2s32.x < 0)\r\n                      {\r\n                        taken = 1;\r\n                        open_menu_idx_prime = open_menu_idx_prime > 0 ? open_menu_idx_prime-1 : (ArrayCount(items)-1);\r\n                      }\r\n                      if(taken)\r\n                      {\r\n                        ui_eat_event(evt);\r\n                      }\r\n                    }\r\n                  }\r\n                  \r\n                  // rjf: make ui\r\n                  for(U64 idx = 0; idx < ArrayCount(items); idx += 1)\r\n                  {\r\n                    ui_set_next_fastpath_codepoint(items[idx].codepoint);\r\n                    B32 alt_fastpath_key = 0;\r\n                    if(rd_setting_b32_from_name(str8_lit(\"focus_menu_bar_with_alt\")) && ui_key_press(OS_Modifier_Alt, items[idx].key))\r\n                    {\r\n                      alt_fastpath_key = 1;\r\n                    }\r\n                    if((ws->menu_bar_key_held || ws->menu_bar_focused) && !ui_any_ctx_menu_is_open())\r\n                    {\r\n                      ui_set_next_flags(UI_BoxFlag_DrawTextFastpathCodepoint);\r\n                    }\r\n                    UI_Signal sig = rd_menu_bar_button(items[idx].name);\r\n                    os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect);\r\n                    if(menu_open)\r\n                    {\r\n                      if((ui_hovering(sig) && !ui_ctx_menu_is_open(items[idx].menu_key)) || (open_menu_idx_prime == idx && open_menu_idx_prime != open_menu_idx))\r\n                      {\r\n                        ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0));\r\n                      }\r\n                    }\r\n                    else if(ui_pressed(sig) || alt_fastpath_key)\r\n                    {\r\n                      if(ui_ctx_menu_is_open(items[idx].menu_key))\r\n                      {\r\n                        ui_ctx_menu_close();\r\n                      }\r\n                      else\r\n                      {\r\n                        ui_ctx_menu_open(items[idx].menu_key, sig.box->key, v2f32(0, sig.box->rect.y1-sig.box->rect.y0));\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: center column\r\n        if(dim_2f32(top_bar_rect).x > ui_top_font_size()*60)\r\n          UI_PrefWidth(ui_children_sum(1.f)) UI_Row\r\n          UI_PrefWidth(ui_px(dim_2f32(top_bar_rect).y, 1))\r\n          RD_Font(RD_FontSlot_Icons)\r\n          UI_FontSize(ui_top_font_size()*0.85f)\r\n        {\r\n          Temp scratch = scratch_begin(0, 0);\r\n          CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"target\"));\r\n          CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n          B32 can_send_signal = !d_ctrl_targets_running();\r\n          typedef struct CenterButtonTask CenterButtonTask;\r\n          struct CenterButtonTask\r\n          {\r\n            String8 cmd_name;\r\n            String8 tag;\r\n            B32 is_enabled;\r\n          };\r\n          CenterButtonTask center_button_tasks[] =\r\n          {\r\n            {rd_cmd_kind_info_table[RD_CmdKind_Run].string,      str8_lit(\"good\"),    (can_send_signal || d_ctrl_last_run_frame_idx()+4 > d_frame_index())},\r\n            {rd_cmd_kind_info_table[RD_CmdKind_Restart].string,  str8_lit(\"neutral\"), processes.count != 0},\r\n            {rd_cmd_kind_info_table[RD_CmdKind_Halt].string,     str8_lit(\"weak\"),    !can_send_signal},\r\n            {rd_cmd_kind_info_table[RD_CmdKind_KillAll].string,  str8_lit(\"bad\"),     processes.count != 0},\r\n            {rd_cmd_kind_info_table[RD_CmdKind_StepOver].string, str8_lit(\"weak\"),    can_send_signal},\r\n            {rd_cmd_kind_info_table[RD_CmdKind_StepInto].string, str8_lit(\"weak\"),    can_send_signal},\r\n            {rd_cmd_kind_info_table[RD_CmdKind_StepOut].string,  str8_lit(\"weak\"),    processes.count != 0 && can_send_signal},\r\n          };\r\n          UI_TextAlignment(UI_TextAlign_Center)\r\n            for EachElement(idx, center_button_tasks)\r\n            UI_Flags(center_button_tasks[idx].is_enabled ? 0 : UI_BoxFlag_Disabled)\r\n            UI_Tag(center_button_tasks[idx].is_enabled ? center_button_tasks[idx].tag : str8_lit(\"weak\"))\r\n          {\r\n            String8 cmd_name = center_button_tasks[idx].cmd_name;\r\n            UI_Signal sig = ui_button(rd_icon_kind_text_table[rd_icon_kind_from_code_name(cmd_name)]);\r\n            os_window_push_custom_title_bar_client_area(ws->os, sig.box->rect);\r\n            if(ui_hovering(sig))\r\n            {\r\n              RD_RegsScope(.cmd_name = cmd_name, .ui_key = sig.box->key) rd_set_hover_regs(RD_RegSlot_CmdName);\r\n            }\r\n            if(ui_clicked(sig))\r\n            {\r\n              rd_push_cmd(cmd_name, rd_regs());\r\n            }\r\n          }\r\n          scratch_end(scratch);\r\n        }\r\n        \r\n        //- rjf: right column\r\n        UI_WidthFill UI_Row\r\n        {\r\n          B32 do_user_prof = (dim_2f32(top_bar_rect).x > ui_top_font_size()*80);\r\n          \r\n          ui_spacer(ui_pct(1, 0));\r\n          \r\n          // rjf: loaded user viz\r\n          if(do_user_prof) UI_TagF(\"pop\")\r\n          {\r\n            ui_set_next_pref_width(ui_children_sum(1));\r\n            ui_set_next_child_layout_axis(Axis2_X);\r\n            UI_Box *user_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                         UI_BoxFlag_DrawBorder|\r\n                                                         UI_BoxFlag_DrawBackground|\r\n                                                         UI_BoxFlag_DrawHotEffects|\r\n                                                         UI_BoxFlag_DrawActiveEffects,\r\n                                                         \"###loaded_user_button\");\r\n            os_window_push_custom_title_bar_client_area(ws->os, user_box->rect);\r\n            UI_Parent(user_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center)\r\n            {\r\n              String8 user_path = rd_state->user_path;\r\n              user_path = str8_chop_last_dot(user_path);\r\n              RD_Font(RD_FontSlot_Icons)\r\n                UI_TextRasterFlags(rd_raster_flags_from_slot(RD_FontSlot_Icons))\r\n                ui_label(rd_icon_kind_text_table[RD_IconKind_Person]);\r\n              ui_label(str8_skip_last_slash(user_path));\r\n            }\r\n            UI_Signal user_sig = ui_signal_from_box(user_box);\r\n            if(ui_clicked(user_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenUser].string);\r\n            }\r\n          }\r\n          \r\n          if(do_user_prof)\r\n          {\r\n            ui_spacer(ui_em(0.75f, 0));\r\n          }\r\n          \r\n          // rjf: loaded project viz\r\n          if(do_user_prof) UI_TagF(\"pop\")\r\n          {\r\n            ui_set_next_pref_width(ui_children_sum(1));\r\n            ui_set_next_child_layout_axis(Axis2_X);\r\n            UI_Box *prof_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                         UI_BoxFlag_DrawBorder|\r\n                                                         UI_BoxFlag_DrawBackground|\r\n                                                         UI_BoxFlag_DrawHotEffects|\r\n                                                         UI_BoxFlag_DrawActiveEffects,\r\n                                                         \"###loaded_project_button\");\r\n            os_window_push_custom_title_bar_client_area(ws->os, prof_box->rect);\r\n            UI_Parent(prof_box) UI_PrefWidth(ui_text_dim(10, 0)) UI_TextAlignment(UI_TextAlign_Center)\r\n            {\r\n              String8 prof_path = rd_state->project_path;\r\n              prof_path = str8_chop_last_dot(prof_path);\r\n              RD_Font(RD_FontSlot_Icons)\r\n                ui_label(rd_icon_kind_text_table[RD_IconKind_Briefcase]);\r\n              ui_label(str8_skip_last_slash(prof_path));\r\n            }\r\n            UI_Signal prof_sig = ui_signal_from_box(prof_box);\r\n            if(ui_clicked(prof_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_OpenProject].string);\r\n            }\r\n          }\r\n          \r\n          if(do_user_prof)\r\n          {\r\n            ui_spacer(ui_em(0.75f, 0));\r\n          }\r\n          \r\n          // rjf: close dropdown\r\n          UI_Key close_ctx_menu_key = ui_key_from_stringf(ui_key_zero(), \"###close_ctx_menu\");\r\n          UI_CtxMenu(close_ctx_menu_key) UI_TagF(\"implicit\")\r\n          {\r\n            if(ui_clicked(rd_icon_buttonf(RD_IconKind_Window, 0, \"Close Window\")))\r\n            {\r\n              rd_cmd(RD_CmdKind_CloseWindow);\r\n            }\r\n            if(ui_clicked(rd_icon_buttonf(RD_IconKind_X, 0, \"Exit\")))\r\n            {\r\n              rd_cmd(RD_CmdKind_Exit);\r\n            }\r\n          }\r\n          \r\n          // rjf: min/max/close buttons\r\n          {\r\n            UI_Signal min_sig = {0};\r\n            UI_Signal max_sig = {0};\r\n            UI_Signal cls_sig = {0};\r\n            Vec2F32 bar_dim = dim_2f32(top_bar_rect);\r\n            F32 button_dim = floor_f32(bar_dim.y);\r\n            UI_PrefWidth(ui_px(button_dim, 1.f))\r\n              UI_FontSize(ui_top_font_size()*0.75f)\r\n            {\r\n              min_sig = rd_icon_buttonf(RD_IconKind_WindowMinimize,  0, \"##minimize\");\r\n              max_sig = rd_icon_buttonf(os_window_is_maximized(ws->os) ? RD_IconKind_WindowRestore : RD_IconKind_Window, 0, \"##maximize\");\r\n            }\r\n            UI_PrefWidth(ui_px(button_dim, 1.f))\r\n              UI_TagF(\"bad_pop\")\r\n            {\r\n              cls_sig = rd_icon_buttonf(RD_IconKind_X,      0, \"##close\");\r\n            }\r\n            if(ui_clicked(min_sig))\r\n            {\r\n              os_window_set_minimized(ws->os, 1);\r\n            }\r\n            if(ui_clicked(max_sig))\r\n            {\r\n              os_window_set_maximized(ws->os, !os_window_is_maximized(ws->os));\r\n            }\r\n            if(ui_clicked(cls_sig))\r\n            {\r\n              if(ws->order_next != &rd_nil_window_state ||\r\n                 ws->order_prev != &rd_nil_window_state)\r\n              {\r\n                ui_ctx_menu_open(close_ctx_menu_key, cls_sig.box->key, v2f32(0, dim_2f32(cls_sig.box->rect).y));\r\n              }\r\n              else\r\n              {\r\n                rd_cmd(RD_CmdKind_Exit);\r\n              }\r\n            }\r\n            os_window_push_custom_title_bar_client_area(ws->os, min_sig.box->rect);\r\n            os_window_push_custom_title_bar_client_area(ws->os, max_sig.box->rect);\r\n            os_window_push_custom_title_bar_client_area(ws->os, pad_2f32(cls_sig.box->rect, 2.f));\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part bottom bar\r\n    //\r\n    ProfScope(\"build bottom bar\")\r\n    {\r\n      //- rjf: unpack status info\r\n      B32 is_running = d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index();\r\n      CTRL_Event stop_event = d_ctrl_last_stop_event();\r\n      String8 tag = str8_lit(\"pop\");\r\n      CFG_NodePtrList tasks = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"conversion_task\"));\r\n      CFG_NodePtrList long_running_tasks = {0};\r\n      F32 alive_t_rate = 1 - pow_f32(2, (-5.f * rd_state->frame_dt));\r\n      for(CFG_NodePtrNode *n = tasks.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *task = n->v;\r\n        F32 task_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"task_anim_%I64u\", task->id), 1.f, .rate = alive_t_rate);\r\n        if(task_t > 0.5f)\r\n        {\r\n          cfg_node_ptr_list_push(scratch.arena, &long_running_tasks, task);\r\n        }\r\n      }\r\n      if(rd_state->bind_change_active)\r\n      {\r\n        tag = str8_lit(\"pop\");\r\n      }\r\n      else if(ws->error_t >= 0.01f && ws->error_string_size != 0)\r\n      {\r\n        tag = str8_lit(\"bad_pop\");\r\n      }\r\n      else if(!is_running)\r\n      {\r\n        switch(stop_event.cause)\r\n        {\r\n          default:\r\n          case CTRL_EventCause_Finished:\r\n          {\r\n            tag = str8_lit(\"good_pop\");\r\n          }break;\r\n          case CTRL_EventCause_UserBreakpoint:\r\n          case CTRL_EventCause_InterruptedByException:\r\n          case CTRL_EventCause_InterruptedByTrap:\r\n          case CTRL_EventCause_InterruptedByHalt:\r\n          {\r\n            tag = str8_lit(\"bad_pop\");\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      //- rjf: compute fstrs for status explanation\r\n      DR_FStrList status_fstrs = {0};\r\n      {\r\n        if(rd_state->bind_change_active)\r\n        {\r\n          RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(rd_state->bind_change_cmd_name);\r\n          String8 display_name = rd_display_from_code_name(info->string);\r\n          String8 string = push_str8f(scratch.arena, \"Currently rebinding \\\"%S\\\"\", display_name);\r\n          DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n          dr_fstrs_push_new(scratch.arena, &status_fstrs, &params, string);\r\n        }\r\n        else if(ws->error_t >= 0.01f && ws->error_string_size != 0)\r\n        {\r\n          String8 error_string = str8(ws->error_buffer, ws->error_string_size);\r\n          ws->error_t -= rd_state->frame_dt/8.f;\r\n          rd_request_frame();\r\n          ui_set_next_pref_width(ui_children_sum(1));\r\n          UI_CornerRadius(4)\r\n            UI_Row\r\n            UI_PrefWidth(ui_text_dim(10, 1))\r\n            UI_TextAlignment(UI_TextAlign_Center)\r\n          {\r\n            DR_FStrList error_fstrs = rd_fstrs_from_rich_string(scratch.arena, error_string);\r\n            DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n            dr_fstrs_push_new(scratch.arena, &status_fstrs, &params, rd_icon_kind_text_table[RD_IconKind_WarningBig],\r\n                              .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                              .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n            dr_fstrs_push_new(scratch.arena, &status_fstrs, &params, str8_lit(\"  \"));\r\n            dr_fstrs_concat_in_place(&status_fstrs, &error_fstrs);\r\n          }\r\n        }\r\n        else if(is_running)\r\n        {\r\n          DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n          dr_fstrs_push_new(scratch.arena, &status_fstrs, &params, rd_icon_kind_text_table[RD_IconKind_Play],\r\n                            .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                            .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n          dr_fstrs_push_new(scratch.arena, &status_fstrs, &params, str8_lit(\"  Running...\"));\r\n          if(long_running_tasks.count != 0)\r\n          {\r\n            String8 string = push_str8f(scratch.arena, \"  Loading %I64u debug information file%s...\", long_running_tasks.count, long_running_tasks.count == 1 ? \"\" : \"s\");\r\n            dr_fstrs_push_new(scratch.arena, &status_fstrs, &params, string);\r\n          }\r\n        }\r\n        else\r\n        {\r\n          status_fstrs = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &stop_event);\r\n        }\r\n      }\r\n      \r\n      //- rjf: build bottom bar\r\n      UI_Flags(UI_BoxFlag_DrawBackground) UI_CornerRadius(0)\r\n        UI_Tag(tag)\r\n        UI_Pane(bottom_bar_rect, str8_lit(\"###bottom_bar\")) UI_WidthFill UI_Row\r\n        UI_Flags(0)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        \r\n        // rjf: developer frame-time indicator\r\n        if(DEV_updating_indicator)\r\n        {\r\n          F32 animation_t = pow_f32(sin_f32(rd_state->time_in_seconds/2.f), 2.f);\r\n          ui_spacer(ui_em(0.3f, 1.f));\r\n          ui_spacer(ui_em(1.5f*animation_t, 1.f));\r\n          UI_PrefWidth(ui_text_dim(10, 1)) ui_labelf(\"*\");\r\n          ui_spacer(ui_em(1.5f*(1-animation_t), 1.f));\r\n        }\r\n        \r\n        // rjf: build status\r\n        UI_PrefWidth(ui_text_dim(10, 1))\r\n        {\r\n          ui_spacer(ui_em(1.f, 1.f));\r\n          UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n          ui_box_equip_display_fstrs(box, &status_fstrs);\r\n        }\r\n        \r\n        ui_spacer(ui_pct(1, 0));\r\n        \r\n        // rjf: version\r\n        UI_FontSize(ui_top_font_size()*0.85f)\r\n          UI_PrefWidth(ui_text_dim(10, 1))\r\n          UI_TextAlignment(UI_TextAlign_Center)\r\n        {\r\n          ui_label(str8_lit(BUILD_TITLE_STRING_LITERAL));\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part panel non-leaf UI (drag boundaries, drag/drop sites)\r\n    //\r\n    B32 is_changing_panel_boundaries = 0;\r\n    ProfScope(\"non-leaf panel UI\")\r\n      for(CFG_PanelNode *panel = panel_tree.root;\r\n          panel != &cfg_nil_panel_node;\r\n          panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n    {\r\n      //////////////////////////\r\n      //- rjf: continue on leaf panels\r\n      //\r\n      if(panel->first == &cfg_nil_panel_node)\r\n      {\r\n        continue;\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: grab info\r\n      //\r\n      Axis2 split_axis = panel->split_axis;\r\n      Rng2F32 panel_rect = cfg_target_rect_from_panel_node(content_rect, panel_tree.root, panel);\r\n      \r\n      //////////////////////////\r\n      //- rjf: boundary tab-drag/drop sites\r\n      //\r\n      {\r\n        CFG_Node *drag_view = cfg_node_from_id(rd_state->drag_drop_regs->view);\r\n        if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && drag_view != &cfg_nil_node)\r\n        {\r\n          //- rjf: params\r\n          F32 drop_site_major_dim_px = ceil_f32(ui_top_font_size()*7.f);\r\n          F32 drop_site_minor_dim_px = ceil_f32(ui_top_font_size()*5.f);\r\n          F32 corner_radius = ui_top_font_size()*0.5f;\r\n          F32 padding = ceil_f32(ui_top_font_size()*0.5f);\r\n          \r\n          //- rjf: special case - build Y boundary drop sites on root panel\r\n          //\r\n          // (this does not naturally follow from the below algorithm, since the\r\n          // root level panel only splits on X)\r\n          if(panel == panel_tree.root) UI_CornerRadius(corner_radius)\r\n          {\r\n            Vec2F32 panel_rect_center = center_2f32(panel_rect);\r\n            Axis2 axis = axis2_flip(panel_tree.root->split_axis);\r\n            for EachEnumVal(Side, side)\r\n            {\r\n              UI_Key key = ui_key_from_stringf(ui_key_zero(), \"root_extra_split_%i\", side);\r\n              Rng2F32 site_rect = panel_rect;\r\n              site_rect.p0.v[axis2_flip(axis)] = panel_rect_center.v[axis2_flip(axis)] - drop_site_major_dim_px/2;\r\n              site_rect.p1.v[axis2_flip(axis)] = panel_rect_center.v[axis2_flip(axis)] + drop_site_major_dim_px/2;\r\n              site_rect.p0.v[axis] = panel_rect.v[side].v[axis] - drop_site_minor_dim_px/2;\r\n              site_rect.p1.v[axis] = panel_rect.v[side].v[axis] + drop_site_minor_dim_px/2;\r\n              \r\n              // rjf: build\r\n              UI_Box *site_box = &ui_nil_box;\r\n              {\r\n                F32 site_open_t = ui_anim(ui_key_from_stringf(key, \"open_t\"), 1.f, .rate = rd_state->menu_animation_rate);\r\n                UI_Rect(site_rect) UI_Squish(0.1f-0.1f*site_open_t) UI_Transparency(1-site_open_t)\r\n                {\r\n                  site_box = ui_build_box_from_key(UI_BoxFlag_DropSite|UI_BoxFlag_DrawHotEffects, key);\r\n                  ui_signal_from_box(site_box);\r\n                }\r\n                UI_Box *site_box_viz = &ui_nil_box;\r\n                UI_Parent(site_box) UI_WidthFill UI_HeightFill\r\n                  UI_Padding(ui_px(padding, 1.f))\r\n                  UI_Column\r\n                  UI_Padding(ui_px(padding, 1.f))\r\n                  UI_GroupKey(key)\r\n                {\r\n                  ui_set_next_child_layout_axis(axis2_flip(axis));\r\n                  site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground|\r\n                                                       UI_BoxFlag_DrawBorder|\r\n                                                       UI_BoxFlag_DrawDropShadow|\r\n                                                       UI_BoxFlag_DrawBackgroundBlur|\r\n                                                       UI_BoxFlag_DrawHotEffects, ui_key_zero());\r\n                }\r\n                UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f))\r\n                {\r\n                  ui_set_next_child_layout_axis(axis);\r\n                  UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f))\r\n                  {\r\n                    ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                    ui_spacer(ui_px(padding, 1.f));\r\n                    ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: viz\r\n              if(ui_key_match(site_box->key, ui_drop_hot_key()))\r\n              {\r\n                Rng2F32 future_split_rect_target = site_rect;\r\n                future_split_rect_target.p0.v[axis] -= drop_site_major_dim_px;\r\n                future_split_rect_target.p1.v[axis] += drop_site_major_dim_px;\r\n                future_split_rect_target.p0.v[axis2_flip(axis)] = panel_rect.p0.v[axis2_flip(axis)];\r\n                future_split_rect_target.p1.v[axis2_flip(axis)] = panel_rect.p1.v[axis2_flip(axis)];\r\n                future_split_rect_target = pad_2f32(future_split_rect_target, -ui_top_font_size()*2.f);\r\n                Vec2F32 future_split_rect_target_center = center_2f32(future_split_rect_target);\r\n                Rng2F32 future_split_rect =\r\n                {\r\n                  ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v0\"), future_split_rect_target.x0, .initial = future_split_rect_target_center.x, .rate = rd_state->menu_animation_rate),\r\n                  ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v1\"), future_split_rect_target.y0, .initial = future_split_rect_target_center.y, .rate = rd_state->menu_animation_rate),\r\n                  ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v2\"), future_split_rect_target.x1, .initial = future_split_rect_target_center.x, .rate = rd_state->menu_animation_rate),\r\n                  ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v3\"), future_split_rect_target.y1, .initial = future_split_rect_target_center.y, .rate = rd_state->menu_animation_rate),\r\n                };\r\n                UI_Rect(future_split_rect) UI_TagF(\"drop_site\") UI_CornerRadius(ui_top_font_size()*2.f)\r\n                {\r\n                  ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                }\r\n              }\r\n              \r\n              // rjf: drop\r\n              if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop())\r\n              {\r\n                Dir2 dir = (axis == Axis2_Y ? (side == Side_Min ? Dir2_Up : Dir2_Down) :\r\n                            axis == Axis2_X ? (side == Side_Min ? Dir2_Left : Dir2_Right) :\r\n                            Dir2_Invalid);\r\n                if(dir != Dir2_Invalid)\r\n                {\r\n                  CFG_PanelNode *split_panel = panel;\r\n                  rd_cmd(RD_CmdKind_SplitPanel,\r\n                         .dst_panel  = split_panel->cfg->id,\r\n                         .panel      = rd_state->drag_drop_regs->panel,\r\n                         .view      = rd_state->drag_drop_regs->view,\r\n                         .dir2       = dir);\r\n                }\r\n              }\r\n            }\r\n          }\r\n          \r\n          //- rjf: iterate all children, build boundary drop sites\r\n          Axis2 split_axis = panel->split_axis;\r\n          UI_CornerRadius(corner_radius) for(CFG_PanelNode *child = panel->first;; child = child->next)\r\n          {\r\n            // rjf: form rect\r\n            Rng2F32 child_rect = cfg_target_rect_from_panel_node_child(panel_rect, panel, child);\r\n            Vec2F32 child_rect_center = center_2f32(child_rect);\r\n            UI_Key key = ui_key_from_stringf(ui_key_zero(), \"drop_boundary_%p_%p\", panel->cfg, child->cfg);\r\n            Rng2F32 site_rect = r2f32(child_rect_center, child_rect_center);\r\n            site_rect.p0.v[split_axis] = child_rect.p0.v[split_axis] - drop_site_minor_dim_px/2;\r\n            site_rect.p1.v[split_axis] = child_rect.p0.v[split_axis] + drop_site_minor_dim_px/2;\r\n            site_rect.p0.v[axis2_flip(split_axis)] -= drop_site_major_dim_px/2;\r\n            site_rect.p1.v[axis2_flip(split_axis)] += drop_site_major_dim_px/2;\r\n            \r\n            // rjf: build\r\n            UI_Box *site_box = &ui_nil_box;\r\n            {\r\n              F32 site_open_t = ui_anim(ui_key_from_stringf(key, \"open_t\"), 1.f, .rate = rd_state->menu_animation_rate);\r\n              UI_Rect(site_rect) UI_Squish(0.1f-0.1f*site_open_t) UI_Transparency(1-site_open_t)\r\n              {\r\n                site_box = ui_build_box_from_key(UI_BoxFlag_DropSite|UI_BoxFlag_DrawHotEffects, key);\r\n                ui_signal_from_box(site_box);\r\n              }\r\n              UI_Box *site_box_viz = &ui_nil_box;\r\n              UI_Parent(site_box) UI_WidthFill UI_HeightFill\r\n                UI_Padding(ui_px(padding, 1.f))\r\n                UI_Column\r\n                UI_Padding(ui_px(padding, 1.f))\r\n                UI_GroupKey(key)\r\n              {\r\n                ui_set_next_child_layout_axis(axis2_flip(split_axis));\r\n                site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground|\r\n                                                     UI_BoxFlag_DrawBorder|\r\n                                                     UI_BoxFlag_DrawDropShadow|\r\n                                                     UI_BoxFlag_DrawBackgroundBlur|\r\n                                                     UI_BoxFlag_DrawHotEffects, ui_key_zero());\r\n              }\r\n              UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f))\r\n              {\r\n                ui_set_next_child_layout_axis(split_axis);\r\n                UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero()); UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f))\r\n                {\r\n                  ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                  ui_spacer(ui_px(padding, 1.f));\r\n                  ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: viz\r\n            if(ui_key_match(site_box->key, ui_drop_hot_key()))\r\n            {\r\n              Rng2F32 future_split_rect_target = site_rect;\r\n              future_split_rect_target.p0.v[split_axis] -= drop_site_major_dim_px;\r\n              future_split_rect_target.p1.v[split_axis] += drop_site_major_dim_px;\r\n              future_split_rect_target.p0.v[axis2_flip(split_axis)] = child_rect.p0.v[axis2_flip(split_axis)];\r\n              future_split_rect_target.p1.v[axis2_flip(split_axis)] = child_rect.p1.v[axis2_flip(split_axis)];\r\n              future_split_rect_target = pad_2f32(future_split_rect_target, -ui_top_font_size()*2.f);\r\n              Vec2F32 future_split_rect_target_center = center_2f32(future_split_rect_target);\r\n              Rng2F32 future_split_rect =\r\n              {\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v0\"), future_split_rect_target.x0, .initial = future_split_rect_target_center.x, .rate = rd_state->menu_animation_rate),\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v1\"), future_split_rect_target.y0, .initial = future_split_rect_target_center.y, .rate = rd_state->menu_animation_rate),\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v2\"), future_split_rect_target.x1, .initial = future_split_rect_target_center.x, .rate = rd_state->menu_animation_rate),\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v3\"), future_split_rect_target.y1, .initial = future_split_rect_target_center.y, .rate = rd_state->menu_animation_rate),\r\n              };\r\n              UI_Rect(future_split_rect) UI_TagF(\"drop_site\") UI_CornerRadius(ui_top_font_size()*2.f)\r\n              {\r\n                ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());\r\n              }\r\n            }\r\n            \r\n            // rjf: drop\r\n            if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop())\r\n            {\r\n              Dir2 dir = (panel->split_axis == Axis2_X ? Dir2_Left : Dir2_Up);\r\n              CFG_PanelNode *split_panel = child;\r\n              if(split_panel == &cfg_nil_panel_node)\r\n              {\r\n                split_panel = panel->last;\r\n                dir = (panel->split_axis == Axis2_X ? Dir2_Right : Dir2_Down);\r\n              }\r\n              rd_cmd(RD_CmdKind_SplitPanel,\r\n                     .dst_panel  = split_panel->cfg->id,\r\n                     .panel      = rd_state->drag_drop_regs->panel,\r\n                     .view      = rd_state->drag_drop_regs->view,\r\n                     .dir2       = dir);\r\n            }\r\n            \r\n            // rjf: exit on opl child\r\n            if(child == &cfg_nil_panel_node)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //////////////////////////\r\n      //- rjf: do UI for drag boundaries between all children\r\n      //\r\n      for(CFG_PanelNode *child = panel->first;\r\n          child != &cfg_nil_panel_node && child->next != &cfg_nil_panel_node;\r\n          child = child->next)\r\n      {\r\n        CFG_PanelNode *min_child = child;\r\n        CFG_PanelNode *max_child = min_child->next;\r\n        Rng2F32 min_child_rect = cfg_target_rect_from_panel_node_child(panel_rect, panel, min_child);\r\n        Rng2F32 max_child_rect = cfg_target_rect_from_panel_node_child(panel_rect, panel, max_child);\r\n        Rng2F32 boundary_rect = {0};\r\n        {\r\n          boundary_rect.p0.v[split_axis] = min_child_rect.p1.v[split_axis] - ui_top_font_size()/3;\r\n          boundary_rect.p1.v[split_axis] = max_child_rect.p0.v[split_axis] + ui_top_font_size()/3;\r\n          boundary_rect.p0.v[axis2_flip(split_axis)] = panel_rect.p0.v[axis2_flip(split_axis)];\r\n          boundary_rect.p1.v[axis2_flip(split_axis)] = panel_rect.p1.v[axis2_flip(split_axis)];\r\n        }\r\n        \r\n        UI_Rect(boundary_rect)\r\n        {\r\n          ui_set_next_hover_cursor(split_axis == Axis2_X ? OS_Cursor_LeftRight : OS_Cursor_UpDown);\r\n          UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"###%p_%p\", min_child->cfg, max_child->cfg);\r\n          UI_Signal sig = ui_signal_from_box(box);\r\n          if(ui_double_clicked(sig))\r\n          {\r\n            ui_kill_action();\r\n            F32 sum_pct = min_child->pct_of_parent + max_child->pct_of_parent;\r\n            min_child->pct_of_parent = 0.5f * sum_pct;\r\n            max_child->pct_of_parent = 0.5f * sum_pct;\r\n            cfg_node_equip_stringf(rd_state->cfg, min_child->cfg, \"%f\", min_child->pct_of_parent);\r\n            cfg_node_equip_stringf(rd_state->cfg, max_child->cfg, \"%f\", max_child->pct_of_parent);\r\n          }\r\n          else if(ui_pressed(sig))\r\n          {\r\n            Vec2F32 v = {min_child->pct_of_parent, max_child->pct_of_parent};\r\n            ui_store_drag_struct(&v);\r\n          }\r\n          else if(ui_dragging(sig))\r\n          {\r\n            Vec2F32 v = *ui_get_drag_struct(Vec2F32);\r\n            Vec2F32 mouse_delta      = ui_drag_delta();\r\n            F32 total_size           = dim_2f32(panel_rect).v[split_axis];\r\n            F32 min_pct__before      = v.v[0];\r\n            F32 min_pixels__before   = min_pct__before * total_size;\r\n            F32 min_pixels__after    = min_pixels__before + mouse_delta.v[split_axis];\r\n            if(min_pixels__after < 50.f)\r\n            {\r\n              min_pixels__after = 50.f;\r\n            }\r\n            F32 min_pct__after       = min_pixels__after / total_size;\r\n            F32 pct_delta            = min_pct__after - min_pct__before;\r\n            F32 max_pct__before      = v.v[1];\r\n            F32 max_pct__after       = max_pct__before - pct_delta;\r\n            F32 max_pixels__after    = max_pct__after * total_size;\r\n            if(max_pixels__after < 50.f)\r\n            {\r\n              max_pixels__after = 50.f;\r\n              max_pct__after = max_pixels__after / total_size;\r\n              pct_delta = -(max_pct__after - max_pct__before);\r\n              min_pct__after = min_pct__before + pct_delta;\r\n            }\r\n            min_child->pct_of_parent = min_pct__after;\r\n            max_child->pct_of_parent = max_pct__after;\r\n            cfg_node_equip_stringf(rd_state->cfg, min_child->cfg, \"%f\", min_pct__after);\r\n            cfg_node_equip_stringf(rd_state->cfg, max_child->cfg, \"%f\", max_pct__after);\r\n            is_changing_panel_boundaries = 1;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part animate panels\r\n    //\r\n    {\r\n      B32 window_is_resizing = (ws->last_window_rect.x1 != window_rect.x1 ||\r\n                                ws->last_window_rect.y1 != window_rect.y1);\r\n      Vec2F32 content_rect_dim = dim_2f32(content_rect);\r\n      if(content_rect_dim.x > 0 && content_rect_dim.y > 0)\r\n      {\r\n        for(CFG_PanelNode *panel = panel_tree.root;\r\n            panel != &cfg_nil_panel_node;\r\n            panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n        {\r\n          Rng2F32 target_rect_px = cfg_target_rect_from_panel_node(content_rect, panel_tree.root, panel);\r\n          Rng2F32 target_rect_pct = r2f32p(target_rect_px.x0/content_rect_dim.x,\r\n                                           target_rect_px.y0/content_rect_dim.y,\r\n                                           target_rect_px.x1/content_rect_dim.x,\r\n                                           target_rect_px.y1/content_rect_dim.y);\r\n          B32 reset = (window_is_resizing || ws->window_layout_reset || ws->frames_alive < 5 || is_changing_panel_boundaries);\r\n          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x0\", panel->cfg), target_rect_pct.x0, .initial = target_rect_pct.x0, .reset = reset, .rate = rd_state->menu_animation_rate);\r\n          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y0\", panel->cfg), target_rect_pct.y0, .initial = target_rect_pct.y0, .reset = reset, .rate = rd_state->menu_animation_rate);\r\n          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x1\", panel->cfg), target_rect_pct.x1, .initial = target_rect_pct.x1, .reset = reset, .rate = rd_state->menu_animation_rate);\r\n          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y1\", panel->cfg), target_rect_pct.y1, .initial = target_rect_pct.y1, .reset = reset, .rate = rd_state->menu_animation_rate);\r\n        }\r\n      }\r\n      ws->window_layout_reset = 0;\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part panel leaf UI\r\n    //\r\n    if(content_rect.x1 > content_rect.x0 && content_rect.y1 > content_rect.y0)\r\n    {\r\n      ProfScope(\"leaf panel UI\")\r\n        for(CFG_PanelNode *panel = panel_tree.root;\r\n            panel != &cfg_nil_panel_node;\r\n            panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n      {\r\n        if(panel->first != &cfg_nil_panel_node) {continue;}\r\n        B32 panel_is_focused = (window_is_focused &&\r\n                                !ws->menu_bar_focused &&\r\n                                !query_is_open &&\r\n                                !ui_any_ctx_menu_is_open() &&\r\n                                !ws->hover_eval_focused &&\r\n                                panel_tree.focused == panel);\r\n        CFG_Node *selected_tab = panel->selected_tab;\r\n        RD_ViewState *selected_tab_view_state = rd_view_state_from_cfg(selected_tab);\r\n        ProfScope(\"leaf panel UI work - %.*s: %.*s\", str8_varg(selected_tab->string), str8_varg(rd_expr_from_cfg(selected_tab)))\r\n          UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off)\r\n        {\r\n          //////////////////////////\r\n          //- rjf: calculate UI rectangles\r\n          //\r\n          Vec2F32 content_rect_dim = dim_2f32(content_rect);\r\n          Rng2F32 target_rect_px = cfg_target_rect_from_panel_node(content_rect, panel_tree.root, panel);\r\n          Rng2F32 target_rect_pct = r2f32p(target_rect_px.x0 / content_rect_dim.x,\r\n                                           target_rect_px.y0 / content_rect_dim.y,\r\n                                           target_rect_px.x1 / content_rect_dim.x,\r\n                                           target_rect_px.y1 / content_rect_dim.y);\r\n          Rng2F32 panel_rect_pct = r2f32p(ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x0\", panel->cfg), target_rect_pct.x0, .initial = target_rect_pct.x0, .rate = rd_state->menu_animation_rate),\r\n                                          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y0\", panel->cfg), target_rect_pct.y0, .initial = target_rect_pct.y0, .rate = rd_state->menu_animation_rate),\r\n                                          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x1\", panel->cfg), target_rect_pct.x1, .initial = target_rect_pct.x1, .rate = rd_state->menu_animation_rate),\r\n                                          ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y1\", panel->cfg), target_rect_pct.y1, .initial = target_rect_pct.y1, .rate = rd_state->menu_animation_rate));\r\n          Rng2F32 panel_rect = r2f32p(panel_rect_pct.x0*content_rect_dim.x,\r\n                                      panel_rect_pct.y0*content_rect_dim.y,\r\n                                      panel_rect_pct.x1*content_rect_dim.x,\r\n                                      panel_rect_pct.y1*content_rect_dim.y);\r\n          panel_rect = pad_2f32(panel_rect, floor_f32(-ui_top_font_size()*0.15f));\r\n          panel_rect = r2f32p(round_f32(panel_rect.x0), round_f32(panel_rect.y0), round_f32(panel_rect.x1), round_f32(panel_rect.y1));\r\n          F32 tab_bar_rheight = floor_f32(ui_top_font_size()*3.5f);\r\n          F32 tab_bar_vheight = floor_f32(ui_top_font_size()*rd_setting_f32_from_name(str8_lit(\"tab_height\")));\r\n          F32 tab_bar_rv_diff = tab_bar_rheight - tab_bar_vheight;\r\n          F32 tab_spacing = floor_f32(ui_top_font_size()*0.4f);\r\n          Rng2F32 tab_bar_rect = r2f32p(panel_rect.x0, panel_rect.y0, panel_rect.x1, panel_rect.y0 + tab_bar_vheight);\r\n          Rng2F32 content_rect = r2f32p(panel_rect.x0, panel_rect.y0+tab_bar_vheight, panel_rect.x1, panel_rect.y1);\r\n          if(panel->tab_side == Side_Max)\r\n          {\r\n            tab_bar_rect.y0 = panel_rect.y1 - tab_bar_vheight;\r\n            tab_bar_rect.y1 = panel_rect.y1;\r\n            content_rect.y0 = panel_rect.y0;\r\n            content_rect.y1 = panel_rect.y1 - tab_bar_vheight;\r\n          }\r\n          tab_bar_rect = intersect_2f32(tab_bar_rect, panel_rect);\r\n          content_rect = intersect_2f32(content_rect, panel_rect);\r\n          \r\n          //////////////////////////\r\n          //- rjf: decide to skip this panel (e.g. if it is too small\r\n          //\r\n          B32 build_panel = (content_rect.x1 > content_rect.x0 && content_rect.y1 > content_rect.y0);\r\n          \r\n          //////////////////////////\r\n          //- rjf: build combined split+movetab drag/drop sites\r\n          //\r\n          if(build_panel)\r\n          {\r\n            CFG_Node *view = cfg_node_from_id(rd_state->drag_drop_regs->view);\r\n            if(rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View && view != &cfg_nil_node && contains_2f32(panel_rect, ui_mouse()) && ui_key_match(ui_drop_hot_key(), ui_key_zero()))\r\n            {\r\n              F32 drop_site_dim_px = ceil_f32(ui_top_font_size()*7.f);\r\n              drop_site_dim_px = Min(drop_site_dim_px, dim_2f32(panel_rect).v[panel->split_axis]/4.f);\r\n              drop_site_dim_px = Max(drop_site_dim_px, ceil_f32(ui_top_font_size()*3.f));\r\n              Vec2F32 drop_site_half_dim = v2f32(drop_site_dim_px/2, drop_site_dim_px/2);\r\n              Vec2F32 panel_center = center_2f32(panel_rect);\r\n              F32 corner_radius = ui_top_font_size()*0.5f;\r\n              F32 padding = ceil_f32(ui_top_font_size()*0.5f);\r\n              struct\r\n              {\r\n                UI_Key key;\r\n                Dir2 split_dir;\r\n                Rng2F32 rect;\r\n              }\r\n              sites[] =\r\n              {\r\n                {\r\n                  ui_key_from_stringf(ui_key_zero(), \"drop_split_center_%p\", panel->cfg),\r\n                  Dir2_Invalid,\r\n                  r2f32(sub_2f32(panel_center, drop_site_half_dim),\r\n                        add_2f32(panel_center, drop_site_half_dim))\r\n                },\r\n                {\r\n                  ui_key_from_stringf(ui_key_zero(), \"drop_split_up_%p\", panel->cfg),\r\n                  Dir2_Up,\r\n                  r2f32p(panel_center.x-drop_site_half_dim.x,\r\n                         panel_center.y-drop_site_half_dim.y - drop_site_half_dim.y*2,\r\n                         panel_center.x+drop_site_half_dim.x,\r\n                         panel_center.y+drop_site_half_dim.y - drop_site_half_dim.y*2),\r\n                },\r\n                {\r\n                  ui_key_from_stringf(ui_key_zero(), \"drop_split_down_%p\", panel->cfg),\r\n                  Dir2_Down,\r\n                  r2f32p(panel_center.x-drop_site_half_dim.x,\r\n                         panel_center.y-drop_site_half_dim.y + drop_site_half_dim.y*2,\r\n                         panel_center.x+drop_site_half_dim.x,\r\n                         panel_center.y+drop_site_half_dim.y + drop_site_half_dim.y*2),\r\n                },\r\n                {\r\n                  ui_key_from_stringf(ui_key_zero(), \"drop_split_left_%p\", panel->cfg),\r\n                  Dir2_Left,\r\n                  r2f32p(panel_center.x-drop_site_half_dim.x - drop_site_half_dim.x*2,\r\n                         panel_center.y-drop_site_half_dim.y,\r\n                         panel_center.x+drop_site_half_dim.x - drop_site_half_dim.x*2,\r\n                         panel_center.y+drop_site_half_dim.y),\r\n                },\r\n                {\r\n                  ui_key_from_stringf(ui_key_zero(), \"drop_split_right_%p\", panel->cfg),\r\n                  Dir2_Right,\r\n                  r2f32p(panel_center.x-drop_site_half_dim.x + drop_site_half_dim.x*2,\r\n                         panel_center.y-drop_site_half_dim.y,\r\n                         panel_center.x+drop_site_half_dim.x + drop_site_half_dim.x*2,\r\n                         panel_center.y+drop_site_half_dim.y),\r\n                },\r\n              };\r\n              UI_CornerRadius(corner_radius)\r\n                for(U64 idx = 0; idx < ArrayCount(sites); idx += 1)\r\n              {\r\n                UI_Key key = sites[idx].key;\r\n                Dir2 dir = sites[idx].split_dir;\r\n                Rng2F32 rect = sites[idx].rect;\r\n                Axis2 split_axis = axis2_from_dir2(dir);\r\n                Side split_side = side_from_dir2(dir);\r\n                if(dir != Dir2_Invalid && split_axis == panel->parent->split_axis)\r\n                {\r\n                  continue;\r\n                }\r\n                UI_Box *site_box = &ui_nil_box;\r\n                {\r\n                  F32 site_open_t = ui_anim(ui_key_from_stringf(key, \"open_t\"), 1.f, .rate = rd_state->menu_animation_rate);\r\n                  UI_Rect(rect) UI_Squish(0.1f-0.1f*site_open_t) UI_Transparency(1-site_open_t)\r\n                  {\r\n                    site_box = ui_build_box_from_key(UI_BoxFlag_DropSite|UI_BoxFlag_DrawHotEffects, key);\r\n                    ui_signal_from_box(site_box);\r\n                  }\r\n                  UI_Box *site_box_viz = &ui_nil_box;\r\n                  UI_GroupKey(key)\r\n                    UI_Parent(site_box) UI_WidthFill UI_HeightFill\r\n                    UI_Padding(ui_px(padding, 1.f))\r\n                    UI_Column\r\n                    UI_Padding(ui_px(padding, 1.f))\r\n                  {\r\n                    ui_set_next_child_layout_axis(axis2_flip(split_axis));\r\n                    site_box_viz = ui_build_box_from_key(UI_BoxFlag_DrawBackground|\r\n                                                         UI_BoxFlag_DrawBorder|\r\n                                                         UI_BoxFlag_DrawDropShadow|\r\n                                                         UI_BoxFlag_DrawBackgroundBlur|\r\n                                                         UI_BoxFlag_DrawHotEffects, ui_key_zero());\r\n                  }\r\n                  if(dir != Dir2_Invalid)\r\n                  {\r\n                    UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f))\r\n                    {\r\n                      ui_set_next_child_layout_axis(split_axis);\r\n                      UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero());\r\n                      UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) UI_TagF(\"drop_site\")\r\n                      {\r\n                        if(split_side == Side_Min) { ui_set_next_flags(UI_BoxFlag_DrawBackground); }\r\n                        ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                        ui_spacer(ui_px(padding, 1.f));\r\n                        if(split_side == Side_Max) { ui_set_next_flags(UI_BoxFlag_DrawBackground); }\r\n                        ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                      }\r\n                    }\r\n                  }\r\n                  else\r\n                  {\r\n                    UI_Parent(site_box_viz) UI_WidthFill UI_HeightFill UI_Padding(ui_px(padding, 1.f))\r\n                    {\r\n                      ui_set_next_child_layout_axis(split_axis);\r\n                      UI_Box *row_or_column = ui_build_box_from_key(0, ui_key_zero());\r\n                      UI_Parent(row_or_column) UI_Padding(ui_px(padding, 1.f)) UI_TagF(\"drop_site\")\r\n                      {\r\n                        ui_build_box_from_key(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, ui_key_zero());\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n                if(ui_key_match(site_box->key, ui_drop_hot_key()) && rd_drag_drop())\r\n                {\r\n                  if(dir != Dir2_Invalid)\r\n                  {\r\n                    rd_cmd(RD_CmdKind_SplitPanel,\r\n                           .dst_panel = panel->cfg->id,\r\n                           .panel = rd_state->drag_drop_regs->panel,\r\n                           .view = rd_state->drag_drop_regs->view,\r\n                           .dir2 = dir);\r\n                  }\r\n                  else\r\n                  {\r\n                    rd_cmd(RD_CmdKind_MoveView,\r\n                           .dst_panel = panel->cfg->id,\r\n                           .panel = rd_state->drag_drop_regs->panel,\r\n                           .view = rd_state->drag_drop_regs->view,\r\n                           .prev_tab = cfg_node_ptr_list_last(&panel->tabs)->id);\r\n                  }\r\n                }\r\n              }\r\n              for(U64 idx = 0; idx < ArrayCount(sites); idx += 1)\r\n              {\r\n                B32 is_drop_hot = ui_key_match(ui_drop_hot_key(), sites[idx].key);\r\n                if(is_drop_hot)\r\n                {\r\n                  Axis2 split_axis = axis2_from_dir2(sites[idx].split_dir);\r\n                  Side split_side = side_from_dir2(sites[idx].split_dir);\r\n                  Rng2F32 future_split_rect_target = panel_rect;\r\n                  if(sites[idx].split_dir != Dir2_Invalid)\r\n                  {\r\n                    Vec2F32 panel_center = center_2f32(panel_rect);\r\n                    future_split_rect_target.v[side_flip(split_side)].v[split_axis] = panel_center.v[split_axis];\r\n                  }\r\n                  future_split_rect_target = pad_2f32(future_split_rect_target, -ui_top_font_size()*2.f);\r\n                  Vec2F32 future_split_rect_target_center = center_2f32(future_split_rect_target);\r\n                  Rng2F32 future_split_rect =\r\n                  {\r\n                    ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v0\"), future_split_rect_target.x0, .initial = future_split_rect_target_center.x, .rate = rd_state->menu_animation_rate),\r\n                    ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v1\"), future_split_rect_target.y0, .initial = future_split_rect_target_center.y, .rate = rd_state->menu_animation_rate),\r\n                    ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v2\"), future_split_rect_target.x1, .initial = future_split_rect_target_center.x, .rate = rd_state->menu_animation_rate),\r\n                    ui_anim(ui_key_from_stringf(ui_key_zero(), \"drop_site_v3\"), future_split_rect_target.y1, .initial = future_split_rect_target_center.y, .rate = rd_state->menu_animation_rate),\r\n                  };\r\n                  UI_Rect(future_split_rect) UI_TagF(\"drop_site\") UI_CornerRadius(ui_top_font_size()*2.f)\r\n                  {\r\n                    ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build catch-all panel drop-site\r\n          //\r\n          UI_Key catchall_drop_site_key = ui_key_from_stringf(ui_key_zero(), \"catchall_drop_site_%p\", panel->cfg);\r\n          if(build_panel && rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_View) UI_Rect(panel_rect)\r\n          {\r\n            UI_Box *catchall_drop_site = ui_build_box_from_key(UI_BoxFlag_DropSite, catchall_drop_site_key);\r\n            ui_signal_from_box(catchall_drop_site);\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: panel not selected? -> darken\r\n          //\r\n          if(build_panel) if(panel != panel_tree.focused)\r\n          {\r\n            UI_Rect(content_rect) UI_TagF(\"inactive\")\r\n              ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero());\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build panel container box\r\n          //\r\n          UI_Box *panel_box = &ui_nil_box;\r\n          if(build_panel) UI_Rect(content_rect) UI_ChildLayoutAxis(Axis2_Y) UI_CornerRadius(0) UI_Focus(UI_FocusKind_On)\r\n          {\r\n            UI_Key panel_key = ui_key_from_stringf(ui_key_zero(), \"panel_box_%p\", panel->cfg);\r\n            panel_box = ui_build_box_from_key(UI_BoxFlag_MouseClickable|\r\n                                              UI_BoxFlag_Clip|\r\n                                              UI_BoxFlag_DrawBorder|\r\n                                              UI_BoxFlag_DisableFocusOverlay|\r\n                                              ((panel_tree.focused != panel)*UI_BoxFlag_DisableFocusBorder),\r\n                                              panel_key);\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: loading animation for stable view\r\n          //\r\n          UI_Box *loading_overlay_container = &ui_nil_box;\r\n          if(build_panel) UI_Parent(panel_box) UI_WidthFill UI_HeightFill\r\n          {\r\n            loading_overlay_container = ui_build_box_from_key(UI_BoxFlag_Floating, ui_key_zero());\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build selected tab view\r\n          //\r\n          if(build_panel)\r\n            UI_Parent(panel_box)\r\n            UI_Focus(panel_is_focused ? UI_FocusKind_Null : UI_FocusKind_Off)\r\n            UI_WidthFill\r\n          {\r\n            //- rjf: push interaction registers, fill with per-view states\r\n            rd_push_regs(.panel = panel->cfg->id,\r\n                         .tab = selected_tab->id,\r\n                         .view = selected_tab->id);\r\n            {\r\n              String8 view_expr = rd_expr_from_cfg(selected_tab);\r\n              String8 view_file_path = rd_file_path_from_eval_string(rd_frame_arena(), view_expr);\r\n              // NOTE(rjf): we want to only fill out this view's file path slot if it\r\n              // evaluates one - this way, a view can use the slot to know the selected\r\n              // file path (if there is one). this is useful when pushing commandas which\r\n              // apply to a cursor, for example.\r\n              if(view_file_path.size != 0)\r\n              {\r\n                rd_regs()->file_path = view_file_path;\r\n              }\r\n            }\r\n            \r\n            //- rjf: visualizers -> accept expression drops\r\n            UI_Box *view_drop_site = &ui_nil_box;\r\n            {\r\n              RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(selected_tab->string);\r\n              if(view_ui_rule != &rd_nil_view_ui_rule && rd_drag_is_active() && rd_state->drag_drop_regs_slot == RD_RegSlot_Expr &&\r\n                 !str8_match(selected_tab->string, str8_lit(\"text\"), 0) &&\r\n                 !str8_match(selected_tab->string, str8_lit(\"disasm\"), 0))\r\n              {\r\n                UI_FixedSize(dim_2f32(content_rect))\r\n                  view_drop_site = ui_build_box_from_stringf(UI_BoxFlag_DropSite|UI_BoxFlag_Floating, \"drop_site_%I64x\", selected_tab->id);\r\n              }\r\n            }\r\n            \r\n            //- rjf: build view container\r\n            UI_Box *view_container_box = &ui_nil_box;\r\n            UI_FixedWidth(dim_2f32(content_rect).x)\r\n              UI_FixedHeight(dim_2f32(content_rect).y)\r\n              UI_ChildLayoutAxis(Axis2_Y)\r\n            {\r\n              view_container_box = ui_build_box_from_key(0, ui_key_zero());\r\n            }\r\n            \r\n            //- rjf: build empty view\r\n            UI_Parent(view_container_box) if(selected_tab == &cfg_nil_node && panel->parent != &cfg_nil_panel_node)\r\n            {\r\n              ui_set_next_flags(UI_BoxFlag_DefaultFocusNav);\r\n              UI_Focus(UI_FocusKind_On) UI_WidthFill UI_HeightFill UI_NamedColumn(str8_lit(\"empty_view\")) UI_TagF(\"weak\")\r\n                UI_Padding(ui_pct(1, 0)) UI_Focus(UI_FocusKind_Null)\r\n              {\r\n                UI_PrefHeight(ui_em(3.f, 1.f))\r\n                  UI_Row\r\n                  UI_Padding(ui_pct(1, 0))\r\n                  UI_TextAlignment(UI_TextAlign_Center)\r\n                  UI_PrefWidth(ui_em(15.f, 1.f))\r\n                  UI_CornerRadius(ui_top_font_size()/2.f)\r\n                  UI_TagF(\"bad_pop\")\r\n                {\r\n                  if(ui_clicked(rd_icon_buttonf(RD_IconKind_X, 0, \"Close Panel\")))\r\n                  {\r\n                    rd_cmd(RD_CmdKind_ClosePanel);\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: build tab view\r\n            UI_Parent(view_container_box) if(selected_tab != &cfg_nil_node) ProfScope(\"build tab view\")\r\n            {\r\n              rd_view_ui(content_rect);\r\n            }\r\n            \r\n            //- rjf: accept expression drops\r\n            if(view_drop_site != &ui_nil_box)\r\n            {\r\n              UI_Signal sig = ui_signal_from_box(view_drop_site);\r\n              if(ui_key_match(view_drop_site->key, ui_drop_hot_key()))\r\n              {\r\n                UI_Parent(view_drop_site) UI_WidthFill UI_HeightFill UI_TagF(\"drop_site\")\r\n                {\r\n                  ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());\r\n                }\r\n                if(rd_drag_drop())\r\n                {\r\n                  rd_store_view_expr_string(rd_state->drag_drop_regs->expr);\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: pop interaction registers; commit if this is the selected view\r\n            RD_Regs *view_regs = rd_pop_regs();\r\n            if(panel_is_focused)\r\n            {\r\n              MemoryCopyStruct(rd_regs(), view_regs);\r\n            }\r\n          }\r\n          \r\n          ////////////////////////\r\n          //- rjf: loading? -> fill loading overlay container\r\n          //\r\n          if(build_panel)\r\n          {\r\n            F32 selected_tab_loading_t = selected_tab_view_state->loading_t;\r\n            if(selected_tab_loading_t > 0.01f) UI_Parent(loading_overlay_container)\r\n            {\r\n              rd_loading_overlay(panel_rect, selected_tab_loading_t, selected_tab_view_state->loading_progress_v, selected_tab_view_state->loading_progress_v_target);\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: consume panel fallthrough interaction events\r\n          //\r\n          if(build_panel)\r\n          {\r\n            UI_Signal panel_sig = ui_signal_from_box(panel_box);\r\n            if(ui_pressed(panel_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_FocusPanel, .panel = panel->cfg->id);\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: compute tab build tasks\r\n          //\r\n          typedef struct TabTask TabTask;\r\n          struct TabTask\r\n          {\r\n            TabTask *next;\r\n            CFG_Node *tab;\r\n            DR_FStrList fstrs;\r\n            F32 tab_width;\r\n          };\r\n          TabTask *first_tab_task = 0;\r\n          TabTask *last_tab_task = 0;\r\n          U64 tab_task_count = 0;\r\n          F32 tab_close_width_px = ui_top_font_size()*2.5f;\r\n          F32 max_tab_width_px = ui_top_font_size()*20.f;\r\n          if(build_panel) UI_TagF(\"tab\")\r\n          {\r\n            B32 reset = (ws->window_layout_reset || ws->frames_alive < 5 || is_changing_panel_boundaries);\r\n            for(CFG_NodePtrNode *n = panel->tabs.first; n != 0; n = n->next)\r\n            {\r\n              CFG_Node *tab = n->v;\r\n              if(rd_cfg_is_project_filtered(tab))\r\n              {\r\n                continue;\r\n              }\r\n              UI_TagF(tab != panel->selected_tab ? \"inactive\" : \"\")\r\n              {\r\n                TabTask *t = push_array(scratch.arena, TabTask, 1);\r\n                t->tab = tab;\r\n                t->fstrs = rd_title_fstrs_from_cfg(scratch.arena, tab, 0);\r\n                F32 tab_width_target = dr_dim_from_fstrs(ui_top_tab_size(), &t->fstrs).x + tab_close_width_px + ui_top_font_size()*1.f;\r\n                tab_width_target = Min(max_tab_width_px, tab_width_target);\r\n                t->tab_width = floor_f32(ui_anim(ui_key_from_stringf(ui_key_zero(), \"tab_width_%p\", tab), tab_width_target, .initial = reset ? tab_width_target : 0, .rate = rd_state->menu_animation_rate));\r\n                SLLQueuePush(first_tab_task, last_tab_task, t);\r\n                tab_task_count += 1;\r\n              }\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build tab bar container\r\n          //\r\n          UI_Box *tab_bar_box = &ui_nil_box;\r\n          if(build_panel) UI_CornerRadius(0) UI_Rect(tab_bar_rect)\r\n          {\r\n            tab_bar_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|\r\n                                                    UI_BoxFlag_AllowOverflowY|\r\n                                                    UI_BoxFlag_ViewClampX|\r\n                                                    UI_BoxFlag_ViewScrollX|\r\n                                                    UI_BoxFlag_Clickable,\r\n                                                    \"tab_bar_%p\", panel->cfg);\r\n            if(panel->tab_side == Side_Max)\r\n            {\r\n              tab_bar_box->view_off.y = tab_bar_box->view_off_target.y = (tab_bar_rheight - tab_bar_vheight);\r\n            }\r\n            else\r\n            {\r\n              tab_bar_box->view_off.y = tab_bar_box->view_off_target.y = 0;\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: determine tab drop site\r\n          //\r\n          B32 tab_drop_is_active = rd_drag_is_active() && ui_key_match(ui_drop_hot_key(), catchall_drop_site_key);\r\n          CFG_Node *tab_drop_prev = &cfg_nil_node;\r\n          if(build_panel)\r\n          {\r\n            F32 best_prev_distance_px = 1000000.f;\r\n            TabTask start_boundary_tab_task = {first_tab_task, &cfg_nil_node};\r\n            F32 off = 0;\r\n            for(TabTask *task = &start_boundary_tab_task; task != 0; task = task->next)\r\n            {\r\n              off += task->tab_width;\r\n              Vec2F32 anchor_pt = v2f32(tab_bar_box->rect.x0 + off, tab_bar_box->rect.y1);\r\n              F32 distance = length_2f32(sub_2f32(ui_mouse(), anchor_pt));\r\n              if(distance < best_prev_distance_px)\r\n              {\r\n                best_prev_distance_px = distance;\r\n                tab_drop_prev = task->tab;\r\n              }\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: turn off drop visualization if this drag would be a no-op\r\n          //\r\n          if(tab_drop_is_active && rd_state->drag_drop_regs->panel == panel->cfg->id)\r\n          {\r\n            TabTask start_boundary_tab_task = {first_tab_task, &cfg_nil_node};\r\n            if(tab_drop_prev->id == rd_state->drag_drop_regs->view)\r\n            {\r\n              tab_drop_is_active = 0;\r\n            }\r\n            if(tab_drop_is_active) for(TabTask *t = &start_boundary_tab_task; t != 0; t = t->next)\r\n            {\r\n              if(t->tab == tab_drop_prev && t->next != 0 && t->next->tab->id == rd_state->drag_drop_regs->view)\r\n              {\r\n                tab_drop_is_active = 0;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build tab bar contents\r\n          //\r\n          if(build_panel) UI_Focus(UI_FocusKind_Off) UI_Parent(tab_bar_box) UI_Padding(ui_em(0.5f, 1.f)) UI_PrefHeight(ui_pct(1, 0)) UI_TagF(\"tab\")\r\n          {\r\n            F32 corner_radius = ui_top_font_size()*0.6f;\r\n            TabTask start_boundary_tab_task = {first_tab_task, &cfg_nil_node};\r\n            UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0)\r\n              UI_CornerRadius01(panel->tab_side == Side_Min ? 0 : corner_radius)\r\n              UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0)\r\n              UI_CornerRadius11(panel->tab_side == Side_Min ? 0 : corner_radius)\r\n              for(TabTask *tab_task = &start_boundary_tab_task; tab_task != 0; tab_task = tab_task->next)\r\n            {\r\n              CFG_Node *tab = tab_task->tab;\r\n              \r\n              //- rjf: build tab\r\n              DR_FStrList tab_fstrs = tab_task->fstrs;\r\n              F32 tab_width_px = tab_task->tab_width;\r\n              if(tab != &cfg_nil_node) RD_RegsScope(.panel = panel->cfg->id, .view = tab->id, .tab = tab->id)\r\n              {\r\n                // rjf: gather info for this tab\r\n                B32 tab_is_selected = (tab == panel->selected_tab);\r\n                B32 tab_is_auto = rd_view_setting_b32_from_name(str8_lit(\"auto\"));\r\n                \r\n                // rjf: begin vertical region for this tab\r\n                ui_set_next_child_layout_axis(Axis2_Y);\r\n                ui_set_next_pref_width(ui_px(tab_width_px, 1));\r\n                UI_Box *tab_column_box = ui_build_box_from_stringf(!is_changing_panel_boundaries*UI_BoxFlag_AnimatePosX, \"tab_column_%p\", tab);\r\n                \r\n                // rjf: choose palette\r\n                B32 omit_name = 0;\r\n                if(rd_drag_is_active() && rd_state->drag_drop_regs->view == tab->id && rd_state->drag_drop_regs_slot == RD_RegSlot_View)\r\n                {\r\n                  omit_name = 1;\r\n                }\r\n                \r\n                // rjf: build tab container box\r\n                UI_Parent(tab_column_box)\r\n                  UI_PrefHeight(ui_px(tab_bar_vheight, 1))\r\n                  UI_TagF(omit_name ? \"hollow\" : \"\")\r\n                  UI_TagF(!omit_name && !tab_is_selected ? \"inactive\" : \"\")\r\n                  UI_TagF(!omit_name && tab_is_auto ? \"auto\" : \"\")\r\n                {\r\n                  if(panel->tab_side == Side_Max)\r\n                  {\r\n                    ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f));\r\n                  }\r\n                  else\r\n                  {\r\n                    ui_spacer(ui_px(1.f, 1.f));\r\n                  }\r\n                  UI_Box *tab_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects|\r\n                                                              UI_BoxFlag_DrawBackground|\r\n                                                              UI_BoxFlag_DrawBorder|\r\n                                                              (UI_BoxFlag_DrawDropShadow*tab_is_selected)|\r\n                                                              UI_BoxFlag_Clickable,\r\n                                                              \"tab_%p\", tab);\r\n                  \r\n                  // rjf: build tab contents\r\n                  if(!omit_name) UI_Parent(tab_box)\r\n                  {\r\n                    UI_WidthFill UI_Row\r\n                    {\r\n                      ui_spacer(ui_em(0.5f, 1.f));\r\n                      UI_PrefWidth(ui_text_dim(10, 0))\r\n                      {\r\n                        UI_Box *name_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n                        ui_box_equip_display_fstrs(name_box, &tab_fstrs);\r\n                      }\r\n                    }\r\n                    UI_PrefWidth(ui_px(tab_close_width_px, 1.f)) UI_TextAlignment(UI_TextAlign_Center)\r\n                      RD_Font(RD_FontSlot_Icons)\r\n                      UI_FontSize(ui_top_font_size()*0.75f)\r\n                      UI_TagF(\".\") UI_TagF(\"tab\") UI_TagF(\"weak\") UI_TagF(\"implicit\")\r\n                      UI_CornerRadius00(0)\r\n                      UI_CornerRadius01(0)\r\n                    {\r\n                      UI_Box *close_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                                    UI_BoxFlag_DrawBorder|\r\n                                                                    UI_BoxFlag_DrawBackground|\r\n                                                                    UI_BoxFlag_DrawText|\r\n                                                                    UI_BoxFlag_DrawHotEffects|\r\n                                                                    UI_BoxFlag_DrawActiveEffects,\r\n                                                                    \"%S###close_view_%p\", rd_icon_kind_text_table[RD_IconKind_X], tab);\r\n                      UI_Signal sig = ui_signal_from_box(close_box);\r\n                      if(ui_clicked(sig) || ui_middle_clicked(sig))\r\n                      {\r\n                        rd_cmd(RD_CmdKind_CloseTab);\r\n                      }\r\n                    }\r\n                  }\r\n                  \r\n                  // rjf: consume events for tab clicking\r\n                  {\r\n                    UI_Signal sig = ui_signal_from_box(tab_box);\r\n                    if(ui_pressed(sig))\r\n                    {\r\n                      rd_cmd(RD_CmdKind_FocusTab);\r\n                      rd_cmd(RD_CmdKind_FocusPanel);\r\n                    }\r\n                    else if(ui_dragging(sig) && !rd_drag_is_active() && length_2f32(ui_drag_delta()) > 10.f)\r\n                    {\r\n                      rd_drag_begin(RD_RegSlot_View);\r\n                    }\r\n                    else if(ui_right_clicked(sig))\r\n                    {\r\n                      rd_cmd(RD_CmdKind_PushQuery,\r\n                             .ui_key       = sig.box->key,\r\n                             .expr         = push_str8f(scratch.arena, \"query:config.$%I64x\", tab->id));\r\n                    }\r\n                    else if(ui_middle_clicked(sig))\r\n                    {\r\n                      rd_cmd(RD_CmdKind_CloseTab);\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: space for next tab\r\n                {\r\n                  ui_spacer(ui_px(floor_f32(ui_top_font_size()*0.4f), 1.f));\r\n                }\r\n              }\r\n              \r\n              //- rjf: if this is the currently active drop site's previous tab, then build empty space\r\n              // to visualize where tab will be moved once dropped\r\n              if(tab_drop_is_active &&\r\n                 rd_drag_is_active() &&\r\n                 rd_state->drag_drop_regs_slot == RD_RegSlot_View &&\r\n                 tab == tab_drop_prev)\r\n              {\r\n                // rjf: begin vertical region for this spot\r\n                ui_set_next_child_layout_axis(Axis2_Y);\r\n                ui_set_next_pref_width(ui_px(ui_top_font_size()*4.f, 1));\r\n                UI_Box *tab_column_box = ui_build_box_from_stringf(!is_changing_panel_boundaries*UI_BoxFlag_AnimatePosX, \"tab_column_%p\", tab);\r\n                \r\n                // rjf: build spot container box\r\n                UI_Parent(tab_column_box)\r\n                  UI_PrefHeight(ui_px(tab_bar_vheight, 1))\r\n                  UI_TagF(\"hollow\")\r\n                {\r\n                  if(panel->tab_side == Side_Max)\r\n                  {\r\n                    ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f));\r\n                  }\r\n                  else\r\n                  {\r\n                    ui_spacer(ui_px(1.f, 1.f));\r\n                  }\r\n                  ui_set_next_group_key(catchall_drop_site_key);\r\n                  UI_Box *tab_box = ui_build_box_from_key(UI_BoxFlag_DrawHotEffects|\r\n                                                          UI_BoxFlag_DrawBackground|\r\n                                                          UI_BoxFlag_DrawBorder|\r\n                                                          UI_BoxFlag_Clickable,\r\n                                                          ui_key_zero());\r\n                }\r\n                \r\n                // rjf: space for next tab\r\n                {\r\n                  ui_spacer(ui_px(floor_f32(ui_top_font_size()*0.4f), 1.f));\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: build add-new-tab button\r\n            UI_TextAlignment(UI_TextAlign_Center)\r\n              UI_PrefWidth(ui_px(tab_bar_vheight, 1.f))\r\n              UI_PrefHeight(ui_px(tab_bar_vheight, 1.f))\r\n              UI_TagF(\".\")\r\n            {\r\n              ui_set_next_child_layout_axis(Axis2_Y);\r\n              UI_Box *container = ui_build_box_from_stringf(!is_changing_panel_boundaries*UI_BoxFlag_AnimatePosX, \"###add_new_tab\");\r\n              UI_Parent(container)\r\n              {\r\n                if(panel->tab_side == Side_Max)\r\n                {\r\n                  ui_spacer(ui_px(tab_bar_rv_diff-1.f, 1.f));\r\n                }\r\n                else\r\n                {\r\n                  ui_spacer(ui_px(1.f, 1.f));\r\n                }\r\n                UI_CornerRadius00(panel->tab_side == Side_Min ? corner_radius : 0)\r\n                  UI_CornerRadius10(panel->tab_side == Side_Min ? corner_radius : 0)\r\n                  UI_CornerRadius01(panel->tab_side == Side_Max ? corner_radius : 0)\r\n                  UI_CornerRadius11(panel->tab_side == Side_Max ? corner_radius : 0)\r\n                  RD_Font(RD_FontSlot_Icons)\r\n                  UI_FontSize(ui_top_font_size())\r\n                  UI_TagF(\"implicit\")\r\n                  UI_TagF(\"weak\")\r\n                {\r\n                  UI_Box *add_new_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                                                  UI_BoxFlag_DrawBorder|\r\n                                                                  UI_BoxFlag_DrawBackground|\r\n                                                                  UI_BoxFlag_DrawHotEffects|\r\n                                                                  UI_BoxFlag_DrawActiveEffects|\r\n                                                                  UI_BoxFlag_Clickable|\r\n                                                                  UI_BoxFlag_DisableTextTrunc,\r\n                                                                  \"%S##add_new_tab_button_%p\",\r\n                                                                  rd_icon_kind_text_table[RD_IconKind_Add],\r\n                                                                  panel->cfg);\r\n                  UI_Signal sig = ui_signal_from_box(add_new_box);\r\n                  if(ui_pressed(sig))\r\n                  {\r\n                    rd_cmd(RD_CmdKind_FocusPanel, .panel = panel->cfg->id);\r\n                    if(ws->query_is_active &&\r\n                       ui_key_match(add_new_box->key, ws->query_regs->ui_key))\r\n                    {\r\n                      rd_cmd(RD_CmdKind_CancelQuery);\r\n                    }\r\n                    else\r\n                    {\r\n                      rd_cmd(RD_CmdKind_PushQuery,\r\n                             .expr = str8_lit(\"query:tab_commands\"),\r\n                             .panel = panel->cfg->id,\r\n                             .do_implicit_root = 1,\r\n                             .do_lister = 1,\r\n                             .ui_key = add_new_box->key);\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: interact with tab bar\r\n            ui_signal_from_box(tab_bar_box);\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: accept tab drops\r\n          //\r\n          if(tab_drop_is_active && rd_drag_drop() && rd_state->drag_drop_regs_slot == RD_RegSlot_View)\r\n          {\r\n            rd_cmd(RD_CmdKind_MoveView,\r\n                   .dst_panel = panel->cfg->id,\r\n                   .panel     = rd_state->drag_drop_regs->panel,\r\n                   .view     = rd_state->drag_drop_regs->view,\r\n                   .prev_tab  = tab_drop_prev->id);\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: accept file drops\r\n          //\r\n          {\r\n            for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n            {\r\n              if(evt->kind == UI_EventKind_FileDrop && contains_2f32(content_rect, evt->pos))\r\n              {\r\n                B32 need_drop_completion = 0;\r\n                arena_clear(ws->drop_completion_arena);\r\n                ws->top_drop_completion_task = 0;\r\n                ws->drop_completion_panel = panel->cfg->id;\r\n                String8List exe_paths = {0};\r\n                String8List dbg_paths = {0};\r\n                for(String8Node *n = evt->paths.first; n != 0; n = n->next)\r\n                {\r\n                  Temp scratch = scratch_begin(0, 0);\r\n                  String8 path = n->string;\r\n                  String8 ext = str8_skip_last_dot(path);\r\n                  if(str8_match(ext, str8_lit(\"exe\"), StringMatchFlag_CaseInsensitive))\r\n                  {\r\n                    str8_list_push(ws->drop_completion_arena, &exe_paths, str8_copy(ws->drop_completion_arena, path));\r\n                  }\r\n                  else if(str8_match(ext, str8_lit(\"pdb\"), StringMatchFlag_CaseInsensitive) ||\r\n                          str8_match(ext, str8_lit(\"rdi\"), StringMatchFlag_CaseInsensitive))\r\n                  {\r\n                    str8_list_push(ws->drop_completion_arena, &dbg_paths, str8_copy(ws->drop_completion_arena, path));\r\n                  }\r\n                  else\r\n                  {\r\n                    rd_cmd(RD_CmdKind_Open, .file_path = path, .panel = panel->cfg->id);\r\n                  }\r\n                  scratch_end(scratch);\r\n                }\r\n                if(dbg_paths.node_count != 0)\r\n                {\r\n                  RD_DropCompletionTask *t = push_array(ws->drop_completion_arena, RD_DropCompletionTask, 1);\r\n                  SLLStackPush(ws->top_drop_completion_task, t);\r\n                  t->dbg = 1;\r\n                  t->paths = dbg_paths;\r\n                }\r\n                if(exe_paths.node_count != 0)\r\n                {\r\n                  RD_DropCompletionTask *t = push_array(ws->drop_completion_arena, RD_DropCompletionTask, 1);\r\n                  SLLStackPush(ws->top_drop_completion_task, t);\r\n                  t->exe = 1;\r\n                  t->paths = exe_paths;\r\n                }\r\n                if(ws->top_drop_completion_task != 0)\r\n                {\r\n                  ui_ctx_menu_open(rd_state->drop_completion_key, ui_key_zero(), evt->pos);\r\n                }\r\n                ui_eat_event(evt);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part drag/drop cancelling\r\n    //\r\n    if(rd_drag_is_active() && ui_slot_press(UI_EventActionSlot_Cancel))\r\n    {\r\n      rd_drag_kill();\r\n      ui_kill_action();\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @window_ui_part top-level font size changing\r\n    //\r\n    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n    {\r\n      if(evt->kind == UI_EventKind_Scroll && evt->modifiers == OS_Modifier_Ctrl)\r\n      {\r\n        ui_eat_event(evt);\r\n        if(evt->delta_2f32.y < 0)\r\n        {\r\n          rd_cmd(RD_CmdKind_IncWindowFontSize);\r\n        }\r\n        else if(evt->delta_2f32.y > 0)\r\n        {\r\n          rd_cmd(RD_CmdKind_DecWindowFontSize);\r\n        }\r\n      }\r\n    }\r\n    \r\n    ui_end_build();\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part hover eval cancelling\r\n  //\r\n  if(ws->hover_eval_string.size != 0 && ui_slot_press(UI_EventActionSlot_Cancel))\r\n  {\r\n    MemoryZeroStruct(&ws->hover_eval_string);\r\n    arena_clear(ws->hover_eval_arena);\r\n    ws->hover_eval_focused = 0;\r\n    rd_request_frame();\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part animate\r\n  //\r\n  if(ui_animating_from_state(ws->ui))\r\n  {\r\n    rd_request_frame();\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part draw UI\r\n  //\r\n  ws->draw_bucket = dr_bucket_make();\r\n  DR_BucketScope(ws->draw_bucket)\r\n    ProfScope(\"draw UI\")\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    F32 box_squish_epsilon = 0.001f;\r\n    Rng2F32 window_rect = os_client_rect_from_window(ws->os);\r\n    \r\n    //- rjf: unpack settings\r\n    F32 rounded_corner_amount = rd_setting_f32_from_name(str8_lit(\"rounded_corner_amount\"));\r\n    F32 border_softness = 1.f;\r\n    B32 do_background_blur = rd_setting_b32_from_name(str8_lit(\"background_blur\"));\r\n    B32 force_opaque_floating_backgrounds = rd_setting_b32_from_name(str8_lit(\"opaque_backgrounds\"));\r\n    B32 do_drop_shadows = \r\n      rd_setting_b32_from_name(str8_lit(\"drop_shadows\"));\r\n    Vec4F32 base_background_color = ui_color_from_name(str8_lit(\"background\"));\r\n    Vec4F32 base_border_color = ui_color_from_name(str8_lit(\"border\"));\r\n    Vec4F32 drop_shadow_color = ui_color_from_name(str8_lit(\"drop_shadow\"));\r\n    \r\n    //- rjf: set up heatmap buckets\r\n    F32 heatmap_bucket_size = 32.f;\r\n    U64 *heatmap_buckets = 0;\r\n    U64 heatmap_bucket_pitch = 0;\r\n    U64 heatmap_bucket_count = 0;\r\n    if(DEV_draw_ui_box_heatmap)\r\n    {\r\n      Rng2F32 rect = os_client_rect_from_window(ws->os);\r\n      Vec2F32 size = dim_2f32(rect);\r\n      Vec2S32 buckets_dim = {(S32)(size.x/heatmap_bucket_size), (S32)(size.y/heatmap_bucket_size)};\r\n      heatmap_bucket_pitch = buckets_dim.x;\r\n      heatmap_bucket_count = buckets_dim.x*buckets_dim.y;\r\n      heatmap_buckets = push_array(scratch.arena, U64, heatmap_bucket_count);\r\n    }\r\n    \r\n    //- rjf: draw background color\r\n    {\r\n      dr_rect(os_client_rect_from_window(ws->os), base_background_color, 0, 0, 0);\r\n    }\r\n    \r\n    //- rjf: draw window border\r\n    {\r\n      dr_rect(os_client_rect_from_window(ws->os), base_border_color, 0, 1.f, border_softness*0.5f);\r\n    }\r\n    \r\n    //- rjf: recurse & draw\r\n    U64 total_heatmap_sum_count = 0;\r\n    UI_Box *hover_debug_box = &ui_nil_box;\r\n    for(UI_Box *box = ui_root_from_state(ws->ui); !ui_box_is_nil(box);)\r\n    {\r\n      // rjf: get corner radii\r\n      F32 box_corner_radii[Corner_COUNT] =\r\n      {\r\n        box->corner_radii[Corner_00]*rounded_corner_amount,\r\n        box->corner_radii[Corner_01]*rounded_corner_amount,\r\n        box->corner_radii[Corner_10]*rounded_corner_amount,\r\n        box->corner_radii[Corner_11]*rounded_corner_amount,\r\n      };\r\n      \r\n      // rjf: get recursion\r\n      UI_BoxRec rec = ui_box_rec_df_post(box, &ui_nil_box);\r\n      \r\n      // rjf: sum to box heatmap\r\n      if(DEV_draw_ui_box_heatmap)\r\n      {\r\n        Vec2F32 center = center_2f32(box->rect);\r\n        Vec2S32 p = v2s32(center.x / heatmap_bucket_size, center.y / heatmap_bucket_size);\r\n        U64 bucket_idx = p.y * heatmap_bucket_pitch + p.x;\r\n        if(bucket_idx < heatmap_bucket_count)\r\n        {\r\n          heatmap_buckets[bucket_idx] += 1;\r\n          total_heatmap_sum_count += 1;\r\n        }\r\n      }\r\n      \r\n      // rjf: grab if debug\r\n      if(box->flags & UI_BoxFlag_Debug && contains_2f32(box->rect, ui_mouse()))\r\n      {\r\n        hover_debug_box = box;\r\n      }\r\n      \r\n      // rjf: push transparency\r\n      if(box->transparency != 0)\r\n      {\r\n        dr_push_transparency(box->transparency);\r\n      }\r\n      \r\n      // rjf: push squish\r\n      if(box->squish > box_squish_epsilon)\r\n      {\r\n        Vec2F32 box_dim = dim_2f32(box->rect);\r\n        Vec2F32 anchor_off = {0};\r\n        if(box->flags & UI_BoxFlag_SquishAnchored)\r\n        {\r\n          anchor_off.x = box_dim.x/2.f;\r\n        }\r\n        else\r\n        {\r\n          anchor_off.y = -box_dim.y/8.f;\r\n        }\r\n        Mat3x3F32 box2origin_xform = make_translate_3x3f32(v2f32(-box->rect.x0 - box_dim.x/2 + anchor_off.x, -box->rect.y0 + anchor_off.y));\r\n        Mat3x3F32 scale_xform = make_scale_3x3f32(v2f32(1-box->squish, 1-box->squish));\r\n        Mat3x3F32 origin2box_xform = make_translate_3x3f32(v2f32(box->rect.x0 + box_dim.x/2 - anchor_off.x, box->rect.y0 - anchor_off.y));\r\n        Mat3x3F32 xform = mul_3x3f32(origin2box_xform, mul_3x3f32(scale_xform, box2origin_xform));\r\n        dr_push_xform2d(xform);\r\n        dr_push_tex2d_sample_kind(R_Tex2DSampleKind_Linear);\r\n      }\r\n      \r\n      // rjf: draw drop shadow\r\n      if(do_drop_shadows && box->flags & UI_BoxFlag_DrawDropShadow)\r\n      {\r\n        Rng2F32 drop_shadow_rect = shift_2f32(pad_2f32(box->rect, 8), v2f32(4, 4));\r\n        R_Rect2DInst *inst = dr_rect(drop_shadow_rect, drop_shadow_color, 0.8f, 0, 8.f);\r\n        MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n      }\r\n      \r\n      // rjf: blur background\r\n      if(do_background_blur && box->flags & UI_BoxFlag_DrawBackgroundBlur)\r\n      {\r\n        R_PassParams_Blur *params = dr_blur(pad_2f32(box->rect, 1.f), box->blur_size*(1-box->transparency), 0);\r\n        MemoryCopyArray(params->corner_radii, box_corner_radii);\r\n      }\r\n      \r\n      // rjf: compute effective active t\r\n      F32 effective_active_t = box->active_t;\r\n      if(!(box->flags & UI_BoxFlag_DrawActiveEffects))\r\n      {\r\n        effective_active_t = 0;\r\n      }\r\n      F32 t = box->hot_t*(1-effective_active_t);\r\n      \r\n      // rjf: compute background color\r\n      Vec4F32 box_background_color = box->background_color;\r\n      if(force_opaque_floating_backgrounds && box->flags & UI_BoxFlag_Floating && box->flags & UI_BoxFlag_DrawDropShadow)\r\n      {\r\n        box_background_color.w = 1.f;\r\n      }\r\n      \r\n      // rjf: draw background\r\n      if(box->flags & UI_BoxFlag_DrawBackground)\r\n      {\r\n        // rjf: hot effect extension (drop shadow)\r\n        if(box->flags & UI_BoxFlag_DrawHotEffects)\r\n        {\r\n          Rng2F32 drop_shadow_rect = shift_2f32(pad_2f32(box->rect, 8), v2f32(4, 4));\r\n          Vec4F32 color = drop_shadow_color;\r\n          color.w *= t*box_background_color.w;\r\n          dr_rect(drop_shadow_rect, color, 0.8f, 0, 8.f);\r\n        }\r\n        \r\n        // rjf: draw background\r\n        R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, 1.f), box_background_color, 0, 0, border_softness*1.f);\r\n        MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n        \r\n        // rjf: hot effect extension\r\n        if(box->flags & UI_BoxFlag_DrawHotEffects)\r\n        {\r\n          B32 is_hot = !ui_key_match(box->key, ui_key_zero()) && ui_key_match(box->key, ui_hot_key());\r\n          Vec4F32 hover_color = ui_color_from_tags_key_name(box->tags_key, str8_lit(\"hover\"));\r\n          \r\n          // rjf: brighten\r\n          {\r\n            Vec4F32 color = hover_color;\r\n            color.w *= 0.05f;\r\n            if(!is_hot)\r\n            {\r\n              color.w *= t;\r\n            }\r\n            R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, 1.f), v4f32(0, 0, 0, 0), 0, 0, border_softness*1.f);\r\n            inst->colors[Corner_00] = color;\r\n            inst->colors[Corner_10] = color;\r\n            MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n          }\r\n          \r\n          // rjf: soft circle around mouse\r\n          if(box->hot_t > 0.01f) DR_ClipScope(intersect_2f32(box->rect, dr_top_clip()))\r\n          {\r\n            Vec4F32 color = hover_color;\r\n            color.w *= 0.02f;\r\n            if(!is_hot)\r\n            {\r\n              color.w *= t;\r\n            }\r\n            Vec2F32 center = ui_mouse();\r\n            Vec2F32 box_dim = dim_2f32(box->rect);\r\n            F32 max_dim = Max(box_dim.x, box_dim.y);\r\n            F32 radius = box->font_size*12.f;\r\n            radius = Min(max_dim, radius);\r\n            dr_rect(pad_2f32(r2f32(center, center), radius), color, radius, 0, radius/3.f);\r\n          }\r\n        }\r\n        \r\n        // rjf: active effect extension\r\n        if(box->flags & UI_BoxFlag_DrawActiveEffects)\r\n        {\r\n          Vec4F32 shadow_color = drop_shadow_color;\r\n          shadow_color.w *= 0.5f*box->active_t;\r\n          Vec2F32 shadow_size =\r\n          {\r\n            (box->rect.x1 - box->rect.x0)*0.60f*box->active_t,\r\n            (box->rect.y1 - box->rect.y0)*0.60f*box->active_t,\r\n          };\r\n          shadow_size.x = Clamp(0, shadow_size.x, box->font_size*2.f);\r\n          shadow_size.y = Clamp(0, shadow_size.y, box->font_size*2.f);\r\n          \r\n          // rjf: top -> bottom dark effect\r\n          {\r\n            R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x1, box->rect.y0 + shadow_size.y), v4f32(0, 0, 0, 0), 0, 0, 1.f);\r\n            inst->colors[Corner_00] = inst->colors[Corner_10] = shadow_color;\r\n            inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.0f);\r\n            MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n          }\r\n          \r\n          // rjf: bottom -> top light effect\r\n          {\r\n            R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y1 - shadow_size.y, box->rect.x1, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f);\r\n            inst->colors[Corner_00] = inst->colors[Corner_10] = v4f32(0, 0, 0, 0);\r\n            inst->colors[Corner_01] = inst->colors[Corner_11] = v4f32(1.0f, 1.0f, 1.0f, 0.08f*box->active_t);\r\n            MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n          }\r\n          \r\n          // rjf: left -> right dark effect\r\n          {\r\n            R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0, box->rect.y0, box->rect.x0 + shadow_size.x, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f);\r\n            inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(0.f, 0.f, 0.f, 0.f);\r\n            inst->colors[Corner_00] = shadow_color;\r\n            inst->colors[Corner_01] = shadow_color;\r\n            MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n          }\r\n          \r\n          // rjf: right -> left dark effect\r\n          {\r\n            R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x1 - shadow_size.x, box->rect.y0, box->rect.x1, box->rect.y1), v4f32(0, 0, 0, 0), 0, 0, 1.f);\r\n            inst->colors[Corner_00] = inst->colors[Corner_01] = v4f32(0.f, 0.f, 0.f, 0.f);\r\n            inst->colors[Corner_10] = shadow_color;\r\n            inst->colors[Corner_11] = shadow_color;\r\n            MemoryCopyArray(inst->corner_radii, box_corner_radii);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: draw string\r\n      if(box->flags & UI_BoxFlag_DrawText)\r\n      {\r\n        Vec2F32 text_position = ui_box_text_position(box);\r\n        if(DEV_draw_ui_text_pos)\r\n        {\r\n          dr_rect(r2f32p(text_position.x-4, text_position.y-4, text_position.x+4, text_position.y+4),\r\n                  v4f32(1, 0, 1, 1), 1, 0, 1);\r\n        }\r\n        F32 max_x = 100000.f;\r\n        FNT_Run ellipses_run = {0};\r\n        if(!(box->flags & UI_BoxFlag_DisableTextTrunc))\r\n        {\r\n          FNT_Tag ellipses_font = box->font;\r\n          F32 ellipses_size = box->font_size;\r\n          FNT_RasterFlags ellipses_raster_flags = box->text_raster_flags;\r\n          if(box->display_fstrs.last)\r\n          {\r\n            ellipses_font = box->display_fstrs.last->v.params.font;\r\n            ellipses_size = box->display_fstrs.last->v.params.size;\r\n            ellipses_raster_flags = box->display_fstrs.last->v.params.raster_flags;\r\n          }\r\n          max_x = (box->rect.x1-text_position.x);\r\n          ellipses_run = fnt_run_from_string(ellipses_font, ellipses_size, 0, box->tab_size, ellipses_raster_flags, str8_lit(\"...\"));\r\n        }\r\n        if(box->flags & UI_BoxFlag_HasFuzzyMatchRanges) UI_TagF(\"match\")\r\n        {\r\n          Vec4F32 match_color = ui_color_from_tags_key_name(ui_top_tags_key(), str8_lit(\"background\"));\r\n          dr_truncated_fancy_run_fuzzy_matches(text_position, &box->display_fruns, max_x, &box->fuzzy_match_ranges, match_color);\r\n        }\r\n        dr_truncated_fancy_run_list(text_position, &box->display_fruns, max_x, ellipses_run);\r\n      }\r\n      \r\n      // rjf: draw focus viz\r\n      if(DEV_draw_ui_focus_debug)\r\n      {\r\n        B32 focused = (box->flags & (UI_BoxFlag_FocusHot|UI_BoxFlag_FocusActive) &&\r\n                       box->flags & UI_BoxFlag_Clickable);\r\n        B32 disabled = 0;\r\n        for(UI_Box *p = box; !ui_box_is_nil(p); p = p->parent)\r\n        {\r\n          if(p->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled))\r\n          {\r\n            disabled = 1;\r\n            break;\r\n          }\r\n        }\r\n        if(focused)\r\n        {\r\n          Vec4F32 color = v4f32(0.3f, 0.8f, 0.3f, 1.f);\r\n          if(disabled)\r\n          {\r\n            color = v4f32(0.8f, 0.3f, 0.3f, 1.f);\r\n          }\r\n          dr_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), color, 2, 0, 1);\r\n          dr_rect(box->rect, color, 2, 2, 1);\r\n        }\r\n        if(box->flags & (UI_BoxFlag_FocusHot|UI_BoxFlag_FocusActive))\r\n        {\r\n          if(box->flags & (UI_BoxFlag_FocusHotDisabled|UI_BoxFlag_FocusActiveDisabled))\r\n          {\r\n            dr_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), v4f32(1, 0, 0, 0.2f), 2, 0, 1);\r\n          }\r\n          else\r\n          {\r\n            dr_rect(r2f32p(box->rect.x0-6, box->rect.y0-6, box->rect.x0+6, box->rect.y0+6), v4f32(0, 1, 0, 0.2f), 2, 0, 1);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push clip\r\n      if(box->flags & UI_BoxFlag_Clip)\r\n      {\r\n        Rng2F32 top_clip = dr_top_clip();\r\n        Rng2F32 new_clip = pad_2f32(box->rect, -1);\r\n        if(top_clip.x1 != 0 || top_clip.y1 != 0)\r\n        {\r\n          new_clip = intersect_2f32(new_clip, top_clip);\r\n        }\r\n        dr_push_clip(new_clip);\r\n      }\r\n      \r\n      // rjf: custom draw list\r\n      if(box->flags & UI_BoxFlag_DrawBucket)\r\n      {\r\n        Mat3x3F32 xform = make_translate_3x3f32(box->position_delta);\r\n        DR_XForm2DScope(xform)\r\n        {\r\n          dr_sub_bucket(box->draw_bucket);\r\n        }\r\n      }\r\n      \r\n      // rjf: call custom draw callback\r\n      if(box->custom_draw != 0)\r\n      {\r\n        box->custom_draw(box, box->custom_draw_user_data);\r\n      }\r\n      \r\n      // rjf: pop\r\n      {\r\n        S32 pop_idx = 0;\r\n        for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent)\r\n        {\r\n          pop_idx += 1;\r\n          if(b == box && rec.push_count != 0)\r\n          {\r\n            continue;\r\n          }\r\n          \r\n          // rjf: pop clips\r\n          if(b->flags & UI_BoxFlag_Clip)\r\n          {\r\n            dr_pop_clip();\r\n          }\r\n          \r\n          // rjf: get corner radii\r\n          F32 b_corner_radii[Corner_COUNT] =\r\n          {\r\n            b->corner_radii[Corner_00]*rounded_corner_amount,\r\n            b->corner_radii[Corner_01]*rounded_corner_amount,\r\n            b->corner_radii[Corner_10]*rounded_corner_amount,\r\n            b->corner_radii[Corner_11]*rounded_corner_amount,\r\n          };\r\n          \r\n          // rjf: draw border\r\n          if(b->flags & UI_BoxFlag_DrawBorder)\r\n          {\r\n            Vec4F32 border_color = b->border_color;\r\n            Rng2F32 b_border_rect = pad_2f32(b->rect, 1.f);\r\n            R_Rect2DInst *inst = dr_rect(b_border_rect, border_color, 0, 1.f, border_softness*1.f);\r\n            MemoryCopyArray(inst->corner_radii, b_corner_radii);\r\n            \r\n            // rjf: hover effect\r\n            if(b->flags & UI_BoxFlag_DrawHotEffects)\r\n            {\r\n              Vec4F32 color = ui_color_from_tags_key_name(box->tags_key, str8_lit(\"hover\"));\r\n              if(ui_key_match(b->key, ui_key_zero()) || !ui_key_match(b->key, ui_hot_key()))\r\n              {\r\n                color.w *= b->hot_t;\r\n              }\r\n              color.w *= 0.01f;\r\n              R_Rect2DInst *inst = dr_rect(b_border_rect, color, 0, 1.f, 1.f);\r\n              MemoryCopyArray(inst->corner_radii, b_corner_radii);\r\n            }\r\n          }\r\n          \r\n          // rjf: debug border rendering\r\n          if(b->flags & UI_BoxFlag_Debug)\r\n          {\r\n            R_Rect2DInst *inst = dr_rect(b->rect, v4f32(1*box->pref_size[Axis2_X].strictness, 0, 1, 0.25f), 0, 1.f, 0);\r\n            MemoryCopyArray(inst->corner_radii, b_corner_radii);\r\n          }\r\n          \r\n          // rjf: draw sides\r\n          if(b->flags & (UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideRight))\r\n          {\r\n            Vec4F32 border_color = b->border_color;\r\n            Rng2F32 r = b->rect;\r\n            F32 half_thickness = 1.f;\r\n            F32 softness = 0.f;\r\n            if(b->flags & UI_BoxFlag_DrawSideTop)\r\n            {\r\n              dr_rect(r2f32p(r.x0, r.y0, r.x1, r.y0+2*half_thickness), border_color, 0, 0, softness);\r\n            }\r\n            if(b->flags & UI_BoxFlag_DrawSideBottom)\r\n            {\r\n              dr_rect(r2f32p(r.x0, r.y1-2*half_thickness, r.x1, r.y1), border_color, 0, 0, softness);\r\n            }\r\n            if(b->flags & UI_BoxFlag_DrawSideLeft)\r\n            {\r\n              dr_rect(r2f32p(r.x0, r.y0, r.x0+2*half_thickness, r.y1), border_color, 0, 0, softness);\r\n            }\r\n            if(b->flags & UI_BoxFlag_DrawSideRight)\r\n            {\r\n              dr_rect(r2f32p(r.x1-2*half_thickness, r.y0, r.x1, r.y1), border_color, 0, 0, softness);\r\n            }\r\n          }\r\n          \r\n          // rjf: draw focus overlay\r\n          if(b->flags & UI_BoxFlag_Clickable && !(b->flags & UI_BoxFlag_DisableFocusOverlay) && b->focus_hot_t > 0.01f)\r\n          {\r\n            String8 extras[] = {str8_lit(\"focus\"), str8_lit(\"overlay\")};\r\n            String8Array extras_array = {extras, ArrayCount(extras)};\r\n            Vec4F32 color = ui_color_from_tags_key_extras(b->tags_key, extras_array);\r\n            color.w *= b->focus_hot_t;\r\n            R_Rect2DInst *inst = dr_rect(b->rect, color, 0, 0, 0.f);\r\n            MemoryCopyArray(inst->corner_radii, b_corner_radii);\r\n          }\r\n          \r\n          // rjf: draw focus border\r\n          if(b->flags & UI_BoxFlag_Clickable && !(b->flags & UI_BoxFlag_DisableFocusBorder) && b->focus_active_t > 0.01f)\r\n          {\r\n            Rng2F32 rect = b->rect;\r\n            if(b->flags & UI_BoxFlag_Floating)\r\n            {\r\n              rect = pad_2f32(rect, 1.f);\r\n              rect = intersect_2f32(window_rect, rect);\r\n            }\r\n            String8 extras[] = {str8_lit(\"focus\"), str8_lit(\"border\")};\r\n            String8Array extras_array = {extras, ArrayCount(extras)};\r\n            Vec4F32 color = ui_color_from_tags_key_extras(b->tags_key, extras_array);\r\n            color.w *= b->focus_active_t;\r\n            R_Rect2DInst *inst = dr_rect(rect, color, 0, 1.f, border_softness*1.f);\r\n            MemoryCopyArray(inst->corner_radii, b_corner_radii);\r\n          }\r\n          \r\n          // rjf: disabled overlay\r\n          if(b->disabled_t >= 0.005f)\r\n          {\r\n            Vec4F32 disabled_overlay_color = v4f32(base_background_color.x, base_background_color.y, base_background_color.z, b->disabled_t*0.3f);\r\n            R_Rect2DInst *inst = dr_rect(b->rect, disabled_overlay_color, 0, 0, 1);\r\n            MemoryCopyArray(inst->corner_radii, b_corner_radii);\r\n          }\r\n          \r\n          // rjf: pop squish\r\n          if(b->squish > box_squish_epsilon)\r\n          {\r\n            dr_pop_xform2d();\r\n            dr_pop_tex2d_sample_kind();\r\n          }\r\n          \r\n          // rjf: pop transparency\r\n          if(b->transparency != 0)\r\n          {\r\n            dr_pop_transparency();\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: next\r\n      box = rec.next;\r\n    }\r\n    \r\n    //- rjf: draw heatmap\r\n    if(DEV_draw_ui_box_heatmap)\r\n    {\r\n      U64 uniform_dist_count = total_heatmap_sum_count / heatmap_bucket_count;\r\n      uniform_dist_count = ClampBot(uniform_dist_count, 10);\r\n      for(U64 bucket_idx = 0; bucket_idx < heatmap_bucket_count; bucket_idx += 1)\r\n      {\r\n        U64 x = bucket_idx % heatmap_bucket_pitch;\r\n        U64 y = bucket_idx / heatmap_bucket_pitch;\r\n        U64 bucket = heatmap_buckets[bucket_idx];\r\n        F32 pct = (F32)bucket / uniform_dist_count;\r\n        pct = Clamp(0, pct, 1);\r\n        Vec3F32 hsv = v3f32((1-pct) * 0.9411f, 1, 0.5f);\r\n        Vec3F32 rgb = rgb_from_hsv(hsv);\r\n        Rng2F32 rect = r2f32p(x*heatmap_bucket_size, y*heatmap_bucket_size, (x+1)*heatmap_bucket_size, (y+1)*heatmap_bucket_size);\r\n        dr_rect(rect, v4f32(rgb.x, rgb.y, rgb.z, 0.3f), 0, 0, 0);\r\n      }\r\n    }\r\n    \r\n    //- rjf: draw hover debug box\r\n    if(hover_debug_box != &ui_nil_box)\r\n    {\r\n      FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code);\r\n      Vec2F32 p = ui_mouse();\r\n      dr_rect(hover_debug_box->rect, v4f32(1, 1, 1, 0.2f), 0, 0, 0);\r\n      dr_text(font, 12.f, 0, 0, FNT_RasterFlag_Hinted, p, v4f32(1, 1, 1, 1), push_str8f(scratch.arena, \"key: 0x%I64x\", hover_debug_box->key.u64[0]));\r\n      p.y += 20.f;\r\n      dr_text(font, 12.f, 0, 0, FNT_RasterFlag_Hinted, p, v4f32(1, 1, 1, 1), push_str8f(scratch.arena, \"string: '%S'\", hover_debug_box->string));\r\n      p.y += 20.f;\r\n    }\r\n    \r\n    //- rjf: draw border/overlay color to signify error\r\n    if(ws->error_t > 0.01f) UI_TagF(\"bad\")\r\n    {\r\n      Vec4F32 color = ui_color_from_name(str8_lit(\"text\"));\r\n      color.w *= ws->error_t;\r\n      Rng2F32 rect = os_client_rect_from_window(ws->os);\r\n      dr_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f);\r\n      dr_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.025f), 0, 0, 0);\r\n    }\r\n    \r\n    //- rjf: draw border/overlay color to signify rebinding\r\n    if(rd_state->bind_change_active) UI_TagF(\"pop\")\r\n    {\r\n      Vec4F32 color = ui_color_from_name(str8_lit(\"background\"));\r\n      Rng2F32 rect = os_client_rect_from_window(ws->os);\r\n      dr_rect(pad_2f32(rect, 24.f), color, 0, 16.f, 12.f);\r\n      dr_rect(rect, v4f32(color.x, color.y, color.z, color.w*0.025f), 0, 0, 0);\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: @window_frame_part update per-window frame counters/info\r\n  //\r\n  ws->frames_alive += 1;\r\n  ws->last_window_rect = os_client_rect_from_window(ws->os);\r\n  \r\n  ProfEnd();\r\n  scratch_end(scratch);\r\n}\r\n\r\n#if COMPILER_MSVC && !BUILD_DEBUG\r\nNO_OPTIMIZE_END\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Eval Visualization\r\n\r\ninternal String8\r\nrd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List strs = {0};\r\n  {\r\n    EV_StringIter *iter = ev_string_iter_begin(scratch.arena, eval, params);\r\n    F32 space_taken_px = 0;\r\n    for(String8 string = {0}; ev_string_iter_next(scratch.arena, iter, &string);)\r\n    {\r\n      if(space_taken_px > max_size)\r\n      {\r\n        str8_list_push(scratch.arena, &strs, str8_lit(\"...\"));\r\n        break;\r\n      }\r\n      else\r\n      {\r\n        str8_list_push(scratch.arena, &strs, string);\r\n        space_taken_px += fnt_dim_from_tag_size_string(font, font_size, 0, 0, string).x;\r\n      }\r\n    }\r\n  }\r\n  String8 result = str8_list_join(arena, &strs, 0);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Hover Eval\r\n\r\ninternal void\r\nrd_set_hover_eval(Vec2F32 pos, String8 string)\r\n{\r\n  CFG_Node *window_cfg = cfg_node_from_id(rd_regs()->window);\r\n  RD_WindowState *ws = rd_window_state_from_cfg(window_cfg);\r\n  if(ws->hover_eval_lastt_us < rd_state->time_in_us &&\r\n     ui_key_match(ui_active_key(UI_MouseButtonKind_Left), ui_key_zero()) &&\r\n     ui_key_match(ui_active_key(UI_MouseButtonKind_Middle), ui_key_zero()) &&\r\n     ui_key_match(ui_active_key(UI_MouseButtonKind_Right), ui_key_zero()))\r\n  {\r\n    B32 is_new_string = (!str8_match(ws->hover_eval_string, string, 0));\r\n    if(is_new_string)\r\n    {\r\n      ws->hover_eval_firstt_us = ws->hover_eval_lastt_us = rd_state->time_in_us;\r\n      arena_clear(ws->hover_eval_arena);\r\n      ws->hover_eval_string = push_str8_copy(ws->hover_eval_arena, string);\r\n      ws->hover_eval_focused = 0;\r\n    }\r\n    ws->hover_eval_spawn_pos = pos;\r\n    ws->hover_eval_lastt_us = rd_state->time_in_us;\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Autocompletion Lister\r\n\r\ninternal void\r\nrd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs)\r\n{\r\n  CFG_Node *window_cfg = cfg_node_from_id(rd_regs()->window);\r\n  RD_WindowState *ws = rd_window_state_from_cfg(window_cfg);\r\n  if(ws->autocomp_last_frame_index < rd_state->frame_index)\r\n  {\r\n    arena_clear(ws->autocomp_arena);\r\n    \r\n    //- rjf: calculate information about the cursor:\r\n    // * what list should we generate?\r\n    // * what string in the input should we replace?\r\n    // etc.\r\n    B32 is_allowed = 0;\r\n    RD_AutocompCursorInfo cursor_info = {0};\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      \r\n      // rjf: calculate most general list expression, given the dst_eval space\r\n      B32 force_allow = 0;\r\n      B32 expr_based_replace = 1;\r\n      String8 list_expr = str8_lit(\"query:locals, query:globals, query:thread_locals, query:procedures, query:types, query:constants\");\r\n      {\r\n        E_TypeKey maybe_enum_type = e_type_key_unwrap(dst_eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative & ~E_TypeUnwrapFlag_Enums);\r\n        if(dst_eval.space.kind == RD_EvalSpaceKind_MetaCfg)\r\n        {\r\n          CFG_Node *parent = rd_cfg_from_eval_space(dst_eval.space);\r\n          String8 child_key = e_string_from_id(dst_eval.space.u64s[1]);\r\n          MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, parent->string);\r\n          MD_Node *child_schema = &md_nil_node;\r\n          for(MD_NodePtrNode *n = schemas.first; n != 0 && md_node_is_nil(child_schema); n = n->next)\r\n          {\r\n            child_schema = md_child_from_string(n->v, child_key, 0);\r\n          }\r\n          if(str8_match(child_key, str8_lit(\"theme\"), 0))\r\n          {\r\n            list_expr = str8_lit(\"query:themes\");\r\n            expr_based_replace = 0;\r\n            force_allow = 1;\r\n          }\r\n          else if(!str8_match(child_schema->first->string, str8_lit(\"expr_string\"), 0))\r\n          {\r\n            MemoryZeroStruct(&list_expr);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: determine if autocompletion lister is allowed\r\n      is_allowed = (force_allow || rd_setting_b32_from_name(str8_lit(\"autocompletion_lister\")));\r\n      \r\n      // rjf: tighten list_expr, and filter / replaced-range, if needed\r\n      String8 filter = regs->string;\r\n      Rng1U64 replaced_range = r1u64(0, filter.size);\r\n      String8 callee_expr = {0};\r\n      U64 cursor_arg_idx = 0;\r\n      if(expr_based_replace)\r\n      {\r\n        U64 cursor_off = (U64)(regs->cursor.column-1);\r\n        E_Parse parse = e_parse_from_string(regs->string);\r\n        \r\n        //- rjf: cursor offset -> cursor containing node\r\n        E_Expr *cursor_expr = &e_expr_nil;\r\n        E_Expr *cursor_expr_parent = &e_expr_nil;\r\n        {\r\n          typedef struct ExprWalkTask ExprWalkTask;\r\n          struct ExprWalkTask\r\n          {\r\n            ExprWalkTask *next;\r\n            E_Expr *parent;\r\n            E_Expr *expr;\r\n            S32 depth;\r\n          };\r\n          ExprWalkTask start_task = {0, &e_expr_nil, parse.expr};\r\n          ExprWalkTask *first_task = &start_task;\r\n          ExprWalkTask *last_task = first_task;\r\n          S32 best_depth = 0;\r\n          for(E_Expr *chain = parse.expr->next; chain != &e_expr_nil; chain = chain->next)\r\n          {\r\n            ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);\r\n            SLLQueuePush(first_task, last_task, task);\r\n            task->parent = &e_expr_nil;\r\n            task->expr = chain;\r\n          }\r\n          for(ExprWalkTask *t = first_task; t != 0; t = t->next)\r\n          {\r\n            E_Expr *e = t->expr;\r\n            if(t->depth >= best_depth && (contains_1u64(e->range, cursor_off) || cursor_off == e->range.max))\r\n            {\r\n              cursor_expr_parent = t->parent;\r\n              cursor_expr = e;\r\n              best_depth = t->depth;\r\n            }\r\n            for(E_Expr *child = e->first; child != &e_expr_nil; child = child->next)\r\n            {\r\n              ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);\r\n              SLLQueuePush(first_task, last_task, task);\r\n              task->parent = e;\r\n              task->expr = child;\r\n              task->depth = t->depth+1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: cursor is within a call? -> generate an expression for the callee, determine\r\n        // which argument the cursor is on\r\n        if(cursor_expr_parent->kind == E_ExprKind_Call)\r\n        {\r\n          E_Key callee_key = e_key_from_expr(cursor_expr_parent->first);\r\n          callee_expr = e_full_expr_string_from_key(scratch.arena, callee_key);\r\n          for(E_Expr *arg = cursor_expr->prev; arg != cursor_expr_parent->first && arg != &e_expr_nil; arg = arg->prev)\r\n          {\r\n            cursor_arg_idx += 1;\r\n          }\r\n        }\r\n        else if(cursor_expr->kind == E_ExprKind_Call)\r\n        {\r\n          E_Key callee_key = e_key_from_expr(cursor_expr->first);\r\n          callee_expr = e_full_expr_string_from_key(scratch.arena, callee_key);\r\n          for(E_Expr *arg = cursor_expr->first->next; arg != &e_expr_nil; arg = arg->next)\r\n          {\r\n            cursor_arg_idx += 1;\r\n          }\r\n        }\r\n        \r\n        //- rjf: cursor is on right-hand-side of dot? -> show members of left-hand-side\r\n        B32 did_special_cursor_case = 0;\r\n        if(!did_special_cursor_case)\r\n        {\r\n          E_Expr *dot_expr = &e_expr_nil;\r\n          if(cursor_expr->kind == E_ExprKind_MemberAccess && cursor_off == cursor_expr->range.max)\r\n          {\r\n            dot_expr = cursor_expr;\r\n          }\r\n          else if(cursor_expr_parent->kind == E_ExprKind_MemberAccess && cursor_expr == cursor_expr_parent->first->next)\r\n          {\r\n            dot_expr = cursor_expr_parent;\r\n          }\r\n          if(dot_expr != &e_expr_nil)\r\n          {\r\n            did_special_cursor_case = 1;\r\n            E_Eval lhs_eval = e_eval_from_expr(dot_expr->first);\r\n            E_Eval type_of_lhs_eval = e_eval_wrapf(lhs_eval, \"typeof($)\");\r\n            list_expr = e_full_expr_string_from_key(scratch.arena, type_of_lhs_eval.key);\r\n            filter = cursor_expr->string;\r\n            replaced_range = union_1u64(dot_expr->range, cursor_expr->range);\r\n          }\r\n        }\r\n        \r\n        //- rjf: cursor is on a leaf-identifier? -> replace just that identifier, keep the original list expression\r\n        if(!did_special_cursor_case && cursor_expr->kind == E_ExprKind_LeafIdentifier)\r\n        {\r\n          did_special_cursor_case = 1;\r\n          filter = str8_prefix(cursor_expr->string, cursor_off - cursor_expr->range.min);\r\n          replaced_range = cursor_expr->range;\r\n        }\r\n      }\r\n      \r\n      // rjf: try to map the cursor, within a call, to some schema\r\n      MD_Node *arg_schema = &md_nil_node;\r\n      if(callee_expr.size != 0)\r\n      {\r\n        E_Eval callee_eval = e_eval_from_string(callee_expr);\r\n        E_Type *callee_type = e_type_from_key(callee_eval.irtree.type_key);\r\n        if(callee_type->kind == E_TypeKind_LensSpec)\r\n        {\r\n          U64 arg_idx = 0;\r\n          MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, callee_type->name);\r\n          for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)\r\n          {\r\n            MD_Node *schema = n->v;\r\n            for MD_EachNode(child, schema->first)\r\n            {\r\n              if(!md_node_has_tag(child, str8_lit(\"no_callee_helper\"), 0))\r\n              {\r\n                if(cursor_arg_idx == arg_idx)\r\n                {\r\n                  arg_schema = child;\r\n                  goto end_schema_search;\r\n                }\r\n                arg_idx += 1;\r\n              }\r\n            }\r\n          }\r\n          end_schema_search:;\r\n        }\r\n      }\r\n      \r\n      // rjf: fill bundle\r\n      cursor_info.list_expr = push_str8_copy(ws->autocomp_arena, list_expr);\r\n      cursor_info.filter = push_str8_copy(ws->autocomp_arena, filter);\r\n      cursor_info.replaced_range = replaced_range;\r\n      cursor_info.callee_expr = push_str8_copy(ws->autocomp_arena, callee_expr);\r\n      cursor_info.arg_schema = arg_schema;\r\n      \r\n      scratch_end(scratch);\r\n    }\r\n    \r\n    //- rjf: commit autocompletion info\r\n    if(is_allowed)\r\n    {\r\n      ws->autocomp_last_frame_index = rd_state->frame_index;\r\n      ws->autocomp_regs = rd_regs_copy(ws->autocomp_arena, regs);\r\n      ws->autocomp_cursor_info = cursor_info;\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Colors, Fonts, Config\r\n\r\n//- rjf: colors\r\n\r\ninternal MD_Node *\r\nrd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  MD_Node *theme_tree = &md_nil_node;\r\n  if(theme_name.size != 0)\r\n  {\r\n    for EachEnumVal(RD_ThemePreset, p)\r\n    {\r\n      if(str8_match(theme_name, rd_theme_preset_display_string_table[p], 0))\r\n      {\r\n        theme_tree = rd_state->theme_preset_trees[p];\r\n        break;\r\n      }\r\n    }\r\n    if(theme_tree == &md_nil_node)\r\n    {\r\n      String8 path = push_str8f(scratch.arena, \"%S/raddbg/themes/%S\", os_get_process_info()->user_program_data_path, theme_name);\r\n      U64 endt_us = os_now_microseconds()+100;\r\n      if(rd_state->frame_index <= 5)\r\n      {\r\n        endt_us = os_now_microseconds()+50000;\r\n      }\r\n      U128 hash = fs_hash_from_path_range(path, r1u64(0, max_U64), endt_us);\r\n      String8 data = c_data_from_hash(access, hash);\r\n      theme_tree = md_tree_from_string(arena, data);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return theme_tree;\r\n}\r\n\r\ninternal Vec4F32\r\nrd_rgba_from_code_color_slot(RD_CodeColorSlot slot)\r\n{\r\n  RD_WindowState *ws = rd_window_state_from_cfg(cfg_node_from_id(rd_regs()->window));\r\n  Vec4F32 result = ws->theme_code_colors[slot];\r\n  return result;\r\n}\r\n\r\ninternal RD_CodeColorSlot\r\nrd_code_color_slot_from_txt_token_kind(TXT_TokenKind kind)\r\n{\r\n  RD_CodeColorSlot color = RD_CodeColorSlot_CodeDefault;\r\n  switch(kind)\r\n  {\r\n    default:break;\r\n    case TXT_TokenKind_Keyword:{color = RD_CodeColorSlot_CodeKeyword;}break;\r\n    case TXT_TokenKind_Numeric:{color = RD_CodeColorSlot_CodeNumeric;}break;\r\n    case TXT_TokenKind_String: {color = RD_CodeColorSlot_CodeString;}break;\r\n    case TXT_TokenKind_Meta:   {color = RD_CodeColorSlot_CodeMeta;}break;\r\n    case TXT_TokenKind_Comment:{color = RD_CodeColorSlot_CodeComment;}break;\r\n    case TXT_TokenKind_Symbol: {color = RD_CodeColorSlot_CodeDelimiterOperator;}break;\r\n  }\r\n  return color;\r\n}\r\n\r\ninternal RD_CodeColorSlot\r\nrd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string)\r\n{\r\n  RD_CodeColorSlot color = RD_CodeColorSlot_CodeDefault;\r\n  if(kind == TXT_TokenKind_Identifier || kind == TXT_TokenKind_Keyword)\r\n  {\r\n    B32 mapped = 0;\r\n    \r\n    // rjf: try to map as local\r\n    if(!mapped && kind == TXT_TokenKind_Identifier)\r\n    {\r\n      U64 local_num = e_num_from_string(e_ir_ctx->locals_map, string);\r\n      if(local_num != 0)\r\n      {\r\n        mapped = 1;\r\n        color = RD_CodeColorSlot_CodeLocal;\r\n      }\r\n    }\r\n    \r\n    // rjf: try to map as member\r\n    if(!mapped && kind == TXT_TokenKind_Identifier)\r\n    {\r\n      U64 member_num = e_num_from_string(e_ir_ctx->member_map, string);\r\n      if(member_num != 0)\r\n      {\r\n        mapped = 1;\r\n        color = RD_CodeColorSlot_CodeLocal;\r\n      }\r\n    }\r\n    \r\n    // rjf: try to map as register\r\n    if(!mapped)\r\n    {\r\n      U64 reg_num = e_num_from_string(e_ir_ctx->regs_map, string);\r\n      if(reg_num != 0)\r\n      {\r\n        mapped = 1;\r\n        color = RD_CodeColorSlot_CodeRegister;\r\n      }\r\n    }\r\n    \r\n    // rjf: try to map as register alias\r\n    if(!mapped)\r\n    {\r\n      U64 alias_num = e_num_from_string(e_ir_ctx->reg_alias_map, string);\r\n      if(alias_num != 0)\r\n      {\r\n        mapped = 1;\r\n        color = RD_CodeColorSlot_CodeRegister;\r\n      }\r\n    }\r\n    \r\n    // rjf: try to map using asynchronous matching system\r\n    if(!mapped && kind == TXT_TokenKind_Identifier)\r\n    {\r\n      DI_Match match = di_match_from_string(string, 0, di_key_zero(), 0);\r\n      RDI_SectionKind section_kind = match.section_kind;\r\n      mapped = 1;\r\n      switch(section_kind)\r\n      {\r\n        default:{mapped = 0;}break;\r\n        case RDI_SectionKind_Procedures:\r\n        case RDI_SectionKind_GlobalVariables:\r\n        case RDI_SectionKind_ThreadVariables:\r\n        {\r\n          color = RD_CodeColorSlot_CodeSymbol;\r\n        }break;\r\n        case RDI_SectionKind_TypeNodes:\r\n        {\r\n          color = RD_CodeColorSlot_CodeType;\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  return color;\r\n}\r\n\r\n//- rjf: fonts/sizes\r\n\r\ninternal F32\r\nrd_font_size(void)\r\n{\r\n  F32 size = rd_setting_f32_from_name(str8_lit(\"font_size\"));\r\n  size = Clamp(6.f, size, 72.f);\r\n  return size;\r\n}\r\n\r\ninternal FNT_Tag\r\nrd_font_from_slot(RD_FontSlot slot)\r\n{\r\n  FNT_Tag tag = rd_state->font_slot_table[slot];\r\n  return tag;\r\n}\r\n\r\ninternal FNT_RasterFlags\r\nrd_raster_flags_from_slot(RD_FontSlot slot)\r\n{\r\n  CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n  RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n  FNT_RasterFlags flags = ws->font_slot_raster_flags[slot];\r\n  return flags;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Control Info Stringification\r\n\r\ninternal String8\r\nrd_string_from_exception_code(U32 code)\r\n{\r\n  String8 string = {0};\r\n  for EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k)\r\n  {\r\n    if(code == ctrl_exception_code_kind_code_table[k])\r\n    {\r\n      string = ctrl_exception_code_kind_display_string_table[k];\r\n      break;\r\n    }\r\n  }\r\n  return string;\r\n}\r\n\r\ninternal DR_FStrList\r\nrd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event)\r\n{\r\n  CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, event->entity);\r\n  DR_FStrList thread_fstrs = rd_title_fstrs_from_ctrl_entity(arena, thread, 0);\r\n  DR_FStrList fstrs = {0};\r\n  DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n  switch(event->cause)\r\n  {\r\n    default:\r\n    {\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"Not running\"));\r\n    }break;\r\n    \r\n    //- rjf: finished operation; if active thread, completed thread, otherwise we're just stopped\r\n    case CTRL_EventCause_Finished:\r\n    {\r\n      if(thread != &ctrl_entity_nil)\r\n      {\r\n        dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" completed step\"));\r\n      }\r\n      else\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"Stopped\"));\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: stopped at entry point\r\n    case CTRL_EventCause_EntryPoint:\r\n    {\r\n      if(thread != &ctrl_entity_nil)\r\n      {\r\n        dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" stopped at entry point\"));\r\n      }\r\n      else\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"Stopped at entry point\"));\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: user breakpoint\r\n    case CTRL_EventCause_UserBreakpoint:\r\n    {\r\n      if(thread != &ctrl_entity_nil)\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params, rd_icon_kind_text_table[RD_IconKind_CircleFilled], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n        dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit a breakpoint\"));\r\n        if(event->vaddr_rng.min != 0)\r\n        {\r\n          dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" (Address: \"));\r\n          dr_fstrs_push_new(arena, &fstrs, &params, push_str8f(arena, \"0x%I64x\", event->vaddr_rng.min),\r\n                            .font = rd_font_from_slot(RD_FontSlot_Code),\r\n                            .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code));\r\n          dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\")\"));\r\n        }\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: exception\r\n    case CTRL_EventCause_InterruptedByException:\r\n    {\r\n      if(thread != &ctrl_entity_nil)\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params, rd_icon_kind_text_table[RD_IconKind_WarningBig], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n        switch(event->exception_kind)\r\n        {\r\n          default:\r\n          {\r\n            dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit an exception: \"));\r\n            String8 exception_code_string = str8_from_u64(arena, event->exception_code, 16, 0, 0);\r\n            String8 exception_explanation_string = rd_string_from_exception_code(event->exception_code);\r\n            String8 exception_info_string = push_str8f(arena, \"%S%s%S%s\",\r\n                                                       exception_code_string,\r\n                                                       exception_explanation_string.size != 0 ? \" (\" : \"\",\r\n                                                       exception_explanation_string,\r\n                                                       exception_explanation_string.size != 0 ? \")\" : \"\");\r\n            dr_fstrs_push_new(arena, &fstrs, &params, exception_info_string);\r\n          }break;\r\n          case CTRL_ExceptionKind_CppThrow:\r\n          {\r\n            dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit a C++ exception: \"));\r\n            String8 exception_code_string = str8_from_u64(arena, event->exception_code, 16, 0, 0);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, exception_code_string);\r\n          }break;\r\n          case CTRL_ExceptionKind_MemoryRead:\r\n          {\r\n            dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit an exception: \"));\r\n            String8 exception_info_string = push_str8f(arena, \"Access violation reading from address 0x%I64x\", event->vaddr_rng.min);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, exception_info_string);\r\n          }break;\r\n          case CTRL_ExceptionKind_MemoryWrite:\r\n          {\r\n            dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit an exception: \"));\r\n            String8 exception_info_string = push_str8f(arena, \"Access violation writing to address 0x%I64x\", event->vaddr_rng.min);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, exception_info_string);\r\n          }break;\r\n          case CTRL_ExceptionKind_MemoryExecute:\r\n          {\r\n            dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit an exception: \"));\r\n            String8 exception_code_string = str8_from_u64(arena, event->exception_code, 16, 0, 0);\r\n            String8 exception_info_string = push_str8f(arena, \"Access violation executing at address 0x%I64x\", event->vaddr_rng.min);\r\n            dr_fstrs_push_new(arena, &fstrs, &params, exception_info_string);\r\n          }break;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params, rd_icon_kind_text_table[RD_IconKind_WarningBig], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n        dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  Hit an exception: \"));\r\n        String8 exception_code_string = str8_from_u64(arena, event->exception_code, 16, 0, 0);\r\n        String8 exception_explanation_string = rd_string_from_exception_code(event->exception_code);\r\n        String8 exception_info_string = push_str8f(arena, \"%S%s%S%s\",\r\n                                                   exception_code_string,\r\n                                                   exception_explanation_string.size != 0 ? \" (\" : \"\",\r\n                                                   exception_explanation_string,\r\n                                                   exception_explanation_string.size != 0 ? \")\" : \"\");\r\n        dr_fstrs_push_new(arena, &fstrs, &params, exception_info_string);\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: trap\r\n    case CTRL_EventCause_InterruptedByTrap:\r\n    {\r\n      dr_fstrs_push_new(arena, &fstrs, &params, rd_icon_kind_text_table[RD_IconKind_WarningBig], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n      dr_fstrs_concat_in_place(&fstrs, &thread_fstrs);\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" hit a trap\"));\r\n    }break;\r\n    \r\n    //- rjf: halt\r\n    case CTRL_EventCause_InterruptedByHalt:\r\n    {\r\n      dr_fstrs_push_new(arena, &fstrs, &params, rd_icon_kind_text_table[RD_IconKind_Pause], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons));\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  Halted\"));\r\n    }break;\r\n  }\r\n  return fstrs;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Vocab Info Lookups\r\n\r\ninternal RD_VocabInfo *\r\nrd_vocab_info_from_code_name(String8 code_name)\r\n{\r\n  RD_VocabInfo *result = &rd_nil_vocab_info;\r\n  if(code_name.size != 0)\r\n  {\r\n    U64 hash = d_hash_from_string(code_name);\r\n    U64 slot_idx = hash%rd_state->vocab_info_map.single_slots_count;\r\n    for(RD_VocabInfoMapNode *n = rd_state->vocab_info_map.single_slots[slot_idx].first;\r\n        n != 0;\r\n        n = n->single_next)\r\n    {\r\n      if(str8_match(n->v.code_name, code_name, 0))\r\n      {\r\n        result = &n->v;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RD_VocabInfo *\r\nrd_vocab_info_from_code_name_plural(String8 code_name_plural)\r\n{\r\n  RD_VocabInfo *result = &rd_nil_vocab_info;\r\n  if(code_name_plural.size != 0)\r\n  {\r\n    U64 hash = d_hash_from_string(code_name_plural);\r\n    U64 slot_idx = hash%rd_state->vocab_info_map.plural_slots_count;\r\n    for(RD_VocabInfoMapNode *n = rd_state->vocab_info_map.plural_slots[slot_idx].first;\r\n        n != 0;\r\n        n = n->plural_next)\r\n    {\r\n      if(str8_match(n->v.code_name_plural, code_name_plural, 0))\r\n      {\r\n        result = &n->v;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Continuous Frame Requests\r\n\r\ninternal void\r\nrd_request_frame(void)\r\n{\r\n  rd_state->num_frames_requested = 4;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Accessors\r\n\r\n//- rjf: per-frame arena\r\n\r\ninternal Arena *\r\nrd_frame_arena(void)\r\n{\r\n  return rd_state->frame_arenas[rd_state->frame_index%ArrayCount(rd_state->frame_arenas)];\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Registers\r\n\r\ninternal RD_Regs *\r\nrd_push_regs_(RD_Regs *regs)\r\n{\r\n  RD_RegsNode *n = push_array(rd_frame_arena(), RD_RegsNode, 1);\r\n  rd_regs_copy_contents(rd_frame_arena(), &n->v, regs);\r\n  SLLStackPush(rd_state->top_regs, n);\r\n  return &n->v;\r\n}\r\n\r\ninternal RD_Regs *\r\nrd_pop_regs(void)\r\n{\r\n  RD_Regs *regs = &rd_state->top_regs->v;\r\n  SLLStackPop(rd_state->top_regs);\r\n  if(rd_state->top_regs == 0)\r\n  {\r\n    rd_state->top_regs = &rd_state->base_regs;\r\n  }\r\n  return regs;\r\n}\r\n\r\ninternal void\r\nrd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 string)\r\n{\r\n  switch(slot)\r\n  {\r\n    //- rjf: basic string cases\r\n    default:\r\n    case RD_RegSlot_String:\r\n    case RD_RegSlot_FilePath:\r\n    {\r\n      String8TxtPtPair pair = str8_txt_pt_pair_from_string(string);\r\n      rd_regs()->string = push_str8_copy(rd_frame_arena(), string);\r\n      if(pair.pt.line != 0)\r\n      {\r\n        rd_regs()->file_path = push_str8_copy(rd_frame_arena(), pair.string);\r\n        rd_regs()->cursor = pair.pt;\r\n      }\r\n    }break;\r\n    case RD_RegSlot_Expr:\r\n    {\r\n      rd_regs()->expr = push_str8_copy(rd_frame_arena(), string);\r\n    }break;\r\n    case RD_RegSlot_CmdName:\r\n    {\r\n      rd_regs()->cmd_name = push_str8_copy(rd_frame_arena(), string);\r\n    }break;\r\n    \r\n    //- rjf: ctrl entities\r\n    case RD_RegSlot_Machine:\r\n    case RD_RegSlot_Module:\r\n    case RD_RegSlot_Process:\r\n    case RD_RegSlot_Thread:\r\n    case RD_RegSlot_CtrlEntity:\r\n    {\r\n      \r\n    }break;\r\n    \r\n    //- rjf: cfgs\r\n    case RD_RegSlot_Cfg:\r\n    case RD_RegSlot_Window:\r\n    case RD_RegSlot_Panel:\r\n    case RD_RegSlot_Tab:\r\n    case RD_RegSlot_View:\r\n    case RD_RegSlot_PrevTab:\r\n    case RD_RegSlot_DstPanel:\r\n    {\r\n      B32 good = 0;\r\n      if(!good && str8_match(str8_prefix(string, 1), str8_lit(\"$\"), 0))\r\n      {\r\n        String8 numeric_part = str8_skip(string, 1);\r\n        CFG_ID id = u64_from_str8(numeric_part, 16);\r\n        rd_regs()->cfg = id;\r\n        good = 1;\r\n      }\r\n      if(!good && query_expr.size != 0)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        CFG_Node *immediate = rd_immediate_cfg_from_keyf(\"###regs_fill_slot_view\");\r\n        CFG_Node *view = cfg_node_newf(rd_state->cfg, immediate, \"watch\");\r\n        cfg_node_newf(rd_state->cfg, view, \"lister\");\r\n        RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n        EV_View *eval_view = vs->ev_view;\r\n        {\r\n          ev_key_set_expansion(eval_view, ev_key_root(), ev_key_make(ev_hash_from_key(ev_key_root()), 1), 1);\r\n          E_Eval eval = e_eval_from_string(query_expr);\r\n          EV_BlockTree block_tree = {0};\r\n          EV_BlockRangeList block_ranges = {0};\r\n          // TODO(rjf): @cleanup we only need to do this because we implicitly use\r\n          // view info in the block tree build via raddbg-layer eval hooks, but we\r\n          // should really keep all parameterization info in eval views themselves,\r\n          // to not couple block tree building with frontend state...\r\n          RD_RegsScope(.window = 0, .panel = 0, .view = view->id)\r\n          {\r\n            block_tree = ev_block_tree_from_eval(scratch.arena, eval_view, string, eval);\r\n            block_ranges = ev_block_range_list_from_tree(scratch.arena, &block_tree);\r\n            if(block_ranges.first != 0)\r\n            {\r\n              block_ranges.count -= 1;\r\n              block_ranges.first = block_ranges.first->next;\r\n            }\r\n          }\r\n          EV_Row *row = ev_row_from_num(scratch.arena, eval_view, &block_ranges, 1);\r\n          rd_regs()->cfg = rd_cfg_from_eval_space(row->eval.space)->id;\r\n          good = (rd_regs()->cfg != 0);\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n      if(!good)\r\n      {\r\n        E_Eval eval = e_eval_from_string(string);\r\n        rd_regs()->cfg = rd_cfg_from_eval_space(eval.space)->id;\r\n        good = (rd_regs()->cfg != 0);\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: line numbers\r\n    case RD_RegSlot_Cursor:\r\n    {\r\n      E_Eval eval = e_value_eval_from_eval(e_eval_from_string(string));\r\n      if(eval.msgs.max_kind == E_MsgKind_Null)\r\n      {\r\n        rd_regs()->cursor.column = 1;\r\n        rd_regs()->cursor.line   = (S64)eval.value.u64;\r\n      }\r\n      else\r\n      {\r\n        log_user_errorf(\"Couldn't interpret \\\"`%S`\\\" as a line number.\", string);\r\n      }\r\n    }break;\r\n    case RD_RegSlot_Vaddr: goto use_numeric_eval;\r\n    case RD_RegSlot_Voff: goto use_numeric_eval;\r\n    case RD_RegSlot_UnwindCount: goto use_numeric_eval;\r\n    case RD_RegSlot_InlineDepth: goto use_numeric_eval;\r\n    case RD_RegSlot_PID: goto use_numeric_eval;\r\n    use_numeric_eval:\r\n    {\r\n      E_Eval eval = e_eval_from_string(string);\r\n      if(eval.msgs.max_kind == E_MsgKind_Null)\r\n      {\r\n        E_TypeKind eval_type_kind = e_type_kind_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative));\r\n        if(eval_type_kind == E_TypeKind_Ptr ||\r\n           eval_type_kind == E_TypeKind_LRef ||\r\n           eval_type_kind == E_TypeKind_RRef ||\r\n           e_space_match(eval.space, e_base_ctx->thread_reg_space))\r\n        {\r\n          eval = e_value_eval_from_eval(eval);\r\n        }\r\n        U64 u64 = eval.value.u64;\r\n        MemoryCopy((U8 *)(rd_regs()) + rd_reg_slot_range_table[slot].min, &u64, dim_1u64(rd_reg_slot_range_table[slot]));\r\n      }\r\n      else\r\n      {\r\n        log_user_errorf(\"Couldn't evaluate `%S` as an address.\", string);\r\n      }\r\n    }break;\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Commands\r\n\r\n//- rjf: name -> info\r\n\r\ninternal RD_CmdKind\r\nrd_cmd_kind_from_string(String8 string)\r\n{\r\n  RD_CmdKind result = RD_CmdKind_Null;\r\n  for(U64 idx = 0; idx < ArrayCount(rd_cmd_kind_info_table); idx += 1)\r\n  {\r\n    if(str8_match(string, rd_cmd_kind_info_table[idx].string, 0))\r\n    {\r\n      result = (RD_CmdKind)idx;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RD_CmdKindInfo *\r\nrd_cmd_kind_info_from_string(String8 string)\r\n{\r\n  RD_CmdKindInfo *info = &rd_nil_cmd_kind_info;\r\n  {\r\n    // TODO(rjf): @dynamic_cmds extend this by looking up into dynamically-registered commands by views\r\n    RD_CmdKind kind = rd_cmd_kind_from_string(string);\r\n    if(kind != RD_CmdKind_Null)\r\n    {\r\n      info = &rd_cmd_kind_info_table[kind];\r\n    }\r\n  }\r\n  return info;\r\n}\r\n\r\n//- rjf: pushing\r\n\r\ninternal void\r\nrd_push_cmd(String8 name, RD_Regs *regs)\r\n{\r\n  rd_cmd_list_push_new(rd_state->cmds_arenas[0], &rd_state->cmds[0], name, regs);\r\n}\r\n\r\n//- rjf: iterating\r\n\r\ninternal B32\r\nrd_next_cmd(RD_Cmd **cmd)\r\n{\r\n  U64 slot = rd_state->cmds_gen%ArrayCount(rd_state->cmds);\r\n  RD_CmdNode *start_node = rd_state->cmds[slot].first;\r\n  if(cmd[0] != 0)\r\n  {\r\n    start_node = CastFromMember(RD_CmdNode, cmd, cmd[0]);\r\n    start_node = start_node->next;\r\n  }\r\n  cmd[0] = 0;\r\n  if(start_node != 0)\r\n  {\r\n    cmd[0] = &start_node->cmd;\r\n  }\r\n  return !!cmd[0];\r\n}\r\n\r\ninternal B32\r\nrd_next_view_cmd(RD_Cmd **cmd)\r\n{\r\n  for(;rd_next_cmd(cmd);)\r\n  {\r\n    if(rd_regs()->view == cmd[0]->regs->view)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  B32 result = !!cmd[0];\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Top-Level Calls\r\n\r\n#if !defined(STBI_INCLUDE_STB_IMAGE_H)\r\n# define STB_IMAGE_IMPLEMENTATION\r\n# define STBI_ONLY_PNG\r\n# define STBI_ONLY_BMP\r\n# include \"third_party/stb/stb_image.h\"\r\n#endif\r\n\r\ninternal void\r\nrd_init(CmdLine *cmdln)\r\n{\r\n  ProfBeginFunction();\r\n  Arena *arena = arena_alloc();\r\n  rd_state = push_array(arena, RD_State, 1);\r\n  rd_state->arena = arena;\r\n  rd_state->quit_after_success = (cmd_line_has_flag(cmdln, str8_lit(\"quit_after_success\")) ||\r\n                                  cmd_line_has_flag(cmdln, str8_lit(\"q\")));\r\n  rd_state->user_path_arena = arena_alloc();\r\n  rd_state->project_path_arena = arena_alloc();\r\n  rd_state->theme_path_arena = arena_alloc();\r\n  rd_state->user_cfg_string_key      = c_key_make(c_root_alloc(), c_id_make(0, 0));\r\n  rd_state->project_cfg_string_key   = c_key_make(c_root_alloc(), c_id_make(0, 0));\r\n  rd_state->cmdln_cfg_string_key     = c_key_make(c_root_alloc(), c_id_make(0, 0));\r\n  rd_state->transient_cfg_string_key = c_key_make(c_root_alloc(), c_id_make(0, 0));\r\n  for(U64 idx = 0; idx < ArrayCount(rd_state->frame_arenas); idx += 1)\r\n  {\r\n    rd_state->frame_arenas[idx] = arena_alloc();\r\n  }\r\n  rd_state->log = log_alloc();\r\n  log_select(rd_state->log);\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 user_program_data_path = os_get_process_info()->user_program_data_path;\r\n    String8 user_data_folder = push_str8f(scratch.arena, \"%S/raddbg/logs\", user_program_data_path);\r\n    rd_state->log_path = push_str8f(rd_state->arena, \"%S/ui_thread.raddbg_log\", user_data_folder);\r\n    os_make_directory(user_data_folder);\r\n    os_write_data_to_file_path(rd_state->log_path, str8_zero());\r\n    scratch_end(scratch);\r\n  }\r\n  rd_state->num_frames_requested = 2;\r\n  rd_state->seconds_until_autosave = 0.5f;\r\n  rd_state->eval_cache = e_cache_alloc();\r\n  for(U64 idx = 0; idx < ArrayCount(rd_state->cmds_arenas); idx += 1)\r\n  {\r\n    rd_state->cmds_arenas[idx] = arena_alloc();\r\n  }\r\n  rd_state->cmd_output_arena = arena_alloc();\r\n  rd_state->popup_arena = arena_alloc();\r\n  rd_state->ctx_menu_key = ui_key_from_string(ui_key_zero(), str8_lit(\"top_level_ctx_menu\"));\r\n  rd_state->drop_completion_key = ui_key_from_string(ui_key_zero(), str8_lit(\"drop_completion_ctx_menu\"));\r\n  rd_state->bind_change_arena = arena_alloc();\r\n  rd_state->drag_drop_arena = arena_alloc();\r\n  rd_state->drag_drop_regs = push_array(rd_state->drag_drop_arena, RD_Regs, 1);\r\n  rd_state->top_regs = &rd_state->base_regs;\r\n  \r\n  // rjf: set up schemas\r\n  {\r\n    rd_state->cfg_schema_table = push_array(rd_state->arena, CFG_SchemaTable, 1);\r\n    rd_state->cfg_schema_table->slots_count = 4096;\r\n    rd_state->cfg_schema_table->slots = push_array(rd_state->arena, CFG_SchemaNode *, rd_state->cfg_schema_table->slots_count);\r\n    for EachElement(idx, rd_name_schema_info_table)\r\n    {\r\n      MD_Node *schema = md_tree_from_string(rd_state->arena, rd_name_schema_info_table[idx].schema)->first;\r\n      cfg_schema_table_insert(rd_state->arena, rd_state->cfg_schema_table, rd_name_schema_info_table[idx].name, schema);\r\n    }\r\n  }\r\n  \r\n  // rjf: set up theme presets\r\n  {\r\n    for EachEnumVal(RD_ThemePreset, p)\r\n    {\r\n      rd_state->theme_preset_trees[p] = md_tree_from_string(rd_state->arena, rd_theme_preset_cfg_string_table[p])->first;\r\n    }\r\n  }\r\n  \r\n  // rjf: set up vocab info map\r\n  {\r\n    rd_state->vocab_info_map.single_slots_count = 1024;\r\n    rd_state->vocab_info_map.single_slots = push_array(rd_state->arena, RD_VocabInfoMapSlot, rd_state->vocab_info_map.single_slots_count);\r\n    rd_state->vocab_info_map.plural_slots_count = 1024;\r\n    rd_state->vocab_info_map.plural_slots = push_array(rd_state->arena, RD_VocabInfoMapSlot, rd_state->vocab_info_map.plural_slots_count);\r\n    for EachElement(idx, rd_vocab_info_table)\r\n    {\r\n      RD_VocabInfoMapNode *n = push_array(rd_state->arena, RD_VocabInfoMapNode, 1);\r\n      MemoryCopyStruct(&n->v, &rd_vocab_info_table[idx]);\r\n      U64 single_hash = d_hash_from_string(n->v.code_name);\r\n      U64 plural_hash = d_hash_from_string(n->v.code_name_plural);\r\n      U64 single_slot_idx = single_hash%rd_state->vocab_info_map.single_slots_count;\r\n      U64 plural_slot_idx = plural_hash%rd_state->vocab_info_map.plural_slots_count;\r\n      if(n->v.code_name.size != 0)\r\n      {\r\n        SLLQueuePush_N(rd_state->vocab_info_map.single_slots[single_slot_idx].first, rd_state->vocab_info_map.single_slots[single_slot_idx].last, n, single_next);\r\n      }\r\n      if(n->v.code_name_plural.size != 0)\r\n      {\r\n        SLLQueuePush_N(rd_state->vocab_info_map.plural_slots[plural_slot_idx].first, rd_state->vocab_info_map.plural_slots[plural_slot_idx].last, n, plural_next);\r\n      }\r\n    }\r\n  }\r\n  \r\n  // rjf: set up top-level config entity trees & tables\r\n  {\r\n    rd_state->cfg = cfg_state_alloc();\r\n    cfg_ctx_select(cfg_state_ctx(rd_state->cfg));\r\n    cfg_node_new(rd_state->cfg, cfg_node_root(), str8_lit(\"user\"));\r\n    cfg_node_new(rd_state->cfg, cfg_node_root(), str8_lit(\"project\"));\r\n    cfg_node_new(rd_state->cfg, cfg_node_root(), str8_lit(\"command_line\"));\r\n    cfg_node_new(rd_state->cfg, cfg_node_root(), str8_lit(\"transient\"));\r\n  }\r\n  \r\n  // rjf: set up loaded debug info cache\r\n  {\r\n    rd_state->loaded_dbg_info_slots_count = 4096;\r\n    rd_state->loaded_dbg_info_slots = push_array(arena, RD_LoadedDbgInfoSlot, rd_state->loaded_dbg_info_slots_count);\r\n  }\r\n  \r\n  // rjf: set up window cache\r\n  {\r\n    rd_state->window_state_slots_count = 64;\r\n    rd_state->window_state_slots = push_array(arena, RD_WindowStateSlot, rd_state->window_state_slots_count);\r\n    rd_state->first_window_state = rd_state->last_window_state = &rd_nil_window_state;\r\n  }\r\n  \r\n  // rjf: set up view cache\r\n  {\r\n    rd_state->view_state_slots_count = 4096;\r\n    rd_state->view_state_slots = push_array(arena, RD_ViewStateSlot, rd_state->view_state_slots_count);\r\n  }\r\n  \r\n  //- rjf: setup initial target from command line args\r\n  String8 implicit_user_arg = {0};\r\n  String8 implicit_project_arg = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8List target_args = {0};\r\n    {\r\n      B32 after_first_non_flag = 0;\r\n      for(U64 idx = 1; idx < cmdln->argc; idx += 1)\r\n      {\r\n        String8 arg = str8_cstring(cmdln->argv[idx]);\r\n        B32 is_flag = (str8_match(str8_prefix(arg, 1), str8_lit(\"-\"), 0) ||\r\n                       str8_match(str8_prefix(arg, 1), str8_lit(\"--\"), 0) ||\r\n                       str8_match(str8_prefix(arg, 1), str8_lit(\"/\"), 0));\r\n        B32 is_cfg = 0;\r\n        if(!is_flag && !after_first_non_flag)\r\n        {\r\n          OS_Handle file = os_file_open(OS_AccessFlag_Read|OS_AccessFlag_ShareRead, arg);\r\n          U8 raddbg_cfg_magic[] = \"// raddbg \";\r\n          U8 file_magic_maybe[ArrayCount(raddbg_cfg_magic)] = {0};\r\n          os_file_read(file, r1u64(0, 10), file_magic_maybe);\r\n          if(MemoryMatchArray(raddbg_cfg_magic, file_magic_maybe))\r\n          {\r\n            is_cfg = 1;\r\n            U8 header_suffix_buffer[256] = {0};\r\n            String8 header_suffix = {0};\r\n            header_suffix.str = header_suffix_buffer;\r\n            header_suffix.size = os_file_read(file, r1u64(10, 10+256), header_suffix_buffer);\r\n            String8 header_type_suffix = str8_skip(header_suffix, str8_find_needle(header_suffix, 0, str8_lit(\" \"), 0)+1);\r\n            if(str8_match(header_type_suffix, str8_lit(\"user\"), StringMatchFlag_RightSideSloppy))\r\n            {\r\n              implicit_user_arg = arg;\r\n            }\r\n            else if(str8_match(header_type_suffix, str8_lit(\"project\"), StringMatchFlag_RightSideSloppy))\r\n            {\r\n              implicit_project_arg = arg;\r\n            }\r\n          }\r\n          os_file_close(file);\r\n        }\r\n        if(!is_flag)\r\n        {\r\n          after_first_non_flag = 1;\r\n        }\r\n        if(after_first_non_flag && !is_cfg)\r\n        {\r\n          str8_list_push(scratch.arena, &target_args, arg);\r\n        }\r\n      }\r\n    }\r\n    if(target_args.node_count > 0 && target_args.first->string.size != 0)\r\n    {\r\n      //- rjf: unpack command line inputs\r\n      String8 executable_name_string = {0};\r\n      String8 arguments_string = {0};\r\n      String8 working_directory_string = {0};\r\n      {\r\n        // rjf: unpack full executable path\r\n        if(target_args.first->string.size != 0)\r\n        {\r\n          String8 exe_name = target_args.first->string;\r\n          PathStyle style = path_style_from_str8(exe_name);\r\n          if(style == PathStyle_Relative)\r\n          {\r\n            String8 current_path = os_get_current_path(scratch.arena);\r\n            exe_name = push_str8f(scratch.arena, \"%S/%S\", current_path, exe_name);\r\n            exe_name = path_normalized_from_string(scratch.arena, exe_name);\r\n          }\r\n          executable_name_string = exe_name;\r\n        }\r\n        \r\n        // rjf: get current directory, use as working directory\r\n        {\r\n          working_directory_string = path_normalized_from_string(scratch.arena, os_get_current_path(scratch.arena));\r\n        }\r\n        \r\n        // rjf: unpack arguments\r\n        String8List passthrough_args_list = {0};\r\n        for(String8Node *n = target_args.first->next; n != 0; n = n->next)\r\n        {\r\n          if(str8_find_needle(n->string, 0, str8_lit(\" \"), 0) < n->string.size)\r\n          {\r\n            str8_list_pushf(scratch.arena, &passthrough_args_list, \"\\\"%S\\\"\", n->string);\r\n          }\r\n          else\r\n          {\r\n            str8_list_push(scratch.arena, &passthrough_args_list, n->string);\r\n          }\r\n        }\r\n        StringJoin join = {str8_lit(\"\"), str8_lit(\" \"), str8_lit(\"\")};\r\n        arguments_string = str8_list_join(scratch.arena, &passthrough_args_list, &join);\r\n      }\r\n      \r\n      //- rjf: build config tree\r\n      CFG_Node *command_line_root = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"command_line\"));\r\n      CFG_Node *target = cfg_node_new(rd_state->cfg, command_line_root, str8_lit(\"target\"));\r\n      CFG_Node *exe    = cfg_node_new(rd_state->cfg, target, str8_lit(\"executable\"));\r\n      CFG_Node *args   = cfg_node_new(rd_state->cfg, target, str8_lit(\"arguments\"));\r\n      CFG_Node *wdir   = cfg_node_new(rd_state->cfg, target, str8_lit(\"working_directory\"));\r\n      cfg_node_new(rd_state->cfg, exe, executable_name_string);\r\n      cfg_node_new(rd_state->cfg, args, arguments_string);\r\n      cfg_node_new(rd_state->cfg, wdir, working_directory_string);\r\n      rd_cmd(RD_CmdKind_SelectTarget, .cfg = target->id);\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  // rjf: set up user / project paths\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    // rjf: unpack command line arguments\r\n    String8 user_path = cmd_line_string(cmdln, str8_lit(\"user\"));\r\n    String8 project_path = cmd_line_string(cmdln, str8_lit(\"project\"));\r\n    {\r\n      if(user_path.size != 0)\r\n      {\r\n        user_path = path_absolute_dst_from_relative_dst_src(scratch.arena, user_path, os_get_process_info()->initial_path);\r\n      }\r\n      if(project_path.size != 0)\r\n      {\r\n        project_path = path_absolute_dst_from_relative_dst_src(scratch.arena, project_path, os_get_process_info()->initial_path);\r\n      }\r\n    }\r\n    {\r\n      String8 user_program_data_path = os_get_process_info()->user_program_data_path;\r\n      String8 user_data_folder = push_str8f(scratch.arena, \"%S/raddbg\", user_program_data_path);\r\n      os_make_directory(user_data_folder);\r\n      if(user_path.size == 0)\r\n      {\r\n        user_path = implicit_user_arg;\r\n      }\r\n      if(user_path.size == 0)\r\n      {\r\n        String8 last_user_path = push_str8f(scratch.arena, \"%S/last_user\", user_data_folder);\r\n        user_path = os_data_from_file_path(scratch.arena, last_user_path);\r\n      }\r\n      if(user_path.size == 0)\r\n      {\r\n        user_path = push_str8f(scratch.arena, \"%S/default.raddbg_user\", user_data_folder);\r\n      }\r\n    }\r\n    if(project_path.size == 0)\r\n    {\r\n      project_path = implicit_project_arg;\r\n    }\r\n    if(project_path.size != 0)\r\n    {\r\n      arena_clear(rd_state->project_path_arena);\r\n      rd_state->project_path = push_str8_copy(rd_state->project_path_arena, project_path);\r\n    }\r\n    \r\n    // rjf: do initial load of user (project will be loaded by the initial user load if not specified)\r\n    rd_cmd(RD_CmdKind_OpenUser, .file_path = user_path);\r\n    if(project_path.size != 0)\r\n    {\r\n      rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path);\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  // rjf: unpack icon image data\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 data = rd_icon_file_bytes;\r\n    U8 *ptr = data.str;\r\n    U8 *opl = ptr+data.size;\r\n    \r\n    // rjf: read header\r\n#pragma pack(push, 1)\r\n    typedef struct ICO_Header ICO_Header;\r\n    struct ICO_Header\r\n    {\r\n      U16 reserved_padding; // must be 0\r\n      U16 image_type; // if 1 -> ICO, if 2 -> CUR\r\n      U16 num_images;\r\n    };\r\n    typedef struct ICO_Entry ICO_Entry;\r\n    struct ICO_Entry\r\n    {\r\n      U8 image_width_px;\r\n      U8 image_height_px;\r\n      U8 num_colors;\r\n      U8 reserved_padding; // should be 0\r\n      union\r\n      {\r\n        U16 ico_color_planes; // in ICO\r\n        U16 cur_hotspot_x_px; // in CUR\r\n      };\r\n      union\r\n      {\r\n        U16 ico_bits_per_pixel; // in ICO\r\n        U16 cur_hotspot_y_px;   // in CUR\r\n      };\r\n      U32 image_data_size;\r\n      U32 image_data_off;\r\n    };\r\n#pragma pack(pop)\r\n    ICO_Header hdr = {0};\r\n    if(ptr+sizeof(hdr) < opl)\r\n    {\r\n      MemoryCopy(&hdr, ptr, sizeof(hdr));\r\n      ptr += sizeof(hdr);\r\n    }\r\n    \r\n    // rjf: read image entries\r\n    U64 entries_count = hdr.num_images;\r\n    ICO_Entry *entries = push_array(scratch.arena, ICO_Entry, hdr.num_images);\r\n    {\r\n      U64 bytes_to_read = sizeof(ICO_Entry)*entries_count;\r\n      bytes_to_read = Min(bytes_to_read, opl-ptr);\r\n      MemoryCopy(entries, ptr, bytes_to_read);\r\n      ptr += bytes_to_read;\r\n    }\r\n    \r\n    // rjf: find largest image\r\n    ICO_Entry *best_entry = 0;\r\n    U64 best_entry_area = 0;\r\n    for(U64 idx = 0; idx < entries_count; idx += 1)\r\n    {\r\n      ICO_Entry *entry = &entries[idx];\r\n      U64 width = entry->image_width_px;\r\n      if(width == 0) { width = 256; }\r\n      U64 height = entry->image_height_px;\r\n      if(height == 0) { height = 256; }\r\n      U64 entry_area = width*height;\r\n      if(entry_area > best_entry_area)\r\n      {\r\n        best_entry = entry;\r\n        best_entry_area = entry_area;\r\n      }\r\n    }\r\n    \r\n    // rjf: deserialize raw image data from best entry's offset\r\n    U8 *image_data = 0;\r\n    Vec2S32 image_dim = {0};\r\n    if(best_entry != 0)\r\n    {\r\n      U8 *file_data_ptr = data.str + best_entry->image_data_off;\r\n      U64 file_data_size = best_entry->image_data_size;\r\n      int width = 0;\r\n      int height = 0;\r\n      int components = 0;\r\n      image_data = stbi_load_from_memory(file_data_ptr, file_data_size, &width, &height, &components, 4);\r\n      image_dim.x = width;\r\n      image_dim.y = height;\r\n    }\r\n    \r\n    // rjf: upload to gpu texture\r\n    rd_state->icon_texture = r_tex2d_alloc(R_ResourceKind_Static, image_dim, R_Tex2DFormat_RGBA8, image_data);\r\n    \r\n    // rjf: release\r\n    stbi_image_free(image_data);\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nrd_frame(void)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  log_scope_begin();\r\n  rd_state->frame_depth += 1;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: (DEBUG) take top-level cfg roots, stringize them, and store them to hash store\r\n  //\r\n#if 0\r\n  {\r\n    struct\r\n    {\r\n      C_Key key;\r\n      String8 name;\r\n    }\r\n    table[] =\r\n    {\r\n      {rd_state->user_cfg_string_key, str8_lit(\"user\")},\r\n      {rd_state->project_cfg_string_key, str8_lit(\"project\")},\r\n      {rd_state->cmdln_cfg_string_key, str8_lit(\"command_line\")},\r\n      {rd_state->transient_cfg_string_key, str8_lit(\"transient\")},\r\n    };\r\n    for EachElement(idx, table)\r\n    {\r\n      Arena *arena = arena_alloc();\r\n      String8 data = cfg_string_from_tree(arena,\r\n                                          rd_state->cfg_schema_table,\r\n                                          str8_zero(),\r\n                                          cfg_node_child_from_string(cfg_node_root(), table[idx].name));\r\n      c_submit_data(table[idx].key, &arena, data);\r\n    }\r\n  }\r\n#endif\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do per-frame resets\r\n  //\r\n  arena_clear(rd_frame_arena());\r\n  rd_state->top_regs = &rd_state->base_regs;\r\n  rd_regs_copy_contents(rd_frame_arena(), &rd_state->top_regs->v, &rd_state->top_regs->v);\r\n  if(rd_state->next_hover_regs != 0)\r\n  {\r\n    rd_state->hover_regs = rd_regs_copy(rd_frame_arena(), rd_state->next_hover_regs);\r\n    rd_state->hover_regs_slot = rd_state->next_hover_regs_slot;\r\n    rd_state->next_hover_regs = 0;\r\n  }\r\n  else\r\n  {\r\n    rd_state->hover_regs = push_array(rd_frame_arena(), RD_Regs, 1);\r\n    rd_state->hover_regs_slot = RD_RegSlot_Null;\r\n  }\r\n  B32 allow_text_hotkeys = !rd_state->text_edit_mode;\r\n  rd_state->text_edit_mode = 0;\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    arena_clear(rd_state->cmd_output_arena);\r\n    MemoryZeroStruct(&rd_state->cmd_outputs);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: iterate all tabs, touch their view-states\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    CFG_NodePtrList windows = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"window\"));\r\n    for(CFG_NodePtrNode *n = windows.first; n != 0; n = n->next)\r\n    {\r\n      CFG_Node *window = n->v;\r\n      CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n      for(CFG_PanelNode *p = panel_tree.root; p != &cfg_nil_panel_node; p = cfg_panel_node_rec__depth_first_pre(panel_tree.root, p).next)\r\n      {\r\n        for(CFG_NodePtrNode *n = p->tabs.first; n != 0; n = n->next)\r\n        {\r\n          CFG_Node *tab = n->v;\r\n          if(rd_cfg_is_project_filtered(tab))\r\n          {\r\n            continue;\r\n          }\r\n          rd_view_state_from_cfg(tab);\r\n        }\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: apply debug info config trees -> loaded debug info cache\r\n  //\r\n  {\r\n    U64 current_update_tick_idx = update_tick_idx();\r\n    \r\n    //- rjf: for each debug info config, reflect in cache - open if needed\r\n    CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"debug_info\"));\r\n    for EachNode(n, CFG_NodePtrNode, dbg_infos.first)\r\n    {\r\n      // rjf: unpack debug info config\r\n      CFG_Node *di = n->v;\r\n      String8 path = rd_path_from_cfg(di);\r\n      CFG_Node *di_timestamp = cfg_node_child_from_string(di, str8_lit(\"timestamp\"));\r\n      U64 timestamp = 0;\r\n      try_u64_from_str8_c_rules(di_timestamp->first->string, &timestamp);\r\n      DI_Key key = di_key_from_path_timestamp(path, timestamp);\r\n      \r\n      // rjf: touch in cache\r\n      U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n      U64 slot_idx = hash%rd_state->loaded_dbg_info_slots_count;\r\n      RD_LoadedDbgInfoSlot *slot = &rd_state->loaded_dbg_info_slots[slot_idx];\r\n      RD_LoadedDbgInfoNode *node = 0;\r\n      for(RD_LoadedDbgInfoNode *n = slot->first; n != 0; n = n->hash_next)\r\n      {\r\n        if(di_key_match(key, n->key))\r\n        {\r\n          node = n;\r\n          break;\r\n        }\r\n      }\r\n      if(node == 0)\r\n      {\r\n        node = rd_state->free_loaded_dbg_info_node;\r\n        if(node)\r\n        {\r\n          SLLStackPop_N(rd_state->free_loaded_dbg_info_node, hash_next);\r\n        }\r\n        else\r\n        {\r\n          node = push_array(rd_state->arena, RD_LoadedDbgInfoNode, 1);\r\n        }\r\n        DLLPushBack_NP(slot->first, slot->last, node, hash_next, hash_prev);\r\n        node->key = key;\r\n        di_open(key);\r\n      }\r\n      node->last_tick_idx_touched = current_update_tick_idx;\r\n      DLLRemove_NP(rd_state->loaded_dbg_info_lru_first, rd_state->loaded_dbg_info_lru_last, node, lru_next, lru_prev);\r\n      DLLPushBack_NP(rd_state->loaded_dbg_info_lru_first, rd_state->loaded_dbg_info_lru_last, node, lru_next, lru_prev);\r\n    }\r\n    \r\n    //- rjf: iterate least-recently-used loaded debug infos - if any have not been updated this tick,\r\n    // then evict\r\n    for(RD_LoadedDbgInfoNode *n = rd_state->loaded_dbg_info_lru_first, *next = 0; n != 0; n = next)\r\n    {\r\n      next = n->lru_next;\r\n      if(n->last_tick_idx_touched >= current_update_tick_idx)\r\n      {\r\n        break;\r\n      }\r\n      U64 hash = u64_hash_from_str8(str8_struct(&n->key));\r\n      U64 slot_idx = hash%rd_state->loaded_dbg_info_slots_count;\r\n      RD_LoadedDbgInfoSlot *slot = &rd_state->loaded_dbg_info_slots[slot_idx];\r\n      DLLRemove_NP(rd_state->loaded_dbg_info_lru_first, rd_state->loaded_dbg_info_lru_last, n, lru_next, lru_prev);\r\n      DLLRemove_NP(slot->first, slot->last, n, hash_next, hash_prev);\r\n      SLLStackPush_N(rd_state->free_loaded_dbg_info_node, n, hash_next);\r\n      di_close(n->key, 0);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: garbage collect untouched immediate cfg trees\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    CFG_Node *transient = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"transient\"));\r\n    for(CFG_Node *tln = transient->first, *next = &cfg_nil_node; tln != &cfg_nil_node; tln = next)\r\n    {\r\n      next = tln->next;\r\n      if(str8_match(tln->string, str8_lit(\"immediate\"), 0))\r\n      {\r\n        if(cfg_node_child_from_string(tln, str8_lit(\"hot\")) == &cfg_nil_node)\r\n        {\r\n          cfg_node_release(rd_state->cfg, tln);\r\n        }\r\n      }\r\n    }\r\n    for(CFG_Node *tln = transient->first; tln != &cfg_nil_node; tln = tln->next)\r\n    {\r\n      if(str8_match(tln->string, str8_lit(\"immediate\"), 0))\r\n      {\r\n        for(CFG_Node *child = tln->first, *next = &cfg_nil_node; child != &cfg_nil_node; child = next)\r\n        {\r\n          next = child->next;\r\n          if(str8_match(child->string, str8_lit(\"hot\"), 0))\r\n          {\r\n            cfg_node_release(rd_state->cfg, child);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: garbage collect untouched view states\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    for EachIndex(slot_idx, rd_state->view_state_slots_count)\r\n    {\r\n      for(RD_ViewState *vs = rd_state->view_state_slots[slot_idx].first, *next; vs != 0; vs = next)\r\n      {\r\n        next = vs->hash_next;\r\n        if(vs->last_frame_index_touched+2 < rd_state->frame_index)\r\n        {\r\n          ev_view_release(vs->ev_view);\r\n          for(RD_ArenaExt *ext = vs->first_arena_ext; ext != 0; ext = ext->next)\r\n          {\r\n            arena_release(ext->arena);\r\n          }\r\n          arena_release(vs->arena);\r\n          DLLRemove_NP(rd_state->view_state_slots[slot_idx].first, rd_state->view_state_slots[slot_idx].last, vs, hash_next, hash_prev);\r\n          SLLStackPush_N(rd_state->free_view_state, vs, hash_next);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: sync with di parsers\r\n  //\r\n  ProfScope(\"sync with di parsers\")\r\n  {\r\n    DI_EventList events = di_get_events(scratch.arena);\r\n    for(DI_EventNode *n = events.first; n != 0; n = n->next)\r\n    {\r\n      DI_Event *event = &n->v;\r\n      switch(event->kind)\r\n      {\r\n        default:{}break;\r\n        case DI_EventKind_ConversionStarted:\r\n        {\r\n          CFG_Node *root = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"transient\"));\r\n          CFG_Node *task = cfg_node_new(rd_state->cfg, root, str8_lit(\"conversion_task\"));\r\n          cfg_node_new(rd_state->cfg, task, event->string);\r\n        }break;\r\n        case DI_EventKind_ConversionEnded:\r\n        {\r\n          CFG_Node *root = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"transient\"));\r\n          for(CFG_Node *tln = root->first; tln != &cfg_nil_node; tln = tln->next)\r\n          {\r\n            if(str8_match(tln->string, str8_lit(\"conversion_task\"), 0) && str8_match(tln->first->string, event->string, 0))\r\n            {\r\n              cfg_node_release(rd_state->cfg, tln);\r\n              break;\r\n            }\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: animate all views\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    B32 any_window_is_focused = 0;\r\n    for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next)\r\n    {\r\n      if(os_window_is_focused(w->os))\r\n      {\r\n        any_window_is_focused = 1;\r\n        break;\r\n      }\r\n    }\r\n    F32 slow_rate = 1 - pow_f32(2, (-10.f * rd_state->frame_dt));\r\n    F32 fast_rate = 1 - pow_f32(2, (-40.f * rd_state->frame_dt));\r\n    for EachIndex(slot_idx, rd_state->view_state_slots_count)\r\n    {\r\n      for(RD_ViewState *vs = rd_state->view_state_slots[slot_idx].first;\r\n          vs != 0;\r\n          vs = vs->hash_next)\r\n      {\r\n        F32 scroll_x_diff = (-vs->scroll_pos.x.off);\r\n        F32 scroll_y_diff = (-vs->scroll_pos.y.off);\r\n        F32 loading_t_diff = (vs->loading_t_target - vs->loading_t);\r\n        vs->scroll_pos.x.off += scroll_x_diff*rd_state->scrolling_animation_rate;\r\n        vs->scroll_pos.y.off += scroll_y_diff*rd_state->scrolling_animation_rate;\r\n        vs->loading_t += loading_t_diff * slow_rate;\r\n        if((any_window_is_focused && abs_f32(loading_t_diff) > 0.01f) ||\r\n           abs_f32(scroll_x_diff) > 0.01f ||\r\n           abs_f32(scroll_y_diff) > 0.01f)\r\n        {\r\n          rd_request_frame();\r\n        }\r\n        if(abs_f32(scroll_x_diff) <= 0.01f)\r\n        {\r\n          vs->scroll_pos.x.off = 0;\r\n        }\r\n        if(abs_f32(scroll_y_diff) <= 0.01f)\r\n        {\r\n          vs->scroll_pos.y.off = 0;\r\n        }\r\n        CFG_Node *vcfg = cfg_node_from_id(vs->cfg_id);\r\n        if(cfg_node_child_from_string(vcfg, str8_lit(\"selected\")) != &cfg_nil_node)\r\n        {\r\n          if(vs->loading_t_target > 0.5f && any_window_is_focused)\r\n          {\r\n            rd_request_frame();\r\n          }\r\n          vs->loading_t_target = 0;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: get events from the OS\r\n  //\r\n  OS_EventList events = {0};\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    events = os_get_events(scratch.arena, rd_state->num_frames_requested == 0 && !DEV_always_refresh);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: push frame scopes\r\n  //\r\n  Access *frame_access_restore = rd_state->frame_access;\r\n  rd_state->frame_access = access_open();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate avg length in us of last many frames\r\n  //\r\n  U64 frame_time_history_avg_us = 0;\r\n  {\r\n    U64 num_frames_in_history = Min(ArrayCount(rd_state->frame_time_us_history), rd_state->frame_index);\r\n    U64 frame_time_history_sum_us = 0;\r\n    if(num_frames_in_history > 0)\r\n    {\r\n      for(U64 idx = 0; idx < num_frames_in_history; idx += 1)\r\n      {\r\n        frame_time_history_sum_us += rd_state->frame_time_us_history[idx];\r\n      }\r\n      frame_time_history_avg_us = frame_time_history_sum_us/num_frames_in_history;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: pick target hz\r\n  //\r\n  // pick among a number of sensible targets to snap to, given how well\r\n  // we've been performing\r\n  //\r\n  // TODO(rjf): maximize target, given all windows and their monitors\r\n  //\r\n  F32 target_hz = os_get_gfx_info()->default_refresh_rate;\r\n  if(rd_state->frame_index > 32)\r\n  {\r\n    F32 possible_alternate_hz_targets[] = {target_hz, 60.f, 75.f, 120.f, 144.f, 165.f, 240.f, 360.f};\r\n    F32 best_target_hz = target_hz;\r\n    S64 best_target_hz_frame_time_us_diff = max_S64;\r\n    for(U64 idx = 0; idx < ArrayCount(possible_alternate_hz_targets); idx += 1)\r\n    {\r\n      F32 candidate = possible_alternate_hz_targets[idx];\r\n      if(candidate <= target_hz)\r\n      {\r\n        U64 candidate_frame_time_us = 1000000/(U64)candidate;\r\n        S64 frame_time_us_diff = (S64)frame_time_history_avg_us - (S64)candidate_frame_time_us;\r\n        if(abs_s64(frame_time_us_diff) < best_target_hz_frame_time_us_diff &&\r\n           frame_time_history_avg_us < candidate_frame_time_us + candidate_frame_time_us/4)\r\n        {\r\n          best_target_hz = candidate;\r\n          best_target_hz_frame_time_us_diff = frame_time_us_diff;\r\n        }\r\n      }\r\n    }\r\n    target_hz = best_target_hz;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: given frame time history, decide on amount of time we're willing to wait for memory read results\r\n  // for evaluations\r\n  //\r\n  {\r\n    rd_state->frame_eval_memread_endt_us = 0;\r\n    U64 frame_time_target_cap_us = (U64)(1000000/target_hz);\r\n    if(frame_time_history_avg_us < frame_time_target_cap_us)\r\n    {\r\n      U64 spare_time = (frame_time_target_cap_us - frame_time_history_avg_us) + 4000;\r\n      rd_state->frame_eval_memread_endt_us = os_now_microseconds() + spare_time;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: target Hz -> delta time\r\n  //\r\n  rd_state->frame_dt = 1.f/target_hz;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: begin measuring actual per-frame work\r\n  //\r\n  U64 begin_time_us = os_now_microseconds();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: bind change\r\n  //\r\n  if(!rd_state->popup_active && rd_state->bind_change_active)\r\n  {\r\n    if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Esc))\r\n    {\r\n      rd_request_frame();\r\n      rd_state->bind_change_active = 0;\r\n    }\r\n    if(os_key_press(&events, os_handle_zero(), 0, OS_Key_Delete))\r\n    {\r\n      rd_request_frame();\r\n      cfg_node_release(rd_state->cfg, cfg_node_from_id(rd_state->bind_change_binding_id));\r\n      rd_state->bind_change_active = 0;\r\n    }\r\n    for(OS_Event *event = events.first, *next = 0; event != 0; event = next)\r\n    {\r\n      if(event->kind == OS_EventKind_Press &&\r\n         event->key != OS_Key_Esc &&\r\n         event->key != OS_Key_Return &&\r\n         event->key != OS_Key_Backspace &&\r\n         event->key != OS_Key_Delete &&\r\n         event->key != OS_Key_LeftMouseButton &&\r\n         event->key != OS_Key_RightMouseButton &&\r\n         event->key != OS_Key_MiddleMouseButton &&\r\n         event->key != OS_Key_Ctrl &&\r\n         event->key != OS_Key_Alt &&\r\n         event->key != OS_Key_Shift)\r\n      {\r\n        rd_state->bind_change_active = 0;\r\n        CFG_Node *binding = cfg_node_from_id(rd_state->bind_change_binding_id);\r\n        if(binding == &cfg_nil_node)\r\n        {\r\n          CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n          CFG_Node *keybindings = cfg_node_child_from_string_or_alloc(rd_state->cfg, user, str8_lit(\"keybindings\"));\r\n          binding = cfg_node_new(rd_state->cfg, keybindings, str8_lit(\"\"));\r\n        }\r\n        cfg_node_release_all_children(rd_state->cfg, binding);\r\n        cfg_node_new(rd_state->cfg, binding, rd_state->bind_change_cmd_name);\r\n        cfg_node_new(rd_state->cfg, binding, os_g_key_cfg_string_table[event->key]);\r\n        if(event->modifiers & OS_Modifier_Ctrl)  { cfg_node_new(rd_state->cfg, binding, str8_lit(\"ctrl\")); }\r\n        if(event->modifiers & OS_Modifier_Shift) { cfg_node_new(rd_state->cfg, binding, str8_lit(\"shift\")); }\r\n        if(event->modifiers & OS_Modifier_Alt)   { cfg_node_new(rd_state->cfg, binding, str8_lit(\"alt\")); }\r\n        U32 codepoint = os_codepoint_from_modifiers_and_key(event->modifiers, event->key);\r\n        os_text(&events, event->window, codepoint);\r\n        os_eat_event(&events, event);\r\n        rd_request_frame();\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build key map from config\r\n  //\r\n  ProfScope(\"build key map from config\")\r\n  {\r\n    rd_state->key_map = cfg_key_map_from_cfg(rd_frame_arena());\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: get fonts from config\r\n  //\r\n  ProfScope(\"get fonts from config\")\r\n  {\r\n    String8 main_font_name = rd_setting_from_name(str8_lit(\"main_font\"));\r\n    String8 code_font_name = rd_setting_from_name(str8_lit(\"code_font\"));\r\n    rd_state->font_slot_table[RD_FontSlot_Main]  = fnt_tag_from_path(main_font_name);\r\n    rd_state->font_slot_table[RD_FontSlot_Code]  = fnt_tag_from_path(code_font_name);\r\n    if(fnt_tag_match(rd_state->font_slot_table[RD_FontSlot_Main], fnt_tag_zero()))\r\n    {\r\n      rd_state->font_slot_table[RD_FontSlot_Main] = fnt_tag_from_static_data_string(&rd_default_main_font_bytes);\r\n    }\r\n    if(fnt_tag_match(rd_state->font_slot_table[RD_FontSlot_Code], fnt_tag_zero()))\r\n    {\r\n      rd_state->font_slot_table[RD_FontSlot_Code] = fnt_tag_from_static_data_string(&rd_default_code_font_bytes);\r\n    }\r\n    rd_state->font_slot_table[RD_FontSlot_Icons] = fnt_tag_from_static_data_string(&rd_icon_font_bytes);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: consume events\r\n  //\r\n  ProfScope(\"consume events\")\r\n  {\r\n    for(OS_Event *event = events.first, *next = 0;\r\n        event != 0;\r\n        event = next)\r\n      RD_RegsScope()\r\n    {\r\n      next = event->next;\r\n      RD_WindowState *ws = rd_window_state_from_os_handle(event->window);\r\n      if(ws != 0 && ws != rd_window_state_from_cfg(cfg_node_from_id(rd_regs()->window)))\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, cfg_node_from_id(ws->cfg_id));\r\n        rd_regs()->window = ws->cfg_id;\r\n        rd_regs()->panel  = panel_tree.focused->cfg->id;\r\n        rd_regs()->tab    = panel_tree.focused->selected_tab->id;\r\n        rd_regs()->view   = panel_tree.focused->selected_tab->id;\r\n        scratch_end(scratch);\r\n      }\r\n      B32 take = 0;\r\n      \r\n      //- rjf: try drag/drop drop-kickoff\r\n      if(rd_drag_is_active() && event->kind == OS_EventKind_Release && event->key == OS_Key_LeftMouseButton)\r\n      {\r\n        rd_state->drag_drop_state = RD_DragDropState_Dropping;\r\n      }\r\n      \r\n      //- rjf: try window close\r\n      if(!take && event->kind == OS_EventKind_WindowClose && ws != 0)\r\n      {\r\n        take = 1;\r\n        rd_cmd(RD_CmdKind_Exit);\r\n      }\r\n      \r\n      //- rjf: try menu bar operations\r\n      if(rd_state->alt_menu_bar_enabled)\r\n      {\r\n        if(!take && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0)\r\n        {\r\n          take = 1;\r\n          rd_request_frame();\r\n          ws->menu_bar_focused_on_press = ws->menu_bar_focused;\r\n          ws->menu_bar_key_held = 1;\r\n          ws->menu_bar_focus_press_started = 1;\r\n        }\r\n        if(!take && event->kind == OS_EventKind_Release && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0)\r\n        {\r\n          take = 1;\r\n          rd_request_frame();\r\n          ws->menu_bar_key_held = 0;\r\n        }\r\n        if(ws->menu_bar_focused && event->kind == OS_EventKind_Press && event->key == OS_Key_Alt && event->modifiers == 0 && event->is_repeat == 0)\r\n        {\r\n          take = 1;\r\n          rd_request_frame();\r\n          ws->menu_bar_focused = 0;\r\n        }\r\n        else if(ws->menu_bar_focus_press_started && !ws->menu_bar_focused && event->kind == OS_EventKind_Release && event->modifiers == 0 && event->key == OS_Key_Alt && event->is_repeat == 0)\r\n        {\r\n          take = 1;\r\n          rd_request_frame();\r\n          ws->menu_bar_focused = !ws->menu_bar_focused_on_press;\r\n          ws->menu_bar_focus_press_started = 0;\r\n        }\r\n        else if(event->kind == OS_EventKind_Press && event->key == OS_Key_Esc && ws->menu_bar_focused && !ui_any_ctx_menu_is_open())\r\n        {\r\n          take = 1;\r\n          rd_request_frame();\r\n          ws->menu_bar_focused = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: try hotkey presses\r\n      if(!take && event->kind == OS_EventKind_Press)\r\n      {\r\n        CFG_Binding binding = {event->key, event->modifiers};\r\n        CFG_KeyMapNodePtrList key_map_nodes = cfg_key_map_node_ptr_list_from_binding(scratch.arena, rd_state->key_map, binding);\r\n        if(key_map_nodes.first != 0)\r\n        {\r\n          U32 hit_char = os_codepoint_from_modifiers_and_key(event->modifiers, event->key);\r\n          if(hit_char == 0 || allow_text_hotkeys)\r\n          {\r\n            String8 cmd_name = key_map_nodes.first->v->name;\r\n            for(U64 idx = 0; idx < ArrayCount(rd_binding_version_remap_old_name_table); idx += 1)\r\n            {\r\n              if(str8_match(rd_binding_version_remap_old_name_table[idx], cmd_name, StringMatchFlag_CaseInsensitive))\r\n              {\r\n                cmd_name = rd_binding_version_remap_new_name_table[idx];\r\n              }\r\n            }\r\n            rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_name);\r\n            if(allow_text_hotkeys)\r\n            {\r\n              os_text(&events, event->window, hit_char);\r\n              next = event->next;\r\n            }\r\n            take = 1;\r\n            if(event->modifiers & OS_Modifier_Alt)\r\n            {\r\n              ws->menu_bar_focus_press_started = 0;\r\n            }\r\n          }\r\n        }\r\n        else if(OS_Key_F1 <= event->key && event->key <= OS_Key_F19)\r\n        {\r\n          ws->menu_bar_focus_press_started = 0;\r\n        }\r\n        rd_request_frame();\r\n      }\r\n      \r\n      //- rjf: try text events\r\n      if(!take && event->kind == OS_EventKind_Text)\r\n      {\r\n        String32 insertion32 = str32(&event->character, 1);\r\n        String8 insertion8 = str8_from_32(scratch.arena, insertion32);\r\n        rd_cmd(RD_CmdKind_InsertText, .string = insertion8);\r\n        rd_request_frame();\r\n        take = 1;\r\n        if(event->modifiers & OS_Modifier_Alt)\r\n        {\r\n          ws->menu_bar_focus_press_started = 0;\r\n        }\r\n      }\r\n      \r\n      //- rjf: do fall-through\r\n      if(!take)\r\n      {\r\n        take = 1;\r\n        rd_cmd(RD_CmdKind_OSEvent, .os_event = event);\r\n      }\r\n      \r\n      //- rjf: take\r\n      if(take)\r\n      {\r\n        os_eat_event(&events, event);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: loop - consume events in core, tick engine, and repeat\r\n  //\r\n  CTRL_Handle find_thread_retry = {0};\r\n  RD_Cmd *cmd = 0;\r\n  ProfScope(\"loop - consume events in core, tick engine, and repeat\") for(U64 cmd_process_loop_idx = 0; cmd_process_loop_idx < 3; cmd_process_loop_idx += 1)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: gather all unique debug info keys, build map\r\n    //\r\n    typedef struct DbgInfoNode DbgInfoNode;\r\n    struct DbgInfoNode\r\n    {\r\n      DbgInfoNode *hash_next;\r\n      DbgInfoNode *order_next;\r\n      DI_Key key;\r\n      U64 idx;\r\n    };\r\n    U64 dbg_info_slots_count = 4096;\r\n    DbgInfoNode **dbg_info_slots = push_array(scratch.arena, DbgInfoNode *, dbg_info_slots_count);\r\n    DbgInfoNode *first_dbg_info = 0;\r\n    DbgInfoNode *last_dbg_info = 0;\r\n    U64 dbg_infos_count = 0;\r\n    {\r\n      CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"debug_info\"));\r\n      for EachNode(n, CFG_NodePtrNode, dbg_infos.first)\r\n      {\r\n        CFG_Node *di = n->v;\r\n        String8 path = rd_path_from_cfg(di);\r\n        CFG_Node *timestamp_node = cfg_node_child_from_string(di, str8_lit(\"timestamp\"));\r\n        U64 timestamp = 0;\r\n        try_u64_from_str8_c_rules(timestamp_node->first->string, &timestamp);\r\n        DI_Key key = di_key_from_path_timestamp(path, timestamp);\r\n        U64 hash = u64_hash_from_str8(str8_struct(&key));\r\n        U64 slot_idx = hash%dbg_info_slots_count;\r\n        DbgInfoNode *node = 0;\r\n        for(DbgInfoNode *n = dbg_info_slots[slot_idx]; n != 0; n = n->hash_next)\r\n        {\r\n          if(di_key_match(n->key, key))\r\n          {\r\n            node = n;\r\n            break;\r\n          }\r\n        }\r\n        if(node == 0)\r\n        {\r\n          node = push_array(scratch.arena, DbgInfoNode, 1);\r\n          SLLStackPush_N(dbg_info_slots[slot_idx], node, hash_next);\r\n          SLLQueuePush_N(first_dbg_info, last_dbg_info, node, order_next);\r\n          node->key = key;\r\n          node->idx = dbg_infos_count;\r\n          dbg_infos_count += 1;\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: unpack basic evaluation context\r\n    //\r\n    ProfBegin(\"unpack eval-dependent info\");\r\n    CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process);\r\n    CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n    Arch arch = thread->arch;\r\n    U64 unwind_count = rd_regs()->unwind_count;\r\n    U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);\r\n    CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);\r\n    U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr);\r\n    U64 tls_root_vaddr = ctrl_tls_root_vaddr_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle);\r\n    ProfEnd();\r\n    \r\n    ////////////////////////////\r\n    //- rjf: produce all debug infos\r\n    //\r\n    U64 eval_dbg_infos_count = Max(1, dbg_infos_count);\r\n    E_DbgInfo *eval_dbg_infos = push_array(scratch.arena, E_DbgInfo, eval_dbg_infos_count);\r\n    E_DbgInfo *eval_dbg_infos_primary = &eval_dbg_infos[0];\r\n    MemoryCopyStruct(eval_dbg_infos_primary, &e_dbg_info_nil);\r\n    {\r\n      U64 idx = 0;\r\n      for(DbgInfoNode *n = first_dbg_info; n != 0; n = n->order_next)\r\n      {\r\n        eval_dbg_infos[idx].dbgi_key = n->key;\r\n        eval_dbg_infos[idx].rdi = di_rdi_from_key(rd_state->frame_access, n->key, 0, 0);\r\n        idx += 1;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: produce all eval modules\r\n    //\r\n    CTRL_EntityArray all_modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module);\r\n    U64 eval_modules_count = Max(1, all_modules.count);\r\n    E_Module *eval_modules = push_array(scratch.arena, E_Module, eval_modules_count);\r\n    E_Module *eval_modules_primary = &eval_modules[0];\r\n    eval_modules_primary->vaddr_range = r1u64(0, max_U64);\r\n    ProfScope(\"produce all eval modules\")\r\n    {\r\n      for EachIndex(eval_module_idx, all_modules.count)\r\n      {\r\n        CTRL_Entity *m = all_modules.v[eval_module_idx];\r\n        DI_Key dbgi_key = ctrl_dbgi_key_from_module(m);\r\n        \r\n        // rjf: dbgi key -> eval dbg info num\r\n        U32 dbg_info_num = 0;\r\n        {\r\n          U64 hash = u64_hash_from_str8(str8_struct(&dbgi_key));\r\n          U64 slot_idx = hash%dbg_info_slots_count;\r\n          for(DbgInfoNode *n = dbg_info_slots[slot_idx]; n != 0; n = n->hash_next)\r\n          {\r\n            if(di_key_match(n->key, dbgi_key))\r\n            {\r\n              dbg_info_num = n->idx+1;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: fill\r\n        eval_modules[eval_module_idx].vaddr_range  = m->vaddr_range;\r\n        eval_modules[eval_module_idx].arch         = m->arch;\r\n        eval_modules[eval_module_idx].dbg_info_num = dbg_info_num;\r\n        eval_modules[eval_module_idx].space        = rd_eval_space_from_ctrl_entity(ctrl_entity_ancestor_from_kind(m, CTRL_EntityKind_Process), CTRL_EvalSpaceKind_Entity);\r\n        if(module == m)\r\n        {\r\n          eval_modules_primary = &eval_modules[eval_module_idx];\r\n          eval_dbg_infos_primary = (0 < dbg_info_num && dbg_info_num <= eval_dbg_infos_count) ? &eval_dbg_infos[dbg_info_num-1] : &e_dbg_info_nil;\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: begin evaluation\r\n    //\r\n    e_select_cache(rd_state->eval_cache);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build base evaluation context\r\n    //\r\n    E_BaseCtx *eval_base_ctx = push_array(scratch.arena, E_BaseCtx, 1);\r\n    {\r\n      E_BaseCtx *ctx = eval_base_ctx;\r\n      \r\n      //- rjf: fill instruction pointer info\r\n      ctx->thread_ip_vaddr     = rip_vaddr;\r\n      ctx->thread_ip_voff      = rip_voff;\r\n      ctx->thread_reg_space    = rd_eval_space_from_ctrl_entity(thread, CTRL_EvalSpaceKind_Entity);\r\n      ctx->thread_arch         = thread->arch;\r\n      ctx->thread_unwind_count = unwind_count;\r\n      \r\n      //- rjf: fill debug infos\r\n      ctx->dbg_infos        = eval_dbg_infos;\r\n      ctx->dbg_infos_count  = eval_dbg_infos_count;\r\n      ctx->primary_dbg_info = eval_dbg_infos_primary;\r\n      \r\n      //- rjf: fill modules\r\n      ctx->modules          = eval_modules;\r\n      ctx->modules_count    = eval_modules_count;\r\n      ctx->primary_module   = eval_modules_primary;\r\n      \r\n      //- rjf: fill space hooks\r\n      ctx->space_gen   = rd_eval_space_gen;\r\n      ctx->space_read  = rd_eval_space_read;\r\n      ctx->space_write = rd_eval_space_write;\r\n    }\r\n    e_select_base_ctx(eval_base_ctx);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build extra types & maps\r\n    //\r\n    E_String2ExprMap *macro_map = push_array(scratch.arena, E_String2ExprMap, 1);\r\n    macro_map[0] = e_string2expr_map_make(scratch.arena, 512);\r\n    E_AutoHookMap *auto_hook_map = push_array(scratch.arena, E_AutoHookMap, 1);\r\n    auto_hook_map[0] = e_auto_hook_map_make(scratch.arena, 512);\r\n    rd_state->meta_name2type_map = push_array(rd_frame_arena(), E_String2TypeKeyMap, 1);\r\n    rd_state->meta_name2type_map[0] = e_string2typekey_map_make(rd_frame_arena(), 256);\r\n    EV_ExpandRuleTable *expand_rule_table = push_array(scratch.arena, EV_ExpandRuleTable, 1);\r\n    rd_state->view_ui_rule_map = rd_view_ui_rule_map_make(scratch.arena, 512);\r\n    ProfScope(\"build extra types & maps\")\r\n    {\r\n      //- rjf: add macros for command groups\r\n      {\r\n        String8 names[] =\r\n        {\r\n          str8_lit(\"commands\"),\r\n          str8_lit(\"tab_commands\"),\r\n          str8_lit(\"text_pt_commands\"),\r\n          str8_lit(\"text_range_commands\"),\r\n        };\r\n        for EachElement(idx, names)\r\n        {\r\n          String8 name = names[idx];\r\n          E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                               .flags = E_TypeFlag_StubSingleLineExpansion,\r\n                                               .name = name,\r\n                                               .access = E_TYPE_ACCESS_FUNCTION_NAME(commands),\r\n                                               .expand =\r\n                                               {\r\n                                                 .info  = E_TYPE_EXPAND_INFO_FUNCTION_NAME(commands),\r\n                                                 .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(commands),\r\n                                               });\r\n          E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n          expr->type_key = type_key;\r\n          expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n          e_string2expr_map_insert(scratch.arena, macro_map, name, expr);\r\n        }\r\n      }\r\n      \r\n      //- rjf: add macro for themes\r\n      {\r\n        String8 names[] =\r\n        {\r\n          str8_lit(\"themes\"),\r\n        };\r\n        for EachElement(idx, names)\r\n        {\r\n          String8 name = names[idx];\r\n          E_TypeKey type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                               .flags = E_TypeFlag_StubSingleLineExpansion,\r\n                                               .name = name,\r\n                                               .access = E_TYPE_ACCESS_FUNCTION_NAME(themes),\r\n                                               .expand =\r\n                                               {\r\n                                                 .info  = E_TYPE_EXPAND_INFO_FUNCTION_NAME(themes),\r\n                                                 .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(themes),\r\n                                               });\r\n          E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n          expr->type_key = type_key;\r\n          expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n          e_string2expr_map_insert(scratch.arena, macro_map, name, expr);\r\n        }\r\n      }\r\n      \r\n      //- rjf: build schema types & cache (name -> type) mapping\r\n      for EachElement(idx, rd_name_schema_info_table)\r\n      {\r\n        String8 name = rd_name_schema_info_table[idx].name;\r\n        E_TypeKey type_key = e_type_key_cons(.name = name,\r\n                                             .kind = E_TypeKind_Set,\r\n                                             .irext  = E_TYPE_IREXT_FUNCTION_NAME(schema),\r\n                                             .access = E_TYPE_ACCESS_FUNCTION_NAME(schema),\r\n                                             .expand =\r\n                                             {\r\n                                               .info  = E_TYPE_EXPAND_INFO_FUNCTION_NAME(schema),\r\n                                               .range = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(schema),\r\n                                             });\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, name, type_key);\r\n      }\r\n      \r\n      //- rjf: add macro for top-level config root\r\n      {\r\n        String8 name = str8_lit(\"config\");\r\n        E_TypeKey type_key = e_type_key_cons(.name = name,\r\n                                             .kind = E_TypeKind_Set,\r\n                                             .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs));\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->type_key = type_key;\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, name, expr);\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, name, type_key);\r\n      }\r\n      \r\n      //- rjf: add macro for top-level control root\r\n      {\r\n        String8 name = str8_lit(\"control\");\r\n        E_TypeKey type_key = e_type_key_cons(.name = name,\r\n                                             .kind = E_TypeKind_Set,\r\n                                             .access = E_TYPE_ACCESS_FUNCTION_NAME(control));\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->type_key = type_key;\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, name, expr);\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, name, type_key);\r\n      }\r\n      \r\n      //- rjf: add macros for config \"slice\" collections (targets, breakpoints, etc.)\r\n      String8 evallable_cfg_names[] =\r\n      {\r\n        str8_lit(\"breakpoint\"),\r\n        str8_lit(\"watch_pin\"),\r\n        str8_lit(\"target\"),\r\n        str8_lit(\"debug_info\"),\r\n        str8_lit(\"file_path_map\"),\r\n        str8_lit(\"type_view\"),\r\n        str8_lit(\"recent_project\"),\r\n        str8_lit(\"recent_file\"),\r\n      };\r\n      for EachElement(cfg_name_idx, evallable_cfg_names)\r\n      {\r\n        String8 cfg_name = evallable_cfg_names[cfg_name_idx];\r\n        String8 collection_name = rd_plural_from_code_name(cfg_name);\r\n        E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set, .name = collection_name,\r\n                                                        .irext = E_TYPE_IREXT_FUNCTION_NAME(cfgs_slice),\r\n                                                        .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs_slice),\r\n                                                        .expand =\r\n                                                        {\r\n                                                          .info = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs_slice),\r\n                                                          .range= E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs_slice),\r\n                                                          .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice),\r\n                                                          .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs_slice),\r\n                                                        });\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->type_key = collection_type_key;\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);\r\n      }\r\n      \r\n      //- rjf: add macros for evallable top-level individual config entity trees -\r\n      // things with names either explicitly attached, or that we can infer\r\n      for EachElement(idx, rd_name_schema_info_table)\r\n      {\r\n        String8 name = rd_name_schema_info_table[idx].name;\r\n        MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, name);\r\n        B32 is_individually_evallable = 0;\r\n        for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)\r\n        {\r\n          if(md_node_has_child(n->v, str8_lit(\"label\"), 0) ||\r\n             md_node_has_child(n->v, str8_lit(\"executable\"), 0))\r\n          {\r\n            is_individually_evallable = 1;\r\n            break;\r\n          }\r\n        }\r\n        if(is_individually_evallable)\r\n        {\r\n          E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name);\r\n          CFG_NodePtrList cfgs = cfg_node_top_level_list_from_string(scratch.arena, name);\r\n          for(CFG_NodePtrNode *n = cfgs.first; n != 0; n = n->next)\r\n          {\r\n            CFG_Node *cfg = n->v;\r\n            String8 label = rd_label_from_cfg(cfg);\r\n            if(label.size != 0)\r\n            {\r\n              E_Space space = rd_eval_space_from_cfg(cfg);\r\n              E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n              expr->space    = space;\r\n              expr->mode     = E_Mode_Offset;\r\n              expr->type_key = type_key;\r\n              e_string2expr_map_insert(scratch.arena, macro_map, label, expr);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: add macros for windows/tabs\r\n      CFG_NodePtrList watch_tabs = {0};\r\n      {\r\n        CFG_NodePtrList windows = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"window\"));\r\n        for(CFG_NodePtrNode *n = windows.first; n != 0; n = n->next)\r\n        {\r\n          CFG_Node *window = n->v;\r\n          {\r\n            E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, window->string);\r\n            E_Space space = rd_eval_space_from_cfg(window);\r\n            E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n            expr->space    = space;\r\n            expr->mode     = E_Mode_Offset;\r\n            expr->type_key = type_key;\r\n            e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, \"query:config.$%I64x\", window->id), expr);\r\n          }\r\n          CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n          for(CFG_PanelNode *p = panel_tree.root;\r\n              p != &cfg_nil_panel_node;\r\n              p = cfg_panel_node_rec__depth_first_pre(panel_tree.root, p).next)\r\n          {\r\n            for(CFG_NodePtrNode *tab_n = p->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n            {\r\n              CFG_Node *tab = tab_n->v;\r\n              E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, tab->string);\r\n              E_Space space = rd_eval_space_from_cfg(tab);\r\n              E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n              expr->space    = space;\r\n              expr->mode     = E_Mode_Offset;\r\n              expr->type_key = type_key;\r\n              e_string2expr_map_insert(scratch.arena, macro_map, push_str8f(scratch.arena, \"query:config.$%I64x\", tab->id), expr);\r\n              if(str8_match(tab->string, str8_lit(\"watch\"), 0))\r\n              {\r\n                cfg_node_ptr_list_push(scratch.arena, &watch_tabs, tab);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: add macros for all watches in all watch tabs which define identifiers\r\n      for(CFG_NodePtrNode *n = watch_tabs.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *watch_tab = n->v;\r\n        for(CFG_Node *child = watch_tab->first; child != &cfg_nil_node; child = child->next)\r\n        {\r\n          if(str8_match(child->string, str8_lit(\"watch\"), 0))\r\n          {\r\n            CFG_Node *watch = child;\r\n            String8 expr = watch->first->string;\r\n            E_Parse parse = e_parse_from_string(expr);\r\n            if(parse.msgs.max_kind == E_MsgKind_Null)\r\n            {\r\n              for(E_Expr *expr = parse.expr; expr != &e_expr_nil; expr = expr->next)\r\n              {\r\n                typedef struct ExprWalkTask ExprWalkTask;\r\n                struct ExprWalkTask\r\n                {\r\n                  ExprWalkTask *next;\r\n                  E_Expr *expr;\r\n                };\r\n                ExprWalkTask start_task = {0, expr};\r\n                ExprWalkTask *first_task = &start_task;\r\n                ExprWalkTask *last_task = first_task;\r\n                for(ExprWalkTask *t = first_task; t != 0; t = t->next)\r\n                {\r\n                  switch(t->expr->kind)\r\n                  {\r\n                    case E_ExprKind_Call:{}break;\r\n                    case E_ExprKind_Define:\r\n                    {\r\n                      E_Expr *lhs = t->expr->first;\r\n                      E_Expr *rhs = lhs->next;\r\n                      if(lhs->kind == E_ExprKind_LeafIdentifier)\r\n                      {\r\n                        e_string2expr_map_insert(scratch.arena, macro_map, lhs->string, rhs);\r\n                      }\r\n                    }break;\r\n                    default:\r\n                    {\r\n                      for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)\r\n                      {\r\n                        ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);\r\n                        SLLQueuePush(first_task, last_task, task);\r\n                        task->expr = child;\r\n                      }\r\n                    }break;\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: add macros for user/project\r\n      {\r\n        E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit(\"user\"));\r\n        E_Space space = rd_eval_space_from_cfg(cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\")));\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->space    = space;\r\n        expr->mode     = E_Mode_Offset;\r\n        expr->type_key = type_key;\r\n        e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"user_settings\"), expr);\r\n      }\r\n      {\r\n        E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, str8_lit(\"project\"));\r\n        E_Space space = rd_eval_space_from_cfg(cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\")));\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->space    = space;\r\n        expr->mode     = E_Mode_Offset;\r\n        expr->type_key = type_key;\r\n        e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"project_settings\"), expr);\r\n      }\r\n      \r\n      //- rjf: add macros for evallable control entities\r\n      String8 evallable_ctrl_names[] =\r\n      {\r\n        str8_lit(\"machine\"),\r\n        str8_lit(\"process\"),\r\n        str8_lit(\"thread\"),\r\n        str8_lit(\"module\"),\r\n      };\r\n      for EachElement(idx, evallable_ctrl_names)\r\n      {\r\n        String8 name = evallable_ctrl_names[idx];\r\n        CTRL_EntityKind kind = ctrl_entity_kind_from_string(name);\r\n        CTRL_EntityArray array = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, kind);\r\n        E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name);\r\n        for EachIndex(idx, array.count)\r\n        {\r\n          CTRL_Entity *entity = array.v[idx];\r\n          E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity);\r\n          E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n          expr->space    = space;\r\n          expr->mode     = E_Mode_Offset;\r\n          expr->type_key = type_key;\r\n          if(entity->string.size != 0)\r\n          {\r\n            e_string2expr_map_insert(scratch.arena, macro_map, entity->string, expr);\r\n          }\r\n          if(kind == CTRL_EntityKind_Machine && entity->handle.machine_id == CTRL_MachineID_Local)\r\n          {\r\n            e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"local_machine\"), expr);\r\n          }\r\n          if(kind == CTRL_EntityKind_Thread && ctrl_handle_match(rd_base_regs()->thread, entity->handle))\r\n          {\r\n            e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"current_thread\"), expr);\r\n          }\r\n          if(kind == CTRL_EntityKind_Process && ctrl_handle_match(rd_base_regs()->process, entity->handle))\r\n          {\r\n            e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"current_process\"), expr);\r\n          }\r\n          if(kind == CTRL_EntityKind_Module && ctrl_handle_match(rd_base_regs()->module, entity->handle))\r\n          {\r\n            e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"current_module\"), expr);\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: add macros for all ctrl entity collections\r\n      for EachElement(ctrl_name_idx, evallable_ctrl_names)\r\n      {\r\n        String8 kind_name = evallable_ctrl_names[ctrl_name_idx];\r\n        String8 collection_name = rd_plural_from_code_name(kind_name);\r\n        E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                        .name = collection_name,\r\n                                                        .access = E_TYPE_ACCESS_FUNCTION_NAME(ctrl_entities),\r\n                                                        .expand =\r\n                                                        {\r\n                                                          .info   = E_TYPE_EXPAND_INFO_FUNCTION_NAME(ctrl_entities),\r\n                                                          .range  = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(ctrl_entities)\r\n                                                        });\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->type_key = collection_type_key;\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);\r\n      }\r\n      \r\n      //- rjf: add macro for call stack tree\r\n#if 0\r\n      {\r\n        String8 collection_name = str8_lit(\"call_stack_tree\");\r\n        E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                        .name = collection_name,\r\n                                                        .flags = E_TypeFlag_StubSingleLineExpansion,\r\n                                                        .access = E_TYPE_ACCESS_FUNCTION_NAME(call_stack_tree),\r\n                                                        .expand =\r\n                                                        {\r\n                                                          .info   = E_TYPE_EXPAND_INFO_FUNCTION_NAME(call_stack_tree),\r\n                                                          .range  = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(call_stack_tree)\r\n                                                        });\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafValue, r1u64(0, 0));\r\n        expr->value.u64 = 1;\r\n        expr->type_key = collection_type_key;\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaCallStackTree);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);\r\n      }\r\n#endif\r\n      \r\n      //- rjf: add macro / lookup rules for unattached processes\r\n      {\r\n        String8 collection_name = str8_lit(\"unattached_processes\");\r\n        E_TypeKey collection_type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                        .name = collection_name,\r\n                                                        .flags = E_TypeFlag_StubSingleLineExpansion,\r\n                                                        .access = E_TYPE_ACCESS_FUNCTION_NAME(unattached_processes),\r\n                                                        .expand =\r\n                                                        {\r\n                                                          .info   = E_TYPE_EXPAND_INFO_FUNCTION_NAME(unattached_processes),\r\n                                                          .range  = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(unattached_processes)\r\n                                                        });\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->type_key = collection_type_key;\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaCtrlEntity);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, collection_name, collection_type_key);\r\n      }\r\n      \r\n      //- rjf: add macro for 'call_stack' -> 'query:current_thread.callstack'\r\n      {\r\n        E_Expr *expr = e_parse_from_string(str8_lit(\"query:current_thread.call_stack\")).expr;\r\n        e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"call_stack\"), expr);\r\n      }\r\n      \r\n      \r\n      //- rjf: add types for queries\r\n      {\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit(\"environment\"),\r\n                                    e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                    .name = str8_lit(\"environment\"),\r\n                                                    .irext  = E_TYPE_IREXT_FUNCTION_NAME(environment),\r\n                                                    .access = E_TYPE_ACCESS_FUNCTION_NAME(environment),\r\n                                                    .expand =\r\n                                                    {\r\n                                                      .info        = E_TYPE_EXPAND_INFO_FUNCTION_NAME(environment),\r\n                                                      .range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(environment),\r\n                                                      .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment),\r\n                                                      .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(environment),\r\n                                                    }));\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit(\"watches\"),\r\n                                    e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                    .flags = E_TypeFlag_EditableChildren|E_TypeFlag_StubSingleLineExpansion,\r\n                                                    .name = str8_lit(\"watches\"),\r\n                                                    .irext  = E_TYPE_IREXT_FUNCTION_NAME(watches),\r\n                                                    .access = E_TYPE_ACCESS_FUNCTION_NAME(watches),\r\n                                                    .expand =\r\n                                                    {\r\n                                                      .info        = E_TYPE_EXPAND_INFO_FUNCTION_NAME(watches),\r\n                                                      .range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(watches),\r\n                                                      .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches),\r\n                                                      .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(watches),\r\n                                                    }));\r\n        e_string2typekey_map_insert(rd_frame_arena(),\r\n                                    rd_state->meta_name2type_map,\r\n                                    str8_lit(\"call_stack\"),\r\n                                    e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                    .name = str8_lit(\"call_stack\"),\r\n                                                    .irext  = E_TYPE_IREXT_FUNCTION_NAME(call_stack),\r\n                                                    .access = E_TYPE_ACCESS_FUNCTION_NAME(call_stack),\r\n                                                    .expand =\r\n                                                    {\r\n                                                      .info    = E_TYPE_EXPAND_INFO_FUNCTION_NAME(call_stack),\r\n                                                    }));\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit(\"theme_colors\"),\r\n                                    e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                    .flags = E_TypeFlag_StubSingleLineExpansion,\r\n                                                    .name = str8_lit(\"theme_colors\"),\r\n                                                    .irext  = E_TYPE_IREXT_FUNCTION_NAME(cfgs_slice),\r\n                                                    .access = E_TYPE_ACCESS_FUNCTION_NAME(cfgs_slice),\r\n                                                    .expand =\r\n                                                    {\r\n                                                      .info        = E_TYPE_EXPAND_INFO_FUNCTION_NAME(cfgs_query),\r\n                                                      .range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(cfgs_slice),\r\n                                                      .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice),\r\n                                                      .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(cfgs_slice),\r\n                                                    }));\r\n        e_string2typekey_map_insert(rd_frame_arena(), rd_state->meta_name2type_map, str8_lit(\"environment\"),\r\n                                    e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                                    .name = str8_lit(\"environment\"),\r\n                                                    .irext  = E_TYPE_IREXT_FUNCTION_NAME(environment),\r\n                                                    .access = E_TYPE_ACCESS_FUNCTION_NAME(environment),\r\n                                                    .expand =\r\n                                                    {\r\n                                                      .info        = E_TYPE_EXPAND_INFO_FUNCTION_NAME(environment),\r\n                                                      .range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(environment),\r\n                                                      .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment),\r\n                                                      .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(environment),\r\n                                                    }));\r\n      }\r\n      \r\n      //- rjf: add macro for collections with specific lookup rules (but no unique id rules)\r\n      {\r\n        struct\r\n        {\r\n          String8 name;\r\n          E_TypeExpandInfoFunctionType *info;\r\n          E_TypeExpandRangeFunctionType *range;\r\n        }\r\n        collection_infos[] =\r\n        {\r\n#define Collection(name) {str8_lit_comp(#name), E_TYPE_EXPAND_INFO_FUNCTION_NAME(name), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(name)}\r\n          Collection(locals),\r\n          Collection(registers),\r\n#undef Collection\r\n        };\r\n        for EachElement(idx, collection_infos)\r\n        {\r\n          String8 collection_name = collection_infos[idx].name;\r\n          E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n          expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                           .name = collection_name,\r\n                                           .expand =\r\n                                           {\r\n                                             .info  = collection_infos[idx].info,\r\n                                             .range = collection_infos[idx].range,\r\n                                           });\r\n          expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n          e_string2expr_map_insert(scratch.arena, macro_map, collection_name, expr);\r\n        }\r\n      }\r\n      \r\n      //- rjf: add macros for debug info table collections\r\n      String8 debug_info_table_collection_names[] =\r\n      {\r\n        str8_lit_comp(\"procedures\"),\r\n        str8_lit_comp(\"thread_locals\"),\r\n        str8_lit_comp(\"constants\"),\r\n        str8_lit_comp(\"globals\"),\r\n        str8_lit_comp(\"types\"),\r\n        str8_lit_comp(\"source_files\"),\r\n      };\r\n      for EachElement(idx, debug_info_table_collection_names)\r\n      {\r\n        String8 name = debug_info_table_collection_names[idx];\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->space = e_space_make(RD_EvalSpaceKind_MetaQuery);\r\n        expr->type_key = e_type_key_cons(.kind = E_TypeKind_Set,\r\n                                         .flags = E_TypeFlag_StubSingleLineExpansion,\r\n                                         .name = name,\r\n                                         .expand =\r\n                                         {\r\n                                           .info        = E_TYPE_EXPAND_INFO_FUNCTION_NAME(debug_info_table),\r\n                                           .range       = E_TYPE_EXPAND_RANGE_FUNCTION_NAME(debug_info_table),\r\n                                           .id_from_num = E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(debug_info_table),\r\n                                           .num_from_id = E_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_NAME(debug_info_table)\r\n                                         });\r\n        e_string2expr_map_insert(scratch.arena, macro_map, name, expr);\r\n      }\r\n      \r\n      //- rjf: add macro for output log\r\n      {\r\n        Access *access = access_open();\r\n        C_Key key = d_state->output_log_key;\r\n        U128 hash = c_hash_from_key(key, 0);\r\n        String8 data = c_data_from_hash(access, hash);\r\n        E_Space space = e_space_make(E_SpaceKind_HashStoreKey);\r\n        space.u64_0 = key.root.u64[0];\r\n        space.u128 = key.id.u128[0];\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->space    = space;\r\n        expr->mode     = E_Mode_Offset;\r\n        expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, str8_lit(\"output\"), expr);\r\n        access_close(access);\r\n      }\r\n      \r\n      //- rjf: (DEBUG) add macro for cfg strings\r\n#if 0\r\n      {\r\n        struct\r\n        {\r\n          C_Key key;\r\n          String8 name;\r\n        }\r\n        table[] =\r\n        {\r\n          {rd_state->user_cfg_string_key, str8_lit(\"raddbg_user_data\")},\r\n          {rd_state->project_cfg_string_key, str8_lit(\"raddbg_project_data\")},\r\n          {rd_state->cmdln_cfg_string_key, str8_lit(\"raddbg_command_line_data\")},\r\n          {rd_state->transient_cfg_string_key, str8_lit(\"raddbg_transient_data\")},\r\n        };\r\n        for EachElement(idx, table)\r\n        {\r\n          Access *access = access_open();\r\n          C_Key key = table[idx].key;\r\n          U128 hash = c_hash_from_key(key, 0);\r\n          String8 data = c_data_from_hash(access, hash);\r\n          E_Space space = e_space_make(E_SpaceKind_HashStoreKey);\r\n          E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n          space.u64_0 = key.root.u64[0];\r\n          space.u128 = key.id.u128[0];\r\n          expr->space    = space;\r\n          expr->mode     = E_Mode_Offset;\r\n          expr->type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), data.size, 0);\r\n          e_string2expr_map_insert(scratch.arena, macro_map, table[idx].name, expr);\r\n          access_close(access);\r\n        }\r\n      }\r\n#endif\r\n      \r\n      //- rjf: choose set of lenses\r\n      // TODO(rjf): @lenses generate via metaprogram\r\n      struct\r\n      {\r\n        String8 name;\r\n        B32 inherited_by_members;\r\n        B32 inherited_by_elements;\r\n        B32 array_like;\r\n        E_TypeIRExtFunctionType *irext;\r\n        E_TypeAccessFunctionType *access;\r\n        E_TypeExpandRule expand;\r\n        RD_ViewUIFunctionType *ui;\r\n        EV_ExpandRuleInfoHookFunctionType *ev_expand;\r\n      }\r\n      lens_table[] =\r\n      {\r\n        {str8_lit(\"raw\"),         0, 0, 0,        0, 0, {0}},\r\n        {str8_lit(\"bin\"),         1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"oct\"),         1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"dec\"),         1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"hex\"),         1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"digits\"),      1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"no_string\"),   1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"no_char\"),     1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"no_addr\"),     1, 1, 0,        0, 0, {0}},\r\n        {str8_lit(\"sequence\"),    0, 0, 1,        0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(sequence), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(sequence)}},\r\n        {str8_lit(\"rows\"),        0, 0, 0,        0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(rows), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(rows)}},\r\n        {str8_lit(\"columns\"),     0, 0, 0,        0, 0, {0}},\r\n        {str8_lit(\"flatten\"),     0, 0, 0,        0, 0, {0}},\r\n        {str8_lit(\"omit\"),        0, 0, 0,        0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(omit), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(omit)}},\r\n        {str8_lit(\"range1\"),      0, 0, 0,        0, 0, {0}},\r\n        {str8_lit(\"array\"),       0, 0, 1,        0, 0, {E_TYPE_EXPAND_INFO_FUNCTION_NAME(array), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(array)}},\r\n        {str8_lit(\"slice\"),       0, 0, 1,        E_TYPE_IREXT_FUNCTION_NAME(slice), E_TYPE_ACCESS_FUNCTION_NAME(slice), {E_TYPE_EXPAND_INFO_FUNCTION_NAME(slice), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(slice)}},\r\n        {str8_lit(\"list\"),        0, 0, 1,        E_TYPE_IREXT_FUNCTION_NAME(list), E_TYPE_ACCESS_FUNCTION_NAME(list), {E_TYPE_EXPAND_INFO_FUNCTION_NAME(list), E_TYPE_EXPAND_RANGE_FUNCTION_NAME(list)}},\r\n        {str8_lit(\"text\"),        0, 0, 0,        0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(text),              EV_EXPAND_RULE_INFO_FUNCTION_NAME(text)},\r\n        {str8_lit(\"disasm\"),      0, 0, 0,        0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(disasm),            EV_EXPAND_RULE_INFO_FUNCTION_NAME(disasm)},\r\n        {str8_lit(\"memory\"),      0, 0, 0,        0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(memory),            EV_EXPAND_RULE_INFO_FUNCTION_NAME(memory)},\r\n        {str8_lit(\"bitmap\"),      0, 0, 0,        0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(bitmap),            EV_EXPAND_RULE_INFO_FUNCTION_NAME(bitmap)},\r\n        {str8_lit(\"color\"),       0, 0, 0,        0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(color),             EV_EXPAND_RULE_INFO_FUNCTION_NAME(color)},\r\n        {str8_lit(\"geo3d\"),       0, 0, 0,        0, 0, {0}, RD_VIEW_UI_FUNCTION_NAME(geo3d),             EV_EXPAND_RULE_INFO_FUNCTION_NAME(geo3d)},\r\n      };\r\n      \r\n      //- rjf: fill lenses in ev expand rule map, rd view ui rule map\r\n      {\r\n        for EachElement(idx, lens_table)\r\n        {\r\n          if(lens_table[idx].ui != 0)\r\n          {\r\n            rd_view_ui_rule_map_insert(scratch.arena, rd_state->view_ui_rule_map, lens_table[idx].name, lens_table[idx].ui);\r\n          }\r\n          if(lens_table[idx].ev_expand != 0)\r\n          {\r\n            ev_expand_rule_table_push_new(scratch.arena, expand_rule_table, lens_table[idx].name, lens_table[idx].ev_expand);\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: fill macros w/ types for lenses\r\n      for EachElement(idx, lens_table)\r\n      {\r\n        E_TypeFlags type_flags = 0;\r\n        if(lens_table[idx].inherited_by_members)\r\n        {\r\n          type_flags |= E_TypeFlag_InheritedByMembers;\r\n        }\r\n        if(lens_table[idx].inherited_by_elements)\r\n        {\r\n          type_flags |= E_TypeFlag_InheritedByElements;\r\n        }\r\n        if(lens_table[idx].array_like)\r\n        {\r\n          type_flags |= E_TypeFlag_ArrayLikeExpansion;\r\n        }\r\n        E_Expr *expr = e_push_expr(scratch.arena, E_ExprKind_LeafOffset, r1u64(0, 0));\r\n        expr->type_key = e_type_key_cons(.kind = E_TypeKind_LensSpec,\r\n                                         .flags = type_flags,\r\n                                         .name = lens_table[idx].name,\r\n                                         .irext = lens_table[idx].irext,\r\n                                         .access = lens_table[idx].access,\r\n                                         .expand = lens_table[idx].expand);\r\n        e_string2expr_map_insert(scratch.arena, macro_map, lens_table[idx].name, expr);\r\n      }\r\n    }\r\n    ev_select_expand_rule_table(expand_rule_table);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather config from loaded modules\r\n    //\r\n    CFG_NodePtrList immediate_type_views = {0};\r\n    CTRL_EntityArray modules = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Module);\r\n    ProfScope(\"gather config from loaded modules\")\r\n    {\r\n      for EachIndex(idx, modules.count)\r\n      {\r\n        CTRL_Entity *module = modules.v[idx];\r\n        String8 raddbg_data = ctrl_raddbg_data_from_module(scratch.arena, module->handle);\r\n        U8 split_char = 0;\r\n        String8List raddbg_data_text_parts = str8_split(scratch.arena, raddbg_data, &split_char, 1, 0);\r\n        U64 cfg_idx = 0;\r\n        for(String8Node *text_n = raddbg_data_text_parts.first; text_n != 0; text_n = text_n->next)\r\n        {\r\n          String8 text = text_n->string;\r\n          CFG_NodePtrList cfgs = cfg_node_ptr_list_from_string(scratch.arena, rd_state->cfg, rd_state->cfg_schema_table, str8_zero(), text);\r\n          String8 module_name = ctrl_string_from_handle(scratch.arena, module->handle);\r\n          for(CFG_NodePtrNode *n = cfgs.first; n != 0; n = n->next, cfg_idx += 1)\r\n          {\r\n            CFG_Node *immediate_root = rd_immediate_cfg_from_keyf(\"module_%S_cfg_%I64x\", module_name, cfg_idx);\r\n            cfg_node_release_all_children(rd_state->cfg, immediate_root);\r\n            cfg_node_insert_child(rd_state->cfg, immediate_root, immediate_root->last, n->v);\r\n            cfg_node_ptr_list_push(scratch.arena, &immediate_type_views, n->v);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: construct default immediate-mode configs based on loaded modules\r\n    //\r\n    ProfScope(\"construct default immediate-mode configs based on loaded modules\")\r\n    {\r\n      local_persist read_only struct\r\n      {\r\n        B32 stl;\r\n        B32 ue;\r\n        String8 pattern;\r\n        String8 expr;\r\n      }\r\n      type_views[] =\r\n      {\r\n        { 1, 0, str8_lit_comp(\"std::vector<?>\"),             str8_lit_comp(\"slice(_Mypair._Myval2)\") },\r\n        { 1, 0, str8_lit_comp(\"std::unique_ptr<?>\"),         str8_lit_comp(\"_Mypair._Myval2\") },\r\n        { 1, 0, str8_lit_comp(\"std::basic_string<?>\"),       str8_lit_comp(\"_Mypair._Myval2._Myres <= 15 ? _Mypair._Myval2._Bx._Buf : array(_Mypair._Myval2._Bx._Ptr, _Mypair._Myval2._Mysize)\") },\r\n        { 1, 0, str8_lit_comp(\"std::basic_string_view<?>\"),  str8_lit_comp(\"array(_Mydata, _Mysize)\") },\r\n        { 0, 1, str8_lit_comp(\"FString\"),                    str8_lit_comp(\"(TCHAR *)Data.AllocatorInstance.Data, Data.ArrayNum\") },\r\n        { 0, 1, str8_lit_comp(\"FAnsiString\"),                str8_lit_comp(\"(ANSICHAR *)Data.AllocatorInstance.Data, Data.ArrayNum\") },\r\n        { 0, 1, str8_lit_comp(\"FUtf8String\"),                str8_lit_comp(\"(UTF8CHAR *)Data.AllocatorInstance.Data, Data.ArrayNum\") },\r\n        { 0, 1, str8_lit_comp(\"TStringView<?>\"),             str8_lit_comp(\"DataPtr, Size\") },\r\n        { 0, 1, str8_lit_comp(\"TArray<?{element_type}>\"),    str8_lit_comp(\"array(cast(element_type *)AllocatorInstance.Data, ArrayNum)\") },\r\n        { 0, 1, str8_lit_comp(\"TSharedRef<?>\"),              str8_lit_comp(\"Object\") },\r\n        { 0, 1, str8_lit_comp(\"TRefCountPtr<?>\"),            str8_lit_comp(\"Reference\") },\r\n        { 0, 1, str8_lit_comp(\"FNameEntry\"),                 str8_lit_comp(\"AnsiName, Header.Len\") },\r\n        { 0, 1, str8_lit_comp(\"FNameEntryId\"),               str8_lit_comp(\"*(cast(FNameEntry *)(&GNameBlocksDebug[Value >> FNameDebugVisualizer::OffsetBits][FNameDebugVisualizer::EntryStride * (Value & FNameDebugVisualizer::OffsetMask)]))\") },\r\n        { 0, 1, str8_lit_comp(\"TObjectPtr<?>\"),              str8_lit_comp(\"DebugPtr\") },\r\n        { 0, 1, str8_lit_comp(\"FColor\"),                     str8_lit_comp(\"hex(color(Bits))\") },\r\n      };\r\n      if(rd_state->use_default_stl_type_views)\r\n      {\r\n        for EachElement(idx, type_views)\r\n        {\r\n          if((type_views[idx].stl && rd_state->use_default_stl_type_views) ||\r\n             (type_views[idx].ue  && rd_state->use_default_ue_type_views))\r\n          {\r\n            CFG_Node *immediate_root = rd_immediate_cfg_from_keyf(\"default_type_vis_%I64x\", idx);\r\n            CFG_Node *type_view = cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate_root, str8_lit(\"type_view\"));\r\n            CFG_Node *type = cfg_node_child_from_string_or_alloc(rd_state->cfg, type_view, str8_lit(\"type\"));\r\n            CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, type_view, str8_lit(\"expr\"));\r\n            cfg_node_new_replace(rd_state->cfg, type, type_views[idx].pattern);\r\n            cfg_node_new_replace(rd_state->cfg, expr, type_views[idx].expr);\r\n            cfg_node_ptr_list_push(scratch.arena, &immediate_type_views, type_view);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: add auto-hook rules for type views\r\n    //\r\n    {\r\n      CFG_NodePtrList type_views = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"type_view\"));\r\n      CFG_NodePtrList rules_lists[] =\r\n      {\r\n        type_views,\r\n        immediate_type_views,\r\n      };\r\n      for EachElement(list_idx, rules_lists)\r\n      {\r\n        CFG_NodePtrList list = rules_lists[list_idx];\r\n        for(CFG_NodePtrNode *n = list.first; n != 0; n = n->next)\r\n        {\r\n          CFG_Node *rule = n->v;\r\n          String8 type_string = cfg_node_child_from_string(rule, str8_lit(\"type\"))->first->string;\r\n          String8 expr_string = cfg_node_child_from_string(rule, str8_lit(\"expr\"))->first->string;\r\n          e_auto_hook_map_insert_new(scratch.arena, auto_hook_map, .type_pattern = type_string, .tag_expr_string = expr_string);\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build IR evaluation context\r\n    //\r\n    E_IRCtx *ir_ctx = push_array(scratch.arena, E_IRCtx, 1);\r\n    {\r\n      E_IRCtx *ctx = ir_ctx;\r\n      ctx->regs_map       = ctrl_string2reg_from_arch(eval_base_ctx->primary_module->arch);\r\n      ctx->reg_alias_map  = ctrl_string2alias_from_arch(eval_base_ctx->primary_module->arch);\r\n      ctx->locals_map     = d_query_cached_locals_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff);\r\n      ctx->member_map     = d_query_cached_member_map_from_dbgi_key_voff(eval_base_ctx->primary_dbg_info->dbgi_key, rip_voff);\r\n      ctx->macro_map      = macro_map;\r\n      ctx->auto_hook_map  = auto_hook_map;\r\n    }\r\n    e_select_ir_ctx(ir_ctx);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build eval interpretation context\r\n    //\r\n    E_InterpretCtx *interpret_ctx = push_array(scratch.arena, E_InterpretCtx, 1);\r\n    {\r\n      E_InterpretCtx *ctx = interpret_ctx;\r\n      ctx->primary_space     = eval_modules_primary->space;\r\n      ctx->reg_arch          = eval_modules_primary->arch;\r\n      ctx->reg_space         = rd_eval_space_from_ctrl_entity(thread, CTRL_EvalSpaceKind_Entity);\r\n      ctx->reg_unwind_count  = unwind_count;\r\n      ctx->module_base       = push_array(scratch.arena, U64, 1);\r\n      ctx->module_base[0]    = module->vaddr_range.min;\r\n      ctx->frame_base        = push_array(scratch.arena, U64, 1);\r\n      ctx->tls_base          = push_array(scratch.arena, U64, 1);\r\n      ctx->tls_base[0]       = d_query_cached_tls_base_vaddr_from_process_root_rip(process, tls_root_vaddr, rip_vaddr);\r\n    }\r\n    e_select_interpret_ctx(interpret_ctx, eval_dbg_infos_primary->rdi, rip_voff);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: evaluate unpacked settings (must be used earlier than this point in the frame,\r\n    // but cannot evaluate before this point, so we need to prep for next frame\r\n    //\r\n    rd_state->alt_menu_bar_enabled = rd_setting_b32_from_name(str8_lit(\"focus_menu_bar_with_alt\"));\r\n    rd_state->use_default_stl_type_views = rd_setting_b32_from_name(str8_lit(\"use_default_stl_type_views\"));\r\n    rd_state->use_default_ue_type_views = rd_setting_b32_from_name(str8_lit(\"use_default_ue_type_views\"));\r\n    \r\n    ////////////////////////////\r\n    //- rjf: autosave if needed\r\n    //\r\n    {\r\n      rd_state->seconds_until_autosave -= rd_state->frame_dt;\r\n      if(rd_state->seconds_until_autosave <= 0.f)\r\n      {\r\n        rd_cmd(RD_CmdKind_WriteUserData);\r\n        rd_cmd(RD_CmdKind_WriteProjectData);\r\n        rd_state->seconds_until_autosave = 5.f;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: process top-level graphical commands\r\n    //\r\n    if(rd_state->frame_depth == 1) ProfScope(\"process top-level graphical commands\")\r\n    {\r\n      for(;rd_next_cmd(&cmd);) RD_RegsScope()\r\n      {\r\n        // rjf: unpack command\r\n        RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n        rd_regs_copy_contents(rd_frame_arena(), rd_regs(), cmd->regs);\r\n        \r\n        // rjf: request frame\r\n        rd_request_frame();\r\n        \r\n        // rjf: process command\r\n        CFG_Node *cfg = &cfg_nil_node;\r\n        String8 dst_path = {0};\r\n        String8 bucket_name = {0};\r\n        Dir2 split_dir = Dir2_Invalid;\r\n        CFG_Node *split_panel = &cfg_nil_node;\r\n        U64 panel_sib_off = 0;\r\n        U64 panel_child_off = 0;\r\n        Vec2S32 panel_change_dir = {0};\r\n        switch(kind)\r\n        {\r\n          //- rjf: default cases\r\n          case RD_CmdKind_Run:\r\n          case RD_CmdKind_LaunchAndRun:\r\n          case RD_CmdKind_LaunchAndStepInto:\r\n          case RD_CmdKind_StepInto:\r\n          case RD_CmdKind_StepOver:\r\n          case RD_CmdKind_Restart:\r\n          {\r\n            // rjf: reset hit counts\r\n            CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n            if(processes.count == 0 || kind == RD_CmdKind_Restart)\r\n            {\r\n              CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n              for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next)\r\n              {\r\n                CFG_Node *hit_count = cfg_node_child_from_string_or_alloc(rd_state->cfg, n->v, str8_lit(\"hit_count\"));\r\n                cfg_node_new_replace(rd_state->cfg, hit_count, str8_lit(\"0\"));\r\n              }\r\n            }\r\n            \r\n            // rjf: determine if we have active targets\r\n            CFG_NodePtrList targets = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"target\"));\r\n            B32 has_active_targets = 0;\r\n            for(CFG_NodePtrNode *n = targets.first; n != 0; n = n->next)\r\n            {\r\n              CFG_Node *target = n->v;\r\n              if(!rd_disabled_from_cfg(target))\r\n              {\r\n                has_active_targets = 1;\r\n                break;\r\n              }\r\n            }\r\n            \r\n            // rjf: run -> refocus pre-stop focused window\r\n            if(kind == RD_CmdKind_Run)\r\n            {\r\n              os_focus_external_window(rd_state->prestop_focused_window);\r\n            }\r\n            \r\n            // rjf: run -> no active targets, no processes, but we only have one target? -> just launch it, then select it\r\n            if((kind == RD_CmdKind_Run ||\r\n                kind == RD_CmdKind_StepInto ||\r\n                kind == RD_CmdKind_StepOver) && processes.count == 0 && targets.count == 1 && !has_active_targets)\r\n            {\r\n              rd_cmd(kind == RD_CmdKind_Run ? RD_CmdKind_LaunchAndRun : RD_CmdKind_LaunchAndStepInto, .cfg = targets.first->v->id);\r\n              rd_cmd(RD_CmdKind_SelectTarget, .cfg = targets.first->v->id);\r\n              break;\r\n            }\r\n            \r\n            // rjf: run -> no targets at all, no processes? -> do helper for add-target\r\n            if((kind == RD_CmdKind_Run ||\r\n                kind == RD_CmdKind_StepInto ||\r\n                kind == RD_CmdKind_StepOver) && targets.count == 0 && processes.count == 0)\r\n            {\r\n              rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_AddTarget].string);\r\n              break;\r\n            }\r\n            \r\n            // rjf: run -> no active targets, no processes? -> do helper for launch-and-run\r\n            if((kind == RD_CmdKind_Run ||\r\n                kind == RD_CmdKind_StepInto ||\r\n                kind == RD_CmdKind_StepOver) && processes.count == 0 && !has_active_targets)\r\n            {\r\n              rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[kind == RD_CmdKind_Run ? RD_CmdKind_LaunchAndRun : RD_CmdKind_LaunchAndStepInto].string);\r\n              break;\r\n            }\r\n            \r\n            // rjf: if this is a low-level operation, e.g. launch-and-run or launch-and-step-into,\r\n            // and we do not have any active targets, then let's just select the ones that we are\r\n            // launching.\r\n            if(!has_active_targets &&\r\n               (kind == RD_CmdKind_LaunchAndRun ||\r\n                kind == RD_CmdKind_LaunchAndStepInto))\r\n            {\r\n              rd_cmd(RD_CmdKind_SelectTarget, .cfg = rd_regs()->cfg);\r\n            }\r\n          } // fallthrough\r\n          default:\r\n          {\r\n            // rjf: try to run engine command\r\n            if(D_CmdKind_Null < (D_CmdKind)kind && (D_CmdKind)kind < D_CmdKind_COUNT)\r\n            {\r\n              D_CmdParams params = {0};\r\n              params.machine       = rd_regs()->machine;\r\n              params.process       = rd_regs()->process;\r\n              params.thread        = rd_regs()->thread;\r\n              params.entity        = rd_regs()->ctrl_entity;\r\n              params.string        = rd_regs()->string;\r\n              params.file_path     = rd_regs()->file_path;\r\n              params.cursor        = rd_regs()->cursor;\r\n              params.vaddr         = rd_regs()->vaddr;\r\n              params.prefer_disasm = rd_regs()->prefer_disasm;\r\n              params.pid           = rd_regs()->pid;\r\n              params.targets.count = 1;\r\n              params.targets.v = push_array(scratch.arena, D_Target, params.targets.count);\r\n              params.targets.v[0] = rd_target_from_cfg(scratch.arena, cfg_node_from_id(rd_regs()->cfg));\r\n              d_push_cmd((D_CmdKind)kind, &params);\r\n            }\r\n            \r\n            // rjf: try to open tabs, if this is a tab-fastpath-opener\r\n            if(kind >= RD_CmdKind_FirstTabFastPathCmd)\r\n            {\r\n              U64 fast_path_idx = (kind - RD_CmdKind_FirstTabFastPathCmd);\r\n              String8 view_name = rd_tab_fast_path_view_name_table[fast_path_idx];\r\n              String8 query_name = rd_tab_fast_path_query_name_table[fast_path_idx];\r\n              rd_cmd(RD_CmdKind_BuildTab, .string = view_name, .expr = query_name);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: open palette\r\n          case RD_CmdKind_OpenPalette:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            CFG_Node *tab = panel_tree.focused->selected_tab;\r\n            String8List exprs = {0};\r\n            {\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:commands\");\r\n              if(tab != &cfg_nil_node)\r\n              {\r\n                str8_list_pushf(scratch.arena, &exprs, \"query:config.$%I64x\", tab->id);\r\n              }\r\n              if(window != &cfg_nil_node)\r\n              {\r\n                str8_list_pushf(scratch.arena, &exprs, \"query:config.$%I64x\", window->id);\r\n              }\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:targets\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:breakpoints\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:recent_files\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:recent_projects\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:machines\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:processes\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:threads\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:modules\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:user_settings\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:project_settings\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:procedures\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:types\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:globals\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:thread_locals\");\r\n              str8_list_pushf(scratch.arena, &exprs, \"query:source_files\");\r\n            }\r\n            String8 expr = str8_list_join(scratch.arena, &exprs, &(StringJoin){.sep = str8_lit(\", \")});\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = expr, .do_implicit_root = 1, .do_lister = 1, .do_big_rows = 1, .view = tab->id, .tab = tab->id);\r\n          }break;\r\n          \r\n          //- rjf: command fast paths\r\n          case RD_CmdKind_RunCommand:\r\n          case RD_CmdKind_OpenTab:\r\n          {\r\n            RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(cmd->regs->cmd_name);\r\n            \r\n            // rjf: command does not have a query - simply execute with the current registers\r\n            if(!(info->query.flags & RD_QueryFlag_Required))\r\n            {\r\n              RD_RegsScope(.cmd_name = str8_zero()) rd_push_cmd(cmd->regs->cmd_name, rd_regs());\r\n            }\r\n            \r\n            // rjf: command has filesystem query, user wants native filesystem UI -> get the path then run the command\r\n            else if(info->query.slot == RD_RegSlot_FilePath && rd_setting_b32_from_name(str8_lit(\"use_native_file_system_dialog\")))\r\n            {\r\n              CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n              CFG_Node *current_path = cfg_node_child_from_string(user, str8_lit(\"current_path\"));\r\n              String8 current_path_string = current_path->first->string;\r\n              if(current_path_string.size == 0)\r\n              {\r\n                current_path_string = path_normalized_from_string(scratch.arena, os_get_current_path(scratch.arena));\r\n              }\r\n              String8 file_path = os_graphical_pick_file(scratch.arena, current_path_string);\r\n              file_path = path_normalized_from_string(scratch.arena, file_path);\r\n              if(file_path.size != 0)\r\n              {\r\n                RD_RegsScope(.cmd_name = str8_zero(), .file_path = file_path) rd_push_cmd(cmd->regs->cmd_name, rd_regs());\r\n                rd_cmd(RD_CmdKind_SetCurrentPath, .file_path = str8_chop_last_slash(file_path));\r\n              }\r\n            }\r\n            \r\n            // rjf: command has required query -> prep query\r\n            else\r\n            {\r\n              rd_cmd(RD_CmdKind_PushQuery,\r\n                     .do_implicit_root = 1,\r\n                     .do_lister = info->query.expr.size != 0);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: external driver textual commands\r\n          case RD_CmdKind_RunExternalDriverTextCommand:\r\n          {\r\n            String8 msg = rd_regs()->string;\r\n            String8List msg_parts = str8_split(scratch.arena, msg, (U8 *)\" \", 1, 0);\r\n            CmdLine msg_cmd_line = cmd_line_from_string_list(scratch.arena, msg_parts);\r\n            String8 cmd_kind_name = str8_list_first(&msg_cmd_line.inputs);\r\n            RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_kind_name);\r\n            if(cmd_kind_info != &rd_nil_cmd_kind_info) RD_RegsScope()\r\n            {\r\n              for EachNonZeroEnumVal(RD_RegSlot, s)\r\n              {\r\n                String8 reg_slot_name = rd_reg_slot_code_name_table[s];\r\n                String8 value = cmd_line_string(&msg_cmd_line, reg_slot_name);\r\n                if(value.size != 0)\r\n                {\r\n                  rd_regs_fill_slot_from_string(s, cmd_kind_info->query.expr, value);\r\n                }\r\n              }\r\n              String8 primary_args_string = {0};\r\n              if(msg_cmd_line.inputs.first != 0)\r\n              {\r\n                String8List primary_args_strings = {0};\r\n                for(String8Node *n = msg_cmd_line.inputs.first->next; n != 0; n = n->next)\r\n                {\r\n                  str8_list_push(scratch.arena, &primary_args_strings, n->string);\r\n                }\r\n                primary_args_string = str8_list_join(scratch.arena, &primary_args_strings, &(StringJoin){.sep = str8_lit(\" \")});\r\n              }\r\n              rd_regs_fill_slot_from_string(cmd_kind_info->query.slot, cmd_kind_info->query.expr, primary_args_string);\r\n              rd_push_cmd(cmd_kind_name, rd_regs());\r\n            }\r\n            else\r\n            {\r\n              log_user_errorf(\"`%S` is not a command.\", cmd_kind_name);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: exiting\r\n          case RD_CmdKind_Exit:\r\n          {\r\n            // rjf: if control processes are live, but this is not force-confirmed, then\r\n            // get confirmation from user\r\n            CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n            UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit(\"lossy_exit_confirmation\"));\r\n            if(processes.count != 0 && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key))\r\n            {\r\n              rd_state->popup_key = key;\r\n              rd_state->popup_active = 1;\r\n              arena_clear(rd_state->popup_arena);\r\n              MemoryZeroStruct(&rd_state->popup_cmds);\r\n              rd_state->popup_title = push_str8f(rd_state->popup_arena, \"Are you sure you want to exit?\");\r\n              rd_state->popup_desc = push_str8f(rd_state->popup_arena, \"The debugger is still attached to %slive process%s.\",\r\n                                                processes.count == 1 ? \"a \" : \"\",\r\n                                                processes.count == 1 ? \"\"   : \"es\");\r\n              RD_Regs *regs = rd_regs_copy(rd_frame_arena(), rd_regs());\r\n              regs->force_confirm = 1;\r\n              rd_cmd_list_push_new(rd_state->popup_arena, &rd_state->popup_cmds, rd_cmd_kind_info_table[RD_CmdKind_Exit].string, regs);\r\n            }\r\n            \r\n            // rjf: otherwise, actually exit\r\n            else\r\n            {\r\n              rd_cmd(RD_CmdKind_WriteUserData);\r\n              rd_cmd(RD_CmdKind_WriteProjectData);\r\n              rd_state->quit = 1;\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: windows\r\n          case RD_CmdKind_OpenWindow:\r\n          {\r\n            CFG_Node *old_window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_Node *bucket = old_window->parent;\r\n            if(bucket == &cfg_nil_node)\r\n            {\r\n              bucket = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            }\r\n            CFG_Node *new_window = cfg_node_new(rd_state->cfg, bucket, str8_lit(\"window\"));\r\n            CFG_Node *size = cfg_node_new(rd_state->cfg, new_window, str8_lit(\"size\"));\r\n            cfg_node_newf(rd_state->cfg, size, \"1280\");\r\n            cfg_node_newf(rd_state->cfg, size, \"720\");\r\n            for(CFG_Node *old_child = old_window->first; old_child != &cfg_nil_node; old_child = old_child->next)\r\n            {\r\n              if(!str8_match(old_child->string, str8_lit(\"panels\"), 0) &&\r\n                 !str8_match(old_child->string, str8_lit(\"size\"), 0) &&\r\n                 !str8_match(old_child->string, str8_lit(\"pos\"), 0) &&\r\n                 !str8_match(old_child->string, str8_lit(\"monitor\"), 0) &&\r\n                 !str8_match(old_child->string, str8_lit(\"fullscreen\"), 0) &&\r\n                 !str8_match(old_child->string, str8_lit(\"maximized\"), 0))\r\n              {\r\n                CFG_Node *new_child = cfg_node_deep_copy(rd_state->cfg, old_child);\r\n                cfg_node_insert_child(rd_state->cfg, new_window, new_window->last, new_child);\r\n              }\r\n            }\r\n            CFG_Node *panels = cfg_node_new(rd_state->cfg, new_window, str8_lit(\"panels\"));\r\n            cfg_node_child_from_string_or_alloc(rd_state->cfg, panels, str8_lit(\"selected\"));\r\n          }break;\r\n          case RD_CmdKind_WindowSettings:\r\n          {\r\n            String8 expr = push_str8f(scratch.arena, \"query:config.$%I64x\", rd_regs()->window);\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = expr, .do_implicit_root = 1, .do_big_rows = 1, .do_lister = 1);\r\n          }break;\r\n          case RD_CmdKind_CloseWindow:\r\n          {\r\n            CFG_NodePtrList all_windows = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"window\"));\r\n            CFG_Node *wcfg = cfg_node_from_id(rd_regs()->window);\r\n            if(all_windows.count == 1 && all_windows.first->v == wcfg)\r\n            {\r\n              rd_cmd(RD_CmdKind_Exit);\r\n            }\r\n            else\r\n            {\r\n              cfg_node_release(rd_state->cfg, wcfg);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_ToggleFullscreen:\r\n          {\r\n            CFG_Node *wcfg = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(wcfg);\r\n            if(ws != &rd_nil_window_state)\r\n            {\r\n              os_window_set_fullscreen(ws->os, !os_window_is_fullscreen(ws->os));\r\n            }\r\n          }break;\r\n          case RD_CmdKind_BringToFront:\r\n          {\r\n            CFG_Node *last_focused_wcfg = cfg_node_from_id(rd_state->last_focused_window);\r\n            RD_WindowState *last_focused_ws = rd_window_state_from_cfg(last_focused_wcfg);\r\n            if(last_focused_ws == &rd_nil_window_state)\r\n            {\r\n              last_focused_ws = rd_state->first_window_state;\r\n            }\r\n            if(last_focused_ws != &rd_nil_window_state)\r\n            {\r\n              os_window_set_minimized(last_focused_ws->os, 0);\r\n              os_window_focus(last_focused_ws->os);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: confirmations\r\n          case RD_CmdKind_PopupAccept:\r\n          {\r\n            rd_state->popup_active = 0;\r\n            rd_state->popup_key = ui_key_zero();\r\n            for(RD_CmdNode *n = rd_state->popup_cmds.first; n != 0; n = n->next)\r\n            {\r\n              rd_push_cmd(n->cmd.name, n->cmd.regs);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_PopupCancel:\r\n          {\r\n            rd_state->popup_active = 0;\r\n            rd_state->popup_key = ui_key_zero();\r\n          }break;\r\n          \r\n          //- rjf: keybindings\r\n          case RD_CmdKind_ResetToDefaultBindings:\r\n          {\r\n            CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            CFG_NodePtrList all_keybindings = cfg_node_child_list_from_string(scratch.arena, user, str8_lit(\"keybindings\"));\r\n            for(CFG_NodePtrNode *n = all_keybindings.first; n != 0; n = n->next)\r\n            {\r\n              cfg_node_release(rd_state->cfg, n->v);\r\n            }\r\n            CFG_Node *keybindings = cfg_node_new(rd_state->cfg, user, str8_lit(\"keybindings\"));\r\n            for EachElement(idx, rd_default_binding_table)\r\n            {\r\n              String8 name = rd_default_binding_table[idx].string;\r\n              CFG_Binding binding = rd_default_binding_table[idx].binding;\r\n              CFG_Node *binding_root = cfg_node_new(rd_state->cfg, keybindings, str8_zero());\r\n              cfg_node_new(rd_state->cfg, binding_root, name);\r\n              cfg_node_new(rd_state->cfg, binding_root, os_g_key_cfg_string_table[binding.key]);\r\n              if(binding.modifiers & OS_Modifier_Ctrl)  {cfg_node_newf(rd_state->cfg, binding_root, \"ctrl\");}\r\n              if(binding.modifiers & OS_Modifier_Shift) {cfg_node_newf(rd_state->cfg, binding_root, \"shift\");}\r\n              if(binding.modifiers & OS_Modifier_Alt)   {cfg_node_newf(rd_state->cfg, binding_root, \"alt\");}\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: config path saving/loading/applying\r\n          case RD_CmdKind_OpenRecentProject:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_Node *path = cfg_node_child_from_string(cfg, str8_lit(\"path\"));\r\n            if(str8_match(cfg->string, str8_lit(\"recent_project\"), 0) &&\r\n               path->first->string.size != 0)\r\n            {\r\n              rd_cmd(RD_CmdKind_OpenProject, .file_path = path->first->string);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_OpenUser:\r\n          case RD_CmdKind_OpenProject:\r\n          {\r\n            String8 file_root_key = (kind == RD_CmdKind_OpenUser    ? str8_lit(\"user\") :\r\n                                     kind == RD_CmdKind_OpenProject ? str8_lit(\"project\") :\r\n                                     str8_lit(\"other\"));\r\n            CFG_Node *file_root = cfg_node_child_from_string(cfg_node_root(), file_root_key);\r\n            \r\n            //- rjf: load the new file's data\r\n            String8 file_path = rd_regs()->file_path;\r\n            String8 file_data = os_data_from_file_path(scratch.arena, file_path);\r\n            FileProperties file_props = os_properties_from_file_path(file_path);\r\n            \r\n            //- rjf: determine if the file is good\r\n            B32 file_is_okay = 0;\r\n            {\r\n              String8 stored_path = (kind == RD_CmdKind_OpenUser ? rd_state->user_path : rd_state->project_path);\r\n              file_is_okay = ((file_props.size == 0 && file_props.created == 0) ||\r\n                              str8_match(file_path, stored_path, 0) ||\r\n                              stored_path.size == 0 ||\r\n                              str8_match(str8_prefix(file_data, 9), str8_lit(\"// raddbg\"), 0));\r\n            }\r\n            \r\n            //- rjf: determine file's version\r\n            String8 file_version = {0};\r\n            if(file_is_okay && file_props.size != 0)\r\n            {\r\n              file_version = str8_skip(file_data, 10);\r\n              U64 line_end = str8_find_needle(file_version, 0, str8_lit(\"\\n\"), 0);\r\n              file_version = str8_prefix(file_version, line_end);\r\n              U64 first_space = str8_find_needle(file_version, 0, str8_lit(\" \"), 0);\r\n              file_version = str8_prefix(file_version, first_space);\r\n              file_version = str8_skip_chop_whitespace(file_version);\r\n            }\r\n            \r\n            //- rjf: bad file -> alert user\r\n            if(!file_is_okay)\r\n            {\r\n              log_user_errorf(\"\\\"%S\\\" appears to refer to an existing file which is not a RADDBG config file. This would overwrite the file.\", file_path);\r\n            }\r\n            \r\n            //- rjf: eliminate all old state under this file tree\r\n            if(file_is_okay)\r\n            {\r\n              cfg_node_release_all_children(rd_state->cfg, file_root);\r\n            }\r\n            \r\n            //- rjf: parse the new file, generate cfg entities for it\r\n            CFG_NodePtrList file_cfg_list = {0};\r\n            if(file_is_okay)\r\n            {\r\n              U64 file_version_code = version_from_str8(file_version);\r\n              if(file_version_code < Version(0, 9, 16))\r\n              {\r\n                CFG_NodePtrList (*legacy_parse_function)(Arena *arena, String8 file_path, String8 data) = rd_cfg_tree_list_from_string__pre_0_9_16;\r\n                file_cfg_list = legacy_parse_function(scratch.arena, file_path, file_data);\r\n              }\r\n              else\r\n              {\r\n                file_cfg_list = cfg_node_ptr_list_from_string(scratch.arena, rd_state->cfg, rd_state->cfg_schema_table, str8_chop_last_slash(file_path), file_data);\r\n              }\r\n            }\r\n            \r\n            //- rjf: store path\r\n            if(file_is_okay)\r\n            {\r\n              switch(kind)\r\n              {\r\n                default:{}break;\r\n                case RD_CmdKind_OpenUser:\r\n                {\r\n                  arena_clear(rd_state->user_path_arena);\r\n                  rd_state->user_path = push_str8_copy(rd_state->user_path_arena, file_path);\r\n                }break;\r\n                case RD_CmdKind_OpenProject:\r\n                {\r\n                  arena_clear(rd_state->project_path_arena);\r\n                  rd_state->project_path = push_str8_copy(rd_state->project_path_arena, file_path);\r\n                }break;\r\n              }\r\n            }\r\n            \r\n            //- rjf: insert the new cfg entities into this file tree\r\n            if(file_is_okay)\r\n            {\r\n              for(CFG_NodePtrNode *n = file_cfg_list.first; n != 0; n = n->next)\r\n              {\r\n                cfg_node_insert_child(rd_state->cfg, file_root, file_root->last, n->v);\r\n              }\r\n            }\r\n            \r\n            //- rjf: if config did not open any windows for the user, then we need to open a sensible default\r\n            if(file_is_okay && kind == RD_CmdKind_OpenUser)\r\n            {\r\n              CFG_NodePtrList all_user_windows = cfg_node_child_list_from_string(scratch.arena, file_root, str8_lit(\"window\"));\r\n              if(all_user_windows.count == 0)\r\n              {\r\n                OS_Handle monitor    = os_primary_monitor();\r\n                String8 monitor_name = os_name_from_monitor(scratch.arena, monitor);\r\n                Vec2F32 monitor_dim  = os_dim_from_monitor(monitor);\r\n                F32 monitor_dpi      = os_dpi_from_monitor(monitor);\r\n                Vec2F32 window_dim   = v2f32(monitor_dim.x*4/5, monitor_dim.y*4/5);\r\n                if(window_dim.x == 0 || window_dim.y == 0)\r\n                {\r\n                  window_dim = v2f32(1280, 720);\r\n                }\r\n                CFG_Node *new_window = cfg_node_new(rd_state->cfg, file_root, str8_lit(\"window\"));\r\n                CFG_Node *size = cfg_node_new(rd_state->cfg, new_window, str8_lit(\"size\"));\r\n                cfg_node_newf(rd_state->cfg, size, \"%f\", window_dim.x);\r\n                cfg_node_newf(rd_state->cfg, size, \"%f\", window_dim.y);\r\n                F32 line_height_guess = 11.f * (monitor_dpi / 96.f);\r\n                F32 num_lines_in_monitor_height = monitor_dim.y / line_height_guess;\r\n                if(num_lines_in_monitor_height < 100)\r\n                {\r\n                  rd_cmd(RD_CmdKind_ResetToCompactPanels, .window = new_window->id);\r\n                }\r\n                else\r\n                {\r\n                  rd_cmd(RD_CmdKind_ResetToDefaultPanels, .window = new_window->id);\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: if config did not define any keybindings for the user, then we need to build a sensible default\r\n            if(file_is_okay && kind == RD_CmdKind_OpenUser)\r\n            {\r\n              CFG_NodePtrList all_keybindings = cfg_node_child_list_from_string(scratch.arena, file_root, str8_lit(\"keybindings\"));\r\n              if(all_keybindings.count == 0)\r\n              {\r\n                rd_cmd(RD_CmdKind_ResetToDefaultBindings);\r\n              }\r\n            }\r\n            \r\n            //- rjf: record last-opened user in config directory\r\n            if(file_is_okay && kind == RD_CmdKind_OpenUser)\r\n            {\r\n              rd_cmd(RD_CmdKind_RecordUserAsLastOpened);\r\n            }\r\n            \r\n            //- rjf: record recently-opened projects in the user\r\n            if(file_is_okay && kind == RD_CmdKind_OpenProject)\r\n            {\r\n              rd_cmd(RD_CmdKind_RecordProjectInUser);\r\n            }\r\n            \r\n            //- rjf: eliminate all project-filtered tab focuses\r\n            if(file_is_okay && kind == RD_CmdKind_OpenProject)\r\n            {\r\n              CFG_NodePtrList windows = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"window\"));\r\n              for(CFG_NodePtrNode *n = windows.first; n != 0; n = n->next)\r\n              {\r\n                CFG_PanelTree panels = cfg_panel_tree_from_cfg(scratch.arena, n->v);\r\n                for(CFG_PanelNode *panel = panels.root; panel != &cfg_nil_panel_node; panel = cfg_panel_node_rec__depth_first_pre(panels.root, panel).next)\r\n                {\r\n                  if(rd_cfg_is_project_filtered(panel->selected_tab))\r\n                  {\r\n                    for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n                    {\r\n                      CFG_Node *tab = tab_n->v;\r\n                      if(!rd_cfg_is_project_filtered(tab))\r\n                      {\r\n                        rd_cmd(RD_CmdKind_FocusTab, .tab = tab->id);\r\n                        break;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: if we've just loaded the user, and we do not have a project path,\r\n            // then we should try to look at the user's data for recent projects and\r\n            // load one of those, *or* just the default.\r\n            if(file_is_okay && kind == RD_CmdKind_OpenUser && rd_state->project_path.size == 0)\r\n            {\r\n              CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n              CFG_Node *recent_project = cfg_node_child_from_string(user, str8_lit(\"recent_project\"));\r\n              String8 project_path = rd_path_from_cfg(recent_project);\r\n              if(project_path.size == 0)\r\n              {\r\n                String8 user_program_data_path = os_get_process_info()->user_program_data_path;\r\n                String8 user_data_folder = push_str8f(scratch.arena, \"%S/%S\", user_program_data_path, str8_lit(\"raddbg\"));\r\n                os_make_directory(user_data_folder);\r\n                project_path = push_str8f(scratch.arena, \"%S/default.raddbg_project\", user_data_folder);\r\n              }\r\n              rd_cmd(RD_CmdKind_OpenProject, .file_path = project_path);\r\n            }\r\n            \r\n            //- rjf: update all window titles\r\n            if(file_is_okay)\r\n            {\r\n              String8 window_title = rd_push_window_title(scratch.arena);\r\n              for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next)\r\n              {\r\n                os_window_set_title(ws->os, window_title);\r\n              }\r\n            }\r\n          }break;\r\n          case RD_CmdKind_NewUser:\r\n          case RD_CmdKind_NewProject:\r\n          {\r\n            String8 new_path = rd_regs()->file_path;\r\n            B32 file_will_be_overwritten = (os_properties_from_file_path(new_path).created != 0);\r\n            UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit(\"new_config_overwrite_confirm\"));\r\n            if(file_will_be_overwritten && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key))\r\n            {\r\n              rd_state->popup_key = key;\r\n              rd_state->popup_active = 1;\r\n              arena_clear(rd_state->popup_arena);\r\n              MemoryZeroStruct(&rd_state->popup_cmds);\r\n              rd_state->popup_title = push_str8f(rd_state->popup_arena, \"Are you sure you want to save to this path?\");\r\n              rd_state->popup_desc = push_str8f(rd_state->popup_arena, \"The existing file at '%S' will be overwritten.\", new_path);\r\n              RD_Regs *regs = rd_regs_copy(rd_frame_arena(), rd_regs());\r\n              regs->force_confirm = 1;\r\n              rd_cmd_list_push_new(rd_state->popup_arena, &rd_state->popup_cmds, rd_cmd_kind_info_table[kind].string, regs);\r\n            }\r\n            else switch(kind)\r\n            {\r\n              default:{}break;\r\n              case RD_CmdKind_NewUser:\r\n              {\r\n                os_delete_file_at_path(new_path);\r\n                rd_cmd(RD_CmdKind_OpenUser, .file_path = new_path);\r\n              }break;\r\n              case RD_CmdKind_NewProject:\r\n              {\r\n                os_delete_file_at_path(new_path);\r\n                rd_cmd(RD_CmdKind_OpenProject, .file_path = new_path);\r\n              }break;\r\n            }\r\n          }break;\r\n          case RD_CmdKind_SaveUser:\r\n          case RD_CmdKind_SaveProject:\r\n          {\r\n            String8 new_path = rd_regs()->file_path;\r\n            B32 file_will_be_overwritten = (os_properties_from_file_path(new_path).created != 0);\r\n            UI_Key key = ui_key_from_string(ui_key_zero(), str8_lit(\"save_config_overwrite_confirm\"));\r\n            if(file_will_be_overwritten && !rd_regs()->force_confirm && !ui_key_match(rd_state->popup_key, key))\r\n            {\r\n              rd_state->popup_key = key;\r\n              rd_state->popup_active = 1;\r\n              arena_clear(rd_state->popup_arena);\r\n              MemoryZeroStruct(&rd_state->popup_cmds);\r\n              rd_state->popup_title = push_str8f(rd_state->popup_arena, \"Are you sure you want to save to this path?\");\r\n              rd_state->popup_desc = push_str8f(rd_state->popup_arena, \"The existing file at '%S' will be overwritten.\", new_path);\r\n              RD_Regs *regs = rd_regs_copy(rd_frame_arena(), rd_regs());\r\n              regs->force_confirm = 1;\r\n              rd_cmd_list_push_new(rd_state->popup_arena, &rd_state->popup_cmds, rd_cmd_kind_info_table[kind].string, regs);\r\n            }\r\n            else switch(kind)\r\n            {\r\n              default:{}break;\r\n              case RD_CmdKind_SaveUser:\r\n              {\r\n                arena_clear(rd_state->user_path_arena);\r\n                rd_state->user_path = push_str8_copy(rd_state->user_path_arena, new_path);\r\n                rd_cmd(RD_CmdKind_WriteUserData);\r\n                rd_cmd(RD_CmdKind_RecordUserAsLastOpened);\r\n              }break;\r\n              case RD_CmdKind_SaveProject:\r\n              {\r\n                arena_clear(rd_state->project_path_arena);\r\n                rd_state->project_path = push_str8_copy(rd_state->project_path_arena, new_path);\r\n                rd_cmd(RD_CmdKind_WriteProjectData);\r\n                rd_cmd(RD_CmdKind_RecordProjectInUser);\r\n              }break;\r\n            }\r\n          }break;\r\n          case RD_CmdKind_RecordProjectInUser:\r\n          {\r\n            String8 file_path = rd_regs()->file_path;\r\n            CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            CFG_NodePtrList recent_projects = cfg_node_child_list_from_string(scratch.arena, user, str8_lit(\"recent_project\"));\r\n            CFG_Node *recent_project = &cfg_nil_node;\r\n            for(CFG_NodePtrNode *n = recent_projects.first; n != 0; n = n->next)\r\n            {\r\n              if(path_match_normalized(rd_path_from_cfg(n->v), file_path))\r\n              {\r\n                recent_project = n->v;\r\n                break;\r\n              }\r\n            }\r\n            if(recent_project == &cfg_nil_node)\r\n            {\r\n              recent_project = cfg_node_new(rd_state->cfg, user, str8_lit(\"recent_project\"));\r\n              CFG_Node *path_root = cfg_node_new(rd_state->cfg, recent_project, str8_lit(\"path\"));\r\n              cfg_node_new(rd_state->cfg, path_root, file_path);\r\n            }\r\n            cfg_node_unhook(rd_state->cfg, user, recent_project);\r\n            cfg_node_insert_child(rd_state->cfg, user, &cfg_nil_node, recent_project);\r\n            recent_projects = cfg_node_child_list_from_string(scratch.arena, user, str8_lit(\"recent_project\"));\r\n            if(recent_projects.count > 32)\r\n            {\r\n              cfg_node_release(rd_state->cfg, recent_projects.last->v);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_RecordUserAsLastOpened:\r\n          {\r\n            String8 file_path = rd_regs()->file_path;\r\n            String8 last_user_path = push_str8f(scratch.arena, \"%S/raddbg/last_user\", os_get_process_info()->user_program_data_path);\r\n            os_write_data_to_file_path(last_user_path, file_path);\r\n          }break;\r\n          \r\n          //- rjf: writing config changes\r\n          case RD_CmdKind_WriteUserData:    dst_path = rd_state->user_path; bucket_name = str8_lit(\"user\"); goto write;\r\n          case RD_CmdKind_WriteProjectData: dst_path = rd_state->project_path; bucket_name = str8_lit(\"project\"); goto write;\r\n          write:;\r\n          {\r\n            B32 dst_exists = (os_properties_from_file_path(dst_path).created != 0);\r\n            String8 temp_path = push_str8f(scratch.arena, \"%S.temp\", dst_path);\r\n            String8 overwritten_path = push_str8f(scratch.arena, \"%S.old\", dst_path);\r\n            CFG_Node *tree_root = cfg_node_child_from_string(cfg_node_root(), bucket_name);\r\n            String8List strings = {0};\r\n            str8_list_pushf(scratch.arena, &strings, \"// raddbg %s %S file\\n\\n\", BUILD_VERSION_STRING_LITERAL, bucket_name);\r\n            for(CFG_Node *child = tree_root->first; child != &cfg_nil_node; child = child->next)\r\n            {\r\n              str8_list_push(scratch.arena, &strings, cfg_string_from_tree(scratch.arena, rd_state->cfg_schema_table, str8_chop_last_slash(dst_path), child));\r\n            }\r\n            String8 data = str8_list_join(scratch.arena, &strings, 0);\r\n            B32 temp_write_good = os_write_data_to_file_path(temp_path, data);\r\n            B32 old_del_good    = (temp_write_good && os_delete_file_at_path(overwritten_path));\r\n            B32 old_move_good   = (temp_write_good && (!dst_exists || os_move_file_path(overwritten_path, dst_path)));\r\n            B32 new_move_good   = (old_move_good && os_move_file_path(dst_path, temp_path));\r\n            if(new_move_good && dst_exists)\r\n            {\r\n              os_delete_file_at_path(overwritten_path);\r\n            }\r\n            else if(!new_move_good && old_move_good && dst_exists)\r\n            {\r\n              os_move_file_path(dst_path, overwritten_path);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: opening user/project settings\r\n          case RD_CmdKind_UserSettings:\r\n          {\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = str8_lit(\"query:user_settings\"), .do_implicit_root = 1, .do_big_rows = 1, .do_lister = 1);\r\n          }break;\r\n          case RD_CmdKind_ProjectSettings:\r\n          {\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = str8_lit(\"query:project_settings\"), .do_implicit_root = 1, .do_big_rows = 1, .do_lister = 1);\r\n          }break;\r\n          \r\n          //- rjf: font sizes\r\n          case RD_CmdKind_IncWindowFontSize: cfg = cfg_node_from_id(rd_regs()->window); rd_regs()->view = 0; rd_regs()->tab = 0; goto inc_font_size;\r\n          case RD_CmdKind_IncViewFontSize:   cfg = cfg_node_from_id(rd_regs()->view); goto inc_font_size;\r\n          inc_font_size:;\r\n          if(cfg != &cfg_nil_node)\r\n          {\r\n            fnt_reset();\r\n            F32 current_font_size = rd_font_size();\r\n            F32 new_font_size = current_font_size+1;\r\n            new_font_size = Clamp(6.f, new_font_size, 72.f);\r\n            CFG_Node *font_size_cfg = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"font_size\"));\r\n            cfg_node_new_replacef(rd_state->cfg, font_size_cfg, \"%I64u\", (U64)new_font_size);\r\n          }break;\r\n          case RD_CmdKind_DecWindowFontSize: cfg = cfg_node_from_id(rd_regs()->window); rd_regs()->view = 0; rd_regs()->tab = 0; goto dec_font_size;\r\n          case RD_CmdKind_DecViewFontSize:   cfg = cfg_node_from_id(rd_regs()->view); goto dec_font_size;\r\n          dec_font_size:;\r\n          if(cfg != &cfg_nil_node)\r\n          {\r\n            fnt_reset();\r\n            F32 current_font_size = rd_font_size();\r\n            F32 new_font_size = current_font_size-1;\r\n            new_font_size = Clamp(6.f, new_font_size, 72.f);\r\n            CFG_Node *font_size_cfg = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"font_size\"));\r\n            cfg_node_new_replacef(rd_state->cfg, font_size_cfg, \"%I64u\", (U64)new_font_size);\r\n          }break;\r\n          \r\n          //- rjf: panel creation\r\n          case RD_CmdKind_NewPanelLeft: {split_dir = Dir2_Left;}goto split;\r\n          case RD_CmdKind_NewPanelUp:   {split_dir = Dir2_Up;}goto split;\r\n          case RD_CmdKind_NewPanelRight:{split_dir = Dir2_Right;}goto split;\r\n          case RD_CmdKind_NewPanelDown: {split_dir = Dir2_Down;}goto split;\r\n          case RD_CmdKind_SplitPanel:\r\n          {\r\n            split_dir = rd_regs()->dir2;\r\n            split_panel = cfg_node_from_id(rd_regs()->dst_panel);\r\n          }goto split;\r\n          split:;\r\n          if(split_dir != Dir2_Invalid)\r\n          {\r\n            // rjf: unpack\r\n            Axis2 split_axis = axis2_from_dir2(split_dir);\r\n            Side split_side = side_from_dir2(split_dir);\r\n            if(split_panel == &cfg_nil_node)\r\n            {\r\n              split_panel = cfg_node_from_id(rd_regs()->panel);\r\n            }\r\n            CFG_Node *new_panel_cfg = &cfg_nil_node;\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, split_panel);\r\n            CFG_PanelNode *panel_root = panel_tree.root;\r\n            CFG_PanelNode *panel = cfg_panel_node_from_tree_cfg(panel_root, split_panel);\r\n            CFG_PanelNode *parent = panel->parent;\r\n            \r\n            // rjf: splitting on same axis as parent -> insert new sibling on same axis, adjust sizes\r\n            if(parent != &cfg_nil_panel_node && parent->split_axis == split_axis)\r\n            {\r\n              CFG_Node *parent_cfg = parent->cfg;\r\n              CFG_Node *panel_cfg = panel->cfg;\r\n              CFG_Node *new_cfg = cfg_node_alloc(rd_state->cfg);\r\n              cfg_node_insert_child(rd_state->cfg, parent_cfg, split_side == Side_Max ? panel_cfg : panel_cfg->prev, new_cfg);\r\n              cfg_node_equip_stringf(rd_state->cfg, new_cfg, \"%f\", 1.f/(parent->child_count+1));\r\n              for(CFG_PanelNode *child = parent->first; child != &cfg_nil_panel_node; child = child->next)\r\n              {\r\n                F32 old_pct = child->pct_of_parent;\r\n                F32 new_pct = old_pct * ((F32)(parent->child_count) / (parent->child_count+1));\r\n                cfg_node_equip_stringf(rd_state->cfg, child->cfg, \"%f\", new_pct);\r\n              }\r\n              new_panel_cfg = new_cfg;\r\n            }\r\n            \r\n            // rjf: splitting on opposite axis as parent - need to create new replacement node, + new sibling\r\n            else\r\n            {\r\n              CFG_Node *split_panel_prev = panel->prev->cfg;\r\n              CFG_Node *new_parent = cfg_node_alloc(rd_state->cfg);\r\n              CFG_Node *new_sibling = cfg_node_alloc(rd_state->cfg);\r\n              cfg_node_equip_string(rd_state->cfg, new_parent, split_panel->string);\r\n              cfg_node_equip_string(rd_state->cfg, split_panel, str8_lit(\"0.5\"));\r\n              cfg_node_equip_string(rd_state->cfg, new_sibling, str8_lit(\"0.5\"));\r\n              if(parent->cfg != &cfg_nil_node)\r\n              {\r\n                cfg_node_unhook(rd_state->cfg, parent->cfg, split_panel);\r\n                cfg_node_insert_child(rd_state->cfg, parent->cfg, split_panel_prev, new_parent);\r\n              }\r\n              else\r\n              {\r\n                cfg_node_equip_string(rd_state->cfg, new_parent, str8_lit(\"panels\"));\r\n                CFG_Node *window_cfg = rd_window_from_cfg(split_panel);\r\n                cfg_node_insert_child(rd_state->cfg, window_cfg, window_cfg->last, new_parent);\r\n                if(split_axis == Axis2_X)\r\n                {\r\n                  cfg_node_child_from_string_or_alloc(rd_state->cfg, window_cfg, str8_lit(\"split_x\"));\r\n                }\r\n                else\r\n                {\r\n                  cfg_node_release(rd_state->cfg, cfg_node_child_from_string(window_cfg, str8_lit(\"split_x\")));\r\n                }\r\n              }\r\n              CFG_Node *min = split_panel;\r\n              CFG_Node *max = new_sibling;\r\n              if(split_side == Side_Min)\r\n              {\r\n                Swap(CFG_Node *, min, max);\r\n              }\r\n              cfg_node_insert_child(rd_state->cfg, new_parent, new_parent->last, min);\r\n              cfg_node_insert_child(rd_state->cfg, new_parent, new_parent->last, max);\r\n              new_panel_cfg = new_sibling;\r\n            }\r\n            \r\n            // rjf: pre-emptively set up the animation rectangle, depending on where\r\n            // the new panel was inserted\r\n            {\r\n              RD_WindowState *ws = rd_window_state_from_cfg(new_panel_cfg);\r\n              if(ws != &rd_nil_window_state)\r\n              {\r\n                ui_select_state(ws->ui);\r\n                CFG_PanelTree new_panel_tree = cfg_panel_tree_from_cfg(scratch.arena, new_panel_cfg);\r\n                CFG_PanelNode *new_panel = cfg_panel_node_from_tree_cfg(new_panel_tree.root, new_panel_cfg);\r\n                Rng2F32 stub_content_rect = r2f32p(0, 0, 1000, 1000);\r\n                Vec2F32 stub_content_rect_dim = dim_2f32(stub_content_rect);\r\n                Rng2F32 new_rect_px  = cfg_target_rect_from_panel_node(stub_content_rect, new_panel_tree.root, new_panel);\r\n                Rng2F32 new_rect_pct = r2f32p(new_rect_px.x0/stub_content_rect_dim.x,\r\n                                              new_rect_px.y0/stub_content_rect_dim.y,\r\n                                              new_rect_px.x1/stub_content_rect_dim.x,\r\n                                              new_rect_px.y1/stub_content_rect_dim.y);\r\n                if(new_panel->prev != &cfg_nil_panel_node)\r\n                {\r\n                  Rng2F32 target_prev_rect_px  = cfg_target_rect_from_panel_node(stub_content_rect, panel_tree.root, cfg_panel_node_from_tree_cfg(panel_tree.root, new_panel->prev->cfg));\r\n                  Rng2F32 target_prev_rect_pct = r2f32p(target_prev_rect_px.x0/stub_content_rect_dim.x,\r\n                                                        target_prev_rect_px.y0/stub_content_rect_dim.y,\r\n                                                        target_prev_rect_px.x1/stub_content_rect_dim.x,\r\n                                                        target_prev_rect_px.y1/stub_content_rect_dim.y);\r\n                  Rng2F32 prev_rect_pct = r2f32p(ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x0\", new_panel->prev->cfg), target_prev_rect_pct.x0, .initial = target_prev_rect_pct.x0, .rate = rd_state->menu_animation_rate),\r\n                                                 ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y0\", new_panel->prev->cfg), target_prev_rect_pct.y0, .initial = target_prev_rect_pct.y0, .rate = rd_state->menu_animation_rate),\r\n                                                 ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x1\", new_panel->prev->cfg), target_prev_rect_pct.x1, .initial = target_prev_rect_pct.x1, .rate = rd_state->menu_animation_rate),\r\n                                                 ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y1\", new_panel->prev->cfg), target_prev_rect_pct.y1, .initial = target_prev_rect_pct.y1, .rate = rd_state->menu_animation_rate));\r\n                  new_rect_pct = prev_rect_pct;\r\n                  new_rect_pct.p0.v[split_axis] = new_rect_pct.p1.v[split_axis];\r\n                }\r\n                if(new_panel->next != &cfg_nil_panel_node)\r\n                {\r\n                  Rng2F32 target_next_rect_px  = cfg_target_rect_from_panel_node(stub_content_rect, panel_tree.root, cfg_panel_node_from_tree_cfg(panel_tree.root, new_panel->next->cfg));\r\n                  Rng2F32 target_next_rect_pct = r2f32p(target_next_rect_px.x0/stub_content_rect_dim.x,\r\n                                                        target_next_rect_px.y0/stub_content_rect_dim.y,\r\n                                                        target_next_rect_px.x1/stub_content_rect_dim.x,\r\n                                                        target_next_rect_px.y1/stub_content_rect_dim.y);\r\n                  Rng2F32 next_rect_pct = r2f32p(ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x0\", new_panel->next->cfg), target_next_rect_pct.x0, .initial = target_next_rect_pct.x0, .rate = rd_state->menu_animation_rate),\r\n                                                 ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y0\", new_panel->next->cfg), target_next_rect_pct.y0, .initial = target_next_rect_pct.y0, .rate = rd_state->menu_animation_rate),\r\n                                                 ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x1\", new_panel->next->cfg), target_next_rect_pct.x1, .initial = target_next_rect_pct.x1, .rate = rd_state->menu_animation_rate),\r\n                                                 ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y1\", new_panel->next->cfg), target_next_rect_pct.y1, .initial = target_next_rect_pct.y1, .rate = rd_state->menu_animation_rate));\r\n                  new_rect_pct = next_rect_pct;\r\n                  new_rect_pct.p1.v[split_axis] = new_rect_pct.p0.v[split_axis];\r\n                }\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x0\", new_panel->cfg), new_rect_pct.x0, .initial = new_rect_pct.x0, .reset = 1, .rate = rd_state->menu_animation_rate);\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_x1\", new_panel->cfg), new_rect_pct.x1, .initial = new_rect_pct.x1, .reset = 1, .rate = rd_state->menu_animation_rate);\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y0\", new_panel->cfg), new_rect_pct.y0, .initial = new_rect_pct.y0, .reset = 1, .rate = rd_state->menu_animation_rate);\r\n                ui_anim(ui_key_from_stringf(ui_key_zero(), \"panel_%p_y1\", new_panel->cfg), new_rect_pct.y1, .initial = new_rect_pct.y1, .reset = 1, .rate = rd_state->menu_animation_rate);\r\n              }\r\n            }\r\n            \r\n            // rjf: if this split was caused by drag/dropping a tab, and the originating panel\r\n            // has no further tabs, then close the originating panel\r\n            CFG_Node *dragdrop_origin_panel_cfg = cfg_node_from_id(rd_regs()->panel);\r\n            CFG_Node *dragdrop_tab = cfg_node_from_id(rd_regs()->view);\r\n            if(kind == RD_CmdKind_SplitPanel &&\r\n               new_panel_cfg != &cfg_nil_node && dragdrop_tab != &cfg_nil_node && dragdrop_origin_panel_cfg != &cfg_nil_node)\r\n            {\r\n              cfg_node_unhook(rd_state->cfg, dragdrop_origin_panel_cfg, dragdrop_tab);\r\n              cfg_node_insert_child(rd_state->cfg, new_panel_cfg, new_panel_cfg->last, dragdrop_tab);\r\n              CFG_PanelTree origin_panel_tree = cfg_panel_tree_from_cfg(scratch.arena, dragdrop_origin_panel_cfg);\r\n              CFG_PanelNode *origin_panel = cfg_panel_node_from_tree_cfg(origin_panel_tree.root, dragdrop_origin_panel_cfg);\r\n              if(origin_panel->selected_tab == &cfg_nil_node)\r\n              {\r\n                for(CFG_NodePtrNode *n = origin_panel->tabs.first; n != 0; n = n->next)\r\n                {\r\n                  if(!rd_cfg_is_project_filtered(n->v))\r\n                  {\r\n                    rd_cmd(RD_CmdKind_FocusTab, .panel = origin_panel->cfg->id, .tab = n->v->id);\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              if(origin_panel->cfg != split_panel && origin_panel->tabs.count == 0)\r\n              {\r\n                rd_cmd(RD_CmdKind_ClosePanel);\r\n              }\r\n              rd_cmd(RD_CmdKind_FocusTab, .panel = new_panel_cfg->id, .tab = dragdrop_tab->id);\r\n            }\r\n            \r\n            // rjf: focus new panel\r\n            if(new_panel_cfg != &cfg_nil_node)\r\n            {\r\n              rd_cmd(RD_CmdKind_FocusPanel, .panel = new_panel_cfg->id);\r\n            }\r\n            \r\n            // rjf: tabs on bottom on split panel? -> tabs on bottom on new panel\r\n            if(panel->tab_side == Side_Max && split_axis == Axis2_X)\r\n            {\r\n              rd_cmd(RD_CmdKind_TabBarBottom, .panel = new_panel_cfg->id);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: panel rotation\r\n          case RD_CmdKind_RotatePanelColumns:\r\n          {\r\n            CFG_Node *panel_cfg = cfg_node_from_id(rd_regs()->panel);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, panel_cfg);\r\n            CFG_PanelNode *panel = cfg_panel_node_from_tree_cfg(panel_tree.root, panel_cfg);\r\n            CFG_PanelNode *parent = &cfg_nil_panel_node;\r\n            for(CFG_PanelNode *p = panel->parent; p != &cfg_nil_panel_node; p = p->parent)\r\n            {\r\n              if(p->split_axis == Axis2_X)\r\n              {\r\n                parent = p;\r\n                break;\r\n              }\r\n            }\r\n            if(parent != &cfg_nil_panel_node && parent->child_count > 1)\r\n            {\r\n              CFG_Node *rotated = parent->first->cfg;\r\n              cfg_node_unhook(rd_state->cfg, parent->cfg, parent->first->cfg);\r\n              cfg_node_insert_child(rd_state->cfg, parent->cfg, parent->last->cfg, rotated);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: panel focusing\r\n          case RD_CmdKind_NextPanel: panel_sib_off = OffsetOf(CFG_PanelNode, next); panel_child_off = OffsetOf(CFG_PanelNode, first); goto cycle;\r\n          case RD_CmdKind_PrevPanel: panel_sib_off = OffsetOf(CFG_PanelNode, prev); panel_child_off = OffsetOf(CFG_PanelNode, last); goto cycle;\r\n          cycle:;\r\n          {\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, cfg_node_from_id(rd_regs()->window));\r\n            CFG_PanelNode *next_focused = &cfg_nil_panel_node;\r\n            for(CFG_PanelNode *p = panel_tree.focused;\r\n                p != &cfg_nil_panel_node;\r\n                p = cfg_panel_node_rec__depth_first(panel_tree.root, p, panel_sib_off, panel_child_off).next)\r\n            {\r\n              if(p != panel_tree.focused && p->first == &cfg_nil_panel_node)\r\n              {\r\n                next_focused = p;\r\n                break;\r\n              }\r\n            }\r\n            if(next_focused == &cfg_nil_panel_node)\r\n            {\r\n              for(CFG_PanelNode *p = panel_tree.root;\r\n                  p != &cfg_nil_panel_node;\r\n                  p = cfg_panel_node_rec__depth_first(panel_tree.root, p, panel_sib_off, panel_child_off).next)\r\n              {\r\n                if(p != panel_tree.focused && p->first == &cfg_nil_panel_node)\r\n                {\r\n                  next_focused = p;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            rd_cmd(RD_CmdKind_FocusPanel, .panel = next_focused->cfg->id);\r\n          }break;\r\n          case RD_CmdKind_FocusPanel:\r\n          {\r\n            CFG_Node *panel = cfg_node_from_id(rd_regs()->panel);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, panel);\r\n            CFG_Node *selection_cfg = &cfg_nil_node;\r\n            for(CFG_PanelNode *p = panel_tree.root;\r\n                p != &cfg_nil_panel_node;\r\n                p = cfg_panel_node_rec__depth_first_pre(panel_tree.root, p).next)\r\n            {\r\n              CFG_Node *p_cfg = p->cfg;\r\n              CFG_Node *p_selection = cfg_node_child_from_string(p_cfg, str8_lit(\"selected\"));\r\n              if(selection_cfg == &cfg_nil_node)\r\n              {\r\n                selection_cfg = p_selection;\r\n              }\r\n              else for(CFG_Node *s = p_selection; s != &cfg_nil_node; s = cfg_node_child_from_string(p_cfg, str8_lit(\"selected\")))\r\n              {\r\n                cfg_node_release(rd_state->cfg, s);\r\n              }\r\n            }\r\n            if(selection_cfg == &cfg_nil_node)\r\n            {\r\n              selection_cfg = cfg_node_alloc(rd_state->cfg);\r\n              cfg_node_equip_string(rd_state->cfg, selection_cfg, str8_lit(\"selected\"));\r\n            }\r\n            if(panel != &cfg_nil_node)\r\n            {\r\n              cfg_node_insert_child(rd_state->cfg, panel, &cfg_nil_node, selection_cfg);\r\n              CFG_Node *window = rd_window_from_cfg(panel);\r\n              RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n              ws->menu_bar_focused = 0;\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: directional panel focus changing\r\n          case RD_CmdKind_FocusPanelRight: panel_change_dir = v2s32(+1, +0); goto focus_panel_dir;\r\n          case RD_CmdKind_FocusPanelLeft:  panel_change_dir = v2s32(-1, +0); goto focus_panel_dir;\r\n          case RD_CmdKind_FocusPanelUp:    panel_change_dir = v2s32(+0, -1); goto focus_panel_dir;\r\n          case RD_CmdKind_FocusPanelDown:  panel_change_dir = v2s32(+0, +1); goto focus_panel_dir;\r\n          focus_panel_dir:;\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            CFG_PanelNode *src_panel = panel_tree.focused;\r\n            Rng2F32 src_panel_rect = cfg_target_rect_from_panel_node(r2f32(v2f32(0, 0), v2f32(1000, 1000)), panel_tree.root, src_panel);\r\n            Vec2F32 src_panel_center = center_2f32(src_panel_rect);\r\n            Vec2F32 src_panel_half_dim = scale_2f32(dim_2f32(src_panel_rect), 0.5f);\r\n            Vec2F32 travel_dim = add_2f32(src_panel_half_dim, v2f32(10.f, 10.f));\r\n            Vec2F32 travel_dst = add_2f32(src_panel_center, mul_2f32(travel_dim, v2f32((F32)panel_change_dir.x, (F32)panel_change_dir.y)));\r\n            CFG_PanelNode *dst_root = &cfg_nil_panel_node;\r\n            for(CFG_PanelNode *p = panel_tree.root; p != &cfg_nil_panel_node; p = cfg_panel_node_rec__depth_first_pre(panel_tree.root, p).next)\r\n            {\r\n              if(p == src_panel || p->first != &cfg_nil_panel_node)\r\n              {\r\n                continue;\r\n              }\r\n              Rng2F32 p_rect = cfg_target_rect_from_panel_node(r2f32(v2f32(0, 0), v2f32(1000, 1000)), panel_tree.root, p);\r\n              if(contains_2f32(p_rect, travel_dst))\r\n              {\r\n                dst_root = p;\r\n                break;\r\n              }\r\n            }\r\n            if(dst_root != &cfg_nil_panel_node)\r\n            {\r\n              CFG_PanelNode *dst_panel = &cfg_nil_panel_node;\r\n              for(CFG_PanelNode *p = dst_root; p != &cfg_nil_panel_node; p = cfg_panel_node_rec__depth_first_pre(dst_root, p).next)\r\n              {\r\n                if(p->first == &cfg_nil_panel_node && p != src_panel)\r\n                {\r\n                  dst_panel = p;\r\n                  break;\r\n                }\r\n              }\r\n              rd_cmd(RD_CmdKind_FocusPanel, .panel = dst_panel->cfg->id);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: undo/redo\r\n          case RD_CmdKind_Undo:{}break;\r\n          case RD_CmdKind_Redo:{}break;\r\n          \r\n          //- rjf: focus history\r\n          case RD_CmdKind_GoBack:{}break;\r\n          case RD_CmdKind_GoForward:{}break;\r\n          \r\n          //- rjf: files\r\n          case RD_CmdKind_SetCurrentPath:\r\n          {\r\n            CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            CFG_Node *current_path = cfg_node_child_from_string_or_alloc(rd_state->cfg, user, str8_lit(\"current_path\"));\r\n            cfg_node_new_replace(rd_state->cfg, current_path, rd_regs()->file_path);\r\n          }break;\r\n          case RD_CmdKind_SetFileReplacementPath:\r\n          {\r\n            // NOTE(rjf):\r\n            //\r\n            // foo.c\r\n            // C:/test/bar/baz/foo.c\r\n            // -> override foo.c -> C:/test/bar/baz/foo.c\r\n            //\r\n            // C:/foo/bar/baz.c\r\n            // D:/foo/bar/baz.c\r\n            // -> override C: -> D:\r\n            //\r\n            // C:/1/2/foo/bar.c\r\n            // C:/2/3/foo/bar.c\r\n            // -> override C:/1/2 -> C:2/3\r\n            //\r\n            // C:/foo/bar/baz.c\r\n            // D:/1/2/3.c\r\n            // -> override C:/foo/bar/baz.c -> D:/1/2/3.c\r\n            \r\n            //- rjf: unpack\r\n            String8 src_path = rd_regs()->string;\r\n            String8 dst_path = rd_regs()->file_path;\r\n            String8List src_path_parts = str8_split_path(scratch.arena, src_path);\r\n            String8List dst_path_parts = str8_split_path(scratch.arena, dst_path);\r\n            \r\n            //- rjf: reverse path parts\r\n            String8List src_path_parts__reversed = {0};\r\n            String8List dst_path_parts__reversed = {0};\r\n            for(String8Node *n = src_path_parts.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_push_front(scratch.arena, &src_path_parts__reversed, n->string);\r\n            }\r\n            for(String8Node *n = dst_path_parts.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_push_front(scratch.arena, &dst_path_parts__reversed, n->string);\r\n            }\r\n            \r\n            //- rjf: trace from each path upwards, in lock-step, to find the first difference\r\n            // between the paths\r\n            String8Node *first_diff_src = src_path_parts__reversed.first;\r\n            String8Node *first_diff_dst = dst_path_parts__reversed.first;\r\n            for(;first_diff_src != 0 && first_diff_dst != 0;)\r\n            {\r\n              if(!str8_match(first_diff_src->string, first_diff_dst->string, StringMatchFlag_CaseInsensitive) ||\r\n                 first_diff_src->next == 0 ||\r\n                 first_diff_dst->next == 0)\r\n              {\r\n                break;\r\n              }\r\n              first_diff_src = first_diff_src->next;\r\n              first_diff_dst = first_diff_dst->next;\r\n            }\r\n            \r\n            //- rjf: form final map paths\r\n            String8List map_src_parts = {0};\r\n            String8List map_dst_parts = {0};\r\n            for(String8Node *n = first_diff_src; n != 0; n = n->next)\r\n            {\r\n              str8_list_push_front(scratch.arena, &map_src_parts, n->string);\r\n            }\r\n            for(String8Node *n = first_diff_dst; n != 0; n = n->next)\r\n            {\r\n              str8_list_push_front(scratch.arena, &map_dst_parts, n->string);\r\n            }\r\n            StringJoin map_join = {.sep = str8_lit(\"/\")};\r\n            String8 map_src = str8_list_join(scratch.arena, &map_src_parts, &map_join);\r\n            String8 map_dst = str8_list_join(scratch.arena, &map_dst_parts, &map_join);\r\n            \r\n            //- rjf: store as file path map cfg\r\n            CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            {\r\n              CFG_NodePtrList cfgs = cfg_node_child_list_from_string(scratch.arena, user, str8_lit(\"file_path_map\"));\r\n              CFG_Node *map = &cfg_nil_node;\r\n              for(CFG_NodePtrNode *n = cfgs.first; n != 0; n = n->next)\r\n              {\r\n                CFG_Node *src = cfg_node_child_from_string(n->v, str8_lit(\"source\"));\r\n                if(path_match_normalized(src->first->string, map_src))\r\n                {\r\n                  map = n->v;\r\n                  break;\r\n                }\r\n              }\r\n              if(map == &cfg_nil_node)\r\n              {\r\n                map = cfg_node_new(rd_state->cfg, user, str8_lit(\"file_path_map\"));\r\n              }\r\n              CFG_Node *src = cfg_node_child_from_string_or_alloc(rd_state->cfg, map, str8_lit(\"source\"));\r\n              CFG_Node *dst = cfg_node_child_from_string_or_alloc(rd_state->cfg, map, str8_lit(\"dest\"));\r\n              cfg_node_new_replace(rd_state->cfg, src, map_src);\r\n              cfg_node_new_replace(rd_state->cfg, dst, map_dst);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: panel removal\r\n          case RD_CmdKind_ClosePanel:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            CFG_PanelNode *panel = cfg_panel_node_from_tree_cfg(panel_tree.root, cfg_node_from_id(rd_regs()->panel));\r\n            CFG_PanelNode *parent = panel->parent;\r\n            if(parent != &cfg_nil_panel_node)\r\n            {\r\n              Axis2 split_axis = parent->split_axis;\r\n              \r\n              // NOTE(rjf): If we're removing all but the last child of this parent,\r\n              // we should just remove both children.\r\n              if(parent->child_count == 2)\r\n              {\r\n                CFG_PanelNode *discard_child = panel;\r\n                CFG_PanelNode *keep_child = (panel == parent->first ? parent->last : parent->first);\r\n                CFG_PanelNode *grandparent = parent->parent;\r\n                CFG_PanelNode *parent_prev = parent->prev;\r\n                F32 pct_of_parent = parent->pct_of_parent;\r\n                \r\n                // rjf: unhook kept child\r\n                cfg_node_unhook(rd_state->cfg, parent->cfg, keep_child->cfg);\r\n                \r\n                // rjf: unhook this subtree\r\n                if(grandparent != &cfg_nil_panel_node)\r\n                {\r\n                  cfg_node_unhook(rd_state->cfg, grandparent->cfg, parent->cfg);\r\n                }\r\n                \r\n                // rjf: release the containing tree\r\n                {\r\n                  cfg_node_release(rd_state->cfg, parent->cfg);\r\n                }\r\n                \r\n                // rjf: re-hook our kept child into the overall tree\r\n                if(grandparent == &cfg_nil_panel_node)\r\n                {\r\n                  if(keep_child->split_axis == Axis2_X)\r\n                  {\r\n                    cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"split_x\"));\r\n                  }\r\n                  else\r\n                  {\r\n                    cfg_node_release(rd_state->cfg, cfg_node_child_from_string(window, str8_lit(\"split_x\")));\r\n                  }\r\n                  cfg_node_equip_string(rd_state->cfg, keep_child->cfg, str8_lit(\"panels\"));\r\n                  cfg_node_insert_child(rd_state->cfg, window, window->last, keep_child->cfg);\r\n                }\r\n                else\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, grandparent->cfg, parent_prev->cfg, keep_child->cfg);\r\n                  cfg_node_equip_stringf(rd_state->cfg, keep_child->cfg, \"%f\", pct_of_parent);\r\n                }\r\n                \r\n                // rjf: keep-child split-axis == grandparent split-axis? bubble keep-child up into grandparent's children\r\n                if(grandparent != &cfg_nil_panel_node && grandparent->split_axis == keep_child->split_axis && keep_child->first != &cfg_nil_panel_node)\r\n                {\r\n                  cfg_node_unhook(rd_state->cfg, grandparent->cfg, keep_child->cfg);\r\n                  CFG_Node *prev = parent_prev->cfg;\r\n                  for(CFG_PanelNode *child = keep_child->first, *next = &cfg_nil_panel_node; child != &cfg_nil_panel_node; child = next)\r\n                  {\r\n                    next = child->next;\r\n                    cfg_node_unhook(rd_state->cfg, keep_child->cfg, child->cfg);\r\n                    cfg_node_insert_child(rd_state->cfg, grandparent->cfg, prev, child->cfg);\r\n                    prev = child->cfg;\r\n                    F32 old_pct = child->pct_of_parent;\r\n                    F32 new_pct = old_pct * pct_of_parent;\r\n                    cfg_node_equip_stringf(rd_state->cfg, child->cfg, \"%f\", new_pct);\r\n                  }\r\n                  cfg_node_release(rd_state->cfg, keep_child->cfg);\r\n                }\r\n                \r\n                // rjf: reset focus, if needed\r\n                if(panel_tree.focused == discard_child)\r\n                {\r\n                  CFG_PanelTree new_panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n                  CFG_PanelNode *new_focused = cfg_panel_node_from_tree_cfg(panel_tree.root, keep_child->cfg);\r\n                  for(CFG_PanelNode *grandchild = new_focused; grandchild != &cfg_nil_panel_node; grandchild = grandchild->first)\r\n                  {\r\n                    new_focused = grandchild;\r\n                  }\r\n                  rd_cmd(RD_CmdKind_FocusPanel, .panel = new_focused->cfg->id);\r\n                }\r\n              }\r\n              // NOTE(rjf): Otherwise we can just remove this child.\r\n              else\r\n              {\r\n                // rjf: remove\r\n                CFG_PanelNode *next = &cfg_nil_panel_node;\r\n                F32 removed_size_pct = panel->pct_of_parent;\r\n                if(next == &cfg_nil_panel_node) { next = panel->prev; }\r\n                if(next == &cfg_nil_panel_node) { next = panel->next; }\r\n                cfg_node_unhook(rd_state->cfg, parent->cfg, panel->cfg);\r\n                cfg_node_release(rd_state->cfg, panel->cfg);\r\n                \r\n                // rjf: resize siblings to this node\r\n                {\r\n                  CFG_PanelTree new_panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n                  CFG_PanelNode *new_parent = cfg_panel_node_from_tree_cfg(new_panel_tree.root, parent->cfg);\r\n                  for(CFG_PanelNode *child = new_parent->first; child != &cfg_nil_panel_node; child = child->next)\r\n                  {\r\n                    CFG_Node *cfg = child->cfg;\r\n                    F32 old_pct = child->pct_of_parent;\r\n                    F32 new_pct = old_pct / (1.f-removed_size_pct);\r\n                    cfg_node_equip_stringf(rd_state->cfg, cfg, \"%f\", new_pct);\r\n                  }\r\n                }\r\n                \r\n                // rjf: reset focus, if needed\r\n                if(panel_tree.focused == panel)\r\n                {\r\n                  CFG_PanelTree new_panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n                  CFG_PanelNode *new_focused = cfg_panel_node_from_tree_cfg(panel_tree.root, next->cfg);\r\n                  for(CFG_PanelNode *grandchild = new_focused; grandchild != &cfg_nil_panel_node; grandchild = grandchild->first)\r\n                  {\r\n                    new_focused = grandchild;\r\n                  }\r\n                  rd_cmd(RD_CmdKind_FocusPanel, .panel = new_focused->cfg->id);\r\n                }\r\n              }\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: panel tab controls\r\n          case RD_CmdKind_FocusTab:\r\n          {\r\n            CFG_Node *tab = cfg_node_from_id(rd_regs()->tab);\r\n            CFG_Node *panel = tab->parent;\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, panel);\r\n            CFG_PanelNode *panel_node = cfg_panel_node_from_tree_cfg(panel_tree.root, panel);\r\n            CFG_Node *selection_cfg = &cfg_nil_node;\r\n            for(CFG_NodePtrNode *n = panel_node->tabs.first; n != 0; n = n->next)\r\n            {\r\n              CFG_Node *tab_selection_cfg = cfg_node_child_from_string(n->v, str8_lit(\"selected\"));\r\n              if(selection_cfg == &cfg_nil_node)\r\n              {\r\n                selection_cfg = tab_selection_cfg;\r\n              }\r\n              else for(CFG_Node *s = tab_selection_cfg; s != &cfg_nil_node; s = cfg_node_child_from_string(n->v, str8_lit(\"selected\")))\r\n              {\r\n                cfg_node_release(rd_state->cfg, s);\r\n              }\r\n            }\r\n            if(selection_cfg == &cfg_nil_node)\r\n            {\r\n              selection_cfg = cfg_node_alloc(rd_state->cfg);\r\n              cfg_node_equip_string(rd_state->cfg, selection_cfg, str8_lit(\"selected\"));\r\n            }\r\n            cfg_node_insert_child(rd_state->cfg, tab, &cfg_nil_node, selection_cfg);\r\n          }break;\r\n          case RD_CmdKind_NextTab:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            CFG_PanelNode *focused = panel_tree.focused;\r\n            CFG_NodePtrNode *selected_tab_n = 0;\r\n            for(CFG_NodePtrNode *n = focused->tabs.first; n != 0; n = n->next)\r\n            {\r\n              if(n->v == focused->selected_tab)\r\n              {\r\n                selected_tab_n = n;\r\n                break;\r\n              }\r\n            }\r\n            CFG_Node *next_selected_tab = &cfg_nil_node;\r\n            U64 idx = 0;\r\n            for(CFG_NodePtrNode *tab_n = selected_tab_n;\r\n                tab_n != 0 && (tab_n != selected_tab_n || idx == 0);\r\n                ((tab_n->next == 0) ? (tab_n = focused->tabs.first) : (tab_n = tab_n->next)), idx += 1)\r\n            {\r\n              if(!rd_cfg_is_project_filtered(tab_n->v) && tab_n != selected_tab_n)\r\n              {\r\n                next_selected_tab = tab_n->v;\r\n                break;\r\n              }\r\n            }\r\n            if(next_selected_tab != &cfg_nil_node)\r\n            {\r\n              rd_cmd(RD_CmdKind_FocusTab, .tab = next_selected_tab->id);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_PrevTab:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            CFG_PanelNode *focused = panel_tree.focused;\r\n            CFG_NodePtrNode *selected_tab_n = 0;\r\n            for(CFG_NodePtrNode *n = focused->tabs.last; n != 0; n = n->prev)\r\n            {\r\n              if(n->v == focused->selected_tab)\r\n              {\r\n                selected_tab_n = n;\r\n                break;\r\n              }\r\n            }\r\n            CFG_Node *next_selected_tab = &cfg_nil_node;\r\n            U64 idx = 0;\r\n            for(CFG_NodePtrNode *tab_n = selected_tab_n;\r\n                tab_n != 0 && (tab_n != selected_tab_n || idx == 0);\r\n                ((tab_n->prev == 0) ? (tab_n = focused->tabs.last) : (tab_n = tab_n->prev)), idx += 1)\r\n            {\r\n              if(!rd_cfg_is_project_filtered(tab_n->v) && tab_n != selected_tab_n)\r\n              {\r\n                next_selected_tab = tab_n->v;\r\n                break;\r\n              }\r\n            }\r\n            if(next_selected_tab != &cfg_nil_node)\r\n            {\r\n              rd_cmd(RD_CmdKind_FocusTab, .tab = next_selected_tab->id);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_MoveTabRight:\r\n          case RD_CmdKind_MoveTabLeft:\r\n          {\r\n            CFG_Node *tab = cfg_node_from_id(rd_regs()->tab);\r\n            CFG_Node *window = rd_window_from_cfg(tab);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            CFG_PanelNode *panel = cfg_panel_node_from_tree_cfg(panel_tree.root, tab->parent);\r\n            CFG_NodePtrList filtered_tabs = {0};\r\n            for(CFG_NodePtrNode *n = panel->tabs.first; n != 0; n = n->next)\r\n            {\r\n              if(rd_cfg_is_project_filtered(n->v))\r\n              {\r\n                continue;\r\n              }\r\n              cfg_node_ptr_list_push(scratch.arena, &filtered_tabs, n->v);\r\n            }\r\n            CFG_Node *tab_prev2 = &cfg_nil_node;\r\n            CFG_Node *tab_prev = &cfg_nil_node;\r\n            CFG_Node *tab_next = &cfg_nil_node;\r\n            {\r\n              CFG_Node *prev2 = &cfg_nil_node;\r\n              CFG_Node *prev = &cfg_nil_node;\r\n              CFG_Node *next = &cfg_nil_node;\r\n              for(CFG_NodePtrNode *n = filtered_tabs.first; n != 0; (prev2 = prev, prev = n->v, n = n->next))\r\n              {\r\n                next = n->next ? n->next->v : &cfg_nil_node;\r\n                if(n->v == tab)\r\n                {\r\n                  tab_prev2 = prev2;\r\n                  tab_prev = prev;\r\n                  tab_next = next;\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            CFG_Node *new_prev = (kind == RD_CmdKind_MoveTabRight ? tab_next : tab_prev2);\r\n            if(new_prev == tab_prev && filtered_tabs.last)\r\n            {\r\n              new_prev = filtered_tabs.last->v;\r\n            }\r\n            rd_cmd(RD_CmdKind_MoveView,\r\n                   .dst_panel = panel->cfg->id,\r\n                   .view     = tab->id,\r\n                   .prev_tab  = new_prev->id);\r\n          }break;\r\n          case RD_CmdKind_BuildTab:\r\n          {\r\n            String8 expr_file_path = rd_file_path_from_eval_string(scratch.arena, rd_regs()->expr);\r\n            CFG_Node *panel = cfg_node_from_id(rd_regs()->panel);\r\n            CFG_Node *tab = cfg_node_new(rd_state->cfg, panel, rd_regs()->string);\r\n            CFG_Node *expr = cfg_node_new(rd_state->cfg, tab, str8_lit(\"expression\"));\r\n            cfg_node_new(rd_state->cfg, expr, rd_regs()->expr);\r\n            if(expr_file_path.size != 0)\r\n            {\r\n              CFG_Node *project = cfg_node_new(rd_state->cfg, tab, str8_lit(\"project\"));\r\n              cfg_node_new(rd_state->cfg, project, rd_state->project_path);\r\n            }\r\n            rd_cmd(RD_CmdKind_FocusTab, .tab = tab->id);\r\n          }break;\r\n          case RD_CmdKind_DuplicateTab:\r\n          {\r\n            CFG_Node *src = cfg_node_from_id(rd_regs()->tab);\r\n            CFG_Node *dst = cfg_node_deep_copy(rd_state->cfg, src);\r\n            cfg_node_insert_child(rd_state->cfg, src->parent, src, dst);\r\n            rd_cmd(RD_CmdKind_FocusTab, .tab = dst->id);\r\n          }break;\r\n          case RD_CmdKind_CopyTabFullPath:\r\n          {\r\n            CFG_Node *tab = cfg_node_from_id(rd_regs()->tab);\r\n            String8 expr = rd_expr_from_cfg(tab);\r\n            String8 full_path = rd_file_path_from_eval_string(scratch.arena, expr);\r\n            os_set_clipboard_text(full_path);\r\n          }break;\r\n          case RD_CmdKind_CloseTab:\r\n          {\r\n            CFG_Node *tab = cfg_node_from_id(rd_regs()->tab);\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, tab);\r\n            CFG_PanelNode *panel = cfg_panel_node_from_tree_cfg(panel_tree.root, tab->parent);\r\n            if(panel->selected_tab == tab)\r\n            {\r\n              B32 found_selected = 0;\r\n              CFG_Node *next_selected_tab = &cfg_nil_node;\r\n              for(CFG_NodePtrNode *n = panel->tabs.first; n != 0; n = n->next)\r\n              {\r\n                if(n->v == panel->selected_tab)\r\n                {\r\n                  found_selected = 1;\r\n                }\r\n                else if(!rd_cfg_is_project_filtered(n->v))\r\n                {\r\n                  next_selected_tab = n->v;\r\n                  if(found_selected)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              rd_cmd(RD_CmdKind_FocusTab, .tab = next_selected_tab->id);\r\n            }\r\n            cfg_node_release(rd_state->cfg, tab);\r\n          }break;\r\n          case RD_CmdKind_MoveView:\r\n          {\r\n            CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n            CFG_Node *prev_tab = cfg_node_from_id(rd_regs()->prev_tab);\r\n            CFG_Node *src_panel = view->parent;\r\n            CFG_Node *dst_panel = cfg_node_from_id(rd_regs()->dst_panel);\r\n            if(dst_panel != &cfg_nil_node && prev_tab != view)\r\n            {\r\n              cfg_node_unhook(rd_state->cfg, src_panel, view);\r\n              cfg_node_insert_child(rd_state->cfg, dst_panel, prev_tab, view);\r\n              rd_cmd(RD_CmdKind_FocusTab, .panel = dst_panel->id, .tab = view->id);\r\n              rd_cmd(RD_CmdKind_FocusPanel, .panel = dst_panel->id);\r\n              CFG_PanelTree src_panel_tree = cfg_panel_tree_from_cfg(scratch.arena, src_panel);\r\n              CFG_PanelNode *src_panel_node = cfg_panel_node_from_tree_cfg(src_panel_tree.root, src_panel);\r\n              B32 src_panel_is_empty = 0;\r\n              if(src_panel != dst_panel)\r\n              {\r\n                src_panel_is_empty = 1;\r\n                for(CFG_NodePtrNode *n = src_panel_node->tabs.first; n != 0; n = n->next)\r\n                {\r\n                  if(!rd_cfg_is_project_filtered(n->v))\r\n                  {\r\n                    rd_cmd(RD_CmdKind_FocusTab, .panel = src_panel->id, .tab = n->v->id);\r\n                    src_panel_is_empty = 0;\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              if(src_panel_is_empty)\r\n              {\r\n                rd_cmd(RD_CmdKind_ClosePanel, .panel = src_panel->id);\r\n              }\r\n            }\r\n          }break;\r\n          case RD_CmdKind_TabBarTop:\r\n          {\r\n            CFG_Node *panel = cfg_node_from_id(rd_regs()->panel);\r\n            cfg_node_release(rd_state->cfg, cfg_node_child_from_string(panel, str8_lit(\"tabs_on_bottom\")));\r\n          }break;\r\n          case RD_CmdKind_TabBarBottom:\r\n          {\r\n            CFG_Node *panel = cfg_node_from_id(rd_regs()->panel);\r\n            cfg_node_child_from_string_or_alloc(rd_state->cfg, panel, str8_lit(\"tabs_on_bottom\"));\r\n          }break;\r\n          case RD_CmdKind_TabSettings:\r\n          {\r\n            String8 expr = push_str8f(scratch.arena, \"query:config.$%I64x\", rd_regs()->tab);\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = expr, .do_implicit_root = 1, .do_big_rows = 1, .do_lister = 1);\r\n          }break;\r\n          \r\n          //- rjf: files\r\n          case RD_CmdKind_Open:\r\n          {\r\n            String8 path = path_absolute_dst_from_relative_dst_src(scratch.arena, rd_regs()->file_path, os_get_current_path(scratch.arena));\r\n            FileProperties props = os_properties_from_file_path(path);\r\n            if(props.created != 0)\r\n            {\r\n              rd_cmd(RD_CmdKind_RecordFileInProject);\r\n              rd_cmd(RD_CmdKind_BuildTab, .string = str8_lit(\"pending\"), .expr = rd_eval_string_from_file_path(scratch.arena, path));\r\n            }\r\n            else\r\n            {\r\n              log_user_errorf(\"Couldn't open file at \\\"%S\\\".\", path);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_Switch:\r\n          {\r\n            String8 path = {0};\r\n            if(path.size == 0)\r\n            {\r\n              CFG_Node *recent_file = cfg_node_from_id(rd_regs()->cfg);\r\n              CFG_Node *path_root = cfg_node_child_from_string(recent_file, str8_lit(\"path\"));\r\n              path = path_root->first->string;\r\n            }\r\n            if(path.size == 0)\r\n            {\r\n              path = rd_regs()->file_path;\r\n            }\r\n            rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = path, .cursor = txt_pt(0, 0), .vaddr = 0, .force_focus = 1, .prefer_new_tab = 1);\r\n          }break;\r\n          case RD_CmdKind_SwitchToPartnerFile:\r\n          {\r\n            String8 file_path      = rd_regs()->file_path;\r\n            String8 file_folder    = str8_chop_last_slash(file_path);\r\n            String8 file_name      = str8_skip_last_slash(str8_chop_last_dot(file_path));\r\n            String8 file_ext       = str8_skip_last_dot(file_path);\r\n            String8 partner_ext_candidates[] =\r\n            {\r\n              str8_lit_comp(\"h\"),\r\n              str8_lit_comp(\"hpp\"),\r\n              str8_lit_comp(\"hxx\"),\r\n              str8_lit_comp(\"c\"),\r\n              str8_lit_comp(\"cc\"),\r\n              str8_lit_comp(\"cxx\"),\r\n              str8_lit_comp(\"cpp\"),\r\n            };\r\n            for(U64 idx = 0; idx < ArrayCount(partner_ext_candidates); idx += 1)\r\n            {\r\n              if(!str8_match(partner_ext_candidates[idx], file_ext, StringMatchFlag_CaseInsensitive))\r\n              {\r\n                String8 candidate = push_str8f(scratch.arena, \"%S.%S\", file_name, partner_ext_candidates[idx]);\r\n                String8 candidate_path = push_str8f(scratch.arena, \"%S/%S\", file_folder, candidate);\r\n                FileProperties candidate_props = os_properties_from_file_path(candidate_path);\r\n                if(candidate_props.modified != 0)\r\n                {\r\n                  rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = candidate_path, .cursor = txt_pt(0, 0), .vaddr = 0, .prefer_new_tab = 1);\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n          }break;\r\n          case RD_CmdKind_RecordFileInProject:\r\n          if(rd_regs()->file_path.size != 0)\r\n          {\r\n            String8 path = rd_regs()->file_path;\r\n            CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n            CFG_NodePtrList recent_files = cfg_node_child_list_from_string(scratch.arena, project, str8_lit(\"recent_file\"));\r\n            CFG_Node *recent_file = &cfg_nil_node;\r\n            for(CFG_NodePtrNode *n = recent_files.first; n != 0; n = n->next)\r\n            {\r\n              if(path_match_normalized(rd_path_from_cfg(n->v), path))\r\n              {\r\n                recent_file = n->v;\r\n                break;\r\n              }\r\n            }\r\n            if(recent_file == &cfg_nil_node)\r\n            {\r\n              recent_file = cfg_node_new(rd_state->cfg, project, str8_lit(\"recent_file\"));\r\n              CFG_Node *path_root = cfg_node_new(rd_state->cfg, recent_file, str8_lit(\"path\"));\r\n              cfg_node_new(rd_state->cfg, path_root, path);\r\n            }\r\n            cfg_node_unhook(rd_state->cfg, project, recent_file);\r\n            cfg_node_insert_child(rd_state->cfg, project, &cfg_nil_node, recent_file);\r\n            recent_files = cfg_node_child_list_from_string(scratch.arena, project, str8_lit(\"recent_file\"));\r\n            if(recent_files.count > 256)\r\n            {\r\n              cfg_node_release(rd_state->cfg, recent_files.last->v);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_ShowFileInExplorer:\r\n          if(rd_regs()->file_path.size != 0)\r\n          {\r\n            String8 full_path = rd_regs()->file_path;\r\n            os_show_in_filesystem_ui(full_path);\r\n          }break;\r\n          \r\n          //- rjf: source <-> disasm\r\n          case RD_CmdKind_GoToDisassembly:\r\n          {\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n            U64 vaddr = 0;\r\n            for(D_LineNode *n = rd_regs()->lines.first; n != 0; n = n->next)\r\n            {\r\n              CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key);\r\n              CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules);\r\n              if(module != &ctrl_entity_nil)\r\n              {\r\n                vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min);\r\n                break;\r\n              }\r\n            }\r\n            rd_cmd(RD_CmdKind_FindCodeLocation, .process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process)->handle, .vaddr = vaddr, .prefer_disasm = 1);\r\n          }break;\r\n          case RD_CmdKind_GoToSource:\r\n          {\r\n            if(rd_regs()->lines.first != 0)\r\n            {\r\n              rd_cmd(RD_CmdKind_FindCodeLocation,\r\n                     .file_path = rd_regs()->lines.first->v.file_path,\r\n                     .cursor    = rd_regs()->lines.first->v.pt,\r\n                     .vaddr     = 0,\r\n                     .process   = ctrl_handle_zero(),\r\n                     .prefer_disasm = 0);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: panel built-in layout builds\r\n          case RD_CmdKind_ResetToDefaultPanels:\r\n          case RD_CmdKind_ResetToCompactPanels:\r\n          case RD_CmdKind_ResetToSimplePanels:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            CFG_Node *panels = cfg_node_child_from_string(window, str8_lit(\"panels\"));\r\n            CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n            \r\n            //- rjf: define all of the \"fixed\" tabs we care about\r\n#define X(name) CFG_Node *name = &cfg_nil_node;\r\n#define Y(name, rule, expr) CFG_Node *name = &cfg_nil_node;\r\n#define Z(name) CFG_Node *name = &cfg_nil_node;\r\n            RD_FixedTabXList\r\n#undef X\r\n#undef Y\r\n#undef Z\r\n            \r\n            //- rjf: find all the fixed tabs, and all text viewers\r\n            B32 any_fixed_tabs_found = 0;\r\n            CFG_NodePtrList texts = {0};\r\n            for(CFG_PanelNode *panel = panel_tree.root;\r\n                panel != &cfg_nil_panel_node;\r\n                panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n            {\r\n              for(CFG_NodePtrNode *n = panel->tabs.first; n != 0; n = n->next)\r\n              {\r\n                CFG_Node *tab = n->v;\r\n                B32 need_unhook = 1;\r\n                if(0){}\r\n#define X(name) else if(str8_match(tab->string, str8_lit(\"watch\"), 0) && str8_match(rd_expr_from_cfg(tab), str8_lit(\"query:\" #name), 0)) {name = tab;}\r\n#define Y(name, rule, expr) else if(str8_match(tab->string, str8_lit(#rule), 0) && str8_match(rd_expr_from_cfg(tab), str8_lit(expr), 0)) {name = tab;}\r\n#define Z(name) else if(str8_match(tab->string, str8_lit(#name), 0)) {name = tab;}\r\n                RD_FixedTabXList\r\n#undef X\r\n#undef Y\r\n#undef Z\r\n                else if(str8_match(tab->string, str8_lit(\"text\"), 0)) {cfg_node_ptr_list_push(scratch.arena, &texts, tab);}\r\n                else\r\n                {\r\n                  need_unhook = 0;\r\n                }\r\n                if(need_unhook)\r\n                {\r\n                  cfg_node_unhook(rd_state->cfg, panel->cfg, tab);\r\n                  any_fixed_tabs_found = 1;\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: release the old panel tree\r\n            cfg_node_release(rd_state->cfg, panels);\r\n            \r\n            //- rjf: allocate any missing tabs\r\n#define X(name) if(name == &cfg_nil_node) {name = cfg_node_alloc(rd_state->cfg); cfg_node_equip_string(rd_state->cfg, name, str8_lit(\"watch\")); CFG_Node *expr_cfg = cfg_node_new(rd_state->cfg, name, str8_lit(\"expression\")); cfg_node_new(rd_state->cfg, expr_cfg, str8_lit(\"query:\" #name));}\r\n#define Y(name, rule, expr) if(name == &cfg_nil_node) {name = cfg_node_alloc(rd_state->cfg); cfg_node_equip_string(rd_state->cfg, name, str8_lit(#rule)); CFG_Node *expr_cfg = cfg_node_new(rd_state->cfg, name, str8_lit(\"expression\")); cfg_node_new(rd_state->cfg, expr_cfg, str8_lit(expr));}\r\n#define Z(name) if(name == &cfg_nil_node && !any_fixed_tabs_found) {name = cfg_node_alloc(rd_state->cfg); cfg_node_equip_string(rd_state->cfg, name, str8_lit(#name));}\r\n            RD_FixedTabXList\r\n#undef X\r\n#undef Y\r\n#undef Z\r\n            \r\n            //- rjf: eliminate all tab selections\r\n#define X(name) if(name != &cfg_nil_node) {cfg_node_release(rd_state->cfg, cfg_node_child_from_string(name, str8_lit(\"selected\")));}\r\n#define Y(name, rule, expr) if(name != &cfg_nil_node) {cfg_node_release(rd_state->cfg, cfg_node_child_from_string(name, str8_lit(\"selected\")));}\r\n#define Z(name) if(name != &cfg_nil_node) {cfg_node_release(rd_state->cfg, cfg_node_child_from_string(name, str8_lit(\"selected\")));}\r\n            RD_FixedTabXList\r\n#undef X\r\n#undef Y\r\n#undef Z\r\n            for(CFG_NodePtrNode *n = texts.first; n != 0; n = n->next)\r\n            {\r\n              cfg_node_release(rd_state->cfg, cfg_node_child_from_string(n->v, str8_lit(\"selected\")));\r\n            }\r\n            \r\n            //- rjf: create the panel root\r\n            panels = cfg_node_new(rd_state->cfg, window, str8_lit(\"panels\"));\r\n            \r\n            //- rjf: rebuild the new panel tree\r\n            switch(kind)\r\n            {\r\n              default:{}break;\r\n              \r\n              //- rjf: (default layout)\r\n              case RD_CmdKind_ResetToDefaultPanels:\r\n              {\r\n                // rjf: root split\r\n                cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"split_x\"));\r\n                CFG_Node *root_0 = cfg_node_new(rd_state->cfg, panels, str8_lit(\"0.85\"));\r\n                CFG_Node *root_1 = cfg_node_new(rd_state->cfg, panels, str8_lit(\"0.15\"));\r\n                \r\n                // rjf: root_0 split\r\n                CFG_Node *root_0_0 = cfg_node_new(rd_state->cfg, root_0, str8_lit(\"0.80\"));\r\n                CFG_Node *root_0_1 = cfg_node_new(rd_state->cfg, root_0, str8_lit(\"0.20\"));\r\n                \r\n                // rjf: root_1 split\r\n                CFG_Node *root_1_0 = cfg_node_new(rd_state->cfg, root_1, str8_lit(\"0.50\"));\r\n                CFG_Node *root_1_1 = cfg_node_new(rd_state->cfg, root_1, str8_lit(\"0.50\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_1_0, root_1_0->last, targets);\r\n                cfg_node_insert_child(rd_state->cfg, root_1_1, root_1_1->last, threads);\r\n                cfg_node_insert_child(rd_state->cfg, root_1_1, root_1_1->last, processes);\r\n                cfg_node_insert_child(rd_state->cfg, root_1_1, root_1_1->last, machines);\r\n                cfg_node_new(rd_state->cfg, targets, str8_lit(\"selected\"));\r\n                cfg_node_new(rd_state->cfg, threads, str8_lit(\"selected\"));\r\n                \r\n                // rjf: root 0_0 split\r\n                CFG_Node *root_0_0_0 = cfg_node_new(rd_state->cfg, root_0_0, str8_lit(\"0.25\"));\r\n                CFG_Node *root_0_0_1 = cfg_node_new(rd_state->cfg, root_0_0, str8_lit(\"0.75\"));\r\n                \r\n                // rjf: root_0_0_0 split\r\n                CFG_Node *root_0_0_0_0 = cfg_node_new(rd_state->cfg, root_0_0_0, str8_lit(\"0.50\"));\r\n                CFG_Node *root_0_0_0_1 = cfg_node_new(rd_state->cfg, root_0_0_0, str8_lit(\"0.50\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0_0_0, root_0_0_0_0->last, disasm);\r\n                cfg_node_new(rd_state->cfg, disasm, str8_lit(\"selected\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0_0_1, root_0_0_0_1->last, breakpoints);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0_0_1, root_0_0_0_1->last, watch_pins);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0_0_1, root_0_0_0_1->last, output);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0_0_1, root_0_0_0_1->last, memory);\r\n                cfg_node_new(rd_state->cfg, output, str8_lit(\"selected\"));\r\n                \r\n                // rjf: root_0_1 split\r\n                CFG_Node *root_0_1_0 = cfg_node_new(rd_state->cfg, root_0_1, str8_lit(\"0.60\"));\r\n                CFG_Node *root_0_1_1 = cfg_node_new(rd_state->cfg, root_0_1, str8_lit(\"0.40\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, watches);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, locals);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, registers);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, globals);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, thread_locals);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, types);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_0, root_0_1_0->last, procedures);\r\n                cfg_node_new(rd_state->cfg, watches, str8_lit(\"selected\"));\r\n                cfg_node_new(rd_state->cfg, root_0_1_0, str8_lit(\"tabs_on_bottom\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_1, root_0_1_1->last, call_stack);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1_1, root_0_1_1->last, modules);\r\n                cfg_node_new(rd_state->cfg, call_stack, str8_lit(\"selected\"));\r\n                cfg_node_new(rd_state->cfg, root_0_1_1, str8_lit(\"tabs_on_bottom\"));\r\n                \r\n                // rjf: fill main panel with getting started, OR all collected code views\r\n                CFG_Node *main_panel = root_0_0_1;\r\n                if(getting_started != &cfg_nil_node)\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, main_panel, main_panel->last, getting_started);\r\n                  cfg_node_new(rd_state->cfg, getting_started, str8_lit(\"selected\"));\r\n                }\r\n                else if(texts.first)\r\n                {\r\n                  cfg_node_new(rd_state->cfg, texts.first->v, str8_lit(\"selected\"));\r\n                }\r\n                for(CFG_NodePtrNode *n = texts.first; n != 0; n = n->next)\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, main_panel, main_panel->last, n->v);\r\n                }\r\n                \r\n                // rjf: set main panel as selected\r\n                cfg_node_new(rd_state->cfg, main_panel, str8_lit(\"selected\"));\r\n              }break;\r\n              \r\n              //- rjf: (compact layout)\r\n              case RD_CmdKind_ResetToCompactPanels:\r\n              {\r\n                // rjf: root split\r\n                cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"split_x\"));\r\n                CFG_Node *root_0 = cfg_node_new(rd_state->cfg, panels, str8_lit(\"0.25\"));\r\n                CFG_Node *root_1 = cfg_node_new(rd_state->cfg, panels, str8_lit(\"0.75\"));\r\n                \r\n                // rjf: root_0 split\r\n                CFG_Node *root_0_0 = cfg_node_new(rd_state->cfg, root_0, str8_lit(\"0.25\"));\r\n                CFG_Node *root_0_1 = cfg_node_new(rd_state->cfg, root_0, str8_lit(\"0.25\"));\r\n                CFG_Node *root_0_2 = cfg_node_new(rd_state->cfg, root_0, str8_lit(\"0.25\"));\r\n                CFG_Node *root_0_3 = cfg_node_new(rd_state->cfg, root_0, str8_lit(\"0.25\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0, root_0_0->last, watches);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_0, root_0_0->last, types);\r\n                cfg_node_new(rd_state->cfg, watches, str8_lit(\"selected\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1, root_0_1->last, threads);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1, root_0_1->last, targets);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1, root_0_1->last, breakpoints);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_1, root_0_1->last, watch_pins);\r\n                cfg_node_new(rd_state->cfg, threads, str8_lit(\"selected\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_2, root_0_2->last, disasm);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_2, root_0_2->last, output);\r\n                cfg_node_new(rd_state->cfg, disasm, str8_lit(\"selected\"));\r\n                cfg_node_insert_child(rd_state->cfg, root_0_3, root_0_3->last, call_stack);\r\n                cfg_node_insert_child(rd_state->cfg, root_0_3, root_0_3->last, modules);\r\n                cfg_node_new(rd_state->cfg, call_stack, str8_lit(\"selected\"));\r\n                \r\n                // rjf: fill main panel with getting started, OR all collected code views\r\n                CFG_Node *main_panel = root_1;\r\n                if(getting_started != &cfg_nil_node)\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, main_panel, main_panel->last, getting_started);\r\n                  cfg_node_new(rd_state->cfg, getting_started, str8_lit(\"selected\"));\r\n                }\r\n                else if(texts.first)\r\n                {\r\n                  cfg_node_new(rd_state->cfg, texts.first->v, str8_lit(\"selected\"));\r\n                }\r\n                for(CFG_NodePtrNode *n = texts.first; n != 0; n = n->next)\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, main_panel, main_panel->last, n->v);\r\n                }\r\n                \r\n                // rjf: set main panel as selected\r\n                cfg_node_new(rd_state->cfg, main_panel, str8_lit(\"selected\"));\r\n              }break;\r\n              \r\n              //- rjf: simple layout\r\n              case RD_CmdKind_ResetToSimplePanels:\r\n              {\r\n                // rjf: root split\r\n                cfg_node_child_from_string_or_alloc(rd_state->cfg, window, str8_lit(\"split_x\"));\r\n                CFG_Node *root_0 = cfg_node_new(rd_state->cfg, panels, str8_lit(\"0.25\"));\r\n                CFG_Node *root_1 = cfg_node_new(rd_state->cfg, panels, str8_lit(\"0.75\"));\r\n                \r\n                // rjf: fill smaller panel with watch\r\n                cfg_node_insert_child(rd_state->cfg, root_0, root_0->last, watches);\r\n                cfg_node_new(rd_state->cfg, watches, str8_lit(\"selected\"));\r\n                \r\n                // rjf: fill main panel with getting started, OR all collected code views\r\n                CFG_Node *main_panel = root_1;\r\n                if(getting_started != &cfg_nil_node)\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, main_panel, main_panel->last, getting_started);\r\n                  cfg_node_new(rd_state->cfg, getting_started, str8_lit(\"selected\"));\r\n                }\r\n                else if(texts.first)\r\n                {\r\n                  cfg_node_new(rd_state->cfg, texts.first->v, str8_lit(\"selected\"));\r\n                }\r\n                for(CFG_NodePtrNode *n = texts.first; n != 0; n = n->next)\r\n                {\r\n                  cfg_node_insert_child(rd_state->cfg, main_panel, main_panel->last, n->v);\r\n                }\r\n                \r\n                // rjf: set main panel as selected\r\n                cfg_node_new(rd_state->cfg, main_panel, str8_lit(\"selected\"));\r\n              }break;\r\n            }\r\n            \r\n            //- rjf: release any unused views from the previous layout\r\n#define X(name) if(name->parent == &cfg_nil_node) {cfg_node_release(rd_state->cfg, name);}\r\n#define Y(name, rule, expr) if(name->parent == &cfg_nil_node) {cfg_node_release(rd_state->cfg, name);}\r\n#define Z(name) if(name->parent == &cfg_nil_node) {cfg_node_release(rd_state->cfg, name);}\r\n            RD_FixedTabXList\r\n#undef X\r\n#undef Y\r\n#undef Z\r\n            \r\n            //- rjf: remember that we reset the panel layouts\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            if(ws != &rd_nil_window_state)\r\n            {\r\n              ws->window_layout_reset = 1;\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: thread finding\r\n          case RD_CmdKind_FindThread:\r\n          {\r\n            Access *access = access_open();\r\n            \r\n            //- rjf: unpack thread info\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n            U64 unwind_index = rd_regs()->unwind_count;\r\n            U64 inline_depth = rd_regs()->inline_depth;\r\n            U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_index);\r\n            CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n            CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);\r\n            DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n            RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n            U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr);\r\n            D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, rip_voff);\r\n            D_Line line = {0};\r\n            {\r\n              U64 idx = 0;\r\n              for(D_LineNode *n = lines.first; n != 0; n = n->next, idx += 1)\r\n              {\r\n                line = n->v;\r\n                if(idx == inline_depth)\r\n                {\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            B32 missing_rip   = (rip_vaddr == 0);\r\n            B32 dbgi_missing  = (di_key_match(di_key_zero(), dbgi_key));\r\n            B32 dbgi_pending  = !dbgi_missing && rdi == &rdi_parsed_nil;\r\n            B32 has_line_info = (line.voff_range.max != 0);\r\n            B32 has_module    = (module != &ctrl_entity_nil);\r\n            B32 has_dbg_info  = has_module && !dbgi_missing;\r\n            \r\n            //- rjf: find-code-location on each affected window\r\n            if(!dbgi_pending && (has_line_info || has_module))\r\n            {\r\n              rd_cmd(RD_CmdKind_FindCodeLocation,\r\n                     .file_path    = line.file_path,\r\n                     .cursor       = line.pt,\r\n                     .process      = process->handle,\r\n                     .voff         = rip_voff,\r\n                     .vaddr        = rip_vaddr,\r\n                     .unwind_count = unwind_index,\r\n                     .inline_depth = inline_depth,\r\n                     .all_windows  = 1);\r\n            }\r\n            if(!missing_rip && !dbgi_pending && !has_line_info && !has_module)\r\n            {\r\n              rd_cmd(RD_CmdKind_FindCodeLocation,\r\n                     .file_path    = str8_zero(),\r\n                     .process      = process->handle,\r\n                     .module       = module->handle,\r\n                     .voff         = rip_voff,\r\n                     .vaddr        = rip_vaddr,\r\n                     .unwind_count = unwind_index,\r\n                     .inline_depth = inline_depth,\r\n                     .all_windows  = 1);\r\n            }\r\n            \r\n            // rjf: retry on stopped, pending debug info\r\n            if(!d_ctrl_targets_running() && (dbgi_pending || missing_rip))\r\n            {\r\n              find_thread_retry = thread->handle;\r\n            }\r\n            access_close(access);\r\n          }break;\r\n          case RD_CmdKind_FindSelectedThread:\r\n          {\r\n            CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread);\r\n            rd_cmd(RD_CmdKind_FindThread,\r\n                   .thread       = selected_thread->handle,\r\n                   .unwind_count = rd_base_regs()->unwind_count,\r\n                   .inline_depth = rd_base_regs()->inline_depth);\r\n          }break;\r\n          \r\n          //- rjf: name finding\r\n          case RD_CmdKind_GoToName:\r\n          {\r\n            String8 name = rd_regs()->string;\r\n            if(name.size != 0)\r\n            {\r\n              B32 name_resolved = 0;\r\n              \r\n              // rjf: strip `s\r\n              if(name.size >= 2 && name.str[0] == '`' && name.str[name.size-1] == '`')\r\n              {\r\n                name = str8_skip(str8_chop(name, 1), 1);\r\n              }\r\n              \r\n              // rjf: try to resolve name as a symbol\r\n              U64 voff = 0;\r\n              DI_Key voff_dbgi_key = {0};\r\n              if(!name_resolved)\r\n              {\r\n                DI_Match match = {0};\r\n                if(match.idx == 0)\r\n                {\r\n                  match = di_match_from_string(name, 0, e_base_ctx->primary_dbg_info->dbgi_key, rd_state->frame_eval_memread_endt_us);\r\n                }\r\n                if(match.idx == 0)\r\n                {\r\n                  match = di_match_from_string(name, 0, di_key_zero(), rd_state->frame_eval_memread_endt_us);\r\n                }\r\n                if(match.section_kind == RDI_SectionKind_Procedures)\r\n                {\r\n                  Access *access = access_open();\r\n                  {\r\n                    name_resolved = 1;\r\n                    RDI_Parsed *rdi = di_rdi_from_key(access, match.key, 0, 0);\r\n                    RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, match.idx);\r\n                    voff = rdi_first_voff_from_procedure(rdi, procedure);\r\n                    voff_dbgi_key = match.key;\r\n                  }\r\n                  access_close(access);\r\n                }\r\n              }\r\n              \r\n              // rjf: try to resolve name as a file\r\n              String8 file_path = {0};\r\n              if(!name_resolved)\r\n              {\r\n                // rjf: unpack quoted portion of string\r\n                String8 file_part_of_name = name;\r\n                U64 quote_pos = str8_find_needle(name, 0, str8_lit(\"\\\"\"), 0);\r\n                if(quote_pos < name.size)\r\n                {\r\n                  file_part_of_name = str8_skip(name, quote_pos+1);\r\n                  U64 ender_quote_pos = str8_find_needle(file_part_of_name, 0, str8_lit(\"\\\"\"), 0);\r\n                  file_part_of_name = str8_prefix(file_part_of_name, ender_quote_pos);\r\n                }\r\n                String8List search_parts = str8_split_path(scratch.arena, file_part_of_name);\r\n                \r\n                // rjf: get source path\r\n                CFG_Node *src_view = cfg_node_from_id(rd_regs()->view);\r\n                String8 src_view_expr = rd_expr_from_cfg(src_view);\r\n                String8 src_file_path = rd_file_path_from_eval_string(scratch.arena, src_view_expr);\r\n                String8List src_file_parts = str8_split_path(scratch.arena, src_file_path);\r\n                \r\n                // rjf: search for actual file\r\n                Temp temp = temp_begin(scratch.arena);\r\n                for(String8Node *n = src_file_parts.first; n != 0; n = n->next)\r\n                {\r\n                  temp_end(temp);\r\n                  String8List try_path_parts = {0};\r\n                  for(String8Node *src_n = src_file_parts.first; src_n != n && src_n != 0; src_n = src_n->next)\r\n                  {\r\n                    str8_list_push(temp.arena, &try_path_parts, src_n->string);\r\n                  }\r\n                  for(String8Node *try_n = search_parts.first; try_n != 0; try_n = try_n->next)\r\n                  {\r\n                    str8_list_push(temp.arena, &try_path_parts, try_n->string);\r\n                  }\r\n                  String8 try_path = str8_list_join(temp.arena, &try_path_parts, &(StringJoin){.sep = str8_lit(\"/\")});\r\n                  FileProperties try_props = os_properties_from_file_path(try_path);\r\n                  if(try_props.modified != 0)\r\n                  {\r\n                    name_resolved = 1;\r\n                    file_path = try_path;\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: process resolved info\r\n              if(!name_resolved)\r\n              {\r\n                log_user_errorf(\"`%S` could not be found.\", name);\r\n              }\r\n              \r\n              // rjf: name resolved to voff * dbg info\r\n              if(name_resolved && voff != 0)\r\n              {\r\n                D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, voff_dbgi_key, voff);\r\n                if(lines.first != 0)\r\n                {\r\n                  CTRL_Entity *process = &ctrl_entity_nil;\r\n                  U64 vaddr = 0;\r\n                  CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, voff_dbgi_key);\r\n                  CTRL_Entity *module = ctrl_entity_list_first(&modules);\r\n                  process = ctrl_entity_ancestor_from_kind(module, CTRL_EntityKind_Process);\r\n                  if(process != &ctrl_entity_nil)\r\n                  {\r\n                    vaddr = module->vaddr_range.min + lines.first->v.voff_range.min;\r\n                  }\r\n                  rd_cmd(RD_CmdKind_FindCodeLocation,\r\n                         .file_path = lines.first->v.file_path,\r\n                         .cursor    = lines.first->v.pt,\r\n                         .process   = process->handle,\r\n                         .module    = module->handle,\r\n                         .vaddr     = module->vaddr_range.min + lines.first->v.voff_range.min);\r\n                }\r\n              }\r\n              \r\n              // rjf: name resolved to a file path\r\n              if(name_resolved && file_path.size != 0)\r\n              {\r\n                rd_cmd(RD_CmdKind_FindCodeLocation, .file_path = file_path, .cursor = txt_pt(1, 1), .vaddr = 0);\r\n              }\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: snap-to-code-location\r\n          case RD_CmdKind_FindCodeLocation:\r\n          {\r\n            // NOTE(rjf): This command is where a lot of high-level flow things\r\n            // in the debugger come together. It's that codepath that runs any\r\n            // time a source code location is clicked in the UI, when a thread\r\n            // is selected, or when a thread causes a halt (hitting a breakpoint\r\n            // or exception or something). This is the logic that manages the\r\n            // flow of how views and panels are changed, opened, etc. when\r\n            // something like that happens.\r\n            //\r\n            // The gist of the intended rule for textual source code locations\r\n            // is the following:\r\n            //\r\n            // 1. Try to find a panel that's viewing the file (has it open in a\r\n            //    tab, *and* that tab is selected).\r\n            // 2. Try to find a panel that has the file open in a tab, but does not\r\n            //    currently have that tab selected.\r\n            // 3. Try to find a panel that has ANY source code open in any tab.\r\n            // 4. If the above things fail, try to pick the biggest panel, which\r\n            //    is generally a decent rule (because it matches the popular\r\n            //    debugger usage UI paradigm).\r\n            //\r\n            // The reason why this is a little more complicated than you might\r\n            // imagine is because this debugger frontend does not have any special\r\n            // \"code panels\" or anything like that, unlike e.g. VS or Remedy. All\r\n            // panels are identical in nature to allow for the user to organize\r\n            // the interface how they want, but in cases like this, we have to\r\n            // \"fish out\" the best option given the user's configuration. This\r\n            // can't be what the user wants in 100% of cases (this program cannot\r\n            // read anyone's mind), but it does provide expected behavior in\r\n            // common cases.\r\n            //\r\n            // The gist of the intended rule for finding disassembly locations is\r\n            // the following:\r\n            //\r\n            // 1. Try to find a panel that's viewing disassembly already - if so,\r\n            //    snap it to the right address.\r\n            // 2. If there is no disassembly tab open, then we need to open one\r\n            //    ONLY if source code was not found.\r\n            // 3. If we need to open a disassembly tab, we will first try to pick\r\n            //    the biggest empty panel.\r\n            // 4. If there is no empty panel, then we will pick the biggest\r\n            //    panel.\r\n            \r\n            //- rjf: grab things to find. path * point, process * address, etc.\r\n            String8 file_path = {0};\r\n            TxtPt point = {0};\r\n            CTRL_Entity *thread = &ctrl_entity_nil;\r\n            CTRL_Entity *process = &ctrl_entity_nil;\r\n            U64 vaddr = 0;\r\n            B32 require_disasm_snap = 0;\r\n            B32 prefer_new_tab = 0;\r\n            {\r\n              file_path      = rd_mapped_from_file_path(scratch.arena, rd_regs()->file_path);\r\n              point          = rd_regs()->cursor;\r\n              thread         = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n              process        = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process);\r\n              vaddr          = rd_regs()->vaddr;\r\n              prefer_new_tab = rd_regs()->prefer_new_tab;\r\n              if(file_path.size == 0)\r\n              {\r\n                require_disasm_snap = 1;\r\n              }\r\n            }\r\n            \r\n            //- rjf: given a src code location, if no vaddr is specified,\r\n            // try to map the src coordinates to a vaddr via line info\r\n            if(vaddr == 0 && file_path.size != 0)\r\n            {\r\n              D_LineList lines = d_lines_from_file_path_line_num(scratch.arena, file_path, point.line);\r\n              for(D_LineNode *n = lines.first; n != 0; n = n->next)\r\n              {\r\n                CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key);\r\n                CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules);\r\n                vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min);\r\n                break;\r\n              }\r\n            }\r\n            \r\n            //- rjf: build task list for all windows we want to apply to\r\n            typedef struct WindowTask WindowTask;\r\n            struct WindowTask\r\n            {\r\n              WindowTask *next;\r\n              CFG_Node *window;\r\n            };\r\n            WindowTask start_window_task = {0, cfg_node_from_id(rd_regs()->window)};\r\n            WindowTask *first_window_task = &start_window_task;\r\n            WindowTask *last_window_task = first_window_task;\r\n            if(rd_regs()->all_windows)\r\n            {\r\n              for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next)\r\n              {\r\n                if(ws->cfg_id == rd_regs()->window)\r\n                {\r\n                  continue;\r\n                }\r\n                WindowTask *t = push_array(scratch.arena, WindowTask, 1);\r\n                SLLQueuePush(first_window_task, last_window_task, t);\r\n                t->window = cfg_node_from_id(ws->cfg_id);\r\n              }\r\n            }\r\n            \r\n            //- rjf: for each window, determine how what it's viewing corresponds to the\r\n            // location we need to be finding.\r\n            typedef struct WindowInfo WindowInfo;\r\n            struct WindowInfo\r\n            {\r\n              WindowInfo *next;\r\n              CFG_Node *window;\r\n              CFG_PanelTree panel_tree;\r\n              CFG_PanelNode *panel_w_this_src_code;\r\n              CFG_Node *view_w_this_src_code;\r\n              CFG_PanelNode *panel_w_auto;\r\n              CFG_Node *view_w_auto;\r\n              CFG_PanelNode *panel_w_any_src_code;\r\n              CFG_PanelNode *panel_w_disasm;\r\n              CFG_Node *view_w_disasm;\r\n              CFG_PanelNode *biggest_panel;\r\n              CFG_PanelNode *biggest_empty_panel;\r\n            };\r\n            WindowInfo *first_window_info = 0;\r\n            WindowInfo *last_window_info = 0;\r\n            for(WindowTask *t = first_window_task; t != 0; t = t->next)\r\n            {\r\n              CFG_Node *window = t->window;\r\n              CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n              WindowInfo *info = push_array(scratch.arena, WindowInfo, 1);\r\n              SLLQueuePush(first_window_info, last_window_info, info);\r\n              info->window = window;\r\n              info->panel_tree = panel_tree;\r\n              \r\n              // rjf: first, try to find panel/view pair that already has the src file open\r\n              info->panel_w_this_src_code = &cfg_nil_panel_node;\r\n              info->view_w_this_src_code = &cfg_nil_node;\r\n              for(CFG_PanelNode *panel = panel_tree.root;\r\n                  panel != &cfg_nil_panel_node;\r\n                  panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n              {\r\n                if(panel->first != &cfg_nil_panel_node)\r\n                {\r\n                  continue;\r\n                }\r\n                for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n                {\r\n                  CFG_Node *tab = tab_n->v;\r\n                  if(rd_cfg_is_project_filtered(tab)) { continue; }\r\n                  String8 tab_expr = rd_expr_from_cfg(tab);\r\n                  String8 tab_file_path = rd_file_path_from_eval_string(scratch.arena, tab_expr);\r\n                  if((str8_match(tab->string, str8_lit(\"text\"), 0) || str8_match(tab->string, str8_lit(\"pending\"), 0)) && \r\n                     path_match_normalized(tab_file_path, file_path))\r\n                  {\r\n                    info->panel_w_this_src_code = panel;\r\n                    info->view_w_this_src_code = tab;\r\n                    if(tab == panel->selected_tab)\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: try to find panel/view pair that has any *auto* source code tab open\r\n              info->panel_w_auto = &cfg_nil_panel_node;\r\n              info->view_w_auto = &cfg_nil_node;\r\n              if(!prefer_new_tab)\r\n              {\r\n                for(CFG_PanelNode *panel = panel_tree.root;\r\n                    panel != &cfg_nil_panel_node;\r\n                    panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n                {\r\n                  if(panel->first != &cfg_nil_panel_node)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n                  {\r\n                    CFG_Node *tab = tab_n->v;\r\n                    if(rd_cfg_is_project_filtered(tab)) { continue; }\r\n                    RD_RegsScope(.tab = tab->id, .view = tab->id)\r\n                    {\r\n                      if(str8_match(tab->string, str8_lit(\"text\"), 0) &&\r\n                         rd_view_setting_b32_from_name(str8_lit(\"auto\")))\r\n                      {\r\n                        info->panel_w_auto = panel;\r\n                        info->view_w_auto = tab;\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: find a panel that already has *any* code open (prioritize largest)\r\n              info->panel_w_any_src_code = &cfg_nil_panel_node;\r\n              {\r\n                Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000));\r\n                F32 best_panel_area = 0;\r\n                for(CFG_PanelNode *panel = panel_tree.root;\r\n                    panel != &cfg_nil_panel_node;\r\n                    panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n                {\r\n                  if(panel->first != &cfg_nil_panel_node)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  Rng2F32 panel_rect = cfg_target_rect_from_panel_node(root_rect, panel_tree.root, panel);\r\n                  Vec2F32 panel_rect_dim = dim_2f32(panel_rect);\r\n                  F32 panel_area = panel_rect_dim.x*panel_rect_dim.y;\r\n                  for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n                  {\r\n                    CFG_Node *tab = tab_n->v;\r\n                    if(rd_cfg_is_project_filtered(tab)) { continue; }\r\n                    String8 view_expr = rd_expr_from_cfg(tab);\r\n                    String8 file_path = rd_file_path_from_eval_string(scratch.arena, view_expr);\r\n                    if(str8_match(tab->string, str8_lit(\"text\"), 0) && file_path.size != 0 && panel_area > best_panel_area)\r\n                    {\r\n                      info->panel_w_any_src_code = panel;\r\n                      best_panel_area = panel_area;\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: try to find panel/view pair that has disassembly open (prioritize largest)\r\n              info->panel_w_disasm = &cfg_nil_panel_node;\r\n              info->view_w_disasm = &cfg_nil_node;\r\n              {\r\n                Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000));\r\n                F32 best_panel_area = 0;\r\n                for(CFG_PanelNode *panel = panel_tree.root;\r\n                    panel != &cfg_nil_panel_node;\r\n                    panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n                {\r\n                  if(panel->first != &cfg_nil_panel_node)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  Rng2F32 panel_rect = cfg_target_rect_from_panel_node(root_rect, panel_tree.root, panel);\r\n                  Vec2F32 panel_rect_dim = dim_2f32(panel_rect);\r\n                  F32 panel_area = panel_rect_dim.x*panel_rect_dim.y;\r\n                  for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n                  {\r\n                    CFG_Node *tab = tab_n->v;\r\n                    if(rd_cfg_is_project_filtered(tab)) { continue; }\r\n                    RD_RegsScope(.view = tab->id, .tab = tab->id)\r\n                    {\r\n                      B32 tab_is_selected = (tab == panel->selected_tab);\r\n                      String8 expr_string = rd_expr_from_cfg(tab);\r\n                      if(str8_match(tab->string, str8_lit(\"disasm\"), 0) && expr_string.size == 0 && panel_area > best_panel_area)\r\n                      {\r\n                        info->panel_w_disasm = panel;\r\n                        info->view_w_disasm = tab;\r\n                        best_panel_area = panel_area;\r\n                        if(tab_is_selected)\r\n                        {\r\n                          break;\r\n                        }\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: find the biggest panel\r\n              info->biggest_panel = &cfg_nil_panel_node;\r\n              {\r\n                Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000));\r\n                F32 best_panel_area = 0;\r\n                for(CFG_PanelNode *panel = panel_tree.root;\r\n                    panel != &cfg_nil_panel_node;\r\n                    panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n                {\r\n                  if(panel->first != &cfg_nil_panel_node)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  Rng2F32 panel_rect = cfg_target_rect_from_panel_node(root_rect, panel_tree.root, panel);\r\n                  Vec2F32 panel_rect_dim = dim_2f32(panel_rect);\r\n                  F32 panel_area = panel_rect_dim.x*panel_rect_dim.y;\r\n                  if((best_panel_area == 0 || panel_area > best_panel_area))\r\n                  {\r\n                    best_panel_area = panel_area;\r\n                    info->biggest_panel = panel;\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: find the biggest empty panel\r\n              info->biggest_empty_panel = &cfg_nil_panel_node;\r\n              {\r\n                Rng2F32 root_rect = r2f32(v2f32(0, 0), v2f32(1000, 1000));\r\n                F32 best_panel_area = 0;\r\n                for(CFG_PanelNode *panel = panel_tree.root;\r\n                    panel != &cfg_nil_panel_node;\r\n                    panel = cfg_panel_node_rec__depth_first_pre(panel_tree.root, panel).next)\r\n                {\r\n                  if(panel->first != &cfg_nil_panel_node)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  Rng2F32 panel_rect = cfg_target_rect_from_panel_node(root_rect, panel_tree.root, panel);\r\n                  Vec2F32 panel_rect_dim = dim_2f32(panel_rect);\r\n                  F32 panel_area = panel_rect_dim.x*panel_rect_dim.y;\r\n                  B32 panel_is_empty = 1;\r\n                  for(CFG_NodePtrNode *n = panel->tabs.first; n != 0; n = n->next)\r\n                  {\r\n                    CFG_Node *tab = n->v;\r\n                    if(!rd_cfg_is_project_filtered(tab))\r\n                    {\r\n                      panel_is_empty = 0;\r\n                      break;\r\n                    }\r\n                  }\r\n                  if(panel_is_empty && (best_panel_area == 0 || panel_area > best_panel_area))\r\n                  {\r\n                    best_panel_area = panel_area;\r\n                    info->biggest_empty_panel = panel;\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            //- rjf: build find-code-location tasks for windows which we *definitely* want\r\n            // to snap - in other words, windows with the destination things focused.\r\n            typedef struct FindCodeLocTask FindCodeLocTask;\r\n            struct FindCodeLocTask\r\n            {\r\n              FindCodeLocTask *next;\r\n              CFG_Node *window;\r\n              CFG_PanelNode *src_code_dst_panel;\r\n              CFG_PanelNode *disasm_dst_panel;\r\n              CFG_PanelNode *panel_w_this_src_code;\r\n              CFG_Node *view_w_this_src_code;\r\n              CFG_PanelNode *panel_w_auto;\r\n              CFG_Node *view_w_auto;\r\n              CFG_PanelNode *panel_w_disasm;\r\n              CFG_Node *view_w_disasm;\r\n            };\r\n            FindCodeLocTask *first_task = 0;\r\n            FindCodeLocTask *last_task = 0;\r\n            B32 did_src_code_snap = 0;\r\n            B32 did_disasm_snap = 0;\r\n            for(WindowInfo *info = first_window_info; info != 0; info = info->next)\r\n            {\r\n              // rjf: choose panel for source code\r\n              CFG_PanelNode *src_code_dst_panel = &cfg_nil_panel_node;\r\n              if(file_path.size != 0 && info->panel_w_this_src_code->selected_tab == info->view_w_this_src_code)\r\n              {\r\n                src_code_dst_panel = info->panel_w_this_src_code;\r\n              }\r\n              \r\n              // rjf: choose panel for disassembly\r\n              CFG_PanelNode *disasm_dst_panel = &cfg_nil_panel_node;\r\n              if(vaddr != 0 && info->panel_w_disasm->selected_tab == info->view_w_disasm)\r\n              {\r\n                disasm_dst_panel = info->panel_w_disasm;\r\n              }\r\n              \r\n              // rjf: push task\r\n              if(src_code_dst_panel != &cfg_nil_panel_node || disasm_dst_panel != &cfg_nil_panel_node)\r\n              {\r\n                FindCodeLocTask *t = push_array(scratch.arena, FindCodeLocTask, 1);\r\n                SLLQueuePush(first_task, last_task, t);\r\n                t->window               = info->window;\r\n                t->src_code_dst_panel   = src_code_dst_panel;\r\n                t->disasm_dst_panel     = disasm_dst_panel;\r\n                t->panel_w_this_src_code= info->panel_w_this_src_code;\r\n                t->view_w_this_src_code = info->view_w_this_src_code;\r\n                t->panel_w_auto         = info->panel_w_auto;\r\n                t->view_w_auto          = info->view_w_auto;\r\n                t->panel_w_disasm       = info->panel_w_disasm;\r\n                t->view_w_disasm        = info->view_w_disasm;\r\n                if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; }\r\n                if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; }\r\n              }\r\n            }\r\n            \r\n            //- rjf: fallback: build find-code-location tasks for windows which have the\r\n            // right things, but they're not focused.\r\n            for(WindowInfo *info = first_window_info; info != 0; info = info->next)\r\n            {\r\n              // rjf: choose panel for source code\r\n              CFG_PanelNode *src_code_dst_panel = &cfg_nil_panel_node;\r\n              if(!did_src_code_snap && file_path.size != 0)\r\n              {\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->panel_w_this_src_code; }\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->panel_w_auto; }\r\n              }\r\n              \r\n              // rjf: choose panel for disassembly\r\n              CFG_PanelNode *disasm_dst_panel = &cfg_nil_panel_node;\r\n              if(!did_disasm_snap && vaddr != 0)\r\n              {\r\n                if(disasm_dst_panel == &cfg_nil_panel_node) { disasm_dst_panel = info->panel_w_disasm; }\r\n              }\r\n              \r\n              // rjf: push task\r\n              if(src_code_dst_panel != &cfg_nil_panel_node || disasm_dst_panel != &cfg_nil_panel_node)\r\n              {\r\n                FindCodeLocTask *t = push_array(scratch.arena, FindCodeLocTask, 1);\r\n                SLLQueuePush(first_task, last_task, t);\r\n                t->window               = info->window;\r\n                t->src_code_dst_panel   = src_code_dst_panel;\r\n                t->disasm_dst_panel     = disasm_dst_panel;\r\n                t->panel_w_this_src_code= info->panel_w_this_src_code;\r\n                t->view_w_this_src_code = info->view_w_this_src_code;\r\n                t->panel_w_auto         = info->panel_w_auto;\r\n                t->view_w_auto          = info->view_w_auto;\r\n                t->panel_w_disasm       = info->panel_w_disasm;\r\n                t->view_w_disasm        = info->view_w_disasm;\r\n                if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; }\r\n                if(disasm_dst_panel != &cfg_nil_panel_node) { did_disasm_snap = 1; }\r\n              }\r\n            }\r\n            \r\n            //- rjf: fallback: build find-code-location tasks for windows w/ auto tabs\r\n            for(WindowInfo *info = first_window_info; info != 0; info = info->next)\r\n            {\r\n              // rjf: choose panel for source code\r\n              CFG_PanelNode *src_code_dst_panel = &cfg_nil_panel_node;\r\n              if(!did_src_code_snap && file_path.size != 0)\r\n              {\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->panel_w_auto; }\r\n              }\r\n              \r\n              // rjf: push task\r\n              if(src_code_dst_panel != &cfg_nil_panel_node)\r\n              {\r\n                FindCodeLocTask *t = push_array(scratch.arena, FindCodeLocTask, 1);\r\n                SLLQueuePush(first_task, last_task, t);\r\n                t->window               = info->window;\r\n                t->src_code_dst_panel   = src_code_dst_panel;\r\n                t->disasm_dst_panel     = &cfg_nil_panel_node;\r\n                t->panel_w_this_src_code= info->panel_w_this_src_code;\r\n                t->view_w_this_src_code = info->view_w_this_src_code;\r\n                t->panel_w_auto         = info->panel_w_auto;\r\n                t->view_w_auto          = info->view_w_auto;\r\n                t->panel_w_disasm       = info->panel_w_disasm;\r\n                t->view_w_disasm        = info->view_w_disasm;\r\n                if(src_code_dst_panel != &cfg_nil_panel_node) { did_src_code_snap = 1; }\r\n              }\r\n            }\r\n            \r\n            //- rjf: fallback: build find-code-location tasks for windows which did not\r\n            // have the right things at all, but have reasonable candidate panels for\r\n            // snapping.\r\n            for(WindowInfo *info = first_window_info; info != 0; info = info->next)\r\n            {\r\n              // rjf: choose panel for source code\r\n              CFG_PanelNode *src_code_dst_panel = &cfg_nil_panel_node;\r\n              if(!did_src_code_snap && file_path.size != 0)\r\n              {\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->panel_w_this_src_code; }\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->panel_w_auto; }\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->panel_w_any_src_code; }\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->biggest_empty_panel; }\r\n                if(src_code_dst_panel == &cfg_nil_panel_node) { src_code_dst_panel = info->biggest_panel; }\r\n              }\r\n              \r\n              // rjf: choose panel for disassembly\r\n              CFG_PanelNode *disasm_dst_panel = &cfg_nil_panel_node;\r\n              if(!did_disasm_snap && vaddr != 0)\r\n              {\r\n                if(disasm_dst_panel == &cfg_nil_panel_node) { disasm_dst_panel = info->panel_w_disasm; }\r\n                if(disasm_dst_panel == &cfg_nil_panel_node) { disasm_dst_panel = info->biggest_empty_panel; }\r\n                if(disasm_dst_panel == &cfg_nil_panel_node) { disasm_dst_panel = info->biggest_panel; }\r\n              }\r\n              \r\n              // rjf: push task\r\n              if(src_code_dst_panel != &cfg_nil_panel_node || disasm_dst_panel != &cfg_nil_panel_node)\r\n              {\r\n                FindCodeLocTask *t = push_array(scratch.arena, FindCodeLocTask, 1);\r\n                SLLQueuePush(first_task, last_task, t);\r\n                t->window               = info->window;\r\n                t->src_code_dst_panel   = src_code_dst_panel;\r\n                t->disasm_dst_panel     = disasm_dst_panel;\r\n                t->panel_w_this_src_code= info->panel_w_this_src_code;\r\n                t->view_w_this_src_code = info->view_w_this_src_code;\r\n                t->panel_w_auto         = info->panel_w_auto;\r\n                t->view_w_auto          = info->view_w_auto;\r\n                t->panel_w_disasm       = info->panel_w_disasm;\r\n                t->view_w_disasm        = info->view_w_disasm;\r\n              }\r\n            }\r\n            \r\n            //- rjf: perform the find-code-location for each task\r\n            for(FindCodeLocTask *t = first_task; t != 0; t = t->next)\r\n            {\r\n              CFG_PanelNode *src_code_dst_panel = t->src_code_dst_panel;\r\n              CFG_PanelNode *disasm_dst_panel = t->disasm_dst_panel;\r\n              \r\n              // rjf: if disasm and source code match:\r\n              //        if disasm preferred, cancel source\r\n              //        if source preferred, cancel disasm\r\n              if(disasm_dst_panel == src_code_dst_panel)\r\n              {\r\n                if(rd_regs()->prefer_disasm)\r\n                {\r\n                  src_code_dst_panel = &cfg_nil_panel_node;\r\n                }\r\n                else\r\n                {\r\n                  disasm_dst_panel = &cfg_nil_panel_node;\r\n                }\r\n              }\r\n              \r\n              // rjf: if disasm is not preferred, and we have no disassembly view\r\n              // open at all, cancel disasm, so that it doesn't open if the user\r\n              // doesn't want it.\r\n              if(!rd_regs()->prefer_disasm && t->panel_w_disasm == &cfg_nil_panel_node && file_path.size != 0)\r\n              {\r\n                disasm_dst_panel = &cfg_nil_panel_node;\r\n              }\r\n              \r\n              // rjf: if disasm is not preferred, and we have no disassembly view\r\n              // *selected* at all, cancel disasm, so that it doesn't open if the user\r\n              // doesn't want it.\r\n              if(!rd_regs()->prefer_disasm && t->view_w_disasm != &cfg_nil_node && cfg_node_child_from_string(t->view_w_disasm, str8_lit(\"selected\")) == &cfg_nil_node &&\r\n                 file_path.size != 0)\r\n              {\r\n                disasm_dst_panel = &cfg_nil_panel_node;\r\n              }\r\n              \r\n              // rjf: snap to source code\r\n              if(file_path.size != 0 && src_code_dst_panel != &cfg_nil_panel_node)\r\n              {\r\n                CFG_PanelNode *dst_panel = src_code_dst_panel;\r\n                \r\n                // rjf: construct new view if needed\r\n                CFG_Node *dst_tab = t->view_w_this_src_code;\r\n                if(dst_tab == &cfg_nil_node && dst_panel == t->panel_w_auto && t->view_w_auto != &cfg_nil_node)\r\n                {\r\n                  dst_tab = t->view_w_auto;\r\n                  RD_ViewState *vs = rd_view_state_from_cfg(dst_tab);\r\n                  vs->last_frame_index_built = 0;\r\n                  CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit(\"expression\"));\r\n                  cfg_node_new_replace(rd_state->cfg, expr, rd_eval_string_from_file_path(scratch.arena, file_path));\r\n                  cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit(\"cursor_line\")), str8_lit(\"1\"));\r\n                  cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit(\"cursor_column\")), str8_lit(\"1\"));\r\n                  cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit(\"mark_line\")), str8_lit(\"1\"));\r\n                  cfg_node_new_replace(rd_state->cfg, cfg_node_child_from_string_or_alloc(rd_state->cfg, dst_tab, str8_lit(\"mark_column\")), str8_lit(\"1\"));\r\n                }\r\n                else if(dst_panel != &cfg_nil_panel_node && dst_tab == &cfg_nil_node)\r\n                {\r\n                  dst_tab = cfg_node_new(rd_state->cfg, dst_panel->cfg, str8_lit(\"text\"));\r\n                  CFG_Node *expr = cfg_node_new(rd_state->cfg, dst_tab, str8_lit(\"expression\"));\r\n                  cfg_node_new(rd_state->cfg, expr, rd_eval_string_from_file_path(scratch.arena, file_path));\r\n                  if(!prefer_new_tab)\r\n                  {\r\n                    CFG_Node *auto_root = cfg_node_new(rd_state->cfg, dst_tab, str8_lit(\"auto\"));\r\n                    cfg_node_new(rd_state->cfg, auto_root, str8_lit(\"1\"));\r\n                  }\r\n                }\r\n                \r\n                // rjf: determine if we need a contain or center\r\n                RD_CmdKind cursor_snap_kind = RD_CmdKind_CenterCursor;\r\n                if(dst_panel != &cfg_nil_panel_node && dst_tab == t->view_w_this_src_code && dst_panel->selected_tab == dst_tab)\r\n                {\r\n                  cursor_snap_kind = RD_CmdKind_ContainCursor;\r\n                }\r\n                \r\n                // rjf: move cursor & snap-to-cursor\r\n                if(dst_panel != &cfg_nil_panel_node) RD_RegsScope(.window = t->window->id,\r\n                                                                  .panel = dst_panel->cfg->id,\r\n                                                                  .view = dst_tab->id,\r\n                                                                  .tab = dst_tab->id)\r\n                {\r\n                  if(rd_regs()->force_focus)\r\n                  {\r\n                    rd_cmd(RD_CmdKind_FocusPanel);\r\n                  }\r\n                  rd_cmd(RD_CmdKind_FocusTab);\r\n                  if(point.line != 0)\r\n                  {\r\n                    rd_cmd(RD_CmdKind_GoToLine, .cursor = point);\r\n                  }\r\n                  rd_cmd(cursor_snap_kind);\r\n                }\r\n                \r\n                // rjf: record\r\n                rd_cmd(RD_CmdKind_RecordFileInProject, .file_path = file_path);\r\n              }\r\n              \r\n              // rjf: snap to disasm\r\n              if(process != &ctrl_entity_nil && vaddr != 0 && disasm_dst_panel != &cfg_nil_panel_node)\r\n              {\r\n                CFG_PanelNode *dst_panel = disasm_dst_panel;\r\n                \r\n                // rjf: construct new tab if needed\r\n                CFG_Node *dst_tab = t->view_w_disasm;\r\n                if(dst_panel != &cfg_nil_panel_node && t->view_w_disasm == &cfg_nil_node)\r\n                {\r\n                  dst_tab = cfg_node_new(rd_state->cfg, dst_panel->cfg, str8_lit(\"disasm\"));\r\n                }\r\n                \r\n                // rjf: determine if we need a contain or center\r\n                RD_CmdKind cursor_snap_kind = RD_CmdKind_CenterCursor;\r\n                if(dst_tab == t->view_w_disasm && dst_panel->selected_tab == dst_tab)\r\n                {\r\n                  cursor_snap_kind = RD_CmdKind_ContainCursor;\r\n                }\r\n                \r\n                // rjf: move cursor & snap-to-cursor\r\n                if(dst_panel != &cfg_nil_panel_node) RD_RegsScope(.window = t->window->id,\r\n                                                                  .panel = dst_panel->cfg->id,\r\n                                                                  .tab = dst_tab->id,\r\n                                                                  .view  = dst_tab->id)\r\n                {\r\n                  rd_cmd(RD_CmdKind_FocusTab);\r\n                  rd_cmd(RD_CmdKind_GoToAddress, .process = process->handle, .vaddr = vaddr);\r\n                  rd_cmd(cursor_snap_kind);\r\n                }\r\n              }\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: queries\r\n          case RD_CmdKind_PushQuery:\r\n          {\r\n            String8 cmd_name = rd_regs()->cmd_name;\r\n            RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n            \r\n            // rjf: close existing context menus\r\n            {\r\n              CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n              RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n              ui_ctx_menu_close();\r\n              ws->menu_bar_focused = 0;\r\n            }\r\n            \r\n            // rjf: floating queries -> set up window to build immediate-mode top-level query\r\n            CFG_Node *view = &cfg_nil_node;\r\n            B32 is_floating = (cmd_name.size == 0 || cmd_kind_info->query.flags & RD_QueryFlag_Floating);\r\n            if(is_floating)\r\n            {\r\n              CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n              RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n              if(ws != &rd_nil_window_state)\r\n              {\r\n                ws->query_is_active = 1;\r\n                arena_clear(ws->query_arena);\r\n                ws->query_regs = rd_regs_copy(ws->query_arena, rd_regs());\r\n              }\r\n              CFG_Node *window_query = rd_immediate_cfg_from_keyf(\"window_query_%p\", window);\r\n              cfg_node_release_all_children(rd_state->cfg, window_query);\r\n              view = cfg_node_child_from_string_or_alloc(rd_state->cfg, window_query, str8_lit(\"watch\"));\r\n              CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"expression\"));\r\n              cfg_node_new_replace(rd_state->cfg, expr, rd_regs()->expr);\r\n            }\r\n            \r\n            // rjf: non-floating -> embed in view\r\n            else\r\n            {\r\n              view = cfg_node_from_id(rd_regs()->view);\r\n            }\r\n            \r\n            // rjf: determine if the target view is a lister (and thus already has a command)\r\n            B32 view_is_lister = (cfg_node_child_from_string(view, str8_lit(\"lister\")) != &cfg_nil_node);\r\n            \r\n            // rjf: target view is a lister -> do not do anything - cannot replace the command\r\n            if(!view_is_lister)\r\n            {\r\n              // rjf: unpack view's query info\r\n              CFG_Node *query = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"query\"));\r\n              CFG_Node *cmd = cfg_node_child_from_string_or_alloc(rd_state->cfg, query, str8_lit(\"cmd\"));\r\n              CFG_Node *input = cfg_node_child_from_string_or_alloc(rd_state->cfg, query, str8_lit(\"input\"));\r\n              if(is_floating)\r\n              {\r\n                if(rd_regs()->do_implicit_root)\r\n                {\r\n                  cfg_node_release(rd_state->cfg, cfg_node_child_from_string(view, str8_lit(\"explicit_root\")));\r\n                }\r\n                else\r\n                {\r\n                  cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"explicit_root\"));\r\n                }\r\n                if(!rd_regs()->do_lister)\r\n                {\r\n                  cfg_node_release(rd_state->cfg, cfg_node_child_from_string(view, str8_lit(\"lister\")));\r\n                }\r\n                else\r\n                {\r\n                  cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"lister\"));\r\n                }\r\n              }\r\n              \r\n              // rjf: choose initial input string\r\n              String8 initial_input = {0};\r\n              if(cmd_name.size != 0)\r\n              {\r\n                if(cmd_kind_info->query.slot == RD_RegSlot_FilePath)\r\n                {\r\n                  CFG_Node *user = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n                  CFG_Node *current_path = cfg_node_child_from_string(user, str8_lit(\"current_path\"));\r\n                  String8 current_path_string = current_path->first->string;\r\n                  if(current_path_string.size == 0)\r\n                  {\r\n                    current_path_string = path_normalized_from_string(scratch.arena, os_get_current_path(scratch.arena));\r\n                  }\r\n                  initial_input = current_path_string;\r\n                  initial_input = push_str8f(scratch.arena, \"%S/\", initial_input);\r\n                }\r\n                else if(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput)\r\n                {\r\n                  initial_input = input->first->string;\r\n                }\r\n              }\r\n              \r\n              // rjf: build query state\r\n              String8 current_query_cmd_name = cmd->first->string;\r\n              cfg_node_new_replace(rd_state->cfg, input, initial_input);\r\n              cfg_node_new_replace(rd_state->cfg, cmd, cmd_name);\r\n              RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n              if(cmd_name.size != 0)\r\n              {\r\n                if(!vs->query_is_open && cmd_kind_info->query.flags & RD_QueryFlag_SelectOldInput)\r\n                {\r\n                  vs->query_cursor = txt_pt(1, 1+input->first->string.size);\r\n                  vs->query_mark = txt_pt(1, 1);\r\n                }\r\n                else\r\n                {\r\n                  vs->query_cursor = txt_pt(1, 1+input->first->string.size);\r\n                  vs->query_mark = vs->query_cursor;\r\n                }\r\n                if(!str8_match(current_query_cmd_name, cmd_name, 0))\r\n                {\r\n                  vs->query_is_open = 1;\r\n                }\r\n                else\r\n                {\r\n                  vs->query_is_open ^= 1;\r\n                }\r\n              }\r\n              if(rd_regs()->do_lister)\r\n              {\r\n                vs->query_is_open = 1;\r\n              }\r\n              vs->contents_are_focused = 0;\r\n            }\r\n          }break;\r\n          case RD_CmdKind_CompleteQuery:\r\n          {\r\n            // rjf: unpack params\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n            String8 cmd_name = rd_view_query_cmd();\r\n            \r\n            // rjf: find out if this view is a lister\r\n            B32 is_lister = (cfg_node_child_from_string(view, str8_lit(\"lister\")) != &cfg_nil_node);\r\n            \r\n            // rjf: push command\r\n            if(cmd_name.size != 0) RD_RegsScope()\r\n            {\r\n              if(is_lister)\r\n              {\r\n                rd_regs()->view = ws->query_regs->view;\r\n              }\r\n              rd_push_cmd(cmd_name, rd_regs());\r\n            }\r\n            \r\n            // rjf: complete query, either by closing the query popup, or closing the\r\n            // tab-embedded query edit\r\n            RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(cmd_name);\r\n            if(is_lister)\r\n            {\r\n              ws->query_is_active = 0;\r\n            }\r\n            else if(!(cmd_kind_info->query.flags & RD_QueryFlag_KeepOldInput))\r\n            {\r\n              RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n              vs->query_is_open = 0;\r\n              vs->query_string_size = 0;\r\n            }\r\n          }break;\r\n          case RD_CmdKind_CancelQuery:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            if(ws != &rd_nil_window_state)\r\n            {\r\n              ws->query_is_active = 0;\r\n              arena_clear(ws->query_arena);\r\n              ws->query_regs = 0;\r\n            }\r\n          }break;\r\n          case RD_CmdKind_UpdateQuery:\r\n          {\r\n            CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n            CFG_Node *query = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"query\"));\r\n            CFG_Node *input = cfg_node_child_from_string_or_alloc(rd_state->cfg, query, str8_lit(\"input\"));\r\n            cfg_node_new_replace(rd_state->cfg, input, rd_regs()->string);\r\n            RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n            vs->query_cursor = vs->query_mark = txt_pt(1, rd_regs()->string.size+1);\r\n            vs->query_string_size = Min(sizeof(vs->query_buffer), rd_regs()->string.size);\r\n            MemoryCopy(vs->query_buffer, rd_regs()->string.str, vs->query_string_size);\r\n          }break;\r\n          \r\n          //- rjf: event buffers\r\n          case RD_CmdKind_OpenEventBuffer:\r\n          {\r\n            CFG_Node *transient = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"transient\"));\r\n            CFG_Node *buffer = cfg_node_new(rd_state->cfg, transient, str8_lit(\"event_buffer\"));\r\n            str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, \"$%I64x\", buffer->id);\r\n          }break;\r\n          \r\n          //- rjf: developer commands\r\n          case RD_CmdKind_ToggleDevMenu:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            ws->dev_menu_is_open ^= 1;\r\n          }break;\r\n          \r\n          //- rjf: general entity operations\r\n          case RD_CmdKind_SelectCfg:\r\n          case RD_CmdKind_SelectTarget:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_NodePtrList all_of_the_same_kind = cfg_node_top_level_list_from_string(scratch.arena, cfg->string);\r\n            B32 is_selected = !rd_disabled_from_cfg(cfg);\r\n            for(CFG_NodePtrNode *n = all_of_the_same_kind.first; n != 0; n = n->next)\r\n            {\r\n              CFG_Node *c = n->v;\r\n              cfg_node_release(rd_state->cfg, cfg_node_child_from_string(c, str8_lit(\"enabled\")));\r\n            }\r\n            CFG_Node *enabled_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"enabled\"));\r\n            cfg_node_new_replace(rd_state->cfg, enabled_root, str8_lit(\"1\"));\r\n          }break;\r\n          case RD_CmdKind_EnableCfg:\r\n          case RD_CmdKind_EnableBreakpoint:\r\n          case RD_CmdKind_EnableTarget:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_Node *enabled_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"enabled\"));\r\n            cfg_node_new_replacef(rd_state->cfg, enabled_root, \"1\");\r\n          }break;\r\n          case RD_CmdKind_DisableCfg:\r\n          case RD_CmdKind_DisableBreakpoint:\r\n          case RD_CmdKind_DisableTarget:\r\n          case RD_CmdKind_DeselectCfg:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_Node *enabled_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"enabled\"));\r\n            cfg_node_new_replacef(rd_state->cfg, enabled_root, \"0\");\r\n          }break;\r\n          case RD_CmdKind_RemoveCfg:\r\n          case RD_CmdKind_RemoveBreakpoint:\r\n          case RD_CmdKind_RemoveTarget:\r\n          case RD_CmdKind_CloseEventBuffer:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            cfg_node_release(rd_state->cfg, cfg);\r\n          }break;\r\n          case RD_CmdKind_NameCfg:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            if(rd_regs()->string.size != 0)\r\n            {\r\n              CFG_Node *label = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"label\"));\r\n              cfg_node_new(rd_state->cfg, label, rd_regs()->string);\r\n            }\r\n            else\r\n            {\r\n              cfg_node_release(rd_state->cfg, cfg_node_child_from_string(cfg, str8_lit(\"label\")));\r\n            }\r\n          }break;\r\n          case RD_CmdKind_ConditionCfg:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            if(rd_regs()->string.size != 0)\r\n            {\r\n              CFG_Node *cnd = cfg_node_child_from_string_or_alloc(rd_state->cfg, cfg, str8_lit(\"condition\"));\r\n              cfg_node_new(rd_state->cfg, cnd, rd_regs()->string);\r\n            }\r\n            else\r\n            {\r\n              cfg_node_release(rd_state->cfg, cfg_node_child_from_string(cfg, str8_lit(\"condition\")));\r\n            }\r\n          }break;\r\n          case RD_CmdKind_DuplicateCfg:\r\n          {\r\n            CFG_Node *src = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_Node *dst = cfg_node_deep_copy(rd_state->cfg, src);\r\n            cfg_node_insert_child(rd_state->cfg, src->parent, src, dst);\r\n          }break;\r\n          case RD_CmdKind_RelocateCfg:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            \r\n            // rjf: release old location info\r\n            {\r\n              CFG_Node *src_loc = cfg_node_child_from_string(cfg, str8_lit(\"source_location\"));\r\n              CFG_Node *addr_loc = cfg_node_child_from_string(cfg, str8_lit(\"address_location\"));\r\n              cfg_node_release(rd_state->cfg, src_loc);\r\n              cfg_node_release(rd_state->cfg, addr_loc);\r\n            }\r\n            \r\n            // rjf: attach new location info\r\n            {\r\n              String8 file_path = rd_regs()->file_path;\r\n              TxtPt pt = rd_regs()->cursor;\r\n              String8 expr_string = rd_regs()->expr;\r\n              U64 vaddr = rd_regs()->vaddr;\r\n              if(expr_string.size == 0 && vaddr != 0)\r\n              {\r\n                expr_string = push_str8f(scratch.arena, \"0x%I64x\", vaddr);\r\n              }\r\n              if(file_path.size != 0 && pt.line != 0)\r\n              {\r\n                CFG_Node *src_loc = cfg_node_new(rd_state->cfg, cfg, str8_lit(\"source_location\"));\r\n                cfg_node_newf(rd_state->cfg, src_loc, \"%S:%I64d:%I64d\", file_path, pt.line, pt.column);\r\n              }\r\n              else if(expr_string.size != 0)\r\n              {\r\n                CFG_Node *vaddr_loc = cfg_node_new(rd_state->cfg, cfg, str8_lit(\"address_location\"));\r\n                cfg_node_new(rd_state->cfg, vaddr_loc, expr_string);\r\n              }\r\n            }\r\n          }break;\r\n          case RD_CmdKind_SaveToProject:\r\n          {\r\n            CFG_Node *cfg = cfg_node_from_id(rd_regs()->cfg);\r\n            cfg_node_unhook(rd_state->cfg, cfg->parent, cfg);\r\n            CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n            cfg_node_insert_child(rd_state->cfg, project, project->last, cfg);\r\n          }break;\r\n          \r\n          //- rjf: breakpoints\r\n          case RD_CmdKind_AddBreakpoint:\r\n          case RD_CmdKind_ToggleBreakpoint:\r\n          {\r\n            String8 file_path = rd_regs()->file_path;\r\n            TxtPt pt = rd_regs()->cursor;\r\n            U64 vaddr = rd_regs()->vaddr;\r\n            String8 expr = rd_regs()->expr;\r\n            if(expr.size == 0 && vaddr != 0)\r\n            {\r\n              expr = push_str8f(scratch.arena, \"0x%I64x\", vaddr);\r\n            }\r\n            if(file_path.size != 0 || expr.size != 0)\r\n            {\r\n              B32 already_exists = 0;\r\n              CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n              for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next)\r\n              {\r\n                CFG_Node *bp = n->v;\r\n                CFG_Node *cnd = cfg_node_child_from_string(bp, str8_lit(\"condition\"));\r\n                RD_Location loc = rd_location_from_cfg(bp);\r\n                B32 loc_matches_file_pt = (file_path.size != 0 && path_match_normalized(loc.file_path, file_path) && loc.pt.line == pt.line);\r\n                B32 loc_matches_expr    = (expr.size != 0 && str8_match(expr, loc.expr, 0));\r\n                if((loc_matches_file_pt || loc_matches_expr) && cnd->first->string.size == 0)\r\n                {\r\n                  if(kind == RD_CmdKind_ToggleBreakpoint)\r\n                  {\r\n                    cfg_node_release(rd_state->cfg, bp);\r\n                  }\r\n                  already_exists = 1;\r\n                  break;\r\n                }\r\n              }\r\n              if(!already_exists)\r\n              {\r\n                CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n                CFG_Node *bp = cfg_node_new(rd_state->cfg, project, str8_lit(\"breakpoint\"));\r\n                rd_cmd(RD_CmdKind_RelocateCfg, .cfg = bp->id);\r\n                if(rd_regs()->do_lister && !rd_regs()->non_graphical)\r\n                {\r\n                  rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, \"query:config.$%I64x\", bp->id), .do_lister = 0);\r\n                }\r\n                str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, \"$%I64x\", bp->id);\r\n              }\r\n            }\r\n          }break;\r\n          case RD_CmdKind_AddAddressBreakpoint:\r\n          {\r\n            rd_cmd(RD_CmdKind_AddBreakpoint, .file_path = str8_zero(), .do_lister = 1);\r\n          }break;\r\n          case RD_CmdKind_AddFunctionBreakpoint:\r\n          {\r\n            rd_cmd(RD_CmdKind_AddBreakpoint, .file_path = str8_zero(), .expr = rd_regs()->string);\r\n          }break;\r\n          case RD_CmdKind_ClearBreakpoints:\r\n          {\r\n            CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n            for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next)\r\n            {\r\n              cfg_node_release(rd_state->cfg, n->v);\r\n            }\r\n          }break;\r\n          case RD_CmdKind_ListBreakpoints:\r\n          {\r\n            CFG_NodePtrList list = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n            for(CFG_NodePtrNode *n = list.first; n != 0; n = n->next)\r\n            {\r\n              String8 string = cfg_string_from_tree(rd_state->cmd_output_arena, rd_state->cfg_schema_table, str8_zero(), n->v);\r\n              str8_list_push(rd_state->cmd_output_arena, &rd_state->cmd_outputs, string);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: output\r\n          case RD_CmdKind_ClearOutput:\r\n          {\r\n            MTX_Op op = {r1u64(0, 0xffffffffffffffffull), str8_lit(\"\")};\r\n            mtx_push_op(d_state->output_log_key, op);\r\n          }break;\r\n          \r\n          //- rjf: watch pins\r\n          case RD_CmdKind_AddWatchPin:\r\n          case RD_CmdKind_ToggleWatchPin:\r\n          {\r\n            String8 file_path = rd_regs()->file_path;\r\n            TxtPt pt = rd_regs()->cursor;\r\n            String8 expr_string = rd_regs()->expr;\r\n            U64 vaddr = rd_regs()->vaddr;\r\n            B32 removed_already_existing = 0;\r\n            if(kind == RD_CmdKind_ToggleWatchPin)\r\n            {\r\n              CFG_NodePtrList wps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"watch_pin\"));\r\n              for(CFG_NodePtrNode *n = wps.first; n != 0; n = n->next)\r\n              {\r\n                CFG_Node *wp = n->v;\r\n                CFG_Node *expr = cfg_node_child_from_string(wp, str8_lit(\"expression\"));\r\n                RD_Location loc = rd_location_from_cfg(wp);\r\n                B32 loc_matches_file_pt = (file_path.size != 0 && path_match_normalized(loc.file_path, file_path) && loc.pt.line == pt.line);\r\n                B32 loc_matches_expr    = (expr_string.size != 0 && str8_match(expr_string, loc.expr, 0));\r\n                if((loc_matches_file_pt || loc_matches_expr) && str8_match(expr->first->string, expr_string, 0))\r\n                {\r\n                  cfg_node_release(rd_state->cfg, wp);\r\n                  removed_already_existing = 1;\r\n                }\r\n              }\r\n            }\r\n            if(!removed_already_existing)\r\n            {\r\n              CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n              CFG_Node *wp = cfg_node_new(rd_state->cfg, project, str8_lit(\"watch_pin\"));\r\n              CFG_Node *expr = cfg_node_new(rd_state->cfg, wp, str8_lit(\"expression\"));\r\n              cfg_node_new(rd_state->cfg, expr, expr_string);\r\n              rd_cmd(RD_CmdKind_RelocateCfg, .cfg = wp->id, .expr = str8_zero());\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: debug infos\r\n          case RD_CmdKind_LoadDebugInfo:\r\n          {\r\n            CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n            CFG_Node *di = cfg_node_new(rd_state->cfg, project, str8_lit(\"debug_info\"));\r\n            CFG_Node *path = cfg_node_new(rd_state->cfg, di, str8_lit(\"path\"));\r\n            cfg_node_new(rd_state->cfg, path, rd_regs()->file_path);\r\n          }break;\r\n          case RD_CmdKind_UnloadDebugInfo:\r\n          {\r\n            CFG_Node *di = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_Node *path = cfg_node_child_from_string(di, str8_lit(\"path\"));\r\n            cfg_node_release(rd_state->cfg, di);\r\n          }break;\r\n          \r\n          //- rjf: type views\r\n          case RD_CmdKind_AddTypeView:\r\n          {\r\n            CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n            cfg_node_new(rd_state->cfg, project, str8_lit(\"type_view\"));\r\n          }break;\r\n          \r\n          //- rjf: file path maps\r\n          case RD_CmdKind_AddFilePathMap:\r\n          {\r\n            CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            cfg_node_new(rd_state->cfg, project, str8_lit(\"file_path_map\"));\r\n          }break;\r\n          \r\n          //- rjf: themes\r\n          case RD_CmdKind_EditUserTheme:\r\n          {\r\n            CFG_Node *parent = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"user\"));\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, \"query:config.$%I64x.theme_colors\", parent->id));\r\n          }break;\r\n          case RD_CmdKind_EditProjectTheme:\r\n          {\r\n            CFG_Node *parent = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n            rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, \"query:config.$%I64x.theme_colors\", parent->id));\r\n          }break;\r\n          case RD_CmdKind_AddThemeColor:\r\n          {\r\n            Access *access = access_open();\r\n            CFG_Node *parent = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_Node *theme = cfg_node_child_from_string_or_alloc(rd_state->cfg, parent, str8_lit(\"theme\"));\r\n            MD_Node *theme_tree = rd_theme_tree_from_name(scratch.arena, access, theme->first->string);\r\n            if(theme_tree == &md_nil_node)\r\n            {\r\n              cfg_node_new_replace(rd_state->cfg, theme, rd_theme_preset_display_string_table[RD_ThemePreset_DefaultDark]);\r\n            }\r\n            CFG_Node *color = cfg_node_new(rd_state->cfg, parent, str8_lit(\"theme_color\"));\r\n            cfg_node_new(rd_state->cfg, color, str8_lit(\"tags\"));\r\n            CFG_Node *value = cfg_node_new(rd_state->cfg, color, str8_lit(\"value\"));\r\n            cfg_node_new(rd_state->cfg, value, str8_lit(\"0xffffffff\"));\r\n            access_close(access);\r\n          }break;\r\n          case RD_CmdKind_ForkTheme:\r\n          {\r\n            Access *access = access_open();\r\n            CFG_Node *parent = cfg_node_from_id(rd_regs()->cfg);\r\n            CFG_NodePtrList colors = cfg_node_child_list_from_string(scratch.arena, parent, str8_lit(\"theme_color\"));\r\n            for(CFG_NodePtrNode *n = colors.first; n != 0; n = n->next)\r\n            {\r\n              cfg_node_release(rd_state->cfg, n->v);\r\n            }\r\n            CFG_Node *theme_cfg = cfg_node_child_from_string(parent, str8_lit(\"theme\"));\r\n            String8 theme_name = theme_cfg->first->string;\r\n            MD_Node *theme_tree = rd_theme_tree_from_name(scratch.arena, access, theme_name);\r\n            if(theme_tree == &md_nil_node)\r\n            {\r\n              theme_tree = rd_state->theme_preset_trees[RD_ThemePreset_DefaultDark];\r\n            }\r\n            for(MD_Node *n = theme_tree; !md_node_is_nil(n); n = md_node_rec_depth_first_pre(n, theme_tree).next)\r\n            {\r\n              if(str8_match(n->string, str8_lit(\"theme_color\"), 0))\r\n              {\r\n                CFG_Node *color = cfg_node_new(rd_state->cfg, parent, str8_lit(\"theme_color\"));\r\n                CFG_Node *tags = cfg_node_new(rd_state->cfg, color, str8_lit(\"tags\"));\r\n                CFG_Node *value = cfg_node_new(rd_state->cfg, color, str8_lit(\"value\"));\r\n                cfg_node_new(rd_state->cfg, tags, md_child_from_string(n, str8_lit(\"tags\"), 0)->first->string);\r\n                cfg_node_new(rd_state->cfg, value, md_child_from_string(n, str8_lit(\"value\"), 0)->first->string);\r\n              }\r\n            }\r\n            cfg_node_release(rd_state->cfg, theme_cfg);\r\n            access_close(access);\r\n          }break;\r\n          case RD_CmdKind_SaveTheme:\r\n          case RD_CmdKind_SaveAndSetTheme:\r\n          {\r\n            String8 name = rd_regs()->string;\r\n            if(name.size != 0)\r\n            {\r\n              String8 themes_folder = push_str8f(scratch.arena, \"%S/raddbg/themes\", os_get_process_info()->user_program_data_path);\r\n              if(os_make_directory(themes_folder))\r\n              {\r\n                String8 dst_path = push_str8f(scratch.arena, \"%S/%S\", themes_folder, name);\r\n                CFG_Node *parent = cfg_node_from_id(rd_regs()->cfg);\r\n                CFG_NodePtrList colors = cfg_node_child_list_from_string(scratch.arena, parent, str8_lit(\"theme_color\"));\r\n                String8List strings = {0};\r\n                for(CFG_NodePtrNode *n = colors.first; n != 0; n = n->next)\r\n                {\r\n                  str8_list_push(scratch.arena, &strings, cfg_string_from_tree(scratch.arena, rd_state->cfg_schema_table, str8_chop_last_slash(dst_path), n->v));\r\n                }\r\n                String8 data = str8_list_join(scratch.arena, &strings, 0);\r\n                if(os_write_data_to_file_path(dst_path, data))\r\n                {\r\n                  if(kind == RD_CmdKind_SaveAndSetTheme)\r\n                  {\r\n                    for(CFG_NodePtrNode *n = colors.first; n != 0; n = n->next)\r\n                    {\r\n                      cfg_node_release(rd_state->cfg, n->v);\r\n                    }\r\n                    CFG_Node *theme = cfg_node_child_from_string_or_alloc(rd_state->cfg, parent, str8_lit(\"theme\"));\r\n                    cfg_node_new_replace(rd_state->cfg, theme, name);\r\n                  }\r\n                }\r\n                else\r\n                {\r\n                  log_user_errorf(\"Could not successfully write to '%S'.\", dst_path);\r\n                }\r\n              }\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: watches\r\n          case RD_CmdKind_ToggleWatchExpression:\r\n          if(rd_regs()->string.size != 0)\r\n          {\r\n            // rjf: pick a watch tab from all the windows to toggle this expression within\r\n            CFG_Node *watch_tab = &cfg_nil_node;\r\n            {\r\n              B32 watch_tab_has_no_label = 0;\r\n              B32 watch_tab_matches_src_window = 0;\r\n              CFG_NodePtrList windows = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"window\"));\r\n              for(CFG_NodePtrNode *n = windows.first; n != 0; n = n->next)\r\n              {\r\n                CFG_Node *window = n->v;\r\n                CFG_PanelTree panels = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n                for(CFG_PanelNode *panel = panels.root;\r\n                    panel != &cfg_nil_panel_node;\r\n                    panel = cfg_panel_node_rec__depth_first_pre(panels.root, panel).next)\r\n                {\r\n                  for(CFG_NodePtrNode *tab_n = panel->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n                  {\r\n                    CFG_Node *tab = tab_n->v;\r\n                    CFG_Node *label = cfg_node_child_from_string(tab, str8_lit(\"label\"));\r\n                    if(str8_match(tab->string, str8_lit(\"watch\"), 0) &&\r\n                       rd_expr_from_cfg(tab).size == 0)\r\n                    {\r\n                      B32 tab_has_no_label = (label->first->string.size == 0);\r\n                      B32 tab_matches_src_window = (window->id == rd_regs()->window);\r\n                      if(tab_has_no_label > watch_tab_has_no_label ||\r\n                         tab_matches_src_window > watch_tab_matches_src_window ||\r\n                         watch_tab == &cfg_nil_node)\r\n                      {\r\n                        watch_tab = tab;\r\n                        if(tab_has_no_label && tab_matches_src_window)\r\n                        {\r\n                          goto end_watch_tab_search;\r\n                        }\r\n                      }\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n              end_watch_tab_search:;\r\n            }\r\n            \r\n            // rjf: find the existing watch in the selected tab, if it exists\r\n            CFG_Node *existing_watch = &cfg_nil_node;\r\n            for(CFG_Node *child = watch_tab->first; child != &cfg_nil_node; child = child->next)\r\n            {\r\n              if(str8_match(child->string, str8_lit(\"watch\"), 0) && str8_match(child->first->string, rd_regs()->string, 0))\r\n              {\r\n                existing_watch = child;\r\n                break;\r\n              }\r\n            }\r\n            \r\n            // rjf: if this watch exists -> delete it\r\n            if(existing_watch != &cfg_nil_node)\r\n            {\r\n              cfg_node_release(rd_state->cfg, existing_watch);\r\n            }\r\n            \r\n            // rjf: otherwise, create it\r\n            else if(watch_tab != &cfg_nil_node)\r\n            {\r\n              CFG_Node *watch = cfg_node_new(rd_state->cfg, watch_tab, str8_lit(\"watch\"));\r\n              cfg_node_new(rd_state->cfg, watch, rd_regs()->string);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: cursor operations\r\n          case RD_CmdKind_GoToNameAtCursor:\r\n          case RD_CmdKind_ToggleWatchExpressionAtCursor:\r\n          {\r\n            Access *access = access_open();\r\n            RD_Regs *regs = rd_regs();\r\n            C_Key text_key = regs->text_key;\r\n            TXT_LangKind lang_kind = regs->lang_kind;\r\n            TxtRng range = txt_rng(regs->cursor, regs->mark);\r\n            U128 hash = {0};\r\n            TXT_TextInfo info = txt_text_info_from_key_lang(access, text_key, lang_kind, &hash);\r\n            String8 data = c_data_from_hash(access, hash);\r\n            Rng1U64 expr_off_range = {0};\r\n            if(range.min.column != range.max.column)\r\n            {\r\n              expr_off_range = r1u64(txt_off_from_info_pt(&info, range.min), txt_off_from_info_pt(&info, range.max));\r\n            }\r\n            else\r\n            {\r\n              expr_off_range = txt_expr_off_range_from_info_data_pt(&info, data, range.min);\r\n            }\r\n            String8 expr = str8_substr(data, expr_off_range);\r\n            rd_cmd((kind == RD_CmdKind_GoToNameAtCursor ? RD_CmdKind_GoToName :\r\n                    kind == RD_CmdKind_ToggleWatchExpressionAtCursor ? RD_CmdKind_ToggleWatchExpression :\r\n                    RD_CmdKind_GoToName),\r\n                   .string = expr);\r\n            access_close(access);\r\n          }break;\r\n          case RD_CmdKind_SetNextStatement:\r\n          {\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n            String8 file_path = rd_regs()->file_path;\r\n            U64 new_rip_vaddr = rd_regs()->vaddr_range.min;\r\n            if(file_path.size != 0)\r\n            {\r\n              D_LineList *lines = &rd_regs()->lines;\r\n              for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n              {\r\n                CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key);\r\n                CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules);\r\n                if(module != &ctrl_entity_nil)\r\n                {\r\n                  new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min);\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            rd_cmd(RD_CmdKind_SetThreadIP, .vaddr = new_rip_vaddr);\r\n          }break;\r\n          \r\n          //- rjf: targets\r\n          case RD_CmdKind_AddTarget:\r\n          {\r\n            String8 file_path = rd_regs()->file_path;\r\n            CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n            CFG_Node *target = cfg_node_new(rd_state->cfg, project, str8_lit(\"target\"));\r\n            CFG_Node *exe = cfg_node_new(rd_state->cfg, target, str8_lit(\"executable\"));\r\n            cfg_node_new(rd_state->cfg, exe, file_path);\r\n            String8 working_directory = str8_chop_last_slash(file_path);\r\n            if(working_directory.size != 0)\r\n            {\r\n              CFG_Node *wdir = cfg_node_new(rd_state->cfg, target, str8_lit(\"working_directory\"));\r\n              cfg_node_newf(rd_state->cfg, wdir, \"%S/\", working_directory);\r\n            }\r\n            rd_cmd(RD_CmdKind_SelectTarget, .cfg = target->id);\r\n            if(!rd_regs()->non_graphical)\r\n            {\r\n              rd_cmd(RD_CmdKind_PushQuery, .expr = push_str8f(scratch.arena, \"query:config.$%I64x\", target->id));\r\n            }\r\n            str8_list_pushf(rd_state->cmd_output_arena, &rd_state->cmd_outputs, \"$%I64x\", target->id);\r\n          }break;\r\n          \r\n          //- rjf: jit-debugger registration\r\n          case RD_CmdKind_RegisterAsJITDebugger:\r\n          {\r\n#if OS_WINDOWS\r\n            char filename_cstr[MAX_PATH] = {0};\r\n            GetModuleFileName(0, filename_cstr, sizeof(filename_cstr));\r\n            String8 debugger_binary_path = str8_cstring(filename_cstr);\r\n            String8 name8 = str8_lit(\"Debugger\");\r\n            String8 data8 = push_str8f(scratch.arena, \"%S --jit_pid:%%ld --jit_code:%%ld --jit_addr:0x%%p\", debugger_binary_path);\r\n            String16 name16 = str16_from_8(scratch.arena, name8);\r\n            String16 data16 = str16_from_8(scratch.arena, data8);\r\n            B32 likely_not_in_admin_mode = 0;\r\n            {\r\n              HKEY reg_key = 0;\r\n              LSTATUS status = 0;\r\n              status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SOFTWARE\\\\WOW6432Node\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\AeDebug\\\\\", 0, KEY_SET_VALUE, &reg_key);\r\n              likely_not_in_admin_mode = (status == ERROR_ACCESS_DENIED);\r\n              status = RegSetValueExW(reg_key, (LPCWSTR)name16.str, 0, REG_SZ, (BYTE *)data16.str, data16.size*sizeof(U16)+2);\r\n              RegCloseKey(reg_key);\r\n            }\r\n            {\r\n              HKEY reg_key = 0;\r\n              LSTATUS status = 0;\r\n              status = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L\"SOFTWARE\\\\Microsoft\\\\Windows NT\\\\CurrentVersion\\\\AeDebug\\\\\", 0, KEY_SET_VALUE, &reg_key);\r\n              likely_not_in_admin_mode = (status == ERROR_ACCESS_DENIED);\r\n              status = RegSetValueExW(reg_key, (LPCWSTR)name16.str, 0, REG_SZ, (BYTE *)data16.str, data16.size*sizeof(U16)+2);\r\n              RegCloseKey(reg_key);\r\n            }\r\n            if(likely_not_in_admin_mode)\r\n            {\r\n              log_user_error(str8_lit(\"Could not register as the just-in-time debugger, access was denied; try running the debugger as administrator.\"));\r\n            }\r\n#else\r\n            log_user_error(str8_lit(\"Registering as the just-in-time debugger is currently not supported on this system.\"));\r\n#endif\r\n          }break;\r\n          \r\n          //- rjf: developer commands\r\n          case RD_CmdKind_LogMarker:\r\n          {\r\n            log_infof(\"\\\"#MARKER\\\"\");\r\n          }break;\r\n          \r\n          //- rjf: os event passthrough\r\n          case RD_CmdKind_OSEvent:\r\n          {\r\n            OS_Event *os_event = rd_regs()->os_event;\r\n            RD_WindowState *ws = rd_window_state_from_os_handle(os_event->window);\r\n            if(os_event != 0 && ws != &rd_nil_window_state)\r\n            {\r\n              UI_Event ui_event = zero_struct;\r\n              UI_EventKind kind = UI_EventKind_Null;\r\n              {\r\n                switch(os_event->kind)\r\n                {\r\n                  default:{}break;\r\n                  case OS_EventKind_Press:     {kind = UI_EventKind_Press;}break;\r\n                  case OS_EventKind_Release:   {kind = UI_EventKind_Release;}break;\r\n                  case OS_EventKind_MouseMove: {kind = UI_EventKind_MouseMove;}break;\r\n                  case OS_EventKind_Text:      {kind = UI_EventKind_Text;}break;\r\n                  case OS_EventKind_Scroll:    {kind = UI_EventKind_Scroll;}break;\r\n                  case OS_EventKind_FileDrop:  {kind = UI_EventKind_FileDrop;}break;\r\n                }\r\n              }\r\n              ui_event.kind         = kind;\r\n              ui_event.key          = os_event->key;\r\n              ui_event.modifiers    = os_event->modifiers;\r\n              ui_event.string       = os_event->character ? str8_from_32(ui_build_arena(), str32(&os_event->character, 1)) : str8_zero();\r\n              ui_event.paths        = str8_list_copy(ui_build_arena(), &os_event->strings);\r\n              ui_event.pos          = os_event->pos;\r\n              ui_event.delta_2f32   = os_event->delta;\r\n              ui_event.timestamp_us = os_event->timestamp_us;\r\n              ui_event_list_push(scratch.arena, &ws->ui_events, &ui_event);\r\n            }\r\n          }break;\r\n          \r\n          //- rjf: debug control context management operations\r\n          case RD_CmdKind_SelectEntity:\r\n          {\r\n            rd_cmd(RD_CmdKind_SelectThread, .thread = rd_regs()->ctrl_entity);\r\n          }break;\r\n          case RD_CmdKind_SelectThread:\r\n          {\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n            CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n            CTRL_Entity *module = ctrl_module_from_process_vaddr(process, ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle));\r\n            CTRL_Entity *machine = ctrl_entity_ancestor_from_kind(process, CTRL_EntityKind_Machine);\r\n            rd_state->base_regs.v.unwind_count = 0;\r\n            rd_state->base_regs.v.inline_depth = 0;\r\n            rd_state->base_regs.v.thread  = thread->handle;\r\n            rd_state->base_regs.v.module  = module->handle;\r\n            rd_state->base_regs.v.process = process->handle;\r\n            rd_state->base_regs.v.machine = machine->handle;\r\n            rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle, .unwind_count = 0, .inline_depth = 0);\r\n          }break;\r\n          case RD_CmdKind_SelectUnwind:\r\n          {\r\n            Access *access = access_open();\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread);\r\n            CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000);\r\n            CTRL_CallStackFrame *frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth);\r\n            if(frame == 0)\r\n            {\r\n              frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, 0);\r\n            }\r\n            if(frame)\r\n            {\r\n              rd_state->base_regs.v.unwind_count = rd_regs()->unwind_count;\r\n              rd_state->base_regs.v.inline_depth = rd_regs()->inline_depth;\r\n            }\r\n            rd_cmd(RD_CmdKind_FindThread, .thread = thread->handle, .unwind_count = rd_state->base_regs.v.unwind_count, .inline_depth = rd_state->base_regs.v.inline_depth);\r\n            access_close(access);\r\n          }break;\r\n          case RD_CmdKind_UpOneFrame:\r\n          case RD_CmdKind_DownOneFrame:\r\n          {\r\n            Access *access = access_open();\r\n            CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread);\r\n            CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, thread->handle, 1, os_now_microseconds()+10000);\r\n            CTRL_CallStackFrame *current_frame = ctrl_call_stack_frame_from_unwind_and_inline_depth(&call_stack, rd_regs()->unwind_count, rd_regs()->inline_depth);\r\n            CTRL_CallStackFrame *next_frame = current_frame;\r\n            if(current_frame != 0) switch(kind)\r\n            {\r\n              default:{}break;\r\n              case RD_CmdKind_UpOneFrame:\r\n              if(current_frame > call_stack.frames)\r\n              {\r\n                next_frame = current_frame-1;\r\n              }break;\r\n              case RD_CmdKind_DownOneFrame:\r\n              if(current_frame+1 < call_stack.frames + call_stack.frames_count)\r\n              {\r\n                next_frame = current_frame+1;\r\n              }break;\r\n            }\r\n            if(next_frame != 0)\r\n            {\r\n              CTRL_CallStackFrame *next_base_frame = next_frame + next_frame->inline_depth;\r\n              rd_cmd(RD_CmdKind_SelectUnwind,\r\n                     .unwind_count = next_frame->unwind_count,\r\n                     .inline_depth = next_frame->inline_depth);\r\n            }\r\n            access_close(access);\r\n          }break;\r\n          \r\n          //- rjf: meta controls\r\n          case RD_CmdKind_Edit:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Press;\r\n            evt.slot       = UI_EventActionSlot_Edit;\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_Accept:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Press;\r\n            evt.slot       = UI_EventActionSlot_Accept;\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_Cancel:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Press;\r\n            evt.slot       = UI_EventActionSlot_Cancel;\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          \r\n          //- rjf: directional movement & text controls\r\n          //\r\n          // NOTE(rjf): These all get funneled into a separate intermediate that\r\n          // can be used by the UI build phase for navigation and stuff, as well\r\n          // as builder codepaths that want to use these controls to modify text.\r\n          //\r\n          case RD_CmdKind_MoveLeft:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_PickSelectSide|UI_EventFlag_ZeroDeltaOnSelect|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveRight:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_PickSelectSide|UI_EventFlag_ZeroDeltaOnSelect|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUp:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_ExplicitDirectional|UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDown:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_ExplicitDirectional|UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveLeftSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveRightSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional|UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional|UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveLeftChunk:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveRightChunk:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpChunk:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_ExplicitDirectional|UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownChunk:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_ExplicitDirectional|UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpPage:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Page;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownPage:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Page;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpWhole:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Whole;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownWhole:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Whole;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveLeftChunkSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveRightChunkSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpChunkSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownChunkSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark|UI_EventFlag_ExplicitDirectional;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpPageSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark;\r\n            evt.delta_unit = UI_EventDeltaUnit_Page;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownPageSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark;\r\n            evt.delta_unit = UI_EventDeltaUnit_Page;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpWholeSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark;\r\n            evt.delta_unit = UI_EventDeltaUnit_Whole;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownWholeSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark;\r\n            evt.delta_unit = UI_EventDeltaUnit_Whole;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveUpReorder:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Reorder;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveDownReorder:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Reorder;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveHome:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.delta_unit = UI_EventDeltaUnit_Line;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveEnd:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.delta_unit = UI_EventDeltaUnit_Line;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveHomeSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark;\r\n            evt.delta_unit = UI_EventDeltaUnit_Line;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MoveEndSelect:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_KeepMark;\r\n            evt.delta_unit = UI_EventDeltaUnit_Line;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_SelectAll:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt1 = zero_struct;\r\n            evt1.kind       = UI_EventKind_Navigate;\r\n            evt1.delta_unit = UI_EventDeltaUnit_Whole;\r\n            evt1.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt1);\r\n            UI_Event evt2 = zero_struct;\r\n            evt2.kind       = UI_EventKind_Navigate;\r\n            evt2.flags      = UI_EventFlag_KeepMark;\r\n            evt2.delta_unit = UI_EventDeltaUnit_Whole;\r\n            evt2.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt2);\r\n          }break;\r\n          case RD_CmdKind_DeleteSingle:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Edit;\r\n            evt.flags      = UI_EventFlag_Delete|UI_EventFlag_ZeroDeltaOnSelect;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_DeleteChunk:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Edit;\r\n            evt.flags      = UI_EventFlag_Delete|UI_EventFlag_ZeroDeltaOnSelect;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(+1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_BackspaceSingle:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Edit;\r\n            evt.flags      = UI_EventFlag_Delete|UI_EventFlag_ZeroDeltaOnSelect;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_BackspaceChunk:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Edit;\r\n            evt.flags      = UI_EventFlag_Delete|UI_EventFlag_ZeroDeltaOnSelect;\r\n            evt.delta_unit = UI_EventDeltaUnit_Word;\r\n            evt.delta_2s32 = v2s32(-1, +0);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_Copy:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind  = UI_EventKind_Edit;\r\n            evt.flags = UI_EventFlag_Copy|UI_EventFlag_KeepMark;\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_Cut:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind  = UI_EventKind_Edit;\r\n            evt.flags = UI_EventFlag_Copy|UI_EventFlag_Delete;\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_Paste:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind   = UI_EventKind_Text;\r\n            evt.string = os_get_clipboard_text(scratch.arena);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_InsertText:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind   = UI_EventKind_Text;\r\n            evt.string = rd_regs()->string;\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          \r\n          //- rjf: directionless navigation\r\n          case RD_CmdKind_MoveNext:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, +1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n          case RD_CmdKind_MovePrev:\r\n          {\r\n            CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n            RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n            UI_Event evt = zero_struct;\r\n            evt.kind       = UI_EventKind_Navigate;\r\n            evt.flags      = UI_EventFlag_Secondary;\r\n            evt.delta_unit = UI_EventDeltaUnit_Char;\r\n            evt.delta_2s32 = v2s32(+0, -1);\r\n            ui_event_list_push(scratch.arena, &ws->ui_events, &evt);\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather targets\r\n    //\r\n    D_TargetArray targets = {0};\r\n    ProfScope(\"gather targets\")\r\n    {\r\n      CFG_NodePtrList target_cfgs = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"target\"));\r\n      targets.count = target_cfgs.count;\r\n      targets.v = push_array(scratch.arena, D_Target, targets.count);\r\n      U64 idx = 0;\r\n      for(CFG_NodePtrNode *n = target_cfgs.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *src = n->v;\r\n        B32 src_is_disabled = rd_disabled_from_cfg(src);\r\n        if(src_is_disabled)\r\n        {\r\n          targets.count -= 1;\r\n          continue;\r\n        }\r\n        targets.v[idx] = rd_target_from_cfg(scratch.arena, src);\r\n        idx += 1;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather breakpoints & meta-evals (for the engine, meta-evals can only be referenced by breakpoints)\r\n    //\r\n    D_BreakpointArray breakpoints = {0};\r\n    ProfScope(\"gather breakpoints & meta-evals\")\r\n    {\r\n      CFG_NodePtrList bp_cfgs = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n      breakpoints.count = bp_cfgs.count;\r\n      breakpoints.v = push_array(scratch.arena, D_Breakpoint, breakpoints.count);\r\n      U64 idx = 0;\r\n      for(CFG_NodePtrNode *n = bp_cfgs.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *src_bp = n->v;\r\n        B32 src_bp_is_disabled = rd_disabled_from_cfg(src_bp);\r\n        if(src_bp_is_disabled)\r\n        {\r\n          breakpoints.count -= 1;\r\n          continue;\r\n        }\r\n        RD_Location src_bp_loc = rd_location_from_cfg(src_bp);\r\n        String8 src_bp_cnd = cfg_node_child_from_string(src_bp, str8_lit(\"condition\"))->first->string;\r\n        \r\n        //- rjf: walk conditional breakpoint expression tree - for each leaf identifier,\r\n        // determine if it resolves to a meta-evaluation. if it does, compute the meta\r\n        // evaluation data & store.\r\n        //\r\n        // for many conditions, we can statically-disqualify the breakpoint, if it only\r\n        // references frontend-controlled meta-evaluation state. in such cases, we just\r\n        // want to never send the user breakpoint to the control thread, since it cannot\r\n        // be hit anyways. so in this pass, we can also gather information about whether\r\n        // or not it is 'static', w.r.t. the control thread.\r\n        //\r\n        B32 is_static_for_ctrl_thread = 0;\r\n        if(src_bp_cnd.size != 0)\r\n        {\r\n          typedef struct ExprWalkTask ExprWalkTask;\r\n          struct ExprWalkTask\r\n          {\r\n            ExprWalkTask *next;\r\n            E_Expr *expr;\r\n          };\r\n          E_Expr *expr = e_parse_from_string(src_bp_cnd).expr;\r\n          ExprWalkTask start_task = {0, expr};\r\n          ExprWalkTask *first_task = &start_task;\r\n          for(ExprWalkTask *t = first_task; t != 0; t = t->next)\r\n          {\r\n            if(t->expr->kind == E_ExprKind_LeafIdentifier)\r\n            {\r\n              E_Expr *macro_expr = e_string2expr_map_lookup(e_ir_ctx->macro_map, t->expr->string);\r\n              E_Eval eval = e_eval_from_string(t->expr->string);\r\n              if(eval.msgs.max_kind == E_MsgKind_Null)\r\n              {\r\n                switch(eval.space.kind)\r\n                {\r\n                  default:{is_static_for_ctrl_thread = 0;}break;\r\n                  case E_SpaceKind_Null:\r\n                  case RD_EvalSpaceKind_MetaCfg:\r\n                  {\r\n                    is_static_for_ctrl_thread = 1;\r\n                  }break;\r\n                }\r\n              }\r\n            }\r\n            for(E_Expr *child = t->expr->first; child != &e_expr_nil; child = child->next)\r\n            {\r\n              ExprWalkTask *task = push_array(scratch.arena, ExprWalkTask, 1);\r\n              task->expr = child;\r\n              task->next = t->next;\r\n              t->next = task;\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: if this breakpoint is conditioned & static for the control thread, then\r\n        // we can evaluate this condition early, and decide whether or not to send this\r\n        // breakpoint.\r\n        B32 is_statically_disqualified = 0;\r\n        String8 non_ctrl_thread_static_condition = src_bp_cnd;\r\n        if(is_static_for_ctrl_thread)\r\n        {\r\n          E_Eval eval = e_eval_from_string(src_bp_cnd);\r\n          E_Eval value_eval = e_value_eval_from_eval(eval);\r\n          if(value_eval.value.u64 == 0)\r\n          {\r\n            is_statically_disqualified = 1;\r\n          }\r\n          MemoryZeroStruct(&non_ctrl_thread_static_condition);\r\n        }\r\n        \r\n        //- rjf: statically disqualified? -> skip\r\n        if(is_statically_disqualified)\r\n        {\r\n          breakpoints.count -= 1;\r\n          continue;\r\n        }\r\n        \r\n        //- rjf: compute breakpoint flags\r\n        D_BreakpointFlags flags = 0;\r\n        if(str8_match(cfg_node_child_from_string(src_bp, str8_lit(\"break_on_write\"))->first->string, str8_lit(\"1\"), 0))\r\n        {\r\n          flags |= D_BreakpointFlag_BreakOnWrite;\r\n        }\r\n        if(str8_match(cfg_node_child_from_string(src_bp, str8_lit(\"break_on_read\"))->first->string, str8_lit(\"1\"), 0))\r\n        {\r\n          flags |= D_BreakpointFlag_BreakOnRead;\r\n        }\r\n        if(str8_match(cfg_node_child_from_string(src_bp, str8_lit(\"break_on_execute\"))->first->string, str8_lit(\"1\"), 0))\r\n        {\r\n          flags |= D_BreakpointFlag_BreakOnExecute;\r\n        }\r\n        \r\n        //- rjf: compute address range size\r\n        U64 addr_range_size = 0;\r\n        {\r\n          CFG_Node *address_range_size_cfg = cfg_node_child_from_string(src_bp, str8_lit(\"address_range_size\"));\r\n          try_u64_from_str8_c_rules(address_range_size_cfg->first->string, &addr_range_size);\r\n        }\r\n        \r\n        //- rjf: fill breakpoint\r\n        D_Breakpoint *dst_bp = &breakpoints.v[idx];\r\n        dst_bp->flags       = flags;\r\n        dst_bp->id          = src_bp->id;\r\n        dst_bp->file_path   = src_bp_loc.file_path;\r\n        dst_bp->pt          = src_bp_loc.pt;\r\n        dst_bp->vaddr_expr  = src_bp_loc.expr;\r\n        dst_bp->condition   = non_ctrl_thread_static_condition;\r\n        dst_bp->size        = addr_range_size;\r\n        idx += 1;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather path maps\r\n    //\r\n    D_PathMapArray path_maps = {0};\r\n    {\r\n      CFG_NodePtrList maps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"file_path_map\"));\r\n      path_maps.count = maps.count;\r\n      path_maps.v = push_array(scratch.arena, D_PathMap, path_maps.count);\r\n      U64 idx = 0;\r\n      for(CFG_NodePtrNode *n = maps.first; n != 0; n = n->next, idx += 1)\r\n      {\r\n        CFG_Node *map = n->v;\r\n        path_maps.v[idx].src = cfg_node_child_from_string(map, str8_lit(\"source\"))->first->string;\r\n        path_maps.v[idx].dst = cfg_node_child_from_string(map, str8_lit(\"dest\"))->first->string;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather exception code filters\r\n    //\r\n    U64 exception_code_filters[(CTRL_ExceptionCodeKind_COUNT+63)/64] = {0};\r\n    {\r\n      for EachNonZeroEnumVal(CTRL_ExceptionCodeKind, k)\r\n      {\r\n        String8 name = ctrl_exception_code_kind_lowercase_code_string_table[k];\r\n        B32 setting = rd_setting_b32_from_name(name);\r\n        if(setting)\r\n        {\r\n          exception_code_filters[k/64] |= 1ull<<(k%64);\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: tick debug engine\r\n    //\r\n    U64 cmd_count_pre_tick = rd_state->cmds[0].count;\r\n    D_EventList engine_events = d_tick(scratch.arena, &targets, &breakpoints, &path_maps, exception_code_filters);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: process debug engine events\r\n    //\r\n    for(D_EventNode *n = engine_events.first; n != 0; n = n->next)\r\n    {\r\n      D_Event *evt = &n->v;\r\n      switch(evt->kind)\r\n      {\r\n        default:{}break;\r\n        case D_EventKind_ModuleLoad:\r\n        {\r\n          CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, evt->module);\r\n          CTRL_Entity *debug_info_path = ctrl_entity_child_from_kind(module, CTRL_EntityKind_DebugInfoPath);\r\n          String8 new_path = debug_info_path->string;\r\n          if(new_path.size != 0 && os_file_path_exists(new_path))\r\n          {\r\n            CFG_NodePtrList dbg_infos = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"debug_info\"));\r\n            B32 path_found = 0;\r\n            CFG_Node *found_di = &cfg_nil_node;\r\n            for EachNode(n, CFG_NodePtrNode, dbg_infos.first)\r\n            {\r\n              CFG_Node *di = n->v;\r\n              String8 path = rd_path_from_cfg(di);\r\n              if(str8_match(path, new_path, 0))\r\n              {\r\n                path_found = 1;\r\n                found_di = di;\r\n                break;\r\n              }\r\n            }\r\n            if(!path_found)\r\n            {\r\n              CFG_Node *project = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"project\"));\r\n              CFG_Node *di = cfg_node_new(rd_state->cfg, project, str8_lit(\"debug_info\"));\r\n              CFG_Node *path_root = cfg_node_new(rd_state->cfg, di, str8_lit(\"path\"));\r\n              CFG_Node *timestamp_root = cfg_node_new(rd_state->cfg, di, str8_lit(\"timestamp\"));\r\n              cfg_node_new(rd_state->cfg, path_root, new_path);\r\n              cfg_node_newf(rd_state->cfg, timestamp_root, \"%I64u\", debug_info_path->timestamp);\r\n            }\r\n            else\r\n            {\r\n              CFG_Node *timestamp_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, found_di, str8_lit(\"timestamp\"));\r\n              cfg_node_new_replacef(rd_state->cfg, timestamp_root, \"%I64u\", debug_info_path->timestamp);\r\n            }\r\n          }\r\n        }break;\r\n        case D_EventKind_ProcessEnd:\r\n        if(rd_state->quit_after_success)\r\n        {\r\n          CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n          if(evt->code == 0 && processes.count == 0)\r\n          {\r\n            rd_cmd(RD_CmdKind_Exit);\r\n          }\r\n          else if(evt->code != 0)\r\n          {\r\n            rd_state->quit_after_success = 0;\r\n          }\r\n        }break;\r\n        case D_EventKind_Stop:\r\n        {\r\n          B32 need_refocus = (evt->cause != D_EventCause_SoftHalt);\r\n          CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, evt->thread);\r\n          U64 vaddr = evt->vaddr;\r\n          CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n          CTRL_Entity *module = ctrl_module_from_process_vaddr(process, vaddr);\r\n          U64 voff = ctrl_voff_from_vaddr(module, vaddr);\r\n          U64 test_cached_vaddr = ctrl_rip_from_thread(&d_state->ctrl_entity_store->ctx, thread->handle);\r\n          \r\n          // rjf: valid stop thread? -> select & snap\r\n          if(need_refocus && thread != &ctrl_entity_nil && evt->cause != D_EventCause_Halt)\r\n          {\r\n            rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle);\r\n          }\r\n          \r\n          // rjf: no stop-causing thread, but have selected thread? -> snap to selected\r\n          CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_base_regs()->thread);\r\n          if(need_refocus && (evt->cause == D_EventCause_Halt || thread == &ctrl_entity_nil) && selected_thread != &ctrl_entity_nil)\r\n          {\r\n            rd_cmd(RD_CmdKind_SelectThread, .thread = selected_thread->handle);\r\n          }\r\n          \r\n          // rjf: no stop-causing thread, but don't have selected thread? -> snap to first available thread\r\n          if(need_refocus && thread == &ctrl_entity_nil && selected_thread == &ctrl_entity_nil)\r\n          {\r\n            CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread);\r\n            CTRL_Entity *first_available_thread = ctrl_entity_array_first(&threads);\r\n            rd_cmd(RD_CmdKind_SelectThread, .thread = first_available_thread->handle);\r\n          }\r\n          \r\n          // rjf: increment breakpoint hit counts\r\n          if(evt->cause == D_EventCause_UserBreakpoint)\r\n          {\r\n            CFG_Node *bp = cfg_node_from_id(evt->id);\r\n            if(bp != &cfg_nil_node)\r\n            {\r\n              CFG_Node *hit_count_root = cfg_node_child_from_string_or_alloc(rd_state->cfg, bp, str8_lit(\"hit_count\"));\r\n              U64 hit_count = 0;\r\n              try_u64_from_str8_c_rules(hit_count_root->first->string, &hit_count);\r\n              hit_count += 1;\r\n              cfg_node_new_replacef(rd_state->cfg, hit_count_root, \"%I64u\", hit_count);\r\n            }\r\n          }\r\n          \r\n          // rjf: focus window if none focused, and if we have a thread to snap to\r\n          if(need_refocus && (selected_thread != &ctrl_entity_nil || thread != &ctrl_entity_nil))\r\n          {\r\n            B32 any_window_is_focused = 0;\r\n            for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next)\r\n            {\r\n              if(os_window_is_focused(ws->os))\r\n              {\r\n                any_window_is_focused = 1;\r\n                break;\r\n              }\r\n            }\r\n            if(!any_window_is_focused)\r\n            {\r\n              CFG_Node *last_focused_window = cfg_node_from_id(rd_state->last_focused_window);\r\n              RD_WindowState *ws = rd_window_state_from_cfg(last_focused_window);\r\n              if(ws == &rd_nil_window_state)\r\n              {\r\n                ws = rd_state->first_window_state;\r\n              }\r\n              if(ws != &rd_nil_window_state)\r\n              {\r\n                rd_state->prestop_focused_window = os_focused_external_window();\r\n                os_window_set_minimized(ws->os, 0);\r\n                os_window_bring_to_front(ws->os);\r\n                os_window_focus(ws->os);\r\n              }\r\n            }\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: early-out if no new commands\r\n    //\r\n    if(rd_state->cmds[0].count == cmd_count_pre_tick)\r\n    {\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: retry find-thread\r\n  //\r\n  if(!ctrl_handle_match(ctrl_handle_zero(), find_thread_retry))\r\n  {\r\n    rd_cmd(RD_CmdKind_FindThread, .thread = find_thread_retry);\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: rotate command slots, bump command gen counter\r\n  //\r\n  // in this step, we rotate the ring buffer of command batches (command\r\n  // arenas & lists). when the cmds_gen (the position of the ring buffer)\r\n  // is even, the command queue is in a \"read/write\" mode, and this is uniquely\r\n  // usable by the core - this is done so that commands in the core can push\r\n  // other commands, and have those other commands processed on the same frame.\r\n  //\r\n  // in view code, however, they can only use the current command queue in a\r\n  // \"read only\" mode, because new commands pushed by those views must be\r\n  // processed first by the core. so, before calling into view code, the\r\n  // cmds_gen is incremented to be *odd*. this way, the views will *write*\r\n  // commands into the 0 slot, but *read* from the 1 slot (which will contain\r\n  // this frame's commands).\r\n  //\r\n  // after view code runs, the generation number is incremented back to even.\r\n  // the commands pushed by the view will be in the queue, and the core can\r\n  // treat that queue as r/w again.\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    // rjf: rotate\r\n    {\r\n      Arena *first_arena = rd_state->cmds_arenas[0];\r\n      RD_CmdList first_cmds = rd_state->cmds[0];\r\n      MemoryCopy(rd_state->cmds_arenas,\r\n                 rd_state->cmds_arenas+1,\r\n                 sizeof(rd_state->cmds_arenas[0])*(ArrayCount(rd_state->cmds_arenas)-1));\r\n      MemoryCopy(rd_state->cmds,\r\n                 rd_state->cmds+1,\r\n                 sizeof(rd_state->cmds[0])*(ArrayCount(rd_state->cmds)-1));\r\n      rd_state->cmds_arenas[ArrayCount(rd_state->cmds_arenas)-1] = first_arena;\r\n      rd_state->cmds[ArrayCount(rd_state->cmds_arenas)-1] = first_cmds;\r\n    }\r\n    \r\n    // rjf: clear next batch\r\n    {\r\n      arena_clear(rd_state->cmds_arenas[0]);\r\n      MemoryZeroStruct(&rd_state->cmds[0]);\r\n    }\r\n    \r\n    // rjf: bump\r\n    {\r\n      rd_state->cmds_gen += 1;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: compute all ambiguous paths from view titles\r\n  //\r\n  ProfScope(\"compute all ambiguous paths from view titles\")\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    rd_state->ambiguous_path_slots_count = 512;\r\n    rd_state->ambiguous_path_slots = push_array(rd_frame_arena(), RD_AmbiguousPathNode *, rd_state->ambiguous_path_slots_count);\r\n    for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next)\r\n    {\r\n      CFG_Node *window = cfg_node_from_id(ws->cfg_id);\r\n      CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, window);\r\n      for(CFG_PanelNode *p = panel_tree.root; p != &cfg_nil_panel_node; p = cfg_panel_node_rec__depth_first_pre(panel_tree.root, p).next)\r\n      {\r\n        for(CFG_NodePtrNode *tab_n = p->tabs.first; tab_n != 0; tab_n = tab_n->next)\r\n        {\r\n          CFG_Node *tab = tab_n->v;\r\n          if(rd_cfg_is_project_filtered(tab))\r\n          {\r\n            continue;\r\n          }\r\n          RD_RegsScope(.tab = tab->id, .view = tab->id)\r\n          {\r\n            String8 eval_string = rd_expr_from_cfg(tab);\r\n            String8 file_path = rd_file_path_from_eval_string(scratch.arena, eval_string);\r\n            if(file_path.size != 0)\r\n            {\r\n              String8 name = str8_skip_last_slash(file_path);\r\n              U64 hash = d_hash_from_string__case_insensitive(name);\r\n              U64 slot_idx = hash%rd_state->ambiguous_path_slots_count;\r\n              RD_AmbiguousPathNode *node = 0;\r\n              for(RD_AmbiguousPathNode *n = rd_state->ambiguous_path_slots[slot_idx];\r\n                  n != 0;\r\n                  n = n->next)\r\n              {\r\n                if(str8_match(n->name, name, StringMatchFlag_CaseInsensitive))\r\n                {\r\n                  node = n;\r\n                  break;\r\n                }\r\n              }\r\n              if(node == 0)\r\n              {\r\n                node = push_array(rd_frame_arena(), RD_AmbiguousPathNode, 1);\r\n                SLLStackPush(rd_state->ambiguous_path_slots[slot_idx], node);\r\n                node->name = push_str8_copy(rd_frame_arena(), name);\r\n              }\r\n              str8_list_push(rd_frame_arena(), &node->paths, push_str8_copy(rd_frame_arena(), file_path));\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: compute animation rates, given config\r\n  //\r\n  {\r\n    F32 master_animations_f    = (F32)!!rd_setting_b32_from_name(str8_lit(\"animations\"));\r\n    F32 scrolling_animations_f = (F32)!!rd_setting_b32_from_name(str8_lit(\"scrolling_animations\"));\r\n    F32 tooltip_animations_f   = (F32)!!rd_setting_b32_from_name(str8_lit(\"tooltip_animations\"));\r\n    F32 menu_animations_f      = (F32)!!rd_setting_b32_from_name(str8_lit(\"menu_animations\"));\r\n    rd_state->catchall_animation_rate     = 1 - master_animations_f*pow_f32(2, (-60.f * rd_state->frame_dt));\r\n    rd_state->menu_animation_rate         = 1 - master_animations_f*menu_animations_f*pow_f32(2, (-70.f * rd_state->frame_dt));\r\n    rd_state->menu_animation_rate__slow   = 1 - master_animations_f*menu_animations_f*pow_f32(2, (-50.f * rd_state->frame_dt));\r\n    rd_state->entity_alive_animation_rate = 1 - master_animations_f*menu_animations_f*pow_f32(2, (-30.f * rd_state->frame_dt));\r\n    rd_state->rich_hover_animation_rate   = 1 - master_animations_f*menu_animations_f*pow_f32(2, (-50.f * rd_state->frame_dt));\r\n    rd_state->scrolling_animation_rate    = 1 - master_animations_f*scrolling_animations_f*pow_f32(2, (-60.f * rd_state->frame_dt));\r\n    rd_state->tooltip_animation_rate      = 1 - master_animations_f*tooltip_animations_f*pow_f32(2, (-60.f * rd_state->frame_dt));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: animate confirmation\r\n  //\r\n  {\r\n    F32 rate = rd_setting_b32_from_name(str8_lit(\"menu_animations\")) ? 1 - pow_f32(2, (-30.f * rd_state->frame_dt)) : 1.f;\r\n    B32 popup_open = rd_state->popup_active;\r\n    rd_state->popup_t += rate * ((F32)!!popup_open-rd_state->popup_t);\r\n    if(abs_f32(rd_state->popup_t - (F32)!!popup_open) > 0.005f)\r\n    {\r\n      rd_request_frame();\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: update/render all windows\r\n  //\r\n  {\r\n    dr_begin_frame(rd_font_from_slot(RD_FontSlot_Icons));\r\n    CFG_NodePtrList windows = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"window\"));\r\n    for(CFG_NodePtrNode *n = windows.first; n != 0; n = n->next)\r\n    {\r\n      CFG_Node *window = n->v;\r\n      RD_WindowState *w = rd_window_state_from_cfg(window);\r\n      B32 window_is_focused = os_window_is_focused(w->os);\r\n      if(window_is_focused)\r\n      {\r\n        rd_state->last_focused_window = w->cfg_id;\r\n      }\r\n      rd_push_regs();\r\n      rd_regs()->window = w->cfg_id;\r\n      rd_window_frame();\r\n      MemoryZeroStruct(&w->ui_events);\r\n      RD_Regs *window_regs = rd_pop_regs();\r\n      if(rd_state->last_focused_window == w->cfg_id)\r\n      {\r\n        MemoryCopyStruct(rd_regs(), window_regs);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: garbage collect untouched window states\r\n  //\r\n  {\r\n    for EachIndex(slot_idx, rd_state->window_state_slots_count)\r\n    {\r\n      for(RD_WindowState *ws = rd_state->window_state_slots[slot_idx].first, *next; ws != 0; ws = next)\r\n      {\r\n        next = ws->hash_next;\r\n        CFG_Node *cfg = cfg_node_from_id(ws->cfg_id);\r\n        if(cfg == &cfg_nil_node || ws->last_frame_index_touched < rd_state->frame_index || rd_state->quit)\r\n        {\r\n          ui_state_release(ws->ui);\r\n          r_window_unequip(ws->os, ws->r);\r\n          os_window_close(ws->os);\r\n          arena_release(ws->drop_completion_arena);\r\n          arena_release(ws->query_arena);\r\n          arena_release(ws->hover_eval_arena);\r\n          arena_release(ws->autocomp_arena);\r\n          arena_release(ws->arena);\r\n          DLLRemove_NPZ(&rd_nil_window_state, rd_state->first_window_state, rd_state->last_window_state, ws, order_next, order_prev);\r\n          DLLRemove_NP(rd_state->window_state_slots[slot_idx].first, rd_state->window_state_slots[slot_idx].last, ws, hash_next, hash_prev);\r\n          SLLStackPush_N(rd_state->free_window_state, ws, order_next);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: simulate lag\r\n  //\r\n  if(DEV_simulate_lag)\r\n  {\r\n    os_sleep_milliseconds(300);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: end drag/drop if needed\r\n  //\r\n  if(rd_state->drag_drop_state == RD_DragDropState_Dropping)\r\n  {\r\n    rd_state->drag_drop_state = RD_DragDropState_Null;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: clear frame request state\r\n  //\r\n  if(rd_state->num_frames_requested > 0)\r\n  {\r\n    rd_state->num_frames_requested -= 1;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: close frame scopes\r\n  //\r\n  // NOTE(rjf): this always must happen before the refresh, since that\r\n  // will sleep for vsync, and we do not want to hold handles for long,\r\n  // since eviction threads may be waiting to get rid of stuff.\r\n  //\r\n  access_close(rd_state->frame_access);\r\n  rd_state->frame_access = frame_access_restore;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: submit rendering to all windows\r\n  //\r\n  ProfScope(\"submit rendering to all windows\")\r\n  {\r\n    r_begin_frame();\r\n    for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next)\r\n    {\r\n      r_window_begin_frame(w->os, w->r);\r\n      dr_submit_bucket(w->os, w->r, w->draw_bucket);\r\n      r_window_end_frame(w->os, w->r);\r\n    }\r\n    r_end_frame();\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: show windows after first frame\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    CFG_IDList windows_to_show = {0};\r\n    for(RD_WindowState *w = rd_state->first_window_state; w != &rd_nil_window_state; w = w->order_next)\r\n    {\r\n      if(w->frames_alive == 1)\r\n      {\r\n        cfg_id_list_push(scratch.arena, &windows_to_show, w->cfg_id);\r\n      }\r\n    }\r\n    for(CFG_IDNode *n = windows_to_show.first; n != 0; n = n->next)\r\n    {\r\n      CFG_Node *window = cfg_node_from_id(n->v);\r\n      RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n      os_window_first_paint(ws->os);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine frame time, record into history\r\n  //\r\n  U64 end_time_us = os_now_microseconds();\r\n  U64 frame_time_us = end_time_us-begin_time_us;\r\n  rd_state->frame_time_us_history[rd_state->frame_index%ArrayCount(rd_state->frame_time_us_history)] = frame_time_us;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: [windows] clear pages from working set shortly after startup, many of which will not be needed\r\n  //\r\n#if OS_WINDOWS\r\n  if(di_load_count() < 50)\r\n  {\r\n    if(rd_state->frame_index == 15) ProfScope(\"SetProcessWorkingSetSize\")\r\n    {\r\n      SetProcessWorkingSetSize(GetCurrentProcess(), max_U64, max_U64);\r\n    }\r\n  }\r\n#endif\r\n  \r\n  //////////////////////////////\r\n  //- rjf: bump frame time counters\r\n  //\r\n  rd_state->frame_index += 1;\r\n  rd_state->time_in_seconds += rd_state->frame_dt;\r\n  rd_state->time_in_us += frame_time_us;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: bump command batch ring buffer generation\r\n  //\r\n  if(rd_state->frame_depth == 1)\r\n  {\r\n    rd_state->cmds_gen += 1;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: collect logs\r\n  //\r\n  ProfScope(\"collect logs\")\r\n  {\r\n    LogScopeResult log = log_scope_end(scratch.arena);\r\n    os_append_data_to_file_path(rd_state->log_path, log.strings[LogMsgKind_Info]);\r\n    if(log.strings[LogMsgKind_UserError].size != 0)\r\n    {\r\n      String8 error_log = log.strings[LogMsgKind_UserError];\r\n      String8List error_log_lines = str8_split(scratch.arena, error_log, (U8 *)\"\\n\", 1, 0);\r\n      String8 error_log_string = str8_list_join(scratch.arena, &error_log_lines, &(StringJoin){.sep = str8_lit(\" \")});\r\n      for(RD_WindowState *ws = rd_state->first_window_state; ws != &rd_nil_window_state; ws = ws->order_next)\r\n      {\r\n        ws->error_string_size = Min(sizeof(ws->error_buffer), error_log_string.size);\r\n        MemoryCopy(ws->error_buffer, error_log_string.str, ws->error_string_size);\r\n        ws->error_t = 1.f;\r\n      }\r\n    }\r\n  }\r\n  \r\n  rd_state->frame_depth -= 1;\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n"
  },
  {
    "path": "src/raddbg/raddbg_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RADDBG_CORE_H\r\n#define RADDBG_CORE_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Spaces\r\n\r\ntypedef U64 RD_EvalSpaceKind;\r\nenum\r\n{\r\n  RD_EvalSpaceKind_MetaQuery = CTRL_EvalSpaceKind_FirstUserDefined,\r\n  RD_EvalSpaceKind_MetaCfg,\r\n  RD_EvalSpaceKind_MetaCmd,\r\n  RD_EvalSpaceKind_MetaTheme,\r\n  RD_EvalSpaceKind_MetaCtrlEntity,\r\n  RD_EvalSpaceKind_MetaUnattachedProcess,\r\n  RD_EvalSpaceKind_MetaCallStackTree,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: View UI Hook Types\r\n\r\n#define RD_VIEW_UI_FUNCTION_SIG(name) void name(E_Eval eval, Rng2F32 rect)\r\n#define RD_VIEW_UI_FUNCTION_NAME(name) rd_view_ui__##name\r\n#define RD_VIEW_UI_FUNCTION_DEF(name) internal RD_VIEW_UI_FUNCTION_SIG(RD_VIEW_UI_FUNCTION_NAME(name))\r\ntypedef RD_VIEW_UI_FUNCTION_SIG(RD_ViewUIFunctionType);\r\n\r\ntypedef struct RD_ViewUIRule RD_ViewUIRule;\r\nstruct RD_ViewUIRule\r\n{\r\n  String8 name;\r\n  RD_ViewUIFunctionType *ui;\r\n};\r\n\r\ntypedef struct RD_ViewUIRuleNode RD_ViewUIRuleNode;\r\nstruct RD_ViewUIRuleNode\r\n{\r\n  RD_ViewUIRuleNode *next;\r\n  RD_ViewUIRule v;\r\n};\r\n\r\ntypedef struct RD_ViewUIRuleSlot RD_ViewUIRuleSlot;\r\nstruct RD_ViewUIRuleSlot\r\n{\r\n  RD_ViewUIRuleNode *first;\r\n  RD_ViewUIRuleNode *last;\r\n};\r\n\r\ntypedef struct RD_ViewUIRuleMap RD_ViewUIRuleMap;\r\nstruct RD_ViewUIRuleMap\r\n{\r\n  RD_ViewUIRuleSlot *slots;\r\n  U64 slots_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Drag/Drop Types\r\n\r\ntypedef enum RD_DragDropState\r\n{\r\n  RD_DragDropState_Null,\r\n  RD_DragDropState_Dragging,\r\n  RD_DragDropState_Dropping,\r\n  RD_DragDropState_COUNT\r\n}\r\nRD_DragDropState;\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Kind Types\r\n\r\ntypedef U32 RD_QueryFlags;\r\nenum\r\n{\r\n  RD_QueryFlag_AllowFiles       = (1<<0),\r\n  RD_QueryFlag_AllowFolders     = (1<<1),\r\n  RD_QueryFlag_CodeInput        = (1<<2),\r\n  RD_QueryFlag_KeepOldInput     = (1<<3),\r\n  RD_QueryFlag_SelectOldInput   = (1<<4),\r\n  RD_QueryFlag_Floating         = (1<<5),\r\n  RD_QueryFlag_Required         = (1<<6),\r\n};\r\n\r\ntypedef U32 RD_CmdKindFlags;\r\nenum\r\n{\r\n  RD_CmdKindFlag_ListInUI      = (1<<0),\r\n  RD_CmdKindFlag_ListInIPCDocs = (1<<1),\r\n  RD_CmdKindFlag_ListInTab     = (1<<2),\r\n  RD_CmdKindFlag_ListInTextPt  = (1<<3),\r\n  RD_CmdKindFlag_ListInTextRng = (1<<4),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Autocompletion Cursor Info Type\r\n\r\ntypedef struct RD_AutocompCursorInfo RD_AutocompCursorInfo;\r\nstruct RD_AutocompCursorInfo\r\n{\r\n  String8 list_expr;\r\n  String8 filter;\r\n  Rng1U64 replaced_range;\r\n  String8 callee_expr;\r\n  MD_Node *arg_schema;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/raddbg.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: View State Types\r\n\r\ntypedef struct RD_ArenaExt RD_ArenaExt;\r\nstruct RD_ArenaExt\r\n{\r\n  RD_ArenaExt *next;\r\n  Arena *arena;\r\n};\r\n\r\ntypedef struct RD_ViewState RD_ViewState;\r\nstruct RD_ViewState\r\n{\r\n  // rjf: hash links & key\r\n  RD_ViewState *hash_next;\r\n  RD_ViewState *hash_prev;\r\n  CFG_ID cfg_id;\r\n  \r\n  // rjf: touch info\r\n  U64 last_frame_index_touched;\r\n  U64 last_frame_index_built;\r\n  \r\n  // rjf: loading indicator info\r\n  F32 loading_t;\r\n  F32 loading_t_target;\r\n  U64 loading_progress_v;\r\n  U64 loading_progress_v_target;\r\n  \r\n  // rjf: scroll position\r\n  UI_ScrollPt2 scroll_pos;\r\n  \r\n  // rjf: eval visualization view state\r\n  EV_View *ev_view;\r\n  \r\n  // rjf: view-lifetime allocation & user data extensions\r\n  Arena *arena;\r\n  U64 arena_reset_pos;\r\n  RD_ArenaExt *first_arena_ext;\r\n  RD_ArenaExt *last_arena_ext;\r\n  void *user_data;\r\n  \r\n  // rjf: query state\r\n  B32 query_is_open;\r\n  TxtPt query_cursor;\r\n  TxtPt query_mark;\r\n  U8 query_buffer[KB(1)];\r\n  U64 query_string_size;\r\n  \r\n  // rjf: contents are focused (disables query focus)\r\n  B32 contents_are_focused;\r\n};\r\n\r\ntypedef struct RD_ViewStateSlot RD_ViewStateSlot;\r\nstruct RD_ViewStateSlot\r\n{\r\n  RD_ViewState *first;\r\n  RD_ViewState *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Vocabulary Map\r\n\r\ntypedef struct RD_VocabInfoMapNode RD_VocabInfoMapNode;\r\nstruct RD_VocabInfoMapNode\r\n{\r\n  RD_VocabInfoMapNode *single_next;\r\n  RD_VocabInfoMapNode *plural_next;\r\n  RD_VocabInfo v;\r\n};\r\n\r\ntypedef struct RD_VocabInfoMapSlot RD_VocabInfoMapSlot;\r\nstruct RD_VocabInfoMapSlot\r\n{\r\n  RD_VocabInfoMapNode *first;\r\n  RD_VocabInfoMapNode *last;\r\n};\r\n\r\ntypedef struct RD_VocabInfoMap RD_VocabInfoMap;\r\nstruct RD_VocabInfoMap\r\n{\r\n  U64 single_slots_count;\r\n  RD_VocabInfoMapSlot *single_slots;\r\n  U64 plural_slots_count;\r\n  RD_VocabInfoMapSlot *plural_slots;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Structured Locations, Parsed From Config Trees\r\n\r\ntypedef struct RD_Location RD_Location;\r\nstruct RD_Location\r\n{\r\n  String8 file_path;\r\n  TxtPt pt;\r\n  String8 expr;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Command Types\r\n\r\ntypedef struct RD_Cmd RD_Cmd;\r\nstruct RD_Cmd\r\n{\r\n  String8 name;\r\n  RD_Regs *regs;\r\n};\r\n\r\ntypedef struct RD_CmdNode RD_CmdNode;\r\nstruct RD_CmdNode\r\n{\r\n  RD_CmdNode *next;\r\n  RD_CmdNode *prev;\r\n  RD_Cmd cmd;\r\n};\r\n\r\ntypedef struct RD_CmdList RD_CmdList;\r\nstruct RD_CmdList\r\n{\r\n  RD_CmdNode *first;\r\n  RD_CmdNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Context Register Types\r\n\r\ntypedef struct RD_RegsNode RD_RegsNode;\r\nstruct RD_RegsNode\r\n{\r\n  RD_RegsNode *next;\r\n  RD_Regs v;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Structured Theme Types, Parsed From Config\r\n\r\ntypedef enum RD_FontSlot\r\n{\r\n  RD_FontSlot_Main,\r\n  RD_FontSlot_Code,\r\n  RD_FontSlot_Icons,\r\n  RD_FontSlot_COUNT\r\n}\r\nRD_FontSlot;\r\n\r\n////////////////////////////////\r\n//~ rjf: Per-Window State\r\n\r\ntypedef struct RD_DropCompletionTask RD_DropCompletionTask;\r\nstruct RD_DropCompletionTask\r\n{\r\n  RD_DropCompletionTask *next;\r\n  B32 exe;\r\n  B32 dbg;\r\n  B32 cfg;\r\n  String8List paths;\r\n};\r\n\r\ntypedef struct RD_WindowState RD_WindowState;\r\nstruct RD_WindowState\r\n{\r\n  // rjf: links & metadata\r\n  RD_WindowState *order_next;\r\n  RD_WindowState *order_prev;\r\n  RD_WindowState *hash_next;\r\n  RD_WindowState *hash_prev;\r\n  CFG_ID cfg_id;\r\n  U64 frames_alive;\r\n  U64 last_frame_index_touched;\r\n  \r\n  // rjf: top-level info & handles\r\n  Arena *arena;\r\n  OS_Handle os;\r\n  R_Handle r;\r\n  UI_State *ui;\r\n  F32 last_dpi;\r\n  B32 window_temporarily_focused_ipc;\r\n  B32 window_layout_reset;\r\n  Rng2F32 last_window_rect;\r\n  \r\n  // rjf: theme (recomputed each frame)\r\n  UI_Theme *theme;\r\n  Vec4F32 theme_code_colors[RD_CodeColorSlot_COUNT];\r\n  \r\n  // rjf: font raster flags (recomputed each frame)\r\n  FNT_RasterFlags font_slot_raster_flags[RD_FontSlot_COUNT];\r\n  \r\n  // rjf: dev interface state\r\n  B32 dev_menu_is_open;\r\n  \r\n  // rjf: menu bar state\r\n  B32 menu_bar_focused;\r\n  B32 menu_bar_focused_on_press;\r\n  B32 menu_bar_key_held;\r\n  B32 menu_bar_focus_press_started;\r\n  \r\n  // rjf: drop-completion state\r\n  Arena *drop_completion_arena;\r\n  CFG_ID drop_completion_panel;\r\n  RD_DropCompletionTask *top_drop_completion_task;\r\n  \r\n  // rjf: query state\r\n  B32 query_is_active;\r\n  Arena *query_arena;\r\n  RD_Regs *query_regs;\r\n  CFG_ID query_view_id;\r\n  CFG_ID query_last_view_id;\r\n  \r\n  // rjf: hover eval state\r\n  B32 hover_eval_focused;\r\n  Arena *hover_eval_arena;\r\n  Vec2F32 hover_eval_spawn_pos;\r\n  String8 hover_eval_string;\r\n  U64 hover_eval_firstt_us;\r\n  U64 hover_eval_lastt_us;\r\n  \r\n  // rjf: autocompletion state\r\n  U64 autocomp_last_frame_index;\r\n  Arena *autocomp_arena;\r\n  RD_Regs *autocomp_regs;\r\n  RD_AutocompCursorInfo autocomp_cursor_info;\r\n  \r\n  // rjf: error state\r\n  U8 error_buffer[512];\r\n  U64 error_string_size;\r\n  F32 error_t;\r\n  \r\n  // rjf: per-frame ui events state\r\n  UI_EventList ui_events;\r\n  \r\n  // rjf: per-frame drawing state\r\n  DR_Bucket *draw_bucket;\r\n};\r\n\r\ntypedef struct RD_WindowStateSlot RD_WindowStateSlot;\r\nstruct RD_WindowStateSlot\r\n{\r\n  RD_WindowState *first;\r\n  RD_WindowState *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Per-Process Graphical State\r\n\r\ntypedef struct RD_LoadedDbgInfoNode RD_LoadedDbgInfoNode;\r\nstruct RD_LoadedDbgInfoNode\r\n{\r\n  RD_LoadedDbgInfoNode *hash_next;\r\n  RD_LoadedDbgInfoNode *hash_prev;\r\n  RD_LoadedDbgInfoNode *lru_next;\r\n  RD_LoadedDbgInfoNode *lru_prev;\r\n  DI_Key key;\r\n  U64 last_tick_idx_touched;\r\n};\r\n\r\ntypedef struct RD_LoadedDbgInfoSlot RD_LoadedDbgInfoSlot;\r\nstruct RD_LoadedDbgInfoSlot\r\n{\r\n  RD_LoadedDbgInfoNode *first;\r\n  RD_LoadedDbgInfoNode *last;\r\n};\r\n\r\ntypedef struct RD_AmbiguousPathNode RD_AmbiguousPathNode;\r\nstruct RD_AmbiguousPathNode\r\n{\r\n  RD_AmbiguousPathNode *next;\r\n  String8 name;\r\n  String8List paths;\r\n};\r\n\r\ntypedef struct RD_State RD_State;\r\nstruct RD_State\r\n{\r\n  // rjf: basics\r\n  Arena *arena;\r\n  B32 quit;\r\n  B32 quit_after_success;\r\n  S32 frame_depth;\r\n  U64 frame_eval_memread_endt_us;\r\n  \r\n  // rjf: config bucket paths\r\n  Arena *user_path_arena;\r\n  String8 user_path;\r\n  Arena *project_path_arena;\r\n  String8 project_path;\r\n  Arena *theme_path_arena;\r\n  String8 theme_path;\r\n  \r\n  // rjf: unpacked settings (cached, because they need to be used\r\n  // earlier than setting evaluation is legal in a frame)\r\n  B32 alt_menu_bar_enabled;\r\n  B32 use_default_stl_type_views;\r\n  B32 use_default_ue_type_views;\r\n  \r\n  // rjf: animation rates\r\n  F32 catchall_animation_rate;\r\n  F32 menu_animation_rate;\r\n  F32 menu_animation_rate__slow;\r\n  F32 entity_alive_animation_rate;\r\n  F32 rich_hover_animation_rate;\r\n  F32 scrolling_animation_rate;\r\n  F32 tooltip_animation_rate;\r\n  \r\n  // rjf: serialized config debug string keys\r\n  C_Key user_cfg_string_key;\r\n  C_Key project_cfg_string_key;\r\n  C_Key cmdln_cfg_string_key;\r\n  C_Key transient_cfg_string_key;\r\n  \r\n  // rjf: default theme table\r\n  MD_Node *theme_preset_trees[RD_ThemePreset_COUNT];\r\n  \r\n  // rjf: vocab table\r\n  RD_VocabInfoMap vocab_info_map;\r\n  \r\n  // rjf: log\r\n  Log *log;\r\n  String8 log_path;\r\n  \r\n  // rjf: frame history info\r\n  U64 frame_index;\r\n  Arena *frame_arenas[2];\r\n  U64 frame_time_us_history[64];\r\n  U64 num_frames_requested;\r\n  F64 time_in_seconds;\r\n  U64 time_in_us;\r\n  \r\n  // rjf: frame parameters\r\n  F32 frame_dt;\r\n  Access *frame_access;\r\n  \r\n  // rjf: evaluation cache\r\n  E_Cache *eval_cache;\r\n  \r\n  // rjf: ambiguous path table (constructed from-scratch each frame)\r\n  U64 ambiguous_path_slots_count;\r\n  RD_AmbiguousPathNode **ambiguous_path_slots;\r\n  \r\n  // rjf: key map (constructed from-scratch each frame)\r\n  CFG_KeyMap *key_map;\r\n  \r\n  // rjf: slot -> font tag map (constructed from-scratch each frame)\r\n  FNT_Tag font_slot_table[RD_FontSlot_COUNT];\r\n  \r\n  // rjf: meta name -> eval type key map (constructed from-scratch each frame)\r\n  E_String2TypeKeyMap *meta_name2type_map;\r\n  \r\n  // rjf: name -> view ui map (constructed from-scratch each frame)\r\n  RD_ViewUIRuleMap *view_ui_rule_map;\r\n  \r\n  // rjf: registers stack\r\n  RD_RegsNode base_regs;\r\n  RD_RegsNode *top_regs;\r\n  \r\n  // rjf: autosave state\r\n  F32 seconds_until_autosave;\r\n  \r\n  // rjf: commands\r\n  Arena *cmds_arenas[2];\r\n  RD_CmdList cmds[2];\r\n  U64 cmds_gen;\r\n  Arena *cmd_output_arena;\r\n  String8List cmd_outputs;\r\n  \r\n  // rjf: popup state\r\n  UI_Key popup_key;\r\n  B32 popup_active;\r\n  F32 popup_t;\r\n  Arena *popup_arena;\r\n  RD_CmdList popup_cmds;\r\n  String8 popup_title;\r\n  String8 popup_desc;\r\n  \r\n  // rjf: text editing mode state\r\n  B32 text_edit_mode;\r\n  \r\n  // rjf: contextual hover info\r\n  RD_Regs *hover_regs;\r\n  RD_RegSlot hover_regs_slot;\r\n  RD_Regs *next_hover_regs;\r\n  RD_RegSlot next_hover_regs_slot;\r\n  \r\n  // rjf: icon texture\r\n  R_Handle icon_texture;\r\n  \r\n  // rjf: fixed ui keys\r\n  UI_Key drop_completion_key;\r\n  UI_Key ctx_menu_key;\r\n  \r\n  // rjf: drag/drop state\r\n  Arena *drag_drop_arena;\r\n  RD_Regs *drag_drop_regs;\r\n  RD_RegSlot drag_drop_regs_slot;\r\n  RD_DragDropState drag_drop_state;\r\n  \r\n  // rjf: cfg state\r\n  CFG_State *cfg;\r\n  CFG_SchemaTable *cfg_schema_table;\r\n  \r\n  // rjf: loaded debug info cache\r\n  U64 loaded_dbg_info_slots_count;\r\n  RD_LoadedDbgInfoSlot *loaded_dbg_info_slots;\r\n  RD_LoadedDbgInfoNode *loaded_dbg_info_lru_first;\r\n  RD_LoadedDbgInfoNode *loaded_dbg_info_lru_last;\r\n  RD_LoadedDbgInfoNode *free_loaded_dbg_info_node;\r\n  \r\n  // rjf: window state cache\r\n  U64 window_state_slots_count;\r\n  RD_WindowStateSlot *window_state_slots;\r\n  RD_WindowState *free_window_state;\r\n  CFG_ID last_focused_window;\r\n  RD_WindowState *first_window_state;\r\n  RD_WindowState *last_window_state;\r\n  CFG_ID window_state_last_accessed_id;\r\n  RD_WindowState *window_state_last_accessed;\r\n  \r\n  // rjf: view state cache\r\n  U64 view_state_slots_count;\r\n  RD_ViewStateSlot *view_state_slots;\r\n  RD_ViewState *free_view_state;\r\n  CFG_ID view_state_last_accessed_id;\r\n  RD_ViewState *view_state_last_accessed;\r\n  \r\n  // rjf: bind change\r\n  Arena *bind_change_arena;\r\n  B32 bind_change_active;\r\n  CFG_ID bind_change_binding_id;\r\n  String8 bind_change_cmd_name;\r\n  \r\n  // rjf: pre-stop focused window\r\n  OS_Handle prestop_focused_window;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nread_only global RD_VocabInfo rd_nil_vocab_info = {0};\r\n\r\nread_only global RD_CmdKindInfo rd_nil_cmd_kind_info = {0};\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(null);\r\nread_only global RD_ViewUIRule rd_nil_view_ui_rule =\r\n{\r\n  {0},\r\n  RD_VIEW_UI_FUNCTION_NAME(null),\r\n};\r\n\r\nread_only global RD_ViewState rd_nil_view_state =\r\n{\r\n  &rd_nil_view_state,\r\n  &rd_nil_view_state,\r\n};\r\n\r\nread_only global RD_WindowState rd_nil_window_state =\r\n{\r\n  &rd_nil_window_state,\r\n  &rd_nil_window_state,\r\n  &rd_nil_window_state,\r\n  &rd_nil_window_state,\r\n};\r\n\r\nglobal RD_State *rd_state = 0;\r\nglobal CFG_ID rd_last_drag_drop_panel = 0;\r\nglobal CFG_ID rd_last_drag_drop_prev_tab = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Registers Type Functions\r\n\r\ninternal void rd_regs_copy_contents(Arena *arena, RD_Regs *dst, RD_Regs *src);\r\ninternal RD_Regs *rd_regs_copy(Arena *arena, RD_Regs *src);\r\n\r\n////////////////////////////////\r\n//~ rjf: Commands Type Functions\r\n\r\ninternal void rd_cmd_list_push_new(Arena *arena, RD_CmdList *cmds, String8 name, RD_Regs *regs);\r\n\r\n////////////////////////////////\r\n//~ rjf: View UI Rule Functions\r\n\r\ninternal RD_ViewUIRuleMap *rd_view_ui_rule_map_make(Arena *arena, U64 slots_count);\r\ninternal void rd_view_ui_rule_map_insert(Arena *arena, RD_ViewUIRuleMap *map, String8 string, RD_ViewUIFunctionType *ui);\r\n\r\ninternal RD_ViewUIRule *rd_view_ui_rule_from_string(String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Global Cross-Window UI Interaction State Functions\r\n\r\ninternal B32 rd_drag_is_active(void);\r\ninternal void rd_drag_begin(RD_RegSlot slot);\r\ninternal B32 rd_drag_drop(void);\r\ninternal void rd_drag_kill(void);\r\n\r\ninternal void rd_set_hover_regs(RD_RegSlot slot);\r\ninternal RD_Regs *rd_get_hover_regs(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Config Functions\r\n\r\ninternal B32 rd_cfg_is_project_filtered(CFG_Node *cfg);\r\n\r\ninternal Vec4F32 rd_hsva_from_cfg(CFG_Node *cfg);\r\ninternal Vec4F32 rd_color_from_cfg(CFG_Node *cfg);\r\n\r\ninternal B32 rd_disabled_from_cfg(CFG_Node *cfg);\r\ninternal RD_Location rd_location_from_cfg(CFG_Node *cfg);\r\ninternal String8 rd_label_from_cfg(CFG_Node *cfg);\r\ninternal String8 rd_expr_from_cfg(CFG_Node *cfg);\r\ninternal String8 rd_path_from_cfg(CFG_Node *cfg);\r\ninternal D_Target rd_target_from_cfg(Arena *arena, CFG_Node *cfg);\r\n\r\ninternal String8 rd_default_setting_from_names(String8 schema_name, String8 setting_name);\r\n\r\ninternal String8 rd_setting_from_name(String8 name);\r\ninternal B32 rd_setting_b32_from_name(String8 name);\r\ninternal U64 rd_setting_u64_from_name(String8 name);\r\ninternal F32 rd_setting_f32_from_name(String8 name);\r\n\r\ninternal CFG_Node *rd_immediate_cfg_from_key(String8 string);\r\ninternal CFG_Node *rd_immediate_cfg_from_keyf(char *fmt, ...);\r\n\r\ninternal String8 rd_mapped_from_file_path(Arena *arena, String8 file_path);\r\ninternal String8List rd_possible_overrides_from_file_path(Arena *arena, String8 file_path);\r\n\r\n////////////////////////////////\r\n//~ rjf: Control Entity Info Extraction\r\n\r\ninternal Vec4F32 rd_color_from_ctrl_entity(CTRL_Entity *entity);\r\ninternal String8 rd_name_from_ctrl_entity(Arena *arena, CTRL_Entity *entity);\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Spaces\r\n\r\n//- rjf: cfg <-> eval space\r\ninternal CFG_Node *rd_cfg_from_eval_space(E_Space space);\r\ninternal E_Space rd_eval_space_from_cfg(CFG_Node *cfg);\r\n\r\n//- rjf: ctrl entity <-> eval space\r\ninternal CTRL_Entity *rd_ctrl_entity_from_eval_space(E_Space space);\r\ninternal E_Space rd_eval_space_from_ctrl_entity(CTRL_Entity *entity, E_SpaceKind kind);\r\n\r\n//- rjf: command name <-> eval space\r\ninternal String8 rd_cmd_name_from_eval(E_Eval eval);\r\n\r\n//- rjf: eval space reads/writes\r\ninternal U64 rd_eval_space_gen(E_Space space);\r\ninternal B32 rd_eval_space_read(E_Space space, void *out, Rng1U64 range);\r\ninternal B32 rd_eval_space_write(E_Space space, void *in, Rng1U64 range);\r\n\r\n//- rjf: asynchronous streamed reads -> hashes from spaces\r\ninternal C_Key rd_key_from_eval_space_range(E_Space space, Rng1U64 range, B32 zero_terminated);\r\n\r\n//- rjf: space -> entire range\r\ninternal Rng1U64 rd_whole_range_from_eval_space(E_Space space);\r\n\r\n////////////////////////////////\r\n//~ rjf: Evaluation Visualization\r\n\r\n//- rjf: writing values back to child processes\r\ninternal B32 rd_commit_eval_value_string(E_Eval dst_eval, String8 string);\r\n\r\n//- rjf: eval <-> file path\r\ninternal String8 rd_file_path_from_eval(Arena *arena, E_Eval eval);\r\ninternal String8 rd_file_path_from_eval_string(Arena *arena, String8 string);\r\ninternal String8 rd_eval_string_from_file_path(Arena *arena, String8 string);\r\n\r\n//- rjf: eval -> query\r\ninternal String8 rd_query_from_eval_string(Arena *arena, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: View Functions\r\n\r\ninternal CFG_Node *rd_view_from_eval(CFG_Node *parent, E_Eval eval);\r\ninternal RD_ViewState *rd_view_state_from_cfg(CFG_Node *cfg);\r\ninternal void rd_view_ui(Rng2F32 rect);\r\n\r\n////////////////////////////////\r\n//~ rjf: View Building API\r\n\r\n//- rjf: view info extraction\r\ninternal Arena *rd_view_arena(void);\r\ninternal UI_ScrollPt2 rd_view_scroll_pos(void);\r\ninternal EV_View *rd_view_eval_view(void);\r\ninternal String8 rd_view_query_cmd(void);\r\ninternal String8 rd_view_query_input(void);\r\ninternal String8 rd_view_setting_from_name(String8 string);\r\ninternal E_Value rd_view_setting_value_from_name(String8 string);\r\ninternal B32 rd_view_setting_b32_from_name(String8 string);\r\ninternal U64 rd_view_setting_u64_from_name(String8 string);\r\ninternal F32 rd_view_setting_f32_from_name(String8 string);\r\n\r\n//- rjf: evaluation & tag (a view's 'call') parameter extraction\r\ninternal Rng1U64 rd_space_range_from_eval(E_Eval eval);\r\ninternal TXT_LangKind rd_lang_kind_from_eval(E_Eval eval);\r\ninternal Arch rd_arch_from_eval(E_Eval eval);\r\n\r\n//- rjf: pushing/attaching view resources\r\ninternal void *rd_view_state_by_size(U64 size);\r\n#define rd_view_state(T) (T *)rd_view_state_by_size(sizeof(T))\r\ninternal Arena *rd_push_view_arena(void);\r\n\r\n//- rjf: storing view-attached state\r\ninternal void rd_store_view_expr_string(String8 string);\r\ninternal void rd_store_view_loading_info(B32 is_loading, U64 progress_u64, U64 progress_u64_target);\r\ninternal void rd_store_view_scroll_pos(UI_ScrollPt2 pos);\r\ninternal void rd_store_view_param(String8 key, String8 value);\r\ninternal void rd_store_view_paramf(String8 key, char *fmt, ...);\r\n#define rd_store_view_param_f32(key, f32) rd_store_view_paramf((key), \"%ff\", (f32))\r\n#define rd_store_view_param_s64(key, s64) rd_store_view_paramf((key), \"%I64d\", (s64))\r\n#define rd_store_view_param_u64(key, u64) rd_store_view_paramf((key), \"0x%I64x\", (u64))\r\n\r\n////////////////////////////////\r\n//~ rjf: Window Functions\r\n\r\ninternal String8 rd_push_window_title(Arena *arena);\r\ninternal CFG_Node *rd_window_from_cfg(CFG_Node *cfg);\r\ninternal RD_WindowState *rd_window_state_from_cfg(CFG_Node *cfg);\r\ninternal RD_WindowState *rd_window_state_from_os_handle(OS_Handle os);\r\ninternal void rd_window_frame(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Eval Visualization\r\n\r\ninternal String8 rd_value_string_from_eval(Arena *arena, String8 filter, EV_StringParams *params, FNT_Tag font, F32 font_size, F32 max_size, E_Eval eval);\r\n\r\n////////////////////////////////\r\n//~ rjf: Hover Eval\r\n\r\ninternal void rd_set_hover_eval(Vec2F32 pos, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Autocompletion Lister\r\n\r\ninternal void rd_set_autocomp_regs_(E_Eval dst_eval, RD_Regs *regs);\r\n#define rd_set_autocomp_regs(dst_eval, ...) rd_set_autocomp_regs_((dst_eval), &(RD_Regs){rd_regs_lit_init_top __VA_ARGS__})\r\n\r\n////////////////////////////////\r\n//~ rjf: Colors, Fonts, Config\r\n\r\n//- rjf: colors\r\ninternal MD_Node *rd_theme_tree_from_name(Arena *arena, Access *access, String8 theme_name);\r\ninternal Vec4F32 rd_rgba_from_code_color_slot(RD_CodeColorSlot slot);\r\ninternal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind(TXT_TokenKind kind);\r\ninternal RD_CodeColorSlot rd_code_color_slot_from_txt_token_kind_lookup_string(TXT_TokenKind kind, String8 string);\r\n\r\n//- rjf: fonts\r\ninternal F32 rd_font_size(void);\r\ninternal FNT_Tag rd_font_from_slot(RD_FontSlot slot);\r\ninternal FNT_RasterFlags rd_raster_flags_from_slot(RD_FontSlot slot);\r\n\r\n////////////////////////////////\r\n//~ rjf: Process Control Info Stringification\r\n\r\ninternal String8 rd_string_from_exception_code(U32 code);\r\ninternal DR_FStrList rd_stop_explanation_fstrs_from_ctrl_event(Arena *arena, CTRL_Event *event);\r\n\r\n////////////////////////////////\r\n//~ rjf: Vocab Info Lookups\r\n\r\ninternal RD_VocabInfo *rd_vocab_info_from_code_name(String8 code_name);\r\ninternal RD_VocabInfo *rd_vocab_info_from_code_name_plural(String8 code_name_plural);\r\n#define rd_plural_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->code_name_plural)\r\n#define rd_display_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->display_name)\r\n#define rd_display_plural_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->display_name_plural)\r\n#define rd_icon_kind_from_code_name(code_name) (rd_vocab_info_from_code_name(code_name)->icon_kind)\r\n#define rd_singular_from_code_name_plural(code_name_plural) (rd_vocab_info_from_code_name_plural(code_name_plural)->code_name)\r\n\r\n////////////////////////////////\r\n//~ rjf: Continuous Frame Requests\r\n\r\ninternal void rd_request_frame(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Accessors\r\n\r\n//- rjf: per-frame arena\r\ninternal Arena *rd_frame_arena(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Registers\r\n\r\n#define rd_regs() (&rd_state->top_regs->v)\r\n#define rd_base_regs() (&rd_state->base_regs.v)\r\ninternal RD_Regs *rd_push_regs_(RD_Regs *regs);\r\n#define rd_push_regs(...) rd_push_regs_(&(RD_Regs){rd_regs_lit_init_top __VA_ARGS__})\r\ninternal RD_Regs *rd_pop_regs(void);\r\n#define RD_RegsScope(...) DeferLoop(rd_push_regs(__VA_ARGS__), rd_pop_regs())\r\ninternal void rd_regs_fill_slot_from_string(RD_RegSlot slot, String8 query_expr, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Commands\r\n\r\n//- rjf: name -> info\r\ninternal RD_CmdKind rd_cmd_kind_from_string(String8 string);\r\ninternal RD_CmdKindInfo *rd_cmd_kind_info_from_string(String8 string);\r\n\r\n//- rjf: pushing\r\ninternal void rd_push_cmd(String8 name, RD_Regs *regs);\r\n#define rd_cmd(kind, ...) rd_push_cmd(rd_cmd_kind_info_table[kind].string, &(RD_Regs){rd_regs_lit_init_top __VA_ARGS__})\r\n\r\n//- rjf: iterating\r\ninternal B32 rd_next_cmd(RD_Cmd **cmd);\r\ninternal B32 rd_next_view_cmd(RD_Cmd **cmd);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Layer Top-Level Calls\r\n\r\ninternal void rd_init(CmdLine *cmdln);\r\ninternal void rd_frame(void);\r\n\r\n#endif // RADDBG_CORE_H\r\n"
  },
  {
    "path": "src/raddbg/raddbg_eval.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: `commands` Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(commands)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_MemberAccess)\n  {\n    String8 cmd_name = expr->first->next->string;\n    RD_CmdKindInfo *cmd_info = rd_cmd_kind_info_from_string(cmd_name);\n    E_TypeKey cmd_type = e_type_key_cons(.kind = E_TypeKind_U64, .name = str8_lit(\"command\"));\n    cmd_type = e_type_key_cons_meta_description(cmd_type, cmd_info->description);\n    result.type_key = cmd_type;\n    result.mode = E_Mode_Value;\n    result.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaCmd), e_irtree_const_u(arena, e_id_from_string(cmd_name)));\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(commands)\n{\n  E_TypeExpandInfo result = {0};\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    String8List cmd_names = {0};\n    E_Type *type = e_type_from_key(eval.irtree.type_key);\n    for EachNonZeroEnumVal(RD_CmdKind, k)\n    {\n      RD_CmdKindInfo *info = &rd_cmd_kind_info_table[k];\n      if(info->flags & RD_CmdKindFlag_ListInUI &&\n         (!str8_match(type->name, str8_lit(\"text_pt_commands\"), 0) || info->flags & RD_CmdKindFlag_ListInTextPt) &&\n         (!str8_match(type->name, str8_lit(\"text_range_commands\"), 0) || info->flags & RD_CmdKindFlag_ListInTextRng) &&\n         (!str8_match(type->name, str8_lit(\"tab_commands\"), 0) || info->flags & RD_CmdKindFlag_ListInTab))\n      {\n        String8 code_name = info->string;\n        String8 description = info->description;\n        String8 search_tags = info->search_tags;\n        String8 display_name = rd_display_from_code_name(code_name);\n        FuzzyMatchRangeList desc_matches = fuzzy_match_find(scratch.arena, filter, description);\n        FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, display_name);\n        FuzzyMatchRangeList tags_matches = fuzzy_match_find(scratch.arena, filter, search_tags);\n        B32 binding_matches_good = 0;\n        CFG_KeyMapNodePtrList bindings = cfg_key_map_node_ptr_list_from_name(scratch.arena, rd_state->key_map, code_name);\n        for(CFG_KeyMapNodePtr *n = bindings.first; n != 0; n = n->next)\n        {\n          String8 binding_text = os_string_from_modifiers_key(scratch.arena, n->v->binding.modifiers, n->v->binding.key);\n          FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, binding_text);\n          if(matches.count == matches.needle_part_count)\n          {\n            binding_matches_good = 1;\n            break;\n          }\n        }\n        if(name_matches.count == name_matches.needle_part_count ||\n           desc_matches.count == desc_matches.needle_part_count ||\n           tags_matches.count == tags_matches.needle_part_count ||\n           binding_matches_good)\n        {\n          str8_list_push(scratch.arena, &cmd_names, code_name);\n        }\n      }\n    }\n    String8Array *accel = push_array(arena, String8Array, 1);\n    *accel = str8_array_from_list(arena, &cmd_names);\n    result.user_data = accel;\n    result.expr_count = accel->count;\n    scratch_end(scratch);\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(commands)\n{\n  U64 out_idx = 0;\n  String8Array *accel = (String8Array *)user_data;\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\n  {\n    String8 cmd_name = accel->v[idx];\n    E_Eval cmd_eval = e_eval_from_stringf(\"query:commands.%S\", cmd_name);\n    evals_out[out_idx] = cmd_eval;\n  }\n}\n\n////////////////////////////////\n//~ rjf: `themes` Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(themes)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_ArrayIndex &&\n     expr->first->next->kind == E_ExprKind_LeafStringLiteral)\n  {\n    String8 theme_name = expr->first->next->string;\n    E_TypeKey theme_type = e_type_key_cons(.kind = E_TypeKind_U64, .name = str8_lit(\"theme\"));\n    result.type_key = theme_type;\n    result.mode = E_Mode_Value;\n    result.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaTheme), e_irtree_const_u(arena, e_id_from_string(theme_name)));\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(themes)\n{\n  E_TypeExpandInfo result = {0};\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    //- rjf: gather presets\n    String8List names = {0};\n    for EachEnumVal(RD_ThemePreset, p)\n    {\n      String8 name = rd_theme_preset_display_string_table[p];\n      FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, name);\n      if(name_matches.count == name_matches.needle_part_count)\n      {\n        str8_list_push(scratch.arena, &names, name);\n      }\n    }\n    \n    //- rjf: gather theme files\n    {\n      String8 theme_folder = push_str8f(scratch.arena, \"%S/raddbg/themes\", os_get_process_info()->user_program_data_path);\n      OS_FileIter *it = os_file_iter_begin(scratch.arena, theme_folder, OS_FileIterFlag_SkipFolders);\n      for(OS_FileInfo info = {0}; os_file_iter_next(scratch.arena, it, &info);)\n      {\n        String8 name = info.name;\n        FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, name);\n        if(name_matches.count == name_matches.needle_part_count)\n        {\n          str8_list_push(scratch.arena, &names, push_str8_copy(arena, name));\n        }\n      }\n      os_file_iter_end(it);\n    }\n    \n    //- rjf: flatten & build accelerator\n    String8Array *accel = push_array(arena, String8Array, 1);\n    *accel = str8_array_from_list(arena, &names);\n    result.user_data = accel;\n    result.expr_count = accel->count;\n    scratch_end(scratch);\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(themes)\n{\n  U64 out_idx = 0;\n  String8Array *accel = (String8Array *)user_data;\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\n  {\n    String8 name = accel->v[idx];\n    evals_out[out_idx] = e_eval_wrapf(eval, \"$[\\\"%S\\\"]\", name);\n  }\n}\n\n////////////////////////////////\n//~ rjf: `locals` Type Hooks\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(locals)\n{\n  E_TypeExpandInfo result = {0};\n  Temp scratch = scratch_begin(&arena, 1);\n  {\n    E_String2NumMapNodeArray nodes = e_string2num_map_node_array_from_map(scratch.arena, e_ir_ctx->locals_map);\n    e_string2num_map_node_array_sort__in_place(&nodes);\n    String8List exprs_filtered = {0};\n    for EachIndex(idx, nodes.count)\n    {\n      String8 local_expr_string = nodes.v[idx]->string;\n      FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, local_expr_string);\n      if(matches.count == matches.needle_part_count)\n      {\n        str8_list_push(scratch.arena, &exprs_filtered, local_expr_string);\n      }\n    }\n    String8Array *accel = push_array(arena, String8Array, 1);\n    *accel = str8_array_from_list(arena, &exprs_filtered);\n    result.user_data = accel;\n    result.expr_count = accel->count;\n  }\n  scratch_end(scratch);\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals)\n{\n  String8Array *accel = (String8Array *)user_data;\n  Rng1U64 legal_idx_range = r1u64(0, accel->count);\n  Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);\n  U64 read_range_count = dim_1u64(read_range);\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\n  {\n    String8 expr_string = accel->v[read_range.min + idx];\n    evals_out[idx] = e_eval_from_string(expr_string);\n  }\n}\n\n////////////////////////////////\n//~ rjf: `registers` Type Hooks\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(registers)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\n  Arch arch = thread->arch;\n  U64 reg_count     = regs_reg_code_count_from_arch(arch);\n  String8 *reg_strings   = regs_reg_code_string_table_from_arch(arch);\n  String8List exprs_list = {0};\n  for(U64 idx = 1; idx < reg_count; idx += 1)\n  {\n    FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, reg_strings[idx]);\n    if(matches.count == matches.needle_part_count)\n    {\n      str8_list_push(scratch.arena, &exprs_list, reg_strings[idx]);\n    }\n  }\n  String8Array *accel = push_array(arena, String8Array, 1);\n  *accel = str8_array_from_list(arena, &exprs_list);\n  E_TypeExpandInfo info = {accel, accel->count};\n  scratch_end(scratch);\n  return info;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers)\n{\n  String8Array *accel = (String8Array *)user_data;\n  Rng1U64 legal_idx_range = r1u64(0, accel->count);\n  Rng1U64 read_range = intersect_1u64(legal_idx_range, idx_range);\n  U64 read_range_count = dim_1u64(read_range);\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\n  {\n    String8 register_name = accel->v[read_range.min + idx];\n    String8 register_expr = push_str8f(arena, \"reg:%S\", register_name);\n    evals_out[idx] = e_eval_from_string(register_expr);\n  }\n}\n\n////////////////////////////////\n//~ rjf: Schema Type Hooks\n\ntypedef struct RD_SchemaIRExt RD_SchemaIRExt;\nstruct RD_SchemaIRExt\n{\n  CFG_Node *cfg;\n  CTRL_Entity *entity;\n  MD_NodePtrList schemas;\n};\n\nE_TYPE_IREXT_FUNCTION_DEF(schema)\n{\n  RD_SchemaIRExt *ext = push_array(arena, RD_SchemaIRExt, 1);\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root);\n    String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\n    E_Interpretation interpret = e_interpret(bytecode);\n    E_TypeKey type_key = irtree->type_key;\n    E_Type *type = e_type_from_key(type_key);\n    ext->cfg = rd_cfg_from_eval_space(interpret.space);\n    ext->entity = rd_ctrl_entity_from_eval_space(interpret.space);\n    ext->schemas = cfg_schemas_from_name(arena, rd_state->cfg_schema_table, type->name);\n    scratch_end(scratch);\n  }\n  E_IRExt result = {ext};\n  return result;\n}\n\nE_TYPE_ACCESS_FUNCTION_DEF(schema)\n{\n  RD_SchemaIRExt *ext = (RD_SchemaIRExt *)lhs_irtree->user_data;\n  E_IRTreeAndType irtree = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_MemberAccess)\n  {\n    MD_Node *child_schema = &md_nil_node;\n    for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next)\n    {\n      for MD_EachNode(child, n->v->first)\n      {\n        if(str8_match(child->string, expr->first->next->string, 0))\n        {\n          child_schema = child;\n          break;\n        }\n      }\n    }\n    if(child_schema != &md_nil_node)\n    {\n      CFG_Node *cfg = ext->cfg;\n      CTRL_Entity *entity = ext->entity;\n      CFG_Node *child = cfg_node_child_from_string(cfg, child_schema->string);\n      E_TypeKey child_type_key = zero_struct;\n      B32 wrap_child_w_meta_expr = 0;\n      B32 is_query_child = md_node_has_tag(child_schema, str8_lit(\"query\"), 0);\n      E_TypeFlags type_flags = (!!is_query_child * E_TypeFlag_IsNotEditable);\n      if(0){}\n      \n      //- rjf: ctrl entity members\n      else if(entity != &ctrl_entity_nil && str8_match(child_schema->string, str8_lit(\"label\"), 0))\n      {\n        child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), entity->string.size, type_flags|E_TypeFlag_IsCodeText);\n      }\n      else if(entity != &ctrl_entity_nil && str8_match(child_schema->string, str8_lit(\"exe\"), 0))\n      {\n        child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), entity->string.size, type_flags|E_TypeFlag_IsPathText);\n      }\n      else if(entity != &ctrl_entity_nil && str8_match(child_schema->string, str8_lit(\"dbg\"), 0))\n      {\n        CTRL_Entity *dbg = ctrl_entity_child_from_kind(entity, CTRL_EntityKind_DebugInfoPath);\n        child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), dbg->string.size, type_flags|E_TypeFlag_IsPathText);\n      }\n      \n      //- rjf: cfg members\n      else if(str8_match(child_schema->first->string, str8_lit(\"code_string\"), 0) ||\n              str8_match(child_schema->first->string, str8_lit(\"expr_string\"), 0))\n      {\n        child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), child->first->string.size, type_flags|E_TypeFlag_IsCodeText);\n      }\n      else if(str8_match(child_schema->first->string, str8_lit(\"path\"), 0) ||\n              str8_match(child_schema->first->string, str8_lit(\"path_pt\"), 0))\n      {\n        child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), child->first->string.size, type_flags|E_TypeFlag_IsPathText);\n      }\n      \n      else if(str8_match(child_schema->first->string, str8_lit(\"string\"), 0))\n      {\n        child_type_key = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), child->first->string.size, type_flags|E_TypeFlag_IsPlainText);\n      }\n      \n      //- rjf: catchall cases\n      else if(str8_match(child_schema->first->string, str8_lit(\"u64\"), 0))\n      {\n        child_type_key = e_type_key_basic(E_TypeKind_U64);\n        wrap_child_w_meta_expr = 1;\n      }\n      else if(str8_match(child_schema->first->string, str8_lit(\"u32\"), 0))\n      {\n        child_type_key = e_type_key_basic(E_TypeKind_U32);\n        wrap_child_w_meta_expr = 1;\n      }\n      else if(str8_match(child_schema->first->string, str8_lit(\"f32\"), 0))\n      {\n        child_type_key = e_type_key_basic(E_TypeKind_F32);\n        wrap_child_w_meta_expr = 1;\n      }\n      else if(str8_match(child_schema->first->string, str8_lit(\"bool\"), 0))\n      {\n        child_type_key = e_type_key_basic(E_TypeKind_Bool);\n        wrap_child_w_meta_expr = 1;\n      }\n      else if(str8_match(child_schema->first->string, str8_lit(\"vaddr_range\"), 0))\n      {\n        Temp scratch = scratch_begin(&arena, 1);\n        E_MemberList vaddr_range_members_list = {0};\n        e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit(\"min\"), .off = 0);\n        e_member_list_push_new(scratch.arena, &vaddr_range_members_list, .type_key = e_type_key_basic(E_TypeKind_U64), .name = str8_lit(\"max\"), .off = 8);\n        E_MemberArray vaddr_range_members = e_member_array_from_list(scratch.arena, &vaddr_range_members_list);\n        child_type_key = e_type_key_cons(.kind = E_TypeKind_Struct, .name = str8_lit(\"vaddr_range\"), .count = vaddr_range_members.count, .members = vaddr_range_members.v);\n        scratch_end(scratch);\n      }\n      else if(str8_match(child_schema->first->string, str8_lit(\"query\"), 0))\n      {\n        child_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, child_schema->string);\n      }\n      \n      //- rjf: extend child type with meta-expression information\n      if(wrap_child_w_meta_expr)\n      {\n        Temp scratch = scratch_begin(&arena, 1);\n        E_Expr *expr = e_parse_from_string(child->first->string).expr;\n        B32 expr_is_simple = 0;\n        if(expr->kind == E_ExprKind_LeafU64 ||\n           expr->kind == E_ExprKind_LeafF64 ||\n           expr->kind == E_ExprKind_LeafF32)\n        {\n          expr_is_simple = 1;\n        }\n        if((expr->kind == E_ExprKind_Pos || expr->kind == E_ExprKind_Neg) &&\n           expr->first == expr->last &&\n           (expr->first->kind == E_ExprKind_LeafU64 ||\n            expr->first->kind == E_ExprKind_LeafF64 ||\n            expr->first->kind == E_ExprKind_LeafF32))\n        {\n          expr_is_simple = 1;\n        }\n        if(expr->kind == E_ExprKind_LeafIdentifier &&\n           (str8_match(expr->string, str8_lit(\"true\"), 0) ||\n            str8_match(expr->string, str8_lit(\"false\"), 0)))\n        {\n          expr_is_simple = 1;\n        }\n        if(!expr_is_simple && expr != &e_expr_nil)\n        {\n          child_type_key = e_type_key_cons_meta_expr(child_type_key, child->first->string);\n        }\n        scratch_end(scratch);\n      }\n      \n      //- rjf: extend child type with decorative meta info\n      {\n        MD_Node *display_name = md_tag_from_string(child_schema, str8_lit(\"display_name\"), 0);\n        MD_Node *description = md_tag_from_string(child_schema, str8_lit(\"description\"), 0);\n        if(!md_node_is_nil(display_name))\n        {\n          child_type_key = e_type_key_cons_meta_display_name(child_type_key, display_name->first->string);\n        }\n        if(!md_node_is_nil(description))\n        {\n          child_type_key = e_type_key_cons_meta_description(child_type_key, description->first->string);\n        }\n      }\n      \n      //- rjf: extend child type with hex lens\n      {\n        MD_Node *hex = md_tag_from_string(child_schema->first, str8_lit(\"hex\"), 0);\n        if(!md_node_is_nil(hex))\n        {\n          child_type_key = e_type_key_cons(.kind = E_TypeKind_Lens,\n                                           .name = str8_lit(\"hex\"),\n                                           .direct_key = child_type_key);\n        }\n      }\n      \n      //- rjf: extend child type with color lens\n      {\n        MD_Node *color = md_tag_from_string(child_schema->first, str8_lit(\"color\"), 0);\n        if(!md_node_is_nil(color))\n        {\n          child_type_key = e_type_key_cons(.kind = E_TypeKind_Lens,\n                                           .name = str8_lit(\"color\"),\n                                           .direct_key = child_type_key);\n        }\n      }\n      \n      //- rjf: extend child type with ranges\n      {\n        MD_Node *range = md_tag_from_string(child_schema->first, str8_lit(\"range\"), 0);\n        if(!md_node_is_nil(range))\n        {\n          E_Expr *min_bound = e_parse_from_string(range->first->string).expr;\n          E_Expr *max_bound = e_parse_from_string(range->first->next->string).expr;\n          E_Expr *args[] =\n          {\n            min_bound,\n            max_bound,\n          };\n          child_type_key = e_type_key_cons(.kind = E_TypeKind_Lens,\n                                           .name = str8_lit(\"range1\"),\n                                           .direct_key = child_type_key,\n                                           .count = 2,\n                                           .args = args);\n        }\n      }\n      \n      //- rjf: evaluate\n      E_Space child_eval_space = zero_struct;\n      if(cfg != &cfg_nil_node)\n      {\n        child_eval_space = e_space_make(RD_EvalSpaceKind_MetaCfg);\n        child_eval_space.u64s[0] = cfg->id;\n        child_eval_space.u64s[1] = e_id_from_string(child_schema->string);\n      }\n      else\n      {\n        child_eval_space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity);\n        child_eval_space.u64s[2] = e_id_from_string(child_schema->string);\n      }\n      irtree.root     = e_irtree_set_space(arena, child_eval_space, e_push_irnode(arena, RDI_EvalOp_ConstU64));\n      irtree.type_key = child_type_key;\n      irtree.mode     = E_Mode_Offset;\n    }\n  }\n  return irtree;\n}\n\ntypedef struct RD_SchemaExpandAccel RD_SchemaExpandAccel;\nstruct RD_SchemaExpandAccel\n{\n  String8Array commands;\n  MD_Node **children;\n  U64 children_count;\n};\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(schema)\n{\n  E_TypeExpandInfo result = {0};\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    // rjf: unpack\n    RD_SchemaIRExt *ext = (RD_SchemaIRExt *)eval.irtree.user_data;\n    \n    // rjf: gather expansion commands\n    String8Array commands = {0};\n    {\n      String8List commands_list = {0};\n      for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next)\n      {\n        MD_Node *schema = n->v;\n        MD_Node *tag = md_tag_from_string(schema, str8_lit(\"expand_commands\"), 0);\n        for MD_EachNode(arg, tag->first)\n        {\n          B32 filtered = 0;\n          if(md_node_has_tag(arg, str8_lit(\"output\"), 0))\n          {\n            String8 expr = rd_expr_from_cfg(ext->cfg);\n            filtered = (!str8_match(expr, str8_lit(\"query:output\"), 0));\n          }\n          if(!filtered)\n          {\n            RD_CmdKindInfo *cmd_kind_info = rd_cmd_kind_info_from_string(arg->string);\n            FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, rd_display_from_code_name(cmd_kind_info->string));\n            FuzzyMatchRangeList desc_matches = fuzzy_match_find(scratch.arena, filter, cmd_kind_info->description);\n            FuzzyMatchRangeList tags_matches = fuzzy_match_find(scratch.arena, filter, cmd_kind_info->search_tags);\n            if(name_matches.count == name_matches.needle_part_count ||\n               desc_matches.count == desc_matches.needle_part_count ||\n               tags_matches.count == tags_matches.needle_part_count)\n            {\n              str8_list_push(scratch.arena, &commands_list, arg->string);\n            }\n          }\n        }\n      }\n      commands = str8_array_from_list(arena, &commands_list);\n    }\n    \n    // rjf: gather expansion children\n    typedef struct ExpandChildNode ExpandChildNode;\n    struct ExpandChildNode\n    {\n      ExpandChildNode *next;\n      MD_Node *n;\n    };\n    ExpandChildNode *first_child_node = 0;\n    ExpandChildNode *last_child_node = 0;\n    U64 child_count = 0;\n    for(MD_NodePtrNode *n = ext->schemas.first; n != 0; n = n->next)\n    {\n      MD_Node *schema = n->v;\n      for MD_EachNode(child, schema->first)\n      {\n        if(!md_node_has_tag(child, str8_lit(\"no_expand\"), 0))\n        {\n          MD_Node *expand_check = md_tag_from_string(child, str8_lit(\"expand_if\"), 0);\n          B32 expand_this_child = 1;\n          if(!md_node_is_nil(expand_check)) E_ParentKey(eval.key)\n          {\n            expand_this_child = !!e_value_from_string(expand_check->first->string).u64;\n          }\n          if(expand_this_child)\n          {\n            String8 display_name = md_tag_from_string(child, str8_lit(\"display_name\"), 0)->first->string;\n            if(display_name.size == 0)\n            {\n              display_name = rd_display_from_code_name(child->string);\n            }\n            String8 desc = md_tag_from_string(child, str8_lit(\"description\"), 0)->first->string;\n            FuzzyMatchRangeList name_matches         = fuzzy_match_find(scratch.arena, filter, child->string);\n            FuzzyMatchRangeList display_name_matches = fuzzy_match_find(scratch.arena, filter, display_name);\n            FuzzyMatchRangeList desc_matches         = fuzzy_match_find(scratch.arena, filter, desc);\n            if(name_matches.count == name_matches.needle_part_count ||\n               display_name_matches.count == display_name_matches.needle_part_count ||\n               desc_matches.count == desc_matches.needle_part_count)\n            {\n              ExpandChildNode *n = push_array(scratch.arena, ExpandChildNode, 1);\n              n->n = child;\n              SLLQueuePush(first_child_node, last_child_node, n);\n              child_count += 1;\n            }\n          }\n        }\n      }\n    }\n    \n    // rjf: flatten expansion member list\n    MD_Node **children = push_array(arena, MD_Node *, child_count);\n    {\n      U64 idx = 0;\n      for(ExpandChildNode *n = first_child_node; n != 0; n = n->next, idx += 1)\n      {\n        children[idx] = n->n;\n      }\n    }\n    \n    // rjf: build accelerator for lookups\n    RD_SchemaExpandAccel *accel = push_array(arena, RD_SchemaExpandAccel, 1);\n    accel->commands = commands;\n    accel->children = children;\n    accel->children_count = child_count;\n    \n    // rjf: fill result\n    result.user_data = accel;\n    result.expr_count = child_count + commands.count;\n    \n    scratch_end(scratch);\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema)\n{\n  RD_SchemaExpandAccel *accel = (RD_SchemaExpandAccel *)user_data;\n  Rng1U64 cmds_idx_range = r1u64(0, accel->commands.count);\n  Rng1U64 chld_idx_range = r1u64(cmds_idx_range.max, cmds_idx_range.max + accel->children_count);\n  U64 out_idx = 0;\n  \n  // rjf: read commands\n  {\n    Rng1U64 read_range = intersect_1u64(idx_range, cmds_idx_range);\n    for(U64 idx = read_range.min; idx < read_range.max; idx += 1, out_idx += 1)\n    {\n      evals_out[out_idx] = e_eval_from_stringf(\"query:commands.%S\", accel->commands.v[idx - cmds_idx_range.min]);\n    }\n  }\n  \n  // rjf: read children\n  {\n    Rng1U64 read_range = intersect_1u64(idx_range, chld_idx_range);\n    for(U64 idx = read_range.min; idx < read_range.max; idx += 1, out_idx += 1)\n    {\n      MD_Node *child_schema = accel->children[idx - chld_idx_range.min];\n      evals_out[out_idx] = e_eval_wrapf(eval, \"$.%S\", child_schema->string);\n    }\n  }\n}\n\n////////////////////////////////\n//~ rjf: Config Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(cfgs)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  E_Expr *rhs = expr->first->next;\n  if(rhs->kind == E_ExprKind_LeafIdentifier &&\n     str8_match(str8_prefix(rhs->string, 1), str8_lit(\"$\"), 0))\n  {\n    String8 numeric_part = str8_skip(rhs->string, 1);\n    CFG_ID id = u64_from_str8(numeric_part, 16);\n    CFG_Node *cfg = cfg_node_from_id(id);\n    E_Space space = rd_eval_space_from_cfg(cfg);\n    result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0));\n    result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, cfg->string);\n    result.mode = E_Mode_Offset;\n  }\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: Control Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(control)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  E_Expr *rhs = expr->first->next;\n  if(rhs->kind == E_ExprKind_LeafIdentifier &&\n     str8_match(str8_prefix(rhs->string, 1), str8_lit(\"$\"), 0))\n  {\n    CTRL_Handle handle = ctrl_handle_from_string(rhs->string);\n    CTRL_Entity *entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, handle);\n    E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity);\n    result.root = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0));\n    result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ctrl_entity_kind_code_name_table[entity->kind]);\n    result.mode = E_Mode_Offset;\n  }\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: Config Collection Type Hooks\n\ntypedef struct RD_CfgsIRExt RD_CfgsIRExt;\nstruct RD_CfgsIRExt\n{\n  String8 cfg_name;\n  String8Array cmds;\n  CFG_NodePtrArray cfgs;\n  Rng1U64 cmds_idx_range;\n  Rng1U64 cfgs_idx_range;\n};\n\nE_TYPE_IREXT_FUNCTION_DEF(cfgs_slice)\n{\n  RD_CfgsIRExt *ext = push_array(arena, RD_CfgsIRExt, 1);\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    //- rjf: determine which key we'll be gathering\n    E_TypeKey type_key = irtree->type_key;\n    E_Type *type = e_type_from_key(type_key);\n    String8 cfg_name = rd_singular_from_code_name_plural(type->name);\n    \n    //- rjf: gather cfgs\n    CFG_NodePtrList cfgs_list = cfg_node_top_level_list_from_string(scratch.arena, cfg_name);\n    \n    //- rjf: gather commands\n    String8List cmds_list = {0};\n    {\n      MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, cfg_name);\n      for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)\n      {\n        MD_Node *schema = n->v;\n        MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit(\"collection_commands\"), 0);\n        for MD_EachNode(cmd, collection_cmds_root->first)\n        {\n          str8_list_push(arena, &cmds_list, cmd->string);\n        }\n      }\n    }\n    \n    //- rjf: package & fill\n    ext->cfg_name = cfg_name;\n    ext->cfgs = cfg_node_ptr_array_from_list(arena, &cfgs_list);\n    ext->cmds = str8_array_from_list(arena, &cmds_list);\n    \n    scratch_end(scratch);\n  }\n  E_IRExt result = {ext};\n  return result;\n}\n\nE_TYPE_ACCESS_FUNCTION_DEF(cfgs_slice)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  CFG_Node *cfg = &cfg_nil_node;\n  RD_CfgsIRExt *ext = (RD_CfgsIRExt *)lhs_irtree->user_data;\n  switch(expr->kind)\n  {\n    default:{}break;\n    case E_ExprKind_ArrayIndex:\n    {\n      E_Value rhs_value = e_value_from_expr(expr->first->next);\n      U64 rhs_idx = rhs_value.u64;\n      if(0 <= rhs_idx && rhs_idx < ext->cfgs.count)\n      {\n        cfg = ext->cfgs.v[rhs_idx];\n      }\n    }break;\n    case E_ExprKind_MemberAccess:\n    {\n      String8 rhs_name = expr->first->next->string;\n      CFG_ID id = 0;\n      if(str8_match(str8_prefix(rhs_name, 1), str8_lit(\"$\"), 0))\n      {\n        id = u64_from_str8(str8_skip(rhs_name, 1), 16);\n        cfg = cfg_node_from_id(id);\n      }\n    }break;\n  }\n  if(cfg != &cfg_nil_node)\n  {\n    result.root = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0));\n    result.mode = E_Mode_Offset;\n    result.type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, ext->cfg_name);\n  }\n  return result;\n}\n\ntypedef struct RD_CfgsExpandAccel RD_CfgsExpandAccel;\nstruct RD_CfgsExpandAccel\n{\n  String8Array cmds;\n  CFG_NodePtrArray cfgs;\n  Rng1U64 cmds_idx_range;\n  Rng1U64 cfgs_idx_range;\n};\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_slice)\n{\n  RD_CfgsExpandAccel *accel = push_array(arena, RD_CfgsExpandAccel, 1);\n  E_TypeExpandInfo info = {accel};\n  Temp scratch = scratch_begin(&arena, 1);\n  {\n    //- rjf: unpack\n    RD_CfgsIRExt *ext = (RD_CfgsIRExt *)eval.irtree.user_data;\n    \n    //- rjf: filter cfgs\n    CFG_NodePtrArray cfgs__filtered = ext->cfgs;\n    if(filter.size != 0)\n    {\n      CFG_NodePtrList cfgs_list__filtered = {0};\n      for EachIndex(idx, ext->cfgs.count)\n      {\n        CFG_Node *cfg = ext->cfgs.v[idx];\n        DR_FStrList fstrs = rd_title_fstrs_from_cfg(scratch.arena, cfg, 1);\n        String8 string = dr_string_from_fstrs(scratch.arena, &fstrs);\n        FuzzyMatchRangeList fuzzy_matches = fuzzy_match_find(scratch.arena, filter, string);\n        if(fuzzy_matches.count == fuzzy_matches.needle_part_count)\n        {\n          cfg_node_ptr_list_push(scratch.arena, &cfgs_list__filtered, cfg);\n        }\n      }\n      cfgs__filtered = cfg_node_ptr_array_from_list(arena, &cfgs_list__filtered);\n    }\n    \n    //- rjf: fill\n    // TODO(rjf): @cleanup don't smuggle this through like this...\n    if(cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit(\"lister\")) == &cfg_nil_node)\n    {\n      accel->cmds = ext->cmds;\n      accel->cmds_idx_range = r1u64(0, accel->cmds.count);\n    }\n    accel->cfgs = cfgs__filtered;\n    accel->cfgs_idx_range = r1u64(accel->cmds_idx_range.max, accel->cmds_idx_range.max + accel->cfgs.count);\n    info.expr_count = (accel->cmds.count + accel->cfgs.count);\n  }\n  scratch_end(scratch);\n  return info;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_query)\n{\n  RD_CfgsExpandAccel *accel = push_array(arena, RD_CfgsExpandAccel, 1);\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    CFG_Node *root_cfg = rd_cfg_from_eval_space(eval.space);\n    String8 child_key = e_string_from_id(eval.space.u64s[1]);\n    String8 child_key_singular = rd_singular_from_code_name_plural(child_key);\n    if(child_key_singular.size != 0)\n    {\n      child_key = child_key_singular;\n    }\n    String8List cmds = {0};\n    MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, child_key);\n    for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)\n    {\n      MD_Node *schema = n->v;\n      MD_Node *collection_cmds_root = md_tag_from_string(schema, str8_lit(\"collection_commands\"), 0);\n      for MD_EachNode(cmd, collection_cmds_root->first)\n      {\n        str8_list_push(scratch.arena, &cmds, cmd->string);\n      }\n    }\n    CFG_NodePtrList children = cfg_node_child_list_from_string(scratch.arena, root_cfg, child_key);\n    CFG_NodePtrList children__filtered = children;\n    if(filter.size != 0)\n    {\n      MemoryZeroStruct(&children__filtered);\n      for(CFG_NodePtrNode *n = children.first; n != 0; n = n->next)\n      {\n        DR_FStrList cfg_fstrs = rd_title_fstrs_from_cfg(scratch.arena, n->v, 1);\n        String8 cfg_string = dr_string_from_fstrs(scratch.arena, &cfg_fstrs);\n        FuzzyMatchRangeList ranges = fuzzy_match_find(scratch.arena, filter, cfg_string);\n        if(ranges.count == ranges.needle_part_count)\n        {\n          cfg_node_ptr_list_push(scratch.arena, &children__filtered, n->v);\n        }\n      }\n    }\n    accel->cmds = str8_array_from_list(arena, &cmds);\n    accel->cmds_idx_range = r1u64(0, accel->cmds.count);\n    accel->cfgs = cfg_node_ptr_array_from_list(arena, &children__filtered);\n    accel->cfgs_idx_range = r1u64(accel->cmds.count + 0, accel->cmds.count + accel->cfgs.count);\n    scratch_end(scratch);\n  }\n  E_TypeExpandInfo info = {accel, accel->cfgs.count + accel->cmds.count};\n  return info;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs_slice)\n{\n  RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data;\n  Rng1U64 cmds_idx_range = accel->cmds_idx_range;\n  Rng1U64 cfgs_idx_range = accel->cfgs_idx_range;\n  U64 dst_idx = 0;\n  \n  // rjf: fill commands\n  {\n    Rng1U64 read_range = intersect_1u64(cmds_idx_range, idx_range);\n    U64 read_count = dim_1u64(read_range);\n    E_Eval cmds_eval = e_eval_from_stringf(\"query:commands\");\n    for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)\n    {\n      String8 cmd_name = accel->cmds.v[idx + read_range.min - cmds_idx_range.min];\n      E_Eval cmd_eval = e_eval_wrapf(cmds_eval, \"$.%S\", cmd_name);\n      evals_out[dst_idx] = cmd_eval;\n    }\n  }\n  \n  // rjf: fill cfgs\n  {\n    Rng1U64 read_range = intersect_1u64(cfgs_idx_range, idx_range);\n    U64 read_count = dim_1u64(read_range);\n    for(U64 idx = 0; idx < read_count; idx += 1, dst_idx += 1)\n    {\n      CFG_Node *cfg = accel->cfgs.v[idx + read_range.min - cfgs_idx_range.min];\n      evals_out[dst_idx] = e_eval_from_stringf(\"query:config.$%I64x\", cfg->id);\n    }\n  }\n}\n\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(cfgs_slice)\n{\n  U64 id = 0;\n  RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data;\n  if(num != 0)\n  {\n    U64 idx = num-1;\n    if(contains_1u64(accel->cfgs_idx_range, idx))\n    {\n      CFG_Node *cfg = accel->cfgs.v[idx - accel->cfgs_idx_range.min];\n      id = cfg->id;\n    }\n    else if(contains_1u64(accel->cmds_idx_range, idx))\n    {\n      id = num;\n      id |= (1ull<<63);\n    }\n  }\n  return id;\n}\n\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs_slice)\n{\n  U64 num = 0;\n  RD_CfgsExpandAccel *accel = (RD_CfgsExpandAccel *)user_data;\n  if(id != 0)\n  {\n    if(id & (1ull<<63))\n    {\n      num = id;\n      num &= ~(1ull<<63);\n    }\n    else for EachIndex(idx, accel->cfgs.count)\n    {\n      if(accel->cfgs.v[idx]->id == id)\n      {\n        num = idx + accel->cfgs_idx_range.min + 1;\n        break;\n      }\n    }\n  }\n  return num;\n}\n\n////////////////////////////////\n//~ rjf: `call_stack` Type Hooks\n\ntypedef struct RD_CallStackAccel RD_CallStackAccel;\nstruct RD_CallStackAccel\n{\n  Arch arch;\n  CTRL_Handle process;\n  CTRL_CallStack call_stack;\n};\n\nE_TYPE_IREXT_FUNCTION_DEF(call_stack)\n{\n  RD_CallStackAccel *accel = push_array(arena, RD_CallStackAccel, 1);\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root);\n    String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\n    E_Interpretation interp = e_interpret(bytecode);\n    CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(interp.space);\n    if(entity->kind == CTRL_EntityKind_Thread)\n    {\n      B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread);\n      accel->arch = entity->arch;\n      accel->process = ctrl_process_from_entity(entity)->handle;\n      accel->call_stack = ctrl_call_stack_from_thread(rd_state->frame_access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0);\n    }\n    scratch_end(scratch);\n  }\n  E_IRExt result = {accel};\n  return result;\n}\n\nE_TYPE_ACCESS_FUNCTION_DEF(call_stack)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_ArrayIndex)\n  {\n    RD_CallStackAccel *accel = (RD_CallStackAccel *)lhs_irtree->user_data;\n    E_Value rhs_value = e_value_from_expr(expr->first->next);\n    CTRL_CallStack *call_stack = &accel->call_stack;\n    if(0 <= rhs_value.u64 && rhs_value.u64 < call_stack->frames_count)\n    {\n      CTRL_Entity *process = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, accel->process);\n      CTRL_CallStackFrame *f = &call_stack->frames[rhs_value.u64];\n      result.root = e_irtree_set_space(arena, rd_eval_space_from_ctrl_entity(process, CTRL_EvalSpaceKind_Entity), e_irtree_const_u(arena, regs_rip_from_arch_block(accel->arch, f->regs)));\n      result.type_key = e_type_key_cons(.arch = process->arch, .kind = E_TypeKind_Ptr, .direct_key = e_type_key_basic(E_TypeKind_Function), .count = 1, .depth = f->inline_depth);\n      result.mode = E_Mode_Value;\n    }\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack)\n{\n  RD_CallStackAccel *accel = (RD_CallStackAccel *)eval.irtree.user_data;\n  E_TypeExpandInfo result = {0};\n  result.user_data = accel;\n  result.expr_count = accel->call_stack.frames_count;\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: `environment` Type Hooks\n\ntypedef struct RD_EnvironmentAccel RD_EnvironmentAccel;\nstruct RD_EnvironmentAccel\n{\n  CFG_NodePtrArray cfgs;\n};\n\nE_TYPE_IREXT_FUNCTION_DEF(environment)\n{\n  RD_EnvironmentAccel *accel = push_array(arena, RD_EnvironmentAccel, 1);\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root);\n    String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\n    E_Interpretation interpret = e_interpret(bytecode);\n    E_Space space = interpret.space;\n    CFG_Node *target = rd_cfg_from_eval_space(space);\n    CFG_NodePtrList env_strings = {0};\n    for(CFG_Node *child = target->first; child != &cfg_nil_node; child = child->next)\n    {\n      if(str8_match(child->string, str8_lit(\"environment\"), 0))\n      {\n        cfg_node_ptr_list_push(scratch.arena, &env_strings, child);\n      }\n    }\n    accel->cfgs = cfg_node_ptr_array_from_list(arena, &env_strings);\n    scratch_end(scratch);\n  }\n  E_IRExt result = {accel};\n  return result;\n}\n\nE_TYPE_ACCESS_FUNCTION_DEF(environment)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_ArrayIndex)\n  {\n    RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)lhs_irtree->user_data;\n    CFG_NodePtrArray *cfgs = &accel->cfgs;\n    E_Value rhs_value = e_value_from_expr(expr->first->next);\n    if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count)\n    {\n      CFG_Node *cfg = cfgs->v[rhs_value.u64];\n      result.root      = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0));\n      result.type_key  = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), cfg->first->string.size, E_TypeFlag_IsCodeText);\n      result.mode      = E_Mode_Offset;\n    }\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(environment)\n{\n  RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)eval.irtree.user_data;\n  E_TypeExpandInfo result = {accel, accel->cfgs.count + 1};\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(environment)\n{\n  RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)user_data;\n  Rng1U64 legal_idx_range = r1u64(0, accel->cfgs.count);\n  Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);\n  U64 read_range_count = dim_1u64(read_range);\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\n  {\n    U64 cfg_idx = read_range.min + idx;\n    if(cfg_idx < accel->cfgs.count)\n    {\n      evals_out[idx] = e_eval_wrapf(eval, \"$[%I64u]\", cfg_idx);\n    }\n  }\n}\n\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(environment)\n{\n  U64 id = 0;\n  RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)user_data;\n  if(1 <= num && num <= accel->cfgs.count)\n  {\n    U64 idx = (num-1);\n    id = accel->cfgs.v[idx]->id;\n  }\n  else if(num == accel->cfgs.count+1)\n  {\n    id = max_U64;\n  }\n  return id;\n}\n\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(environment)\n{\n  U64 num = 0;\n  RD_EnvironmentAccel *accel = (RD_EnvironmentAccel *)user_data;\n  if(id != 0 && id != max_U64)\n  {\n    for EachIndex(idx, accel->cfgs.count)\n    {\n      if(accel->cfgs.v[idx]->id == id)\n      {\n        num = idx+1;\n        break;\n      }\n    }\n  }\n  else if(id == max_U64)\n  {\n    num = accel->cfgs.count + 1;\n  }\n  return num;\n}\n\n////////////////////////////////\n//~ rjf: `watches` Type Hooks\n\ntypedef struct RD_WatchesAccel RD_WatchesAccel;\nstruct RD_WatchesAccel\n{\n  CFG_NodePtrArray cfgs;\n};\n\nE_TYPE_IREXT_FUNCTION_DEF(watches)\n{\n  RD_WatchesAccel *accel = push_array(arena, RD_WatchesAccel, 1);\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, irtree->root);\n    String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\n    E_Interpretation interpret = e_interpret(bytecode);\n    E_Space space = interpret.space;\n    CFG_Node *target = rd_cfg_from_eval_space(space);\n    CFG_NodePtrList env_strings = {0};\n    for(CFG_Node *child = target->first; child != &cfg_nil_node; child = child->next)\n    {\n      if(str8_match(child->string, str8_lit(\"watch\"), 0))\n      {\n        cfg_node_ptr_list_push(scratch.arena, &env_strings, child);\n      }\n    }\n    accel->cfgs = cfg_node_ptr_array_from_list(arena, &env_strings);\n    scratch_end(scratch);\n  }\n  E_IRExt result = {accel};\n  return result;\n}\n\nE_TYPE_ACCESS_FUNCTION_DEF(watches)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_ArrayIndex)\n  {\n    RD_WatchesAccel *accel = (RD_WatchesAccel *)lhs_irtree->user_data;\n    CFG_NodePtrArray *cfgs = &accel->cfgs;\n    E_Value rhs_value = e_value_from_expr(expr->first->next);\n    if(0 <= rhs_value.u64 && rhs_value.u64 < cfgs->count)\n    {\n      CFG_Node *cfg = cfgs->v[rhs_value.u64];\n      result.root      = e_irtree_set_space(arena, rd_eval_space_from_cfg(cfg), e_irtree_const_u(arena, 0));\n      result.type_key  = e_type_key_cons_array(e_type_key_basic(E_TypeKind_U8), cfg->first->string.size, E_TypeFlag_IsCodeText);\n      result.mode      = E_Mode_Offset;\n    }\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(watches)\n{\n  RD_WatchesAccel *ext = (RD_WatchesAccel *)eval.irtree.user_data;\n  RD_WatchesAccel *accel = push_array(arena, RD_WatchesAccel, 1);\n  {\n    CFG_NodePtrArray cfgs__filtered = ext->cfgs;\n    if(filter.size != 0)\n    {\n      Temp scratch = scratch_begin(&arena, 1);\n      CFG_NodePtrList cfgs_list__filtered = {0};\n      for EachIndex(idx, ext->cfgs.count)\n      {\n        CFG_Node *watch = ext->cfgs.v[idx];\n        String8 string = watch->first->string;\n        FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, string);\n        if(matches.count == matches.needle_part_count)\n        {\n          cfg_node_ptr_list_push(scratch.arena, &cfgs_list__filtered, watch);\n        }\n      }\n      cfgs__filtered = cfg_node_ptr_array_from_list(arena, &cfgs_list__filtered);\n      scratch_end(scratch);\n    }\n    accel->cfgs = cfgs__filtered;\n  }\n  E_TypeExpandInfo result = {accel, accel->cfgs.count + 1};\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(watches)\n{\n  RD_WatchesAccel *accel = (RD_WatchesAccel *)user_data;\n  Rng1U64 legal_idx_range = r1u64(0, accel->cfgs.count);\n  Rng1U64 read_range = intersect_1u64(idx_range, legal_idx_range);\n  U64 read_range_count = dim_1u64(read_range);\n  for(U64 idx = 0; idx < read_range_count; idx += 1)\n  {\n    U64 cfg_idx = read_range.min + idx;\n    if(cfg_idx < accel->cfgs.count)\n    {\n      CFG_Node *cfg = accel->cfgs.v[cfg_idx];\n      evals_out[idx] = e_eval_from_string(cfg->first->string);\n    }\n  }\n}\n\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches)\n{\n  U64 id = 0;\n  RD_WatchesAccel *accel = (RD_WatchesAccel *)user_data;\n  if(1 <= num && num <= accel->cfgs.count)\n  {\n    U64 idx = (num-1);\n    id = accel->cfgs.v[idx]->id;\n  }\n  else if(num == accel->cfgs.count+1)\n  {\n    id = max_U64;\n  }\n  return id;\n}\n\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches)\n{\n  U64 num = 0;\n  RD_WatchesAccel *accel = (RD_WatchesAccel *)user_data;\n  if(id != 0 && id != max_U64)\n  {\n    for EachIndex(idx, accel->cfgs.count)\n    {\n      if(accel->cfgs.v[idx]->id == id)\n      {\n        num = idx+1;\n        break;\n      }\n    }\n  }\n  else if(id == max_U64)\n  {\n    num = accel->cfgs.count + 1;\n  }\n  return num;\n}\n\n////////////////////////////////\n//~ rjf: `unattached_processes` Type Hooks\n\ntypedef struct RD_UnattachedProcessesAccel RD_UnattachedProcessesAccel;\nstruct RD_UnattachedProcessesAccel\n{\n  DMN_ProcessInfo *infos;\n  CTRL_Entity **machines;\n  U64 infos_count;\n};\n\nE_TYPE_ACCESS_FUNCTION_DEF(unattached_processes)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_MemberAccess)\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    // rjf: extract pid / name id from access string\n    U64 pid = 0;\n    U64 string_id = 0;\n    {\n      String8 pid_string = {0};\n      String8 name_id_string = {0};\n      U8 split_char = '$';\n      String8List parts = str8_split(scratch.arena, expr->first->next->string, &split_char, 1, 0);\n      if(parts.first != 0 && parts.first->next != 0)\n      {\n        pid_string = parts.first->string;\n        name_id_string = parts.first->next->string;\n        pid = u64_from_str8(pid_string, 16);\n        string_id = u64_from_str8(name_id_string, 16);\n      }\n    }\n    \n    // rjf: get machine entity from space\n    E_OpList oplist = e_oplist_from_irtree(scratch.arena, lhs_irtree->root);\n    String8 bytecode = e_bytecode_from_oplist(scratch.arena, &oplist);\n    E_Interpretation interpret = e_interpret(bytecode);\n    CTRL_Entity *machine = rd_ctrl_entity_from_eval_space(interpret.space);\n    \n    // rjf: build evaluation for this unattached process\n    if(machine != &ctrl_entity_nil)\n    {\n      E_IRNode *value_irnode = e_push_irnode(arena, RDI_EvalOp_ConstU128);\n      value_irnode->value.u128.u64[0] = pid;\n      value_irnode->value.u128.u64[1] = string_id;\n      E_Space space = rd_eval_space_from_ctrl_entity(machine, RD_EvalSpaceKind_MetaUnattachedProcess);\n      result.root = e_irtree_set_space(arena, space, value_irnode);\n      result.type_key = e_type_key_basic(E_TypeKind_U128);\n      result.mode = E_Mode_Value;\n    }\n    \n    scratch_end(scratch);\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes)\n{\n  E_TypeExpandInfo info = {0};\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    //- rjf: evaluate lhs machine, if we have one\n    CTRL_Entity *lhs_entity = rd_ctrl_entity_from_eval_space(eval.space);\n    \n    //- rjf: gather all machines we're searching through\n    CTRL_EntityArray machines = {0};\n    if(lhs_entity->kind == CTRL_EntityKind_Machine)\n    {\n      machines.v = &lhs_entity;\n      machines.count = 1;\n    }\n    else\n    {\n      machines = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Machine);\n    }\n    \n    //- rjf: gather system processes from this machine\n    typedef struct Node Node;\n    struct Node\n    {\n      Node *next;\n      CTRL_Entity *machine;\n      DMN_ProcessInfo info;\n    };\n    Node *first = 0;\n    Node *last = 0;\n    U64 count = 0;\n    for EachIndex(idx, machines.count)\n    {\n      CTRL_Entity *machine = machines.v[idx];\n      DMN_ProcessIter iter = {0};\n      dmn_process_iter_begin(&iter);\n      for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &iter, &info);)\n      {\n        B32 passes_filter = 1;\n        if(filter.size != 0)\n        {\n          passes_filter = 0;\n          FuzzyMatchRangeList name_matches = fuzzy_match_find(scratch.arena, filter, info.name);\n          FuzzyMatchRangeList pid_matches = fuzzy_match_find(scratch.arena, filter, push_str8f(scratch.arena, \"%I64u\", info.pid));\n          if(name_matches.count == name_matches.needle_part_count || pid_matches.count == pid_matches.needle_part_count)\n          {\n            passes_filter = 1;\n          }\n        }\n        if(passes_filter)\n        {\n          Node *node = push_array(scratch.arena, Node, 1);\n          SLLQueuePush(first, last, node);\n          node->machine = machine;\n          node->info = info;\n          count += 1;\n        }\n      }\n      dmn_process_iter_end(&iter);\n    }\n    \n    //- rjf: list -> array\n    U64 infos_count = count;\n    DMN_ProcessInfo *infos = push_array(arena, DMN_ProcessInfo, infos_count);\n    CTRL_Entity **infos_machines = push_array(arena, CTRL_Entity *, infos_count);\n    {\n      U64 idx = 0;\n      for(Node *n = first; n != 0; n = n->next, idx += 1)\n      {\n        infos[idx] = n->info;\n        infos[idx].name = push_str8_copy(arena, infos[idx].name);\n        infos_machines[idx] = n->machine;\n      }\n    }\n    \n    //- rjf: build accelerator\n    RD_UnattachedProcessesAccel *accel = push_array(arena, RD_UnattachedProcessesAccel, 1);\n    accel->infos       = infos;\n    accel->infos_count = infos_count;\n    accel->machines    = infos_machines;\n    info.user_data = accel;\n    info.expr_count = infos_count;\n    scratch_end(scratch);\n  }\n  return info;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes)\n{\n  RD_UnattachedProcessesAccel *accel = (RD_UnattachedProcessesAccel *)user_data;\n  U64 out_idx = 0;\n  E_TypeKey unattached_process_type = e_type_key_cons(.kind = E_TypeKind_U128, .name = str8_lit(\"unattached_process\"));\n  for(U64 idx = idx_range.min; idx < idx_range.max; idx += 1, out_idx += 1)\n  {\n    CTRL_Entity *machine = accel->machines[idx];\n    String8 string = ctrl_string_from_handle(arena, machine->handle);\n    evals_out[out_idx] = e_eval_wrapf(eval, \"query:control.%S.unattached_processes.$%I64x$%I64x\", string, accel->infos[idx].pid, e_id_from_string(accel->infos[idx].name));\n  }\n}\n\n////////////////////////////////\n//~ rjf: Control Entity List Type Hooks (`processes`, `threads`, etc.)\n\nE_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  {\n    CTRL_Entity *entity = &ctrl_entity_nil;\n    switch(expr->kind)\n    {\n      case E_ExprKind_MemberAccess:\n      {\n        String8 rhs_name = expr->first->next->string;\n        CTRL_Handle handle = ctrl_handle_from_string(rhs_name);\n        entity = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, handle);\n      }break;\n      case E_ExprKind_ArrayIndex:\n      {\n        E_Type *type = e_type_from_key(lhs_irtree->type_key);\n        CTRL_EntityKind kind = ctrl_entity_kind_from_string(rd_singular_from_code_name_plural(type->name));\n        E_Value rhs_value = e_value_from_expr(expr->first->next);\n        U64 rhs_idx = rhs_value.u64;\n        CTRL_EntityArray entities = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, kind);\n        if(0 <= rhs_idx && rhs_idx < entities.count)\n        {\n          entity = entities.v[rhs_idx];\n        }\n      }break;\n    }\n    if(entity != &ctrl_entity_nil)\n    {\n      E_Space space = rd_eval_space_from_ctrl_entity(entity, RD_EvalSpaceKind_MetaCtrlEntity);\n      String8 name = ctrl_entity_kind_code_name_table[entity->kind];\n      E_TypeKey type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, name);\n      result.root      = e_irtree_set_space(arena, space, e_irtree_const_u(arena, 0));\n      result.type_key  = type_key;\n      result.mode      = E_Mode_Offset;\n    }\n  }\n  return result;\n}\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities)\n{\n  E_TypeExpandInfo result = {0};\n  Temp scratch = scratch_begin(&arena, 1);\n  {\n    //- rjf: determine which entity we're looking under\n    CTRL_Entity *scoping_entity = &ctrl_entity_nil;\n    if(eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)\n    {\n      scoping_entity = rd_ctrl_entity_from_eval_space(eval.space);\n    }\n    \n    //- rjf: determine which type of child we're gathering\n    E_TypeKey lhs_type_key = eval.irtree.type_key;\n    E_Type *lhs_type = e_type_from_key(lhs_type_key);\n    String8 name = rd_singular_from_code_name_plural(lhs_type->name);\n    CTRL_EntityKind entity_kind = ctrl_entity_kind_from_string(name);\n    \n    //- rjf: gather array of all entities which fit the bill\n    CTRL_EntityArray array = {0};\n    if(scoping_entity == &ctrl_entity_nil)\n    {\n      array = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, entity_kind);\n    }\n    else\n    {\n      CTRL_EntityList list = {0};\n      for(CTRL_Entity *child = scoping_entity->first; child != &ctrl_entity_nil; child = child->next)\n      {\n        if(child->kind == entity_kind)\n        {\n          ctrl_entity_list_push(scratch.arena, &list, child);\n        }\n      }\n      array = ctrl_entity_array_from_list(arena, &list);\n    }\n    \n    //- rjf: filter the array\n    CTRL_EntityArray array__filtered = array;\n    if(filter.size != 0)\n    {\n      CTRL_EntityList list__filtered = {0};\n      for EachIndex(idx, array.count)\n      {\n        CTRL_Entity *entity = array.v[idx];\n        DR_FStrList fstrs = rd_title_fstrs_from_ctrl_entity(scratch.arena, entity, 1);\n        String8 title_string = dr_string_from_fstrs(scratch.arena, &fstrs);\n        FuzzyMatchRangeList matches = fuzzy_match_find(scratch.arena, filter, title_string);\n        if(matches.count == matches.needle_part_count)\n        {\n          ctrl_entity_list_push(scratch.arena, &list__filtered, entity);\n        }\n      }\n      array__filtered = ctrl_entity_array_from_list(arena, &list__filtered);\n    }\n    \n    //- rjf: list -> array & fill\n    CTRL_EntityArray *accel = push_array(arena, CTRL_EntityArray, 1);\n    *accel = array__filtered;\n    result.user_data = accel;\n    result.expr_count = accel->count;\n  }\n  scratch_end(scratch);\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities)\n{\n  CTRL_EntityArray *entities = (CTRL_EntityArray *)user_data;\n  Rng1U64 legal_range = r1u64(0, entities->count);\n  Rng1U64 read_range = intersect_1u64(legal_range, idx_range);\n  U64 read_count = dim_1u64(read_range);\n  for(U64 out_idx = 0; out_idx < read_count; out_idx += 1)\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    CTRL_Entity *entity = entities->v[out_idx + read_range.min];\n    evals_out[out_idx] = e_eval_from_stringf(\"query:control.%S\", ctrl_string_from_handle(scratch.arena, entity->handle));\n    scratch_end(scratch);\n  }\n}\n\n////////////////////////////////\n//~ rjf: Call Stack Tree Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(call_stack_tree)\n{\n  E_IRTreeAndType result = {&e_irnode_nil};\n  if(expr->kind == E_ExprKind_MemberAccess)\n  {\n    String8 id_string = expr->first->next->string;\n    U64 id = u64_from_str8(str8_skip(id_string, 1), 16);\n    if(id != 0)\n    {\n      result.type_key = lhs_irtree->type_key;\n      result.mode = E_Mode_Value;\n      result.root = e_irtree_set_space(arena, e_space_make(RD_EvalSpaceKind_MetaCallStackTree), e_irtree_const_u(arena, id));\n    }\n  }\n  return result;\n}\n\ntypedef struct RD_CallStackTreeExpandAccel RD_CallStackTreeExpandAccel;\nstruct RD_CallStackTreeExpandAccel\n{\n  CTRL_CallStackTreeNode *node;\n  CTRL_CallStackTreeNode **children;\n  CTRL_HandleArray threads;\n};\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_tree)\n{\n  Access *access = access_open();\n  CTRL_CallStackTree call_stack_tree = ctrl_call_stack_tree(access, 0);\n  access_close(access);\n  RD_CallStackTreeExpandAccel *accel = push_array(arena, RD_CallStackTreeExpandAccel, 1);\n  accel->node = &ctrl_call_stack_tree_node_nil;\n  U64 id = e_value_eval_from_eval(eval).value.u64;\n  if(call_stack_tree.slots_count != 0)\n  {\n    for(CTRL_CallStackTreeNode *n = call_stack_tree.slots[id%call_stack_tree.slots_count];\n        n != 0;\n        n = n->hash_next)\n    {\n      if(n->id == id)\n      {\n        accel->node = n;\n        break;\n      }\n    }\n  }\n  accel->children = push_array(arena, CTRL_CallStackTreeNode *, accel->node->child_count);\n  {\n    U64 idx = 0;\n    for(CTRL_CallStackTreeNode *n = accel->node->first;\n        n != &ctrl_call_stack_tree_node_nil;\n        n = n->next, idx += 1)\n    {\n      accel->children[idx] = n;\n    }\n  }\n  accel->threads = ctrl_handle_array_from_list(arena, &accel->node->threads);\n  E_TypeExpandInfo result = {accel};\n  result.expr_count = accel->node->child_count + accel->threads.count;\n  return result;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(call_stack_tree)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  RD_CallStackTreeExpandAccel *accel = (RD_CallStackTreeExpandAccel *)user_data;\n  CTRL_CallStackTreeNode *node = accel->node;\n  U64 needed_row_count = dim_1u64(idx_range);\n  for EachIndex(idx, needed_row_count)\n  {\n    E_Eval eval = e_eval_nil;\n    if(idx < node->child_count)\n    {\n      eval = e_eval_from_stringf(\"query:call_stack_tree.$%I64x\", accel->children[idx]->id);\n    }\n    else if(node->child_count <= idx && idx < node->child_count + accel->threads.count)\n    {\n      eval = e_eval_from_stringf(\"query:control.%S\", ctrl_string_from_handle(scratch.arena, accel->threads.v[idx - node->child_count]));\n    }\n    evals_out[idx] = eval;\n  }\n  scratch_end(scratch);\n}\n\n////////////////////////////////\n//~ rjf: Debug Info Tables Eval Hooks\n\ntypedef struct RD_DebugInfoTableLookupAccel RD_DebugInfoTableLookupAccel;\nstruct RD_DebugInfoTableLookupAccel\n{\n  RDI_SectionKind section;\n  DI_SearchItemArray items;\n};\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  // rjf: determine which debug info section we're dealing with\n  RDI_SectionKind section = RDI_SectionKind_NULL;\n  {\n    E_TypeKey lhs_type_key = eval.irtree.type_key;\n    E_Type *lhs_type = e_type_from_key(lhs_type_key);\n    if(0){}\n    else if(str8_match(lhs_type->name, str8_lit(\"procedures\"), 0))       {section = RDI_SectionKind_Procedures;}\n    else if(str8_match(lhs_type->name, str8_lit(\"globals\"), 0))          {section = RDI_SectionKind_GlobalVariables;}\n    else if(str8_match(lhs_type->name, str8_lit(\"thread_locals\"), 0))    {section = RDI_SectionKind_ThreadVariables;}\n    else if(str8_match(lhs_type->name, str8_lit(\"constants\"), 0))        {section = RDI_SectionKind_Constants;}\n    else if(str8_match(lhs_type->name, str8_lit(\"types\"), 0))            {section = RDI_SectionKind_UDTs;}\n    else if(str8_match(lhs_type->name, str8_lit(\"source_files\"), 0))     {section = RDI_SectionKind_SourceFiles;}\n  }\n  \n  // rjf: gather debug info table items\n  RD_DebugInfoTableLookupAccel *accel = push_array(arena, RD_DebugInfoTableLookupAccel, 1);\n  if(section != RDI_SectionKind_NULL)\n  {\n    U64 endt_us = rd_state->frame_eval_memread_endt_us;\n    B32 stale = 0;\n    accel->section = section;\n    accel->items = di_search_item_array_from_target_query(rd_state->frame_access, section, filter, endt_us, &stale);\n    CFG_Node *last_successful_query_cfg = rd_immediate_cfg_from_keyf(\"last_successful_query_%I64x_%I64u\", rd_regs()->view, (U64)section);\n    if(stale)\n    {\n      String8 last_query = last_successful_query_cfg->first->string;\n      accel->items = di_search_item_array_from_target_query(rd_state->frame_access, section, last_query, endt_us, 0);\n      rd_request_frame();\n    }\n    else\n    {\n      cfg_node_new_replace(rd_state->cfg, last_successful_query_cfg, filter);\n    }\n  }\n  \n  E_TypeExpandInfo info = {accel, accel->items.count};\n  scratch_end(scratch);\n  return info;\n}\n\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data;\n  U64 needed_row_count = dim_1u64(idx_range);\n  for EachIndex(idx, needed_row_count)\n  {\n    Access *access = access_open();\n    \n    // rjf: unpack row\n    DI_SearchItem *item = &accel->items.v[idx_range.min + idx];\n    RDI_Parsed *rdi = di_rdi_from_key(access, item->key, 0, 0);\n    \n    // rjf: get item's string\n    String8 item_string = {0};\n    B32 item_is_path = 0;\n    {\n      U64 element_idx = item->idx;\n      switch(accel->section)\n      {\n        default:{}break;\n        case RDI_SectionKind_Procedures:\n        {\n          RDI_Procedure *procedure = rdi_element_from_name_idx(rdi, Procedures, element_idx);\n          String8 symbol_name = {0};\n          symbol_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &symbol_name.size);\n          item_string = symbol_name;\n        }break;\n        case RDI_SectionKind_GlobalVariables:\n        {\n          RDI_GlobalVariable *gvar = rdi_element_from_name_idx(rdi, GlobalVariables, element_idx);\n          String8 symbol_name = {0};\n          symbol_name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &symbol_name.size);\n          item_string = symbol_name;\n        }break;\n        case RDI_SectionKind_ThreadVariables:\n        {\n          RDI_ThreadVariable *tvar = rdi_element_from_name_idx(rdi, ThreadVariables, element_idx);\n          String8 symbol_name = {0};\n          symbol_name.str = rdi_string_from_idx(rdi, tvar->name_string_idx, &symbol_name.size);\n          item_string = symbol_name;\n        }break;\n        case RDI_SectionKind_Constants:\n        {\n          RDI_Constant *cnst = rdi_element_from_name_idx(rdi, Constants, element_idx);\n          String8 symbol_name = {0};\n          symbol_name.str = rdi_string_from_idx(rdi, cnst->name_string_idx, &symbol_name.size);\n          item_string = symbol_name;\n        }break;\n        case RDI_SectionKind_UDTs:\n        {\n          RDI_UDT *udt = rdi_element_from_name_idx(rdi, UDTs, element_idx);\n          RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, udt->self_type_idx);\n          String8 name = {0};\n          name.str = rdi_string_from_idx(rdi, type_node->user_defined.name_string_idx, &name.size);\n          item_string = name;\n        }break;\n        case RDI_SectionKind_SourceFiles:\n        {\n          RDI_SourceFile *sf = rdi_element_from_name_idx(rdi, SourceFiles, element_idx);\n          String8List path_parts = {0};\n          for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, sf->file_path_node_idx);\n              fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0);\n              fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node))\n          {\n            String8 path_part = {0};\n            path_part.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &path_part.size);\n            str8_list_push_front(scratch.arena, &path_parts, path_part);\n          }\n          StringJoin join = {0};\n          join.sep = str8_lit(\"/\");\n          item_string = str8_list_join(scratch.arena, &path_parts, &join);\n          item_is_path = 1;\n        }break;\n      }\n    }\n    \n    // rjf: build a valid expression string given item string\n    String8 item_expr = item_string;\n    if(item_is_path)\n    {\n      item_expr = push_str8f(scratch.arena, \"file:\\\"%S\\\"\", item_string);\n    }\n    else\n    {\n      B32 string_can_be_evalled = 1;\n      E_TokenArray tokens = e_token_array_from_text(scratch.arena, item_string);\n      for EachIndex(idx, tokens.count)\n      {\n        String8 token_string = str8_substr(item_string, tokens.v[idx].range);\n        if(tokens.v[idx].kind != E_TokenKind_Identifier &&\n           !str8_match(token_string, str8_lit(\".\"), 0))\n        {\n          string_can_be_evalled = 0;\n          break;\n        }\n      }\n      if(!string_can_be_evalled)\n      {\n        item_expr = push_str8f(scratch.arena, \"`%S`\", item_string);\n      }\n    }\n    \n    // rjf: item's eval\n    E_Eval item_eval = e_eval_from_string(item_expr);\n    \n    // rjf: fill\n    evals_out[idx] = item_eval;\n    temp_end(scratch);\n    \n    access_close(access);\n  }\n  scratch_end(scratch);\n}\n\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(debug_info_table)\n{\n  RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data;\n  U64 id = 0;\n  if(0 < num && num <= accel->items.count)\n  {\n    U64 hash = 5381;\n    hash = u64_hash_from_seed_str8(hash, str8_struct(&accel->items.v[num-1].key.u64[0]));\n    hash = u64_hash_from_seed_str8(hash, str8_struct(&accel->items.v[num-1].key.u64[1]));\n    hash = u64_hash_from_seed_str8(hash, str8_struct(&accel->items.v[num-1].idx));\n    id = hash;\n  }\n  return id;\n}\n\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(debug_info_table)\n{\n  RD_DebugInfoTableLookupAccel *accel = (RD_DebugInfoTableLookupAccel *)user_data;\n  U64 num = 0;\n  for EachIndex(idx, accel->items.count)\n  {\n    U64 hash = 5381;\n    hash = u64_hash_from_seed_str8(hash, str8_struct(&accel->items.v[idx].key.u64[0]));\n    hash = u64_hash_from_seed_str8(hash, str8_struct(&accel->items.v[idx].key.u64[1]));\n    hash = u64_hash_from_seed_str8(hash, str8_struct(&accel->items.v[idx].idx));\n    if(hash == id)\n    {\n      num = idx+1;\n      break;\n    }\n  }\n  return num;\n}\n"
  },
  {
    "path": "src/raddbg/raddbg_eval.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RADDBG_EVAL_H\n#define RADDBG_EVAL_H\n\n////////////////////////////////\n//~ rjf: `commands` Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(commands);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(commands);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(commands);\n\n////////////////////////////////\n//~ rjf: `themes` Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(themes);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(themes);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(themes);\n\n////////////////////////////////\n//~ rjf: `locals` Type Hooks\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(locals);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(locals);\n\n////////////////////////////////\n//~ rjf: `registers` Type Hooks\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(registers);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(registers);\n\n////////////////////////////////\n//~ rjf: Schema Type Hooks\n\nE_TYPE_IREXT_FUNCTION_DEF(schema);\nE_TYPE_ACCESS_FUNCTION_DEF(schema);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(schema);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(schema);\n\n////////////////////////////////\n//~ rjf: Config Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(cfgs);\n\n////////////////////////////////\n//~ rjf: Control Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(control);\n\n////////////////////////////////\n//~ rjf: Config Slice Type Hooks\n\nE_TYPE_IREXT_FUNCTION_DEF(cfgs_slice);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_query);\nE_TYPE_ACCESS_FUNCTION_DEF(cfgs_slice);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(cfgs_slice);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(cfgs_slice);\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(cfgs_slice);\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(cfgs_slice);\n\n////////////////////////////////\n//~ rjf: `call_stack` Type Hooks\n\nE_TYPE_IREXT_FUNCTION_DEF(call_stack);\nE_TYPE_ACCESS_FUNCTION_DEF(call_stack);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack);\n\n////////////////////////////////\n//~ rjf: `environment` Type Hooks\n\nE_TYPE_IREXT_FUNCTION_DEF(environment);\nE_TYPE_ACCESS_FUNCTION_DEF(environment);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(environment);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(environment);\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(environment);\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(environment);\n\n////////////////////////////////\n//~ rjf: `watches` Type Hooks\n\nE_TYPE_IREXT_FUNCTION_DEF(watches);\nE_TYPE_ACCESS_FUNCTION_DEF(watches);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(watches);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(watches);\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(watches);\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(watches);\n\n////////////////////////////////\n//~ rjf: `unattached_processes` Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(unattached_processes);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(unattached_processes);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(unattached_processes);\n\n////////////////////////////////\n//~ rjf: Control Entity List Type Hooks (`processes`, `threads`, etc.)\n\nE_TYPE_ACCESS_FUNCTION_DEF(ctrl_entities);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(ctrl_entities);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(ctrl_entities);\n\n////////////////////////////////\n//~ rjf: Call Stack Tree Type Hooks\n\nE_TYPE_ACCESS_FUNCTION_DEF(call_stack_tree);\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(call_stack_tree);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(call_stack_tree);\n\n////////////////////////////////\n//~ rjf: Debug Info Tables Eval Hooks\n\nE_TYPE_EXPAND_INFO_FUNCTION_DEF(debug_info_table);\nE_TYPE_EXPAND_RANGE_FUNCTION_DEF(debug_info_table);\nE_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_DEF(debug_info_table);\nE_TYPE_EXPAND_NUM_FROM_ID_FUNCTION_DEF(debug_info_table);\n\n#endif // RADDBG_EVAL_H\n"
  },
  {
    "path": "src/raddbg/raddbg_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"raddbg_core.c\"\r\n#include \"raddbg_eval.c\"\r\n#include \"raddbg_widgets.c\"\r\n#include \"raddbg_views.c\"\r\n#include \"raddbg_legacy_config.c\"\r\n"
  },
  {
    "path": "src/raddbg/raddbg_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RADDBG_INC_H\r\n#define RADDBG_INC_H\r\n\r\n#include \"raddbg_core.h\"\r\n#include \"raddbg_eval.h\"\r\n#include \"raddbg_widgets.h\"\r\n#include \"raddbg_views.h\"\r\n#include \"raddbg_legacy_config.h\"\r\n\r\n#endif // RADDBG_INC_H\r\n"
  },
  {
    "path": "src/raddbg/raddbg_legacy_config.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal CFG_NodePtrList\nrd_cfg_tree_list_from_string__pre_0_9_16(Arena *arena, String8 file_path, String8 data)\n{\n  CFG_NodePtrList result = {0};\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    String8 folder_path = str8_skip_last_slash(file_path);\n    MD_Node *src_root = md_parse_from_text(scratch.arena, file_path, data).root;\n    {\n      for MD_EachNode(tln, src_root->first)\n      {\n        //- rjf: targets\n        if(str8_match(tln->string, str8_lit(\"target\"), 0))\n        {\n          String8 disabled_string   = md_child_from_string(tln, str8_lit(\"disabled\"), 0)->first->string;\n          String8 executable        = md_child_from_string(tln, str8_lit(\"executable\"), 0)->first->string;\n          String8 arguments         = md_child_from_string(tln, str8_lit(\"arguments\"), 0)->first->string;\n          String8 working_directory = md_child_from_string(tln, str8_lit(\"working_directory\"), 0)->first->string;\n          String8 entry_point       = md_child_from_string(tln, str8_lit(\"entry_point\"), 0)->first->string;\n          String8 stdout_path       = md_child_from_string(tln, str8_lit(\"stdout_path\"), 0)->first->string;\n          String8 stderr_path       = md_child_from_string(tln, str8_lit(\"stderr_path\"), 0)->first->string;\n          String8 stdin_path        = md_child_from_string(tln, str8_lit(\"stdin_path\"), 0)->first->string;\n          String8 debug_subprocesses= md_child_from_string(tln, str8_lit(\"debug_subprocesses\"), 0)->first->string;\n          CFG_Node *dst_root = cfg_node_new(rd_state->cfg, &cfg_nil_node, str8_lit(\"target\"));\n          cfg_node_ptr_list_push(arena, &result, dst_root);\n          {\n            if(executable.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"executable\")), path_absolute_dst_from_relative_dst_src(scratch.arena, executable, folder_path)); }\n            if(arguments.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"arguments\")), raw_from_escaped_str8(scratch.arena, arguments)); }\n            if(working_directory.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"working_directory\")), path_absolute_dst_from_relative_dst_src(scratch.arena, working_directory, folder_path)); }\n            if(entry_point.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"entry_point\")), raw_from_escaped_str8(scratch.arena, entry_point)); }\n            if(stdout_path.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"stdout_path\")), path_absolute_dst_from_relative_dst_src(scratch.arena, stdout_path, folder_path)); }\n            if(stderr_path.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"stderr_path\")), path_absolute_dst_from_relative_dst_src(scratch.arena, stderr_path, folder_path)); }\n            if(stdin_path.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"stdin_path\")), path_absolute_dst_from_relative_dst_src(scratch.arena, stdin_path, folder_path)); }\n            if(debug_subprocesses.size != 0) { cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"debug_subprocesses\")), raw_from_escaped_str8(scratch.arena, debug_subprocesses)); }\n            if(!str8_match(disabled_string, str8_lit(\"1\"), 0))\n            {\n              cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"enabled\")), str8_lit(\"1\"));\n            }\n          }\n        }\n        \n        //- rjf: recent files / projects\n        if(str8_match(tln->string, str8_lit(\"recent_file\"), 0) ||\n           str8_match(tln->string, str8_lit(\"recent_project\"), 0))\n        {\n          CFG_Node *dst_root = cfg_node_new(rd_state->cfg, &cfg_nil_node, tln->string);\n          cfg_node_ptr_list_push(arena, &result, dst_root);\n          cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"path\")), path_absolute_dst_from_relative_dst_src(scratch.arena, tln->first->string, folder_path));\n        }\n        \n        //- rjf: file path maps\n        if(str8_match(tln->string, str8_lit(\"file_path_map\"), 0))\n        {\n          String8 source = md_child_from_string(tln, str8_lit(\"source\"), 0)->first->string;\n          String8 dest = md_child_from_string(tln, str8_lit(\"dest\"), 0)->first->string;\n          CFG_Node *dst_root = cfg_node_new(rd_state->cfg, &cfg_nil_node, tln->string);\n          cfg_node_ptr_list_push(arena, &result, dst_root);\n          cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"source\")), path_absolute_dst_from_relative_dst_src(scratch.arena, source, folder_path));\n          cfg_node_new(rd_state->cfg, cfg_node_new(rd_state->cfg, dst_root, str8_lit(\"dest\")), path_absolute_dst_from_relative_dst_src(scratch.arena, dest, folder_path));\n        }\n      }\n    }\n    scratch_end(scratch);\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/raddbg/raddbg_legacy_config.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RADDBG_LEGACY_CONFIG_H\n#define RADDBG_LEGACY_CONFIG_H\n\ninternal CFG_NodePtrList rd_cfg_tree_list_from_string__pre_0_9_16(Arena *arena, String8 file_path, String8 data);\n\n#endif // RADDBG_LEGACY_CONFIG_H\n"
  },
  {
    "path": "src/raddbg/raddbg_main.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: post-0.9.20 TODO notes\r\n//\r\n//- urgent fixes\r\n// [ ] (use msvc assert as an example) show fastfail exception info (code, name, etc.) - comes from ExceptionInformation @fastfail\r\n// [ ] stepping w/ spoofs & shadow stack enabled - writing spoof will send a stack buffer overrun event @shadow_stack_step\r\n// [ ] hardware breakpoints regression (global eval in ctrl)\r\n// [ ] native filesystem dialog, resizing raddbg window -> crash!\r\n// [ ] stdout/stderr path target setting is now busted >:(\r\n// [ ] target ui entry point should override built-in entry point\r\n// [ ] list of all tabs in palette\r\n// [ ] u64 + (ptr - ptr) seems to produce unexpected results - double check with C rules?\r\n//\r\n//- flow notes\r\n// [ ] \"skip breakpoint, run to source\", when stopped at a non-source location\r\n// [ ] adjust menu bar rendering when not focused\r\n// [ ] treat int 0x29 similarly to int3\r\n// [ ] auto_step, launching terminal, terminal steals focus from debugger...\r\n//\r\n//- memory view\r\n// [ ] have smaller visible range than entire memory space, within some bounds (e.g. 64KB)\r\n// [ ] dynamically expand memory space, based on scrolling\r\n// [ ] fix clicking through occluded panels etc.\r\n// [ ] disambiguate . character in ASCII columns\r\n// [ ] fix type intepretations of cursor in bottom pane\r\n//\r\n//- watch improvements\r\n// [ ] *ALL* expressions in watch windows need to be editable.\r\n//\r\n//- cfg improvements\r\n// [ ] config hot-reloading, using cfg wins\r\n// [ ] undo/redo, using cfg wins\r\n// [ ] back/forward, using cfg wins\r\n//  [ ]  mouse back button should make view to go back after I double clicked\r\n//       on function to open it\r\n// [ ] expand %environment_variables% in target environment strings - is there\r\n//     a way we can defer to the underlying shell in a non-horrible way...?\r\n//\r\n//- stepping or breakpoint oddness/fixes\r\n// [ ] halting during a spoof-ridden step leaves the spoofs in place!!!\r\n//     (repro via LOTS of code on one line & halting)\r\n// [ ] stepping-onto a line with a conditional breakpoint, which fails, causes a\r\n// single step over the first instruction of that line, even if the thread\r\n// would've stopped at the first instruction due to the step, were that bp not\r\n// there.\r\n// [ ] breakpoints in optimized code? maybe early-terminating bp resolution loop? @bpmiss\r\n//      - actually this seems to be potentially because of incomplete src-line-map info...\r\n// [ ] Mohit-reported breakpoint not hitting - may be similar thing to @bpmiss\r\n//\r\n//- ui improvements\r\n// [ ] we probably want to disable pop/pull out for transient things, e.g. theme color cfgs\r\n//     (actually, just kill the tabs on load if they refer to transient things)\r\n// [ ] universal ctx menu address/watch options; e.g. watch -> memory; watch -> add watch\r\n// [ ] rich hover coverage; bitmap <-> geo <-> memory <-> disassembly <-> text; etc.\r\n// [ ] tooltip coverage pass (row commands, etc.)\r\n// [ ] visualize all breakpoints everywhere - source view should show up in\r\n//     disasm, disasm should show up in source view, function should show up in\r\n//     both, etc.\r\n//  [ ] ** Function breakpoints should show up in the source listing. Without\r\n//      them being visible, it is confusing when you run and you stop there,\r\n//      because you're like \"wait why did it stop\" and then you later remember\r\n//      that's because there was a function breakpoint there.\r\n// [ ] (reported by forrest) 'set-next-statement' -> prioritize current\r\n//     module/symbol, in cases where one line maps to many voffs\r\n// [ ] \"Browse...\" buttons should adopt a more relevant starting search path,\r\n//     if possible\r\n//  [ ] (since browse buttons are currently gone i should just add them backin\r\n//       while respecting this old todo)\r\n// [ ] For the Scheduler window, it would be nice if you could dim or\r\n//     folderize threads that are not your threads - eg., if a thread doesn't\r\n//     have any resolved stack pointers in your executable code, then you can\r\n//     ignore it when you are focusing on your own code. I don't know what the\r\n//     best way to detect this is, other than by walking the call stack... one\r\n//     way might be to just have a way to separate threads you've named from\r\n//     threads you haven't? Or, there could even be a debugger-specific API\r\n//     that you use to tag them. Just some way that would make it easier to\r\n//     focus on your own threads.\r\n// [ ] use backslashes on windows by default, forward slashes elsewhere (?)\r\n// [ ] For theme editing, when you hove the mouse over a theme color entry and\r\n//     it highlights that entry, it might help to temporarily change that\r\n//     color to white (or the inverse of the background color, or whatever) so\r\n//     that the user can see what things on the screen use that theme color.\r\n// [ ] The hex format for color values in the config file was a real\r\n//     mindbender. It's prefixed with \"0x\", so I was assuming it was either\r\n//     Windows Big Endian (0xAARRGGBB) or Mac Little Endian (0xAABBGGRR). To\r\n//     my surprise, it was neither - it was actually web format (RRGGBBAA),\r\n//     which I was not expecting because that is normally written with a\r\n//     number sign (#AARRGGBB) not an 0x.\r\n// [ ] It'd be nice to have a \"goto byte\" option for source views, for jumping\r\n//     to error messages that are byte-based instead of line-based.\r\n//  [ ] Clicking on either side of a scroll bar is idiosyncratic. Normally,\r\n//      that is \"page up\" / \"page down\", but here it is \"smooth scroll upward\"\r\n//      / \"smooth scroll downward\" for some reason?\r\n//  [ ]  Alt+8 to switch to disassembly would be nice (regardless on which\r\n//       panel was previous, don't want to use ctrl+, multiple times)\r\n//       Alt+8 for disasm and Alt+6 for memory view are shortcuts I often use\r\n//       in VS\r\n//  [ ]  default font size is too small for me - not only source code, but\r\n//       menus/tab/watch names (which don't resize). Maybe you could query\r\n//       Windows for initial font size?\r\n// [ ] globally disable/configure default view rule-like things (string\r\n//     viz for u8s in particular)\r\n// [ ] fancy string runs can include \"weakness\" information for text truncation\r\n//     ... can prioritize certain parts of strings to be truncated before\r\n//     others. would be good for e.g. the middle of a path\r\n//\r\n//- visualizer improvements\r\n// [ ] disasm starting address - need to use debug info for more correct results...\r\n// [ ] multidimensional `array`\r\n// [ ] 2-vector, 3-vector, quaternion\r\n// [ ] audio waveform views\r\n//\r\n//- eval improvements\r\n// [ ] maybe add extra caching layer to process memory querying? we pay a pretty\r\n//     heavy cost even to just read 8 bytes...\r\n// [ ] serializing eval view maps (?)\r\n// [ ] EVAL LOOKUP RULES -> currently going 0 -> rdis_count, but we need\r\n//  to prioritize the primary rdi\r\n// [ ] wide transforms\r\n//  [ ] sum\r\n//  [ ] plot\r\n//  [ ] max view rule\r\n//  [ ] min view rule\r\n//  [ ] histogram view rule\r\n//  [ ] diffs?\r\n//  [ ] ** One very nice feature of RemedyBG that I use all the time is the\r\n//      ability to put \"$err, hr\" into the watch window, which will just show\r\n//      the value of GetLastError() as a string. This is super useful for\r\n//      debugging, so you don't have to litter your own code with it.\r\n//      (NOTE(rjf): NtQueryInformationThread)\r\n// [ ] C++ virtual inheritance member visualization\r\n// [ ] smart scopes - expression operators for \"grab me the first type X\"\r\n// [ ] \"pinning\" watch expressions, to attach it to a particular scope/evaluation context\r\n//\r\n//- control improvements\r\n// [ ] debug info overrides (both path-based AND module-based)\r\n// [ ] symbol server\r\n// [ ] can it ignore stepping into _RTC_CheckStackVars generated functions?\r\n// [ ] jump table thunks, on code w/o /INCREMENTAL:NO\r\n// [ ] investigate /DEBUG:FASTLINK - can we somehow alert that we do not\r\n//     support it?\r\n// [ ] just-in-time debugging\r\n// [ ] step-out-of-loop\r\n//\r\n//- late-conversion performance improvements\r\n// [ ] live++ investigations - ctrl+alt+f11 in UE?\r\n//\r\n//- short-to-medium term future features\r\n// [ ] search-in-all-files\r\n//  [ ] automatically snap to search matches when searching source files\r\n// [ ] memory view\r\n//  [ ] memory view mutation controls\r\n//  [ ] memory view user-made annotations\r\n//  [ ] memory view searching\r\n// [ ] disasm view\r\n//  [ ] visualize jump destinations in disasm\r\n//\r\n//- longer-term future features\r\n// [ ] long-term future notes from martins\r\n// [ ] core dump saving/loading\r\n// [ ] parallel call stacks view\r\n// [ ] parallel watch view\r\n// [ ] mixed native/interpreted/jit debugging\r\n//     - it seems python has a top-level linked list of interpreter states,\r\n//       which should allow the debugger to map native callstacks to python\r\n//       code\r\n//\r\n//- code cleanup\r\n// [ ] eliminate explicit font parameters in the various ui paths (e.g.\r\n//     code slice params)\r\n// [ ] font cache eviction (both for font tags, closing fp handles, and\r\n//     rasterizations)\r\n\r\n////////////////////////////////\r\n//~ rjf: Build Options\r\n\r\n#define BUILD_TITLE \"The RAD Debugger\"\r\n#define OS_FEATURE_GRAPHICAL 1\r\n\r\n#define DMN_INIT_MANUAL 1\r\n#define CTRL_INIT_MANUAL 1\r\n#define OS_GFX_INIT_MANUAL 1\r\n#define FP_INIT_MANUAL 1\r\n#define R_INIT_MANUAL 1\r\n#define FNT_INIT_MANUAL 1\r\n#define D_INIT_MANUAL 1\r\n#define RD_INIT_MANUAL 1\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n//- rjf: [h]\r\n#include \"base/base_inc.h\"\r\n#include \"x64/x64.h\"\r\n#include \"linker/hash_table.h\"\r\n#include \"os/os_inc.h\"\r\n#include \"artifact_cache/artifact_cache.h\"\r\n#include \"rdi/rdi_local.h\"\r\n#include \"rdi_make/rdi_make_local.h\"\r\n#include \"mdesk/mdesk.h\"\r\n#include \"config/config_inc.h\"\r\n#include \"content/content.h\"\r\n#include \"file_stream/file_stream.h\"\r\n#include \"text/text.h\"\r\n#include \"mutable_text/mutable_text.h\"\r\n#include \"coff/coff.h\"\r\n#include \"coff/coff_parse.h\"\r\n#include \"pe/pe.h\"\r\n#include \"elf/elf.h\"\r\n#include \"gnu/gnu.h\"\r\n#include \"elf/elf_parse.h\"\r\n#include \"elf/elf_dump.h\"\r\n#include \"codeview/codeview.h\"\r\n#include \"codeview/codeview_parse.h\"\r\n#include \"msf/msf.h\"\r\n#include \"msf/msf_parse.h\"\r\n#include \"pdb/pdb.h\"\r\n#include \"pdb/pdb_parse.h\"\r\n#include \"pdb/pdb_stringize.h\"\r\n#include \"dwarf/dwarf_inc.h\"\r\n#include \"rdi_from_coff/rdi_from_coff.h\"\r\n#include \"rdi_from_elf/rdi_from_elf.h\"\r\n#include \"rdi_from_pdb/rdi_from_pdb.h\"\r\n#include \"rdi_from_dwarf/rdi_from_dwarf.h\"\r\n#include \"radbin/radbin.h\"\r\n#include \"regs/regs.h\"\r\n#include \"regs/rdi/regs_rdi.h\"\r\n#include \"dbg_info/dbg_info.h\"\r\n#include \"disasm/disasm.h\"\r\n#include \"stap/stap_parse.h\"\r\n#include \"demon/demon_inc.h\"\r\n#include \"eval/eval_inc.h\"\r\n#include \"eval_visualization/eval_visualization_inc.h\"\r\n#include \"ctrl/ctrl_inc.h\"\r\n#include \"font_provider/font_provider_inc.h\"\r\n#include \"render/render_inc.h\"\r\n#include \"font_cache/font_cache.h\"\r\n#include \"draw/draw.h\"\r\n#include \"ui/ui_inc.h\"\r\n#include \"dbg_engine/dbg_engine_inc.h\"\r\n#include \"raddbg/raddbg_inc.h\"\r\n\r\n//- rjf: [c]\r\n#include \"base/base_inc.c\"\r\n#include \"x64/x64.c\"\r\n#include \"linker/hash_table.c\"\r\n#include \"os/os_inc.c\"\r\n#include \"artifact_cache/artifact_cache.c\"\r\n#include \"rdi/rdi_local.c\"\r\n#include \"rdi_make/rdi_make_local.c\"\r\n#include \"mdesk/mdesk.c\"\r\n#include \"config/config_inc.c\"\r\n#include \"content/content.c\"\r\n#include \"file_stream/file_stream.c\"\r\n#include \"text/text.c\"\r\n#include \"mutable_text/mutable_text.c\"\r\n#include \"coff/coff.c\"\r\n#include \"coff/coff_parse.c\"\r\n#include \"pe/pe.c\"\r\n#include \"elf/elf.c\"\r\n#include \"gnu/gnu.c\"\r\n#include \"elf/elf_parse.c\"\r\n#include \"elf/elf_dump.c\"\r\n#include \"codeview/codeview.c\"\r\n#include \"codeview/codeview_parse.c\"\r\n#include \"msf/msf.c\"\r\n#include \"msf/msf_parse.c\"\r\n#include \"pdb/pdb.c\"\r\n#include \"pdb/pdb_parse.c\"\r\n#include \"pdb/pdb_stringize.c\"\r\n#include \"dwarf/dwarf_inc.c\"\r\n#include \"rdi_from_coff/rdi_from_coff.c\"\r\n#include \"rdi_from_elf/rdi_from_elf.c\"\r\n#include \"rdi_from_pdb/rdi_from_pdb.c\"\r\n#include \"rdi_from_dwarf/rdi_from_dwarf.c\"\r\n#include \"radbin/radbin.c\"\r\n#include \"regs/regs.c\"\r\n#include \"regs/rdi/regs_rdi.c\"\r\n#include \"dbg_info/dbg_info.c\"\r\n#include \"disasm/disasm.c\"\r\n#include \"stap/stap_parse.c\"\r\n#include \"demon/demon_inc.c\"\r\n#include \"eval/eval_inc.c\"\r\n#include \"eval_visualization/eval_visualization_inc.c\"\r\n#include \"ctrl/ctrl_inc.c\"\r\n#include \"font_provider/font_provider_inc.c\"\r\n#include \"render/render_inc.c\"\r\n#include \"font_cache/font_cache.c\"\r\n#include \"draw/draw.c\"\r\n#include \"ui/ui_inc.c\"\r\n#include \"dbg_engine/dbg_engine_inc.c\"\r\n#include \"raddbg/raddbg_inc.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Execution Types\r\n\r\ntypedef enum ExecMode\r\n{\r\n  ExecMode_Normal,\r\n  ExecMode_IPCSender,\r\n  ExecMode_BinaryUtility,\r\n  ExecMode_Help,\r\n}\r\nExecMode;\r\n\r\ntypedef struct IPCInfo IPCInfo;\r\nstruct IPCInfo\r\n{\r\n  U64 msg_size;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\n//- rjf: IPC resources\r\n#define IPC_SHARED_MEMORY_BUFFER_SIZE MB(4)\r\nStaticAssert(IPC_SHARED_MEMORY_BUFFER_SIZE > sizeof(IPCInfo), ipc_buffer_size_requirement);\r\nglobal Semaphore ipc_sender2main_signal_semaphore = {0};\r\nglobal Semaphore ipc_sender2main_lock_semaphore = {0};\r\nglobal U8 *ipc_sender2main_shared_memory_base = 0;\r\nglobal Semaphore ipc_main2sender_signal_semaphore = {0};\r\nglobal Semaphore ipc_main2sender_lock_semaphore = {0};\r\nglobal U8 *ipc_main2sender_shared_memory_base = 0;\r\nglobal U8  ipc_s2m_ring_buffer[MB(4)] = {0};\r\nglobal U64 ipc_s2m_ring_write_pos = 0;\r\nglobal U64 ipc_s2m_ring_read_pos = 0;\r\nglobal Mutex ipc_s2m_ring_mutex = {0};\r\nglobal CondVar ipc_s2m_ring_cv = {0};\r\n\r\n////////////////////////////////\r\n//~ rjf: IPC Signaler Thread\r\n\r\ninternal void\r\nipc_signaler_thread__entry_point(void *p)\r\n{\r\n  ThreadNameF(\"rd_ipc_signaler_thread\");\r\n  for(;;)\r\n  {\r\n    if(os_semaphore_take(ipc_sender2main_signal_semaphore, max_U64))\r\n    {\r\n      if(os_semaphore_take(ipc_sender2main_lock_semaphore, max_U64))\r\n      {\r\n        IPCInfo *ipc_info = (IPCInfo *)ipc_sender2main_shared_memory_base;\r\n        String8 msg = str8((U8 *)(ipc_info+1), ipc_info->msg_size);\r\n        msg.size = Min(msg.size, IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo));\r\n        MutexScope(ipc_s2m_ring_mutex) for(;;)\r\n        {\r\n          U64 unconsumed_size = ipc_s2m_ring_write_pos - ipc_s2m_ring_read_pos;\r\n          U64 available_size = (sizeof(ipc_s2m_ring_buffer) - unconsumed_size);\r\n          if(available_size >= sizeof(U64)+sizeof(msg.size))\r\n          {\r\n            ipc_s2m_ring_write_pos += ring_write_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, &msg.size);\r\n            ipc_s2m_ring_write_pos += ring_write(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_write_pos, msg.str, msg.size);\r\n            break;\r\n          }\r\n          cond_var_wait(ipc_s2m_ring_cv, ipc_s2m_ring_mutex, max_U64);\r\n        }\r\n        cond_var_broadcast(ipc_s2m_ring_cv);\r\n        os_send_wakeup_event();\r\n        ipc_info->msg_size = 0;\r\n        os_semaphore_drop(ipc_sender2main_lock_semaphore);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Ctrl -> Main Thread Wakeup Hook\r\n\r\ninternal CTRL_WAKEUP_FUNCTION_DEF(wakeup_hook_ctrl)\r\n{\r\n  os_send_wakeup_event();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Per-Frame Entry Point\r\n\r\ninternal B32\r\nframe(void)\r\n{\r\n  rd_frame();\r\n  return rd_state->quit;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Entry Point\r\n\r\ninternal void\r\nentry_point(CmdLine *cmd_line)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: unpack command line arguments\r\n  ExecMode exec_mode = ExecMode_Normal;\r\n  B32 auto_run = 0;\r\n  B32 auto_step = 0;\r\n  B32 jit_attach = 0;\r\n  U64 jit_pid = 0;\r\n  U64 jit_code = 0;\r\n  U64 jit_addr = 0;\r\n  {\r\n    if(cmd_line_has_flag(cmd_line, str8_lit(\"ipc\")))\r\n    {\r\n      exec_mode = ExecMode_IPCSender;\r\n    }\r\n    else if(cmd_line_has_flag(cmd_line, str8_lit(\"bin\")))\r\n    {\r\n      exec_mode = ExecMode_BinaryUtility;\r\n    }\r\n    else if(cmd_line_has_flag(cmd_line, str8_lit(\"?\")) ||\r\n            cmd_line_has_flag(cmd_line, str8_lit(\"help\")))\r\n    {\r\n      exec_mode = ExecMode_Help;\r\n    }\r\n    auto_run = cmd_line_has_flag(cmd_line, str8_lit(\"auto_run\"));\r\n    auto_step = cmd_line_has_flag(cmd_line, str8_lit(\"auto_step\"));\r\n    String8 jit_pid_string = cmd_line_string(cmd_line, str8_lit(\"jit_pid\"));\r\n    String8 jit_code_string = cmd_line_string(cmd_line, str8_lit(\"jit_code\"));\r\n    String8 jit_addr_string = cmd_line_string(cmd_line, str8_lit(\"jit_addr\"));\r\n    try_u64_from_str8_c_rules(jit_pid_string, &jit_pid);\r\n    try_u64_from_str8_c_rules(jit_code_string, &jit_code);\r\n    try_u64_from_str8_c_rules(jit_addr_string, &jit_addr);\r\n    jit_attach = (jit_addr != 0);\r\n  }\r\n  \r\n  //- rjf: dispatch to top-level codepath based on execution mode\r\n  switch(exec_mode)\r\n  {\r\n    //- rjf: normal execution\r\n    default:\r\n    case ExecMode_Normal:\r\n    {\r\n      //- rjf: windows -> turn off output handles, as we need to control those for target processes\r\n#if OS_WINDOWS\r\n      HANDLE output_handles[3] =\r\n      {\r\n        GetStdHandle(STD_INPUT_HANDLE),\r\n        GetStdHandle(STD_OUTPUT_HANDLE),\r\n        GetStdHandle(STD_ERROR_HANDLE),\r\n      };\r\n      for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1)\r\n      {\r\n        B32 duplicate = 0;\r\n        for(U64 idx2 = 0; idx2 < idx; idx2 += 1)\r\n        {\r\n          if(output_handles[idx2] == output_handles[idx])\r\n          {\r\n            duplicate = 1;\r\n            break;\r\n          }\r\n        }\r\n        if(duplicate)\r\n        {\r\n          output_handles[idx] = 0;\r\n        }\r\n      }\r\n      for(U64 idx = 0; idx < ArrayCount(output_handles); idx += 1)\r\n      {\r\n        if(output_handles[idx] != 0)\r\n        {\r\n          CloseHandle(output_handles[idx]);\r\n        }\r\n      }\r\n      SetStdHandle(STD_INPUT_HANDLE, 0);\r\n      SetStdHandle(STD_OUTPUT_HANDLE, 0);\r\n      SetStdHandle(STD_ERROR_HANDLE, 0);\r\n#endif\r\n      \r\n      //- rjf: manual layer initialization\r\n      {\r\n        dmn_init();\r\n        ctrl_init();\r\n        os_gfx_init();\r\n        fp_init();\r\n        r_init(cmd_line);\r\n        fnt_init();\r\n        d_init();\r\n        rd_init(cmd_line);\r\n        ctrl_set_wakeup_hook(wakeup_hook_ctrl);\r\n      }\r\n      \r\n      //- rjf: set up shared resources for ipc to this instance; launch IPC signaler thread\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        U32 instance_pid = os_get_process_info()->pid;\r\n        \r\n        // rjf: set up cross-process sender -> main ring buffer\r\n        String8 ipc_sender2main_shared_memory_name = push_str8f(scratch.arena, \"_raddbg_ipc_sender2main_shared_memory_%i_\", instance_pid);\r\n        String8 ipc_sender2main_signal_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_sender2main_signal_semaphore_%i_\", instance_pid);\r\n        String8 ipc_sender2main_lock_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_sender2main_lock_semaphore_%i_\", instance_pid);\r\n        OS_Handle ipc_sender2main_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_sender2main_shared_memory_name);\r\n        ipc_sender2main_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_sender2main_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE));\r\n        ipc_sender2main_signal_semaphore = semaphore_alloc(0, 1, ipc_sender2main_signal_semaphore_name);\r\n        ipc_sender2main_lock_semaphore = semaphore_alloc(1, 1, ipc_sender2main_lock_semaphore_name);\r\n        \r\n        // rjf: set up cross-process main -> sender ring buffer\r\n        String8 ipc_main2sender_shared_memory_name = push_str8f(scratch.arena, \"_raddbg_ipc_main2sender_shared_memory_%i_\", instance_pid);\r\n        String8 ipc_main2sender_signal_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_main2sender_signal_semaphore_%i_\", instance_pid);\r\n        String8 ipc_main2sender_lock_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_main2sender_lock_semaphore_%i_\", instance_pid);\r\n        OS_Handle ipc_main2sender_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_main2sender_shared_memory_name);\r\n        ipc_main2sender_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_main2sender_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE));\r\n        ipc_main2sender_signal_semaphore = semaphore_alloc(0, 1, ipc_main2sender_signal_semaphore_name);\r\n        ipc_main2sender_lock_semaphore = semaphore_alloc(1, 1, ipc_main2sender_lock_semaphore_name);\r\n        \r\n        // rjf: set up ipc-receiver -> main thread ring buffer; launch signaler thread\r\n        ipc_s2m_ring_mutex = mutex_alloc();\r\n        ipc_s2m_ring_cv = cond_var_alloc();\r\n        IPCInfo *ipc_info = (IPCInfo *)ipc_sender2main_shared_memory_base;\r\n        if(ipc_sender2main_shared_memory_base != 0)\r\n        {\r\n          MemoryZeroStruct(ipc_info);\r\n          thread_launch(ipc_signaler_thread__entry_point, 0);\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n      \r\n      //- rjf: main application loop\r\n      {\r\n        for(B32 quit = 0; !quit;)\r\n        {\r\n          //- rjf: consume IPC messages, dispatch UI commands\r\n          B32 ipc_command_frame = 0;\r\n          {\r\n            Temp scratch = scratch_begin(0, 0);\r\n            B32 consumed = 0;\r\n            String8 msg = {0};\r\n            MutexScope(ipc_s2m_ring_mutex)\r\n            {\r\n              U64 unconsumed_size = ipc_s2m_ring_write_pos - ipc_s2m_ring_read_pos;\r\n              if(unconsumed_size >= sizeof(U64))\r\n              {\r\n                consumed = 1;\r\n                ipc_command_frame = 1;\r\n                ipc_s2m_ring_read_pos += ring_read_struct(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, &msg.size);\r\n                msg.size = Min(msg.size, unconsumed_size);\r\n                msg.str = push_array(scratch.arena, U8, msg.size);\r\n                ipc_s2m_ring_read_pos += ring_read(ipc_s2m_ring_buffer, sizeof(ipc_s2m_ring_buffer), ipc_s2m_ring_read_pos, msg.str, msg.size);\r\n              }\r\n            }\r\n            if(consumed)\r\n            {\r\n              cond_var_broadcast(ipc_s2m_ring_cv);\r\n            }\r\n            if(msg.size != 0)\r\n            {\r\n              log_infof(\"ipc_msg: \\\"%S\\\"\", msg);\r\n              RD_WindowState *dst_ws = rd_state->first_window_state;\r\n              for(RD_WindowState *ws = dst_ws; ws != &rd_nil_window_state; ws = ws->order_next)\r\n              {\r\n                if(os_window_is_focused(ws->os))\r\n                {\r\n                  dst_ws = ws;\r\n                  break;\r\n                }\r\n              }\r\n              if(dst_ws != &rd_nil_window_state)\r\n              {\r\n                dst_ws->window_temporarily_focused_ipc = 1;\r\n                RD_RegsScope()\r\n                {\r\n                  if(dst_ws->cfg_id != rd_regs()->window)\r\n                  {\r\n                    Temp scratch = scratch_begin(0, 0);\r\n                    CFG_PanelTree panel_tree = cfg_panel_tree_from_cfg(scratch.arena, cfg_node_from_id(dst_ws->cfg_id));\r\n                    rd_regs()->window = dst_ws->cfg_id;\r\n                    rd_regs()->panel  = panel_tree.focused->cfg->id;\r\n                    rd_regs()->tab    = panel_tree.focused->selected_tab->id;\r\n                    rd_regs()->view   = panel_tree.focused->selected_tab->id;\r\n                    scratch_end(scratch);\r\n                  }\r\n                  rd_cmd(RD_CmdKind_RunExternalDriverTextCommand, .string = msg);\r\n                  rd_request_frame();\r\n                }\r\n              }\r\n            }\r\n            scratch_end(scratch);\r\n          }\r\n          \r\n          //- rjf: update\r\n          quit = update();\r\n          \r\n          //- rjf: auto run\r\n          if(auto_run)\r\n          {\r\n            auto_run = 0;\r\n            rd_cmd(RD_CmdKind_Run);\r\n          }\r\n          \r\n          //- rjf: auto step\r\n          if(auto_step)\r\n          {\r\n            auto_step = 0;\r\n            rd_cmd(RD_CmdKind_StepInto);\r\n          }\r\n          \r\n          //- rjf: jit attach\r\n          if(jit_attach)\r\n          {\r\n            jit_attach = 0;\r\n            rd_cmd(RD_CmdKind_Attach, .pid = jit_pid);\r\n          }\r\n          \r\n          //- rjf: gather command outputs & write them\r\n          if(ipc_command_frame)\r\n          {\r\n            if(ipc_main2sender_shared_memory_base != 0 &&\r\n               os_semaphore_take(ipc_main2sender_lock_semaphore, os_now_microseconds()+5000000))\r\n            {\r\n              IPCInfo *ipc_info = (IPCInfo *)ipc_main2sender_shared_memory_base;\r\n              U8 *buffer = (U8 *)(ipc_info+1);\r\n              U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo);\r\n              StringJoin join = {str8_lit(\"\"), str8_lit(\"\\0\"), str8_lit(\"\")};\r\n              String8 msg = str8_list_join(scratch.arena, &rd_state->cmd_outputs, &join);\r\n              ipc_info->msg_size = Min(buffer_max, msg.size);\r\n              MemoryCopy(buffer, msg.str, ipc_info->msg_size);\r\n              os_semaphore_drop(ipc_main2sender_signal_semaphore);\r\n              os_semaphore_drop(ipc_main2sender_lock_semaphore);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n    }break;\r\n    \r\n    //- rjf: inter-process communication message sender\r\n    case ExecMode_IPCSender:\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      \r\n      //- rjf: grab explicit PID argument\r\n      U32 dst_pid = 0;\r\n      if(cmd_line_has_argument(cmd_line, str8_lit(\"pid\")))\r\n      {\r\n        String8 dst_pid_string = cmd_line_string(cmd_line, str8_lit(\"pid\"));\r\n        U64 dst_pid_u64 = 0;\r\n        if(dst_pid_string.size != 0 &&\r\n           try_u64_from_str8_c_rules(dst_pid_string, &dst_pid_u64))\r\n        {\r\n          dst_pid = (U32)dst_pid_u64;\r\n        }\r\n      }\r\n      \r\n      //- rjf: no explicit PID? -> find PID to send message to, by looking for other raddbg instances\r\n      if(dst_pid == 0)\r\n      {\r\n        U32 this_pid = os_get_process_info()->pid;\r\n        DMN_ProcessIter it = {0};\r\n        dmn_process_iter_begin(&it);\r\n        for(DMN_ProcessInfo info = {0}; dmn_process_iter_next(scratch.arena, &it, &info);)\r\n        {\r\n          if(str8_match(str8_skip_last_slash(str8_chop_last_dot(cmd_line->exe_name)), str8_skip_last_slash(str8_chop_last_dot(info.name)), StringMatchFlag_CaseInsensitive) &&\r\n             this_pid != info.pid)\r\n          {\r\n            dst_pid = info.pid;\r\n            break;\r\n          }\r\n        }\r\n        dmn_process_iter_end(&it);\r\n      }\r\n      \r\n      //- rjf: grab destination instance's shared memory resources\r\n      String8 ipc_sender2main_shared_memory_name = push_str8f(scratch.arena, \"_raddbg_ipc_sender2main_shared_memory_%i_\", dst_pid);\r\n      String8 ipc_sender2main_signal_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_sender2main_signal_semaphore_%i_\", dst_pid);\r\n      String8 ipc_sender2main_lock_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_sender2main_lock_semaphore_%i_\", dst_pid);\r\n      OS_Handle ipc_sender2main_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_sender2main_shared_memory_name);\r\n      ipc_sender2main_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_sender2main_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE));\r\n      ipc_sender2main_signal_semaphore = os_semaphore_alloc(0, 1, ipc_sender2main_signal_semaphore_name);\r\n      ipc_sender2main_lock_semaphore = os_semaphore_alloc(1, 1, ipc_sender2main_lock_semaphore_name);\r\n      String8 ipc_main2sender_shared_memory_name = push_str8f(scratch.arena, \"_raddbg_ipc_main2sender_shared_memory_%i_\", dst_pid);\r\n      String8 ipc_main2sender_signal_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_main2sender_signal_semaphore_%i_\", dst_pid);\r\n      String8 ipc_main2sender_lock_semaphore_name = push_str8f(scratch.arena, \"_raddbg_ipc_main2sender_lock_semaphore_%i_\", dst_pid);\r\n      OS_Handle ipc_main2sender_shared_memory = os_shared_memory_alloc(IPC_SHARED_MEMORY_BUFFER_SIZE, ipc_main2sender_shared_memory_name);\r\n      ipc_main2sender_shared_memory_base = (U8 *)os_shared_memory_view_open(ipc_main2sender_shared_memory, r1u64(0, IPC_SHARED_MEMORY_BUFFER_SIZE));\r\n      ipc_main2sender_signal_semaphore = os_semaphore_alloc(0, 1, ipc_main2sender_signal_semaphore_name);\r\n      ipc_main2sender_lock_semaphore = os_semaphore_alloc(1, 1, ipc_main2sender_lock_semaphore_name);\r\n      \r\n      //- rjf: got resources -> write message\r\n      B32 wrote_message = 0;\r\n      if(dst_pid != 0 &&\r\n         ipc_sender2main_shared_memory_base != 0 &&\r\n         os_semaphore_take(ipc_sender2main_lock_semaphore, max_U64))\r\n      {\r\n        wrote_message = 1;\r\n        IPCInfo *ipc_info = (IPCInfo *)ipc_sender2main_shared_memory_base;\r\n        U8 *buffer = (U8 *)(ipc_info+1);\r\n        U64 buffer_max = IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo);\r\n        String8List parts = {0};\r\n        {\r\n          for EachIndex(idx, cmd_line->argc-1)\r\n          {\r\n            str8_list_push(scratch.arena, &parts, str8_cstring(cmd_line->argv[idx+1]));\r\n          }\r\n        }\r\n        StringJoin join = {str8_lit(\"\"), str8_lit(\" \"), str8_lit(\"\")};\r\n        String8 msg = str8_list_join(scratch.arena, &parts, &join);\r\n        ipc_info->msg_size = Min(buffer_max, msg.size);\r\n        MemoryCopy(buffer, msg.str, ipc_info->msg_size);\r\n        os_semaphore_drop(ipc_sender2main_signal_semaphore);\r\n        os_semaphore_drop(ipc_sender2main_lock_semaphore);\r\n      }\r\n      \r\n      //- rjf: wrote message -> wait for outputs, read outputs\r\n      String8List outputs = {0};\r\n      if(wrote_message &&\r\n         ipc_main2sender_shared_memory_base != 0 &&\r\n         os_semaphore_take(ipc_main2sender_signal_semaphore, os_now_microseconds()+10000000))\r\n      {\r\n        if(os_semaphore_take(ipc_main2sender_lock_semaphore, max_U64))\r\n        {\r\n          IPCInfo *ipc_info = (IPCInfo *)ipc_main2sender_shared_memory_base;\r\n          String8 msg = str8((U8 *)(ipc_info+1), ipc_info->msg_size);\r\n          msg.size = Min(msg.size, IPC_SHARED_MEMORY_BUFFER_SIZE - sizeof(IPCInfo));\r\n          U8 split_char = 0;\r\n          outputs = str8_split(scratch.arena, msg, &split_char, 1, 0);\r\n          os_semaphore_drop(ipc_main2sender_lock_semaphore);\r\n        }\r\n      }\r\n      \r\n      //- rjf: write outputs to stdout\r\n      for(String8Node *n = outputs.first; n != 0; n = n->next)\r\n      {\r\n        fwrite(n->string.str, 1, n->string.size, stdout);\r\n      }\r\n      fflush(stdout);\r\n      \r\n      scratch_end(scratch);\r\n    }break;\r\n    \r\n    //- rjf: built-in binary utility mode\r\n    case ExecMode_BinaryUtility:\r\n    {\r\n      rb_entry_point(cmd_line);\r\n      di_signal_completion();\r\n    }break;\r\n    \r\n    //- rjf: help message box\r\n    case ExecMode_Help:\r\n    {\r\n      os_graphical_message(0,\r\n                           str8_lit(\"The RAD Debugger - Help\"),\r\n                           str8_lit(\"The following options may be used when starting the RAD Debugger from the command line:\\n\\n\"\r\n                                    \"--user:<path>\\n\"\r\n                                    \"Use to specify the location of a user file which should be used. User files are used to store settings for users, including window and panel setups, path mapping, and visual settings. If this file does not exist, it will be created as necessary. This file will be autosaved as user-related changes are made.\\n\\n\"\r\n                                    \"--project:<path>\\n\"\r\n                                    \"Use to specify the location of a project file which should be used. Project files are used to store settings for users and projects. If this file does not exist, it will be created as necessary. This file will be autosaved as project-related changes are made.\\n\\n\"\r\n                                    \"--auto_step\\n\"\r\n                                    \"This will step into all active targets after the debugger initially starts.\\n\\n\"\r\n                                    \"--auto_run\\n\"\r\n                                    \"This will run all active targets after the debugger initially starts.\\n\\n\"\r\n                                    \"--quit_after_success (or -q)\\n\"\r\n                                    \"This will close the debugger automatically after all processes exit, if they all exited successfully (with code 0), and ran with no interruptions.\\n\\n\"\r\n                                    \"--ipc <command>\\n\"\r\n                                    \"This will launch the debugger in the non-graphical IPC mode, which is used to communicate with another running instance of the debugger. The debugger instance will launch, send the specified command, then immediately terminate. This may be used by editors or other programs to control the debugger.\\n\\n\"));\r\n    }break;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n"
  },
  {
    "path": "src/raddbg/raddbg_views.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Code Views\r\n\r\ninternal void\r\nrd_code_view_init(RD_CodeViewState *cv)\r\n{\r\n  ProfBeginFunction();\r\n  if(cv->initialized == 0)\r\n  {\r\n    cv->initialized = 1;\r\n    cv->preferred_column = 1;\r\n    cv->find_text_arena = rd_push_view_arena();\r\n    cv->center_cursor = 1;\r\n    rd_store_view_loading_info(1, 0, 0);\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\ninternal RD_CodeViewBuildResult\r\nrd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack state\r\n  //\r\n  UI_ScrollPt2 scroll_pos = rd_view_scroll_pos();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: extract invariants\r\n  //\r\n  F32 main_font_size = ui_bottom_font_size();\r\n  FNT_Tag code_font = rd_font_from_slot(RD_FontSlot_Code);\r\n  F32 code_font_size = ui_top_font_size();\r\n  F32 code_tab_size = fnt_column_size_from_tag_size(code_font, code_font_size)*rd_setting_u64_from_name(str8_lit(\"tab_width\"));\r\n  FNT_Metrics code_font_metrics = fnt_metrics_from_tag_size(code_font, code_font_size);\r\n  F32 code_line_height = ceil_f32(fnt_line_height_from_metrics(&code_font_metrics) * 1.5f);\r\n  F32 big_glyph_advance = fnt_dim_from_tag_size_string(code_font, code_font_size, 0, 0, str8_lit(\"H\")).x;\r\n  Vec2F32 panel_box_dim = dim_2f32(rect);\r\n  F32 scroll_bar_dim = floor_f32(main_font_size*1.5f);\r\n  Vec2F32 code_area_dim = v2f32(panel_box_dim.x - scroll_bar_dim, panel_box_dim.y - scroll_bar_dim);\r\n  S64 num_possible_visible_lines = (S64)(code_area_dim.y/code_line_height)+1;\r\n  CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n  CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n  B32 do_line_numbers = rd_setting_b32_from_name(str8_lit(\"show_line_numbers\"));\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack information about the viewed source file, if any\r\n  //\r\n  String8 file_path = rd_regs()->file_path;\r\n  String8List file_path_possible_overrides = rd_possible_overrides_from_file_path(scratch.arena, file_path);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: process commands\r\n  //\r\n  for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);)\r\n  {\r\n    RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n    switch(kind)\r\n    {\r\n      default: break;\r\n      case RD_CmdKind_GoToLine:\r\n      {\r\n        cv->goto_line_num = cmd->regs->cursor.line;\r\n      }break;\r\n      case RD_CmdKind_CenterCursor:\r\n      {\r\n        cv->center_cursor = 1;\r\n      }break;\r\n      case RD_CmdKind_ContainCursor:\r\n      {\r\n        cv->contain_cursor = 1;\r\n      }break;\r\n      case RD_CmdKind_Search:\r\n      {\r\n        arena_clear(cv->find_text_arena);\r\n        cv->find_text_fwd = push_str8_copy(cv->find_text_arena, cmd->regs->string);\r\n      }break;\r\n      case RD_CmdKind_SearchBackwards:\r\n      {\r\n        arena_clear(cv->find_text_arena);\r\n        cv->find_text_bwd = push_str8_copy(cv->find_text_arena, cmd->regs->string);\r\n      }break;\r\n      case RD_CmdKind_FindNext:\r\n      {\r\n        String8 string = rd_view_query_input();\r\n        arena_clear(cv->find_text_arena);\r\n        cv->find_text_fwd = push_str8_copy(cv->find_text_arena, string);\r\n      }break;\r\n      case RD_CmdKind_FindPrev:\r\n      {\r\n        String8 string = rd_view_query_input();\r\n        arena_clear(cv->find_text_arena);\r\n        cv->find_text_bwd = push_str8_copy(cv->find_text_arena, string);\r\n      }break;\r\n      case RD_CmdKind_ToggleWatchExpressionAtMouse:\r\n      {\r\n        cv->watch_expr_at_mouse = 1;\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: set up wrap cache\r\n  //\r\n  if(cv->wrap_arena == 0)\r\n  {\r\n    cv->wrap_arena = rd_push_view_arena();\r\n  }\r\n  if(cv->wrap_total_vline_count == 0)\r\n  {\r\n    arena_clear(cv->wrap_arena);\r\n    cv->wrap_total_vline_count = text_info->lines_count;\r\n    cv->wrap_cache_slots_count = text_info->lines_count/64;\r\n    cv->wrap_cache_slots = push_array(cv->wrap_arena, RD_CodeViewTLineWrapCacheSlot, cv->wrap_cache_slots_count);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine visible line range / count\r\n  //\r\n  Rng1S64 visible_line_num_range = r1s64(scroll_pos.y.idx + (S64)(scroll_pos.y.off) + 1 - !!(scroll_pos.y.off < 0),\r\n                                         scroll_pos.y.idx + (S64)(scroll_pos.y.off) + 1 + num_possible_visible_lines);\r\n  Rng1S64 target_visible_line_num_range = r1s64(scroll_pos.y.idx + 1,\r\n                                                scroll_pos.y.idx + 1 + num_possible_visible_lines);\r\n  U64 visible_line_count = 0;\r\n  {\r\n    visible_line_num_range.min = Clamp(1, visible_line_num_range.min, (S64)text_info->lines_count);\r\n    visible_line_num_range.max = Clamp(1, visible_line_num_range.max, (S64)text_info->lines_count);\r\n    visible_line_num_range.min = Max(1, visible_line_num_range.min);\r\n    visible_line_num_range.max = Max(1, visible_line_num_range.max);\r\n    target_visible_line_num_range.min = Clamp(1, target_visible_line_num_range.min, (S64)text_info->lines_count);\r\n    target_visible_line_num_range.max = Clamp(1, target_visible_line_num_range.max, (S64)text_info->lines_count);\r\n    target_visible_line_num_range.min = Max(1, target_visible_line_num_range.min);\r\n    target_visible_line_num_range.max = Max(1, target_visible_line_num_range.max);\r\n    visible_line_count = (U64)dim_1s64(visible_line_num_range)+1;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate scroll bounds\r\n  //\r\n  S64 line_size_x = 0;\r\n  Rng1S64 scroll_idx_rng[Axis2_COUNT] = {0};\r\n  {\r\n    line_size_x = (text_info->lines_max_size*big_glyph_advance*3)/2;\r\n    line_size_x = ClampBot(line_size_x, (S64)big_glyph_advance*120);\r\n    line_size_x = ClampBot(line_size_x, (S64)code_area_dim.x);\r\n    scroll_idx_rng[Axis2_X] = r1s64(0, line_size_x-(S64)code_area_dim.x);\r\n    scroll_idx_rng[Axis2_Y] = r1s64(0, (S64)text_info->lines_count-1);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate line-range-dependent info\r\n  //\r\n  F32 line_num_width_px = 0;\r\n  if(do_line_numbers)\r\n  {\r\n    line_num_width_px = floor_f32(big_glyph_advance * (log10(visible_line_num_range.max) + 3));\r\n  }\r\n  F32 priority_margin_width_px = 0;\r\n  F32 catchall_margin_width_px = 0;\r\n  if(flags & RD_CodeViewBuildFlag_Margins)\r\n  {\r\n    priority_margin_width_px = floor_f32(big_glyph_advance*3.5f);\r\n    catchall_margin_width_px = floor_f32(big_glyph_advance*3.5f);\r\n  }\r\n  TXT_LineTokensSlice slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, text_info, text_data, visible_line_num_range);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: selection on single line, no query? -> set search text\r\n  //\r\n  if(rd_regs()->cursor.line == rd_regs()->mark.line)\r\n  {\r\n    CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n    RD_ViewState *vs = rd_view_state_from_cfg(view);\r\n    if(!vs->query_is_open)\r\n    {\r\n      CFG_Node *query = cfg_node_child_from_string_or_alloc(rd_state->cfg, view, str8_lit(\"query\"));\r\n      CFG_Node *input = cfg_node_child_from_string_or_alloc(rd_state->cfg, query, str8_lit(\"input\"));\r\n      String8 text = txt_string_from_info_data_txt_rng(text_info, text_data, txt_rng(rd_regs()->cursor, rd_regs()->mark));\r\n      if(text.size < 256)\r\n      {\r\n        cfg_node_new_replace(rd_state->cfg, input, text);\r\n      }\r\n      else\r\n      {\r\n        cfg_node_new_replace(rd_state->cfg, input, str8_zero());\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: get active search query\r\n  //\r\n  String8 search_query = rd_view_query_input();\r\n  B32 search_query_is_active = 0;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: prepare code slice info bundle, for the viewable region of text\r\n  //\r\n  RD_CodeSliceParams code_slice_params = {0};\r\n  {\r\n    // rjf: fill basics\r\n    code_slice_params.flags = RD_CodeSliceFlag_Clickable;\r\n    if(do_line_numbers)\r\n    {\r\n      code_slice_params.flags |= RD_CodeSliceFlag_LineNums;\r\n    }\r\n    if(flags & RD_CodeViewBuildFlag_Margins)\r\n    {\r\n      code_slice_params.flags |= RD_CodeSliceFlag_PriorityMargin|RD_CodeSliceFlag_CatchallMargin;\r\n    }\r\n    code_slice_params.line_num_range            = visible_line_num_range;\r\n    code_slice_params.line_text                 = push_array(scratch.arena, String8, visible_line_count);\r\n    code_slice_params.line_ranges               = push_array(scratch.arena, Rng1U64, visible_line_count);\r\n    code_slice_params.line_tokens               = push_array(scratch.arena, TXT_TokenArray, visible_line_count);\r\n    code_slice_params.line_bps                  = push_array(scratch.arena, CFG_NodePtrList, visible_line_count);\r\n    code_slice_params.line_ips                  = push_array(scratch.arena, CTRL_EntityList, visible_line_count);\r\n    code_slice_params.line_pins                 = push_array(scratch.arena, CFG_NodePtrList, visible_line_count);\r\n    code_slice_params.line_vaddrs               = push_array(scratch.arena, U64, visible_line_count);\r\n    code_slice_params.line_infos                = push_array(scratch.arena, D_LineList, visible_line_count);\r\n    code_slice_params.text_info                 = text_info;\r\n    code_slice_params.text_data                 = text_data;\r\n    code_slice_params.font                      = code_font;\r\n    code_slice_params.font_size                 = code_font_size;\r\n    code_slice_params.tab_size                  = code_tab_size;\r\n    code_slice_params.line_height_px            = code_line_height;\r\n    code_slice_params.search_query              = search_query;\r\n    code_slice_params.priority_margin_width_px  = priority_margin_width_px;\r\n    code_slice_params.catchall_margin_width_px  = catchall_margin_width_px;\r\n    code_slice_params.line_num_width_px         = line_num_width_px;\r\n    code_slice_params.line_text_max_width_px    = (F32)line_size_x;\r\n    code_slice_params.margin_float_off_px       = scroll_pos.x.idx + floor_f32(scroll_pos.x.off);\r\n    \r\n    // rjf: fill text info\r\n    {\r\n      S64 line_num = visible_line_num_range.min;\r\n      U64 line_idx = visible_line_num_range.min-1;\r\n      for(U64 visible_line_idx = 0;\r\n          visible_line_idx < visible_line_count && line_idx < text_info->lines_count;\r\n          visible_line_idx += 1, line_idx += 1, line_num += 1)\r\n      {\r\n        code_slice_params.line_text[visible_line_idx]   = str8_substr(text_data, text_info->lines_ranges[line_idx]);\r\n        code_slice_params.line_ranges[visible_line_idx] = text_info->lines_ranges[line_idx];\r\n        code_slice_params.line_tokens[visible_line_idx] = slice.line_tokens[visible_line_idx];\r\n      }\r\n    }\r\n    \r\n    // rjf: find visible breakpoints for source code\r\n    if(!dasm_lines) ProfScope(\"find visible breakpoints for source code\")\r\n    {\r\n      CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n      for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *bp = n->v;\r\n        RD_Location loc = rd_location_from_cfg(bp);\r\n        if(visible_line_num_range.min <= loc.pt.line && loc.pt.line <= visible_line_num_range.max)\r\n        {\r\n          for(String8Node *override_n = file_path_possible_overrides.first;\r\n              override_n != 0;\r\n              override_n = override_n->next)\r\n          {\r\n            if(path_match_normalized(loc.file_path, override_n->string))\r\n            {\r\n              U64 slice_line_idx = (U64)(loc.pt.line-visible_line_num_range.min);\r\n              cfg_node_ptr_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp);\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: find live threads mapping to source code\r\n    if(!dasm_lines) ProfScope(\"find live threads mapping to this file\")\r\n    {\r\n      CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n      CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread);\r\n      for EachIndex(idx, threads.count)\r\n      {\r\n        CTRL_Entity *thread = threads.v[idx];\r\n        CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n        U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0;\r\n        U64 inline_depth = (thread == selected_thread) ? rd_regs()->inline_depth : 0;\r\n        U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);\r\n        U64 last_inst_on_unwound_rip_vaddr = rip_vaddr - !!unwind_count;\r\n        CTRL_Entity *module = ctrl_module_from_process_vaddr(process, last_inst_on_unwound_rip_vaddr);\r\n        U64 rip_voff = ctrl_voff_from_vaddr(module, last_inst_on_unwound_rip_vaddr);\r\n        DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n        D_LineList lines = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, rip_voff);\r\n        for(D_LineNode *n = lines.first; n != 0; n = n->next)\r\n        {\r\n          if(visible_line_num_range.min <= n->v.pt.line && n->v.pt.line <= visible_line_num_range.max)\r\n          {\r\n            for(String8Node *override_n = file_path_possible_overrides.first;\r\n                override_n != 0;\r\n                override_n = override_n->next)\r\n            {\r\n              if(path_match_normalized(n->v.file_path, override_n->string))\r\n              {\r\n                U64 slice_line_idx = n->v.pt.line-visible_line_num_range.min;\r\n                ctrl_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread);\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: find visible watch pins for source code\r\n    if(!dasm_lines) ProfScope(\"find visible watch pins for source code\")\r\n    {\r\n      CFG_NodePtrList wps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"watch_pin\"));\r\n      for(CFG_NodePtrNode *n = wps.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *wp = n->v;\r\n        RD_Location loc = rd_location_from_cfg(wp);\r\n        if(visible_line_num_range.min <= loc.pt.line && loc.pt.line <= visible_line_num_range.max)\r\n        {\r\n          for(String8Node *override_n = file_path_possible_overrides.first;\r\n              override_n != 0;\r\n              override_n = override_n->next)\r\n          {\r\n            if(path_match_normalized(loc.file_path, override_n->string))\r\n            {\r\n              U64 slice_line_idx = (loc.pt.line-visible_line_num_range.min);\r\n              cfg_node_ptr_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp);\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: find all src -> dasm info\r\n    if(!dasm_lines) ProfScope(\"find all src -> dasm info for source code\")\r\n    {\r\n      String8 file_path = rd_regs()->file_path;\r\n      CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->module);\r\n      DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n      D_LineListArray lines_array = d_lines_array_from_dbgi_key_file_path_line_range(scratch.arena, dbgi_key, file_path, visible_line_num_range);\r\n      if(lines_array.count != 0)\r\n      {\r\n        MemoryCopy(code_slice_params.line_infos, lines_array.v, sizeof(D_LineList)*lines_array.count);\r\n      }\r\n      code_slice_params.relevant_dbgi_keys = lines_array.dbgi_keys;\r\n    }\r\n    \r\n    // rjf: find live threads mapping to disasm\r\n    if(dasm_lines) ProfScope(\"find live threads mapping to this disassembly\")\r\n    {\r\n      CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n      CTRL_EntityArray threads = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Thread);\r\n      for EachIndex(idx, threads.count)\r\n      {\r\n        CTRL_Entity *thread = threads.v[idx];\r\n        U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0;\r\n        U64 rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);\r\n        if(ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process) == process && contains_1u64(dasm_vaddr_range, rip_vaddr))\r\n        {\r\n          U64 rip_off = rip_vaddr - dasm_vaddr_range.min;\r\n          S64 line_num = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, rip_off)+1;\r\n          if(contains_1s64(visible_line_num_range, line_num))\r\n          {\r\n            U64 slice_line_idx = (line_num-visible_line_num_range.min);\r\n            ctrl_entity_list_push(scratch.arena, &code_slice_params.line_ips[slice_line_idx], thread);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: find breakpoints mapping to this disasm\r\n    if(dasm_lines) ProfScope(\"find breakpoints mapping to this disassembly\")\r\n    {\r\n      CFG_NodePtrList bps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"breakpoint\"));\r\n      for(CFG_NodePtrNode *n = bps.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *bp = n->v;\r\n        RD_Location loc = rd_location_from_cfg(bp);\r\n        E_Value loc_value = e_value_from_string(loc.expr);\r\n        if(contains_1u64(dasm_vaddr_range, loc_value.u64))\r\n        {\r\n          U64 off = loc_value.u64 - dasm_vaddr_range.min;\r\n          U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off);\r\n          S64 line_num = (S64)idx+1;\r\n          if(contains_1s64(visible_line_num_range, line_num))\r\n          {\r\n            U64 slice_line_idx = (line_num-visible_line_num_range.min);\r\n            cfg_node_ptr_list_push(scratch.arena, &code_slice_params.line_bps[slice_line_idx], bp);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: find watch pins mapping to this disasm\r\n    if(dasm_lines) ProfScope(\"find watch pins mapping to this disassembly\")\r\n    {\r\n      CFG_NodePtrList wps = cfg_node_top_level_list_from_string(scratch.arena, str8_lit(\"watch_pin\"));\r\n      for(CFG_NodePtrNode *n = wps.first; n != 0; n = n->next)\r\n      {\r\n        CFG_Node *wp = n->v;\r\n        RD_Location loc = rd_location_from_cfg(wp);\r\n        E_Value loc_value = e_value_from_string(loc.expr);\r\n        if(contains_1u64(dasm_vaddr_range, loc_value.u64))\r\n        {\r\n          U64 off = loc_value.u64 - dasm_vaddr_range.min;\r\n          U64 idx = dasm_line_array_idx_from_code_off__linear_scan(dasm_lines, off);\r\n          S64 line_num = (S64)idx+1;\r\n          if(contains_1s64(visible_line_num_range, line_num))\r\n          {\r\n            U64 slice_line_idx = (line_num-visible_line_num_range.min);\r\n            cfg_node_ptr_list_push(scratch.arena, &code_slice_params.line_pins[slice_line_idx], wp);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: fill dasm -> src info\r\n    if(dasm_lines)\r\n    {\r\n      CTRL_Entity *module = ctrl_module_from_process_vaddr(process, dasm_vaddr_range.min);\r\n      DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n      for(S64 line_num = visible_line_num_range.min; line_num < visible_line_num_range.max; line_num += 1)\r\n      {\r\n        U64 vaddr = dasm_vaddr_range.min + dasm_line_array_code_off_from_idx(dasm_lines, line_num-1);\r\n        U64 voff = ctrl_voff_from_vaddr(module, vaddr);\r\n        U64 slice_idx = line_num-visible_line_num_range.min;\r\n        code_slice_params.line_vaddrs[slice_idx] = vaddr;\r\n        code_slice_params.line_infos[slice_idx] = d_lines_from_dbgi_key_voff(scratch.arena, dbgi_key, voff);\r\n      }\r\n    }\r\n    \r\n    // rjf: add dasm dbgi key to relevant dbgis\r\n    if(dasm_lines != 0)\r\n    {\r\n      di_key_list_push(scratch.arena, &code_slice_params.relevant_dbgi_keys, dasm_dbgi_key);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build container\r\n  //\r\n  UI_Box *container_box = &ui_nil_box;\r\n  {\r\n    ui_set_next_pref_width(ui_px(code_area_dim.x, 1));\r\n    ui_set_next_pref_height(ui_px(code_area_dim.y, 1));\r\n    ui_set_next_child_layout_axis(Axis2_Y);\r\n    container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|\r\n                                              UI_BoxFlag_Scroll|\r\n                                              UI_BoxFlag_AllowOverflowX|\r\n                                              UI_BoxFlag_AllowOverflowY,\r\n                                              \"###code_area\");\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: cancelled search query -> center cursor\r\n  //\r\n  if(!search_query_is_active && cv->drifted_for_search)\r\n  {\r\n    cv->drifted_for_search = 0;\r\n    cv->center_cursor = 1;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do searching operations\r\n  //\r\n  {\r\n    //- rjf: find text (forward)\r\n    if(cv->find_text_fwd.size != 0)\r\n    {\r\n      B32 found = 0;\r\n      B32 first = 1;\r\n      S64 line_num_start = rd_regs()->cursor.line;\r\n      S64 line_num_last = (S64)text_info->lines_count;\r\n      for(S64 line_num = line_num_start; 1 <= line_num && line_num <= line_num_last; first = 0)\r\n      {\r\n        // rjf: gather line info\r\n        String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]);\r\n        U64 search_start = 0;\r\n        if(rd_regs()->cursor.line == line_num && first)\r\n        {\r\n          search_start = rd_regs()->cursor.column;\r\n        }\r\n        \r\n        // rjf: search string\r\n        U64 needle_pos = str8_find_needle(line_string, search_start, cv->find_text_fwd, StringMatchFlag_CaseInsensitive);\r\n        if(needle_pos < line_string.size)\r\n        {\r\n          rd_regs()->mark.line = line_num;\r\n          rd_regs()->mark.column = needle_pos+1;\r\n          rd_regs()->cursor = rd_regs()->mark;\r\n          rd_regs()->cursor.column += cv->find_text_fwd.size;\r\n          found = 1;\r\n          break;\r\n        }\r\n        \r\n        // rjf: break if circled back around to cursor\r\n        else if(line_num == line_num_start && !first)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: increment\r\n        line_num += 1;\r\n        if(line_num > line_num_last)\r\n        {\r\n          line_num = 1;\r\n        }\r\n      }\r\n      cv->center_cursor = found;\r\n      if(found == 0)\r\n      {\r\n        log_user_errorf(\"Could not find `%S`\", cv->find_text_fwd);\r\n      }\r\n    }\r\n    \r\n    //- rjf: find text (backward)\r\n    if(cv->find_text_bwd.size != 0)\r\n    {\r\n      B32 found = 0;\r\n      B32 first = 1;\r\n      TxtRng rng = txt_rng(rd_regs()->cursor, rd_regs()->mark);\r\n      S64 line_num_start = rng.min.line;\r\n      S64 line_num_last = (S64)text_info->lines_count;\r\n      for(S64 line_num = line_num_start; 1 <= line_num && line_num <= line_num_last; first = 0)\r\n      {\r\n        // rjf: gather line info\r\n        String8 line_string = str8_substr(text_data, text_info->lines_ranges[line_num-1]);\r\n        if(rng.min.line == line_num && first)\r\n        {\r\n          line_string = str8_prefix(line_string, rng.min.column-1);\r\n        }\r\n        \r\n        // rjf: search string\r\n        U64 next_needle_pos = line_string.size;\r\n        for(U64 needle_pos = 0; needle_pos < line_string.size;)\r\n        {\r\n          needle_pos = str8_find_needle(line_string, needle_pos, cv->find_text_bwd, StringMatchFlag_CaseInsensitive);\r\n          if(needle_pos < line_string.size)\r\n          {\r\n            next_needle_pos = needle_pos;\r\n            needle_pos += 1;\r\n          }\r\n        }\r\n        if(next_needle_pos < line_string.size)\r\n        {\r\n          rd_regs()->mark.line = line_num;\r\n          rd_regs()->mark.column = next_needle_pos+1;\r\n          rd_regs()->cursor = rd_regs()->mark;\r\n          rd_regs()->cursor.column += cv->find_text_bwd.size;\r\n          found = 1;\r\n          break;\r\n        }\r\n        \r\n        // rjf: break if circled back around to cursor line\r\n        else if(line_num == line_num_start && !first)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        // rjf: increment\r\n        line_num -= 1;\r\n        if(line_num == 0)\r\n        {\r\n          line_num = line_num_last;\r\n        }\r\n      }\r\n      cv->center_cursor = found;\r\n      if(found == 0)\r\n      {\r\n        log_user_errorf(\"Could not find `%S`\", cv->find_text_bwd);\r\n      }\r\n    }\r\n    \r\n    MemoryZeroStruct(&cv->find_text_fwd);\r\n    MemoryZeroStruct(&cv->find_text_bwd);\r\n    arena_clear(cv->find_text_arena);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do goto line\r\n  //\r\n  if(cv->goto_line_num != 0 && text_info->lines_count != 0)\r\n  {\r\n    S64 line_num = cv->goto_line_num;\r\n    cv->goto_line_num = 0;\r\n    line_num = Clamp(1, line_num, text_info->lines_count);\r\n    rd_regs()->cursor = rd_regs()->mark = txt_pt(line_num, 1);\r\n    cv->center_cursor = !cv->force_contain_only && (!cv->contain_cursor || (line_num < target_visible_line_num_range.min+4 || target_visible_line_num_range.max-4 < line_num));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do keyboard interaction\r\n  //\r\n  B32 snap[Axis2_COUNT] = {0};\r\n  UI_Focus(UI_FocusKind_On)\r\n  {\r\n    if(ui_is_focus_active() && visible_line_num_range.max >= visible_line_num_range.min)\r\n    {\r\n      snap[Axis2_X] = snap[Axis2_Y] = rd_do_txt_controls(text_info, text_data, ClampBot(num_possible_visible_lines, 10) - 10, &rd_regs()->cursor, &rd_regs()->mark, &cv->preferred_column);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build container contents\r\n  //\r\n  UI_Parent(container_box)\r\n  {\r\n    //- rjf: build fractional space\r\n    container_box->view_off.x = container_box->view_off_target.x = scroll_pos.x.idx + scroll_pos.x.off;\r\n    container_box->view_off.y = container_box->view_off_target.y = code_line_height*mod_f32(scroll_pos.y.off, 1.f) + code_line_height*(scroll_pos.y.off < 0) - code_line_height*(scroll_pos.y.off == -1.f && scroll_pos.y.idx == 1);\r\n    \r\n    //- rjf: build code slice\r\n    RD_CodeSliceSignal sig = {0};\r\n    UI_Focus(UI_FocusKind_On)\r\n    {\r\n      sig = rd_code_slicef(&code_slice_params, &rd_regs()->cursor, &rd_regs()->mark, &cv->preferred_column, \"code_slice\");\r\n    }\r\n    \r\n    //- rjf: press code slice? -> focus panel\r\n    if(ui_pressed(sig.base))\r\n    {\r\n      rd_cmd(RD_CmdKind_FocusPanel);\r\n    }\r\n    \r\n    //- rjf: dragging & outside region? -> contain cursor\r\n    if(ui_dragging(sig.base) && sig.base.event_flags == 0)\r\n    {\r\n      if(!contains_2f32(sig.base.box->rect, ui_mouse()))\r\n      {\r\n        cv->contain_cursor = 1;\r\n      }\r\n      else\r\n      {\r\n        snap[Axis2_X] = 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: ctrl+pressed? -> go to name\r\n    if(ui_pressed(sig.base) && sig.base.event_flags & OS_Modifier_Ctrl)\r\n    {\r\n      ui_kill_action();\r\n      rd_cmd(RD_CmdKind_GoToName, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng));\r\n    }\r\n    \r\n    //- rjf: watch expr at mouse\r\n    if(cv->watch_expr_at_mouse)\r\n    {\r\n      cv->watch_expr_at_mouse = 0;\r\n      rd_cmd(RD_CmdKind_ToggleWatchExpression, .string = txt_string_from_info_data_txt_rng(text_info, text_data, sig.mouse_expr_rng));\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: apply post-build view snapping rules\r\n  //\r\n  if(text_info->lines_count != 0)\r\n  {\r\n    TxtPt cursor = rd_regs()->cursor;\r\n    B32 cursor_in_range = (1 <= cursor.line && cursor.line <= text_info->lines_count);\r\n    \r\n    // rjf: contain => snap\r\n    if(cv->contain_cursor && text_info->lines_count != 0)\r\n    {\r\n      cv->contain_cursor = 0;\r\n      snap[Axis2_X] = 1;\r\n      snap[Axis2_Y] = 1;\r\n    }\r\n    \r\n    // rjf: center cursor\r\n    if(cv->center_cursor && text_info->lines_count != 0)\r\n    {\r\n      cv->center_cursor = 0;\r\n      if(cursor_in_range)\r\n      {\r\n        String8 cursor_line = str8_substr(text_data, text_info->lines_ranges[cursor.line-1]);\r\n        F32 cursor_advance = fnt_dim_from_tag_size_string(code_font, code_font_size, 0, code_tab_size, str8_prefix(cursor_line, cursor.column-1)).x;\r\n        \r\n        // rjf: scroll x\r\n        {\r\n          S64 new_idx = (S64)(cursor_advance - code_area_dim.x/2);\r\n          new_idx = Clamp(scroll_idx_rng[Axis2_X].min, new_idx, scroll_idx_rng[Axis2_X].max);\r\n          ui_scroll_pt_target_idx(&scroll_pos.x, new_idx);\r\n          snap[Axis2_X] = 0;\r\n        }\r\n        \r\n        // rjf: scroll y\r\n        {\r\n          S64 new_idx = (cursor.line-1) - num_possible_visible_lines/2 + 2;\r\n          new_idx = Clamp(scroll_idx_rng[Axis2_Y].min, new_idx, scroll_idx_rng[Axis2_Y].max);\r\n          ui_scroll_pt_target_idx(&scroll_pos.y, new_idx);\r\n          snap[Axis2_Y] = 0;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: snap in X\r\n    if(snap[Axis2_X] && cursor_in_range)\r\n    {\r\n      String8 cursor_line = str8_substr(text_data, text_info->lines_ranges[cursor.line-1]);\r\n      S64 cursor_off = (S64)(fnt_dim_from_tag_size_string(code_font, code_font_size, 0, code_tab_size, str8_prefix(cursor_line, cursor.column-1)).x + priority_margin_width_px + catchall_margin_width_px + line_num_width_px);\r\n      Rng1S64 visible_pixel_range =\r\n      {\r\n        scroll_pos.x.idx,\r\n        scroll_pos.x.idx + (S64)code_area_dim.x,\r\n      };\r\n      Rng1S64 cursor_pixel_range =\r\n      {\r\n        cursor_off - (S64)(big_glyph_advance*4) - (S64)(priority_margin_width_px + catchall_margin_width_px + line_num_width_px),\r\n        cursor_off + (S64)(big_glyph_advance*4),\r\n      };\r\n      S64 min_delta = Min(0, cursor_pixel_range.min - visible_pixel_range.min);\r\n      S64 max_delta = Max(0, cursor_pixel_range.max - visible_pixel_range.max);\r\n      S64 new_idx = scroll_pos.x.idx+min_delta+max_delta;\r\n      new_idx = Clamp(scroll_idx_rng[Axis2_X].min, new_idx, scroll_idx_rng[Axis2_X].max);\r\n      ui_scroll_pt_target_idx(&scroll_pos.x, new_idx);\r\n    }\r\n    \r\n    // rjf: snap in Y\r\n    if(snap[Axis2_Y])\r\n    {\r\n      Rng1S64 cursor_visibility_range = r1s64(cursor.line-4, cursor.line+4);\r\n      cursor_visibility_range.min = ClampBot(0, cursor_visibility_range.min);\r\n      cursor_visibility_range.max = ClampBot(0, cursor_visibility_range.max);\r\n      S64 min_delta = Min(0, cursor_visibility_range.min-(target_visible_line_num_range.min));\r\n      S64 max_delta = Max(0, cursor_visibility_range.max-(target_visible_line_num_range.min+num_possible_visible_lines));\r\n      S64 new_idx = scroll_pos.y.idx+min_delta+max_delta;\r\n      new_idx = Clamp(0, new_idx, (S64)text_info->lines_count-1);\r\n      ui_scroll_pt_target_idx(&scroll_pos.y, new_idx);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build horizontal scroll bar\r\n  //\r\n  {\r\n    ui_set_next_fixed_x(0);\r\n    ui_set_next_fixed_y(code_area_dim.y);\r\n    ui_set_next_fixed_width(panel_box_dim.x - scroll_bar_dim);\r\n    ui_set_next_fixed_height(scroll_bar_dim);\r\n    {\r\n      scroll_pos.x = ui_scroll_bar(Axis2_X,\r\n                                   ui_px(scroll_bar_dim, 1.f),\r\n                                   scroll_pos.x,\r\n                                   scroll_idx_rng[Axis2_X],\r\n                                   (S64)code_area_dim.x);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build vertical scroll bar\r\n  //\r\n  {\r\n    ui_set_next_fixed_x(code_area_dim.x);\r\n    ui_set_next_fixed_y(0);\r\n    ui_set_next_fixed_width(scroll_bar_dim);\r\n    ui_set_next_fixed_height(panel_box_dim.y - scroll_bar_dim);\r\n    {\r\n      scroll_pos.y = ui_scroll_bar(Axis2_Y,\r\n                                   ui_px(scroll_bar_dim, 1.f),\r\n                                   scroll_pos.y,\r\n                                   scroll_idx_rng[Axis2_Y],\r\n                                   num_possible_visible_lines);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: top-level container interaction (scrolling)\r\n  //\r\n  if(text_info->lines_count != 0)\r\n  {\r\n    UI_Signal sig = ui_signal_from_box(container_box);\r\n    if(sig.scroll.x != 0)\r\n    {\r\n      S64 new_idx = scroll_pos.x.idx+sig.scroll.x*big_glyph_advance;\r\n      new_idx = clamp_1s64(scroll_idx_rng[Axis2_X], new_idx);\r\n      ui_scroll_pt_target_idx(&scroll_pos.x, new_idx);\r\n    }\r\n    if(sig.scroll.y != 0)\r\n    {\r\n      S64 new_idx = scroll_pos.y.idx + sig.scroll.y;\r\n      new_idx = clamp_1s64(scroll_idx_rng[Axis2_Y], new_idx);\r\n      ui_scroll_pt_target_idx(&scroll_pos.y, new_idx);\r\n    }\r\n    ui_scroll_pt_clamp_idx(&scroll_pos.x, scroll_idx_rng[Axis2_X]);\r\n    ui_scroll_pt_clamp_idx(&scroll_pos.y, scroll_idx_rng[Axis2_Y]);\r\n    if(ui_mouse_over(sig))\r\n    {\r\n      for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n      {\r\n        if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl && evt->modifiers & OS_Modifier_Shift)\r\n        {\r\n          ui_eat_event(evt);\r\n          if(evt->delta_2f32.y < 0)\r\n          {\r\n            rd_cmd(RD_CmdKind_IncViewFontSize);\r\n          }\r\n          else if(evt->delta_2f32.y > 0)\r\n          {\r\n            rd_cmd(RD_CmdKind_DecViewFontSize);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build result\r\n  //\r\n  RD_CodeViewBuildResult result = {0};\r\n  {\r\n    for(DI_KeyNode *n = code_slice_params.relevant_dbgi_keys.first; n != 0; n = n->next)\r\n    {\r\n      di_key_list_push(arena, &result.dbgi_keys, n->v);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: store state\r\n  //\r\n  rd_store_view_scroll_pos(scroll_pos);\r\n  cv->force_contain_only = 0;\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Watch Views\r\n\r\n//- rjf: cell list building\r\n\r\ninternal U64\r\nrd_id_from_watch_cell(RD_WatchCell *cell)\r\n{\r\n  U64 result = 5381;\r\n  result = e_hash_from_string(result, str8_struct(&cell->kind));\r\n  result = e_hash_from_string(result, str8_struct(&cell->index));\r\n  if(cell->index != 0)\r\n  {\r\n    result = e_hash_from_string(result, str8_struct(&cell->default_pct));\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RD_WatchCell *\r\nrd_watch_cell_list_push_new_(Arena *arena, RD_WatchCellList *list, RD_WatchCell *params)\r\n{\r\n  RD_WatchCell *cell = push_array(arena, RD_WatchCell, 1);\r\n  {\r\n    cell->index = list->count;\r\n    SLLQueuePush(list->first, list->last, cell);\r\n    list->count += 1;\r\n  }\r\n  U64 index = cell->index;\r\n  MemoryCopyStruct(cell, params);\r\n  cell->index = index;\r\n  if(cell->pct == 0)\r\n  {\r\n    cell->pct = cell->default_pct;\r\n  }\r\n  list->pct_sum += cell->pct;\r\n  cell->next = 0;\r\n  return cell;\r\n}\r\n\r\n//- rjf: watch view points <-> table coordinates\r\n\r\ninternal B32\r\nrd_watch_pt_match(RD_WatchPt a, RD_WatchPt b)\r\n{\r\n  return (ev_key_match(a.parent_key, b.parent_key) &&\r\n          ev_key_match(a.key, b.key) &&\r\n          a.cell_id == b.cell_id);\r\n}\r\n\r\ninternal RD_WatchPt\r\nrd_watch_pt_from_tbl(EV_BlockRangeList *block_ranges, Vec2S64 tbl)\r\n{\r\n  RD_WatchPt pt = zero_struct;\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), block_ranges, (U64)tbl.y);\r\n    RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n    {\r\n      S64 x = 0;\r\n      for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, x += 1)\r\n      {\r\n        if(x == tbl.x)\r\n        {\r\n          pt.cell_id = rd_id_from_watch_cell(cell);\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    pt.key         = row->key;\r\n    pt.parent_key  = row->block->key;\r\n    scratch_end(scratch);\r\n  }\r\n  return pt;\r\n}\r\n\r\ninternal Vec2S64\r\nrd_tbl_from_watch_pt(EV_BlockRangeList *block_ranges, RD_WatchPt pt)\r\n{\r\n  Vec2S64 tbl = {0};\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    U64 num = ev_num_from_key(block_ranges, pt.key);\r\n    EV_Row *row = ev_row_from_num(scratch.arena, rd_view_eval_view(), block_ranges, num);\r\n    RD_WatchRowInfo row_info = rd_watch_row_info_from_row(scratch.arena, row);\r\n    tbl.x = 0;\r\n    {\r\n      S64 x = 0;\r\n      for(RD_WatchCell *cell = row_info.cells.first; cell != 0; cell = cell->next, x += 1)\r\n      {\r\n        U64 cell_id = rd_id_from_watch_cell(cell);\r\n        if(cell_id == pt.cell_id)\r\n        {\r\n          tbl.x = x;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    tbl.y = (S64)num;\r\n    scratch_end(scratch);\r\n  }\r\n  return tbl;\r\n}\r\n\r\n//- rjf: row -> info\r\n\r\ninternal RD_WatchRowInfo\r\nrd_watch_row_info_from_row(Arena *arena, EV_Row *row)\r\n{\r\n  RD_WatchRowInfo info =\r\n  {\r\n    .module           = &ctrl_entity_nil,\r\n    .can_expand       = ev_row_is_expandable(row),\r\n    .group_cfg_parent = &cfg_nil_node,\r\n    .group_cfg_child  = &cfg_nil_node,\r\n    .group_entity     = &ctrl_entity_nil,\r\n    .callstack_thread = &ctrl_entity_nil,\r\n    .view_ui_rule     = &rd_nil_view_ui_rule,\r\n  };\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: unpack row's evaluation, key, & block info\r\n    //\r\n    E_Type *row_type = e_type_from_key(row->eval.irtree.type_key);\r\n    EV_Key key = row->key;\r\n    EV_Block *block = row->block;\r\n    B32 block_is_root = (block->parent == &ev_nil_block);\r\n    E_Eval block_eval = e_eval_from_key(row->block->eval.key);\r\n    E_TypeKey block_type_key = e_type_key_unwrap(block_eval.irtree.type_key, E_TypeUnwrapFlag_Meta);\r\n    E_TypeKind block_type_kind = e_type_kind_from_key(block_type_key);\r\n    E_Type *block_type = e_type_from_key(block_type_key);\r\n    CFG_Node *evalled_cfg = rd_cfg_from_eval_space(row->eval.space);\r\n    CTRL_Entity *evalled_entity = (row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ? rd_ctrl_entity_from_eval_space(row->eval.space) : &ctrl_entity_nil);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: determine if this cfg/entity evaluation is top-level - e.g. if we\r\n    // are evaluating a cfg tree, or some descendant of it\r\n    //\r\n    B32 is_top_level = 0;\r\n    if(evalled_cfg != &cfg_nil_node)\r\n    {\r\n      E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, evalled_cfg->string);\r\n      is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));\r\n    }\r\n    if(evalled_entity != &ctrl_entity_nil)\r\n    {\r\n      String8 top_level_name = ctrl_entity_kind_code_name_table[evalled_entity->kind];\r\n      E_TypeKey top_level_type_key = e_string2typekey_map_lookup(rd_state->meta_name2type_map, top_level_name);\r\n      is_top_level = (row->eval.value.u64 == 0 && e_type_key_match(top_level_type_key, row->eval.irtree.type_key));\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill if row's expression is editable\r\n    //\r\n    if(block_type->flags & E_TypeFlag_EditableChildren || (e_key_match(row->eval.key, e_key_zero()) && row->eval.expr == &e_expr_nil))\r\n    {\r\n      info.expr_is_editable = 1;\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's module\r\n    //\r\n    if(row->eval.space.kind == CTRL_EvalSpaceKind_Entity)\r\n    {\r\n      CTRL_Entity *row_ctrl_entity = rd_ctrl_entity_from_eval_space(row->eval.space);\r\n      switch(row_ctrl_entity->kind)\r\n      {\r\n        default:\r\n        case CTRL_EntityKind_Process:\r\n        if(row->eval.irtree.mode == E_Mode_Offset)\r\n        {\r\n          info.module = ctrl_module_from_process_vaddr(row_ctrl_entity, row->eval.value.u64);\r\n        }break;\r\n        case CTRL_EntityKind_Thread:\r\n        if(row->eval.irtree.mode == E_Mode_Value)\r\n        {\r\n          CTRL_Entity *process = ctrl_process_from_entity(row_ctrl_entity);\r\n          info.module = ctrl_module_from_process_vaddr(process, d_query_cached_rip_from_thread(row_ctrl_entity));\r\n        }break;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's call stack info\r\n    //\r\n    if(block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && str8_match(str8_lit(\"call_stack\"), block_type->name, 0))\r\n    {\r\n      CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(block_eval.space);\r\n      if(entity->kind == CTRL_EntityKind_Thread)\r\n      {\r\n        Access *access = access_open();\r\n        info.callstack_thread = entity;\r\n        U64 frame_num = ev_block_num_from_id(block, key.child_id);\r\n        B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread);\r\n        CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0);\r\n        if(1 <= frame_num && frame_num <= call_stack.frames_count)\r\n        {\r\n          CTRL_CallStackFrame *f = &call_stack.frames[frame_num-1];\r\n          info.callstack_unwind_index = f->unwind_count;\r\n          info.callstack_inline_depth = f->inline_depth;\r\n          info.callstack_vaddr = regs_rip_from_arch_block(entity->arch, f->regs);\r\n        }\r\n        access_close(access);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's ctrl entity\r\n    //\r\n    if(!block_is_root)\r\n    {\r\n      if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||\r\n                                               block_eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))\r\n      {\r\n        info.group_entity = rd_ctrl_entity_from_eval_space(row->eval.space);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's cfg group name / parent\r\n    //\r\n    if(!block_is_root)\r\n    {\r\n      if(block_type_kind == E_TypeKind_Set && (block_eval.space.kind == RD_EvalSpaceKind_MetaQuery ||\r\n                                               block_eval.space.kind == RD_EvalSpaceKind_MetaCfg))\r\n      {\r\n        info.group_cfg_parent = rd_cfg_from_eval_space(block_eval.space);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's group cfg name\r\n    //\r\n    if(!block_is_root)\r\n    {\r\n      if(block_type_kind == E_TypeKind_Set)\r\n      {\r\n        String8 singular_name = rd_singular_from_code_name_plural(block_type->name);\r\n        if(singular_name.size != 0)\r\n        {\r\n          info.group_cfg_name = singular_name;\r\n        }\r\n        else\r\n        {\r\n          info.group_cfg_name = block_type->name;\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's group cfg\r\n    //\r\n    if(!block_is_root)\r\n    {\r\n      if(info.group_cfg_name.size != 0 && (block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(cfgs_slice) ||\r\n                                           block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(watches) ||\r\n                                           block_type->expand.id_from_num == E_TYPE_EXPAND_ID_FROM_NUM_FUNCTION_NAME(environment)))\r\n      {\r\n        CFG_ID id = row->key.child_id;\r\n        info.group_cfg_child = cfg_node_from_id(id);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill row's view ui rule\r\n    //\r\n    info.view_ui_rule = rd_view_ui_rule_from_string(row->block->viz_expand_rule->string);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: find possible \"columns\" type\r\n    //\r\n    E_Type *maybe_table_type = block_type;\r\n    for(;;)\r\n    {\r\n      if(maybe_table_type->kind == E_TypeKind_Lens &&\r\n         str8_match(maybe_table_type->name, str8_lit(\"columns\"), 0))\r\n      {\r\n        break;\r\n      }\r\n      else if(maybe_table_type->kind == E_TypeKind_Lens)\r\n      {\r\n        maybe_table_type = e_type_from_key(maybe_table_type->direct_type_key);\r\n        continue;\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells table rows\r\n    //\r\n    if(0){}\r\n    else if(block->parent != &ev_nil_block && maybe_table_type->kind == E_TypeKind_Lens && str8_match(maybe_table_type->name, str8_lit(\"columns\"), 0) && maybe_table_type->count >= 1)\r\n    {\r\n      U64 column_count = maybe_table_type->count;\r\n      info.cell_style_key = push_str8f(arena, \"table_%I64u_cols\", column_count);\r\n      CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n      CFG_Node *style = cfg_node_child_from_string(view, info.cell_style_key);\r\n      CFG_Node *w_cfg = style->first;\r\n      F32 next_pct = 0;\r\n#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)\r\n      E_ParentKey(row->eval.key)\r\n      {\r\n        for(U64 idx = 0; idx < maybe_table_type->count; idx += 1)\r\n        {\r\n          E_Eval cell_eval = e_eval_from_expr(maybe_table_type->args[idx]);\r\n          rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, cell_eval, .default_pct = 1.f/maybe_table_type->count, .pct = take_pct());\r\n        }\r\n      }\r\n      info.can_expand = 0;\r\n#undef take_pct\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells files / folders\r\n    //\r\n    else if(row->eval.space.kind == E_SpaceKind_FileSystem &&\r\n            e_type_kind_from_key(row->eval.irtree.type_key) == E_TypeKind_Set)\r\n    {\r\n      E_Type *type = e_type_from_key(row->eval.irtree.type_key);\r\n      String8 file_path = e_string_from_id(row->eval.value.u64);\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented|RD_WatchCellFlag_Button|RD_WatchCellFlag_IsNonCode, .pct = 1.f);\r\n      if(str8_match(type->name, str8_lit(\"file\"), 0))\r\n      {\r\n        info.can_expand = 0;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells unattached processes\r\n    //\r\n    else if(row->eval.space.kind == RD_EvalSpaceKind_MetaUnattachedProcess &&\r\n            str8_match(row_type->name, str8_lit(\"unattached_process\"), 0))\r\n    {\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                  .flags = RD_WatchCellFlag_Button|RD_WatchCellFlag_Indented,\r\n                                  .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells autocomplete rows\r\n    //\r\n    else if(cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit(\"autocomplete\")) != &cfg_nil_node)\r\n    {\r\n      info.can_expand = 0;\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Button|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells lister rows\r\n    //\r\n    else if(cfg_node_child_from_string(cfg_node_from_id(rd_regs()->view), str8_lit(\"lister\")) != &cfg_nil_node)\r\n    {\r\n      info.can_expand = 0;\r\n      RD_WatchCellFlags extra_flags = RD_WatchCellFlag_Expr;\r\n      if(e_type_kind_from_key(e_type_key_unwrap(row->eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)) == E_TypeKind_Function)\r\n      {\r\n        extra_flags &= ~RD_WatchCellFlag_Expr;\r\n      }\r\n      if(row->eval.msgs.max_kind != E_MsgKind_Null)\r\n      {\r\n        extra_flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval;\r\n      }\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = extra_flags|RD_WatchCellFlag_Button|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells top-level cfg evaluations\r\n    //\r\n    else if(is_top_level && evalled_cfg != &cfg_nil_node)\r\n    {\r\n      CFG_Node *cfg = evalled_cfg;\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Button|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n      MD_NodePtrList schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, cfg->string);\r\n      for(MD_NodePtrNode *n = schemas.first; n != 0; n = n->next)\r\n      {\r\n        MD_Node *schema = n->v;\r\n        MD_Node *cmds_root = md_tag_from_string(schema, str8_lit(\"row_commands\"), 0);\r\n        for MD_EachNode(cmd, cmds_root->first)\r\n        {\r\n          B32 is_file_only = md_node_has_tag(cmd, str8_lit(\"file\"), 0);\r\n          B32 is_cmd_line_only = md_node_has_tag(cmd, str8_lit(\"cmd_line\"), 0);\r\n          if(is_file_only && e_eval_from_string(rd_expr_from_cfg(evalled_cfg)).space.kind != E_SpaceKind_File)\r\n          {\r\n            continue;\r\n          }\r\n          if(is_cmd_line_only)\r\n          {\r\n            B32 is_cmd_line = 0;\r\n            CFG_Node *cmd_line = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"command_line\"));\r\n            for(CFG_Node *p = evalled_cfg->parent; p != &cfg_nil_node; p = p->parent)\r\n            {\r\n              if(p == cmd_line)\r\n              {\r\n                is_cmd_line = 1;\r\n                break;\r\n              }\r\n            }\r\n            if(!is_cmd_line)\r\n            {\r\n              continue;\r\n            }\r\n          }\r\n          String8 cmd_name = cmd->string;\r\n          RD_CmdKind cmd_kind = rd_cmd_kind_from_string(cmd_name);\r\n          switch(cmd_kind)\r\n          {\r\n            default:{}break;\r\n            case RD_CmdKind_EnableCfg:\r\n            {\r\n              B32 is_disabled = rd_disabled_from_cfg(cfg);\r\n              if(!is_disabled)\r\n              {\r\n                cmd_kind = RD_CmdKind_DisableCfg;\r\n              }\r\n            }break;\r\n            case RD_CmdKind_DisableCfg:\r\n            {\r\n              B32 is_disabled = rd_disabled_from_cfg(cfg);\r\n              if(is_disabled)\r\n              {\r\n                cmd_kind = RD_CmdKind_EnableCfg;\r\n              }\r\n            }break;\r\n            case RD_CmdKind_SelectCfg:\r\n            {\r\n              B32 is_disabled = rd_disabled_from_cfg(cfg);\r\n              if(!is_disabled)\r\n              {\r\n                cmd_kind = RD_CmdKind_DeselectCfg;\r\n              }\r\n            }break;\r\n            case RD_CmdKind_DeselectCfg:\r\n            {\r\n              B32 is_disabled = rd_disabled_from_cfg(cfg);\r\n              if(is_disabled)\r\n              {\r\n                cmd_kind = RD_CmdKind_SelectCfg;\r\n              }\r\n            }break;\r\n          }\r\n          if(cmd_kind == RD_CmdKind_EnableCfg || cmd_kind == RD_CmdKind_DisableCfg)\r\n          {\r\n            rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, e_eval_wrapf(row->eval, \"enabled\"),\r\n                                        .flags = RD_WatchCellFlag_Background,\r\n                                        .px = floor_f32(ui_top_font_size()*5.5f));\r\n          }\r\n          else if(cmd_kind != RD_CmdKind_Null)\r\n          {\r\n            String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string;\r\n            rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval,\r\n                                        e_eval_from_stringf(\"query:commands.%S\", cmd_name),\r\n                                        .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button,\r\n                                        .px = floor_f32(ui_top_font_size()*3.f));\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells ctrl entity evaluations\r\n    //\r\n    else if(is_top_level && evalled_entity != &ctrl_entity_nil)\r\n    {\r\n      CTRL_Entity *entity = evalled_entity;\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                  .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented|RD_WatchCellFlag_Button,\r\n                                  .pct = 1.f);\r\n      if(entity->kind == CTRL_EntityKind_Machine ||\r\n         entity->kind == CTRL_EntityKind_Process ||\r\n         entity->kind == CTRL_EntityKind_Thread)\r\n      {\r\n        rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, e_eval_wrapf(row->eval, \"active\"),\r\n                                    .px = floor_f32(ui_top_font_size()*5.5f));\r\n      }\r\n      if(entity->kind == CTRL_EntityKind_Thread)\r\n      {\r\n        RD_CmdKind cmd_kind = RD_CmdKind_SelectEntity;\r\n        if(ctrl_handle_match(entity->handle, rd_base_regs()->thread))\r\n        {\r\n          cmd_kind = RD_CmdKind_DeselectEntity;\r\n        }\r\n        String8 cmd_name = rd_cmd_kind_info_table[cmd_kind].string;\r\n        rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, e_eval_from_stringf(\"query:commands.%S\", cmd_name),\r\n                                    .flags = RD_WatchCellFlag_ActivateWithSingleClick|RD_WatchCellFlag_Button,\r\n                                    .px = floor_f32(ui_top_font_size()*3.f));\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells queries\r\n    //\r\n    else if(row->eval.space.kind == RD_EvalSpaceKind_MetaQuery ||\r\n            (row->eval.space.kind == RD_EvalSpaceKind_MetaCfg &&\r\n             e_type_kind_from_key(e_type_key_unwrap(row->eval.irtree.type_key, E_TypeUnwrapFlag_Meta)) == E_TypeKind_Set))\r\n    {\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval, .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells commands\r\n    //\r\n    else if(row->eval.space.kind == RD_EvalSpaceKind_MetaCmd)\r\n    {\r\n      E_Type *type = e_type_from_key(row->eval.irtree.type_key);\r\n      if(type->kind == E_TypeKind_Set)\r\n      {\r\n        rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                    .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n      }\r\n      else\r\n      {\r\n        rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                    .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented|RD_WatchCellFlag_Button|RD_WatchCellFlag_ActivateWithSingleClick,\r\n                                    .pct = 1.f);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells view UI escape hatch\r\n    //\r\n    else if(info.view_ui_rule != &rd_nil_view_ui_rule)\r\n    {\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_ViewUI, row->eval, .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells \"add new\" expression rows\r\n    //\r\n    else if(row->eval.expr == &e_expr_nil && info.group_cfg_name.size != 0 && info.group_cfg_child == &cfg_nil_node)\r\n    {\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                  .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells meta-evaluation booleans\r\n    //\r\n    else if(info.group_cfg_child == &cfg_nil_node &&\r\n            e_type_kind_from_key(e_type_key_unwrap(row->eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative)) == E_TypeKind_Bool &&\r\n            (row->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||\r\n             row->eval.space.kind == RD_EvalSpaceKind_MetaCmd ||\r\n             row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity))\r\n    {\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                  .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_Indented, .pct = 1.f);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells procedures (expr & eval, mostly expr)\r\n    //\r\n    else if(block_type->kind == E_TypeKind_Set && str8_match(block_type->name, str8_lit(\"procedures\"), 0))\r\n    {\r\n      info.cell_style_key = str8_lit(\"procedure_expr_eval\");\r\n      CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n      CFG_Node *style = cfg_node_child_from_string(view, info.cell_style_key);\r\n      CFG_Node *w_cfg = style->first;\r\n      F32 next_pct = 0;\r\n#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                  .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented,\r\n                                  .default_pct = 0.75f,\r\n                                  .pct = take_pct());\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, e_eval_wrapf(row->eval, \"lens:hex((uint64)$)\"), .default_pct = 0.25f, .pct = take_pct());\r\n#undef take_pct\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells call stack frames\r\n    //\r\n    else if(info.callstack_thread != &ctrl_entity_nil)\r\n    {\r\n      info.cell_style_key = str8_lit(\"call_stack_frame\");\r\n      CTRL_Entity *process = ctrl_process_from_entity(info.callstack_thread);\r\n      CTRL_Entity *module = ctrl_module_from_process_vaddr(process, info.callstack_vaddr);\r\n      E_Eval module_eval = e_eval_from_stringf(\"query:control.%S\", ctrl_string_from_handle(scratch.arena, module->handle));\r\n      CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n      CFG_Node *style = cfg_node_child_from_string(view, info.cell_style_key);\r\n      CFG_Node *w_cfg = style->first;\r\n      F32 next_pct = 0;\r\n#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_CallStackFrame, row->eval,                                 .default_pct = 0.05f, .pct = take_pct());\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval,           row->eval,                                 .default_pct = 0.75f, .pct = take_pct());\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval,           (module == &ctrl_entity_nil ? (E_Eval)zero_struct : module_eval),\r\n                                  .default_pct = 0.20f, .pct = take_pct());\r\n#undef take_pct\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: @watch_row_build_cells catchall (normal rows)\r\n    //\r\n    else\r\n    {\r\n      // rjf: disable expansion on meta string evaluations\r\n      if(row->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||\r\n         row->eval.space.kind == RD_EvalSpaceKind_MetaCmd ||\r\n         row->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||\r\n         row->eval.space.kind == E_SpaceKind_File)\r\n      {\r\n        E_TypeKey substantive_row_eval_type = e_type_key_unwrap(row->eval.irtree.type_key, E_TypeUnwrapFlag_Meta);\r\n        if(e_type_kind_from_key(substantive_row_eval_type) == E_TypeKind_Array &&\r\n           e_type_kind_from_key(e_type_key_direct(substantive_row_eval_type)) == E_TypeKind_U8)\r\n        {\r\n          info.can_expand = 0;\r\n        }\r\n      }\r\n      info.cell_style_key = str8_lit(\"normal\");\r\n      CFG_Node *view = cfg_node_from_id(rd_regs()->view);\r\n      CFG_Node *style = cfg_node_child_from_string(view, info.cell_style_key);\r\n      CFG_Node *w_cfg = style->first;\r\n      F32 next_pct = 0;\r\n#define take_pct() (next_pct = (F32)f64_from_str8(w_cfg->string), w_cfg = w_cfg->next, next_pct)\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,\r\n                                  .flags = RD_WatchCellFlag_Expr|RD_WatchCellFlag_NoEval|RD_WatchCellFlag_Indented,\r\n                                  .default_pct = 0.35f,\r\n                                  .pct = take_pct());\r\n      rd_watch_cell_list_push_new(arena, &info.cells, RD_WatchCellKind_Eval, row->eval,                            .default_pct = 0.65f, .pct = take_pct());\r\n#undef take_pct\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: normalize all cell widths\r\n    //\r\n    if(abs_f32(info.cells.pct_sum - 1.f) > 0.01f)\r\n    {\r\n      F32 sum = info.cells.pct_sum;\r\n      if(sum <= 0)\r\n      {\r\n        sum = 1.f;\r\n      }\r\n      for(RD_WatchCell *c = info.cells.first; c != 0; c = c->next)\r\n      {\r\n        c->pct /= sum;\r\n      }\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  return info;\r\n}\r\n\r\n//- rjf: row * cell -> string\r\n\r\ninternal RD_WatchRowCellInfo\r\nrd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_flags, RD_WatchRowInfo *row_info, RD_WatchCell *cell, FNT_Tag font, F32 font_size, F32 max_size_px)\r\n{\r\n  Temp scratch = scratch_begin(&arena ,1);\r\n  RD_WatchRowCellInfo result =\r\n  {\r\n    .flags        = cell->flags,\r\n    .view_ui_rule = &rd_nil_view_ui_rule,\r\n    .cfg          = &cfg_nil_node,\r\n    .entity       = &ctrl_entity_nil,\r\n  };\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack evaluation\r\n  //\r\n  E_Type *block_type = e_type_from_key(row->block->eval.irtree.type_key);\r\n  E_Type *cell_type = e_type_from_key(cell->eval.irtree.type_key);\r\n  MD_NodePtrList cell_schemas = cfg_schemas_from_name(scratch.arena, rd_state->cfg_schema_table, cell_type->name);\r\n  if(cell->eval.space.u64s[1] == 0 && cell_schemas.count != 0)\r\n  {\r\n    result.cfg = rd_cfg_from_eval_space(cell->eval.space);\r\n  }\r\n  if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity && cell->eval.space.u64s[2] == 0)\r\n  {\r\n    result.entity = rd_ctrl_entity_from_eval_space(cell->eval.space);\r\n  }\r\n  result.cmd_name = rd_cmd_name_from_eval(cell->eval);\r\n  result.file_path = rd_file_path_from_eval(arena, cell->eval);\r\n  for(E_Type *type = cell_type;\r\n      type->kind == E_TypeKind_Lens;\r\n      type = e_type_from_key(type->direct_type_key))\r\n  {\r\n    RD_ViewUIRule *view_ui_rule = rd_view_ui_rule_from_string(type->name);\r\n    if(view_ui_rule != &rd_nil_view_ui_rule)\r\n    {\r\n      result.view_ui_rule = view_ui_rule;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine cell description\r\n  //\r\n  for(E_Type *type = cell_type;\r\n      type->kind != E_TypeKind_Null;\r\n      type = e_type_from_key(type->direct_type_key))\r\n  {\r\n    if(type->kind == E_TypeKind_MetaDescription)\r\n    {\r\n      result.description = type->name;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine cell editability\r\n  //\r\n  if(cell->kind == RD_WatchCellKind_Eval)\r\n  {\r\n    if(cell->flags & RD_WatchCellFlag_Expr && cell->flags & RD_WatchCellFlag_NoEval)\r\n    {\r\n      if(row_info->expr_is_editable)\r\n      {\r\n        result.flags |= RD_WatchCellFlag_CanEdit;\r\n      }\r\n    }\r\n    else\r\n    {\r\n      if(ev_type_key_is_editable(cell->eval.irtree.type_key) && cell->eval.irtree.mode == E_Mode_Offset)\r\n      {\r\n        result.flags |= RD_WatchCellFlag_CanEdit;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build cell's visual appearance info\r\n  //\r\n  switch(cell->eval.space.kind)\r\n  {\r\n    //- rjf: default case: depending on cell info, generate string\r\n    default:\r\n    {\r\n      if(0){}\r\n      \r\n      //- rjf: errors\r\n      else if(cell->eval.msgs.max_kind > E_MsgKind_Null && !(cell->flags & RD_WatchCellFlag_NoEval))\r\n      {\r\n        RD_Font(RD_FontSlot_Main)\r\n        {\r\n          DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n          DR_FStrList fstrs = {0};\r\n          UI_TagF(\"weak\")\r\n          {\r\n            dr_fstrs_push_new(arena, &fstrs, &params,\r\n                              rd_icon_kind_text_table[RD_IconKind_WarningBig],\r\n                              .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                              .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons),\r\n                              .color = ui_color_from_name(str8_lit(\"text\")));\r\n            dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n            for(E_Msg *msg = cell->eval.msgs.first; msg != 0; msg = msg->next)\r\n            {\r\n              DR_FStrList msg_fstrs = rd_fstrs_from_rich_string(arena, msg->text);\r\n              dr_fstrs_concat_in_place(&fstrs, &msg_fstrs);\r\n              if(msg->next)\r\n              {\r\n                dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\" \"));\r\n              }\r\n            }\r\n          }\r\n          result.expr_fstrs = fstrs;\r\n        }\r\n      }\r\n      \r\n      //- rjf: cfg evaluation -> button for cfg\r\n      else if(result.cfg != &cfg_nil_node)\r\n      {\r\n        result.expr_fstrs = rd_title_fstrs_from_cfg(arena, result.cfg, 0);\r\n        result.flags |= RD_WatchCellFlag_Button;\r\n      }\r\n      \r\n      //- rjf: entity evaluation -> button for entity\r\n      else if(result.entity != &ctrl_entity_nil)\r\n      {\r\n        result.expr_fstrs = rd_title_fstrs_from_ctrl_entity(arena, result.entity, 1);\r\n        result.flags |= RD_WatchCellFlag_Button;\r\n      }\r\n      \r\n      //- rjf: buttons -> button for command\r\n      else if(result.cmd_name.size != 0)\r\n      {\r\n        if(cell->px != 0)\r\n        {\r\n          DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n          DR_FStrList fstrs = {0};\r\n          UI_TagF(\"weak\")\r\n          {\r\n            dr_fstrs_push_new(arena, &fstrs, &params,\r\n                              rd_icon_kind_text_table[rd_icon_kind_from_code_name(result.cmd_name)],\r\n                              .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                              .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons),\r\n                              .color = ui_color_from_name(str8_lit(\"text\")));\r\n          }\r\n          result.expr_fstrs = fstrs;\r\n        }\r\n        else\r\n        {\r\n          result.expr_fstrs = rd_title_fstrs_from_code_name(arena, result.cmd_name);\r\n        }\r\n        result.flags |= RD_WatchCellFlag_Button;\r\n      }\r\n      \r\n      //- rjf: files -> button for file\r\n      else if(result.file_path.size != 0)\r\n      {\r\n        result.expr_fstrs = rd_title_fstrs_from_file_path(arena, result.file_path);\r\n        result.flags |= RD_WatchCellFlag_Button;\r\n      }\r\n      \r\n      //- rjf: catchall cell -> need to form \"left-hand-side\", or \"meta\" string, for expression, and/or value string\r\n      else\r\n      {\r\n        //- rjf: build left-hand-side strings\r\n        DR_FStrList expr_fstrs = {0};\r\n        if(cell->flags & RD_WatchCellFlag_Expr)\r\n        {\r\n          B32 is_non_code = 0;\r\n          String8 expr_string = {0};\r\n          \r\n          // rjf: if this cell has a meta-display-name, then use that\r\n          if(expr_string.size == 0)\r\n          {\r\n            for(E_Type *t = e_type_from_key(cell->eval.irtree.type_key);\r\n                t != &e_type_nil;\r\n                t = e_type_from_key(t->direct_type_key))\r\n            {\r\n              if(t->kind == E_TypeKind_MetaDisplayName)\r\n              {\r\n                is_non_code = 1;\r\n                expr_string = t->name;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: if this cell has no string specified, then we need to synthesize one from the evaluation\r\n          if(expr_string.size == 0)\r\n          {\r\n            // rjf: defaultly fill the cell's expression string, before trying other things\r\n            expr_string = cell->eval.string;\r\n            \r\n            // rjf: try to form a simpler expression string out of the expression tree itself, *if* this\r\n            // is not an editable expression, and if this evaluation was successful, and if this evaluation\r\n            // has a parent\r\n            if(!e_key_match(cell->eval.parent_key, e_key_zero()) &&\r\n               !(block_type->flags & E_TypeFlag_EditableChildren) &&\r\n               cell->eval.msgs.max_kind == E_MsgKind_Null)\r\n            {\r\n              // rjf: first, locate a notable expression - we special-case things like member accesses\r\n              // or array indices, so we should grab those if possible\r\n              E_Expr *notable_expr = cell->eval.expr;\r\n              for(B32 good = 0; !good;)\r\n              {\r\n                switch(notable_expr->kind)\r\n                {\r\n                  default:{good = 1;}break;\r\n                  case E_ExprKind_Address:\r\n                  case E_ExprKind_Deref:\r\n                  case E_ExprKind_Cast:\r\n                  {\r\n                    notable_expr = notable_expr->last;\r\n                  }break;\r\n                  case E_ExprKind_Ref:\r\n                  {\r\n                    notable_expr = notable_expr->ref;\r\n                  }break;\r\n                }\r\n              }\r\n              \r\n              // rjf: generate expression extension string based on our notable expression\r\n              switch(notable_expr->kind)\r\n              {\r\n                // rjf: default case -> just take whatever string was directly passed via the evaluation\r\n                default:{}break;\r\n                \r\n                // rjf: array indices -> fast path to [index]\r\n                case E_ExprKind_ArrayIndex:\r\n                {\r\n                  expr_string = push_str8f(arena, \"[%S]\", e_string_from_expr(arena, notable_expr->last, str8_zero()));\r\n                }break;\r\n                \r\n                // rjf: member accesses -> fast-path to .name\r\n                case E_ExprKind_MemberAccess:\r\n                {\r\n                  Temp scratch = scratch_begin(&arena, 1);\r\n                  \r\n                  // TODO(rjf): @cfg need to build inheritance tooltips\r\n#if 0\r\n                  if(member.inheritance_key_chain.count != 0)\r\n                  {\r\n                    String8List strings = {0};\r\n                    for(E_TypeKeyNode *n = member.inheritance_key_chain.first; n != 0; n = n->next)\r\n                    {\r\n                      String8 base_class_name = e_type_string_from_key(scratch.arena, n->v);\r\n                      str8_list_push(scratch.arena, &strings, base_class_name);\r\n                    }\r\n                    result.inheritance_tooltip = str8_list_join(arena, &strings, &(StringJoin){.sep = str8_lit_comp(\"::\")});\r\n                  }\r\n#endif\r\n                  \r\n                  // rjf: in meta-evaluation spaces, we will try to look up into our vocabulary map\r\n                  // to see if we have a fancy display string for this member. otherwise, we will just\r\n                  // do a code-string of \".member_name\"\r\n                  String8 member_name = notable_expr->first->next->string;\r\n                  String8 fancy_name = {0};\r\n                  if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||\r\n                     cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity ||\r\n                     cell->eval.space.kind == E_SpaceKind_File ||\r\n                     cell->eval.space.kind == E_SpaceKind_FileSystem)\r\n                  {\r\n                    fancy_name = rd_display_from_code_name(member_name);\r\n                  }\r\n                  if(fancy_name.size != 0)\r\n                  {\r\n                    is_non_code = 1;\r\n                    expr_string = fancy_name;\r\n                  }\r\n                  else if(member_name.size != 0)\r\n                  {\r\n                    expr_string = push_str8f(arena, \".%S\", member_name);\r\n                  }\r\n                  scratch_end(scratch);\r\n                }break;\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: use expression string / params to generate fancy strings\r\n          if(is_non_code)\r\n          {\r\n            DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), font_size, 0, 0};\r\n            dr_fstrs_push_new(arena, &expr_fstrs, &params, expr_string);\r\n          }\r\n          else\r\n          {\r\n            expr_fstrs = rd_fstrs_from_code_string(arena, 1, 0, ui_color_from_name(str8_lit(\"text\")), expr_string);\r\n          }\r\n        }\r\n        \r\n        //- rjf: evaluation -> need to form value string\r\n        DR_FStrList eval_fstrs = {0};\r\n        if(!(cell->flags & RD_WatchCellFlag_NoEval))\r\n        {\r\n          // rjf: determine string generation parameters based on evaluation\r\n          EV_StringParams string_params = {string_flags, 10};\r\n          {\r\n            if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCfg ||\r\n               cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity)\r\n            {\r\n              string_params.flags |= EV_StringFlag_DisableStringQuotes|EV_StringFlag_DisableAddresses;\r\n            }\r\n            if(cell->eval.space.kind == RD_EvalSpaceKind_MetaCtrlEntity &&\r\n               rd_ctrl_entity_from_eval_space(cell->eval.space)->kind == CTRL_EntityKind_Module)\r\n            {\r\n              string_params.radix = 16;\r\n            }\r\n            if(cell->eval.space.kind == CTRL_EvalSpaceKind_Entity &&\r\n               rd_ctrl_entity_from_eval_space(cell->eval.space)->kind == CTRL_EntityKind_Thread)\r\n            {\r\n              string_params.radix = 16;\r\n            }\r\n          }\r\n          \r\n          // rjf: determine if code\r\n          B32 is_code = 1;\r\n          {\r\n            E_Type *type = e_type_from_key(e_type_key_unwrap(cell->eval.irtree.type_key, E_TypeUnwrapFlag_Meta));\r\n            if(type->flags & (E_TypeFlag_IsPlainText|E_TypeFlag_IsPathText))\r\n            {\r\n              is_code = 0;\r\n            }\r\n          }\r\n          \r\n          // rjf: generate string based on that expression & fill\r\n          String8 string = rd_value_string_from_eval(arena, rd_view_query_input(), &string_params, font, font_size, max_size_px, cell->eval);\r\n          if(is_code)\r\n          {\r\n            eval_fstrs = rd_fstrs_from_code_string(arena, 1, 0, ui_color_from_name(str8_lit(\"text\")), string);\r\n          }\r\n          else UI_TagF(\"weak\")\r\n          {\r\n            DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), font_size, 0, 0};\r\n            dr_fstrs_push_new(arena, &eval_fstrs, &params, string);\r\n            result.flags |= RD_WatchCellFlag_IsNonCode;\r\n          }\r\n        }\r\n        \r\n        //- rjf: if we have only the expression, then use the expression as the value\r\n        if(cell->flags & RD_WatchCellFlag_NoEval)\r\n        {\r\n          result.eval_fstrs = expr_fstrs;\r\n        }\r\n        else\r\n        {\r\n          result.expr_fstrs = expr_fstrs;\r\n          result.eval_fstrs = eval_fstrs;\r\n        }\r\n      }\r\n    }break;\r\n    \r\n    //- rjf: unattached processes\r\n    case RD_EvalSpaceKind_MetaUnattachedProcess:\r\n    {\r\n      U64 pid = cell->eval.value.u128.u64[0];\r\n      String8 name = e_string_from_id(cell->eval.value.u128.u64[1]);\r\n      DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n      DR_FStrList fstrs = {0};\r\n      UI_TagF(\"weak\")\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params,\r\n                          rd_icon_kind_text_table[RD_IconKind_Scheduler],\r\n                          .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                          .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons),\r\n                          .color = ui_color_from_name(str8_lit(\"text\")));\r\n      }\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &fstrs, &params, push_str8f(arena, \"(PID: %I64u)\", pid));\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &fstrs, &params, name);\r\n      result.expr_fstrs = fstrs;\r\n    }break;\r\n    \r\n    //- rjf: unattached processes\r\n    case RD_EvalSpaceKind_MetaTheme:\r\n    {\r\n      String8 name = e_string_from_id(cell->eval.value.u64);\r\n      DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n      DR_FStrList fstrs = {0};\r\n      UI_TagF(\"weak\")\r\n      {\r\n        dr_fstrs_push_new(arena, &fstrs, &params,\r\n                          rd_icon_kind_text_table[RD_IconKind_Palette],\r\n                          .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                          .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons),\r\n                          .color = ui_color_from_name(str8_lit(\"text\")));\r\n      }\r\n      dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &fstrs, &params, name);\r\n      {\r\n        Access *access = access_open();\r\n        MD_Node *theme_tree = rd_theme_tree_from_name(scratch.arena, access, name);\r\n        U64 color_idx = 0;\r\n        for(MD_Node *n = theme_tree; color_idx < 4 && !md_node_is_nil(n); n = md_node_rec_depth_first_pre(n, theme_tree).next)\r\n        {\r\n          if(str8_match(n->string, str8_lit(\"theme_color\"), 0))\r\n          {\r\n            String8 tags = md_child_from_string(n, str8_lit(\"tags\"), 0)->first->string;\r\n            if(str8_match(tags, str8_lit(\"background\"), 0) ||\r\n               str8_match(tags, str8_lit(\"text\"), 0) ||\r\n               str8_match(tags, str8_lit(\"focus border\"), 0) ||\r\n               str8_match(tags, str8_lit(\"menu_bar background\"), 0) ||\r\n               str8_match(tags, str8_lit(\"tab background\"), 0) ||\r\n               str8_match(tags, str8_lit(\"code_default\"), 0))\r\n            {\r\n              U64 color = 0;\r\n              if(try_u64_from_str8_c_rules(md_child_from_string(n, str8_lit(\"value\"), 0)->first->string, &color))\r\n              {\r\n                dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n                dr_fstrs_push_new(arena, &fstrs, &params,\r\n                                  rd_icon_kind_text_table[RD_IconKind_CircleFilled],\r\n                                  .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                                  .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons),\r\n                                  .color = linear_from_srgba(rgba_from_u32((U32)color)));\r\n                color_idx += 1;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        access_close(access);\r\n      }\r\n      result.eval_fstrs = fstrs;\r\n    }break;\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n//- rjf: table coordinates -> text edit state\r\n\r\ninternal RD_WatchViewTextEditState *\r\nrd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchPt pt)\r\n{\r\n  RD_WatchViewTextEditState *result = &wv->dummy_text_edit_state;\r\n  if(wv->text_edit_state_slots_count != 0 && wv->text_editing != 0)\r\n  {\r\n    U64 hash = ev_hash_from_key(pt.key);\r\n    U64 slot_idx = hash%wv->text_edit_state_slots_count;\r\n    for(RD_WatchViewTextEditState *s = wv->text_edit_state_slots[slot_idx]; s != 0; s = s->pt_hash_next)\r\n    {\r\n      if(rd_watch_pt_match(pt, s->pt))\r\n      {\r\n        result = s;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: null @view_hook_impl\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(null) {}\r\n\r\n////////////////////////////////\r\n//~ rjf: text @view_hook_impl\r\n\r\ninternal AC_Artifact\r\nrd_md5_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)\r\n{\r\n  AC_Artifact result = {0};\r\n  {\r\n    Access *access = access_open();\r\n    U128 hash = {0};\r\n    str8_deserial_read_struct(key, 0, &hash);\r\n    String8 data = c_data_from_hash(access, hash);\r\n    MD5 md5 = md5_from_data(data);\r\n    StaticAssert(sizeof(result) >= sizeof(md5), artifact_size_check);\r\n    MemoryCopy(&result, &md5, Min(sizeof(result), sizeof(md5)));\r\n    access_close(access);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal AC_Artifact\r\nrd_sha1_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)\r\n{\r\n  AC_Artifact result = {0};\r\n  {\r\n    Access *access = access_open();\r\n    U128 hash = {0};\r\n    str8_deserial_read_struct(key, 0, &hash);\r\n    String8 data = c_data_from_hash(access, hash);\r\n    SHA1 sha1 = sha1_from_data(data);\r\n    StaticAssert(sizeof(result) >= sizeof(sha1), artifact_size_check);\r\n    MemoryCopy(&result, &sha1, Min(sizeof(result), sizeof(sha1)));\r\n    access_close(access);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal AC_Artifact\r\nrd_sha256_artifact_create(String8 key, B32 *cancel_out, B32 *retry_out, U64 *gen_out)\r\n{\r\n  AC_Artifact result = {0};\r\n  {\r\n    Access *access = access_open();\r\n    U128 hash = {0};\r\n    str8_deserial_read_struct(key, 0, &hash);\r\n    String8 data = c_data_from_hash(access, hash);\r\n    SHA256 sha256 = sha256_from_data(data);\r\n    StaticAssert(sizeof(result) >= sizeof(sha256), artifact_size_check);\r\n    MemoryCopy(&result, &sha256, Min(sizeof(result), sizeof(sha256)));\r\n    access_close(access);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal MD5\r\nrd_md5_from_hash(U128 hash)\r\n{\r\n  Access *access = access_open();\r\n  AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_md5_artifact_create, 0, 0);\r\n  MD5 md5 = {0};\r\n  MemoryCopy(&md5, &artifact, Min(sizeof(md5), sizeof(artifact)));\r\n  access_close(access);\r\n  return md5;\r\n}\r\n\r\ninternal SHA1\r\nrd_sha1_from_hash(U128 hash)\r\n{\r\n  Access *access = access_open();\r\n  AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_sha1_artifact_create, 0, 0);\r\n  SHA1 sha1 = {0};\r\n  MemoryCopy(&sha1, &artifact, Min(sizeof(sha1), sizeof(artifact)));\r\n  access_close(access);\r\n  return sha1;\r\n}\r\n\r\ninternal SHA256\r\nrd_sha256_from_hash(U128 hash)\r\n{\r\n  Access *access = access_open();\r\n  AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_sha256_artifact_create, 0, 0);\r\n  SHA256 sha256 = {0};\r\n  MemoryCopy(&sha256, &artifact, Min(sizeof(sha256), sizeof(artifact)));\r\n  access_close(access);\r\n  return sha256;\r\n}\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(text)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 8;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(text)\r\n{\r\n  RD_CodeViewState *cv = rd_view_state(RD_CodeViewState);\r\n  rd_code_view_init(cv);\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: set up invariants\r\n  //\r\n  F32 main_font_size = ui_bottom_font_size();\r\n  F32 bottom_bar_height = main_font_size*2.f;\r\n  Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height);\r\n  Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: process code-file commands\r\n  //\r\n  ProfScope(\"process code-file commands\") for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);)\r\n  {\r\n    RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n    switch(kind)\r\n    {\r\n      default:{}break;\r\n      \r\n      // rjf: override file picking\r\n      case RD_CmdKind_PickFile:\r\n      {\r\n        String8 src = rd_regs()->file_path;\r\n        String8 dst = cmd->regs->file_path;\r\n        if(src.size != 0 && dst.size != 0)\r\n        {\r\n          // rjf: record src -> dst mapping\r\n          rd_cmd(RD_CmdKind_SetFileReplacementPath, .string = src, .file_path = dst);\r\n          \r\n          // rjf: switch this view to viewing replacement file\r\n          rd_store_view_expr_string(rd_eval_string_from_file_path(scratch.arena, dst));\r\n        }\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack parameterization info\r\n  //\r\n  ProfBegin(\"unpack parameterization info\");\r\n  rd_regs()->file_path     = rd_file_path_from_eval(rd_frame_arena(), eval);\r\n  rd_regs()->vaddr         = 0;\r\n  rd_regs()->prefer_disasm = 0;\r\n  rd_regs()->cursor.line   = rd_view_setting_value_from_name(str8_lit(\"cursor_line\")).s64;\r\n  rd_regs()->cursor.column = rd_view_setting_value_from_name(str8_lit(\"cursor_column\")).s64;\r\n  rd_regs()->mark.line     = rd_view_setting_value_from_name(str8_lit(\"mark_line\")).s64;\r\n  rd_regs()->mark.column   = rd_view_setting_value_from_name(str8_lit(\"mark_column\")).s64;\r\n  if(rd_regs()->cursor.line == 0)   { rd_regs()->cursor.line = 1; }\r\n  if(rd_regs()->cursor.column == 0) { rd_regs()->cursor.column = 1; }\r\n  if(rd_regs()->mark.line == 0)     { rd_regs()->mark.line = 1; }\r\n  if(rd_regs()->mark.column == 0)   { rd_regs()->mark.column = 1; }\r\n  String8List overrides = rd_possible_overrides_from_file_path(scratch.arena, rd_regs()->file_path);\r\n  Rng1U64 range = rd_space_range_from_eval(eval);\r\n  rd_regs()->text_key = rd_key_from_eval_space_range(eval.space, range, 1);\r\n  String8 lang = rd_view_setting_from_name(str8_lit(\"lang\"));\r\n  if(lang.size == 0)\r\n  {\r\n    rd_regs()->lang_kind = rd_lang_kind_from_eval(eval);\r\n  }\r\n  else\r\n  {\r\n    rd_regs()->lang_kind = txt_lang_kind_from_extension(lang);\r\n  }\r\n  if(rd_regs()->lang_kind == TXT_LangKind_Null)\r\n  {\r\n    Access *access = access_open();\r\n    CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->module);\r\n    DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n    RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n    if(rdi != &rdi_parsed_nil)\r\n    {\r\n      for EachNode(override_n, String8Node, overrides.first)\r\n      {\r\n        String8 file_path = override_n->string;\r\n        String8 file_path_normalized = lower_from_str8(scratch.arena, path_normalized_from_string(scratch.arena, file_path));\r\n        B32 good_src_id = 0;\r\n        U32 src_id = 0;\r\n        RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths);\r\n        RDI_ParsedNameMap map = {0};\r\n        rdi_parsed_from_name_map(rdi, mapptr, &map);\r\n        RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);\r\n        if(node != 0)\r\n        {\r\n          U32 id_count = 0;\r\n          U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n          if(id_count > 0)\r\n          {\r\n            U32 src_id = ids[0];\r\n            RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id);\r\n            RDI_SourceLineMap *src_line_map = rdi_element_from_name_idx(rdi, SourceLineMaps, src->source_line_map_idx);\r\n            RDI_ParsedSourceLineMap parsed_src_line_map = {0};\r\n            rdi_parsed_from_source_line_map(rdi, src_line_map, &parsed_src_line_map);\r\n            if(src_line_map->voff_count != 0)\r\n            {\r\n              RDI_Unit *unit = rdi_unit_from_voff(rdi, parsed_src_line_map.voffs[0]);\r\n              switch((RDI_LanguageEnum)unit->language)\r\n              {\r\n                case RDI_Language_NULL:\r\n                case RDI_Language_COUNT:\r\n                case RDI_Language_Masm:\r\n                {}break;\r\n                case RDI_Language_C:        {rd_regs()->lang_kind = TXT_LangKind_C;}break;\r\n                case RDI_Language_CPlusPlus:{rd_regs()->lang_kind = TXT_LangKind_CPlusPlus;}break;\r\n              }\r\n            }\r\n            break;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    access_close(access);\r\n  }\r\n  U128 hash = {0};\r\n  TXT_TextInfo info = txt_text_info_from_key_lang(access, rd_regs()->text_key, rd_regs()->lang_kind, &hash);\r\n  String8 data = c_data_from_hash(access, hash);\r\n  B32 file_is_missing = (rd_regs()->file_path.size != 0 && os_properties_from_file_path(rd_regs()->file_path).modified == 0);\r\n  B32 key_has_data = !u128_match(hash, u128_zero()) && info.lines_count;\r\n  ProfEnd();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: update last hash - scroll-to-bottom if needed\r\n  //\r\n  if(rd_setting_b32_from_name(str8_lit(\"scroll_to_bottom_on_change\")) && !u128_match(hash, cv->last_hash) && !u128_match(cv->last_hash, u128_zero()))\r\n  {\r\n    cv->goto_line_num = info.lines_count;\r\n    cv->contain_cursor = 1;\r\n    cv->force_contain_only = 1;\r\n  }\r\n  cv->last_hash = hash;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build missing file interface\r\n  //\r\n  if(file_is_missing)\r\n  {\r\n    UI_WidthFill UI_HeightFill UI_Column UI_Padding(ui_pct(1, 0))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_em(3, 1))\r\n        UI_Row UI_Padding(ui_pct(1, 0))\r\n        UI_PrefWidth(ui_text_dim(1, 1))\r\n        UI_TagF(\"weak\")\r\n      {\r\n        RD_Font(RD_FontSlot_Icons) ui_label(rd_icon_kind_text_table[RD_IconKind_WarningBig]);\r\n        ui_labelf(\"Could not find \\\"%S\\\".\", rd_regs()->file_path);\r\n      }\r\n      UI_PrefHeight(ui_em(3, 1))\r\n        UI_Row UI_Padding(ui_pct(1, 0))\r\n        UI_PrefWidth(ui_text_dim(10, 1))\r\n        UI_CornerRadius(ui_top_font_size()/3)\r\n        UI_PrefWidth(ui_text_dim(10, 1))\r\n        UI_Focus(UI_FocusKind_On)\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n        UI_TagF(\"pop\")\r\n        if(ui_clicked(ui_buttonf(\"Find alternative...\")))\r\n      {\r\n        rd_cmd(RD_CmdKind_RunCommand, .cmd_name = rd_cmd_kind_info_table[RD_CmdKind_PickFile].string);\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: code is not missing, but not ready -> equip loading info to this view\r\n  //\r\n  if(!file_is_missing && info.lines_count == 0 && eval.msgs.max_kind == E_MsgKind_Null)\r\n  {\r\n    rd_store_view_loading_info(1, info.bytes_processed, info.bytes_to_process);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build code contents\r\n  //\r\n  DI_KeyList dbgi_keys = {0};\r\n  if(!file_is_missing)\r\n  {\r\n    RD_CodeViewBuildFlags flags = RD_CodeViewBuildFlag_All;\r\n    if(rd_regs()->file_path.size == 0)\r\n    {\r\n      flags &= ~RD_CodeViewBuildFlag_Margins;\r\n    }\r\n    RD_CodeViewBuildResult result = rd_code_view_build(scratch.arena, cv, flags, code_area_rect, data, &info, 0, r1u64(0, 0), di_key_zero());\r\n    dbgi_keys = result.dbgi_keys;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack cursor info\r\n  //\r\n  if(rd_regs()->file_path.size != 0)\r\n  {\r\n    CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->module);\r\n    DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n    rd_regs()->lines = d_lines_from_dbgi_key_file_path_line_num(rd_frame_arena(), dbgi_key, rd_regs()->file_path, rd_regs()->cursor.line);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine if file is out-of-date\r\n  //\r\n  B32 file_is_out_of_date = 0;\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    \r\n    // rjf: determine checksum in relevant debug infos\r\n    RDI_ChecksumKind checksum_kind = RDI_ChecksumKind_NULL;\r\n    String8 checksum_expected = {0};\r\n    for(DI_KeyNode *n = dbgi_keys.first; n != 0 && checksum_kind == RDI_ChecksumKind_NULL; n = n->next)\r\n    {\r\n      Access *access = access_open();\r\n      \r\n      // rjf: unpack RDI\r\n      DI_Key key = n->v;\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, key, 0, 0);\r\n      \r\n      // rjf: file_path_normalized * rdi -> src_id\r\n      for EachNode(override_n, String8Node, overrides.first)\r\n      {\r\n        String8 file_path = override_n->string;\r\n        String8 file_path_normalized = lower_from_str8(scratch.arena, path_normalized_from_string(scratch.arena, file_path));\r\n        B32 good_src_id = 0;\r\n        U32 src_id = 0;\r\n        if(rdi != &rdi_parsed_nil)\r\n        {\r\n          RDI_NameMap *mapptr = rdi_element_from_name_idx(rdi, NameMaps, RDI_NameMapKind_NormalSourcePaths);\r\n          RDI_ParsedNameMap map = {0};\r\n          rdi_parsed_from_name_map(rdi, mapptr, &map);\r\n          RDI_NameMapNode *node = rdi_name_map_lookup(rdi, &map, file_path_normalized.str, file_path_normalized.size);\r\n          if(node != 0)\r\n          {\r\n            U32 id_count = 0;\r\n            U32 *ids = rdi_matches_from_map_node(rdi, node, &id_count);\r\n            if(id_count > 0)\r\n            {\r\n              U32 src_id = ids[0];\r\n              RDI_SourceFile *src = rdi_element_from_name_idx(rdi, SourceFiles, src_id);\r\n              checksum_kind = src->checksum_kind;\r\n              RDI_SectionKind checksum_section_kind = rdi_section_kind_from_checksum_kind(checksum_kind);\r\n              U64 checksum_size = rdi_section_element_size_table[checksum_section_kind];\r\n              U8 *checksum_data = (U8 *)rdi_section_raw_element_from_kind_idx(rdi, checksum_section_kind, src->checksum_idx);\r\n              checksum_expected = str8_copy(scratch.arena, str8(checksum_data, checksum_size));\r\n              break;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      access_close(access);\r\n    }\r\n    \r\n    // rjf: if we got a checksum, compute it locally - check if they match.\r\n    switch(checksum_kind)\r\n    {\r\n      default:{}break;\r\n      case RDI_ChecksumKind_MD5:\r\n      {\r\n        MD5 md5 = rd_md5_from_hash(hash);\r\n        String8 md5_string = str8_struct(&md5);\r\n        file_is_out_of_date = !MemoryIsZeroStruct(&md5) && !str8_match(md5_string, checksum_expected, 0);\r\n      }break;\r\n      case RDI_ChecksumKind_SHA1:\r\n      {\r\n        SHA1 sha1 = rd_sha1_from_hash(hash);\r\n        String8 sha1_string = str8_struct(&sha1);\r\n        file_is_out_of_date = !MemoryIsZeroStruct(&sha1) && !str8_match(sha1_string, checksum_expected, 0);\r\n      }break;\r\n      case RDI_ChecksumKind_SHA256:\r\n      {\r\n        SHA256 sha256 = rd_sha256_from_hash(hash);\r\n        String8 sha256_string = str8_struct(&sha256);\r\n        file_is_out_of_date = !MemoryIsZeroStruct(&sha256) && !str8_match(sha256_string, checksum_expected, 0);\r\n      }break;\r\n      case RDI_ChecksumKind_Timestamp:\r\n      {\r\n        FileProperties props = os_properties_from_file_path(rd_regs()->file_path);\r\n        String8 timestamp_string = str8_struct(&props.modified);\r\n        file_is_out_of_date = !MemoryIsZeroStruct(&props.modified) && !str8_match(timestamp_string, checksum_expected, 0);\r\n      }break;\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build bottom bar\r\n  //\r\n  if(!file_is_missing && key_has_data) UI_FontSize(main_font_size) UI_TagF(file_is_out_of_date ? \"bad_pop\" : \".\")\r\n  {\r\n    ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f)));\r\n    ui_set_next_flags(UI_BoxFlag_DrawBackground);\r\n    UI_Row\r\n      UI_TextAlignment(UI_TextAlign_Center)\r\n      UI_PrefWidth(ui_text_dim(10, 1))\r\n      UI_TagF(\"weak\")\r\n    {\r\n      if(file_is_out_of_date) \r\n      {\r\n        UI_Box *box = &ui_nil_box;\r\n        RD_Font(RD_FontSlot_Icons)\r\n        {\r\n          box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_Clickable, \"%S###file_ood_warning\", rd_icon_kind_text_table[RD_IconKind_WarningBig]);\r\n        }\r\n        UI_Signal sig = ui_signal_from_box(box);\r\n        if(ui_hovering(sig)) UI_Tooltip\r\n        {\r\n          UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(1, 1)) UI_TextPadding(0)\r\n          {\r\n            UI_TagF(\"weak\") ui_labelf(\"This file has changed since it was compiled.\");\r\n          }\r\n        }\r\n      }\r\n      RD_Font(RD_FontSlot_Code)\r\n      {\r\n        if(rd_regs()->file_path.size != 0)\r\n        {\r\n          ui_label(rd_regs()->file_path);\r\n          ui_spacer(ui_em(1.5f, 1));\r\n        }\r\n        ui_labelf(\"Line: %I64d, Column: %I64d\", rd_regs()->cursor.line, rd_regs()->cursor.column);\r\n        ui_spacer(ui_pct(1, 0));\r\n        ui_labelf(\"(read only)\");\r\n        ui_labelf(\"%s\",\r\n                  info.line_end_kind == TXT_LineEndKind_LF   ? \"lf\" :\r\n                  info.line_end_kind == TXT_LineEndKind_CRLF ? \"crlf\" :\r\n                  \"bin\");\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: store params\r\n  //\r\n  rd_store_view_param_s64(str8_lit(\"cursor_line\"), rd_regs()->cursor.line);\r\n  rd_store_view_param_s64(str8_lit(\"cursor_column\"), rd_regs()->cursor.column);\r\n  rd_store_view_param_s64(str8_lit(\"mark_line\"), rd_regs()->mark.line);\r\n  rd_store_view_param_s64(str8_lit(\"mark_column\"), rd_regs()->mark.column);\r\n  \r\n  access_close(access);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: disasm @view_hook_impl\r\n\r\ntypedef struct RD_DisasmViewState RD_DisasmViewState;\r\nstruct RD_DisasmViewState\r\n{\r\n  B32 initialized;\r\n  TxtPt cursor;\r\n  TxtPt mark;\r\n  CTRL_Handle temp_look_process;\r\n  U64 temp_look_vaddr;\r\n  U64 temp_look_run_gen;\r\n  U64 goto_vaddr;\r\n  RD_CodeViewState cv;\r\n};\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(disasm)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 8;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(disasm)\r\n{\r\n  RD_DisasmViewState *dv = rd_view_state(RD_DisasmViewState);\r\n  if(dv->initialized == 0)\r\n  {\r\n    dv->initialized = 1;\r\n    dv->cursor = txt_pt(1, 1);\r\n    dv->mark = txt_pt(1, 1);\r\n    rd_code_view_init(&dv->cv);\r\n  }\r\n  RD_CodeViewState *cv = &dv->cv;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if disassembly views are parameterized by a register-space evaluation,\r\n  // we will interpret it as an address in the primary module.\r\n  //\r\n  if(e_space_match(eval.space, e_base_ctx->thread_reg_space))\r\n  {\r\n    eval = e_value_eval_from_eval(eval);\r\n    eval.space = e_base_ctx->primary_module->space;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if disassembly views are not parameterized by anything, they\r\n  // automatically snap to the selected thread's RIP, OR the \"temp look\r\n  // address\" (commanded by go-to-disasm or go-to-address), rounded down to the\r\n  // nearest 16K boundary\r\n  //\r\n  B32 auto_selected = 0;\r\n  E_Space auto_space = {0};\r\n  if(eval.expr == &e_expr_nil)\r\n  {\r\n    if(dv->temp_look_vaddr != 0 && dv->temp_look_run_gen == ctrl_run_gen())\r\n    {\r\n      auto_selected = 1;\r\n      auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, dv->temp_look_process), CTRL_EvalSpaceKind_Entity);\r\n      eval = e_eval_from_stringf(\"(0x%I64x & (~(0x4000 - 1)))\", dv->temp_look_vaddr);\r\n    }\r\n    else\r\n    {\r\n      auto_selected = 1;\r\n      auto_space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity);\r\n      eval = e_eval_from_stringf(\"(reg:rip & (~(0x4000 - 1)))\");\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: set up invariants\r\n  //\r\n  F32 main_font_size = ui_bottom_font_size();\r\n  F32 bottom_bar_height = main_font_size*2.f;\r\n  Rng2F32 code_area_rect = r2f32p(rect.x0, rect.y0, rect.x1, rect.y1 - bottom_bar_height);\r\n  Rng2F32 bottom_bar_rect = r2f32p(rect.x0, rect.y1 - bottom_bar_height, rect.x1, rect.y1);\r\n  rd_regs()->file_path = str8_zero();\r\n  rd_regs()->cursor = dv->cursor;\r\n  rd_regs()->mark = dv->mark;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: process disassembly-specific commands\r\n  //\r\n  for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);)\r\n  {\r\n    RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n    switch(kind)\r\n    {\r\n      default: break;\r\n      case RD_CmdKind_GoToAddress:\r\n      {\r\n        dv->temp_look_process = cmd->regs->process;\r\n        dv->temp_look_vaddr   = cmd->regs->vaddr;\r\n        dv->temp_look_run_gen = ctrl_run_gen();\r\n        dv->goto_vaddr        = cmd->regs->vaddr;\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack parameterization info\r\n  //\r\n  E_Space space = eval.space;\r\n  if(auto_selected)\r\n  {\r\n    space = auto_space;\r\n  }\r\n  Rng1U64 range = rd_space_range_from_eval(eval);\r\n  Arch arch = rd_arch_from_eval(eval);\r\n  CTRL_Entity *space_entity = rd_ctrl_entity_from_eval_space(space);\r\n  CTRL_Entity *dasm_module = &ctrl_entity_nil;\r\n  DI_Key dbgi_key = {0};\r\n  U64 base_vaddr = 0;\r\n  switch(space_entity->kind)\r\n  {\r\n    default:{}break;\r\n    case CTRL_EntityKind_Process:\r\n    {\r\n      if(arch == Arch_Null) { arch = space_entity->arch; }\r\n      dasm_module = ctrl_module_from_process_vaddr(space_entity, range.min);\r\n      dbgi_key    = ctrl_dbgi_key_from_module(dasm_module);\r\n      base_vaddr  = dasm_module->vaddr_range.min;\r\n    }break;\r\n  }\r\n  DASM_StyleFlags style_flags = 0;\r\n  DASM_Syntax syntax = DASM_Syntax_Intel;\r\n  {\r\n    if(rd_setting_b32_from_name(str8_lit(\"show_addresses\")))\r\n    {\r\n      style_flags |= DASM_StyleFlag_Addresses;\r\n    }\r\n    if(rd_setting_b32_from_name(str8_lit(\"show_code_bytes\")))\r\n    {\r\n      style_flags |= DASM_StyleFlag_CodeBytes;\r\n    }\r\n    if(rd_setting_b32_from_name(str8_lit(\"show_source_lines\")))\r\n    {\r\n      style_flags |= DASM_StyleFlag_SourceFilesNames;\r\n      style_flags |= DASM_StyleFlag_SourceLines;\r\n    }\r\n    if(rd_setting_b32_from_name(str8_lit(\"show_symbol_names\")))\r\n    {\r\n      style_flags |= DASM_StyleFlag_SymbolNames;\r\n    }\r\n    if(str8_match(rd_setting_from_name(str8_lit(\"syntax\")), str8_lit(\"att\"), 0))\r\n    {\r\n      syntax = DASM_Syntax_ATT;\r\n    }\r\n  }\r\n  C_Key dasm_key = rd_key_from_eval_space_range(space, range, 0);\r\n  U128 dasm_data_hash = {0};\r\n  DASM_Params dasm_params = {0};\r\n  {\r\n    dasm_params.vaddr       = range.min;\r\n    dasm_params.arch        = arch;\r\n    dasm_params.style_flags = style_flags;\r\n    dasm_params.syntax      = syntax;\r\n    dasm_params.base_vaddr  = base_vaddr;\r\n    dasm_params.dbgi_key    = dbgi_key;\r\n  }\r\n  DASM_Info dasm_info = dasm_info_from_key_params(access, dasm_key, &dasm_params, &dasm_data_hash);\r\n  rd_regs()->text_key = dasm_info.text_key;\r\n  rd_regs()->lang_kind = txt_lang_kind_from_arch(arch);\r\n  U128 dasm_text_hash = {0};\r\n  TXT_TextInfo dasm_text_info = txt_text_info_from_key_lang(access, rd_regs()->text_key, rd_regs()->lang_kind, &dasm_text_hash);\r\n  String8 dasm_text_data = c_data_from_hash(access, dasm_text_hash);\r\n  B32 is_loading = (dasm_text_info.lines_count == 0 && dim_1u64(range) != 0 && eval.msgs.max_kind == E_MsgKind_Null && (space.kind != CTRL_EvalSpaceKind_Entity || space_entity != &ctrl_entity_nil));\r\n  B32 has_disasm = (dasm_text_info.lines_count != 0 && dasm_info.lines.count != 0);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: is loading -> equip view with loading information\r\n  //\r\n  if(is_loading && !d_ctrl_targets_running())\r\n  {\r\n    rd_store_view_loading_info(is_loading, 0, 0);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do goto vaddr\r\n  //\r\n  if(!is_loading && has_disasm && dv->goto_vaddr != 0 && contains_1u64(range, dv->goto_vaddr))\r\n  {\r\n    U64 vaddr = dv->goto_vaddr;\r\n    U64 line_idx = dasm_line_array_idx_from_code_off__linear_scan(&dasm_info.lines, vaddr-range.min);\r\n    if(line_idx < dasm_info.lines.count)\r\n    {\r\n      S64 line_num = (S64)(line_idx+1);\r\n      dv->goto_vaddr = 0;\r\n      cv->goto_line_num = line_num;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build code contents\r\n  //\r\n  if(!is_loading && has_disasm)\r\n  {\r\n    rd_code_view_build(scratch.arena, cv, RD_CodeViewBuildFlag_All, code_area_rect, dasm_text_data, &dasm_text_info, &dasm_info.lines, range, dbgi_key);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack cursor info\r\n  //\r\n  if(!is_loading && has_disasm)\r\n  {\r\n    U64 off = dasm_line_array_code_off_from_idx(&dasm_info.lines, rd_regs()->cursor.line-1);\r\n    rd_regs()->prefer_disasm = 1;\r\n    rd_regs()->vaddr = range.min+off;\r\n    rd_regs()->vaddr_range = r1u64(range.min+off, range.min+off);\r\n    rd_regs()->voff_range = ctrl_voff_range_from_vaddr_range(dasm_module, rd_regs()->vaddr_range);\r\n    rd_regs()->lines = d_lines_from_dbgi_key_voff(rd_frame_arena(), dbgi_key, rd_regs()->voff_range.min);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build bottom bar\r\n  //\r\n  if(!is_loading && has_disasm) UI_FontSize(main_font_size)\r\n  {\r\n    ui_set_next_rect(shift_2f32(bottom_bar_rect, scale_2f32(rect.p0, -1.f)));\r\n    ui_set_next_flags(UI_BoxFlag_DrawBackground);\r\n    UI_Row\r\n      UI_TextAlignment(UI_TextAlign_Center)\r\n      UI_PrefWidth(ui_text_dim(10, 1))\r\n      UI_TagF(\"weak\")\r\n      RD_Font(RD_FontSlot_Code)\r\n    {\r\n      U64 cursor_vaddr = (1 <= rd_regs()->cursor.line && rd_regs()->cursor.line <= dasm_info.lines.count) ? (range.min+dasm_info.lines.v[rd_regs()->cursor.line-1].code_off) : 0;\r\n      if(dasm_module != &ctrl_entity_nil)\r\n      {\r\n        ui_labelf(\"%S\", dasm_module->string);\r\n        ui_spacer(ui_em(1.5f, 1));\r\n      }\r\n      ui_labelf(\"Address: 0x%I64x, Line: %I64d, Column: %I64d\", cursor_vaddr, rd_regs()->cursor.line, rd_regs()->cursor.column);\r\n      ui_spacer(ui_pct(1, 0));\r\n      ui_labelf(\"(read only)\");\r\n      ui_labelf(\"bin\");\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: commit storage\r\n  //\r\n  dv->cursor = rd_regs()->cursor;\r\n  dv->mark = rd_regs()->mark;\r\n  \r\n  access_close(access);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: memory @view_hook_impl\r\n\r\ntypedef struct RD_MemoryViewState RD_MemoryViewState;\r\nstruct RD_MemoryViewState\r\n{\r\n  Rng1U64 last_view_range;\r\n  B32 last_view_range_inited;\r\n  Rng1U64 last_cursor_range;\r\n  B32 last_cursor_range_inited;\r\n  U64 last_num_of_columns;\r\n  B32 last_num_of_columns_inited;\r\n  B32 center_cursor;\r\n  B32 contain_cursor;\r\n  B32 snap_scroll;\r\n};\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(memory)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 16;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(memory)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  RD_MemoryViewState *mv = rd_view_state(RD_MemoryViewState);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if memory views are parameterized by a register-space evaluation,\r\n  // we will interpret it as an address in the primary module.\r\n  //\r\n  if(e_space_match(eval.space, e_base_ctx->thread_reg_space))\r\n  {\r\n    eval = e_value_eval_from_eval(eval);\r\n    eval.space = e_base_ctx->primary_module->space;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if memory views are parameterized by nothing, we will\r\n  // default to showing the entire memory space of the primary module.\r\n  //\r\n  Rng1U64 view_range = rd_space_range_from_eval(eval);\r\n  if(eval.space.kind == 0)\r\n  {\r\n    eval.space = rd_eval_space_from_ctrl_entity(ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->process), CTRL_EvalSpaceKind_Entity);\r\n    view_range = rd_whole_range_from_eval_space(eval.space);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack parameterization info\r\n  //\r\n  Vec4F32 main_bg_color_rgba = ui_color_from_name(str8_lit(\"background\"));\r\n  Vec4F32 main_bg_color_hsva = hsva_from_rgba(main_bg_color_rgba);\r\n  Vec4F32 main_tx_color_rgba = ui_color_from_name(str8_lit(\"text\"));\r\n  Vec4F32 main_tx_color_hsva = hsva_from_rgba(main_tx_color_rgba);\r\n  F32 main_font_size = ui_bottom_font_size();\r\n  U64 cursor_base_vaddr = rd_view_setting_u64_from_name(str8_lit(\"cursor\"));\r\n  U64 mark_base_vaddr   = rd_view_setting_u64_from_name(str8_lit(\"mark\"));\r\n  U64 cursor_size       = rd_view_setting_u64_from_name(str8_lit(\"cursor_size\"));\r\n  cursor_size = ClampBot(1, cursor_size);\r\n  U64 initial_cursor_base_vaddr  = cursor_base_vaddr;\r\n  U64 initial_mark_base_vaddr    = mark_base_vaddr;\r\n  U64 num_columns     = rd_view_setting_u64_from_name(str8_lit(\"num_columns\"));\r\n  B32 track_mark_to_cursor = rd_view_setting_b32_from_name(str8_lit(\"track_mark_to_cursor\"));\r\n  if(num_columns == 0)\r\n  {\r\n    num_columns = 16;\r\n  }\r\n  num_columns = ClampBot(1, num_columns);\r\n  UI_ScrollPt2 scroll_pos = rd_view_scroll_pos();\r\n  Vec4F32 selection_color = ui_color_from_name(str8_lit(\"selection\"));\r\n  Vec4F32 border_color = ui_color_from_name(str8_lit(\"selection\"));\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack rich hover info\r\n  //\r\n  UI_Key memory_rich_hover_key = ui_key_from_string(ui_active_seed_key(), str8_lit(\"###rich_hover\"));\r\n  Rng1U64 rich_hover_range = {0};\r\n  if(rd_state->hover_regs_slot == RD_RegSlot_VaddrRange &&\r\n     e_space_match(eval.space, rd_get_hover_regs()->eval_space) &&\r\n     !ui_key_match(rd_get_hover_regs()->src_ui_key, memory_rich_hover_key))\r\n  {\r\n    rich_hover_range = rd_get_hover_regs()->vaddr_range;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: process commands\r\n  //\r\n  for(RD_Cmd *cmd = 0; rd_next_view_cmd(&cmd);)\r\n  {\r\n    RD_CmdKind kind = rd_cmd_kind_from_string(cmd->name);\r\n    switch(kind)\r\n    {\r\n      default: break;\r\n      case RD_CmdKind_CenterCursor:\r\n      {\r\n        mv->center_cursor = 1;\r\n      }break;\r\n      case RD_CmdKind_ContainCursor:\r\n      {\r\n        mv->contain_cursor = 1;\r\n      }break;\r\n      case RD_CmdKind_GoToAddress:\r\n      {\r\n        cursor_base_vaddr = mark_base_vaddr = cmd->regs->vaddr;\r\n        mv->center_cursor = 1;\r\n      }break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack visual params\r\n  //\r\n  FNT_Tag font = rd_font_from_slot(RD_FontSlot_Code);\r\n  FNT_RasterFlags font_raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code);\r\n  F32 font_size = ui_top_font_size();\r\n  F32 big_glyph_advance = fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_lit(\"H\")).x;\r\n  F32 row_height_px = floor_f32(font_size*2.f);\r\n  F32 cell_width_px = floor_f32(font_size*2.f);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate rectangles\r\n  //\r\n  F32 scroll_bar_dim = floor_f32(main_font_size*1.5f);\r\n  Vec2F32 panel_dim = dim_2f32(rect);\r\n  F32 footer_dim = floor_f32(main_font_size*10.f);\r\n  Rng2F32 header_rect = r2f32p(0, 0, panel_dim.x, row_height_px);\r\n  Rng2F32 footer_rect = r2f32p(0, panel_dim.y-footer_dim, panel_dim.x-scroll_bar_dim, panel_dim.y);\r\n  Rng2F32 content_rect = r2f32p(0, row_height_px, panel_dim.x-scroll_bar_dim, panel_dim.y);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine visible range of rows (occluded & non-occluded)\r\n  //\r\n  S64 num_possible_visible_rows = num_possible_visible_rows = dim_2f32(rect).y/row_height_px;;\r\n  S64 num_possible_nonoccluded_visible_rows = (dim_2f32(content_rect).y - dim_2f32(footer_rect).y) / row_height_px;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine legal scroll range\r\n  //\r\n  U64 view_range_last = view_range.max;\r\n  if(view_range_last != 0)\r\n  {\r\n    view_range_last -= 1;\r\n  }\r\n  Rng1S64 scroll_idx_rng = r1s64(0, (view_range_last - view_range.min) / num_columns);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: on cursor rugpull -> update mark if needed\r\n  //\r\n  {\r\n    Rng1U64 cursor_range = r1u64(cursor_base_vaddr, cursor_base_vaddr+cursor_size);\r\n    if(mv->last_cursor_range_inited &&\r\n       (mv->last_cursor_range.min != cursor_range.min ||\r\n        mv->last_cursor_range.max != cursor_range.max))\r\n    {\r\n      mv->contain_cursor = 1;\r\n      if(track_mark_to_cursor)\r\n      {\r\n        mark_base_vaddr = cursor_base_vaddr;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: on num of columns rugpull -> update scroll position\r\n  //\r\n  if(mv->last_num_of_columns != num_columns && mv->last_num_of_columns_inited)\r\n  {\r\n    mv->center_cursor = 1;\r\n    mv->snap_scroll = 1;\r\n  }\r\n  mv->last_num_of_columns_inited = 1;\r\n  mv->last_num_of_columns = num_columns;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: loop: compute boundaries, take events, repeat\r\n  //\r\n  B32 need_update = 1;\r\n  Rng1U64 cursor_valid_rng = {0};\r\n  for(;;)\r\n  {\r\n    //- rjf: break if no further updates needed\r\n    if(!need_update)\r\n    {\r\n      break;\r\n    }\r\n    need_update = 0;\r\n    \r\n    //- rjf: take keyboard controls\r\n    UI_Focus(UI_FocusKind_On) if(ui_is_focus_active())\r\n    {\r\n      U64 next_cursor_base_vaddr = cursor_base_vaddr;\r\n      U64 next_mark_base_vaddr = mark_base_vaddr;\r\n      for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n      {\r\n        Vec2S64 cell_delta = {0};\r\n        switch(evt->delta_unit)\r\n        {\r\n          default:{}break;\r\n          case UI_EventDeltaUnit_Char:\r\n          {\r\n            cell_delta.x = (S64)evt->delta_2s32.x;\r\n            cell_delta.y = (S64)evt->delta_2s32.y;\r\n          }break;\r\n          case UI_EventDeltaUnit_Word:\r\n          case UI_EventDeltaUnit_Page:\r\n          {\r\n            if(evt->delta_2s32.x < 0)\r\n            {\r\n              cell_delta.x = -(S64)(cursor_base_vaddr%num_columns);\r\n            }\r\n            else if(evt->delta_2s32.x > 0)\r\n            {\r\n              cell_delta.x = (num_columns-1) - (S64)(cursor_base_vaddr%num_columns);\r\n            }\r\n            if(evt->delta_2s32.y < 0)\r\n            {\r\n              cell_delta.y = -4;\r\n            }\r\n            else if(evt->delta_2s32.y > 0)\r\n            {\r\n              cell_delta.y = +4;\r\n            }\r\n          }break;\r\n        }\r\n        B32 good_action = 0;\r\n        if(evt->delta_2s32.x != 0 || evt->delta_2s32.y != 0)\r\n        {\r\n          good_action = 1;\r\n        }\r\n        if(good_action && evt->flags & UI_EventFlag_ZeroDeltaOnSelect && cursor_base_vaddr != mark_base_vaddr)\r\n        {\r\n          MemoryZeroStruct(&cell_delta);\r\n        }\r\n        if(good_action)\r\n        {\r\n          cell_delta.x = ClampBot(cell_delta.x, (S64)-next_cursor_base_vaddr);\r\n          cell_delta.y = ClampBot(cell_delta.y, (S64)-(next_cursor_base_vaddr/num_columns));\r\n          next_cursor_base_vaddr += cell_delta.x;\r\n          next_cursor_base_vaddr += cell_delta.y*num_columns;\r\n        }\r\n        if(good_action && evt->flags & UI_EventFlag_PickSelectSide && cursor_base_vaddr != mark_base_vaddr)\r\n        {\r\n          if(evt->delta_2s32.x < 0 || evt->delta_2s32.y < 0)\r\n          {\r\n            next_cursor_base_vaddr = Min(cursor_base_vaddr, mark_base_vaddr);\r\n          }\r\n          else\r\n          {\r\n            next_cursor_base_vaddr = Max(cursor_base_vaddr, mark_base_vaddr);\r\n          }\r\n        }\r\n        if(good_action && !(evt->flags & UI_EventFlag_KeepMark))\r\n        {\r\n          next_mark_base_vaddr = next_cursor_base_vaddr;\r\n        }\r\n        if(good_action)\r\n        {\r\n          need_update = 1;\r\n          mv->contain_cursor = 1;\r\n          ui_eat_event(evt);\r\n        }\r\n      }\r\n      cursor_base_vaddr = next_cursor_base_vaddr;\r\n      mark_base_vaddr = next_mark_base_vaddr;\r\n    }\r\n    \r\n    //- rjf: clamp cursor\r\n    cursor_valid_rng = view_range;\r\n    if(cursor_valid_rng.max != 0)\r\n    {\r\n      cursor_valid_rng.max -= 1;\r\n    }\r\n    if(cursor_base_vaddr != initial_cursor_base_vaddr)\r\n    {\r\n      cursor_base_vaddr = clamp_1u64(cursor_valid_rng, cursor_base_vaddr);\r\n    }\r\n    if(mark_base_vaddr != initial_mark_base_vaddr)\r\n    {\r\n      mark_base_vaddr = clamp_1u64(cursor_valid_rng, mark_base_vaddr);\r\n    }\r\n    \r\n    //- rjf: center cursor if range has changed\r\n    if(mv->last_view_range_inited &&\r\n       (mv->last_view_range.max != view_range.max ||\r\n        mv->last_view_range.min != view_range.min))\r\n    {\r\n      mv->center_cursor = 1;\r\n    }\r\n    mv->last_view_range_inited = 1;\r\n    mv->last_view_range = view_range;\r\n    \r\n    //- rjf: center cursor\r\n    if(mv->center_cursor && contains_1u64(view_range, cursor_base_vaddr))\r\n    {\r\n      mv->center_cursor = 0;\r\n      S64 cursor_row_idx = (cursor_base_vaddr - view_range.min) / num_columns;\r\n      S64 new_idx = (cursor_row_idx-num_possible_nonoccluded_visible_rows/2+1);\r\n      new_idx = clamp_1s64(scroll_idx_rng, new_idx);\r\n      ui_scroll_pt_target_idx(&scroll_pos.y, new_idx);\r\n    }\r\n    \r\n    //- rjf: contain cursor\r\n    if(mv->contain_cursor && contains_1u64(view_range, cursor_base_vaddr))\r\n    {\r\n      mv->contain_cursor = 0;\r\n      Rng1S64 viz_range_nonoccluded_rows = {0};\r\n      viz_range_nonoccluded_rows.min = scroll_pos.y.idx + (S64)(content_rect.y0 / row_height_px);\r\n      viz_range_nonoccluded_rows.max = viz_range_nonoccluded_rows.min + num_possible_nonoccluded_visible_rows;\r\n      viz_range_nonoccluded_rows.min = clamp_1s64(scroll_idx_rng, viz_range_nonoccluded_rows.min);\r\n      viz_range_nonoccluded_rows.max = clamp_1s64(scroll_idx_rng, viz_range_nonoccluded_rows.max);\r\n      S64 cursor_row_idx = (cursor_base_vaddr - view_range.min) / num_columns;\r\n      Rng1S64 cursor_viz_range = r1s64(clamp_1s64(scroll_idx_rng, cursor_row_idx-2), clamp_1s64(scroll_idx_rng, cursor_row_idx+3));\r\n      S64 min_delta = Min(0, cursor_viz_range.min-viz_range_nonoccluded_rows.min);\r\n      S64 max_delta = Max(0, cursor_viz_range.max-viz_range_nonoccluded_rows.max);\r\n      S64 new_idx = scroll_pos.y.idx+min_delta+max_delta;\r\n      new_idx = clamp_1s64(scroll_idx_rng, new_idx);\r\n      ui_scroll_pt_target_idx(&scroll_pos.y, new_idx);\r\n    }\r\n    \r\n    //- rjf: snap scroll\r\n    if(mv->snap_scroll)\r\n    {\r\n      mv->snap_scroll = 0;\r\n      scroll_pos.y.off = 0;\r\n    }\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: determine selection\r\n  //\r\n  Rng1U64 selection = union_1u64(r1u64(cursor_base_vaddr, cursor_base_vaddr+cursor_size-1),\r\n                                 r1u64(mark_base_vaddr, mark_base_vaddr+cursor_size-1));\r\n  \r\n  ////////////////////////////\r\n  //- rjf: determine visible range of rows (including occluded)\r\n  //\r\n  Rng1S64 viz_range_rows = {0};\r\n  {\r\n    viz_range_rows.min = scroll_pos.y.idx + (S64)scroll_pos.y.off - !!(scroll_pos.y.off<0);\r\n    viz_range_rows.max = scroll_pos.y.idx + (S64)scroll_pos.y.off + num_possible_visible_rows,\r\n    viz_range_rows.min = clamp_1s64(scroll_idx_rng, viz_range_rows.min);\r\n    viz_range_rows.max = clamp_1s64(scroll_idx_rng, viz_range_rows.max);\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: bump backwards if we are past the first\r\n  //\r\n  if(viz_range_rows.min > 0)\r\n  {\r\n    viz_range_rows.min -= 1;\r\n    content_rect.y0 -= row_height_px;\r\n  }\r\n  \r\n  ////////////////////////////\r\n  //- rjf: determine visible range of bytes\r\n  //\r\n  Rng1U64 viz_range_bytes = {0};\r\n  {\r\n    viz_range_bytes.min = view_range.min + (viz_range_rows.min)*num_columns;\r\n    viz_range_bytes.max = view_range.min + (viz_range_rows.max+1)*num_columns+1;\r\n    if(viz_range_bytes.min > viz_range_bytes.max)\r\n    {\r\n      Swap(U64, viz_range_bytes.min, viz_range_bytes.max);\r\n    }\r\n    viz_range_bytes = intersect_1u64(view_range, viz_range_bytes);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: produce fancy strings for all possible byte values in all cells\r\n  //\r\n  DR_FStrList byte_fstrs[256] = {0};\r\n  DR_FStrList byte_fstrs_selected[256] = {0};\r\n  {\r\n    Vec4F32 selected_color = ui_color_from_name(str8_lit(\"text\"));\r\n    Vec4F32 full_color = {0};\r\n    UI_TagF(\"neutral\") full_color = ui_color_from_name(str8_lit(\"text\"));\r\n    Vec4F32 zero_color = full_color;\r\n    UI_TagF(\"weak\") zero_color = ui_color_from_name(str8_lit(\"text\"));\r\n    for(U64 idx = 0; idx < ArrayCount(byte_fstrs); idx += 1)\r\n    {\r\n      U8 byte = (U8)idx;\r\n      F32 pct = (byte/255.f);\r\n      Vec4F32 text_color = mix_4f32(zero_color, full_color, pct);\r\n      if(byte == 0)\r\n      {\r\n        text_color.w *= 0.5f;\r\n      }\r\n      {\r\n        DR_FStr fstr = {push_str8f(scratch.arena, \"%02x\", byte), {font, font_raster_flags, text_color, font_size, 0, 0}};\r\n        dr_fstrs_push(scratch.arena, &byte_fstrs[idx], &fstr);\r\n      }\r\n      {\r\n        DR_FStr fstr = {push_str8f(scratch.arena, \"%02x\", byte), {font, font_raster_flags, selected_color, font_size, 0, 0}};\r\n        dr_fstrs_push(scratch.arena, &byte_fstrs_selected[idx], &fstr);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: grab windowed memory\r\n  //\r\n  U64 visible_memory_size = dim_1u64(viz_range_bytes);\r\n  U8 *visible_memory = push_array(scratch.arena, U8, visible_memory_size);\r\n  U64 *visible_memory_change_flags = push_array(scratch.arena, U64, (visible_memory_size+63)/64);\r\n  U64 *visible_memory_bad_flags = push_array(scratch.arena, U64, (visible_memory_size+63)/64);\r\n  {\r\n    e_space_read(eval.space, visible_memory, viz_range_bytes);\r\n  }\r\n  if(eval.space.kind == CTRL_EvalSpaceKind_Entity)\r\n  {\r\n    CTRL_Entity *entity = rd_ctrl_entity_from_eval_space(eval.space);\r\n    if(entity->kind == CTRL_EntityKind_Process)\r\n    {\r\n      CTRL_ProcessMemorySlice slice = ctrl_process_memory_slice_from_vaddr_range(scratch.arena, entity->handle, viz_range_bytes, 0, 0);\r\n      visible_memory_change_flags = slice.byte_changed_flags;\r\n      visible_memory_bad_flags = slice.byte_bad_flags;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: grab annotations for windowed range of memory\r\n  //\r\n  typedef struct Annotation Annotation;\r\n  struct Annotation\r\n  {\r\n    String8 name_string;\r\n    String8 kind_string;\r\n    String8 type_string;\r\n    Vec4F32 color;\r\n    Rng1U64 vaddr_range;\r\n  };\r\n  typedef struct AnnotationNode AnnotationNode;\r\n  struct AnnotationNode\r\n  {\r\n    AnnotationNode *next;\r\n    Annotation *v;\r\n  };\r\n  typedef struct AnnotationList AnnotationList;\r\n  struct AnnotationList\r\n  {\r\n    AnnotationNode *first;\r\n    AnnotationNode *last;\r\n  };\r\n  AnnotationList *visible_memory_annotations = push_array(scratch.arena, AnnotationList, visible_memory_size);\r\n  {\r\n    Access *access = access_open();\r\n    CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n    CTRL_Entity *selected_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process);\r\n    CTRL_CallStack selected_call_stack = ctrl_call_stack_from_thread(access, selected_thread->handle, 1, 0);\r\n    CTRL_Entity *eval_process = &ctrl_entity_nil;\r\n    if(eval.space.kind == CTRL_EvalSpaceKind_Entity)\r\n    {\r\n      eval_process = rd_ctrl_entity_from_eval_space(eval.space);\r\n    }\r\n    \r\n    //- rjf: fill unwind frame annotations\r\n    if(selected_call_stack.concrete_frames_count != 0) UI_Tag(str8_lit(\"weak\"))\r\n    {\r\n      U64 last_stack_top = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs);\r\n      for(U64 idx = 1; idx < selected_call_stack.concrete_frames_count; idx += 1)\r\n      {\r\n        CTRL_CallStackFrame *f = selected_call_stack.concrete_frames[idx];\r\n        U64 f_stack_top = regs_rsp_from_arch_block(selected_thread->arch, f->regs);\r\n        Rng1U64 frame_vaddr_range = r1u64(last_stack_top, f_stack_top);\r\n        Rng1U64 frame_vaddr_range_in_viz = intersect_1u64(frame_vaddr_range, viz_range_bytes);\r\n        last_stack_top = f_stack_top;\r\n        if(dim_1u64(frame_vaddr_range_in_viz) != 0)\r\n        {\r\n          Access *access = access_open();\r\n          U64 f_rip_vaddr = regs_rip_from_arch_block(selected_thread->arch, f->regs);\r\n          CTRL_Entity *module = ctrl_module_from_process_vaddr(selected_process, f_rip_vaddr);\r\n          U64 f_rip_voff = ctrl_voff_from_vaddr(module, f_rip_vaddr);\r\n          DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n          RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n          RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, f_rip_voff);\r\n          String8 procedure_name = {0};\r\n          procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size);\r\n          access_close(access);\r\n          if(procedure_name.size != 0)\r\n          {\r\n            Annotation *annotation = push_array(scratch.arena, Annotation, 1);\r\n            annotation->name_string = push_str8_copy(scratch.arena, procedure_name);\r\n            annotation->kind_string = str8_lit(\"Call Stack Frame\");\r\n            annotation->color = v4f32(0, 0, 0, 0);\r\n            annotation->vaddr_range = frame_vaddr_range;\r\n            for(U64 vaddr = frame_vaddr_range_in_viz.min; vaddr < frame_vaddr_range_in_viz.max; vaddr += 1)\r\n            {\r\n              U64 visible_byte_idx = vaddr - viz_range_bytes.min;\r\n              AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1);\r\n              n->v = annotation;\r\n              SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, n);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill selected thread stack range annotation\r\n    if(selected_call_stack.concrete_frames_count > 0)\r\n    {\r\n      U64 stack_base_vaddr = selected_thread->stack_base;\r\n      U64 stack_top_vaddr = regs_rsp_from_arch_block(selected_thread->arch, selected_call_stack.concrete_frames[0]->regs);\r\n      Rng1U64 stack_vaddr_range = r1u64(stack_base_vaddr, stack_top_vaddr);\r\n      Rng1U64 stack_vaddr_range_in_viz = intersect_1u64(stack_vaddr_range, viz_range_bytes);\r\n      if(dim_1u64(stack_vaddr_range_in_viz) != 0)\r\n      {\r\n        Annotation *annotation = push_array(scratch.arena, Annotation, 1);\r\n        annotation->name_string = selected_thread->string.size ? selected_thread->string : push_str8f(scratch.arena, \"TID: %I64u\", selected_thread->id);\r\n        annotation->kind_string = str8_lit(\"Stack\");\r\n        annotation->color = rd_color_from_ctrl_entity(selected_thread);\r\n        annotation->vaddr_range = stack_vaddr_range;\r\n        for(U64 vaddr = stack_vaddr_range_in_viz.min; vaddr < stack_vaddr_range_in_viz.max; vaddr += 1)\r\n        {\r\n          U64 visible_byte_idx = vaddr - viz_range_bytes.min;\r\n          AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1);\r\n          n->v = annotation;\r\n          SLLQueuePush(visible_memory_annotations[visible_byte_idx].first, visible_memory_annotations[visible_byte_idx].last, n);\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill local variable annotations\r\n    if(e_space_match(rd_eval_space_from_ctrl_entity(selected_process, CTRL_EvalSpaceKind_Entity), eval.space))\r\n    {\r\n      Vec4F32 local_color = ui_color_from_name(str8_lit(\"code_local\"));\r\n      Vec4F32 color_gen_table[] =\r\n      {\r\n        mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.2f),\r\n        mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.4f),\r\n        mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.6f),\r\n        mix_4f32(local_color, v4f32(0, 0, 0, 1), 0.8f),\r\n      };\r\n      U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count);\r\n      for(E_String2NumMapNode *n = e_ir_ctx->locals_map->first; n != 0; n = n->order_next)\r\n      {\r\n        String8 local_name = n->string;\r\n        E_Eval local_eval = e_eval_from_string(local_name);\r\n        if(local_eval.irtree.mode == E_Mode_Offset)\r\n        {\r\n          E_TypeKind local_eval_type_kind = e_type_kind_from_key(local_eval.irtree.type_key);\r\n          U64 local_eval_type_size = e_type_byte_size_from_key(local_eval.irtree.type_key);\r\n          Rng1U64 vaddr_rng = r1u64(local_eval.value.u64, local_eval.value.u64+local_eval_type_size);\r\n          Rng1U64 vaddr_rng_in_visible = intersect_1u64(viz_range_bytes, vaddr_rng);\r\n          if(vaddr_rng_in_visible.max != vaddr_rng_in_visible.min)\r\n          {\r\n            Annotation *annotation = push_array(scratch.arena, Annotation, 1);\r\n            {\r\n              annotation->name_string = push_str8_copy(scratch.arena, local_name);\r\n              annotation->kind_string = str8_lit(\"Local\");\r\n              annotation->type_string = e_type_string_from_key(scratch.arena, local_eval.irtree.type_key);\r\n              annotation->color = color_gen_table[(vaddr_rng.min/7)%ArrayCount(color_gen_table)];\r\n              annotation->vaddr_range = vaddr_rng;\r\n            }\r\n            for(U64 vaddr = vaddr_rng_in_visible.min; vaddr < vaddr_rng_in_visible.max; vaddr += 1)\r\n            {\r\n              AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1);\r\n              n->v = annotation;\r\n              SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill procedures annotations\r\n    if(eval_process != &ctrl_entity_nil)\r\n    {\r\n      Vec4F32 symbol_color = ui_color_from_name(str8_lit(\"code_symbol\"));\r\n      Vec4F32 color_gen_table[] =\r\n      {\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.2f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.4f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.6f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.8f),\r\n      };\r\n      for(U64 vaddr = viz_range_bytes.min, next_vaddr = 0;\r\n          viz_range_bytes.min <= vaddr && vaddr <= viz_range_bytes.max;\r\n          vaddr = next_vaddr)\r\n      {\r\n        next_vaddr = vaddr+1;\r\n        Access *access = access_open();\r\n        CTRL_Entity *module = ctrl_module_from_process_vaddr(eval_process, vaddr);\r\n        if(module != &ctrl_entity_nil)\r\n        {\r\n          U64 voff = ctrl_voff_from_vaddr(module, vaddr);\r\n          DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n          RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n          RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, voff);\r\n          RDI_Scope *root_scope = rdi_element_from_name_idx(rdi, Scopes, procedure->root_scope_idx);\r\n          if(procedure->root_scope_idx != 0)\r\n          {\r\n            Rng1U64 voff_range = r1u64(rdi_first_voff_from_scope(rdi, root_scope),\r\n                                       rdi_opl_voff_from_scope(rdi, root_scope));\r\n            Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range);\r\n            next_vaddr = vaddr_range.max;\r\n            next_vaddr = Max(next_vaddr, vaddr+1);\r\n            Rng1U64 vaddr_range_in_visible = intersect_1u64(vaddr_range, viz_range_bytes);\r\n            if(vaddr_range_in_visible.min < vaddr_range_in_visible.max)\r\n            {\r\n              String8 procedure_name = {0};\r\n              procedure_name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &procedure_name.size);\r\n              Annotation *annotation = push_array(scratch.arena, Annotation, 1);\r\n              {\r\n                annotation->name_string = push_str8_copy(scratch.arena, procedure_name);\r\n                annotation->kind_string = str8_lit(\"Procedure\");\r\n                annotation->color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)];\r\n                annotation->vaddr_range = vaddr_range;\r\n              }\r\n              for(U64 vaddr = vaddr_range_in_visible.min; vaddr < vaddr_range_in_visible.max; vaddr += 1)\r\n              {\r\n                AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1);\r\n                n->v = annotation;\r\n                SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        access_close(access);\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill globals annotations\r\n    if(eval_process != &ctrl_entity_nil)\r\n    {\r\n      Vec4F32 symbol_color = ui_color_from_name(str8_lit(\"code_symbol\"));\r\n      Vec4F32 color_gen_table[] =\r\n      {\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.2f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.4f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.6f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.8f),\r\n      };\r\n      for(U64 vaddr = viz_range_bytes.min, next_vaddr = 0;\r\n          viz_range_bytes.min <= vaddr && vaddr <= viz_range_bytes.max;\r\n          vaddr = next_vaddr)\r\n      {\r\n        next_vaddr = vaddr+1;\r\n        Access *access = access_open();\r\n        CTRL_Entity *module = ctrl_module_from_process_vaddr(eval_process, vaddr);\r\n        if(module != &ctrl_entity_nil)\r\n        {\r\n          U64 voff = ctrl_voff_from_vaddr(module, vaddr);\r\n          DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n          RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n          RDI_GlobalVariable *gvar = rdi_global_variable_from_voff(rdi, voff);\r\n          if(gvar->voff != 0)\r\n          {\r\n            RDI_TypeNode *type_node = rdi_element_from_name_idx(rdi, TypeNodes, gvar->type_idx);\r\n            Rng1U64 voff_range = r1u64(gvar->voff, gvar->voff + type_node->byte_size);\r\n            Rng1U64 vaddr_range = ctrl_vaddr_range_from_voff_range(module, voff_range);\r\n            next_vaddr = vaddr_range.max;\r\n            next_vaddr = Max(next_vaddr, vaddr+1);\r\n            Rng1U64 vaddr_range_in_visible = intersect_1u64(vaddr_range, viz_range_bytes);\r\n            if(vaddr_range_in_visible.min < vaddr_range_in_visible.max)\r\n            {\r\n              String8 gvar_name = {0};\r\n              gvar_name.str = rdi_string_from_idx(rdi, gvar->name_string_idx, &gvar_name.size);\r\n              Annotation *annotation = push_array(scratch.arena, Annotation, 1);\r\n              {\r\n                annotation->name_string = push_str8_copy(scratch.arena, gvar_name);\r\n                annotation->kind_string = str8_lit(\"Global\");\r\n                annotation->color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)];\r\n                annotation->vaddr_range = vaddr_range;\r\n              }\r\n              for(U64 vaddr = vaddr_range_in_visible.min; vaddr < vaddr_range_in_visible.max; vaddr += 1)\r\n              {\r\n                AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1);\r\n                n->v = annotation;\r\n                SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        access_close(access);\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill debuggee-specified annotations\r\n    if(eval_process != &ctrl_entity_nil) UI_TagF(\".\") UI_TagF(\"pop\")\r\n    {\r\n      Vec4F32 symbol_color = ui_color_from_name(str8_lit(\"background\"));\r\n      Vec4F32 color_gen_table[] =\r\n      {\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.00f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.05f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.10f),\r\n        mix_4f32(symbol_color, v4f32(0, 0, 0, 1), 0.15f),\r\n      };\r\n      for(CTRL_Entity *child = eval_process->first; child != &ctrl_entity_nil; child = child->next)\r\n      {\r\n        if(child->kind != CTRL_EntityKind_AddressRangeAnnotation)\r\n        {\r\n          continue;\r\n        }\r\n        String8 name = child->string;\r\n        Rng1U64 vaddr_range = child->vaddr_range;\r\n        Rng1U64 vaddr_range_in_visible = intersect_1u64(vaddr_range, viz_range_bytes);\r\n        if(vaddr_range_in_visible.max > vaddr_range_in_visible.min)\r\n        {\r\n          Annotation *annotation = push_array(scratch.arena, Annotation, 1);\r\n          {\r\n            annotation->name_string = push_str8_copy(scratch.arena, name);\r\n            annotation->kind_string = str8_lit(\"Annotation\");\r\n            annotation->color = color_gen_table[(vaddr_range.min/7)%ArrayCount(color_gen_table)];\r\n            annotation->vaddr_range = vaddr_range;\r\n          }\r\n          for(U64 vaddr = vaddr_range_in_visible.min; vaddr < vaddr_range_in_visible.max; vaddr += 1)\r\n          {\r\n            AnnotationNode *n = push_array(scratch.arena, AnnotationNode, 1);\r\n            n->v = annotation;\r\n            SLLQueuePushFront(visible_memory_annotations[vaddr-viz_range_bytes.min].first, visible_memory_annotations[vaddr-viz_range_bytes.min].last, n);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    access_close(access);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build main container\r\n  //\r\n  UI_Box *container_box = &ui_nil_box;\r\n  {\r\n    Vec2F32 dim = dim_2f32(rect);\r\n    ui_set_next_fixed_width(dim.x);\r\n    ui_set_next_fixed_height(dim.y);\r\n    ui_set_next_child_layout_axis(Axis2_Y);\r\n    container_box = ui_build_box_from_stringf(0, \"memory_view_container\");\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build scroll bar\r\n  //\r\n  UI_Parent(container_box) UI_FontSize(main_font_size)\r\n  {\r\n    ui_set_next_fixed_x(content_rect.x1);\r\n    ui_set_next_fixed_y(0);\r\n    ui_set_next_fixed_width(scroll_bar_dim);\r\n    ui_set_next_fixed_height(dim_2f32(rect).y);\r\n    {\r\n      scroll_pos.y = ui_scroll_bar(Axis2_Y,\r\n                                   ui_px(scroll_bar_dim, 1.f),\r\n                                   scroll_pos.y,\r\n                                   scroll_idx_rng,\r\n                                   num_possible_visible_rows);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build header\r\n  //\r\n  UI_Box *header_box = &ui_nil_box;\r\n  UI_Parent(container_box) UI_TagF(\"floating\")\r\n  {\r\n    UI_Rect(r2f32p(0, 0, dim_2f32(rect).x - scroll_bar_dim, row_height_px))\r\n      header_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideBottom|\r\n                                             UI_BoxFlag_DrawBackground|\r\n                                             UI_BoxFlag_DrawDropShadow|\r\n                                             UI_BoxFlag_DrawBackgroundBlur|\r\n                                             UI_BoxFlag_Floating, \"table_header\");\r\n    UI_Parent(header_box)\r\n      RD_Font(RD_FontSlot_Code)\r\n      UI_FontSize(font_size)\r\n    {\r\n      UI_PrefWidth(ui_px(big_glyph_advance*20.f, 1.f)) ui_labelf(\"Address\");\r\n      UI_PrefWidth(ui_px(cell_width_px, 1.f))\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n      {\r\n        Rng1U64 col_selection_rng = r1u64(cursor_base_vaddr%num_columns, mark_base_vaddr%num_columns);\r\n        for(U64 row_off = 0; row_off < num_columns; row_off += 1)\r\n        {\r\n          B32 column_is_selected = (selection.min%num_columns <= row_off && row_off <= selection.max%num_columns);\r\n          UI_TagF(column_is_selected ? \"\" : \"weak\") ui_labelf(\"%I64X\", row_off);\r\n        }\r\n      }\r\n      ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f));\r\n      UI_WidthFill ui_labelf(\"ASCII\");\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build footer\r\n  //\r\n  UI_Box *footer_box = &ui_nil_box;\r\n  UI_Parent(container_box) UI_FontSize(main_font_size) UI_TagF(\"floating\")\r\n  {\r\n    ui_set_next_fixed_x(footer_rect.x0);\r\n    ui_set_next_fixed_y(footer_rect.y0);\r\n    ui_set_next_fixed_width(dim_2f32(footer_rect).x);\r\n    ui_set_next_fixed_height(dim_2f32(footer_rect).y);\r\n    footer_box = ui_build_box_from_stringf(UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow, \"footer\");\r\n    UI_Parent(footer_box) RD_Font(RD_FontSlot_Code)\r\n    {\r\n      UI_PrefWidth(ui_em(7.5f, 1.f)) UI_HeightFill UI_Column UI_TagF(\"weak\")\r\n        UI_PrefHeight(ui_em(2.f, 0.f))\r\n      {\r\n        ui_labelf(\"Address:\");\r\n        ui_labelf(\"U8:\");\r\n        ui_labelf(\"U16:\");\r\n        ui_labelf(\"U32:\");\r\n        ui_labelf(\"U64:\");\r\n      }\r\n      UI_PrefWidth(ui_em(45.f, 1.f)) UI_HeightFill UI_Column\r\n        UI_PrefHeight(ui_em(2.f, 0.f))\r\n      {\r\n        ui_labelf(\"%016I64X\", cursor_base_vaddr);\r\n        {\r\n          U64 as_u8  = 0;\r\n          U64 as_u16 = 0;\r\n          U64 as_u32 = 0;\r\n          U64 as_u64 = 0;\r\n          e_space_read(eval.space, &as_u64, r1u64(cursor_base_vaddr, cursor_base_vaddr+1));\r\n          as_u32 = *(U32 *)&as_u64;\r\n          as_u16 = *(U16 *)&as_u64;\r\n          as_u8  =  *(U8 *)&as_u64;\r\n          ui_labelf(\"%02X (%I64u)\",  as_u8,  as_u8);\r\n          ui_labelf(\"%04X (%I64u)\",  as_u16, as_u16);\r\n          ui_labelf(\"%08X (%I64u)\",  as_u32, as_u32);\r\n          ui_labelf(\"%016I64X (%I64u)\", as_u64, as_u64);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build scrollable box\r\n  //\r\n  UI_Box *scrollable_box = &ui_nil_box;\r\n  UI_Parent(container_box)\r\n  {\r\n    ui_set_next_fixed_x(content_rect.x0);\r\n    ui_set_next_fixed_y(content_rect.y0);\r\n    ui_set_next_fixed_width(dim_2f32(content_rect).x);\r\n    ui_set_next_fixed_height(dim_2f32(content_rect).y);\r\n    scrollable_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|\r\n                                               UI_BoxFlag_Scroll|\r\n                                               UI_BoxFlag_AllowOverflowY,\r\n                                               \"scrollable_box\");\r\n    container_box->view_off.x = container_box->view_off_target.x = scroll_pos.x.idx + scroll_pos.x.off;\r\n    scrollable_box->view_off.y = scrollable_box->view_off_target.y = floor_f32(row_height_px*mod_f32(scroll_pos.y.off, 1.f) + row_height_px*(scroll_pos.y.off < 0));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build row container/overlay\r\n  //\r\n  UI_Box *row_container_box = &ui_nil_box;\r\n  UI_Box *row_overlay_box = &ui_nil_box;\r\n  UI_Parent(scrollable_box) UI_WidthFill UI_HeightFill\r\n  {\r\n    ui_set_next_child_layout_axis(Axis2_Y);\r\n    row_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"row_container\");\r\n    UI_Parent(row_container_box)\r\n    {\r\n      row_overlay_box = ui_build_box_from_stringf(UI_BoxFlag_Floating, \"row_overlay\");\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: interact with row container\r\n  //\r\n  U64 mouse_hover_byte_num = 0;\r\n  {\r\n    UI_Signal sig = ui_signal_from_box(row_container_box);\r\n    \r\n    // rjf: calculate hovered byte\r\n    if(ui_hovering(sig) || ui_dragging(sig))\r\n    {\r\n      Vec2F32 mouse_rel = sub_2f32(ui_mouse(), row_container_box->rect.p0);\r\n      U64 row_idx = ClampBot(0, mouse_rel.y) / row_height_px;\r\n      \r\n      // rjf: try from cells\r\n      if(mouse_hover_byte_num == 0)\r\n      {\r\n        U64 col_idx = ClampBot(mouse_rel.x-big_glyph_advance*20.f, 0)/cell_width_px;\r\n        if(col_idx < num_columns)\r\n        {\r\n          mouse_hover_byte_num = viz_range_bytes.min + row_idx*num_columns + col_idx + 1;\r\n        }\r\n      }\r\n      \r\n      // rjf: try from ascii\r\n      if(mouse_hover_byte_num == 0)\r\n      {\r\n        U64 col_idx = ClampBot(mouse_rel.x - (big_glyph_advance*20.f + cell_width_px*num_columns + big_glyph_advance*1.5f), 0)/big_glyph_advance;\r\n        col_idx = ClampTop(col_idx, num_columns-1);\r\n        mouse_hover_byte_num = viz_range_bytes.min + row_idx*num_columns + col_idx + 1;\r\n      }\r\n      \r\n      mouse_hover_byte_num = Clamp(1, mouse_hover_byte_num, 0x7FFFFFFFFFFFull+1);\r\n    }\r\n    \r\n    // rjf: press -> focus panel\r\n    if(ui_pressed(sig))\r\n    {\r\n      rd_cmd(RD_CmdKind_FocusPanel);\r\n    }\r\n    \r\n    // rjf: click & drag -> select\r\n    if(ui_dragging(sig) && mouse_hover_byte_num != 0)\r\n    {\r\n      if(!contains_2f32(sig.box->rect, ui_mouse()))\r\n      {\r\n        mv->contain_cursor = 1;\r\n      }\r\n      cursor_base_vaddr = mouse_hover_byte_num-1;\r\n      if(ui_pressed(sig))\r\n      {\r\n        mark_base_vaddr = cursor_base_vaddr;\r\n      }\r\n    }\r\n    \r\n    // rjf: ctrl+scroll -> change font size\r\n    if(ui_hovering(sig))\r\n    {\r\n      for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n      {\r\n        if(evt->kind == UI_EventKind_Scroll && evt->modifiers & OS_Modifier_Ctrl)\r\n        {\r\n          ui_eat_event(evt);\r\n          if(evt->delta_2f32.y < 0)\r\n          {\r\n            rd_cmd(RD_CmdKind_IncViewFontSize);\r\n          }\r\n          else if(evt->delta_2f32.y > 0)\r\n          {\r\n            rd_cmd(RD_CmdKind_DecViewFontSize);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: rich hover\r\n    if(mouse_hover_byte_num != 0)\r\n    {\r\n      Rng1U64 hovered_range = r1u64(mouse_hover_byte_num-1, mouse_hover_byte_num-1 + 1);\r\n      if(ui_dragging(sig) && !ui_pressed(sig) && dim_1u64(selection) != 0)\r\n      {\r\n        hovered_range = selection;\r\n      }\r\n      RD_RegsScope(.vaddr_range = hovered_range, .eval_space = eval.space, .src_ui_key = memory_rich_hover_key)\r\n        rd_set_hover_regs(RD_RegSlot_VaddrRange);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build rows\r\n  //\r\n  UI_Parent(row_container_box) RD_Font(RD_FontSlot_Code) UI_FontSize(font_size)\r\n  {\r\n    U8 *row_ascii_buffer = push_array(scratch.arena, U8, num_columns);\r\n    UI_WidthFill UI_PrefHeight(ui_px(row_height_px, 1.f))\r\n      for(S64 row_idx = viz_range_rows.min; row_idx <= viz_range_rows.max; row_idx += 1)\r\n    {\r\n      Rng1U64 row_range_bytes = r1u64(view_range.min + row_idx*num_columns, view_range.min + (row_idx+1)*num_columns);\r\n      if(row_range_bytes.min >= view_range.max)\r\n      {\r\n        break;\r\n      }\r\n      UI_BoxFlags row_flags = 0;\r\n      UI_Box *row = ui_build_box_from_stringf(row_flags, \"row_%I64x\", row_range_bytes.min);\r\n      UI_Parent(row)\r\n      {\r\n        UI_PrefWidth(ui_px(big_glyph_advance*20.f, 1.f))\r\n        {\r\n          if(!(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max))\r\n          {\r\n            ui_set_next_tag(str8_lit(\"weak\"));\r\n          }\r\n          ui_labelf(\"0x%016I64x\", row_range_bytes.min);\r\n        }\r\n        UI_PrefWidth(ui_px(cell_width_px, 1.f))\r\n          UI_TextAlignment(UI_TextAlign_Center)\r\n          UI_CornerRadius(0)\r\n        {\r\n          for(U64 col_idx = 0; col_idx < num_columns; col_idx += 1)\r\n          {\r\n            // rjf: unpack information about this slot\r\n            U64 visible_byte_idx = (row_idx-viz_range_rows.min)*num_columns + col_idx;\r\n            U64 global_byte_idx = viz_range_bytes.min+visible_byte_idx;\r\n            U64 global_byte_num = global_byte_idx+1;\r\n            \r\n            // rjf: build space, if this cell is out-of-range\r\n            if(global_byte_idx >= viz_range_bytes.max)\r\n            {\r\n              ui_build_box_from_key(0, ui_key_zero());\r\n            }\r\n            \r\n            // rjf: build actual cell\r\n            else\r\n            {\r\n              // rjf: unpack byte info\r\n              B32 byte_is_selected = (selection.min <= global_byte_idx && global_byte_idx <= selection.max);\r\n              U8 byte_value = visible_memory[visible_byte_idx];\r\n              B32 byte_is_bad = !!(visible_memory_bad_flags[visible_byte_idx/64] & (1ull<<(visible_byte_idx%64)));\r\n              B32 byte_is_changed = !!(visible_memory_change_flags[visible_byte_idx/64] & (1ull<<(visible_byte_idx%64)));\r\n              AnnotationNode *annotation_node = visible_memory_annotations[visible_byte_idx].first;\r\n              \r\n              // rjf: unpack visual cell info\r\n              UI_BoxFlags cell_flags = 0;\r\n              Vec4F32 cell_bg_rgba = {0};\r\n              Vec4F32 cell_bd_rgba = ui_color_from_name(str8_lit(\"text\"));\r\n              if(global_byte_num == mouse_hover_byte_num)\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawDropShadow;\r\n              }\r\n              if(annotation_node != 0)\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawBackground;\r\n                Vec4F32 cell_bg_color_rgba = annotation_node->v->color;\r\n                Vec4F32 cell_bg_color_hsva = hsva_from_rgba(cell_bg_color_rgba);\r\n                cell_bg_rgba = mix_4f32(cell_bg_color_rgba, main_bg_color_rgba, clamp_1f32(r1f32(0, 1), 1.f - abs_f32(cell_bg_color_hsva.z - main_tx_color_hsva.z)*0.5f));\r\n              }\r\n              if(selection.min == global_byte_idx)\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawSideLeft;\r\n              }\r\n              if(selection.max == global_byte_idx)\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawSideRight;\r\n              }\r\n              if(row_idx == (selection.min - view_range.min)/num_columns && selection.min <= global_byte_idx && global_byte_idx <= selection.max)\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawSideTop;\r\n              }\r\n              if(row_idx == (selection.max - view_range.min)/num_columns && selection.min <= global_byte_idx && global_byte_idx <= selection.max)\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawSideBottom;\r\n              }\r\n              if(contains_1u64(rich_hover_range, global_byte_idx)) UI_TagF(\"pop\")\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawBackground;\r\n                cell_bg_rgba = ui_color_from_name(str8_lit(\"background\"));\r\n              }\r\n              if(byte_is_changed) UI_TagF(\"fresh\")\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawBackground;\r\n                cell_bg_rgba = ui_color_from_name(str8_lit(\"background\"));\r\n              }\r\n              if(byte_is_bad) UI_TagF(\"bad_pop\")\r\n              {\r\n                cell_flags |= UI_BoxFlag_DrawBackground;\r\n                cell_bg_rgba = ui_color_from_name(str8_lit(\"background\"));\r\n              }\r\n              \r\n              // rjf: build\r\n              if(cell_bd_rgba.w != 0) { ui_set_next_border_color(cell_bd_rgba); }\r\n              if(cell_bg_rgba.w != 0) { ui_set_next_background_color(cell_bg_rgba); }\r\n              UI_Box *cell_box = ui_build_box_from_key(UI_BoxFlag_DrawText|cell_flags, ui_key_zero());\r\n              if(byte_is_selected || byte_is_changed)\r\n              {\r\n                ui_box_equip_display_fstrs(cell_box, &byte_fstrs_selected[byte_value]);\r\n              }\r\n              else\r\n              {\r\n                ui_box_equip_display_fstrs(cell_box, &byte_fstrs[byte_value]);\r\n              }\r\n              {\r\n                for(AnnotationNode *a_n = annotation_node; a_n != 0; a_n = a_n->next)\r\n                {\r\n                  Annotation *a = a_n->v;\r\n                  if(global_byte_idx == a->vaddr_range.min) UI_Parent(row_overlay_box)\r\n                  {\r\n                    F32 size = cell_width_px/4.f + cell_width_px/8.f*ui_anim(ui_key_from_stringf(ui_active_seed_key(), \"###annotation_hovered_%I64x_%I64x\", a->vaddr_range.min, a->vaddr_range.max),\r\n                                                                             (F32)!!(a->vaddr_range.min+1 <= mouse_hover_byte_num && mouse_hover_byte_num <= a->vaddr_range.max));\r\n                    ui_set_next_border_color(a->color);\r\n                    ui_set_next_fixed_x(big_glyph_advance*20.f + col_idx*cell_width_px + -size*0.5f);\r\n                    ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + -size*0.5f);\r\n                    ui_set_next_fixed_width(size);\r\n                    ui_set_next_fixed_height(size);\r\n                    ui_set_next_corner_radius_00(cell_width_px/8.f);\r\n                    ui_set_next_corner_radius_01(cell_width_px/8.f);\r\n                    ui_set_next_corner_radius_10(cell_width_px/8.f);\r\n                    ui_set_next_corner_radius_11(cell_width_px/8.f);\r\n                    ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_DrawSideTop|UI_BoxFlag_DrawDropShadow, ui_key_zero());\r\n                  }\r\n                  if(global_byte_idx+1 == a->vaddr_range.max) UI_Parent(row_overlay_box)\r\n                  {\r\n                    F32 size = cell_width_px/4.f + cell_width_px/8.f*ui_anim(ui_key_from_stringf(ui_active_seed_key(), \"###annotation_hovered_%I64x_%I64x\", a->vaddr_range.min, a->vaddr_range.max),\r\n                                                                             (F32)!!(a->vaddr_range.min+1 <= mouse_hover_byte_num && mouse_hover_byte_num <= a->vaddr_range.max));\r\n                    ui_set_next_border_color(a->color);\r\n                    ui_set_next_fixed_x(big_glyph_advance*20.f + (col_idx+1)*cell_width_px + -size*0.5f);\r\n                    ui_set_next_fixed_y((row_idx-viz_range_rows.min)*row_height_px + row_height_px + -size*0.5f);\r\n                    ui_set_next_fixed_width(size);\r\n                    ui_set_next_fixed_height(size);\r\n                    ui_set_next_corner_radius_00(cell_width_px/8.f);\r\n                    ui_set_next_corner_radius_01(cell_width_px/8.f);\r\n                    ui_set_next_corner_radius_10(cell_width_px/8.f);\r\n                    ui_set_next_corner_radius_11(cell_width_px/8.f);\r\n                    ui_build_box_from_key(UI_BoxFlag_Floating|UI_BoxFlag_DrawSideRight|UI_BoxFlag_DrawSideBottom|UI_BoxFlag_DrawDropShadow, ui_key_zero());\r\n                  }\r\n                }\r\n              }\r\n              if(annotation_node != 0 && mouse_hover_byte_num == global_byte_num)\r\n              {\r\n                UI_Tooltip UI_FontSize(ui_top_font_size()) UI_PrefHeight(ui_px(ui_top_font_size()*1.75f, 1.f))\r\n                {\r\n                  for(AnnotationNode *a_n = annotation_node; a_n != 0; a_n = a_n->next)\r\n                  {\r\n                    Annotation *a = a_n->v;\r\n                    UI_PrefWidth(ui_children_sum(1)) UI_Row UI_PrefWidth(ui_text_dim(10, 1))\r\n                    {\r\n                      RD_Font(RD_FontSlot_Code) rd_code_label(1.f, 0, ui_color_from_name(str8_lit(\"code_default\")), a->name_string);\r\n                      UI_TagF(\"weak\") RD_Font(RD_FontSlot_Main) ui_label(a->kind_string);\r\n                    }\r\n                    if(a->type_string.size != 0)\r\n                    {\r\n                      rd_code_label(1.f, 1, ui_color_from_name(str8_lit(\"code_type\")), a->type_string);\r\n                    }\r\n                    UI_FlagsAdd(UI_BoxFlag_DrawTextWeak) ui_label(str8_from_memory_size(scratch.arena, dim_1u64(a->vaddr_range)));\r\n                    if(a_n->next != 0)\r\n                    {\r\n                      ui_spacer(ui_em(1.5f, 1.f));\r\n                    }\r\n                  }\r\n                }\r\n              }\r\n            }\r\n          }\r\n        }\r\n        ui_spacer(ui_px(big_glyph_advance*1.5f, 1.f));\r\n        UI_WidthFill\r\n        {\r\n          MemoryZero(row_ascii_buffer, num_columns);\r\n          U64 num_bytes_this_row = 0;\r\n          for(U64 col_idx = 0; col_idx < num_columns; col_idx += 1)\r\n          {\r\n            U64 visible_byte_idx = (row_idx-viz_range_rows.min)*num_columns + col_idx;\r\n            if(visible_byte_idx < visible_memory_size)\r\n            {\r\n              U8 byte_value = visible_memory[visible_byte_idx];\r\n              row_ascii_buffer[col_idx] = byte_value;\r\n              if(byte_value <= 32 || 127 < byte_value)\r\n              {\r\n                row_ascii_buffer[col_idx] = '.';\r\n              }\r\n              num_bytes_this_row += 1;\r\n            }\r\n          }\r\n          String8 ascii_text = str8(row_ascii_buffer, num_bytes_this_row);\r\n          UI_Box *ascii_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, \"%S###ascii_row_%I64x\", ascii_text, row_range_bytes.min);\r\n          if(selection.max >= row_range_bytes.min && selection.min < row_range_bytes.max)\r\n          {\r\n            Rng1U64 selection_in_row = intersect_1u64(row_range_bytes, selection);\r\n            DR_Bucket *bucket = dr_bucket_make();\r\n            DR_BucketScope(bucket)\r\n            {\r\n              Vec2F32 text_pos = ui_box_text_position(ascii_box);\r\n              Vec4F32 color = selection_color;\r\n              dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.min+0-row_range_bytes.min)).x - font_size/8.f,\r\n                             ascii_box->rect.y0,\r\n                             text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, selection_in_row.max+1-row_range_bytes.min)).x + font_size/4.f,\r\n                             ascii_box->rect.y1),\r\n                      color,\r\n                      0, 0, 1.f);\r\n            }\r\n            ui_box_equip_draw_bucket(ascii_box, bucket);\r\n          }\r\n          if(mouse_hover_byte_num != 0 && contains_1u64(row_range_bytes, mouse_hover_byte_num-1))\r\n          {\r\n            DR_Bucket *bucket = dr_bucket_make();\r\n            DR_BucketScope(bucket)\r\n            {\r\n              Vec2F32 text_pos = ui_box_text_position(ascii_box);\r\n              Vec4F32 color = border_color;\r\n              dr_rect(r2f32p(text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num-1-row_range_bytes.min)).x - font_size/8.f,\r\n                             ascii_box->rect.y0,\r\n                             text_pos.x + fnt_dim_from_tag_size_string(font, font_size, 0, 0, str8_prefix(ascii_text, mouse_hover_byte_num+0-row_range_bytes.min)).x + font_size/4.f,\r\n                             ascii_box->rect.y1),\r\n                      color,\r\n                      1.f, 3.f, 1.f);\r\n            }\r\n            ui_box_equip_draw_bucket(ascii_box, bucket);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: scroll\r\n  //\r\n  {\r\n    UI_Signal sig = ui_signal_from_box(scrollable_box);\r\n    if(sig.scroll.y != 0)\r\n    {\r\n      S64 new_idx = scroll_pos.y.idx + sig.scroll.y;\r\n      new_idx = clamp_1s64(scroll_idx_rng, new_idx);\r\n      ui_scroll_pt_target_idx(&scroll_pos.y, new_idx);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: re-clamp\r\n  //\r\n  if(cursor_base_vaddr != initial_cursor_base_vaddr)\r\n  {\r\n    cursor_base_vaddr = clamp_1u64(cursor_valid_rng, cursor_base_vaddr);\r\n  }\r\n  if(mark_base_vaddr != initial_mark_base_vaddr)\r\n  {\r\n    mark_base_vaddr = clamp_1u64(cursor_valid_rng, mark_base_vaddr);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: save parameters\r\n  //\r\n  mv->last_cursor_range = r1u64(cursor_base_vaddr, cursor_base_vaddr + cursor_size);\r\n  mv->last_cursor_range_inited = 1;\r\n  if(cursor_base_vaddr != initial_cursor_base_vaddr)\r\n  {\r\n    rd_store_view_param_u64(str8_lit(\"cursor\"), cursor_base_vaddr);\r\n  }\r\n  if(mark_base_vaddr != initial_mark_base_vaddr)\r\n  {\r\n    rd_store_view_param_u64(str8_lit(\"mark\"), mark_base_vaddr);\r\n  }\r\n  rd_store_view_scroll_pos(scroll_pos);\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: \"graph\"\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(graph)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 8;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: bitmap @view_hook_impl\r\n\r\ntypedef struct RD_BitmapTopology RD_BitmapTopology;\r\nstruct RD_BitmapTopology\r\n{\r\n  Vec2S16 dim;\r\n  R_Tex2DFormat fmt;\r\n};\r\n\r\ntypedef struct RD_BitmapBoxDrawData RD_BitmapBoxDrawData;\r\nstruct RD_BitmapBoxDrawData\r\n{\r\n  Rng2F32 src;\r\n  R_Handle texture;\r\n  F32 loaded_t;\r\n  B32 hovered;\r\n  Vec2S32 mouse_px;\r\n  F32 ui_per_bmp_px;\r\n};\r\n\r\ntypedef struct RD_BitmapCanvasBoxDrawData RD_BitmapCanvasBoxDrawData;\r\nstruct RD_BitmapCanvasBoxDrawData\r\n{\r\n  Vec2F32 view_center_pos;\r\n  F32 zoom;\r\n};\r\n\r\ninternal AC_Artifact\r\nrd_bitmap_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  Access *access = access_open();\r\n  \r\n  //- rjf: unpack key\r\n  U128 hash = {0};\r\n  RD_BitmapTopology top = {0};\r\n  {\r\n    U64 key_read_off = 0;\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &hash);\r\n    key_read_off += str8_deserial_read_struct(key, key_read_off, &top);\r\n  }\r\n  String8 data = c_data_from_hash(access, hash);\r\n  \r\n  //- rjf: create texture\r\n  R_Handle texture = {0};\r\n  if(top.dim.x > 0 && top.dim.y > 0 &&\r\n     data.size >= (U64)top.dim.x*(U64)top.dim.y*(U64)r_tex2d_format_bytes_per_pixel_table[top.fmt])\r\n  {\r\n    texture = r_tex2d_alloc(R_ResourceKind_Static, v2s32(top.dim.x, top.dim.y), top.fmt, data.str);\r\n  }\r\n  \r\n  //- rjf: bundle as artifact\r\n  AC_Artifact artifact = {0};\r\n  StaticAssert(sizeof(artifact) >= sizeof(texture), tex_artifact_size_check);\r\n  MemoryCopy(&artifact, &texture, Min(sizeof(texture), sizeof(artifact)));\r\n  \r\n  access_close(access);\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\nrd_bitmap_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  R_Handle texture = {0};\r\n  MemoryCopy(&texture, &artifact, Min(sizeof(texture), sizeof(artifact)));\r\n  r_tex2d_release(texture);\r\n}\r\n\r\ninternal Vec2F32\r\nrd_bitmap_screen_from_canvas_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 cvs)\r\n{\r\n  Vec2F32 scr =\r\n  {\r\n    (rect.x0+rect.x1)/2 + (cvs.x - view_center_pos.x) * zoom,\r\n    (rect.y0+rect.y1)/2 + (cvs.y - view_center_pos.y) * zoom,\r\n  };\r\n  return scr;\r\n}\r\n\r\ninternal Rng2F32\r\nrd_bitmap_screen_from_canvas_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 cvs)\r\n{\r\n  Rng2F32 scr = r2f32(rd_bitmap_screen_from_canvas_pos(view_center_pos, zoom, rect, cvs.p0), rd_bitmap_screen_from_canvas_pos(view_center_pos, zoom, rect, cvs.p1));\r\n  return scr;\r\n}\r\n\r\ninternal Vec2F32\r\nrd_bitmap_canvas_from_screen_pos(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Vec2F32 scr)\r\n{\r\n  Vec2F32 cvs =\r\n  {\r\n    (scr.x - (rect.x0+rect.x1)/2) / zoom + view_center_pos.x,\r\n    (scr.y - (rect.y0+rect.y1)/2) / zoom + view_center_pos.y,\r\n  };\r\n  return cvs;\r\n}\r\n\r\ninternal Rng2F32\r\nrd_bitmap_canvas_from_screen_rect(Vec2F32 view_center_pos, F32 zoom, Rng2F32 rect, Rng2F32 scr)\r\n{\r\n  Rng2F32 cvs = r2f32(rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, rect, scr.p0), rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, rect, scr.p1));\r\n  return cvs;\r\n}\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(rd_bitmap_view_canvas_box_draw)\r\n{\r\n  RD_BitmapCanvasBoxDrawData *draw_data = (RD_BitmapCanvasBoxDrawData *)user_data;\r\n  Rng2F32 rect_scrn = box->rect;\r\n  Rng2F32 rect_cvs = rd_bitmap_canvas_from_screen_rect(draw_data->view_center_pos, draw_data->zoom, rect_scrn, rect_scrn);\r\n  F32 grid_cell_size_cvs = box->font_size*10.f;\r\n  F32 grid_line_thickness_px = Max(2.f, box->font_size*0.1f);\r\n  Vec4F32 grid_line_color = {0};\r\n  UI_TagF(\"weak\")\r\n  {\r\n    grid_line_color = ui_color_from_name(str8_lit(\"text\"));\r\n  }\r\n  for EachEnumVal(Axis2, axis)\r\n  {\r\n    for(F32 v = rect_cvs.p0.v[axis] - mod_f32(rect_cvs.p0.v[axis], grid_cell_size_cvs);\r\n        v < rect_cvs.p1.v[axis];\r\n        v += grid_cell_size_cvs)\r\n    {\r\n      Vec2F32 p_cvs = {0};\r\n      p_cvs.v[axis] = v;\r\n      Vec2F32 p_scr = rd_bitmap_screen_from_canvas_pos(draw_data->view_center_pos, draw_data->zoom, rect_scrn, p_cvs);\r\n      Rng2F32 rect = {0};\r\n      rect.p0.v[axis] = p_scr.v[axis] - grid_line_thickness_px/2;\r\n      rect.p1.v[axis] = p_scr.v[axis] + grid_line_thickness_px/2;\r\n      rect.p0.v[axis2_flip(axis)] = box->rect.p0.v[axis2_flip(axis)];\r\n      rect.p1.v[axis2_flip(axis)] = box->rect.p1.v[axis2_flip(axis)];\r\n      dr_rect(rect, grid_line_color, 0, 0, 1.f);\r\n    }\r\n  }\r\n}\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(bitmap)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 8;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(bitmap)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if parameterized by a register-space evaluation, interpret as an\r\n  // address in the primary module.\r\n  //\r\n  if(e_space_match(eval.space, e_base_ctx->thread_reg_space))\r\n  {\r\n    eval = e_value_eval_from_eval(eval);\r\n    eval.space = e_base_ctx->primary_module->space;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: evaluate expression\r\n  //\r\n  Vec2S32 dim = v2s32((S32)rd_view_setting_u64_from_name(str8_lit(\"w\")), (S32)rd_view_setting_u64_from_name(str8_lit(\"h\")));\r\n  String8 fmt_string = rd_view_setting_from_name(str8_lit(\"fmt\"));\r\n  R_Tex2DFormat fmt = R_Tex2DFormat_RGBA8;\r\n  for EachEnumVal(R_Tex2DFormat, f)\r\n  {\r\n    if(str8_match(fmt_string, r_tex2d_format_display_string_table[f], StringMatchFlag_CaseInsensitive))\r\n    {\r\n      fmt = f;\r\n      break;\r\n    }\r\n  }\r\n  Rng1U64 eval_range = e_range_from_eval(eval);\r\n  U64 base_offset = eval_range.min;\r\n  U64 expected_size = dim.x*dim.y*r_tex2d_format_bytes_per_pixel_table[fmt];\r\n  Rng1U64 offset_range = r1u64(base_offset, base_offset + expected_size);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack params\r\n  //\r\n  F32 zoom = rd_view_setting_value_from_name(str8_lit(\"zoom\")).f32;\r\n  Vec2F32 view_center_pos =\r\n  {\r\n    rd_view_setting_value_from_name(str8_lit(\"x\")).f32,\r\n    rd_view_setting_value_from_name(str8_lit(\"y\")).f32,\r\n  };\r\n  if(zoom == 0)\r\n  {\r\n    F32 available_dim_y = dim_2f32(rect).y;\r\n    F32 image_dim_y = (F32)dim.y;\r\n    if(image_dim_y != 0)\r\n    {\r\n      zoom = (available_dim_y / image_dim_y) * 0.8f;\r\n    }\r\n    else\r\n    {\r\n      zoom = 1.f;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: map expression artifacts -> texture\r\n  //\r\n  C_Key texture_key = rd_key_from_eval_space_range(eval.space, offset_range, 0);\r\n  RD_BitmapTopology topology = {v2s16(dim.x, dim.y), fmt};\r\n  U128 data_hash = {0};\r\n  R_Handle texture = {0};\r\n  for EachIndex(rewind_idx, C_KEY_HASH_HISTORY_COUNT)\r\n  {\r\n    U128 hash = c_hash_from_key(texture_key, rewind_idx);\r\n#pragma pack(push, 1)\r\n    struct\r\n    {\r\n      U128 hash;\r\n      RD_BitmapTopology top;\r\n    }\r\n    key_data = {hash, topology};\r\n#pragma pack(pop)\r\n    String8 key = str8_struct(&key_data);\r\n    AC_Artifact artifact = ac_artifact_from_key(access, key, rd_bitmap_artifact_create, rd_bitmap_artifact_destroy, 0);\r\n    R_Handle texture_candidate = {0};\r\n    MemoryCopy(&texture_candidate, &artifact, Min(sizeof(texture_candidate), sizeof(artifact)));\r\n    if(!r_handle_match(texture_candidate, r_handle_zero()))\r\n    {\r\n      data_hash = hash;\r\n      texture = texture_candidate;\r\n      break;\r\n    }\r\n  }\r\n  String8 data = c_data_from_hash(access, data_hash);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: equip loading info\r\n  //\r\n  if(offset_range.max != offset_range.min &&\r\n     eval.string.size != 0 &&\r\n     eval.msgs.max_kind == E_MsgKind_Null &&\r\n     (u128_match(data_hash, u128_zero()) ||\r\n      r_handle_match(texture, r_handle_zero()) ||\r\n      data.size == 0))\r\n  {\r\n    rd_store_view_loading_info(1, 0, 0);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build canvas box\r\n  //\r\n  UI_Box *canvas_box = &ui_nil_box;\r\n  Vec2F32 canvas_dim = dim_2f32(rect);\r\n  Rng2F32 canvas_rect = r2f32p(0, 0, canvas_dim.x, canvas_dim.y);\r\n  UI_Rect(canvas_rect)\r\n  {\r\n    canvas_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, \"bmp_canvas\");\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: canvas dragging\r\n  //\r\n  UI_Signal canvas_sig = ui_signal_from_box(canvas_box);\r\n  {\r\n    if(ui_dragging(canvas_sig))\r\n    {\r\n      if(ui_pressed(canvas_sig))\r\n      {\r\n        rd_cmd(RD_CmdKind_FocusPanel);\r\n        ui_store_drag_struct(&view_center_pos);\r\n      }\r\n      Vec2F32 start_view_center_pos = *ui_get_drag_struct(Vec2F32);\r\n      Vec2F32 drag_delta_scr = ui_drag_delta();\r\n      Vec2F32 drag_delta_cvs = scale_2f32(drag_delta_scr, 1.f/zoom);\r\n      Vec2F32 new_view_center_pos = sub_2f32(start_view_center_pos, drag_delta_cvs);\r\n      view_center_pos = new_view_center_pos;\r\n    }\r\n    if(canvas_sig.scroll.y != 0)\r\n    {\r\n      F32 new_zoom = zoom - zoom*canvas_sig.scroll.y/10.f;\r\n      new_zoom = Clamp(1.f/256.f, new_zoom, 256.f);\r\n      Vec2F32 mouse_scr_pre = sub_2f32(ui_mouse(), rect.p0);\r\n      Vec2F32 mouse_cvs = rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, canvas_rect, mouse_scr_pre);\r\n      zoom = new_zoom;\r\n      Vec2F32 mouse_scr_pst = rd_bitmap_screen_from_canvas_pos(view_center_pos, zoom, canvas_rect, mouse_cvs);\r\n      Vec2F32 drift_scr = sub_2f32(mouse_scr_pst, mouse_scr_pre);\r\n      view_center_pos = add_2f32(view_center_pos, scale_2f32(drift_scr, 1.f/new_zoom));\r\n    }\r\n    if(ui_double_clicked(canvas_sig))\r\n    {\r\n      ui_kill_action();\r\n      MemoryZeroStruct(&view_center_pos);\r\n      zoom = 1.f;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: equip canvas draw info\r\n  //\r\n  {\r\n    RD_BitmapCanvasBoxDrawData *draw_data = push_array(ui_build_arena(), RD_BitmapCanvasBoxDrawData, 1);\r\n    draw_data->view_center_pos = view_center_pos;\r\n    draw_data->zoom = zoom;\r\n    ui_box_equip_custom_draw(canvas_box, rd_bitmap_view_canvas_box_draw, draw_data);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate image coordinates\r\n  //\r\n  Rng2F32 img_rect_cvs = r2f32p(-topology.dim.x/2, -topology.dim.y/2, +topology.dim.x/2, +topology.dim.y/2);\r\n  Rng2F32 img_rect_scr = rd_bitmap_screen_from_canvas_rect(view_center_pos, zoom, canvas_rect, img_rect_cvs);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: image-region canvas interaction\r\n  //\r\n  Vec2S32 mouse_bmp = {-1, -1};\r\n  if(ui_hovering(canvas_sig) && !ui_dragging(canvas_sig))\r\n  {\r\n    Vec2F32 mouse_scr = sub_2f32(ui_mouse(), rect.p0);\r\n    Vec2F32 mouse_cvs = rd_bitmap_canvas_from_screen_pos(view_center_pos, zoom, canvas_rect, mouse_scr);\r\n    if(contains_2f32(img_rect_cvs, mouse_cvs))\r\n    {\r\n      mouse_bmp = v2s32((S32)(mouse_cvs.x-img_rect_cvs.x0), (S32)(mouse_cvs.y-img_rect_cvs.y0));\r\n      S64 off_px = mouse_bmp.y*topology.dim.x + mouse_bmp.x;\r\n      S64 off_bytes = off_px*r_tex2d_format_bytes_per_pixel_table[topology.fmt];\r\n      if(0 <= off_bytes && off_bytes+r_tex2d_format_bytes_per_pixel_table[topology.fmt] <= data.size &&\r\n         r_tex2d_format_bytes_per_pixel_table[topology.fmt] != 0)\r\n      {\r\n        RD_RegsScope(.vaddr_range = r1u64(offset_range.min + off_bytes, offset_range.min + off_bytes + r_tex2d_format_bytes_per_pixel_table[topology.fmt]),\r\n                     .eval_space = eval.space)\r\n          rd_set_hover_regs(RD_RegSlot_VaddrRange);\r\n        B32 color_is_good = 1;\r\n        Vec4F32 color = {0};\r\n        switch(topology.fmt)\r\n        {\r\n          default:{color_is_good = 0;}break;\r\n          case R_Tex2DFormat_R8:     {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, 0, 0, 1);}break;\r\n          case R_Tex2DFormat_RG8:    {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, 0, 1);}break;\r\n          case R_Tex2DFormat_RGBA8:  {color = v4f32(((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[3]/255.f);}break;\r\n          case R_Tex2DFormat_BGRA8:  {color = v4f32(((U8 *)(data.str+off_bytes))[2]/255.f, ((U8 *)(data.str+off_bytes))[1]/255.f, ((U8 *)(data.str+off_bytes))[0]/255.f, ((U8 *)(data.str+off_bytes))[3]/255.f);}break;\r\n          case R_Tex2DFormat_R16:    {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, 0, 0, 1);}break;\r\n          case R_Tex2DFormat_RGBA16: {color = v4f32(((U16 *)(data.str+off_bytes))[0]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[1]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[2]/(F32)max_U16, ((U16 *)(data.str+off_bytes))[3]/(F32)max_U16);}break;\r\n          case R_Tex2DFormat_R32:    {color = v4f32(((F32 *)(data.str+off_bytes))[0], 0, 0, 1);}break;\r\n          case R_Tex2DFormat_RG32:   {color = v4f32(((F32 *)(data.str+off_bytes))[0], ((F32 *)(data.str+off_bytes))[1], 0, 1);}break;\r\n          case R_Tex2DFormat_RGBA32: {color = v4f32(((F32 *)(data.str+off_bytes))[0], ((F32 *)(data.str+off_bytes))[1], ((F32 *)(data.str+off_bytes))[2], ((F32 *)(data.str+off_bytes))[3]);}break;\r\n        }\r\n        if(color_is_good)\r\n        {\r\n          Vec4F32 hsva = hsva_from_rgba(color);\r\n          ui_do_color_tooltip_hsva(hsva);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build image\r\n  //\r\n  UI_Parent(canvas_box)\r\n  {\r\n    if(0 <= mouse_bmp.x && mouse_bmp.x < dim.x &&\r\n       0 <= mouse_bmp.x && mouse_bmp.x < dim.y)\r\n    {\r\n      F32 pixel_size_scr = 1.f*zoom;\r\n      Rng2F32 indicator_rect_scr = r2f32p(img_rect_scr.x0 + mouse_bmp.x*pixel_size_scr,\r\n                                          img_rect_scr.y0 + mouse_bmp.y*pixel_size_scr,\r\n                                          img_rect_scr.x0 + (mouse_bmp.x+1)*pixel_size_scr,\r\n                                          img_rect_scr.y0 + (mouse_bmp.y+1)*pixel_size_scr);\r\n      UI_Rect(indicator_rect_scr)\r\n      {\r\n        ui_build_box_from_key(UI_BoxFlag_DrawBorder|UI_BoxFlag_Floating, ui_key_zero());\r\n      }\r\n    }\r\n    UI_Rect(img_rect_scr) UI_Flags(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawDropShadow|UI_BoxFlag_Floating)\r\n    {\r\n      ui_image(texture, R_Tex2DSampleKind_Nearest, r2f32p(0, 0, (F32)dim.x, (F32)dim.y), v4f32(1, 1, 1, 1), 0, str8_lit(\"bmp_image\"));\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: store params\r\n  //\r\n  rd_store_view_param_f32(str8_lit(\"zoom\"), zoom);\r\n  rd_store_view_param_f32(str8_lit(\"x\"), view_center_pos.x);\r\n  rd_store_view_param_f32(str8_lit(\"y\"), view_center_pos.y);\r\n  \r\n  access_close(access);\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: rgba @view_hook_impl\r\n\r\ntypedef struct RD_EvalColor RD_EvalColor;\r\nstruct RD_EvalColor\r\n{\r\n  Vec4F32 rgba;\r\n  E_Eval rgba_evals[4];\r\n};\r\n\r\ninternal RD_EvalColor\r\nrd_eval_color_from_eval(E_Eval eval)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //- rjf: walk eval's type tree, find all four component evaluations\r\n  E_Eval component_evals[4] = {0};\r\n  {\r\n    typedef struct LeafTask LeafTask;\r\n    struct LeafTask\r\n    {\r\n      LeafTask *next;\r\n      E_Eval eval;\r\n    };\r\n    U64 num_components_left = 4;\r\n    LeafTask start_task = {0, eval};\r\n    LeafTask *first_task = &start_task;\r\n    LeafTask *last_task = first_task;\r\n    for(LeafTask *t = first_task; t != 0 && num_components_left > 0; t = t->next)\r\n    {\r\n      E_Type *type = e_type_from_key(e_type_key_unwrap(t->eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative));\r\n      switch(type->kind)\r\n      {\r\n        default:{}break;\r\n        \r\n        // rjf: leaf >u32/s32 -> take all 4 components\r\n        case E_TypeKind_U32:\r\n        case E_TypeKind_S32:\r\n        case E_TypeKind_U64:\r\n        case E_TypeKind_S64:\r\n        {\r\n          component_evals[0] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)(($ & 0xff000000) >> 24) / 255.f\"));\r\n          component_evals[1] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)(($ & 0x00ff0000) >> 16) / 255.f\"));\r\n          component_evals[2] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)(($ & 0x0000ff00) >> 8) / 255.f\"));\r\n          component_evals[3] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)(($ & 0x000000ff) >> 0) / 255.f\"));\r\n          num_components_left -= 4;\r\n        }break;\r\n        \r\n        //- rjf: array -> generate tasks for first four elements\r\n        case E_TypeKind_Array:\r\n        {\r\n          component_evals[0] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)($[0])\"));\r\n          component_evals[1] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)($[1])\"));\r\n          component_evals[2] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)($[2])\"));\r\n          component_evals[3] = e_value_eval_from_eval(e_eval_wrapf(t->eval, \"(float32)($[3])\"));\r\n          num_components_left -= 4;\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: swizzle / extract the component values from the evals, depending on this lens\r\n  // (the lens implicitly tells us the format)\r\n  RD_EvalColor result = {0};\r\n  {\r\n    E_Type *lens_type = e_type_from_key(eval.irtree.type_key);\r\n    for(E_Type *t = lens_type; t->kind == E_TypeKind_Lens; t = e_type_from_key(t->direct_type_key))\r\n    {\r\n      if(str8_match(t->name, str8_lit(\"color\"), 0))\r\n      {\r\n        lens_type = t;\r\n        break;\r\n      }\r\n    }\r\n    String8 format_string = str8_lit(\"rgba\");\r\n    if(lens_type->kind == E_TypeKind_Lens && lens_type->count > 0)\r\n    {\r\n      format_string = lens_type->args[0]->string;\r\n    }\r\n    if(str8_match(format_string, str8_lit(\"rgba\"), 0))\r\n    {\r\n      result.rgba_evals[0] = component_evals[0];\r\n      result.rgba_evals[1] = component_evals[1];\r\n      result.rgba_evals[2] = component_evals[2];\r\n      result.rgba_evals[3] = component_evals[3];\r\n    }\r\n    else if(str8_match(format_string, str8_lit(\"argb\"), 0))\r\n    {\r\n      result.rgba_evals[0] = component_evals[1];\r\n      result.rgba_evals[1] = component_evals[2];\r\n      result.rgba_evals[2] = component_evals[3];\r\n      result.rgba_evals[3] = component_evals[0];\r\n    }\r\n    else if(str8_match(format_string, str8_lit(\"bgra\"), 0))\r\n    {\r\n      result.rgba_evals[0] = component_evals[2];\r\n      result.rgba_evals[1] = component_evals[1];\r\n      result.rgba_evals[2] = component_evals[0];\r\n      result.rgba_evals[3] = component_evals[3];\r\n    }\r\n    else if(str8_match(format_string, str8_lit(\"abgr\"), 0))\r\n    {\r\n      result.rgba_evals[0] = component_evals[3];\r\n      result.rgba_evals[1] = component_evals[2];\r\n      result.rgba_evals[2] = component_evals[1];\r\n      result.rgba_evals[3] = component_evals[0];\r\n    }\r\n    for EachIndex(idx, 4)\r\n    {\r\n      result.rgba.v[idx] = e_value_eval_from_eval(result.rgba_evals[idx]).value.f32;\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(color)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 12;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(color)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack state\r\n  //\r\n  typedef struct RD_ColorViewState RD_ColorViewState;\r\n  struct RD_ColorViewState\r\n  {\r\n    B32 initialized;\r\n    U32 start_rgba_u32;\r\n    Vec4F32 hsva;\r\n  };\r\n  RD_ColorViewState *state = rd_view_state(RD_ColorViewState);\r\n  RD_EvalColor eval_color = rd_eval_color_from_eval(eval);\r\n  U32 rgba_u32 = u32_from_rgba(eval_color.rgba);\r\n  if(!state->initialized || rgba_u32 != state->start_rgba_u32)\r\n  {\r\n    Vec4F32 rgba = eval_color.rgba;\r\n    Vec4F32 hsva = hsva_from_rgba(rgba);\r\n    state->initialized = 1;\r\n    state->start_rgba_u32 = rgba_u32;\r\n    state->hsva = hsva;\r\n  }\r\n  Vec4F32 hsva = state->hsva;\r\n  Vec4F32 rgba = rgba_from_hsva(hsva);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate dimensions\r\n  //\r\n  Vec2F32 dim = dim_2f32(rect);\r\n  F32 sv_dim_px = Min(dim.x, dim.y);\r\n  F32 padding = sv_dim_px*0.2f;\r\n  sv_dim_px -= padding*2.f;\r\n  sv_dim_px = Min(sv_dim_px, ui_top_font_size()*70.f);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build UI\r\n  //\r\n  {\r\n    UI_WidthFill UI_HeightFill\r\n      UI_PrefHeight(ui_children_sum(1)) UI_Column UI_Padding(ui_pct(1.f, 0.f))\r\n      UI_PrefHeight(ui_children_sum(1)) UI_Row UI_Padding(ui_pct(1.f, 0.f))\r\n      UI_PrefWidth(ui_px(sv_dim_px, 1.f))\r\n      UI_PrefHeight(ui_px(sv_dim_px, 1.f))\r\n      RD_Font(RD_FontSlot_Code)\r\n    {\r\n      UI_Signal sv_sig = ui_sat_val_pickerf(hsva.x, &hsva.y, &hsva.z, \"sat_val_picker\");\r\n      UI_Signal h_sig  = {0};\r\n      UI_Signal a_sig  = {0};\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n      UI_PrefWidth(ui_em(3.f, 1.f))\r\n      {\r\n        h_sig  = ui_hue_pickerf(&hsva.x, hsva.y, hsva.z, \"hue_picker\");\r\n      }\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n      UI_PrefWidth(ui_em(3.f, 1.f))\r\n      {\r\n        a_sig  = ui_alpha_pickerf(&hsva.w, \"alpha_picker\");\r\n      }\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n      UI_PrefWidth(ui_children_sum(1)) UI_Column\r\n      {\r\n        UI_PrefWidth(ui_em(6.f, 0.f)) UI_PrefHeight(ui_em(6.f, 0.f))\r\n          UI_BackgroundColor(linear_from_srgba(v4f32(rgba.x, rgba.y, rgba.z, 1.f)))\r\n          UI_CornerRadius(4.f)\r\n          UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f))\r\n          ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit(\"\"));\r\n        ui_spacer(ui_em(2.f, 1.f));\r\n        UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_children_sum(1)) UI_Row\r\n        {\r\n          UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_PrefHeight(ui_em(2.f, 0.f)) RD_Font(RD_FontSlot_Code)\r\n            UI_TagF(\"weak\")\r\n          {\r\n            ui_labelf(\"Hex\");\r\n            ui_labelf(\"R\");\r\n            ui_labelf(\"G\");\r\n            ui_labelf(\"B\");\r\n            ui_labelf(\"H\");\r\n            ui_labelf(\"S\");\r\n            ui_labelf(\"V\");\r\n            ui_labelf(\"A\");\r\n          }\r\n          UI_PrefWidth(ui_children_sum(1)) UI_Column UI_PrefWidth(ui_text_dim(10, 1)) UI_PrefHeight(ui_em(2.f, 0.f)) RD_Font(RD_FontSlot_Code)\r\n          {\r\n            String8 hex_string = hex_string_from_rgba_4f32(scratch.arena, rgba);\r\n            ui_label(hex_string);\r\n            ui_labelf(\"%.2f\", rgba.x);\r\n            ui_labelf(\"%.2f\", rgba.y);\r\n            ui_labelf(\"%.2f\", rgba.z);\r\n            ui_labelf(\"%.2f\", hsva.x);\r\n            ui_labelf(\"%.2f\", hsva.y);\r\n            ui_labelf(\"%.2f\", hsva.z);\r\n            ui_labelf(\"%.2f\", rgba.w);\r\n          }\r\n        }\r\n      }\r\n      if(ui_dragging(h_sig) || ui_dragging(sv_sig) || ui_dragging(a_sig))\r\n      {\r\n        // TODO(rjf): hard-coding U32 committing for now\r\n        E_Type *type = e_type_from_key(e_type_key_unwrap(eval.irtree.type_key, E_TypeUnwrapFlag_AllDecorative));\r\n        if(type->kind == E_TypeKind_U32 ||\r\n           type->kind == E_TypeKind_S32 ||\r\n           type->kind == E_TypeKind_U64 ||\r\n           type->kind == E_TypeKind_S64)\r\n        {\r\n          Vec4F32 new_rgba = rgba_from_hsva(hsva);\r\n          U32 u32 = u32_from_rgba(new_rgba);\r\n          String8 string = push_str8f(scratch.arena, \"0x%x\", u32);\r\n          if(rd_commit_eval_value_string(eval, string))\r\n          {\r\n            state->start_rgba_u32 = u32;\r\n            state->hsva = hsva;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: geo3d @view_hook_impl\r\n\r\ntypedef struct RD_Geo3DViewState RD_Geo3DViewState;\r\nstruct RD_Geo3DViewState\r\n{\r\n  F32 yaw;\r\n  F32 pitch;\r\n  F32 zoom;\r\n};\r\n\r\ntypedef struct RD_Geo3DBoxDrawData RD_Geo3DBoxDrawData;\r\nstruct RD_Geo3DBoxDrawData\r\n{\r\n  F32 yaw;\r\n  F32 pitch;\r\n  F32 zoom;\r\n  R_Handle vertex_buffer;\r\n  R_Handle index_buffer;\r\n};\r\n\r\ninternal AC_Artifact\r\nrd_geo3d_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  Access *access = access_open();\r\n  U128 hash = {0};\r\n  str8_deserial_read_struct(key, 0, &hash);\r\n  String8 data = c_data_from_hash(access, hash);\r\n  R_Handle buffer = {0};\r\n  if(data.size != 0)\r\n  {\r\n    buffer = r_buffer_alloc(R_ResourceKind_Static, data.size, data.str);\r\n  }\r\n  AC_Artifact artifact = {0};\r\n  MemoryCopy(&artifact, &buffer, Min(sizeof(artifact), sizeof(buffer)));\r\n  access_close(access);\r\n  return artifact;\r\n}\r\n\r\ninternal void\r\nrd_geo3d_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  R_Handle buffer = {0};\r\n  MemoryCopy(&buffer, &artifact, Min(sizeof(buffer), sizeof(artifact)));\r\n  r_buffer_release(buffer);\r\n}\r\n\r\ninternal R_Handle\r\nrd_geo3d_buffer_from_key(Access *access, C_Key key)\r\n{\r\n  R_Handle result = {0};\r\n  for EachIndex(rewind_idx, C_KEY_HASH_HISTORY_COUNT)\r\n  {\r\n    U128 hash = c_hash_from_key(key, rewind_idx);\r\n    AC_Artifact artifact = ac_artifact_from_key(access, str8_struct(&hash), rd_geo3d_artifact_create, rd_geo3d_artifact_destroy, 0);\r\n    R_Handle buffer = {0};\r\n    MemoryCopy(&buffer, &artifact, Min(sizeof(buffer), sizeof(artifact)));\r\n    if(!r_handle_match(buffer, r_handle_zero()))\r\n    {\r\n      result = buffer;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(rd_geo3d_box_draw)\r\n{\r\n  RD_Geo3DBoxDrawData *draw_data = (RD_Geo3DBoxDrawData *)user_data;\r\n  \r\n  // rjf: get clip\r\n  Rng2F32 clip = box->rect;\r\n  for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent)\r\n  {\r\n    if(b->flags & UI_BoxFlag_Clip)\r\n    {\r\n      clip = intersect_2f32(b->rect, clip);\r\n    }\r\n  }\r\n  \r\n  // rjf: calculate eye/target\r\n  Vec3F32 target = {0};\r\n  Vec3F32 eye = v3f32(draw_data->zoom*cos_f32(draw_data->yaw)*sin_f32(draw_data->pitch),\r\n                      draw_data->zoom*sin_f32(draw_data->yaw)*sin_f32(draw_data->pitch),\r\n                      draw_data->zoom*cos_f32(draw_data->pitch));\r\n  \r\n  // rjf: mesh\r\n  Vec2F32 box_dim = dim_2f32(box->rect);\r\n  R_PassParams_Geo3D *pass = dr_geo3d_begin(box->rect,\r\n                                            make_look_at_4x4f32(eye, target, v3f32(0, 0, 1)),\r\n                                            make_perspective_4x4f32(0.25f, box_dim.x/box_dim.y, 0.1f, 500.f));\r\n  pass->clip = clip;\r\n  dr_mesh(draw_data->vertex_buffer, draw_data->index_buffer, R_GeoTopologyKind_Triangles, R_GeoVertexFlag_TexCoord|R_GeoVertexFlag_Normals|R_GeoVertexFlag_RGB, r_handle_zero(), mat_4x4f32(1.f));\r\n}\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(geo3d)\r\n{\r\n  EV_ExpandInfo info = {0};\r\n  info.row_count = 16;\r\n  info.single_item = 1;\r\n  return info;\r\n}\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(geo3d)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  RD_Geo3DViewState *state = rd_view_state(RD_Geo3DViewState);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: if parameterized by a register-space evaluation, interpret as an\r\n  // address in the primary module.\r\n  //\r\n  if(e_space_match(eval.space, e_base_ctx->thread_reg_space))\r\n  {\r\n    eval = e_value_eval_from_eval(eval);\r\n    eval.space = e_base_ctx->primary_module->space;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack parameters\r\n  //\r\n  U64 count        = rd_view_setting_u64_from_name(str8_lit(\"count\"));\r\n  U64 vtx_base_off = rd_view_setting_u64_from_name(str8_lit(\"vtx\"));\r\n  U64 vtx_size     = rd_view_setting_u64_from_name(str8_lit(\"vtx_size\"));\r\n  F32 yaw_target   = rd_view_setting_f32_from_name(str8_lit(\"yaw\"));\r\n  F32 pitch_target = rd_view_setting_f32_from_name(str8_lit(\"pitch\"));\r\n  F32 zoom_target  = rd_view_setting_f32_from_name(str8_lit(\"zoom\"));\r\n  \r\n  //////////////////////////////\r\n  //- rjf: evaluate & unpack expression\r\n  //\r\n  Rng1U64 eval_range = e_range_from_eval(eval);\r\n  U64 base_offset = eval_range.min;\r\n  Rng1U64 idxs_range = r1u64(base_offset, base_offset+count*sizeof(U32));\r\n  Rng1U64 vtxs_range = r1u64(vtx_base_off, vtx_base_off+vtx_size);\r\n  C_Key idxs_key = rd_key_from_eval_space_range(eval.space, idxs_range, 0);\r\n  C_Key vtxs_key = rd_key_from_eval_space_range(eval.space, vtxs_range, 0);\r\n  R_Handle idxs_buffer = rd_geo3d_buffer_from_key(access, idxs_key);\r\n  R_Handle vtxs_buffer = rd_geo3d_buffer_from_key(access, vtxs_key);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: equip loading info\r\n  //\r\n  if(eval.string.size != 0 &&\r\n     eval.msgs.max_kind == E_MsgKind_Null &&\r\n     (r_handle_match(idxs_buffer, r_handle_zero()) ||\r\n      r_handle_match(vtxs_buffer, r_handle_zero())))\r\n  {\r\n    rd_store_view_loading_info(1, 0, 0);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do first-time camera initialization, if needed\r\n  //\r\n  if(zoom_target == 0)\r\n  {\r\n    yaw_target   = -0.125f;\r\n    pitch_target = -0.125f;\r\n    zoom_target  = 3.5f;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: animate camera\r\n  //\r\n  {\r\n    F32 fast_rate = 1 - pow_f32(2, (-60.f * rd_state->frame_dt));\r\n    F32 slow_rate = 1 - pow_f32(2, (-30.f * rd_state->frame_dt));\r\n    state->zoom  += (zoom_target - state->zoom) * slow_rate;\r\n    state->yaw   += (yaw_target - state->yaw) * fast_rate;\r\n    state->pitch += (pitch_target - state->pitch) * fast_rate;\r\n    if(abs_f32(state->zoom  - zoom_target)  > 0.001f ||\r\n       abs_f32(state->yaw   - yaw_target)   > 0.001f ||\r\n       abs_f32(state->pitch - pitch_target) > 0.001f)\r\n    {\r\n      rd_request_frame();\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build\r\n  //\r\n  if(count != 0 && !r_handle_match(idxs_buffer, r_handle_zero()) && !r_handle_match(vtxs_buffer, r_handle_zero()))\r\n  {\r\n    Vec2F32 dim = dim_2f32(rect);\r\n    UI_Box *box = &ui_nil_box;\r\n    UI_FixedSize(dim)\r\n    {\r\n      box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_Scroll, \"geo_box\");\r\n    }\r\n    UI_Signal sig = ui_signal_from_box(box);\r\n    if(ui_dragging(sig))\r\n    {\r\n      if(ui_pressed(sig))\r\n      {\r\n        rd_cmd(RD_CmdKind_FocusPanel);\r\n        Vec2F32 data = v2f32(yaw_target, pitch_target);\r\n        ui_store_drag_struct(&data);\r\n      }\r\n      Vec2F32 drag_delta      = ui_drag_delta();\r\n      Vec2F32 drag_start_data = *ui_get_drag_struct(Vec2F32);\r\n      yaw_target   = drag_start_data.x + drag_delta.x/dim.x;\r\n      pitch_target = drag_start_data.y + drag_delta.y/dim.y;\r\n    }\r\n    zoom_target += sig.scroll.y;\r\n    zoom_target = Clamp(0.1f, zoom_target, 100.f);\r\n    pitch_target = Clamp(-0.49f, pitch_target, -0.01f);\r\n    RD_Geo3DBoxDrawData *draw_data = push_array(ui_build_arena(), RD_Geo3DBoxDrawData, 1);\r\n    draw_data->yaw   = state->yaw;\r\n    draw_data->pitch = state->pitch;\r\n    draw_data->zoom  = state->zoom;\r\n    draw_data->vertex_buffer  = vtxs_buffer;\r\n    draw_data->index_buffer   = idxs_buffer;\r\n    ui_box_equip_custom_draw(box, rd_geo3d_box_draw, draw_data);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: commit parameters\r\n  //\r\n  rd_store_view_param_f32(str8_lit(\"yaw\"),   yaw_target);\r\n  rd_store_view_param_f32(str8_lit(\"pitch\"), pitch_target);\r\n  rd_store_view_param_f32(str8_lit(\"zoom\"),  zoom_target);\r\n  \r\n  access_close(access);\r\n  scratch_end(scratch);\r\n}\r\n"
  },
  {
    "path": "src/raddbg/raddbg_views.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RADDBG_VIEWS_H\r\n#define RADDBG_VIEWS_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Code View Types\r\n\r\ntypedef U32 RD_CodeViewBuildFlags;\r\nenum\r\n{\r\n  RD_CodeViewBuildFlag_Margins     = (1<<0),\r\n  RD_CodeViewBuildFlag_All         = 0xffffffff,\r\n};\r\n\r\ntypedef struct RD_CodeViewTLineSplitNode RD_CodeViewTLineSplitNode;\r\nstruct RD_CodeViewTLineSplitNode\r\n{\r\n  RD_CodeViewTLineSplitNode *next;\r\n  U64 off;\r\n};\r\n\r\ntypedef struct RD_CodeViewTLineWrapCacheNode RD_CodeViewTLineWrapCacheNode;\r\nstruct RD_CodeViewTLineWrapCacheNode\r\n{\r\n  RD_CodeViewTLineWrapCacheNode *hash_next;\r\n  RD_CodeViewTLineWrapCacheNode *hash_prev;\r\n  S64 line_num;\r\n  RD_CodeViewTLineSplitNode *first_split;\r\n  RD_CodeViewTLineSplitNode *last_split;\r\n};\r\n\r\ntypedef struct RD_CodeViewTLineWrapCacheSlot RD_CodeViewTLineWrapCacheSlot;\r\nstruct RD_CodeViewTLineWrapCacheSlot\r\n{\r\n  RD_CodeViewTLineWrapCacheNode *first;\r\n  RD_CodeViewTLineWrapCacheNode *last;\r\n};\r\n\r\ntypedef struct RD_CodeViewState RD_CodeViewState;\r\nstruct RD_CodeViewState\r\n{\r\n  // rjf: stable state\r\n  B32 initialized;\r\n  S64 preferred_column;\r\n  B32 drifted_for_search;\r\n  U128 last_hash;\r\n  \r\n  // rjf: per-frame command info\r\n  S64 goto_line_num;\r\n  B32 center_cursor;\r\n  B32 contain_cursor;\r\n  B32 force_contain_only;\r\n  B32 watch_expr_at_mouse;\r\n  Arena *find_text_arena;\r\n  String8 find_text_fwd;\r\n  String8 find_text_bwd;\r\n  \r\n  // rjf: line wrapping cache & info\r\n  Arena *wrap_arena;\r\n  RD_CodeViewTLineWrapCacheSlot *wrap_cache_slots;\r\n  U64 wrap_cache_slots_count;\r\n  U64 wrap_total_vline_count;\r\n};\r\n\r\ntypedef struct RD_CodeViewBuildResult RD_CodeViewBuildResult;\r\nstruct RD_CodeViewBuildResult\r\n{\r\n  DI_KeyList dbgi_keys;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Watch View Types\r\n\r\ntypedef enum RD_WatchCellKind\r\n{\r\n  RD_WatchCellKind_Eval,           // an evaluation cell\r\n  RD_WatchCellKind_ViewUI,         // an arbitrary user interface, supplied by a hook\r\n  RD_WatchCellKind_CallStackFrame, // a slot for a yellow arrow, to show call stack frame selection\r\n}\r\nRD_WatchCellKind;\r\n\r\ntypedef U32 RD_WatchCellFlags;\r\nenum\r\n{\r\n  RD_WatchCellFlag_Expr                    = (1<<0),\r\n  RD_WatchCellFlag_NoEval                  = (1<<1),\r\n  RD_WatchCellFlag_Button                  = (1<<2),\r\n  RD_WatchCellFlag_Background              = (1<<3),\r\n  RD_WatchCellFlag_ActivateWithSingleClick = (1<<4),\r\n  RD_WatchCellFlag_IsNonCode               = (1<<5),\r\n  RD_WatchCellFlag_CanEdit                 = (1<<6),\r\n  RD_WatchCellFlag_IsErrored               = (1<<7),\r\n  RD_WatchCellFlag_Indented                = (1<<8),\r\n};\r\n\r\ntypedef struct RD_WatchCell RD_WatchCell;\r\nstruct RD_WatchCell\r\n{\r\n  RD_WatchCell *next;\r\n  RD_WatchCellKind kind;\r\n  RD_WatchCellFlags flags;\r\n  U64 index;\r\n  E_Eval eval;\r\n  F32 default_pct;\r\n  F32 pct;\r\n  F32 px;\r\n};\r\n\r\ntypedef struct RD_WatchCellList RD_WatchCellList;\r\nstruct RD_WatchCellList\r\n{\r\n  RD_WatchCell *first;\r\n  RD_WatchCell *last;\r\n  U64 count;\r\n  F32 pct_sum;\r\n};\r\n\r\ntypedef struct RD_WatchRowInfo RD_WatchRowInfo;\r\nstruct RD_WatchRowInfo\r\n{\r\n  CTRL_Entity *module;\r\n  B32 can_expand;\r\n  B32 expr_is_editable;\r\n  String8 group_cfg_name;\r\n  CFG_Node *group_cfg_parent;\r\n  CFG_Node *group_cfg_child;\r\n  CTRL_Entity *group_entity;\r\n  CTRL_Entity *callstack_thread;\r\n  U64 callstack_unwind_index;\r\n  U64 callstack_inline_depth;\r\n  U64 callstack_vaddr;\r\n  String8 cell_style_key;\r\n  RD_WatchCellList cells;\r\n  RD_ViewUIRule *view_ui_rule;\r\n};\r\n\r\ntypedef struct RD_WatchRowCellInfo RD_WatchRowCellInfo;\r\nstruct RD_WatchRowCellInfo\r\n{\r\n  RD_WatchCellFlags flags;\r\n  CFG_Node *cfg;\r\n  CTRL_Entity *entity;\r\n  String8 cmd_name;\r\n  String8 file_path;\r\n  DR_FStrList expr_fstrs;\r\n  DR_FStrList eval_fstrs;\r\n  String8 description;\r\n  String8 error_tooltip;\r\n  String8 inheritance_tooltip;\r\n  RD_ViewUIRule *view_ui_rule;\r\n};\r\n\r\ntypedef struct RD_WatchPt RD_WatchPt;\r\nstruct RD_WatchPt\r\n{\r\n  EV_Key parent_key;\r\n  EV_Key key;\r\n  U64 cell_id;\r\n};\r\n\r\ntypedef struct RD_WatchViewTextEditState RD_WatchViewTextEditState;\r\nstruct RD_WatchViewTextEditState\r\n{\r\n  RD_WatchViewTextEditState *pt_hash_next;\r\n  RD_WatchPt pt;\r\n  TxtPt cursor;\r\n  TxtPt mark;\r\n  U8 input_buffer[1024];\r\n  U64 input_size;\r\n  U8 initial_buffer[1024];\r\n  U64 initial_size;\r\n};\r\n\r\ntypedef struct RD_WatchViewState RD_WatchViewState;\r\nstruct RD_WatchViewState\r\n{\r\n  B32 initialized;\r\n  \r\n  // rjf: filter history\r\n  Arena *filter_arena;\r\n  String8 last_filter;\r\n  \r\n  // rjf; table cursor state\r\n  RD_WatchPt cursor;\r\n  RD_WatchPt mark;\r\n  RD_WatchPt next_cursor;\r\n  RD_WatchPt next_mark;\r\n  \r\n  // rjf: text input state\r\n  Arena *text_edit_arena;\r\n  U64 text_edit_state_slots_count;\r\n  RD_WatchViewTextEditState dummy_text_edit_state;\r\n  RD_WatchViewTextEditState **text_edit_state_slots;\r\n  B32 text_editing;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Code View Functions\r\n\r\ninternal void rd_code_view_init(RD_CodeViewState *cv);\r\ninternal RD_CodeViewBuildResult rd_code_view_build(Arena *arena, RD_CodeViewState *cv, RD_CodeViewBuildFlags flags, Rng2F32 rect, String8 text_data, TXT_TextInfo *text_info, DASM_LineArray *dasm_lines, Rng1U64 dasm_vaddr_range, DI_Key dasm_dbgi_key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Watch View Functions\r\n\r\n//- rjf: cell list building\r\ninternal U64 rd_id_from_watch_cell(RD_WatchCell *cell);\r\ninternal RD_WatchCell *rd_watch_cell_list_push_new_(Arena *arena, RD_WatchCellList *list, RD_WatchCell *params);\r\n#define rd_watch_cell_list_push_new(arena, list, kind_, eval_, ...) rd_watch_cell_list_push_new_((arena), (list), &(RD_WatchCell){.kind = (kind_), .eval = (eval_), __VA_ARGS__})\r\n\r\n//- rjf: watch view points <-> table coordinates\r\ninternal B32 rd_watch_pt_match(RD_WatchPt a, RD_WatchPt b);\r\ninternal RD_WatchPt rd_watch_pt_from_tbl(EV_BlockRangeList *block_ranges, Vec2S64 tbl);\r\ninternal Vec2S64 rd_tbl_from_watch_pt(EV_BlockRangeList *block_ranges, RD_WatchPt pt);\r\n\r\n//- rjf: row -> info\r\ninternal RD_WatchRowInfo rd_watch_row_info_from_row(Arena *arena, EV_Row *row);\r\n\r\n//- rjf: row * cell -> info\r\ninternal RD_WatchRowCellInfo rd_info_from_watch_row_cell(Arena *arena, EV_Row *row, EV_StringFlags string_flags, RD_WatchRowInfo *row_info, RD_WatchCell *cell, FNT_Tag font, F32 font_size, F32 max_size_px);\r\n\r\n//- rjf: table coordinates -> text edit state\r\ninternal RD_WatchViewTextEditState *rd_watch_view_text_edit_state_from_pt(RD_WatchViewState *wv, RD_WatchPt pt);\r\n\r\n////////////////////////////////\r\n//~ rjf: View Hooks\r\n\r\n// TODO(rjf): eliminate once we are predeclaring these with metacode\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(null);\r\n\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(text);\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(disasm);\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(memory);\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(bitmap);\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(color);\r\nEV_EXPAND_RULE_INFO_FUNCTION_DEF(geo3d);\r\n\r\nRD_VIEW_UI_FUNCTION_DEF(text);\r\nRD_VIEW_UI_FUNCTION_DEF(disasm);\r\nRD_VIEW_UI_FUNCTION_DEF(memory);\r\nRD_VIEW_UI_FUNCTION_DEF(bitmap);\r\nRD_VIEW_UI_FUNCTION_DEF(color);\r\nRD_VIEW_UI_FUNCTION_DEF(geo3d);\r\n\r\n#endif // RADDBG_VIEWS_H\r\n"
  },
  {
    "path": "src/raddbg/raddbg_widgets.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Fancy Title Strings\r\n\r\ninternal DR_FStrList\r\nrd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras)\r\n{\r\n  DR_FStrList result = {0};\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: unpack config\r\n    B32 is_disabled = rd_disabled_from_cfg(cfg);\r\n    RD_Location loc = rd_location_from_cfg(cfg);\r\n    D_Target target = rd_target_from_cfg(scratch.arena, cfg);\r\n    String8 label_string = rd_label_from_cfg(cfg);\r\n    String8 expr_string = rd_expr_from_cfg(cfg);\r\n    String8 collection_name = {0};\r\n    String8 file_path = rd_path_from_cfg(cfg);\r\n    Vec4F32 rgba = rd_color_from_cfg(cfg);\r\n    if(rgba.w == 0)\r\n    {\r\n      rgba = ui_color_from_name(str8_lit(\"text\"));\r\n    }\r\n    Vec4F32 rgba_secondary = rgba;\r\n    UI_TagF(\"weak\")\r\n    {\r\n      rgba_secondary = ui_color_from_name(str8_lit(\"text\"));\r\n    }\r\n    RD_IconKind icon_kind = rd_icon_kind_from_code_name(cfg->string);\r\n    B32 is_from_command_line = 0;\r\n    {\r\n      CFG_Node *cmd_line_root = cfg_node_child_from_string(cfg_node_root(), str8_lit(\"command_line\"));\r\n      for(CFG_Node *p = cfg->parent; p != &cfg_nil_node; p = p->parent)\r\n      {\r\n        if(p == cmd_line_root)\r\n        {\r\n          is_from_command_line = 1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    B32 is_within_window = 0;\r\n    {\r\n      for(CFG_Node *p = cfg->parent; p != &cfg_nil_node; p = p->parent)\r\n      {\r\n        if(str8_match(p->string, str8_lit(\"window\"), 0))\r\n        {\r\n          is_within_window = 1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    if(expr_string.size != 0)\r\n    {\r\n      String8 query_name = rd_query_from_eval_string(arena, expr_string);\r\n      if(query_name.size != 0)\r\n      {\r\n        String8 query_code_name = query_name;\r\n        String8 query_display_name = rd_display_from_code_name(query_code_name);\r\n        collection_name = query_display_name;\r\n        if(query_display_name.size == 0)\r\n        {\r\n          query_code_name = rd_singular_from_code_name_plural(query_name);\r\n          collection_name = rd_display_plural_from_code_name(query_code_name);\r\n        }\r\n        RD_IconKind query_icon_kind = rd_icon_kind_from_code_name(query_code_name);\r\n        if(query_icon_kind != RD_IconKind_Null)\r\n        {\r\n          icon_kind = query_icon_kind;\r\n        }\r\n      }\r\n      else\r\n      {\r\n        file_path = rd_file_path_from_eval_string(arena, expr_string);\r\n        if(file_path.size != 0)\r\n        {\r\n          icon_kind = RD_IconKind_FileOutline;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: set up color/size for all parts of the title\r\n    //\r\n    // the \"running\" part implies that it changes as things are added - \r\n    // so if a primary title is pushed, we can make the rest of the title\r\n    // more faded/smaller, but only after a primary title is pushed,\r\n    // which could be caused by many different potential parts of a cfg.\r\n    //\r\n    DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), rgba, ui_top_font_size()};\r\n    B32 running_is_secondary = 0;\r\n#define start_secondary() if(!running_is_secondary){running_is_secondary = 1; params.color = rgba_secondary; params.size = ui_top_font_size()*0.95f;}\r\n    \r\n    //- rjf: disabled? -> soften color\r\n    if(is_disabled)\r\n    {\r\n      params.color = rgba_secondary;\r\n    }\r\n    \r\n    //- rjf: [breakpoints] push hit marker\r\n    if(str8_match(cfg->string, str8_lit(\"breakpoint\"), 0))\r\n    {\r\n      CTRL_Event stop_event = d_ctrl_last_stop_event();\r\n      if(stop_event.cause == CTRL_EventCause_UserBreakpoint)\r\n      {\r\n        CFG_Node *bp = cfg_node_from_id(stop_event.u64_code);\r\n        if(bp == cfg)\r\n        {\r\n          CTRL_Entity *thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, stop_event.entity);\r\n          Vec4F32 thread_color = rd_color_from_ctrl_entity(thread);\r\n          if(thread_color.w == 0)\r\n          {\r\n            thread_color = rgba_secondary;\r\n          }\r\n          dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_RightArrow], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = thread_color);\r\n          dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: push icon\r\n    if(icon_kind != RD_IconKind_Null)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[icon_kind], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = rgba_secondary);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n    }\r\n    \r\n    //- rjf: push warning icon for command-line entities\r\n    if(is_from_command_line)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_Info], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = rgba_secondary);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n    }\r\n    \r\n    //- rjf: push view title, if from window, and no file path, and no label\r\n    if(is_within_window && file_path.size == 0 && collection_name.size == 0 && label_string.size == 0)\r\n    {\r\n      String8 view_display_name = rd_display_from_code_name(cfg->string);\r\n      if(view_display_name.size != 0)\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, view_display_name);\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n        start_secondary();\r\n      }\r\n    }\r\n    \r\n    //- rjf: push bucket name\r\n    if(cfg->parent == cfg_node_root())\r\n    {\r\n      if(str8_match(cfg->string, str8_lit(\"user\"), 0))\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"User\"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main));\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n        start_secondary();\r\n      }\r\n      else if(str8_match(cfg->string, str8_lit(\"project\"), 0))\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"Project\"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main));\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n        start_secondary();\r\n      }\r\n    }\r\n    \r\n    //- rjf: push label\r\n    if(label_string.size != 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, label_string, .font = rd_font_from_slot(RD_FontSlot_Code), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: push collection name\r\n    if(collection_name.size != 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, collection_name);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: query is file path - do specific file name strings\r\n    else if(file_path.size != 0)\r\n    {\r\n      // rjf: compute disambiguated file name\r\n      String8List qualifiers = {0};\r\n      String8 file_name = str8_skip_last_slash(file_path);\r\n      if(rd_state->ambiguous_path_slots_count != 0)\r\n      {\r\n        U64 hash = d_hash_from_string__case_insensitive(file_name);\r\n        U64 slot_idx = hash%rd_state->ambiguous_path_slots_count;\r\n        RD_AmbiguousPathNode *node = 0;\r\n        {\r\n          for(RD_AmbiguousPathNode *n = rd_state->ambiguous_path_slots[slot_idx];\r\n              n != 0;\r\n              n = n->next)\r\n          {\r\n            if(str8_match(n->name, file_name, StringMatchFlag_CaseInsensitive))\r\n            {\r\n              node = n;\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        if(node != 0 && node->paths.node_count > 1)\r\n        {\r\n          // rjf: get all colliding paths\r\n          String8Array collisions = str8_array_from_list(scratch.arena, &node->paths);\r\n          \r\n          // rjf: get all reversed path parts for each collision\r\n          String8List *collision_parts_reversed = push_array(scratch.arena, String8List, collisions.count);\r\n          for EachIndex(idx, collisions.count)\r\n          {\r\n            String8List parts = str8_split_path(scratch.arena, collisions.v[idx]);\r\n            for(String8Node *n = parts.first; n != 0; n = n->next)\r\n            {\r\n              str8_list_push_front(scratch.arena, &collision_parts_reversed[idx], n->string);\r\n            }\r\n          }\r\n          \r\n          // rjf: get the search path & its reversed parts\r\n          String8List parts = str8_split_path(scratch.arena, file_path);\r\n          String8List parts_reversed = {0};\r\n          for(String8Node *n = parts.first; n != 0; n = n->next)\r\n          {\r\n            str8_list_push_front(scratch.arena, &parts_reversed, n->string);\r\n          }\r\n          \r\n          // rjf: iterate all collision part reversed lists, in lock-step with\r\n          // search path; disqualify until we only have one path remaining; gather\r\n          // qualifiers\r\n          {\r\n            U64 num_collisions_left = collisions.count;\r\n            String8Node **collision_nodes = push_array(scratch.arena, String8Node *, collisions.count);\r\n            for EachIndex(idx, collisions.count)\r\n            {\r\n              collision_nodes[idx] = collision_parts_reversed[idx].first;\r\n            }\r\n            for(String8Node *n = parts_reversed.first; num_collisions_left > 1 && n != 0; n = n->next)\r\n            {\r\n              B32 part_is_qualifier = 0;\r\n              for EachIndex(idx, collisions.count)\r\n              {\r\n                if(collision_nodes[idx] != 0 && !str8_match(collision_nodes[idx]->string, n->string, StringMatchFlag_CaseInsensitive))\r\n                {\r\n                  collision_nodes[idx] = 0;\r\n                  num_collisions_left -= 1;\r\n                  part_is_qualifier = 1;\r\n                }\r\n                else if(collision_nodes[idx] != 0)\r\n                {\r\n                  collision_nodes[idx] = collision_nodes[idx]->next;\r\n                }\r\n              }\r\n              if(part_is_qualifier)\r\n              {\r\n                str8_list_push_front(scratch.arena, &qualifiers, n->string);\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push qualifiers\r\n      if(qualifiers.node_count != 0) UI_TagF(\"weak\")\r\n      {\r\n        for(String8Node *n = qualifiers.first; n != 0; n = n->next)\r\n        {\r\n          String8 string = push_str8f(arena, \"<%S> \", n->string);\r\n          dr_fstrs_push_new(arena, &result, &params, string, .color = ui_color_from_name(str8_lit(\"text\")));\r\n        }\r\n      }\r\n      \r\n      // rjf: push file name\r\n      dr_fstrs_push_new(arena, &result, &params, push_str8_copy(arena, str8_skip_last_slash(file_path)));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: cfg has expression attached -> use that\r\n    else if(expr_string.size != 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, expr_string, .font = rd_font_from_slot(RD_FontSlot_Code), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: push text location\r\n    if(loc.file_path.size != 0)\r\n    {\r\n      String8 path = loc.file_path;\r\n      if(!include_extras)\r\n      {\r\n        path = str8_skip_last_slash(loc.file_path);\r\n      }\r\n      String8 location_string = push_str8f(arena, \"%S:%I64d:%I64d\", path, loc.pt.line, loc.pt.column);\r\n      dr_fstrs_push_new(arena, &result, &params, location_string);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: push address location\r\n    if(loc.expr.size != 0)\r\n    {\r\n      RD_Font(RD_FontSlot_Code)\r\n      {\r\n        DR_FStrList fstrs = rd_fstrs_from_code_string(arena, 1.f, 0, params.color, loc.expr);\r\n        dr_fstrs_concat_in_place(&result, &fstrs);\r\n      }\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: push target executable name\r\n    if(target.exe.size != 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, str8_skip_last_slash(target.exe));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      start_secondary();\r\n    }\r\n    \r\n    //- rjf: push target arguments\r\n    if(target.args.size != 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, target.args);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n    }\r\n    \r\n    //- rjf: push conditions\r\n    {\r\n      String8 condition = cfg_node_child_from_string(cfg, str8_lit(\"condition\"))->first->string;\r\n      if(condition.size != 0)\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"if \"), .font = rd_font_from_slot(RD_FontSlot_Code), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code));\r\n        RD_Font(RD_FontSlot_Code)\r\n        {\r\n          DR_FStrList fstrs = rd_fstrs_from_code_string(arena, 1.f, 0, params.color, condition);\r\n          dr_fstrs_concat_in_place(&result, &fstrs);\r\n        }\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      }\r\n    }\r\n    \r\n    //- rjf: push disabled marker\r\n    if(is_disabled)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"(Disabled)\"));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n    }\r\n    \r\n    //- rjf: push hit count\r\n    {\r\n      String8 hit_count_value_string = cfg_node_child_from_string(cfg, str8_lit(\"hit_count\"))->first->string;\r\n      U64 hit_count = 0;\r\n      if(try_u64_from_str8_c_rules(hit_count_value_string, &hit_count) && hit_count != 0)\r\n      {\r\n        String8 hit_count_text = push_str8f(arena, \"(%I64u hit%s)\", hit_count, hit_count == 1 ? \"\" : \"s\");\r\n        dr_fstrs_push_new(arena, &result, &params, hit_count_text);\r\n      }\r\n    }\r\n    \r\n    //- rjf: special case: type views\r\n    if(str8_match(cfg->string, str8_lit(\"type_view\"), 0))\r\n    {\r\n      String8 src_string = cfg_node_child_from_string(cfg, str8_lit(\"type\"))->first->string;\r\n      String8 dst_string = cfg_node_child_from_string(cfg, str8_lit(\"expr\"))->first->string;\r\n      Vec4F32 src_color = rgba;\r\n      Vec4F32 dst_color = rgba;\r\n      DR_FStrList src_fstrs = {0};\r\n      DR_FStrList dst_fstrs = {0};\r\n      if(src_string.size == 0)\r\n      {\r\n        src_string = str8_lit(\"(type)\");\r\n        src_color = rgba_secondary;\r\n        dr_fstrs_push_new(arena, &src_fstrs, &params, src_string, .color = src_color);\r\n      }\r\n      else RD_Font(RD_FontSlot_Code)\r\n      {\r\n        src_fstrs = rd_fstrs_from_code_string(arena, 1.f, 0, src_color, src_string);\r\n      }\r\n      if(dst_string.size == 0)\r\n      {\r\n        dst_string = str8_lit(\"(expression)\");\r\n        dst_color = rgba_secondary;\r\n        dr_fstrs_push_new(arena, &dst_fstrs, &params, dst_string, .color = dst_color);\r\n      }\r\n      else RD_Font(RD_FontSlot_Code)\r\n      {\r\n        dst_fstrs = rd_fstrs_from_code_string(arena, 1.f, 0, dst_color, dst_string);\r\n      }\r\n      dr_fstrs_concat_in_place(&result, &src_fstrs);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_RightArrow], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = rgba_secondary);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      dr_fstrs_concat_in_place(&result, &dst_fstrs);\r\n    }\r\n    \r\n    //- rjf: special case: file path maps\r\n    if(str8_match(cfg->string, str8_lit(\"file_path_map\"), 0))\r\n    {\r\n      String8 src_string = cfg_node_child_from_string(cfg, str8_lit(\"source\"))->first->string;\r\n      String8 dst_string = cfg_node_child_from_string(cfg, str8_lit(\"dest\"))->first->string;\r\n      Vec4F32 src_color = rgba;\r\n      Vec4F32 dst_color = rgba;\r\n      if(src_string.size == 0)\r\n      {\r\n        src_string = str8_lit(\"(source path)\");\r\n        src_color = rgba_secondary;\r\n      }\r\n      if(dst_string.size == 0)\r\n      {\r\n        dst_string = str8_lit(\"(destination path)\");\r\n        dst_color = rgba_secondary;\r\n      }\r\n      dr_fstrs_push_new(arena, &result, &params, src_string, .color = src_color);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_RightArrow], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = rgba_secondary);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &result, &params, dst_string, .color = dst_color);\r\n    }\r\n    \r\n    //- rjf: special case: colors\r\n    if(str8_match(cfg->string, str8_lit(\"theme_color\"), 0))\r\n    {\r\n      String8 tags = cfg_node_child_from_string(cfg, str8_lit(\"tags\"))->first->string;\r\n      String8 color_string = cfg_node_child_from_string(cfg, str8_lit(\"value\"))->first->string;\r\n      U32 color_u32 = e_value_from_stringf(\"(uint32)(%S)\", color_string).u32;\r\n      Vec4F32 color = linear_from_srgba(rgba_from_u32(color_u32));\r\n      if(tags.size != 0)\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, tags);\r\n      }\r\n      else\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\"Color\"), .color = rgba_secondary);\r\n      }\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_CircleFilled], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = color);\r\n    }\r\n    \r\n#undef start_secondary\r\n    scratch_end(scratch);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DR_FStrList\r\nrd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_extras)\r\n{\r\n  DR_FStrList result = {0};\r\n  \r\n  //- rjf: unpack entity info\r\n  F32 extras_size = ui_top_font_size()*0.95f;\r\n  Vec4F32 color = rd_color_from_ctrl_entity(entity);\r\n  if(color.w == 0)\r\n  {\r\n    color = ui_color_from_name(str8_lit(\"text\"));\r\n  }\r\n  Vec4F32 secondary_color = color;\r\n  UI_TagF(\"weak\")\r\n  {\r\n    secondary_color = ui_color_from_name(str8_lit(\"text\"));\r\n  }\r\n  String8 name = rd_name_from_ctrl_entity(arena, entity);\r\n  RD_IconKind icon_kind = RD_IconKind_Null;\r\n  B32 name_is_code = 0;\r\n  switch(entity->kind)\r\n  {\r\n    default:{}break;\r\n    case CTRL_EntityKind_Machine: {icon_kind = RD_IconKind_Machine;}break;\r\n    case CTRL_EntityKind_Process: {icon_kind = RD_IconKind_Threads;}break;\r\n    case CTRL_EntityKind_Thread:  {icon_kind = RD_IconKind_Thread; name_is_code = 1;}break;\r\n    case CTRL_EntityKind_Module:  {icon_kind = RD_IconKind_Module;}break;\r\n  }\r\n  \r\n  //- rjf: set up drawing params\r\n  DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Code), rd_raster_flags_from_slot(RD_FontSlot_Code), color, ui_top_font_size()};\r\n  \r\n  //- rjf: push icon\r\n  if(icon_kind != RD_IconKind_Null)\r\n  {\r\n    dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[icon_kind], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = secondary_color);\r\n    dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n  }\r\n  \r\n  //- rjf: push frozen icon, if frozen\r\n  if((entity->kind == CTRL_EntityKind_Machine ||\r\n      entity->kind == CTRL_EntityKind_Process ||\r\n      entity->kind == CTRL_EntityKind_Thread) &&\r\n     ctrl_entity_tree_is_frozen(entity))\r\n    UI_TagF(\"bad\")\r\n  {\r\n    dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_Locked], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = ui_color_from_name(str8_lit(\"text\")));\r\n    dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n  }\r\n  \r\n  //- rjf: push selected icon, if selected thread\r\n  if(entity->kind == CTRL_EntityKind_Thread)\r\n  {\r\n    B32 is_selected = ctrl_handle_match(entity->handle, rd_base_regs()->thread);\r\n    if(is_selected)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[RD_IconKind_RightArrow], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = color);\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n    }\r\n  }\r\n  \r\n  //- rjf: push containing process prefix\r\n  if(entity->kind == CTRL_EntityKind_Thread ||\r\n     entity->kind == CTRL_EntityKind_Module)\r\n  {\r\n    CTRL_EntityArray processes = ctrl_entity_array_from_kind(&d_state->ctrl_entity_store->ctx, CTRL_EntityKind_Process);\r\n    if(processes.count > 1)\r\n    {\r\n      CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);\r\n      String8 process_name = rd_name_from_ctrl_entity(arena, process);\r\n      Vec4F32 process_color = rd_color_from_ctrl_entity(process);\r\n      if(process_color.w == 0)\r\n      {\r\n        process_color = ui_color_from_name(str8_lit(\"text\"));\r\n      }\r\n      if(process_name.size != 0)\r\n      {\r\n        dr_fstrs_push_new(arena, &result, &params, process_name, .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = process_color);\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n        dr_fstrs_push_new(arena, &result, &params, push_str8f(arena, \"(PID: %I64u)\", process->id), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = secondary_color, .size = ui_top_font_size()*0.9f);\r\n        dr_fstrs_push_new(arena, &result, &params, str8_lit(\" / \"), .color = secondary_color);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: push name\r\n  dr_fstrs_push_new(arena, &result, &params, name,\r\n                    .font         = rd_font_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main),\r\n                    .raster_flags = rd_raster_flags_from_slot(name_is_code ? RD_FontSlot_Code : RD_FontSlot_Main),\r\n                    .color        = color);\r\n  \r\n  //- rjf: push PID\r\n  if(entity->kind == CTRL_EntityKind_Process)\r\n  {\r\n    dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n    dr_fstrs_push_new(arena, &result, &params, push_str8f(arena, \" (PID: %I64u)\", entity->id), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .color = secondary_color, .size = ui_top_font_size()*0.85f);\r\n  }\r\n  \r\n  //- rjf: threads get callstack extras\r\n  if(entity->kind == CTRL_EntityKind_Thread && include_extras)\r\n  {\r\n    Vec4F32 symbol_color = ui_color_from_name(str8_lit(\"code_symbol\"));\r\n    dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n    Access *access = access_open();\r\n    CTRL_Entity *process = ctrl_entity_ancestor_from_kind(entity, CTRL_EntityKind_Process);\r\n    Arch arch = entity->arch;\r\n    B32 call_stack_high_priority = ctrl_handle_match(entity->handle, rd_base_regs()->thread);\r\n    CTRL_CallStack call_stack = ctrl_call_stack_from_thread(access, entity->handle, call_stack_high_priority, call_stack_high_priority ? rd_state->frame_eval_memread_endt_us : 0);\r\n    B32 did_first_known = 0;\r\n    for(U64 idx = 0, limit = 10;\r\n        idx < call_stack.frames_count && idx < limit;\r\n        idx += 1)\r\n    {\r\n      CTRL_CallStackFrame *f = &call_stack.frames[call_stack.frames_count - 1 - idx];\r\n      U64 rip_vaddr = regs_rip_from_arch_block(arch, f->regs);\r\n      CTRL_Entity *module = ctrl_module_from_process_vaddr(process, rip_vaddr);\r\n      U64 rip_voff = ctrl_voff_from_vaddr(module, rip_vaddr);\r\n      String8 name = {0};\r\n      {\r\n        DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n        RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n        if(rdi != &rdi_parsed_nil)\r\n        {\r\n          RDI_Procedure *procedure = rdi_procedure_from_voff(rdi, rip_voff);\r\n          name.str = rdi_string_from_idx(rdi, procedure->name_string_idx, &name.size);\r\n          name = push_str8_copy(arena, name);\r\n        }\r\n        if(name.size == 0 && did_first_known)\r\n        {\r\n          name = str8_lit(\"???\");\r\n        }\r\n        if(name.size != 0)\r\n        {\r\n          did_first_known = 1;\r\n          dr_fstrs_push_new(arena, &result, &params, name, .size = extras_size, .color = symbol_color);\r\n          if(idx+1 < call_stack.frames_count)\r\n          {\r\n            dr_fstrs_push_new(arena, &result, &params, str8_lit(\" > \"), .color = secondary_color, .size = extras_size);\r\n            if(idx+1 == limit)\r\n            {\r\n              dr_fstrs_push_new(arena, &result, &params, str8_lit(\"...\"), .color = secondary_color, .size = extras_size);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    access_close(access);\r\n  }\r\n  \r\n  //- rjf: modules get debug info status extras\r\n  if(entity->kind == CTRL_EntityKind_Module && include_extras)\r\n  {\r\n    Access *access = access_open();\r\n    DI_Key dbgi_key = ctrl_dbgi_key_from_module(entity);\r\n    RDI_Parsed *rdi = di_rdi_from_key(access, dbgi_key, 0, 0);\r\n    if(rdi->raw_data_size == 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\" \"));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"(Debug information not loaded)\"), .font = rd_font_from_slot(RD_FontSlot_Main), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main), .size = extras_size, .color = secondary_color);\r\n    }\r\n    access_close(access);\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal DR_FStrList\r\nrd_title_fstrs_from_code_name(Arena *arena, String8 code_name)\r\n{\r\n  DR_FStrList result = {0};\r\n  {\r\n    RD_VocabInfo *info = rd_vocab_info_from_code_name(code_name);\r\n    \r\n    //- rjf: set up color/size for all parts of the title\r\n    //\r\n    // the \"running\" part implies that it changes as things are added - \r\n    // so if a primary title is pushed, we can make the rest of the title\r\n    // more faded/smaller, but only after a primary title is pushed,\r\n    // which could be caused by many different potential parts of a cfg.\r\n    //\r\n    DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n    \r\n    //- rjf: push icon\r\n    if(info->icon_kind != RD_IconKind_Null) UI_Tag(str8_lit(\"weak\"))\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, rd_icon_kind_text_table[info->icon_kind], .font = rd_font_from_slot(RD_FontSlot_Icons), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons), .color = ui_color_from_name(str8_lit(\"text\")));\r\n      dr_fstrs_push_new(arena, &result, &params, str8_lit(\"  \"));\r\n    }\r\n    \r\n    //- rjf: push display name\r\n    if(info->display_name.size != 0)\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, info->display_name);\r\n    }\r\n    \r\n    //- rjf: push code name as a fallback\r\n    else\r\n    {\r\n      dr_fstrs_push_new(arena, &result, &params, code_name, .font = rd_font_from_slot(RD_FontSlot_Code), .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code));\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DR_FStrList\r\nrd_title_fstrs_from_file_path(Arena *arena, String8 file_path)\r\n{\r\n  DR_FStrList fstrs = {0};\r\n  String8 file_name = str8_skip_last_slash(file_path);\r\n  FileProperties props = os_properties_from_file_path(file_path);\r\n  RD_IconKind icon_kind = RD_IconKind_FileOutline;\r\n  if(props.flags & FilePropertyFlag_IsFolder)\r\n  {\r\n    icon_kind = RD_IconKind_FolderClosedFilled;\r\n  }\r\n  if(file_path.size == 0 || str8_match(file_path, str8_lit(\"/\"), StringMatchFlag_SlashInsensitive))\r\n  {\r\n    icon_kind = RD_IconKind_Machine;\r\n    file_name = str8_lit(\"File System\");\r\n  }\r\n  DR_FStrParams params = {rd_font_from_slot(RD_FontSlot_Main), rd_raster_flags_from_slot(RD_FontSlot_Main), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n  UI_TagF(\"weak\")\r\n  {\r\n    dr_fstrs_push_new(arena, &fstrs, &params,\r\n                      rd_icon_kind_text_table[icon_kind],\r\n                      .font = rd_font_from_slot(RD_FontSlot_Icons),\r\n                      .raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Icons),\r\n                      .color = ui_color_from_name(str8_lit(\"text\")));\r\n  }\r\n  dr_fstrs_push_new(arena, &fstrs, &params, str8_lit(\"  \"));\r\n  dr_fstrs_push_new(arena, &fstrs, &params, file_name);\r\n  return fstrs;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Loading Overlay\r\n\r\ninternal void\r\nrd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target)\r\n{\r\n  if(loading_t >= 0.001f) UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    // rjf: set up dimensions\r\n    F32 edge_padding = 30.f;\r\n    F32 width = ui_top_font_size() * 10;\r\n    F32 height = ui_top_font_size() * 1.f;\r\n    F32 min_thickness = ui_top_font_size()/2;\r\n    F32 trail = ui_top_font_size() * 4;\r\n    F32 t = pow_f32(sin_f32((F32)rd_state->time_in_seconds / 1.8f), 2.f);\r\n    F64 v = 1.f - abs_f32(0.5f - t);\r\n    \r\n    // rjf: build indicator\r\n    UI_CornerRadius(height/3.f) UI_Transparency(1-loading_t)\r\n    {\r\n      // rjf: rects\r\n      Rng2F32 indicator_region_rect =\r\n        r2f32p((rect.x0 + rect.x1)/2 - width/2  - rect.x0,\r\n               (rect.y0 + rect.y1)/2 - height/2 - rect.y0,\r\n               (rect.x0 + rect.x1)/2 + width/2  - rect.x0,\r\n               (rect.y0 + rect.y1)/2 + height/2 - rect.y0);\r\n      Rng2F32 indicator_rect =\r\n        r2f32p(indicator_region_rect.x0 + width*t - min_thickness/2 - trail*v,\r\n               indicator_region_rect.y0,\r\n               indicator_region_rect.x0 + width*t + min_thickness/2 + trail*v,\r\n               indicator_region_rect.y1);\r\n      indicator_rect.x0 = Clamp(indicator_region_rect.x0, indicator_rect.x0, indicator_region_rect.x1);\r\n      indicator_rect.x1 = Clamp(indicator_region_rect.x0, indicator_rect.x1, indicator_region_rect.x1);\r\n      indicator_rect = pad_2f32(indicator_rect, -1.f);\r\n      \r\n      // rjf: does the view have loading *progress* info? -> draw extra progress layer\r\n      if(progress_v != progress_v_target) UI_TagF(\"drop_site\")\r\n      {\r\n        F64 pct_done_f64 = ((F64)progress_v/(F64)progress_v_target);\r\n        F32 pct_done = (F32)pct_done_f64;\r\n        Rng2F32 pct_rect = r2f32p(indicator_region_rect.x0,\r\n                                  indicator_region_rect.y0,\r\n                                  indicator_region_rect.x0 + (indicator_region_rect.x1 - indicator_region_rect.x0)*pct_done,\r\n                                  indicator_region_rect.y1);\r\n        UI_Rect(pct_rect)\r\n          ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_Floating, ui_key_zero());\r\n      }\r\n      \r\n      // rjf: fill\r\n      UI_TagF(\"pop\") UI_Rect(indicator_rect)\r\n        ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_Floating, ui_key_zero());\r\n      \r\n      // rjf: animated bar\r\n      UI_Rect(indicator_region_rect)\r\n      {\r\n        UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder|UI_BoxFlag_Floating|UI_BoxFlag_Clickable, \"bg_system_status\");\r\n        UI_Signal sig = ui_signal_from_box(box);\r\n      }\r\n    }\r\n    \r\n    // rjf: build background\r\n    UI_WidthFill UI_HeightFill UI_Transparency(1-loading_t) UI_BlurSize(10.f*loading_t)\r\n    {\r\n      ui_set_next_blur_size(10.f*loading_t);\r\n      ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_Floating, ui_key_zero());\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Fancy Buttons\r\n\r\ninternal void\r\nrd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  CFG_KeyMapNodePtrList key_map_nodes = cfg_key_map_node_ptr_list_from_name(scratch.arena, rd_state->key_map, name);\r\n  \r\n  //- rjf: build buttons for each binding\r\n  UI_CornerRadius(ui_top_font_size()*0.5f) for(CFG_KeyMapNodePtr *n = key_map_nodes.first; n != 0; n = n->next)\r\n  {\r\n    ui_spacer(ui_em(1.f, 1.f));\r\n    CFG_Binding binding = n->v->binding;\r\n    B32 rebinding_active_for_this_binding = (rd_state->bind_change_active &&\r\n                                             str8_match(rd_state->bind_change_cmd_name, name, 0) &&\r\n                                             n->v->cfg_id == rd_state->bind_change_binding_id);\r\n    \r\n    //- rjf: grab all conflicts\r\n    B32 has_conflicts = 0;\r\n    CFG_KeyMapNodePtrList nodes_with_this_binding = cfg_key_map_node_ptr_list_from_binding(scratch.arena, rd_state->key_map, binding);\r\n    {\r\n      for(CFG_KeyMapNodePtr *n2 = nodes_with_this_binding.first; n2 != 0; n2 = n2->next)\r\n      {\r\n        if(!str8_match(n->v->name, n2->v->name, 0))\r\n        {\r\n          has_conflicts = 1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: form binding string\r\n    String8 keybinding_str = {0};\r\n    {\r\n      if(binding.key != OS_Key_Null)\r\n      {\r\n        keybinding_str = os_string_from_modifiers_key(scratch.arena, binding.modifiers, binding.key);\r\n      }\r\n      else\r\n      {\r\n        keybinding_str = str8_lit(\"- no binding -\");\r\n      }\r\n    }\r\n    \r\n    //- rjf: compute fuzzy matches\r\n    FuzzyMatchRangeList matches = {0};\r\n    if(filter.size != 0)\r\n    {\r\n      matches = fuzzy_match_find(scratch.arena, filter, keybinding_str);\r\n    }\r\n    \r\n    //- rjf: build box\r\n    ui_set_next_tag(has_conflicts ? str8_lit(\"bad_pop\") : rebinding_active_for_this_binding ? str8_lit(\"pop\") : str8_zero());\r\n    ui_set_next_text_alignment(UI_TextAlign_Center);\r\n    ui_set_next_group_key(ui_key_zero());\r\n    ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.f, 1));\r\n    UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                            UI_BoxFlag_Clickable|\r\n                                            UI_BoxFlag_DrawActiveEffects|\r\n                                            UI_BoxFlag_DrawHotEffects|\r\n                                            UI_BoxFlag_DrawBorder|\r\n                                            UI_BoxFlag_DrawBackground,\r\n                                            \"%S###bind_btn_%S_%x_%x\", keybinding_str, name, binding.key, binding.modifiers);\r\n    ui_box_equip_fuzzy_match_ranges(box, &matches);\r\n    \r\n    //- rjf: interaction\r\n    UI_Signal sig = ui_signal_from_box(box);\r\n    {\r\n      // rjf: click => toggle activity\r\n      if(!rd_state->bind_change_active && ui_clicked(sig))\r\n      {\r\n        if((binding.key == OS_Key_Esc || binding.key == OS_Key_Delete) && binding.modifiers == 0)\r\n        {\r\n          log_user_error(str8_lit(\"Cannot rebind; this command uses a reserved keybinding.\"));\r\n        }\r\n        else\r\n        {\r\n          arena_clear(rd_state->bind_change_arena);\r\n          rd_state->bind_change_active = 1;\r\n          rd_state->bind_change_cmd_name = push_str8_copy(rd_state->bind_change_arena, name);\r\n          rd_state->bind_change_binding_id = n->v->cfg_id;\r\n        }\r\n      }\r\n      else if(rd_state->bind_change_active && ui_clicked(sig))\r\n      {\r\n        rd_state->bind_change_active = 0;\r\n      }\r\n      \r\n      // rjf: hover w/ conflicts => show conflicts\r\n      if(ui_hovering(sig) && has_conflicts) UI_Tooltip\r\n      {\r\n        UI_PrefWidth(ui_children_sum(1)) rd_error_label(str8_lit(\"This binding conflicts with those for:\"));\r\n        for(CFG_KeyMapNodePtr *n2 = nodes_with_this_binding.first; n2 != 0; n2 = n2->next)\r\n        {\r\n          if(!str8_match(n2->v->name, n->v->name, 0))\r\n          {\r\n            String8 display_name = rd_display_from_code_name(n2->v->name);\r\n            ui_labelf(\"%S\", display_name);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: delete button\r\n    if(rebinding_active_for_this_binding)\r\n      UI_PrefWidth(ui_em(2.5f, 1.f))\r\n      UI_TagF(\"bad_pop\")\r\n    {\r\n      ui_set_next_group_key(ui_key_zero());\r\n      UI_Signal sig = rd_icon_button(RD_IconKind_X, 0, str8_lit(\"###delete_binding\"));\r\n      if(ui_clicked(sig))\r\n      {\r\n        cfg_node_release(rd_state->cfg, cfg_node_from_id(rd_state->bind_change_binding_id));\r\n        rd_state->bind_change_active = 0;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: build \"add new binding\" button\r\n  if(add_new)\r\n  {\r\n    B32 adding_new_binding = (rd_state->bind_change_active &&\r\n                              str8_match(rd_state->bind_change_cmd_name, name, 0) &&\r\n                              rd_state->bind_change_binding_id == 0);\r\n    ui_spacer(ui_em(1.f, 1.f));\r\n    RD_Font(RD_FontSlot_Icons) UI_TagF(adding_new_binding ? \"pop\" : \"\") UI_CornerRadius(ui_top_font_size()*0.5f)\r\n    {\r\n      ui_set_next_text_alignment(UI_TextAlign_Center);\r\n      ui_set_next_group_key(ui_key_zero());\r\n      ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*1.5f, 1));\r\n      UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                              UI_BoxFlag_Clickable|\r\n                                              UI_BoxFlag_DrawActiveEffects|\r\n                                              UI_BoxFlag_DrawHotEffects|\r\n                                              UI_BoxFlag_DrawBorder|\r\n                                              UI_BoxFlag_DrawBackground,\r\n                                              \"%S###add_binding\", rd_icon_kind_text_table[RD_IconKind_Add]);\r\n      UI_Signal sig = ui_signal_from_box(box);\r\n      if(ui_clicked(sig))\r\n      {\r\n        if(!adding_new_binding && ui_clicked(sig))\r\n        {\r\n          arena_clear(rd_state->bind_change_arena);\r\n          rd_state->bind_change_active = 1;\r\n          rd_state->bind_change_cmd_name = push_str8_copy(rd_state->bind_change_arena, name);\r\n          rd_state->bind_change_binding_id = 0;\r\n        }\r\n        else if(adding_new_binding && ui_clicked(sig))\r\n        {\r\n          rd_state->bind_change_active = 0;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal UI_Signal\r\nrd_menu_bar_button(String8 string)\r\n{\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable|UI_BoxFlag_DrawHotEffects, string);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nrd_cmd_spec_button(String8 name)\r\n{\r\n  RD_CmdKindInfo *info = rd_cmd_kind_info_from_string(name);\r\n  ui_set_next_child_layout_axis(Axis2_X);\r\n  UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawBorder|\r\n                                          UI_BoxFlag_DrawBackground|\r\n                                          UI_BoxFlag_DrawHotEffects|\r\n                                          UI_BoxFlag_DrawActiveEffects|\r\n                                          UI_BoxFlag_Clickable,\r\n                                          \"###cmd_%p\", info);\r\n  UI_Parent(box) UI_HeightFill UI_Padding(ui_em(1.f, 1.f))\r\n  {\r\n    RD_IconKind canonical_icon = rd_icon_kind_from_code_name(name);\r\n    if(canonical_icon != RD_IconKind_Null)\r\n    {\r\n      RD_Font(RD_FontSlot_Icons)\r\n        UI_PrefWidth(ui_em(2.f, 1.f))\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n        UI_TagF(\"weak\")\r\n      {\r\n        ui_label(rd_icon_kind_text_table[canonical_icon]);\r\n      }\r\n    }\r\n    UI_PrefWidth(ui_text_dim(10, 1.f))\r\n    {\r\n      UI_Flags(UI_BoxFlag_DrawTextFastpathCodepoint)\r\n        UI_FastpathCodepoint(box->fastpath_codepoint)\r\n        ui_label(rd_display_from_code_name(name));\r\n      ui_spacer(ui_pct(1, 0));\r\n      ui_set_next_flags(UI_BoxFlag_Clickable);\r\n      ui_set_next_group_key(ui_key_zero());\r\n      UI_PrefWidth(ui_children_sum(1))\r\n        UI_FontSize(ui_top_font_size()*0.95f) UI_HeightFill\r\n        UI_NamedRow(str8_lit(\"###bindings\"))\r\n        UI_TagF(\"weak\")\r\n        UI_FastpathCodepoint(0)\r\n      {\r\n        rd_cmd_binding_buttons(name, str8_zero(), 1);\r\n      }\r\n    }\r\n  }\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\ninternal void\r\nrd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  for EachIndex(idx, count)\r\n  {\r\n    if(cmd_names[idx].size == 0)\r\n    {\r\n      UI_TagF(\"floating\") ui_divider(ui_em(1.f, 1.f));\r\n    }\r\n    else\r\n    {\r\n      ui_set_next_fastpath_codepoint(fastpath_codepoints[idx]);\r\n      UI_Signal sig = rd_cmd_spec_button(cmd_names[idx]);\r\n      if(ui_clicked(sig))\r\n      {\r\n        rd_cmd(RD_CmdKind_RunCommand, .cmd_name = cmd_names[idx]);\r\n        ui_ctx_menu_close();\r\n        CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n        RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n        ws->menu_bar_focused = 0;\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal UI_Signal\r\nrd_icon_button(RD_IconKind kind, FuzzyMatchRangeList *matches, String8 string)\r\n{\r\n  String8 display_string = ui_display_part_from_key_string(string);\r\n  ui_set_next_child_layout_axis(Axis2_X);\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|\r\n                                         UI_BoxFlag_DrawBorder|\r\n                                         UI_BoxFlag_DrawBackground|\r\n                                         UI_BoxFlag_DrawHotEffects|\r\n                                         UI_BoxFlag_DrawActiveEffects,\r\n                                         string);\r\n  UI_Parent(box)\r\n  {\r\n    if(display_string.size == 0)\r\n    {\r\n      ui_spacer(ui_pct(1, 0));\r\n    }\r\n    else\r\n    {\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n    }\r\n    UI_TextAlignment(UI_TextAlign_Center)\r\n      RD_Font(RD_FontSlot_Icons)\r\n      UI_PrefWidth(ui_em(2.f, 1.f))\r\n      UI_PrefHeight(ui_pct(1, 0))\r\n      UI_FlagsAdd(UI_BoxFlag_DisableTextTrunc)\r\n      UI_TagF(\"weak\")\r\n      ui_label(rd_icon_kind_text_table[kind]);\r\n    if(display_string.size != 0)\r\n    {\r\n      UI_PrefWidth(ui_pct(1.f, 0.f))\r\n      {\r\n        UI_Box *box = ui_label(display_string).box;\r\n        if(matches != 0)\r\n        {\r\n          ui_box_equip_fuzzy_match_ranges(box, matches);\r\n        }\r\n      }\r\n    }\r\n    if(display_string.size == 0)\r\n    {\r\n      ui_spacer(ui_pct(1, 0));\r\n    }\r\n    else\r\n    {\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n    }\r\n  }\r\n  UI_Signal result = ui_signal_from_box(box);\r\n  return result;\r\n}\r\n\r\ninternal UI_Signal\r\nrd_icon_buttonf(RD_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = rd_icon_button(kind, matches, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Text View\r\n\r\ntypedef struct RD_ThreadBoxDrawExtData RD_ThreadBoxDrawExtData;\r\nstruct RD_ThreadBoxDrawExtData\r\n{\r\n  Vec4F32 thread_color;\r\n  F32 progress_t;\r\n  F32 alive_t;\r\n  F32 hover_t;\r\n  B32 is_selected;\r\n  B32 is_frozen;\r\n  B32 do_lines;\r\n  B32 do_glow;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(rd_thread_box_draw_extensions)\r\n{\r\n  RD_ThreadBoxDrawExtData *u = (RD_ThreadBoxDrawExtData *)box->custom_draw_user_data;\r\n  \r\n  // rjf: draw line before next-to-execute line\r\n  if(u->do_lines)\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->parent->parent->parent->rect.x0,\r\n                                        box->parent->rect.y0 - box->font_size*0.125f,\r\n                                        box->parent->parent->parent->rect.x0 + box->font_size*260*u->alive_t,\r\n                                        box->parent->rect.y0 + box->font_size*0.125f),\r\n                                 v4f32(u->thread_color.x, u->thread_color.y, u->thread_color.z, 0),\r\n                                 0, 0, 1);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = u->thread_color;\r\n  }\r\n  \r\n  // rjf: draw 'progress bar', showing thread's progress through the line's address range\r\n  if(u->progress_t > 0)\r\n  {\r\n    Vec4F32 weak_thread_color = u->thread_color;\r\n    weak_thread_color.w *= 0.4f;\r\n    dr_rect(r2f32p(box->rect.x0,\r\n                   box->rect.y0,\r\n                   box->rect.x1,\r\n                   box->rect.y0 + (box->rect.y1-box->rect.y0)*u->progress_t),\r\n            weak_thread_color,\r\n            0, 0, 1);\r\n  }\r\n  \r\n  // rjf: draw rich hover fill\r\n  if(u->hover_t > 0.001f)\r\n  {\r\n    Vec4F32 weak_thread_color = u->thread_color;\r\n    weak_thread_color.w *= 0.15f*u->hover_t;\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0,\r\n                                        box->parent->rect.y0,\r\n                                        box->rect.x0 + ui_top_font_size()*22.f*u->hover_t,\r\n                                        box->parent->rect.y1),\r\n                                 v4f32(0, 0, 0, 0),\r\n                                 0, 0, 1);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color;\r\n  }\r\n  \r\n  // rjf: draw slight fill on selected thread\r\n  if(u->is_selected && u->do_glow)\r\n  {\r\n    Vec4F32 weak_thread_color = u->thread_color;\r\n    weak_thread_color.w *= 0.1f;\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0,\r\n                                        box->parent->rect.y0,\r\n                                        box->rect.x0 + ui_top_font_size()*22.f*u->alive_t,\r\n                                        box->parent->rect.y1),\r\n                                 v4f32(0, 0, 0, 0),\r\n                                 0, 0, 1);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color;\r\n  }\r\n  \r\n  // rjf: locked icon on frozen threads\r\n  if(u->is_frozen) UI_TagF(\"bad\")\r\n  {\r\n    F32 lock_icon_off = ui_top_font_size()*0.2f;\r\n    Vec4F32 color = ui_color_from_name(str8_lit(\"text\"));\r\n    dr_text(rd_font_from_slot(RD_FontSlot_Icons),\r\n            box->font_size, 0, 0, FNT_RasterFlag_Smooth,\r\n            v2f32((box->rect.x0 + box->rect.x1)/2 + lock_icon_off/2,\r\n                  box->rect.y0 + lock_icon_off/2),\r\n            color,\r\n            rd_icon_kind_text_table[RD_IconKind_Locked]);\r\n  }\r\n}\r\n\r\ntypedef struct RD_BreakpointBoxDrawExtData RD_BreakpointBoxDrawExtData;\r\nstruct RD_BreakpointBoxDrawExtData\r\n{\r\n  Vec4F32 color;\r\n  F32 alive_t;\r\n  F32 hover_t;\r\n  F32 remap_px_delta;\r\n  B32 do_lines;\r\n  B32 do_glow;\r\n  B32 is_disabled;\r\n  B32 is_conditioned;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(rd_bp_box_draw_extensions)\r\n{\r\n  RD_BreakpointBoxDrawExtData *u = (RD_BreakpointBoxDrawExtData *)box->custom_draw_user_data;\r\n  \r\n  // rjf: draw line before next-to-execute line\r\n  if(u->do_lines)\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->parent->parent->parent->rect.x0,\r\n                                        box->parent->rect.y0 - box->font_size*0.125f,\r\n                                        box->parent->parent->parent->rect.x0 + ui_top_font_size()*250.f*u->alive_t,\r\n                                        box->parent->rect.y0 + box->font_size*0.125f),\r\n                                 v4f32(u->color.x, u->color.y, u->color.z, 0),\r\n                                 0, 0, 1.f);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = u->color;\r\n  }\r\n  \r\n  // rjf: draw rich hover fill\r\n  if(u->hover_t > 0.001f)\r\n  {\r\n    Vec4F32 weak_color = u->color;\r\n    weak_color.w *= 0.5f*u->hover_t;\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0,\r\n                                        box->parent->rect.y0,\r\n                                        box->rect.x0 + ui_top_font_size()*22.f*u->hover_t,\r\n                                        box->parent->rect.y1),\r\n                                 v4f32(0, 0, 0, 0),\r\n                                 0, 0, 1);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = weak_color;\r\n  }\r\n  \r\n  // rjf: draw slight fill\r\n  if(u->do_glow)\r\n  {\r\n    Vec4F32 weak_thread_color = u->color;\r\n    weak_thread_color.w *= 0.3f;\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(box->rect.x0,\r\n                                        box->parent->rect.y0,\r\n                                        box->rect.x0 + ui_top_font_size()*22.f*u->alive_t,\r\n                                        box->parent->rect.y1),\r\n                                 v4f32(0, 0, 0, 0),\r\n                                 0, 0, 1);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = weak_thread_color;\r\n  }\r\n  \r\n  // rjf: draw remaps\r\n  if(u->remap_px_delta != 0)\r\n  {\r\n    F32 remap_px_delta = u->remap_px_delta;\r\n    F32 circle_advance = fnt_dim_from_tag_size_string(box->font, box->font_size, 0, 0, rd_icon_kind_text_table[RD_IconKind_CircleFilled]).x;\r\n    Vec2F32 bp_text_pos = ui_box_text_position(box);\r\n    Vec2F32 bp_center = v2f32(bp_text_pos.x + circle_advance/2, bp_text_pos.y);\r\n    FNT_Metrics icon_font_metrics = fnt_metrics_from_tag_size(box->font, box->font_size);\r\n    F32 icon_font_line_height = fnt_line_height_from_metrics(&icon_font_metrics);\r\n    F32 remap_bar_thickness = 0.3f*ui_top_font_size();\r\n    Vec4F32 remap_color = u->color;\r\n    remap_color.w *= 0.3f;\r\n    R_Rect2DInst *inst = dr_rect(r2f32p(bp_center.x - remap_bar_thickness,\r\n                                        bp_center.y + ClampTop(remap_px_delta, 0) + remap_bar_thickness,\r\n                                        bp_center.x + remap_bar_thickness,\r\n                                        bp_center.y + ClampBot(remap_px_delta, 0) - remap_bar_thickness),\r\n                                 remap_color, 2.f, 0, 1.f);\r\n    dr_text(box->font, box->font_size, 0, 0, FNT_RasterFlag_Smooth,\r\n            v2f32(bp_text_pos.x,\r\n                  bp_center.y + remap_px_delta),\r\n            remap_color,\r\n            rd_icon_kind_text_table[RD_IconKind_CircleFilled]);\r\n  }\r\n  \r\n  // rjf: draw conditioned marker\r\n  if(u->is_conditioned) UI_TagF(u->is_disabled ? \"weak\" : \"\")\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    Vec4F32 color = ui_color_from_name(str8_lit(\"text\"));\r\n    FNT_Run run = fnt_run_from_string(rd_font_from_slot(RD_FontSlot_Code), box->font_size*0.8f, 0, 0, FNT_RasterFlag_Smooth, str8_lit(\"if\"));\r\n    Vec2F32 p = center_2f32(box->rect);\r\n    p.x -= run.dim.x*0.5f;\r\n    p.y += run.descent;\r\n    dr_text_run(p, color, run);\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  // rjf: draw disabled marker\r\n  if(u->is_disabled)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    Vec4F32 color = ui_color_from_name(str8_lit(\"breakpoint\"));\r\n    FNT_Run run = fnt_run_from_string(rd_font_from_slot(RD_FontSlot_Icons), box->font_size*0.95f, 0, 0, FNT_RasterFlag_Smooth, str8_lit(\"x\"));\r\n    Vec2F32 box_dim = dim_2f32(box->rect);\r\n    Vec2F32 p = center_2f32(box->rect);\r\n    p.x += box_dim.x*0.1f;\r\n    p.y -= box_dim.y*0.2f;\r\n    dr_text_run(p, color, run);\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\ninternal RD_CodeSliceSignal\r\nrd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string)\r\n{\r\n  RD_CodeSliceSignal result = {0};\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  CTRL_Entity *selected_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_regs()->thread);\r\n  CTRL_Entity *selected_thread_process = ctrl_entity_ancestor_from_kind(selected_thread, CTRL_EntityKind_Process);\r\n  U64 selected_thread_rip_unwind_vaddr = d_query_cached_rip_from_thread_unwind(selected_thread, rd_regs()->unwind_count);\r\n  CTRL_Entity *selected_thread_module = ctrl_module_from_process_vaddr(selected_thread_process, selected_thread_rip_unwind_vaddr);\r\n  CTRL_Event stop_event = d_ctrl_last_stop_event();\r\n  CTRL_Entity *stopper_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, stop_event.entity);\r\n  B32 is_focused = ui_is_focus_active();\r\n  B32 ctrlified = (os_get_modifiers() & OS_Modifier_Ctrl);\r\n  Vec4F32 code_line_bgs[] =\r\n  {\r\n    ui_color_from_name(str8_lit(\"line_info_0\")),\r\n    ui_color_from_name(str8_lit(\"line_info_1\")),\r\n    ui_color_from_name(str8_lit(\"line_info_2\")),\r\n    ui_color_from_name(str8_lit(\"line_info_3\")),\r\n  };\r\n  F32 line_num_padding_px = ui_top_font_size()*1.f;\r\n  F32 entity_alive_t_rate = rd_state->entity_alive_animation_rate;\r\n  F32 entity_hover_t_rate = rd_state->rich_hover_animation_rate;\r\n  B32 do_thread_lines = rd_setting_b32_from_name(str8_lit(\"thread_lines\"));\r\n  B32 do_thread_glow = rd_setting_b32_from_name(str8_lit(\"thread_glow\"));\r\n  B32 do_bp_lines = rd_setting_b32_from_name(str8_lit(\"breakpoint_lines\"));\r\n  B32 do_bp_glow = rd_setting_b32_from_name(str8_lit(\"breakpoint_glow\"));\r\n  B32 do_scope_lines = rd_setting_b32_from_name(str8_lit(\"cursor_scope_lines\"));\r\n  B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit(\"cursor_trail\"));\r\n  Vec4F32 pop_color = {0};\r\n  UI_TagF(\"pop\")\r\n  {\r\n    pop_color = ui_color_from_name(str8_lit(\"background\"));\r\n  }\r\n  Vec4F32 highlight_color = {0};\r\n  UI_TagF(\"focus\")\r\n  {\r\n    highlight_color = ui_color_from_name(str8_lit(\"border\"));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build top-level container\r\n  //\r\n  UI_Box *top_container_box = &ui_nil_box;\r\n  Rng2F32 clipped_top_container_rect = {0};\r\n  {\r\n    ui_set_next_child_layout_axis(Axis2_X);\r\n    ui_set_next_pref_width(ui_px(params->line_text_max_width_px, 1));\r\n    ui_set_next_pref_height(ui_children_sum(1));\r\n    top_container_box = ui_build_box_from_string(UI_BoxFlag_DisableFocusEffects|UI_BoxFlag_DrawBorder, string);\r\n    clipped_top_container_rect = top_container_box->rect;\r\n    for(UI_Box *b = top_container_box; !ui_box_is_nil(b); b = b->parent)\r\n    {\r\n      if(b->flags & UI_BoxFlag_Clip)\r\n      {\r\n        clipped_top_container_rect = intersect_2f32(b->rect, clipped_top_container_rect);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: dragging cfgs/entities/expressions? -> drop site\r\n  //\r\n  B32 drop_can_hit_lines = 0;\r\n  CFG_Node *drop_cfg = &cfg_nil_node;\r\n  CTRL_Entity *drop_thread = &ctrl_entity_nil;\r\n  String8 drop_expr = {0};\r\n  Vec4F32 drop_color = pop_color;\r\n  UI_Key drop_site_key = ui_key_from_stringf(top_container_box->key, \"drop_site\");\r\n  if(rd_drag_is_active())\r\n  {\r\n    CFG_Node *cfg = cfg_node_from_id(rd_state->drag_drop_regs->cfg);\r\n    if(rd_state->drag_drop_regs_slot == RD_RegSlot_Cfg &&\r\n       (str8_match(cfg->string, str8_lit(\"breakpoint\"), 0) ||\r\n        str8_match(cfg->string, str8_lit(\"watch_pin\"), 0)))\r\n    {\r\n      drop_can_hit_lines = 1;\r\n      drop_cfg = cfg;\r\n      drop_color = linear_from_srgba(rd_color_from_cfg(cfg));\r\n      if(drop_color.w == 0)\r\n      {\r\n        drop_color = pop_color;\r\n      }\r\n    }\r\n    if(rd_state->drag_drop_regs_slot == RD_RegSlot_Thread)\r\n    {\r\n      drop_can_hit_lines = 1;\r\n      drop_thread = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, rd_state->drag_drop_regs->thread);\r\n      drop_color = rd_color_from_ctrl_entity(drop_thread);\r\n      if(drop_color.w == 0)\r\n      {\r\n        drop_color = pop_color;\r\n      }\r\n    }\r\n    if(rd_state->drag_drop_regs_slot == RD_RegSlot_Expr)\r\n    {\r\n      drop_can_hit_lines = 1;\r\n      drop_expr = rd_state->drag_drop_regs->expr;\r\n    }\r\n    if(drop_can_hit_lines) UI_WidthFill UI_HeightFill\r\n    {\r\n      UI_Box *drop_site_box = ui_build_box_from_key(UI_BoxFlag_DropSite|UI_BoxFlag_Floating, drop_site_key);\r\n      ui_signal_from_box(drop_site_box);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build per-line background colors\r\n  //\r\n  Vec4F32 *line_bg_colors = push_array(scratch.arena, Vec4F32, dim_1s64(params->line_num_range)+1);\r\n  {\r\n    //- rjf: color line with stopper-thread red\r\n    UI_TagF(\"bad_pop\")\r\n    {\r\n      U64 line_idx = 0;\r\n      for(S64 line_num = params->line_num_range.min;\r\n          line_num < params->line_num_range.max;\r\n          line_num += 1, line_idx += 1)\r\n      {\r\n        CTRL_EntityList threads = params->line_ips[line_idx];\r\n        for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next)\r\n        {\r\n          if(n->v == stopper_thread && (stop_event.cause == CTRL_EventCause_InterruptedByTrap || stop_event.cause == CTRL_EventCause_InterruptedByException))\r\n          {\r\n            line_bg_colors[line_idx] = ui_color_from_name(str8_lit(\"background\"));\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build priority margin\r\n  //\r\n  UI_Box *priority_margin_container_box = &ui_nil_box;\r\n  if(params->flags & RD_CodeSliceFlag_PriorityMargin) UI_Focus(UI_FocusKind_Off) UI_Parent(top_container_box) ProfScope(\"build priority margins\")\r\n  {\r\n    if(params->margin_float_off_px != 0)\r\n    {\r\n      ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1));\r\n      ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n      ui_build_box_from_key(0, ui_key_zero());\r\n      ui_set_next_fixed_x(floor_f32(params->margin_float_off_px));\r\n    }\r\n    ui_set_next_pref_width(ui_px(params->priority_margin_width_px, 1));\r\n    ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n    ui_set_next_child_layout_axis(Axis2_Y);\r\n    priority_margin_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit(\"priority_margin_container\"));\r\n    UI_Parent(priority_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f))\r\n    {\r\n      U64 line_idx = 0;\r\n      for(S64 line_num = params->line_num_range.min;\r\n          line_num <= params->line_num_range.max;\r\n          line_num += 1, line_idx += 1)\r\n      {\r\n        CTRL_EntityList line_ips  = params->line_ips[line_idx];\r\n        ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n        UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawActiveEffects, \"line_margin_%I64x\", line_num);\r\n        UI_Parent(line_margin_box)\r\n        {\r\n          //- rjf: build margin thread ip ui\r\n          for(CTRL_EntityNode *n = line_ips.first; n != 0; n = n->next)\r\n          {\r\n            // rjf: unpack thread\r\n            CTRL_Entity *thread = n->v;\r\n            if(thread != selected_thread)\r\n            {\r\n              continue;\r\n            }\r\n            U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0;\r\n            U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);\r\n            CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n            CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr);\r\n            DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n            U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr);\r\n            \r\n            // rjf: thread info => color\r\n            Vec4F32 color = rd_color_from_ctrl_entity(thread);\r\n            {\r\n              if(color.w == 0)\r\n              {\r\n                color = ui_color_from_name(str8_lit(\"thread_1\"));\r\n              }\r\n              if(unwind_count != 0)\r\n              {\r\n                color = ui_color_from_name(str8_lit(\"thread_unwound\"));\r\n              }\r\n              else if(thread == stopper_thread &&\r\n                      (stop_event.cause == CTRL_EventCause_InterruptedByHalt ||\r\n                       stop_event.cause == CTRL_EventCause_InterruptedByTrap ||\r\n                       stop_event.cause == CTRL_EventCause_InterruptedByException))\r\n              {\r\n                color = ui_color_from_name(str8_lit(\"thread_error\"));\r\n              }\r\n              if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index())\r\n              {\r\n                color.w *= 0.5f;\r\n              }\r\n              if(thread != selected_thread)\r\n              {\r\n                color.w *= 0.5f;\r\n              }\r\n            }\r\n            \r\n            // rjf: build thread box\r\n            ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight);\r\n            ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons));\r\n            ui_set_next_font_size(params->font_size);\r\n            ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);\r\n            ui_set_next_pref_width(ui_pct(1, 0));\r\n            ui_set_next_pref_height(ui_pct(1, 0));\r\n            ui_set_next_text_alignment(UI_TextAlign_Center);\r\n            ui_set_next_text_color(color);\r\n            UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, \"###ip_%I64x_%p\", line_num, thread);\r\n            UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc|\r\n                                                       UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|\r\n                                                       UI_BoxFlag_DrawText,\r\n                                                       thread_box_key);\r\n            ui_box_equip_display_string(thread_box, rd_icon_kind_text_table[RD_IconKind_RightArrow]);\r\n            UI_Signal thread_sig = ui_signal_from_box(thread_box);\r\n            \r\n            // rjf: custom draw\r\n            {\r\n              RD_Regs *hover_regs = rd_get_hover_regs();\r\n              B32 is_hovering = (ctrl_handle_match(hover_regs->ctrl_entity, thread->handle) &&\r\n                                 rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity);\r\n              RD_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), RD_ThreadBoxDrawExtData, 1);\r\n              u->thread_color = color;\r\n              u->alive_t      = ui_anim(ui_key_from_stringf(top_container_box->key, \"###entity_alive_t_%p\", thread), 1.f, .rate = entity_alive_t_rate);\r\n              u->hover_t      = ui_anim(ui_key_from_stringf(top_container_box->key, \"###entity_hover_t_%p\", thread), (F32)!!is_hovering, .rate = entity_hover_t_rate);\r\n              u->is_selected  = (thread == selected_thread);\r\n              u->is_frozen    = !!thread->is_frozen;\r\n              u->do_lines     = do_thread_lines;\r\n              u->do_glow      = do_thread_glow;\r\n              ui_box_equip_custom_draw(thread_box, rd_thread_box_draw_extensions, u);\r\n              \r\n              // rjf: fill out progress t (progress into range of current line's\r\n              // voff range)\r\n              if(params->line_infos[line_idx].first != 0)\r\n              {\r\n                D_LineList *lines = &params->line_infos[line_idx];\r\n                D_Line *line = 0;\r\n                for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n                {\r\n                  if(di_key_match(n->v.dbgi_key, dbgi_key))\r\n                  {\r\n                    line = &n->v;\r\n                    break;\r\n                  }\r\n                }\r\n                if(line != 0)\r\n                {\r\n                  Rng1U64 line_voff_rng = line->voff_range;\r\n                  Vec4F32 weak_thread_color = color;\r\n                  weak_thread_color.w *= 0.4f;\r\n                  F32 progress_t = (line_voff_rng.max != line_voff_rng.min) ? ((F32)(thread_rip_voff - line_voff_rng.min) / (F32)(line_voff_rng.max - line_voff_rng.min)) : 0;\r\n                  progress_t = Clamp(0, progress_t, 1);\r\n                  u->progress_t = progress_t;\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: interactions \r\n            if(ui_hovering(thread_sig) && !rd_drag_is_active())\r\n            {\r\n              RD_RegsScope(.ctrl_entity = thread->handle) rd_set_hover_regs(RD_RegSlot_CtrlEntity);\r\n            }\r\n            if(ui_right_clicked(thread_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_PushQuery,\r\n                     .ui_key = thread_box->key,\r\n                     .expr   = push_str8f(scratch.arena, \"query:control.%S\", ctrl_string_from_handle(scratch.arena, thread->handle)));\r\n            }\r\n            if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse()))\r\n            {\r\n              RD_RegsScope(.thread = thread->handle) rd_drag_begin(RD_RegSlot_Thread);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build catchall margin\r\n  //\r\n  UI_Box *catchall_margin_container_box = &ui_nil_box;\r\n  if(params->flags & RD_CodeSliceFlag_CatchallMargin) UI_Focus(UI_FocusKind_Off) UI_Parent(top_container_box) ProfScope(\"build catchall margins\")\r\n    UI_TagF(\"floating\")\r\n  {\r\n    if(params->margin_float_off_px != 0)\r\n    {\r\n      ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1));\r\n      ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n      ui_build_box_from_key(0, ui_key_zero());\r\n      ui_set_next_fixed_x(floor_f32(params->margin_float_off_px + params->priority_margin_width_px));\r\n    }\r\n    ui_set_next_pref_width(ui_px(params->catchall_margin_width_px, 1));\r\n    ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n    ui_set_next_child_layout_axis(Axis2_Y);\r\n    catchall_margin_container_box = ui_build_box_from_string(UI_BoxFlag_DrawSideRight|UI_BoxFlag_DrawSideLeft|UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit(\"catchall_margin_container\"));\r\n    UI_Parent(catchall_margin_container_box) UI_PrefHeight(ui_px(params->line_height_px, 1.f))\r\n    {\r\n      U64 line_idx = 0;\r\n      for(S64 line_num = params->line_num_range.min;\r\n          line_num <= params->line_num_range.max;\r\n          line_num += 1, line_idx += 1)\r\n      {\r\n        CTRL_EntityList line_ips = params->line_ips[line_idx];\r\n        CFG_NodePtrList line_bps = params->line_bps[line_idx];\r\n        CFG_NodePtrList line_pins = params->line_pins[line_idx];\r\n        ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n        ui_set_next_background_color(v4f32(0, 0, 0, 0));\r\n        UI_Box *line_margin_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, \"line_margin_%I64x\", line_num);\r\n        UI_Parent(line_margin_box)\r\n        {\r\n          //- rjf: build margin thread ip ui\r\n          for(CTRL_EntityNode *n = line_ips.first; n != 0; n = n->next)\r\n          {\r\n            // rjf: unpack thread\r\n            CTRL_Entity *thread = n->v;\r\n            if(thread == selected_thread)\r\n            {\r\n              continue;\r\n            }\r\n            U64 unwind_count = (thread == selected_thread) ? rd_regs()->unwind_count : 0;\r\n            U64 thread_rip_vaddr = d_query_cached_rip_from_thread_unwind(thread, unwind_count);\r\n            CTRL_Entity *process = ctrl_entity_ancestor_from_kind(thread, CTRL_EntityKind_Process);\r\n            CTRL_Entity *module = ctrl_module_from_process_vaddr(process, thread_rip_vaddr);\r\n            DI_Key dbgi_key = ctrl_dbgi_key_from_module(module);\r\n            U64 thread_rip_voff = ctrl_voff_from_vaddr(module, thread_rip_vaddr);\r\n            \r\n            // rjf: thread info => color\r\n            Vec4F32 color = rd_color_from_ctrl_entity(thread);\r\n            {\r\n              if(color.w == 0)\r\n              {\r\n                color = ui_color_from_name(str8_lit(\"thread_1\"));\r\n              }\r\n              if(unwind_count != 0)\r\n              {\r\n                color = ui_color_from_name(str8_lit(\"thread_unwound\"));\r\n              }\r\n              else if(thread == stopper_thread &&\r\n                      (stop_event.cause == CTRL_EventCause_InterruptedByHalt ||\r\n                       stop_event.cause == CTRL_EventCause_InterruptedByTrap ||\r\n                       stop_event.cause == CTRL_EventCause_InterruptedByException))\r\n              {\r\n                color = ui_color_from_name(str8_lit(\"thread_error\"));\r\n              }\r\n              if(d_ctrl_targets_running() && d_ctrl_last_run_frame_idx() < d_frame_index())\r\n              {\r\n                color.w *= 0.5f;\r\n              }\r\n              if(thread != selected_thread)\r\n              {\r\n                color.w *= 0.8f;\r\n              }\r\n            }\r\n            \r\n            // rjf: build thread box\r\n            ui_set_next_hover_cursor(OS_Cursor_UpDownLeftRight);\r\n            ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons));\r\n            ui_set_next_font_size(params->font_size);\r\n            ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);\r\n            ui_set_next_pref_width(ui_pct(1, 0));\r\n            ui_set_next_pref_height(ui_pct(1, 0));\r\n            ui_set_next_text_alignment(UI_TextAlign_Center);\r\n            ui_set_next_text_color(color);\r\n            UI_Key thread_box_key = ui_key_from_stringf(top_container_box->key, \"###ip_%I64x_catchall_%p\", line_num, thread);\r\n            UI_Box *thread_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc|\r\n                                                       UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|\r\n                                                       UI_BoxFlag_DrawText,\r\n                                                       thread_box_key);\r\n            ui_box_equip_display_string(thread_box, rd_icon_kind_text_table[RD_IconKind_RightArrow]);\r\n            UI_Signal thread_sig = ui_signal_from_box(thread_box);\r\n            \r\n            // rjf: custom draw\r\n            {\r\n              RD_Regs *hover_regs = rd_get_hover_regs();\r\n              B32 is_hovering = (ctrl_handle_match(hover_regs->ctrl_entity, thread->handle) &&\r\n                                 rd_state->hover_regs_slot == RD_RegSlot_CtrlEntity);\r\n              RD_ThreadBoxDrawExtData *u = push_array(ui_build_arena(), RD_ThreadBoxDrawExtData, 1);\r\n              u->thread_color = color;\r\n              u->alive_t      = ui_anim(ui_key_from_stringf(top_container_box->key, \"###entity_alive_t_%p\", thread), 1.f, .rate = entity_alive_t_rate);\r\n              u->hover_t      = ui_anim(ui_key_from_stringf(top_container_box->key, \"###entity_hover_t_%p\", thread), (F32)!!is_hovering, .rate = entity_hover_t_rate);\r\n              u->is_selected  = (thread == selected_thread);\r\n              u->is_frozen    = !!thread->is_frozen;\r\n              ui_box_equip_custom_draw(thread_box, rd_thread_box_draw_extensions, u);\r\n              \r\n              // rjf: fill out progress t (progress into range of current line's\r\n              // voff range)\r\n              if(params->line_vaddrs[line_idx] == 0 && params->line_infos[line_idx].first != 0)\r\n              {\r\n                D_LineList *lines = &params->line_infos[line_idx];\r\n                D_Line *line = 0;\r\n                for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n                {\r\n                  if(di_key_match(n->v.dbgi_key, dbgi_key))\r\n                  {\r\n                    line = &n->v;\r\n                    break;\r\n                  }\r\n                }\r\n                if(line != 0)\r\n                {\r\n                  Rng1U64 line_voff_rng = line->voff_range;\r\n                  Vec4F32 weak_thread_color = color;\r\n                  weak_thread_color.w *= 0.4f;\r\n                  F32 progress_t = (line_voff_rng.max != line_voff_rng.min) ? ((F32)(thread_rip_voff - line_voff_rng.min) / (F32)(line_voff_rng.max - line_voff_rng.min)) : 0;\r\n                  progress_t = Clamp(0, progress_t, 1);\r\n                  u->progress_t = progress_t;\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: interactions\r\n            if(ui_hovering(thread_sig) && !rd_drag_is_active())\r\n            {\r\n              RD_RegsScope(.ctrl_entity = thread->handle) rd_set_hover_regs(RD_RegSlot_CtrlEntity);\r\n            }\r\n            if(ui_right_clicked(thread_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_PushQuery,\r\n                     .ui_key = thread_box->key,\r\n                     .expr   = push_str8f(scratch.arena, \"query:control.%S\", ctrl_string_from_handle(scratch.arena, thread->handle)));\r\n            }\r\n            if(ui_dragging(thread_sig) && !contains_2f32(thread_box->rect, ui_mouse()))\r\n            {\r\n              RD_RegsScope(.thread = thread->handle) rd_drag_begin(RD_RegSlot_Thread);\r\n            }\r\n            if(ui_double_clicked(thread_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_SelectThread, .thread = thread->handle);\r\n              ui_kill_action();\r\n            }\r\n          }\r\n          \r\n          //- rjf: build margin breakpoint ui\r\n          for(CFG_NodePtrNode *n = line_bps.first; n != 0; n = n->next)\r\n          {\r\n            CFG_Node *bp = n->v;\r\n            Vec4F32 bp_rgba = rd_color_from_cfg(bp);\r\n            if(bp_rgba.w == 0)\r\n            {\r\n              bp_rgba = ui_color_from_name(str8_lit(\"breakpoint\"));\r\n            }\r\n            B32 bp_is_disabled = rd_disabled_from_cfg(bp);\r\n            if(bp_is_disabled)\r\n            {\r\n              bp_rgba = v4f32(bp_rgba.x*0.45f, bp_rgba.y*0.45f, bp_rgba.z*0.45f, bp_rgba.w*0.45f);\r\n            }\r\n            \r\n            // rjf: prep custom rendering data\r\n            RD_BreakpointBoxDrawExtData *bp_draw = push_array(ui_build_arena(), RD_BreakpointBoxDrawExtData, 1);\r\n            {\r\n              RD_Regs *hover_regs = rd_get_hover_regs();\r\n              B32 is_hovering = (cfg_node_from_id(hover_regs->cfg) == bp && rd_state->hover_regs_slot == RD_RegSlot_Cfg);\r\n              bp_draw->color    = bp_rgba;\r\n              bp_draw->alive_t  = ui_anim(ui_key_from_stringf(ui_key_zero(), \"cfg_alive_t_%p\", bp), 1.f, .rate = entity_alive_t_rate);\r\n              bp_draw->hover_t  = ui_anim(ui_key_from_stringf(ui_key_zero(), \"cfg_hover_t_%p\", bp), (F32)!!is_hovering, .rate = entity_hover_t_rate);\r\n              bp_draw->do_lines = do_bp_lines;\r\n              bp_draw->do_glow  = do_bp_glow;\r\n              bp_draw->is_disabled = bp_is_disabled;\r\n              bp_draw->is_conditioned = (cfg_node_child_from_string(bp, str8_lit(\"condition\"))->first->string.size != 0);\r\n              if(params->line_vaddrs[line_idx] == 0)\r\n              {\r\n                D_LineList *lines = &params->line_infos[line_idx];\r\n                for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n                {\r\n                  S64 remap_line = n->v.pt.line;\r\n                  if(remap_line != line_num)\r\n                  {\r\n                    bp_draw->remap_px_delta = (remap_line - line_num) * params->line_height_px;\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: build box for breakpoint\r\n            ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons));\r\n            ui_set_next_font_size(params->font_size * 1.f);\r\n            ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);\r\n            ui_set_next_text_alignment(UI_TextAlign_Center);\r\n            ui_set_next_text_color(bp_rgba);\r\n            UI_Box *bp_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                                       UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|\r\n                                                       UI_BoxFlag_DisableTextTrunc,\r\n                                                       \"%S##bp_%p\",\r\n                                                       rd_icon_kind_text_table[RD_IconKind_CircleFilled],\r\n                                                       bp);\r\n            ui_box_equip_custom_draw(bp_box, rd_bp_box_draw_extensions, bp_draw);\r\n            UI_Signal bp_sig = ui_signal_from_box(bp_box);\r\n            \r\n            // rjf: bp hovering\r\n            if(ui_hovering(bp_sig) && !rd_drag_is_active())\r\n            {\r\n              RD_RegsScope(.cfg = bp->id) rd_set_hover_regs(RD_RegSlot_Cfg);\r\n            }\r\n            \r\n            // rjf: bp right-click => open query\r\n            if(ui_right_clicked(bp_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_PushQuery,\r\n                     .ui_key = bp_box->key,\r\n                     .expr = push_str8f(scratch.arena, \"query:config.$%I64x\", bp->id));\r\n            }\r\n            \r\n            // rjf: shift+click => enable breakpoint\r\n            if(ui_clicked(bp_sig) && bp_sig.event_flags & OS_Modifier_Shift)\r\n            {\r\n              rd_cmd(bp_is_disabled ? RD_CmdKind_EnableCfg : RD_CmdKind_DisableCfg, .cfg = bp->id);\r\n            }\r\n            \r\n            // rjf: click => remove breakpoint\r\n            if(ui_clicked(bp_sig) && bp_sig.event_flags == 0)\r\n            {\r\n              rd_cmd(RD_CmdKind_RemoveCfg, .cfg = bp->id);\r\n            }\r\n            \r\n            // rjf: drag start\r\n            if(ui_dragging(bp_sig) && !contains_2f32(bp_box->rect, ui_mouse()))\r\n            {\r\n              RD_RegsScope(.cfg = bp->id) rd_drag_begin(RD_RegSlot_Cfg);\r\n            }\r\n          }\r\n          \r\n          //- rjf: build margin watch pin ui\r\n          for(CFG_NodePtrNode *n = line_pins.first; n != 0; n = n->next)\r\n          {\r\n            CFG_Node *pin = n->v;\r\n            Vec4F32 color = rd_color_from_cfg(pin);\r\n            if(color.w == 0)\r\n            {\r\n              color = ui_color_from_name(str8_lit(\"code_default\"));\r\n            }\r\n            \r\n            // rjf: build box for watch\r\n            ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons));\r\n            ui_set_next_font_size(params->font_size * 1.f);\r\n            ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);\r\n            ui_set_next_text_alignment(UI_TextAlign_Center);\r\n            ui_set_next_text_color(color);\r\n            UI_Box *pin_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                                        UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|\r\n                                                        UI_BoxFlag_DisableTextTrunc,\r\n                                                        \"%S##watch_%p\",\r\n                                                        rd_icon_kind_text_table[RD_IconKind_Pin],\r\n                                                        pin);\r\n            UI_Signal pin_sig = ui_signal_from_box(pin_box);\r\n            \r\n            // rjf: watch hovering\r\n            if(ui_hovering(pin_sig) && !rd_drag_is_active())\r\n            {\r\n              RD_RegsScope(.cfg = pin->id) rd_set_hover_regs(RD_RegSlot_Cfg);\r\n            }\r\n            \r\n            // rjf: pin right-click => open query\r\n            if(ui_right_clicked(pin_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_PushQuery,\r\n                     .ui_key = pin_box->key,\r\n                     .expr = push_str8f(scratch.arena, \"query:config.$%I64x\", pin->id));\r\n            }\r\n            \r\n            // rjf: click => remove pin\r\n            if(ui_clicked(pin_sig))\r\n            {\r\n              rd_cmd(RD_CmdKind_RemoveCfg, .cfg = pin->id);\r\n            }\r\n            \r\n            // rjf: drag start\r\n            if(ui_dragging(pin_sig) && !contains_2f32(pin_box->rect, ui_mouse()))\r\n            {\r\n              RD_RegsScope(.cfg = pin->id) rd_drag_begin(RD_RegSlot_Cfg);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: empty margin interaction\r\n        UI_Signal line_margin_sig = ui_signal_from_box(line_margin_box);\r\n        if(ui_clicked(line_margin_sig))\r\n        {\r\n          rd_cmd(RD_CmdKind_AddBreakpoint,\r\n                 .file_path  = params->line_vaddrs[line_idx] ? str8_zero() : rd_regs()->file_path,\r\n                 .cursor     = params->line_vaddrs[line_idx] ? txt_pt(0, 0) : txt_pt(line_num, 1),\r\n                 .vaddr      = params->line_vaddrs[line_idx]);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build line numbers\r\n  //\r\n  if(params->flags & RD_CodeSliceFlag_LineNums) UI_Parent(top_container_box) ProfScope(\"build line numbers\") UI_Focus(UI_FocusKind_Off)\r\n    UI_TagF(\"floating\")\r\n  {\r\n    TxtRng select_rng = txt_rng(*cursor, *mark);\r\n    ui_set_next_fixed_x(floor_f32(params->margin_float_off_px + params->priority_margin_width_px + params->catchall_margin_width_px));\r\n    ui_set_next_pref_width(ui_px(params->line_num_width_px, 1.f));\r\n    ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n    ui_set_next_flags(UI_BoxFlag_DrawSideRight);\r\n    UI_Column\r\n      UI_PrefHeight(ui_px(params->line_height_px, 1.f))\r\n      RD_Font(RD_FontSlot_Code)\r\n      UI_FontSize(params->font_size)\r\n      UI_CornerRadius(0)\r\n    {\r\n      U64 line_idx = 0;\r\n      for(S64 line_num = params->line_num_range.min;\r\n          line_num <= params->line_num_range.max;\r\n          line_num += 1, line_idx += 1)\r\n      {\r\n        B32 line_is_selected = (select_rng.min.line <= line_num && line_num <= select_rng.max.line);\r\n        Vec4F32 bg_color = v4f32(0, 0, 0, 0);\r\n        \r\n        // rjf: line info on this line -> adjust bg color to visualize\r\n        B32 has_line_info = 0;\r\n        {\r\n          S64 line_info_line_num = 0;\r\n          F32 line_info_t = 0;\r\n          D_LineList *lines = &params->line_infos[line_idx];\r\n          for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n          {\r\n            has_line_info = (has_line_info || n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0);\r\n            line_info_line_num = n->v.pt.line;\r\n            line_info_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"dbgi_alive_t_%I64x_%I64x\", n->v.dbgi_key.u64[0], n->v.dbgi_key.u64[1]), 1.f);\r\n          }\r\n          if(has_line_info)\r\n          {\r\n            Vec4F32 color = code_line_bgs[line_info_line_num % ArrayCount(code_line_bgs)];\r\n            color.w *= line_info_t;\r\n            bg_color = color;\r\n          }\r\n        }\r\n        \r\n        // rjf: build line num box\r\n        UI_TagF(line_is_selected ? \"\" : \"weak\") UI_BackgroundColor(bg_color)\r\n          ui_build_box_from_stringf(UI_BoxFlag_DrawText|(UI_BoxFlag_DrawBackground*!!has_line_info), \"%I64u##line_num\", line_num);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build background for line numbers & margins\r\n  //\r\n  {\r\n    UI_Parent(top_container_box) UI_TagF(\"floating\")\r\n    {\r\n      ui_set_next_pref_width(ui_px(params->priority_margin_width_px + params->catchall_margin_width_px + params->line_num_width_px, 1));\r\n      ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n      ui_set_next_fixed_x(floor_f32(params->margin_float_off_px));\r\n      ui_build_box_from_key(UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero());\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build main text container box, for mouse interaction on both lines & line numbers\r\n  //\r\n  UI_Box *text_container_box = &ui_nil_box;\r\n  UI_Parent(top_container_box) UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    ui_set_next_hover_cursor(ctrlified ? OS_Cursor_HandPoint : OS_Cursor_IBar);\r\n    ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n    text_container_box = ui_build_box_from_string(UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable), str8_lit(\"text_container\"));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse -> text coordinates\r\n  //\r\n  TxtPt mouse_pt = {0};\r\n  ProfScope(\"mouse -> text coordinates\")\r\n  {\r\n    Vec2F32 mouse = ui_mouse();\r\n    \r\n    // rjf: mouse y => index\r\n    U64 mouse_y_line_idx = (U64)((mouse.y - text_container_box->rect.y0) / params->line_height_px);\r\n    \r\n    // rjf: index => line num\r\n    S64 line_num = (params->line_num_range.min + mouse_y_line_idx);\r\n    String8 line_string = (params->line_num_range.min <= line_num && line_num <= params->line_num_range.max) ? (params->line_text[mouse_y_line_idx]) : str8_zero();\r\n    \r\n    // rjf: mouse x * string => column\r\n    S64 column = fnt_char_pos_from_tag_size_string_p(params->font, params->font_size, 0, params->tab_size, line_string, mouse.x-text_container_box->rect.x0-params->line_num_width_px-line_num_padding_px)+1;\r\n    \r\n    // rjf: bundle\r\n    mouse_pt = txt_pt(line_num, column);\r\n    \r\n    // rjf: clamp\r\n    {\r\n      U64 last_line_size = params->line_text[dim_1s64(params->line_num_range)].size;\r\n      TxtRng legal_pt_rng = txt_rng(txt_pt(params->line_num_range.min, 1),\r\n                                    txt_pt(params->line_num_range.max, last_line_size+1));\r\n      if(txt_pt_less_than(mouse_pt, legal_pt_rng.min))\r\n      {\r\n        mouse_pt = legal_pt_rng.min;\r\n      }\r\n      if(txt_pt_less_than(legal_pt_rng.max, mouse_pt))\r\n      {\r\n        mouse_pt = legal_pt_rng.max;\r\n      }\r\n    }\r\n    \r\n    result.mouse_pt = mouse_pt;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse point -> mouse token range, mouse line range\r\n  //\r\n  TxtRng mouse_token_rng = txt_rng(mouse_pt, mouse_pt);\r\n  TxtRng mouse_line_rng = txt_rng(mouse_pt, mouse_pt);\r\n  if(contains_1s64(params->line_num_range, mouse_pt.line))\r\n  {\r\n    TXT_TokenArray *line_tokens = &params->line_tokens[mouse_pt.line-params->line_num_range.min];\r\n    Rng1U64 line_range = params->line_ranges[mouse_pt.line-params->line_num_range.min];\r\n    U64 mouse_pt_off = (mouse_pt.column-1) + line_range.min;\r\n    for(U64 line_token_idx = 0; line_token_idx < line_tokens->count; line_token_idx += 1)\r\n    {\r\n      TXT_Token *line_token = &line_tokens->v[line_token_idx];\r\n      if(contains_1u64(line_token->range, mouse_pt_off))\r\n      {\r\n        Rng1U64 line_token_range_clamped = intersect_1u64(line_token->range, line_range);\r\n        mouse_token_rng = txt_rng(txt_pt(mouse_pt.line, 1+line_token_range_clamped.min-line_range.min), txt_pt(mouse_pt.line, 1+line_token_range_clamped.max-line_range.min));\r\n        break;\r\n      }\r\n    }\r\n    mouse_line_rng = txt_rng(txt_pt(mouse_pt.line, 1), txt_pt(mouse_pt.line, 1+(line_range.max-line_range.min)));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine starting offset for each at line, at which we can begin placing extra info to the right\r\n  //\r\n  F32 *line_extras_off = push_array(scratch.arena, F32, dim_1s64(params->line_num_range)+1);\r\n  {\r\n    U64 line_idx = 0;\r\n    for(S64 line_num = params->line_num_range.min;\r\n        line_num <= params->line_num_range.max;\r\n        line_num += 1, line_idx += 1)\r\n    {\r\n      F32 line_text_dim = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, params->line_text[line_idx]).x + params->line_num_width_px + params->catchall_margin_width_px + params->priority_margin_width_px;\r\n      line_extras_off[line_idx] = Max(line_text_dim, params->font_size*30);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: produce per-line extra annotation containers\r\n  //\r\n  UI_Box **line_extras_boxes = push_array(scratch.arena, UI_Box *, dim_1s64(params->line_num_range)+1);\r\n  UI_PrefWidth(ui_children_sum(1)) UI_PrefHeight(ui_px(params->line_height_px, 1.f)) UI_Parent(text_container_box) UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    U64 line_idx = 0;\r\n    for(S64 line_num = params->line_num_range.min;\r\n        line_num < params->line_num_range.max;\r\n        line_num += 1, line_idx += 1)\r\n    {\r\n      ui_set_next_fixed_x(line_extras_off[line_idx]);\r\n      ui_set_next_fixed_y(line_idx*params->line_height_px);\r\n      line_extras_boxes[line_idx] = ui_build_box_from_stringf(0, \"###extras_%I64x\", line_idx);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build watch pin annotations\r\n  //\r\n  UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    U64 line_idx = 0;\r\n    for(S64 line_num = params->line_num_range.min;\r\n        line_num < params->line_num_range.max;\r\n        line_num += 1, line_idx += 1)\r\n    {\r\n      CFG_NodePtrList immediate_pins = {0};\r\n      String8 line_text = params->line_text[line_idx];\r\n      for(U64 off = 0, next_off = line_text.size;\r\n          off < line_text.size;\r\n          off = next_off)\r\n      {\r\n        // rjf: find next opener\r\n        String8 markup_opener = str8_lit(\"raddbg_pin(\");\r\n        next_off = str8_find_needle(line_text, off, markup_opener, 0);\r\n        next_off += markup_opener.size;\r\n        \r\n        // rjf: extract contents of markup\r\n        String8 contents = {0};\r\n        S32 nest = 1;\r\n        for(U64 off2 = next_off; off2 < line_text.size; off2 += 1)\r\n        {\r\n          if(line_text.str[off2] == '(')\r\n          {\r\n            nest += 1;\r\n          }\r\n          else if(line_text.str[off2] == ')')\r\n          {\r\n            nest -= 1;\r\n            if(nest == 0)\r\n            {\r\n              contents = str8_substr(line_text, r1u64(next_off, off2));\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: gather arguments\r\n        String8List args = {0};\r\n        {\r\n          S32 nest = 0;\r\n          U64 arg_start_off = 0;\r\n          for(U64 contents_off = 0; contents_off <= contents.size; contents_off += 1)\r\n          {\r\n            if(nest == 0 && (contents_off == contents.size || contents.str[contents_off] == ','))\r\n            {\r\n              String8 arg = str8_substr(contents, r1u64(arg_start_off, contents_off));\r\n              arg = str8_skip_chop_whitespace(arg);\r\n              str8_list_push(scratch.arena, &args, arg);\r\n              arg_start_off = contents_off+1;\r\n            }\r\n            if(contents_off < contents.size)\r\n            {\r\n              if(contents.str[contents_off] == '(')\r\n              {\r\n                nest += 1;\r\n              }\r\n              else if(contents.str[contents_off] == ')')\r\n              {\r\n                nest -= 1;\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: extract fixed arguments\r\n        String8 expr_string = {0};\r\n        if(args.first != 0)\r\n        {\r\n          expr_string = args.first->string;\r\n        }\r\n        \r\n        // rjf: build immediate pin for this markup\r\n        if(expr_string.size != 0)\r\n        {\r\n          CFG_Node *immediate_root = rd_immediate_cfg_from_keyf(\"markup_pin_%I64x_%I64x\", line_num, off);\r\n          CFG_Node *pin = cfg_node_child_from_string_or_alloc(rd_state->cfg, immediate_root, str8_lit(\"watch_pin\"));\r\n          CFG_Node *expr = cfg_node_child_from_string_or_alloc(rd_state->cfg, pin, str8_lit(\"expression\"));\r\n          cfg_node_new_replace(rd_state->cfg, expr, expr_string);\r\n          cfg_node_ptr_list_push(scratch.arena, &immediate_pins, pin);\r\n        }\r\n      }\r\n      CFG_NodePtrList pin_lists[] =\r\n      {\r\n        params->line_pins[line_idx],\r\n        immediate_pins,\r\n      };\r\n      E_ParentKey(e_key_zero()) for EachElement(list_idx, pin_lists)\r\n      {\r\n        CFG_NodePtrList pins = pin_lists[list_idx];\r\n        if(pins.count != 0) UI_Parent(line_extras_boxes[line_idx])\r\n          RD_Font(RD_FontSlot_Code)\r\n          UI_FontSize(params->font_size)\r\n          UI_PrefHeight(ui_px(params->line_height_px, 1.f))\r\n        {\r\n          for(CFG_NodePtrNode *n = pins.first; n != 0; n = n->next)\r\n          {\r\n            CFG_Node *pin = n->v;\r\n            String8 pin_expr = rd_expr_from_cfg(pin);\r\n            E_Eval eval = e_eval_from_string(pin_expr);\r\n            String8 eval_string = {0};\r\n            if(!e_type_key_match(e_type_key_zero(), eval.irtree.type_key))\r\n            {\r\n              EV_StringParams string_params = {.flags = EV_StringFlag_ReadOnlyDisplayRules, .radix = 10};\r\n              eval_string = rd_value_string_from_eval(scratch.arena, str8_zero(), &string_params, params->font, params->font_size, params->font_size*60.f, eval);\r\n            }\r\n            ui_spacer(ui_em(1.5f, 1.f));\r\n            ui_set_next_pref_width(ui_children_sum(1));\r\n            UI_Key pin_box_key = ui_key_from_stringf(ui_key_zero(), \"###pin_%p\", pin);\r\n            UI_Box *pin_box = ui_build_box_from_key(UI_BoxFlag_AnimatePos|\r\n                                                    UI_BoxFlag_Clickable*!!(params->flags & RD_CodeSliceFlag_Clickable)|\r\n                                                    UI_BoxFlag_DrawHotEffects|\r\n                                                    UI_BoxFlag_DrawBorder, pin_box_key);\r\n            UI_Parent(pin_box) UI_PrefWidth(ui_text_dim(10, 1))\r\n            {\r\n              Vec4F32 pin_color = rd_color_from_cfg(pin);\r\n              if(pin_color.w == 0)\r\n              {\r\n                pin_color = ui_color_from_name(str8_lit(\"text\"));\r\n              }\r\n              Vec4F32 default_code_color = ui_color_from_name(str8_lit(\"code_default\"));\r\n              rd_code_label(0.8f, 1, default_code_color, pin_expr);\r\n              rd_code_label(0.6f, 1, default_code_color, eval_string);\r\n            }\r\n            UI_Signal pin_sig = ui_signal_from_box(pin_box);\r\n            if(ui_key_match(pin_box_key, ui_hot_key()))\r\n            {\r\n              rd_set_hover_eval(v2f32(pin_box->rect.x0, pin_box->rect.y1-2.f), pin_expr);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: interact with margin box & text box\r\n  //\r\n  B32 search_query_invalidated = 0;\r\n  UI_Signal priority_margin_container_sig = ui_signal_from_box(priority_margin_container_box);\r\n  UI_Signal catchall_margin_container_sig = ui_signal_from_box(catchall_margin_container_box);\r\n  UI_Signal text_container_sig = ui_signal_from_box(text_container_box);\r\n  {\r\n    //- rjf: determine mouse drag range\r\n    TxtRng mouse_drag_rng = txt_rng(mouse_pt, mouse_pt);\r\n    if(text_container_sig.f & UI_SignalFlag_LeftTripleDragging)\r\n    {\r\n      mouse_drag_rng = mouse_line_rng;\r\n    }\r\n    else if(text_container_sig.f & UI_SignalFlag_LeftDoubleDragging)\r\n    {\r\n      mouse_drag_rng = mouse_token_rng;\r\n    }\r\n    \r\n    //- rjf: clicking/dragging over the text container\r\n    if(!ctrlified && ui_dragging(text_container_sig))\r\n    {\r\n      if(mouse_pt.line == 0)\r\n      {\r\n        mouse_pt.column = 1;\r\n        if(ui_mouse().y <= top_container_box->rect.y0)\r\n        {\r\n          mouse_pt.line = params->line_num_range.min - 2;\r\n        }\r\n        else if(ui_mouse().y >= top_container_box->rect.y1)\r\n        {\r\n          mouse_pt.line = params->line_num_range.max + 2;\r\n        }\r\n      }\r\n      if(ui_pressed(text_container_sig))\r\n      {\r\n        *cursor = mouse_drag_rng.max;\r\n        *mark = mouse_drag_rng.min;\r\n      }\r\n      if(txt_pt_less_than(mouse_pt, *mark))\r\n      {\r\n        *cursor = mouse_drag_rng.min;\r\n      }\r\n      else\r\n      {\r\n        *cursor = mouse_drag_rng.max;\r\n      }\r\n      *preferred_column = cursor->column;\r\n    }\r\n    \r\n    //- rjf: dragging will invalidate the search string, so we don't want to draw it while dragging/releasing\r\n    if(ui_dragging(text_container_sig) || ui_released(text_container_sig))\r\n    {\r\n      search_query_invalidated = 1;\r\n    }\r\n    \r\n    //- rjf: right-click => code context menu\r\n    if(ui_right_clicked(text_container_sig))\r\n    {\r\n      if(txt_pt_match(*cursor, *mark))\r\n      {\r\n        *cursor = *mark = mouse_pt;\r\n      }\r\n      U64 vaddr = 0;\r\n      D_LineList lines = {0};\r\n      if(params->line_num_range.min <= cursor->line && cursor->line < params->line_num_range.max)\r\n      {\r\n        vaddr = params->line_vaddrs[cursor->line - params->line_num_range.min];\r\n        lines = params->line_infos[cursor->line - params->line_num_range.min];\r\n      }\r\n      rd_cmd(RD_CmdKind_FocusPanel);\r\n      rd_cmd(RD_CmdKind_PushQuery,\r\n             .expr = txt_pt_match(*cursor, *mark) ? str8_lit(\"query:text_pt_commands\") : str8_lit(\"query:text_range_commands\"),\r\n             .do_implicit_root = 1,\r\n             .do_lister = 1,\r\n             .ui_key = ui_get_selected_state()->root->key,\r\n             .off_px = ui_mouse(),\r\n             .cursor = *cursor,\r\n             .mark = *mark,\r\n             .vaddr = vaddr,\r\n             .lines = lines);\r\n    }\r\n    \r\n    //- rjf: drop target is dropped -> process\r\n    if(drop_can_hit_lines && ui_key_match(ui_drop_hot_key(), drop_site_key) && rd_drag_drop())\r\n    {\r\n      if(rd_state->drag_drop_regs_slot == RD_RegSlot_Expr)\r\n      {\r\n        S64 line_num = mouse_pt.line;\r\n        U64 line_idx = line_num - params->line_num_range.min;\r\n        U64 line_vaddr = params->line_vaddrs[line_idx];\r\n        rd_cmd(RD_CmdKind_AddWatchPin,\r\n               .expr       = rd_state->drag_drop_regs->expr,\r\n               .file_path  = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(),\r\n               .cursor     = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0),\r\n               .vaddr      = line_vaddr);\r\n      }\r\n      if(rd_state->drag_drop_regs_slot == RD_RegSlot_Cfg && drop_cfg != &cfg_nil_node)\r\n      {\r\n        S64 line_num = mouse_pt.line;\r\n        U64 line_idx = line_num - params->line_num_range.min;\r\n        U64 line_vaddr = params->line_vaddrs[line_idx];\r\n        rd_cmd(RD_CmdKind_RelocateCfg,\r\n               .cfg        = drop_cfg->id,\r\n               .file_path  = line_vaddr == 0 ? rd_regs()->file_path : str8_zero(),\r\n               .cursor     = line_vaddr == 0 ? txt_pt(line_num, 1) : txt_pt(0, 0),\r\n               .vaddr      = line_vaddr);\r\n      }\r\n      if(drop_thread != &ctrl_entity_nil)\r\n      {\r\n        S64 line_num = mouse_pt.line;\r\n        U64 line_idx = line_num - params->line_num_range.min;\r\n        U64 line_vaddr = params->line_vaddrs[line_idx];\r\n        CTRL_Entity *thread = drop_thread;\r\n        U64 new_rip_vaddr = line_vaddr;\r\n        if(params->line_vaddrs[line_idx] == 0)\r\n        {\r\n          D_LineList *lines = &params->line_infos[line_idx];\r\n          for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n          {\r\n            CTRL_EntityList modules = ctrl_modules_from_dbgi_key(scratch.arena, &d_state->ctrl_entity_store->ctx, n->v.dbgi_key);\r\n            CTRL_Entity *module = ctrl_module_from_thread_candidates(&d_state->ctrl_entity_store->ctx, thread, &modules);\r\n            if(module != &ctrl_entity_nil)\r\n            {\r\n              new_rip_vaddr = ctrl_vaddr_from_voff(module, n->v.voff_range.min);\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        rd_cmd(RD_CmdKind_SetThreadIP, .thread = thread->handle, .vaddr = new_rip_vaddr);\r\n      }\r\n    }\r\n    \r\n    //- rjf: commit text container signal to main output\r\n    result.base = text_container_sig;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: cursor -> scope info\r\n  //\r\n  TXT_ScopeNode *cursor_scope_node = &txt_scope_node_nil;\r\n  if(params->text_info != 0)\r\n  {\r\n    cursor_scope_node = txt_scope_node_from_info_pt(params->text_info, rd_regs()->cursor);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: produce fancy strings for each line\r\n  //\r\n  DR_FStrList *lines_fstrs = push_array(scratch.arena, DR_FStrList, dim_1s64(params->line_num_range)+1);\r\n  {\r\n    DR_FStrParams fstr_params =\r\n    {\r\n      params->font,\r\n      rd_raster_flags_from_slot(RD_FontSlot_Code),\r\n      rd_rgba_from_code_color_slot(RD_CodeColorSlot_CodeDefault),\r\n      params->font_size,\r\n    };\r\n    U64 line_idx = 0;\r\n    for(S64 line_num = params->line_num_range.min;\r\n        line_num <= params->line_num_range.max;\r\n        line_num += 1, line_idx += 1)\r\n    {\r\n      String8 line_string = params->line_text[line_idx];\r\n      Rng1U64 line_range = params->line_ranges[line_idx];\r\n      TXT_TokenArray *line_tokens = &params->line_tokens[line_idx];\r\n      DR_FStrList fstrs = {0};\r\n      if(line_tokens->count == 0)\r\n      {\r\n        dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, line_string);\r\n      }\r\n      else\r\n      {\r\n        TXT_Token *line_tokens_first = line_tokens->v;\r\n        TXT_Token *line_tokens_opl = line_tokens->v + line_tokens->count;\r\n        for(TXT_Token *token = line_tokens_first; token < line_tokens_opl; token += 1)\r\n        {\r\n          // rjf: token -> token string\r\n          String8 token_string = {0};\r\n          {\r\n            Rng1U64 token_range = r1u64(0, line_string.size);\r\n            if(token->range.min > line_range.min)\r\n            {\r\n              token_range.min += token->range.min-line_range.min;\r\n            }\r\n            if(token->range.max < line_range.max)\r\n            {\r\n              token_range.max = token->range.max-line_range.min;\r\n            }\r\n            token_string = str8_substr(line_string, token_range);\r\n          }\r\n          \r\n          // rjf: token -> token color\r\n          RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind);\r\n          RD_CodeColorSlot lookup_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string);\r\n          Vec4F32 token_color = rd_rgba_from_code_color_slot(token_color_slot);\r\n          if(lookup_color_slot != RD_CodeColorSlot_CodeDefault)\r\n          {\r\n            Vec4F32 lookup_color = rd_rgba_from_code_color_slot(lookup_color_slot);\r\n            F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"%S_lookup\", token_string), 1.f);\r\n            token_color = mix_4f32(token_color, lookup_color, lookup_color_mix_t);\r\n          }\r\n          \r\n          // rjf: scope endpoints enclosing cursor -> highlight\r\n          for(TXT_ScopeNode *scope_n = cursor_scope_node;\r\n              scope_n != &txt_scope_node_nil;\r\n              scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num))\r\n          {\r\n            if(params->text_info->tokens.v[scope_n->token_idx_range.min].range.min == token->range.min ||\r\n               params->text_info->tokens.v[scope_n->token_idx_range.max].range.min == token->range.min)\r\n            {\r\n              token_color = highlight_color;\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: push fancy string\r\n          dr_fstrs_push_new(scratch.arena, &fstrs, &fstr_params, token_string, .color = token_color);\r\n        }\r\n      }\r\n      lines_fstrs[line_idx] = fstrs;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: equip cursor scope rendering info\r\n  //\r\n  if(do_scope_lines && cursor_scope_node != &txt_scope_node_nil)\r\n  {\r\n    F32 scope_line_thickness = params->font_size*0.1f;\r\n    scope_line_thickness = Max(scope_line_thickness, 1.f);\r\n    DR_Bucket *bucket = dr_bucket_make();\r\n    DR_BucketScope(bucket)\r\n    {\r\n      Vec2F32 text_base_pos = v2f32(text_container_box->rect.x0 + params->line_num_width_px + line_num_padding_px,\r\n                                    text_container_box->rect.y0);\r\n      F32 ancestor_chain_depth = 0;\r\n      for(TXT_ScopeNode *scope_n = cursor_scope_node;\r\n          scope_n != &txt_scope_node_nil;\r\n          scope_n = txt_scope_node_from_info_num(params->text_info, scope_n->parent_num), ancestor_chain_depth += 1)\r\n      {\r\n        Vec4F32 scope_line_color = highlight_color;\r\n        F32 scope_line_color_target = highlight_color.w;\r\n        scope_line_color_target *= 1 - ancestor_chain_depth / 6.f;\r\n        scope_line_color_target = Max(0.2f, scope_line_color_target);\r\n        F32 scope_line_color_t = ui_anim(ui_key_from_stringf(text_container_box->key, \"###scope_depth_%I64x_%I64x\", scope_n->token_idx_range.min, scope_n->token_idx_range.max), scope_line_color_target, .rate = rd_state->menu_animation_rate__slow);\r\n        scope_line_color.w = scope_line_color_t*0.5f;\r\n        Rng1U64 token_idx_range = scope_n->token_idx_range;\r\n        Rng1U64 off_range = r1u64(params->text_info->tokens.v[token_idx_range.min].range.min, params->text_info->tokens.v[token_idx_range.max].range.min);\r\n        TxtRng txt_range = txt_rng(txt_pt_from_info_off__linear_scan(params->text_info, off_range.min), txt_pt_from_info_off__linear_scan(params->text_info, off_range.max));\r\n        \r\n        //- rjf: single-line scopes (underline)\r\n        if(txt_range.min.line == txt_range.max.line && contains_1s64(params->line_num_range, txt_range.min.line))\r\n        {\r\n          S64 line_num = txt_range.min.line;\r\n          U64 line_idx = (U64)(line_num - params->line_num_range.min);\r\n          String8 line_string = params->line_text[line_idx];\r\n          Rng1U64 line_off_range = r1u64(off_range.min - params->line_ranges[line_idx].min, off_range.max+1 - params->line_ranges[line_idx].min);\r\n          Rng1F32 x_px_range = r1f32(fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_string, line_off_range.min)).x,\r\n                                     fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_string, line_off_range.max)).x);\r\n          F32 line_y = line_idx*params->line_height_px;\r\n          Rng2F32 underline_rect = r2f32p(text_base_pos.x + x_px_range.min,\r\n                                          text_base_pos.y + line_y + params->line_height_px*0.5f,\r\n                                          text_base_pos.x + x_px_range.max+1,\r\n                                          text_base_pos.y + line_y + params->line_height_px + params->font_size*0.1f);\r\n          F32 midpoint = center_1f32(r1f32(underline_rect.x0, underline_rect.x1));\r\n          F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, \"###scope_%I64x_%I64x\", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate);\r\n          Rng2F32 underline_clip = {0};\r\n          underline_clip.x0 = mix_1f32(midpoint, underline_rect.x0 - params->font_size, t);\r\n          underline_clip.x1 = mix_1f32(midpoint, underline_rect.x1 + params->font_size, t);\r\n          underline_clip.y0 = underline_rect.y0 + (underline_rect.y1 - underline_rect.y0) * 0.65f;\r\n          underline_clip.y1 = 10000;\r\n          DR_ClipScope(underline_clip)\r\n          {\r\n            dr_rect(underline_rect, scope_line_color, params->font_size*0.1f, scope_line_thickness, 1.f);\r\n          }\r\n        }\r\n        \r\n        //- rjf: cross-line scopes\r\n        if(txt_range.min.line != txt_range.max.line && params->line_num_range.max > txt_range.min.line && params->line_num_range.min < txt_range.max.line)\r\n        {\r\n          String8 opener_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.min.line);\r\n          String8 closer_line = txt_string_from_info_data_line_num(params->text_info, params->text_data, txt_range.max.line);\r\n          String8 opener_line_pre_opener = str8_prefix(opener_line, txt_range.min.column-1);\r\n          String8 closer_line_pre_closer = str8_prefix(closer_line, txt_range.max.column-1);\r\n          F32 opener_line_pre_opener_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, opener_line_pre_opener).x;\r\n          F32 closer_line_pre_closer_px = fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, closer_line_pre_closer).x;\r\n          F32 indent_depth_px = Min(opener_line_pre_opener_px, closer_line_pre_closer_px);\r\n          Rng1F32 scope_range_y_px = r1f32(0, dim_2f32(text_container_box->rect).y);\r\n          if(contains_1s64(params->line_num_range, txt_range.min.line))\r\n          {\r\n            scope_range_y_px.min = (txt_range.min.line - params->line_num_range.min) * params->line_height_px;\r\n          }\r\n          if(contains_1s64(params->line_num_range, txt_range.max.line))\r\n          {\r\n            scope_range_y_px.max = ((txt_range.max.line - params->line_num_range.min) + 1) * params->line_height_px;\r\n          }\r\n          F32 midpoint = center_1f32(scope_range_y_px);\r\n          F32 t = ui_anim(ui_key_from_stringf(text_container_box->key, \"###scope_%I64x_%I64x\", scope_n->token_idx_range.min, scope_n->token_idx_range.max), 1.f, .rate = rd_state->catchall_animation_rate);\r\n          Rng2F32 scope_rect = r2f32p(text_base_pos.x + indent_depth_px - params->font_size*0.2f,\r\n                                      text_base_pos.y + scope_range_y_px.min,\r\n                                      text_base_pos.x + indent_depth_px - params->font_size*0.2f + params->font_size*1.f,\r\n                                      text_base_pos.y + scope_range_y_px.max);\r\n          Rng2F32 scope_clip_rect = {0};\r\n          {\r\n            scope_clip_rect.x0 = scope_rect.x0 - params->font_size*10.f;\r\n            scope_clip_rect.x1 = scope_rect.x0 + (scope_rect.x1 - scope_rect.x0)*0.4f;\r\n            scope_clip_rect.y0 = mix_1f32(midpoint, scope_rect.y0 - params->font_size*0.1f, t);\r\n            scope_clip_rect.y1 = mix_1f32(midpoint, scope_rect.y1 + params->font_size*0.1f, t);\r\n          }\r\n          DR_ClipScope(scope_clip_rect)\r\n          {\r\n            dr_rect(scope_rect, scope_line_color, params->font_size*0.1f, scope_line_thickness, 1.f);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    ui_box_equip_draw_bucket(text_container_box, bucket);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build exception annotations\r\n  //\r\n  UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    U64 line_idx = 0;\r\n    for(S64 line_num = params->line_num_range.min;\r\n        line_num < params->line_num_range.max;\r\n        line_num += 1, line_idx += 1)\r\n    {\r\n      CTRL_EntityList threads = params->line_ips[line_idx];\r\n      for(CTRL_EntityNode *n = threads.first; n != 0; n = n->next)\r\n      {\r\n        CTRL_Entity *thread = n->v;\r\n        if(thread == stopper_thread &&\r\n           (stop_event.cause == CTRL_EventCause_InterruptedByException ||\r\n            stop_event.cause == CTRL_EventCause_InterruptedByTrap))\r\n        {\r\n          DR_FStrList explanation_fstrs = rd_stop_explanation_fstrs_from_ctrl_event(scratch.arena, &stop_event);\r\n          UI_Parent(line_extras_boxes[line_idx]) UI_PrefWidth(ui_text_dim(10, 1)) UI_TextAlignment(UI_TextAlign_Center) UI_PrefHeight(ui_px(params->line_height_px, 1.f))\r\n            UI_TagF(\"bad_pop\")\r\n          {\r\n            UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, \"###exception_info\");\r\n            ui_box_equip_display_fstrs(box, &explanation_fstrs);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse -> expression range info\r\n  //\r\n  TxtRng mouse_expr_rng = {0};\r\n  Vec2F32 mouse_expr_baseline_pos = {0};\r\n  String8 mouse_expr = {0};\r\n  B32 mouse_expr_is_explicit = 0;\r\n  if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line)) ProfScope(\"mouse -> expression range\")\r\n  {\r\n    TxtRng selected_rng = txt_rng(*cursor, *mark);\r\n    if(!txt_pt_match(*cursor, *mark) && cursor->line == mark->line &&\r\n       ((txt_pt_less_than(selected_rng.min, mouse_pt) || txt_pt_match(selected_rng.min, mouse_pt)) &&\r\n        txt_pt_less_than(mouse_pt, selected_rng.max)))\r\n    {\r\n      U64 line_slice_idx = mouse_pt.line-params->line_num_range.min;\r\n      String8 line_text = params->line_text[line_slice_idx];\r\n      F32 expr_hoff_px = params->line_num_width_px + fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_text, selected_rng.min.column-1)).x;\r\n      result.mouse_expr_rng = mouse_expr_rng = selected_rng;\r\n      mouse_expr_baseline_pos = v2f32(text_container_box->rect.x0+expr_hoff_px,\r\n                                      text_container_box->rect.y0+line_slice_idx*params->line_height_px + params->line_height_px*0.85f);\r\n      mouse_expr = str8_substr(line_text, r1u64(selected_rng.min.column-1, selected_rng.max.column-1));\r\n      mouse_expr_is_explicit = 1;\r\n    }\r\n    else\r\n    {\r\n      U64 line_slice_idx = mouse_pt.line-params->line_num_range.min;\r\n      String8 line_text = params->line_text[line_slice_idx];\r\n      TXT_TokenArray line_tokens = params->line_tokens[line_slice_idx];\r\n      Rng1U64 line_range = params->line_ranges[line_slice_idx];\r\n      U64 mouse_pt_off = line_range.min + (mouse_pt.column-1);\r\n      Rng1U64 expr_off_rng = txt_expr_off_range_from_line_off_range_string_tokens(mouse_pt_off, line_range, line_text, &line_tokens);\r\n      if(expr_off_rng.max != expr_off_rng.min)\r\n      {\r\n        F32 expr_hoff_px = params->line_num_width_px + fnt_dim_from_tag_size_string(params->font, params->font_size, 0, params->tab_size, str8_prefix(line_text, expr_off_rng.min-line_range.min)).x;\r\n        result.mouse_expr_rng = mouse_expr_rng = txt_rng(txt_pt(mouse_pt.line, 1+(expr_off_rng.min-line_range.min)), txt_pt(mouse_pt.line, 1+(expr_off_rng.max-line_range.min)));\r\n        mouse_expr_baseline_pos = v2f32(text_container_box->rect.x0+expr_hoff_px,\r\n                                        text_container_box->rect.y0+line_slice_idx*params->line_height_px + params->line_height_px*0.85f);\r\n        mouse_expr = str8_substr(line_text, r1u64(expr_off_rng.min-line_range.min, expr_off_rng.max-line_range.min));\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse -> set global frontend hovered line info\r\n  //\r\n  if(ui_hovering(text_container_sig) && contains_1s64(params->line_num_range, mouse_pt.line) && (ui_mouse().x - text_container_box->rect.x0 < params->line_num_width_px + line_num_padding_px))\r\n  {\r\n    U64 line_slice_idx = mouse_pt.line-params->line_num_range.min;\r\n    D_LineList *lines = &params->line_infos[line_slice_idx];\r\n    if(lines->first != 0 && (params->line_vaddrs[line_slice_idx] != 0 || lines->first->v.pt.line == mouse_pt.line))\r\n    {\r\n      RD_RegsScope(.process     = selected_thread_process->handle,\r\n                   .vaddr_range = ctrl_vaddr_range_from_voff_range(selected_thread_module, lines->first->v.voff_range),\r\n                   .module      = selected_thread_module->handle,\r\n                   .dbgi_key    = lines->first->v.dbgi_key,\r\n                   .voff_range  = lines->first->v.voff_range)\r\n      {\r\n        rd_set_hover_regs(RD_RegSlot_Null);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: hover eval\r\n  //\r\n  if(!ui_dragging(text_container_sig) && text_container_sig.event_flags == 0 && mouse_expr.size != 0)\r\n  {\r\n    E_Eval eval = e_eval_from_string(mouse_expr);\r\n    B32 eval_implicit_hover = (eval.irtree.mode != E_Mode_Null &&\r\n                               eval.space.kind == CTRL_EvalSpaceKind_Entity);\r\n    if(eval.msgs.max_kind == E_MsgKind_Null && (eval_implicit_hover || mouse_expr_is_explicit))\r\n    {\r\n      U64 line_vaddr = 0;\r\n      if(contains_1s64(params->line_num_range, mouse_pt.line))\r\n      {\r\n        U64 line_idx = mouse_pt.line-params->line_num_range.min;\r\n        line_vaddr = params->line_vaddrs[line_idx];\r\n      }\r\n      rd_set_hover_eval(mouse_expr_baseline_pos, mouse_expr);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: dragging/dropping which applies to lines over this slice -> visualize\r\n  //\r\n  if(drop_can_hit_lines && ui_key_match(drop_site_key, ui_drop_hot_key()))\r\n  {\r\n    DR_Bucket *bucket = dr_bucket_make();\r\n    DR_BucketScope(bucket)\r\n    {\r\n      Vec4F32 color = drop_color;\r\n      color.w *= 0.2f;\r\n      Rng2F32 drop_line_rect = r2f32p(top_container_box->rect.x0,\r\n                                      top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min) * params->line_height_px,\r\n                                      top_container_box->rect.x1,\r\n                                      top_container_box->rect.y0 + (mouse_pt.line - params->line_num_range.min + 1) * params->line_height_px);\r\n      R_Rect2DInst *inst = dr_rect(drop_line_rect, color, 0, 0, 1.f);\r\n      inst->colors[Corner_10] = inst->colors[Corner_11] = v4f32(color.x, color.y, color.z, 0);\r\n    }\r\n    ui_box_equip_draw_bucket(text_container_box, bucket);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: (cursor*mark*list(flash_range)) -> list(text_range*color)\r\n  //\r\n  typedef struct TxtRngColorPairNode TxtRngColorPairNode;\r\n  struct TxtRngColorPairNode\r\n  {\r\n    TxtRngColorPairNode *next;\r\n    TxtRng rng;\r\n    Vec4F32 color;\r\n  };\r\n  TxtRngColorPairNode *first_txt_rng_color_pair = 0;\r\n  TxtRngColorPairNode *last_txt_rng_color_pair = 0;\r\n  {\r\n    // rjf: push initial for cursor/mark\r\n    {\r\n      TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1);\r\n      n->rng = txt_rng(*cursor, *mark);\r\n      n->color = ui_color_from_name(str8_lit(\"selection\"));\r\n      SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n);\r\n    }\r\n    \r\n    // rjf: push for ctrlified mouse expr\r\n    if(ctrlified && !txt_pt_match(result.mouse_expr_rng.max, result.mouse_expr_rng.min)) UI_Tag(str8_lit(\"pop\"))\r\n    {\r\n      TxtRngColorPairNode *n = push_array(scratch.arena, TxtRngColorPairNode, 1);\r\n      n->rng = result.mouse_expr_rng;\r\n      n->color = ui_color_from_name(str8_lit(\"background\"));\r\n      n->color.w *= 0.2f;\r\n      SLLQueuePush(first_txt_rng_color_pair, last_txt_rng_color_pair, n);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build line numbers region (line number interaction should be basically identical to lines)\r\n  //\r\n  if(params->flags & RD_CodeSliceFlag_LineNums) UI_Parent(text_container_box) ProfScope(\"build line number interaction box\") UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    ui_set_next_pref_width(ui_px(params->line_num_width_px, 1.f));\r\n    ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n    ui_build_box_from_key(0, ui_key_zero());\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build line text\r\n  //\r\n  UI_Parent(text_container_box) ProfScope(\"build line text\") UI_Focus(UI_FocusKind_Off)\r\n  {\r\n    RD_Regs *hover_regs = rd_get_hover_regs();\r\n    Rng1U64 hover_voff_range = hover_regs->voff_range;\r\n    if(hover_voff_range.min == 0 && hover_voff_range.max == 0)\r\n    {\r\n      CTRL_Entity *module = ctrl_entity_from_handle(&d_state->ctrl_entity_store->ctx, hover_regs->module);\r\n      hover_voff_range = ctrl_voff_range_from_vaddr_range(module, hover_regs->vaddr_range);\r\n    }\r\n    ui_set_next_pref_height(ui_px(params->line_height_px*(dim_1s64(params->line_num_range)+1), 1.f));\r\n    UI_WidthFill\r\n      UI_Column\r\n      UI_PrefHeight(ui_px(params->line_height_px, 1.f))\r\n      RD_Font(RD_FontSlot_Code)\r\n      UI_FontSize(params->font_size)\r\n      UI_CornerRadius(0)\r\n    {\r\n      U64 line_idx = 0;\r\n      for(S64 line_num = params->line_num_range.min;\r\n          line_num <= params->line_num_range.max; line_num += 1, line_idx += 1)\r\n      {\r\n        String8 line_string = params->line_text[line_idx];\r\n        Rng1U64 line_range = params->line_ranges[line_idx];\r\n        DR_FStrList line_fstrs = lines_fstrs[line_idx];\r\n        ui_set_next_text_padding(line_num_padding_px);\r\n        UI_Key line_key = ui_key_from_stringf(top_container_box->key, \"ln_%I64x\", line_num);\r\n        Vec4F32 line_bg_color = line_bg_colors[line_idx];\r\n        if(line_bg_color.w != 0)\r\n        {\r\n          ui_set_next_flags(UI_BoxFlag_DrawBackground);\r\n          ui_set_next_background_color(line_bg_color);\r\n        }\r\n        ui_set_next_tab_size(params->tab_size);\r\n        UI_Box *line_box = ui_build_box_from_key(UI_BoxFlag_DisableTextTrunc|UI_BoxFlag_DrawText|UI_BoxFlag_DisableIDString, line_key);\r\n        DR_Bucket *line_bucket = dr_bucket_make();\r\n        dr_push_bucket(line_bucket);\r\n        ui_box_equip_display_fstrs(line_box, &line_fstrs);\r\n        \r\n        // rjf: extra rendering for strings that are currently being searched for\r\n        if(!search_query_invalidated && params->search_query.size != 0)\r\n        {\r\n          for(U64 needle_pos = 0; needle_pos < line_string.size;)\r\n          {\r\n            needle_pos = str8_find_needle(line_string, needle_pos, params->search_query, StringMatchFlag_CaseInsensitive);\r\n            if(needle_pos < line_string.size)\r\n            {\r\n              Rng1U64 match_range = r1u64(needle_pos, needle_pos+params->search_query.size);\r\n              Rng1F32 match_column_pixel_off_range =\r\n              {\r\n                fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, match_range.min)).x,\r\n                fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, match_range.max)).x,\r\n              };\r\n              Rng2F32 match_rect =\r\n              {\r\n                line_box->rect.x0+line_num_padding_px+match_column_pixel_off_range.min,\r\n                line_box->rect.y0,\r\n                line_box->rect.x0+line_num_padding_px+match_column_pixel_off_range.max+2.f,\r\n                line_box->rect.y1,\r\n              };\r\n              Vec4F32 color = pop_color;\r\n              if(!is_focused)\r\n              {\r\n                color.w *= 0.5f;\r\n              }\r\n              color.w *= 0.2f;\r\n              dr_rect(match_rect, color, 4.f, 0, 1.f);\r\n              needle_pos += 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: extra rendering for list(text_range*color)\r\n        {\r\n          U64 prev_line_size = (line_idx > 0) ? params->line_text[line_idx-1].size : 0;\r\n          U64 next_line_size = (line_idx+1 < dim_1s64(params->line_num_range)) ? params->line_text[line_idx+1].size : 0;\r\n          for(TxtRngColorPairNode *n = first_txt_rng_color_pair; n != 0; n = n->next)\r\n          {\r\n            TxtRng select_range = n->rng;\r\n            TxtRng line_range = txt_rng(txt_pt(line_num, 1), txt_pt(line_num, line_string.size+1));\r\n            TxtRng select_range_in_line = txt_rng_intersect(select_range, line_range);\r\n            if(!txt_pt_match(select_range_in_line.min, select_range_in_line.max) &&\r\n               txt_pt_less_than(select_range_in_line.min, select_range_in_line.max))\r\n            {\r\n              TxtRng prev_line_range = txt_rng(txt_pt(line_num-1, 1), txt_pt(line_num-1, prev_line_size+1));\r\n              TxtRng next_line_range = txt_rng(txt_pt(line_num+1, 1), txt_pt(line_num+1, next_line_size+1));\r\n              TxtRng select_range_in_prev_line = txt_rng_intersect(prev_line_range, select_range);\r\n              TxtRng select_range_in_next_line = txt_rng_intersect(next_line_range, select_range);\r\n              B32 prev_line_good = (!txt_pt_match(select_range_in_prev_line.min, select_range_in_prev_line.max) &&\r\n                                    txt_pt_less_than(select_range_in_prev_line.min, select_range_in_prev_line.max));\r\n              B32 next_line_good = (!txt_pt_match(select_range_in_next_line.min, select_range_in_next_line.max) &&\r\n                                    txt_pt_less_than(select_range_in_next_line.min, select_range_in_next_line.max));\r\n              Rng1S64 select_column_range_in_line =\r\n              {\r\n                (select_range.min.line == line_num) ? select_range.min.column : 1,\r\n                (select_range.max.line == line_num) ? select_range.max.column : (S64)(line_string.size+1),\r\n              };\r\n              Rng1F32 select_column_pixel_off_range =\r\n              {\r\n                fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, select_column_range_in_line.min-1)).x,\r\n                fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, select_column_range_in_line.max-1)).x,\r\n              };\r\n              Rng2F32 select_rect =\r\n              {\r\n                line_box->rect.x0+line_num_padding_px+select_column_pixel_off_range.min-2.f,\r\n                floor_f32(line_box->rect.y0) - 1.f,\r\n                line_box->rect.x0+line_num_padding_px+select_column_pixel_off_range.max+2.f,\r\n                ceil_f32(line_box->rect.y1) + 1.f,\r\n              };\r\n              Vec4F32 color = n->color;\r\n              if(!is_focused)\r\n              {\r\n                color.w *= 0.5f;\r\n              }\r\n              F32 rounded_radius = params->font_size*0.4f;\r\n              R_Rect2DInst *inst = dr_rect(select_rect, color, rounded_radius, 0, 1);\r\n              inst->corner_radii[Corner_00] = !prev_line_good || select_range_in_prev_line.min.column > select_range_in_line.min.column ? rounded_radius : 0.f;\r\n              inst->corner_radii[Corner_10] = (!prev_line_good || select_range_in_line.max.column > select_range_in_prev_line.max.column || select_range_in_line.max.column < select_range_in_prev_line.min.column) ? rounded_radius : 0.f;\r\n              inst->corner_radii[Corner_01] = (!next_line_good || select_range_in_next_line.min.column > select_range_in_line.min.column || select_range_in_next_line.max.column < select_range_in_line.min.column) ? rounded_radius : 0.f;\r\n              inst->corner_radii[Corner_11] = !next_line_good || select_range_in_line.max.column > select_range_in_next_line.max.column ? rounded_radius : 0.f;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: extra rendering for cursor position\r\n        if(cursor->line == line_num)\r\n        {\r\n          S64 column = cursor->column;\r\n          Vec2F32 advance = fnt_dim_from_tag_size_string(line_box->font, line_box->font_size, 0, params->tab_size, str8_prefix(line_string, column-1));\r\n          F32 cursor_y = line_box->rect.y0-params->font_size*0.125f;\r\n          F32 cursor_y__animated = ui_anim(ui_key_from_stringf(text_container_box->key, \"cursor_y_px\"), cursor_y);\r\n          F32 cursor_off_pixels = advance.x;\r\n          F32 cursor_off_pixels__animated = ui_anim(ui_key_from_stringf(text_container_box->key, \"cursor_off_px\"), cursor_off_pixels);\r\n          F32 cursor_thickness = ClampBot(1.f, floor_f32(line_box->font_size/10.f));\r\n          Rng2F32 cursor_rect =\r\n          {\r\n            ui_box_text_position(line_box).x+cursor_off_pixels,\r\n            line_box->rect.y0-params->font_size*0.125f,\r\n            ui_box_text_position(line_box).x+cursor_off_pixels+cursor_thickness,\r\n            line_box->rect.y1+params->font_size*0.125f,\r\n          };\r\n          Rng1F32 trail_off_span = r1f32(cursor_off_pixels__animated, cursor_off_pixels);\r\n          Rng2F32 trail_rect =\r\n          {\r\n            ui_box_text_position(line_box).x+trail_off_span.min,\r\n            line_box->rect.y0-params->font_size*0.125f,\r\n            ui_box_text_position(line_box).x+trail_off_span.max,\r\n            line_box->rect.y1+params->font_size*0.125f,\r\n          };\r\n          Vec4F32 cursor_color = ui_color_from_name(str8_lit(\"cursor\"));\r\n          Vec4F32 trail_color = cursor_color;\r\n          if(!is_focused)\r\n          {\r\n            cursor_color.w *= 0.5f;\r\n          }\r\n          trail_color.w *= 0.25f;\r\n          dr_rect(cursor_rect, cursor_color, 1.f, 0, 0.f);\r\n          if(do_cursor_trail)\r\n          {\r\n            R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f);\r\n            trail_inst->shear = cursor_y - cursor_y__animated;\r\n            if(cursor_off_pixels > cursor_off_pixels__animated)\r\n            {\r\n              trail_inst->dst = shift_2f32(trail_inst->dst, v2f32(0, -trail_inst->shear));\r\n              trail_inst->colors[Corner_00].w *= 0.1f;\r\n              trail_inst->colors[Corner_01].w *= 0.1f;\r\n            }\r\n            else\r\n            {\r\n              trail_inst->shear *= -1;\r\n              trail_inst->colors[Corner_10].w *= 0.1f;\r\n              trail_inst->colors[Corner_11].w *= 0.1f;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: extra rendering for lines with line-info that match the hovered\r\n        {\r\n          B32 matches = 0;\r\n          S64 line_info_line_num = 0;\r\n          D_LineList *lines = &params->line_infos[line_idx];\r\n          for(D_LineNode *n = lines->first; n != 0; n = n->next)\r\n          {\r\n            if((n->v.pt.line == line_num || params->line_vaddrs[line_idx] != 0) &&\r\n               ((di_key_match(n->v.dbgi_key, hover_regs->dbgi_key) &&\r\n                 n->v.voff_range.min <= hover_voff_range.min && hover_voff_range.min < n->v.voff_range.max) ||\r\n                (params->line_vaddrs[line_idx] == hover_regs->vaddr_range.min && hover_regs->vaddr_range.min != 0)))\r\n            {\r\n              matches = 1;\r\n              line_info_line_num = n->v.pt.line;\r\n              break;\r\n            }\r\n          }\r\n          \r\n          // rjf: matches => highlight background\r\n          if(matches)\r\n          {\r\n            Vec4F32 highlight_color = code_line_bgs[line_info_line_num % ArrayCount(code_line_bgs)];\r\n            highlight_color.w *= 0.2f;\r\n            dr_rect(line_box->rect, highlight_color, 0, 0, 0);\r\n          }\r\n        }\r\n        \r\n        // rjf: equip bucket\r\n        if(line_bucket->passes.count != 0)\r\n        {\r\n          ui_box_equip_draw_bucket(line_box, line_bucket);\r\n        }\r\n        \r\n        dr_pop_bucket();\r\n      }\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal RD_CodeSliceSignal\r\nrd_code_slicef(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  RD_CodeSliceSignal sig = rd_code_slice(params, cursor, mark, preferred_column, string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\ninternal B32\r\nrd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 change = 0;\r\n  for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n  {\r\n    if(evt->kind != UI_EventKind_Navigate && evt->kind != UI_EventKind_Edit)\r\n    {\r\n      continue;\r\n    }\r\n    B32 taken = 0;\r\n    String8 line = txt_string_from_info_data_line_num(info, data, cursor->line);\r\n    UI_TxtOp single_line_op = ui_single_line_txt_op_from_event(scratch.arena, evt, line, *cursor, *mark);\r\n    \r\n    //- rjf: invalid single-line op or endpoint units => try multiline\r\n    if(evt->delta_unit == UI_EventDeltaUnit_Whole || single_line_op.flags & UI_TxtOpFlag_Invalid)\r\n    {\r\n      U64 line_count = info->lines_count;\r\n      String8 prev_line = txt_string_from_info_data_line_num(info, data, cursor->line-1);\r\n      String8 next_line = txt_string_from_info_data_line_num(info, data, cursor->line+1);\r\n      Vec2S32 delta = evt->delta_2s32;\r\n      \r\n      //- rjf: wrap lines right\r\n      if(evt->delta_unit != UI_EventDeltaUnit_Whole && delta.x > 0 && cursor->column == line.size+1 && cursor->line+1 <= line_count)\r\n      {\r\n        cursor->line += 1;\r\n        cursor->column = 1;\r\n        *preferred_column = 1;\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: wrap lines left\r\n      if(evt->delta_unit != UI_EventDeltaUnit_Whole && delta.x < 0 && cursor->column == 1 && cursor->line-1 >= 1)\r\n      {\r\n        cursor->line -= 1;\r\n        cursor->column = prev_line.size+1;\r\n        *preferred_column = prev_line.size+1;\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement down (plain)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Char && delta.y > 0 && cursor->line+1 <= line_count)\r\n      {\r\n        cursor->line += 1;\r\n        cursor->column = Min(*preferred_column, next_line.size+1);\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement up (plain)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Char && delta.y < 0 && cursor->line-1 >= 1)\r\n      {\r\n        cursor->line -= 1;\r\n        cursor->column = Min(*preferred_column, prev_line.size+1);\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement down (chunk)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Word && delta.y > 0 && cursor->line+1 <= line_count)\r\n      {\r\n        for(S64 line_num = cursor->line+1; line_num <= line_count; line_num += 1)\r\n        {\r\n          String8 line = txt_string_from_info_data_line_num(info, data, line_num);\r\n          U64 line_size = line.size;\r\n          if(line_size == 0)\r\n          {\r\n            cursor->line = line_num;\r\n            cursor->column = 1;\r\n            break;\r\n          }\r\n          else if(line_num == line_count)\r\n          {\r\n            cursor->line = line_num;\r\n            cursor->column = line_size+1;\r\n          }\r\n        }\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement up (chunk)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Word && delta.y < 0 && cursor->line-1 >= 1)\r\n      {\r\n        for(S64 line_num = cursor->line-1; line_num > 0; line_num -= 1)\r\n        {\r\n          String8 line = txt_string_from_info_data_line_num(info, data, line_num);\r\n          U64 line_size = line.size;\r\n          if(line_size == 0)\r\n          {\r\n            cursor->line = line_num;\r\n            cursor->column = 1;\r\n            break;\r\n          }\r\n          else if(line_num == 1)\r\n          {\r\n            cursor->line = line_num;\r\n            cursor->column = 1;\r\n          }\r\n        }\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement down (page)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Page && delta.y > 0)\r\n      {\r\n        cursor->line += line_count_per_page;\r\n        cursor->column = 1;\r\n        cursor->line = Clamp(1, cursor->line, line_count);\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement up (page)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Page && delta.y < 0)\r\n      {\r\n        cursor->line -= line_count_per_page;\r\n        cursor->column = 1;\r\n        cursor->line = Clamp(1, cursor->line, line_count);\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement to endpoint (+)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Whole && (delta.y > 0 || delta.x > 0))\r\n      {\r\n        *cursor = txt_pt(line_count, info->lines_count ? dim_1u64(info->lines_ranges[info->lines_count-1])+1 : 1);\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: movement to endpoint (-)\r\n      if(evt->delta_unit == UI_EventDeltaUnit_Whole && (delta.y < 0 || delta.x < 0))\r\n      {\r\n        *cursor = txt_pt(1, 1);\r\n        change = 1;\r\n        taken = 1;\r\n      }\r\n      \r\n      //- rjf: stick mark to cursor, when we don't want to keep it in the same spot\r\n      if(!(evt->flags & UI_EventFlag_KeepMark))\r\n      {\r\n        *mark = *cursor;\r\n      }\r\n    }\r\n    \r\n    //- rjf: valid single-line op => do single-line op\r\n    else\r\n    {\r\n      *cursor = single_line_op.cursor;\r\n      *mark = single_line_op.mark;\r\n      *preferred_column = cursor->column;\r\n      change = 1;\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: copy\r\n    if(evt->flags & UI_EventFlag_Copy)\r\n    {\r\n      String8 text = txt_string_from_info_data_txt_rng(info, data, txt_rng(*cursor, *mark));\r\n      os_set_clipboard_text(text);\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: consume\r\n    if(taken)\r\n    {\r\n      ui_eat_event(evt);\r\n    }\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return change;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Fancy Labels\r\n\r\ninternal DR_FStrList\r\nrd_fstrs_from_rich_string(Arena *arena, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  typedef U32 StringPartFlags;\r\n  enum\r\n  {\r\n    StringPartFlag_Code      = (1<<0),\r\n    StringPartFlag_Underline = (1<<1),\r\n    StringPartFlag_Bright    = (1<<2),\r\n  };\r\n  typedef struct StringPart StringPart;\r\n  struct StringPart\r\n  {\r\n    StringPart *next;\r\n    StringPartFlags flags;\r\n    String8 string;\r\n  };\r\n  StringPart *first_part = 0;\r\n  StringPart *last_part = 0;\r\n  U64 active_part_start_idx = 0;\r\n  StringPartFlags active_part_flags = 0;\r\n  for(U64 idx = 0; idx <= string.size; idx += 1)\r\n  {\r\n    if(idx == string.size)\r\n    {\r\n      StringPart *p = push_array(scratch.arena, StringPart, 1);\r\n      p->flags = active_part_flags;\r\n      p->string = str8_substr(string, r1u64(active_part_start_idx, idx));\r\n      SLLQueuePush(first_part, last_part, p);\r\n    }\r\n    else if(string.str[idx] == '`')\r\n    {\r\n      StringPart *p = push_array(scratch.arena, StringPart, 1);\r\n      p->flags = active_part_flags;\r\n      p->string = str8_substr(string, r1u64(active_part_start_idx, idx));\r\n      SLLQueuePush(first_part, last_part, p);\r\n      active_part_start_idx = idx+1;\r\n      active_part_flags ^= StringPartFlag_Code;\r\n    }\r\n  }\r\n  DR_FStrList fstrs = {0};\r\n  for(StringPart *p = first_part; p != 0; p = p->next)\r\n  {\r\n    DR_FStr fstr = {0};\r\n    {\r\n      fstr.string = p->string;\r\n      fstr.params.font   = ui_top_font();\r\n      fstr.params.color  = ui_color_from_name(str8_lit(\"text\"));\r\n      fstr.params.size   = ui_top_font_size();\r\n      fstr.params.raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Main);\r\n      if(p->flags & StringPartFlag_Code)\r\n      {\r\n        fstr.params.font = rd_font_from_slot(RD_FontSlot_Code);\r\n        fstr.params.raster_flags = rd_raster_flags_from_slot(RD_FontSlot_Code);\r\n        fstr.params.color = rd_rgba_from_code_color_slot(RD_CodeColorSlot_CodeDefault);\r\n      }\r\n    }\r\n    dr_fstrs_push(arena, &fstrs, &fstr);\r\n  }\r\n  scratch_end(scratch);\r\n  return fstrs;\r\n}\r\n\r\ninternal UI_Signal\r\nrd_label(String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DR_FStrList fstrs = rd_fstrs_from_rich_string(scratch.arena, string);\r\n  UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n  ui_box_equip_display_fstrs(box, &fstrs);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nrd_error_label(String8 string)\r\n{\r\n  UI_Box *box = ui_build_box_from_key(0, ui_key_zero());\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  UI_Parent(box)\r\n  {\r\n    ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons));\r\n    ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);\r\n    ui_set_next_text_alignment(UI_TextAlign_Center);\r\n    UI_TagF(\"weak\") UI_PrefWidth(ui_em(2.25f, 1.f)) ui_label(rd_icon_kind_text_table[RD_IconKind_WarningBig]);\r\n    UI_PrefWidth(ui_text_dim(10, 0)) rd_label(string);\r\n  }\r\n  return sig;\r\n}\r\n\r\ninternal B32\r\nrd_help_label(String8 string)\r\n{\r\n  B32 result = 0;\r\n  UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"###%S_help_label\", string);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  UI_Parent(box)\r\n  {\r\n    UI_PrefWidth(ui_pct(1, 0)) ui_label(string);\r\n    if(ui_hovering(sig)) UI_PrefWidth(ui_em(2.25f, 1))\r\n    {\r\n      result = 1;\r\n      ui_set_next_font(rd_font_from_slot(RD_FontSlot_Icons));\r\n      ui_set_next_text_raster_flags(FNT_RasterFlag_Smooth);\r\n      ui_set_next_text_alignment(UI_TextAlign_Center);\r\n      UI_Box *help_hoverer = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawHotEffects, \"###help_hoverer_%S\", string);\r\n      ui_box_equip_display_string(help_hoverer, rd_icon_kind_text_table[RD_IconKind_QuestionMark]);\r\n      if(!contains_2f32(help_hoverer->rect, ui_mouse()))\r\n      {\r\n        result = 0;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal DR_FStrList\r\nrd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  DR_FStrList fstrs = {0};\r\n  TXT_TokenArray tokens = txt_token_array_from_string__c_cpp(scratch.arena, 0, string);\r\n  TXT_Token *tokens_opl = tokens.v+tokens.count;\r\n  S32 indirection_counter = 0;\r\n  indirection_size_change = 0;\r\n  for(TXT_Token *token = tokens.v; token < tokens_opl; token += 1)\r\n  {\r\n    RD_CodeColorSlot token_color_slot = rd_code_color_slot_from_txt_token_kind(token->kind);\r\n    Vec4F32 token_color_rgba = rd_rgba_from_code_color_slot(token_color_slot);\r\n    token_color_rgba.w *= alpha;\r\n    String8 token_string = str8_substr(string, token->range);\r\n    if(str8_match(token_string, str8_lit(\"{\"), 0)) { indirection_counter += 1; }\r\n    if(str8_match(token_string, str8_lit(\"[\"), 0)) { indirection_counter += 1; }\r\n    indirection_counter = ClampBot(0, indirection_counter);\r\n    switch(token->kind)\r\n    {\r\n      default:\r\n      {\r\n        DR_FStr fstr =\r\n        {\r\n          token_string,\r\n          {\r\n            ui_top_font(),\r\n            ui_top_text_raster_flags(),\r\n            token_color_rgba,\r\n            ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)),\r\n          }\r\n        };\r\n        dr_fstrs_push(arena, &fstrs, &fstr);\r\n      }break;\r\n      case TXT_TokenKind_Identifier:\r\n      case TXT_TokenKind_Keyword:\r\n      {\r\n        RD_CodeColorSlot lookup_theme_color_slot = rd_code_color_slot_from_txt_token_kind_lookup_string(token->kind, token_string);\r\n        if(lookup_theme_color_slot != RD_CodeColorSlot_CodeDefault)\r\n        {\r\n          Vec4F32 lookup_color = rd_rgba_from_code_color_slot(lookup_theme_color_slot);\r\n          F32 lookup_color_mix_t = ui_anim(ui_key_from_stringf(ui_key_zero(), \"%S_lookup\", token_string), 1.f);\r\n          token_color_rgba = mix_4f32(token_color_rgba, lookup_color, lookup_color_mix_t);\r\n        }\r\n        DR_FStr fstr =\r\n        {\r\n          token_string,\r\n          {\r\n            ui_top_font(),\r\n            ui_top_text_raster_flags(),\r\n            token_color_rgba,\r\n            ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f)),\r\n          },\r\n        };\r\n        dr_fstrs_push(arena, &fstrs, &fstr);\r\n      }break;\r\n      case TXT_TokenKind_Numeric:\r\n      {\r\n        Vec4F32 token_color_rgba_alt = rd_rgba_from_code_color_slot(RD_CodeColorSlot_CodeNumericAltDigitGroup);\r\n        token_color_rgba_alt.w *= alpha;\r\n        F32 font_size = ui_top_font_size() * (1.f - !!indirection_size_change*(indirection_counter/10.f));\r\n        \r\n        // rjf: unpack string\r\n        U32 base = 10;\r\n        U64 prefix_skip = 0;\r\n        U64 digit_group_size = 3;\r\n        if(str8_match(str8_prefix(token_string, 2), str8_lit(\"0x\"), StringMatchFlag_CaseInsensitive))\r\n        {\r\n          base = 16;\r\n          prefix_skip = 2;\r\n          digit_group_size = 4;\r\n        }\r\n        else if(str8_match(str8_prefix(token_string, 2), str8_lit(\"0b\"), StringMatchFlag_CaseInsensitive))\r\n        {\r\n          base = 2;\r\n          prefix_skip = 2;\r\n          digit_group_size = 8;\r\n        }\r\n        else if(str8_match(str8_prefix(token_string, 2), str8_lit(\"0o\"), StringMatchFlag_CaseInsensitive))\r\n        {\r\n          base = 8;\r\n          prefix_skip = 2;\r\n          digit_group_size = 2;\r\n        }\r\n        \r\n        // rjf: grab string parts\r\n        U64 dot_pos = str8_find_needle(token_string, 0, str8_lit(\".\"), 0);\r\n        String8 prefix = str8_prefix(token_string, prefix_skip);\r\n        String8 whole = str8_substr(token_string, r1u64(prefix_skip, dot_pos));\r\n        String8 decimal = str8_skip(token_string, dot_pos);\r\n        \r\n        // rjf: determine # of digits\r\n        U64 num_digits = 0;\r\n        for(U64 idx = 0; idx < whole.size; idx += 1)\r\n        {\r\n          num_digits += char_is_digit(whole.str[idx], base);\r\n        }\r\n        \r\n        // rjf: push prefix\r\n        {\r\n          DR_FStr fstr =\r\n          {\r\n            prefix,\r\n            {\r\n              ui_top_font(),\r\n              ui_top_text_raster_flags(),\r\n              token_color_rgba,\r\n              font_size,\r\n            },\r\n          };\r\n          dr_fstrs_push(arena, &fstrs, &fstr);\r\n        }\r\n        \r\n        // rjf: push digit groups\r\n        {\r\n          B32 odd = 0;\r\n          U64 start_idx = 0;\r\n          U64 num_digits_passed = digit_group_size - num_digits%digit_group_size;\r\n          for(U64 idx = 0; idx <= whole.size; idx += 1)\r\n          {\r\n            U8 byte = idx < whole.size ? whole.str[idx] : 0;\r\n            if(num_digits_passed >= digit_group_size || idx == whole.size)\r\n            {\r\n              num_digits_passed = 0;\r\n              if(start_idx < idx)\r\n              {\r\n                DR_FStr fstr =\r\n                {\r\n                  str8_substr(whole, r1u64(start_idx, idx)),\r\n                  {\r\n                    ui_top_font(),\r\n                    ui_top_text_raster_flags(),\r\n                    odd ? token_color_rgba_alt : token_color_rgba,\r\n                    font_size,\r\n                  },\r\n                };\r\n                dr_fstrs_push(arena, &fstrs, &fstr);\r\n                start_idx = idx;\r\n                odd ^= 1;\r\n              }\r\n            }\r\n            if(char_is_digit(byte, base))\r\n            {\r\n              num_digits_passed += 1;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: push decimal\r\n        {\r\n          DR_FStr fstr =\r\n          {\r\n            decimal,\r\n            {\r\n              ui_top_font(),\r\n              ui_top_text_raster_flags(),\r\n              token_color_rgba,\r\n              font_size,\r\n            },\r\n          };\r\n          dr_fstrs_push(arena, &fstrs, &fstr);\r\n        }\r\n        \r\n      }break;\r\n    }\r\n    if(str8_match(token_string, str8_lit(\"}\"), 0)) { indirection_counter -= 1; }\r\n    if(str8_match(token_string, str8_lit(\"]\"), 0)) { indirection_counter -= 1; }\r\n    indirection_counter = ClampBot(0, indirection_counter);\r\n  }\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return fstrs;\r\n}\r\n\r\ninternal UI_Box *\r\nrd_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  DR_FStrList fstrs = rd_fstrs_from_code_string(scratch.arena, alpha, indirection_size_change, base_color, string);\r\n  UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n  ui_box_equip_display_fstrs(box, &fstrs);\r\n  scratch_end(scratch);\r\n  return box;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Line Edit\r\n\r\ninternal UI_Signal\r\nrd_cell(RD_CellParams *params, String8 string)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  B32 do_cursor_trail = rd_setting_b32_from_name(str8_lit(\"cursor_trail\"));\r\n  \r\n  //////////////////////////////\r\n  //- rjf: unpack visual metrics\r\n  //\r\n  F32 expander_size_px = floor_f32(ui_top_font_size()*2.f);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: make key\r\n  //\r\n  UI_Key key = ui_key_from_string(ui_active_seed_key(), string);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate & push focus\r\n  //\r\n  B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key);\r\n  B32 is_auto_focus_active = ui_is_key_auto_focus_active(key);\r\n  if(is_auto_focus_hot) { ui_push_focus_hot(UI_FocusKind_On); }\r\n  if(is_auto_focus_active) { ui_push_focus_active(UI_FocusKind_On); }\r\n  B32 is_focus_hot    = ui_is_focus_hot();\r\n  B32 is_focus_active = ui_is_focus_active();\r\n  B32 is_focus_hot_disabled = (!is_focus_hot && ui_top_focus_hot() == UI_FocusKind_On);\r\n  B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine which sub-cell components we'll build\r\n  //\r\n  // (the base line edit textual label / editor is always built, but this can be enriched\r\n  // with extra widgets & metadata)\r\n  //\r\n  B32 build_toggle_switch = !!(params->flags & RD_CellFlag_ToggleSwitch) && !is_focus_active;\r\n  B32 build_slider        = !!(params->flags & RD_CellFlag_Slider) && !is_focus_active;\r\n  B32 build_bindings      = !!(params->flags & RD_CellFlag_Bindings) && !is_focus_active;\r\n  B32 build_lhs_name_desc = (params->meta_fstrs.node_count != 0 || params->description.size != 0);\r\n  B32 build_line_edit     = (params->pre_edit_value.size != 0 || params->value_fstrs.node_count != 0);\r\n  B32 build_note          = (params->note_fstrs.node_count != 0 && !is_focus_active);\r\n  DR_FStrList lhs_name_fstrs = params->meta_fstrs;\r\n  DR_FStrList value_name_fstrs = params->value_fstrs;\r\n  DR_FStrList note_fstrs = params->note_fstrs;\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine autocompletion string\r\n  //\r\n  String8 autocomplete_hint_string = {0};\r\n  if(is_focus_active)\r\n  {\r\n    autocomplete_hint_string = ui_autocomplete_string();\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build top-level box\r\n  //\r\n  if(is_focus_active || is_focus_active_disabled)\r\n  {\r\n    ui_set_next_hover_cursor(OS_Cursor_IBar);\r\n  }\r\n  UI_Box *box = ui_build_box_from_key(UI_BoxFlag_MouseClickable|\r\n                                      (!!build_lhs_name_desc*UI_BoxFlag_DisableFocusBorder)|\r\n                                      (!!(params->flags & RD_CellFlag_KeyboardClickable)*UI_BoxFlag_KeyboardClickable)|\r\n                                      UI_BoxFlag_ClickToFocus|\r\n                                      (!!(params->flags & RD_CellFlag_Button)*UI_BoxFlag_DrawHotEffects)|\r\n                                      (!!(params->flags & RD_CellFlag_SingleClickActivate)*UI_BoxFlag_DrawActiveEffects)|\r\n                                      (!(params->flags & RD_CellFlag_NoBackground)*UI_BoxFlag_DrawBackground)|\r\n                                      (!!(params->flags & RD_CellFlag_Border)*UI_BoxFlag_DrawBorder)|\r\n                                      ((is_auto_focus_hot || is_auto_focus_active)*UI_BoxFlag_KeyboardClickable)|\r\n                                      (is_focus_active || is_focus_active_disabled)*(UI_BoxFlag_Clip),\r\n                                      key);\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build indent\r\n  //\r\n  UI_Parent(box) for(S32 idx = 0; idx < params->depth; idx += 1)\r\n  {\r\n    ui_set_next_flags(UI_BoxFlag_DrawSideLeft);\r\n    ui_spacer(ui_em(1.f, 1.f));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build expander (or placeholder, or space)\r\n  //\r\n  {\r\n    //- rjf: build expander\r\n    if(params->flags & RD_CellFlag_Expander) UI_PrefWidth(ui_px(expander_size_px, 1.f)) UI_Parent(box)\r\n      UI_Flags(UI_BoxFlag_DrawSideLeft)\r\n      UI_Focus(UI_FocusKind_Off)\r\n    {\r\n      UI_Signal expander_sig = ui_expanderf(params->expanded_out[0], \"expander\");\r\n      if(ui_pressed(expander_sig))\r\n      {\r\n        params->expanded_out[0] ^= 1;\r\n      }\r\n    }\r\n    \r\n    //- rjf: build expander placeholder\r\n    else if(params->flags & RD_CellFlag_ExpanderPlaceholder) UI_Parent(box) UI_PrefWidth(ui_px(expander_size_px, 1.f)) UI_Focus(UI_FocusKind_Off)\r\n    {\r\n      UI_TagF(\"weak\")\r\n        UI_Flags(UI_BoxFlag_DrawSideLeft)\r\n        RD_Font(RD_FontSlot_Icons)\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n        ui_label(rd_icon_kind_text_table[RD_IconKind_Dot]);\r\n    }\r\n    \r\n    //- rjf: build expander space\r\n    else if(params->flags & RD_CellFlag_ExpanderSpace) UI_Parent(box) UI_Focus(UI_FocusKind_Off)\r\n    {\r\n      UI_Flags(UI_BoxFlag_DrawSideLeft) ui_spacer(ui_px(expander_size_px, 1.f));\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build left-hand-side container box\r\n  //\r\n  UI_Box *lhs_box = &ui_nil_box;\r\n  if(build_lhs_name_desc)\r\n  {\r\n    UI_Parent(box) UI_WidthFill UI_ChildLayoutAxis(Axis2_Y)\r\n    {\r\n      if(ui_top_text_alignment() == UI_TextAlign_Left && (params->flags & (RD_CellFlag_Expander|RD_CellFlag_ExpanderSpace|RD_CellFlag_ExpanderPlaceholder)) == 0)\r\n      {\r\n        ui_spacer(ui_em(1.f, 1.f));\r\n      }\r\n      lhs_box = ui_build_box_from_stringf(0, \"lhs_box\");\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build left-hand-side name/desc box\r\n  //\r\n  if(build_lhs_name_desc) UI_Parent(lhs_box) UI_Padding(ui_em(3.f, 0.f)) UI_WidthFill UI_HeightFill\r\n  {\r\n    FuzzyMatchRangeList fuzzy_matches = {0};\r\n    if(params->search_needle.size != 0)\r\n    {\r\n      fuzzy_matches = dr_fuzzy_match_find_from_fstrs(scratch.arena, &lhs_name_fstrs, params->search_needle);\r\n    }\r\n    UI_Row\r\n    {\r\n      UI_Box *name_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n      ui_box_equip_display_fstrs(name_box, &lhs_name_fstrs);\r\n      ui_box_equip_fuzzy_match_ranges(name_box, &fuzzy_matches);\r\n    }\r\n    if(params->description.size != 0) RD_Font(RD_FontSlot_Main) UI_FontSize(ui_top_font_size()*0.85f)\r\n    {\r\n      UI_Row\r\n      {\r\n        UI_Box *desc_box = ui_label(params->description).box;\r\n        FuzzyMatchRangeList desc_fuzzy_matches = fuzzy_match_find(scratch.arena, params->search_needle, params->description);\r\n        ui_box_equip_fuzzy_match_ranges(desc_box, &desc_fuzzy_matches);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build line edit container box\r\n  //\r\n  UI_Box *edit_box = &ui_nil_box;\r\n  if((is_focus_active || is_focus_active_disabled) || build_line_edit)\r\n    UI_Parent(box)\r\n  {\r\n    B32 is_editing = (is_focus_active || is_focus_active_disabled);\r\n    UI_Size edit_box_size = ui_pct(1, 0);\r\n    if(build_lhs_name_desc)\r\n    {\r\n      if(is_editing)\r\n      {\r\n        edit_box_size = ui_px(floor_f32(dim_2f32(box->rect).x*0.5f), 1.f);\r\n      }\r\n      else\r\n      {\r\n        edit_box_size = ui_children_sum(1);\r\n      }\r\n    }\r\n    UI_PrefWidth(edit_box_size)\r\n    {\r\n      if(ui_top_px_height() > ui_top_font_size()*3.f)\r\n      {\r\n        ui_set_next_pref_width(ui_children_sum(1));\r\n        UI_Column UI_Padding(ui_em(1, 0)) UI_Focus(UI_FocusKind_On)\r\n        {\r\n          UI_PrefHeight(ui_em(3.f, 1.f)) UI_CornerRadius(ui_top_font_size()*0.5f)\r\n            edit_box = ui_build_box_from_stringf((!!is_editing*UI_BoxFlag_DrawBorder)|\r\n                                                 UI_BoxFlag_Clickable|\r\n                                                 UI_BoxFlag_DisableFocusOverlay,\r\n                                                 \"edit_box\");\r\n          if(params->line_edit_key_out)\r\n          {\r\n            params->line_edit_key_out[0] = edit_box->key;\r\n          }\r\n        }\r\n        if(ui_top_text_alignment() == UI_TextAlign_Left)\r\n        {\r\n          ui_spacer(ui_em(1.f, 1.f));\r\n        }\r\n      }\r\n      else\r\n      {\r\n        edit_box = ui_build_box_from_stringf(0, \"edit_box\");\r\n        if(params->line_edit_key_out)\r\n        {\r\n          params->line_edit_key_out[0] = edit_box->key;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build edit-button, if line edit is embedded, and has no string\r\n  //\r\n  B32 edit_started = 0;\r\n  if(params->flags & RD_CellFlag_EmptyEditButton && !is_focus_active && !is_focus_active_disabled && build_lhs_name_desc && build_line_edit && value_name_fstrs.total_size == 0)\r\n  {\r\n    UI_TagF(\".\")\r\n      UI_TagF(\"weak\")\r\n      UI_TagF(\"implicit\")\r\n      UI_Parent(box)\r\n      UI_PrefWidth(ui_em(2.f, 1.f))\r\n    {\r\n      UI_Column\r\n        UI_Padding(ui_pct(1, 0))\r\n        UI_PrefHeight(ui_em(2.f, 1.f))\r\n        UI_CornerRadius(ui_top_font_size()*0.5f)\r\n        RD_Font(RD_FontSlot_Icons)\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n      {\r\n        UI_Box *edit_start_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                                           UI_BoxFlag_DrawHotEffects|\r\n                                                           UI_BoxFlag_DrawBorder|\r\n                                                           UI_BoxFlag_DrawBackground|\r\n                                                           UI_BoxFlag_DisableFocusOverlay|\r\n                                                           UI_BoxFlag_DisableFocusBorder|\r\n                                                           UI_BoxFlag_Clickable,\r\n                                                           \"%S##edit\", rd_icon_kind_text_table[RD_IconKind_Pencil]);\r\n        UI_Signal sig = ui_signal_from_box(edit_start_box);\r\n        if(ui_pressed(sig))\r\n        {\r\n          edit_started = 1;\r\n        }\r\n      }\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build scrollable container box\r\n  //\r\n  UI_Box *scrollable_box = &ui_nil_box;\r\n  if(edit_box != &ui_nil_box)\r\n  {\r\n    UI_Parent(edit_box) UI_PrefWidth(ui_children_sum(0))\r\n    {\r\n      scrollable_box = ui_build_box_from_stringf(is_focus_active*(UI_BoxFlag_AllowOverflowX), \"scroll_box_%p\", params->edit_buffer);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build revert-button\r\n  //\r\n  if(params->flags & RD_CellFlag_RevertButton && !is_focus_active && !is_focus_active_disabled)\r\n  {\r\n    UI_Parent(edit_box)\r\n      UI_PrefWidth(ui_em(2.f, 1.f))\r\n    {\r\n      UI_TagF(\".\")\r\n        UI_TagF(\"weak\")\r\n        UI_TagF(\"implicit\")\r\n        UI_Column\r\n        UI_Padding(ui_pct(1, 0))\r\n        UI_PrefHeight(ui_em(2.f, 1.f))\r\n        UI_CornerRadius(ui_top_font_size()*0.5f)\r\n        RD_Font(RD_FontSlot_Icons)\r\n        UI_TextAlignment(UI_TextAlign_Center)\r\n      {\r\n        UI_Box *revert_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|\r\n                                                       UI_BoxFlag_DrawHotEffects|\r\n                                                       UI_BoxFlag_DrawBorder|\r\n                                                       UI_BoxFlag_DrawBackground|\r\n                                                       UI_BoxFlag_DisableFocusOverlay|\r\n                                                       UI_BoxFlag_DisableFocusBorder|\r\n                                                       UI_BoxFlag_Clickable,\r\n                                                       \"%S##revert\", rd_icon_kind_text_table[RD_IconKind_Undo]);\r\n        UI_Signal sig = ui_signal_from_box(revert_box);\r\n        if(ui_pressed(sig) && params->revert_out)\r\n        {\r\n          params->revert_out[0] = 1;\r\n        }\r\n      }\r\n      // TODO(rjf): @hack\r\n      if(build_toggle_switch || build_slider)\r\n      {\r\n        ui_spacer(ui_em(1.f, 1.f));\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build toggle-switch\r\n  //\r\n  if(build_toggle_switch) UI_Parent(box)\r\n  {\r\n    B32 is_toggled = !!params->toggled_out[0];\r\n    F32 toggle_t = ui_anim(ui_key_from_stringf(key, \"toggled\"), (F32)is_toggled, .initial = (F32)is_toggled, .rate = rd_state->menu_animation_rate);\r\n    F32 height_px = ceil_f32(ui_top_font_size() * 1.75f);\r\n    F32 padding_px = ceil_f32((ui_top_px_height() - height_px) / 2.f);\r\n    UI_PrefWidth(ui_children_sum(1.f))\r\n      UI_HeightFill\r\n      UI_Column UI_Padding(ui_px(padding_px, 1.f))\r\n      UI_Row\r\n    {\r\n      if(ui_top_text_alignment() == UI_TextAlign_Center)\r\n      {\r\n        ui_spacer(ui_em(1.f, 0.f));\r\n      }\r\n      UI_PrefWidth(ui_em(3.5f, 1.f))\r\n        UI_PrefHeight(ui_px(height_px, 1.f))\r\n        UI_CornerRadius(floor_f32(height_px/2.f - 1.f))\r\n        UI_TagF(is_toggled ? \"good_pop\" : \"\")\r\n        UI_GroupKey(ui_key_from_stringf(ui_key_zero(), \"toggle_switch_group_key\"))\r\n      {\r\n        UI_Box *switch_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, \"toggle_switch\");\r\n        UI_Parent(switch_box)\r\n        {\r\n          RD_Font(RD_FontSlot_Icons) UI_PrefWidth(ui_pct(toggle_t, 0)) UI_Transparency(1.f - toggle_t)\r\n          {\r\n            ui_build_box_from_stringf(UI_BoxFlag_DisableTextTrunc | (toggle_t > 0.001f ? UI_BoxFlag_DrawText : 0),\r\n                                      \"%S\", rd_icon_kind_text_table[RD_IconKind_Check]); \r\n          }\r\n          UI_BackgroundColor(ui_color_from_name(str8_lit(\"text\")))\r\n            UI_PrefWidth(ui_px(height_px, 1.f))\r\n          {\r\n            F32 extratoggler_padding_px = floor_f32(ui_top_font_size()*0.35f);\r\n            F32 toggler_size_px = ceil_f32(height_px - extratoggler_padding_px*2.f) - 1.f;\r\n            UI_Column UI_Padding(ui_px(extratoggler_padding_px, 1.f))\r\n              UI_Row UI_Padding(ui_px(extratoggler_padding_px, 1.f))\r\n              UI_PrefWidth(ui_px(toggler_size_px, 1.f))\r\n              UI_PrefHeight(ui_px(toggler_size_px, 1.f))\r\n              UI_CornerRadius(floor_f32(toggler_size_px/2.f - 1.f))\r\n            {\r\n              ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero());\r\n            }\r\n          }\r\n          ui_spacer(ui_pct(1.f-toggle_t, 0));\r\n        }\r\n        UI_Signal switch_sig = ui_signal_from_box(switch_box);\r\n        \r\n        // rjf: press -> toggle, & gather this key\r\n        if(ui_pressed(switch_sig))\r\n        {\r\n          if(ui_dragging(switch_sig))\r\n          {\r\n            ui_store_drag_struct(&switch_box->key);\r\n          }\r\n          params->toggled_out[0] ^= 1;\r\n        }\r\n        \r\n        // rjf: dragging -> check if key is in batch of touched keys. if so, do nothing, otherwise, toggle.\r\n        // always store this new key if not in batch\r\n        if(ui_dragging(switch_sig))\r\n        {\r\n          String8 all_keys_data = ui_get_drag_data(sizeof(UI_Key));\r\n          UI_Key *keys = (UI_Key *)all_keys_data.str;\r\n          U64 keys_count = all_keys_data.size / sizeof(UI_Key);\r\n          B32 key_is_touched = 0;\r\n          for EachIndex(idx, keys_count)\r\n          {\r\n            if(ui_key_match(keys[idx], switch_box->key))\r\n            {\r\n              key_is_touched = 1;\r\n              break;\r\n            }\r\n          }\r\n          if(!key_is_touched)\r\n          {\r\n            params->toggled_out[0] ^= 1;\r\n            UI_Key *new_keys = push_array(scratch.arena, UI_Key, keys_count+1);\r\n            MemoryCopy(new_keys, keys, sizeof(UI_Key)*keys_count);\r\n            new_keys[keys_count] = switch_box->key;\r\n            ui_store_drag_data(str8((U8 *)new_keys, sizeof(UI_Key) * (keys_count+1)));\r\n          }\r\n        }\r\n      }\r\n      if(ui_top_text_alignment() == UI_TextAlign_Center)\r\n      {\r\n        ui_spacer(ui_em(1.f, 0.f));\r\n      }\r\n    }\r\n    if(ui_top_text_alignment() == UI_TextAlign_Left)\r\n    {\r\n      ui_spacer(ui_em(1.f, 1.f));\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build slider\r\n  //\r\n  if(build_slider) UI_Parent(box)\r\n  {\r\n    F32 height_px = ceil_f32(ui_top_font_size() * 1.75f);\r\n    F32 padding_px = ceil_f32((ui_top_px_height() - height_px) / 2.f);\r\n    UI_PrefWidth(ui_children_sum(1.f))\r\n      UI_HeightFill\r\n      UI_Column UI_Padding(ui_px(padding_px, 1.f))\r\n      UI_Row\r\n      UI_PrefWidth(ui_pct(0.5f - 0.2f*(!!build_lhs_name_desc), 0.f))\r\n      UI_PrefHeight(ui_px(height_px, 1.f))\r\n      UI_CornerRadius(floor_f32(height_px/2.f - 1.f))\r\n    {\r\n      F32 extratoggler_padding_px = floor_f32(ui_top_font_size()*0.35f);\r\n      F32 toggler_size_px = ceil_f32(height_px - extratoggler_padding_px*2.f) - 1.f;\r\n      ui_set_next_hover_cursor(OS_Cursor_LeftRight);\r\n      UI_Box *slider_box = ui_build_box_from_stringf(UI_BoxFlag_DrawHotEffects|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_Clickable, \"slider\");\r\n      UI_Parent(slider_box) UI_TagF(\"pop\")\r\n      {\r\n        UI_Signal sig = ui_signal_from_box(slider_box);\r\n        if(ui_dragging(sig))\r\n        {\r\n          if(ui_pressed(sig))\r\n          {\r\n            ui_store_drag_struct(params->slider_value_out);\r\n          }\r\n          F32 draggable_region_size_px = dim_2f32(slider_box->rect).x - (extratoggler_padding_px*2 + toggler_size_px);\r\n          F32 initial_pct = *ui_get_drag_struct(F32);\r\n          F32 current_pct = initial_pct + (ui_drag_delta().x / draggable_region_size_px);\r\n          params->slider_value_out[0] = current_pct;\r\n        }\r\n        \r\n        UI_Box *fill_box = &ui_nil_box;\r\n        UI_PrefWidth(ui_children_sum(0))\r\n          UI_MinWidth(toggler_size_px + extratoggler_padding_px*2)\r\n          fill_box = ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBorder, ui_key_zero());\r\n        UI_Parent(fill_box)\r\n        {\r\n          ui_spacer(ui_pct(Clamp(0, params->slider_value_out[0], 1), 0.f));\r\n          UI_BackgroundColor(ui_color_from_name(str8_lit(\"text\")))\r\n            UI_PrefWidth(ui_px(height_px, 1.f))\r\n          {\r\n            UI_Column UI_Padding(ui_px(extratoggler_padding_px, 1.f))\r\n              UI_Row UI_Padding(ui_px(extratoggler_padding_px, 1.f))\r\n              UI_PrefWidth(ui_px(toggler_size_px, 1.f))\r\n              UI_PrefHeight(ui_px(toggler_size_px, 1.f))\r\n              UI_CornerRadius(floor_f32(toggler_size_px/2.f - 1.f))\r\n            {\r\n              ui_build_box_from_key(UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawDropShadow, ui_key_zero());\r\n            }\r\n          }\r\n        }\r\n        ui_spacer(ui_pct(1-Clamp(0, params->slider_value_out[0], 1), 0.f));\r\n      }\r\n    }\r\n    ui_spacer(ui_em(1.f, 1.f));\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build bindings\r\n  //\r\n  if(build_bindings) UI_Parent(box) RD_Font(RD_FontSlot_Main) UI_PermissionFlags(UI_PermissionFlag_Clicks)\r\n  {\r\n    UI_PrefWidth(ui_children_sum(1)) UI_Column UI_Padding(ui_px(ui_top_px_height()*0.2f, 1.f)) UI_HeightFill\r\n    {\r\n      UI_PrefWidth(ui_children_sum(1)) UI_Row UI_Padding(ui_em(1.f, 1.f))\r\n      {\r\n        rd_cmd_binding_buttons(params->bindings_name, params->search_needle, 1);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build notes\r\n  //\r\n  if(build_note) UI_Parent(box) UI_PrefWidth(params->note_width)\r\n  {\r\n    UI_Box *note_box = ui_build_box_from_key(UI_BoxFlag_DrawText, ui_key_zero());\r\n    ui_box_equip_display_fstrs(note_box, &note_fstrs);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do non-textual edits (delete, copy, cut)\r\n  //\r\n  B32 commit = 0;\r\n  if(!is_focus_active && is_focus_hot)\r\n  {\r\n    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n    {\r\n      if(evt->flags & UI_EventFlag_Copy)\r\n      {\r\n        os_set_clipboard_text(params->pre_edit_value);\r\n      }\r\n      if(evt->flags & UI_EventFlag_Delete)\r\n      {\r\n        commit = 1;\r\n        params->edit_string_size_out[0] = 0;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: get signal\r\n  //\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  if(commit)\r\n  {\r\n    sig.f |= UI_SignalFlag_Commit;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: do start/end editing interaction\r\n  //\r\n  B32 focus_started = 0;\r\n  if(!is_focus_active)\r\n  {\r\n    B32 start_editing_via_sig = (ui_double_clicked(sig) || sig.f&UI_SignalFlag_KeyboardPressed);\r\n    B32 start_editing_via_typing = 0;\r\n    if(is_focus_hot)\r\n    {\r\n      for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n      {\r\n        if(evt->string.size != 0 || evt->flags & UI_EventFlag_Paste)\r\n        {\r\n          start_editing_via_typing = 1;\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    if(is_focus_hot && ui_slot_press(UI_EventActionSlot_Edit))\r\n    {\r\n      start_editing_via_typing = 1;\r\n    }\r\n    if(start_editing_via_sig || start_editing_via_typing)\r\n    {\r\n      String8 edit_string = params->pre_edit_value;\r\n      edit_string.size = Min(params->edit_buffer_size, params->pre_edit_value.size);\r\n      MemoryCopy(params->edit_buffer, edit_string.str, edit_string.size);\r\n      params->edit_string_size_out[0] = edit_string.size;\r\n      ui_set_auto_focus_active_key(key);\r\n      if(!(params->flags & RD_CellFlag_Button))\r\n      {\r\n        ui_kill_action();\r\n      }\r\n      params->cursor[0] = txt_pt(1, edit_string.size+1);\r\n      params->mark[0] = txt_pt(1, 1);\r\n      focus_started = 1;\r\n    }\r\n  }\r\n  else if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed)\r\n  {\r\n    ui_set_auto_focus_active_key(ui_key_zero());\r\n    sig.f |= UI_SignalFlag_Commit;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: take navigation actions for editing\r\n  //\r\n  B32 changes_made = 0;\r\n  if(!(params->flags & RD_CellFlag_DisableEdit) && (is_focus_active || focus_started))\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    rd_state->text_edit_mode = 1;\r\n    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n    {\r\n      String8 edit_string = str8(params->edit_buffer, params->edit_string_size_out[0]);\r\n      \r\n      // rjf: do not consume anything that doesn't fit a single-line's operations\r\n      B32 is_autocompletion_completion = (autocomplete_hint_string.size != 0 &&\r\n                                          evt->kind == UI_EventKind_Press &&\r\n                                          evt->slot == UI_EventActionSlot_Accept);\r\n      if(!is_autocompletion_completion &&\r\n         ((evt->kind != UI_EventKind_Edit &&\r\n           evt->kind != UI_EventKind_Navigate &&\r\n           evt->kind != UI_EventKind_Text) ||\r\n          evt->delta_2s32.y != 0))\r\n      {\r\n        continue;\r\n      }\r\n      \r\n      // rjf: map this action to an op\r\n      UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, edit_string, params->cursor[0], params->mark[0]);\r\n      \r\n      // rjf: any valid *additive* op & autocomplete hint? -> perform autocomplete first, then re-compute op\r\n      if(!(evt->flags & UI_EventFlag_Delete) && autocomplete_hint_string.size != 0)\r\n      {\r\n        CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n        RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n        RD_AutocompCursorInfo *autocomp_cursor_info = &ws->autocomp_cursor_info;\r\n        String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(autocomp_cursor_info->replaced_range.min+1, autocomp_cursor_info->replaced_range.max+1), autocomplete_hint_string);\r\n        new_string.size = Min(params->edit_buffer_size, new_string.size);\r\n        MemoryCopy(params->edit_buffer, new_string.str, new_string.size);\r\n        params->edit_string_size_out[0] = new_string.size;\r\n        params->cursor[0] = params->mark[0] = txt_pt(1, 1+autocomp_cursor_info->replaced_range.min+autocomplete_hint_string.size);\r\n        edit_string = str8(params->edit_buffer, params->edit_string_size_out[0]);\r\n        op = ui_single_line_txt_op_from_event(scratch.arena, evt, edit_string, params->cursor[0], params->mark[0]);\r\n        MemoryZeroStruct(&autocomplete_hint_string);\r\n      }\r\n      \r\n      // rjf: perform replace range\r\n      if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0)\r\n      {\r\n        String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(op.range.min.column, op.range.max.column), op.replace);\r\n        new_string.size = Min(params->edit_buffer_size, new_string.size);\r\n        MemoryCopy(params->edit_buffer, new_string.str, new_string.size);\r\n        params->edit_string_size_out[0] = new_string.size;\r\n      }\r\n      \r\n      // rjf: perform copy\r\n      if(op.flags & UI_TxtOpFlag_Copy)\r\n      {\r\n        os_set_clipboard_text(op.copy);\r\n      }\r\n      \r\n      // rjf: commit op's changed cursor & mark to caller-provided state\r\n      params->cursor[0] = op.cursor;\r\n      params->mark[0] = op.mark;\r\n      \r\n      // rjf: consume event\r\n      {\r\n        if(!is_autocompletion_completion)\r\n        {\r\n          ui_eat_event(evt);\r\n        }\r\n        changes_made = 1;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: click-driven \"start editing\"\r\n  //\r\n  if(edit_started)\r\n  {\r\n    sig.f |= UI_SignalFlag_DoubleClicked;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: compute editable fancy strings\r\n  //\r\n  DR_FStrList fstrs = {0};\r\n  {\r\n    //- rjf: (not editing)\r\n    if(!is_focus_active && !is_focus_active_disabled && value_name_fstrs.total_size != 0)\r\n    {\r\n      fstrs = value_name_fstrs;\r\n    }\r\n    else if(!is_focus_active && !is_focus_active_disabled && params->flags & RD_CellFlag_CodeContents && params->pre_edit_value.size != 0)\r\n    {\r\n      String8 display_string = params->pre_edit_value;\r\n      fstrs = rd_fstrs_from_code_string(scratch.arena, 1, 0, ui_color_from_name(str8_lit(\"text\")), display_string);\r\n    }\r\n    else if(!is_focus_active && !is_focus_active_disabled)\r\n    {\r\n      String8 display_string = params->pre_edit_value;\r\n      if(params->pre_edit_value.size == 0)\r\n      {\r\n        display_string = ui_display_part_from_key_string(string);\r\n      }\r\n      UI_TagF(\"weak\")\r\n      {\r\n        DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n        dr_fstrs_push_new(scratch.arena, &fstrs, &params, display_string);\r\n      }\r\n    }\r\n    \r\n    //- rjf: (editing)\r\n    else if(is_focus_active || is_focus_active_disabled)\r\n    {\r\n      String8 edit_string = str8(params->edit_buffer, params->edit_string_size_out[0]);\r\n      DR_FStrList edit_string_fstrs = {0};\r\n      if(params->flags & RD_CellFlag_CodeContents)\r\n      {\r\n        edit_string_fstrs = rd_fstrs_from_code_string(scratch.arena, 1.f, 0, ui_color_from_name(str8_lit(\"text\")), edit_string);\r\n      }\r\n      else\r\n      {\r\n        String8 edit_string = str8(params->edit_buffer, params->edit_string_size_out[0]);\r\n        DR_FStrParams params = {ui_top_font(), ui_top_text_raster_flags(), ui_color_from_name(str8_lit(\"text\")), ui_top_font_size()};\r\n        dr_fstrs_push_new(scratch.arena, &edit_string_fstrs, &params, edit_string);\r\n      }\r\n      if(autocomplete_hint_string.size != 0)\r\n      {\r\n        CFG_Node *window = cfg_node_from_id(rd_regs()->window);\r\n        RD_WindowState *ws = rd_window_state_from_cfg(window);\r\n        RD_AutocompCursorInfo *autocomp_cursor_info = &ws->autocomp_cursor_info;\r\n        String8 autocomplete_append_string = str8_skip(autocomplete_hint_string, params->cursor->column-1 - autocomp_cursor_info->replaced_range.min);\r\n        U64 off = 0;\r\n        U64 cursor_off = params->cursor->column-1;\r\n        DR_FStrNode *prev_n = 0;\r\n        for(DR_FStrNode *n = edit_string_fstrs.first; n != 0; n = n->next)\r\n        {\r\n          if(off <= cursor_off && cursor_off <= off+n->v.string.size)\r\n          {\r\n            prev_n = n;\r\n            break;\r\n          }\r\n          off += n->v.string.size;\r\n        }\r\n        {\r\n          DR_FStrNode *autocomp_fstr_n = push_array(scratch.arena, DR_FStrNode, 1);\r\n          DR_FStr *fstr = &autocomp_fstr_n->v;\r\n          fstr->string = autocomplete_append_string;\r\n          fstr->params.font = ui_top_font();\r\n          fstr->params.raster_flags = ui_top_text_raster_flags();\r\n          fstr->params.color = ui_color_from_name(str8_lit(\"text\"));\r\n          fstr->params.color.w *= 0.5f;\r\n          fstr->params.size = ui_top_font_size();\r\n          autocomp_fstr_n->next = prev_n ? prev_n->next : 0;\r\n          if(prev_n != 0)\r\n          {\r\n            prev_n->next = autocomp_fstr_n;\r\n          }\r\n          if(prev_n == 0)\r\n          {\r\n            edit_string_fstrs.first = edit_string_fstrs.last = autocomp_fstr_n;\r\n          }\r\n          if(prev_n != 0 && prev_n->next == 0)\r\n          {\r\n            edit_string_fstrs.last = autocomp_fstr_n;\r\n          }\r\n          edit_string_fstrs.node_count += 1;\r\n          edit_string_fstrs.total_size += autocomplete_hint_string.size;\r\n          if(prev_n != 0 && cursor_off - off < prev_n->v.string.size)\r\n          {\r\n            String8 full_string = prev_n->v.string;\r\n            U64 chop_amt = full_string.size - (cursor_off - off);\r\n            prev_n->v.string = str8_chop(full_string, chop_amt);\r\n            edit_string_fstrs.total_size -= chop_amt;\r\n            if(chop_amt != 0)\r\n            {\r\n              String8 post_cursor = str8_skip(full_string, cursor_off - off);\r\n              DR_FStrNode *post_fstr_n = push_array(scratch.arena, DR_FStrNode, 1);\r\n              DR_FStr *post_fstr = &post_fstr_n->v;\r\n              MemoryCopyStruct(post_fstr, &prev_n->v);\r\n              post_fstr->string   = post_cursor;\r\n              if(autocomp_fstr_n->next == 0)\r\n              {\r\n                edit_string_fstrs.last = post_fstr_n;\r\n              }\r\n              post_fstr_n->next = autocomp_fstr_n->next;\r\n              autocomp_fstr_n->next = post_fstr_n;\r\n              edit_string_fstrs.node_count += 1;\r\n              edit_string_fstrs.total_size += post_cursor.size;\r\n            }\r\n          }\r\n        }\r\n      }\r\n      fstrs = edit_string_fstrs;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: build scrolled contents\r\n  //\r\n  TxtPt mouse_pt = {0};\r\n  F32 cursor_off = 0;\r\n  if(scrollable_box != &ui_nil_box) UI_Parent(scrollable_box)\r\n  {\r\n    FuzzyMatchRangeList fuzzy_matches = {0};\r\n    if(params->search_needle.size != 0)\r\n    {\r\n      fuzzy_matches = dr_fuzzy_match_find_from_fstrs(scratch.arena, &fstrs, params->search_needle);\r\n    }\r\n    if(ui_top_text_alignment() == UI_TextAlign_Left && (params->flags & (RD_CellFlag_Expander|RD_CellFlag_ExpanderSpace|RD_CellFlag_ExpanderPlaceholder)) == 0)\r\n    {\r\n      ui_spacer(ui_em(0.5f, 1.f));\r\n    }\r\n    if(is_focus_active)\r\n    {\r\n      ui_set_next_flags(UI_BoxFlag_DisableTextTrunc);\r\n    }\r\n    ui_set_next_pref_width(ui_text_dim(ui_top_font_size()*0.5f, 0));\r\n    UI_Box *text_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText, \"###text_box\");\r\n    ui_box_equip_display_fstrs(text_box, &fstrs);\r\n    ui_box_equip_fuzzy_match_ranges(text_box, &fuzzy_matches);\r\n    if(is_focus_active || is_focus_active_disabled)\r\n    {\r\n      String8 edit_string = str8(params->edit_buffer, params->edit_string_size_out[0]);\r\n      UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1);\r\n      draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string);\r\n      draw_data->cursor = params->cursor[0];\r\n      draw_data->mark = params->mark[0];\r\n      draw_data->trail = do_cursor_trail;\r\n      ui_box_equip_custom_draw(text_box, ui_line_edit_draw, draw_data);\r\n      Vec2F32 text2mouse = sub_2f32(ui_mouse(), ui_box_text_position(text_box));\r\n      FNT_Tag font = ui_top_font();\r\n      F32 font_size = ui_top_font_size();\r\n      if(params->flags & RD_CellFlag_CodeContents)\r\n      {\r\n        font = rd_font_from_slot(RD_FontSlot_Code);\r\n      }\r\n      U64 mouse_pt_off = fnt_char_pos_from_tag_size_string_p(font, font_size, 0, ui_top_tab_size(), edit_string, text2mouse.x);\r\n      mouse_pt = txt_pt(1, 1+mouse_pt_off);\r\n      cursor_off = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, params->cursor->column-1)).x;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: click+drag\r\n  //\r\n  if(is_focus_active && ui_dragging(sig))\r\n  {\r\n    if(ui_pressed(sig))\r\n    {\r\n      params->mark[0] = mouse_pt;\r\n    }\r\n    params->cursor[0] = mouse_pt;\r\n  }\r\n  if(!is_focus_active && is_focus_active_disabled && ui_pressed(sig))\r\n  {\r\n    params->cursor[0] = params->mark[0] = mouse_pt;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: focus cursor\r\n  //\r\n  if(scrollable_box != &ui_nil_box)\r\n  {\r\n    F32 visible_dim_px = dim_2f32(box->rect).x - expander_size_px - ui_top_font_size()*params->depth;\r\n    if(visible_dim_px > 0)\r\n    {\r\n      Rng1F32 cursor_range_px  = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*1.f);\r\n      Rng1F32 visible_range_px = r1f32(scrollable_box->view_off_target.x, scrollable_box->view_off_target.x + visible_dim_px);\r\n      cursor_range_px.min = ClampBot(0, cursor_range_px.min);\r\n      cursor_range_px.max = ClampBot(0, cursor_range_px.max);\r\n      F32 min_delta = cursor_range_px.min-visible_range_px.min;\r\n      F32 max_delta = cursor_range_px.max-visible_range_px.max;\r\n      min_delta = Min(min_delta, 0);\r\n      max_delta = Max(max_delta, 0);\r\n      scrollable_box->view_off_target.x += min_delta;\r\n      scrollable_box->view_off_target.x += max_delta;\r\n    }\r\n    if(!is_focus_active && !is_focus_active_disabled)\r\n    {\r\n      scrollable_box->view_off_target.x = scrollable_box->view_off.x = 0;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: pop focus\r\n  //\r\n  if(is_auto_focus_hot) { ui_pop_focus_hot(); }\r\n  if(is_auto_focus_active) { ui_pop_focus_active(); }\r\n  \r\n  ProfEnd();\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nrd_cellf(RD_CellParams *params, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = rd_cell(params, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n"
  },
  {
    "path": "src/raddbg/raddbg_widgets.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RADDBG_WIDGETS_H\r\n#define RADDBG_WIDGETS_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Cell Types\r\n\r\ntypedef U32 RD_CellFlags;\r\nenum\r\n{\r\n  //- rjf: expander\r\n  RD_CellFlag_Expander            = (1<<0),\r\n  RD_CellFlag_ExpanderSpace       = (1<<1),\r\n  RD_CellFlag_ExpanderPlaceholder = (1<<2),\r\n  \r\n  //- rjf: toggle switch extension\r\n  RD_CellFlag_ToggleSwitch        = (1<<3),\r\n  \r\n  //- rjf: slider extension\r\n  RD_CellFlag_Slider              = (1<<4),\r\n  \r\n  //- rjf: bindings extension\r\n  RD_CellFlag_Bindings            = (1<<5),\r\n  \r\n  //- rjf: extra button extensions\r\n  RD_CellFlag_EmptyEditButton     = (1<<6),\r\n  RD_CellFlag_RevertButton        = (1<<7),\r\n  \r\n  //- rjf: behavior\r\n  RD_CellFlag_DisableEdit         = (1<<8),\r\n  RD_CellFlag_KeyboardClickable   = (1<<9),\r\n  RD_CellFlag_SingleClickActivate = (1<<10),\r\n  \r\n  //- rjf: contents description\r\n  RD_CellFlag_CodeContents        = (1<<11),\r\n  \r\n  //- rjf: appearance\r\n  RD_CellFlag_Border              = (1<<12),\r\n  RD_CellFlag_NoBackground        = (1<<13),\r\n  RD_CellFlag_Button              = (1<<14),\r\n};\r\n\r\ntypedef struct RD_CellParams RD_CellParams;\r\nstruct RD_CellParams\r\n{\r\n  //- rjf: catchall parameters\r\n  RD_CellFlags flags;\r\n  S32 depth;\r\n  String8 pre_edit_value;\r\n  DR_FStrList meta_fstrs;\r\n  DR_FStrList value_fstrs;\r\n  DR_FStrList note_fstrs;\r\n  UI_Size note_width;\r\n  String8 search_needle;\r\n  String8 description;\r\n  \r\n  //- rjf: expander r/w info\r\n  B32 *expanded_out;\r\n  \r\n  //- rjf: toggle-switch r/w info\r\n  B32 *toggled_out;\r\n  \r\n  //- rjf: slider info r/w info\r\n  F32 *slider_value_out;\r\n  \r\n  //- rjf: bindings name w info\r\n  String8 bindings_name;\r\n  \r\n  //- rjf: revert out\r\n  B32 *revert_out;\r\n  \r\n  //- rjf: text editing r/w info\r\n  TxtPt *cursor;\r\n  TxtPt *mark;\r\n  U8 *edit_buffer;\r\n  U64 edit_buffer_size;\r\n  U64 *edit_string_size_out;\r\n  UI_Key *line_edit_key_out;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Code Slice Types\r\n\r\ntypedef U32 RD_CodeSliceFlags;\r\nenum\r\n{\r\n  RD_CodeSliceFlag_Clickable         = (1<<0),\r\n  RD_CodeSliceFlag_PriorityMargin    = (1<<1),\r\n  RD_CodeSliceFlag_CatchallMargin    = (1<<2),\r\n  RD_CodeSliceFlag_LineNums          = (1<<3),\r\n};\r\n\r\ntypedef struct RD_CodeSliceParams RD_CodeSliceParams;\r\nstruct RD_CodeSliceParams\r\n{\r\n  // rjf: content\r\n  RD_CodeSliceFlags flags;\r\n  Rng1S64 line_num_range;\r\n  String8 *line_text;\r\n  Rng1U64 *line_ranges;\r\n  TXT_TokenArray *line_tokens;\r\n  CFG_NodePtrList *line_bps;\r\n  CTRL_EntityList *line_ips;\r\n  CFG_NodePtrList *line_pins;\r\n  U64 *line_vaddrs;\r\n  D_LineList *line_infos;\r\n  DI_KeyList relevant_dbgi_keys;\r\n  TXT_TextInfo *text_info;\r\n  String8 text_data;\r\n  \r\n  // rjf: visual parameters\r\n  FNT_Tag font;\r\n  F32 font_size;\r\n  F32 tab_size;\r\n  String8 search_query;\r\n  F32 line_height_px;\r\n  F32 priority_margin_width_px;\r\n  F32 catchall_margin_width_px;\r\n  F32 line_num_width_px;\r\n  F32 line_text_max_width_px;\r\n  F32 margin_float_off_px;\r\n};\r\n\r\ntypedef struct RD_CodeSliceSignal RD_CodeSliceSignal;\r\nstruct RD_CodeSliceSignal\r\n{\r\n  UI_Signal base;\r\n  TxtPt mouse_pt;\r\n  TxtRng mouse_expr_rng;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Building Helpers\r\n\r\n#define RD_Font(slot) UI_Font(rd_font_from_slot(slot)) UI_TextRasterFlags(rd_raster_flags_from_slot((slot)))\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Fancy Title Strings\r\n\r\ninternal DR_FStrList rd_title_fstrs_from_cfg(Arena *arena, CFG_Node *cfg, B32 include_extras);\r\ninternal DR_FStrList rd_title_fstrs_from_ctrl_entity(Arena *arena, CTRL_Entity *entity, B32 include_extras);\r\ninternal DR_FStrList rd_title_fstrs_from_code_name(Arena *arena, String8 code_name);\r\ninternal DR_FStrList rd_title_fstrs_from_file_path(Arena *arena, String8 file_path);\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Loading Overlay\r\n\r\ninternal void rd_loading_overlay(Rng2F32 rect, F32 loading_t, U64 progress_v, U64 progress_v_target);\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Fancy Buttons\r\n\r\ninternal void rd_cmd_binding_buttons(String8 name, String8 filter, B32 add_new);\r\ninternal UI_Signal rd_menu_bar_button(String8 string);\r\ninternal UI_Signal rd_cmd_spec_button(String8 name);\r\ninternal void rd_cmd_list_menu_buttons(U64 count, String8 *cmd_names, U32 *fastpath_codepoints);\r\ninternal UI_Signal rd_icon_button(RD_IconKind kind, FuzzyMatchRangeList *matches, String8 string);\r\ninternal UI_Signal rd_icon_buttonf(RD_IconKind kind, FuzzyMatchRangeList *matches, char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Text View\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(rd_code_slice_text_draw_extensions);\r\ninternal UI_BOX_CUSTOM_DRAW(rd_thread_box_draw_extensions);\r\ninternal UI_BOX_CUSTOM_DRAW(rd_bp_box_draw_extensions);\r\ninternal RD_CodeSliceSignal rd_code_slice(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, String8 string);\r\ninternal RD_CodeSliceSignal rd_code_slicef(RD_CodeSliceParams *params, TxtPt *cursor, TxtPt *mark, S64 *preferred_column, char *fmt, ...);\r\n\r\ninternal B32 rd_do_txt_controls(TXT_TextInfo *info, String8 data, U64 line_count_per_page, TxtPt *cursor, TxtPt *mark, S64 *preferred_column);\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Fancy Labels\r\n\r\ninternal DR_FStrList rd_fstrs_from_rich_string(Arena *arena, String8 string);\r\ninternal UI_Signal rd_label(String8 string);\r\ninternal UI_Signal rd_error_label(String8 string);\r\ninternal B32 rd_help_label(String8 string);\r\ninternal DR_FStrList rd_fstrs_from_code_string(Arena *arena, F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);\r\ninternal UI_Box *rd_code_label(F32 alpha, B32 indirection_size_change, Vec4F32 base_color, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Widgets: Line Edit\r\n\r\ninternal UI_Signal rd_cell(RD_CellParams *params, String8 string);\r\ninternal UI_Signal rd_cellf(RD_CellParams *params, char *fmt, ...);\r\n\r\n#endif // RADDBG_WIDGETS_H\r\n"
  },
  {
    "path": "src/raddump/raddump.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n// TODO:\n//\n// Code View:\n//  [x] Test .debug$S\n//  [x] Test .debug$T\n//\n// Test dumper on following sections:\n//  [x] .debug_abbrev\n//  [ ] .debug_aranges\n//  [ ] .debug_frame\n//  [x] .debug_info\n//  [x] .debug_line\n//  [ ] .debug_loc\n//  [ ] .debug_macinfo\n//  [ ] .debug_pubnames\n//  [ ] .debug_pubtypes\n//  [x] .debug_str\n//  [x] .debug_ranges\n//  [ ] .debug_addr\n//  [ ] .debug_loclists\n//  [ ] .debug_rnglists\n//  [ ] .debug_stroffsets\n//  [ ] .debug_linestr\n//  [ ] .debug_names\n//\n// [ ] port ELF dumper from internal repo\n// [ ] port COFF/PE resource dumper from internal repo\n// [x] hook up RDI symbolizer\n\ninternal void\nrd_stderr(char *fmt, ...)\n{\n  Temp scratch = scratch_begin(0,0);\n  va_list args;\n  va_start(args, fmt);\n  String8 f = push_str8fv(scratch.arena, fmt, args);\n  fprintf(stderr, \"%.*s\\n\", str8_varg(f));\n  va_end(args);\n  scratch_end(scratch);\n}\n\ninternal RDI_Parsed *\nrd_rdi_from_pe(Arena *arena, String8 pe_path)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  // make command line for converter\n  String8List cmdl_string = {0};\n  str8_list_pushf(scratch.arena, &cmdl_string, \"-pe:%S\", pe_path);\n  CmdLine cmdl = cmd_line_from_string_list(scratch.arena, cmdl_string);\n  \n  // run converter\n  String8 raw_rdi = rc_rdi_from_cmd_line(scratch.arena, &cmdl);\n  \n  // load RDI\n  RDI_Parsed *rdi = 0;\n  if (raw_rdi.size) {\n    rdi = push_array(arena, RDI_Parsed, 1);\n    \n    // TODO: check guid\n    RDI_ParseStatus parse_status = rdi_parse(raw_rdi.str, raw_rdi.size, rdi);\n    \n    String8 parse_status_string = str8_zero();\n    if (parse_status == RDI_ParseStatus_Good) {\n    } else if (parse_status == RDI_ParseStatus_HeaderDoesNotMatch) {\n      parse_status_string = str8_lit(\"Header does not match\");\n    } else if (parse_status == RDI_ParseStatus_UnsupportedVersionNumber) {\n      parse_status_string = str8_lit(\"Unsupported version number\");\n    } else if (parse_status == RDI_ParseStatus_InvalidDataSecionLayout) {\n      parse_status_string = str8_lit(\"Invalid data section layout\");\n    } else if (parse_status == RDI_ParseStatus_MissingRequiredSection) {\n      parse_status_string = str8_lit(\"Missing required section\");\n    } else {\n      parse_status_string = push_str8f(scratch.arena, \"unknown parse status code: %u\", parse_status);\n    }\n    \n    if (parse_status_string.size) {\n      rdi = 0;\n      rd_errorf(\"RDI parse status(%u): %S\", parse_status, parse_status_string);\n    }\n  }\n  \n  scratch_end(scratch);\n  return rdi;\n}\n\ninternal String8\nrd_proc_name_from_voff(RDI_Parsed *rdi, U64 voff)\n{\n  RDI_Scope     *scope = rdi_scope_from_voff(rdi, voff);\n  RDI_Procedure *proc  = rdi_procedure_from_scope(rdi, scope);\n  String8        name  = {0};\n  name.str = rdi_string_from_idx(rdi, proc->name_string_idx, &name.size);\n  return name;\n}\n\ninternal String8\nrd_format_proc_line(Arena *arena, RDI_Parsed *rdi, U64 voff)\n{\n  RDI_Scope     *scope = rdi_scope_from_voff(rdi, voff);\n  RDI_Procedure *proc  = rdi_procedure_from_scope(rdi, scope);\n  String8        name  = {0};\n  name.str = rdi_string_from_idx(rdi, proc->name_string_idx, &name.size);\n  U64            rel   = voff - scope->voff_range_first;\n  String8 result = str8_zero();\n  if (name.size) {\n    if (rel) {\n      result = push_str8f(arena, \"%S+%llx\", name, rel);\n    } else {\n      result = push_str8f(arena, \"%S\", name);\n    }\n  }\n  return result;\n}\n\ninternal String8\nrd_path_from_file_path_node_idx(Arena *arena, RDI_Parsed *rdi, U32 file_path_node_idx, PathStyle style)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List parts = {0};\n  for(RDI_FilePathNode *fpn = rdi_element_from_name_idx(rdi, FilePathNodes, file_path_node_idx);\n      fpn != rdi_element_from_name_idx(rdi, FilePathNodes, 0);\n      fpn = rdi_element_from_name_idx(rdi, FilePathNodes, fpn->parent_path_node)) {\n    String8 p;\n    p.str = rdi_string_from_idx(rdi, fpn->name_string_idx, &p.size);\n    str8_list_push_front(scratch.arena, &parts, p);\n  }\n  String8 path = str8_path_list_join_by_style(arena, &parts, style);\n  scratch_end(scratch);\n  return path;\n}\n\ninternal RD_Line\nrd_line_from_voff(Arena *arena, RDI_Parsed *rdi, U64 voff, PathStyle path_style)\n{\n  RDI_Line        line      = rdi_line_from_voff(rdi, voff);\n  RDI_SourceFile *src_file  = rdi_source_file_from_line(rdi, &line);\n  String8         file_path = rd_path_from_file_path_node_idx(arena, rdi, src_file->file_path_node_idx, path_style);\n  \n  RD_Line result   = {0};\n  result.file_path = file_path;\n  result.line_num  = line.line_num;\n  \n  return result;\n}\n\ninternal String8\nrd_format_line_from_voff(Arena *arena, RDI_Parsed *rdi, U64 voff, PathStyle path_style)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  RD_Line line   = rd_line_from_voff(scratch.arena, rdi, voff, path_style);\n  String8 result = push_str8f(arena, \"%S:%u\", line.file_path, line.line_num);\n  scratch_end(scratch);\n  return result;\n}\n\ninternal B32\nrd_is_rdi(String8 raw_data)\n{\n  B32 is_rdi = 0;\n  if (raw_data.size > 8) {\n    U64 *magic = (U64 *)raw_data.str;\n    is_rdi = *magic == RDI_MAGIC_CONSTANT;\n  }\n  return is_rdi;\n}\n\ninternal String8\nrd_string_from_reg_off(Arena *arena, String8 reg_str, S64 reg_off)\n{\n  String8 result;\n  if (reg_off > 0) {\n    result = push_str8f(arena, \"%S%+lld\", reg_str, reg_off);\n  } else {\n    result = push_str8f(arena, \"%S\", reg_str);\n  }\n  return result;\n}\n\ninternal String8\nrd_string_from_flags(Arena *arena, String8List list, U64 remaining_flags)\n{\n  String8 result;\n  if (list.node_count == 0 && remaining_flags == 0) {\n    result = str8_lit(\"0\");\n  } else {\n    Temp scratch = scratch_begin(&arena, 1);\n    if (remaining_flags != 0) {\n      str8_list_pushf(scratch.arena, &list, \"Unknown flags: %#llx\", remaining_flags);\n    }\n    result = str8_list_join(arena, &list, &(StringJoin){.sep = str8_lit(\", \") });\n    scratch_end(scratch);\n  }\n  return result;\n}\n\ninternal String8\nrd_string_from_array_u32(Arena *arena, U32 *v, U64 count)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n  for (U64 i = 0; i < count; ++i) {\n    str8_list_pushf(scratch.arena, &list, \"%u\", v[i]);\n  }\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrd_string_from_hex_u8(Arena *arena, U8 *v, U64 count)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n  for (U64 i = 0; i < count; ++i) {\n    str8_list_pushf(scratch.arena, &list, \"%#x\", v[i]);\n  }\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrd_string_from_array_hex_u32(Arena *arena, U32 *v, U64 count)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n  for (U64 i = 0; i < count; ++i) {\n    str8_list_pushf(scratch.arena, &list, \"%#x\", v[i]);\n  }\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrd_string_from_array_hex_u64(Arena *arena, U64 *v, U64 count)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n  for (U64 i = 0; i < count; ++i) {\n    str8_list_pushf(scratch.arena, &list, \"%#llx\", v[i]);\n  }\n  String8 result = str8_list_join(arena, &list, &(StringJoin){.sep=str8_lit(\", \")});\n  scratch_end(scratch);\n  return result;\n}\n\ninternal void\nrd_format_preamble(Arena *arena, String8List *out, String8 indent, String8 input_path, String8 raw_data)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 input_type_string = str8_lit(\"???\");\n  if (coff_is_regular_archive(raw_data)) {\n    input_type_string = str8_lit(\"Archive\");\n  } else if (coff_is_thin_archive(raw_data)) {\n    input_type_string = str8_lit(\"Thin Archive\");\n  } else if (coff_is_big_obj(raw_data)) {\n    input_type_string = str8_lit(\"Big Obj\");\n  } else if (coff_is_obj(raw_data)) {\n    input_type_string = str8_lit(\"Obj\");\n  } else if (pe_check_magic(raw_data)) {\n    input_type_string = str8_lit(\"COFF/PE\");\n  } else if (rd_is_rdi(raw_data)) {\n    input_type_string = str8_lit(\"RDI\");\n  } else if (elf_check_magic(raw_data)) {\n    U8 sig[ELF_Identifier_Max] = {0};\n    str8_deserial_read(raw_data, 0, &sig[0], sizeof(sig), 1);\n    input_type_string = push_str8f(scratch.arena, \"ELF (Class: %S)\", elf_string_from_class(scratch.arena, sig[ELF_Identifier_Class]));\n  }\n  \n  DateTime universal_dt = os_now_universal_time();\n  DateTime local_dt     = os_local_time_from_universal(&universal_dt);\n  String8  time         = string_from_date_time(scratch.arena, &local_dt);\n  String8  full_path    = os_full_path_from_path(scratch.arena, input_path);\n  rd_printf(\"# %S, [%S] %S\", time, input_type_string, full_path);\n  \n  scratch_end(scratch);\n}\n\ninternal int\nrd_marker_is_before(void *a, void *b)\n{\n  return u64_is_before(&((RD_Marker*)a)->off, &((RD_Marker*)b)->off);\n}\n\ninternal int\nrd_range_min_is_before(void *raw_a, void *raw_b)\n{\n  Rng1U64 *a = raw_a;\n  Rng1U64 *b = raw_b;\n  return a->min < b->min;\n}\n\ninternal U64\nrd_range_bsearch(Rng1U64 *ranges, U64 count, U64 x)\n{\n  if (count > 0 && ranges[0].min <= x && x < ranges[count - 1].min) {\n    U64 first = 0;\n    U64 opl   = count;\n    for (;;) {\n      U64 mid = (first + opl)/2;\n      if (ranges[mid].min < x) {\n        first = mid;\n      } else if (ranges[mid].min > x) {\n        opl = mid;\n      } else {\n        first = mid;\n        break;\n      }\n      if (opl - first <= 1) {\n        break;\n      }\n    }\n    return first;\n  }\n  return max_U64;\n}\n\ninternal RD_MarkerArray *\nrd_section_markers_from_rdi(Arena *arena, RDI_Parsed *rdi)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64                sect_count = 0;\n  RDI_BinarySection *sect_lo    = rdi_table_from_name(rdi, BinarySections, &sect_count);\n  \n  Rng1U64 *sect_vranges = push_array(scratch.arena, Rng1U64, sect_count);\n  for (U64 i = 0; i < sect_count; ++i) {\n    sect_vranges[i].min = sect_lo[i].voff_first;\n    sect_vranges[i].max = i;\n  }\n  radsort(sect_vranges, sect_count, rd_range_min_is_before);\n  \n  U64            proc_count = 0;\n  RDI_Procedure *proc_lo    = rdi_table_from_name(rdi, Procedures, &proc_count);\n  \n  RD_MarkerList *markers = push_array(scratch.arena, RD_MarkerList, sect_count);\n  for (U64 i = 0; i < proc_count; ++i) {\n    RDI_Procedure *proc         = proc_lo + i;\n    U64            proc_voff_lo = rdi_first_voff_from_procedure(rdi, proc);\n    U64            proc_voff_hi = rdi_opl_voff_from_procedure(rdi, proc);\n    \n    U64 sect_range_idx = rd_range_bsearch(sect_vranges, sect_count, proc_voff_lo);\n    if (sect_range_idx < sect_count) {\n      Rng1U64 sect_range = sect_vranges[sect_range_idx];\n      U64     sect_idx   = sect_range.max;\n      \n      String8 name = str8_zero();\n      name.str = rdi_name_from_procedure(rdi, proc, &name.size);\n      \n      RD_MarkerNode *n = push_array(scratch.arena, RD_MarkerNode, 1);\n      n->v.off         = proc_voff_lo - sect_range.min;\n      n->v.string      = name;\n      \n      RD_MarkerList *list = &markers[sect_idx];\n      SLLQueuePush(list->first, list->last, n);\n      ++list->count;\n    }\n  }\n  \n  // lists -> arrays\n  RD_MarkerArray *result = push_array(arena, RD_MarkerArray, sect_count);\n  for (U64 i = 0; i < sect_count; ++i) {\n    result[i].count = 0;\n    result[i].v     = push_array(arena, RD_Marker, markers[i].count);\n    for (RD_MarkerNode *n = markers[i].first; n != 0; n = n->next) {\n      result[i].v[result[i].count++] = n->v;\n    }\n  }\n  \n  // sort arrays\n  for (U64 i = 0; i < sect_count; ++i) {\n    radsort(result[i].v, result[i].count, rd_marker_is_before);\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal RD_MarkerArray *\nrd_section_markers_from_coff_symbol_table(Arena *arena, String8 string_table, U64 section_count, COFF_Symbol32Array symbols)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  // extract markers from symbol table\n  RD_MarkerList *markers = push_array(scratch.arena, RD_MarkerList, section_count+1);\n  for (U64 symbol_idx = 0; symbol_idx < symbols.count; ++symbol_idx) {\n    COFF_Symbol32 *symbol = &symbols.v[symbol_idx];\n    \n    COFF_SymbolValueInterpType interp = coff_interp_symbol(symbol->section_number, symbol->value, symbol->storage_class);\n    B32 is_marker = interp == COFF_SymbolValueInterp_Regular &&\n      symbol->aux_symbol_count == 0 &&\n    (symbol->storage_class == COFF_SymStorageClass_External || symbol->storage_class == COFF_SymStorageClass_Static);\n    \n    if (is_marker) {\n      String8 name = coff_read_symbol_name(string_table, &symbol->name);\n      \n      RD_MarkerNode *n = push_array(scratch.arena, RD_MarkerNode, 1);\n      n->v.off         = symbol->value;\n      n->v.string      = name;\n      \n      RD_MarkerList *list = &markers[symbol->section_number];\n      SLLQueuePush(list->first, list->last, n);\n      ++list->count;\n    }\n    \n    symbol_idx += symbol->aux_symbol_count;\n  }\n  \n  // lists -> arrays\n  RD_MarkerArray *result = push_array(arena, RD_MarkerArray, section_count);\n  for (U64 i = 0; i < section_count; ++i) {\n    result[i].count = 0;\n    result[i].v     = push_array(arena, RD_Marker, markers[i].count);\n    for (RD_MarkerNode *n = markers[i].first; n != 0; n = n->next) {\n      result[i].v[result[i].count++] = n->v;\n    }\n  }\n  \n  // sort arrays\n  for (U64 i = 0; i < section_count; ++i) {\n    radsort(result[i].v, result[i].count, rd_marker_is_before);\n  }\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal RD_DisasmResult\nrd_disasm_next_instruction(Arena *arena, Arch arch, U64 addr, String8 raw_code)\n{\n  RD_DisasmResult result = {0};\n  \n  switch (arch) {\n    case Arch_Null: break;\n    \n    case Arch_x64:\n    case Arch_x86: {\n      ZydisMachineMode             machine_mode = bit_size_from_arch(arch) == 32 ? ZYDIS_MACHINE_MODE_LEGACY_32 : ZYDIS_MACHINE_MODE_LONG_64;\n      ZydisDisassembledInstruction inst         = {0};\n      ZyanStatus                   status       = ZydisDisassemble(machine_mode, addr, raw_code.str, raw_code.size, &inst, ZYDIS_FORMATTER_STYLE_INTEL);\n      \n      String8 text = str8_cstring_capped(inst.text, inst.text+sizeof(inst.text));\n      result.text = push_str8_copy(arena, text);\n      result.size = inst.info.length;\n    } break;\n    \n    default: NotImplemented;\n  }\n  \n  return result;\n}\n\ninternal void\nrd_print_disasm(Arena            *arena,\n                String8List      *out,\n                String8           indent,\n                Arch              arch,\n                U64               image_base,\n                U64               sect_off,\n                U64               marker_count,\n                RD_Marker        *markers,\n                String8           raw_code)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64   bytes_buffer_max = 256;\n  char *bytes_buffer     = push_array(scratch.arena, char, bytes_buffer_max);\n  \n  U64     decode_off    = 0;\n  U64     marker_cursor = 0;\n  String8 to_decode     = raw_code;\n  \n  for (; to_decode.size > 0; ) {\n    Temp temp = temp_begin(scratch.arena);\n    \n    // decode instruction\n    U64             addr          = image_base + sect_off + decode_off;\n    RD_DisasmResult disasm_result = rd_disasm_next_instruction(temp.arena, arch, addr, to_decode);\n    \n    // format instruction bytes\n    String8 bytes;\n    {\n      U64 bytes_size = 0;\n      for (U64 i = 0; i < disasm_result.size; ++i) {\n        bytes_size += raddbg_snprintf(bytes_buffer + bytes_size, bytes_buffer_max-bytes_size, \"%s%02x\", i > 0 ? \" \" : \"\", to_decode.str[i]);\n      }\n      bytes = str8((U8*)bytes_buffer, bytes_size);\n    }\n    \n    // print address marker\n    if (marker_cursor < marker_count) {\n      RD_Marker *m = &markers[marker_cursor];\n      // NOTE: markers must be sorted on address\n      if (decode_off <= m->off && m->off < decode_off + disasm_result.size) {\n        if (m->off != decode_off) {\n          U64 off = m->off - decode_off;\n          rd_printf(\"; %S+%#llx\", m->string, addr);\n        } else {\n          rd_printf(\"; %S\", m->string);\n        }\n        marker_cursor += 1;\n      }\n    }\n    \n    // print final line\n    rd_printf(\"%#08x: %-32S %S\", addr, bytes, disasm_result.text);\n    \n    // advance\n    to_decode = str8_skip(to_decode, disasm_result.size);\n    decode_off += disasm_result.size;\n    \n    temp_end(temp);\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal String8\nrd_format_hex_array(Arena *arena, U8 *ptr, U64 size)\n{\n  U64   buf_max  = 32 + size * 8;\n  char *buf      = push_array(arena, char, buf_max);\n  U64   buf_size = 0;\n  \n  buf_size += raddbg_snprintf(buf+buf_size, buf_max-buf_size, \"{ \");\n  for (U64 i = 0; i < size; ++i) {\n    buf_size += raddbg_snprintf(buf+buf_size, buf_max-buf_size, \"%s0x%02x\", i>0 ? \", \" : \"\", ptr[i]);\n  }\n  buf_size += raddbg_snprintf(buf+buf_size, buf_max-buf_size, \" }\");\n  \n  buf[buf_size] = '\\0';\n  \n  String8 result = str8((U8*)buf, buf_size);\n  return result;\n}\n\ninternal void\nrd_print_raw_data(Arena       *arena,\n                  String8List *out,\n                  String8      indent,\n                  U64          bytes_per_row,\n                  U64          marker_count,\n                  RD_Marker   *markers,\n                  String8      raw_data)\n{\n  AssertAlways(bytes_per_row > 0);\n  \n  char temp_buffer[1024];\n  \n  String8 to_format = raw_data;\n  for (; to_format.size > 0; ) {\n    String8 raw_row = str8_prefix(to_format, bytes_per_row);\n    \n    U64 temp_cursor = 0;\n    \n    // offset\n    U64 offset = (U64)(raw_row.str-raw_data.str);\n    temp_cursor += raddbg_snprintf(temp_buffer+temp_cursor, sizeof(temp_buffer)-temp_cursor, \"%#08llx: \", offset);\n    \n    // hex\n    for (U64 i = 0; i < raw_row.size; ++i) {\n      U8 b = raw_row.str[i];\n      temp_cursor += raddbg_snprintf(temp_buffer+temp_cursor, sizeof(temp_buffer)-temp_cursor, \"%s%02x\", i>0 ? \" \" : \"\", b);\n    }\n    U64 hex_indent_size = (bytes_per_row - raw_row.size) * 3;\n    MemorySet(temp_buffer+temp_cursor, ' ', hex_indent_size);\n    temp_cursor += hex_indent_size;\n    \n    temp_cursor += raddbg_snprintf(temp_buffer+temp_cursor, sizeof(temp_buffer) - temp_cursor, \" \");\n    \n    // ascii\n    for (U64 i = 0; i < raw_row.size; ++i) {\n      U8 b = raw_row.str[i];\n      U8 c = b;\n      if (c < ' ' || c > '~') {\n        c = '.';\n      }\n      temp_cursor += raddbg_snprintf(temp_buffer+temp_cursor, sizeof(temp_buffer)-temp_cursor, \"%c\", c);\n    }\n    \n    rd_printf(\"%.*s\", temp_cursor, temp_buffer);\n    \n    // advance\n    to_format = str8_skip(to_format, bytes_per_row);\n  }\n}\n\n// CodeView\n\ninternal String8\ncv_string_from_reg_off(Arena *arena, CV_Arch arch, U32 reg_idx, U32 reg_off)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 reg_str = cv_string_from_reg_id(scratch.arena, arch, reg_idx);\n  String8 result  = rd_string_from_reg_off(arena, reg_str, reg_off);\n  scratch_end(scratch);\n  return result;\n}\n\ninternal void\ncv_print_binary_annots(Arena *arena, String8List *out, String8 indent, CV_Arch arch, String8 raw_data)\n{\n  if (raw_data.size) {\n    Temp scratch = scratch_begin(&arena, 1);\n    \n    rd_printf(\"Binary Annotations:\");\n    rd_indent();\n    \n    U64 cursor = 0;\n    for (; cursor < raw_data.size; ) {\n      String8List op_list = {0};\n      \n      U8 op;\n      cursor += str8_deserial_read_struct(raw_data, cursor, &op);\n      if (op == CV_InlineBinaryAnnotation_Null) {\n        break;\n      }\n      \n      U8 params[2];\n      U32 param_count = (op == CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset) ? 2 : 1;\n      cursor += str8_deserial_read_array(raw_data, cursor, &params[0], param_count);\n      \n      String8 opcode_str = cv_string_from_binary_opcode(op);\n      str8_list_pushf(scratch.arena, &op_list, \"%S\", opcode_str);\n      for (U32 i = 0; i < param_count; ++i) {\n        str8_list_pushf(scratch.arena, &op_list, \" %x\", params[i]);\n      }\n      \n      String8 op_str = str8_list_join(scratch.arena, &op_list, &(StringJoin){.sep=str8_lit(\" \")});\n      rd_printf(\"%S\", op_str);\n    }\n    rd_unindent();\n    \n    rd_printf(\"Binary Annotations Length: %u bytes (%u bytes padding)\", raw_data.size, raw_data.size - cursor);\n    \n    scratch_end(scratch);\n  }\n}\n\ninternal void\ncv_print_lvar_addr_range(Arena *arena, String8List *out, String8 indent, CV_LvarAddrRange range)\n{\n  rd_printf(\"Address Range: %04x:%08x Size: %#x\", range.sec, range.off, range.len);\n}\n\ninternal void\ncv_print_lvar_addr_gap(Arena *arena, String8List *out, String8 indent, String8 raw_data)\n{\n  U64 count = raw_data.size / sizeof(CV_LvarAddrGap);\n  if (count > 0) {\n    U64 cursor = 0;\n    rd_printf(\"# Address Gaps\");\n    rd_indent();\n    for (U64 i = 0; i < count; ++i) {\n      CV_LvarAddrGap gap = {0};\n      cursor += str8_deserial_read_struct(raw_data, cursor, &gap);\n      rd_printf(\"Off: %#x, Len %#x\", gap.off, gap.len);\n    }\n    rd_unindent();\n  }\n}\n\ninternal void\ncv_print_lvar_attr(Arena *arena, String8List *out, String8 indent, CV_LocalVarAttr attr)\n{\n  Temp scratch = scratch_begin(&arena,1);\n  rd_printf(\"Address: %S\", cv_string_sec_off(scratch.arena, attr.seg, attr.off));\n  rd_printf(\"Flags:   %S\", cv_string_from_local_flags(scratch.arena, attr.flags));\n  scratch_end(scratch);\n}\n\ninternal void\ncv_print_symbol(Arena *arena, String8List *out, String8 indent, CV_Arch arch, CV_TypeIndex min_itype, CV_SymKind type, String8 raw_symbol)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  U64 cursor = 0;\n  switch (type) {\n    case CV_SymKind_THUNK32_ST:\n    case CV_SymKind_THUNK32: {\n      CV_SymThunk32 sym  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name   : %S\",  name);\n      rd_printf(\"Parent : %#x\", sym.parent);\n      rd_printf(\"End    : %#x\", sym.end);\n      rd_printf(\"Next   : %#x\", sym.next);\n      rd_printf(\"Address: %S\",  cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n      rd_printf(\"Length : %u\",  sym.len);\n      rd_printf(\"Ordinal: %S\",  cv_string_from_thunk_ordinal(sym.ord));\n    } break;\n    case CV_SymKind_FILESTATIC: {\n      CV_SymFileStatic sym   = {0};\n      String8          name = str8_zero();\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      rd_printf(\"Name : %S\", name);\n      rd_printf(\"Type : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Flags: %S\", cv_string_from_local_flags(scratch.arena, sym.flags));\n    } break;\n    case CV_SymKind_CALLERS:\n    case CV_SymKind_CALLEES: {\n      CV_SymFunctionList sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      CV_TypeIndex *funcs = push_array(scratch.arena, CV_TypeIndex, sym.count);\n      cursor += str8_deserial_read_array(raw_symbol, cursor, &funcs[0], sym.count);\n      U32  invocation_count = (raw_symbol.size - cursor) / sizeof(U32);\n      U32 *invocations      = push_array(arena, U32, invocation_count);\n      cursor += str8_deserial_read_array(raw_symbol, cursor, &invocations[0], invocation_count);\n      \n      rd_printf(\"Count: %u\", sym.count);\n      rd_indent();\n      for (U32 i = 0; i < sym.count; ++i) {\n        U32 invoks = i < invocation_count ? invocations[i] : 0;\n        rd_printf(\"%#08x (%u)\", funcs[i], invoks);\n      }\n      rd_unindent();\n    } break;\n    case CV_SymKind_INLINEES: {\n      CV_SymInlinees sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Count: %u\", sym.count);\n      rd_indent();\n      for (U32 i = 0; i < sym.count; ++i) {\n        U32 itype;\n        cursor += str8_deserial_read_struct(raw_symbol, cursor, &itype);\n        rd_printf(\"%S\", cv_string_from_itype(arena, min_itype, itype));\n      }\n      rd_unindent();\n    } break;\n    case CV_SymKind_INLINESITE: {\n      CV_SymInlineSite sym         = {0};\n      String8          raw_annots = str8_skip(raw_symbol, sizeof(CV_SymInlineSite));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += raw_annots.size;\n      \n      rd_printf(\"Parent : %#x\", sym.parent);\n      rd_printf(\"End    : %#x\", sym.end);\n      rd_printf(\"Inlinee: %S\",  cv_string_from_itemid(arena, sym.inlinee));\n      cv_print_binary_annots(arena, out, indent, arch, raw_annots);\n    } break;\n    case CV_SymKind_INLINESITE2: {\n      CV_SymInlineSite2 sym        = {0};\n      String8           raw_annots = str8_skip(raw_symbol, sizeof(CV_SymInlineSite2));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += raw_annots.size;\n      \n      rd_printf(\"Parent     : %#x\", sym.parent_off);\n      rd_printf(\"End        : %#x\", sym.end_off);\n      rd_printf(\"Inlinee    : %S\",  cv_string_from_itemid(arena, sym.inlinee));\n      rd_printf(\"Invocations: %u\",  sym.invocations);\n      cv_print_binary_annots(arena, out, indent, arch, raw_annots);\n    } break;\n    case CV_SymKind_INLINESITE_END: {\n      // nothing to report\n    } break;\n    case CV_SymKind_LTHREAD32_ST:\n    case CV_SymKind_GTHREAD32_ST:\n    case CV_SymKind_LTHREAD32:\n    case CV_SymKind_GTHREAD32: {\n      CV_SymThread32 sym  = {0};\n      String8        name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name       : %S\", name);\n      rd_printf(\"TSL Address: %S\", cv_string_sec_off(scratch.arena, sym.tls_seg, sym.tls_off));\n      rd_printf(\"Type       : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_OBJNAME: {\n      CV_SymObjName sym  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name     : %S\",  name);\n      rd_printf(\"Signature: %#x\", sym.sig);\n    } break;\n    case CV_SymKind_BLOCK32_ST:\n    case CV_SymKind_BLOCK32: {\n      CV_SymBlock32 sym  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Parent : %#x\", sym.parent);\n      rd_printf(\"End    : %#x\", sym.end);\n      rd_printf(\"Address: %S\",  cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n      rd_printf(\"Length : %u\",  sym.len);\n      rd_printf(\"Name   : %S\",  name);\n      if (name.size) {\n      }\n    } break;\n    case CV_SymKind_LABEL32_ST:\n    case CV_SymKind_LABEL32: {\n      CV_SymLabel32 sym  = {0};\n      String8       name = str8_zero();\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Address: %S, Flags: %S, Name: %S\", cv_string_sec_off(scratch.arena, sym.sec, sym.off), cv_string_from_proc_flags(scratch.arena, sym.flags), name);\n    } break;\n    case CV_SymKind_COMPILE: {\n      Assert(!\"TODO: test\");\n      CV_SymCompile sym            = {0};\n      String8       version_string = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &version_string);\n      \n      U32     language     = CV_CompileFlags_Extract_Language(sym.flags);\n      U32     float_prec   = CV_CompileFlags_Extract_FloatPrec(sym.flags);\n      U32     float_pkg    = CV_CompileFlags_Extract_FloatPkg(sym.flags);\n      U32     ambient_data = CV_CompileFlags_Extract_AmbientData(sym.flags);\n      U32     mode         = CV_CompileFlags_Extract_Mode(sym.flags);\n      rd_printf(\"Arch          : %#x (%S)\", sym.machine, cv_string_from_arch(sym.machine));\n      rd_printf(\"Language      : %#x (%S)\", language, cv_string_from_language(language));\n      rd_printf(\"FloatPrec     : %#x\",      float_prec);\n      rd_printf(\"FloatPkg      : %#x\",      float_pkg);\n      rd_printf(\"Ambient Data  : %#x\",      ambient_data);\n      rd_printf(\"Mode          : %#x\",      mode);\n      rd_printf(\"Version String: %S\",       version_string);\n    } break;\n    case CV_SymKind_COMPILE2_ST:\n    case CV_SymKind_COMPILE2: {\n      Assert(!\"TODO: test\");\n      CV_SymCompile2 sym            = {0};\n      String8        version_string = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &version_string);\n      \n      U32 language = CV_Compile2Flags_Extract_Language(sym.flags);\n      rd_printf(\"Machine         : %#x (%S)\", sym.machine, cv_string_from_arch(sym.machine));\n      rd_printf(\"Flags           : %#x\",      sym.flags);\n      rd_printf(\"Language        : %#x (%S)\", language, cv_string_from_language(language));\n      rd_printf(\"Frontend Version: %u.%u\",    sym.ver_fe_major, sym.ver_fe_minor);\n      rd_printf(\"Frontend Build  : %u\",       sym.ver_fe_build);\n      rd_printf(\"Backend Version : %u.%u\",    sym.ver_major, sym.ver_minor);\n      rd_printf(\"Backend Build   : %u\",       sym.ver_build);\n      rd_printf(\"Version String  : %S\",       version_string);\n    } break;\n    case CV_SymKind_COMPILE3: {\n      CV_SymCompile3 sym            = {0};\n      String8        version_string = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &version_string);\n      \n      U32 language = CV_Compile3Flags_Extract_Language(sym.flags);\n      rd_printf(\"Machine         : %#x (%S)\", sym.machine, cv_string_from_arch(sym.machine));\n      rd_printf(\"Flags           : %#x\",      sym.flags);\n      rd_printf(\"Language        : %#x (%S)\", language, cv_string_from_language(language));\n      rd_printf(\"Frontend Version: %u.%u\",    sym.ver_fe_major, sym.ver_fe_minor);\n      rd_printf(\"Frontend Build  : %u\",       sym.ver_fe_build);\n      rd_printf(\"Fontend QFE     : %u\",       sym.ver_feqfe);\n      rd_printf(\"Backend Version : %u.%u\",    sym.ver_major, sym.ver_minor);\n      rd_printf(\"Backend Build   : %u\",       sym.ver_build);\n      rd_printf(\"Backend QFE     : %u\",       sym.ver_qfe);\n      rd_printf(\"Version String  : %S\",       version_string);\n    } break;\n    case CV_SymKind_GPROC32_ST:\n    case CV_SymKind_LPROC32_ST:\n    case CV_SymKind_GPROC32_ID:\n    case CV_SymKind_LPROC32_ID:\n    case CV_SymKind_LPROC32:\n    case CV_SymKind_GPROC32: {\n      CV_SymProc32 sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      String8 name = str8_zero();\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name       : %S\",       name);\n      rd_printf(\"Parent     : %#x\",      sym.parent);\n      rd_printf(\"End        : %#x\",      sym.end);\n      rd_printf(\"Next       : %#x\",      sym.next);\n      rd_printf(\"Address    : %S\",       cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n      rd_printf(\"Length     : %u\",       sym.len);\n      rd_printf(\"Type       : %S\",       cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Flags      : %#x (%S)\", sym.flags, cv_string_from_proc_flags(scratch.arena, sym.flags));\n      rd_printf(\"Debug Start: %#x\",      sym.dbg_start);\n      rd_printf(\"Debug End  : %#x\",      sym.dbg_end);\n    } break;\n    case CV_SymKind_LDATA32_ST:\n    case CV_SymKind_GDATA32_ST:\n    case CV_SymKind_GDATA32:\n    case CV_SymKind_LDATA32: {\n      CV_SymData32 sym  = {0};\n      String8      name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name   : %S\", name);\n      rd_printf(\"Type   : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Address: %S\", cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n    } break;\n    case CV_SymKind_CONSTANT_ST:\n    case CV_SymKind_CONSTANT: {\n      CV_SymConstant   sym  = {0};\n      CV_NumericParsed size = {0};\n      String8          name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += cv_read_numeric(raw_symbol, cursor, &size);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name: %S\", name);\n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Size: %S\", cv_string_from_numeric(scratch.arena, size));\n    } break;\n    case CV_SymKind_FRAMEPROC: {\n      CV_SymFrameproc sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      String8 flags     = cv_string_from_frame_proc_flags(scratch.arena, sym.flags);\n      U32     local_ptr = CV_FrameprocFlags_Extract_LocalBasePointer(sym.flags);\n      U32     param_ptr = CV_FrameprocFlags_Extract_ParamBasePointer(sym.flags);\n      rd_printf(\"Frame Size         : %#x\", sym.frame_size);\n      rd_printf(\"Pad Size           : %#x\", sym.pad_size);\n      rd_printf(\"Pad Offset         : %#x\", sym.pad_off);\n      rd_printf(\"Save Registers Area: %u\",  sym.save_reg_size);\n      rd_printf(\"Exception Handler  : %S\",  cv_string_sec_off(arena, sym.eh_sec, sym.eh_off));\n      rd_printf(\"Flags              : %S\",  flags);\n      rd_printf(\"Local pointer      : %S\",  cv_string_from_reg_id(scratch.arena, arch, cv_map_encoded_base_pointer(arch, local_ptr)));\n      rd_printf(\"Param pointer      : %S\",  cv_string_from_reg_id(scratch.arena, arch, cv_map_encoded_base_pointer(arch, param_ptr)));\n    } break;\n    case CV_SymKind_LOCAL: {\n      CV_SymLocal sym  = {0};\n      String8     name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name : %S\", name);\n      rd_printf(\"Type : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Flags: %S\", cv_string_from_local_flags(scratch.arena, sym.flags));\n    } break;\n    case CV_SymKind_DEFRANGE: {\n      CV_SymDefrange sym      = {0};\n      String8        raw_gaps = str8_skip(raw_symbol, sizeof(CV_SymDefrange));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += raw_gaps.size;\n      \n      rd_printf(\"Program: %#x\", sym.program);\n      cv_print_lvar_addr_range(arena, out, indent, sym.range);\n      cv_print_lvar_addr_gap(arena, out, indent, raw_gaps);\n    } break;\n    case CV_SymKind_DEFRANGE_REGISTER: {\n      CV_SymDefrangeRegister sym      = {0};\n      String8                raw_gaps = str8_skip(raw_symbol, sizeof(CV_SymDefrangeRegisterRel));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += raw_gaps.size;\n      \n      rd_printf(\"Register  : %S\", cv_string_from_reg_id(scratch.arena, arch, sym.reg));\n      rd_printf(\"Attributes: %S\", cv_string_from_range_attribs(scratch.arena, sym.attribs));\n      cv_print_lvar_addr_range(arena, out, indent, sym.range);\n      cv_print_lvar_addr_gap(arena, out, indent, raw_gaps);\n    } break;\n    case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL: {\n      CV_SymDefrangeFramepointerRel sym      = {0};\n      String8                       raw_gaps = str8_skip(raw_symbol, sizeof(CV_SymDefrangeFramepointerRel));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Offset: %#x\", sym.off);\n      cv_print_lvar_addr_range(arena, out, indent, sym.range);\n      cv_print_lvar_addr_gap(arena, out, indent, raw_gaps);\n    } break;\n    case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER: {\n      CV_SymDefrangeSubfieldRegister sym      = {0};\n      String8                        raw_gaps = str8_skip(raw_symbol, sizeof(CV_SymDefrangeSubfieldRegister));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += raw_gaps.size;\n      \n      rd_printf(\"Register     : %#x (%S)\", sym.reg, cv_string_from_reg_id(scratch.arena, arch, sym.reg));\n      rd_printf(\"Attributes   : %#x (%S)\", sym.attribs, cv_string_from_range_attribs(scratch.arena, sym.attribs));\n      rd_printf(\"Parent Offset: %#x\",      sym.field_offset);\n      cv_print_lvar_addr_range(arena, out, indent, sym.range);\n      cv_print_lvar_addr_gap(arena, out, indent, raw_gaps);\n    } break;\n    case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: {\n      CV_SymDefrangeFramepointerRelFullScope sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      rd_printf(\"Offset: %#x\", sym.off);\n    } break;\n    case CV_SymKind_DEFRANGE_REGISTER_REL: {\n      CV_SymDefrangeRegisterRel sym      = {0};\n      String8                   raw_gaps = str8_skip(raw_symbol, sizeof(CV_SymDefrangeRegisterRel));\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += raw_gaps.size;\n      \n      rd_printf(\"Flags  : %#x (%S)\", sym.flags, cv_string_from_defrange_register_rel_flags(scratch.arena, sym.flags));\n      rd_printf(\"Address: %S\",       cv_string_from_reg_off(scratch.arena, arch, sym.reg, sym.reg_off));\n      cv_print_lvar_addr_gap(arena, out, indent, raw_gaps);\n    } break;\n    case CV_SymKind_END:\n    case CV_SymKind_PROC_ID_END: {\n      // no data\n    } break;\n    case CV_SymKind_UDT_ST:\n    case CV_SymKind_UDT: {\n      CV_SymUDT sym  = {0};\n      String8   name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name: %S\", name);\n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_BUILDINFO: {\n      CV_SymBuildInfo sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      rd_printf(\"ID: %#x\", sym.id);\n    } break;\n    case CV_SymKind_UNAMESPACE_ST:\n    case CV_SymKind_UNAMESPACE: {\n      String8 name = {0};\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name: %S\", name);\n    } break;\n    case CV_SymKind_REGREL32_ST:\n    case CV_SymKind_REGREL32: {\n      CV_SymRegrel32 sym  = {0};\n      String8        name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Address: %S, Type: %S, Name: %S\",\n                cv_string_from_reg_off(scratch.arena, arch, sym.reg, sym.reg_off),\n                cv_string_from_itype(scratch.arena, min_itype, sym.itype),\n                name);\n    } break;\n    case CV_SymKind_CALLSITEINFO: {\n      CV_SymCallSiteInfo sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Address: %S\", cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n      rd_printf(\"Pad    : %u\", sym.pad);\n      rd_printf(\"Type   : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_FRAMECOOKIE: {\n      CV_SymFrameCookie sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Address: %S\",       cv_string_sec_off(arena, sym.reg, sym.off));\n      rd_printf(\"Kind   : %#x (%S)\", sym.kind, cv_string_from_frame_cookie_kind(sym.kind));\n      rd_printf(\"Flags  : %#x\",      sym.flags); // TODO: llvm and cvinfo.h don't define these flags...\n    } break;\n    case CV_SymKind_HEAPALLOCSITE: {\n      CV_SymHeapAllocSite sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      String8 addr  = cv_string_sec_off(arena, sym.sec, sym.off);\n      String8 itype = cv_string_from_itype(arena, min_itype, sym.itype);\n      rd_printf(\"Address                : %S\", addr);\n      rd_printf(\"Type                   : %S\", itype);\n      rd_printf(\"Call instruction length: %x\", sym.call_inst_len);\n    } break;\n    case CV_SymKind_ALIGN: {\n      // spec:\n      // Unused data. Use the length field that precedes every symbol record\n      // to skip this record. The pad bytes must be zero. For sstGlobalSym\n      // and sstGlobalPub, the length of the pad field must be at least the\n      // sizeof (long). There must be an S_Align symbol at the end of these\n      // tables with a pad field containing 0xffffffff. The sstStaticSym table\n      // does not have this requirement\n    } break;\n    case CV_SymKind_SKIP: {\n      // Unused data, tools use this symbol to reserve space for future expansion\n      // in incremental builds.\n    } break;\n    case CV_SymKind_ENDARG: {\n      // spec:\n      // This symbol specifies the end of symbol records used in formal arguments for a function. Use of\n      // this symbol is optional for OMF and required for MIPS-compiled code. In OMF format, the end\n      // of arguments can also be deduced from the fact that arguments for a function have a positive\n      // offset from the frame pointer.\n    } break;\n    case CV_SymKind_CVRESERVE: {\n      // Reserved for MS debugger\n    } break;\n    case CV_SymKind_SSEARCH: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymStartSearch sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Start Symbol: %#x\", sym.start_symbol);\n      rd_printf(\"Segment     : %#x\", sym.segment);\n    } break;\n    case CV_SymKind_RETURN: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymReturn sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Flags     : %#x (%S)\", sym.flags, cv_string_from_generic_flags(scratch.arena, sym.flags));\n      rd_printf(\"Style     : %#x (%S)\", sym.style, cv_string_from_generic_style(sym.style));\n      if (sym.style == CV_GenericStyle_REG) {\n        U8 count = 0;\n        cursor += str8_deserial_read_struct(raw_symbol, cursor, &count);\n        \n        String8 data = rd_format_hex_array(scratch.arena, raw_symbol.str, raw_symbol.size);\n        rd_printf(\"Byte Count: %u\", count);\n        rd_printf(\"Data      : %S\", data);\n      }\n    } break;\n    case CV_SymKind_ENTRYTHIS: {\n      Assert(!\"TODO: test\");\n      \n      U16 symbol_size = 0, symbol_type = 0;\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &symbol_size);\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &symbol_type);\n      String8 raw_subsym = str8_skip(raw_symbol, cursor);\n      \n      cv_print_symbol(arena, out, indent, arch, min_itype, type, raw_subsym);\n    } break;\n    case CV_SymKind_SLINK32: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymSLink32 sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Frame Size: %x\", sym.frame_size);\n      rd_printf(\"Address   : %S\", cv_string_from_reg_off(scratch.arena, arch, sym.reg, sym.offset));\n    } break;\n    case CV_SymKind_OEM: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymOEM sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      // TODO: Not clear what to do about user data that follows, are we supposed to assume that\n      // rest of the range is it? \n      //\n      // CV-spec doesn't even mention S_OEM just LF_OEM and cvdump.exe prints out type with guid...\n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"ID  : %S\", string_from_guid(scratch.arena, sym.id));\n    } break;\n    case CV_SymKind_VFTABLE32:{\n      Assert(!\"TODO: test\");\n      \n      CV_SymVPath32 sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Root   : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.root));\n      rd_printf(\"Path   : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.path));\n      rd_printf(\"Address: %S\", cv_string_sec_off(scratch.arena, sym.seg, sym.off));\n    } break;\n    case CV_SymKind_PUB32_ST:\n    case CV_SymKind_PUB32: {\n      CV_SymPub32 sym  = {0};\n      String8     name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name   : %S\", name);\n      rd_printf(\"Flags  : %S\", cv_string_from_pub32_flags(scratch.arena, sym.flags));\n      rd_printf(\"Address: %S\", cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n    } break;\n    case CV_SymKind_BPREL32_ST:\n    case CV_SymKind_BPREL32: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymBPRel32 sym  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name  : %S\",  name);\n      rd_printf(\"Offset: %#x\", sym.off);\n      rd_printf(\"Type  : %S\",  cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_REGISTER: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymRegister sym  = {0};\n      String8        name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name    : %S\", name);\n      rd_printf(\"Register: %S\", cv_string_from_reg_id(scratch.arena, arch, sym.reg));\n      rd_printf(\"Type    : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_PROCREF_ST:\n    case CV_SymKind_DATAREF_ST:\n    case CV_SymKind_LPROCREF_ST:\n    case CV_SymKind_ANNOTATIONREF:\n    case CV_SymKind_LPROCREF:\n    case CV_SymKind_PROCREF:\n    case CV_SymKind_DATAREF: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymRef2 sym  = {0};\n      String8    name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name                : %S\",  name);\n      rd_printf(\"SUC                 : %#x\", sym.suc_name);\n      rd_printf(\"IMod                : %#x\", sym.imod);\n      rd_printf(\"Symbol Stream Offset: %#x\", sym.sym_off);\n    } break;\n    case CV_SymKind_SEPCODE: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymSepcode sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Parent        : %#x\",      sym.parent);\n      rd_printf(\"End           : %#x\",      sym.end);\n      rd_printf(\"Length        : %u\",       sym.len);\n      rd_printf(\"Flags         : %#x (%S)\", sym.flags, cv_string_from_sepcode(scratch.arena, sym.flags));\n      rd_printf(\"Address       : %S\",       cv_string_sec_off(scratch.arena, sym.sec, sym.sec_off));\n      rd_printf(\"Parent Address: %S\",       cv_string_sec_off(scratch.arena, sym.sec_parent, sym.sec_parent_off));\n    } break;\n    case CV_SymKind_PARAMSLOT_ST:\n    case CV_SymKind_LOCALSLOT_ST:\n    case CV_SymKind_LOCALSLOT: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymSlot sym  = {0};\n      String8    name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name: %S\", name);\n      rd_printf(\"Slot: %u\", sym.slot_index);\n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_TRAMPOLINE: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymTrampoline sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Type      : %S\", cv_string_from_trampoline_kind(sym.kind));\n      rd_printf(\"Thunk Size: %u\", sym.thunk_size);\n      rd_printf(\"Thunk     : %S\", cv_string_sec_off(scratch.arena, sym.thunk_sec, sym.thunk_sec_off));\n      rd_printf(\"Target    : %S\", cv_string_sec_off(scratch.arena, sym.target_sec, sym.target_sec_off));\n    } break;\n    case CV_SymKind_POGODATA: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymPogoInfo sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Invocations                         : %u\", sym.invocations);\n      rd_printf(\"Dynamic instruction count           : %u\", sym.dynamic_inst_count);\n      rd_printf(\"Static instruction count            : %u\", sym.static_inst_count);\n      rd_printf(\"Post inline static instruction count: %u\", sym.post_inline_static_inst_count);\n    } break;\n    case CV_SymKind_MANYREG: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymManyreg sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Type     : %S\", cv_string_from_itype(arena, min_itype, sym.itype));\n      rd_printf(\"Reg Count: %u\", sym.count);\n      rd_printf(\"Regs     :\");\n      rd_indent();\n      for (U8 i = 0; i < sym.count; ++i) {\n        U8 v = 0;\n        cursor += str8_deserial_read_struct(raw_symbol, cursor, &v);\n        rd_printf(\"%S\", cv_string_from_reg_id(scratch.arena, arch, v));\n      }\n      rd_unindent();\n    } break;\n    case CV_SymKind_MANYREG2_ST:\n    case CV_SymKind_MANYREG2: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymManyreg sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Type     : %S\", cv_string_from_itype(arena, min_itype, sym.itype));\n      rd_printf(\"Reg Count: %u\", sym.count);\n      rd_printf(\"Regs     :\");\n      rd_indent();\n      for (U16 i = 0; i < sym.count; ++i) {\n        U16 v = 0;\n        cursor += str8_deserial_read_struct(raw_symbol, cursor, &v);\n        rd_printf(\"%S\", cv_string_from_reg_id(scratch.arena, arch, v));\n      }\n      rd_unindent();\n    } break;\n    case CV_SymKind_SECTION: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymSection sym  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name           : %S\",  name);\n      rd_printf(\"Index          : %u\",  sym.sec_index);\n      rd_printf(\"Align          : %u\",  sym.align);\n      rd_printf(\"Virtual Offset : %#x\", sym.rva);\n      rd_printf(\"Size           : %u\",  sym.size);\n      rd_printf(\"Characteristics: %S\",  coff_string_from_section_flags(scratch.arena, sym.characteristics));\n    } break;\n    case CV_SymKind_ENVBLOCK: {\n      CV_SymEnvBlock sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      for (; cursor < raw_symbol.size; ) {\n        String8 id = str8_zero();\n        cursor += str8_deserial_read_cstr(raw_symbol, cursor, &id);\n        String8 path = str8_zero();\n        cursor += str8_deserial_read_cstr(raw_symbol, cursor, &path);\n        if (id.size == 0 && path.size == 0) {\n          break;\n        }\n        rd_printf(\"%S = %S\", id, path);\n      }\n    } break;\n    case CV_SymKind_COFFGROUP: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymCoffGroup sym  = {0};\n      String8         name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name           : %S\",       name);\n      rd_printf(\"Size           : %u\",       sym.size);\n      rd_printf(\"Characteristics: %#x (%S)\", sym.characteristics, coff_string_from_section_flags(scratch.arena, sym.characteristics));\n      rd_printf(\"Address        : %S\",       cv_string_sec_off(scratch.arena, sym.sec, sym.off));\n    } break;\n    case CV_SymKind_EXPORT: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymExport sym  = {0};\n      String8      name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name   : %S\",  name);\n      rd_printf(\"Ordinal: %#x\", sym.ordinal);\n      rd_printf(\"Flags  : %S\",  cv_string_from_export_flags(scratch.arena, sym.flags));\n    } break;\n    case CV_SymKind_ANNOTATION: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymAnnotation sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Address    : %S\", cv_string_sec_off(scratch.arena, sym.seg, sym.off));\n      rd_printf(\"Count      : %u\", sym.count);\n      rd_printf(\"Annotations:\");\n      rd_indent();\n      for (U16 i = 0; i < sym.count; ++i) {\n        String8 str = str8_zero();\n        cursor += str8_deserial_read_cstr(raw_symbol, cursor, &str);\n        rd_printf(\"%S\", str);\n      }\n      rd_unindent();\n    } break;\n    case CV_SymKind_MANFRAMEREL:\n    case CV_SymKind_ATTR_FRAMEREL: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymAttrFrameRel sym  = {0};\n      String8            name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name  : %S\",  name);\n      rd_printf(\"Offset: %#x\", sym.off);\n      rd_printf(\"Type  : %S\",  cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      cv_print_lvar_attr(arena, out, indent, sym.attr);\n    } break;\n    case CV_SymKind_MANREGISTER:\n    case CV_SymKind_ATTR_REGISTER: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymAttrReg sym  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name    : %S\", name);\n      rd_printf(\"Type    : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Register: %S\", cv_string_from_reg_id(scratch.arena, arch, sym.reg));\n      cv_print_lvar_attr(arena, out, indent, sym.attr);\n    } break;\n    case CV_SymKind_ATTR_REGREL: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymAttrRegRel sym  = {0};\n      String8          name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name   : %S\", name);\n      rd_printf(\"Type   : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      rd_printf(\"Address: %S\", cv_string_from_reg_off(scratch.arena, arch, sym.reg, sym.off));\n      cv_print_lvar_attr(arena, out, indent, sym.attr);\n    } break;\n    case CV_SymKind_MANYREG_ST:\n    case CV_SymKind_MANMANYREG:\n    case CV_SymKind_ATTR_MANYREG: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymAttrManyReg sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      U8 *regs = push_array(scratch.arena, U8, sym.count);\n      cursor += str8_deserial_read_array(raw_symbol, cursor, &regs[0], sym.count);\n      String8 name = str8_zero();\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name     : %S\", name);\n      rd_printf(\"Type     : %S\", cv_string_from_itype(scratch.arena, min_itype, sym.itype));\n      cv_print_lvar_attr(arena, out, indent, sym.attr);\n      rd_printf(\"Reg Count: %u\", sym.count);\n      rd_printf(\"Regs     :\");\n      rd_indent();\n      for (U8 i = 0; i < sym.count; ++i) {\n        rd_printf(\"%S\", cv_string_from_reg_id(scratch.arena, arch, regs[i]));\n      }\n      rd_unindent();\n    } break;\n    case CV_SymKind_MOD_TYPEREF: {\n      \n      Assert(!\"TODO: test\");\n      \n      CV_SymModTypeRef sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      String8List flags_list = {0};\n      if (sym.flags & CV_ModTypeRefFlag_None) {\n        str8_list_pushf(scratch.arena, &flags_list, \"No TypeRef\");\n      } else if (sym.flags & CV_ModTypeRefFlag_OwnTMR) {\n        str8_list_pushf(scratch.arena, &flags_list, \"/Z7 TypeRef, SN=%04X\", sym.word0);\n        if (sym.flags & CV_ModTypeRefFlag_OwnTMPCT) {\n          str8_list_pushf(scratch.arena, &flags_list, \"own PCH types\");\n        }\n        if (sym.flags & CV_ModTypeRefFlag_RefTMPCT) {\n          str8_list_pushf(scratch.arena, &flags_list, \"reference PCH types in module %04X\", (sym.word1+1));\n        }\n      } else {\n        str8_list_pushf(scratch.arena, &flags_list, \"/Zi TypeRef\");\n        if (sym.flags & CV_ModTypeRefFlag_OwnTM) {\n          str8_list_pushf(scratch.arena, &flags_list, \"SN=%04X (type), SN=%04X (ID)\", sym.word0, sym.word1);\n        }\n        if (sym.flags & CV_ModTypeRefFlag_RefTM) {\n          str8_list_pushf(scratch.arena, &flags_list, \"shared with Module %04X\", sym.word0+1);\n        }\n      }\n      String8 flags_str = str8_list_join(scratch.arena, &flags_list, &(StringJoin){.sep=str8_lit(\", \")});\n      \n      rd_printf(\"%S\", flags_str);\n    } break;\n    case CV_SymKind_DISCARDED: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymDiscarded sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      U32 symbol_type = 0;\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &symbol_type);\n      String8 raw_subsym = str8_skip(raw_symbol, cursor);\n      \n      rd_printf(\"Kind            : %x\", sym.kind);\n      rd_printf(\"File ID         : %x\", sym.file_id);\n      rd_printf(\"File Line Number: %u\", sym.file_ln);\n      rd_printf(\"# Discarded Symbol\");\n      cv_print_symbol(arena, out, indent, arch, min_itype, symbol_type, raw_subsym);\n    } break;\n    case CV_SymKind_PDBMAP: {\n      Assert(!\"TODO: test\");\n      \n      String8 from = {0};\n      String8 to   = {0};\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &from);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &to);\n      \n      rd_printf(\"From: %S\", from);\n      rd_printf(\"To  : %S\", to);\n    } break;\n    case CV_SymKind_FASTLINK: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymFastLink sym  = {0};\n      String8        name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name : %S\",  name);\n      rd_printf(\"Flags: %#x\", sym.flags);\n      rd_printf(\"Type : %S\",  cv_string_from_itype(arena, min_itype, sym.itype));\n    } break;\n    case CV_SymKind_ARMSWITCHTABLE: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymArmSwitchTable sym = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      \n      rd_printf(\"Base Address  : %S\", cv_string_sec_off(scratch.arena, sym.sec_base,   sym.off_base));\n      rd_printf(\"Branch Address: %S\", cv_string_sec_off(scratch.arena, sym.sec_branch, sym.off_branch));\n      rd_printf(\"Table Address : %S\", cv_string_sec_off(scratch.arena, sym.sec_table,  sym.off_table));\n      rd_printf(\"Entry count   : %u\", sym.entry_count);\n      rd_printf(\"Switch Type   : %x\", sym.kind);\n    } break;\n    case CV_SymKind_REF_MINIPDB: {\n      Assert(!\"TODO: test\");\n      \n      CV_SymRefMiniPdb sym  = {0};\n      String8          name = {0};\n      cursor += str8_deserial_read_struct(raw_symbol, cursor, &sym);\n      cursor += str8_deserial_read_cstr(raw_symbol, cursor, &name);\n      \n      rd_printf(\"Name      : %S\", name);\n      rd_printf(\"Flags     : %x\", sym.flags);\n      rd_printf(\"IMod      : %04x\", sym.imod);\n      if (sym.flags & CV_RefMiniPdbFlag_UDT) {\n        rd_printf(\"Type      : %S\", cv_string_from_itype(scratch.arena, min_itype, (CV_TypeIndex)sym.data));\n      } else {\n        rd_printf(\"Coff ISect: %#x\", sym.data);\n      }\n    } break;\n    // COBOL\n    case CV_SymKind_CEXMODEL32:\n    case CV_SymKind_COBOLUDT_ST:\n    case CV_SymKind_COBOLUDT:\n    // Pascal\n    case CV_SymKind_WITH32_ST:\n    case CV_SymKind_WITH32:\n    //~ 16bit\n    case CV_SymKind_REGISTER_16t:\n    case CV_SymKind_CONSTANT_16t:\n    case CV_SymKind_UDT_16t:\n    case CV_SymKind_OBJNAME_ST:\n    case CV_SymKind_COBOLUDT_16t:\n    case CV_SymKind_MANYREG_16t:\n    case CV_SymKind_BPREL16:\n    case CV_SymKind_LDATA16:\n    case CV_SymKind_GDATA16:\n    case CV_SymKind_PUB16:\n    case CV_SymKind_LPROC16:\n    case CV_SymKind_GPROC16:\n    case CV_SymKind_THUNK16:\n    case CV_SymKind_BLOCK16:\n    case CV_SymKind_WITH16:\n    case CV_SymKind_LABEL16:\n    case CV_SymKind_CEXMODEL16:\n    case CV_SymKind_VFTABLE16:\n    case CV_SymKind_REGREL16:\n    case CV_SymKind_TI16_MAX:\n    //~ 16:32 memory model\n    case CV_SymKind_BPREL32_16t:\n    case CV_SymKind_LDATA32_16t:\n    case CV_SymKind_GDATA32_16t:\n    case CV_SymKind_PUB32_16t:\n    case CV_SymKind_LPROC32_16t:\n    case CV_SymKind_GPROC32_16t:\n    case CV_SymKind_VFTABLE32_16t:\n    case CV_SymKind_REGREL32_16t:\n    case CV_SymKind_LTHREAD32_16t:\n    case CV_SymKind_GTHREAD32_16t:\n    case CV_SymKind_LPROCMIPS_16t:\n    case CV_SymKind_GPROCMIPS_16t:\n    // MIPS\n    case CV_SymKind_LPROCMIPS_ST:\n    case CV_SymKind_GPROCMIPS_ST:\n    case CV_SymKind_LPROCMIPS:\n    case CV_SymKind_GPROCMIPS:\n    case CV_SymKind_LPROCIA64:\n    case CV_SymKind_GPROCIA64:\n    case CV_SymKind_LPROCMIPS_ID:\n    case CV_SymKind_GPROCMIPS_ID:\n    // Managed\n    case CV_SymKind_TOKENREF:\n    case CV_SymKind_GMANPROC_ST:\n    case CV_SymKind_LMANPROC_ST:\n    case CV_SymKind_LMANDATA_ST:\n    case CV_SymKind_GMANDATA_ST:\n    case CV_SymKind_MANFRAMEREL_ST:\n    case CV_SymKind_MANREGISTER_ST:\n    case CV_SymKind_MANSLOT_ST:\n    case CV_SymKind_MANTYPREF:\n    case CV_SymKind_MANMANYREG_ST:\n    case CV_SymKind_MANREGREL_ST:\n    case CV_SymKind_MANMANYREG2_ST:\n    case CV_SymKind_MANMANYREG2:\n    case CV_SymKind_MANREGREL:\n    case CV_SymKind_MANSLOT:\n    case CV_SymKind_MANCONSTANT:\n    case CV_SymKind_LMANDATA:\n    case CV_SymKind_GMANDATA:\n    case CV_SymKind_GMANPROC:\n    case CV_SymKind_LMANPROC:\n    // HLSL\n    case CV_SymKind_DEFRANGE_DPC_PTR_TAG:\n    case CV_SymKind_DPC_SYM_TAG_MAP:\n    case CV_SymKind_DEFRANGE_HLSL:\n    case CV_SymKind_GDATA_HLSL:\n    case CV_SymKind_LDATA_HLSL:\n    case CV_SymKind_LPROC32_DPC:\n    case CV_SymKind_LPROC32_DPC_ID:\n    case CV_SymKind_GDATA_HLSL32:\n    case CV_SymKind_LDATA_HLSL32:\n    case CV_SymKind_GDATA_HLSL32_EX:\n    case CV_SymKind_LDATA_HLSL32_EX: \n    // IA64\n    case CV_SymKind_LPROCIA64_ID:\n    case CV_SymKind_GPROCIA64_ID:\n    // VS2005\n    case CV_SymKind_DEFRANGE_2005:\n    case CV_SymKind_DEFRANGE2_2005:\n    case CV_SymKind_ST_MAX: \n    case CV_SymKind_RESERVED1:\n    case CV_SymKind_RESERVED2:\n    case CV_SymKind_RESERVED3:\n    case CV_SymKind_RESERVED4: {\n    } break;\n  }\n  scratch_end(scratch);\n}\n\ninternal U64\ncv_print_leaf(Arena *arena, String8List *out, String8 indent, CV_TypeIndex min_itype, CV_LeafKind kind, String8 raw_leaf)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  U64 cursor = 0;\n  switch (kind) {\n    case CV_LeafKind_NOTYPE: {\n      // empty\n    } break;\n    case CV_LeafKind_BITFIELD: {\n      CV_LeafBitField lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Type    : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      rd_printf(\"Length  : %u\", lf.len);\n      rd_printf(\"Position: %u\", lf.pos);\n    } break;\n    case CV_LeafKind_CLASS2:\n    case CV_LeafKind_STRUCT2: {\n      CV_LeafStruct2   lf  = {0};\n      CV_NumericParsed size = {0};\n      String8          name = str8_zero();\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &size);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name       : %S\",       name);\n      rd_printf(\"Fields     : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.field_itype));\n      rd_printf(\"Properties : %#x (%S)\", lf.props, cv_string_from_type_props(scratch.arena, lf.props));\n      rd_printf(\"Derived    : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.derived_itype));\n      rd_printf(\"VShape     : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.vshape_itype));\n      rd_printf(\"Unknown    : %#x\",      lf.unknown);\n      if (lf.props & CV_TypeProp_HasUniqueName) {\n        String8 unique_name = str8_zero();\n        cursor += str8_deserial_read_cstr(raw_leaf, cursor, &unique_name);\n        rd_printf(\"Unique Name:  %S\", unique_name);\n      }\n    } break;\n    case CV_LeafKind_PRECOMP_ST: \n    case CV_LeafKind_PRECOMP: { \n      CV_LeafPreComp lf   = {0};\n      String8        name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name       : %S\", name);\n      rd_printf(\"Start Index: %x\", lf.start_index);\n      rd_printf(\"Count      : %u\", lf.count);\n      rd_printf(\"Signature  : %x\", lf.sig);\n    } break;\n    case CV_LeafKind_TYPESERVER2: {\n      CV_LeafTypeServer2 lf   = {0};\n      String8            name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name : %S\", name);\n      rd_printf(\"Sig70: %S\", string_from_guid(arena, lf.sig70));\n      rd_printf(\"Age  : %u\", lf.age);\n    } break;\n    case CV_LeafKind_BUILDINFO: {\n      CV_LeafBuildInfo lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Entry Count: %u\", lf.count);\n      rd_indent();\n      for (U16 i = 0; i < lf.count; ++i) {\n        CV_ItemId id = 0;\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &id);\n        rd_printf(\"%S\", cv_string_from_itemid(scratch.arena, id));\n      }\n      rd_unindent();\n    } break;\n    case CV_LeafKind_MFUNC_ID: {\n      CV_LeafMFuncId lf   = {0};\n      String8        name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      rd_printf(\"Name      : %S\", name);\n      rd_printf(\"Owner Type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.owner_itype));\n      rd_printf(\"Type      : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n    } break;\n    case CV_LeafKind_VFUNCTAB: {\n      CV_LeafVFuncTab lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n    } break;\n    case CV_LeafKind_METHODLIST: {\n      for (; cursor < raw_leaf.size; ) {\n        CV_LeafMethodListMember ml = {0};\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &ml);\n        U32 mprop     = CV_FieldAttribs_Extract_MethodProp(ml.attribs);\n        B32 has_vbase = (mprop == CV_MethodProp_PureIntro) || (mprop == CV_MethodProp_Intro);\n        U32 vbase     = 0;\n        if (has_vbase) {\n          cursor += str8_deserial_read_struct(raw_leaf, cursor, &vbase);\n        }\n        rd_printf(\"Attribs     : %#x (%S)\", ml.attribs, cv_string_from_field_attribs(scratch.arena, ml.attribs));\n        rd_printf(\"Type        : %S\",       cv_string_from_itype(scratch.arena, min_itype, ml.itype));\n        if (has_vbase) {\n          rd_printf(\"Virtual Base: %x\", vbase);\n        }\n      }\n    } break;\n    case CV_LeafKind_ONEMETHOD_ST: \n    case CV_LeafKind_ONEMETHOD: {\n      CV_LeafOneMethod lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      U32 mprop     = CV_FieldAttribs_Extract_MethodProp(lf.attribs);\n      B32 has_vbase = (mprop == CV_MethodProp_PureIntro) || (mprop == CV_MethodProp_Intro);\n      U32 vbase     = 0;\n      if (has_vbase) {\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &vbase);\n      }\n      String8 name = {0};\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      rd_printf(\"Name         : %S\",       name);\n      rd_printf(\"Field Attribs: %#x (%S)\", lf.attribs, cv_string_from_field_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Type         : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      if (has_vbase) {\n        rd_printf(\"Virtual Base:  %#x\", vbase);\n      }\n    } break;\n    case CV_LeafKind_METHOD_ST: \n    case CV_LeafKind_METHOD: {\n      CV_LeafMethod lf   = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name     : %S\", name);\n      rd_printf(\"Count    : %u\", lf.count);\n      rd_printf(\"Type List: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.list_itype));\n    } break;\n    case CV_LeafKind_VBCLASS:\n    case CV_LeafKind_IVBCLASS: {\n      CV_LeafVBClass   lf          = {0};\n      CV_NumericParsed vbptr_off   = {0};\n      CV_NumericParsed vbtable_off = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &vbptr_off);\n      cursor += cv_read_numeric(raw_leaf, cursor, &vbtable_off);\n      \n      rd_printf(\"Attribs         : %#x (%S)\", lf.attribs, cv_string_from_field_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Direct Base Type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      rd_printf(\"Virtual Base Ptr: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.vbptr_itype));\n      rd_printf(\"vbpoff          : %S\", cv_string_from_numeric(scratch.arena, vbptr_off));\n      rd_printf(\"vbind           : %S\", cv_string_from_numeric(scratch.arena, vbtable_off));\n    } break;\n    case CV_LeafKind_BCLASS: {\n      CV_LeafBClass    lf     = {0};\n      CV_NumericParsed offset = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &offset);\n      \n      rd_printf(\"Attribs: %#x (%S)\", lf.attribs, cv_string_from_field_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Type   : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      rd_printf(\"Offset : %S\",       cv_string_from_numeric(scratch.arena, offset));\n    } break;\n    case CV_LeafKind_VTSHAPE: {\n      CV_LeafVTShape lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Entry Count: %u\", lf.count);\n      rd_indent();\n      for (U16 i = 0; i < lf.count; ++i) {\n        U8 packed_kind = 0;\n        str8_deserial_read_struct(raw_leaf, cursor + (i / 2), &packed_kind);\n        U8 kind = (packed_kind >> ((i % 2)*4)) & 0xF;\n        rd_printf(\"%S\", cv_string_from_virtual_table_shape_kind(kind));\n      }\n      rd_unindent();\n      cursor += (lf.count * sizeof(U8) + 1) / 2;\n    } break;\n    case CV_LeafKind_STMEMBER_ST: \n    case CV_LeafKind_STMEMBER: {\n      CV_LeafStMember lf   = {0};\n      String8         name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name   : %S\",       name);\n      rd_printf(\"Attribs: %#x (%S)\", lf.attribs, cv_string_from_field_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Type   : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n    } break;\n    case CV_LeafKind_MFUNCTION: {\n      CV_LeafMFunction lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Return Type     : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.ret_itype));\n      rd_printf(\"Class Type      : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.class_itype));\n      rd_printf(\"This Type       : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.this_itype));\n      rd_printf(\"Call Kind       : %#x (%S)\", lf.call_kind, cv_string_from_call_kind(lf.call_kind));\n      rd_printf(\"Function Attribs: %#x (%S)\", lf.attribs, cv_string_from_function_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Argument Count  : %u\", lf.arg_count);\n      rd_printf(\"Argument Type   : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.arg_itype));\n    } break;\n#if 0\n    case CV_LeafKind_SKIP_16t: {\n      CV_LeafSkip_16t lf = {0};\n      cursor += str8_deserial_read_struct(base, range, cursor, &lf);\n      \n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.type));\n    } break;\n#endif\n    case CV_LeafKind_SKIP: {\n      // ms-symbol-pdf:\n      // This is used by incremental compilers to reserve space for indices.\n      CV_LeafSkip lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      rd_printf(\"Type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n    } break;\n    case CV_LeafKind_ENUM_ST: \n    case CV_LeafKind_ENUM: {\n      CV_LeafEnum lf  = {0};\n      String8     name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name       : %S\",       name);\n      rd_printf(\"Field Count: %u\",       lf.count);\n      rd_printf(\"Properties : %#x (%S)\", lf.props, cv_string_from_type_props(scratch.arena, lf.props));\n      rd_printf(\"Type       : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.base_itype));\n      rd_printf(\"Field      : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.field_itype));\n      if (lf.props & CV_TypeProp_HasUniqueName) {\n        String8 unique_name = {0};\n        cursor += str8_deserial_read_cstr(raw_leaf, cursor, &unique_name);\n        rd_printf(\"Unique Name: %S\", unique_name);\n      }\n    } break;\n    case CV_LeafKind_ENUMERATE: {\n      CV_LeafEnumerate lf   = {0};\n      CV_NumericParsed value = {0};\n      String8          name  = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &value);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name   : %S\", name);\n      rd_printf(\"Attribs: %S\", cv_string_from_field_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Value  : %S\", cv_string_from_numeric(scratch.arena, value));\n    } break;\n    case CV_LeafKind_NESTTYPE_ST: \n    case CV_LeafKind_NESTTYPE: {\n      CV_LeafNestType lf  = {0};\n      String8         name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      rd_printf(\"Name : %S\", name);\n      rd_printf(\"Index: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n    } break;\n    case CV_LeafKind_NOTTRAN: {\n      // ms-symbol-pdf: \n      //  This is used when CVPACK encounters a type record that has no equivalent in the Microsoftsymbol information format.\n    } break;\n    case CV_LeafKind_UDT_SRC_LINE: {\n      CV_LeafUDTSrcLine lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Type = %S, Source File = %x, Line = %u\", cv_string_from_itype(scratch.arena, min_itype, lf.udt_itype), lf.src_string_id, lf.line);\n    } break;\n    case CV_LeafKind_STRING_ID: {\n      CV_LeafStringId lf    = {0};\n      String8         string = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &string);\n      \n      rd_printf(\"string    : %S\", string);\n      rd_printf(\"Substrings: %S\", cv_string_from_itemid(arena, lf.substr_list_id)); // TODO: print actual strings instead\n    } break;\n    case CV_LeafKind_POINTER: {\n      CV_LeafPointer lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      CV_PointerKind kind = CV_PointerAttribs_Extract_Kind(lf.attribs);\n      CV_PointerMode mode = CV_PointerAttribs_Extract_Mode(lf.attribs);\n      \n      rd_printf(\"Type   : %S\", cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      rd_printf(\"Attribs: %S\", cv_string_from_pointer_attribs(arena, lf.attribs));\n      rd_indent();\n      if (mode == CV_PointerMode_PtrMem) {\n        CV_TypeIndex         itype = 0;\n        CV_MemberPointerKind pm    = 0;\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &itype);\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &pm);\n        \n        rd_printf(\"Class Type: %S\", cv_string_from_itype(scratch.arena, min_itype, itype));\n        rd_printf(\"Format    : %S\", cv_string_from_member_pointer_kind(pm));\n      } else {\n        if (kind == CV_PointerKind_BaseSeg) {\n          U16 seg;\n          cursor += str8_deserial_read_struct(raw_leaf, cursor, &seg);\n          \n          rd_printf(\"Base Segment: %#04x\", seg);\n        } else if (kind == CV_PointerKind_BaseType) {\n          CV_TypeIndex base_itype = 0;\n          String8      name       = {0};\n          cursor += str8_deserial_read_struct(raw_leaf, cursor, &base_itype);\n          cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n          \n          rd_printf(\"Base Type: %S\", cv_string_from_itype(scratch.arena, min_itype, base_itype));\n          rd_printf(\"Name     : %S\", name);\n        }\n      }\n      rd_unindent();\n    } break;\n    case CV_LeafKind_UNION_ST: \n    case CV_LeafKind_UNION: {\n      CV_LeafUnion     lf   = {0};\n      CV_NumericParsed num  = {0};\n      String8          name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &num);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name       : %S\",       name);\n      rd_printf(\"Field Count: %u\",       lf.count);\n      rd_printf(\"Properties : %#x (%S)\", lf.props, cv_string_from_type_props(scratch.arena, lf.props));\n      rd_printf(\"Field      : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.field_itype));\n      rd_printf(\"Size       : %S\",       cv_string_from_numeric(scratch.arena, num));\n      if (lf.props & CV_TypeProp_HasUniqueName) {\n        String8 unique_name = {0};\n        cursor += str8_deserial_read_cstr(raw_leaf, cursor, &unique_name);\n        rd_printf(\"Unique Name: %S\", unique_name);\n      }\n    } break;\n    case CV_LeafKind_CLASS_ST: \n    case CV_LeafKind_STRUCTURE_ST: \n    case CV_LeafKind_CLASS:\n    case CV_LeafKind_STRUCTURE: {\n      CV_LeafStruct    lf  = {0};\n      CV_NumericParsed num  = {0};\n      String8          name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &num);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name           : %S\",       name);\n      rd_printf(\"Field Count    : %u\",       lf.count);\n      rd_printf(\"Properties     : %#x (%S)\", lf.props, cv_string_from_type_props(scratch.arena, lf.props));\n      rd_printf(\"Field List Type: %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.field_itype));\n      rd_printf(\"Derived Type   : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.derived_itype));\n      rd_printf(\"VShape         : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.vshape_itype));\n      rd_printf(\"Size           : %S\",       cv_string_from_numeric(scratch.arena, num));\n      if (lf.props & CV_TypeProp_HasUniqueName) {\n        String8 unique_name = {0};\n        cursor += str8_deserial_read_cstr(raw_leaf, cursor, &unique_name);\n        rd_printf(\"Unique Name:      %S\", unique_name);\n      }\n    } break;\n    case CV_LeafKind_SUBSTR_LIST:\n    case CV_LeafKind_ARGLIST: {\n      CV_LeafArgList lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Types %u\", lf.count);\n      rd_indent();\n      for (U32 i = 0; i < lf.count; ++i) {\n        U32 itype = 0;\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &itype);\n        rd_printf(\"%S\", cv_string_from_itype(scratch.arena, min_itype, itype));\n      }\n      rd_unindent();\n    } break;\n    case CV_LeafKind_PROCEDURE: {\n      CV_LeafProcedure lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      String8 call_kind    = cv_string_from_call_kind(lf.call_kind);\n      String8 func_attribs = cv_string_from_function_attribs(scratch.arena, lf.attribs);\n      \n      rd_printf(\"Return type       : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.ret_itype));\n      rd_printf(\"Call Convention   : %#x (%S)\", lf.call_kind, call_kind);\n      rd_printf(\"Function Attribs  : %#x (%S)\", lf.attribs, func_attribs);\n      rd_printf(\"Argumnet Count    : %u\",       lf.arg_count);\n      rd_printf(\"Argument List Type: %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.arg_itype));\n    } break;\n    case CV_LeafKind_FUNC_ID: {\n      CV_LeafFuncId lf  = {0};\n      String8       name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name      : %S\",       name);\n      rd_printf(\"Scope Type: %#x (%S)\", lf.scope_string_id, cv_string_from_itype(scratch.arena, min_itype, lf.scope_string_id));\n      rd_printf(\"Type      : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n    } break;\n    case CV_LeafKind_MODIFIER: {\n      CV_LeafModifier lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Type : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      rd_printf(\"Flags: %#x (%S)\", lf.flags, cv_string_from_modifier_flags(scratch.arena, lf.flags));\n    } break;\n    case CV_LeafKind_ARRAY_ST: \n    case CV_LeafKind_ARRAY: {\n      CV_LeafArray     lf  = {0};\n      CV_NumericParsed num  = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &num);\n      \n      rd_printf(\"Entry type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.entry_itype));\n      rd_printf(\"Index type: %S\", cv_string_from_itype(scratch.arena, min_itype, lf.index_itype));\n      rd_printf(\"Length    : %S\", cv_string_from_numeric(scratch.arena, num));\n    } break;\n    case CV_LeafKind_FIELDLIST: {\n      for (U64 idx = 0; cursor < raw_leaf.size;) {\n        U16 member_type = 0;\n        cursor += str8_deserial_read_struct(raw_leaf, cursor, &member_type);\n        String8 raw_member = str8_skip(raw_leaf, cursor);\n        \n        rd_printf(\"list[%u] = %S\", idx++, cv_string_from_leaf_name(arena, member_type));\n        rd_indent();\n        cursor += cv_print_leaf(arena, out, indent, min_itype, member_type, raw_member);\n        cursor  = AlignPow2(cursor, 4);\n        rd_unindent();\n      }\n    } break;\n    case CV_LeafKind_MEMBER_ST:\n    case CV_LeafKind_MEMBER: {\n      CV_LeafMember    lf   = {0};\n      CV_NumericParsed num  = {0};\n      String8          name = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      cursor += cv_read_numeric(raw_leaf, cursor, &num);\n      cursor += str8_deserial_read_cstr(raw_leaf, cursor, &name);\n      \n      rd_printf(\"Name   : %S\",       name);\n      rd_printf(\"Attribs: %#x (%S)\", lf.attribs, cv_string_from_field_attribs(scratch.arena, lf.attribs));\n      rd_printf(\"Type   : %S\",       cv_string_from_itype(scratch.arena, min_itype, lf.itype));\n      rd_printf(\"Offset : %S\",       cv_string_from_numeric(scratch.arena, num));\n    } break;\n    case CV_LeafKind_LABEL: {\n      CV_LeafLabel lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      \n      rd_printf(\"Kind: %S\", cv_string_from_label_kind(scratch.arena, lf.kind));\n    } break;\n    case CV_LeafKind_ENDPRECOMP: {\n      CV_LeafEndPreComp lf = {0};\n      cursor += str8_deserial_read_struct(raw_leaf, cursor, &lf);\n      rd_printf(\"Sig: %#x\", lf.sig);\n    } break;\n    // 16bit\n    case CV_LeafKind_OEM_16t: \n    case CV_LeafKind_MODIFIER_16t: \n    case CV_LeafKind_POINTER_16t: \n    case CV_LeafKind_ARRAY_16t: \n    case CV_LeafKind_CLASS_16t: \n    case CV_LeafKind_STRUCTURE_16t: \n    case CV_LeafKind_UNION_16t: \n    case CV_LeafKind_ENUM_16t: \n    case CV_LeafKind_PROCEDURE_16t: \n    case CV_LeafKind_MFUNCTION_16t: \n    case CV_LeafKind_COBOL0_16t: \n    case CV_LeafKind_BARRAY_16t: \n    case CV_LeafKind_DIMARRAY_16t: \n    case CV_LeafKind_VFTPATH_16t: \n    case CV_LeafKind_PRECOMP_16t: \n    case CV_LeafKind_ARGLIST_16t: \n    case CV_LeafKind_DEFARG_16t: \n    case CV_LeafKind_FIELDLIST_16t: \n    case CV_LeafKind_DERIVED_16t: \n    case CV_LeafKind_BITFIELD_16t: \n    case CV_LeafKind_METHODLIST_16t: \n    case CV_LeafKind_DIMCONU_16t: \n    case CV_LeafKind_DIMCONLU_16t: \n    case CV_LeafKind_DIMVARU_16t: \n    case CV_LeafKind_DIMVARLU_16t: \n    case CV_LeafKind_BCLASS_16t: \n    case CV_LeafKind_VBCLASS_16t: \n    case CV_LeafKind_IVBCLASS_16t: \n    case CV_LeafKind_ENUMERATE_ST: \n    case CV_LeafKind_FRIENDFCN_16t: \n    case CV_LeafKind_INDEX_16t: \n    case CV_LeafKind_MEMBER_16t: \n    case CV_LeafKind_STMEMBER_16t: \n    case CV_LeafKind_METHOD_16t: \n    case CV_LeafKind_NESTTYPE_16t: \n    case CV_LeafKind_VFUNCTAB_16t: \n    case CV_LeafKind_FRIENDCLS_16t: \n    case CV_LeafKind_ONEMETHOD_16t: \n    case CV_LeafKind_VFUNCOFF_16t: \n    case CV_LeafKind_ST_MAX: \n    // HLSL\n    case CV_LeafKind_HLSL: \n    // COBOL\n    case CV_LeafKind_COBOL0: \n    case CV_LeafKind_COBOL1: \n    // Manged\n    case CV_LeafKind_MANAGED_ST: \n    // undefined\n    case CV_LeafKind_LIST: \n    case CV_LeafKind_REFSYM: \n    case CV_LeafKind_BARRAY: \n    case CV_LeafKind_DIMARRAY_ST: \n    case CV_LeafKind_VFTPATH: \n    case CV_LeafKind_OEM: \n    case CV_LeafKind_ALIAS_ST: \n    case CV_LeafKind_OEM2: \n    case CV_LeafKind_DEFARG_ST: \n    case CV_LeafKind_DERIVED: \n    case CV_LeafKind_DIMCONU: \n    case CV_LeafKind_DIMCONLU: \n    case CV_LeafKind_DIMVARU: \n    case CV_LeafKind_DIMVARLU: \n    case CV_LeafKind_FRIENDFCN_ST: \n    case CV_LeafKind_INDEX: \n    case CV_LeafKind_FRIENDCLS: \n    case CV_LeafKind_VFUNCOFF: \n    case CV_LeafKind_MEMBERMODIFY_ST: \n    case CV_LeafKind_TYPESERVER_ST: \n    case CV_LeafKind_TYPESERVER: \n    case CV_LeafKind_DIMARRAY: \n    case CV_LeafKind_ALIAS: \n    case CV_LeafKind_DEFARG: \n    case CV_LeafKind_FRIENDFCN: \n    case CV_LeafKind_NESTTYPEEX: \n    case CV_LeafKind_MEMBERMODIFY: \n    case CV_LeafKind_MANAGED: \n    case CV_LeafKind_STRIDED_ARRAY: \n    case CV_LeafKind_MODIFIER_EX: \n    case CV_LeafKind_INTERFACE: \n    case CV_LeafKind_BINTERFACE: \n    case CV_LeafKind_VECTOR: \n    case CV_LeafKind_MATRIX: \n    case CV_LeafKind_VFTABLE: \n    case CV_LeafKind_UDT_MOD_SRC_LINE: {\n      rd_errorf(\"TODO: %#x\", kind);\n    } break;\n  }\n  scratch_end(scratch);\n  return cursor;\n}\n\ninternal void\ncv_print_debug_t(Arena *arena, String8List *out, String8 indent, CV_DebugT debug_t)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  for (U64 lf_idx = 0; lf_idx < debug_t.count; ++lf_idx) {\n    CV_Leaf      lf     = cv_debug_t_get_leaf(debug_t, lf_idx);\n    U64          offset = (U64)(lf.data.str-debug_t.v[0]);\n    CV_TypeIndex itype  = CV_MinComplexTypeIndex + lf_idx;\n    rd_printf(\"LF_%S (%x) [%04llx-%04llx)\", cv_string_from_leaf_kind(lf.kind), itype, offset, offset+lf.data.size);\n    rd_indent();\n    cv_print_leaf(arena, out, indent, CV_MinComplexTypeIndex, lf.kind, lf.data);\n    rd_unindent();\n  }\n  scratch_end(scratch);\n}\n\ninternal void\ncv_print_symbols_c13(Arena *arena, String8List *out, String8 indent, CV_Arch arch, String8 raw_data)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  B32 scope_depth = 0;\n  \n  for (U64 cursor = 0; cursor < raw_data.size; ) {\n    CV_SymbolHeader header = {0};\n    cursor += str8_deserial_read_struct(raw_data, cursor, &header);\n    \n    if (header.size >= sizeof(header.kind)) {\n      Temp temp = temp_begin(scratch.arena);\n      \n      U64     symbol_end = cursor + (header.size - sizeof(header.kind));\n      String8 raw_symbol = str8_substr(raw_data, rng_1u64(cursor, symbol_end));\n      \n      if (header.kind == CV_SymKind_END || header.kind == CV_SymKind_INLINESITE_END) {\n        if (scope_depth > 0) {\n          rd_unindent();\n          --scope_depth;\n        } else {\n          rd_errorf(\"unbalanced scopes\");\n        }\n      }\n      \n      rd_printf(\"%S [%04llx-%04llx)\", cv_string_from_symbol_type(temp.arena, header.kind), cursor, header.size-sizeof(header.size));\n      rd_indent();\n      cv_print_symbol(arena, out, indent, arch, CV_MinComplexTypeIndex, header.kind, raw_symbol);\n      rd_unindent();\n      \n      if (header.kind == CV_SymKind_BLOCK32 || header.kind == CV_SymKind_INLINESITE) {\n        rd_indent();\n        ++scope_depth;\n      }\n      \n      cursor = symbol_end;\n      \n      temp_end(temp);\n    } else {\n      rd_errorf(\"symbol must be at least two bytes long\");\n    }\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void \ncv_print_lines_c13(Arena *arena, String8List *out, String8 indent, String8 raw_lines)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64 cursor = 0;\n  \n  CV_C13SubSecLinesHeader header = {0};\n  cursor += str8_deserial_read_struct(raw_lines, cursor, &header);\n  \n  B32 has_columns = !!(header.flags & CV_C13SubSecLinesFlag_HasColumns);\n  if (has_columns) {\n    rd_errorf(\"TOOD: columns\");\n  }\n  \n  rd_printf(\"%04x:%08x-%08x, flags = %04x\", header.sec, header.sec_off, header.len, header.flags);\n  \n  for (; cursor < raw_lines.size; ) {\n    CV_C13File file = {0};\n    cursor += str8_deserial_read_struct(raw_lines, cursor, &file);\n    \n    rd_printf(\"file = %08x, line count = %u, block size %08x\", file.file_off, file.num_lines, file.block_size);\n    \n    Temp        temp    = temp_begin(scratch.arena);\n    String8List columns = {0};\n    for (U32 line_idx = 0; line_idx < file.num_lines; ++line_idx) {\n      CV_C13Line line = {0};\n      cursor += str8_deserial_read_struct(raw_lines, cursor, &line);\n      \n      B32 always_step_in_line_number = line.off == 0xFEEFEE;\n      B32 never_step_in_line_number  = line.off == 0xF00F00;\n      \n      U32 ln = CV_C13LineFlags_Extract_LineNumber(line.flags);\n      //U32 delta   = CV_C13LineFlags_Extract_DeltaToEnd(line.flags);\n      //B32 is_stmt = CV_C13LineFlags_Extract_Statement(line.flags);\n      \n      if (always_step_in_line_number || never_step_in_line_number) {\n        str8_list_pushf(temp.arena, &columns, \"%x %08X\", ln, line.off);\n      } else {\n        str8_list_pushf(temp.arena, &columns, \"%5u %08X\", ln, line.off);\n      }\n      \n      if ((line_idx+1) % 4 == 0 || (line_idx+1) == file.num_lines) {\n        String8 line_str = str8_list_join(scratch.arena, &columns, &(StringJoin){.sep=str8_lit(\"\\t\")});\n        rd_printf(\"%S\", line_str);\n        \n        temp_end(temp);\n        temp = temp_begin(scratch.arena);\n        MemoryZeroStruct(&columns);\n      }\n    }\n    temp_end(temp);\n    \n    if (cursor < raw_lines.size) {\n      rd_newline();\n    }\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncv_print_file_checksums(Arena *arena, String8List *out, String8 indent, String8 raw_chksums)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"%-8s %-8s %-8s %-16s\", \"File\", \"Size\", \"Type\", \"Checksum\");\n  for (U64 cursor = 0; cursor < raw_chksums.size; ) {\n    CV_C13Checksum chksum = {0};\n    cursor += str8_deserial_read_struct(raw_chksums, cursor, &chksum);\n    \n    Temp     temp       = temp_begin(scratch.arena);\n    String8  chksum_str = str8_lit(\"???\");\n    U8      *chksum_ptr = str8_deserial_get_raw_ptr(raw_chksums, cursor, chksum.len);\n    if (chksum_ptr) {\n      chksum_str = rd_format_hex_array(temp.arena, chksum_ptr, chksum.len);\n    }\n    \n    rd_printf(\"%08x %08x %-8S %S\", \n              chksum.name_off, \n              chksum.len, \n              cv_string_from_c13_checksum_kind(chksum.kind),\n              chksum_str);\n    \n    temp_end(temp);\n    \n    cursor += chksum.len;\n    cursor = AlignPow2(cursor, CV_FileCheckSumsAlign);\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncv_print_string_table(Arena *arena, String8List *out, String8 indent, String8 raw_strtab)\n{\n  for (U64 cursor = 0; cursor < raw_strtab.size; ) {\n    String8 str = {0};\n    cursor += str8_deserial_read_cstr(raw_strtab, cursor, &str);\n    rd_printf(\"%08x %S\", cursor, str);\n  }\n}\n\ninternal void\ncv_print_inlinee_lines(Arena *arena, String8List *out, String8 indent, String8 raw_data)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64 cursor = 0;\n  \n  U32 inlinee_sig = ~0u;\n  cursor += str8_deserial_read_struct(raw_data, cursor, &inlinee_sig);\n  \n  switch (inlinee_sig) {\n    case CV_C13InlineeLinesSig_NORMAL: {\n      rd_printf(\"%-8s %-8s %-8s\", \"Inlinee\", \"File ID\", \"Base LN\");\n      for (; cursor < raw_data.size; ) {\n        CV_C13InlineeSourceLineHeader line = {0};\n        cursor += str8_deserial_read_struct(raw_data, cursor, &line);\n        rd_printf(\"%08x %08x %8u\", line.inlinee, line.file_off, line.first_source_ln);\n      }\n      \n    } break;\n    case CV_C13InlineeLinesSig_EXTRA_FILES: {\n      rd_printf(\"%-8s %-8s %-8s %s\", \"Inlinee\", \"File ID\", \"Base LN\", \"Extra FileIDs\");\n      for (; cursor < raw_data.size; ) {\n        Temp temp = temp_begin(scratch.arena);\n        \n        CV_C13InlineeSourceLineHeader line             = {0};\n        U32                           extra_file_count = 0;\n        cursor += str8_deserial_read_struct(raw_data, cursor, &line);\n        cursor += str8_deserial_read_struct(raw_data, cursor, &extra_file_count);\n        \n        String8List extra_files_list = {0};\n        for (U32 i = 0; i < extra_file_count; ++i) {\n          U32 file_id = 0;\n          cursor += str8_deserial_read_struct(raw_data, cursor, &file_id);\n          str8_list_pushf(temp.arena, &extra_files_list, \"%08x\", file_id);\n        }\n        String8 extra_files = str8_list_join(temp.arena, &extra_files_list, &(StringJoin){.sep=str8_lit(\" ,\")});\n        \n        rd_printf(\"%08x %08x %u %S\", line.inlinee, line.file_off, line.first_source_ln, extra_files);\n        \n        temp_end(temp);\n      }\n    } break;\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncv_print_symbols_section(Arena       *arena,\n                         String8List *out,\n                         String8      indent,\n                         CV_Arch      arch,\n                         String8      raw_ss)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  U64 cursor = 0;\n  U32 cv_sig = 0;\n  cursor += str8_deserial_read_struct(raw_ss, cursor, &cv_sig);\n  \n  for (; cursor < raw_ss.size; ) {\n    U64                    sst_offset = 0;\n    CV_C13SubSectionHeader ss_header  = {0};\n    char                  *ss_ver     = \"???\";\n    switch (cv_sig) {\n      case CV_Signature_C6: {\n        rd_printf(\"TODO: C6\");\n      } break;\n      case CV_Signature_C7: {\n        rd_printf(\"TODO: C7\");\n      } break;\n      case CV_Signature_C11: {\n        ss_header.kind = CV_C13SubSectionKind_Symbols;\n        ss_header.size = raw_ss.size - sizeof(cv_sig);\n        ss_ver         = \"C11\";\n      } break;\n      case CV_Signature_C13: {\n        sst_offset = cursor;\n        cursor += str8_deserial_read_struct(raw_ss, cursor, &ss_header);\n        ss_ver = \"C13\";\n      } break;\n    }\n    \n    U64     sst_end = cursor + ss_header.size;\n    String8 raw_sst = str8_substr(raw_ss, rng_1u64(cursor, sst_end));\n    cursor = AlignPow2(sst_end, CV_C13SubSectionAlign);\n    \n    rd_printf(\"# %S %s [%llx-%llx)\", cv_string_from_c13_subsection_kind(ss_header.kind), ss_ver, sst_offset, sst_end);\n    rd_indent();\n    switch (ss_header.kind) {\n      case CV_C13SubSectionKind_Symbols: {\n        cv_print_symbols_c13(arena, out, indent, arch, raw_sst);\n        rd_newline();\n      } break;\n      case CV_C13SubSectionKind_Lines: {\n        cv_print_lines_c13(arena, out, indent, raw_sst);\n        rd_newline();\n      } break;\n      case CV_C13SubSectionKind_FileChksms: {\n        cv_print_file_checksums(arena, out, indent, raw_sst);\n        rd_newline();\n      } break;\n      case CV_C13SubSectionKind_StringTable: {\n        cv_print_string_table(arena, out, indent, raw_sst);\n        rd_newline();\n      } break;\n      case CV_C13SubSectionKind_InlineeLines: {\n        cv_print_inlinee_lines(arena, out, indent, raw_sst);\n        rd_newline();\n      } break;\n      case CV_C13SubSectionKind_FrameData: \n      case CV_C13SubSectionKind_CrossScopeImports:\n      case CV_C13SubSectionKind_CrossScopeExports:\n      case CV_C13SubSectionKind_IlLines:\n      case CV_C13SubSectionKind_FuncMDTokenMap:\n      case CV_C13SubSectionKind_TypeMDTokenMap:\n      case CV_C13SubSectionKind_MergedAssemblyInput:\n      case CV_C13SubSectionKind_CoffSymbolRVA:\n      case CV_C13SubSectionKind_XfgHashType:\n      case CV_C13SubSectionKind_XfgHashVirtual:\n      default: {\n        rd_printf(\"TODO\");\n      } break;\n    }\n    rd_unindent();\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\ncv_format_debug_sections(Arena *arena, String8List *out, String8 indent, String8 raw_image, String8 string_table, U64 section_count, COFF_SectionHeader *sections)\n{\n  CV_Arch arch = ~0;\n  {\n    B32 keep_parsing = 1;\n    for (U64 i = 0; i < section_count && keep_parsing; ++i) {\n      COFF_SectionHeader *header      = &sections[i];\n      String8             sect_name   = coff_name_from_section_header(string_table, header);\n      Rng1U64             sect_frange = rng_1u64(header->foff, header->foff+header->fsize);\n      String8             raw_sect    = str8_substr(raw_image, sect_frange);\n      if (str8_match_lit(\".debug$S\", sect_name, 0)) {\n        Temp scratch = scratch_begin(&arena, 1);\n        CV_DebugS debug_s = cv_parse_debug_s(scratch.arena, raw_sect);\n        for (String8Node *string_n = debug_s.data_list[CV_C13SubSectionIdxKind_Symbols].first;\n             string_n != 0 && keep_parsing; string_n = string_n->next) {\n          Temp temp = temp_begin(scratch.arena);\n          CV_SymbolList symbol_list = {0};\n          cv_parse_symbol_sub_section(temp.arena, &symbol_list, 0, string_n->string, CV_SymbolAlign);\n          for (CV_SymbolNode *symbol_n = symbol_list.first; symbol_n != 0 && keep_parsing; symbol_n = symbol_n->next) {\n            CV_Symbol symbol = symbol_n->data;\n            if (symbol.kind == CV_SymKind_COMPILE) {\n              if (symbol.data.size >= sizeof(CV_SymCompile)) {\n                CV_SymCompile *comp = str8_deserial_get_raw_ptr(symbol.data, 0, sizeof(*comp));\n                arch = comp->machine;\n              } else {\n                rd_printf(\"not enough bytes to read S_COMPILE\");\n              }\n              keep_parsing = 0;\n            } else if (symbol.kind == CV_SymKind_COMPILE2) {\n              if (symbol.data.size >= sizeof(CV_SymCompile2)) {\n                CV_SymCompile2 *comp = str8_deserial_get_raw_ptr(symbol.data, 0, sizeof(*comp));\n                arch = comp->machine;\n              } else {\n                rd_printf(\"not enough bytes to read S_COMPILE2\");\n              }\n              keep_parsing = 0;\n            } else if (symbol.kind == CV_SymKind_COMPILE3) {\n              if (symbol.data.size >= sizeof(CV_SymCompile3)) {\n                CV_SymCompile3 *comp = str8_deserial_get_raw_ptr(symbol.data, 0, sizeof(*comp));\n                arch = comp->machine;\n              } else {\n                rd_printf(\"not enough bytes to read S_COMPILE3\");\n              }\n              keep_parsing = 0;\n            }\n          }\n          temp_end(temp);\n        }\n        scratch_end(scratch);\n      }\n    }\n  }\n  \n  for (U64 i = 0; i < section_count; ++i) {\n    COFF_SectionHeader *header      = &sections[i];\n    String8             sect_name   = coff_name_from_section_header(string_table, header);\n    Rng1U64             sect_frange = rng_1u64(header->foff, header->foff+header->fsize);\n    String8             raw_sect    = str8_substr(raw_image, sect_frange);\n    if (str8_match_lit(\".debug$S\", sect_name, 0)) {\n      rd_printf(\"# .debug$S No. %llx\", i+1);\n      rd_indent();\n      cv_print_symbols_section(arena, out, indent, arch, raw_sect);\n      rd_unindent();\n    } else if (str8_match_lit(\".debug$T\", sect_name, 0)) {\n      Temp scratch = scratch_begin(&arena, 1);\n      CV_Signature sig = 0;\n      str8_deserial_read_struct(raw_sect, 0, &sig);\n      \n      String8 raw_types = str8_skip(raw_sect, sizeof(sig));\n      CV_DebugT debug_t = {0};\n      if (sig == CV_Signature_C13) {\n        debug_t = cv_debug_t_from_data(scratch.arena, raw_types, CV_LeafAlign);\n      } else {\n        NotImplemented;\n      }\n      \n      rd_printf(\"# .debug$T No. %llx\", i+1);\n      rd_indent();\n      cv_print_debug_t(arena, out, indent, debug_t);\n      rd_unindent();\n      scratch_end(scratch);\n    }\n  }\n}\n\n// MSVC CRT\n\ninternal void\nmscrt_print_eh_handler_type32(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, MSCRT_EhHandlerType32 *handler)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 catch_line     = rd_format_line_from_voff(scratch.arena, rdi, handler->catch_handler_voff, PathStyle_WindowsAbsolute);\n  String8 adjectives_str = mscrt_string_from_eh_adjectives(scratch.arena, handler->adjectives);\n  rd_printf(\"Adjectives               : %#x (%S)\", handler->adjectives, adjectives_str);\n  rd_printf(\"Descriptor               : %#x\",      handler->descriptor_voff);\n  rd_printf(\"Catch Object Frame Offset: %#x\",      handler->catch_obj_frame_offset);\n  rd_printf(\"Catch Handler            : %#x%s%S\",  handler->catch_handler_voff, catch_line.size ? \" \" : \"\", catch_line);\n  rd_printf(\"Delta to FP Handler      : %#x\",      handler->fp_distance);\n  scratch_end(scratch);\n}\n\n////////////////////////////////\n//~ PE\n\ninternal void\npe_print_data_directory_ranges(Arena *arena, String8List *out, String8 indent, U64 count, PE_DataDirectory *dirs)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  rd_printf(\"# Data Directories\");\n  rd_indent();\n  for (U64 i = 0; i < count; ++i) {\n    String8 dir_name;\n    if (i < PE_DataDirectoryIndex_COUNT) {\n      dir_name = pe_string_from_data_directory_index(i);\n    } else {\n      dir_name = push_str8f(scratch.arena, \"%#x\", i);\n    }\n    rd_printf(\"%-16S [%08x-%08x) %m\", dir_name, dirs[i].virt_off, dirs[i].virt_off+dirs[i].virt_size, dirs[i].virt_size);\n  }\n  rd_unindent();\n  scratch_end(scratch);\n}\n\ninternal void\npe_print_optional_header32(Arena *arena, String8List *out, String8 indent, PE_OptionalHeader32 *opt_header, PE_DataDirectory *dirs)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 subsystem = pe_string_from_subsystem(opt_header->subsystem);\n  String8 dll_chars = pe_string_from_dll_characteristics(scratch.arena, opt_header->dll_characteristics);\n  \n  rd_printf(\"# PE Optional Header 32\");\n  rd_indent();\n  rd_printf(\"Magic                : %#x\",        opt_header->magic);\n  rd_printf(\"Linker version       : %u.%u\",      opt_header->major_linker_version, opt_header->minor_linker_version);\n  rd_printf(\"Size of code         : %#-8x (%m)\", opt_header->sizeof_code, opt_header->sizeof_code);\n  rd_printf(\"Size of inited data  : %#-8x (%m)\", opt_header->sizeof_inited_data, opt_header->sizeof_inited_data);\n  rd_printf(\"Size of uninited data: %#-8x (%m)\", opt_header->sizeof_uninited_data, opt_header->sizeof_uninited_data);\n  rd_printf(\"Entry point          : %#x\",        opt_header->entry_point_va);\n  rd_printf(\"Code base            : %#x\",        opt_header->code_base);\n  rd_printf(\"Data base            : %#x\",        opt_header->data_base);\n  rd_printf(\"Image base           : %#x\",        opt_header->image_base);\n  rd_printf(\"Section align        : %#x\",        opt_header->section_alignment);\n  rd_printf(\"File align           : %#x\",        opt_header->file_alignment);\n  rd_printf(\"OS version           : %u.%u\",      opt_header->major_os_ver, opt_header->minor_os_ver);\n  rd_printf(\"Image Version        : %u.%u\",      opt_header->major_img_ver, opt_header->minor_img_ver);\n  rd_printf(\"Subsystem version    : %u.%u\",      opt_header->major_subsystem_ver, opt_header->minor_subsystem_ver);\n  rd_printf(\"Win32 version        : %u\",         opt_header->win32_version_value);\n  rd_printf(\"Size of image        : %#x (%m)\",   opt_header->sizeof_image, opt_header->sizeof_image);\n  rd_printf(\"Size of headers      : %#x (%m)\",   opt_header->sizeof_headers, opt_header->sizeof_headers);\n  rd_printf(\"Checksum             : %#x\",        opt_header->check_sum);\n  rd_printf(\"Subsystem            : %#x (%S)\",   opt_header->subsystem, subsystem);\n  rd_printf(\"DLL Characteristics  : %#x (%S)\",   opt_header->dll_characteristics, dll_chars);\n  rd_printf(\"Stack reserve        : %#-8x (%m)\", opt_header->sizeof_stack_reserve, opt_header->sizeof_stack_reserve);\n  rd_printf(\"Stack commit         : %#-8x (%m)\", opt_header->sizeof_stack_commit, opt_header->sizeof_stack_commit);\n  rd_printf(\"Heap reserve         : %#-8x (%m)\", opt_header->sizeof_heap_reserve, opt_header->sizeof_heap_reserve);\n  rd_printf(\"Heap commit          : %#-8x (%m)\", opt_header->sizeof_heap_commit, opt_header->sizeof_heap_commit);\n  rd_printf(\"Loader flags         : %#x\",        opt_header->loader_flags);\n  rd_printf(\"RVA and offset count : %u\",         opt_header->data_dir_count);\n  rd_newline();\n  \n  pe_print_data_directory_ranges(arena, out, indent, opt_header->data_dir_count, dirs);\n  rd_newline();\n  \n  rd_unindent();\n  scratch_end(scratch);\n}\n\ninternal void\npe_print_optional_header32plus(Arena *arena, String8List *out, String8 indent, PE_OptionalHeader32Plus *opt_header, PE_DataDirectory *dirs)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 subsystem = pe_string_from_subsystem(opt_header->subsystem);\n  String8 dll_chars = pe_string_from_dll_characteristics(scratch.arena, opt_header->dll_characteristics);\n  \n  rd_printf(\"# PE Optional Header 32+\");\n  rd_indent();\n  rd_printf(\"Magic                : %#x\",          opt_header->magic);\n  rd_printf(\"Linker version       : %u.%u\",        opt_header->major_linker_version, opt_header->minor_linker_version);\n  rd_printf(\"Size of code         : %#-8x (%m)\",   opt_header->sizeof_code, opt_header->sizeof_code);\n  rd_printf(\"Size of inited data  : %#-8x (%m)\",   opt_header->sizeof_inited_data, opt_header->sizeof_inited_data);\n  rd_printf(\"Size of uninited data: %#-8x (%m)\",   opt_header->sizeof_uninited_data, opt_header->sizeof_uninited_data);\n  rd_printf(\"Entry point          : %#x\",          opt_header->entry_point_va);\n  rd_printf(\"Code base            : %#x\",          opt_header->code_base);\n  rd_printf(\"Image base           : %#llx\",        opt_header->image_base);\n  rd_printf(\"Section align        : %#x\",          opt_header->section_alignment);\n  rd_printf(\"File align           : %#x\",          opt_header->file_alignment);\n  rd_printf(\"OS version           : %u.%u\",        opt_header->major_os_ver, opt_header->minor_os_ver);\n  rd_printf(\"Image Version        : %u.%u\",        opt_header->major_img_ver, opt_header->minor_img_ver);\n  rd_printf(\"Subsystem version    : %u.%u\",        opt_header->major_subsystem_ver, opt_header->minor_subsystem_ver);\n  rd_printf(\"Win32 version        : %u\",           opt_header->win32_version_value);\n  rd_printf(\"Size of image        : %#x (%m)\",     opt_header->sizeof_image, opt_header->sizeof_image);\n  rd_printf(\"Size of headers      : %#x (%m)\",     opt_header->sizeof_headers, opt_header->sizeof_headers);\n  rd_printf(\"Checksum             : %#x\",          opt_header->check_sum);\n  rd_printf(\"Subsystem            : %#llx (%S)\",   opt_header->subsystem, subsystem);\n  rd_printf(\"DLL Characteristics  : %#llx (%S)\",   opt_header->dll_characteristics, dll_chars);\n  rd_printf(\"Stack reserve        : %#-8llx (%M)\", opt_header->sizeof_stack_reserve, opt_header->sizeof_stack_reserve);\n  rd_printf(\"Stack commit         : %#-8llx (%M)\", opt_header->sizeof_stack_commit, opt_header->sizeof_stack_commit);\n  rd_printf(\"Heap reserve         : %#-8llx (%M)\", opt_header->sizeof_heap_reserve, opt_header->sizeof_heap_reserve);\n  rd_printf(\"Heap commit          : %#-8llx (%M)\", opt_header->sizeof_heap_commit, opt_header->sizeof_heap_commit);\n  rd_printf(\"Loader flags         : %#x\",          opt_header->loader_flags);\n  rd_printf(\"RVA and offset count : %u\",           opt_header->data_dir_count);\n  rd_newline();\n  \n  pe_print_data_directory_ranges(arena, out, indent, opt_header->data_dir_count, dirs);\n  rd_newline();\n  \n  rd_unindent();\n  scratch_end(scratch);\n}\n\ninternal void\npe_print_load_config32(Arena *arena, String8List *out, String8 indent, PE_LoadConfig32 *lc)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 time_stamp        = coff_string_from_time_stamp(scratch.arena, lc->time_stamp);\n  String8 global_flag_clear = pe_string_from_global_flags(scratch.arena, lc->global_flag_clear);\n  String8 global_flag_set   = pe_string_from_global_flags(scratch.arena, lc->global_flag_set);\n  \n  rd_printf(\"# Load Config 32\");\n  rd_indent();\n  \n  rd_printf(\"Size:                          %m\",       lc->size);\n  rd_printf(\"Time stamp:                    %#x (%S)\", lc->time_stamp, time_stamp);\n  rd_printf(\"Version:                       %u.%u\",    lc->major_version, lc->minor_version);\n  rd_printf(\"Global flag clear:             %#x %S\",   global_flag_clear);\n  rd_printf(\"Global flag set:               %#x %S\",   global_flag_set);\n  rd_printf(\"Critical section timeout:      %u\",       lc->critical_section_timeout);\n  rd_printf(\"Decommit free block threshold: %#x\",      lc->decommit_free_block_threshold);\n  rd_printf(\"Decommit total free threshold: %#x\",      lc->decommit_total_free_threshold);\n  rd_printf(\"Lock prefix table:             %#x\",      lc->lock_prefix_table);\n  rd_printf(\"Maximum alloc size:            %m\",       lc->maximum_allocation_size);\n  rd_printf(\"Virtual memory threshold:      %m\",       lc->virtual_memory_threshold);\n  rd_printf(\"Process affinity mask:         %#x\",      lc->process_affinity_mask);\n  rd_printf(\"Process heap flags:            %#x\",      lc->process_heap_flags);\n  rd_printf(\"CSD version:                   %u\",       lc->csd_version);\n  rd_printf(\"Edit list:                     %#x\",      lc->edit_list);\n  rd_printf(\"Security Cookie:               %#x\",      lc->security_cookie);\n  if (lc->size < OffsetOf(PE_LoadConfig64, seh_handler_table)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"SEH Handler Table: %#x\", lc->seh_handler_table);\n  rd_printf(\"SEH Handler Count: %u\",   lc->seh_handler_count);\n  if (lc->size < OffsetOf(PE_LoadConfig64, guard_cf_check_func_ptr)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"Guard CF Check Function:    %#x\", lc->guard_cf_check_func_ptr);\n  rd_printf(\"Guard CF Dispatch Function: %#x\", lc->guard_cf_dispatch_func_ptr);\n  rd_printf(\"Guard CF Function Table:    %#x\", lc->guard_cf_func_table);\n  rd_printf(\"Guard CF Function Count:    %u\",  lc->guard_cf_func_count);\n  rd_printf(\"Guard Flags:                %#x\", lc->guard_flags);\n  if (lc->size < OffsetOf(PE_LoadConfig64, code_integrity)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"Code integrity:                        { Flags = %#x, Catalog = %#x, Catalog Offset = %#x }\",\n            lc->code_integrity.flags, lc->code_integrity.catalog, lc->code_integrity.catalog_offset);\n  rd_printf(\"Guard address taken IAT entry table:   %#x\", lc->guard_address_taken_iat_entry_table);\n  rd_printf(\"Guard address taken IAT entry count:   %u\",  lc->guard_address_taken_iat_entry_count);\n  rd_printf(\"Guard long jump target table:          %#x\", lc->guard_long_jump_target_table);\n  rd_printf(\"Guard long jump target count:          %u\",  lc->guard_long_jump_target_count);\n  rd_printf(\"Dynamic value reloc table:             %#x\", lc->dynamic_value_reloc_table);\n  rd_printf(\"CHPE Metadata ptr:                     %#x\", lc->chpe_metadata_ptr);\n  rd_printf(\"Guard RF failure routine:              %#x\", lc->guard_rf_failure_routine);\n  rd_printf(\"Guard RF failure routine func ptr:     %#x\", lc->guard_rf_failure_routine_func_ptr);\n  rd_printf(\"Dynamic value reloc section:           %#x\", lc->dynamic_value_reloc_table_section);\n  rd_printf(\"Dynamic value reloc section offset:    %#x\", lc->dynamic_value_reloc_table_offset);\n  rd_printf(\"Guard RF verify SP func ptr:           %#x\", lc->guard_rf_verify_stack_pointer_func_ptr);\n  rd_printf(\"Hot patch table offset:                %#x\", lc->hot_patch_table_offset);\n  if (lc->size < OffsetOf(PE_LoadConfig64, enclave_config_ptr)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"Enclave config ptr:                    %#x\", lc->enclave_config_ptr);\n  rd_printf(\"Volatile metadata ptr:                 %#x\", lc->volatile_metadata_ptr);\n  rd_printf(\"Guard EH continuation table:           %#x\", lc->guard_eh_continue_table);\n  rd_printf(\"Guard EH continuation count:           %u\",  lc->guard_eh_continue_count);\n  rd_printf(\"Guard XFG check func ptr:              %#x\", lc->guard_xfg_check_func_ptr);\n  rd_printf(\"Guard XFG dispatch func ptr:           %#x\", lc->guard_xfg_dispatch_func_ptr);\n  rd_printf(\"Guard XFG table dispatch func ptr:     %#x\", lc->guard_xfg_table_dispatch_func_ptr);\n  rd_printf(\"Cast guard OS determined failure mode: %#x\", lc->cast_guard_os_determined_failure_mode);\n  rd_newline();\n  \n  exit:;\n  rd_unindent();\n  scratch_end(scratch);\n}\n\ninternal void\npe_print_load_config64(Arena *arena, String8List *out, String8 indent, PE_LoadConfig64 *lc)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 time_stamp        = coff_string_from_time_stamp(scratch.arena, lc->time_stamp);\n  String8 global_flag_clear = pe_string_from_global_flags(scratch.arena, lc->global_flag_clear);\n  String8 global_flag_set   = pe_string_from_global_flags(scratch.arena, lc->global_flag_set);\n  \n  rd_printf(\"# Load Config 64\");\n  rd_indent();\n  \n  rd_printf(\"Size:                          %m\",       lc->size);\n  rd_printf(\"Time stamp:                    %#x (%S)\", lc->time_stamp, time_stamp);\n  rd_printf(\"Version:                       %u.%u\",    lc->major_version, lc->minor_version);\n  rd_printf(\"Global flag clear:             %#x %S\",   lc->global_flag_clear, global_flag_clear);\n  rd_printf(\"Global flag set:               %#x %S\",   lc->global_flag_set, global_flag_set);\n  rd_printf(\"Critical section timeout:      %u\",       lc->critical_section_timeout);\n  rd_printf(\"Decommit free block threshold: %#llx\",    lc->decommit_free_block_threshold);\n  rd_printf(\"Decommit total free threshold: %#llx\",    lc->decommit_total_free_threshold);\n  rd_printf(\"Lock prefix table:             %#llx\",    lc->lock_prefix_table);\n  rd_printf(\"Maximum alloc size:            %M\",       lc->maximum_allocation_size);\n  rd_printf(\"Virtual memory threshold:      %M\",       lc->virtual_memory_threshold);\n  rd_printf(\"Process affinity mask:         %#x\",      lc->process_affinity_mask);\n  rd_printf(\"Process heap flags:            %#x\",      lc->process_heap_flags);\n  rd_printf(\"CSD version:                   %u\",       lc->csd_version);\n  rd_printf(\"Edit list:                     %#llx\",    lc->edit_list);\n  rd_printf(\"Security Cookie:               %#llx\",    lc->security_cookie);\n  if (lc->size < OffsetOf(PE_LoadConfig64, seh_handler_table)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"SEH Handler Table: %#llx\", lc->seh_handler_table);\n  rd_printf(\"SEH Handler Count: %llu\",  lc->seh_handler_count);\n  if (lc->size < OffsetOf(PE_LoadConfig64, guard_cf_check_func_ptr)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"Guard CF Check Function:    %#llx\", lc->guard_cf_check_func_ptr);\n  rd_printf(\"Guard CF Dispatch Function: %#llx\", lc->guard_cf_dispatch_func_ptr);\n  rd_printf(\"Guard CF Function Table:    %#llx\", lc->guard_cf_func_table);\n  rd_printf(\"Guard CF Function Count:    %llu\",  lc->guard_cf_func_count);\n  rd_printf(\"Guard Flags:                %#x\",   lc->guard_flags);\n  if (lc->size < OffsetOf(PE_LoadConfig64, code_integrity)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"Code integrity:                      { Flags = %#x, Catalog = %#x, Catalog Offset = %#x }\",\n            lc->code_integrity.flags, lc->code_integrity.catalog, lc->code_integrity.catalog_offset);\n  rd_printf(\"Guard address taken IAT entry table: %#llx\", lc->guard_address_taken_iat_entry_table);\n  rd_printf(\"Guard address taken IAT entry count: %llu\",  lc->guard_address_taken_iat_entry_count);\n  rd_printf(\"Guard long jump target table:        %#llx\", lc->guard_long_jump_target_table);\n  rd_printf(\"Guard long jump target count:        %llu\",  lc->guard_long_jump_target_count);\n  rd_printf(\"Dynamic value reloc table:           %#llx\", lc->dynamic_value_reloc_table);\n  rd_printf(\"CHPE Metadata ptr:                   %#llx\", lc->chpe_metadata_ptr);\n  rd_printf(\"Guard RF failure routine:            %#llx\", lc->guard_rf_failure_routine);\n  rd_printf(\"Guard RF failure routine func ptr:   %#llx\", lc->guard_rf_failure_routine_func_ptr);\n  rd_printf(\"Dynamic value reloc section:         %#llx\", lc->dynamic_value_reloc_table_section);\n  rd_printf(\"Dynamic value reloc section offset:  %#llx\", lc->dynamic_value_reloc_table_offset);\n  rd_printf(\"Guard RF verify SP func ptr:         %#llx\", lc->guard_rf_verify_stack_pointer_func_ptr);\n  rd_printf(\"Hot patch table offset:              %#llx\", lc->hot_patch_table_offset);\n  if (lc->size < OffsetOf(PE_LoadConfig64, enclave_config_ptr)) {\n    goto exit;\n  }\n  rd_newline();\n  \n  rd_printf(\"Enclave config ptr:                    %#llx\", lc->enclave_config_ptr);\n  rd_printf(\"Volatile metadata ptr:                 %#llx\", lc->volatile_metadata_ptr);\n  rd_printf(\"Guard EH continuation table:           %#llx\", lc->guard_eh_continue_table);\n  rd_printf(\"Guard EH continuation count:           %llu\",  lc->guard_eh_continue_count);\n  rd_printf(\"Guard XFG check func ptr:              %#llx\", lc->guard_xfg_check_func_ptr);\n  rd_printf(\"Guard XFG dispatch func ptr:           %#llx\", lc->guard_xfg_dispatch_func_ptr);\n  rd_printf(\"Guard XFG table dispatch func ptr:     %#llx\", lc->guard_xfg_table_dispatch_func_ptr);\n  rd_printf(\"Cast guard OS determined failure mode: %#llx\", lc->cast_guard_os_determined_failure_mode);\n  rd_newline();\n  \n  exit:;\n  rd_unindent();\n  scratch_end(scratch);\n}\n\ninternal void\npe_print_tls(Arena *arena, String8List *out, String8 indent, PE_ParsedTLS tls)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# TLS\");\n  rd_indent();\n  \n  String8 tls_chars = coff_string_from_section_flags(scratch.arena, tls.header.characteristics);\n  rd_printf(\"Raw data start:    %#llx\", tls.header.raw_data_start);\n  rd_printf(\"Raw data end:      %#llx\", tls.header.raw_data_end);\n  rd_printf(\"Index address:     %#llx\", tls.header.index_address);\n  rd_printf(\"Callbacks address: %#llx\", tls.header.callbacks_address);\n  rd_printf(\"Zero-fill size:    %m\",    tls.header.zero_fill_size);\n  rd_printf(\"Characteristics:   %S\",    tls_chars);\n  \n  if (tls.callback_count) {\n    rd_newline();\n    rd_printf(\"## Callbacks\");\n    rd_indent();\n    for (U64 i = 0; i < tls.callback_count; ++i) {\n      rd_printf(\"%#llx\", tls.callback_addrs[i]);\n    }\n    rd_unindent();\n  }\n  \n  rd_unindent();\n  rd_newline();\n  \n  scratch_end(scratch);\n}\n\ninternal void\npe_print_debug_diretory(Arena *arena, String8List *out, String8 indent, String8 raw_data, String8 raw_dir)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  rd_printf(\"# Debug Directory\");\n  rd_indent();\n  \n  PE_DebugInfoList debug_info_list = pe_debug_info_list_from_raw_debug_dir(scratch.arena, raw_data, raw_dir);\n  U64 i = 0;\n  for (PE_DebugInfoNode *entry = debug_info_list.first; entry != 0; entry = entry->next, ++i) {\n    PE_DebugInfo *de = &entry->v;\n    \n    if (entry != debug_info_list.first) {\n      rd_newline();\n    }\n    \n    rd_printf(\"Entry[%llu]\", i);\n    rd_indent();\n    \n    // print header\n    rd_printf(\"Characteristics: %#x\",   de->header.characteristics);\n    rd_printf(\"Time Stamp:      %S\",    coff_string_from_time_stamp(scratch.arena, de->header.time_stamp));\n    rd_printf(\"Version:         %u.%u\", de->header.major_ver, de->header.minor_ver);\n    rd_printf(\"Type:            %S\",    pe_string_from_debug_directory_type(de->header.type));\n    rd_printf(\"Size:            %u\",    de->header.size);\n    rd_printf(\"Data virt off:   %#x\",   de->header.voff);\n    rd_printf(\"Data file off:   %#x\",   de->header.foff);\n    rd_newline();\n    \n    // print directory contents\n    rd_indent();\n    switch (de->header.type) {\n      case PE_DebugDirectoryType_ILTCG:\n      case PE_DebugDirectoryType_MPX:\n      case PE_DebugDirectoryType_EXCEPTION:\n      case PE_DebugDirectoryType_FIXUP:\n      case PE_DebugDirectoryType_OMAP_TO_SRC:\n      case PE_DebugDirectoryType_OMAP_FROM_SRC:\n      case PE_DebugDirectoryType_BORLAND:\n      case PE_DebugDirectoryType_CLSID:\n      case PE_DebugDirectoryType_REPRO:\n      case PE_DebugDirectoryType_EX_DLLCHARACTERISTICS: {\n        NotImplemented;\n      } break;\n      case PE_DebugDirectoryType_COFF_GROUP: {\n        U64 off = 0;\n        \n        // TODO: is this version?\n        U32 unknown  = 0;\n        off += str8_deserial_read_struct(de->u.raw_data, off, &unknown);\n        if (unknown != 0) {\n          rd_printf(\"TODO: unknown: %u\", unknown);\n        }\n        \n        rd_printf(\"%-8s %-8s %-8s\", \"VOFF\", \"Size\", \"Name\");\n        for (; off < de->u.raw_data.size; ) {\n          U32     voff = 0;\n          U32     size = 0;\n          String8 name = str8_zero();\n          \n          off += str8_deserial_read_struct(de->u.raw_data, off, &voff);\n          off += str8_deserial_read_struct(de->u.raw_data, off, &size);\n          if (voff == 0 && size == 0) {\n            break;\n          }\n          off += str8_deserial_read_cstr(de->u.raw_data, off, &name);\n          off = AlignPow2(off, 4);\n          \n          rd_printf(\"%08x %08x %S\", voff, size, name);\n        }\n      } break;\n      case PE_DebugDirectoryType_VC_FEATURE: {\n        MSCRT_VCFeatures *feat = str8_deserial_get_raw_ptr(de->u.raw_data, 0, sizeof(*feat));\n        if (feat) {\n          rd_printf(\"Pre-VC++ 11.0: %u\", feat->pre_vcpp);\n          rd_printf(\"C/C++:         %u\", feat->c_cpp);\n          rd_printf(\"/GS:           %u\", feat->gs);\n          rd_printf(\"/sdl:          %u\", feat->sdl);\n          rd_printf(\"guardN:        %u\", feat->guard_n);\n        } else {\n          rd_errorf(\"not enough bytes to read VC Features\");\n        }\n      } break;\n      case PE_DebugDirectoryType_FPO: {\n        PE_DebugFPO *fpo = str8_deserial_get_raw_ptr(de->u.raw_data, 0, sizeof(*fpo));\n        if (fpo) {\n          U8          prolog_size     = PE_FPOEncoded_Extract_PROLOG_SIZE(fpo->flags);\n          U8          saved_regs_size = PE_FPOEncoded_Extract_SAVED_REGS_SIZE(fpo->flags);\n          PE_FPOType  type            = PE_FPOEncoded_Extract_FRAME_TYPE(fpo->flags);\n          PE_FPOFlags flags           = PE_FPOEncoded_Extract_FLAGS(fpo->flags);\n          \n          String8 type_string  = pe_string_from_fpo_type(type);\n          String8 flags_string = pe_string_from_fpo_flags(scratch.arena, flags);\n          \n          rd_printf(\"Function offset: %#x\", fpo->func_code_off);\n          rd_printf(\"Function size:   %#x\", fpo->func_size);\n          rd_printf(\"Locals size:     %u\",  fpo->locals_size);\n          rd_printf(\"Params size:     %u\",  fpo->params_size);\n          rd_printf(\"Prolog size:     %u\",  prolog_size);\n          rd_printf(\"Saved regs size: %u\",  saved_regs_size);\n          rd_printf(\"Type:            %S\",  type_string);\n          rd_printf(\"Flags:           %S\",  flags_string);\n        } else {\n          rd_errorf(\"not enough bytes to read FPO\");\n        }\n      } break;\n      case PE_DebugDirectoryType_CODEVIEW: {\n        switch (de->u.codeview.magic) {\n          case PE_CODEVIEW_PDB20_MAGIC: {\n            PE_CvHeaderPDB20 *header = &de->u.codeview.pdb20.header;\n            \n            rd_printf(\"Time stamp: %S\", coff_string_from_time_stamp(scratch.arena, header->time_stamp));\n            rd_printf(\"Age:        %u\", header->age);\n            rd_printf(\"Name:       %S\", de->u.codeview.pdb20.path);\n          } break;\n          case PE_CODEVIEW_PDB70_MAGIC: {\n            PE_CvHeaderPDB70 *header = &de->u.codeview.pdb70.header;\n            \n            rd_printf(\"GUID: %S\", string_from_guid(scratch.arena, header->guid));\n            rd_printf(\"Age:  %u\", header->age);\n            rd_printf(\"Name: %S\", de->u.codeview.pdb70.path);\n          } break;\n          case PE_CODEVIEW_RDI_MAGIC: {\n            PE_CvHeaderRDI *header = &de->u.codeview.rdi.header;\n            \n            rd_printf(\"GUID: %S\", string_from_guid(scratch.arena, header->guid));\n            rd_printf(\"Name: %S\", de->u.codeview.rdi.path);\n          } break;\n          default: {\n            rd_errorf(\"unknown CodeView magic %#x\", de->u.codeview.magic);\n          } break;\n        }\n      } break;\n      case PE_DebugDirectoryType_MISC: {\n        PE_DebugMisc *misc = str8_deserial_get_raw_ptr(de->u.raw_data, 0, sizeof(*misc));\n        \n        String8 type_string = pe_string_from_misc_type(misc->data_type);\n        \n        rd_printf(\"Data type: %S\", type_string);\n        rd_printf(\"Size:      %u\", misc->size);\n        rd_printf(\"Unicode:   %u\", misc->unicode);\n        \n        switch (misc->data_type) {\n          case PE_DebugMiscType_EXE_NAME: {\n            String8 name;\n            str8_deserial_read_cstr(de->u.raw_data, sizeof(*misc), &name);\n            rd_printf(\"Name: %S\", name);\n          } break;\n          default: {\n            rd_printf(\"???\");\n          } break;\n        }\n      } break;\n    }\n    rd_unindent();\n    rd_unindent();\n  }\n  \n  rd_unindent();\n  rd_newline();\n  \n  scratch_end(scratch);\n}\n\ninternal void\npe_print_export_table(Arena *arena, String8List *out, String8 indent, PE_ParsedExportTable exptab)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 time_stamp = coff_string_from_time_stamp(scratch.arena, exptab.time_stamp);\n  \n  rd_printf(\"# Export Table\");\n  rd_indent();\n  \n  rd_printf(\"Characteristics: %u\",      exptab.flags);\n  rd_printf(\"Time stamp:      %S\",      time_stamp);\n  rd_printf(\"Version:         %u.%02u\", exptab.major_ver, exptab.minor_ver);\n  rd_printf(\"Ordinal base:    %u\",      exptab.ordinal_base);\n  rd_printf(\"\");\n  \n  rd_printf(\"%-4s %-8s %-8s %-8s\", \"No.\", \"Oridnal\", \"VOff\", \"Name\");\n  \n  for (U64 i = 0; i < exptab.export_count; ++i) {\n    PE_ParsedExport *exp = exptab.exports+i;\n    if (exp->forwarder.size) {\n      rd_printf(\"%4u %8u %8x %S (forwarded to %S)\", i, exp->ordinal, exp->voff, exp->name, exp->forwarder);\n    } else {\n      rd_printf(\"%4u %8u %8x %S\", i, exp->ordinal, exp->voff, exp->name);\n    }\n  }\n  \n  rd_unindent();\n  scratch_end(scratch);\n}\n\ninternal void\npe_print_static_import_table(Arena *arena, String8List *out, String8 indent, U64 image_base, PE_ParsedStaticImportTable imptab)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  if (imptab.count) {\n    rd_printf(\"# Import Table\");\n    rd_indent();\n    for (U64 dll_idx = 0; dll_idx < imptab.count; ++dll_idx) {\n      PE_ParsedStaticDLLImport *dll = imptab.v+dll_idx;\n      \n      rd_printf(\"Name:                 %S\",    dll->name);\n      rd_printf(\"Import address table: %#llx\", image_base + dll->import_address_table_voff);\n      rd_printf(\"Import name table:    %#llx\", image_base + dll->import_name_table_voff);\n      rd_printf(\"Time stamp:           %#x\",   dll->time_stamp);\n      rd_newline();\n      \n      if (dll->import_count) {\n        rd_indent();\n        for (U64 imp_idx = 0; imp_idx < dll->import_count; ++imp_idx) {\n          PE_ParsedImport *imp = dll->imports+imp_idx;\n          if (imp->type == PE_ParsedImport_Ordinal) {\n            rd_printf(\"%#-6x\", imp->u.ordinal);\n          } else if (imp->type == PE_ParsedImport_Name) {\n            rd_printf(\"%#-6x %S\", imp->u.name.hint, imp->u.name.string);\n          }\n        }\n        rd_unindent();\n        rd_newline();\n      }\n    }\n    rd_unindent();\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\npe_print_delay_import_table(Arena *arena, String8List *out, String8 indent, U64 image_base, PE_ParsedDelayImportTable imptab)\n{\n  if (imptab.count) {\n    Temp scratch = scratch_begin(&arena, 1);\n    rd_printf(\"# Delay Import Table\");\n    rd_indent();\n    \n    for (U64 dll_idx = 0; dll_idx < imptab.count; ++dll_idx) {\n      PE_ParsedDelayDLLImport *dll = imptab.v+dll_idx;\n      \n      rd_printf(\"Attributes:               %#08x\", dll->attributes);\n      rd_printf(\"Name:                     %S\",    dll->name);\n      rd_printf(\"HMODULE address:          %#llx\", dll->module_handle_voff ? image_base + dll->module_handle_voff : 0);\n      rd_printf(\"Import address table:     %#llx\", dll->iat_voff ? image_base + dll->iat_voff : 0);\n      rd_printf(\"Import name table:        %#llx\", dll->name_table_voff ? image_base + dll->name_table_voff : 0);\n      rd_printf(\"Bound import name table:  %#llx\", dll->bound_table_voff ? image_base + dll->bound_table_voff : 0);\n      rd_printf(\"Unload import name table: %#llx\", dll->unload_table_voff ? image_base + dll->unload_table_voff : 0);\n      rd_printf(\"Time stamp:               %#x\",   dll->time_stamp);\n      rd_newline();\n      \n      rd_indent();\n      rd_printf(\"%-16s %-16s %-8s %s\", \"BIAT\", \"UIAT\", \"Hint/Ord\", \"Name\");\n      rd_printf(\"---------------- ---------------- -------- ----\");\n      for (U64 imp_idx = 0; imp_idx < dll->import_count; ++imp_idx) {\n        PE_ParsedImport *imp = dll->imports+imp_idx;\n        \n        String8 bound = str8_lit(\"NULL\");\n        if (imp_idx < dll->bound_table_count) {\n          U64 bound_addr = dll->bound_table[imp_idx];\n          bound = push_str8f(scratch.arena, \"%#llx\", bound_addr);\n        }\n        \n        String8 unload = str8_lit(\"NULL\");\n        if (imp_idx < dll->unload_table_count) {\n          U64 unload_addr = dll->unload_table[imp_idx];\n          unload = push_str8f(scratch.arena, \"%#llx\", unload_addr);\n        }\n        \n        if (imp->type == PE_ParsedImport_Ordinal) {\n          rd_printf(\"%-16S %-16S 0x%-6x %S\", bound, unload, imp->u.ordinal, str8_lit(\"[NONAME]\"));\n        } else if (imp->type == PE_ParsedImport_Name) {\n          rd_printf(\"%-16S %-16S 0x%-6x %S\", bound, unload, imp->u.name.hint, imp->u.name.string);\n        }\n      }\n      rd_unindent();\n      \n      rd_newline();\n    }\n    \n    rd_unindent();\n    scratch_end(scratch);\n  }\n}\n\ninternal void\npe_print_resources(Arena *arena, String8List *out, String8 indent, PE_ResourceDir *root)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  // setup stack\n  struct stack_s {\n    struct stack_s  *next;\n    B32              print_table;\n    B32              is_named;\n    PE_ResourceNode *curr_name_node;\n    PE_ResourceNode *curr_id_node;\n    U64              name_idx;\n    U64              id_idx;\n    U64              dir_idx;\n    U64              dir_id;\n    String8          dir_name;\n    PE_ResourceDir  *table;\n  } *stack = push_array(scratch.arena, struct stack_s, 1);\n  stack->table          = root;\n  stack->print_table    = 1;\n  stack->is_named       = 1;\n  stack->dir_name       = str8_lit(\"ROOT\");\n  stack->curr_name_node = root->named_list.first;\n  stack->curr_id_node   = root->id_list.first;\n  \n  if (stack) {\n    rd_printf(\"# Resources\");\n    \n    // traverse resource tree\n    while (stack) {\n      if (stack->print_table) {\n        stack->print_table = 0;\n        rd_indent();\n        \n        if (stack->is_named) {\n          rd_printf(\"[%u] %S { Time Stamp: %u, Version %u.%u Name Count: %u, ID Count %u, Characteristics: %u }\", \n                    stack->dir_idx,\n                    stack->dir_name,\n                    stack->table->time_stamp, \n                    stack->table->major_version, stack->table->minor_version, \n                    stack->table->named_list.count, stack->table->id_list.count,\n                    stack->table->characteristics);\n        } else {\n          B32 is_actually_leaf = stack->table->id_list.count == 1 && \n            stack->table->id_list.first->data.kind != PE_ResDataKind_DIR;\n          if (is_actually_leaf) {\n            rd_printf(\"[%u] %u { Time Stamp: %u, Version %u.%u Name Count: %u, ID Count %u, Characteristics: %u }\", \n                      stack->dir_idx,\n                      stack->dir_id,\n                      stack->table->time_stamp, \n                      stack->table->major_version, stack->table->minor_version, \n                      stack->table->named_list.count, stack->table->id_list.count,\n                      stack->table->characteristics);\n          } else {\n            String8 id_str = pe_resource_kind_to_string(stack->dir_id);\n            rd_printf(\"[%u] %S { Time Stamp: %u, Version %u.%u Name Count: %u, ID Count %u, Characteristics: %u }\", \n                      stack->dir_idx,\n                      id_str,\n                      stack->dir_id,\n                      stack->table->time_stamp, \n                      stack->table->major_version, stack->table->minor_version, \n                      stack->table->named_list.count, stack->table->id_list.count,\n                      stack->table->characteristics);\n          }\n        }\n      }\n      \n      while (stack->curr_name_node) {\n        PE_ResourceNode *named_node = stack->curr_name_node;\n        stack->curr_name_node = stack->curr_name_node->next;\n        U64 name_idx = stack->name_idx++;\n        \n        PE_Resource *res = &named_node->data;\n        if (res->kind == PE_ResDataKind_DIR) {\n          struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1);\n          frame->table          = res->u.dir;\n          frame->print_table    = 1;\n          frame->dir_idx        = stack->name_idx;\n          frame->dir_name       = res->id.u.string;\n          frame->is_named       = 1;\n          frame->curr_name_node = frame->table->named_list.first;\n          frame->curr_id_node   = frame->table->id_list.first;\n          SLLStackPush(stack, frame);\n          goto yield;\n        } else if (res->kind == PE_ResDataKind_COFF_LEAF) {\n          COFF_ResourceDataEntry *entry = &res->u.leaf;\n          rd_printf(\"[%u] %S Data VOFF: %#08x, Data Size: %#08x, Code Page: %u\", \n                    name_idx, res->id.u.string, entry->data_voff, entry->data_size, entry->code_page);\n        } else {\n          InvalidPath;\n        }\n      }\n      \n      while (stack->curr_id_node) {\n        PE_ResourceNode *id_node = stack->curr_id_node;\n        PE_Resource     *res     = &id_node->data;\n        stack->curr_id_node = stack->curr_id_node->next;\n        U64 id_idx = stack->id_idx++;\n        \n        if (res->kind == PE_ResDataKind_DIR) {\n          struct stack_s *frame = push_array(scratch.arena, struct stack_s, 1);\n          frame->table          = res->u.dir;\n          frame->print_table    = 1;\n          frame->dir_idx        = stack->table->named_list.count + id_idx;\n          frame->dir_id         = res->id.u.number;\n          frame->curr_name_node = frame->table->named_list.first;\n          frame->curr_id_node   = frame->table->id_list.first;\n          SLLStackPush(stack, frame);\n          goto yield;\n        } else if (res->kind == PE_ResDataKind_COFF_LEAF) {\n          COFF_ResourceDataEntry *entry = &res->u.leaf;\n          rd_printf(\"[%u] ID: %u Data VOFF: %#08x, Data Size: %#08x, Code Page: %u\", id_idx, res->id.u.number, entry->data_voff, entry->data_size, entry->code_page);\n        } else {\n          InvalidPath;\n        }\n      }\n      \n      if (stack->curr_id_node == 0 && stack->curr_name_node == 0) {\n        rd_unindent();\n      }\n      \n      SLLStackPop(stack);\n      \n      yield:;\n    }\n    \n    rd_newline();\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\npe_print_exceptions_x8664(Arena              *arena,\n                          String8List        *out,\n                          String8             indent,\n                          U64                 section_count,\n                          COFF_SectionHeader *sections,\n                          String8             raw_data,\n                          Rng1U64             except_frange,\n                          RDI_Parsed         *rdi)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8 raw_except = str8_substr(raw_data, except_frange);\n  U64     count      = raw_except.size / sizeof(PE_IntelPdata);\n  for (U64 i = 0; i < count; ++i) {\n    Temp temp = temp_begin(scratch.arena);\n    \n    U64            pdata_offset = i * sizeof(PE_IntelPdata);\n    PE_IntelPdata *pdata        = str8_deserial_get_raw_ptr(raw_except, pdata_offset, sizeof(*pdata));\n    String8        pdata_name   = rd_proc_name_from_voff(rdi, pdata->voff_first);\n    \n    U64            unwind_info_offset = coff_foff_from_voff(sections, section_count, pdata->voff_unwind_info);\n    PE_UnwindInfo *uwinfo             = str8_deserial_get_raw_ptr(raw_data, unwind_info_offset, sizeof(*uwinfo));\n    \n    U8 version        = PE_UNWIND_INFO_VERSION_FROM_HDR(uwinfo->header);\n    U8 flags          = PE_UNWIND_INFO_FLAGS_FROM_HDR(uwinfo->header);\n    U8 frame_register = PE_UNWIND_INFO_REG_FROM_FRAME(uwinfo->frame);\n    U8 frame_offset   = PE_UNWIND_INFO_OFF_FROM_FRAME(uwinfo->frame);\n    \n    B32 is_chained       = (flags & PE_UnwindInfoFlag_CHAINED) != 0;\n    B32 has_handler_data = !is_chained && (flags & (PE_UnwindInfoFlag_EHANDLER | PE_UnwindInfoFlag_UHANDLER)) != 0;\n    \n    String8 flags_str = str8_zero();\n    {\n      U64 f = flags;\n      \n      String8List flags_list = {0};\n      if (f & PE_UnwindInfoFlag_EHANDLER) {\n        f &= ~PE_UnwindInfoFlag_EHANDLER;\n        str8_list_pushf(scratch.arena, &flags_list, \"EHANDLER\");\n      }\n      if (f & PE_UnwindInfoFlag_UHANDLER) {\n        f &= ~PE_UnwindInfoFlag_UHANDLER;\n        str8_list_pushf(scratch.arena, &flags_list, \"UHANDLER\");\n      }\n      if (f & PE_UnwindInfoFlag_CHAINED) {\n        f &= ~PE_UnwindInfoFlag_CHAINED;\n        str8_list_pushf(scratch.arena, &flags_list, \"CHAINED\");\n      }\n      if (f) {\n        str8_list_pushf(scratch.arena, &flags_list, \"%#llx\", f);\n      }\n      if (flags_list.node_count == 0) {\n        str8_list_pushf(scratch.arena, &flags_list, \"%#llx\", f);\n      }\n      flags_str = str8_list_join(scratch.arena, &flags_list, &(StringJoin){.sep=str8_lit(\", \")});\n    }\n    \n    U64            codes_offset = unwind_info_offset + sizeof(PE_UnwindInfo);\n    PE_UnwindCode *code_ptr     = str8_deserial_get_raw_ptr(raw_data, codes_offset, sizeof(*code_ptr) * uwinfo->codes_num);\n    PE_UnwindCode *code_opl     = code_ptr + uwinfo->codes_num;\n    \n    if (i > 0) {\n      rd_newline();\n    }\n    rd_printf(\"%08x %08x %08x %08x%s%S\",\n              pdata_offset,\n              pdata->voff_first,\n              pdata->voff_one_past_last,\n              pdata->voff_unwind_info,\n              pdata_name.size ? \" \" : \"\", pdata_name);\n    rd_printf(\"Version:     %u\",  version);\n    rd_printf(\"Flags:       %S\",  flags_str);\n    rd_printf(\"Prolog Size: %#x\", uwinfo->prolog_size);\n    rd_printf(\"Code Count:  %u\",  uwinfo->codes_num);\n    rd_printf(\"Frame:       %u\",  uwinfo->frame);\n    rd_printf(\"Codes:\");\n    rd_indent();\n    for (; code_ptr < code_opl;) {\n      Temp code_temp = temp_begin(scratch.arena);\n      String8List code_list = {0};\n      \n      U8 operation_code = PE_UNWIND_OPCODE_FROM_FLAGS(code_ptr[0].flags);\n      U8 operation_info = PE_UNWIND_INFO_FROM_FLAGS(code_ptr[0].flags);\n      \n      str8_list_pushf(code_temp.arena, &code_list, \"%#04x:\", code_ptr[0].off_in_prolog);\n      switch (operation_code) {\n        case PE_UnwindOpCode_PUSH_NONVOL: {\n          String8 gpr = pe_string_from_unwind_gpr_x64(operation_info);\n          str8_list_pushf(code_temp.arena, &code_list, \"PUSH_NONVOL %S\", gpr);\n          code_ptr += 1;\n        } break;\n        case PE_UnwindOpCode_ALLOC_LARGE: {\n          U64 size = 0;\n          switch (operation_info) {\n            case 0: { // 136B - 512K\n              size = code_ptr[1].u16*8;\n            } break;\n            case 1: { // 512K - 4GB\n              size = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16);\n            } break;\n            default: break;\n          }\n          str8_list_pushf(code_temp.arena, &code_list, \"ALLOC_LARGE size=%#x\", size);\n          code_ptr += 2;\n        } break;\n        case PE_UnwindOpCode_ALLOC_SMALL: {\n          U64 size = operation_info*8 + 8;\n          str8_list_pushf(code_temp.arena, &code_list, \"ALLOC_SMALL size=%#x\", size);\n          code_ptr += 1;\n        } break;\n        case PE_UnwindOpCode_SET_FPREG: {\n          U64     offset = frame_offset*16;\n          String8 gpr    = pe_string_from_unwind_gpr_x64(frame_register);\n          str8_list_pushf(code_temp.arena, &code_list, \"SET_FPREG %S, offset=%#x\", gpr, offset);\n          code_ptr += 1;\n        } break;\n        case PE_UnwindOpCode_SAVE_NONVOL: {\n          String8 gpr             = pe_string_from_unwind_gpr_x64(operation_info);\n          U64     register_offset = code_ptr[1].u16*8;\n          str8_list_pushf(code_temp.arena, &code_list, \"SAVE_NONVOL %S, offset=%#x\", gpr, register_offset);\n          code_ptr += 2;\n        } break;\n        case PE_UnwindOpCode_SAVE_NONVOL_FAR: {\n          String8 gpr          = pe_string_from_unwind_gpr_x64(operation_info);\n          U64     frame_offset = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16);\n          str8_list_pushf(code_temp.arena, &code_list, \"SAVE_NONVOL_FAR %S, offset=%#x\", gpr, frame_offset);\n          code_ptr += 3;\n        } break;\n        case PE_UnwindOpCode_EPILOG: {\n          str8_list_pushf(code_temp.arena, &code_list, \"EPILOG flags=%#x\", code_ptr[0].flags);\n          code_ptr += 1;\n        } break;\n        case PE_UnwindOpCode_SPARE_CODE: {\n          str8_list_pushf(code_temp.arena, &code_list, \"SPARE_CODE\");\n          code_ptr += 1;\n        } break;\n        case PE_UnwindOpCode_SAVE_XMM128: {\n          String8 gpr             = pe_string_from_unwind_gpr_x64(operation_info);\n          U64     register_offset = code_ptr[1].u16*16;\n          str8_list_pushf(code_temp.arena, &code_list, \"SAVE_XMM128 %S, offset=%#x\", gpr, register_offset);\n          code_ptr += 2;\n        } break;\n        case PE_UnwindOpCode_SAVE_XMM128_FAR: {\n          String8 gpr          = pe_string_from_unwind_gpr_x64(operation_info);\n          U64     frame_offset = code_ptr[1].u16 + ((U32)code_ptr[2].u16 << 16);\n          str8_list_pushf(code_temp.arena, &code_list, \"SAVE_XMM128_FAR %S, offset=%#x\", gpr, frame_offset);\n          code_ptr += 3;\n        } break;\n        case PE_UnwindOpCode_PUSH_MACHFRAME: {\n          str8_list_pushf(code_temp.arena, &code_list, \"PUSH_MACHFRAME %s\", operation_info == 1  ? \"with error code\" : \"without error code\");\n          code_ptr += 1;\n        } break;\n        default: {\n          str8_list_pushf(code_temp.arena, &code_list, \"UNKNOWN_OPCODE %#x\", operation_code);\n          code_ptr += 1;\n        } break;\n      }\n      \n      String8 code_line = str8_list_join(code_temp.arena, &code_list, &(StringJoin){.sep=str8_lit(\" \")});\n      rd_printf(\"%S\", code_line);\n      \n      temp_end(code_temp);\n    }\n    rd_unindent();\n    \n    if (is_chained) {\n      U64            next_pdata_offset = codes_offset + sizeof(PE_UnwindCode) * AlignPow2(uwinfo->codes_num, 2);\n      PE_IntelPdata *next_pdata        = str8_deserial_get_raw_ptr(raw_data, next_pdata_offset, sizeof(*next_pdata));\n      rd_printf(\"Chained: %#08x %#08x %#08x\", next_pdata->voff_first, next_pdata->voff_one_past_last, next_pdata->voff_unwind_info);\n    }\n    \n    if (has_handler_data) {\n#define ExceptionHandlerDataFlag_FuncInfo   (1 << 0)\n#define ExceptionHandlerDataFlag_FuncInfo4  (1 << 1)\n#define ExceptionHandlerDataFlag_ScopeTable (1 << 2)\n#define ExceptionHandlerDataFlag_GS         (1 << 3u)\n      \n      U64 actual_code_count = PE_UNWIND_INFO_GET_CODE_COUNT(uwinfo->codes_num);\n      U64 read_cursor       = codes_offset + actual_code_count * sizeof(PE_UnwindCode);\n      \n      U32 handler = 0; \n      read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &handler);\n      \n      String8 handler_name = rd_proc_name_from_voff(rdi, handler);\n      rd_printf(\"Handler: %#llx%s%S\", handler, handler_name.size ? \" \" : \"\", handler_name);\n      \n      U32 handler_data_flags = 0;\n      if (str8_match_lit(\"__GSHandlerCheck_EH4\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_FuncInfo4;\n      } else if (str8_match_lit(\"__CxxFrameHandler4\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_FuncInfo4;\n      } else if (str8_match_lit(\"__CxxFrameHandler3\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_FuncInfo;\n      } else if (str8_match_lit(\"__C_specific_handler\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_ScopeTable;\n      } else if (str8_match_lit(\"__GSHandlerCheck\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_GS;\n      } else if (str8_match_lit(\"__GSHandlerCheck_SEH\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_ScopeTable|ExceptionHandlerDataFlag_GS;\n      } else if (str8_match_lit(\"__GSHandlerCheck_EH\", handler_name, 0)) {\n        handler_data_flags = ExceptionHandlerDataFlag_FuncInfo|ExceptionHandlerDataFlag_GS;\n      }\n      \n      if (handler_data_flags & ExceptionHandlerDataFlag_FuncInfo) {\n        MSCRT_FuncInfo func_info;\n        read_cursor += mscrt_parse_func_info(arena, raw_data, section_count, sections, read_cursor, &func_info);\n        \n        rd_printf(\"Function Info:\");\n        rd_indent();\n        rd_printf(\"Magic:                      %#x\", func_info.magic);\n        rd_printf(\"Max State:                  %u\",  func_info.max_state);\n        rd_printf(\"Try Block Count:            %u\",  func_info.try_block_map_count);\n        rd_printf(\"IP Map Count:               %u\",  func_info.ip_map_count);\n        rd_printf(\"Frame Offset Unwind Helper: %#x\", func_info.frame_offset_unwind_helper);\n        rd_printf(\"ES Flags:                   %#x\", func_info.eh_flags);\n        rd_unindent();\n        \n        if (func_info.ip_map_count > 0) {\n          rd_printf(\"IP to State Map:\");\n          rd_indent();\n          rd_printf(\"%8s %8s\", \"State\", \"IP\");\n          for (U32 i = 0; i < func_info.ip_map_count; ++i) {\n            MSCRT_IPState32 state = func_info.ip_map[i];\n            String8 line = rd_format_line_from_voff(scratch.arena, rdi, state.ip, PathStyle_WindowsAbsolute);\n            rd_printf(\"%8d %08x %S\", state.state, state.ip, line);\n          }\n          rd_unindent();\n        }\n        \n        if (func_info.max_state > 0) {\n          rd_printf(\"Unwind Map:\");\n          rd_indent();\n          rd_printf(\"%13s  %10s  %8s\", \"Current State\", \"Next State\", \"Action @\");\n          for (U32 i = 0; i < func_info.max_state; ++i) {\n            MSCRT_UnwindMap32 map = func_info.unwind_map[i];\n            String8 line = rd_format_line_from_voff(scratch.arena, rdi, map.action_virt_off, PathStyle_WindowsAbsolute);\n            rd_printf(\"%13u  %10d  %8x %S\", i, map.next_state, map.action_virt_off, line);\n          }\n          rd_unindent();\n        }\n        \n        for (U32 i = 0; i < func_info.try_block_map_count; ++i) {\n          MSCRT_TryMapBlock try_block = func_info.try_block_map[i];\n          rd_printf(\"Try Map Block #%u\", i);\n          rd_indent();\n          rd_printf(\"Try State Low:    %u\", try_block.try_low);\n          rd_printf(\"Try State High:   %u\", try_block.try_high);\n          rd_printf(\"Catch State High: %u\", try_block.catch_high);\n          rd_printf(\"Catch Count:      %u\", try_block.catch_handlers_count);\n          rd_printf(\"Catches:\");\n          rd_indent();\n          for (U32 ihandler = 0; ihandler < try_block.catch_handlers_count; ++ihandler) {\n            rd_printf(\"Catch #%u\", ihandler);\n            rd_indent();\n            mscrt_print_eh_handler_type32(arena, out, indent, rdi, &try_block.catch_handlers[ihandler]);\n            rd_unindent();\n          }\n          rd_unindent();\n          rd_unindent();\n        }\n        \n        if (func_info.es_type_list.count) {\n          rd_printf(\"Exception Specific Types:\");\n          rd_indent();\n          for (U32 i = 0; i < func_info.es_type_list.count; ++i) {\n            if (i > 0) {\n              rd_newline();\n            }\n            mscrt_print_eh_handler_type32(arena, out, indent, rdi, &func_info.es_type_list.handlers[i]);\n          }\n          rd_unindent();\n        }\n      }\n      if (handler_data_flags & ExceptionHandlerDataFlag_FuncInfo4) {\n        U32 func_info_voff = 0, unknown = 0;\n        read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &func_info_voff);\n        read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &unknown);\n        \n        U64                    func_info_foff = coff_foff_from_voff(sections, section_count, func_info_voff);\n        MSCRT_ParsedFuncInfoV4 func_info      = {0};\n        mscrt_parse_func_info_v4(arena, raw_data, section_count, sections, func_info_foff, pdata->voff_first, &func_info);\n        \n        String8 header_str = str8_zero();\n        {\n          String8List header_list = {0};\n          if (func_info.header & MSCRT_FuncInfoV4Flag_IsCatch) {\n            str8_list_pushf(scratch.arena, &header_list, \"IsCatch\");\n          }\n          if (func_info.header & MSCRT_FuncInfoV4Flag_IsSeparated) {\n            str8_list_pushf(scratch.arena, &header_list, \"IsSeparted\");\n          }\n          if (func_info.header & MSCRT_FuncInfoV4Flag_IsBBT) {\n            str8_list_pushf(scratch.arena, &header_list, \"IsBBT\");\n          }\n          if (func_info.header & MSCRT_FuncInfoV4Flag_UnwindMap) {\n            str8_list_pushf(scratch.arena, &header_list, \"UnwindMap\");\n          }\n          if (func_info.header & MSCRT_FuncInfoV4Flag_TryBlockMap) {\n            str8_list_pushf(scratch.arena, &header_list, \"TryBlockMap\");\n          }\n          if (func_info.header & MSCRT_FuncInfoV4Flag_EHs) {\n            str8_list_pushf(scratch.arena, &header_list, \"EHs\");\n          }\n          if (func_info.header & MSCRT_FuncInfoV4Flag_NoExcept) {\n            str8_list_pushf(scratch.arena, &header_list, \"NoExcept\");\n          }\n          header_str = str8_list_join(scratch.arena, &header_list, &(StringJoin){.sep=str8_lit(\", \")});\n        }\n        \n        rd_printf(\"Function Info V4:\");\n        rd_indent();\n        rd_printf(\"Header:                %#x %S\", func_info.header, header_str);\n        rd_printf(\"BBT Flags:             %#x\",    func_info.bbt_flags);\n        \n        MSCRT_IP2State32V4 ip2state_map = func_info.ip2state_map;\n        rd_printf(\"IP To State Map:\");\n        rd_indent();\n        rd_printf(\"%8s %8s\", \"State\", \"IP\");\n        for (U32 i = 0; i < ip2state_map.count; ++i) {\n          String8 line_str = rd_format_line_from_voff(scratch.arena, rdi, ip2state_map.voffs[i], PathStyle_WindowsAbsolute);\n          rd_printf(\"%8d %08X %S\", ip2state_map.states[i], ip2state_map.voffs[i], line_str);\n        }\n        rd_unindent();\n        \n        if (func_info.header & MSCRT_FuncInfoV4Flag_UnwindMap) {\n          MSCRT_UnwindMapV4 unwind_map = func_info.unwind_map;\n          rd_printf(\"Unwind Map:\");\n          rd_indent();\n          for (U32 i = 0; i < unwind_map.count; ++i) {\n            MSCRT_UnwindEntryV4 *ue       = &unwind_map.v[i];\n            String8                 type_str = str8_zero();\n            switch (ue->type) {\n              case MSCRT_UnwindMapV4Type_NoUW:             type_str = str8_lit(\"NoUW\");             break;\n              case MSCRT_UnwindMapV4Type_DtorWithObj:      type_str = str8_lit(\"DtorWithObj\");      break;\n              case MSCRT_UnwindMapV4Type_DtorWithPtrToObj: type_str = str8_lit(\"DtorWithPtrToObj\"); break;\n              case MSCRT_UnwindMapV4Type_VOFF:             type_str = str8_lit(\"VOFF\");             break;\n            }\n            if (ue->type == MSCRT_UnwindMapV4Type_DtorWithObj || ue->type == MSCRT_UnwindMapV4Type_DtorWithPtrToObj) {\n              rd_printf(\"[%2u] NextOff=%u Type=%-16S Action=%#08x Object=%#x\", i, ue->next_off, type_str, ue->action, ue->object);\n            } else if (ue->type == MSCRT_UnwindMapV4Type_VOFF) {\n              rd_printf(\"[%2u] NextOff=%u Type=%-16S Action=%#08x\", i, ue->next_off, type_str, ue->action);\n            } else {\n              rd_printf(\"[%2u] NextOff=%u Type=%S\", i, ue->next_off, type_str);\n            }\n          }\n          rd_unindent();\n        }\n        \n        if (func_info.header & MSCRT_FuncInfoV4Flag_TryBlockMap) {\n          MSCRT_TryBlockMapV4Array try_block_map = func_info.try_block_map;\n          rd_printf(\"Try/Catch Blocks:\");\n          rd_indent();\n          for (U32 i = 0; i < try_block_map.count; ++i) {\n            MSCRT_TryBlockMapV4 *try_block = &try_block_map.v[i];\n            rd_printf(\"[%2u] TryLow %u TryHigh %u CatchHigh %u\", i, try_block->try_low, try_block->try_high, try_block->catch_high);\n            if (try_block->handlers.count) {\n              for (U32 k = 0; k < try_block->handlers.count; ++k) {\n                MSCRT_EhHandlerTypeV4 *handler = &try_block->handlers.v[k];\n                \n                String8List line_list = {0};\n                str8_list_pushf(arena, &line_list, \"  \");\n                str8_list_pushf(arena, &line_list, \"CatchCodeVOff=%#08X\", handler->catch_code_voff);\n                if (handler->flags & MSCRT_EhHandlerV4Flag_Adjectives) {\n                  String8 adjectives = mscrt_string_from_eh_adjectives(arena, handler->adjectives);\n                  str8_list_pushf(arena, &line_list, \"Adjectives=%S\", adjectives);\n                }\n                if (handler->flags & MSCRT_EhHandlerV4Flag_DispType) {\n                  str8_list_pushf(arena, &line_list, \"TypeVOff=%#x\", handler->type_voff);\n                }\n                if (handler->flags & MSCRT_EhHandlerV4Flag_DispCatchObj) {\n                  str8_list_pushf(arena, &line_list, \"CacthObjVOff=%#x\", handler->catch_obj_voff);\n                }\n                if (handler->flags & MSCRT_EhHandlerV4Flag_ContIsVOff) {\n                  str8_list_pushf(arena, &line_list, \"ContIsVOff\");\n                }\n                for (U32 icont = 0; icont < handler->catch_funclet_cont_addr_count; ++icont) {\n                  str8_list_pushf(arena, &line_list, \"ContAddr[%u]=%#llx\", icont, handler->catch_funclet_cont_addr[icont]);\n                }\n                \n                String8 handler_str = str8_list_join(arena, &line_list, &(StringJoin){.sep=str8_lit(\" \")});\n                rd_printf(\"%S\", handler_str);\n              }\n            }\n          }\n          rd_unindent();\n        }\n      }\n      if (handler_data_flags & ExceptionHandlerDataFlag_ScopeTable) {\n        U32 scope_count = 0;\n        read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &scope_count);\n        \n        PE_HandlerScope *scopes = str8_deserial_get_raw_ptr(raw_data, read_cursor, sizeof(PE_HandlerScope)*scope_count); \n        read_cursor += scope_count*sizeof(scopes[0]);\n        \n        rd_printf(\"Count of scope table entries: %u\", scope_count);\n        rd_indent();\n        rd_printf(\"%-8s %-8s %-8s %-8s\", \"Begin\", \"End\", \"Handler\", \"Target\");\n        for (U32 i = 0; i < scope_count; ++i) {\n          PE_HandlerScope scope = scopes[i];\n          rd_printf(\"%08x %08x %08x %08x\", scope.begin, scope.end, scope.handler, scope.target);\n        }\n        rd_unindent();\n      }\n      if (handler_data_flags & ExceptionHandlerDataFlag_GS) {\n        U32 gs_data = 0;\n        read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &gs_data);\n        \n        U32 flags               = MSCRT_GSHandler_GetFlags(gs_data);\n        U32 cookie_offset       = MSCRT_GSHandler_GetCookieOffset(gs_data);\n        U32 aligned_base_offset = 0;\n        U32 alignment           = 0;\n        if (flags & MSCRT_GSHandlerFlag_HasAlignment) {\n          read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &aligned_base_offset);\n          read_cursor += str8_deserial_read_struct(raw_data, read_cursor, &alignment);\n        }\n        \n        String8 flags_str;\n        {\n          String8List flags_list = {0};\n          if (flags & MSCRT_GSHandlerFlag_EHandler) {\n            str8_list_pushf(arena, &flags_list, \"EHandler\");\n          }\n          if (flags & MSCRT_GSHandlerFlag_UHandler) {\n            str8_list_pushf(arena, &flags_list, \"UHandler\");\n          }\n          if (flags & MSCRT_GSHandlerFlag_HasAlignment) {\n            str8_list_pushf(arena, &flags_list, \"Has Alignment\");\n          }\n          if (flags == 0) {\n            str8_list_pushf(arena, &flags_list, \"None\");\n          }\n          flags_str = str8_list_join(arena, &flags_list, &(StringJoin){.sep=str8_lit(\", \")});\n        }\n        rd_printf(\"GS unwind flags:     %S\", flags_str);\n        rd_printf(\"Cookie offset:       %x\", cookie_offset);\n        if (flags & MSCRT_GSHandlerFlag_HasAlignment) {\n          rd_printf(\"Aligned base offset: %x\", aligned_base_offset);\n          rd_printf(\"Alignment:           %x\", alignment);\n        }\n      }\n      \n#undef ExceptionHandlerDataFlag_FuncInfo\n#undef ExceptionHandlerDataFlag_ScopeTable\n#undef ExceptionHandlerDataFlag_GS\n    }\n    \n    temp_end(temp);\n  } \n  \n  scratch_end(scratch);\n}\n\ninternal void\npe_print_exceptions(Arena              *arena,\n                    String8List        *out,\n                    String8             indent,\n                    COFF_MachineType    machine,\n                    U64                 section_count,\n                    COFF_SectionHeader *sections,\n                    String8             raw_data,\n                    Rng1U64             except_frange,\n                    RDI_Parsed         *rdi)\n{\n  if (dim_1u64(except_frange)) {\n    rd_printf(\"# Exceptions\");\n    rd_indent();\n    rd_printf(\"%-8s %-8s %-8s %-8s\", \"Offset\", \"Begin\", \"End\", \"Unwind Info\");\n    switch (machine) {\n      case COFF_MachineType_Unknown: break;\n      case COFF_MachineType_X64:\n      case COFF_MachineType_X86: {\n        pe_print_exceptions_x8664(arena, out, indent, section_count, sections, raw_data, except_frange, rdi);\n      } break;\n      default: NotImplemented; break;\n    }\n    rd_unindent();\n    rd_newline();\n  }\n}\n\ninternal void\npe_print_base_relocs(Arena              *arena,\n                     String8List        *out,\n                     String8             indent,\n                     COFF_MachineType    machine,\n                     U64                 image_base,\n                     U64                 section_count,\n                     COFF_SectionHeader *sections,\n                     String8             raw_data,\n                     Rng1U64             base_reloc_franges,\n                     RDI_Parsed         *rdi)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  String8               raw_base_relocs = str8_substr(raw_data, base_reloc_franges);\n  PE_BaseRelocBlockList base_relocs     = pe_base_reloc_block_list_from_data(scratch.arena, raw_base_relocs);\n  \n  if (base_relocs.count) {\n    rd_printf(\"# Base Relocs\");\n    rd_indent();\n    \n    U32 addr_size = 0;\n    switch (machine) {\n      case COFF_MachineType_Unknown: break;\n      case COFF_MachineType_X86:     addr_size = 4; break;\n      case COFF_MachineType_X64:     addr_size = 8; break;\n      default: NotImplemented;\n    }\n    \n    // convert blocks to string list\n    U64 iblock = 0;\n    for (PE_BaseRelocBlockNode *node = base_relocs.first; node != 0; node = node->next) {\n      PE_BaseRelocBlock *block = &node->v;\n      rd_printf(\"Block No. %u, Virt Off %#x, Reloc Count %u\", iblock++, block->page_virt_off, block->entry_count);\n      rd_indent();\n      for (U64 ientry = 0; ientry < block->entry_count; ++ientry) {\n        PE_BaseRelocKind type   = PE_BaseRelocKindFromEntry(block->entries[ientry]);\n        U16              offset = PE_BaseRelocOffsetFromEntry(block->entries[ientry]);\n        \n        U64 apply_to_voff = block->page_virt_off + offset;\n        U64 apply_to_foff = coff_foff_from_voff(sections, section_count, apply_to_voff);\n        U64 apply_to      = 0;\n        str8_deserial_read(raw_data, apply_to_foff, &apply_to, addr_size, 1);\n        U64 addr = image_base + apply_to;\n        \n        const char *type_str = \"???\";\n        switch (type) {\n          case PE_BaseRelocKind_ABSOLUTE: type_str = \"ABS\";     break;\n          case PE_BaseRelocKind_HIGH:     type_str = \"HIGH\";    break;\n          case PE_BaseRelocKind_LOW:      type_str = \"LOW\";     break;\n          case PE_BaseRelocKind_HIGHLOW:  type_str = \"HIGHLOW\"; break;\n          case PE_BaseRelocKind_HIGHADJ:  type_str = \"HIGHADJ\"; break;\n          case PE_BaseRelocKind_DIR64:    type_str = \"DIR64\";   break;\n          default: {\n            switch (machine) {\n              case COFF_MachineType_Arm:\n              case COFF_MachineType_Arm64:\n              case COFF_MachineType_ArmNt: {\n                switch (type) {\n                  case PE_BaseRelocKind_ARM_MOV32:   type_str = \"ARM_MOV32\";   break;\n                  case PE_BaseRelocKind_THUMB_MOV32: type_str = \"THUMB_MOV32\"; break;\n                  default: NotImplemented;\n                }\n              } break;\n              // TODO: mips, loong, risc-v\n            }\n          } break;\n        }\n        \n        if (type == PE_BaseRelocKind_ABSOLUTE) {\n          rd_printf(\"%-4x %-12s\", offset, type_str);\n        } else {\n          U64     reloc_voff = apply_to - image_base;\n          String8 name       = rd_format_proc_line(scratch.arena, rdi, reloc_voff);\n          rd_printf(\"%-4x %-12s %016llx%s%S\", offset, type_str, apply_to, name.size ? \" \" : \"\", name);\n        }\n      }\n      rd_unindent();\n      rd_newline();\n    }\n    \n    rd_unindent();\n  }\n  \n  scratch_end(scratch);\n}\n\ninternal void\npe_print(Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Option opts, RDI_Parsed *rdi)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  PE_DosHeader *dos_header = str8_deserial_get_raw_ptr(raw_data, 0, sizeof(*dos_header));\n  if (!dos_header) {\n    rd_errorf(\"not enough bytes to read DOS header\");\n    goto exit;\n  }\n  Assert(dos_header->magic == PE_DOS_MAGIC);\n  \n  U32 pe_magic = 0;\n  str8_deserial_read_struct(raw_data, dos_header->coff_file_offset, &pe_magic);\n  if (pe_magic != PE_MAGIC) {\n    rd_errorf(\"PE magic check failure, input file is not of PE format\");\n    goto exit;\n  }\n  \n  U64              file_header_off = dos_header->coff_file_offset+sizeof(pe_magic);\n  COFF_FileHeader *file_header     = str8_deserial_get_raw_ptr(raw_data, file_header_off, sizeof(*file_header));\n  if (!file_header) {\n    rd_errorf(\"not enough bytes to read COFF header\");\n    goto exit;\n  }\n  \n  U64 opt_header_off   = file_header_off + sizeof(*file_header);\n  U16 opt_header_magic = 0;\n  str8_deserial_read_struct(raw_data, opt_header_off, &opt_header_magic);\n  if (opt_header_magic != PE_PE32_MAGIC && opt_header_magic != PE_PE32PLUS_MAGIC) {\n    rd_errorf(\"unexpected optional header magic %#x\", opt_header_magic);\n    goto exit;\n  }\n  \n  if (opt_header_magic == PE_PE32_MAGIC && file_header->optional_header_size < sizeof(PE_OptionalHeader32)) {\n    rd_errorf(\"unexpected optional header size in COFF header %m, expected at least %m\", file_header->optional_header_size, sizeof(PE_OptionalHeader32));\n    goto exit;\n  }\n  \n  if (opt_header_magic == PE_PE32PLUS_MAGIC && file_header->optional_header_size < sizeof(PE_OptionalHeader32Plus)) {\n    rd_errorf(\"unexpected optional header size %m, expected at least %m\", file_header->optional_header_size, sizeof(PE_OptionalHeader32Plus));\n    goto exit;\n  }\n  \n  U64                 sections_off = file_header_off + sizeof(*file_header) + file_header->optional_header_size;\n  COFF_SectionHeader *sections     = str8_deserial_get_raw_ptr(raw_data, sections_off, sizeof(*sections)*file_header->section_count);\n  if (!sections) {\n    rd_errorf(\"not enough bytes to read COFF section headers\");\n    goto exit;\n  }\n  \n  U64     string_table_off = file_header->symbol_table_foff + sizeof(COFF_Symbol16) * file_header->symbol_count;\n  String8 raw_string_table = str8_substr(raw_data, rng_1u64(string_table_off, raw_data.size));\n  \n  COFF_Symbol32Array symbols = coff_symbol_array_from_data_16(scratch.arena, raw_data, file_header->symbol_table_foff, file_header->symbol_count);\n  \n  U8 *raw_opt_header = push_array(scratch.arena, U8, file_header->optional_header_size);\n  str8_deserial_read_array(raw_data, opt_header_off, raw_opt_header, file_header->optional_header_size);\n  \n  if (opts & RD_Option_Headers) {\n    coff_print_file_header(arena, out, indent, file_header);\n    rd_newline();\n  }\n  \n  Arch              arch       = arch_from_coff_machine(file_header->machine);\n  U64               image_base = 0;\n  U64               dir_count  = 0;\n  PE_DataDirectory *dirs       = 0;\n  \n  if (opt_header_magic == PE_PE32_MAGIC) {\n    PE_OptionalHeader32 *opt_header = (PE_OptionalHeader32 *)raw_opt_header;\n    image_base = opt_header->image_base;\n    dir_count  = opt_header->data_dir_count;\n    dirs       = str8_deserial_get_raw_ptr(raw_data, opt_header_off+sizeof(*opt_header), sizeof(*dirs) * opt_header->data_dir_count);\n    if (!dirs) {\n      rd_errorf(\"unable to read data directories\");\n      goto exit;\n    }\n    \n    if (opts & RD_Option_Headers) {\n      pe_print_optional_header32(arena, out, indent, opt_header, dirs);\n    }\n  } else if (opt_header_magic == PE_PE32PLUS_MAGIC) {\n    PE_OptionalHeader32Plus *opt_header = (PE_OptionalHeader32Plus *)raw_opt_header;\n    image_base = opt_header->image_base;\n    dir_count  = opt_header->data_dir_count;\n    dirs       = str8_deserial_get_raw_ptr(raw_data, opt_header_off+sizeof(*opt_header), sizeof(*dirs) * opt_header->data_dir_count);\n    if (!dirs) {\n      rd_errorf(\"unable to read data directories\");\n      goto exit;\n    }\n    \n    if (opts & RD_Option_Headers) {\n      pe_print_optional_header32plus(arena, out, indent, opt_header, dirs);\n    }\n  }\n  \n  // map data directory RVA to file offsets\n  Rng1U64 *dirs_file_ranges = push_array(scratch.arena, Rng1U64, dir_count);\n  Rng1U64 *dirs_virt_ranges = push_array(scratch.arena, Rng1U64, dir_count);\n  for (U64 i = 0; i < dir_count; ++i) {\n    PE_DataDirectory dir = dirs[i];\n    U64 file_off = coff_foff_from_voff(sections, file_header->section_count, dir.virt_off);\n    dirs_file_ranges[i] = r1u64(file_off, file_off+dir.virt_size);\n    dirs_virt_ranges[i] = r1u64(dir.virt_off, dir.virt_off+dir.virt_size);\n  }\n  \n  if (opts & RD_Option_Sections) {\n    coff_print_section_table(arena, out, indent, raw_string_table, symbols, file_header->section_count, sections);\n  }\n  \n  if (opts & RD_Option_Relocs) {\n    coff_print_relocs(arena, out, indent, raw_data, raw_string_table, file_header->machine, file_header->section_count, sections, symbols);\n  }\n  \n  if (opts & RD_Option_Symbols) {\n    coff_print_symbol_table(arena, out, indent, raw_data, 0, raw_string_table, symbols);\n  }\n  \n  if (opts & RD_Option_Exports) {\n    PE_ParsedExportTable exptab = pe_exports_from_data(arena,\n                                                       file_header->section_count,\n                                                       sections,\n                                                       raw_data,\n                                                       dirs_file_ranges[PE_DataDirectoryIndex_EXPORT],\n                                                       dirs_virt_ranges[PE_DataDirectoryIndex_EXPORT]);\n    pe_print_export_table(arena, out, indent, exptab);\n  }\n  \n  if (opts & RD_Option_Imports) {\n    B32                        is_pe32       = opt_header_magic == PE_PE32_MAGIC;\n    PE_ParsedStaticImportTable static_imptab = pe_static_imports_from_data(arena, is_pe32, file_header->section_count, sections, raw_data, dirs_file_ranges[PE_DataDirectoryIndex_IMPORT]);\n    PE_ParsedDelayImportTable  delay_imptab  = pe_delay_imports_from_data(arena, is_pe32, file_header->section_count, sections, raw_data, dirs_file_ranges[PE_DataDirectoryIndex_DELAY_IMPORT]);\n    pe_print_static_import_table(arena, out, indent, image_base, static_imptab);\n    pe_print_delay_import_table(arena, out, indent, image_base, delay_imptab);\n  }\n  \n  if (opts & RD_Option_Resources) {\n    String8         raw_dir  = str8_substr(raw_data, dirs_file_ranges[PE_DataDirectoryIndex_RESOURCES]);\n    PE_ResourceDir *dir_root = pe_resource_table_from_directory_data(scratch.arena, raw_dir);\n    pe_print_resources(arena, out, indent, dir_root);\n  }\n  \n  if (opts & RD_Option_Exceptions) {\n    pe_print_exceptions(arena, out, indent, file_header->machine, file_header->section_count, sections, raw_data, dirs_file_ranges[PE_DataDirectoryIndex_EXCEPTIONS], rdi);\n  }\n  \n  if (opts & RD_Option_Relocs) {\n    pe_print_base_relocs(arena, out, indent, file_header->machine, image_base, file_header->section_count, sections, raw_data, dirs_file_ranges[PE_DataDirectoryIndex_BASE_RELOC], rdi);\n  }\n  \n  if (opts & RD_Option_Debug) {\n    if (PE_DataDirectoryIndex_DEBUG < dir_count) {\n      String8 raw_dir = str8_substr(raw_data, dirs_file_ranges[PE_DataDirectoryIndex_DEBUG]);\n      pe_print_debug_diretory(arena, out, indent, raw_data, raw_dir);\n    }\n  }\n  \n  if (opts & RD_Option_Tls) {\n    if (dim_1u64(dirs_file_ranges[PE_DataDirectoryIndex_TLS])) {\n      PE_ParsedTLS tls = pe_tls_from_data(scratch.arena, file_header->machine, image_base, file_header->section_count, sections, raw_data, dirs_file_ranges[PE_DataDirectoryIndex_TLS]);\n      pe_print_tls(arena, out, indent, tls);\n    }\n  }\n  \n  if (opts & RD_Option_LoadConfig) {\n    String8 raw_lc = str8_substr(raw_data, dirs_file_ranges[PE_DataDirectoryIndex_LOAD_CONFIG]);\n    if (raw_lc.size) {\n      switch (file_header->machine) {\n        case COFF_MachineType_Unknown: break;\n        case COFF_MachineType_X86: {\n          PE_LoadConfig32 *lc = str8_deserial_get_raw_ptr(raw_lc, 0, sizeof(*lc));\n          if (lc) {\n            pe_print_load_config32(arena, out, indent, lc);\n          } else {\n            rd_errorf(\"not enough bytes to parse 32bit load config\");\n          }\n        } break;\n        case COFF_MachineType_X64: {\n          PE_LoadConfig64 *lc = str8_deserial_get_raw_ptr(raw_lc, 0, sizeof(*lc));\n          if (lc) {\n            pe_print_load_config64(arena, out, indent, lc);\n          } else {\n            rd_errorf(\"not enough bytes to parse 64bit load config\");\n          }\n        } break;\n        default: NotImplemented;\n      }\n    }\n  }\n  \n  RD_MarkerArray *section_markers = 0;\n  if (opts & (RD_Option_Disasm|RD_Option_Rawdata)) {\n    if (rdi) {\n      section_markers = rd_section_markers_from_rdi(scratch.arena, rdi);\n    } else {\n      section_markers = rd_section_markers_from_coff_symbol_table(scratch.arena, raw_string_table, file_header->section_count, symbols);\n    }\n  }\n  \n  if (opts & RD_Option_Rawdata) {\n    coff_raw_data_sections(arena, out, indent, raw_data, 0, section_markers, file_header->section_count, sections);\n  }\n  \n  if (opts & RD_Option_Disasm) {\n    coff_disasm_sections(arena, out, indent, raw_data, file_header->machine, 0, 1, section_markers, file_header->section_count, sections);\n  }\n  \n  if (opts & RD_Option_Dwarf) {\n    DW_Input dwarf_input = dw_input_from_coff_section_table(scratch.arena, raw_data, raw_string_table, file_header->section_count, sections);\n    dw_format(arena, out, indent, opts, &dwarf_input, arch, ExecutableImageKind_CoffPe);\n  }\n  \n  exit:;\n  scratch_end(scratch);\n}\n\n#if 0\ninternal void\nelf_print_dwarf_expressions(Arena *arena, String8List *out, String8 indent, String8 raw_data)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  \n  ELF_Bin      bin         = elf_bin_from_data(raw_data);\n  Arch             arch        = arch_from_elf_machine(bin.hdr.e_machine);\n  DW_Input         dwarf_input = dw_input_from_elf_bin(scratch.arena, raw_data, &bin);\n  ELF_Class        elf_class   = bin.hdr.e_ident[ELF_Identifier_Class];\n  ExecutableImageKind        image_type  = elf_class == ELF_Class_32 ? ExecutableImageKind_Elf32 : elf_class == ELF_Class_64 ? ExecutableImageKind_Elf64 : ELF_Class_None;\n  B32              relaxed     = 1;\n  Rng1U64List      cu_ranges   = dw_unit_ranges_from_data(scratch.arena, dwarf_input.sec[DW_Section_Info].data);\n  DW_ListUnitInput lu_input    = dw_list_unit_input_from_input(scratch.arena, &dwarf_input);\n  \n  if (bin.hdr.e_type == ELF_Type_Exec || bin.hdr.e_type == ELF_Type_Dyn) {\n    U64 cu_idx = 0;\n    for (Rng1U64Node *cu_range_n = cu_ranges.first; cu_range_n != 0; cu_range_n = cu_range_n->next, ++cu_idx) {\n      Temp comp_temp = temp_begin(scratch.arena);\n      \n      U64         cu_base   = cu_range_n->v.min;\n      Rng1U64     cu_range  = cu_range_n->v;\n      DW_CompUnit cu        = dw_cu_from_info_off(comp_temp.arena, &dwarf_input, lu_input, cu_range.min, relaxed);\n      \n      struct TagNode {\n        struct TagNode *next;\n        DW_Tag          tag;\n      };\n      struct TagNode *tag_stack = 0;\n      struct TagNode *free_tags = 0;\n      \n      S32 lexical_block_depth = 0;\n      \n      for (U64 info_off = cu.first_tag_info_off, tag_size = 0; info_off < cu.info_range.max; info_off += tag_size) {\n        DW_Tag tag = {0};\n        tag_size = dw_read_tag_cu(comp_temp.arena, &dwarf_input, &cu, info_off, &tag);\n        if (tag.has_children) {\n          struct TagNode *n = free_tags;\n          if (n == 0) {\n            n = push_array(comp_temp.arena, struct TagNode, 1);\n          } else {\n            SLLStackPop(free_tags);\n          }\n          n->tag = tag;\n          SLLStackPush(tag_stack, n);\n        }\n        \n        if (tag.kind == DW_TagKind_Null) {\n          if (tag_stack) {\n            struct TagNode *n = tag_stack;\n            if ((n->tag.kind == DW_TagKind_SubProgram || n->tag.kind == DW_TagKind_LexicalBlock)) {\n              Assert(lexical_block_depth > 0);\n              --lexical_block_depth;\n            }\n            SLLStackPop(tag_stack);\n            SLLStackPush(free_tags, n);\n          }\n        } else if (tag.kind == DW_TagKind_LexicalBlock || tag.kind == DW_TagKind_SubProgram) {\n          ++lexical_block_depth;\n          if (tag.kind == DW_TagKind_SubProgram) {\n            String8 expr = dw_exprloc_from_tag_attrib_kind(&dwarf_input, &cu, tag, DW_AttribKind_FrameBase);\n            if (expr.size > 0) {\n              String8 expr_str = dw_single_line_string_from_expression(comp_temp.arena, expr, cu_base, cu.address_size, arch, cu.version, cu.ext, cu.format);\n            }\n          }\n        } else if (tag.kind == DW_Tag_VariaKindble || tag.kind == DW_Tag_FormalParameter) {\n#if 0\n          local_persist B32 is_global_var = 0;\n          String8         name            = dw_string_from_tag_attrib_kind(&dwarf_input, &cu, tag, DW_AttribKind_Name);\n          DW_Attrib      *location_attrib = dw_attrib_from_tag(&dwarf_input, &cu, tag, DW_AttribKind_Location);\n          DW_AttribClass  value_class     = dw_value_class_from_attrib(&cu, location_attrib);\n          if (value_class != DW_AttribClass_Null) {\n            if (lexical_block_depth == 0) {\n              rd_printf(\"%llx Global: %S\", info_off, name);\n              is_global_var = 1;\n            } else {\n              rd_printf(\"%llx Local: %S\", info_off, name);\n              is_global_var = 0;\n            }\n            \n            rd_indent();\n            if (value_class == DW_AttribClass_LocListPtr || value_class == DW_AttribClass_LocList) {\n              DW_LocList location = dw_loclist_from_tag_attrib_kind(comp_temp.arena, &dwarf_input, &cu, location_attrib);\n              for (DW_LocNode *loc_n = location.first; loc_n != 0; loc_n = loc_n->next) {\n                String8 expr_str = dw_single_line_string_from_expression(comp_temp.arena, loc_n->v.expr, cu_base, cu.address_size, arch, cu.version, cu.ext, cu.format);\n                rd_printf(\"[%llx-%llx] %S\", loc_n->v.range.min, loc_n->v.range.max, expr_str);\n              }\n            } else if (value_class == DW_AttribClass_ExprLoc) {\n              String8 expr = dw_exprloc_from_tag_attrib_kind(&dwarf_input, &cu, location_attrib);\n              String8 expr_str = dw_single_line_string_from_expression(comp_temp.arena, expr, cu_base, cu.address_size, arch, cu.version, cu.ext, cu.format);\n              rd_printf(\"%S\", expr_str);\n            }\n            rd_unindent();\n          }\n#endif\n        }\n        \n#if 0\n        if (tag.kind == DW_TagKind_LexicalBlock || tag.kind == DW_TagKind_CompileUnit || tag.kind == DW_TagKind_InlinedSubroutine || tag.kind == DW_TagKind_SubProgram) {\n          Temp temp = temp_begin(comp_temp.arena);\n          DW_Attrib *ranges_attrib = dw_attrib_from_tag(&dwarf_input, &cu, tag, DW_AttribKind_Ranges);\n          if (ranges_attrib->attrib_kind == DW_AttribKind_Ranges) {\n            Rng1U64List ranges = dw_rnglist_from_tag_attrib_kind(temp.arena, &dwarf_input, &cu, ranges_attrib);\n          }\n          temp_end(temp);\n        }\n#endif\n      }\n      \n      temp_end(comp_temp);\n    }\n  } else {\n    fprintf(stderr, \"Skipping unexpected ELF type %u\\n\", bin.hdr.e_type);\n  }\n  \n  scratch_end(scratch);\n}\n#endif\n\n\n"
  },
  {
    "path": "src/raddump/raddump.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RADDUMP_H\n#define RADDUMP_H\n\n#define RD_INDENT_WIDTH 2\n#define RD_INDENT_MAX   4096\n\n#define rd_printf(f, ...) str8_list_pushf(arena, out, \"%S\" f, indent, __VA_ARGS__)\n#define rd_newline()      str8_list_pushf(arena, out, \"\");\n#define rd_errorf(f, ...)   rd_stderr(\"ERROR: \"f, __VA_ARGS__)\n#define rd_warningf(f, ...) rd_stderr(\"WARNING: \"f, __VA_ARGS__)\n#define rd_indent()       do { if (indent.size + RD_INDENT_WIDTH <= RD_INDENT_MAX) { indent.size += RD_INDENT_WIDTH; } else { Assert(!\"indent overflow\");   } } while (0)\n#define rd_unindent()     do { if (indent.size >= RD_INDENT_WIDTH)                 { indent.size -= RD_INDENT_WIDTH; } else { Assert(!\"unbalanced indent\"); } } while (0)\n\ntypedef U64 RD_Option;\n\n#define RD_Option_Help       (1ull << 0)\n#define RD_Option_Version    (1ull << 1)\n#define RD_Option_Headers    (1ull << 2)\n#define RD_Option_Sections   (1ull << 3)\n#define RD_Option_Debug      (1ull << 4)\n#define RD_Option_Imports    (1ull << 5)\n#define RD_Option_Exports    (1ull << 6)\n#define RD_Option_Disasm     (1ull << 7)\n#define RD_Option_Rawdata    (1ull << 8)\n#define RD_Option_Tls        (1ull << 9)\n#define RD_Option_Codeview   (1ull << 10)\n#define RD_Option_Symbols    (1ull << 11)\n#define RD_Option_Relocs     (1ull << 12)\n#define RD_Option_Exceptions (1ull << 13)\n#define RD_Option_LoadConfig (1ull << 14)\n#define RD_Option_Resources  (1ull << 15)\n#define RD_Option_LongNames  (1ull << 16)\n// DWARF\n#define RD_Option_DebugInfo       (1ull << 17)\n#define RD_Option_DebugAbbrev     (1ull << 18)\n#define RD_Option_DebugLine       (1ull << 19)\n#define RD_Option_DebugStr        (1ull << 20)\n#define RD_Option_DebugLoc        (1ull << 21)\n#define RD_Option_DebugRanges     (1ull << 22)\n#define RD_Option_DebugARanges    (1ull << 23)\n#define RD_Option_DebugAddr       (1ull << 24)\n#define RD_Option_DebugLocLists   (1ull << 25)\n#define RD_Option_DebugRngLists   (1ull << 26)\n#define RD_Option_DebugPubNames   (1ull << 27)\n#define RD_Option_DebugPubTypes   (1ull << 28)\n#define RD_Option_DebugLineStr    (1ull << 29)\n#define RD_Option_DebugStrOffsets (1ull << 30)\n#define RD_Option_Dwarf                       \\\n(RD_Option_DebugInfo     | \\\nRD_Option_DebugAbbrev   | \\\nRD_Option_DebugLine     | \\\nRD_Option_DebugStr      | \\\nRD_Option_DebugLoc      | \\\nRD_Option_DebugRanges   | \\\nRD_Option_DebugARanges  | \\\nRD_Option_DebugAddr     | \\\nRD_Option_DebugLocLists | \\\nRD_Option_DebugRngLists | \\\nRD_Option_DebugPubNames | \\\nRD_Option_DebugPubTypes | \\\nRD_Option_DebugLineStr  | \\\nRD_Option_DebugStrOffsets)\n#define RD_Option_RelaxDwarfParser (1ull << 31ull)\n// RDI\n#define RD_Option_NoRdi               (1ull << 32ull)\n#define RD_Option_RdiDataSections     (1ull << 33ull)\n#define RD_Option_RdiTopLevelInfo     (1ull << 34ull)\n#define RD_Option_RdiBinarySections   (1ull << 35ull)\n#define RD_Option_RdiFilePaths        (1ull << 36ull)\n#define RD_Option_RdiSourceFiles      (1ull << 37ull)\n#define RD_Option_RdiLineTables       (1ull << 38ull)\n#define RD_Option_RdiSourceLineMaps   (1ull << 39ull)\n#define RD_Option_RdiUnits            (1ull << 40ull)\n#define RD_Option_RdiUnitVMap         (1ull << 41ull)\n#define RD_Option_RdiTypeNodes        (1ull << 42ull)\n#define RD_Option_RdiUserDefinedTypes (1ull << 43ull)\n#define RD_Option_RdiGlobalVars       (1ull << 44ull)\n#define RD_Option_RdiGlobalVarsVMap   (1ull << 45ull)\n#define RD_Option_RdiThreadVars       (1ull << 46ull)\n#define RD_Option_RdiConstants        (1ull << 47ull)\n#define RD_Option_RdiProcedures       (1ull << 48ull)\n#define RD_Option_RdiScopes           (1ull << 49ull)\n#define RD_Option_RdiScopeVMap        (1ull << 50ull)\n#define RD_Option_RdiInlineSites      (1ull << 51ull)\n#define RD_Option_RdiNameMaps         (1ull << 52ull)\n#define RD_Option_RdiStrings          (1ull << 53ull)\n#define RD_Option_RdiAll              (RD_Option_RdiDataSections     | \\\nRD_Option_RdiTopLevelInfo     | \\\nRD_Option_RdiBinarySections   | \\\nRD_Option_RdiFilePaths        | \\\nRD_Option_RdiSourceFiles      | \\\nRD_Option_RdiLineTables       | \\\nRD_Option_RdiSourceLineMaps   | \\\nRD_Option_RdiUnits            | \\\nRD_Option_RdiUnitVMap         | \\\nRD_Option_RdiTypeNodes        | \\\nRD_Option_RdiUserDefinedTypes | \\\nRD_Option_RdiGlobalVars       | \\\nRD_Option_RdiGlobalVarsVMap   | \\\nRD_Option_RdiThreadVars       | \\\nRD_Option_RdiConstants        | \\\nRD_Option_RdiProcedures       | \\\nRD_Option_RdiScopes           | \\\nRD_Option_RdiScopeVMap        | \\\nRD_Option_RdiInlineSites      | \\\nRD_Option_RdiNameMaps         | \\\nRD_Option_RdiStrings)\n\n\ntypedef struct RD_Marker\n{\n  U64     off;\n  String8 string;\n} RD_Marker;\n\ntypedef struct RD_MarkerArray\n{\n  U64        count;\n  RD_Marker *v;\n} RD_MarkerArray;\n\ntypedef struct MarkerNode\n{\n  struct MarkerNode *next;\n  RD_Marker          v;\n} RD_MarkerNode;\n\ntypedef struct RD_MarkerList\n{\n  U64            count;\n  RD_MarkerNode *first;\n  RD_MarkerNode *last;\n} RD_MarkerList;\n\ntypedef struct RD_DisasmResult\n{\n  String8 text;\n  U64     size;\n} RD_DisasmResult;\n\ntypedef struct RD_Section\n{\n  String8 name;\n  String8 raw_data;\n} RD_Section;\n\ntypedef struct RD_SectionArray\n{\n  U64         count;\n  RD_Section *v;\n} RD_SectionArray;\n\ntypedef struct RD_Line\n{\n  String8 file_path;\n  U32     line_num;\n} RD_Line;\n\n////////////////////////////////\n\n// raddump\n\ninternal B32 rd_is_rdi(String8 raw_data);\n\ninternal String8 rd_string_from_flags(Arena *arena, String8List list, U64 remaining_flags);\n\ninternal void rd_format_preamble(Arena *arena, String8List *out, String8 indent, String8 input_path, String8 raw_data);\n\n// Markers\n\ninternal RD_MarkerArray * rd_section_markers_from_coff_symbol_table(Arena *arena, String8 string_table, U64 section_count, COFF_Symbol32Array symbols);\n\n// Sections\n\ninternal RD_SectionArray rd_sections_from_coff_section_table(Arena *arnea, String8 raw_image, U64 string_table_off, U64 section_count, COFF_SectionHeader *sections);\n\n// Disasm\n\ninternal RD_DisasmResult rd_disasm_next_instruction(Arena *arena, Arch arch, U64 addr, String8 raw_code);\ninternal void            rd_print_disasm           (Arena *arena, String8List *out, String8 indent, Arch arch, U64 image_base, U64 sect_off, U64 marker_count, RD_Marker *markers, String8 raw_code);\n\n// Raw Data\n\ninternal String8 rd_format_hex_array(Arena *arena, U8 *ptr, U64 size);\ninternal void    rd_print_raw_data  (Arena *arena, String8List *out, String8 indent, U64 bytes_per_row, U64 marker_count, RD_Marker *markers, String8 raw_data);\n\n// CodeView\n\ninternal void cv_print_binary_annots  (Arena *arena, String8List *out, String8 indent, CV_Arch arch, String8 raw_data);\ninternal void cv_print_lvar_addr_range(Arena *arena, String8List *out, String8 indent, CV_LvarAddrRange range);\ninternal void cv_print_lvar_addr_gap  (Arena *arena, String8List *out, String8 indent, String8 raw_data);\ninternal void cv_print_lvar_attr      (Arena *arena, String8List *out, String8 indent, CV_LocalVarAttr attr);\ninternal void cv_print_symbol         (Arena *arena, String8List *out, String8 indent, CV_Arch arch, CV_TypeIndex min_itype, CV_SymKind type, String8 raw_symbol);\ninternal U64  cv_print_leaf           (Arena *arena, String8List *out, String8 indent, CV_TypeIndex min_itype, CV_LeafKind kind, String8 raw_leaf);\ninternal void cv_print_debug_t        (Arena *arena, String8List *out, String8 indent, CV_DebugT debug_t);\ninternal void cv_print_symbols_c13    (Arena *arena, String8List *out, String8 indent, CV_Arch arch, String8 raw_data);\ninternal void cv_print_lines_c13      (Arena *arena, String8List *out, String8 indent, String8 raw_lines);\ninternal void cv_print_file_checksums (Arena *arena, String8List *out, String8 indent, String8 raw_chksums);\ninternal void cv_print_string_table   (Arena *arena, String8List *out, String8 indent, String8 raw_strtab);\ninternal void cv_print_inlinee_lines  (Arena *arena, String8List *out, String8 indent, String8 raw_data);\ninternal void cv_print_symbols_section(Arena *arena, String8List *out, String8 indent, CV_Arch arch, String8 raw_ss);\n\n// MSVC CRT\n\ninternal void mscrt_print_eh_handler_type32(Arena *arena, String8List *out, String8 indent, RDI_Parsed *rdi, MSCRT_EhHandlerType32 *handler);\n\n// PE\n\ninternal void pe_print_data_directory_ranges(Arena *arena, String8List *out, String8 indent, U64 count, PE_DataDirectory *dirs);\ninternal void pe_print_optional_header32    (Arena *arena, String8List *out, String8 indent, PE_OptionalHeader32 *opt_header, PE_DataDirectory *dirs);\ninternal void pe_print_optional_header32plus(Arena *arena, String8List *out, String8 indent, PE_OptionalHeader32Plus *opt_header, PE_DataDirectory *dirs);\ninternal void pe_print_load_config32        (Arena *arena, String8List *out, String8 indent, PE_LoadConfig32 *lc);\ninternal void pe_print_load_config64        (Arena *arena, String8List *out, String8 indent, PE_LoadConfig64 *lc);\ninternal void pe_print_tls                  (Arena *arena, String8List *out, String8 indent, PE_ParsedTLS tls);\ninternal void pe_print_debug_diretory       (Arena *arena, String8List *out, String8 indent, String8 raw_data, String8 raw_dir);\ninternal void pe_print_export_table         (Arena *arena, String8List *out, String8 indent, PE_ParsedExportTable exptab);\ninternal void pe_print_static_import_table  (Arena *arena, String8List *out, String8 indent, U64 image_base, PE_ParsedStaticImportTable imptab);\ninternal void pe_print_delay_import_table   (Arena *arena, String8List *out, String8 indent, U64 image_base, PE_ParsedDelayImportTable imptab);\ninternal void pe_print_resources            (Arena *arena, String8List *out, String8 indent, PE_ResourceDir *root);\ninternal void pe_print_exceptions_x8664     (Arena *arena, String8List *out, String8 indent, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 except_frange, RDI_Parsed *rdi);\ninternal void pe_print_exceptions           (Arena *arena, String8List *out, String8 indent, COFF_MachineType machine, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 except_frange, RDI_Parsed *rdi);\ninternal void pe_print_base_relocs          (Arena *arena, String8List *out, String8 indent, COFF_MachineType machine, U64 image_base, U64 section_count, COFF_SectionHeader *sections, String8 raw_data, Rng1U64 base_reloc_franges, RDI_Parsed *rdi);\ninternal void pe_print                      (Arena *arena, String8List *out, String8 indent, String8 raw_data, RD_Option opts, RDI_Parsed *rdi);\n\n#endif // RADDUMP_H\n\n"
  },
  {
    "path": "src/raddump/raddump_main.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#define BUILD_CONSOLE_INTERFACE 1\n#define BUILD_TITLE \"Epic Games Tools (R) RAD Dumper\"\n\n////////////////////////////////\n\n#include \"linker/base_ext/base_blake3.h\"\n#include \"linker/base_ext/base_blake3.c\"\n#include \"third_party/xxHash/xxhash.c\"\n#include \"third_party/xxHash/xxhash.h\"\n#include \"third_party/radsort/radsort.h\"\n#include \"third_party/md5/md5.c\"\n#include \"third_party/md5/md5.h\"\n#include \"third_party/zydis/zydis.h\"\n#include \"third_party/zydis/zydis.c\"\n#include \"third_party/rad_lzb_simple/rad_lzb_simple.h\"\n#include \"third_party/rad_lzb_simple/rad_lzb_simple.c\"\n#define SINFL_IMPLEMENTATION\n#include \"third_party/sinfl/sinfl.h\"\n\n////////////////////////////////\n\n#include \"base/base_inc.h\"\n#include \"linker/base_ext/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"async/async.h\"\n#include \"rdi_format/rdi_format_local.h\"\n#include \"rdi_make/rdi_make_local.h\"\n#include \"linker/hash_table.h\"\n#include \"coff/coff.h\"\n#include \"coff/coff_parse.h\"\n#include \"pe/pe.h\"\n#include \"elf/elf.h\"\n#include \"elf/elf_parse.h\"\n#include \"msvc_crt/msvc_crt.h\"\n#include \"codeview/codeview.h\"\n#include \"codeview/codeview_parse.h\"\n#include \"msf/msf.h\"\n#include \"msf/msf_parse.h\"\n#include \"pdb/pdb.h\"\n#include \"pdb/pdb_parse.h\"\n#include \"dwarf/dwarf.h\"\n#include \"dwarf/dwarf_parse.h\"\n#include \"dwarf/dwarf_expr.h\"\n#include \"dwarf/dwarf_unwind.h\"\n#include \"dwarf/dwarf_coff.h\"\n#include \"dwarf/dwarf_elf.h\"\n#include \"radcon/radcon.h\"\n#include \"radcon/radcon_coff.h\"\n#include \"radcon/radcon_cv.h\"\n#include \"radcon/radcon_elf.h\"\n#include \"radcon/radcon_pdb.h\"\n#include \"radcon/radcon_dwarf.h\"\n\n#include \"base/base_inc.c\"\n#include \"linker/base_ext/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"async/async.c\"\n#include \"rdi_format/rdi_format_local.c\"\n#include \"rdi_make/rdi_make_local.c\"\n#include \"linker/hash_table.c\"\n#include \"coff/coff.c\"\n#include \"coff/coff_parse.c\"\n#include \"pe/pe.c\"\n#include \"elf/elf.c\"\n#include \"elf/elf_parse.c\"\n#include \"msvc_crt/msvc_crt.c\"\n#include \"codeview/codeview.c\"\n#include \"codeview/codeview_parse.c\"\n#include \"msf/msf.c\"\n#include \"msf/msf_parse.c\"\n#include \"pdb/pdb.c\"\n#include \"pdb/pdb_parse.c\"\n#include \"dwarf/dwarf.c\"\n#include \"dwarf/dwarf_parse.c\"\n#include \"dwarf/dwarf_expr.c\"\n#include \"dwarf/dwarf_unwind.c\"\n#include \"dwarf/dwarf_coff.c\"\n#include \"dwarf/dwarf_elf.c\"\n#include \"radcon/radcon_coff.c\"\n#include \"radcon/radcon_cv.c\"\n#include \"radcon/radcon_elf.c\"\n#include \"radcon/radcon_pdb.c\"\n#include \"radcon/radcon_dwarf.c\"\n#include \"radcon/radcon.c\"\n\n#include \"linker/thread_pool/thread_pool.h\"\n#include \"linker/thread_pool/thread_pool.c\"\n#include \"linker/codeview_ext/codeview.h\"\n#include \"linker/codeview_ext/codeview.c\"\n#include \"linker/rdi/rdi.h\"\n#include \"linker/rdi/rdi.c\"\n\n#include \"raddump/raddump.h\"\n#include \"raddump/raddump.c\"\n\n////////////////////////////////\n\nglobal read_only struct\n{\n  RD_Option opt;\n  char     *name;\n  char     *help;\n} g_rd_dump_option_map[] = {\n  { RD_Option_Help,             \"help\",                \"Print help and exit\"    },\n  { RD_Option_Version,          \"version\",             \"Print version and exit\" },\n  \n  { RD_Option_NoRdi,            \"nordi\",               \"Don't load RAD Debug Info\" },\n  \n  { RD_Option_Headers,          \"headers\",             \"Dump DOS header, file header, optional header, and/or archive header\" },\n  { RD_Option_Sections,         \"sections\",            \"Dump section headers as table\"                                        },\n  { RD_Option_Rawdata,          \"rawdata\",             \"Dump raw section data\"                                                },\n  { RD_Option_Codeview,         \"cv\",                  \"Dump CodeView\"                                                        },\n  { RD_Option_Disasm,           \"disasm\",              \"Disassemble code sections\"                                            },\n  { RD_Option_Symbols,          \"symtab\",              \"Dump COFF symbol table\"                                               },\n  { RD_Option_Relocs,           \"relocs\",              \"Dump relocations\"                                                     },\n  { RD_Option_Exceptions,       \"exceptions\",          \"Dump exceptions\"                                                      },\n  { RD_Option_Tls,              \"tls\",                 \"Dump Thread Local Storage directory\"                                  },\n  { RD_Option_Debug,            \"debug\",               \"Dump debug directory\"                                                 },\n  { RD_Option_Imports,          \"imports\",             \"Dump import table\"                                                    },\n  { RD_Option_Exports,          \"exports\",             \"Dump export table\"                                                    },\n  { RD_Option_LoadConfig,       \"loadconfig\",          \"Dump load config\"                                                     },\n  { RD_Option_Resources,        \"resources\",           \"Dump resource directory\"                                              },\n  { RD_Option_LongNames,        \"longnames\",           \"Dump archive long names\"                                              },\n  \n  { RD_Option_DebugInfo,        \"debug_info\",          \"Dump .debug_info\"                                            },\n  { RD_Option_DebugAbbrev,      \"debug_abbrev\",        \"Dump .debug_abbrev\"                                          },\n  { RD_Option_DebugLine,        \"debug_line\",          \"Dump .debug_line\"                                            },\n  { RD_Option_DebugStr,         \"debug_str\",           \"Dump .debug_str\"                                             },\n  { RD_Option_DebugLoc,         \"debug_loc\",           \"Dump .debug_loc\"                                             },\n  { RD_Option_DebugRanges,      \"debug_ranges\",        \"Dump .debug_ranges\"                                          },\n  { RD_Option_DebugARanges,     \"debug_aranges\",       \"Dump .debug_aranges\"                                         },\n  { RD_Option_DebugAddr,        \"debug_addr\",          \"Dump .debug_addr\"                                            },\n  { RD_Option_DebugLocLists,    \"debug_loclists\",      \"Dump .debug_loclists\"                                        },\n  { RD_Option_DebugRngLists,    \"debug_rnglists\",      \"Dump .debug_rnglists\"                                        },\n  { RD_Option_DebugPubNames,    \"debug_pubnames\",      \"Dump .debug_pubnames\"                                        },\n  { RD_Option_DebugPubTypes,    \"debug_pubtypes\",      \"Dump .debug_putypes\"                                         },\n  { RD_Option_DebugLineStr,     \"debug_linestr\",       \"Dump .debug_linestr\"                                         },\n  { RD_Option_DebugStrOffsets,  \"debug_stroffsets\",    \"Dump .debug_stroffsets\"                                      },\n  { RD_Option_Dwarf,            \"dwarf\",               \"Dump all DWARF sections\"                                     },\n  { RD_Option_RelaxDwarfParser, \"relax_dwarf_parser\",  \"Relaxes version requirement on attribute and form encodings\" },\n  \n  { RD_Option_RdiDataSections,     \"rdi_data_sections\",     \"Dump data sections\"      },\n  { RD_Option_RdiTopLevelInfo,     \"rdi_top_level_info\",    \"Dump top level info\"     },\n  { RD_Option_RdiBinarySections,   \"rdi_binary_sections\",   \"Dump binary sections\"    },\n  { RD_Option_RdiFilePaths,        \"rdi_file_paths\",        \"Dump file paths\"         },\n  { RD_Option_RdiSourceFiles,      \"rdi_source_files\",      \"Dump source files\"       },\n  { RD_Option_RdiLineTables,       \"rdi_line_tables\",       \"Dump line tables\"        },\n  { RD_Option_RdiSourceLineMaps,   \"rdi_source_line_maps\",  \"Dump source line maps\"   },\n  { RD_Option_RdiUnits,            \"rdi_units\",             \"Dump units\"              },\n  { RD_Option_RdiUnitVMap,         \"rdi_units_virtual_map\", \"Dump units virtual map\"  },\n  { RD_Option_RdiTypeNodes,        \"rdi_type_nodes\",        \"Dump type nodes\"         },\n  { RD_Option_RdiUserDefinedTypes, \"rdi_udt\",               \"Dump user defined types\" },\n  { RD_Option_RdiGlobalVars,       \"rdi_global_vars\",       \"Dump global variables\"   },\n  { RD_Option_RdiThreadVars,       \"rdi_thread_vars\",       \"Dump thread variables\"   },\n  { RD_Option_RdiConstants,        \"rdi_constants\",         \"Dump constants\"          },\n  { RD_Option_RdiScopes,           \"rdi_scopes\",            \"Dump scopes\"             },\n  { RD_Option_RdiScopeVMap,        \"rdi_scope_virtual_map\", \"Dump scope virtual map\"  },\n  { RD_Option_RdiInlineSites,      \"rdi_inline_sites\",      \"Dump inline sites\"       },\n  { RD_Option_RdiNameMaps,         \"rdi_name_maps\",         \"Dump name maps\"          },\n  { RD_Option_RdiStrings,          \"rdi_strings\",           \"Dump strings\"            },\n  \n  { RD_Option_Help,             \"h\",                   \"Alias for -help\"       },\n  { RD_Option_Version,          \"v\",                   \"Alias for -version\"    },\n  { RD_Option_Sections,         \"s\",                   \"Alias for -sections\"   },\n  { RD_Option_Exceptions,       \"e\",                   \"Alias for -exceptions\" },\n  { RD_Option_Imports,          \"i\",                   \"Alias for -imports\"    },\n  { RD_Option_Exports,          \"x\",                   \"Alias for -exports\"    },\n  { RD_Option_LoadConfig,       \"l\",                   \"Alias for -loadconifg\" },\n  { RD_Option_Resources,        \"c\",                   \"Alias for -resources\"  },\n  { RD_Option_Relocs,           \"r\",                   \"Alias for -relocs\"     },\n};\n\ninternal void\nentry_point(CmdLine *cmdline)\n{\n  Arena *arena = arena_alloc();\n  \n  // make indent\n  String8List *out = push_array(arena, String8List, 1);\n  String8      indent;\n  {\n    U64 indent_buffer_size = RD_INDENT_WIDTH * RD_INDENT_MAX;\n    U8 *indent_buffer      = push_array(arena, U8, indent_buffer_size);\n    MemorySet(indent_buffer, ' ', indent_buffer_size);\n    indent = str8(indent_buffer, 0);\n  }\n  \n  // parse options\n  RD_Option opts = 0;\n  {\n    for (CmdLineOpt *cmd = cmdline->options.first; cmd != 0; cmd = cmd->next) {\n      RD_Option opt = 0;\n      for (U64 opt_idx = 0; opt_idx < ArrayCount(g_rd_dump_option_map); ++opt_idx) {\n        String8 opt_name = str8_cstring(g_rd_dump_option_map[opt_idx].name);\n        if (str8_match(cmd->string, opt_name, StringMatchFlag_CaseInsensitive)) {\n          opt = g_rd_dump_option_map[opt_idx].opt;\n          break;\n        } else if (str8_match_lit(\"all\", cmd->string, StringMatchFlag_CaseInsensitive)) {\n          opt = ~0ull & ~(RD_Option_Help|RD_Option_Version);\n          break;\n        }\n      }\n      \n      if (opt == 0) {\n        rd_errorf(\"Unknown argument: \\\"%S\\\"\", cmd->string);\n        goto exit;\n      }\n      \n      opts |= opt;\n    }\n  }\n  \n  // print help\n  if (opts & RD_Option_Help) {\n    int longest_cmd_switch = 0;\n    for (U64 opt_idx = 0; opt_idx < ArrayCount(g_rd_dump_option_map); ++opt_idx) {\n      longest_cmd_switch = Max(longest_cmd_switch, strlen(g_rd_dump_option_map[opt_idx].name));\n    }\n    rd_printf(BUILD_TITLE_STRING_LITERAL);\n    rd_newline();\n    rd_printf(\"# Help\");\n    rd_indent();\n    for (U64 opt_idx = 0; opt_idx < ArrayCount(g_rd_dump_option_map); ++opt_idx) {\n      char *name = g_rd_dump_option_map[opt_idx].name;\n      char *help = g_rd_dump_option_map[opt_idx].help;\n      int indent_size = longest_cmd_switch - strlen(name) + 1;\n      rd_printf(\"-%s%.*s%s\", g_rd_dump_option_map[opt_idx].name, indent_size, indent.str, g_rd_dump_option_map[opt_idx].help);\n    }\n    rd_unindent();\n    goto exit;\n  }\n  \n  // print version\n  if (opts & RD_Option_Version) {\n    rd_printf(BUILD_TITLE_STRING_LITERAL);\n    rd_printf(\"\\traddump <options> <inputs>\");\n    goto exit;\n  }\n  \n  // input check\n  if (cmdline->inputs.node_count == 0) {\n    rd_errorf(\"No input file specified\");\n    goto exit;\n  } else if (cmdline->inputs.node_count > 1) {\n    rd_errorf(\"Too many inputs specified, expected one\");\n    goto exit;\n  }\n  \n  // read input\n  String8 file_path = str8_list_first(&cmdline->inputs);\n  String8 raw_data  = os_data_from_file_path(arena, file_path);\n  \n  // is read ok?\n  if (raw_data.size == 0) {\n    rd_errorf(\"Unable to read input file \\\"%S\\\"\", file_path);\n    goto exit;\n  }\n  \n  // format input\n  rd_format_preamble(arena, out, indent, file_path, raw_data);\n  if (rd_is_rdi(raw_data)) {\n    RDI_Parsed rdi = {0};\n    RDI_ParseStatus parse_status = rdi_parse(raw_data.str, raw_data.size, &rdi);\n    switch (parse_status) {\n      case RDI_ParseStatus_Good: {\n        RD_Option rdi_print_opts = opts;\n        if ((rdi_print_opts & RD_Option_RdiAll) == 0) {\n          rdi_print_opts |= RD_Option_RdiAll;\n        }\n        rdi_print(arena, out, indent, &rdi, rdi_print_opts); \n      } break;\n      case RDI_ParseStatus_HeaderDoesNotMatch:       rd_errorf(\"RDI Parse: header does not match\");                 break;\n      case RDI_ParseStatus_UnsupportedVersionNumber: rd_errorf(\"RDI Parse: unsupported version\");                   break;\n      case RDI_ParseStatus_InvalidDataSecionLayout:  rd_errorf(\"RDI Parse: invalid data section layout\");           break;\n      case RDI_ParseStatus_MissingRequiredSection:   rd_errorf(\"RDI Parse: missing required section\");              break;\n      default:                                       rd_errorf(\"RDI Parse: unknown parse status %u\", parse_status); break;\n    }\n  } else if (coff_is_regular_archive(raw_data) || coff_is_thin_archive(raw_data)) {\n    coff_print_archive(arena, out, indent, raw_data, opts);\n  } else if (coff_is_big_obj(raw_data)) {\n    coff_print_big_obj(arena, out, indent, raw_data, opts);\n  } else if (coff_is_obj(raw_data)) {\n    coff_print_obj(arena, out, indent, raw_data, opts);\n  } else if (pe_check_magic(raw_data)) {\n    RDI_Parsed *rdi = 0;\n    if (!(opts & RD_Option_NoRdi)) {\n      rdi = rd_rdi_from_pe(arena, file_path);\n    }\n    pe_print(arena, out, indent, raw_data, opts, rdi);\n  } else if (pe_is_res(raw_data)) {\n    //tool_out_coff_res(stdout, file_data);\n  } else if (elf_check_magic(raw_data)) {\n    //elf_print_dwarf_expressions(arena, out, indent, raw_data);\n  }\n  \n  exit:;\n  // print formatted string\n  String8 out_string = str8_list_join(arena, out, &(StringJoin){ .sep = str8_lit(\"\\n\"),});\n  fprintf(stdout, \"%.*s\", str8_varg(out_string));\n  \n  arena_release(arena);\n}\n"
  },
  {
    "path": "src/rdi/rdi.mdesk",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: Generated File Format\n\n@option library\n@gen_folder \"lib_rdi\"\n@h_name \"rdi.h\"\n@c_name \"rdi.c\"\n\n@h_header\n{\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ (R)AD (D)ebug (I)nfo Format Library\";\n  \"//\";\n  \"// Defines standard RDI debug information format types and\";\n  \"// functions.\";\n  \"\";\n  \"#ifndef RDI_H\";\n  \"#define RDI_H\";\n  \"\";\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ Overridable Procedure Decoration\";\n  \"\";\n  \"#if !defined(RDI_PROC)\";\n  \"# define RDI_PROC static\";\n  \"#endif\";\n  \"\";\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ Overridable Basic Integer Types\";\n  \"\";\n  \"#if !defined(RDI_U8)\";\n  \"# define RDI_U8 RDI_U8\";\n  \"# define RDI_U16 RDI_U16\";\n  \"# define RDI_U32 RDI_U32\";\n  \"# define RDI_U64 RDI_U64\";\n  \"# define RDI_S8 RDI_S8\";\n  \"# define RDI_S16 RDI_S16\";\n  \"# define RDI_S32 RDI_S32\";\n  \"# define RDI_S64 RDI_S64\";\n  \"#include <stdint.h>\";\n  \"typedef uint8_t  RDI_U8;\";\n  \"typedef uint16_t RDI_U16;\";\n  \"typedef uint32_t RDI_U32;\";\n  \"typedef uint64_t RDI_U64;\";\n  \"typedef int8_t   RDI_S8;\";\n  \"typedef int16_t  RDI_S16;\";\n  \"typedef int32_t  RDI_S32;\";\n  \"typedef int64_t  RDI_S64;\";\n  \"#endif\";\n  \"\";\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ Checksum Types\";\n  \"\";\n  \"typedef union RDI_MD5 RDI_MD5;\";\n  \"union RDI_MD5 {RDI_U8 u8[16]; RDI_U64 u64[2];};\";\n  \"\";\n  \"typedef union RDI_SHA1 RDI_SHA1;\";\n  \"union RDI_SHA1 {RDI_U8 u8[20];};\";\n  \"\";\n  \"typedef union RDI_SHA256 RDI_SHA256;\";\n  \"union RDI_SHA256 {RDI_U8 u8[32]; RDI_U64 u64[4];};\";\n  \"\";\n  \"typedef union RDI_GUID RDI_GUID;\";\n  \"union RDI_GUID {RDI_U8 u8[16]; RDI_U64 u64[2];};\";\n  \"\";\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ Overridable Enabling/Disabling Of Table Index Typechecking\";\n  \"\";\n  \"#if !defined(RDI_DISABLE_TABLE_INDEX_TYPECHECKING)\";\n  \"# define RDI_DISABLE_TABLE_INDEX_TYPECHECKING 0\";\n  \"#endif\";\n  \"\";\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ Format Constants\";\n  \"\";\n  \"// \\\"raddbg\\\\0\\\\0\\\"\";\n  \"#define RDI_MAGIC_CONSTANT   0x0000676264646172\";\n  \"#define RDI_ENCODING_VERSION 17\";\n  \"\";\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ Format Types & Functions\";\n  \"\";\n}\n\n@h_footer\n{\n  \"#endif // RDI_H\";\n}\n\n@c_header\n{\n  \"////////////////////////////////////////////////////////////////\";\n  \"//~ (R)AD (D)ebug (I)nfo Format Library\";\n  \"//\";\n  \"// Defines standard RDI debug information format types and\";\n  \"// functions.\";\n  \"\";\n  \"#ifndef RDI_C\";\n  \"#define RDI_C\";\n  \"\";\n}\n\n@c_footer\n{\n  \"#endif // RDI_C\";\n}\n\n////////////////////////////////\n//~ rjf: Format Header Tables\n\n@table(name type desc)\nRDI_HeaderMemberTable:\n{\n  {magic                 RDI_U64    \"\"}\n  {encoding_version      RDI_U32    \"\"}\n  {data_section_off      RDI_U32    \"\"}\n  {data_section_count    RDI_U32    \"\"}\n}\n\n@xlist RDI_Header_XList:\n{\n  @expand(RDI_HeaderMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_Header:\n{\n  @expand(RDI_HeaderMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Format Section Tables\n\n@table(name  name_lower  element_type  value  index_base_type  desc)\nRDI_SectionTable:\n{\n  {NULL                          null                               RDI_U8              0x0000   -                                              \"\"}\n  {TopLevelInfo                  top_level_info                     RDI_TopLevelInfo    0x0001   -                                              \"\"}\n  {StringData                    string_data                        RDI_U8              0x0002   -                                              \"\"}\n  {StringTable                   string_table                       RDI_U32             0x0003   U32                                            \"\"}\n  {IndexRuns                     index_runs                         RDI_U32             0x0004   U32                                            \"\"}\n  {BinarySections                binary_sections                    RDI_BinarySection   0x0005   U32                                            \"\"}\n  {FilePathNodes                 file_path_nodes                    RDI_FilePathNode    0x0006   U32                                            \"\"}\n  {SourceFiles                   source_files                       RDI_SourceFile      0x0007   U32                                            \"\"}\n  {LineTables                    line_tables                        RDI_LineTable       0x0008   U32                                            \"\"}\n  {LineInfoVOffs                 line_info_voffs                    RDI_U64             0x0009   U32                                            \"\"}\n  {LineInfoLines                 line_info_lines                    RDI_Line            0x000A   U32                                            \"\"}\n  {LineInfoColumns               line_info_columns                  RDI_Column          0x000B   U32                                            \"\"}\n  {SourceLineMaps                source_line_maps                   RDI_SourceLineMap   0x000C   U32                                            \"\"}\n  {SourceLineMapNumbers          source_line_map_numbers            RDI_U32             0x000D   U32                                            \"\"}\n  {SourceLineMapRanges           source_line_map_ranges             RDI_U32             0x000E   U32                                            \"\"}\n  {SourceLineMapVOffs            source_line_map_voffs              RDI_U64             0x000F   U32                                            \"\"}\n  {Units                         units                              RDI_Unit            0x0010   U32                                            \"\"}\n  {UnitVMap                      unit_vmap                          RDI_VMapEntry       0x0011   -                                              \"\"}\n  {TypeNodes                     type_nodes                         RDI_TypeNode        0x0012   U32                                            \"\"}\n  {UDTs                          udts                               RDI_UDT             0x0013   U32                                            \"\"}\n  {Members                       members                            RDI_Member          0x0014   U32                                            \"\"}\n  {EnumMembers                   enum_members                       RDI_EnumMember      0x0015   U32                                            \"\"}\n  {GlobalVariables               global_variables                   RDI_GlobalVariable  0x0016   U32                                            \"\"}\n  {GlobalVMap                    global_vmap                        RDI_VMapEntry       0x0017   -                                              \"\"}\n  {ThreadVariables               thread_variables                   RDI_ThreadVariable  0x0018   U32                                            \"\"}\n  {Constants                     constants                          RDI_Constant        0x0019   U32                                            \"\"}\n  {Procedures                    procedures                         RDI_Procedure       0x001A   U32                                            \"\"}\n  {Scopes                        scopes                             RDI_Scope           0x001B   U32                                            \"\"}\n  {ScopeVOffData                 scope_voff_data                    RDI_U64             0x001C   U32                                            \"\"}\n  {ScopeVMap                     scope_vmap                         RDI_VMapEntry       0x001D   -                                              \"\"}\n  {InlineSites                   inline_sites                       RDI_InlineSite      0x001E   U32                                            \"\"}\n  {Locals                        locals                             RDI_Local           0x001F   U32                                            \"\"}\n  {LocationBlocks                location_blocks                    RDI_LocationBlock   0x0020   U32                                            \"\"}\n  {LocationData                  location_data                      RDI_U8              0x0021   U32                                            \"\"}\n  {ConstantValueData             constant_value_data                RDI_U8              0x0022   U32                                            \"\"}\n  {ConstantValueTable            constant_value_table               RDI_U32             0x0023   U32                                            \"\"}\n  {MD5Checksums                  md5_checksums                      RDI_MD5             0x0024   U32                                            \"\"}\n  {SHA1Checksums                 sha1_checksums                     RDI_SHA1            0x0025   U32                                            \"\"}\n  {SHA256Checksums               sha256_checksums                   RDI_SHA256          0x0026   U32                                            \"\"}\n  {Timestamps                    timestamps                         RDI_U64             0x0027   U32                                            \"\"}\n  {NameMaps                      name_maps                          RDI_NameMap         0x0028   U32                                            \"\"}\n  {NameMapBuckets                name_map_buckets                   RDI_NameMapBucket   0x0029   U32                                            \"\"}\n  {NameMapNodes                  name_map_nodes                     RDI_NameMapNode     0x002A   U32                                            \"\"}\n  {COUNT                         count                              RDI_U8              0x002B   -                                              \"\"}\n}\n\n@table(name value)\nRDI_SectionEncodingTable:\n{\n  {Unpacked 0}\n  {LZB      1}\n}\n\n@table(name type desc)\nRDI_SectionMemberTable:\n{\n  {encoding      RDI_SectionEncoding \"\"}\n  {pad           RDI_U32             \"\"}\n  {off           RDI_U64             \"\"}\n  {encoded_size  RDI_U64             \"\"}\n  {unpacked_size RDI_U64             \"\"}\n}\n\n@enum(RDI_U32) RDI_SectionKind:\n{\n  @expand(RDI_SectionTable a) `$(a.name .. =>20) = $(a.value)`,\n}\n\n@enum(RDI_U32) RDI_SectionEncoding:\n{\n  @expand(RDI_SectionEncodingTable a) `$(a.name .. =>10) = $(a.value)`,\n}\n\n@xlist RDI_SectionKind_XList:\n{\n  @expand(RDI_SectionTable a) `$(a.name != COUNT -> a.name .. ', ' .. a.name_lower .. ', ' .. a.element_type)`;\n}\n\n@xlist RDI_SectionEncoding_XList:\n{\n  @expand(RDI_SectionEncodingTable a) `$(a.name)`;\n}\n\n@xlist RDI_Section_XList:\n{\n  @expand(RDI_SectionMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_Section:\n{\n  @expand(RDI_SectionMemberTable a) `$(a.type) $(a.name)`\n}\n\n@gen(enums)\n{\n  `#if !RDI_DISABLE_TABLE_INDEX_TYPECHECKING`;\n  @expand(RDI_SectionTable a) `$(a.index_base_type != '-' -> \"typedef struct RDI_\" .. a.index_base_type .. \"_\" .. a.name .. =>50 .. \" { RDI_\" .. a.index_base_type .. \" v; }\".. \" RDI_\" .. a.index_base_type .. \"_\" .. a.name .. \";\")`;\n  `#else`;\n  `typedef struct RDI_U32_Table { RDI_U32 v; } RDI_U32_Table;`;\n  `typedef struct RDI_U64_Table { RDI_U64 v; } RDI_U64_Table;`;\n  @expand(RDI_SectionTable a) `$(a.index_base_type != '-' -> \"typedef RDI_\" .. a.index_base_type .. \"_Table RDI_\" .. a.index_base_type .. \"_\" .. a.name .. \";\")`;\n  `#endif`;\n  ``;\n}\n\n@gen(catchall)\n{\n  @expand(RDI_SectionTable a) `$(a.name != COUNT && a.name != NULL -> \"typedef \" .. a.element_type .. =>40 .. \" RDI_SectionElementType_\" .. a.name .. \";\")`;\n  ``;\n}\n\n@data(RDI_U16) rdi_section_element_size_table:\n{\n  @expand(RDI_SectionTable a) `sizeof($(a.element_type))`;\n}\n\n////////////////////////////////\n//~ rjf: Common Type Tables\n\n@table(name type desc)\nRDI_VMapEntryMemberTable:\n{\n  {voff RDI_U64 \"\"}\n  {idx  RDI_U64 \"\"}\n}\n\n@xlist RDI_VMapEntry_XList:\n{\n  @expand(RDI_VMapEntryMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_VMapEntry:\n{\n  @expand(RDI_VMapEntryMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Arch Info Tables\n\n@table(name value addr_size)\nRDI_ArchTable:\n{\n  {NULL    0     0}\n  {X86     1     4}\n  {X64     2     8}\n}\n\n@table(name value)\nRDI_RegCodeX86Table:\n{\n  {nil             0}\n  {eax             1}\n  {ecx             2}\n  {edx             3}\n  {ebx             4}\n  {esp             5}\n  {ebp             6}\n  {esi             7}\n  {edi             8}\n  {fsbase          9}\n  {gsbase         10}\n  {eflags         11}\n  {eip            12}\n  {dr0            13}\n  {dr1            14}\n  {dr2            15}\n  {dr3            16}\n  {dr4            17}\n  {dr5            18}\n  {dr6            19}\n  {dr7            20}\n  {fpr0           21}\n  {fpr1           22}\n  {fpr2           23}\n  {fpr3           24}\n  {fpr4           25}\n  {fpr5           26}\n  {fpr6           27}\n  {fpr7           28}\n  {st0            29}\n  {st1            30}\n  {st2            31}\n  {st3            32}\n  {st4            33}\n  {st5            34}\n  {st6            35}\n  {st7            36}\n  {fcw            37}\n  {fsw            38}\n  {ftw            39}\n  {fop            40}\n  {fcs            41}\n  {fds            42}\n  {fip            43}\n  {fdp            44}\n  {mxcsr          45}\n  {mxcsr_mask     46}\n  {ss             47}\n  {cs             48}\n  {ds             49}\n  {es             50}\n  {fs             51}\n  {gs             52}\n  {ymm0           53}\n  {ymm1           54}\n  {ymm2           55}\n  {ymm3           56}\n  {ymm4           57}\n  {ymm5           58}\n  {ymm6           59}\n  {ymm7           60}\n  {tr             61}\n  {ldtr           62}\n}\n\n@table(name value)\nRDI_RegCodeX64Table:\n{\n  {nil             0}\n  {rax             1}\n  {rcx             2}\n  {rdx             3}\n  {rbx             4}\n  {rsp             5}\n  {rbp             6}\n  {rsi             7}\n  {rdi             8}\n  {r8              9}\n  {r9              10}\n  {r10             11}\n  {r11             12}\n  {r12             13}\n  {r13             14}\n  {r14             15}\n  {r15             16}\n  {es              17}\n  {cs              18}\n  {ss              19}\n  {ds              20}\n  {fs              21}\n  {gs              22}\n  {rip             23}\n  {rflags          24}\n  {dr0             25}\n  {dr1             26}\n  {dr2             27}\n  {dr3             28}\n  {dr4             29}\n  {dr5             30}\n  {dr6             31}\n  {dr7             32}\n  {st0             33}\n  {st1             34}\n  {st2             35}\n  {st3             36}\n  {st4             37}\n  {st5             38}\n  {st6             39}\n  {st7             40}\n  {fpr0            41}\n  {fpr1            42}\n  {fpr2            43}\n  {fpr3            44}\n  {fpr4            45}\n  {fpr5            46}\n  {fpr6            47}\n  {fpr7            48}\n  {zmm0            49}\n  {zmm1            50}\n  {zmm2            51}\n  {zmm3            52}\n  {zmm4            53}\n  {zmm5            54}\n  {zmm6            55}\n  {zmm7            56}\n  {zmm8            57}\n  {zmm9            58}\n  {zmm10           59}\n  {zmm11           60}\n  {zmm12           61}\n  {zmm13           62}\n  {zmm14           63}\n  {zmm15           64}\n  {zmm16           65}\n  {zmm17           66}\n  {zmm18           67}\n  {zmm19           68}\n  {zmm20           69}\n  {zmm21           70}\n  {zmm22           71}\n  {zmm23           72}\n  {zmm24           73}\n  {zmm25           74}\n  {zmm26           75}\n  {zmm27           76}\n  {zmm28           77}\n  {zmm29           78}\n  {zmm30           79}\n  {zmm31           80}\n  {k0              81}\n  {k1              82}\n  {k2              83}\n  {k3              84}\n  {k4              85}\n  {k5              86}\n  {k6              87}\n  {k7              88}\n  {mxcsr           89}\n  {fsbase          90}\n  {gsbase          91}\n  {fcw             92}\n  {fsw             93}\n  {ftw             94}\n  {fop             95}\n  {fcs             96}\n  {fds             97}\n  {fip             98}\n  {fdp             99}\n  {mxcsr_mask      100}\n  {cetmsr          101}\n  {cetssp          102}\n  {tr              103}\n  {ldtr            104}\n}\n\n@enum(RDI_U32) RDI_Arch:\n{\n  @expand(RDI_ArchTable a) `$(a.name .. =>10) = $(a.value)`\n}\n\n@xlist RDI_Arch_XList:\n{\n  @expand(RDI_ArchTable a) `$(a.name)`;\n}\n\n@enum(RDI_U8) RDI_RegCode: {nil}\n\n@enum(RDI_U8) RDI_RegCodeX86:\n{\n  @expand(RDI_RegCodeX86Table a) `$(a.name .. =>10) = $(a.value)`\n}\n\n@enum(RDI_U8) RDI_RegCodeX64:\n{\n  @expand(RDI_RegCodeX64Table a) `$(a.name .. =>10) = $(a.value)`\n}\n\n@xlist RDI_RegCodeX86_XList:\n{\n  @expand(RDI_RegCodeX86Table a) `$(a.name), $(a.value)`\n}\n\n@xlist RDI_RegCodeX64_XList:\n{\n  @expand(RDI_RegCodeX64Table a) `$(a.name), $(a.value)`\n}\n\n////////////////////////////////\n//~ rjf: Top-Level Info Type Tables\n\n@table(name type desc)\nRDI_TopLevelInfoMemberTable:\n{\n  {arch                     RDI_Arch              \"\"}\n  {exe_name_string_idx      RDI_U32               \"\"}\n  {exe_hash                 RDI_U64               \"\"}\n  {voff_max                 RDI_U64               \"\"}\n  {guid                     RDI_GUID              \"\"}\n  {producer_name_string_idx RDI_U32               \"\"}\n}\n\n@xlist RDI_TopLevelInfo_XList:\n{\n  @expand(RDI_TopLevelInfoMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_TopLevelInfo:\n{\n  @expand(RDI_TopLevelInfoMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Binary Section Info Type Tables\n\n@table(name value)\nRDI_BinarySectionFlagTable:\n{\n  {Read     `1<<0`}\n  {Write    `1<<1`}\n  {Execute  `1<<2`}\n}\n\n@table(name type desc)\nRDI_BinarySectionMemberTable:\n{\n  {name_string_idx  RDI_U32                  \"\"}\n  {flags            RDI_BinarySectionFlags   \"\"}\n  {voff_first       RDI_U64                  \"\"}\n  {voff_opl         RDI_U64                  \"\"}\n  {foff_first       RDI_U64                  \"\"}\n  {foff_opl         RDI_U64                  \"\"}\n}\n\n@enum(RDI_U32) RDI_BinarySectionFlags:\n{\n  @expand(RDI_BinarySectionFlagTable a) `$(a.name .. =>10) = $(a.value)`;\n}\n\n@xlist RDI_BinarySectionFlags_XList:\n{\n  @expand(RDI_BinarySectionFlagTable a) `$(a.name)`;\n}\n\n@xlist RDI_BinarySection_XList:\n{\n  @expand(RDI_BinarySectionMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_BinarySection:\n{\n  @expand(RDI_BinarySectionMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Checksum Type Tables\n\n@table(name value section)\nRDI_ChecksumKindTable:\n{\n  {NULL            0  NULL           }\n  {MD5             1  MD5Checksums   }\n  {SHA1            2  SHA1Checksums  }\n  {SHA256          3  SHA256Checksums}\n  {Timestamp       4  Timestamps     }\n  {COUNT           5  NULL           }\n}\n\n@enum(RDI_U32) RDI_ChecksumKind:\n{\n  @expand(RDI_ChecksumKindTable a) `$(a.name .. =>10) = $(a.value)`\n}\n\n@xlist RDI_ChecksumKind_XList:\n{\n  @expand(RDI_ChecksumKindTable a) `$(a.name), $(a.section)`;\n}\n\n////////////////////////////////\n//~ rjf: File Path Tree Info Type Tables\n\n@table(name type desc)\nRDI_FilePathNodeMemberTable:\n{\n  {name_string_idx   RDI_U32                \"\"}\n  {parent_path_node  RDI_U32                \"\"}\n  {first_child       RDI_U32                \"\"}\n  {next_sibling      RDI_U32                \"\"}\n  {source_file_idx   RDI_U32                \"\"}\n}\n\n@table(name type desc)\nRDI_SourceFileMemberTable:\n{\n  {file_path_node_idx           RDI_U32          \"\"}\n  {normal_full_path_string_idx  RDI_U32          \"\"}\n  // usage of line map to go from a line number to an array of voffs\n  //  (line_map_nums * line_number) -> (nil | index)\n  //  (line_map_data * index) -> (range)\n  //  (line_map_voff_data * range) -> (array(voff))\n  {source_line_map_idx          RDI_U32          \"\"}\n  {checksum_kind                RDI_ChecksumKind \"\"}\n  {checksum_idx                 RDI_U32          \"\"}\n}\n\n@xlist RDI_FilePathNode_XList:\n{\n  @expand(RDI_FilePathNodeMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_SourceFile_XList:\n{\n  @expand(RDI_SourceFileMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_FilePathNode:\n{\n  @expand(RDI_FilePathNodeMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_SourceFile:\n{\n  @expand(RDI_SourceFileMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Unit Info Type Tables\n\n@table(name type desc)\nRDI_UnitMemberTable:\n{\n  {unit_name_string_idx          RDI_U32               \"\"}\n  {compiler_name_string_idx      RDI_U32               \"\"}\n  {source_file_path_node         RDI_U32               \"\"}\n  {object_file_path_node         RDI_U32               \"\"}\n  {archive_file_path_node        RDI_U32               \"\"}\n  {build_path_node               RDI_U32               \"\"}\n  {language                      RDI_Language          \"\"}\n  {line_table_idx                RDI_U32               \"\"}\n}\n\n@xlist RDI_Unit_XList:\n{\n  @expand(RDI_UnitMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_Unit:\n{\n  @expand(RDI_UnitMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Line Info Type Tables\n\n@table(name type desc)\nRDI_LineTableMemberTable:\n{\n  // usage of line info to go from voff to file & line number:\n  //  (line_info_voffs * voff) -> (nil + index)\n  //  (line_info_data * index) -> (RDI_Line = (file_idx * line_number))\n  {voffs_base_idx     RDI_U32                   \"\"} // U64[lines_count+1] (sorted ranges)\n  {lines_base_idx     RDI_U32                   \"\"} // RDI_Line[lines_count]\n  {cols_base_idx      RDI_U32                   \"\"} // RDI_Column[cols_count]\n  {lines_count        RDI_U32                   \"\"}\n  {cols_count         RDI_U32                   \"\"}\n}\n\n@table(name type desc)\nRDI_LineMemberTable:\n{\n  {file_idx    RDI_U32                 \"\"}\n  {line_num    RDI_U32                 \"\"}\n}\n\n@table(name type desc)\nRDI_ColumnMemberTable:\n{\n  {col_first  RDI_U16     \"\"}\n  {col_opl    RDI_U16     \"\"}\n}\n\n@table(name type desc)\nRDI_SourceLineMapMemberTable:\n{\n  // usage of line map to go from a line number to an array of voffs\n  //  (line_map_nums * line_number) -> (nil | index)\n  //  (line_map_data * index) -> (range)\n  //  (line_map_voff_data * range) -> (array(voff))\n  {line_count                   RDI_U32                               \"\"}\n  {voff_count                   RDI_U32                               \"\"}\n  {line_map_nums_base_idx       RDI_U32                               \"\"} // U32[line_count] (sorted - not closed ranges)\n  {line_map_range_base_idx      RDI_U32                               \"\"} // U32[line_count + 1] (pairs form ranges)\n  {line_map_voff_base_idx       RDI_U32                               \"\"} // U64[voff_count] (idx by line_map_range_data)\n}\n\n@xlist RDI_LineTable_XList:\n{\n  @expand(RDI_LineTableMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_Line_XList:\n{\n  @expand(RDI_LineMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_Column_XList:\n{\n  @expand(RDI_ColumnMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_SourceLineMapMemberTable:\n{\n  @expand(RDI_SourceLineMapMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_LineTable:\n{\n  @expand(RDI_LineTableMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_Line:\n{\n  @expand(RDI_LineMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_Column:\n{\n  @expand(RDI_ColumnMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_SourceLineMap:\n{\n  @expand(RDI_SourceLineMapMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Language Info Tables\n\n@table(name value)\nRDI_LanguageTable:\n{\n  {NULL        0}\n  {C           1}\n  {CPlusPlus   2}\n  {Masm        3}\n  {COUNT       4}\n}\n\n@enum(RDI_U32) RDI_Language:\n{\n  @expand(RDI_LanguageTable a) `$(a.name .. =>10) = $(a.value)`\n}\n\n@xlist RDI_Language_XList:\n{\n  @expand(RDI_LanguageTable a) `$(a.name)`;\n}\n\n////////////////////////////////\n//~ rjf: Type Info Tables\n\n@table(name value size bookend1 bookend2)\nRDI_TypeKindTable:\n{\n  {NULL                 0x0000     0                                             }\n  //-\n  {Void                 0x0001     0              FirstBuiltIn                   }\n  {Handle               0x0002     0xFFFFFFFF                                    }\n  {HResult              0x0003     4                                             }\n  {Char8                0x0004     1                                             }\n  {Char16               0x0005     2                                             }\n  {Char32               0x0006     4                                             }\n  {UChar8               0x0007     1                                             }\n  {UChar16              0x0008     2                                             }\n  {UChar32              0x0009     4                                             }\n  {U8                   0x000A     1                                             }\n  {U16                  0x000B     2                                             }\n  {U32                  0x000C     4                                             }\n  {U64                  0x000D     8                                             }\n  {U128                 0x000E     16                                            }\n  {U256                 0x000F     32                                            }\n  {U512                 0x0010     64                                            }\n  {S8                   0x0011     1                                             }\n  {S16                  0x0012     2                                             }\n  {S32                  0x0013     4                                             }\n  {S64                  0x0014     8                                             }\n  {S128                 0x0015     16                                            }\n  {S256                 0x0016     32                                            }\n  {S512                 0x0017     64                                            }\n  {Bool                 0x0018     1                                             }\n  {F16                  0x0019     2                                             }\n  {F32                  0x001A     4                                             }\n  {F32PP                0x001B     4                                             }\n  {F48                  0x001C     6                                             }\n  {F64                  0x001D     8                                             }\n  {F80                  0x001E     10                                            }\n  {F128                 0x001F     16                                            }\n  {ComplexF32           0x0020     8                                             }\n  {ComplexF64           0x0021     16                                            }\n  {ComplexF80           0x0022     20                                            }\n  {ComplexF128          0x0023     32              LastBuiltIn                   }\n  //-\n  {Modifier             0x1000     0               FirstConstructed              }\n  {Ptr                  0x1001     0                                             }\n  {LRef                 0x1002     0                                             }\n  {RRef                 0x1003     0                                             }\n  {Array                0x1004     0                                             }\n  {Function             0x1005     0                                             }\n  {Method               0x1006     0                                             }\n  {MemberPtr            0x1007     0               LastConstructed               }\n  //-\n  {Struct               0x2000     0               FirstUserDefined FirstRecord  }\n  {Class                0x2001     0                                             }\n  {Union                0x2002     0               LastRecord                    }\n  {Enum                 0x2003     0                                             }\n  {Alias                0x2004     0                                             }\n  {IncompleteStruct     0x2005     0               FirstIncomplete               }\n  {IncompleteUnion      0x2006     0                                             }\n  {IncompleteClass      0x2007     0                                             }\n  {IncompleteEnum       0x2008     0               LastIncomplete LastUserDefined}\n  //-\n  {Bitfield             0xF000     0                                             }\n  {Variadic             0xF001     0                                             }\n  {Count                0xF002     0                                             }\n}\n\n@table(name value)\nRDI_TypeModifierFlagTable:\n{\n  {Const     `1<<0`}\n  {Volatile  `1<<1`}\n  {Restrict  `1<<2`}\n}\n\n@table(name type_lhs type_rhs desc)\nRDI_TypeNodeMemberTable:\n{\n  {kind       RDI_TypeKind ``     \"\"}\n  {flags      RDI_U16      ``     \"\"}\n  {byte_size  RDI_U32      ``     \"\"}\n}\n\n@table(name value)\nRDI_UDTFlagTable:\n{\n  {EnumMembers `1<<0`}\n}\n\n@table(name type desc)\nRDI_UDTMemberTable:\n{\n  {self_type_idx   RDI_U32                   \"\"}\n  {flags           RDI_UDTFlags              \"\"}\n  {member_first    RDI_U32                   \"\"}\n  {member_count    RDI_U32                   \"\"}\n  {file_idx        RDI_U32                   \"\"}\n  {line            RDI_U32                   \"\"}\n  {col             RDI_U32                   \"\"}\n}\n\n@table(name value)\nRDI_MemberKindTable:\n{\n  {NULL          0x0000}\n  {DataField     0x0001}\n  {StaticData    0x0002}\n  {Method        0x0100}\n  {StaticMethod  0x0101}\n  {VirtualMethod 0x0102}\n  {VTablePtr     0x0200}\n  {Base          0x0201}\n  {VirtualBase   0x0202}\n  {NestedType    0x0300}\n}\n\n@table(name type desc)\nRDI_MemberMemberTable:\n{\n  {kind            RDI_MemberKind                  \"\"}\n  {pad             RDI_U16                         \"\"}\n  {name_string_idx RDI_U32                         \"\"}\n  {type_idx        RDI_U32                         \"\"}\n  {off             RDI_U32                         \"\"}\n}\n\n@table(name type desc)\nRDI_EnumMemberTable:\n{\n  {name_string_idx RDI_U32                  \"\"}\n  {pad             RDI_U32                  \"\"}\n  {val             RDI_U64                  \"\"}\n}\n\n@enum(RDI_U16) RDI_TypeKind:\n{\n  @expand(RDI_TypeKindTable a) `$(a.name .. =>20) = $(a.value)`;\n  @expand(RDI_TypeKindTable a) `$(a.bookend1 != \"\" -> a.bookend1 .. =>20 .. \" = RDI_TypeKind_\" .. a.name)`;\n  @expand(RDI_TypeKindTable a) `$(a.bookend2 != \"\" -> a.bookend2 .. =>20 .. \" = RDI_TypeKind_\" .. a.name)`;\n}\n\n@enum(RDI_U16) RDI_TypeModifierFlags:\n{\n  @expand(RDI_TypeModifierFlagTable a) `$(a.name .. =>20) = $(a.value)`,\n}\n\n@xlist RDI_TypeKind_XList:\n{\n  @expand(RDI_TypeKindTable a) `$(a.name)`;\n}\n\n@xlist RDI_TypeModifierFlags_XList:\n{\n  @expand(RDI_TypeModifierFlagTable a) `$(a.name)`;\n}\n\n@xlist RDI_TypeNode_XList:\n{\n  @expand(RDI_TypeNodeMemberTable a) `$(a.type_lhs), $(a.name)`\n}\n\n@struct RDI_TypeNode:\n{\n  @expand(RDI_TypeNodeMemberTable a) `$(a.type_lhs) $(a.name)$(a.type_rhs)`\n    ```\n    union\n  {\n    // kind is 'built-in'\n    struct\n    {\n      RDI_U32 name_string_idx;\n    } built_in;\n    \n    // kind is 'constructed'\n    struct\n    {\n      RDI_U32 direct_type_idx;\n      RDI_U32 count;\n      union\n      {\n        // when kind is 'Function' or 'Method'\n        RDI_U32 param_idx_run_first;\n        // when kind is 'MemberPtr'\n        RDI_U32 owner_type_idx;\n      };\n    }\n    constructed;\n    \n    // kind is 'user defined'\n    struct\n    {\n      RDI_U32 name_string_idx;\n      RDI_U32 direct_type_idx;\n      RDI_U32 udt_idx;\n    }\n    user_defined;\n    \n    // (kind = Bitfield)\n    struct\n    {\n      RDI_U32 direct_type_idx;\n      RDI_U32 off;\n      RDI_U32 size;\n    }\n    bitfield;\n  }\n  ```\n}\n\n@enum(RDI_U32) RDI_UDTFlags:\n{\n  @expand(RDI_UDTFlagTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@xlist RDI_UDTFlags_XList:\n{\n  @expand(RDI_UDTFlagTable a) `$(a.name)`;\n}\n\n@xlist RDI_UDT_XList:\n{\n  @expand(RDI_UDTMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_UDT:\n{\n  @expand(RDI_UDTMemberTable a) `$(a.type) $(a.name)`\n}\n\n@enum(RDI_U16) RDI_MemberKind:\n{\n  @expand(RDI_MemberKindTable a) `$(a.name .. =>25) = $(a.value)`\n}\n\n@xlist RDI_MemberKind_XList:\n{\n  @expand(RDI_MemberKindTable a) `$(a.name)`;\n}\n\n@xlist RDI_Member_XList:\n{\n  @expand(RDI_MemberMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_EnumMember_XList:\n{\n  @expand(RDI_EnumMemberTable a) `$(a.type), $(a.name)`\n}\n\n@struct RDI_Member:\n{\n  @expand(RDI_MemberMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_EnumMember:\n{\n  @expand(RDI_EnumMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Symbol Info Tables\n\n//- rjf: tables\n\n@table(name value)\nRDI_LinkFlagTable:\n{\n  {External   `1<<0`}\n  {TypeScoped `1<<1`}\n  {ProcScoped `1<<2`}\n}\n\n@table(name value)\nRDI_LocalKindTable:\n{\n  {NULL      0x0}\n  {Parameter 0x1}\n  {Variable  0x2}\n}\n\n@table(name value)\nRDI_LocationKindTable:\n{\n  {NULL                 0x0}\n  {AddrBytecodeStream   0x1}\n  {ValBytecodeStream    0x2}\n  {AddrRegPlusU16       0x3}\n  {AddrAddrRegPlusU16   0x4}\n  {ValReg               0x5}\n}\n\n@table(name type desc)\nRDI_GlobalVariableMemberTable:\n{\n  {name_string_idx   RDI_U32               \"\"}\n  {link_flags        RDI_LinkFlags         \"\"}\n  {voff              RDI_U64               \"\"}\n  {type_idx          RDI_U32               \"\"}\n  {container_idx     RDI_U32               \"\"}\n}\n\n@table(name type desc)\nRDI_ThreadVariableMemberTable:\n{\n  {name_string_idx   RDI_U32                    \"\"}\n  {link_flags        RDI_LinkFlags              \"\"}\n  {tls_off           RDI_U32                    \"\"}\n  {type_idx          RDI_U32                    \"\"}\n  {container_idx     RDI_U32                    \"\"}\n}\n\n@table(name type desc)\nRDI_ConstantMemberTable:\n{\n  {name_string_idx    RDI_U32                    \"\"}\n  {type_idx           RDI_U32                    \"\"}\n  {constant_value_idx RDI_U32                    \"\"}\n}\n\n@table(name type desc)\nRDI_ProcedureMemberTable:\n{\n  {name_string_idx           RDI_U32                    \"\"}\n  {link_name_string_idx      RDI_U32                    \"\"}\n  {link_flags                RDI_LinkFlags              \"\"}\n  {type_idx                  RDI_U32                    \"\"}\n  {root_scope_idx            RDI_U32                    \"\"}\n  {container_idx             RDI_U32                    \"\"}\n  {frame_base_location_first RDI_U32                    \"\"}\n  {frame_base_location_opl   RDI_U32                    \"\"}\n}\n\n@table(name type desc)\nRDI_ScopeMemberTable:\n{\n  {proc_idx                   RDI_U32               \"\"}\n  {parent_scope_idx           RDI_U32               \"\"}\n  {first_child_scope_idx      RDI_U32               \"\"}\n  {next_sibling_scope_idx     RDI_U32               \"\"}\n  {voff_range_first           RDI_U32               \"\"}\n  {voff_range_opl             RDI_U32               \"\"}\n  {local_first                RDI_U32               \"\"}\n  {local_count                RDI_U32               \"\"}\n  {inline_site_idx            RDI_U32               \"\"}\n}\n\n@table(name type desc)\nRDI_InlineSiteMemberTable:\n{\n  {name_string_idx     RDI_U32              \"\"}\n  {type_idx            RDI_U32              \"\"}\n  {owner_type_idx      RDI_U32              \"\"}\n  {line_table_idx      RDI_U32              \"\"}\n}\n\n@table(name type desc)\nRDI_LocalMemberTable:\n{\n  {kind            RDI_LocalKind           \"\"}\n  {name_string_idx RDI_U32                 \"\"}\n  {type_idx        RDI_U32                 \"\"}\n  {pad             RDI_U32                 \"\"}\n  {location_first  RDI_U32                 \"\"}\n  {location_opl    RDI_U32                 \"\"}\n}\n\n@table(name type desc)\nRDI_LocationBlockMemberTable:\n{\n  {scope_off_first     RDI_U32                }\n  {scope_off_opl       RDI_U32                }\n  {location_data_off   RDI_U32                }\n}\n\n@table(name type desc)\nRDI_LocationBytecodeStreamMemberTable:\n{\n  {kind RDI_LocationKind \"\"}\n  // [... 0] null terminated byte sequence RDI_EvalBytecodeStream\n}\n\n@table(name type desc)\nRDI_LocationRegPlusU16MemberTable:\n{\n  {kind             RDI_LocationKind }\n  {reg_code         RDI_RegCode }\n  {offset           RDI_U16 }\n}\n\n@table(name type desc)\nRDI_LocationRegMemberTable:\n{\n  {kind             RDI_LocationKind }\n  {reg_code         RDI_RegCode }\n}\n\n//- rjf: enums\n\n@enum(RDI_U32) RDI_LinkFlags:\n{\n  @expand(RDI_LinkFlagTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@enum(RDI_U32) RDI_LocalKind:\n{\n  @expand(RDI_LocalKindTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@enum(RDI_U8) RDI_LocationKind:\n{\n  @expand(RDI_LocationKindTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n//- rjf: xlists\n\n@xlist RDI_LinkFlags_XList:\n{\n  @expand(RDI_LinkFlagTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@xlist RDI_LocalKind_XList:\n{\n  @expand(RDI_LocalKindTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@xlist RDI_LocationKind_XList:\n{\n  @expand(RDI_LocationKindTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@xlist RDI_GlobalVariable_XList:\n{\n  @expand(RDI_GlobalVariableMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_ThreadVariable_XList:\n{\n  @expand(RDI_ThreadVariableMemberTable a) `$(type), $(a.name)`\n}\n\n@xlist RDI_Procedure_XList:\n{\n  @expand(RDI_ProcedureMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_Scope_XList:\n{\n  @expand(RDI_ScopeMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_InlineSite_XList:\n{\n  @expand(RDI_InlineSiteMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_Local_XList:\n{\n  @expand(RDI_LocalMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_LocationBlock_XList:\n{\n  @expand(RDI_LocationBlockMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_LocationBytecodeStream_XList:\n{\n  @expand(RDI_LocationBytecodeStreamMemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_LocationRegPlusU16_XList:\n{\n  @expand(RDI_LocationRegPlusU16MemberTable a) `$(a.type), $(a.name)`\n}\n\n@xlist RDI_LocationReg_XList:\n{\n  @expand(RDI_LocationRegMemberTable a) `$(a.type), $(a.name)`\n}\n\n//- rjf: structs\n\n@struct RDI_GlobalVariable:\n{\n  @expand(RDI_GlobalVariableMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_ThreadVariable:\n{\n  @expand(RDI_ThreadVariableMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_Constant:\n{\n  @expand(RDI_ConstantMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_Procedure:\n{\n  @expand(RDI_ProcedureMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_Scope:\n{\n  @expand(RDI_ScopeMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_InlineSite:\n{\n  @expand(RDI_InlineSiteMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_Local:\n{\n  @expand(RDI_LocalMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_LocationBlock:\n{\n  @expand(RDI_LocationBlockMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_LocationBytecodeStream:\n{\n  @expand(RDI_LocationBytecodeStreamMemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_LocationRegPlusU16:\n{\n  @expand(RDI_LocationRegPlusU16MemberTable a) `$(a.type) $(a.name)`\n}\n\n@struct RDI_LocationReg:\n{\n  @expand(RDI_LocationRegMemberTable a) `$(a.type) $(a.name)`\n}\n\n////////////////////////////////\n//~ rjf: Evaluation Bytecode Tables\n\n@table(name value num_decodes num_pops num_pushes)\nRDI_EvalOpTable:\n{\n  {Stop            0       0 0 0}\n  {Noop            1       0 0 0}\n  {Cond            2       1 1 0}\n  {Skip            3       2 0 0}\n  {MemRead         4       1 1 1}\n  {RegRead         5       4 0 1}\n  {RegReadDyn      6       0 1 1}\n  {FrameOff        7       8 0 1}\n  {ModuleOff       8       4 0 1}\n  {TLSOff          9       4 0 1}\n  {ObjectOff       10      0 0 0}\n  {CFA             11      0 0 0}\n  {ConstU8         12      1 0 1}\n  {ConstU16        13      2 0 1}\n  {ConstU32        14      4 0 1}\n  {ConstU64        15      8 0 1}\n  {ConstU128       16     16 0 1}\n  {ConstString     17      1 0 1}\n  {Abs             18      1 1 1}\n  {Neg             19      1 1 1}\n  {Add             20      1 2 1}\n  {Sub             21      1 2 1}\n  {Mul             22      1 2 1}\n  {Div             23      1 2 1}\n  {Mod             24      1 2 1}\n  {LShift          25      2 2 1}\n  {RShift          26      2 2 1}\n  {BitAnd          27      1 2 1}\n  {BitOr           28      1 2 1}\n  {BitXor          29      1 2 1}\n  {BitNot          30      1 1 1}\n  {LogAnd          31      1 2 1}\n  {LogOr           32      1 2 1}\n  {LogNot          33      1 1 1}\n  {EqEq            34      1 2 1}\n  {NtEq            35      1 2 1}\n  {LsEq            36      1 2 1}\n  {GrEq            37      1 2 1}\n  {Less            38      1 2 1}\n  {Grtr            39      1 2 1}\n  {Trunc           40      1 1 1}\n  {TruncSigned     41      1 1 1}\n  {Convert         42      2 1 1}\n  {Pick            43      1 0 1}\n  {Pop             44      0 1 0}\n  {Insert          45      1 0 0}\n  {ValueRead       46      1 2 1}\n  {ByteSwap        47      1 1 1}\n  {CallSiteValue   48      4 0 0}\n  {PartialValue    49      4 0 0}\n  {PartialValueBit 50      8 0 0}\n  {Swap            51      0 2 2} // swaps the top two entries on the stack\n  {COUNT           52      0 0 0}\n}\n\n// NOTE(rjf): \"ck\" -> \"conversion kind, when converted to type group\", used in square matrix form\n// e.g. x:0, y:0 means other -> other, x:3, y:1 means uint -> f32, etc.\n@table(name value       ck0             ck1         ck2          ck3         ck4)\nRDI_EvalTypeGroupTable:\n{\n  {Other  0              OtherToOther    FromOther   FromOther    FromOther   FromOther   }\n  {U      1              ToOther         Noop        Noop         Legal       Legal       }\n  {S      2              ToOther         Noop        Noop         Legal       Legal       }\n  {F32    3              ToOther         Legal       Legal        Noop        Legal       }\n  {F64    4              ToOther         Legal       Legal        Legal       Noop        }\n  {COUNT  5              Noop            Noop        Noop         Noop        Noop        }\n}\n\n@table(name value error_string)\nRDI_EvalConversionKindTable:\n{\n  {Noop         0 \"\"                                   }\n  {Legal        1 \"\"                                   }\n  {OtherToOther 2 \"Cannot convert between these types.\"}\n  {ToOther      3 \"Cannot convert to this type.\"       }\n  {FromOther    4 \"Cannot convert this type.\"          }\n  {COUNT        5 \"\"                                   }\n}\n\n@enum(RDI_U8) RDI_EvalOp:\n{\n  @expand(RDI_EvalOpTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@enum(RDI_U8) RDI_EvalTypeGroup:\n{\n  @expand(RDI_EvalTypeGroupTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@enum(RDI_U8) RDI_EvalConversionKind:\n{\n  @expand(RDI_EvalConversionKindTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@xlist RDI_EvalOp_XList:\n{\n  @expand(RDI_EvalOpTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@xlist RDI_EvalTypeGroup_XList:\n{\n  @expand(RDI_EvalTypeGroupTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@xlist RDI_EvalConversionKind_XList:\n{\n  @expand(RDI_EvalConversionKindTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@gen(enums)\n```\n#define RDI_EVAL_CTRLBITS(decodeN,popN,pushN) (((decodeN) << 8) | ((popN) << 4) | ((pushN) << 0))\n#define RDI_DECODEN_FROM_CTRLBITS(ctrlbits)   (((ctrlbits) >> 8) & 0xff)\n#define RDI_POPN_FROM_CTRLBITS(ctrlbits)      (((ctrlbits) >> 4) & 0xf)\n#define RDI_PUSHN_FROM_CTRLBITS(ctrlbits)     (((ctrlbits) >> 0) & 0xf)\n#define RDI_EncodeRegReadParam(reg,bytesize,bytepos) ((reg)|((bytesize)<<8)|((bytepos)<<16))\n```\n\n@data(RDI_U16) rdi_eval_op_ctrlbits_table:\n{\n  @expand(RDI_EvalOpTable a) `RDI_EVAL_CTRLBITS($(a.num_decodes), $(a.num_pops), $(a.num_pushes))`;\n}\n\n@data(`struct {RDI_EvalConversionKind dst_typegroups[RDI_EvalTypeGroup_COUNT];}`) @c_file\nrdi_eval_typegroup_conversion_kind_matrix:\n{\n  @expand(RDI_EvalTypeGroupTable a) `{{RDI_EvalConversionKind_$(a.ck0), RDI_EvalConversionKind_$(a.ck1), RDI_EvalConversionKind_$(a.ck2), RDI_EvalConversionKind_$(a.ck3), RDI_EvalConversionKind_$(a.ck4)}}`\n}\n\n@data(`struct {RDI_U8 *str; RDI_U64 size;}`) @c_file\nrdi_eval_conversion_kind_message_string_table:\n{\n  @expand(RDI_EvalConversionKindTable a) `{(RDI_U8 *)\"$(a.error_string)\", sizeof(\"$(a.error_string)\")}`\n}\n\n////////////////////////////////\n//~ rjf: Name Map Tables\n\n@table(name value)\nRDI_NameMapKindTable:\n{\n  {NULL               0}\n  {GlobalVariables    1}\n  {ThreadVariables    2}\n  {Constants          3}\n  {Procedures         4}\n  {Types              5}\n  {LinkNameProcedures 6}\n  {NormalSourcePaths  7}\n  {COUNT              8}\n}\n\n@table(name type desc)\nRDI_NameMapMemberTable:\n{\n  {bucket_base_idx    RDI_U32                        \"\"}\n  {node_base_idx      RDI_U32                        \"\"}\n  {bucket_count       RDI_U32                        \"\"}\n  {node_count         RDI_U32                        \"\"}\n}\n\n@table(name type desc)\nRDI_NameMapBucketMemberTable:\n{\n  {first_node    RDI_U32   \"\"}\n  {node_count    RDI_U32   \"\"}\n}\n\n@table(name type desc)\nRDI_NameMapNodeMemberTable:\n{\n  {string_idx                    RDI_U32               \"\"}\n  {match_count                   RDI_U32               \"\"}\n  // NOTE: if (match_count == 1) then this is the index of the matching item\n  //       if (match_count > 1)  then this is the first for an index run of all the matches\n  {match_idx_or_idx_run_first    RDI_U32               \"\"}\n}\n\n@enum(RDI_U32) RDI_NameMapKind:\n{\n  @expand(RDI_NameMapKindTable a) `$(a.name .. =>20) = $(a.value)`\n}\n\n@xlist RDI_NameMapKind_XList:\n{\n  @expand(RDI_NameMapKindTable a) `$(a.name != COUNT -> a.name)`;\n}\n\n@xlist RDI_NameMap_XList:\n{\n  @expand(RDI_NameMapMemberTable a) `$(a.type), $(a.val)`\n}\n\n@xlist RDI_NameMapBucket_XList:\n{\n  @expand(RDI_NameMapBucketMemberTable a) `$(a.type), $(a.val)`\n}\n\n@xlist RDI_NameMapNode_XList:\n{\n  @expand(RDI_NameMapNodeMemberTable a) `$(a.type), $(a.val)`\n}\n\n@struct RDI_NameMap:\n{\n  @expand(RDI_NameMapMemberTable a) `$(a.type) $(a.val)`\n}\n\n@struct RDI_NameMapBucket:\n{\n  @expand(RDI_NameMapBucketMemberTable a) `$(a.type) $(a.val)`\n}\n\n@struct RDI_NameMapNode:\n{\n  @expand(RDI_NameMapNodeMemberTable a) `$(a.type) $(a.val)`\n}\n\n////////////////////////////////\n//~ rjf: Functions\n\n@gen(functions)\n```\nRDI_PROC RDI_U64 rdi_hash(RDI_U8 *ptr, RDI_U64 size);\nRDI_PROC RDI_U8 *rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out);\nRDI_PROC RDI_U32 rdi_size_from_basic_type_kind(RDI_TypeKind kind);\nRDI_PROC RDI_U32 rdi_addr_size_from_arch(RDI_Arch arch);\nRDI_PROC RDI_EvalConversionKind rdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out);\nRDI_PROC RDI_S32 rdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group);\nRDI_PROC RDI_U8 *rdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out);\n```\n\n@gen(functions) @c_file\n```\nRDI_PROC RDI_U64\nrdi_hash(RDI_U8 *ptr, RDI_U64 size)\n{\n  RDI_U64 result = 0;\n  if(size != 0)\n  {\n    result = 5381;\n    RDI_U8 *opl = ptr + size;\n    for(;ptr < opl; ptr += 1)\n    {\n      result = ((result << 5) + result) + *ptr;\n    }\n  }\n  return result;\n}\n```\n\n@gen(functions) @c_file\n{\n  `RDI_PROC RDI_U8 *`;\n  `rdi_string_from_type_kind(RDI_TypeKind kind, RDI_U64 *size_out)`;\n  `{`;\n    `RDI_U8 *result = 0;`;\n    `*size_out = 0;`;\n    `switch (kind)`;\n    `{`;\n      `default:{}break;`;\n      @expand(RDI_TypeKindTable a) `   case RDI_TypeKind_$(a.name): {result = (RDI_U8*)\"$(a.name)\"; *size_out = sizeof(\"$(a.name)\")-1;}break;`,\n      `}`;\n    `return result;`;\n    `}`;\n  ``;\n}\n\n@gen(functions) @c_file\n{\n  `RDI_PROC RDI_U32`;\n  `rdi_size_from_basic_type_kind(RDI_TypeKind kind)`;\n  `{`;\n    `RDI_U32 result = 0;`;\n    `switch(kind)`;\n    `{`;\n      `default:{}break;`;\n      @expand(RDI_TypeKindTable a) `$(a.size != 0 -> \"    case RDI_TypeKind_\" .. a.name .. \":{result = \" .. a.size .. \";}break;\")`,\n      `}`;\n    `return result;`;\n    `}`;\n  ``;\n}\n\n@gen(functions) @c_file\n{\n  `RDI_PROC RDI_U32`;\n  `rdi_addr_size_from_arch(RDI_Arch arch)`;\n  `{`;\n    `RDI_U32 result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(RDI_ArchTable a) `$(a.addr_size != 0 -> \"    case RDI_Arch_\" .. a.name .. \":{result = \" .. a.addr_size .. \";}break;\")`;\n      `}`;\n    `return result;`;\n    `}`;\n  ``;\n}\n\n@gen(functions) @c_file\n```\nRDI_PROC RDI_EvalConversionKind\nrdi_eval_conversion_kind_from_typegroups(RDI_EvalTypeGroup in, RDI_EvalTypeGroup out)\n{\n  RDI_EvalConversionKind k = rdi_eval_typegroup_conversion_kind_matrix[in].dst_typegroups[out];\n  return k;\n}\n```\n\n@gen(functions) @c_file\n```\nRDI_PROC RDI_S32\nrdi_eval_op_typegroup_are_compatible(RDI_EvalOp op, RDI_EvalTypeGroup group)\n{\n  RDI_S32 result = 0;\n  switch(op)\n  {\n    case RDI_EvalOp_Neg: case RDI_EvalOp_Add: case RDI_EvalOp_Sub:\n    case RDI_EvalOp_Mul: case RDI_EvalOp_Div:\n    case RDI_EvalOp_EqEq:case RDI_EvalOp_NtEq:\n    case RDI_EvalOp_LsEq:case RDI_EvalOp_GrEq:\n    case RDI_EvalOp_Less:case RDI_EvalOp_Grtr:\n    {\n      if(group != RDI_EvalTypeGroup_Other)\n      {\n        result = 1;\n      }\n    }break;\n    case RDI_EvalOp_Mod:case RDI_EvalOp_LShift:case RDI_EvalOp_RShift:\n    case RDI_EvalOp_BitNot:case RDI_EvalOp_BitAnd:case RDI_EvalOp_BitXor:\n    case RDI_EvalOp_BitOr:case RDI_EvalOp_LogNot:case RDI_EvalOp_LogAnd:\n    case RDI_EvalOp_LogOr: \n    {\n      if(group == RDI_EvalTypeGroup_S || group == RDI_EvalTypeGroup_U)\n      {\n        result = 1;\n      }\n    }break;\n  }\n  return result;\n}\n```\n\n@gen(functions) @c_file\n```\nRDI_PROC RDI_U8 *\nrdi_explanation_string_from_eval_conversion_kind(RDI_EvalConversionKind kind, RDI_U64 *size_out)\n{\n  *size_out = rdi_eval_conversion_kind_message_string_table[kind].size;\n  return rdi_eval_conversion_kind_message_string_table[kind].str;\n}\n```\n\n@gen(functions) @c_file\n{\n  `RDI_PROC RDI_SectionKind`;\n  `rdi_section_kind_from_checksum_kind(RDI_ChecksumKind kind)`;\n  `{`;\n    `RDI_SectionKind result = 0;`;\n    `switch(kind)`;\n    `{`;\n      `default:{}break;`;\n      @expand(RDI_ChecksumKindTable a) `case RDI_ChecksumKind_$(a.name):{result = RDI_SectionKind_$(a.section);}break;`,\n      `}`;\n    `return result;`;\n    `}`;\n  ``;\n}\n"
  },
  {
    "path": "src/rdi/rdi_local.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#include \"lib_rdi/rdi.c\"\n#include \"lib_rdi/rdi_parse.c\"\n\n////////////////////////////////\n//~ rjf: RDI Enum <=> Base Enum\n\ninternal Arch\narch_from_rdi_arch(RDI_Arch arch)\n{\n  Arch result = Arch_Null;\n  switch((RDI_ArchEnum)arch)\n  {\n    case RDI_Arch_NULL:{}break;\n    case RDI_Arch_X86:{result = Arch_x86;}break;\n    case RDI_Arch_X64:{result = Arch_x64;}break;\n  }\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: Lookup Helpers\n\ninternal String8\nstr8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx)\n{\n  String8 result = {0};\n  result.str = rdi_string_from_idx(rdi, idx, &result.size);\n  return result;\n}\n\n////////////////////////////////\n//~ rjf: String <=> Enum\n\ninternal String8\nrdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v)\n{\n  String8 result = {0};\n  switch(v)\n  {\n    default:{result = push_str8f(arena, \"<invalid RDI_SectionKind %u>\", v);}break;\n#define X(name, lower, type) case RDI_SectionKind_##name:{result = str8_lit(#name);}break;\n    RDI_SectionKind_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_arch(Arena *arena, RDI_Arch v)\n{\n  String8 result = {0};\n  switch(v)\n  {\n    default:{result = push_str8f(arena, \"<invalid RDI_Arch %u>\", v);} break;\n#define X(name) case RDI_Arch_##name:{result = str8_lit(#name);} break;\n    RDI_Arch_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_language(Arena *arena, RDI_Language v)\n{\n  String8 result = {0};\n  switch(v)\n  {\n    default:{result = push_str8f(arena, \"<invalid RDI_Language %u>\", v);}break;\n#define X(name) case RDI_Language_##name:{result = str8_lit(#name);}break;\n    RDI_Language_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_local_kind(Arena *arena, RDI_LocalKind v)\n{\n  String8 result = {0};\n  switch(v)\n  {\n    default:{result = push_str8f(arena, \"<invalid RDI_LocalKind %u>\", v);}break;\n#define X(name) case RDI_LocalKind_##name:{result = str8_lit(#name);}break;\n    RDI_LocalKind_XList\n#undef X\n  }\n  return result;\n}\n\n#if 0\ninternal String8\nrdi_string_from_type_kind(Arena *arena, RDI_TypeKind v)\n{\n  String8 result = {0};\n  switch(v)\n  {\n    default:{result = push_str8f(arena, \"<invalid RDI_TypeKind %u>\", v);}break;\n#define X(name) case RDI_TypeKind_##name:{result = str8_lit(#name);}break;\n    RDI_TypeKind_XList\n#undef X\n  }\n  return result;\n}\n#endif\n\ninternal String8\nrdi_string_from_member_kind(Arena *arena, RDI_MemberKind v)\n{\n  String8 result = {0};\n  switch(v)\n  {\n    default:{result = push_str8f(arena, \"<invalid RDI_MemberKind %u>\", v);}break;\n#define X(name) case RDI_MemberKind_##name:{result = str8_lit(#name);}break;\n    RDI_MemberKind_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_name_map_kind(RDI_NameMapKind kind)\n{\n  String8 result = {0};\n  switch(kind)\n  {\n    default:{}break;\n#define X(name) case RDI_NameMapKind_##name:{result = str8_lit(#name);}break;\n    RDI_NameMapKind_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_reg_code_x86(U64 reg_code)\n{\n  String8 result = {0};\n  switch(reg_code)\n  {\n    default:{}break;\n#define X(name, value) case RDI_RegCodeX86_##name:{result = str8_lit(#name);}break;\n    RDI_RegCodeX86_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_reg_code_x64(U64 reg_code)\n{\n  String8 result = {0};\n  switch(reg_code)\n  {\n    default:{}break;\n#define X(name, value) case RDI_RegCodeX64_##name:{result = str8_lit(#name);}break;\n    RDI_RegCodeX64_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_reg_code(Arena *arena, RDI_Arch arch, U64 reg_code)\n{\n  String8 result = {0};\n  switch(arch)\n  {\n    default:\n    case RDI_Arch_NULL: {result = push_str8f(arena, \"??? (%llu)\", reg_code);}break;\n    case RDI_Arch_X86:  {result = rdi_string_from_reg_code_x86(reg_code);}break;\n    case RDI_Arch_X64:  {result = rdi_string_from_reg_code_x64(reg_code);}break;\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_eval_op(Arena *arena, RDI_EvalOp op)\n{\n  String8 result = {0};\n  switch(op)\n  {\n    default:{result = push_str8f(arena, \"%#x\", op);}break;\n#define X(name) case RDI_EvalOp_##name:{result = str8_lit(#name);}break;\n    RDI_EvalOp_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_eval_type_group(Arena *arena, RDI_EvalTypeGroup eval_type_group)\n{\n  String8 result = {0};\n  switch(eval_type_group)\n  {\n    default:{result = push_str8f(arena, \"%#x\", eval_type_group);}break;\n#define X(name) case RDI_EvalTypeGroup_##name:{result = str8_lit(#name);}break;\n    RDI_EvalTypeGroup_XList\n#undef X\n  }\n  return result;\n}\n\ninternal String8\nrdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n#define X(name) if (flags & RDI_BinarySectionFlag_##name) { flags &= ~RDI_BinarySectionFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); }\n  RDI_BinarySectionFlags_XList;\n#undef X\n  StringJoin join = {.sep = str8_lit(\"|\")};\n  String8 result = str8_list_join(arena, &list, &join);\n  if(result.size == 0) { result = str8_lit(\"None\"); }\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrdi_string_from_type_modifier_flags(Arena *arena, RDI_TypeModifierFlags flags)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n#define X(name) if(flags & RDI_TypeModifierFlag_##name) { flags &= ~RDI_TypeModifierFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); }\n  RDI_TypeModifierFlags_XList;\n#undef X\n  StringJoin join = {.sep = str8_lit(\"|\")};\n  String8 result = str8_list_join(arena, &list, &join);\n  if(result.size == 0) { result = str8_lit(\"None\"); }\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrdi_string_from_udt_flags(Arena *arena, RDI_UDTFlags flags)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n#define X(name) if (flags & RDI_UDTFlag_##name) { flags &= ~RDI_UDTFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); }\n  RDI_UDTFlags_XList;\n#undef X\n  StringJoin join = {.sep = str8_lit(\"|\")};\n  String8 result = str8_list_join(arena, &list, &join);\n  if(result.size == 0) { result = str8_lit(\"None\"); }\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrdi_string_from_link_flags(Arena *arena, RDI_LinkFlags flags)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List list = {0};\n#define X(name) if (flags & RDI_LinkFlag_##name) { flags &= ~RDI_LinkFlag_##name; str8_list_push(scratch.arena, &list, str8_lit(#name)); }\n  RDI_LinkFlags_XList;\n#undef X\n  StringJoin join = {.sep = str8_lit(\"|\")};\n  String8 result = str8_list_join(arena, &list, &join);\n  if(result.size == 0) { result = str8_lit(\"None\"); }\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nrdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc)\n{\n  Temp scratch = scratch_begin(&arena, 1);\n  String8List fmt = {0};\n  for(U64 cursor = 0; cursor < bc.size; )\n  {\n    RDI_EvalOp op = RDI_EvalOp_Stop;\n    cursor += str8_deserial_read_struct(bc, cursor, &op);\n    \n    U16 ctrlbits = rdi_eval_op_ctrlbits_table[op];\n    U32 imm_size = RDI_DECODEN_FROM_CTRLBITS(ctrlbits);\n    \n    String8 imm = {0};\n    cursor += str8_deserial_read_block(bc, cursor, imm_size, &imm);\n    if (imm.size != imm_size) {\n      str8_list_pushf(scratch.arena, &fmt, \"(ERROR: not enough bytes to read immediate)\");\n      break;\n    }\n    \n    String8 imm_fmt = {0};\n    switch (op) {\n      case RDI_EvalOp_Stop: goto exit;\n      case RDI_EvalOp_Noop: break;\n      case RDI_EvalOp_Cond: break;\n      case RDI_EvalOp_Skip:  {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U16 *)imm.str);\n      } break;\n      case RDI_EvalOp_MemRead: {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U8 *)imm.str);\n      } break;\n      case RDI_EvalOp_RegRead: {\n        U32         regread   = *(U32 *)imm.str;\n        RDI_RegCode reg_code  = Extract8(regread, 0);\n        U8          byte_size = Extract8(regread, 1);\n        U8          byte_off  = Extract8(regread, 2);\n        String8     reg_str   = rdi_string_from_reg_code(scratch.arena, arch, reg_code);\n        imm_fmt = push_str8f(scratch.arena, \"%S+%I64u, Size: %u\", reg_str, byte_off, byte_size);\n      } break;\n      case RDI_EvalOp_RegReadDyn: break;\n      case RDI_EvalOp_FrameOff: {\n        imm_fmt = push_str8f(scratch.arena, \"%+lld\", *(S64 *)imm.str);\n      } break;\n      case RDI_EvalOp_ModuleOff: {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U32 *)imm.str);\n      } break;\n      case RDI_EvalOp_TLSOff: {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U32 *)imm.str);\n      } break;\n      case RDI_EvalOp_ConstU8: {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U8 *)imm.str);\n      } break;\n      case RDI_EvalOp_ConstU16: {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U16 *)imm.str);\n      } break;\n      case RDI_EvalOp_ConstU32: {\n        imm_fmt = push_str8f(scratch.arena, \"%u\", *(U32 *)imm.str);\n      } break;\n      case RDI_EvalOp_ConstU64: {\n        imm_fmt = push_str8f(scratch.arena, \"%llu\", *(U64 *)imm.str);\n      } break;\n      case RDI_EvalOp_ConstU128: {\n        imm_fmt = push_str8f(scratch.arena, \"Lo: %llu, Hi: %llu\", *(U64 *)imm.str, *((U64 *)imm.str + 1));\n      } break;\n      case RDI_EvalOp_ConstString: {\n        U8      size   = *(U8 *)imm.str;\n        String8 string = {0};\n        cursor += str8_deserial_read_block(bc, cursor, size, &string);\n        \n        imm_fmt = push_str8f(scratch.arena, \"(%u) \\\"%S\\\"\", size, string);\n      } break;\n      case RDI_EvalOp_Abs:\n      case RDI_EvalOp_Neg: \n      case RDI_EvalOp_Add:\n      case RDI_EvalOp_Sub:\n      case RDI_EvalOp_Mul:\n      case RDI_EvalOp_Div:\n      case RDI_EvalOp_Mod:\n      case RDI_EvalOp_LShift:\n      case RDI_EvalOp_RShift:\n      case RDI_EvalOp_BitAnd:\n      case RDI_EvalOp_BitOr:\n      case RDI_EvalOp_BitXor:\n      case RDI_EvalOp_BitNot:\n      case RDI_EvalOp_LogAnd:\n      case RDI_EvalOp_LogOr:\n      case RDI_EvalOp_LogNot:\n      case RDI_EvalOp_EqEq:\n      case RDI_EvalOp_NtEq:\n      case RDI_EvalOp_LsEq:\n      case RDI_EvalOp_GrEq:\n      case RDI_EvalOp_Less:\n      case RDI_EvalOp_Grtr: {\n        U8 eval_type_group = *(U8 *)imm.str;\n        imm_fmt = rdi_string_from_eval_type_group(scratch.arena, eval_type_group);\n      } break;\n      case RDI_EvalOp_Trunc:\n      case RDI_EvalOp_TruncSigned: {\n        U8 trunc = *(U8 *)imm.str;\n        imm_fmt = push_str8f(scratch.arena, \"%u\", trunc);\n      } break;\n      case RDI_EvalOp_Convert: {\n        U16 convert = *(U16 *)imm.str;\n        U8 in  = Extract8(convert, 0);\n        U8 out = Extract8(convert, 1);\n        String8 in_str  = rdi_string_from_eval_type_group(scratch.arena, in);\n        String8 out_str = rdi_string_from_eval_type_group(scratch.arena, out);\n        imm_fmt = push_str8f(scratch.arena, \"in: %S out: %S\", in_str, out_str);\n      } break;\n      case RDI_EvalOp_Pick: {\n        U8 pick = *(U8 *)imm.str;\n        imm_fmt = push_str8f(scratch.arena, \"%u\", pick);\n      } break;\n      case RDI_EvalOp_Pop: break;\n      case RDI_EvalOp_Insert: {\n        U8 insert = *(U8 *)imm.str;\n        imm_fmt = push_str8f(scratch.arena, \"%u\", insert);\n      } break;\n      case RDI_EvalOp_ValueRead: {\n        U8 bytes_to_read = *(U8 *)imm.str;\n        imm_fmt = push_str8f(scratch.arena, \"%u\", bytes_to_read);\n      } break;\n      case RDI_EvalOp_ByteSwap: {\n        U8 byte_size = *(U8 *)imm.str;\n        imm_fmt = push_str8f(scratch.arena, \"%u\", byte_size);\n      } break;\n      case RDI_EvalOp_CallSiteValue: {\n        U32     call_site_bc_size = *(U32 *)imm.str;\n        String8 call_site_bc      = {0};\n        cursor += str8_deserial_read_block(bc, cursor, call_site_bc_size, &call_site_bc);\n        \n        String8 call_site_str = rdi_string_from_bytecode(scratch.arena, arch, call_site_bc);\n        imm_fmt = push_str8f(scratch.arena, \"%S\", call_site_str);\n      } break;\n      case RDI_EvalOp_PartialValue: {\n        U32 partial_value_size = *(U32 *)imm.str;\n        imm_fmt = push_str8f(scratch.arena, \"%u\", partial_value_size);\n      } break;\n      case RDI_EvalOp_PartialValueBit: {\n        U64 partial_value = *(U64 *)imm.str;\n        U32 bit_size = Extract32(partial_value, 0);\n        U32 bit_off  = Extract32(partial_value, 1);\n        imm_fmt = push_str8f(scratch.arena, \"Off: %u, Size: %u\", bit_size, bit_off);\n      } break;\n    }\n    \n    String8 op_str = rdi_string_from_eval_op(scratch.arena, op);\n    if (imm_fmt.size) {\n      str8_list_pushf(scratch.arena, &fmt, \"RDI_EvalOp_%S(%S)\", op_str, imm_fmt);\n    } else {\n      str8_list_pushf(scratch.arena, &fmt, \"RDI_EvalOp_%S\", op_str);\n    }\n  }\n  exit:;\n  \n  String8 result = str8_list_join(arena, &fmt, &(StringJoin){.sep = str8_lit(\", \")});\n  \n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8List\nrdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range)\n{\n  String8List strings = {0};\n  Temp scratch = scratch_begin(&arena, 1);\n  U64 location_block_count = 0;\n  U64 location_data_size   = 0;\n  RDI_LocationBlock *location_block_array = rdi_table_from_name(rdi, LocationBlocks, &location_block_count);\n  RDI_U8 *location_data        = rdi_table_from_name(rdi, LocationData,   &location_data_size);\n  Rng1U64 location_block_range_clamped = r1u64(ClampTop(location_block_range.min, location_block_count),\n                                               ClampTop(location_block_range.max, location_block_count));\n  for(U64 block_idx = location_block_range_clamped.min;\n      block_idx < location_block_range_clamped.max;\n      block_idx +=1)\n  {\n    String8 qualifier = {0};\n    String8 location_info = {0};\n    RDI_LocationBlock *block_ptr = &location_block_array[block_idx];\n    if(block_ptr->scope_off_first == 0 && block_ptr->scope_off_opl == max_U32)\n    {\n      qualifier = str8_lit(\"*always*\");\n    }\n    else\n    {\n      qualifier = push_str8f(scratch.arena, \"[%#08x, %#08x): \", block_ptr->scope_off_first, block_ptr->scope_off_opl);\n    }\n    if(block_ptr->location_data_off >= location_data_size)\n    {\n      location_info = push_str8f(scratch.arena, \"<bad-location-data-offset %x>\", block_ptr->location_data_off);\n    }\n    else\n    {\n      U8               *loc_data_opl = location_data + location_data_size;\n      U8               *loc_base_ptr = location_data + block_ptr->location_data_off;\n      RDI_LocationKind  kind         = *(RDI_LocationKind *)loc_base_ptr;\n      switch(kind)\n      {\n        default:\n        {\n          location_info = push_str8f(scratch.arena, \"\\?\\?\\? (%u)\", kind);\n        }break;\n        case RDI_LocationKind_AddrBytecodeStream:\n        {\n          String8 bc     = str8_range(loc_base_ptr + 1, loc_data_opl);\n          String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc);\n          location_info = push_str8f(scratch.arena, \"AddrBytecodeStream(%S)\", bc_str);\n        }break;\n        case RDI_LocationKind_ValBytecodeStream:\n        {\n          String8 bc     = str8_range(loc_base_ptr + 1, loc_data_opl);\n          String8 bc_str = rdi_string_from_bytecode(scratch.arena, arch, bc);\n          location_info = push_str8f(scratch.arena, \"ValBytecodeStream(%S)\", bc_str);\n        }break;\n        case RDI_LocationKind_AddrRegPlusU16:\n        {\n          if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl)\n          {\n            location_info = push_str8f(scratch.arena, \"AddrRegPlusU16(\\?\\?\\?)\");\n          }\n          else\n          {\n            RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16*)loc_base_ptr;\n            location_info = push_str8f(scratch.arena, \"AddrRegPlusU16(reg: %S, off: %u)\", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset);\n          }\n        }break;\n        case RDI_LocationKind_AddrAddrRegPlusU16:\n        {\n          if(loc_base_ptr + sizeof(RDI_LocationRegPlusU16) > loc_data_opl)\n          {\n            location_info = push_str8f(scratch.arena, \"AddrAddrRegPlusU16(\\?\\?\\?)\");\n          }\n          else\n          {\n            RDI_LocationRegPlusU16 *loc = (RDI_LocationRegPlusU16 *)loc_base_ptr;\n            location_info = push_str8f(scratch.arena, \"AddrAddrRegisterPlusU16(reg: %S, off: %u)\", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code), loc->offset);\n          }\n        }break;\n        case RDI_LocationKind_ValReg:\n        {\n          if(loc_base_ptr + sizeof(RDI_LocationReg) > loc_data_opl)\n          {\n            location_info = push_str8f(scratch.arena, \"ValReg(\\?\\?\\?)\");\n          }\n          else\n          {\n            RDI_LocationReg *loc = (RDI_LocationReg*)loc_base_ptr;\n            location_info = push_str8f(scratch.arena, \"ValReg(reg: %S)\", rdi_string_from_reg_code(scratch.arena, arch, loc->reg_code));\n          }\n        } break;\n      }\n    }\n    str8_list_pushf(arena, &strings, \"%S: %S\", qualifier, location_info);\n  }\n  scratch_end(scratch);\n  return strings;\n}\n\n////////////////////////////////\n//~ rjf: RDI Dumping\n\ninternal String8List\nrdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags)\n{\n  ProfBeginFunction();\n  Temp scratch = scratch_begin(&arena, 1);\n  String8 indent = str8_lit(\"                                                                                                                                \");\n  \n  //////////////////////////////\n  //- rjf: set up\n  //\n  typedef struct DumpSubsetOutputNode DumpSubsetOutputNode;\n  struct DumpSubsetOutputNode\n  {\n    DumpSubsetOutputNode *next;\n    RDI_DumpSubset subset;\n    String8List *lane_strings;\n  };\n  local_persist DumpSubsetOutputNode *first_output_node = 0;\n  local_persist DumpSubsetOutputNode *last_output_node = 0;\n  local_persist String8List result_strings = {0};\n  String8List *strings = 0;\n#define dump(str)  str8_list_push(arena, strings, (str))\n#define dumpf(...) str8_list_pushf(arena, strings, __VA_ARGS__)\n#define DumpSubset(name) \\\nif(lane_idx() == 0)\\\n{\\\nDumpSubsetOutputNode *n = push_array(scratch.arena, DumpSubsetOutputNode, 1);\\\nSLLQueuePush(first_output_node, last_output_node, n);\\\nn->subset = RDI_DumpSubset_##name;\\\nn->lane_strings = push_array(scratch.arena, String8List, lane_count());\\\n}\\\nlane_sync();\\\nstrings = &last_output_node->lane_strings[lane_idx()];\\\nlane_sync(); if(flags & RDI_DumpSubsetFlag_##name) ProfScope(#name)\n  \n  //////////////////////////////\n  //- rjf: dump data sections\n  //\n  DumpSubset(DataSections)\n  {\n    if(lane_idx() == 0) { dumpf(\"\\n\"); }\n    Rng1U64 range = lane_range(rdi->sections_count);\n    for EachInRange(idx, range)\n    {\n      Temp scratch = scratch_begin(&arena, 1);\n      RDI_SectionKind  kind     = (RDI_SectionKind)idx;\n      RDI_Section     *section  = &rdi->sections[idx];\n      String8          kind_str = rdi_string_from_data_section_kind(scratch.arena, kind);\n      dumpf(\"  {%#010llx  %10u  %10u  %*s} // data_section[%I64u]\\n\", section->off, section->encoded_size, section->unpacked_size, 24, kind_str.str, idx);\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump top-level-info\n  //\n  DumpSubset(TopLevelInfo)\n  {\n    if(lane_idx() == 0)\n    {\n      RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);\n      Temp scratch = scratch_begin(&arena, 1);\n      Guid guid = {0};\n      MemoryCopy(&guid, &tli->guid, Min(sizeof guid, sizeof tli->guid));\n      dumpf(\"\\n\");\n      dumpf(\"  arch:          %S\\n\",      rdi_string_from_arch(scratch.arena, tli->arch));\n      dumpf(\"  exe_name:      '%S'\\n\",    str8_from_rdi_string_idx(rdi, tli->exe_name_string_idx));\n      dumpf(\"  voff_max:      %#08llx\\n\", tli->voff_max);\n      dumpf(\"  producer_name: '%S'\\n\",    str8_from_rdi_string_idx(rdi, tli->producer_name_string_idx));\n      dumpf(\"  guid:          %S\\n\",      string_from_guid(scratch.arena, guid));\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump binary sections\n  //\n  DumpSubset(BinarySections)\n  {\n    if(lane_idx() == 0)\n    {\n      dumpf(\"\\n  // %-16s %-16s %-12s %-12s %-12s %s\\n\", \"name\", \"flags\", \"voff_first\", \"voff_opl\", \"foff_first\", \"foff_opl\");\n    }\n    U64 count = 0;\n    RDI_BinarySection *v = rdi_table_from_name(rdi, BinarySections, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      Temp scratch = scratch_begin(&arena, 1);\n      RDI_BinarySection *bin_section = &v[idx];\n      String8 name = str8_from_rdi_string_idx(rdi, bin_section->name_string_idx);\n      String8 flags = rdi_string_from_binary_section_flags(scratch.arena, bin_section->flags);\n      dumpf(\"  {  %-16S %-16S 0x%-10I64x 0x%-10I64x 0x%-10I64x 0x%-10I64x  } // binary_section[%I64u]\\n\", \n            push_str8f(scratch.arena, \"'%S'\", name),\n            push_str8f(scratch.arena, \"`%S`\", flags),\n            bin_section->voff_first,\n            bin_section->voff_opl,\n            bin_section->foff_first,\n            bin_section->foff_opl,\n            idx);\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump file paths\n  //\n  DumpSubset(FilePaths)\n  {\n    if(lane_idx() == 0) { dumpf(\"\\n\"); }\n    U64 count = 0;\n    RDI_FilePathNode *v = rdi_table_from_name(rdi, FilePathNodes, &count);\n    RDI_FilePathNode *nil = &v[0];\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_FilePathNode *root = &v[idx];\n      if(root->parent_path_node != 0) { continue; }\n      S64 depth = 1;\n      for(RDI_FilePathNode *n = root, *rec_next = nil; n != nil; n = rec_next)\n      {\n        // rjf: dump\n        if(n->source_file_idx == 0)\n        {\n          dumpf(\"%.*s'%S'%s // file_path_node[%I64u]\\n\",\n                depth*2, indent.str,\n                str8_from_rdi_string_idx(rdi, n->name_string_idx),\n                n->first_child ? \":\" : \"\",\n                (U64)(n - v));\n        }\n        else\n        {\n          dumpf(\"%.*s'%S': source_file: %u // file_path_node[%I64u]\\n\", depth*2, indent.str, str8_from_rdi_string_idx(rdi, n->name_string_idx), n->source_file_idx, (U64)(n - v));\n        }\n        \n        // rjf: find next node\n        rec_next = nil;\n        if(n->first_child)\n        {\n          dumpf(\"%.*s{\\n\", depth*2, indent.str);\n          rec_next = rdi_element_from_name_idx(rdi, FilePathNodes, n->first_child);\n          depth += 1;\n        }\n        else for(RDI_FilePathNode *p = n;\n                 p != nil && p != root;\n                 p = rdi_element_from_name_idx(rdi, FilePathNodes, p->parent_path_node), depth -= 1)\n        {\n          if(p->next_sibling)\n          {\n            rec_next = rdi_element_from_name_idx(rdi, FilePathNodes, p->next_sibling);\n            break;\n          }\n          dumpf(\"%.*s}\\n\", (depth-1)*2, indent.str);\n        }\n      }\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump source files\n  //\n  DumpSubset(SourceFiles)\n  {\n    U64 count = 0;\n    RDI_SourceFile *v = rdi_table_from_name(rdi, SourceFiles, &count);\n    U64 checksums_count[RDI_ChecksumKind_COUNT] = {0};\n    RDI_U8 *checksums_data[RDI_ChecksumKind_COUNT] = {0};\n    RDI_U64 checksums_element_sizes[RDI_ChecksumKind_COUNT] = {0};\n    for EachEnumVal(RDI_ChecksumKind, k)\n    {\n      RDI_SectionKind section_kind = rdi_section_kind_from_checksum_kind(k);\n      checksums_data[k] = rdi_section_raw_table_from_kind(rdi, section_kind, &checksums_count[k]);\n      checksums_element_sizes[k] = rdi_section_element_size_table[section_kind];\n    }\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_SourceFile *source_file = &v[idx];\n      RDI_ChecksumKind checksum_kind = source_file->checksum_kind;\n      RDI_U32 checksum_idx = source_file->checksum_idx;\n      String8 checksum_kind_name = {0};\n      switch(checksum_kind)\n      {\n        default:{checksum_kind_name = str8_lit(\"Null\");}break;\n#define X(name, s) case RDI_ChecksumKind_##name:{checksum_kind_name = str8_lit(#name);}break;\n        RDI_ChecksumKind_XList\n#undef X\n      }\n      String8 checksum_value = str8(checksums_data[checksum_kind] + checksums_element_sizes[checksum_kind]*checksum_idx, checksums_element_sizes[checksum_kind]);\n      String8List checksum_vals = numeric_str8_list_from_data(arena, 16, checksum_value, 1);\n      StringJoin join = {0};\n      join.sep = str8_lit(\", \");\n      String8 checksum_val_string = str8_list_join(arena, &checksum_vals, &join);\n      dumpf(\"\\n  { file_path_node_idx: %4u, source_line_map: %4u, checksum_kind: %10S, checksum_value: %192S, path: %-192S } // source_file[%I64u]\",\n            source_file->file_path_node_idx,\n            source_file->source_line_map_idx,\n            checksum_kind_name,\n            checksum_val_string,\n            push_str8f(arena, \"'%S'\", str8_from_rdi_string_idx(rdi, source_file->normal_full_path_string_idx)),\n            idx);\n    }\n    if(lane_idx() == lane_count()-1) { dumpf(\"\\n\"); }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump units\n  //\n  DumpSubset(Units)\n  {\n    U64 count = 0;\n    RDI_Unit *v = rdi_table_from_name(rdi, Units, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_Unit *unit = &v[idx];\n      Temp scratch = scratch_begin(&arena, 1);\n      dumpf(\"\\n  // unit[%I64u]\\n  {\\n\", idx);\n      dumpf(\"    unit_name: '%S'\\n\", str8_from_rdi_string_idx(rdi, unit->unit_name_string_idx));\n      dumpf(\"    compiler_name: '%S'\\n\", str8_from_rdi_string_idx(rdi, unit->compiler_name_string_idx));\n      dumpf(\"    source_file_path: %u\\n\",   unit->source_file_path_node);\n      dumpf(\"    object_file_path: %u\\n\",   unit->object_file_path_node);\n      dumpf(\"    archive_file_path: %u\\n\",   unit->archive_file_path_node);\n      dumpf(\"    build_path: %u\\n\",   unit->build_path_node);\n      dumpf(\"    language: %S\\n\",   rdi_string_from_language(scratch.arena, unit->language));\n      dumpf(\"    line_table_idx: %u\\n\",   unit->line_table_idx);\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump unit vmap\n  //\n  DumpSubset(UnitVMap)\n  {\n    if(lane_idx() == 0) { dumpf(\"\\n\"); }\n    U64 count = 0;\n    RDI_VMapEntry *v = rdi_table_from_name(rdi, UnitVMap, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      dumpf(\"  {0x%I64x => %I64u}\\n\", v[idx].voff, v[idx].idx);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump line tables\n  //\n  DumpSubset(LineTables)\n  {\n    U64 count = 0;\n    RDI_LineTable *v = rdi_table_from_name(rdi, LineTables, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_LineTable *line_table = &v[idx];\n      RDI_ParsedLineTable parsed_line_table = {0};\n      rdi_parsed_from_line_table(rdi, line_table, &parsed_line_table);\n      dumpf(\"\\n  // line_table[%I64u]\\n  {\\n\", idx);\n      for EachIndex(line_idx, parsed_line_table.count)\n      {\n        U64         first = parsed_line_table.voffs[line_idx];\n        U64         opl   = parsed_line_table.voffs[line_idx + 1];\n        RDI_Line   *line  = parsed_line_table.lines + line_idx;\n        RDI_Column *col   = 0;\n        if(line_idx < parsed_line_table.col_count)\n        {\n          col = parsed_line_table.cols + line_idx;\n        }\n        if(col == 0)\n        {\n          dumpf(\"    { [0x%08I64x, 0x%08I64x) file: %u, line: %u }\\n\", first, opl, line->file_idx, line->line_num);\n        }\n        else\n        {\n          dumpf(\"    { [0x%08I64x, 0x%08I64x) file: %u, line: %u, columns: [%u, %u) }\\n\", first, opl, line->file_idx, line->line_num, col->col_first, col->col_opl);\n        }\n      }\n      dumpf(\"  }\\n\");\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump source line maps\n  //\n  DumpSubset(SourceLineMaps)\n  {\n    U64 count = 0;\n    RDI_SourceLineMap *v = rdi_table_from_name(rdi, SourceLineMaps, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      Temp scratch = scratch_begin(&arena, 1);\n      RDI_ParsedSourceLineMap line_map = {0};\n      rdi_parsed_from_source_line_map(rdi, &v[idx], &line_map);\n      dumpf(\"\\n  // source_line_map[%I64u]\\n  {\\n\", idx);\n      for EachIndex(line_num_idx, line_map.count)\n      {\n        Temp temp = temp_begin(scratch.arena);\n        String8List list = {0};\n        U32 voff_lo = line_map.ranges[line_num_idx];\n        U32 voff_hi = ClampTop(line_map.ranges[line_num_idx + 1], line_map.voff_count);\n        for(U64 voff_idx = voff_lo; voff_idx < voff_hi; voff_idx += 1)\n        {\n          str8_list_pushf(temp.arena, &list, \"%#llx\", line_map.voffs[voff_idx]);\n        }\n        String8 voffs_string = str8_list_join(temp.arena, &list, &(StringJoin){.sep = str8_lit(\", \")});\n        dumpf(\"    %u: (%S)\\n\", line_map.nums[line_num_idx], voffs_string);\n        temp_end(temp);\n      }\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump type nodes\n  //\n  DumpSubset(TypeNodes)\n  {\n    U64 count = 0;\n    RDI_TypeNode *v = rdi_table_from_name(rdi, TypeNodes, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      Temp scratch = scratch_begin(&arena, 1);\n      RDI_TypeNode *type = &v[idx];\n      String8 type_kind_str = {0};\n      type_kind_str.str = rdi_string_from_type_kind(type->kind, &type_kind_str.size);\n      dumpf(\"\\n  // type[%I64u]\\n  {\\n\", idx);\n      dumpf(\"    kind: %S\\n\", type_kind_str);\n      if(type->kind == RDI_TypeKind_Modifier)\n      {\n        dumpf(\"    flags: %S\\n\", rdi_string_from_type_modifier_flags(scratch.arena, type->flags));\n      }\n      else if(type->flags != 0)\n      {\n        dumpf(\"    flags: %#x (missing stringizer path)\\n\", type->flags);\n      }\n      dumpf(\"    byte_size: %u\\n\", type->byte_size);\n      if(RDI_TypeKind_FirstBuiltIn <= type->kind && type->kind <= RDI_TypeKind_LastBuiltIn)\n      {\n        dumpf(\"    name: '%S'\\n\", str8_from_rdi_string_idx(rdi, type->built_in.name_string_idx));\n      }\n      else if(type->kind == RDI_TypeKind_Array)\n      {\n        dumpf(\"    constructed__direct_type: %u\\n\", type->constructed.direct_type_idx);\n        dumpf(\"    constructed__array_count: %u\\n\", type->constructed.count);\n      }\n      else if(type->kind == RDI_TypeKind_Function)\n      {\n        U32  param_idx_count = 0;\n        U32 *param_idx_array = rdi_idx_run_from_first_count(rdi, type->constructed.param_idx_run_first, type->constructed.count, &param_idx_count);\n        String8List param_idx_strings = {0};\n        for(U32 param_idx = 0; param_idx < param_idx_count; param_idx += 1)\n        {\n          str8_list_pushf(scratch.arena, &param_idx_strings, \"%u\", param_idx_array[param_idx]);\n        }\n        String8 param_idx_str = str8_list_join(scratch.arena, &param_idx_strings, &(StringJoin){.pre = str8_lit(\"[\"), .sep = str8_lit(\", \"), .post = str8_lit(\"]\")});\n        dumpf(\"    constructed__params: %S // idx_run[%u]\\n\", param_idx_str, type->constructed.param_idx_run_first);\n        dumpf(\"    return_type: %u\\n\", type->constructed.direct_type_idx);\n      }\n      else if(type->kind == RDI_TypeKind_Method)\n      {\n        U32  param_idx_count = 0;\n        U32 *param_idx_array = rdi_idx_run_from_first_count(rdi, type->constructed.param_idx_run_first, type->constructed.count, &param_idx_count);\n        String8 this_type_str = str8_lit(\"\\?\\?\\?\");\n        if(param_idx_count > 0)\n        {\n          this_type_str = push_str8f(scratch.arena, \"%u\", param_idx_array[0]);\n          param_idx_count -= 1;\n          param_idx_array += 1;\n        }\n        String8List param_idx_strings = {0};\n        for(U32 param_idx = 0; param_idx < param_idx_count; param_idx += 1)\n        {\n          str8_list_pushf(scratch.arena, &param_idx_strings, \"%u\", param_idx_array[param_idx]);\n        }\n        String8 param_idx_str = str8_list_join(scratch.arena, &param_idx_strings, &(StringJoin){.pre = str8_lit(\"[\"), .sep = str8_lit(\", \"), .post = str8_lit(\"]\")});\n        dumpf(\"    constructed__this_type: %S // idx_run[%u]\\n\", this_type_str, type->constructed.param_idx_run_first);\n        dumpf(\"    constructed__params: %S // idx_run[%u]\\n\", param_idx_str, type->constructed.param_idx_run_first);\n        dumpf(\"    return_type: %u\\n\", type->constructed.direct_type_idx);\n      }\n      else if(RDI_TypeKind_FirstConstructed <= type->kind && type->kind <= RDI_TypeKind_LastConstructed)\n      {\n        dumpf(\"    constructed__direct_type: %u\\n\", type->constructed.direct_type_idx);\n      }\n      else if(RDI_TypeKind_FirstUserDefined <= type->kind && type->kind <= RDI_TypeKind_LastUserDefined)\n      {\n        dumpf(\"    name: '%S'\\n\", str8_from_rdi_string_idx(rdi, type->user_defined.name_string_idx));\n        dumpf(\"    user_defined__direct_type: %u\\n\",   type->user_defined.direct_type_idx);\n        dumpf(\"    user_defined__udt: %u\\n\",   type->user_defined.udt_idx);\n      }\n      else if(type->kind == RDI_TypeKind_Bitfield)\n      {\n        dumpf(\"    bitfield__off: %u\\n\", type->bitfield.off);\n        dumpf(\"    bitfield__size: %u\\n\", type->bitfield.size);\n      }\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump user defined types\n  //\n  DumpSubset(UserDefinedTypes)\n  {\n    U64 count = 0;\n    RDI_UDT *v = rdi_table_from_name(rdi, UDTs, &count);\n    U64 all_members_count = 0;\n    RDI_Member *all_members = rdi_table_from_name(rdi, Members, &all_members_count);\n    U64 all_enum_members_count = 0;\n    RDI_EnumMember *all_enum_members = rdi_table_from_name(rdi, EnumMembers, &all_enum_members_count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_UDT *udt = &v[idx];\n      Temp scratch = scratch_begin(&arena, 1);\n      dumpf(\"\\n  // udt[%I64u]\\n  {\\n\", idx);\n      dumpf(\"    self_type: %u\\n\", udt->self_type_idx);\n      dumpf(\"    flags: `%S`\\n\", rdi_string_from_udt_flags(scratch.arena, udt->flags));\n      if(udt->file_idx != 0)\n      {\n        dumpf(\"    loc: {file: %u, line: %u, col: %u}\\n\", udt->file_idx, udt->line, udt->col);\n      }\n      if(udt->flags & RDI_UDTFlag_EnumMembers)\n      {\n        U32 member_hi = ClampTop(udt->member_first + udt->member_count, all_enum_members_count);\n        U32 member_lo = ClampTop(udt->member_first, member_hi);\n        if(member_lo < member_hi)\n        {\n          dumpf(\"    enum_members:\\n\");\n          dumpf(\"    {\\n\");\n          for(U32 enum_member_idx = member_lo; enum_member_idx < member_hi; enum_member_idx += 1)\n          {\n            RDI_EnumMember *enum_member = &all_enum_members[enum_member_idx];\n            dumpf(\"      '%S': %I64u\\n\", str8_from_rdi_string_idx(rdi, enum_member->name_string_idx), enum_member->val);\n          }\n          dumpf(\"    }\\n\");\n        }\n      }\n      else\n      {\n        U32 member_hi = ClampTop(udt->member_first + udt->member_count, all_members_count);\n        U32 member_lo = ClampTop(udt->member_first, member_hi);\n        if(member_lo < member_hi)\n        {\n          dumpf(\"    members:\\n\");\n          dumpf(\"    {\\n\");\n          for(U32 member_idx = member_lo; member_idx < member_hi; member_idx += 1)\n          {\n            RDI_Member *member = &all_members[member_idx];\n            String8 kind_str = rdi_string_from_member_kind(scratch.arena, member->kind);\n            String8 name_str = str8_from_rdi_string_idx(rdi, member->name_string_idx);\n            dumpf(\"      '%S': { kind: %S, type: %u, off: %u }\\n\", name_str, kind_str, member->type_idx, member->off);\n          }\n          dumpf(\"    }\\n\");\n        }\n      }\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump global variables\n  //\n  DumpSubset(GlobalVariables)\n  {\n    U64 count = 0;\n    RDI_GlobalVariable *v = rdi_table_from_name(rdi, GlobalVariables, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_GlobalVariable *gvar = &v[idx];\n      Temp scratch = scratch_begin(&arena, 1);\n      dumpf(\"\\n  '%S': // global_variable[%I64u]\\n  {\\n\", str8_from_rdi_string_idx(rdi, gvar->name_string_idx), idx);\n      dumpf(\"    link_flags:    `%S`\\n\",    rdi_string_from_link_flags(scratch.arena, gvar->link_flags));\n      dumpf(\"    voff:          %#08x\\n\", gvar->voff);\n      dumpf(\"    type_idx:      %u\\n\",    gvar->type_idx);\n      dumpf(\"    container_idx: %u\\n\",    gvar->container_idx);\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump global variables vmap\n  //\n  DumpSubset(GlobalVariablesVMap)\n  {\n    if(lane_idx() == 0) { dumpf(\"\\n\"); }\n    U64 count = 0;\n    RDI_VMapEntry *v = rdi_table_from_name(rdi, GlobalVMap, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      dumpf(\"  {0x%I64x => %I64u}\\n\", v[idx].voff, v[idx].idx);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump thread variables\n  //\n  DumpSubset(ThreadVariables)\n  {\n    U64 count = 0;\n    RDI_ThreadVariable *v = rdi_table_from_name(rdi, ThreadVariables, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_ThreadVariable *tvar = &v[idx];\n      Temp scratch = scratch_begin(&arena, 1);\n      dumpf(\"\\n  '%S': // thread_variable[%I64u]\\n  {\\n\", str8_from_rdi_string_idx(rdi, tvar->name_string_idx), idx);\n      dumpf(\"    link_flags:    `%S`\\n\",    rdi_string_from_link_flags(scratch.arena, tvar->link_flags));\n      dumpf(\"    tls_off:       %#08x\\n\", tvar->tls_off);\n      dumpf(\"    type_idx:      %u\\n\",    tvar->type_idx);\n      dumpf(\"    container_idx: %u\\n\",    tvar->container_idx);\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump constants\n  //\n  DumpSubset(Constants)\n  {\n    U64 count = 0;\n    RDI_Constant *v = rdi_table_from_name(rdi, Constants, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_Constant *cnst = &v[idx];\n      dumpf(\"\\n  '%S': // constant[%I64u]\\n  {\\n\", str8_from_rdi_string_idx(rdi, cnst->name_string_idx), idx);\n      dumpf(\"    type_idx: %u\\n\", cnst->type_idx);\n      dumpf(\"  }\\n\");\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump procedures\n  //\n  DumpSubset(Procedures)\n  {\n    RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);\n    U64 count = 0;\n    RDI_Procedure *v = rdi_table_from_name(rdi, Procedures, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_Procedure *proc = &v[idx];\n      Temp scratch = scratch_begin(&arena, 1);\n      dumpf(\"\\n  '%S': // procedure[%I64u]\\n  {\\n\", str8_from_rdi_string_idx(rdi, proc->name_string_idx), idx);\n      dumpf(\"    link_name: '%S'\\n\", str8_from_rdi_string_idx(rdi, proc->link_name_string_idx));\n      dumpf(\"    link_flags: `%S`\\n\",   rdi_string_from_link_flags(scratch.arena, proc->link_flags));\n      dumpf(\"    type_idx: %u\\n\",   proc->type_idx);\n      dumpf(\"    root_scope_idx: %u\\n\",   proc->root_scope_idx);\n      dumpf(\"    container_idx: %u\\n\",   proc->container_idx);\n      if(proc->frame_base_location_first != 0)\n      {\n        String8List frame_base_location_strings = rdi_strings_from_locations(scratch.arena, rdi, tli->arch, r1u64(proc->frame_base_location_first, proc->frame_base_location_opl));\n        dumpf(\"    frame_base: // (first: %u, opl: %u)\\n\", proc->frame_base_location_first, proc->frame_base_location_opl);\n        dumpf(\"    {\\n\");\n        for(String8Node *n = frame_base_location_strings.first; n != 0; n = n->next)\n        {\n          dumpf(\"      %S\\n\", n->string);\n        }\n        dumpf(\"    }\\n\");\n      }\n      dumpf(\"  }\\n\");\n      scratch_end(scratch);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump scopes\n  //\n  DumpSubset(Scopes)\n  {\n    if(lane_idx() == 0) { dumpf(\"\\n\"); }\n    RDI_TopLevelInfo *tli = rdi_element_from_name_idx(rdi, TopLevelInfo, 0);\n    U64 scope_voffs_count = 0;\n    U64 *scope_voffs = rdi_table_from_name(rdi, ScopeVOffData,  &scope_voffs_count);\n    U64 locals_count = 0;\n    RDI_Local *locals = rdi_table_from_name(rdi, Locals, &locals_count);\n    U64 count = 0;\n    RDI_Scope *v = rdi_table_from_name(rdi, Scopes, &count);\n    RDI_Scope *nil = &v[0];\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      if(v[idx].parent_scope_idx != 0) { continue; }\n      RDI_Scope *root = &v[idx];\n      S64 depth = 1;\n      for(RDI_Scope *scope = root, *rec_next = nil; scope != nil; scope = rec_next)\n      {\n        // rjf: scope list(voff_range) => string\n        String8 voff_range_list_string = {0};\n        {\n          U32 voff_range_lo    = ClampTop(scope->voff_range_first, scope_voffs_count);\n          U32 voff_range_hi    = ClampTop(scope->voff_range_opl,   scope_voffs_count);\n          U32 voff_range_count = (voff_range_hi - voff_range_lo);\n          U64 *voff_ptr         = scope_voffs + voff_range_lo;\n          Temp scratch = scratch_begin(&arena, 1);\n          String8List list = {0};\n          for(U64 i = 0; i+2 <= voff_range_count; i += 2)\n          {\n            str8_list_pushf(scratch.arena, &list, \"[%#llx, %#llx)\", voff_ptr[i+0], voff_ptr[i+1]);\n          }\n          voff_range_list_string = str8_list_join(arena, &list, &(StringJoin){.sep = str8_lit(\", \")});\n          scratch_end(scratch);\n        }\n        \n        // rjf: scope procedure -> name\n        String8 procedure_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, Procedures, scope->proc_idx)->name_string_idx);\n        if(procedure_name.size == 0)\n        {\n          procedure_name = str8_lit(\"???\");\n        }\n        \n        // rjf: scope inline site -> name\n        String8 inline_site_name = str8_from_rdi_string_idx(rdi, rdi_element_from_name_idx(rdi, InlineSites, scope->inline_site_idx)->name_string_idx);\n        if(inline_site_name.size == 0)\n        {\n          inline_site_name = str8_lit(\"???\");\n        }\n        \n        // rjf: dump\n        dumpf(\"%.*s// scope[%I64u]\\n\", depth*2, indent.str, (U64)(scope - v));\n        dumpf(\"%.*s{\\n\", depth*2, indent.str);\n        dumpf(\"%.*s  proc_idx: %u // %S\\n\", depth*2, indent.str, scope->proc_idx, procedure_name);\n        dumpf(\"%.*s  first_child_scope_idx: %u\\n\", depth*2, indent.str, scope->first_child_scope_idx);\n        dumpf(\"%.*s  next_sibling_scope_idx: %u\\n\", depth*2, indent.str, scope->next_sibling_scope_idx);\n        if(scope->inline_site_idx != 0)\n        {\n          dumpf(\"%.*s  inline_site_idx: %u ('%S')\\n\", depth*2, indent.str, scope->inline_site_idx, inline_site_name);\n        }\n        dumpf(\"%.*s  voff_ranges: %S\\n\", depth*2, indent.str, voff_range_list_string);\n        dumpf(\"%.*s  locals:\\n\", depth*2, indent.str);\n        dumpf(\"%.*s  {\\n\", depth*2, indent.str);\n        {\n          U32 local_lo = ClampTop(scope->local_first, locals_count);\n          U32 local_hi = ClampTop(local_lo + scope->local_count, locals_count);\n          if(local_lo < local_hi)\n          {\n            for(U32 local_idx = local_lo; local_idx < local_hi; local_idx += 1)\n            {\n              Temp scratch = scratch_begin(&arena, 1);\n              RDI_Local *local_ptr = &locals[local_idx];\n              dumpf(\"%.*s    '%S': // local[%u]\\n\", depth*2, indent.str, str8_from_rdi_string_idx(rdi, local_ptr->name_string_idx), local_idx);\n              dumpf(\"%.*s    {\\n\", depth*2, indent.str);\n              dumpf(\"%.*s      kind: %S\\n\", depth*2, indent.str, rdi_string_from_local_kind(scratch.arena, local_ptr->kind));\n              dumpf(\"%.*s      type_idx: %u\\n\", depth*2, indent.str, local_ptr->type_idx);\n              dumpf(\"%.*s      locations:\\n\", depth*2, indent.str);\n              dumpf(\"%.*s      {\\n\", depth*2, indent.str);\n              if(local_ptr->location_first < local_ptr->location_opl)\n              {\n                String8List locations_strings = rdi_strings_from_locations(arena, rdi, tli->arch, r1u64(local_ptr->location_first, local_ptr->location_opl));\n                for(String8Node *n = locations_strings.first; n != 0; n = n->next)\n                {\n                  dumpf(\"%.*s        %S\\n\", depth*2, indent.str, n->string);\n                }\n              }\n              dumpf(\"%.*s      }\\n\", depth*2, indent.str);\n              dumpf(\"%.*s    }\\n\", depth*2, indent.str);\n              scratch_end(scratch);\n            }\n          }\n        }\n        dumpf(\"%.*s  }\\n\", depth*2, indent.str);\n        \n        // rjf: get next recursion\n        rec_next = nil;\n        if(scope->first_child_scope_idx)\n        {\n          rec_next = rdi_element_from_name_idx(rdi, Scopes, scope->first_child_scope_idx);\n          depth += 1;\n        }\n        else for(RDI_Scope *p = scope;\n                 p != nil;\n                 p = rdi_element_from_name_idx(rdi, Scopes, p->parent_scope_idx), depth -= 1)\n        {\n          dumpf(\"%.*s} // scope[/%I64u] \\n\", depth*2, indent.str, (U64)(p-v));\n          if(p->next_sibling_scope_idx != 0)\n          {\n            rec_next = rdi_element_from_name_idx(rdi, Scopes, p->next_sibling_scope_idx);\n            break;\n          }\n        }\n      }\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump scope vmap\n  //\n  DumpSubset(ScopeVMap)\n  {\n    if(lane_idx() == 0) { dumpf(\"\\n\"); }\n    U64 count = 0;\n    RDI_VMapEntry *v = rdi_table_from_name(rdi, ScopeVMap, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      dumpf(\"  {0x%I64x => %I64u}\\n\", v[idx].voff, v[idx].idx);\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump inline sites\n  //\n  DumpSubset(InlineSites)\n  {\n    U64 count = 0;\n    RDI_InlineSite *v = rdi_table_from_name(rdi, InlineSites, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_InlineSite *inline_site = &v[idx];\n      Temp scratch = scratch_begin(&arena, 1);\n      String8 inline_site_idx = push_str8f(scratch.arena, \"inline_site[%u]\",      idx);\n      String8 type_idx        = push_str8f(scratch.arena, \"type_idx: %u,\",       inline_site->type_idx);\n      String8 owner_type_idx  = push_str8f(scratch.arena, \"owner_type_idx: %u,\", inline_site->owner_type_idx);\n      String8 line_table_idx  = push_str8f(scratch.arena, \"line_table_idx: %u,\", inline_site->line_table_idx);\n      String8 name            = push_str8f(scratch.arena, \"'%S'\", str8_from_rdi_string_idx(rdi, inline_site->name_string_idx));\n      dumpf(\"\\n  { %-25S %-25S %-25S name: %-64S } // %S\",\n            type_idx,\n            owner_type_idx,\n            line_table_idx,\n            name,\n            inline_site_idx);\n      scratch_end(scratch);\n    }\n    if(lane_idx() == lane_count()-1) { dumpf(\"\\n\"); }\n  }\n  \n  //////////////////////////////\n  //- rjf: dump name maps\n  //\n  DumpSubset(NameMaps)\n  {\n    Temp scratch = scratch_begin(&arena, 1);\n    U64 count = 0;\n    RDI_NameMap *v = rdi_table_from_name(rdi, NameMaps, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      RDI_ParsedNameMap name_map = {0};\n      rdi_parsed_from_name_map(rdi, &v[idx], &name_map);\n      dumpf(\"\\n  // name_map[%I64u] (%S)\\n  {\\n\", idx, rdi_string_from_name_map_kind(idx));\n      for EachIndex(bucket_idx, name_map.bucket_count)\n      {\n        if(name_map.buckets[bucket_idx].node_count == 0) { continue; }\n        dumpf(\"    %I64u:\\n    {\\n\", bucket_idx, bucket_idx);\n        RDI_NameMapNode *node_ptr = name_map.nodes + name_map.buckets[bucket_idx].first_node;\n        RDI_NameMapNode *node_opl = node_ptr + name_map.buckets[bucket_idx].node_count;\n        for(;node_ptr < node_opl; node_ptr += 1)\n        {\n          Temp temp = temp_begin(scratch.arena);\n          String8 str = str8_from_rdi_string_idx(rdi, node_ptr->string_idx);\n          String8 indices = {0};\n          if(node_ptr->match_count == 1)\n          {\n            indices = push_str8f(temp.arena, \"%u\", node_ptr->match_idx_or_idx_run_first);\n          }\n          else\n          {\n            U32  idx_count = 0;\n            U32 *idx_array = rdi_idx_run_from_first_count(rdi, node_ptr->match_idx_or_idx_run_first, node_ptr->match_count, &idx_count);\n            String8List idx_strings = {0};\n            for(U32 idx_i = 0; idx_i < idx_count; idx_i += 1)\n            {\n              U32 idx = idx_array[idx_i];\n              str8_list_pushf(temp.arena, &idx_strings, \"%u\", idx);\n            }\n            String8 extra = push_str8f(temp.arena, \" // idx_run[%u]\", node_ptr->match_idx_or_idx_run_first);\n            indices = str8_list_join(scratch.arena, &idx_strings, &(StringJoin){.sep = str8_lit(\", \"), .post = extra});\n          }\n          dumpf(\"      \\\"%S\\\": %S\\n\", str, indices);\n          temp_end(temp);\n        }\n        dumpf(\"    }\\n\");\n      }\n      dumpf(\"  }\\n\");\n    }\n    scratch_end(scratch);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump strings\n  //\n  DumpSubset(Strings)\n  {\n    U64 count = 0;\n    U32 *v = rdi_table_from_name(rdi, StringTable, &count);\n    Rng1U64 range = lane_range(count);\n    for EachInRange(idx, range)\n    {\n      dumpf(\"\\n  \\\"%S\\\" // string[%I64u]\", str8_from_rdi_string_idx(rdi, idx), idx);\n    }\n    if(lane_idx() == lane_count()-1) { dumpf(\"\\n\"); }\n  }\n  \n  //////////////////////////////\n  //- rjf: join results\n  //\n  lane_sync();\n  if(lane_idx() == 0)\n  {\n    for EachNode(n, DumpSubsetOutputNode, first_output_node)\n    {\n      String8List subset_strings = {0};\n      for EachIndex(idx, lane_count())\n      {\n        str8_list_concat_in_place(&subset_strings, &n->lane_strings[idx]);\n      }\n      if(subset_strings.total_size != 0)\n      {\n        str8_list_pushf(arena, &result_strings, \"////////////////////////////////\\n//~ %S\\n\\n%S:\\n{\", rdi_name_title_from_dump_subset_table[n->subset], rdi_name_lowercase_from_dump_subset_table[n->subset]);\n        str8_list_concat_in_place(&result_strings, &subset_strings);\n        str8_list_pushf(arena, &result_strings, \"}\\n\\n\");\n      }\n    }\n  }\n  lane_sync();\n  \n#undef DumpSubset\n#undef dumpf\n#undef dump\n  scratch_end(scratch);\n  ProfEnd();\n  return result_strings;\n}\n"
  },
  {
    "path": "src/rdi/rdi_local.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RDI_FORMAT_LOCAL_H\n#define RDI_FORMAT_LOCAL_H\n\n#include \"lib_rdi/rdi.h\"\n#include \"lib_rdi/rdi_parse.h\"\n\n////////////////////////////////\n//~ rjf: RDI Dumping Flags\n\n#define RDI_DumpSubset_XList \\\nX(DataSections,        data_sections,               \"DATA SECTIONS\")\\\nX(TopLevelInfo,        top_level_info,              \"TOP LEVEL INFO\")\\\nX(BinarySections,      binary_sections,             \"BINARY SECTIONS\")\\\nX(FilePaths,           file_paths,                  \"FILE PATHS\")\\\nX(SourceFiles,         source_files,                \"SOURCE FILES\")\\\nX(LineTables,          line_tables,                 \"LINE TABLES\")\\\nX(SourceLineMaps,      source_line_maps,            \"SOURCE LINE MAPS\")\\\nX(Units,               units,                       \"UNITS\")\\\nX(UnitVMap,            unit_vmap,                   \"UNIT VMAP\")\\\nX(TypeNodes,           type_nodes,                  \"TYPE NODES\")\\\nX(UserDefinedTypes,    user_defined_types,          \"USER DEFINED TYPES\")\\\nX(GlobalVariables,     global_variables,            \"GLOBAL VARIABLES\")\\\nX(GlobalVariablesVMap, global_variables_vmap,       \"GLOBAL VARIABLE VMAP\")\\\nX(ThreadVariables,     thread_variables,            \"THREAD VARIABLES\")\\\nX(Constants,           constants,                   \"CONSTANTS\")\\\nX(Procedures,          procedures,                  \"PROCEDURES\")\\\nX(Scopes,              scopes,                      \"SCOPES\")\\\nX(ScopeVMap,           scope_vmap,                  \"SCOPE VMAP\")\\\nX(InlineSites,         inline_sites,                \"INLINE SITES\")\\\nX(NameMaps,            name_maps,                   \"NAME MAPS\")\\\nX(Strings,             strings,                     \"STRINGS\")\\\n\ntypedef enum RDI_DumpSubset\n{\n#define X(name, name_lower, title) RDI_DumpSubset_##name,\n  RDI_DumpSubset_XList\n#undef X\n}\nRDI_DumpSubset;\n\ntypedef U32 RDI_DumpSubsetFlags;\nenum\n{\n#define X(name, name_lower, title) RDI_DumpSubsetFlag_##name = (1<<RDI_DumpSubset_##name),\n  RDI_DumpSubset_XList\n#undef X\n  RDI_DumpSubsetFlag_All = 0xffffffffu,\n};\n\nread_only global String8 rdi_name_lowercase_from_dump_subset_table[] =\n{\n#define X(name, name_lower, title) str8_lit_comp(#name_lower),\n  RDI_DumpSubset_XList\n#undef X\n};\n\nread_only global String8 rdi_name_title_from_dump_subset_table[] =\n{\n#define X(name, name_lower, title) str8_lit_comp(title),\n  RDI_DumpSubset_XList\n#undef X\n};\n\n////////////////////////////////\n//~ rjf: RDI Enum <=> Base Enum\n\ninternal Arch arch_from_rdi_arch(RDI_Arch arch);\n\n////////////////////////////////\n//~ rjf: Lookup Helpers\n\ninternal String8 str8_from_rdi_string_idx(RDI_Parsed *rdi, U32 idx);\n\n////////////////////////////////\n//~ rjf: String <=> Enum\n\ninternal String8 rdi_string_from_data_section_kind(Arena *arena, RDI_SectionKind v);\ninternal String8 rdi_string_from_arch             (Arena *arena, RDI_Arch        v);\ninternal String8 rdi_string_from_language         (Arena *arena, RDI_Language    v);\ninternal String8 rdi_string_from_local_kind       (Arena *arena, RDI_LocalKind   v);\n#if 0 // TODO(rjf): conflicts with RDI...\ninternal String8 rdi_string_from_type_kind        (Arena *arena, RDI_TypeKind    v);\n#endif\ninternal String8 rdi_string_from_member_kind      (Arena *arena, RDI_MemberKind  v);\ninternal String8 rdi_string_from_name_map_kind(RDI_NameMapKind kind);\n\ninternal String8 rdi_string_from_binary_section_flags(Arena *arena, RDI_BinarySectionFlags flags);\ninternal String8 rdi_string_from_type_modifier       (Arena *arena, RDI_TypeModifierFlags  flags);\ninternal String8 rdi_string_from_udt_flags           (Arena *arena, RDI_UDTFlags           flags);\ninternal String8 rdi_string_from_link_flags          (Arena *arena, RDI_LinkFlags          flags);\ninternal String8 rdi_string_from_bytecode(Arena *arena, RDI_Arch arch, String8 bc);\ninternal String8List rdi_strings_from_locations(Arena *arena, RDI_Parsed *rdi, RDI_Arch arch, Rng1U64 location_block_range);\n\n////////////////////////////////\n//~ rjf: RDI Dumping\n\ninternal String8List rdi_dump_list_from_parsed(Arena *arena, RDI_Parsed *rdi, RDI_DumpSubsetFlags flags);\n\n#endif // RDI_FORMAT_LOCAL_H\n"
  },
  {
    "path": "src/rdi_from_coff/rdi_from_coff.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal RDI_Arch\r\nc2r_rdi_arch_from_coff_machine(COFF_MachineType machine)\r\n{\r\n  switch (machine) {\r\n    case COFF_MachineType_X86: return RDI_Arch_X86;\r\n    case COFF_MachineType_X64: return RDI_Arch_X64;\r\n    \r\n    case COFF_MachineType_Unknown:\r\n    case COFF_MachineType_Am33:\r\n    case COFF_MachineType_Arm:\r\n    case COFF_MachineType_Arm64:\r\n    case COFF_MachineType_ArmNt:\r\n    case COFF_MachineType_Ebc:\r\n    case COFF_MachineType_Ia64:\r\n    case COFF_MachineType_M32R:\r\n    case COFF_MachineType_Mips16:\r\n    case COFF_MachineType_MipsFpu:\r\n    case COFF_MachineType_MipsFpu16:\r\n    case COFF_MachineType_PowerPc:\r\n    case COFF_MachineType_PowerPcFp:\r\n    case COFF_MachineType_R4000:\r\n    case COFF_MachineType_RiscV32:\r\n    case COFF_MachineType_RiscV64:\r\n    case COFF_MachineType_Sh3:\r\n    case COFF_MachineType_Sh3Dsp:\r\n    case COFF_MachineType_Sh4:\r\n    case COFF_MachineType_Sh5:\r\n    case COFF_MachineType_Thumb:\r\n    case COFF_MachineType_WceMipsV2:\r\n    NotImplemented;\r\n    default:\r\n    return RDI_Arch_NULL;\r\n  }\r\n}\r\n\r\ninternal RDI_BinarySectionFlags\r\nc2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags)\r\n{\r\n  RDI_BinarySectionFlags result = 0;\r\n  if(flags & COFF_SectionFlag_MemRead)\r\n  {\r\n    result |= RDI_BinarySectionFlag_Read;\r\n  }\r\n  if(flags & COFF_SectionFlag_MemWrite)\r\n  {\r\n    result |= RDI_BinarySectionFlag_Write;\r\n  }\r\n  if(flags & COFF_SectionFlag_MemExecute)\r\n  {\r\n    result |= RDI_BinarySectionFlag_Execute;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal RDIM_BinarySectionList\r\nc2r_rdi_binary_sections_from_coff_sections(Arena *arena, String8 image_data, String8 string_table, U64 sectab_count, COFF_SectionHeader *sectab)\r\n{\r\n  RDIM_BinarySectionList binary_sections = {0};\r\n  for EachIndex(idx, sectab_count)\r\n  {\r\n    COFF_SectionHeader *coff_sec = &sectab[idx];\r\n    RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections);\r\n    sec->name       = coff_name_from_section_header(string_table, coff_sec);\r\n    sec->flags      = c2r_rdi_binary_section_flags_from_coff_section_flags(coff_sec->flags);\r\n    sec->voff_first = coff_sec->voff;\r\n    sec->voff_opl   = coff_sec->voff + coff_sec->vsize;\r\n    sec->foff_first = coff_sec->foff;\r\n    sec->foff_opl   = coff_sec->foff + coff_sec->fsize;\r\n  }\r\n  return binary_sections;\r\n}\r\n"
  },
  {
    "path": "src/rdi_from_coff/rdi_from_coff.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RDI_FROM_COFF_H\r\n#define RDI_FROM_COFF_H\r\n\r\ninternal RDI_Arch               c2r_rdi_arch_from_coff_machine(COFF_MachineType machine);\r\ninternal RDI_BinarySectionFlags c2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags);\r\ninternal RDIM_BinarySectionList c2r_rdi_binary_sections_from_coff_sections(Arena *arena, String8 image_data, String8 string_table, U64 sectab_count, COFF_SectionHeader *sectab);\r\n\r\n#endif // RDI_FROM_COFF_H\r\n"
  },
  {
    "path": "src/rdi_from_dwarf/rdi_from_dwarf.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n// TODO:\r\n//\r\n// [ ] Currently converter relies on clang's -gdwarf-aranges to generate compile unit ranges,\r\n//     however it is optional and in case it is missing converter has to generate the ranges from scopes.\r\n// [ ] Error handling\r\n\r\n////////////////////////////////\r\n\r\nstatic const U64 UNIT_CHUNK_CAP        = 256;\r\nstatic const U64 UDT_CHUNK_CAP         = 256;\r\nstatic const U64 TYPE_CHUNK_CAP        = 256;\r\nstatic const U64 SRC_FILE_CAP          = 256;\r\nstatic const U64 LINE_TABLE_CAP        = 256;\r\nstatic const U64 LOCATIONS_CAP         = 256;\r\nstatic const U64 GVAR_CHUNK_CAP        = 256;\r\nstatic const U64 TVAR_CHUNK_CAP        = 256;\r\nstatic const U64 PROC_CHUNK_CAP        = 256;\r\nstatic const U64 SCOPE_CHUNK_CAP       = 256;\r\nstatic const U64 INLINE_SITE_CHUNK_CAP = 256;\r\n\r\nRDIM_TopLevelInfo        top_level_info  = {0};\r\nRDIM_BinarySectionList   binary_sections = {0};\r\nRDIM_UnitChunkList       units           = {0};\r\nRDIM_UDTChunkList        udts            = {0};\r\nRDIM_TypeChunkList       types           = {0};\r\nRDIM_SrcFileChunkList    src_files       = {0};\r\nRDIM_LineTableChunkList  line_tables     = {0};\r\nRDIM_LocationChunkList   locations       = {0};\r\nRDIM_SymbolChunkList     gvars           = {0};\r\nRDIM_SymbolChunkList     tvars           = {0};\r\nRDIM_SymbolChunkList     procs           = {0};\r\nRDIM_ScopeChunkList      scopes          = {0};\r\nRDIM_InlineSiteChunkList inline_sites    = {0};\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum Conversion Helpers\r\n\r\ninternal RDI_Language\r\nd2r_rdi_language_from_dw_language(DW_Language v)\r\n{\r\n  RDI_Language result = RDI_Language_NULL;\r\n  switch(v)\r\n  {\r\n    default:{}break;\r\n    case DW_Language_C89:\r\n    case DW_Language_C99:\r\n    case DW_Language_C11:\r\n    case DW_Language_C:\r\n    {\r\n      result = RDI_Language_C;\r\n    }break;\r\n    case DW_Language_CPlusPlus03:\r\n    case DW_Language_CPlusPlus11:\r\n    case DW_Language_CPlusPlus14:\r\n    case DW_Language_CPlusPlus:\r\n    {\r\n      result = RDI_Language_CPlusPlus;\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RDI_RegCodeX86\r\nd2r_rdi_reg_code_from_dw_reg_x86(DW_RegX86 v)\r\n{\r\n  RDI_RegCodeX86 result = RDI_RegCode_nil;\r\n  switch(v)\r\n  {\r\n    default:{}break;\r\n#define X(reg_dw, val_dw, reg_rdi, ...) case DW_RegX86_##reg_dw:{result = RDI_RegCodeX86_##reg_rdi;}break;\r\n    DW_Regs_X86_XList(X)\r\n#undef X\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RDI_RegCodeX64\r\nd2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v)\r\n{\r\n  RDI_RegCodeX64 result = RDI_RegCode_nil;\r\n  switch(v)\r\n  {\r\n    default:{}break;\r\n#define X(reg_dw, val_dw, reg_rdi, off, size) case DW_RegX64_##reg_dw:{result = RDI_RegCodeX64_##reg_rdi;}break;\r\n    DW_Regs_X64_XList(X)\r\n#undef X\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RDI_RegCode\r\nd2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v)\r\n{\r\n  RDI_RegCode result = RDI_RegCode_nil;\r\n  switch(arch)\r\n  {\r\n    default:\r\n    case Arch_Null:\r\n    {}break;\r\n    case Arch_x86:{result = d2r_rdi_reg_code_from_dw_reg_x86(v);}break;\r\n    case Arch_x64:{result = d2r_rdi_reg_code_from_dw_reg_x64(v);}break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Conversion Helpers\r\n\r\ninternal RDIM_Type *\r\nd2r_create_type(Arena *arena, D2R_TypeTable *type_table)\r\n{\r\n  RDIM_Type *type = rdim_type_chunk_list_push(arena, type_table->types, type_table->type_chunk_cap);\r\n  return type;\r\n}\r\n\r\ninternal RDIM_Type *\r\nd2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off)\r\n{\r\n  RDIM_Type *type = d2r_create_type(arena, type_table);\r\n  Assert(hash_table_search_u64_raw(type_table->ht, info_off) == 0);\r\n  hash_table_push_u64_raw(arena, type_table->ht, info_off, type);\r\n  return type;\r\n}\r\n\r\ninternal RDIM_Type *\r\nd2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off)\r\n{\r\n  RDIM_Type *type = hash_table_search_u64_raw(type_table->ht, info_off);\r\n  if (type == 0) {\r\n    type = type_table->builtin_types[RDI_TypeKind_NULL];\r\n  }\r\n  return type;\r\n}\r\n\r\ninternal RDIM_Type *\r\nd2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind)\r\n{\r\n  RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void];\r\n  \r\n  // find attrib\r\n  DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind);\r\n  \r\n  // does tag have this attribute?\r\n  if (attrib->attrib_kind == kind) {\r\n    DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\r\n    \r\n    if (value_class == DW_AttribClass_Reference) {\r\n      // resolve reference\r\n      DW_Reference ref = dw_ref_from_attrib(input, cu, attrib);\r\n      \r\n      // TODO: support for external compile unit references\r\n      AssertAlways(ref.cu == cu);\r\n      \r\n      // find type\r\n      type = d2r_type_from_offset(type_table, ref.info_off);\r\n    } else {\r\n      Assert(!\"unexpected attrib class\");\r\n    }\r\n  }\r\n  \r\n  return type;\r\n}\r\n\r\ninternal Rng1U64List\r\nd2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag)\r\n{\r\n  // collect non-contiguous range\r\n  Rng1U64List raw_ranges = dw_rnglist_from_tag_attrib_kind(arena, input, cu, tag, DW_AttribKind_Ranges);\r\n  \r\n  // exclude invalid ranges caused by linker optimizations\r\n  Rng1U64List ranges = {0};\r\n  for (Rng1U64Node *n = raw_ranges.first, *next = 0; n != 0; n = next) {\r\n    next = n->next;\r\n    if (n->v.min < image_base || n->v.min > n->v.max) {\r\n      continue;\r\n    }\r\n    rng1u64_list_push_node(&ranges, n);\r\n  }\r\n  \r\n  // debase ranges\r\n  for EachNode(r, Rng1U64Node, ranges.first) {\r\n    r->v.min -= image_base;\r\n    r->v.max -= image_base;\r\n  }\r\n  \r\n  // collect contiguous range\r\n  {\r\n    DW_Attrib *lo_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_LowPc);\r\n    DW_Attrib *hi_pc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_HighPc);\r\n    if (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) {\r\n      U64 lo_pc = dw_address_from_attrib(input, cu, lo_pc_attrib);\r\n      \r\n      U64 hi_pc = 0;\r\n      DW_AttribClass hi_pc_class = dw_value_class_from_attrib(cu, hi_pc_attrib);\r\n      if (hi_pc_class == DW_AttribClass_Address) {\r\n        hi_pc = dw_address_from_attrib(input, cu, hi_pc_attrib);\r\n      } else if (hi_pc_class == DW_AttribClass_Const) {\r\n        hi_pc = dw_const_u64_from_attrib(input, cu, hi_pc_attrib);\r\n        hi_pc += lo_pc;\r\n      } else {\r\n        AssertAlways(!\"unexpected attribute encoding\");\r\n      }\r\n      \r\n      if (lo_pc >= image_base && hi_pc >= image_base) {\r\n        if (lo_pc < hi_pc) {\r\n          rng1u64_list_push(arena, &ranges, rng_1u64(lo_pc - image_base, hi_pc - image_base));\r\n        } else {\r\n          // TODO: error handling\r\n        }\r\n      } else {\r\n        // invalid low and hi PC are likely are caused by an optimization pass during linking\r\n      }\r\n    } else if ((lo_pc_attrib->attrib_kind == DW_AttribKind_Null && hi_pc_attrib->attrib_kind != DW_AttribKind_Null) ||\r\n               (lo_pc_attrib->attrib_kind != DW_AttribKind_Null && hi_pc_attrib->attrib_kind == DW_AttribKind_Null)) {\r\n      // TODO: error handling\r\n    }\r\n  }\r\n  \r\n  return ranges;\r\n}\r\n\r\ninternal RDIM_Type **\r\nd2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  RDIM_TypeList list = {0};\r\n  B32 has_vargs = 0;\r\n  for (DW_TagNode *i = cur_node->first_child; i != 0; i = i->sibling) {\r\n    if (i->tag.kind == DW_TagKind_FormalParameter) {\r\n      RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1);\r\n      n->v             = d2r_type_from_attrib(type_table, input, cu, i->tag, DW_AttribKind_Type);\r\n      SLLQueuePush(list.first, list.last, n);\r\n      ++list.count;\r\n    } else if (i->tag.kind == DW_TagKind_UnspecifiedParameters) {\r\n      has_vargs = 1;\r\n    }\r\n  }\r\n  \r\n  if (has_vargs) {\r\n    RDIM_TypeNode *n = push_array(scratch.arena, RDIM_TypeNode, 1);\r\n    n->v = type_table->builtin_types[RDI_TypeKind_Variadic];\r\n    SLLQueuePush(list.first, list.last, n);\r\n    ++list.count;\r\n  }\r\n  \r\n  // collect params\r\n  *param_count_out  = list.count;\r\n  RDIM_Type **params = rdim_array_from_type_list(arena, list);\r\n  \r\n  scratch_end(scratch);\r\n  return params;\r\n}\r\n\r\n////////////////////////////////\r\n//~ RDIM Bytecode Helpers\r\n\r\ninternal B32\r\nrdim_is_eval_bytecode_static(RDIM_EvalBytecode bc)\r\n{\r\n  B32 is_static = 1;\r\n  RDI_EvalOp dynamic_ops[] = { RDI_EvalOp_MemRead, RDI_EvalOp_RegRead, RDI_EvalOp_RegReadDyn, RDI_EvalOp_CFA };\r\n  for EachNode(n, RDIM_EvalBytecodeOp, bc.first_op) {\r\n    for EachIndex(i, ArrayCount(dynamic_ops)) {\r\n      if (dynamic_ops[i] == n->op) {\r\n        is_static = 0;\r\n        goto exit;\r\n      }\r\n    }\r\n  }\r\n  exit:;\r\n  return is_static;\r\n}\r\n\r\ninternal U64\r\nrdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base)\r\n{\r\n  Temp scratch = scratch_begin(0,0);\r\n  \r\n  typedef union { U16 u16; U32 u32; U64 u64; S64 s64; F32 f32; F64 f64; } Value;\r\n  U64 stack_cap = 128, stack_count = 0;\r\n  Value *stack = push_array(scratch.arena, Value, stack_cap);\r\n  \r\n  for EachNode(opcode_n, RDIM_EvalBytecodeOp, bc.first_op) {\r\n    // pop values from stack\r\n    Value *svals = 0;\r\n    {\r\n      U32 pop_count = RDI_POPN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]);\r\n      if (pop_count > stack_count) {\r\n        // TODO: report error\r\n        Assert(!\"malformed byte code\");\r\n        break;\r\n      }\r\n      stack_count -= pop_count;\r\n      svals = stack + stack_count;\r\n    }\r\n    \r\n    Value imm = { .u64 = opcode_n->p };\r\n    Value nval = {0};\r\n    switch (opcode_n->op) {\r\n      case RDI_EvalOp_Stop: { opcode_n = bc.last_op; } break;\r\n      case RDI_EvalOp_Noop: {} break;\r\n      case RDI_EvalOp_Cond:       { NotImplemented; } break;\r\n      case RDI_EvalOp_Skip: {\r\n        NotImplemented;\r\n      } break;\r\n      case RDI_EvalOp_MemRead:    { InvalidPath;    } break;\r\n      case RDI_EvalOp_RegRead:    { NotImplemented; } break;\r\n      case RDI_EvalOp_RegReadDyn: { NotImplemented; } break;\r\n      case RDI_EvalOp_FrameOff:   { NotImplemented; } break;\r\n      case RDI_EvalOp_ModuleOff: {\r\n        nval.u64 = image_base + imm.u64;\r\n      } break;\r\n      case RDI_EvalOp_TLSOff: {\r\n        nval.u64 = image_base;\r\n      } break;\r\n      case RDI_EvalOp_ConstU8:\r\n      case RDI_EvalOp_ConstU16:\r\n      case RDI_EvalOp_ConstU32:\r\n      case RDI_EvalOp_ConstU64:\r\n      case RDI_EvalOp_ConstU128: {\r\n        nval = imm;\r\n      } break;\r\n      case RDI_EvalOp_ConstString: { NotImplemented; } break;\r\n      case RDI_EvalOp_Abs: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = abs_s64(svals[0].s64); } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = abs_f32(svals[0].f32); } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = abs_f64(svals[0].f64); } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Neg: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:\r\n          case RDI_EvalTypeGroup_S:   { nval.u64 = ~svals[0].u64 + 1; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = -svals[0].f32;     } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = -svals[0].f64;     } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Add: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 + svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 + svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 + svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 + svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Sub: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 - svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[1].s64 - svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 - svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 - svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Mul: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 * svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 * svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 * svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 * svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Div: {\r\n        B32 is_div_by_zero = 0;\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { is_div_by_zero = svals[1].u64 == 0;    } break;\r\n          case RDI_EvalTypeGroup_S:   { is_div_by_zero = svals[1].s64 == 0;    } break;\r\n          case RDI_EvalTypeGroup_F32: { is_div_by_zero = svals[1].f32 == 0.0f; } break;\r\n          case RDI_EvalTypeGroup_F64: { is_div_by_zero = svals[1].f64 == 0.0;  } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n        \r\n        // TODO: report error\r\n        AssertAlways(!is_div_by_zero);\r\n        \r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 / svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 / svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 / svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 / svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Mod: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 % svals[1].u64;    } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 % svals[1].s64;    } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 MOD is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 MOD is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_LShift: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 << svals[1].u64;      } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 << svals[1].u64;      } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 LShift is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 LShift is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_RShift: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 >> svals[1].u64;      } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[1].s64 >> svals[1].u64;      } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 RShift is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 RShift is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_BitAnd: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 | svals[1].u64;            } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].u64 | svals[1].s64;            } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 bitwise AND is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 bitwise AND is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_BitXor: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 ^ svals[1].u64;    } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].u64 ^ svals[1].s64;    } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 XOR is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 XOR is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_BitNot: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = ~svals[0].u64;                          } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = ~svals[0].u64;                          } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 bitwise NOT is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 bitwise NOT is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_LogAnd: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 && svals[1].u64;   } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].u64 && svals[1].s64;   } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 AND is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 AND is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_LogOr: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 || svals[1].u64;  } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].u64 || svals[1].s64;  } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 OR is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 OR is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_LogNot: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = !svals[0].u64;                  } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = !svals[0].u64;                  } break;\r\n          case RDI_EvalTypeGroup_F32: { AssertAlways(!\"F32 NOT is not supported\"); } break; // TODO: report error\r\n          case RDI_EvalTypeGroup_F64: { AssertAlways(!\"F64 NOT is not supported\"); } break; // TODO: report error\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_EqEq: {\r\n        nval.u64 = !!MemoryMatch(&svals[0], &svals[1], sizeof(*svals));\r\n      } break;\r\n      case RDI_EvalOp_NtEq: {\r\n        nval.u64 = !MemoryMatch(&svals[0], &svals[1], sizeof(*svals));\r\n      } break;\r\n      case RDI_EvalOp_LsEq: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 <= svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 <= svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 <= svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 <= svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_GrEq: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 >= svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 >= svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 >= svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 >= svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Less: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 < svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 < svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 < svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 < svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Grtr: {\r\n        switch (imm.u64) {\r\n          case RDI_EvalTypeGroup_Other: {} break;\r\n          case RDI_EvalTypeGroup_U:   { nval.u64 = svals[0].u64 > svals[1].u64; } break;\r\n          case RDI_EvalTypeGroup_S:   { nval.s64 = svals[0].s64 > svals[1].s64; } break;\r\n          case RDI_EvalTypeGroup_F32: { nval.f32 = svals[0].f32 > svals[1].f32; } break;\r\n          case RDI_EvalTypeGroup_F64: { nval.f64 = svals[0].f64 > svals[1].f64; } break;\r\n          default: { AssertAlways(!\"unexpected eval type group\"); } break; // report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Trunc: {\r\n        if (0 < imm.u64 && imm.u64 < 64) {\r\n          U64 mask = max_U64 >> (64 - imm.u64);\r\n          nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64));\r\n        } else if (imm.u64 > 64) {\r\n          // TODO: report error\r\n          AssertAlways(!\"malformed bytecode\");\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_TruncSigned: {\r\n        if (0 < imm.u64 && imm.u64 < 64) {\r\n          U64 mask = max_U64 >> (64 - imm.u64);\r\n          nval.u64 = svals[0].u64 & (max_U64 >> (64 - imm.u64));\r\n          U64 high = 0;\r\n          if (svals[0].u64 & (1 << (imm.u64 - 1))) {\r\n            high = ~mask;\r\n          }\r\n          nval.u64 = high | (svals[0].u64 & mask);\r\n        } else if (imm.u64 > 64) {\r\n          // TODO: report error\r\n          AssertAlways(!\"malformed bytecode\");\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Convert: {\r\n        U32 in  = imm.u64 & 0xff;\r\n        U32 out = (imm.u64 >> 8) & 0xff;\r\n        if (in != out) {\r\n          switch (in + out*RDI_EvalTypeGroup_COUNT) {\r\n            case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT:   { nval.u64 = (U64)svals[0].f32; } break;\r\n            case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_U*RDI_EvalTypeGroup_COUNT:   { nval.u64 = (U64)svals[0].f64; } break;\r\n            case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT:   { nval.s64 = (S64)svals[0].f32; } break;\r\n            case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_S*RDI_EvalTypeGroup_COUNT:   { nval.s64 = (S64)svals[0].f64; } break;\r\n            case RDI_EvalTypeGroup_U   + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].u64; } break;\r\n            case RDI_EvalTypeGroup_S   + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].s64; } break;\r\n            case RDI_EvalTypeGroup_F64 + RDI_EvalTypeGroup_F32*RDI_EvalTypeGroup_COUNT: { nval.f32 = (F32)svals[0].f64; } break;\r\n            case RDI_EvalTypeGroup_U   + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].u64; } break;\r\n            case RDI_EvalTypeGroup_S   + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].s64; } break;\r\n            case RDI_EvalTypeGroup_F32 + RDI_EvalTypeGroup_F64*RDI_EvalTypeGroup_COUNT: { nval.f64 = (F64)svals[0].f32; } break;\r\n            default: { Assert(!\"unexpected conversion case\"); } break; // report error\r\n          }\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Pick: {\r\n        if (stack_count > imm.u64) {\r\n          nval = stack[stack_count - imm.u64 - 1];\r\n        } else {\r\n          // TODO: report error\r\n          AssertAlways(!\"malformed bytecode\");\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Pop: {} break;\r\n      case RDI_EvalOp_Insert: {\r\n        if (stack_count > imm.u64) {\r\n          Value tval = stack[stack_count-1];\r\n          Value *dst = stack + stack_count - 1 - imm.u64;\r\n          Value *shift = dst + 1;\r\n          MemoryCopy(shift, dst, imm.u64 * sizeof(Value));\r\n          *dst = tval;\r\n        } else {\r\n          // TODO: report error\r\n          AssertAlways(!\"malformed bytecode\");\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_ValueRead: {\r\n        U64 bytes_to_read = imm.u64;\r\n        U64 offset        = svals[0].u64;\r\n        if (offset + bytes_to_read <= sizeof(Value)) {\r\n          Value src_val = svals[1];\r\n          MemoryCopy(&nval, (U8 *)&src_val + offset, bytes_to_read);\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_ByteSwap: {\r\n        switch (imm.u64) {\r\n          case 0: {} break;\r\n          case 1: {} break;\r\n          case 2: { nval.u16 = bswap_u16(svals[0].u16); } break;\r\n          case 4: { nval.u32 = bswap_u16(svals[0].u32); } break;\r\n          case 8: { nval.u64 = bswap_u16(svals[0].u64); } break;\r\n          default: { AssertAlways(!\"malformed bytecode\"); } break; // TODO: report error\r\n        }\r\n      } break;\r\n      case RDI_EvalOp_Swap: {\r\n        NotImplemented;\r\n      } break;\r\n      default: { Assert(!\"unknown op type\"); } break;\r\n    }\r\n    \r\n    // push computed value to the stack\r\n    {\r\n      U64 push_count = RDI_PUSHN_FROM_CTRLBITS(rdi_eval_op_ctrlbits_table[opcode_n->op]);\r\n      if (push_count == 1) {\r\n        if (stack_count < stack_cap) {\r\n          stack[stack_count] = nval;\r\n          stack_count += 1;\r\n        } else {\r\n          AssertAlways(!\"stack overflow\"); // TODO: report error\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  U64 result = 0;\r\n  if (stack_count >= 1) {\r\n    result = stack[0].u64 - image_base;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Bytecode Conversion Helpers\r\n\r\ninternal D2R_ValueTypeNode *\r\nd2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type)\r\n{\r\n  D2R_ValueTypeNode *n;\r\n  if (stack->free_list) {\r\n    n = stack->free_list;\r\n    SLLStackPop(stack->free_list);\r\n  } else {\r\n    n = push_array(arena, D2R_ValueTypeNode, 1);\r\n  }\r\n  n->type = type;\r\n  SLLStackPush(stack->top, n);\r\n  stack->count += 1;\r\n  return n;\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_value_type_stack_pop(D2R_ValueTypeStack *stack)\r\n{\r\n  D2R_ValueType result = D2R_ValueType_Generic;\r\n  if (stack->top) {\r\n    D2R_ValueTypeNode *n = stack->top;\r\n    result = n->type;\r\n    SLLStackPop(stack->top);\r\n    SLLStackPush(stack->free_list, n);\r\n    stack->count -= 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_value_type_stack_peek(D2R_ValueTypeStack *stack)\r\n{\r\n  return stack->top ? stack->top->type : D2R_ValueType_Generic;\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_unsigned_value_type_from_bit_size(U64 bit_size)\r\n{\r\n  switch (bit_size) {\r\n    case 8:   return D2R_ValueType_U8;\r\n    case 16:  return D2R_ValueType_U16;\r\n    case 32:  return D2R_ValueType_U32;\r\n    case 64:  return D2R_ValueType_U64;\r\n    case 128: return D2R_ValueType_U128;\r\n    case 256: return D2R_ValueType_U256;\r\n    case 512: return D2R_ValueType_U512;\r\n  }\r\n  AssertAlways(!\"no suitable unsigned type was found for the specified size\");\r\n  return D2R_ValueType_Generic;\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_signed_value_type_from_bit_size(U64 bit_size)\r\n{\r\n  switch (bit_size) {\r\n    case 8:   return D2R_ValueType_S8;\r\n    case 16:  return D2R_ValueType_S16;\r\n    case 32:  return D2R_ValueType_S32;\r\n    case 64:  return D2R_ValueType_S64;\r\n    case 128: return D2R_ValueType_S128;\r\n    case 256: return D2R_ValueType_S256;\r\n    case 512: return D2R_ValueType_S512;\r\n  }\r\n  AssertAlways(!\"no suitable signed type was found for the specified size\");\r\n  return D2R_ValueType_Generic;\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_float_type_from_bit_size(U64 bit_size)\r\n{\r\n  switch (bit_size) {\r\n    case 4: return D2R_ValueType_F32;\r\n    case 8: return D2R_ValueType_F64;\r\n  }\r\n  AssertAlways(!\"no suitable type was found for the specified size\");\r\n  return D2R_ValueType_Generic;\r\n}\r\n\r\ninternal RDI_EvalTypeGroup\r\nd2r_value_type_to_rdi(D2R_ValueType v)\r\n{\r\n  RDI_EvalTypeGroup result = RDI_EvalTypeGroup_Other;\r\n  switch(v)\r\n  {\r\n    case D2R_ValueType_Generic:\r\n    {result = RDI_EvalTypeGroup_Other;}break;\r\n    case D2R_ValueType_U8:\r\n    case D2R_ValueType_U16:\r\n    case D2R_ValueType_U32:\r\n    case D2R_ValueType_U64:\r\n    {result = RDI_EvalTypeGroup_U;}break;\r\n    case D2R_ValueType_S8:\r\n    case D2R_ValueType_S16:\r\n    case D2R_ValueType_S32:\r\n    case D2R_ValueType_S64:\r\n    {result = RDI_EvalTypeGroup_S;}break;\r\n    case D2R_ValueType_F32:\r\n    {result = RDI_EvalTypeGroup_F32;}break;\r\n    case D2R_ValueType_F64:\r\n    {result = RDI_EvalTypeGroup_F64;}break;\r\n    case D2R_ValueType_Address:\r\n    {result = RDI_EvalTypeGroup_U;}break;\r\n    default:\r\n    case D2R_ValueType_ImplicitValue:\r\n    {AssertAlways(!\"unable to convert value type to RDI equivalent\");}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nd2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type)\r\n{\r\n  switch (value_type) {\r\n    case D2R_ValueType_Address: return addr_size;\r\n    case D2R_ValueType_U8:   return 1;\r\n    case D2R_ValueType_U16:  return 2;\r\n    case D2R_ValueType_U32:  return 4;\r\n    case D2R_ValueType_U64:  return 8;\r\n    case D2R_ValueType_U128: return 16;\r\n    case D2R_ValueType_U256: return 32;\r\n    case D2R_ValueType_U512: return 64;\r\n    case D2R_ValueType_S8:   return 1;\r\n    case D2R_ValueType_S16:  return 2;\r\n    case D2R_ValueType_S32:  return 4;\r\n    case D2R_ValueType_S64:  return 8;\r\n    case D2R_ValueType_S128: return 16;\r\n    case D2R_ValueType_S256: return 32;\r\n    case D2R_ValueType_S512: return 64;\r\n    case D2R_ValueType_F32:  return 4;\r\n    case D2R_ValueType_F64:  return 8;\r\n    default: return 0;\r\n  }\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs)\r\n{\r\n  if (lhs == rhs) {\r\n    return lhs;\r\n  }\r\n  // unsigned vs unsigned\r\n  else if (D2R_ValueType_IsUnsigned(lhs) && D2R_ValueType_IsUnsigned(rhs)) {\r\n    return Max(lhs, rhs);\r\n  }\r\n  // signed vs signed\r\n  else if (D2R_ValueType_IsSigned(lhs) && D2R_ValueType_IsSigned(rhs)) {\r\n    return Max(lhs, rhs);\r\n  }\r\n  // (unsigned vs signed) || (signed vs unsigned)\r\n  else if ((D2R_ValueType_IsUnsigned(lhs) && D2R_ValueType_IsSigned(rhs)) ||\r\n           (D2R_ValueType_IsSigned(lhs) && D2R_ValueType_IsUnsigned(rhs))) {\r\n    U64 lhs_size = d2r_size_from_value_type(0, lhs);\r\n    U64 rhs_size = d2r_size_from_value_type(0, rhs);\r\n    if (lhs_size < rhs_size) {\r\n      return rhs;\r\n    } else if (lhs > rhs_size) {\r\n      return lhs;\r\n    } else {\r\n      return d2r_unsigned_value_type_from_bit_size(lhs_size * 8);\r\n    }\r\n  }\r\n  // float vs int\r\n  else if (D2R_ValueType_IsFloat(lhs) && D2R_ValueType_IsInt(rhs)) {\r\n    return lhs;\r\n  }\r\n  // int vs float\r\n  else if (D2R_ValueType_IsInt(lhs) && D2R_ValueType_IsFloat(rhs)) {\r\n    return rhs;\r\n  }\r\n  // float vs float\r\n  else if (D2R_ValueType_IsFloat(lhs) && D2R_ValueType_IsFloat(rhs)) {\r\n    return Max(lhs, rhs);\r\n  }\r\n  // address vs int\r\n  else if (lhs == D2R_ValueType_Address && D2R_ValueType_IsInt(rhs)) {\r\n    return D2R_ValueType_Address;\r\n  }\r\n  // int vs address\r\n  else if (D2R_ValueType_IsInt(lhs) && rhs == D2R_ValueType_Address) {\r\n    return D2R_ValueType_Address;\r\n  }\r\n  // address vs float\r\n  else if (lhs == D2R_ValueType_Address && D2R_ValueType_IsFloat(rhs)) {\r\n    return D2R_ValueType_Generic;\r\n  }\r\n  // float vs address\r\n  else if (D2R_ValueType_IsFloat(lhs) && rhs == D2R_ValueType_Address) {\r\n    return D2R_ValueType_Generic;\r\n  }\r\n  // no conversion for implicit value\r\n  else if (lhs == D2R_ValueType_ImplicitValue || rhs == D2R_ValueType_ImplicitValue) {\r\n    return D2R_ValueType_Generic;\r\n  }\r\n  AssertAlways(!\"undefined conversion case\");\r\n  return D2R_ValueType_Generic;\r\n}\r\n\r\ninternal D2R_ValueType\r\nd2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc)\r\n{\r\n  D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs);\r\n  if (rhs != common_type) {\r\n    rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), d2r_value_type_to_rdi(common_type));\r\n  }\r\n  if (lhs != common_type) {\r\n    rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0);\r\n    rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), d2r_value_type_to_rdi(common_type));\r\n  }\r\n  return common_type;\r\n}\r\n\r\ninternal void\r\nd2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op)\r\n{\r\n  D2R_ValueType rhs         = d2r_value_type_stack_pop(stack);\r\n  D2R_ValueType lhs         = d2r_value_type_stack_pop(stack);\r\n  D2R_ValueType common_type = d2r_apply_usual_arithmetic_conversions(arena, lhs, rhs, bc);\r\n  rdim_bytecode_push_op(arena, bc, op, d2r_value_type_to_rdi(common_type));\r\n  d2r_value_type_stack_push(0, stack, common_type);\r\n}\r\n\r\ninternal void\r\nd2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op)\r\n{\r\n  D2R_ValueType rhs = d2r_value_type_stack_pop(stack);\r\n  D2R_ValueType lhs = d2r_value_type_stack_pop(stack);\r\n  D2R_ValueType common_type;\r\n  if (D2R_ValueType_IsInt(lhs) && rhs == D2R_ValueType_Address) {\r\n    rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0);\r\n    rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(lhs), RDI_EvalTypeGroup_U);\r\n    rdim_bytecode_push_op(arena, bc, RDI_EvalOp_Swap, 0);\r\n    common_type = D2R_ValueType_Address;\r\n  } else if (lhs == D2R_ValueType_Address && D2R_ValueType_IsInt(rhs)) {\r\n    rdim_bytecode_push_convert(arena, bc, d2r_value_type_to_rdi(rhs), RDI_EvalTypeGroup_U);\r\n    common_type = D2R_ValueType_Address;\r\n  } else {\r\n    common_type = d2r_apply_usual_arithmetic_conversions(arena, lhs, rhs, bc);\r\n  }\r\n  rdim_bytecode_push_op(arena, bc, RDI_EvalOp_EqEq, d2r_value_type_to_rdi(common_type));\r\n  d2r_value_type_stack_push(0, stack, D2R_ValueType_Bool);\r\n}\r\n\r\ninternal RDIM_EvalBytecode\r\nd2r_bytecode_from_expression(Arena       *arena,\r\n                             DW_Input    *input,\r\n                             U64          image_base,\r\n                             U64          address_size,\r\n                             Arch         arch,\r\n                             DW_ListUnit *addr_lu,\r\n                             String8      raw_expr,\r\n                             DW_CompUnit *cu,\r\n                             D2R_ValueType *result_type_out)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  Temp arena_restore_point = temp_begin(arena);\r\n  \r\n  RDIM_EvalBytecode bc = {0};\r\n  \r\n  DW_Expr               expr            = dw_expr_from_data(scratch.arena, cu->format, address_size, raw_expr);\r\n  D2R_ValueTypeStack   *stack           = push_array(scratch.arena, D2R_ValueTypeStack, 1);\r\n  RDIM_EvalBytecodeOp **converted_insts = push_array(scratch.arena, RDIM_EvalBytecodeOp *, expr.count);\r\n  B32                   is_ok           = 1;\r\n  U64                   inst_idx        = 0;\r\n  for EachNode(inst, DW_ExprInst, expr.first) {\r\n    RDIM_EvalBytecodeOp *last_op = bc.last_op;\r\n    \r\n    U64 pop_count = dw_pop_count_from_expr_op(inst->opcode);\r\n    if (pop_count > stack->count) {\r\n      // TODO: report error\r\n      Assert(!\"not enough values on the stack to evaluate instruction\");\r\n      is_ok = 0;\r\n      break;\r\n    }\r\n    \r\n    switch (inst->opcode) {\r\n      case DW_ExprOp_Lit0:  case DW_ExprOp_Lit1:  case DW_ExprOp_Lit2:\r\n      case DW_ExprOp_Lit3:  case DW_ExprOp_Lit4:  case DW_ExprOp_Lit5:\r\n      case DW_ExprOp_Lit6:  case DW_ExprOp_Lit7:  case DW_ExprOp_Lit8:\r\n      case DW_ExprOp_Lit9:  case DW_ExprOp_Lit10: case DW_ExprOp_Lit11:\r\n      case DW_ExprOp_Lit12: case DW_ExprOp_Lit13: case DW_ExprOp_Lit14:\r\n      case DW_ExprOp_Lit15: case DW_ExprOp_Lit16: case DW_ExprOp_Lit17:\r\n      case DW_ExprOp_Lit18: case DW_ExprOp_Lit19: case DW_ExprOp_Lit20:\r\n      case DW_ExprOp_Lit21: case DW_ExprOp_Lit22: case DW_ExprOp_Lit23:\r\n      case DW_ExprOp_Lit24: case DW_ExprOp_Lit25: case DW_ExprOp_Lit26:\r\n      case DW_ExprOp_Lit27: case DW_ExprOp_Lit28: case DW_ExprOp_Lit29:\r\n      case DW_ExprOp_Lit30: case DW_ExprOp_Lit31: {\r\n        U64 lit = inst->opcode - DW_ExprOp_Lit0;\r\n        rdim_bytecode_push_uconst(arena, &bc, lit);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U8);\r\n      } break;\r\n      case DW_ExprOp_Const1U: {\r\n        rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u8);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U8);\r\n      } break;\r\n      case DW_ExprOp_Const2U: {\r\n        rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u16);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U16);\r\n      } break;\r\n      case DW_ExprOp_Const4U: {\r\n        rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u32);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U32);\r\n      } break;\r\n      case DW_ExprOp_Const8U: {\r\n        rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u32);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U64);\r\n      } break;\r\n      case DW_ExprOp_Const1S: {\r\n        rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s8);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S8);\r\n      } break;\r\n      case DW_ExprOp_Const2S: {\r\n        rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s16);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S16);\r\n      } break;\r\n      case DW_ExprOp_Const4S: {\r\n        rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s32);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S32);\r\n      } break;\r\n      case DW_ExprOp_Const8S: {\r\n        rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s64);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64);\r\n      } break;\r\n      case DW_ExprOp_ConstU: {\r\n        rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u64);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_U64);\r\n      } break;\r\n      case DW_ExprOp_ConstS: {\r\n        rdim_bytecode_push_sconst(arena, &bc, inst->operands[0].s64);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_S64);\r\n      } break;\r\n      case DW_ExprOp_Addr: {\r\n        if (inst->operands[0].u64 >= image_base) {\r\n          U64 voff = inst->operands[0].u64 - image_base;\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff);\r\n          d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n        } else {\r\n          is_ok = 0;\r\n        }\r\n      } break;\r\n      case DW_ExprOp_Reg0:  case DW_ExprOp_Reg1:  case DW_ExprOp_Reg2:\r\n      case DW_ExprOp_Reg3:  case DW_ExprOp_Reg4:  case DW_ExprOp_Reg5:\r\n      case DW_ExprOp_Reg6:  case DW_ExprOp_Reg7:  case DW_ExprOp_Reg8:\r\n      case DW_ExprOp_Reg9:  case DW_ExprOp_Reg10: case DW_ExprOp_Reg11:\r\n      case DW_ExprOp_Reg12: case DW_ExprOp_Reg13: case DW_ExprOp_Reg14:\r\n      case DW_ExprOp_Reg15: case DW_ExprOp_Reg16: case DW_ExprOp_Reg17:\r\n      case DW_ExprOp_Reg18: case DW_ExprOp_Reg19: case DW_ExprOp_Reg20:\r\n      case DW_ExprOp_Reg21: case DW_ExprOp_Reg22: case DW_ExprOp_Reg23:\r\n      case DW_ExprOp_Reg24: case DW_ExprOp_Reg25: case DW_ExprOp_Reg26:\r\n      case DW_ExprOp_Reg27: case DW_ExprOp_Reg28: case DW_ExprOp_Reg29:\r\n      case DW_ExprOp_Reg30: case DW_ExprOp_Reg31: {\r\n        U64 reg_code_dw  = inst->opcode - DW_ExprOp_Reg0;\r\n        U64 reg_size     = dw_reg_size_from_code(arch, reg_code_dw);\r\n        U64 reg_pos      = dw_reg_pos_from_code(arch, reg_code_dw);\r\n        \r\n        RDI_RegCode reg_code_rdi  = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw);\r\n        U32         regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param);\r\n        d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(reg_size));\r\n      } break;\r\n      case DW_ExprOp_RegX: {\r\n        U64         reg_size      = dw_reg_size_from_code(arch, inst->operands[0].u64);\r\n        U64         reg_pos       = dw_reg_pos_from_code(arch, inst->operands[0].u64);\r\n        RDI_RegCode reg_code_rdi  = d2r_rdi_reg_code_from_dw_reg(arch, inst->operands[0].u64);\r\n        U32         regread_param = RDI_EncodeRegReadParam(reg_code_rdi, reg_size, reg_pos);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, regread_param);\r\n        d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(reg_size));\r\n      } break;\r\n      case DW_ExprOp_ImplicitValue: {\r\n        if (inst->operands[0].block.size <= sizeof(U64)) {\r\n          U64 implicit_value;\r\n          MemoryCopyStr8(&implicit_value, inst->operands[0].block);\r\n          rdim_bytecode_push_uconst(arena, &bc, implicit_value);\r\n          d2r_value_type_stack_push(scratch.arena, stack, d2r_unsigned_value_type_from_bit_size(inst->operands[0].block.size * 8));\r\n        } else {\r\n          // TODO: currenlty no way to encode string in RDIM_EvalBytecodeOp\r\n          NotImplemented;\r\n        }\r\n      } break;\r\n      case DW_ExprOp_Piece: {\r\n        U64 partial_value_size32 = safe_cast_u32(inst->operands[0].u64);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PartialValue, partial_value_size32);\r\n      } break;\r\n      case DW_ExprOp_BitPiece: {\r\n        U32 piece_bit_size32 = safe_cast_u32(inst->operands[0].u64);\r\n        U32 piece_bit_off32  = safe_cast_u32(inst->operands[1].u64);\r\n        U64 partial_value    = Compose64Bit(piece_bit_size32, piece_bit_off32);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_PartialValueBit, partial_value);\r\n      } break;\r\n      case DW_ExprOp_Pick: {\r\n        U64 idx = 0;\r\n        D2R_ValueTypeNode *n;\r\n        for (n = stack->top; n != 0 || idx == inst->operands[0].u64; n = n->next, idx += 1) { }\r\n        if (idx == inst->operands[0].u64) {\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, inst->operands[0].u64);\r\n          d2r_value_type_stack_push(scratch.arena, stack, n->type);\r\n        } else {\r\n          // TODO: report error\r\n          AssertAlways(!\"out of bounds pick\");\r\n        }\r\n      } break;\r\n      case DW_ExprOp_Over: {\r\n        if (stack->top && stack->top->next) {\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 1);\r\n          d2r_value_type_stack_push(scratch.arena, stack, stack->top->next->type);\r\n        } else {\r\n          // TODO: report error\r\n          AssertAlways(!\"out of bounds over\");\r\n        }\r\n      } break;\r\n      case DW_ExprOp_PlusUConst: {\r\n        D2R_ValueType lhs = d2r_value_type_stack_pop(stack);\r\n        D2R_ValueType common_type = d2r_pick_common_value_type(lhs, D2R_ValueType_U64);\r\n        rdim_bytecode_push_uconst(arena, &bc, inst->operands[0].u64);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(common_type));\r\n        d2r_value_type_stack_push(scratch.arena, stack, common_type);\r\n      } break;\r\n      case DW_ExprOp_Skip: {\r\n        B32 skip_fwd   = inst->operands[0].s16 >= 0;\r\n        U16 delta      = abs_s64(inst->operands[0].s16);\r\n        U16 cursor     = 0;\r\n        U64 inst_count = 0;\r\n        for (DW_ExprInst *i = skip_fwd ? inst : inst->prev; i != 0 && cursor < delta; i = skip_fwd ? inst->next : inst->prev) {\r\n          cursor += inst->size;\r\n          inst_count += 1;\r\n        }\r\n        \r\n        // TODO: report error (skip does not land on first byte of an instruction)\r\n        AssertAlways(cursor == delta);\r\n        // TODO: report overflow\r\n        AssertAlways(inst_count <= min_S16);\r\n        AssertAlways(inst_idx <= max_U32);\r\n        \r\n        U64 imm = Compose64Bit(inst_idx, skip_fwd ? (S16)inst_count : -(S16)inst_count);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Skip, imm);\r\n      } break;\r\n      case DW_ExprOp_Bra: {\r\n        NotImplemented;\r\n      } break;\r\n      case DW_ExprOp_BReg0:  case DW_ExprOp_BReg1:  case DW_ExprOp_BReg2: \r\n      case DW_ExprOp_BReg3:  case DW_ExprOp_BReg4:  case DW_ExprOp_BReg5: \r\n      case DW_ExprOp_BReg6:  case DW_ExprOp_BReg7:  case DW_ExprOp_BReg8:  \r\n      case DW_ExprOp_BReg9:  case DW_ExprOp_BReg10: case DW_ExprOp_BReg11: \r\n      case DW_ExprOp_BReg12: case DW_ExprOp_BReg13: case DW_ExprOp_BReg14: \r\n      case DW_ExprOp_BReg15: case DW_ExprOp_BReg16: case DW_ExprOp_BReg17: \r\n      case DW_ExprOp_BReg18: case DW_ExprOp_BReg19: case DW_ExprOp_BReg20: \r\n      case DW_ExprOp_BReg21: case DW_ExprOp_BReg22: case DW_ExprOp_BReg23: \r\n      case DW_ExprOp_BReg24: case DW_ExprOp_BReg25: case DW_ExprOp_BReg26: \r\n      case DW_ExprOp_BReg27: case DW_ExprOp_BReg28: case DW_ExprOp_BReg29: \r\n      case DW_ExprOp_BReg30: case DW_ExprOp_BReg31: {\r\n        U64 reg_code_dw = inst->opcode - DW_ExprOp_BReg0;\r\n        S64 reg_off     = inst->operands[0].s64;\r\n        \r\n        RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegRead, reg_code_rdi);\r\n        if (reg_off > 0) {\r\n          rdim_bytecode_push_sconst(arena, &bc, reg_off);\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, RDI_EvalTypeGroup_S);\r\n        }\r\n        \r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n      } break;\r\n      case DW_ExprOp_BRegX: {\r\n        U64 reg_code_dw = inst->operands[0].u64;\r\n        S64 reg_off     = inst->operands[1].s64;\r\n        \r\n        RDI_RegCode reg_code_rdi = d2r_rdi_reg_code_from_dw_reg(arch, reg_code_dw);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RegReadDyn, reg_code_rdi);\r\n        if (reg_off > 0) {\r\n          rdim_bytecode_push_sconst(arena, &bc, reg_off);\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, RDI_EvalTypeGroup_S);\r\n        }\r\n        \r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n      } break;\r\n      case DW_ExprOp_FBReg: {\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, inst->operands[0].s64);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n      } break;\r\n      case DW_ExprOp_Deref: {\r\n        D2R_ValueType address_type = d2r_value_type_stack_pop(stack);\r\n        if (address_type != D2R_ValueType_Address && !D2R_ValueType_IsInt(address_type)) {\r\n          // TODO: report error\r\n          Assert(!\"value must be of integral type\");\r\n          break;\r\n        }\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, address_size);\r\n        d2r_value_type_stack_push(scratch.arena, stack, address_type);\r\n      } break;\r\n      case DW_ExprOp_DerefSize: {\r\n        D2R_ValueType address_type = d2r_value_type_stack_pop(stack);\r\n        if (!D2R_ValueType_IsInt(address_type) && address_type != D2R_ValueType_Address ) {\r\n          // TODO: report error\r\n          Assert(!\"value must be of integral type\");\r\n          break;\r\n        }\r\n        U8 deref_size_in_bytes = inst->operands[0].u64;\r\n        if (0 < deref_size_in_bytes && deref_size_in_bytes <= address_size) {\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_MemRead, deref_size_in_bytes);\r\n        } else {\r\n          // TODO: error handling\r\n          AssertAlways(!\"ill formed expression\");\r\n        }\r\n        d2r_value_type_stack_push(scratch.arena, stack, address_type);\r\n      } break;\r\n      case DW_ExprOp_XDeref: {\r\n        // TODO: error handling\r\n        AssertAlways(!\"multiple address spaces are not supported\");\r\n      } break;\r\n      // TODO: error handling\r\n      case DW_ExprOp_XDerefSize: { AssertAlways(!\"no suitable conversion\"); } break;\r\n      case DW_ExprOp_Call2:\r\n      case DW_ExprOp_Call4:\r\n      case DW_ExprOp_CallRef: {\r\n        // TODO: error handling\r\n        AssertAlways(!\"calls are not supported\");\r\n      } break;\r\n      case DW_ExprOp_ImplicitPointer:\r\n      case DW_ExprOp_GNU_ImplicitPointer: {\r\n        // TODO:\r\n        AssertAlways(!\"sample\");\r\n      } break;\r\n      case DW_ExprOp_Convert:\r\n      case DW_ExprOp_GNU_Convert: {\r\n        D2R_ValueType out = D2R_ValueType_Generic;\r\n        if (inst->operands[0].u64 == 0) {\r\n          //\r\n          // 2.5.1\r\n          // Instead of a base type, elements can have a generic type,\r\n          // which is an integral type that has the size of an address\r\n          // on the target machine and unspecified signedness.\r\n          //\r\n          out = D2R_ValueType_Generic;\r\n        } else {\r\n          // find ref tag\r\n          DW_TagNode *tag_node = dw_tag_node_from_info_off(cu, inst->operands[0].u64);\r\n          DW_Tag      tag      = tag_node->tag;\r\n          if (tag.kind == DW_TagKind_BaseType) {\r\n            // extract encoding attribute\r\n            DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding);\r\n            \r\n            // DW_ATE -> RDI_EvalTypeGroup\r\n            switch (encoding) {\r\n              case DW_ATE_Null: {\r\n                out = D2R_ValueType_Generic;\r\n              } break;\r\n              case DW_ATE_Address: {\r\n                out = D2R_ValueType_Address;\r\n              } break;\r\n              case DW_ATE_Boolean: {\r\n                out = D2R_ValueType_S8;\r\n              } break;\r\n              case DW_ATE_SignedChar:\r\n              case DW_ATE_Signed: {\r\n                U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize);\r\n                out = d2r_signed_value_type_from_bit_size(byte_size * 8);\r\n              } break;\r\n              case DW_ATE_UnsignedChar:\r\n              case DW_ATE_Unsigned: {\r\n                U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize);\r\n                out = d2r_unsigned_value_type_from_bit_size(byte_size * 8);\r\n              } break;\r\n              case DW_ATE_Float: {\r\n                U64 byte_size = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ByteSize);\r\n                out = d2r_float_type_from_bit_size(byte_size * 8);\r\n              } break;\r\n              default: InvalidPath; break;\r\n            }\r\n          } else {\r\n            AssertAlways(!\"unexpected tag\"); // TODO: error handling\r\n          }\r\n        }\r\n        \r\n        D2R_ValueType in = d2r_value_type_stack_pop(stack);\r\n        d2r_value_type_stack_push(scratch.arena, stack, out);\r\n        rdim_bytecode_push_convert(arena, &bc, d2r_value_type_to_rdi(in), d2r_value_type_to_rdi(out));\r\n      } break;\r\n      // TODO:\r\n      case DW_ExprOp_GNU_ParameterRef: { AssertAlways(!\"sample\"); } break;\r\n      // TODO:\r\n      case DW_ExprOp_DerefType:\r\n      case DW_ExprOp_GNU_DerefType: { AssertAlways(!\"sample\"); } break;\r\n      // TODO:\r\n      case DW_ExprOp_ConstType: \r\n      case DW_ExprOp_GNU_ConstType: { AssertAlways(!\"sample\"); } break;\r\n      // TODO:\r\n      case DW_ExprOp_RegvalType: { AssertAlways(!\"sample\"); } break;\r\n      case DW_ExprOp_EntryValue:\r\n      case DW_ExprOp_GNU_EntryValue: {\r\n        D2R_ValueType call_site_result_type = 0;\r\n        RDIM_EvalBytecode call_site_bc = d2r_bytecode_from_expression(arena, input, image_base, address_size, arch, addr_lu, inst->operands[0].block, cu, &call_site_result_type);\r\n        \r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_CallSiteValue, safe_cast_u32(call_site_bc.encoded_size));\r\n        rdim_bytecode_concat_in_place(&bc, &call_site_bc);\r\n        \r\n        d2r_value_type_stack_push(scratch.arena, stack, call_site_result_type);\r\n      } break;\r\n      case DW_ExprOp_Addrx: {\r\n        U64 addr = dw_addr_from_list_unit(addr_lu, inst->operands[0].u64);\r\n        if (addr != max_U64) {\r\n          if (addr >= image_base) {\r\n            U64 voff = addr - image_base;\r\n            rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_ModuleOff, voff);\r\n            d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n          } else {\r\n            // TODO: error handling\r\n            AssertAlways(!\"unable to relocate address\");\r\n          }\r\n        } else {\r\n          // TODO: error handling\r\n          AssertAlways(!\"out of bounds index\");\r\n        }\r\n      } break;\r\n      case DW_ExprOp_CallFrameCfa: {\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_FrameOff, 0);\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n      } break;\r\n      case DW_ExprOp_FormTlsAddress: {\r\n        // TODO:\r\n        AssertAlways(!\"RDI_EvalOp_TLSOff accepts immediate\");\r\n      } break;\r\n      case DW_ExprOp_PushObjectAddress: {\r\n        AssertAlways(!\"sample\");\r\n      } break;\r\n      case DW_ExprOp_Nop: {} break;\r\n      case DW_ExprOp_Eq:    { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_EqEq);   } break;\r\n      case DW_ExprOp_Ge:    { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_GrEq);   } break;\r\n      case DW_ExprOp_Gt:    { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_Grtr);   } break;\r\n      case DW_ExprOp_Le:    { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_LsEq);   } break;\r\n      case DW_ExprOp_Lt:    { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_Less);   } break;\r\n      case DW_ExprOp_Ne:    { d2r_push_relational_op(arena, stack, &bc, RDI_EvalOp_NtEq);   } break;\r\n      case DW_ExprOp_Div:   { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Div);    } break;\r\n      case DW_ExprOp_Minus: { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Sub);    } break;\r\n      case DW_ExprOp_Mul:   { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Mul);    } break;\r\n      case DW_ExprOp_Plus:  { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_Add);    } break;\r\n      case DW_ExprOp_Xor:   { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitXor); } break;\r\n      case DW_ExprOp_And:   { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitAnd); } break;\r\n      case DW_ExprOp_Or:    { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_BitOr);  } break;\r\n      case DW_ExprOp_Shl:   { d2r_push_arithmetic_op(arena, stack, &bc, RDI_EvalOp_LShift); } break;\r\n      case DW_ExprOp_Shr: {\r\n        D2R_ValueType rhs = d2r_value_type_stack_pop(stack);\r\n        D2R_ValueType lhs = d2r_value_type_stack_pop(stack);\r\n        if (D2R_ValueType_IsInt(rhs) && D2R_ValueType_IsInt(lhs)) {\r\n          D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs);\r\n          D2R_ValueType result_type = d2r_unsigned_value_type_from_bit_size(d2r_size_from_value_type((address_size), common_type) * 8);\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type));\r\n          d2r_value_type_stack_push(scratch.arena, stack, result_type);\r\n        } else {\r\n          // TODO: report error\r\n          AssertAlways(!\"operands must be of integral type\");\r\n        }\r\n      } break;\r\n      case DW_ExprOp_Shra: {\r\n        D2R_ValueType rhs = d2r_value_type_stack_pop(stack);\r\n        D2R_ValueType lhs = d2r_value_type_stack_pop(stack);\r\n        if (D2R_ValueType_IsInt(lhs) && D2R_ValueType_IsInt(rhs)) {\r\n          D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs);\r\n          D2R_ValueType result_type = d2r_signed_value_type_from_bit_size(d2r_size_from_value_type((address_size), common_type) * 8);\r\n          rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_RShift, d2r_value_type_to_rdi(result_type));\r\n          d2r_value_type_stack_push(scratch.arena, stack, result_type);\r\n        } else {\r\n          // TODO: report error\r\n          AssertAlways(!\"operands must be of integral type\");\r\n        }\r\n      } break;\r\n      case DW_ExprOp_Mod: {\r\n        D2R_ValueType rhs = d2r_value_type_stack_pop(stack);\r\n        D2R_ValueType lhs = d2r_value_type_stack_pop(stack);\r\n        if (!D2R_ValueType_IsInt(rhs) || !D2R_ValueType_IsInt(lhs)) {\r\n          // TODO: report error\r\n          AssertAlways(!\"operands must be of integral type\");\r\n          is_ok = 0;\r\n          break;\r\n        }\r\n        D2R_ValueType common_type = d2r_pick_common_value_type(lhs, rhs);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Mod, d2r_value_type_to_rdi(common_type));\r\n        d2r_value_type_stack_push(scratch.arena, stack, common_type);\r\n      } break;\r\n      case DW_ExprOp_Abs: {\r\n        if (!D2R_ValueType_IsInt(d2r_value_type_stack_peek(stack)) && !D2R_ValueType_IsFloat(d2r_value_type_stack_peek(stack))) {\r\n          // TODO: report error\r\n          AssertAlways(!\"operand must be of integral type or float\");\r\n          is_ok = 0;\r\n          break;\r\n        }\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Abs, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack)));\r\n      } break;\r\n      case DW_ExprOp_Neg: {\r\n        if (!D2R_ValueType_IsInt(d2r_value_type_stack_peek(stack))) {\r\n          // TODO: report error\r\n          AssertAlways(!\"operand must be of integral type\");\r\n          is_ok = 0;\r\n          break;\r\n        }\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Neg, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack)));\r\n      } break;\r\n      case DW_ExprOp_Not: {\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_BitNot, d2r_value_type_to_rdi(d2r_value_type_stack_peek(stack)));\r\n      } break;\r\n      case DW_ExprOp_Dup: {\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Pick, 0);\r\n        d2r_value_type_stack_push(scratch.arena, stack, d2r_value_type_stack_peek(stack));\r\n      } break;\r\n      case DW_ExprOp_Rot:  { AssertAlways(!\"no suitable conversion\"); } break;\r\n      case DW_ExprOp_Swap: { AssertAlways(!\"no suitable conversion\"); } break;\r\n      case DW_ExprOp_Drop: { AssertAlways(!\"no suitable conversion\"); } break;\r\n      case DW_ExprOp_StackValue: {\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Stop, 0);\r\n        if (stack->top->type == D2R_ValueType_Address) {\r\n          stack->top->type = d2r_unsigned_value_type_from_bit_size(address_size * 8);\r\n        }\r\n      } break;\r\n      case DW_ExprOp_GNU_PushTlsAddress: {\r\n        D2R_ValueType lhs = d2r_value_type_stack_pop(stack);\r\n        if (!D2R_ValueType_IsInt(lhs)) {\r\n          // TODO: report error\r\n          AssertAlways(!\"lhs must be of integral type\");\r\n        }\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_TLSOff, 0);\r\n        rdim_bytecode_push_op(arena, &bc, RDI_EvalOp_Add, d2r_value_type_to_rdi(lhs));\r\n        d2r_value_type_stack_push(scratch.arena, stack, D2R_ValueType_Address);\r\n      } break;\r\n      \r\n      default: InvalidPath; break;\r\n    }\r\n    if (!is_ok) { break; }\r\n    \r\n    // store converted instruction\r\n    if (last_op != bc.last_op) {\r\n      RDIM_EvalBytecodeOp *first_converted_op = last_op ? last_op->next : bc.first_op;\r\n      converted_insts[inst_idx] = first_converted_op;\r\n    }\r\n    \r\n    inst_idx += 1;\r\n  }\r\n  \r\n  if (is_ok) {\r\n    // fixup bytecode\r\n    for EachNode(op, RDIM_EvalBytecodeOp, bc.first_op) {\r\n      if (op->op == RDI_EvalOp_Skip) {\r\n        // unpack skip info\r\n        U32 inst_idx          = Extract32(op->p, 0);\r\n        S16 skip_count_signed = (S16)Extract32(op->p, 1);\r\n        U16 skip_count        = abs_s64(skip_count_signed);\r\n        B32 skip_fwd          = skip_count_signed > 0;\r\n        \r\n        // setup being/end links\r\n        RDIM_EvalBytecodeOp *begin = 0, *end = 0;\r\n        if (skip_fwd) {\r\n          if (inst_idx + skip_count <= expr.count) {\r\n            begin = converted_insts[inst_idx];\r\n            end   = (inst_idx + skip_count) < expr.count ? converted_insts[inst_idx + skip_count] : 0;\r\n          } else {\r\n            // TODO: report error\r\n            AssertAlways(!\"out of bounds skip\");\r\n          }\r\n        } else {\r\n          if (skip_count <= inst_idx) {\r\n            begin = converted_insts[inst_idx - skip_count];\r\n            end   = converted_insts[inst_idx];\r\n          } else {\r\n            // TODO: report error\r\n            AssertAlways(!\"out of bounds skip\");\r\n          }\r\n        }\r\n        \r\n        // compute skip delta\r\n        U64 skip_delta = 0;\r\n        for (RDIM_EvalBytecodeOp *n = begin; n != end; n = n->next) {\r\n          skip_delta += n->p_size;\r\n        }\r\n        \r\n        // rewrite skip operand with byte delta\r\n        AssertAlways(skip_delta <= max_S16);\r\n        op->p = skip_fwd ? (S16)skip_delta : -(S16)skip_delta;\r\n      }\r\n    }\r\n    \r\n    if (result_type_out) {\r\n      *result_type_out = d2r_value_type_stack_peek(stack);\r\n    }\r\n  } else {\r\n    MemoryZeroStruct(&bc);\r\n    temp_end(arena_restore_point);\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return bc;\r\n}\r\n\r\ninternal RDIM_Location *\r\nd2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr)\r\n{\r\n  RDIM_Location *loc = 0;\r\n  if (expr.size) {\r\n    D2R_ValueType result_type = 0;\r\n    RDIM_EvalBytecode bytecode = d2r_bytecode_from_expression(arena, input, image_base, address_size, arch, addr_lu, expr, cu, &result_type);\r\n    \r\n    RDIM_LocationInfo *loc_info = push_array(arena, RDIM_LocationInfo, 1);\r\n    loc_info->kind     = result_type == D2R_ValueType_Address ? RDI_LocationKind_AddrBytecodeStream : RDI_LocationKind_ValBytecodeStream;\r\n    loc_info->bytecode = bytecode;\r\n    \r\n    loc = rdim_location_chunk_list_push_new(arena, locations, LOCATIONS_CAP, loc_info);\r\n  }\r\n  return loc;\r\n}\r\n\r\ninternal RDIM_LocationCaseList\r\nd2r_locset_from_attrib(Arena                  *arena,\r\n                       RDIM_ScopeChunkList    *scopes,\r\n                       RDIM_Scope             *curr_scope,\r\n                       RDIM_LocationChunkList *locations,\r\n                       DW_Input               *input,\r\n                       DW_CompUnit            *cu,\r\n                       U64                     image_base,\r\n                       Arch                    arch,\r\n                       DW_Tag                  tag,\r\n                       DW_AttribKind           kind)\r\n{\r\n  RDIM_LocationCaseList locset = {0};\r\n  \r\n  // extract attrib from tag\r\n  DW_Attrib      *attrib       = dw_attrib_from_tag(input, cu, tag, kind);\r\n  DW_AttribClass  attrib_class = dw_value_class_from_attrib(cu, attrib);\r\n  \r\n  if (attrib_class == DW_AttribClass_LocList || attrib_class == DW_AttribClass_LocListPtr) {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    // extract location list from attrib\r\n    DW_LocList loclist = dw_loclist_from_attrib(scratch.arena, input, cu, attrib);\r\n    \r\n    // convert location list to RDIM location set\r\n    for EachNode(loc_n, DW_LocNode, loclist.first) {\r\n      RDIM_Location *location   = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, loc_n->v.expr);\r\n      RDIM_Rng1U64   voff_range = { .min = loc_n->v.range.min -  image_base, .max = loc_n->v.range.max - image_base };\r\n      rdim_push_location_case(arena, scopes, &locset, location, voff_range);\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  } else if (attrib_class == DW_AttribClass_ExprLoc) {\r\n    // extract expression from attrib\r\n    String8 expr = dw_exprloc_from_attrib(input, cu, attrib);\r\n    \r\n    // convert expression and inherit life-time ranges from enclosed scope\r\n    RDIM_Location *location = d2r_transpile_expression(arena, locations, input, image_base, cu->address_size, arch, cu->addr_lu, cu, expr);\r\n    for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) {\r\n      rdim_push_location_case(arena, scopes, &locset, location, range_n->v);\r\n    }\r\n  } else if (attrib_class != DW_AttribClass_Null) {\r\n    AssertAlways(!\"unexpected attrib class\");\r\n  }\r\n  \r\n  return locset;\r\n}\r\n\r\ninternal RDIM_LocationCaseList\r\nd2r_var_locset_from_tag(Arena                  *arena,\r\n                        RDIM_ScopeChunkList    *scopes,\r\n                        RDIM_Scope             *curr_scope,\r\n                        RDIM_LocationChunkList *locations,\r\n                        DW_Input               *input,\r\n                        DW_CompUnit            *cu,\r\n                        U64                     image_base,\r\n                        Arch                    arch,\r\n                        DW_Tag                  tag)\r\n{\r\n  RDIM_LocationCaseList locset = {0};\r\n  \r\n  B32 has_const_value = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ConstValue);\r\n  B32 has_location    = dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Location);\r\n  \r\n  if (has_const_value && has_location) {\r\n    // TODO: error handling\r\n    AssertAlways(!\"unexpected variable encoding\");\r\n  }\r\n  \r\n  if (has_const_value) {\r\n    // extract const value\r\n    U64 const_value = dw_u64_from_attrib(input, cu, tag, DW_AttribKind_ConstValue);\r\n    \r\n    // make value byte code\r\n    RDIM_EvalBytecode bc = {0};\r\n    rdim_bytecode_push_uconst(arena, &bc, const_value);\r\n    \r\n    // fill out location\r\n    RDIM_LocationInfo *loc_info = push_array(arena, RDIM_LocationInfo, 1);\r\n    loc_info->kind     = RDI_LocationKind_ValBytecodeStream;\r\n    loc_info->bytecode = bc;\r\n    RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, locations, LOCATIONS_CAP, loc_info);\r\n    \r\n    // push location cases\r\n    for EachNode(range_n, RDIM_Rng1U64Node, curr_scope->voff_ranges.first) {\r\n      rdim_push_location_case(arena, scopes, &locset, loc, range_n->v);\r\n    }\r\n  } else if (has_location) {\r\n    locset = d2r_locset_from_attrib(arena, scopes, curr_scope, locations, input, cu, image_base, arch, tag, DW_AttribKind_Location);\r\n  }\r\n  \r\n  return locset;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Compilation Unit / Scope Conversion Helpers\r\n\r\ninternal RDIM_Rng1U64ChunkList\r\nd2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off)\r\n{\r\n  RDIM_Rng1U64ChunkList voff_ranges   = {0};\r\n  U64                   voff_list_idx = u64_array_bsearch(map.info_off_arr, map.count, info_off);\r\n  if (voff_list_idx < map.count) {\r\n    voff_ranges = map.voff_range_arr[voff_list_idx];\r\n  }\r\n  return voff_ranges;\r\n}\r\n\r\ninternal RDIM_Scope *\r\nd2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges)\r\n{\r\n  // fill out scope\r\n  RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, scopes, scope_chunk_cap);\r\n  \r\n  // push ranges\r\n  for EachNode(i, Rng1U64Node, ranges.first) {\r\n    rdim_scope_push_voff_range(arena, scopes, scope, (RDIM_Rng1U64){.min = i->v.min, i->v.max});\r\n  }\r\n  \r\n  // associate scope with tag\r\n  tag_stack->scope = scope;\r\n  \r\n  // update scope hierarchy\r\n  DW_TagKind parent_tag_kind = tag_stack->next->node->tag.kind;\r\n  if (parent_tag_kind == DW_TagKind_SubProgram || parent_tag_kind == DW_TagKind_InlinedSubroutine || parent_tag_kind == DW_TagKind_LexicalBlock) {\r\n    RDIM_Scope *parent = tag_stack->next->scope;\r\n    \r\n    scope->parent_scope = parent;\r\n    scope->symbol       = parent->symbol;\r\n    \r\n    if (parent->last_child) {\r\n      parent->last_child->next_sibling = scope;\r\n    }\r\n    SLLQueuePush_N(parent->first_child, parent->last_child, scope, next_sibling);\r\n  }\r\n  \r\n  return scope;\r\n}\r\n\r\n////////////////////////////////\r\n//~ Tag Iterator\r\n\r\ninternal D2R_TagIter *\r\nd2r_tag_iter_init(Arena *arena, DW_TagNode *root)\r\n{\r\n  D2R_TagIter *iter = push_array(arena, D2R_TagIter, 1);\r\n  iter->free_list = 0;\r\n  iter->stack = push_array(arena, D2R_TagFrame, 1);\r\n  iter->stack->node = push_array(arena, DW_TagNode, 1);\r\n  if(root != 0)\r\n  {\r\n    *iter->stack->node = *root;\r\n  }\r\n  iter->stack->node->sibling = 0;\r\n  iter->visit_children = 1;\r\n  iter->tag_node = root;\r\n  iter->root = root;\r\n  return iter;\r\n}\r\n\r\ninternal void\r\nd2r_tag_iter_next(Arena *arena, D2R_TagIter *iter)\r\n{\r\n  // descend to first child\r\n  if (iter->visit_children) {\r\n    if (iter->stack->node->first_child) {\r\n      D2R_TagFrame *f = iter->free_list;\r\n      if (f) { SLLStackPop(iter->free_list); MemoryZeroStruct(f); }\r\n      else   { f = push_array(arena, D2R_TagFrame, 1); }\r\n      f->node = iter->stack->node->first_child;\r\n      SLLStackPush(iter->stack, f);\r\n      goto exit;\r\n    }\r\n  }\r\n  \r\n  while (iter->stack) {\r\n    // go to sibling\r\n    iter->stack->node = iter->stack->node->sibling;\r\n    if (iter->stack->node) { break; }\r\n    \r\n    // no more siblings, go up\r\n    D2R_TagFrame *f = iter->stack;\r\n    SLLStackPop(iter->stack);\r\n    SLLStackPush(iter->free_list, f);\r\n  }\r\n  \r\n  exit:;\r\n  // update iterator\r\n  iter->visit_children = 1;\r\n  iter->tag_node       = iter->stack ? iter->stack->node : 0;\r\n  \r\n  // rjf: exit on root\r\n  if(iter->tag_node == iter->root)\r\n  {\r\n    iter->tag_node = 0;\r\n  }\r\n}\r\n\r\ninternal void\r\nd2r_tag_iter_skip_children(D2R_TagIter *iter)\r\n{\r\n  iter->visit_children = 0;\r\n}\r\n\r\ninternal DW_TagNode *\r\nd2r_tag_iter_parent_tag_node(D2R_TagIter *iter)\r\n{\r\n  return iter->stack->next->node;\r\n}\r\n\r\ninternal DW_Tag\r\nd2r_tag_iter_parent_tag(D2R_TagIter *iter)\r\n{\r\n  DW_TagNode *tag_node = d2r_tag_iter_parent_tag_node(iter);\r\n  return tag_node->tag;\r\n}\r\n\r\n////////////////////////////////\r\n//~ Type/UDT/Symbol Conversion\r\n\r\ninternal void\r\nd2r_flag_converted_tag(DW_TagNode *tag_node)\r\n{\r\n  tag_node->tag.v[0] = 1;\r\n}\r\n\r\ninternal B8\r\nd2r_is_tag_converted(DW_TagNode *tag_node)\r\n{\r\n  return tag_node->tag.v[0];\r\n}\r\n\r\ninternal RDIM_Type *\r\nd2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind)\r\n{\r\n  RDIM_Type *type = type_table->builtin_types[RDI_TypeKind_Void];\r\n  \r\n  // find attrib\r\n  DW_Attrib *attrib = dw_attrib_from_tag(input, cu, tag, kind);\r\n  \r\n  // does tag have this attribute?\r\n  if (attrib->attrib_kind == kind) {\r\n    DW_AttribClass value_class = dw_value_class_from_attrib(cu, attrib);\r\n    \r\n    if (value_class == DW_AttribClass_Reference) {\r\n      // resolve reference\r\n      DW_Reference ref = dw_ref_from_attrib(input, cu, attrib);\r\n      \r\n      // TODO: support for external compile unit references\r\n      AssertAlways(ref.cu == cu);\r\n      \r\n      // find type\r\n      type = d2r_type_from_offset(type_table, ref.info_off);\r\n      \r\n      // was type converted?\r\n      if (type == 0) {\r\n        // issue type conversion\r\n        DW_TagNode *ref_node = dw_tag_node_from_info_off(cu, ref.info_off);\r\n        d2r_convert_types(arena, type_table, input, cu, cu_lang, arch_addr_size, ref_node);\r\n        \r\n        // if we do not have a converted type at this point then debug info is malformed\r\n        type = d2r_type_from_offset(type_table, ref.info_off);\r\n        if(type == 0)\r\n        {\r\n          type = type_table->builtin_types[RDI_TypeKind_NULL];\r\n        }\r\n      }\r\n    } else {\r\n      Assert(!\"unexpected attrib class\");\r\n    }\r\n  }\r\n  \r\n  return type;\r\n}\r\n\r\ninternal void\r\nd2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root);\r\n      it->tag_node != 0;\r\n      d2r_tag_iter_next(scratch.arena, it))\r\n  {\r\n    DW_TagNode *tag_node = it->tag_node;\r\n    DW_Tag      tag      = tag_node->tag;\r\n    \r\n    // skip converted tags\r\n    if(d2r_is_tag_converted(tag_node))\r\n    {\r\n      d2r_tag_iter_skip_children(it);\r\n      continue;\r\n    }\r\n    \r\n    // mark the tag as converted here, because during conversion we may recurse on the same tag\r\n    d2r_flag_converted_tag(tag_node);\r\n    \r\n    switch(tag.kind)\r\n    {\r\n      case DW_TagKind_ClassType:\r\n      {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if(is_decl)\r\n        {\r\n          RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->kind = RDI_TypeKind_IncompleteClass;\r\n          type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          d2r_tag_iter_skip_children(it);\r\n        }\r\n        else\r\n        {\r\n          RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n          RDIM_Type *type        = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name        = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind        = RDI_TypeKind_Class;\r\n          type->byte_size   = dw_byte_size_32_from_tag(input, cu, tag);\r\n          type->direct_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_StructureType:\r\n      {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if(is_decl)\r\n        {\r\n          RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind = RDI_TypeKind_IncompleteStruct;\r\n          d2r_tag_iter_skip_children(it);\r\n        }\r\n        else\r\n        {\r\n          RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name      = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind      = RDI_TypeKind_Struct;\r\n          type->byte_size = dw_byte_size_32_from_tag(input, cu, tag);\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_UnionType:\r\n      {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if(is_decl)\r\n        {\r\n          RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name      = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind      = RDI_TypeKind_IncompleteUnion;\r\n          d2r_tag_iter_skip_children(it);\r\n        }\r\n        else\r\n        {\r\n          RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name      = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind      = RDI_TypeKind_Union;\r\n          type->byte_size = dw_byte_size_32_from_tag(input, cu, tag);\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_EnumerationType:\r\n      {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if(is_decl)\r\n        {\r\n          RDIM_Type *type = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name      = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind      = RDI_TypeKind_IncompleteEnum;\r\n          d2r_tag_iter_skip_children(it);\r\n        }\r\n        else\r\n        {\r\n          RDIM_Type *enum_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n          RDIM_Type *type           = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n          type->name        = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          type->kind        = RDI_TypeKind_Enum;\r\n          type->byte_size   = dw_byte_size_32_from_tag(input, cu, tag);\r\n          type->direct_type = enum_base_type;\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_SubroutineType:\r\n      {\r\n        RDIM_Type *ret_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        \r\n        // collect parameters\r\n        RDIM_TypeList param_list = {0};\r\n        for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) {\r\n          if (n->tag.kind == DW_TagKind_FormalParameter) {\r\n            RDIM_Type *param_type = d2r_type_from_attrib(type_table, input, cu, n->tag, DW_AttribKind_Type);\r\n            rdim_type_list_push(scratch.arena, &param_list, param_type);\r\n          } else if (n->tag.kind == DW_TagKind_UnspecifiedParameters) {\r\n            rdim_type_list_push(scratch.arena, &param_list, type_table->builtin_types[RDI_TypeKind_Variadic]);\r\n          } else {\r\n            // TODO: error handling\r\n            AssertAlways(!\"unexpected tag\");\r\n          }\r\n        }\r\n        \r\n        // init proceudre type\r\n        RDIM_Type *type     = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind          = RDI_TypeKind_Function;\r\n        type->byte_size     = arch_addr_size;\r\n        type->direct_type   = ret_type;\r\n        type->count         = param_list.count;\r\n        type->param_types   = rdim_array_from_type_list(arena, param_list);\r\n        \r\n        d2r_tag_iter_skip_children(it);\r\n      }break;\r\n      \r\n      case DW_TagKind_Typedef:\r\n      {\r\n        RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        RDIM_Type *type        = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind        = RDI_TypeKind_Alias;\r\n        type->name        = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n        type->direct_type = direct_type;\r\n        for (RDIM_Type *n = direct_type; n != 0; n = n->direct_type) {\r\n          if (n->byte_size) {\r\n            type->byte_size = n->byte_size;\r\n            break;\r\n          }\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_BaseType:\r\n      {\r\n        DW_ATE encoding = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Encoding);\r\n        U64 byte_size = dw_byte_size_from_tag(input, cu, tag);\r\n        \r\n        // rjf: attribute type encoding -> RDI type kind\r\n        RDI_TypeKind kind = RDI_TypeKind_NULL;\r\n        switch(encoding)\r\n        {\r\n          default:{}break;\r\n          case DW_ATE_Null:    {kind = RDI_TypeKind_NULL;}break;\r\n          case DW_ATE_Boolean: {kind = RDI_TypeKind_Bool;}break;\r\n          case DW_ATE_ComplexFloat:\r\n          switch(byte_size)\r\n          {\r\n            case 4:  {kind = RDI_TypeKind_ComplexF32;}break;\r\n            case 8:  {kind = RDI_TypeKind_ComplexF64;}break;\r\n            case 10: {kind = RDI_TypeKind_ComplexF80;}break;\r\n            case 16: {kind = RDI_TypeKind_ComplexF128;}break;\r\n            default: {log_infof(\"Unsupported complex float size (%I64u) at 0x%I64x.\\n\", byte_size, tag.info_off);}break;\r\n          }break;\r\n          case DW_ATE_Float:\r\n          switch(byte_size)\r\n          {\r\n            case 2:  {kind = RDI_TypeKind_F16; }break;\r\n            case 4:  {kind = RDI_TypeKind_F32; }break;\r\n            case 6:  {kind = RDI_TypeKind_F48; }break;\r\n            case 8:  {kind = RDI_TypeKind_F64; }break;\r\n            case 16: {kind = RDI_TypeKind_F128;}break;\r\n            default: {log_infof(\"Unsupported float size (%I64u) at 0x%I64x.\\n\", byte_size, tag.info_off);}break;\r\n          }break;\r\n          case DW_ATE_Signed:\r\n          switch(byte_size)\r\n          {\r\n            case 1:  {kind = RDI_TypeKind_S8;  }break;\r\n            case 2:  {kind = RDI_TypeKind_S16; }break;\r\n            case 4:  {kind = RDI_TypeKind_S32; }break;\r\n            case 8:  {kind = RDI_TypeKind_S64; }break;\r\n            case 16: {kind = RDI_TypeKind_S128;}break;\r\n            case 32: {kind = RDI_TypeKind_S256;}break;\r\n            case 64: {kind = RDI_TypeKind_S512;}break;\r\n            default: {log_infof(\"Unsupported signed integer size (%I64u) at 0x%I64x.\\n\", byte_size, tag.info_off);}break;\r\n          }break;\r\n          case DW_ATE_SignedChar:\r\n          switch(byte_size)\r\n          {\r\n            case 1: {kind = RDI_TypeKind_Char8; }break;\r\n            case 2: {kind = RDI_TypeKind_Char16;}break;\r\n            case 4: {kind = RDI_TypeKind_Char32;}break;\r\n            default:{log_infof(\"Unsupported signed character size (%I64u) at 0x%I64x.\\n\", byte_size, tag.info_off);}break;\r\n          }break;\r\n          case DW_ATE_Address:\r\n          case DW_ATE_Unsigned:\r\n          switch(byte_size)\r\n          {\r\n            case 1:  {kind = RDI_TypeKind_U8;  }break;\r\n            case 2:  {kind = RDI_TypeKind_U16; }break;\r\n            case 4:  {kind = RDI_TypeKind_U32; }break;\r\n            case 8:  {kind = RDI_TypeKind_U64; }break;\r\n            case 16: {kind = RDI_TypeKind_U128;}break;\r\n            case 32: {kind = RDI_TypeKind_U256;}break;\r\n            case 64: {kind = RDI_TypeKind_U512;}break;\r\n            default:{log_infof(\"Unsupported unsigned integer size (%I64u) at 0x%I64x.\\n\", byte_size, tag.info_off);}break;\r\n          }break;\r\n          case DW_ATE_UnsignedChar:\r\n          switch(byte_size)\r\n          {\r\n            case 1: {kind = RDI_TypeKind_UChar8; }break;\r\n            case 2: {kind = RDI_TypeKind_UChar16;}break;\r\n            case 4: {kind = RDI_TypeKind_UChar32;}break;\r\n            default:{log_infof(\"Unsupported unsigned character size (%I64u) at 0x%I64x.\\n\", byte_size, tag.info_off);}break;\r\n          }break;\r\n          case DW_ATE_ImaginaryFloat:\r\n          case DW_ATE_PackedDecimal:\r\n          case DW_ATE_NumericString:\r\n          case DW_ATE_Edited:\r\n          case DW_ATE_SignedFixed:\r\n          case DW_ATE_UnsignedFixed:\r\n          case DW_ATE_DecimalFloat:\r\n          case DW_ATE_Utf:\r\n          case DW_ATE_Ucs:\r\n          case DW_ATE_Ascii:\r\n          {\r\n            // TODO(rjf): not implemented\r\n          }break;\r\n        }\r\n        \r\n        // rjf: build\r\n        RDIM_Type *type   = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind        = RDI_TypeKind_Alias;\r\n        type->name        = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n        type->direct_type = type_table->builtin_types[kind];\r\n        type->byte_size   = byte_size;\r\n      }break;\r\n      \r\n      case DW_TagKind_PointerType:\r\n      {\r\n        RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        \r\n        // TODO:\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Allocated));\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Associated));\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment));\r\n        // TODO(rjf): this is not an invalid case; it shows up in `mule_main` pointer types\r\n        // Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name));\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_AddressClass));\r\n        \r\n        U64 byte_size = arch_addr_size;\r\n        dw_try_byte_size_from_tag(input, cu, tag, &byte_size);\r\n        \r\n        RDIM_Type *type   = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind        = RDI_TypeKind_Ptr;\r\n        type->byte_size   = byte_size;\r\n        type->direct_type = direct_type;\r\n      }break;\r\n      \r\n      case DW_TagKind_RestrictType:\r\n      {\r\n        // TODO:\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment));\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name));\r\n        \r\n        RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        RDIM_Type *type        = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind        = RDI_TypeKind_Modifier;\r\n        type->byte_size   = arch_addr_size;\r\n        type->flags       = RDI_TypeModifierFlag_Restrict;\r\n        type->direct_type = direct_type;\r\n      }break;\r\n      \r\n      case DW_TagKind_VolatileType:\r\n      {\r\n        // TODO:\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name));\r\n        \r\n        RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        RDIM_Type *type        = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind        = RDI_TypeKind_Modifier;\r\n        type->byte_size   = arch_addr_size;\r\n        type->flags       = RDI_TypeModifierFlag_Volatile;\r\n        type->direct_type = direct_type;\r\n      }break;\r\n      \r\n      case DW_TagKind_ConstType:\r\n      {\r\n        // TODO:\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Name));\r\n        Assert(!dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Alignment));\r\n        \r\n        RDIM_Type *direct_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        RDIM_Type *type        = d2r_create_type_from_offset(arena, type_table, tag.info_off);\r\n        type->kind        = RDI_TypeKind_Modifier;\r\n        type->byte_size   = arch_addr_size;\r\n        type->flags       = RDI_TypeModifierFlag_Const;\r\n        type->direct_type = direct_type;\r\n      }break;\r\n      \r\n      case DW_TagKind_ArrayType:\r\n      {\r\n        // * DWARF vs RDI Array Type Graph *\r\n        //\r\n        // For example lets take following decl:\r\n        //\r\n        //    int (*foo[2])[3];\r\n        // \r\n        //  This compiles to in DWARF:\r\n        //  \r\n        //  foo -> DW_TAG_ArrayType -> (A0) DW_TAG_Subrange [2]\r\n        //                          \\\r\n        //                           -> (B0) DW_TAG_PointerType -> (A1) DW_TAG_ArrayType -> DW_TAG_Subrange [3]\r\n        //                                                      \\\r\n        //                                                       -> (B1) DW_TAG_BaseType (int)\r\n        // \r\n        // RDI expects:\r\n        //  \r\n        //  foo -> Array[2] -> Pointer -> Array[3] -> int\r\n        //\r\n        // Note that DWARF forks the graph on DW_TAG_ArrayType to describe array ranges in branch A and\r\n        // in branch B describes array type which might be a struct, pointer, base type, or any other type tag.\r\n        // However, in RDI we have a simple list of type nodes and to convert we need to append type nodes from\r\n        // B to A.\r\n        struct SubrangeNode { struct SubrangeNode *next; U64 count; };\r\n        struct SubrangeNode *subrange_stack = 0;\r\n        for (DW_TagNode *n = tag_node->first_child; n != 0; n = n->sibling) {\r\n          if (n->tag.kind != DW_TagKind_SubrangeType) {\r\n            // TODO: error handling\r\n            AssertAlways(!\"unexpected tag\");\r\n            continue;\r\n          }\r\n          \r\n          // resolve lower bound\r\n          U64 lower_bound = 0;\r\n          if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_LowerBound)) {\r\n            lower_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_LowerBound);\r\n          } else {\r\n            lower_bound = dw_pick_default_lower_bound(cu_lang);\r\n          }\r\n          \r\n          // resolve upper bound\r\n          U64 upper_bound = 0;\r\n          if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_Count)) {\r\n            U64 count = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_Count);\r\n            upper_bound = lower_bound + count;\r\n          } else if (dw_tag_has_attrib(input, cu, n->tag, DW_AttribKind_UpperBound)) {\r\n            upper_bound = dw_u64_from_attrib(input, cu, n->tag, DW_AttribKind_UpperBound);\r\n            // turn upper bound into exclusive range\r\n            upper_bound += 1;\r\n          } else {\r\n            // zero sized array\r\n          }\r\n          \r\n          struct SubrangeNode *s = push_array(scratch.arena, struct SubrangeNode, 1);\r\n          s->count = upper_bound - lower_bound;\r\n          SLLStackPush(subrange_stack, s);\r\n        }\r\n        \r\n        RDIM_Type *array_base_type = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n        RDIM_Type *direct_type     = array_base_type;\r\n        U64        size_cursor     = array_base_type->byte_size;\r\n        for EachNode(s, struct SubrangeNode, subrange_stack) {\r\n          size_cursor *= s->count;\r\n          \r\n          RDIM_Type *t;\r\n          if (s->next) { t = d2r_create_type(arena, type_table); }\r\n          else         { t = d2r_create_type_from_offset(arena, type_table, tag.info_off); }\r\n          \r\n          t->kind        = RDI_TypeKind_Array;\r\n          t->direct_type = direct_type;\r\n          t->byte_size   = size_cursor;\r\n          t->count       = s->count;\r\n          \r\n          direct_type = t;\r\n        }\r\n        \r\n        d2r_tag_iter_skip_children(it);\r\n      }break;\r\n      \r\n      case DW_TagKind_SubrangeType:\r\n      {\r\n        // TODO: error handling\r\n        AssertAlways(!\"unexpected tag\");\r\n      }break;\r\n      \r\n      case DW_TagKind_Inheritance:\r\n      {\r\n        DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n        if (parent_tag.kind != DW_TagKind_StructureType && parent_tag.kind != DW_TagKind_ClassType) {\r\n          // TODO: error handling\r\n          AssertAlways(!\"unexpected parent tag\");\r\n        }\r\n        \r\n        RDIM_Type      *parent = d2r_type_from_offset(type_table, parent_tag.info_off);\r\n        if(parent->udt != 0)\r\n        {\r\n          RDIM_Type      *type   = d2r_find_or_convert_type(arena, type_table, input, cu, cu_lang, arch_addr_size, tag, DW_AttribKind_Type);\r\n          RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, parent->udt);\r\n          member->kind           = RDI_MemberKind_Base;\r\n          member->type           = type;\r\n          member->off            = safe_cast_u32(dw_const_u32_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation));\r\n        }\r\n      }break;\r\n      \r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nd2r_convert_udts(Arena         *arena,\r\n                 D2R_TypeTable *type_table,\r\n                 DW_Input      *input,\r\n                 DW_CompUnit   *cu,\r\n                 DW_Language    cu_lang,\r\n                 U64            arch_addr_size,\r\n                 DW_TagNode    *root)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root);\r\n      it->tag_node != 0;\r\n      d2r_tag_iter_next(scratch.arena, it))\r\n  {\r\n    DW_TagNode *tag_node = it->tag_node;\r\n    DW_Tag      tag      = tag_node->tag;\r\n    switch (tag.kind) {\r\n      case DW_TagKind_ClassType: {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if (is_decl) {\r\n          d2r_tag_iter_skip_children(it);\r\n        } else {\r\n          RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);\r\n          RDIM_UDT  *udt  = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);\r\n          udt->self_type = type;\r\n          type->udt      = udt;\r\n        }\r\n      } break;\r\n      case DW_TagKind_StructureType: {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if (is_decl) {\r\n          d2r_tag_iter_skip_children(it);\r\n        } else {\r\n          RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);\r\n          RDIM_UDT  *udt  = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);\r\n          udt->self_type = type;\r\n          type->udt      = udt;\r\n        }\r\n      } break;\r\n      case DW_TagKind_UnionType: {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if (is_decl) {\r\n          d2r_tag_iter_skip_children(it);\r\n        } else {\r\n          RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);\r\n          RDIM_UDT  *udt  = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);\r\n          udt->self_type = type;\r\n          type->udt      = udt;\r\n        }\r\n      } break;\r\n      case DW_TagKind_EnumerationType: {\r\n        B32 is_decl = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Declaration);\r\n        if (is_decl) {\r\n          d2r_tag_iter_skip_children(it);\r\n        } else {\r\n          RDIM_Type *type = d2r_type_from_offset(type_table, tag.info_off);\r\n          RDIM_UDT  *udt  = rdim_udt_chunk_list_push(arena, &udts, UDT_CHUNK_CAP);\r\n          udt->self_type = type;\r\n          type->udt      = udt;\r\n        }\r\n      } break;\r\n      case DW_TagKind_Member: {\r\n        DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n        B32 is_parent_udt = parent_tag.kind == DW_TagKind_StructureType ||\r\n          parent_tag.kind == DW_TagKind_ClassType     ||\r\n          parent_tag.kind == DW_TagKind_UnionType;\r\n        if (is_parent_udt) {\r\n          DW_Attrib      *data_member_location       = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_DataMemberLocation);\r\n          DW_AttribClass  data_member_location_class = dw_value_class_from_attrib(cu, data_member_location);\r\n          if (data_member_location_class == DW_AttribClass_LocList) {\r\n            AssertAlways(!\"UDT member with multiple locations are not supported\");\r\n          }\r\n          \r\n          RDIM_Type      *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off);\r\n          RDIM_UDTMember *udt_member  = rdim_udt_push_member(arena, &udts, parent_type->udt);\r\n          udt_member->kind = RDI_MemberKind_DataField;\r\n          udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          udt_member->type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);\r\n          udt_member->off  = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_DataMemberLocation);\r\n        } else {\r\n          // TODO: error handling\r\n          AssertAlways(!\"unexpected parent tag\");\r\n        }\r\n      } break;\r\n      case DW_TagKind_Enumerator: {\r\n        DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n        if (parent_tag.kind == DW_TagKind_EnumerationType) {\r\n          RDIM_Type       *parent_type = d2r_type_from_offset(type_table, parent_tag.info_off);\r\n          RDIM_UDTEnumVal *udt_member  = rdim_udt_push_enum_val(arena, &udts, parent_type->udt);\r\n          udt_member->name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          udt_member->val  = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_ConstValue);\r\n        } else {\r\n          // TODO: error handling\r\n          AssertAlways(!\"unexpected parent tag\");\r\n        }\r\n      } break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nd2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  for(D2R_TagIter *it = d2r_tag_iter_init(scratch.arena, root);\r\n      it->tag_node != 0;\r\n      d2r_tag_iter_next(scratch.arena, it))\r\n  {\r\n    DW_TagNode *tag_node = it->tag_node;\r\n    DW_Tag      tag      = tag_node->tag;\r\n    switch(tag.kind)\r\n    {\r\n      case DW_TagKind_Null:{}break;\r\n      \r\n      case DW_TagKind_ClassType:\r\n      case DW_TagKind_StructureType:\r\n      case DW_TagKind_UnionType:\r\n      {\r\n        // TODO(rjf): visit children to collect methods and variables\r\n      }break;\r\n      \r\n      case DW_TagKind_EnumerationType:\r\n      case DW_TagKind_SubroutineType:\r\n      case DW_TagKind_Typedef:\r\n      case DW_TagKind_BaseType:\r\n      case DW_TagKind_PointerType:\r\n      case DW_TagKind_RestrictType:\r\n      case DW_TagKind_VolatileType:\r\n      case DW_TagKind_ConstType:\r\n      case DW_TagKind_ArrayType:\r\n      case DW_TagKind_SubrangeType:\r\n      case DW_TagKind_Inheritance:\r\n      case DW_TagKind_Enumerator:\r\n      case DW_TagKind_Member:\r\n      {\r\n        d2r_tag_iter_skip_children(it);\r\n      }break;\r\n      \r\n      case DW_TagKind_SubProgram:\r\n      {\r\n        DW_InlKind inl = DW_Inl_NotInlined;\r\n        if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_Inline)) { inl = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Inline); }\r\n        switch(inl)\r\n        {\r\n          case DW_Inl_NotInlined:\r\n          {\r\n            U64         param_count = 0;\r\n            RDIM_Type **params      = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, &param_count);\r\n            \r\n            // get return type\r\n            RDIM_Type *ret_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);\r\n            \r\n            // fill out proc type\r\n            RDIM_Type *proc_type   = d2r_create_type(arena, type_table);\r\n            proc_type->kind        = RDI_TypeKind_Function;\r\n            proc_type->byte_size   = arch_addr_size;\r\n            proc_type->direct_type = ret_type;\r\n            proc_type->count       = param_count;\r\n            proc_type->param_types = params;\r\n            \r\n            // get container type\r\n            RDIM_Type *container_type = 0;\r\n            if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) {\r\n              container_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType);\r\n            }\r\n            \r\n            // get frame base expression\r\n            String8 frame_base_expr = dw_exprloc_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_FrameBase);\r\n            \r\n            // get proc container symbol\r\n            RDIM_Symbol *proc = rdim_symbol_chunk_list_push(arena, &procs,  PROC_CHUNK_CAP);\r\n            \r\n            // make scope\r\n            Rng1U64List  ranges     = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag);\r\n            RDIM_Scope  *root_scope = d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges);\r\n            root_scope->symbol      = proc;\r\n            \r\n            // fill out proc\r\n            proc->is_extern        = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External);\r\n            proc->name             = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n            proc->link_name        = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName);\r\n            proc->type             = proc_type;\r\n            proc->container_symbol = 0;\r\n            proc->container_type   = container_type;\r\n            proc->root_scope       = root_scope;\r\n            proc->location_cases   = d2r_locset_from_attrib(arena, &scopes, root_scope, &locations, input, cu, image_base, arch, tag, DW_AttribKind_FrameBase);\r\n            \r\n            // sub program with user-defined parent tag is a method\r\n            DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n            if (parent_tag.kind == DW_TagKind_ClassType || parent_tag.kind == DW_TagKind_StructureType) {\r\n              RDI_MemberKind    member_kind = RDI_MemberKind_NULL;\r\n              DW_VirtualityKind virtuality  = dw_const_u64_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Virtuality);\r\n              switch (virtuality) {\r\n                case DW_VirtualityKind_None:        member_kind = RDI_MemberKind_Method;        break;\r\n                case DW_VirtualityKind_Virtual:     member_kind = RDI_MemberKind_VirtualMethod; break;\r\n                case DW_VirtualityKind_PureVirtual: member_kind = RDI_MemberKind_VirtualMethod; break; // TODO: create kind for pure virutal\r\n                //default: InvalidPath; break;\r\n              }\r\n              \r\n              RDIM_Type      *type   = d2r_type_from_offset(type_table, parent_tag.info_off);\r\n              RDIM_UDTMember *member = rdim_udt_push_member(arena, &udts, type->udt);\r\n              member->kind           = member_kind;\r\n              member->type           = type;\r\n              member->name           = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n            } else if (parent_tag.kind != DW_TagKind_CompileUnit) {\r\n              //AssertAlways(!\"unexpected tag\");\r\n            }\r\n            \r\n            it->stack->scope = root_scope;\r\n          }break;\r\n          case DW_Inl_DeclaredNotInlined:\r\n          case DW_Inl_DeclaredInlined:\r\n          case DW_Inl_Inlined:\r\n          {\r\n            d2r_tag_iter_skip_children(it);\r\n          }break;\r\n          default:{}break;\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_InlinedSubroutine:\r\n      {\r\n        U64         param_count = 0;\r\n        RDIM_Type **params      = d2r_collect_proc_params(arena, type_table, input, cu, tag_node, &param_count);\r\n        \r\n        // get return type\r\n        RDIM_Type *ret_type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);\r\n        \r\n        // fill out proc type\r\n        RDIM_Type *proc_type   = d2r_create_type(arena, type_table);\r\n        proc_type->kind        = RDI_TypeKind_Function;\r\n        proc_type->byte_size   = arch_addr_size;\r\n        proc_type->direct_type = ret_type;\r\n        proc_type->count       = param_count;\r\n        proc_type->param_types = params;\r\n        \r\n        // get container type\r\n        RDIM_Type *owner = 0;\r\n        if (dw_tag_has_attrib(input, cu, tag, DW_AttribKind_ContainingType)) {\r\n          owner = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_ContainingType);\r\n        }\r\n        \r\n        // fill out inline site\r\n        RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, &inline_sites, INLINE_SITE_CHUNK_CAP);\r\n        inline_site->name            = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n        inline_site->type            = proc_type;\r\n        inline_site->owner           = owner;\r\n        inline_site->line_table      = 0;\r\n        \r\n        // make scope\r\n        Rng1U64List  ranges     = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag);\r\n        RDIM_Scope  *root_scope = d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges);\r\n        root_scope->inline_site = inline_site;\r\n      }break;\r\n      \r\n      case DW_TagKind_Variable:\r\n      {\r\n        String8    name = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n        RDIM_Type *type = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);\r\n        \r\n        DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n        if (parent_tag.kind == DW_TagKind_SubProgram ||\r\n            parent_tag.kind == DW_TagKind_InlinedSubroutine ||\r\n            parent_tag.kind == DW_TagKind_LexicalBlock) {\r\n          RDIM_Scope *scope = it->stack->next->scope;\r\n          RDIM_Local *local = rdim_scope_push_local(arena, &scopes, scope);\r\n          local->kind           = RDI_LocalKind_Variable;\r\n          local->name           = name;\r\n          local->type           = type;\r\n          local->location_cases = d2r_var_locset_from_tag(arena, &scopes, scope, &locations, input, cu, image_base, arch, tag);\r\n        } else {\r\n          \r\n          // NOTE: due to a bug in clang in stb_sprint.h local variables\r\n          // are declared in global scope without a name\r\n          if (name.size == 0) { break; }\r\n          \r\n          U64 voff          = max_U64;\r\n          B32 is_thread_var = 0;\r\n          {\r\n            DW_Attrib      *loc_attrib = dw_attrib_from_tag(input, cu, tag, DW_AttribKind_Location);\r\n            DW_AttribClass  loc_class  = dw_value_class_from_attrib(cu, loc_attrib);\r\n            if (loc_class == DW_AttribClass_ExprLoc) {\r\n              Temp temp = temp_begin(scratch.arena);\r\n              \r\n              String8           expr      = dw_exprloc_from_attrib(input, cu, loc_attrib);\r\n              D2R_ValueType     expr_type = 0;\r\n              RDIM_EvalBytecode bc        = d2r_bytecode_from_expression(temp.arena, input, image_base, arch_addr_size, arch, cu->addr_lu, expr, cu, &expr_type);\r\n              \r\n              // evaluate bytecode to virutal offset if possible\r\n              if (expr_type == D2R_ValueType_Address) {\r\n                B32 is_static = rdim_is_eval_bytecode_static(bc);\r\n                if (is_static) {\r\n                  voff = rdim_virt_off_from_eval_bytecode(bc, image_base);\r\n                }\r\n              }\r\n              \r\n              // is this a thread variable?\r\n              is_thread_var = rdim_is_bytecode_tls_dependent(bc);\r\n              \r\n              temp_end(temp);\r\n            }\r\n          }\r\n          \r\n          RDIM_SymbolChunkList *var_chunks; U64 var_chunks_cap;\r\n          if (is_thread_var) { var_chunks = &tvars; var_chunks_cap = TVAR_CHUNK_CAP; }\r\n          else               { var_chunks = &gvars; var_chunks_cap = GVAR_CHUNK_CAP; }\r\n          \r\n          RDIM_Symbol *var = rdim_symbol_chunk_list_push(arena, var_chunks, var_chunks_cap);\r\n          var->is_extern        = dw_flag_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_External);\r\n          var->name             = name;\r\n          var->link_name        = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_LinkageName);\r\n          var->type             = type;\r\n          var->offset           = voff;\r\n          var->container_symbol = 0;\r\n          var->container_type   = 0; // TODO: NotImplemented;\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_FormalParameter:\r\n      {\r\n        DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n        if (parent_tag.kind == DW_TagKind_SubProgram || parent_tag.kind == DW_TagKind_InlinedSubroutine) {\r\n          RDIM_Scope *scope = it->stack->next->scope;\r\n          RDIM_Local *param = rdim_scope_push_local(arena, &scopes, scope);\r\n          param->kind           = RDI_LocalKind_Parameter;\r\n          param->name           = dw_string_from_tag_attrib_kind(input, cu, tag, DW_AttribKind_Name);\r\n          param->type           = d2r_type_from_attrib(type_table, input, cu, tag, DW_AttribKind_Type);\r\n          param->location_cases = d2r_var_locset_from_tag(arena, &scopes, scope, &locations, input, cu, image_base, arch, tag);\r\n        }\r\n        else\r\n        {\r\n          // TODO: error handling; this is a local variable\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_LexicalBlock:\r\n      {\r\n        DW_Tag parent_tag = d2r_tag_iter_parent_tag(it);\r\n        if(parent_tag.kind == DW_TagKind_SubProgram ||\r\n           parent_tag.kind == DW_TagKind_InlinedSubroutine ||\r\n           parent_tag.kind == DW_TagKind_LexicalBlock)\r\n        {\r\n          Rng1U64List ranges = d2r_range_list_from_tag(scratch.arena, input, cu, image_base, tag);\r\n          d2r_push_scope(arena, &scopes, SCOPE_CHUNK_CAP, it->stack, ranges);\r\n        }\r\n      }break;\r\n      \r\n      case DW_TagKind_CallSite:\r\n      {\r\n        // TODO\r\n      }break;\r\n      \r\n      case DW_TagKind_CallSiteParameter:\r\n      {\r\n        // TODO\r\n      }break;\r\n      \r\n      case DW_TagKind_Label:\r\n      case DW_TagKind_CompileUnit:\r\n      case DW_TagKind_UnspecifiedParameters:\r\n      case DW_TagKind_Namespace:\r\n      case DW_TagKind_ImportedDeclaration:\r\n      case DW_TagKind_PtrToMemberType:\r\n      case DW_TagKind_TemplateTypeParameter:\r\n      case DW_TagKind_ReferenceType:\r\n      {\r\n        // TODO\r\n      }break;\r\n      \r\n      default:\r\n      {\r\n        // NotImplemented;\r\n      }break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Conversion Entry Point\r\n\r\ninternal RDIM_BakeParams\r\nd2r_convert(Arena *arena, D2R_ConvertParams *params)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  if(lane_idx() == 0)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: compute exe hash\r\n    //\r\n    ProfBegin(\"compute exe hash\");\r\n    U64 exe_hash = rdi_hash(params->exe_data.str, params->exe_data.size);\r\n    ProfEnd();\r\n    \r\n    ////////////////////////////\r\n    //- rjf: unpack input image info\r\n    //\r\n    Arch arch = Arch_Null;\r\n    U64 image_base = 0;\r\n    DW_Input input = {0};\r\n    PathStyle path_style = PathStyle_Null;\r\n    switch(params->exe_kind)\r\n    {\r\n      default:{}break;\r\n      case ExecutableImageKind_CoffPe:\r\n      {\r\n        PE_BinInfo pe = pe_bin_info_from_data(scratch.arena, params->exe_data);\r\n        String8 raw_sections = str8_substr(params->exe_data, pe.section_table_range);\r\n        COFF_SectionHeader *section_table = str8_deserial_get_raw_ptr(raw_sections, 0, sizeof(COFF_SectionHeader) * pe.section_count);\r\n        String8 string_table = str8_substr(params->exe_data, pe.string_table_range);\r\n        arch = pe.arch;\r\n        image_base = pe.image_base;\r\n        binary_sections = c2r_rdi_binary_sections_from_coff_sections(arena, params->exe_data, string_table, pe.section_count, section_table);\r\n        input = dw_input_from_coff_section_table(scratch.arena, params->exe_data, string_table, pe.section_count, section_table);\r\n        path_style = PathStyle_WindowsAbsolute;\r\n      }break;\r\n      case ExecutableImageKind_Elf32:\r\n      case ExecutableImageKind_Elf64:\r\n      {\r\n        ELF_Bin bin = elf_bin_from_data(scratch.arena, params->dbg_data);\r\n        arch = arch_from_elf_machine(bin.hdr.e_machine);\r\n        image_base = (bin.hdr.e_type == ELF_Type_Dyn ? 0 : elf_base_addr_from_bin(&bin));\r\n        binary_sections = e2r_rdi_binary_sections_from_elf_section_table(arena, params->dbg_data, &bin, bin.shdrs);\r\n        input = dw_input_from_elf_bin(scratch.arena, params->dbg_data, &bin);\r\n        path_style = PathStyle_UnixAbsolute;\r\n      }break;\r\n    }\r\n    U64 arch_addr_size = rdi_addr_size_from_arch(arch);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: determine acceptable address range\r\n    //\r\n    // in many cases, linkers seem to trample over addresses in various DWARF sections,\r\n    // potentially due to optimizations. we'd like to filter out those busted addresses\r\n    // from our final debug info - a good enough heuristic is to disqualify them by\r\n    // whether or not they actually fall into the ranges covered by the binary sections.\r\n    //\r\n    Rng1U64 acceptable_vaddr_range = {0};\r\n    {\r\n      acceptable_vaddr_range.min = max_U64;\r\n      acceptable_vaddr_range.max = 0;\r\n      for EachNode(n, RDIM_BinarySectionNode, binary_sections.first)\r\n      {\r\n        acceptable_vaddr_range.min = Min(n->v.voff_first, acceptable_vaddr_range.min);\r\n        acceptable_vaddr_range.max = Max(n->v.voff_opl, acceptable_vaddr_range.max);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: unpack input image info\r\n    //\r\n    {\r\n      // rjf: base arch -> rdi\r\n      RDI_Arch arch_rdi = RDI_Arch_NULL;\r\n      switch(arch)\r\n      {\r\n        case Arch_Null:\r\n        case Arch_arm64:\r\n        case Arch_arm32:\r\n        case Arch_COUNT:\r\n        {}break;\r\n        case Arch_x64:{arch_rdi = RDI_Arch_X64;}break;\r\n        case Arch_x86:{arch_rdi = RDI_Arch_X86;}break;\r\n      }\r\n      \r\n      // rjf: binary sections -> voff max\r\n      U64 exe_voff_max = 0;\r\n      for EachNode(sect_n, RDIM_BinarySectionNode, binary_sections.first)\r\n      {\r\n        exe_voff_max = Max(exe_voff_max, sect_n->v.voff_opl);\r\n      }\r\n      \r\n      // rjf: fill\r\n      top_level_info.arch          = arch_rdi;\r\n      top_level_info.exe_name      = params->exe_name;\r\n      top_level_info.exe_hash      = exe_hash;\r\n      top_level_info.voff_max      = exe_voff_max;\r\n      if(!params->deterministic)\r\n      {\r\n        // TODO(rjf): top_level_info.guid = ...;\r\n        top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse unit contribution map\r\n    //\r\n    D2R_CompUnitContribMap cu_contrib_map = {0};\r\n    ProfScope(\"parse unit contribution map\")\r\n    {\r\n      String8 aranges_data = input.sec[DW_Section_ARanges].data;\r\n      if(aranges_data.size != 0)\r\n      {\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        \r\n        //- rjf: unpack input\r\n        Rng1U64List unit_range_list = dw_unit_ranges_from_data(scratch.arena, aranges_data);\r\n        \r\n        //- rjf: set up map\r\n        cu_contrib_map.info_off_arr = push_array(arena, U64, unit_range_list.count);\r\n        cu_contrib_map.voff_range_arr = push_array(arena, RDIM_Rng1U64ChunkList, unit_range_list.count);\r\n        \r\n        //- rjf: convert all units\r\n        for EachNode(range_n, Rng1U64Node, unit_range_list.first)\r\n        {\r\n          //- rjf: unpack unit\r\n          String8 unit_data = str8_substr(aranges_data, range_n->v);\r\n          U64 unit_cursor    = 0;\r\n          \r\n          //- rjf: read unit data length\r\n          U64 unit_length = 0;\r\n          U64 unit_length_size = str8_deserial_read_dwarf_packed_size(unit_data, unit_cursor, &unit_length);\r\n          B32 unit_length_good = (unit_length_size != 0);\r\n          unit_cursor += unit_length_size;\r\n          DW_Format unit_format = DW_FormatFromSize(unit_length);\r\n          \r\n          //- rjf: read unit version\r\n          DW_Version version = 0;\r\n          U64 version_size = str8_deserial_read_struct(unit_data, unit_cursor, &version);\r\n          B32 version_good = (version_size != 0);\r\n          unit_cursor += version_size;\r\n          \r\n          //- rjf: parse section by version\r\n          switch(version)\r\n          {\r\n            //- rjf: unsupported versions\r\n            default:\r\n            {\r\n              log_infof(\"Unknown .debug_aranges version (%i).\\n\", version);\r\n            }break;\r\n            \r\n            //- rjf: version 2\r\n            case DW_Version_2:\r\n            {\r\n              // rjf: unpack & read unit header info\r\n              U64 unit_info_off = 0;\r\n              U8 unit_address_size = 0;\r\n              U8 unit_segment_selector_size = 0;\r\n              B32 unit_good = 0;\r\n              {\r\n                U64 unit_info_off_size = str8_deserial_read_dwarf_uint(unit_data, unit_cursor, unit_format, &unit_info_off);\r\n                unit_cursor += unit_info_off_size;\r\n                U64 unit_address_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_address_size);\r\n                unit_cursor += unit_address_size_size;\r\n                U64 unit_segment_selector_size_size = str8_deserial_read_struct(unit_data, unit_cursor, &unit_segment_selector_size);\r\n                unit_cursor += unit_segment_selector_size_size;\r\n                unit_good = (unit_info_off_size != 0 && unit_address_size_size != 0 && unit_segment_selector_size_size != 0);\r\n              }\r\n              U64 tuple_size = unit_address_size * 2 + unit_segment_selector_size;\r\n              \r\n              // rjf: align cursor to be divisible by the tuple size (see the February 13, 2017 spec)\r\n              {\r\n                U64 bytes_too_far_past_boundary = unit_cursor % tuple_size;\r\n                if(bytes_too_far_past_boundary > 0)\r\n                {\r\n                  unit_cursor += tuple_size - bytes_too_far_past_boundary;\r\n                }\r\n              }\r\n              \r\n              // rjf: read all ranges\r\n              RDIM_Rng1U64ChunkList voff_ranges = {0};\r\n              if(unit_segment_selector_size == 0)\r\n              {\r\n                for(;unit_cursor + unit_address_size*2 <= unit_data.size;)\r\n                {\r\n                  U64 segment = 0;\r\n                  U64 address = 0;\r\n                  U64 length  = 0;\r\n                  unit_cursor += str8_deserial_read(unit_data, unit_cursor, &segment, unit_segment_selector_size, Max(unit_segment_selector_size, 1));\r\n                  unit_cursor += str8_deserial_read(unit_data, unit_cursor, &address, unit_address_size, unit_address_size);\r\n                  unit_cursor += str8_deserial_read(unit_data, unit_cursor, &length, unit_address_size, unit_address_size);\r\n                  if((segment != 0 || address != 0 || length != 0) &&\r\n                     (contains_1u64(acceptable_vaddr_range, address) ||\r\n                      contains_1u64(acceptable_vaddr_range, address + length)))\r\n                  {\r\n                    RDIM_Rng1U64 range =\r\n                    {\r\n                      address - image_base,\r\n                      address - image_base + length,\r\n                    };\r\n                    rdim_rng1u64_chunk_list_push(arena, &voff_ranges, 256, range);\r\n                  }\r\n                  else\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              else\r\n              {\r\n                log_infof(\"Segment-relative addressing detected in .debug_aranges; this is not currently supported.\\n\");\r\n              }\r\n              \r\n              // rjf: store record\r\n              U64 map_idx = cu_contrib_map.count;\r\n              cu_contrib_map.info_off_arr[map_idx]   = unit_info_off;\r\n              cu_contrib_map.voff_range_arr[map_idx] = voff_ranges;\r\n              cu_contrib_map.count += 1;\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse list of comp units\r\n    //\r\n    DW_ListUnitInput lu_input = {0};\r\n    ProfScope(\"parse list of comp units\")\r\n    {\r\n      lu_input = dw_list_unit_input_from_input(scratch.arena, &input);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse comp unit ranges\r\n    //\r\n    Rng1U64Array cu_ranges = {0};\r\n    ProfScope(\"parse comp unit ranges\")\r\n    {\r\n      Rng1U64List cu_range_list = dw_unit_ranges_from_data(scratch.arena, input.sec[DW_Section_Info].data);\r\n      cu_ranges = rng1u64_array_from_list(scratch.arena, &cu_range_list);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse comp unit headers\r\n    //\r\n    DW_CompUnit *cu_arr = 0;\r\n    ProfScope(\"parse comp unit headers\")\r\n    {\r\n      // TODO(rjf): parse should always be relaxed. any verification checks we do\r\n      // should just be logged via log_info(...), and then the caller of this\r\n      // converter can collect those & display as necessary.\r\n      B32 is_parse_relaxed = 1;\r\n      cu_arr = push_array(scratch.arena, DW_CompUnit, cu_ranges.count);\r\n      for EachIndex(cu_idx, cu_ranges.count)\r\n      {\r\n        cu_arr[cu_idx] = dw_cu_from_info_off(scratch.arena, &input, lu_input, cu_ranges.v[cu_idx].min, is_parse_relaxed);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: parse line tables\r\n    //\r\n    DW_LineTableParseResult *cu_line_tables = push_array(scratch.arena, DW_LineTableParseResult, cu_ranges.count);\r\n    ProfScope(\"parse line tables\")\r\n    {\r\n      for EachIndex(cu_idx, cu_ranges.count)\r\n      {\r\n        DW_CompUnit *cu = &cu_arr[cu_idx];\r\n        String8 cu_stmt_list = dw_line_ptr_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_StmtList);\r\n        String8 cu_dir = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir);\r\n        String8 cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name);\r\n        cu_line_tables[cu_idx] = dw_parsed_line_table_from_data(scratch.arena, cu_stmt_list, &input, cu_dir, cu_name, cu->address_size, cu->str_offsets_lu);\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: convert line tables\r\n    //\r\n    RDIM_LineTable **cu_line_tables_rdi = 0;\r\n    ProfScope(\"convert line tables\")\r\n    {\r\n      HashTable *source_file_ht     = hash_table_init(scratch.arena, 0x4000);\r\n      cu_line_tables_rdi = push_array(scratch.arena, RDIM_LineTable *, cu_ranges.count);\r\n      for EachIndex(cu_idx, cu_ranges.count)\r\n      {\r\n        cu_line_tables_rdi[cu_idx] = rdim_line_table_chunk_list_push(arena, &line_tables, LINE_TABLE_CAP);\r\n        \r\n        DW_LineTableParseResult *line_table   = &cu_line_tables[cu_idx];\r\n        DW_LineVMFileArray      *dir_table    = &line_table->vm_header.dir_table;\r\n        DW_LineVMFileArray      *file_table   = &line_table->vm_header.file_table;\r\n        RDIM_SrcFile           **src_file_map = push_array(scratch.arena, RDIM_SrcFile *, file_table->count);\r\n        for EachIndex(file_idx, file_table->count)\r\n        {\r\n          DW_LineFile  *file                 = &file_table->v[file_idx];\r\n          String8       file_path            = dw_path_from_file_idx(scratch.arena, &line_table->vm_header, file_idx);\r\n          String8List   file_path_split      = str8_split_path(scratch.arena, file_path);\r\n          str8_path_list_resolve_dots_in_place(&file_path_split, path_style);\r\n          String8       file_path_resolved   = str8_path_list_join_by_style(scratch.arena, &file_path_split, path_style);\r\n          RDIM_SrcFile *src_file             = hash_table_search_path_raw(source_file_ht, file_path_resolved);\r\n          if(src_file == 0)\r\n          {\r\n            src_file       = rdim_src_file_chunk_list_push(arena, &src_files, SRC_FILE_CAP);\r\n            src_file->path = push_str8_copy(arena, file_path_resolved);\r\n            hash_table_push_path_raw(scratch.arena, source_file_ht, src_file->path, src_file);\r\n          }\r\n          src_file_map[file_idx] = src_file;\r\n        }\r\n        \r\n        for EachNode(line_seq, DW_LineSeqNode, line_table->first_seq)\r\n        {\r\n          if(line_seq->count == 0) {continue;}\r\n          \r\n          U64 *voffs     = push_array(arena, U64, line_seq->count);\r\n          U32 *line_nums = push_array(arena, U32, line_seq->count);\r\n          U16 *col_nums  = 0;\r\n          U64  line_idx  = 0;\r\n          \r\n          DW_LineNode *file_line_n     = line_seq->first;\r\n          U64          file_line_count = 0;\r\n          \r\n          for EachNode(line_n, DW_LineNode, file_line_n)\r\n          {\r\n            if(file_line_n->v.file_index != line_n->v.file_index || line_n->next == 0)\r\n            {\r\n              U64  file_index     = file_line_n->v.file_index;\r\n              U64 *file_voffs     = &voffs[line_idx];\r\n              U32 *file_line_nums = &line_nums[line_idx];\r\n              U16 *file_col_nums  = 0;\r\n              \r\n              U64          lines_written = 0;\r\n              U64          prev_ln       = max_U64;\r\n              DW_LineNode *sentinel      = line_n->v.file_index != file_line_n->v.file_index ? line_n : 0;\r\n              for(; file_line_n != sentinel; file_line_n = file_line_n->next)\r\n              {\r\n                if(file_line_n->v.line != prev_ln)\r\n                {\r\n                  if(file_line_n->v.address == 0) {continue;}\r\n                  \r\n                  voffs[line_idx] = file_line_n->v.address;\r\n                  line_nums[line_idx] = file_line_n->v.line;\r\n                  \r\n                  lines_written += 1;\r\n                  line_idx += 1;\r\n                  \r\n                  prev_ln = file_line_n->v.line;\r\n                }\r\n              }\r\n              \r\n              RDIM_SrcFile      *src_file = src_file_map[file_index];\r\n              RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, lines_written);\r\n              rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq);\r\n              \r\n              file_line_count = 1;\r\n            }\r\n            else\r\n            {\r\n              file_line_count += 1;\r\n            }\r\n          }\r\n          \r\n          // handle last line\r\n          if(file_line_n)\r\n          {\r\n            U64  file_index     = file_line_n->v.file_index;\r\n            U64 *file_voffs     = &voffs[line_idx];\r\n            U32 *file_line_nums = &line_nums[line_idx];\r\n            U16 *file_col_nums  = 0;\r\n            for(;file_line_n != 0; file_line_n = file_line_n->next, line_idx += 1)\r\n            {\r\n              // NOTE(rjf): DWARF encodes line info as \"relocatable addresses\"; we do *not*\r\n              // need to translate from 'addresses' to 'voffs' with the image base here.\r\n              voffs[line_idx]     = file_line_n->v.address;\r\n              line_nums[line_idx] = file_line_n->v.line;\r\n            }\r\n            RDIM_SrcFile      *src_file = src_file_map[file_index];\r\n            RDIM_LineSequence *line_seq = rdim_line_table_push_sequence(arena, &line_tables, cu_line_tables_rdi[cu_idx], src_file, file_voffs, file_line_nums, file_col_nums, file_line_count);\r\n            rdim_src_file_push_line_sequence(arena, &src_files, src_file, line_seq);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build built-in basic types\r\n    //\r\n    RDIM_Type *builtin_types[RDI_TypeKind_Count] = {0};\r\n    ProfScope(\"build built-in basic types\")\r\n    {\r\n      for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn; type_kind <= RDI_TypeKind_LastBuiltIn; type_kind += 1)\r\n      {\r\n        RDIM_Type *type = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP);\r\n        type->kind      = type_kind;\r\n        type->name.str  = rdi_string_from_type_kind(type_kind, &type->name.size);\r\n        type->byte_size = rdi_size_from_basic_type_kind(type_kind);\r\n        builtin_types[type_kind] = type;\r\n      }\r\n      builtin_types[RDI_TypeKind_Handle]->byte_size = arch_addr_size;\r\n      builtin_types[RDI_TypeKind_Variadic] = rdim_type_chunk_list_push(arena, &types, TYPE_CHUNK_CAP);\r\n      builtin_types[RDI_TypeKind_Variadic]->kind = RDI_TypeKind_Variadic;\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: convert units\r\n    //\r\n    ProfScope(\"convert units\")\r\n    {\r\n      for EachIndex(cu_idx, cu_ranges.count)\r\n      {\r\n        Temp comp_temp = temp_begin(scratch.arena);\r\n        \r\n        DW_CompUnit *cu = &cu_arr[cu_idx];\r\n        \r\n        // parse and build tag tree\r\n        DW_TagTree tag_tree = dw_tag_tree_from_cu(comp_temp.arena, &input, cu);\r\n        \r\n        // skip DWO\r\n        {\r\n          if (cu->dwo_id) { goto next_cu; }\r\n          \r\n          String8 dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_DwoName);\r\n          if (dwo_name.size) { goto next_cu; }\r\n          \r\n          String8 gnu_dwo_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_GNU_DwoName);\r\n          if (gnu_dwo_name.size) { goto next_cu; }\r\n        }\r\n        \r\n        // build (info offset -> tag) hash table to resolve tags with abstract origin\r\n        cu->tag_ht = dw_make_tag_hash_table(comp_temp.arena, tag_tree);\r\n        \r\n        // extract compile unit info\r\n        String8     cu_name = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Name);\r\n        String8     cu_dir  = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_CompDir);\r\n        String8     cu_prod = dw_string_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Producer);\r\n        DW_Language cu_lang = dw_const_u64_from_tag_attrib_kind(&input, cu, cu->tag, DW_AttribKind_Language);\r\n        \r\n        // init type table\r\n        D2R_TypeTable *type_table   = push_array(comp_temp.arena, D2R_TypeTable, 1);\r\n        type_table->ht              = hash_table_init(comp_temp.arena, 0x4000);\r\n        type_table->types           = &types;\r\n        type_table->type_chunk_cap  = TYPE_CHUNK_CAP;\r\n        type_table->builtin_types   = builtin_types;\r\n        \r\n        // convert debug info\r\n        d2r_convert_types(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root);\r\n        d2r_convert_udts(arena, type_table, &input, cu, cu_lang, arch_addr_size, tag_tree.root);\r\n        d2r_convert_symbols(arena, type_table, &input, cu, cu_lang, arch_addr_size, image_base, arch, tag_tree.root);\r\n        \r\n        RDIM_Rng1U64ChunkList cu_voff_ranges = {0};\r\n        if(cu_idx < cu_contrib_map.count)\r\n        {\r\n          cu_voff_ranges = d2r_voff_ranges_from_cu_info_off(cu_contrib_map, cu_ranges.v[cu_idx].min);\r\n        }\r\n        else\r\n        {\r\n          Rng1U64List range_list  = d2r_range_list_from_tag(scratch.arena, &input, cu, image_base, cu->tag);\r\n          for EachNode(n, Rng1U64Node, range_list.first)\r\n          {\r\n            rdim_rng1u64_chunk_list_push(arena, &cu_voff_ranges, 512, (RDIM_Rng1U64){ .min = n->v.min, .max = n->v.max });\r\n          }\r\n        }\r\n        \r\n        // convert compile unit\r\n        {\r\n          RDIM_Unit *unit     = rdim_unit_chunk_list_push(arena, &units, UNIT_CHUNK_CAP);\r\n          unit->unit_name     = cu_name;\r\n          unit->compiler_name = cu_prod;\r\n          unit->source_file   = str8_zero(); // TODO\r\n          unit->object_file   = str8_zero(); // TODO\r\n          unit->archive_file  = str8_zero(); // TODO\r\n          unit->build_path    = cu_dir;\r\n          unit->language      = d2r_rdi_language_from_dw_language(cu_lang);\r\n          unit->line_table    = cu_line_tables_rdi[cu_idx];\r\n          unit->voff_ranges   = cu_voff_ranges;\r\n        }\r\n        \r\n        next_cu:;\r\n        temp_end(comp_temp);\r\n      }\r\n    }\r\n    \r\n  }\r\n  lane_sync();\r\n  RDIM_BakeParams bake_params  = {0};\r\n  bake_params.subset_flags     = params->subset_flags;\r\n  bake_params.top_level_info   = top_level_info;\r\n  bake_params.binary_sections  = binary_sections;\r\n  bake_params.units            = units;\r\n  bake_params.types            = types;\r\n  bake_params.udts             = udts;\r\n  bake_params.src_files        = src_files;\r\n  bake_params.line_tables      = line_tables;\r\n  bake_params.locations        = locations;\r\n  bake_params.global_variables = gvars;\r\n  bake_params.thread_variables = tvars;\r\n  bake_params.procedures       = procs;\r\n  bake_params.scopes           = scopes;\r\n  bake_params.inline_sites     = inline_sites;\r\n  scratch_end(scratch);\r\n  return bake_params;\r\n}\r\n"
  },
  {
    "path": "src/rdi_from_dwarf/rdi_from_dwarf.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RDI_FROM_DWARF_H\r\n#define RDI_FROM_DWARF_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Conversion Stage Inputs\r\n\r\ntypedef struct D2R_ConvertParams D2R_ConvertParams;\r\nstruct D2R_ConvertParams\r\n{\r\n  String8             dbg_name;\r\n  String8             dbg_data;\r\n  String8             exe_name;\r\n  String8             exe_data;\r\n  ExecutableImageKind exe_kind;\r\n  RDIM_SubsetFlags    subset_flags;\r\n  B32                 deterministic;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Conversion Helper Types\r\n\r\ntypedef struct D2R_TypeTable D2R_TypeTable;\r\nstruct D2R_TypeTable\r\n{\r\n  HashTable *ht;\r\n  RDIM_TypeChunkList  *types;\r\n  U64 type_chunk_cap;\r\n  RDIM_Type **builtin_types;\r\n};\r\n\r\ntypedef struct D2R_TagFrame D2R_TagFrame;\r\nstruct D2R_TagFrame\r\n{\r\n  DW_TagNode *node;\r\n  RDIM_Scope *scope;\r\n  struct D2R_TagFrame *next;\r\n};\r\n\r\ntypedef struct D2R_TagIter D2R_TagIter;\r\nstruct D2R_TagIter\r\n{\r\n  D2R_TagFrame *free_list;\r\n  D2R_TagFrame *stack;\r\n  DW_TagNode *tag_node;\r\n  DW_TagNode *root;\r\n  B32 visit_children;\r\n};\r\n\r\ntypedef struct D2R_CompUnitContribMap D2R_CompUnitContribMap;\r\nstruct D2R_CompUnitContribMap\r\n{\r\n  U64 count;\r\n  U64 *info_off_arr;\r\n  RDIM_Rng1U64ChunkList *voff_range_arr;\r\n};\r\n\r\n#define D2R_ValueType_IsSigned(x)   ((x) == D2R_ValueType_S8 || (x) == D2R_ValueType_S16 || (x) == D2R_ValueType_S32 || (x) == D2R_ValueType_S64 || (x) == D2R_ValueType_S128 || (x) == D2R_ValueType_S256 || (x) == D2R_ValueType_S512)\r\n#define D2R_ValueType_IsUnsigned(x) ((x) == D2R_ValueType_U8 || (x) == D2R_ValueType_U16 || (x) == D2R_ValueType_U32 || (x) == D2R_ValueType_U64 || (x) == D2R_ValueType_U128 || (x) == D2R_ValueType_U256 || (x) == D2R_ValueType_U512)\r\n#define D2R_ValueType_IsFloat(x)    ((x) == D2R_ValueType_F32 || (x) == D2R_ValueType_F64)\r\n#define D2R_ValueType_IsInt(x)      (D2R_ValueType_IsSigned(x) || D2R_ValueType_IsUnsigned(x) || (x) == D2R_ValueType_Address)\r\ntypedef enum D2R_ValueType\r\n{\r\n  D2R_ValueType_Generic,\r\n  D2R_ValueType_U8,\r\n  D2R_ValueType_U16,\r\n  D2R_ValueType_U32,\r\n  D2R_ValueType_U64,\r\n  D2R_ValueType_U128,\r\n  D2R_ValueType_U256,\r\n  D2R_ValueType_U512,\r\n  D2R_ValueType_S8,\r\n  D2R_ValueType_S16,\r\n  D2R_ValueType_S32,\r\n  D2R_ValueType_S64,\r\n  D2R_ValueType_S128,\r\n  D2R_ValueType_S256,\r\n  D2R_ValueType_S512,\r\n  D2R_ValueType_F32,\r\n  D2R_ValueType_F64,\r\n  D2R_ValueType_Address,\r\n  D2R_ValueType_ImplicitValue,\r\n  D2R_ValueType_Bool = D2R_ValueType_S8,\r\n} D2R_ValueType;\r\n\r\ntypedef struct D2R_ValueTypeNode\r\n{\r\n  D2R_ValueType type;\r\n  \r\n  struct D2R_ValueTypeNode *next;\r\n} D2R_ValueTypeNode;\r\n\r\ntypedef struct D2R_ValueTypeStack\r\n{\r\n  U64                count;\r\n  D2R_ValueTypeNode *top;\r\n  D2R_ValueTypeNode *free_list;\r\n} D2R_ValueTypeStack;\r\n\r\n////////////////////////////////\r\n//~ rjf: Enum Conversion Helpers\r\n\r\ninternal RDI_Language   d2r_rdi_language_from_dw_language(DW_Language v);\r\ninternal RDI_RegCodeX86 d2r_rdi_reg_code_from_dw_reg_x86(DW_RegX86 v);\r\ninternal RDI_RegCodeX64 d2r_rdi_reg_code_from_dw_reg_x64(DW_RegX64 v);\r\ninternal RDI_RegCode    d2r_rdi_reg_code_from_dw_reg(Arch arch, DW_Reg v);\r\n\r\n////////////////////////////////\r\n//~ rjf: Type Conversion Helpers\r\n\r\ninternal RDIM_Type *       d2r_create_type(Arena *arena, D2R_TypeTable *type_table);\r\ninternal RDIM_Type *       d2r_create_type_from_offset(Arena *arena, D2R_TypeTable *type_table, U64 info_off);\r\ninternal RDIM_Type *       d2r_type_from_offset(D2R_TypeTable *type_table, U64 info_off);\r\ninternal RDIM_Type *       d2r_type_from_attrib(D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Tag tag, DW_AttribKind kind);\r\ninternal Rng1U64List       d2r_range_list_from_tag(Arena *arena, DW_Input *input, DW_CompUnit *cu, U64 image_base, DW_Tag tag);\r\ninternal RDIM_Type **      d2r_collect_proc_params(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_TagNode *cur_node, U64 *param_count_out);\r\n\r\n////////////////////////////////\r\n//~ RDIM Bytecode Helpers\r\n\r\ninternal B32 rdim_is_eval_bytecode_static(RDIM_EvalBytecode bc);\r\ninternal U64 rdim_virt_off_from_eval_bytecode(RDIM_EvalBytecode bc, U64 image_base);\r\n\r\n////////////////////////////////\r\n//~ rjf: Bytecode Conversion Helpers\r\n\r\ninternal D2R_ValueTypeNode * d2r_value_type_stack_push(Arena *arena, D2R_ValueTypeStack *stack, D2R_ValueType type);\r\ninternal D2R_ValueType       d2r_value_type_stack_pop(D2R_ValueTypeStack *stack);\r\ninternal D2R_ValueType       d2r_value_type_stack_peek(D2R_ValueTypeStack *stack);\r\n\r\ninternal D2R_ValueType     d2r_unsigned_value_type_from_bit_size(U64 bit_size);\r\ninternal D2R_ValueType     d2r_signed_value_type_from_bit_size(U64 bit_size);\r\ninternal D2R_ValueType     d2r_float_type_from_bit_size(U64 bit_size);\r\ninternal RDI_EvalTypeGroup d2r_value_type_to_rdi(D2R_ValueType v);\r\ninternal U64               d2r_size_from_value_type(U64 addr_size, D2R_ValueType value_type);\r\ninternal D2R_ValueType     d2r_pick_common_value_type(D2R_ValueType lhs, D2R_ValueType rhs);\r\n\r\ninternal D2R_ValueType d2r_apply_usual_arithmetic_conversions(Arena *arena, D2R_ValueType lhs, D2R_ValueType rhs, RDIM_EvalBytecode *bc);\r\ninternal void          d2r_push_arithmetic_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op);\r\ninternal void          d2r_push_relational_op(Arena *arena, D2R_ValueTypeStack *stack, RDIM_EvalBytecode *bc, RDI_EvalOp op);\r\n\r\ninternal RDIM_EvalBytecode     d2r_bytecode_from_expression(Arena *arena, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, String8 expr, DW_CompUnit *cu, D2R_ValueType *result_type_out);\r\ninternal RDIM_Location *       d2r_transpile_expression(Arena *arena, RDIM_LocationChunkList *locations, DW_Input *input, U64 image_base, U64 address_size, Arch arch, DW_ListUnit *addr_lu, DW_CompUnit *cu, String8 expr);\r\ninternal RDIM_LocationCaseList d2r_locset_from_attrib(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag, DW_AttribKind kind);\r\ninternal RDIM_LocationCaseList d2r_var_locset_from_tag(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Scope *curr_scope, RDIM_LocationChunkList *locations, DW_Input *input, DW_CompUnit *cu, U64 image_base, Arch arch, DW_Tag tag);\r\n\r\n////////////////////////////////\r\n//~ rjf: Compilation Unit / Scope Conversion Helpers\r\n\r\ninternal RDIM_Rng1U64ChunkList d2r_voff_ranges_from_cu_info_off(D2R_CompUnitContribMap map, U64 info_off);\r\ninternal RDIM_Scope *d2r_push_scope(Arena *arena, RDIM_ScopeChunkList *scopes, U64 scope_chunk_cap, D2R_TagFrame *tag_stack, Rng1U64List ranges);\r\n\r\n////////////////////////////////\r\n//~ Tag Iterator\r\n\r\ninternal D2R_TagIter *d2r_tag_iter_init(Arena *arena, DW_TagNode *root);\r\ninternal void         d2r_tag_iter_next(Arena *arena, D2R_TagIter *iter);\r\ninternal void         d2r_tag_iter_skip_children(D2R_TagIter *iter);\r\ninternal DW_TagNode * d2r_tag_iter_parent_tag_node(D2R_TagIter *iter);\r\ninternal DW_Tag       d2r_tag_iter_parent_tag(D2R_TagIter *iter);\r\n\r\n////////////////////////////////\r\n//~ Type/UDT/Symbol Conversion\r\n\r\ninternal void d2r_flag_converted_tag(DW_TagNode *tag_node);\r\ninternal B8   d2r_is_tag_converted(DW_TagNode *tag_node);\r\n\r\ninternal RDIM_Type *d2r_find_or_convert_type(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_Tag tag, DW_AttribKind kind);\r\n\r\ninternal void d2r_convert_types(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root);\r\ninternal void d2r_convert_udts(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, DW_TagNode *root);\r\ninternal void d2r_convert_symbols(Arena *arena, D2R_TypeTable *type_table, DW_Input *input, DW_CompUnit *cu, DW_Language cu_lang, U64 arch_addr_size, U64 image_base, Arch arch, DW_TagNode *root);\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Conversion Entry Point\r\n\r\ninternal RDIM_BakeParams d2r_convert(Arena *arena, D2R_ConvertParams *params);\r\n\r\n#endif // RDI_FROM_DWARF_H\r\n"
  },
  {
    "path": "src/rdi_from_elf/rdi_from_elf.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal RDI_BinarySectionFlags\ne2r_rdi_binary_section_flags_from_elf(ELF_SectionFlags f)\n{\n  RDI_BinarySectionFlags result = RDI_BinarySectionFlag_Read;\n  if(f & ELF_Shf_Write)\n  {\n    result |= RDI_BinarySectionFlag_Write;\n  }\n  if(f & ELF_Shf_ExecInstr)\n  {\n    result |= RDI_BinarySectionFlag_Execute;\n  }\n  return result;\n}\n\ninternal RDIM_BinarySectionList\ne2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array shdrs)\n{\n  RDIM_BinarySectionList result = {0};\n  U64 base_vaddr = elf_base_addr_from_bin(bin);\n  for EachIndex(idx, shdrs.count)\n  {\n    ELF_Shdr64 *src = &shdrs.v[idx];\n    RDIM_BinarySection *dst = rdim_binary_section_list_push(arena, &result);\n    dst->name       = elf_name_from_shdr64(data, bin, src);\n    dst->flags      = e2r_rdi_binary_section_flags_from_elf(src->sh_flags);\n    dst->voff_first = src->sh_addr - base_vaddr;\n    dst->voff_opl   = dst->voff_first + src->sh_size;\n    dst->foff_first = src->sh_offset;\n    dst->foff_opl   = dst->foff_first + src->sh_size;\n  }\n  return result;\n}\n"
  },
  {
    "path": "src/rdi_from_elf/rdi_from_elf.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RDI_FROM_ELF_H\r\n#define RDI_FROM_ELF_H\r\n\r\ninternal RDI_BinarySectionFlags e2r_rdi_binary_section_flags_from_elf(ELF_SectionFlags f);\r\ninternal RDIM_BinarySectionList e2r_rdi_binary_sections_from_elf_section_table(Arena *arena, String8 data, ELF_Bin *bin, ELF_Shdr64Array shdrs);\r\n\r\n#endif // RDI_FROM_ELF_H\r\n"
  },
  {
    "path": "src/rdi_from_pdb/rdi_from_pdb.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n// TODO(rjf): eliminate redundant null checks, just always allocate\r\n// empty results, and have nulls gracefully fall through\r\n//\r\n// (search for != 0 instances, inserted to prevent prior crashes)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64\r\np2r_end_of_cplusplus_container_name(String8 str)\r\n{\r\n  // NOTE: This finds the index one past the last \"::\" contained in str.\r\n  //       if no \"::\" is contained in str, then the returned index is 0.\r\n  //       The intent is that [0,clamp_bot(0,result - 2)) gives the\r\n  //       \"container name\" and [result,str.size) gives the leaf name.\r\n  U64 result = 0;\r\n  if(str.size >= 2)\r\n  {\r\n    for(U64 i = str.size; i >= 2; i -= 1)\r\n    {\r\n      if(str.str[i - 2] == ':' && str.str[i - 1] == ':')\r\n      {\r\n        result = i;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal U64\r\np2r_hash_from_voff(U64 voff)\r\n{\r\n  U64 hash = (voff >> 3) ^ ((7 & voff) << 6);\r\n  return hash;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: COFF <-> RDI Canonical Conversions\r\n\r\ninternal RDI_BinarySectionFlags\r\np2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags)\r\n{\r\n  RDI_BinarySectionFlags result = 0;\r\n  if(flags & COFF_SectionFlag_MemRead)\r\n  {\r\n    result |= RDI_BinarySectionFlag_Read;\r\n  }\r\n  if(flags & COFF_SectionFlag_MemWrite)\r\n  {\r\n    result |= RDI_BinarySectionFlag_Write;\r\n  }\r\n  if(flags & COFF_SectionFlag_MemExecute)\r\n  {\r\n    result |= RDI_BinarySectionFlag_Execute;\r\n  }\r\n  return(result);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: CodeView <-> RDI Canonical Conversions\r\n\r\ninternal RDI_Arch\r\np2r_rdi_arch_from_cv_arch(CV_Arch cv_arch)\r\n{\r\n  RDI_Arch result = 0;\r\n  switch(cv_arch)\r\n  {\r\n    case CV_Arch_8086: result = RDI_Arch_X86; break;\r\n    case CV_Arch_X64:  result = RDI_Arch_X64; break;\r\n    //case CV_Arch_8080: break;\r\n    //case CV_Arch_80286: break;\r\n    //case CV_Arch_80386: break;\r\n    //case CV_Arch_80486: break;\r\n    //case CV_Arch_PENTIUM: break;\r\n    //case CV_Arch_PENTIUMII: break;\r\n    //case CV_Arch_PENTIUMIII: break;\r\n    //case CV_Arch_MIPS: break;\r\n    //case CV_Arch_MIPS16: break;\r\n    //case CV_Arch_MIPS32: break;\r\n    //case CV_Arch_MIPS64: break;\r\n    //case CV_Arch_MIPSI: break;\r\n    //case CV_Arch_MIPSII: break;\r\n    //case CV_Arch_MIPSIII: break;\r\n    //case CV_Arch_MIPSIV: break;\r\n    //case CV_Arch_MIPSV: break;\r\n    //case CV_Arch_M68000: break;\r\n    //case CV_Arch_M68010: break;\r\n    //case CV_Arch_M68020: break;\r\n    //case CV_Arch_M68030: break;\r\n    //case CV_Arch_M68040: break;\r\n    //case CV_Arch_ALPHA: break;\r\n    //case CV_Arch_ALPHA_21164: break;\r\n    //case CV_Arch_ALPHA_21164A: break;\r\n    //case CV_Arch_ALPHA_21264: break;\r\n    //case CV_Arch_ALPHA_21364: break;\r\n    //case CV_Arch_PPC601: break;\r\n    //case CV_Arch_PPC603: break;\r\n    //case CV_Arch_PPC604: break;\r\n    //case CV_Arch_PPC620: break;\r\n    //case CV_Arch_PPCFP: break;\r\n    //case CV_Arch_PPCBE: break;\r\n    //case CV_Arch_SH3: break;\r\n    //case CV_Arch_SH3E: break;\r\n    //case CV_Arch_SH3DSP: break;\r\n    //case CV_Arch_SH4: break;\r\n    //case CV_Arch_SHMEDIA: break;\r\n    //case CV_Arch_ARM3: break;\r\n    //case CV_Arch_ARM4: break;\r\n    //case CV_Arch_ARM4T: break;\r\n    //case CV_Arch_ARM5: break;\r\n    //case CV_Arch_ARM5T: break;\r\n    //case CV_Arch_ARM6: break;\r\n    //case CV_Arch_ARM_XMAC: break;\r\n    //case CV_Arch_ARM_WMMX: break;\r\n    //case CV_Arch_ARM7: break;\r\n    //case CV_Arch_OMNI: break;\r\n    //case CV_Arch_IA64_1: break;\r\n    //case CV_Arch_IA64_2: break;\r\n    //case CV_Arch_CEE: break;\r\n    //case CV_Arch_AM33: break;\r\n    //case CV_Arch_M32R: break;\r\n    //case CV_Arch_TRICORE: break;\r\n    //case CV_Arch_EBC: break;\r\n    //case CV_Arch_THUMB: break;\r\n    //case CV_Arch_ARMNT: break;\r\n    //case CV_Arch_ARM64: break;\r\n    //case CV_Arch_D3D11_SHADER: break;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal RDI_RegCode\r\np2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code)\r\n{\r\n  RDI_RegCode result = 0;\r\n  switch(arch)\r\n  {\r\n    case RDI_Arch_X86:\r\n    {\r\n      switch(reg_code)\r\n      {\r\n#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX86_##RDN; break;\r\n        CV_Reg_X86_XList(X)\r\n#undef X\r\n      }\r\n    }break;\r\n    case RDI_Arch_X64:\r\n    {\r\n      switch(reg_code)\r\n      {\r\n#define X(CVN,C,RDN,BP,BZ) case C: result = RDI_RegCodeX64_##RDN; break;\r\n        CV_Reg_X64_XList(X)\r\n#undef X\r\n      }\r\n    }break;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal RDI_Language\r\np2r_rdi_language_from_cv_language(CV_Language cv_language)\r\n{\r\n  RDI_Language result = 0;\r\n  switch(cv_language)\r\n  {\r\n    case CV_Language_C:       result = RDI_Language_C; break;\r\n    case CV_Language_CXX:     result = RDI_Language_CPlusPlus; break;\r\n    //case CV_Language_FORTRAN: result = ; break;\r\n    //case CV_Language_MASM:    result = ; break;\r\n    //case CV_Language_PASCAL:  result = ; break;\r\n    //case CV_Language_BASIC:   result = ; break;\r\n    //case CV_Language_COBOL:   result = ; break;\r\n    //case CV_Language_LINK:    result = ; break;\r\n    //case CV_Language_CVTRES:  result = ; break;\r\n    //case CV_Language_CVTPGD:  result = ; break;\r\n    //case CV_Language_CSHARP:  result = ; break;\r\n    //case CV_Language_VB:      result = ; break;\r\n    //case CV_Language_ILASM:   result = ; break;\r\n    //case CV_Language_JAVA:    result = ; break;\r\n    //case CV_Language_JSCRIPT: result = ; break;\r\n    //case CV_Language_MSIL:    result = ; break;\r\n    //case CV_Language_HLSL:    result = ; break;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal RDI_TypeKind\r\np2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type)\r\n{\r\n  RDI_TypeKind result = RDI_TypeKind_NULL;\r\n  switch(basic_type)\r\n  {\r\n    case CV_BasicType_VOID: {result = RDI_TypeKind_Void;}break;\r\n    case CV_BasicType_HRESULT: {result = RDI_TypeKind_HResult;}break;\r\n    \r\n    case CV_BasicType_RCHAR:\r\n    case CV_BasicType_CHAR:\r\n    case CV_BasicType_CHAR8:\r\n    {result = RDI_TypeKind_Char8;}break;\r\n    \r\n    case CV_BasicType_UCHAR: {result = RDI_TypeKind_UChar8;}break;\r\n    case CV_BasicType_WCHAR: {result = RDI_TypeKind_UChar16;}break;\r\n    case CV_BasicType_CHAR16: {result = RDI_TypeKind_Char16;}break;\r\n    case CV_BasicType_CHAR32: {result = RDI_TypeKind_Char32;}break;\r\n    \r\n    case CV_BasicType_BOOL8:\r\n    case CV_BasicType_INT8:\r\n    {result = RDI_TypeKind_S8;}break;\r\n    \r\n    case CV_BasicType_BOOL16:\r\n    case CV_BasicType_INT16:\r\n    case CV_BasicType_SHORT:\r\n    {result = RDI_TypeKind_S16;}break;\r\n    \r\n    case CV_BasicType_BOOL32:\r\n    case CV_BasicType_INT32:\r\n    case CV_BasicType_LONG:\r\n    {result = RDI_TypeKind_S32;}break;\r\n    \r\n    case CV_BasicType_BOOL64:\r\n    case CV_BasicType_INT64:\r\n    case CV_BasicType_QUAD:\r\n    {result = RDI_TypeKind_S64;}break;\r\n    \r\n    case CV_BasicType_INT128:\r\n    case CV_BasicType_OCT:\r\n    {result = RDI_TypeKind_S128;}break;\r\n    \r\n    case CV_BasicType_UINT8: {result = RDI_TypeKind_U8;}break;\r\n    \r\n    case CV_BasicType_UINT16:\r\n    case CV_BasicType_USHORT:\r\n    {result = RDI_TypeKind_U16;}break;\r\n    \r\n    case CV_BasicType_UINT32:\r\n    case CV_BasicType_ULONG:\r\n    {result = RDI_TypeKind_U32;}break;\r\n    \r\n    case CV_BasicType_UINT64:\r\n    case CV_BasicType_UQUAD:\r\n    {result = RDI_TypeKind_U64;}break;\r\n    \r\n    case CV_BasicType_UINT128:\r\n    case CV_BasicType_UOCT:\r\n    {result = RDI_TypeKind_U128;}break;\r\n    \r\n    case CV_BasicType_FLOAT16:{result = RDI_TypeKind_F16;}break;\r\n    case CV_BasicType_FLOAT32:{result = RDI_TypeKind_F32;}break;\r\n    case CV_BasicType_FLOAT32PP:{result = RDI_TypeKind_F32PP;}break;\r\n    case CV_BasicType_FLOAT48:{result = RDI_TypeKind_F48;}break;\r\n    case CV_BasicType_FLOAT64:{result = RDI_TypeKind_F64;}break;\r\n    case CV_BasicType_FLOAT80:{result = RDI_TypeKind_F80;}break;\r\n    case CV_BasicType_FLOAT128:{result = RDI_TypeKind_F128;}break;\r\n    case CV_BasicType_COMPLEX32:{result = RDI_TypeKind_ComplexF32;}break;\r\n    case CV_BasicType_COMPLEX64:{result = RDI_TypeKind_ComplexF64;}break;\r\n    case CV_BasicType_COMPLEX80:{result = RDI_TypeKind_ComplexF80;}break;\r\n    case CV_BasicType_COMPLEX128:{result = RDI_TypeKind_ComplexF128;}break;\r\n    case CV_BasicType_PTR:{result = RDI_TypeKind_Handle;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal RDI_ChecksumKind\r\np2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k)\r\n{\r\n  RDI_ChecksumKind result = RDI_ChecksumKind_NULL;\r\n  switch((CV_C13ChecksumKindEnum)k)\r\n  {\r\n    case CV_C13ChecksumKind_Null:  {result = RDI_ChecksumKind_NULL;}break;\r\n    case CV_C13ChecksumKind_MD5:   {result = RDI_ChecksumKind_MD5;}break;\r\n    case CV_C13ChecksumKind_SHA1:  {result = RDI_ChecksumKind_SHA1;}break;\r\n    case CV_C13ChecksumKind_SHA256:{result = RDI_ChecksumKind_SHA256;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Location Info Building Helpers\r\n\r\ninternal RDI_RegCode\r\np2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg)\r\n{\r\n  RDI_RegCode result = 0;\r\n  switch(arch)\r\n  {\r\n    case RDI_Arch_X86:\r\n    {\r\n      switch(encoded_reg)\r\n      {\r\n        case CV_EncodedFramePtrReg_StackPtr:\r\n        {\r\n          // TODO(allen): support CV_AllReg_VFRAME\r\n          // TODO(allen): error\r\n        }break;\r\n        case CV_EncodedFramePtrReg_FramePtr:\r\n        {\r\n          result = RDI_RegCodeX86_ebp;\r\n        }break;\r\n        case CV_EncodedFramePtrReg_BasePtr:\r\n        {\r\n          result = RDI_RegCodeX86_ebx;\r\n        }break;\r\n      }\r\n    }break;\r\n    case RDI_Arch_X64:\r\n    {\r\n      switch(encoded_reg)\r\n      {\r\n        case CV_EncodedFramePtrReg_StackPtr:\r\n        {\r\n          result = RDI_RegCodeX64_rsp;\r\n        }break;\r\n        case CV_EncodedFramePtrReg_FramePtr:\r\n        {\r\n          result = RDI_RegCodeX64_rbp;\r\n        }break;\r\n        case CV_EncodedFramePtrReg_BasePtr:\r\n        {\r\n          result = RDI_RegCodeX64_r13;\r\n        }break;\r\n      }\r\n    }break;\r\n  }\r\n  return(result);\r\n}\r\n\r\ninternal RDIM_LocationInfo\r\np2r_location_info_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection)\r\n{\r\n  RDIM_LocationInfo result = {0};\r\n  if(0 <= offset && offset <= (S64)max_U16)\r\n  {\r\n    if(extra_indirection)\r\n    {\r\n      result.kind = RDI_LocationKind_AddrAddrRegPlusU16;\r\n      result.reg_code = reg_code;\r\n      result.offset = offset;\r\n    }\r\n    else\r\n    {\r\n      result.kind = RDI_LocationKind_AddrRegPlusU16;\r\n      result.reg_code = reg_code;\r\n      result.offset = offset;\r\n    }\r\n  }\r\n  else\r\n  {\r\n    RDIM_EvalBytecode bytecode = {0};\r\n    U32 regread_param = RDI_EncodeRegReadParam(reg_code, reg_byte_size, reg_byte_pos);\r\n    rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_RegRead, regread_param);\r\n    rdim_bytecode_push_sconst(arena, &bytecode, offset);\r\n    rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_Add, 0);\r\n    if(extra_indirection)\r\n    {\r\n      U64 addr_size = rdi_addr_size_from_arch(arch);\r\n      rdim_bytecode_push_op(arena, &bytecode, RDI_EvalOp_MemRead, addr_size);\r\n    }\r\n    result.kind = RDI_LocationKind_AddrBytecodeStream;\r\n    result.bytecode = bytecode;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\np2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count)\r\n{\r\n  //- rjf: extract range info\r\n  U64 voff_first = 0;\r\n  U64 voff_opl = 0;\r\n  if(section != 0)\r\n  {\r\n    voff_first = section->voff + range->off;\r\n    voff_opl = voff_first + range->len;\r\n  }\r\n  \r\n  //- rjf: emit location for ranges not coverd by gaps\r\n  CV_LvarAddrGap *gap_ptr = gaps;\r\n  U64 voff_cursor = voff_first;\r\n  for(U64 i = 0; i < gap_count; i += 1, gap_ptr += 1)\r\n  {\r\n    U64 voff_gap_first = voff_first + gap_ptr->off;\r\n    U64 voff_gap_opl   = voff_gap_first + gap_ptr->len;\r\n    if(voff_cursor < voff_gap_first)\r\n    {\r\n      RDIM_Rng1U64 voff_range = {voff_cursor, voff_gap_first};\r\n      rdim_local_push_location_case(arena, scopes, local, loc, voff_range);\r\n    }\r\n    voff_cursor = voff_gap_opl;\r\n  }\r\n  \r\n  //- rjf: emit remaining range\r\n  if(voff_cursor < voff_opl)\r\n  {\r\n    RDIM_Rng1U64 voff_range = {voff_cursor, voff_opl};\r\n    rdim_local_push_location_case(arena, scopes, local, loc, voff_range);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Conversion Entry Point\r\n\r\ninternal RDIM_BakeParams\r\np2r_convert(Arena *arena, P2R_ConvertParams *params)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: do base MSF parse\r\n  //\r\n  MSF_Parsed *msf = 0;\r\n  {\r\n    Temp scratch2 = scratch_begin(&scratch.arena, 1);\r\n    \r\n    // rjf: setup output buckets\r\n    MSF_RawStreamTable *msf_raw_stream_table = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      msf_raw_stream_table = msf_raw_stream_table_from_data(scratch2.arena, params->input_pdb_data);\r\n      msf = push_array(scratch.arena, MSF_Parsed, 1);\r\n      msf->page_size = msf_raw_stream_table->page_size;\r\n      msf->page_count = msf_raw_stream_table->total_page_count;\r\n      msf->stream_count = msf_raw_stream_table->stream_count;\r\n      msf->streams = push_array(scratch.arena, String8, msf->stream_count);\r\n    }\r\n    lane_sync_u64(&msf, 0);\r\n    lane_sync_u64(&msf_raw_stream_table, 0);\r\n    \r\n    // rjf: do wide fill\r\n    {\r\n      U64 msf_stream_take_counter = 0;\r\n      U64 *msf_stream_take_counter_ptr = &msf_stream_take_counter;\r\n      lane_sync_u64(&msf_stream_take_counter_ptr, 0);\r\n      for(;;)\r\n      {\r\n        U64 stream_idx = ins_atomic_u64_inc_eval(msf_stream_take_counter_ptr) - 1;\r\n        if(stream_idx >= msf->stream_count)\r\n        {\r\n          break;\r\n        }\r\n        msf->streams[stream_idx] = msf_data_from_stream_number(arena, params->input_pdb_data, msf_raw_stream_table, stream_idx);\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    scratch_end(scratch2);\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: do top-level MSF/PDB extraction\r\n  //\r\n  PDB_Info *pdb_info = 0;\r\n  PDB_NamedStreamTable *named_streams = 0;\r\n  ProfScope(\"do top-level MSF/PDB extraction\") if(lane_idx() == 0)\r\n  {\r\n    ProfScope(\"parse PDB info\")\r\n    {\r\n      String8 info_data = msf_data_from_stream(msf, PDB_FixedStream_Info);\r\n      pdb_info = pdb_info_from_data(scratch.arena, info_data);\r\n      if(pdb_info->features & PDB_FeatureFlag_MINIMAL_DBG_INFO)\r\n      {\r\n        log_user_error(str8_lit(\"PDB was linked with /DEBUG:FASTLINK; partial debug info is not supported. Please relink using /DEBUG:FULL.\"));\r\n      }\r\n    }\r\n    ProfScope(\"parse named streams table\")\r\n    {\r\n      named_streams = pdb_named_stream_table_from_info(scratch.arena, pdb_info);\r\n    }\r\n  }\r\n  lane_sync_u64(&pdb_info, 0);\r\n  lane_sync_u64(&named_streams, 0);\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: parse PDB strtbl & top-level streams\r\n  //\r\n  PDB_Strtbl *strtbl = 0;\r\n  String8 raw_strtbl = {0};\r\n  PDB_DbiParsed *dbi = 0;\r\n  PDB_TpiParsed *tpi = 0;\r\n  PDB_TpiParsed *ipi = 0;\r\n  ProfScope(\"parse PDB strtbl & top-level streams\")\r\n  {\r\n    if(lane_idx() == lane_from_task_idx(0)) ProfScope(\"parse PDB strtbl\")\r\n    {\r\n      MSF_StreamNumber strtbl_sn = named_streams->sn[PDB_NamedStream_StringTable];\r\n      String8 strtbl_data = msf_data_from_stream(msf, strtbl_sn);\r\n      strtbl = pdb_strtbl_from_data(scratch.arena, strtbl_data);\r\n      raw_strtbl = str8_substr(strtbl_data, rng_1u64(strtbl->strblock_min, strtbl->strblock_max));\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1)) ProfScope(\"parse DBI\")\r\n    {\r\n      String8 dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi);\r\n      dbi = pdb_dbi_from_data(scratch.arena, dbi_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2)) ProfScope(\"parse TPI\")\r\n    {\r\n      String8 tpi_data = msf_data_from_stream(msf, PDB_FixedStream_Tpi);\r\n      tpi = pdb_tpi_from_data(scratch.arena, tpi_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(3)) ProfScope(\"parse IPI\")\r\n    {\r\n      String8 ipi_data = msf_data_from_stream(msf, PDB_FixedStream_Ipi);\r\n      ipi = pdb_tpi_from_data(scratch.arena, ipi_data);\r\n    }\r\n  }\r\n  lane_sync_u64(&strtbl, lane_from_task_idx(0));\r\n  lane_sync_u64(&raw_strtbl.size, lane_from_task_idx(0));\r\n  lane_sync_u64(&raw_strtbl.str, lane_from_task_idx(0));\r\n  lane_sync_u64(&dbi, lane_from_task_idx(1));\r\n  lane_sync_u64(&tpi, lane_from_task_idx(2));\r\n  lane_sync_u64(&ipi, lane_from_task_idx(3));\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: unpack DBI\r\n  //\r\n  COFF_SectionHeaderArray coff_sections = {0};\r\n  PDB_GsiParsed *gsi = 0;\r\n  PDB_GsiParsed *psi_gsi_part = 0;\r\n  ProfScope(\"unpack DBI\")\r\n  {\r\n    if(lane_idx() == lane_from_task_idx(0)) ProfScope(\"parse COFF sections\")\r\n    {\r\n      MSF_StreamNumber section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER];\r\n      String8 section_data = msf_data_from_stream(msf, section_stream);\r\n      coff_sections = pdb_coff_section_array_from_data(scratch.arena, section_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1)) ProfScope(\"parse GSI\")\r\n    {\r\n      String8 gsi_data = msf_data_from_stream(msf, dbi->gsi_sn);\r\n      gsi = pdb_gsi_from_data(scratch.arena, gsi_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2)) ProfScope(\"parse GSI part of PSI\")\r\n    {\r\n      String8 psi_data = msf_data_from_stream(msf, dbi->psi_sn);\r\n      String8 psi_data_gsi_part = str8_range(psi_data.str + sizeof(PDB_PsiHeader), psi_data.str + psi_data.size);\r\n      psi_gsi_part = pdb_gsi_from_data(scratch.arena, psi_data_gsi_part);\r\n    }\r\n  }\r\n  lane_sync_u64(&coff_sections.v, lane_from_task_idx(0));\r\n  lane_sync_u64(&coff_sections.count, lane_from_task_idx(0));\r\n  lane_sync_u64(&gsi, lane_from_task_idx(1));\r\n  lane_sync_u64(&psi_gsi_part, lane_from_task_idx(2));\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units\r\n  //\r\n  U64 exe_hash = 0;\r\n  PDB_TpiHashParsed *tpi_hash = 0;\r\n  CV_LeafParsed *tpi_leaf = 0;\r\n  PDB_TpiHashParsed *ipi_hash = 0;\r\n  CV_LeafParsed *ipi_leaf = 0;\r\n  PDB_CompUnitArray *comp_units = 0;\r\n  PDB_CompUnitContributionArray *comp_unit_contributions = 0;\r\n  ProfScope(\"hash EXE, parse TPI/IPI hash/leaf & global symbol stream & comp units\")\r\n  {\r\n    if(lane_idx() == lane_from_task_idx(0)) ProfScope(\"hash EXE\")\r\n    {\r\n      exe_hash = rdi_hash(params->input_exe_data.str, params->input_exe_data.size);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1)) ProfScope(\"parse TPI hash\")\r\n    {\r\n      String8 hash_data = msf_data_from_stream(msf, tpi->hash_sn);\r\n      String8 aux_data  = msf_data_from_stream(msf, tpi->hash_sn_aux);\r\n      if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs)))\r\n      {\r\n        hash_data = aux_data = str8_zero();\r\n      }\r\n      tpi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, tpi, hash_data, aux_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2)) ProfScope(\"parse TPI leaf\")\r\n    {\r\n      String8 leaf_data = pdb_leaf_data_from_tpi(tpi);\r\n      tpi_leaf = cv_leaf_from_data(scratch.arena, leaf_data, tpi->itype_first);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(3)) ProfScope(\"parse IPI hash\")\r\n    {\r\n      String8 hash_data = msf_data_from_stream(msf, ipi->hash_sn);\r\n      String8 aux_data  = msf_data_from_stream(msf, ipi->hash_sn_aux);\r\n      if(!(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs)))\r\n      {\r\n        hash_data = aux_data = str8_zero();\r\n      }\r\n      ipi_hash = pdb_tpi_hash_from_data(scratch.arena, strtbl, ipi, hash_data, aux_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(4)) ProfScope(\"parse IPI leaf\")\r\n    {\r\n      String8 leaf_data = pdb_leaf_data_from_tpi(ipi);\r\n      ipi_leaf = cv_leaf_from_data(scratch.arena, leaf_data, ipi->itype_first);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(5)) ProfScope(\"parse compilation units\")\r\n    {\r\n      String8 comp_units_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo);\r\n      comp_units = pdb_comp_unit_array_from_data(scratch.arena, comp_units_data);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(6)) ProfScope(\"parse compilation unit contributions\")\r\n    {\r\n      String8 contribs_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_SecCon);\r\n      comp_unit_contributions = push_array(scratch.arena, PDB_CompUnitContributionArray, 1);\r\n      comp_unit_contributions[0] = pdb_comp_unit_contribution_array_from_data(scratch.arena, contribs_data, coff_sections);\r\n    }\r\n  }\r\n  lane_sync_u64(&exe_hash, lane_from_task_idx(0));\r\n  lane_sync_u64(&tpi_hash, lane_from_task_idx(1));\r\n  lane_sync_u64(&tpi_leaf, lane_from_task_idx(2));\r\n  lane_sync_u64(&ipi_hash, lane_from_task_idx(3));\r\n  lane_sync_u64(&ipi_leaf, lane_from_task_idx(4));\r\n  lane_sync_u64(&comp_units, lane_from_task_idx(5));\r\n  lane_sync_u64(&comp_unit_contributions, lane_from_task_idx(6));\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: bucket compilation unit contributions\r\n  //\r\n  RDIM_Rng1U64ChunkList *unit_ranges = 0;\r\n  ProfScope(\"bucket compilation unit contributions\") if(lane_idx() == 0)\r\n  {\r\n    unit_ranges = push_array(scratch.arena, RDIM_Rng1U64ChunkList, comp_units->count);\r\n    for(U64 idx = 0; idx < comp_unit_contributions->count; idx += 1)\r\n    {\r\n      PDB_CompUnitContribution *contribution = &comp_unit_contributions->contributions[idx];\r\n      if(contribution->mod < comp_units->count)\r\n      {\r\n        RDIM_Rng1U64 r = {contribution->voff_first, contribution->voff_opl};\r\n        rdim_rng1u64_chunk_list_push(arena, &unit_ranges[contribution->mod], 256, r);\r\n      }\r\n    }\r\n  }\r\n  lane_sync_u64(&unit_ranges, 0);\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: parse all syms & c13 line info streams\r\n  //\r\n  U64 all_syms_count = 0;\r\n  CV_SymParsed **all_syms = 0;\r\n  CV_C13Parsed **all_c13s = 0;\r\n  ProfScope(\"parse all syms & c13 line info streams\")\r\n  {\r\n    //- rjf: setup outputs\r\n    if(lane_idx() == 0)\r\n    {\r\n      all_syms_count = comp_units->count+1; // +1 for global symbol stream from DBI\r\n      all_syms = push_array(scratch.arena, CV_SymParsed *, all_syms_count);\r\n      all_c13s = push_array(scratch.arena, CV_C13Parsed *, all_syms_count);\r\n    }\r\n    lane_sync_u64(&all_syms_count, 0);\r\n    lane_sync_u64(&all_syms, 0);\r\n    lane_sync_u64(&all_c13s, 0);\r\n    \r\n    //- rjf: wide fill\r\n    {\r\n      U64 task_counter = 0;\r\n      U64 *task_counter_ptr = &task_counter;\r\n      lane_sync_u64(&task_counter_ptr, 0);\r\n      U64 task_count = all_syms_count;\r\n      for(;;)\r\n      {\r\n        U64 task_idx = ins_atomic_u64_inc_eval(task_counter_ptr) - 1;\r\n        if(task_idx >= task_count)\r\n        {\r\n          break;\r\n        }\r\n        if(task_idx > 0)\r\n        {\r\n          PDB_CompUnit *unit = comp_units->units[task_idx-1];\r\n          String8 unit_sym_data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_Symbols);\r\n          String8 unit_c13_data = pdb_data_from_unit_range(msf, unit, PDB_DbiCompUnitRange_C13);\r\n          all_syms[task_idx] = cv_sym_from_data(arena, unit_sym_data, 4);\r\n          all_c13s[task_idx] = cv_c13_parsed_from_data(arena, unit_c13_data, raw_strtbl, coff_sections);\r\n        }\r\n        else\r\n        {\r\n          String8 global_sym_data = msf_data_from_stream(msf, dbi->sym_sn);\r\n          all_syms[task_idx] = cv_sym_from_data(arena, global_sym_data, 4);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: calculate EXE's max voff\r\n  //\r\n  U64 exe_voff_max = 0;\r\n  {\r\n    Temp scratch2 = scratch_begin(&scratch.arena, 1);\r\n    \r\n    // rjf: set up\r\n    U64 *lane_voff_maxes = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      lane_voff_maxes = push_array(scratch2.arena, U64, lane_count());\r\n    }\r\n    lane_sync_u64(&lane_voff_maxes, 0);\r\n    \r\n    // rjf: compute each lane's max\r\n    {\r\n      U64 lane_voff_max = 0;\r\n      COFF_SectionHeader *sections = coff_sections.v;\r\n      Rng1U64 range = lane_range(coff_sections.count);\r\n      for EachInRange(idx, range)\r\n      {\r\n        lane_voff_max = Max(lane_voff_max, sections[idx].voff + sections[idx].vsize);\r\n      }\r\n      lane_voff_maxes[lane_idx()] = lane_voff_max;\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: find max from all lanes\r\n    U64 exe_voff_max = 0;\r\n    for EachIndex(l_idx, lane_count())\r\n    {\r\n      exe_voff_max = Max(exe_voff_max, lane_voff_maxes[l_idx]);\r\n    }\r\n    lane_sync();\r\n    \r\n    scratch_end(scratch2);\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: determine architecture\r\n  //\r\n  RDI_Arch arch = RDI_Arch_NULL;\r\n  U64 arch_addr_size = 0;\r\n  {\r\n    //\r\n    // TODO(rjf): in some cases, the first compilation unit has a zero\r\n    // architecture, as it's sometimes used as a \"nil\" unit. this causes bugs\r\n    // in later stages of conversion - particularly, this was detected via\r\n    // busted location info. so i've converted this to a scan-until-we-find-an-\r\n    // architecture. however, this may still be fundamentally insufficient,\r\n    // because Nick has informed me that x86 units can be linked with x64\r\n    // units, meaning the appropriate architecture at any point in time is not\r\n    // a top-level concept, and is rather dependent on to which compilation\r\n    // unit particular symbols belong. so in the future, to support that (odd)\r\n    // case, we'll need to not only have this be a top-level \"contextual\" piece\r\n    // of info, but to use the appropriate compilation unit's architecture when\r\n    // possible. assuming, of course, that we care about supporting that case.\r\n    //\r\n    for EachIndex(idx, all_syms_count)\r\n    {\r\n      arch = p2r_rdi_arch_from_cv_arch(all_syms[idx]->info.arch);\r\n      if(arch != RDI_Arch_NULL)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    arch_addr_size = rdi_addr_size_from_arch(arch);\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: predict total symbol count\r\n  //\r\n  U64 symbol_count_prediction = 0;\r\n  {\r\n    U64 *symbol_count_prediction_ptr = &symbol_count_prediction;\r\n    lane_sync_u64(&symbol_count_prediction_ptr, 0);\r\n    U64 lane_sym_count = 0;\r\n    Rng1U64 range = lane_range(all_syms_count);\r\n    for EachInRange(idx, range)\r\n    {\r\n      lane_sym_count += all_syms[idx]->sym_ranges.count;\r\n    }\r\n    ins_atomic_u64_add_eval(symbol_count_prediction_ptr, lane_sym_count);\r\n    lane_sync();\r\n    symbol_count_prediction = *symbol_count_prediction_ptr;\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: build link name map\r\n  //\r\n  P2R_LinkNameMap *link_name_map = 0;\r\n  ProfScope(\"build link name map\") if(all_syms_count != 0 && lane_idx() == 0)\r\n  {\r\n    // rjf: set up\r\n    {\r\n      link_name_map = push_array(scratch.arena, P2R_LinkNameMap, 1);\r\n      link_name_map->buckets_count = Max(1, symbol_count_prediction);\r\n      link_name_map->buckets = push_array(scratch.arena, P2R_LinkNameNode *, link_name_map->buckets_count);\r\n    }\r\n    \r\n    // rjf: fill\r\n    if(params->subset_flags & RDIM_SubsetFlag_Procedures)\r\n    {\r\n      CV_SymParsed *sym = all_syms[0];\r\n      CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges;\r\n      CV_RecRange *rec_ranges_opl = sym->sym_ranges.ranges + sym->sym_ranges.count;\r\n      for(CV_RecRange *rec_range = rec_ranges_first;\r\n          rec_range < rec_ranges_opl;\r\n          rec_range += 1)\r\n      {\r\n        //- rjf: unpack symbol range info\r\n        CV_SymKind kind = rec_range->hdr.kind;\r\n        U64 header_struct_size = cv_header_struct_size_from_sym_kind(kind);\r\n        U8 *sym_first = sym->data.str + rec_range->off + 2;\r\n        U8 *sym_opl   = sym_first + rec_range->hdr.size;\r\n        \r\n        //- rjf: skip bad ranges\r\n        if(sym_opl > sym->data.str + sym->data.size || sym_first + header_struct_size > sym->data.str + sym->data.size)\r\n        {\r\n          continue;\r\n        }\r\n        \r\n        //- rjf: consume symbol\r\n        switch(kind)\r\n        {\r\n          default:{}break;\r\n          case CV_SymKind_PUB32:\r\n          {\r\n            // rjf: unpack sym\r\n            CV_SymPub32 *pub32 = (CV_SymPub32 *)sym_first;\r\n            String8 name = str8_cstring_capped(pub32+1, sym_opl);\r\n            COFF_SectionHeader *section = (0 < pub32->sec && pub32->sec <= coff_sections.count) ? &coff_sections.v[pub32->sec-1] : 0;\r\n            U64 voff = 0;\r\n            if(section != 0)\r\n            {\r\n              voff = section->voff + pub32->off;\r\n            }\r\n            \r\n            // rjf: commit to link name map\r\n            U64 hash = p2r_hash_from_voff(voff);\r\n            U64 bucket_idx = hash%link_name_map->buckets_count;\r\n            P2R_LinkNameNode *node = push_array(scratch.arena, P2R_LinkNameNode, 1);\r\n            SLLStackPush(link_name_map->buckets[bucket_idx], node);\r\n            node->voff = voff;\r\n            node->name = name;\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync_u64(&link_name_map, 0);\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: gather all file paths\r\n  //\r\n  P2R_SrcFileStubArray *unit_file_stubs = 0;\r\n  U64Array *unit_file_paths_hashes = 0;\r\n  ProfScope(\"gather all file paths\")\r\n  {\r\n    //- rjf: prep outputs\r\n    ProfScope(\"prep outputs\") if(lane_idx() == 0)\r\n    {\r\n      unit_file_stubs = push_array(scratch.arena, P2R_SrcFileStubArray, comp_units->count);\r\n      unit_file_paths_hashes = push_array(scratch.arena, U64Array, comp_units->count);\r\n    }\r\n    lane_sync_u64(&unit_file_stubs, 0);\r\n    lane_sync_u64(&unit_file_paths_hashes, 0);\r\n    \r\n    //- rjf: do wide gather\r\n    ProfScope(\"do wide gather\")\r\n    {\r\n      Temp scratch2 = scratch_begin(&scratch.arena, 1);\r\n      \r\n      //- rjf: build local hash table to dedup files within this lane\r\n      U64 hit_path_slots_count = 4096;\r\n      String8Node **hit_path_slots = push_array(scratch2.arena, String8Node *, hit_path_slots_count);\r\n      \r\n      //- rjf: take units across lanes, find all file paths\r\n      U64 sym_take_counter = 0;\r\n      U64 *sym_take_counter_ptr = &sym_take_counter;\r\n      lane_sync_u64(&sym_take_counter_ptr, 0);\r\n      ProfScope(\"take units across lanes, find all file paths\")\r\n        for(;;)\r\n      {\r\n        //- rjf: take next unit\r\n        U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter_ptr) - 1;\r\n        if(unit_idx >= comp_units->count)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        //- rjf: unpack unit\r\n        PDB_CompUnit *unit = comp_units->units[unit_idx];\r\n        CV_SymParsed *sym = all_syms[unit_idx+1];\r\n        CV_C13Parsed *c13 = all_c13s[unit_idx+1];\r\n        CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges;\r\n        CV_RecRange *rec_ranges_opl   = sym->sym_ranges.ranges + sym->sym_ranges.count;\r\n        \r\n        //- rjf: produce obj name/path\r\n        String8 obj_name = unit->obj_name;\r\n        {\r\n          if(str8_match(obj_name, str8_lit(\"* Linker *\"), 0) ||\r\n             str8_match(obj_name, str8_lit(\"Import:\"), StringMatchFlag_RightSideSloppy))\r\n          {\r\n            MemoryZeroStruct(&obj_name);\r\n          }\r\n        }\r\n        String8 obj_folder_path = backslashed_from_str8(scratch2.arena, str8_chop_last_slash(obj_name));\r\n        \r\n        //- rjf: find all inline site symbols & gather file stubs\r\n        P2R_SrcFileStubNode *first_src_file_stub = 0;\r\n        P2R_SrcFileStubNode *last_src_file_stub = 0;\r\n        U64 src_file_stub_count = 0;\r\n        U64 base_voff = 0;\r\n        for(CV_RecRange *rec_range = rec_ranges_first;\r\n            rec_range < rec_ranges_opl;\r\n            rec_range += 1)\r\n        {\r\n          //- rjf: rec range -> symbol info range\r\n          U64 sym_off_first = rec_range->off + 2;\r\n          U64 sym_off_opl   = rec_range->off + rec_range->hdr.size;\r\n          \r\n          //- rjf: skip invalid ranges\r\n          if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl)\r\n          {\r\n            continue;\r\n          }\r\n          \r\n          //- rjf: unpack symbol info\r\n          CV_SymKind kind = rec_range->hdr.kind;\r\n          U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind);\r\n          void *sym_header_struct_base = sym->data.str + sym_off_first;\r\n          void *sym_data_opl = sym->data.str + sym_off_opl;\r\n          \r\n          //- rjf: skip bad sizes\r\n          if(sym_off_first + sym_header_struct_size > sym_off_opl)\r\n          {\r\n            continue;\r\n          }\r\n          \r\n          //- rjf: process symbol\r\n          switch(kind)\r\n          {\r\n            default:{}break;\r\n            \r\n            //- rjf: LPROC32/GPROC32 (gather base address)\r\n            case CV_SymKind_LPROC32:\r\n            case CV_SymKind_GPROC32:\r\n            {\r\n              CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base;\r\n              COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0;\r\n              if(section != 0)\r\n              {\r\n                base_voff = section->voff + proc32->off;\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: INLINESITE\r\n            case CV_SymKind_INLINESITE:\r\n            {\r\n              // rjf: unpack sym\r\n              CV_SymInlineSite *sym           = (CV_SymInlineSite *)sym_header_struct_base;\r\n              String8           binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym));\r\n              \r\n              // rjf: map inlinee -> parsed cv c13 inlinee line info\r\n              CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0;\r\n              {\r\n                U64 hash = cv_hash_from_item_id(sym->inlinee);\r\n                U64 slot_idx = hash%c13->inlinee_lines_parsed_slots_count;\r\n                for(CV_C13InlineeLinesParsedNode *n = c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next)\r\n                {\r\n                  if(n->v.inlinee == sym->inlinee)\r\n                  {\r\n                    inlinee_lines_parsed = &n->v;\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: build line table, fill with parsed binary annotations\r\n              if(inlinee_lines_parsed != 0)\r\n              {\r\n                // rjf: grab checksums sub-section\r\n                CV_C13SubSectionNode *file_chksms = c13->file_chksms_sub_section;\r\n                \r\n                // rjf: gathered lines\r\n                U32 last_file_off = max_U32;\r\n                U32 curr_file_off = max_U32;\r\n                U64 line_count = 0;\r\n                CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_lines_parsed->file_off, inlinee_lines_parsed->first_source_ln, base_voff);\r\n                for(;;)\r\n                {\r\n                  // rjf: step & update\r\n                  CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots);\r\n                  if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile)\r\n                  {\r\n                    last_file_off = curr_file_off;\r\n                    curr_file_off = step.file_off;\r\n                  }\r\n                  if(step.flags == 0 && line_count > 0)\r\n                  {\r\n                    last_file_off = curr_file_off;\r\n                    curr_file_off = max_U32;\r\n                  }\r\n                  \r\n                  // rjf: file updated -> gather new file name\r\n                  if(last_file_off != max_U32 && last_file_off != curr_file_off)\r\n                  {\r\n                    String8 seq_file_name = {0};\r\n                    CV_C13ChecksumKind checksum_kind = CV_C13ChecksumKind_Null;\r\n                    String8 checksum_value = {0};\r\n                    if(last_file_off + sizeof(CV_C13Checksum) <= file_chksms->size)\r\n                    {\r\n                      CV_C13Checksum *checksum = (CV_C13Checksum *)(c13->data.str + file_chksms->off + last_file_off);\r\n                      U32 name_off = checksum->name_off;\r\n                      seq_file_name = pdb_strtbl_string_from_off(strtbl, name_off);\r\n                      checksum_kind = checksum->kind;\r\n                      checksum_value = str8_skip(c13->data, file_chksms->off + last_file_off + sizeof(*checksum));\r\n                      checksum_value.size = Min(checksum->len, checksum_value.size);\r\n                    }\r\n                    \r\n                    // rjf: file name -> sanitized file path\r\n                    String8 file_path = seq_file_name;\r\n                    String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path));\r\n                    {\r\n                      PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized);\r\n                      String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized);\r\n                      if(file_path_sanitized_style == PathStyle_Relative)\r\n                      {\r\n                        String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path);\r\n                        str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts);\r\n                        file_path_sanitized_parts = obj_folder_path_parts;\r\n                        file_path_sanitized_style = path_style_from_str8(obj_folder_path);\r\n                      }\r\n                      str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style);\r\n                      file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style);\r\n                    }\r\n                    \r\n                    // rjf: sanitized file path -> source file node\r\n                    U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size);\r\n                    U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count;\r\n                    String8Node *hit_path_node = 0;\r\n                    for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next)\r\n                    {\r\n                      if(str8_match(n->string, file_path_sanitized, 0))\r\n                      {\r\n                        hit_path_node = n;\r\n                        break;\r\n                      }\r\n                    }\r\n                    if(hit_path_node == 0)\r\n                    {\r\n                      hit_path_node = push_array(scratch2.arena, String8Node, 1);\r\n                      SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node);\r\n                      hit_path_node->string = file_path_sanitized;\r\n                      P2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, P2R_SrcFileStubNode, 1);\r\n                      SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n);\r\n                      src_file_stub_count += 1;\r\n                      stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized);\r\n                      stub_n->v.checksum_kind = checksum_kind;\r\n                      stub_n->v.checksum = str8_copy(scratch.arena, checksum_value);\r\n                    }\r\n                    line_count = 0;\r\n                  }\r\n                  \r\n                  // rjf: count lines\r\n                  if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine)\r\n                  {\r\n                    line_count += 1;\r\n                  }\r\n                  \r\n                  // rjf: no more flags -> done\r\n                  if(step.flags == 0)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        // rjf: find all files in this unit's (non-inline) line info\r\n        ProfScope(\"find all files in this unit's (non-inline) line info\")\r\n          for(CV_C13SubSectionNode *node = c13->first_sub_section;\r\n              node != 0;\r\n              node = node->next)\r\n        {\r\n          if(node->kind == CV_C13SubSectionKind_Lines)\r\n          {\r\n            for(CV_C13LinesParsedNode *lines_n = node->lines_first;\r\n                lines_n != 0;\r\n                lines_n = lines_n->next)\r\n            {\r\n              // rjf: file name -> sanitized file path\r\n              String8 file_path = lines_n->v.file_name;\r\n              String8 file_path_sanitized = str8_copy(scratch2.arena, str8_skip_chop_whitespace(file_path));\r\n              {\r\n                PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized);\r\n                String8List file_path_sanitized_parts = str8_split_path(scratch2.arena, file_path_sanitized);\r\n                if(file_path_sanitized_style == PathStyle_Relative)\r\n                {\r\n                  String8List obj_folder_path_parts = str8_split_path(scratch2.arena, obj_folder_path);\r\n                  str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts);\r\n                  file_path_sanitized_parts = obj_folder_path_parts;\r\n                  file_path_sanitized_style = path_style_from_str8(obj_folder_path);\r\n                }\r\n                str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style);\r\n                file_path_sanitized = str8_path_list_join_by_style(scratch2.arena, &file_path_sanitized_parts, file_path_sanitized_style);\r\n              }\r\n              \r\n              // rjf: sanitized file path -> source file node\r\n              U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size);\r\n              U64 hit_path_slot = file_path_sanitized_hash%hit_path_slots_count;\r\n              String8Node *hit_path_node = 0;\r\n              for(String8Node *n = hit_path_slots[hit_path_slot]; n != 0; n = n->next)\r\n              {\r\n                if(str8_match(n->string, file_path_sanitized, 0))\r\n                {\r\n                  hit_path_node = n;\r\n                  break;\r\n                }\r\n              }\r\n              if(hit_path_node == 0)\r\n              {\r\n                hit_path_node = push_array(scratch2.arena, String8Node, 1);\r\n                SLLStackPush(hit_path_slots[hit_path_slot], hit_path_node);\r\n                hit_path_node->string = file_path_sanitized;\r\n                P2R_SrcFileStubNode *stub_n = push_array(scratch2.arena, P2R_SrcFileStubNode, 1);\r\n                SLLQueuePush(first_src_file_stub, last_src_file_stub, stub_n);\r\n                src_file_stub_count += 1;\r\n                stub_n->v.file_path = str8_copy(scratch.arena, file_path_sanitized);\r\n                stub_n->v.checksum_kind = lines_n->v.checksum_kind;\r\n                stub_n->v.checksum = str8_copy(scratch.arena, lines_n->v.checksum);\r\n              }\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: merge into array for this unit\r\n        unit_file_stubs[unit_idx].count = src_file_stub_count;\r\n        unit_file_stubs[unit_idx].v = push_array_no_zero(scratch.arena, P2R_SrcFileStub, unit_file_stubs[unit_idx].count);\r\n        {\r\n          U64 idx = 0;\r\n          for EachNode(n, P2R_SrcFileStubNode, first_src_file_stub)\r\n          {\r\n            unit_file_stubs[unit_idx].v[idx] = n->v;\r\n            idx += 1;\r\n          }\r\n        }\r\n        \r\n        //- rjf: hash this unit's file paths\r\n        U64Array hashes = {0};\r\n        hashes.count = unit_file_stubs[unit_idx].count;\r\n        hashes.v = push_array(scratch.arena, U64, hashes.count);\r\n        for EachIndex(idx, unit_file_stubs[unit_idx].count)\r\n        {\r\n          hashes.v[idx] = rdi_hash(unit_file_stubs[unit_idx].v[idx].file_path.str, unit_file_stubs[unit_idx].v[idx].file_path.size);\r\n        }\r\n        unit_file_paths_hashes[unit_idx] = hashes;\r\n      }\r\n      lane_sync();\r\n      \r\n      scratch_end(scratch2);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: build unified collection & map for source files\r\n  //\r\n  RDIM_SrcFileChunkList *all_src_files__sequenceless = 0;\r\n  P2R_SrcFileMap *src_file_map = 0;\r\n  if(lane_idx() == 0 && params->subset_flags & (RDIM_SubsetFlag_NormalSourcePathNameMap|\r\n                                                RDIM_SubsetFlag_LineInfo|\r\n                                                RDIM_SubsetFlag_InlineLineInfo))\r\n  {\r\n    //- rjf: set up table\r\n    U64 total_path_count = 0;\r\n    ProfScope(\"set up table\")\r\n    {\r\n      all_src_files__sequenceless = push_array(scratch.arena, RDIM_SrcFileChunkList, 1);\r\n      src_file_map = push_array(scratch.arena, P2R_SrcFileMap, 1);\r\n      for EachIndex(idx, comp_units->count)\r\n      {\r\n        total_path_count += unit_file_stubs[idx].count;\r\n      }\r\n      src_file_map->slots_count = total_path_count + total_path_count/2 + 1;\r\n      src_file_map->slots = push_array(scratch.arena, P2R_SrcFileNode *, src_file_map->slots_count);\r\n    }\r\n    \r\n    //- rjf: fill table\r\n    ProfScope(\"fill table\")\r\n    {\r\n      for EachIndex(idx, comp_units->count)\r\n      {\r\n        P2R_SrcFileStubArray stubs = unit_file_stubs[idx];\r\n        U64Array hashes = unit_file_paths_hashes[idx];\r\n        for EachIndex(stub_idx, stubs.count)\r\n        {\r\n          String8 file_path_sanitized = stubs.v[stub_idx].file_path;\r\n          CV_C13ChecksumKind c13_checksum_kind = stubs.v[stub_idx].checksum_kind;\r\n          String8 checksum = stubs.v[stub_idx].checksum;\r\n          U64 file_path_sanitized_hash = hashes.v[stub_idx];\r\n          U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count;\r\n          P2R_SrcFileNode *src_file_node = 0;\r\n          for(P2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next)\r\n          {\r\n            if(str8_match(n->src_file->path, file_path_sanitized, 0))\r\n            {\r\n              src_file_node = n;\r\n              break;\r\n            }\r\n          }\r\n          if(src_file_node == 0)\r\n          {\r\n            src_file_node = push_array(arena, P2R_SrcFileNode, 1);\r\n            SLLStackPush(src_file_map->slots[src_file_slot], src_file_node);\r\n            src_file_node->src_file = rdim_src_file_chunk_list_push(arena, all_src_files__sequenceless, total_path_count);\r\n            src_file_node->src_file->path = str8_copy(arena, file_path_sanitized);\r\n            src_file_node->src_file->checksum_kind = p2r_rdi_from_cv_c13_checksum_kind(c13_checksum_kind);\r\n            src_file_node->src_file->checksum = str8_copy(arena, checksum);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync_u64(&all_src_files__sequenceless, 0);\r\n  lane_sync_u64(&src_file_map, 0);\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: convert unit info\r\n  //\r\n  RDIM_UnitChunkList *all_units_ptr = 0;\r\n  RDIM_LineTableChunkList *units_line_tables = 0;\r\n  RDIM_LineTable **units_first_inline_site_line_tables = 0;\r\n  ProfScope(\"convert unit info\")\r\n  {\r\n    //- rjf: set up outputs\r\n    ProfScope(\"set up outputs\") if(lane_idx() == 0)\r\n    {\r\n      all_units_ptr = push_array(scratch.arena, RDIM_UnitChunkList, 1);\r\n      if(params->subset_flags & RDIM_SubsetFlag_Units)\r\n      {\r\n        for EachIndex(idx, comp_units->count)\r\n        {\r\n          rdim_unit_chunk_list_push(arena, all_units_ptr, comp_units->count);\r\n        }\r\n      }\r\n      units_line_tables = push_array(scratch.arena, RDIM_LineTableChunkList, comp_units->count);\r\n      units_first_inline_site_line_tables = push_array(scratch.arena, RDIM_LineTable *, comp_units->count);\r\n    }\r\n    lane_sync_u64(&all_units_ptr, 0);\r\n    lane_sync_u64(&units_line_tables, 0);\r\n    lane_sync_u64(&units_first_inline_site_line_tables, 0);\r\n    RDIM_Unit *units = all_units_ptr->first ? all_units_ptr->first->v : 0;\r\n    U64 units_count = all_units_ptr->first ? all_units_ptr->first->count : 0;\r\n    Assert(units_count == comp_units->count);\r\n    \r\n    //- rjf: do per-lane work\r\n    if(params->subset_flags & (RDIM_SubsetFlag_Units|\r\n                               RDIM_SubsetFlag_NormalSourcePathNameMap|\r\n                               RDIM_SubsetFlag_LineInfo|\r\n                               RDIM_SubsetFlag_InlineLineInfo))\r\n    {\r\n      U64 sym_take_counter = 0;\r\n      U64 *sym_take_counter_ptr = &sym_take_counter;\r\n      lane_sync_u64(&sym_take_counter_ptr, 0);\r\n      ProfScope(\"wide fill\") for(;;)\r\n      {\r\n        //- rjf: take next unit\r\n        U64 unit_idx = ins_atomic_u64_inc_eval(sym_take_counter_ptr) - 1;\r\n        if(unit_idx >= comp_units->count)\r\n        {\r\n          break;\r\n        }\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        RDIM_LineTableChunkList *dst_line_tables = &units_line_tables[unit_idx];\r\n        PDB_CompUnit *src_unit     = comp_units->units[unit_idx];\r\n        CV_SymParsed *src_unit_sym = all_syms[unit_idx+1];\r\n        CV_C13Parsed *src_unit_c13 = all_c13s[unit_idx+1];\r\n        RDIM_Unit *dst_unit = 0;\r\n        if(params->subset_flags & RDIM_SubsetFlag_Units) { dst_unit = &units[unit_idx]; }\r\n        \r\n        // rjf: extract unit name\r\n        String8 unit_name = src_unit->obj_name;\r\n        if(unit_name.size != 0)\r\n        {\r\n          String8 unit_name_past_last_slash = str8_skip_last_slash(unit_name);\r\n          if(unit_name_past_last_slash.size != 0)\r\n          {\r\n            unit_name = unit_name_past_last_slash;\r\n          }\r\n        }\r\n        \r\n        // rjf: produce obj name/path\r\n        String8 obj_name = src_unit->obj_name;\r\n        if(str8_match(obj_name, str8_lit(\"* Linker *\"), 0) ||\r\n           str8_match(obj_name, str8_lit(\"Import:\"), StringMatchFlag_RightSideSloppy))\r\n        {\r\n          MemoryZeroStruct(&obj_name);\r\n        }\r\n        String8 obj_folder_path = backslashed_from_str8(scratch.arena, str8_chop_last_slash(obj_name));\r\n        \r\n        //- rjf: main unit line table conversion\r\n        if(params->subset_flags & RDIM_SubsetFlag_LineInfo) ProfScope(\"main unit line table conversion\")\r\n        {\r\n          RDIM_LineTable *line_table = 0;\r\n          for(CV_C13SubSectionNode *node = src_unit_c13->first_sub_section;\r\n              node != 0;\r\n              node = node->next)\r\n          {\r\n            if(node->kind == CV_C13SubSectionKind_Lines)\r\n            {\r\n              for(CV_C13LinesParsedNode *lines_n = node->lines_first;\r\n                  lines_n != 0;\r\n                  lines_n = lines_n->next)\r\n              {\r\n                CV_C13LinesParsed *lines = &lines_n->v;\r\n                \r\n                // rjf: file name -> sanitized file path\r\n                String8 file_path = lines->file_name;\r\n                String8 file_path_sanitized = str8_copy(scratch.arena, str8_skip_chop_whitespace(file_path));\r\n                {\r\n                  PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized);\r\n                  String8List file_path_sanitized_parts = str8_split_path(scratch.arena, file_path_sanitized);\r\n                  if(file_path_sanitized_style == PathStyle_Relative)\r\n                  {\r\n                    String8List obj_folder_path_parts = str8_split_path(scratch.arena, obj_folder_path);\r\n                    str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts);\r\n                    file_path_sanitized_parts = obj_folder_path_parts;\r\n                    file_path_sanitized_style = path_style_from_str8(obj_folder_path);\r\n                  }\r\n                  str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style);\r\n                  file_path_sanitized = str8_path_list_join_by_style(scratch.arena, &file_path_sanitized_parts, file_path_sanitized_style);\r\n                }\r\n                \r\n                // rjf: sanitized file path -> source file node\r\n                U64 file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size);\r\n                U64 src_file_slot = file_path_sanitized_hash%src_file_map->slots_count;\r\n                P2R_SrcFileNode *src_file_node = 0;\r\n                if(lines->line_count != 0)\r\n                {\r\n                  for(P2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next)\r\n                  {\r\n                    if(str8_match(n->src_file->path, file_path_sanitized, 0))\r\n                    {\r\n                      src_file_node = n;\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: push sequence into both line table & source file's line map\r\n                if(src_file_node != 0)\r\n                {\r\n                  if(line_table == 0)\r\n                  {\r\n                    line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 256);\r\n                  }\r\n                  RDIM_LineSequence *seq = rdim_line_table_push_sequence(arena, dst_line_tables, line_table, src_file_node->src_file, lines->voffs, lines->line_nums, lines->col_nums, lines->line_count);\r\n                }\r\n              }\r\n            }\r\n          }\r\n          \r\n          // rjf: fill unit\r\n          if(dst_unit != 0)\r\n          {\r\n            dst_unit->unit_name     = unit_name;\r\n            dst_unit->compiler_name = src_unit_sym->info.compiler_name;\r\n            dst_unit->object_file   = obj_name;\r\n            dst_unit->archive_file  = src_unit->group_name;\r\n            dst_unit->language      = p2r_rdi_language_from_cv_language(src_unit_sym->info.language);\r\n            dst_unit->line_table    = line_table;\r\n            dst_unit->voff_ranges   = unit_ranges[unit_idx];\r\n          }\r\n        }\r\n        \r\n        //- rjf: build per-inline-site line tables\r\n        if(params->subset_flags & RDIM_SubsetFlag_InlineLineInfo) ProfScope(\"build per-inline-site line tables\")\r\n        {\r\n          CV_RecRange *rec_ranges_first = src_unit_sym->sym_ranges.ranges;\r\n          CV_RecRange *rec_ranges_opl   = src_unit_sym->sym_ranges.ranges + src_unit_sym->sym_ranges.count;\r\n          U64 base_voff = 0;\r\n          for(CV_RecRange *rec_range = rec_ranges_first;\r\n              rec_range < rec_ranges_opl;\r\n              rec_range += 1)\r\n          {\r\n            //- rjf: rec range -> symbol info range\r\n            U64 sym_off_first = rec_range->off + 2;\r\n            U64 sym_off_opl   = rec_range->off + rec_range->hdr.size;\r\n            \r\n            //- rjf: skip invalid ranges\r\n            if(sym_off_opl > src_unit_sym->data.size || sym_off_first > src_unit_sym->data.size || sym_off_first > sym_off_opl)\r\n            {\r\n              continue;\r\n            }\r\n            \r\n            //- rjf: unpack symbol info\r\n            CV_SymKind kind = rec_range->hdr.kind;\r\n            U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind);\r\n            void *sym_header_struct_base = src_unit_sym->data.str + sym_off_first;\r\n            void *sym_data_opl = src_unit_sym->data.str + sym_off_opl;\r\n            \r\n            //- rjf: skip bad sizes\r\n            if(sym_off_first + sym_header_struct_size > sym_off_opl)\r\n            {\r\n              continue;\r\n            }\r\n            \r\n            //- rjf: process symbol\r\n            switch(kind)\r\n            {\r\n              default:{}break;\r\n              \r\n              //- rjf: LPROC32/GPROC32 (gather base address)\r\n              case CV_SymKind_LPROC32:\r\n              case CV_SymKind_GPROC32:\r\n              {\r\n                CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base;\r\n                COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0;\r\n                if(section != 0)\r\n                {\r\n                  base_voff = section->voff + proc32->off;\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: INLINESITE\r\n              case CV_SymKind_INLINESITE:\r\n              {\r\n                // rjf: unpack sym\r\n                CV_SymInlineSite *sym           = (CV_SymInlineSite *)sym_header_struct_base;\r\n                String8           binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym));\r\n                \r\n                // rjf: map inlinee -> parsed cv c13 inlinee line info\r\n                CV_C13InlineeLinesParsed *inlinee_lines_parsed = 0;\r\n                {\r\n                  U64 hash = cv_hash_from_item_id(sym->inlinee);\r\n                  U64 slot_idx = hash%src_unit_c13->inlinee_lines_parsed_slots_count;\r\n                  for(CV_C13InlineeLinesParsedNode *n = src_unit_c13->inlinee_lines_parsed_slots[slot_idx]; n != 0; n = n->hash_next)\r\n                  {\r\n                    if(n->v.inlinee == sym->inlinee)\r\n                    {\r\n                      inlinee_lines_parsed = &n->v;\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: build line table, fill with parsed binary annotations\r\n                if(inlinee_lines_parsed != 0)\r\n                {\r\n                  // rjf: grab checksums sub-section\r\n                  CV_C13SubSectionNode *file_chksms = src_unit_c13->file_chksms_sub_section;\r\n                  \r\n                  // rjf: gathered lines\r\n                  typedef struct LineChunk LineChunk;\r\n                  struct LineChunk\r\n                  {\r\n                    LineChunk *next;\r\n                    U64        cap;\r\n                    U64        count;\r\n                    U64       *voffs;     // [line_count + 1] (sorted)\r\n                    U32       *line_nums; // [line_count]\r\n                    U16       *col_nums;  // [2*line_count]\r\n                  };\r\n                  LineChunk       *first_line_chunk            = 0;\r\n                  LineChunk       *last_line_chunk             = 0;\r\n                  U64              total_line_chunk_line_count = 0;\r\n                  U32              last_file_off               = max_U32;\r\n                  U32              curr_file_off               = max_U32;\r\n                  RDIM_LineTable*  line_table                  = 0;\r\n                  \r\n                  CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(inlinee_lines_parsed->file_off, inlinee_lines_parsed->first_source_ln, base_voff);\r\n                  for(;;)\r\n                  {\r\n                    // rjf: step & update\r\n                    CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots);\r\n                    if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitFile)\r\n                    {\r\n                      last_file_off = curr_file_off;\r\n                      curr_file_off = step.file_off;\r\n                    }\r\n                    if(step.flags == 0 && total_line_chunk_line_count > 0)\r\n                    {\r\n                      last_file_off = curr_file_off;\r\n                      curr_file_off = max_U32;\r\n                    }\r\n                    \r\n                    // rjf: file updated -> push line chunks gathered for this file\r\n                    if(last_file_off != max_U32 && last_file_off != curr_file_off)\r\n                    {\r\n                      String8 seq_file_name = {0};\r\n                      if(last_file_off + sizeof(CV_C13Checksum) <= file_chksms->size)\r\n                      {\r\n                        CV_C13Checksum *checksum = (CV_C13Checksum*)(src_unit_c13->data.str + file_chksms->off + last_file_off);\r\n                        U32 name_off = checksum->name_off;\r\n                        seq_file_name = pdb_strtbl_string_from_off(strtbl, name_off);\r\n                      }\r\n                      \r\n                      // rjf: file name -> sanitized file path\r\n                      String8 file_path            = seq_file_name;\r\n                      String8 file_path_sanitized  = str8_copy(scratch.arena, str8_skip_chop_whitespace(file_path));\r\n                      {\r\n                        PathStyle file_path_sanitized_style = path_style_from_str8(file_path_sanitized);\r\n                        String8List file_path_sanitized_parts = str8_split_path(scratch.arena, file_path_sanitized);\r\n                        if(file_path_sanitized_style == PathStyle_Relative)\r\n                        {\r\n                          String8List obj_folder_path_parts = str8_split_path(scratch.arena, obj_folder_path);\r\n                          str8_list_concat_in_place(&obj_folder_path_parts, &file_path_sanitized_parts);\r\n                          file_path_sanitized_parts = obj_folder_path_parts;\r\n                          file_path_sanitized_style = path_style_from_str8(obj_folder_path);\r\n                        }\r\n                        str8_path_list_resolve_dots_in_place(&file_path_sanitized_parts, file_path_sanitized_style);\r\n                        file_path_sanitized = str8_path_list_join_by_style(scratch.arena, &file_path_sanitized_parts, file_path_sanitized_style);\r\n                      }\r\n                      \r\n                      // rjf: sanitized file path -> source file node\r\n                      U64              file_path_sanitized_hash = rdi_hash(file_path_sanitized.str, file_path_sanitized.size);\r\n                      U64              src_file_slot            = file_path_sanitized_hash%src_file_map->slots_count;\r\n                      P2R_SrcFileNode *src_file_node            = 0;\r\n                      for(P2R_SrcFileNode *n = src_file_map->slots[src_file_slot]; n != 0; n = n->next)\r\n                      {\r\n                        if(str8_match(n->src_file->path, file_path_sanitized, 0))\r\n                        {\r\n                          src_file_node = n;\r\n                          break;\r\n                        }\r\n                      }\r\n                      \r\n                      // rjf: gather all lines\r\n                      RDI_U64 *voffs      = 0;\r\n                      RDI_U32 *line_nums  = 0;\r\n                      RDI_U64  line_count = 0;\r\n                      if(src_file_node != 0)\r\n                      {\r\n                        voffs = push_array_no_zero(arena, RDI_U64, total_line_chunk_line_count+1);\r\n                        line_nums = push_array_no_zero(arena, RDI_U32, total_line_chunk_line_count);\r\n                        line_count = total_line_chunk_line_count;\r\n                        U64 dst_idx = 0;\r\n                        for(LineChunk *chunk = first_line_chunk; chunk != 0; chunk = chunk->next)\r\n                        {\r\n                          MemoryCopy(voffs+dst_idx, chunk->voffs, sizeof(U64)*(chunk->count+1));\r\n                          MemoryCopy(line_nums+dst_idx, chunk->line_nums, sizeof(U32)*chunk->count);\r\n                          dst_idx += chunk->count;\r\n                        }\r\n                      }\r\n                      \r\n                      // rjf: push\r\n                      if(line_count != 0)\r\n                      {\r\n                        if(line_table == 0)\r\n                        {\r\n                          line_table = rdim_line_table_chunk_list_push(arena, dst_line_tables, 256);\r\n                          if(units_first_inline_site_line_tables[unit_idx] == 0)\r\n                          {\r\n                            units_first_inline_site_line_tables[unit_idx] = line_table;\r\n                          }\r\n                        }\r\n                        rdim_line_table_push_sequence(arena, dst_line_tables, line_table, src_file_node->src_file, voffs, line_nums, 0, line_count);\r\n                      }\r\n                      \r\n                      // rjf: clear line chunks for subsequent sequences\r\n                      first_line_chunk            = last_line_chunk = 0;\r\n                      total_line_chunk_line_count = 0;\r\n                    }\r\n                    \r\n                    // rjf: new line -> emit to chunk\r\n                    if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitLine)\r\n                    {\r\n                      LineChunk *chunk = last_line_chunk;\r\n                      if(chunk == 0 || chunk->count+1 >= chunk->cap)\r\n                      {\r\n                        chunk = push_array(scratch.arena, LineChunk, 1);\r\n                        SLLQueuePush(first_line_chunk, last_line_chunk, chunk);\r\n                        chunk->cap       = 8;\r\n                        chunk->voffs     = push_array_no_zero(scratch.arena, U64, chunk->cap);\r\n                        chunk->line_nums = push_array_no_zero(scratch.arena, U32, chunk->cap);\r\n                      }\r\n                      chunk->voffs[chunk->count]     = step.line_voff;\r\n                      chunk->voffs[chunk->count+1]   = step.line_voff_end;\r\n                      chunk->line_nums[chunk->count] = step.ln;\r\n                      chunk->count                  += 1;\r\n                      total_line_chunk_line_count   += 1;\r\n                    }\r\n                    \r\n                    // rjf: no more flags -> done\r\n                    if(step.flags == 0)\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n              }break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  RDIM_UnitChunkList all_units = *all_units_ptr;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: join all line tables\r\n  //\r\n  RDIM_LineTableChunkList all_line_tables = {0};\r\n  RDIM_LineTableChunkList *all_line_tables_ptr = &all_line_tables;\r\n  ProfScope(\"join all line tables\") if(lane_idx() == 0)\r\n  {\r\n    for EachIndex(idx, comp_units->count)\r\n    {\r\n      rdim_line_table_chunk_list_concat_in_place(&all_line_tables, &units_line_tables[idx]);\r\n    }\r\n  }\r\n  lane_sync_u64(&all_line_tables_ptr, 0);\r\n  all_line_tables = *all_line_tables_ptr;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: equip source files with line sequences\r\n  //\r\n  ProfScope(\"equip source files with line sequences\") if(lane_idx() == 0)\r\n  {\r\n    for(RDIM_LineTableChunkNode *line_table_chunk_n = all_line_tables.first;\r\n        line_table_chunk_n != 0;\r\n        line_table_chunk_n = line_table_chunk_n->next)\r\n    {\r\n      for EachIndex(chunk_line_table_idx, line_table_chunk_n->count)\r\n      {\r\n        RDIM_LineTable *line_table = &line_table_chunk_n->v[chunk_line_table_idx];\r\n        for(RDIM_LineSequenceNode *s = line_table->first_seq; s != 0; s = s->next)\r\n        {\r\n          rdim_src_file_push_line_sequence(arena, all_src_files__sequenceless, s->v.src_file, &s->v);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  RDIM_SrcFileChunkList all_src_files = *all_src_files__sequenceless;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: types pass 1: produce type forward resolution map\r\n  //\r\n  // this map is used to resolve usage of \"incomplete structs\" in codeview's\r\n  // type info. this often happens when e.g. \"struct Foo\" is used to refer to\r\n  // a later-defined \"Foo\", which actually contains members  and so on. we want\r\n  // to hook types up to their actual destination complete types wherever\r\n  // possible, and so this map can be used to do that in subsequent stages.\r\n  //\r\n  CV_TypeId *itype_fwd_map = 0;\r\n  CV_TypeId itype_first = 0;\r\n  CV_TypeId itype_opl = 0;\r\n  ProfScope(\"types pass 1: produce type forward resolution map\")\r\n  {\r\n    //- rjf: allocate forward resolution map\r\n    if(lane_idx() == 0)\r\n    {\r\n      itype_first = tpi_leaf->itype_first;\r\n      itype_opl = tpi_leaf->itype_opl;\r\n      itype_fwd_map = push_array(scratch.arena, CV_TypeId, (U64)itype_opl);\r\n    }\r\n    lane_sync_u64(&itype_first, 0);\r\n    lane_sync_u64(&itype_opl, 0);\r\n    lane_sync_u64(&itype_fwd_map, 0);\r\n    \r\n    //- rjf: do wide fill\r\n    if(params->subset_flags & RDIM_SubsetFlag_Types)\r\n    {\r\n      Rng1U64 range = lane_range(itype_opl);\r\n      for EachInRange(idx, range)\r\n      {\r\n        CV_TypeId itype = (CV_TypeId)idx;\r\n        if(itype < itype_first) { continue; }\r\n        \r\n        //- rjf: determine if this itype resolves to another\r\n        CV_TypeId itype_fwd = 0;\r\n        CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first];\r\n        CV_LeafKind kind = range->hdr.kind;\r\n        U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind);\r\n        if(range->off+range->hdr.size <= tpi_leaf->data.size &&\r\n           range->off+2+header_struct_size <= tpi_leaf->data.size &&\r\n           range->hdr.size >= 2)\r\n        {\r\n          U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2;\r\n          U8 *itype_leaf_opl   = itype_leaf_first + range->hdr.size-2;\r\n          switch(kind)\r\n          {\r\n            default:{}break;\r\n            \r\n            //- rjf: CLASS/STRUCTURE\r\n            case CV_LeafKind_CLASS:\r\n            case CV_LeafKind_STRUCTURE:\r\n            {\r\n              // rjf: unpack leaf header\r\n              CV_LeafStruct *lf_struct = (CV_LeafStruct *)itype_leaf_first;\r\n              \r\n              // rjf: has fwd ref flag -> lookup itype that this itype resolves to\r\n              if(lf_struct->props & CV_TypeProp_FwdRef)\r\n              {\r\n                // rjf: unpack rest of leaf\r\n                U8 *numeric_ptr = (U8 *)(lf_struct + 1);\r\n                CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n                U8 *name_ptr = numeric_ptr + size.encoded_size;\r\n                String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n                U8 *unique_name_ptr = name_ptr + name.size + 1;\r\n                String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl);\r\n                \r\n                // rjf: lookup\r\n                B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) &&\r\n                                             ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0));\r\n                itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup);\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: CLASS2/STRUCT2\r\n            case CV_LeafKind_CLASS2:\r\n            case CV_LeafKind_STRUCT2:\r\n            {\r\n              // rjf: unpack leaf header\r\n              CV_LeafStruct2 *lf_struct = (CV_LeafStruct2 *)itype_leaf_first;\r\n              \r\n              // rjf: has fwd ref flag -> lookup itype that this itype resolves to\r\n              if(lf_struct->props & CV_TypeProp_FwdRef)\r\n              {\r\n                // rjf: unpack rest of leaf\r\n                U8 *numeric_ptr = (U8 *)(lf_struct + 1);\r\n                CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n                U8 *name_ptr = (U8 *)numeric_ptr + size.encoded_size;\r\n                String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n                U8 *unique_name_ptr = name_ptr + name.size + 1;\r\n                String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl);\r\n                \r\n                // rjf: lookup\r\n                B32 do_unique_name_lookup = (((lf_struct->props & CV_TypeProp_Scoped) != 0) &&\r\n                                             ((lf_struct->props & CV_TypeProp_HasUniqueName) != 0));\r\n                itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup);\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: UNION\r\n            case CV_LeafKind_UNION:\r\n            {\r\n              // rjf: unpack leaf\r\n              CV_LeafUnion *lf_union = (CV_LeafUnion *)itype_leaf_first;\r\n              U8 *numeric_ptr = (U8 *)(lf_union + 1);\r\n              CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n              U8 *name_ptr = numeric_ptr + size.encoded_size;\r\n              String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n              U8 *unique_name_ptr = name_ptr + name.size + 1;\r\n              String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl);\r\n              \r\n              // rjf: has fwd ref flag -> lookup itype that this itype resolves tos\r\n              if(lf_union->props & CV_TypeProp_FwdRef)\r\n              {\r\n                B32 do_unique_name_lookup = (((lf_union->props & CV_TypeProp_Scoped) != 0) &&\r\n                                             ((lf_union->props & CV_TypeProp_HasUniqueName) != 0));\r\n                itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup);\r\n              }\r\n            }break;\r\n            \r\n            //- rjf: ENUM\r\n            case CV_LeafKind_ENUM:\r\n            {\r\n              // rjf: unpack leaf\r\n              CV_LeafEnum *lf_enum = (CV_LeafEnum*)itype_leaf_first;\r\n              U8 *name_ptr = (U8 *)(lf_enum + 1);\r\n              String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n              U8 *unique_name_ptr = name_ptr + name.size + 1;\r\n              String8 unique_name = str8_cstring_capped(unique_name_ptr, itype_leaf_opl);\r\n              \r\n              // rjf: has fwd ref flag -> lookup itype that this itype resolves to\r\n              if(lf_enum->props & CV_TypeProp_FwdRef)\r\n              {\r\n                B32 do_unique_name_lookup = (((lf_enum->props & CV_TypeProp_Scoped) != 0) &&\r\n                                             ((lf_enum->props & CV_TypeProp_HasUniqueName) != 0));\r\n                itype_fwd = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, do_unique_name_lookup?unique_name:name, do_unique_name_lookup);\r\n              }\r\n            }break;\r\n          }\r\n        }\r\n        \r\n        //- rjf: if the forwarded itype is nonzero & in TPI range -> save to map\r\n        if(itype_fwd != 0 && itype_fwd < tpi_leaf->itype_opl)\r\n        {\r\n          itype_fwd_map[itype] = itype_fwd;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: types pass 2: produce per-itype itype chain\r\n  //\r\n  // this pass is to ensure that subsequent passes always produce types for\r\n  // dependent itypes first - guaranteeing rdi's \"only reference backward\"\r\n  // rule (which eliminates cycles). each itype slot gets a list of itypes,\r\n  // starting with the deepest dependency - when types are produced per-itype,\r\n  // this chain is walked, so that deeper dependencies are built first, and\r\n  // as such, always show up *earlier* in the actually built types.\r\n  //\r\n  P2R_TypeIdChain **itype_chains = 0;\r\n  ProfScope(\"types pass 2: produce per-itype itype chain (for producing dependent types first)\")\r\n  {\r\n    //- rjf: allocate itype chain table\r\n    if(lane_idx() == 0)\r\n    {\r\n      itype_chains = push_array(scratch.arena, P2R_TypeIdChain *, (U64)itype_opl);\r\n    }\r\n    lane_sync_u64(&itype_chains, 0);\r\n    \r\n    //- rjf: do wide fill\r\n    if(params->subset_flags & RDIM_SubsetFlag_Types)\r\n    {\r\n      Rng1U64 range = lane_range(itype_opl);\r\n      for EachInRange(idx, range)\r\n      {\r\n        CV_TypeId itype = (CV_TypeId)idx;\r\n        \r\n        //- rjf: push initial itype - should be final-visited-itype for this itype\r\n        {\r\n          P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n          c->itype = itype;\r\n          SLLStackPush(itype_chains[itype], c);\r\n        }\r\n        \r\n        //- rjf: skip basic types for dependency walk\r\n        if(itype < tpi_leaf->itype_first)\r\n        {\r\n          continue;\r\n        }\r\n        \r\n        //- rjf: walk dependent types, push to chain\r\n        Temp scratch2 = scratch_begin(&scratch.arena, 1);\r\n        P2R_TypeIdChain start_walk_task = {0, itype};\r\n        P2R_TypeIdChain *first_walk_task = &start_walk_task;\r\n        P2R_TypeIdChain *last_walk_task = &start_walk_task;\r\n        for(P2R_TypeIdChain *walk_task = first_walk_task;\r\n            walk_task != 0;\r\n            walk_task = walk_task->next)\r\n        {\r\n          CV_TypeId walk_itype = itype_fwd_map[walk_task->itype] ? itype_fwd_map[walk_task->itype] : walk_task->itype;\r\n          if(walk_itype < tpi_leaf->itype_first)\r\n          {\r\n            continue;\r\n          }\r\n          CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[walk_itype-tpi_leaf->itype_first];\r\n          CV_LeafKind kind = range->hdr.kind;\r\n          U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind);\r\n          if(range->off+range->hdr.size <= tpi_leaf->data.size &&\r\n             range->off+2+header_struct_size <= tpi_leaf->data.size &&\r\n             range->hdr.size >= 2)\r\n          {\r\n            U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2;\r\n            U8 *itype_leaf_opl   = itype_leaf_first + range->hdr.size-2;\r\n            switch(kind)\r\n            {\r\n              default:{}break;\r\n              \r\n              //- rjf: MODIFIER\r\n              case CV_LeafKind_MODIFIER:\r\n              {\r\n                CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first;\r\n                \r\n                // rjf: push dependent itype to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk dependency itype\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: POINTER\r\n              case CV_LeafKind_POINTER:\r\n              {\r\n                CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first;\r\n                \r\n                // rjf: push dependent itype to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk dependency itype\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: PROCEDURE\r\n              case CV_LeafKind_PROCEDURE:\r\n              {\r\n                CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first;\r\n                \r\n                // rjf: push return itypes to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->ret_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk return itype\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->ret_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n                \r\n                // rjf: unpack arglist range\r\n                CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-tpi_leaf->itype_first];\r\n                if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST ||\r\n                   arglist_range->hdr.size<2 ||\r\n                   arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size)\r\n                {\r\n                  break;\r\n                }\r\n                U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2;\r\n                U8 *arglist_opl   = arglist_first+arglist_range->hdr.size-2;\r\n                if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack arglist info\r\n                CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first;\r\n                CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1);\r\n                U32 arglist_itypes_count = arglist->count;\r\n                \r\n                // rjf: push arg types to chain\r\n                for(U32 idx = 0; idx < arglist_itypes_count; idx += 1)\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = arglist_itypes_base[idx];\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk arg types\r\n                for(U32 idx = 0; idx < arglist_itypes_count; idx += 1)\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = arglist_itypes_base[idx];\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: MFUNCTION\r\n              case CV_LeafKind_MFUNCTION:\r\n              {\r\n                CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first;\r\n                \r\n                // rjf: push dependent itypes to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->ret_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->arg_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->this_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk dependency itypes\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->ret_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->arg_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->this_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n                \r\n                // rjf: unpack arglist range\r\n                CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-tpi_leaf->itype_first];\r\n                if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST ||\r\n                   arglist_range->hdr.size<2 ||\r\n                   arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size)\r\n                {\r\n                  break;\r\n                }\r\n                U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2;\r\n                U8 *arglist_opl   = arglist_first+arglist_range->hdr.size-2;\r\n                if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack arglist info\r\n                CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first;\r\n                CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1);\r\n                U32 arglist_itypes_count = arglist->count;\r\n                \r\n                // rjf: push arg types to chain\r\n                for(U32 idx = 0; idx < arglist_itypes_count; idx += 1)\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = arglist_itypes_base[idx];\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk arg types\r\n                for(U32 idx = 0; idx < arglist_itypes_count; idx += 1)\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = arglist_itypes_base[idx];\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: BITFIELD\r\n              case CV_LeafKind_BITFIELD:\r\n              {\r\n                CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first;\r\n                \r\n                // rjf: push dependent itype to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk dependency itype\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: ARRAY\r\n              case CV_LeafKind_ARRAY:\r\n              {\r\n                CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first;\r\n                \r\n                // rjf: push dependent itypes to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->entry_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->index_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk dependency itypes\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->entry_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->index_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: ENUM\r\n              case CV_LeafKind_ENUM:\r\n              {\r\n                CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first;\r\n                \r\n                // rjf: push dependent itypes to chain\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->base_itype;\r\n                  SLLStackPush(itype_chains[itype], c);\r\n                }\r\n                \r\n                // rjf: push task to walk dependency itypes\r\n                {\r\n                  P2R_TypeIdChain *c = push_array(scratch2.arena, P2R_TypeIdChain, 1);\r\n                  c->itype = lf->base_itype;\r\n                  SLLQueuePush(first_walk_task, last_walk_task, c);\r\n                }\r\n              }break;\r\n            }\r\n          }\r\n        }\r\n        scratch_end(scratch2);\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: types pass 3: construct all types from TPI\r\n  //\r\n  // this doesn't gather struct/class/union/enum members, which is done by\r\n  // subsequent passes, to build RDI \"UDT\" information, which is distinct\r\n  // from regular type info.\r\n  //\r\n  RDIM_TypeChunkList all_types__pre_typedefs = {0};\r\n  RDIM_TypeChunkList *all_types__pre_typedefs_ptr = &all_types__pre_typedefs;\r\n  RDIM_Type **itype_type_ptrs = 0;\r\n  RDIM_Type **basic_type_ptrs = 0;\r\n  if(lane_idx() == 0) ProfScope(\"types pass 3: construct all root/stub types from TPI\")\r\n  {\r\n#define p2r_builtin_type_ptr_from_kind(kind) ((basic_type_ptrs && RDI_TypeKind_FirstBuiltIn <= (kind) && (kind) <= RDI_TypeKind_LastBuiltIn) ? (basic_type_ptrs[(kind) - RDI_TypeKind_FirstBuiltIn]) : 0)\r\n#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0)\r\n    itype_type_ptrs = push_array(scratch.arena, RDIM_Type *, (U64)(itype_opl));\r\n    basic_type_ptrs = push_array(scratch.arena, RDIM_Type *, (RDI_TypeKind_LastBuiltIn - RDI_TypeKind_FirstBuiltIn + 1));\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build basic types\r\n    //\r\n    if(params->subset_flags & RDIM_SubsetFlag_Types)\r\n    {\r\n      for(RDI_TypeKind type_kind = RDI_TypeKind_FirstBuiltIn;\r\n          type_kind <= RDI_TypeKind_LastBuiltIn;\r\n          type_kind += 1)\r\n      {\r\n        RDIM_Type *type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, 512);\r\n        type->name.str  = rdi_string_from_type_kind(type_kind, &type->name.size);\r\n        type->kind      = type_kind;\r\n        type->byte_size = rdi_size_from_basic_type_kind(type_kind);\r\n        basic_type_ptrs[type_kind - RDI_TypeKind_FirstBuiltIn] = type;\r\n      }\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build basic type aliases\r\n    //\r\n    if(params->subset_flags & RDIM_SubsetFlag_Types)\r\n    {\r\n      RDIM_DataModel data_model = rdim_data_model_from_os_arch(OperatingSystem_Windows, arch);\r\n      RDI_TypeKind short_type      = rdim_short_type_kind_from_data_model(data_model);\r\n      RDI_TypeKind ushort_type     = rdim_unsigned_short_type_kind_from_data_model(data_model);\r\n      RDI_TypeKind long_type       = rdim_long_type_kind_from_data_model(data_model);\r\n      RDI_TypeKind ulong_type      = rdim_unsigned_long_type_kind_from_data_model(data_model);\r\n      RDI_TypeKind long_long_type  = rdim_long_long_type_kind_from_data_model(data_model);\r\n      RDI_TypeKind ulong_long_type = rdim_unsigned_long_long_type_kind_from_data_model(data_model);\r\n      RDI_TypeKind ptr_type        = rdim_pointer_size_t_type_kind_from_data_model(data_model);\r\n      struct\r\n      {\r\n        char *       name;\r\n        RDI_TypeKind kind_rdi;\r\n        CV_LeafKind  kind_cv;\r\n      }\r\n      table[] =\r\n      {\r\n        { \"signed char\"          , RDI_TypeKind_Char8      , CV_BasicType_CHAR       },\r\n        { \"short\"                , short_type              , CV_BasicType_SHORT      },\r\n        { \"long\"                 , long_type               , CV_BasicType_LONG       },\r\n        { \"long long\"            , long_long_type          , CV_BasicType_QUAD       },\r\n        { \"__int128\"             , RDI_TypeKind_S128       , CV_BasicType_OCT        }, // Clang type\r\n        { \"unsigned char\"        , RDI_TypeKind_UChar8     , CV_BasicType_UCHAR      },\r\n        { \"unsigned short\"       , ushort_type             , CV_BasicType_USHORT     },\r\n        { \"unsigned long\"        , ulong_type              , CV_BasicType_ULONG      },\r\n        { \"unsigned long long\"   , ulong_long_type         , CV_BasicType_UQUAD      },\r\n        { \"__uint128\"            , RDI_TypeKind_U128       , CV_BasicType_UOCT       }, // Clang type\r\n        { \"bool\"                 , RDI_TypeKind_S8         , CV_BasicType_BOOL8      },\r\n        { \"__bool16\"             , RDI_TypeKind_S16        , CV_BasicType_BOOL16     }, // not real C type\r\n        { \"__bool32\"             , RDI_TypeKind_S32        , CV_BasicType_BOOL32     }, // not real C type\r\n        { \"float\"                , RDI_TypeKind_F32        , CV_BasicType_FLOAT32    },\r\n        { \"double\"               , RDI_TypeKind_F64        , CV_BasicType_FLOAT64    },\r\n        { \"long double\"          , RDI_TypeKind_F80        , CV_BasicType_FLOAT80    },\r\n        { \"__float128\"           , RDI_TypeKind_F128       , CV_BasicType_FLOAT128   }, // Clang type\r\n        { \"__float48\"            , RDI_TypeKind_F48        , CV_BasicType_FLOAT48    }, // not real C type\r\n        { \"__float32pp\"          , RDI_TypeKind_F32PP      , CV_BasicType_FLOAT32PP  }, // not real C type\r\n        { \"__float16\"            , RDI_TypeKind_F16        , CV_BasicType_FLOAT16    },\r\n        { \"_Complex float\"       , RDI_TypeKind_ComplexF32 , CV_BasicType_COMPLEX32  },\r\n        { \"_Complex double\"      , RDI_TypeKind_ComplexF64 , CV_BasicType_COMPLEX64  },\r\n        { \"_Complex long double\" , RDI_TypeKind_ComplexF80 , CV_BasicType_COMPLEX80  },\r\n        { \"_Complex __float128\"  , RDI_TypeKind_ComplexF128, CV_BasicType_COMPLEX128 },\r\n        { \"__int8\"               , RDI_TypeKind_S8         , CV_BasicType_INT8       },\r\n        { \"__uint8\"              , RDI_TypeKind_U8         , CV_BasicType_UINT8      },\r\n        { \"__int16\"              , RDI_TypeKind_S16        , CV_BasicType_INT16      },\r\n        { \"__uint16\"             , RDI_TypeKind_U16        , CV_BasicType_UINT16     },\r\n        { \"int\"                  , RDI_TypeKind_S32        , CV_BasicType_INT32      },\r\n        { \"int32\"                , RDI_TypeKind_S32        , CV_BasicType_INT32      },\r\n        { \"uint32\"               , RDI_TypeKind_U32        , CV_BasicType_UINT32     },\r\n        { \"__int64\"              , RDI_TypeKind_S64        , CV_BasicType_INT64      },\r\n        { \"__uint64\"             , RDI_TypeKind_U64        , CV_BasicType_UINT64     },\r\n        { \"__int128\"             , RDI_TypeKind_S128       , CV_BasicType_INT128     },\r\n        { \"__uint128\"            , RDI_TypeKind_U128       , CV_BasicType_UINT128    },\r\n        { \"char\"                 , RDI_TypeKind_Char8      , CV_BasicType_RCHAR      }, // always ASCII\r\n        { \"wchar_t\"              , RDI_TypeKind_UChar16    , CV_BasicType_WCHAR      }, // on windows always UTF-16\r\n        { \"char8_t\"              , RDI_TypeKind_Char8      , CV_BasicType_CHAR8      }, // always UTF-8\r\n        { \"char16_t\"             , RDI_TypeKind_Char16     , CV_BasicType_CHAR16     }, // always UTF-16\r\n        { \"char32_t\"             , RDI_TypeKind_Char32     , CV_BasicType_CHAR32     }, // always UTF-32\r\n        { \"__pointer\"            , ptr_type                , CV_BasicType_PTR        }\r\n      };\r\n      for EachElement(idx, table)\r\n      {\r\n        RDIM_Type *builtin_alias   = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, tpi_leaf->itype_opl);\r\n        builtin_alias->kind        = RDI_TypeKind_Alias;\r\n        builtin_alias->name        = str8_cstring(table[idx].name);\r\n        builtin_alias->direct_type = p2r_builtin_type_ptr_from_kind(table[idx].kind_rdi);\r\n        builtin_alias->byte_size   = rdi_size_from_basic_type_kind(table[idx].kind_rdi);\r\n        itype_type_ptrs[table[idx].kind_cv] = builtin_alias;\r\n      }\r\n      itype_type_ptrs[CV_BasicType_HRESULT] = basic_type_ptrs[RDI_TypeKind_HResult - RDI_TypeKind_FirstBuiltIn];\r\n      itype_type_ptrs[CV_BasicType_VOID]    = basic_type_ptrs[RDI_TypeKind_Void - RDI_TypeKind_FirstBuiltIn];\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: build types from TPI\r\n    //\r\n    if(params->subset_flags & RDIM_SubsetFlag_Types)\r\n    {\r\n      for(CV_TypeId root_itype = 0; root_itype < itype_opl; root_itype += 1)\r\n      {\r\n        for(P2R_TypeIdChain *itype_chain = itype_chains[root_itype];\r\n            itype_chain != 0;\r\n            itype_chain = itype_chain->next)\r\n        {\r\n          CV_TypeId itype = (root_itype != itype_chain->itype && itype_chain->itype < itype_opl && itype_fwd_map[itype_chain->itype]) ? itype_fwd_map[itype_chain->itype] : itype_chain->itype;\r\n          B32 itype_is_basic = (itype < tpi->itype_first);\r\n          \r\n          //////////////////////////\r\n          //- rjf: skip forward-reference itypes - all future resolutions will\r\n          // reference whatever this itype resolves to, and so there is no point\r\n          // in filling out this slot\r\n          //\r\n          if(itype_fwd_map[root_itype] != 0)\r\n          {\r\n            continue;\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: skip already produced dependencies\r\n          //\r\n          if(itype_type_ptrs[itype] != 0)\r\n          {\r\n            continue;\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build basic type\r\n          //\r\n          if(itype_is_basic)\r\n          {\r\n            RDIM_Type *dst_type = 0;\r\n            \r\n            // rjf: unpack itype\r\n            CV_BasicPointerKind cv_basic_ptr_kind  = CV_BasicPointerKindFromTypeId(itype);\r\n            CV_BasicType        cv_basic_type_code = CV_BasicTypeFromTypeId(itype);\r\n            \r\n            // rjf: get basic type slot, fill if unfilled\r\n            RDIM_Type *basic_type = itype_type_ptrs[cv_basic_type_code];\r\n            if(basic_type == 0)\r\n            {\r\n              RDI_TypeKind type_kind = p2r_rdi_type_kind_from_cv_basic_type(cv_basic_type_code);\r\n              U32 byte_size = rdi_size_from_basic_type_kind(type_kind);\r\n              basic_type = dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n              if(byte_size == 0xffffffff)\r\n              {\r\n                byte_size = arch_addr_size;\r\n              }\r\n              basic_type->kind      = type_kind;\r\n              basic_type->name      = cv_type_name_from_basic_type(cv_basic_type_code);\r\n              basic_type->byte_size = byte_size;\r\n            }\r\n            \r\n            // rjf: nonzero ptr kind -> form ptr type to basic tpye\r\n            if(cv_basic_ptr_kind != 0)\r\n            {\r\n              dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n              dst_type->kind        = RDI_TypeKind_Ptr;\r\n              dst_type->byte_size   = arch_addr_size;\r\n              dst_type->direct_type = basic_type;\r\n            }\r\n            \r\n            // rjf: fill this itype's slot with the finished type\r\n            itype_type_ptrs[itype] = dst_type;\r\n          }\r\n          \r\n          //////////////////////////\r\n          //- rjf: build non-basic type\r\n          //\r\n          if(!itype_is_basic && itype >= itype_first)\r\n          {\r\n            RDIM_Type *dst_type = 0;\r\n            CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-itype_first];\r\n            CV_LeafKind kind = range->hdr.kind;\r\n            U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind);\r\n            if(range->off+range->hdr.size <= tpi_leaf->data.size &&\r\n               range->off+2+header_struct_size <= tpi_leaf->data.size &&\r\n               range->hdr.size >= 2)\r\n            {\r\n              U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2;\r\n              U8 *itype_leaf_opl   = itype_leaf_first + range->hdr.size-2;\r\n              switch(kind)\r\n              {\r\n                //- rjf: MODIFIER\r\n                case CV_LeafKind_MODIFIER:\r\n                {\r\n                  // rjf: unpack leaf\r\n                  CV_LeafModifier *lf = (CV_LeafModifier *)itype_leaf_first;\r\n                  \r\n                  // rjf: cv -> rdi flags\r\n                  RDI_TypeModifierFlags flags = 0;\r\n                  if(lf->flags & CV_ModifierFlag_Const)    {flags |= RDI_TypeModifierFlag_Const;}\r\n                  if(lf->flags & CV_ModifierFlag_Volatile) {flags |= RDI_TypeModifierFlag_Volatile;}\r\n                  \r\n                  // rjf: fill type\r\n                  if(flags == 0)\r\n                  {\r\n                    dst_type = p2r_type_ptr_from_itype(lf->itype);\r\n                  }\r\n                  else\r\n                  {\r\n                    dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                    dst_type->kind        = RDI_TypeKind_Modifier;\r\n                    dst_type->flags       = flags;\r\n                    dst_type->direct_type = p2r_type_ptr_from_itype(lf->itype);\r\n                    dst_type->byte_size   = dst_type->direct_type ? dst_type->direct_type->byte_size : 0;\r\n                  }\r\n                }break;\r\n                \r\n                //- rjf: POINTER\r\n                case CV_LeafKind_POINTER:\r\n                {\r\n                  // TODO(rjf): if ptr_mode in {PtrMem, PtrMethod} then output a member pointer instead\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafPointer *lf = (CV_LeafPointer *)itype_leaf_first;\r\n                  RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype);\r\n                  CV_PointerKind ptr_kind = CV_PointerAttribs_Extract_Kind(lf->attribs);\r\n                  CV_PointerMode ptr_mode = CV_PointerAttribs_Extract_Mode(lf->attribs);\r\n                  U32            ptr_size = CV_PointerAttribs_Extract_Size(lf->attribs);\r\n                  \r\n                  // rjf: cv -> rdi modifier flags\r\n                  RDI_TypeModifierFlags modifier_flags = 0;\r\n                  if(lf->attribs & CV_PointerAttrib_Const)      {modifier_flags |= RDI_TypeModifierFlag_Const;}\r\n                  if(lf->attribs & CV_PointerAttrib_Volatile)   {modifier_flags |= RDI_TypeModifierFlag_Volatile;}\r\n                  if(lf->attribs & CV_PointerAttrib_Restricted) {modifier_flags |= RDI_TypeModifierFlag_Restrict;}\r\n                  \r\n                  // rjf: cv info -> rdi pointer type kind\r\n                  RDI_TypeKind type_kind = RDI_TypeKind_Ptr;\r\n                  {\r\n                    if(lf->attribs & CV_PointerAttrib_LRef)\r\n                    {\r\n                      type_kind = RDI_TypeKind_LRef;\r\n                    }\r\n                    else if(lf->attribs & CV_PointerAttrib_RRef)\r\n                    {\r\n                      type_kind = RDI_TypeKind_RRef;\r\n                    }\r\n                    if(ptr_mode == CV_PointerMode_LRef)\r\n                    {\r\n                      type_kind = RDI_TypeKind_LRef;\r\n                    }\r\n                    else if(ptr_mode == CV_PointerMode_RRef)\r\n                    {\r\n                      type_kind = RDI_TypeKind_RRef;\r\n                    }\r\n                  }\r\n                  \r\n                  // rjf: fill type\r\n                  if(modifier_flags != 0)\r\n                  {\r\n                    RDIM_Type *pointer_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                    dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                    dst_type->kind             = RDI_TypeKind_Modifier;\r\n                    dst_type->flags            = modifier_flags;\r\n                    dst_type->direct_type      = pointer_type;\r\n                    dst_type->byte_size        = arch_addr_size;\r\n                    pointer_type->kind         = type_kind;\r\n                    pointer_type->byte_size    = arch_addr_size;\r\n                    pointer_type->direct_type  = direct_type;\r\n                  }\r\n                  else\r\n                  {\r\n                    dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                    dst_type->kind        = type_kind;\r\n                    dst_type->byte_size   = arch_addr_size;\r\n                    dst_type->direct_type = direct_type;\r\n                  }\r\n                }break;\r\n                \r\n                //- rjf: PROCEDURE\r\n                case CV_LeafKind_PROCEDURE:\r\n                {\r\n                  // TODO(rjf): handle call_kind & attribs\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafProcedure *lf = (CV_LeafProcedure *)itype_leaf_first;\r\n                  RDIM_Type *ret_type = p2r_type_ptr_from_itype(lf->ret_itype);\r\n                  \r\n                  // rjf: fill type's basics\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  dst_type->kind        = RDI_TypeKind_Function;\r\n                  dst_type->byte_size   = arch_addr_size;\r\n                  dst_type->direct_type = ret_type;\r\n                  \r\n                  // rjf: unpack arglist range\r\n                  CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first];\r\n                  if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST ||\r\n                     arglist_range->hdr.size<2 ||\r\n                     arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size)\r\n                  {\r\n                    break;\r\n                  }\r\n                  U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2;\r\n                  U8 *arglist_opl   = arglist_first+arglist_range->hdr.size-2;\r\n                  if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl)\r\n                  {\r\n                    break;\r\n                  }\r\n                  \r\n                  // rjf: unpack arglist info\r\n                  CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first;\r\n                  CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1);\r\n                  U32 arglist_itypes_count = arglist->count;\r\n                  \r\n                  // rjf: build param type array\r\n                  RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count);\r\n                  for(U32 idx = 0; idx < arglist_itypes_count; idx += 1)\r\n                  {\r\n                    params[idx] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]);\r\n                  }\r\n                  \r\n                  // rjf: fill dst type\r\n                  dst_type->count = arglist_itypes_count;\r\n                  dst_type->param_types = params;\r\n                }break;\r\n                \r\n                //- rjf: MFUNCTION\r\n                case CV_LeafKind_MFUNCTION:\r\n                {\r\n                  // TODO(rjf): handle call_kind & attribs\r\n                  // TODO(rjf): preserve \"this_adjust\"\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafMFunction *lf = (CV_LeafMFunction *)itype_leaf_first;\r\n                  RDIM_Type *ret_type  = p2r_type_ptr_from_itype(lf->ret_itype);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  dst_type->kind        = (lf->this_itype != 0) ? RDI_TypeKind_Method : RDI_TypeKind_Function;\r\n                  dst_type->byte_size   = arch_addr_size;\r\n                  dst_type->direct_type = ret_type;\r\n                  \r\n                  // rjf: unpack arglist range\r\n                  CV_RecRange *arglist_range = &tpi_leaf->leaf_ranges.ranges[lf->arg_itype-itype_first];\r\n                  if(arglist_range->hdr.kind != CV_LeafKind_ARGLIST ||\r\n                     arglist_range->hdr.size<2 ||\r\n                     arglist_range->off + arglist_range->hdr.size > tpi_leaf->data.size)\r\n                  {\r\n                    break;\r\n                  }\r\n                  U8 *arglist_first = tpi_leaf->data.str + arglist_range->off + 2;\r\n                  U8 *arglist_opl   = arglist_first+arglist_range->hdr.size-2;\r\n                  if(arglist_first + sizeof(CV_LeafArgList) > arglist_opl)\r\n                  {\r\n                    break;\r\n                  }\r\n                  \r\n                  // rjf: unpack arglist info\r\n                  CV_LeafArgList *arglist = (CV_LeafArgList*)arglist_first;\r\n                  CV_TypeId *arglist_itypes_base = (CV_TypeId *)(arglist+1);\r\n                  U32 arglist_itypes_count = arglist->count;\r\n                  \r\n                  // rjf: build param type array\r\n                  U64 num_this_extras = 1;\r\n                  if(lf->this_itype == 0)\r\n                  {\r\n                    num_this_extras = 0;\r\n                  }\r\n                  RDIM_Type **params = push_array(arena, RDIM_Type *, arglist_itypes_count+num_this_extras);\r\n                  for(U32 idx = 0; idx < arglist_itypes_count; idx += 1)\r\n                  {\r\n                    params[idx+num_this_extras] = p2r_type_ptr_from_itype(arglist_itypes_base[idx]);\r\n                  }\r\n                  if(lf->this_itype != 0)\r\n                  {\r\n                    params[0] = p2r_type_ptr_from_itype(lf->this_itype);\r\n                  }\r\n                  \r\n                  // rjf: fill dst type\r\n                  dst_type->count = arglist_itypes_count+num_this_extras;\r\n                  dst_type->param_types = params;\r\n                }break;\r\n                \r\n                //- rjf: BITFIELD\r\n                case CV_LeafKind_BITFIELD:\r\n                {\r\n                  // rjf: unpack leaf\r\n                  CV_LeafBitField *lf = (CV_LeafBitField *)itype_leaf_first;\r\n                  RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->itype);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  dst_type->kind        = RDI_TypeKind_Bitfield;\r\n                  dst_type->off         = lf->pos;\r\n                  dst_type->count       = lf->len;\r\n                  dst_type->byte_size   = direct_type?direct_type->byte_size:0;\r\n                  dst_type->direct_type = direct_type;\r\n                }break;\r\n                \r\n                //- rjf: ARRAY\r\n                case CV_LeafKind_ARRAY:\r\n                {\r\n                  // rjf: unpack leaf\r\n                  CV_LeafArray *lf = (CV_LeafArray *)itype_leaf_first;\r\n                  RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->entry_itype);\r\n                  U8 *numeric_ptr = (U8*)(lf + 1);\r\n                  CV_NumericParsed array_count = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n                  U64 full_size = cv_u64_from_numeric(&array_count);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  dst_type->kind        = RDI_TypeKind_Array;\r\n                  dst_type->direct_type = direct_type;\r\n                  dst_type->byte_size   = full_size;\r\n                  dst_type->count       = (direct_type && direct_type->byte_size) ? (dst_type->byte_size/direct_type->byte_size) : 0;\r\n                }break;\r\n                \r\n                //- rjf: CLASS/STRUCTURE\r\n                case CV_LeafKind_CLASS:\r\n                case CV_LeafKind_STRUCTURE:\r\n                {\r\n                  // TODO(rjf): handle props\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first;\r\n                  U8 *numeric_ptr = (U8*)(lf + 1);\r\n                  CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n                  U64 size_u64 = cv_u64_from_numeric(&size);\r\n                  U8 *name_ptr = numeric_ptr + size.encoded_size;\r\n                  String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  if(lf->props & CV_TypeProp_FwdRef)\r\n                  {\r\n                    dst_type->kind = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct);\r\n                    dst_type->name = name;\r\n                  }\r\n                  else\r\n                  {\r\n                    dst_type->kind      = (kind == CV_LeafKind_CLASS ? RDI_TypeKind_Class : RDI_TypeKind_Struct);\r\n                    dst_type->byte_size = (U32)size_u64;\r\n                    dst_type->name      = name;\r\n                  }\r\n                }break;\r\n                \r\n                //- rjf: CLASS2/STRUCT2\r\n                case CV_LeafKind_CLASS2:\r\n                case CV_LeafKind_STRUCT2:\r\n                {\r\n                  // TODO(rjf): handle props\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first;\r\n                  U8 *numeric_ptr = (U8*)(lf + 1);\r\n                  CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n                  U64 size_u64 = cv_u64_from_numeric(&size);\r\n                  U8 *name_ptr = numeric_ptr + size.encoded_size;\r\n                  String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  if(lf->props & CV_TypeProp_FwdRef)\r\n                  {\r\n                    dst_type->kind = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_IncompleteClass : RDI_TypeKind_IncompleteStruct);\r\n                    dst_type->name = name;\r\n                  }\r\n                  else\r\n                  {\r\n                    dst_type->kind      = (kind == CV_LeafKind_CLASS2 ? RDI_TypeKind_Class : RDI_TypeKind_Struct);\r\n                    dst_type->byte_size = (U32)size_u64;\r\n                    dst_type->name      = name;\r\n                  }\r\n                }break;\r\n                \r\n                //- rjf: UNION\r\n                case CV_LeafKind_UNION:\r\n                {\r\n                  // TODO(rjf): handle props\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first;\r\n                  U8 *numeric_ptr = (U8*)(lf + 1);\r\n                  CV_NumericParsed size = cv_numeric_from_data_range(numeric_ptr, itype_leaf_opl);\r\n                  U64 size_u64 = cv_u64_from_numeric(&size);\r\n                  U8 *name_ptr = numeric_ptr + size.encoded_size;\r\n                  String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  if(lf->props & CV_TypeProp_FwdRef)\r\n                  {\r\n                    dst_type->kind = RDI_TypeKind_IncompleteUnion;\r\n                    dst_type->name = name;\r\n                  }\r\n                  else\r\n                  {\r\n                    dst_type->kind      = RDI_TypeKind_Union;\r\n                    dst_type->byte_size = (U32)size_u64;\r\n                    dst_type->name      = name;\r\n                  }\r\n                }break;\r\n                \r\n                //- rjf: ENUM\r\n                case CV_LeafKind_ENUM:\r\n                {\r\n                  // TODO(rjf): handle props\r\n                  \r\n                  // rjf: unpack leaf\r\n                  CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first;\r\n                  RDIM_Type *direct_type = p2r_type_ptr_from_itype(lf->base_itype);\r\n                  U8 *name_ptr = (U8 *)(lf + 1);\r\n                  String8 name = str8_cstring_capped(name_ptr, itype_leaf_opl);\r\n                  \r\n                  // rjf: fill type\r\n                  dst_type = rdim_type_chunk_list_push(arena, all_types__pre_typedefs_ptr, (U64)itype_opl);\r\n                  if(lf->props & CV_TypeProp_FwdRef)\r\n                  {\r\n                    dst_type->kind = RDI_TypeKind_IncompleteEnum;\r\n                    dst_type->name = name;\r\n                  }\r\n                  else\r\n                  {\r\n                    dst_type->kind        = RDI_TypeKind_Enum;\r\n                    dst_type->direct_type = direct_type;\r\n                    dst_type->byte_size   = direct_type ? direct_type->byte_size : 0;\r\n                    dst_type->name        = name;\r\n                  }\r\n                }break;\r\n              }\r\n            }\r\n            \r\n            //- rjf: store finalized type to this itype's slot\r\n            itype_type_ptrs[itype] = dst_type;\r\n          }\r\n        }\r\n      }\r\n    }\r\n#undef p2r_type_ptr_from_itype\r\n#undef p2r_builtin_type_ptr_from_kind\r\n  }\r\n  lane_sync_u64(&itype_type_ptrs, 0);\r\n  lane_sync_u64(&basic_type_ptrs, 0);\r\n  lane_sync_u64(&all_types__pre_typedefs_ptr, 0);\r\n  all_types__pre_typedefs = *all_types__pre_typedefs_ptr;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: types pass 4: build UDTs\r\n  //\r\n  RDIM_UDTChunkList *lanes_udts = 0;\r\n  ProfScope(\"types pass 4: build UDTs\")\r\n  {\r\n#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < tpi_leaf->itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0)\r\n    \r\n    //- rjf: gather this lane's UDTs\r\n    RDIM_UDTChunkList lane_udts = {0};\r\n    if(params->subset_flags & RDIM_SubsetFlag_Types &&\r\n       params->subset_flags & RDIM_SubsetFlag_UDTs)\r\n    {\r\n      U64 udts_chunk_cap = 4096;\r\n      RDIM_UDTChunkList *udts = &lane_udts;\r\n      Rng1U64 range = lane_range(itype_opl);\r\n      for EachInRange(idx, range)\r\n      {\r\n        //- rjf: skip basics\r\n        CV_TypeId itype = (CV_TypeId)idx;\r\n        if(itype < itype_first) { continue; }\r\n        \r\n        //- rjf: grab type for this itype - skip if empty\r\n        RDIM_Type *dst_type = itype_type_ptrs[itype];\r\n        if(dst_type == 0) { continue; }\r\n        \r\n        //- rjf: unpack itype leaf range - skip if out-of-range\r\n        CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[itype-tpi_leaf->itype_first];\r\n        CV_LeafKind kind = range->hdr.kind;\r\n        U64 header_struct_size = cv_header_struct_size_from_leaf_kind(kind);\r\n        U8 *itype_leaf_first = tpi_leaf->data.str + range->off+2;\r\n        U8 *itype_leaf_opl   = itype_leaf_first + range->hdr.size-2;\r\n        if(range->off+range->hdr.size > tpi_leaf->data.size ||\r\n           range->off+2+header_struct_size > tpi_leaf->data.size ||\r\n           range->hdr.size < 2)\r\n        {\r\n          continue;\r\n        }\r\n        \r\n        //- rjf: build UDT\r\n        CV_TypeId field_itype = 0;\r\n        switch(kind)\r\n        {\r\n          default:{}break;\r\n          \r\n          ////////////////////////\r\n          //- rjf: structs/unions/classes -> equip members\r\n          //\r\n          case CV_LeafKind_CLASS:\r\n          case CV_LeafKind_STRUCTURE:\r\n          {\r\n            CV_LeafStruct *lf = (CV_LeafStruct *)itype_leaf_first;\r\n            if(lf->props & CV_TypeProp_FwdRef)\r\n            {\r\n              break;\r\n            }\r\n            field_itype = lf->field_itype;\r\n          }goto equip_members;\r\n          case CV_LeafKind_UNION:\r\n          {\r\n            CV_LeafUnion *lf = (CV_LeafUnion *)itype_leaf_first;\r\n            if(lf->props & CV_TypeProp_FwdRef)\r\n            {\r\n              break;\r\n            }\r\n            field_itype = lf->field_itype;\r\n          }goto equip_members;\r\n          case CV_LeafKind_CLASS2:\r\n          case CV_LeafKind_STRUCT2:\r\n          {\r\n            CV_LeafStruct2 *lf = (CV_LeafStruct2 *)itype_leaf_first;\r\n            if(lf->props & CV_TypeProp_FwdRef)\r\n            {\r\n              break;\r\n            }\r\n            field_itype = lf->field_itype;\r\n          }goto equip_members;\r\n          equip_members:\r\n          {\r\n            Temp scratch = scratch_begin(&arena, 1);\r\n            \r\n            //- rjf: grab UDT info\r\n            RDIM_UDT *dst_udt = dst_type->udt;\r\n            if(dst_udt == 0)\r\n            {\r\n              dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap);\r\n              dst_udt->self_type = dst_type;\r\n            }\r\n            \r\n            //- rjf: gather all fields\r\n            typedef struct FieldListTask FieldListTask;\r\n            struct FieldListTask\r\n            {\r\n              FieldListTask *next;\r\n              CV_TypeId itype;\r\n            };\r\n            FieldListTask start_fl_task = {0, field_itype};\r\n            FieldListTask *fl_todo_stack = &start_fl_task;\r\n            FieldListTask *fl_done_stack = 0;\r\n            for(;fl_todo_stack != 0;)\r\n            {\r\n              //- rjf: take & unpack task\r\n              FieldListTask *fl_task = fl_todo_stack;\r\n              SLLStackPop(fl_todo_stack);\r\n              SLLStackPush(fl_done_stack, fl_task);\r\n              CV_TypeId field_list_itype = fl_task->itype;\r\n              \r\n              //- rjf: skip bad itypes\r\n              if(field_list_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= field_list_itype)\r\n              {\r\n                continue;\r\n              }\r\n              \r\n              //- rjf: field list itype -> range\r\n              CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-tpi_leaf->itype_first];\r\n              \r\n              //- rjf: skip bad headers\r\n              if(range->off+range->hdr.size > tpi_leaf->data.size ||\r\n                 range->hdr.size < 2 ||\r\n                 range->hdr.kind != CV_LeafKind_FIELDLIST)\r\n              {\r\n                continue;\r\n              }\r\n              \r\n              //- rjf: loop over all fields\r\n              {\r\n                U8 *field_list_first = tpi_leaf->data.str+range->off+2;\r\n                U8 *field_list_opl = field_list_first+range->hdr.size-2;\r\n                for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl;\r\n                    read_ptr < field_list_opl;\r\n                    read_ptr = next_read_ptr)\r\n                {\r\n                  // rjf: unpack field\r\n                  CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr;\r\n                  U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind);\r\n                  U8 *field_leaf_first = read_ptr+2;\r\n                  U8 *field_leaf_opl   = field_list_opl;\r\n                  next_read_ptr = field_leaf_opl;\r\n                  \r\n                  // rjf: skip out-of-bounds fields\r\n                  if(field_leaf_first+field_leaf_header_size > field_list_opl)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  \r\n                  // rjf: process field\r\n                  switch(field_kind)\r\n                  {\r\n                    //- rjf: unhandled/invalid cases\r\n                    default:\r\n                    {\r\n                      // TODO(rjf): log\r\n                    }break;\r\n                    \r\n                    //- rjf: INDEX\r\n                    case CV_LeafKind_INDEX:\r\n                    {\r\n                      // rjf: unpack leaf\r\n                      CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first;\r\n                      CV_TypeId new_itype = lf->itype;\r\n                      \r\n                      // rjf: bump next read pointer past header\r\n                      next_read_ptr = (U8 *)(lf+1);\r\n                      \r\n                      // rjf: determine if index itype is new\r\n                      B32 is_new = 1;\r\n                      for(FieldListTask *t = fl_done_stack; t != 0; t = t->next)\r\n                      {\r\n                        if(t->itype == new_itype)\r\n                        {\r\n                          is_new = 0;\r\n                          break;\r\n                        }\r\n                      }\r\n                      \r\n                      // rjf: if new -> push task to follow new itype\r\n                      if(is_new)\r\n                      {\r\n                        FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1);\r\n                        SLLStackPush(fl_todo_stack, new_task);\r\n                        new_task->itype = new_itype;\r\n                      }\r\n                    }break;\r\n                    \r\n                    //- rjf: MEMBER\r\n                    case CV_LeafKind_MEMBER:\r\n                    {\r\n                      // TODO(rjf): log on bad offset\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafMember *lf = (CV_LeafMember *)field_leaf_first;\r\n                      U8 *offset_ptr = (U8 *)(lf+1);\r\n                      CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl);\r\n                      U64 offset64 = cv_u64_from_numeric(&offset);\r\n                      U8 *name_ptr = offset_ptr + offset.encoded_size;\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                      mem->kind = RDI_MemberKind_DataField;\r\n                      mem->name = name;\r\n                      mem->type = p2r_type_ptr_from_itype(lf->itype);\r\n                      mem->off  = (U32)offset64;\r\n                    }break;\r\n                    \r\n                    //- rjf: STMEMBER\r\n                    case CV_LeafKind_STMEMBER:\r\n                    {\r\n                      // TODO(rjf): handle attribs\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafStMember *lf = (CV_LeafStMember *)field_leaf_first;\r\n                      U8 *name_ptr = (U8 *)(lf+1);\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                      mem->kind = RDI_MemberKind_StaticData;\r\n                      mem->name = name;\r\n                      mem->type = p2r_type_ptr_from_itype(lf->itype);\r\n                    }break;\r\n                    \r\n                    //- rjf: METHOD\r\n                    case CV_LeafKind_METHOD:\r\n                    {\r\n                      // rjf: unpack leaf\r\n                      CV_LeafMethod *lf = (CV_LeafMethod *)field_leaf_first;\r\n                      U8 *name_ptr = (U8 *)(lf+1);\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      //- rjf: method list itype -> range\r\n                      CV_RecRange *method_list_range = &tpi_leaf->leaf_ranges.ranges[lf->list_itype-tpi_leaf->itype_first];\r\n                      \r\n                      //- rjf: skip bad method lists\r\n                      if(method_list_range->off+method_list_range->hdr.size > tpi_leaf->data.size ||\r\n                         method_list_range->hdr.size < 2 ||\r\n                         method_list_range->hdr.kind != CV_LeafKind_METHODLIST)\r\n                      {\r\n                        break;\r\n                      }\r\n                      \r\n                      //- rjf: loop through all methods & emit members\r\n                      U8 *method_list_first = tpi_leaf->data.str + method_list_range->off + 2;\r\n                      U8 *method_list_opl   = method_list_first + method_list_range->hdr.size-2;\r\n                      for(U8 *method_read_ptr = method_list_first, *next_method_read_ptr = method_list_opl;\r\n                          method_read_ptr < method_list_opl;\r\n                          method_read_ptr = next_method_read_ptr)\r\n                      {\r\n                        CV_LeafMethodListMember *method = (CV_LeafMethodListMember*)method_read_ptr;\r\n                        CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(method->attribs);\r\n                        RDIM_Type *method_type = p2r_type_ptr_from_itype(method->itype);\r\n                        next_method_read_ptr = (U8 *)(method+1);\r\n                        \r\n                        // TODO(allen): PROBLEM\r\n                        // We only get offsets for virtual functions (the \"vbaseoff\") from\r\n                        // \"Intro\" and \"PureIntro\". In C++ inheritance, when we have a chain\r\n                        // of inheritance (let's just talk single inheritance for now) the\r\n                        // first class in the chain that introduces a new virtual function\r\n                        // has this \"Intro\" method. If a later class in the chain redefines\r\n                        // the virtual function it only has a \"Virtual\" method which does\r\n                        // not update the offset. There is a \"Virtual\" and \"PureVirtual\"\r\n                        // variant of \"Virtual\". The \"Pure\" in either case means there\r\n                        // is no concrete procedure. When there is no \"Pure\" the method\r\n                        // should have a corresponding procedure symbol id.\r\n                        //\r\n                        // The issue is we will want to mark all of our virtual methods as\r\n                        // virtual and give them an offset, but that means we have to do\r\n                        // some extra figuring to propogate offsets from \"Intro\" methods\r\n                        // to \"Virtual\" methods in inheritance trees. That is - IF we want\r\n                        // to start preserving the offsets of virtuals. There is room in\r\n                        // the method struct to make this work, but for now I've just\r\n                        // decided to drop this information. It is not urgently useful to\r\n                        // us and greatly complicates matters.\r\n                        \r\n                        // rjf: read vbaseoff\r\n                        U32 vbaseoff = 0;\r\n                        if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro)\r\n                        {\r\n                          if(next_method_read_ptr+4 <= method_list_opl)\r\n                          {\r\n                            vbaseoff = *(U32 *)next_method_read_ptr;\r\n                          }\r\n                          next_method_read_ptr += 4;\r\n                        }\r\n                        \r\n                        // rjf: emit method\r\n                        switch(prop)\r\n                        {\r\n                          default:\r\n                          {\r\n                            RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                            mem->kind = RDI_MemberKind_Method;\r\n                            mem->name = name;\r\n                            mem->type = method_type;\r\n                          }break;\r\n                          case CV_MethodProp_Static:\r\n                          {\r\n                            RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                            mem->kind = RDI_MemberKind_StaticMethod;\r\n                            mem->name = name;\r\n                            mem->type = method_type;\r\n                          }break;\r\n                          case CV_MethodProp_Virtual:\r\n                          case CV_MethodProp_PureVirtual:\r\n                          case CV_MethodProp_Intro:\r\n                          case CV_MethodProp_PureIntro:\r\n                          {\r\n                            RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                            mem->kind = RDI_MemberKind_VirtualMethod;\r\n                            mem->name = name;\r\n                            mem->type = method_type;\r\n                          }break;\r\n                        }\r\n                      }\r\n                      \r\n                    }break;\r\n                    \r\n                    //- rjf: ONEMETHOD\r\n                    case CV_LeafKind_ONEMETHOD:\r\n                    {\r\n                      // TODO(rjf): handle attribs\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafOneMethod *lf = (CV_LeafOneMethod *)field_leaf_first;\r\n                      CV_MethodProp prop = CV_FieldAttribs_Extract_MethodProp(lf->attribs);\r\n                      U8 *vbaseoff_ptr = (U8 *)(lf+1);\r\n                      U8 *vbaseoff_opl_ptr = vbaseoff_ptr;\r\n                      U32 vbaseoff = 0;\r\n                      if(prop == CV_MethodProp_Intro || prop == CV_MethodProp_PureIntro)\r\n                      {\r\n                        vbaseoff = *(U32 *)(vbaseoff_ptr);\r\n                        vbaseoff_opl_ptr += sizeof(U32);\r\n                      }\r\n                      U8 *name_ptr = vbaseoff_opl_ptr;\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      RDIM_Type *method_type = p2r_type_ptr_from_itype(lf->itype);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      // rjf: emit method\r\n                      switch(prop)\r\n                      {\r\n                        default:\r\n                        {\r\n                          RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                          mem->kind = RDI_MemberKind_Method;\r\n                          mem->name = name;\r\n                          mem->type = method_type;\r\n                        }break;\r\n                        case CV_MethodProp_Static:\r\n                        {\r\n                          RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                          mem->kind = RDI_MemberKind_StaticMethod;\r\n                          mem->name = name;\r\n                          mem->type = method_type;\r\n                        }break;\r\n                        case CV_MethodProp_Virtual:\r\n                        case CV_MethodProp_PureVirtual:\r\n                        case CV_MethodProp_Intro:\r\n                        case CV_MethodProp_PureIntro:\r\n                        {\r\n                          RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                          mem->kind = RDI_MemberKind_VirtualMethod;\r\n                          mem->name = name;\r\n                          mem->type = method_type;\r\n                        }break;\r\n                      }\r\n                    }break;\r\n                    \r\n                    //- rjf: NESTTYPE\r\n                    case CV_LeafKind_NESTTYPE:\r\n                    {\r\n                      // rjf: unpack leaf\r\n                      CV_LeafNestType *lf = (CV_LeafNestType *)field_leaf_first;\r\n                      U8 *name_ptr = (U8 *)(lf+1);\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                      mem->kind = RDI_MemberKind_NestedType;\r\n                      mem->name = name;\r\n                      mem->type = p2r_type_ptr_from_itype(lf->itype);\r\n                    }break;\r\n                    \r\n                    //- rjf: NESTTYPEEX\r\n                    case CV_LeafKind_NESTTYPEEX:\r\n                    {\r\n                      // TODO(rjf): handle attribs\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafNestTypeEx *lf = (CV_LeafNestTypeEx *)field_leaf_first;\r\n                      U8 *name_ptr = (U8 *)(lf+1);\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                      mem->kind = RDI_MemberKind_NestedType;\r\n                      mem->name = name;\r\n                      mem->type = p2r_type_ptr_from_itype(lf->itype);\r\n                    }break;\r\n                    \r\n                    //- rjf: BCLASS\r\n                    case CV_LeafKind_BCLASS:\r\n                    {\r\n                      // TODO(rjf): log on bad offset\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafBClass *lf = (CV_LeafBClass *)field_leaf_first;\r\n                      U8 *offset_ptr = (U8 *)(lf+1);\r\n                      CV_NumericParsed offset = cv_numeric_from_data_range(offset_ptr, field_leaf_opl);\r\n                      U64 offset64 = cv_u64_from_numeric(&offset);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = offset_ptr+offset.encoded_size;\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                      mem->kind = RDI_MemberKind_Base;\r\n                      mem->type = p2r_type_ptr_from_itype(lf->itype);\r\n                      mem->off  = (U32)offset64;\r\n                    }break;\r\n                    \r\n                    //- rjf: VBCLASS/IVBCLASS\r\n                    case CV_LeafKind_VBCLASS:\r\n                    case CV_LeafKind_IVBCLASS:\r\n                    {\r\n                      // TODO(rjf): log on bad offsets\r\n                      // TODO(rjf): handle attribs\r\n                      // TODO(rjf): offsets?\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafVBClass *lf = (CV_LeafVBClass *)field_leaf_first;\r\n                      U8 *num1_ptr = (U8 *)(lf+1);\r\n                      CV_NumericParsed num1 = cv_numeric_from_data_range(num1_ptr, field_leaf_opl);\r\n                      U8 *num2_ptr = num1_ptr + num1.encoded_size;\r\n                      CV_NumericParsed num2 = cv_numeric_from_data_range(num2_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past header\r\n                      next_read_ptr = (U8 *)(lf+1);\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTMember *mem = rdim_udt_push_member(arena, udts, dst_udt);\r\n                      mem->kind = RDI_MemberKind_VirtualBase;\r\n                      mem->type = p2r_type_ptr_from_itype(lf->itype);\r\n                    }break;\r\n                    \r\n                    //- rjf: VFUNCTAB\r\n                    case CV_LeafKind_VFUNCTAB:\r\n                    {\r\n                      CV_LeafVFuncTab *lf = (CV_LeafVFuncTab *)field_leaf_first;\r\n                      \r\n                      // rjf: bump next read pointer past header\r\n                      next_read_ptr = (U8 *)(lf+1);\r\n                      \r\n                      // NOTE(rjf): currently no-op this case\r\n                      (void)lf;\r\n                    }break;\r\n                  }\r\n                  \r\n                  // rjf: align-up next field\r\n                  next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4);\r\n                }\r\n              }\r\n            }\r\n            \r\n            scratch_end(scratch);\r\n          }break;\r\n          \r\n          ////////////////////////\r\n          //- rjf: enums -> equip enumerates\r\n          //\r\n          case CV_LeafKind_ENUM:\r\n          {\r\n            CV_LeafEnum *lf = (CV_LeafEnum *)itype_leaf_first;\r\n            if(lf->props & CV_TypeProp_FwdRef)\r\n            {\r\n              break;\r\n            }\r\n            field_itype = lf->field_itype;\r\n          }goto equip_enum_vals;\r\n          equip_enum_vals:;\r\n          {\r\n            Temp scratch = scratch_begin(&arena, 1);\r\n            \r\n            //- rjf: grab UDT info\r\n            RDIM_UDT *dst_udt = dst_type->udt;\r\n            if(dst_udt == 0)\r\n            {\r\n              dst_udt = dst_type->udt = rdim_udt_chunk_list_push(arena, udts, udts_chunk_cap);\r\n              dst_udt->self_type = dst_type;\r\n            }\r\n            \r\n            //- rjf: gather all fields\r\n            typedef struct FieldListTask FieldListTask;\r\n            struct FieldListTask\r\n            {\r\n              FieldListTask *next;\r\n              CV_TypeId itype;\r\n            };\r\n            FieldListTask start_fl_task = {0, field_itype};\r\n            FieldListTask *fl_todo_stack = &start_fl_task;\r\n            FieldListTask *fl_done_stack = 0;\r\n            for(;fl_todo_stack != 0;)\r\n            {\r\n              //- rjf: take & unpack task\r\n              FieldListTask *fl_task = fl_todo_stack;\r\n              SLLStackPop(fl_todo_stack);\r\n              SLLStackPush(fl_done_stack, fl_task);\r\n              CV_TypeId field_list_itype = fl_task->itype;\r\n              \r\n              //- rjf: skip bad itypes\r\n              if(field_list_itype < tpi_leaf->itype_first || tpi_leaf->itype_opl <= field_list_itype)\r\n              {\r\n                continue;\r\n              }\r\n              \r\n              //- rjf: field list itype -> range\r\n              CV_RecRange *range = &tpi_leaf->leaf_ranges.ranges[field_list_itype-tpi_leaf->itype_first];\r\n              \r\n              //- rjf: skip bad headers\r\n              if(range->off+range->hdr.size > tpi_leaf->data.size ||\r\n                 range->hdr.size < 2 ||\r\n                 range->hdr.kind != CV_LeafKind_FIELDLIST)\r\n              {\r\n                continue;\r\n              }\r\n              \r\n              //- rjf: loop over all fields\r\n              {\r\n                U8 *field_list_first = tpi_leaf->data.str+range->off+2;\r\n                U8 *field_list_opl = field_list_first+range->hdr.size-2;\r\n                for(U8 *read_ptr = field_list_first, *next_read_ptr = field_list_opl;\r\n                    read_ptr < field_list_opl;\r\n                    read_ptr = next_read_ptr)\r\n                {\r\n                  // rjf: unpack field\r\n                  CV_LeafKind field_kind = *(CV_LeafKind *)read_ptr;\r\n                  U64 field_leaf_header_size = cv_header_struct_size_from_leaf_kind(field_kind);\r\n                  U8 *field_leaf_first = read_ptr+2;\r\n                  U8 *field_leaf_opl   = field_leaf_first+range->hdr.size-2;\r\n                  next_read_ptr = field_leaf_opl;\r\n                  \r\n                  // rjf: skip out-of-bounds fields\r\n                  if(field_leaf_first+field_leaf_header_size > field_list_opl)\r\n                  {\r\n                    continue;\r\n                  }\r\n                  \r\n                  // rjf: process field\r\n                  switch(field_kind)\r\n                  {\r\n                    //- rjf: unhandled/invalid cases\r\n                    default:\r\n                    {\r\n                      // TODO(rjf): log\r\n                    }break;\r\n                    \r\n                    //- rjf: INDEX\r\n                    case CV_LeafKind_INDEX:\r\n                    {\r\n                      // rjf: unpack leaf\r\n                      CV_LeafIndex *lf = (CV_LeafIndex *)field_leaf_first;\r\n                      CV_TypeId new_itype = lf->itype;\r\n                      \r\n                      // rjf: determine if index itype is new\r\n                      B32 is_new = 1;\r\n                      for(FieldListTask *t = fl_done_stack; t != 0; t = t->next)\r\n                      {\r\n                        if(t->itype == new_itype)\r\n                        {\r\n                          is_new = 0;\r\n                          break;\r\n                        }\r\n                      }\r\n                      \r\n                      // rjf: if new -> push task to follow new itype\r\n                      if(is_new)\r\n                      {\r\n                        FieldListTask *new_task = push_array(scratch.arena, FieldListTask, 1);\r\n                        SLLStackPush(fl_todo_stack, new_task);\r\n                        new_task->itype = new_itype;\r\n                      }\r\n                    }break;\r\n                    \r\n                    //- rjf: ENUMERATE\r\n                    case CV_LeafKind_ENUMERATE:\r\n                    {\r\n                      // TODO(rjf): attribs\r\n                      \r\n                      // rjf: unpack leaf\r\n                      CV_LeafEnumerate *lf = (CV_LeafEnumerate *)field_leaf_first;\r\n                      U8 *val_ptr = (U8 *)(lf+1);\r\n                      CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, field_leaf_opl);\r\n                      U64 val64 = cv_u64_from_numeric(&val);\r\n                      U8 *name_ptr = val_ptr + val.encoded_size;\r\n                      String8 name = str8_cstring_capped(name_ptr, field_leaf_opl);\r\n                      \r\n                      // rjf: bump next read pointer past variable length parts\r\n                      next_read_ptr = name.str+name.size+1;\r\n                      \r\n                      // rjf: emit member\r\n                      RDIM_UDTEnumVal *enum_val = rdim_udt_push_enum_val(arena, udts, dst_udt);\r\n                      enum_val->name = name;\r\n                      enum_val->val  = val64;\r\n                    }break;\r\n                  }\r\n                  \r\n                  // rjf: align-up next field\r\n                  next_read_ptr = (U8 *)AlignPow2((U64)next_read_ptr, 4);\r\n                }\r\n              }\r\n            }\r\n            \r\n            scratch_end(scratch);\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: collect all lanes\r\n    if(lane_idx() == 0)\r\n    {\r\n      lanes_udts = push_array(scratch.arena, RDIM_UDTChunkList, lane_count());\r\n    }\r\n    lane_sync_u64(&lanes_udts, 0);\r\n    lanes_udts[lane_idx()] = lane_udts;\r\n#undef p2r_type_ptr_from_itype\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: join all UDTs\r\n  //\r\n  RDIM_UDTChunkList all_udts = {0};\r\n  ProfScope(\"join all UDTs\") if(lane_idx() == 0)\r\n  {\r\n    for EachIndex(idx, lane_count())\r\n    {\r\n      rdim_udt_chunk_list_concat_in_place(&all_udts, &lanes_udts[idx]);\r\n    }\r\n  }\r\n  lane_sync();\r\n  RDIM_UDTChunkList *all_udts_ptr = &all_udts;\r\n  lane_sync_u64(&all_udts_ptr, 0);\r\n  all_udts = *all_udts_ptr;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: produce symbols from all streams\r\n  //\r\n  RDIM_LocationChunkList *syms_locations = 0;\r\n  RDIM_SymbolChunkList *syms_procedures = 0;\r\n  RDIM_SymbolChunkList *syms_global_variables = 0;\r\n  RDIM_SymbolChunkList *syms_thread_variables = 0;\r\n  RDIM_SymbolChunkList *syms_constants = 0;\r\n  RDIM_ScopeChunkList *syms_scopes = 0;\r\n  RDIM_InlineSiteChunkList *syms_inline_sites = 0;\r\n  RDIM_TypeChunkList *syms_typedefs = 0;\r\n  ProfScope(\"produce symbols from all streams\")\r\n  {\r\n#define p2r_type_ptr_from_itype(itype) ((itype_type_ptrs && (itype) < itype_opl) ? (itype_type_ptrs[(itype_fwd_map[(itype)] ? itype_fwd_map[(itype)] : (itype))]) : 0)\r\n    \r\n    ////////////////////////////\r\n    //- rjf: set up\r\n    //\r\n    if(lane_idx() == 0)\r\n    {\r\n      syms_locations        = push_array(arena, RDIM_LocationChunkList, all_syms_count);\r\n      syms_procedures       = push_array(arena, RDIM_SymbolChunkList, all_syms_count);\r\n      syms_global_variables = push_array(arena, RDIM_SymbolChunkList, all_syms_count);\r\n      syms_thread_variables = push_array(arena, RDIM_SymbolChunkList, all_syms_count);\r\n      syms_constants        = push_array(arena, RDIM_SymbolChunkList, all_syms_count);\r\n      syms_scopes           = push_array(arena, RDIM_ScopeChunkList, all_syms_count);\r\n      syms_inline_sites     = push_array(arena, RDIM_InlineSiteChunkList, all_syms_count);\r\n      syms_typedefs         = push_array(arena, RDIM_TypeChunkList, all_syms_count);\r\n    }\r\n    lane_sync_u64(&syms_locations, 0);\r\n    lane_sync_u64(&syms_procedures, 0);\r\n    lane_sync_u64(&syms_global_variables, 0);\r\n    lane_sync_u64(&syms_thread_variables, 0);\r\n    lane_sync_u64(&syms_constants, 0);\r\n    lane_sync_u64(&syms_scopes, 0);\r\n    lane_sync_u64(&syms_inline_sites, 0);\r\n    lane_sync_u64(&syms_typedefs, 0);\r\n    \r\n    ////////////////////////////\r\n    //- rjf: fill outputs for all unit sym blocks in this lane\r\n    //\r\n    if(params->subset_flags & (RDIM_SubsetFlag_Procedures|\r\n                               RDIM_SubsetFlag_GlobalVariables|\r\n                               RDIM_SubsetFlag_ThreadVariables|\r\n                               RDIM_SubsetFlag_Scopes|\r\n                               RDIM_SubsetFlag_Locals|\r\n                               RDIM_SubsetFlag_GlobalVariableNameMap|\r\n                               RDIM_SubsetFlag_ThreadVariableNameMap|\r\n                               RDIM_SubsetFlag_ProcedureNameMap|\r\n                               RDIM_SubsetFlag_ConstantNameMap|\r\n                               RDIM_SubsetFlag_LinkNameProcedureNameMap|\r\n                               RDIM_SubsetFlag_Types))\r\n    {\r\n      U64 sym_take_counter = 0;\r\n      U64 *sym_take_counter_ptr = &sym_take_counter;\r\n      lane_sync_u64(&sym_take_counter_ptr, 0);\r\n      for(;;)\r\n      {\r\n        //- rjf: take next sym\r\n        U64 sym_idx = ins_atomic_u64_inc_eval(sym_take_counter_ptr) - 1;\r\n        if(sym_idx >= all_syms_count)\r\n        {\r\n          break;\r\n        }\r\n        \r\n        //- rjf: unpack sym\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        CV_SymParsed *sym = all_syms[sym_idx];\r\n        Rng1U64 sym_rec_range = r1u64(0, sym->sym_ranges.count);\r\n        U64 sym_locations_chunk_cap = 4096;\r\n        U64 sym_procedures_chunk_cap = 2048;\r\n        U64 sym_global_variables_chunk_cap = 2048;\r\n        U64 sym_thread_variables_chunk_cap = 2048;\r\n        U64 sym_constants_chunk_cap = 2048;\r\n        U64 sym_scopes_chunk_cap = 4096;\r\n        U64 sym_inline_sites_chunk_cap = 2048;\r\n        RDIM_LocationChunkList *sym_locations = &syms_locations[sym_idx];\r\n        RDIM_SymbolChunkList *sym_procedures = &syms_procedures[sym_idx];\r\n        RDIM_SymbolChunkList *sym_global_variables = &syms_global_variables[sym_idx];\r\n        RDIM_SymbolChunkList *sym_thread_variables = &syms_thread_variables[sym_idx];\r\n        RDIM_SymbolChunkList *sym_constants = &syms_constants[sym_idx];\r\n        RDIM_ScopeChunkList *sym_scopes = &syms_scopes[sym_idx];\r\n        RDIM_InlineSiteChunkList *sym_inline_sites = &syms_inline_sites[sym_idx];\r\n        RDIM_TypeChunkList *typedefs = &syms_typedefs[sym_idx];\r\n        \r\n        //////////////////////////\r\n        //- rjf: symbols pass 1: produce procedure frame info map (procedure -> frame info)\r\n        //\r\n        U64 procedure_frameprocs_count = 0;\r\n        U64 procedure_frameprocs_cap   = dim_1u64(sym_rec_range);\r\n        CV_SymFrameproc **procedure_frameprocs = push_array_no_zero(scratch.arena, CV_SymFrameproc *, procedure_frameprocs_cap);\r\n        ProfScope(\"symbols pass 1: produce procedure frame info map (procedure -> frame info)\")\r\n        {\r\n          U64 procedure_num = 0;\r\n          CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges + sym_rec_range.min;\r\n          CV_RecRange *rec_ranges_opl   = sym->sym_ranges.ranges + sym_rec_range.max;\r\n          for(CV_RecRange *rec_range = rec_ranges_first;\r\n              rec_range < rec_ranges_opl;\r\n              rec_range += 1)\r\n          {\r\n            //- rjf: rec range -> symbol info range\r\n            U64 sym_off_first = rec_range->off + 2;\r\n            U64 sym_off_opl   = rec_range->off + rec_range->hdr.size;\r\n            \r\n            //- rjf: skip invalid ranges\r\n            if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl)\r\n            {\r\n              continue;\r\n            }\r\n            \r\n            //- rjf: unpack symbol info\r\n            CV_SymKind kind = rec_range->hdr.kind;\r\n            U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind);\r\n            void *sym_header_struct_base = sym->data.str + sym_off_first;\r\n            \r\n            //- rjf: skip bad sizes\r\n            if(sym_off_first + sym_header_struct_size > sym_off_opl)\r\n            {\r\n              continue;\r\n            }\r\n            \r\n            //- rjf: consume symbol based on kind\r\n            switch(kind)\r\n            {\r\n              default:{}break;\r\n              \r\n              //- rjf: FRAMEPROC\r\n              case CV_SymKind_FRAMEPROC:\r\n              {\r\n                if(procedure_num == 0) { break; }\r\n                if(procedure_num > procedure_frameprocs_cap) { break; }\r\n                CV_SymFrameproc *frameproc = (CV_SymFrameproc*)sym_header_struct_base;\r\n                procedure_frameprocs[procedure_num-1] = frameproc;\r\n                procedure_frameprocs_count = Max(procedure_frameprocs_count, procedure_num);\r\n              }break;\r\n              \r\n              //- rjf: LPROC32/GPROC32\r\n              case CV_SymKind_LPROC32:\r\n              case CV_SymKind_GPROC32:\r\n              {\r\n                procedure_num += 1;\r\n              }break;\r\n            }\r\n          }\r\n          U64 scratch_overkill = sizeof(procedure_frameprocs[0])*(procedure_frameprocs_cap-procedure_frameprocs_count);\r\n          arena_pop(scratch.arena, scratch_overkill);\r\n        }\r\n        \r\n        //////////////////////////\r\n        //- rjf: symbols pass 2: construct all symbols, given procedure frame info map\r\n        //\r\n        ProfScope(\"symbols pass 2: construct all symbols, given procedure frame info map\")\r\n        {\r\n          RDIM_Local *defrange_target = 0;\r\n          B32 defrange_target_is_param = 0;\r\n          U64 procedure_num = 0;\r\n          U64 procedure_base_voff = 0;\r\n          CV_RecRange *rec_ranges_first = sym->sym_ranges.ranges + sym_rec_range.min;\r\n          CV_RecRange *rec_ranges_opl   = sym->sym_ranges.ranges + sym_rec_range.max;\r\n          typedef struct P2R_ScopeNode P2R_ScopeNode;\r\n          struct P2R_ScopeNode\r\n          {\r\n            P2R_ScopeNode *next;\r\n            RDIM_Scope *scope;\r\n          };\r\n          P2R_ScopeNode *top_scope_node = 0;\r\n          P2R_ScopeNode *free_scope_node = 0;\r\n          RDIM_LineTable *inline_site_line_table = sym_idx > 0 ? units_first_inline_site_line_tables[sym_idx-1] : 0;\r\n          for(CV_RecRange *rec_range = rec_ranges_first;\r\n              rec_range < rec_ranges_opl;\r\n              rec_range += 1)\r\n          {\r\n            //- rjf: rec range -> symbol info range\r\n            U64 sym_off_first = rec_range->off + 2;\r\n            U64 sym_off_opl   = rec_range->off + rec_range->hdr.size;\r\n            \r\n            //- rjf: skip invalid ranges\r\n            if(sym_off_opl > sym->data.size || sym_off_first > sym->data.size || sym_off_first > sym_off_opl)\r\n            {\r\n              continue;\r\n            }\r\n            \r\n            //- rjf: unpack symbol info\r\n            CV_SymKind kind = rec_range->hdr.kind;\r\n            U64 sym_header_struct_size = cv_header_struct_size_from_sym_kind(kind);\r\n            void *sym_header_struct_base = sym->data.str + sym_off_first;\r\n            void *sym_data_opl = sym->data.str + sym_off_opl;\r\n            \r\n            //- rjf: skip bad sizes\r\n            if(sym_off_first + sym_header_struct_size > sym_off_opl)\r\n            {\r\n              continue;\r\n            }\r\n            \r\n            //- rjf: consume symbol based on kind\r\n            switch(kind)\r\n            {\r\n              default:{}break;\r\n              \r\n              //- rjf: END\r\n              case CV_SymKind_END:\r\n              {\r\n                P2R_ScopeNode *n = top_scope_node;\r\n                if(n != 0)\r\n                {\r\n                  SLLStackPop(top_scope_node);\r\n                  SLLStackPush(free_scope_node, n);\r\n                }\r\n                defrange_target = 0;\r\n                defrange_target_is_param = 0;\r\n              }break;\r\n              \r\n              //- rjf: BLOCK32\r\n              case CV_SymKind_BLOCK32:\r\n              {\r\n                // rjf: unpack sym\r\n                CV_SymBlock32 *block32 = (CV_SymBlock32 *)sym_header_struct_base;\r\n                \r\n                // rjf: build scope, insert into current parent scope\r\n                RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap);\r\n                {\r\n                  if(top_scope_node == 0)\r\n                  {\r\n                    // TODO(rjf): log\r\n                  }\r\n                  if(top_scope_node != 0)\r\n                  {\r\n                    RDIM_Scope *top_scope = top_scope_node->scope;\r\n                    SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling);\r\n                    scope->parent_scope = top_scope;\r\n                    scope->symbol = top_scope->symbol;\r\n                  }\r\n                  COFF_SectionHeader *section = (0 < block32->sec && block32->sec <= coff_sections.count) ? &coff_sections.v[block32->sec-1] : 0;\r\n                  if(section != 0)\r\n                  {\r\n                    U64 voff_first = section->voff + block32->off;\r\n                    U64 voff_last = voff_first + block32->len;\r\n                    RDIM_Rng1U64 voff_range = {voff_first, voff_last};\r\n                    rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range);\r\n                  }\r\n                }\r\n                \r\n                // rjf: push this scope to scope stack\r\n                {\r\n                  P2R_ScopeNode *node = free_scope_node;\r\n                  if(node != 0) { SLLStackPop(free_scope_node); }\r\n                  else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); }\r\n                  node->scope = scope;\r\n                  SLLStackPush(top_scope_node, node);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: LDATA32/GDATA32\r\n              case CV_SymKind_LDATA32:\r\n              case CV_SymKind_GDATA32:\r\n              {\r\n                // rjf: unpack sym\r\n                CV_SymData32 *data32 = (CV_SymData32 *)sym_header_struct_base;\r\n                String8 name = str8_cstring_capped(data32+1, sym_data_opl);\r\n                COFF_SectionHeader *section = (0 < data32->sec && data32->sec <= coff_sections.count) ? &coff_sections.v[data32->sec-1] : 0;\r\n                U64 voff = (section ? section->voff : 0) + data32->off;\r\n                \r\n                // rjf: determine if this is an exact duplicate global\r\n                //\r\n                // PDB likes to have duplicates of these spread across different\r\n                // symbol streams so we deduplicate across the entire translation\r\n                // context.\r\n                //\r\n                B32 is_duplicate = 0;\r\n                {\r\n                  // TODO(rjf): @important global symbol dedup\r\n                }\r\n                \r\n                // rjf: is not duplicate -> push new global\r\n                if(!is_duplicate)\r\n                {\r\n                  // rjf: unpack global variable's type\r\n                  RDIM_Type *type = p2r_type_ptr_from_itype(data32->itype);\r\n                  \r\n                  // rjf: unpack global's container type\r\n                  RDIM_Type *container_type = 0;\r\n                  U64 container_name_opl = p2r_end_of_cplusplus_container_name(name);\r\n                  if(container_name_opl > 2)\r\n                  {\r\n                    String8 container_name = str8(name.str, container_name_opl - 2);\r\n                    CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0);\r\n                    container_type = p2r_type_ptr_from_itype(cv_type_id);\r\n                  }\r\n                  \r\n                  // rjf: unpack global's container symbol\r\n                  RDIM_Symbol *container_symbol = 0;\r\n                  if(container_type == 0 && top_scope_node != 0)\r\n                  {\r\n                    container_symbol = top_scope_node->scope->symbol;\r\n                  }\r\n                  \r\n                  // rjf: build symbol\r\n                  RDIM_Symbol *symbol = rdim_symbol_chunk_list_push(arena, sym_global_variables, sym_global_variables_chunk_cap);\r\n                  symbol->is_extern        = (kind == CV_SymKind_GDATA32);\r\n                  symbol->name             = name;\r\n                  symbol->type             = type;\r\n                  symbol->offset           = voff;\r\n                  symbol->container_symbol = container_symbol;\r\n                  symbol->container_type   = container_type;\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: UDT (typedefs)\r\n              case CV_SymKind_UDT:\r\n              if(sym == all_syms[0] && top_scope_node == 0)\r\n              {\r\n                if(params->subset_flags & (RDIM_SubsetFlag_Types|RDIM_SubsetFlag_UDTs|RDIM_SubsetFlag_TypeNameMap))\r\n                {\r\n                  CV_SymUDT *udt = (CV_SymUDT *)sym_header_struct_base;\r\n                  String8 name = str8_cstring_capped(udt+1, sym_data_opl);\r\n                  RDIM_Type *type   = rdim_type_chunk_list_push(arena, typedefs, 4096);\r\n                  type->kind        = RDI_TypeKind_Alias;\r\n                  type->name        = name;\r\n                  type->direct_type = p2r_type_ptr_from_itype(udt->itype);\r\n                  if(type->direct_type != 0)\r\n                  {\r\n                    type->byte_size = type->direct_type->byte_size;\r\n                  }\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: LPROC32/GPROC32\r\n              case CV_SymKind_LPROC32:\r\n              case CV_SymKind_GPROC32:\r\n              {\r\n                // rjf: unpack sym\r\n                CV_SymProc32 *proc32 = (CV_SymProc32 *)sym_header_struct_base;\r\n                String8 name = str8_cstring_capped(proc32+1, sym_data_opl);\r\n                RDIM_Type *type = p2r_type_ptr_from_itype(proc32->itype);\r\n                \r\n                // rjf: unpack proc's container type\r\n                RDIM_Type *container_type = 0;\r\n                U64 container_name_opl = p2r_end_of_cplusplus_container_name(name);\r\n                if(container_name_opl > 2 && tpi_hash != 0 && tpi_leaf != 0)\r\n                {\r\n                  String8 container_name = str8(name.str, container_name_opl - 2);\r\n                  CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0);\r\n                  container_type = p2r_type_ptr_from_itype(cv_type_id);\r\n                }\r\n                \r\n                // rjf: unpack proc's container symbol\r\n                RDIM_Symbol *container_symbol = 0;\r\n                if(container_type == 0 && top_scope_node != 0)\r\n                {\r\n                  container_symbol = top_scope_node->scope->symbol;\r\n                }\r\n                \r\n                // rjf: build procedure's root scope\r\n                //\r\n                // NOTE: even if there could be a containing scope at this point (which should be\r\n                //       illegal in C/C++ but not necessarily in another language) we would not use\r\n                //       it here because these scopes refer to the ranges of code that make up a\r\n                //       procedure *not* the namespaces, so a procedure's root scope always has\r\n                //       no parent.\r\n                RDIM_Scope *procedure_root_scope = 0;\r\n                if(params->subset_flags & RDIM_SubsetFlag_Scopes)\r\n                {\r\n                  procedure_root_scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap);\r\n                  COFF_SectionHeader *section = (0 < proc32->sec && proc32->sec <= coff_sections.count) ? &coff_sections.v[proc32->sec-1] : 0;\r\n                  if(section != 0)\r\n                  {\r\n                    U64 voff_first = section->voff + proc32->off;\r\n                    U64 voff_last = voff_first + proc32->len;\r\n                    RDIM_Rng1U64 voff_range = {voff_first, voff_last};\r\n                    rdim_scope_push_voff_range(arena, sym_scopes, procedure_root_scope, voff_range);\r\n                    procedure_base_voff = voff_first;\r\n                  }\r\n                }\r\n                \r\n                // rjf: root scope voff minimum range -> link name\r\n                String8 link_name = {0};\r\n                if(procedure_root_scope && procedure_root_scope->voff_ranges.min != 0)\r\n                {\r\n                  U64 voff = procedure_root_scope->voff_ranges.min;\r\n                  U64 hash = p2r_hash_from_voff(voff);\r\n                  U64 bucket_idx = hash%link_name_map->buckets_count;\r\n                  P2R_LinkNameNode *node = 0;\r\n                  for(P2R_LinkNameNode *n = link_name_map->buckets[bucket_idx]; n != 0; n = n->next)\r\n                  {\r\n                    if(n->voff == voff)\r\n                    {\r\n                      link_name = n->name;\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: build procedure symbol\r\n                if(params->subset_flags & (RDIM_SubsetFlag_Procedures|RDIM_SubsetFlag_ProcedureNameMap))\r\n                {\r\n                  RDIM_Symbol *procedure_symbol = rdim_symbol_chunk_list_push(arena, sym_procedures, sym_procedures_chunk_cap);\r\n                  procedure_symbol->is_extern        = (kind == CV_SymKind_GPROC32);\r\n                  procedure_symbol->name             = name;\r\n                  procedure_symbol->link_name        = link_name;\r\n                  procedure_symbol->type             = type;\r\n                  procedure_symbol->container_symbol = container_symbol;\r\n                  procedure_symbol->container_type   = container_type;\r\n                  procedure_symbol->root_scope       = procedure_root_scope;\r\n                  if(procedure_root_scope != 0)\r\n                  {\r\n                    procedure_root_scope->symbol = procedure_symbol;\r\n                  }\r\n                }\r\n                \r\n                // rjf: push scope to scope stack\r\n                if(procedure_root_scope)\r\n                {\r\n                  P2R_ScopeNode *node = free_scope_node;\r\n                  if(node != 0) { SLLStackPop(free_scope_node); }\r\n                  else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); }\r\n                  node->scope = procedure_root_scope;\r\n                  SLLStackPush(top_scope_node, node);\r\n                }\r\n                \r\n                // rjf: increment procedure counter\r\n                procedure_num += 1;\r\n              }break;\r\n              \r\n              //- rjf: REGREL32\r\n              case CV_SymKind_REGREL32:\r\n              if(params->subset_flags & RDIM_SubsetFlag_Locals)\r\n              {\r\n                // TODO(rjf): apparently some of the information here may end up being\r\n                // redundant with \"better\" information from  CV_SymKind_LOCAL record.\r\n                // we don't currently handle this, but if those cases arise then it\r\n                // will obviously be better to prefer the better information from both\r\n                // records.\r\n                \r\n                // rjf: no containing scope? -> malformed data; locals cannot be produced\r\n                // outside of a containing scope\r\n                if(top_scope_node == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymRegrel32 *regrel32 = (CV_SymRegrel32 *)sym_header_struct_base;\r\n                String8 name = str8_cstring_capped(regrel32+1, sym_data_opl);\r\n                RDIM_Type *type = p2r_type_ptr_from_itype(regrel32->itype);\r\n                CV_Reg cv_reg = regrel32->reg;\r\n                U32 var_off = regrel32->reg_off;\r\n                \r\n                // rjf: determine if this is a parameter\r\n                RDI_LocalKind local_kind = RDI_LocalKind_Variable;\r\n                {\r\n                  B32 is_stack_reg = 0;\r\n                  switch(arch)\r\n                  {\r\n                    default:{}break;\r\n                    case RDI_Arch_X86:{is_stack_reg = (cv_reg == CV_Regx86_ESP || cv_reg == CV_Regx86_EBP);}break;\r\n                    case RDI_Arch_X64:{is_stack_reg = (cv_reg == CV_Regx64_RSP || cv_reg == CV_Regx64_RBP);}break;\r\n                  }\r\n                  if(is_stack_reg)\r\n                  {\r\n                    U32 frame_size = 0xFFFFFFFF;\r\n                    if(procedure_num != 0 && procedure_frameprocs[procedure_num-1] != 0 && procedure_num <= procedure_frameprocs_count)\r\n                    {\r\n                      CV_SymFrameproc *frameproc = procedure_frameprocs[procedure_num-1];\r\n                      frame_size = frameproc->frame_size;\r\n                    }\r\n                    if(var_off > frame_size)\r\n                    {\r\n                      local_kind = RDI_LocalKind_Parameter;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // TODO(rjf): is this correct?\r\n                // rjf: redirect type, if 0, and if outside frame, to the return type of the\r\n                // containing procedure\r\n                if(local_kind == RDI_LocalKind_Parameter && regrel32->itype == 0 &&\r\n                   top_scope_node->scope->symbol != 0 &&\r\n                   top_scope_node->scope->symbol->type != 0)\r\n                {\r\n                  type = top_scope_node->scope->symbol->type->direct_type;\r\n                }\r\n                \r\n                // rjf: build local\r\n                RDIM_Scope *scope = top_scope_node->scope;\r\n                RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope);\r\n                local->kind = local_kind;\r\n                local->name = name;\r\n                local->type = type;\r\n                \r\n                // rjf: add location info to local\r\n                if(type != 0)\r\n                {\r\n                  // rjf: determine if we need an extra indirection to the value\r\n                  B32 extra_indirection_to_value = 0;\r\n                  switch(arch)\r\n                  {\r\n                    case RDI_Arch_X86:\r\n                    {\r\n                      extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 4 || !IsPow2OrZero(type->byte_size)));\r\n                    }break;\r\n                    case RDI_Arch_X64:\r\n                    {\r\n                      extra_indirection_to_value = (local_kind == RDI_LocalKind_Parameter && (type->byte_size > 8 || !IsPow2OrZero(type->byte_size)));\r\n                    }break;\r\n                  }\r\n                  \r\n                  // rjf: get raddbg register code\r\n                  RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg);\r\n                  // TODO(rjf): real byte_size & byte_pos from cv_reg goes here\r\n                  U32 byte_size = 8;\r\n                  U32 byte_pos = 0;\r\n                  \r\n                  // rjf: build location\r\n                  RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, (S64)(S32)var_off, extra_indirection_to_value);\r\n                  RDIM_Location *loc2 = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info);\r\n                  RDIM_Rng1U64 voff_range = {0, max_U64};\r\n                  rdim_local_push_location_case(arena, sym_scopes, local, loc2, voff_range);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: LTHREAD32/GTHREAD32\r\n              case CV_SymKind_LTHREAD32:\r\n              case CV_SymKind_GTHREAD32:\r\n              if(params->subset_flags & (RDIM_SubsetFlag_ThreadVariables|RDIM_SubsetFlag_ThreadVariableNameMap))\r\n              {\r\n                // rjf: unpack sym\r\n                CV_SymThread32 *thread32 = (CV_SymThread32 *)sym_header_struct_base;\r\n                String8 name = str8_cstring_capped(thread32+1, sym_data_opl);\r\n                U32 tls_off = thread32->tls_off;\r\n                RDIM_Type *type = p2r_type_ptr_from_itype(thread32->itype);\r\n                \r\n                // rjf: unpack thread variable's container type\r\n                RDIM_Type *container_type = 0;\r\n                U64 container_name_opl = p2r_end_of_cplusplus_container_name(name);\r\n                if(container_name_opl > 2)\r\n                {\r\n                  String8 container_name = str8(name.str, container_name_opl - 2);\r\n                  CV_TypeId cv_type_id = pdb_tpi_first_itype_from_name(tpi_hash, tpi_leaf, container_name, 0);\r\n                  container_type = p2r_type_ptr_from_itype(cv_type_id);\r\n                }\r\n                \r\n                // rjf: unpack thread variable's container symbol\r\n                RDIM_Symbol *container_symbol = 0;\r\n                if(container_type == 0 && top_scope_node != 0)\r\n                {\r\n                  container_symbol = top_scope_node->scope->symbol;\r\n                }\r\n                \r\n                // rjf: build symbol\r\n                RDIM_Symbol *tvar = rdim_symbol_chunk_list_push(arena, sym_thread_variables, sym_thread_variables_chunk_cap);\r\n                tvar->name             = name;\r\n                tvar->type             = type;\r\n                tvar->is_extern        = (kind == CV_SymKind_GTHREAD32);\r\n                tvar->offset           = tls_off;\r\n                tvar->container_type   = container_type;\r\n                tvar->container_symbol = container_symbol;\r\n              }break;\r\n              \r\n              //- rjf: LOCAL\r\n              case CV_SymKind_LOCAL:\r\n              if(params->subset_flags & (RDIM_SubsetFlag_Locals))\r\n              {\r\n                // rjf: no containing scope? -> malformed data; locals cannot be produced\r\n                // outside of a containing scope\r\n                if(top_scope_node == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymLocal *slocal = (CV_SymLocal *)sym_header_struct_base;\r\n                String8 name = str8_cstring_capped(slocal+1, sym_data_opl);\r\n                RDIM_Type *type = p2r_type_ptr_from_itype(slocal->itype);\r\n                \r\n                // rjf: determine if this symbol encodes the beginning of a global modification\r\n                B32 is_global_modification = 0;\r\n                if((slocal->flags & CV_LocalFlag_Global) ||\r\n                   (slocal->flags & CV_LocalFlag_Static))\r\n                {\r\n                  is_global_modification = 1;\r\n                }\r\n                \r\n                // rjf: is global modification -> emit global modification symbol\r\n                if(is_global_modification)\r\n                {\r\n                  // TODO(rjf): add global modification symbols\r\n                  defrange_target = 0;\r\n                  defrange_target_is_param = 0;\r\n                }\r\n                \r\n                // rjf: is not a global modification -> emit a local variable\r\n                if(!is_global_modification)\r\n                {\r\n                  // rjf: determine local kind\r\n                  RDI_LocalKind local_kind = RDI_LocalKind_Variable;\r\n                  if(slocal->flags & CV_LocalFlag_Param)\r\n                  {\r\n                    local_kind = RDI_LocalKind_Parameter;\r\n                  }\r\n                  \r\n                  // rjf: build local\r\n                  RDIM_Scope *scope = top_scope_node->scope;\r\n                  RDIM_Local *local = rdim_scope_push_local(arena, sym_scopes, scope);\r\n                  local->kind = local_kind;\r\n                  local->name = name;\r\n                  local->type = type;\r\n                  \r\n                  // rjf: save defrange target, for subsequent defrange symbols\r\n                  defrange_target = local;\r\n                  defrange_target_is_param = (local_kind == RDI_LocalKind_Parameter);\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: DEFRANGE_REGISTER\r\n              case CV_SymKind_DEFRANGE_REGISTER:\r\n              {\r\n                // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing\r\n                // a local - break immediately\r\n                if(defrange_target == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymDefrangeRegister *defrange_register = (CV_SymDefrangeRegister*)sym_header_struct_base;\r\n                CV_Reg cv_reg = defrange_register->reg;\r\n                CV_LvarAddrRange *range = &defrange_register->range;\r\n                COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0;\r\n                CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register+1);\r\n                U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);\r\n                RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg);\r\n                \r\n                // rjf: build location\r\n                RDIM_LocationInfo loc_info = {RDI_LocationKind_ValReg, reg_code};\r\n                RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info);\r\n                \r\n                // rjf: emit locations over ranges\r\n                p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, loc, range, range_section, gaps, gap_count);\r\n              }break;\r\n              \r\n              //- rjf: DEFRANGE_FRAMEPOINTER_REL\r\n              case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL:\r\n              {\r\n                // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing\r\n                // a local - break immediately\r\n                if(defrange_target == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: find current procedure's frameproc\r\n                CV_SymFrameproc *frameproc = 0;\r\n                if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0)\r\n                {\r\n                  frameproc = procedure_frameprocs[procedure_num-1];\r\n                }\r\n                \r\n                // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange\r\n                // without having an actually active procedure - break\r\n                if(frameproc == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymDefrangeFramepointerRel *defrange_fprel = (CV_SymDefrangeFramepointerRel*)sym_header_struct_base;\r\n                CV_LvarAddrRange *range = &defrange_fprel->range;\r\n                COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0;\r\n                CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_fprel + 1);\r\n                U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);\r\n                \r\n                // rjf: select frame pointer register\r\n                CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param);\r\n                RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg);\r\n                \r\n                // rjf: build location\r\n                B32 extra_indirection = 0;\r\n                U32 byte_size = rdi_addr_size_from_arch(arch);\r\n                U32 byte_pos = 0;\r\n                S64 var_off = (S64)defrange_fprel->off;\r\n                RDIM_LocationInfo location_info = p2r_location_info_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection);\r\n                RDIM_Location *location = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &location_info);\r\n                \r\n                // rjf: emit locations over ranges\r\n                p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, location, range, range_section, gaps, gap_count);\r\n              }break;\r\n              \r\n              //- rjf: DEFRANGE_SUBFIELD_REGISTER\r\n              case CV_SymKind_DEFRANGE_SUBFIELD_REGISTER:\r\n              {\r\n                // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing\r\n                // a local - break immediately\r\n                if(defrange_target == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymDefrangeSubfieldRegister *defrange_subfield_register = (CV_SymDefrangeSubfieldRegister*)sym_header_struct_base;\r\n                CV_Reg cv_reg = defrange_subfield_register->reg;\r\n                CV_LvarAddrRange *range = &defrange_subfield_register->range;\r\n                COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0;\r\n                CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_subfield_register + 1);\r\n                U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);\r\n                RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg);\r\n                \r\n                // rjf: skip \"subfield\" location info - currently not supported\r\n                if(defrange_subfield_register->field_offset != 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: build location\r\n                RDIM_LocationInfo loc_info = {RDI_LocationKind_ValReg, reg_code};\r\n                RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info);\r\n                \r\n                // rjf: emit locations over ranges\r\n                p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, loc, range, range_section, gaps, gap_count);\r\n              }break;\r\n              \r\n              //- rjf: DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE\r\n              case CV_SymKind_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE:\r\n              {\r\n                // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing\r\n                // a local - break immediately\r\n                if(defrange_target == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: find current procedure's frameproc\r\n                CV_SymFrameproc *frameproc = 0;\r\n                if(procedure_num != 0 && procedure_num <= procedure_frameprocs_count && procedure_frameprocs[procedure_num-1] != 0)\r\n                {\r\n                  frameproc = procedure_frameprocs[procedure_num-1];\r\n                }\r\n                \r\n                // rjf: no current valid frameproc? -> somehow we got a to a framepointer-relative defrange\r\n                // without having an actually active procedure - break\r\n                if(frameproc == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymDefrangeFramepointerRelFullScope *defrange_fprel_full_scope = (CV_SymDefrangeFramepointerRelFullScope*)sym_header_struct_base;\r\n                CV_EncodedFramePtrReg encoded_fp_reg = cv_pick_fp_encoding(frameproc, defrange_target_is_param);\r\n                RDI_RegCode fp_register_code = p2r_reg_code_from_arch_encoded_fp_reg(arch, encoded_fp_reg);\r\n                \r\n                // rjf: build location\r\n                B32 extra_indirection = 0;\r\n                U32 byte_size = rdi_addr_size_from_arch(arch);\r\n                U32 byte_pos = 0;\r\n                S64 var_off = (S64)defrange_fprel_full_scope->off;\r\n                RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, fp_register_code, byte_size, byte_pos, var_off, extra_indirection);\r\n                RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info);\r\n                \r\n                // rjf: emit location over ranges\r\n                RDIM_Rng1U64 voff_range = {0, max_U64};\r\n                rdim_local_push_location_case(arena, sym_scopes, defrange_target, loc, voff_range);\r\n              }break;\r\n              \r\n              //- rjf: DEFRANGE_REGISTER_REL\r\n              case CV_SymKind_DEFRANGE_REGISTER_REL:\r\n              {\r\n                // rjf: no defrange target? -> somehow we got to a defrange symbol without first seeing\r\n                // a local - break immediately\r\n                if(defrange_target == 0)\r\n                {\r\n                  break;\r\n                }\r\n                \r\n                // rjf: unpack sym\r\n                CV_SymDefrangeRegisterRel *defrange_register_rel = (CV_SymDefrangeRegisterRel*)sym_header_struct_base;\r\n                CV_Reg cv_reg = defrange_register_rel->reg;\r\n                RDI_RegCode reg_code = p2r_rdi_reg_code_from_cv_reg_code(arch, cv_reg);\r\n                CV_LvarAddrRange *range = &defrange_register_rel->range;\r\n                COFF_SectionHeader *range_section = (0 < range->sec && range->sec <= coff_sections.count) ? &coff_sections.v[range->sec-1] : 0;\r\n                CV_LvarAddrGap *gaps = (CV_LvarAddrGap*)(defrange_register_rel + 1);\r\n                U64 gap_count = ((U8*)sym_data_opl - (U8*)gaps) / sizeof(*gaps);\r\n                \r\n                // rjf: build location\r\n                // TODO(rjf): offset & size from cv_reg code\r\n                U32 byte_size = rdi_addr_size_from_arch(arch);\r\n                U32 byte_pos = 0;\r\n                B32 extra_indirection_to_value = 0;\r\n                S64 var_off = defrange_register_rel->reg_off;\r\n                RDIM_LocationInfo loc_info = p2r_location_info_from_addr_reg_off(arena, arch, reg_code, byte_size, byte_pos, var_off, extra_indirection_to_value);\r\n                RDIM_Location *loc = rdim_location_chunk_list_push_new(arena, sym_locations, sym_locations_chunk_cap, &loc_info);\r\n                \r\n                // rjf: emit locations over ranges\r\n                p2r_local_push_location_cases_over_lvar_addr_range(arena, sym_scopes, defrange_target, loc, range, range_section, gaps, gap_count);\r\n              }break;\r\n              \r\n              //- rjf: FILESTATIC\r\n              case CV_SymKind_FILESTATIC:\r\n              {\r\n                CV_SymFileStatic *file_static = (CV_SymFileStatic*)sym_header_struct_base;\r\n                String8 name = str8_cstring_capped(file_static+1, sym_data_opl);\r\n                RDIM_Type *type = p2r_type_ptr_from_itype(file_static->itype);\r\n                // TODO(rjf): emit a global modifier symbol\r\n                defrange_target = 0;\r\n                defrange_target_is_param = 0;\r\n              }break;\r\n              \r\n              //- rjf: INLINESITE\r\n              case CV_SymKind_INLINESITE:\r\n              if(params->subset_flags & (RDIM_SubsetFlag_Scopes))\r\n              {\r\n                // rjf: unpack sym\r\n                CV_SymInlineSite *sym           = (CV_SymInlineSite *)sym_header_struct_base;\r\n                String8           binary_annots = str8((U8 *)(sym+1), rec_range->hdr.size - sizeof(rec_range->hdr.kind) - sizeof(*sym));\r\n                \r\n                // rjf: extract external info about inline site\r\n                String8    name      = str8_zero();\r\n                RDIM_Type *type      = 0;\r\n                RDIM_Type *owner     = 0;\r\n                if(ipi_leaf != 0 && ipi_leaf->itype_first <= sym->inlinee && sym->inlinee < ipi_leaf->itype_opl)\r\n                {\r\n                  CV_RecRange rec_range = ipi_leaf->leaf_ranges.ranges[sym->inlinee - ipi_leaf->itype_first];\r\n                  String8     rec_data  = str8_substr(ipi_leaf->data, rng_1u64(rec_range.off, rec_range.off + rec_range.hdr.size));\r\n                  void       *raw_leaf  = rec_data.str + sizeof(U16);\r\n                  \r\n                  // rjf: extract method inline info\r\n                  if(rec_range.hdr.kind == CV_LeafKind_MFUNC_ID &&\r\n                     rec_range.hdr.size >= sizeof(CV_LeafMFuncId))\r\n                  {\r\n                    CV_LeafMFuncId *mfunc_id = (CV_LeafMFuncId*)raw_leaf;\r\n                    name  = str8_cstring_capped(mfunc_id + 1, rec_data.str + rec_data.size);\r\n                    type  = p2r_type_ptr_from_itype(mfunc_id->itype);\r\n                    owner = mfunc_id->owner_itype != 0 ? p2r_type_ptr_from_itype(mfunc_id->owner_itype) : 0;\r\n                  }\r\n                  \r\n                  // rjf: extract non-method function inline info\r\n                  else if(rec_range.hdr.kind == CV_LeafKind_FUNC_ID &&\r\n                          rec_range.hdr.size >= sizeof(CV_LeafFuncId))\r\n                  {\r\n                    CV_LeafFuncId *func_id = (CV_LeafFuncId*)raw_leaf;\r\n                    name  = str8_cstring_capped(func_id + 1, rec_data.str + rec_data.size);\r\n                    type  = p2r_type_ptr_from_itype(func_id->itype);\r\n                    owner = func_id->scope_string_id != 0 ? p2r_type_ptr_from_itype(func_id->scope_string_id) : 0;\r\n                  }\r\n                }\r\n                \r\n                // rjf: build inline site\r\n                RDIM_InlineSite *inline_site = rdim_inline_site_chunk_list_push(arena, sym_inline_sites, sym_inline_sites_chunk_cap);\r\n                inline_site->name       = name;\r\n                inline_site->type       = type;\r\n                inline_site->owner      = owner;\r\n                inline_site->line_table = inline_site_line_table;\r\n                \r\n                // rjf: increment to next inline site line table in this unit\r\n                if(inline_site_line_table != 0 && inline_site_line_table->chunk != 0)\r\n                {\r\n                  RDIM_LineTableChunkNode *chunk = inline_site_line_table->chunk;\r\n                  U64 current_idx = (U64)(inline_site_line_table - chunk->v);\r\n                  if(current_idx+1 < chunk->count)\r\n                  {\r\n                    inline_site_line_table += 1;\r\n                  }\r\n                  else\r\n                  {\r\n                    chunk = chunk->next;\r\n                    inline_site_line_table = 0;\r\n                    if(chunk != 0)\r\n                    {\r\n                      inline_site_line_table = chunk->v;\r\n                    }\r\n                  }\r\n                }\r\n                \r\n                // rjf: build scope\r\n                RDIM_Scope *scope = rdim_scope_chunk_list_push(arena, sym_scopes, sym_scopes_chunk_cap);\r\n                scope->inline_site = inline_site;\r\n                if(top_scope_node == 0)\r\n                {\r\n                  // TODO(rjf): log\r\n                }\r\n                if(top_scope_node != 0)\r\n                {\r\n                  RDIM_Scope *top_scope = top_scope_node->scope;\r\n                  SLLQueuePush_N(top_scope->first_child, top_scope->last_child, scope, next_sibling);\r\n                  scope->parent_scope = top_scope;\r\n                  scope->symbol = top_scope->symbol;\r\n                }\r\n                \r\n                // rjf: push this scope to scope stack\r\n                {\r\n                  P2R_ScopeNode *node = free_scope_node;\r\n                  if(node != 0) { SLLStackPop(free_scope_node); }\r\n                  else { node = push_array_no_zero(scratch.arena, P2R_ScopeNode, 1); }\r\n                  node->scope = scope;\r\n                  SLLStackPush(top_scope_node, node);\r\n                }\r\n                \r\n                // rjf: parse offset ranges of this inline site - attach to scope\r\n                {\r\n                  CV_C13InlineSiteDecoder decoder = cv_c13_inline_site_decoder_init(0, 0, procedure_base_voff);\r\n                  for(;;)\r\n                  {\r\n                    CV_C13InlineSiteDecoderStep step = cv_c13_inline_site_decoder_step(&decoder, binary_annots);\r\n                    \r\n                    if(step.flags & CV_C13InlineSiteDecoderStepFlag_EmitRange)\r\n                    {\r\n                      // rjf: build new range & add to scope\r\n                      RDIM_Rng1U64 voff_range = { step.range.min, step.range.max };\r\n                      rdim_scope_push_voff_range(arena, sym_scopes, scope, voff_range);\r\n                    }\r\n                    \r\n                    if(step.flags & CV_C13InlineSiteDecoderStepFlag_ExtendLastRange)\r\n                    {\r\n                      if(scope->voff_ranges.last != 0) \r\n                      {\r\n                        scope->voff_ranges.last->v.max = step.range.max;\r\n                      }\r\n                    }\r\n                    \r\n                    if(step.flags == 0)\r\n                    {\r\n                      break;\r\n                    }\r\n                  }\r\n                }\r\n              }break;\r\n              \r\n              //- rjf: INLINESITE_END\r\n              case CV_SymKind_INLINESITE_END:\r\n              {\r\n                P2R_ScopeNode *n = top_scope_node;\r\n                if(n != 0)\r\n                {\r\n                  SLLStackPop(top_scope_node);\r\n                  SLLStackPush(free_scope_node, n);\r\n                }\r\n                defrange_target = 0;\r\n                defrange_target_is_param = 0;\r\n              }break;\r\n              \r\n              //- rjf: CONSTANT\r\n              case CV_SymKind_CONSTANT:\r\n              if(params->subset_flags & RDIM_SubsetFlag_Constants)\r\n              {\r\n                // rjf: unpack\r\n                CV_SymConstant *sym = (CV_SymConstant *)sym_header_struct_base;\r\n                RDIM_Type *type = p2r_type_ptr_from_itype(sym->itype);\r\n                U8 *val_ptr = (U8 *)(sym+1);\r\n                CV_NumericParsed val = cv_numeric_from_data_range(val_ptr, sym_data_opl);\r\n                U64 val64 = cv_u64_from_numeric(&val);\r\n                U8 *name_ptr = val_ptr + val.encoded_size;\r\n                String8 name = str8_cstring_capped(name_ptr, sym_data_opl);\r\n                String8 val_data = str8_struct(&val64);\r\n                U64 container_name_opl = 0;\r\n                if(type != 0)\r\n                {\r\n                  container_name_opl = p2r_end_of_cplusplus_container_name(type->name);\r\n                }\r\n                String8 name_qualified = name;\r\n                if(container_name_opl != 0)\r\n                {\r\n                  name_qualified = push_str8f(arena, \"%S%S\", str8_prefix(type->name, container_name_opl), name);\r\n                }\r\n                \r\n                // rjf: build constant symbol\r\n                if(name_qualified.size != 0)\r\n                {\r\n                  RDIM_Symbol *cnst = rdim_symbol_chunk_list_push(arena, sym_constants, sym_constants_chunk_cap);\r\n                  cnst->name = name_qualified;\r\n                  cnst->type = type;\r\n                  rdim_symbol_push_value_data(arena, sym_constants, cnst, val_data);\r\n                }\r\n              }break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        scratch_end(scratch);\r\n      }\r\n    }\r\n#undef p2r_type_ptr_from_itype\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: join all lane symbols\r\n  //\r\n  RDIM_LocationChunkList *all_locations = 0;\r\n  RDIM_SymbolChunkList *all_procedures = 0;\r\n  RDIM_SymbolChunkList *all_global_variables = 0;\r\n  RDIM_SymbolChunkList *all_thread_variables = 0;\r\n  RDIM_SymbolChunkList *all_constants = 0;\r\n  RDIM_ScopeChunkList *all_scopes = 0;\r\n  RDIM_InlineSiteChunkList *all_inline_sites = 0;\r\n  RDIM_TypeChunkList *all_types = 0;\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      all_locations = push_array(scratch.arena, RDIM_LocationChunkList, 1);\r\n      all_procedures = push_array(scratch.arena, RDIM_SymbolChunkList, 1);\r\n      all_global_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1);\r\n      all_thread_variables = push_array(scratch.arena, RDIM_SymbolChunkList, 1);\r\n      all_constants = push_array(scratch.arena, RDIM_SymbolChunkList, 1);\r\n      all_scopes = push_array(scratch.arena, RDIM_ScopeChunkList, 1);\r\n      all_inline_sites = push_array(scratch.arena, RDIM_InlineSiteChunkList, 1);\r\n      all_types = push_array(scratch.arena, RDIM_TypeChunkList, 1);\r\n    }\r\n    lane_sync_u64(&all_locations, 0);\r\n    lane_sync_u64(&all_procedures, 0);\r\n    lane_sync_u64(&all_global_variables, 0);\r\n    lane_sync_u64(&all_thread_variables, 0);\r\n    lane_sync_u64(&all_constants, 0);\r\n    lane_sync_u64(&all_scopes, 0);\r\n    lane_sync_u64(&all_inline_sites, 0);\r\n    lane_sync_u64(&all_types, 0);\r\n    if(lane_idx() == lane_from_task_idx(0)) ProfScope(\"join locations\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_location_chunk_list_concat_in_place(all_locations, &syms_locations[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1)) ProfScope(\"join procedures\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_symbol_chunk_list_concat_in_place(all_procedures, &syms_procedures[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2)) ProfScope(\"join global variables\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_symbol_chunk_list_concat_in_place(all_global_variables, &syms_global_variables[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(3)) ProfScope(\"join thread variables\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_symbol_chunk_list_concat_in_place(all_thread_variables, &syms_thread_variables[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(4)) ProfScope(\"join constants\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_symbol_chunk_list_concat_in_place(all_constants, &syms_constants[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(5)) ProfScope(\"join scopes\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_scope_chunk_list_concat_in_place(all_scopes, &syms_scopes[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(6)) ProfScope(\"join inline sites\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_inline_site_chunk_list_concat_in_place(all_inline_sites, &syms_inline_sites[idx]);\r\n      }\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(7)) ProfScope(\"join typedefs\")\r\n    {\r\n      for EachIndex(idx, all_syms_count)\r\n      {\r\n        rdim_type_chunk_list_concat_in_place(&all_types__pre_typedefs, &syms_typedefs[idx]);\r\n      }\r\n      *all_types = all_types__pre_typedefs;\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: bundle all outputs\r\n  //\r\n  RDIM_BakeParams result = {0};\r\n  {\r\n    //- rjf: produce top-level-info\r\n    RDIM_TopLevelInfo top_level_info = {0};\r\n    {\r\n      top_level_info.arch          = arch;\r\n      top_level_info.exe_name      = str8_skip_last_slash(params->input_exe_name);\r\n      top_level_info.exe_hash      = exe_hash;\r\n      top_level_info.voff_max      = exe_voff_max;\r\n      if(!params->deterministic)\r\n      {\r\n        MemoryCopy(&top_level_info.guid.u8[0], &pdb_info->auth_guid.v[0], Min(sizeof top_level_info.guid.u8, sizeof pdb_info->auth_guid.v));\r\n        top_level_info.producer_name = str8_lit(BUILD_TITLE_STRING_LITERAL);\r\n      }\r\n    }\r\n    \r\n    //- rjf: build binary sections list\r\n    RDIM_BinarySectionList binary_sections = {0};\r\n    if(params->subset_flags & RDIM_SubsetFlag_BinarySections) ProfScope(\"build binary section list\")\r\n    {\r\n      COFF_SectionHeader *coff_ptr = coff_sections.v;\r\n      COFF_SectionHeader *coff_opl = coff_ptr + coff_sections.count;\r\n      for(;coff_ptr < coff_opl; coff_ptr += 1)\r\n      {\r\n        char *name_first = (char *)coff_ptr->name;\r\n        char *name_opl   = name_first + sizeof(coff_ptr->name);\r\n        RDIM_BinarySection *sec = rdim_binary_section_list_push(arena, &binary_sections);\r\n        sec->name       = str8_cstring_capped(name_first, name_opl);\r\n        sec->flags      = p2r_rdi_binary_section_flags_from_coff_section_flags(coff_ptr->flags);\r\n        sec->voff_first = coff_ptr->voff;\r\n        sec->voff_opl   = coff_ptr->voff+coff_ptr->vsize;\r\n        sec->foff_first = coff_ptr->foff;\r\n        sec->foff_opl   = coff_ptr->foff+coff_ptr->fsize;\r\n      }\r\n    }\r\n    \r\n    //- rjf: fill\r\n    result.subset_flags     = params->subset_flags;\r\n    result.top_level_info   = top_level_info;\r\n    result.binary_sections  = binary_sections;\r\n    result.units            = all_units;\r\n    result.types            = *all_types;\r\n    result.udts             = all_udts;\r\n    result.src_files        = all_src_files;\r\n    result.line_tables      = all_line_tables;\r\n    result.locations        = *all_locations;\r\n    result.global_variables = *all_global_variables;\r\n    result.thread_variables = *all_thread_variables;\r\n    result.constants        = *all_constants;\r\n    result.procedures       = *all_procedures;\r\n    result.scopes           = *all_scopes;\r\n    result.inline_sites     = *all_inline_sites;\r\n  }\r\n  \r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/rdi_from_pdb/rdi_from_pdb.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RDI_FROM_PDB_H\r\n#define RDI_FROM_PDB_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Conversion Stage Inputs\r\n\r\ntypedef struct P2R_ConvertParams P2R_ConvertParams;\r\nstruct P2R_ConvertParams\r\n{\r\n  String8 input_pdb_name;\r\n  String8 input_pdb_data;\r\n  String8 input_exe_name;\r\n  String8 input_exe_data;\r\n  RDIM_SubsetFlags subset_flags;\r\n  B32 deterministic;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Conversion Helper Types\r\n\r\n//- rjf: link name map (voff -> string)\r\n\r\ntypedef struct P2R_LinkNameNode P2R_LinkNameNode;\r\nstruct P2R_LinkNameNode\r\n{\r\n  P2R_LinkNameNode *next;\r\n  U64 voff;\r\n  String8 name;\r\n};\r\n\r\ntypedef struct P2R_LinkNameMap P2R_LinkNameMap;\r\nstruct P2R_LinkNameMap\r\n{\r\n  P2R_LinkNameNode **buckets;\r\n  U64 buckets_count;\r\n  U64 bucket_collision_count;\r\n  U64 link_name_count;\r\n};\r\n\r\n//- rjf: normalized file path -> source file map\r\n\r\ntypedef struct P2R_SrcFileStub P2R_SrcFileStub;\r\nstruct P2R_SrcFileStub\r\n{\r\n  String8 file_path;\r\n  CV_C13ChecksumKind checksum_kind;\r\n  String8 checksum;\r\n};\r\n\r\ntypedef struct P2R_SrcFileStubArray P2R_SrcFileStubArray;\r\nstruct P2R_SrcFileStubArray\r\n{\r\n  P2R_SrcFileStub *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct P2R_SrcFileStubNode P2R_SrcFileStubNode;\r\nstruct P2R_SrcFileStubNode\r\n{\r\n  P2R_SrcFileStubNode *next;\r\n  P2R_SrcFileStub v;\r\n};\r\n\r\ntypedef struct P2R_SrcFileNode P2R_SrcFileNode;\r\nstruct P2R_SrcFileNode\r\n{\r\n  P2R_SrcFileNode *next;\r\n  RDIM_SrcFile *src_file;\r\n};\r\n\r\ntypedef struct P2R_SrcFileMap P2R_SrcFileMap;\r\nstruct P2R_SrcFileMap\r\n{\r\n  P2R_SrcFileNode **slots;\r\n  U64 slots_count;\r\n};\r\n\r\n//- rjf: itype chains\r\n\r\ntypedef struct P2R_TypeIdChain P2R_TypeIdChain;\r\nstruct P2R_TypeIdChain\r\n{\r\n  P2R_TypeIdChain *next;\r\n  CV_TypeId itype;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal U64 p2r_end_of_cplusplus_container_name(String8 str);\r\ninternal U64 p2r_hash_from_voff(U64 voff);\r\n\r\n////////////////////////////////\r\n//~ rjf: COFF => RDI Canonical Conversions\r\n\r\ninternal RDI_BinarySectionFlags p2r_rdi_binary_section_flags_from_coff_section_flags(COFF_SectionFlags flags);\r\n\r\n////////////////////////////////\r\n//~ rjf: CodeView => RDI Canonical Conversions\r\n\r\ninternal RDI_Arch         p2r_rdi_arch_from_cv_arch(CV_Arch arch);\r\ninternal RDI_RegCode      p2r_rdi_reg_code_from_cv_reg_code(RDI_Arch arch, CV_Reg reg_code);\r\ninternal RDI_Language     p2r_rdi_language_from_cv_language(CV_Language language);\r\ninternal RDI_TypeKind     p2r_rdi_type_kind_from_cv_basic_type(CV_BasicType basic_type);\r\ninternal RDI_ChecksumKind p2r_rdi_from_cv_c13_checksum_kind(CV_C13ChecksumKind k);\r\n\r\n////////////////////////////////\r\n//~ rjf: Location Info Building Helpers\r\n\r\ninternal RDI_RegCode p2r_reg_code_from_arch_encoded_fp_reg(RDI_Arch arch, CV_EncodedFramePtrReg encoded_reg);\r\ninternal RDIM_LocationInfo p2r_location_info_from_addr_reg_off(Arena *arena, RDI_Arch arch, RDI_RegCode reg_code, U32 reg_byte_size, U32 reg_byte_pos, S64 offset, B32 extra_indirection);\r\ninternal void p2r_local_push_location_cases_over_lvar_addr_range(Arena *arena, RDIM_ScopeChunkList *scopes, RDIM_Local *local, RDIM_Location *loc, CV_LvarAddrRange *range, COFF_SectionHeader *section, CV_LvarAddrGap *gaps, U64 gap_count);\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Conversion Entry Point\r\n\r\ninternal RDIM_BakeParams p2r_convert(Arena *arena, P2R_ConvertParams *params);\r\n\r\n#endif // RDI_FROM_PDB_H\r\n"
  },
  {
    "path": "src/rdi_make/rdi_make_local.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"lib_rdi_make/rdi_make.c\"\r\n\r\ninternal RDIM_DataModel\r\nrdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch)\r\n{\r\n  RDIM_DataModel data_model = RDIM_DataModel_Null;\r\n#define Case(os_name, arch_name, model_name) if(os == OperatingSystem_##os_name && arch == Arch_##arch_name) { data_model = RDIM_DataModel_##model_name; }\r\n  Case(Windows, x86, LLP64);\r\n  Case(Windows, x64, LLP64);\r\n  Case(Linux,   x86, ILP32);\r\n  Case(Linux,   x64, LLP64);\r\n  Case(Mac,     x64, LP64);\r\n#undef Case\r\n  return data_model;\r\n}\r\n\r\ninternal RDIM_BakeResults\r\nrdim_bake(Arena *arena, RDIM_BakeParams *params)\r\n{\r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: set up shared state\r\n  //\r\n  if(lane_idx() == 0)\r\n  {\r\n    rdim_shared = push_array(arena, RDIM_Shared, 1);\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake vmaps\r\n  //\r\n  ProfScope(\"bake vmaps\")\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n#pragma pack(push, 1)\r\n    typedef struct VMapRecord VMapRecord;\r\n    struct VMapRecord\r\n    {\r\n      union\r\n      {\r\n        struct\r\n        {\r\n          U32 negative_size;\r\n          U64 voff;\r\n        };\r\n        U8 digits[12];\r\n      }\r\n      key;\r\n      U32 idx;\r\n    };\r\n#pragma pack(pop)\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather unsorted scope vmap records\r\n    //\r\n    VMapRecord *scope_vmap_records = 0;\r\n    U64 scope_vmap_records_count = 0;\r\n    ProfScope(\"gather unsorted scope vmap records\")\r\n    {\r\n      //- rjf: calculate per-lane-chunk counts\r\n      U64 *lane_chunk_range_counts = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lane_chunk_range_counts = push_array(scratch.arena, U64, params->scopes.chunk_count * lane_count());\r\n      }\r\n      lane_sync_u64(&lane_chunk_range_counts, 0);\r\n      {\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx;\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            lane_chunk_range_counts[slot_idx] += n->v[n_idx].voff_ranges.count;\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n      }\r\n      lane_sync();\r\n      \r\n      //- rjf: calculate per-lane-chunk offsets\r\n      U64 *lane_chunk_range_offs = 0;\r\n      U64 total_range_count = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lane_chunk_range_offs = push_array(scratch.arena, U64, params->scopes.chunk_count * lane_count());\r\n        U64 off = 0;\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n        {\r\n          for EachIndex(l_idx, lane_count())\r\n          {\r\n            U64 slot_idx = l_idx*params->scopes.chunk_count + chunk_idx;\r\n            lane_chunk_range_offs[slot_idx] = off;\r\n            off += lane_chunk_range_counts[slot_idx];\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n        total_range_count = off;\r\n      }\r\n      lane_sync_u64(&lane_chunk_range_offs, 0);\r\n      lane_sync_u64(&total_range_count, 0);\r\n      \r\n      //- rjf: allocate records\r\n      if(lane_idx() == 0)\r\n      {\r\n        scope_vmap_records_count = total_range_count;\r\n        scope_vmap_records = push_array_no_zero(scratch.arena, VMapRecord, scope_vmap_records_count);\r\n      }\r\n      lane_sync_u64(&scope_vmap_records, 0);\r\n      lane_sync_u64(&scope_vmap_records_count, 0);\r\n      \r\n      //- rjf: fill records\r\n      {\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx;\r\n          U64 off = lane_chunk_range_offs[slot_idx];\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            RDI_U32 scope_idx = (RDI_U32)rdim_idx_from_scope(&n->v[n_idx]); // TODO(rjf): @u64_to_u32\r\n            for EachNode(rng_n, RDIM_Rng1U64Node, n->v[n_idx].voff_ranges.first)\r\n            {\r\n              scope_vmap_records[off].key.voff = rng_n->v.min;\r\n              scope_vmap_records[off].key.negative_size = -(RDI_U32)(rng_n->v.max - rng_n->v.min);\r\n              scope_vmap_records[off].idx = scope_idx;\r\n              off += 1;\r\n            }\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather unsorted global vmap records\r\n    //\r\n    VMapRecord *global_vmap_records = 0;\r\n    U64 global_vmap_records_count = 0;\r\n    ProfScope(\"gather unsorted global vmap records\")\r\n    {\r\n      //- rjf: calculate per-lane-chunk counts\r\n      U64 *lane_chunk_range_counts = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lane_chunk_range_counts = push_array(scratch.arena, U64, params->global_variables.chunk_count * lane_count());\r\n      }\r\n      lane_sync_u64(&lane_chunk_range_counts, 0);\r\n      {\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->global_variables.chunk_count + chunk_idx;\r\n          Rng1U64 range = lane_range(n->count);\r\n          lane_chunk_range_counts[slot_idx] += dim_1u64(range);\r\n          chunk_idx += 1;\r\n        }\r\n      }\r\n      lane_sync();\r\n      \r\n      //- rjf: calculate per-lane-chunk offsets\r\n      U64 *lane_chunk_range_offs = 0;\r\n      U64 total_range_count = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lane_chunk_range_offs = push_array(scratch.arena, U64, params->global_variables.chunk_count * lane_count());\r\n        U64 off = 0;\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first)\r\n        {\r\n          for EachIndex(l_idx, lane_count())\r\n          {\r\n            U64 slot_idx = l_idx*params->global_variables.chunk_count + chunk_idx;\r\n            lane_chunk_range_offs[slot_idx] = off;\r\n            off += lane_chunk_range_counts[slot_idx];\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n        total_range_count = off;\r\n      }\r\n      lane_sync_u64(&lane_chunk_range_offs, 0);\r\n      lane_sync_u64(&total_range_count, 0);\r\n      \r\n      //- rjf: allocate records\r\n      if(lane_idx() == 0)\r\n      {\r\n        global_vmap_records_count = total_range_count;\r\n        global_vmap_records = push_array_no_zero(scratch.arena, VMapRecord, global_vmap_records_count);\r\n      }\r\n      lane_sync_u64(&global_vmap_records, 0);\r\n      lane_sync_u64(&global_vmap_records_count, 0);\r\n      \r\n      //- rjf: fill records\r\n      {\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->global_variables.chunk_count + chunk_idx;\r\n          U64 off = lane_chunk_range_offs[slot_idx];\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            RDI_U32 global_idx  = (RDI_U32)rdim_idx_from_symbol(&n->v[n_idx]); // TODO(rjf): @u64_to_u32\r\n            RDI_U32 global_size = (RDI_U32)(n->v[n_idx].type ? n->v[n_idx].type->byte_size : 1);\r\n            RDI_U64 global_voff = n->v[n_idx].offset;\r\n            global_vmap_records[off].key.voff = global_voff;\r\n            global_vmap_records[off].key.negative_size = -global_size;\r\n            global_vmap_records[off].idx = global_idx;\r\n            off += 1;\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    ////////////////////////////\r\n    //- rjf: gather unsorted unit vmap records\r\n    //\r\n    VMapRecord *unit_vmap_records = 0;\r\n    U64 unit_vmap_records_count = 0;\r\n    ProfScope(\"gather unsorted unit vmap records\")\r\n    {\r\n      //- rjf: calculate per-lane-chunk counts\r\n      U64 *lane_chunk_range_counts = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lane_chunk_range_counts = push_array(scratch.arena, U64, params->units.chunk_count * lane_count());\r\n      }\r\n      lane_sync_u64(&lane_chunk_range_counts, 0);\r\n      {\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_UnitChunkNode, params->units.first)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->units.chunk_count + chunk_idx;\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            lane_chunk_range_counts[slot_idx] += n->v[n_idx].voff_ranges.total_count;\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n      }\r\n      lane_sync();\r\n      \r\n      //- rjf: calculate per-lane-chunk offsets\r\n      U64 *lane_chunk_range_offs = 0;\r\n      U64 total_range_count = 0;\r\n      if(lane_idx() == 0)\r\n      {\r\n        lane_chunk_range_offs = push_array(scratch.arena, U64, params->units.chunk_count * lane_count());\r\n        U64 off = 0;\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_UnitChunkNode, params->units.first)\r\n        {\r\n          for EachIndex(l_idx, lane_count())\r\n          {\r\n            U64 slot_idx = l_idx*params->units.chunk_count + chunk_idx;\r\n            lane_chunk_range_offs[slot_idx] = off;\r\n            off += lane_chunk_range_counts[slot_idx];\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n        total_range_count = off;\r\n      }\r\n      lane_sync_u64(&lane_chunk_range_offs, 0);\r\n      lane_sync_u64(&total_range_count, 0);\r\n      \r\n      //- rjf: allocate records\r\n      if(lane_idx() == 0)\r\n      {\r\n        unit_vmap_records_count = total_range_count;\r\n        unit_vmap_records = push_array_no_zero(scratch.arena, VMapRecord, unit_vmap_records_count);\r\n      }\r\n      lane_sync_u64(&unit_vmap_records, 0);\r\n      lane_sync_u64(&unit_vmap_records_count, 0);\r\n      \r\n      //- rjf: fill records\r\n      {\r\n        U64 chunk_idx = 0;\r\n        for EachNode(n, RDIM_UnitChunkNode, params->units.first)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->units.chunk_count + chunk_idx;\r\n          U64 off = lane_chunk_range_offs[slot_idx];\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            RDI_U32 unit_idx = (RDI_U32)rdim_idx_from_unit(&n->v[n_idx]); // TODO(rjf): @u64_to_u32\r\n            for EachNode(rng_n, RDIM_Rng1U64ChunkNode, n->v[n_idx].voff_ranges.first)\r\n            {\r\n              for EachIndex(rng_n_idx, rng_n->count)\r\n              {\r\n                unit_vmap_records[off].key.voff = rng_n->v[rng_n_idx].min;\r\n                unit_vmap_records[off].key.negative_size = -(RDI_U32)(rng_n->v[rng_n_idx].max - rng_n->v[rng_n_idx].min);\r\n                unit_vmap_records[off].idx = unit_idx;\r\n                off += 1;\r\n              }\r\n            }\r\n          }\r\n          chunk_idx += 1;\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    ////////////////////////////\r\n    //- rjf: sort & bake all vmaps\r\n    //\r\n    struct\r\n    {\r\n      String8 name;\r\n      VMapRecord *records;\r\n      U64 records_count;\r\n      RDI_VMapEntry **vmap_out;\r\n      U32 *vmap_count_out;\r\n    }\r\n    vmap_tasks[] =\r\n    {\r\n      {str8_lit_comp(\"scopes\"),  scope_vmap_records,   scope_vmap_records_count,  &rdim_shared->baked_scope_vmap.vmap.vmap,  &rdim_shared->baked_scope_vmap.vmap.count},\r\n      {str8_lit_comp(\"globals\"), global_vmap_records,  global_vmap_records_count, &rdim_shared->baked_global_vmap.vmap.vmap, &rdim_shared->baked_global_vmap.vmap.count},\r\n      {str8_lit_comp(\"units\"),   unit_vmap_records,    unit_vmap_records_count,   &rdim_shared->baked_unit_vmap.vmap.vmap,   &rdim_shared->baked_unit_vmap.vmap.count},\r\n    };\r\n    ProfScope(\"sort & bake all vmaps\")\r\n    {\r\n      for EachElement(vmap_task_idx, vmap_tasks) ProfScope(\"sort & bake vmap for %.*s\", str8_varg(vmap_tasks[vmap_task_idx].name))\r\n      {\r\n        VMapRecord *records = vmap_tasks[vmap_task_idx].records;\r\n        U64 records_count = vmap_tasks[vmap_task_idx].records_count;\r\n        \r\n        ////////////////////////\r\n        //- rjf: sort\r\n        //\r\n        ProfScope(\"sort\")\r\n        {\r\n          //- rjf: set up constants\r\n          U64 bytes_per_digit = 1;\r\n          U64 num_possible_values_per_digit = 1<<(bytes_per_digit*8);\r\n          U64 digits_count = sizeof(((VMapRecord *)0)->key)/bytes_per_digit;\r\n          \r\n          //- rjf: set up swap buffer / lane counters\r\n          VMapRecord *records__swap = 0;\r\n          U32 **lane_digit_counts = 0;\r\n          U32 **lane_digit_offs = 0;\r\n          if(lane_idx() == 0)\r\n          {\r\n            records__swap = push_array_no_zero(scratch.arena, VMapRecord, records_count);\r\n            lane_digit_counts = push_array_no_zero(scratch.arena, U32 *, lane_count());\r\n            lane_digit_offs = push_array_no_zero(scratch.arena, U32 *, lane_count());\r\n          }\r\n          lane_sync_u64(&records__swap, 0);\r\n          lane_sync_u64(&lane_digit_counts, 0);\r\n          lane_sync_u64(&lane_digit_offs, 0);\r\n          lane_digit_counts[lane_idx()] = push_array_no_zero(scratch.arena, U32, num_possible_values_per_digit);\r\n          lane_digit_offs[lane_idx()] = push_array_no_zero(scratch.arena, U32, num_possible_values_per_digit);\r\n          \r\n          //- rjf: do all sort passes\r\n          {\r\n            VMapRecord *src = records;\r\n            VMapRecord *dst = records__swap;\r\n            for EachIndex(digit_idx, digits_count)\r\n            {\r\n              // rjf: count digit value occurrences per-lane\r\n              {\r\n                U32 *digit_counts = lane_digit_counts[lane_idx()];\r\n                MemoryZero(digit_counts, sizeof(digit_counts[0])*num_possible_values_per_digit);\r\n                Rng1U64 range = lane_range(records_count);\r\n                for EachInRange(idx, range)\r\n                {\r\n                  VMapRecord *rec = &src[idx];\r\n                  U16 digit_value = (U16)rec->key.digits[digit_idx];\r\n                  digit_counts[digit_value] += 1;\r\n                }\r\n              }\r\n              lane_sync();\r\n              \r\n              // rjf: compute thread * digit value *relative* offset table\r\n              {\r\n                Rng1U64 range = lane_range(num_possible_values_per_digit);\r\n                for EachInRange(value_idx, range)\r\n                {\r\n                  U64 layout_off = 0;\r\n                  for EachIndex(lane_idx, lane_count())\r\n                  {\r\n                    lane_digit_offs[lane_idx][value_idx] = layout_off;\r\n                    layout_off += lane_digit_counts[lane_idx][value_idx];\r\n                  }\r\n                }\r\n              }\r\n              lane_sync();\r\n              \r\n              // rjf: convert relative offsets -> absolute offsets\r\n              if(lane_idx() == 0)\r\n              {\r\n                U64 last_off = 0;\r\n                U64 num_of_nonzero_digit = 0;\r\n                for EachIndex(value_idx, num_possible_values_per_digit)\r\n                {\r\n                  for EachIndex(lane_idx, lane_count())\r\n                  {\r\n                    lane_digit_offs[lane_idx][value_idx] += last_off;\r\n                  }\r\n                  last_off = lane_digit_offs[lane_count()-1][value_idx] + lane_digit_counts[lane_count()-1][value_idx];\r\n                }\r\n                // NOTE(rjf): required that: (last_off == element_count)\r\n              }\r\n              lane_sync();\r\n              \r\n              // rjf: move\r\n              {\r\n                U32 *lane_digit_offsets = lane_digit_offs[lane_idx()];\r\n                Rng1U64 range = lane_range(records_count);\r\n                for EachInRange(idx, range)\r\n                {\r\n                  VMapRecord *src_rec = &src[idx];\r\n                  U16 digit_value = (U16)src_rec->key.digits[digit_idx];\r\n                  U64 dst_off = lane_digit_offsets[digit_value];\r\n                  lane_digit_offsets[digit_value] += 1;\r\n                  MemoryCopyStruct(&dst[dst_off], src_rec);\r\n                }\r\n              }\r\n              lane_sync();\r\n              \r\n              // rjf: swap source with destination for next pass\r\n              Swap(VMapRecord *, src, dst);\r\n            }\r\n          }\r\n        }\r\n        lane_sync();\r\n        \r\n        ////////////////////////\r\n        //- rjf: bake\r\n        //\r\n        RDI_VMapEntry *vmap = 0;\r\n        RDI_U64 vmap_count = 0;\r\n        {\r\n          //- rjf: allocate vmap\r\n          RDI_U64 vmap_count__cap = records_count*2 + 1;\r\n          if(lane_idx() == 0)\r\n          {\r\n            vmap = push_array(arena, RDI_VMapEntry, vmap_count__cap);\r\n          }\r\n          lane_sync_u64(&vmap, 0);\r\n          \r\n          //- rjf: bake\r\n          if(lane_idx() == 0)\r\n          {\r\n            typedef struct RangeNode RangeNode;\r\n            struct RangeNode\r\n            {\r\n              RangeNode *next;\r\n              Rng1U64 voff_range;\r\n              U64 idx;\r\n            };\r\n            RDI_VMapEntry *vmap_ptr = vmap;\r\n            RDI_VMapEntry *vmap_opl = vmap + vmap_count__cap;\r\n            RangeNode *top_range = 0;\r\n            RangeNode *free_range = 0;\r\n            U64 last_recorded_voff = 0;\r\n            for(U64 record_idx = 0; record_idx <= records_count; record_idx += 1)\r\n            {\r\n              // rjf: get next voff range and index\r\n              Rng1U64 voff_range = r1u64(max_U64, max_U64);\r\n              U64 idx = 0;\r\n              if(record_idx < records_count)\r\n              {\r\n                VMapRecord *record = &records[record_idx];\r\n                voff_range = r1u64(record->key.voff, record->key.voff + -record->key.negative_size);\r\n                idx = (U64)record->idx;\r\n              }\r\n              \r\n              // rjf: pop nodes we've advanced past\r\n              {\r\n                for(RangeNode *n = top_range, *next = 0; n != 0; n = next)\r\n                {\r\n                  next = n->next;\r\n                  if(n->voff_range.max <= voff_range.min)\r\n                  {\r\n                    SLLStackPop(top_range);\r\n                    SLLStackPush(free_range, n);\r\n                    if(n->voff_range.max != last_recorded_voff)\r\n                    {\r\n                      vmap_ptr += 1;\r\n                    }\r\n                    vmap_ptr->voff = n->voff_range.max;\r\n                    vmap_ptr->idx = next ? next->idx : 0;\r\n                    last_recorded_voff = vmap_ptr->voff;\r\n                  }\r\n                  else\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: push this node\r\n              if(record_idx < records_count)\r\n              {\r\n                RangeNode *r = free_range;\r\n                if(r)\r\n                {\r\n                  SLLStackPop(free_range);\r\n                }\r\n                else\r\n                {\r\n                  r = push_array(scratch.arena, RangeNode, 1);\r\n                }\r\n                SLLStackPush(top_range, r);\r\n                r->voff_range = voff_range;\r\n                r->idx = idx;\r\n                if(voff_range.min != last_recorded_voff || (vmap_ptr->idx != idx && vmap_ptr->idx != 0))\r\n                {\r\n                  vmap_ptr += 1;\r\n                }\r\n                vmap_ptr->voff = voff_range.min;\r\n                vmap_ptr->idx = idx;\r\n                last_recorded_voff = voff_range.min;\r\n              }\r\n            }\r\n            if(last_recorded_voff != 0)\r\n            {\r\n              vmap_ptr += 1;\r\n            }\r\n            vmap_count = (vmap_ptr - vmap);\r\n          }\r\n          lane_sync_u64(&vmap_count, 0);\r\n        }\r\n        lane_sync();\r\n        \r\n        ////////////////////////\r\n        //- rjf: store\r\n        //\r\n        if(lane_idx() == 0)\r\n        {\r\n          vmap_tasks[vmap_task_idx].vmap_out[0] = vmap;\r\n          vmap_tasks[vmap_task_idx].vmap_count_out[0] = vmap_count;\r\n        }\r\n      }\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage build interned path tree\r\n  //\r\n  if(lane_idx() == 0) ProfScope(\"build interned path tree\")\r\n  {\r\n    //- rjf: set up tree\r\n    RDIM_BakePathTree *tree = rdim_push_array(arena, RDIM_BakePathTree, 1);\r\n    rdim_bake_path_tree_insert(arena, tree, rdim_str8_lit(\"<nil>\"));\r\n    \r\n    //- rjf: bake unit file paths\r\n    RDIM_ProfScope(\"bake unit file paths\")\r\n    {\r\n      for(RDIM_UnitChunkNode *n = params->units.first; n != 0; n = n->next)\r\n      {\r\n        for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n        {\r\n          rdim_bake_path_tree_insert(arena, tree, n->v[idx].source_file);\r\n          rdim_bake_path_tree_insert(arena, tree, n->v[idx].object_file);\r\n          rdim_bake_path_tree_insert(arena, tree, n->v[idx].archive_file);\r\n          rdim_bake_path_tree_insert(arena, tree, n->v[idx].build_path);\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: bake source file paths\r\n    RDIM_ProfScope(\"bake source file paths\")\r\n    {\r\n      for(RDIM_SrcFileChunkNode *n = params->src_files.first; n != 0; n = n->next)\r\n      {\r\n        for(RDI_U64 idx = 0; idx < n->count; idx += 1)\r\n        {\r\n          RDIM_BakePathNode *node = rdim_bake_path_tree_insert(arena, tree, n->v[idx].path);\r\n          node->src_file = &n->v[idx];\r\n        }\r\n      }\r\n    }\r\n    \r\n    rdim_shared->path_tree = tree;\r\n  }\r\n  lane_sync();\r\n  RDIM_BakePathTree *path_tree = rdim_shared->path_tree;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage gather all unsorted, joined, line table info; & sort\r\n  //\r\n  ProfScope(\"gather all unsorted, joined, line table info; & sort\")\r\n  {\r\n    //- rjf: set up outputs\r\n    ProfScope(\"set up outputs\")\r\n    {\r\n      // rjf: calculate header info\r\n      if(lane_idx() == 0)\r\n      {\r\n        rdim_shared->line_tables_count = params->line_tables.total_count;\r\n        rdim_shared->src_line_tables = push_array(arena, RDIM_LineTable *, rdim_shared->line_tables_count);\r\n        ProfScope(\"flatten chunk list\")\r\n        {\r\n          U64 joined_idx = 0;\r\n          for(RDIM_LineTableChunkNode *n = params->line_tables.first; n != 0; n = n->next)\r\n          {\r\n            for EachIndex(idx, n->count)\r\n            {\r\n              rdim_shared->src_line_tables[joined_idx] = &n->v[idx];\r\n              joined_idx += 1;\r\n            }\r\n          }\r\n        }\r\n        rdim_shared->baked_line_tables.line_tables_count       = params->line_tables.total_count + 1;\r\n        rdim_shared->baked_line_tables.line_table_voffs_count  = params->line_tables.total_line_count + 2*params->line_tables.total_seq_count;\r\n        rdim_shared->baked_line_tables.line_table_lines_count  = params->line_tables.total_line_count + params->line_tables.total_seq_count;\r\n        rdim_shared->baked_line_tables.line_table_columns_count= 1;\r\n        rdim_shared->line_table_block_take_counter = 0;\r\n      }\r\n      lane_sync();\r\n      \r\n      // rjf: allocate outputs\r\n      ProfScope(\"allocate outputs\")\r\n      {\r\n        if(lane_idx() == lane_from_task_idx(0))\r\n        {\r\n          rdim_shared->unsorted_joined_line_tables = push_array(arena, RDIM_UnsortedJoinedLineTable, rdim_shared->line_tables_count);\r\n        }\r\n        if(lane_idx() == lane_from_task_idx(1))\r\n        {\r\n          rdim_shared->sorted_line_table_keys = push_array(arena, RDIM_SortKey *, rdim_shared->line_tables_count);\r\n        }\r\n        if(lane_idx() == lane_from_task_idx(2))\r\n        {\r\n          rdim_shared->baked_line_tables.line_tables = push_array(arena, RDI_LineTable, rdim_shared->baked_line_tables.line_tables_count);\r\n          ProfScope(\"lay out line tables\")\r\n          {\r\n            U64 voffs_base_idx = 0;\r\n            U64 lines_base_idx = 0;\r\n            U64 cols_base_idx = 0;\r\n            for EachIndex(idx, rdim_shared->line_tables_count)\r\n            {\r\n              U64 final_idx = idx+1; // NOTE(rjf): +1, to reserve [0] for nil\r\n              RDIM_LineTable *src = rdim_shared->src_line_tables[idx];\r\n              RDI_LineTable *dst = &rdim_shared->baked_line_tables.line_tables[final_idx];\r\n              dst->voffs_base_idx = voffs_base_idx; // TODO(rjf): @u64_to_u32\r\n              dst->lines_base_idx = lines_base_idx; // TODO(rjf): @u64_to_u32\r\n              dst->cols_base_idx  = cols_base_idx; // TODO(rjf): @u64_to_u32\r\n              dst->lines_count    = src->line_count + src->seq_count; // TODO(rjf): @u64_to_u32\r\n              voffs_base_idx += src->line_count + 2*src->seq_count;\r\n              lines_base_idx += src->line_count + 1*src->seq_count;\r\n            }\r\n          }\r\n        }\r\n        if(lane_idx() == lane_from_task_idx(3))\r\n        {\r\n          rdim_shared->baked_line_tables.line_table_voffs   = push_array(arena, RDI_U64,       rdim_shared->baked_line_tables.line_table_voffs_count);\r\n        }\r\n        if(lane_idx() == lane_from_task_idx(4))\r\n        {\r\n          rdim_shared->baked_line_tables.line_table_lines   = push_array(arena, RDI_Line,      rdim_shared->baked_line_tables.line_table_lines_count);\r\n        }\r\n        if(lane_idx() == lane_from_task_idx(5))\r\n        {\r\n          rdim_shared->baked_line_tables.line_table_columns = push_array(arena, RDI_Column,    rdim_shared->baked_line_tables.line_table_columns_count);\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: wide bake\r\n    ProfScope(\"wide bake\") \r\n    {\r\n      U64 line_table_block_size = 4096;\r\n      U64 line_table_block_count = (rdim_shared->line_tables_count + line_table_block_size - 1) / line_table_block_size;\r\n      for(;;)\r\n      {\r\n        U64 line_table_block_num = ins_atomic_u64_inc_eval(&rdim_shared->line_table_block_take_counter);\r\n        if(0 == line_table_block_num || line_table_block_count < line_table_block_num)\r\n        {\r\n          break;\r\n        }\r\n        U64 line_table_block_idx = line_table_block_num-1;\r\n        Rng1U64 line_table_range = r1u64(line_table_block_idx*line_table_block_size, (line_table_block_idx+1)*line_table_block_size);\r\n        line_table_range.max = Min(rdim_shared->line_tables_count, line_table_range.max);\r\n        for EachInRange(line_table_idx, line_table_range)\r\n        {\r\n          RDIM_LineTable *src = rdim_shared->src_line_tables[line_table_idx];\r\n          RDIM_UnsortedJoinedLineTable *dst = &rdim_shared->unsorted_joined_line_tables[line_table_idx];\r\n          \r\n          //- rjf: gather\r\n          dst->line_count = src->line_count;\r\n          dst->seq_count = src->seq_count;\r\n          dst->key_count = dst->line_count + dst->seq_count;\r\n          dst->line_keys = rdim_push_array_no_zero(arena, RDIM_SortKey, dst->key_count);\r\n          dst->line_recs = rdim_push_array_no_zero(arena, RDIM_LineRec, dst->line_count);\r\n          {\r\n            RDIM_SortKey *key_ptr = dst->line_keys;\r\n            RDIM_LineRec *rec_ptr = dst->line_recs;\r\n            for(RDIM_LineSequenceNode *seq_n = src->first_seq; seq_n != 0; seq_n = seq_n->next)\r\n            {\r\n              RDIM_LineSequence *seq = &seq_n->v;\r\n              for(RDI_U64 line_idx = 0; line_idx < seq->line_count; line_idx += 1)\r\n              {\r\n                key_ptr->key = seq->voffs[line_idx];\r\n                key_ptr->val = rec_ptr;\r\n                key_ptr += 1;\r\n                rec_ptr->file_id = (RDI_U32)rdim_idx_from_src_file(seq->src_file); // TODO(rjf): @u64_to_u32\r\n                rec_ptr->line_num = seq->line_nums[line_idx];\r\n                if(seq->col_nums != 0)\r\n                {\r\n                  rec_ptr->col_first = seq->col_nums[line_idx*2];\r\n                  rec_ptr->col_opl = seq->col_nums[line_idx*2 + 1];\r\n                }\r\n                rec_ptr += 1;\r\n              }\r\n              key_ptr->key = seq->voffs[seq->line_count];\r\n              key_ptr->val = 0;\r\n              key_ptr += 1;\r\n            }\r\n          }\r\n          \r\n          //- rjf: sort\r\n          rdim_shared->sorted_line_table_keys[line_table_idx] = rdim_sort_key_array(arena,\r\n                                                                                    rdim_shared->unsorted_joined_line_tables[line_table_idx].line_keys,\r\n                                                                                    rdim_shared->unsorted_joined_line_tables[line_table_idx].key_count);\r\n          \r\n          //- rjf: fill\r\n          RDIM_SortKey *sorted_line_keys = rdim_shared->sorted_line_table_keys[line_table_idx];\r\n          U64 sorted_line_keys_count = rdim_shared->unsorted_joined_line_tables[line_table_idx].key_count;\r\n          RDI_LineTable *dst_line_table = &rdim_shared->baked_line_tables.line_tables[line_table_idx+1];\r\n          U64 *arranged_voffs           = rdim_shared->baked_line_tables.line_table_voffs   + dst_line_table->voffs_base_idx;\r\n          RDI_Line *arranged_lines      = rdim_shared->baked_line_tables.line_table_lines   + dst_line_table->lines_base_idx;\r\n          RDI_Column *arranged_cols     = rdim_shared->baked_line_tables.line_table_columns + dst_line_table->cols_base_idx;\r\n          {\r\n            for EachIndex(idx, sorted_line_keys_count)\r\n            {\r\n              arranged_voffs[idx] = sorted_line_keys[idx].key;\r\n            }\r\n            arranged_voffs[sorted_line_keys_count] = ~0ull;\r\n            for EachIndex(idx, sorted_line_keys_count)\r\n            {\r\n              RDIM_LineRec *rec = (RDIM_LineRec*)sorted_line_keys[idx].val;\r\n              if(rec != 0)\r\n              {\r\n                arranged_lines[idx].file_idx = rec->file_id;\r\n                arranged_lines[idx].line_num = rec->line_num;\r\n              }\r\n              else\r\n              {\r\n                arranged_lines[idx].file_idx = 0;\r\n                arranged_lines[idx].line_num = 0;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  RDI_U64 line_tables_count = rdim_shared->line_tables_count;\r\n  RDIM_LineTable **src_line_tables = rdim_shared->src_line_tables;\r\n  RDIM_UnsortedJoinedLineTable *unsorted_joined_line_tables = rdim_shared->unsorted_joined_line_tables;\r\n  RDIM_SortKey **sorted_line_table_keys = rdim_shared->sorted_line_table_keys;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage build string map\r\n  //\r\n  ProfScope(\"build string map\")\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: set up per-lane outputs\r\n    RDIM_BakeStringMapTopology *top = 0;\r\n    RDIM_BakeStringMapLoose **lane_maps__loose = 0;\r\n    RDIM_BakeStringMapLoose *map__loose = 0;\r\n    if(lane_idx() == 0) ProfScope(\"set up per-lane outputs\")\r\n    {\r\n      top = push_array(scratch.arena, RDIM_BakeStringMapTopology, 1);\r\n      top->slots_count = (64 +\r\n                          params->procedures.total_count*1 +\r\n                          params->global_variables.total_count*1 +\r\n                          params->thread_variables.total_count*1 +\r\n                          params->types.total_count/2);\r\n      lane_maps__loose = push_array(scratch.arena, RDIM_BakeStringMapLoose *, lane_count());\r\n      map__loose = rdim_bake_string_map_loose_make(scratch.arena, top);\r\n    }\r\n    lane_sync_u64(&top, 0);\r\n    lane_sync_u64(&lane_maps__loose, 0);\r\n    lane_sync_u64(&map__loose, 0);\r\n    \r\n    //- rjf: set up this lane's map\r\n    ProfScope(\"set up this lane's map\")\r\n    {\r\n      lane_maps__loose[lane_idx()] = rdim_bake_string_map_loose_make(scratch.arena, top);\r\n    }\r\n    RDIM_BakeStringMapLoose *lane_map = lane_maps__loose[lane_idx()];\r\n    \r\n    //- rjf: push all strings into this lane's map\r\n    ProfScope(\"push all strings into this lane's map\")\r\n    {\r\n      // rjf: push small top-level strings\r\n      if(lane_idx() == 0) ProfScope(\"push small top-level strings\")\r\n      {\r\n        rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, params->top_level_info.exe_name);\r\n        rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, params->top_level_info.producer_name);\r\n        for(RDIM_BinarySectionNode *n = params->binary_sections.first; n != 0; n = n->next)\r\n        {\r\n          rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, n->v.name);\r\n        }\r\n        for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order)\r\n        {\r\n          rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, n->name);\r\n        }\r\n      }\r\n      \r\n      // rjf: push strings from source files\r\n      ProfScope(\"src files\")\r\n      {\r\n        for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            RDIM_String8 normalized_path = rdim_lower_from_str8(arena, n->v[n_idx].path);\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 1, normalized_path);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push strings from units\r\n      ProfScope(\"units\")\r\n      {\r\n        for EachNode(n, RDIM_UnitChunkNode, params->units.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].unit_name);\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].compiler_name);\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].source_file);\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].object_file);\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].archive_file);\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].build_path);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push strings from types\r\n      ProfScope(\"types\")\r\n      {\r\n        for EachNode(n, RDIM_TypeChunkNode, params->types.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name);\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push strings from udts\r\n      ProfScope(\"udts\")\r\n      {\r\n        for EachNode(n, RDIM_UDTChunkNode, params->udts.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(idx, range)\r\n          {\r\n            for EachNode(mem, RDIM_UDTMember, n->v[idx].first_member)\r\n            {\r\n              rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, mem->name);\r\n            }\r\n            for EachNode(enum_val, RDIM_UDTEnumVal, n->v[idx].first_enum_val)\r\n            {\r\n              rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, enum_val->name);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: push strings from symbols\r\n      RDIM_SymbolChunkList *symbol_lists[] =\r\n      {\r\n        &params->global_variables,\r\n        &params->thread_variables,\r\n        &params->procedures,\r\n        &params->constants,\r\n      };\r\n      ProfScope(\"symbols\")\r\n      {\r\n        for EachElement(list_idx, symbol_lists)\r\n        {\r\n          for EachNode(n, RDIM_SymbolChunkNode, symbol_lists[list_idx]->first)\r\n          {\r\n            Rng1U64 range = lane_range(n->count);\r\n            for EachInRange(n_idx, range)\r\n            {\r\n              rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name);\r\n              rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].link_name);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: push strings from inline sites\r\n      ProfScope(\"inline sites\")\r\n      {\r\n        for EachNode(n, RDIM_InlineSiteChunkNode, params->inline_sites.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, n->v[n_idx].name);\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: push strings from scopes\r\n      ProfScope(\"scopes\")\r\n      {\r\n        for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          for EachInRange(n_idx, range)\r\n          {\r\n            for EachNode(local, RDIM_Local, n->v[n_idx].first_local)\r\n            {\r\n              rdim_bake_string_map_loose_insert(arena, top, lane_map, 4, local->name);\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: join\r\n    ProfScope(\"join\")\r\n    {\r\n      Rng1U64 slot_range = lane_range(top->slots_count);\r\n      for EachInRange(slot_idx, slot_range)\r\n      {\r\n        for EachIndex(src_lane_idx, lane_count())\r\n        {\r\n          RDIM_BakeStringMapLoose *src_map = lane_maps__loose[src_lane_idx];\r\n          RDIM_BakeStringMapLoose *dst_map = map__loose;\r\n          if(dst_map->slots[slot_idx] == 0 && src_map->slots[slot_idx] != 0)\r\n          {\r\n            dst_map->slots[slot_idx] = src_map->slots[slot_idx];\r\n          }\r\n          else if(dst_map->slots[slot_idx] != 0 && src_map->slots[slot_idx] != 0)\r\n          {\r\n            rdim_bake_string_chunk_list_concat_in_place(dst_map->slots[slot_idx], src_map->slots[slot_idx]);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: sort\r\n    ProfScope(\"sort\")\r\n    {\r\n      RDIM_BakeStringMapLoose *map = map__loose;\r\n      Rng1U64 slot_range = lane_range(top->slots_count);\r\n      for EachInRange(slot_idx, slot_range)\r\n      {\r\n        if(map->slots[slot_idx] != 0)\r\n        {\r\n          *map->slots[slot_idx] = rdim_bake_string_chunk_list_sorted_from_unsorted(arena, map->slots[slot_idx]);\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: tighten string table\r\n    ProfScope(\"tighten string table\")\r\n    {\r\n      RDIM_BakeStringMapLoose *map = map__loose;\r\n      if(lane_idx() == 0) ProfScope(\"calc base indices, set up tight map\")\r\n      {\r\n        RDIM_BakeStringMapBaseIndices bake_string_map_base_indices = rdim_bake_string_map_base_indices_from_map_loose(arena, top, map);\r\n        rdim_shared->bake_strings.slots_count = top->slots_count;\r\n        rdim_shared->bake_strings.slots = rdim_push_array(arena, RDIM_BakeStringChunkList, rdim_shared->bake_strings.slots_count);\r\n        rdim_shared->bake_strings.slots_base_idxs = bake_string_map_base_indices.slots_base_idxs;\r\n        rdim_shared->bake_strings.total_count = rdim_shared->bake_strings.slots_base_idxs[rdim_shared->bake_strings.slots_count];\r\n      }\r\n      lane_sync();\r\n      ProfScope(\"fill tight map\")\r\n      {\r\n        Rng1U64 slot_range = lane_range(rdim_shared->bake_strings.slots_count);\r\n        for EachInRange(idx, slot_range)\r\n        {\r\n          if(map->slots[idx] != 0)\r\n          {\r\n            rdim_memcpy_struct(&rdim_shared->bake_strings.slots[idx], map->slots[idx]);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  lane_sync();\r\n  RDIM_BakeStringMapTight *bake_strings = &rdim_shared->bake_strings;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage build name maps\r\n  //\r\n  B32 name_maps_need_build[RDI_NameMapKind_COUNT] = {0};\r\n  {\r\n    name_maps_need_build[RDI_NameMapKind_GlobalVariables]    = !!(params->subset_flags & RDIM_SubsetFlag_GlobalVariableNameMap);\r\n    name_maps_need_build[RDI_NameMapKind_ThreadVariables]    = !!(params->subset_flags & RDIM_SubsetFlag_ThreadVariableNameMap);\r\n    name_maps_need_build[RDI_NameMapKind_Constants]          = !!(params->subset_flags & RDIM_SubsetFlag_ConstantNameMap);\r\n    name_maps_need_build[RDI_NameMapKind_Procedures]         = !!(params->subset_flags & RDIM_SubsetFlag_ProcedureNameMap);\r\n    name_maps_need_build[RDI_NameMapKind_Types]              = !!(params->subset_flags & RDIM_SubsetFlag_TypeNameMap);\r\n    name_maps_need_build[RDI_NameMapKind_LinkNameProcedures] = !!(params->subset_flags & RDIM_SubsetFlag_LinkNameProcedureNameMap);\r\n    name_maps_need_build[RDI_NameMapKind_NormalSourcePaths]  = !!(params->subset_flags & RDIM_SubsetFlag_NormalSourcePathNameMap);\r\n  }\r\n  RDIM_BakeNameMapTopology *bake_name_maps_tops = 0;\r\n  RDIM_BakeNameMap **bake_name_maps = 0;\r\n  ProfScope(\"build name maps\")\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: set up\r\n    RDIM_BakeNameMap ***lane_maps = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      bake_name_maps_tops = push_array(arena, RDIM_BakeNameMapTopology, RDI_NameMapKind_COUNT);\r\n      bake_name_maps = push_array(arena, RDIM_BakeNameMap *, RDI_NameMapKind_COUNT);\r\n      lane_maps = push_array(scratch.arena, RDIM_BakeNameMap **, RDI_NameMapKind_COUNT);\r\n      for EachNonZeroEnumVal(RDI_NameMapKind, k)\r\n      {\r\n        U64 slot_count = 0;\r\n        switch((RDI_NameMapKindEnum)k)\r\n        {\r\n          case RDI_NameMapKind_NULL:\r\n          case RDI_NameMapKind_COUNT:\r\n          {}break;\r\n#define Case(name, total_count) case RDI_NameMapKind_##name:{slot_count = ((total_count) + (total_count)/4);}break\r\n          Case(GlobalVariables, params->global_variables.total_count);\r\n          Case(ThreadVariables, params->thread_variables.total_count);\r\n          Case(Constants, params->constants.total_count);\r\n          Case(Procedures, params->procedures.total_count);\r\n          Case(LinkNameProcedures, params->procedures.total_count);\r\n          Case(Types, params->types.total_count);\r\n          Case(NormalSourcePaths, params->src_files.total_count);\r\n#undef Case\r\n        }\r\n        lane_maps[k] = push_array(arena, RDIM_BakeNameMap *, lane_count());\r\n        bake_name_maps_tops[k].slots_count = slot_count;\r\n      }\r\n    }\r\n    lane_sync_u64(&bake_name_maps_tops, 0);\r\n    lane_sync_u64(&bake_name_maps, 0);\r\n    lane_sync_u64(&lane_maps, 0);\r\n    \r\n    //- rjf: wide build\r\n    for EachNonZeroEnumVal(RDI_NameMapKind, k) ProfScope(\"name map build %.*s\", str8_varg(rdi_string_from_name_map_kind(k)))\r\n    {\r\n      if(!name_maps_need_build[k]) { continue; }\r\n      RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k];\r\n      lane_maps[k][lane_idx()] = rdim_bake_name_map_make(scratch.arena, top);\r\n      RDIM_BakeNameMap *map = lane_maps[k][lane_idx()];\r\n      B32 link_names = 0;\r\n      RDIM_SymbolChunkList *symbols = 0;\r\n      switch((RDI_NameMapKindEnum)k)\r\n      {\r\n        case RDI_NameMapKind_NULL:\r\n        case RDI_NameMapKind_COUNT:\r\n        {}break;\r\n        case RDI_NameMapKind_GlobalVariables:   {symbols = &params->global_variables;}goto symbol_name_map_build;\r\n        case RDI_NameMapKind_ThreadVariables:   {symbols = &params->thread_variables;}goto symbol_name_map_build;\r\n        case RDI_NameMapKind_Constants:         {symbols = &params->constants;}goto symbol_name_map_build;\r\n        case RDI_NameMapKind_Procedures:        {symbols = &params->procedures;}goto symbol_name_map_build;\r\n        case RDI_NameMapKind_LinkNameProcedures:{symbols = &params->procedures; link_names = 1;}goto symbol_name_map_build;\r\n        symbol_name_map_build:;\r\n        {\r\n          for EachNode(n, RDIM_SymbolChunkNode, symbols->first)\r\n          {\r\n            Rng1U64 n_range = lane_range(n->count);\r\n            for EachInRange(n_idx, n_range)\r\n            {\r\n              RDIM_Symbol *symbol = &n->v[n_idx];\r\n              rdim_bake_name_map_insert(scratch.arena, top, map, 4, link_names ? symbol->link_name : symbol->name, rdim_idx_from_symbol(symbol));\r\n            }\r\n          }\r\n        }break;\r\n        case RDI_NameMapKind_Types:\r\n        {\r\n          RDIM_TypeChunkList *types = &params->types;\r\n          for EachNode(n, RDIM_TypeChunkNode, types->first)\r\n          {\r\n            Rng1U64 n_range = lane_range(n->count);\r\n            for EachInRange(n_idx, n_range)\r\n            {\r\n              RDIM_Type *type = &n->v[n_idx];\r\n              rdim_bake_name_map_insert(scratch.arena, top, map, 4, type->name, rdim_idx_from_type(type));\r\n            }\r\n          }\r\n        }break;\r\n        case RDI_NameMapKind_NormalSourcePaths:\r\n        {\r\n          RDIM_SrcFileChunkList *src_files = &params->src_files;\r\n          for EachNode(n, RDIM_SrcFileChunkNode, src_files->first)\r\n          {\r\n            Rng1U64 n_range = lane_range(n->count);\r\n            for EachInRange(n_idx, n_range)\r\n            {\r\n              RDIM_SrcFile *src_file = &n->v[n_idx];\r\n              RDIM_String8 normalized_path = rdim_lower_from_str8(arena, src_file->path);\r\n              rdim_bake_name_map_insert(scratch.arena, top, map, 4, normalized_path, rdim_idx_from_src_file(src_file));\r\n            }\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: join & sort\r\n    if(lane_idx() == 0)\r\n    {\r\n      for EachNonZeroEnumVal(RDI_NameMapKind, k)\r\n      {\r\n        if(!name_maps_need_build[k]) { continue; }\r\n        bake_name_maps[k] = rdim_bake_name_map_make(arena, &bake_name_maps_tops[k]);\r\n      }\r\n    }\r\n    lane_sync();\r\n    for EachNonZeroEnumVal(RDI_NameMapKind, k) ProfScope(\"name map join & sort %.*s\", str8_varg(rdi_string_from_name_map_kind(k)))\r\n    {\r\n      if(!name_maps_need_build[k]) { continue; }\r\n      RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k];\r\n      RDIM_BakeNameMap *map = bake_name_maps[k];\r\n      \r\n      //- rjf: join\r\n      ProfScope(\"join\")\r\n      {\r\n        Rng1U64 slot_range = lane_range(top->slots_count);\r\n        for EachInRange(slot_idx, slot_range)\r\n        {\r\n          for EachIndex(src_lane_idx, lane_count())\r\n          {\r\n            RDIM_BakeNameMap *src_map = lane_maps[k][src_lane_idx];\r\n            RDIM_BakeNameMap *dst_map = map;\r\n            if(dst_map->slots[slot_idx] == 0 && src_map->slots[slot_idx] != 0)\r\n            {\r\n              dst_map->slots[slot_idx] = src_map->slots[slot_idx];\r\n            }\r\n            else if(dst_map->slots[slot_idx] != 0 && src_map->slots[slot_idx] != 0)\r\n            {\r\n              rdim_bake_name_chunk_list_concat_in_place(dst_map->slots[slot_idx], src_map->slots[slot_idx]);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: sort\r\n      ProfScope(\"sort\")\r\n      {\r\n        Rng1U64 slot_range = lane_range(top->slots_count);\r\n        for EachInRange(slot_idx, slot_range)\r\n        {\r\n          if(map->slots[slot_idx] != 0)\r\n          {\r\n            RDIM_BakeNameChunkList *scratch_og_unsorted = map->slots[slot_idx];\r\n            map->slots[slot_idx] = push_array(arena, RDIM_BakeNameChunkList, 1);\r\n            *map->slots[slot_idx] = rdim_bake_name_chunk_list_sorted_from_unsorted(arena, scratch_og_unsorted);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage build index runs\r\n  //\r\n  B32 need_index_runs = (!!(params->subset_flags & RDIM_SubsetFlag_NameMaps) ||\r\n                         !!(params->subset_flags & RDIM_SubsetFlag_Types));\r\n  if(need_index_runs) ProfScope(\"build index runs\")\r\n  {\r\n    Temp scratch = scratch_begin(&arena, 1);\r\n    \r\n    //- rjf: set up per-lane outputs\r\n    RDIM_BakeIdxRunMapTopology *top = 0;\r\n    RDIM_BakeIdxRunMapLoose **lane_maps__loose = 0;\r\n    RDIM_BakeIdxRunMapLoose *map__loose = 0;\r\n    if(lane_idx() == 0) ProfScope(\"set up per-lane outputs\")\r\n    {\r\n      top = push_array(scratch.arena, RDIM_BakeIdxRunMapTopology, 1);\r\n      top->slots_count = 64 + ((params->procedures.total_count +\r\n                                params->global_variables.total_count +\r\n                                params->thread_variables.total_count +\r\n                                params->udts.total_count) * 3) / 4;\r\n      lane_maps__loose = push_array(scratch.arena, RDIM_BakeIdxRunMapLoose *, lane_count());\r\n      map__loose = rdim_bake_idx_run_map_loose_make(scratch.arena, top);\r\n    }\r\n    lane_sync_u64(&top, 0);\r\n    lane_sync_u64(&lane_maps__loose, 0);\r\n    lane_sync_u64(&map__loose, 0);\r\n    \r\n    //- rjf: set up this lane's map\r\n    ProfScope(\"set up this lane's map\")\r\n    {\r\n      lane_maps__loose[lane_idx()] = rdim_bake_idx_run_map_loose_make(scratch.arena, top);\r\n    }\r\n    RDIM_BakeIdxRunMapLoose *lane_map = lane_maps__loose[lane_idx()];\r\n    \r\n    //- rjf: wide fill of all index runs\r\n    ProfScope(\"fill all lane index run maps\")\r\n    {\r\n      //- rjf: bake runs of function-type parameter lists\r\n      ProfScope(\"bake runs of function-type parameter lists\")\r\n      {\r\n        for EachNode(n, RDIM_TypeChunkNode, params->types.first)\r\n        {\r\n          Rng1U64 range = lane_range(n->count);\r\n          ProfScope(\"[%I64u, %I64u)\", range.min, range.max) for EachInRange(n_idx, range)\r\n          {\r\n            RDIM_Type *type = &n->v[n_idx];\r\n            if(type->count == 0)\r\n            {\r\n              continue;\r\n            }\r\n            if(type->kind == RDI_TypeKind_Function || type->kind == RDI_TypeKind_Method)\r\n            {\r\n              RDI_U32 param_idx_run_count = type->count;\r\n              RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count);\r\n              for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1)\r\n              {\r\n                param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(type->param_types[idx]); // TODO(rjf): @u64_to_u32\r\n              }\r\n              rdim_bake_idx_run_map_loose_insert(scratch.arena, top, lane_map, 4, param_idx_run, param_idx_run_count);\r\n            }\r\n          }\r\n        }\r\n      }\r\n      \r\n      //- rjf: bake runs of name map match lists\r\n      for EachNonZeroEnumVal(RDI_NameMapKind, k) ProfScope(\"bake runs of name map match lists (%.*s)\", str8_varg(rdi_string_from_name_map_kind(k)))\r\n      {\r\n        if(!name_maps_need_build[k]) { continue; }\r\n        RDIM_BakeNameMapTopology *name_map_top = &bake_name_maps_tops[k];\r\n        RDIM_BakeNameMap *name_map = bake_name_maps[k];\r\n        Rng1U64 slot_idx_range = lane_range(name_map_top->slots_count);\r\n        for EachInRange(slot_idx, slot_idx_range)\r\n        {\r\n          RDIM_BakeNameChunkList *slot = name_map->slots[slot_idx];\r\n          if(slot != 0)\r\n          {\r\n            typedef struct IdxRunNode IdxRunNode;\r\n            struct IdxRunNode\r\n            {\r\n              IdxRunNode *next;\r\n              RDI_U64 idx;\r\n            };\r\n            IdxRunNode *first_idx_run_node = 0;\r\n            IdxRunNode *last_idx_run_node = 0;\r\n            U64 active_idx_count = 0;\r\n            String8 active_string = {0};\r\n            RDIM_BakeNameChunkNode *n = slot->first;\r\n            U64 n_idx = 0;\r\n            for(;;)\r\n            {\r\n              // rjf: advance chunk\r\n              if(n != 0 && n_idx >= n->count)\r\n              {\r\n                n = n->next;\r\n                n_idx = 0;\r\n              }\r\n              \r\n              // rjf: grab next element\r\n              String8 string = {0};\r\n              U64 idx = 0;\r\n              if(n != 0)\r\n              {\r\n                string = n->v[n_idx].string;\r\n                idx  = n->v[n_idx].idx;\r\n              }\r\n              \r\n              // rjf: next element hash doesn't match the active? -> push index run, clear active list, start new list\r\n              if(!str8_match(string, active_string, 0))\r\n              {\r\n                if(active_idx_count > 1)\r\n                {\r\n                  RDI_U64 idxs_count = active_idx_count;\r\n                  RDI_U32 *idxs = rdim_push_array(arena, RDI_U32, idxs_count);\r\n                  {\r\n                    U64 write_idx = 0;\r\n                    for EachNode(idx_run_n, IdxRunNode, first_idx_run_node)\r\n                    {\r\n                      idxs[write_idx] = (RDI_U32)idx_run_n->idx; // TODO(rjf): @u64_to_u32\r\n                      write_idx += 1;\r\n                    }\r\n                  }\r\n                  rdim_bake_idx_run_map_loose_insert(scratch.arena, top, lane_map, 4, idxs, idxs_count);\r\n                }\r\n                active_string = string;\r\n                first_idx_run_node = 0;\r\n                last_idx_run_node = 0;\r\n                active_idx_count = 0;\r\n              }\r\n              \r\n              // rjf: new element matches the active list -> push\r\n              if(active_string.size != 0 && str8_match(string, active_string, 0))\r\n              {\r\n                IdxRunNode *idx_run_n = push_array(scratch.arena, IdxRunNode, 1);\r\n                idx_run_n->idx = idx;\r\n                SLLQueuePush(first_idx_run_node, last_idx_run_node, idx_run_n);\r\n                active_idx_count += 1;\r\n              }\r\n              \r\n              // rjf: advance index\r\n              n_idx += 1;\r\n              \r\n              // rjf: end on zero node\r\n              if(n == 0)\r\n              {\r\n                break;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: join\r\n    ProfScope(\"join\")\r\n    {\r\n      Rng1U64 slot_range = lane_range(top->slots_count);\r\n      for EachInRange(slot_idx, slot_range)\r\n      {\r\n        for EachIndex(src_lane_idx, lane_count())\r\n        {\r\n          RDIM_BakeIdxRunMapLoose *src_map = lane_maps__loose[src_lane_idx];\r\n          RDIM_BakeIdxRunMapLoose *dst_map = map__loose;\r\n          dst_map->slots_idx_counts[slot_idx] += src_map->slots_idx_counts[slot_idx];\r\n          if(dst_map->slots[slot_idx] == 0 && src_map->slots[slot_idx] != 0)\r\n          {\r\n            dst_map->slots[slot_idx] = src_map->slots[slot_idx];\r\n          }\r\n          else if(dst_map->slots[slot_idx] != 0 && src_map->slots[slot_idx] != 0)\r\n          {\r\n            rdim_bake_idx_run_chunk_list_concat_in_place(dst_map->slots[slot_idx], src_map->slots[slot_idx]);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: sort\r\n    ProfScope(\"sort\")\r\n    {\r\n      RDIM_BakeIdxRunMapLoose *map = map__loose;\r\n      Rng1U64 slot_range = lane_range(top->slots_count);\r\n      for EachInRange(slot_idx, slot_range)\r\n      {\r\n        if(map->slots[slot_idx] != 0)\r\n        {\r\n          *map->slots[slot_idx] = rdim_bake_idx_run_chunk_list_sorted_from_unsorted(arena, map->slots[slot_idx]);\r\n          map->slots_idx_counts[slot_idx] = 0;\r\n          for EachNode(n, RDIM_BakeIdxRunChunkNode, map->slots[slot_idx]->first)\r\n          {\r\n            for EachIndex(idx, n->count)\r\n            {\r\n              map->slots_idx_counts[slot_idx] += n->v[idx].count;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: tighten idx run table\r\n    ProfScope(\"tighten idx run table\")\r\n    {\r\n      RDIM_BakeIdxRunMapLoose *map = map__loose;\r\n      if(lane_idx() == 0) ProfScope(\"calc base indices, set up tight map\")\r\n      {\r\n        rdim_shared->bake_idx_runs.slots_count = top->slots_count;\r\n        rdim_shared->bake_idx_runs.slots = rdim_push_array(arena, RDIM_BakeIdxRunChunkList, rdim_shared->bake_idx_runs.slots_count);\r\n        rdim_shared->bake_idx_runs.slots_base_idxs = rdim_push_array(arena, RDI_U64, rdim_shared->bake_idx_runs.slots_count+1);\r\n        RDI_U64 encoding_idx_off = 0;\r\n        for(RDI_U64 slot_idx = 0; slot_idx < top->slots_count; slot_idx += 1)\r\n        {\r\n          rdim_shared->bake_idx_runs.slots_base_idxs[slot_idx] = encoding_idx_off;\r\n          if(map->slots[slot_idx] != 0)\r\n          {\r\n            encoding_idx_off += map->slots_idx_counts[slot_idx];\r\n          }\r\n        }\r\n        rdim_shared->bake_idx_runs.slots_base_idxs[top->slots_count] = encoding_idx_off;\r\n      }\r\n      lane_sync();\r\n      ProfScope(\"fill tight map\")\r\n      {\r\n        Rng1U64 slot_range = lane_range(rdim_shared->bake_idx_runs.slots_count);\r\n        for EachInRange(idx, slot_range)\r\n        {\r\n          if(map->slots[idx] != 0)\r\n          {\r\n            rdim_memcpy_struct(&rdim_shared->bake_idx_runs.slots[idx], map->slots[idx]);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    scratch_end(scratch);\r\n  }\r\n  lane_sync();\r\n  RDIM_BakeIdxRunMap *bake_idx_runs = &rdim_shared->bake_idx_runs;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake strings\r\n  //\r\n  ProfScope(\"bake strings\")\r\n  {\r\n    // rjf: set up \r\n    if(lane_idx() == 0) ProfScope(\"set up; lay out strings\")\r\n    {\r\n      rdim_shared->baked_strings.string_offs_count = bake_strings->total_count + 1;\r\n      rdim_shared->baked_strings.string_offs = rdim_push_array(arena, RDI_U32, rdim_shared->baked_strings.string_offs_count);\r\n      RDI_U64 off_cursor = 0;\r\n      for EachIndex(slot_idx, bake_strings->slots_count)\r\n      {\r\n        for EachNode(n, RDIM_BakeStringChunkNode, bake_strings->slots[slot_idx].first)\r\n        {\r\n          for EachIndex(n_idx, n->count)\r\n          {\r\n            RDIM_BakeString *src = &n->v[n_idx];\r\n            U64 dst_idx = bake_strings->slots_base_idxs[slot_idx] + n->base_idx + n_idx + 1;\r\n            rdim_shared->baked_strings.string_offs[dst_idx] = off_cursor;\r\n            off_cursor += src->string.size;\r\n          }\r\n        }\r\n      }\r\n      rdim_shared->baked_strings.string_data_size = off_cursor;\r\n      rdim_shared->baked_strings.string_data = rdim_push_array(arena, RDI_U8, rdim_shared->baked_strings.string_data_size);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: wide fill string data\r\n    ProfScope(\"wide fill\")\r\n    {\r\n      Rng1U64 slot_idx_range = lane_range(bake_strings->slots_count);\r\n      for EachInRange(slot_idx, slot_idx_range)\r\n      {\r\n        for EachNode(n, RDIM_BakeStringChunkNode, bake_strings->slots[slot_idx].first)\r\n        {\r\n          for EachIndex(n_idx, n->count)\r\n          {\r\n            RDIM_BakeString *src = &n->v[n_idx];\r\n            U64 dst_idx = bake_strings->slots_base_idxs[slot_idx] + n->base_idx + n_idx + 1;\r\n            U64 dst_off = rdim_shared->baked_strings.string_offs[dst_idx];\r\n            rdim_memcpy(rdim_shared->baked_strings.string_data + dst_off, src->string.str, src->string.size);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  RDIM_StringBakeResult baked_strings = rdim_shared->baked_strings;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake idx runs\r\n  //\r\n  if(need_index_runs) ProfScope(\"bake idx runs\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_idx_runs.idx_count = bake_idx_runs->slots_base_idxs[bake_idx_runs->slots_count];\r\n      rdim_shared->baked_idx_runs.idx_runs = push_array(arena, RDI_U32, rdim_shared->baked_idx_runs.idx_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: wide fill\r\n    {\r\n      Rng1U64 range = lane_range(bake_idx_runs->slots_count);\r\n      for EachInRange(slot_idx, range)\r\n      {\r\n        RDI_U64 off = bake_idx_runs->slots_base_idxs[slot_idx];\r\n        for EachNode(n, RDIM_BakeIdxRunChunkNode, bake_idx_runs->slots[slot_idx].first)\r\n        {\r\n          StaticAssert(sizeof(rdim_shared->baked_idx_runs.idx_runs[0]) == sizeof(n->v[0].idxes[0]), idx_run_size_check);\r\n          for EachIndex(n_idx, n->count)\r\n          {\r\n            rdim_memcpy(rdim_shared->baked_idx_runs.idx_runs + off, n->v[n_idx].idxes, sizeof(n->v[n_idx].idxes[0]) * n->v[n_idx].count);\r\n            off += n->v[n_idx].count;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  RDIM_IndexRunBakeResult baked_idx_runs = rdim_shared->baked_idx_runs;\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake name maps\r\n  //\r\n  ProfScope(\"bake name maps\")\r\n  {\r\n    // rjf: count unique names in all name maps; lay out baked nodes\r\n    ProfScope(\"count unique names in all name maps; lay out baked nodes\")\r\n    {\r\n      if(lane_idx() == 0)\r\n      {\r\n        for EachNonZeroEnumVal(RDI_NameMapKind, k)\r\n        {\r\n          rdim_shared->lane_name_map_node_counts[k] = push_array(arena, U64, lane_count());\r\n          rdim_shared->lane_name_map_node_offs[k] = push_array(arena, U64, lane_count());\r\n        }\r\n      }\r\n      lane_sync();\r\n      for EachNonZeroEnumVal(RDI_NameMapKind, k)\r\n      {\r\n        if(!name_maps_need_build[k]) { continue; }\r\n        RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k];\r\n        RDIM_BakeNameMap *map = bake_name_maps[k];\r\n        Rng1U64 range = lane_range(top->slots_count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          if(map->slots[idx] != 0)\r\n          {\r\n            U64 total_unique_name_count = 0;\r\n            U64 last_hash = 0;\r\n            for EachNode(n, RDIM_BakeNameChunkNode, map->slots[idx]->first)\r\n            {\r\n              for EachIndex(n_idx, n->count)\r\n              {\r\n                if(n->v[n_idx].hash != last_hash)\r\n                {\r\n                  total_unique_name_count += 1;\r\n                  last_hash = n->v[n_idx].hash;\r\n                }\r\n              }\r\n            }\r\n            rdim_shared->lane_name_map_node_counts[k][lane_idx()] += total_unique_name_count;\r\n          }\r\n        }\r\n      }\r\n      lane_sync();\r\n      if(lane_idx() == 0)\r\n      {\r\n        for EachNonZeroEnumVal(RDI_NameMapKind, k)\r\n        {\r\n          RDI_U64 node_off = 0;\r\n          for EachIndex(l_idx, lane_count())\r\n          {\r\n            rdim_shared->name_map_node_counts[k] += rdim_shared->lane_name_map_node_counts[k][l_idx];\r\n            rdim_shared->lane_name_map_node_offs[k][l_idx] = node_off;\r\n            node_off += rdim_shared->lane_name_map_node_counts[k][l_idx];\r\n          }\r\n          rdim_shared->total_name_map_node_count += rdim_shared->name_map_node_counts[k];\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: setup\r\n    ProfScope(\"setup\")\r\n    {\r\n      if(lane_idx() == lane_from_task_idx(0))\r\n      {\r\n        rdim_shared->baked_top_level_name_maps.name_maps_count = RDI_NameMapKind_COUNT;\r\n        rdim_shared->baked_top_level_name_maps.name_maps = push_array(arena, RDI_NameMap, rdim_shared->baked_top_level_name_maps.name_maps_count);\r\n        RDI_U32 bucket_off = 0;\r\n        RDI_U32 node_off = 0;\r\n        for EachNonZeroEnumVal(RDI_NameMapKind, k)\r\n        {\r\n          rdim_shared->baked_top_level_name_maps.name_maps[k].bucket_base_idx = bucket_off;\r\n          rdim_shared->baked_top_level_name_maps.name_maps[k].node_base_idx = node_off;\r\n          rdim_shared->baked_top_level_name_maps.name_maps[k].bucket_count = (RDI_U32)bake_name_maps_tops[k].slots_count; // TODO(rjf): @u64_to_u32\r\n          rdim_shared->baked_top_level_name_maps.name_maps[k].node_count = (RDI_U32)rdim_shared->name_map_node_counts[k]; // TODO(rjf): @u64_to_u32\r\n          bucket_off += rdim_shared->baked_top_level_name_maps.name_maps[k].bucket_count;\r\n          node_off += rdim_shared->baked_top_level_name_maps.name_maps[k].node_count;\r\n        }\r\n        rdim_shared->baked_name_maps.buckets_count = bucket_off;\r\n        rdim_shared->baked_name_maps.buckets = push_array(arena, RDI_NameMapBucket, rdim_shared->baked_name_maps.buckets_count);\r\n      }\r\n      if(lane_idx() == lane_from_task_idx(1))\r\n      {\r\n        rdim_shared->baked_name_maps.nodes_count = rdim_shared->total_name_map_node_count;\r\n        rdim_shared->baked_name_maps.nodes = push_array(arena, RDI_NameMapNode, rdim_shared->baked_name_maps.nodes_count);\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: wide fill baked name maps\r\n    ProfScope(\"wide fill baked name maps\")\r\n    {\r\n      for EachNonZeroEnumVal(RDI_NameMapKind, k) ProfScope(\"wide fill (%.*s)\", str8_varg(rdi_string_from_name_map_kind(k)))\r\n      {\r\n        if(!name_maps_need_build[k]) { continue; }\r\n        RDI_U64 write_node_off = rdim_shared->lane_name_map_node_offs[k][lane_idx()];\r\n        RDIM_BakeNameMapTopology *top = &bake_name_maps_tops[k];\r\n        U64 slots_count = top->slots_count;\r\n        RDIM_BakeNameMap *src_map = bake_name_maps[k];\r\n        RDI_NameMap *dst_map = &rdim_shared->baked_top_level_name_maps.name_maps[k];\r\n        RDI_NameMapBucket *dst_buckets = rdim_shared->baked_name_maps.buckets + dst_map->bucket_base_idx;\r\n        RDI_NameMapNode *dst_nodes = rdim_shared->baked_name_maps.nodes + dst_map->node_base_idx;\r\n        Rng1U64 slot_range = lane_range(slots_count);\r\n        for EachInRange(slot_idx, slot_range)\r\n        {\r\n          RDIM_BakeNameChunkList *src_slot = src_map->slots[slot_idx];\r\n          if(src_slot == 0) { continue; }\r\n          RDI_NameMapBucket *dst_bucket = &dst_buckets[slot_idx];\r\n          dst_bucket->first_node = write_node_off;\r\n          {\r\n            Temp scratch = scratch_begin(&arena, 1);\r\n            typedef struct IdxRunNode IdxRunNode;\r\n            struct IdxRunNode\r\n            {\r\n              IdxRunNode *next;\r\n              RDI_U64 idx;\r\n            };\r\n            IdxRunNode *first_idx_run_node = 0;\r\n            IdxRunNode *last_idx_run_node = 0;\r\n            U64 active_idx_count = 0;\r\n            String8 active_string = {0};\r\n            RDIM_BakeNameChunkNode *n = src_slot->first;\r\n            U64 n_idx = 0;\r\n            for(;;)\r\n            {\r\n              // rjf: advance chunk\r\n              if(n != 0 && n_idx >= n->count)\r\n              {\r\n                n = n->next;\r\n                n_idx = 0;\r\n              }\r\n              \r\n              // rjf: grab next element\r\n              U64 idx = 0;\r\n              String8 string = {0};\r\n              if(n != 0)\r\n              {\r\n                idx    = n->v[n_idx].idx;\r\n                string = n->v[n_idx].string;\r\n              }\r\n              \r\n              // rjf: next element doesn't match the active list? -> push index run, clear active list, start new list\r\n              if(!str8_match(active_string, string, 0))\r\n              {\r\n                // rjf: has active run -> flatten & serialize\r\n                if(active_string.size != 0)\r\n                {\r\n                  // rjf: flatten idxes\r\n                  RDI_U64 idxs_count = active_idx_count;\r\n                  RDI_U32 *idxs = rdim_push_array(scratch.arena, RDI_U32, idxs_count);\r\n                  {\r\n                    U64 write_idx = 0;\r\n                    for EachNode(idx_run_n, IdxRunNode, first_idx_run_node)\r\n                    {\r\n                      idxs[write_idx] = (RDI_U32)idx_run_n->idx; // TODO(rjf): @u64_to_u32\r\n                      write_idx += 1;\r\n                    }\r\n                  }\r\n                  \r\n                  // rjf: serialize node\r\n                  RDI_NameMapNode *dst_node = &dst_nodes[write_node_off];\r\n                  dst_node->string_idx = rdim_bake_idx_from_string(bake_strings, active_string);\r\n                  dst_node->match_count = idxs_count;\r\n                  if(dst_node->match_count == 1)\r\n                  {\r\n                    dst_node->match_idx_or_idx_run_first = idxs[0];\r\n                  }\r\n                  else if(dst_node->match_count > 1)\r\n                  {\r\n                    dst_node->match_idx_or_idx_run_first = rdim_bake_idx_from_idx_run(bake_idx_runs, idxs, idxs_count);\r\n                  }\r\n                  dst_bucket->node_count += 1;\r\n                  write_node_off += 1;\r\n                }\r\n                \r\n                // rjf: start new list\r\n                active_string = string;\r\n                first_idx_run_node = 0;\r\n                last_idx_run_node = 0;\r\n                active_idx_count = 0;\r\n                temp_end(scratch);\r\n              }\r\n              \r\n              // rjf: hash matches the active list -> push\r\n              if(active_string.size != 0 && str8_match(active_string, string, 0))\r\n              {\r\n                IdxRunNode *idx_run_n = push_array(scratch.arena, IdxRunNode, 1);\r\n                idx_run_n->idx = idx;\r\n                SLLQueuePush(first_idx_run_node, last_idx_run_node, idx_run_n);\r\n                active_idx_count += 1;\r\n              }\r\n              \r\n              // rjf: advance index\r\n              n_idx += 1;\r\n              \r\n              // rjf: end on zero node\r\n              if(n == 0)\r\n              {\r\n                break;\r\n              }\r\n            }\r\n            scratch_end(scratch);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage gather line-bucketed src line map data\r\n  //\r\n  ProfScope(\"gather line-bucketed src line map data\")\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->bake_src_line_maps = push_array(arena, RDIM_BakeSrcLineMap, params->src_files.total_count);\r\n    }\r\n    lane_sync();\r\n    {\r\n      for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          U64 file_idx = n->base_idx + n_idx;\r\n          RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[file_idx];\r\n          \r\n          // rjf: set up map\r\n          map->slots_count = n->v[n_idx].total_line_count;\r\n          map->slots = push_array(arena, RDIM_BakeSrcLineMapSlot, map->slots_count);\r\n          \r\n          // rjf: gather line-bucketed info\r\n          for EachNode(frag, RDIM_SrcFileLineMapFragment, n->v[n_idx].first_line_map_fragment)\r\n          {\r\n            RDIM_LineSequence *seq = frag->seq;\r\n            for EachIndex(idx, seq->line_count)\r\n            {\r\n              RDI_U32 line_num = seq->line_nums[idx];\r\n              RDI_U64 voff_first = seq->voffs[idx];\r\n              RDI_U64 voff_opl = seq->voffs[idx+1];\r\n              RDI_U64 slot_idx = line_num%map->slots_count;\r\n              \r\n              // rjf: find existing line node\r\n              RDIM_BakeSrcLineMapNode *line_node = 0;\r\n              {\r\n                for EachNode(line_n, RDIM_BakeSrcLineMapNode, map->slots[slot_idx].first)\r\n                {\r\n                  if(line_n->line_num == line_num)\r\n                  {\r\n                    line_node = line_n;\r\n                    break;\r\n                  }\r\n                }\r\n              }\r\n              \r\n              // rjf: construct new node if unseen\r\n              if(line_node == 0)\r\n              {\r\n                line_node = push_array(arena, RDIM_BakeSrcLineMapNode, 1);\r\n                SLLQueuePush(map->slots[slot_idx].first, map->slots[slot_idx].last, line_node);\r\n                line_node->line_num = line_num;\r\n                map->line_count += 1;\r\n              }\r\n              \r\n              // rjf: push this voff range\r\n              RDIM_Rng1U64 voff_range = {voff_first, voff_opl};\r\n              rdim_rng1u64_list_push(arena, &line_node->voff_ranges, voff_range);\r\n              map->voff_range_count += 1;\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage sort line-bucketed src line map data\r\n  //\r\n  ProfScope(\"sort line-bucketed src line map data\")\r\n  {\r\n    U64 map_count = params->src_files.total_count;\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->bake_src_line_map_keys = push_array(arena, RDIM_SortKey *, map_count);\r\n    }\r\n    lane_sync();\r\n    for(;;)\r\n    {\r\n      U64 map_num = ins_atomic_u64_inc_eval(&rdim_shared->bake_src_line_map_take_counter);\r\n      if(map_num < 1 || map_count < map_num)\r\n      {\r\n        break;\r\n      }\r\n      U64 map_idx = map_num-1;\r\n      RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[map_idx];\r\n      \r\n      // rjf: gather keys\r\n      rdim_shared->bake_src_line_map_keys[map_idx] = push_array_no_zero(arena, RDIM_SortKey, map->line_count);\r\n      RDIM_SortKey *keys = rdim_shared->bake_src_line_map_keys[map_idx];\r\n      {\r\n        U64 key_idx = 0;\r\n        for EachIndex(slot_idx, map->slots_count)\r\n        {\r\n          for EachNode(n, RDIM_BakeSrcLineMapNode, map->slots[slot_idx].first)\r\n          {\r\n            keys[key_idx].key = n->line_num;\r\n            keys[key_idx].val = n;\r\n            key_idx += 1;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: sort keys\r\n      {\r\n        radsort(keys, map->line_count, rdim_sort_key_is_before);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage compute src file / src file line map layout\r\n  //\r\n  ProfScope(\"compute src file / src file line map layout\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->lane_chunk_src_file_num_counts  = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      rdim_shared->lane_chunk_src_file_voff_counts = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      rdim_shared->lane_chunk_src_file_map_counts  = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      rdim_shared->lane_chunk_src_file_num_offs    = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      rdim_shared->lane_chunk_src_file_voff_offs   = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      rdim_shared->lane_chunk_src_file_map_offs    = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      for EachEnumVal(RDI_ChecksumKind, k)\r\n      {\r\n        rdim_shared->lane_chunk_src_file_checksum_counts[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n        rdim_shared->lane_chunk_src_file_checksum_offs[k] = push_array(arena, U64, lane_count()*params->src_files.chunk_count);\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: wide count\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        U64 slot_idx = lane_idx()*params->src_files.chunk_count + chunk_idx;\r\n        for EachInRange(idx, range)\r\n        {\r\n          RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[n->base_idx + idx];\r\n          rdim_shared->lane_chunk_src_file_num_counts[slot_idx] += map->line_count;\r\n          rdim_shared->lane_chunk_src_file_voff_counts[slot_idx] += map->voff_range_count;\r\n          rdim_shared->lane_chunk_src_file_map_counts[slot_idx] += !!map->line_count;\r\n          RDI_ChecksumKind k = n->v[idx].checksum_kind;\r\n          String8 val = n->v[idx].checksum;\r\n          if(RDI_ChecksumKind_NULL < k && k < RDI_ChecksumKind_COUNT && val.size != 0)\r\n          {\r\n            rdim_shared->lane_chunk_src_file_checksum_counts[k][slot_idx] += 1;\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: layout\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 chunk_idx = 0;\r\n      U64 num_layout_off = 0;\r\n      U64 voff_layout_off = 0;\r\n      U64 map_layout_off = 1;\r\n      U64 checksum_layout_offs[RDI_ChecksumKind_COUNT] = {0};\r\n      for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first)\r\n      {\r\n        for EachIndex(l_idx, lane_count())\r\n        {\r\n          U64 slot_idx = l_idx*params->src_files.chunk_count + chunk_idx;\r\n          rdim_shared->lane_chunk_src_file_num_offs[slot_idx] = num_layout_off;\r\n          rdim_shared->lane_chunk_src_file_voff_offs[slot_idx] = voff_layout_off;\r\n          rdim_shared->lane_chunk_src_file_map_offs[slot_idx] = map_layout_off;\r\n          num_layout_off += rdim_shared->lane_chunk_src_file_num_counts[slot_idx];\r\n          voff_layout_off += rdim_shared->lane_chunk_src_file_voff_counts[slot_idx];\r\n          map_layout_off += rdim_shared->lane_chunk_src_file_map_counts[slot_idx];\r\n          for EachEnumVal(RDI_ChecksumKind, k)\r\n          {\r\n            rdim_shared->lane_chunk_src_file_checksum_offs[k][slot_idx] = checksum_layout_offs[k];\r\n            checksum_layout_offs[k] += rdim_shared->lane_chunk_src_file_checksum_counts[k][slot_idx];\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n      rdim_shared->total_src_map_line_count = num_layout_off;\r\n      rdim_shared->total_src_map_voff_count = voff_layout_off;\r\n      for EachEnumVal(RDI_ChecksumKind, k)\r\n      {\r\n        rdim_shared->total_checksum_counts[k] = checksum_layout_offs[k];\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake src files\r\n  //\r\n  ProfScope(\"bake src files\")\r\n  {\r\n    //- rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_src_files.source_files_count = params->src_files.total_count+1;\r\n      rdim_shared->baked_src_files.source_files = push_array(arena, RDI_SourceFile, rdim_shared->baked_src_files.source_files_count);\r\n      rdim_shared->baked_src_files.source_line_maps_count = params->src_files.source_line_map_count+1;\r\n      rdim_shared->baked_src_files.source_line_maps = push_array(arena, RDI_SourceLineMap, rdim_shared->baked_src_files.source_line_maps_count);\r\n      rdim_shared->baked_src_files.source_line_map_nums_count = rdim_shared->total_src_map_line_count;\r\n      rdim_shared->baked_src_files.source_line_map_nums = push_array(arena, RDI_U32, rdim_shared->baked_src_files.source_line_map_nums_count);\r\n      rdim_shared->baked_src_files.source_line_map_rngs_count = rdim_shared->total_src_map_line_count + rdim_shared->baked_src_files.source_line_maps_count;\r\n      rdim_shared->baked_src_files.source_line_map_rngs = push_array(arena, RDI_U32, rdim_shared->baked_src_files.source_line_map_rngs_count);\r\n      rdim_shared->baked_src_files.source_line_map_voffs_count = rdim_shared->total_src_map_voff_count;\r\n      rdim_shared->baked_src_files.source_line_map_voffs = push_array(arena, RDI_U64, rdim_shared->baked_src_files.source_line_map_voffs_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: bake\r\n    U64 chunk_idx = 0;\r\n    for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first)\r\n    {\r\n      Rng1U64 range = lane_range(n->count);\r\n      U64 slot_idx = lane_idx()*params->src_files.chunk_count + chunk_idx;\r\n      U64 dst_num_off  = rdim_shared->lane_chunk_src_file_num_offs[slot_idx];\r\n      U64 dst_map_off  = rdim_shared->lane_chunk_src_file_map_offs[slot_idx];\r\n      U64 dst_voff_off = rdim_shared->lane_chunk_src_file_voff_offs[slot_idx];\r\n      U64 dst_rng_off  = dst_num_off + dst_map_off;\r\n      U64 dst_checksums_off[RDI_ChecksumKind_COUNT] = {0};\r\n      for EachEnumVal(RDI_ChecksumKind, k)\r\n      {\r\n        dst_checksums_off[k] = 1 + rdim_shared->lane_chunk_src_file_checksum_offs[k][slot_idx];\r\n      }\r\n      for EachInRange(idx, range)\r\n      {\r\n        RDIM_BakeSrcLineMap *map = &rdim_shared->bake_src_line_maps[n->base_idx + idx];\r\n        RDIM_SortKey *sorted_map_keys = rdim_shared->bake_src_line_map_keys[n->base_idx + idx];\r\n        RDIM_SrcFile *src = &n->v[idx];\r\n        RDI_SourceFile *dst = &rdim_shared->baked_src_files.source_files[n->base_idx + idx + 1];\r\n        RDI_SourceLineMap *dst_map = &rdim_shared->baked_src_files.source_line_maps[dst_map_off];\r\n        RDI_U32 *dst_nums  = &rdim_shared->baked_src_files.source_line_map_nums[dst_num_off];\r\n        RDI_U32 *dst_rngs  = &rdim_shared->baked_src_files.source_line_map_rngs[dst_rng_off];\r\n        RDI_U64 *dst_voffs = &rdim_shared->baked_src_files.source_line_map_voffs[dst_voff_off];\r\n        \r\n        //- rjf: fill file info\r\n        Temp scratch = scratch_begin(&arena, 1);\r\n        String8 normalized_path = rdim_lower_from_str8(scratch.arena, src->path);\r\n        B32 has_checksum = (RDI_ChecksumKind_NULL < src->checksum_kind && src->checksum_kind < RDI_ChecksumKind_COUNT && src->checksum.size != 0);\r\n        dst->file_path_node_idx = rdim_bake_path_node_idx_from_string(path_tree, src->path);\r\n        dst->normal_full_path_string_idx = rdim_bake_idx_from_string(bake_strings, normalized_path);\r\n        dst->source_line_map_idx = src->total_line_count ? dst_map_off : 0;\r\n        dst->checksum_kind = src->checksum_kind;\r\n        dst->checksum_idx  = has_checksum ? dst_checksums_off[dst->checksum_kind] : 0;\r\n        scratch_end(scratch);\r\n        \r\n        //- rjf: advance checksum offset for this kind\r\n        if(has_checksum)\r\n        {\r\n          dst_checksums_off[dst->checksum_kind] += 1;\r\n        }\r\n        \r\n        //- rjf: fill map info\r\n        if(src->total_line_count != 0)\r\n        {\r\n          dst_map->line_count = (RDI_U32)map->line_count; // TODO(rjf): @u64_to_u32\r\n          dst_map->voff_count = (RDI_U32)map->voff_range_count; // TODO(rjf): @u64_to_u32\r\n          dst_map->line_map_nums_base_idx = (RDI_U32)dst_num_off; // TODO(rjf): @u64_to_u32\r\n          dst_map->line_map_range_base_idx = (RDI_U32)dst_rng_off; // TODO(rjf): @u64_to_u32\r\n          dst_map->line_map_voff_base_idx = (RDI_U32)dst_voff_off; // TODO(rjf): @u64_to_u32\r\n          dst_map_off += 1;\r\n        }\r\n        \r\n        //- rjf: fill nums/ranges/voffs info\r\n        if(src->total_line_count != 0)\r\n        {\r\n          U64 *dst_voff_ptr = dst_voffs;\r\n          for EachIndex(line_num_idx, map->line_count)\r\n          {\r\n            dst_nums[line_num_idx] = (RDI_U32)sorted_map_keys[line_num_idx].key; // TODO(rjf): @u64_to_u32\r\n            dst_rngs[line_num_idx] = (RDI_U32)(dst_voff_ptr - dst_voffs); // TODO(rjf): @u64_to_u32\r\n            RDIM_BakeSrcLineMapNode *node = (RDIM_BakeSrcLineMapNode *)sorted_map_keys[line_num_idx].val;\r\n            for EachNode(rng_n, RDIM_Rng1U64Node, node->voff_ranges.first)\r\n            {\r\n              dst_voff_ptr[0] = rng_n->v.min;\r\n              dst_voff_ptr += 1;\r\n            }\r\n          }\r\n          dst_rngs[map->line_count] = (RDI_U32)map->voff_range_count; // TODO(rjf): @u64_to_u32\r\n          dst_num_off += map->line_count;\r\n          dst_rng_off += map->line_count+1;\r\n          dst_voff_off += map->voff_range_count;\r\n        }\r\n      }\r\n      chunk_idx += 1;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake checksums\r\n  //\r\n  ProfScope(\"bake checksums\")\r\n  {\r\n    // rjf: allocate\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_checksums.md5s_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_MD5] + 1;\r\n      rdim_shared->baked_checksums.sha1s_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_SHA1] + 1;\r\n      rdim_shared->baked_checksums.sha256s_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_SHA256] + 1;\r\n      rdim_shared->baked_checksums.timestamps_count = rdim_shared->total_checksum_counts[RDI_ChecksumKind_Timestamp] + 1;\r\n      rdim_shared->baked_checksums.md5s = push_array(arena, RDI_MD5, rdim_shared->baked_checksums.md5s_count);\r\n      rdim_shared->baked_checksums.sha1s = push_array(arena, RDI_SHA1, rdim_shared->baked_checksums.sha1s_count);\r\n      rdim_shared->baked_checksums.sha256s = push_array(arena, RDI_SHA256, rdim_shared->baked_checksums.sha256s_count);\r\n      rdim_shared->baked_checksums.timestamps = push_array(arena, RDI_U64, rdim_shared->baked_checksums.timestamps_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: fill\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_SrcFileChunkNode, params->src_files.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        U64 slot_idx = lane_idx()*params->src_files.chunk_count + chunk_idx;\r\n        U64 dst_offs[RDI_ChecksumKind_COUNT] = {0};\r\n        for EachEnumVal(RDI_ChecksumKind, k)\r\n        {\r\n          dst_offs[k] = 1 + rdim_shared->lane_chunk_src_file_checksum_offs[k][slot_idx];\r\n        }\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDI_ChecksumKind k = n->v[n_idx].checksum_kind;\r\n          String8 val = n->v[n_idx].checksum;\r\n          if(RDI_ChecksumKind_NULL < k && k < RDI_ChecksumKind_COUNT && val.size != 0)\r\n          {\r\n            switch((RDI_ChecksumKindEnum)k)\r\n            {\r\n              case RDI_ChecksumKind_NULL:\r\n              case RDI_ChecksumKind_COUNT:\r\n              {}break;\r\n#define Case(name, table_name) case RDI_ChecksumKind_##name:{MemoryCopy(&rdim_shared->baked_checksums.table_name[dst_offs[k]], val.str, Min(val.size, sizeof(rdim_shared->baked_checksums.table_name[0])));}break\r\n              Case(MD5, md5s);\r\n              Case(SHA1, sha1s);\r\n              Case(SHA256, sha256s);\r\n              Case(Timestamp, timestamps);\r\n#undef Case\r\n            }\r\n            dst_offs[k] += 1;\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage compute lane UDT member/enum-val layouts\r\n  //\r\n  ProfScope(\"compute lane UDT member/enum-val layouts\")\r\n  {\r\n    // rjf: allocate\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->member_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count);\r\n      rdim_shared->member_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count);\r\n      rdim_shared->enum_val_chunk_lane_counts = push_array(arena, U64, lane_count() * params->udts.chunk_count);\r\n      rdim_shared->enum_val_chunk_lane_offs = push_array(arena, U64, lane_count() * params->udts.chunk_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: count\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_UDTChunkNode, params->udts.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          U64 slot_idx = lane_idx()*params->udts.chunk_count + chunk_idx;\r\n          rdim_shared->member_chunk_lane_counts[slot_idx] += n->v[idx].member_count;\r\n          rdim_shared->enum_val_chunk_lane_counts[slot_idx] += n->v[idx].enum_val_count;\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: layout\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 member_layout_off = 1;\r\n      U64 enum_val_layout_off = 1;\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_UDTChunkNode, params->udts.first)\r\n      {\r\n        for EachIndex(l_idx, lane_count())\r\n        {\r\n          U64 slot_idx = l_idx*params->udts.chunk_count + chunk_idx;\r\n          rdim_shared->member_chunk_lane_offs[slot_idx] = member_layout_off;\r\n          rdim_shared->enum_val_chunk_lane_offs[slot_idx] = enum_val_layout_off;\r\n          member_layout_off += rdim_shared->member_chunk_lane_counts[slot_idx];\r\n          enum_val_layout_off += rdim_shared->enum_val_chunk_lane_counts[slot_idx];\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake UDTs\r\n  //\r\n  ProfScope(\"bake UDTs\")\r\n  {\r\n    //- rjf: set up\r\n    ProfScope(\"set up\")\r\n    {\r\n      if(lane_idx() == lane_from_task_idx(0))\r\n      {\r\n        rdim_shared->baked_udts.udts_count = params->udts.total_count+1;\r\n        rdim_shared->baked_udts.udts = push_array(arena, RDI_UDT, rdim_shared->baked_udts.udts_count);\r\n      }\r\n      if(lane_idx() == lane_from_task_idx(1))\r\n      {\r\n        rdim_shared->baked_udts.members_count = params->udts.total_member_count+1;\r\n        rdim_shared->baked_udts.members = push_array(arena, RDI_Member, rdim_shared->baked_udts.members_count);\r\n      }\r\n      if(lane_idx() == lane_from_task_idx(2))\r\n      {\r\n        rdim_shared->baked_udts.enum_members_count = params->udts.total_enum_val_count+1;\r\n        rdim_shared->baked_udts.enum_members = push_array(arena, RDI_EnumMember, rdim_shared->baked_udts.enum_members_count);\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: bake UDTs\r\n    ProfScope(\"bake UDTs\")\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_UDTChunkNode, params->udts.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        U64 layout_slot_idx = lane_idx()*params->udts.chunk_count + chunk_idx;\r\n        U64 member_layout_off = rdim_shared->member_chunk_lane_offs[layout_slot_idx];\r\n        U64 enum_val_layout_off = rdim_shared->enum_val_chunk_lane_offs[layout_slot_idx];\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_UDT *src_udt = &n->v[n_idx];\r\n          RDI_UDT *dst_udt = &rdim_shared->baked_udts.udts[n->base_idx + n_idx + 1];\r\n          \r\n          //- rjf: fill basics\r\n          dst_udt->self_type_idx = (RDI_U32)rdim_idx_from_type(src_udt->self_type); // TODO(rjf): @u64_to_u32\r\n          dst_udt->file_idx = (RDI_U32)rdim_idx_from_src_file(src_udt->src_file); // TODO(rjf): @u64_to_u32\r\n          dst_udt->line = src_udt->line;\r\n          dst_udt->col  = src_udt->col;\r\n          \r\n          //- rjf: fill member info\r\n          if(src_udt->first_member != 0)\r\n          {\r\n            U64 member_off_first = member_layout_off;\r\n            for EachNode(src_member, RDIM_UDTMember, src_udt->first_member)\r\n            {\r\n              RDI_Member *dst_member = &rdim_shared->baked_udts.members[member_layout_off];\r\n              dst_member->kind            = src_member->kind;\r\n              dst_member->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_member->name);\r\n              dst_member->type_idx        = (RDI_U32)rdim_idx_from_type(src_member->type); // TODO(rjf): @u64_to_u32\r\n              dst_member->off             = src_member->off;\r\n              member_layout_off += 1;\r\n            }\r\n            U64 member_off_opl = member_layout_off;\r\n            dst_udt->member_first = (RDI_U32)member_off_first; // TODO(rjf): @u64_to_u32\r\n            dst_udt->member_count = (RDI_U32)(member_off_opl - member_off_first); // TODO(rjf): @u64_to_u32\r\n          }\r\n          \r\n          //- rjf: fill enum val info\r\n          else if(src_udt->first_enum_val != 0)\r\n          {\r\n            U64 enum_val_off_first = enum_val_layout_off;\r\n            for EachNode(src_enum_val, RDIM_UDTEnumVal, src_udt->first_enum_val)\r\n            {\r\n              RDI_EnumMember *dst_member = &rdim_shared->baked_udts.enum_members[enum_val_layout_off];\r\n              dst_member->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_enum_val->name);\r\n              dst_member->val             = src_enum_val->val;\r\n              enum_val_layout_off += 1;\r\n            }\r\n            U64 enum_val_off_opl = enum_val_layout_off;\r\n            dst_udt->flags |= RDI_UDTFlag_EnumMembers;\r\n            dst_udt->member_first = (RDI_U32)enum_val_off_first; // TODO(rjf): @u64_to_u32\r\n            dst_udt->member_count = (RDI_U32)(enum_val_off_opl - enum_val_off_first); // TODO(rjf): @u64_to_u32\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage compute lane location block layout\r\n  //\r\n  U64 total_location_case_chunk_count = (params->scopes.chunk_count + params->procedures.chunk_count);\r\n  ProfScope(\"compute lane location block layout\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->location_case_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count);\r\n      rdim_shared->location_case_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * total_location_case_chunk_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: per-chunk-lane count of location cases\r\n    {\r\n      // rjf: count location cases in scopes\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n      {\r\n        U64 slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx;\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          for EachNode(local, RDIM_Local, n->v[idx].first_local)\r\n          {\r\n            rdim_shared->location_case_chunk_lane_counts[slot_idx] += local->location_cases.count;\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n      \r\n      // rjf: count location cases in procedures\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first)\r\n      {\r\n        U64 slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx;\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          rdim_shared->location_case_chunk_lane_counts[slot_idx] += n->v[idx].location_cases.count;\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: lay out location case offsets\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 chunk_idx = 0;\r\n      U64 location_case_layout_off = 1;\r\n      for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n      {\r\n        for EachIndex(l_idx, lane_count())\r\n        {\r\n          U64 slot_idx = l_idx * total_location_case_chunk_count + chunk_idx;\r\n          rdim_shared->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off;\r\n          location_case_layout_off += rdim_shared->location_case_chunk_lane_counts[slot_idx];\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first)\r\n      {\r\n        for EachIndex(l_idx, lane_count())\r\n        {\r\n          U64 slot_idx = l_idx * total_location_case_chunk_count + chunk_idx;\r\n          rdim_shared->location_case_chunk_lane_offs[slot_idx] = location_case_layout_off;\r\n          location_case_layout_off += rdim_shared->location_case_chunk_lane_counts[slot_idx];\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n      rdim_shared->total_location_case_count = location_case_layout_off;\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake location blocks\r\n  //\r\n  ProfScope(\"bake location blocks\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_location_blocks.location_blocks_count = rdim_shared->total_location_case_count;\r\n      rdim_shared->baked_location_blocks.location_blocks = push_array(arena, RDI_LocationBlock, rdim_shared->baked_location_blocks.location_blocks_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: wide fill from scopes\r\n    U64 chunk_idx = 0;\r\n    ProfScope(\"wide fill from scopes\")\r\n    {\r\n      for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n      {\r\n        U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx;\r\n        U64 layout_off = rdim_shared->location_case_chunk_lane_offs[layout_slot_idx];\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          for EachNode(local, RDIM_Local, n->v[idx].first_local)\r\n          {\r\n            for EachNode(src, RDIM_LocationCase, local->location_cases.first)\r\n            {\r\n              RDI_LocationBlock *dst = &rdim_shared->baked_location_blocks.location_blocks[layout_off];\r\n              dst->scope_off_first   = (RDI_U32)src->voff_range.min; // TODO(rjf): @u64_to_u32\r\n              dst->scope_off_opl     = (RDI_U32)src->voff_range.max; // TODO(rjf): @u64_to_u32\r\n              dst->location_data_off = (RDI_U32)rdim_off_from_location(src->location); // TODO(rjf): @u64_to_u32\r\n              layout_off += 1;\r\n            }\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    \r\n    // rjf: wide fill from procedures\r\n    ProfScope(\"wide fill from procedures\")\r\n    {\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first)\r\n      {\r\n        U64 layout_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx;\r\n        U64 layout_off = rdim_shared->location_case_chunk_lane_offs[layout_slot_idx];\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          for EachNode(src, RDIM_LocationCase, n->v[idx].location_cases.first)\r\n          {\r\n            RDI_LocationBlock *dst = &rdim_shared->baked_location_blocks.location_blocks[layout_off];\r\n            dst->scope_off_first = (RDI_U32)src->voff_range.min; // TODO(rjf): @u64_to_u32\r\n            dst->scope_off_opl   = (RDI_U32)src->voff_range.max; // TODO(rjf): @u64_to_u32\r\n            dst->location_data_off = (RDI_U32)rdim_off_from_location(src->location); // TODO(rjf): @u64_to_u32\r\n            layout_off += 1;\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake locations\r\n  //\r\n  ProfScope(\"bake locations\")\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_locations.location_data_size = params->locations.total_encoded_size+1;\r\n      rdim_shared->baked_locations.location_data = push_array(arena, RDI_U8, rdim_shared->baked_locations.location_data_size);\r\n    }\r\n    lane_sync();\r\n    for EachNode(n, RDIM_LocationChunkNode, params->locations.first)\r\n    {\r\n      Rng1U64 range = lane_range(n->count);\r\n      for EachInRange(n_idx, range)\r\n      {\r\n        RDIM_Location *loc = &n->v[n_idx];\r\n        RDI_U8 *dst = &rdim_shared->baked_locations.location_data[n->base_encoding_off + loc->relative_encoding_off + 1];\r\n        switch((RDI_LocationKindEnum)loc->info.kind)\r\n        {\r\n          case RDI_LocationKind_NULL:{}break;\r\n          case RDI_LocationKind_AddrBytecodeStream:\r\n          case RDI_LocationKind_ValBytecodeStream:\r\n          {\r\n            MemoryCopy(dst+0, &loc->info.kind, sizeof(loc->info.kind));\r\n            RDI_U64 write_off = sizeof(loc->info.kind);\r\n            for EachNode(op_node, RDIM_EvalBytecodeOp, loc->info.bytecode.first_op)\r\n            {\r\n              MemoryCopy(dst + write_off, &op_node->op, 1);\r\n              write_off += 1;\r\n              MemoryCopy(dst + write_off, &op_node->p, op_node->p_size);\r\n              write_off += op_node->p_size;\r\n            }\r\n            dst[write_off] = 0;\r\n          }break;\r\n          case RDI_LocationKind_AddrRegPlusU16:\r\n          case RDI_LocationKind_AddrAddrRegPlusU16:\r\n          {\r\n            RDI_LocationRegPlusU16 baked = {loc->info.kind, loc->info.reg_code, loc->info.offset};\r\n            MemoryCopy(dst, &baked, sizeof(baked));\r\n          }break;\r\n          case RDI_LocationKind_ValReg:\r\n          {\r\n            RDI_LocationReg baked = {loc->info.kind, loc->info.reg_code};\r\n            MemoryCopy(dst, &baked, sizeof(baked));\r\n          }break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage compute layout for scope sub-lists (locals / voffs)\r\n  //\r\n  ProfScope(\"compute layout for scope sub-lists (locals / voffs)\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->scope_local_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count);\r\n      rdim_shared->scope_local_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count);\r\n      rdim_shared->scope_voff_chunk_lane_counts = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count);\r\n      rdim_shared->scope_voff_chunk_lane_offs = push_array(arena, RDI_U64, lane_count() * params->scopes.chunk_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: count per-lane-chunk\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n      {\r\n        U64 num_locals_in_this_lane_and_node = 0;\r\n        U64 num_voffs_in_this_lane_and_node = 0;\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          num_locals_in_this_lane_and_node += n->v[n_idx].local_count;\r\n          num_voffs_in_this_lane_and_node += n->v[n_idx].voff_ranges.count*2;\r\n        }\r\n        rdim_shared->scope_local_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_locals_in_this_lane_and_node;\r\n        rdim_shared->scope_voff_chunk_lane_counts[lane_idx()*params->scopes.chunk_count + chunk_idx] = num_voffs_in_this_lane_and_node;\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: lay out each lane's range\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 local_layout_off = 1;\r\n      U64 voff_layout_off = 1;\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n      {\r\n        for EachIndex(l_idx, lane_count())\r\n        {\r\n          U64 slot_idx = l_idx*params->scopes.chunk_count + chunk_idx;\r\n          rdim_shared->scope_local_chunk_lane_offs[slot_idx] = local_layout_off;\r\n          rdim_shared->scope_voff_chunk_lane_offs[slot_idx] = voff_layout_off;\r\n          local_layout_off += rdim_shared->scope_local_chunk_lane_counts[slot_idx];\r\n          voff_layout_off += rdim_shared->scope_voff_chunk_lane_counts[slot_idx];\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake scopes\r\n  //\r\n  ProfScope(\"bake scopes\")\r\n  {\r\n    //- rjf: setup outputs\r\n    if(lane_idx() == lane_from_task_idx(0))\r\n    {\r\n      rdim_shared->baked_scopes.scopes_count = params->scopes.total_count+1;\r\n      rdim_shared->baked_scopes.scopes = push_array(arena, RDI_Scope, rdim_shared->baked_scopes.scopes_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1))\r\n    {\r\n      rdim_shared->baked_scopes.scope_voffs_count = params->scopes.scope_voff_count+1;\r\n      rdim_shared->baked_scopes.scope_voffs = push_array(arena, RDI_U64, rdim_shared->baked_scopes.scope_voffs_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2))\r\n    {\r\n      rdim_shared->baked_scopes.locals_count = params->scopes.local_count+1;\r\n      rdim_shared->baked_scopes.locals = push_array(arena, RDI_Local, rdim_shared->baked_scopes.locals_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: wide fill\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_ScopeChunkNode, params->scopes.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        U64 scope_chunk_lane_slot_idx = lane_idx()*params->scopes.chunk_count + chunk_idx;\r\n        U64 chunk_local_off = rdim_shared->scope_local_chunk_lane_offs[scope_chunk_lane_slot_idx];\r\n        U64 chunk_voff_off = rdim_shared->scope_voff_chunk_lane_offs[scope_chunk_lane_slot_idx];\r\n        U64 location_block_chunk_lane_slot_idx = lane_idx() * total_location_case_chunk_count + chunk_idx;\r\n        U64 chunk_location_block_off = rdim_shared->location_case_chunk_lane_offs[location_block_chunk_lane_slot_idx];\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          U64 dst_idx = 1 + n->base_idx + n_idx;\r\n          RDIM_Scope *src_scope = &n->v[n_idx];\r\n          RDI_Scope *dst_scope = &rdim_shared->baked_scopes.scopes[dst_idx];\r\n          \r\n          //- rjf: fill voff ranges\r\n          U64 voff_idx_first = chunk_voff_off;\r\n          for EachNode(rng_n, RDIM_Rng1U64Node, src_scope->voff_ranges.first)\r\n          {\r\n            rdim_shared->baked_scopes.scope_voffs[chunk_voff_off+0] = rng_n->v.min;\r\n            rdim_shared->baked_scopes.scope_voffs[chunk_voff_off+1] = rng_n->v.max;\r\n            chunk_voff_off += 2;\r\n          }\r\n          U64 voff_idx_opl = chunk_voff_off;\r\n          \r\n          //- rjf: fill locals\r\n          U64 local_idx_first = chunk_local_off;\r\n          for EachNode(src_local, RDIM_Local, src_scope->first_local)\r\n          {\r\n            RDI_Local *dst_local = &rdim_shared->baked_scopes.locals[chunk_local_off];\r\n            dst_local->kind            = src_local->kind;\r\n            dst_local->name_string_idx = rdim_bake_idx_from_string(bake_strings, src_local->name);\r\n            dst_local->type_idx        = (RDI_U32)rdim_idx_from_type(src_local->type); // TODO(rjf): @u64_to_u32\r\n            if(src_local->location_cases.count != 0)\r\n            {\r\n              dst_local->location_first  = chunk_location_block_off;\r\n              dst_local->location_opl    = chunk_location_block_off + src_local->location_cases.count;\r\n              chunk_location_block_off += src_local->location_cases.count;\r\n            }\r\n            chunk_local_off += 1;\r\n          }\r\n          U64 local_idx_opl = chunk_local_off;\r\n          \r\n          //- rjf: fill scope\r\n          dst_scope->proc_idx               = (RDI_U32)rdim_idx_from_symbol(src_scope->symbol); // TODO(rjf): @u64_to_u32\r\n          dst_scope->parent_scope_idx       = (RDI_U32)rdim_idx_from_scope(src_scope->parent_scope); // TODO(rjf): @u64_to_u32\r\n          dst_scope->first_child_scope_idx  = (RDI_U32)rdim_idx_from_scope(src_scope->first_child); // TODO(rjf): @u64_to_u32\r\n          dst_scope->next_sibling_scope_idx = (RDI_U32)rdim_idx_from_scope(src_scope->next_sibling); // TODO(rjf): @u64_to_u32\r\n          dst_scope->voff_range_first       = (RDI_U32)voff_idx_first;                    // TODO(rjf): @u64_to_u32\r\n          dst_scope->voff_range_opl         = (RDI_U32)voff_idx_opl;                      // TODO(rjf): @u64_to_u32\r\n          dst_scope->local_first            = (RDI_U32)local_idx_first;                   // TODO(rjf): @u64_to_u32\r\n          dst_scope->local_count            = (RDI_U32)(local_idx_opl - local_idx_first); // TODO(rjf): @u64_to_u32\r\n          dst_scope->inline_site_idx        = (RDI_U32)rdim_idx_from_inline_site(src_scope->inline_site); // TODO(rjf): @u64_to_u32\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake procedures\r\n  //\r\n  ProfScope(\"bake procedures\")\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_procedures.procedures_count = params->procedures.total_count+1;\r\n      rdim_shared->baked_procedures.procedures = push_array(arena, RDI_Procedure, rdim_shared->baked_procedures.procedures_count);\r\n    }\r\n    lane_sync();\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->procedures.first)\r\n      {\r\n        U64 location_block_layout_slot_idx = lane_idx()*total_location_case_chunk_count + params->scopes.chunk_count + chunk_idx;\r\n        U64 location_block_off = rdim_shared->location_case_chunk_lane_offs[location_block_layout_slot_idx];\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_Symbol *src = &n->v[n_idx];\r\n          RDI_Procedure *dst = &rdim_shared->baked_procedures.procedures[n->base_idx + n_idx + 1];\r\n          dst->name_string_idx      = rdim_bake_idx_from_string(bake_strings, src->name);\r\n          dst->link_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->link_name);\r\n          if(src->is_extern)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_External;\r\n          }\r\n          if(src->container_type != 0)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_TypeScoped;\r\n            dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32\r\n          }\r\n          else if(src->container_symbol != 0)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_ProcScoped;\r\n            dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32\r\n          }\r\n          dst->type_idx                  = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32\r\n          dst->root_scope_idx            = (RDI_U32)rdim_idx_from_scope(src->root_scope); // TODO(rjf): @u64_to_u32\r\n          if(src->location_cases.count != 0)\r\n          {\r\n            dst->frame_base_location_first = location_block_off;\r\n            dst->frame_base_location_opl   = location_block_off + src->location_cases.count;\r\n            location_block_off += src->location_cases.count;\r\n          }\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage compute layout for constant data\r\n  //\r\n  ProfScope(\"compute layout for constant data\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->constant_data_chunk_lane_counts = push_array(arena, U64, lane_count() * params->constants.chunk_count);\r\n      rdim_shared->constant_data_chunk_lane_offs = push_array(arena, U64, lane_count() * params->constants.chunk_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: count\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->constants.first)\r\n      {\r\n        U64 slot_idx = lane_idx()*params->constants.chunk_count + chunk_idx;\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(idx, range)\r\n        {\r\n          rdim_shared->constant_data_chunk_lane_counts[slot_idx] += n->v[idx].value_data.size;\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: layout\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 chunk_idx = 0;\r\n      U64 layout_off = 0;\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->constants.first)\r\n      {\r\n        for EachIndex(l_idx, lane_count())\r\n        {\r\n          U64 slot_idx = l_idx*params->constants.chunk_count + chunk_idx;\r\n          rdim_shared->constant_data_chunk_lane_offs[slot_idx] = layout_off;\r\n          layout_off += rdim_shared->constant_data_chunk_lane_counts[slot_idx];\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake constants\r\n  //\r\n  ProfScope(\"bake constants\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == lane_from_task_idx(0))\r\n    {\r\n      rdim_shared->baked_constants.constant_values_count = params->constants.total_count+1;\r\n      rdim_shared->baked_constants.constant_values = push_array(arena, RDI_U32, rdim_shared->baked_constants.constant_values_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1))\r\n    {\r\n      rdim_shared->baked_constants.constant_value_data_size = params->constants.total_value_data_size;\r\n      rdim_shared->baked_constants.constant_value_data = push_array(arena, RDI_U8, rdim_shared->baked_constants.constant_value_data_size);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2))\r\n    {\r\n      rdim_shared->baked_constants.constants_count = params->constants.total_count+1;\r\n      rdim_shared->baked_constants.constants = push_array(arena, RDI_Constant, rdim_shared->baked_constants.constants_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: wide bake\r\n    {\r\n      U64 chunk_idx = 0;\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->constants.first)\r\n      {\r\n        U64 slot_idx = lane_idx()*params->constants.chunk_count + chunk_idx;\r\n        U64 value_data_off = rdim_shared->constant_data_chunk_lane_offs[slot_idx];\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_Symbol *src = &n->v[n_idx];\r\n          RDI_Constant *dst = &rdim_shared->baked_constants.constants[1 + n->base_idx + n_idx];\r\n          RDI_U32 *dst_value_off = &rdim_shared->baked_constants.constant_values[1 + n->base_idx + n_idx];\r\n          RDI_U8 *dst_value_data = rdim_shared->baked_constants.constant_value_data + value_data_off;\r\n          dst->name_string_idx    = rdim_bake_idx_from_string(bake_strings, src->name);\r\n          dst->type_idx           = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32\r\n          dst->constant_value_idx = 1 + n->base_idx + n_idx;\r\n          dst_value_off[0] = (RDI_U32)value_data_off; // TODO(rjf): @u64_to_u32\r\n          rdim_memcpy(dst_value_data, src->value_data.str, src->value_data.size);\r\n          value_data_off += src->value_data.size;\r\n        }\r\n        chunk_idx += 1;\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake units, symbols, types, UDTs\r\n  //\r\n  {\r\n    //- rjf: setup outputs\r\n    if(lane_idx() == lane_from_task_idx(0))\r\n    {\r\n      rdim_shared->baked_units.units_count = params->units.total_count+1;\r\n      rdim_shared->baked_units.units = push_array(arena, RDI_Unit, rdim_shared->baked_units.units_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1))\r\n    {\r\n      rdim_shared->baked_type_nodes.type_nodes_count = params->types.total_count+1;\r\n      rdim_shared->baked_type_nodes.type_nodes = push_array(arena, RDI_TypeNode, rdim_shared->baked_type_nodes.type_nodes_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(2))\r\n    {\r\n      rdim_shared->baked_global_variables.global_variables_count = params->global_variables.total_count+1;\r\n      rdim_shared->baked_global_variables.global_variables = push_array(arena, RDI_GlobalVariable, rdim_shared->baked_global_variables.global_variables_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(3))\r\n    {\r\n      rdim_shared->baked_thread_variables.thread_variables_count = params->thread_variables.total_count+1;\r\n      rdim_shared->baked_thread_variables.thread_variables = push_array(arena, RDI_ThreadVariable, rdim_shared->baked_thread_variables.thread_variables_count);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(4))\r\n    {\r\n      rdim_shared->baked_inline_sites.inline_sites_count = params->inline_sites.total_count+1;\r\n      rdim_shared->baked_inline_sites.inline_sites = push_array(arena, RDI_InlineSite, rdim_shared->baked_inline_sites.inline_sites_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: bake units\r\n    ProfScope(\"bake units\")\r\n    {\r\n      for EachNode(n, RDIM_UnitChunkNode, params->units.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_Unit *src = &n->v[n_idx];\r\n          RDI_Unit *dst = &rdim_shared->baked_units.units[n->base_idx + n_idx + 1];\r\n          dst->unit_name_string_idx     = rdim_bake_idx_from_string(bake_strings, src->unit_name);\r\n          dst->compiler_name_string_idx = rdim_bake_idx_from_string(bake_strings, src->compiler_name);\r\n          dst->source_file_path_node    = rdim_bake_path_node_idx_from_string(path_tree, src->source_file);\r\n          dst->object_file_path_node    = rdim_bake_path_node_idx_from_string(path_tree, src->object_file);\r\n          dst->archive_file_path_node   = rdim_bake_path_node_idx_from_string(path_tree, src->archive_file);\r\n          dst->build_path_node          = rdim_bake_path_node_idx_from_string(path_tree, src->build_path);\r\n          dst->language                 = src->language;\r\n          dst->line_table_idx           = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: bake type nodes\r\n    ProfScope(\"bake type nodes\")\r\n    {\r\n      for EachNode(n, RDIM_TypeChunkNode, params->types.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_Type *src = &n->v[n_idx];\r\n          RDI_TypeNode *dst = &rdim_shared->baked_type_nodes.type_nodes[n->base_idx + n_idx + 1];\r\n          \r\n          //- rjf: fill shared type node info\r\n          dst->kind      = src->kind;\r\n          dst->flags     = (RDI_U16)src->flags; // TODO(rjf): @u32_to_u16\r\n          dst->byte_size = src->byte_size;\r\n          \r\n          //- rjf: fill built-in-only type node info\r\n          if(RDI_TypeKind_FirstBuiltIn <= dst->kind && dst->kind <= RDI_TypeKind_LastBuiltIn)\r\n          {\r\n            dst->built_in.name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name);\r\n          }\r\n          \r\n          //- rjf: fill array sizes\r\n          else if(dst->kind == RDI_TypeKind_Array)\r\n          {\r\n            U64 direct_byte_size = 1;\r\n            if(src->direct_type && src->direct_type->byte_size > 0)\r\n            {\r\n              direct_byte_size = src->direct_type->byte_size;\r\n            }\r\n            dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type);\r\n            dst->constructed.count           = src->byte_size / direct_byte_size;\r\n          }\r\n          \r\n          //- rjf: fill constructed type node info\r\n          else if(RDI_TypeKind_FirstConstructed <= dst->kind && dst->kind <= RDI_TypeKind_LastConstructed)\r\n          {\r\n            dst->constructed.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32\r\n            dst->constructed.count = src->count;\r\n            if(dst->kind == RDI_TypeKind_Function || dst->kind == RDI_TypeKind_Method)\r\n            {\r\n              RDI_U32 param_idx_run_count = src->count;\r\n              RDI_U32 *param_idx_run = rdim_push_array_no_zero(arena, RDI_U32, param_idx_run_count);\r\n              for(RDI_U32 idx = 0; idx < param_idx_run_count; idx += 1)\r\n              {\r\n                param_idx_run[idx] = (RDI_U32)rdim_idx_from_type(src->param_types[idx]); // TODO(rjf): @u64_to_u32\r\n              }\r\n              dst->constructed.param_idx_run_first = rdim_bake_idx_from_idx_run(bake_idx_runs, param_idx_run, param_idx_run_count);\r\n            }\r\n            else if(dst->kind == RDI_TypeKind_MemberPtr)\r\n            {\r\n              // TODO(rjf): member pointers not currently supported.\r\n            }\r\n          }\r\n          \r\n          //- rjf: fill user-defined-type info\r\n          else if(RDI_TypeKind_FirstUserDefined <= dst->kind && dst->kind <= RDI_TypeKind_LastUserDefined)\r\n          {\r\n            dst->user_defined.name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name);\r\n            dst->user_defined.udt_idx         = (RDI_U32)rdim_idx_from_udt(src->udt); // TODO(rjf): @u64_to_u32\r\n            dst->user_defined.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32\r\n          }\r\n          \r\n          //- rjf: fill bitfield info\r\n          else if(dst->kind == RDI_TypeKind_Bitfield)\r\n          {\r\n            dst->bitfield.direct_type_idx = (RDI_U32)rdim_idx_from_type(src->direct_type); // TODO(rjf): @u64_to_u32\r\n            dst->bitfield.off  = src->off;\r\n            dst->bitfield.size = src->count;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: bake global variables\r\n    ProfScope(\"bake global variables\")\r\n    {\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->global_variables.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_Symbol *src = &n->v[n_idx];\r\n          RDI_GlobalVariable *dst = &rdim_shared->baked_global_variables.global_variables[n->base_idx + n_idx + 1];\r\n          dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name);\r\n          dst->voff            = src->offset;\r\n          dst->type_idx        = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32\r\n          if(src->is_extern)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_External;\r\n          }\r\n          if(src->container_type != 0)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_TypeScoped;\r\n            dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32\r\n          }\r\n          else if(src->container_symbol != 0)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_ProcScoped;\r\n            dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: bake thread variables\r\n    ProfScope(\"bake thread variables\")\r\n    {\r\n      for EachNode(n, RDIM_SymbolChunkNode, params->thread_variables.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDIM_Symbol *src = &n->v[n_idx];\r\n          RDI_ThreadVariable *dst = &rdim_shared->baked_thread_variables.thread_variables[n->base_idx + n_idx + 1];\r\n          dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name);\r\n          dst->tls_off         = (RDI_U32)src->offset; // TODO(rjf): @u64_to_u32\r\n          dst->type_idx        = (RDI_U32)rdim_idx_from_type(src->type);\r\n          if(src->is_extern)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_External;\r\n          }\r\n          if(src->container_type != 0)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_TypeScoped;\r\n            dst->container_idx = src->container_type ? (RDI_U32)rdim_idx_from_udt(src->container_type->udt) : 0; // TODO(rjf): @u64_to_u32\r\n          }\r\n          else if(src->container_symbol != 0)\r\n          {\r\n            dst->link_flags |= RDI_LinkFlag_ProcScoped;\r\n            dst->container_idx = (RDI_U32)rdim_idx_from_symbol(src->container_symbol); // TODO(rjf): @u64_to_u32\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: bake inline sites\r\n    ProfScope(\"bake inline sites\")\r\n    {\r\n      for EachNode(n, RDIM_InlineSiteChunkNode, params->inline_sites.first)\r\n      {\r\n        Rng1U64 range = lane_range(n->count);\r\n        for EachInRange(n_idx, range)\r\n        {\r\n          RDI_InlineSite *dst = &rdim_shared->baked_inline_sites.inline_sites[n->base_idx + n_idx + 1];\r\n          RDIM_InlineSite *src = &n->v[n_idx];\r\n          dst->name_string_idx   = rdim_bake_idx_from_string(bake_strings, src->name);\r\n          dst->type_idx          = (RDI_U32)rdim_idx_from_type(src->type); // TODO(rjf): @u64_to_u32\r\n          dst->owner_type_idx    = (RDI_U32)rdim_idx_from_type(src->owner); // TODO(rjf): @u64_to_u32\r\n          dst->line_table_idx    = (RDI_U32)rdim_idx_from_line_table(src->line_table); // TODO(rjf): @u64_to_u32\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage bake file paths\r\n  //\r\n  ProfScope(\"bake file paths\")\r\n  {\r\n    // rjf: set up\r\n    if(lane_idx() == 0)\r\n    {\r\n      rdim_shared->baked_file_paths.nodes_count = path_tree->count;\r\n      rdim_shared->baked_file_paths.nodes = push_array(arena, RDI_FilePathNode, rdim_shared->baked_file_paths.nodes_count);\r\n      rdim_shared->baked_file_path_src_nodes = push_array(arena, RDIM_BakePathNode *, rdim_shared->baked_file_paths.nodes_count);\r\n      {\r\n        U64 idx = 0;\r\n        for(RDIM_BakePathNode *n = path_tree->first; n != 0; n = n->next_order)\r\n        {\r\n          rdim_shared->baked_file_path_src_nodes[idx] = n;\r\n          idx += 1;\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    \r\n    // rjf: fill\r\n    {\r\n      Rng1U64 range = lane_range(rdim_shared->baked_file_paths.nodes_count);\r\n      for EachInRange(idx, range)\r\n      {\r\n        RDIM_BakePathNode *src = rdim_shared->baked_file_path_src_nodes[idx];\r\n        RDI_FilePathNode *dst = &rdim_shared->baked_file_paths.nodes[idx];\r\n        dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name);\r\n        dst->source_file_idx = rdim_idx_from_src_file(src->src_file);\r\n        if(src->parent != 0)\r\n        {\r\n          dst->parent_path_node = src->parent->idx;\r\n        }\r\n        if(src->first_child != 0)\r\n        {\r\n          dst->first_child = src->first_child->idx;\r\n        }\r\n        if(src->next_sibling != 0)\r\n        {\r\n          dst->next_sibling = src->next_sibling->idx;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage do small final baking tasks\r\n  //\r\n  ProfScope(\"do small final baking tasks\")\r\n  {\r\n    if(lane_idx() == lane_from_task_idx(0)) ProfScope(\"bake top level info\")\r\n    {\r\n      rdim_shared->baked_top_level_info.top_level_info.arch                     = params->top_level_info.arch;\r\n      rdim_shared->baked_top_level_info.top_level_info.exe_name_string_idx      = rdim_bake_idx_from_string(bake_strings, params->top_level_info.exe_name);\r\n      rdim_shared->baked_top_level_info.top_level_info.exe_hash                 = params->top_level_info.exe_hash;\r\n      rdim_shared->baked_top_level_info.top_level_info.voff_max                 = params->top_level_info.voff_max;\r\n      rdim_shared->baked_top_level_info.top_level_info.guid                     = params->top_level_info.guid;\r\n      rdim_shared->baked_top_level_info.top_level_info.producer_name_string_idx = rdim_bake_idx_from_string(bake_strings, params->top_level_info.producer_name);\r\n    }\r\n    if(lane_idx() == lane_from_task_idx(1)) ProfScope(\"bake binary sections\")\r\n    {\r\n      RDIM_BinarySectionList *src = &params->binary_sections;\r\n      RDI_BinarySection *dst_base = rdim_push_array(arena, RDI_BinarySection, src->count+1);\r\n      U64 dst_idx = 1;\r\n      for(RDIM_BinarySectionNode *src_n = src->first; src_n != 0; src_n = src_n->next, dst_idx += 1)\r\n      {\r\n        RDIM_BinarySection *src = &src_n->v;\r\n        RDI_BinarySection *dst = &dst_base[dst_idx];\r\n        dst->name_string_idx = rdim_bake_idx_from_string(bake_strings, src->name);\r\n        dst->flags           = src->flags;\r\n        dst->voff_first      = src->voff_first;\r\n        dst->voff_opl        = src->voff_opl;\r\n        dst->foff_first      = src->foff_first;\r\n        dst->foff_opl        = src->foff_opl;\r\n      }\r\n      rdim_shared->baked_binary_sections.binary_sections = dst_base;\r\n      rdim_shared->baked_binary_sections.binary_sections_count = dst_idx;\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  //////////////////////////////////////////////////////////////\r\n  //- rjf: @rdim_bake_stage package results\r\n  //\r\n  RDIM_BakeResults result = {0};\r\n  {\r\n    result.top_level_info         = rdim_shared->baked_top_level_info;\r\n    result.binary_sections        = rdim_shared->baked_binary_sections;\r\n    result.units                  = rdim_shared->baked_units;\r\n    result.unit_vmap              = rdim_shared->baked_unit_vmap;\r\n    result.src_files              = rdim_shared->baked_src_files;\r\n    result.checksums              = rdim_shared->baked_checksums;\r\n    result.line_tables            = rdim_shared->baked_line_tables;\r\n    result.type_nodes             = rdim_shared->baked_type_nodes;\r\n    result.udts                   = rdim_shared->baked_udts;\r\n    result.global_variables       = rdim_shared->baked_global_variables;\r\n    result.global_vmap            = rdim_shared->baked_global_vmap;\r\n    result.thread_variables       = rdim_shared->baked_thread_variables;\r\n    result.constants              = rdim_shared->baked_constants;\r\n    result.procedures             = rdim_shared->baked_procedures;\r\n    result.scopes                 = rdim_shared->baked_scopes;\r\n    result.inline_sites           = rdim_shared->baked_inline_sites;\r\n    result.scope_vmap             = rdim_shared->baked_scope_vmap;\r\n    result.top_level_name_maps    = rdim_shared->baked_top_level_name_maps;\r\n    result.name_maps              = rdim_shared->baked_name_maps;\r\n    result.file_paths             = rdim_shared->baked_file_paths;\r\n    result.strings                = rdim_shared->baked_strings;\r\n    result.idx_runs               = rdim_shared->baked_idx_runs;\r\n    result.locations              = rdim_shared->baked_locations;\r\n    result.location_blocks        = rdim_shared->baked_location_blocks;\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal RDIM_SerializedSectionBundle\r\nrdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  RDIM_SerializedSectionBundle out_ = {0};\r\n  RDIM_SerializedSectionBundle *out = &out_;\r\n  lane_sync_u64(&out, 0);\r\n  \r\n  //- rjf: set up compression context\r\n  rr_lzb_simple_context ctx = {0};\r\n  ctx.m_tableSizeBits = 14;\r\n  ctx.m_hashTable = push_array(scratch.arena, U16, 1<<ctx.m_tableSizeBits);\r\n  \r\n  //- rjf: compress, or just copy, all sections\r\n  Rng1U64 range = lane_range(RDI_SectionKind_COUNT);\r\n  for EachInRange(idx, range)\r\n  {\r\n    RDI_SectionKind k = (RDI_SectionKind)idx;\r\n    RDIM_SerializedSection *src = &in->sections[k];\r\n    RDIM_SerializedSection *dst = &out->sections[k];\r\n    MemoryCopyStruct(dst, src);\r\n    if(src->encoded_size != 0)\r\n    {\r\n      MemoryZero(ctx.m_hashTable, sizeof(U16)*(1<<ctx.m_tableSizeBits));\r\n      dst->data = push_array_no_zero(arena, U8, src->encoded_size);\r\n      dst->encoded_size = rr_lzb_simple_encode_veryfast(&ctx, src->data, src->encoded_size, dst->data);\r\n      dst->unpacked_size = src->encoded_size;\r\n      dst->encoding = RDI_SectionEncoding_LZB;\r\n    }\r\n  }\r\n  lane_sync();\r\n  \r\n  scratch_end(scratch);\r\n  return *out;\r\n}\r\n"
  },
  {
    "path": "src/rdi_make/rdi_make_local.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RDI_MAKE_LOCAL_H\r\n#define RDI_MAKE_LOCAL_H\r\n\r\n//- rjf: base layer memory ops\r\n#define RDIM_MEMSET_OVERRIDE\r\n#define RDIM_MEMCPY_OVERRIDE\r\n#define rdim_memset MemorySet\r\n#define rdim_memcpy MemoryCopy\r\n\r\n//- rjf: base layer string overrides\r\n#define RDI_STRING8_OVERRIDE\r\n#define RDIM_String8            String8\r\n#define RDIM_String8_BaseMember str\r\n#define RDIM_String8_SizeMember size\r\n#define RDI_STRING8LIST_OVERRIDE\r\n#define RDIM_String8Node                 String8Node\r\n#define RDIM_String8Node_NextPtrMember   next\r\n#define RDIM_String8Node_StringMember    string\r\n#define RDIM_String8List                 String8List\r\n#define RDIM_String8List_FirstMember     first\r\n#define RDIM_String8List_LastMember      last\r\n#define RDIM_String8List_NodeCountMember node_count\r\n#define RDIM_String8List_TotalSizeMember total_size\r\n\r\n//- rjf: base layer arena overrides\r\n#define RDIM_ARENA_OVERRIDE\r\n#define RDIM_Arena Arena\r\n#define rdim_arena_alloc     arena_alloc\r\n#define rdim_arena_release   arena_release\r\n#define rdim_arena_pos       arena_pos\r\n#define rdim_arena_push      arena_push\r\n#define rdim_arena_pop_to    arena_pop_to\r\n\r\n//- rjf: base layer scratch arena overrides\r\n#define RDIM_SCRATCH_OVERRIDE\r\n#define RDIM_Temp Temp\r\n#define rdim_temp_arena(t)   ((t).arena)\r\n#define rdim_scratch_begin   scratch_begin\r\n#define rdim_scratch_end     scratch_end\r\n\r\n//- rjf: base layer profiling markup overrides\r\n#define RDIM_ProfBegin(...) ProfBeginDynamic(__VA_ARGS__)\r\n#define RDIM_ProfEnd(...) ProfEnd()\r\n\r\n//- rjf: main library\r\n#include \"lib_rdi_make/rdi_make.h\"\r\n\r\n//- rjf: unsorted joined line table info\r\n\r\ntypedef struct RDIM_UnsortedJoinedLineTable RDIM_UnsortedJoinedLineTable;\r\nstruct RDIM_UnsortedJoinedLineTable\r\n{\r\n  RDI_U64 line_count;\r\n  RDI_U64 seq_count;\r\n  RDI_U64 key_count;\r\n  RDIM_SortKey *line_keys;\r\n  RDIM_LineRec *line_recs;\r\n};\r\n\r\n//- rjf: shared state bundle\r\n\r\ntypedef struct RDIM_Shared RDIM_Shared;\r\nstruct RDIM_Shared\r\n{\r\n  RDIM_ScopeVMapBakeResult baked_scope_vmap;\r\n  RDIM_UnitVMapBakeResult baked_unit_vmap;\r\n  RDIM_GlobalVMapBakeResult baked_global_vmap;\r\n  \r\n  RDIM_BakePathTree *path_tree;\r\n  \r\n  RDI_U64 line_tables_count;\r\n  RDI_U64 line_table_block_take_counter;\r\n  RDIM_LineTable **src_line_tables;\r\n  RDIM_UnsortedJoinedLineTable *unsorted_joined_line_tables;\r\n  \r\n  RDIM_SortKey **sorted_line_table_keys;\r\n  \r\n  RDIM_LineTableBakeResult baked_line_tables;\r\n  \r\n  RDIM_BakeStringMapTight bake_strings;\r\n  \r\n  RDIM_BakeIdxRunMap bake_idx_runs;\r\n  \r\n  RDIM_StringBakeResult baked_strings;\r\n  \r\n  RDIM_IndexRunBakeResult baked_idx_runs;\r\n  \r\n  RDI_U64 *lane_name_map_node_counts[RDI_NameMapKind_COUNT];\r\n  RDI_U64 *lane_name_map_node_offs[RDI_NameMapKind_COUNT];\r\n  RDI_U64 name_map_node_counts[RDI_NameMapKind_COUNT];\r\n  RDI_U64 total_name_map_node_count;\r\n  RDIM_TopLevelNameMapBakeResult baked_top_level_name_maps;\r\n  RDIM_NameMapBakeResult baked_name_maps;\r\n  \r\n  RDIM_BakeSrcLineMap *bake_src_line_maps;\r\n  \r\n  RDI_U64 bake_src_line_map_take_counter;\r\n  RDIM_SortKey **bake_src_line_map_keys;\r\n  \r\n  RDI_U64 *lane_chunk_src_file_num_counts; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_voff_counts; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_map_counts; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_num_offs; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_voff_offs; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_map_offs; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_checksum_counts[RDI_ChecksumKind_COUNT]; // [lane_count * src_file_chunk_count]\r\n  RDI_U64 *lane_chunk_src_file_checksum_offs[RDI_ChecksumKind_COUNT]; // [lane_count * src_file_chunk_count]\r\n  U64 total_checksum_counts[RDI_ChecksumKind_COUNT];\r\n  RDI_U64 total_src_map_line_count;\r\n  RDI_U64 total_src_map_voff_count;\r\n  \r\n  RDIM_ChecksumBakeResult baked_checksums;\r\n  \r\n  RDIM_SrcFileBakeResult baked_src_files;\r\n  \r\n  RDI_U64 *member_chunk_lane_counts; // [lane_count * udt_chunk_count]\r\n  RDI_U64 *member_chunk_lane_offs; // [lane_count * udt_chunk_count]\r\n  RDI_U64 *enum_val_chunk_lane_counts; // [lane_count * udt_chunk_count]\r\n  RDI_U64 *enum_val_chunk_lane_offs; // [lane_count * udt_chunk_count]\r\n  \r\n  RDIM_UDTBakeResult baked_udts;\r\n  \r\n  RDI_U64 *location_case_chunk_lane_counts; // [lane_count * (scope_chunk_count + procedure_chunk_count)\r\n  RDI_U64 *location_case_chunk_lane_offs; // [lane_count * (scope_chunk_count + procedure_chunk_count)\r\n  RDI_U64 total_location_case_count;\r\n  \r\n  RDIM_LocationBlockBakeResult baked_location_blocks;\r\n  \r\n  RDIM_LocationBakeResult baked_locations;\r\n  \r\n  RDI_U64 *scope_local_chunk_lane_counts; // [lane_count * scope_chunk_count]\r\n  RDI_U64 *scope_local_chunk_lane_offs; // [lane_count * scope_chunk_count]\r\n  RDI_U64 *scope_voff_chunk_lane_counts; // [lane_count * scope_chunk_count]\r\n  RDI_U64 *scope_voff_chunk_lane_offs; // [lane_count * scope_chunk_count]\r\n  \r\n  RDIM_ScopeBakeResult baked_scopes;\r\n  \r\n  RDIM_ProcedureBakeResult baked_procedures;\r\n  \r\n  RDI_U64 *constant_data_chunk_lane_counts; // [lane_count * constant_chunk_count]\r\n  RDI_U64 *constant_data_chunk_lane_offs; // [lane_count * constant_chunk_count]\r\n  \r\n  RDIM_ConstantsBakeResult baked_constants;\r\n  \r\n  RDIM_UnitBakeResult baked_units;\r\n  RDIM_TypeNodeBakeResult baked_type_nodes;\r\n  RDIM_GlobalVariableBakeResult baked_global_variables;\r\n  RDIM_ThreadVariableBakeResult baked_thread_variables;\r\n  RDIM_InlineSiteBakeResult baked_inline_sites;\r\n  \r\n  RDIM_BakePathNode **baked_file_path_src_nodes;\r\n  RDIM_FilePathBakeResult baked_file_paths;\r\n  \r\n  RDIM_TopLevelInfoBakeResult baked_top_level_info;\r\n  RDIM_BinarySectionBakeResult baked_binary_sections;\r\n};\r\n\r\nglobal RDIM_Shared *rdim_shared = 0;\r\n\r\ninternal RDIM_DataModel rdim_data_model_from_os_arch(OperatingSystem os, RDI_Arch arch);\r\ninternal RDIM_BakeResults rdim_bake(Arena *arena, RDIM_BakeParams *params);\r\ninternal RDIM_SerializedSectionBundle rdim_compress(Arena *arena, RDIM_SerializedSectionBundle *in);\r\n\r\n#endif // RDI_MAKE_LOCAL_H\r\n"
  },
  {
    "path": "src/regs/generated/regs.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\ninternal U64 regs_block_size_from_arch(Arch arch)\r\n{\r\nU64 result = 8;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = sizeof(REGS_RegBlockX64);}break;\r\ncase Arch_x86:{result = sizeof(REGS_RegBlockX86);}break;\r\n}\r\nreturn result;\r\n}\r\ninternal U64 regs_reg_code_count_from_arch(Arch arch)\r\n{\r\nU64 result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = REGS_RegCodeX64_COUNT;}break;\r\ncase Arch_x86:{result = REGS_RegCodeX86_COUNT;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal U64 regs_alias_code_count_from_arch(Arch arch)\r\n{\r\nU64 result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = REGS_AliasCodeX64_COUNT;}break;\r\ncase Arch_x86:{result = REGS_AliasCodeX86_COUNT;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal String8 *regs_reg_code_string_table_from_arch(Arch arch)\r\n{\r\nString8 *result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = regs_g_reg_code_x64_string_table;}break;\r\ncase Arch_x86:{result = regs_g_reg_code_x86_string_table;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal String8 *regs_alias_code_string_table_from_arch(Arch arch)\r\n{\r\nString8 *result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = regs_g_alias_code_x64_string_table;}break;\r\ncase Arch_x86:{result = regs_g_alias_code_x86_string_table;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch)\r\n{\r\nREGS_Rng *result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = regs_g_reg_code_x64_rng_table;}break;\r\ncase Arch_x86:{result = regs_g_reg_code_x86_rng_table;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch)\r\n{\r\nREGS_Slice *result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = regs_g_alias_code_x64_slice_table;}break;\r\ncase Arch_x86:{result = regs_g_alias_code_x86_slice_table;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch)\r\n{\r\nREGS_UsageKind *result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = regs_g_reg_code_x64_usage_kind_table;}break;\r\ncase Arch_x86:{result = regs_g_reg_code_x86_usage_kind_table;}break;\r\n}\r\nreturn result;\r\n}\r\ninternal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch)\r\n{\r\nREGS_UsageKind *result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:{result = regs_g_alias_code_x64_usage_kind_table;}break;\r\ncase Arch_x86:{result = regs_g_alias_code_x86_usage_kind_table;}break;\r\n}\r\nreturn result;\r\n}\r\nC_LINKAGE_BEGIN\r\nREGS_UsageKind regs_g_reg_code_x64_usage_kind_table[105] =\r\n{\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\n};\r\n\r\nREGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96] =\r\n{\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\n};\r\n\r\nString8 regs_g_reg_code_x64_string_table[105] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"rax\"),\r\nstr8_lit_comp(\"rcx\"),\r\nstr8_lit_comp(\"rdx\"),\r\nstr8_lit_comp(\"rbx\"),\r\nstr8_lit_comp(\"rsp\"),\r\nstr8_lit_comp(\"rbp\"),\r\nstr8_lit_comp(\"rsi\"),\r\nstr8_lit_comp(\"rdi\"),\r\nstr8_lit_comp(\"r8\"),\r\nstr8_lit_comp(\"r9\"),\r\nstr8_lit_comp(\"r10\"),\r\nstr8_lit_comp(\"r11\"),\r\nstr8_lit_comp(\"r12\"),\r\nstr8_lit_comp(\"r13\"),\r\nstr8_lit_comp(\"r14\"),\r\nstr8_lit_comp(\"r15\"),\r\nstr8_lit_comp(\"fsbase\"),\r\nstr8_lit_comp(\"gsbase\"),\r\nstr8_lit_comp(\"rip\"),\r\nstr8_lit_comp(\"rflags\"),\r\nstr8_lit_comp(\"dr0\"),\r\nstr8_lit_comp(\"dr1\"),\r\nstr8_lit_comp(\"dr2\"),\r\nstr8_lit_comp(\"dr3\"),\r\nstr8_lit_comp(\"dr4\"),\r\nstr8_lit_comp(\"dr5\"),\r\nstr8_lit_comp(\"dr6\"),\r\nstr8_lit_comp(\"dr7\"),\r\nstr8_lit_comp(\"fpr0\"),\r\nstr8_lit_comp(\"fpr1\"),\r\nstr8_lit_comp(\"fpr2\"),\r\nstr8_lit_comp(\"fpr3\"),\r\nstr8_lit_comp(\"fpr4\"),\r\nstr8_lit_comp(\"fpr5\"),\r\nstr8_lit_comp(\"fpr6\"),\r\nstr8_lit_comp(\"fpr7\"),\r\nstr8_lit_comp(\"st0\"),\r\nstr8_lit_comp(\"st1\"),\r\nstr8_lit_comp(\"st2\"),\r\nstr8_lit_comp(\"st3\"),\r\nstr8_lit_comp(\"st4\"),\r\nstr8_lit_comp(\"st5\"),\r\nstr8_lit_comp(\"st6\"),\r\nstr8_lit_comp(\"st7\"),\r\nstr8_lit_comp(\"fcw\"),\r\nstr8_lit_comp(\"fsw\"),\r\nstr8_lit_comp(\"ftw\"),\r\nstr8_lit_comp(\"fop\"),\r\nstr8_lit_comp(\"fcs\"),\r\nstr8_lit_comp(\"fds\"),\r\nstr8_lit_comp(\"fip\"),\r\nstr8_lit_comp(\"fdp\"),\r\nstr8_lit_comp(\"mxcsr\"),\r\nstr8_lit_comp(\"mxcsr_mask\"),\r\nstr8_lit_comp(\"ss\"),\r\nstr8_lit_comp(\"cs\"),\r\nstr8_lit_comp(\"ds\"),\r\nstr8_lit_comp(\"es\"),\r\nstr8_lit_comp(\"fs\"),\r\nstr8_lit_comp(\"gs\"),\r\nstr8_lit_comp(\"zmm0\"),\r\nstr8_lit_comp(\"zmm1\"),\r\nstr8_lit_comp(\"zmm2\"),\r\nstr8_lit_comp(\"zmm3\"),\r\nstr8_lit_comp(\"zmm4\"),\r\nstr8_lit_comp(\"zmm5\"),\r\nstr8_lit_comp(\"zmm6\"),\r\nstr8_lit_comp(\"zmm7\"),\r\nstr8_lit_comp(\"zmm8\"),\r\nstr8_lit_comp(\"zmm9\"),\r\nstr8_lit_comp(\"zmm10\"),\r\nstr8_lit_comp(\"zmm11\"),\r\nstr8_lit_comp(\"zmm12\"),\r\nstr8_lit_comp(\"zmm13\"),\r\nstr8_lit_comp(\"zmm14\"),\r\nstr8_lit_comp(\"zmm15\"),\r\nstr8_lit_comp(\"zmm16\"),\r\nstr8_lit_comp(\"zmm17\"),\r\nstr8_lit_comp(\"zmm18\"),\r\nstr8_lit_comp(\"zmm19\"),\r\nstr8_lit_comp(\"zmm20\"),\r\nstr8_lit_comp(\"zmm21\"),\r\nstr8_lit_comp(\"zmm22\"),\r\nstr8_lit_comp(\"zmm23\"),\r\nstr8_lit_comp(\"zmm24\"),\r\nstr8_lit_comp(\"zmm25\"),\r\nstr8_lit_comp(\"zmm26\"),\r\nstr8_lit_comp(\"zmm27\"),\r\nstr8_lit_comp(\"zmm28\"),\r\nstr8_lit_comp(\"zmm29\"),\r\nstr8_lit_comp(\"zmm30\"),\r\nstr8_lit_comp(\"zmm31\"),\r\nstr8_lit_comp(\"k0\"),\r\nstr8_lit_comp(\"k1\"),\r\nstr8_lit_comp(\"k2\"),\r\nstr8_lit_comp(\"k3\"),\r\nstr8_lit_comp(\"k4\"),\r\nstr8_lit_comp(\"k5\"),\r\nstr8_lit_comp(\"k6\"),\r\nstr8_lit_comp(\"k7\"),\r\nstr8_lit_comp(\"cetmsr\"),\r\nstr8_lit_comp(\"cetssp\"),\r\nstr8_lit_comp(\"tr\"),\r\nstr8_lit_comp(\"ldtr\"),\r\n};\r\n\r\nString8 regs_g_alias_code_x64_string_table[96] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"eax\"),\r\nstr8_lit_comp(\"ecx\"),\r\nstr8_lit_comp(\"edx\"),\r\nstr8_lit_comp(\"ebx\"),\r\nstr8_lit_comp(\"esp\"),\r\nstr8_lit_comp(\"ebp\"),\r\nstr8_lit_comp(\"esi\"),\r\nstr8_lit_comp(\"edi\"),\r\nstr8_lit_comp(\"r8d\"),\r\nstr8_lit_comp(\"r9d\"),\r\nstr8_lit_comp(\"r10d\"),\r\nstr8_lit_comp(\"r11d\"),\r\nstr8_lit_comp(\"r12d\"),\r\nstr8_lit_comp(\"r13d\"),\r\nstr8_lit_comp(\"r14d\"),\r\nstr8_lit_comp(\"r15d\"),\r\nstr8_lit_comp(\"eip\"),\r\nstr8_lit_comp(\"eflags\"),\r\nstr8_lit_comp(\"ax\"),\r\nstr8_lit_comp(\"cx\"),\r\nstr8_lit_comp(\"dx\"),\r\nstr8_lit_comp(\"bx\"),\r\nstr8_lit_comp(\"si\"),\r\nstr8_lit_comp(\"di\"),\r\nstr8_lit_comp(\"sp\"),\r\nstr8_lit_comp(\"bp\"),\r\nstr8_lit_comp(\"ip\"),\r\nstr8_lit_comp(\"r8w\"),\r\nstr8_lit_comp(\"r9w\"),\r\nstr8_lit_comp(\"r10w\"),\r\nstr8_lit_comp(\"r11w\"),\r\nstr8_lit_comp(\"r12w\"),\r\nstr8_lit_comp(\"r13w\"),\r\nstr8_lit_comp(\"r14w\"),\r\nstr8_lit_comp(\"r15w\"),\r\nstr8_lit_comp(\"al\"),\r\nstr8_lit_comp(\"cl\"),\r\nstr8_lit_comp(\"dl\"),\r\nstr8_lit_comp(\"bl\"),\r\nstr8_lit_comp(\"sil\"),\r\nstr8_lit_comp(\"dil\"),\r\nstr8_lit_comp(\"bpl\"),\r\nstr8_lit_comp(\"spl\"),\r\nstr8_lit_comp(\"r8b\"),\r\nstr8_lit_comp(\"r9b\"),\r\nstr8_lit_comp(\"r10b\"),\r\nstr8_lit_comp(\"r11b\"),\r\nstr8_lit_comp(\"r12b\"),\r\nstr8_lit_comp(\"r13b\"),\r\nstr8_lit_comp(\"r14b\"),\r\nstr8_lit_comp(\"r15b\"),\r\nstr8_lit_comp(\"ah\"),\r\nstr8_lit_comp(\"ch\"),\r\nstr8_lit_comp(\"dh\"),\r\nstr8_lit_comp(\"bh\"),\r\nstr8_lit_comp(\"xmm0\"),\r\nstr8_lit_comp(\"xmm1\"),\r\nstr8_lit_comp(\"xmm2\"),\r\nstr8_lit_comp(\"xmm3\"),\r\nstr8_lit_comp(\"xmm4\"),\r\nstr8_lit_comp(\"xmm5\"),\r\nstr8_lit_comp(\"xmm6\"),\r\nstr8_lit_comp(\"xmm7\"),\r\nstr8_lit_comp(\"xmm8\"),\r\nstr8_lit_comp(\"xmm9\"),\r\nstr8_lit_comp(\"xmm10\"),\r\nstr8_lit_comp(\"xmm11\"),\r\nstr8_lit_comp(\"xmm12\"),\r\nstr8_lit_comp(\"xmm13\"),\r\nstr8_lit_comp(\"xmm14\"),\r\nstr8_lit_comp(\"xmm15\"),\r\nstr8_lit_comp(\"ymm0\"),\r\nstr8_lit_comp(\"ymm1\"),\r\nstr8_lit_comp(\"ymm2\"),\r\nstr8_lit_comp(\"ymm3\"),\r\nstr8_lit_comp(\"ymm4\"),\r\nstr8_lit_comp(\"ymm5\"),\r\nstr8_lit_comp(\"ymm6\"),\r\nstr8_lit_comp(\"ymm7\"),\r\nstr8_lit_comp(\"ymm8\"),\r\nstr8_lit_comp(\"ymm9\"),\r\nstr8_lit_comp(\"ymm10\"),\r\nstr8_lit_comp(\"ymm11\"),\r\nstr8_lit_comp(\"ymm12\"),\r\nstr8_lit_comp(\"ymm13\"),\r\nstr8_lit_comp(\"ymm14\"),\r\nstr8_lit_comp(\"ymm15\"),\r\nstr8_lit_comp(\"mm0\"),\r\nstr8_lit_comp(\"mm1\"),\r\nstr8_lit_comp(\"mm2\"),\r\nstr8_lit_comp(\"mm3\"),\r\nstr8_lit_comp(\"mm4\"),\r\nstr8_lit_comp(\"mm5\"),\r\nstr8_lit_comp(\"mm6\"),\r\nstr8_lit_comp(\"mm7\"),\r\n};\r\n\r\nREGS_Rng regs_g_reg_code_x64_rng_table[105] =\r\n{\r\n{0},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rax), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rcx), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rdx), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rbx), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rsp), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rbp), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rsi), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rdi), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r8), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r9), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r10), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r11), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r12), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r13), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r14), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, r15), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fsbase), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, gsbase), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rip), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, rflags), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr0), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr1), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr2), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr3), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr4), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr5), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr6), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, dr7), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr0), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr1), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr2), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr3), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr4), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr5), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr6), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fpr7), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st0), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st1), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st2), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st3), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st4), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st5), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st6), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, st7), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fcw), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fsw), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, ftw), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fop), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fcs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fds), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fip), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fdp), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, mxcsr), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX64, mxcsr_mask), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX64, ss), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, cs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, ds), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, es), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, fs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, gs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm0), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm1), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm2), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm3), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm4), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm5), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm6), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm7), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm8), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm9), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm10), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm11), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm12), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm13), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm14), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm15), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm16), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm17), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm18), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm19), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm20), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm21), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm22), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm23), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm24), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm25), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm26), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm27), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm28), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm29), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm30), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, zmm31), 64},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k0), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k1), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k2), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k3), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k4), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k5), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k6), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, k7), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, cetmsr), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, cetssp), 8},\r\n{(U16)OffsetOf(REGS_RegBlockX64, tr), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX64, ldtr), 2},\r\n};\r\n\r\nREGS_Slice regs_g_alias_code_x64_slice_table[96] =\r\n{\r\n{0},\r\n{REGS_RegCodeX64_rax, 0, 4},\r\n{REGS_RegCodeX64_rcx, 0, 4},\r\n{REGS_RegCodeX64_rdx, 0, 4},\r\n{REGS_RegCodeX64_rbx, 0, 4},\r\n{REGS_RegCodeX64_rsp, 0, 4},\r\n{REGS_RegCodeX64_rbp, 0, 4},\r\n{REGS_RegCodeX64_rsi, 0, 4},\r\n{REGS_RegCodeX64_rdi, 0, 4},\r\n{REGS_RegCodeX64_r8, 0, 4},\r\n{REGS_RegCodeX64_r9, 0, 4},\r\n{REGS_RegCodeX64_r10, 0, 4},\r\n{REGS_RegCodeX64_r11, 0, 4},\r\n{REGS_RegCodeX64_r12, 0, 4},\r\n{REGS_RegCodeX64_r13, 0, 4},\r\n{REGS_RegCodeX64_r14, 0, 4},\r\n{REGS_RegCodeX64_r15, 0, 4},\r\n{REGS_RegCodeX64_rip, 0, 4},\r\n{REGS_RegCodeX64_rflags, 0, 4},\r\n{REGS_RegCodeX64_rax, 0, 2},\r\n{REGS_RegCodeX64_rcx, 0, 2},\r\n{REGS_RegCodeX64_rdx, 0, 2},\r\n{REGS_RegCodeX64_rbx, 0, 2},\r\n{REGS_RegCodeX64_rsi, 0, 2},\r\n{REGS_RegCodeX64_rdi, 0, 2},\r\n{REGS_RegCodeX64_rsp, 0, 2},\r\n{REGS_RegCodeX64_rbp, 0, 2},\r\n{REGS_RegCodeX64_rip, 0, 2},\r\n{REGS_RegCodeX64_r8, 0, 2},\r\n{REGS_RegCodeX64_r9, 0, 2},\r\n{REGS_RegCodeX64_r10, 0, 2},\r\n{REGS_RegCodeX64_r11, 0, 2},\r\n{REGS_RegCodeX64_r12, 0, 2},\r\n{REGS_RegCodeX64_r13, 0, 2},\r\n{REGS_RegCodeX64_r14, 0, 2},\r\n{REGS_RegCodeX64_r15, 0, 2},\r\n{REGS_RegCodeX64_rax, 0, 1},\r\n{REGS_RegCodeX64_rcx, 0, 1},\r\n{REGS_RegCodeX64_rdx, 0, 1},\r\n{REGS_RegCodeX64_rbx, 0, 1},\r\n{REGS_RegCodeX64_rsi, 0, 1},\r\n{REGS_RegCodeX64_rdi, 0, 1},\r\n{REGS_RegCodeX64_rbp, 0, 1},\r\n{REGS_RegCodeX64_rsp, 0, 1},\r\n{REGS_RegCodeX64_r8, 0, 1},\r\n{REGS_RegCodeX64_r9, 0, 1},\r\n{REGS_RegCodeX64_r10, 0, 1},\r\n{REGS_RegCodeX64_r11, 0, 1},\r\n{REGS_RegCodeX64_r12, 0, 1},\r\n{REGS_RegCodeX64_r13, 0, 1},\r\n{REGS_RegCodeX64_r14, 0, 1},\r\n{REGS_RegCodeX64_r15, 0, 1},\r\n{REGS_RegCodeX64_rax, 1, 1},\r\n{REGS_RegCodeX64_rcx, 1, 1},\r\n{REGS_RegCodeX64_rdx, 1, 1},\r\n{REGS_RegCodeX64_rbx, 1, 1},\r\n{REGS_RegCodeX64_zmm0, 0, 16},\r\n{REGS_RegCodeX64_zmm1, 0, 16},\r\n{REGS_RegCodeX64_zmm2, 0, 16},\r\n{REGS_RegCodeX64_zmm3, 0, 16},\r\n{REGS_RegCodeX64_zmm4, 0, 16},\r\n{REGS_RegCodeX64_zmm5, 0, 16},\r\n{REGS_RegCodeX64_zmm6, 0, 16},\r\n{REGS_RegCodeX64_zmm7, 0, 16},\r\n{REGS_RegCodeX64_zmm8, 0, 16},\r\n{REGS_RegCodeX64_zmm9, 0, 16},\r\n{REGS_RegCodeX64_zmm10, 0, 16},\r\n{REGS_RegCodeX64_zmm11, 0, 16},\r\n{REGS_RegCodeX64_zmm12, 0, 16},\r\n{REGS_RegCodeX64_zmm13, 0, 16},\r\n{REGS_RegCodeX64_zmm14, 0, 16},\r\n{REGS_RegCodeX64_zmm15, 0, 16},\r\n{REGS_RegCodeX64_zmm0, 0, 32},\r\n{REGS_RegCodeX64_zmm1, 0, 32},\r\n{REGS_RegCodeX64_zmm2, 0, 32},\r\n{REGS_RegCodeX64_zmm3, 0, 32},\r\n{REGS_RegCodeX64_zmm4, 0, 32},\r\n{REGS_RegCodeX64_zmm5, 0, 32},\r\n{REGS_RegCodeX64_zmm6, 0, 32},\r\n{REGS_RegCodeX64_zmm7, 0, 32},\r\n{REGS_RegCodeX64_zmm8, 0, 32},\r\n{REGS_RegCodeX64_zmm9, 0, 32},\r\n{REGS_RegCodeX64_zmm10, 0, 32},\r\n{REGS_RegCodeX64_zmm11, 0, 32},\r\n{REGS_RegCodeX64_zmm12, 0, 32},\r\n{REGS_RegCodeX64_zmm13, 0, 32},\r\n{REGS_RegCodeX64_zmm14, 0, 32},\r\n{REGS_RegCodeX64_zmm15, 0, 32},\r\n{REGS_RegCodeX64_fpr0, 0, 8},\r\n{REGS_RegCodeX64_fpr1, 0, 8},\r\n{REGS_RegCodeX64_fpr2, 0, 8},\r\n{REGS_RegCodeX64_fpr3, 0, 8},\r\n{REGS_RegCodeX64_fpr4, 0, 8},\r\n{REGS_RegCodeX64_fpr5, 0, 8},\r\n{REGS_RegCodeX64_fpr6, 0, 8},\r\n{REGS_RegCodeX64_fpr7, 0, 8},\r\n};\r\n\r\nREGS_UsageKind regs_g_reg_code_x86_usage_kind_table[63] =\r\n{\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\n};\r\n\r\nREGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36] =\r\n{\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Normal,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\nREGS_UsageKind_Vector,\r\n};\r\n\r\nString8 regs_g_reg_code_x86_string_table[63] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"eax\"),\r\nstr8_lit_comp(\"ecx\"),\r\nstr8_lit_comp(\"edx\"),\r\nstr8_lit_comp(\"ebx\"),\r\nstr8_lit_comp(\"esp\"),\r\nstr8_lit_comp(\"ebp\"),\r\nstr8_lit_comp(\"esi\"),\r\nstr8_lit_comp(\"edi\"),\r\nstr8_lit_comp(\"fsbase\"),\r\nstr8_lit_comp(\"gsbase\"),\r\nstr8_lit_comp(\"eflags\"),\r\nstr8_lit_comp(\"eip\"),\r\nstr8_lit_comp(\"dr0\"),\r\nstr8_lit_comp(\"dr1\"),\r\nstr8_lit_comp(\"dr2\"),\r\nstr8_lit_comp(\"dr3\"),\r\nstr8_lit_comp(\"dr4\"),\r\nstr8_lit_comp(\"dr5\"),\r\nstr8_lit_comp(\"dr6\"),\r\nstr8_lit_comp(\"dr7\"),\r\nstr8_lit_comp(\"fpr0\"),\r\nstr8_lit_comp(\"fpr1\"),\r\nstr8_lit_comp(\"fpr2\"),\r\nstr8_lit_comp(\"fpr3\"),\r\nstr8_lit_comp(\"fpr4\"),\r\nstr8_lit_comp(\"fpr5\"),\r\nstr8_lit_comp(\"fpr6\"),\r\nstr8_lit_comp(\"fpr7\"),\r\nstr8_lit_comp(\"st0\"),\r\nstr8_lit_comp(\"st1\"),\r\nstr8_lit_comp(\"st2\"),\r\nstr8_lit_comp(\"st3\"),\r\nstr8_lit_comp(\"st4\"),\r\nstr8_lit_comp(\"st5\"),\r\nstr8_lit_comp(\"st6\"),\r\nstr8_lit_comp(\"st7\"),\r\nstr8_lit_comp(\"fcw\"),\r\nstr8_lit_comp(\"fsw\"),\r\nstr8_lit_comp(\"ftw\"),\r\nstr8_lit_comp(\"fop\"),\r\nstr8_lit_comp(\"fcs\"),\r\nstr8_lit_comp(\"fds\"),\r\nstr8_lit_comp(\"fip\"),\r\nstr8_lit_comp(\"fdp\"),\r\nstr8_lit_comp(\"mxcsr\"),\r\nstr8_lit_comp(\"mxcsr_mask\"),\r\nstr8_lit_comp(\"ss\"),\r\nstr8_lit_comp(\"cs\"),\r\nstr8_lit_comp(\"ds\"),\r\nstr8_lit_comp(\"es\"),\r\nstr8_lit_comp(\"fs\"),\r\nstr8_lit_comp(\"gs\"),\r\nstr8_lit_comp(\"tr\"),\r\nstr8_lit_comp(\"ldtr\"),\r\nstr8_lit_comp(\"ymm0\"),\r\nstr8_lit_comp(\"ymm1\"),\r\nstr8_lit_comp(\"ymm2\"),\r\nstr8_lit_comp(\"ymm3\"),\r\nstr8_lit_comp(\"ymm4\"),\r\nstr8_lit_comp(\"ymm5\"),\r\nstr8_lit_comp(\"ymm6\"),\r\nstr8_lit_comp(\"ymm7\"),\r\n};\r\n\r\nString8 regs_g_alias_code_x86_string_table[36] =\r\n{\r\nstr8_lit_comp(\"\"),\r\nstr8_lit_comp(\"ax\"),\r\nstr8_lit_comp(\"cx\"),\r\nstr8_lit_comp(\"bx\"),\r\nstr8_lit_comp(\"dx\"),\r\nstr8_lit_comp(\"sp\"),\r\nstr8_lit_comp(\"bp\"),\r\nstr8_lit_comp(\"si\"),\r\nstr8_lit_comp(\"di\"),\r\nstr8_lit_comp(\"ip\"),\r\nstr8_lit_comp(\"ah\"),\r\nstr8_lit_comp(\"ch\"),\r\nstr8_lit_comp(\"dh\"),\r\nstr8_lit_comp(\"bh\"),\r\nstr8_lit_comp(\"al\"),\r\nstr8_lit_comp(\"cl\"),\r\nstr8_lit_comp(\"dl\"),\r\nstr8_lit_comp(\"bl\"),\r\nstr8_lit_comp(\"bpl\"),\r\nstr8_lit_comp(\"spl\"),\r\nstr8_lit_comp(\"xmm0\"),\r\nstr8_lit_comp(\"xmm1\"),\r\nstr8_lit_comp(\"xmm2\"),\r\nstr8_lit_comp(\"xmm3\"),\r\nstr8_lit_comp(\"xmm4\"),\r\nstr8_lit_comp(\"xmm5\"),\r\nstr8_lit_comp(\"xmm6\"),\r\nstr8_lit_comp(\"xmm7\"),\r\nstr8_lit_comp(\"mm0\"),\r\nstr8_lit_comp(\"mm1\"),\r\nstr8_lit_comp(\"mm2\"),\r\nstr8_lit_comp(\"mm3\"),\r\nstr8_lit_comp(\"mm4\"),\r\nstr8_lit_comp(\"mm5\"),\r\nstr8_lit_comp(\"mm6\"),\r\nstr8_lit_comp(\"mm7\"),\r\n};\r\n\r\nREGS_Rng regs_g_reg_code_x86_rng_table[63] =\r\n{\r\n{0},\r\n{(U16)OffsetOf(REGS_RegBlockX86, eax), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ecx), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, edx), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ebx), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, esp), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ebp), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, esi), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, edi), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fsbase), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, gsbase), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, eflags), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, eip), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr0), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr1), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr2), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr3), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr4), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr5), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr6), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, dr7), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr0), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr1), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr2), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr3), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr4), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr5), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr6), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fpr7), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st0), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st1), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st2), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st3), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st4), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st5), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st6), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, st7), 10},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fcw), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fsw), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ftw), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fop), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fcs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fds), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fip), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fdp), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, mxcsr), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, mxcsr_mask), 4},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ss), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, cs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ds), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, es), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, fs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, gs), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, tr), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ldtr), 2},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm0), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm1), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm2), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm3), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm4), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm5), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm6), 32},\r\n{(U16)OffsetOf(REGS_RegBlockX86, ymm7), 32},\r\n};\r\n\r\nREGS_Slice regs_g_alias_code_x86_slice_table[36] =\r\n{\r\n{0},\r\n{REGS_RegCodeX86_eax, 0, 2},\r\n{REGS_RegCodeX86_ecx, 0, 2},\r\n{REGS_RegCodeX86_ebx, 0, 2},\r\n{REGS_RegCodeX86_edx, 0, 2},\r\n{REGS_RegCodeX86_esp, 0, 2},\r\n{REGS_RegCodeX86_ebp, 0, 2},\r\n{REGS_RegCodeX86_esi, 0, 2},\r\n{REGS_RegCodeX86_edi, 0, 2},\r\n{REGS_RegCodeX86_eip, 0, 2},\r\n{REGS_RegCodeX86_eax, 1, 1},\r\n{REGS_RegCodeX86_ecx, 1, 1},\r\n{REGS_RegCodeX86_edx, 1, 1},\r\n{REGS_RegCodeX86_ebx, 1, 1},\r\n{REGS_RegCodeX86_eax, 0, 1},\r\n{REGS_RegCodeX86_ecx, 0, 1},\r\n{REGS_RegCodeX86_edx, 0, 1},\r\n{REGS_RegCodeX86_ebx, 0, 1},\r\n{REGS_RegCodeX86_ebp, 0, 1},\r\n{REGS_RegCodeX86_esp, 0, 1},\r\n{REGS_RegCodeX86_ymm0, 0, 16},\r\n{REGS_RegCodeX86_ymm1, 0, 16},\r\n{REGS_RegCodeX86_ymm2, 0, 16},\r\n{REGS_RegCodeX86_ymm3, 0, 16},\r\n{REGS_RegCodeX86_ymm4, 0, 16},\r\n{REGS_RegCodeX86_ymm5, 0, 16},\r\n{REGS_RegCodeX86_ymm6, 0, 16},\r\n{REGS_RegCodeX86_ymm7, 0, 16},\r\n{REGS_RegCodeX86_fpr0, 0, 8},\r\n{REGS_RegCodeX86_fpr1, 0, 8},\r\n{REGS_RegCodeX86_fpr2, 0, 8},\r\n{REGS_RegCodeX86_fpr3, 0, 8},\r\n{REGS_RegCodeX86_fpr4, 0, 8},\r\n{REGS_RegCodeX86_fpr5, 0, 8},\r\n{REGS_RegCodeX86_fpr6, 0, 8},\r\n{REGS_RegCodeX86_fpr7, 0, 8},\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/regs/generated/regs.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef REGS_META_H\r\n#define REGS_META_H\r\n\r\ntypedef enum REGS_RegCodeX64\r\n{\r\nREGS_RegCodeX64_NULL,\r\nREGS_RegCodeX64_rax,\r\nREGS_RegCodeX64_rcx,\r\nREGS_RegCodeX64_rdx,\r\nREGS_RegCodeX64_rbx,\r\nREGS_RegCodeX64_rsp,\r\nREGS_RegCodeX64_rbp,\r\nREGS_RegCodeX64_rsi,\r\nREGS_RegCodeX64_rdi,\r\nREGS_RegCodeX64_r8,\r\nREGS_RegCodeX64_r9,\r\nREGS_RegCodeX64_r10,\r\nREGS_RegCodeX64_r11,\r\nREGS_RegCodeX64_r12,\r\nREGS_RegCodeX64_r13,\r\nREGS_RegCodeX64_r14,\r\nREGS_RegCodeX64_r15,\r\nREGS_RegCodeX64_fsbase,\r\nREGS_RegCodeX64_gsbase,\r\nREGS_RegCodeX64_rip,\r\nREGS_RegCodeX64_rflags,\r\nREGS_RegCodeX64_dr0,\r\nREGS_RegCodeX64_dr1,\r\nREGS_RegCodeX64_dr2,\r\nREGS_RegCodeX64_dr3,\r\nREGS_RegCodeX64_dr4,\r\nREGS_RegCodeX64_dr5,\r\nREGS_RegCodeX64_dr6,\r\nREGS_RegCodeX64_dr7,\r\nREGS_RegCodeX64_fpr0,\r\nREGS_RegCodeX64_fpr1,\r\nREGS_RegCodeX64_fpr2,\r\nREGS_RegCodeX64_fpr3,\r\nREGS_RegCodeX64_fpr4,\r\nREGS_RegCodeX64_fpr5,\r\nREGS_RegCodeX64_fpr6,\r\nREGS_RegCodeX64_fpr7,\r\nREGS_RegCodeX64_st0,\r\nREGS_RegCodeX64_st1,\r\nREGS_RegCodeX64_st2,\r\nREGS_RegCodeX64_st3,\r\nREGS_RegCodeX64_st4,\r\nREGS_RegCodeX64_st5,\r\nREGS_RegCodeX64_st6,\r\nREGS_RegCodeX64_st7,\r\nREGS_RegCodeX64_fcw,\r\nREGS_RegCodeX64_fsw,\r\nREGS_RegCodeX64_ftw,\r\nREGS_RegCodeX64_fop,\r\nREGS_RegCodeX64_fcs,\r\nREGS_RegCodeX64_fds,\r\nREGS_RegCodeX64_fip,\r\nREGS_RegCodeX64_fdp,\r\nREGS_RegCodeX64_mxcsr,\r\nREGS_RegCodeX64_mxcsr_mask,\r\nREGS_RegCodeX64_ss,\r\nREGS_RegCodeX64_cs,\r\nREGS_RegCodeX64_ds,\r\nREGS_RegCodeX64_es,\r\nREGS_RegCodeX64_fs,\r\nREGS_RegCodeX64_gs,\r\nREGS_RegCodeX64_zmm0,\r\nREGS_RegCodeX64_zmm1,\r\nREGS_RegCodeX64_zmm2,\r\nREGS_RegCodeX64_zmm3,\r\nREGS_RegCodeX64_zmm4,\r\nREGS_RegCodeX64_zmm5,\r\nREGS_RegCodeX64_zmm6,\r\nREGS_RegCodeX64_zmm7,\r\nREGS_RegCodeX64_zmm8,\r\nREGS_RegCodeX64_zmm9,\r\nREGS_RegCodeX64_zmm10,\r\nREGS_RegCodeX64_zmm11,\r\nREGS_RegCodeX64_zmm12,\r\nREGS_RegCodeX64_zmm13,\r\nREGS_RegCodeX64_zmm14,\r\nREGS_RegCodeX64_zmm15,\r\nREGS_RegCodeX64_zmm16,\r\nREGS_RegCodeX64_zmm17,\r\nREGS_RegCodeX64_zmm18,\r\nREGS_RegCodeX64_zmm19,\r\nREGS_RegCodeX64_zmm20,\r\nREGS_RegCodeX64_zmm21,\r\nREGS_RegCodeX64_zmm22,\r\nREGS_RegCodeX64_zmm23,\r\nREGS_RegCodeX64_zmm24,\r\nREGS_RegCodeX64_zmm25,\r\nREGS_RegCodeX64_zmm26,\r\nREGS_RegCodeX64_zmm27,\r\nREGS_RegCodeX64_zmm28,\r\nREGS_RegCodeX64_zmm29,\r\nREGS_RegCodeX64_zmm30,\r\nREGS_RegCodeX64_zmm31,\r\nREGS_RegCodeX64_k0,\r\nREGS_RegCodeX64_k1,\r\nREGS_RegCodeX64_k2,\r\nREGS_RegCodeX64_k3,\r\nREGS_RegCodeX64_k4,\r\nREGS_RegCodeX64_k5,\r\nREGS_RegCodeX64_k6,\r\nREGS_RegCodeX64_k7,\r\nREGS_RegCodeX64_cetmsr,\r\nREGS_RegCodeX64_cetssp,\r\nREGS_RegCodeX64_tr,\r\nREGS_RegCodeX64_ldtr,\r\nREGS_RegCodeX64_COUNT,\r\n} REGS_RegCodeX64;\r\n\r\ntypedef enum REGS_AliasCodeX64\r\n{\r\nREGS_AliasCodeX64_NULL,\r\nREGS_AliasCodeX64_eax,\r\nREGS_AliasCodeX64_ecx,\r\nREGS_AliasCodeX64_edx,\r\nREGS_AliasCodeX64_ebx,\r\nREGS_AliasCodeX64_esp,\r\nREGS_AliasCodeX64_ebp,\r\nREGS_AliasCodeX64_esi,\r\nREGS_AliasCodeX64_edi,\r\nREGS_AliasCodeX64_r8d,\r\nREGS_AliasCodeX64_r9d,\r\nREGS_AliasCodeX64_r10d,\r\nREGS_AliasCodeX64_r11d,\r\nREGS_AliasCodeX64_r12d,\r\nREGS_AliasCodeX64_r13d,\r\nREGS_AliasCodeX64_r14d,\r\nREGS_AliasCodeX64_r15d,\r\nREGS_AliasCodeX64_eip,\r\nREGS_AliasCodeX64_eflags,\r\nREGS_AliasCodeX64_ax,\r\nREGS_AliasCodeX64_cx,\r\nREGS_AliasCodeX64_dx,\r\nREGS_AliasCodeX64_bx,\r\nREGS_AliasCodeX64_si,\r\nREGS_AliasCodeX64_di,\r\nREGS_AliasCodeX64_sp,\r\nREGS_AliasCodeX64_bp,\r\nREGS_AliasCodeX64_ip,\r\nREGS_AliasCodeX64_r8w,\r\nREGS_AliasCodeX64_r9w,\r\nREGS_AliasCodeX64_r10w,\r\nREGS_AliasCodeX64_r11w,\r\nREGS_AliasCodeX64_r12w,\r\nREGS_AliasCodeX64_r13w,\r\nREGS_AliasCodeX64_r14w,\r\nREGS_AliasCodeX64_r15w,\r\nREGS_AliasCodeX64_al,\r\nREGS_AliasCodeX64_cl,\r\nREGS_AliasCodeX64_dl,\r\nREGS_AliasCodeX64_bl,\r\nREGS_AliasCodeX64_sil,\r\nREGS_AliasCodeX64_dil,\r\nREGS_AliasCodeX64_bpl,\r\nREGS_AliasCodeX64_spl,\r\nREGS_AliasCodeX64_r8b,\r\nREGS_AliasCodeX64_r9b,\r\nREGS_AliasCodeX64_r10b,\r\nREGS_AliasCodeX64_r11b,\r\nREGS_AliasCodeX64_r12b,\r\nREGS_AliasCodeX64_r13b,\r\nREGS_AliasCodeX64_r14b,\r\nREGS_AliasCodeX64_r15b,\r\nREGS_AliasCodeX64_ah,\r\nREGS_AliasCodeX64_ch,\r\nREGS_AliasCodeX64_dh,\r\nREGS_AliasCodeX64_bh,\r\nREGS_AliasCodeX64_xmm0,\r\nREGS_AliasCodeX64_xmm1,\r\nREGS_AliasCodeX64_xmm2,\r\nREGS_AliasCodeX64_xmm3,\r\nREGS_AliasCodeX64_xmm4,\r\nREGS_AliasCodeX64_xmm5,\r\nREGS_AliasCodeX64_xmm6,\r\nREGS_AliasCodeX64_xmm7,\r\nREGS_AliasCodeX64_xmm8,\r\nREGS_AliasCodeX64_xmm9,\r\nREGS_AliasCodeX64_xmm10,\r\nREGS_AliasCodeX64_xmm11,\r\nREGS_AliasCodeX64_xmm12,\r\nREGS_AliasCodeX64_xmm13,\r\nREGS_AliasCodeX64_xmm14,\r\nREGS_AliasCodeX64_xmm15,\r\nREGS_AliasCodeX64_ymm0,\r\nREGS_AliasCodeX64_ymm1,\r\nREGS_AliasCodeX64_ymm2,\r\nREGS_AliasCodeX64_ymm3,\r\nREGS_AliasCodeX64_ymm4,\r\nREGS_AliasCodeX64_ymm5,\r\nREGS_AliasCodeX64_ymm6,\r\nREGS_AliasCodeX64_ymm7,\r\nREGS_AliasCodeX64_ymm8,\r\nREGS_AliasCodeX64_ymm9,\r\nREGS_AliasCodeX64_ymm10,\r\nREGS_AliasCodeX64_ymm11,\r\nREGS_AliasCodeX64_ymm12,\r\nREGS_AliasCodeX64_ymm13,\r\nREGS_AliasCodeX64_ymm14,\r\nREGS_AliasCodeX64_ymm15,\r\nREGS_AliasCodeX64_mm0,\r\nREGS_AliasCodeX64_mm1,\r\nREGS_AliasCodeX64_mm2,\r\nREGS_AliasCodeX64_mm3,\r\nREGS_AliasCodeX64_mm4,\r\nREGS_AliasCodeX64_mm5,\r\nREGS_AliasCodeX64_mm6,\r\nREGS_AliasCodeX64_mm7,\r\nREGS_AliasCodeX64_COUNT,\r\n} REGS_AliasCodeX64;\r\n\r\ntypedef enum REGS_RegCodeX86\r\n{\r\nREGS_RegCodeX86_NULL,\r\nREGS_RegCodeX86_eax,\r\nREGS_RegCodeX86_ecx,\r\nREGS_RegCodeX86_edx,\r\nREGS_RegCodeX86_ebx,\r\nREGS_RegCodeX86_esp,\r\nREGS_RegCodeX86_ebp,\r\nREGS_RegCodeX86_esi,\r\nREGS_RegCodeX86_edi,\r\nREGS_RegCodeX86_fsbase,\r\nREGS_RegCodeX86_gsbase,\r\nREGS_RegCodeX86_eflags,\r\nREGS_RegCodeX86_eip,\r\nREGS_RegCodeX86_dr0,\r\nREGS_RegCodeX86_dr1,\r\nREGS_RegCodeX86_dr2,\r\nREGS_RegCodeX86_dr3,\r\nREGS_RegCodeX86_dr4,\r\nREGS_RegCodeX86_dr5,\r\nREGS_RegCodeX86_dr6,\r\nREGS_RegCodeX86_dr7,\r\nREGS_RegCodeX86_fpr0,\r\nREGS_RegCodeX86_fpr1,\r\nREGS_RegCodeX86_fpr2,\r\nREGS_RegCodeX86_fpr3,\r\nREGS_RegCodeX86_fpr4,\r\nREGS_RegCodeX86_fpr5,\r\nREGS_RegCodeX86_fpr6,\r\nREGS_RegCodeX86_fpr7,\r\nREGS_RegCodeX86_st0,\r\nREGS_RegCodeX86_st1,\r\nREGS_RegCodeX86_st2,\r\nREGS_RegCodeX86_st3,\r\nREGS_RegCodeX86_st4,\r\nREGS_RegCodeX86_st5,\r\nREGS_RegCodeX86_st6,\r\nREGS_RegCodeX86_st7,\r\nREGS_RegCodeX86_fcw,\r\nREGS_RegCodeX86_fsw,\r\nREGS_RegCodeX86_ftw,\r\nREGS_RegCodeX86_fop,\r\nREGS_RegCodeX86_fcs,\r\nREGS_RegCodeX86_fds,\r\nREGS_RegCodeX86_fip,\r\nREGS_RegCodeX86_fdp,\r\nREGS_RegCodeX86_mxcsr,\r\nREGS_RegCodeX86_mxcsr_mask,\r\nREGS_RegCodeX86_ss,\r\nREGS_RegCodeX86_cs,\r\nREGS_RegCodeX86_ds,\r\nREGS_RegCodeX86_es,\r\nREGS_RegCodeX86_fs,\r\nREGS_RegCodeX86_gs,\r\nREGS_RegCodeX86_tr,\r\nREGS_RegCodeX86_ldtr,\r\nREGS_RegCodeX86_ymm0,\r\nREGS_RegCodeX86_ymm1,\r\nREGS_RegCodeX86_ymm2,\r\nREGS_RegCodeX86_ymm3,\r\nREGS_RegCodeX86_ymm4,\r\nREGS_RegCodeX86_ymm5,\r\nREGS_RegCodeX86_ymm6,\r\nREGS_RegCodeX86_ymm7,\r\nREGS_RegCodeX86_COUNT,\r\n} REGS_RegCodeX86;\r\n\r\ntypedef enum REGS_AliasCodeX86\r\n{\r\nREGS_AliasCodeX86_NULL,\r\nREGS_AliasCodeX86_ax,\r\nREGS_AliasCodeX86_cx,\r\nREGS_AliasCodeX86_bx,\r\nREGS_AliasCodeX86_dx,\r\nREGS_AliasCodeX86_sp,\r\nREGS_AliasCodeX86_bp,\r\nREGS_AliasCodeX86_si,\r\nREGS_AliasCodeX86_di,\r\nREGS_AliasCodeX86_ip,\r\nREGS_AliasCodeX86_ah,\r\nREGS_AliasCodeX86_ch,\r\nREGS_AliasCodeX86_dh,\r\nREGS_AliasCodeX86_bh,\r\nREGS_AliasCodeX86_al,\r\nREGS_AliasCodeX86_cl,\r\nREGS_AliasCodeX86_dl,\r\nREGS_AliasCodeX86_bl,\r\nREGS_AliasCodeX86_bpl,\r\nREGS_AliasCodeX86_spl,\r\nREGS_AliasCodeX86_xmm0,\r\nREGS_AliasCodeX86_xmm1,\r\nREGS_AliasCodeX86_xmm2,\r\nREGS_AliasCodeX86_xmm3,\r\nREGS_AliasCodeX86_xmm4,\r\nREGS_AliasCodeX86_xmm5,\r\nREGS_AliasCodeX86_xmm6,\r\nREGS_AliasCodeX86_xmm7,\r\nREGS_AliasCodeX86_mm0,\r\nREGS_AliasCodeX86_mm1,\r\nREGS_AliasCodeX86_mm2,\r\nREGS_AliasCodeX86_mm3,\r\nREGS_AliasCodeX86_mm4,\r\nREGS_AliasCodeX86_mm5,\r\nREGS_AliasCodeX86_mm6,\r\nREGS_AliasCodeX86_mm7,\r\nREGS_AliasCodeX86_COUNT,\r\n} REGS_AliasCodeX86;\r\n\r\ntypedef struct REGS_RegBlockX64 REGS_RegBlockX64;\r\nstruct REGS_RegBlockX64\r\n{\r\nREGS_Reg64 rax;\r\nREGS_Reg64 rcx;\r\nREGS_Reg64 rdx;\r\nREGS_Reg64 rbx;\r\nREGS_Reg64 rsp;\r\nREGS_Reg64 rbp;\r\nREGS_Reg64 rsi;\r\nREGS_Reg64 rdi;\r\nREGS_Reg64 r8;\r\nREGS_Reg64 r9;\r\nREGS_Reg64 r10;\r\nREGS_Reg64 r11;\r\nREGS_Reg64 r12;\r\nREGS_Reg64 r13;\r\nREGS_Reg64 r14;\r\nREGS_Reg64 r15;\r\nREGS_Reg64 fsbase;\r\nREGS_Reg64 gsbase;\r\nREGS_Reg64 rip;\r\nREGS_Reg64 rflags;\r\nREGS_Reg64 dr0;\r\nREGS_Reg64 dr1;\r\nREGS_Reg64 dr2;\r\nREGS_Reg64 dr3;\r\nREGS_Reg64 dr4;\r\nREGS_Reg64 dr5;\r\nREGS_Reg64 dr6;\r\nREGS_Reg64 dr7;\r\nREGS_Reg80 fpr0;\r\nREGS_Reg80 fpr1;\r\nREGS_Reg80 fpr2;\r\nREGS_Reg80 fpr3;\r\nREGS_Reg80 fpr4;\r\nREGS_Reg80 fpr5;\r\nREGS_Reg80 fpr6;\r\nREGS_Reg80 fpr7;\r\nREGS_Reg80 st0;\r\nREGS_Reg80 st1;\r\nREGS_Reg80 st2;\r\nREGS_Reg80 st3;\r\nREGS_Reg80 st4;\r\nREGS_Reg80 st5;\r\nREGS_Reg80 st6;\r\nREGS_Reg80 st7;\r\nREGS_Reg16 fcw;\r\nREGS_Reg16 fsw;\r\nREGS_Reg16 ftw;\r\nREGS_Reg16 fop;\r\nREGS_Reg16 fcs;\r\nREGS_Reg16 fds;\r\nREGS_Reg64 fip;\r\nREGS_Reg64 fdp;\r\nREGS_Reg32 mxcsr;\r\nREGS_Reg32 mxcsr_mask;\r\nREGS_Reg16 ss;\r\nREGS_Reg16 cs;\r\nREGS_Reg16 ds;\r\nREGS_Reg16 es;\r\nREGS_Reg16 fs;\r\nREGS_Reg16 gs;\r\nREGS_Reg512 zmm0;\r\nREGS_Reg512 zmm1;\r\nREGS_Reg512 zmm2;\r\nREGS_Reg512 zmm3;\r\nREGS_Reg512 zmm4;\r\nREGS_Reg512 zmm5;\r\nREGS_Reg512 zmm6;\r\nREGS_Reg512 zmm7;\r\nREGS_Reg512 zmm8;\r\nREGS_Reg512 zmm9;\r\nREGS_Reg512 zmm10;\r\nREGS_Reg512 zmm11;\r\nREGS_Reg512 zmm12;\r\nREGS_Reg512 zmm13;\r\nREGS_Reg512 zmm14;\r\nREGS_Reg512 zmm15;\r\nREGS_Reg512 zmm16;\r\nREGS_Reg512 zmm17;\r\nREGS_Reg512 zmm18;\r\nREGS_Reg512 zmm19;\r\nREGS_Reg512 zmm20;\r\nREGS_Reg512 zmm21;\r\nREGS_Reg512 zmm22;\r\nREGS_Reg512 zmm23;\r\nREGS_Reg512 zmm24;\r\nREGS_Reg512 zmm25;\r\nREGS_Reg512 zmm26;\r\nREGS_Reg512 zmm27;\r\nREGS_Reg512 zmm28;\r\nREGS_Reg512 zmm29;\r\nREGS_Reg512 zmm30;\r\nREGS_Reg512 zmm31;\r\nREGS_Reg64 k0;\r\nREGS_Reg64 k1;\r\nREGS_Reg64 k2;\r\nREGS_Reg64 k3;\r\nREGS_Reg64 k4;\r\nREGS_Reg64 k5;\r\nREGS_Reg64 k6;\r\nREGS_Reg64 k7;\r\nREGS_Reg64 cetmsr;\r\nREGS_Reg64 cetssp;\r\nREGS_Reg16 tr;\r\nREGS_Reg16 ldtr;\r\n};\r\n\r\ntypedef struct REGS_RegBlockX86 REGS_RegBlockX86;\r\nstruct REGS_RegBlockX86\r\n{\r\nREGS_Reg32 eax;\r\nREGS_Reg32 ecx;\r\nREGS_Reg32 edx;\r\nREGS_Reg32 ebx;\r\nREGS_Reg32 esp;\r\nREGS_Reg32 ebp;\r\nREGS_Reg32 esi;\r\nREGS_Reg32 edi;\r\nREGS_Reg32 fsbase;\r\nREGS_Reg32 gsbase;\r\nREGS_Reg32 eflags;\r\nREGS_Reg32 eip;\r\nREGS_Reg32 dr0;\r\nREGS_Reg32 dr1;\r\nREGS_Reg32 dr2;\r\nREGS_Reg32 dr3;\r\nREGS_Reg32 dr4;\r\nREGS_Reg32 dr5;\r\nREGS_Reg32 dr6;\r\nREGS_Reg32 dr7;\r\nREGS_Reg80 fpr0;\r\nREGS_Reg80 fpr1;\r\nREGS_Reg80 fpr2;\r\nREGS_Reg80 fpr3;\r\nREGS_Reg80 fpr4;\r\nREGS_Reg80 fpr5;\r\nREGS_Reg80 fpr6;\r\nREGS_Reg80 fpr7;\r\nREGS_Reg80 st0;\r\nREGS_Reg80 st1;\r\nREGS_Reg80 st2;\r\nREGS_Reg80 st3;\r\nREGS_Reg80 st4;\r\nREGS_Reg80 st5;\r\nREGS_Reg80 st6;\r\nREGS_Reg80 st7;\r\nREGS_Reg16 fcw;\r\nREGS_Reg16 fsw;\r\nREGS_Reg16 ftw;\r\nREGS_Reg16 fop;\r\nREGS_Reg16 fcs;\r\nREGS_Reg16 fds;\r\nREGS_Reg32 fip;\r\nREGS_Reg32 fdp;\r\nREGS_Reg32 mxcsr;\r\nREGS_Reg32 mxcsr_mask;\r\nREGS_Reg16 ss;\r\nREGS_Reg16 cs;\r\nREGS_Reg16 ds;\r\nREGS_Reg16 es;\r\nREGS_Reg16 fs;\r\nREGS_Reg16 gs;\r\nREGS_Reg16 tr;\r\nREGS_Reg16 ldtr;\r\nREGS_Reg256 ymm0;\r\nREGS_Reg256 ymm1;\r\nREGS_Reg256 ymm2;\r\nREGS_Reg256 ymm3;\r\nREGS_Reg256 ymm4;\r\nREGS_Reg256 ymm5;\r\nREGS_Reg256 ymm6;\r\nREGS_Reg256 ymm7;\r\n};\r\n\r\nC_LINKAGE_BEGIN\r\nextern REGS_UsageKind regs_g_reg_code_x64_usage_kind_table[105];\r\nextern REGS_UsageKind regs_g_alias_code_x64_usage_kind_table[96];\r\nextern String8 regs_g_reg_code_x64_string_table[105];\r\nextern String8 regs_g_alias_code_x64_string_table[96];\r\nextern REGS_Rng regs_g_reg_code_x64_rng_table[105];\r\nextern REGS_Slice regs_g_alias_code_x64_slice_table[96];\r\nextern REGS_UsageKind regs_g_reg_code_x86_usage_kind_table[63];\r\nextern REGS_UsageKind regs_g_alias_code_x86_usage_kind_table[36];\r\nextern String8 regs_g_reg_code_x86_string_table[63];\r\nextern String8 regs_g_alias_code_x86_string_table[36];\r\nextern REGS_Rng regs_g_reg_code_x86_rng_table[63];\r\nextern REGS_Slice regs_g_alias_code_x86_slice_table[36];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // REGS_META_H\r\n"
  },
  {
    "path": "src/regs/rdi/generated/regs_rdi.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\ninternal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code)\r\n{\r\nRDI_RegCode result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:\r\n{\r\nswitch(code)\r\n{\r\ndefault:{}break;\r\ncase REGS_RegCodeX64_rax:{result = RDI_RegCodeX64_rax;}break;\r\ncase REGS_RegCodeX64_rcx:{result = RDI_RegCodeX64_rcx;}break;\r\ncase REGS_RegCodeX64_rdx:{result = RDI_RegCodeX64_rdx;}break;\r\ncase REGS_RegCodeX64_rbx:{result = RDI_RegCodeX64_rbx;}break;\r\ncase REGS_RegCodeX64_rsp:{result = RDI_RegCodeX64_rsp;}break;\r\ncase REGS_RegCodeX64_rbp:{result = RDI_RegCodeX64_rbp;}break;\r\ncase REGS_RegCodeX64_rsi:{result = RDI_RegCodeX64_rsi;}break;\r\ncase REGS_RegCodeX64_rdi:{result = RDI_RegCodeX64_rdi;}break;\r\ncase REGS_RegCodeX64_r8:{result = RDI_RegCodeX64_r8;}break;\r\ncase REGS_RegCodeX64_r9:{result = RDI_RegCodeX64_r9;}break;\r\ncase REGS_RegCodeX64_r10:{result = RDI_RegCodeX64_r10;}break;\r\ncase REGS_RegCodeX64_r11:{result = RDI_RegCodeX64_r11;}break;\r\ncase REGS_RegCodeX64_r12:{result = RDI_RegCodeX64_r12;}break;\r\ncase REGS_RegCodeX64_r13:{result = RDI_RegCodeX64_r13;}break;\r\ncase REGS_RegCodeX64_r14:{result = RDI_RegCodeX64_r14;}break;\r\ncase REGS_RegCodeX64_r15:{result = RDI_RegCodeX64_r15;}break;\r\ncase REGS_RegCodeX64_fsbase:{result = RDI_RegCodeX64_fsbase;}break;\r\ncase REGS_RegCodeX64_gsbase:{result = RDI_RegCodeX64_gsbase;}break;\r\ncase REGS_RegCodeX64_rip:{result = RDI_RegCodeX64_rip;}break;\r\ncase REGS_RegCodeX64_rflags:{result = RDI_RegCodeX64_rflags;}break;\r\ncase REGS_RegCodeX64_dr0:{result = RDI_RegCodeX64_dr0;}break;\r\ncase REGS_RegCodeX64_dr1:{result = RDI_RegCodeX64_dr1;}break;\r\ncase REGS_RegCodeX64_dr2:{result = RDI_RegCodeX64_dr2;}break;\r\ncase REGS_RegCodeX64_dr3:{result = RDI_RegCodeX64_dr3;}break;\r\ncase REGS_RegCodeX64_dr4:{result = RDI_RegCodeX64_dr4;}break;\r\ncase REGS_RegCodeX64_dr5:{result = RDI_RegCodeX64_dr5;}break;\r\ncase REGS_RegCodeX64_dr6:{result = RDI_RegCodeX64_dr6;}break;\r\ncase REGS_RegCodeX64_dr7:{result = RDI_RegCodeX64_dr7;}break;\r\ncase REGS_RegCodeX64_fpr0:{result = RDI_RegCodeX64_fpr0;}break;\r\ncase REGS_RegCodeX64_fpr1:{result = RDI_RegCodeX64_fpr1;}break;\r\ncase REGS_RegCodeX64_fpr2:{result = RDI_RegCodeX64_fpr2;}break;\r\ncase REGS_RegCodeX64_fpr3:{result = RDI_RegCodeX64_fpr3;}break;\r\ncase REGS_RegCodeX64_fpr4:{result = RDI_RegCodeX64_fpr4;}break;\r\ncase REGS_RegCodeX64_fpr5:{result = RDI_RegCodeX64_fpr5;}break;\r\ncase REGS_RegCodeX64_fpr6:{result = RDI_RegCodeX64_fpr6;}break;\r\ncase REGS_RegCodeX64_fpr7:{result = RDI_RegCodeX64_fpr7;}break;\r\ncase REGS_RegCodeX64_st0:{result = RDI_RegCodeX64_st0;}break;\r\ncase REGS_RegCodeX64_st1:{result = RDI_RegCodeX64_st1;}break;\r\ncase REGS_RegCodeX64_st2:{result = RDI_RegCodeX64_st2;}break;\r\ncase REGS_RegCodeX64_st3:{result = RDI_RegCodeX64_st3;}break;\r\ncase REGS_RegCodeX64_st4:{result = RDI_RegCodeX64_st4;}break;\r\ncase REGS_RegCodeX64_st5:{result = RDI_RegCodeX64_st5;}break;\r\ncase REGS_RegCodeX64_st6:{result = RDI_RegCodeX64_st6;}break;\r\ncase REGS_RegCodeX64_st7:{result = RDI_RegCodeX64_st7;}break;\r\ncase REGS_RegCodeX64_fcw:{result = RDI_RegCodeX64_fcw;}break;\r\ncase REGS_RegCodeX64_fsw:{result = RDI_RegCodeX64_fsw;}break;\r\ncase REGS_RegCodeX64_ftw:{result = RDI_RegCodeX64_ftw;}break;\r\ncase REGS_RegCodeX64_fop:{result = RDI_RegCodeX64_fop;}break;\r\ncase REGS_RegCodeX64_fcs:{result = RDI_RegCodeX64_fcs;}break;\r\ncase REGS_RegCodeX64_fds:{result = RDI_RegCodeX64_fds;}break;\r\ncase REGS_RegCodeX64_fip:{result = RDI_RegCodeX64_fip;}break;\r\ncase REGS_RegCodeX64_fdp:{result = RDI_RegCodeX64_fdp;}break;\r\ncase REGS_RegCodeX64_mxcsr:{result = RDI_RegCodeX64_mxcsr;}break;\r\ncase REGS_RegCodeX64_mxcsr_mask:{result = RDI_RegCodeX64_mxcsr_mask;}break;\r\ncase REGS_RegCodeX64_ss:{result = RDI_RegCodeX64_ss;}break;\r\ncase REGS_RegCodeX64_cs:{result = RDI_RegCodeX64_cs;}break;\r\ncase REGS_RegCodeX64_ds:{result = RDI_RegCodeX64_ds;}break;\r\ncase REGS_RegCodeX64_es:{result = RDI_RegCodeX64_es;}break;\r\ncase REGS_RegCodeX64_fs:{result = RDI_RegCodeX64_fs;}break;\r\ncase REGS_RegCodeX64_gs:{result = RDI_RegCodeX64_gs;}break;\r\ncase REGS_RegCodeX64_zmm0:{result = RDI_RegCodeX64_zmm0;}break;\r\ncase REGS_RegCodeX64_zmm1:{result = RDI_RegCodeX64_zmm1;}break;\r\ncase REGS_RegCodeX64_zmm2:{result = RDI_RegCodeX64_zmm2;}break;\r\ncase REGS_RegCodeX64_zmm3:{result = RDI_RegCodeX64_zmm3;}break;\r\ncase REGS_RegCodeX64_zmm4:{result = RDI_RegCodeX64_zmm4;}break;\r\ncase REGS_RegCodeX64_zmm5:{result = RDI_RegCodeX64_zmm5;}break;\r\ncase REGS_RegCodeX64_zmm6:{result = RDI_RegCodeX64_zmm6;}break;\r\ncase REGS_RegCodeX64_zmm7:{result = RDI_RegCodeX64_zmm7;}break;\r\ncase REGS_RegCodeX64_zmm8:{result = RDI_RegCodeX64_zmm8;}break;\r\ncase REGS_RegCodeX64_zmm9:{result = RDI_RegCodeX64_zmm9;}break;\r\ncase REGS_RegCodeX64_zmm10:{result = RDI_RegCodeX64_zmm10;}break;\r\ncase REGS_RegCodeX64_zmm11:{result = RDI_RegCodeX64_zmm11;}break;\r\ncase REGS_RegCodeX64_zmm12:{result = RDI_RegCodeX64_zmm12;}break;\r\ncase REGS_RegCodeX64_zmm13:{result = RDI_RegCodeX64_zmm13;}break;\r\ncase REGS_RegCodeX64_zmm14:{result = RDI_RegCodeX64_zmm14;}break;\r\ncase REGS_RegCodeX64_zmm15:{result = RDI_RegCodeX64_zmm15;}break;\r\ncase REGS_RegCodeX64_zmm16:{result = RDI_RegCodeX64_zmm16;}break;\r\ncase REGS_RegCodeX64_zmm17:{result = RDI_RegCodeX64_zmm17;}break;\r\ncase REGS_RegCodeX64_zmm18:{result = RDI_RegCodeX64_zmm18;}break;\r\ncase REGS_RegCodeX64_zmm19:{result = RDI_RegCodeX64_zmm19;}break;\r\ncase REGS_RegCodeX64_zmm20:{result = RDI_RegCodeX64_zmm20;}break;\r\ncase REGS_RegCodeX64_zmm21:{result = RDI_RegCodeX64_zmm21;}break;\r\ncase REGS_RegCodeX64_zmm22:{result = RDI_RegCodeX64_zmm22;}break;\r\ncase REGS_RegCodeX64_zmm23:{result = RDI_RegCodeX64_zmm23;}break;\r\ncase REGS_RegCodeX64_zmm24:{result = RDI_RegCodeX64_zmm24;}break;\r\ncase REGS_RegCodeX64_zmm25:{result = RDI_RegCodeX64_zmm25;}break;\r\ncase REGS_RegCodeX64_zmm26:{result = RDI_RegCodeX64_zmm26;}break;\r\ncase REGS_RegCodeX64_zmm27:{result = RDI_RegCodeX64_zmm27;}break;\r\ncase REGS_RegCodeX64_zmm28:{result = RDI_RegCodeX64_zmm28;}break;\r\ncase REGS_RegCodeX64_zmm29:{result = RDI_RegCodeX64_zmm29;}break;\r\ncase REGS_RegCodeX64_zmm30:{result = RDI_RegCodeX64_zmm30;}break;\r\ncase REGS_RegCodeX64_zmm31:{result = RDI_RegCodeX64_zmm31;}break;\r\ncase REGS_RegCodeX64_k0:{result = RDI_RegCodeX64_k0;}break;\r\ncase REGS_RegCodeX64_k1:{result = RDI_RegCodeX64_k1;}break;\r\ncase REGS_RegCodeX64_k2:{result = RDI_RegCodeX64_k2;}break;\r\ncase REGS_RegCodeX64_k3:{result = RDI_RegCodeX64_k3;}break;\r\ncase REGS_RegCodeX64_k4:{result = RDI_RegCodeX64_k4;}break;\r\ncase REGS_RegCodeX64_k5:{result = RDI_RegCodeX64_k5;}break;\r\ncase REGS_RegCodeX64_k6:{result = RDI_RegCodeX64_k6;}break;\r\ncase REGS_RegCodeX64_k7:{result = RDI_RegCodeX64_k7;}break;\r\ncase REGS_RegCodeX64_cetmsr:{result = RDI_RegCodeX64_cetmsr;}break;\r\ncase REGS_RegCodeX64_cetssp:{result = RDI_RegCodeX64_cetssp;}break;\r\ncase REGS_RegCodeX64_tr:{result = RDI_RegCodeX64_tr;}break;\r\ncase REGS_RegCodeX64_ldtr:{result = RDI_RegCodeX64_ldtr;}break;\r\n}\r\n}break;\r\ncase Arch_x86:\r\n{\r\nswitch(code)\r\n{\r\ndefault:{}break;\r\ncase REGS_RegCodeX86_eax:{result = RDI_RegCodeX86_eax;}break;\r\ncase REGS_RegCodeX86_ecx:{result = RDI_RegCodeX86_ecx;}break;\r\ncase REGS_RegCodeX86_edx:{result = RDI_RegCodeX86_edx;}break;\r\ncase REGS_RegCodeX86_ebx:{result = RDI_RegCodeX86_ebx;}break;\r\ncase REGS_RegCodeX86_esp:{result = RDI_RegCodeX86_esp;}break;\r\ncase REGS_RegCodeX86_ebp:{result = RDI_RegCodeX86_ebp;}break;\r\ncase REGS_RegCodeX86_esi:{result = RDI_RegCodeX86_esi;}break;\r\ncase REGS_RegCodeX86_edi:{result = RDI_RegCodeX86_edi;}break;\r\ncase REGS_RegCodeX86_fsbase:{result = RDI_RegCodeX86_fsbase;}break;\r\ncase REGS_RegCodeX86_gsbase:{result = RDI_RegCodeX86_gsbase;}break;\r\ncase REGS_RegCodeX86_eflags:{result = RDI_RegCodeX86_eflags;}break;\r\ncase REGS_RegCodeX86_eip:{result = RDI_RegCodeX86_eip;}break;\r\ncase REGS_RegCodeX86_dr0:{result = RDI_RegCodeX86_dr0;}break;\r\ncase REGS_RegCodeX86_dr1:{result = RDI_RegCodeX86_dr1;}break;\r\ncase REGS_RegCodeX86_dr2:{result = RDI_RegCodeX86_dr2;}break;\r\ncase REGS_RegCodeX86_dr3:{result = RDI_RegCodeX86_dr3;}break;\r\ncase REGS_RegCodeX86_dr4:{result = RDI_RegCodeX86_dr4;}break;\r\ncase REGS_RegCodeX86_dr5:{result = RDI_RegCodeX86_dr5;}break;\r\ncase REGS_RegCodeX86_dr6:{result = RDI_RegCodeX86_dr6;}break;\r\ncase REGS_RegCodeX86_dr7:{result = RDI_RegCodeX86_dr7;}break;\r\ncase REGS_RegCodeX86_fpr0:{result = RDI_RegCodeX86_fpr0;}break;\r\ncase REGS_RegCodeX86_fpr1:{result = RDI_RegCodeX86_fpr1;}break;\r\ncase REGS_RegCodeX86_fpr2:{result = RDI_RegCodeX86_fpr2;}break;\r\ncase REGS_RegCodeX86_fpr3:{result = RDI_RegCodeX86_fpr3;}break;\r\ncase REGS_RegCodeX86_fpr4:{result = RDI_RegCodeX86_fpr4;}break;\r\ncase REGS_RegCodeX86_fpr5:{result = RDI_RegCodeX86_fpr5;}break;\r\ncase REGS_RegCodeX86_fpr6:{result = RDI_RegCodeX86_fpr6;}break;\r\ncase REGS_RegCodeX86_fpr7:{result = RDI_RegCodeX86_fpr7;}break;\r\ncase REGS_RegCodeX86_st0:{result = RDI_RegCodeX86_st0;}break;\r\ncase REGS_RegCodeX86_st1:{result = RDI_RegCodeX86_st1;}break;\r\ncase REGS_RegCodeX86_st2:{result = RDI_RegCodeX86_st2;}break;\r\ncase REGS_RegCodeX86_st3:{result = RDI_RegCodeX86_st3;}break;\r\ncase REGS_RegCodeX86_st4:{result = RDI_RegCodeX86_st4;}break;\r\ncase REGS_RegCodeX86_st5:{result = RDI_RegCodeX86_st5;}break;\r\ncase REGS_RegCodeX86_st6:{result = RDI_RegCodeX86_st6;}break;\r\ncase REGS_RegCodeX86_st7:{result = RDI_RegCodeX86_st7;}break;\r\ncase REGS_RegCodeX86_fcw:{result = RDI_RegCodeX86_fcw;}break;\r\ncase REGS_RegCodeX86_fsw:{result = RDI_RegCodeX86_fsw;}break;\r\ncase REGS_RegCodeX86_ftw:{result = RDI_RegCodeX86_ftw;}break;\r\ncase REGS_RegCodeX86_fop:{result = RDI_RegCodeX86_fop;}break;\r\ncase REGS_RegCodeX86_fcs:{result = RDI_RegCodeX86_fcs;}break;\r\ncase REGS_RegCodeX86_fds:{result = RDI_RegCodeX86_fds;}break;\r\ncase REGS_RegCodeX86_fip:{result = RDI_RegCodeX86_fip;}break;\r\ncase REGS_RegCodeX86_fdp:{result = RDI_RegCodeX86_fdp;}break;\r\ncase REGS_RegCodeX86_mxcsr:{result = RDI_RegCodeX86_mxcsr;}break;\r\ncase REGS_RegCodeX86_mxcsr_mask:{result = RDI_RegCodeX86_mxcsr_mask;}break;\r\ncase REGS_RegCodeX86_ss:{result = RDI_RegCodeX86_ss;}break;\r\ncase REGS_RegCodeX86_cs:{result = RDI_RegCodeX86_cs;}break;\r\ncase REGS_RegCodeX86_ds:{result = RDI_RegCodeX86_ds;}break;\r\ncase REGS_RegCodeX86_es:{result = RDI_RegCodeX86_es;}break;\r\ncase REGS_RegCodeX86_fs:{result = RDI_RegCodeX86_fs;}break;\r\ncase REGS_RegCodeX86_gs:{result = RDI_RegCodeX86_gs;}break;\r\ncase REGS_RegCodeX86_tr:{result = RDI_RegCodeX86_tr;}break;\r\ncase REGS_RegCodeX86_ldtr:{result = RDI_RegCodeX86_ldtr;}break;\r\ncase REGS_RegCodeX86_ymm0:{result = RDI_RegCodeX86_ymm0;}break;\r\ncase REGS_RegCodeX86_ymm1:{result = RDI_RegCodeX86_ymm1;}break;\r\ncase REGS_RegCodeX86_ymm2:{result = RDI_RegCodeX86_ymm2;}break;\r\ncase REGS_RegCodeX86_ymm3:{result = RDI_RegCodeX86_ymm3;}break;\r\ncase REGS_RegCodeX86_ymm4:{result = RDI_RegCodeX86_ymm4;}break;\r\ncase REGS_RegCodeX86_ymm5:{result = RDI_RegCodeX86_ymm5;}break;\r\ncase REGS_RegCodeX86_ymm6:{result = RDI_RegCodeX86_ymm6;}break;\r\ncase REGS_RegCodeX86_ymm7:{result = RDI_RegCodeX86_ymm7;}break;\r\n}\r\n}break;\r\n}\r\nreturn result;\r\n}\r\ninternal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code)\r\n{\r\nREGS_RegCode result = 0;\r\nswitch(arch)\r\n{\r\ndefault:{}break;\r\ncase Arch_x64:\r\n{\r\nswitch(code)\r\n{\r\ndefault:{}break;\r\ncase RDI_RegCodeX64_rax:{result = REGS_RegCodeX64_rax;}break;\r\ncase RDI_RegCodeX64_rcx:{result = REGS_RegCodeX64_rcx;}break;\r\ncase RDI_RegCodeX64_rdx:{result = REGS_RegCodeX64_rdx;}break;\r\ncase RDI_RegCodeX64_rbx:{result = REGS_RegCodeX64_rbx;}break;\r\ncase RDI_RegCodeX64_rsp:{result = REGS_RegCodeX64_rsp;}break;\r\ncase RDI_RegCodeX64_rbp:{result = REGS_RegCodeX64_rbp;}break;\r\ncase RDI_RegCodeX64_rsi:{result = REGS_RegCodeX64_rsi;}break;\r\ncase RDI_RegCodeX64_rdi:{result = REGS_RegCodeX64_rdi;}break;\r\ncase RDI_RegCodeX64_r8:{result = REGS_RegCodeX64_r8;}break;\r\ncase RDI_RegCodeX64_r9:{result = REGS_RegCodeX64_r9;}break;\r\ncase RDI_RegCodeX64_r10:{result = REGS_RegCodeX64_r10;}break;\r\ncase RDI_RegCodeX64_r11:{result = REGS_RegCodeX64_r11;}break;\r\ncase RDI_RegCodeX64_r12:{result = REGS_RegCodeX64_r12;}break;\r\ncase RDI_RegCodeX64_r13:{result = REGS_RegCodeX64_r13;}break;\r\ncase RDI_RegCodeX64_r14:{result = REGS_RegCodeX64_r14;}break;\r\ncase RDI_RegCodeX64_r15:{result = REGS_RegCodeX64_r15;}break;\r\ncase RDI_RegCodeX64_fsbase:{result = REGS_RegCodeX64_fsbase;}break;\r\ncase RDI_RegCodeX64_gsbase:{result = REGS_RegCodeX64_gsbase;}break;\r\ncase RDI_RegCodeX64_rip:{result = REGS_RegCodeX64_rip;}break;\r\ncase RDI_RegCodeX64_rflags:{result = REGS_RegCodeX64_rflags;}break;\r\ncase RDI_RegCodeX64_dr0:{result = REGS_RegCodeX64_dr0;}break;\r\ncase RDI_RegCodeX64_dr1:{result = REGS_RegCodeX64_dr1;}break;\r\ncase RDI_RegCodeX64_dr2:{result = REGS_RegCodeX64_dr2;}break;\r\ncase RDI_RegCodeX64_dr3:{result = REGS_RegCodeX64_dr3;}break;\r\ncase RDI_RegCodeX64_dr4:{result = REGS_RegCodeX64_dr4;}break;\r\ncase RDI_RegCodeX64_dr5:{result = REGS_RegCodeX64_dr5;}break;\r\ncase RDI_RegCodeX64_dr6:{result = REGS_RegCodeX64_dr6;}break;\r\ncase RDI_RegCodeX64_dr7:{result = REGS_RegCodeX64_dr7;}break;\r\ncase RDI_RegCodeX64_fpr0:{result = REGS_RegCodeX64_fpr0;}break;\r\ncase RDI_RegCodeX64_fpr1:{result = REGS_RegCodeX64_fpr1;}break;\r\ncase RDI_RegCodeX64_fpr2:{result = REGS_RegCodeX64_fpr2;}break;\r\ncase RDI_RegCodeX64_fpr3:{result = REGS_RegCodeX64_fpr3;}break;\r\ncase RDI_RegCodeX64_fpr4:{result = REGS_RegCodeX64_fpr4;}break;\r\ncase RDI_RegCodeX64_fpr5:{result = REGS_RegCodeX64_fpr5;}break;\r\ncase RDI_RegCodeX64_fpr6:{result = REGS_RegCodeX64_fpr6;}break;\r\ncase RDI_RegCodeX64_fpr7:{result = REGS_RegCodeX64_fpr7;}break;\r\ncase RDI_RegCodeX64_st0:{result = REGS_RegCodeX64_st0;}break;\r\ncase RDI_RegCodeX64_st1:{result = REGS_RegCodeX64_st1;}break;\r\ncase RDI_RegCodeX64_st2:{result = REGS_RegCodeX64_st2;}break;\r\ncase RDI_RegCodeX64_st3:{result = REGS_RegCodeX64_st3;}break;\r\ncase RDI_RegCodeX64_st4:{result = REGS_RegCodeX64_st4;}break;\r\ncase RDI_RegCodeX64_st5:{result = REGS_RegCodeX64_st5;}break;\r\ncase RDI_RegCodeX64_st6:{result = REGS_RegCodeX64_st6;}break;\r\ncase RDI_RegCodeX64_st7:{result = REGS_RegCodeX64_st7;}break;\r\ncase RDI_RegCodeX64_fcw:{result = REGS_RegCodeX64_fcw;}break;\r\ncase RDI_RegCodeX64_fsw:{result = REGS_RegCodeX64_fsw;}break;\r\ncase RDI_RegCodeX64_ftw:{result = REGS_RegCodeX64_ftw;}break;\r\ncase RDI_RegCodeX64_fop:{result = REGS_RegCodeX64_fop;}break;\r\ncase RDI_RegCodeX64_fcs:{result = REGS_RegCodeX64_fcs;}break;\r\ncase RDI_RegCodeX64_fds:{result = REGS_RegCodeX64_fds;}break;\r\ncase RDI_RegCodeX64_fip:{result = REGS_RegCodeX64_fip;}break;\r\ncase RDI_RegCodeX64_fdp:{result = REGS_RegCodeX64_fdp;}break;\r\ncase RDI_RegCodeX64_mxcsr:{result = REGS_RegCodeX64_mxcsr;}break;\r\ncase RDI_RegCodeX64_mxcsr_mask:{result = REGS_RegCodeX64_mxcsr_mask;}break;\r\ncase RDI_RegCodeX64_ss:{result = REGS_RegCodeX64_ss;}break;\r\ncase RDI_RegCodeX64_cs:{result = REGS_RegCodeX64_cs;}break;\r\ncase RDI_RegCodeX64_ds:{result = REGS_RegCodeX64_ds;}break;\r\ncase RDI_RegCodeX64_es:{result = REGS_RegCodeX64_es;}break;\r\ncase RDI_RegCodeX64_fs:{result = REGS_RegCodeX64_fs;}break;\r\ncase RDI_RegCodeX64_gs:{result = REGS_RegCodeX64_gs;}break;\r\ncase RDI_RegCodeX64_zmm0:{result = REGS_RegCodeX64_zmm0;}break;\r\ncase RDI_RegCodeX64_zmm1:{result = REGS_RegCodeX64_zmm1;}break;\r\ncase RDI_RegCodeX64_zmm2:{result = REGS_RegCodeX64_zmm2;}break;\r\ncase RDI_RegCodeX64_zmm3:{result = REGS_RegCodeX64_zmm3;}break;\r\ncase RDI_RegCodeX64_zmm4:{result = REGS_RegCodeX64_zmm4;}break;\r\ncase RDI_RegCodeX64_zmm5:{result = REGS_RegCodeX64_zmm5;}break;\r\ncase RDI_RegCodeX64_zmm6:{result = REGS_RegCodeX64_zmm6;}break;\r\ncase RDI_RegCodeX64_zmm7:{result = REGS_RegCodeX64_zmm7;}break;\r\ncase RDI_RegCodeX64_zmm8:{result = REGS_RegCodeX64_zmm8;}break;\r\ncase RDI_RegCodeX64_zmm9:{result = REGS_RegCodeX64_zmm9;}break;\r\ncase RDI_RegCodeX64_zmm10:{result = REGS_RegCodeX64_zmm10;}break;\r\ncase RDI_RegCodeX64_zmm11:{result = REGS_RegCodeX64_zmm11;}break;\r\ncase RDI_RegCodeX64_zmm12:{result = REGS_RegCodeX64_zmm12;}break;\r\ncase RDI_RegCodeX64_zmm13:{result = REGS_RegCodeX64_zmm13;}break;\r\ncase RDI_RegCodeX64_zmm14:{result = REGS_RegCodeX64_zmm14;}break;\r\ncase RDI_RegCodeX64_zmm15:{result = REGS_RegCodeX64_zmm15;}break;\r\ncase RDI_RegCodeX64_zmm16:{result = REGS_RegCodeX64_zmm16;}break;\r\ncase RDI_RegCodeX64_zmm17:{result = REGS_RegCodeX64_zmm17;}break;\r\ncase RDI_RegCodeX64_zmm18:{result = REGS_RegCodeX64_zmm18;}break;\r\ncase RDI_RegCodeX64_zmm19:{result = REGS_RegCodeX64_zmm19;}break;\r\ncase RDI_RegCodeX64_zmm20:{result = REGS_RegCodeX64_zmm20;}break;\r\ncase RDI_RegCodeX64_zmm21:{result = REGS_RegCodeX64_zmm21;}break;\r\ncase RDI_RegCodeX64_zmm22:{result = REGS_RegCodeX64_zmm22;}break;\r\ncase RDI_RegCodeX64_zmm23:{result = REGS_RegCodeX64_zmm23;}break;\r\ncase RDI_RegCodeX64_zmm24:{result = REGS_RegCodeX64_zmm24;}break;\r\ncase RDI_RegCodeX64_zmm25:{result = REGS_RegCodeX64_zmm25;}break;\r\ncase RDI_RegCodeX64_zmm26:{result = REGS_RegCodeX64_zmm26;}break;\r\ncase RDI_RegCodeX64_zmm27:{result = REGS_RegCodeX64_zmm27;}break;\r\ncase RDI_RegCodeX64_zmm28:{result = REGS_RegCodeX64_zmm28;}break;\r\ncase RDI_RegCodeX64_zmm29:{result = REGS_RegCodeX64_zmm29;}break;\r\ncase RDI_RegCodeX64_zmm30:{result = REGS_RegCodeX64_zmm30;}break;\r\ncase RDI_RegCodeX64_zmm31:{result = REGS_RegCodeX64_zmm31;}break;\r\ncase RDI_RegCodeX64_k0:{result = REGS_RegCodeX64_k0;}break;\r\ncase RDI_RegCodeX64_k1:{result = REGS_RegCodeX64_k1;}break;\r\ncase RDI_RegCodeX64_k2:{result = REGS_RegCodeX64_k2;}break;\r\ncase RDI_RegCodeX64_k3:{result = REGS_RegCodeX64_k3;}break;\r\ncase RDI_RegCodeX64_k4:{result = REGS_RegCodeX64_k4;}break;\r\ncase RDI_RegCodeX64_k5:{result = REGS_RegCodeX64_k5;}break;\r\ncase RDI_RegCodeX64_k6:{result = REGS_RegCodeX64_k6;}break;\r\ncase RDI_RegCodeX64_k7:{result = REGS_RegCodeX64_k7;}break;\r\ncase RDI_RegCodeX64_cetmsr:{result = REGS_RegCodeX64_cetmsr;}break;\r\ncase RDI_RegCodeX64_cetssp:{result = REGS_RegCodeX64_cetssp;}break;\r\ncase RDI_RegCodeX64_tr:{result = REGS_RegCodeX64_tr;}break;\r\ncase RDI_RegCodeX64_ldtr:{result = REGS_RegCodeX64_ldtr;}break;\r\n}\r\n}break;\r\ncase Arch_x86:\r\n{\r\nswitch(code)\r\n{\r\ndefault:{}break;\r\ncase RDI_RegCodeX86_eax:{result = REGS_RegCodeX86_eax;}break;\r\ncase RDI_RegCodeX86_ecx:{result = REGS_RegCodeX86_ecx;}break;\r\ncase RDI_RegCodeX86_edx:{result = REGS_RegCodeX86_edx;}break;\r\ncase RDI_RegCodeX86_ebx:{result = REGS_RegCodeX86_ebx;}break;\r\ncase RDI_RegCodeX86_esp:{result = REGS_RegCodeX86_esp;}break;\r\ncase RDI_RegCodeX86_ebp:{result = REGS_RegCodeX86_ebp;}break;\r\ncase RDI_RegCodeX86_esi:{result = REGS_RegCodeX86_esi;}break;\r\ncase RDI_RegCodeX86_edi:{result = REGS_RegCodeX86_edi;}break;\r\ncase RDI_RegCodeX86_fsbase:{result = REGS_RegCodeX86_fsbase;}break;\r\ncase RDI_RegCodeX86_gsbase:{result = REGS_RegCodeX86_gsbase;}break;\r\ncase RDI_RegCodeX86_eflags:{result = REGS_RegCodeX86_eflags;}break;\r\ncase RDI_RegCodeX86_eip:{result = REGS_RegCodeX86_eip;}break;\r\ncase RDI_RegCodeX86_dr0:{result = REGS_RegCodeX86_dr0;}break;\r\ncase RDI_RegCodeX86_dr1:{result = REGS_RegCodeX86_dr1;}break;\r\ncase RDI_RegCodeX86_dr2:{result = REGS_RegCodeX86_dr2;}break;\r\ncase RDI_RegCodeX86_dr3:{result = REGS_RegCodeX86_dr3;}break;\r\ncase RDI_RegCodeX86_dr4:{result = REGS_RegCodeX86_dr4;}break;\r\ncase RDI_RegCodeX86_dr5:{result = REGS_RegCodeX86_dr5;}break;\r\ncase RDI_RegCodeX86_dr6:{result = REGS_RegCodeX86_dr6;}break;\r\ncase RDI_RegCodeX86_dr7:{result = REGS_RegCodeX86_dr7;}break;\r\ncase RDI_RegCodeX86_fpr0:{result = REGS_RegCodeX86_fpr0;}break;\r\ncase RDI_RegCodeX86_fpr1:{result = REGS_RegCodeX86_fpr1;}break;\r\ncase RDI_RegCodeX86_fpr2:{result = REGS_RegCodeX86_fpr2;}break;\r\ncase RDI_RegCodeX86_fpr3:{result = REGS_RegCodeX86_fpr3;}break;\r\ncase RDI_RegCodeX86_fpr4:{result = REGS_RegCodeX86_fpr4;}break;\r\ncase RDI_RegCodeX86_fpr5:{result = REGS_RegCodeX86_fpr5;}break;\r\ncase RDI_RegCodeX86_fpr6:{result = REGS_RegCodeX86_fpr6;}break;\r\ncase RDI_RegCodeX86_fpr7:{result = REGS_RegCodeX86_fpr7;}break;\r\ncase RDI_RegCodeX86_st0:{result = REGS_RegCodeX86_st0;}break;\r\ncase RDI_RegCodeX86_st1:{result = REGS_RegCodeX86_st1;}break;\r\ncase RDI_RegCodeX86_st2:{result = REGS_RegCodeX86_st2;}break;\r\ncase RDI_RegCodeX86_st3:{result = REGS_RegCodeX86_st3;}break;\r\ncase RDI_RegCodeX86_st4:{result = REGS_RegCodeX86_st4;}break;\r\ncase RDI_RegCodeX86_st5:{result = REGS_RegCodeX86_st5;}break;\r\ncase RDI_RegCodeX86_st6:{result = REGS_RegCodeX86_st6;}break;\r\ncase RDI_RegCodeX86_st7:{result = REGS_RegCodeX86_st7;}break;\r\ncase RDI_RegCodeX86_fcw:{result = REGS_RegCodeX86_fcw;}break;\r\ncase RDI_RegCodeX86_fsw:{result = REGS_RegCodeX86_fsw;}break;\r\ncase RDI_RegCodeX86_ftw:{result = REGS_RegCodeX86_ftw;}break;\r\ncase RDI_RegCodeX86_fop:{result = REGS_RegCodeX86_fop;}break;\r\ncase RDI_RegCodeX86_fcs:{result = REGS_RegCodeX86_fcs;}break;\r\ncase RDI_RegCodeX86_fds:{result = REGS_RegCodeX86_fds;}break;\r\ncase RDI_RegCodeX86_fip:{result = REGS_RegCodeX86_fip;}break;\r\ncase RDI_RegCodeX86_fdp:{result = REGS_RegCodeX86_fdp;}break;\r\ncase RDI_RegCodeX86_mxcsr:{result = REGS_RegCodeX86_mxcsr;}break;\r\ncase RDI_RegCodeX86_mxcsr_mask:{result = REGS_RegCodeX86_mxcsr_mask;}break;\r\ncase RDI_RegCodeX86_ss:{result = REGS_RegCodeX86_ss;}break;\r\ncase RDI_RegCodeX86_cs:{result = REGS_RegCodeX86_cs;}break;\r\ncase RDI_RegCodeX86_ds:{result = REGS_RegCodeX86_ds;}break;\r\ncase RDI_RegCodeX86_es:{result = REGS_RegCodeX86_es;}break;\r\ncase RDI_RegCodeX86_fs:{result = REGS_RegCodeX86_fs;}break;\r\ncase RDI_RegCodeX86_gs:{result = REGS_RegCodeX86_gs;}break;\r\ncase RDI_RegCodeX86_tr:{result = REGS_RegCodeX86_tr;}break;\r\ncase RDI_RegCodeX86_ldtr:{result = REGS_RegCodeX86_ldtr;}break;\r\ncase RDI_RegCodeX86_ymm0:{result = REGS_RegCodeX86_ymm0;}break;\r\ncase RDI_RegCodeX86_ymm1:{result = REGS_RegCodeX86_ymm1;}break;\r\ncase RDI_RegCodeX86_ymm2:{result = REGS_RegCodeX86_ymm2;}break;\r\ncase RDI_RegCodeX86_ymm3:{result = REGS_RegCodeX86_ymm3;}break;\r\ncase RDI_RegCodeX86_ymm4:{result = REGS_RegCodeX86_ymm4;}break;\r\ncase RDI_RegCodeX86_ymm5:{result = REGS_RegCodeX86_ymm5;}break;\r\ncase RDI_RegCodeX86_ymm6:{result = REGS_RegCodeX86_ymm6;}break;\r\ncase RDI_RegCodeX86_ymm7:{result = REGS_RegCodeX86_ymm7;}break;\r\n}\r\n}break;\r\n}\r\nreturn result;\r\n}\r\n"
  },
  {
    "path": "src/regs/rdi/generated/regs_rdi.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef REGS_RDI_META_H\r\n#define REGS_RDI_META_H\r\n\r\n#endif // REGS_RDI_META_H\r\n"
  },
  {
    "path": "src/regs/rdi/regs_rdi.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#include \"regs/rdi/generated/regs_rdi.meta.c\"\r\n"
  },
  {
    "path": "src/regs/rdi/regs_rdi.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef REGS_RDI_H\r\n#define REGS_RDI_H\r\n\r\ninternal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code);\r\ninternal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode reg);\r\n\r\n#endif //REGS_RDI_H\r\n"
  },
  {
    "path": "src/regs/rdi/regs_rdi.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: RADDBG Converter Helper Implementation Generators\r\n\r\n@gen @c_file\r\n{\r\n  `internal RDI_RegCode regs_rdi_code_from_arch_reg_code(Arch arch, REGS_RegCode code)`;\r\n  `{`;\r\n    `RDI_RegCode result = 0;`;\r\n    `switch(arch)`;\r\n    `{`;\r\n      `default:{}break;`;\r\n      `case Arch_x64:`;\r\n      `{`;\r\n        `switch(code)`\r\n          `{`;\r\n          `default:{}break;`;\r\n          @expand(REGS_RegTableX64 a) `case REGS_RegCodeX64_$(a.name):{result = RDI_RegCodeX64_$(a.name);}break;`;\r\n          `}`;\r\n        `}break;`;\r\n      `case Arch_x86:`;\r\n      `{`;\r\n        `switch(code)`\r\n          `{`;\r\n          `default:{}break;`;\r\n          @expand(REGS_RegTableX86 a) `case REGS_RegCodeX86_$(a.name):{result = RDI_RegCodeX86_$(a.name);}break;`;\r\n          `}`;\r\n        `}break;`;\r\n      `}`;\r\n    `return result;`;\r\n    `}`;\r\n}\r\n\r\n@gen @c_file\r\n{\r\n  `internal REGS_RegCode regs_reg_code_from_arch_rdi_code(Arch arch, RDI_RegCode code)`;\r\n  `{`;\r\n    `REGS_RegCode result = 0;`;\r\n    `switch(arch)`;\r\n    `{`;\r\n      `default:{}break;`;\r\n      `case Arch_x64:`;\r\n      `{`;\r\n        `switch(code)`\r\n          `{`;\r\n          `default:{}break;`;\r\n          @expand(REGS_RegTableX64 a) `case RDI_RegCodeX64_$(a.name):{result = REGS_RegCodeX64_$(a.name);}break;`;\r\n          `}`;\r\n        `}break;`;\r\n      `case Arch_x86:`;\r\n      `{`;\r\n        `switch(code)`\r\n          `{`;\r\n          `default:{}break;`;\r\n          @expand(REGS_RegTableX86 a) `case RDI_RegCodeX86_$(a.name):{result = REGS_RegCodeX86_$(a.name);}break;`;\r\n          `}`;\r\n        `}break;`;\r\n      `}`;\r\n    `return result;`;\r\n    `}`;\r\n}\r\n"
  },
  {
    "path": "src/regs/regs.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"regs/generated/regs.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal REGS_RegCode\r\nregs_reg_code_from_name(Arch arch, String8 name)\r\n{\r\n  String8 *name_table = regs_reg_code_string_table_from_arch(arch);\r\n  U64 name_count = regs_reg_code_count_from_arch(arch);\r\n  for EachIndex(i, name_count)\r\n  {\r\n    if(str8_match(name_table[i], name, StringMatchFlag_CaseInsensitive))\r\n    {\r\n      return (REGS_RegCode)i;\r\n    }\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal REGS_AliasCode\r\nregs_alias_code_from_name(Arch arch, String8 name)\r\n{\r\n  String8 *alias_table = regs_alias_code_string_table_from_arch(arch);\r\n  U64 alias_count = regs_alias_code_count_from_arch(arch);\r\n  for EachIndex(i, alias_count)\r\n  {\r\n    if(str8_match(alias_table[i], name, StringMatchFlag_CaseInsensitive))\r\n    {\r\n      return (REGS_RegCode)i;\r\n    }\r\n  }\r\n  return 0;\r\n}\r\n\r\ninternal Rng1U64\r\nregs_range_from_code(Arch arch, B32 is_alias, U64 reg_code)\r\n{\r\n  Rng1U64 range = {0};\r\n  if(is_alias)\r\n  {\r\n    REGS_Slice slice = regs_alias_code_slice_table_from_arch(arch)[reg_code];\r\n    REGS_Rng   rng   = regs_reg_code_rng_table_from_arch(arch)[reg_code];\r\n    range = r1u64(rng.byte_off + slice.byte_off, rng.byte_off + slice.byte_off + slice.byte_size);\r\n  }\r\n  else\r\n  {\r\n    REGS_Rng rng = regs_reg_code_rng_table_from_arch(arch)[reg_code];\r\n    range = r1u64(rng.byte_off, rng.byte_off + rng.byte_size);\r\n  }\r\n  return range;\r\n}\r\n\r\ninternal U64\r\nregs_rip_from_arch_block(Arch arch, void *block)\r\n{\r\n  U64 result = 0;\r\n  if(block != 0) switch(arch)\r\n  {\r\n    default:{}break;\r\n    case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rip.u64;}break;\r\n    case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->eip.u32;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nregs_rsp_from_arch_block(Arch arch, void *block)\r\n{\r\n  U64 result = 0;\r\n  if(block != 0) switch(arch)\r\n  {\r\n    default:{}break;\r\n    case Arch_x64:{result = ((REGS_RegBlockX64 *)block)->rsp.u64;}break;\r\n    case Arch_x86:{result = (U64)((REGS_RegBlockX86 *)block)->esp.u32;}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nregs_arch_block_write_rip(Arch arch, void *block, U64 rip)\r\n{\r\n  if(block != 0) switch(arch)\r\n  {\r\n    default:{}break;\r\n    case Arch_x64:{((REGS_RegBlockX64 *)block)->rip.u64 = rip;}break;\r\n    case Arch_x86:{((REGS_RegBlockX86 *)block)->eip.u32 = (U32)rip;}break;\r\n  }\r\n}\r\n\r\ninternal void\r\nregs_arch_block_write_rsp(Arch arch, void *block, U64 rsp)\r\n{\r\n  if(block != 0) switch(arch)\r\n  {\r\n    default:{}break;\r\n    case Arch_x64:{((REGS_RegBlockX64 *)block)->rsp.u64 = rsp;}break;\r\n    case Arch_x86:{((REGS_RegBlockX86 *)block)->esp.u32 = (U32)rsp;}break;\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/regs/regs.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef REGS_H\n#define REGS_H\n\n////////////////////////////////\n//~ rjf: Register Usage Kinds\n\ntypedef enum REGS_UsageKind\n{\n  REGS_UsageKind_Normal,\n  REGS_UsageKind_Vector,\n}\nREGS_UsageKind;\n\n////////////////////////////////\n//~ rjf: Register Types\n\ntypedef U8 REGS_RegCode;\ntypedef U8 REGS_AliasCode;\n\ntypedef union REGS_Reg16 REGS_Reg16;\nunion REGS_Reg16\n{\n  U8 v[2];\n  U16 u16;\n};\n\ntypedef union REGS_Reg32 REGS_Reg32;\nunion REGS_Reg32\n{\n  U8 v[4];\n  U32 u32;\n  F32 f32;\n};\n\ntypedef union REGS_Reg64 REGS_Reg64;\nunion REGS_Reg64\n{\n  U8 v[8];\n  U64 u64;\n  F64 f64;\n};\n\n#pragma pack(push, 1)\ntypedef struct REGS_Reg80 REGS_Reg80;\nstruct REGS_Reg80\n{\n  U64 int1_frac63;\n  U16 sign1_exp15;\n};\n#pragma pack(pop)\n\ntypedef union REGS_Reg128 REGS_Reg128;\nunion REGS_Reg128\n{\n  U8 v[16];\n  U32 u32[4];\n  F32 f32[4];\n  U64 u64[2];\n  F64 f64[2];\n};\n\ntypedef union REGS_Reg256 REGS_Reg256;\nunion REGS_Reg256\n{\n  U8 v[32];\n  U32 u32[8];\n  F32 f32[8];\n  U64 u64[4];\n  F64 f64[4];\n};\n\ntypedef union REGS_Reg512 REGS_Reg512;\nunion REGS_Reg512\n{\n  U8 v[64];\n  U32 u32[16];\n  F32 f32[16];\n  U64 u64[8];\n  F64 f64[8];\n};\n\n////////////////////////////////\n//~ rjf: Register Slicing Types\n\ntypedef struct REGS_Rng REGS_Rng;\nstruct REGS_Rng\n{\n  U16 byte_off;\n  U16 byte_size;\n};\n\ntypedef struct REGS_Slice REGS_Slice;\nstruct REGS_Slice\n{\n  U16 code;\n  U8 byte_off;\n  U8 byte_size;\n};\n\n////////////////////////////////\n//~ rjf: Generated Code\n\n#include \"regs/generated/regs.meta.h\"\n\n////////////////////////////////\n//~ rjf: Helpers\n\ninternal REGS_RegCode regs_reg_code_from_name(Arch arch, String8 name);\ninternal REGS_AliasCode regs_alias_code_from_name(Arch arch, String8 name);\ninternal Rng1U64 regs_range_from_code(Arch arch, B32 is_alias, U64 reg_code);\ninternal U64 regs_block_size_from_arch(Arch arch);\ninternal U64 regs_reg_code_count_from_arch(Arch arch);\ninternal U64 regs_alias_code_count_from_arch(Arch arch);\ninternal String8 *regs_reg_code_string_table_from_arch(Arch arch);\ninternal String8 *regs_alias_code_string_table_from_arch(Arch arch);\ninternal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch);\ninternal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch);\ninternal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch);\ninternal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch);\ninternal U64 regs_rip_from_arch_block(Arch arch, void *block);\ninternal U64 regs_rsp_from_arch_block(Arch arch, void *block);\ninternal void regs_arch_block_write_rip(Arch arch, void *block, U64 rip);\ninternal void regs_arch_block_write_rsp(Arch arch, void *block, U64 rsp);\n\n#endif // REGS_H\n"
  },
  {
    "path": "src/regs/regs.mdesk",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: X64 Tables\n\n@table(name size usage)\nREGS_RegTableX64:\n{\n  {rax                            64   Normal}\n  {rcx                            64   Normal}\n  {rdx                            64   Normal}\n  {rbx                            64   Normal}\n  {rsp                            64   Normal}\n  {rbp                            64   Normal}\n  {rsi                            64   Normal}\n  {rdi                            64   Normal}\n  {r8                             64   Normal}\n  {r9                             64   Normal}\n  {r10                            64   Normal}\n  {r11                            64   Normal}\n  {r12                            64   Normal}\n  {r13                            64   Normal}\n  {r14                            64   Normal}\n  {r15                            64   Normal}\n  {fsbase                         64   Normal}\n  {gsbase                         64   Normal}\n  {rip                            64   Normal}\n  {rflags                         64   Normal}\n  {dr0                            64   Normal}\n  {dr1                            64   Normal}\n  {dr2                            64   Normal}\n  {dr3                            64   Normal}\n  {dr4                            64   Normal}\n  {dr5                            64   Normal}\n  {dr6                            64   Normal}\n  {dr7                            64   Normal}\n  {fpr0                           80   Normal}\n  {fpr1                           80   Normal}\n  {fpr2                           80   Normal}\n  {fpr3                           80   Normal}\n  {fpr4                           80   Normal}\n  {fpr5                           80   Normal}\n  {fpr6                           80   Normal}\n  {fpr7                           80   Normal}\n  {st0                            80   Normal}\n  {st1                            80   Normal}\n  {st2                            80   Normal}\n  {st3                            80   Normal}\n  {st4                            80   Normal}\n  {st5                            80   Normal}\n  {st6                            80   Normal}\n  {st7                            80   Normal}\n  {fcw                            16   Normal}\n  {fsw                            16   Normal}\n  {ftw                            16   Normal}\n  {fop                            16   Normal}\n  {fcs                            16   Normal}\n  {fds                            16   Normal}\n  {fip                            64   Normal}\n  {fdp                            64   Normal}\n  {mxcsr                          32   Normal}\n  {mxcsr_mask                     32   Normal}\n  {ss                             16   Normal}\n  {cs                             16   Normal}\n  {ds                             16   Normal}\n  {es                             16   Normal}\n  {fs                             16   Normal}\n  {gs                             16   Normal}\n  {zmm0                           512  Vector}\n  {zmm1                           512  Vector}\n  {zmm2                           512  Vector}\n  {zmm3                           512  Vector}\n  {zmm4                           512  Vector}\n  {zmm5                           512  Vector}\n  {zmm6                           512  Vector}\n  {zmm7                           512  Vector}\n  {zmm8                           512  Vector}\n  {zmm9                           512  Vector}\n  {zmm10                          512  Vector}\n  {zmm11                          512  Vector}\n  {zmm12                          512  Vector}\n  {zmm13                          512  Vector}\n  {zmm14                          512  Vector}\n  {zmm15                          512  Vector}\n  {zmm16                          512  Vector}\n  {zmm17                          512  Vector}\n  {zmm18                          512  Vector}\n  {zmm19                          512  Vector}\n  {zmm20                          512  Vector}\n  {zmm21                          512  Vector}\n  {zmm22                          512  Vector}\n  {zmm23                          512  Vector}\n  {zmm24                          512  Vector}\n  {zmm25                          512  Vector}\n  {zmm26                          512  Vector}\n  {zmm27                          512  Vector}\n  {zmm28                          512  Vector}\n  {zmm29                          512  Vector}\n  {zmm30                          512  Vector}\n  {zmm31                          512  Vector}\n  {k0                             64   Normal}\n  {k1                             64   Normal}\n  {k2                             64   Normal}\n  {k3                             64   Normal}\n  {k4                             64   Normal}\n  {k5                             64   Normal}\n  {k6                             64   Normal}\n  {k7                             64   Normal}\n  {cetmsr                         64   Normal}\n  {cetssp                         64   Normal}\n  {tr                             16   Normal}\n  {ldtr                           16   Normal}\n}\n\n@table(name base off size usage)\nREGS_AliasTableX64:\n{\n  {eax             rax    0      32     Normal}\n  {ecx             rcx    0      32     Normal}\n  {edx             rdx    0      32     Normal}\n  {ebx             rbx    0      32     Normal}\n  {esp             rsp    0      32     Normal}\n  {ebp             rbp    0      32     Normal}\n  {esi             rsi    0      32     Normal}\n  {edi             rdi    0      32     Normal}\n  {r8d             r8     0      32     Normal}\n  {r9d             r9     0      32     Normal}\n  {r10d            r10    0      32     Normal}\n  {r11d            r11    0      32     Normal}\n  {r12d            r12    0      32     Normal}\n  {r13d            r13    0      32     Normal}\n  {r14d            r14    0      32     Normal}\n  {r15d            r15    0      32     Normal}\n  \n  // TODO(allen): figure this one out; visual studio disagrees\n  {eip             rip    0      32     Normal}\n  \n  {eflags          rflags 0      32     Normal}\n  {ax              rax    0      16     Normal}\n  {cx              rcx    0      16     Normal}\n  {dx              rdx    0      16     Normal}\n  {bx              rbx    0      16     Normal}\n  {si              rsi    0      16     Normal}\n  {di              rdi    0      16     Normal}\n  {sp              rsp    0      16     Normal}\n  {bp              rbp    0      16     Normal}\n  {ip              rip    0      16     Normal}\n  {r8w             r8     0      16     Normal}\n  {r9w             r9     0      16     Normal}\n  {r10w            r10    0      16     Normal}\n  {r11w            r11    0      16     Normal}\n  {r12w            r12    0      16     Normal}\n  {r13w            r13    0      16     Normal}\n  {r14w            r14    0      16     Normal}\n  {r15w            r15    0      16     Normal}\n  {al              rax    0      8      Normal}\n  {cl              rcx    0      8      Normal}\n  {dl              rdx    0      8      Normal}\n  {bl              rbx    0      8      Normal}\n  {sil             rsi    0      8      Normal}\n  {dil             rdi    0      8      Normal}\n  {bpl             rbp    0      8      Normal}\n  {spl             rsp    0      8      Normal}\n  {r8b             r8     0      8      Normal}\n  {r9b             r9     0      8      Normal}\n  {r10b            r10    0      8      Normal}\n  {r11b            r11    0      8      Normal}\n  {r12b            r12    0      8      Normal}\n  {r13b            r13    0      8      Normal}\n  {r14b            r14    0      8      Normal}\n  {r15b            r15    0      8      Normal}\n  {ah              rax    8      8      Normal}\n  {ch              rcx    8      8      Normal}\n  {dh              rdx    8      8      Normal}\n  {bh              rbx    8      8      Normal}\n  {xmm0            zmm0   0      128    Vector}\n  {xmm1            zmm1   0      128    Vector}\n  {xmm2            zmm2   0      128    Vector}\n  {xmm3            zmm3   0      128    Vector}\n  {xmm4            zmm4   0      128    Vector}\n  {xmm5            zmm5   0      128    Vector}\n  {xmm6            zmm6   0      128    Vector}\n  {xmm7            zmm7   0      128    Vector}\n  {xmm8            zmm8   0      128    Vector}\n  {xmm9            zmm9   0      128    Vector}\n  {xmm10           zmm10  0      128    Vector}\n  {xmm11           zmm11  0      128    Vector}\n  {xmm12           zmm12  0      128    Vector}\n  {xmm13           zmm13  0      128    Vector}\n  {xmm14           zmm14  0      128    Vector}\n  {xmm15           zmm15  0      128    Vector}\n  {ymm0            zmm0   0      256    Vector}\n  {ymm1            zmm1   0      256    Vector}\n  {ymm2            zmm2   0      256    Vector}\n  {ymm3            zmm3   0      256    Vector}\n  {ymm4            zmm4   0      256    Vector}\n  {ymm5            zmm5   0      256    Vector}\n  {ymm6            zmm6   0      256    Vector}\n  {ymm7            zmm7   0      256    Vector}\n  {ymm8            zmm8   0      256    Vector}\n  {ymm9            zmm9   0      256    Vector}\n  {ymm10           zmm10  0      256    Vector}\n  {ymm11           zmm11  0      256    Vector}\n  {ymm12           zmm12  0      256    Vector}\n  {ymm13           zmm13  0      256    Vector}\n  {ymm14           zmm14  0      256    Vector}\n  {ymm15           zmm15  0      256    Vector}\n  {mm0             fpr0   0      64     Vector}\n  {mm1             fpr1   0      64     Vector}\n  {mm2             fpr2   0      64     Vector}\n  {mm3             fpr3   0      64     Vector}\n  {mm4             fpr4   0      64     Vector}\n  {mm5             fpr5   0      64     Vector}\n  {mm6             fpr6   0      64     Vector}\n  {mm7             fpr7   0      64     Vector}\n}\n\n////////////////////////////////\n//~ rjf: X86 Tables\n\n@table(name size usage)\nREGS_RegTableX86:\n{\n  {eax                       32  Normal}\n  {ecx                       32  Normal}\n  {edx                       32  Normal}\n  {ebx                       32  Normal}\n  {esp                       32  Normal}\n  {ebp                       32  Normal}\n  {esi                       32  Normal}\n  {edi                       32  Normal}\n  {fsbase                    32  Normal}\n  {gsbase                    32  Normal}\n  {eflags                    32  Normal}\n  {eip                       32  Normal}\n  {dr0                       32  Normal}\n  {dr1                       32  Normal}\n  {dr2                       32  Normal}\n  {dr3                       32  Normal}\n  {dr4                       32  Normal}\n  {dr5                       32  Normal}\n  {dr6                       32  Normal}\n  {dr7                       32  Normal}\n  // FSave registers\n  // TODO(allen): I am suspicious of this stuff here.\n  // Are fpr0-7 and st0-7 actually different things? Visual studio doesn't show\n  // frp0-7. Not sure if the mm0-7 aliases are setup the right way either.\n  {fpr0                      80  Normal}\n  {fpr1                      80  Normal}\n  {fpr2                      80  Normal}\n  {fpr3                      80  Normal}\n  {fpr4                      80  Normal}\n  {fpr5                      80  Normal}\n  {fpr6                      80  Normal}\n  {fpr7                      80  Normal}\n  {st0                       80  Normal}\n  {st1                       80  Normal}\n  {st2                       80  Normal}\n  {st3                       80  Normal}\n  {st4                       80  Normal}\n  {st5                       80  Normal}\n  {st6                       80  Normal}\n  {st7                       80  Normal}\n  {fcw                       16  Normal}\n  {fsw                       16  Normal}\n  {ftw                       16  Normal}\n  {fop                       16  Normal}\n  {fcs                       16  Normal}\n  {fds                       16  Normal}\n  {fip                       32  Normal}\n  {fdp                       32  Normal}\n  {mxcsr                     32  Normal}\n  // TODO(allen): I don't think this is really a \"register\" - think about this...\n  {mxcsr_mask                32  Normal}\n  {ss                        16  Normal}\n  {cs                        16  Normal}\n  {ds                        16  Normal}\n  {es                        16  Normal}\n  {fs                        16  Normal}\n  {gs                        16  Normal}\n  {tr                        16  Normal}\n  {ldtr                      16  Normal}\n  // SIMD REGISTERS\n  {ymm0                      256 Vector}\n  {ymm1                      256 Vector}\n  {ymm2                      256 Vector}\n  {ymm3                      256 Vector}\n  {ymm4                      256 Vector}\n  {ymm5                      256 Vector}\n  {ymm6                      256 Vector}\n  {ymm7                      256 Vector}\n}\n\n@table(name base off size usage)\nREGS_AliasTableX86:\n{\n  {ax     eax    0      16    Normal}\n  {cx     ecx    0      16    Normal}\n  {bx     ebx    0      16    Normal}\n  {dx     edx    0      16    Normal}\n  {sp     esp    0      16    Normal}\n  {bp     ebp    0      16    Normal}\n  {si     esi    0      16    Normal}\n  {di     edi    0      16    Normal}\n  {ip     eip    0      16    Normal}\n  {ah     eax    8      8     Normal}\n  {ch     ecx    8      8     Normal}\n  {dh     edx    8      8     Normal}\n  {bh     ebx    8      8     Normal}\n  {al     eax    0      8     Normal}\n  {cl     ecx    0      8     Normal}\n  {dl     edx    0      8     Normal}\n  {bl     ebx    0      8     Normal}\n  {bpl    ebp    0      8     Normal}\n  {spl    esp    0      8     Normal}\n  {xmm0   ymm0   0      128   Vector}\n  {xmm1   ymm1   0      128   Vector}\n  {xmm2   ymm2   0      128   Vector}\n  {xmm3   ymm3   0      128   Vector}\n  {xmm4   ymm4   0      128   Vector}\n  {xmm5   ymm5   0      128   Vector}\n  {xmm6   ymm6   0      128   Vector}\n  {xmm7   ymm7   0      128   Vector}\n  {mm0    fpr0   0      64    Vector}\n  {mm1    fpr1   0      64    Vector}\n  {mm2    fpr2   0      64    Vector}\n  {mm3    fpr3   0      64    Vector}\n  {mm4    fpr4   0      64    Vector}\n  {mm5    fpr5   0      64    Vector}\n  {mm6    fpr6   0      64    Vector}\n  {mm7    fpr7   0      64    Vector}\n}\n\n////////////////////////////////\n//~ rjf: Architecture Tables\n\n@table(name, name_lower)\nREGS_ArchTable:\n{\n  {X64 x64}\n  {X86 x86}\n}\n\n////////////////////////////////\n//~ rjf: X64 Generators\n\n@enum REGS_RegCodeX64:\n{\n  NULL,\n  @expand(REGS_RegTableX64 a) `$(a.name)`,\n  COUNT,\n}\n\n@enum REGS_AliasCodeX64:\n{\n  NULL,\n  @expand(REGS_AliasTableX64 a) `$(a.name)`,\n  COUNT,\n}\n\n@struct REGS_RegBlockX64:\n{\n  @expand(REGS_RegTableX64 a) `REGS_Reg$(a.size) $(a.name)`,\n}\n\n@data(REGS_UsageKind) regs_g_reg_code_x64_usage_kind_table:\n{\n  `REGS_UsageKind_Normal`;\n  @expand(REGS_RegTableX64 a) `REGS_UsageKind_$(a.usage)`;\n}\n\n@data(REGS_UsageKind)\nregs_g_alias_code_x64_usage_kind_table:\n{\n  `REGS_UsageKind_Normal`;\n  @expand(REGS_AliasTableX64 a) `REGS_UsageKind_$(a.usage)`;\n}\n\n@data(String8) regs_g_reg_code_x64_string_table:\n{\n  `str8_lit_comp(\"\")`;\n  @expand(REGS_RegTableX64 a) `str8_lit_comp(\"$(a.name)\")`;\n}\n\n@data(String8) regs_g_alias_code_x64_string_table:\n{\n  `str8_lit_comp(\"\")`;\n  @expand(REGS_AliasTableX64 a) `str8_lit_comp(\"$(a.name)\")`;\n}\n\n@data(REGS_Rng) regs_g_reg_code_x64_rng_table:\n{\n  `{0}`;\n  @expand(REGS_RegTableX64 a) `{(U16)OffsetOf(REGS_RegBlockX64, $(a.name)), $(a.size/8)}`,\n}\n\n@data(REGS_Slice) regs_g_alias_code_x64_slice_table:\n{\n  `{0}`;\n  @expand(REGS_AliasTableX64 a) `{REGS_RegCodeX64_$(a.base), $(a.off/8), $(a.size/8)}`,\n}\n\n////////////////////////////////\n//~ rjf: X86 Generators\n\n@enum REGS_RegCodeX86:\n{\n  NULL,\n  @expand(REGS_RegTableX86 a) `$(a.name)`,\n  COUNT,\n}\n\n@enum REGS_AliasCodeX86:\n{\n  NULL,\n  @expand(REGS_AliasTableX86 a) `$(a.name)`,\n  COUNT,\n}\n\n@struct REGS_RegBlockX86:\n{\n  @expand(REGS_RegTableX86 a) `REGS_Reg$(a.size) $(a.name)`,\n}\n\n@data(REGS_UsageKind)\nregs_g_reg_code_x86_usage_kind_table:\n{\n  `REGS_UsageKind_Normal`;\n  @expand(REGS_RegTableX86 a) `REGS_UsageKind_$(a.usage)`;\n}\n\n@data(REGS_UsageKind) regs_g_alias_code_x86_usage_kind_table:\n{\n  `REGS_UsageKind_Normal`;\n  @expand(REGS_AliasTableX86 a) `REGS_UsageKind_$(a.usage)`;\n}\n\n@data(String8) regs_g_reg_code_x86_string_table:\n{\n  `str8_lit_comp(\"\")`;\n  @expand(REGS_RegTableX86 a) `str8_lit_comp(\"$(a.name)\")`;\n}\n\n@data(String8) regs_g_alias_code_x86_string_table:\n{\n  `str8_lit_comp(\"\")`;\n  @expand(REGS_AliasTableX86 a) `str8_lit_comp(\"$(a.name)\")`;\n}\n\n@data(REGS_Rng) regs_g_reg_code_x86_rng_table:\n{\n  `{0}`;\n  @expand(REGS_RegTableX86 a) `{(U16)OffsetOf(REGS_RegBlockX86, $(a.name)), $(a.size/8)}`,\n}\n\n@data(REGS_Slice) regs_g_alias_code_x86_slice_table:\n{\n  `{0}`;\n  @expand(REGS_AliasTableX86 a) `{REGS_RegCodeX86_$(a.base), $(a.off/8), $(a.size/8)}`,\n}\n\n////////////////////////////////\n//~ rjf: Architecture-Dynamic Helper Implementation Generators\n\n@c_file @gen\n{\n  `internal U64 regs_block_size_from_arch(Arch arch)`;\n  `{`;\n    `U64 result = 8;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = sizeof(REGS_RegBlock$(a.name));}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal U64 regs_reg_code_count_from_arch(Arch arch)`;\n  `{`;\n    `U64 result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_RegCode$(a.name)_COUNT;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal U64 regs_alias_code_count_from_arch(Arch arch)`;\n  `{`;\n    `U64 result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = REGS_AliasCode$(a.name)_COUNT;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal String8 *regs_reg_code_string_table_from_arch(Arch arch)`;\n  `{`;\n    `String8 *result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_string_table;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal String8 *regs_alias_code_string_table_from_arch(Arch arch)`;\n  `{`;\n    `String8 *result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_string_table;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal REGS_Rng *regs_reg_code_rng_table_from_arch(Arch arch)`;\n  `{`;\n    `REGS_Rng *result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_rng_table;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal REGS_Slice *regs_alias_code_slice_table_from_arch(Arch arch)`;\n  `{`;\n    `REGS_Slice *result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_slice_table;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal REGS_UsageKind *regs_reg_code_usage_kind_table_from_arch(Arch arch)`;\n  `{`;\n    `REGS_UsageKind *result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_reg_code_$(a.name_lower)_usage_kind_table;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n\n@c_file @gen\n{\n  `internal REGS_UsageKind *regs_alias_code_usage_kind_table_from_arch(Arch arch)`;\n  `{`;\n    `REGS_UsageKind *result = 0;`;\n    `switch(arch)`;\n    `{`;\n      `default:{}break;`;\n      @expand(REGS_ArchTable a) `case Arch_$(a.name_lower):{result = regs_g_alias_code_$(a.name_lower)_usage_kind_table;}break;`;\n      `}`;\n    `return result;`;\n    `}`;\n}\n"
  },
  {
    "path": "src/render/d3d11/generated/render_d3d11.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8* r_d3d11_g_vshad_kind_source_table[5] =\r\n{\r\n&r_d3d11_g_rect_shader_src,\r\n&r_d3d11_g_blur_shader_src,\r\n&r_d3d11_g_mesh_shader_src,\r\n&r_d3d11_g_geo3dcomposite_shader_src,\r\n&r_d3d11_g_finalize_shader_src,\r\n};\r\n\r\nString8 r_d3d11_g_vshad_kind_source_name_table[5] =\r\n{\r\nstr8_lit_comp(\"r_d3d11_g_rect_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_blur_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_mesh_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_geo3dcomposite_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_finalize_shader_src\"),\r\n};\r\n\r\nD3D11_INPUT_ELEMENT_DESC * r_d3d11_g_vshad_kind_elements_ptr_table[5] =\r\n{\r\nr_d3d11_g_rect_ilay_elements,\r\n0,\r\nr_d3d11_g_mesh_ilay_elements,\r\n0,\r\n0,\r\n};\r\n\r\nU64 r_d3d11_g_vshad_kind_elements_count_table[5] =\r\n{\r\nArrayCount(r_d3d11_g_rect_ilay_elements) ,\r\n 0,\r\nArrayCount(r_d3d11_g_mesh_ilay_elements) ,\r\n 0,\r\n 0,\r\n};\r\n\r\nString8* r_d3d11_g_pshad_kind_source_table[5] =\r\n{\r\n&r_d3d11_g_rect_shader_src,\r\n&r_d3d11_g_blur_shader_src,\r\n&r_d3d11_g_mesh_shader_src,\r\n&r_d3d11_g_geo3dcomposite_shader_src,\r\n&r_d3d11_g_finalize_shader_src,\r\n};\r\n\r\nString8 r_d3d11_g_pshad_kind_source_name_table[5] =\r\n{\r\nstr8_lit_comp(\"r_d3d11_g_rect_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_blur_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_mesh_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_geo3dcomposite_shader_src\"),\r\nstr8_lit_comp(\"r_d3d11_g_finalize_shader_src\"),\r\n};\r\n\r\nU64 r_d3d11_g_uniform_type_kind_size_table[3] =\r\n{\r\nsizeof(R_D3D11_Uniforms_Rect),\r\nsizeof(R_D3D11_Uniforms_Blur),\r\nsizeof(R_D3D11_Uniforms_Mesh),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/render/d3d11/generated/render_d3d11.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef RENDER_D3D11_META_H\r\n#define RENDER_D3D11_META_H\r\n\r\ntypedef enum R_D3D11_VShadKind\r\n{\r\nR_D3D11_VShadKind_Rect,\r\nR_D3D11_VShadKind_Blur,\r\nR_D3D11_VShadKind_Mesh,\r\nR_D3D11_VShadKind_Geo3DComposite,\r\nR_D3D11_VShadKind_Finalize,\r\nR_D3D11_VShadKind_COUNT,\r\n} R_D3D11_VShadKind;\r\n\r\ntypedef enum R_D3D11_PShadKind\r\n{\r\nR_D3D11_PShadKind_Rect,\r\nR_D3D11_PShadKind_Blur,\r\nR_D3D11_PShadKind_Mesh,\r\nR_D3D11_PShadKind_Geo3DComposite,\r\nR_D3D11_PShadKind_Finalize,\r\nR_D3D11_PShadKind_COUNT,\r\n} R_D3D11_PShadKind;\r\n\r\ntypedef enum R_D3D11_UniformTypeKind\r\n{\r\nR_D3D11_UniformTypeKind_Rect,\r\nR_D3D11_UniformTypeKind_Blur,\r\nR_D3D11_UniformTypeKind_Mesh,\r\nR_D3D11_UniformTypeKind_COUNT,\r\n} R_D3D11_UniformTypeKind;\r\n\r\nC_LINKAGE_BEGIN\r\nread_only global String8 r_d3d11_g_rect_shader_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"cbuffer Globals : register(b0)\\n\"\r\n\"{\\n\"\r\n\"  float2 viewport_size_px;\\n\"\r\n\"  float opacity;\\n\"\r\n\"  row_major float4x4 texture_sample_channel_map;\\n\"\r\n\"  float2 texture_t2d_size_px;\\n\"\r\n\"  row_major float3x3 xform;\\n\"\r\n\"  float2 xform_scale;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"struct CPU2Vertex\\n\"\r\n\"{\\n\"\r\n\"  float4 dst_rect_px     : POS;\\n\"\r\n\"  float4 src_rect_px     : TEX;\\n\"\r\n\"  float4 color00         : COL0;\\n\"\r\n\"  float4 color01         : COL1;\\n\"\r\n\"  float4 color10         : COL2;\\n\"\r\n\"  float4 color11         : COL3;\\n\"\r\n\"  float4 corner_radii_px : CRAD;\\n\"\r\n\"  float4 style_params    : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\\n\"\r\n\"  uint vertex_id         : SV_VertexID;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"struct Vertex2Pixel\\n\"\r\n\"{\\n\"\r\n\"  float4 position           : SV_POSITION;\\n\"\r\n\"  nointerpolation float2 rect_half_size_px  : PSIZE;\\n\"\r\n\"  float2 texcoord_pct       : TEX;\\n\"\r\n\"  float2 sdf_sample_pos     : SDF;\\n\"\r\n\"  float4 tint               : TINT;\\n\"\r\n\"  float corner_radius_px    : CRAD;\\n\"\r\n\"  nointerpolation float border_thickness_px : BTHC;\\n\"\r\n\"  nointerpolation float softness_px         : SFT;\\n\"\r\n\"  nointerpolation float omit_texture        : OTX;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"Texture2D    main_t2d     : register(t0);\\n\"\r\n\"SamplerState main_sampler : register(s0);\\n\"\r\n\"\\n\"\r\n\"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\\n\"\r\n\"{\\n\"\r\n\"  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"float linear_from_srgb_f32(float x)\\n\"\r\n\"{\\n\"\r\n\"  return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"float4 linear_from_srgba(float4 v)\\n\"\r\n\"{\\n\"\r\n\"  float4 result = float4(linear_from_srgb_f32(v.x),\\n\"\r\n\"                         linear_from_srgb_f32(v.y),\\n\"\r\n\"                         linear_from_srgb_f32(v.z),\\n\"\r\n\"                         v.w);\\n\"\r\n\"  return result;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"//- rjf: vertex shader\\n\"\r\n\"\\n\"\r\n\"Vertex2Pixel\\n\"\r\n\"vs_main(CPU2Vertex cpu2vertex)\\n\"\r\n\"{\\n\"\r\n\"  //- rjf: unpack & xform rectangle src/dst vertices\\n\"\r\n\"  float2 dst_p0_px  = cpu2vertex.dst_rect_px.xy;\\n\"\r\n\"  float2 dst_p1_px  = cpu2vertex.dst_rect_px.zw;\\n\"\r\n\"  float2 src_p0_px  = cpu2vertex.src_rect_px.xy;\\n\"\r\n\"  float2 src_p1_px  = cpu2vertex.src_rect_px.zw;\\n\"\r\n\"  float2 dst_size_px = abs(dst_p1_px - dst_p0_px);\\n\"\r\n\"  \\n\"\r\n\"  //- rjf: unpack style params\\n\"\r\n\"  float border_thickness_px = cpu2vertex.style_params.x;\\n\"\r\n\"  float softness_px         = cpu2vertex.style_params.y;\\n\"\r\n\"  float omit_texture        = cpu2vertex.style_params.z;\\n\"\r\n\"  float shear_px            = cpu2vertex.style_params.w;\\n\"\r\n\"  \\n\"\r\n\"  //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\\n\"\r\n\"  float2 dst_p_verts_px[] =\\n\"\r\n\"  {\\n\"\r\n\"    float2(dst_p0_px.x, dst_p1_px.y),\\n\"\r\n\"    float2(dst_p0_px.x, dst_p0_px.y),\\n\"\r\n\"    float2(dst_p1_px.x, dst_p1_px.y + shear_px),\\n\"\r\n\"    float2(dst_p1_px.x, dst_p0_px.y + shear_px),\\n\"\r\n\"  };\\n\"\r\n\"  float2 src_p_verts_px[] =\\n\"\r\n\"  {\\n\"\r\n\"    float2(src_p0_px.x, src_p1_px.y),\\n\"\r\n\"    float2(src_p0_px.x, src_p0_px.y),\\n\"\r\n\"    float2(src_p1_px.x, src_p1_px.y),\\n\"\r\n\"    float2(src_p1_px.x, src_p0_px.y),\\n\"\r\n\"  };\\n\"\r\n\"  float dst_r_verts_px[] =\\n\"\r\n\"  {\\n\"\r\n\"    cpu2vertex.corner_radii_px.y,\\n\"\r\n\"    cpu2vertex.corner_radii_px.x,\\n\"\r\n\"    cpu2vertex.corner_radii_px.w,\\n\"\r\n\"    cpu2vertex.corner_radii_px.z,\\n\"\r\n\"  };\\n\"\r\n\"  float4 src_color[] =\\n\"\r\n\"  {\\n\"\r\n\"    cpu2vertex.color01,\\n\"\r\n\"    cpu2vertex.color00,\\n\"\r\n\"    cpu2vertex.color11,\\n\"\r\n\"    cpu2vertex.color10,\\n\"\r\n\"  };\\n\"\r\n\"  float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\\n\"\r\n\"                                (cpu2vertex.vertex_id & 1)  ? 0.f : 1.f);\\n\"\r\n\"  \\n\"\r\n\"  // rjf: fill vertex -> pixel data\\n\"\r\n\"  Vertex2Pixel vertex2pixel;\\n\"\r\n\"  {\\n\"\r\n\"    float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\\n\"\r\n\"    xformed_pos.y = viewport_size_px.y - xformed_pos.y;\\n\"\r\n\"    vertex2pixel.position.xy          = 2.f * xformed_pos/viewport_size_px - 1.f;\\n\"\r\n\"    vertex2pixel.position.z           = 0.f;\\n\"\r\n\"    vertex2pixel.position.w           = 1.f;\\n\"\r\n\"    vertex2pixel.rect_half_size_px    = dst_size_px / 2.f * xform_scale;\\n\"\r\n\"    vertex2pixel.texcoord_pct         = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\\n\"\r\n\"    vertex2pixel.sdf_sample_pos       = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\\n\"\r\n\"    vertex2pixel.tint                 = src_color[cpu2vertex.vertex_id];\\n\"\r\n\"    vertex2pixel.corner_radius_px     = dst_r_verts_px[cpu2vertex.vertex_id];\\n\"\r\n\"    vertex2pixel.border_thickness_px  = border_thickness_px;\\n\"\r\n\"    vertex2pixel.softness_px          = softness_px;\\n\"\r\n\"    vertex2pixel.omit_texture         = omit_texture;\\n\"\r\n\"  }\\n\"\r\n\"  return vertex2pixel;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"//- rjf: pixel shader\\n\"\r\n\"\\n\"\r\n\"float4\\n\"\r\n\"ps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\\n\"\r\n\"{\\n\"\r\n\"  // rjf: blend corner colors to produce final tint\\n\"\r\n\"  float4 tint = vertex2pixel.tint;\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample texture\\n\"\r\n\"  float4 albedo_sample = float4(1, 1, 1, 1);\\n\"\r\n\"  if(vertex2pixel.omit_texture < 1)\\n\"\r\n\"  {\\n\"\r\n\"    albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map);\\n\"\r\n\"    albedo_sample = linear_from_srgba(albedo_sample);\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: determine SDF sample position\\n\"\r\n\"  float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample for borders\\n\"\r\n\"  float border_sdf_t = 1;\\n\"\r\n\"  if(vertex2pixel.border_thickness_px > 0)\\n\"\r\n\"  {\\n\"\r\n\"    float border_sdf_s = rect_sdf(sdf_sample_pos,\\n\"\r\n\"                                  vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px,\\n\"\r\n\"                                  max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0));\\n\"\r\n\"    border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s);\\n\"\r\n\"  }\\n\"\r\n\"  if(border_sdf_t < 0.001f)\\n\"\r\n\"  {\\n\"\r\n\"    discard;\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample for corners\\n\"\r\n\"  float corner_sdf_t = 1;\\n\"\r\n\"  if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f)\\n\"\r\n\"  {\\n\"\r\n\"    float corner_sdf_s = rect_sdf(sdf_sample_pos,\\n\"\r\n\"                                  vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f),\\n\"\r\n\"                                  vertex2pixel.corner_radius_px);\\n\"\r\n\"    corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s);\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: form+return final color\\n\"\r\n\"  float4 final_color = albedo_sample;\\n\"\r\n\"  final_color *= tint;\\n\"\r\n\"  final_color.a *= opacity;\\n\"\r\n\"  final_color.a *= corner_sdf_t;\\n\"\r\n\"  final_color.a *= border_sdf_t;\\n\"\r\n\"  return final_color;\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_d3d11_g_blur_shader_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"cbuffer Globals : register(b0)\\n\"\r\n\"{\\n\"\r\n\"  float4 rect;\\n\"\r\n\"  float4 corner_radii_px;\\n\"\r\n\"  float2 direction;\\n\"\r\n\"  float2 viewport_size;\\n\"\r\n\"  uint blur_count;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"cbuffer Kernel : register(b1)\\n\"\r\n\"{\\n\"\r\n\"  float4 kernel[32];\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"struct CPU2Vertex\\n\"\r\n\"{\\n\"\r\n\"  uint vertex_id         : SV_VertexID;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"struct Vertex2Pixel\\n\"\r\n\"{\\n\"\r\n\"  float4 position        : SV_POSITION;\\n\"\r\n\"  float2 texcoord        : TEX;\\n\"\r\n\"  float2 sdf_sample_pos  : SDF;\\n\"\r\n\"  nointerpolation float2 rect_half_size : RHS;\\n\"\r\n\"  float corner_radius    : RAD;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"Texture2D    stage_t2d     : register(t0);\\n\"\r\n\"SamplerState stage_sampler : register(s0);\\n\"\r\n\"\\n\"\r\n\"float rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\\n\"\r\n\"{\\n\"\r\n\"  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"//- rjf: vertex shader\\n\"\r\n\"\\n\"\r\n\"Vertex2Pixel\\n\"\r\n\"vs_main(CPU2Vertex c2v)\\n\"\r\n\"{\\n\"\r\n\"  float2 vertex_positions__scrn[] =\\n\"\r\n\"  {\\n\"\r\n\"    rect.xw,\\n\"\r\n\"    rect.xy,\\n\"\r\n\"    rect.zw,\\n\"\r\n\"    rect.zy,\\n\"\r\n\"  };\\n\"\r\n\"  float corner_radii__px[] =\\n\"\r\n\"  {\\n\"\r\n\"    corner_radii_px.y,\\n\"\r\n\"    corner_radii_px.x,\\n\"\r\n\"    corner_radii_px.w,\\n\"\r\n\"    corner_radii_px.z,\\n\"\r\n\"  };\\n\"\r\n\"  float2 cornercoords__pct = float2((c2v.vertex_id >> 1) ? 1.f : 0.f,\\n\"\r\n\"                                    (c2v.vertex_id & 1)  ? 0.f : 1.f);\\n\"\r\n\"  \\n\"\r\n\"  float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\\n\"\r\n\"  float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\\n\"\r\n\"  \\n\"\r\n\"  float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\\n\"\r\n\"  \\n\"\r\n\"  Vertex2Pixel v2p;\\n\"\r\n\"  {\\n\"\r\n\"    v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\\n\"\r\n\"    v2p.texcoord = vertex_position__pct;\\n\"\r\n\"    v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\\n\"\r\n\"    v2p.rect_half_size = rect_half_size - 2.f;\\n\"\r\n\"    v2p.corner_radius = corner_radii__px[c2v.vertex_id];\\n\"\r\n\"  }\\n\"\r\n\"  return v2p;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"//- rjf: pixel shader\\n\"\r\n\"\\n\"\r\n\"float4\\n\"\r\n\"ps_main(Vertex2Pixel v2p) : SV_TARGET\\n\"\r\n\"{\\n\"\r\n\"  // rjf: blend weighted texture samples into color\\n\"\r\n\"  float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\\n\"\r\n\"  \\n\"\r\n\"  for(uint i = 1; i < blur_count; i += 1)\\n\"\r\n\"  {\\n\"\r\n\"    float weight = kernel[i].x;\\n\"\r\n\"    float offset = kernel[i].y;\\n\"\r\n\"    color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\\n\"\r\n\"    color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample for corners\\n\"\r\n\"  float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\\n\"\r\n\"  float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\\n\"\r\n\"  \\n\"\r\n\"  // rjf: weight output color by sdf\\n\"\r\n\"  // this is doing alpha testing, leave blurring only where mostly opaque pixels are\\n\"\r\n\"  if (corner_sdf_t < 0.9f)\\n\"\r\n\"  {\\n\"\r\n\"    discard;\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  return float4(color, 1.f);\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_d3d11_g_mesh_shader_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"cbuffer Uniforms : register(b0)\\n\"\r\n\"{\\n\"\r\n\"  row_major float4x4 xform;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"struct CPU2Vertex\\n\"\r\n\"{\\n\"\r\n\"  float3 position : POS;\\n\"\r\n\"  float3 normal   : NOR;\\n\"\r\n\"  float2 texcoord : TEX;\\n\"\r\n\"  float3 color    : COL;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"struct Vertex2Pixel\\n\"\r\n\"{\\n\"\r\n\"  float4 position : SV_POSITION;\\n\"\r\n\"  float2 texcoord : TEX;\\n\"\r\n\"  float4 color    : COL;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"Vertex2Pixel vs_main(CPU2Vertex c2v)\\n\"\r\n\"{\\n\"\r\n\"  Vertex2Pixel v2p;\\n\"\r\n\"  v2p.position = mul(float4(c2v.position, 1.f), xform);\\n\"\r\n\"  v2p.texcoord = c2v.texcoord;\\n\"\r\n\"  v2p.color    = float4(c2v.color, 1.f);\\n\"\r\n\"  return v2p;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"float4 ps_main(Vertex2Pixel v2p) : SV_TARGET\\n\"\r\n\"{\\n\"\r\n\"  return v2p.color;\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_d3d11_g_geo3dcomposite_shader_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"struct CPU2Vertex\\n\"\r\n\"{\\n\"\r\n\"  uint vertex_id         : SV_VertexID;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"struct Vertex2Pixel\\n\"\r\n\"{\\n\"\r\n\"  float4 position        : SV_POSITION;\\n\"\r\n\"  float2 texcoord        : TEX;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"Texture2D    stage_t2d     : register(t0);\\n\"\r\n\"SamplerState stage_sampler : register(s0);\\n\"\r\n\"\\n\"\r\n\"//- rjf: vertex shader\\n\"\r\n\"\\n\"\r\n\"Vertex2Pixel\\n\"\r\n\"vs_main(CPU2Vertex c2v)\\n\"\r\n\"{\\n\"\r\n\"  float4 vertex_positions__modl[] =\\n\"\r\n\"  {\\n\"\r\n\"    float4(0, 0, 0, 1),\\n\"\r\n\"    float4(0, 1, 0, 1),\\n\"\r\n\"    float4(1, 0, 0, 1),\\n\"\r\n\"    float4(1, 1, 0, 1),\\n\"\r\n\"  };\\n\"\r\n\"  float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\\n\"\r\n\"  float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\\n\"\r\n\"  float2 texcoord              = float2(vertex_position__modl.x, vertex_position__modl.y);\\n\"\r\n\"  texcoord.y = 1-texcoord.y;\\n\"\r\n\"  Vertex2Pixel v2p;\\n\"\r\n\"  {\\n\"\r\n\"    v2p.position = vertex_position__clip;\\n\"\r\n\"    v2p.texcoord = texcoord;\\n\"\r\n\"  }\\n\"\r\n\"  return v2p;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"//- rjf: pixel shader\\n\"\r\n\"\\n\"\r\n\"float4\\n\"\r\n\"ps_main(Vertex2Pixel v2p) : SV_TARGET\\n\"\r\n\"{\\n\"\r\n\"  float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\\n\"\r\n\"  return final_color;\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_d3d11_g_finalize_shader_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"struct CPU2Vertex\\n\"\r\n\"{\\n\"\r\n\"  uint vertex_id         : SV_VertexID;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"struct Vertex2Pixel\\n\"\r\n\"{\\n\"\r\n\"  float4 position        : SV_POSITION;\\n\"\r\n\"  float2 texcoord        : TEX;\\n\"\r\n\"};\\n\"\r\n\"\\n\"\r\n\"Texture2D    stage_t2d     : register(t0);\\n\"\r\n\"SamplerState stage_sampler : register(s0);\\n\"\r\n\"\\n\"\r\n\"//- rjf: vertex shader\\n\"\r\n\"\\n\"\r\n\"Vertex2Pixel\\n\"\r\n\"vs_main(CPU2Vertex c2v)\\n\"\r\n\"{\\n\"\r\n\"  float4 vertex_positions__modl[] =\\n\"\r\n\"  {\\n\"\r\n\"    float4(0, 0, 0, 1),\\n\"\r\n\"    float4(0, 1, 0, 1),\\n\"\r\n\"    float4(1, 0, 0, 1),\\n\"\r\n\"    float4(1, 1, 0, 1),\\n\"\r\n\"  };\\n\"\r\n\"  float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\\n\"\r\n\"  float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\\n\"\r\n\"  float2 texcoord              = float2(vertex_position__modl.x, vertex_position__modl.y);\\n\"\r\n\"  texcoord.y = 1-texcoord.y;\\n\"\r\n\"  Vertex2Pixel v2p;\\n\"\r\n\"  {\\n\"\r\n\"    v2p.position = vertex_position__clip;\\n\"\r\n\"    v2p.texcoord = texcoord;\\n\"\r\n\"  }\\n\"\r\n\"  return v2p;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"//- rjf: pixel shader\\n\"\r\n\"\\n\"\r\n\"float4\\n\"\r\n\"ps_main(Vertex2Pixel v2p) : SV_TARGET\\n\"\r\n\"{\\n\"\r\n\"  float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\\n\"\r\n\"  final_color.a = 1;\\n\"\r\n\"  return final_color;\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // RENDER_D3D11_META_H\r\n"
  },
  {
    "path": "src/render/d3d11/render_d3d11.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Input Layout Element Tables\r\n\r\nglobal D3D11_INPUT_ELEMENT_DESC r_d3d11_g_rect_ilay_elements[] =\r\n{\r\n  { \"POS\",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0,                            0, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"TEX\",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"COL\",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"COL\",  1, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"COL\",  2, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"COL\",  3, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"CRAD\", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n  { \"STY\",  0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },\r\n};\r\n\r\nglobal D3D11_INPUT_ELEMENT_DESC r_d3d11_g_mesh_ilay_elements[] =\r\n{\r\n  { \"POS\", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0,                            0, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r\n  { \"NOR\", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r\n  { \"TEX\", 0, DXGI_FORMAT_R32G32_FLOAT,    0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r\n  { \"COL\", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/render_d3d11.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal R_D3D11_Window *\r\nr_d3d11_window_from_handle(R_Handle handle)\r\n{\r\n  R_D3D11_Window *window = (R_D3D11_Window *)handle.u64[0];\r\n  if(window == 0)\r\n  {\r\n    window = &r_d3d11_window_nil;\r\n  }\r\n  return window;\r\n}\r\n\r\ninternal R_Handle\r\nr_d3d11_handle_from_window(R_D3D11_Window *window)\r\n{\r\n  R_Handle handle = {0};\r\n  handle.u64[0] = (U64)window;\r\n  return handle;\r\n}\r\n\r\ninternal R_D3D11_Tex2D *\r\nr_d3d11_tex2d_from_handle(R_Handle handle)\r\n{\r\n  R_D3D11_Tex2D *texture = (R_D3D11_Tex2D *)handle.u64[0];\r\n  if(texture == 0)\r\n  {\r\n    texture = &r_d3d11_tex2d_nil;\r\n  }\r\n  return texture;\r\n}\r\n\r\ninternal R_Handle\r\nr_d3d11_handle_from_tex2d(R_D3D11_Tex2D *texture)\r\n{\r\n  R_Handle handle = {0};\r\n  handle.u64[0] = (U64)texture;\r\n  return handle;\r\n}\r\n\r\ninternal R_D3D11_Buffer *\r\nr_d3d11_buffer_from_handle(R_Handle handle)\r\n{\r\n  R_D3D11_Buffer *buffer = (R_D3D11_Buffer *)handle.u64[0];\r\n  if(buffer == 0)\r\n  {\r\n    buffer = &r_d3d11_buffer_nil;\r\n  }\r\n  return buffer;\r\n}\r\n\r\ninternal R_Handle\r\nr_d3d11_handle_from_buffer(R_D3D11_Buffer *buffer)\r\n{\r\n  R_Handle handle = {0};\r\n  handle.u64[0] = (U64)buffer;\r\n  return handle;\r\n}\r\n\r\ninternal ID3D11Buffer *\r\nr_d3d11_instance_buffer_from_size(U64 size)\r\n{\r\n  ID3D11Buffer *buffer = r_d3d11_state->instance_scratch_buffer_64kb;\r\n  if(size > KB(64))\r\n  {\r\n    U64 flushed_buffer_size = size;\r\n    flushed_buffer_size += MB(1)-1;\r\n    flushed_buffer_size -= flushed_buffer_size%MB(1);\r\n    \r\n    // rjf: build buffer\r\n    {\r\n      D3D11_BUFFER_DESC desc = {0};\r\n      {\r\n        desc.ByteWidth      = flushed_buffer_size;\r\n        desc.Usage          = D3D11_USAGE_DYNAMIC;\r\n        desc.BindFlags      = D3D11_BIND_VERTEX_BUFFER;\r\n        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\r\n      }\r\n      HRESULT error = r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &buffer);\r\n    }\r\n    \r\n    // rjf: push buffer to flush list\r\n    R_D3D11_FlushBuffer *n = push_array(r_d3d11_state->buffer_flush_arena, R_D3D11_FlushBuffer, 1);\r\n    n->buffer = buffer;\r\n    SLLQueuePush(r_d3d11_state->first_buffer_to_flush, r_d3d11_state->last_buffer_to_flush, n);\r\n  }\r\n  return buffer;\r\n}\r\n\r\ninternal void\r\nr_usage_access_flags_from_resource_kind(R_ResourceKind kind, D3D11_USAGE *out_d3d11_usage, UINT *out_cpu_access_flags)\r\n{\r\n  switch(kind)\r\n  {\r\n    case R_ResourceKind_Static:\r\n    {\r\n      *out_d3d11_usage = D3D11_USAGE_IMMUTABLE;\r\n      *out_cpu_access_flags = 0;\r\n    }break;\r\n    case R_ResourceKind_Dynamic:\r\n    {\r\n      *out_d3d11_usage = D3D11_USAGE_DEFAULT;\r\n      *out_cpu_access_flags = 0;\r\n    }break;\r\n    case R_ResourceKind_Stream:\r\n    {\r\n      *out_d3d11_usage = D3D11_USAGE_DYNAMIC;\r\n      *out_cpu_access_flags = D3D11_CPU_ACCESS_WRITE;\r\n    }break;\r\n    default:\r\n    {\r\n      InvalidPath;\r\n    }\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Hook Implementations\r\n\r\n//- rjf: top-level layer initialization\r\n\r\nr_hook void\r\nr_init(CmdLine *cmdln)\r\n{\r\n  ProfBeginFunction();\r\n  HRESULT error = 0;\r\n  Arena *arena = arena_alloc();\r\n  r_d3d11_state = push_array(arena, R_D3D11_State, 1);\r\n  r_d3d11_state->arena = arena;\r\n  r_d3d11_state->device_rw_mutex = rw_mutex_alloc();\r\n  \r\n  //- rjf: create base device\r\n  ProfBegin(\"create base device\");\r\n  UINT creation_flags = D3D11_CREATE_DEVICE_BGRA_SUPPORT;\r\n#if BUILD_DEBUG\r\n  if(cmd_line_has_flag(cmdln, str8_lit(\"d3d11_debug\")))\r\n  {\r\n    creation_flags |= D3D11_CREATE_DEVICE_DEBUG;\r\n  }\r\n#endif\r\n  D3D_FEATURE_LEVEL feature_levels[] = { D3D_FEATURE_LEVEL_11_0 };\r\n  D3D_DRIVER_TYPE driver_type = D3D_DRIVER_TYPE_HARDWARE;\r\n  if(cmd_line_has_flag(cmdln, str8_lit(\"force_d3d11_software\")))\r\n  {\r\n    driver_type = D3D_DRIVER_TYPE_WARP;\r\n  }\r\n  error = D3D11CreateDevice(0,\r\n                            driver_type,\r\n                            0,\r\n                            creation_flags,\r\n                            feature_levels, ArrayCount(feature_levels),\r\n                            D3D11_SDK_VERSION,\r\n                            &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx);\r\n  if(FAILED(error) && driver_type == D3D_DRIVER_TYPE_HARDWARE)\r\n  {\r\n    // try with WARP driver as backup solution in case HW device is not available\r\n    error = D3D11CreateDevice(0,\r\n                              D3D_DRIVER_TYPE_WARP,\r\n                              0,\r\n                              creation_flags,\r\n                              feature_levels, ArrayCount(feature_levels),\r\n                              D3D11_SDK_VERSION,\r\n                              &r_d3d11_state->base_device, 0, &r_d3d11_state->base_device_ctx);\r\n  }\r\n  if(FAILED(error))\r\n  {\r\n    char buffer[256] = {0};\r\n    raddbg_snprintf(buffer, sizeof(buffer), \"D3D11 device creation failure (%lx). The process is terminating.\", error);\r\n    os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_cstring(buffer));\r\n    os_abort(1);\r\n  }\r\n  ProfEnd();\r\n  \r\n  //- rjf: enable break-on-error\r\n#if BUILD_DEBUG\r\n  if(cmd_line_has_flag(cmdln, str8_lit(\"d3d11_debug\"))) ProfScope(\"enable break-on-error\")\r\n  {\r\n    ID3D11InfoQueue *info = 0;\r\n    error = r_d3d11_state->base_device->lpVtbl->QueryInterface(r_d3d11_state->base_device, &IID_ID3D11InfoQueue, (void **)(&info));\r\n    if(SUCCEEDED(error))\r\n    {\r\n      error = info->lpVtbl->SetBreakOnSeverity(info, D3D11_MESSAGE_SEVERITY_CORRUPTION, TRUE);\r\n      error = info->lpVtbl->SetBreakOnSeverity(info, D3D11_MESSAGE_SEVERITY_ERROR, TRUE);\r\n      info->lpVtbl->Release(info);\r\n    }\r\n  }\r\n#endif\r\n  \r\n  //- rjf: get main device\r\n  ProfBegin(\"get main device\");\r\n  error = r_d3d11_state->base_device->lpVtbl->QueryInterface(r_d3d11_state->base_device, &IID_ID3D11Device1, (void **)(&r_d3d11_state->device));\r\n  error = r_d3d11_state->base_device_ctx->lpVtbl->QueryInterface(r_d3d11_state->base_device_ctx, &IID_ID3D11DeviceContext1, (void **)(&r_d3d11_state->device_ctx));\r\n  ProfEnd();\r\n  \r\n  //- rjf: get dxgi device/adapter/factory\r\n  ProfBegin(\"get dxgi device/adapter/factory\");\r\n  error = r_d3d11_state->device->lpVtbl->QueryInterface(r_d3d11_state->device, &IID_IDXGIDevice1, (void **)(&r_d3d11_state->dxgi_device));\r\n  error = r_d3d11_state->dxgi_device->lpVtbl->GetAdapter(r_d3d11_state->dxgi_device, &r_d3d11_state->dxgi_adapter);\r\n  error = r_d3d11_state->dxgi_adapter->lpVtbl->GetParent(r_d3d11_state->dxgi_adapter, &IID_IDXGIFactory2, (void **)(&r_d3d11_state->dxgi_factory));\r\n  error = r_d3d11_state->dxgi_device->lpVtbl->SetMaximumFrameLatency(r_d3d11_state->dxgi_device, 1);\r\n  ProfEnd();\r\n  \r\n  //- rjf: create main rasterizer\r\n  ProfScope(\"create main rasterizer\")\r\n  {\r\n    D3D11_RASTERIZER_DESC1 desc = {D3D11_FILL_SOLID};\r\n    {\r\n      desc.FillMode = D3D11_FILL_SOLID;\r\n      desc.CullMode = D3D11_CULL_BACK;\r\n      desc.ScissorEnable = 1;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateRasterizerState1(r_d3d11_state->device, &desc, &r_d3d11_state->main_rasterizer);\r\n  }\r\n  \r\n  //- rjf: create main blend state\r\n  ProfScope(\"create main blend state\")\r\n  {\r\n    D3D11_BLEND_DESC desc = {0};\r\n    {\r\n      desc.RenderTarget[0].BlendEnable            = 1;\r\n      desc.RenderTarget[0].SrcBlend               = D3D11_BLEND_SRC_ALPHA;\r\n      desc.RenderTarget[0].DestBlend              = D3D11_BLEND_INV_SRC_ALPHA; \r\n      desc.RenderTarget[0].BlendOp                = D3D11_BLEND_OP_ADD;\r\n      desc.RenderTarget[0].SrcBlendAlpha          = D3D11_BLEND_ONE;\r\n      desc.RenderTarget[0].DestBlendAlpha         = D3D11_BLEND_ZERO;\r\n      desc.RenderTarget[0].BlendOpAlpha           = D3D11_BLEND_OP_ADD;\r\n      desc.RenderTarget[0].RenderTargetWriteMask  = D3D11_COLOR_WRITE_ENABLE_ALL;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateBlendState(r_d3d11_state->device, &desc, &r_d3d11_state->main_blend_state);\r\n  }\r\n  \r\n  //- rjf: create empty blend state\r\n  ProfScope(\"create empty blend state\")\r\n  {\r\n    D3D11_BLEND_DESC desc = {0};\r\n    {\r\n      desc.RenderTarget[0].BlendEnable           = FALSE;\r\n      desc.RenderTarget[0].RenderTargetWriteMask = D3D11_COLOR_WRITE_ENABLE_ALL;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateBlendState(r_d3d11_state->device, &desc, &r_d3d11_state->no_blend_state);\r\n  }\r\n  \r\n  //- rjf: create nearest-neighbor sampler\r\n  ProfScope(\"create nearest-neighbor sampler\")\r\n  {\r\n    D3D11_SAMPLER_DESC desc = zero_struct;\r\n    {\r\n      desc.Filter         = D3D11_FILTER_MIN_MAG_MIP_POINT;\r\n      desc.AddressU       = D3D11_TEXTURE_ADDRESS_WRAP;\r\n      desc.AddressV       = D3D11_TEXTURE_ADDRESS_WRAP;\r\n      desc.AddressW       = D3D11_TEXTURE_ADDRESS_WRAP;\r\n      desc.ComparisonFunc = D3D11_COMPARISON_NEVER;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateSamplerState(r_d3d11_state->device, &desc, &r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest]);\r\n  }\r\n  \r\n  //- rjf: create bilinear sampler\r\n  ProfScope(\"create bilinear sampler\")\r\n  {\r\n    D3D11_SAMPLER_DESC desc = zero_struct;\r\n    {\r\n      desc.Filter         = D3D11_FILTER_MIN_MAG_MIP_LINEAR;\r\n      desc.AddressU       = D3D11_TEXTURE_ADDRESS_WRAP;\r\n      desc.AddressV       = D3D11_TEXTURE_ADDRESS_WRAP;\r\n      desc.AddressW       = D3D11_TEXTURE_ADDRESS_WRAP;\r\n      desc.ComparisonFunc = D3D11_COMPARISON_NEVER;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateSamplerState(r_d3d11_state->device, &desc, &r_d3d11_state->samplers[R_Tex2DSampleKind_Linear]);\r\n  }\r\n  \r\n  //- rjf: create noop depth/stencil state\r\n  ProfScope(\"create noop depth/stencil state\")\r\n  {\r\n    D3D11_DEPTH_STENCIL_DESC desc = {0};\r\n    {\r\n      desc.DepthEnable    = FALSE;\r\n      desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;\r\n      desc.DepthFunc      = D3D11_COMPARISON_LESS;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateDepthStencilState(r_d3d11_state->device, &desc, &r_d3d11_state->noop_depth_stencil);\r\n  }\r\n  \r\n  //- rjf: create plain depth/stencil state\r\n  ProfScope(\"create plain depth/stencil state\")\r\n  {\r\n    D3D11_DEPTH_STENCIL_DESC desc = {0};\r\n    {\r\n      desc.DepthEnable    = TRUE;\r\n      desc.DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL;\r\n      desc.DepthFunc      = D3D11_COMPARISON_LESS;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateDepthStencilState(r_d3d11_state->device, &desc, &r_d3d11_state->plain_depth_stencil);\r\n  }\r\n  \r\n  //- rjf: create buffers\r\n  ProfScope(\"create buffers\")\r\n  {\r\n    D3D11_BUFFER_DESC desc = {0};\r\n    {\r\n      desc.ByteWidth      = KB(64);\r\n      desc.Usage          = D3D11_USAGE_DYNAMIC;\r\n      desc.BindFlags      = D3D11_BIND_VERTEX_BUFFER;\r\n      desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\r\n    }\r\n    error = r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &r_d3d11_state->instance_scratch_buffer_64kb);\r\n  }\r\n  \r\n  //- rjf: build vertex shaders & input layouts\r\n  ProfScope(\"build vertex shaders & input layouts\")\r\n    for(R_D3D11_VShadKind kind = (R_D3D11_VShadKind)0;\r\n        kind < R_D3D11_VShadKind_COUNT;\r\n        kind = (R_D3D11_VShadKind)(kind+1))\r\n  {\r\n    String8 source = *r_d3d11_g_vshad_kind_source_table[kind];\r\n    String8 source_name = r_d3d11_g_vshad_kind_source_name_table[kind];\r\n    D3D11_INPUT_ELEMENT_DESC *ilay_elements = r_d3d11_g_vshad_kind_elements_ptr_table[kind];\r\n    U64 ilay_elements_count = r_d3d11_g_vshad_kind_elements_count_table[kind];\r\n    \r\n    // rjf: compile vertex shader\r\n    ID3DBlob *vshad_source_blob = 0;\r\n    ID3DBlob *vshad_source_errors = 0;\r\n    ID3D11VertexShader *vshad = 0;\r\n    ProfScope(\"compile vertex shader\")\r\n    {\r\n      error = D3DCompile(source.str,\r\n                         source.size,\r\n                         (char *)source_name.str,\r\n                         0,\r\n                         0,\r\n                         \"vs_main\",\r\n                         \"vs_5_0\",\r\n                         0,\r\n                         0,\r\n                         &vshad_source_blob,\r\n                         &vshad_source_errors);\r\n      String8 errors = {0};\r\n      if(FAILED(error))\r\n      {\r\n        errors = str8((U8 *)vshad_source_errors->lpVtbl->GetBufferPointer(vshad_source_errors),\r\n                      (U64)vshad_source_errors->lpVtbl->GetBufferSize(vshad_source_errors));\r\n        os_graphical_message(1, str8_lit(\"Vertex Shader Compilation Failure\"), errors);\r\n      }\r\n      else\r\n      {\r\n        error = r_d3d11_state->device->lpVtbl->CreateVertexShader(r_d3d11_state->device, vshad_source_blob->lpVtbl->GetBufferPointer(vshad_source_blob), vshad_source_blob->lpVtbl->GetBufferSize(vshad_source_blob), 0, &vshad);\r\n      }\r\n    }\r\n    \r\n    // rjf: make input layout\r\n    ID3D11InputLayout *ilay = 0;\r\n    if(ilay_elements != 0)\r\n    {\r\n      error = r_d3d11_state->device->lpVtbl->CreateInputLayout(r_d3d11_state->device, ilay_elements, ilay_elements_count,\r\n                                                               vshad_source_blob->lpVtbl->GetBufferPointer(vshad_source_blob),\r\n                                                               vshad_source_blob->lpVtbl->GetBufferSize(vshad_source_blob),\r\n                                                               &ilay);\r\n    }\r\n    \r\n    vshad_source_blob->lpVtbl->Release(vshad_source_blob);\r\n    \r\n    // rjf: store\r\n    r_d3d11_state->vshads[kind] = vshad;\r\n    r_d3d11_state->ilays[kind] = ilay;\r\n  }\r\n  \r\n  //- rjf: build pixel shaders\r\n  for(R_D3D11_PShadKind kind = (R_D3D11_PShadKind)0;\r\n      kind < R_D3D11_PShadKind_COUNT;\r\n      kind = (R_D3D11_PShadKind)(kind+1))\r\n  {\r\n    String8 source = *r_d3d11_g_pshad_kind_source_table[kind];\r\n    String8 source_name = r_d3d11_g_pshad_kind_source_name_table[kind];\r\n    \r\n    // rjf: compile pixel shader\r\n    ID3DBlob *pshad_source_blob = 0;\r\n    ID3DBlob *pshad_source_errors = 0;\r\n    ID3D11PixelShader *pshad = 0;\r\n    ProfScope(\"compile pixel shader\")\r\n    {\r\n      error = D3DCompile(source.str,\r\n                         source.size,\r\n                         (char *)source_name.str,\r\n                         0,\r\n                         0,\r\n                         \"ps_main\",\r\n                         \"ps_5_0\",\r\n                         0,\r\n                         0,\r\n                         &pshad_source_blob,\r\n                         &pshad_source_errors);\r\n      String8 errors = {0};\r\n      if(FAILED(error))\r\n      {\r\n        errors = str8((U8 *)pshad_source_errors->lpVtbl->GetBufferPointer(pshad_source_errors),\r\n                      (U64)pshad_source_errors->lpVtbl->GetBufferSize(pshad_source_errors));\r\n        os_graphical_message(1, str8_lit(\"Pixel Shader Compilation Failure\"), errors);\r\n      }\r\n      else\r\n      {\r\n        error = r_d3d11_state->device->lpVtbl->CreatePixelShader(r_d3d11_state->device, pshad_source_blob->lpVtbl->GetBufferPointer(pshad_source_blob), pshad_source_blob->lpVtbl->GetBufferSize(pshad_source_blob), 0, &pshad);\r\n      }\r\n    }\r\n    \r\n    pshad_source_blob->lpVtbl->Release(pshad_source_blob);\r\n    \r\n    // rjf: store\r\n    r_d3d11_state->pshads[kind] = pshad;\r\n  }\r\n  \r\n  //- rjf: build uniform type buffers\r\n  ProfScope(\"build uniform type buffers\")\r\n    for(R_D3D11_UniformTypeKind kind = (R_D3D11_UniformTypeKind)0;\r\n        kind < R_D3D11_UniformTypeKind_COUNT;\r\n        kind = (R_D3D11_UniformTypeKind)(kind+1))\r\n  {\r\n    ID3D11Buffer *buffer = 0;\r\n    {\r\n      D3D11_BUFFER_DESC desc = {0};\r\n      {\r\n        desc.ByteWidth = r_d3d11_g_uniform_type_kind_size_table[kind];\r\n        desc.ByteWidth += 15;\r\n        desc.ByteWidth -= desc.ByteWidth % 16;\r\n        desc.Usage          = D3D11_USAGE_DYNAMIC;\r\n        desc.BindFlags      = D3D11_BIND_CONSTANT_BUFFER;\r\n        desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;\r\n      }\r\n      r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, 0, &buffer);\r\n    }\r\n    r_d3d11_state->uniform_type_kind_buffers[kind] = buffer;\r\n  }\r\n  \r\n  //- rjf: create backup texture\r\n  ProfScope(\"create backup texture\")\r\n  {\r\n    U32 backup_texture_data[] =\r\n    {\r\n      0xff00ffff, 0x330033ff,\r\n      0x330033ff, 0xff00ffff,\r\n    };\r\n    r_d3d11_state->backup_texture = r_tex2d_alloc(R_ResourceKind_Static, v2s32(2, 2), R_Tex2DFormat_RGBA8, backup_texture_data);\r\n  }\r\n  \r\n  //- rjf: initialize buffer flush state\r\n  {\r\n    r_d3d11_state->buffer_flush_arena = arena_alloc();\r\n  }\r\n  \r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: window setup/teardown\r\n\r\nr_hook R_Handle\r\nr_window_equip(OS_Handle handle)\r\n{\r\n  ProfBeginFunction();\r\n  R_Handle result = {0};\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    //- rjf: allocate per-window-state\r\n    R_D3D11_Window *window = r_d3d11_state->first_free_window;\r\n    {\r\n      if(window == 0)\r\n      {\r\n        window = push_array(r_d3d11_state->arena, R_D3D11_Window, 1);\r\n      }\r\n      else\r\n      {\r\n        U64 gen = window->generation;\r\n        SLLStackPop(r_d3d11_state->first_free_window);\r\n        MemoryZeroStruct(window);\r\n        window->generation = gen;\r\n      }\r\n      window->generation += 1;\r\n    }\r\n    \r\n    //- rjf: map os window handle -> hwnd\r\n    HWND hwnd = {0};\r\n    {\r\n      OS_W32_Window *w32_layer_window = os_w32_window_from_handle(handle);\r\n      hwnd = os_w32_hwnd_from_window(w32_layer_window);\r\n    }\r\n    \r\n    //- rjf: create swapchain\r\n    DXGI_SWAP_CHAIN_DESC1 swapchain_desc = {0};\r\n    {\r\n      swapchain_desc.Width              = 0; // NOTE(rjf): use window width\r\n      swapchain_desc.Height             = 0; // NOTE(rjf): use window height\r\n      swapchain_desc.Format             = DXGI_FORMAT_B8G8R8A8_UNORM;\r\n      swapchain_desc.Stereo             = FALSE;\r\n      swapchain_desc.SampleDesc.Count   = 1;\r\n      swapchain_desc.SampleDesc.Quality = 0;\r\n      swapchain_desc.BufferUsage        = DXGI_USAGE_RENDER_TARGET_OUTPUT;\r\n      swapchain_desc.BufferCount        = 2;\r\n      swapchain_desc.Scaling            = DXGI_SCALING_NONE;\r\n      swapchain_desc.SwapEffect         = DXGI_SWAP_EFFECT_FLIP_DISCARD;\r\n      swapchain_desc.AlphaMode          = DXGI_ALPHA_MODE_UNSPECIFIED;\r\n      swapchain_desc.Flags              = 0;\r\n    }\r\n    HRESULT error = r_d3d11_state->dxgi_factory->lpVtbl->CreateSwapChainForHwnd(r_d3d11_state->dxgi_factory, (IUnknown *)r_d3d11_state->device, hwnd, &swapchain_desc, 0, 0, &window->swapchain);\r\n    if(FAILED(error))\r\n    {\r\n      char buffer[256] = {0};\r\n      raddbg_snprintf(buffer, sizeof(buffer), \"DXGI swap chain creation failure (%lx). The process is terminating.\", error);\r\n      os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_cstring(buffer));\r\n      os_abort(1);\r\n    }\r\n    \r\n    r_d3d11_state->dxgi_factory->lpVtbl->MakeWindowAssociation(r_d3d11_state->dxgi_factory, hwnd, DXGI_MWA_NO_ALT_ENTER);\r\n    \r\n    //- rjf: create framebuffer & view\r\n    D3D11_RENDER_TARGET_VIEW_DESC framebuffer_rtv_desc = {0};\r\n    framebuffer_rtv_desc.Format        = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;\r\n    framebuffer_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;\r\n    window->swapchain->lpVtbl->GetBuffer(window->swapchain, 0, &IID_ID3D11Texture2D, (void **)(&window->framebuffer));\r\n    r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)window->framebuffer, &framebuffer_rtv_desc, &window->framebuffer_rtv);\r\n    \r\n    result = r_d3d11_handle_from_window(window);\r\n    r_d3d11_state->window_count += 1;\r\n    r_d3d11_state->dxgi_device->lpVtbl->SetMaximumFrameLatency(r_d3d11_state->dxgi_device, Clamp(1, r_d3d11_state->window_count, 16));\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\nr_hook void\r\nr_window_unequip(OS_Handle handle, R_Handle equip_handle)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    R_D3D11_Window *window = r_d3d11_window_from_handle(equip_handle);\r\n    window->stage_color_srv->lpVtbl->Release(window->stage_color_srv);\r\n    window->stage_color_rtv->lpVtbl->Release(window->stage_color_rtv);\r\n    window->stage_color->lpVtbl->Release(window->stage_color);\r\n    window->stage_scratch_color_srv->lpVtbl->Release(window->stage_scratch_color_srv);\r\n    window->stage_scratch_color_rtv->lpVtbl->Release(window->stage_scratch_color_rtv);\r\n    window->stage_scratch_color->lpVtbl->Release(window->stage_scratch_color);\r\n    window->framebuffer_rtv->lpVtbl->Release(window->framebuffer_rtv);\r\n    window->framebuffer->lpVtbl->Release(window->framebuffer);\r\n    window->swapchain->lpVtbl->Release(window->swapchain);\r\n    window->generation += 1;\r\n    SLLStackPush(r_d3d11_state->first_free_window, window);\r\n    r_d3d11_state->window_count -= 1;\r\n    r_d3d11_state->dxgi_device->lpVtbl->SetMaximumFrameLatency(r_d3d11_state->dxgi_device, Clamp(1, r_d3d11_state->window_count, 16));\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: textures\r\n\r\nr_hook R_Handle\r\nr_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: allocate\r\n  R_D3D11_Tex2D *texture = 0;\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    texture = r_d3d11_state->first_free_tex2d;\r\n    if(texture == 0)\r\n    {\r\n      texture = push_array(r_d3d11_state->arena, R_D3D11_Tex2D, 1);\r\n    }\r\n    else\r\n    {\r\n      U64 gen = texture->generation;\r\n      SLLStackPop(r_d3d11_state->first_free_tex2d);\r\n      MemoryZeroStruct(texture);\r\n      texture->generation = gen;\r\n    }\r\n    texture->generation += 1;\r\n  }\r\n  \r\n  D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT;\r\n  UINT cpu_access_flags = 0;\r\n  r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags);\r\n  if (kind == R_ResourceKind_Static)\r\n  {\r\n    Assert(data != 0 && \"static texture must have initial data provided\");\r\n  }\r\n  \r\n  //- rjf: format -> dxgi format\r\n  DXGI_FORMAT dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM;\r\n  {\r\n    switch(format)\r\n    {\r\n      default:{}break;\r\n      case R_Tex2DFormat_R8:    {dxgi_format = DXGI_FORMAT_R8_UNORM;}break;\r\n      case R_Tex2DFormat_RG8:   {dxgi_format = DXGI_FORMAT_R8G8_UNORM;}break;\r\n      case R_Tex2DFormat_RGBA8: {dxgi_format = DXGI_FORMAT_R8G8B8A8_UNORM;}break;\r\n      case R_Tex2DFormat_BGRA8: {dxgi_format = DXGI_FORMAT_B8G8R8A8_UNORM;}break;\r\n      case R_Tex2DFormat_R16:   {dxgi_format = DXGI_FORMAT_R16_UNORM;}break;\r\n      case R_Tex2DFormat_RGBA16:{dxgi_format = DXGI_FORMAT_R16G16B16A16_UNORM;}break;\r\n      case R_Tex2DFormat_R32:   {dxgi_format = DXGI_FORMAT_R32_FLOAT;}break;\r\n      case R_Tex2DFormat_RG32:  {dxgi_format = DXGI_FORMAT_R32G32_FLOAT;}break;\r\n      case R_Tex2DFormat_RGBA32:{dxgi_format = DXGI_FORMAT_R32G32B32A32_FLOAT;}break;\r\n    }\r\n  }\r\n  \r\n  //- rjf: prep initial data, if passed\r\n  D3D11_SUBRESOURCE_DATA initial_data_ = {0};\r\n  D3D11_SUBRESOURCE_DATA *initial_data = 0;\r\n  if(data != 0)\r\n  {\r\n    initial_data = &initial_data_;\r\n    initial_data->pSysMem = data;\r\n    initial_data->SysMemPitch = r_tex2d_format_bytes_per_pixel_table[format] * size.x;\r\n  }\r\n  \r\n  //- rjf: create texture\r\n  D3D11_TEXTURE2D_DESC texture_desc = {0};\r\n  {\r\n    texture_desc.Width              = size.x;\r\n    texture_desc.Height             = size.y;\r\n    texture_desc.MipLevels          = 1;\r\n    texture_desc.ArraySize          = 1;\r\n    texture_desc.Format             = dxgi_format;\r\n    texture_desc.SampleDesc.Count   = 1;\r\n    texture_desc.Usage              = d3d11_usage;\r\n    texture_desc.BindFlags          = D3D11_BIND_SHADER_RESOURCE;\r\n    texture_desc.CPUAccessFlags     = cpu_access_flags;\r\n  }\r\n  r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &texture_desc, initial_data, &texture->texture);\r\n  \r\n  //- rjf: create texture srv\r\n  r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)texture->texture, 0, &texture->view);\r\n  \r\n  //- rjf: fill basics\r\n  {\r\n    texture->kind = kind;\r\n    texture->size = size;\r\n    texture->format = format;\r\n  }\r\n  \r\n  R_Handle result = r_d3d11_handle_from_tex2d(texture);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\nr_hook void\r\nr_tex2d_release(R_Handle handle)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle);\r\n    if(texture != &r_d3d11_tex2d_nil)\r\n    {\r\n      SLLStackPush(r_d3d11_state->first_to_free_tex2d, texture);\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\nr_hook R_ResourceKind\r\nr_kind_from_tex2d(R_Handle handle)\r\n{\r\n  R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle);\r\n  return texture->kind;\r\n}\r\n\r\nr_hook Vec2S32\r\nr_size_from_tex2d(R_Handle handle)\r\n{\r\n  R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle);\r\n  return texture->size;\r\n}\r\n\r\nr_hook R_Tex2DFormat\r\nr_format_from_tex2d(R_Handle handle)\r\n{\r\n  R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle);\r\n  return texture->format;\r\n}\r\n\r\nr_hook void\r\nr_fill_tex2d_region(R_Handle handle, Rng2S32 subrect, void *data)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(handle);\r\n    if(texture != &r_d3d11_tex2d_nil)\r\n    {\r\n      Assert(texture->kind == R_ResourceKind_Dynamic && \"only dynamic texture can update region\");\r\n      U64 bytes_per_pixel = r_tex2d_format_bytes_per_pixel_table[texture->format];\r\n      Vec2S32 dim = v2s32(subrect.x1 - subrect.x0, subrect.y1 - subrect.y0);\r\n      D3D11_BOX dst_box =\r\n      {\r\n        (UINT)subrect.x0, (UINT)subrect.y0, 0,\r\n        (UINT)subrect.x1, (UINT)subrect.y1, 1,\r\n      };\r\n      r_d3d11_state->device_ctx->lpVtbl->UpdateSubresource(r_d3d11_state->device_ctx, (ID3D11Resource *)texture->texture, 0, &dst_box, data, dim.x*bytes_per_pixel, 0);\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: buffers\r\n\r\nr_hook R_Handle\r\nr_buffer_alloc(R_ResourceKind kind, U64 size, void *data)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: allocate\r\n  R_D3D11_Buffer *buffer = 0;\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    buffer = r_d3d11_state->first_free_buffer;\r\n    if(buffer == 0)\r\n    {\r\n      buffer = push_array(r_d3d11_state->arena, R_D3D11_Buffer, 1);\r\n    }\r\n    else\r\n    {\r\n      U64 gen = buffer->generation;\r\n      SLLStackPop(r_d3d11_state->first_free_buffer);\r\n      MemoryZeroStruct(buffer);\r\n      buffer->generation = gen;\r\n    }\r\n    buffer->generation += 1;\r\n  }\r\n  \r\n  D3D11_USAGE d3d11_usage = D3D11_USAGE_DEFAULT;\r\n  UINT cpu_access_flags = 0;\r\n  r_usage_access_flags_from_resource_kind(kind, &d3d11_usage, &cpu_access_flags);\r\n  if (kind == R_ResourceKind_Static)\r\n  {\r\n    Assert(data != 0 && \"static buffer must have initial data provided\");\r\n  }\r\n  \r\n  //- rjf: prep initial data, if passed\r\n  D3D11_SUBRESOURCE_DATA initial_data_ = {0};\r\n  D3D11_SUBRESOURCE_DATA *initial_data = 0;\r\n  if(data != 0)\r\n  {\r\n    initial_data = &initial_data_;\r\n    initial_data->pSysMem = data;\r\n  }\r\n  \r\n  //- rjf: create buffer\r\n  D3D11_BUFFER_DESC desc = {0};\r\n  {\r\n    desc.ByteWidth      = size;\r\n    desc.Usage          = d3d11_usage;\r\n    desc.BindFlags      = D3D11_BIND_VERTEX_BUFFER|D3D11_BIND_INDEX_BUFFER;\r\n    desc.CPUAccessFlags = cpu_access_flags;\r\n  }\r\n  r_d3d11_state->device->lpVtbl->CreateBuffer(r_d3d11_state->device, &desc, initial_data, &buffer->buffer);\r\n  \r\n  //- rjf: fill basics\r\n  {\r\n    buffer->kind = kind;\r\n    buffer->size = size;\r\n  }\r\n  \r\n  R_Handle result = r_d3d11_handle_from_buffer(buffer);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\nr_hook void\r\nr_buffer_release(R_Handle handle)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    R_D3D11_Buffer *buffer = r_d3d11_buffer_from_handle(handle);\r\n    if(buffer != &r_d3d11_buffer_nil)\r\n    {\r\n      SLLStackPush(r_d3d11_state->first_to_free_buffer, buffer);\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: frame markers\r\n\r\nr_hook void\r\nr_begin_frame(void)\r\n{\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    // NOTE(rjf): no-op\r\n  }\r\n}\r\n\r\nr_hook void\r\nr_end_frame(void)\r\n{\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    for(R_D3D11_FlushBuffer *buffer = r_d3d11_state->first_buffer_to_flush; buffer != 0; buffer = buffer->next)\r\n    {\r\n      buffer->buffer->lpVtbl->Release(buffer->buffer);\r\n    }\r\n    for(R_D3D11_Tex2D *tex = r_d3d11_state->first_to_free_tex2d, *next = 0;\r\n        tex != 0;\r\n        tex = next)\r\n    {\r\n      next = tex->next;\r\n      if(tex->view != 0)\r\n      {\r\n        tex->view->lpVtbl->Release(tex->view);\r\n      }\r\n      if(tex->texture != 0)\r\n      {\r\n        tex->texture->lpVtbl->Release(tex->texture);\r\n      }\r\n      tex->view = 0;\r\n      tex->texture = 0;\r\n      tex->generation += 1;\r\n      SLLStackPush(r_d3d11_state->first_free_tex2d, tex);\r\n    }\r\n    for(R_D3D11_Buffer *buf = r_d3d11_state->first_to_free_buffer, *next = 0;\r\n        buf != 0;\r\n        buf = next)\r\n    {\r\n      next = buf->next;\r\n      if(buf->buffer != 0)\r\n      {\r\n        buf->buffer->lpVtbl->Release(buf->buffer);\r\n      }\r\n      buf->generation += 1;\r\n      buf->buffer = 0;\r\n      SLLStackPush(r_d3d11_state->first_free_buffer, buf);\r\n    }\r\n    arena_clear(r_d3d11_state->buffer_flush_arena);\r\n    r_d3d11_state->first_buffer_to_flush = r_d3d11_state->last_buffer_to_flush = 0;\r\n    r_d3d11_state->first_to_free_tex2d  = 0;\r\n    r_d3d11_state->first_to_free_buffer = 0;\r\n  }\r\n}\r\n\r\nr_hook void\r\nr_window_begin_frame(OS_Handle window, R_Handle window_equip)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip);\r\n    ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx;\r\n    \r\n    //- rjf: get resolution\r\n    Rng2F32 client_rect = os_client_rect_from_window(window);\r\n    Vec2S32 resolution = {(S32)(client_rect.x1 - client_rect.x0), (S32)(client_rect.y1 - client_rect.y0)};\r\n    \r\n    //- rjf: resolution change\r\n    B32 resize_done = 0;\r\n    if(wnd->last_resolution.x != resolution.x ||\r\n       wnd->last_resolution.y != resolution.y)\r\n    {\r\n      resize_done = 1;\r\n      wnd->last_resolution = resolution;\r\n      \r\n      // rjf: release screen-sized render target resources, if there\r\n      if(wnd->stage_scratch_color_srv){wnd->stage_scratch_color_srv->lpVtbl->Release(wnd->stage_scratch_color_srv);}\r\n      if(wnd->stage_scratch_color_rtv){wnd->stage_scratch_color_rtv->lpVtbl->Release(wnd->stage_scratch_color_rtv);}\r\n      if(wnd->stage_scratch_color)    {wnd->stage_scratch_color->lpVtbl->Release(wnd->stage_scratch_color);}\r\n      if(wnd->stage_color_srv)        {wnd->stage_color_srv->lpVtbl->Release(wnd->stage_color_srv);}\r\n      if(wnd->stage_color_rtv)        {wnd->stage_color_rtv->lpVtbl->Release(wnd->stage_color_rtv);}\r\n      if(wnd->stage_color)            {wnd->stage_color->lpVtbl->Release(wnd->stage_color);}\r\n      if(wnd->geo3d_color_srv)        {wnd->geo3d_color_srv->lpVtbl->Release(wnd->geo3d_color_srv);}\r\n      if(wnd->geo3d_color_rtv)        {wnd->geo3d_color_rtv->lpVtbl->Release(wnd->geo3d_color_rtv);}\r\n      if(wnd->geo3d_color)            {wnd->geo3d_color->lpVtbl->Release(wnd->geo3d_color);}\r\n      if(wnd->geo3d_depth_srv)        {wnd->geo3d_depth_srv->lpVtbl->Release(wnd->geo3d_depth_srv);}\r\n      if(wnd->geo3d_depth_dsv)        {wnd->geo3d_depth_dsv->lpVtbl->Release(wnd->geo3d_depth_dsv);}\r\n      if(wnd->geo3d_depth)            {wnd->geo3d_depth->lpVtbl->Release(wnd->geo3d_depth);}\r\n      \r\n      // rjf: resize swapchain & main framebuffer\r\n      wnd->framebuffer_rtv->lpVtbl->Release(wnd->framebuffer_rtv);\r\n      wnd->framebuffer->lpVtbl->Release(wnd->framebuffer);\r\n      wnd->swapchain->lpVtbl->ResizeBuffers(wnd->swapchain, 0, 0, 0, DXGI_FORMAT_UNKNOWN, 0);\r\n      wnd->swapchain->lpVtbl->GetBuffer(wnd->swapchain, 0, &IID_ID3D11Texture2D, (void **)(&wnd->framebuffer));\r\n      D3D11_RENDER_TARGET_VIEW_DESC framebuffer_rtv_desc = {0};\r\n      framebuffer_rtv_desc.Format        = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;\r\n      framebuffer_rtv_desc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;\r\n      r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->framebuffer, &framebuffer_rtv_desc, &wnd->framebuffer_rtv);\r\n      \r\n      // rjf: create stage color targets\r\n      {\r\n        D3D11_TEXTURE2D_DESC color_desc = zero_struct;\r\n        {\r\n          wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &color_desc);\r\n          color_desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;\r\n          color_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE;\r\n        }\r\n        D3D11_RENDER_TARGET_VIEW_DESC rtv_desc = zero_struct;\r\n        {\r\n          rtv_desc.Format         = color_desc.Format;\r\n          rtv_desc.ViewDimension  = D3D11_RTV_DIMENSION_TEXTURE2D;\r\n        }\r\n        D3D11_SHADER_RESOURCE_VIEW_DESC srv_desc = zero_struct;\r\n        {\r\n          srv_desc.Format                    = DXGI_FORMAT_R16G16B16A16_FLOAT;\r\n          srv_desc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE2D;\r\n          srv_desc.Texture2D.MipLevels       = -1;\r\n        }\r\n        r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->stage_color);\r\n        r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_color, &rtv_desc, &wnd->stage_color_rtv);\r\n        r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_color, &srv_desc, &wnd->stage_color_srv);\r\n        r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->stage_scratch_color);\r\n        r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_scratch_color, &rtv_desc, &wnd->stage_scratch_color_rtv);\r\n        r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->stage_scratch_color, &srv_desc, &wnd->stage_scratch_color_srv);\r\n      }\r\n      \r\n      // rjf: create geo3d targets\r\n      {\r\n        D3D11_TEXTURE2D_DESC color_desc = zero_struct;\r\n        {\r\n          wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &color_desc);\r\n          color_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;\r\n          color_desc.BindFlags = D3D11_BIND_RENDER_TARGET|D3D11_BIND_SHADER_RESOURCE;\r\n        }\r\n        D3D11_RENDER_TARGET_VIEW_DESC color_rtv_desc = zero_struct;\r\n        {\r\n          color_rtv_desc.Format         = color_desc.Format;\r\n          color_rtv_desc.ViewDimension  = D3D11_RTV_DIMENSION_TEXTURE2D;\r\n        }\r\n        D3D11_SHADER_RESOURCE_VIEW_DESC color_srv_desc = zero_struct;\r\n        {\r\n          color_srv_desc.Format                    = DXGI_FORMAT_R8G8B8A8_UNORM;\r\n          color_srv_desc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE2D;\r\n          color_srv_desc.Texture2D.MipLevels       = -1;\r\n        }\r\n        D3D11_TEXTURE2D_DESC depth_desc = zero_struct;\r\n        {\r\n          wnd->framebuffer->lpVtbl->GetDesc(wnd->framebuffer, &depth_desc);\r\n          depth_desc.Format = DXGI_FORMAT_R24G8_TYPELESS;\r\n          depth_desc.BindFlags = D3D11_BIND_DEPTH_STENCIL|D3D11_BIND_SHADER_RESOURCE;\r\n        }\r\n        D3D11_DEPTH_STENCIL_VIEW_DESC depth_dsv_desc = zero_struct;\r\n        {\r\n          depth_dsv_desc.Flags = 0;\r\n          depth_dsv_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;\r\n          depth_dsv_desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;\r\n          depth_dsv_desc.Texture2D.MipSlice = 0;\r\n        }\r\n        D3D11_SHADER_RESOURCE_VIEW_DESC depth_srv_desc = zero_struct;\r\n        {\r\n          depth_srv_desc.Format                    = DXGI_FORMAT_R24_UNORM_X8_TYPELESS;\r\n          depth_srv_desc.ViewDimension             = D3D11_SRV_DIMENSION_TEXTURE2D;\r\n          depth_srv_desc.Texture2D.MostDetailedMip = 0;\r\n          depth_srv_desc.Texture2D.MipLevels       = -1;\r\n        }\r\n        r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &color_desc, 0, &wnd->geo3d_color);\r\n        r_d3d11_state->device->lpVtbl->CreateRenderTargetView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_color, &color_rtv_desc, &wnd->geo3d_color_rtv);\r\n        r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_color, &color_srv_desc, &wnd->geo3d_color_srv);\r\n        r_d3d11_state->device->lpVtbl->CreateTexture2D(r_d3d11_state->device, &depth_desc, 0, &wnd->geo3d_depth);\r\n        r_d3d11_state->device->lpVtbl->CreateDepthStencilView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_depth, &depth_dsv_desc, &wnd->geo3d_depth_dsv);\r\n        r_d3d11_state->device->lpVtbl->CreateShaderResourceView(r_d3d11_state->device, (ID3D11Resource *)wnd->geo3d_depth, &depth_srv_desc, &wnd->geo3d_depth_srv);\r\n      }\r\n    }\r\n    \r\n    //- rjf: clear framebuffers\r\n    Vec4F32 clear_color = {0, 0, 0, 0};\r\n    d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->framebuffer_rtv, clear_color.v);\r\n    d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->stage_color_rtv, clear_color.v);\r\n    if(resize_done)\r\n    {\r\n      d_ctx->lpVtbl->Flush(d_ctx);\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\nr_hook void\r\nr_window_end_frame(OS_Handle window, R_Handle window_equip)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip);\r\n    ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: finalize, by writing staging buffer out to window framebuffer\r\n    //\r\n    {\r\n      ID3D11SamplerState *sampler   = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest];\r\n      ID3D11VertexShader *vshad     = r_d3d11_state->vshads[R_D3D11_VShadKind_Finalize];\r\n      ID3D11PixelShader *pshad      = r_d3d11_state->pshads[R_D3D11_PShadKind_Finalize];\r\n      \r\n      // rjf: setup output merger\r\n      d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->framebuffer_rtv, 0);\r\n      d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0);\r\n      d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff);\r\n      \r\n      // rjf: set up rasterizer\r\n      Vec2S32 resolution = wnd->last_resolution;\r\n      D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f };\r\n      d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport);\r\n      d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer);\r\n      \r\n      // rjf: setup input assembly\r\n      d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);\r\n      d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0);\r\n      \r\n      // rjf: setup shaders\r\n      d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0);\r\n      d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0);\r\n      d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_color_srv);\r\n      d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler);\r\n      \r\n      // rjf: setup scissor rect\r\n      {\r\n        D3D11_RECT rect = {0};\r\n        rect.left = 0;\r\n        rect.right = (LONG)wnd->last_resolution.x;\r\n        rect.top = 0;\r\n        rect.bottom = (LONG)wnd->last_resolution.y;\r\n        d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect);\r\n      }\r\n      \r\n      // rjf: draw\r\n      d_ctx->lpVtbl->Draw(d_ctx, 4, 0);\r\n    }\r\n    \r\n    ////////////////////////////\r\n    //- rjf: present\r\n    //\r\n    HRESULT error = wnd->swapchain->lpVtbl->Present(wnd->swapchain, 1, 0);\r\n    if(FAILED(error))\r\n    {\r\n      char buffer[256] = {0};\r\n      raddbg_snprintf(buffer, sizeof(buffer), \"D3D11 present failure (%lx). The process is terminating.\", error);\r\n      os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_cstring(buffer));\r\n      os_abort(1);\r\n    }\r\n    d_ctx->lpVtbl->ClearState(d_ctx);\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\n//- rjf: render pass submission\r\n\r\nr_hook void\r\nr_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)\r\n{\r\n  ProfBeginFunction();\r\n  MutexScopeW(r_d3d11_state->device_rw_mutex)\r\n  {\r\n    ////////////////////////////\r\n    //- rjf: unpack arguments\r\n    //\r\n    R_D3D11_Window *wnd = r_d3d11_window_from_handle(window_equip);\r\n    ID3D11DeviceContext1 *d_ctx = r_d3d11_state->device_ctx;\r\n    \r\n    ////////////////////////////\r\n    //- rjf: do passes\r\n    //\r\n    for(R_PassNode *pass_n = passes->first; pass_n != 0; pass_n = pass_n->next)\r\n    {\r\n      R_Pass *pass = &pass_n->v;\r\n      switch(pass->kind)\r\n      {\r\n        default:{}break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: ui rendering pass\r\n        //\r\n        case R_PassKind_UI:\r\n        {\r\n          //- rjf: unpack params\r\n          R_PassParams_UI *params = pass->params_ui;\r\n          R_BatchGroup2DList *rect_batch_groups = &params->rects;\r\n          \r\n          //- rjf: set up rasterizer\r\n          Vec2S32 resolution = wnd->last_resolution;\r\n          D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f };\r\n          d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport);\r\n          d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer);\r\n          \r\n          //- rjf: draw each batch group\r\n          for(R_BatchGroup2DNode *group_n = rect_batch_groups->first; group_n != 0; group_n = group_n->next)\r\n          {\r\n            R_BatchList *batches = &group_n->batches;\r\n            R_BatchGroup2DParams *group_params = &group_n->params;\r\n            \r\n            // rjf: unpack pipeline info\r\n            ID3D11SamplerState *sampler   = r_d3d11_state->samplers[group_params->tex_sample_kind];\r\n            ID3D11VertexShader *vshad     = r_d3d11_state->vshads[R_D3D11_VShadKind_Rect];\r\n            ID3D11InputLayout *ilay       = r_d3d11_state->ilays[R_D3D11_VShadKind_Rect];\r\n            ID3D11PixelShader *pshad      = r_d3d11_state->pshads[R_D3D11_PShadKind_Rect];\r\n            ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_UniformTypeKind_Rect];\r\n            \r\n            // rjf: get & fill buffer\r\n            ID3D11Buffer *buffer = r_d3d11_instance_buffer_from_size(batches->byte_count);\r\n            {\r\n              D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0};\r\n              d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc);\r\n              U8 *dst_ptr = (U8 *)sub_rsrc.pData;\r\n              U64 off = 0;\r\n              for(R_BatchNode *batch_n = batches->first; batch_n != 0; batch_n = batch_n->next)\r\n              {\r\n                MemoryCopy(dst_ptr+off, batch_n->v.v, batch_n->v.byte_count);\r\n                off += batch_n->v.byte_count;\r\n              }\r\n              d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)buffer, 0);\r\n            }\r\n            \r\n            // rjf: get texture\r\n            R_Handle texture_handle = group_params->tex;\r\n            if(r_handle_match(texture_handle, r_handle_zero()))\r\n            {\r\n              texture_handle = r_d3d11_state->backup_texture;\r\n            }\r\n            R_D3D11_Tex2D *texture = r_d3d11_tex2d_from_handle(texture_handle);\r\n            \r\n            // rjf: get texture sample map matrix, based on format\r\n            Mat4x4F32 texture_sample_channel_map = r_sample_channel_map_from_tex2dformat(texture->format);\r\n            \r\n            // rjf: upload uniforms\r\n            R_D3D11_Uniforms_Rect uniforms = {0};\r\n            {\r\n              uniforms.viewport_size             = v2f32(resolution.x, resolution.y);\r\n              uniforms.opacity                   = 1-group_params->transparency;\r\n              uniforms.texture_sample_channel_map = texture_sample_channel_map;\r\n              uniforms.texture_t2d_size          = v2f32(texture->size.x, texture->size.y);\r\n              uniforms.xform[0] = v4f32(group_params->xform.v[0][0], group_params->xform.v[1][0], group_params->xform.v[2][0], 0);\r\n              uniforms.xform[1] = v4f32(group_params->xform.v[0][1], group_params->xform.v[1][1], group_params->xform.v[2][1], 0);\r\n              uniforms.xform[2] = v4f32(group_params->xform.v[0][2], group_params->xform.v[1][2], group_params->xform.v[2][2], 0);\r\n              Vec2F32 xform_2x2_col0 = v2f32(uniforms.xform[0].x, uniforms.xform[1].x);\r\n              Vec2F32 xform_2x2_col1 = v2f32(uniforms.xform[0].y, uniforms.xform[1].y);\r\n              uniforms.xform_scale.x = length_2f32(xform_2x2_col0);\r\n              uniforms.xform_scale.y = length_2f32(xform_2x2_col1);\r\n            }\r\n            {\r\n              D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0};\r\n              d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc);\r\n              MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms));\r\n              d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0);\r\n            }\r\n            \r\n            // rjf: setup output merger\r\n            d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0);\r\n            d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0);\r\n            d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff);\r\n            \r\n            // rjf: setup input assembly\r\n            U32 stride = batches->bytes_per_inst;\r\n            U32 offset = 0;\r\n            d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);\r\n            d_ctx->lpVtbl->IASetInputLayout(d_ctx, ilay);\r\n            d_ctx->lpVtbl->IASetVertexBuffers(d_ctx, 0, 1, &buffer, &stride, &offset);\r\n            \r\n            // rjf: setup shaders\r\n            d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0);\r\n            d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer);\r\n            d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0);\r\n            d_ctx->lpVtbl->PSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer);\r\n            d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &texture->view);\r\n            d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler);\r\n            \r\n            // rjf: setup scissor rect\r\n            {\r\n              Rng2F32 clip = group_params->clip;\r\n              D3D11_RECT rect = {0};\r\n              {\r\n                if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0)\r\n                {\r\n                  rect.left = 0;\r\n                  rect.right = (LONG)wnd->last_resolution.x;\r\n                  rect.top = 0;\r\n                  rect.bottom = (LONG)wnd->last_resolution.y;\r\n                }\r\n                else if(clip.x0 > clip.x1 || clip.y0 > clip.y1)\r\n                {\r\n                  rect.left = 0;\r\n                  rect.right = 0;\r\n                  rect.top = 0;\r\n                  rect.bottom = 0;\r\n                }\r\n                else\r\n                {\r\n                  rect.left = (LONG)clip.x0;\r\n                  rect.right = (LONG)clip.x1;\r\n                  rect.top = (LONG)clip.y0;\r\n                  rect.bottom = (LONG)clip.y1;\r\n                }\r\n              }\r\n              d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect);\r\n            }\r\n            \r\n            // rjf: draw\r\n            d_ctx->lpVtbl->DrawInstanced(d_ctx, 4, batches->byte_count / batches->bytes_per_inst, 0, 0);\r\n          }\r\n        }break;\r\n        \r\n        ////////////////////////\r\n        //- rjf: blur rendering pass\r\n        //\r\n        case R_PassKind_Blur:\r\n        {\r\n          R_PassParams_Blur *params = pass->params_blur;\r\n          ID3D11SamplerState *sampler   = r_d3d11_state->samplers[R_Tex2DSampleKind_Linear];\r\n          ID3D11VertexShader *vshad     = r_d3d11_state->vshads[R_D3D11_VShadKind_Blur];\r\n          ID3D11PixelShader *pshad      = r_d3d11_state->pshads[R_D3D11_PShadKind_Blur];\r\n          ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Blur];\r\n          \r\n          // rjf: setup output merger\r\n          d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0);\r\n          d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->no_blend_state, 0, 0xffffffff);\r\n          \r\n          // rjf: set up viewport\r\n          Vec2S32 resolution = wnd->last_resolution;\r\n          D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f };\r\n          d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport);\r\n          d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer);\r\n          \r\n          // rjf: setup input assembly\r\n          d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);\r\n          d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0);\r\n          \r\n          // rjf: setup shaders\r\n          d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0);\r\n          d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer);\r\n          d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0);\r\n          d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler);\r\n          \r\n          // rjf: setup scissor rect\r\n          {\r\n            D3D11_RECT rect = { 0 };\r\n            rect.left = 0;\r\n            rect.right = (LONG)wnd->last_resolution.x;\r\n            rect.top = 0;\r\n            rect.bottom = (LONG)wnd->last_resolution.y;\r\n            d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect);\r\n          }\r\n          \r\n          // rjf: set up uniforms\r\n          R_D3D11_Uniforms_Blur uniforms = { 0 };\r\n          {\r\n            F32 weights[ArrayCount(uniforms.kernel)*2] = {0};\r\n            \r\n            F32 blur_size = Min(params->blur_size, ArrayCount(weights));\r\n            U64 blur_count = (U64)round_f32(blur_size);\r\n            \r\n            F32 stdev = (blur_size-1.f)/2.f;\r\n            F32 one_over_root_2pi_stdev2 = 1/sqrt_f32(2*pi32*stdev*stdev);\r\n            F32 euler32 = 2.718281828459045f;\r\n            \r\n            weights[0] = 1.f;\r\n            if(stdev > 0.f)\r\n            {\r\n              for(U64 idx = 0; idx < blur_count; idx += 1)\r\n              {\r\n                F32 kernel_x = (F32)idx;\r\n                weights[idx] = one_over_root_2pi_stdev2*pow_f32(euler32, -kernel_x*kernel_x/(2.f*stdev*stdev)); \r\n              }\r\n            }\r\n            if(weights[0] > 1.f)\r\n            {\r\n              MemoryZeroArray(weights);\r\n              weights[0] = 1.f;\r\n            }\r\n            else\r\n            {\r\n              // prepare weights & offsets for bilinear lookup\r\n              // blur filter wants to calculate w0*pixel[pos] + w1*pixel[pos+1] + ...\r\n              // with bilinear filter we can do this calulation by doing only w*sample(pos+t) = w*((1-t)*pixel[pos] + t*pixel[pos+1])\r\n              // we can see w0=w*(1-t) and w1=w*t\r\n              // thus w=w0+w1 and t=w1/w\r\n              for (U64 idx = 1; idx < blur_count; idx += 2)\r\n              {\r\n                F32 w0 = weights[idx + 0];\r\n                F32 w1 = weights[idx + 1];\r\n                F32 w = w0 + w1;\r\n                F32 t = w1 / w;\r\n                \r\n                // each kernel element is float2(weight, offset)\r\n                // weights & offsets are adjusted for bilinear sampling\r\n                // zw elements are not used, a bit of waste but it allows for simpler shader code\r\n                uniforms.kernel[(idx+1)/2] = v4f32(w, (F32)idx + t, 0, 0);\r\n              }\r\n            }\r\n            uniforms.kernel[0].x = weights[0];\r\n            \r\n            // technically we need just direction be different\r\n            // but there are 256 bytes of usable space anyway for each constant buffer chunk\r\n            \r\n            uniforms.passes[Axis2_X].viewport_size = v2f32(resolution.x, resolution.y);\r\n            uniforms.passes[Axis2_X].rect          = params->rect;\r\n            uniforms.passes[Axis2_X].direction     = v2f32(1.f / resolution.x, 0);\r\n            uniforms.passes[Axis2_X].blur_count    = 1 + blur_count / 2; // 2x smaller because of bilinear sampling\r\n            MemoryCopyArray(uniforms.passes[Axis2_X].corner_radii.v, params->corner_radii);\r\n            \r\n            uniforms.passes[Axis2_Y].viewport_size = v2f32(resolution.x, resolution.y);\r\n            uniforms.passes[Axis2_Y].rect          = params->rect;\r\n            uniforms.passes[Axis2_Y].direction     = v2f32(0, 1.f / resolution.y);\r\n            uniforms.passes[Axis2_Y].blur_count    = 1 + blur_count / 2; // 2x smaller because of bilinear sampling\r\n            MemoryCopyArray(uniforms.passes[Axis2_Y].corner_radii.v, params->corner_radii);\r\n            \r\n            D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0};\r\n            d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc);\r\n            MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms));\r\n            d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0);\r\n          }\r\n          \r\n          ID3D11Buffer *uniforms_buffers[] = { uniforms_buffer, uniforms_buffer };\r\n          \r\n          U32 uniform_offset[Axis2_COUNT][2] =\r\n          {\r\n            { 0 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 },\r\n            { 1 * sizeof(R_D3D11_Uniforms_BlurPass) / 16, (U32)OffsetOf(R_D3D11_Uniforms_Blur, kernel) / 16 },\r\n          };\r\n          \r\n          U32 uniform_count[Axis2_COUNT][2] =\r\n          {\r\n            { sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 },\r\n            { sizeof(R_D3D11_Uniforms_BlurPass) / 16, sizeof(uniforms.kernel) / 16 },\r\n          };\r\n          \r\n          // rjf: setup scissor rect\r\n          {\r\n            Rng2F32 clip = params->clip;\r\n            D3D11_RECT rect = {0};\r\n            {\r\n              if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0)\r\n              {\r\n                rect.left = 0;\r\n                rect.right = (LONG)wnd->last_resolution.x;\r\n                rect.top = 0;\r\n                rect.bottom = (LONG)wnd->last_resolution.y;\r\n              }\r\n              else if(clip.x0 > clip.x1 || clip.y0 > clip.y1)\r\n              {\r\n                rect.left = 0;\r\n                rect.right = 0;\r\n                rect.top = 0;\r\n                rect.bottom = 0;\r\n              }\r\n              else\r\n              {\r\n                rect.left = (LONG)clip.x0;\r\n                rect.right = (LONG)clip.x1;\r\n                rect.top = (LONG)clip.y0;\r\n                rect.bottom = (LONG)clip.y1;\r\n              }\r\n            }\r\n            d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect);\r\n          }\r\n          \r\n          // rjf: for unsetting srv\r\n          ID3D11ShaderResourceView* srv = 0;\r\n          \r\n          // horizontal pass\r\n          d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_scratch_color_rtv, 0);\r\n          d_ctx->lpVtbl->PSSetConstantBuffers1(d_ctx, 0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_X], uniform_count[Axis2_X]);\r\n          d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_color_srv);\r\n          d_ctx->lpVtbl->Draw(d_ctx, 4, 0);\r\n          d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &srv);\r\n          \r\n          // vertical pass\r\n          d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0);\r\n          d_ctx->lpVtbl->PSSetConstantBuffers1(d_ctx, 0, ArrayCount(uniforms_buffers), uniforms_buffers, uniform_offset[Axis2_Y], uniform_count[Axis2_Y]);\r\n          d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->stage_scratch_color_srv);\r\n          d_ctx->lpVtbl->Draw(d_ctx, 4, 0);\r\n          d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &srv);\r\n        }break;\r\n        \r\n        \r\n        ////////////////////////\r\n        //- rjf: 3d geometry rendering pass\r\n        //\r\n        case R_PassKind_Geo3D:\r\n        {\r\n          //- rjf: unpack params\r\n          R_PassParams_Geo3D *params = pass->params_geo3d;\r\n          R_BatchGroup3DMap *mesh_group_map = &params->mesh_batches;\r\n          \r\n          //- rjf: set up rasterizer\r\n          Vec2F32 viewport_dim = dim_2f32(params->viewport);\r\n          D3D11_VIEWPORT viewport = { params->viewport.x0, params->viewport.y0, viewport_dim.x, viewport_dim.y, 0.f, 1.f };\r\n          d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport);\r\n          d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer);\r\n          \r\n          //- rjf: clear render targets\r\n          {\r\n            Vec4F32 bg_color = v4f32(0, 0, 0, 0);\r\n            d_ctx->lpVtbl->ClearRenderTargetView(d_ctx, wnd->geo3d_color_rtv, bg_color.v);\r\n            d_ctx->lpVtbl->ClearDepthStencilView(d_ctx, wnd->geo3d_depth_dsv, D3D11_CLEAR_DEPTH, 1.f, 0);\r\n          }\r\n          \r\n          //- rjf: draw mesh batches\r\n          {\r\n            // rjf: grab pipeline info\r\n            ID3D11VertexShader *vshad     = r_d3d11_state->vshads[R_D3D11_VShadKind_Mesh];\r\n            ID3D11InputLayout *ilay       = r_d3d11_state->ilays[R_D3D11_VShadKind_Mesh];\r\n            ID3D11PixelShader *pshad      = r_d3d11_state->pshads[R_D3D11_PShadKind_Mesh];\r\n            ID3D11Buffer *uniforms_buffer = r_d3d11_state->uniform_type_kind_buffers[R_D3D11_VShadKind_Mesh];\r\n            \r\n            // rjf: setup output merger\r\n            d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->geo3d_color_rtv, wnd->geo3d_depth_dsv);\r\n            d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->plain_depth_stencil, 0);\r\n            d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff);\r\n            \r\n            // rjf: draw all batches\r\n            for(U64 slot_idx = 0; slot_idx < mesh_group_map->slots_count; slot_idx += 1)\r\n            {\r\n              for(R_BatchGroup3DMapNode *n = mesh_group_map->slots[slot_idx]; n != 0; n = n->next)\r\n              {\r\n                // rjf: unpack group params\r\n                R_BatchList *batches = &n->batches;\r\n                R_BatchGroup3DParams *group_params = &n->params;\r\n                R_D3D11_Buffer *mesh_vertices = r_d3d11_buffer_from_handle(group_params->mesh_vertices);\r\n                R_D3D11_Buffer *mesh_indices = r_d3d11_buffer_from_handle(group_params->mesh_indices);\r\n                \r\n                // rjf: setup input assembly\r\n                U32 stride = 11 * sizeof(F32);\r\n                U32 offset = 0;\r\n                d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);\r\n                d_ctx->lpVtbl->IASetInputLayout(d_ctx, ilay);\r\n                d_ctx->lpVtbl->IASetVertexBuffers(d_ctx, 0, 1, &mesh_vertices->buffer, &stride, &offset);\r\n                d_ctx->lpVtbl->IASetIndexBuffer(d_ctx, mesh_indices->buffer, DXGI_FORMAT_R32_UINT, 0);\r\n                \r\n                // rjf: setup uniforms buffer\r\n                R_D3D11_Uniforms_Mesh uniforms = {0};\r\n                {\r\n                  uniforms.xform = mul_4x4f32(params->projection, params->view);\r\n                }\r\n                {\r\n                  D3D11_MAPPED_SUBRESOURCE sub_rsrc = {0};\r\n                  d_ctx->lpVtbl->Map(d_ctx, (ID3D11Resource *)uniforms_buffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &sub_rsrc);\r\n                  MemoryCopy((U8 *)sub_rsrc.pData, &uniforms, sizeof(uniforms));\r\n                  d_ctx->lpVtbl->Unmap(d_ctx, (ID3D11Resource *)uniforms_buffer, 0);\r\n                }\r\n                \r\n                \r\n                // rjf: setup shaders\r\n                d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0);\r\n                d_ctx->lpVtbl->VSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer);\r\n                d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0);\r\n                d_ctx->lpVtbl->PSSetConstantBuffers(d_ctx, 0, 1, &uniforms_buffer);\r\n                \r\n                // rjf: setup scissor rect\r\n                {\r\n                  D3D11_RECT rect = {0};\r\n                  {\r\n                    rect.left = 0;\r\n                    rect.right = (LONG)wnd->last_resolution.x;\r\n                    rect.top = 0;\r\n                    rect.bottom = (LONG)wnd->last_resolution.y;\r\n                  }\r\n                  d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect);\r\n                }\r\n                \r\n                // rjf: draw\r\n                d_ctx->lpVtbl->DrawIndexed(d_ctx, mesh_indices->size/sizeof(U32), 0, 0);\r\n              }\r\n            }\r\n          }\r\n          \r\n          //- rjf: composite to main staging buffer\r\n          {\r\n            ID3D11SamplerState *sampler   = r_d3d11_state->samplers[R_Tex2DSampleKind_Nearest];\r\n            ID3D11VertexShader *vshad     = r_d3d11_state->vshads[R_D3D11_VShadKind_Geo3DComposite];\r\n            ID3D11PixelShader *pshad      = r_d3d11_state->pshads[R_D3D11_PShadKind_Geo3DComposite];\r\n            \r\n            // rjf: setup output merger\r\n            d_ctx->lpVtbl->OMSetRenderTargets(d_ctx, 1, &wnd->stage_color_rtv, 0);\r\n            d_ctx->lpVtbl->OMSetDepthStencilState(d_ctx, r_d3d11_state->noop_depth_stencil, 0);\r\n            d_ctx->lpVtbl->OMSetBlendState(d_ctx, r_d3d11_state->main_blend_state, 0, 0xffffffff);\r\n            \r\n            // rjf: set up rasterizer\r\n            Vec2S32 resolution = wnd->last_resolution;\r\n            D3D11_VIEWPORT viewport = { 0.0f, 0.0f, (F32)resolution.x, (F32)resolution.y, 0.0f, 1.0f };\r\n            d_ctx->lpVtbl->RSSetViewports(d_ctx, 1, &viewport);\r\n            d_ctx->lpVtbl->RSSetState(d_ctx, (ID3D11RasterizerState *)r_d3d11_state->main_rasterizer);\r\n            \r\n            // rjf: setup input assembly\r\n            d_ctx->lpVtbl->IASetPrimitiveTopology(d_ctx, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);\r\n            d_ctx->lpVtbl->IASetInputLayout(d_ctx, 0);\r\n            \r\n            // rjf: setup shaders\r\n            d_ctx->lpVtbl->VSSetShader(d_ctx, vshad, 0, 0);\r\n            d_ctx->lpVtbl->PSSetShader(d_ctx, pshad, 0, 0);\r\n            d_ctx->lpVtbl->PSSetShaderResources(d_ctx, 0, 1, &wnd->geo3d_color_srv);\r\n            d_ctx->lpVtbl->PSSetSamplers(d_ctx, 0, 1, &sampler);\r\n            \r\n            // rjf: setup scissor rect\r\n            {\r\n              D3D11_RECT rect = {0};\r\n              Rng2F32 clip = params->clip;\r\n              if(clip.x0 == 0 && clip.y0 == 0 && clip.x1 == 0 && clip.y1 == 0)\r\n              {\r\n                rect.left = 0;\r\n                rect.right = (LONG)wnd->last_resolution.x;\r\n                rect.top = 0;\r\n                rect.bottom = (LONG)wnd->last_resolution.y;\r\n              }\r\n              else if(clip.x0 > clip.x1 || clip.y0 > clip.y1)\r\n              {\r\n                rect.left = 0;\r\n                rect.right = 0;\r\n                rect.top = 0;\r\n                rect.bottom = 0;\r\n              }\r\n              else\r\n              {\r\n                rect.left = (LONG)clip.x0;\r\n                rect.right = (LONG)clip.x1;\r\n                rect.top = (LONG)clip.y0;\r\n                rect.bottom = (LONG)clip.y1;\r\n              }\r\n              d_ctx->lpVtbl->RSSetScissorRects(d_ctx, 1, &rect);\r\n            }\r\n            \r\n            // rjf: draw\r\n            d_ctx->lpVtbl->Draw(d_ctx, 4, 0);\r\n          }\r\n        }break;\r\n      }\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n"
  },
  {
    "path": "src/render/d3d11/render_d3d11.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RENDER_D3D11_H\r\n#define RENDER_D3D11_H\r\n\r\n#include <combaseapi.h>\r\n#include <dcommon.h>\r\n#include <initguid.h>\r\n#include <windows.h>\r\n#include <d3d11_1.h>\r\n#include <d3dcompiler.h>\r\n\r\n#pragma comment(lib, \"user32\")\r\n#pragma comment(lib, \"d3d11\")\r\n#pragma comment(lib, \"d3dcompiler\")\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/render_d3d11.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: C-side Shader Types\r\n\r\ntypedef struct R_D3D11_Uniforms_Rect R_D3D11_Uniforms_Rect;\r\nstruct R_D3D11_Uniforms_Rect\r\n{\r\n  Vec2F32 viewport_size;\r\n  F32 opacity;\r\n  F32 _padding0_;\r\n  Mat4x4F32 texture_sample_channel_map;\r\n  Vec2F32 texture_t2d_size;\r\n  Vec2F32 translate;\r\n  Vec4F32 xform[3];\r\n  Vec2F32 xform_scale;\r\n};\r\n\r\ntypedef struct R_D3D11_Uniforms_BlurPass R_D3D11_Uniforms_BlurPass;\r\nstruct R_D3D11_Uniforms_BlurPass\r\n{\r\n  Rng2F32 rect;\r\n  Vec4F32 corner_radii;\r\n  Vec2F32 direction;\r\n  Vec2F32 viewport_size;\r\n  U32 blur_count;\r\n  U8 _padding0_[204];\r\n};\r\nStaticAssert(sizeof(R_D3D11_Uniforms_BlurPass) % 256 == 0, NotAligned); // constant count/offset must be aligned to 256 bytes\r\n\r\ntypedef struct R_D3D11_Uniforms_Blur R_D3D11_Uniforms_Blur;\r\nstruct R_D3D11_Uniforms_Blur\r\n{\r\n  R_D3D11_Uniforms_BlurPass passes[Axis2_COUNT];\r\n  Vec4F32 kernel[32];\r\n};\r\n\r\ntypedef struct R_D3D11_Uniforms_Mesh R_D3D11_Uniforms_Mesh;\r\nstruct R_D3D11_Uniforms_Mesh\r\n{\r\n  Mat4x4F32 xform;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Main State Types\r\n\r\ntypedef struct R_D3D11_Tex2D R_D3D11_Tex2D;\r\nstruct R_D3D11_Tex2D\r\n{\r\n  R_D3D11_Tex2D *next;\r\n  U64 generation;\r\n  ID3D11Texture2D *texture;\r\n  ID3D11ShaderResourceView *view;\r\n  R_ResourceKind kind;\r\n  Vec2S32 size;\r\n  R_Tex2DFormat format;\r\n};\r\n\r\ntypedef struct R_D3D11_Buffer R_D3D11_Buffer;\r\nstruct R_D3D11_Buffer\r\n{\r\n  R_D3D11_Buffer *next;\r\n  U64 generation;\r\n  ID3D11Buffer *buffer;\r\n  R_ResourceKind kind;\r\n  U64 size;\r\n};\r\n\r\ntypedef struct R_D3D11_Window R_D3D11_Window;\r\nstruct R_D3D11_Window\r\n{\r\n  R_D3D11_Window *next;\r\n  U64 generation;\r\n  \r\n  // rjf: swapchain/framebuffer\r\n  IDXGISwapChain1        *swapchain;\r\n  ID3D11Texture2D        *framebuffer;\r\n  ID3D11RenderTargetView *framebuffer_rtv;\r\n  \r\n  // rjf: staging buffer\r\n  ID3D11Texture2D *stage_color;\r\n  ID3D11RenderTargetView *stage_color_rtv;\r\n  ID3D11ShaderResourceView *stage_color_srv;\r\n  ID3D11Texture2D *stage_scratch_color;\r\n  ID3D11RenderTargetView *stage_scratch_color_rtv;\r\n  ID3D11ShaderResourceView *stage_scratch_color_srv;\r\n  \r\n  // rjf: geo3d buffer\r\n  ID3D11Texture2D *geo3d_color;\r\n  ID3D11RenderTargetView *geo3d_color_rtv;\r\n  ID3D11ShaderResourceView *geo3d_color_srv;\r\n  ID3D11Texture2D *geo3d_depth;\r\n  ID3D11DepthStencilView *geo3d_depth_dsv;\r\n  ID3D11ShaderResourceView *geo3d_depth_srv;\r\n  \r\n  // rjf: last state\r\n  Vec2S32 last_resolution;\r\n};\r\n\r\ntypedef struct R_D3D11_FlushBuffer R_D3D11_FlushBuffer;\r\nstruct R_D3D11_FlushBuffer\r\n{\r\n  R_D3D11_FlushBuffer *next;\r\n  ID3D11Buffer *buffer;\r\n};\r\n\r\ntypedef struct R_D3D11_State R_D3D11_State;\r\nstruct R_D3D11_State\r\n{\r\n  // rjf: state\r\n  Arena *arena;\r\n  U64 window_count;\r\n  R_D3D11_Window *first_free_window;\r\n  R_D3D11_Tex2D *first_free_tex2d;\r\n  R_D3D11_Buffer *first_free_buffer;\r\n  R_D3D11_Tex2D *first_to_free_tex2d;\r\n  R_D3D11_Buffer *first_to_free_buffer;\r\n  RWMutex device_rw_mutex;\r\n  \r\n  // rjf: base d3d11 objects\r\n  ID3D11Device            *base_device;\r\n  ID3D11DeviceContext     *base_device_ctx;\r\n  ID3D11Device1           *device;\r\n  ID3D11DeviceContext1    *device_ctx;\r\n  IDXGIDevice1            *dxgi_device;\r\n  IDXGIAdapter            *dxgi_adapter;\r\n  IDXGIFactory2           *dxgi_factory;\r\n  ID3D11RasterizerState1  *main_rasterizer;\r\n  ID3D11BlendState        *main_blend_state;\r\n  ID3D11BlendState        *no_blend_state;\r\n  ID3D11SamplerState      *samplers[R_Tex2DSampleKind_COUNT];\r\n  ID3D11DepthStencilState *noop_depth_stencil;\r\n  ID3D11DepthStencilState *plain_depth_stencil;\r\n  ID3D11Buffer            *instance_scratch_buffer_64kb;\r\n  \r\n  // rjf: backups\r\n  R_Handle backup_texture;\r\n  \r\n  // rjf: vertex shaders\r\n  ID3D11VertexShader *vshads[R_D3D11_VShadKind_COUNT];\r\n  ID3D11InputLayout *ilays[R_D3D11_VShadKind_COUNT];\r\n  ID3D11PixelShader *pshads[R_D3D11_PShadKind_COUNT];\r\n  ID3D11Buffer *uniform_type_kind_buffers[R_D3D11_UniformTypeKind_COUNT];\r\n  \r\n  // rjf: buffers to flush at subsequent frame\r\n  Arena *buffer_flush_arena;\r\n  R_D3D11_FlushBuffer *first_buffer_to_flush;\r\n  R_D3D11_FlushBuffer *last_buffer_to_flush;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nglobal R_D3D11_State *r_d3d11_state = 0;\r\nglobal read_only R_D3D11_Window r_d3d11_window_nil = {&r_d3d11_window_nil};\r\nglobal read_only R_D3D11_Tex2D r_d3d11_tex2d_nil = {&r_d3d11_tex2d_nil};\r\nglobal read_only R_D3D11_Buffer r_d3d11_buffer_nil = {&r_d3d11_buffer_nil};\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal R_D3D11_Window *r_d3d11_window_from_handle(R_Handle handle);\r\ninternal R_Handle r_d3d11_handle_from_window(R_D3D11_Window *window);\r\ninternal R_D3D11_Tex2D *r_d3d11_tex2d_from_handle(R_Handle handle);\r\ninternal R_Handle r_d3d11_handle_from_tex2d(R_D3D11_Tex2D *texture);\r\ninternal R_D3D11_Buffer *r_d3d11_buffer_from_handle(R_Handle handle);\r\ninternal R_Handle r_d3d11_handle_from_buffer(R_D3D11_Buffer *buffer);\r\ninternal ID3D11Buffer *r_d3d11_instance_buffer_from_size(U64 size);\r\ninternal void r_usage_access_flags_from_resource_kind(R_ResourceKind kind, D3D11_USAGE *out_d3d11_usage, UINT *out_cpu_access_flags);\r\n\r\n#endif // RENDER_D3D11_H\r\n"
  },
  {
    "path": "src/render/d3d11/render_d3d11.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Pipeline Tables\r\n\r\n@table(name, source, ilay_table)\r\nR_D3D11_VShadTable:\r\n{\r\n  {Rect                r_d3d11_g_rect_shader_src               r_d3d11_g_rect_ilay_elements }\r\n  {Blur                r_d3d11_g_blur_shader_src               0                            }\r\n  {Mesh                r_d3d11_g_mesh_shader_src               r_d3d11_g_mesh_ilay_elements }\r\n  {Geo3DComposite      r_d3d11_g_geo3dcomposite_shader_src     0                            }\r\n  {Finalize            r_d3d11_g_finalize_shader_src           0                            }\r\n}\r\n\r\n@table(name, source)\r\nR_D3D11_PShadTable:\r\n{\r\n  {Rect                r_d3d11_g_rect_shader_src              }\r\n  {Blur                r_d3d11_g_blur_shader_src              }\r\n  {Mesh                r_d3d11_g_mesh_shader_src              }\r\n  {Geo3DComposite      r_d3d11_g_geo3dcomposite_shader_src    }\r\n  {Finalize            r_d3d11_g_finalize_shader_src          }\r\n}\r\n\r\n@table(name)\r\nR_D3D11_UniformTypeTable:\r\n{\r\n  {Rect}\r\n  {Blur}\r\n  {Mesh}\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: UI Rectangle Shaders\r\n\r\n@embed_string r_d3d11_g_rect_shader_src:\r\n\"\"\"\r\ncbuffer Globals : register(b0)\r\n{\r\n  float2 viewport_size_px;\r\n  float opacity;\r\n  row_major float4x4 texture_sample_channel_map;\r\n  float2 texture_t2d_size_px;\r\n  row_major float3x3 xform;\r\n  float2 xform_scale;\r\n}\r\n\r\nstruct CPU2Vertex\r\n{\r\n  float4 dst_rect_px     : POS;\r\n  float4 src_rect_px     : TEX;\r\n  float4 color00         : COL0;\r\n  float4 color01         : COL1;\r\n  float4 color10         : COL2;\r\n  float4 color11         : COL3;\r\n  float4 corner_radii_px : CRAD;\r\n  float4 style_params    : STY; // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\r\n  uint vertex_id         : SV_VertexID;\r\n};\r\n\r\nstruct Vertex2Pixel\r\n{\r\n  float4 position           : SV_POSITION;\r\n  nointerpolation float2 rect_half_size_px  : PSIZE;\r\n  float2 texcoord_pct       : TEX;\r\n  float2 sdf_sample_pos     : SDF;\r\n  float4 tint               : TINT;\r\n  float corner_radius_px    : CRAD;\r\n  nointerpolation float border_thickness_px : BTHC;\r\n  nointerpolation float softness_px         : SFT;\r\n  nointerpolation float omit_texture        : OTX;\r\n};\r\n\r\nTexture2D    main_t2d     : register(t0);\r\nSamplerState main_sampler : register(s0);\r\n\r\nfloat rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\r\n{\r\n  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\r\n}\r\n\r\nfloat linear_from_srgb_f32(float x)\r\n{\r\n  return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\r\n}\r\n\r\nfloat4 linear_from_srgba(float4 v)\r\n{\r\n  float4 result = float4(linear_from_srgb_f32(v.x),\r\n                         linear_from_srgb_f32(v.y),\r\n                         linear_from_srgb_f32(v.z),\r\n                         v.w);\r\n  return result;\r\n}\r\n\r\n//- rjf: vertex shader\r\n\r\nVertex2Pixel\r\nvs_main(CPU2Vertex cpu2vertex)\r\n{\r\n  //- rjf: unpack & xform rectangle src/dst vertices\r\n  float2 dst_p0_px  = cpu2vertex.dst_rect_px.xy;\r\n  float2 dst_p1_px  = cpu2vertex.dst_rect_px.zw;\r\n  float2 src_p0_px  = cpu2vertex.src_rect_px.xy;\r\n  float2 src_p1_px  = cpu2vertex.src_rect_px.zw;\r\n  float2 dst_size_px = abs(dst_p1_px - dst_p0_px);\r\n  \r\n  //- rjf: unpack style params\r\n  float border_thickness_px = cpu2vertex.style_params.x;\r\n  float softness_px         = cpu2vertex.style_params.y;\r\n  float omit_texture        = cpu2vertex.style_params.z;\r\n  float shear_px            = cpu2vertex.style_params.w;\r\n  \r\n  //- rjf: prep per-vertex arrays to sample from (p: position, t: texcoord, c: colorcoord, r: cornerradius)\r\n  float2 dst_p_verts_px[] =\r\n  {\r\n    float2(dst_p0_px.x, dst_p1_px.y),\r\n    float2(dst_p0_px.x, dst_p0_px.y),\r\n    float2(dst_p1_px.x, dst_p1_px.y + shear_px),\r\n    float2(dst_p1_px.x, dst_p0_px.y + shear_px),\r\n  };\r\n  float2 src_p_verts_px[] =\r\n  {\r\n    float2(src_p0_px.x, src_p1_px.y),\r\n    float2(src_p0_px.x, src_p0_px.y),\r\n    float2(src_p1_px.x, src_p1_px.y),\r\n    float2(src_p1_px.x, src_p0_px.y),\r\n  };\r\n  float dst_r_verts_px[] =\r\n  {\r\n    cpu2vertex.corner_radii_px.y,\r\n    cpu2vertex.corner_radii_px.x,\r\n    cpu2vertex.corner_radii_px.w,\r\n    cpu2vertex.corner_radii_px.z,\r\n  };\r\n  float4 src_color[] =\r\n  {\r\n    cpu2vertex.color01,\r\n    cpu2vertex.color00,\r\n    cpu2vertex.color11,\r\n    cpu2vertex.color10,\r\n  };\r\n  float2 dst_verts_pct = float2((cpu2vertex.vertex_id >> 1) ? 1.f : 0.f,\r\n                                (cpu2vertex.vertex_id & 1)  ? 0.f : 1.f);\r\n  \r\n  // rjf: fill vertex -> pixel data\r\n  Vertex2Pixel vertex2pixel;\r\n  {\r\n    float2 xformed_pos = mul(xform, float3(dst_p_verts_px[cpu2vertex.vertex_id], 1.f)).xy;\r\n    xformed_pos.y = viewport_size_px.y - xformed_pos.y;\r\n    vertex2pixel.position.xy          = 2.f * xformed_pos/viewport_size_px - 1.f;\r\n    vertex2pixel.position.z           = 0.f;\r\n    vertex2pixel.position.w           = 1.f;\r\n    vertex2pixel.rect_half_size_px    = dst_size_px / 2.f * xform_scale;\r\n    vertex2pixel.texcoord_pct         = src_p_verts_px[cpu2vertex.vertex_id] / texture_t2d_size_px;\r\n    vertex2pixel.sdf_sample_pos       = (2.f * dst_verts_pct - 1.f) * vertex2pixel.rect_half_size_px;\r\n    vertex2pixel.tint                 = src_color[cpu2vertex.vertex_id];\r\n    vertex2pixel.corner_radius_px     = dst_r_verts_px[cpu2vertex.vertex_id];\r\n    vertex2pixel.border_thickness_px  = border_thickness_px;\r\n    vertex2pixel.softness_px          = softness_px;\r\n    vertex2pixel.omit_texture         = omit_texture;\r\n  }\r\n  return vertex2pixel;\r\n}\r\n\r\n//- rjf: pixel shader\r\n\r\nfloat4\r\nps_main(Vertex2Pixel vertex2pixel) : SV_TARGET\r\n{\r\n  // rjf: blend corner colors to produce final tint\r\n  float4 tint = vertex2pixel.tint;\r\n  \r\n  // rjf: sample texture\r\n  float4 albedo_sample = float4(1, 1, 1, 1);\r\n  if(vertex2pixel.omit_texture < 1)\r\n  {\r\n    albedo_sample = mul(main_t2d.Sample(main_sampler, vertex2pixel.texcoord_pct), texture_sample_channel_map);\r\n    albedo_sample = linear_from_srgba(albedo_sample);\r\n  }\r\n  \r\n  // rjf: determine SDF sample position\r\n  float2 sdf_sample_pos = vertex2pixel.sdf_sample_pos;\r\n  \r\n  // rjf: sample for borders\r\n  float border_sdf_t = 1;\r\n  if(vertex2pixel.border_thickness_px > 0)\r\n  {\r\n    float border_sdf_s = rect_sdf(sdf_sample_pos,\r\n                                  vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f) - vertex2pixel.border_thickness_px,\r\n                                  max(vertex2pixel.corner_radius_px-vertex2pixel.border_thickness_px, 0));\r\n    border_sdf_t = smoothstep(0, 2*vertex2pixel.softness_px, border_sdf_s);\r\n  }\r\n  if(border_sdf_t < 0.001f)\r\n  {\r\n    discard;\r\n  }\r\n  \r\n  // rjf: sample for corners\r\n  float corner_sdf_t = 1;\r\n  if(vertex2pixel.corner_radius_px > 0 || vertex2pixel.softness_px > 0.75f)\r\n  {\r\n    float corner_sdf_s = rect_sdf(sdf_sample_pos,\r\n                                  vertex2pixel.rect_half_size_px - float2(vertex2pixel.softness_px*2.f, vertex2pixel.softness_px*2.f),\r\n                                  vertex2pixel.corner_radius_px);\r\n    corner_sdf_t = 1-smoothstep(0, 2*vertex2pixel.softness_px, corner_sdf_s);\r\n  }\r\n  \r\n  // rjf: form+return final color\r\n  float4 final_color = albedo_sample;\r\n  final_color *= tint;\r\n  final_color.a *= opacity;\r\n  final_color.a *= corner_sdf_t;\r\n  final_color.a *= border_sdf_t;\r\n  return final_color;\r\n}\r\n\"\"\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Blur Shaders\r\n\r\n@embed_string r_d3d11_g_blur_shader_src:\r\n\"\"\"\r\ncbuffer Globals : register(b0)\r\n{\r\n  float4 rect;\r\n  float4 corner_radii_px;\r\n  float2 direction;\r\n  float2 viewport_size;\r\n  uint blur_count;\r\n}\r\n\r\ncbuffer Kernel : register(b1)\r\n{\r\n  float4 kernel[32];\r\n}\r\n\r\nstruct CPU2Vertex\r\n{\r\n  uint vertex_id         : SV_VertexID;\r\n};\r\n\r\nstruct Vertex2Pixel\r\n{\r\n  float4 position        : SV_POSITION;\r\n  float2 texcoord        : TEX;\r\n  float2 sdf_sample_pos  : SDF;\r\n  nointerpolation float2 rect_half_size : RHS;\r\n  float corner_radius    : RAD;\r\n};\r\n\r\nTexture2D    stage_t2d     : register(t0);\r\nSamplerState stage_sampler : register(s0);\r\n\r\nfloat rect_sdf(float2 sample_pos, float2 rect_half_size, float r)\r\n{\r\n  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\r\n}\r\n\r\n//- rjf: vertex shader\r\n\r\nVertex2Pixel\r\nvs_main(CPU2Vertex c2v)\r\n{\r\n  float2 vertex_positions__scrn[] =\r\n  {\r\n    rect.xw,\r\n    rect.xy,\r\n    rect.zw,\r\n    rect.zy,\r\n  };\r\n  float corner_radii__px[] =\r\n  {\r\n    corner_radii_px.y,\r\n    corner_radii_px.x,\r\n    corner_radii_px.w,\r\n    corner_radii_px.z,\r\n  };\r\n  float2 cornercoords__pct = float2((c2v.vertex_id >> 1) ? 1.f : 0.f,\r\n                                    (c2v.vertex_id & 1)  ? 0.f : 1.f);\r\n  \r\n  float2 vertex_position__pct = vertex_positions__scrn[c2v.vertex_id] / viewport_size;\r\n  float2 vertex_position__scr = 2.f * vertex_position__pct - 1.f;\r\n  \r\n  float2 rect_half_size = float2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\r\n  \r\n  Vertex2Pixel v2p;\r\n  {\r\n    v2p.position = float4(vertex_position__scr.x, -vertex_position__scr.y, 0.f, 1.f);\r\n    v2p.texcoord = vertex_position__pct;\r\n    v2p.sdf_sample_pos = (2.f * cornercoords__pct - 1.f) * rect_half_size;\r\n    v2p.rect_half_size = rect_half_size - 2.f;\r\n    v2p.corner_radius = corner_radii__px[c2v.vertex_id];\r\n  }\r\n  return v2p;\r\n}\r\n\r\n//- rjf: pixel shader\r\n\r\nfloat4\r\nps_main(Vertex2Pixel v2p) : SV_TARGET\r\n{\r\n  // rjf: blend weighted texture samples into color\r\n  float3 color = kernel[0].x * stage_t2d.Sample(stage_sampler, v2p.texcoord).rgb;\r\n  \r\n  for(uint i = 1; i < blur_count; i += 1)\r\n  {\r\n    float weight = kernel[i].x;\r\n    float offset = kernel[i].y;\r\n    color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord - offset * direction).rgb;\r\n    color += weight * stage_t2d.Sample(stage_sampler, v2p.texcoord + offset * direction).rgb;\r\n  }\r\n  \r\n  // rjf: sample for corners\r\n  float corner_sdf_s = rect_sdf(v2p.sdf_sample_pos, v2p.rect_half_size, v2p.corner_radius);\r\n  float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\r\n  \r\n  // rjf: weight output color by sdf\r\n  // this is doing alpha testing, leave blurring only where mostly opaque pixels are\r\n  if (corner_sdf_t < 0.9f)\r\n  {\r\n    discard;\r\n  }\r\n  \r\n  return float4(color, 1.f);\r\n}\r\n\"\"\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Mesh Shaders\r\n\r\n@embed_string r_d3d11_g_mesh_shader_src:\r\n\"\"\"\r\ncbuffer Uniforms : register(b0)\r\n{\r\n  row_major float4x4 xform;\r\n}\r\n\r\nstruct CPU2Vertex\r\n{\r\n  float3 position : POS;\r\n  float3 normal   : NOR;\r\n  float2 texcoord : TEX;\r\n  float3 color    : COL;\r\n};\r\n\r\nstruct Vertex2Pixel\r\n{\r\n  float4 position : SV_POSITION;\r\n  float2 texcoord : TEX;\r\n  float4 color    : COL;\r\n};\r\n\r\nVertex2Pixel vs_main(CPU2Vertex c2v)\r\n{\r\n  Vertex2Pixel v2p;\r\n  v2p.position = mul(float4(c2v.position, 1.f), xform);\r\n  v2p.texcoord = c2v.texcoord;\r\n  v2p.color    = float4(c2v.color, 1.f);\r\n  return v2p;\r\n}\r\n\r\nfloat4 ps_main(Vertex2Pixel v2p) : SV_TARGET\r\n{\r\n  return v2p.color;\r\n}\r\n\"\"\";\r\n\r\n////////////////////////////////\r\n//~ rjf: Geo3D Composition Shaders\r\n\r\n@embed_string r_d3d11_g_geo3dcomposite_shader_src:\r\n\"\"\"\r\nstruct CPU2Vertex\r\n{\r\n  uint vertex_id         : SV_VertexID;\r\n};\r\n\r\nstruct Vertex2Pixel\r\n{\r\n  float4 position        : SV_POSITION;\r\n  float2 texcoord        : TEX;\r\n};\r\n\r\nTexture2D    stage_t2d     : register(t0);\r\nSamplerState stage_sampler : register(s0);\r\n\r\n//- rjf: vertex shader\r\n\r\nVertex2Pixel\r\nvs_main(CPU2Vertex c2v)\r\n{\r\n  float4 vertex_positions__modl[] =\r\n  {\r\n    float4(0, 0, 0, 1),\r\n    float4(0, 1, 0, 1),\r\n    float4(1, 0, 0, 1),\r\n    float4(1, 1, 0, 1),\r\n  };\r\n  float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\r\n  float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\r\n  float2 texcoord              = float2(vertex_position__modl.x, vertex_position__modl.y);\r\n  texcoord.y = 1-texcoord.y;\r\n  Vertex2Pixel v2p;\r\n  {\r\n    v2p.position = vertex_position__clip;\r\n    v2p.texcoord = texcoord;\r\n  }\r\n  return v2p;\r\n}\r\n\r\n//- rjf: pixel shader\r\n\r\nfloat4\r\nps_main(Vertex2Pixel v2p) : SV_TARGET\r\n{\r\n  float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\r\n  return final_color;\r\n}\r\n\"\"\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Finalize Shaders\r\n\r\n@embed_string r_d3d11_g_finalize_shader_src:\r\n\"\"\"\r\nstruct CPU2Vertex\r\n{\r\n  uint vertex_id         : SV_VertexID;\r\n};\r\n\r\nstruct Vertex2Pixel\r\n{\r\n  float4 position        : SV_POSITION;\r\n  float2 texcoord        : TEX;\r\n};\r\n\r\nTexture2D    stage_t2d     : register(t0);\r\nSamplerState stage_sampler : register(s0);\r\n\r\n//- rjf: vertex shader\r\n\r\nVertex2Pixel\r\nvs_main(CPU2Vertex c2v)\r\n{\r\n  float4 vertex_positions__modl[] =\r\n  {\r\n    float4(0, 0, 0, 1),\r\n    float4(0, 1, 0, 1),\r\n    float4(1, 0, 0, 1),\r\n    float4(1, 1, 0, 1),\r\n  };\r\n  float4 vertex_position__modl = vertex_positions__modl[c2v.vertex_id];\r\n  float4 vertex_position__clip = float4(2*vertex_position__modl.x - 1, 2*vertex_position__modl.y - 1, 0, 1);\r\n  float2 texcoord              = float2(vertex_position__modl.x, vertex_position__modl.y);\r\n  texcoord.y = 1-texcoord.y;\r\n  Vertex2Pixel v2p;\r\n  {\r\n    v2p.position = vertex_position__clip;\r\n    v2p.texcoord = texcoord;\r\n  }\r\n  return v2p;\r\n}\r\n\r\n//- rjf: pixel shader\r\n\r\nfloat4\r\nps_main(Vertex2Pixel v2p) : SV_TARGET\r\n{\r\n  float4 final_color = stage_t2d.Sample(stage_sampler, v2p.texcoord);\r\n  final_color.a = 1;\r\n  return final_color;\r\n}\r\n\"\"\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Table Generators\r\n\r\n@enum R_D3D11_VShadKind:\r\n{\r\n  @expand(R_D3D11_VShadTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@enum R_D3D11_PShadKind:\r\n{\r\n  @expand(R_D3D11_PShadTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@enum R_D3D11_UniformTypeKind:\r\n{\r\n  @expand(R_D3D11_UniformTypeTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@c_file @data(`String8*`)\r\nr_d3d11_g_vshad_kind_source_table:\r\n{\r\n  @expand(R_D3D11_VShadTable a) `&$(a.source)`;\r\n}\r\n\r\n@c_file @data(String8)\r\nr_d3d11_g_vshad_kind_source_name_table:\r\n{\r\n  @expand(R_D3D11_VShadTable a) `str8_lit_comp(\"$(a.source)\")`;\r\n}\r\n\r\n@c_file @data(`D3D11_INPUT_ELEMENT_DESC *`)\r\nr_d3d11_g_vshad_kind_elements_ptr_table:\r\n{\r\n  @expand(R_D3D11_VShadTable a) `$(a.ilay_table)`;\r\n}\r\n\r\n@c_file @data(U64)\r\nr_d3d11_g_vshad_kind_elements_count_table:\r\n{\r\n  @expand(R_D3D11_VShadTable a) `$(a.ilay_table != 0 -> \"ArrayCount(\"..a.ilay_table..\")\") $(a.ilay_table == 0 -> \"0\")`;\r\n}\r\n\r\n@c_file @data(`String8*`)\r\nr_d3d11_g_pshad_kind_source_table:\r\n{\r\n  @expand(R_D3D11_PShadTable a) `&$(a.source)`;\r\n}\r\n\r\n@c_file @data(String8)\r\nr_d3d11_g_pshad_kind_source_name_table:\r\n{\r\n  @expand(R_D3D11_PShadTable a) `str8_lit_comp(\"$(a.source)\")`;\r\n}\r\n\r\n@c_file @data(U64)\r\nr_d3d11_g_uniform_type_kind_size_table:\r\n{\r\n  @expand(R_D3D11_UniformTypeTable a) `sizeof(R_D3D11_Uniforms_$(a.name))`;\r\n}\r\n"
  },
  {
    "path": "src/render/generated/render.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 r_tex2d_format_display_string_table[9] =\r\n{\r\nstr8_lit_comp(\"R8\"),\r\nstr8_lit_comp(\"RG8\"),\r\nstr8_lit_comp(\"RGBA8\"),\r\nstr8_lit_comp(\"BGRA8\"),\r\nstr8_lit_comp(\"R16\"),\r\nstr8_lit_comp(\"RGBA16\"),\r\nstr8_lit_comp(\"R32\"),\r\nstr8_lit_comp(\"RG32\"),\r\nstr8_lit_comp(\"RGBA32\"),\r\n};\r\n\r\nU8 r_tex2d_format_bytes_per_pixel_table[9] =\r\n{\r\n1,\r\n2,\r\n4,\r\n4,\r\n2,\r\n8,\r\n4,\r\n8,\r\n16,\r\n};\r\n\r\nString8 r_resource_kind_display_string_table[3] =\r\n{\r\nstr8_lit_comp(\"Static\"),\r\nstr8_lit_comp(\"Dynamic\"),\r\nstr8_lit_comp(\"Stream \"),\r\n};\r\n\r\nString8 r_tex2d_sample_kind_display_string_table[2] =\r\n{\r\nstr8_lit_comp(\"Nearest\"),\r\nstr8_lit_comp(\"Linear\"),\r\n};\r\n\r\nString8 r_pass_kind_display_string_table[3] =\r\n{\r\nstr8_lit_comp(\"UI\"),\r\nstr8_lit_comp(\"Blur\"),\r\nstr8_lit_comp(\"Geo3D\"),\r\n};\r\n\r\nU8 r_pass_kind_batch_table[3] =\r\n{\r\n1,\r\n0,\r\n1,\r\n};\r\n\r\nU64 r_pass_kind_params_size_table[3] =\r\n{\r\nsizeof(R_PassParams_UI),\r\nsizeof(R_PassParams_Blur),\r\nsizeof(R_PassParams_Geo3D),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/render/generated/render.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef RENDER_META_H\r\n#define RENDER_META_H\r\n\r\ntypedef enum R_Tex2DFormat\r\n{\r\nR_Tex2DFormat_R8,\r\nR_Tex2DFormat_RG8,\r\nR_Tex2DFormat_RGBA8,\r\nR_Tex2DFormat_BGRA8,\r\nR_Tex2DFormat_R16,\r\nR_Tex2DFormat_RGBA16,\r\nR_Tex2DFormat_R32,\r\nR_Tex2DFormat_RG32,\r\nR_Tex2DFormat_RGBA32,\r\nR_Tex2DFormat_COUNT,\r\n} R_Tex2DFormat;\r\n\r\ntypedef enum R_ResourceKind\r\n{\r\nR_ResourceKind_Static,\r\nR_ResourceKind_Dynamic,\r\nR_ResourceKind_Stream,\r\nR_ResourceKind_COUNT,\r\n} R_ResourceKind;\r\n\r\ntypedef enum R_Tex2DSampleKind\r\n{\r\nR_Tex2DSampleKind_Nearest,\r\nR_Tex2DSampleKind_Linear,\r\nR_Tex2DSampleKind_COUNT,\r\n} R_Tex2DSampleKind;\r\n\r\ntypedef enum R_GeoTopologyKind\r\n{\r\nR_GeoTopologyKind_Lines,\r\nR_GeoTopologyKind_LineStrip,\r\nR_GeoTopologyKind_Triangles,\r\nR_GeoTopologyKind_TriangleStrip,\r\nR_GeoTopologyKind_COUNT,\r\n} R_GeoTopologyKind;\r\n\r\ntypedef enum R_PassKind\r\n{\r\nR_PassKind_UI,\r\nR_PassKind_Blur,\r\nR_PassKind_Geo3D,\r\nR_PassKind_COUNT,\r\n} R_PassKind;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 r_tex2d_format_display_string_table[9];\r\nextern U8 r_tex2d_format_bytes_per_pixel_table[9];\r\nextern String8 r_resource_kind_display_string_table[3];\r\nextern String8 r_tex2d_sample_kind_display_string_table[2];\r\nextern String8 r_pass_kind_display_string_table[3];\r\nextern U8 r_pass_kind_batch_table[3];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // RENDER_META_H\r\n"
  },
  {
    "path": "src/render/opengl/generated/render_opengl.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 r_ogl_shader_kind_name_table[2] =\r\n{\r\nstr8_lit_comp(\"rect\"),\r\nstr8_lit_comp(\"blur\"),\r\n};\r\n\r\nString8 * r_ogl_shader_kind_vshad_src_table[2] =\r\n{\r\n&r_ogl_rect_vshad_src,\r\n&r_ogl_blur_vshad_src,\r\n};\r\n\r\nString8 * r_ogl_shader_kind_pshad_src_table[2] =\r\n{\r\n&r_ogl_rect_pshad_src,\r\n&r_ogl_blur_pshad_src,\r\n};\r\n\r\nR_OGL_AttributeArray r_ogl_shader_kind_input_attributes_table[2] =\r\n{\r\n{ r_ogl_rect_input_attributes, ArrayCount(r_ogl_rect_input_attributes) },\r\n{ 0,  },\r\n};\r\n\r\nR_OGL_AttributeArray r_ogl_shader_kind_output_attributes_table[2] =\r\n{\r\n{ r_ogl_single_color_output_attributes, ArrayCount(r_ogl_single_color_output_attributes) },\r\n{ r_ogl_single_color_output_attributes, ArrayCount(r_ogl_single_color_output_attributes) },\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/render/opengl/generated/render_opengl.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef RENDER_OPENGL_META_H\r\n#define RENDER_OPENGL_META_H\r\n\r\ntypedef enum R_OGL_ShaderKind\r\n{\r\nR_OGL_ShaderKind_Rect,\r\nR_OGL_ShaderKind_Blur,\r\nR_OGL_ShaderKind_COUNT,\r\n} R_OGL_ShaderKind;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 r_ogl_shader_kind_name_table[2];\r\nextern String8 * r_ogl_shader_kind_vshad_src_table[2];\r\nextern String8 * r_ogl_shader_kind_pshad_src_table[2];\r\nextern R_OGL_AttributeArray r_ogl_shader_kind_input_attributes_table[2];\r\nextern R_OGL_AttributeArray r_ogl_shader_kind_output_attributes_table[2];\r\nread_only global String8 r_ogl_rect_vshad_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"#version 330 core\\n\"\r\n\"\\n\"\r\n\"in vec4 c2v_dst_rect;\\n\"\r\n\"in vec4 c2v_src_rect;\\n\"\r\n\"in vec4 c2v_colors_0;\\n\"\r\n\"in vec4 c2v_colors_1;\\n\"\r\n\"in vec4 c2v_colors_2;\\n\"\r\n\"in vec4 c2v_colors_3;\\n\"\r\n\"in vec4 c2v_corner_radii;\\n\"\r\n\"in vec4 c2v_style;  // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\\n\"\r\n\"\\n\"\r\n\"out vec2 v2p_sdf_sample_pos;\\n\"\r\n\"out vec2 v2p_texcoord_pct;\\n\"\r\n\"out vec2 v2p_rect_half_size_px;\\n\"\r\n\"out vec4 v2p_tint;\\n\"\r\n\"out float v2p_corner_radius;\\n\"\r\n\"out float v2p_border_thickness;\\n\"\r\n\"out float v2p_softness;\\n\"\r\n\"out float v2p_omit_texture;\\n\"\r\n\"\\n\"\r\n\"uniform sampler2D u_tex_color;\\n\"\r\n\"uniform vec2 u_viewport_size_px;\\n\"\r\n\"\\n\"\r\n\"void main(void)\\n\"\r\n\"{\\n\"\r\n\"  // rjf: constants\\n\"\r\n\"  vec2 vertices[] = vec2[](vec2(-1, -1), vec2(-1, +1), vec2(+1, -1), vec2(+1, +1));\\n\"\r\n\"  \\n\"\r\n\"  // rjf: unpack shears\\n\"\r\n\"  float shears[] = float[](0, 0, c2v_style.w, c2v_style.w);\\n\"\r\n\"  \\n\"\r\n\"  // rjf: find dst position\\n\"\r\n\"  vec2 dst_half_size = (c2v_dst_rect.zw - c2v_dst_rect.xy) / 2;\\n\"\r\n\"  vec2 dst_center    = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2;\\n\"\r\n\"  vec2 dst_position  = vertices[gl_VertexID] * dst_half_size + dst_center;\\n\"\r\n\"  dst_position.y += shears[gl_VertexID];\\n\"\r\n\"  \\n\"\r\n\"  // rjf: find src position\\n\"\r\n\"  vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2;\\n\"\r\n\"  vec2 src_center    = (c2v_src_rect.zw + c2v_src_rect.xy) / 2;\\n\"\r\n\"  vec2 src_position  = vertices[gl_VertexID] * src_half_size + src_center;\\n\"\r\n\"  \\n\"\r\n\"  // rjf: find color\\n\"\r\n\"  vec4 colors[] = vec4[](c2v_colors_0, c2v_colors_1, c2v_colors_2, c2v_colors_3);\\n\"\r\n\"  vec4 color = colors[gl_VertexID];\\n\"\r\n\"  \\n\"\r\n\"  // rjf: find corner radius\\n\"\r\n\"  float corner_radii[] = float[](c2v_corner_radii.x, c2v_corner_radii.y, c2v_corner_radii.z, c2v_corner_radii.w);\\n\"\r\n\"  float corner_radius = corner_radii[gl_VertexID];\\n\"\r\n\"  \\n\"\r\n\"  // rjf: fill outputs\\n\"\r\n\"  vec2 dst_verts_pct = vec2(((gl_VertexID >> 1) != 1) ? 1.f : 0.f,\\n\"\r\n\"                            ((gl_VertexID & 1) != 0)  ? 0.f : 1.f);\\n\"\r\n\"  ivec2 u_tex_color_size_i = textureSize(u_tex_color, 0);\\n\"\r\n\"  vec2 u_tex_color_size = vec2(float(u_tex_color_size_i.x), float(u_tex_color_size_i.y));\\n\"\r\n\"  {\\n\"\r\n\"    gl_Position = vec4(2 * dst_position.x / u_viewport_size_px.x - 1,\\n\"\r\n\"                       2 * (1 - dst_position.y / u_viewport_size_px.y) - 1,\\n\"\r\n\"                       0.0, 1.0);\\n\"\r\n\"    v2p_sdf_sample_pos    = (2.f * dst_verts_pct - 1.f) * dst_half_size;\\n\"\r\n\"    v2p_texcoord_pct      = src_position / u_tex_color_size;\\n\"\r\n\"    v2p_rect_half_size_px = dst_half_size;\\n\"\r\n\"    v2p_tint              = color;\\n\"\r\n\"    v2p_corner_radius     = corner_radius;\\n\"\r\n\"    v2p_border_thickness  = c2v_style.x;\\n\"\r\n\"    v2p_softness          = c2v_style.y;\\n\"\r\n\"    v2p_omit_texture      = c2v_style.z;\\n\"\r\n\"  }\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_ogl_rect_pshad_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"#version 330 core\\n\"\r\n\"\\n\"\r\n\"in vec2 v2p_sdf_sample_pos;\\n\"\r\n\"in vec2 v2p_texcoord_pct;\\n\"\r\n\"in vec2 v2p_rect_half_size_px;\\n\"\r\n\"in vec4 v2p_tint;\\n\"\r\n\"in float v2p_corner_radius;\\n\"\r\n\"in float v2p_border_thickness;\\n\"\r\n\"in float v2p_softness;\\n\"\r\n\"in float v2p_omit_texture;\\n\"\r\n\"\\n\"\r\n\"out vec4 final_color;\\n\"\r\n\"\\n\"\r\n\"uniform float u_opacity;\\n\"\r\n\"uniform sampler2D u_tex_color;\\n\"\r\n\"uniform mat4 u_texture_sample_channel_map;\\n\"\r\n\"\\n\"\r\n\"float rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\\n\"\r\n\"{\\n\"\r\n\"  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"float linear_from_srgb_f32(float x)\\n\"\r\n\"{\\n\"\r\n\"  return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"vec4 linear_from_srgba(vec4 v)\\n\"\r\n\"{\\n\"\r\n\"  vec4 result = vec4(linear_from_srgb_f32(v.x),\\n\"\r\n\"                     linear_from_srgb_f32(v.y),\\n\"\r\n\"                     linear_from_srgb_f32(v.z),\\n\"\r\n\"                     v.w);\\n\"\r\n\"  return result;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"void main(void)\\n\"\r\n\"{\\n\"\r\n\"  // rjf: sample texture\\n\"\r\n\"  vec4 albedo_sample = vec4(1, 1, 1, 1);\\n\"\r\n\"  if(v2p_omit_texture < 1)\\n\"\r\n\"  {\\n\"\r\n\"    albedo_sample = u_texture_sample_channel_map * texture(u_tex_color, v2p_texcoord_pct);\\n\"\r\n\"    albedo_sample = linear_from_srgba(albedo_sample);\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample for borders\\n\"\r\n\"  float border_sdf_t = 1;\\n\"\r\n\"  if(v2p_border_thickness > 0)\\n\"\r\n\"  {\\n\"\r\n\"    float border_sdf_s = rect_sdf(v2p_sdf_sample_pos,\\n\"\r\n\"                                  v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f) - v2p_border_thickness,\\n\"\r\n\"                                  max(v2p_corner_radius-v2p_border_thickness, 0));\\n\"\r\n\"    border_sdf_t = smoothstep(0, 2*v2p_softness, border_sdf_s);\\n\"\r\n\"  }\\n\"\r\n\"  if(border_sdf_t < 0.001f)\\n\"\r\n\"  {\\n\"\r\n\"    discard;\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample for corners\\n\"\r\n\"  float corner_sdf_t = 1;\\n\"\r\n\"  if(v2p_corner_radius > 0 || v2p_softness > 0.75f)\\n\"\r\n\"  {\\n\"\r\n\"    float corner_sdf_s = rect_sdf(v2p_sdf_sample_pos,\\n\"\r\n\"                                  v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f),\\n\"\r\n\"                                  v2p_corner_radius);\\n\"\r\n\"    corner_sdf_t = 1-smoothstep(0, 2*v2p_softness, corner_sdf_s);\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: form+return final color\\n\"\r\n\"  final_color = albedo_sample;\\n\"\r\n\"  final_color *= v2p_tint;\\n\"\r\n\"  final_color.a *= u_opacity;\\n\"\r\n\"  final_color.a *= corner_sdf_t;\\n\"\r\n\"  final_color.a *= border_sdf_t;\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_ogl_blur_vshad_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"#version 330 core\\n\"\r\n\"\\n\"\r\n\"uniform vec4 rect;\\n\"\r\n\"uniform vec4 corner_radii_px;\\n\"\r\n\"uniform vec2 viewport_size;\\n\"\r\n\"uniform uint blur_count;\\n\"\r\n\"\\n\"\r\n\"out vec2 texcoord;\\n\"\r\n\"out vec2 sdf_sample_pos;\\n\"\r\n\"out vec2 rect_half_size;\\n\"\r\n\"out float corner_radius;\\n\"\r\n\"\\n\"\r\n\"void main(void)\\n\"\r\n\"{\\n\"\r\n\"  vec2 vertex_positions_scrn[] = vec2[](rect.xw,\\n\"\r\n\"                                        rect.xy,\\n\"\r\n\"                                        rect.zw,\\n\"\r\n\"                                        rect.zy);\\n\"\r\n\"  float corner_radii_px[] = float[](corner_radii_px.y,\\n\"\r\n\"                                    corner_radii_px.x,\\n\"\r\n\"                                    corner_radii_px.w,\\n\"\r\n\"                                    corner_radii_px.z);\\n\"\r\n\"  vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f,\\n\"\r\n\"                               (gl_VertexID & 1) != 0  ? 0.f : 1.f);\\n\"\r\n\"  \\n\"\r\n\"  vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size;\\n\"\r\n\"  vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f;\\n\"\r\n\"  \\n\"\r\n\"  vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\\n\"\r\n\"  \\n\"\r\n\"  gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\\n\"\r\n\"  texcoord = vertex_position_pct;\\n\"\r\n\"  sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size;\\n\"\r\n\"  rect_half_size = rect_half_size - 2.f;\\n\"\r\n\"  corner_radius = corner_radii_px[gl_VertexID];\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\nread_only global String8 r_ogl_blur_pshad_src =\r\nstr8_lit_comp(\r\n\"\"\r\n\"\\n\"\r\n\"#version 330 core\\n\"\r\n\"\\n\"\r\n\"uniform sampler2D tex;\\n\"\r\n\"uniform vec4 kernel[32];\\n\"\r\n\"uniform int blur_count;\\n\"\r\n\"uniform vec2 direction;\\n\"\r\n\"\\n\"\r\n\"in vec2 texcoord;\\n\"\r\n\"in vec2 sdf_sample_pos;\\n\"\r\n\"in vec2 rect_half_size;\\n\"\r\n\"in float corner_radius;\\n\"\r\n\"\\n\"\r\n\"out vec4 final_color;\\n\"\r\n\"\\n\"\r\n\"float rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\\n\"\r\n\"{\\n\"\r\n\"  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\\n\"\r\n\"}\\n\"\r\n\"\\n\"\r\n\"void main(void)\\n\"\r\n\"{\\n\"\r\n\"  // rjf: blend weighted texture samples into color\\n\"\r\n\"  vec3 color = kernel[0].x * texture(tex, texcoord).rgb;\\n\"\r\n\"  \\n\"\r\n\"  for(int i = 1; i < blur_count; i += 1)\\n\"\r\n\"  {\\n\"\r\n\"    float weight = kernel[i].x;\\n\"\r\n\"    float offset = kernel[i].y;\\n\"\r\n\"    color += weight * texture(tex, texcoord - offset * direction).rgb;\\n\"\r\n\"    color += weight * texture(tex, texcoord + offset * direction).rgb;\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  // rjf: sample for corners\\n\"\r\n\"  float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size, corner_radius);\\n\"\r\n\"  float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\\n\"\r\n\"  \\n\"\r\n\"  // rjf: weight output color by sdf\\n\"\r\n\"  // this is doing alpha testing, leave blurring only where mostly opaque pixels are\\n\"\r\n\"  if(corner_sdf_t < 0.9f)\\n\"\r\n\"  {\\n\"\r\n\"    discard;\\n\"\r\n\"  }\\n\"\r\n\"  \\n\"\r\n\"  final_color = vec4(color, 1.f);\\n\"\r\n\"}\\n\"\r\n\"\"\r\n);\r\n\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // RENDER_OPENGL_META_H\r\n"
  },
  {
    "path": "src/render/opengl/linux/egl/render_opengl_linux_egl.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal VoidProc *\nr_ogl_os_load_procedure(char *name)\n{\n  VoidProc *result = (VoidProc *)eglGetProcAddress(name);\n  return result;\n}\n\ninternal void\nr_ogl_os_init(CmdLine *cmdln)\n{\n  //- rjf: set up state\n  {\n    Arena *arena = arena_alloc();\n    r_ogl_lnx_state = push_array(arena, R_OGL_LNX_State, 1);\n    r_ogl_lnx_state->arena = arena;\n  }\n  \n  //- rjf: get EGL display\n  {\n    r_ogl_lnx_state->display = eglGetDisplay((EGLNativeDisplayType)os_lnx_gfx_state->display);\n    if(r_ogl_lnx_state->display == EGL_NO_DISPLAY)\n    {\n      os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Failed to get EGL display.\"));\n      os_abort(1);\n    }\n  }\n  \n  //- rjf: initialize GL version\n  EGLint egl_version_major = 0;\n  EGLint egl_version_minor = 0;\n  if(!eglInitialize(r_ogl_lnx_state->display, &egl_version_major, &egl_version_minor))\n  {\n    os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Couldn't initialize EGL display.\"));\n    os_abort(1);\n  }\n  if(egl_version_major < 1 || (egl_version_major == 1 && egl_version_minor < 5))\n  {\n    Temp scratch = scratch_begin(0, 0);\n    String8 message = push_str8f(scratch.arena, \"Unsupported EGL version (%i.%i, need at least 1.5)\", egl_version_major, egl_version_minor);\n    os_graphical_message(1, str8_lit(\"Fatal Error\"), message);\n    os_abort(1);\n    scratch_end(scratch);\n  }\n  \n  //- rjf: pick GL API\n  if(!eglBindAPI(EGL_OPENGL_API))\n  {\n    os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Couldn't initialize EGL API to OpenGL.\"));\n    os_abort(1);\n  }\n  \n  //- rjf: construct context\n  {\n    B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit(\"opengl_debug\"));\n#if BUILD_DEBUG\n    debug_mode = 1;\n#endif\n    EGLint options[] =\n    {\n      EGL_CONTEXT_MAJOR_VERSION, 3,\n      EGL_CONTEXT_MINOR_VERSION, 3,\n      EGL_CONTEXT_OPENGL_PROFILE_MASK, EGL_CONTEXT_OPENGL_CORE_PROFILE_BIT,\n      debug_mode ? EGL_CONTEXT_OPENGL_DEBUG : EGL_NONE, EGL_TRUE,\n      EGL_NONE,\n    };\n    r_ogl_lnx_state->context = eglCreateContext(r_ogl_lnx_state->display, 0, EGL_NO_CONTEXT, options);\n    if(r_ogl_lnx_state->context == EGL_NO_CONTEXT)\n    {\n      os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Couldn't create OpenGL context with EGL.\"));\n      os_abort(1);\n    }\n  }\n  \n  eglMakeCurrent(r_ogl_lnx_state->display, 0, 0, r_ogl_lnx_state->context);\n  glDrawBuffer(GL_BACK);\n}\n\ninternal R_Handle\nr_ogl_os_window_equip(OS_Handle window)\n{\n  OS_LNX_Window *window_os = (OS_LNX_Window *)window.u64[0];\n  R_OGL_LNX_Window *w = r_ogl_lnx_state->free_window;\n  if(w != 0)\n  {\n    SLLStackPop(r_ogl_lnx_state->free_window);\n  }\n  else\n  {\n    w = push_array(r_ogl_lnx_state->arena, R_OGL_LNX_Window, 1);\n  }\n  {\n    EGLint surface_options[] =\n    {\n      EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_SRGB,\n      EGL_NONE,\n    };\n    if(r_ogl_lnx_state->config == 0)\n    {\n      //- rjf: get all EGL configs\n      EGLConfig configs[256] = {0};\n      EGLint configs_count = 0;\n      {\n        EGLint options[] =\n        {\n          EGL_SURFACE_TYPE,      EGL_WINDOW_BIT,\n          EGL_CONFORMANT,        EGL_OPENGL_BIT,\n          EGL_RENDERABLE_TYPE,   EGL_OPENGL_BIT,\n          EGL_COLOR_BUFFER_TYPE, EGL_RGB_BUFFER,\n          \n          EGL_RED_SIZE,      8,\n          EGL_GREEN_SIZE,    8,\n          EGL_BLUE_SIZE,     8,\n          EGL_DEPTH_SIZE,   24,\n          EGL_STENCIL_SIZE,  8,\n          \n          EGL_NONE,\n        };\n        if(!eglChooseConfig(r_ogl_lnx_state->display, options, configs, ArrayCount(configs), &configs_count) || configs_count == 0)\n        {\n          os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Couldn't choose EGL configuration.\"));\n          os_abort(1);\n        }\n      }\n      \n      //- rjf: actually choose the egl config\n      {\n        EGLint config_options[] =\n        {\n          EGL_GL_COLORSPACE, EGL_GL_COLORSPACE_SRGB,\n          EGL_NONE,\n        };\n        for(U32 idx = 0; idx < configs_count; idx += 1)\n        {\n          w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, configs[idx], window_os->window, config_options);\n          if(w->surface != EGL_NO_SURFACE)\n          {\n            r_ogl_lnx_state->config = configs[idx];\n            break;\n          }\n        }\n        if(r_ogl_lnx_state->config == 0)\n        {\n          os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Couldn't find a suitable EGL configuration.\"));\n          os_abort(1);\n        }\n      }\n    }\n    else\n    {\n      w->surface = eglCreateWindowSurface(r_ogl_lnx_state->display, r_ogl_lnx_state->config, window_os->window, surface_options);\n    }\n    if(w->surface == EGL_NO_SURFACE)\n    {\n      os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Couldn't create EGL surface.\"));\n      os_abort(1);\n    }\n  }\n  R_Handle result = {(U64)w};\n  return result;\n}\n\ninternal void\nr_ogl_os_window_unequip(OS_Handle os, R_Handle r)\n{\n  R_OGL_LNX_Window *w = (R_OGL_LNX_Window *)r.u64[0];\n  {\n    \n  }\n  SLLStackPush(r_ogl_lnx_state->free_window, w);\n}\n\ninternal void\nr_ogl_os_select_window(OS_Handle os, R_Handle r)\n{\n  OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];\n  R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0];\n  eglMakeCurrent(r_ogl_lnx_state->display, w_r->surface, w_r->surface, r_ogl_lnx_state->context);\n}\n\ninternal void\nr_ogl_os_window_swap(OS_Handle os, R_Handle r)\n{\n  OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];\n  R_OGL_LNX_Window *w_r = (R_OGL_LNX_Window *)r.u64[0];\n  eglSwapBuffers(r_ogl_lnx_state->display, w_r->surface);\n}\n"
  },
  {
    "path": "src/render/opengl/linux/egl/render_opengl_linux_egl.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RENDER_OPENGL_LINUX_EGL_H\n#define RENDER_OPENGL_LINUX_EGL_H\n\n#define glTexImage3D glTexImage3D__static\n#define glTexSubImage3D glTexSubImage3D__static\n#define glActiveTexture glActiveTexture__static\n#include <GL/gl.h>\n#include <EGL/egl.h>\n#undef glTexImage3D\n#undef glTexSubImage3D\n#undef glActiveTexture\n\ntypedef struct R_OGL_LNX_Window R_OGL_LNX_Window;\nstruct R_OGL_LNX_Window\n{\n  R_OGL_LNX_Window *next;\n  EGLSurface *surface;\n};\n\ntypedef struct R_OGL_LNX_State R_OGL_LNX_State;\nstruct R_OGL_LNX_State\n{\n  Arena *arena;\n  EGLDisplay *display;\n  EGLConfig config;\n  EGLContext *context;\n  R_OGL_LNX_Window *free_window;\n};\n\nglobal R_OGL_LNX_State *r_ogl_lnx_state = 0;\n\n#endif // RENDER_OPENGL_LINUX_EGL_H\n"
  },
  {
    "path": "src/render/opengl/linux/glx/render_opengl_linux_glx.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal VoidProc *\nr_ogl_os_load_procedure(char *name)\n{\n  VoidProc *result = (VoidProc *)glXGetProcAddressARB((U8 *)name);\n  return result;\n}\n\ninternal void\nr_ogl_os_init(CmdLine *cmdln)\n{\n  //- rjf: require GLX 1.3+\n  int glx_version_major = 0;\n  int glx_version_minor = 0;\n  if(!glXQueryVersion(os_lnx_gfx_state->display, &glx_version_major, &glx_version_minor) ||\n     (glx_version_major == 1 && glx_version_minor < 3) ||\n     glx_version_major < 1)\n  {\n    Temp scratch = scratch_begin(0, 0);\n    String8 message = push_str8f(scratch.arena, \"Unsupported GLX version (%i.%i, need at least 1.3)\", glx_version_major, glx_version_minor);\n    os_graphical_message(1, str8_lit(\"Fatal Error\"), message);\n    os_abort(1);\n    scratch_end(scratch);\n  }\n  \n  //- rjf: get frame buffer configs\n  local_persist int framebuffer_config_options[] =\n  {\n    GLX_X_RENDERABLE,   1,\n    GLX_DRAWABLE_TYPE,  GLX_WINDOW_BIT,\n    GLX_RENDER_TYPE,    GLX_RGBA_BIT,\n    GLX_X_VISUAL_TYPE,  GLX_TRUE_COLOR,\n    GLX_RED_SIZE,       8,\n    GLX_GREEN_SIZE,     8,\n    GLX_BLUE_SIZE,      8,\n    GLX_ALPHA_SIZE,     8,\n    GLX_DEPTH_SIZE,     24,\n    GLX_STENCIL_SIZE,   8,\n    GLX_DOUBLEBUFFER,   1,\n    None\n  };\n  int framebuffer_configs_count = 0;\n  GLXFBConfig *framebuffer_configs = glXChooseFBConfig(os_lnx_gfx_state->display, DefaultScreen(os_lnx_gfx_state->display), framebuffer_config_options, &framebuffer_configs_count);\n  if(framebuffer_configs == 0)\n  {\n    os_graphical_message(1, str8_lit(\"Fatal Error\"), str8_lit(\"Could not find a suitable framebuffer configuration.\"));\n    os_abort(1);\n  }\n  GLXFBConfig framebuffer_config = framebuffer_configs[0];\n  XFree(framebuffer_configs);\n  \n  //- rjf: construct set-window-attributes\n  XSetWindowAttributes set_window_attributes = {0};\n  set_window_attributes.background_pixmap = None;\n  set_window_attributes.border_pixel      = 0;\n  set_window_attributes.event_mask        = StructureNotifyMask;\n  \n  //- rjf: construct context\n  {\n    B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit(\"opengl_debug\"));\n#if BUILD_DEBUG\n    debug_mode = 1;\n#endif\n    glXCreateContextAttribsARBProc glXCreateContextAttribsARB = 0;\n    glXCreateContextAttribsARB = (glXCreateContextAttribsARBProc)glXGetProcAddressARB((U8 *)\"glXCreateContextAttribsARB\");\n    int context_options[] =\n    {\n      GLX_CONTEXT_MAJOR_VERSION_ARB, 3,\n      GLX_CONTEXT_MINOR_VERSION_ARB, 3,\n      GLX_CONTEXT_FLAGS_ARB,         !!debug_mode*GLX_CONTEXT_DEBUG_BIT_ARB,\n      None\n    };\n    r_ogl_lnx_ctx = glXCreateContextAttribsARB(os_lnx_gfx_state->display, framebuffer_config, 0, 1, context_options);\n  }\n  \n  glXMakeCurrent(os_lnx_gfx_state->display, 0, r_ogl_lnx_ctx);\n}\n\ninternal R_Handle\nr_ogl_os_window_equip(OS_Handle window)\n{\n  R_Handle result = {0};\n  return result;\n}\n\ninternal void\nr_ogl_os_window_unequip(OS_Handle os, R_Handle r)\n{\n  \n}\n\ninternal void\nr_ogl_os_select_window(OS_Handle os, R_Handle r)\n{\n  OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];\n  glXMakeCurrent(os_lnx_gfx_state->display, w->window, r_ogl_lnx_ctx);\n}\n\ninternal void\nr_ogl_os_window_swap(OS_Handle os, R_Handle r)\n{\n  OS_LNX_Window *w = (OS_LNX_Window *)os.u64[0];\n  glXSwapBuffers(os_lnx_gfx_state->display, w->window);\n}\n"
  },
  {
    "path": "src/render/opengl/linux/glx/render_opengl_linux_glx.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RENDER_OPENGL_LINUX_GLX_H\n#define RENDER_OPENGL_LINUX_GLX_H\n\n#define glTexImage3D glTexImage3D__static\n#define glTexSubImage3D glTexSubImage3D__static\n#define glActiveTexture glActiveTexture__static\n#include <GL/gl.h>\n#include <GL/glx.h>\n#undef glTexImage3D\n#undef glTexSubImage3D\n#undef glActiveTexture\n\n#define GLX_CONTEXT_MAJOR_VERSION_ARB          0x2091\n#define GLX_CONTEXT_MINOR_VERSION_ARB          0x2092\n#define GLX_CONTEXT_FLAGS_ARB                  0x2094\n#define GLX_CONTEXT_DEBUG_BIT_ARB              0x00000001\n#define GLX_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x00000002\ntypedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);\n\nglobal GLXContext r_ogl_lnx_ctx = 0;\n\n#endif // RENDER_OPENGL_LINUX_GLX_H\n"
  },
  {
    "path": "src/render/opengl/linux/render_opengl_linux.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: Backend Includes\n\n#if R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_GLX\n# include \"glx/render_opengl_linux_glx.c\"\n#elif R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_EGL\n# include \"egl/render_opengl_linux_egl.c\"\n#else\n# error Linux OpenGL backend not specified.\n#endif\n"
  },
  {
    "path": "src/render/opengl/linux/render_opengl_linux.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RENDER_OPENGL_LINUX_H\n#define RENDER_OPENGL_LINUX_H\n\n////////////////////////////////\n//~ rjf: Backend Constants\n\n#define R_OPENGL_LINUX_BACKEND_GLX 0\n#define R_OPENGL_LINUX_BACKEND_EGL 1\n\n////////////////////////////////\n//~ rjf: Decide On Backend\n\n#if !defined(R_OPENGL_LINUX_BACKEND)\n# define R_OPENGL_LINUX_BACKEND R_OPENGL_LINUX_BACKEND_EGL\n#endif\n\n////////////////////////////////\n//~ rjf: Backend Includes\n\n#if R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_GLX\n# include \"glx/render_opengl_linux_glx.h\"\n#elif R_OPENGL_LINUX_BACKEND == R_OPENGL_LINUX_BACKEND_EGL\n# include \"egl/render_opengl_linux_egl.h\"\n#else\n# error Linux OpenGL backend not specified.\n#endif\n\n#endif // RENDER_OPENGL_LINUX_H\n"
  },
  {
    "path": "src/render/opengl/render_opengl.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: OS Portion Includes\n\n#if OS_WINDOWS\n# include \"render/opengl/win32/render_opengl_win32.c\"\n#elif OS_LINUX\n# include \"render/opengl/linux/render_opengl_linux.c\"\n#else\n# error OS portion of OpenGL rendering backend not defined.\n#endif\n\n////////////////////////////////\n//~ rjf: Attribute Tables\n\nglobal read_only R_OGL_Attribute r_ogl_rect_input_attributes[] =\n{\n  {0, str8_lit_comp(\"c2v_dst_rect\"),        GL_FLOAT,  4},\n  {1, str8_lit_comp(\"c2v_src_rect\"),        GL_FLOAT,  4},\n  {2, str8_lit_comp(\"c2v_colors_0\"),        GL_FLOAT,  4},\n  {3, str8_lit_comp(\"c2v_colors_1\"),        GL_FLOAT,  4},\n  {4, str8_lit_comp(\"c2v_colors_2\"),        GL_FLOAT,  4},\n  {5, str8_lit_comp(\"c2v_colors_3\"),        GL_FLOAT,  4},\n  {6, str8_lit_comp(\"c2v_corner_radii\"),    GL_FLOAT,  4},\n  {7, str8_lit_comp(\"c2v_style\"),           GL_FLOAT,  4},\n};\n\nglobal read_only R_OGL_Attribute r_ogl_single_color_output_attributes[] =\n{\n  {0, str8_lit_comp(\"final_color\")},\n};\n\n////////////////////////////////\n//~ rjf: Generated Code\n\n#include \"render/opengl/generated/render_opengl.meta.c\"\n\n////////////////////////////////\n//~ rjf: Helpers\n\ninternal R_Handle\nr_ogl_handle_from_tex2d(R_OGL_Tex2D *t)\n{\n  R_Handle h = {(U64)t};\n  return h;\n}\n\ninternal R_OGL_Tex2D *\nr_ogl_tex2d_from_handle(R_Handle h)\n{\n  R_OGL_Tex2D *t = (R_OGL_Tex2D *)h.u64[0];\n  return t;\n}\n\ninternal R_OGL_FormatInfo\nr_ogl_format_info_from_tex2dformat(R_Tex2DFormat fmt)\n{\n  R_OGL_FormatInfo result;\n  result.internal_format = GL_RGBA;\n  result.format = GL_RGBA;\n  result.base_type = GL_UNSIGNED_BYTE;\n  // TODO(rjf)\n  return result;\n}\n\ninternal GLuint\nr_ogl_instance_buffer_from_size(U64 size)\n{\n  GLuint buffer = r_ogl_state->scratch_buffer_64kb;\n  if(size > KB(64))\n  {\n    // rjf: build buffer\n    U64 flushed_buffer_size = size;\n    flushed_buffer_size += MB(1)-1;\n    flushed_buffer_size -= flushed_buffer_size%MB(1);\n    glGenBuffers(1, &buffer);\n    glBindBuffer(GL_ARRAY_BUFFER, buffer);\n    glBufferData(GL_ARRAY_BUFFER, flushed_buffer_size, 0, GL_DYNAMIC_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    \n    // rjf: push buffer to flush list\n    R_OGL_FlushBuffer *n = push_array(r_ogl_state->buffer_flush_arena, R_OGL_FlushBuffer, 1);\n    n->id = buffer;\n    SLLQueuePush(r_ogl_state->first_buffer_to_flush, r_ogl_state->last_buffer_to_flush, n);\n  }\n  return buffer;\n}\n\ninternal void\nr_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam)\n{\n  raddbg_log(\"[OpenGL] %.*s\\n\", (int)length, message);\n  fprintf(stderr, \"[OpenGL] %.*s\\n\", (int)length, message);\n}\n\n////////////////////////////////\n//~ rjf: Backend Hooks\n\n//- rjf: top-level layer initialization\n\nr_hook void\nr_init(CmdLine *cmdln)\n{\n  //- rjf: do os-specific portion of work\n  r_ogl_os_init(cmdln);\n  \n  //- rjf: top-level initialization\n  Arena *arena = arena_alloc();\n  r_ogl_state = push_array(arena, R_OGL_State, 1);\n  r_ogl_state->arena = arena;\n  \n  //- rjf: load gl procedures\n#define X(name, r, p) name = (name##_FunctionType *)r_ogl_os_load_procedure(#name);\n  R_OGL_ProcedureXList\n#undef X\n  \n  //- rjf: build all shaders\n  for EachEnumVal(R_OGL_ShaderKind, k)\n  {\n    // rjf: compile\n    struct {GLenum type; String8 *src; GLuint out; String8 errors;} stages[] =\n    {\n      {GL_VERTEX_SHADER,   r_ogl_shader_kind_vshad_src_table[k]},\n      {GL_FRAGMENT_SHADER, r_ogl_shader_kind_pshad_src_table[k]},\n    };\n    for EachElement(idx, stages)\n    {\n      stages[idx].out = glCreateShader(stages[idx].type);\n      GLint src_size = stages[idx].src->size;\n      glShaderSource(stages[idx].out, 1, (char **)&stages[idx].src->str, &src_size);\n      glCompileShader(stages[idx].out);\n      GLint info_log_length = 0;\n      GLint status = 0;\n      glGetShaderiv(stages[idx].out, GL_COMPILE_STATUS, &status);\n      glGetShaderiv(stages[idx].out, GL_INFO_LOG_LENGTH, &info_log_length);\n      if(info_log_length != 0)\n      {\n        stages[idx].errors.str = push_array(r_ogl_state->arena, U8, info_log_length+1);\n        stages[idx].errors.size = info_log_length;\n        glGetShaderInfoLog(stages[idx].out, info_log_length, 0, (char *)stages[idx].errors.str);\n      }\n      raddbg_pin(text(stages[idx].errors.str));\n    }\n    \n    // rjf: attach compilations to program\n    GLuint program = glCreateProgram();\n    for EachElement(idx, stages)\n    {\n      glAttachShader(program, stages[idx].out);\n    }\n    \n    // rjf: bind inputs\n    R_OGL_AttributeArray inputs = r_ogl_shader_kind_input_attributes_table[k];\n    for EachIndex(idx, inputs.count)\n    {\n      glBindAttribLocation(program, inputs.v[idx].index, (char *)inputs.v[idx].name.str);\n    }\n    \n    // rjf: bind outputs\n    R_OGL_AttributeArray outputs = r_ogl_shader_kind_output_attributes_table[k];\n    for EachIndex(idx, outputs.count)\n    {\n      glBindFragDataLocation(program, outputs.v[idx].index, (char *)outputs.v[idx].name.str);\n    }\n    \n    // rjf: link / validate / store\n    glLinkProgram(program);\n    glValidateProgram(program);\n    r_ogl_state->shaders[k] = program;\n  }\n  \n  //- rjf: set up built-in resources\n  glGenVertexArrays(1, &r_ogl_state->all_purpose_vao);\n  glGenBuffers(1, &r_ogl_state->scratch_buffer_64kb);\n  glBindBuffer(GL_ARRAY_BUFFER, r_ogl_state->scratch_buffer_64kb);\n  glBufferData(GL_ARRAY_BUFFER, KB(64), 0, GL_DYNAMIC_DRAW);\n  glBindBuffer(GL_ARRAY_BUFFER, 0);\n  glGenTextures(1, &r_ogl_state->white_texture);\n  glBindTexture(GL_TEXTURE_2D, r_ogl_state->white_texture);\n  U32 white_pixel = 0xffffffff;\n  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, &white_pixel);\n  glEnable(GL_FRAMEBUFFER_SRGB);\n  \n  //- rjf: set up buffer flush state\n  r_ogl_state->buffer_flush_arena = arena_alloc();\n  \n  //- rjf: set up debug callback\n  B32 debug_mode = cmd_line_has_flag(cmdln, str8_lit(\"opengl_debug\"));\n#if BUILD_DEBUG\n  debug_mode = 1;\n#endif\n  if(debug_mode)\n  {\n    glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS);\n    glDebugMessageCallback(r_ogl_debug_message_callback, 0);\n  }\n}\n\n//- rjf: window setup/teardown\n\nr_hook R_Handle\nr_window_equip(OS_Handle window)\n{\n  R_Handle result = r_ogl_os_window_equip(window);\n  return result;\n}\n\nr_hook void\nr_window_unequip(OS_Handle window, R_Handle window_equip)\n{\n  r_ogl_os_window_unequip(window, window_equip);\n}\n\n//- rjf: textures\n\nr_hook R_Handle\nr_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data)\n{\n  //- rjf: allocate texture record\n  R_OGL_Tex2D *tex2d = r_ogl_state->free_tex2d;\n  if(tex2d)\n  {\n    SLLStackPop(r_ogl_state->free_tex2d);\n  }\n  else\n  {\n    tex2d = push_array(r_ogl_state->arena, R_OGL_Tex2D, 1);\n  }\n  \n  //- rjf: map kind/format -> gl counterparts\n  R_OGL_FormatInfo gl_fmt_info = r_ogl_format_info_from_tex2dformat(format);\n  \n  //- rjf: allocate GL texture\n  {\n    glGenTextures(1, &tex2d->id);\n    glBindTexture(GL_TEXTURE_2D, tex2d->id);\n    glTexImage2D(GL_TEXTURE_2D, 0, gl_fmt_info.internal_format, size.x, size.y, 0, gl_fmt_info.format, gl_fmt_info.base_type, data);\n    glBindTexture(GL_TEXTURE_2D, 0);\n  }\n  \n  //- rjf: fill\n  tex2d->resource_kind = kind;\n  tex2d->fmt = format;\n  tex2d->size = size;\n  \n  //- rjf: bundle & return\n  R_Handle result = r_ogl_handle_from_tex2d(tex2d);\n  return result;\n}\n\nr_hook void\nr_tex2d_release(R_Handle texture)\n{\n  R_OGL_Tex2D *t = r_ogl_tex2d_from_handle(texture);\n  if(t != 0)\n  {\n    glDeleteTextures(1, &t->id);\n    SLLStackPush(r_ogl_state->free_tex2d, t);\n  }\n}\n\nr_hook R_ResourceKind\nr_kind_from_tex2d(R_Handle texture)\n{\n  R_ResourceKind result = R_ResourceKind_Static;\n  R_OGL_Tex2D *t = r_ogl_tex2d_from_handle(texture);\n  if(t)\n  {\n    result = t->resource_kind;\n  }\n  return result;\n}\n\nr_hook Vec2S32\nr_size_from_tex2d(R_Handle texture)\n{\n  Vec2S32 result = {0, 0};\n  R_OGL_Tex2D *t = r_ogl_tex2d_from_handle(texture);\n  if(t)\n  {\n    result = t->size;\n  }\n  return result;\n}\n\nr_hook R_Tex2DFormat\nr_format_from_tex2d(R_Handle texture)\n{\n  R_Tex2DFormat result = R_Tex2DFormat_RGBA8;\n  R_OGL_Tex2D *t = r_ogl_tex2d_from_handle(texture);\n  if(t)\n  {\n    result = t->fmt;\n  }\n  return result;\n}\n\nr_hook void\nr_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data)\n{\n  R_OGL_Tex2D *t = r_ogl_tex2d_from_handle(texture);\n  if(t)\n  {\n    R_OGL_FormatInfo fmt_info = r_ogl_format_info_from_tex2dformat(t->fmt);\n    glBindTexture(GL_TEXTURE_2D, t->id);\n    Vec2S32 rect_size = dim_2s32(subrect);\n    glTexSubImage2D(GL_TEXTURE_2D, 0, subrect.x0, subrect.y0, rect_size.x, rect_size.y, fmt_info.format, fmt_info.base_type, data);\n    glBindTexture(GL_TEXTURE_2D, 0);\n  }\n}\n\n//- rjf: buffers\n\nr_hook R_Handle\nr_buffer_alloc(R_ResourceKind kind, U64 size, void *data)\n{\n  R_Handle result = {0};\n  return result;\n}\n\nr_hook void\nr_buffer_release(R_Handle buffer)\n{\n  // TODO(rjf)\n}\n\n//- rjf: frame markers\n\nr_hook void\nr_begin_frame(void)\n{\n  // TODO(rjf)\n}\n\nr_hook void\nr_end_frame(void)\n{\n  // TODO(rjf)\n}\n\nr_hook void\nr_window_begin_frame(OS_Handle os, R_Handle r)\n{\n  r_ogl_os_select_window(os, r);\n  \n  //- rjf: unpack window viewport info\n  Rng2F32 client_rect = os_client_rect_from_window(os);\n  Vec2F32 client_rect_dim = dim_2f32(client_rect);\n  \n  //- rjf: clear and reset state\n  glClearColor(0, 0, 0, 0);\n  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n  glViewport(0, 0, (S32)client_rect_dim.x, (S32)client_rect_dim.y);\n  glEnable(GL_BLEND);\n  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);\n}\n\nr_hook void\nr_window_end_frame(OS_Handle os, R_Handle r)\n{\n  for(R_OGL_FlushBuffer *flush_buffer = r_ogl_state->first_buffer_to_flush; flush_buffer != 0; flush_buffer = flush_buffer->next)\n  {\n    glDeleteBuffers(1, &flush_buffer->id);\n  }\n  arena_clear(r_ogl_state->buffer_flush_arena);\n  r_ogl_state->first_buffer_to_flush = r_ogl_state->last_buffer_to_flush = 0;\n  r_ogl_os_window_swap(os, r);\n}\n\n//- rjf: render pass submission\n\nr_hook void\nr_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)\n{\n  Rng2F32 viewport_rect = os_client_rect_from_window(window);\n  Vec2F32 viewport_dim = dim_2f32(viewport_rect);\n  for(R_PassNode *pass_n = passes->first; pass_n != 0; pass_n = pass_n->next)\n  {\n    R_Pass *pass = &pass_n->v;\n    switch(pass->kind)\n    {\n      default:{}break;\n      \n      ////////////////////////\n      //- rjf: ui rendering pass\n      //\n      case R_PassKind_UI:\n      {\n        //- rjf: unpack params\n        R_PassParams_UI *params = pass->params_ui;\n        R_BatchGroup2DList *rect_batch_groups = &params->rects;\n        \n        //- rjf: draw each batch group\n        GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Rect];\n        glBindVertexArrayScope(r_ogl_state->all_purpose_vao) glUseProgramScope(shader)\n        {\n          for(R_BatchGroup2DNode *group_n = rect_batch_groups->first; group_n != 0; group_n = group_n->next)\n          {\n            R_BatchList *batches = &group_n->batches;\n            R_BatchGroup2DParams *group_params = &group_n->params;\n            \n            //- rjf: unpack texture\n            R_Tex2DFormat texture_fmt = R_Tex2DFormat_RGBA8;\n            GLuint texture_id = r_ogl_state->white_texture;\n            {\n              R_OGL_Tex2D *tex = r_ogl_tex2d_from_handle(group_params->tex);\n              if(tex != 0)\n              {\n                texture_id = tex->id;\n                texture_fmt = tex->fmt;\n              }\n            }\n            \n            //- rjf: get & fill buffer\n            GLuint buffer = r_ogl_instance_buffer_from_size(batches->byte_count);\n            {\n              glBindBuffer(GL_ARRAY_BUFFER, buffer);\n              U64 off = 0;\n              for(R_BatchNode *batch_n = batches->first; batch_n != 0; batch_n = batch_n->next)\n              {\n                glBufferSubData(GL_ARRAY_BUFFER, off, batch_n->v.byte_count, batch_n->v.v);\n                off += batch_n->v.byte_count;\n              }\n            }\n            \n            //- rjf: bind input attributes\n            {\n              R_OGL_AttributeArray inputs = r_ogl_shader_kind_input_attributes_table[R_OGL_ShaderKind_Rect];\n              U64 off = 0;\n              for EachIndex(idx, inputs.count)\n              {\n                glEnableVertexAttribArray(inputs.v[idx].index);\n                glVertexAttribDivisor(inputs.v[idx].index, 1);\n                glVertexAttribPointer(inputs.v[idx].index, inputs.v[idx].count, inputs.v[idx].type, GL_FALSE, sizeof(R_Rect2DInst), (void *)(off));\n                // TODO(rjf): this is not correct if type != GL_FLOAT\n                off += inputs.v[idx].count*sizeof(F32);\n              }\n            }\n            \n            //- rjf: bind texture\n            {\n              glActiveTexture(GL_TEXTURE0);\n              glBindTexture(GL_TEXTURE_2D, texture_id);\n              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);\n              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);\n              switch(group_params->tex_sample_kind)\n              {\n                default:\n                case R_Tex2DSampleKind_Nearest:\n                {\n                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);\n                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);\n                }break;\n                case R_Tex2DSampleKind_Linear:\n                {\n                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);\n                  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);\n                }break;\n              }\n              glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);\n              glUniform1i(glGetUniformLocation(shader, \"u_tex_color\"), 0);\n            }\n            \n            //- rjf: upload misc. uniforms\n            {\n              Mat4x4F32 texture_sample_channel_map = r_sample_channel_map_from_tex2dformat(texture_fmt);\n              glUniformMatrix4fv(glGetUniformLocation(shader, \"u_texture_sample_channel_map\"), 1, 0, &texture_sample_channel_map.v[0][0]);\n              glUniform2f(glGetUniformLocation(shader, \"u_viewport_size_px\"), viewport_dim.x, viewport_dim.y);\n              glUniform1f(glGetUniformLocation(shader, \"u_opacity\"), 1.f - group_params->transparency);\n            }\n            \n            //- rjf: set up scissor\n            if(group_params->clip.x0 != 0 ||\n               group_params->clip.x1 != 0 ||\n               group_params->clip.y0 != 0 ||\n               group_params->clip.y1 != 0)\n            {\n              Rng2F32 clip = group_params->clip;\n              glScissor(clip.x0, viewport_dim.y - clip.y1, (clip.x1-clip.x0) + 1, (clip.y1-clip.y0)+1);\n              glEnable(GL_SCISSOR_TEST);\n            }\n            \n            //- rjf: draw\n            {\n              glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, batches->byte_count / batches->bytes_per_inst);\n            }\n            \n            //- rjf: unset scissor\n            glDisable(GL_SCISSOR_TEST);\n          }\n        }\n      }break;\n      \n      ////////////////////////\n      //- rjf: blur rendering pass\n      //\n      case R_PassKind_Blur:\n      {\n        R_PassParams_Blur *params = pass->params_blur;\n        GLuint shader = r_ogl_state->shaders[R_OGL_ShaderKind_Blur];\n        // TODO(rjf): glBindVertexArrayScope(r_ogl_state->all_purpose_vao) glUseProgramScope(shader)\n        {\n          // TODO(rjf)\n        }\n      }break;\n      \n      \n      ////////////////////////\n      //- rjf: 3d geometry rendering pass\n      //\n      case R_PassKind_Geo3D:\n      {\n        //- rjf: unpack params\n        R_PassParams_Geo3D *params = pass->params_geo3d;\n        R_BatchGroup3DMap *mesh_group_map = &params->mesh_batches;\n        // TODO(rjf)\n      }break;\n    }\n  }\n}\n"
  },
  {
    "path": "src/render/opengl/render_opengl.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RENDER_OPENGL_H\n#define RENDER_OPENGL_H\n\n////////////////////////////////\n//~ rjf: Defines\n\ntypedef char GLchar;\ntypedef ptrdiff_t GLsizeiptr;\ntypedef ptrdiff_t GLintptr;\n\n#define GL_FRAMEBUFFER_SRGB               0x8DB9\n#define GL_TEXTURE_MAX_LEVEL              0x813D\n\n#define GL_R8                             0x8229\n\n#define GL_ARRAY_BUFFER                   0x8892\n#define GL_STREAM_DRAW                    0x88E0\n#define GL_STREAM_READ                    0x88E1\n#define GL_STREAM_COPY                    0x88E2\n#define GL_STATIC_DRAW                    0x88E4\n#define GL_STATIC_READ                    0x88E5\n#define GL_STATIC_COPY                    0x88E6\n#define GL_DYNAMIC_DRAW                   0x88E8\n#define GL_DYNAMIC_READ                   0x88E9\n#define GL_DYNAMIC_COPY                   0x88EA\n\n#define GL_FRAGMENT_SHADER                0x8B30\n#define GL_VERTEX_SHADER                  0x8B31\n#define GL_TESS_EVALUATION_SHADER         0x8E87\n#define GL_TESS_CONTROL_SHADER            0x8E88\n#define GL_INFO_LOG_LENGTH                0x8B84\n\n#define GL_TEXTURE_2D_ARRAY               0x8C1A\n\n#define GL_COMPILE_STATUS                 0x8B81\n\n#define GL_TEXTURE0                       0x84C0\n#define GL_TEXTURE1                       0x84C1\n#define GL_TEXTURE2                       0x84C2\n#define GL_TEXTURE3                       0x84C3\n#define GL_TEXTURE4                       0x84C4\n#define GL_TEXTURE5                       0x84C5\n#define GL_TEXTURE6                       0x84C6\n#define GL_TEXTURE7                       0x84C7\n#define GL_TEXTURE8                       0x84C8\n#define GL_TEXTURE9                       0x84C9\n#define GL_TEXTURE10                      0x84CA\n#define GL_TEXTURE11                      0x84CB\n#define GL_TEXTURE12                      0x84CC\n#define GL_TEXTURE13                      0x84CD\n#define GL_TEXTURE14                      0x84CE\n#define GL_TEXTURE15                      0x84CF\n#define GL_TEXTURE16                      0x84D0\n#define GL_TEXTURE17                      0x84D1\n#define GL_TEXTURE18                      0x84D2\n#define GL_TEXTURE19                      0x84D3\n#define GL_TEXTURE20                      0x84D4\n#define GL_TEXTURE21                      0x84D5\n#define GL_TEXTURE22                      0x84D6\n#define GL_TEXTURE23                      0x84D7\n#define GL_TEXTURE24                      0x84D8\n#define GL_TEXTURE25                      0x84D9\n#define GL_TEXTURE26                      0x84DA\n#define GL_TEXTURE27                      0x84DB\n#define GL_TEXTURE28                      0x84DC\n#define GL_TEXTURE29                      0x84DD\n#define GL_TEXTURE30                      0x84DE\n#define GL_TEXTURE31                      0x84DF\n\n#define GL_DEBUG_OUTPUT                   0x92E0\n#define GL_DEBUG_OUTPUT_SYNCHRONOUS       0x8242\n\n////////////////////////////////\n//~ rjf: OS Backend Includes\n\n#if OS_WINDOWS\n# include \"render/opengl/win32/render_opengl_win32.h\"\n#elif OS_LINUX\n# include \"render/opengl/linux/render_opengl_linux.h\"\n#else\n# error OS portion of OpenGL rendering backend not defined.\n#endif\n\n////////////////////////////////\n//~ rjf: Shader Metadata Types\n\ntypedef struct R_OGL_Attribute R_OGL_Attribute;\nstruct R_OGL_Attribute\n{\n  U64 index;\n  String8 name;\n  GLenum type;\n  U64 count;\n};\n\ntypedef struct R_OGL_AttributeArray R_OGL_AttributeArray;\nstruct R_OGL_AttributeArray\n{\n  R_OGL_Attribute *v;\n  U64 count;\n};\n\n////////////////////////////////\n//~ rjf: Generated Code\n\n#include \"render/opengl/generated/render_opengl.meta.h\"\n\n////////////////////////////////\n//~ rjf: OpenGL Procedure List\n\n#define R_OGL_ProcedureXList \\\nX(glGenBuffers, void, (GLsizei n, GLuint *buffers))\\\nX(glBindBuffer, void, (GLenum target, GLuint buffer))\\\nX(glDeleteBuffers, void, (GLsizei n, GLuint *buffers))\\\nX(glGenVertexArrays, void, (GLsizei n, GLuint *arrays))\\\nX(glBindVertexArray, void, (GLuint array))\\\nX(glCreateProgram, GLuint, (void))\\\nX(glCreateShader, GLuint, (GLenum type))\\\nX(glShaderSource, void, (GLuint shader, GLsizei count, char **string, GLint *length))\\\nX(glCompileShader, void, (GLuint shader))\\\nX(glGetShaderiv, void, (GLuint shader, GLenum pname, GLint *params))\\\nX(glGetShaderInfoLog, void, (GLuint shader, GLsizei bufSize, GLsizei *length, char *infoLog))\\\nX(glGetProgramiv, void, (GLuint program, GLenum pname, GLint *params))\\\nX(glGetProgramInfoLog, void, (GLuint program, GLsizei bufSize, GLsizei *length, char *infoLog))\\\nX(glAttachShader, void, (GLuint program, GLuint shader))\\\nX(glLinkProgram, void, (GLuint program))\\\nX(glValidateProgram, void, (GLuint program))\\\nX(glDeleteShader, void, (GLuint shader))\\\nX(glUseProgram, void, (GLuint program))\\\nX(glGetUniformLocation, GLint, (GLuint program, char *name))\\\nX(glGetAttribLocation, GLint, (GLuint program, char *name))\\\nX(glEnableVertexAttribArray, void, (GLuint index))\\\nX(glVertexAttribPointer, void, (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer))\\\nX(glBufferData, void, (GLenum target, ptrdiff_t size, void *data, GLenum usage))\\\nX(glBufferSubData, void, (GLenum target, ptrdiff_t offset, ptrdiff_t size, const void *data))\\\nX(glBlendFuncSeparate, void, (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha))\\\nX(glUniform1f, void, (GLint location, GLfloat v0))\\\nX(glUniform2f, void, (GLint location, GLfloat v0, GLfloat v1))\\\nX(glUniform3f, void, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2))\\\nX(glUniform4f, void, (GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3))\\\nX(glUniformMatrix4fv, void, (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value))\\\nX(glUniform1i, void, (GLint location, GLint v0))\\\nX(glTexImage3D, void, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLsizei depth, GLint border, GLenum format, GLenum type, const void *pixels))\\\nX(glTexSubImage3D, void, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void *pixels))\\\nX(glGenerateMipmap, void, (GLenum target))\\\nX(glBindAttribLocation, void, (GLuint programObj, GLuint index, char *name))\\\nX(glBindFragDataLocation, void, (GLuint program, GLuint color, char *name))\\\nX(glActiveTexture, void, (GLenum texture))\\\nX(glVertexAttribDivisor, void, (GLuint index, GLuint divisor))\\\nX(glDrawArraysInstanced, void, (GLenum mode, GLint first, GLsizei count, GLsizei instancecount))\\\nX(glDebugMessageCallback, void, (void (*)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam), void *user_data))\\\n\n#define X(name, r, p) typedef r name##_FunctionType p;\nR_OGL_ProcedureXList\n#undef X\n#define X(name, r, p) global name##_FunctionType *name = 0;\nR_OGL_ProcedureXList\n#undef X\n\n////////////////////////////////\n//~ rjf: State Types\n\ntypedef struct R_OGL_FormatInfo R_OGL_FormatInfo;\nstruct R_OGL_FormatInfo\n{\n  GLint internal_format;\n  GLenum format;\n  GLenum base_type;\n};\n\ntypedef struct R_OGL_Tex2D R_OGL_Tex2D;\nstruct R_OGL_Tex2D\n{\n  R_OGL_Tex2D *next;\n  GLuint id;\n  R_ResourceKind resource_kind;\n  R_Tex2DFormat fmt;\n  Vec2S32 size;\n};\n\ntypedef struct R_OGL_FlushBuffer R_OGL_FlushBuffer;\nstruct R_OGL_FlushBuffer\n{\n  R_OGL_FlushBuffer *next;\n  GLuint id;\n};\n\ntypedef struct R_OGL_State R_OGL_State;\nstruct R_OGL_State\n{\n  Arena *arena;\n  R_OGL_Tex2D *free_tex2d;\n  GLuint shaders[R_OGL_ShaderKind_COUNT];\n  GLuint all_purpose_vao;\n  GLuint scratch_buffer_64kb;\n  GLuint white_texture;\n  Arena *buffer_flush_arena;\n  R_OGL_FlushBuffer *first_buffer_to_flush;\n  R_OGL_FlushBuffer *last_buffer_to_flush;\n};\n\n////////////////////////////////\n//~ rjf: Globals\n\nglobal R_OGL_State *r_ogl_state = 0;\n\n////////////////////////////////\n//~ rjf: Helpers\n\ninternal R_Handle r_ogl_handle_from_tex2d(R_OGL_Tex2D *t);\ninternal R_OGL_Tex2D *r_ogl_tex2d_from_handle(R_Handle h);\ninternal R_OGL_FormatInfo r_ogl_format_info_from_tex2dformat(R_Tex2DFormat fmt);\ninternal GLuint r_ogl_instance_buffer_from_size(U64 size);\ninternal void r_ogl_debug_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *message, const void *userParam);\n\n#define glUseProgramScope(...) DeferLoop(glUseProgram(__VA_ARGS__), glUseProgram(0))\n#define glBindVertexArrayScope(...) DeferLoop(glBindVertexArray(__VA_ARGS__), glBindVertexArray(0))\n\n////////////////////////////////\n//~ rjf: OS-Specific Hooks\n\ninternal VoidProc *r_ogl_os_load_procedure(char *name);\ninternal void r_ogl_os_init(CmdLine *cmdln);\ninternal R_Handle r_ogl_os_window_equip(OS_Handle window);\ninternal void r_ogl_os_window_unequip(OS_Handle os, R_Handle r);\ninternal void r_ogl_os_select_window(OS_Handle os, R_Handle r);\ninternal void r_ogl_os_window_swap(OS_Handle os, R_Handle r);\n\n#endif // RENDER_OPENGL_H\n"
  },
  {
    "path": "src/render/opengl/render_opengl.mdesk",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: Shader Table\n\n@table(name   name_lower    input_atts                          output_atts)\nR_OGL_ShaderTable:\n{\n  {Rect        rect          r_ogl_rect_input_attributes         r_ogl_single_color_output_attributes}\n  {Blur        blur          0                                   r_ogl_single_color_output_attributes}\n}\n\n@enum R_OGL_ShaderKind:\n{\n  @expand(R_OGL_ShaderTable a) `$(a.name)`,\n  COUNT\n}\n\n@data(String8) r_ogl_shader_kind_name_table:\n{\n  @expand(R_OGL_ShaderTable a) `str8_lit_comp(\"$(a.name_lower)\")`,\n}\n\n@data(`String8 *`) r_ogl_shader_kind_vshad_src_table:\n{\n  @expand(R_OGL_ShaderTable a) `&r_ogl_$(a.name_lower)_vshad_src`,\n}\n\n@data(`String8 *`) r_ogl_shader_kind_pshad_src_table:\n{\n  @expand(R_OGL_ShaderTable a) `&r_ogl_$(a.name_lower)_pshad_src`,\n}\n\n@data(R_OGL_AttributeArray) r_ogl_shader_kind_input_attributes_table:\n{\n  @expand(R_OGL_ShaderTable a) `{ $(a.input_atts), $(a.input_atts != 0 -> \"ArrayCount(\" .. a.input_atts .. \")\") }`,\n}\n\n@data(R_OGL_AttributeArray) r_ogl_shader_kind_output_attributes_table:\n{\n  @expand(R_OGL_ShaderTable a) `{ $(a.output_atts), ArrayCount($(a.output_atts)) }`,\n}\n\n////////////////////////////////\n//~ rjf: UI Rectangle Shaders\n\n//- rjf: vertex\n@embed_string r_ogl_rect_vshad_src:\n```\n#version 330 core\n\nin vec4 c2v_dst_rect;\nin vec4 c2v_src_rect;\nin vec4 c2v_colors_0;\nin vec4 c2v_colors_1;\nin vec4 c2v_colors_2;\nin vec4 c2v_colors_3;\nin vec4 c2v_corner_radii;\nin vec4 c2v_style;  // x: border_thickness_px, y: softness_px, z: omit_texture, w: shear\n\nout vec2 v2p_sdf_sample_pos;\nout vec2 v2p_texcoord_pct;\nout vec2 v2p_rect_half_size_px;\nout vec4 v2p_tint;\nout float v2p_corner_radius;\nout float v2p_border_thickness;\nout float v2p_softness;\nout float v2p_omit_texture;\n\nuniform sampler2D u_tex_color;\nuniform vec2 u_viewport_size_px;\n\nvoid main(void)\n{\n  // rjf: constants\n  vec2 vertices[] = vec2[](vec2(-1, -1), vec2(-1, +1), vec2(+1, -1), vec2(+1, +1));\n  \n  // rjf: unpack shears\n  float shears[] = float[](0, 0, c2v_style.w, c2v_style.w);\n  \n  // rjf: find dst position\n  vec2 dst_half_size = (c2v_dst_rect.zw - c2v_dst_rect.xy) / 2;\n  vec2 dst_center    = (c2v_dst_rect.zw + c2v_dst_rect.xy) / 2;\n  vec2 dst_position  = vertices[gl_VertexID] * dst_half_size + dst_center;\n  dst_position.y += shears[gl_VertexID];\n  \n  // rjf: find src position\n  vec2 src_half_size = (c2v_src_rect.zw - c2v_src_rect.xy) / 2;\n  vec2 src_center    = (c2v_src_rect.zw + c2v_src_rect.xy) / 2;\n  vec2 src_position  = vertices[gl_VertexID] * src_half_size + src_center;\n  \n  // rjf: find color\n  vec4 colors[] = vec4[](c2v_colors_0, c2v_colors_1, c2v_colors_2, c2v_colors_3);\n  vec4 color = colors[gl_VertexID];\n  \n  // rjf: find corner radius\n  float corner_radii[] = float[](c2v_corner_radii.x, c2v_corner_radii.y, c2v_corner_radii.z, c2v_corner_radii.w);\n  float corner_radius = corner_radii[gl_VertexID];\n  \n  // rjf: fill outputs\n  vec2 dst_verts_pct = vec2(((gl_VertexID >> 1) != 1) ? 1.f : 0.f,\n                            ((gl_VertexID & 1) != 0)  ? 0.f : 1.f);\n  ivec2 u_tex_color_size_i = textureSize(u_tex_color, 0);\n  vec2 u_tex_color_size = vec2(float(u_tex_color_size_i.x), float(u_tex_color_size_i.y));\n  {\n    gl_Position = vec4(2 * dst_position.x / u_viewport_size_px.x - 1,\n                       2 * (1 - dst_position.y / u_viewport_size_px.y) - 1,\n                       0.0, 1.0);\n    v2p_sdf_sample_pos    = (2.f * dst_verts_pct - 1.f) * dst_half_size;\n    v2p_texcoord_pct      = src_position / u_tex_color_size;\n    v2p_rect_half_size_px = dst_half_size;\n    v2p_tint              = color;\n    v2p_corner_radius     = corner_radius;\n    v2p_border_thickness  = c2v_style.x;\n    v2p_softness          = c2v_style.y;\n    v2p_omit_texture      = c2v_style.z;\n  }\n}\n```\n\n//- rjf: pixel\n@embed_string r_ogl_rect_pshad_src:\n```\n#version 330 core\n\nin vec2 v2p_sdf_sample_pos;\nin vec2 v2p_texcoord_pct;\nin vec2 v2p_rect_half_size_px;\nin vec4 v2p_tint;\nin float v2p_corner_radius;\nin float v2p_border_thickness;\nin float v2p_softness;\nin float v2p_omit_texture;\n\nout vec4 final_color;\n\nuniform float u_opacity;\nuniform sampler2D u_tex_color;\nuniform mat4 u_texture_sample_channel_map;\n\nfloat rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\n{\n  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n}\n\nfloat linear_from_srgb_f32(float x)\n{\n  return x < 0.0404482362771082 ? x / 12.92 : pow((x + 0.055) / 1.055, 2.4);\n}\n\nvec4 linear_from_srgba(vec4 v)\n{\n  vec4 result = vec4(linear_from_srgb_f32(v.x),\n                     linear_from_srgb_f32(v.y),\n                     linear_from_srgb_f32(v.z),\n                     v.w);\n  return result;\n}\n\nvoid main(void)\n{\n  // rjf: sample texture\n  vec4 albedo_sample = vec4(1, 1, 1, 1);\n  if(v2p_omit_texture < 1)\n  {\n    albedo_sample = u_texture_sample_channel_map * texture(u_tex_color, v2p_texcoord_pct);\n    albedo_sample = linear_from_srgba(albedo_sample);\n  }\n  \n  // rjf: sample for borders\n  float border_sdf_t = 1;\n  if(v2p_border_thickness > 0)\n  {\n    float border_sdf_s = rect_sdf(v2p_sdf_sample_pos,\n                                  v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f) - v2p_border_thickness,\n                                  max(v2p_corner_radius-v2p_border_thickness, 0));\n    border_sdf_t = smoothstep(0, 2*v2p_softness, border_sdf_s);\n  }\n  if(border_sdf_t < 0.001f)\n  {\n    discard;\n  }\n  \n  // rjf: sample for corners\n  float corner_sdf_t = 1;\n  if(v2p_corner_radius > 0 || v2p_softness > 0.75f)\n  {\n    float corner_sdf_s = rect_sdf(v2p_sdf_sample_pos,\n                                  v2p_rect_half_size_px - vec2(v2p_softness*2.f, v2p_softness*2.f),\n                                  v2p_corner_radius);\n    corner_sdf_t = 1-smoothstep(0, 2*v2p_softness, corner_sdf_s);\n  }\n  \n  // rjf: form+return final color\n  final_color = albedo_sample;\n  final_color *= v2p_tint;\n  final_color.a *= u_opacity;\n  final_color.a *= corner_sdf_t;\n  final_color.a *= border_sdf_t;\n}\n```\n\n////////////////////////////////\n//~ rjf: Blur Shaders\n\n//- rjf: vertex\n@embed_string r_ogl_blur_vshad_src:\n```\n#version 330 core\n\nuniform vec4 rect;\nuniform vec4 corner_radii_px;\nuniform vec2 viewport_size;\nuniform uint blur_count;\n\nout vec2 texcoord;\nout vec2 sdf_sample_pos;\nout vec2 rect_half_size;\nout float corner_radius;\n\nvoid main(void)\n{\n  vec2 vertex_positions_scrn[] = vec2[](rect.xw,\n                                        rect.xy,\n                                        rect.zw,\n                                        rect.zy);\n  float corner_radii_px[] = float[](corner_radii_px.y,\n                                    corner_radii_px.x,\n                                    corner_radii_px.w,\n                                    corner_radii_px.z);\n  vec2 cornercoords_pct = vec2((gl_VertexID >> 1) != 0 ? 1.f : 0.f,\n                               (gl_VertexID & 1) != 0  ? 0.f : 1.f);\n  \n  vec2 vertex_position_pct = vertex_positions_scrn[gl_VertexID] / viewport_size;\n  vec2 vertex_position_scr = 2.f * vertex_position_pct - 1.f;\n  \n  vec2 rect_half_size = vec2((rect.z-rect.x)/2, (rect.w-rect.y)/2);\n  \n  gl_Position = vec4(vertex_position_scr.x, -vertex_position_scr.y, 0.f, 1.f);\n  texcoord = vertex_position_pct;\n  sdf_sample_pos = (2.f * cornercoords_pct - 1.f) * rect_half_size;\n  rect_half_size = rect_half_size - 2.f;\n  corner_radius = corner_radii_px[gl_VertexID];\n}\n```\n\n//- rjf: pixel\n@embed_string r_ogl_blur_pshad_src:\n```\n#version 330 core\n\nuniform sampler2D tex;\nuniform vec4 kernel[32];\nuniform int blur_count;\nuniform vec2 direction;\n\nin vec2 texcoord;\nin vec2 sdf_sample_pos;\nin vec2 rect_half_size;\nin float corner_radius;\n\nout vec4 final_color;\n\nfloat rect_sdf(vec2 sample_pos, vec2 rect_half_size, float r)\n{\n  return length(max(abs(sample_pos) - rect_half_size + r, 0.0)) - r;\n}\n\nvoid main(void)\n{\n  // rjf: blend weighted texture samples into color\n  vec3 color = kernel[0].x * texture(tex, texcoord).rgb;\n  \n  for(int i = 1; i < blur_count; i += 1)\n  {\n    float weight = kernel[i].x;\n    float offset = kernel[i].y;\n    color += weight * texture(tex, texcoord - offset * direction).rgb;\n    color += weight * texture(tex, texcoord + offset * direction).rgb;\n  }\n  \n  // rjf: sample for corners\n  float corner_sdf_s = rect_sdf(sdf_sample_pos, rect_half_size, corner_radius);\n  float corner_sdf_t = 1-smoothstep(0, 2, corner_sdf_s);\n  \n  // rjf: weight output color by sdf\n  // this is doing alpha testing, leave blurring only where mostly opaque pixels are\n  if(corner_sdf_t < 0.9f)\n  {\n    discard;\n  }\n  \n  final_color = vec4(color, 1.f);\n}\n```\n"
  },
  {
    "path": "src/render/opengl/win32/render_opengl_win32.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\ninternal VoidProc *\nr_ogl_os_load_procedure(char *name)\n{\n  VoidProc *p = (VoidProc*)wglGetProcAddress(name);\n  if(p == (VoidProc*)1 || p == (VoidProc*)2 || p == (VoidProc*)3 || p == (VoidProc*)-1)\n  {\n    p = 0;\n  }\n  return p;\n}\n\ninternal void\nr_ogl_os_init(CmdLine *cmdline)\n{\n  //- rjf: create bootstrapping window\n  HWND bootstrap_hwnd = 0;\n  {\n    WNDCLASSEXW wndclass = { sizeof(wndclass) };\n    wndclass.lpfnWndProc = DefWindowProcW;\n    wndclass.hInstance = GetModuleHandle(0);\n    wndclass.lpszClassName = L\"bootstrap-window\";\n    ATOM wndatom = RegisterClassExW(&wndclass);\n    bootstrap_hwnd = CreateWindowExW(0, L\"bootstrap-window\", L\"\", 0,\n                                     CW_USEDEFAULT, CW_USEDEFAULT,\n                                     CW_USEDEFAULT, CW_USEDEFAULT,\n                                     0, 0, wndclass.hInstance, 0);\n  }\n  \n  //- rjf: grab dc\n  HDC dc = GetDC(bootstrap_hwnd);\n  \n  //- rjf: build pixel format descriptor\n  int pf = 0;\n  {\n    PIXELFORMATDESCRIPTOR pfd = {sizeof(pfd)};\n    pfd.nVersion = 1;\n    pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;\n    pfd.iPixelType = PFD_TYPE_RGBA;\n    pfd.cColorBits = 32;\n    pfd.cDepthBits = 24;\n    pfd.cStencilBits = 8;\n    pfd.iLayerType = PFD_MAIN_PLANE;\n    pf = ChoosePixelFormat(dc, &pfd);\n    BOOL describe = DescribePixelFormat(dc, pf, sizeof(pfd), &pfd);\n    BOOL set_pf = SetPixelFormat(dc, pf, &pfd);\n  }\n  \n  //- rjf: make bootstrap ctx + make current\n  HGLRC bootstrap_ctx = wglCreateContext(dc);\n  wglMakeCurrent(dc, bootstrap_ctx);\n  \n  //- rjf: load modern extensions\n  wglChoosePixelFormatARB    = (FNWGLCHOOSEPIXELFORMATARBPROC*)   r_ogl_os_load_procedure(\"wglChoosePixelFormatARB\");\n  wglCreateContextAttribsARB = (FNWGLCREATECONTEXTATTRIBSARBPROC*)r_ogl_os_load_procedure(\"wglCreateContextAttribsARB\");\n  wglSwapIntervalEXT         = (FNWGLSWAPINTERVALEXTPROC*)        r_ogl_os_load_procedure(\"wglSwapIntervalEXT\");\n  \n  //- rjf: set up real pixel format\n  {\n    int pf_attribs_i[] =\n    {\n      WGL_DRAW_TO_WINDOW_ARB, 1,\n      WGL_SUPPORT_OPENGL_ARB, 1,\n      WGL_DOUBLE_BUFFER_ARB, 1,\n      WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,\n      WGL_COLOR_BITS_ARB, 32,\n      WGL_DEPTH_BITS_ARB, 24,\n      WGL_STENCIL_BITS_ARB, 8,\n      0\n    };\n    UINT num_formats = 0;\n    wglChoosePixelFormatARB(dc, pf_attribs_i, 0, 1, &pf, &num_formats);\n  }\n  \n  //- rjf: make real gl ctx\n  HGLRC real_ctx = 0;\n  if(pf)\n  {\n    B32 debug_mode = cmd_line_has_flag(cmdline, str8_lit(\"opengl_debug\"));\n#if BUILD_DEBUG\n    debug_mode = 1;\n#endif\n    int context_attribs[] =\n    {\n      WGL_CONTEXT_MAJOR_VERSION_ARB, 3,\n      WGL_CONTEXT_MINOR_VERSION_ARB, 3,\n      WGL_CONTEXT_FLAGS_ARB, !!debug_mode*WGL_CONTEXT_DEBUG_BIT_ARB,\n      0\n    };\n    real_ctx = wglCreateContextAttribsARB(dc, bootstrap_ctx, context_attribs);\n    r_ogl_w32_hglrc = real_ctx;\n  }\n  \n  //- rjf: clean up bootstrap context\n  wglMakeCurrent(dc, 0);\n  wglDeleteContext(bootstrap_ctx);\n  wglMakeCurrent(dc, real_ctx);\n  wglSwapIntervalEXT(1);\n}\n\ninternal R_Handle\nr_ogl_os_window_equip(OS_Handle window)\n{\n  //- rjf: unpack window\n  OS_W32_Window *w = os_w32_window_from_handle(window);\n  HWND hwnd = w->hwnd;\n  HDC hdc = w->hdc;\n  \n  //- rjf: select in ctx\n  wglMakeCurrent(hdc, r_ogl_w32_hglrc);\n  \n  //- rjf: setup real pixel format\n  int pixel_format = 0;\n  UINT num_formats = 0;\n  int pf_attribs_i[] =\n  {\n    WGL_DRAW_TO_WINDOW_ARB, GL_TRUE,\n    WGL_SUPPORT_OPENGL_ARB, GL_TRUE,\n    WGL_DOUBLE_BUFFER_ARB, GL_TRUE,\n    WGL_PIXEL_TYPE_ARB, WGL_TYPE_RGBA_ARB,\n    WGL_COLOR_BITS_ARB, 32,\n    WGL_DEPTH_BITS_ARB, 24,\n    WGL_STENCIL_BITS_ARB, 8,\n    0\n  };\n  wglChoosePixelFormatARB(hdc,\n                          pf_attribs_i,\n                          0,\n                          1,\n                          &pixel_format,\n                          &num_formats);\n  \n  // NOTE(rjf): This doesn't seem to be necessary for SetPixelFormat, we can\n  // just pass 0 for it, and SetPixelFormat needs to be called here, but the\n  // docs don't seem to suggest that 0 is an acceptable value, so I am just\n  // filling this out with the same attribs as that for the wgl function,\n  // and passing it.\n  PIXELFORMATDESCRIPTOR pfd = {sizeof(pfd)};\n  pfd.nVersion = 1;\n  pfd.dwFlags = PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;\n  pfd.iPixelType = PFD_TYPE_RGBA;\n  pfd.cColorBits = 32;\n  pfd.cDepthBits = 24;\n  pfd.cStencilBits = 8;\n  pfd.iLayerType = PFD_MAIN_PLANE;\n  \n  //- rjf: set pixel format\n  SetPixelFormat(hdc, pixel_format, &pfd);\n  \n  //- rjf: release hdc\n  R_Handle result = {0};\n  return result;\n}\n\ninternal void\nr_ogl_os_window_unequip(OS_Handle os, R_Handle r)\n{\n}\n\ninternal void\nr_ogl_os_select_window(OS_Handle os, R_Handle r)\n{\n  OS_W32_Window *w = os_w32_window_from_handle(os);\n  if(w != 0)\n  {\n    HWND hwnd = w->hwnd;\n    HDC hdc = w->hdc;\n    wglMakeCurrent(hdc, r_ogl_w32_hglrc);\n  }\n}\n\ninternal void\nr_ogl_os_window_swap(OS_Handle os, R_Handle r)\n{\n  OS_W32_Window *w = os_w32_window_from_handle(os);\n  if(w != 0)\n  {\n    HDC dc = w->hdc;\n    SwapBuffers(dc);\n  }\n}\n"
  },
  {
    "path": "src/render/opengl/win32/render_opengl_win32.h",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#ifndef RENDER_OPENGL_WIN32_H\n#define RENDER_OPENGL_WIN32_H\n\n#include <GL/gl.h>\n#pragma comment(lib, \"opengl32\")\n\n#define WGL_DRAW_TO_WINDOW_ARB            0x2001\n#define WGL_SUPPORT_OPENGL_ARB            0x2010\n#define WGL_DOUBLE_BUFFER_ARB             0x2011\n#define WGL_PIXEL_TYPE_ARB                0x2013\n#define WGL_COLOR_BITS_ARB                0x2014\n#define WGL_DEPTH_BITS_ARB                0x2022\n#define WGL_STENCIL_BITS_ARB              0x2023\n#define WGL_TYPE_RGBA_ARB                 0x202B\n#define WGL_CONTEXT_DEBUG_BIT_ARB         0x00000001\n\n#define WGL_CONTEXT_MAJOR_VERSION_ARB     0x2091\n#define WGL_CONTEXT_MINOR_VERSION_ARB     0x2092\n#define WGL_CONTEXT_FLAGS_ARB             0x2094\n\ntypedef BOOL WINAPI FNWGLCHOOSEPIXELFORMATARBPROC(HDC hdc, const int *piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats);\ntypedef HGLRC WINAPI FNWGLCREATECONTEXTATTRIBSARBPROC(HDC hDC, HGLRC hShareContext, const int *attribList);\ntypedef BOOL WINAPI FNWGLSWAPINTERVALEXTPROC(int interval);\n\nFNWGLCHOOSEPIXELFORMATARBPROC *wglChoosePixelFormatARB;\nFNWGLCREATECONTEXTATTRIBSARBPROC *wglCreateContextAttribsARB;\nFNWGLSWAPINTERVALEXTPROC *wglSwapIntervalEXT;\n\nglobal HGLRC r_ogl_w32_hglrc = 0;\n\n#endif // RENDER_OPENGL_WIN32_H\n"
  },
  {
    "path": "src/render/render_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/render.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal U64\r\nr_bytes_per_pixel_from_tex2dfmt(R_Tex2DFmt fmt)\r\n{\r\n  U64 num_bits = 0;\r\n  for EachIndex(channel_idx, 4)\r\n  {\r\n    R_ChannelSizeKind size_kind = r_size_kind_from_tex2dfmt_channel(fmt, channel_idx);\r\n    switch(size_kind)\r\n    {\r\n      default:{}break;\r\n      case R_ChannelSizeKind_2: {num_bits += 2;}break;\r\n      case R_ChannelSizeKind_8: {num_bits += 8;}break;\r\n      case R_ChannelSizeKind_10:{num_bits += 10;}break;\r\n      case R_ChannelSizeKind_11:{num_bits += 11;}break;\r\n      case R_ChannelSizeKind_16:{num_bits += 16;}break;\r\n      case R_ChannelSizeKind_24:{num_bits += 24;}break;\r\n      case R_ChannelSizeKind_32:{num_bits += 32;}break;\r\n    }\r\n  }\r\n  U64 num_bits_rounded = num_bits+7;\r\n  num_bits_rounded -= num_bits_rounded%8;\r\n  U64 num_bytes = num_bits_rounded/8;\r\n  return num_bytes;\r\n}\r\n\r\ninternal Mat4x4F32\r\nr_sample_channel_map_from_tex2dfmt(R_Tex2DFmt fmt)\r\n{\r\n  Mat4x4F32 result =\r\n  {\r\n    {\r\n      {1, 0, 0, 0},\r\n      {0, 1, 0, 0},\r\n      {0, 0, 1, 0},\r\n      {0, 0, 0, 1},\r\n    }\r\n  };\r\n  return result;\r\n}\r\n\r\ninternal Mat4x4F32\r\nr_sample_channel_map_from_tex2dformat(R_Tex2DFormat fmt)\r\n{\r\n  Mat4x4F32 result =\r\n  {\r\n    {\r\n      {1, 0, 0, 0},\r\n      {0, 1, 0, 0},\r\n      {0, 0, 1, 0},\r\n      {0, 0, 0, 1},\r\n    }\r\n  };\r\n  switch(fmt)\r\n  {\r\n    default:{}break;\r\n    case R_Tex2DFormat_R8:\r\n    {\r\n      MemoryZeroArray(result.v[0]);\r\n      result.v[0][0] = result.v[0][1] = result.v[0][2] = result.v[0][3] = 1.f;\r\n    }break;\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\ninternal R_Handle\r\nr_handle_zero(void)\r\n{\r\n  R_Handle handle = {0};\r\n  return handle;\r\n}\r\n\r\ninternal B32\r\nr_handle_match(R_Handle a, R_Handle b)\r\n{\r\n  return MemoryMatchStruct(&a, &b);\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Batch Type Functions\r\n\r\ninternal R_BatchList\r\nr_batch_list_make(U64 instance_size)\r\n{\r\n  R_BatchList list = {0};\r\n  list.bytes_per_inst = instance_size;\r\n  return list;\r\n}\r\n\r\ninternal void *\r\nr_batch_list_push_inst(Arena *arena, R_BatchList *list, U64 batch_inst_cap)\r\n{\r\n  void *inst = 0;\r\n  {\r\n    R_BatchNode *n = list->last;\r\n    if(n == 0 || n->v.byte_count+list->bytes_per_inst > n->v.byte_cap)\r\n    {\r\n      n = push_array(arena, R_BatchNode, 1);\r\n      n->v.byte_cap = batch_inst_cap*list->bytes_per_inst;\r\n      n->v.v = push_array_no_zero(arena, U8, n->v.byte_cap); \r\n      SLLQueuePush(list->first, list->last, n);\r\n      list->batch_count += 1;\r\n    }\r\n    inst = n->v.v + n->v.byte_count;\r\n    n->v.byte_count += list->bytes_per_inst;\r\n    list->byte_count += list->bytes_per_inst;\r\n  }\r\n  return inst;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Pass Type Functions\r\n\r\ninternal R_Pass *\r\nr_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kind)\r\n{\r\n  R_PassNode *n = list->last;\r\n  if(!r_pass_kind_batch_table[kind])\r\n  {\r\n    n = 0;\r\n  }\r\n  if(n == 0 || n->v.kind != kind)\r\n  {\r\n    n = push_array(arena, R_PassNode, 1);\r\n    SLLQueuePush(list->first, list->last, n);\r\n    list->count += 1;\r\n    n->v.kind = kind;\r\n    n->v.params = push_array(arena, U8, r_pass_kind_params_size_table[kind]);\r\n  }\r\n  return &n->v;\r\n}\r\n"
  },
  {
    "path": "src/render/render_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RENDER_CORE_H\r\n#define RENDER_CORE_H\r\n\r\n#define r_hook C_LINKAGE\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/render.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Enums\r\n\r\ntypedef U8 R_ChannelCode; // 3 bits\r\ntypedef enum R_ChannelCodeEnum\r\n{\r\n  R_ChannelCode_Null,\r\n  R_ChannelCode_R,\r\n  R_ChannelCode_G,\r\n  R_ChannelCode_B,\r\n  R_ChannelCode_A,\r\n}\r\nR_ChannelCodeEnum;\r\n\r\ntypedef U8 R_ChannelSizeKind; // 3 bits\r\ntypedef enum R_ChannelSizeKindEnum\r\n{\r\n  R_ChannelSizeKind_Null,\r\n  R_ChannelSizeKind_2,\r\n  R_ChannelSizeKind_8,\r\n  R_ChannelSizeKind_10,\r\n  R_ChannelSizeKind_11,\r\n  R_ChannelSizeKind_16,\r\n  R_ChannelSizeKind_24,\r\n  R_ChannelSizeKind_32,\r\n}\r\nR_ChannelSizeKindEnum;\r\n\r\ntypedef U8 R_ChannelTypeKind; // 3 bits\r\ntypedef enum R_ChannelTypeKindEnum\r\n{\r\n  R_ChannelTypeKind_Null,\r\n  R_ChannelTypeKind_UInt,\r\n  R_ChannelTypeKind_SInt,\r\n  R_ChannelTypeKind_UNorm,\r\n  R_ChannelTypeKind_SNorm,\r\n  R_ChannelTypeKind_Float,\r\n}\r\nR_ChannelTypeKindEnum;\r\n\r\ntypedef U64 R_Tex2DFmt;\r\n//\r\n// set of channels, each channel including {code, size, type kind}, 3 bits each:\r\n//   [0, 3) -> channel code\r\n//   [3, 6) -> channel size\r\n//   [6, 9) -> channel type kind\r\n//\r\n// 9 bits per channel, * number of channels, e.g. 4 channels -> 36 bits\r\n\r\n#define R_Channel(channel_idx, code_name, size_kind_name, type_kind_name) ((((U64)(R_ChannelCode_##code_name & 0x7)) | ((U64)(R_ChannelSizeKind_##size_kind_name & 0x7) << 3) | ((U64)(R_ChannelTypeKind_##type_kind_name & 0x7) << 6)) << ((channel_idx)*9))\r\n#define r_code_from_tex2dfmt_channel(fmt, channel_idx) ((R_ChannelCode)(((fmt) & (0x7<<((channel_idx)*9))) >> ((channel_idx)*9)))\r\n#define r_size_kind_from_tex2dfmt_channel(fmt, channel_idx) ((R_ChannelSizeKind)(((fmt) & (0x38<<((channel_idx)*9))) >> ((channel_idx)*9 + 3)))\r\n#define r_type_kind_from_tex2dfmt_channel(fmt, channel_idx) ((R_ChannelTypeKind)(((fmt) & (0x1c0<<((channel_idx)*9))) >> ((channel_idx)*9 + 6)))\r\n\r\n#define R_Tex2DFmt_R8    (R_Channel(0, R, 8, UInt))\r\n#define R_Tex2DFmt_RG8   (R_Channel(0, R, 8, UInt) | R_Channel(1, G, 8, UInt))\r\n#define R_Tex2DFmt_RGB8  (R_Channel(0, R, 8, UInt) | R_Channel(1, G, 8, UInt) | R_Channel(2, B, 8, UInt))\r\n#define R_Tex2DFmt_RGBA8 (R_Channel(0, R, 8, UInt) | R_Channel(1, G, 8, UInt) | R_Channel(2, B, 8, UInt) | R_Channel(3, A, 8, UInt))\r\n\r\ntypedef U32 R_GeoVertexFlags;\r\nenum\r\n{\r\n  R_GeoVertexFlag_TexCoord = (1<<0),\r\n  R_GeoVertexFlag_Normals  = (1<<1),\r\n  R_GeoVertexFlag_RGB      = (1<<2),\r\n  R_GeoVertexFlag_RGBA     = (1<<3),\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type\r\n\r\ntypedef union R_Handle R_Handle;\r\nunion R_Handle\r\n{\r\n  U64 u64[1];\r\n  U32 u32[2];\r\n  U16 u16[4];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Instance Types\r\n\r\ntypedef struct R_Rect2DInst R_Rect2DInst;\r\nstruct R_Rect2DInst\r\n{\r\n  Rng2F32 dst;\r\n  Rng2F32 src;\r\n  Vec4F32 colors[Corner_COUNT];\r\n  F32 corner_radii[Corner_COUNT];\r\n  F32 border_thickness;\r\n  F32 edge_softness;\r\n  F32 white_texture_override;\r\n  F32 shear;\r\n};\r\n\r\ntypedef struct R_Mesh3DInst R_Mesh3DInst;\r\nstruct R_Mesh3DInst\r\n{\r\n  Mat4x4F32 xform;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Batch Types\r\n\r\ntypedef struct R_Batch R_Batch;\r\nstruct R_Batch\r\n{\r\n  U8 *v;\r\n  U64 byte_count;\r\n  U64 byte_cap;\r\n};\r\n\r\ntypedef struct R_BatchNode R_BatchNode;\r\nstruct R_BatchNode\r\n{\r\n  R_BatchNode *next;\r\n  R_Batch v;\r\n};\r\n\r\ntypedef struct R_BatchList R_BatchList;\r\nstruct R_BatchList\r\n{\r\n  R_BatchNode *first;\r\n  R_BatchNode *last;\r\n  U64 batch_count;\r\n  U64 byte_count;\r\n  U64 bytes_per_inst;\r\n};\r\n\r\ntypedef struct R_BatchGroup2DParams R_BatchGroup2DParams;\r\nstruct R_BatchGroup2DParams\r\n{\r\n  R_Handle tex;\r\n  R_Tex2DSampleKind tex_sample_kind;\r\n  Mat3x3F32 xform;\r\n  Rng2F32 clip;\r\n  F32 transparency;\r\n};\r\n\r\ntypedef struct R_BatchGroup2DNode R_BatchGroup2DNode;\r\nstruct R_BatchGroup2DNode\r\n{\r\n  R_BatchGroup2DNode *next;\r\n  R_BatchList batches;\r\n  R_BatchGroup2DParams params;\r\n};\r\n\r\ntypedef struct R_BatchGroup2DList R_BatchGroup2DList;\r\nstruct R_BatchGroup2DList\r\n{\r\n  R_BatchGroup2DNode *first;\r\n  R_BatchGroup2DNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct R_BatchGroup3DParams R_BatchGroup3DParams;\r\nstruct R_BatchGroup3DParams\r\n{\r\n  R_Handle mesh_vertices;\r\n  R_Handle mesh_indices;\r\n  R_GeoTopologyKind mesh_geo_topology;\r\n  R_GeoVertexFlags mesh_geo_vertex_flags;\r\n  R_Handle albedo_tex;\r\n  R_Tex2DSampleKind albedo_tex_sample_kind;\r\n  Mat4x4F32 xform;\r\n};\r\n\r\ntypedef struct R_BatchGroup3DMapNode R_BatchGroup3DMapNode;\r\nstruct R_BatchGroup3DMapNode\r\n{\r\n  R_BatchGroup3DMapNode *next;\r\n  U64 hash;\r\n  R_BatchList batches;\r\n  R_BatchGroup3DParams params;\r\n};\r\n\r\ntypedef struct R_BatchGroup3DMap R_BatchGroup3DMap;\r\nstruct R_BatchGroup3DMap\r\n{\r\n  R_BatchGroup3DMapNode **slots;\r\n  U64 slots_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Pass Types\r\n\r\ntypedef struct R_PassParams_UI R_PassParams_UI;\r\nstruct R_PassParams_UI\r\n{\r\n  R_BatchGroup2DList rects;\r\n};\r\n\r\ntypedef struct R_PassParams_Blur R_PassParams_Blur;\r\nstruct R_PassParams_Blur\r\n{\r\n  Rng2F32 rect;\r\n  Rng2F32 clip;\r\n  F32 blur_size;\r\n  F32 corner_radii[Corner_COUNT];\r\n};\r\n\r\ntypedef struct R_PassParams_Geo3D R_PassParams_Geo3D;\r\nstruct R_PassParams_Geo3D\r\n{\r\n  Rng2F32 viewport;\r\n  Rng2F32 clip;\r\n  Mat4x4F32 view;\r\n  Mat4x4F32 projection;\r\n  R_BatchGroup3DMap mesh_batches;\r\n};\r\n\r\ntypedef struct R_Pass R_Pass;\r\nstruct R_Pass\r\n{\r\n  R_PassKind kind;\r\n  union\r\n  {\r\n    void *params;\r\n    R_PassParams_UI *params_ui;\r\n    R_PassParams_Blur *params_blur;\r\n    R_PassParams_Geo3D *params_geo3d;\r\n  };\r\n};\r\n\r\ntypedef struct R_PassNode R_PassNode;\r\nstruct R_PassNode\r\n{\r\n  R_PassNode *next;\r\n  R_Pass v;\r\n};\r\n\r\ntypedef struct R_PassList R_PassList;\r\nstruct R_PassList\r\n{\r\n  R_PassNode *first;\r\n  R_PassNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Helpers\r\n\r\ninternal U64 r_bytes_per_pixel_from_tex2dfmt(R_Tex2DFmt fmt);\r\ninternal Mat4x4F32 r_sample_channel_map_from_tex2dfmt(R_Tex2DFmt fmt);\r\ninternal Mat4x4F32 r_sample_channel_map_from_tex2dformat(R_Tex2DFormat fmt);\r\n\r\n////////////////////////////////\r\n//~ rjf: Handle Type Functions\r\n\r\ninternal R_Handle r_handle_zero(void);\r\ninternal B32 r_handle_match(R_Handle a, R_Handle b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Batch Type Functions\r\n\r\ninternal R_BatchList r_batch_list_make(U64 instance_size);\r\ninternal void *r_batch_list_push_inst(Arena *arena, R_BatchList *list, U64 batch_inst_cap);\r\n\r\n////////////////////////////////\r\n//~ rjf: Pass Type Functions\r\n\r\ninternal R_Pass *r_pass_from_kind(Arena *arena, R_PassList *list, R_PassKind kind);\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Hooks\r\n\r\n//- rjf: top-level layer initialization\r\nr_hook void              r_init(CmdLine *cmdln);\r\n\r\n//- rjf: window setup/teardown\r\nr_hook R_Handle          r_window_equip(OS_Handle window);\r\nr_hook void              r_window_unequip(OS_Handle window, R_Handle window_equip);\r\n\r\n//- rjf: textures\r\nr_hook R_Handle          r_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data);\r\nr_hook void              r_tex2d_release(R_Handle texture);\r\nr_hook R_ResourceKind    r_kind_from_tex2d(R_Handle texture);\r\nr_hook Vec2S32           r_size_from_tex2d(R_Handle texture);\r\nr_hook R_Tex2DFormat     r_format_from_tex2d(R_Handle texture);\r\nr_hook void              r_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data);\r\n\r\n//- rjf: buffers\r\nr_hook R_Handle          r_buffer_alloc(R_ResourceKind kind, U64 size, void *data);\r\nr_hook void              r_buffer_release(R_Handle buffer);\r\n\r\n//- rjf: frame markers\r\nr_hook void              r_begin_frame(void);\r\nr_hook void              r_end_frame(void);\r\nr_hook void              r_window_begin_frame(OS_Handle window, R_Handle window_equip);\r\nr_hook void              r_window_end_frame(OS_Handle window, R_Handle window_equip);\r\n\r\n//- rjf: render pass submission\r\nr_hook void              r_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes);\r\n\r\n#endif // RENDER_CORE_H\r\n"
  },
  {
    "path": "src/render/render_core.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Tables\r\n\r\n@table(name, display_string, bytes_per_pixel)\r\nR_Tex2DFormatTable:\r\n{\r\n  {R8       \"R8\"       1}\r\n  {RG8      \"RG8\"      2}\r\n  {RGBA8    \"RGBA8\"    4}\r\n  {BGRA8    \"BGRA8\"    4}\r\n  {R16      \"R16\"      2}\r\n  {RGBA16   \"RGBA16\"   8}\r\n  {R32      \"R32\"      4}\r\n  {RG32     \"RG32\"     8}\r\n  {RGBA32   \"RGBA32\"  16}\r\n}\r\n\r\n@table(name, display_string)\r\nR_ResourceKindTable:\r\n{\r\n  // static resource is immutable\r\n  // initial data must be provided at creation time\r\n  // GPU can read the resource\r\n  // CPU is not allowed to read or write\r\n  {Static   \"Static\" }\r\n  \r\n  // dynamic resource allows resource to be modified\r\n  // GPU can read & write to it\r\n  // CPU can write to it using UpdateSubresource\r\n  {Dynamic  \"Dynamic\"}\r\n  \r\n  // stream resource will be often updated fully overwriting previous data\r\n  // GPU can only read it\r\n  // CPU can update via Map (with WRITE_DISCARD flag) + Unmap\r\n  {Stream   \"Stream \"} \r\n}\r\n\r\n@table(name, display_string)\r\nR_Tex2DSampleKindTable:\r\n{\r\n  {Nearest   \"Nearest\" }\r\n  {Linear    \"Linear\"  }\r\n}\r\n\r\n@table(name, display_string)\r\nR_GeoTopologyKindTable:\r\n{\r\n  {Lines          \"Lines\"          }\r\n  {LineStrip      \"Line Strip\"     }\r\n  {Triangles      \"Triangles\"      }\r\n  {TriangleStrip  \"Triangle Strip\" }\r\n}\r\n\r\n@table(name, batch, display_string)\r\nR_PassKindTable:\r\n{\r\n  {UI          1      \"UI\"    }\r\n  {Blur        0      \"Blur\"  }\r\n  {Geo3D       1      \"Geo3D\" }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Generators\r\n\r\n@enum R_Tex2DFormat:\r\n{\r\n  @expand(R_Tex2DFormatTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@enum R_ResourceKind:\r\n{\r\n  @expand(R_ResourceKindTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@enum R_Tex2DSampleKind:\r\n{\r\n  @expand(R_Tex2DSampleKindTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@enum R_GeoTopologyKind:\r\n{\r\n  @expand(R_GeoTopologyKindTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@enum R_PassKind:\r\n{\r\n  @expand(R_PassKindTable a) `$(a.name)`,\r\n  COUNT,\r\n}\r\n\r\n@data(String8) r_tex2d_format_display_string_table:\r\n{\r\n  @expand(R_Tex2DFormatTable a) `str8_lit_comp(\"$(a.display_string)\")`;\r\n}\r\n\r\n@data(U8) r_tex2d_format_bytes_per_pixel_table:\r\n{\r\n  @expand(R_Tex2DFormatTable a) `$(a.bytes_per_pixel)`;\r\n}\r\n\r\n@data(String8) r_resource_kind_display_string_table:\r\n{\r\n  @expand(R_ResourceKindTable a) `str8_lit_comp(\"$(a.display_string)\")`;\r\n}\r\n\r\n@data(String8) r_tex2d_sample_kind_display_string_table:\r\n{\r\n  @expand(R_Tex2DSampleKindTable a) `str8_lit_comp(\"$(a.display_string)\")`;\r\n}\r\n\r\n@data(String8) r_pass_kind_display_string_table:\r\n{\r\n  @expand(R_PassKindTable a) `str8_lit_comp(\"$(a.display_string)\")`;\r\n}\r\n\r\n@data(U8) r_pass_kind_batch_table:\r\n{\r\n  @expand(R_PassKindTable a) `$(a.batch)`;\r\n}\r\n\r\n@data(U64) @c_file r_pass_kind_params_size_table:\r\n{\r\n  @expand(R_PassKindTable a) `sizeof(R_PassParams_$(a.name))`;\r\n}\r\n"
  },
  {
    "path": "src/render/render_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xc22121ff\r\n\r\n#include \"render_core.c\"\r\n\r\n#if R_BACKEND == R_BACKEND_STUB\r\n# include \"stub/render_stub.c\"\r\n#elif R_BACKEND == R_BACKEND_D3D11\r\n# include \"d3d11/render_d3d11.c\"\r\n#elif R_BACKEND == R_BACKEND_OPENGL\r\n# include \"opengl/render_opengl.c\"\r\n#else\r\n# error Renderer backend not specified.\r\n#endif\r\n"
  },
  {
    "path": "src/render/render_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RENDER_INC_H\r\n#define RENDER_INC_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Constants\r\n\r\n#define R_BACKEND_STUB 0\r\n#define R_BACKEND_D3D11 1\r\n#define R_BACKEND_OPENGL 2\r\n\r\n////////////////////////////////\r\n//~ rjf: Decide On Backend\r\n\r\n#if !defined(R_BACKEND) && OS_WINDOWS\r\n# define R_BACKEND R_BACKEND_D3D11\r\n#elif !defined(R_BACKEND) && OS_LINUX\r\n# define R_BACKEND R_BACKEND_OPENGL\r\n#endif\r\n\r\n////////////////////////////////\r\n//~ rjf: Main Includes\r\n\r\n#include \"render_core.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Backend Includes\r\n\r\n#if R_BACKEND == R_BACKEND_STUB\r\n# include \"stub/render_stub.h\"\r\n#elif R_BACKEND == R_BACKEND_D3D11\r\n# include \"d3d11/render_d3d11.h\"\r\n#elif R_BACKEND == R_BACKEND_OPENGL\r\n# include \"opengl/render_opengl.h\"\r\n#else\r\n# error Renderer backend not specified.\r\n#endif\r\n\r\n#endif // RENDER_INC_H\r\n"
  },
  {
    "path": "src/render/stub/render_stub.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- rjf: top-level layer initialization\r\n\r\nr_hook void\r\nr_init(CmdLine *cmdln)\r\n{\r\n}\r\n\r\n//- rjf: window setup/teardown\r\n\r\nr_hook R_Handle\r\nr_window_equip(OS_Handle window)\r\n{\r\n  R_Handle handle = {0};\r\n  handle.u64[0] = 1;\r\n  return handle;\r\n}\r\n\r\nr_hook void\r\nr_window_unequip(OS_Handle window, R_Handle window_equip)\r\n{\r\n}\r\n\r\n//- rjf: textures\r\n\r\nr_hook R_Handle\r\nr_tex2d_alloc(R_ResourceKind kind, Vec2S32 size, R_Tex2DFormat format, void *data)\r\n{\r\n  R_Handle handle = {0};\r\n  handle.u64[0] = 1;\r\n  return handle;\r\n}\r\n\r\nr_hook void\r\nr_tex2d_release(R_Handle texture)\r\n{\r\n}\r\n\r\nr_hook R_ResourceKind\r\nr_kind_from_tex2d(R_Handle texture)\r\n{\r\n  return R_ResourceStatic;\r\n}\r\n\r\nr_hook Vec2S32\r\nr_size_from_tex2d(R_Handle texture)\r\n{\r\n  return v2s32(1, 1);\r\n}\r\n\r\nr_hook R_Tex2DFormat\r\nr_format_from_tex2d(R_Handle texture)\r\n{\r\n  return R_Tex2DFormat_RGBA8;\r\n}\r\n\r\nr_hook void\r\nr_fill_tex2d_region(R_Handle texture, Rng2S32 subrect, void *data)\r\n{\r\n}\r\n\r\n//- rjf: buffers\r\n\r\nr_hook R_Handle\r\nr_buffer_alloc(R_ResourceKind kind, U64 size, void *data)\r\n{\r\n  R_Handle handle = {0};\r\n  handle.u64[0] = 1;\r\n  return handle;\r\n}\r\n\r\nr_hook void\r\nr_buffer_release(R_Handle buffer)\r\n{\r\n}\r\n\r\n//- rjf: frame markers\r\n\r\nr_hook void\r\nr_begin_frame(void)\r\n{\r\n}\r\n\r\nr_hook void\r\nr_end_frame(void)\r\n{\r\n}\r\n\r\nr_hook void\r\nr_window_begin_frame(OS_Handle window, R_Handle window_equip)\r\n{\r\n}\r\n\r\nr_hook void\r\nr_window_end_frame(OS_Handle window, R_Handle window_equip)\r\n{\r\n}\r\n\r\n//- rjf: render pass submission\r\n\r\nr_hook void\r\nr_window_submit(OS_Handle window, R_Handle window_equip, R_PassList *passes)\r\n{\r\n}\r\n"
  },
  {
    "path": "src/render/stub/render_stub.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef RENDER_STUB_H\r\n#define RENDER_STUB_H\r\n\r\n#endif // RENDER_STUB_H\r\n"
  },
  {
    "path": "src/scratch/debugstringperf.c",
    "content": "#include <windows.h>\n\nDWORD thread_entry_point(void *p)\n{\n  for(int i = 0; i < 100000; i += 1)\n  {\n    OutputDebugString(\"this is a test\\n\");\n  }\n  return 0;\n}\n\nint main(int argc, char **argv)\n{\n  HANDLE threads[] =\n  {\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n    CreateThread(0, 0, thread_entry_point, 0, 0, 0),\n  };\n  for(int i = 0; i < sizeof(threads)/sizeof(threads[0]); i += 1)\n  {\n    WaitForSingleObject(threads[i], INFINITE);\n  }\n  return 0;\n}\n"
  },
  {
    "path": "src/scratch/eval_scratch.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n//- rjf: [h]\r\n#include \"base/base_inc.h\"\r\n#include \"os/os_inc.h\"\r\n#include \"rdi_format/rdi_format_local.h\"\r\n#include \"regs/regs.h\"\r\n#include \"regs/rdi/regs_rdi.h\"\r\n#include \"eval/eval_inc.h\"\r\n\r\n//- rjf: [c]\r\n#include \"base/base_inc.c\"\r\n#include \"os/os_inc.c\"\r\n#include \"rdi_format/rdi_format_local.c\"\r\n#include \"regs/regs.c\"\r\n#include \"regs/rdi/regs_rdi.c\"\r\n#include \"eval/eval_inc.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Entry Point\r\n\r\ninternal void\r\nentry_point(CmdLine *cmdline)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  E_TypeCtx *type_ctx = push_array(arena, E_TypeCtx, 1);\r\n  e_select_type_ctx(type_ctx);\r\n  E_ParseCtx *parse_ctx = push_array(arena, E_ParseCtx, 1);\r\n  e_select_parse_ctx(parse_ctx);\r\n  E_IRCtx *ir_ctx = push_array(arena, E_IRCtx, 1);\r\n  e_select_ir_ctx(ir_ctx);\r\n  E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1);\r\n  e_select_interpret_ctx(interpret_ctx, 0, 0);\r\n  String8 exprs[] =\r\n  {\r\n    str8_lit(\"123\"),\r\n    str8_lit(\"1 + 2\"),\r\n    str8_lit(\"foo\"),\r\n    str8_lit(\"foo(bar)\"),\r\n    str8_lit(\"foo(bar(baz))\"),\r\n  };\r\n  for EachElement(idx, exprs)\r\n  {\r\n    String8 debug_string = e_debug_log_from_expr_string(arena, exprs[idx]);\r\n    raddbg_log(\"%S\", debug_string);\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/scratch/parse_inline_sites.c",
    "content": "#define BUILD_CONSOLE_INTERFACE 1\n\n#include \"base/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"coff/coff.h\"\n#include \"codeview/codeview.h\"\n#include \"codeview/codeview_parse.h\"\n#include \"msf/msf.h\"\n#include \"msf/msf_parse.h\"\n#include \"pdb/pdb.h\"\n#include \"pdb/pdb_parse.h\"\n#include \"pdb/pdb_stringize.h\"\n\n#include \"base/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"coff/coff.c\"\n#include \"codeview/codeview.c\"\n#include \"codeview/codeview_parse.c\"\n#include \"msf/msf.c\"\n#include \"msf/msf_parse.c\"\n#include \"pdb/pdb.c\"\n#include \"pdb/pdb_parse.c\"\n#include \"pdb/pdb_stringize.c\"\n\n////////////////////////////////\n\n#include \"linker/base_ext/base_blake3.h\"\n#include \"linker/base_ext/base_blake3.c\"\n#include \"third_party/md5/md5.c\"\n#include \"third_party/md5/md5.h\"\n#include \"third_party/xxHash/xxhash.c\"\n#include \"third_party/xxHash/xxhash.h\"\n\n#include \"linker/base_ext/base_inc.h\"\n#include \"linker/hash_table.h\"\n#include \"linker/thread_pool/thread_pool.h\"\n#include \"linker/codeview_ext/codeview.h\"\n\n#include \"linker/base_ext/base_inc.c\"\n#include \"linker/hash_table.c\"\n#include \"linker/thread_pool/thread_pool.c\"\n#include \"linker/codeview_ext/codeview.c\"\n\ninternal void\nprint_inline_binary_annotations(String8 binary_annots)\n{\n  U32 code_offset = 0;\n  S32 line_offset = 0;\n  \n  for (U64 cursor = 0; cursor < binary_annots.size; ) {\n    U64 op_offset = cursor;\n    CV_InlineBinaryAnnotation op = CV_InlineBinaryAnnotation_Null;\n    cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &op);\n    \n    fprintf(stdout, \"\\t\\t[%04llX] \", op_offset);\n    switch (op) {\n      case CV_InlineBinaryAnnotation_Null: {\n        fprintf(stdout, \"End\");\n        cursor = binary_annots.size;\n      } break;\n      case CV_InlineBinaryAnnotation_CodeOffset: {\n        U32 value = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &value);\n        code_offset += value;\n        fprintf(stdout, \"CodeOffset: 0x%X; Code 0x%X\", value, code_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeOffsetBase: {\n        U32 delta;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta);\n        code_offset += delta;\n        fprintf(stdout, \"ChangeCodeOffsetBase: 0x%X; Code 0x%X\", delta, code_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeOffset: {\n        U32 delta = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta);\n        code_offset += delta;\n        fprintf(stdout, \"ChangeCodeOffset: 0x%X; Code 0x%X\", delta, code_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeLength: {\n        U32 delta = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &delta);\n        code_offset += delta;\n        fprintf(stdout, \"ChangeCodeLength: 0x%X; Code End 0x%X\", delta, code_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeFile: {\n        U32 file_id = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &file_id);\n        fprintf(stdout, \"ChangeFile: 0x%X\", file_id);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeLineOffset: {\n        S32 delta = 0;\n        cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &delta);\n        line_offset += delta;\n        fprintf(stdout, \"ChangeLineOffset: %d; Line %d\", delta, line_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeLineEndDelta: {\n        S32 end_delta = 0;\n        cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &end_delta);\n        line_offset += end_delta;\n        fprintf(stdout, \"ChangeLineEndDelta: %d; Line %d\", end_delta, line_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeRangeKind: {\n        CV_InlineRangeKind range_kind = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &range_kind);\n        String8 range_kind_str = cv_string_from_inline_range_kind(range_kind);\n        fprintf(stdout, \"ChangeRangeKind: %.*s (%u)\", str8_varg(range_kind_str), range_kind);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeColumnStart: {\n        S32 delta = 0;\n        cursor += cv_decode_inline_annot_s32(binary_annots, cursor, &delta);\n        fprintf(stdout, \"ChangeColumnStart: %d\", delta);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeOffsetAndLineOffset: {\n        U32 code_offset_and_line_offset = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_offset_and_line_offset);\n        S32 line_delta = cv_inline_annot_signed_from_unsigned_operand(code_offset_and_line_offset >> 4);\n        U32 code_delta = code_offset_and_line_offset & 0xF; \n        line_offset += line_delta;\n        code_offset += code_delta;\n        fprintf(stdout, \"ChnageCodeOffsetAndLineOffset: 0x%X %d; Code 0x%X Line %d\", code_delta, line_delta, code_offset, line_offset);\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeCodeLengthAndCodeOffset: {\n        U32 code_length_delta = 0;\n        U32 code_offset_delta = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_length_delta);\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &code_offset_delta);\n        code_offset += code_offset_delta;\n        fprintf(stdout, \"ChangeCodeLengthAndCodeOffset: %u 0x%X; Code 0x%X Code End 0x%X\", code_length_delta, code_offset_delta, code_offset, code_offset + code_length_delta);\n        code_offset += code_length_delta;\n      } break;\n      case CV_InlineBinaryAnnotation_ChangeColumnEnd: {\n        U32 column_end = 0;\n        cursor += cv_decode_inline_annot_u32(binary_annots, cursor, &column_end);\n        fprintf(stdout, \"ChangeColumnEnd: %u\", column_end);\n      } break;\n      default: {\n        fprintf(stdout, \"Unknown Inline Binary Annotation Op Code: 0x%X\", op);\n      } break;\n    }\n    fprintf(stdout, \"\\n\");\n  }\n}\n\ninternal void\nentry_point(CmdLine *cmdl)\n{\n  Arena *arena = arena_alloc();\n  \n  B32 do_help = cmd_line_has_flag(cmdl, str8_lit(\"help\")) ||\n    cmd_line_has_flag(cmdl, str8_lit(\"h\")) ||\n  (cmdl->inputs.node_count == 0 && cmdl->options.count == 0);\n  if (do_help) {\n    fprintf(stdout, \n            \"Parse Inline Sites\\n\"\n            \"\\t-pdb:<file_path>\\n\"\n            \"\\t-comp_unit=<int>\\n\"\n            \"\\t-base_addr=<int>\\n\"\n            \"\\t-help\\n\");\n    return;\n  }\n  \n  // -comp_unit\n  U64 single_comp_unit_idx = max_U64;\n  B32 single_comp_unit_mode = cmd_line_has_argument(cmdl, str8_lit(\"comp_unit\"));\n  if (single_comp_unit_mode) {\n    String8 comp_unit_str = cmd_line_string(cmdl, str8_lit(\"comp_unit\"));\n    if (!try_u64_from_str8_c_rules(comp_unit_str, &single_comp_unit_idx)) {\n      fprintf(stderr, \"ERROR: unable to parse -comp_unit=%.*s\\n\", str8_varg(comp_unit_str));\n      return;\n    }\n  }\n  \n  // -base_addr\n  U64 base_addr = 0;\n  String8 base_str = cmd_line_string(cmdl, str8_lit(\"base_addr\"));\n  try_u64_from_str8_c_rules(base_str, &base_addr);\n  \n  // -pdb\n  String8 pdb_name;\n  if (cmd_line_has_argument(cmdl, str8_lit(\"pdb\"))) { \n    pdb_name = cmd_line_string(cmdl, str8_lit(\"pdb\"));\n    if (pdb_name.size == 0) {\n      fprintf(stderr, \"ERROR: missing -pdb:<path>\\n\");\n      return;\n    }\n  } else {\n    if (cmdl->inputs.node_count == 1) {\n      pdb_name = cmdl->inputs.first->string;\n    } else if (cmdl->inputs.node_count == 0) {\n      fprintf(stderr, \"ERROR: no input PDB!\\n\");\n      return;\n    } else if (cmdl->inputs.node_count > 1) {\n      fprintf(stderr, \"ERROR: too many inputs\\n\");\n      return;\n    }\n  }\n  \n  // read PDB from disk\n  String8 pdb_data = os_data_from_file_path(arena, pdb_name);\n  if (pdb_data.size == 0) {\n    fprintf(stderr, \"ERROR: unable to load %.*s from disk\\n\", str8_varg(pdb_name));\n    return;\n  }\n  \n  // parse msf\n  MSF_Parsed *msf = msf_parsed_from_data(arena, pdb_data);\n  if (!msf) {\n    fprintf(stderr, \"ERROR: unable to parse MSF\\n\");\n    return;\n  }\n  \n  // find dbi\n  String8        dbi_data = msf_data_from_stream(msf, PDB_FixedStream_Dbi);\n  PDB_DbiParsed *dbi      = pdb_dbi_from_data(arena, dbi_data);\n  if (!dbi) {\n    fprintf(stderr, \"ERROR: unable to parse DBI\\n\");\n    return;\n  }\n  \n  // find info stream\n  String8   info_data = msf_data_from_stream(msf, PDB_FixedStream_Info);\n  PDB_Info *info      = pdb_info_from_data(arena, info_data);\n  if (!info) {\n    fprintf(stderr, \"ERROR: unable to parse INFO\\n\");\n  }\n  \n  // parse named streams\n  PDB_NamedStreamTable *named_streams = pdb_named_stream_table_from_info(arena, info);\n  if (!named_streams) {\n    fprintf(stderr, \"ERROR: unable to parse named streams\\n\");\n    return;\n  }\n  \n  // find string table\n  MSF_StreamNumber strtbl_sn   = named_streams->sn[PDB_NamedStream_StringTable];\n  String8          strtbl_data = msf_data_from_stream(msf, strtbl_sn);\n  PDB_Strtbl      *strtbl      = pdb_strtbl_from_data(arena, strtbl_data);\n  if (!strtbl) {\n    fprintf(stderr, \"ERROR: unable to parse string table\\n\");\n    return;\n  }\n  \n  // find IPI\n  String8        ipi_data        = msf_data_from_stream(msf, PDB_FixedStream_Ipi);\n  PDB_TpiParsed *ipi             = pdb_tpi_from_data(arena, ipi_data);\n  String8        ipi_leaf_data   = pdb_leaf_data_from_tpi(ipi);\n  CV_LeafParsed *ipi_leaf_parsed = cv_leaf_from_data(arena, ipi_leaf_data, ipi->itype_first);\n  \n  // find sections\n  MSF_StreamNumber        section_stream = dbi->dbg_streams[PDB_DbiStream_SECTION_HEADER];\n  String8                 section_data   = msf_data_from_stream(msf, section_stream);\n  COFF_SectionHeaderArray sections       = pdb_coff_section_array_from_data(arena, section_data);\n  \n  // find comp units\n  String8            comp_units_data = pdb_data_from_dbi_range(dbi, PDB_DbiRange_ModuleInfo);\n  PDB_CompUnitArray *comp_units      = pdb_comp_unit_array_from_data(arena, comp_units_data);\n  \n  if (single_comp_unit_mode) {\n    if (single_comp_unit_idx >= comp_units->count) {\n      fprintf(stderr, \"comp unit idx %llu is out of bounds, PDB has %llu comp unit(s)\\n\", single_comp_unit_idx, comp_units->count);\n      return;\n    }\n  }\n  \n#if 0\n  // print run info\n  DateTime now_time_universal = os_now_universal_time();\n  DateTime now_time_local     = os_local_time_from_universal_time(&now_time_universal);\n  String8  now_time_str       = string_from_date_time(arena, &now_time_local);\n  fprintf(stdout, \"Time: %.*s\\n\", str8_varg(now_time_str));\n  fprintf(stdout, \"File: %.*s\\n\", str8_varg(pdb_name));\n  fprintf(stdout, \"Size: %llu (bytes)\\n\", pdb_data.size);\n  fprintf(stdout, \"\\n\");\n#endif\n  \n  // prepare iterator\n  U64 comp_unit_idx;\n  U64 comp_unit_count;\n  if (single_comp_unit_mode) {\n    comp_unit_idx   = single_comp_unit_idx;\n    comp_unit_count = single_comp_unit_idx + 1;\n  } else {\n    comp_unit_idx   = 0;\n    comp_unit_count = comp_units->count;\n  }\n  \n  for (; comp_unit_idx < comp_unit_count; ++comp_unit_idx) {\n    PDB_CompUnit *comp_unit     = comp_units->units[comp_unit_idx];\n    String8       symbol_data   = pdb_data_from_unit_range(msf, comp_unit, PDB_DbiCompUnitRange_Symbols);\n    String8       c13_data      = pdb_data_from_unit_range(msf, comp_unit, PDB_DbiCompUnitRange_C13);\n    \n    // parse $$\n    CV_DebugS debug_s = cv_parse_debug_s_c13(arena, c13_data);\n    \n    // find $$FILE_CKSMS\n    String8 file_chksms = cv_file_chksms_from_debug_s(debug_s);\n    \n    // parse $$INLINEE_LINES \n    String8List                  ss_inlinee_lines     = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines);\n    CV_C13InlineeLinesParsedList inlinee_lines_parsed = cv_c13_inlinee_lines_from_sub_sections(arena, ss_inlinee_lines);\n    \n    // parse $$LINES\n    U64           c13_lines_count = 0;\n    CV_LineArray *c13_lines       = 0;\n    {\n      String8List raw_lines_list = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_Lines);\n      \n      for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) {\n        Temp temp = temp_begin(arena);\n        CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(temp.arena, raw_lines_node->string, rng_1u64(0, raw_lines_node->string.size));\n        c13_lines_count += parsed_list.count;\n        temp_end(temp);\n      }\n      \n      c13_lines = push_array_no_zero(arena, CV_LineArray, c13_lines_count);\n      \n      U64 c13_lines_idx = 0;\n      for (String8Node *raw_lines_node = raw_lines_list.first; raw_lines_node != 0; raw_lines_node = raw_lines_node->next) {\n        String8               raw_lines   = raw_lines_node->string;\n        CV_C13LinesHeaderList parsed_list = cv_c13_lines_from_sub_sections(arena, raw_lines, rng_1u64(0, raw_lines.size));\n        \n        for(CV_C13LinesHeaderNode *header_node = parsed_list.first; header_node != 0; header_node = header_node->next) {\n          if (0 < header_node->v.sec_idx && header_node->v.sec_idx <= sections.count) {\n            Assert(c13_lines_idx < c13_lines_count);\n            U64 sec_voff = sections.v[header_node->v.sec_idx - 1].voff;\n            c13_lines[c13_lines_idx++] = cv_c13_line_array_from_data(arena, raw_lines, sec_voff, header_node->v);\n          } else {\n            Assert(!\"error: out of bounds section index\"); \n          }\n        }\n      }\n    }\n    \n    String8List                  raw_inlinee_lines = cv_sub_section_from_debug_s(debug_s, CV_C13SubSectionKind_InlineeLines);\n    CV_C13InlineeLinesParsedList inlinee_lines     = cv_c13_inlinee_lines_from_sub_sections(arena, raw_inlinee_lines);\n    \n    CV_InlineeLinesAccel *inlinee_lines_accel = cv_c13_make_inlinee_lines_accel(arena, inlinee_lines);\n    CV_LinesAccel        *lines_accel         = cv_c13_make_lines_accel(arena, c13_lines_count, c13_lines);\n    \n    fprintf(stdout, \"[%llu] %.*s\\n\", comp_unit_idx, str8_varg(comp_unit->obj_name));\n    \n    U64     scope_level = 0;\n    U64     parent_voff = 0;\n    String8 parent_name = str8_lit(\"???\");\n    \n    CV_SymbolList symbol_list = {0};\n    cv_parse_symbol_sub_section(arena, &symbol_list, 0, symbol_data, CV_SymbolAlign);\n    \n    for (CV_SymbolNode *symbol_n = symbol_list.first; symbol_n != 0; symbol_n = symbol_n->next) {\n      CV_Symbol  symbol  = symbol_n->data;\n      void      *rec_raw = symbol.data.str;\n      void      *rec_opl = symbol.data.str + symbol.data.size;\n      \n      if (symbol.kind == CV_SymKind_LPROC32 || symbol.kind == CV_SymKind_GPROC32) {\n        CV_SymProc32 *proc32 = rec_raw;\n        parent_voff = sections.v[proc32->sec-1].voff + proc32->off;\n        parent_name = str8_cstring_capped(proc32+1, rec_opl);\n        \n        scope_level += 1;\n      } else if (symbol.kind == CV_SymKind_BLOCK32) {\n        scope_level += 1;\n      } else if (symbol.kind == CV_SymKind_END) {\n        if (parent_voff) {\n          Assert(scope_level > 0);\n          scope_level -= 1;\n          if (scope_level == 0) {\n            parent_voff = 0;\n            parent_name = str8_lit(\"???\");\n          }\n        }\n      } else if (symbol.kind == CV_SymKind_INLINESITE) {\n        CV_SymInlineSite            *inline_site         = rec_raw;\n        String8                      binary_annots       = str8_skip(symbol.data, sizeof(*inline_site));\n        CV_C13InlineeLinesParsed    *inlinee_parsed      = cv_c13_inlinee_lines_accel_find(inlinee_lines_accel, inline_site->inlinee);\n        CV_InlineBinaryAnnotsParsed  binary_annots_parse = cv_c13_parse_inline_binary_annots(arena, parent_voff, inlinee_parsed, binary_annots);\n        \n        \n        String8 inlinee_name = str8_lit(\"???\");\n        if (ipi->itype_first <= inline_site->inlinee && inline_site->inlinee < ipi->itype_opl) {\n          CV_RecRange inlinee_rec = ipi_leaf_parsed->leaf_ranges.ranges[inline_site->inlinee - ipi->itype_first];\n          void *leaf_raw = ipi_leaf_data.str + inlinee_rec.off + sizeof(CV_LeafKind);\n          void *leaf_opl = ipi_leaf_data.str + inlinee_rec.off + sizeof(CV_LeafKind) + inlinee_rec.hdr.size;\n          if (inlinee_rec.hdr.kind == CV_LeafKind_MFUNC_ID) {\n            CV_LeafMFuncId *mfunc_id = leaf_raw;\n            inlinee_name = str8_cstring_capped(mfunc_id + 1, leaf_opl);\n          } else if (inlinee_rec.hdr.kind == CV_LeafKind_FUNC_ID) {\n            CV_LeafFuncId *func_id = leaf_raw;\n            inlinee_name = str8_cstring_capped(func_id + 1, leaf_opl);\n          }\n        }\n        \n        \n        String8 first_ln  = str8_lit(\"???\");\n        String8 file_off  = str8_lit(\"???\");\n        if (inlinee_parsed) {\n          first_ln  = push_str8f(arena, \"%u\", inlinee_parsed->first_source_ln);\n          file_off  = push_str8f(arena, \"0x%X\", inlinee_parsed->file_off);\n        }\n        \n        fprintf(stdout, \"\\tInline site @ %06llX, Parent VOFF: 0x%llX (%.*s), Inlinee: 0x%X (%.*s), First LN: %.*s, File Off: %.*s\\n\",\n                (symbol.offset + sizeof(symbol.kind)),\n                parent_voff,\n                str8_varg(parent_name),\n                inline_site->inlinee,\n                str8_varg(inlinee_name),\n                str8_varg(first_ln),\n                str8_varg(file_off));\n        \n        fprintf(stdout, \"\\t\\tOpcodes:\\n\");\n        print_inline_binary_annotations(binary_annots);\n        fprintf(stdout, \"\\n\");\n        \n        fprintf(stdout, \"\\t\\tLines:\\n\");\n        for (U64 lines_idx = 0; lines_idx < binary_annots_parse.lines_count; lines_idx += 1) {\n          CV_LineArray lines = binary_annots_parse.lines[lines_idx];\n          \n          CV_C13Checksum checksum = {0};\n          str8_deserial_read_struct(file_chksms, lines.file_off, &checksum);\n          \n          String8 file_name = pdb_strtbl_string_from_off(strtbl, checksum.name_off);\n          \n          fprintf(stdout, \"\\t\\t%.*s\\n\", str8_varg(file_name));\n          for (U64 line_idx = 0; line_idx < lines.line_count; ++line_idx) {\n            char *pre  = (line_idx % 4) == 0 ? \"\\t\\t\\t\" : \"\\t\";\n            char *post = (line_idx % 4) == 3 || ((line_idx + 1) == lines.line_count) ? \"\\n\" : \"\";\n            fprintf(stdout, \"%s%08llX %04u%s\", pre, base_addr + lines.voffs[line_idx], lines.line_nums[line_idx], post);\n          }\n        }\n        fprintf(stdout, \"\\n\");\n        \n        fprintf(stdout, \"\\t\\tCode Ranges:\\n\");\n        U64 range_idx = 0;\n        for (Rng1U64Node *range_n = binary_annots_parse.code_ranges.first; range_n != 0; range_n = range_n->next, ++range_idx) {\n          char *pre  = (range_idx % 4) == 0 ? \"\\t\\t\\t\" : \"\\t\";\n          char *post = (range_idx % 4) == 3 || ((range_idx + 1) == binary_annots_parse.code_ranges.count) ? \"\\n\" : \"\";\n          fprintf(stdout, \"%s%08llX-%08llX%s\", pre, base_addr + range_n->v.min, base_addr + range_n->v.max, post);\n        }\n        fprintf(stdout, \"\\n\");\n      }\n    }\n  }\n}\n\n\n"
  },
  {
    "path": "src/scratch/ryan_scratch.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Build Options\r\n\r\n#define BUILD_TITLE \"ryan_scratch\"\r\n#define BUILD_CONSOLE_INTERFACE 1\r\n\r\n////////////////////////////////\r\n//~ rjf: Includes\r\n\r\n//- rjf: [h]\r\n#include \"base/base_inc.h\"\r\n#include \"os/os_inc.h\"\r\n#include \"content/content.h\"\r\n#include \"artifact_cache/artifact_cache.h\"\r\n#include \"file_stream/file_stream.h\"\r\n#include \"rdi/rdi_local.h\"\r\n#include \"dbg_info/dbg_info.h\"\r\n\r\n//- rjf: [c]\r\n#include \"base/base_inc.c\"\r\n#include \"os/os_inc.c\"\r\n#include \"content/content.c\"\r\n#include \"artifact_cache/artifact_cache.c\"\r\n#include \"file_stream/file_stream.c\"\r\n#include \"rdi/rdi_local.c\"\r\n#include \"dbg_info/dbg_info.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Entry Point\r\n\r\ninternal void\r\nentry_point(CmdLine *cmdline)\r\n{\r\n  local_persist char *pdb_paths[] =\r\n  {\r\n    \"C:/devel/raddebugger/build/raddbg.pdb\",\r\n    // #include \"fn_debug_infos.inc\"\r\n  };\r\n  \r\n  DI_Key keys[ArrayCount(pdb_paths)] = {0};\r\n  for EachElement(idx, pdb_paths)\r\n  {\r\n    String8 path = str8_cstring(pdb_paths[idx]);\r\n    keys[idx] = di_key_from_path_timestamp(path, 0);\r\n    di_open(keys[idx]);\r\n  }\r\n  \r\n  for(;;)\r\n  {\r\n    Access *access = access_open();\r\n    B32 got_all_rdis = 1;\r\n    U64 num_rdis_loaded = 0;\r\n    for EachElement(idx, pdb_paths)\r\n    {\r\n      RDI_Parsed *rdi = di_rdi_from_key(access, keys[idx], 1, 0);\r\n      if(rdi == &rdi_parsed_nil)\r\n      {\r\n        got_all_rdis = 0;\r\n      }\r\n      else\r\n      {\r\n        num_rdis_loaded += 1;\r\n      }\r\n    }\r\n    printf(\"\\rloaded [%I64u/%I64u], %I64u active threads, %I64u active processes\", num_rdis_loaded, ArrayCount(pdb_paths), di_shared->conversion_thread_count, di_shared->conversion_process_count);\r\n    access_close(access);\r\n    if(got_all_rdis)\r\n    {\r\n      Access *access = access_open();\r\n      String8 search_query = str8_lit(\"rd_\");\r\n      DI_SearchItemArray items = di_search_item_array_from_target_query(access, RDI_SectionKind_Procedures, search_query, max_U64);\r\n      printf(\"\\n\");\r\n      printf(\"fuzzy searched for %.*s, found %I64u items\\n\", str8_varg(search_query), items.count);\r\n      access_close(access);\r\n      \r\n      String8 match_query = str8_lit(\"rd_frame\");\r\n      DI_Match match = di_match_from_string(match_query, 0, max_U64);\r\n      printf(\"searched for %.*s, found at %i in [%I64x:%I64x]\\n\", str8_varg(match_query), match.idx, match.key.u64[0], match.key.u64[1]);\r\n      \r\n      break;\r\n    }\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/scratch/textperf.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: Build Options\n\n#define BUILD_TITLE \"textperf\"\n#define OS_FEATURE_GRAPHICAL 1\n\n////////////////////////////////\n//~ rjf: Includes\n\n//- rjf: [h]\n#include \"base/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"render/render_inc.h\"\n#include \"font_provider/font_provider_inc.h\"\n#include \"font_cache/font_cache.h\"\n#include \"draw/draw.h\"\n\n//- rjf: [c]\n#include \"base/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"render/render_inc.c\"\n#include \"font_provider/font_provider_inc.c\"\n#include \"font_cache/font_cache.c\"\n#include \"draw/draw.c\"\n\n////////////////////////////////\n//~ rjf: Globals\n\nglobal OS_Handle os_window = {0};\nglobal R_Handle r_window = {0};\n\n////////////////////////////////\n//~ rjf: Entry Points\n\ninternal B32\nframe(void)\n{\n  ProfBeginFunction();\n  B32 quit = 0;\n  Temp scratch = scratch_begin(0, 0);\n  OS_EventList events = os_get_events(scratch.arena, 0);\n  for(OS_Event *evt = events.first; evt != 0; evt = evt->next)\n  {\n    if(evt->kind == OS_EventKind_WindowClose)\n    {\n      quit = 1;\n      break;\n    }\n  }\n  r_begin_frame();\n  dr_begin_frame(fnt_tag_zero());\n  r_window_begin_frame(os_window, r_window);\n  DR_Bucket *bucket = dr_bucket_make();\n  DR_BucketScope(bucket) ProfScope(\"draw\")\n  {\n    Vec2F32 mouse = os_mouse_from_window(os_window);\n    FNT_Tag font = fnt_tag_from_path(str8_lit(\"C:/devel/raddebugger/data/Inconsolata-Regular.ttf\"));\n    for(F32 x = 0; x < 500; x += 5.f)\n    {\n      for(F32 y = 0; y < 500; y += 5.f)\n      {\n        dr_text(font, 16.f, 0, 0, FNT_RasterFlag_Smooth|FNT_RasterFlag_Hinted, v2f32(30 + x + mouse.x, 30 + y + mouse.y), v4f32(1, 1, 1, 1), str8_lit(\"This is a test.\"));\n      }\n    }\n  }\n  r_window_submit(os_window, r_window, &bucket->passes);\n  r_window_end_frame(os_window, r_window);\n  r_end_frame();\n  scratch_end(scratch);\n  ProfEnd();\n  return quit;\n}\n\ninternal void\nentry_point(CmdLine *cmdline)\n{\n  os_window = os_window_open(r2f32p(0, 0, 1600, 900), OS_WindowFlag_UseDefaultPosition, str8_lit(\"textperf\"));\n  r_window = r_window_equip(os_window);\n  os_window_first_paint(os_window);\n  for(;!update(););\n}\n"
  },
  {
    "path": "src/stap/stap_parse.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal B32\r\nstap_is_scale_valid(U64 scale)\r\n{\r\n  return IsPow2(scale) && scale <= 8;\r\n}\r\n\r\ninternal U64\r\nstap_parse_digit(U8 *begin, U8 *end, U64 *digit_out)\r\n{\r\n  U8 *ptr = begin;\r\n  if (ptr < end && *ptr == '-') {\r\n    ptr += 1;\r\n  }\r\n  for (;ptr < end; ptr += 1) {\r\n    if (!char_is_digit(*ptr, 10)) { break; }\r\n  }\r\n  String8 digit_str = str8(begin, (U64)(ptr - begin));\r\n  if (digit_out) {\r\n    *digit_out = u64_from_str8(digit_str, 10);\r\n  }\r\n  return digit_str.size;\r\n}\r\n\r\ninternal U64\r\nstap_skip_whitespace(U8 *begin, U8 *end)\r\n{\r\n  U8 *ptr = begin;\r\n  for (; ptr < end && *ptr == ' '; ptr += 1);\r\n  U64 size = (U64)(ptr - begin);\r\n  return size;\r\n}\r\n\r\ninternal U64\r\nstap_parse_ident(U8 *begin, U8 *end, String8 *ident_out)\r\n{\r\n  U8 *ptr = begin;\r\n  for (; ptr < end; ptr += 1) {\r\n    if (!char_is_alpha(*ptr) && !char_is_digit(*ptr, 10)) { break; }\r\n  }\r\n  String8 ident = str8(begin, (U64)(ptr - begin));\r\n  if (ident_out) { *ident_out = ident; }\r\n  return ident.size;\r\n}\r\n\r\ninternal U64\r\nstap_size_from_arg(String8 string)\r\n{\r\n  U64 tag_sep      = str8_find_needle(string, 0, str8_lit(\"@\"), 0);\r\n  U64 next_tag_sep = str8_find_needle(string, tag_sep + 1, str8_lit(\"@\"), 0);\r\n  U64 arg_end      = str8_find_needle_reverse(string, string.size - next_tag_sep, str8_lit(\" \"), 0);\r\n  return arg_end == 0 ? string.size : arg_end;\r\n}\r\n\r\ninternal String8List\r\nstap_list_from_string(Arena *arena, String8 string)\r\n{\r\n  String8List result = {0};\r\n  for (U64 cursor = 0, arg_size; cursor < string.size; cursor += arg_size) {\r\n    arg_size = stap_size_from_arg(str8_skip(string, cursor));\r\n    String8 arg = str8_substr(string, r1u64(cursor, cursor + arg_size));\r\n    str8_list_push(arena, &result, arg);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal String8\r\nstap_parse_args_x64(String8 string, STAP_Arg *arg_out)\r\n{\r\n  String8 error = str8_lit(\"unknown parse error\");\r\n  U64 sep_pos = str8_find_needle(string, 0, str8_lit(\"@\"), 0);\r\n  if (sep_pos < string.size) {\r\n    STAP_Arg arg = {0};\r\n\r\n    String8 tag  = str8_prefix(string, sep_pos + 1);\r\n    String8 oper = str8_skip(string, tag.size);\r\n\r\n    STAP_ArgValueType arg_value_type       = STAP_ArgValueType_Null;\r\n    U64               arg_value_size       = 0;\r\n    B32               infer_arg_value_size = 1;\r\n    U64               tag_size             = 0;\r\n    {\r\n      U8 *ptr = tag.str, *end = tag.str + tag.size;\r\n\r\n      // is signed?\r\n      if (ptr >= end) { goto operand_parse_exit; }\r\n      if (*ptr == '-') {\r\n        arg_value_type = STAP_ArgValueType_S;\r\n        ptr += 1;\r\n      }\r\n\r\n      // parse optional size\r\n      if (ptr >= end) { goto operand_parse_exit; }\r\n      if (char_is_digit(*ptr, 10)) {\r\n        arg_value_size = *ptr - '0';\r\n        if (!stap_is_scale_valid(arg_value_size)) {\r\n          error = str8_lit(\"invalid operand size\");\r\n          goto operand_parse_exit;\r\n        }\r\n        ptr += 1;\r\n        infer_arg_value_size = 0;\r\n      }\r\n\r\n      // is this float?\r\n      if (ptr >= end) { goto operand_parse_exit; }\r\n      if (*ptr == 'f') {\r\n        if (arg_value_type != STAP_ArgValueType_Null) {\r\n          error = str8_lit(\"illegal combination of modifiers '-' and 'f'\");\r\n          goto operand_parse_exit;\r\n        }\r\n        ptr += 1;\r\n        arg_value_type = STAP_ArgValueType_F;\r\n      }\r\n\r\n      // assume default value type to be unsigned\r\n      if (arg_value_type == STAP_ArgValueType_Null) {\r\n        arg_value_type = STAP_ArgValueType_U;\r\n      }\r\n\r\n      if (ptr >= end) { goto operand_parse_exit; }\r\n      if (*ptr != '@') {\r\n        error = str8_lit(\"failed to find @\");\r\n        goto operand_parse_exit;\r\n      }\r\n      ptr += 1;\r\n\r\n      tag_size = (U64)(ptr - tag.str);\r\n    }\r\n\r\n    U64 memory_ref_start = str8_find_needle_reverse(oper, 0, str8_lit(\"(\"), 0);\r\n    // memory operand\r\n    if (memory_ref_start > 0 && memory_ref_start < oper.size) {\r\n      //\r\n      // Expected syntax for memory operand: { [Disp] (Base [',' Index [',' Scale]]) } | { $IMM } | { %reg }\r\n      //\r\n      //  Disp:  { [+|-]Digits } | { Expr }\r\n      //  Base:  %reg\r\n      //  Index: %reg\r\n      //  Scale: 1|2|4|8\r\n      //  Expr:  A small C-like infix expression\r\n      //\r\n\r\n      // find closing ')'\r\n      U64 memory_ref_end = str8_find_needle(oper, memory_ref_start+1, str8_lit(\")\"), 0);\r\n      if (memory_ref_end > oper.size) {\r\n        error = str8_lit(\"missing closing ')'\");\r\n        goto operand_parse_exit;\r\n      }\r\n      if (memory_ref_end >= oper.size) {\r\n        error = str8_lit(\"expression does not terminate after ')'\");\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      // parse displacement\r\n      String8 disp_str = str8_skip_chop_whitespace(str8_prefix(oper, memory_ref_start-1));\r\n      if (disp_str.size > 0 && !str8_is_integer_signed(disp_str, 10)) {\r\n        error = str8_lit(\"displacement is too complicated, only integral displacement is supported\");\r\n        goto operand_parse_exit;\r\n      }\r\n      S64 disp = s64_from_str8(disp_str, 10);\r\n\r\n      // parse base, index, scale\r\n      String8 base_index_scale = str8_skip_chop_whitespace(str8_substr(oper, r1u64(memory_ref_start, memory_ref_end)));\r\n      U64     first_comma      = str8_find_needle(base_index_scale, 0, str8_lit(\",\"), 0);\r\n      U64     second_comma     = str8_find_needle(base_index_scale, first_comma+1, str8_lit(\",\"), 0);\r\n      String8 base_str         = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(0, first_comma)));\r\n      String8 index_str        = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(first_comma + 1, second_comma)));\r\n      String8 scale_str        = str8_skip_chop_whitespace(str8_substr(base_index_scale, r1u64(second_comma + 1, memory_ref_end)));\r\n\r\n      // syntax check\r\n      if(first_comma >= base_index_scale.size && base_str.size == 0) {\r\n        error = str8_lit(\"missing base register\");\r\n        goto operand_parse_exit;\r\n      }\r\n      if (first_comma < base_index_scale.size && index_str.size == 0) {\r\n        error = str8_lit(\"missing index register\");\r\n        goto operand_parse_exit;\r\n      }\r\n      if (second_comma < base_index_scale.size && scale_str.size == 0) {\r\n        error = str8_lit(\"missing scale\");\r\n        goto operand_parse_exit;\r\n      }\r\n      if (base_str.size > 0 && !str8_match(str8_lit(\"%\"), base_str, StringMatchFlag_RightSideSloppy)) {\r\n        error = str8_lit(\"invalid base register\");\r\n        goto operand_parse_exit;\r\n      }\r\n      if (first_comma < base_index_scale.size && (index_str.size < 2 || !str8_match(str8_lit(\"%\"), index_str, StringMatchFlag_RightSideSloppy))) {\r\n        error = str8_lit(\"invalid index register\");\r\n        goto operand_parse_exit;\r\n      }\r\n      if (second_comma < base_index_scale.size && (scale_str.size > 0 && !str8_is_integer(scale_str, 10))) {\r\n        error = str8_lit(\"invalid of scale (expected unsigned integral type)\");\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      // stip '%' prefix\r\n      base_str  = str8_skip(base_str, 1);\r\n      index_str = str8_skip(index_str, 1);\r\n\r\n      // parse base\r\n      B8  base_is_alias = 0;\r\n      U32 base_reg_code = 0;\r\n      if (base_str.size) {\r\n        base_reg_code = regs_reg_code_from_name(Arch_x64, base_str);\r\n        if (base_reg_code == 0) {\r\n          base_reg_code = regs_alias_code_from_name(Arch_x64, base_str);\r\n          base_is_alias = base_reg_code != 0;\r\n        }\r\n        if (base_reg_code == 0) {\r\n          error = str8_lit(\"unknown base register\");\r\n          goto operand_parse_exit;\r\n        }\r\n      }\r\n\r\n      // parse index\r\n      B8  index_is_alias = 0;\r\n      U32 index_reg_code = 0;\r\n      if (index_str.size) {\r\n        index_reg_code = regs_reg_code_from_name(Arch_x64, index_str);\r\n        if (index_reg_code == 0) {\r\n          index_reg_code = regs_alias_code_from_name(Arch_x64, index_str);\r\n          index_is_alias = index_reg_code != 0;\r\n        }\r\n        if (index_reg_code == 0) {\r\n          error = str8_lit(\"unknown index register\");\r\n        }\r\n      }\r\n      \r\n      // parse scale\r\n      U64 scale = 1;\r\n      if (scale_str.size) {\r\n        scale = u64_from_str8(scale_str, 10);\r\n        if (!stap_is_scale_valid(scale)) {\r\n          error = str8_lit(\"invalid scale value (expected 1/2/4/8)\");\r\n          goto operand_parse_exit;\r\n        }\r\n      }\r\n\r\n      if (infer_arg_value_size) {\r\n        error = str8_lit(\"memory operands must have a sice\");\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      // fill out memory ref portion\r\n      arg.type                      = STAP_ArgType_MemoryRef;\r\n      arg.memory_ref.disp           = disp;\r\n      arg.memory_ref.base.reg_code  = base_reg_code;\r\n      arg.memory_ref.base.is_alias  = base_is_alias;\r\n      arg.memory_ref.index.reg_code = index_reg_code;\r\n      arg.memory_ref.index.is_alias = index_is_alias;\r\n      arg.memory_ref.scale          = scale;\r\n    }\r\n    // $imm\r\n    else if (str8_match(str8_lit(\"$\"), oper, StringMatchFlag_RightSideSloppy)) {\r\n      String8 imm_str = str8_skip(oper, 1);\r\n\r\n      U64 imm_size = str8_find_needle(imm_str, 0, str8_lit(\" \"), 0);\r\n      if (imm_size > imm_str.size ) {\r\n        imm_size = imm_str.size;\r\n      }\r\n      imm_str = str8_prefix(imm_str, imm_size);\r\n\r\n      if (imm_str.size == 0) {\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      U64 imm       = 0;\r\n      B32 is_parsed = 0;\r\n      switch (arg_value_type) {\r\n      case STAP_ArgValueType_Null:\r\n      case STAP_ArgValueType_U:\r\n      case STAP_ArgValueType_F: {\r\n        is_parsed = try_u64_from_str8_c_rules(imm_str, &imm);\r\n      } break;\r\n      case STAP_ArgValueType_S: {\r\n        is_parsed = try_s64_from_str8_c_rules(imm_str, (S64 *)&imm);\r\n      } break;\r\n      default: { InvalidPath; } break;\r\n      }\r\n\r\n      if (!is_parsed) {\r\n        error = str8_lit(\"failed to parse immediate\");\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      arg.type = STAP_ArgType_Imm;\r\n      arg.imm  = imm;\r\n    }\r\n    // %reg\r\n    else if (str8_match(str8_lit(\"%\"), oper, StringMatchFlag_RightSideSloppy)) {\r\n      // skip % and strip white space\r\n      String8 reg_str = str8_skip_chop_whitespace(str8_skip(oper, 1));\r\n      if (reg_str.size == 0) {\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      B8  is_reg_alias = 0;\r\n      U32 reg_code     = regs_reg_code_from_name(Arch_x64, reg_str);\r\n      if (reg_code == 0) {\r\n        reg_code = regs_alias_code_from_name(Arch_x64, reg_str);\r\n        is_reg_alias = reg_code != 0;\r\n      }\r\n      if (reg_code == 0) {\r\n        error = str8_lit(\"invalid register name\");\r\n        goto operand_parse_exit;\r\n      }\r\n\r\n      arg.type         = STAP_ArgType_Reg;\r\n      arg.reg.is_alias = is_reg_alias;\r\n      arg.reg.reg_code = reg_code;\r\n    } else {\r\n      goto operand_parse_exit;\r\n    }\r\n\r\n    // fill out value portion\r\n    arg.value_type = arg_value_type == STAP_ArgValueType_Null ? STAP_ArgValueType_U : arg_value_type;\r\n    arg.value_size = arg_value_size;\r\n\r\n    // write output\r\n    if (arg_out) {\r\n      *arg_out = arg;\r\n    }\r\n\r\n    // clear error tracker\r\n    error = str8_zero();\r\n\r\noperand_parse_exit:;\r\n  } else {\r\n    error = str8_lit(\"invalid argument string\");\r\n  }\r\n\r\n  return error;\r\n}\r\n\r\ninternal STAP_ArgArray\r\nstap_arg_array_from_string(Arena *arena, Arch arch, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  String8List arg_strings = stap_list_from_string(scratch.arena, string);\r\n  STAP_ArgArray result = {0};\r\n  result.v = push_array(arena, STAP_Arg, arg_strings.node_count);\r\n  for EachNode(n, String8Node, arg_strings.first) {\r\n    STAP_Arg *arg = &result.v[result.count++];\r\n\r\n    switch (arch) {\r\n    case Arch_Null: {} break;\r\n    case Arch_x64: {\r\n      stap_parse_args_x64(n->string, arg);\r\n    } break;\r\n    case Arch_x86:\r\n    case Arch_arm32:\r\n    case Arch_arm64: { NotImplemented; } break;\r\n    default: { InvalidPath; } break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nstap_read_arg(STAP_Arg         arg,\r\n              Arch             arch,\r\n              void            *reg_block,\r\n              STAP_MemoryRead *memory_read,\r\n              void            *memory_read_ctx,\r\n              void            *raw_value)\r\n{\r\n  AssertAlways(arg.value_size <= 8);\r\n\r\n  B32 is_value_read = 0;\r\n\r\n  switch (arg.type) {\r\n  case STAP_ArgType_Null: break;\r\n  case STAP_ArgType_Imm: {\r\n    MemoryCopy(raw_value, &arg.imm, arg.value_size);\r\n    is_value_read = 1;\r\n  } break;\r\n  case STAP_ArgType_Reg: {\r\n    Rng1U64 range     = regs_range_from_code(arch, arg.reg.is_alias, arg.reg.reg_code);\r\n    U64     copy_size = Min(arg.value_size, dim_1u64(range));\r\n    MemoryCopy(raw_value, (U8 *)reg_block + range.min, copy_size);\r\n    is_value_read = 1;\r\n  } break;\r\n  case STAP_ArgType_MemoryRef: {\r\n    U64 base = 0;\r\n    if(arg.memory_ref.base.reg_code) {\r\n      Rng1U64 range     = regs_range_from_code(arch, arg.memory_ref.base.is_alias, arg.memory_ref.base.reg_code);\r\n      U64     copy_size = Min(sizeof(base), dim_1u64(range));\r\n      MemoryCopy(&base, (U8 *)reg_block + range.min, copy_size);\r\n    }\r\n\r\n    U64 index = 0;\r\n    if(arg.memory_ref.index.reg_code) {\r\n      Rng1U64 range     = regs_range_from_code(arch, arg.memory_ref.index.is_alias, arg.memory_ref.index.reg_code);\r\n      U64     copy_size = Min(sizeof(base), dim_1u64(range));\r\n      MemoryCopy(&index, (U8 *)reg_block + range.min, copy_size);\r\n    }\r\n\r\n    U64 addr = arg.memory_ref.disp + (base + index * arg.memory_ref.scale);\r\n    if (memory_read(addr, raw_value, arg.value_size, memory_read_ctx)) {\r\n      is_value_read = 1;\r\n    }\r\n  } break;\r\n  default: { InvalidPath; } break;\r\n  }\r\n\r\n  if (arg.value_size < 8) {\r\n    if (arg.value_type == STAP_ArgValueType_S) {\r\n      *(U64 *)raw_value = extend_sign64(*(U64 *)raw_value, arg.value_size);\r\n    } else if (arg.value_type == STAP_ArgValueType_F) {\r\n      Assert(arg.value_size == 4);\r\n      *(F64 *)raw_value = *(F32 *)raw_value;\r\n    }\r\n  }\r\n\r\n  return is_value_read;\r\n}\r\n\r\ninternal B32\r\nstap_read_arg_u(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, U64 *u_out)\r\n{\r\n  return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, u_out);\r\n}\r\n\r\ninternal B32\r\nstap_read_arg_s(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, S64 *s_out)\r\n{\r\n  return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, s_out);\r\n}\r\n\r\ninternal B32\r\nstap_read_arg_f(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, F64 *f_out)\r\n{\r\n  return stap_read_arg(arg, arch, reg_block, memory_read, memory_read_ctx, f_out);\r\n}\r\n\r\n"
  },
  {
    "path": "src/stap/stap_parse.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef STAP_PARSE_H\r\n#define STAP_PARSE_H\r\n\r\ntypedef enum STAP_ArgType\r\n{\r\n  STAP_ArgType_Null,\r\n  STAP_ArgType_Imm,\r\n  STAP_ArgType_Reg,\r\n  STAP_ArgType_MemoryRef,\r\n} STAP_ArgType;\r\n\r\ntypedef enum STAP_ArgValueType\r\n{\r\n  STAP_ArgValueType_Null,\r\n  STAP_ArgValueType_U,\r\n  STAP_ArgValueType_S,\r\n  STAP_ArgValueType_F,\r\n} STAP_ArgValueType;\r\n\r\ntypedef struct STAP_Arg\r\n{\r\n  STAP_ArgValueType value_type;\r\n  U64               value_size;\r\n  STAP_ArgType      type;\r\n  union {\r\n    U64 imm;\r\n    struct {\r\n      U32 reg_code;\r\n      B8 is_alias;\r\n    } reg;\r\n    struct {\r\n      S64        disp;\r\n      struct {\r\n        U32 reg_code;\r\n        B8 is_alias;\r\n      } base;\r\n      struct {\r\n        U32 reg_code;\r\n        B8 is_alias;\r\n      } index;\r\n      U64        scale;\r\n    } memory_ref;\r\n  };\r\n} STAP_Arg;\r\n\r\ntypedef struct STAP_ArgArray\r\n{\r\n  U64       count;\r\n  STAP_Arg *v;\r\n} STAP_ArgArray;\r\n\r\ntypedef struct STAP_ArgValue\r\n{\r\n  STAP_ArgValueType  value_type;\r\n  U8                 value_size;\r\n  void              *raw_ptr;\r\n} STAP_ArgValue;\r\n\r\ntypedef struct STAP_ArgValueArray\r\n{\r\n  U64            count;\r\n  STAP_ArgValue *v;\r\n} STAP_ArgValueArray;\r\n\r\n#define STAP_MEMORY_READ(name) B32 name(U64 addr, void *buffer, U64 read_size, void *raw_ctx)\r\ntypedef STAP_MEMORY_READ(STAP_MemoryRead);\r\n\r\n////////////////////////////////\r\n\r\ninternal String8 stap_parse_args_x64(String8 string, STAP_Arg *arg_out);\r\ninternal STAP_ArgArray stap_arg_array_from_string(Arena *arena, Arch arch, String8 string);\r\n\r\ninternal B32 stap_read_arg(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, void *raw_value);\r\ninternal B32 stap_read_arg_u(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, U64 *u_out);\r\ninternal B32 stap_read_arg_s(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, S64 *s_out);\r\ninternal B32 stap_read_arg_f(STAP_Arg arg, Arch arch, void *reg_block, STAP_MemoryRead *memory_read, void *memory_read_ctx, F64 *f_out);\r\n\r\n#endif // STAP_PARSE_H\r\n\r\n"
  },
  {
    "path": "src/stap/stap_test.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#define BUILD_TITLE \"STAP Parser Test\"\r\n#define BUILD_CONSOLE_INTERFACE 1\r\n\r\n#include \"base/base_inc.h\"\r\n#include \"os/os_inc.h\"\r\n#include \"regs/regs.h\"\r\n#include \"stap/stap_parse.h\"\r\n\r\n#include \"base/base_inc.c\"\r\n#include \"os/os_inc.c\"\r\n#include \"regs/regs.c\"\r\n#include \"stap/stap_parse.c\"\r\n\r\ninternal void\r\nentry_point(CmdLine *cmd_line)\r\n{\r\n  B32      passed = 0;\r\n  STAP_Arg arg    = {0};\r\n  String8  error  = {0};\r\n  String8  string = {0};\r\n\r\n  string = str8_lit(\"-2@$-123\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_S);\r\n  AssertAlways(arg.value_size == 2);\r\n  AssertAlways(arg.type == STAP_ArgType_Imm);\r\n  AssertAlways((S64)arg.imm == -123);\r\n\r\n  string = str8_lit(\"1@$43\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_U);\r\n  AssertAlways(arg.value_size == 1);\r\n  AssertAlways(arg.type == STAP_ArgType_Imm);\r\n  AssertAlways((S64)arg.imm == 43);\r\n\r\n  string = str8_lit(\"4f@%eax\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_F);\r\n  AssertAlways(arg.value_size == 4);\r\n  AssertAlways(arg.type == STAP_ArgType_Reg);\r\n  AssertAlways(arg.reg.is_alias == 1);\r\n  AssertAlways(arg.reg.reg_code == REGS_AliasCodeX64_eax);\r\n\r\n  string = str8_lit(\"4@(%rdi)\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_size == 4);\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_U);\r\n  AssertAlways(arg.type == STAP_ArgType_MemoryRef);\r\n  AssertAlways(arg.memory_ref.disp == 0);\r\n  AssertAlways(arg.memory_ref.base.reg_code == REGS_RegCodeX64_rdi);\r\n  AssertAlways(!arg.memory_ref.base.is_alias);\r\n  AssertAlways(arg.memory_ref.index.reg_code == 0);\r\n  AssertAlways(arg.memory_ref.index.is_alias == 0);\r\n  AssertAlways(arg.memory_ref.scale == 1);\r\n\r\n  string = str8_lit(\"4@-22(%rdi)\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_size == 4);\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_U);\r\n  AssertAlways(arg.type == STAP_ArgType_MemoryRef);\r\n  AssertAlways(arg.memory_ref.disp == -22);\r\n  AssertAlways(arg.memory_ref.base.reg_code == REGS_RegCodeX64_rdi);\r\n  AssertAlways(!arg.memory_ref.base.is_alias);\r\n  AssertAlways(arg.memory_ref.index.reg_code == 0);\r\n  AssertAlways(arg.memory_ref.index.is_alias == 0);\r\n  AssertAlways(arg.memory_ref.scale == 1);\r\n\r\n  string = str8_lit(\"4@32(%rax,%rsi,8)\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_size == 4);\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_U);\r\n  AssertAlways(arg.memory_ref.disp == 32);\r\n  AssertAlways(arg.memory_ref.base.reg_code == REGS_RegCodeX64_rax);\r\n  AssertAlways(arg.memory_ref.base.is_alias == 0);\r\n  AssertAlways(arg.memory_ref.index.reg_code == REGS_RegCodeX64_rsi);\r\n  AssertAlways(arg.memory_ref.index.is_alias == 0);\r\n  AssertAlways(arg.memory_ref.scale == 8);\r\n\r\n  string = str8_lit(\"4@32(,%rsi,8)\");\r\n  error = stap_parse_args_x64(string, &arg);\r\n  if (error.size != 0) { goto exit; }\r\n  AssertAlways(arg.value_size == 4);\r\n  AssertAlways(arg.value_type == STAP_ArgValueType_U);\r\n  AssertAlways(arg.memory_ref.disp == 32);\r\n  AssertAlways(arg.memory_ref.base.reg_code == 0);\r\n  AssertAlways(arg.memory_ref.index.reg_code == REGS_RegCodeX64_rsi);\r\n  AssertAlways(arg.memory_ref.scale == 8);\r\n\r\n  error = stap_parse_args_x64(str8_lit(\"4@(,,)\"), &arg);\r\n  if (error.size == 0) { goto exit; }\r\n\r\n  error = stap_parse_args_x64(str8_lit(\"4@()\"), &arg);\r\n  if (error.size == 0) { goto exit; }\r\n\r\n  error = stap_parse_args_x64(str8_lit(\"4@(%rdi, %rsi, 8\"), &arg);\r\n  if (error.size == 0) { goto exit; }\r\n\r\n  error = stap_parse_args_x64(str8_lit(\"4@( ,, 8\"), &arg);\r\n  if (error.size == 0) { goto exit; }\r\n\r\n  passed = 1;\r\nexit:;\r\n  AssertAlways(passed);\r\n}\r\n\r\n"
  },
  {
    "path": "src/strip_lib_debug/strip_lib_debug.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n#define BUILD_TITLE \"Epic Games Tools (R) Lib Strip Debug\"\n#define BUILD_CONSOLE_INTERFACE 1\n\n////////////////////////////////\n// Headers\n\n#include \"base/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"coff/coff.h\"\n#include \"coff/coff_parse.h\"\n\n////////////////////////////////\n// Implementations\n\n#include \"base/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"coff/coff.c\"\n#include \"coff/coff_parse.c\"\n\ninternal void\nsld_main(CmdLine *cmdl)\n{\n  B32 do_help = cmd_line_has_flag(cmdl, str8_lit(\"help\")) ||\n                cmd_line_has_flag(cmdl, str8_lit(\"h\"))    ||\n                cmd_line_has_flag(cmdl, str8_lit(\"?\"))    ||\n                cmdl->argc == 1;\n  if (do_help) {    fprintf(stderr, \"--- Help ---------------------------------------------------------------------\\n\");\n    fprintf(stderr, \" %s\\n\\n\", BUILD_TITLE_STRING_LITERAL);\n    fprintf(stderr, \" Usage: strip_lib_debug [Options]\\n\\n\");\n    fprintf(stderr, \" Options:\\n\");\n    fprintf(stderr, \"  -in:<path>  Path to input lib file\\n\");\n    fprintf(stderr, \"  -out:<path> Path to output lib file\\n\");\n    os_abort(0);\n  }\n\n  Temp scratch = scratch_begin(0,0);\n\n  String8 in_lib_path  = cmd_line_string(cmdl, str8_lit(\"in\"));\n  String8 out_lib_path = cmd_line_string(cmdl, str8_lit(\"out\"));\n\n  if (in_lib_path.size == 0) {\n    fprintf(stderr, \"ERROR: please provide an input path via -in:<path>\\n\");\n    os_abort(1);\n  }\n  if (out_lib_path.size == 0) {\n    fprintf(stderr, \"ERROR: please provide an output path via -out:<path>\\n\");\n    os_abort(1);\n  }\n\n  String8 in_lib = os_data_from_file_path(scratch.arena, in_lib_path);\n  if (in_lib.size == 0) {\n    fprintf(stderr, \"ERROR: unable to read file %.*s\\n\", str8_varg(in_lib_path));\n    os_abort(1);\n  }\n\n  if (!coff_is_regular_archive(in_lib)) {\n    fprintf(stderr, \"ERROR: input lib is not COFF archive\\n\");\n    os_abort(1);\n  }\n\n  // read & parse lib\n  String8           out_lib = push_str8_copy(scratch.arena, in_lib);\n  COFF_ArchiveParse parse   = coff_archive_parse_from_data(out_lib);\n\n  // was parse successful?\n  if (parse.error.size) {\n    fprintf(stderr, \"ERROR: %.*s: %.*s\\n\", str8_varg(in_lib_path), str8_varg(parse.error));\n    os_abort(1);\n  }\n\n  // convert big endian offsets\n  U32  member_offsets_count = parse.first_member.symbol_count;\n  U32 *member_offsets       = push_array(scratch.arena, U32, parse.first_member.member_offset_count);\n  for (U32 offset_idx = 0; offset_idx < member_offsets_count; offset_idx += 1) {\n    member_offsets[offset_idx] = from_be_u32(parse.first_member.member_offsets[offset_idx]);\n  }\n\n  // fixup sections\n  for (U64 member_idx = 0; member_idx < member_offsets_count; member_idx += 1) {\n    COFF_ParsedArchiveMemberHeader member_header = {0};\n    coff_parse_archive_member_header(out_lib, member_offsets[member_idx], &member_header);\n    String8       member_data = str8_substr(out_lib, member_header.data_range);\n    COFF_DataType member_type = coff_data_type_from_data(member_data);\n    if (member_type == COFF_DataType_BigObj || member_type == COFF_DataType_Obj) {\n      COFF_FileHeaderInfo  file_header_info = coff_file_header_info_from_data(member_data);\n      COFF_SectionHeader  *section_table    = (COFF_SectionHeader *)str8_substr(member_data, file_header_info.section_table_range).str;\n      String8              string_table     = str8_substr(member_data, file_header_info.string_table_range);\n      for (U64 sect_idx = 0; sect_idx < file_header_info.section_count_no_null; sect_idx += 1) {\n        COFF_SectionHeader *sect_header = &section_table[sect_idx];\n        String8             name        = coff_name_from_section_header(string_table, sect_header);\n        if (str8_match(str8_lit(\".debug$S\"), name, 0) || str8_match(str8_lit(\".debug$T\"), name, 0)) {\n          sect_header->flags = COFF_SectionFlag_LnkRemove;\n          MemorySet(sect_header->name, 'x', sizeof(sect_header->name));\n        }\n      }\n    }\n  }\n\n  // wirte modified library\n  if (!os_write_data_to_file_path(out_lib_path, out_lib)) {\n    fprintf(stderr, \"ERROR: unable to write output file to %.*s\\n\", str8_varg(out_lib_path));\n    os_abort(1);\n  }\n\n  scratch_end(scratch);\n}\n\ninternal void\nentry_point(CmdLine *cmdl)\n{\n  sld_main(cmdl);\n}\n\n"
  },
  {
    "path": "src/tester/tester_main.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n//~ rjf: Build Options\n\n#define BUILD_TITLE \"tester\"\n#define BUILD_CONSOLE_INTERFACE 1\n#define OS_FEATURE_GRAPHICAL 1\n\n////////////////////////////////\n//~ rjf: Includes\n\n//- rjf: [h]\n#include \"base/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"content/content.h\"\n#include \"rdi_format/rdi_format_local.h\"\n#include \"regs/regs.h\"\n#include \"regs/rdi/regs_rdi.h\"\n#include \"eval/eval_inc.h\"\n\n//- rjf: [c]\n#include \"base/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"content/content.c\"\n#include \"rdi_format/rdi_format_local.c\"\n#include \"regs/regs.c\"\n#include \"regs/rdi/regs_rdi.c\"\n#include \"eval/eval_inc.c\"\n\n////////////////////////////////\n//~ rjf: Entry Points\n\ninternal B32 frame(void) { return 0; }\n\ninternal void\nentry_point(CmdLine *cmdline)\n{\n  Arena *arena = arena_alloc();\n  E_Cache *eval_cache = e_cache_alloc();\n  e_select_cache(eval_cache);\n  E_BaseCtx *base_ctx = push_array(arena, E_BaseCtx, 1);\n  e_select_base_ctx(base_ctx);\n  E_IRCtx *ir_ctx = push_array(arena, E_IRCtx, 1);\n  e_select_ir_ctx(ir_ctx);\n  E_InterpretCtx *interpret_ctx = push_array(arena, E_InterpretCtx, 1);\n  e_select_interpret_ctx(interpret_ctx, 0, 0);\n  \n  //////////////////////////////\n  //- rjf: unpack command line\n  //\n  String8 test_data_folder_path = cmd_line_string(cmdline, str8_lit(\"test_data\"));\n  if(test_data_folder_path.size == 0)\n  {\n    fprintf(stderr, \"error(input): The test data folder path was not specified. Specify the path when running the program, like: %.*s --test_data:C:/foo/bar/baz\\n\", str8_varg(cmdline->exe_name));\n    os_abort(1);\n  }\n  \n  //////////////////////////////\n  //- rjf: make artifacts directory\n  //\n  String8 artifacts_path = path_normalized_from_string(arena, str8_lit(\"./tester_artifacts\"));\n  os_make_directory(artifacts_path);\n  \n  //////////////////////////////\n  //- rjf: set up list of test artifacts\n  //\n  typedef struct Test Test;\n  struct Test\n  {\n    Test *next;\n    String8 name;\n    String8List out;\n    B32 good;\n  };\n  Test *first_test = 0;\n  Test *last_test = 0;\n#define Test(name_identifier) \\\nTest *test_##name_identifier = push_array(arena, Test, 1);\\\ntest_##name_identifier->name = str8_lit(#name_identifier);\\\ntest_##name_identifier->good = 1;\\\nSLLQueuePush(first_test, last_test, test_##name_identifier);\\\nfor(Test *test = test_##name_identifier; test != 0; test = 0)\n  \n  //////////////////////////////\n  //- rjf: PDB -> RDI determinism\n  //\n  Test(pdb2rdi_determinism)\n  {\n    U64 num_repeats_per_pdb = 32;\n    String8 pdb_paths[] =\n    {\n      push_str8f(arena, \"%S/mule_main/mule_main.pdb\", test_data_folder_path),\n      push_str8f(arena, \"%S/mule_main/mule_module.pdb\", test_data_folder_path),\n    };\n    for EachElement(pdb_idx, pdb_paths)\n    {\n      // rjf: unpack paths, make output directory\n      String8 pdb_path = path_normalized_from_string(arena, pdb_paths[pdb_idx]);\n      String8 repeat_folder = push_str8f(arena, \"%S/%S\", artifacts_path, test->name);\n      os_make_directory(repeat_folder);\n      \n      // rjf: generate all RDIs\n      String8List rdi_paths = {0};\n      String8List dump_paths = {0};\n      {\n        OS_HandleList processes = {0};\n        for EachIndex(repeat_idx, num_repeats_per_pdb)\n        {\n          String8 rdi_path = push_str8f(arena, \"%S/repeat_%I64u.rdi\", repeat_folder, repeat_idx);\n          str8_list_push(arena, &rdi_paths, rdi_path);\n          os_handle_list_push(arena, &processes, os_cmd_line_launchf(\"rdi_from_pdb --deterministic --pdb:%S --out:%S\", pdb_path, rdi_path));\n        }\n        for(OS_HandleNode *n = processes.first; n != 0; n = n->next)\n        {\n          os_process_join(n->v, max_U64, 0);\n        }\n      }\n      \n      // rjf: generate all dumps\n      {\n        OS_HandleList processes = {0};\n        for(String8Node *n = rdi_paths.first; n != 0; n = n->next)\n        {\n          String8 rdi_path = n->string;\n          String8 dump_path = push_str8f(arena, \"%S.dump\", rdi_path);\n          str8_list_push(arena, &dump_paths, dump_path);\n          os_handle_list_push(arena, &processes, os_cmd_line_launchf(\"rdi_dump %S > %S\", rdi_path, dump_path));\n        }\n        for(OS_HandleNode *n = processes.first; n != 0; n = n->next)\n        {\n          os_process_join(n->v, max_U64, 0);\n        }\n      }\n      \n      // rjf: gather all hashes/paths\n      U64 rdi_hashes_count = rdi_paths.node_count;\n      U128 *rdi_hashes = push_array(arena, U128, rdi_hashes_count);\n      String8 *rdi_paths_array = push_array(arena, String8, rdi_hashes_count);\n      U64 dump_hashes_count = dump_paths.node_count;\n      U128 *dump_hashes = push_array(arena, U128, dump_hashes_count);\n      String8 *dump_paths_array = push_array(arena, String8, dump_hashes_count);\n      {\n        U64 idx = 0;\n        for(String8Node *n = rdi_paths.first; n != 0; n = n->next, idx += 1)\n        {\n          Temp scratch = scratch_begin(0, 0);\n          String8 path = n->string;\n          String8 data = os_data_from_file_path(scratch.arena, path);\n          rdi_hashes[idx] = u128_hash_from_str8(data);\n          rdi_paths_array[idx] = path;\n          scratch_end(scratch);\n        }\n      }\n      {\n        U64 idx = 0;\n        for(String8Node *n = dump_paths.first; n != 0; n = n->next, idx += 1)\n        {\n          Temp scratch = scratch_begin(0, 0);\n          String8 path = n->string;\n          String8 data = os_data_from_file_path(scratch.arena, path);\n          dump_hashes[idx] = u128_hash_from_str8(data);\n          dump_paths_array[idx] = path;\n          scratch_end(scratch);\n        }\n      }\n      \n      // rjf: determine if all hashes match\n      B32 matches = 1;\n      for EachIndex(idx, rdi_hashes_count)\n      {\n        if(!u128_match(rdi_hashes[idx], rdi_hashes[0]))\n        {\n          matches = 0;\n          break;\n        }\n      }\n      for EachIndex(idx, dump_hashes_count)\n      {\n        if(!u128_match(dump_hashes[idx], dump_hashes[0]))\n        {\n          matches = 0;\n          break;\n        }\n      }\n      \n      // rjf: output bad case info\n      if(!matches)\n      {\n        test->good = 0;\n        str8_list_pushf(arena, &test->out, \"  pdb[%I64u] \\\"%S\\\"\\n\", pdb_idx, pdb_path);\n        for EachIndex(idx, rdi_hashes_count)\n        {\n          str8_list_pushf(arena, &test->out, \"    rdi[%I64u] \\\"%S\\\": 0x%I64x:%I64x\\n\", idx, rdi_paths_array[idx], rdi_hashes[idx].u64[0], rdi_hashes[idx].u64[1]);\n        }\n        for EachIndex(idx, dump_hashes_count)\n        {\n          str8_list_pushf(arena, &test->out, \"    dump[%I64u] \\\"%S\\\": 0x%I64x:%I64x\\n\", idx, dump_paths_array[idx], dump_hashes[idx].u64[0], dump_hashes[idx].u64[1]);\n        }\n      }\n    }\n  }\n  \n  //////////////////////////////\n  //- rjf: eval compiler basics\n  //\n  Test(eval_compiler_basics)\n  {\n    String8 exprs[] =\n    {\n      str8_lit(\"123\"),\n      str8_lit(\"1 + 2\"),\n      str8_lit(\"foo\"),\n      str8_lit(\"foo(bar)\"),\n      str8_lit(\"foo(bar(baz))\"),\n    };\n    String8List logs = {0};\n    for EachElement(idx, exprs)\n    {\n      String8 log = e_debug_log_from_expr_string(arena, exprs[idx]);\n      str8_list_push(arena, &logs, log);\n    }\n    String8 log = str8_list_join(arena, &logs, 0);\n    String8 test_artifacts_path = push_str8f(arena, \"%S/%S\", artifacts_path, test->name);\n    os_make_directory(test_artifacts_path);\n    String8 current_file_path = push_str8f(arena, \"%S/current.txt\", test_artifacts_path);\n    String8 correct_file_path = push_str8f(arena, \"%S/%S/correct.txt\", test_data_folder_path, test->name);\n    os_write_data_to_file_path(current_file_path, log);\n    String8 current_file_data = log;\n    String8 correct_file_data = os_data_from_file_path(arena, correct_file_path);\n    test->good = str8_match(correct_file_data, current_file_data, 0);\n  }\n  \n  //////////////////////////////\n  //- rjf: dump results\n  //\n  B32 all_good = 1;\n  for(Test *t = first_test; t != 0; t = t->next)\n  {\n    if(!t->good)\n    {\n      all_good = 0;\n      break;\n    }\n  }\n  fprintf(stderr, \"[%s]\\n\", all_good ? \".\" : \"X\");\n  for(Test *t = first_test; t != 0; t = t->next)\n  {\n    fprintf(stderr, \"    [%s] \\\"%.*s\\\"\\n\", t->good ? \".\" : \"X\", str8_varg(t->name));\n    if(!t->good)\n    {\n      for(String8Node *n = t->out.first; n != 0; n = n->next)\n      {\n        fprintf(stderr, \"        %.*s\", str8_varg(n->string));\n      }\n    }\n  }\n  \n}\n"
  },
  {
    "path": "src/text/generated/text.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\nC_LINKAGE_BEGIN\r\nString8 txt_lang_kind_ext_table[8] =\r\n{\r\nstr8_lit_comp(\"null\"),\r\nstr8_lit_comp(\"c\"),\r\nstr8_lit_comp(\"cpp\"),\r\nstr8_lit_comp(\"odin\"),\r\nstr8_lit_comp(\"jai\"),\r\nstr8_lit_comp(\"zig\"),\r\nstr8_lit_comp(\"rs\"),\r\nstr8_lit_comp(\"disasm_x64_intel\"),\r\n};\r\n\r\nstruct {String8 ext; TXT_LangKind kind;} txt_ext_lang_kind_table[24] =\r\n{\r\n{str8_lit_comp(\"null\"), TXT_LangKind_Null},\r\n{str8_lit_comp(\"c\"), TXT_LangKind_C},\r\n{str8_lit_comp(\"cpp\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"odin\"), TXT_LangKind_Odin},\r\n{str8_lit_comp(\"jai\"), TXT_LangKind_Jai},\r\n{str8_lit_comp(\"zig\"), TXT_LangKind_Zig},\r\n{str8_lit_comp(\"rs\"), TXT_LangKind_Rust},\r\n{str8_lit_comp(\"disasm_x64_intel\"), TXT_LangKind_DisasmX64Intel},\r\n{str8_lit_comp(\"h\"), TXT_LangKind_C},\r\n{str8_lit_comp(\"cxx\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"cc\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"c++\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"ixx\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"cxxm\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"c++m\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"ccm\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"cppm\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"mpp\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"C\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"hpp\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"hxx\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"hh\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"h++\"), TXT_LangKind_CPlusPlus},\r\n{str8_lit_comp(\"H\"), TXT_LangKind_CPlusPlus},\r\n};\r\n\r\nString8Array txt_keywords_from_lang_kind_table[8] =\r\n{\r\n{txt_keywords__null, ArrayCount(txt_keywords__null)},\r\n{txt_keywords__c, ArrayCount(txt_keywords__c)},\r\n{txt_keywords__cpp, ArrayCount(txt_keywords__cpp)},\r\n{txt_keywords__odin, ArrayCount(txt_keywords__odin)},\r\n{txt_keywords__jai, ArrayCount(txt_keywords__jai)},\r\n{txt_keywords__zig, ArrayCount(txt_keywords__zig)},\r\n{txt_keywords__rust, ArrayCount(txt_keywords__rust)},\r\n{txt_keywords__null, ArrayCount(txt_keywords__null)},\r\n};\r\n\r\nString8Array txt_multichar_symbols_from_lang_kind_table[8] =\r\n{\r\n{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)},\r\n{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)},\r\n{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)},\r\n{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)},\r\n{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)},\r\n{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)},\r\n{txt_multichar_symbols__c, ArrayCount(txt_multichar_symbols__c)},\r\n{txt_multichar_symbols__null, ArrayCount(txt_multichar_symbols__null)},\r\n};\r\n\r\nTXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8] =\r\n{\r\n{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)},\r\n{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)},\r\n{txt_tokenizer_rules__c, ArrayCount(txt_tokenizer_rules__c)},\r\n{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)},\r\n{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)},\r\n{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)},\r\n{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)},\r\n{txt_tokenizer_rules__null, ArrayCount(txt_tokenizer_rules__null)},\r\n};\r\n\r\nString8 txt_keywords__null[1] =\r\n{\r\n{0},\r\n};\r\n\r\nString8 txt_multichar_symbols__null[1] =\r\n{\r\n{0},\r\n};\r\n\r\nTXT_TokenizerRule txt_tokenizer_rules__null[1] =\r\n{\r\n{TXT_TokenKind_Null},\r\n};\r\n\r\nString8 txt_keywords__c[32] =\r\n{\r\nstr8_lit_comp(\"auto\"),\r\nstr8_lit_comp(\"break\"),\r\nstr8_lit_comp(\"case\"),\r\nstr8_lit_comp(\"char\"),\r\nstr8_lit_comp(\"const\"),\r\nstr8_lit_comp(\"continue\"),\r\nstr8_lit_comp(\"default\"),\r\nstr8_lit_comp(\"do\"),\r\nstr8_lit_comp(\"double\"),\r\nstr8_lit_comp(\"else\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"extern\"),\r\nstr8_lit_comp(\"float\"),\r\nstr8_lit_comp(\"for\"),\r\nstr8_lit_comp(\"goto\"),\r\nstr8_lit_comp(\"if\"),\r\nstr8_lit_comp(\"int\"),\r\nstr8_lit_comp(\"long\"),\r\nstr8_lit_comp(\"register\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"short\"),\r\nstr8_lit_comp(\"signed\"),\r\nstr8_lit_comp(\"sizeof\"),\r\nstr8_lit_comp(\"static\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"switch\"),\r\nstr8_lit_comp(\"typedef\"),\r\nstr8_lit_comp(\"union\"),\r\nstr8_lit_comp(\"unsigned\"),\r\nstr8_lit_comp(\"void\"),\r\nstr8_lit_comp(\"volatile\"),\r\nstr8_lit_comp(\"while\"),\r\n};\r\n\r\nString8 txt_multichar_symbols__c[20] =\r\n{\r\nstr8_lit_comp(\"<<\"),\r\nstr8_lit_comp(\">>\"),\r\nstr8_lit_comp(\"<=\"),\r\nstr8_lit_comp(\">=\"),\r\nstr8_lit_comp(\"==\"),\r\nstr8_lit_comp(\"!=\"),\r\nstr8_lit_comp(\"&&\"),\r\nstr8_lit_comp(\"||\"),\r\nstr8_lit_comp(\"|=\"),\r\nstr8_lit_comp(\"&=\"),\r\nstr8_lit_comp(\"^=\"),\r\nstr8_lit_comp(\"~=\"),\r\nstr8_lit_comp(\"+=\"),\r\nstr8_lit_comp(\"-=\"),\r\nstr8_lit_comp(\"*=\"),\r\nstr8_lit_comp(\"/=\"),\r\nstr8_lit_comp(\"%=\"),\r\nstr8_lit_comp(\"<<=\"),\r\nstr8_lit_comp(\">>=\"),\r\nstr8_lit_comp(\"->\"),\r\n};\r\n\r\nTXT_TokenizerRule txt_tokenizer_rules__c[7] =\r\n{\r\n{TXT_TokenKind_Comment, str8_lit_comp(\"//\"), str8_lit_comp(\"\\n\"), 0, 0, 1, 0},\r\n{TXT_TokenKind_Comment, str8_lit_comp(\"/*\"), str8_lit_comp(\"*/\"), 2, 0, 0, 0},\r\n{TXT_TokenKind_Meta, str8_lit_comp(\"#\"), str8_lit_comp(\"\\n\"), 0, 0, 1, 0},\r\n{TXT_TokenKind_String, str8_lit_comp(\"\\\"\"), str8_lit_comp(\"\\\"\"), 1, 0, 1, 0},\r\n{TXT_TokenKind_String, str8_lit_comp(\"'\"), str8_lit_comp(\"'\"), 1, 0, 1, 0},\r\n{TXT_TokenKind_String, str8_lit_comp(\"\\\"\"), str8_lit_comp(\"\\\"\"), 1, 0, 1, 3},\r\n{TXT_TokenKind_String, str8_lit_comp(\"<\"), str8_lit_comp(\">\"), 1, 0, 1, 3},\r\n};\r\n\r\nString8 txt_keywords__cpp[97] =\r\n{\r\nstr8_lit_comp(\"alignas\"),\r\nstr8_lit_comp(\"alignof\"),\r\nstr8_lit_comp(\"and\"),\r\nstr8_lit_comp(\"and_eq\"),\r\nstr8_lit_comp(\"asm\"),\r\nstr8_lit_comp(\"atomic_cancel\"),\r\nstr8_lit_comp(\"atomic_commit\"),\r\nstr8_lit_comp(\"atomic_noexcept\"),\r\nstr8_lit_comp(\"auto\"),\r\nstr8_lit_comp(\"bitand\"),\r\nstr8_lit_comp(\"bitor\"),\r\nstr8_lit_comp(\"bool\"),\r\nstr8_lit_comp(\"break\"),\r\nstr8_lit_comp(\"case\"),\r\nstr8_lit_comp(\"catch\"),\r\nstr8_lit_comp(\"char\"),\r\nstr8_lit_comp(\"char8_t\"),\r\nstr8_lit_comp(\"char16_t\"),\r\nstr8_lit_comp(\"char32_t\"),\r\nstr8_lit_comp(\"class\"),\r\nstr8_lit_comp(\"compl\"),\r\nstr8_lit_comp(\"concept\"),\r\nstr8_lit_comp(\"const\"),\r\nstr8_lit_comp(\"consteval\"),\r\nstr8_lit_comp(\"constexpr\"),\r\nstr8_lit_comp(\"constinit\"),\r\nstr8_lit_comp(\"const_cast\"),\r\nstr8_lit_comp(\"continue\"),\r\nstr8_lit_comp(\"co_await\"),\r\nstr8_lit_comp(\"co_return\"),\r\nstr8_lit_comp(\"co_yield\"),\r\nstr8_lit_comp(\"decltype\"),\r\nstr8_lit_comp(\"default\"),\r\nstr8_lit_comp(\"delete\"),\r\nstr8_lit_comp(\"do\"),\r\nstr8_lit_comp(\"double\"),\r\nstr8_lit_comp(\"dynamic_cast\"),\r\nstr8_lit_comp(\"else\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"explicit\"),\r\nstr8_lit_comp(\"export\"),\r\nstr8_lit_comp(\"extern\"),\r\nstr8_lit_comp(\"false\"),\r\nstr8_lit_comp(\"float\"),\r\nstr8_lit_comp(\"for\"),\r\nstr8_lit_comp(\"friend\"),\r\nstr8_lit_comp(\"goto\"),\r\nstr8_lit_comp(\"if\"),\r\nstr8_lit_comp(\"inline\"),\r\nstr8_lit_comp(\"int\"),\r\nstr8_lit_comp(\"long\"),\r\nstr8_lit_comp(\"mutable\"),\r\nstr8_lit_comp(\"namespace\"),\r\nstr8_lit_comp(\"new\"),\r\nstr8_lit_comp(\"noexcept\"),\r\nstr8_lit_comp(\"not\"),\r\nstr8_lit_comp(\"not_eq\"),\r\nstr8_lit_comp(\"nullptr\"),\r\nstr8_lit_comp(\"operator\"),\r\nstr8_lit_comp(\"or\"),\r\nstr8_lit_comp(\"or_eq\"),\r\nstr8_lit_comp(\"private\"),\r\nstr8_lit_comp(\"protected\"),\r\nstr8_lit_comp(\"public\"),\r\nstr8_lit_comp(\"reflexpr\"),\r\nstr8_lit_comp(\"register\"),\r\nstr8_lit_comp(\"reinterpret_cast\"),\r\nstr8_lit_comp(\"requires\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"short\"),\r\nstr8_lit_comp(\"signed\"),\r\nstr8_lit_comp(\"sizeof\"),\r\nstr8_lit_comp(\"static\"),\r\nstr8_lit_comp(\"static_assert\"),\r\nstr8_lit_comp(\"static_cast\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"switch\"),\r\nstr8_lit_comp(\"synchronized\"),\r\nstr8_lit_comp(\"template\"),\r\nstr8_lit_comp(\"this\"),\r\nstr8_lit_comp(\"thread_local\"),\r\nstr8_lit_comp(\"throw\"),\r\nstr8_lit_comp(\"true\"),\r\nstr8_lit_comp(\"try\"),\r\nstr8_lit_comp(\"typedef\"),\r\nstr8_lit_comp(\"typeid\"),\r\nstr8_lit_comp(\"typename\"),\r\nstr8_lit_comp(\"union\"),\r\nstr8_lit_comp(\"unsigned\"),\r\nstr8_lit_comp(\"using\"),\r\nstr8_lit_comp(\"virtual\"),\r\nstr8_lit_comp(\"void\"),\r\nstr8_lit_comp(\"volatile\"),\r\nstr8_lit_comp(\"wchar_t\"),\r\nstr8_lit_comp(\"while\"),\r\nstr8_lit_comp(\"xor\"),\r\nstr8_lit_comp(\"xor_eq\"),\r\n};\r\n\r\nString8 txt_keywords__odin[40] =\r\n{\r\nstr8_lit_comp(\"align_of\"),\r\nstr8_lit_comp(\"asm\"),\r\nstr8_lit_comp(\"auto_cast\"),\r\nstr8_lit_comp(\"bit_set\"),\r\nstr8_lit_comp(\"break\"),\r\nstr8_lit_comp(\"case\"),\r\nstr8_lit_comp(\"cast\"),\r\nstr8_lit_comp(\"context\"),\r\nstr8_lit_comp(\"continue\"),\r\nstr8_lit_comp(\"defer\"),\r\nstr8_lit_comp(\"distinct\"),\r\nstr8_lit_comp(\"do\"),\r\nstr8_lit_comp(\"dynamic\"),\r\nstr8_lit_comp(\"else\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"fallthrough\"),\r\nstr8_lit_comp(\"for\"),\r\nstr8_lit_comp(\"foreign\"),\r\nstr8_lit_comp(\"if\"),\r\nstr8_lit_comp(\"in\"),\r\nstr8_lit_comp(\"map\"),\r\nstr8_lit_comp(\"matrix\"),\r\nstr8_lit_comp(\"not_in\"),\r\nstr8_lit_comp(\"or_break\"),\r\nstr8_lit_comp(\"or_continue\"),\r\nstr8_lit_comp(\"or_else\"),\r\nstr8_lit_comp(\"or_return\"),\r\nstr8_lit_comp(\"package\"),\r\nstr8_lit_comp(\"proc\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"size_of\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"switch\"),\r\nstr8_lit_comp(\"transmute\"),\r\nstr8_lit_comp(\"typeid\"),\r\nstr8_lit_comp(\"union\"),\r\nstr8_lit_comp(\"using\"),\r\nstr8_lit_comp(\"when\"),\r\nstr8_lit_comp(\"where\"),\r\nstr8_lit_comp(\"import\"),\r\n};\r\n\r\nString8 txt_keywords__jai[39] =\r\n{\r\nstr8_lit_comp(\"bool\"),\r\nstr8_lit_comp(\"true\"),\r\nstr8_lit_comp(\"false\"),\r\nstr8_lit_comp(\"int\"),\r\nstr8_lit_comp(\"s8\"),\r\nstr8_lit_comp(\"u8\"),\r\nstr8_lit_comp(\"s16\"),\r\nstr8_lit_comp(\"u16\"),\r\nstr8_lit_comp(\"s32\"),\r\nstr8_lit_comp(\"u32\"),\r\nstr8_lit_comp(\"s64\"),\r\nstr8_lit_comp(\"u64\"),\r\nstr8_lit_comp(\"s128\"),\r\nstr8_lit_comp(\"u128\"),\r\nstr8_lit_comp(\"float\"),\r\nstr8_lit_comp(\"float32\"),\r\nstr8_lit_comp(\"float64\"),\r\nstr8_lit_comp(\"void\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"enum_flags\"),\r\nstr8_lit_comp(\"size_of\"),\r\nstr8_lit_comp(\"string\"),\r\nstr8_lit_comp(\"type_of\"),\r\nstr8_lit_comp(\"cast\"),\r\nstr8_lit_comp(\"if\"),\r\nstr8_lit_comp(\"ifs\"),\r\nstr8_lit_comp(\"then\"),\r\nstr8_lit_comp(\"else\"),\r\nstr8_lit_comp(\"case\"),\r\nstr8_lit_comp(\"for\"),\r\nstr8_lit_comp(\"while\"),\r\nstr8_lit_comp(\"break\"),\r\nstr8_lit_comp(\"continue\"),\r\nstr8_lit_comp(\"remove\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"inline\"),\r\nstr8_lit_comp(\"null\"),\r\nstr8_lit_comp(\"defer\"),\r\nstr8_lit_comp(\"xx\"),\r\n};\r\n\r\nString8 txt_keywords__zig[49] =\r\n{\r\nstr8_lit_comp(\"addrspace\"),\r\nstr8_lit_comp(\"align\"),\r\nstr8_lit_comp(\"allowzero\"),\r\nstr8_lit_comp(\"and\"),\r\nstr8_lit_comp(\"anyframe\"),\r\nstr8_lit_comp(\"anytype\"),\r\nstr8_lit_comp(\"asm\"),\r\nstr8_lit_comp(\"async\"),\r\nstr8_lit_comp(\"await\"),\r\nstr8_lit_comp(\"break\"),\r\nstr8_lit_comp(\"callconv\"),\r\nstr8_lit_comp(\"catch\"),\r\nstr8_lit_comp(\"comptime\"),\r\nstr8_lit_comp(\"const\"),\r\nstr8_lit_comp(\"continue\"),\r\nstr8_lit_comp(\"defer\"),\r\nstr8_lit_comp(\"else\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"errdefer\"),\r\nstr8_lit_comp(\"error\"),\r\nstr8_lit_comp(\"export\"),\r\nstr8_lit_comp(\"extern\"),\r\nstr8_lit_comp(\"fn\"),\r\nstr8_lit_comp(\"for\"),\r\nstr8_lit_comp(\"if\"),\r\nstr8_lit_comp(\"inline\"),\r\nstr8_lit_comp(\"noalias\"),\r\nstr8_lit_comp(\"nosuspend\"),\r\nstr8_lit_comp(\"noinline\"),\r\nstr8_lit_comp(\"opaque\"),\r\nstr8_lit_comp(\"or\"),\r\nstr8_lit_comp(\"orelse\"),\r\nstr8_lit_comp(\"packed\"),\r\nstr8_lit_comp(\"pub\"),\r\nstr8_lit_comp(\"resume\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"linksection\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"suspend\"),\r\nstr8_lit_comp(\"switch\"),\r\nstr8_lit_comp(\"test\"),\r\nstr8_lit_comp(\"threadlocal\"),\r\nstr8_lit_comp(\"try\"),\r\nstr8_lit_comp(\"union\"),\r\nstr8_lit_comp(\"unreachable\"),\r\nstr8_lit_comp(\"usingnamespace\"),\r\nstr8_lit_comp(\"var\"),\r\nstr8_lit_comp(\"volatile\"),\r\nstr8_lit_comp(\"while\"),\r\n};\r\n\r\nString8 txt_keywords__rust[43] =\r\n{\r\nstr8_lit_comp(\"as\"),\r\nstr8_lit_comp(\"break\"),\r\nstr8_lit_comp(\"const\"),\r\nstr8_lit_comp(\"continue\"),\r\nstr8_lit_comp(\"crate\"),\r\nstr8_lit_comp(\"else\"),\r\nstr8_lit_comp(\"enum\"),\r\nstr8_lit_comp(\"extern\"),\r\nstr8_lit_comp(\"false\"),\r\nstr8_lit_comp(\"fn\"),\r\nstr8_lit_comp(\"for\"),\r\nstr8_lit_comp(\"if\"),\r\nstr8_lit_comp(\"impl\"),\r\nstr8_lit_comp(\"in\"),\r\nstr8_lit_comp(\"let\"),\r\nstr8_lit_comp(\"loop\"),\r\nstr8_lit_comp(\"match\"),\r\nstr8_lit_comp(\"mod\"),\r\nstr8_lit_comp(\"move\"),\r\nstr8_lit_comp(\"mut\"),\r\nstr8_lit_comp(\"pub\"),\r\nstr8_lit_comp(\"ref\"),\r\nstr8_lit_comp(\"return\"),\r\nstr8_lit_comp(\"self\"),\r\nstr8_lit_comp(\"Self\"),\r\nstr8_lit_comp(\"static\"),\r\nstr8_lit_comp(\"struct\"),\r\nstr8_lit_comp(\"super\"),\r\nstr8_lit_comp(\"trait\"),\r\nstr8_lit_comp(\"true\"),\r\nstr8_lit_comp(\"type\"),\r\nstr8_lit_comp(\"unsafe\"),\r\nstr8_lit_comp(\"use\"),\r\nstr8_lit_comp(\"where\"),\r\nstr8_lit_comp(\"while\"),\r\nstr8_lit_comp(\"yield\"),\r\nstr8_lit_comp(\"async\"),\r\nstr8_lit_comp(\"await\"),\r\nstr8_lit_comp(\"dyn\"),\r\nstr8_lit_comp(\"macro_rules\"),\r\nstr8_lit_comp(\"raw\"),\r\nstr8_lit_comp(\"safe\"),\r\nstr8_lit_comp(\"union\"),\r\n};\r\n\r\nC_LINKAGE_END\r\n\r\n"
  },
  {
    "path": "src/text/generated/text.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef TEXT_META_H\r\n#define TEXT_META_H\r\n\r\ntypedef enum TXT_LangKind\r\n{\r\nTXT_LangKind_Null,\r\nTXT_LangKind_C,\r\nTXT_LangKind_CPlusPlus,\r\nTXT_LangKind_Odin,\r\nTXT_LangKind_Jai,\r\nTXT_LangKind_Zig,\r\nTXT_LangKind_Rust,\r\nTXT_LangKind_DisasmX64Intel,\r\nTXT_LangKind_COUNT,\r\n} TXT_LangKind;\r\n\r\nC_LINKAGE_BEGIN\r\nextern String8 txt_lang_kind_ext_table[8];\r\nextern String8Array txt_keywords_from_lang_kind_table[8];\r\nextern String8Array txt_multichar_symbols_from_lang_kind_table[8];\r\nextern TXT_TokenizerRuleArray txt_tokenizer_rules_from_lang_kind_table[8];\r\nextern String8 txt_keywords__null[1];\r\nextern String8 txt_multichar_symbols__null[1];\r\nextern TXT_TokenizerRule txt_tokenizer_rules__null[1];\r\nextern String8 txt_keywords__c[32];\r\nextern String8 txt_multichar_symbols__c[20];\r\nextern TXT_TokenizerRule txt_tokenizer_rules__c[7];\r\nextern String8 txt_keywords__cpp[97];\r\nextern String8 txt_keywords__odin[40];\r\nextern String8 txt_keywords__jai[39];\r\nextern String8 txt_keywords__zig[49];\r\nextern String8 txt_keywords__rust[43];\r\n\r\nC_LINKAGE_END\r\n\r\n#endif // TEXT_META_H\r\n"
  },
  {
    "path": "src/text/text.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xe34cd4ff\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/text.meta.c\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal TXT_LangKind\r\ntxt_lang_kind_from_extension(String8 extension)\r\n{\r\n  TXT_LangKind kind = TXT_LangKind_Null;\r\n  for EachElement(idx, txt_ext_lang_kind_table)\r\n  {\r\n    if(str8_match(extension, txt_ext_lang_kind_table[idx].ext, 0))\r\n    {\r\n      kind = txt_ext_lang_kind_table[idx].kind;\r\n      break;\r\n    }\r\n  }\r\n  return kind;\r\n}\r\n\r\ninternal String8\r\ntxt_extension_from_lang_kind(TXT_LangKind kind)\r\n{\r\n  String8 result = txt_lang_kind_ext_table[kind];\r\n  return result;\r\n}\r\n\r\ninternal TXT_LangKind\r\ntxt_lang_kind_from_arch(Arch arch)\r\n{\r\n  TXT_LangKind kind = TXT_LangKind_Null;\r\n  switch(arch)\r\n  {\r\n    default:{}break;\r\n    case Arch_x64:{kind = TXT_LangKind_DisasmX64Intel;}break;\r\n  }\r\n  return kind;\r\n}\r\n\r\ninternal TXT_LangLexFunctionType *\r\ntxt_lex_function_from_lang_kind(TXT_LangKind kind)\r\n{\r\n  TXT_LangLexFunctionType *fn = 0;\r\n  switch(kind)\r\n  {\r\n    default:{}break;\r\n    case TXT_LangKind_C:             {fn = txt_token_array_from_string__c_cpp;}break;\r\n    case TXT_LangKind_CPlusPlus:     {fn = txt_token_array_from_string__c_cpp;}break;\r\n    case TXT_LangKind_Odin:          {fn = txt_token_array_from_string__odin;}break;\r\n    case TXT_LangKind_Jai:           {fn = txt_token_array_from_string__jai;}break;\r\n    case TXT_LangKind_Zig:           {fn = txt_token_array_from_string__zig;}break;\r\n    case TXT_LangKind_Rust:          {fn = txt_token_array_from_string__rust;}break;\r\n    case TXT_LangKind_DisasmX64Intel:{fn = txt_token_array_from_string__disasm_x64_intel;}break;\r\n  }\r\n  return fn;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Token Type Functions\r\n\r\ninternal void\r\ntxt_token_chunk_list_push(Arena *arena, TXT_TokenChunkList *list, U64 cap, TXT_Token *token)\r\n{\r\n  TXT_TokenChunkNode *node = list->last;\r\n  if(node == 0 || node->count >= node->cap)\r\n  {\r\n    node = push_array(arena, TXT_TokenChunkNode, 1);\r\n    SLLQueuePush(list->first, list->last, node);\r\n    node->cap = cap;\r\n    node->v = push_array_no_zero(arena, TXT_Token, node->cap);\r\n    list->chunk_count += 1;\r\n  }\r\n  MemoryCopyStruct(&node->v[node->count], token);\r\n  node->count += 1;\r\n  list->token_count += 1;\r\n}\r\n\r\ninternal void\r\ntxt_token_list_push(Arena *arena, TXT_TokenList *list, TXT_Token *token)\r\n{\r\n  TXT_TokenNode *node = push_array(arena, TXT_TokenNode, 1);\r\n  MemoryCopyStruct(&node->v, token);\r\n  SLLQueuePush(list->first, list->last, node);\r\n  list->count += 1;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_chunk_list(Arena *arena, TXT_TokenChunkList *list)\r\n{\r\n  TXT_TokenArray array = {0};\r\n  array.count = list->token_count;\r\n  array.v = push_array_no_zero(arena, TXT_Token, array.count);\r\n  U64 idx = 0;\r\n  for(TXT_TokenChunkNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    MemoryCopy(array.v+idx, n->v, n->count*sizeof(TXT_Token));\r\n    idx += n->count;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_list(Arena *arena, TXT_TokenList *list)\r\n{\r\n  TXT_TokenArray array = {0};\r\n  array.count = list->count;\r\n  array.v = push_array_no_zero(arena, TXT_Token, array.count);\r\n  U64 idx = 0;\r\n  for(TXT_TokenNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    MemoryCopyStruct(array.v+idx, &n->v);\r\n    idx += 1;\r\n  }\r\n  return array;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Lexing Functions\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, String8 string)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  U64 chunk_size = Clamp(8, string.size/8, 4096);\r\n  \r\n  //- rjf: gather keywords\r\n  U64 keyword_slots_count = txt_keywords_from_lang_kind_table[lang_kind].count;\r\n  String8Node **keyword_slots = push_array(scratch.arena, String8Node *, keyword_slots_count);\r\n  for EachIndex(idx, txt_keywords_from_lang_kind_table[lang_kind].count)\r\n  {\r\n    String8 keyword = txt_keywords_from_lang_kind_table[lang_kind].v[idx];\r\n    U64 hash = u64_hash_from_str8(keyword);\r\n    U64 slot_idx = hash%keyword_slots_count;\r\n    String8Node *n = push_array(scratch.arena, String8Node, 1);\r\n    SLLStackPush(keyword_slots[slot_idx], n);\r\n    n->string = keyword;\r\n  }\r\n  \r\n  //- rjf: gather multichar symbols\r\n  String8Array multichar_symbols = txt_multichar_symbols_from_lang_kind_table[lang_kind];\r\n  \r\n  //- rjf: gather rules\r\n  U64 tokenizer_rule_slots_count = txt_tokenizer_rules_from_lang_kind_table[lang_kind].count;\r\n  TXT_TokenizerRulePtrNode **tokenizer_rule_opener_slots = push_array(scratch.arena, TXT_TokenizerRulePtrNode *, tokenizer_rule_slots_count);\r\n  TXT_TokenizerRulePtrNode **tokenizer_rule_closer_slots = push_array(scratch.arena, TXT_TokenizerRulePtrNode *, tokenizer_rule_slots_count);\r\n  {\r\n    TXT_TokenizerRuleArray rules = txt_tokenizer_rules_from_lang_kind_table[lang_kind];\r\n    for EachIndex(idx, rules.count)\r\n    {\r\n      TXT_TokenizerRule *r = &rules.v[idx];\r\n      U64 open_hash = u64_hash_from_str8(r->open_string);\r\n      U64 close_hash = u64_hash_from_str8(r->close_string);\r\n      U64 open_slot_idx = open_hash%tokenizer_rule_slots_count;\r\n      U64 close_slot_idx = close_hash%tokenizer_rule_slots_count;\r\n      TXT_TokenizerRulePtrNode *open_n = push_array(scratch.arena, TXT_TokenizerRulePtrNode, 1);\r\n      TXT_TokenizerRulePtrNode *close_n = push_array(scratch.arena, TXT_TokenizerRulePtrNode, 1);\r\n      open_n->v = r;\r\n      close_n->v = r;\r\n      SLLStackPush(tokenizer_rule_opener_slots[open_slot_idx], open_n);\r\n      SLLStackPush(tokenizer_rule_closer_slots[close_slot_idx], close_n);\r\n    }\r\n  }\r\n  \r\n  //- rjf: generate token list\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    typedef struct TokenTask TokenTask;\r\n    struct TokenTask\r\n    {\r\n      TokenTask *next;\r\n      TXT_TokenizerRule *rule;\r\n      TXT_TokenKind kind;\r\n      U64 start_idx;\r\n    };\r\n    TXT_TokenizerRule *nil_rule = &txt_tokenizer_rules__null[0];\r\n    TokenTask *top_task = 0;\r\n    TokenTask *free_task = 0;\r\n    B32 escaped = 0;\r\n    B32 next_escaped = 0;\r\n    U64 byte_process_start_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      U8 byte      = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: unpack next bytes\r\n      U8 next_bytes[] = {byte, next_byte};\r\n      String8 string_1byte = str8(next_bytes, 1);\r\n      String8 string_2byte = str8(next_bytes, 2);\r\n      \r\n      // rjf: update counter\r\n      if((idx-byte_process_start_idx) >= 1000 || idx == string.size)\r\n      {\r\n        add_progress(idx - byte_process_start_idx);\r\n        byte_process_start_idx = idx;\r\n      }\r\n      \r\n      // rjf: escaping\r\n      if(escaped && (byte != '\\r' && byte != '\\n'))\r\n      {\r\n        next_escaped = 0;\r\n      }\r\n      else if(!escaped && byte == '\\\\')\r\n      {\r\n        next_escaped = 1;\r\n      }\r\n      \r\n      // rjf: take token starters\r\n      B32 new_token_needed = (top_task == 0);\r\n      TXT_TokenizerRule *new_rule = nil_rule;\r\n      TXT_TokenKind new_token_kind = TXT_TokenKind_Null;\r\n      {\r\n        // rjf: use next bytes to look up a rule from the table\r\n        {\r\n          TXT_TokenizerRule *active_rule = top_task ? top_task->rule : nil_rule;\r\n          U64 hash_1byte = u64_hash_from_str8(string_1byte);\r\n          U64 hash_2byte = u64_hash_from_str8(string_2byte);\r\n          U64 slot_1byte = hash_1byte%tokenizer_rule_slots_count;\r\n          U64 slot_2byte = hash_2byte%tokenizer_rule_slots_count;\r\n          if(new_rule == nil_rule)\r\n          {\r\n            for EachNode(n, TXT_TokenizerRulePtrNode, tokenizer_rule_opener_slots[slot_2byte])\r\n            {\r\n              TXT_TokenizerRule *n_parent_rule = nil_rule;\r\n              if(0 < n->v->parent_num && n->v->parent_num <= txt_tokenizer_rules_from_lang_kind_table[lang_kind].count)\r\n              {\r\n                n_parent_rule = &txt_tokenizer_rules_from_lang_kind_table[lang_kind].v[n->v->parent_num-1];\r\n              }\r\n              if(str8_match(n->v->open_string, string_2byte, 0) &&\r\n                 active_rule == n_parent_rule)\r\n              {\r\n                new_rule = n->v;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          if(new_rule == nil_rule)\r\n          {\r\n            for EachNode(n, TXT_TokenizerRulePtrNode, tokenizer_rule_opener_slots[slot_1byte])\r\n            {\r\n              TXT_TokenizerRule *n_parent_rule = nil_rule;\r\n              if(0 < n->v->parent_num && n->v->parent_num <= txt_tokenizer_rules_from_lang_kind_table[lang_kind].count)\r\n              {\r\n                n_parent_rule = &txt_tokenizer_rules_from_lang_kind_table[lang_kind].v[n->v->parent_num-1];\r\n              }\r\n              if(str8_match(n->v->open_string, string_1byte, 0) &&\r\n                 active_rule == n_parent_rule)\r\n              {\r\n                new_rule = n->v;\r\n                break;\r\n              }\r\n            }\r\n          }\r\n          if(new_rule != nil_rule)\r\n          {\r\n            new_token_kind = new_rule->token_kind;\r\n          }\r\n        }\r\n        \r\n        // rjf: use next bytes to start a new token based on fallback rules\r\n        if(top_task == 0 && new_rule == nil_rule)\r\n        {\r\n          if(0){}\r\n          else if(char_is_space(byte))             { new_token_kind = TXT_TokenKind_Whitespace; }\r\n          else if(byte == '_' ||\r\n                  byte == '$' ||\r\n                  char_is_alpha(byte))             { new_token_kind = TXT_TokenKind_Identifier; }\r\n          else if(char_is_digit(byte, 10) ||\r\n                  (byte == '.' &&\r\n                   char_is_digit(next_byte, 10)))  { new_token_kind = TXT_TokenKind_Numeric; }\r\n          else if(byte == '~' || byte == '!' ||\r\n                  byte == '%' || byte == '^' ||\r\n                  byte == '&' || byte == '*' ||\r\n                  byte == '(' || byte == ')' ||\r\n                  byte == '-' || byte == '=' ||\r\n                  byte == '+' || byte == '[' ||\r\n                  byte == ']' || byte == '{' ||\r\n                  byte == '}' || byte == ':' ||\r\n                  byte == ';' || byte == ',' ||\r\n                  byte == '.' || byte == '<' ||\r\n                  byte == '>' || byte == '/' ||\r\n                  byte == '?' || byte == '|')      { new_token_kind = TXT_TokenKind_Symbol; }\r\n        }\r\n      }\r\n      \r\n      // rjf: look for ender based on rule's closing symbol\r\n      U64 ender_pad = 0;\r\n      B32 ender_found = 0;\r\n      if(top_task != 0 && idx > top_task->start_idx)\r\n      {\r\n        TXT_TokenKind active_token_kind = top_task->kind;\r\n        TXT_TokenizerRule *active_rule = top_task->rule;\r\n        U64 active_token_start_idx = top_task->start_idx;\r\n        if(idx == string.size)\r\n        {\r\n          ender_pad = 0;\r\n          ender_found = 1;\r\n        }\r\n        else if(active_rule != nil_rule &&\r\n                (str8_match(string_1byte, active_rule->close_string, 0) ||\r\n                 str8_match(string_2byte, active_rule->close_string, 0)))\r\n        {\r\n          ender_found = 1;\r\n          ender_pad = active_rule->close_advance;\r\n        }\r\n        else switch(active_token_kind)\r\n        {\r\n          default:{}break;\r\n          case TXT_TokenKind_Whitespace:\r\n          {\r\n            ender_found = !char_is_space(byte);\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte < 128);\r\n          }break;\r\n          case TXT_TokenKind_Numeric:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\\'');\r\n          }break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            ender_found = (byte != '~' && byte != '!' &&\r\n                           byte != '%' && byte != '^' &&\r\n                           byte != '&' && byte != '*' &&\r\n                           byte != '(' && byte != ')' &&\r\n                           byte != '-' && byte != '=' &&\r\n                           byte != '+' && byte != '[' &&\r\n                           byte != ']' && byte != '{' &&\r\n                           byte != '}' && byte != ':' &&\r\n                           byte != ';' && byte != ',' &&\r\n                           byte != '.' && byte != '<' &&\r\n                           byte != '>' && byte != '/' &&\r\n                           byte != '?' && byte != '|');\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: if we have a new token to start, but we have an active token, then\r\n      // end the current token (but keep the same stack)\r\n      B32 keep_top_task = 0;\r\n      if(top_task != 0 && new_token_kind != TXT_TokenKind_Null && idx > top_task->start_idx)\r\n      {\r\n        keep_top_task = (!ender_found);\r\n        ender_found = 1;\r\n      }\r\n      \r\n      // rjf: if we have an ender => emit token(s) for current task\r\n      if(ender_found)\r\n      {\r\n        TXT_Token token = {top_task->kind, r1u64(top_task->start_idx, idx+ender_pad)};\r\n        if(!keep_top_task)\r\n        {\r\n          TokenTask *popped = top_task;\r\n          SLLStackPop(top_task);\r\n          SLLStackPush(free_task, popped);\r\n          if(top_task != 0)\r\n          {\r\n            top_task->start_idx = idx+ender_pad;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          top_task->start_idx = idx+ender_pad;\r\n        }\r\n        \r\n        // rjf: trim \\r's off of end\r\n        {\r\n          String8 token_string = str8_substr(string, token.range);\r\n          if(token_string.size != 0 && token_string.str[token_string.size-1] == '\\r')\r\n          {\r\n            token.range.max -= 1;\r\n            ender_pad += 1;\r\n          }\r\n        }\r\n        \r\n        // rjf: identifier -> keyword in special cases\r\n        if(token.kind == TXT_TokenKind_Identifier)\r\n        {\r\n          String8 token_string = str8_substr(string, token.range);\r\n          U64 hash = u64_hash_from_str8(token_string);\r\n          U64 slot_idx = hash%keyword_slots_count;\r\n          for EachNode(n, String8Node, keyword_slots[slot_idx])\r\n          {\r\n            if(str8_match(token_string, n->string, 0))\r\n            {\r\n              token.kind = TXT_TokenKind_Keyword;\r\n              break;\r\n            }\r\n          }\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n        }\r\n        \r\n        // rjf: split symbols by maximum-munch-rule\r\n        else if(token.kind == TXT_TokenKind_Symbol)\r\n        {\r\n          String8 token_string = str8_substr(string, token.range);\r\n          for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off)\r\n          {\r\n            B32 found = 0;\r\n            for(U64 idx = 0; idx < multichar_symbols.count; idx += 1)\r\n            {\r\n              if(str8_match(str8_substr(token_string, r1u64(off, off+multichar_symbols.v[idx].size)),\r\n                            multichar_symbols.v[idx],\r\n                            0))\r\n              {\r\n                found = 1;\r\n                next_off = off + Max(1, multichar_symbols.v[idx].size);\r\n                TXT_Token sub_token = {TXT_TokenKind_Symbol, r1u64(token.range.min+off, token.range.min+next_off)};\r\n                txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &sub_token);\r\n                break;\r\n              }\r\n            }\r\n            if(!found)\r\n            {\r\n              next_off = off+1;\r\n              TXT_Token sub_token = {TXT_TokenKind_Symbol, r1u64(token.range.min+off, token.range.min+next_off)};\r\n              txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &sub_token);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: all other tokens\r\n        else\r\n        {\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n        }\r\n      }\r\n      \r\n      // rjf: start new token\r\n      if(new_token_kind != TXT_TokenKind_Null)\r\n      {\r\n        TokenTask *task = free_task;\r\n        if(task != 0)\r\n        {\r\n          SLLStackPop(free_task);\r\n        }\r\n        else\r\n        {\r\n          task = push_array(scratch.arena, TokenTask, 1);\r\n        }\r\n        SLLStackPush(top_task, task);\r\n        top_task->rule = new_rule;\r\n        top_task->kind = new_token_kind;\r\n        top_task->start_idx = idx;\r\n      }\r\n      \r\n      // rjf: invalid token kind -> emit error\r\n      else if(new_token_needed)\r\n      {\r\n        TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)};\r\n        txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n      }\r\n      \r\n      // rjf: advance by 1 byte if we haven't found an ender\r\n      if(!ender_found)\r\n      {\r\n        idx += 1;\r\n      }\r\n      \r\n      // rjf: advance by ender padding\r\n      idx += ender_pad;\r\n      \r\n      // rjf: advance escaping\r\n      escaped = next_escaped;\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  U64 chunk_size = Clamp(8, string.size/8, 4096);\r\n  \r\n  //- rjf: generate token list\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    B32 comment_is_single_line = 0;\r\n    B32 string_is_char = 0;\r\n    TXT_TokenKind active_token_kind = TXT_TokenKind_Null;\r\n    U64 active_token_start_idx = 0;\r\n    B32 escaped = 0;\r\n    B32 next_escaped = 0;\r\n    U64 byte_process_start_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      U8 byte      = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: update counter\r\n      if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size))\r\n      {\r\n        ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx));\r\n        byte_process_start_idx = idx;\r\n      }\r\n      \r\n      // rjf: escaping\r\n      if(escaped && (byte != '\\r' && byte != '\\n'))\r\n      {\r\n        next_escaped = 0;\r\n      }\r\n      else if(!escaped && byte == '\\\\')\r\n      {\r\n        next_escaped = 1;\r\n      }\r\n      \r\n      // rjf: take starter, determine active token kind\r\n      if(active_token_kind == TXT_TokenKind_Null)\r\n      {\r\n        // rjf: use next bytes to start a new token\r\n        if(0){}\r\n        else if(char_is_space(byte))             { active_token_kind = TXT_TokenKind_Whitespace; }\r\n        else if(byte == '_' ||\r\n                byte == '$' ||\r\n                char_is_alpha(byte))             { active_token_kind = TXT_TokenKind_Identifier; }\r\n        else if(char_is_digit(byte, 10) ||\r\n                (byte == '.' &&\r\n                 char_is_digit(next_byte, 10)))  { active_token_kind = TXT_TokenKind_Numeric; }\r\n        else if(byte == '\"')                     { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }\r\n        else if(byte == '\\'')                    { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }\r\n        else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; }\r\n        else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; }\r\n        else if(byte == '~' || byte == '!' ||\r\n                byte == '%' || byte == '^' ||\r\n                byte == '&' || byte == '*' ||\r\n                byte == '(' || byte == ')' ||\r\n                byte == '-' || byte == '=' ||\r\n                byte == '+' || byte == '[' ||\r\n                byte == ']' || byte == '{' ||\r\n                byte == '}' || byte == ':' ||\r\n                byte == ';' || byte == ',' ||\r\n                byte == '.' || byte == '<' ||\r\n                byte == '>' || byte == '/' ||\r\n                byte == '?' || byte == '|')      { active_token_kind = TXT_TokenKind_Symbol; }\r\n        else if(byte == '#')                     { active_token_kind = TXT_TokenKind_Meta; }\r\n        \r\n        // rjf: start new token\r\n        if(active_token_kind != TXT_TokenKind_Null)\r\n        {\r\n          active_token_start_idx = idx;\r\n        }\r\n        \r\n        // rjf: invalid token kind -> emit error\r\n        else\r\n        {\r\n          TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)};\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n        }\r\n      }\r\n      \r\n      // rjf: look for ender\r\n      U64 ender_pad = 0;\r\n      B32 ender_found = 0;\r\n      if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx)\r\n      {\r\n        if(idx == string.size)\r\n        {\r\n          ender_pad = 0;\r\n          ender_found = 1;\r\n        }\r\n        else switch(active_token_kind)\r\n        {\r\n          default:break;\r\n          case TXT_TokenKind_Whitespace:\r\n          {\r\n            ender_found = !char_is_space(byte);\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte < 128);\r\n          }break;\r\n          case TXT_TokenKind_Numeric:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\\'');\r\n          }break;\r\n          case TXT_TokenKind_String:\r\n          {\r\n            ender_found = (!escaped && ((!string_is_char && byte == '\"') || (string_is_char && byte == '\\'')));\r\n            ender_pad += 1;\r\n          }break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            ender_found = (byte != '~' && byte != '!' &&\r\n                           byte != '%' && byte != '^' &&\r\n                           byte != '&' && byte != '*' &&\r\n                           byte != '(' && byte != ')' &&\r\n                           byte != '-' && byte != '=' &&\r\n                           byte != '+' && byte != '[' &&\r\n                           byte != ']' && byte != '{' &&\r\n                           byte != '}' && byte != ':' &&\r\n                           byte != ';' && byte != ',' &&\r\n                           byte != '.' && byte != '<' &&\r\n                           byte != '>' && byte != '/' &&\r\n                           byte != '?' && byte != '|');\r\n          }break;\r\n          case TXT_TokenKind_Comment:\r\n          {\r\n            if(comment_is_single_line)\r\n            {\r\n              ender_found = (!escaped && (byte == '\\r' || byte == '\\n'));\r\n            }\r\n            else\r\n            {\r\n              ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/');\r\n              ender_pad += 2;\r\n            }\r\n          }break;\r\n          case TXT_TokenKind_Meta:\r\n          {\r\n            ender_found = (!escaped && (byte == '\\r' || byte == '\\n'));\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: next byte is ender => emit token\r\n      if(ender_found)\r\n      {\r\n        TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)};\r\n        active_token_kind = TXT_TokenKind_Null;\r\n        \r\n        // rjf: identifier -> keyword in special cases\r\n        if(token.kind == TXT_TokenKind_Identifier)\r\n        {\r\n          read_only local_persist String8 cpp_keywords[] =\r\n          {\r\n            str8_lit_comp(\"alignas\"),\r\n            str8_lit_comp(\"alignof\"),\r\n            str8_lit_comp(\"and\"),\r\n            str8_lit_comp(\"and_eq\"),\r\n            str8_lit_comp(\"asm\"),\r\n            str8_lit_comp(\"atomic_cancel\"),\r\n            str8_lit_comp(\"atomic_commit\"),\r\n            str8_lit_comp(\"atomic_noexcept\"),\r\n            str8_lit_comp(\"auto\"),\r\n            str8_lit_comp(\"bitand\"),\r\n            str8_lit_comp(\"bitor\"),\r\n            str8_lit_comp(\"bool\"),\r\n            str8_lit_comp(\"break\"),\r\n            str8_lit_comp(\"case\"),\r\n            str8_lit_comp(\"catch\"),\r\n            str8_lit_comp(\"char\"),\r\n            str8_lit_comp(\"char8_t\"),\r\n            str8_lit_comp(\"char16_t\"),\r\n            str8_lit_comp(\"char32_t\"),\r\n            str8_lit_comp(\"class\"),\r\n            str8_lit_comp(\"compl\"),\r\n            str8_lit_comp(\"concept\"),\r\n            str8_lit_comp(\"const\"),\r\n            str8_lit_comp(\"consteval\"),\r\n            str8_lit_comp(\"constexpr\"),\r\n            str8_lit_comp(\"constinit\"),\r\n            str8_lit_comp(\"const_cast\"),\r\n            str8_lit_comp(\"continue\"),\r\n            str8_lit_comp(\"co_await\"),\r\n            str8_lit_comp(\"co_return\"),\r\n            str8_lit_comp(\"co_yield\"),\r\n            str8_lit_comp(\"decltype\"),\r\n            str8_lit_comp(\"default\"),\r\n            str8_lit_comp(\"delete\"),\r\n            str8_lit_comp(\"do\"),\r\n            str8_lit_comp(\"double\"),\r\n            str8_lit_comp(\"dynamic_cast\"),\r\n            str8_lit_comp(\"else\"),\r\n            str8_lit_comp(\"enum\"),\r\n            str8_lit_comp(\"explicit\"),\r\n            str8_lit_comp(\"export\"),\r\n            str8_lit_comp(\"extern\"),\r\n            str8_lit_comp(\"false\"),\r\n            str8_lit_comp(\"float\"),\r\n            str8_lit_comp(\"for\"),\r\n            str8_lit_comp(\"friend\"),\r\n            str8_lit_comp(\"goto\"),\r\n            str8_lit_comp(\"if\"),\r\n            str8_lit_comp(\"inline\"),\r\n            str8_lit_comp(\"int\"),\r\n            str8_lit_comp(\"long\"),\r\n            str8_lit_comp(\"mutable\"),\r\n            str8_lit_comp(\"namespace\"),\r\n            str8_lit_comp(\"new\"),\r\n            str8_lit_comp(\"noexcept\"),\r\n            str8_lit_comp(\"not\"),\r\n            str8_lit_comp(\"not_eq\"),\r\n            str8_lit_comp(\"nullptr\"),\r\n            str8_lit_comp(\"operator\"),\r\n            str8_lit_comp(\"or\"),\r\n            str8_lit_comp(\"or_eq\"),\r\n            str8_lit_comp(\"private\"),\r\n            str8_lit_comp(\"protected\"),\r\n            str8_lit_comp(\"public\"),\r\n            str8_lit_comp(\"reflexpr\"),\r\n            str8_lit_comp(\"register\"),\r\n            str8_lit_comp(\"reinterpret_cast\"),\r\n            str8_lit_comp(\"requires\"),\r\n            str8_lit_comp(\"return\"),\r\n            str8_lit_comp(\"short\"),\r\n            str8_lit_comp(\"signed\"),\r\n            str8_lit_comp(\"sizeof\"),\r\n            str8_lit_comp(\"static\"),\r\n            str8_lit_comp(\"static_assert\"),\r\n            str8_lit_comp(\"static_cast\"),\r\n            str8_lit_comp(\"struct\"),\r\n            str8_lit_comp(\"switch\"),\r\n            str8_lit_comp(\"synchronized\"),\r\n            str8_lit_comp(\"template\"),\r\n            str8_lit_comp(\"this\"),\r\n            str8_lit_comp(\"thread_local\"),\r\n            str8_lit_comp(\"throw\"),\r\n            str8_lit_comp(\"true\"),\r\n            str8_lit_comp(\"try\"),\r\n            str8_lit_comp(\"typedef\"),\r\n            str8_lit_comp(\"typeid\"),\r\n            str8_lit_comp(\"typename\"),\r\n            str8_lit_comp(\"union\"),\r\n            str8_lit_comp(\"unsigned\"),\r\n            str8_lit_comp(\"using\"),\r\n            str8_lit_comp(\"virtual\"),\r\n            str8_lit_comp(\"void\"),\r\n            str8_lit_comp(\"volatile\"),\r\n            str8_lit_comp(\"wchar_t\"),\r\n            str8_lit_comp(\"while\"),\r\n            str8_lit_comp(\"xor\"),\r\n            str8_lit_comp(\"xor_eq\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 keyword_idx = 0; keyword_idx < ArrayCount(cpp_keywords); keyword_idx += 1)\r\n          {\r\n            if(str8_match(cpp_keywords[keyword_idx], token_string, 0))\r\n            {\r\n              token.kind = TXT_TokenKind_Keyword;\r\n              break;\r\n            }\r\n          }\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n        }\r\n        \r\n        // rjf: split symbols by maximum-munch-rule\r\n        else if(token.kind == TXT_TokenKind_Symbol)\r\n        {\r\n          read_only local_persist String8 c_cpp_multichar_symbol_strings[] =\r\n          {\r\n            str8_lit_comp(\"<<\"),\r\n            str8_lit_comp(\">>\"),\r\n            str8_lit_comp(\"<=\"),\r\n            str8_lit_comp(\">=\"),\r\n            str8_lit_comp(\"==\"),\r\n            str8_lit_comp(\"!=\"),\r\n            str8_lit_comp(\"&&\"),\r\n            str8_lit_comp(\"||\"),\r\n            str8_lit_comp(\"|=\"),\r\n            str8_lit_comp(\"&=\"),\r\n            str8_lit_comp(\"^=\"),\r\n            str8_lit_comp(\"~=\"),\r\n            str8_lit_comp(\"+=\"),\r\n            str8_lit_comp(\"-=\"),\r\n            str8_lit_comp(\"*=\"),\r\n            str8_lit_comp(\"/=\"),\r\n            str8_lit_comp(\"%=\"),\r\n            str8_lit_comp(\"<<=\"),\r\n            str8_lit_comp(\">>=\"),\r\n            str8_lit_comp(\"->\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off)\r\n          {\r\n            B32 found = 0;\r\n            for(U64 idx = 0; idx < ArrayCount(c_cpp_multichar_symbol_strings); idx += 1)\r\n            {\r\n              if(str8_match(str8_substr(token_string, r1u64(off, off+c_cpp_multichar_symbol_strings[idx].size)),\r\n                            c_cpp_multichar_symbol_strings[idx],\r\n                            0))\r\n              {\r\n                found = 1;\r\n                next_off = off + c_cpp_multichar_symbol_strings[idx].size;\r\n                TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n                txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n                break;\r\n              }\r\n            }\r\n            if(!found)\r\n            {\r\n              next_off = off+1;\r\n              TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n              txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: all other tokens\r\n        else\r\n        {\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, chunk_size, &token);\r\n        }\r\n        \r\n        // rjf: increment by ender padding\r\n        idx += ender_pad;\r\n      }\r\n      \r\n      // rjf: advance by 1 byte if we haven't found an ender\r\n      if(!ender_found)\r\n      {\r\n        idx += 1;\r\n      }\r\n      escaped = next_escaped;\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: generate token list\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    B32 comment_is_single_line = 0;\r\n    B32 string_is_char = 0;\r\n    TXT_TokenKind active_token_kind = TXT_TokenKind_Null;\r\n    U64 active_token_start_idx = 0;\r\n    B32 escaped = 0;\r\n    B32 next_escaped = 0;\r\n    U64 byte_process_start_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      U8 byte      = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: update counter\r\n      if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size))\r\n      {\r\n        ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx));\r\n        byte_process_start_idx = idx;\r\n      }\r\n      \r\n      // rjf: escaping\r\n      if(escaped && (byte != '\\r' && byte != '\\n'))\r\n      {\r\n        next_escaped = 0;\r\n      }\r\n      else if(!escaped && byte == '\\\\')\r\n      {\r\n        next_escaped = 1;\r\n      }\r\n      \r\n      // rjf: take starter, determine active token kind\r\n      if(active_token_kind == TXT_TokenKind_Null)\r\n      {\r\n        // rjf: use next bytes to start a new token\r\n        if(0){}\r\n        else if(char_is_space(byte))             { active_token_kind = TXT_TokenKind_Whitespace; }\r\n        else if(byte == '_' ||\r\n                byte == '$' ||\r\n                char_is_alpha(byte))             { active_token_kind = TXT_TokenKind_Identifier; }\r\n        else if(char_is_digit(byte, 10) ||\r\n                (byte == '.' &&\r\n                 char_is_digit(next_byte, 10)))  { active_token_kind = TXT_TokenKind_Numeric; }\r\n        else if(byte == '\"')                     { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }\r\n        else if(byte == '\\'')                    { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }\r\n        else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; }\r\n        else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; }\r\n        else if(byte == '~' || byte == '!' ||\r\n                byte == '%' || byte == '^' ||\r\n                byte == '&' || byte == '*' ||\r\n                byte == '(' || byte == ')' ||\r\n                byte == '-' || byte == '=' ||\r\n                byte == '+' || byte == '[' ||\r\n                byte == ']' || byte == '{' ||\r\n                byte == '}' || byte == ':' ||\r\n                byte == ';' || byte == ',' ||\r\n                byte == '.' || byte == '<' ||\r\n                byte == '>' || byte == '/' ||\r\n                byte == '?' || byte == '|')      { active_token_kind = TXT_TokenKind_Symbol; }\r\n        else if(byte == '#')                     { active_token_kind = TXT_TokenKind_Meta; }\r\n        \r\n        // rjf: start new token\r\n        if(active_token_kind != TXT_TokenKind_Null)\r\n        {\r\n          active_token_start_idx = idx;\r\n        }\r\n        \r\n        // rjf: invalid token kind -> emit error\r\n        else\r\n        {\r\n          TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)};\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n      }\r\n      \r\n      // rjf: look for ender\r\n      U64 ender_pad = 0;\r\n      B32 ender_found = 0;\r\n      if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx)\r\n      {\r\n        if(idx == string.size)\r\n        {\r\n          ender_pad = 0;\r\n          ender_found = 1;\r\n        }\r\n        else switch(active_token_kind)\r\n        {\r\n          default:break;\r\n          case TXT_TokenKind_Whitespace:\r\n          {\r\n            ender_found = !char_is_space(byte);\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte < 128);\r\n          }break;\r\n          case TXT_TokenKind_Numeric:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\\'');\r\n          }break;\r\n          case TXT_TokenKind_String:\r\n          {\r\n            ender_found = (!escaped && ((!string_is_char && byte == '\"') || (string_is_char && byte == '\\'')));\r\n            ender_pad += 1;\r\n          }break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            ender_found = (byte != '~' && byte != '!' &&\r\n                           byte != '%' && byte != '^' &&\r\n                           byte != '&' && byte != '*' &&\r\n                           byte != '(' && byte != ')' &&\r\n                           byte != '-' && byte != '=' &&\r\n                           byte != '+' && byte != '[' &&\r\n                           byte != ']' && byte != '{' &&\r\n                           byte != '}' && byte != ':' &&\r\n                           byte != ';' && byte != ',' &&\r\n                           byte != '.' && byte != '<' &&\r\n                           byte != '>' && byte != '/' &&\r\n                           byte != '?' && byte != '|');\r\n          }break;\r\n          case TXT_TokenKind_Comment:\r\n          {\r\n            if(comment_is_single_line)\r\n            {\r\n              ender_found = (!escaped && (byte == '\\r' || byte == '\\n'));\r\n            }\r\n            else\r\n            {\r\n              ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/');\r\n              ender_pad += 2;\r\n            }\r\n          }break;\r\n          case TXT_TokenKind_Meta:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$');\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: next byte is ender => emit token\r\n      if(ender_found)\r\n      {\r\n        TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)};\r\n        active_token_kind = TXT_TokenKind_Null;\r\n        \r\n        // rjf: identifier -> keyword in special cases\r\n        if(token.kind == TXT_TokenKind_Identifier)\r\n        {\r\n          read_only local_persist String8 odin_keywords[] =\r\n          {\r\n            str8_lit_comp(\"align_of\"),\r\n            str8_lit_comp(\"asm\"),\r\n            str8_lit_comp(\"auto_cast\"),\r\n            str8_lit_comp(\"bit_set\"),\r\n            str8_lit_comp(\"break\"),\r\n            str8_lit_comp(\"case\"),\r\n            str8_lit_comp(\"cast\"),\r\n            str8_lit_comp(\"context\"),\r\n            str8_lit_comp(\"continue\"),\r\n            str8_lit_comp(\"defer\"),\r\n            str8_lit_comp(\"distinct\"),\r\n            str8_lit_comp(\"do\"),\r\n            str8_lit_comp(\"dynamic\"),\r\n            str8_lit_comp(\"else\"),\r\n            str8_lit_comp(\"enum\"),\r\n            str8_lit_comp(\"fallthrough\"),\r\n            str8_lit_comp(\"for\"),\r\n            str8_lit_comp(\"foreign\"),\r\n            str8_lit_comp(\"if\"),\r\n            str8_lit_comp(\"in\"),\r\n            str8_lit_comp(\"map\"),\r\n            str8_lit_comp(\"matrix\"),\r\n            str8_lit_comp(\"not_in\"),\r\n            str8_lit_comp(\"or_break\"),\r\n            str8_lit_comp(\"or_continue\"),\r\n            str8_lit_comp(\"or_else\"),\r\n            str8_lit_comp(\"or_return\"),\r\n            str8_lit_comp(\"package\"),\r\n            str8_lit_comp(\"proc\"),\r\n            str8_lit_comp(\"return\"),\r\n            str8_lit_comp(\"size_of\"),\r\n            str8_lit_comp(\"struct\"),\r\n            str8_lit_comp(\"switch\"),\r\n            str8_lit_comp(\"transmute\"),\r\n            str8_lit_comp(\"typeid\"),\r\n            str8_lit_comp(\"union\"),\r\n            str8_lit_comp(\"using\"),\r\n            str8_lit_comp(\"when\"),\r\n            str8_lit_comp(\"where\"),\r\n            str8_lit_comp(\"import\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 keyword_idx = 0; keyword_idx < ArrayCount(odin_keywords); keyword_idx += 1)\r\n          {\r\n            if(str8_match(odin_keywords[keyword_idx], token_string, 0))\r\n            {\r\n              token.kind = TXT_TokenKind_Keyword;\r\n              break;\r\n            }\r\n          }\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: split symbols by maximum-munch-rule\r\n        else if(token.kind == TXT_TokenKind_Symbol)\r\n        {\r\n          read_only local_persist String8 odin_multichar_symbol_strings[] =\r\n          {\r\n            str8_lit_comp(\"<<\"),\r\n            str8_lit_comp(\">>\"),\r\n            str8_lit_comp(\"<=\"),\r\n            str8_lit_comp(\">=\"),\r\n            str8_lit_comp(\"==\"),\r\n            str8_lit_comp(\"!=\"),\r\n            str8_lit_comp(\"&&\"),\r\n            str8_lit_comp(\"||\"),\r\n            str8_lit_comp(\"|=\"),\r\n            str8_lit_comp(\"&=\"),\r\n            str8_lit_comp(\"^=\"),\r\n            str8_lit_comp(\"~=\"),\r\n            str8_lit_comp(\"+=\"),\r\n            str8_lit_comp(\"-=\"),\r\n            str8_lit_comp(\"*=\"),\r\n            str8_lit_comp(\"/=\"),\r\n            str8_lit_comp(\"%=\"),\r\n            str8_lit_comp(\"<<=\"),\r\n            str8_lit_comp(\">>=\"),\r\n            str8_lit_comp(\"->\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off)\r\n          {\r\n            B32 found = 0;\r\n            for(U64 idx = 0; idx < ArrayCount(odin_multichar_symbol_strings); idx += 1)\r\n            {\r\n              if(str8_match(str8_substr(token_string, r1u64(off, off+odin_multichar_symbol_strings[idx].size)),\r\n                            odin_multichar_symbol_strings[idx],\r\n                            0))\r\n              {\r\n                found = 1;\r\n                next_off = off + odin_multichar_symbol_strings[idx].size;\r\n                TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n                txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n                break;\r\n              }\r\n            }\r\n            if(!found)\r\n            {\r\n              next_off = off+1;\r\n              TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n              txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: all other tokens\r\n        else\r\n        {\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: increment by ender padding\r\n        idx += ender_pad;\r\n      }\r\n      \r\n      // rjf: advance by 1 byte if we haven't found an ender\r\n      if(!ender_found)\r\n      {\r\n        idx += 1;\r\n      }\r\n      escaped = next_escaped;\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: generate token list\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    B32 comment_is_single_line = 0;\r\n    B32 string_is_char = 0;\r\n    TXT_TokenKind active_token_kind = TXT_TokenKind_Null;\r\n    U64 active_token_start_idx = 0;\r\n    B32 escaped = 0;\r\n    B32 next_escaped = 0;\r\n    U64 byte_process_start_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      U8 byte      = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: update counter\r\n      if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size))\r\n      {\r\n        ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx));\r\n        byte_process_start_idx = idx;\r\n      }\r\n      \r\n      // rjf: escaping\r\n      if(escaped && (byte != '\\r' && byte != '\\n'))\r\n      {\r\n        next_escaped = 0;\r\n      }\r\n      else if(!escaped && byte == '\\\\')\r\n      {\r\n        next_escaped = 1;\r\n      }\r\n      \r\n      // rjf: take starter, determine active token kind\r\n      if(active_token_kind == TXT_TokenKind_Null)\r\n      {\r\n        // rjf: use next bytes to start a new token\r\n        if(0){}\r\n        else if(char_is_space(byte))             { active_token_kind = TXT_TokenKind_Whitespace; }\r\n        else if(byte == '_' ||\r\n                byte == '$' ||\r\n                char_is_alpha(byte))             { active_token_kind = TXT_TokenKind_Identifier; }\r\n        else if(char_is_digit(byte, 10) ||\r\n                (byte == '.' &&\r\n                 char_is_digit(next_byte, 10)))  { active_token_kind = TXT_TokenKind_Numeric; }\r\n        else if(byte == '\"')                     { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }\r\n        else if(byte == '\\'')                    { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }\r\n        else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 1; }\r\n        else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; comment_is_single_line = 0; }\r\n        else if(byte == '~' || byte == '!' ||\r\n                byte == '%' || byte == '^' ||\r\n                byte == '&' || byte == '*' ||\r\n                byte == '(' || byte == ')' ||\r\n                byte == '-' || byte == '=' ||\r\n                byte == '+' || byte == '[' ||\r\n                byte == ']' || byte == '{' ||\r\n                byte == '}' || byte == ':' ||\r\n                byte == ';' || byte == ',' ||\r\n                byte == '.' || byte == '<' ||\r\n                byte == '>' || byte == '/' ||\r\n                byte == '?' || byte == '|')      { active_token_kind = TXT_TokenKind_Symbol; }\r\n        else if(byte == '#')                     { active_token_kind = TXT_TokenKind_Meta; }\r\n        \r\n        // rjf: start new token\r\n        if(active_token_kind != TXT_TokenKind_Null)\r\n        {\r\n          active_token_start_idx = idx;\r\n        }\r\n        \r\n        // rjf: invalid token kind -> emit error\r\n        else\r\n        {\r\n          TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)};\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n      }\r\n      \r\n      // rjf: look for ender\r\n      U64 ender_pad = 0;\r\n      B32 ender_found = 0;\r\n      if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx)\r\n      {\r\n        if(idx == string.size)\r\n        {\r\n          ender_pad = 0;\r\n          ender_found = 1;\r\n        }\r\n        else switch(active_token_kind)\r\n        {\r\n          default:break;\r\n          case TXT_TokenKind_Whitespace:\r\n          {\r\n            ender_found = !char_is_space(byte);\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte < 128);\r\n          }break;\r\n          case TXT_TokenKind_Numeric:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\\'');\r\n          }break;\r\n          case TXT_TokenKind_String:\r\n          {\r\n            ender_found = (!escaped && ((!string_is_char && byte == '\"') || (string_is_char && byte == '\\'')));\r\n            ender_pad += 1;\r\n          }break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            ender_found = (byte != '~' && byte != '!' &&\r\n                           byte != '%' && byte != '^' &&\r\n                           byte != '&' && byte != '*' &&\r\n                           byte != '(' && byte != ')' &&\r\n                           byte != '-' && byte != '=' &&\r\n                           byte != '+' && byte != '[' &&\r\n                           byte != ']' && byte != '{' &&\r\n                           byte != '}' && byte != ':' &&\r\n                           byte != ';' && byte != ',' &&\r\n                           byte != '.' && byte != '<' &&\r\n                           byte != '>' && byte != '/' &&\r\n                           byte != '?' && byte != '|');\r\n          }break;\r\n          case TXT_TokenKind_Comment:\r\n          {\r\n            if(comment_is_single_line)\r\n            {\r\n              ender_found = (!escaped && (byte == '\\r' || byte == '\\n'));\r\n            }\r\n            else\r\n            {\r\n              ender_found = (active_token_start_idx+1 < idx && byte == '*' && next_byte == '/');\r\n              ender_pad += 2;\r\n            }\r\n          }break;\r\n          case TXT_TokenKind_Meta:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$');\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: next byte is ender => emit token\r\n      if(ender_found)\r\n      {\r\n        TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)};\r\n        active_token_kind = TXT_TokenKind_Null;\r\n        \r\n        // rjf: identifier -> keyword in special cases\r\n        if(token.kind == TXT_TokenKind_Identifier)\r\n        {\r\n          read_only local_persist String8 jai_keywords[] =\r\n          {\r\n            str8_lit_comp(\"bool\"),\r\n            str8_lit_comp(\"true\"),\r\n            str8_lit_comp(\"false\"),\r\n            str8_lit_comp(\"int\"),\r\n            str8_lit_comp(\"s8\"),\r\n            str8_lit_comp(\"u8\"),\r\n            str8_lit_comp(\"s16\"),\r\n            str8_lit_comp(\"u16\"),\r\n            str8_lit_comp(\"s32\"),\r\n            str8_lit_comp(\"u32\"),\r\n            str8_lit_comp(\"s64\"),\r\n            str8_lit_comp(\"u64\"),\r\n            str8_lit_comp(\"s128\"),\r\n            str8_lit_comp(\"u128\"),\r\n            str8_lit_comp(\"float\"),\r\n            str8_lit_comp(\"float32\"),\r\n            str8_lit_comp(\"float64\"),\r\n            str8_lit_comp(\"void\"),\r\n            str8_lit_comp(\"enum\"),\r\n            str8_lit_comp(\"enum_flags\"),\r\n            str8_lit_comp(\"size_of\"),\r\n            str8_lit_comp(\"string\"),\r\n            str8_lit_comp(\"type_of\"),\r\n            str8_lit_comp(\"cast\"),\r\n            str8_lit_comp(\"if\"),\r\n            str8_lit_comp(\"ifs\"),\r\n            str8_lit_comp(\"then\"),\r\n            str8_lit_comp(\"else\"),\r\n            str8_lit_comp(\"case\"),\r\n            str8_lit_comp(\"for\"),\r\n            str8_lit_comp(\"while\"),\r\n            str8_lit_comp(\"break\"),\r\n            str8_lit_comp(\"continue\"),\r\n            str8_lit_comp(\"remove\"),\r\n            str8_lit_comp(\"return\"),\r\n            str8_lit_comp(\"inline\"),\r\n            str8_lit_comp(\"null\"),\r\n            str8_lit_comp(\"defer\"),\r\n            str8_lit_comp(\"xx\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 keyword_idx = 0; keyword_idx < ArrayCount(jai_keywords); keyword_idx += 1)\r\n          {\r\n            if(str8_match(jai_keywords[keyword_idx], token_string, 0))\r\n            {\r\n              token.kind = TXT_TokenKind_Keyword;\r\n              break;\r\n            }\r\n          }\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: split symbols by maximum-munch-rule\r\n        else if(token.kind == TXT_TokenKind_Symbol)\r\n        {\r\n          read_only local_persist String8 jai_multichar_symbol_strings[] =\r\n          {\r\n            str8_lit_comp(\"<<\"),\r\n            str8_lit_comp(\">>\"),\r\n            str8_lit_comp(\"<=\"),\r\n            str8_lit_comp(\">=\"),\r\n            str8_lit_comp(\"==\"),\r\n            str8_lit_comp(\"!=\"),\r\n            str8_lit_comp(\"&&\"),\r\n            str8_lit_comp(\"||\"),\r\n            str8_lit_comp(\"|=\"),\r\n            str8_lit_comp(\"&=\"),\r\n            str8_lit_comp(\"^=\"),\r\n            str8_lit_comp(\"~=\"),\r\n            str8_lit_comp(\"+=\"),\r\n            str8_lit_comp(\"-=\"),\r\n            str8_lit_comp(\"*=\"),\r\n            str8_lit_comp(\"/=\"),\r\n            str8_lit_comp(\"%=\"),\r\n            str8_lit_comp(\"<<=\"),\r\n            str8_lit_comp(\">>=\"),\r\n            str8_lit_comp(\"->\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off)\r\n          {\r\n            B32 found = 0;\r\n            for(U64 idx = 0; idx < ArrayCount(jai_multichar_symbol_strings); idx += 1)\r\n            {\r\n              if(str8_match(str8_substr(token_string, r1u64(off, off+jai_multichar_symbol_strings[idx].size)),\r\n                            jai_multichar_symbol_strings[idx],\r\n                            0))\r\n              {\r\n                found = 1;\r\n                next_off = off + jai_multichar_symbol_strings[idx].size;\r\n                TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n                txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n                break;\r\n              }\r\n            }\r\n            if(!found)\r\n            {\r\n              next_off = off+1;\r\n              TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n              txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: all other tokens\r\n        else\r\n        {\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: increment by ender padding\r\n        idx += ender_pad;\r\n      }\r\n      \r\n      // rjf: advance by 1 byte if we haven't found an ender\r\n      if(!ender_found)\r\n      {\r\n        idx += 1;\r\n      }\r\n      escaped = next_escaped;\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: generate token list\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    B32 string_is_char = 0;\r\n    B32 string_is_line = 0;\r\n    TXT_TokenKind active_token_kind = TXT_TokenKind_Null;\r\n    U64 active_token_start_idx = 0;\r\n    B32 escaped = 0;\r\n    B32 next_escaped = 0;\r\n    U64 byte_process_start_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      U8 byte        = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      U8 next_byte   = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: update counter\r\n      if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size))\r\n      {\r\n        ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx));\r\n        byte_process_start_idx = idx;\r\n      }\r\n      \r\n      // rjf: escaping\r\n      if(escaped && (byte != '\\r' && byte != '\\n'))\r\n      {\r\n        next_escaped = 0;\r\n      }\r\n      else if(!escaped && byte == '\\\\')\r\n      {\r\n        next_escaped = 1;\r\n      }\r\n      \r\n      // rjf: take starter, determine active token kind\r\n      if(active_token_kind == TXT_TokenKind_Null)\r\n      {\r\n        // rjf: use next bytes to start a new token\r\n        if(0){}\r\n        else if(char_is_space(byte))             { active_token_kind = TXT_TokenKind_Whitespace; }\r\n        else if(byte == '_' ||\r\n                char_is_alpha(byte))             { active_token_kind = TXT_TokenKind_Identifier; }\r\n        else if(char_is_digit(byte, 10) ||\r\n                (byte == '.' &&\r\n                 char_is_digit(next_byte, 10)))  { active_token_kind = TXT_TokenKind_Numeric; }\r\n        else if(byte == '\"')                     { active_token_kind = TXT_TokenKind_String; string_is_char = 0; }\r\n        else if(byte == '\\'')                    { active_token_kind = TXT_TokenKind_String; string_is_char = 1; }\r\n        else if(byte == '\\\\' &&\r\n                next_byte == '\\\\')               { active_token_kind = TXT_TokenKind_String; string_is_line = 1; }\r\n        else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; }\r\n        else if(byte == '~' || byte == '!' ||\r\n                byte == '%' || byte == '^' ||\r\n                byte == '&' || byte == '*' ||\r\n                byte == '(' || byte == ')' ||\r\n                byte == '-' || byte == '=' ||\r\n                byte == '+' || byte == '[' ||\r\n                byte == ']' || byte == '{' ||\r\n                byte == '}' || byte == ':' ||\r\n                byte == ';' || byte == ',' ||\r\n                byte == '.' || byte == '<' ||\r\n                byte == '>' || byte == '/' ||\r\n                byte == '?' || byte == '|' ||\r\n                byte == 'c')                     { active_token_kind = TXT_TokenKind_Symbol; }\r\n        \r\n        // rjf: start new token\r\n        if(active_token_kind != TXT_TokenKind_Null)\r\n        {\r\n          active_token_start_idx = idx;\r\n        }\r\n        \r\n        // rjf: invalid token kind -> emit error\r\n        else\r\n        {\r\n          TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)};\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n      }\r\n      \r\n      // rjf: look for ender\r\n      U64 ender_pad = 0;\r\n      B32 ender_found = 0;\r\n      if(active_token_kind != TXT_TokenKind_Null && idx>active_token_start_idx)\r\n      {\r\n        if(idx == string.size)\r\n        {\r\n          ender_pad = 0;\r\n          ender_found = 1;\r\n        }\r\n        else switch(active_token_kind)\r\n        {\r\n          default:break;\r\n          case TXT_TokenKind_Whitespace:\r\n          {\r\n            ender_found = !char_is_space(byte);\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte < 128);\r\n          }break;\r\n          case TXT_TokenKind_Numeric:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\\'');\r\n          }break;\r\n          case TXT_TokenKind_String:\r\n          {\r\n            if (string_is_line)\r\n            {\r\n              ender_found = (!escaped && (byte == '\\r' || byte == '\\n'));\r\n            }\r\n            else\r\n            {\r\n              ender_found = (!escaped && ((!string_is_char && byte == '\"') || (string_is_char && byte == '\\'')));\r\n              ender_pad += 1;\r\n            }\r\n          }break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            ender_found = (byte != '~' && byte != '!' &&\r\n                           byte != '%' && byte != '^' &&\r\n                           byte != '&' && byte != '*' &&\r\n                           byte != '(' && byte != ')' &&\r\n                           byte != '-' && byte != '=' &&\r\n                           byte != '+' && byte != '[' &&\r\n                           byte != ']' && byte != '{' &&\r\n                           byte != '}' && byte != ':' &&\r\n                           byte != ';' && byte != ',' &&\r\n                           byte != '.' && byte != '<' &&\r\n                           byte != '>' && byte != '/' &&\r\n                           byte != '?' && byte != '|' &&\r\n                           byte != 'c');\r\n          }break;\r\n          case TXT_TokenKind_Comment:\r\n          {\r\n            ender_found = (!escaped && (byte == '\\r' || byte == '\\n'));\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: next byte is ender => emit token\r\n      if(ender_found)\r\n      {\r\n        TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)};\r\n        active_token_kind = TXT_TokenKind_Null;\r\n        \r\n        // rjf: identifier -> keyword in special cases\r\n        if(token.kind == TXT_TokenKind_Identifier)\r\n        {\r\n          read_only local_persist String8 zig_keywords[] =\r\n          {\r\n            str8_lit_comp(\"addrspace\"),\r\n            str8_lit_comp(\"align\"),\r\n            str8_lit_comp(\"allowzero\"),\r\n            str8_lit_comp(\"and\"),\r\n            str8_lit_comp(\"anyframe\"),\r\n            str8_lit_comp(\"anytype\"),\r\n            str8_lit_comp(\"asm\"),\r\n            str8_lit_comp(\"async\"),\r\n            str8_lit_comp(\"await\"),\r\n            str8_lit_comp(\"break\"),\r\n            str8_lit_comp(\"callconv\"),\r\n            str8_lit_comp(\"catch\"),\r\n            str8_lit_comp(\"comptime\"),\r\n            str8_lit_comp(\"const\"),\r\n            str8_lit_comp(\"continue\"),\r\n            str8_lit_comp(\"defer\"),\r\n            str8_lit_comp(\"else\"),\r\n            str8_lit_comp(\"enum\"),\r\n            str8_lit_comp(\"errdefer\"),\r\n            str8_lit_comp(\"error\"),\r\n            str8_lit_comp(\"export\"),\r\n            str8_lit_comp(\"extern\"),\r\n            str8_lit_comp(\"fn\"),\r\n            str8_lit_comp(\"for\"),\r\n            str8_lit_comp(\"if\"),\r\n            str8_lit_comp(\"inline\"),\r\n            str8_lit_comp(\"noalias\"),\r\n            str8_lit_comp(\"nosuspend\"),\r\n            str8_lit_comp(\"noinline\"),\r\n            str8_lit_comp(\"opaque\"),\r\n            str8_lit_comp(\"or\"),\r\n            str8_lit_comp(\"orelse\"),\r\n            str8_lit_comp(\"packed\"),\r\n            str8_lit_comp(\"pub\"),\r\n            str8_lit_comp(\"resume\"),\r\n            str8_lit_comp(\"return\"),\r\n            str8_lit_comp(\"linksection\"),\r\n            str8_lit_comp(\"struct\"),\r\n            str8_lit_comp(\"suspend\"),\r\n            str8_lit_comp(\"switch\"),\r\n            str8_lit_comp(\"test\"),\r\n            str8_lit_comp(\"threadlocal\"),\r\n            str8_lit_comp(\"try\"),\r\n            str8_lit_comp(\"union\"),\r\n            str8_lit_comp(\"unreachable\"),\r\n            str8_lit_comp(\"usingnamespace\"),\r\n            str8_lit_comp(\"var\"),\r\n            str8_lit_comp(\"volatile\"),\r\n            str8_lit_comp(\"while\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 keyword_idx = 0; keyword_idx < ArrayCount(zig_keywords); keyword_idx += 1)\r\n          {\r\n            if(str8_match(zig_keywords[keyword_idx], token_string, 0))\r\n            {\r\n              token.kind = TXT_TokenKind_Keyword;\r\n              break;\r\n            }\r\n          }\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: split symbols by maximum-munch-rule\r\n        else if(token.kind == TXT_TokenKind_Symbol)\r\n        {\r\n          read_only local_persist String8 zig_multichar_symbol_strings[] =\r\n          {\r\n            str8_lit_comp(\"<<\"),\r\n            str8_lit_comp(\">>\"),\r\n            str8_lit_comp(\"<=\"),\r\n            str8_lit_comp(\">=\"),\r\n            str8_lit_comp(\"==\"),\r\n            str8_lit_comp(\"!=\"),\r\n            str8_lit_comp(\"&&\"),\r\n            str8_lit_comp(\"||\"),\r\n            str8_lit_comp(\"|=\"),\r\n            str8_lit_comp(\"&=\"),\r\n            str8_lit_comp(\"^=\"),\r\n            str8_lit_comp(\"~=\"),\r\n            str8_lit_comp(\"+=\"),\r\n            str8_lit_comp(\"-=\"),\r\n            str8_lit_comp(\"*=\"),\r\n            str8_lit_comp(\"/=\"),\r\n            str8_lit_comp(\"%=\"),\r\n            str8_lit_comp(\"<<=\"),\r\n            str8_lit_comp(\">>=\"),\r\n            str8_lit_comp(\"->\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off)\r\n          {\r\n            B32 found = 0;\r\n            for(U64 idx = 0; idx < ArrayCount(zig_multichar_symbol_strings); idx += 1)\r\n            {\r\n              if(str8_match(str8_substr(token_string, r1u64(off, off+zig_multichar_symbol_strings[idx].size)),\r\n                            zig_multichar_symbol_strings[idx],\r\n                            0))\r\n              {\r\n                found = 1;\r\n                next_off = off + zig_multichar_symbol_strings[idx].size;\r\n                TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n                txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n                break;\r\n              }\r\n            }\r\n            if(!found)\r\n            {\r\n              next_off = off+1;\r\n              TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n              txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: all other tokens\r\n        else\r\n        {\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: increment by ender padding\r\n        idx += ender_pad;\r\n      }\r\n      \r\n      // rjf: advance by 1 byte if we haven't found an ender\r\n      if(!ender_found)\r\n      {\r\n        idx += 1;\r\n      }\r\n      escaped = next_escaped;\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, String8 string)\r\n{\r\n  // NOTE(spey): Rust supports unicode identifiers. They are not handled in any way here,\r\n  // but it might be worth looking into in the future.\r\n  \r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: generate token list\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    S32 multiline_comment_nesting_level = 0;\r\n    S32 raw_string_nesting_level = 0;\r\n    S32 raw_string_ender_nesting_level = 0;\r\n    \r\n    // NOTE(spey): Rust's syntax is designed in such a way that we can't be sure what a token\r\n    // is immediately from the first character, so we have to keep track of some possibilities.\r\n    B32 token_may_be_char = 0;\r\n    B32 token_may_be_lifetime = 0;\r\n    B32 token_may_be_string = 0;\r\n    \r\n    TXT_TokenKind active_token_kind = TXT_TokenKind_Null;\r\n    U64 active_token_start_idx = 0;\r\n    B32 escaped = 0;\r\n    B32 next_escaped = 0;\r\n    U64 byte_process_start_idx = 0;\r\n    for(U64 idx = 0; idx <= string.size;)\r\n    {\r\n      U8 byte      = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      U8 next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: update counter\r\n      if(bytes_processed_counter != 0 && ((idx-byte_process_start_idx) >= 1000 || idx == string.size))\r\n      {\r\n        ins_atomic_u64_add_eval(bytes_processed_counter, (idx-byte_process_start_idx));\r\n        byte_process_start_idx = idx;\r\n      }\r\n      \r\n      // rjf: escaping\r\n      if(escaped && (byte != '\\r' && byte != '\\n'))\r\n      {\r\n        next_escaped = 0;\r\n      }\r\n      else if(!escaped && byte == '\\\\')\r\n      {\r\n        next_escaped = 1;\r\n      }\r\n      \r\n      // rjf: take starter, determine active token kind\r\n      U64 starter_pad = 0;\r\n      \r\n      // spey: special case of starter for nested comments\r\n      if(active_token_kind == TXT_TokenKind_Comment)\r\n      {\r\n        if(byte == '/' && next_byte == '*')      { active_token_kind = TXT_TokenKind_Comment; multiline_comment_nesting_level++; starter_pad = 1; }\r\n      }\r\n      // spey: special case of starter for raw string literals\r\n      else if(active_token_kind == TXT_TokenKind_Identifier && token_may_be_string)\r\n      {\r\n        if(0){}\r\n        else if(byte == 'r' && next_byte == '#') {} // spey: still an identifier that may be a string (this branch triggers for raw byte/C string literals)\r\n        else if(byte == '#' && next_byte == '\"') { active_token_kind = TXT_TokenKind_String; token_may_be_string = 0; token_may_be_char = 0; raw_string_nesting_level++; starter_pad = 2; }\r\n        else if(byte == '#' && next_byte == '#') { raw_string_nesting_level++; }\r\n        else                                     { token_may_be_string = 0; token_may_be_char = 0; raw_string_nesting_level = 0; } // spey: confirmed raw identifier\r\n      }\r\n      // spey: regular cases\r\n      else if(active_token_kind == TXT_TokenKind_Null)\r\n      {\r\n        // rjf: use next bytes to start a new token\r\n        if(0){}\r\n        else if(char_is_space(byte))             { active_token_kind = TXT_TokenKind_Whitespace; }\r\n        else if(byte == 'r' && next_byte == '#') { active_token_kind = TXT_TokenKind_Identifier; token_may_be_string = 1; } // spey: either raw identifiers or raw string literals\r\n        else if(char_is_digit(byte, 10) ||\r\n                (byte == '.' &&\r\n                 char_is_digit(next_byte, 10)))  { active_token_kind = TXT_TokenKind_Numeric; }\r\n        else if(byte == '\"')                     { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; }\r\n        else if((byte == 'c' || byte == 'b') &&\r\n                next_byte == '\"')               { active_token_kind = TXT_TokenKind_String; token_may_be_char = 0; starter_pad = 1; }\r\n        else if((byte == 'c' || byte == 'b') &&\r\n                next_byte == 'r')               { active_token_kind = TXT_TokenKind_Identifier; token_may_be_string = 1; }\r\n        else if(byte == '_' ||\r\n                char_is_alpha(byte))             { active_token_kind = TXT_TokenKind_Identifier; }\r\n        else if(byte == '/' && next_byte == '/') { active_token_kind = TXT_TokenKind_Comment; starter_pad = 1; }\r\n        else if(byte == '/' && next_byte == '*') { active_token_kind = TXT_TokenKind_Comment; starter_pad = 1; multiline_comment_nesting_level++; }\r\n        else if(byte == '~' || byte == '!' ||\r\n                byte == '%' || byte == '^' ||\r\n                byte == '&' || byte == '*' ||\r\n                byte == '(' || byte == ')' ||\r\n                byte == '-' || byte == '=' ||\r\n                byte == '+' || byte == '[' ||\r\n                byte == ']' || byte == '{' ||\r\n                byte == '}' || byte == ':' ||\r\n                byte == ';' || byte == ',' ||\r\n                byte == '.' || byte == '<' ||\r\n                byte == '>' || byte == '/' ||\r\n                byte == '?' || byte == '|')      { active_token_kind = TXT_TokenKind_Symbol; }\r\n        else if(byte == '\\'')                    { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; token_may_be_lifetime = 1; }\r\n        else if((byte == 'c' || byte == 'b') &&\r\n                next_byte == '\\'')              { active_token_kind = TXT_TokenKind_String; token_may_be_char = 1; starter_pad = 1; }\r\n        \r\n        // rjf: start new token\r\n        if(active_token_kind != TXT_TokenKind_Null)\r\n        {\r\n          active_token_start_idx = idx;\r\n        }\r\n        \r\n        // rjf: invalid token kind -> emit error\r\n        else\r\n        {\r\n          TXT_Token token = {TXT_TokenKind_Error, r1u64(idx, idx+1)};\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n      }\r\n      \r\n      B32 is_on_starter = idx <= active_token_start_idx || token_may_be_string;\r\n      \r\n      // spey: advance by starter padding byte(s) and reset byte/next_byte values\r\n      idx += starter_pad;\r\n      byte      = (idx+0 < string.size) ? (string.str[idx+0]) : 0;\r\n      next_byte = (idx+1 < string.size) ? (string.str[idx+1]) : 0;\r\n      \r\n      // rjf: look for ender\r\n      U64 ender_pad = 0;\r\n      B32 ender_found = 0;\r\n      if(active_token_kind != TXT_TokenKind_Null && !is_on_starter)\r\n      {\r\n        if(idx == string.size)\r\n        {\r\n          ender_pad = 0;\r\n          ender_found = 1;\r\n        }\r\n        else switch(active_token_kind)\r\n        {\r\n          default:break;\r\n          case TXT_TokenKind_Whitespace:\r\n          {\r\n            ender_found = !char_is_space(byte);\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '$' && byte != '#' && byte != '!' && byte < 128);\r\n          }break;\r\n          case TXT_TokenKind_Numeric:\r\n          {\r\n            ender_found = (!char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte != '.' && byte != '\\'');\r\n          }break;\r\n          case TXT_TokenKind_String:\r\n          {\r\n            if(!escaped)\r\n            {\r\n              if(token_may_be_char)\r\n              {\r\n                if(byte == '\\'')\r\n                {\r\n                  // spey: char ending\r\n                  ender_found = 1;\r\n                }\r\n                else if(token_may_be_lifetime && !char_is_alpha(byte) && !char_is_digit(byte, 10) && byte != '_' && byte < 128)\r\n                {\r\n                  // spey: lifetime ending\r\n                  ender_found = 1;\r\n                }\r\n              }\r\n              else\r\n              {\r\n                if(0){}\r\n                \r\n                // spey: regular string\r\n                else if(raw_string_nesting_level == 0)       { ender_found = byte == '\"'; }\r\n                \r\n                // spey: raw string\r\n                else if(byte == '\"' && next_byte == '#' &&\r\n                        raw_string_ender_nesting_level == 0) { raw_string_ender_nesting_level++; }\r\n                else if(byte == '#' && next_byte != '#' &&\r\n                        raw_string_ender_nesting_level == raw_string_nesting_level &&\r\n                        raw_string_ender_nesting_level >= 0) { ender_found = 1; raw_string_nesting_level = 0; raw_string_ender_nesting_level = 0; }\r\n                else if(byte == '#' && next_byte != '#' &&\r\n                        raw_string_ender_nesting_level >= 0) { raw_string_ender_nesting_level = 0; }\r\n                else if(byte == '#' &&\r\n                        raw_string_ender_nesting_level >= 0) { raw_string_ender_nesting_level++; }\r\n              }\r\n            }\r\n            \r\n            ender_pad += 1;\r\n          }break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            ender_found = (byte != '~' && byte != '!' &&\r\n                           byte != '%' && byte != '^' &&\r\n                           byte != '&' && byte != '*' &&\r\n                           byte != '(' && byte != ')' &&\r\n                           byte != '-' && byte != '=' &&\r\n                           byte != '+' && byte != '[' &&\r\n                           byte != ']' && byte != '{' &&\r\n                           byte != '}' && byte != ':' &&\r\n                           byte != ';' && byte != ',' &&\r\n                           byte != '.' && byte != '<' &&\r\n                           byte != '>' && byte != '/' &&\r\n                           byte != '?' && byte != '|');\r\n          }break;\r\n          case TXT_TokenKind_Comment:\r\n          {\r\n            if(multiline_comment_nesting_level == 0)\r\n            {\r\n              ender_found = (byte == '\\r' || byte == '\\n');\r\n            }\r\n            else\r\n            {\r\n              if (byte == '*' && next_byte == '/')\r\n                multiline_comment_nesting_level--;\r\n              \r\n              ender_found = (active_token_start_idx+1 < idx && multiline_comment_nesting_level == 0);\r\n              ender_pad += 2;\r\n            }\r\n          }break;\r\n        }\r\n      }\r\n      \r\n      // rjf: next byte is ender => emit token\r\n      if(ender_found)\r\n      {\r\n        TXT_Token token = {active_token_kind, r1u64(active_token_start_idx, idx+ender_pad)};\r\n        active_token_kind = TXT_TokenKind_Null;\r\n        \r\n        // rjf: identifier -> keyword in special cases\r\n        if(token.kind == TXT_TokenKind_Identifier)\r\n        {\r\n          read_only local_persist String8 rust_keywords[] =\r\n          {\r\n            str8_lit_comp(\"as\"),\r\n            str8_lit_comp(\"break\"),\r\n            str8_lit_comp(\"const\"),\r\n            str8_lit_comp(\"continue\"),\r\n            str8_lit_comp(\"crate\"),\r\n            str8_lit_comp(\"else\"),\r\n            str8_lit_comp(\"enum\"),\r\n            str8_lit_comp(\"extern\"),\r\n            str8_lit_comp(\"false\"),\r\n            str8_lit_comp(\"fn\"),\r\n            str8_lit_comp(\"for\"),\r\n            str8_lit_comp(\"if\"),\r\n            str8_lit_comp(\"impl\"),\r\n            str8_lit_comp(\"in\"),\r\n            str8_lit_comp(\"let\"),\r\n            str8_lit_comp(\"loop\"),\r\n            str8_lit_comp(\"match\"),\r\n            str8_lit_comp(\"mod\"),\r\n            str8_lit_comp(\"move\"),\r\n            str8_lit_comp(\"mut\"),\r\n            str8_lit_comp(\"pub\"),\r\n            str8_lit_comp(\"ref\"),\r\n            str8_lit_comp(\"return\"),\r\n            str8_lit_comp(\"self\"),\r\n            str8_lit_comp(\"Self\"),\r\n            str8_lit_comp(\"static\"),\r\n            str8_lit_comp(\"struct\"),\r\n            str8_lit_comp(\"super\"),\r\n            str8_lit_comp(\"trait\"),\r\n            str8_lit_comp(\"true\"),\r\n            str8_lit_comp(\"type\"),\r\n            str8_lit_comp(\"unsafe\"),\r\n            str8_lit_comp(\"use\"),\r\n            str8_lit_comp(\"where\"),\r\n            str8_lit_comp(\"while\"),\r\n            str8_lit_comp(\"yield\"),\r\n            str8_lit_comp(\"async\"),\r\n            str8_lit_comp(\"await\"),\r\n            str8_lit_comp(\"dyn\"),\r\n            \r\n            // weak keywords\r\n            str8_lit_comp(\"macro_rules\"),\r\n            str8_lit_comp(\"raw\"),\r\n            str8_lit_comp(\"safe\"),\r\n            str8_lit_comp(\"union\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 keyword_idx = 0; keyword_idx < ArrayCount(rust_keywords); keyword_idx += 1)\r\n          {\r\n            if(str8_match(rust_keywords[keyword_idx], token_string, 0))\r\n            {\r\n              token.kind = TXT_TokenKind_Keyword;\r\n              break;\r\n            }\r\n          }\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: split symbols by maximum-munch-rule\r\n        else if(token.kind == TXT_TokenKind_Symbol)\r\n        {\r\n          read_only local_persist String8 rust_multichar_symbol_strings[] =\r\n          {\r\n            str8_lit_comp(\"<<\"),\r\n            str8_lit_comp(\">>\"),\r\n            str8_lit_comp(\"<=\"),\r\n            str8_lit_comp(\">=\"),\r\n            str8_lit_comp(\"==\"),\r\n            str8_lit_comp(\"!=\"),\r\n            str8_lit_comp(\"&&\"),\r\n            str8_lit_comp(\"||\"),\r\n            str8_lit_comp(\"|=\"),\r\n            str8_lit_comp(\"&=\"),\r\n            str8_lit_comp(\"^=\"),\r\n            str8_lit_comp(\"~=\"),\r\n            str8_lit_comp(\"+=\"),\r\n            str8_lit_comp(\"-=\"),\r\n            str8_lit_comp(\"*=\"),\r\n            str8_lit_comp(\"/=\"),\r\n            str8_lit_comp(\"%=\"),\r\n            str8_lit_comp(\"<<=\"),\r\n            str8_lit_comp(\">>=\"),\r\n            str8_lit_comp(\"->\"),\r\n          };\r\n          String8 token_string = str8_substr(string, r1u64(active_token_start_idx, idx+ender_pad));\r\n          for(U64 off = 0, next_off = token_string.size; off < token_string.size; off = next_off)\r\n          {\r\n            B32 found = 0;\r\n            for(U64 idx = 0; idx < ArrayCount(rust_multichar_symbol_strings); idx += 1)\r\n            {\r\n              if(str8_match(str8_substr(token_string, r1u64(off, off+rust_multichar_symbol_strings[idx].size)),\r\n                            rust_multichar_symbol_strings[idx],\r\n                            0))\r\n              {\r\n                found = 1;\r\n                next_off = off + rust_multichar_symbol_strings[idx].size;\r\n                TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n                txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n                break;\r\n              }\r\n            }\r\n            if(!found)\r\n            {\r\n              next_off = off+1;\r\n              TXT_Token token = {TXT_TokenKind_Symbol, r1u64(active_token_start_idx+off, active_token_start_idx+next_off)};\r\n              txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: all other tokens\r\n        else\r\n        {\r\n          txt_token_chunk_list_push(scratch.arena, &tokens, 4096, &token);\r\n        }\r\n        \r\n        // rjf: increment by starter and ender padding\r\n        idx += ender_pad;\r\n      }\r\n      \r\n      // rjf: advance by 1 byte if we haven't found an ender\r\n      if(!ender_found)\r\n      {\r\n        idx += 1;\r\n      }\r\n      escaped = next_escaped;\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  \r\n  //- rjf: parse tokens\r\n  TXT_TokenChunkList tokens = {0};\r\n  {\r\n    TXT_TokenKind active_token_kind = TXT_TokenKind_Null;\r\n    U64 active_token_start_off = 0;\r\n    U64 off = 0;\r\n    B32 escaped = 0;\r\n    B32 string_is_char = 0;\r\n    S32 brace_nest = 0;\r\n    S32 paren_nest = 0;\r\n    S32 string_tick_nest = 0;\r\n    for(U64 advance = 0; off <= string.size; off += advance)\r\n    {\r\n      U8 byte      = (off+0 < string.size) ? string.str[off+0] : 0;\r\n      U8 next_byte = (off+1 < string.size) ? string.str[off+1] : 0;\r\n      B32 ender_found = 0;\r\n      advance = (active_token_kind != TXT_TokenKind_Null ? 1 : 0);\r\n      if(off == string.size && active_token_kind != TXT_TokenKind_Null)\r\n      {\r\n        ender_found = 1;\r\n        advance = 1;\r\n      }\r\n      switch(active_token_kind)\r\n      {\r\n        default:\r\n        case TXT_TokenKind_Null:\r\n        {\r\n          if(byte == ' ' || byte == '\\t' || byte == '\\v' || byte == '\\f' || byte == '\\r' || byte == '\\n')\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_Whitespace;\r\n            advance = 1;\r\n          }\r\n          else if(byte == '>' && brace_nest == 0 && paren_nest == 0)\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_Comment;\r\n            advance = 1;\r\n          }\r\n          else if(('a' <= byte && byte <= 'z') || ('A' <= byte && byte <= 'Z') || byte == '_')\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_Keyword;\r\n            advance = 1;\r\n          }\r\n          else if(byte == '\\'')\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_String;\r\n            advance = 1;\r\n            string_is_char = 1;\r\n          }\r\n          else if(byte == '\"')\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_String;\r\n            advance = 1;\r\n            string_is_char = 0;\r\n          }\r\n          else if(byte == '`')\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_String;\r\n            advance = 1;\r\n            string_tick_nest += 1;\r\n          }\r\n          else if(('0' <= byte && byte <= '9') || (byte == '.' && '0' <= next_byte && next_byte <= '9'))\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_Numeric;\r\n            advance = 1;\r\n          }\r\n          else if(byte == '~' || byte == '!' || byte == '%' || byte == '^' ||\r\n                  byte == '&' || byte == '*' || byte == '(' || byte == ')' ||\r\n                  byte == '-' || byte == '=' || byte == '+' || byte == '[' ||\r\n                  byte == ']' || byte == '{' || byte == '}' || byte == ';' ||\r\n                  byte == ':' || byte == '?' || byte == '/' || byte == '<' ||\r\n                  byte == '>' || byte == ',' || byte == '.')\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_Symbol;\r\n            advance = 1;\r\n            if(byte == '{')\r\n            {\r\n              brace_nest += 1;\r\n            }\r\n            else if(byte == '}')\r\n            {\r\n              brace_nest -= 1;\r\n            }\r\n            if(byte == '(')\r\n            {\r\n              paren_nest += 1;\r\n            }\r\n            else if(byte == ')')\r\n            {\r\n              paren_nest -= 1;\r\n            }\r\n          }\r\n          else\r\n          {\r\n            active_token_start_off = off;\r\n            active_token_kind = TXT_TokenKind_Error;\r\n            advance = 1;\r\n          }\r\n        }break;\r\n        case TXT_TokenKind_Whitespace:\r\n        if(byte != ' ' && byte != '\\t' && byte != '\\v' && byte != '\\f')\r\n        {\r\n          ender_found = 1;\r\n          advance = 0;\r\n        }break;\r\n        case TXT_TokenKind_Keyword:\r\n        if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '_')\r\n        {\r\n          ender_found = 1;\r\n          advance = 0;\r\n        }break;\r\n        case TXT_TokenKind_String:\r\n        {\r\n          U8 ender_byte = (string_tick_nest > 0 ? '\\'' :\r\n                           string_is_char ? '\\''\r\n                           : '\"');\r\n          if(!escaped && byte == ender_byte)\r\n          {\r\n            if(string_tick_nest > 0)\r\n            {\r\n              string_tick_nest -= 1;\r\n            }\r\n            if(string_tick_nest == 0)\r\n            {\r\n              ender_found = 1;\r\n              advance = 1;\r\n            }\r\n          }\r\n          else if(escaped)\r\n          {\r\n            escaped = 0;\r\n            advance = 1;\r\n          }\r\n          else if(byte == '\\\\')\r\n          {\r\n            escaped = 1;\r\n            advance = 1;\r\n          }\r\n          else if(string_tick_nest > 0 && byte == '`')\r\n          {\r\n            string_tick_nest += 1;\r\n          }\r\n          else\r\n          {\r\n            U8 byte_class = utf8_class[byte>>3];\r\n            if(byte_class > 1)\r\n            {\r\n              advance = (U64)byte_class;\r\n            }\r\n          }\r\n        }break;\r\n        case TXT_TokenKind_Numeric:\r\n        if((byte < 'a' || 'z' < byte) && (byte < 'A' || 'Z' < byte) && (byte < '0' || '9' < byte) && byte != '.')\r\n        {\r\n          ender_found = 1;\r\n          advance = 0;\r\n        }break;\r\n        case TXT_TokenKind_Symbol:\r\n        if(1)\r\n        {\r\n          // NOTE(rjf): avoiding maximum munch rule for now\r\n          ender_found = 1;\r\n          advance = 0;\r\n        }\r\n        else if(byte != '~' && byte != '!' && byte != '#' && byte != '%' &&\r\n                byte != '^' && byte != '&' && byte != '*' && byte != '(' &&\r\n                byte != ')' && byte != '-' && byte != '=' && byte != '+' &&\r\n                byte != '[' && byte != ']' && byte != '{' && byte != '}' &&\r\n                byte != ';' && byte != ':' && byte != '?' && byte != '/' &&\r\n                byte != '<' && byte != '>' && byte != ',' && byte != '.')\r\n        {\r\n          ender_found = 1;\r\n          advance = 0;\r\n        }break;\r\n        case TXT_TokenKind_Error:\r\n        {\r\n          ender_found = 1;\r\n          advance = 0;\r\n        }break;\r\n        case TXT_TokenKind_Comment:\r\n        if(byte == '\\n')\r\n        {\r\n          ender_found = 1;\r\n          advance = 1;\r\n        }break;\r\n      }\r\n      if(ender_found != 0)\r\n      {\r\n        if(brace_nest != 0 && active_token_kind == TXT_TokenKind_Keyword)\r\n        {\r\n          active_token_kind = TXT_TokenKind_Numeric;\r\n        }\r\n        if(paren_nest != 0 && active_token_kind == TXT_TokenKind_Keyword)\r\n        {\r\n          active_token_kind = TXT_TokenKind_Identifier;\r\n        }\r\n        TXT_Token token = {active_token_kind, r1u64(active_token_start_off, off+advance)};\r\n        txt_token_chunk_list_push(arena, &tokens, 1024, &token);\r\n        active_token_kind = TXT_TokenKind_Null;\r\n        active_token_start_off = token.range.max;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: token list -> token array\r\n  TXT_TokenArray result = txt_token_array_from_chunk_list(arena, &tokens);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Info Extractor Helpers\r\n\r\ninternal U64\r\ntxt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt)\r\n{\r\n  U64 off = 0;\r\n  if(1 <= pt.line && pt.line <= info->lines_count)\r\n  {\r\n    Rng1U64 line_range = info->lines_ranges[pt.line-1];\r\n    off = line_range.min + (pt.column-1);\r\n  }\r\n  return off;\r\n}\r\n\r\ninternal TxtPt\r\ntxt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off)\r\n{\r\n  TxtPt pt = {0};\r\n  {\r\n    for(U64 line_idx = 0; line_idx < info->lines_count; line_idx += 1)\r\n    {\r\n      if(contains_1u64(info->lines_ranges[line_idx], off))\r\n      {\r\n        pt.line = (S64)line_idx + 1;\r\n        pt.column = (S64)(off - info->lines_ranges[line_idx].min) + 1;\r\n      }\r\n    }\r\n  }\r\n  return pt;\r\n}\r\n\r\ninternal TXT_TokenArray\r\ntxt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num)\r\n{\r\n  TXT_TokenArray line_tokens = {0};\r\n  if(1 <= line_num && line_num <= info->lines_count)\r\n  {\r\n    Rng1U64 line_range = info->lines_ranges[line_num-1];\r\n    for(U64 token_idx = 0; token_idx < info->tokens.count; token_idx += 1)\r\n    {\r\n      Rng1U64 token_range = info->tokens.v[token_idx].range;\r\n      Rng1U64 token_x_line = intersect_1u64(token_range, line_range);\r\n      if(token_x_line.max > token_x_line.min)\r\n      {\r\n        if(line_tokens.v == 0)\r\n        {\r\n          line_tokens.v = info->tokens.v+token_idx;\r\n        }\r\n        line_tokens.count += 1;\r\n      }\r\n      else if(line_tokens.v != 0)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return line_tokens;\r\n}\r\n\r\ninternal Rng1U64\r\ntxt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens)\r\n{\r\n  Rng1U64 result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  {\r\n    // rjf: unpack line info\r\n    TXT_Token *line_tokens_first = line_tokens->v;\r\n    TXT_Token *line_tokens_opl = line_tokens->v+line_tokens->count;\r\n    \r\n    // rjf: find token containing `off`\r\n    TXT_Token *pt_token = 0;\r\n    for(TXT_Token *token = line_tokens_first;\r\n        token < line_tokens_opl;\r\n        token += 1)\r\n    {\r\n      if(contains_1u64(token->range, off))\r\n      {\r\n        Rng1U64 token_range_clamped = intersect_1u64(line_range, token->range);\r\n        String8 token_string = str8_substr(line_text, r1u64(token_range_clamped.max - line_range.min, token_range_clamped.max - line_range.min));\r\n        B32 token_ender = 0;\r\n        switch(token->kind)\r\n        {\r\n          default:{}break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            token_ender = (str8_match(token_string, str8_lit(\"]\"), 0));\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          case TXT_TokenKind_Keyword:\r\n          case TXT_TokenKind_Meta:\r\n          {\r\n            token_ender = 1;\r\n          }break;\r\n        }\r\n        if(token_ender)\r\n        {\r\n          pt_token = token;\r\n        }\r\n        break;\r\n      }\r\n    }\r\n    \r\n    // rjf: found token containing `off`? -> mark that as our initial range\r\n    if(pt_token != 0)\r\n    {\r\n      result = pt_token->range;\r\n    }\r\n    \r\n    // rjf: walk back from pt_token - try to find plausible start of expression\r\n    if(pt_token != 0)\r\n    {\r\n      B32 walkback_done = 0;\r\n      S32 nest = 0;\r\n      for(TXT_Token *wb_token = pt_token;\r\n          wb_token >= line_tokens_first && walkback_done == 0;\r\n          wb_token -= 1)\r\n      {\r\n        Rng1U64 wb_token_range_clamped = intersect_1u64(line_range, wb_token->range);\r\n        String8 wb_token_string = str8_substr(line_text, r1u64(wb_token_range_clamped.min - line_range.min, wb_token_range_clamped.max - line_range.min));\r\n        B32 include_wb_token = 0;\r\n        switch(wb_token->kind)\r\n        {\r\n          default:{}break;\r\n          case TXT_TokenKind_Symbol:\r\n          {\r\n            B32 is_scope_resolution = str8_match(wb_token_string, str8_lit(\"::\"), 0);\r\n            B32 is_dot = str8_match(wb_token_string, str8_lit(\".\"), 0);\r\n            B32 is_arrow = str8_match(wb_token_string, str8_lit(\"->\"), 0);\r\n            B32 is_open_bracket = str8_match(wb_token_string, str8_lit(\"[\"), 0);\r\n            B32 is_close_bracket = str8_match(wb_token_string, str8_lit(\"]\"), 0);\r\n            nest -= !!(is_open_bracket);\r\n            nest += !!(is_close_bracket);\r\n            if(is_scope_resolution ||\r\n               is_dot ||\r\n               is_arrow ||\r\n               is_open_bracket||\r\n               is_close_bracket)\r\n            {\r\n              include_wb_token = 1;\r\n            }\r\n          }break;\r\n          case TXT_TokenKind_Identifier:\r\n          {\r\n            include_wb_token = 1;\r\n          }break;\r\n        }\r\n        if(include_wb_token)\r\n        {\r\n          result = union_1u64(result, wb_token->range);\r\n        }\r\n        else if(nest == 0)\r\n        {\r\n          walkback_done = 1;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal Rng1U64\r\ntxt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt)\r\n{\r\n  Rng1U64 result = {0};\r\n  Temp scratch = scratch_begin(0, 0);\r\n  if(1 <= pt.line && pt.line <= info->lines_count)\r\n  {\r\n    // rjf: unpack line info\r\n    Rng1U64 line_range = info->lines_ranges[pt.line-1];\r\n    String8 line_text = str8_substr(data, line_range);\r\n    TXT_LineTokensSlice line_tokens_slice = txt_line_tokens_slice_from_info_data_line_range(scratch.arena, info, data, r1s64(pt.line, pt.line));\r\n    TXT_TokenArray line_tokens = line_tokens_slice.line_tokens[0];\r\n    TXT_Token *line_tokens_first = line_tokens.v;\r\n    TXT_Token *line_tokens_opl = line_tokens.v+line_tokens.count;\r\n    U64 pt_off = line_range.min + (pt.column-1);\r\n    \r\n    // rjf: grab offset range of expression\r\n    result = txt_expr_off_range_from_line_off_range_string_tokens(pt_off, line_range, line_text, &line_tokens);\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ntxt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng)\r\n{\r\n  Rng1U64 rng_off = r1u64(txt_off_from_info_pt(info, rng.min), txt_off_from_info_pt(info, rng.max));\r\n  String8 result = str8_substr(data, rng_off);\r\n  return result;\r\n}\r\n\r\ninternal String8\r\ntxt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num)\r\n{\r\n  String8 result = {0};\r\n  if(1 <= line_num && line_num <= info->lines_count)\r\n  {\r\n    result = str8_substr(data, info->lines_ranges[line_num-1]);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TXT_LineTokensSlice\r\ntxt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range)\r\n{\r\n  TXT_LineTokensSlice result = {0};\r\n  Temp scratch = scratch_begin(&arena, 1);\r\n  if(info->lines_count != 0)\r\n  {\r\n    Rng1S64 line_range_clamped = r1s64(Clamp(1, line_range.min, (S64)info->lines_count), Clamp(1, line_range.max, (S64)info->lines_count));\r\n    U64 line_count = (U64)dim_1s64(line_range_clamped)+1;\r\n    \r\n    // rjf: allocate output arrays\r\n    result.line_tokens = push_array(arena, TXT_TokenArray, line_count);\r\n    \r\n    // rjf: binary search to find first token\r\n    TXT_Token *tokens_first = 0;\r\n    ProfScope(\"binary search to find first token\")\r\n    {\r\n      Rng1U64 slice_range = r1u64(info->lines_ranges[line_range_clamped.min-1].min, info->lines_ranges[line_range_clamped.max-1].max);\r\n      U64 min_idx = 0;\r\n      U64 opl_idx = info->tokens.count;\r\n      for(;;)\r\n      {\r\n        U64 mid_idx = (opl_idx+min_idx)/2;\r\n        if(mid_idx >= opl_idx)\r\n        {\r\n          break;\r\n        }\r\n        TXT_Token *mid_token = &info->tokens.v[mid_idx];\r\n        if(mid_token->range.min > slice_range.max)\r\n        {\r\n          opl_idx = mid_idx;\r\n        }\r\n        else if(mid_token->range.max < slice_range.min)\r\n        {\r\n          min_idx = mid_idx;\r\n        }\r\n        else if(tokens_first == 0 || mid_token->range.min < tokens_first->range.min)\r\n        {\r\n          tokens_first = mid_token;\r\n          opl_idx = mid_idx;\r\n        }\r\n        if(mid_idx == min_idx && mid_idx+1 == opl_idx)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: grab per-line tokens\r\n    TXT_TokenList *line_tokens_lists = push_array(scratch.arena, TXT_TokenList, line_count);\r\n    if(tokens_first != 0) ProfScope(\"grab per-line tokens\")\r\n    {\r\n      TXT_Token *tokens_opl = info->tokens.v+info->tokens.count;\r\n      U64 line_slice_idx = 0;\r\n      for(TXT_Token *token = tokens_first; token < tokens_opl && line_slice_idx < line_count;)\r\n      {\r\n        if(token->range.min < info->lines_ranges[line_slice_idx+line_range.min-1].max)\r\n        {\r\n          if(token->range.max > info->lines_ranges[line_slice_idx+line_range.min-1].min)\r\n          {\r\n            txt_token_list_push(scratch.arena, &line_tokens_lists[line_slice_idx], token);\r\n          }\r\n          B32 need_token_advance = 0;\r\n          B32 need_line_advance = 0;\r\n          if(token->range.max >= info->lines_ranges[line_slice_idx+line_range.min-1].max)\r\n          {\r\n            need_line_advance = 1;\r\n          }\r\n          if(token->range.max <= info->lines_ranges[line_slice_idx+line_range.min-1].max)\r\n          {\r\n            need_token_advance += 1;\r\n          }\r\n          if(need_line_advance) { line_slice_idx += 1; }\r\n          if(need_token_advance) { token += 1; }\r\n        }\r\n        else\r\n        {\r\n          line_slice_idx += 1;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // rjf: bake per-line tokens to arrays\r\n    for(U64 line_slice_idx = 0; line_slice_idx < line_count; line_slice_idx += 1)\r\n    {\r\n      result.line_tokens[line_slice_idx] = txt_token_array_from_list(arena, &line_tokens_lists[line_slice_idx]);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal TXT_ScopeNode *\r\ntxt_scope_node_from_info_num(TXT_TextInfo *info, U64 num)\r\n{\r\n  TXT_ScopeNode *result = &txt_scope_node_nil;\r\n  if(1 <= num && num <= info->scope_nodes.count)\r\n  {\r\n    result = &info->scope_nodes.v[num-1];\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TXT_ScopeNode *\r\ntxt_scope_node_from_info_off(TXT_TextInfo *info, U64 off)\r\n{\r\n  TXT_ScopeNode *result = &txt_scope_node_nil;\r\n  if(info->scope_pts.count != 0)\r\n  {\r\n    U64 first = 0;\r\n    U64 opl = info->scope_pts.count;\r\n    for(;;)\r\n    {\r\n      U64 mid = (first + opl) / 2;\r\n      U64 mid_off = info->tokens.v[info->scope_pts.v[mid].token_idx].range.min;\r\n      if(mid_off < off)\r\n      {\r\n        first = mid;\r\n      }\r\n      else if(off < mid_off)\r\n      {\r\n        opl = mid;\r\n      }\r\n      else\r\n      {\r\n        first = mid;\r\n        break;\r\n      }\r\n      if(opl - first <= 1)\r\n      {\r\n        break;\r\n      }\r\n    }\r\n    TXT_ScopeNode *closest_node = &info->scope_nodes.v[info->scope_pts.v[first].scope_idx];\r\n    for(TXT_ScopeNode *scope_n = closest_node;\r\n        scope_n != &txt_scope_node_nil;\r\n        scope_n = txt_scope_node_from_info_num(info, scope_n->parent_num))\r\n    {\r\n      if(info->tokens.v[scope_n->token_idx_range.min].range.min <= off && off < info->tokens.v[scope_n->token_idx_range.max].range.max)\r\n      {\r\n        result = scope_n;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal TXT_ScopeNode *\r\ntxt_scope_node_from_info_pt(TXT_TextInfo *info, TxtPt pt)\r\n{\r\n  U64 off = txt_off_from_info_pt(info, pt);\r\n  TXT_ScopeNode *result = txt_scope_node_from_info_off(info, off);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Cache Hooks / Lookups\r\n\r\ntypedef struct TXT_Artifact TXT_Artifact;\r\nstruct TXT_Artifact\r\n{\r\n  Arena *arena;\r\n  U128 data_hash;\r\n  TXT_TextInfo info;\r\n};\r\n\r\ntypedef struct TXT_ArtifactCreateShared TXT_ArtifactCreateShared;\r\nstruct TXT_ArtifactCreateShared\r\n{\r\n  Arena *arena;\r\n  TXT_TextInfo info;\r\n  TXT_Artifact *artifact;\r\n};\r\n\r\ninternal AC_Artifact\r\ntxt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  Access *access = access_open();\r\n  \r\n  //- rjf: get shared state\r\n  TXT_ArtifactCreateShared *shared = 0;\r\n  if(lane_idx() == 0)\r\n  {\r\n    shared = push_array(scratch.arena, TXT_ArtifactCreateShared, 1);\r\n  }\r\n  lane_sync_u64(&shared, 0);\r\n  \r\n  //- rjf: unpack key\r\n  U128 hash = {0};\r\n  TXT_LangKind lang = TXT_LangKind_Null;\r\n  str8_deserial_read_struct(key, 0, &hash);\r\n  str8_deserial_read_struct(key, sizeof(hash), &lang);\r\n  String8 data = c_data_from_hash(access, hash);\r\n  TXT_LangLexFunctionType *lex_function = txt_lex_function_from_lang_kind(lang);\r\n  \r\n  //- rjf: data -> text info\r\n  if(!u128_match(hash, u128_zero()))\r\n  {\r\n    if(lane_idx() == 0)\r\n    {\r\n      shared->arena = arena_alloc();\r\n    }\r\n    \r\n    //- rjf: set # of bytes to process\r\n    //                  (line ending calc)     (line counting)    (line measuring)   (lexing)\r\n    set_progress_target(Min(data.size, 1024) + data.size        + data.size        + data.size*(lang != TXT_LangKind_Null));\r\n    \r\n    //- rjf: detect line end kind\r\n    TXT_LineEndKind line_end_kind = TXT_LineEndKind_Null;\r\n    if(lane_idx() == 0)\r\n    {\r\n      U64 lf_count = 0;\r\n      U64 cr_count = 0;\r\n      for(U64 idx = 0; idx < data.size && idx < 1024; idx += 1)\r\n      {\r\n        if(data.str[idx] == '\\r')\r\n        {\r\n          cr_count += 1;\r\n        }\r\n        if(data.str[idx] == '\\n')\r\n        {\r\n          lf_count += 1;\r\n        }\r\n      }\r\n      if(cr_count >= lf_count/2 && lf_count >= 1)\r\n      {\r\n        line_end_kind = TXT_LineEndKind_CRLF;\r\n      }\r\n      else if(lf_count >= 1)\r\n      {\r\n        line_end_kind = TXT_LineEndKind_LF;\r\n      }\r\n      shared->info.line_end_kind = line_end_kind;\r\n    }\r\n    lane_sync();\r\n    set_progress(Min(data.size, 1024));\r\n    \r\n    //- rjf: count # of lines\r\n    U64 lane_line_count = 0;\r\n    if(lane_idx() == 0)\r\n    {\r\n      lane_line_count = 1;\r\n    }\r\n    {\r\n      Rng1U64 range = lane_range(data.size);\r\n      for EachInRange(idx, range)\r\n      {\r\n        if(data.str[idx] == '\\n')\r\n        {\r\n          lane_line_count += 1;\r\n        }\r\n        if(idx && idx%1000 == 0)\r\n        {\r\n          add_progress(1000);\r\n        }\r\n      }\r\n    }\r\n    ins_atomic_u64_add_eval(&shared->info.lines_count, lane_line_count);\r\n    lane_sync();\r\n    set_progress(Min(data.size, 1024) + data.size);\r\n    \r\n    //- rjf: allocate & store line ranges\r\n    if(lane_idx() == 0)\r\n    {\r\n      shared->info.lines_ranges = push_array_no_zero(shared->arena, Rng1U64, shared->info.lines_count);\r\n      U64 line_idx = 0;\r\n      U64 line_start_idx = 0;\r\n      for(U64 idx = 0; idx <= data.size; idx += 1)\r\n      {\r\n        if(idx == data.size || data.str[idx] == '\\n')\r\n        {\r\n          Rng1U64 line_range = r1u64(line_start_idx, idx);\r\n          if(idx > 0 && data.str[idx-1] == '\\r' && line_range.max > line_range.min)\r\n          {\r\n            line_range.max -= 1;\r\n          }\r\n          U64 line_size = dim_1u64(line_range);\r\n          shared->info.lines_ranges[line_idx] = line_range;\r\n          shared->info.lines_max_size = Max(shared->info.lines_max_size, line_size);\r\n          line_idx += 1;\r\n          line_start_idx = idx+1;\r\n        }\r\n        if(idx && idx%1000 == 0)\r\n        {\r\n          add_progress(1000);\r\n        }\r\n      }\r\n    }\r\n    lane_sync();\r\n    set_progress(Min(data.size, 1024) + data.size + data.size);\r\n    \r\n    //- rjf: lex function * data -> tokens\r\n#if 1\r\n    if(lane_idx() == 0 && lex_function != 0)\r\n    {\r\n      shared->info.tokens = lex_function(shared->arena, 0, data);\r\n    }\r\n#else\r\n    if(lane_idx() == 0)\r\n    {\r\n      shared->info.tokens = txt_token_array_from_lang_kind_string(shared->arena, lang, data);\r\n    }\r\n#endif\r\n    lane_sync();\r\n    set_progress(Min(data.size, 1024) + data.size + data.size + data.size*(lex_function != 0));\r\n    TXT_TokenArray tokens = shared->info.tokens;\r\n    \r\n    //- rjf: count scope points\r\n    {\r\n      U64 lane_scope_pt_opener_count = 0;\r\n      U64 lane_scope_pt_count = 0;\r\n      Rng1U64 range = lane_range(tokens.count);\r\n      for EachInRange(idx, range)\r\n      {\r\n        if(tokens.v[idx].kind == TXT_TokenKind_Symbol)\r\n        {\r\n          String8 token_string = str8_substr(data, tokens.v[idx].range);\r\n          B32 is_opener = (token_string.str[0] == '{' ||\r\n                           token_string.str[0] == '(' ||\r\n                           token_string.str[0] == '[');\r\n          B32 is_closer = (token_string.str[0] == '}' ||\r\n                           token_string.str[0] == ')' ||\r\n                           token_string.str[0] == ']');\r\n          if(token_string.size == 1 && (is_opener || is_closer))\r\n          {\r\n            lane_scope_pt_count += 1;\r\n            lane_scope_pt_opener_count += !!is_opener;\r\n          }\r\n        }\r\n      }\r\n      ins_atomic_u64_add_eval(&shared->info.scope_pts.count, lane_scope_pt_count);\r\n      ins_atomic_u64_add_eval(&shared->info.scope_nodes.count, lane_scope_pt_opener_count);\r\n    }\r\n    lane_sync();\r\n    \r\n    //- rjf: allocate & fill scope data\r\n    if(lane_idx() == 0)\r\n    {\r\n      shared->info.scope_pts.v = push_array_no_zero(shared->arena, TXT_ScopePt, shared->info.scope_pts.count);\r\n      shared->info.scope_nodes.v = push_array_no_zero(shared->arena, TXT_ScopeNode, shared->info.scope_nodes.count);\r\n      {\r\n        typedef struct ScopeTask ScopeTask;\r\n        struct ScopeTask\r\n        {\r\n          ScopeTask *next;\r\n          U64 scope_idx;\r\n        };\r\n        Temp scratch = scratch_begin(0, 0);\r\n        ScopeTask *top_scope_task = 0;\r\n        ScopeTask *free_scope_task = 0;\r\n        U64 pt_idx = 0;\r\n        U64 scope_idx = 0;\r\n        for EachIndex(token_idx, tokens.count)\r\n        {\r\n          if(tokens.v[token_idx].kind == TXT_TokenKind_Symbol)\r\n          {\r\n            String8 token_string = str8_substr(data, tokens.v[token_idx].range);\r\n            B32 is_opener = (token_string.str[0] == '{' ||\r\n                             token_string.str[0] == '(' ||\r\n                             token_string.str[0] == '[');\r\n            B32 is_closer = (token_string.str[0] == '}' ||\r\n                             token_string.str[0] == ')' ||\r\n                             token_string.str[0] == ']');\r\n            \r\n            // rjf: opener symbols -> push scope\r\n            if(is_opener)\r\n            {\r\n              // rjf: insert into scope tree\r\n              TXT_ScopeNode *new_scope = &shared->info.scope_nodes.v[scope_idx];\r\n              new_scope->token_idx_range.min = token_idx;\r\n              if(top_scope_task)\r\n              {\r\n                U64 new_scope_num = scope_idx+1;\r\n                TXT_ScopeNode *parent = &shared->info.scope_nodes.v[top_scope_task->scope_idx];\r\n                if(parent->first_num == 0)\r\n                {\r\n                  parent->first_num = new_scope_num;\r\n                }\r\n                if(parent->last_num != 0)\r\n                {\r\n                  TXT_ScopeNode *prev_scope = &shared->info.scope_nodes.v[parent->last_num-1];\r\n                  prev_scope->next_num = new_scope_num;\r\n                }\r\n                parent->last_num = new_scope_num;\r\n                new_scope->parent_num = top_scope_task->scope_idx+1;\r\n              }\r\n              \r\n              // rjf: push onto scope stack\r\n              ScopeTask *scope_task = free_scope_task;\r\n              if(scope_task)\r\n              {\r\n                SLLStackPop(free_scope_task);\r\n              }\r\n              else\r\n              {\r\n                scope_task = push_array(scratch.arena, ScopeTask, 1);\r\n              }\r\n              scope_task->scope_idx = scope_idx;\r\n              scope_idx += 1;\r\n              SLLStackPush(top_scope_task, scope_task);\r\n            }\r\n            \r\n            // rjf: opener or closer -> fill endpoint\r\n            if(top_scope_task && (is_opener || is_closer))\r\n            {\r\n              shared->info.scope_pts.v[pt_idx].token_idx = token_idx;\r\n              shared->info.scope_pts.v[pt_idx].scope_idx = top_scope_task->scope_idx;\r\n              pt_idx += 1;\r\n            }\r\n            \r\n            // rjf: closer symbols -> pop\r\n            if(is_closer && top_scope_task != 0)\r\n            {\r\n              ScopeTask *popped = top_scope_task;\r\n              shared->info.scope_nodes.v[popped->scope_idx].token_idx_range.max = token_idx;\r\n              SLLStackPop(top_scope_task);\r\n              SLLStackPush(free_scope_task, popped);\r\n            }\r\n          }\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n    }\r\n    lane_sync();\r\n  }\r\n  \r\n  //- rjf: mark dependency on hash\r\n  c_hash_downstream_inc(hash);\r\n  \r\n  //- rjf: package as artifact\r\n  if(lane_idx() == 0 && shared->arena != 0)\r\n  {\r\n    shared->artifact = push_array(shared->arena, TXT_Artifact, 1);\r\n    shared->artifact->arena     = shared->arena;\r\n    shared->artifact->data_hash = hash;\r\n    shared->artifact->info      = shared->info;\r\n  }\r\n  lane_sync();\r\n  \r\n  access_close(access);\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n  AC_Artifact result = {0};\r\n  result.u64[0] = (U64)shared->artifact;\r\n  return result;\r\n}\r\n\r\ninternal void\r\ntxt_artifact_destroy(AC_Artifact artifact)\r\n{\r\n  TXT_Artifact *txt_artifact = (TXT_Artifact *)artifact.u64[0];\r\n  if(txt_artifact == 0) { return; }\r\n  c_hash_downstream_dec(txt_artifact->data_hash);\r\n  arena_release(txt_artifact->arena);\r\n}\r\n\r\ninternal TXT_TextInfo\r\ntxt_text_info_from_hash_lang(Access *access, U128 hash, TXT_LangKind lang)\r\n{\r\n#pragma pack(push, 1)\r\n  struct\r\n  {\r\n    U128 hash;\r\n    TXT_LangKind lang;\r\n  } key = {hash, lang};\r\n#pragma pack(pop)\r\n  String8 key_string = str8_struct(&key);\r\n  AC_Artifact artifact = ac_artifact_from_key(access, key_string, txt_artifact_create, txt_artifact_destroy, 0, .flags = AC_Flag_Wide);\r\n  TXT_Artifact *txt_artifact = (TXT_Artifact *)artifact.u64[0];\r\n  TXT_TextInfo info = {0};\r\n  if(txt_artifact != 0)\r\n  {\r\n    info = txt_artifact->info;\r\n  }\r\n  return info;\r\n}\r\n\r\ninternal TXT_TextInfo\r\ntxt_text_info_from_key_lang(Access *access, C_Key key, TXT_LangKind lang, U128 *hash_out)\r\n{\r\n  TXT_TextInfo result = {0};\r\n  for(U64 rewind_idx = 0; rewind_idx < C_KEY_HASH_HISTORY_COUNT; rewind_idx += 1)\r\n  {\r\n    U128 hash = c_hash_from_key(key, rewind_idx);\r\n    result = txt_text_info_from_hash_lang(access, hash, lang);\r\n    if(result.lines_count != 0)\r\n    {\r\n      if(hash_out)\r\n      {\r\n        *hash_out = hash;\r\n      }\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n"
  },
  {
    "path": "src/text/text.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef TEXT_H\r\n#define TEXT_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Value Types\r\n\r\ntypedef enum TXT_LineEndKind\r\n{\r\n  TXT_LineEndKind_Null,\r\n  TXT_LineEndKind_LF,\r\n  TXT_LineEndKind_CRLF,\r\n  TXT_LineEndKind_COUNT\r\n}\r\nTXT_LineEndKind;\r\n\r\ntypedef enum TXT_TokenKind\r\n{\r\n  TXT_TokenKind_Null,\r\n  TXT_TokenKind_Error,\r\n  TXT_TokenKind_Whitespace,\r\n  TXT_TokenKind_Keyword,\r\n  TXT_TokenKind_Identifier,\r\n  TXT_TokenKind_Numeric,\r\n  TXT_TokenKind_String,\r\n  TXT_TokenKind_Symbol,\r\n  TXT_TokenKind_Comment,\r\n  TXT_TokenKind_Meta, // preprocessor, etc.\r\n  TXT_TokenKind_COUNT\r\n}\r\nTXT_TokenKind;\r\n\r\ntypedef struct TXT_TokenizerRule TXT_TokenizerRule;\r\nstruct TXT_TokenizerRule\r\n{\r\n  TXT_TokenKind token_kind;\r\n  String8 open_string;\r\n  String8 close_string;\r\n  U32 close_advance;\r\n  B32 nesting;\r\n  B32 escaping;\r\n  U32 parent_num;\r\n};\r\n\r\ntypedef struct TXT_TokenizerRulePtrNode TXT_TokenizerRulePtrNode;\r\nstruct TXT_TokenizerRulePtrNode\r\n{\r\n  TXT_TokenizerRulePtrNode *next;\r\n  TXT_TokenizerRule *v;\r\n};\r\n\r\ntypedef struct TXT_TokenizerRuleArray TXT_TokenizerRuleArray;\r\nstruct TXT_TokenizerRuleArray\r\n{\r\n  TXT_TokenizerRule *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct TXT_Token TXT_Token;\r\nstruct TXT_Token\r\n{\r\n  TXT_TokenKind kind;\r\n  Rng1U64 range;\r\n};\r\n\r\ntypedef struct TXT_TokenChunkNode TXT_TokenChunkNode;\r\nstruct TXT_TokenChunkNode\r\n{\r\n  TXT_TokenChunkNode *next;\r\n  U64 count;\r\n  U64 cap;\r\n  TXT_Token *v;\r\n};\r\n\r\ntypedef struct TXT_TokenChunkList TXT_TokenChunkList;\r\nstruct TXT_TokenChunkList\r\n{\r\n  TXT_TokenChunkNode *first;\r\n  TXT_TokenChunkNode *last;\r\n  U64 chunk_count;\r\n  U64 token_count;\r\n};\r\n\r\ntypedef struct TXT_TokenNode TXT_TokenNode;\r\nstruct TXT_TokenNode\r\n{\r\n  TXT_TokenNode *next;\r\n  TXT_Token v;\r\n};\r\n\r\ntypedef struct TXT_TokenList TXT_TokenList;\r\nstruct TXT_TokenList\r\n{\r\n  TXT_TokenNode *first;\r\n  TXT_TokenNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct TXT_TokenArray TXT_TokenArray;\r\nstruct TXT_TokenArray\r\n{\r\n  U64 count;\r\n  TXT_Token *v;\r\n};\r\n\r\ntypedef struct TXT_TokenArrayArray TXT_TokenArrayArray;\r\nstruct TXT_TokenArrayArray\r\n{\r\n  U64 count;\r\n  TXT_TokenArray *v;\r\n};\r\n\r\ntypedef struct TXT_ScopeNode TXT_ScopeNode;\r\nstruct TXT_ScopeNode\r\n{\r\n  U64 first_num;\r\n  U64 last_num;\r\n  U64 next_num;\r\n  U64 parent_num;\r\n  Rng1U64 token_idx_range;\r\n};\r\n\r\ntypedef struct TXT_ScopeNodeArray TXT_ScopeNodeArray;\r\nstruct TXT_ScopeNodeArray\r\n{\r\n  TXT_ScopeNode *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct TXT_ScopePt TXT_ScopePt;\r\nstruct TXT_ScopePt\r\n{\r\n  U64 token_idx;\r\n  U64 scope_idx;\r\n};\r\n\r\ntypedef struct TXT_ScopePtArray TXT_ScopePtArray;\r\nstruct TXT_ScopePtArray\r\n{\r\n  TXT_ScopePt *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct TXT_TextInfo TXT_TextInfo;\r\nstruct TXT_TextInfo\r\n{\r\n  U64 lines_count;\r\n  Rng1U64 *lines_ranges;\r\n  U64 lines_max_size;\r\n  TXT_LineEndKind line_end_kind;\r\n  TXT_TokenArray tokens;\r\n  TXT_ScopePtArray scope_pts;\r\n  TXT_ScopeNodeArray scope_nodes;\r\n  U64 bytes_processed;\r\n  U64 bytes_to_process;\r\n};\r\n\r\ntypedef struct TXT_LineTokensSlice TXT_LineTokensSlice;\r\nstruct TXT_LineTokensSlice\r\n{\r\n  TXT_TokenArray *line_tokens;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/text.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: Language Kind Types\r\n\r\ntypedef TXT_TokenArray TXT_LangLexFunctionType(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nread_only global TXT_ScopeNode txt_scope_node_nil = {0};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Helpers\r\n\r\ninternal TXT_LangKind txt_lang_kind_from_extension(String8 extension);\r\ninternal String8 txt_extension_from_lang_kind(TXT_LangKind kind);\r\ninternal TXT_LangKind txt_lang_kind_from_arch(Arch arch);\r\ninternal TXT_LangLexFunctionType *txt_lex_function_from_lang_kind(TXT_LangKind kind);\r\n\r\n////////////////////////////////\r\n//~ rjf: Token Type Functions\r\n\r\ninternal void txt_token_chunk_list_push(Arena *arena, TXT_TokenChunkList *list, U64 cap, TXT_Token *token);\r\ninternal void txt_token_list_push(Arena *arena, TXT_TokenList *list, TXT_Token *token);\r\ninternal TXT_TokenArray txt_token_array_from_chunk_list(Arena *arena, TXT_TokenChunkList *list);\r\ninternal TXT_TokenArray txt_token_array_from_list(Arena *arena, TXT_TokenList *list);\r\n\r\n////////////////////////////////\r\n//~ rjf: Lexing Functions\r\n\r\ninternal TXT_TokenArray txt_token_array_from_lang_kind_string(Arena *arena, TXT_LangKind lang_kind, String8 string);\r\n\r\ninternal TXT_TokenArray txt_token_array_from_string__c_cpp(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\ninternal TXT_TokenArray txt_token_array_from_string__odin(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\ninternal TXT_TokenArray txt_token_array_from_string__jai(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\ninternal TXT_TokenArray txt_token_array_from_string__zig(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\ninternal TXT_TokenArray txt_token_array_from_string__rust(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\ninternal TXT_TokenArray txt_token_array_from_string__disasm_x64_intel(Arena *arena, U64 *bytes_processed_counter, String8 string);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Info Extractor Helpers\r\n\r\ninternal U64 txt_off_from_info_pt(TXT_TextInfo *info, TxtPt pt);\r\ninternal TxtPt txt_pt_from_info_off__linear_scan(TXT_TextInfo *info, U64 off);\r\ninternal TXT_TokenArray txt_token_array_from_info_line_num__linear_scan(TXT_TextInfo *info, S64 line_num);\r\ninternal Rng1U64 txt_expr_off_range_from_line_off_range_string_tokens(U64 off, Rng1U64 line_range, String8 line_text, TXT_TokenArray *line_tokens);\r\ninternal Rng1U64 txt_expr_off_range_from_info_data_pt(TXT_TextInfo *info, String8 data, TxtPt pt);\r\ninternal String8 txt_string_from_info_data_txt_rng(TXT_TextInfo *info, String8 data, TxtRng rng);\r\ninternal String8 txt_string_from_info_data_line_num(TXT_TextInfo *info, String8 data, S64 line_num);\r\ninternal TXT_LineTokensSlice txt_line_tokens_slice_from_info_data_line_range(Arena *arena, TXT_TextInfo *info, String8 data, Rng1S64 line_range);\r\ninternal TXT_ScopeNode *txt_scope_node_from_info_num(TXT_TextInfo *info, U64 num);\r\ninternal TXT_ScopeNode *txt_scope_node_from_info_off(TXT_TextInfo *info, U64 off);\r\ninternal TXT_ScopeNode *txt_scope_node_from_info_pt(TXT_TextInfo *info, TxtPt pt);\r\n\r\n////////////////////////////////\r\n//~ rjf: Artifact Cache Hooks / Lookups\r\n\r\ninternal AC_Artifact txt_artifact_create(String8 key, B32 *cancel_signal, B32 *retry_out, U64 *gen_out);\r\ninternal void txt_artifact_destroy(AC_Artifact artifact);\r\ninternal TXT_TextInfo txt_text_info_from_hash_lang(Access *access, U128 hash, TXT_LangKind lang);\r\ninternal TXT_TextInfo txt_text_info_from_key_lang(Access *access, C_Key key, TXT_LangKind lang, U128 *hash_out);\r\n\r\n#endif // TEXT_H\r\n"
  },
  {
    "path": "src/text/text.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n@table(name       ext                keywords_table     multichar_symbol_table     tokenizer_rules_table)\r\nTXT_LangKindTable:\r\n{\r\n  { Null           null               null               null                       null}\r\n  { C              c                  c                  c                          c   }\r\n  { CPlusPlus      cpp                cpp                c                          c   }\r\n  { Odin           odin               odin               c                          null}\r\n  { Jai            jai                jai                c                          null}\r\n  { Zig            zig                zig                c                          null}\r\n  { Rust           rs                 rust               c                          null}\r\n  { DisasmX64Intel disasm_x64_intel   null               null                       null}\r\n}\r\n\r\n@table(string kind)\r\nTXT_LangKindExtTable:\r\n{\r\n  {\"h\"    C        }\r\n  {\"cxx\"  CPlusPlus}\r\n  {\"cc\"   CPlusPlus}\r\n  {\"c++\"  CPlusPlus}\r\n  {\"ixx\"  CPlusPlus}\r\n  {\"cxxm\" CPlusPlus}\r\n  {\"c++m\" CPlusPlus}\r\n  {\"ccm\"  CPlusPlus}\r\n  {\"cppm\" CPlusPlus}\r\n  {\"mpp\"  CPlusPlus}\r\n  {\"C\"    CPlusPlus}\r\n  {\"hpp\"  CPlusPlus}\r\n  {\"hxx\"  CPlusPlus}\r\n  {\"hh\"   CPlusPlus}\r\n  {\"h++\"  CPlusPlus}\r\n  {\"H\"    CPlusPlus}\r\n}\r\n\r\n@enum TXT_LangKind:\r\n{\r\n  @expand(TXT_LangKindTable a) `$(a.name)`,\r\n  COUNT\r\n}\r\n\r\n@data(String8)\r\ntxt_lang_kind_ext_table:\r\n{\r\n  @expand(TXT_LangKindTable a) `str8_lit_comp(\"$(a.ext)\")`\r\n}\r\n\r\n@data(`struct {String8 ext; TXT_LangKind kind;}`) @c_file\r\ntxt_ext_lang_kind_table:\r\n{\r\n  @expand(TXT_LangKindTable a) `{str8_lit_comp(\"$(a.ext)\"), TXT_LangKind_$(a.name)}`,\r\n  @expand(TXT_LangKindExtTable a) `{str8_lit_comp(\"$(a.string)\"), TXT_LangKind_$(a.kind)}`,\r\n}\r\n\r\n@data(String8Array) txt_keywords_from_lang_kind_table:\r\n{\r\n  @expand(TXT_LangKindTable a) `{txt_keywords__$(a.keywords_table), ArrayCount(txt_keywords__$(a.keywords_table))}`\r\n}\r\n\r\n@data(String8Array) txt_multichar_symbols_from_lang_kind_table:\r\n{\r\n  @expand(TXT_LangKindTable a) `{txt_multichar_symbols__$(a.multichar_symbol_table), ArrayCount(txt_multichar_symbols__$(a.multichar_symbol_table))}`\r\n}\r\n\r\n@data(TXT_TokenizerRuleArray) txt_tokenizer_rules_from_lang_kind_table:\r\n{\r\n  @expand(TXT_LangKindTable a) `{txt_tokenizer_rules__$(a.tokenizer_rules_table), ArrayCount(txt_tokenizer_rules__$(a.tokenizer_rules_table))}`\r\n}\r\n\r\n@data(String8) txt_keywords__null:{`{0}`}\r\n@data(String8) txt_multichar_symbols__null:{`{0}`}\r\n@data(TXT_TokenizerRule) txt_tokenizer_rules__null:{`{TXT_TokenKind_Null}`}\r\n\r\n////////////////////////////////\r\n//~ rjf: C\r\n\r\n@table(string)\r\ntxt_keywords__c:\r\n{\r\n  {\"auto\"} {\"break\"} {\"case\"} {\"char\"}\r\n  {\"const\"} {\"continue\"} {\"default\"} {\"do\"}\r\n  {\"double\"} {\"else\"} {\"enum\"} {\"extern\"}\r\n  {\"float\"} {\"for\"} {\"goto\"} {\"if\"}\r\n  {\"int\"} {\"long\"} {\"register\"} {\"return\"}\r\n  {\"short\"} {\"signed\"} {\"sizeof\"} {\"static\"}\r\n  {\"struct\"} {\"switch\"} {\"typedef\"} {\"union\"}\r\n  {\"unsigned\"} {\"void\"} {\"volatile\"} {\"while\"}\r\n}\r\n@data(String8) txt_keywords__c: {@expand(txt_keywords__c a) `str8_lit_comp(\"$(a.string)\")`}\r\n\r\n@table(string)\r\ntxt_multichar_symbols__c:\r\n{\r\n  {\"<<\"}\r\n  {\">>\"}\r\n  {\"<=\"}\r\n  {\">=\"}\r\n  {\"==\"}\r\n  {\"!=\"}\r\n  {\"&&\"}\r\n  {\"||\"}\r\n  {\"|=\"}\r\n  {\"&=\"}\r\n  {\"^=\"}\r\n  {\"~=\"}\r\n  {\"+=\"}\r\n  {\"-=\"}\r\n  {\"*=\"}\r\n  {\"/=\"}\r\n  {\"%=\"}\r\n  {\"<<=\"}\r\n  {\">>=\"}\r\n  {\"->\"}\r\n}\r\n@data(String8) txt_multichar_symbols__c: {@expand(txt_multichar_symbols__c a) `str8_lit_comp(\"$(a.string)\")`}\r\n\r\n@table(token_kind open_string close_string close_advance nesting escaping parent_num) txt_tokenizer_rules__c:\r\n{\r\n  {Comment \"//\"  \"\\\\n\" 0 0 1 0}\r\n  {Comment \"/*\"  \"*/\"  2 0 0 0}\r\n  {Meta    \"#\"   \"\\\\n\" 0 0 1 0}\r\n  {String  '\\\\\"' '\\\\\"' 1 0 1 0}\r\n  {String  \"'\"   \"'\"   1 0 1 0}\r\n  {String  '\\\\\"' '\\\\\"' 1 0 1 3}\r\n  {String  \"<\"   \">\"   1 0 1 3}\r\n}\r\n@data(TXT_TokenizerRule) txt_tokenizer_rules__c:\r\n{\r\n  @expand(txt_tokenizer_rules__c a) `{TXT_TokenKind_$(a.token_kind), str8_lit_comp(\"$(a.open_string)\"), str8_lit_comp(\"$(a.close_string)\"), $(a.close_advance), $(a.nesting), $(a.escaping), $(a.parent_num)}`\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: C++\r\n\r\n@table(string)\r\ntxt_keywords__cpp:\r\n{\r\n  {\"alignas\"} {\"alignof\"} {\"and\"} {\"and_eq\"}\r\n  {\"asm\"} {\"atomic_cancel\"} {\"atomic_commit\"} {\"atomic_noexcept\"}\r\n  {\"auto\"} {\"bitand\"} {\"bitor\"} {\"bool\"}\r\n  {\"break\"} {\"case\"} {\"catch\"} {\"char\"}\r\n  {\"char8_t\"} {\"char16_t\"} {\"char32_t\"} {\"class\"}\r\n  {\"compl\"} {\"concept\"} {\"const\"} {\"consteval\"}\r\n  {\"constexpr\"} {\"constinit\"} {\"const_cast\"} {\"continue\"}\r\n  {\"co_await\"} {\"co_return\"} {\"co_yield\"} {\"decltype\"}\r\n  {\"default\"} {\"delete\"} {\"do\"} {\"double\"}\r\n  {\"dynamic_cast\"} {\"else\"} {\"enum\"} {\"explicit\"}\r\n  {\"export\"} {\"extern\"} {\"false\"} {\"float\"}\r\n  {\"for\"} {\"friend\"} {\"goto\"} {\"if\"}\r\n  {\"inline\"} {\"int\"} {\"long\"} {\"mutable\"}\r\n  {\"namespace\"} {\"new\"} {\"noexcept\"} {\"not\"}\r\n  {\"not_eq\"} {\"nullptr\"} {\"operator\"} {\"or\"}\r\n  {\"or_eq\"} {\"private\"} {\"protected\"} {\"public\"}\r\n  {\"reflexpr\"} {\"register\"} {\"reinterpret_cast\"} {\"requires\"}\r\n  {\"return\"} {\"short\"} {\"signed\"} {\"sizeof\"}\r\n  {\"static\"} {\"static_assert\"} {\"static_cast\"} {\"struct\"}\r\n  {\"switch\"} {\"synchronized\"} {\"template\"} {\"this\"}\r\n  {\"thread_local\"} {\"throw\"} {\"true\"} {\"try\"}\r\n  {\"typedef\"} {\"typeid\"} {\"typename\"} {\"union\"}\r\n  {\"unsigned\"} {\"using\"} {\"virtual\"} {\"void\"}\r\n  {\"volatile\"} {\"wchar_t\"} {\"while\"} {\"xor\"}\r\n  {\"xor_eq\"}\r\n}\r\n@data(String8) txt_keywords__cpp: {@expand(txt_keywords__cpp a) `str8_lit_comp(\"$(a.string)\")`}\r\n\r\n////////////////////////////////\r\n//~ rjf: Odin\r\n\r\n@table(string)\r\ntxt_keywords__odin:\r\n{\r\n  {\"align_of\"} {\"asm\"} {\"auto_cast\"} {\"bit_set\"}\r\n  {\"break\"} {\"case\"} {\"cast\"} {\"context\"}\r\n  {\"continue\"} {\"defer\"} {\"distinct\"} {\"do\"}\r\n  {\"dynamic\"} {\"else\"} {\"enum\"} {\"fallthrough\"}\r\n  {\"for\"} {\"foreign\"} {\"if\"} {\"in\"}\r\n  {\"map\"} {\"matrix\"} {\"not_in\"} {\"or_break\"}\r\n  {\"or_continue\"} {\"or_else\"} {\"or_return\"} {\"package\"}\r\n  {\"proc\"} {\"return\"} {\"size_of\"} {\"struct\"}\r\n  {\"switch\"} {\"transmute\"} {\"typeid\"} {\"union\"}\r\n  {\"using\"} {\"when\"} {\"where\"} {\"import\"}\r\n}\r\n@data(String8) txt_keywords__odin: {@expand(txt_keywords__odin a) `str8_lit_comp(\"$(a.string)\")`}\r\n\r\n////////////////////////////////\r\n//~ rjf: Jai\r\n\r\n@table(string)\r\ntxt_keywords__jai:\r\n{\r\n  {\"bool\"} {\"true\"} {\"false\"} {\"int\"}\r\n  {\"s8\"} {\"u8\"} {\"s16\"} {\"u16\"}\r\n  {\"s32\"} {\"u32\"} {\"s64\"} {\"u64\"}\r\n  {\"s128\"} {\"u128\"} {\"float\"} {\"float32\"}\r\n  {\"float64\"} {\"void\"} {\"enum\"} {\"enum_flags\"}\r\n  {\"size_of\"} {\"string\"} {\"type_of\"} {\"cast\"}\r\n  {\"if\"} {\"ifs\"} {\"then\"} {\"else\"}\r\n  {\"case\"} {\"for\"} {\"while\"} {\"break\"}\r\n  {\"continue\"} {\"remove\"} {\"return\"} {\"inline\"}\r\n  {\"null\"} {\"defer\"} {\"xx\"}\r\n}\r\n@data(String8) txt_keywords__jai: {@expand(txt_keywords__jai a) `str8_lit_comp(\"$(a.string)\")`}\r\n\r\n////////////////////////////////\r\n//~ rjf: Zig\r\n\r\n@table(string)\r\ntxt_keywords__zig:\r\n{\r\n  {\"addrspace\"} {\"align\"} {\"allowzero\"} {\"and\"}\r\n  {\"anyframe\"} {\"anytype\"} {\"asm\"} {\"async\"}\r\n  {\"await\"} {\"break\"} {\"callconv\"} {\"catch\"}\r\n  {\"comptime\"} {\"const\"} {\"continue\"} {\"defer\"}\r\n  {\"else\"} {\"enum\"} {\"errdefer\"} {\"error\"}\r\n  {\"export\"} {\"extern\"} {\"fn\"} {\"for\"}\r\n  {\"if\"} {\"inline\"} {\"noalias\"} {\"nosuspend\"}\r\n  {\"noinline\"} {\"opaque\"} {\"or\"} {\"orelse\"}\r\n  {\"packed\"} {\"pub\"} {\"resume\"} {\"return\"}\r\n  {\"linksection\"} {\"struct\"} {\"suspend\"} {\"switch\"}\r\n  {\"test\"} {\"threadlocal\"} {\"try\"} {\"union\"}\r\n  {\"unreachable\"} {\"usingnamespace\"} {\"var\"} {\"volatile\"}\r\n  {\"while\"}\r\n}\r\n@data(String8) txt_keywords__zig: {@expand(txt_keywords__zig a) `str8_lit_comp(\"$(a.string)\")`}\r\n\r\n////////////////////////////////\r\n//~ rjf: Rust\r\n\r\n@table(string)\r\ntxt_keywords__rust:\r\n{\r\n  {\"as\"} {\"break\"} {\"const\"} {\"continue\"}\r\n  {\"crate\"} {\"else\"} {\"enum\"} {\"extern\"}\r\n  {\"false\"} {\"fn\"} {\"for\"} {\"if\"}\r\n  {\"impl\"} {\"in\"} {\"let\"} {\"loop\"}\r\n  {\"match\"} {\"mod\"} {\"move\"} {\"mut\"}\r\n  {\"pub\"} {\"ref\"} {\"return\"} {\"self\"}\r\n  {\"Self\"} {\"static\"} {\"struct\"} {\"super\"}\r\n  {\"trait\"} {\"true\"} {\"type\"} {\"unsafe\"}\r\n  {\"use\"} {\"where\"} {\"while\"} {\"yield\"}\r\n  {\"async\"} {\"await\"} {\"dyn\"} {\"macro_rules\"}\r\n  {\"raw\"} {\"safe\"} {\"union\"}\r\n}\r\n@data(String8) txt_keywords__rust: {@expand(txt_keywords__rust a) `str8_lit_comp(\"$(a.string)\")`}\r\n"
  },
  {
    "path": "src/third_party/blake3/asm/LICENSE",
    "content": "This work is released into the public domain with CC0 1.0. Alternatively, it is\nlicensed under the Apache License 2.0.\n\n-------------------------------------------------------------------------------\n\nCreative Commons Legal Code\n\nCC0 1.0 Universal\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN\n    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS\n    INFORMATION ON AN \"AS-IS\" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES\n    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS\n    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM\n    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED\n    HEREUNDER.\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator\nand subsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for\nthe purpose of contributing to a commons of creative, cultural and\nscientific works (\"Commons\") that the public can reliably and without fear\nof later claims of infringement build upon, modify, incorporate in other\nworks, reuse and redistribute as freely as possible in any form whatsoever\nand for any purposes, including without limitation commercial purposes.\nThese owners may contribute to the Commons to promote the ideal of a free\nculture and the further production of creative, cultural and scientific\nworks, or to gain reputation or greater distribution for their Work in\npart through the use and efforts of others.\n\nFor these and/or other purposes and motivations, and without any\nexpectation of additional consideration or compensation, the person\nassociating CC0 with a Work (the \"Affirmer\"), to the extent that he or she\nis an owner of Copyright and Related Rights in the Work, voluntarily\nelects to apply CC0 to the Work and publicly distribute the Work under its\nterms, with knowledge of his or her Copyright and Related Rights in the\nWork and the meaning and intended legal effect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not\nlimited to, the following:\n\n  i. the right to reproduce, adapt, distribute, perform, display,\n     communicate, and translate a Work;\n ii. moral rights retained by the original author(s) and/or performer(s);\niii. publicity and privacy rights pertaining to a person's image or\n     likeness depicted in a Work;\n iv. rights protecting against unfair competition in regards to a Work,\n     subject to the limitations in paragraph 4(a), below;\n  v. rights protecting the extraction, dissemination, use and reuse of data\n     in a Work;\n vi. database rights (such as those arising under Directive 96/9/EC of the\n     European Parliament and of the Council of 11 March 1996 on the legal\n     protection of databases, and under any national implementation\n     thereof, including any amended or successor version of such\n     directive); and\nvii. other similar, equivalent or corresponding rights throughout the\n     world based on applicable law or treaty, and any national\n     implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention\nof, applicable law, Affirmer hereby overtly, fully, permanently,\nirrevocably and unconditionally waives, abandons, and surrenders all of\nAffirmer's Copyright and Related Rights and associated claims and causes\nof action, whether now known or unknown (including existing as well as\nfuture claims and causes of action), in the Work (i) in all territories\nworldwide, (ii) for the maximum duration provided by applicable law or\ntreaty (including future time extensions), (iii) in any current or future\nmedium and for any number of copies, and (iv) for any purpose whatsoever,\nincluding without limitation commercial, advertising or promotional\npurposes (the \"Waiver\"). Affirmer makes the Waiver for the benefit of each\nmember of the public at large and to the detriment of Affirmer's heirs and\nsuccessors, fully intending that such Waiver shall not be subject to\nrevocation, rescission, cancellation, termination, or any other legal or\nequitable action to disrupt the quiet enjoyment of the Work by the public\nas contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason\nbe judged legally invalid or ineffective under applicable law, then the\nWaiver shall be preserved to the maximum extent permitted taking into\naccount Affirmer's express Statement of Purpose. In addition, to the\nextent the Waiver is so judged Affirmer hereby grants to each affected\nperson a royalty-free, non transferable, non sublicensable, non exclusive,\nirrevocable and unconditional license to exercise Affirmer's Copyright and\nRelated Rights in the Work (i) in all territories worldwide, (ii) for the\nmaximum duration provided by applicable law or treaty (including future\ntime extensions), (iii) in any current or future medium and for any number\nof copies, and (iv) for any purpose whatsoever, including without\nlimitation commercial, advertising or promotional purposes (the\n\"License\"). The License shall be deemed effective as of the date CC0 was\napplied by Affirmer to the Work. Should any part of the License for any\nreason be judged legally invalid or ineffective under applicable law, such\npartial invalidity or ineffectiveness shall not invalidate the remainder\nof the License, and in such case Affirmer hereby affirms that he or she\nwill not (i) exercise any of his or her remaining Copyright and Related\nRights in the Work or (ii) assert any associated claims and causes of\naction with respect to the Work, in either case contrary to Affirmer's\nexpress Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n a. No trademark or patent rights held by Affirmer are waived, abandoned,\n    surrendered, licensed or otherwise affected by this document.\n b. Affirmer offers the Work as-is and makes no representations or\n    warranties of any kind concerning the Work, express, implied,\n    statutory or otherwise, including without limitation warranties of\n    title, merchantability, fitness for a particular purpose, non\n    infringement, or the absence of latent or other defects, accuracy, or\n    the present or absence of errors, whether or not discoverable, all to\n    the greatest extent permissible under applicable law.\n c. Affirmer disclaims responsibility for clearing rights of other persons\n    that may apply to the Work or any use thereof, including without\n    limitation any person's Copyright and Related Rights in the Work.\n    Further, Affirmer disclaims responsibility for obtaining any necessary\n    consents, permissions or other rights required for any use of the\n    Work.\n d. Affirmer understands and acknowledges that Creative Commons is not a\n    party to this document and has no duty or obligation with respect to\n    this CC0 or use of the Work.\n\n-------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 Jack O'Connor and Samuel Neves\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3.c",
    "content": "#include <assert.h>\n#include <stdbool.h>\n#include <string.h>\n\n#include \"blake3.h\"\n#include \"blake3_impl.h\"\n\nconst char *blake3_version(void) { return BLAKE3_VERSION_STRING; }\n\nINLINE void chunk_state_init(blake3_chunk_state *self, const uint32_t key[8],\n                             uint8_t flags) {\n  memcpy(self->cv, key, BLAKE3_KEY_LEN);\n  self->chunk_counter = 0;\n  memset(self->buf, 0, BLAKE3_BLOCK_LEN);\n  self->buf_len = 0;\n  self->blocks_compressed = 0;\n  self->flags = flags;\n}\n\nINLINE void chunk_state_reset(blake3_chunk_state *self, const uint32_t key[8],\n                              uint64_t chunk_counter) {\n  memcpy(self->cv, key, BLAKE3_KEY_LEN);\n  self->chunk_counter = chunk_counter;\n  self->blocks_compressed = 0;\n  memset(self->buf, 0, BLAKE3_BLOCK_LEN);\n  self->buf_len = 0;\n}\n\nINLINE size_t chunk_state_len(const blake3_chunk_state *self) {\n  return (BLAKE3_BLOCK_LEN * (size_t)self->blocks_compressed) +\n         ((size_t)self->buf_len);\n}\n\nINLINE size_t chunk_state_fill_buf(blake3_chunk_state *self,\n                                   const uint8_t *input, size_t input_len) {\n  size_t take = BLAKE3_BLOCK_LEN - ((size_t)self->buf_len);\n  if (take > input_len) {\n    take = input_len;\n  }\n  uint8_t *dest = self->buf + ((size_t)self->buf_len);\n  memcpy(dest, input, take);\n  self->buf_len += (uint8_t)take;\n  return take;\n}\n\nINLINE uint8_t chunk_state_maybe_start_flag(const blake3_chunk_state *self) {\n  if (self->blocks_compressed == 0) {\n    return CHUNK_START;\n  } else {\n    return 0;\n  }\n}\n\ntypedef struct {\n  uint32_t input_cv[8];\n  uint64_t counter;\n  uint8_t block[BLAKE3_BLOCK_LEN];\n  uint8_t block_len;\n  uint8_t flags;\n} output_t;\n\nINLINE output_t make_output(const uint32_t input_cv[8],\n                            const uint8_t block[BLAKE3_BLOCK_LEN],\n                            uint8_t block_len, uint64_t counter,\n                            uint8_t flags) {\n  output_t ret;\n  memcpy(ret.input_cv, input_cv, 32);\n  memcpy(ret.block, block, BLAKE3_BLOCK_LEN);\n  ret.block_len = block_len;\n  ret.counter = counter;\n  ret.flags = flags;\n  return ret;\n}\n\n// Chaining values within a given chunk (specifically the compress_in_place\n// interface) are represented as words. This avoids unnecessary bytes<->words\n// conversion overhead in the portable implementation. However, the hash_many\n// interface handles both user input and parent node blocks, so it accepts\n// bytes. For that reason, chaining values in the CV stack are represented as\n// bytes.\nINLINE void output_chaining_value(const output_t *self, uint8_t cv[32]) {\n  uint32_t cv_words[8];\n  memcpy(cv_words, self->input_cv, 32);\n  blake3_compress_in_place(cv_words, self->block, self->block_len,\n                           self->counter, self->flags);\n  store_cv_words(cv, cv_words);\n}\n\nINLINE void output_root_bytes(const output_t *self, uint64_t seek, uint8_t *out,\n                              size_t out_len) {\n  uint64_t output_block_counter = seek / 64;\n  size_t offset_within_block = seek % 64;\n  uint8_t wide_buf[64];\n  while (out_len > 0) {\n    blake3_compress_xof(self->input_cv, self->block, self->block_len,\n                        output_block_counter, self->flags | ROOT, wide_buf);\n    size_t available_bytes = 64 - offset_within_block;\n    size_t memcpy_len;\n    if (out_len > available_bytes) {\n      memcpy_len = available_bytes;\n    } else {\n      memcpy_len = out_len;\n    }\n    memcpy(out, wide_buf + offset_within_block, memcpy_len);\n    out += memcpy_len;\n    out_len -= memcpy_len;\n    output_block_counter += 1;\n    offset_within_block = 0;\n  }\n}\n\nINLINE void chunk_state_update(blake3_chunk_state *self, const uint8_t *input,\n                               size_t input_len) {\n  if (self->buf_len > 0) {\n    size_t take = chunk_state_fill_buf(self, input, input_len);\n    input += take;\n    input_len -= take;\n    if (input_len > 0) {\n      blake3_compress_in_place(\n          self->cv, self->buf, BLAKE3_BLOCK_LEN, self->chunk_counter,\n          self->flags | chunk_state_maybe_start_flag(self));\n      self->blocks_compressed += 1;\n      self->buf_len = 0;\n      memset(self->buf, 0, BLAKE3_BLOCK_LEN);\n    }\n  }\n\n  while (input_len > BLAKE3_BLOCK_LEN) {\n    blake3_compress_in_place(self->cv, input, BLAKE3_BLOCK_LEN,\n                             self->chunk_counter,\n                             self->flags | chunk_state_maybe_start_flag(self));\n    self->blocks_compressed += 1;\n    input += BLAKE3_BLOCK_LEN;\n    input_len -= BLAKE3_BLOCK_LEN;\n  }\n\n  size_t take = chunk_state_fill_buf(self, input, input_len);\n  input += take;\n  input_len -= take;\n}\n\nINLINE output_t chunk_state_output(const blake3_chunk_state *self) {\n  uint8_t block_flags =\n      self->flags | chunk_state_maybe_start_flag(self) | CHUNK_END;\n  return make_output(self->cv, self->buf, self->buf_len, self->chunk_counter,\n                     block_flags);\n}\n\nINLINE output_t parent_output(const uint8_t block[BLAKE3_BLOCK_LEN],\n                              const uint32_t key[8], uint8_t flags) {\n  return make_output(key, block, BLAKE3_BLOCK_LEN, 0, flags | PARENT);\n}\n\n// Given some input larger than one chunk, return the number of bytes that\n// should go in the left subtree. This is the largest power-of-2 number of\n// chunks that leaves at least 1 byte for the right subtree.\nINLINE size_t left_len(size_t content_len) {\n  // Subtract 1 to reserve at least one byte for the right side. content_len\n  // should always be greater than BLAKE3_CHUNK_LEN.\n  size_t full_chunks = (content_len - 1) / BLAKE3_CHUNK_LEN;\n  return round_down_to_power_of_2(full_chunks) * BLAKE3_CHUNK_LEN;\n}\n\n// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE chunks at the same time\n// on a single thread. Write out the chunk chaining values and return the\n// number of chunks hashed. These chunks are never the root and never empty;\n// those cases use a different codepath.\nINLINE size_t compress_chunks_parallel(const uint8_t *input, size_t input_len,\n                                       const uint32_t key[8],\n                                       uint64_t chunk_counter, uint8_t flags,\n                                       uint8_t *out) {\n#if defined(BLAKE3_TESTING)\n  assert(0 < input_len);\n  assert(input_len <= MAX_SIMD_DEGREE * BLAKE3_CHUNK_LEN);\n#endif\n\n  const uint8_t *chunks_array[MAX_SIMD_DEGREE];\n  size_t input_position = 0;\n  size_t chunks_array_len = 0;\n  while (input_len - input_position >= BLAKE3_CHUNK_LEN) {\n    chunks_array[chunks_array_len] = &input[input_position];\n    input_position += BLAKE3_CHUNK_LEN;\n    chunks_array_len += 1;\n  }\n\n  blake3_hash_many(chunks_array, chunks_array_len,\n                   BLAKE3_CHUNK_LEN / BLAKE3_BLOCK_LEN, key, chunk_counter,\n                   true, flags, CHUNK_START, CHUNK_END, out);\n\n  // Hash the remaining partial chunk, if there is one. Note that the empty\n  // chunk (meaning the empty message) is a different codepath.\n  if (input_len > input_position) {\n    uint64_t counter = chunk_counter + (uint64_t)chunks_array_len;\n    blake3_chunk_state chunk_state;\n    chunk_state_init(&chunk_state, key, flags);\n    chunk_state.chunk_counter = counter;\n    chunk_state_update(&chunk_state, &input[input_position],\n                       input_len - input_position);\n    output_t output = chunk_state_output(&chunk_state);\n    output_chaining_value(&output, &out[chunks_array_len * BLAKE3_OUT_LEN]);\n    return chunks_array_len + 1;\n  } else {\n    return chunks_array_len;\n  }\n}\n\n// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE parents at the same time\n// on a single thread. Write out the parent chaining values and return the\n// number of parents hashed. (If there's an odd input chaining value left over,\n// return it as an additional output.) These parents are never the root and\n// never empty; those cases use a different codepath.\nINLINE size_t compress_parents_parallel(const uint8_t *child_chaining_values,\n                                        size_t num_chaining_values,\n                                        const uint32_t key[8], uint8_t flags,\n                                        uint8_t *out) {\n#if defined(BLAKE3_TESTING)\n  assert(2 <= num_chaining_values);\n  assert(num_chaining_values <= 2 * MAX_SIMD_DEGREE_OR_2);\n#endif\n\n  const uint8_t *parents_array[MAX_SIMD_DEGREE_OR_2];\n  size_t parents_array_len = 0;\n  while (num_chaining_values - (2 * parents_array_len) >= 2) {\n    parents_array[parents_array_len] =\n        &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN];\n    parents_array_len += 1;\n  }\n\n  blake3_hash_many(parents_array, parents_array_len, 1, key,\n                   0, // Parents always use counter 0.\n                   false, flags | PARENT,\n                   0, // Parents have no start flags.\n                   0, // Parents have no end flags.\n                   out);\n\n  // If there's an odd child left over, it becomes an output.\n  if (num_chaining_values > 2 * parents_array_len) {\n    memcpy(&out[parents_array_len * BLAKE3_OUT_LEN],\n           &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN],\n           BLAKE3_OUT_LEN);\n    return parents_array_len + 1;\n  } else {\n    return parents_array_len;\n  }\n}\n\n// The wide helper function returns (writes out) an array of chaining values\n// and returns the length of that array. The number of chaining values returned\n// is the dynamically detected SIMD degree, at most MAX_SIMD_DEGREE. Or fewer,\n// if the input is shorter than that many chunks. The reason for maintaining a\n// wide array of chaining values going back up the tree, is to allow the\n// implementation to hash as many parents in parallel as possible.\n//\n// As a special case when the SIMD degree is 1, this function will still return\n// at least 2 outputs. This guarantees that this function doesn't perform the\n// root compression. (If it did, it would use the wrong flags, and also we\n// wouldn't be able to implement extendable output.) Note that this function is\n// not used when the whole input is only 1 chunk long; that's a different\n// codepath.\n//\n// Why not just have the caller split the input on the first update(), instead\n// of implementing this special rule? Because we don't want to limit SIMD or\n// multi-threading parallelism for that update().\nstatic size_t blake3_compress_subtree_wide(const uint8_t *input,\n                                           size_t input_len,\n                                           const uint32_t key[8],\n                                           uint64_t chunk_counter,\n                                           uint8_t flags, uint8_t *out) {\n  // Note that the single chunk case does *not* bump the SIMD degree up to 2\n  // when it is 1. If this implementation adds multi-threading in the future,\n  // this gives us the option of multi-threading even the 2-chunk case, which\n  // can help performance on smaller platforms.\n  if (input_len <= blake3_simd_degree() * BLAKE3_CHUNK_LEN) {\n    return compress_chunks_parallel(input, input_len, key, chunk_counter, flags,\n                                    out);\n  }\n\n  // With more than simd_degree chunks, we need to recurse. Start by dividing\n  // the input into left and right subtrees. (Note that this is only optimal\n  // as long as the SIMD degree is a power of 2. If we ever get a SIMD degree\n  // of 3 or something, we'll need a more complicated strategy.)\n  size_t left_input_len = left_len(input_len);\n  size_t right_input_len = input_len - left_input_len;\n  const uint8_t *right_input = &input[left_input_len];\n  uint64_t right_chunk_counter =\n      chunk_counter + (uint64_t)(left_input_len / BLAKE3_CHUNK_LEN);\n\n  // Make space for the child outputs. Here we use MAX_SIMD_DEGREE_OR_2 to\n  // account for the special case of returning 2 outputs when the SIMD degree\n  // is 1.\n  uint8_t cv_array[2 * MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN];\n  size_t degree = blake3_simd_degree();\n  if (left_input_len > BLAKE3_CHUNK_LEN && degree == 1) {\n    // The special case: We always use a degree of at least two, to make\n    // sure there are two outputs. Except, as noted above, at the chunk\n    // level, where we allow degree=1. (Note that the 1-chunk-input case is\n    // a different codepath.)\n    degree = 2;\n  }\n  uint8_t *right_cvs = &cv_array[degree * BLAKE3_OUT_LEN];\n\n  // Recurse! If this implementation adds multi-threading support in the\n  // future, this is where it will go.\n  size_t left_n = blake3_compress_subtree_wide(input, left_input_len, key,\n                                               chunk_counter, flags, cv_array);\n  size_t right_n = blake3_compress_subtree_wide(\n      right_input, right_input_len, key, right_chunk_counter, flags, right_cvs);\n\n  // The special case again. If simd_degree=1, then we'll have left_n=1 and\n  // right_n=1. Rather than compressing them into a single output, return\n  // them directly, to make sure we always have at least two outputs.\n  if (left_n == 1) {\n    memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN);\n    return 2;\n  }\n\n  // Otherwise, do one layer of parent node compression.\n  size_t num_chaining_values = left_n + right_n;\n  return compress_parents_parallel(cv_array, num_chaining_values, key, flags,\n                                   out);\n}\n\n// Hash a subtree with compress_subtree_wide(), and then condense the resulting\n// list of chaining values down to a single parent node. Don't compress that\n// last parent node, however. Instead, return its message bytes (the\n// concatenated chaining values of its children). This is necessary when the\n// first call to update() supplies a complete subtree, because the topmost\n// parent node of that subtree could end up being the root. It's also necessary\n// for extended output in the general case.\n//\n// As with compress_subtree_wide(), this function is not used on inputs of 1\n// chunk or less. That's a different codepath.\nINLINE void compress_subtree_to_parent_node(\n    const uint8_t *input, size_t input_len, const uint32_t key[8],\n    uint64_t chunk_counter, uint8_t flags, uint8_t out[2 * BLAKE3_OUT_LEN]) {\n#if defined(BLAKE3_TESTING)\n  assert(input_len > BLAKE3_CHUNK_LEN);\n#endif\n\n  uint8_t cv_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN];\n  size_t num_cvs = blake3_compress_subtree_wide(input, input_len, key,\n                                                chunk_counter, flags, cv_array);\n  assert(num_cvs <= MAX_SIMD_DEGREE_OR_2);\n\n  // If MAX_SIMD_DEGREE is greater than 2 and there's enough input,\n  // compress_subtree_wide() returns more than 2 chaining values. Condense\n  // them into 2 by forming parent nodes repeatedly.\n  uint8_t out_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN / 2];\n  // The second half of this loop condition is always true, and we just\n  // asserted it above. But GCC can't tell that it's always true, and if NDEBUG\n  // is set on platforms where MAX_SIMD_DEGREE_OR_2 == 2, GCC emits spurious\n  // warnings here. GCC 8.5 is particularly sensitive, so if you're changing\n  // this code, test it against that version.\n  while (num_cvs > 2 && num_cvs <= MAX_SIMD_DEGREE_OR_2) {\n    num_cvs =\n        compress_parents_parallel(cv_array, num_cvs, key, flags, out_array);\n    memcpy(cv_array, out_array, num_cvs * BLAKE3_OUT_LEN);\n  }\n  memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN);\n}\n\nINLINE void hasher_init_base(blake3_hasher *self, const uint32_t key[8],\n                             uint8_t flags) {\n  memcpy(self->key, key, BLAKE3_KEY_LEN);\n  chunk_state_init(&self->chunk, key, flags);\n  self->cv_stack_len = 0;\n}\n\nvoid blake3_hasher_init(blake3_hasher *self) { hasher_init_base(self, IV, 0); }\n\nvoid blake3_hasher_init_keyed(blake3_hasher *self,\n                              const uint8_t key[BLAKE3_KEY_LEN]) {\n  uint32_t key_words[8];\n  load_key_words(key, key_words);\n  hasher_init_base(self, key_words, KEYED_HASH);\n}\n\nvoid blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context,\n                                       size_t context_len) {\n  blake3_hasher context_hasher;\n  hasher_init_base(&context_hasher, IV, DERIVE_KEY_CONTEXT);\n  blake3_hasher_update(&context_hasher, context, context_len);\n  uint8_t context_key[BLAKE3_KEY_LEN];\n  blake3_hasher_finalize(&context_hasher, context_key, BLAKE3_KEY_LEN);\n  uint32_t context_key_words[8];\n  load_key_words(context_key, context_key_words);\n  hasher_init_base(self, context_key_words, DERIVE_KEY_MATERIAL);\n}\n\nvoid blake3_hasher_init_derive_key(blake3_hasher *self, const char *context) {\n  blake3_hasher_init_derive_key_raw(self, context, strlen(context));\n}\n\n// As described in hasher_push_cv() below, we do \"lazy merging\", delaying\n// merges until right before the next CV is about to be added. This is\n// different from the reference implementation. Another difference is that we\n// aren't always merging 1 chunk at a time. Instead, each CV might represent\n// any power-of-two number of chunks, as long as the smaller-above-larger stack\n// order is maintained. Instead of the \"count the trailing 0-bits\" algorithm\n// described in the spec, we use a \"count the total number of 1-bits\" variant\n// that doesn't require us to retain the subtree size of the CV on top of the\n// stack. The principle is the same: each CV that should remain in the stack is\n// represented by a 1-bit in the total number of chunks (or bytes) so far.\nINLINE void hasher_merge_cv_stack(blake3_hasher *self, uint64_t total_len) {\n  size_t post_merge_stack_len = (size_t)popcnt(total_len);\n  while (self->cv_stack_len > post_merge_stack_len) {\n    uint8_t *parent_node =\n        &self->cv_stack[(self->cv_stack_len - 2) * BLAKE3_OUT_LEN];\n    output_t output = parent_output(parent_node, self->key, self->chunk.flags);\n    output_chaining_value(&output, parent_node);\n    self->cv_stack_len -= 1;\n  }\n}\n\n// In reference_impl.rs, we merge the new CV with existing CVs from the stack\n// before pushing it. We can do that because we know more input is coming, so\n// we know none of the merges are root.\n//\n// This setting is different. We want to feed as much input as possible to\n// compress_subtree_wide(), without setting aside anything for the chunk_state.\n// If the user gives us 64 KiB, we want to parallelize over all 64 KiB at once\n// as a single subtree, if at all possible.\n//\n// This leads to two problems:\n// 1) This 64 KiB input might be the only call that ever gets made to update.\n//    In this case, the root node of the 64 KiB subtree would be the root node\n//    of the whole tree, and it would need to be ROOT finalized. We can't\n//    compress it until we know.\n// 2) This 64 KiB input might complete a larger tree, whose root node is\n//    similarly going to be the the root of the whole tree. For example, maybe\n//    we have 196 KiB (that is, 128 + 64) hashed so far. We can't compress the\n//    node at the root of the 256 KiB subtree until we know how to finalize it.\n//\n// The second problem is solved with \"lazy merging\". That is, when we're about\n// to add a CV to the stack, we don't merge it with anything first, as the\n// reference impl does. Instead we do merges using the *previous* CV that was\n// added, which is sitting on top of the stack, and we put the new CV\n// (unmerged) on top of the stack afterwards. This guarantees that we never\n// merge the root node until finalize().\n//\n// Solving the first problem requires an additional tool,\n// compress_subtree_to_parent_node(). That function always returns the top\n// *two* chaining values of the subtree it's compressing. We then do lazy\n// merging with each of them separately, so that the second CV will always\n// remain unmerged. (That also helps us support extendable output when we're\n// hashing an input all-at-once.)\nINLINE void hasher_push_cv(blake3_hasher *self, uint8_t new_cv[BLAKE3_OUT_LEN],\n                           uint64_t chunk_counter) {\n  hasher_merge_cv_stack(self, chunk_counter);\n  memcpy(&self->cv_stack[self->cv_stack_len * BLAKE3_OUT_LEN], new_cv,\n         BLAKE3_OUT_LEN);\n  self->cv_stack_len += 1;\n}\n\nvoid blake3_hasher_update(blake3_hasher *self, const void *input,\n                          size_t input_len) {\n  // Explicitly checking for zero avoids causing UB by passing a null pointer\n  // to memcpy. This comes up in practice with things like:\n  //   std::vector<uint8_t> v;\n  //   blake3_hasher_update(&hasher, v.data(), v.size());\n  if (input_len == 0) {\n    return;\n  }\n\n  const uint8_t *input_bytes = (const uint8_t *)input;\n\n  // If we have some partial chunk bytes in the internal chunk_state, we need\n  // to finish that chunk first.\n  if (chunk_state_len(&self->chunk) > 0) {\n    size_t take = BLAKE3_CHUNK_LEN - chunk_state_len(&self->chunk);\n    if (take > input_len) {\n      take = input_len;\n    }\n    chunk_state_update(&self->chunk, input_bytes, take);\n    input_bytes += take;\n    input_len -= take;\n    // If we've filled the current chunk and there's more coming, finalize this\n    // chunk and proceed. In this case we know it's not the root.\n    if (input_len > 0) {\n      output_t output = chunk_state_output(&self->chunk);\n      uint8_t chunk_cv[32];\n      output_chaining_value(&output, chunk_cv);\n      hasher_push_cv(self, chunk_cv, self->chunk.chunk_counter);\n      chunk_state_reset(&self->chunk, self->key, self->chunk.chunk_counter + 1);\n    } else {\n      return;\n    }\n  }\n\n  // Now the chunk_state is clear, and we have more input. If there's more than\n  // a single chunk (so, definitely not the root chunk), hash the largest whole\n  // subtree we can, with the full benefits of SIMD (and maybe in the future,\n  // multi-threading) parallelism. Two restrictions:\n  // - The subtree has to be a power-of-2 number of chunks. Only subtrees along\n  //   the right edge can be incomplete, and we don't know where the right edge\n  //   is going to be until we get to finalize().\n  // - The subtree must evenly divide the total number of chunks up until this\n  //   point (if total is not 0). If the current incomplete subtree is only\n  //   waiting for 1 more chunk, we can't hash a subtree of 4 chunks. We have\n  //   to complete the current subtree first.\n  // Because we might need to break up the input to form powers of 2, or to\n  // evenly divide what we already have, this part runs in a loop.\n  while (input_len > BLAKE3_CHUNK_LEN) {\n    size_t subtree_len = round_down_to_power_of_2(input_len);\n    uint64_t count_so_far = self->chunk.chunk_counter * BLAKE3_CHUNK_LEN;\n    // Shrink the subtree_len until it evenly divides the count so far. We know\n    // that subtree_len itself is a power of 2, so we can use a bitmasking\n    // trick instead of an actual remainder operation. (Note that if the caller\n    // consistently passes power-of-2 inputs of the same size, as is hopefully\n    // typical, this loop condition will always fail, and subtree_len will\n    // always be the full length of the input.)\n    //\n    // An aside: We don't have to shrink subtree_len quite this much. For\n    // example, if count_so_far is 1, we could pass 2 chunks to\n    // compress_subtree_to_parent_node. Since we'll get 2 CVs back, we'll still\n    // get the right answer in the end, and we might get to use 2-way SIMD\n    // parallelism. The problem with this optimization, is that it gets us\n    // stuck always hashing 2 chunks. The total number of chunks will remain\n    // odd, and we'll never graduate to higher degrees of parallelism. See\n    // https://github.com/BLAKE3-team/BLAKE3/issues/69.\n    while ((((uint64_t)(subtree_len - 1)) & count_so_far) != 0) {\n      subtree_len /= 2;\n    }\n    // The shrunken subtree_len might now be 1 chunk long. If so, hash that one\n    // chunk by itself. Otherwise, compress the subtree into a pair of CVs.\n    uint64_t subtree_chunks = subtree_len / BLAKE3_CHUNK_LEN;\n    if (subtree_len <= BLAKE3_CHUNK_LEN) {\n      blake3_chunk_state chunk_state;\n      chunk_state_init(&chunk_state, self->key, self->chunk.flags);\n      chunk_state.chunk_counter = self->chunk.chunk_counter;\n      chunk_state_update(&chunk_state, input_bytes, subtree_len);\n      output_t output = chunk_state_output(&chunk_state);\n      uint8_t cv[BLAKE3_OUT_LEN];\n      output_chaining_value(&output, cv);\n      hasher_push_cv(self, cv, chunk_state.chunk_counter);\n    } else {\n      // This is the high-performance happy path, though getting here depends\n      // on the caller giving us a long enough input.\n      uint8_t cv_pair[2 * BLAKE3_OUT_LEN];\n      compress_subtree_to_parent_node(input_bytes, subtree_len, self->key,\n                                      self->chunk.chunk_counter,\n                                      self->chunk.flags, cv_pair);\n      hasher_push_cv(self, cv_pair, self->chunk.chunk_counter);\n      hasher_push_cv(self, &cv_pair[BLAKE3_OUT_LEN],\n                     self->chunk.chunk_counter + (subtree_chunks / 2));\n    }\n    self->chunk.chunk_counter += subtree_chunks;\n    input_bytes += subtree_len;\n    input_len -= subtree_len;\n  }\n\n  // If there's any remaining input less than a full chunk, add it to the chunk\n  // state. In that case, also do a final merge loop to make sure the subtree\n  // stack doesn't contain any unmerged pairs. The remaining input means we\n  // know these merges are non-root. This merge loop isn't strictly necessary\n  // here, because hasher_push_chunk_cv already does its own merge loop, but it\n  // simplifies blake3_hasher_finalize below.\n  if (input_len > 0) {\n    chunk_state_update(&self->chunk, input_bytes, input_len);\n    hasher_merge_cv_stack(self, self->chunk.chunk_counter);\n  }\n}\n\nvoid blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out,\n                            size_t out_len) {\n  blake3_hasher_finalize_seek(self, 0, out, out_len);\n}\n\nvoid blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek,\n                                 uint8_t *out, size_t out_len) {\n  // Explicitly checking for zero avoids causing UB by passing a null pointer\n  // to memcpy. This comes up in practice with things like:\n  //   std::vector<uint8_t> v;\n  //   blake3_hasher_finalize(&hasher, v.data(), v.size());\n  if (out_len == 0) {\n    return;\n  }\n\n  // If the subtree stack is empty, then the current chunk is the root.\n  if (self->cv_stack_len == 0) {\n    output_t output = chunk_state_output(&self->chunk);\n    output_root_bytes(&output, seek, out, out_len);\n    return;\n  }\n  // If there are any bytes in the chunk state, finalize that chunk and do a\n  // roll-up merge between that chunk hash and every subtree in the stack. In\n  // this case, the extra merge loop at the end of blake3_hasher_update\n  // guarantees that none of the subtrees in the stack need to be merged with\n  // each other first. Otherwise, if there are no bytes in the chunk state,\n  // then the top of the stack is a chunk hash, and we start the merge from\n  // that.\n  output_t output;\n  size_t cvs_remaining;\n  if (chunk_state_len(&self->chunk) > 0) {\n    cvs_remaining = self->cv_stack_len;\n    output = chunk_state_output(&self->chunk);\n  } else {\n    // There are always at least 2 CVs in the stack in this case.\n    cvs_remaining = self->cv_stack_len - 2;\n    output = parent_output(&self->cv_stack[cvs_remaining * 32], self->key,\n                           self->chunk.flags);\n  }\n  while (cvs_remaining > 0) {\n    cvs_remaining -= 1;\n    uint8_t parent_block[BLAKE3_BLOCK_LEN];\n    memcpy(parent_block, &self->cv_stack[cvs_remaining * 32], 32);\n    output_chaining_value(&output, &parent_block[32]);\n    output = parent_output(parent_block, self->key, self->chunk.flags);\n  }\n  output_root_bytes(&output, seek, out, out_len);\n}\n\nvoid blake3_hasher_reset(blake3_hasher *self) {\n  chunk_state_reset(&self->chunk, self->key, 0);\n  self->cv_stack_len = 0;\n}\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3.h",
    "content": "#ifndef BLAKE3_H\n#define BLAKE3_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(BLAKE3_API)\n# if defined(_WIN32) || defined(__CYGWIN__)\n#   if defined(BLAKE3_DLL)\n#     if defined(BLAKE3_DLL_EXPORTS)\n#       define BLAKE3_API __declspec(dllexport)\n#     else\n#       define BLAKE3_API __declspec(dllimport)\n#     endif\n#     define BLAKE3_PRIVATE\n#   else\n#     define BLAKE3_API\n#     define BLAKE3_PRIVATE\n#   endif\n# elif __GNUC__ >= 4\n#   define BLAKE3_API __attribute__((visibility(\"default\")))\n#   define BLAKE3_PRIVATE __attribute__((visibility(\"hidden\")))\n# else\n#   define BLAKE3_API\n#   define BLAKE3_PRIVATE\n# endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define BLAKE3_VERSION_STRING \"1.5.0\"\n#define BLAKE3_KEY_LEN 32\n#define BLAKE3_OUT_LEN 32\n#define BLAKE3_BLOCK_LEN 64\n#define BLAKE3_CHUNK_LEN 1024\n#define BLAKE3_MAX_DEPTH 54\n\n// This struct is a private implementation detail. It has to be here because\n// it's part of blake3_hasher below.\ntypedef struct {\n  uint32_t cv[8];\n  uint64_t chunk_counter;\n  uint8_t buf[BLAKE3_BLOCK_LEN];\n  uint8_t buf_len;\n  uint8_t blocks_compressed;\n  uint8_t flags;\n} blake3_chunk_state;\n\ntypedef struct {\n  uint32_t key[8];\n  blake3_chunk_state chunk;\n  uint8_t cv_stack_len;\n  // The stack size is MAX_DEPTH + 1 because we do lazy merging. For example,\n  // with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk\n  // requires a 4th entry, rather than merging everything down to 1, because we\n  // don't know whether more input is coming. This is different from how the\n  // reference implementation does things.\n  uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN];\n} blake3_hasher;\n\nBLAKE3_API const char *blake3_version(void);\nBLAKE3_API void blake3_hasher_init(blake3_hasher *self);\nBLAKE3_API void blake3_hasher_init_keyed(blake3_hasher *self,\n                                         const uint8_t key[BLAKE3_KEY_LEN]);\nBLAKE3_API void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context);\nBLAKE3_API void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context,\n                                                  size_t context_len);\nBLAKE3_API void blake3_hasher_update(blake3_hasher *self, const void *input,\n                                     size_t input_len);\nBLAKE3_API void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out,\n                                       size_t out_len);\nBLAKE3_API void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek,\n                                            uint8_t *out, size_t out_len);\nBLAKE3_API void blake3_hasher_reset(blake3_hasher *self);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BLAKE3_H */\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_avx2_x86-64_unix.S",
    "content": "#if defined(__ELF__) && defined(__linux__)\n.section .note.GNU-stack,\"\",%progbits\n#endif\n\n#if defined(__ELF__) && defined(__CET__) && defined(__has_include)\n#if __has_include(<cet.h>)\n#include <cet.h>\n#endif\n#endif\n\n#if !defined(_CET_ENDBR)\n#define _CET_ENDBR\n#endif\n\n.intel_syntax noprefix\n.global _blake3_hash_many_avx2\n.global blake3_hash_many_avx2\n#ifdef __APPLE__\n.text\n#else\n.section .text\n#endif\n        .p2align  6\n_blake3_hash_many_avx2:\nblake3_hash_many_avx2:\n        _CET_ENDBR\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 680\n        and     rsp, 0xFFFFFFFFFFFFFFC0\n        neg     r9d\n        vmovd   xmm0, r9d\n        vpbroadcastd ymm0, xmm0\n        vmovdqa ymmword ptr [rsp+0x280], ymm0\n        vpand   ymm1, ymm0, ymmword ptr [ADD0+rip]\n        vpand   ymm2, ymm0, ymmword ptr [ADD1+rip]\n        vmovdqa ymmword ptr [rsp+0x220], ymm2\n        vmovd   xmm2, r8d\n        vpbroadcastd ymm2, xmm2\n        vpaddd  ymm2, ymm2, ymm1\n        vmovdqa ymmword ptr [rsp+0x240], ymm2\n        vpxor   ymm1, ymm1, ymmword ptr [CMP_MSB_MASK+rip]\n        vpxor   ymm2, ymm2, ymmword ptr [CMP_MSB_MASK+rip]\n        vpcmpgtd ymm2, ymm1, ymm2\n        shr     r8, 32\n        vmovd   xmm3, r8d\n        vpbroadcastd ymm3, xmm3\n        vpsubd  ymm3, ymm3, ymm2\n        vmovdqa ymmword ptr [rsp+0x260], ymm3\n        shl     rdx, 6\n        mov     qword ptr [rsp+0x2A0], rdx\n        cmp     rsi, 8\n        jc      3f\n2:\n        vpbroadcastd ymm0, dword ptr [rcx]\n        vpbroadcastd ymm1, dword ptr [rcx+0x4]\n        vpbroadcastd ymm2, dword ptr [rcx+0x8]\n        vpbroadcastd ymm3, dword ptr [rcx+0xC]\n        vpbroadcastd ymm4, dword ptr [rcx+0x10]\n        vpbroadcastd ymm5, dword ptr [rcx+0x14]\n        vpbroadcastd ymm6, dword ptr [rcx+0x18]\n        vpbroadcastd ymm7, dword ptr [rcx+0x1C]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        mov     r12, qword ptr [rdi+0x20]\n        mov     r13, qword ptr [rdi+0x28]\n        mov     r14, qword ptr [rdi+0x30]\n        mov     r15, qword ptr [rdi+0x38]\n        movzx   eax, byte ptr [rbp+0x38]\n        movzx   ebx, byte ptr [rbp+0x40]\n        or      eax, ebx\n        xor     edx, edx\n.p2align  5\n9:\n        movzx   ebx, byte ptr [rbp+0x48]\n        or      ebx, eax\n        add     rdx, 64\n        cmp     rdx, qword ptr [rsp+0x2A0]\n        cmove   eax, ebx\n        mov     dword ptr [rsp+0x200], eax\n        vmovups xmm8, xmmword ptr [r8+rdx-0x40]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x40], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x40]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x40], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x40]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x40], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x40]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x40], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+0x20], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+0x40], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+0x60], ymm11\n        vmovups xmm8, xmmword ptr [r8+rdx-0x30]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x30], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x30]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x30], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x30]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x30], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x30]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x30], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp+0x80], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+0xA0], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+0xC0], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+0xE0], ymm11\n        vmovups xmm8, xmmword ptr [r8+rdx-0x20]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x20], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x20]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x20], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x20]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x20], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x20]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x20], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp+0x100], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+0x120], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+0x140], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+0x160], ymm11\n        vmovups xmm8, xmmword ptr [r8+rdx-0x10]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x10], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x10]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x10], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x10]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x10], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x10]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x10], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp+0x180], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+0x1A0], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+0x1C0], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+0x1E0], ymm11\n        vpbroadcastd ymm15, dword ptr [rsp+0x200]\n        prefetcht0 [r8+rdx+0x80]\n        prefetcht0 [r12+rdx+0x80]\n        prefetcht0 [r9+rdx+0x80]\n        prefetcht0 [r13+rdx+0x80]\n        prefetcht0 [r10+rdx+0x80]\n        prefetcht0 [r14+rdx+0x80]\n        prefetcht0 [r11+rdx+0x80]\n        prefetcht0 [r15+rdx+0x80]\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x40]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x80]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm0, ymmword ptr [rsp+0x240]\n        vpxor   ymm13, ymm1, ymmword ptr [rsp+0x260]\n        vpxor   ymm14, ymm2, ymmword ptr [BLAKE3_BLOCK_LEN+rip]\n        vpxor   ymm15, ymm3, ymm15\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [BLAKE3_IV_0+rip]\n        vpaddd  ymm9, ymm13, ymmword ptr [BLAKE3_IV_1+rip]\n        vpaddd  ymm10, ymm14, ymmword ptr [BLAKE3_IV_2+rip]\n        vpaddd  ymm11, ymm15, ymmword ptr [BLAKE3_IV_3+rip]\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x20]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x60]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x100]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x140]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x180]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x120]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x160]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x40]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x60]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x80]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x140]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x20]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x180]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x120]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x160]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x100]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x60]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x140]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x80]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x180]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x40]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x120]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x160]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x100]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x20]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x140]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x180]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x120]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x60]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x80]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x160]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x20]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x40]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x100]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x180]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x120]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x160]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x140]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x100]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x40]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x60]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x20]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x80]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x120]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x160]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x100]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x180]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x20]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x40]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x80]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x60]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x140]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x160]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0xA0]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x20]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x100]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x1E0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x120]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xC0]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x1C0]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x40]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x60]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0xE0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+0x200], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0x140]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0x180]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0x80]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0x1A0]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8+rip]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+0x200]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vpxor   ymm0, ymm0, ymm8\n        vpxor   ymm1, ymm1, ymm9\n        vpxor   ymm2, ymm2, ymm10\n        vpxor   ymm3, ymm3, ymm11\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpxor   ymm4, ymm4, ymm12\n        vpxor   ymm5, ymm5, ymm13\n        vpxor   ymm6, ymm6, ymm14\n        vpxor   ymm7, ymm7, ymm15\n        movzx   eax, byte ptr [rbp+0x38]\n        jne     9b\n        mov     rbx, qword ptr [rbp+0x50]\n        vunpcklps ymm8, ymm0, ymm1\n        vunpcklps ymm9, ymm2, ymm3\n        vunpckhps ymm10, ymm0, ymm1\n        vunpcklps ymm11, ymm4, ymm5\n        vunpcklps ymm0, ymm6, ymm7\n        vshufps ymm12, ymm8, ymm9, 78\n        vblendps ymm1, ymm8, ymm12, 0xCC\n        vshufps ymm8, ymm11, ymm0, 78\n        vunpckhps ymm13, ymm2, ymm3\n        vblendps ymm2, ymm11, ymm8, 0xCC\n        vblendps ymm3, ymm12, ymm9, 0xCC\n        vperm2f128 ymm12, ymm1, ymm2, 0x20\n        vmovups ymmword ptr [rbx], ymm12\n        vunpckhps ymm14, ymm4, ymm5\n        vblendps ymm4, ymm8, ymm0, 0xCC\n        vunpckhps ymm15, ymm6, ymm7\n        vperm2f128 ymm7, ymm3, ymm4, 0x20\n        vmovups ymmword ptr [rbx+0x20], ymm7\n        vshufps ymm5, ymm10, ymm13, 78\n        vblendps ymm6, ymm5, ymm13, 0xCC\n        vshufps ymm13, ymm14, ymm15, 78\n        vblendps ymm10, ymm10, ymm5, 0xCC\n        vblendps ymm14, ymm14, ymm13, 0xCC\n        vperm2f128 ymm8, ymm10, ymm14, 0x20\n        vmovups ymmword ptr [rbx+0x40], ymm8\n        vblendps ymm15, ymm13, ymm15, 0xCC\n        vperm2f128 ymm13, ymm6, ymm15, 0x20\n        vmovups ymmword ptr [rbx+0x60], ymm13\n        vperm2f128 ymm9, ymm1, ymm2, 0x31\n        vperm2f128 ymm11, ymm3, ymm4, 0x31\n        vmovups ymmword ptr [rbx+0x80], ymm9\n        vperm2f128 ymm14, ymm10, ymm14, 0x31\n        vperm2f128 ymm15, ymm6, ymm15, 0x31\n        vmovups ymmword ptr [rbx+0xA0], ymm11\n        vmovups ymmword ptr [rbx+0xC0], ymm14\n        vmovups ymmword ptr [rbx+0xE0], ymm15\n        vmovdqa ymm0, ymmword ptr [rsp+0x220]\n        vpaddd  ymm1, ymm0, ymmword ptr [rsp+0x240]\n        vmovdqa ymmword ptr [rsp+0x240], ymm1\n        vpxor   ymm0, ymm0, ymmword ptr [CMP_MSB_MASK+rip]\n        vpxor   ymm2, ymm1, ymmword ptr [CMP_MSB_MASK+rip]\n        vpcmpgtd ymm2, ymm0, ymm2\n        vmovdqa ymm0, ymmword ptr [rsp+0x260]\n        vpsubd  ymm2, ymm0, ymm2\n        vmovdqa ymmword ptr [rsp+0x260], ymm2\n        add     rdi, 64\n        add     rbx, 256\n        mov     qword ptr [rbp+0x50], rbx\n        sub     rsi, 8\n        cmp     rsi, 8\n        jnc     2b\n        test    rsi, rsi\n        jnz     3f\n4:\n        vzeroupper\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\n.p2align  5\n3:\n        mov     rbx, qword ptr [rbp+0x50]\n        mov     r15, qword ptr [rsp+0x2A0]\n        movzx   r13d, byte ptr [rbp+0x38]\n        movzx   r12d, byte ptr [rbp+0x48]\n        test    rsi, 0x4\n        je      3f\n        vbroadcasti128 ymm0, xmmword ptr [rcx]\n        vbroadcasti128 ymm1, xmmword ptr [rcx+0x10]\n        vmovdqa ymm8, ymm0\n        vmovdqa ymm9, ymm1\n        vbroadcasti128 ymm12, xmmword ptr [rsp+0x240]\n        vbroadcasti128 ymm13, xmmword ptr [rsp+0x260]\n        vpunpckldq ymm14, ymm12, ymm13\n        vpunpckhdq ymm15, ymm12, ymm13\n        vpermq  ymm14, ymm14, 0x50\n        vpermq  ymm15, ymm15, 0x50\n        vbroadcasti128 ymm12, xmmword ptr [BLAKE3_BLOCK_LEN+rip]\n        vpblendd ymm14, ymm14, ymm12, 0x44\n        vpblendd ymm15, ymm15, ymm12, 0x44\n        vmovdqa ymmword ptr [rsp], ymm14\n        vmovdqa ymmword ptr [rsp+0x20], ymm15\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n.p2align  5\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+0x200], eax\n        vmovups ymm2, ymmword ptr [r8+rdx-0x40]\n        vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-0x40], 0x01\n        vmovups ymm3, ymmword ptr [r8+rdx-0x30]\n        vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-0x30], 0x01\n        vshufps ymm4, ymm2, ymm3, 136\n        vshufps ymm5, ymm2, ymm3, 221\n        vmovups ymm2, ymmword ptr [r8+rdx-0x20]\n        vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-0x20], 0x01\n        vmovups ymm3, ymmword ptr [r8+rdx-0x10]\n        vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-0x10], 0x01\n        vshufps ymm6, ymm2, ymm3, 136\n        vshufps ymm7, ymm2, ymm3, 221\n        vpshufd ymm6, ymm6, 0x93\n        vpshufd ymm7, ymm7, 0x93\n        vmovups ymm10, ymmword ptr [r10+rdx-0x40]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-0x40], 0x01\n        vmovups ymm11, ymmword ptr [r10+rdx-0x30]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-0x30], 0x01\n        vshufps ymm12, ymm10, ymm11, 136\n        vshufps ymm13, ymm10, ymm11, 221\n        vmovups ymm10, ymmword ptr [r10+rdx-0x20]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-0x20], 0x01\n        vmovups ymm11, ymmword ptr [r10+rdx-0x10]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-0x10], 0x01\n        vshufps ymm14, ymm10, ymm11, 136\n        vshufps ymm15, ymm10, ymm11, 221\n        vpshufd ymm14, ymm14, 0x93\n        vpshufd ymm15, ymm15, 0x93\n        prefetcht0 [r8+rdx+0x80]\n        prefetcht0 [r9+rdx+0x80]\n        prefetcht0 [r10+rdx+0x80]\n        prefetcht0 [r11+rdx+0x80]\n        vpbroadcastd ymm2, dword ptr [rsp+0x200]\n        vmovdqa ymm3, ymmword ptr [rsp]\n        vmovdqa ymm11, ymmword ptr [rsp+0x20]\n        vpblendd ymm3, ymm3, ymm2, 0x88\n        vpblendd ymm11, ymm11, ymm2, 0x88\n        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV+rip]\n        vmovdqa ymm10, ymm2\n        mov     al, 7\n9:\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm8, ymm8, ymm12\n        vmovdqa ymmword ptr [rsp+0x40], ymm4\n        nop\n        vmovdqa ymmword ptr [rsp+0x60], ymm12\n        nop\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT16+rip]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 12\n        vpslld  ymm9, ymm9, 20\n        vpor    ymm9, ymm9, ymm4\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vmovdqa ymmword ptr [rsp+0x80], ymm5\n        vmovdqa ymmword ptr [rsp+0xA0], ymm13\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT8+rip]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 7\n        vpslld  ymm9, ymm9, 25\n        vpor    ymm9, ymm9, ymm4\n        vpshufd ymm0, ymm0, 0x93\n        vpshufd ymm8, ymm8, 0x93\n        vpshufd ymm3, ymm3, 0x4E\n        vpshufd ymm11, ymm11, 0x4E\n        vpshufd ymm2, ymm2, 0x39\n        vpshufd ymm10, ymm10, 0x39\n        vpaddd  ymm0, ymm0, ymm6\n        vpaddd  ymm8, ymm8, ymm14\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT16+rip]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 12\n        vpslld  ymm9, ymm9, 20\n        vpor    ymm9, ymm9, ymm4\n        vpaddd  ymm0, ymm0, ymm7\n        vpaddd  ymm8, ymm8, ymm15\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT8+rip]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 7\n        vpslld  ymm9, ymm9, 25\n        vpor    ymm9, ymm9, ymm4\n        vpshufd ymm0, ymm0, 0x39\n        vpshufd ymm8, ymm8, 0x39\n        vpshufd ymm3, ymm3, 0x4E\n        vpshufd ymm11, ymm11, 0x4E\n        vpshufd ymm2, ymm2, 0x93\n        vpshufd ymm10, ymm10, 0x93\n        dec     al\n        je      9f\n        vmovdqa ymm4, ymmword ptr [rsp+0x40]\n        vmovdqa ymm5, ymmword ptr [rsp+0x80]\n        vshufps ymm12, ymm4, ymm5, 214\n        vpshufd ymm13, ymm4, 0x0F\n        vpshufd ymm4, ymm12, 0x39\n        vshufps ymm12, ymm6, ymm7, 250\n        vpblendd ymm13, ymm13, ymm12, 0xAA\n        vpunpcklqdq ymm12, ymm7, ymm5\n        vpblendd ymm12, ymm12, ymm6, 0x88\n        vpshufd ymm12, ymm12, 0x78\n        vpunpckhdq ymm5, ymm5, ymm7\n        vpunpckldq ymm6, ymm6, ymm5\n        vpshufd ymm7, ymm6, 0x1E\n        vmovdqa ymmword ptr [rsp+0x40], ymm13\n        vmovdqa ymmword ptr [rsp+0x80], ymm12\n        vmovdqa ymm12, ymmword ptr [rsp+0x60]\n        vmovdqa ymm13, ymmword ptr [rsp+0xA0]\n        vshufps ymm5, ymm12, ymm13, 214\n        vpshufd ymm6, ymm12, 0x0F\n        vpshufd ymm12, ymm5, 0x39\n        vshufps ymm5, ymm14, ymm15, 250\n        vpblendd ymm6, ymm6, ymm5, 0xAA\n        vpunpcklqdq ymm5, ymm15, ymm13\n        vpblendd ymm5, ymm5, ymm14, 0x88\n        vpshufd ymm5, ymm5, 0x78\n        vpunpckhdq ymm13, ymm13, ymm15\n        vpunpckldq ymm14, ymm14, ymm13\n        vpshufd ymm15, ymm14, 0x1E\n        vmovdqa ymm13, ymm6\n        vmovdqa ymm14, ymm5\n        vmovdqa ymm5, ymmword ptr [rsp+0x40]\n        vmovdqa ymm6, ymmword ptr [rsp+0x80]\n        jmp     9b\n9:\n        vpxor   ymm0, ymm0, ymm2\n        vpxor   ymm1, ymm1, ymm3\n        vpxor   ymm8, ymm8, ymm10\n        vpxor   ymm9, ymm9, ymm11\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+0x10], xmm1\n        vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01\n        vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01\n        vmovdqu xmmword ptr [rbx+0x40], xmm8\n        vmovdqu xmmword ptr [rbx+0x50], xmm9\n        vextracti128 xmmword ptr [rbx+0x60], ymm8, 0x01\n        vextracti128 xmmword ptr [rbx+0x70], ymm9, 0x01\n        vmovaps xmm8, xmmword ptr [rsp+0x280]\n        vmovaps xmm0, xmmword ptr [rsp+0x240]\n        vmovaps xmm1, xmmword ptr [rsp+0x250]\n        vmovaps xmm2, xmmword ptr [rsp+0x260]\n        vmovaps xmm3, xmmword ptr [rsp+0x270]\n        vblendvps xmm0, xmm0, xmm1, xmm8\n        vblendvps xmm2, xmm2, xmm3, xmm8\n        vmovaps xmmword ptr [rsp+0x240], xmm0\n        vmovaps xmmword ptr [rsp+0x260], xmm2\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\n3:\n        test    rsi, 0x2\n        je      3f\n        vbroadcasti128 ymm0, xmmword ptr [rcx]\n        vbroadcasti128 ymm1, xmmword ptr [rcx+0x10]\n        vmovd   xmm13, dword ptr [rsp+0x240]\n        vpinsrd xmm13, xmm13, dword ptr [rsp+0x260], 1\n        vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        vmovd   xmm14, dword ptr [rsp+0x244]\n        vpinsrd xmm14, xmm14, dword ptr [rsp+0x264], 1\n        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        vinserti128 ymm13, ymm13, xmm14, 0x01\n        vbroadcasti128 ymm14, xmmword ptr [ROT16+rip]\n        vbroadcasti128 ymm15, xmmword ptr [ROT8+rip]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n.p2align  5\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+0x200], eax\n        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV+rip]\n        vpbroadcastd ymm8, dword ptr [rsp+0x200]\n        vpblendd ymm3, ymm13, ymm8, 0x88\n        vmovups ymm8, ymmword ptr [r8+rdx-0x40]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x40], 0x01\n        vmovups ymm9, ymmword ptr [r8+rdx-0x30]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x30], 0x01\n        vshufps ymm4, ymm8, ymm9, 136\n        vshufps ymm5, ymm8, ymm9, 221\n        vmovups ymm8, ymmword ptr [r8+rdx-0x20]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x20], 0x01\n        vmovups ymm9, ymmword ptr [r8+rdx-0x10]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x10], 0x01\n        vshufps ymm6, ymm8, ymm9, 136\n        vshufps ymm7, ymm8, ymm9, 221\n        vpshufd ymm6, ymm6, 0x93\n        vpshufd ymm7, ymm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm14\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm8\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm15\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm8\n        vpshufd ymm0, ymm0, 0x93\n        vpshufd ymm3, ymm3, 0x4E\n        vpshufd ymm2, ymm2, 0x39\n        vpaddd  ymm0, ymm0, ymm6\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm14\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm8\n        vpaddd  ymm0, ymm0, ymm7\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm15\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm8\n        vpshufd ymm0, ymm0, 0x39\n        vpshufd ymm3, ymm3, 0x4E\n        vpshufd ymm2, ymm2, 0x93\n        dec     al\n        jz      9f\n        vshufps ymm8, ymm4, ymm5, 214\n        vpshufd ymm9, ymm4, 0x0F\n        vpshufd ymm4, ymm8, 0x39\n        vshufps ymm8, ymm6, ymm7, 250\n        vpblendd ymm9, ymm9, ymm8, 0xAA\n        vpunpcklqdq ymm8, ymm7, ymm5\n        vpblendd ymm8, ymm8, ymm6, 0x88\n        vpshufd ymm8, ymm8, 0x78\n        vpunpckhdq ymm5, ymm5, ymm7\n        vpunpckldq ymm6, ymm6, ymm5\n        vpshufd ymm7, ymm6, 0x1E\n        vmovdqa ymm5, ymm9\n        vmovdqa ymm6, ymm8\n        jmp     9b\n9:\n        vpxor   ymm0, ymm0, ymm2\n        vpxor   ymm1, ymm1, ymm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+0x10], xmm1\n        vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01\n        vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01\n        vmovaps ymm8, ymmword ptr [rsp+0x280]\n        vmovaps ymm0, ymmword ptr [rsp+0x240]\n        vmovups ymm1, ymmword ptr [rsp+0x248]\n        vmovaps ymm2, ymmword ptr [rsp+0x260]\n        vmovups ymm3, ymmword ptr [rsp+0x268]\n        vblendvps ymm0, ymm0, ymm1, ymm8\n        vblendvps ymm2, ymm2, ymm3, ymm8\n        vmovaps ymmword ptr [rsp+0x240], ymm0\n        vmovaps ymmword ptr [rsp+0x260], ymm2\n        add     rbx, 64\n        add     rdi, 16\n        sub     rsi, 2\n3:\n        test    rsi, 0x1\n        je      4b\n        vmovdqu xmm0, xmmword ptr [rcx]\n        vmovdqu xmm1, xmmword ptr [rcx+0x10]\n        vmovd   xmm3, dword ptr [rsp+0x240]\n        vpinsrd xmm3, xmm3, dword ptr [rsp+0x260], 1\n        vpinsrd xmm13, xmm3, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        vmovdqa xmm14, xmmword ptr [ROT16+rip]\n        vmovdqa xmm15, xmmword ptr [ROT8+rip]\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n.p2align  5\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        vmovdqa xmm2, xmmword ptr [BLAKE3_IV+rip]\n        vmovdqa xmm3, xmm13\n        vpinsrd xmm3, xmm3, eax, 3\n        vmovups xmm8, xmmword ptr [r8+rdx-0x40]\n        vmovups xmm9, xmmword ptr [r8+rdx-0x30]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-0x20]\n        vmovups xmm9, xmmword ptr [r8+rdx-0x10]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 0x93\n        vpshufd xmm7, xmm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm14\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 12\n        vpslld  xmm1, xmm1, 20\n        vpor    xmm1, xmm1, xmm8\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm15\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 7\n        vpslld  xmm1, xmm1, 25\n        vpor    xmm1, xmm1, xmm8\n        vpshufd xmm0, xmm0, 0x93\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x39\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm14\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 12\n        vpslld  xmm1, xmm1, 20\n        vpor    xmm1, xmm1, xmm8\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm15\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 7\n        vpslld  xmm1, xmm1, 25\n        vpor    xmm1, xmm1, xmm8\n        vpshufd xmm0, xmm0, 0x39\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0x0F\n        vpshufd xmm4, xmm8, 0x39\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0xAA\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 0x88\n        vpshufd xmm8, xmm8, 0x78\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 0x1E\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     9b\n9:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+0x10], xmm1\n        jmp     4b\n\n\n#ifdef __APPLE__\n.static_data\n#else\n.section .rodata\n#endif\n.p2align  6\nADD0:\n        .long  0, 1, 2, 3, 4, 5, 6, 7\nADD1:\n        .long  8, 8, 8, 8, 8, 8, 8, 8\nBLAKE3_IV_0:\n        .long  0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667\n        .long  0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667\nBLAKE3_IV_1:\n        .long  0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85\n        .long  0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85\nBLAKE3_IV_2:\n        .long  0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372\n        .long  0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372\nBLAKE3_IV_3:\n        .long  0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A\n        .long  0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A\nBLAKE3_BLOCK_LEN:\n        .long  0x00000040, 0x00000040, 0x00000040, 0x00000040\n        .long  0x00000040, 0x00000040, 0x00000040, 0x00000040\nROT16:\n        .byte  2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13\nROT8:\n        .byte  1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12\nCMP_MSB_MASK:\n        .long  0x80000000, 0x80000000, 0x80000000, 0x80000000\n        .long  0x80000000, 0x80000000, 0x80000000, 0x80000000\nBLAKE3_IV:\n        .long  0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A\n\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_avx2_x86-64_windows_msvc.asm",
    "content": "public _blake3_hash_many_avx2\npublic blake3_hash_many_avx2\n\n_TEXT   SEGMENT ALIGN(16) 'CODE'\n\nALIGN   16\nblake3_hash_many_avx2 PROC\n_blake3_hash_many_avx2 PROC\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rsi\n        push    rdi\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 880\n        and     rsp, 0FFFFFFFFFFFFFFC0H\n        vmovdqa xmmword ptr [rsp+2D0H], xmm6\n        vmovdqa xmmword ptr [rsp+2E0H], xmm7\n        vmovdqa xmmword ptr [rsp+2F0H], xmm8\n        vmovdqa xmmword ptr [rsp+300H], xmm9\n        vmovdqa xmmword ptr [rsp+310H], xmm10\n        vmovdqa xmmword ptr [rsp+320H], xmm11\n        vmovdqa xmmword ptr [rsp+330H], xmm12\n        vmovdqa xmmword ptr [rsp+340H], xmm13\n        vmovdqa xmmword ptr [rsp+350H], xmm14\n        vmovdqa xmmword ptr [rsp+360H], xmm15\n        mov     rdi, rcx\n        mov     rsi, rdx\n        mov     rdx, r8\n        mov     rcx, r9\n        mov     r8, qword ptr [rbp+68H]\n        movzx   r9, byte ptr [rbp+70H]\n        neg     r9d\n        vmovd   xmm0, r9d\n        vpbroadcastd ymm0, xmm0\n        vmovdqa ymmword ptr [rsp+260H], ymm0\n        vpand   ymm1, ymm0, ymmword ptr [ADD0]\n        vpand   ymm2, ymm0, ymmword ptr [ADD1]\n        vmovdqa ymmword ptr [rsp+2A0H], ymm2\n        vmovd   xmm2, r8d\n        vpbroadcastd ymm2, xmm2\n        vpaddd  ymm2, ymm2, ymm1\n        vmovdqa ymmword ptr [rsp+220H], ymm2\n        vpxor   ymm1, ymm1, ymmword ptr [CMP_MSB_MASK]\n        vpxor   ymm2, ymm2, ymmword ptr [CMP_MSB_MASK]\n        vpcmpgtd ymm2, ymm1, ymm2\n        shr     r8, 32\n        vmovd   xmm3, r8d\n        vpbroadcastd ymm3, xmm3\n        vpsubd  ymm3, ymm3, ymm2\n        vmovdqa ymmword ptr [rsp+240H], ymm3\n        shl     rdx, 6\n        mov     qword ptr [rsp+2C0H], rdx\n        cmp     rsi, 8\n        jc      final7blocks\nouterloop8:\n        vpbroadcastd ymm0, dword ptr [rcx]\n        vpbroadcastd ymm1, dword ptr [rcx+4H]\n        vpbroadcastd ymm2, dword ptr [rcx+8H]\n        vpbroadcastd ymm3, dword ptr [rcx+0CH]\n        vpbroadcastd ymm4, dword ptr [rcx+10H]\n        vpbroadcastd ymm5, dword ptr [rcx+14H]\n        vpbroadcastd ymm6, dword ptr [rcx+18H]\n        vpbroadcastd ymm7, dword ptr [rcx+1CH]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        mov     r12, qword ptr [rdi+20H]\n        mov     r13, qword ptr [rdi+28H]\n        mov     r14, qword ptr [rdi+30H]\n        mov     r15, qword ptr [rdi+38H]\n        movzx   eax, byte ptr [rbp+78H]\n        movzx   ebx, byte ptr [rbp+80H]\n        or      eax, ebx\n        xor     edx, edx\nALIGN   16\ninnerloop8:\n        movzx   ebx, byte ptr [rbp+88H]\n        or      ebx, eax\n        add     rdx, 64\n        cmp     rdx, qword ptr [rsp+2C0H]\n        cmove   eax, ebx\n        mov     dword ptr [rsp+200H], eax\n        vmovups xmm8, xmmword ptr [r8+rdx-40H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-40H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-40H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-40H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-40H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-40H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-40H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-40H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+20H], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+40H], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+60H], ymm11\n        vmovups xmm8, xmmword ptr [r8+rdx-30H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-30H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-30H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-30H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-30H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-30H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-30H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-30H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp+80H], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+0A0H], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+0C0H], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+0E0H], ymm11\n        vmovups xmm8, xmmword ptr [r8+rdx-20H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-20H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-20H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-20H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-20H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-20H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-20H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-20H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp+100H], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+120H], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+140H], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+160H], ymm11\n        vmovups xmm8, xmmword ptr [r8+rdx-10H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-10H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-10H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-10H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-10H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-10H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-10H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-10H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm8, ymm12, ymm14, 136\n        vmovaps ymmword ptr [rsp+180H], ymm8\n        vshufps ymm9, ymm12, ymm14, 221\n        vmovaps ymmword ptr [rsp+1A0H], ymm9\n        vshufps ymm10, ymm13, ymm15, 136\n        vmovaps ymmword ptr [rsp+1C0H], ymm10\n        vshufps ymm11, ymm13, ymm15, 221\n        vmovaps ymmword ptr [rsp+1E0H], ymm11\n        vpbroadcastd ymm15, dword ptr [rsp+200H]\n        prefetcht0 byte ptr [r8+rdx+80H]\n        prefetcht0 byte ptr [r12+rdx+80H]\n        prefetcht0 byte ptr [r9+rdx+80H]\n        prefetcht0 byte ptr [r13+rdx+80H]\n        prefetcht0 byte ptr [r10+rdx+80H]\n        prefetcht0 byte ptr [r14+rdx+80H]\n        prefetcht0 byte ptr [r11+rdx+80H]\n        prefetcht0 byte ptr [r15+rdx+80H]\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+40H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+80H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm0, ymmword ptr [rsp+220H]\n        vpxor   ymm13, ymm1, ymmword ptr [rsp+240H]\n        vpxor   ymm14, ymm2, ymmword ptr [BLAKE3_BLOCK_LEN]\n        vpxor   ymm15, ymm3, ymm15\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [BLAKE3_IV_0]\n        vpaddd  ymm9, ymm13, ymmword ptr [BLAKE3_IV_1]\n        vpaddd  ymm10, ymm14, ymmword ptr [BLAKE3_IV_2]\n        vpaddd  ymm11, ymm15, ymmword ptr [BLAKE3_IV_3]\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+20H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+60H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+100H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+140H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+180H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+120H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+160H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+40H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+60H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+80H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+140H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+20H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+180H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+120H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+160H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+100H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+60H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+140H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+80H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+180H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+40H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+120H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+160H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+100H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+20H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+140H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+180H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+120H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+60H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+80H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+160H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+20H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+40H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+100H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+180H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+120H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+160H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+140H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+100H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+40H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+60H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+20H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+80H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+120H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+160H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+100H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+180H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+20H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+40H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+80H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+60H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+140H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+160H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+0A0H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+20H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+100H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+1E0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+120H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0C0H]\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxor   ymm12, ymm12, ymm0\n        vpxor   ymm13, ymm13, ymm1\n        vpxor   ymm14, ymm14, ymm2\n        vpxor   ymm15, ymm15, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpshufb ymm15, ymm15, ymm8\n        vpaddd  ymm8, ymm12, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxor   ymm4, ymm4, ymm8\n        vpxor   ymm5, ymm5, ymm9\n        vpxor   ymm6, ymm6, ymm10\n        vpxor   ymm7, ymm7, ymm11\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+1C0H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+40H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+60H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+0E0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT16]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vmovdqa ymmword ptr [rsp+200H], ymm8\n        vpsrld  ymm8, ymm5, 12\n        vpslld  ymm5, ymm5, 20\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 12\n        vpslld  ymm6, ymm6, 20\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 12\n        vpslld  ymm7, ymm7, 20\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 12\n        vpslld  ymm4, ymm4, 20\n        vpor    ymm4, ymm4, ymm8\n        vpaddd  ymm0, ymm0, ymmword ptr [rsp+140H]\n        vpaddd  ymm1, ymm1, ymmword ptr [rsp+180H]\n        vpaddd  ymm2, ymm2, ymmword ptr [rsp+80H]\n        vpaddd  ymm3, ymm3, ymmword ptr [rsp+1A0H]\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxor   ymm15, ymm15, ymm0\n        vpxor   ymm12, ymm12, ymm1\n        vpxor   ymm13, ymm13, ymm2\n        vpxor   ymm14, ymm14, ymm3\n        vbroadcasti128 ymm8, xmmword ptr [ROT8]\n        vpshufb ymm15, ymm15, ymm8\n        vpshufb ymm12, ymm12, ymm8\n        vpshufb ymm13, ymm13, ymm8\n        vpshufb ymm14, ymm14, ymm8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm13, ymmword ptr [rsp+200H]\n        vpaddd  ymm9, ymm9, ymm14\n        vpxor   ymm5, ymm5, ymm10\n        vpxor   ymm6, ymm6, ymm11\n        vpxor   ymm7, ymm7, ymm8\n        vpxor   ymm4, ymm4, ymm9\n        vpxor   ymm0, ymm0, ymm8\n        vpxor   ymm1, ymm1, ymm9\n        vpxor   ymm2, ymm2, ymm10\n        vpxor   ymm3, ymm3, ymm11\n        vpsrld  ymm8, ymm5, 7\n        vpslld  ymm5, ymm5, 25\n        vpor    ymm5, ymm5, ymm8\n        vpsrld  ymm8, ymm6, 7\n        vpslld  ymm6, ymm6, 25\n        vpor    ymm6, ymm6, ymm8\n        vpsrld  ymm8, ymm7, 7\n        vpslld  ymm7, ymm7, 25\n        vpor    ymm7, ymm7, ymm8\n        vpsrld  ymm8, ymm4, 7\n        vpslld  ymm4, ymm4, 25\n        vpor    ymm4, ymm4, ymm8\n        vpxor   ymm4, ymm4, ymm12\n        vpxor   ymm5, ymm5, ymm13\n        vpxor   ymm6, ymm6, ymm14\n        vpxor   ymm7, ymm7, ymm15\n        movzx   eax, byte ptr [rbp+78H]\n        jne     innerloop8\n        mov     rbx, qword ptr [rbp+90H]\n        vunpcklps ymm8, ymm0, ymm1\n        vunpcklps ymm9, ymm2, ymm3\n        vunpckhps ymm10, ymm0, ymm1\n        vunpcklps ymm11, ymm4, ymm5\n        vunpcklps ymm0, ymm6, ymm7\n        vshufps ymm12, ymm8, ymm9, 78\n        vblendps ymm1, ymm8, ymm12, 0CCH\n        vshufps ymm8, ymm11, ymm0, 78\n        vunpckhps ymm13, ymm2, ymm3\n        vblendps ymm2, ymm11, ymm8, 0CCH\n        vblendps ymm3, ymm12, ymm9, 0CCH\n        vperm2f128 ymm12, ymm1, ymm2, 20H\n        vmovups ymmword ptr [rbx], ymm12\n        vunpckhps ymm14, ymm4, ymm5\n        vblendps ymm4, ymm8, ymm0, 0CCH\n        vunpckhps ymm15, ymm6, ymm7\n        vperm2f128 ymm7, ymm3, ymm4, 20H\n        vmovups ymmword ptr [rbx+20H], ymm7\n        vshufps ymm5, ymm10, ymm13, 78\n        vblendps ymm6, ymm5, ymm13, 0CCH\n        vshufps ymm13, ymm14, ymm15, 78\n        vblendps ymm10, ymm10, ymm5, 0CCH\n        vblendps ymm14, ymm14, ymm13, 0CCH\n        vperm2f128 ymm8, ymm10, ymm14, 20H\n        vmovups ymmword ptr [rbx+40H], ymm8\n        vblendps ymm15, ymm13, ymm15, 0CCH\n        vperm2f128 ymm13, ymm6, ymm15, 20H\n        vmovups ymmword ptr [rbx+60H], ymm13\n        vperm2f128 ymm9, ymm1, ymm2, 31H\n        vperm2f128 ymm11, ymm3, ymm4, 31H\n        vmovups ymmword ptr [rbx+80H], ymm9\n        vperm2f128 ymm14, ymm10, ymm14, 31H\n        vperm2f128 ymm15, ymm6, ymm15, 31H\n        vmovups ymmword ptr [rbx+0A0H], ymm11\n        vmovups ymmword ptr [rbx+0C0H], ymm14\n        vmovups ymmword ptr [rbx+0E0H], ymm15\n        vmovdqa ymm0, ymmword ptr [rsp+2A0H]\n        vpaddd  ymm1, ymm0, ymmword ptr [rsp+220H]\n        vmovdqa ymmword ptr [rsp+220H], ymm1\n        vpxor   ymm0, ymm0, ymmword ptr [CMP_MSB_MASK]\n        vpxor   ymm2, ymm1, ymmword ptr [CMP_MSB_MASK]\n        vpcmpgtd ymm2, ymm0, ymm2\n        vmovdqa ymm0, ymmword ptr [rsp+240H]\n        vpsubd  ymm2, ymm0, ymm2\n        vmovdqa ymmword ptr [rsp+240H], ymm2\n        add     rdi, 64\n        add     rbx, 256\n        mov     qword ptr [rbp+90H], rbx\n        sub     rsi, 8\n        cmp     rsi, 8\n        jnc     outerloop8\n        test    rsi, rsi\n        jnz     final7blocks\nunwind:\n        vzeroupper\n        vmovdqa xmm6, xmmword ptr [rsp+2D0H]\n        vmovdqa xmm7, xmmword ptr [rsp+2E0H]\n        vmovdqa xmm8, xmmword ptr [rsp+2F0H]\n        vmovdqa xmm9, xmmword ptr [rsp+300H]\n        vmovdqa xmm10, xmmword ptr [rsp+310H]\n        vmovdqa xmm11, xmmword ptr [rsp+320H]\n        vmovdqa xmm12, xmmword ptr [rsp+330H]\n        vmovdqa xmm13, xmmword ptr [rsp+340H]\n        vmovdqa xmm14, xmmword ptr [rsp+350H]\n        vmovdqa xmm15, xmmword ptr [rsp+360H]\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     rdi\n        pop     rsi\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\nALIGN   16\nfinal7blocks:\n        mov     rbx, qword ptr [rbp+90H]\n        mov     r15, qword ptr [rsp+2C0H]\n        movzx   r13d, byte ptr [rbp+78H]\n        movzx   r12d, byte ptr [rbp+88H]\n        test    rsi, 4H\n        je      final3blocks\n        vbroadcasti128 ymm0, xmmword ptr [rcx]\n        vbroadcasti128 ymm1, xmmword ptr [rcx+10H]\n        vmovdqa ymm8, ymm0\n        vmovdqa ymm9, ymm1\n        vbroadcasti128 ymm12, xmmword ptr [rsp+220H]\n        vbroadcasti128 ymm13, xmmword ptr [rsp+240H]\n        vpunpckldq ymm14, ymm12, ymm13\n        vpunpckhdq ymm15, ymm12, ymm13\n        vpermq  ymm14, ymm14, 50H\n        vpermq  ymm15, ymm15, 50H\n        vbroadcasti128 ymm12, xmmword ptr [BLAKE3_BLOCK_LEN]\n        vpblendd ymm14, ymm14, ymm12, 44H\n        vpblendd ymm15, ymm15, ymm12, 44H\n        vmovdqa ymmword ptr [rsp], ymm14\n        vmovdqa ymmword ptr [rsp+20H], ymm15\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\nALIGN   16\ninnerloop4:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+200H], eax\n        vmovups ymm2, ymmword ptr [r8+rdx-40H]\n        vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-40H], 01H\n        vmovups ymm3, ymmword ptr [r8+rdx-30H]\n        vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-30H], 01H\n        vshufps ymm4, ymm2, ymm3, 136\n        vshufps ymm5, ymm2, ymm3, 221\n        vmovups ymm2, ymmword ptr [r8+rdx-20H]\n        vinsertf128 ymm2, ymm2, xmmword ptr [r9+rdx-20H], 01H\n        vmovups ymm3, ymmword ptr [r8+rdx-10H]\n        vinsertf128 ymm3, ymm3, xmmword ptr [r9+rdx-10H], 01H\n        vshufps ymm6, ymm2, ymm3, 136\n        vshufps ymm7, ymm2, ymm3, 221\n        vpshufd ymm6, ymm6, 93H\n        vpshufd ymm7, ymm7, 93H\n        vmovups ymm10, ymmword ptr [r10+rdx-40H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-40H], 01H\n        vmovups ymm11, ymmword ptr [r10+rdx-30H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-30H], 01H\n        vshufps ymm12, ymm10, ymm11, 136\n        vshufps ymm13, ymm10, ymm11, 221\n        vmovups ymm10, ymmword ptr [r10+rdx-20H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r11+rdx-20H], 01H\n        vmovups ymm11, ymmword ptr [r10+rdx-10H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r11+rdx-10H], 01H\n        vshufps ymm14, ymm10, ymm11, 136\n        vshufps ymm15, ymm10, ymm11, 221\n        vpshufd ymm14, ymm14, 93H\n        vpshufd ymm15, ymm15, 93H\n        vpbroadcastd ymm2, dword ptr [rsp+200H]\n        vmovdqa ymm3, ymmword ptr [rsp]\n        vmovdqa ymm11, ymmword ptr [rsp+20H]\n        vpblendd ymm3, ymm3, ymm2, 88H\n        vpblendd ymm11, ymm11, ymm2, 88H\n        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV]\n        vmovdqa ymm10, ymm2\n        mov     al, 7\nroundloop4:\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm8, ymm8, ymm12\n        vmovdqa ymmword ptr [rsp+40H], ymm4\n        nop\n        vmovdqa ymmword ptr [rsp+60H], ymm12\n        nop\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT16]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 12\n        vpslld  ymm9, ymm9, 20\n        vpor    ymm9, ymm9, ymm4\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vmovdqa ymmword ptr [rsp+80H], ymm5\n        vmovdqa ymmword ptr [rsp+0A0H], ymm13\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT8]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 7\n        vpslld  ymm9, ymm9, 25\n        vpor    ymm9, ymm9, ymm4\n        vpshufd ymm0, ymm0, 93H\n        vpshufd ymm8, ymm8, 93H\n        vpshufd ymm3, ymm3, 4EH\n        vpshufd ymm11, ymm11, 4EH\n        vpshufd ymm2, ymm2, 39H\n        vpshufd ymm10, ymm10, 39H\n        vpaddd  ymm0, ymm0, ymm6\n        vpaddd  ymm8, ymm8, ymm14\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT16]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 12\n        vpslld  ymm9, ymm9, 20\n        vpor    ymm9, ymm9, ymm4\n        vpaddd  ymm0, ymm0, ymm7\n        vpaddd  ymm8, ymm8, ymm15\n        vpaddd  ymm0, ymm0, ymm1\n        vpaddd  ymm8, ymm8, ymm9\n        vpxor   ymm3, ymm3, ymm0\n        vpxor   ymm11, ymm11, ymm8\n        vbroadcasti128 ymm4, xmmword ptr [ROT8]\n        vpshufb ymm3, ymm3, ymm4\n        vpshufb ymm11, ymm11, ymm4\n        vpaddd  ymm2, ymm2, ymm3\n        vpaddd  ymm10, ymm10, ymm11\n        vpxor   ymm1, ymm1, ymm2\n        vpxor   ymm9, ymm9, ymm10\n        vpsrld  ymm4, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm4\n        vpsrld  ymm4, ymm9, 7\n        vpslld  ymm9, ymm9, 25\n        vpor    ymm9, ymm9, ymm4\n        vpshufd ymm0, ymm0, 39H\n        vpshufd ymm8, ymm8, 39H\n        vpshufd ymm3, ymm3, 4EH\n        vpshufd ymm11, ymm11, 4EH\n        vpshufd ymm2, ymm2, 93H\n        vpshufd ymm10, ymm10, 93H\n        dec     al\n        je      endroundloop4\n        vmovdqa ymm4, ymmword ptr [rsp+40H]\n        vmovdqa ymm5, ymmword ptr [rsp+80H]\n        vshufps ymm12, ymm4, ymm5, 214\n        vpshufd ymm13, ymm4, 0FH\n        vpshufd ymm4, ymm12, 39H\n        vshufps ymm12, ymm6, ymm7, 250\n        vpblendd ymm13, ymm13, ymm12, 0AAH\n        vpunpcklqdq ymm12, ymm7, ymm5\n        vpblendd ymm12, ymm12, ymm6, 88H\n        vpshufd ymm12, ymm12, 78H\n        vpunpckhdq ymm5, ymm5, ymm7\n        vpunpckldq ymm6, ymm6, ymm5\n        vpshufd ymm7, ymm6, 1EH\n        vmovdqa ymmword ptr [rsp+40H], ymm13\n        vmovdqa ymmword ptr [rsp+80H], ymm12\n        vmovdqa ymm12, ymmword ptr [rsp+60H]\n        vmovdqa ymm13, ymmword ptr [rsp+0A0H]\n        vshufps ymm5, ymm12, ymm13, 214\n        vpshufd ymm6, ymm12, 0FH\n        vpshufd ymm12, ymm5, 39H\n        vshufps ymm5, ymm14, ymm15, 250\n        vpblendd ymm6, ymm6, ymm5, 0AAH\n        vpunpcklqdq ymm5, ymm15, ymm13\n        vpblendd ymm5, ymm5, ymm14, 88H\n        vpshufd ymm5, ymm5, 78H\n        vpunpckhdq ymm13, ymm13, ymm15\n        vpunpckldq ymm14, ymm14, ymm13\n        vpshufd ymm15, ymm14, 1EH\n        vmovdqa ymm13, ymm6\n        vmovdqa ymm14, ymm5\n        vmovdqa ymm5, ymmword ptr [rsp+40H]\n        vmovdqa ymm6, ymmword ptr [rsp+80H]\n        jmp     roundloop4\nendroundloop4:\n        vpxor   ymm0, ymm0, ymm2\n        vpxor   ymm1, ymm1, ymm3\n        vpxor   ymm8, ymm8, ymm10\n        vpxor   ymm9, ymm9, ymm11\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop4\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+10H], xmm1\n        vextracti128 xmmword ptr [rbx+20H], ymm0, 01H\n        vextracti128 xmmword ptr [rbx+30H], ymm1, 01H\n        vmovdqu xmmword ptr [rbx+40H], xmm8\n        vmovdqu xmmword ptr [rbx+50H], xmm9\n        vextracti128 xmmword ptr [rbx+60H], ymm8, 01H\n        vextracti128 xmmword ptr [rbx+70H], ymm9, 01H\n        vmovaps xmm8, xmmword ptr [rsp+260H]\n        vmovaps xmm0, xmmword ptr [rsp+220H]\n        vmovaps xmm1, xmmword ptr [rsp+230H]\n        vmovaps xmm2, xmmword ptr [rsp+240H]\n        vmovaps xmm3, xmmword ptr [rsp+250H]\n        vblendvps xmm0, xmm0, xmm1, xmm8\n        vblendvps xmm2, xmm2, xmm3, xmm8\n        vmovaps xmmword ptr [rsp+220H], xmm0\n        vmovaps xmmword ptr [rsp+240H], xmm2\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\nfinal3blocks:\n        test    rsi, 2H\n        je      final1blocks\n        vbroadcasti128 ymm0, xmmword ptr [rcx]\n        vbroadcasti128 ymm1, xmmword ptr [rcx+10H]\n        vmovd   xmm13, dword ptr [rsp+220H]\n        vpinsrd xmm13, xmm13, dword ptr [rsp+240H], 1\n        vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2\n        vmovd   xmm14, dword ptr [rsp+224H]\n        vpinsrd xmm14, xmm14, dword ptr [rsp+244H], 1\n        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2\n        vinserti128 ymm13, ymm13, xmm14, 01H\n        vbroadcasti128 ymm14, xmmword ptr [ROT16]\n        vbroadcasti128 ymm15, xmmword ptr [ROT8]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\nALIGN   16\ninnerloop2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+200H], eax\n        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV]\n        vpbroadcastd ymm8, dword ptr [rsp+200H]\n        vpblendd ymm3, ymm13, ymm8, 88H\n        vmovups ymm8, ymmword ptr [r8+rdx-40H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-40H], 01H\n        vmovups ymm9, ymmword ptr [r8+rdx-30H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-30H], 01H\n        vshufps ymm4, ymm8, ymm9, 136\n        vshufps ymm5, ymm8, ymm9, 221\n        vmovups ymm8, ymmword ptr [r8+rdx-20H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-20H], 01H\n        vmovups ymm9, ymmword ptr [r8+rdx-10H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-10H], 01H\n        vshufps ymm6, ymm8, ymm9, 136\n        vshufps ymm7, ymm8, ymm9, 221\n        vpshufd ymm6, ymm6, 93H\n        vpshufd ymm7, ymm7, 93H\n        mov     al, 7\nroundloop2:\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm14\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm8\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm15\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm8\n        vpshufd ymm0, ymm0, 93H\n        vpshufd ymm3, ymm3, 4EH\n        vpshufd ymm2, ymm2, 39H\n        vpaddd  ymm0, ymm0, ymm6\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm14\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 12\n        vpslld  ymm1, ymm1, 20\n        vpor    ymm1, ymm1, ymm8\n        vpaddd  ymm0, ymm0, ymm7\n        vpaddd  ymm0, ymm0, ymm1\n        vpxor   ymm3, ymm3, ymm0\n        vpshufb ymm3, ymm3, ymm15\n        vpaddd  ymm2, ymm2, ymm3\n        vpxor   ymm1, ymm1, ymm2\n        vpsrld  ymm8, ymm1, 7\n        vpslld  ymm1, ymm1, 25\n        vpor    ymm1, ymm1, ymm8\n        vpshufd ymm0, ymm0, 39H\n        vpshufd ymm3, ymm3, 4EH\n        vpshufd ymm2, ymm2, 93H\n        dec     al\n        jz      endroundloop2\n        vshufps ymm8, ymm4, ymm5, 214\n        vpshufd ymm9, ymm4, 0FH\n        vpshufd ymm4, ymm8, 39H\n        vshufps ymm8, ymm6, ymm7, 250\n        vpblendd ymm9, ymm9, ymm8, 0AAH\n        vpunpcklqdq ymm8, ymm7, ymm5\n        vpblendd ymm8, ymm8, ymm6, 88H\n        vpshufd ymm8, ymm8, 78H\n        vpunpckhdq ymm5, ymm5, ymm7\n        vpunpckldq ymm6, ymm6, ymm5\n        vpshufd ymm7, ymm6, 1EH\n        vmovdqa ymm5, ymm9\n        vmovdqa ymm6, ymm8\n        jmp     roundloop2\nendroundloop2:\n        vpxor   ymm0, ymm0, ymm2\n        vpxor   ymm1, ymm1, ymm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop2\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+10H], xmm1\n        vextracti128 xmmword ptr [rbx+20H], ymm0, 01H\n        vextracti128 xmmword ptr [rbx+30H], ymm1, 01H\n        vmovaps ymm8, ymmword ptr [rsp+260H]\n        vmovaps ymm0, ymmword ptr [rsp+220H]\n        vmovups ymm1, ymmword ptr [rsp+228H]\n        vmovaps ymm2, ymmword ptr [rsp+240H]\n        vmovups ymm3, ymmword ptr [rsp+248H]\n        vblendvps ymm0, ymm0, ymm1, ymm8\n        vblendvps ymm2, ymm2, ymm3, ymm8\n        vmovaps ymmword ptr [rsp+220H], ymm0\n        vmovaps ymmword ptr [rsp+240H], ymm2\n        add     rbx, 64\n        add     rdi, 16\n        sub     rsi, 2\nfinal1blocks:\n        test    rsi, 1H\n        je      unwind\n        vmovdqu xmm0, xmmword ptr [rcx]\n        vmovdqu xmm1, xmmword ptr [rcx+10H]\n        vmovd   xmm3, dword ptr [rsp+220H]\n        vpinsrd xmm3, xmm3, dword ptr [rsp+240H], 1\n        vpinsrd xmm13, xmm3, dword ptr [BLAKE3_BLOCK_LEN], 2\n        vmovdqa xmm14, xmmword ptr [ROT16]\n        vmovdqa xmm15, xmmword ptr [ROT8]\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\nALIGN   16\ninnerloop1:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        vmovdqa xmm2, xmmword ptr [BLAKE3_IV]\n        vmovdqa xmm3, xmm13\n        vpinsrd xmm3, xmm3, eax, 3\n        vmovups xmm8, xmmword ptr [r8+rdx-40H]\n        vmovups xmm9, xmmword ptr [r8+rdx-30H]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-20H]\n        vmovups xmm9, xmmword ptr [r8+rdx-10H]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 93H\n        vpshufd xmm7, xmm7, 93H\n        mov     al, 7\nroundloop1:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm14\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 12\n        vpslld  xmm1, xmm1, 20\n        vpor    xmm1, xmm1, xmm8\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm15\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 7\n        vpslld  xmm1, xmm1, 25\n        vpor    xmm1, xmm1, xmm8\n        vpshufd xmm0, xmm0, 93H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 39H\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm14\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 12\n        vpslld  xmm1, xmm1, 20\n        vpor    xmm1, xmm1, xmm8\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxor   xmm3, xmm3, xmm0\n        vpshufb xmm3, xmm3, xmm15\n        vpaddd  xmm2, xmm2, xmm3\n        vpxor   xmm1, xmm1, xmm2\n        vpsrld  xmm8, xmm1, 7\n        vpslld  xmm1, xmm1, 25\n        vpor    xmm1, xmm1, xmm8\n        vpshufd xmm0, xmm0, 39H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 93H\n        dec     al\n        jz      endroundloop1\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0FH\n        vpshufd xmm4, xmm8, 39H\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0AAH\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 88H\n        vpshufd xmm8, xmm8, 78H\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 1EH\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     roundloop1\nendroundloop1:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop1\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+10H], xmm1\n        jmp     unwind\n\n_blake3_hash_many_avx2 ENDP\nblake3_hash_many_avx2 ENDP\n_TEXT ENDS\n\n_RDATA SEGMENT READONLY PAGE ALIAS(\".rdata\") 'CONST'\nALIGN   64\nADD0:\n        dd 0, 1, 2, 3, 4, 5, 6, 7\n\nADD1:\n        dd 8 dup (8)\n\nBLAKE3_IV_0:\n        dd 8 dup (6A09E667H)\n\nBLAKE3_IV_1:\n        dd 8 dup (0BB67AE85H)\n\nBLAKE3_IV_2:\n        dd 8 dup (3C6EF372H)\n\nBLAKE3_IV_3:\n        dd 8 dup (0A54FF53AH)\n\nBLAKE3_BLOCK_LEN:\n        dd 8 dup (64)\n\nROT16:\n        db 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13\n\nROT8:\n        db 1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12\n\nCMP_MSB_MASK:\n        dd 8 dup(80000000H)\n\nBLAKE3_IV:\n        dd 6A09E667H, 0BB67AE85H, 3C6EF372H, 0A54FF53AH\n\n_RDATA ENDS\nEND\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_avx512_x86-64_unix.S",
    "content": "#if defined(__ELF__) && defined(__linux__)\n.section .note.GNU-stack,\"\",%progbits\n#endif\n\n#if defined(__ELF__) && defined(__CET__) && defined(__has_include)\n#if __has_include(<cet.h>)\n#include <cet.h>\n#endif\n#endif\n\n#if !defined(_CET_ENDBR)\n#define _CET_ENDBR\n#endif\n\n.intel_syntax noprefix\n.global _blake3_hash_many_avx512\n.global blake3_hash_many_avx512\n.global blake3_compress_in_place_avx512\n.global _blake3_compress_in_place_avx512\n.global blake3_compress_xof_avx512\n.global _blake3_compress_xof_avx512\n\n#ifdef __APPLE__\n.text\n#else\n.section .text\n#endif\n.p2align  6\n_blake3_hash_many_avx512:\nblake3_hash_many_avx512:\n        _CET_ENDBR\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 144\n        and     rsp, 0xFFFFFFFFFFFFFFC0\n        neg     r9\n        kmovw   k1, r9d\n        vmovd   xmm0, r8d\n        vpbroadcastd ymm0, xmm0\n        shr     r8, 32\n        vmovd   xmm1, r8d\n        vpbroadcastd ymm1, xmm1\n        vmovdqa ymm4, ymm1\n        vmovdqa ymm5, ymm1\n        vpaddd  ymm2, ymm0, ymmword ptr [ADD0+rip]\n        vpaddd  ymm3, ymm0, ymmword ptr [ADD0+32+rip]\n        vpcmpltud k2, ymm2, ymm0\n        vpcmpltud k3, ymm3, ymm0\n        vpaddd  ymm4 {k2}, ymm4, dword ptr [ADD1+rip] {1to8}\n        vpaddd  ymm5 {k3}, ymm5, dword ptr [ADD1+rip] {1to8}\n        knotw   k2, k1\n        vmovdqa32 ymm2 {k2}, ymm0\n        vmovdqa32 ymm3 {k2}, ymm0\n        vmovdqa32 ymm4 {k2}, ymm1\n        vmovdqa32 ymm5 {k2}, ymm1\n        vmovdqa ymmword ptr [rsp], ymm2\n        vmovdqa ymmword ptr [rsp+0x1*0x20], ymm3\n        vmovdqa ymmword ptr [rsp+0x2*0x20], ymm4\n        vmovdqa ymmword ptr [rsp+0x3*0x20], ymm5\n        shl     rdx, 6\n        mov     qword ptr [rsp+0x80], rdx\n        cmp     rsi, 16\n        jc      3f\n2:\n        vpbroadcastd zmm0, dword ptr [rcx]\n        vpbroadcastd zmm1, dword ptr [rcx+0x1*0x4]\n        vpbroadcastd zmm2, dword ptr [rcx+0x2*0x4]\n        vpbroadcastd zmm3, dword ptr [rcx+0x3*0x4]\n        vpbroadcastd zmm4, dword ptr [rcx+0x4*0x4]\n        vpbroadcastd zmm5, dword ptr [rcx+0x5*0x4]\n        vpbroadcastd zmm6, dword ptr [rcx+0x6*0x4]\n        vpbroadcastd zmm7, dword ptr [rcx+0x7*0x4]\n        movzx   eax, byte ptr [rbp+0x38]\n        movzx   ebx, byte ptr [rbp+0x40]\n        or      eax, ebx\n        xor     edx, edx\n.p2align 5\n9:\n        movzx   ebx, byte ptr [rbp+0x48]\n        or      ebx, eax\n        add     rdx, 64\n        cmp     rdx, qword ptr [rsp+0x80]\n        cmove   eax, ebx\n        mov     dword ptr [rsp+0x88], eax\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        mov     r12, qword ptr [rdi+0x40]\n        mov     r13, qword ptr [rdi+0x48]\n        mov     r14, qword ptr [rdi+0x50]\n        mov     r15, qword ptr [rdi+0x58]\n        vmovdqu32 ymm16, ymmword ptr [rdx+r8-0x2*0x20]\n        vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-0x2*0x20], 0x01\n        vmovdqu32 ymm17, ymmword ptr [rdx+r9-0x2*0x20]\n        vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-0x2*0x20], 0x01\n        vpunpcklqdq zmm8, zmm16, zmm17\n        vpunpckhqdq zmm9, zmm16, zmm17\n        vmovdqu32 ymm18, ymmword ptr [rdx+r10-0x2*0x20]\n        vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-0x2*0x20], 0x01\n        vmovdqu32 ymm19, ymmword ptr [rdx+r11-0x2*0x20]\n        vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-0x2*0x20], 0x01\n        vpunpcklqdq zmm10, zmm18, zmm19\n        vpunpckhqdq zmm11, zmm18, zmm19\n        mov     r8, qword ptr [rdi+0x20]\n        mov     r9, qword ptr [rdi+0x28]\n        mov     r10, qword ptr [rdi+0x30]\n        mov     r11, qword ptr [rdi+0x38]\n        mov     r12, qword ptr [rdi+0x60]\n        mov     r13, qword ptr [rdi+0x68]\n        mov     r14, qword ptr [rdi+0x70]\n        mov     r15, qword ptr [rdi+0x78]\n        vmovdqu32 ymm16, ymmword ptr [rdx+r8-0x2*0x20]\n        vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-0x2*0x20], 0x01\n        vmovdqu32 ymm17, ymmword ptr [rdx+r9-0x2*0x20]\n        vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-0x2*0x20], 0x01\n        vpunpcklqdq zmm12, zmm16, zmm17\n        vpunpckhqdq zmm13, zmm16, zmm17\n        vmovdqu32 ymm18, ymmword ptr [rdx+r10-0x2*0x20]\n        vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-0x2*0x20], 0x01\n        vmovdqu32 ymm19, ymmword ptr [rdx+r11-0x2*0x20]\n        vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-0x2*0x20], 0x01\n        vpunpcklqdq zmm14, zmm18, zmm19\n        vpunpckhqdq zmm15, zmm18, zmm19\n        vmovdqa32 zmm27, zmmword ptr [INDEX0+rip]\n        vmovdqa32 zmm31, zmmword ptr [INDEX1+rip]\n        vshufps zmm16, zmm8, zmm10, 136\n        vshufps zmm17, zmm12, zmm14, 136\n        vmovdqa32 zmm20, zmm16\n        vpermt2d zmm16, zmm27, zmm17\n        vpermt2d zmm20, zmm31, zmm17\n        vshufps zmm17, zmm8, zmm10, 221\n        vshufps zmm30, zmm12, zmm14, 221\n        vmovdqa32 zmm21, zmm17\n        vpermt2d zmm17, zmm27, zmm30\n        vpermt2d zmm21, zmm31, zmm30\n        vshufps zmm18, zmm9, zmm11, 136\n        vshufps zmm8, zmm13, zmm15, 136\n        vmovdqa32 zmm22, zmm18\n        vpermt2d zmm18, zmm27, zmm8\n        vpermt2d zmm22, zmm31, zmm8\n        vshufps zmm19, zmm9, zmm11, 221\n        vshufps zmm8, zmm13, zmm15, 221\n        vmovdqa32 zmm23, zmm19\n        vpermt2d zmm19, zmm27, zmm8\n        vpermt2d zmm23, zmm31, zmm8\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        mov     r12, qword ptr [rdi+0x40]\n        mov     r13, qword ptr [rdi+0x48]\n        mov     r14, qword ptr [rdi+0x50]\n        mov     r15, qword ptr [rdi+0x58]\n        vmovdqu32 ymm24, ymmword ptr [r8+rdx-0x1*0x20]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-0x1*0x20], 0x01\n        vmovdqu32 ymm25, ymmword ptr [r9+rdx-0x1*0x20]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-0x1*0x20], 0x01\n        vpunpcklqdq zmm8, zmm24, zmm25\n        vpunpckhqdq zmm9, zmm24, zmm25\n        vmovdqu32 ymm24, ymmword ptr [r10+rdx-0x1*0x20]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-0x1*0x20], 0x01\n        vmovdqu32 ymm25, ymmword ptr [r11+rdx-0x1*0x20]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-0x1*0x20], 0x01\n        vpunpcklqdq zmm10, zmm24, zmm25\n        vpunpckhqdq zmm11, zmm24, zmm25\n        prefetcht0 [r8+rdx+0x80]\n        prefetcht0 [r12+rdx+0x80]\n        prefetcht0 [r9+rdx+0x80]\n        prefetcht0 [r13+rdx+0x80]\n        prefetcht0 [r10+rdx+0x80]\n        prefetcht0 [r14+rdx+0x80]\n        prefetcht0 [r11+rdx+0x80]\n        prefetcht0 [r15+rdx+0x80]\n        mov     r8, qword ptr [rdi+0x20]\n        mov     r9, qword ptr [rdi+0x28]\n        mov     r10, qword ptr [rdi+0x30]\n        mov     r11, qword ptr [rdi+0x38]\n        mov     r12, qword ptr [rdi+0x60]\n        mov     r13, qword ptr [rdi+0x68]\n        mov     r14, qword ptr [rdi+0x70]\n        mov     r15, qword ptr [rdi+0x78]\n        vmovdqu32 ymm24, ymmword ptr [r8+rdx-0x1*0x20]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-0x1*0x20], 0x01\n        vmovdqu32 ymm25, ymmword ptr [r9+rdx-0x1*0x20]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-0x1*0x20], 0x01\n        vpunpcklqdq zmm12, zmm24, zmm25\n        vpunpckhqdq zmm13, zmm24, zmm25\n        vmovdqu32 ymm24, ymmword ptr [r10+rdx-0x1*0x20]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-0x1*0x20], 0x01\n        vmovdqu32 ymm25, ymmword ptr [r11+rdx-0x1*0x20]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-0x1*0x20], 0x01\n        vpunpcklqdq zmm14, zmm24, zmm25\n        vpunpckhqdq zmm15, zmm24, zmm25\n        prefetcht0 [r8+rdx+0x80]\n        prefetcht0 [r12+rdx+0x80]\n        prefetcht0 [r9+rdx+0x80]\n        prefetcht0 [r13+rdx+0x80]\n        prefetcht0 [r10+rdx+0x80]\n        prefetcht0 [r14+rdx+0x80]\n        prefetcht0 [r11+rdx+0x80]\n        prefetcht0 [r15+rdx+0x80]\n        vshufps zmm24, zmm8, zmm10, 136\n        vshufps zmm30, zmm12, zmm14, 136\n        vmovdqa32 zmm28, zmm24\n        vpermt2d zmm24, zmm27, zmm30\n        vpermt2d zmm28, zmm31, zmm30\n        vshufps zmm25, zmm8, zmm10, 221\n        vshufps zmm30, zmm12, zmm14, 221\n        vmovdqa32 zmm29, zmm25\n        vpermt2d zmm25, zmm27, zmm30\n        vpermt2d zmm29, zmm31, zmm30\n        vshufps zmm26, zmm9, zmm11, 136\n        vshufps zmm8, zmm13, zmm15, 136\n        vmovdqa32 zmm30, zmm26\n        vpermt2d zmm26, zmm27, zmm8\n        vpermt2d zmm30, zmm31, zmm8\n        vshufps zmm8, zmm9, zmm11, 221\n        vshufps zmm10, zmm13, zmm15, 221\n        vpermi2d zmm27, zmm8, zmm10\n        vpermi2d zmm31, zmm8, zmm10\n        vpbroadcastd zmm8, dword ptr [BLAKE3_IV_0+rip]\n        vpbroadcastd zmm9, dword ptr [BLAKE3_IV_1+rip]\n        vpbroadcastd zmm10, dword ptr [BLAKE3_IV_2+rip]\n        vpbroadcastd zmm11, dword ptr [BLAKE3_IV_3+rip]\n        vmovdqa32 zmm12, zmmword ptr [rsp]\n        vmovdqa32 zmm13, zmmword ptr [rsp+0x1*0x40]\n        vpbroadcastd zmm14, dword ptr [BLAKE3_BLOCK_LEN+rip]\n        vpbroadcastd zmm15, dword ptr [rsp+0x22*0x4]\n        vpaddd  zmm0, zmm0, zmm16\n        vpaddd  zmm1, zmm1, zmm18\n        vpaddd  zmm2, zmm2, zmm20\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm17\n        vpaddd  zmm1, zmm1, zmm19\n        vpaddd  zmm2, zmm2, zmm21\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm24\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm28\n        vpaddd  zmm3, zmm3, zmm30\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm25\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm29\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm18\n        vpaddd  zmm1, zmm1, zmm19\n        vpaddd  zmm2, zmm2, zmm23\n        vpaddd  zmm3, zmm3, zmm20\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm22\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm16\n        vpaddd  zmm3, zmm3, zmm29\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm17\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm25\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm27\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm30\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm19\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm29\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm20\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm18\n        vpaddd  zmm3, zmm3, zmm30\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm22\n        vpaddd  zmm1, zmm1, zmm25\n        vpaddd  zmm2, zmm2, zmm27\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm21\n        vpaddd  zmm1, zmm1, zmm16\n        vpaddd  zmm2, zmm2, zmm31\n        vpaddd  zmm3, zmm3, zmm17\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm26\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm30\n        vpaddd  zmm3, zmm3, zmm29\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm23\n        vpaddd  zmm1, zmm1, zmm25\n        vpaddd  zmm2, zmm2, zmm19\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm20\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm21\n        vpaddd  zmm3, zmm3, zmm17\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm16\n        vpaddd  zmm1, zmm1, zmm18\n        vpaddd  zmm2, zmm2, zmm24\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm28\n        vpaddd  zmm1, zmm1, zmm25\n        vpaddd  zmm2, zmm2, zmm31\n        vpaddd  zmm3, zmm3, zmm30\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm29\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm26\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm23\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm16\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm18\n        vpaddd  zmm1, zmm1, zmm19\n        vpaddd  zmm2, zmm2, zmm17\n        vpaddd  zmm3, zmm3, zmm20\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm25\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm24\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm30\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm28\n        vpaddd  zmm3, zmm3, zmm17\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm29\n        vpaddd  zmm1, zmm1, zmm16\n        vpaddd  zmm2, zmm2, zmm18\n        vpaddd  zmm3, zmm3, zmm20\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm19\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm22\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm27\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm17\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm31\n        vpaddd  zmm1, zmm1, zmm16\n        vpaddd  zmm2, zmm2, zmm25\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm30\n        vpaddd  zmm1, zmm1, zmm18\n        vpaddd  zmm2, zmm2, zmm19\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm26\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm20\n        vpaddd  zmm3, zmm3, zmm29\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpxord  zmm0, zmm0, zmm8\n        vpxord  zmm1, zmm1, zmm9\n        vpxord  zmm2, zmm2, zmm10\n        vpxord  zmm3, zmm3, zmm11\n        vpxord  zmm4, zmm4, zmm12\n        vpxord  zmm5, zmm5, zmm13\n        vpxord  zmm6, zmm6, zmm14\n        vpxord  zmm7, zmm7, zmm15\n        movzx   eax, byte ptr [rbp+0x38]\n        jne     9b\n        mov     rbx, qword ptr [rbp+0x50]\n        vpunpckldq zmm16, zmm0, zmm1\n        vpunpckhdq zmm17, zmm0, zmm1\n        vpunpckldq zmm18, zmm2, zmm3\n        vpunpckhdq zmm19, zmm2, zmm3\n        vpunpckldq zmm20, zmm4, zmm5\n        vpunpckhdq zmm21, zmm4, zmm5\n        vpunpckldq zmm22, zmm6, zmm7\n        vpunpckhdq zmm23, zmm6, zmm7\n        vpunpcklqdq zmm0, zmm16, zmm18\n        vpunpckhqdq zmm1, zmm16, zmm18\n        vpunpcklqdq zmm2, zmm17, zmm19\n        vpunpckhqdq zmm3, zmm17, zmm19\n        vpunpcklqdq zmm4, zmm20, zmm22\n        vpunpckhqdq zmm5, zmm20, zmm22\n        vpunpcklqdq zmm6, zmm21, zmm23\n        vpunpckhqdq zmm7, zmm21, zmm23\n        vshufi32x4 zmm16, zmm0, zmm4, 0x88\n        vshufi32x4 zmm17, zmm1, zmm5, 0x88\n        vshufi32x4 zmm18, zmm2, zmm6, 0x88\n        vshufi32x4 zmm19, zmm3, zmm7, 0x88\n        vshufi32x4 zmm20, zmm0, zmm4, 0xDD\n        vshufi32x4 zmm21, zmm1, zmm5, 0xDD\n        vshufi32x4 zmm22, zmm2, zmm6, 0xDD\n        vshufi32x4 zmm23, zmm3, zmm7, 0xDD\n        vshufi32x4 zmm0, zmm16, zmm17, 0x88\n        vshufi32x4 zmm1, zmm18, zmm19, 0x88\n        vshufi32x4 zmm2, zmm20, zmm21, 0x88\n        vshufi32x4 zmm3, zmm22, zmm23, 0x88\n        vshufi32x4 zmm4, zmm16, zmm17, 0xDD\n        vshufi32x4 zmm5, zmm18, zmm19, 0xDD\n        vshufi32x4 zmm6, zmm20, zmm21, 0xDD\n        vshufi32x4 zmm7, zmm22, zmm23, 0xDD\n        vmovdqu32 zmmword ptr [rbx], zmm0\n        vmovdqu32 zmmword ptr [rbx+0x1*0x40], zmm1\n        vmovdqu32 zmmword ptr [rbx+0x2*0x40], zmm2\n        vmovdqu32 zmmword ptr [rbx+0x3*0x40], zmm3\n        vmovdqu32 zmmword ptr [rbx+0x4*0x40], zmm4\n        vmovdqu32 zmmword ptr [rbx+0x5*0x40], zmm5\n        vmovdqu32 zmmword ptr [rbx+0x6*0x40], zmm6\n        vmovdqu32 zmmword ptr [rbx+0x7*0x40], zmm7\n        vmovdqa32 zmm0, zmmword ptr [rsp]\n        vmovdqa32 zmm1, zmmword ptr [rsp+0x1*0x40]\n        vmovdqa32 zmm2, zmm0\n        vpaddd  zmm2{k1}, zmm0, dword ptr [ADD16+rip] {1to16}\n        vpcmpltud k2, zmm2, zmm0\n        vpaddd  zmm1 {k2}, zmm1, dword ptr [ADD1+rip] {1to16}\n        vmovdqa32 zmmword ptr [rsp], zmm2\n        vmovdqa32 zmmword ptr [rsp+0x1*0x40], zmm1\n        add     rdi, 128\n        add     rbx, 512\n        mov     qword ptr [rbp+0x50], rbx\n        sub     rsi, 16\n        cmp     rsi, 16\n        jnc     2b\n        test    rsi, rsi\n        jnz     3f\n4:\n        vzeroupper\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\n.p2align 6\n3:\n        test    esi, 0x8\n        je      3f\n        vpbroadcastd ymm0, dword ptr [rcx]\n        vpbroadcastd ymm1, dword ptr [rcx+0x4]\n        vpbroadcastd ymm2, dword ptr [rcx+0x8]\n        vpbroadcastd ymm3, dword ptr [rcx+0xC]\n        vpbroadcastd ymm4, dword ptr [rcx+0x10]\n        vpbroadcastd ymm5, dword ptr [rcx+0x14]\n        vpbroadcastd ymm6, dword ptr [rcx+0x18]\n        vpbroadcastd ymm7, dword ptr [rcx+0x1C]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        mov     r12, qword ptr [rdi+0x20]\n        mov     r13, qword ptr [rdi+0x28]\n        mov     r14, qword ptr [rdi+0x30]\n        mov     r15, qword ptr [rdi+0x38]\n        movzx   eax, byte ptr [rbp+0x38]\n        movzx   ebx, byte ptr [rbp+0x40]\n        or      eax, ebx\n        xor     edx, edx\n2:\n        movzx   ebx, byte ptr [rbp+0x48]\n        or      ebx, eax\n        add     rdx, 64\n        cmp     rdx, qword ptr [rsp+0x80]\n        cmove   eax, ebx\n        mov     dword ptr [rsp+0x88], eax\n        vmovups xmm8, xmmword ptr [r8+rdx-0x40]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x40], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x40]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x40], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x40]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x40], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x40]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x40], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm16, ymm12, ymm14, 136\n        vshufps ymm17, ymm12, ymm14, 221\n        vshufps ymm18, ymm13, ymm15, 136\n        vshufps ymm19, ymm13, ymm15, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-0x30]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x30], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x30]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x30], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x30]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x30], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x30]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x30], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm20, ymm12, ymm14, 136\n        vshufps ymm21, ymm12, ymm14, 221\n        vshufps ymm22, ymm13, ymm15, 136\n        vshufps ymm23, ymm13, ymm15, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-0x20]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x20], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x20]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x20], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x20]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x20], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x20]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x20], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm24, ymm12, ymm14, 136\n        vshufps ymm25, ymm12, ymm14, 221\n        vshufps ymm26, ymm13, ymm15, 136\n        vshufps ymm27, ymm13, ymm15, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-0x10]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-0x10], 0x01\n        vmovups xmm9, xmmword ptr [r9+rdx-0x10]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-0x10], 0x01\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-0x10]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-0x10], 0x01\n        vmovups xmm11, xmmword ptr [r11+rdx-0x10]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-0x10], 0x01\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm28, ymm12, ymm14, 136\n        vshufps ymm29, ymm12, ymm14, 221\n        vshufps ymm30, ymm13, ymm15, 136\n        vshufps ymm31, ymm13, ymm15, 221\n        vpbroadcastd ymm8, dword ptr [BLAKE3_IV_0+rip]\n        vpbroadcastd ymm9, dword ptr [BLAKE3_IV_1+rip]\n        vpbroadcastd ymm10, dword ptr [BLAKE3_IV_2+rip]\n        vpbroadcastd ymm11, dword ptr [BLAKE3_IV_3+rip]\n        vmovdqa ymm12, ymmword ptr [rsp]\n        vmovdqa ymm13, ymmword ptr [rsp+0x40]\n        vpbroadcastd ymm14, dword ptr [BLAKE3_BLOCK_LEN+rip]\n        vpbroadcastd ymm15, dword ptr [rsp+0x88]\n        vpaddd  ymm0, ymm0, ymm16\n        vpaddd  ymm1, ymm1, ymm18\n        vpaddd  ymm2, ymm2, ymm20\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm17\n        vpaddd  ymm1, ymm1, ymm19\n        vpaddd  ymm2, ymm2, ymm21\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm24\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm28\n        vpaddd  ymm3, ymm3, ymm30\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm25\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm29\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm18\n        vpaddd  ymm1, ymm1, ymm19\n        vpaddd  ymm2, ymm2, ymm23\n        vpaddd  ymm3, ymm3, ymm20\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm22\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm16\n        vpaddd  ymm3, ymm3, ymm29\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm17\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm25\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm27\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm30\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm19\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm29\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm20\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm18\n        vpaddd  ymm3, ymm3, ymm30\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm22\n        vpaddd  ymm1, ymm1, ymm25\n        vpaddd  ymm2, ymm2, ymm27\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm21\n        vpaddd  ymm1, ymm1, ymm16\n        vpaddd  ymm2, ymm2, ymm31\n        vpaddd  ymm3, ymm3, ymm17\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm26\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm30\n        vpaddd  ymm3, ymm3, ymm29\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm23\n        vpaddd  ymm1, ymm1, ymm25\n        vpaddd  ymm2, ymm2, ymm19\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm20\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm21\n        vpaddd  ymm3, ymm3, ymm17\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm16\n        vpaddd  ymm1, ymm1, ymm18\n        vpaddd  ymm2, ymm2, ymm24\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm28\n        vpaddd  ymm1, ymm1, ymm25\n        vpaddd  ymm2, ymm2, ymm31\n        vpaddd  ymm3, ymm3, ymm30\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm29\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm26\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm23\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm16\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm18\n        vpaddd  ymm1, ymm1, ymm19\n        vpaddd  ymm2, ymm2, ymm17\n        vpaddd  ymm3, ymm3, ymm20\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm25\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm24\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm30\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm28\n        vpaddd  ymm3, ymm3, ymm17\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm29\n        vpaddd  ymm1, ymm1, ymm16\n        vpaddd  ymm2, ymm2, ymm18\n        vpaddd  ymm3, ymm3, ymm20\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm19\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm22\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm27\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm17\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm31\n        vpaddd  ymm1, ymm1, ymm16\n        vpaddd  ymm2, ymm2, ymm25\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm30\n        vpaddd  ymm1, ymm1, ymm18\n        vpaddd  ymm2, ymm2, ymm19\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm26\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm20\n        vpaddd  ymm3, ymm3, ymm29\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpxor   ymm0, ymm0, ymm8\n        vpxor   ymm1, ymm1, ymm9\n        vpxor   ymm2, ymm2, ymm10\n        vpxor   ymm3, ymm3, ymm11\n        vpxor   ymm4, ymm4, ymm12\n        vpxor   ymm5, ymm5, ymm13\n        vpxor   ymm6, ymm6, ymm14\n        vpxor   ymm7, ymm7, ymm15\n        movzx   eax, byte ptr [rbp+0x38]\n        jne     2b\n        mov     rbx, qword ptr [rbp+0x50]\n        vunpcklps ymm8, ymm0, ymm1\n        vunpcklps ymm9, ymm2, ymm3\n        vunpckhps ymm10, ymm0, ymm1\n        vunpcklps ymm11, ymm4, ymm5\n        vunpcklps ymm0, ymm6, ymm7\n        vshufps ymm12, ymm8, ymm9, 78\n        vblendps ymm1, ymm8, ymm12, 0xCC\n        vshufps ymm8, ymm11, ymm0, 78\n        vunpckhps ymm13, ymm2, ymm3\n        vblendps ymm2, ymm11, ymm8, 0xCC\n        vblendps ymm3, ymm12, ymm9, 0xCC\n        vperm2f128 ymm12, ymm1, ymm2, 0x20\n        vmovups ymmword ptr [rbx], ymm12\n        vunpckhps ymm14, ymm4, ymm5\n        vblendps ymm4, ymm8, ymm0, 0xCC\n        vunpckhps ymm15, ymm6, ymm7\n        vperm2f128 ymm7, ymm3, ymm4, 0x20\n        vmovups ymmword ptr [rbx+0x20], ymm7\n        vshufps ymm5, ymm10, ymm13, 78\n        vblendps ymm6, ymm5, ymm13, 0xCC\n        vshufps ymm13, ymm14, ymm15, 78\n        vblendps ymm10, ymm10, ymm5, 0xCC\n        vblendps ymm14, ymm14, ymm13, 0xCC\n        vperm2f128 ymm8, ymm10, ymm14, 0x20\n        vmovups ymmword ptr [rbx+0x40], ymm8\n        vblendps ymm15, ymm13, ymm15, 0xCC\n        vperm2f128 ymm13, ymm6, ymm15, 0x20\n        vmovups ymmword ptr [rbx+0x60], ymm13\n        vperm2f128 ymm9, ymm1, ymm2, 0x31\n        vperm2f128 ymm11, ymm3, ymm4, 0x31\n        vmovups ymmword ptr [rbx+0x80], ymm9\n        vperm2f128 ymm14, ymm10, ymm14, 0x31\n        vperm2f128 ymm15, ymm6, ymm15, 0x31\n        vmovups ymmword ptr [rbx+0xA0], ymm11\n        vmovups ymmword ptr [rbx+0xC0], ymm14\n        vmovups ymmword ptr [rbx+0xE0], ymm15\n        vmovdqa ymm0, ymmword ptr [rsp]\n        vmovdqa ymm2, ymmword ptr [rsp+0x2*0x20]\n        vmovdqa32 ymm0 {k1}, ymmword ptr [rsp+0x1*0x20]\n        vmovdqa32 ymm2 {k1}, ymmword ptr [rsp+0x3*0x20]\n        vmovdqa ymmword ptr [rsp], ymm0\n        vmovdqa ymmword ptr [rsp+0x2*0x20], ymm2\n        add     rbx, 256\n        mov     qword ptr [rbp+0x50], rbx\n        add     rdi, 64\n        sub     rsi, 8\n3:\n        mov     rbx, qword ptr [rbp+0x50]\n        mov     r15, qword ptr [rsp+0x80]\n        movzx   r13, byte ptr [rbp+0x38]\n        movzx   r12, byte ptr [rbp+0x48]\n        test    esi, 0x4\n        je      3f\n        vbroadcasti32x4 zmm0, xmmword ptr [rcx]\n        vbroadcasti32x4 zmm1, xmmword ptr [rcx+0x1*0x10]\n        vmovdqa xmm12, xmmword ptr [rsp]\n        vmovdqa xmm13, xmmword ptr [rsp+0x4*0x10]\n        vpunpckldq xmm14, xmm12, xmm13\n        vpunpckhdq xmm15, xmm12, xmm13\n        vpermq  ymm14, ymm14, 0xDC\n        vpermq  ymm15, ymm15, 0xDC\n        vpbroadcastd zmm12, dword ptr [BLAKE3_BLOCK_LEN+rip]\n        vinserti64x4 zmm13, zmm14, ymm15, 0x01\n        mov     eax, 17476\n        kmovw   k2, eax\n        vpblendmd zmm13 {k2}, zmm13, zmm12\n        vbroadcasti32x4 zmm15, xmmword ptr [BLAKE3_IV+rip]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        mov     eax, 43690\n        kmovw   k3, eax\n        mov     eax, 34952\n        kmovw   k4, eax\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n.p2align 5\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+0x88], eax\n        vmovdqa32 zmm2, zmm15\n        vpbroadcastd zmm8, dword ptr [rsp+0x22*0x4]\n        vpblendmd zmm3 {k4}, zmm13, zmm8\n        vmovups zmm8, zmmword ptr [r8+rdx-0x1*0x40]\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-0x4*0x10], 0x01\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-0x4*0x10], 0x02\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-0x4*0x10], 0x03\n        vmovups zmm9, zmmword ptr [r8+rdx-0x30]\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-0x3*0x10], 0x01\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-0x3*0x10], 0x02\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-0x3*0x10], 0x03\n        vshufps zmm4, zmm8, zmm9, 136\n        vshufps zmm5, zmm8, zmm9, 221\n        vmovups zmm8, zmmword ptr [r8+rdx-0x20]\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-0x2*0x10], 0x01\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-0x2*0x10], 0x02\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-0x2*0x10], 0x03\n        vmovups zmm9, zmmword ptr [r8+rdx-0x10]\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-0x1*0x10], 0x01\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-0x1*0x10], 0x02\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-0x1*0x10], 0x03\n        vshufps zmm6, zmm8, zmm9, 136\n        vshufps zmm7, zmm8, zmm9, 221\n        vpshufd zmm6, zmm6, 0x93\n        vpshufd zmm7, zmm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 16\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 12\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 8\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 7\n        vpshufd zmm0, zmm0, 0x93\n        vpshufd zmm3, zmm3, 0x4E\n        vpshufd zmm2, zmm2, 0x39\n        vpaddd  zmm0, zmm0, zmm6\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 16\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 12\n        vpaddd  zmm0, zmm0, zmm7\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 8\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 7\n        vpshufd zmm0, zmm0, 0x39\n        vpshufd zmm3, zmm3, 0x4E\n        vpshufd zmm2, zmm2, 0x93\n        dec     al\n        jz      9f\n        vshufps zmm8, zmm4, zmm5, 214\n        vpshufd zmm9, zmm4, 0x0F\n        vpshufd zmm4, zmm8, 0x39\n        vshufps zmm8, zmm6, zmm7, 250\n        vpblendmd zmm9 {k3}, zmm9, zmm8\n        vpunpcklqdq zmm8, zmm7, zmm5\n        vpblendmd zmm8 {k4}, zmm8, zmm6\n        vpshufd zmm8, zmm8, 0x78\n        vpunpckhdq zmm5, zmm5, zmm7\n        vpunpckldq zmm6, zmm6, zmm5\n        vpshufd zmm7, zmm6, 0x1E\n        vmovdqa32 zmm5, zmm9\n        vmovdqa32 zmm6, zmm8\n        jmp     9b\n9:\n        vpxord  zmm0, zmm0, zmm2\n        vpxord  zmm1, zmm1, zmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+0x10], xmm1\n        vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01\n        vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01\n        vextracti32x4 xmmword ptr [rbx+0x4*0x10], zmm0, 0x02\n        vextracti32x4 xmmword ptr [rbx+0x5*0x10], zmm1, 0x02\n        vextracti32x4 xmmword ptr [rbx+0x6*0x10], zmm0, 0x03\n        vextracti32x4 xmmword ptr [rbx+0x7*0x10], zmm1, 0x03\n        vmovdqa xmm0, xmmword ptr [rsp]\n        vmovdqa xmm2, xmmword ptr [rsp+0x40]\n        vmovdqa32 xmm0 {k1}, xmmword ptr [rsp+0x1*0x10]\n        vmovdqa32 xmm2 {k1}, xmmword ptr [rsp+0x5*0x10]\n        vmovdqa xmmword ptr [rsp], xmm0\n        vmovdqa xmmword ptr [rsp+0x40], xmm2\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\n3:\n        test    esi, 0x2\n        je      3f\n        vbroadcasti128 ymm0, xmmword ptr [rcx]\n        vbroadcasti128 ymm1, xmmword ptr [rcx+0x10]\n        vmovd   xmm13, dword ptr [rsp]\n        vpinsrd xmm13, xmm13, dword ptr [rsp+0x40], 1\n        vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        vmovd   xmm14, dword ptr [rsp+0x4]\n        vpinsrd xmm14, xmm14, dword ptr [rsp+0x44], 1\n        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        vinserti128 ymm13, ymm13, xmm14, 0x01\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n.p2align 5\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+0x88], eax\n        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV+rip]\n        vpbroadcastd ymm8, dword ptr [rsp+0x88]\n        vpblendd ymm3, ymm13, ymm8, 0x88\n        vmovups ymm8, ymmword ptr [r8+rdx-0x40]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x40], 0x01\n        vmovups ymm9, ymmword ptr [r8+rdx-0x30]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x30], 0x01\n        vshufps ymm4, ymm8, ymm9, 136\n        vshufps ymm5, ymm8, ymm9, 221\n        vmovups ymm8, ymmword ptr [r8+rdx-0x20]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-0x20], 0x01\n        vmovups ymm9, ymmword ptr [r8+rdx-0x10]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-0x10], 0x01\n        vshufps ymm6, ymm8, ymm9, 136\n        vshufps ymm7, ymm8, ymm9, 221\n        vpshufd ymm6, ymm6, 0x93\n        vpshufd ymm7, ymm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 16\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 12\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 8\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 7\n        vpshufd ymm0, ymm0, 0x93\n        vpshufd ymm3, ymm3, 0x4E\n        vpshufd ymm2, ymm2, 0x39\n        vpaddd  ymm0, ymm0, ymm6\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 16\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 12\n        vpaddd  ymm0, ymm0, ymm7\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 8\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 7\n        vpshufd ymm0, ymm0, 0x39\n        vpshufd ymm3, ymm3, 0x4E\n        vpshufd ymm2, ymm2, 0x93\n        dec     al\n        jz      9f\n        vshufps ymm8, ymm4, ymm5, 214\n        vpshufd ymm9, ymm4, 0x0F\n        vpshufd ymm4, ymm8, 0x39\n        vshufps ymm8, ymm6, ymm7, 250\n        vpblendd ymm9, ymm9, ymm8, 0xAA\n        vpunpcklqdq ymm8, ymm7, ymm5\n        vpblendd ymm8, ymm8, ymm6, 0x88\n        vpshufd ymm8, ymm8, 0x78\n        vpunpckhdq ymm5, ymm5, ymm7\n        vpunpckldq ymm6, ymm6, ymm5\n        vpshufd ymm7, ymm6, 0x1E\n        vmovdqa ymm5, ymm9\n        vmovdqa ymm6, ymm8\n        jmp     9b\n9:\n        vpxor   ymm0, ymm0, ymm2\n        vpxor   ymm1, ymm1, ymm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+0x10], xmm1\n        vextracti128 xmmword ptr [rbx+0x20], ymm0, 0x01\n        vextracti128 xmmword ptr [rbx+0x30], ymm1, 0x01\n        vmovdqa xmm0, xmmword ptr [rsp]\n        vmovdqa xmm2, xmmword ptr [rsp+0x4*0x10]\n        vmovdqu32 xmm0 {k1}, xmmword ptr [rsp+0x8]\n        vmovdqu32 xmm2 {k1}, xmmword ptr [rsp+0x48]\n        vmovdqa xmmword ptr [rsp], xmm0\n        vmovdqa xmmword ptr [rsp+0x4*0x10], xmm2\n        add     rbx, 64\n        add     rdi, 16\n        sub     rsi, 2\n3:\n        test    esi, 0x1\n        je      4b\n        vmovdqu xmm0, xmmword ptr [rcx]\n        vmovdqu xmm1, xmmword ptr [rcx+0x10]\n        vmovd   xmm14, dword ptr [rsp]\n        vpinsrd xmm14, xmm14, dword ptr [rsp+0x40], 1\n        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        vmovdqa xmm15, xmmword ptr [BLAKE3_IV+rip]\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n.p2align 5\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        vpinsrd xmm3, xmm14, eax, 3\n        vmovdqa xmm2, xmm15\n        vmovups xmm8, xmmword ptr [r8+rdx-0x40]\n        vmovups xmm9, xmmword ptr [r8+rdx-0x30]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-0x20]\n        vmovups xmm9, xmmword ptr [r8+rdx-0x10]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 0x93\n        vpshufd xmm7, xmm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 0x93\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x39\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 0x39\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0x0F\n        vpshufd xmm4, xmm8, 0x39\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0xAA\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 0x88\n        vpshufd xmm8, xmm8, 0x78\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 0x1E\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     9b\n9:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+0x10], xmm1\n        jmp     4b\n.p2align 6\n_blake3_compress_in_place_avx512:\nblake3_compress_in_place_avx512:\n        _CET_ENDBR\n        vmovdqu xmm0, xmmword ptr [rdi]\n        vmovdqu xmm1, xmmword ptr [rdi+0x10]\n        movzx   eax, r8b\n        movzx   edx, dl\n        shl     rax, 32\n        add     rdx, rax\n        vmovq   xmm3, rcx\n        vmovq   xmm4, rdx\n        vpunpcklqdq xmm3, xmm3, xmm4\n        vmovaps xmm2, xmmword ptr [BLAKE3_IV+rip]\n        vmovups xmm8, xmmword ptr [rsi]\n        vmovups xmm9, xmmword ptr [rsi+0x10]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [rsi+0x20]\n        vmovups xmm9, xmmword ptr [rsi+0x30]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 0x93\n        vpshufd xmm7, xmm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 0x93\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x39\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 0x39\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0x0F\n        vpshufd xmm4, xmm8, 0x39\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0xAA\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 0x88\n        vpshufd xmm8, xmm8, 0x78\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 0x1E\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     9b\n9:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        vmovdqu xmmword ptr [rdi], xmm0\n        vmovdqu xmmword ptr [rdi+0x10], xmm1\n        ret\n\n.p2align 6\n_blake3_compress_xof_avx512:\nblake3_compress_xof_avx512:\n        _CET_ENDBR\n        vmovdqu xmm0, xmmword ptr [rdi]\n        vmovdqu xmm1, xmmword ptr [rdi+0x10]\n        movzx   eax, r8b\n        movzx   edx, dl\n        shl     rax, 32\n        add     rdx, rax\n        vmovq   xmm3, rcx\n        vmovq   xmm4, rdx\n        vpunpcklqdq xmm3, xmm3, xmm4\n        vmovaps xmm2, xmmword ptr [BLAKE3_IV+rip]\n        vmovups xmm8, xmmword ptr [rsi]\n        vmovups xmm9, xmmword ptr [rsi+0x10]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [rsi+0x20]\n        vmovups xmm9, xmmword ptr [rsi+0x30]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 0x93\n        vpshufd xmm7, xmm7, 0x93\n        mov     al, 7\n9:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 0x93\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x39\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 0x39\n        vpshufd xmm3, xmm3, 0x4E\n        vpshufd xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0x0F\n        vpshufd xmm4, xmm8, 0x39\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0xAA\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 0x88\n        vpshufd xmm8, xmm8, 0x78\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 0x1E\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     9b\n9:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        vpxor   xmm2, xmm2, [rdi]\n        vpxor   xmm3, xmm3, [rdi+0x10]\n        vmovdqu xmmword ptr [r9], xmm0\n        vmovdqu xmmword ptr [r9+0x10], xmm1\n        vmovdqu xmmword ptr [r9+0x20], xmm2\n        vmovdqu xmmword ptr [r9+0x30], xmm3\n        ret\n\n#ifdef __APPLE__\n.static_data\n#else\n.section .rodata\n#endif\n.p2align  6\nINDEX0:\n        .long    0,  1,  2,  3, 16, 17, 18, 19\n        .long    8,  9, 10, 11, 24, 25, 26, 27\nINDEX1:\n        .long    4,  5,  6,  7, 20, 21, 22, 23\n        .long   12, 13, 14, 15, 28, 29, 30, 31\nADD0:\n        .long    0,  1,  2,  3,  4,  5,  6,  7\n        .long    8,  9, 10, 11, 12, 13, 14, 15\nADD1:   .long    1\n\nADD16:  .long   16\nBLAKE3_BLOCK_LEN:\n        .long   64\n.p2align 6\nBLAKE3_IV:\nBLAKE3_IV_0:\n        .long   0x6A09E667\nBLAKE3_IV_1:\n        .long   0xBB67AE85\nBLAKE3_IV_2:\n        .long   0x3C6EF372\nBLAKE3_IV_3:\n        .long   0xA54FF53A\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_avx512_x86-64_windows_msvc.asm",
    "content": "public _blake3_hash_many_avx512\npublic blake3_hash_many_avx512\npublic blake3_compress_in_place_avx512\npublic _blake3_compress_in_place_avx512\npublic blake3_compress_xof_avx512\npublic _blake3_compress_xof_avx512\n\n_TEXT   SEGMENT ALIGN(16) 'CODE'\n\nALIGN   16\nblake3_hash_many_avx512 PROC\n_blake3_hash_many_avx512 PROC\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rdi\n        push    rsi\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 304\n        and     rsp, 0FFFFFFFFFFFFFFC0H\n        vmovdqa xmmword ptr [rsp+90H], xmm6\n        vmovdqa xmmword ptr [rsp+0A0H], xmm7\n        vmovdqa xmmword ptr [rsp+0B0H], xmm8\n        vmovdqa xmmword ptr [rsp+0C0H], xmm9\n        vmovdqa xmmword ptr [rsp+0D0H], xmm10\n        vmovdqa xmmword ptr [rsp+0E0H], xmm11\n        vmovdqa xmmword ptr [rsp+0F0H], xmm12\n        vmovdqa xmmword ptr [rsp+100H], xmm13\n        vmovdqa xmmword ptr [rsp+110H], xmm14\n        vmovdqa xmmword ptr [rsp+120H], xmm15\n        mov     rdi, rcx\n        mov     rsi, rdx\n        mov     rdx, r8\n        mov     rcx, r9\n        mov     r8, qword ptr [rbp+68H]\n        movzx   r9, byte ptr [rbp+70H]\n        neg     r9\n        kmovw   k1, r9d\n        vmovd   xmm0, r8d\n        vpbroadcastd ymm0, xmm0\n        shr     r8, 32\n        vmovd   xmm1, r8d\n        vpbroadcastd ymm1, xmm1\n        vmovdqa ymm4, ymm1\n        vmovdqa ymm5, ymm1\n        vpaddd  ymm2, ymm0, ymmword ptr [ADD0]\n        vpaddd  ymm3, ymm0, ymmword ptr [ADD0+32]\n        vpcmpud k2, ymm2, ymm0, 1\n        vpcmpud k3, ymm3, ymm0, 1\n        ; XXX: ml64.exe does not currently understand the syntax. We use a workaround.\n        vpbroadcastd ymm6, dword ptr [ADD1]\n        vpaddd  ymm4 {k2}, ymm4, ymm6\n        vpaddd  ymm5 {k3}, ymm5, ymm6\n        ; vpaddd  ymm4 {k2}, ymm4, dword ptr [ADD1] {1to8}\n        ; vpaddd  ymm5 {k3}, ymm5, dword ptr [ADD1] {1to8}\n        knotw   k2, k1\n        vmovdqa32 ymm2 {k2}, ymm0\n        vmovdqa32 ymm3 {k2}, ymm0\n        vmovdqa32 ymm4 {k2}, ymm1\n        vmovdqa32 ymm5 {k2}, ymm1\n        vmovdqa ymmword ptr [rsp], ymm2\n        vmovdqa ymmword ptr [rsp+20H], ymm3\n        vmovdqa ymmword ptr [rsp+40H], ymm4\n        vmovdqa ymmword ptr [rsp+60H], ymm5\n        shl     rdx, 6\n        mov     qword ptr [rsp+80H], rdx\n        cmp     rsi, 16\n        jc      final15blocks\nouterloop16:\n        vpbroadcastd zmm0, dword ptr [rcx]\n        vpbroadcastd zmm1, dword ptr [rcx+1H*4H]\n        vpbroadcastd zmm2, dword ptr [rcx+2H*4H]\n        vpbroadcastd zmm3, dword ptr [rcx+3H*4H]\n        vpbroadcastd zmm4, dword ptr [rcx+4H*4H]\n        vpbroadcastd zmm5, dword ptr [rcx+5H*4H]\n        vpbroadcastd zmm6, dword ptr [rcx+6H*4H]\n        vpbroadcastd zmm7, dword ptr [rcx+7H*4H]\n        movzx   eax, byte ptr [rbp+78H]\n        movzx   ebx, byte ptr [rbp+80H]\n        or      eax, ebx\n        xor     edx, edx\nALIGN   16\ninnerloop16:\n        movzx   ebx, byte ptr [rbp+88H]\n        or      ebx, eax\n        add     rdx, 64\n        cmp     rdx, qword ptr [rsp+80H]\n        cmove   eax, ebx\n        mov     dword ptr [rsp+88H], eax\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        mov     r12, qword ptr [rdi+40H]\n        mov     r13, qword ptr [rdi+48H]\n        mov     r14, qword ptr [rdi+50H]\n        mov     r15, qword ptr [rdi+58H]\n        vmovdqu32 ymm16, ymmword ptr [rdx+r8-2H*20H]\n        vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-2H*20H], 01H\n        vmovdqu32 ymm17, ymmword ptr [rdx+r9-2H*20H]\n        vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-2H*20H], 01H\n        vpunpcklqdq zmm8, zmm16, zmm17\n        vpunpckhqdq zmm9, zmm16, zmm17\n        vmovdqu32 ymm18, ymmword ptr [rdx+r10-2H*20H]\n        vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-2H*20H], 01H\n        vmovdqu32 ymm19, ymmword ptr [rdx+r11-2H*20H]\n        vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-2H*20H], 01H\n        vpunpcklqdq zmm10, zmm18, zmm19\n        vpunpckhqdq zmm11, zmm18, zmm19\n        mov     r8, qword ptr [rdi+20H]\n        mov     r9, qword ptr [rdi+28H]\n        mov     r10, qword ptr [rdi+30H]\n        mov     r11, qword ptr [rdi+38H]\n        mov     r12, qword ptr [rdi+60H]\n        mov     r13, qword ptr [rdi+68H]\n        mov     r14, qword ptr [rdi+70H]\n        mov     r15, qword ptr [rdi+78H]\n        vmovdqu32 ymm16, ymmword ptr [rdx+r8-2H*20H]\n        vinserti64x4 zmm16, zmm16, ymmword ptr [rdx+r12-2H*20H], 01H\n        vmovdqu32 ymm17, ymmword ptr [rdx+r9-2H*20H]\n        vinserti64x4 zmm17, zmm17, ymmword ptr [rdx+r13-2H*20H], 01H\n        vpunpcklqdq zmm12, zmm16, zmm17\n        vpunpckhqdq zmm13, zmm16, zmm17\n        vmovdqu32 ymm18, ymmword ptr [rdx+r10-2H*20H]\n        vinserti64x4 zmm18, zmm18, ymmword ptr [rdx+r14-2H*20H], 01H\n        vmovdqu32 ymm19, ymmword ptr [rdx+r11-2H*20H]\n        vinserti64x4 zmm19, zmm19, ymmword ptr [rdx+r15-2H*20H], 01H\n        vpunpcklqdq zmm14, zmm18, zmm19\n        vpunpckhqdq zmm15, zmm18, zmm19\n        vmovdqa32 zmm27, zmmword ptr [INDEX0]\n        vmovdqa32 zmm31, zmmword ptr [INDEX1]\n        vshufps zmm16, zmm8, zmm10, 136\n        vshufps zmm17, zmm12, zmm14, 136\n        vmovdqa32 zmm20, zmm16\n        vpermt2d zmm16, zmm27, zmm17\n        vpermt2d zmm20, zmm31, zmm17\n        vshufps zmm17, zmm8, zmm10, 221\n        vshufps zmm30, zmm12, zmm14, 221\n        vmovdqa32 zmm21, zmm17\n        vpermt2d zmm17, zmm27, zmm30\n        vpermt2d zmm21, zmm31, zmm30\n        vshufps zmm18, zmm9, zmm11, 136\n        vshufps zmm8, zmm13, zmm15, 136\n        vmovdqa32 zmm22, zmm18\n        vpermt2d zmm18, zmm27, zmm8\n        vpermt2d zmm22, zmm31, zmm8\n        vshufps zmm19, zmm9, zmm11, 221\n        vshufps zmm8, zmm13, zmm15, 221\n        vmovdqa32 zmm23, zmm19\n        vpermt2d zmm19, zmm27, zmm8\n        vpermt2d zmm23, zmm31, zmm8\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        mov     r12, qword ptr [rdi+40H]\n        mov     r13, qword ptr [rdi+48H]\n        mov     r14, qword ptr [rdi+50H]\n        mov     r15, qword ptr [rdi+58H]\n        vmovdqu32 ymm24, ymmword ptr [r8+rdx-1H*20H]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-1H*20H], 01H\n        vmovdqu32 ymm25, ymmword ptr [r9+rdx-1H*20H]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-1H*20H], 01H\n        vpunpcklqdq zmm8, zmm24, zmm25\n        vpunpckhqdq zmm9, zmm24, zmm25\n        vmovdqu32 ymm24, ymmword ptr [r10+rdx-1H*20H]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-1H*20H], 01H\n        vmovdqu32 ymm25, ymmword ptr [r11+rdx-1H*20H]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-1H*20H], 01H\n        vpunpcklqdq zmm10, zmm24, zmm25\n        vpunpckhqdq zmm11, zmm24, zmm25\n        prefetcht0 byte ptr [r8+rdx+80H]\n        prefetcht0 byte ptr [r12+rdx+80H]\n        prefetcht0 byte ptr [r9+rdx+80H]\n        prefetcht0 byte ptr [r13+rdx+80H]\n        prefetcht0 byte ptr [r10+rdx+80H]\n        prefetcht0 byte ptr [r14+rdx+80H]\n        prefetcht0 byte ptr [r11+rdx+80H]\n        prefetcht0 byte ptr [r15+rdx+80H]\n        mov     r8, qword ptr [rdi+20H]\n        mov     r9, qword ptr [rdi+28H]\n        mov     r10, qword ptr [rdi+30H]\n        mov     r11, qword ptr [rdi+38H]\n        mov     r12, qword ptr [rdi+60H]\n        mov     r13, qword ptr [rdi+68H]\n        mov     r14, qword ptr [rdi+70H]\n        mov     r15, qword ptr [rdi+78H]\n        vmovdqu32 ymm24, ymmword ptr [r8+rdx-1H*20H]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r12+rdx-1H*20H], 01H\n        vmovdqu32 ymm25, ymmword ptr [r9+rdx-1H*20H]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r13+rdx-1H*20H], 01H\n        vpunpcklqdq zmm12, zmm24, zmm25\n        vpunpckhqdq zmm13, zmm24, zmm25\n        vmovdqu32 ymm24, ymmword ptr [r10+rdx-1H*20H]\n        vinserti64x4 zmm24, zmm24, ymmword ptr [r14+rdx-1H*20H], 01H\n        vmovdqu32 ymm25, ymmword ptr [r11+rdx-1H*20H]\n        vinserti64x4 zmm25, zmm25, ymmword ptr [r15+rdx-1H*20H], 01H\n        vpunpcklqdq zmm14, zmm24, zmm25\n        vpunpckhqdq zmm15, zmm24, zmm25\n        prefetcht0 byte  ptr [r8+rdx+80H]\n        prefetcht0 byte ptr [r12+rdx+80H]\n        prefetcht0 byte ptr [r9+rdx+80H]\n        prefetcht0 byte ptr [r13+rdx+80H]\n        prefetcht0 byte ptr [r10+rdx+80H]\n        prefetcht0 byte ptr [r14+rdx+80H]\n        prefetcht0 byte ptr [r11+rdx+80H]\n        prefetcht0 byte ptr [r15+rdx+80H]\n        vshufps zmm24, zmm8, zmm10, 136\n        vshufps zmm30, zmm12, zmm14, 136\n        vmovdqa32 zmm28, zmm24\n        vpermt2d zmm24, zmm27, zmm30\n        vpermt2d zmm28, zmm31, zmm30\n        vshufps zmm25, zmm8, zmm10, 221\n        vshufps zmm30, zmm12, zmm14, 221\n        vmovdqa32 zmm29, zmm25\n        vpermt2d zmm25, zmm27, zmm30\n        vpermt2d zmm29, zmm31, zmm30\n        vshufps zmm26, zmm9, zmm11, 136\n        vshufps zmm8, zmm13, zmm15, 136\n        vmovdqa32 zmm30, zmm26\n        vpermt2d zmm26, zmm27, zmm8\n        vpermt2d zmm30, zmm31, zmm8\n        vshufps zmm8, zmm9, zmm11, 221\n        vshufps zmm10, zmm13, zmm15, 221\n        vpermi2d zmm27, zmm8, zmm10\n        vpermi2d zmm31, zmm8, zmm10\n        vpbroadcastd zmm8, dword ptr [BLAKE3_IV_0]\n        vpbroadcastd zmm9, dword ptr [BLAKE3_IV_1]\n        vpbroadcastd zmm10, dword ptr [BLAKE3_IV_2]\n        vpbroadcastd zmm11, dword ptr [BLAKE3_IV_3]\n        vmovdqa32 zmm12, zmmword ptr [rsp]\n        vmovdqa32 zmm13, zmmword ptr [rsp+1H*40H]\n        vpbroadcastd zmm14, dword ptr [BLAKE3_BLOCK_LEN]\n        vpbroadcastd zmm15, dword ptr [rsp+22H*4H]\n        vpaddd  zmm0, zmm0, zmm16\n        vpaddd  zmm1, zmm1, zmm18\n        vpaddd  zmm2, zmm2, zmm20\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm17\n        vpaddd  zmm1, zmm1, zmm19\n        vpaddd  zmm2, zmm2, zmm21\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm24\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm28\n        vpaddd  zmm3, zmm3, zmm30\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm25\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm29\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm18\n        vpaddd  zmm1, zmm1, zmm19\n        vpaddd  zmm2, zmm2, zmm23\n        vpaddd  zmm3, zmm3, zmm20\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm22\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm16\n        vpaddd  zmm3, zmm3, zmm29\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm17\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm25\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm27\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm30\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm19\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm29\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm20\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm18\n        vpaddd  zmm3, zmm3, zmm30\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm22\n        vpaddd  zmm1, zmm1, zmm25\n        vpaddd  zmm2, zmm2, zmm27\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm21\n        vpaddd  zmm1, zmm1, zmm16\n        vpaddd  zmm2, zmm2, zmm31\n        vpaddd  zmm3, zmm3, zmm17\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm26\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm30\n        vpaddd  zmm3, zmm3, zmm29\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm23\n        vpaddd  zmm1, zmm1, zmm25\n        vpaddd  zmm2, zmm2, zmm19\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm20\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm21\n        vpaddd  zmm3, zmm3, zmm17\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm16\n        vpaddd  zmm1, zmm1, zmm18\n        vpaddd  zmm2, zmm2, zmm24\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm28\n        vpaddd  zmm1, zmm1, zmm25\n        vpaddd  zmm2, zmm2, zmm31\n        vpaddd  zmm3, zmm3, zmm30\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm29\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm26\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm23\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm16\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm18\n        vpaddd  zmm1, zmm1, zmm19\n        vpaddd  zmm2, zmm2, zmm17\n        vpaddd  zmm3, zmm3, zmm20\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm25\n        vpaddd  zmm1, zmm1, zmm27\n        vpaddd  zmm2, zmm2, zmm24\n        vpaddd  zmm3, zmm3, zmm31\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm30\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm28\n        vpaddd  zmm3, zmm3, zmm17\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm29\n        vpaddd  zmm1, zmm1, zmm16\n        vpaddd  zmm2, zmm2, zmm18\n        vpaddd  zmm3, zmm3, zmm20\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm19\n        vpaddd  zmm1, zmm1, zmm26\n        vpaddd  zmm2, zmm2, zmm22\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpaddd  zmm0, zmm0, zmm27\n        vpaddd  zmm1, zmm1, zmm21\n        vpaddd  zmm2, zmm2, zmm17\n        vpaddd  zmm3, zmm3, zmm24\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vprord  zmm15, zmm15, 16\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 12\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vpaddd  zmm0, zmm0, zmm31\n        vpaddd  zmm1, zmm1, zmm16\n        vpaddd  zmm2, zmm2, zmm25\n        vpaddd  zmm3, zmm3, zmm22\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm1, zmm1, zmm5\n        vpaddd  zmm2, zmm2, zmm6\n        vpaddd  zmm3, zmm3, zmm7\n        vpxord  zmm12, zmm12, zmm0\n        vpxord  zmm13, zmm13, zmm1\n        vpxord  zmm14, zmm14, zmm2\n        vpxord  zmm15, zmm15, zmm3\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vprord  zmm15, zmm15, 8\n        vpaddd  zmm8, zmm8, zmm12\n        vpaddd  zmm9, zmm9, zmm13\n        vpaddd  zmm10, zmm10, zmm14\n        vpaddd  zmm11, zmm11, zmm15\n        vpxord  zmm4, zmm4, zmm8\n        vpxord  zmm5, zmm5, zmm9\n        vpxord  zmm6, zmm6, zmm10\n        vpxord  zmm7, zmm7, zmm11\n        vprord  zmm4, zmm4, 7\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vpaddd  zmm0, zmm0, zmm30\n        vpaddd  zmm1, zmm1, zmm18\n        vpaddd  zmm2, zmm2, zmm19\n        vpaddd  zmm3, zmm3, zmm23\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 16\n        vprord  zmm12, zmm12, 16\n        vprord  zmm13, zmm13, 16\n        vprord  zmm14, zmm14, 16\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 12\n        vprord  zmm6, zmm6, 12\n        vprord  zmm7, zmm7, 12\n        vprord  zmm4, zmm4, 12\n        vpaddd  zmm0, zmm0, zmm26\n        vpaddd  zmm1, zmm1, zmm28\n        vpaddd  zmm2, zmm2, zmm20\n        vpaddd  zmm3, zmm3, zmm29\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm1, zmm1, zmm6\n        vpaddd  zmm2, zmm2, zmm7\n        vpaddd  zmm3, zmm3, zmm4\n        vpxord  zmm15, zmm15, zmm0\n        vpxord  zmm12, zmm12, zmm1\n        vpxord  zmm13, zmm13, zmm2\n        vpxord  zmm14, zmm14, zmm3\n        vprord  zmm15, zmm15, 8\n        vprord  zmm12, zmm12, 8\n        vprord  zmm13, zmm13, 8\n        vprord  zmm14, zmm14, 8\n        vpaddd  zmm10, zmm10, zmm15\n        vpaddd  zmm11, zmm11, zmm12\n        vpaddd  zmm8, zmm8, zmm13\n        vpaddd  zmm9, zmm9, zmm14\n        vpxord  zmm5, zmm5, zmm10\n        vpxord  zmm6, zmm6, zmm11\n        vpxord  zmm7, zmm7, zmm8\n        vpxord  zmm4, zmm4, zmm9\n        vprord  zmm5, zmm5, 7\n        vprord  zmm6, zmm6, 7\n        vprord  zmm7, zmm7, 7\n        vprord  zmm4, zmm4, 7\n        vpxord  zmm0, zmm0, zmm8\n        vpxord  zmm1, zmm1, zmm9\n        vpxord  zmm2, zmm2, zmm10\n        vpxord  zmm3, zmm3, zmm11\n        vpxord  zmm4, zmm4, zmm12\n        vpxord  zmm5, zmm5, zmm13\n        vpxord  zmm6, zmm6, zmm14\n        vpxord  zmm7, zmm7, zmm15\n        movzx   eax, byte ptr [rbp+78H]\n        jne     innerloop16\n        mov     rbx, qword ptr [rbp+90H]\n        vpunpckldq zmm16, zmm0, zmm1\n        vpunpckhdq zmm17, zmm0, zmm1\n        vpunpckldq zmm18, zmm2, zmm3\n        vpunpckhdq zmm19, zmm2, zmm3\n        vpunpckldq zmm20, zmm4, zmm5\n        vpunpckhdq zmm21, zmm4, zmm5\n        vpunpckldq zmm22, zmm6, zmm7\n        vpunpckhdq zmm23, zmm6, zmm7\n        vpunpcklqdq zmm0, zmm16, zmm18\n        vpunpckhqdq zmm1, zmm16, zmm18\n        vpunpcklqdq zmm2, zmm17, zmm19\n        vpunpckhqdq zmm3, zmm17, zmm19\n        vpunpcklqdq zmm4, zmm20, zmm22\n        vpunpckhqdq zmm5, zmm20, zmm22\n        vpunpcklqdq zmm6, zmm21, zmm23\n        vpunpckhqdq zmm7, zmm21, zmm23\n        vshufi32x4 zmm16, zmm0, zmm4, 88H\n        vshufi32x4 zmm17, zmm1, zmm5, 88H\n        vshufi32x4 zmm18, zmm2, zmm6, 88H\n        vshufi32x4 zmm19, zmm3, zmm7, 88H\n        vshufi32x4 zmm20, zmm0, zmm4, 0DDH\n        vshufi32x4 zmm21, zmm1, zmm5, 0DDH\n        vshufi32x4 zmm22, zmm2, zmm6, 0DDH\n        vshufi32x4 zmm23, zmm3, zmm7, 0DDH\n        vshufi32x4 zmm0, zmm16, zmm17, 88H\n        vshufi32x4 zmm1, zmm18, zmm19, 88H\n        vshufi32x4 zmm2, zmm20, zmm21, 88H\n        vshufi32x4 zmm3, zmm22, zmm23, 88H\n        vshufi32x4 zmm4, zmm16, zmm17, 0DDH\n        vshufi32x4 zmm5, zmm18, zmm19, 0DDH\n        vshufi32x4 zmm6, zmm20, zmm21, 0DDH\n        vshufi32x4 zmm7, zmm22, zmm23, 0DDH\n        vmovdqu32 zmmword ptr [rbx], zmm0\n        vmovdqu32 zmmword ptr [rbx+1H*40H], zmm1\n        vmovdqu32 zmmword ptr [rbx+2H*40H], zmm2\n        vmovdqu32 zmmword ptr [rbx+3H*40H], zmm3\n        vmovdqu32 zmmword ptr [rbx+4H*40H], zmm4\n        vmovdqu32 zmmword ptr [rbx+5H*40H], zmm5\n        vmovdqu32 zmmword ptr [rbx+6H*40H], zmm6\n        vmovdqu32 zmmword ptr [rbx+7H*40H], zmm7\n        vmovdqa32 zmm0, zmmword ptr [rsp]\n        vmovdqa32 zmm1, zmmword ptr [rsp+1H*40H]\n        vmovdqa32 zmm2, zmm0\n        ; XXX: ml64.exe does not currently understand the syntax. We use a workaround.\n        vpbroadcastd zmm4, dword ptr [ADD16]\n        vpbroadcastd zmm5, dword ptr [ADD1]\n        vpaddd  zmm2{k1}, zmm0, zmm4\n        ; vpaddd  zmm2{k1}, zmm0, dword ptr [ADD16] ; {1to16}\n        vpcmpud k2, zmm2, zmm0, 1\n        vpaddd  zmm1 {k2}, zmm1, zmm5\n        ; vpaddd  zmm1 {k2}, zmm1, dword ptr [ADD1] ; {1to16}\n        vmovdqa32 zmmword ptr [rsp], zmm2\n        vmovdqa32 zmmword ptr [rsp+1H*40H], zmm1\n        add     rdi, 128\n        add     rbx, 512\n        mov     qword ptr [rbp+90H], rbx\n        sub     rsi, 16\n        cmp     rsi, 16\n        jnc     outerloop16\n        test    rsi, rsi\n        jne     final15blocks\nunwind:\n        vzeroupper\n        vmovdqa xmm6, xmmword ptr [rsp+90H]\n        vmovdqa xmm7, xmmword ptr [rsp+0A0H]\n        vmovdqa xmm8, xmmword ptr [rsp+0B0H]\n        vmovdqa xmm9, xmmword ptr [rsp+0C0H]\n        vmovdqa xmm10, xmmword ptr [rsp+0D0H]\n        vmovdqa xmm11, xmmword ptr [rsp+0E0H]\n        vmovdqa xmm12, xmmword ptr [rsp+0F0H]\n        vmovdqa xmm13, xmmword ptr [rsp+100H]\n        vmovdqa xmm14, xmmword ptr [rsp+110H]\n        vmovdqa xmm15, xmmword ptr [rsp+120H]\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     rsi\n        pop     rdi\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\nALIGN   16\nfinal15blocks:\n        test    esi, 8H\n        je      final7blocks\n        vpbroadcastd ymm0, dword ptr [rcx]\n        vpbroadcastd ymm1, dword ptr [rcx+4H]\n        vpbroadcastd ymm2, dword ptr [rcx+8H]\n        vpbroadcastd ymm3, dword ptr [rcx+0CH]\n        vpbroadcastd ymm4, dword ptr [rcx+10H]\n        vpbroadcastd ymm5, dword ptr [rcx+14H]\n        vpbroadcastd ymm6, dword ptr [rcx+18H]\n        vpbroadcastd ymm7, dword ptr [rcx+1CH]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        mov     r12, qword ptr [rdi+20H]\n        mov     r13, qword ptr [rdi+28H]\n        mov     r14, qword ptr [rdi+30H]\n        mov     r15, qword ptr [rdi+38H]\n        movzx   eax, byte ptr [rbp+78H]\n        movzx   ebx, byte ptr [rbp+80H]\n        or      eax, ebx\n        xor     edx, edx\ninnerloop8:\n        movzx   ebx, byte ptr [rbp+88H]\n        or      ebx, eax\n        add     rdx, 64\n        cmp     rdx, qword ptr [rsp+80H]\n        cmove   eax, ebx\n        mov     dword ptr [rsp+88H], eax\n        vmovups xmm8, xmmword ptr [r8+rdx-40H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-40H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-40H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-40H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-40H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-40H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-40H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-40H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm16, ymm12, ymm14, 136\n        vshufps ymm17, ymm12, ymm14, 221\n        vshufps ymm18, ymm13, ymm15, 136\n        vshufps ymm19, ymm13, ymm15, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-30H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-30H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-30H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-30H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-30H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-30H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-30H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-30H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm20, ymm12, ymm14, 136\n        vshufps ymm21, ymm12, ymm14, 221\n        vshufps ymm22, ymm13, ymm15, 136\n        vshufps ymm23, ymm13, ymm15, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-20H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-20H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-20H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-20H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-20H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-20H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-20H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-20H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm24, ymm12, ymm14, 136\n        vshufps ymm25, ymm12, ymm14, 221\n        vshufps ymm26, ymm13, ymm15, 136\n        vshufps ymm27, ymm13, ymm15, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-10H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r12+rdx-10H], 01H\n        vmovups xmm9, xmmword ptr [r9+rdx-10H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r13+rdx-10H], 01H\n        vunpcklpd ymm12, ymm8, ymm9\n        vunpckhpd ymm13, ymm8, ymm9\n        vmovups xmm10, xmmword ptr [r10+rdx-10H]\n        vinsertf128 ymm10, ymm10, xmmword ptr [r14+rdx-10H], 01H\n        vmovups xmm11, xmmword ptr [r11+rdx-10H]\n        vinsertf128 ymm11, ymm11, xmmword ptr [r15+rdx-10H], 01H\n        vunpcklpd ymm14, ymm10, ymm11\n        vunpckhpd ymm15, ymm10, ymm11\n        vshufps ymm28, ymm12, ymm14, 136\n        vshufps ymm29, ymm12, ymm14, 221\n        vshufps ymm30, ymm13, ymm15, 136\n        vshufps ymm31, ymm13, ymm15, 221\n        vpbroadcastd ymm8, dword ptr [BLAKE3_IV_0]\n        vpbroadcastd ymm9, dword ptr [BLAKE3_IV_1]\n        vpbroadcastd ymm10, dword ptr [BLAKE3_IV_2]\n        vpbroadcastd ymm11, dword ptr [BLAKE3_IV_3]\n        vmovdqa ymm12, ymmword ptr [rsp]\n        vmovdqa ymm13, ymmword ptr [rsp+40H]\n        vpbroadcastd ymm14, dword ptr [BLAKE3_BLOCK_LEN]\n        vpbroadcastd ymm15, dword ptr [rsp+88H]\n        vpaddd  ymm0, ymm0, ymm16\n        vpaddd  ymm1, ymm1, ymm18\n        vpaddd  ymm2, ymm2, ymm20\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm17\n        vpaddd  ymm1, ymm1, ymm19\n        vpaddd  ymm2, ymm2, ymm21\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm24\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm28\n        vpaddd  ymm3, ymm3, ymm30\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm25\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm29\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm18\n        vpaddd  ymm1, ymm1, ymm19\n        vpaddd  ymm2, ymm2, ymm23\n        vpaddd  ymm3, ymm3, ymm20\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm22\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm16\n        vpaddd  ymm3, ymm3, ymm29\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm17\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm25\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm27\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm30\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm19\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm29\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm20\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm18\n        vpaddd  ymm3, ymm3, ymm30\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm22\n        vpaddd  ymm1, ymm1, ymm25\n        vpaddd  ymm2, ymm2, ymm27\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm21\n        vpaddd  ymm1, ymm1, ymm16\n        vpaddd  ymm2, ymm2, ymm31\n        vpaddd  ymm3, ymm3, ymm17\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm26\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm30\n        vpaddd  ymm3, ymm3, ymm29\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm23\n        vpaddd  ymm1, ymm1, ymm25\n        vpaddd  ymm2, ymm2, ymm19\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm20\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm21\n        vpaddd  ymm3, ymm3, ymm17\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm16\n        vpaddd  ymm1, ymm1, ymm18\n        vpaddd  ymm2, ymm2, ymm24\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm28\n        vpaddd  ymm1, ymm1, ymm25\n        vpaddd  ymm2, ymm2, ymm31\n        vpaddd  ymm3, ymm3, ymm30\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm29\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm26\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm23\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm16\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm18\n        vpaddd  ymm1, ymm1, ymm19\n        vpaddd  ymm2, ymm2, ymm17\n        vpaddd  ymm3, ymm3, ymm20\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm25\n        vpaddd  ymm1, ymm1, ymm27\n        vpaddd  ymm2, ymm2, ymm24\n        vpaddd  ymm3, ymm3, ymm31\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm30\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm28\n        vpaddd  ymm3, ymm3, ymm17\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm29\n        vpaddd  ymm1, ymm1, ymm16\n        vpaddd  ymm2, ymm2, ymm18\n        vpaddd  ymm3, ymm3, ymm20\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm19\n        vpaddd  ymm1, ymm1, ymm26\n        vpaddd  ymm2, ymm2, ymm22\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpaddd  ymm0, ymm0, ymm27\n        vpaddd  ymm1, ymm1, ymm21\n        vpaddd  ymm2, ymm2, ymm17\n        vpaddd  ymm3, ymm3, ymm24\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vprord  ymm15, ymm15, 16\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 12\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vpaddd  ymm0, ymm0, ymm31\n        vpaddd  ymm1, ymm1, ymm16\n        vpaddd  ymm2, ymm2, ymm25\n        vpaddd  ymm3, ymm3, ymm22\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm1, ymm1, ymm5\n        vpaddd  ymm2, ymm2, ymm6\n        vpaddd  ymm3, ymm3, ymm7\n        vpxord  ymm12, ymm12, ymm0\n        vpxord  ymm13, ymm13, ymm1\n        vpxord  ymm14, ymm14, ymm2\n        vpxord  ymm15, ymm15, ymm3\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vprord  ymm15, ymm15, 8\n        vpaddd  ymm8, ymm8, ymm12\n        vpaddd  ymm9, ymm9, ymm13\n        vpaddd  ymm10, ymm10, ymm14\n        vpaddd  ymm11, ymm11, ymm15\n        vpxord  ymm4, ymm4, ymm8\n        vpxord  ymm5, ymm5, ymm9\n        vpxord  ymm6, ymm6, ymm10\n        vpxord  ymm7, ymm7, ymm11\n        vprord  ymm4, ymm4, 7\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vpaddd  ymm0, ymm0, ymm30\n        vpaddd  ymm1, ymm1, ymm18\n        vpaddd  ymm2, ymm2, ymm19\n        vpaddd  ymm3, ymm3, ymm23\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 16\n        vprord  ymm12, ymm12, 16\n        vprord  ymm13, ymm13, 16\n        vprord  ymm14, ymm14, 16\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 12\n        vprord  ymm6, ymm6, 12\n        vprord  ymm7, ymm7, 12\n        vprord  ymm4, ymm4, 12\n        vpaddd  ymm0, ymm0, ymm26\n        vpaddd  ymm1, ymm1, ymm28\n        vpaddd  ymm2, ymm2, ymm20\n        vpaddd  ymm3, ymm3, ymm29\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm1, ymm1, ymm6\n        vpaddd  ymm2, ymm2, ymm7\n        vpaddd  ymm3, ymm3, ymm4\n        vpxord  ymm15, ymm15, ymm0\n        vpxord  ymm12, ymm12, ymm1\n        vpxord  ymm13, ymm13, ymm2\n        vpxord  ymm14, ymm14, ymm3\n        vprord  ymm15, ymm15, 8\n        vprord  ymm12, ymm12, 8\n        vprord  ymm13, ymm13, 8\n        vprord  ymm14, ymm14, 8\n        vpaddd  ymm10, ymm10, ymm15\n        vpaddd  ymm11, ymm11, ymm12\n        vpaddd  ymm8, ymm8, ymm13\n        vpaddd  ymm9, ymm9, ymm14\n        vpxord  ymm5, ymm5, ymm10\n        vpxord  ymm6, ymm6, ymm11\n        vpxord  ymm7, ymm7, ymm8\n        vpxord  ymm4, ymm4, ymm9\n        vprord  ymm5, ymm5, 7\n        vprord  ymm6, ymm6, 7\n        vprord  ymm7, ymm7, 7\n        vprord  ymm4, ymm4, 7\n        vpxor   ymm0, ymm0, ymm8\n        vpxor   ymm1, ymm1, ymm9\n        vpxor   ymm2, ymm2, ymm10\n        vpxor   ymm3, ymm3, ymm11\n        vpxor   ymm4, ymm4, ymm12\n        vpxor   ymm5, ymm5, ymm13\n        vpxor   ymm6, ymm6, ymm14\n        vpxor   ymm7, ymm7, ymm15\n        movzx   eax, byte ptr [rbp+78H]\n        jne     innerloop8\n        mov     rbx, qword ptr [rbp+90H]\n        vunpcklps ymm8, ymm0, ymm1\n        vunpcklps ymm9, ymm2, ymm3\n        vunpckhps ymm10, ymm0, ymm1\n        vunpcklps ymm11, ymm4, ymm5\n        vunpcklps ymm0, ymm6, ymm7\n        vshufps ymm12, ymm8, ymm9, 78\n        vblendps ymm1, ymm8, ymm12, 0CCH\n        vshufps ymm8, ymm11, ymm0, 78\n        vunpckhps ymm13, ymm2, ymm3\n        vblendps ymm2, ymm11, ymm8, 0CCH\n        vblendps ymm3, ymm12, ymm9, 0CCH\n        vperm2f128 ymm12, ymm1, ymm2, 20H\n        vmovups ymmword ptr [rbx], ymm12\n        vunpckhps ymm14, ymm4, ymm5\n        vblendps ymm4, ymm8, ymm0, 0CCH\n        vunpckhps ymm15, ymm6, ymm7\n        vperm2f128 ymm7, ymm3, ymm4, 20H\n        vmovups ymmword ptr [rbx+20H], ymm7\n        vshufps ymm5, ymm10, ymm13, 78\n        vblendps ymm6, ymm5, ymm13, 0CCH\n        vshufps ymm13, ymm14, ymm15, 78\n        vblendps ymm10, ymm10, ymm5, 0CCH\n        vblendps ymm14, ymm14, ymm13, 0CCH\n        vperm2f128 ymm8, ymm10, ymm14, 20H\n        vmovups ymmword ptr [rbx+40H], ymm8\n        vblendps ymm15, ymm13, ymm15, 0CCH\n        vperm2f128 ymm13, ymm6, ymm15, 20H\n        vmovups ymmword ptr [rbx+60H], ymm13\n        vperm2f128 ymm9, ymm1, ymm2, 31H\n        vperm2f128 ymm11, ymm3, ymm4, 31H\n        vmovups ymmword ptr [rbx+80H], ymm9\n        vperm2f128 ymm14, ymm10, ymm14, 31H\n        vperm2f128 ymm15, ymm6, ymm15, 31H\n        vmovups ymmword ptr [rbx+0A0H], ymm11\n        vmovups ymmword ptr [rbx+0C0H], ymm14\n        vmovups ymmword ptr [rbx+0E0H], ymm15\n        vmovdqa ymm0, ymmword ptr [rsp]\n        vmovdqa ymm2, ymmword ptr [rsp+40H]\n        vmovdqa32 ymm0 {k1}, ymmword ptr [rsp+1H*20H]\n        vmovdqa32 ymm2 {k1}, ymmword ptr [rsp+3H*20H]\n        vmovdqa ymmword ptr [rsp], ymm0\n        vmovdqa ymmword ptr [rsp+40H], ymm2\n        add     rbx, 256\n        mov     qword ptr [rbp+90H], rbx\n        add     rdi, 64\n        sub     rsi, 8\nfinal7blocks:\n        mov     rbx, qword ptr [rbp+90H]\n        mov     r15, qword ptr [rsp+80H]\n        movzx   r13, byte ptr [rbp+78H]\n        movzx   r12, byte ptr [rbp+88H]\n        test    esi, 4H\n        je      final3blocks\n        vbroadcasti32x4 zmm0, xmmword ptr [rcx]\n        vbroadcasti32x4 zmm1, xmmword ptr [rcx+1H*10H]\n        vmovdqa xmm12, xmmword ptr [rsp]\n        vmovdqa xmm13, xmmword ptr [rsp+40H]\n        vpunpckldq xmm14, xmm12, xmm13\n        vpunpckhdq xmm15, xmm12, xmm13\n        vpermq  ymm14, ymm14, 0DCH\n        vpermq  ymm15, ymm15, 0DCH\n        vpbroadcastd zmm12, dword ptr [BLAKE3_BLOCK_LEN]\n        vinserti64x4 zmm13, zmm14, ymm15, 01H\n        mov     eax, 17476\n        kmovw   k2, eax\n        vpblendmd zmm13 {k2}, zmm13, zmm12\n        vbroadcasti32x4 zmm15, xmmword ptr [BLAKE3_IV]\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        mov     eax, 43690\n        kmovw   k3, eax\n        mov     eax, 34952\n        kmovw   k4, eax\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\nALIGN   16\ninnerloop4:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+88H], eax\n        vmovdqa32 zmm2, zmm15\n        vpbroadcastd zmm8, dword ptr [rsp+22H*4H]\n        vpblendmd zmm3 {k4}, zmm13, zmm8\n        vmovups zmm8, zmmword ptr [r8+rdx-1H*40H]\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-4H*10H], 01H\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-4H*10H], 02H\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-4H*10H], 03H\n        vmovups zmm9, zmmword ptr [r8+rdx-30H]\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-3H*10H], 01H\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-3H*10H], 02H\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-3H*10H], 03H\n        vshufps zmm4, zmm8, zmm9, 136\n        vshufps zmm5, zmm8, zmm9, 221\n        vmovups zmm8, zmmword ptr [r8+rdx-20H]\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r9+rdx-2H*10H], 01H\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r10+rdx-2H*10H], 02H\n        vinserti32x4 zmm8, zmm8, xmmword ptr [r11+rdx-2H*10H], 03H\n        vmovups zmm9, zmmword ptr [r8+rdx-10H]\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r9+rdx-1H*10H], 01H\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r10+rdx-1H*10H], 02H\n        vinserti32x4 zmm9, zmm9, xmmword ptr [r11+rdx-1H*10H], 03H\n        vshufps zmm6, zmm8, zmm9, 136\n        vshufps zmm7, zmm8, zmm9, 221\n        vpshufd zmm6, zmm6, 93H\n        vpshufd zmm7, zmm7, 93H\n        mov     al, 7\nroundloop4:\n        vpaddd  zmm0, zmm0, zmm4\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 16\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 12\n        vpaddd  zmm0, zmm0, zmm5\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 8\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 7\n        vpshufd zmm0, zmm0, 93H\n        vpshufd zmm3, zmm3, 4EH\n        vpshufd zmm2, zmm2, 39H\n        vpaddd  zmm0, zmm0, zmm6\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 16\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 12\n        vpaddd  zmm0, zmm0, zmm7\n        vpaddd  zmm0, zmm0, zmm1\n        vpxord  zmm3, zmm3, zmm0\n        vprord  zmm3, zmm3, 8\n        vpaddd  zmm2, zmm2, zmm3\n        vpxord  zmm1, zmm1, zmm2\n        vprord  zmm1, zmm1, 7\n        vpshufd zmm0, zmm0, 39H\n        vpshufd zmm3, zmm3, 4EH\n        vpshufd zmm2, zmm2, 93H\n        dec     al\n        jz      endroundloop4\n        vshufps zmm8, zmm4, zmm5, 214\n        vpshufd zmm9, zmm4, 0FH\n        vpshufd zmm4, zmm8, 39H\n        vshufps zmm8, zmm6, zmm7, 250\n        vpblendmd zmm9 {k3}, zmm9, zmm8\n        vpunpcklqdq zmm8, zmm7, zmm5\n        vpblendmd zmm8 {k4}, zmm8, zmm6\n        vpshufd zmm8, zmm8, 78H\n        vpunpckhdq zmm5, zmm5, zmm7\n        vpunpckldq zmm6, zmm6, zmm5\n        vpshufd zmm7, zmm6, 1EH\n        vmovdqa32 zmm5, zmm9\n        vmovdqa32 zmm6, zmm8\n        jmp     roundloop4\nendroundloop4:\n        vpxord  zmm0, zmm0, zmm2\n        vpxord  zmm1, zmm1, zmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop4\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+10H], xmm1\n        vextracti128 xmmword ptr [rbx+20H], ymm0, 01H\n        vextracti128 xmmword ptr [rbx+30H], ymm1, 01H\n        vextracti32x4 xmmword ptr [rbx+4H*10H], zmm0, 02H\n        vextracti32x4 xmmword ptr [rbx+5H*10H], zmm1, 02H\n        vextracti32x4 xmmword ptr [rbx+6H*10H], zmm0, 03H\n        vextracti32x4 xmmword ptr [rbx+7H*10H], zmm1, 03H\n        vmovdqa xmm0, xmmword ptr [rsp]\n        vmovdqa xmm2, xmmword ptr [rsp+40H]\n        vmovdqa32 xmm0 {k1}, xmmword ptr [rsp+1H*10H]\n        vmovdqa32 xmm2 {k1}, xmmword ptr [rsp+5H*10H]\n        vmovdqa xmmword ptr [rsp], xmm0\n        vmovdqa xmmword ptr [rsp+40H], xmm2\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\nfinal3blocks:\n        test    esi, 2H\n        je      final1block\n        vbroadcasti128 ymm0, xmmword ptr [rcx]\n        vbroadcasti128 ymm1, xmmword ptr [rcx+10H]\n        vmovd   xmm13, dword ptr [rsp]\n        vpinsrd xmm13, xmm13, dword ptr [rsp+40H], 1\n        vpinsrd xmm13, xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2\n        vmovd   xmm14, dword ptr [rsp+4H]\n        vpinsrd xmm14, xmm14, dword ptr [rsp+44H], 1\n        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2\n        vinserti128 ymm13, ymm13, xmm14, 01H\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\nALIGN   16\ninnerloop2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        mov     dword ptr [rsp+88H], eax\n        vbroadcasti128 ymm2, xmmword ptr [BLAKE3_IV]\n        vpbroadcastd ymm8, dword ptr [rsp+88H]\n        vpblendd ymm3, ymm13, ymm8, 88H\n        vmovups ymm8, ymmword ptr [r8+rdx-40H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-40H], 01H\n        vmovups ymm9, ymmword ptr [r8+rdx-30H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-30H], 01H\n        vshufps ymm4, ymm8, ymm9, 136\n        vshufps ymm5, ymm8, ymm9, 221\n        vmovups ymm8, ymmword ptr [r8+rdx-20H]\n        vinsertf128 ymm8, ymm8, xmmword ptr [r9+rdx-20H], 01H\n        vmovups ymm9, ymmword ptr [r8+rdx-10H]\n        vinsertf128 ymm9, ymm9, xmmword ptr [r9+rdx-10H], 01H\n        vshufps ymm6, ymm8, ymm9, 136\n        vshufps ymm7, ymm8, ymm9, 221\n        vpshufd ymm6, ymm6, 93H\n        vpshufd ymm7, ymm7, 93H\n        mov     al, 7\nroundloop2:\n        vpaddd  ymm0, ymm0, ymm4\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 16\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 12\n        vpaddd  ymm0, ymm0, ymm5\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 8\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 7\n        vpshufd ymm0, ymm0, 93H\n        vpshufd ymm3, ymm3, 4EH\n        vpshufd ymm2, ymm2, 39H\n        vpaddd  ymm0, ymm0, ymm6\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 16\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 12\n        vpaddd  ymm0, ymm0, ymm7\n        vpaddd  ymm0, ymm0, ymm1\n        vpxord  ymm3, ymm3, ymm0\n        vprord  ymm3, ymm3, 8\n        vpaddd  ymm2, ymm2, ymm3\n        vpxord  ymm1, ymm1, ymm2\n        vprord  ymm1, ymm1, 7\n        vpshufd ymm0, ymm0, 39H\n        vpshufd ymm3, ymm3, 4EH\n        vpshufd ymm2, ymm2, 93H\n        dec     al\n        jz      endroundloop2\n        vshufps ymm8, ymm4, ymm5, 214\n        vpshufd ymm9, ymm4, 0FH\n        vpshufd ymm4, ymm8, 39H\n        vshufps ymm8, ymm6, ymm7, 250\n        vpblendd ymm9, ymm9, ymm8, 0AAH\n        vpunpcklqdq ymm8, ymm7, ymm5\n        vpblendd ymm8, ymm8, ymm6, 88H\n        vpshufd ymm8, ymm8, 78H\n        vpunpckhdq ymm5, ymm5, ymm7\n        vpunpckldq ymm6, ymm6, ymm5\n        vpshufd ymm7, ymm6, 1EH\n        vmovdqa ymm5, ymm9\n        vmovdqa ymm6, ymm8\n        jmp     roundloop2\nendroundloop2:\n        vpxor   ymm0, ymm0, ymm2\n        vpxor   ymm1, ymm1, ymm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop2\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+10H], xmm1\n        vextracti128 xmmword ptr [rbx+20H], ymm0, 01H\n        vextracti128 xmmword ptr [rbx+30H], ymm1, 01H\n        vmovdqa xmm0, xmmword ptr [rsp]\n        vmovdqa xmm2, xmmword ptr [rsp+40H]\n        vmovdqu32 xmm0 {k1}, xmmword ptr [rsp+8H]\n        vmovdqu32 xmm2 {k1}, xmmword ptr [rsp+48H]\n        vmovdqa xmmword ptr [rsp], xmm0\n        vmovdqa xmmword ptr [rsp+40H], xmm2\n        add     rbx, 64\n        add     rdi, 16\n        sub     rsi, 2\nfinal1block:\n        test    esi, 1H\n        je      unwind\n        vmovdqu xmm0, xmmword ptr [rcx]\n        vmovdqu xmm1, xmmword ptr [rcx+10H]\n        vmovd   xmm14, dword ptr [rsp]\n        vpinsrd xmm14, xmm14, dword ptr [rsp+40H], 1\n        vpinsrd xmm14, xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2\n        vmovdqa xmm15, xmmword ptr [BLAKE3_IV]\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\nALIGN   16\ninnerloop1:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        vpinsrd xmm3, xmm14, eax, 3\n        vmovdqa xmm2, xmm15\n        vmovups xmm8, xmmword ptr [r8+rdx-40H]\n        vmovups xmm9, xmmword ptr [r8+rdx-30H]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [r8+rdx-20H]\n        vmovups xmm9, xmmword ptr [r8+rdx-10H]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 93H\n        vpshufd xmm7, xmm7, 93H\n        mov     al, 7\nroundloop1:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 93H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 39H\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 39H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 93H\n        dec     al\n        jz      endroundloop1\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0FH\n        vpshufd xmm4, xmm8, 39H\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0AAH\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 88H\n        vpshufd xmm8, xmm8, 78H\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 1EH\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     roundloop1\nendroundloop1:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop1\n        vmovdqu xmmword ptr [rbx], xmm0\n        vmovdqu xmmword ptr [rbx+10H], xmm1\n        jmp     unwind\n\n_blake3_hash_many_avx512 ENDP\nblake3_hash_many_avx512 ENDP\n\nALIGN 16\nblake3_compress_in_place_avx512 PROC\n_blake3_compress_in_place_avx512 PROC\n        sub     rsp, 72\n        vmovdqa xmmword ptr [rsp], xmm6\n        vmovdqa xmmword ptr [rsp+10H], xmm7\n        vmovdqa xmmword ptr [rsp+20H], xmm8\n        vmovdqa xmmword ptr [rsp+30H], xmm9\n        vmovdqu xmm0, xmmword ptr [rcx]\n        vmovdqu xmm1, xmmword ptr [rcx+10H]\n        movzx   eax, byte ptr [rsp+70H]\n        movzx   r8d, r8b\n        shl     rax, 32\n        add     r8, rax\n        vmovq   xmm3, r9\n        vmovq   xmm4, r8\n        vpunpcklqdq xmm3, xmm3, xmm4\n        vmovaps xmm2, xmmword ptr [BLAKE3_IV]\n        vmovups xmm8, xmmword ptr [rdx]\n        vmovups xmm9, xmmword ptr [rdx+10H]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [rdx+20H]\n        vmovups xmm9, xmmword ptr [rdx+30H]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 93H\n        vpshufd xmm7, xmm7, 93H\n        mov     al, 7\n@@:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 93H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 39H\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 39H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 93H\n        dec     al\n        jz      @F\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0FH\n        vpshufd xmm4, xmm8, 39H\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0AAH\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 88H\n        vpshufd xmm8, xmm8, 78H\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 1EH\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     @B\n@@:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        vmovdqu xmmword ptr [rcx], xmm0\n        vmovdqu xmmword ptr [rcx+10H], xmm1\n        vmovdqa xmm6, xmmword ptr [rsp]\n        vmovdqa xmm7, xmmword ptr [rsp+10H]\n        vmovdqa xmm8, xmmword ptr [rsp+20H]\n        vmovdqa xmm9, xmmword ptr [rsp+30H]\n        add     rsp, 72\n        ret\n_blake3_compress_in_place_avx512 ENDP\nblake3_compress_in_place_avx512 ENDP\n\nALIGN 16\nblake3_compress_xof_avx512 PROC\n_blake3_compress_xof_avx512 PROC\n        sub     rsp, 72\n        vmovdqa xmmword ptr [rsp], xmm6\n        vmovdqa xmmword ptr [rsp+10H], xmm7\n        vmovdqa xmmword ptr [rsp+20H], xmm8\n        vmovdqa xmmword ptr [rsp+30H], xmm9\n        vmovdqu xmm0, xmmword ptr [rcx]\n        vmovdqu xmm1, xmmword ptr [rcx+10H]\n        movzx   eax, byte ptr [rsp+70H]\n        movzx   r8d, r8b\n        mov     r10, qword ptr [rsp+78H]\n        shl     rax, 32\n        add     r8, rax\n        vmovq   xmm3, r9\n        vmovq   xmm4, r8\n        vpunpcklqdq xmm3, xmm3, xmm4\n        vmovaps xmm2, xmmword ptr [BLAKE3_IV]\n        vmovups xmm8, xmmword ptr [rdx]\n        vmovups xmm9, xmmword ptr [rdx+10H]\n        vshufps xmm4, xmm8, xmm9, 136\n        vshufps xmm5, xmm8, xmm9, 221\n        vmovups xmm8, xmmword ptr [rdx+20H]\n        vmovups xmm9, xmmword ptr [rdx+30H]\n        vshufps xmm6, xmm8, xmm9, 136\n        vshufps xmm7, xmm8, xmm9, 221\n        vpshufd xmm6, xmm6, 93H\n        vpshufd xmm7, xmm7, 93H\n        mov     al, 7\n@@:\n        vpaddd  xmm0, xmm0, xmm4\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm5\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 93H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 39H\n        vpaddd  xmm0, xmm0, xmm6\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 16\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 12\n        vpaddd  xmm0, xmm0, xmm7\n        vpaddd  xmm0, xmm0, xmm1\n        vpxord  xmm3, xmm3, xmm0\n        vprord  xmm3, xmm3, 8\n        vpaddd  xmm2, xmm2, xmm3\n        vpxord  xmm1, xmm1, xmm2\n        vprord  xmm1, xmm1, 7\n        vpshufd xmm0, xmm0, 39H\n        vpshufd xmm3, xmm3, 4EH\n        vpshufd xmm2, xmm2, 93H\n        dec     al\n        jz      @F\n        vshufps xmm8, xmm4, xmm5, 214\n        vpshufd xmm9, xmm4, 0FH\n        vpshufd xmm4, xmm8, 39H\n        vshufps xmm8, xmm6, xmm7, 250\n        vpblendd xmm9, xmm9, xmm8, 0AAH\n        vpunpcklqdq xmm8, xmm7, xmm5\n        vpblendd xmm8, xmm8, xmm6, 88H\n        vpshufd xmm8, xmm8, 78H\n        vpunpckhdq xmm5, xmm5, xmm7\n        vpunpckldq xmm6, xmm6, xmm5\n        vpshufd xmm7, xmm6, 1EH\n        vmovdqa xmm5, xmm9\n        vmovdqa xmm6, xmm8\n        jmp     @B\n@@:\n        vpxor   xmm0, xmm0, xmm2\n        vpxor   xmm1, xmm1, xmm3\n        vpxor   xmm2, xmm2, xmmword ptr [rcx]\n        vpxor   xmm3, xmm3, xmmword ptr [rcx+10H]\n        vmovdqu xmmword ptr [r10], xmm0\n        vmovdqu xmmword ptr [r10+10H], xmm1\n        vmovdqu xmmword ptr [r10+20H], xmm2\n        vmovdqu xmmword ptr [r10+30H], xmm3\n        vmovdqa xmm6, xmmword ptr [rsp]\n        vmovdqa xmm7, xmmword ptr [rsp+10H]\n        vmovdqa xmm8, xmmword ptr [rsp+20H]\n        vmovdqa xmm9, xmmword ptr [rsp+30H]\n        add     rsp, 72\n        ret\n_blake3_compress_xof_avx512 ENDP\nblake3_compress_xof_avx512 ENDP\n\n_TEXT ENDS\n\n_RDATA SEGMENT READONLY PAGE ALIAS(\".rdata\") 'CONST'\nALIGN   64\nINDEX0:\n        dd    0,  1,  2,  3, 16, 17, 18, 19\n        dd    8,  9, 10, 11, 24, 25, 26, 27\nINDEX1:\n        dd    4,  5,  6,  7, 20, 21, 22, 23\n        dd   12, 13, 14, 15, 28, 29, 30, 31\nADD0:\n        dd    0,  1,  2,  3,  4,  5,  6,  7\n        dd    8,  9, 10, 11, 12, 13, 14, 15\nADD1:   \n        dd    1\nADD16:  \n        dd   16\nBLAKE3_BLOCK_LEN:\n        dd   64\nALIGN   64\nBLAKE3_IV:\nBLAKE3_IV_0:\n        dd   06A09E667H\nBLAKE3_IV_1:\n        dd   0BB67AE85H\nBLAKE3_IV_2:\n        dd   03C6EF372H\nBLAKE3_IV_3:\n        dd   0A54FF53AH\n\n_RDATA ENDS\nEND\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_dispatch.c",
    "content": "#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"blake3_impl.h\"\n\n#if defined(IS_X86)\n#if defined(_MSC_VER)\n#include <intrin.h>\n#elif defined(__GNUC__)\n#include <immintrin.h>\n#else\n#undef IS_X86 /* Unimplemented! */\n#endif\n#endif\n\n#define MAYBE_UNUSED(x) (void)((x))\n\n#if defined(IS_X86)\nstatic uint64_t xgetbv(void) {\n#if defined(_MSC_VER)\n  return _xgetbv(0);\n#else\n  uint32_t eax = 0, edx = 0;\n  __asm__ __volatile__(\"xgetbv\\n\" : \"=a\"(eax), \"=d\"(edx) : \"c\"(0));\n  return ((uint64_t)edx << 32) | eax;\n#endif\n}\n\nstatic void cpuid(uint32_t out[4], uint32_t id) {\n#if defined(_MSC_VER)\n  __cpuid((int *)out, id);\n#elif defined(__i386__) || defined(_M_IX86)\n  __asm__ __volatile__(\"movl %%ebx, %1\\n\"\n                       \"cpuid\\n\"\n                       \"xchgl %1, %%ebx\\n\"\n                       : \"=a\"(out[0]), \"=r\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id));\n#else\n  __asm__ __volatile__(\"cpuid\\n\"\n                       : \"=a\"(out[0]), \"=b\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id));\n#endif\n}\n\nstatic void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) {\n#if defined(_MSC_VER)\n  __cpuidex((int *)out, id, sid);\n#elif defined(__i386__) || defined(_M_IX86)\n  __asm__ __volatile__(\"movl %%ebx, %1\\n\"\n                       \"cpuid\\n\"\n                       \"xchgl %1, %%ebx\\n\"\n                       : \"=a\"(out[0]), \"=r\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id), \"c\"(sid));\n#else\n  __asm__ __volatile__(\"cpuid\\n\"\n                       : \"=a\"(out[0]), \"=b\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id), \"c\"(sid));\n#endif\n}\n\n#endif\n\nenum cpu_feature {\n  SSE2 = 1 << 0,\n  SSSE3 = 1 << 1,\n  SSE41 = 1 << 2,\n  AVX = 1 << 3,\n  AVX2 = 1 << 4,\n  AVX512F = 1 << 5,\n  AVX512VL = 1 << 6,\n  /* ... */\n  UNDEFINED = 1 << 30\n};\n\n#if !defined(BLAKE3_TESTING)\nstatic /* Allow the variable to be controlled manually for testing */\n#endif\n    volatile int g_cpu_features = UNDEFINED;\n\n#if !defined(BLAKE3_TESTING)\nstatic\n#endif\n    enum cpu_feature\n    get_cpu_features(void) {\n\n  /* If TSAN detects a data race here, try compiling with -DBLAKE3_ATOMICS=1 */\n  long features = g_cpu_features;\n  if (features != UNDEFINED) {\n    return (enum cpu_feature)features;\n  } else {\n#if defined(IS_X86)\n    uint32_t regs[4] = {0};\n    uint32_t *eax = &regs[0], *ebx = &regs[1], *ecx = &regs[2], *edx = &regs[3];\n    (void)edx;\n    features = 0;\n    cpuid(regs, 0);\n    const int max_id = *eax;\n    cpuid(regs, 1);\n#if defined(__amd64__) || defined(_M_X64)\n    features |= SSE2;\n#else\n    if (*edx & (1UL << 26))\n      features |= SSE2;\n#endif\n    if (*ecx & (1UL << 9))\n      features |= SSSE3;\n    if (*ecx & (1UL << 19))\n      features |= SSE41;\n\n    if (*ecx & (1UL << 27)) { // OSXSAVE\n      const uint64_t mask = xgetbv();\n      if ((mask & 6) == 6) { // SSE and AVX states\n        if (*ecx & (1UL << 28))\n          features |= AVX;\n        if (max_id >= 7) {\n          cpuidex(regs, 7, 0);\n          if (*ebx & (1UL << 5))\n            features |= AVX2;\n          if ((mask & 224) == 224) { // Opmask, ZMM_Hi256, Hi16_Zmm\n            if (*ebx & (1UL << 31))\n              features |= AVX512VL;\n            if (*ebx & (1UL << 16))\n              features |= AVX512F;\n          }\n        }\n      }\n    }\n    g_cpu_features = features;\n    return (enum cpu_feature)features;\n#else\n    /* How to detect NEON? */\n    return 0;\n#endif\n  }\n}\n\nvoid blake3_compress_in_place(uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if (features & AVX512VL) {\n    blake3_compress_in_place_avx512(cv, block, block_len, counter, flags);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    blake3_compress_in_place_sse41(cv, block, block_len, counter, flags);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    blake3_compress_in_place_sse2(cv, block, block_len, counter, flags);\n    return;\n  }\n#endif\n#endif\n  blake3_compress_in_place_portable(cv, block, block_len, counter, flags);\n}\n\nvoid blake3_compress_xof(const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags,\n                         uint8_t out[64]) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if (features & AVX512VL) {\n    blake3_compress_xof_avx512(cv, block, block_len, counter, flags, out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    blake3_compress_xof_sse41(cv, block, block_len, counter, flags, out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    blake3_compress_xof_sse2(cv, block, block_len, counter, flags, out);\n    return;\n  }\n#endif\n#endif\n  blake3_compress_xof_portable(cv, block, block_len, counter, flags, out);\n}\n\nvoid blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,\n                      size_t blocks, const uint32_t key[8], uint64_t counter,\n                      bool increment_counter, uint8_t flags,\n                      uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) {\n    blake3_hash_many_avx512(inputs, num_inputs, blocks, key, counter,\n                            increment_counter, flags, flags_start, flags_end,\n                            out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_AVX2)\n  if (features & AVX2) {\n    blake3_hash_many_avx2(inputs, num_inputs, blocks, key, counter,\n                          increment_counter, flags, flags_start, flags_end,\n                          out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter,\n                           increment_counter, flags, flags_start, flags_end,\n                           out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    blake3_hash_many_sse2(inputs, num_inputs, blocks, key, counter,\n                          increment_counter, flags, flags_start, flags_end,\n                          out);\n    return;\n  }\n#endif\n#endif\n\n#if BLAKE3_USE_NEON == 1\n  blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter,\n                        increment_counter, flags, flags_start, flags_end, out);\n  return;\n#endif\n\n  blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter,\n                            increment_counter, flags, flags_start, flags_end,\n                            out);\n}\n\n// The dynamically detected SIMD degree of the current platform.\nsize_t blake3_simd_degree(void) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) {\n    return 16;\n  }\n#endif\n#if !defined(BLAKE3_NO_AVX2)\n  if (features & AVX2) {\n    return 8;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    return 4;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    return 4;\n  }\n#endif\n#endif\n#if BLAKE3_USE_NEON == 1\n  return 4;\n#endif\n  return 1;\n}\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_impl.h",
    "content": "#ifndef BLAKE3_IMPL_H\n#define BLAKE3_IMPL_H\n\n#include <assert.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n\n#include \"blake3.h\"\n\n// internal flags\nenum blake3_flags {\n  CHUNK_START         = 1 << 0,\n  CHUNK_END           = 1 << 1,\n  PARENT              = 1 << 2,\n  ROOT                = 1 << 3,\n  KEYED_HASH          = 1 << 4,\n  DERIVE_KEY_CONTEXT  = 1 << 5,\n  DERIVE_KEY_MATERIAL = 1 << 6,\n};\n\n// This C implementation tries to support recent versions of GCC, Clang, and\n// MSVC.\n#if defined(_MSC_VER)\n#define INLINE static __forceinline\n#else\n#define INLINE static inline __attribute__((always_inline))\n#endif\n\n#if defined(__x86_64__) || defined(_M_X64) \n#define IS_X86\n#define IS_X86_64\n#endif\n\n#if defined(__i386__) || defined(_M_IX86)\n#define IS_X86\n#define IS_X86_32\n#endif\n\n#if defined(__aarch64__) || defined(_M_ARM64)\n#define IS_AARCH64\n#endif\n\n#if defined(IS_X86)\n#if defined(_MSC_VER)\n#include <intrin.h>\n#endif\n#endif\n\n#if !defined(BLAKE3_USE_NEON) \n  // If BLAKE3_USE_NEON not manually set, autodetect based on AArch64ness\n  #if defined(IS_AARCH64)\n    #if defined(__ARM_BIG_ENDIAN)\n      #define BLAKE3_USE_NEON 0\n    #else\n      #define BLAKE3_USE_NEON 1\n    #endif\n  #else\n    #define BLAKE3_USE_NEON 0\n  #endif\n#endif\n\n#if defined(IS_X86)\n#define MAX_SIMD_DEGREE 16\n#elif BLAKE3_USE_NEON == 1\n#define MAX_SIMD_DEGREE 4\n#else\n#define MAX_SIMD_DEGREE 1\n#endif\n\n// There are some places where we want a static size that's equal to the\n// MAX_SIMD_DEGREE, but also at least 2.\n#define MAX_SIMD_DEGREE_OR_2 (MAX_SIMD_DEGREE > 2 ? MAX_SIMD_DEGREE : 2)\n\nstatic const uint32_t IV[8] = {0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL,\n                               0xA54FF53AUL, 0x510E527FUL, 0x9B05688CUL,\n                               0x1F83D9ABUL, 0x5BE0CD19UL};\n\nstatic const uint8_t MSG_SCHEDULE[7][16] = {\n    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},\n    {2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8},\n    {3, 4, 10, 12, 13, 2, 7, 14, 6, 5, 9, 0, 11, 15, 8, 1},\n    {10, 7, 12, 9, 14, 3, 13, 15, 4, 0, 11, 2, 5, 8, 1, 6},\n    {12, 13, 9, 11, 15, 10, 14, 8, 7, 2, 5, 3, 0, 1, 6, 4},\n    {9, 14, 11, 5, 8, 12, 15, 1, 13, 3, 0, 10, 2, 6, 4, 7},\n    {11, 15, 5, 0, 1, 9, 8, 6, 14, 10, 2, 12, 3, 4, 7, 13},\n};\n\n/* Find index of the highest set bit */\n/* x is assumed to be nonzero.       */\nstatic unsigned int highest_one(uint64_t x) {\n#if defined(__GNUC__) || defined(__clang__)\n  return 63 ^ (unsigned int)__builtin_clzll(x);\n#elif defined(_MSC_VER) && defined(IS_X86_64)\n  unsigned long index;\n  _BitScanReverse64(&index, x);\n  return index;\n#elif defined(_MSC_VER) && defined(IS_X86_32)\n  if(x >> 32) {\n    unsigned long index;\n    _BitScanReverse(&index, (unsigned long)(x >> 32));\n    return 32 + index;\n  } else {\n    unsigned long index;\n    _BitScanReverse(&index, (unsigned long)x);\n    return index;\n  }\n#else\n  unsigned int c = 0;\n  if(x & 0xffffffff00000000ULL) { x >>= 32; c += 32; }\n  if(x & 0x00000000ffff0000ULL) { x >>= 16; c += 16; }\n  if(x & 0x000000000000ff00ULL) { x >>=  8; c +=  8; }\n  if(x & 0x00000000000000f0ULL) { x >>=  4; c +=  4; }\n  if(x & 0x000000000000000cULL) { x >>=  2; c +=  2; }\n  if(x & 0x0000000000000002ULL) {           c +=  1; }\n  return c;\n#endif\n}\n\n// Count the number of 1 bits.\nINLINE unsigned int popcnt(uint64_t x) {\n#if defined(__GNUC__) || defined(__clang__)\n  return (unsigned int)__builtin_popcountll(x);\n#else\n  unsigned int count = 0;\n  while (x != 0) {\n    count += 1;\n    x &= x - 1;\n  }\n  return count;\n#endif\n}\n\n// Largest power of two less than or equal to x. As a special case, returns 1\n// when x is 0. \nINLINE uint64_t round_down_to_power_of_2(uint64_t x) {\n  return 1ULL << highest_one(x | 1);\n}\n\nINLINE uint32_t counter_low(uint64_t counter) { return (uint32_t)counter; }\n\nINLINE uint32_t counter_high(uint64_t counter) {\n  return (uint32_t)(counter >> 32);\n}\n\nINLINE uint32_t load32(const void *src) {\n  const uint8_t *p = (const uint8_t *)src;\n  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |\n         ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);\n}\n\nINLINE void load_key_words(const uint8_t key[BLAKE3_KEY_LEN],\n                           uint32_t key_words[8]) {\n  key_words[0] = load32(&key[0 * 4]);\n  key_words[1] = load32(&key[1 * 4]);\n  key_words[2] = load32(&key[2 * 4]);\n  key_words[3] = load32(&key[3 * 4]);\n  key_words[4] = load32(&key[4 * 4]);\n  key_words[5] = load32(&key[5 * 4]);\n  key_words[6] = load32(&key[6 * 4]);\n  key_words[7] = load32(&key[7 * 4]);\n}\n\nINLINE void store32(void *dst, uint32_t w) {\n  uint8_t *p = (uint8_t *)dst;\n  p[0] = (uint8_t)(w >> 0);\n  p[1] = (uint8_t)(w >> 8);\n  p[2] = (uint8_t)(w >> 16);\n  p[3] = (uint8_t)(w >> 24);\n}\n\nINLINE void store_cv_words(uint8_t bytes_out[32], uint32_t cv_words[8]) {\n  store32(&bytes_out[0 * 4], cv_words[0]);\n  store32(&bytes_out[1 * 4], cv_words[1]);\n  store32(&bytes_out[2 * 4], cv_words[2]);\n  store32(&bytes_out[3 * 4], cv_words[3]);\n  store32(&bytes_out[4 * 4], cv_words[4]);\n  store32(&bytes_out[5 * 4], cv_words[5]);\n  store32(&bytes_out[6 * 4], cv_words[6]);\n  store32(&bytes_out[7 * 4], cv_words[7]);\n}\n\nvoid blake3_compress_in_place(uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags);\n\nvoid blake3_compress_xof(const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags,\n                         uint8_t out[64]);\n\nvoid blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,\n                      size_t blocks, const uint32_t key[8], uint64_t counter,\n                      bool increment_counter, uint8_t flags,\n                      uint8_t flags_start, uint8_t flags_end, uint8_t *out);\n\nsize_t blake3_simd_degree(void);\n\n\n// Declarations for implementation-specific functions.\nvoid blake3_compress_in_place_portable(uint32_t cv[8],\n                                       const uint8_t block[BLAKE3_BLOCK_LEN],\n                                       uint8_t block_len, uint64_t counter,\n                                       uint8_t flags);\n\nvoid blake3_compress_xof_portable(const uint32_t cv[8],\n                                  const uint8_t block[BLAKE3_BLOCK_LEN],\n                                  uint8_t block_len, uint64_t counter,\n                                  uint8_t flags, uint8_t out[64]);\n\nvoid blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs,\n                               size_t blocks, const uint32_t key[8],\n                               uint64_t counter, bool increment_counter,\n                               uint8_t flags, uint8_t flags_start,\n                               uint8_t flags_end, uint8_t *out);\n\n#if defined(IS_X86)\n#if !defined(BLAKE3_NO_SSE2)\nvoid blake3_compress_in_place_sse2(uint32_t cv[8],\n                                   const uint8_t block[BLAKE3_BLOCK_LEN],\n                                   uint8_t block_len, uint64_t counter,\n                                   uint8_t flags);\nvoid blake3_compress_xof_sse2(const uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags, uint8_t out[64]);\nvoid blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out);\n#endif\n#if !defined(BLAKE3_NO_SSE41)\nvoid blake3_compress_in_place_sse41(uint32_t cv[8],\n                                    const uint8_t block[BLAKE3_BLOCK_LEN],\n                                    uint8_t block_len, uint64_t counter,\n                                    uint8_t flags);\nvoid blake3_compress_xof_sse41(const uint32_t cv[8],\n                               const uint8_t block[BLAKE3_BLOCK_LEN],\n                               uint8_t block_len, uint64_t counter,\n                               uint8_t flags, uint8_t out[64]);\nvoid blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs,\n                            size_t blocks, const uint32_t key[8],\n                            uint64_t counter, bool increment_counter,\n                            uint8_t flags, uint8_t flags_start,\n                            uint8_t flags_end, uint8_t *out);\n#endif\n#if !defined(BLAKE3_NO_AVX2)\nvoid blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out);\n#endif\n#if !defined(BLAKE3_NO_AVX512)\nvoid blake3_compress_in_place_avx512(uint32_t cv[8],\n                                     const uint8_t block[BLAKE3_BLOCK_LEN],\n                                     uint8_t block_len, uint64_t counter,\n                                     uint8_t flags);\n\nvoid blake3_compress_xof_avx512(const uint32_t cv[8],\n                                const uint8_t block[BLAKE3_BLOCK_LEN],\n                                uint8_t block_len, uint64_t counter,\n                                uint8_t flags, uint8_t out[64]);\n\nvoid blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs,\n                             size_t blocks, const uint32_t key[8],\n                             uint64_t counter, bool increment_counter,\n                             uint8_t flags, uint8_t flags_start,\n                             uint8_t flags_end, uint8_t *out);\n#endif\n#endif\n\n#if BLAKE3_USE_NEON == 1\nvoid blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out);\n#endif\n\n\n#endif /* BLAKE3_IMPL_H */\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_neon.c",
    "content": "#include \"blake3_impl.h\"\n\n#include <arm_neon.h>\n\n#ifdef __ARM_BIG_ENDIAN\n#error \"This implementation only supports little-endian ARM.\"\n// It might be that all we need for big-endian support here is to get the loads\n// and stores right, but step zero would be finding a way to test it in CI.\n#endif\n\nINLINE uint32x4_t loadu_128(const uint8_t src[16]) {\n  // vld1q_u32 has alignment requirements. Don't use it.\n  uint32x4_t x;\n  memcpy(&x, src, 16);\n  return x;\n}\n\nINLINE void storeu_128(uint32x4_t src, uint8_t dest[16]) {\n  // vst1q_u32 has alignment requirements. Don't use it.\n  memcpy(dest, &src, 16);\n}\n\nINLINE uint32x4_t add_128(uint32x4_t a, uint32x4_t b) {\n  return vaddq_u32(a, b);\n}\n\nINLINE uint32x4_t xor_128(uint32x4_t a, uint32x4_t b) {\n  return veorq_u32(a, b);\n}\n\nINLINE uint32x4_t set1_128(uint32_t x) { return vld1q_dup_u32(&x); }\n\nINLINE uint32x4_t set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {\n  uint32_t array[4] = {a, b, c, d};\n  return vld1q_u32(array);\n}\n\nINLINE uint32x4_t rot16_128(uint32x4_t x) {\n  // The straightfoward implementation would be two shifts and an or, but that's\n  // slower on microarchitectures we've tested. See\n  // https://github.com/BLAKE3-team/BLAKE3/pull/319.\n  // return vorrq_u32(vshrq_n_u32(x, 16), vshlq_n_u32(x, 32 - 16));\n  return vreinterpretq_u32_u16(vrev32q_u16(vreinterpretq_u16_u32(x)));\n}\n\nINLINE uint32x4_t rot12_128(uint32x4_t x) {\n  // See comment in rot16_128.\n  // return vorrq_u32(vshrq_n_u32(x, 12), vshlq_n_u32(x, 32 - 12));\n  return vsriq_n_u32(vshlq_n_u32(x, 32-12), x, 12);\n}\n\nINLINE uint32x4_t rot8_128(uint32x4_t x) {\n  // See comment in rot16_128.\n  // return vorrq_u32(vshrq_n_u32(x, 8), vshlq_n_u32(x, 32 - 8));\n#if defined(__clang__)\n  return vreinterpretq_u32_u8(__builtin_shufflevector(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), 1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12));\n#elif __GNUC__ * 10000 + __GNUC_MINOR__ * 100 >=40700\n  static const uint8x16_t r8 = {1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12};\n  return vreinterpretq_u32_u8(__builtin_shuffle(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), r8));\n#else \n  return vsriq_n_u32(vshlq_n_u32(x, 32-8), x, 8);\n#endif\n}\n\nINLINE uint32x4_t rot7_128(uint32x4_t x) {\n  // See comment in rot16_128.\n  // return vorrq_u32(vshrq_n_u32(x, 7), vshlq_n_u32(x, 32 - 7));\n  return vsriq_n_u32(vshlq_n_u32(x, 32-7), x, 7);\n}\n\n// TODO: compress_neon\n\n// TODO: hash2_neon\n\n/*\n * ----------------------------------------------------------------------------\n * hash4_neon\n * ----------------------------------------------------------------------------\n */\n\nINLINE void round_fn4(uint32x4_t v[16], uint32x4_t m[16], size_t r) {\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = add_128(v[0], v[4]);\n  v[1] = add_128(v[1], v[5]);\n  v[2] = add_128(v[2], v[6]);\n  v[3] = add_128(v[3], v[7]);\n  v[12] = xor_128(v[12], v[0]);\n  v[13] = xor_128(v[13], v[1]);\n  v[14] = xor_128(v[14], v[2]);\n  v[15] = xor_128(v[15], v[3]);\n  v[12] = rot16_128(v[12]);\n  v[13] = rot16_128(v[13]);\n  v[14] = rot16_128(v[14]);\n  v[15] = rot16_128(v[15]);\n  v[8] = add_128(v[8], v[12]);\n  v[9] = add_128(v[9], v[13]);\n  v[10] = add_128(v[10], v[14]);\n  v[11] = add_128(v[11], v[15]);\n  v[4] = xor_128(v[4], v[8]);\n  v[5] = xor_128(v[5], v[9]);\n  v[6] = xor_128(v[6], v[10]);\n  v[7] = xor_128(v[7], v[11]);\n  v[4] = rot12_128(v[4]);\n  v[5] = rot12_128(v[5]);\n  v[6] = rot12_128(v[6]);\n  v[7] = rot12_128(v[7]);\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = add_128(v[0], v[4]);\n  v[1] = add_128(v[1], v[5]);\n  v[2] = add_128(v[2], v[6]);\n  v[3] = add_128(v[3], v[7]);\n  v[12] = xor_128(v[12], v[0]);\n  v[13] = xor_128(v[13], v[1]);\n  v[14] = xor_128(v[14], v[2]);\n  v[15] = xor_128(v[15], v[3]);\n  v[12] = rot8_128(v[12]);\n  v[13] = rot8_128(v[13]);\n  v[14] = rot8_128(v[14]);\n  v[15] = rot8_128(v[15]);\n  v[8] = add_128(v[8], v[12]);\n  v[9] = add_128(v[9], v[13]);\n  v[10] = add_128(v[10], v[14]);\n  v[11] = add_128(v[11], v[15]);\n  v[4] = xor_128(v[4], v[8]);\n  v[5] = xor_128(v[5], v[9]);\n  v[6] = xor_128(v[6], v[10]);\n  v[7] = xor_128(v[7], v[11]);\n  v[4] = rot7_128(v[4]);\n  v[5] = rot7_128(v[5]);\n  v[6] = rot7_128(v[6]);\n  v[7] = rot7_128(v[7]);\n\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = add_128(v[0], v[5]);\n  v[1] = add_128(v[1], v[6]);\n  v[2] = add_128(v[2], v[7]);\n  v[3] = add_128(v[3], v[4]);\n  v[15] = xor_128(v[15], v[0]);\n  v[12] = xor_128(v[12], v[1]);\n  v[13] = xor_128(v[13], v[2]);\n  v[14] = xor_128(v[14], v[3]);\n  v[15] = rot16_128(v[15]);\n  v[12] = rot16_128(v[12]);\n  v[13] = rot16_128(v[13]);\n  v[14] = rot16_128(v[14]);\n  v[10] = add_128(v[10], v[15]);\n  v[11] = add_128(v[11], v[12]);\n  v[8] = add_128(v[8], v[13]);\n  v[9] = add_128(v[9], v[14]);\n  v[5] = xor_128(v[5], v[10]);\n  v[6] = xor_128(v[6], v[11]);\n  v[7] = xor_128(v[7], v[8]);\n  v[4] = xor_128(v[4], v[9]);\n  v[5] = rot12_128(v[5]);\n  v[6] = rot12_128(v[6]);\n  v[7] = rot12_128(v[7]);\n  v[4] = rot12_128(v[4]);\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = add_128(v[0], v[5]);\n  v[1] = add_128(v[1], v[6]);\n  v[2] = add_128(v[2], v[7]);\n  v[3] = add_128(v[3], v[4]);\n  v[15] = xor_128(v[15], v[0]);\n  v[12] = xor_128(v[12], v[1]);\n  v[13] = xor_128(v[13], v[2]);\n  v[14] = xor_128(v[14], v[3]);\n  v[15] = rot8_128(v[15]);\n  v[12] = rot8_128(v[12]);\n  v[13] = rot8_128(v[13]);\n  v[14] = rot8_128(v[14]);\n  v[10] = add_128(v[10], v[15]);\n  v[11] = add_128(v[11], v[12]);\n  v[8] = add_128(v[8], v[13]);\n  v[9] = add_128(v[9], v[14]);\n  v[5] = xor_128(v[5], v[10]);\n  v[6] = xor_128(v[6], v[11]);\n  v[7] = xor_128(v[7], v[8]);\n  v[4] = xor_128(v[4], v[9]);\n  v[5] = rot7_128(v[5]);\n  v[6] = rot7_128(v[6]);\n  v[7] = rot7_128(v[7]);\n  v[4] = rot7_128(v[4]);\n}\n\nINLINE void transpose_vecs_128(uint32x4_t vecs[4]) {\n  // Individually transpose the four 2x2 sub-matrices in each corner.\n  uint32x4x2_t rows01 = vtrnq_u32(vecs[0], vecs[1]);\n  uint32x4x2_t rows23 = vtrnq_u32(vecs[2], vecs[3]);\n\n  // Swap the top-right and bottom-left 2x2s (which just got transposed).\n  vecs[0] =\n      vcombine_u32(vget_low_u32(rows01.val[0]), vget_low_u32(rows23.val[0]));\n  vecs[1] =\n      vcombine_u32(vget_low_u32(rows01.val[1]), vget_low_u32(rows23.val[1]));\n  vecs[2] =\n      vcombine_u32(vget_high_u32(rows01.val[0]), vget_high_u32(rows23.val[0]));\n  vecs[3] =\n      vcombine_u32(vget_high_u32(rows01.val[1]), vget_high_u32(rows23.val[1]));\n}\n\nINLINE void transpose_msg_vecs4(const uint8_t *const *inputs,\n                                size_t block_offset, uint32x4_t out[16]) {\n  out[0] = loadu_128(&inputs[0][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[1] = loadu_128(&inputs[1][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[2] = loadu_128(&inputs[2][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[3] = loadu_128(&inputs[3][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[4] = loadu_128(&inputs[0][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[5] = loadu_128(&inputs[1][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[6] = loadu_128(&inputs[2][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[7] = loadu_128(&inputs[3][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[8] = loadu_128(&inputs[0][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[9] = loadu_128(&inputs[1][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[10] = loadu_128(&inputs[2][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[11] = loadu_128(&inputs[3][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[12] = loadu_128(&inputs[0][block_offset + 3 * sizeof(uint32x4_t)]);\n  out[13] = loadu_128(&inputs[1][block_offset + 3 * sizeof(uint32x4_t)]);\n  out[14] = loadu_128(&inputs[2][block_offset + 3 * sizeof(uint32x4_t)]);\n  out[15] = loadu_128(&inputs[3][block_offset + 3 * sizeof(uint32x4_t)]);\n  transpose_vecs_128(&out[0]);\n  transpose_vecs_128(&out[4]);\n  transpose_vecs_128(&out[8]);\n  transpose_vecs_128(&out[12]);\n}\n\nINLINE void load_counters4(uint64_t counter, bool increment_counter,\n                           uint32x4_t *out_low, uint32x4_t *out_high) {\n  uint64_t mask = (increment_counter ? ~0 : 0);\n  *out_low = set4(\n      counter_low(counter + (mask & 0)), counter_low(counter + (mask & 1)),\n      counter_low(counter + (mask & 2)), counter_low(counter + (mask & 3)));\n  *out_high = set4(\n      counter_high(counter + (mask & 0)), counter_high(counter + (mask & 1)),\n      counter_high(counter + (mask & 2)), counter_high(counter + (mask & 3)));\n}\n\nvoid blake3_hash4_neon(const uint8_t *const *inputs, size_t blocks,\n                       const uint32_t key[8], uint64_t counter,\n                       bool increment_counter, uint8_t flags,\n                       uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  uint32x4_t h_vecs[8] = {\n      set1_128(key[0]), set1_128(key[1]), set1_128(key[2]), set1_128(key[3]),\n      set1_128(key[4]), set1_128(key[5]), set1_128(key[6]), set1_128(key[7]),\n  };\n  uint32x4_t counter_low_vec, counter_high_vec;\n  load_counters4(counter, increment_counter, &counter_low_vec,\n                 &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    uint32x4_t block_len_vec = set1_128(BLAKE3_BLOCK_LEN);\n    uint32x4_t block_flags_vec = set1_128(block_flags);\n    uint32x4_t msg_vecs[16];\n    transpose_msg_vecs4(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    uint32x4_t v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],\n        set1_128(IV[0]), set1_128(IV[1]),  set1_128(IV[2]), set1_128(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,\n    };\n    round_fn4(v, msg_vecs, 0);\n    round_fn4(v, msg_vecs, 1);\n    round_fn4(v, msg_vecs, 2);\n    round_fn4(v, msg_vecs, 3);\n    round_fn4(v, msg_vecs, 4);\n    round_fn4(v, msg_vecs, 5);\n    round_fn4(v, msg_vecs, 6);\n    h_vecs[0] = xor_128(v[0], v[8]);\n    h_vecs[1] = xor_128(v[1], v[9]);\n    h_vecs[2] = xor_128(v[2], v[10]);\n    h_vecs[3] = xor_128(v[3], v[11]);\n    h_vecs[4] = xor_128(v[4], v[12]);\n    h_vecs[5] = xor_128(v[5], v[13]);\n    h_vecs[6] = xor_128(v[6], v[14]);\n    h_vecs[7] = xor_128(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs_128(&h_vecs[0]);\n  transpose_vecs_128(&h_vecs[4]);\n  // The first four vecs now contain the first half of each output, and the\n  // second four vecs contain the second half of each output.\n  storeu_128(h_vecs[0], &out[0 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[4], &out[1 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[1], &out[2 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[5], &out[3 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[2], &out[4 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[6], &out[5 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[3], &out[6 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[7], &out[7 * sizeof(uint32x4_t)]);\n}\n\n/*\n * ----------------------------------------------------------------------------\n * hash_many_neon\n * ----------------------------------------------------------------------------\n */\n\nvoid blake3_compress_in_place_portable(uint32_t cv[8],\n                                       const uint8_t block[BLAKE3_BLOCK_LEN],\n                                       uint8_t block_len, uint64_t counter,\n                                       uint8_t flags);\n\nINLINE void hash_one_neon(const uint8_t *input, size_t blocks,\n                          const uint32_t key[8], uint64_t counter,\n                          uint8_t flags, uint8_t flags_start, uint8_t flags_end,\n                          uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    // TODO: Implement compress_neon. However note that according to\n    // https://github.com/BLAKE2/BLAKE2/commit/7965d3e6e1b4193438b8d3a656787587d2579227,\n    // compress_neon might not be any faster than compress_portable.\n    blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                      block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  memcpy(out, cv, BLAKE3_OUT_LEN);\n}\n\nvoid blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out) {\n  while (num_inputs >= 4) {\n    blake3_hash4_neon(inputs, blocks, key, counter, increment_counter, flags,\n                      flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += 4;\n    }\n    inputs += 4;\n    num_inputs -= 4;\n    out = &out[4 * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs > 0) {\n    hash_one_neon(inputs[0], blocks, key, counter, flags, flags_start,\n                  flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_portable.c",
    "content": "#include \"blake3_impl.h\"\n#include <string.h>\n\nINLINE uint32_t rotr32(uint32_t w, uint32_t c) {\n  return (w >> c) | (w << (32 - c));\n}\n\nINLINE void g(uint32_t *state, size_t a, size_t b, size_t c, size_t d,\n              uint32_t x, uint32_t y) {\n  state[a] = state[a] + state[b] + x;\n  state[d] = rotr32(state[d] ^ state[a], 16);\n  state[c] = state[c] + state[d];\n  state[b] = rotr32(state[b] ^ state[c], 12);\n  state[a] = state[a] + state[b] + y;\n  state[d] = rotr32(state[d] ^ state[a], 8);\n  state[c] = state[c] + state[d];\n  state[b] = rotr32(state[b] ^ state[c], 7);\n}\n\nINLINE void round_fn(uint32_t state[16], const uint32_t *msg, size_t round) {\n  // Select the message schedule based on the round.\n  const uint8_t *schedule = MSG_SCHEDULE[round];\n\n  // Mix the columns.\n  g(state, 0, 4, 8, 12, msg[schedule[0]], msg[schedule[1]]);\n  g(state, 1, 5, 9, 13, msg[schedule[2]], msg[schedule[3]]);\n  g(state, 2, 6, 10, 14, msg[schedule[4]], msg[schedule[5]]);\n  g(state, 3, 7, 11, 15, msg[schedule[6]], msg[schedule[7]]);\n\n  // Mix the rows.\n  g(state, 0, 5, 10, 15, msg[schedule[8]], msg[schedule[9]]);\n  g(state, 1, 6, 11, 12, msg[schedule[10]], msg[schedule[11]]);\n  g(state, 2, 7, 8, 13, msg[schedule[12]], msg[schedule[13]]);\n  g(state, 3, 4, 9, 14, msg[schedule[14]], msg[schedule[15]]);\n}\n\nINLINE void compress_pre(uint32_t state[16], const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags) {\n  uint32_t block_words[16];\n  block_words[0] = load32(block + 4 * 0);\n  block_words[1] = load32(block + 4 * 1);\n  block_words[2] = load32(block + 4 * 2);\n  block_words[3] = load32(block + 4 * 3);\n  block_words[4] = load32(block + 4 * 4);\n  block_words[5] = load32(block + 4 * 5);\n  block_words[6] = load32(block + 4 * 6);\n  block_words[7] = load32(block + 4 * 7);\n  block_words[8] = load32(block + 4 * 8);\n  block_words[9] = load32(block + 4 * 9);\n  block_words[10] = load32(block + 4 * 10);\n  block_words[11] = load32(block + 4 * 11);\n  block_words[12] = load32(block + 4 * 12);\n  block_words[13] = load32(block + 4 * 13);\n  block_words[14] = load32(block + 4 * 14);\n  block_words[15] = load32(block + 4 * 15);\n\n  state[0] = cv[0];\n  state[1] = cv[1];\n  state[2] = cv[2];\n  state[3] = cv[3];\n  state[4] = cv[4];\n  state[5] = cv[5];\n  state[6] = cv[6];\n  state[7] = cv[7];\n  state[8] = IV[0];\n  state[9] = IV[1];\n  state[10] = IV[2];\n  state[11] = IV[3];\n  state[12] = counter_low(counter);\n  state[13] = counter_high(counter);\n  state[14] = (uint32_t)block_len;\n  state[15] = (uint32_t)flags;\n\n  round_fn(state, &block_words[0], 0);\n  round_fn(state, &block_words[0], 1);\n  round_fn(state, &block_words[0], 2);\n  round_fn(state, &block_words[0], 3);\n  round_fn(state, &block_words[0], 4);\n  round_fn(state, &block_words[0], 5);\n  round_fn(state, &block_words[0], 6);\n}\n\nvoid blake3_compress_in_place_portable(uint32_t cv[8],\n                                       const uint8_t block[BLAKE3_BLOCK_LEN],\n                                       uint8_t block_len, uint64_t counter,\n                                       uint8_t flags) {\n  uint32_t state[16];\n  compress_pre(state, cv, block, block_len, counter, flags);\n  cv[0] = state[0] ^ state[8];\n  cv[1] = state[1] ^ state[9];\n  cv[2] = state[2] ^ state[10];\n  cv[3] = state[3] ^ state[11];\n  cv[4] = state[4] ^ state[12];\n  cv[5] = state[5] ^ state[13];\n  cv[6] = state[6] ^ state[14];\n  cv[7] = state[7] ^ state[15];\n}\n\nvoid blake3_compress_xof_portable(const uint32_t cv[8],\n                                  const uint8_t block[BLAKE3_BLOCK_LEN],\n                                  uint8_t block_len, uint64_t counter,\n                                  uint8_t flags, uint8_t out[64]) {\n  uint32_t state[16];\n  compress_pre(state, cv, block, block_len, counter, flags);\n\n  store32(&out[0 * 4], state[0] ^ state[8]);\n  store32(&out[1 * 4], state[1] ^ state[9]);\n  store32(&out[2 * 4], state[2] ^ state[10]);\n  store32(&out[3 * 4], state[3] ^ state[11]);\n  store32(&out[4 * 4], state[4] ^ state[12]);\n  store32(&out[5 * 4], state[5] ^ state[13]);\n  store32(&out[6 * 4], state[6] ^ state[14]);\n  store32(&out[7 * 4], state[7] ^ state[15]);\n  store32(&out[8 * 4], state[8] ^ cv[0]);\n  store32(&out[9 * 4], state[9] ^ cv[1]);\n  store32(&out[10 * 4], state[10] ^ cv[2]);\n  store32(&out[11 * 4], state[11] ^ cv[3]);\n  store32(&out[12 * 4], state[12] ^ cv[4]);\n  store32(&out[13 * 4], state[13] ^ cv[5]);\n  store32(&out[14 * 4], state[14] ^ cv[6]);\n  store32(&out[15 * 4], state[15] ^ cv[7]);\n}\n\nINLINE void hash_one_portable(const uint8_t *input, size_t blocks,\n                              const uint32_t key[8], uint64_t counter,\n                              uint8_t flags, uint8_t flags_start,\n                              uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                      block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  store_cv_words(out, cv);\n}\n\nvoid blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs,\n                               size_t blocks, const uint32_t key[8],\n                               uint64_t counter, bool increment_counter,\n                               uint8_t flags, uint8_t flags_start,\n                               uint8_t flags_end, uint8_t *out) {\n  while (num_inputs > 0) {\n    hash_one_portable(inputs[0], blocks, key, counter, flags, flags_start,\n                      flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_sse2_x86-64_unix.S",
    "content": "#if defined(__ELF__) && defined(__linux__)\n.section .note.GNU-stack,\"\",%progbits\n#endif\n\n#if defined(__ELF__) && defined(__CET__) && defined(__has_include)\n#if __has_include(<cet.h>)\n#include <cet.h>\n#endif\n#endif\n\n#if !defined(_CET_ENDBR)\n#define _CET_ENDBR\n#endif\n\n.intel_syntax noprefix\n.global blake3_hash_many_sse2\n.global _blake3_hash_many_sse2\n.global blake3_compress_in_place_sse2\n.global _blake3_compress_in_place_sse2\n.global blake3_compress_xof_sse2\n.global _blake3_compress_xof_sse2\n#ifdef __APPLE__\n.text\n#else\n.section .text\n#endif\n        .p2align  6\n_blake3_hash_many_sse2:\nblake3_hash_many_sse2:\n        _CET_ENDBR\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 360\n        and     rsp, 0xFFFFFFFFFFFFFFC0\n        neg     r9d\n        movd    xmm0, r9d\n        pshufd  xmm0, xmm0, 0x00\n        movdqa  xmmword ptr [rsp+0x130], xmm0\n        movdqa  xmm1, xmm0\n        pand    xmm1, xmmword ptr [ADD0+rip]\n        pand    xmm0, xmmword ptr [ADD1+rip]\n        movdqa  xmmword ptr [rsp+0x150], xmm0\n        movd    xmm0, r8d\n        pshufd  xmm0, xmm0, 0x00\n        paddd   xmm0, xmm1\n        movdqa  xmmword ptr [rsp+0x110], xmm0\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK+rip]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK+rip]\n        pcmpgtd xmm1, xmm0\n        shr     r8, 32\n        movd    xmm2, r8d\n        pshufd  xmm2, xmm2, 0x00\n        psubd   xmm2, xmm1\n        movdqa  xmmword ptr [rsp+0x120], xmm2\n        mov     rbx, qword ptr [rbp+0x50]\n        mov     r15, rdx\n        shl     r15, 6\n        movzx   r13d, byte ptr [rbp+0x38]\n        movzx   r12d, byte ptr [rbp+0x48]\n        cmp     rsi, 4\n        jc      3f\n2:\n        movdqu  xmm3, xmmword ptr [rcx]\n        pshufd  xmm0, xmm3, 0x00\n        pshufd  xmm1, xmm3, 0x55\n        pshufd  xmm2, xmm3, 0xAA\n        pshufd  xmm3, xmm3, 0xFF\n        movdqu  xmm7, xmmword ptr [rcx+0x10]\n        pshufd  xmm4, xmm7, 0x00\n        pshufd  xmm5, xmm7, 0x55\n        pshufd  xmm6, xmm7, 0xAA\n        pshufd  xmm7, xmm7, 0xFF\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n9:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x40]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x40]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x40]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x40]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp], xmm8\n        movdqa  xmmword ptr [rsp+0x10], xmm9\n        movdqa  xmmword ptr [rsp+0x20], xmm12\n        movdqa  xmmword ptr [rsp+0x30], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x30]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x30]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x30]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x30]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0x40], xmm8\n        movdqa  xmmword ptr [rsp+0x50], xmm9\n        movdqa  xmmword ptr [rsp+0x60], xmm12\n        movdqa  xmmword ptr [rsp+0x70], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x20]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x20]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x20]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x20]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0x80], xmm8\n        movdqa  xmmword ptr [rsp+0x90], xmm9\n        movdqa  xmmword ptr [rsp+0xA0], xmm12\n        movdqa  xmmword ptr [rsp+0xB0], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x10]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x10]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x10]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x10]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0xC0], xmm8\n        movdqa  xmmword ptr [rsp+0xD0], xmm9\n        movdqa  xmmword ptr [rsp+0xE0], xmm12\n        movdqa  xmmword ptr [rsp+0xF0], xmm13\n        movdqa  xmm9, xmmword ptr [BLAKE3_IV_1+rip]\n        movdqa  xmm10, xmmword ptr [BLAKE3_IV_2+rip]\n        movdqa  xmm11, xmmword ptr [BLAKE3_IV_3+rip]\n        movdqa  xmm12, xmmword ptr [rsp+0x110]\n        movdqa  xmm13, xmmword ptr [rsp+0x120]\n        movdqa  xmm14, xmmword ptr [BLAKE3_BLOCK_LEN+rip]\n        movd    xmm15, eax\n        pshufd  xmm15, xmm15, 0x00\n        prefetcht0 [r8+rdx+0x80]\n        prefetcht0 [r9+rdx+0x80]\n        prefetcht0 [r10+rdx+0x80]\n        prefetcht0 [r11+rdx+0x80]\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+0x20]\n        paddd   xmm2, xmmword ptr [rsp+0x40]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [BLAKE3_IV_0+rip]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x10]\n        paddd   xmm1, xmmword ptr [rsp+0x30]\n        paddd   xmm2, xmmword ptr [rsp+0x50]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x80]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp+0xC0]\n        paddd   xmm3, xmmword ptr [rsp+0xE0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x90]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0xD0]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x20]\n        paddd   xmm1, xmmword ptr [rsp+0x30]\n        paddd   xmm2, xmmword ptr [rsp+0x70]\n        paddd   xmm3, xmmword ptr [rsp+0x40]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x60]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+0xD0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x10]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0x90]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xB0]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp+0xE0]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x30]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp+0xD0]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x40]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0x20]\n        paddd   xmm3, xmmword ptr [rsp+0xE0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x60]\n        paddd   xmm1, xmmword ptr [rsp+0x90]\n        paddd   xmm2, xmmword ptr [rsp+0xB0]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x50]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0xF0]\n        paddd   xmm3, xmmword ptr [rsp+0x10]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xA0]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0xE0]\n        paddd   xmm3, xmmword ptr [rsp+0xD0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x70]\n        paddd   xmm1, xmmword ptr [rsp+0x90]\n        paddd   xmm2, xmmword ptr [rsp+0x30]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x40]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0x50]\n        paddd   xmm3, xmmword ptr [rsp+0x10]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+0x20]\n        paddd   xmm2, xmmword ptr [rsp+0x80]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xC0]\n        paddd   xmm1, xmmword ptr [rsp+0x90]\n        paddd   xmm2, xmmword ptr [rsp+0xF0]\n        paddd   xmm3, xmmword ptr [rsp+0xE0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xD0]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0xA0]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x70]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x20]\n        paddd   xmm1, xmmword ptr [rsp+0x30]\n        paddd   xmm2, xmmword ptr [rsp+0x10]\n        paddd   xmm3, xmmword ptr [rsp+0x40]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x90]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0x80]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xE0]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp+0xC0]\n        paddd   xmm3, xmmword ptr [rsp+0x10]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xD0]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0x20]\n        paddd   xmm3, xmmword ptr [rsp+0x40]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x30]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp+0x60]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xB0]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp+0x10]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xF0]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0x90]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xE0]\n        paddd   xmm1, xmmword ptr [rsp+0x20]\n        paddd   xmm2, xmmword ptr [rsp+0x30]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0xB1\n        pshufhw xmm15, xmm15, 0xB1\n        pshuflw xmm12, xmm12, 0xB1\n        pshufhw xmm12, xmm12, 0xB1\n        pshuflw xmm13, xmm13, 0xB1\n        pshufhw xmm13, xmm13, 0xB1\n        pshuflw xmm14, xmm14, 0xB1\n        pshufhw xmm14, xmm14, 0xB1\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xA0]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0x40]\n        paddd   xmm3, xmmword ptr [rsp+0xD0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        pxor    xmm0, xmm8\n        pxor    xmm1, xmm9\n        pxor    xmm2, xmm10\n        pxor    xmm3, xmm11\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        pxor    xmm4, xmm12\n        pxor    xmm5, xmm13\n        pxor    xmm6, xmm14\n        pxor    xmm7, xmm15\n        mov     eax, r13d\n        jne     9b\n        movdqa  xmm9, xmm0\n        punpckldq xmm0, xmm1\n        punpckhdq xmm9, xmm1\n        movdqa  xmm11, xmm2\n        punpckldq xmm2, xmm3\n        punpckhdq xmm11, xmm3\n        movdqa  xmm1, xmm0\n        punpcklqdq xmm0, xmm2\n        punpckhqdq xmm1, xmm2\n        movdqa  xmm3, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm3, xmm11\n        movdqu  xmmword ptr [rbx], xmm0\n        movdqu  xmmword ptr [rbx+0x20], xmm1\n        movdqu  xmmword ptr [rbx+0x40], xmm9\n        movdqu  xmmword ptr [rbx+0x60], xmm3\n        movdqa  xmm9, xmm4\n        punpckldq xmm4, xmm5\n        punpckhdq xmm9, xmm5\n        movdqa  xmm11, xmm6\n        punpckldq xmm6, xmm7\n        punpckhdq xmm11, xmm7\n        movdqa  xmm5, xmm4\n        punpcklqdq xmm4, xmm6\n        punpckhqdq xmm5, xmm6\n        movdqa  xmm7, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm7, xmm11\n        movdqu  xmmword ptr [rbx+0x10], xmm4\n        movdqu  xmmword ptr [rbx+0x30], xmm5\n        movdqu  xmmword ptr [rbx+0x50], xmm9\n        movdqu  xmmword ptr [rbx+0x70], xmm7\n        movdqa  xmm1, xmmword ptr [rsp+0x110]\n        movdqa  xmm0, xmm1\n        paddd   xmm1, xmmword ptr [rsp+0x150]\n        movdqa  xmmword ptr [rsp+0x110], xmm1\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK+rip]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK+rip]\n        pcmpgtd xmm0, xmm1\n        movdqa  xmm1, xmmword ptr [rsp+0x120]\n        psubd   xmm1, xmm0\n        movdqa  xmmword ptr [rsp+0x120], xmm1\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\n        cmp     rsi, 4\n        jnc     2b\n        test    rsi, rsi\n        jnz     3f\n4:\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\n.p2align 5\n3:\n        test    esi, 0x2\n        je      3f\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+0x10]\n        movaps  xmm8, xmm0\n        movaps  xmm9, xmm1\n        movd    xmm13, dword ptr [rsp+0x110]\n        movd    xmm14, dword ptr [rsp+0x120]\n        punpckldq xmm13, xmm14\n        movaps  xmmword ptr [rsp], xmm13\n        movd    xmm14, dword ptr [rsp+0x114]\n        movd    xmm13, dword ptr [rsp+0x124]\n        punpckldq xmm14, xmm13\n        movaps  xmmword ptr [rsp+0x10], xmm14\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        movaps  xmm10, xmm2\n        movups  xmm4, xmmword ptr [r8+rdx-0x40]\n        movups  xmm5, xmmword ptr [r8+rdx-0x30]\n        movaps  xmm3, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm3, xmm5, 221\n        movaps  xmm5, xmm3\n        movups  xmm6, xmmword ptr [r8+rdx-0x20]\n        movups  xmm7, xmmword ptr [r8+rdx-0x10]\n        movaps  xmm3, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm3, xmm7, 221\n        pshufd  xmm7, xmm3, 0x93\n        movups  xmm12, xmmword ptr [r9+rdx-0x40]\n        movups  xmm13, xmmword ptr [r9+rdx-0x30]\n        movaps  xmm11, xmm12\n        shufps  xmm12, xmm13, 136\n        shufps  xmm11, xmm13, 221\n        movaps  xmm13, xmm11\n        movups  xmm14, xmmword ptr [r9+rdx-0x20]\n        movups  xmm15, xmmword ptr [r9+rdx-0x10]\n        movaps  xmm11, xmm14\n        shufps  xmm14, xmm15, 136\n        pshufd  xmm14, xmm14, 0x93\n        shufps  xmm11, xmm15, 221\n        pshufd  xmm15, xmm11, 0x93\n        shl     rax, 0x20\n        or      rax, 0x40\n        movq    xmm3, rax\n        movdqa  xmmword ptr [rsp+0x20], xmm3\n        movaps  xmm3, xmmword ptr [rsp]\n        movaps  xmm11, xmmword ptr [rsp+0x10]\n        punpcklqdq xmm3, xmmword ptr [rsp+0x20]\n        punpcklqdq xmm11, xmmword ptr [rsp+0x20]\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm8, xmm12\n        movaps  xmmword ptr [rsp+0x20], xmm4\n        movaps  xmmword ptr [rsp+0x30], xmm12\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        pshuflw xmm11, xmm11, 0xB1\n        pshufhw xmm11, xmm11, 0xB1\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm5\n        paddd   xmm8, xmm13\n        movaps  xmmword ptr [rsp+0x40], xmm5\n        movaps  xmmword ptr [rsp+0x50], xmm13\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movdqa  xmm13, xmm3\n        psrld   xmm3, 8\n        pslld   xmm13, 24\n        pxor    xmm3, xmm13\n        movdqa  xmm13, xmm11\n        psrld   xmm11, 8\n        pslld   xmm13, 24\n        pxor    xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm8, xmm8, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm11, xmm11, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        pshufd  xmm10, xmm10, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm8, xmm14\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        pshuflw xmm11, xmm11, 0xB1\n        pshufhw xmm11, xmm11, 0xB1\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm7\n        paddd   xmm8, xmm15\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movdqa  xmm13, xmm3\n        psrld   xmm3, 8\n        pslld   xmm13, 24\n        pxor    xmm3, xmm13\n        movdqa  xmm13, xmm11\n        psrld   xmm11, 8\n        pslld   xmm13, 24\n        pxor    xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm8, xmm8, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm11, xmm11, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        pshufd  xmm10, xmm10, 0x93\n        dec     al\n        je      9f\n        movdqa  xmm12, xmmword ptr [rsp+0x20]\n        movdqa  xmm5, xmmword ptr [rsp+0x40]\n        pshufd  xmm13, xmm12, 0x0F\n        shufps  xmm12, xmm5, 214\n        pshufd  xmm4, xmm12, 0x39\n        movdqa  xmm12, xmm6\n        shufps  xmm12, xmm7, 250\n        pand    xmm13, xmmword ptr [PBLENDW_0x33_MASK+rip]\n        pand    xmm12, xmmword ptr [PBLENDW_0xCC_MASK+rip]\n        por     xmm13, xmm12\n        movdqa  xmmword ptr [rsp+0x20], xmm13\n        movdqa  xmm12, xmm7\n        punpcklqdq xmm12, xmm5\n        movdqa  xmm13, xmm6\n        pand    xmm12, xmmword ptr [PBLENDW_0x3F_MASK+rip]\n        pand    xmm13, xmmword ptr [PBLENDW_0xC0_MASK+rip]\n        por     xmm12, xmm13\n        pshufd  xmm12, xmm12, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmmword ptr [rsp+0x40], xmm12\n        movdqa  xmm5, xmmword ptr [rsp+0x30]\n        movdqa  xmm13, xmmword ptr [rsp+0x50]\n        pshufd  xmm6, xmm5, 0x0F\n        shufps  xmm5, xmm13, 214\n        pshufd  xmm12, xmm5, 0x39\n        movdqa  xmm5, xmm14\n        shufps  xmm5, xmm15, 250\n        pand    xmm6, xmmword ptr [PBLENDW_0x33_MASK+rip]\n        pand    xmm5, xmmword ptr [PBLENDW_0xCC_MASK+rip]\n        por     xmm6, xmm5\n        movdqa  xmm5, xmm15\n        punpcklqdq xmm5, xmm13\n        movdqa  xmmword ptr [rsp+0x30], xmm2\n        movdqa  xmm2, xmm14\n        pand    xmm5, xmmword ptr [PBLENDW_0x3F_MASK+rip]\n        pand    xmm2, xmmword ptr [PBLENDW_0xC0_MASK+rip]\n        por     xmm5, xmm2\n        movdqa  xmm2, xmmword ptr [rsp+0x30]\n        pshufd  xmm5, xmm5, 0x78\n        punpckhdq xmm13, xmm15\n        punpckldq xmm14, xmm13\n        pshufd  xmm15, xmm14, 0x1E\n        movdqa  xmm13, xmm6\n        movdqa  xmm14, xmm5\n        movdqa  xmm5, xmmword ptr [rsp+0x20]\n        movdqa  xmm6, xmmword ptr [rsp+0x40]\n        jmp     9b\n9:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm8, xmm10\n        pxor    xmm9, xmm11\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+0x10], xmm1\n        movups  xmmword ptr [rbx+0x20], xmm8\n        movups  xmmword ptr [rbx+0x30], xmm9\n        mov     eax, dword ptr [rsp+0x130]\n        neg     eax\n        mov    r10d, dword ptr [rsp+0x110+8*rax]\n        mov    r11d, dword ptr [rsp+0x120+8*rax]\n        mov dword ptr [rsp+0x110], r10d\n        mov dword ptr [rsp+0x120], r11d\n        add     rdi, 16\n        add     rbx, 64\n        sub     rsi, 2\n3:\n        test    esi, 0x1\n        je      4b\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+0x10]\n        movd    xmm13, dword ptr [rsp+0x110]\n        movd    xmm14, dword ptr [rsp+0x120]\n        punpckldq xmm13, xmm14\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        shl     rax, 32\n        or      rax, 64\n        movq    xmm12, rax\n        movdqa  xmm3, xmm13\n        punpcklqdq xmm3, xmm12\n        movups  xmm4, xmmword ptr [r8+rdx-0x40]\n        movups  xmm5, xmmword ptr [r8+rdx-0x30]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [r8+rdx-0x20]\n        movups  xmm7, xmmword ptr [r8+rdx-0x10]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 0x93\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0x0F\n        pshufd  xmm4, xmm8, 0x39\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pand    xmm9, xmmword ptr [PBLENDW_0x33_MASK+rip]\n        pand    xmm8, xmmword ptr [PBLENDW_0xCC_MASK+rip]\n        por     xmm9, xmm8\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        movdqa  xmm10, xmm6\n        pand    xmm8, xmmword ptr [PBLENDW_0x3F_MASK+rip]\n        pand    xmm10, xmmword ptr [PBLENDW_0xC0_MASK+rip]\n        por     xmm8, xmm10\n        pshufd  xmm8, xmm8, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     9b\n9:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+0x10], xmm1\n        jmp     4b\n\n.p2align 6\nblake3_compress_in_place_sse2:\n_blake3_compress_in_place_sse2:\n        _CET_ENDBR\n        movups  xmm0, xmmword ptr [rdi]\n        movups  xmm1, xmmword ptr [rdi+0x10]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        shl     r8, 32\n        add     rdx, r8\n        movq    xmm3, rcx\n        movq    xmm4, rdx\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rsi]\n        movups  xmm5, xmmword ptr [rsi+0x10]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rsi+0x20]\n        movups  xmm7, xmmword ptr [rsi+0x30]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 0x93\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0x0F\n        pshufd  xmm4, xmm8, 0x39\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pand    xmm9, xmmword ptr [PBLENDW_0x33_MASK+rip]\n        pand    xmm8, xmmword ptr [PBLENDW_0xCC_MASK+rip]\n        por     xmm9, xmm8\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        movdqa  xmm10, xmm6\n        pand    xmm8, xmmword ptr [PBLENDW_0x3F_MASK+rip]\n        pand    xmm10, xmmword ptr [PBLENDW_0xC0_MASK+rip]\n        por     xmm8, xmm10\n        pshufd  xmm8, xmm8, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     9b\n9:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        movups  xmmword ptr [rdi], xmm0\n        movups  xmmword ptr [rdi+0x10], xmm1\n        ret\n\n.p2align 6\nblake3_compress_xof_sse2:\n_blake3_compress_xof_sse2:\n        _CET_ENDBR\n        movups  xmm0, xmmword ptr [rdi]\n        movups  xmm1, xmmword ptr [rdi+0x10]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        movzx   eax, r8b\n        movzx   edx, dl\n        shl     rax, 32\n        add     rdx, rax\n        movq    xmm3, rcx\n        movq    xmm4, rdx\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rsi]\n        movups  xmm5, xmmword ptr [rsi+0x10]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rsi+0x20]\n        movups  xmm7, xmmword ptr [rsi+0x30]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 0x93\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0xB1\n        pshufhw xmm3, xmm3, 0xB1\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0x0F\n        pshufd  xmm4, xmm8, 0x39\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pand    xmm9, xmmword ptr [PBLENDW_0x33_MASK+rip]\n        pand    xmm8, xmmword ptr [PBLENDW_0xCC_MASK+rip]\n        por     xmm9, xmm8\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        movdqa  xmm10, xmm6\n        pand    xmm8, xmmword ptr [PBLENDW_0x3F_MASK+rip]\n        pand    xmm10, xmmword ptr [PBLENDW_0xC0_MASK+rip]\n        por     xmm8, xmm10\n        pshufd  xmm8, xmm8, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     9b\n9:\n        movdqu  xmm4, xmmword ptr [rdi]\n        movdqu  xmm5, xmmword ptr [rdi+0x10]\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm2, xmm4\n        pxor    xmm3, xmm5\n        movups  xmmword ptr [r9], xmm0\n        movups  xmmword ptr [r9+0x10], xmm1\n        movups  xmmword ptr [r9+0x20], xmm2\n        movups  xmmword ptr [r9+0x30], xmm3\n        ret\n\n\n#ifdef __APPLE__\n.static_data\n#else\n.section .rodata\n#endif\n.p2align  6\nBLAKE3_IV:\n        .long  0x6A09E667, 0xBB67AE85\n        .long  0x3C6EF372, 0xA54FF53A\nADD0:\t\n        .long  0, 1, 2, 3\nADD1:\n\t.long  4, 4, 4, 4\nBLAKE3_IV_0:\n\t.long  0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667\nBLAKE3_IV_1:\n\t.long  0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85\nBLAKE3_IV_2:\n\t.long  0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372\nBLAKE3_IV_3:\n\t.long  0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A\nBLAKE3_BLOCK_LEN:\n\t.long  64, 64, 64, 64\nCMP_MSB_MASK:\n\t.long  0x80000000, 0x80000000, 0x80000000, 0x80000000\nPBLENDW_0x33_MASK:\n\t.long  0xFFFFFFFF, 0x00000000, 0xFFFFFFFF, 0x00000000\nPBLENDW_0xCC_MASK:\n\t.long  0x00000000, 0xFFFFFFFF, 0x00000000, 0xFFFFFFFF\nPBLENDW_0x3F_MASK:\n\t.long  0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x00000000\nPBLENDW_0xC0_MASK:\n\t.long  0x00000000, 0x00000000, 0x00000000, 0xFFFFFFFF\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_sse2_x86-64_windows_msvc.asm",
    "content": "public _blake3_hash_many_sse2\npublic blake3_hash_many_sse2\npublic blake3_compress_in_place_sse2\npublic _blake3_compress_in_place_sse2\npublic blake3_compress_xof_sse2\npublic _blake3_compress_xof_sse2\n\n_TEXT   SEGMENT ALIGN(16) 'CODE'\n\nALIGN   16\nblake3_hash_many_sse2 PROC\n_blake3_hash_many_sse2 PROC\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rsi\n        push    rdi\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 528\n        and     rsp, 0FFFFFFFFFFFFFFC0H\n        movdqa  xmmword ptr [rsp+170H], xmm6\n        movdqa  xmmword ptr [rsp+180H], xmm7\n        movdqa  xmmword ptr [rsp+190H], xmm8\n        movdqa  xmmword ptr [rsp+1A0H], xmm9\n        movdqa  xmmword ptr [rsp+1B0H], xmm10\n        movdqa  xmmword ptr [rsp+1C0H], xmm11\n        movdqa  xmmword ptr [rsp+1D0H], xmm12\n        movdqa  xmmword ptr [rsp+1E0H], xmm13\n        movdqa  xmmword ptr [rsp+1F0H], xmm14\n        movdqa  xmmword ptr [rsp+200H], xmm15\n        mov     rdi, rcx\n        mov     rsi, rdx\n        mov     rdx, r8\n        mov     rcx, r9\n        mov     r8, qword ptr [rbp+68H]\n        movzx   r9, byte ptr [rbp+70H]\n        neg     r9d\n        movd    xmm0, r9d\n        pshufd  xmm0, xmm0, 00H\n        movdqa  xmmword ptr [rsp+130H], xmm0\n        movdqa  xmm1, xmm0\n        pand    xmm1, xmmword ptr [ADD0]\n        pand    xmm0, xmmword ptr [ADD1]\n        movdqa  xmmword ptr [rsp+150H], xmm0\n        movd    xmm0, r8d\n        pshufd  xmm0, xmm0, 00H\n        paddd   xmm0, xmm1\n        movdqa  xmmword ptr [rsp+110H], xmm0\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK]\n        pcmpgtd xmm1, xmm0\n        shr     r8, 32\n        movd    xmm2, r8d\n        pshufd  xmm2, xmm2, 00H\n        psubd   xmm2, xmm1\n        movdqa  xmmword ptr [rsp+120H], xmm2\n        mov     rbx, qword ptr [rbp+90H]\n        mov     r15, rdx\n        shl     r15, 6\n        movzx   r13d, byte ptr [rbp+78H]\n        movzx   r12d, byte ptr [rbp+88H]\n        cmp     rsi, 4\n        jc      final3blocks\nouterloop4:\n        movdqu  xmm3, xmmword ptr [rcx]\n        pshufd  xmm0, xmm3, 00H\n        pshufd  xmm1, xmm3, 55H\n        pshufd  xmm2, xmm3, 0AAH\n        pshufd  xmm3, xmm3, 0FFH\n        movdqu  xmm7, xmmword ptr [rcx+10H]\n        pshufd  xmm4, xmm7, 00H\n        pshufd  xmm5, xmm7, 55H\n        pshufd  xmm6, xmm7, 0AAH\n        pshufd  xmm7, xmm7, 0FFH\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\ninnerloop4:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movdqu  xmm8, xmmword ptr [r8+rdx-40H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-40H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-40H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-40H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp], xmm8\n        movdqa  xmmword ptr [rsp+10H], xmm9\n        movdqa  xmmword ptr [rsp+20H], xmm12\n        movdqa  xmmword ptr [rsp+30H], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-30H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-30H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-30H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-30H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+40H], xmm8\n        movdqa  xmmword ptr [rsp+50H], xmm9\n        movdqa  xmmword ptr [rsp+60H], xmm12\n        movdqa  xmmword ptr [rsp+70H], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-20H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-20H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-20H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-20H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+80H], xmm8\n        movdqa  xmmword ptr [rsp+90H], xmm9\n        movdqa  xmmword ptr [rsp+0A0H], xmm12\n        movdqa  xmmword ptr [rsp+0B0H], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-10H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-10H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-10H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-10H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0C0H], xmm8\n        movdqa  xmmword ptr [rsp+0D0H], xmm9\n        movdqa  xmmword ptr [rsp+0E0H], xmm12\n        movdqa  xmmword ptr [rsp+0F0H], xmm13\n        movdqa  xmm9, xmmword ptr [BLAKE3_IV_1]\n        movdqa  xmm10, xmmword ptr [BLAKE3_IV_2]\n        movdqa  xmm11, xmmword ptr [BLAKE3_IV_3]\n        movdqa  xmm12, xmmword ptr [rsp+110H]\n        movdqa  xmm13, xmmword ptr [rsp+120H]\n        movdqa  xmm14, xmmword ptr [BLAKE3_BLOCK_LEN]\n        movd    xmm15, eax\n        pshufd  xmm15, xmm15, 00H\n        prefetcht0 byte ptr [r8+rdx+80H]\n        prefetcht0 byte ptr [r9+rdx+80H]\n        prefetcht0 byte ptr [r10+rdx+80H]\n        prefetcht0 byte ptr [r11+rdx+80H]\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+20H]\n        paddd   xmm2, xmmword ptr [rsp+40H]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [BLAKE3_IV_0]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+10H]\n        paddd   xmm1, xmmword ptr [rsp+30H]\n        paddd   xmm2, xmmword ptr [rsp+50H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+80H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp+0C0H]\n        paddd   xmm3, xmmword ptr [rsp+0E0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+90H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+0D0H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+20H]\n        paddd   xmm1, xmmword ptr [rsp+30H]\n        paddd   xmm2, xmmword ptr [rsp+70H]\n        paddd   xmm3, xmmword ptr [rsp+40H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+60H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+0D0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+10H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+90H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0B0H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp+0E0H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+30H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp+0D0H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+40H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+20H]\n        paddd   xmm3, xmmword ptr [rsp+0E0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+60H]\n        paddd   xmm1, xmmword ptr [rsp+90H]\n        paddd   xmm2, xmmword ptr [rsp+0B0H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+50H]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0F0H]\n        paddd   xmm3, xmmword ptr [rsp+10H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0A0H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+0E0H]\n        paddd   xmm3, xmmword ptr [rsp+0D0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+70H]\n        paddd   xmm1, xmmword ptr [rsp+90H]\n        paddd   xmm2, xmmword ptr [rsp+30H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+40H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+50H]\n        paddd   xmm3, xmmword ptr [rsp+10H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+20H]\n        paddd   xmm2, xmmword ptr [rsp+80H]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0C0H]\n        paddd   xmm1, xmmword ptr [rsp+90H]\n        paddd   xmm2, xmmword ptr [rsp+0F0H]\n        paddd   xmm3, xmmword ptr [rsp+0E0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0D0H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+0A0H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+70H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+20H]\n        paddd   xmm1, xmmword ptr [rsp+30H]\n        paddd   xmm2, xmmword ptr [rsp+10H]\n        paddd   xmm3, xmmword ptr [rsp+40H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+90H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+80H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0E0H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp+0C0H]\n        paddd   xmm3, xmmword ptr [rsp+10H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0D0H]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+20H]\n        paddd   xmm3, xmmword ptr [rsp+40H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+30H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp+60H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0B0H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp+10H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0F0H]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+90H]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0E0H]\n        paddd   xmm1, xmmword ptr [rsp+20H]\n        paddd   xmm2, xmmword ptr [rsp+30H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        pshuflw xmm15, xmm15, 0B1H\n        pshufhw xmm15, xmm15, 0B1H\n        pshuflw xmm12, xmm12, 0B1H\n        pshufhw xmm12, xmm12, 0B1H\n        pshuflw xmm13, xmm13, 0B1H\n        pshufhw xmm13, xmm13, 0B1H\n        pshuflw xmm14, xmm14, 0B1H\n        pshufhw xmm14, xmm14, 0B1H\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0A0H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+40H]\n        paddd   xmm3, xmmword ptr [rsp+0D0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmm15\n        psrld   xmm15, 8\n        pslld   xmm8, 24\n        pxor    xmm15, xmm8\n        movdqa  xmm8, xmm12\n        psrld   xmm12, 8\n        pslld   xmm8, 24\n        pxor    xmm12, xmm8\n        movdqa  xmm8, xmm13\n        psrld   xmm13, 8\n        pslld   xmm8, 24\n        pxor    xmm13, xmm8\n        movdqa  xmm8, xmm14\n        psrld   xmm14, 8\n        pslld   xmm8, 24\n        pxor    xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        pxor    xmm0, xmm8\n        pxor    xmm1, xmm9\n        pxor    xmm2, xmm10\n        pxor    xmm3, xmm11\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        pxor    xmm4, xmm12\n        pxor    xmm5, xmm13\n        pxor    xmm6, xmm14\n        pxor    xmm7, xmm15\n        mov     eax, r13d\n        jne     innerloop4\n        movdqa  xmm9, xmm0\n        punpckldq xmm0, xmm1\n        punpckhdq xmm9, xmm1\n        movdqa  xmm11, xmm2\n        punpckldq xmm2, xmm3\n        punpckhdq xmm11, xmm3\n        movdqa  xmm1, xmm0\n        punpcklqdq xmm0, xmm2\n        punpckhqdq xmm1, xmm2\n        movdqa  xmm3, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm3, xmm11\n        movdqu  xmmword ptr [rbx], xmm0\n        movdqu  xmmword ptr [rbx+20H], xmm1\n        movdqu  xmmword ptr [rbx+40H], xmm9\n        movdqu  xmmword ptr [rbx+60H], xmm3\n        movdqa  xmm9, xmm4\n        punpckldq xmm4, xmm5\n        punpckhdq xmm9, xmm5\n        movdqa  xmm11, xmm6\n        punpckldq xmm6, xmm7\n        punpckhdq xmm11, xmm7\n        movdqa  xmm5, xmm4\n        punpcklqdq xmm4, xmm6\n        punpckhqdq xmm5, xmm6\n        movdqa  xmm7, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm7, xmm11\n        movdqu  xmmword ptr [rbx+10H], xmm4\n        movdqu  xmmword ptr [rbx+30H], xmm5\n        movdqu  xmmword ptr [rbx+50H], xmm9\n        movdqu  xmmword ptr [rbx+70H], xmm7\n        movdqa  xmm1, xmmword ptr [rsp+110H]\n        movdqa  xmm0, xmm1\n        paddd   xmm1, xmmword ptr [rsp+150H]\n        movdqa  xmmword ptr [rsp+110H], xmm1\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK]\n        pcmpgtd xmm0, xmm1\n        movdqa  xmm1, xmmword ptr [rsp+120H]\n        psubd   xmm1, xmm0\n        movdqa  xmmword ptr [rsp+120H], xmm1\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\n        cmp     rsi, 4\n        jnc     outerloop4\n        test    rsi, rsi\n        jne     final3blocks\nunwind:\n        movdqa  xmm6, xmmword ptr [rsp+170H]\n        movdqa  xmm7, xmmword ptr [rsp+180H]\n        movdqa  xmm8, xmmword ptr [rsp+190H]\n        movdqa  xmm9, xmmword ptr [rsp+1A0H]\n        movdqa  xmm10, xmmword ptr [rsp+1B0H]\n        movdqa  xmm11, xmmword ptr [rsp+1C0H]\n        movdqa  xmm12, xmmword ptr [rsp+1D0H]\n        movdqa  xmm13, xmmword ptr [rsp+1E0H]\n        movdqa  xmm14, xmmword ptr [rsp+1F0H]\n        movdqa  xmm15, xmmword ptr [rsp+200H]\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     rdi\n        pop     rsi\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\nALIGN   16\nfinal3blocks:\n        test    esi, 2H\n        je      final1block\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movaps  xmm8, xmm0\n        movaps  xmm9, xmm1\n        movd    xmm13, dword ptr [rsp+110H]\n        movd    xmm14, dword ptr [rsp+120H]\n        punpckldq xmm13, xmm14\n        movaps  xmmword ptr [rsp], xmm13\n        movd    xmm14, dword ptr [rsp+114H]\n        movd    xmm13, dword ptr [rsp+124H]\n        punpckldq xmm14, xmm13\n        movaps  xmmword ptr [rsp+10H], xmm14\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\ninnerloop2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movaps  xmm10, xmm2\n        movups  xmm4, xmmword ptr [r8+rdx-40H]\n        movups  xmm5, xmmword ptr [r8+rdx-30H]\n        movaps  xmm3, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm3, xmm5, 221\n        movaps  xmm5, xmm3\n        movups  xmm6, xmmword ptr [r8+rdx-20H]\n        movups  xmm7, xmmword ptr [r8+rdx-10H]\n        movaps  xmm3, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm3, xmm7, 221\n        pshufd  xmm7, xmm3, 93H\n        movups  xmm12, xmmword ptr [r9+rdx-40H]\n        movups  xmm13, xmmword ptr [r9+rdx-30H]\n        movaps  xmm11, xmm12\n        shufps  xmm12, xmm13, 136\n        shufps  xmm11, xmm13, 221\n        movaps  xmm13, xmm11\n        movups  xmm14, xmmword ptr [r9+rdx-20H]\n        movups  xmm15, xmmword ptr [r9+rdx-10H]\n        movaps  xmm11, xmm14\n        shufps  xmm14, xmm15, 136\n        pshufd  xmm14, xmm14, 93H\n        shufps  xmm11, xmm15, 221\n        pshufd  xmm15, xmm11, 93H\n        shl     rax, 20H\n        or      rax, 40H\n        movd    xmm3, rax\n        movdqa  xmmword ptr [rsp+20H], xmm3\n        movaps  xmm3, xmmword ptr [rsp]\n        movaps  xmm11, xmmword ptr [rsp+10H]\n        punpcklqdq xmm3, xmmword ptr [rsp+20H]\n        punpcklqdq xmm11, xmmword ptr [rsp+20H]\n        mov     al, 7\nroundloop2:\n        paddd   xmm0, xmm4\n        paddd   xmm8, xmm12\n        movaps  xmmword ptr [rsp+20H], xmm4\n        movaps  xmmword ptr [rsp+30H], xmm12\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        pshuflw xmm11, xmm11, 0B1H\n        pshufhw xmm11, xmm11, 0B1H\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm5\n        paddd   xmm8, xmm13\n        movaps  xmmword ptr [rsp+40H], xmm5\n        movaps  xmmword ptr [rsp+50H], xmm13\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movdqa  xmm13, xmm3\n        psrld   xmm3, 8\n        pslld   xmm13, 24\n        pxor    xmm3, xmm13\n        movdqa  xmm13, xmm11\n        psrld   xmm11, 8\n        pslld   xmm13, 24\n        pxor    xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm8, xmm8, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm11, xmm11, 4EH\n        pshufd  xmm2, xmm2, 39H\n        pshufd  xmm10, xmm10, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm8, xmm14\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        pshuflw xmm11, xmm11, 0B1H\n        pshufhw xmm11, xmm11, 0B1H\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm7\n        paddd   xmm8, xmm15\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movdqa  xmm13, xmm3\n        psrld   xmm3, 8\n        pslld   xmm13, 24\n        pxor    xmm3, xmm13\n        movdqa  xmm13, xmm11\n        psrld   xmm11, 8\n        pslld   xmm13, 24\n        pxor    xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm8, xmm8, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm11, xmm11, 4EH\n        pshufd  xmm2, xmm2, 93H\n        pshufd  xmm10, xmm10, 93H\n        dec     al\n        je      endroundloop2\n        movdqa  xmm12, xmmword ptr [rsp+20H]\n        movdqa  xmm5, xmmword ptr [rsp+40H]\n        pshufd  xmm13, xmm12, 0FH\n        shufps  xmm12, xmm5, 214\n        pshufd  xmm4, xmm12, 39H\n        movdqa  xmm12, xmm6\n        shufps  xmm12, xmm7, 250\n        pand    xmm13, xmmword ptr [PBLENDW_0x33_MASK]\n        pand    xmm12, xmmword ptr [PBLENDW_0xCC_MASK]\n        por     xmm13, xmm12\n        movdqa  xmmword ptr [rsp+20H], xmm13\n        movdqa  xmm12, xmm7\n        punpcklqdq xmm12, xmm5\n        movdqa  xmm13, xmm6\n        pand    xmm12, xmmword ptr [PBLENDW_0x3F_MASK]\n        pand    xmm13, xmmword ptr [PBLENDW_0xC0_MASK]\n        por     xmm12, xmm13\n        pshufd  xmm12, xmm12, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmmword ptr [rsp+40H], xmm12\n        movdqa  xmm5, xmmword ptr [rsp+30H]\n        movdqa  xmm13, xmmword ptr [rsp+50H]\n        pshufd  xmm6, xmm5, 0FH\n        shufps  xmm5, xmm13, 214\n        pshufd  xmm12, xmm5, 39H\n        movdqa  xmm5, xmm14\n        shufps  xmm5, xmm15, 250\n        pand    xmm6, xmmword ptr [PBLENDW_0x33_MASK]\n        pand    xmm5, xmmword ptr [PBLENDW_0xCC_MASK]\n        por     xmm6, xmm5\n        movdqa  xmm5, xmm15\n        punpcklqdq xmm5, xmm13\n        movdqa  xmmword ptr [rsp+30H], xmm2\n        movdqa  xmm2, xmm14\n        pand    xmm5, xmmword ptr [PBLENDW_0x3F_MASK]\n        pand    xmm2, xmmword ptr [PBLENDW_0xC0_MASK]\n        por     xmm5, xmm2\n        movdqa  xmm2, xmmword ptr [rsp+30H]\n        pshufd  xmm5, xmm5, 78H\n        punpckhdq xmm13, xmm15\n        punpckldq xmm14, xmm13\n        pshufd  xmm15, xmm14, 1EH\n        movdqa  xmm13, xmm6\n        movdqa  xmm14, xmm5\n        movdqa  xmm5, xmmword ptr [rsp+20H]\n        movdqa  xmm6, xmmword ptr [rsp+40H]\n        jmp     roundloop2\nendroundloop2:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm8, xmm10\n        pxor    xmm9, xmm11\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop2\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+10H], xmm1\n        movups  xmmword ptr [rbx+20H], xmm8\n        movups  xmmword ptr [rbx+30H], xmm9\n        mov     eax, dword ptr [rsp+130H]\n        neg     eax\n        mov    r10d, dword ptr [rsp+110H+8*rax]\n        mov    r11d, dword ptr [rsp+120H+8*rax]\n        mov dword ptr [rsp+110H], r10d\n        mov dword ptr [rsp+120H], r11d\n        add     rdi, 16\n        add     rbx, 64\n        sub     rsi, 2\nfinal1block:\n        test    esi, 1H\n        je      unwind\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movd    xmm13, dword ptr [rsp+110H]\n        movd    xmm14, dword ptr [rsp+120H]\n        punpckldq xmm13, xmm14\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\ninnerloop1:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        shl     rax, 32\n        or      rax, 64\n        movd    xmm12, rax\n        movdqa  xmm3, xmm13\n        punpcklqdq xmm3, xmm12\n        movups  xmm4, xmmword ptr [r8+rdx-40H]\n        movups  xmm5, xmmword ptr [r8+rdx-30H]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [r8+rdx-20H]\n        movups  xmm7, xmmword ptr [r8+rdx-10H]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 93H\n        mov     al, 7\nroundloop1:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 93H\n        dec     al\n        jz      endroundloop1\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0FH\n        pshufd  xmm4, xmm8, 39H\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pand    xmm9, xmmword ptr [PBLENDW_0x33_MASK]\n        pand    xmm8, xmmword ptr [PBLENDW_0xCC_MASK]\n        por     xmm9, xmm8\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        movdqa  xmm10, xmm6\n        pand    xmm8, xmmword ptr [PBLENDW_0x3F_MASK]\n        pand    xmm10, xmmword ptr [PBLENDW_0xC0_MASK]\n        por     xmm8, xmm10\n        pshufd  xmm8, xmm8, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     roundloop1\nendroundloop1:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop1\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+10H], xmm1\n        jmp     unwind\n_blake3_hash_many_sse2 ENDP\nblake3_hash_many_sse2 ENDP\n\nblake3_compress_in_place_sse2 PROC\n_blake3_compress_in_place_sse2 PROC\n        sub     rsp, 120\n        movdqa  xmmword ptr [rsp], xmm6\n        movdqa  xmmword ptr [rsp+10H], xmm7\n        movdqa  xmmword ptr [rsp+20H], xmm8\n        movdqa  xmmword ptr [rsp+30H], xmm9\n        movdqa  xmmword ptr [rsp+40H], xmm11\n        movdqa  xmmword ptr [rsp+50H], xmm14\n        movdqa  xmmword ptr [rsp+60H], xmm15\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movzx   eax, byte ptr [rsp+0A0H]\n        movzx   r8d, r8b\n        shl     rax, 32\n        add     r8, rax\n        movd    xmm3, r9\n        movd    xmm4, r8\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rdx]\n        movups  xmm5, xmmword ptr [rdx+10H]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rdx+20H]\n        movups  xmm7, xmmword ptr [rdx+30H]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 93H\n        mov     al, 7\n@@:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 93H\n        dec     al\n        jz      @F\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0FH\n        pshufd  xmm4, xmm8, 39H\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pand    xmm9, xmmword ptr [PBLENDW_0x33_MASK]\n        pand    xmm8, xmmword ptr [PBLENDW_0xCC_MASK]\n        por     xmm9, xmm8\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        movdqa  xmm14, xmm6\n        pand    xmm8, xmmword ptr [PBLENDW_0x3F_MASK]\n        pand    xmm14, xmmword ptr [PBLENDW_0xC0_MASK]\n        por     xmm8, xmm14\n        pshufd  xmm8, xmm8, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     @B\n@@:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        movups  xmmword ptr [rcx], xmm0\n        movups  xmmword ptr [rcx+10H], xmm1\n        movdqa  xmm6, xmmword ptr [rsp]\n        movdqa  xmm7, xmmword ptr [rsp+10H]\n        movdqa  xmm8, xmmword ptr [rsp+20H]\n        movdqa  xmm9, xmmword ptr [rsp+30H]\n        movdqa  xmm11, xmmword ptr [rsp+40H]\n        movdqa  xmm14, xmmword ptr [rsp+50H]\n        movdqa  xmm15, xmmword ptr [rsp+60H]\n        add     rsp, 120\n        ret\n_blake3_compress_in_place_sse2 ENDP\nblake3_compress_in_place_sse2 ENDP\n\nALIGN 16\nblake3_compress_xof_sse2 PROC\n_blake3_compress_xof_sse2 PROC\n        sub     rsp, 120\n        movdqa  xmmword ptr [rsp], xmm6\n        movdqa  xmmword ptr [rsp+10H], xmm7\n        movdqa  xmmword ptr [rsp+20H], xmm8\n        movdqa  xmmword ptr [rsp+30H], xmm9\n        movdqa  xmmword ptr [rsp+40H], xmm11\n        movdqa  xmmword ptr [rsp+50H], xmm14\n        movdqa  xmmword ptr [rsp+60H], xmm15\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movzx   eax, byte ptr [rsp+0A0H]\n        movzx   r8d, r8b\n        mov     r10, qword ptr [rsp+0A8H]\n        shl     rax, 32\n        add     r8, rax\n        movd    xmm3, r9\n        movd    xmm4, r8\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rdx]\n        movups  xmm5, xmmword ptr [rdx+10H]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rdx+20H]\n        movups  xmm7, xmmword ptr [rdx+30H]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 93H\n        mov     al, 7\n@@:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshuflw xmm3, xmm3, 0B1H\n        pshufhw xmm3, xmm3, 0B1H\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        movdqa  xmm14, xmm3\n        psrld   xmm3, 8\n        pslld   xmm14, 24\n        pxor    xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 93H\n        dec     al\n        jz      @F\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0FH\n        pshufd  xmm4, xmm8, 39H\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pand    xmm9, xmmword ptr [PBLENDW_0x33_MASK]\n        pand    xmm8, xmmword ptr [PBLENDW_0xCC_MASK]\n        por     xmm9, xmm8\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        movdqa  xmm14, xmm6\n        pand    xmm8, xmmword ptr [PBLENDW_0x3F_MASK]\n        pand    xmm14, xmmword ptr [PBLENDW_0xC0_MASK]\n        por     xmm8, xmm14\n        pshufd  xmm8, xmm8, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     @B\n@@:\n        movdqu  xmm4, xmmword ptr [rcx]\n        movdqu  xmm5, xmmword ptr [rcx+10H]\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm2, xmm4\n        pxor    xmm3, xmm5\n        movups  xmmword ptr [r10], xmm0\n        movups  xmmword ptr [r10+10H], xmm1\n        movups  xmmword ptr [r10+20H], xmm2\n        movups  xmmword ptr [r10+30H], xmm3\n        movdqa  xmm6, xmmword ptr [rsp]\n        movdqa  xmm7, xmmword ptr [rsp+10H]\n        movdqa  xmm8, xmmword ptr [rsp+20H]\n        movdqa  xmm9, xmmword ptr [rsp+30H]\n        movdqa  xmm11, xmmword ptr [rsp+40H]\n        movdqa  xmm14, xmmword ptr [rsp+50H]\n        movdqa  xmm15, xmmword ptr [rsp+60H]\n        add     rsp, 120\n        ret\n_blake3_compress_xof_sse2 ENDP\nblake3_compress_xof_sse2 ENDP\n\n_TEXT ENDS\n\n\n_RDATA SEGMENT READONLY PAGE ALIAS(\".rdata\") 'CONST'\nALIGN   64\nBLAKE3_IV:\n        dd 6A09E667H, 0BB67AE85H, 3C6EF372H, 0A54FF53AH\n\nADD0:\n        dd 0, 1, 2, 3\n\nADD1:\n        dd 4 dup (4)\n\nBLAKE3_IV_0:\n        dd 4 dup (6A09E667H)\n\nBLAKE3_IV_1:\n        dd 4 dup (0BB67AE85H)\n\nBLAKE3_IV_2:\n        dd 4 dup (3C6EF372H)\n\nBLAKE3_IV_3:\n        dd 4 dup (0A54FF53AH)\n\nBLAKE3_BLOCK_LEN:\n        dd 4 dup (64)\n\nCMP_MSB_MASK:\n        dd 8 dup(80000000H)\n\nPBLENDW_0x33_MASK:\n       dd 0FFFFFFFFH, 000000000H, 0FFFFFFFFH, 000000000H\nPBLENDW_0xCC_MASK:\n       dd 000000000H, 0FFFFFFFFH, 000000000H, 0FFFFFFFFH\nPBLENDW_0x3F_MASK:\n\tdd 0FFFFFFFFH, 0FFFFFFFFH, 0FFFFFFFFH, 000000000H\nPBLENDW_0xC0_MASK:\n       dd 000000000H, 000000000H, 000000000H, 0FFFFFFFFH\n\n_RDATA ENDS\nEND\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_sse41_x86-64_unix.S",
    "content": "#if defined(__ELF__) && defined(__linux__)\n.section .note.GNU-stack,\"\",%progbits\n#endif\n\n#if defined(__ELF__) && defined(__CET__) && defined(__has_include)\n#if __has_include(<cet.h>)\n#include <cet.h>\n#endif\n#endif\n\n#if !defined(_CET_ENDBR)\n#define _CET_ENDBR\n#endif\n\n.intel_syntax noprefix\n.global blake3_hash_many_sse41\n.global _blake3_hash_many_sse41\n.global blake3_compress_in_place_sse41\n.global _blake3_compress_in_place_sse41\n.global blake3_compress_xof_sse41\n.global _blake3_compress_xof_sse41\n#ifdef __APPLE__\n.text\n#else\n.section .text\n#endif\n        .p2align  6\n_blake3_hash_many_sse41:\nblake3_hash_many_sse41:\n        _CET_ENDBR\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 360\n        and     rsp, 0xFFFFFFFFFFFFFFC0\n        neg     r9d\n        movd    xmm0, r9d\n        pshufd  xmm0, xmm0, 0x00\n        movdqa  xmmword ptr [rsp+0x130], xmm0\n        movdqa  xmm1, xmm0\n        pand    xmm1, xmmword ptr [ADD0+rip]\n        pand    xmm0, xmmword ptr [ADD1+rip]\n        movdqa  xmmword ptr [rsp+0x150], xmm0\n        movd    xmm0, r8d\n        pshufd  xmm0, xmm0, 0x00\n        paddd   xmm0, xmm1\n        movdqa  xmmword ptr [rsp+0x110], xmm0\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK+rip]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK+rip]\n        pcmpgtd xmm1, xmm0\n        shr     r8, 32\n        movd    xmm2, r8d\n        pshufd  xmm2, xmm2, 0x00\n        psubd   xmm2, xmm1\n        movdqa  xmmword ptr [rsp+0x120], xmm2\n        mov     rbx, qword ptr [rbp+0x50]\n        mov     r15, rdx\n        shl     r15, 6\n        movzx   r13d, byte ptr [rbp+0x38]\n        movzx   r12d, byte ptr [rbp+0x48]\n        cmp     rsi, 4\n        jc      3f\n2:\n        movdqu  xmm3, xmmword ptr [rcx]\n        pshufd  xmm0, xmm3, 0x00\n        pshufd  xmm1, xmm3, 0x55\n        pshufd  xmm2, xmm3, 0xAA\n        pshufd  xmm3, xmm3, 0xFF\n        movdqu  xmm7, xmmword ptr [rcx+0x10]\n        pshufd  xmm4, xmm7, 0x00\n        pshufd  xmm5, xmm7, 0x55\n        pshufd  xmm6, xmm7, 0xAA\n        pshufd  xmm7, xmm7, 0xFF\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        mov     r10, qword ptr [rdi+0x10]\n        mov     r11, qword ptr [rdi+0x18]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n9:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x40]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x40]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x40]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x40]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp], xmm8\n        movdqa  xmmword ptr [rsp+0x10], xmm9\n        movdqa  xmmword ptr [rsp+0x20], xmm12\n        movdqa  xmmword ptr [rsp+0x30], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x30]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x30]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x30]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x30]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0x40], xmm8\n        movdqa  xmmword ptr [rsp+0x50], xmm9\n        movdqa  xmmword ptr [rsp+0x60], xmm12\n        movdqa  xmmword ptr [rsp+0x70], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x20]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x20]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x20]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x20]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0x80], xmm8\n        movdqa  xmmword ptr [rsp+0x90], xmm9\n        movdqa  xmmword ptr [rsp+0xA0], xmm12\n        movdqa  xmmword ptr [rsp+0xB0], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-0x10]\n        movdqu  xmm9, xmmword ptr [r9+rdx-0x10]\n        movdqu  xmm10, xmmword ptr [r10+rdx-0x10]\n        movdqu  xmm11, xmmword ptr [r11+rdx-0x10]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0xC0], xmm8\n        movdqa  xmmword ptr [rsp+0xD0], xmm9\n        movdqa  xmmword ptr [rsp+0xE0], xmm12\n        movdqa  xmmword ptr [rsp+0xF0], xmm13\n        movdqa  xmm9, xmmword ptr [BLAKE3_IV_1+rip]\n        movdqa  xmm10, xmmword ptr [BLAKE3_IV_2+rip]\n        movdqa  xmm11, xmmword ptr [BLAKE3_IV_3+rip]\n        movdqa  xmm12, xmmword ptr [rsp+0x110]\n        movdqa  xmm13, xmmword ptr [rsp+0x120]\n        movdqa  xmm14, xmmword ptr [BLAKE3_BLOCK_LEN+rip]\n        movd    xmm15, eax\n        pshufd  xmm15, xmm15, 0x00\n        prefetcht0 [r8+rdx+0x80]\n        prefetcht0 [r9+rdx+0x80]\n        prefetcht0 [r10+rdx+0x80]\n        prefetcht0 [r11+rdx+0x80]\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+0x20]\n        paddd   xmm2, xmmword ptr [rsp+0x40]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [BLAKE3_IV_0+rip]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x10]\n        paddd   xmm1, xmmword ptr [rsp+0x30]\n        paddd   xmm2, xmmword ptr [rsp+0x50]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x80]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp+0xC0]\n        paddd   xmm3, xmmword ptr [rsp+0xE0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x90]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0xD0]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x20]\n        paddd   xmm1, xmmword ptr [rsp+0x30]\n        paddd   xmm2, xmmword ptr [rsp+0x70]\n        paddd   xmm3, xmmword ptr [rsp+0x40]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x60]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+0xD0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x10]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0x90]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xB0]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp+0xE0]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x30]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp+0xD0]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x40]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0x20]\n        paddd   xmm3, xmmword ptr [rsp+0xE0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x60]\n        paddd   xmm1, xmmword ptr [rsp+0x90]\n        paddd   xmm2, xmmword ptr [rsp+0xB0]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x50]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0xF0]\n        paddd   xmm3, xmmword ptr [rsp+0x10]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xA0]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0xE0]\n        paddd   xmm3, xmmword ptr [rsp+0xD0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x70]\n        paddd   xmm1, xmmword ptr [rsp+0x90]\n        paddd   xmm2, xmmword ptr [rsp+0x30]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x40]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0x50]\n        paddd   xmm3, xmmword ptr [rsp+0x10]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+0x20]\n        paddd   xmm2, xmmword ptr [rsp+0x80]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xC0]\n        paddd   xmm1, xmmword ptr [rsp+0x90]\n        paddd   xmm2, xmmword ptr [rsp+0xF0]\n        paddd   xmm3, xmmword ptr [rsp+0xE0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xD0]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0xA0]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x70]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x20]\n        paddd   xmm1, xmmword ptr [rsp+0x30]\n        paddd   xmm2, xmmword ptr [rsp+0x10]\n        paddd   xmm3, xmmword ptr [rsp+0x40]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x90]\n        paddd   xmm1, xmmword ptr [rsp+0xB0]\n        paddd   xmm2, xmmword ptr [rsp+0x80]\n        paddd   xmm3, xmmword ptr [rsp+0xF0]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xE0]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp+0xC0]\n        paddd   xmm3, xmmword ptr [rsp+0x10]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xD0]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0x20]\n        paddd   xmm3, xmmword ptr [rsp+0x40]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0x30]\n        paddd   xmm1, xmmword ptr [rsp+0xA0]\n        paddd   xmm2, xmmword ptr [rsp+0x60]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xB0]\n        paddd   xmm1, xmmword ptr [rsp+0x50]\n        paddd   xmm2, xmmword ptr [rsp+0x10]\n        paddd   xmm3, xmmword ptr [rsp+0x80]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xF0]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0x90]\n        paddd   xmm3, xmmword ptr [rsp+0x60]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xE0]\n        paddd   xmm1, xmmword ptr [rsp+0x20]\n        paddd   xmm2, xmmword ptr [rsp+0x30]\n        paddd   xmm3, xmmword ptr [rsp+0x70]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+0x100], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0xA0]\n        paddd   xmm1, xmmword ptr [rsp+0xC0]\n        paddd   xmm2, xmmword ptr [rsp+0x40]\n        paddd   xmm3, xmmword ptr [rsp+0xD0]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8+rip]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+0x100]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        pxor    xmm0, xmm8\n        pxor    xmm1, xmm9\n        pxor    xmm2, xmm10\n        pxor    xmm3, xmm11\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        pxor    xmm4, xmm12\n        pxor    xmm5, xmm13\n        pxor    xmm6, xmm14\n        pxor    xmm7, xmm15\n        mov     eax, r13d\n        jne     9b\n        movdqa  xmm9, xmm0\n        punpckldq xmm0, xmm1\n        punpckhdq xmm9, xmm1\n        movdqa  xmm11, xmm2\n        punpckldq xmm2, xmm3\n        punpckhdq xmm11, xmm3\n        movdqa  xmm1, xmm0\n        punpcklqdq xmm0, xmm2\n        punpckhqdq xmm1, xmm2\n        movdqa  xmm3, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm3, xmm11\n        movdqu  xmmword ptr [rbx], xmm0\n        movdqu  xmmword ptr [rbx+0x20], xmm1\n        movdqu  xmmword ptr [rbx+0x40], xmm9\n        movdqu  xmmword ptr [rbx+0x60], xmm3\n        movdqa  xmm9, xmm4\n        punpckldq xmm4, xmm5\n        punpckhdq xmm9, xmm5\n        movdqa  xmm11, xmm6\n        punpckldq xmm6, xmm7\n        punpckhdq xmm11, xmm7\n        movdqa  xmm5, xmm4\n        punpcklqdq xmm4, xmm6\n        punpckhqdq xmm5, xmm6\n        movdqa  xmm7, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm7, xmm11\n        movdqu  xmmword ptr [rbx+0x10], xmm4\n        movdqu  xmmword ptr [rbx+0x30], xmm5\n        movdqu  xmmword ptr [rbx+0x50], xmm9\n        movdqu  xmmword ptr [rbx+0x70], xmm7\n        movdqa  xmm1, xmmword ptr [rsp+0x110]\n        movdqa  xmm0, xmm1\n        paddd   xmm1, xmmword ptr [rsp+0x150]\n        movdqa  xmmword ptr [rsp+0x110], xmm1\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK+rip]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK+rip]\n        pcmpgtd xmm0, xmm1\n        movdqa  xmm1, xmmword ptr [rsp+0x120]\n        psubd   xmm1, xmm0\n        movdqa  xmmword ptr [rsp+0x120], xmm1\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\n        cmp     rsi, 4\n        jnc     2b\n        test    rsi, rsi\n        jnz     3f\n4:\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\n.p2align 5\n3:\n        test    esi, 0x2\n        je      3f\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+0x10]\n        movaps  xmm8, xmm0\n        movaps  xmm9, xmm1\n        movd    xmm13, dword ptr [rsp+0x110]\n        pinsrd  xmm13, dword ptr [rsp+0x120], 1\n        pinsrd  xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        movaps  xmmword ptr [rsp], xmm13\n        movd    xmm14, dword ptr [rsp+0x114]\n        pinsrd  xmm14, dword ptr [rsp+0x124], 1\n        pinsrd  xmm14, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        movaps  xmmword ptr [rsp+0x10], xmm14\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+0x8]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        movaps  xmm10, xmm2\n        movups  xmm4, xmmword ptr [r8+rdx-0x40]\n        movups  xmm5, xmmword ptr [r8+rdx-0x30]\n        movaps  xmm3, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm3, xmm5, 221\n        movaps  xmm5, xmm3\n        movups  xmm6, xmmword ptr [r8+rdx-0x20]\n        movups  xmm7, xmmword ptr [r8+rdx-0x10]\n        movaps  xmm3, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm3, xmm7, 221\n        pshufd  xmm7, xmm3, 0x93\n        movups  xmm12, xmmword ptr [r9+rdx-0x40]\n        movups  xmm13, xmmword ptr [r9+rdx-0x30]\n        movaps  xmm11, xmm12\n        shufps  xmm12, xmm13, 136\n        shufps  xmm11, xmm13, 221\n        movaps  xmm13, xmm11\n        movups  xmm14, xmmword ptr [r9+rdx-0x20]\n        movups  xmm15, xmmword ptr [r9+rdx-0x10]\n        movaps  xmm11, xmm14\n        shufps  xmm14, xmm15, 136\n        pshufd  xmm14, xmm14, 0x93\n        shufps  xmm11, xmm15, 221\n        pshufd  xmm15, xmm11, 0x93\n        movaps  xmm3, xmmword ptr [rsp]\n        movaps  xmm11, xmmword ptr [rsp+0x10]\n        pinsrd  xmm3, eax, 3\n        pinsrd  xmm11, eax, 3\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm8, xmm12\n        movaps  xmmword ptr [rsp+0x20], xmm4\n        movaps  xmmword ptr [rsp+0x30], xmm12\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movaps  xmm12, xmmword ptr [ROT16+rip]\n        pshufb  xmm3, xmm12\n        pshufb  xmm11, xmm12\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm5\n        paddd   xmm8, xmm13\n        movaps  xmmword ptr [rsp+0x40], xmm5\n        movaps  xmmword ptr [rsp+0x50], xmm13\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movaps  xmm13, xmmword ptr [ROT8+rip]\n        pshufb  xmm3, xmm13\n        pshufb  xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm8, xmm8, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm11, xmm11, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        pshufd  xmm10, xmm10, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm8, xmm14\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshufb  xmm3, xmm12\n        pshufb  xmm11, xmm12\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm7\n        paddd   xmm8, xmm15\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshufb  xmm3, xmm13\n        pshufb  xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm8, xmm8, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm11, xmm11, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        pshufd  xmm10, xmm10, 0x93\n        dec     al\n        je      9f\n        movdqa  xmm12, xmmword ptr [rsp+0x20]\n        movdqa  xmm5, xmmword ptr [rsp+0x40]\n        pshufd  xmm13, xmm12, 0x0F\n        shufps  xmm12, xmm5, 214\n        pshufd  xmm4, xmm12, 0x39\n        movdqa  xmm12, xmm6\n        shufps  xmm12, xmm7, 250\n        pblendw xmm13, xmm12, 0xCC\n        movdqa  xmm12, xmm7\n        punpcklqdq xmm12, xmm5\n        pblendw xmm12, xmm6, 0xC0\n        pshufd  xmm12, xmm12, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmmword ptr [rsp+0x20], xmm13\n        movdqa  xmmword ptr [rsp+0x40], xmm12\n        movdqa  xmm5, xmmword ptr [rsp+0x30]\n        movdqa  xmm13, xmmword ptr [rsp+0x50]\n        pshufd  xmm6, xmm5, 0x0F\n        shufps  xmm5, xmm13, 214\n        pshufd  xmm12, xmm5, 0x39\n        movdqa  xmm5, xmm14\n        shufps  xmm5, xmm15, 250\n        pblendw xmm6, xmm5, 0xCC\n        movdqa  xmm5, xmm15\n        punpcklqdq xmm5, xmm13\n        pblendw xmm5, xmm14, 0xC0\n        pshufd  xmm5, xmm5, 0x78\n        punpckhdq xmm13, xmm15\n        punpckldq xmm14, xmm13\n        pshufd  xmm15, xmm14, 0x1E\n        movdqa  xmm13, xmm6\n        movdqa  xmm14, xmm5\n        movdqa  xmm5, xmmword ptr [rsp+0x20]\n        movdqa  xmm6, xmmword ptr [rsp+0x40]\n        jmp     9b\n9:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm8, xmm10\n        pxor    xmm9, xmm11\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+0x10], xmm1\n        movups  xmmword ptr [rbx+0x20], xmm8\n        movups  xmmword ptr [rbx+0x30], xmm9\n        movdqa  xmm0, xmmword ptr [rsp+0x130]\n        movdqa  xmm1, xmmword ptr [rsp+0x110]\n        movdqa  xmm2, xmmword ptr [rsp+0x120]\n        movdqu  xmm3, xmmword ptr [rsp+0x118]\n        movdqu  xmm4, xmmword ptr [rsp+0x128]\n        blendvps xmm1, xmm3, xmm0\n        blendvps xmm2, xmm4, xmm0\n        movdqa  xmmword ptr [rsp+0x110], xmm1\n        movdqa  xmmword ptr [rsp+0x120], xmm2\n        add     rdi, 16\n        add     rbx, 64\n        sub     rsi, 2\n3:\n        test    esi, 0x1\n        je      4b\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+0x10]\n        movd    xmm13, dword ptr [rsp+0x110]\n        pinsrd  xmm13, dword ptr [rsp+0x120], 1\n        pinsrd  xmm13, dword ptr [BLAKE3_BLOCK_LEN+rip], 2\n        movaps  xmm14, xmmword ptr [ROT8+rip]\n        movaps  xmm15, xmmword ptr [ROT16+rip]\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+0x40]\n        or      eax, r13d\n        xor     edx, edx\n2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        movaps  xmm3, xmm13\n        pinsrd  xmm3, eax, 3\n        movups  xmm4, xmmword ptr [r8+rdx-0x40]\n        movups  xmm5, xmmword ptr [r8+rdx-0x30]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [r8+rdx-0x20]\n        movups  xmm7, xmmword ptr [r8+rdx-0x10]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 0x93\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0x0F\n        pshufd  xmm4, xmm8, 0x39\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pblendw xmm9, xmm8, 0xCC\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        pblendw xmm8, xmm6, 0xC0\n        pshufd  xmm8, xmm8, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     9b\n9:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     2b\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+0x10], xmm1\n        jmp     4b\n\n.p2align 6\nblake3_compress_in_place_sse41:\n_blake3_compress_in_place_sse41:\n        _CET_ENDBR\n        movups  xmm0, xmmword ptr [rdi]\n        movups  xmm1, xmmword ptr [rdi+0x10]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        shl     r8, 32\n        add     rdx, r8\n        movq    xmm3, rcx\n        movq    xmm4, rdx\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rsi]\n        movups  xmm5, xmmword ptr [rsi+0x10]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rsi+0x20]\n        movups  xmm7, xmmword ptr [rsi+0x30]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 0x93\n        movaps  xmm14, xmmword ptr [ROT8+rip]\n        movaps  xmm15, xmmword ptr [ROT16+rip]\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0x0F\n        pshufd  xmm4, xmm8, 0x39\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pblendw xmm9, xmm8, 0xCC\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        pblendw xmm8, xmm6, 0xC0\n        pshufd  xmm8, xmm8, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     9b\n9:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        movups  xmmword ptr [rdi], xmm0\n        movups  xmmword ptr [rdi+0x10], xmm1\n        ret\n\n.p2align 6\nblake3_compress_xof_sse41:\n_blake3_compress_xof_sse41:\n        _CET_ENDBR\n        movups  xmm0, xmmword ptr [rdi]\n        movups  xmm1, xmmword ptr [rdi+0x10]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV+rip]\n        movzx   eax, r8b\n        movzx   edx, dl\n        shl     rax, 32\n        add     rdx, rax\n        movq    xmm3, rcx\n        movq    xmm4, rdx\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rsi]\n        movups  xmm5, xmmword ptr [rsi+0x10]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rsi+0x20]\n        movups  xmm7, xmmword ptr [rsi+0x30]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 0x93\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 0x93\n        movaps  xmm14, xmmword ptr [ROT8+rip]\n        movaps  xmm15, xmmword ptr [ROT16+rip]\n        mov     al, 7\n9:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x93\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x39\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 0x39\n        pshufd  xmm3, xmm3, 0x4E\n        pshufd  xmm2, xmm2, 0x93\n        dec     al\n        jz      9f\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0x0F\n        pshufd  xmm4, xmm8, 0x39\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pblendw xmm9, xmm8, 0xCC\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        pblendw xmm8, xmm6, 0xC0\n        pshufd  xmm8, xmm8, 0x78\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 0x1E\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     9b\n9:\n        movdqu  xmm4, xmmword ptr [rdi]\n        movdqu  xmm5, xmmword ptr [rdi+0x10]\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm2, xmm4\n        pxor    xmm3, xmm5\n        movups  xmmword ptr [r9], xmm0\n        movups  xmmword ptr [r9+0x10], xmm1\n        movups  xmmword ptr [r9+0x20], xmm2\n        movups  xmmword ptr [r9+0x30], xmm3\n        ret\n\n\n#ifdef __APPLE__\n.static_data\n#else\n.section .rodata\n#endif\n.p2align  6\nBLAKE3_IV:\n        .long  0x6A09E667, 0xBB67AE85\n        .long  0x3C6EF372, 0xA54FF53A\nROT16:\n        .byte  2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13\nROT8:\n        .byte  1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12\nADD0:\t\n        .long  0, 1, 2, 3\nADD1:\n\t.long  4, 4, 4, 4\nBLAKE3_IV_0:\n\t.long  0x6A09E667, 0x6A09E667, 0x6A09E667, 0x6A09E667\nBLAKE3_IV_1:\n\t.long  0xBB67AE85, 0xBB67AE85, 0xBB67AE85, 0xBB67AE85\nBLAKE3_IV_2:\n\t.long  0x3C6EF372, 0x3C6EF372, 0x3C6EF372, 0x3C6EF372\nBLAKE3_IV_3:\n\t.long  0xA54FF53A, 0xA54FF53A, 0xA54FF53A, 0xA54FF53A\nBLAKE3_BLOCK_LEN:\n\t.long  64, 64, 64, 64\nCMP_MSB_MASK:\n\t.long  0x80000000, 0x80000000, 0x80000000, 0x80000000\n"
  },
  {
    "path": "src/third_party/blake3/asm/blake3_sse41_x86-64_windows_msvc.asm",
    "content": "public _blake3_hash_many_sse41\npublic blake3_hash_many_sse41\npublic blake3_compress_in_place_sse41\npublic _blake3_compress_in_place_sse41\npublic blake3_compress_xof_sse41\npublic _blake3_compress_xof_sse41\n\n_TEXT   SEGMENT ALIGN(16) 'CODE'\n\nALIGN   16\nblake3_hash_many_sse41 PROC\n_blake3_hash_many_sse41 PROC\n        push    r15\n        push    r14\n        push    r13\n        push    r12\n        push    rsi\n        push    rdi\n        push    rbx\n        push    rbp\n        mov     rbp, rsp\n        sub     rsp, 528\n        and     rsp, 0FFFFFFFFFFFFFFC0H\n        movdqa  xmmword ptr [rsp+170H], xmm6\n        movdqa  xmmword ptr [rsp+180H], xmm7\n        movdqa  xmmword ptr [rsp+190H], xmm8\n        movdqa  xmmword ptr [rsp+1A0H], xmm9\n        movdqa  xmmword ptr [rsp+1B0H], xmm10\n        movdqa  xmmword ptr [rsp+1C0H], xmm11\n        movdqa  xmmword ptr [rsp+1D0H], xmm12\n        movdqa  xmmword ptr [rsp+1E0H], xmm13\n        movdqa  xmmword ptr [rsp+1F0H], xmm14\n        movdqa  xmmword ptr [rsp+200H], xmm15\n        mov     rdi, rcx\n        mov     rsi, rdx\n        mov     rdx, r8\n        mov     rcx, r9\n        mov     r8, qword ptr [rbp+68H]\n        movzx   r9, byte ptr [rbp+70H]\n        neg     r9d\n        movd    xmm0, r9d\n        pshufd  xmm0, xmm0, 00H\n        movdqa  xmmword ptr [rsp+130H], xmm0\n        movdqa  xmm1, xmm0\n        pand    xmm1, xmmword ptr [ADD0]\n        pand    xmm0, xmmword ptr [ADD1]\n        movdqa  xmmword ptr [rsp+150H], xmm0\n        movd    xmm0, r8d\n        pshufd  xmm0, xmm0, 00H\n        paddd   xmm0, xmm1\n        movdqa  xmmword ptr [rsp+110H], xmm0\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK]\n        pcmpgtd xmm1, xmm0\n        shr     r8, 32\n        movd    xmm2, r8d\n        pshufd  xmm2, xmm2, 00H\n        psubd   xmm2, xmm1\n        movdqa  xmmword ptr [rsp+120H], xmm2\n        mov     rbx, qword ptr [rbp+90H]\n        mov     r15, rdx\n        shl     r15, 6\n        movzx   r13d, byte ptr [rbp+78H]\n        movzx   r12d, byte ptr [rbp+88H]\n        cmp     rsi, 4\n        jc      final3blocks\nouterloop4:\n        movdqu  xmm3, xmmword ptr [rcx]\n        pshufd  xmm0, xmm3, 00H\n        pshufd  xmm1, xmm3, 55H\n        pshufd  xmm2, xmm3, 0AAH\n        pshufd  xmm3, xmm3, 0FFH\n        movdqu  xmm7, xmmword ptr [rcx+10H]\n        pshufd  xmm4, xmm7, 00H\n        pshufd  xmm5, xmm7, 55H\n        pshufd  xmm6, xmm7, 0AAH\n        pshufd  xmm7, xmm7, 0FFH\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        mov     r10, qword ptr [rdi+10H]\n        mov     r11, qword ptr [rdi+18H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\ninnerloop4:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movdqu  xmm8, xmmword ptr [r8+rdx-40H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-40H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-40H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-40H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp], xmm8\n        movdqa  xmmword ptr [rsp+10H], xmm9\n        movdqa  xmmword ptr [rsp+20H], xmm12\n        movdqa  xmmword ptr [rsp+30H], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-30H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-30H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-30H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-30H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+40H], xmm8\n        movdqa  xmmword ptr [rsp+50H], xmm9\n        movdqa  xmmword ptr [rsp+60H], xmm12\n        movdqa  xmmword ptr [rsp+70H], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-20H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-20H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-20H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-20H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+80H], xmm8\n        movdqa  xmmword ptr [rsp+90H], xmm9\n        movdqa  xmmword ptr [rsp+0A0H], xmm12\n        movdqa  xmmword ptr [rsp+0B0H], xmm13\n        movdqu  xmm8, xmmword ptr [r8+rdx-10H]\n        movdqu  xmm9, xmmword ptr [r9+rdx-10H]\n        movdqu  xmm10, xmmword ptr [r10+rdx-10H]\n        movdqu  xmm11, xmmword ptr [r11+rdx-10H]\n        movdqa  xmm12, xmm8\n        punpckldq xmm8, xmm9\n        punpckhdq xmm12, xmm9\n        movdqa  xmm14, xmm10\n        punpckldq xmm10, xmm11\n        punpckhdq xmm14, xmm11\n        movdqa  xmm9, xmm8\n        punpcklqdq xmm8, xmm10\n        punpckhqdq xmm9, xmm10\n        movdqa  xmm13, xmm12\n        punpcklqdq xmm12, xmm14\n        punpckhqdq xmm13, xmm14\n        movdqa  xmmword ptr [rsp+0C0H], xmm8\n        movdqa  xmmword ptr [rsp+0D0H], xmm9\n        movdqa  xmmword ptr [rsp+0E0H], xmm12\n        movdqa  xmmword ptr [rsp+0F0H], xmm13\n        movdqa  xmm9, xmmword ptr [BLAKE3_IV_1]\n        movdqa  xmm10, xmmword ptr [BLAKE3_IV_2]\n        movdqa  xmm11, xmmword ptr [BLAKE3_IV_3]\n        movdqa  xmm12, xmmword ptr [rsp+110H]\n        movdqa  xmm13, xmmword ptr [rsp+120H]\n        movdqa  xmm14, xmmword ptr [BLAKE3_BLOCK_LEN]\n        movd    xmm15, eax\n        pshufd  xmm15, xmm15, 00H\n        prefetcht0 byte ptr [r8+rdx+80H]\n        prefetcht0 byte ptr [r9+rdx+80H]\n        prefetcht0 byte ptr [r10+rdx+80H]\n        prefetcht0 byte ptr [r11+rdx+80H]\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+20H]\n        paddd   xmm2, xmmword ptr [rsp+40H]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [BLAKE3_IV_0]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+10H]\n        paddd   xmm1, xmmword ptr [rsp+30H]\n        paddd   xmm2, xmmword ptr [rsp+50H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+80H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp+0C0H]\n        paddd   xmm3, xmmword ptr [rsp+0E0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+90H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+0D0H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+20H]\n        paddd   xmm1, xmmword ptr [rsp+30H]\n        paddd   xmm2, xmmword ptr [rsp+70H]\n        paddd   xmm3, xmmword ptr [rsp+40H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+60H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+0D0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+10H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+90H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0B0H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp+0E0H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+30H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp+0D0H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+40H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+20H]\n        paddd   xmm3, xmmword ptr [rsp+0E0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+60H]\n        paddd   xmm1, xmmword ptr [rsp+90H]\n        paddd   xmm2, xmmword ptr [rsp+0B0H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+50H]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+0F0H]\n        paddd   xmm3, xmmword ptr [rsp+10H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0A0H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+0E0H]\n        paddd   xmm3, xmmword ptr [rsp+0D0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+70H]\n        paddd   xmm1, xmmword ptr [rsp+90H]\n        paddd   xmm2, xmmword ptr [rsp+30H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+40H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+50H]\n        paddd   xmm3, xmmword ptr [rsp+10H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp]\n        paddd   xmm1, xmmword ptr [rsp+20H]\n        paddd   xmm2, xmmword ptr [rsp+80H]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0C0H]\n        paddd   xmm1, xmmword ptr [rsp+90H]\n        paddd   xmm2, xmmword ptr [rsp+0F0H]\n        paddd   xmm3, xmmword ptr [rsp+0E0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0D0H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+0A0H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+70H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+20H]\n        paddd   xmm1, xmmword ptr [rsp+30H]\n        paddd   xmm2, xmmword ptr [rsp+10H]\n        paddd   xmm3, xmmword ptr [rsp+40H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+90H]\n        paddd   xmm1, xmmword ptr [rsp+0B0H]\n        paddd   xmm2, xmmword ptr [rsp+80H]\n        paddd   xmm3, xmmword ptr [rsp+0F0H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0E0H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp+0C0H]\n        paddd   xmm3, xmmword ptr [rsp+10H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0D0H]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+20H]\n        paddd   xmm3, xmmword ptr [rsp+40H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+30H]\n        paddd   xmm1, xmmword ptr [rsp+0A0H]\n        paddd   xmm2, xmmword ptr [rsp+60H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0B0H]\n        paddd   xmm1, xmmword ptr [rsp+50H]\n        paddd   xmm2, xmmword ptr [rsp+10H]\n        paddd   xmm3, xmmword ptr [rsp+80H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0F0H]\n        paddd   xmm1, xmmword ptr [rsp]\n        paddd   xmm2, xmmword ptr [rsp+90H]\n        paddd   xmm3, xmmword ptr [rsp+60H]\n        paddd   xmm0, xmm4\n        paddd   xmm1, xmm5\n        paddd   xmm2, xmm6\n        paddd   xmm3, xmm7\n        pxor    xmm12, xmm0\n        pxor    xmm13, xmm1\n        pxor    xmm14, xmm2\n        pxor    xmm15, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        pshufb  xmm15, xmm8\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm12\n        paddd   xmm9, xmm13\n        paddd   xmm10, xmm14\n        paddd   xmm11, xmm15\n        pxor    xmm4, xmm8\n        pxor    xmm5, xmm9\n        pxor    xmm6, xmm10\n        pxor    xmm7, xmm11\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0E0H]\n        paddd   xmm1, xmmword ptr [rsp+20H]\n        paddd   xmm2, xmmword ptr [rsp+30H]\n        paddd   xmm3, xmmword ptr [rsp+70H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT16]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        movdqa  xmmword ptr [rsp+100H], xmm8\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 12\n        pslld   xmm5, 20\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 12\n        pslld   xmm6, 20\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 12\n        pslld   xmm7, 20\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 12\n        pslld   xmm4, 20\n        por     xmm4, xmm8\n        paddd   xmm0, xmmword ptr [rsp+0A0H]\n        paddd   xmm1, xmmword ptr [rsp+0C0H]\n        paddd   xmm2, xmmword ptr [rsp+40H]\n        paddd   xmm3, xmmword ptr [rsp+0D0H]\n        paddd   xmm0, xmm5\n        paddd   xmm1, xmm6\n        paddd   xmm2, xmm7\n        paddd   xmm3, xmm4\n        pxor    xmm15, xmm0\n        pxor    xmm12, xmm1\n        pxor    xmm13, xmm2\n        pxor    xmm14, xmm3\n        movdqa  xmm8, xmmword ptr [ROT8]\n        pshufb  xmm15, xmm8\n        pshufb  xmm12, xmm8\n        pshufb  xmm13, xmm8\n        pshufb  xmm14, xmm8\n        paddd   xmm10, xmm15\n        paddd   xmm11, xmm12\n        movdqa  xmm8, xmmword ptr [rsp+100H]\n        paddd   xmm8, xmm13\n        paddd   xmm9, xmm14\n        pxor    xmm5, xmm10\n        pxor    xmm6, xmm11\n        pxor    xmm7, xmm8\n        pxor    xmm4, xmm9\n        pxor    xmm0, xmm8\n        pxor    xmm1, xmm9\n        pxor    xmm2, xmm10\n        pxor    xmm3, xmm11\n        movdqa  xmm8, xmm5\n        psrld   xmm8, 7\n        pslld   xmm5, 25\n        por     xmm5, xmm8\n        movdqa  xmm8, xmm6\n        psrld   xmm8, 7\n        pslld   xmm6, 25\n        por     xmm6, xmm8\n        movdqa  xmm8, xmm7\n        psrld   xmm8, 7\n        pslld   xmm7, 25\n        por     xmm7, xmm8\n        movdqa  xmm8, xmm4\n        psrld   xmm8, 7\n        pslld   xmm4, 25\n        por     xmm4, xmm8\n        pxor    xmm4, xmm12\n        pxor    xmm5, xmm13\n        pxor    xmm6, xmm14\n        pxor    xmm7, xmm15\n        mov     eax, r13d\n        jne     innerloop4\n        movdqa  xmm9, xmm0\n        punpckldq xmm0, xmm1\n        punpckhdq xmm9, xmm1\n        movdqa  xmm11, xmm2\n        punpckldq xmm2, xmm3\n        punpckhdq xmm11, xmm3\n        movdqa  xmm1, xmm0\n        punpcklqdq xmm0, xmm2\n        punpckhqdq xmm1, xmm2\n        movdqa  xmm3, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm3, xmm11\n        movdqu  xmmword ptr [rbx], xmm0\n        movdqu  xmmword ptr [rbx+20H], xmm1\n        movdqu  xmmword ptr [rbx+40H], xmm9\n        movdqu  xmmword ptr [rbx+60H], xmm3\n        movdqa  xmm9, xmm4\n        punpckldq xmm4, xmm5\n        punpckhdq xmm9, xmm5\n        movdqa  xmm11, xmm6\n        punpckldq xmm6, xmm7\n        punpckhdq xmm11, xmm7\n        movdqa  xmm5, xmm4\n        punpcklqdq xmm4, xmm6\n        punpckhqdq xmm5, xmm6\n        movdqa  xmm7, xmm9\n        punpcklqdq xmm9, xmm11\n        punpckhqdq xmm7, xmm11\n        movdqu  xmmword ptr [rbx+10H], xmm4\n        movdqu  xmmword ptr [rbx+30H], xmm5\n        movdqu  xmmword ptr [rbx+50H], xmm9\n        movdqu  xmmword ptr [rbx+70H], xmm7\n        movdqa  xmm1, xmmword ptr [rsp+110H]\n        movdqa  xmm0, xmm1\n        paddd   xmm1, xmmword ptr [rsp+150H]\n        movdqa  xmmword ptr [rsp+110H], xmm1\n        pxor    xmm0, xmmword ptr [CMP_MSB_MASK]\n        pxor    xmm1, xmmword ptr [CMP_MSB_MASK]\n        pcmpgtd xmm0, xmm1\n        movdqa  xmm1, xmmword ptr [rsp+120H]\n        psubd   xmm1, xmm0\n        movdqa  xmmword ptr [rsp+120H], xmm1\n        add     rbx, 128\n        add     rdi, 32\n        sub     rsi, 4\n        cmp     rsi, 4\n        jnc     outerloop4\n        test    rsi, rsi\n        jne     final3blocks\nunwind:\n        movdqa  xmm6, xmmword ptr [rsp+170H]\n        movdqa  xmm7, xmmword ptr [rsp+180H]\n        movdqa  xmm8, xmmword ptr [rsp+190H]\n        movdqa  xmm9, xmmword ptr [rsp+1A0H]\n        movdqa  xmm10, xmmword ptr [rsp+1B0H]\n        movdqa  xmm11, xmmword ptr [rsp+1C0H]\n        movdqa  xmm12, xmmword ptr [rsp+1D0H]\n        movdqa  xmm13, xmmword ptr [rsp+1E0H]\n        movdqa  xmm14, xmmword ptr [rsp+1F0H]\n        movdqa  xmm15, xmmword ptr [rsp+200H]\n        mov     rsp, rbp\n        pop     rbp\n        pop     rbx\n        pop     rdi\n        pop     rsi\n        pop     r12\n        pop     r13\n        pop     r14\n        pop     r15\n        ret\nALIGN   16\nfinal3blocks:\n        test    esi, 2H\n        je      final1block\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movaps  xmm8, xmm0\n        movaps  xmm9, xmm1\n        movd    xmm13, dword ptr [rsp+110H]\n        pinsrd  xmm13, dword ptr [rsp+120H], 1\n        pinsrd  xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2\n        movaps  xmmword ptr [rsp], xmm13\n        movd    xmm14, dword ptr [rsp+114H]\n        pinsrd  xmm14, dword ptr [rsp+124H], 1\n        pinsrd  xmm14, dword ptr [BLAKE3_BLOCK_LEN], 2\n        movaps  xmmword ptr [rsp+10H], xmm14\n        mov     r8, qword ptr [rdi]\n        mov     r9, qword ptr [rdi+8H]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\ninnerloop2:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movaps  xmm10, xmm2\n        movups  xmm4, xmmword ptr [r8+rdx-40H]\n        movups  xmm5, xmmword ptr [r8+rdx-30H]\n        movaps  xmm3, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm3, xmm5, 221\n        movaps  xmm5, xmm3\n        movups  xmm6, xmmword ptr [r8+rdx-20H]\n        movups  xmm7, xmmword ptr [r8+rdx-10H]\n        movaps  xmm3, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm3, xmm7, 221\n        pshufd  xmm7, xmm3, 93H\n        movups  xmm12, xmmword ptr [r9+rdx-40H]\n        movups  xmm13, xmmword ptr [r9+rdx-30H]\n        movaps  xmm11, xmm12\n        shufps  xmm12, xmm13, 136\n        shufps  xmm11, xmm13, 221\n        movaps  xmm13, xmm11\n        movups  xmm14, xmmword ptr [r9+rdx-20H]\n        movups  xmm15, xmmword ptr [r9+rdx-10H]\n        movaps  xmm11, xmm14\n        shufps  xmm14, xmm15, 136\n        pshufd  xmm14, xmm14, 93H\n        shufps  xmm11, xmm15, 221\n        pshufd  xmm15, xmm11, 93H\n        movaps  xmm3, xmmword ptr [rsp]\n        movaps  xmm11, xmmword ptr [rsp+10H]\n        pinsrd  xmm3, eax, 3\n        pinsrd  xmm11, eax, 3\n        mov     al, 7\nroundloop2:\n        paddd   xmm0, xmm4\n        paddd   xmm8, xmm12\n        movaps  xmmword ptr [rsp+20H], xmm4\n        movaps  xmmword ptr [rsp+30H], xmm12\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movaps  xmm12, xmmword ptr [ROT16]\n        pshufb  xmm3, xmm12\n        pshufb  xmm11, xmm12\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm5\n        paddd   xmm8, xmm13\n        movaps  xmmword ptr [rsp+40H], xmm5\n        movaps  xmmword ptr [rsp+50H], xmm13\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        movaps  xmm13, xmmword ptr [ROT8]\n        pshufb  xmm3, xmm13\n        pshufb  xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm8, xmm8, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm11, xmm11, 4EH\n        pshufd  xmm2, xmm2, 39H\n        pshufd  xmm10, xmm10, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm8, xmm14\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshufb  xmm3, xmm12\n        pshufb  xmm11, xmm12\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 20\n        psrld   xmm4, 12\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 20\n        psrld   xmm4, 12\n        por     xmm9, xmm4\n        paddd   xmm0, xmm7\n        paddd   xmm8, xmm15\n        paddd   xmm0, xmm1\n        paddd   xmm8, xmm9\n        pxor    xmm3, xmm0\n        pxor    xmm11, xmm8\n        pshufb  xmm3, xmm13\n        pshufb  xmm11, xmm13\n        paddd   xmm2, xmm3\n        paddd   xmm10, xmm11\n        pxor    xmm1, xmm2\n        pxor    xmm9, xmm10\n        movdqa  xmm4, xmm1\n        pslld   xmm1, 25\n        psrld   xmm4, 7\n        por     xmm1, xmm4\n        movdqa  xmm4, xmm9\n        pslld   xmm9, 25\n        psrld   xmm4, 7\n        por     xmm9, xmm4\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm8, xmm8, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm11, xmm11, 4EH\n        pshufd  xmm2, xmm2, 93H\n        pshufd  xmm10, xmm10, 93H\n        dec     al\n        je      endroundloop2\n        movdqa  xmm12, xmmword ptr [rsp+20H]\n        movdqa  xmm5, xmmword ptr [rsp+40H]\n        pshufd  xmm13, xmm12, 0FH\n        shufps  xmm12, xmm5, 214\n        pshufd  xmm4, xmm12, 39H\n        movdqa  xmm12, xmm6\n        shufps  xmm12, xmm7, 250\n        pblendw xmm13, xmm12, 0CCH\n        movdqa  xmm12, xmm7\n        punpcklqdq xmm12, xmm5\n        pblendw xmm12, xmm6, 0C0H\n        pshufd  xmm12, xmm12, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmmword ptr [rsp+20H], xmm13\n        movdqa  xmmword ptr [rsp+40H], xmm12\n        movdqa  xmm5, xmmword ptr [rsp+30H]\n        movdqa  xmm13, xmmword ptr [rsp+50H]\n        pshufd  xmm6, xmm5, 0FH\n        shufps  xmm5, xmm13, 214\n        pshufd  xmm12, xmm5, 39H\n        movdqa  xmm5, xmm14\n        shufps  xmm5, xmm15, 250\n        pblendw xmm6, xmm5, 0CCH\n        movdqa  xmm5, xmm15\n        punpcklqdq xmm5, xmm13\n        pblendw xmm5, xmm14, 0C0H\n        pshufd  xmm5, xmm5, 78H\n        punpckhdq xmm13, xmm15\n        punpckldq xmm14, xmm13\n        pshufd  xmm15, xmm14, 1EH\n        movdqa  xmm13, xmm6\n        movdqa  xmm14, xmm5\n        movdqa  xmm5, xmmword ptr [rsp+20H]\n        movdqa  xmm6, xmmword ptr [rsp+40H]\n        jmp     roundloop2\nendroundloop2:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm8, xmm10\n        pxor    xmm9, xmm11\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop2\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+10H], xmm1\n        movups  xmmword ptr [rbx+20H], xmm8\n        movups  xmmword ptr [rbx+30H], xmm9\n        movdqa  xmm0, xmmword ptr [rsp+130H]\n        movdqa  xmm1, xmmword ptr [rsp+110H]\n        movdqa  xmm2, xmmword ptr [rsp+120H]\n        movdqu  xmm3, xmmword ptr [rsp+118H]\n        movdqu  xmm4, xmmword ptr [rsp+128H]\n        blendvps xmm1, xmm3, xmm0\n        blendvps xmm2, xmm4, xmm0\n        movdqa  xmmword ptr [rsp+110H], xmm1\n        movdqa  xmmword ptr [rsp+120H], xmm2\n        add     rdi, 16\n        add     rbx, 64\n        sub     rsi, 2\nfinal1block:\n        test    esi, 1H\n        je      unwind\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movd    xmm13, dword ptr [rsp+110H]\n        pinsrd  xmm13, dword ptr [rsp+120H], 1\n        pinsrd  xmm13, dword ptr [BLAKE3_BLOCK_LEN], 2\n        movaps  xmm14, xmmword ptr [ROT8]\n        movaps  xmm15, xmmword ptr [ROT16]\n        mov     r8, qword ptr [rdi]\n        movzx   eax, byte ptr [rbp+80H]\n        or      eax, r13d\n        xor     edx, edx\ninnerloop1:\n        mov     r14d, eax\n        or      eax, r12d\n        add     rdx, 64\n        cmp     rdx, r15\n        cmovne  eax, r14d\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movaps  xmm3, xmm13\n        pinsrd  xmm3, eax, 3\n        movups  xmm4, xmmword ptr [r8+rdx-40H]\n        movups  xmm5, xmmword ptr [r8+rdx-30H]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [r8+rdx-20H]\n        movups  xmm7, xmmword ptr [r8+rdx-10H]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 93H\n        mov     al, 7\nroundloop1:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 93H\n        dec     al\n        jz      endroundloop1\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0FH\n        pshufd  xmm4, xmm8, 39H\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pblendw xmm9, xmm8, 0CCH\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        pblendw xmm8, xmm6, 0C0H\n        pshufd  xmm8, xmm8, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     roundloop1\nendroundloop1:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        mov     eax, r13d\n        cmp     rdx, r15\n        jne     innerloop1\n        movups  xmmword ptr [rbx], xmm0\n        movups  xmmword ptr [rbx+10H], xmm1\n        jmp     unwind\n_blake3_hash_many_sse41 ENDP\nblake3_hash_many_sse41 ENDP\n\nblake3_compress_in_place_sse41 PROC\n_blake3_compress_in_place_sse41 PROC\n        sub     rsp, 120\n        movdqa  xmmword ptr [rsp], xmm6\n        movdqa  xmmword ptr [rsp+10H], xmm7\n        movdqa  xmmword ptr [rsp+20H], xmm8\n        movdqa  xmmword ptr [rsp+30H], xmm9\n        movdqa  xmmword ptr [rsp+40H], xmm11\n        movdqa  xmmword ptr [rsp+50H], xmm14\n        movdqa  xmmword ptr [rsp+60H], xmm15\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movzx   eax, byte ptr [rsp+0A0H]\n        movzx   r8d, r8b\n        shl     rax, 32\n        add     r8, rax\n        movd    xmm3, r9\n        movd    xmm4, r8\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rdx]\n        movups  xmm5, xmmword ptr [rdx+10H]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rdx+20H]\n        movups  xmm7, xmmword ptr [rdx+30H]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 93H\n        movaps  xmm14, xmmword ptr [ROT8]\n        movaps  xmm15, xmmword ptr [ROT16]\n        mov     al, 7\n@@:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 93H\n        dec     al\n        jz      @F\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0FH\n        pshufd  xmm4, xmm8, 39H\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pblendw xmm9, xmm8, 0CCH\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        pblendw xmm8, xmm6, 0C0H\n        pshufd  xmm8, xmm8, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     @B\n@@:\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        movups  xmmword ptr [rcx], xmm0\n        movups  xmmword ptr [rcx+10H], xmm1\n        movdqa  xmm6, xmmword ptr [rsp]\n        movdqa  xmm7, xmmword ptr [rsp+10H]\n        movdqa  xmm8, xmmword ptr [rsp+20H]\n        movdqa  xmm9, xmmword ptr [rsp+30H]\n        movdqa  xmm11, xmmword ptr [rsp+40H]\n        movdqa  xmm14, xmmword ptr [rsp+50H]\n        movdqa  xmm15, xmmword ptr [rsp+60H]\n        add     rsp, 120\n        ret\n_blake3_compress_in_place_sse41 ENDP\nblake3_compress_in_place_sse41 ENDP\n\nALIGN 16\nblake3_compress_xof_sse41 PROC\n_blake3_compress_xof_sse41 PROC\n        sub     rsp, 120\n        movdqa  xmmword ptr [rsp], xmm6\n        movdqa  xmmword ptr [rsp+10H], xmm7\n        movdqa  xmmword ptr [rsp+20H], xmm8\n        movdqa  xmmword ptr [rsp+30H], xmm9\n        movdqa  xmmword ptr [rsp+40H], xmm11\n        movdqa  xmmword ptr [rsp+50H], xmm14\n        movdqa  xmmword ptr [rsp+60H], xmm15\n        movups  xmm0, xmmword ptr [rcx]\n        movups  xmm1, xmmword ptr [rcx+10H]\n        movaps  xmm2, xmmword ptr [BLAKE3_IV]\n        movzx   eax, byte ptr [rsp+0A0H]\n        movzx   r8d, r8b\n        mov     r10, qword ptr [rsp+0A8H]\n        shl     rax, 32\n        add     r8, rax\n        movd    xmm3, r9\n        movd    xmm4, r8\n        punpcklqdq xmm3, xmm4\n        movups  xmm4, xmmword ptr [rdx]\n        movups  xmm5, xmmword ptr [rdx+10H]\n        movaps  xmm8, xmm4\n        shufps  xmm4, xmm5, 136\n        shufps  xmm8, xmm5, 221\n        movaps  xmm5, xmm8\n        movups  xmm6, xmmword ptr [rdx+20H]\n        movups  xmm7, xmmword ptr [rdx+30H]\n        movaps  xmm8, xmm6\n        shufps  xmm6, xmm7, 136\n        pshufd  xmm6, xmm6, 93H\n        shufps  xmm8, xmm7, 221\n        pshufd  xmm7, xmm8, 93H\n        movaps  xmm14, xmmword ptr [ROT8]\n        movaps  xmm15, xmmword ptr [ROT16]\n        mov     al, 7\n@@:\n        paddd   xmm0, xmm4\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm5\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 93H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 39H\n        paddd   xmm0, xmm6\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm15\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 20\n        psrld   xmm11, 12\n        por     xmm1, xmm11\n        paddd   xmm0, xmm7\n        paddd   xmm0, xmm1\n        pxor    xmm3, xmm0\n        pshufb  xmm3, xmm14\n        paddd   xmm2, xmm3\n        pxor    xmm1, xmm2\n        movdqa  xmm11, xmm1\n        pslld   xmm1, 25\n        psrld   xmm11, 7\n        por     xmm1, xmm11\n        pshufd  xmm0, xmm0, 39H\n        pshufd  xmm3, xmm3, 4EH\n        pshufd  xmm2, xmm2, 93H\n        dec     al\n        jz      @F\n        movdqa  xmm8, xmm4\n        shufps  xmm8, xmm5, 214\n        pshufd  xmm9, xmm4, 0FH\n        pshufd  xmm4, xmm8, 39H\n        movdqa  xmm8, xmm6\n        shufps  xmm8, xmm7, 250\n        pblendw xmm9, xmm8, 0CCH\n        movdqa  xmm8, xmm7\n        punpcklqdq xmm8, xmm5\n        pblendw xmm8, xmm6, 0C0H\n        pshufd  xmm8, xmm8, 78H\n        punpckhdq xmm5, xmm7\n        punpckldq xmm6, xmm5\n        pshufd  xmm7, xmm6, 1EH\n        movdqa  xmm5, xmm9\n        movdqa  xmm6, xmm8\n        jmp     @B\n@@:\n        movdqu  xmm4, xmmword ptr [rcx]\n        movdqu  xmm5, xmmword ptr [rcx+10H]\n        pxor    xmm0, xmm2\n        pxor    xmm1, xmm3\n        pxor    xmm2, xmm4\n        pxor    xmm3, xmm5\n        movups  xmmword ptr [r10], xmm0\n        movups  xmmword ptr [r10+10H], xmm1\n        movups  xmmword ptr [r10+20H], xmm2\n        movups  xmmword ptr [r10+30H], xmm3\n        movdqa  xmm6, xmmword ptr [rsp]\n        movdqa  xmm7, xmmword ptr [rsp+10H]\n        movdqa  xmm8, xmmword ptr [rsp+20H]\n        movdqa  xmm9, xmmword ptr [rsp+30H]\n        movdqa  xmm11, xmmword ptr [rsp+40H]\n        movdqa  xmm14, xmmword ptr [rsp+50H]\n        movdqa  xmm15, xmmword ptr [rsp+60H]\n        add     rsp, 120\n        ret\n_blake3_compress_xof_sse41 ENDP\nblake3_compress_xof_sse41 ENDP\n\n_TEXT ENDS\n\n\n_RDATA SEGMENT READONLY PAGE ALIAS(\".rdata\") 'CONST'\nALIGN   64\nBLAKE3_IV:\n        dd 6A09E667H, 0BB67AE85H, 3C6EF372H, 0A54FF53AH\n\nADD0:\n        dd 0, 1, 2, 3\n\nADD1:\n        dd 4 dup (4)\n\nBLAKE3_IV_0:\n        dd 4 dup (6A09E667H)\n\nBLAKE3_IV_1:\n        dd 4 dup (0BB67AE85H)\n\nBLAKE3_IV_2:\n        dd 4 dup (3C6EF372H)\n\nBLAKE3_IV_3:\n        dd 4 dup (0A54FF53AH)\n\nBLAKE3_BLOCK_LEN:\n        dd 4 dup (64)\n\nROT16:\n        db 2, 3, 0, 1, 6, 7, 4, 5, 10, 11, 8, 9, 14, 15, 12, 13\n\nROT8:\n        db 1, 2, 3, 0, 5, 6, 7, 4, 9, 10, 11, 8, 13, 14, 15, 12\n\nCMP_MSB_MASK:\n        dd 8 dup(80000000H)\n\n_RDATA ENDS\nEND\n\n"
  },
  {
    "path": "src/third_party/blake3/c/LICENSE",
    "content": "This work is released into the public domain with CC0 1.0. Alternatively, it is\nlicensed under the Apache License 2.0.\n\n-------------------------------------------------------------------------------\n\nCreative Commons Legal Code\n\nCC0 1.0 Universal\n\n    CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE\n    LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN\n    ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS\n    INFORMATION ON AN \"AS-IS\" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES\n    REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS\n    PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM\n    THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED\n    HEREUNDER.\n\nStatement of Purpose\n\nThe laws of most jurisdictions throughout the world automatically confer\nexclusive Copyright and Related Rights (defined below) upon the creator\nand subsequent owner(s) (each and all, an \"owner\") of an original work of\nauthorship and/or a database (each, a \"Work\").\n\nCertain owners wish to permanently relinquish those rights to a Work for\nthe purpose of contributing to a commons of creative, cultural and\nscientific works (\"Commons\") that the public can reliably and without fear\nof later claims of infringement build upon, modify, incorporate in other\nworks, reuse and redistribute as freely as possible in any form whatsoever\nand for any purposes, including without limitation commercial purposes.\nThese owners may contribute to the Commons to promote the ideal of a free\nculture and the further production of creative, cultural and scientific\nworks, or to gain reputation or greater distribution for their Work in\npart through the use and efforts of others.\n\nFor these and/or other purposes and motivations, and without any\nexpectation of additional consideration or compensation, the person\nassociating CC0 with a Work (the \"Affirmer\"), to the extent that he or she\nis an owner of Copyright and Related Rights in the Work, voluntarily\nelects to apply CC0 to the Work and publicly distribute the Work under its\nterms, with knowledge of his or her Copyright and Related Rights in the\nWork and the meaning and intended legal effect of CC0 on those rights.\n\n1. Copyright and Related Rights. A Work made available under CC0 may be\nprotected by copyright and related or neighboring rights (\"Copyright and\nRelated Rights\"). Copyright and Related Rights include, but are not\nlimited to, the following:\n\n  i. the right to reproduce, adapt, distribute, perform, display,\n     communicate, and translate a Work;\n ii. moral rights retained by the original author(s) and/or performer(s);\niii. publicity and privacy rights pertaining to a person's image or\n     likeness depicted in a Work;\n iv. rights protecting against unfair competition in regards to a Work,\n     subject to the limitations in paragraph 4(a), below;\n  v. rights protecting the extraction, dissemination, use and reuse of data\n     in a Work;\n vi. database rights (such as those arising under Directive 96/9/EC of the\n     European Parliament and of the Council of 11 March 1996 on the legal\n     protection of databases, and under any national implementation\n     thereof, including any amended or successor version of such\n     directive); and\nvii. other similar, equivalent or corresponding rights throughout the\n     world based on applicable law or treaty, and any national\n     implementations thereof.\n\n2. Waiver. To the greatest extent permitted by, but not in contravention\nof, applicable law, Affirmer hereby overtly, fully, permanently,\nirrevocably and unconditionally waives, abandons, and surrenders all of\nAffirmer's Copyright and Related Rights and associated claims and causes\nof action, whether now known or unknown (including existing as well as\nfuture claims and causes of action), in the Work (i) in all territories\nworldwide, (ii) for the maximum duration provided by applicable law or\ntreaty (including future time extensions), (iii) in any current or future\nmedium and for any number of copies, and (iv) for any purpose whatsoever,\nincluding without limitation commercial, advertising or promotional\npurposes (the \"Waiver\"). Affirmer makes the Waiver for the benefit of each\nmember of the public at large and to the detriment of Affirmer's heirs and\nsuccessors, fully intending that such Waiver shall not be subject to\nrevocation, rescission, cancellation, termination, or any other legal or\nequitable action to disrupt the quiet enjoyment of the Work by the public\nas contemplated by Affirmer's express Statement of Purpose.\n\n3. Public License Fallback. Should any part of the Waiver for any reason\nbe judged legally invalid or ineffective under applicable law, then the\nWaiver shall be preserved to the maximum extent permitted taking into\naccount Affirmer's express Statement of Purpose. In addition, to the\nextent the Waiver is so judged Affirmer hereby grants to each affected\nperson a royalty-free, non transferable, non sublicensable, non exclusive,\nirrevocable and unconditional license to exercise Affirmer's Copyright and\nRelated Rights in the Work (i) in all territories worldwide, (ii) for the\nmaximum duration provided by applicable law or treaty (including future\ntime extensions), (iii) in any current or future medium and for any number\nof copies, and (iv) for any purpose whatsoever, including without\nlimitation commercial, advertising or promotional purposes (the\n\"License\"). The License shall be deemed effective as of the date CC0 was\napplied by Affirmer to the Work. Should any part of the License for any\nreason be judged legally invalid or ineffective under applicable law, such\npartial invalidity or ineffectiveness shall not invalidate the remainder\nof the License, and in such case Affirmer hereby affirms that he or she\nwill not (i) exercise any of his or her remaining Copyright and Related\nRights in the Work or (ii) assert any associated claims and causes of\naction with respect to the Work, in either case contrary to Affirmer's\nexpress Statement of Purpose.\n\n4. Limitations and Disclaimers.\n\n a. No trademark or patent rights held by Affirmer are waived, abandoned,\n    surrendered, licensed or otherwise affected by this document.\n b. Affirmer offers the Work as-is and makes no representations or\n    warranties of any kind concerning the Work, express, implied,\n    statutory or otherwise, including without limitation warranties of\n    title, merchantability, fitness for a particular purpose, non\n    infringement, or the absence of latent or other defects, accuracy, or\n    the present or absence of errors, whether or not discoverable, all to\n    the greatest extent permissible under applicable law.\n c. Affirmer disclaims responsibility for clearing rights of other persons\n    that may apply to the Work or any use thereof, including without\n    limitation any person's Copyright and Related Rights in the Work.\n    Further, Affirmer disclaims responsibility for obtaining any necessary\n    consents, permissions or other rights required for any use of the\n    Work.\n d. Affirmer understands and acknowledges that Creative Commons is not a\n    party to this document and has no duty or obligation with respect to\n    this CC0 or use of the Work.\n\n-------------------------------------------------------------------------------\n\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2019 Jack O'Connor and Samuel Neves\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3.c",
    "content": "#include <assert.h>\n#include <stdbool.h>\n#include <string.h>\n\n#include \"blake3.h\"\n#include \"blake3_impl.h\"\n\nconst char *blake3_version(void) { return BLAKE3_VERSION_STRING; }\n\nINLINE void chunk_state_init(blake3_chunk_state *self, const uint32_t key[8],\n                             uint8_t flags) {\n  memcpy(self->cv, key, BLAKE3_KEY_LEN);\n  self->chunk_counter = 0;\n  memset(self->buf, 0, BLAKE3_BLOCK_LEN);\n  self->buf_len = 0;\n  self->blocks_compressed = 0;\n  self->flags = flags;\n}\n\nINLINE void chunk_state_reset(blake3_chunk_state *self, const uint32_t key[8],\n                              uint64_t chunk_counter) {\n  memcpy(self->cv, key, BLAKE3_KEY_LEN);\n  self->chunk_counter = chunk_counter;\n  self->blocks_compressed = 0;\n  memset(self->buf, 0, BLAKE3_BLOCK_LEN);\n  self->buf_len = 0;\n}\n\nINLINE size_t chunk_state_len(const blake3_chunk_state *self) {\n  return (BLAKE3_BLOCK_LEN * (size_t)self->blocks_compressed) +\n         ((size_t)self->buf_len);\n}\n\nINLINE size_t chunk_state_fill_buf(blake3_chunk_state *self,\n                                   const uint8_t *input, size_t input_len) {\n  size_t take = BLAKE3_BLOCK_LEN - ((size_t)self->buf_len);\n  if (take > input_len) {\n    take = input_len;\n  }\n  uint8_t *dest = self->buf + ((size_t)self->buf_len);\n  memcpy(dest, input, take);\n  self->buf_len += (uint8_t)take;\n  return take;\n}\n\nINLINE uint8_t chunk_state_maybe_start_flag(const blake3_chunk_state *self) {\n  if (self->blocks_compressed == 0) {\n    return CHUNK_START;\n  } else {\n    return 0;\n  }\n}\n\ntypedef struct {\n  uint32_t input_cv[8];\n  uint64_t counter;\n  uint8_t block[BLAKE3_BLOCK_LEN];\n  uint8_t block_len;\n  uint8_t flags;\n} output_t;\n\nINLINE output_t make_output(const uint32_t input_cv[8],\n                            const uint8_t block[BLAKE3_BLOCK_LEN],\n                            uint8_t block_len, uint64_t counter,\n                            uint8_t flags) {\n  output_t ret;\n  memcpy(ret.input_cv, input_cv, 32);\n  memcpy(ret.block, block, BLAKE3_BLOCK_LEN);\n  ret.block_len = block_len;\n  ret.counter = counter;\n  ret.flags = flags;\n  return ret;\n}\n\n// Chaining values within a given chunk (specifically the compress_in_place\n// interface) are represented as words. This avoids unnecessary bytes<->words\n// conversion overhead in the portable implementation. However, the hash_many\n// interface handles both user input and parent node blocks, so it accepts\n// bytes. For that reason, chaining values in the CV stack are represented as\n// bytes.\nINLINE void output_chaining_value(const output_t *self, uint8_t cv[32]) {\n  uint32_t cv_words[8];\n  memcpy(cv_words, self->input_cv, 32);\n  blake3_compress_in_place(cv_words, self->block, self->block_len,\n                           self->counter, self->flags);\n  store_cv_words(cv, cv_words);\n}\n\nINLINE void output_root_bytes(const output_t *self, uint64_t seek, uint8_t *out,\n                              size_t out_len) {\n  uint64_t output_block_counter = seek / 64;\n  size_t offset_within_block = seek % 64;\n  uint8_t wide_buf[64];\n  while (out_len > 0) {\n    blake3_compress_xof(self->input_cv, self->block, self->block_len,\n                        output_block_counter, self->flags | ROOT, wide_buf);\n    size_t available_bytes = 64 - offset_within_block;\n    size_t memcpy_len;\n    if (out_len > available_bytes) {\n      memcpy_len = available_bytes;\n    } else {\n      memcpy_len = out_len;\n    }\n    memcpy(out, wide_buf + offset_within_block, memcpy_len);\n    out += memcpy_len;\n    out_len -= memcpy_len;\n    output_block_counter += 1;\n    offset_within_block = 0;\n  }\n}\n\nINLINE void chunk_state_update(blake3_chunk_state *self, const uint8_t *input,\n                               size_t input_len) {\n  if (self->buf_len > 0) {\n    size_t take = chunk_state_fill_buf(self, input, input_len);\n    input += take;\n    input_len -= take;\n    if (input_len > 0) {\n      blake3_compress_in_place(\n          self->cv, self->buf, BLAKE3_BLOCK_LEN, self->chunk_counter,\n          self->flags | chunk_state_maybe_start_flag(self));\n      self->blocks_compressed += 1;\n      self->buf_len = 0;\n      memset(self->buf, 0, BLAKE3_BLOCK_LEN);\n    }\n  }\n\n  while (input_len > BLAKE3_BLOCK_LEN) {\n    blake3_compress_in_place(self->cv, input, BLAKE3_BLOCK_LEN,\n                             self->chunk_counter,\n                             self->flags | chunk_state_maybe_start_flag(self));\n    self->blocks_compressed += 1;\n    input += BLAKE3_BLOCK_LEN;\n    input_len -= BLAKE3_BLOCK_LEN;\n  }\n\n  size_t take = chunk_state_fill_buf(self, input, input_len);\n  input += take;\n  input_len -= take;\n}\n\nINLINE output_t chunk_state_output(const blake3_chunk_state *self) {\n  uint8_t block_flags =\n      self->flags | chunk_state_maybe_start_flag(self) | CHUNK_END;\n  return make_output(self->cv, self->buf, self->buf_len, self->chunk_counter,\n                     block_flags);\n}\n\nINLINE output_t parent_output(const uint8_t block[BLAKE3_BLOCK_LEN],\n                              const uint32_t key[8], uint8_t flags) {\n  return make_output(key, block, BLAKE3_BLOCK_LEN, 0, flags | PARENT);\n}\n\n// Given some input larger than one chunk, return the number of bytes that\n// should go in the left subtree. This is the largest power-of-2 number of\n// chunks that leaves at least 1 byte for the right subtree.\nINLINE size_t left_len(size_t content_len) {\n  // Subtract 1 to reserve at least one byte for the right side. content_len\n  // should always be greater than BLAKE3_CHUNK_LEN.\n  size_t full_chunks = (content_len - 1) / BLAKE3_CHUNK_LEN;\n  return round_down_to_power_of_2(full_chunks) * BLAKE3_CHUNK_LEN;\n}\n\n// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE chunks at the same time\n// on a single thread. Write out the chunk chaining values and return the\n// number of chunks hashed. These chunks are never the root and never empty;\n// those cases use a different codepath.\nINLINE size_t compress_chunks_parallel(const uint8_t *input, size_t input_len,\n                                       const uint32_t key[8],\n                                       uint64_t chunk_counter, uint8_t flags,\n                                       uint8_t *out) {\n#if defined(BLAKE3_TESTING)\n  assert(0 < input_len);\n  assert(input_len <= MAX_SIMD_DEGREE * BLAKE3_CHUNK_LEN);\n#endif\n\n  const uint8_t *chunks_array[MAX_SIMD_DEGREE];\n  size_t input_position = 0;\n  size_t chunks_array_len = 0;\n  while (input_len - input_position >= BLAKE3_CHUNK_LEN) {\n    chunks_array[chunks_array_len] = &input[input_position];\n    input_position += BLAKE3_CHUNK_LEN;\n    chunks_array_len += 1;\n  }\n\n  blake3_hash_many(chunks_array, chunks_array_len,\n                   BLAKE3_CHUNK_LEN / BLAKE3_BLOCK_LEN, key, chunk_counter,\n                   true, flags, CHUNK_START, CHUNK_END, out);\n\n  // Hash the remaining partial chunk, if there is one. Note that the empty\n  // chunk (meaning the empty message) is a different codepath.\n  if (input_len > input_position) {\n    uint64_t counter = chunk_counter + (uint64_t)chunks_array_len;\n    blake3_chunk_state chunk_state;\n    chunk_state_init(&chunk_state, key, flags);\n    chunk_state.chunk_counter = counter;\n    chunk_state_update(&chunk_state, &input[input_position],\n                       input_len - input_position);\n    output_t output = chunk_state_output(&chunk_state);\n    output_chaining_value(&output, &out[chunks_array_len * BLAKE3_OUT_LEN]);\n    return chunks_array_len + 1;\n  } else {\n    return chunks_array_len;\n  }\n}\n\n// Use SIMD parallelism to hash up to MAX_SIMD_DEGREE parents at the same time\n// on a single thread. Write out the parent chaining values and return the\n// number of parents hashed. (If there's an odd input chaining value left over,\n// return it as an additional output.) These parents are never the root and\n// never empty; those cases use a different codepath.\nINLINE size_t compress_parents_parallel(const uint8_t *child_chaining_values,\n                                        size_t num_chaining_values,\n                                        const uint32_t key[8], uint8_t flags,\n                                        uint8_t *out) {\n#if defined(BLAKE3_TESTING)\n  assert(2 <= num_chaining_values);\n  assert(num_chaining_values <= 2 * MAX_SIMD_DEGREE_OR_2);\n#endif\n\n  const uint8_t *parents_array[MAX_SIMD_DEGREE_OR_2];\n  size_t parents_array_len = 0;\n  while (num_chaining_values - (2 * parents_array_len) >= 2) {\n    parents_array[parents_array_len] =\n        &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN];\n    parents_array_len += 1;\n  }\n\n  blake3_hash_many(parents_array, parents_array_len, 1, key,\n                   0, // Parents always use counter 0.\n                   false, flags | PARENT,\n                   0, // Parents have no start flags.\n                   0, // Parents have no end flags.\n                   out);\n\n  // If there's an odd child left over, it becomes an output.\n  if (num_chaining_values > 2 * parents_array_len) {\n    memcpy(&out[parents_array_len * BLAKE3_OUT_LEN],\n           &child_chaining_values[2 * parents_array_len * BLAKE3_OUT_LEN],\n           BLAKE3_OUT_LEN);\n    return parents_array_len + 1;\n  } else {\n    return parents_array_len;\n  }\n}\n\n// The wide helper function returns (writes out) an array of chaining values\n// and returns the length of that array. The number of chaining values returned\n// is the dynamically detected SIMD degree, at most MAX_SIMD_DEGREE. Or fewer,\n// if the input is shorter than that many chunks. The reason for maintaining a\n// wide array of chaining values going back up the tree, is to allow the\n// implementation to hash as many parents in parallel as possible.\n//\n// As a special case when the SIMD degree is 1, this function will still return\n// at least 2 outputs. This guarantees that this function doesn't perform the\n// root compression. (If it did, it would use the wrong flags, and also we\n// wouldn't be able to implement extendable output.) Note that this function is\n// not used when the whole input is only 1 chunk long; that's a different\n// codepath.\n//\n// Why not just have the caller split the input on the first update(), instead\n// of implementing this special rule? Because we don't want to limit SIMD or\n// multi-threading parallelism for that update().\nstatic size_t blake3_compress_subtree_wide(const uint8_t *input,\n                                           size_t input_len,\n                                           const uint32_t key[8],\n                                           uint64_t chunk_counter,\n                                           uint8_t flags, uint8_t *out) {\n  // Note that the single chunk case does *not* bump the SIMD degree up to 2\n  // when it is 1. If this implementation adds multi-threading in the future,\n  // this gives us the option of multi-threading even the 2-chunk case, which\n  // can help performance on smaller platforms.\n  if (input_len <= blake3_simd_degree() * BLAKE3_CHUNK_LEN) {\n    return compress_chunks_parallel(input, input_len, key, chunk_counter, flags,\n                                    out);\n  }\n\n  // With more than simd_degree chunks, we need to recurse. Start by dividing\n  // the input into left and right subtrees. (Note that this is only optimal\n  // as long as the SIMD degree is a power of 2. If we ever get a SIMD degree\n  // of 3 or something, we'll need a more complicated strategy.)\n  size_t left_input_len = left_len(input_len);\n  size_t right_input_len = input_len - left_input_len;\n  const uint8_t *right_input = &input[left_input_len];\n  uint64_t right_chunk_counter =\n      chunk_counter + (uint64_t)(left_input_len / BLAKE3_CHUNK_LEN);\n\n  // Make space for the child outputs. Here we use MAX_SIMD_DEGREE_OR_2 to\n  // account for the special case of returning 2 outputs when the SIMD degree\n  // is 1.\n  uint8_t cv_array[2 * MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN];\n  size_t degree = blake3_simd_degree();\n  if (left_input_len > BLAKE3_CHUNK_LEN && degree == 1) {\n    // The special case: We always use a degree of at least two, to make\n    // sure there are two outputs. Except, as noted above, at the chunk\n    // level, where we allow degree=1. (Note that the 1-chunk-input case is\n    // a different codepath.)\n    degree = 2;\n  }\n  uint8_t *right_cvs = &cv_array[degree * BLAKE3_OUT_LEN];\n\n  // Recurse! If this implementation adds multi-threading support in the\n  // future, this is where it will go.\n  size_t left_n = blake3_compress_subtree_wide(input, left_input_len, key,\n                                               chunk_counter, flags, cv_array);\n  size_t right_n = blake3_compress_subtree_wide(\n      right_input, right_input_len, key, right_chunk_counter, flags, right_cvs);\n\n  // The special case again. If simd_degree=1, then we'll have left_n=1 and\n  // right_n=1. Rather than compressing them into a single output, return\n  // them directly, to make sure we always have at least two outputs.\n  if (left_n == 1) {\n    memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN);\n    return 2;\n  }\n\n  // Otherwise, do one layer of parent node compression.\n  size_t num_chaining_values = left_n + right_n;\n  return compress_parents_parallel(cv_array, num_chaining_values, key, flags,\n                                   out);\n}\n\n// Hash a subtree with compress_subtree_wide(), and then condense the resulting\n// list of chaining values down to a single parent node. Don't compress that\n// last parent node, however. Instead, return its message bytes (the\n// concatenated chaining values of its children). This is necessary when the\n// first call to update() supplies a complete subtree, because the topmost\n// parent node of that subtree could end up being the root. It's also necessary\n// for extended output in the general case.\n//\n// As with compress_subtree_wide(), this function is not used on inputs of 1\n// chunk or less. That's a different codepath.\nINLINE void compress_subtree_to_parent_node(\n    const uint8_t *input, size_t input_len, const uint32_t key[8],\n    uint64_t chunk_counter, uint8_t flags, uint8_t out[2 * BLAKE3_OUT_LEN]) {\n#if defined(BLAKE3_TESTING)\n  assert(input_len > BLAKE3_CHUNK_LEN);\n#endif\n\n  uint8_t cv_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN];\n  size_t num_cvs = blake3_compress_subtree_wide(input, input_len, key,\n                                                chunk_counter, flags, cv_array);\n  assert(num_cvs <= MAX_SIMD_DEGREE_OR_2);\n\n  // If MAX_SIMD_DEGREE is greater than 2 and there's enough input,\n  // compress_subtree_wide() returns more than 2 chaining values. Condense\n  // them into 2 by forming parent nodes repeatedly.\n  uint8_t out_array[MAX_SIMD_DEGREE_OR_2 * BLAKE3_OUT_LEN / 2];\n  // The second half of this loop condition is always true, and we just\n  // asserted it above. But GCC can't tell that it's always true, and if NDEBUG\n  // is set on platforms where MAX_SIMD_DEGREE_OR_2 == 2, GCC emits spurious\n  // warnings here. GCC 8.5 is particularly sensitive, so if you're changing\n  // this code, test it against that version.\n  while (num_cvs > 2 && num_cvs <= MAX_SIMD_DEGREE_OR_2) {\n    num_cvs =\n        compress_parents_parallel(cv_array, num_cvs, key, flags, out_array);\n    memcpy(cv_array, out_array, num_cvs * BLAKE3_OUT_LEN);\n  }\n  memcpy(out, cv_array, 2 * BLAKE3_OUT_LEN);\n}\n\nINLINE void hasher_init_base(blake3_hasher *self, const uint32_t key[8],\n                             uint8_t flags) {\n  memcpy(self->key, key, BLAKE3_KEY_LEN);\n  chunk_state_init(&self->chunk, key, flags);\n  self->cv_stack_len = 0;\n}\n\nvoid blake3_hasher_init(blake3_hasher *self) { hasher_init_base(self, IV, 0); }\n\nvoid blake3_hasher_init_keyed(blake3_hasher *self,\n                              const uint8_t key[BLAKE3_KEY_LEN]) {\n  uint32_t key_words[8];\n  load_key_words(key, key_words);\n  hasher_init_base(self, key_words, KEYED_HASH);\n}\n\nvoid blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context,\n                                       size_t context_len) {\n  blake3_hasher context_hasher;\n  hasher_init_base(&context_hasher, IV, DERIVE_KEY_CONTEXT);\n  blake3_hasher_update(&context_hasher, context, context_len);\n  uint8_t context_key[BLAKE3_KEY_LEN];\n  blake3_hasher_finalize(&context_hasher, context_key, BLAKE3_KEY_LEN);\n  uint32_t context_key_words[8];\n  load_key_words(context_key, context_key_words);\n  hasher_init_base(self, context_key_words, DERIVE_KEY_MATERIAL);\n}\n\nvoid blake3_hasher_init_derive_key(blake3_hasher *self, const char *context) {\n  blake3_hasher_init_derive_key_raw(self, context, strlen(context));\n}\n\n// As described in hasher_push_cv() below, we do \"lazy merging\", delaying\n// merges until right before the next CV is about to be added. This is\n// different from the reference implementation. Another difference is that we\n// aren't always merging 1 chunk at a time. Instead, each CV might represent\n// any power-of-two number of chunks, as long as the smaller-above-larger stack\n// order is maintained. Instead of the \"count the trailing 0-bits\" algorithm\n// described in the spec, we use a \"count the total number of 1-bits\" variant\n// that doesn't require us to retain the subtree size of the CV on top of the\n// stack. The principle is the same: each CV that should remain in the stack is\n// represented by a 1-bit in the total number of chunks (or bytes) so far.\nINLINE void hasher_merge_cv_stack(blake3_hasher *self, uint64_t total_len) {\n  size_t post_merge_stack_len = (size_t)popcnt(total_len);\n  while (self->cv_stack_len > post_merge_stack_len) {\n    uint8_t *parent_node =\n        &self->cv_stack[(self->cv_stack_len - 2) * BLAKE3_OUT_LEN];\n    output_t output = parent_output(parent_node, self->key, self->chunk.flags);\n    output_chaining_value(&output, parent_node);\n    self->cv_stack_len -= 1;\n  }\n}\n\n// In reference_impl.rs, we merge the new CV with existing CVs from the stack\n// before pushing it. We can do that because we know more input is coming, so\n// we know none of the merges are root.\n//\n// This setting is different. We want to feed as much input as possible to\n// compress_subtree_wide(), without setting aside anything for the chunk_state.\n// If the user gives us 64 KiB, we want to parallelize over all 64 KiB at once\n// as a single subtree, if at all possible.\n//\n// This leads to two problems:\n// 1) This 64 KiB input might be the only call that ever gets made to update.\n//    In this case, the root node of the 64 KiB subtree would be the root node\n//    of the whole tree, and it would need to be ROOT finalized. We can't\n//    compress it until we know.\n// 2) This 64 KiB input might complete a larger tree, whose root node is\n//    similarly going to be the the root of the whole tree. For example, maybe\n//    we have 196 KiB (that is, 128 + 64) hashed so far. We can't compress the\n//    node at the root of the 256 KiB subtree until we know how to finalize it.\n//\n// The second problem is solved with \"lazy merging\". That is, when we're about\n// to add a CV to the stack, we don't merge it with anything first, as the\n// reference impl does. Instead we do merges using the *previous* CV that was\n// added, which is sitting on top of the stack, and we put the new CV\n// (unmerged) on top of the stack afterwards. This guarantees that we never\n// merge the root node until finalize().\n//\n// Solving the first problem requires an additional tool,\n// compress_subtree_to_parent_node(). That function always returns the top\n// *two* chaining values of the subtree it's compressing. We then do lazy\n// merging with each of them separately, so that the second CV will always\n// remain unmerged. (That also helps us support extendable output when we're\n// hashing an input all-at-once.)\nINLINE void hasher_push_cv(blake3_hasher *self, uint8_t new_cv[BLAKE3_OUT_LEN],\n                           uint64_t chunk_counter) {\n  hasher_merge_cv_stack(self, chunk_counter);\n  memcpy(&self->cv_stack[self->cv_stack_len * BLAKE3_OUT_LEN], new_cv,\n         BLAKE3_OUT_LEN);\n  self->cv_stack_len += 1;\n}\n\nvoid blake3_hasher_update(blake3_hasher *self, const void *input,\n                          size_t input_len) {\n  // Explicitly checking for zero avoids causing UB by passing a null pointer\n  // to memcpy. This comes up in practice with things like:\n  //   std::vector<uint8_t> v;\n  //   blake3_hasher_update(&hasher, v.data(), v.size());\n  if (input_len == 0) {\n    return;\n  }\n\n  const uint8_t *input_bytes = (const uint8_t *)input;\n\n  // If we have some partial chunk bytes in the internal chunk_state, we need\n  // to finish that chunk first.\n  if (chunk_state_len(&self->chunk) > 0) {\n    size_t take = BLAKE3_CHUNK_LEN - chunk_state_len(&self->chunk);\n    if (take > input_len) {\n      take = input_len;\n    }\n    chunk_state_update(&self->chunk, input_bytes, take);\n    input_bytes += take;\n    input_len -= take;\n    // If we've filled the current chunk and there's more coming, finalize this\n    // chunk and proceed. In this case we know it's not the root.\n    if (input_len > 0) {\n      output_t output = chunk_state_output(&self->chunk);\n      uint8_t chunk_cv[32];\n      output_chaining_value(&output, chunk_cv);\n      hasher_push_cv(self, chunk_cv, self->chunk.chunk_counter);\n      chunk_state_reset(&self->chunk, self->key, self->chunk.chunk_counter + 1);\n    } else {\n      return;\n    }\n  }\n\n  // Now the chunk_state is clear, and we have more input. If there's more than\n  // a single chunk (so, definitely not the root chunk), hash the largest whole\n  // subtree we can, with the full benefits of SIMD (and maybe in the future,\n  // multi-threading) parallelism. Two restrictions:\n  // - The subtree has to be a power-of-2 number of chunks. Only subtrees along\n  //   the right edge can be incomplete, and we don't know where the right edge\n  //   is going to be until we get to finalize().\n  // - The subtree must evenly divide the total number of chunks up until this\n  //   point (if total is not 0). If the current incomplete subtree is only\n  //   waiting for 1 more chunk, we can't hash a subtree of 4 chunks. We have\n  //   to complete the current subtree first.\n  // Because we might need to break up the input to form powers of 2, or to\n  // evenly divide what we already have, this part runs in a loop.\n  while (input_len > BLAKE3_CHUNK_LEN) {\n    size_t subtree_len = round_down_to_power_of_2(input_len);\n    uint64_t count_so_far = self->chunk.chunk_counter * BLAKE3_CHUNK_LEN;\n    // Shrink the subtree_len until it evenly divides the count so far. We know\n    // that subtree_len itself is a power of 2, so we can use a bitmasking\n    // trick instead of an actual remainder operation. (Note that if the caller\n    // consistently passes power-of-2 inputs of the same size, as is hopefully\n    // typical, this loop condition will always fail, and subtree_len will\n    // always be the full length of the input.)\n    //\n    // An aside: We don't have to shrink subtree_len quite this much. For\n    // example, if count_so_far is 1, we could pass 2 chunks to\n    // compress_subtree_to_parent_node. Since we'll get 2 CVs back, we'll still\n    // get the right answer in the end, and we might get to use 2-way SIMD\n    // parallelism. The problem with this optimization, is that it gets us\n    // stuck always hashing 2 chunks. The total number of chunks will remain\n    // odd, and we'll never graduate to higher degrees of parallelism. See\n    // https://github.com/BLAKE3-team/BLAKE3/issues/69.\n    while ((((uint64_t)(subtree_len - 1)) & count_so_far) != 0) {\n      subtree_len /= 2;\n    }\n    // The shrunken subtree_len might now be 1 chunk long. If so, hash that one\n    // chunk by itself. Otherwise, compress the subtree into a pair of CVs.\n    uint64_t subtree_chunks = subtree_len / BLAKE3_CHUNK_LEN;\n    if (subtree_len <= BLAKE3_CHUNK_LEN) {\n      blake3_chunk_state chunk_state;\n      chunk_state_init(&chunk_state, self->key, self->chunk.flags);\n      chunk_state.chunk_counter = self->chunk.chunk_counter;\n      chunk_state_update(&chunk_state, input_bytes, subtree_len);\n      output_t output = chunk_state_output(&chunk_state);\n      uint8_t cv[BLAKE3_OUT_LEN];\n      output_chaining_value(&output, cv);\n      hasher_push_cv(self, cv, chunk_state.chunk_counter);\n    } else {\n      // This is the high-performance happy path, though getting here depends\n      // on the caller giving us a long enough input.\n      uint8_t cv_pair[2 * BLAKE3_OUT_LEN];\n      compress_subtree_to_parent_node(input_bytes, subtree_len, self->key,\n                                      self->chunk.chunk_counter,\n                                      self->chunk.flags, cv_pair);\n      hasher_push_cv(self, cv_pair, self->chunk.chunk_counter);\n      hasher_push_cv(self, &cv_pair[BLAKE3_OUT_LEN],\n                     self->chunk.chunk_counter + (subtree_chunks / 2));\n    }\n    self->chunk.chunk_counter += subtree_chunks;\n    input_bytes += subtree_len;\n    input_len -= subtree_len;\n  }\n\n  // If there's any remaining input less than a full chunk, add it to the chunk\n  // state. In that case, also do a final merge loop to make sure the subtree\n  // stack doesn't contain any unmerged pairs. The remaining input means we\n  // know these merges are non-root. This merge loop isn't strictly necessary\n  // here, because hasher_push_chunk_cv already does its own merge loop, but it\n  // simplifies blake3_hasher_finalize below.\n  if (input_len > 0) {\n    chunk_state_update(&self->chunk, input_bytes, input_len);\n    hasher_merge_cv_stack(self, self->chunk.chunk_counter);\n  }\n}\n\nvoid blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out,\n                            size_t out_len) {\n  blake3_hasher_finalize_seek(self, 0, out, out_len);\n}\n\nvoid blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek,\n                                 uint8_t *out, size_t out_len) {\n  // Explicitly checking for zero avoids causing UB by passing a null pointer\n  // to memcpy. This comes up in practice with things like:\n  //   std::vector<uint8_t> v;\n  //   blake3_hasher_finalize(&hasher, v.data(), v.size());\n  if (out_len == 0) {\n    return;\n  }\n\n  // If the subtree stack is empty, then the current chunk is the root.\n  if (self->cv_stack_len == 0) {\n    output_t output = chunk_state_output(&self->chunk);\n    output_root_bytes(&output, seek, out, out_len);\n    return;\n  }\n  // If there are any bytes in the chunk state, finalize that chunk and do a\n  // roll-up merge between that chunk hash and every subtree in the stack. In\n  // this case, the extra merge loop at the end of blake3_hasher_update\n  // guarantees that none of the subtrees in the stack need to be merged with\n  // each other first. Otherwise, if there are no bytes in the chunk state,\n  // then the top of the stack is a chunk hash, and we start the merge from\n  // that.\n  output_t output;\n  size_t cvs_remaining;\n  if (chunk_state_len(&self->chunk) > 0) {\n    cvs_remaining = self->cv_stack_len;\n    output = chunk_state_output(&self->chunk);\n  } else {\n    // There are always at least 2 CVs in the stack in this case.\n    cvs_remaining = self->cv_stack_len - 2;\n    output = parent_output(&self->cv_stack[cvs_remaining * 32], self->key,\n                           self->chunk.flags);\n  }\n  while (cvs_remaining > 0) {\n    cvs_remaining -= 1;\n    uint8_t parent_block[BLAKE3_BLOCK_LEN];\n    memcpy(parent_block, &self->cv_stack[cvs_remaining * 32], 32);\n    output_chaining_value(&output, &parent_block[32]);\n    output = parent_output(parent_block, self->key, self->chunk.flags);\n  }\n  output_root_bytes(&output, seek, out, out_len);\n}\n\nvoid blake3_hasher_reset(blake3_hasher *self) {\n  chunk_state_reset(&self->chunk, self->key, 0);\n  self->cv_stack_len = 0;\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3.h",
    "content": "#ifndef BLAKE3_H\n#define BLAKE3_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#if !defined(BLAKE3_API)\n# if defined(_WIN32) || defined(__CYGWIN__)\n#   if defined(BLAKE3_DLL)\n#     if defined(BLAKE3_DLL_EXPORTS)\n#       define BLAKE3_API __declspec(dllexport)\n#     else\n#       define BLAKE3_API __declspec(dllimport)\n#     endif\n#     define BLAKE3_PRIVATE\n#   else\n#     define BLAKE3_API\n#     define BLAKE3_PRIVATE\n#   endif\n# elif __GNUC__ >= 4\n#   define BLAKE3_API __attribute__((visibility(\"default\")))\n#   define BLAKE3_PRIVATE __attribute__((visibility(\"hidden\")))\n# else\n#   define BLAKE3_API\n#   define BLAKE3_PRIVATE\n# endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define BLAKE3_VERSION_STRING \"1.5.0\"\n#define BLAKE3_KEY_LEN 32\n#define BLAKE3_OUT_LEN 32\n#define BLAKE3_BLOCK_LEN 64\n#define BLAKE3_CHUNK_LEN 1024\n#define BLAKE3_MAX_DEPTH 54\n\n// This struct is a private implementation detail. It has to be here because\n// it's part of blake3_hasher below.\ntypedef struct {\n  uint32_t cv[8];\n  uint64_t chunk_counter;\n  uint8_t buf[BLAKE3_BLOCK_LEN];\n  uint8_t buf_len;\n  uint8_t blocks_compressed;\n  uint8_t flags;\n} blake3_chunk_state;\n\ntypedef struct {\n  uint32_t key[8];\n  blake3_chunk_state chunk;\n  uint8_t cv_stack_len;\n  // The stack size is MAX_DEPTH + 1 because we do lazy merging. For example,\n  // with 7 chunks, we have 3 entries in the stack. Adding an 8th chunk\n  // requires a 4th entry, rather than merging everything down to 1, because we\n  // don't know whether more input is coming. This is different from how the\n  // reference implementation does things.\n  uint8_t cv_stack[(BLAKE3_MAX_DEPTH + 1) * BLAKE3_OUT_LEN];\n} blake3_hasher;\n\nBLAKE3_API const char *blake3_version(void);\nBLAKE3_API void blake3_hasher_init(blake3_hasher *self);\nBLAKE3_API void blake3_hasher_init_keyed(blake3_hasher *self,\n                                         const uint8_t key[BLAKE3_KEY_LEN]);\nBLAKE3_API void blake3_hasher_init_derive_key(blake3_hasher *self, const char *context);\nBLAKE3_API void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *context,\n                                                  size_t context_len);\nBLAKE3_API void blake3_hasher_update(blake3_hasher *self, const void *input,\n                                     size_t input_len);\nBLAKE3_API void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out,\n                                       size_t out_len);\nBLAKE3_API void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek,\n                                            uint8_t *out, size_t out_len);\nBLAKE3_API void blake3_hasher_reset(blake3_hasher *self);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* BLAKE3_H */\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_avx2.c",
    "content": "#include \"blake3_impl.h\"\n\n#include <immintrin.h>\n\n#define DEGREE 8\n\nINLINE __m256i loadu(const uint8_t src[32]) {\n  return _mm256_loadu_si256((const __m256i *)src);\n}\n\nINLINE void storeu(__m256i src, uint8_t dest[16]) {\n  _mm256_storeu_si256((__m256i *)dest, src);\n}\n\nINLINE __m256i addv(__m256i a, __m256i b) { return _mm256_add_epi32(a, b); }\n\n// Note that clang-format doesn't like the name \"xor\" for some reason.\nINLINE __m256i xorv(__m256i a, __m256i b) { return _mm256_xor_si256(a, b); }\n\nINLINE __m256i set1(uint32_t x) { return _mm256_set1_epi32((int32_t)x); }\n\nINLINE __m256i rot16(__m256i x) {\n  return _mm256_shuffle_epi8(\n      x, _mm256_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2,\n                         13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2));\n}\n\nINLINE __m256i rot12(__m256i x) {\n  return _mm256_or_si256(_mm256_srli_epi32(x, 12), _mm256_slli_epi32(x, 32 - 12));\n}\n\nINLINE __m256i rot8(__m256i x) {\n  return _mm256_shuffle_epi8(\n      x, _mm256_set_epi8(12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1,\n                         12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1));\n}\n\nINLINE __m256i rot7(__m256i x) {\n  return _mm256_or_si256(_mm256_srli_epi32(x, 7), _mm256_slli_epi32(x, 32 - 7));\n}\n\nINLINE void round_fn(__m256i v[16], __m256i m[16], size_t r) {\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = addv(v[0], v[4]);\n  v[1] = addv(v[1], v[5]);\n  v[2] = addv(v[2], v[6]);\n  v[3] = addv(v[3], v[7]);\n  v[12] = xorv(v[12], v[0]);\n  v[13] = xorv(v[13], v[1]);\n  v[14] = xorv(v[14], v[2]);\n  v[15] = xorv(v[15], v[3]);\n  v[12] = rot16(v[12]);\n  v[13] = rot16(v[13]);\n  v[14] = rot16(v[14]);\n  v[15] = rot16(v[15]);\n  v[8] = addv(v[8], v[12]);\n  v[9] = addv(v[9], v[13]);\n  v[10] = addv(v[10], v[14]);\n  v[11] = addv(v[11], v[15]);\n  v[4] = xorv(v[4], v[8]);\n  v[5] = xorv(v[5], v[9]);\n  v[6] = xorv(v[6], v[10]);\n  v[7] = xorv(v[7], v[11]);\n  v[4] = rot12(v[4]);\n  v[5] = rot12(v[5]);\n  v[6] = rot12(v[6]);\n  v[7] = rot12(v[7]);\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = addv(v[0], v[4]);\n  v[1] = addv(v[1], v[5]);\n  v[2] = addv(v[2], v[6]);\n  v[3] = addv(v[3], v[7]);\n  v[12] = xorv(v[12], v[0]);\n  v[13] = xorv(v[13], v[1]);\n  v[14] = xorv(v[14], v[2]);\n  v[15] = xorv(v[15], v[3]);\n  v[12] = rot8(v[12]);\n  v[13] = rot8(v[13]);\n  v[14] = rot8(v[14]);\n  v[15] = rot8(v[15]);\n  v[8] = addv(v[8], v[12]);\n  v[9] = addv(v[9], v[13]);\n  v[10] = addv(v[10], v[14]);\n  v[11] = addv(v[11], v[15]);\n  v[4] = xorv(v[4], v[8]);\n  v[5] = xorv(v[5], v[9]);\n  v[6] = xorv(v[6], v[10]);\n  v[7] = xorv(v[7], v[11]);\n  v[4] = rot7(v[4]);\n  v[5] = rot7(v[5]);\n  v[6] = rot7(v[6]);\n  v[7] = rot7(v[7]);\n\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = addv(v[0], v[5]);\n  v[1] = addv(v[1], v[6]);\n  v[2] = addv(v[2], v[7]);\n  v[3] = addv(v[3], v[4]);\n  v[15] = xorv(v[15], v[0]);\n  v[12] = xorv(v[12], v[1]);\n  v[13] = xorv(v[13], v[2]);\n  v[14] = xorv(v[14], v[3]);\n  v[15] = rot16(v[15]);\n  v[12] = rot16(v[12]);\n  v[13] = rot16(v[13]);\n  v[14] = rot16(v[14]);\n  v[10] = addv(v[10], v[15]);\n  v[11] = addv(v[11], v[12]);\n  v[8] = addv(v[8], v[13]);\n  v[9] = addv(v[9], v[14]);\n  v[5] = xorv(v[5], v[10]);\n  v[6] = xorv(v[6], v[11]);\n  v[7] = xorv(v[7], v[8]);\n  v[4] = xorv(v[4], v[9]);\n  v[5] = rot12(v[5]);\n  v[6] = rot12(v[6]);\n  v[7] = rot12(v[7]);\n  v[4] = rot12(v[4]);\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = addv(v[0], v[5]);\n  v[1] = addv(v[1], v[6]);\n  v[2] = addv(v[2], v[7]);\n  v[3] = addv(v[3], v[4]);\n  v[15] = xorv(v[15], v[0]);\n  v[12] = xorv(v[12], v[1]);\n  v[13] = xorv(v[13], v[2]);\n  v[14] = xorv(v[14], v[3]);\n  v[15] = rot8(v[15]);\n  v[12] = rot8(v[12]);\n  v[13] = rot8(v[13]);\n  v[14] = rot8(v[14]);\n  v[10] = addv(v[10], v[15]);\n  v[11] = addv(v[11], v[12]);\n  v[8] = addv(v[8], v[13]);\n  v[9] = addv(v[9], v[14]);\n  v[5] = xorv(v[5], v[10]);\n  v[6] = xorv(v[6], v[11]);\n  v[7] = xorv(v[7], v[8]);\n  v[4] = xorv(v[4], v[9]);\n  v[5] = rot7(v[5]);\n  v[6] = rot7(v[6]);\n  v[7] = rot7(v[7]);\n  v[4] = rot7(v[4]);\n}\n\nINLINE void transpose_vecs(__m256i vecs[DEGREE]) {\n  // Interleave 32-bit lanes. The low unpack is lanes 00/11/44/55, and the high\n  // is 22/33/66/77.\n  __m256i ab_0145 = _mm256_unpacklo_epi32(vecs[0], vecs[1]);\n  __m256i ab_2367 = _mm256_unpackhi_epi32(vecs[0], vecs[1]);\n  __m256i cd_0145 = _mm256_unpacklo_epi32(vecs[2], vecs[3]);\n  __m256i cd_2367 = _mm256_unpackhi_epi32(vecs[2], vecs[3]);\n  __m256i ef_0145 = _mm256_unpacklo_epi32(vecs[4], vecs[5]);\n  __m256i ef_2367 = _mm256_unpackhi_epi32(vecs[4], vecs[5]);\n  __m256i gh_0145 = _mm256_unpacklo_epi32(vecs[6], vecs[7]);\n  __m256i gh_2367 = _mm256_unpackhi_epi32(vecs[6], vecs[7]);\n\n  // Interleave 64-bit lanes. The low unpack is lanes 00/22 and the high is\n  // 11/33.\n  __m256i abcd_04 = _mm256_unpacklo_epi64(ab_0145, cd_0145);\n  __m256i abcd_15 = _mm256_unpackhi_epi64(ab_0145, cd_0145);\n  __m256i abcd_26 = _mm256_unpacklo_epi64(ab_2367, cd_2367);\n  __m256i abcd_37 = _mm256_unpackhi_epi64(ab_2367, cd_2367);\n  __m256i efgh_04 = _mm256_unpacklo_epi64(ef_0145, gh_0145);\n  __m256i efgh_15 = _mm256_unpackhi_epi64(ef_0145, gh_0145);\n  __m256i efgh_26 = _mm256_unpacklo_epi64(ef_2367, gh_2367);\n  __m256i efgh_37 = _mm256_unpackhi_epi64(ef_2367, gh_2367);\n\n  // Interleave 128-bit lanes.\n  vecs[0] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x20);\n  vecs[1] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x20);\n  vecs[2] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x20);\n  vecs[3] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x20);\n  vecs[4] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x31);\n  vecs[5] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x31);\n  vecs[6] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x31);\n  vecs[7] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x31);\n}\n\nINLINE void transpose_msg_vecs(const uint8_t *const *inputs,\n                               size_t block_offset, __m256i out[16]) {\n  out[0] = loadu(&inputs[0][block_offset + 0 * sizeof(__m256i)]);\n  out[1] = loadu(&inputs[1][block_offset + 0 * sizeof(__m256i)]);\n  out[2] = loadu(&inputs[2][block_offset + 0 * sizeof(__m256i)]);\n  out[3] = loadu(&inputs[3][block_offset + 0 * sizeof(__m256i)]);\n  out[4] = loadu(&inputs[4][block_offset + 0 * sizeof(__m256i)]);\n  out[5] = loadu(&inputs[5][block_offset + 0 * sizeof(__m256i)]);\n  out[6] = loadu(&inputs[6][block_offset + 0 * sizeof(__m256i)]);\n  out[7] = loadu(&inputs[7][block_offset + 0 * sizeof(__m256i)]);\n  out[8] = loadu(&inputs[0][block_offset + 1 * sizeof(__m256i)]);\n  out[9] = loadu(&inputs[1][block_offset + 1 * sizeof(__m256i)]);\n  out[10] = loadu(&inputs[2][block_offset + 1 * sizeof(__m256i)]);\n  out[11] = loadu(&inputs[3][block_offset + 1 * sizeof(__m256i)]);\n  out[12] = loadu(&inputs[4][block_offset + 1 * sizeof(__m256i)]);\n  out[13] = loadu(&inputs[5][block_offset + 1 * sizeof(__m256i)]);\n  out[14] = loadu(&inputs[6][block_offset + 1 * sizeof(__m256i)]);\n  out[15] = loadu(&inputs[7][block_offset + 1 * sizeof(__m256i)]);\n  for (size_t i = 0; i < 8; ++i) {\n    _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0);\n  }\n  transpose_vecs(&out[0]);\n  transpose_vecs(&out[8]);\n}\n\nINLINE void load_counters(uint64_t counter, bool increment_counter,\n                          __m256i *out_lo, __m256i *out_hi) {\n  const __m256i mask = _mm256_set1_epi32(-(int32_t)increment_counter);\n  const __m256i add0 = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0);\n  const __m256i add1 = _mm256_and_si256(mask, add0);\n  __m256i l = _mm256_add_epi32(_mm256_set1_epi32((int32_t)counter), add1);\n  __m256i carry = _mm256_cmpgt_epi32(_mm256_xor_si256(add1, _mm256_set1_epi32(0x80000000)), \n                                     _mm256_xor_si256(   l, _mm256_set1_epi32(0x80000000)));\n  __m256i h = _mm256_sub_epi32(_mm256_set1_epi32((int32_t)(counter >> 32)), carry);\n  *out_lo = l;\n  *out_hi = h;\n}\n\nstatic\nvoid blake3_hash8_avx2(const uint8_t *const *inputs, size_t blocks,\n                       const uint32_t key[8], uint64_t counter,\n                       bool increment_counter, uint8_t flags,\n                       uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  __m256i h_vecs[8] = {\n      set1(key[0]), set1(key[1]), set1(key[2]), set1(key[3]),\n      set1(key[4]), set1(key[5]), set1(key[6]), set1(key[7]),\n  };\n  __m256i counter_low_vec, counter_high_vec;\n  load_counters(counter, increment_counter, &counter_low_vec,\n                &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    __m256i block_len_vec = set1(BLAKE3_BLOCK_LEN);\n    __m256i block_flags_vec = set1(block_flags);\n    __m256i msg_vecs[16];\n    transpose_msg_vecs(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    __m256i v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],     h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],     h_vecs[7],\n        set1(IV[0]),     set1(IV[1]),      set1(IV[2]),   set1(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec,\n    };\n    round_fn(v, msg_vecs, 0);\n    round_fn(v, msg_vecs, 1);\n    round_fn(v, msg_vecs, 2);\n    round_fn(v, msg_vecs, 3);\n    round_fn(v, msg_vecs, 4);\n    round_fn(v, msg_vecs, 5);\n    round_fn(v, msg_vecs, 6);\n    h_vecs[0] = xorv(v[0], v[8]);\n    h_vecs[1] = xorv(v[1], v[9]);\n    h_vecs[2] = xorv(v[2], v[10]);\n    h_vecs[3] = xorv(v[3], v[11]);\n    h_vecs[4] = xorv(v[4], v[12]);\n    h_vecs[5] = xorv(v[5], v[13]);\n    h_vecs[6] = xorv(v[6], v[14]);\n    h_vecs[7] = xorv(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs(h_vecs);\n  storeu(h_vecs[0], &out[0 * sizeof(__m256i)]);\n  storeu(h_vecs[1], &out[1 * sizeof(__m256i)]);\n  storeu(h_vecs[2], &out[2 * sizeof(__m256i)]);\n  storeu(h_vecs[3], &out[3 * sizeof(__m256i)]);\n  storeu(h_vecs[4], &out[4 * sizeof(__m256i)]);\n  storeu(h_vecs[5], &out[5 * sizeof(__m256i)]);\n  storeu(h_vecs[6], &out[6 * sizeof(__m256i)]);\n  storeu(h_vecs[7], &out[7 * sizeof(__m256i)]);\n}\n\nvoid blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out) {\n  while (num_inputs >= DEGREE) {\n    blake3_hash8_avx2(inputs, blocks, key, counter, increment_counter, flags,\n                      flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += DEGREE;\n    }\n    inputs += DEGREE;\n    num_inputs -= DEGREE;\n    out = &out[DEGREE * BLAKE3_OUT_LEN];\n  }\n#if !defined(BLAKE3_NO_SSE41)\n  blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter,\n                         increment_counter, flags, flags_start, flags_end, out);\n#else\n  blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter,\n                            increment_counter, flags, flags_start, flags_end,\n                            out);\n#endif\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_avx512.c",
    "content": "#include \"blake3_impl.h\"\n\n#include <immintrin.h>\n\n#define _mm_shuffle_ps2(a, b, c)                                               \\\n  (_mm_castps_si128(                                                           \\\n      _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c))))\n\nINLINE __m128i loadu_128(const uint8_t src[16]) {\n  return _mm_loadu_si128((const __m128i *)src);\n}\n\nINLINE __m256i loadu_256(const uint8_t src[32]) {\n  return _mm256_loadu_si256((const __m256i *)src);\n}\n\nINLINE __m512i loadu_512(const uint8_t src[64]) {\n  return _mm512_loadu_si512((const __m512i *)src);\n}\n\nINLINE void storeu_128(__m128i src, uint8_t dest[16]) {\n  _mm_storeu_si128((__m128i *)dest, src);\n}\n\nINLINE void storeu_256(__m256i src, uint8_t dest[16]) {\n  _mm256_storeu_si256((__m256i *)dest, src);\n}\n\nINLINE __m128i add_128(__m128i a, __m128i b) { return _mm_add_epi32(a, b); }\n\nINLINE __m256i add_256(__m256i a, __m256i b) { return _mm256_add_epi32(a, b); }\n\nINLINE __m512i add_512(__m512i a, __m512i b) { return _mm512_add_epi32(a, b); }\n\nINLINE __m128i xor_128(__m128i a, __m128i b) { return _mm_xor_si128(a, b); }\n\nINLINE __m256i xor_256(__m256i a, __m256i b) { return _mm256_xor_si256(a, b); }\n\nINLINE __m512i xor_512(__m512i a, __m512i b) { return _mm512_xor_si512(a, b); }\n\nINLINE __m128i set1_128(uint32_t x) { return _mm_set1_epi32((int32_t)x); }\n\nINLINE __m256i set1_256(uint32_t x) { return _mm256_set1_epi32((int32_t)x); }\n\nINLINE __m512i set1_512(uint32_t x) { return _mm512_set1_epi32((int32_t)x); }\n\nINLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {\n  return _mm_setr_epi32((int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d);\n}\n\nINLINE __m128i rot16_128(__m128i x) { return _mm_ror_epi32(x, 16); }\n\nINLINE __m256i rot16_256(__m256i x) { return _mm256_ror_epi32(x, 16); }\n\nINLINE __m512i rot16_512(__m512i x) { return _mm512_ror_epi32(x, 16); }\n\nINLINE __m128i rot12_128(__m128i x) { return _mm_ror_epi32(x, 12); }\n\nINLINE __m256i rot12_256(__m256i x) { return _mm256_ror_epi32(x, 12); }\n\nINLINE __m512i rot12_512(__m512i x) { return _mm512_ror_epi32(x, 12); }\n\nINLINE __m128i rot8_128(__m128i x) { return _mm_ror_epi32(x, 8); }\n\nINLINE __m256i rot8_256(__m256i x) { return _mm256_ror_epi32(x, 8); }\n\nINLINE __m512i rot8_512(__m512i x) { return _mm512_ror_epi32(x, 8); }\n\nINLINE __m128i rot7_128(__m128i x) { return _mm_ror_epi32(x, 7); }\n\nINLINE __m256i rot7_256(__m256i x) { return _mm256_ror_epi32(x, 7); }\n\nINLINE __m512i rot7_512(__m512i x) { return _mm512_ror_epi32(x, 7); }\n\n/*\n * ----------------------------------------------------------------------------\n * compress_avx512\n * ----------------------------------------------------------------------------\n */\n\nINLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,\n               __m128i m) {\n  *row0 = add_128(add_128(*row0, m), *row1);\n  *row3 = xor_128(*row3, *row0);\n  *row3 = rot16_128(*row3);\n  *row2 = add_128(*row2, *row3);\n  *row1 = xor_128(*row1, *row2);\n  *row1 = rot12_128(*row1);\n}\n\nINLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,\n               __m128i m) {\n  *row0 = add_128(add_128(*row0, m), *row1);\n  *row3 = xor_128(*row3, *row0);\n  *row3 = rot8_128(*row3);\n  *row2 = add_128(*row2, *row3);\n  *row1 = xor_128(*row1, *row2);\n  *row1 = rot7_128(*row1);\n}\n\n// Note the optimization here of leaving row1 as the unrotated row, rather than\n// row0. All the message loads below are adjusted to compensate for this. See\n// discussion at https://github.com/sneves/blake2-avx2/pull/4\nINLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {\n  *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(2, 1, 0, 3));\n  *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2));\n  *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(0, 3, 2, 1));\n}\n\nINLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {\n  *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(0, 3, 2, 1));\n  *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2));\n  *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(2, 1, 0, 3));\n}\n\nINLINE void compress_pre(__m128i rows[4], const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags) {\n  rows[0] = loadu_128((uint8_t *)&cv[0]);\n  rows[1] = loadu_128((uint8_t *)&cv[4]);\n  rows[2] = set4(IV[0], IV[1], IV[2], IV[3]);\n  rows[3] = set4(counter_low(counter), counter_high(counter),\n                 (uint32_t)block_len, (uint32_t)flags);\n\n  __m128i m0 = loadu_128(&block[sizeof(__m128i) * 0]);\n  __m128i m1 = loadu_128(&block[sizeof(__m128i) * 1]);\n  __m128i m2 = loadu_128(&block[sizeof(__m128i) * 2]);\n  __m128i m3 = loadu_128(&block[sizeof(__m128i) * 3]);\n\n  __m128i t0, t1, t2, t3, tt;\n\n  // Round 1. The first round permutes the message words from the original\n  // input order, into the groups that get mixed in parallel.\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(2, 0, 2, 0)); //  6  4  2  0\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 3, 1)); //  7  5  3  1\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(2, 0, 2, 0)); // 14 12 10  8\n  t2 = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2, 1, 0, 3));   // 12 10  8 14\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 1, 3, 1)); // 15 13 11  9\n  t3 = _mm_shuffle_epi32(t3, _MM_SHUFFLE(2, 1, 0, 3));   // 13 11  9 15\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 2. This round and all following rounds apply a fixed permutation\n  // to the message words from the round before.\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 3\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 4\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 5\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 6\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 7\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n}\n\nvoid blake3_compress_xof_avx512(const uint32_t cv[8],\n                                const uint8_t block[BLAKE3_BLOCK_LEN],\n                                uint8_t block_len, uint64_t counter,\n                                uint8_t flags, uint8_t out[64]) {\n  __m128i rows[4];\n  compress_pre(rows, cv, block, block_len, counter, flags);\n  storeu_128(xor_128(rows[0], rows[2]), &out[0]);\n  storeu_128(xor_128(rows[1], rows[3]), &out[16]);\n  storeu_128(xor_128(rows[2], loadu_128((uint8_t *)&cv[0])), &out[32]);\n  storeu_128(xor_128(rows[3], loadu_128((uint8_t *)&cv[4])), &out[48]);\n}\n\nvoid blake3_compress_in_place_avx512(uint32_t cv[8],\n                                     const uint8_t block[BLAKE3_BLOCK_LEN],\n                                     uint8_t block_len, uint64_t counter,\n                                     uint8_t flags) {\n  __m128i rows[4];\n  compress_pre(rows, cv, block, block_len, counter, flags);\n  storeu_128(xor_128(rows[0], rows[2]), (uint8_t *)&cv[0]);\n  storeu_128(xor_128(rows[1], rows[3]), (uint8_t *)&cv[4]);\n}\n\n/*\n * ----------------------------------------------------------------------------\n * hash4_avx512\n * ----------------------------------------------------------------------------\n */\n\nINLINE void round_fn4(__m128i v[16], __m128i m[16], size_t r) {\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = add_128(v[0], v[4]);\n  v[1] = add_128(v[1], v[5]);\n  v[2] = add_128(v[2], v[6]);\n  v[3] = add_128(v[3], v[7]);\n  v[12] = xor_128(v[12], v[0]);\n  v[13] = xor_128(v[13], v[1]);\n  v[14] = xor_128(v[14], v[2]);\n  v[15] = xor_128(v[15], v[3]);\n  v[12] = rot16_128(v[12]);\n  v[13] = rot16_128(v[13]);\n  v[14] = rot16_128(v[14]);\n  v[15] = rot16_128(v[15]);\n  v[8] = add_128(v[8], v[12]);\n  v[9] = add_128(v[9], v[13]);\n  v[10] = add_128(v[10], v[14]);\n  v[11] = add_128(v[11], v[15]);\n  v[4] = xor_128(v[4], v[8]);\n  v[5] = xor_128(v[5], v[9]);\n  v[6] = xor_128(v[6], v[10]);\n  v[7] = xor_128(v[7], v[11]);\n  v[4] = rot12_128(v[4]);\n  v[5] = rot12_128(v[5]);\n  v[6] = rot12_128(v[6]);\n  v[7] = rot12_128(v[7]);\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = add_128(v[0], v[4]);\n  v[1] = add_128(v[1], v[5]);\n  v[2] = add_128(v[2], v[6]);\n  v[3] = add_128(v[3], v[7]);\n  v[12] = xor_128(v[12], v[0]);\n  v[13] = xor_128(v[13], v[1]);\n  v[14] = xor_128(v[14], v[2]);\n  v[15] = xor_128(v[15], v[3]);\n  v[12] = rot8_128(v[12]);\n  v[13] = rot8_128(v[13]);\n  v[14] = rot8_128(v[14]);\n  v[15] = rot8_128(v[15]);\n  v[8] = add_128(v[8], v[12]);\n  v[9] = add_128(v[9], v[13]);\n  v[10] = add_128(v[10], v[14]);\n  v[11] = add_128(v[11], v[15]);\n  v[4] = xor_128(v[4], v[8]);\n  v[5] = xor_128(v[5], v[9]);\n  v[6] = xor_128(v[6], v[10]);\n  v[7] = xor_128(v[7], v[11]);\n  v[4] = rot7_128(v[4]);\n  v[5] = rot7_128(v[5]);\n  v[6] = rot7_128(v[6]);\n  v[7] = rot7_128(v[7]);\n\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = add_128(v[0], v[5]);\n  v[1] = add_128(v[1], v[6]);\n  v[2] = add_128(v[2], v[7]);\n  v[3] = add_128(v[3], v[4]);\n  v[15] = xor_128(v[15], v[0]);\n  v[12] = xor_128(v[12], v[1]);\n  v[13] = xor_128(v[13], v[2]);\n  v[14] = xor_128(v[14], v[3]);\n  v[15] = rot16_128(v[15]);\n  v[12] = rot16_128(v[12]);\n  v[13] = rot16_128(v[13]);\n  v[14] = rot16_128(v[14]);\n  v[10] = add_128(v[10], v[15]);\n  v[11] = add_128(v[11], v[12]);\n  v[8] = add_128(v[8], v[13]);\n  v[9] = add_128(v[9], v[14]);\n  v[5] = xor_128(v[5], v[10]);\n  v[6] = xor_128(v[6], v[11]);\n  v[7] = xor_128(v[7], v[8]);\n  v[4] = xor_128(v[4], v[9]);\n  v[5] = rot12_128(v[5]);\n  v[6] = rot12_128(v[6]);\n  v[7] = rot12_128(v[7]);\n  v[4] = rot12_128(v[4]);\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = add_128(v[0], v[5]);\n  v[1] = add_128(v[1], v[6]);\n  v[2] = add_128(v[2], v[7]);\n  v[3] = add_128(v[3], v[4]);\n  v[15] = xor_128(v[15], v[0]);\n  v[12] = xor_128(v[12], v[1]);\n  v[13] = xor_128(v[13], v[2]);\n  v[14] = xor_128(v[14], v[3]);\n  v[15] = rot8_128(v[15]);\n  v[12] = rot8_128(v[12]);\n  v[13] = rot8_128(v[13]);\n  v[14] = rot8_128(v[14]);\n  v[10] = add_128(v[10], v[15]);\n  v[11] = add_128(v[11], v[12]);\n  v[8] = add_128(v[8], v[13]);\n  v[9] = add_128(v[9], v[14]);\n  v[5] = xor_128(v[5], v[10]);\n  v[6] = xor_128(v[6], v[11]);\n  v[7] = xor_128(v[7], v[8]);\n  v[4] = xor_128(v[4], v[9]);\n  v[5] = rot7_128(v[5]);\n  v[6] = rot7_128(v[6]);\n  v[7] = rot7_128(v[7]);\n  v[4] = rot7_128(v[4]);\n}\n\nINLINE void transpose_vecs_128(__m128i vecs[4]) {\n  // Interleave 32-bit lanes. The low unpack is lanes 00/11 and the high is\n  // 22/33. Note that this doesn't split the vector into two lanes, as the\n  // AVX2 counterparts do.\n  __m128i ab_01 = _mm_unpacklo_epi32(vecs[0], vecs[1]);\n  __m128i ab_23 = _mm_unpackhi_epi32(vecs[0], vecs[1]);\n  __m128i cd_01 = _mm_unpacklo_epi32(vecs[2], vecs[3]);\n  __m128i cd_23 = _mm_unpackhi_epi32(vecs[2], vecs[3]);\n\n  // Interleave 64-bit lanes.\n  __m128i abcd_0 = _mm_unpacklo_epi64(ab_01, cd_01);\n  __m128i abcd_1 = _mm_unpackhi_epi64(ab_01, cd_01);\n  __m128i abcd_2 = _mm_unpacklo_epi64(ab_23, cd_23);\n  __m128i abcd_3 = _mm_unpackhi_epi64(ab_23, cd_23);\n\n  vecs[0] = abcd_0;\n  vecs[1] = abcd_1;\n  vecs[2] = abcd_2;\n  vecs[3] = abcd_3;\n}\n\nINLINE void transpose_msg_vecs4(const uint8_t *const *inputs,\n                                size_t block_offset, __m128i out[16]) {\n  out[0] = loadu_128(&inputs[0][block_offset + 0 * sizeof(__m128i)]);\n  out[1] = loadu_128(&inputs[1][block_offset + 0 * sizeof(__m128i)]);\n  out[2] = loadu_128(&inputs[2][block_offset + 0 * sizeof(__m128i)]);\n  out[3] = loadu_128(&inputs[3][block_offset + 0 * sizeof(__m128i)]);\n  out[4] = loadu_128(&inputs[0][block_offset + 1 * sizeof(__m128i)]);\n  out[5] = loadu_128(&inputs[1][block_offset + 1 * sizeof(__m128i)]);\n  out[6] = loadu_128(&inputs[2][block_offset + 1 * sizeof(__m128i)]);\n  out[7] = loadu_128(&inputs[3][block_offset + 1 * sizeof(__m128i)]);\n  out[8] = loadu_128(&inputs[0][block_offset + 2 * sizeof(__m128i)]);\n  out[9] = loadu_128(&inputs[1][block_offset + 2 * sizeof(__m128i)]);\n  out[10] = loadu_128(&inputs[2][block_offset + 2 * sizeof(__m128i)]);\n  out[11] = loadu_128(&inputs[3][block_offset + 2 * sizeof(__m128i)]);\n  out[12] = loadu_128(&inputs[0][block_offset + 3 * sizeof(__m128i)]);\n  out[13] = loadu_128(&inputs[1][block_offset + 3 * sizeof(__m128i)]);\n  out[14] = loadu_128(&inputs[2][block_offset + 3 * sizeof(__m128i)]);\n  out[15] = loadu_128(&inputs[3][block_offset + 3 * sizeof(__m128i)]);\n  for (size_t i = 0; i < 4; ++i) {\n    _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0);\n  }\n  transpose_vecs_128(&out[0]);\n  transpose_vecs_128(&out[4]);\n  transpose_vecs_128(&out[8]);\n  transpose_vecs_128(&out[12]);\n}\n\nINLINE void load_counters4(uint64_t counter, bool increment_counter,\n                           __m128i *out_lo, __m128i *out_hi) {\n  uint64_t mask = (increment_counter ? ~0 : 0);\n  __m256i mask_vec = _mm256_set1_epi64x(mask);\n  __m256i deltas = _mm256_setr_epi64x(0, 1, 2, 3);\n  deltas = _mm256_and_si256(mask_vec, deltas);\n  __m256i counters =\n      _mm256_add_epi64(_mm256_set1_epi64x((int64_t)counter), deltas);\n  *out_lo = _mm256_cvtepi64_epi32(counters);\n  *out_hi = _mm256_cvtepi64_epi32(_mm256_srli_epi64(counters, 32));\n}\n\nstatic\nvoid blake3_hash4_avx512(const uint8_t *const *inputs, size_t blocks,\n                         const uint32_t key[8], uint64_t counter,\n                         bool increment_counter, uint8_t flags,\n                         uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  __m128i h_vecs[8] = {\n      set1_128(key[0]), set1_128(key[1]), set1_128(key[2]), set1_128(key[3]),\n      set1_128(key[4]), set1_128(key[5]), set1_128(key[6]), set1_128(key[7]),\n  };\n  __m128i counter_low_vec, counter_high_vec;\n  load_counters4(counter, increment_counter, &counter_low_vec,\n                 &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    __m128i block_len_vec = set1_128(BLAKE3_BLOCK_LEN);\n    __m128i block_flags_vec = set1_128(block_flags);\n    __m128i msg_vecs[16];\n    transpose_msg_vecs4(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    __m128i v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],\n        set1_128(IV[0]), set1_128(IV[1]),  set1_128(IV[2]), set1_128(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,\n    };\n    round_fn4(v, msg_vecs, 0);\n    round_fn4(v, msg_vecs, 1);\n    round_fn4(v, msg_vecs, 2);\n    round_fn4(v, msg_vecs, 3);\n    round_fn4(v, msg_vecs, 4);\n    round_fn4(v, msg_vecs, 5);\n    round_fn4(v, msg_vecs, 6);\n    h_vecs[0] = xor_128(v[0], v[8]);\n    h_vecs[1] = xor_128(v[1], v[9]);\n    h_vecs[2] = xor_128(v[2], v[10]);\n    h_vecs[3] = xor_128(v[3], v[11]);\n    h_vecs[4] = xor_128(v[4], v[12]);\n    h_vecs[5] = xor_128(v[5], v[13]);\n    h_vecs[6] = xor_128(v[6], v[14]);\n    h_vecs[7] = xor_128(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs_128(&h_vecs[0]);\n  transpose_vecs_128(&h_vecs[4]);\n  // The first four vecs now contain the first half of each output, and the\n  // second four vecs contain the second half of each output.\n  storeu_128(h_vecs[0], &out[0 * sizeof(__m128i)]);\n  storeu_128(h_vecs[4], &out[1 * sizeof(__m128i)]);\n  storeu_128(h_vecs[1], &out[2 * sizeof(__m128i)]);\n  storeu_128(h_vecs[5], &out[3 * sizeof(__m128i)]);\n  storeu_128(h_vecs[2], &out[4 * sizeof(__m128i)]);\n  storeu_128(h_vecs[6], &out[5 * sizeof(__m128i)]);\n  storeu_128(h_vecs[3], &out[6 * sizeof(__m128i)]);\n  storeu_128(h_vecs[7], &out[7 * sizeof(__m128i)]);\n}\n\n/*\n * ----------------------------------------------------------------------------\n * hash8_avx512\n * ----------------------------------------------------------------------------\n */\n\nINLINE void round_fn8(__m256i v[16], __m256i m[16], size_t r) {\n  v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = add_256(v[0], v[4]);\n  v[1] = add_256(v[1], v[5]);\n  v[2] = add_256(v[2], v[6]);\n  v[3] = add_256(v[3], v[7]);\n  v[12] = xor_256(v[12], v[0]);\n  v[13] = xor_256(v[13], v[1]);\n  v[14] = xor_256(v[14], v[2]);\n  v[15] = xor_256(v[15], v[3]);\n  v[12] = rot16_256(v[12]);\n  v[13] = rot16_256(v[13]);\n  v[14] = rot16_256(v[14]);\n  v[15] = rot16_256(v[15]);\n  v[8] = add_256(v[8], v[12]);\n  v[9] = add_256(v[9], v[13]);\n  v[10] = add_256(v[10], v[14]);\n  v[11] = add_256(v[11], v[15]);\n  v[4] = xor_256(v[4], v[8]);\n  v[5] = xor_256(v[5], v[9]);\n  v[6] = xor_256(v[6], v[10]);\n  v[7] = xor_256(v[7], v[11]);\n  v[4] = rot12_256(v[4]);\n  v[5] = rot12_256(v[5]);\n  v[6] = rot12_256(v[6]);\n  v[7] = rot12_256(v[7]);\n  v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = add_256(v[0], v[4]);\n  v[1] = add_256(v[1], v[5]);\n  v[2] = add_256(v[2], v[6]);\n  v[3] = add_256(v[3], v[7]);\n  v[12] = xor_256(v[12], v[0]);\n  v[13] = xor_256(v[13], v[1]);\n  v[14] = xor_256(v[14], v[2]);\n  v[15] = xor_256(v[15], v[3]);\n  v[12] = rot8_256(v[12]);\n  v[13] = rot8_256(v[13]);\n  v[14] = rot8_256(v[14]);\n  v[15] = rot8_256(v[15]);\n  v[8] = add_256(v[8], v[12]);\n  v[9] = add_256(v[9], v[13]);\n  v[10] = add_256(v[10], v[14]);\n  v[11] = add_256(v[11], v[15]);\n  v[4] = xor_256(v[4], v[8]);\n  v[5] = xor_256(v[5], v[9]);\n  v[6] = xor_256(v[6], v[10]);\n  v[7] = xor_256(v[7], v[11]);\n  v[4] = rot7_256(v[4]);\n  v[5] = rot7_256(v[5]);\n  v[6] = rot7_256(v[6]);\n  v[7] = rot7_256(v[7]);\n\n  v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = add_256(v[0], v[5]);\n  v[1] = add_256(v[1], v[6]);\n  v[2] = add_256(v[2], v[7]);\n  v[3] = add_256(v[3], v[4]);\n  v[15] = xor_256(v[15], v[0]);\n  v[12] = xor_256(v[12], v[1]);\n  v[13] = xor_256(v[13], v[2]);\n  v[14] = xor_256(v[14], v[3]);\n  v[15] = rot16_256(v[15]);\n  v[12] = rot16_256(v[12]);\n  v[13] = rot16_256(v[13]);\n  v[14] = rot16_256(v[14]);\n  v[10] = add_256(v[10], v[15]);\n  v[11] = add_256(v[11], v[12]);\n  v[8] = add_256(v[8], v[13]);\n  v[9] = add_256(v[9], v[14]);\n  v[5] = xor_256(v[5], v[10]);\n  v[6] = xor_256(v[6], v[11]);\n  v[7] = xor_256(v[7], v[8]);\n  v[4] = xor_256(v[4], v[9]);\n  v[5] = rot12_256(v[5]);\n  v[6] = rot12_256(v[6]);\n  v[7] = rot12_256(v[7]);\n  v[4] = rot12_256(v[4]);\n  v[0] = add_256(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = add_256(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = add_256(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = add_256(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = add_256(v[0], v[5]);\n  v[1] = add_256(v[1], v[6]);\n  v[2] = add_256(v[2], v[7]);\n  v[3] = add_256(v[3], v[4]);\n  v[15] = xor_256(v[15], v[0]);\n  v[12] = xor_256(v[12], v[1]);\n  v[13] = xor_256(v[13], v[2]);\n  v[14] = xor_256(v[14], v[3]);\n  v[15] = rot8_256(v[15]);\n  v[12] = rot8_256(v[12]);\n  v[13] = rot8_256(v[13]);\n  v[14] = rot8_256(v[14]);\n  v[10] = add_256(v[10], v[15]);\n  v[11] = add_256(v[11], v[12]);\n  v[8] = add_256(v[8], v[13]);\n  v[9] = add_256(v[9], v[14]);\n  v[5] = xor_256(v[5], v[10]);\n  v[6] = xor_256(v[6], v[11]);\n  v[7] = xor_256(v[7], v[8]);\n  v[4] = xor_256(v[4], v[9]);\n  v[5] = rot7_256(v[5]);\n  v[6] = rot7_256(v[6]);\n  v[7] = rot7_256(v[7]);\n  v[4] = rot7_256(v[4]);\n}\n\nINLINE void transpose_vecs_256(__m256i vecs[8]) {\n  // Interleave 32-bit lanes. The low unpack is lanes 00/11/44/55, and the high\n  // is 22/33/66/77.\n  __m256i ab_0145 = _mm256_unpacklo_epi32(vecs[0], vecs[1]);\n  __m256i ab_2367 = _mm256_unpackhi_epi32(vecs[0], vecs[1]);\n  __m256i cd_0145 = _mm256_unpacklo_epi32(vecs[2], vecs[3]);\n  __m256i cd_2367 = _mm256_unpackhi_epi32(vecs[2], vecs[3]);\n  __m256i ef_0145 = _mm256_unpacklo_epi32(vecs[4], vecs[5]);\n  __m256i ef_2367 = _mm256_unpackhi_epi32(vecs[4], vecs[5]);\n  __m256i gh_0145 = _mm256_unpacklo_epi32(vecs[6], vecs[7]);\n  __m256i gh_2367 = _mm256_unpackhi_epi32(vecs[6], vecs[7]);\n\n  // Interleave 64-bit lanes. The low unpack is lanes 00/22 and the high is\n  // 11/33.\n  __m256i abcd_04 = _mm256_unpacklo_epi64(ab_0145, cd_0145);\n  __m256i abcd_15 = _mm256_unpackhi_epi64(ab_0145, cd_0145);\n  __m256i abcd_26 = _mm256_unpacklo_epi64(ab_2367, cd_2367);\n  __m256i abcd_37 = _mm256_unpackhi_epi64(ab_2367, cd_2367);\n  __m256i efgh_04 = _mm256_unpacklo_epi64(ef_0145, gh_0145);\n  __m256i efgh_15 = _mm256_unpackhi_epi64(ef_0145, gh_0145);\n  __m256i efgh_26 = _mm256_unpacklo_epi64(ef_2367, gh_2367);\n  __m256i efgh_37 = _mm256_unpackhi_epi64(ef_2367, gh_2367);\n\n  // Interleave 128-bit lanes.\n  vecs[0] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x20);\n  vecs[1] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x20);\n  vecs[2] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x20);\n  vecs[3] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x20);\n  vecs[4] = _mm256_permute2x128_si256(abcd_04, efgh_04, 0x31);\n  vecs[5] = _mm256_permute2x128_si256(abcd_15, efgh_15, 0x31);\n  vecs[6] = _mm256_permute2x128_si256(abcd_26, efgh_26, 0x31);\n  vecs[7] = _mm256_permute2x128_si256(abcd_37, efgh_37, 0x31);\n}\n\nINLINE void transpose_msg_vecs8(const uint8_t *const *inputs,\n                                size_t block_offset, __m256i out[16]) {\n  out[0] = loadu_256(&inputs[0][block_offset + 0 * sizeof(__m256i)]);\n  out[1] = loadu_256(&inputs[1][block_offset + 0 * sizeof(__m256i)]);\n  out[2] = loadu_256(&inputs[2][block_offset + 0 * sizeof(__m256i)]);\n  out[3] = loadu_256(&inputs[3][block_offset + 0 * sizeof(__m256i)]);\n  out[4] = loadu_256(&inputs[4][block_offset + 0 * sizeof(__m256i)]);\n  out[5] = loadu_256(&inputs[5][block_offset + 0 * sizeof(__m256i)]);\n  out[6] = loadu_256(&inputs[6][block_offset + 0 * sizeof(__m256i)]);\n  out[7] = loadu_256(&inputs[7][block_offset + 0 * sizeof(__m256i)]);\n  out[8] = loadu_256(&inputs[0][block_offset + 1 * sizeof(__m256i)]);\n  out[9] = loadu_256(&inputs[1][block_offset + 1 * sizeof(__m256i)]);\n  out[10] = loadu_256(&inputs[2][block_offset + 1 * sizeof(__m256i)]);\n  out[11] = loadu_256(&inputs[3][block_offset + 1 * sizeof(__m256i)]);\n  out[12] = loadu_256(&inputs[4][block_offset + 1 * sizeof(__m256i)]);\n  out[13] = loadu_256(&inputs[5][block_offset + 1 * sizeof(__m256i)]);\n  out[14] = loadu_256(&inputs[6][block_offset + 1 * sizeof(__m256i)]);\n  out[15] = loadu_256(&inputs[7][block_offset + 1 * sizeof(__m256i)]);\n  for (size_t i = 0; i < 8; ++i) {\n    _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0);\n  }\n  transpose_vecs_256(&out[0]);\n  transpose_vecs_256(&out[8]);\n}\n\nINLINE void load_counters8(uint64_t counter, bool increment_counter,\n                           __m256i *out_lo, __m256i *out_hi) {\n  uint64_t mask = (increment_counter ? ~0 : 0);\n  __m512i mask_vec = _mm512_set1_epi64(mask);\n  __m512i deltas = _mm512_setr_epi64(0, 1, 2, 3, 4, 5, 6, 7);\n  deltas = _mm512_and_si512(mask_vec, deltas);\n  __m512i counters =\n      _mm512_add_epi64(_mm512_set1_epi64((int64_t)counter), deltas);\n  *out_lo = _mm512_cvtepi64_epi32(counters);\n  *out_hi = _mm512_cvtepi64_epi32(_mm512_srli_epi64(counters, 32));\n}\n\nstatic\nvoid blake3_hash8_avx512(const uint8_t *const *inputs, size_t blocks,\n                         const uint32_t key[8], uint64_t counter,\n                         bool increment_counter, uint8_t flags,\n                         uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  __m256i h_vecs[8] = {\n      set1_256(key[0]), set1_256(key[1]), set1_256(key[2]), set1_256(key[3]),\n      set1_256(key[4]), set1_256(key[5]), set1_256(key[6]), set1_256(key[7]),\n  };\n  __m256i counter_low_vec, counter_high_vec;\n  load_counters8(counter, increment_counter, &counter_low_vec,\n                 &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    __m256i block_len_vec = set1_256(BLAKE3_BLOCK_LEN);\n    __m256i block_flags_vec = set1_256(block_flags);\n    __m256i msg_vecs[16];\n    transpose_msg_vecs8(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    __m256i v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],\n        set1_256(IV[0]), set1_256(IV[1]),  set1_256(IV[2]), set1_256(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,\n    };\n    round_fn8(v, msg_vecs, 0);\n    round_fn8(v, msg_vecs, 1);\n    round_fn8(v, msg_vecs, 2);\n    round_fn8(v, msg_vecs, 3);\n    round_fn8(v, msg_vecs, 4);\n    round_fn8(v, msg_vecs, 5);\n    round_fn8(v, msg_vecs, 6);\n    h_vecs[0] = xor_256(v[0], v[8]);\n    h_vecs[1] = xor_256(v[1], v[9]);\n    h_vecs[2] = xor_256(v[2], v[10]);\n    h_vecs[3] = xor_256(v[3], v[11]);\n    h_vecs[4] = xor_256(v[4], v[12]);\n    h_vecs[5] = xor_256(v[5], v[13]);\n    h_vecs[6] = xor_256(v[6], v[14]);\n    h_vecs[7] = xor_256(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs_256(h_vecs);\n  storeu_256(h_vecs[0], &out[0 * sizeof(__m256i)]);\n  storeu_256(h_vecs[1], &out[1 * sizeof(__m256i)]);\n  storeu_256(h_vecs[2], &out[2 * sizeof(__m256i)]);\n  storeu_256(h_vecs[3], &out[3 * sizeof(__m256i)]);\n  storeu_256(h_vecs[4], &out[4 * sizeof(__m256i)]);\n  storeu_256(h_vecs[5], &out[5 * sizeof(__m256i)]);\n  storeu_256(h_vecs[6], &out[6 * sizeof(__m256i)]);\n  storeu_256(h_vecs[7], &out[7 * sizeof(__m256i)]);\n}\n\n/*\n * ----------------------------------------------------------------------------\n * hash16_avx512\n * ----------------------------------------------------------------------------\n */\n\nINLINE void round_fn16(__m512i v[16], __m512i m[16], size_t r) {\n  v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = add_512(v[0], v[4]);\n  v[1] = add_512(v[1], v[5]);\n  v[2] = add_512(v[2], v[6]);\n  v[3] = add_512(v[3], v[7]);\n  v[12] = xor_512(v[12], v[0]);\n  v[13] = xor_512(v[13], v[1]);\n  v[14] = xor_512(v[14], v[2]);\n  v[15] = xor_512(v[15], v[3]);\n  v[12] = rot16_512(v[12]);\n  v[13] = rot16_512(v[13]);\n  v[14] = rot16_512(v[14]);\n  v[15] = rot16_512(v[15]);\n  v[8] = add_512(v[8], v[12]);\n  v[9] = add_512(v[9], v[13]);\n  v[10] = add_512(v[10], v[14]);\n  v[11] = add_512(v[11], v[15]);\n  v[4] = xor_512(v[4], v[8]);\n  v[5] = xor_512(v[5], v[9]);\n  v[6] = xor_512(v[6], v[10]);\n  v[7] = xor_512(v[7], v[11]);\n  v[4] = rot12_512(v[4]);\n  v[5] = rot12_512(v[5]);\n  v[6] = rot12_512(v[6]);\n  v[7] = rot12_512(v[7]);\n  v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = add_512(v[0], v[4]);\n  v[1] = add_512(v[1], v[5]);\n  v[2] = add_512(v[2], v[6]);\n  v[3] = add_512(v[3], v[7]);\n  v[12] = xor_512(v[12], v[0]);\n  v[13] = xor_512(v[13], v[1]);\n  v[14] = xor_512(v[14], v[2]);\n  v[15] = xor_512(v[15], v[3]);\n  v[12] = rot8_512(v[12]);\n  v[13] = rot8_512(v[13]);\n  v[14] = rot8_512(v[14]);\n  v[15] = rot8_512(v[15]);\n  v[8] = add_512(v[8], v[12]);\n  v[9] = add_512(v[9], v[13]);\n  v[10] = add_512(v[10], v[14]);\n  v[11] = add_512(v[11], v[15]);\n  v[4] = xor_512(v[4], v[8]);\n  v[5] = xor_512(v[5], v[9]);\n  v[6] = xor_512(v[6], v[10]);\n  v[7] = xor_512(v[7], v[11]);\n  v[4] = rot7_512(v[4]);\n  v[5] = rot7_512(v[5]);\n  v[6] = rot7_512(v[6]);\n  v[7] = rot7_512(v[7]);\n\n  v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = add_512(v[0], v[5]);\n  v[1] = add_512(v[1], v[6]);\n  v[2] = add_512(v[2], v[7]);\n  v[3] = add_512(v[3], v[4]);\n  v[15] = xor_512(v[15], v[0]);\n  v[12] = xor_512(v[12], v[1]);\n  v[13] = xor_512(v[13], v[2]);\n  v[14] = xor_512(v[14], v[3]);\n  v[15] = rot16_512(v[15]);\n  v[12] = rot16_512(v[12]);\n  v[13] = rot16_512(v[13]);\n  v[14] = rot16_512(v[14]);\n  v[10] = add_512(v[10], v[15]);\n  v[11] = add_512(v[11], v[12]);\n  v[8] = add_512(v[8], v[13]);\n  v[9] = add_512(v[9], v[14]);\n  v[5] = xor_512(v[5], v[10]);\n  v[6] = xor_512(v[6], v[11]);\n  v[7] = xor_512(v[7], v[8]);\n  v[4] = xor_512(v[4], v[9]);\n  v[5] = rot12_512(v[5]);\n  v[6] = rot12_512(v[6]);\n  v[7] = rot12_512(v[7]);\n  v[4] = rot12_512(v[4]);\n  v[0] = add_512(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = add_512(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = add_512(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = add_512(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = add_512(v[0], v[5]);\n  v[1] = add_512(v[1], v[6]);\n  v[2] = add_512(v[2], v[7]);\n  v[3] = add_512(v[3], v[4]);\n  v[15] = xor_512(v[15], v[0]);\n  v[12] = xor_512(v[12], v[1]);\n  v[13] = xor_512(v[13], v[2]);\n  v[14] = xor_512(v[14], v[3]);\n  v[15] = rot8_512(v[15]);\n  v[12] = rot8_512(v[12]);\n  v[13] = rot8_512(v[13]);\n  v[14] = rot8_512(v[14]);\n  v[10] = add_512(v[10], v[15]);\n  v[11] = add_512(v[11], v[12]);\n  v[8] = add_512(v[8], v[13]);\n  v[9] = add_512(v[9], v[14]);\n  v[5] = xor_512(v[5], v[10]);\n  v[6] = xor_512(v[6], v[11]);\n  v[7] = xor_512(v[7], v[8]);\n  v[4] = xor_512(v[4], v[9]);\n  v[5] = rot7_512(v[5]);\n  v[6] = rot7_512(v[6]);\n  v[7] = rot7_512(v[7]);\n  v[4] = rot7_512(v[4]);\n}\n\n// 0b10001000, or lanes a0/a2/b0/b2 in little-endian order\n#define LO_IMM8 0x88\n\nINLINE __m512i unpack_lo_128(__m512i a, __m512i b) {\n  return _mm512_shuffle_i32x4(a, b, LO_IMM8);\n}\n\n// 0b11011101, or lanes a1/a3/b1/b3 in little-endian order\n#define HI_IMM8 0xdd\n\nINLINE __m512i unpack_hi_128(__m512i a, __m512i b) {\n  return _mm512_shuffle_i32x4(a, b, HI_IMM8);\n}\n\nINLINE void transpose_vecs_512(__m512i vecs[16]) {\n  // Interleave 32-bit lanes. The _0 unpack is lanes\n  // 0/0/1/1/4/4/5/5/8/8/9/9/12/12/13/13, and the _2 unpack is lanes\n  // 2/2/3/3/6/6/7/7/10/10/11/11/14/14/15/15.\n  __m512i ab_0 = _mm512_unpacklo_epi32(vecs[0], vecs[1]);\n  __m512i ab_2 = _mm512_unpackhi_epi32(vecs[0], vecs[1]);\n  __m512i cd_0 = _mm512_unpacklo_epi32(vecs[2], vecs[3]);\n  __m512i cd_2 = _mm512_unpackhi_epi32(vecs[2], vecs[3]);\n  __m512i ef_0 = _mm512_unpacklo_epi32(vecs[4], vecs[5]);\n  __m512i ef_2 = _mm512_unpackhi_epi32(vecs[4], vecs[5]);\n  __m512i gh_0 = _mm512_unpacklo_epi32(vecs[6], vecs[7]);\n  __m512i gh_2 = _mm512_unpackhi_epi32(vecs[6], vecs[7]);\n  __m512i ij_0 = _mm512_unpacklo_epi32(vecs[8], vecs[9]);\n  __m512i ij_2 = _mm512_unpackhi_epi32(vecs[8], vecs[9]);\n  __m512i kl_0 = _mm512_unpacklo_epi32(vecs[10], vecs[11]);\n  __m512i kl_2 = _mm512_unpackhi_epi32(vecs[10], vecs[11]);\n  __m512i mn_0 = _mm512_unpacklo_epi32(vecs[12], vecs[13]);\n  __m512i mn_2 = _mm512_unpackhi_epi32(vecs[12], vecs[13]);\n  __m512i op_0 = _mm512_unpacklo_epi32(vecs[14], vecs[15]);\n  __m512i op_2 = _mm512_unpackhi_epi32(vecs[14], vecs[15]);\n\n  // Interleave 64-bit lanes. The _0 unpack is lanes\n  // 0/0/0/0/4/4/4/4/8/8/8/8/12/12/12/12, the _1 unpack is lanes\n  // 1/1/1/1/5/5/5/5/9/9/9/9/13/13/13/13, the _2 unpack is lanes\n  // 2/2/2/2/6/6/6/6/10/10/10/10/14/14/14/14, and the _3 unpack is lanes\n  // 3/3/3/3/7/7/7/7/11/11/11/11/15/15/15/15.\n  __m512i abcd_0 = _mm512_unpacklo_epi64(ab_0, cd_0);\n  __m512i abcd_1 = _mm512_unpackhi_epi64(ab_0, cd_0);\n  __m512i abcd_2 = _mm512_unpacklo_epi64(ab_2, cd_2);\n  __m512i abcd_3 = _mm512_unpackhi_epi64(ab_2, cd_2);\n  __m512i efgh_0 = _mm512_unpacklo_epi64(ef_0, gh_0);\n  __m512i efgh_1 = _mm512_unpackhi_epi64(ef_0, gh_0);\n  __m512i efgh_2 = _mm512_unpacklo_epi64(ef_2, gh_2);\n  __m512i efgh_3 = _mm512_unpackhi_epi64(ef_2, gh_2);\n  __m512i ijkl_0 = _mm512_unpacklo_epi64(ij_0, kl_0);\n  __m512i ijkl_1 = _mm512_unpackhi_epi64(ij_0, kl_0);\n  __m512i ijkl_2 = _mm512_unpacklo_epi64(ij_2, kl_2);\n  __m512i ijkl_3 = _mm512_unpackhi_epi64(ij_2, kl_2);\n  __m512i mnop_0 = _mm512_unpacklo_epi64(mn_0, op_0);\n  __m512i mnop_1 = _mm512_unpackhi_epi64(mn_0, op_0);\n  __m512i mnop_2 = _mm512_unpacklo_epi64(mn_2, op_2);\n  __m512i mnop_3 = _mm512_unpackhi_epi64(mn_2, op_2);\n\n  // Interleave 128-bit lanes. The _0 unpack is\n  // 0/0/0/0/8/8/8/8/0/0/0/0/8/8/8/8, the _1 unpack is\n  // 1/1/1/1/9/9/9/9/1/1/1/1/9/9/9/9, and so on.\n  __m512i abcdefgh_0 = unpack_lo_128(abcd_0, efgh_0);\n  __m512i abcdefgh_1 = unpack_lo_128(abcd_1, efgh_1);\n  __m512i abcdefgh_2 = unpack_lo_128(abcd_2, efgh_2);\n  __m512i abcdefgh_3 = unpack_lo_128(abcd_3, efgh_3);\n  __m512i abcdefgh_4 = unpack_hi_128(abcd_0, efgh_0);\n  __m512i abcdefgh_5 = unpack_hi_128(abcd_1, efgh_1);\n  __m512i abcdefgh_6 = unpack_hi_128(abcd_2, efgh_2);\n  __m512i abcdefgh_7 = unpack_hi_128(abcd_3, efgh_3);\n  __m512i ijklmnop_0 = unpack_lo_128(ijkl_0, mnop_0);\n  __m512i ijklmnop_1 = unpack_lo_128(ijkl_1, mnop_1);\n  __m512i ijklmnop_2 = unpack_lo_128(ijkl_2, mnop_2);\n  __m512i ijklmnop_3 = unpack_lo_128(ijkl_3, mnop_3);\n  __m512i ijklmnop_4 = unpack_hi_128(ijkl_0, mnop_0);\n  __m512i ijklmnop_5 = unpack_hi_128(ijkl_1, mnop_1);\n  __m512i ijklmnop_6 = unpack_hi_128(ijkl_2, mnop_2);\n  __m512i ijklmnop_7 = unpack_hi_128(ijkl_3, mnop_3);\n\n  // Interleave 128-bit lanes again for the final outputs.\n  vecs[0] = unpack_lo_128(abcdefgh_0, ijklmnop_0);\n  vecs[1] = unpack_lo_128(abcdefgh_1, ijklmnop_1);\n  vecs[2] = unpack_lo_128(abcdefgh_2, ijklmnop_2);\n  vecs[3] = unpack_lo_128(abcdefgh_3, ijklmnop_3);\n  vecs[4] = unpack_lo_128(abcdefgh_4, ijklmnop_4);\n  vecs[5] = unpack_lo_128(abcdefgh_5, ijklmnop_5);\n  vecs[6] = unpack_lo_128(abcdefgh_6, ijklmnop_6);\n  vecs[7] = unpack_lo_128(abcdefgh_7, ijklmnop_7);\n  vecs[8] = unpack_hi_128(abcdefgh_0, ijklmnop_0);\n  vecs[9] = unpack_hi_128(abcdefgh_1, ijklmnop_1);\n  vecs[10] = unpack_hi_128(abcdefgh_2, ijklmnop_2);\n  vecs[11] = unpack_hi_128(abcdefgh_3, ijklmnop_3);\n  vecs[12] = unpack_hi_128(abcdefgh_4, ijklmnop_4);\n  vecs[13] = unpack_hi_128(abcdefgh_5, ijklmnop_5);\n  vecs[14] = unpack_hi_128(abcdefgh_6, ijklmnop_6);\n  vecs[15] = unpack_hi_128(abcdefgh_7, ijklmnop_7);\n}\n\nINLINE void transpose_msg_vecs16(const uint8_t *const *inputs,\n                                 size_t block_offset, __m512i out[16]) {\n  out[0] = loadu_512(&inputs[0][block_offset]);\n  out[1] = loadu_512(&inputs[1][block_offset]);\n  out[2] = loadu_512(&inputs[2][block_offset]);\n  out[3] = loadu_512(&inputs[3][block_offset]);\n  out[4] = loadu_512(&inputs[4][block_offset]);\n  out[5] = loadu_512(&inputs[5][block_offset]);\n  out[6] = loadu_512(&inputs[6][block_offset]);\n  out[7] = loadu_512(&inputs[7][block_offset]);\n  out[8] = loadu_512(&inputs[8][block_offset]);\n  out[9] = loadu_512(&inputs[9][block_offset]);\n  out[10] = loadu_512(&inputs[10][block_offset]);\n  out[11] = loadu_512(&inputs[11][block_offset]);\n  out[12] = loadu_512(&inputs[12][block_offset]);\n  out[13] = loadu_512(&inputs[13][block_offset]);\n  out[14] = loadu_512(&inputs[14][block_offset]);\n  out[15] = loadu_512(&inputs[15][block_offset]);\n  for (size_t i = 0; i < 16; ++i) {\n    _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0);\n  }\n  transpose_vecs_512(out);\n}\n\nINLINE void load_counters16(uint64_t counter, bool increment_counter,\n                            __m512i *out_lo, __m512i *out_hi) {\n  const __m512i mask = _mm512_set1_epi32(-(int32_t)increment_counter);\n  const __m512i deltas = _mm512_set_epi32(15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);\n  const __m512i masked_deltas = _mm512_and_si512(deltas, mask);\n  const __m512i low_words = _mm512_add_epi32(\n    _mm512_set1_epi32((int32_t)counter),\n    masked_deltas);\n  // The carry bit is 1 if the high bit of the word was 1 before addition and is\n  // 0 after.\n  // NOTE: It would be a bit more natural to use _mm512_cmp_epu32_mask to\n  // compute the carry bits here, and originally we did, but that intrinsic is\n  // broken under GCC 5.4. See https://github.com/BLAKE3-team/BLAKE3/issues/271.\n  const __m512i carries = _mm512_srli_epi32(\n    _mm512_andnot_si512(\n        low_words, // 0 after (gets inverted by andnot)\n        _mm512_set1_epi32((int32_t)counter)), // and 1 before\n    31);\n  const __m512i high_words = _mm512_add_epi32(\n    _mm512_set1_epi32((int32_t)(counter >> 32)),\n    carries);\n  *out_lo = low_words;\n  *out_hi = high_words;\n}\n\nstatic\nvoid blake3_hash16_avx512(const uint8_t *const *inputs, size_t blocks,\n                          const uint32_t key[8], uint64_t counter,\n                          bool increment_counter, uint8_t flags,\n                          uint8_t flags_start, uint8_t flags_end,\n                          uint8_t *out) {\n  __m512i h_vecs[8] = {\n      set1_512(key[0]), set1_512(key[1]), set1_512(key[2]), set1_512(key[3]),\n      set1_512(key[4]), set1_512(key[5]), set1_512(key[6]), set1_512(key[7]),\n  };\n  __m512i counter_low_vec, counter_high_vec;\n  load_counters16(counter, increment_counter, &counter_low_vec,\n                  &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    __m512i block_len_vec = set1_512(BLAKE3_BLOCK_LEN);\n    __m512i block_flags_vec = set1_512(block_flags);\n    __m512i msg_vecs[16];\n    transpose_msg_vecs16(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    __m512i v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],\n        set1_512(IV[0]), set1_512(IV[1]),  set1_512(IV[2]), set1_512(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,\n    };\n    round_fn16(v, msg_vecs, 0);\n    round_fn16(v, msg_vecs, 1);\n    round_fn16(v, msg_vecs, 2);\n    round_fn16(v, msg_vecs, 3);\n    round_fn16(v, msg_vecs, 4);\n    round_fn16(v, msg_vecs, 5);\n    round_fn16(v, msg_vecs, 6);\n    h_vecs[0] = xor_512(v[0], v[8]);\n    h_vecs[1] = xor_512(v[1], v[9]);\n    h_vecs[2] = xor_512(v[2], v[10]);\n    h_vecs[3] = xor_512(v[3], v[11]);\n    h_vecs[4] = xor_512(v[4], v[12]);\n    h_vecs[5] = xor_512(v[5], v[13]);\n    h_vecs[6] = xor_512(v[6], v[14]);\n    h_vecs[7] = xor_512(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  // transpose_vecs_512 operates on a 16x16 matrix of words, but we only have 8\n  // state vectors. Pad the matrix with zeros. After transposition, store the\n  // lower half of each vector.\n  __m512i padded[16] = {\n      h_vecs[0],   h_vecs[1],   h_vecs[2],   h_vecs[3],\n      h_vecs[4],   h_vecs[5],   h_vecs[6],   h_vecs[7],\n      set1_512(0), set1_512(0), set1_512(0), set1_512(0),\n      set1_512(0), set1_512(0), set1_512(0), set1_512(0),\n  };\n  transpose_vecs_512(padded);\n  _mm256_mask_storeu_epi32(&out[0 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[0]));\n  _mm256_mask_storeu_epi32(&out[1 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[1]));\n  _mm256_mask_storeu_epi32(&out[2 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[2]));\n  _mm256_mask_storeu_epi32(&out[3 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[3]));\n  _mm256_mask_storeu_epi32(&out[4 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[4]));\n  _mm256_mask_storeu_epi32(&out[5 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[5]));\n  _mm256_mask_storeu_epi32(&out[6 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[6]));\n  _mm256_mask_storeu_epi32(&out[7 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[7]));\n  _mm256_mask_storeu_epi32(&out[8 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[8]));\n  _mm256_mask_storeu_epi32(&out[9 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[9]));\n  _mm256_mask_storeu_epi32(&out[10 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[10]));\n  _mm256_mask_storeu_epi32(&out[11 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[11]));\n  _mm256_mask_storeu_epi32(&out[12 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[12]));\n  _mm256_mask_storeu_epi32(&out[13 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[13]));\n  _mm256_mask_storeu_epi32(&out[14 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[14]));\n  _mm256_mask_storeu_epi32(&out[15 * sizeof(__m256i)], (__mmask8)-1, _mm512_castsi512_si256(padded[15]));\n}\n\n/*\n * ----------------------------------------------------------------------------\n * hash_many_avx512\n * ----------------------------------------------------------------------------\n */\n\nINLINE void hash_one_avx512(const uint8_t *input, size_t blocks,\n                            const uint32_t key[8], uint64_t counter,\n                            uint8_t flags, uint8_t flags_start,\n                            uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    blake3_compress_in_place_avx512(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                    block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  memcpy(out, cv, BLAKE3_OUT_LEN);\n}\n\nvoid blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs,\n                             size_t blocks, const uint32_t key[8],\n                             uint64_t counter, bool increment_counter,\n                             uint8_t flags, uint8_t flags_start,\n                             uint8_t flags_end, uint8_t *out) {\n  while (num_inputs >= 16) {\n    blake3_hash16_avx512(inputs, blocks, key, counter, increment_counter, flags,\n                         flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += 16;\n    }\n    inputs += 16;\n    num_inputs -= 16;\n    out = &out[16 * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs >= 8) {\n    blake3_hash8_avx512(inputs, blocks, key, counter, increment_counter, flags,\n                        flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += 8;\n    }\n    inputs += 8;\n    num_inputs -= 8;\n    out = &out[8 * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs >= 4) {\n    blake3_hash4_avx512(inputs, blocks, key, counter, increment_counter, flags,\n                        flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += 4;\n    }\n    inputs += 4;\n    num_inputs -= 4;\n    out = &out[4 * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs > 0) {\n    hash_one_avx512(inputs[0], blocks, key, counter, flags, flags_start,\n                    flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_dispatch.c",
    "content": "#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"blake3_impl.h\"\n\n#if defined(IS_X86)\n#if defined(_MSC_VER)\n#include <intrin.h>\n#elif defined(__GNUC__)\n#include <immintrin.h>\n#else\n#undef IS_X86 /* Unimplemented! */\n#endif\n#endif\n\n\n#if !defined(BLAKE3_ATOMICS)\n#if defined(__has_include)\n#if __has_include(<stdatomic.h>) && !defined(_MSC_VER)\n#define BLAKE3_ATOMICS 1\n#else\n#define BLAKE3_ATOMICS 0\n#endif /* __has_include(<stdatomic.h>) && !defined(_MSC_VER) */\n#else\n#define BLAKE3_ATOMICS 0\n#endif /* defined(__has_include) */\n#endif /* BLAKE3_ATOMICS */\n\n#if BLAKE3_ATOMICS\n#define ATOMIC_INT _Atomic int\n#define ATOMIC_LOAD(x) x\n#define ATOMIC_STORE(x, y) x = y\n#elif defined(_MSC_VER)\n#define ATOMIC_INT long\n#define ATOMIC_LOAD(x) _InterlockedOr(&x, 0)\n#define ATOMIC_STORE(x, y) _InterlockedExchange(&x, y)\n#else\n#define ATOMIC_INT int\n#define ATOMIC_LOAD(x) x\n#define ATOMIC_STORE(x, y) x = y\n#endif\n\n#define MAYBE_UNUSED(x) (void)((x))\n\n#if defined(IS_X86)\nstatic uint64_t xgetbv(void) {\n#if defined(_MSC_VER)\n  return _xgetbv(0);\n#else\n  uint32_t eax = 0, edx = 0;\n  __asm__ __volatile__(\"xgetbv\\n\" : \"=a\"(eax), \"=d\"(edx) : \"c\"(0));\n  return ((uint64_t)edx << 32) | eax;\n#endif\n}\n\nstatic void cpuid(uint32_t out[4], uint32_t id) {\n#if defined(_MSC_VER)\n  __cpuid((int *)out, id);\n#elif defined(__i386__) || defined(_M_IX86)\n  __asm__ __volatile__(\"movl %%ebx, %1\\n\"\n                       \"cpuid\\n\"\n                       \"xchgl %1, %%ebx\\n\"\n                       : \"=a\"(out[0]), \"=r\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id));\n#else\n  __asm__ __volatile__(\"cpuid\\n\"\n                       : \"=a\"(out[0]), \"=b\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id));\n#endif\n}\n\nstatic void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) {\n#if defined(_MSC_VER)\n  __cpuidex((int *)out, id, sid);\n#elif defined(__i386__) || defined(_M_IX86)\n  __asm__ __volatile__(\"movl %%ebx, %1\\n\"\n                       \"cpuid\\n\"\n                       \"xchgl %1, %%ebx\\n\"\n                       : \"=a\"(out[0]), \"=r\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id), \"c\"(sid));\n#else\n  __asm__ __volatile__(\"cpuid\\n\"\n                       : \"=a\"(out[0]), \"=b\"(out[1]), \"=c\"(out[2]), \"=d\"(out[3])\n                       : \"a\"(id), \"c\"(sid));\n#endif\n}\n\n#endif\n\nenum cpu_feature {\n  SSE2 = 1 << 0,\n  SSSE3 = 1 << 1,\n  SSE41 = 1 << 2,\n  AVX = 1 << 3,\n  AVX2 = 1 << 4,\n  AVX512F = 1 << 5,\n  AVX512VL = 1 << 6,\n  /* ... */\n  UNDEFINED = 1 << 30\n};\n\n#if !defined(BLAKE3_TESTING)\nstatic /* Allow the variable to be controlled manually for testing */\n#endif\n    ATOMIC_INT g_cpu_features = UNDEFINED;\n\n#if !defined(BLAKE3_TESTING)\nstatic\n#endif\n    enum cpu_feature\n    get_cpu_features(void) {\n\n  /* If TSAN detects a data race here, try compiling with -DBLAKE3_ATOMICS=1 */\n  long features = ATOMIC_LOAD(g_cpu_features);\n  if (features != UNDEFINED) {\n    return (enum cpu_feature)features;\n  } else {\n#if defined(IS_X86)\n    uint32_t regs[4] = {0};\n    uint32_t *eax = &regs[0], *ebx = &regs[1], *ecx = &regs[2], *edx = &regs[3];\n    (void)edx;\n    features = 0;\n    cpuid(regs, 0);\n    const int max_id = *eax;\n    cpuid(regs, 1);\n#if defined(__amd64__) || defined(_M_X64)\n    features |= SSE2;\n#else\n    if (*edx & (1UL << 26))\n      features |= SSE2;\n#endif\n    if (*ecx & (1UL << 9))\n      features |= SSSE3;\n    if (*ecx & (1UL << 19))\n      features |= SSE41;\n\n    if (*ecx & (1UL << 27)) { // OSXSAVE\n      const uint64_t mask = xgetbv();\n      if ((mask & 6) == 6) { // SSE and AVX states\n        if (*ecx & (1UL << 28))\n          features |= AVX;\n        if (max_id >= 7) {\n          cpuidex(regs, 7, 0);\n          if (*ebx & (1UL << 5))\n            features |= AVX2;\n          if ((mask & 224) == 224) { // Opmask, ZMM_Hi256, Hi16_Zmm\n            if (*ebx & (1UL << 31))\n              features |= AVX512VL;\n            if (*ebx & (1UL << 16))\n              features |= AVX512F;\n          }\n        }\n      }\n    }\n    ATOMIC_STORE(g_cpu_features, features);\n    return (enum cpu_feature)features;\n#else\n    /* How to detect NEON? */\n    return 0;\n#endif\n  }\n}\n\nvoid blake3_compress_in_place(uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if (features & AVX512VL) {\n    blake3_compress_in_place_avx512(cv, block, block_len, counter, flags);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    blake3_compress_in_place_sse41(cv, block, block_len, counter, flags);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    blake3_compress_in_place_sse2(cv, block, block_len, counter, flags);\n    return;\n  }\n#endif\n#endif\n  blake3_compress_in_place_portable(cv, block, block_len, counter, flags);\n}\n\nvoid blake3_compress_xof(const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags,\n                         uint8_t out[64]) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if (features & AVX512VL) {\n    blake3_compress_xof_avx512(cv, block, block_len, counter, flags, out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    blake3_compress_xof_sse41(cv, block, block_len, counter, flags, out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    blake3_compress_xof_sse2(cv, block, block_len, counter, flags, out);\n    return;\n  }\n#endif\n#endif\n  blake3_compress_xof_portable(cv, block, block_len, counter, flags, out);\n}\n\nvoid blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,\n                      size_t blocks, const uint32_t key[8], uint64_t counter,\n                      bool increment_counter, uint8_t flags,\n                      uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) {\n    blake3_hash_many_avx512(inputs, num_inputs, blocks, key, counter,\n                            increment_counter, flags, flags_start, flags_end,\n                            out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_AVX2)\n  if (features & AVX2) {\n    blake3_hash_many_avx2(inputs, num_inputs, blocks, key, counter,\n                          increment_counter, flags, flags_start, flags_end,\n                          out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    blake3_hash_many_sse41(inputs, num_inputs, blocks, key, counter,\n                           increment_counter, flags, flags_start, flags_end,\n                           out);\n    return;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    blake3_hash_many_sse2(inputs, num_inputs, blocks, key, counter,\n                          increment_counter, flags, flags_start, flags_end,\n                          out);\n    return;\n  }\n#endif\n#endif\n\n#if BLAKE3_USE_NEON == 1\n  blake3_hash_many_neon(inputs, num_inputs, blocks, key, counter,\n                        increment_counter, flags, flags_start, flags_end, out);\n  return;\n#endif\n\n  blake3_hash_many_portable(inputs, num_inputs, blocks, key, counter,\n                            increment_counter, flags, flags_start, flags_end,\n                            out);\n}\n\n// The dynamically detected SIMD degree of the current platform.\nsize_t blake3_simd_degree(void) {\n#if defined(IS_X86)\n  const enum cpu_feature features = get_cpu_features();\n  MAYBE_UNUSED(features);\n#if !defined(BLAKE3_NO_AVX512)\n  if ((features & (AVX512F|AVX512VL)) == (AVX512F|AVX512VL)) {\n    return 16;\n  }\n#endif\n#if !defined(BLAKE3_NO_AVX2)\n  if (features & AVX2) {\n    return 8;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE41)\n  if (features & SSE41) {\n    return 4;\n  }\n#endif\n#if !defined(BLAKE3_NO_SSE2)\n  if (features & SSE2) {\n    return 4;\n  }\n#endif\n#endif\n#if BLAKE3_USE_NEON == 1\n  return 4;\n#endif\n  return 1;\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_impl.h",
    "content": "#ifndef BLAKE3_IMPL_H\n#define BLAKE3_IMPL_H\n\n#include <assert.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n\n#include \"blake3.h\"\n\n// internal flags\nenum blake3_flags {\n  CHUNK_START         = 1 << 0,\n  CHUNK_END           = 1 << 1,\n  PARENT              = 1 << 2,\n  ROOT                = 1 << 3,\n  KEYED_HASH          = 1 << 4,\n  DERIVE_KEY_CONTEXT  = 1 << 5,\n  DERIVE_KEY_MATERIAL = 1 << 6,\n};\n\n// This C implementation tries to support recent versions of GCC, Clang, and\n// MSVC.\n#if defined(_MSC_VER)\n#define INLINE static __forceinline\n#else\n#define INLINE static inline __attribute__((always_inline))\n#endif\n\n#if defined(__x86_64__) || defined(_M_X64) \n#define IS_X86\n#define IS_X86_64\n#endif\n\n#if defined(__i386__) || defined(_M_IX86)\n#define IS_X86\n#define IS_X86_32\n#endif\n\n#if defined(__aarch64__) || defined(_M_ARM64)\n#define IS_AARCH64\n#endif\n\n#if defined(IS_X86)\n#if defined(_MSC_VER)\n#include <intrin.h>\n#endif\n#endif\n\n#if !defined(BLAKE3_USE_NEON) \n  // If BLAKE3_USE_NEON not manually set, autodetect based on AArch64ness\n  #if defined(IS_AARCH64)\n    #if defined(__ARM_BIG_ENDIAN)\n      #define BLAKE3_USE_NEON 0\n    #else\n      #define BLAKE3_USE_NEON 1\n    #endif\n  #else\n    #define BLAKE3_USE_NEON 0\n  #endif\n#endif\n\n#if defined(IS_X86)\n#define MAX_SIMD_DEGREE 16\n#elif BLAKE3_USE_NEON == 1\n#define MAX_SIMD_DEGREE 4\n#else\n#define MAX_SIMD_DEGREE 1\n#endif\n\n// There are some places where we want a static size that's equal to the\n// MAX_SIMD_DEGREE, but also at least 2.\n#define MAX_SIMD_DEGREE_OR_2 (MAX_SIMD_DEGREE > 2 ? MAX_SIMD_DEGREE : 2)\n\nstatic const uint32_t IV[8] = {0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL,\n                               0xA54FF53AUL, 0x510E527FUL, 0x9B05688CUL,\n                               0x1F83D9ABUL, 0x5BE0CD19UL};\n\nstatic const uint8_t MSG_SCHEDULE[7][16] = {\n    {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},\n    {2, 6, 3, 10, 7, 0, 4, 13, 1, 11, 12, 5, 9, 14, 15, 8},\n    {3, 4, 10, 12, 13, 2, 7, 14, 6, 5, 9, 0, 11, 15, 8, 1},\n    {10, 7, 12, 9, 14, 3, 13, 15, 4, 0, 11, 2, 5, 8, 1, 6},\n    {12, 13, 9, 11, 15, 10, 14, 8, 7, 2, 5, 3, 0, 1, 6, 4},\n    {9, 14, 11, 5, 8, 12, 15, 1, 13, 3, 0, 10, 2, 6, 4, 7},\n    {11, 15, 5, 0, 1, 9, 8, 6, 14, 10, 2, 12, 3, 4, 7, 13},\n};\n\n/* Find index of the highest set bit */\n/* x is assumed to be nonzero.       */\nstatic unsigned int highest_one(uint64_t x) {\n#if defined(__GNUC__) || defined(__clang__)\n  return 63 ^ (unsigned int)__builtin_clzll(x);\n#elif defined(_MSC_VER) && defined(IS_X86_64)\n  unsigned long index;\n  _BitScanReverse64(&index, x);\n  return index;\n#elif defined(_MSC_VER) && defined(IS_X86_32)\n  if(x >> 32) {\n    unsigned long index;\n    _BitScanReverse(&index, (unsigned long)(x >> 32));\n    return 32 + index;\n  } else {\n    unsigned long index;\n    _BitScanReverse(&index, (unsigned long)x);\n    return index;\n  }\n#else\n  unsigned int c = 0;\n  if(x & 0xffffffff00000000ULL) { x >>= 32; c += 32; }\n  if(x & 0x00000000ffff0000ULL) { x >>= 16; c += 16; }\n  if(x & 0x000000000000ff00ULL) { x >>=  8; c +=  8; }\n  if(x & 0x00000000000000f0ULL) { x >>=  4; c +=  4; }\n  if(x & 0x000000000000000cULL) { x >>=  2; c +=  2; }\n  if(x & 0x0000000000000002ULL) {           c +=  1; }\n  return c;\n#endif\n}\n\n// Count the number of 1 bits.\nINLINE unsigned int popcnt(uint64_t x) {\n#if defined(__GNUC__) || defined(__clang__)\n  return (unsigned int)__builtin_popcountll(x);\n#else\n  unsigned int count = 0;\n  while (x != 0) {\n    count += 1;\n    x &= x - 1;\n  }\n  return count;\n#endif\n}\n\n// Largest power of two less than or equal to x. As a special case, returns 1\n// when x is 0. \nINLINE uint64_t round_down_to_power_of_2(uint64_t x) {\n  return 1ULL << highest_one(x | 1);\n}\n\nINLINE uint32_t counter_low(uint64_t counter) { return (uint32_t)counter; }\n\nINLINE uint32_t counter_high(uint64_t counter) {\n  return (uint32_t)(counter >> 32);\n}\n\nINLINE uint32_t load32(const void *src) {\n  const uint8_t *p = (const uint8_t *)src;\n  return ((uint32_t)(p[0]) << 0) | ((uint32_t)(p[1]) << 8) |\n         ((uint32_t)(p[2]) << 16) | ((uint32_t)(p[3]) << 24);\n}\n\nINLINE void load_key_words(const uint8_t key[BLAKE3_KEY_LEN],\n                           uint32_t key_words[8]) {\n  key_words[0] = load32(&key[0 * 4]);\n  key_words[1] = load32(&key[1 * 4]);\n  key_words[2] = load32(&key[2 * 4]);\n  key_words[3] = load32(&key[3 * 4]);\n  key_words[4] = load32(&key[4 * 4]);\n  key_words[5] = load32(&key[5 * 4]);\n  key_words[6] = load32(&key[6 * 4]);\n  key_words[7] = load32(&key[7 * 4]);\n}\n\nINLINE void store32(void *dst, uint32_t w) {\n  uint8_t *p = (uint8_t *)dst;\n  p[0] = (uint8_t)(w >> 0);\n  p[1] = (uint8_t)(w >> 8);\n  p[2] = (uint8_t)(w >> 16);\n  p[3] = (uint8_t)(w >> 24);\n}\n\nINLINE void store_cv_words(uint8_t bytes_out[32], uint32_t cv_words[8]) {\n  store32(&bytes_out[0 * 4], cv_words[0]);\n  store32(&bytes_out[1 * 4], cv_words[1]);\n  store32(&bytes_out[2 * 4], cv_words[2]);\n  store32(&bytes_out[3 * 4], cv_words[3]);\n  store32(&bytes_out[4 * 4], cv_words[4]);\n  store32(&bytes_out[5 * 4], cv_words[5]);\n  store32(&bytes_out[6 * 4], cv_words[6]);\n  store32(&bytes_out[7 * 4], cv_words[7]);\n}\n\nvoid blake3_compress_in_place(uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags);\n\nvoid blake3_compress_xof(const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags,\n                         uint8_t out[64]);\n\nvoid blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,\n                      size_t blocks, const uint32_t key[8], uint64_t counter,\n                      bool increment_counter, uint8_t flags,\n                      uint8_t flags_start, uint8_t flags_end, uint8_t *out);\n\nsize_t blake3_simd_degree(void);\n\n\n// Declarations for implementation-specific functions.\nvoid blake3_compress_in_place_portable(uint32_t cv[8],\n                                       const uint8_t block[BLAKE3_BLOCK_LEN],\n                                       uint8_t block_len, uint64_t counter,\n                                       uint8_t flags);\n\nvoid blake3_compress_xof_portable(const uint32_t cv[8],\n                                  const uint8_t block[BLAKE3_BLOCK_LEN],\n                                  uint8_t block_len, uint64_t counter,\n                                  uint8_t flags, uint8_t out[64]);\n\nvoid blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs,\n                               size_t blocks, const uint32_t key[8],\n                               uint64_t counter, bool increment_counter,\n                               uint8_t flags, uint8_t flags_start,\n                               uint8_t flags_end, uint8_t *out);\n\n#if defined(IS_X86)\n#if !defined(BLAKE3_NO_SSE2)\nvoid blake3_compress_in_place_sse2(uint32_t cv[8],\n                                   const uint8_t block[BLAKE3_BLOCK_LEN],\n                                   uint8_t block_len, uint64_t counter,\n                                   uint8_t flags);\nvoid blake3_compress_xof_sse2(const uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags, uint8_t out[64]);\nvoid blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out);\n#endif\n#if !defined(BLAKE3_NO_SSE41)\nvoid blake3_compress_in_place_sse41(uint32_t cv[8],\n                                    const uint8_t block[BLAKE3_BLOCK_LEN],\n                                    uint8_t block_len, uint64_t counter,\n                                    uint8_t flags);\nvoid blake3_compress_xof_sse41(const uint32_t cv[8],\n                               const uint8_t block[BLAKE3_BLOCK_LEN],\n                               uint8_t block_len, uint64_t counter,\n                               uint8_t flags, uint8_t out[64]);\nvoid blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs,\n                            size_t blocks, const uint32_t key[8],\n                            uint64_t counter, bool increment_counter,\n                            uint8_t flags, uint8_t flags_start,\n                            uint8_t flags_end, uint8_t *out);\n#endif\n#if !defined(BLAKE3_NO_AVX2)\nvoid blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out);\n#endif\n#if !defined(BLAKE3_NO_AVX512)\nvoid blake3_compress_in_place_avx512(uint32_t cv[8],\n                                     const uint8_t block[BLAKE3_BLOCK_LEN],\n                                     uint8_t block_len, uint64_t counter,\n                                     uint8_t flags);\n\nvoid blake3_compress_xof_avx512(const uint32_t cv[8],\n                                const uint8_t block[BLAKE3_BLOCK_LEN],\n                                uint8_t block_len, uint64_t counter,\n                                uint8_t flags, uint8_t out[64]);\n\nvoid blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_inputs,\n                             size_t blocks, const uint32_t key[8],\n                             uint64_t counter, bool increment_counter,\n                             uint8_t flags, uint8_t flags_start,\n                             uint8_t flags_end, uint8_t *out);\n#endif\n#endif\n\n#if BLAKE3_USE_NEON == 1\nvoid blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out);\n#endif\n\n\n#endif /* BLAKE3_IMPL_H */\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_neon.c",
    "content": "#include \"blake3_impl.h\"\n\n#include <arm_neon.h>\n\n#ifdef __ARM_BIG_ENDIAN\n#error \"This implementation only supports little-endian ARM.\"\n// It might be that all we need for big-endian support here is to get the loads\n// and stores right, but step zero would be finding a way to test it in CI.\n#endif\n\nINLINE uint32x4_t loadu_128(const uint8_t src[16]) {\n  // vld1q_u32 has alignment requirements. Don't use it.\n  uint32x4_t x;\n  memcpy(&x, src, 16);\n  return x;\n}\n\nINLINE void storeu_128(uint32x4_t src, uint8_t dest[16]) {\n  // vst1q_u32 has alignment requirements. Don't use it.\n  memcpy(dest, &src, 16);\n}\n\nINLINE uint32x4_t add_128(uint32x4_t a, uint32x4_t b) {\n  return vaddq_u32(a, b);\n}\n\nINLINE uint32x4_t xor_128(uint32x4_t a, uint32x4_t b) {\n  return veorq_u32(a, b);\n}\n\nINLINE uint32x4_t set1_128(uint32_t x) { return vld1q_dup_u32(&x); }\n\nINLINE uint32x4_t set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {\n  uint32_t array[4] = {a, b, c, d};\n  return vld1q_u32(array);\n}\n\nINLINE uint32x4_t rot16_128(uint32x4_t x) {\n  // The straightfoward implementation would be two shifts and an or, but that's\n  // slower on microarchitectures we've tested. See\n  // https://github.com/BLAKE3-team/BLAKE3/pull/319.\n  // return vorrq_u32(vshrq_n_u32(x, 16), vshlq_n_u32(x, 32 - 16));\n  return vreinterpretq_u32_u16(vrev32q_u16(vreinterpretq_u16_u32(x)));\n}\n\nINLINE uint32x4_t rot12_128(uint32x4_t x) {\n  // See comment in rot16_128.\n  // return vorrq_u32(vshrq_n_u32(x, 12), vshlq_n_u32(x, 32 - 12));\n  return vsriq_n_u32(vshlq_n_u32(x, 32-12), x, 12);\n}\n\nINLINE uint32x4_t rot8_128(uint32x4_t x) {\n  // See comment in rot16_128.\n  // return vorrq_u32(vshrq_n_u32(x, 8), vshlq_n_u32(x, 32 - 8));\n#if defined(__clang__)\n  return vreinterpretq_u32_u8(__builtin_shufflevector(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), 1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12));\n#elif __GNUC__ * 10000 + __GNUC_MINOR__ * 100 >=40700\n  static const uint8x16_t r8 = {1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12};\n  return vreinterpretq_u32_u8(__builtin_shuffle(vreinterpretq_u8_u32(x), vreinterpretq_u8_u32(x), r8));\n#else \n  return vsriq_n_u32(vshlq_n_u32(x, 32-8), x, 8);\n#endif\n}\n\nINLINE uint32x4_t rot7_128(uint32x4_t x) {\n  // See comment in rot16_128.\n  // return vorrq_u32(vshrq_n_u32(x, 7), vshlq_n_u32(x, 32 - 7));\n  return vsriq_n_u32(vshlq_n_u32(x, 32-7), x, 7);\n}\n\n// TODO: compress_neon\n\n// TODO: hash2_neon\n\n/*\n * ----------------------------------------------------------------------------\n * hash4_neon\n * ----------------------------------------------------------------------------\n */\n\nINLINE void round_fn4(uint32x4_t v[16], uint32x4_t m[16], size_t r) {\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = add_128(v[0], v[4]);\n  v[1] = add_128(v[1], v[5]);\n  v[2] = add_128(v[2], v[6]);\n  v[3] = add_128(v[3], v[7]);\n  v[12] = xor_128(v[12], v[0]);\n  v[13] = xor_128(v[13], v[1]);\n  v[14] = xor_128(v[14], v[2]);\n  v[15] = xor_128(v[15], v[3]);\n  v[12] = rot16_128(v[12]);\n  v[13] = rot16_128(v[13]);\n  v[14] = rot16_128(v[14]);\n  v[15] = rot16_128(v[15]);\n  v[8] = add_128(v[8], v[12]);\n  v[9] = add_128(v[9], v[13]);\n  v[10] = add_128(v[10], v[14]);\n  v[11] = add_128(v[11], v[15]);\n  v[4] = xor_128(v[4], v[8]);\n  v[5] = xor_128(v[5], v[9]);\n  v[6] = xor_128(v[6], v[10]);\n  v[7] = xor_128(v[7], v[11]);\n  v[4] = rot12_128(v[4]);\n  v[5] = rot12_128(v[5]);\n  v[6] = rot12_128(v[6]);\n  v[7] = rot12_128(v[7]);\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = add_128(v[0], v[4]);\n  v[1] = add_128(v[1], v[5]);\n  v[2] = add_128(v[2], v[6]);\n  v[3] = add_128(v[3], v[7]);\n  v[12] = xor_128(v[12], v[0]);\n  v[13] = xor_128(v[13], v[1]);\n  v[14] = xor_128(v[14], v[2]);\n  v[15] = xor_128(v[15], v[3]);\n  v[12] = rot8_128(v[12]);\n  v[13] = rot8_128(v[13]);\n  v[14] = rot8_128(v[14]);\n  v[15] = rot8_128(v[15]);\n  v[8] = add_128(v[8], v[12]);\n  v[9] = add_128(v[9], v[13]);\n  v[10] = add_128(v[10], v[14]);\n  v[11] = add_128(v[11], v[15]);\n  v[4] = xor_128(v[4], v[8]);\n  v[5] = xor_128(v[5], v[9]);\n  v[6] = xor_128(v[6], v[10]);\n  v[7] = xor_128(v[7], v[11]);\n  v[4] = rot7_128(v[4]);\n  v[5] = rot7_128(v[5]);\n  v[6] = rot7_128(v[6]);\n  v[7] = rot7_128(v[7]);\n\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = add_128(v[0], v[5]);\n  v[1] = add_128(v[1], v[6]);\n  v[2] = add_128(v[2], v[7]);\n  v[3] = add_128(v[3], v[4]);\n  v[15] = xor_128(v[15], v[0]);\n  v[12] = xor_128(v[12], v[1]);\n  v[13] = xor_128(v[13], v[2]);\n  v[14] = xor_128(v[14], v[3]);\n  v[15] = rot16_128(v[15]);\n  v[12] = rot16_128(v[12]);\n  v[13] = rot16_128(v[13]);\n  v[14] = rot16_128(v[14]);\n  v[10] = add_128(v[10], v[15]);\n  v[11] = add_128(v[11], v[12]);\n  v[8] = add_128(v[8], v[13]);\n  v[9] = add_128(v[9], v[14]);\n  v[5] = xor_128(v[5], v[10]);\n  v[6] = xor_128(v[6], v[11]);\n  v[7] = xor_128(v[7], v[8]);\n  v[4] = xor_128(v[4], v[9]);\n  v[5] = rot12_128(v[5]);\n  v[6] = rot12_128(v[6]);\n  v[7] = rot12_128(v[7]);\n  v[4] = rot12_128(v[4]);\n  v[0] = add_128(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = add_128(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = add_128(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = add_128(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = add_128(v[0], v[5]);\n  v[1] = add_128(v[1], v[6]);\n  v[2] = add_128(v[2], v[7]);\n  v[3] = add_128(v[3], v[4]);\n  v[15] = xor_128(v[15], v[0]);\n  v[12] = xor_128(v[12], v[1]);\n  v[13] = xor_128(v[13], v[2]);\n  v[14] = xor_128(v[14], v[3]);\n  v[15] = rot8_128(v[15]);\n  v[12] = rot8_128(v[12]);\n  v[13] = rot8_128(v[13]);\n  v[14] = rot8_128(v[14]);\n  v[10] = add_128(v[10], v[15]);\n  v[11] = add_128(v[11], v[12]);\n  v[8] = add_128(v[8], v[13]);\n  v[9] = add_128(v[9], v[14]);\n  v[5] = xor_128(v[5], v[10]);\n  v[6] = xor_128(v[6], v[11]);\n  v[7] = xor_128(v[7], v[8]);\n  v[4] = xor_128(v[4], v[9]);\n  v[5] = rot7_128(v[5]);\n  v[6] = rot7_128(v[6]);\n  v[7] = rot7_128(v[7]);\n  v[4] = rot7_128(v[4]);\n}\n\nINLINE void transpose_vecs_128(uint32x4_t vecs[4]) {\n  // Individually transpose the four 2x2 sub-matrices in each corner.\n  uint32x4x2_t rows01 = vtrnq_u32(vecs[0], vecs[1]);\n  uint32x4x2_t rows23 = vtrnq_u32(vecs[2], vecs[3]);\n\n  // Swap the top-right and bottom-left 2x2s (which just got transposed).\n  vecs[0] =\n      vcombine_u32(vget_low_u32(rows01.val[0]), vget_low_u32(rows23.val[0]));\n  vecs[1] =\n      vcombine_u32(vget_low_u32(rows01.val[1]), vget_low_u32(rows23.val[1]));\n  vecs[2] =\n      vcombine_u32(vget_high_u32(rows01.val[0]), vget_high_u32(rows23.val[0]));\n  vecs[3] =\n      vcombine_u32(vget_high_u32(rows01.val[1]), vget_high_u32(rows23.val[1]));\n}\n\nINLINE void transpose_msg_vecs4(const uint8_t *const *inputs,\n                                size_t block_offset, uint32x4_t out[16]) {\n  out[0] = loadu_128(&inputs[0][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[1] = loadu_128(&inputs[1][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[2] = loadu_128(&inputs[2][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[3] = loadu_128(&inputs[3][block_offset + 0 * sizeof(uint32x4_t)]);\n  out[4] = loadu_128(&inputs[0][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[5] = loadu_128(&inputs[1][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[6] = loadu_128(&inputs[2][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[7] = loadu_128(&inputs[3][block_offset + 1 * sizeof(uint32x4_t)]);\n  out[8] = loadu_128(&inputs[0][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[9] = loadu_128(&inputs[1][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[10] = loadu_128(&inputs[2][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[11] = loadu_128(&inputs[3][block_offset + 2 * sizeof(uint32x4_t)]);\n  out[12] = loadu_128(&inputs[0][block_offset + 3 * sizeof(uint32x4_t)]);\n  out[13] = loadu_128(&inputs[1][block_offset + 3 * sizeof(uint32x4_t)]);\n  out[14] = loadu_128(&inputs[2][block_offset + 3 * sizeof(uint32x4_t)]);\n  out[15] = loadu_128(&inputs[3][block_offset + 3 * sizeof(uint32x4_t)]);\n  transpose_vecs_128(&out[0]);\n  transpose_vecs_128(&out[4]);\n  transpose_vecs_128(&out[8]);\n  transpose_vecs_128(&out[12]);\n}\n\nINLINE void load_counters4(uint64_t counter, bool increment_counter,\n                           uint32x4_t *out_low, uint32x4_t *out_high) {\n  uint64_t mask = (increment_counter ? ~0 : 0);\n  *out_low = set4(\n      counter_low(counter + (mask & 0)), counter_low(counter + (mask & 1)),\n      counter_low(counter + (mask & 2)), counter_low(counter + (mask & 3)));\n  *out_high = set4(\n      counter_high(counter + (mask & 0)), counter_high(counter + (mask & 1)),\n      counter_high(counter + (mask & 2)), counter_high(counter + (mask & 3)));\n}\n\nvoid blake3_hash4_neon(const uint8_t *const *inputs, size_t blocks,\n                       const uint32_t key[8], uint64_t counter,\n                       bool increment_counter, uint8_t flags,\n                       uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  uint32x4_t h_vecs[8] = {\n      set1_128(key[0]), set1_128(key[1]), set1_128(key[2]), set1_128(key[3]),\n      set1_128(key[4]), set1_128(key[5]), set1_128(key[6]), set1_128(key[7]),\n  };\n  uint32x4_t counter_low_vec, counter_high_vec;\n  load_counters4(counter, increment_counter, &counter_low_vec,\n                 &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    uint32x4_t block_len_vec = set1_128(BLAKE3_BLOCK_LEN);\n    uint32x4_t block_flags_vec = set1_128(block_flags);\n    uint32x4_t msg_vecs[16];\n    transpose_msg_vecs4(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    uint32x4_t v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],       h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],       h_vecs[7],\n        set1_128(IV[0]), set1_128(IV[1]),  set1_128(IV[2]), set1_128(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec,   block_flags_vec,\n    };\n    round_fn4(v, msg_vecs, 0);\n    round_fn4(v, msg_vecs, 1);\n    round_fn4(v, msg_vecs, 2);\n    round_fn4(v, msg_vecs, 3);\n    round_fn4(v, msg_vecs, 4);\n    round_fn4(v, msg_vecs, 5);\n    round_fn4(v, msg_vecs, 6);\n    h_vecs[0] = xor_128(v[0], v[8]);\n    h_vecs[1] = xor_128(v[1], v[9]);\n    h_vecs[2] = xor_128(v[2], v[10]);\n    h_vecs[3] = xor_128(v[3], v[11]);\n    h_vecs[4] = xor_128(v[4], v[12]);\n    h_vecs[5] = xor_128(v[5], v[13]);\n    h_vecs[6] = xor_128(v[6], v[14]);\n    h_vecs[7] = xor_128(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs_128(&h_vecs[0]);\n  transpose_vecs_128(&h_vecs[4]);\n  // The first four vecs now contain the first half of each output, and the\n  // second four vecs contain the second half of each output.\n  storeu_128(h_vecs[0], &out[0 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[4], &out[1 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[1], &out[2 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[5], &out[3 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[2], &out[4 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[6], &out[5 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[3], &out[6 * sizeof(uint32x4_t)]);\n  storeu_128(h_vecs[7], &out[7 * sizeof(uint32x4_t)]);\n}\n\n/*\n * ----------------------------------------------------------------------------\n * hash_many_neon\n * ----------------------------------------------------------------------------\n */\n\nvoid blake3_compress_in_place_portable(uint32_t cv[8],\n                                       const uint8_t block[BLAKE3_BLOCK_LEN],\n                                       uint8_t block_len, uint64_t counter,\n                                       uint8_t flags);\n\nINLINE void hash_one_neon(const uint8_t *input, size_t blocks,\n                          const uint32_t key[8], uint64_t counter,\n                          uint8_t flags, uint8_t flags_start, uint8_t flags_end,\n                          uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    // TODO: Implement compress_neon. However note that according to\n    // https://github.com/BLAKE2/BLAKE2/commit/7965d3e6e1b4193438b8d3a656787587d2579227,\n    // compress_neon might not be any faster than compress_portable.\n    blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                      block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  memcpy(out, cv, BLAKE3_OUT_LEN);\n}\n\nvoid blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out) {\n  while (num_inputs >= 4) {\n    blake3_hash4_neon(inputs, blocks, key, counter, increment_counter, flags,\n                      flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += 4;\n    }\n    inputs += 4;\n    num_inputs -= 4;\n    out = &out[4 * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs > 0) {\n    hash_one_neon(inputs[0], blocks, key, counter, flags, flags_start,\n                  flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_portable.c",
    "content": "#include \"blake3_impl.h\"\n#include <string.h>\n\nINLINE uint32_t rotr32(uint32_t w, uint32_t c) {\n  return (w >> c) | (w << (32 - c));\n}\n\nINLINE void g(uint32_t *state, size_t a, size_t b, size_t c, size_t d,\n              uint32_t x, uint32_t y) {\n  state[a] = state[a] + state[b] + x;\n  state[d] = rotr32(state[d] ^ state[a], 16);\n  state[c] = state[c] + state[d];\n  state[b] = rotr32(state[b] ^ state[c], 12);\n  state[a] = state[a] + state[b] + y;\n  state[d] = rotr32(state[d] ^ state[a], 8);\n  state[c] = state[c] + state[d];\n  state[b] = rotr32(state[b] ^ state[c], 7);\n}\n\nINLINE void round_fn(uint32_t state[16], const uint32_t *msg, size_t round) {\n  // Select the message schedule based on the round.\n  const uint8_t *schedule = MSG_SCHEDULE[round];\n\n  // Mix the columns.\n  g(state, 0, 4, 8, 12, msg[schedule[0]], msg[schedule[1]]);\n  g(state, 1, 5, 9, 13, msg[schedule[2]], msg[schedule[3]]);\n  g(state, 2, 6, 10, 14, msg[schedule[4]], msg[schedule[5]]);\n  g(state, 3, 7, 11, 15, msg[schedule[6]], msg[schedule[7]]);\n\n  // Mix the rows.\n  g(state, 0, 5, 10, 15, msg[schedule[8]], msg[schedule[9]]);\n  g(state, 1, 6, 11, 12, msg[schedule[10]], msg[schedule[11]]);\n  g(state, 2, 7, 8, 13, msg[schedule[12]], msg[schedule[13]]);\n  g(state, 3, 4, 9, 14, msg[schedule[14]], msg[schedule[15]]);\n}\n\nINLINE void compress_pre(uint32_t state[16], const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags) {\n  uint32_t block_words[16];\n  block_words[0] = load32(block + 4 * 0);\n  block_words[1] = load32(block + 4 * 1);\n  block_words[2] = load32(block + 4 * 2);\n  block_words[3] = load32(block + 4 * 3);\n  block_words[4] = load32(block + 4 * 4);\n  block_words[5] = load32(block + 4 * 5);\n  block_words[6] = load32(block + 4 * 6);\n  block_words[7] = load32(block + 4 * 7);\n  block_words[8] = load32(block + 4 * 8);\n  block_words[9] = load32(block + 4 * 9);\n  block_words[10] = load32(block + 4 * 10);\n  block_words[11] = load32(block + 4 * 11);\n  block_words[12] = load32(block + 4 * 12);\n  block_words[13] = load32(block + 4 * 13);\n  block_words[14] = load32(block + 4 * 14);\n  block_words[15] = load32(block + 4 * 15);\n\n  state[0] = cv[0];\n  state[1] = cv[1];\n  state[2] = cv[2];\n  state[3] = cv[3];\n  state[4] = cv[4];\n  state[5] = cv[5];\n  state[6] = cv[6];\n  state[7] = cv[7];\n  state[8] = IV[0];\n  state[9] = IV[1];\n  state[10] = IV[2];\n  state[11] = IV[3];\n  state[12] = counter_low(counter);\n  state[13] = counter_high(counter);\n  state[14] = (uint32_t)block_len;\n  state[15] = (uint32_t)flags;\n\n  round_fn(state, &block_words[0], 0);\n  round_fn(state, &block_words[0], 1);\n  round_fn(state, &block_words[0], 2);\n  round_fn(state, &block_words[0], 3);\n  round_fn(state, &block_words[0], 4);\n  round_fn(state, &block_words[0], 5);\n  round_fn(state, &block_words[0], 6);\n}\n\nvoid blake3_compress_in_place_portable(uint32_t cv[8],\n                                       const uint8_t block[BLAKE3_BLOCK_LEN],\n                                       uint8_t block_len, uint64_t counter,\n                                       uint8_t flags) {\n  uint32_t state[16];\n  compress_pre(state, cv, block, block_len, counter, flags);\n  cv[0] = state[0] ^ state[8];\n  cv[1] = state[1] ^ state[9];\n  cv[2] = state[2] ^ state[10];\n  cv[3] = state[3] ^ state[11];\n  cv[4] = state[4] ^ state[12];\n  cv[5] = state[5] ^ state[13];\n  cv[6] = state[6] ^ state[14];\n  cv[7] = state[7] ^ state[15];\n}\n\nvoid blake3_compress_xof_portable(const uint32_t cv[8],\n                                  const uint8_t block[BLAKE3_BLOCK_LEN],\n                                  uint8_t block_len, uint64_t counter,\n                                  uint8_t flags, uint8_t out[64]) {\n  uint32_t state[16];\n  compress_pre(state, cv, block, block_len, counter, flags);\n\n  store32(&out[0 * 4], state[0] ^ state[8]);\n  store32(&out[1 * 4], state[1] ^ state[9]);\n  store32(&out[2 * 4], state[2] ^ state[10]);\n  store32(&out[3 * 4], state[3] ^ state[11]);\n  store32(&out[4 * 4], state[4] ^ state[12]);\n  store32(&out[5 * 4], state[5] ^ state[13]);\n  store32(&out[6 * 4], state[6] ^ state[14]);\n  store32(&out[7 * 4], state[7] ^ state[15]);\n  store32(&out[8 * 4], state[8] ^ cv[0]);\n  store32(&out[9 * 4], state[9] ^ cv[1]);\n  store32(&out[10 * 4], state[10] ^ cv[2]);\n  store32(&out[11 * 4], state[11] ^ cv[3]);\n  store32(&out[12 * 4], state[12] ^ cv[4]);\n  store32(&out[13 * 4], state[13] ^ cv[5]);\n  store32(&out[14 * 4], state[14] ^ cv[6]);\n  store32(&out[15 * 4], state[15] ^ cv[7]);\n}\n\nINLINE void hash_one_portable(const uint8_t *input, size_t blocks,\n                              const uint32_t key[8], uint64_t counter,\n                              uint8_t flags, uint8_t flags_start,\n                              uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    blake3_compress_in_place_portable(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                      block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  store_cv_words(out, cv);\n}\n\nvoid blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_inputs,\n                               size_t blocks, const uint32_t key[8],\n                               uint64_t counter, bool increment_counter,\n                               uint8_t flags, uint8_t flags_start,\n                               uint8_t flags_end, uint8_t *out) {\n  while (num_inputs > 0) {\n    hash_one_portable(inputs[0], blocks, key, counter, flags, flags_start,\n                      flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_sse2.c",
    "content": "#include \"blake3_impl.h\"\n\n#include <immintrin.h>\n\n#define DEGREE 4\n\n#define _mm_shuffle_ps2(a, b, c)                                               \\\n  (_mm_castps_si128(                                                           \\\n      _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c))))\n\nINLINE __m128i loadu(const uint8_t src[16]) {\n  return _mm_loadu_si128((const __m128i *)src);\n}\n\nINLINE void storeu(__m128i src, uint8_t dest[16]) {\n  _mm_storeu_si128((__m128i *)dest, src);\n}\n\nINLINE __m128i addv(__m128i a, __m128i b) { return _mm_add_epi32(a, b); }\n\n// Note that clang-format doesn't like the name \"xor\" for some reason.\nINLINE __m128i xorv(__m128i a, __m128i b) { return _mm_xor_si128(a, b); }\n\nINLINE __m128i set1(uint32_t x) { return _mm_set1_epi32((int32_t)x); }\n\nINLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {\n  return _mm_setr_epi32((int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d);\n}\n\nINLINE __m128i rot16(__m128i x) {\n  return _mm_shufflehi_epi16(_mm_shufflelo_epi16(x, 0xB1), 0xB1);\n}\n\nINLINE __m128i rot12(__m128i x) {\n  return xorv(_mm_srli_epi32(x, 12), _mm_slli_epi32(x, 32 - 12));\n}\n\nINLINE __m128i rot8(__m128i x) {\n  return xorv(_mm_srli_epi32(x, 8), _mm_slli_epi32(x, 32 - 8));\n}\n\nINLINE __m128i rot7(__m128i x) {\n  return xorv(_mm_srli_epi32(x, 7), _mm_slli_epi32(x, 32 - 7));\n}\n\nINLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,\n               __m128i m) {\n  *row0 = addv(addv(*row0, m), *row1);\n  *row3 = xorv(*row3, *row0);\n  *row3 = rot16(*row3);\n  *row2 = addv(*row2, *row3);\n  *row1 = xorv(*row1, *row2);\n  *row1 = rot12(*row1);\n}\n\nINLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,\n               __m128i m) {\n  *row0 = addv(addv(*row0, m), *row1);\n  *row3 = xorv(*row3, *row0);\n  *row3 = rot8(*row3);\n  *row2 = addv(*row2, *row3);\n  *row1 = xorv(*row1, *row2);\n  *row1 = rot7(*row1);\n}\n\n// Note the optimization here of leaving row1 as the unrotated row, rather than\n// row0. All the message loads below are adjusted to compensate for this. See\n// discussion at https://github.com/sneves/blake2-avx2/pull/4\nINLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {\n  *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(2, 1, 0, 3));\n  *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2));\n  *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(0, 3, 2, 1));\n}\n\nINLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {\n  *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(0, 3, 2, 1));\n  *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2));\n  *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(2, 1, 0, 3));\n}\n\nINLINE __m128i blend_epi16(__m128i a, __m128i b, const int16_t imm8) {\n  const __m128i bits = _mm_set_epi16(0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01);\n  __m128i mask = _mm_set1_epi16(imm8);\n  mask = _mm_and_si128(mask, bits);\n  mask = _mm_cmpeq_epi16(mask, bits);\n  return _mm_or_si128(_mm_and_si128(mask, b), _mm_andnot_si128(mask, a));\n}\n\nINLINE void compress_pre(__m128i rows[4], const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags) {\n  rows[0] = loadu((uint8_t *)&cv[0]);\n  rows[1] = loadu((uint8_t *)&cv[4]);\n  rows[2] = set4(IV[0], IV[1], IV[2], IV[3]);\n  rows[3] = set4(counter_low(counter), counter_high(counter),\n                 (uint32_t)block_len, (uint32_t)flags);\n\n  __m128i m0 = loadu(&block[sizeof(__m128i) * 0]);\n  __m128i m1 = loadu(&block[sizeof(__m128i) * 1]);\n  __m128i m2 = loadu(&block[sizeof(__m128i) * 2]);\n  __m128i m3 = loadu(&block[sizeof(__m128i) * 3]);\n\n  __m128i t0, t1, t2, t3, tt;\n\n  // Round 1. The first round permutes the message words from the original\n  // input order, into the groups that get mixed in parallel.\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(2, 0, 2, 0)); //  6  4  2  0\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 3, 1)); //  7  5  3  1\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(2, 0, 2, 0)); // 14 12 10  8\n  t2 = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2, 1, 0, 3));   // 12 10  8 14\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 1, 3, 1)); // 15 13 11  9\n  t3 = _mm_shuffle_epi32(t3, _MM_SHUFFLE(2, 1, 0, 3));   // 13 11  9 15\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 2. This round and all following rounds apply a fixed permutation\n  // to the message words from the round before.\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 3\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 4\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 5\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 6\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 7\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n}\n\nvoid blake3_compress_in_place_sse2(uint32_t cv[8],\n                                   const uint8_t block[BLAKE3_BLOCK_LEN],\n                                   uint8_t block_len, uint64_t counter,\n                                   uint8_t flags) {\n  __m128i rows[4];\n  compress_pre(rows, cv, block, block_len, counter, flags);\n  storeu(xorv(rows[0], rows[2]), (uint8_t *)&cv[0]);\n  storeu(xorv(rows[1], rows[3]), (uint8_t *)&cv[4]);\n}\n\nvoid blake3_compress_xof_sse2(const uint32_t cv[8],\n                              const uint8_t block[BLAKE3_BLOCK_LEN],\n                              uint8_t block_len, uint64_t counter,\n                              uint8_t flags, uint8_t out[64]) {\n  __m128i rows[4];\n  compress_pre(rows, cv, block, block_len, counter, flags);\n  storeu(xorv(rows[0], rows[2]), &out[0]);\n  storeu(xorv(rows[1], rows[3]), &out[16]);\n  storeu(xorv(rows[2], loadu((uint8_t *)&cv[0])), &out[32]);\n  storeu(xorv(rows[3], loadu((uint8_t *)&cv[4])), &out[48]);\n}\n\nINLINE void round_fn(__m128i v[16], __m128i m[16], size_t r) {\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = addv(v[0], v[4]);\n  v[1] = addv(v[1], v[5]);\n  v[2] = addv(v[2], v[6]);\n  v[3] = addv(v[3], v[7]);\n  v[12] = xorv(v[12], v[0]);\n  v[13] = xorv(v[13], v[1]);\n  v[14] = xorv(v[14], v[2]);\n  v[15] = xorv(v[15], v[3]);\n  v[12] = rot16(v[12]);\n  v[13] = rot16(v[13]);\n  v[14] = rot16(v[14]);\n  v[15] = rot16(v[15]);\n  v[8] = addv(v[8], v[12]);\n  v[9] = addv(v[9], v[13]);\n  v[10] = addv(v[10], v[14]);\n  v[11] = addv(v[11], v[15]);\n  v[4] = xorv(v[4], v[8]);\n  v[5] = xorv(v[5], v[9]);\n  v[6] = xorv(v[6], v[10]);\n  v[7] = xorv(v[7], v[11]);\n  v[4] = rot12(v[4]);\n  v[5] = rot12(v[5]);\n  v[6] = rot12(v[6]);\n  v[7] = rot12(v[7]);\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = addv(v[0], v[4]);\n  v[1] = addv(v[1], v[5]);\n  v[2] = addv(v[2], v[6]);\n  v[3] = addv(v[3], v[7]);\n  v[12] = xorv(v[12], v[0]);\n  v[13] = xorv(v[13], v[1]);\n  v[14] = xorv(v[14], v[2]);\n  v[15] = xorv(v[15], v[3]);\n  v[12] = rot8(v[12]);\n  v[13] = rot8(v[13]);\n  v[14] = rot8(v[14]);\n  v[15] = rot8(v[15]);\n  v[8] = addv(v[8], v[12]);\n  v[9] = addv(v[9], v[13]);\n  v[10] = addv(v[10], v[14]);\n  v[11] = addv(v[11], v[15]);\n  v[4] = xorv(v[4], v[8]);\n  v[5] = xorv(v[5], v[9]);\n  v[6] = xorv(v[6], v[10]);\n  v[7] = xorv(v[7], v[11]);\n  v[4] = rot7(v[4]);\n  v[5] = rot7(v[5]);\n  v[6] = rot7(v[6]);\n  v[7] = rot7(v[7]);\n\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = addv(v[0], v[5]);\n  v[1] = addv(v[1], v[6]);\n  v[2] = addv(v[2], v[7]);\n  v[3] = addv(v[3], v[4]);\n  v[15] = xorv(v[15], v[0]);\n  v[12] = xorv(v[12], v[1]);\n  v[13] = xorv(v[13], v[2]);\n  v[14] = xorv(v[14], v[3]);\n  v[15] = rot16(v[15]);\n  v[12] = rot16(v[12]);\n  v[13] = rot16(v[13]);\n  v[14] = rot16(v[14]);\n  v[10] = addv(v[10], v[15]);\n  v[11] = addv(v[11], v[12]);\n  v[8] = addv(v[8], v[13]);\n  v[9] = addv(v[9], v[14]);\n  v[5] = xorv(v[5], v[10]);\n  v[6] = xorv(v[6], v[11]);\n  v[7] = xorv(v[7], v[8]);\n  v[4] = xorv(v[4], v[9]);\n  v[5] = rot12(v[5]);\n  v[6] = rot12(v[6]);\n  v[7] = rot12(v[7]);\n  v[4] = rot12(v[4]);\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = addv(v[0], v[5]);\n  v[1] = addv(v[1], v[6]);\n  v[2] = addv(v[2], v[7]);\n  v[3] = addv(v[3], v[4]);\n  v[15] = xorv(v[15], v[0]);\n  v[12] = xorv(v[12], v[1]);\n  v[13] = xorv(v[13], v[2]);\n  v[14] = xorv(v[14], v[3]);\n  v[15] = rot8(v[15]);\n  v[12] = rot8(v[12]);\n  v[13] = rot8(v[13]);\n  v[14] = rot8(v[14]);\n  v[10] = addv(v[10], v[15]);\n  v[11] = addv(v[11], v[12]);\n  v[8] = addv(v[8], v[13]);\n  v[9] = addv(v[9], v[14]);\n  v[5] = xorv(v[5], v[10]);\n  v[6] = xorv(v[6], v[11]);\n  v[7] = xorv(v[7], v[8]);\n  v[4] = xorv(v[4], v[9]);\n  v[5] = rot7(v[5]);\n  v[6] = rot7(v[6]);\n  v[7] = rot7(v[7]);\n  v[4] = rot7(v[4]);\n}\n\nINLINE void transpose_vecs(__m128i vecs[DEGREE]) {\n  // Interleave 32-bit lanes. The low unpack is lanes 00/11 and the high is\n  // 22/33. Note that this doesn't split the vector into two lanes, as the\n  // AVX2 counterparts do.\n  __m128i ab_01 = _mm_unpacklo_epi32(vecs[0], vecs[1]);\n  __m128i ab_23 = _mm_unpackhi_epi32(vecs[0], vecs[1]);\n  __m128i cd_01 = _mm_unpacklo_epi32(vecs[2], vecs[3]);\n  __m128i cd_23 = _mm_unpackhi_epi32(vecs[2], vecs[3]);\n\n  // Interleave 64-bit lanes.\n  __m128i abcd_0 = _mm_unpacklo_epi64(ab_01, cd_01);\n  __m128i abcd_1 = _mm_unpackhi_epi64(ab_01, cd_01);\n  __m128i abcd_2 = _mm_unpacklo_epi64(ab_23, cd_23);\n  __m128i abcd_3 = _mm_unpackhi_epi64(ab_23, cd_23);\n\n  vecs[0] = abcd_0;\n  vecs[1] = abcd_1;\n  vecs[2] = abcd_2;\n  vecs[3] = abcd_3;\n}\n\nINLINE void transpose_msg_vecs(const uint8_t *const *inputs,\n                               size_t block_offset, __m128i out[16]) {\n  out[0] = loadu(&inputs[0][block_offset + 0 * sizeof(__m128i)]);\n  out[1] = loadu(&inputs[1][block_offset + 0 * sizeof(__m128i)]);\n  out[2] = loadu(&inputs[2][block_offset + 0 * sizeof(__m128i)]);\n  out[3] = loadu(&inputs[3][block_offset + 0 * sizeof(__m128i)]);\n  out[4] = loadu(&inputs[0][block_offset + 1 * sizeof(__m128i)]);\n  out[5] = loadu(&inputs[1][block_offset + 1 * sizeof(__m128i)]);\n  out[6] = loadu(&inputs[2][block_offset + 1 * sizeof(__m128i)]);\n  out[7] = loadu(&inputs[3][block_offset + 1 * sizeof(__m128i)]);\n  out[8] = loadu(&inputs[0][block_offset + 2 * sizeof(__m128i)]);\n  out[9] = loadu(&inputs[1][block_offset + 2 * sizeof(__m128i)]);\n  out[10] = loadu(&inputs[2][block_offset + 2 * sizeof(__m128i)]);\n  out[11] = loadu(&inputs[3][block_offset + 2 * sizeof(__m128i)]);\n  out[12] = loadu(&inputs[0][block_offset + 3 * sizeof(__m128i)]);\n  out[13] = loadu(&inputs[1][block_offset + 3 * sizeof(__m128i)]);\n  out[14] = loadu(&inputs[2][block_offset + 3 * sizeof(__m128i)]);\n  out[15] = loadu(&inputs[3][block_offset + 3 * sizeof(__m128i)]);\n  for (size_t i = 0; i < 4; ++i) {\n    _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0);\n  }\n  transpose_vecs(&out[0]);\n  transpose_vecs(&out[4]);\n  transpose_vecs(&out[8]);\n  transpose_vecs(&out[12]);\n}\n\nINLINE void load_counters(uint64_t counter, bool increment_counter,\n                          __m128i *out_lo, __m128i *out_hi) {\n  const __m128i mask = _mm_set1_epi32(-(int32_t)increment_counter);\n  const __m128i add0 = _mm_set_epi32(3, 2, 1, 0);\n  const __m128i add1 = _mm_and_si128(mask, add0);\n  __m128i l = _mm_add_epi32(_mm_set1_epi32((int32_t)counter), add1);\n  __m128i carry = _mm_cmpgt_epi32(_mm_xor_si128(add1, _mm_set1_epi32(0x80000000)), \n                                  _mm_xor_si128(   l, _mm_set1_epi32(0x80000000)));\n  __m128i h = _mm_sub_epi32(_mm_set1_epi32((int32_t)(counter >> 32)), carry);\n  *out_lo = l;\n  *out_hi = h;\n}\n\nstatic\nvoid blake3_hash4_sse2(const uint8_t *const *inputs, size_t blocks,\n                       const uint32_t key[8], uint64_t counter,\n                       bool increment_counter, uint8_t flags,\n                       uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  __m128i h_vecs[8] = {\n      set1(key[0]), set1(key[1]), set1(key[2]), set1(key[3]),\n      set1(key[4]), set1(key[5]), set1(key[6]), set1(key[7]),\n  };\n  __m128i counter_low_vec, counter_high_vec;\n  load_counters(counter, increment_counter, &counter_low_vec,\n                &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    __m128i block_len_vec = set1(BLAKE3_BLOCK_LEN);\n    __m128i block_flags_vec = set1(block_flags);\n    __m128i msg_vecs[16];\n    transpose_msg_vecs(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    __m128i v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],     h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],     h_vecs[7],\n        set1(IV[0]),     set1(IV[1]),      set1(IV[2]),   set1(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec,\n    };\n    round_fn(v, msg_vecs, 0);\n    round_fn(v, msg_vecs, 1);\n    round_fn(v, msg_vecs, 2);\n    round_fn(v, msg_vecs, 3);\n    round_fn(v, msg_vecs, 4);\n    round_fn(v, msg_vecs, 5);\n    round_fn(v, msg_vecs, 6);\n    h_vecs[0] = xorv(v[0], v[8]);\n    h_vecs[1] = xorv(v[1], v[9]);\n    h_vecs[2] = xorv(v[2], v[10]);\n    h_vecs[3] = xorv(v[3], v[11]);\n    h_vecs[4] = xorv(v[4], v[12]);\n    h_vecs[5] = xorv(v[5], v[13]);\n    h_vecs[6] = xorv(v[6], v[14]);\n    h_vecs[7] = xorv(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs(&h_vecs[0]);\n  transpose_vecs(&h_vecs[4]);\n  // The first four vecs now contain the first half of each output, and the\n  // second four vecs contain the second half of each output.\n  storeu(h_vecs[0], &out[0 * sizeof(__m128i)]);\n  storeu(h_vecs[4], &out[1 * sizeof(__m128i)]);\n  storeu(h_vecs[1], &out[2 * sizeof(__m128i)]);\n  storeu(h_vecs[5], &out[3 * sizeof(__m128i)]);\n  storeu(h_vecs[2], &out[4 * sizeof(__m128i)]);\n  storeu(h_vecs[6], &out[5 * sizeof(__m128i)]);\n  storeu(h_vecs[3], &out[6 * sizeof(__m128i)]);\n  storeu(h_vecs[7], &out[7 * sizeof(__m128i)]);\n}\n\nINLINE void hash_one_sse2(const uint8_t *input, size_t blocks,\n                          const uint32_t key[8], uint64_t counter,\n                          uint8_t flags, uint8_t flags_start,\n                          uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    blake3_compress_in_place_sse2(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                  block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  memcpy(out, cv, BLAKE3_OUT_LEN);\n}\n\nvoid blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs,\n                           size_t blocks, const uint32_t key[8],\n                           uint64_t counter, bool increment_counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t *out) {\n  while (num_inputs >= DEGREE) {\n    blake3_hash4_sse2(inputs, blocks, key, counter, increment_counter, flags,\n                      flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += DEGREE;\n    }\n    inputs += DEGREE;\n    num_inputs -= DEGREE;\n    out = &out[DEGREE * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs > 0) {\n    hash_one_sse2(inputs[0], blocks, key, counter, flags, flags_start,\n                  flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/blake3/c/blake3_sse41.c",
    "content": "#include \"blake3_impl.h\"\n\n#include <immintrin.h>\n\n#define DEGREE 4\n\n#define _mm_shuffle_ps2(a, b, c)                                               \\\n  (_mm_castps_si128(                                                           \\\n      _mm_shuffle_ps(_mm_castsi128_ps(a), _mm_castsi128_ps(b), (c))))\n\nINLINE __m128i loadu(const uint8_t src[16]) {\n  return _mm_loadu_si128((const __m128i *)src);\n}\n\nINLINE void storeu(__m128i src, uint8_t dest[16]) {\n  _mm_storeu_si128((__m128i *)dest, src);\n}\n\nINLINE __m128i addv(__m128i a, __m128i b) { return _mm_add_epi32(a, b); }\n\n// Note that clang-format doesn't like the name \"xor\" for some reason.\nINLINE __m128i xorv(__m128i a, __m128i b) { return _mm_xor_si128(a, b); }\n\nINLINE __m128i set1(uint32_t x) { return _mm_set1_epi32((int32_t)x); }\n\nINLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {\n  return _mm_setr_epi32((int32_t)a, (int32_t)b, (int32_t)c, (int32_t)d);\n}\n\nINLINE __m128i rot16(__m128i x) {\n  return _mm_shuffle_epi8(\n      x, _mm_set_epi8(13, 12, 15, 14, 9, 8, 11, 10, 5, 4, 7, 6, 1, 0, 3, 2));\n}\n\nINLINE __m128i rot12(__m128i x) {\n  return xorv(_mm_srli_epi32(x, 12), _mm_slli_epi32(x, 32 - 12));\n}\n\nINLINE __m128i rot8(__m128i x) {\n  return _mm_shuffle_epi8(\n      x, _mm_set_epi8(12, 15, 14, 13, 8, 11, 10, 9, 4, 7, 6, 5, 0, 3, 2, 1));\n}\n\nINLINE __m128i rot7(__m128i x) {\n  return xorv(_mm_srli_epi32(x, 7), _mm_slli_epi32(x, 32 - 7));\n}\n\nINLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,\n               __m128i m) {\n  *row0 = addv(addv(*row0, m), *row1);\n  *row3 = xorv(*row3, *row0);\n  *row3 = rot16(*row3);\n  *row2 = addv(*row2, *row3);\n  *row1 = xorv(*row1, *row2);\n  *row1 = rot12(*row1);\n}\n\nINLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,\n               __m128i m) {\n  *row0 = addv(addv(*row0, m), *row1);\n  *row3 = xorv(*row3, *row0);\n  *row3 = rot8(*row3);\n  *row2 = addv(*row2, *row3);\n  *row1 = xorv(*row1, *row2);\n  *row1 = rot7(*row1);\n}\n\n// Note the optimization here of leaving row1 as the unrotated row, rather than\n// row0. All the message loads below are adjusted to compensate for this. See\n// discussion at https://github.com/sneves/blake2-avx2/pull/4\nINLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {\n  *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(2, 1, 0, 3));\n  *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2));\n  *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(0, 3, 2, 1));\n}\n\nINLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {\n  *row0 = _mm_shuffle_epi32(*row0, _MM_SHUFFLE(0, 3, 2, 1));\n  *row3 = _mm_shuffle_epi32(*row3, _MM_SHUFFLE(1, 0, 3, 2));\n  *row2 = _mm_shuffle_epi32(*row2, _MM_SHUFFLE(2, 1, 0, 3));\n}\n\nINLINE void compress_pre(__m128i rows[4], const uint32_t cv[8],\n                         const uint8_t block[BLAKE3_BLOCK_LEN],\n                         uint8_t block_len, uint64_t counter, uint8_t flags) {\n  rows[0] = loadu((uint8_t *)&cv[0]);\n  rows[1] = loadu((uint8_t *)&cv[4]);\n  rows[2] = set4(IV[0], IV[1], IV[2], IV[3]);\n  rows[3] = set4(counter_low(counter), counter_high(counter),\n                 (uint32_t)block_len, (uint32_t)flags);\n\n  __m128i m0 = loadu(&block[sizeof(__m128i) * 0]);\n  __m128i m1 = loadu(&block[sizeof(__m128i) * 1]);\n  __m128i m2 = loadu(&block[sizeof(__m128i) * 2]);\n  __m128i m3 = loadu(&block[sizeof(__m128i) * 3]);\n\n  __m128i t0, t1, t2, t3, tt;\n\n  // Round 1. The first round permutes the message words from the original\n  // input order, into the groups that get mixed in parallel.\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(2, 0, 2, 0)); //  6  4  2  0\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 3, 1)); //  7  5  3  1\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(2, 0, 2, 0)); // 14 12 10  8\n  t2 = _mm_shuffle_epi32(t2, _MM_SHUFFLE(2, 1, 0, 3));   // 12 10  8 14\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 1, 3, 1)); // 15 13 11  9\n  t3 = _mm_shuffle_epi32(t3, _MM_SHUFFLE(2, 1, 0, 3));   // 13 11  9 15\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 2. This round and all following rounds apply a fixed permutation\n  // to the message words from the round before.\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 3\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 4\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 5\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 6\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n  m0 = t0;\n  m1 = t1;\n  m2 = t2;\n  m3 = t3;\n\n  // Round 7\n  t0 = _mm_shuffle_ps2(m0, m1, _MM_SHUFFLE(3, 1, 1, 2));\n  t0 = _mm_shuffle_epi32(t0, _MM_SHUFFLE(0, 3, 2, 1));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t0);\n  t1 = _mm_shuffle_ps2(m2, m3, _MM_SHUFFLE(3, 3, 2, 2));\n  tt = _mm_shuffle_epi32(m0, _MM_SHUFFLE(0, 0, 3, 3));\n  t1 = _mm_blend_epi16(tt, t1, 0xCC);\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t1);\n  diagonalize(&rows[0], &rows[2], &rows[3]);\n  t2 = _mm_unpacklo_epi64(m3, m1);\n  tt = _mm_blend_epi16(t2, m2, 0xC0);\n  t2 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(1, 3, 2, 0));\n  g1(&rows[0], &rows[1], &rows[2], &rows[3], t2);\n  t3 = _mm_unpackhi_epi32(m1, m3);\n  tt = _mm_unpacklo_epi32(m2, t3);\n  t3 = _mm_shuffle_epi32(tt, _MM_SHUFFLE(0, 1, 3, 2));\n  g2(&rows[0], &rows[1], &rows[2], &rows[3], t3);\n  undiagonalize(&rows[0], &rows[2], &rows[3]);\n}\n\nvoid blake3_compress_in_place_sse41(uint32_t cv[8],\n                                    const uint8_t block[BLAKE3_BLOCK_LEN],\n                                    uint8_t block_len, uint64_t counter,\n                                    uint8_t flags) {\n  __m128i rows[4];\n  compress_pre(rows, cv, block, block_len, counter, flags);\n  storeu(xorv(rows[0], rows[2]), (uint8_t *)&cv[0]);\n  storeu(xorv(rows[1], rows[3]), (uint8_t *)&cv[4]);\n}\n\nvoid blake3_compress_xof_sse41(const uint32_t cv[8],\n                               const uint8_t block[BLAKE3_BLOCK_LEN],\n                               uint8_t block_len, uint64_t counter,\n                               uint8_t flags, uint8_t out[64]) {\n  __m128i rows[4];\n  compress_pre(rows, cv, block, block_len, counter, flags);\n  storeu(xorv(rows[0], rows[2]), &out[0]);\n  storeu(xorv(rows[1], rows[3]), &out[16]);\n  storeu(xorv(rows[2], loadu((uint8_t *)&cv[0])), &out[32]);\n  storeu(xorv(rows[3], loadu((uint8_t *)&cv[4])), &out[48]);\n}\n\nINLINE void round_fn(__m128i v[16], __m128i m[16], size_t r) {\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][0]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][2]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][4]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][6]]);\n  v[0] = addv(v[0], v[4]);\n  v[1] = addv(v[1], v[5]);\n  v[2] = addv(v[2], v[6]);\n  v[3] = addv(v[3], v[7]);\n  v[12] = xorv(v[12], v[0]);\n  v[13] = xorv(v[13], v[1]);\n  v[14] = xorv(v[14], v[2]);\n  v[15] = xorv(v[15], v[3]);\n  v[12] = rot16(v[12]);\n  v[13] = rot16(v[13]);\n  v[14] = rot16(v[14]);\n  v[15] = rot16(v[15]);\n  v[8] = addv(v[8], v[12]);\n  v[9] = addv(v[9], v[13]);\n  v[10] = addv(v[10], v[14]);\n  v[11] = addv(v[11], v[15]);\n  v[4] = xorv(v[4], v[8]);\n  v[5] = xorv(v[5], v[9]);\n  v[6] = xorv(v[6], v[10]);\n  v[7] = xorv(v[7], v[11]);\n  v[4] = rot12(v[4]);\n  v[5] = rot12(v[5]);\n  v[6] = rot12(v[6]);\n  v[7] = rot12(v[7]);\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][1]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][3]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][5]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][7]]);\n  v[0] = addv(v[0], v[4]);\n  v[1] = addv(v[1], v[5]);\n  v[2] = addv(v[2], v[6]);\n  v[3] = addv(v[3], v[7]);\n  v[12] = xorv(v[12], v[0]);\n  v[13] = xorv(v[13], v[1]);\n  v[14] = xorv(v[14], v[2]);\n  v[15] = xorv(v[15], v[3]);\n  v[12] = rot8(v[12]);\n  v[13] = rot8(v[13]);\n  v[14] = rot8(v[14]);\n  v[15] = rot8(v[15]);\n  v[8] = addv(v[8], v[12]);\n  v[9] = addv(v[9], v[13]);\n  v[10] = addv(v[10], v[14]);\n  v[11] = addv(v[11], v[15]);\n  v[4] = xorv(v[4], v[8]);\n  v[5] = xorv(v[5], v[9]);\n  v[6] = xorv(v[6], v[10]);\n  v[7] = xorv(v[7], v[11]);\n  v[4] = rot7(v[4]);\n  v[5] = rot7(v[5]);\n  v[6] = rot7(v[6]);\n  v[7] = rot7(v[7]);\n\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][8]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][10]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][12]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][14]]);\n  v[0] = addv(v[0], v[5]);\n  v[1] = addv(v[1], v[6]);\n  v[2] = addv(v[2], v[7]);\n  v[3] = addv(v[3], v[4]);\n  v[15] = xorv(v[15], v[0]);\n  v[12] = xorv(v[12], v[1]);\n  v[13] = xorv(v[13], v[2]);\n  v[14] = xorv(v[14], v[3]);\n  v[15] = rot16(v[15]);\n  v[12] = rot16(v[12]);\n  v[13] = rot16(v[13]);\n  v[14] = rot16(v[14]);\n  v[10] = addv(v[10], v[15]);\n  v[11] = addv(v[11], v[12]);\n  v[8] = addv(v[8], v[13]);\n  v[9] = addv(v[9], v[14]);\n  v[5] = xorv(v[5], v[10]);\n  v[6] = xorv(v[6], v[11]);\n  v[7] = xorv(v[7], v[8]);\n  v[4] = xorv(v[4], v[9]);\n  v[5] = rot12(v[5]);\n  v[6] = rot12(v[6]);\n  v[7] = rot12(v[7]);\n  v[4] = rot12(v[4]);\n  v[0] = addv(v[0], m[(size_t)MSG_SCHEDULE[r][9]]);\n  v[1] = addv(v[1], m[(size_t)MSG_SCHEDULE[r][11]]);\n  v[2] = addv(v[2], m[(size_t)MSG_SCHEDULE[r][13]]);\n  v[3] = addv(v[3], m[(size_t)MSG_SCHEDULE[r][15]]);\n  v[0] = addv(v[0], v[5]);\n  v[1] = addv(v[1], v[6]);\n  v[2] = addv(v[2], v[7]);\n  v[3] = addv(v[3], v[4]);\n  v[15] = xorv(v[15], v[0]);\n  v[12] = xorv(v[12], v[1]);\n  v[13] = xorv(v[13], v[2]);\n  v[14] = xorv(v[14], v[3]);\n  v[15] = rot8(v[15]);\n  v[12] = rot8(v[12]);\n  v[13] = rot8(v[13]);\n  v[14] = rot8(v[14]);\n  v[10] = addv(v[10], v[15]);\n  v[11] = addv(v[11], v[12]);\n  v[8] = addv(v[8], v[13]);\n  v[9] = addv(v[9], v[14]);\n  v[5] = xorv(v[5], v[10]);\n  v[6] = xorv(v[6], v[11]);\n  v[7] = xorv(v[7], v[8]);\n  v[4] = xorv(v[4], v[9]);\n  v[5] = rot7(v[5]);\n  v[6] = rot7(v[6]);\n  v[7] = rot7(v[7]);\n  v[4] = rot7(v[4]);\n}\n\nINLINE void transpose_vecs(__m128i vecs[DEGREE]) {\n  // Interleave 32-bit lanes. The low unpack is lanes 00/11 and the high is\n  // 22/33. Note that this doesn't split the vector into two lanes, as the\n  // AVX2 counterparts do.\n  __m128i ab_01 = _mm_unpacklo_epi32(vecs[0], vecs[1]);\n  __m128i ab_23 = _mm_unpackhi_epi32(vecs[0], vecs[1]);\n  __m128i cd_01 = _mm_unpacklo_epi32(vecs[2], vecs[3]);\n  __m128i cd_23 = _mm_unpackhi_epi32(vecs[2], vecs[3]);\n\n  // Interleave 64-bit lanes.\n  __m128i abcd_0 = _mm_unpacklo_epi64(ab_01, cd_01);\n  __m128i abcd_1 = _mm_unpackhi_epi64(ab_01, cd_01);\n  __m128i abcd_2 = _mm_unpacklo_epi64(ab_23, cd_23);\n  __m128i abcd_3 = _mm_unpackhi_epi64(ab_23, cd_23);\n\n  vecs[0] = abcd_0;\n  vecs[1] = abcd_1;\n  vecs[2] = abcd_2;\n  vecs[3] = abcd_3;\n}\n\nINLINE void transpose_msg_vecs(const uint8_t *const *inputs,\n                               size_t block_offset, __m128i out[16]) {\n  out[0] = loadu(&inputs[0][block_offset + 0 * sizeof(__m128i)]);\n  out[1] = loadu(&inputs[1][block_offset + 0 * sizeof(__m128i)]);\n  out[2] = loadu(&inputs[2][block_offset + 0 * sizeof(__m128i)]);\n  out[3] = loadu(&inputs[3][block_offset + 0 * sizeof(__m128i)]);\n  out[4] = loadu(&inputs[0][block_offset + 1 * sizeof(__m128i)]);\n  out[5] = loadu(&inputs[1][block_offset + 1 * sizeof(__m128i)]);\n  out[6] = loadu(&inputs[2][block_offset + 1 * sizeof(__m128i)]);\n  out[7] = loadu(&inputs[3][block_offset + 1 * sizeof(__m128i)]);\n  out[8] = loadu(&inputs[0][block_offset + 2 * sizeof(__m128i)]);\n  out[9] = loadu(&inputs[1][block_offset + 2 * sizeof(__m128i)]);\n  out[10] = loadu(&inputs[2][block_offset + 2 * sizeof(__m128i)]);\n  out[11] = loadu(&inputs[3][block_offset + 2 * sizeof(__m128i)]);\n  out[12] = loadu(&inputs[0][block_offset + 3 * sizeof(__m128i)]);\n  out[13] = loadu(&inputs[1][block_offset + 3 * sizeof(__m128i)]);\n  out[14] = loadu(&inputs[2][block_offset + 3 * sizeof(__m128i)]);\n  out[15] = loadu(&inputs[3][block_offset + 3 * sizeof(__m128i)]);\n  for (size_t i = 0; i < 4; ++i) {\n    _mm_prefetch((const char *)&inputs[i][block_offset + 256], _MM_HINT_T0);\n  }\n  transpose_vecs(&out[0]);\n  transpose_vecs(&out[4]);\n  transpose_vecs(&out[8]);\n  transpose_vecs(&out[12]);\n}\n\nINLINE void load_counters(uint64_t counter, bool increment_counter,\n                          __m128i *out_lo, __m128i *out_hi) {\n  const __m128i mask = _mm_set1_epi32(-(int32_t)increment_counter);\n  const __m128i add0 = _mm_set_epi32(3, 2, 1, 0);\n  const __m128i add1 = _mm_and_si128(mask, add0);\n  __m128i l = _mm_add_epi32(_mm_set1_epi32((int32_t)counter), add1);\n  __m128i carry = _mm_cmpgt_epi32(_mm_xor_si128(add1, _mm_set1_epi32(0x80000000)), \n                                  _mm_xor_si128(   l, _mm_set1_epi32(0x80000000)));\n  __m128i h = _mm_sub_epi32(_mm_set1_epi32((int32_t)(counter >> 32)), carry);\n  *out_lo = l;\n  *out_hi = h;\n}\n\nstatic\nvoid blake3_hash4_sse41(const uint8_t *const *inputs, size_t blocks,\n                        const uint32_t key[8], uint64_t counter,\n                        bool increment_counter, uint8_t flags,\n                        uint8_t flags_start, uint8_t flags_end, uint8_t *out) {\n  __m128i h_vecs[8] = {\n      set1(key[0]), set1(key[1]), set1(key[2]), set1(key[3]),\n      set1(key[4]), set1(key[5]), set1(key[6]), set1(key[7]),\n  };\n  __m128i counter_low_vec, counter_high_vec;\n  load_counters(counter, increment_counter, &counter_low_vec,\n                &counter_high_vec);\n  uint8_t block_flags = flags | flags_start;\n\n  for (size_t block = 0; block < blocks; block++) {\n    if (block + 1 == blocks) {\n      block_flags |= flags_end;\n    }\n    __m128i block_len_vec = set1(BLAKE3_BLOCK_LEN);\n    __m128i block_flags_vec = set1(block_flags);\n    __m128i msg_vecs[16];\n    transpose_msg_vecs(inputs, block * BLAKE3_BLOCK_LEN, msg_vecs);\n\n    __m128i v[16] = {\n        h_vecs[0],       h_vecs[1],        h_vecs[2],     h_vecs[3],\n        h_vecs[4],       h_vecs[5],        h_vecs[6],     h_vecs[7],\n        set1(IV[0]),     set1(IV[1]),      set1(IV[2]),   set1(IV[3]),\n        counter_low_vec, counter_high_vec, block_len_vec, block_flags_vec,\n    };\n    round_fn(v, msg_vecs, 0);\n    round_fn(v, msg_vecs, 1);\n    round_fn(v, msg_vecs, 2);\n    round_fn(v, msg_vecs, 3);\n    round_fn(v, msg_vecs, 4);\n    round_fn(v, msg_vecs, 5);\n    round_fn(v, msg_vecs, 6);\n    h_vecs[0] = xorv(v[0], v[8]);\n    h_vecs[1] = xorv(v[1], v[9]);\n    h_vecs[2] = xorv(v[2], v[10]);\n    h_vecs[3] = xorv(v[3], v[11]);\n    h_vecs[4] = xorv(v[4], v[12]);\n    h_vecs[5] = xorv(v[5], v[13]);\n    h_vecs[6] = xorv(v[6], v[14]);\n    h_vecs[7] = xorv(v[7], v[15]);\n\n    block_flags = flags;\n  }\n\n  transpose_vecs(&h_vecs[0]);\n  transpose_vecs(&h_vecs[4]);\n  // The first four vecs now contain the first half of each output, and the\n  // second four vecs contain the second half of each output.\n  storeu(h_vecs[0], &out[0 * sizeof(__m128i)]);\n  storeu(h_vecs[4], &out[1 * sizeof(__m128i)]);\n  storeu(h_vecs[1], &out[2 * sizeof(__m128i)]);\n  storeu(h_vecs[5], &out[3 * sizeof(__m128i)]);\n  storeu(h_vecs[2], &out[4 * sizeof(__m128i)]);\n  storeu(h_vecs[6], &out[5 * sizeof(__m128i)]);\n  storeu(h_vecs[3], &out[6 * sizeof(__m128i)]);\n  storeu(h_vecs[7], &out[7 * sizeof(__m128i)]);\n}\n\nINLINE void hash_one_sse41(const uint8_t *input, size_t blocks,\n                           const uint32_t key[8], uint64_t counter,\n                           uint8_t flags, uint8_t flags_start,\n                           uint8_t flags_end, uint8_t out[BLAKE3_OUT_LEN]) {\n  uint32_t cv[8];\n  memcpy(cv, key, BLAKE3_KEY_LEN);\n  uint8_t block_flags = flags | flags_start;\n  while (blocks > 0) {\n    if (blocks == 1) {\n      block_flags |= flags_end;\n    }\n    blake3_compress_in_place_sse41(cv, input, BLAKE3_BLOCK_LEN, counter,\n                                   block_flags);\n    input = &input[BLAKE3_BLOCK_LEN];\n    blocks -= 1;\n    block_flags = flags;\n  }\n  memcpy(out, cv, BLAKE3_OUT_LEN);\n}\n\nvoid blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inputs,\n                            size_t blocks, const uint32_t key[8],\n                            uint64_t counter, bool increment_counter,\n                            uint8_t flags, uint8_t flags_start,\n                            uint8_t flags_end, uint8_t *out) {\n  while (num_inputs >= DEGREE) {\n    blake3_hash4_sse41(inputs, blocks, key, counter, increment_counter, flags,\n                       flags_start, flags_end, out);\n    if (increment_counter) {\n      counter += DEGREE;\n    }\n    inputs += DEGREE;\n    num_inputs -= DEGREE;\n    out = &out[DEGREE * BLAKE3_OUT_LEN];\n  }\n  while (num_inputs > 0) {\n    hash_one_sse41(inputs[0], blocks, key, counter, flags, flags_start,\n                   flags_end, out);\n    if (increment_counter) {\n      counter += 1;\n    }\n    inputs += 1;\n    num_inputs -= 1;\n    out = &out[BLAKE3_OUT_LEN];\n  }\n}\n"
  },
  {
    "path": "src/third_party/martins_hash/md5.h",
    "content": "#pragma once\r\n\r\n// https://www.rfc-editor.org/rfc/rfc1321.html\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n\r\n//\r\n// interface\r\n//\r\n\r\n#define MD5_DIGEST_SIZE     16\r\n#define MD5_BLOCK_SIZE      64\r\n\r\ntypedef struct {\r\n    uint8_t buffer[MD5_BLOCK_SIZE];\r\n    uint64_t count;\r\n    uint32_t state[4];\r\n} md5_ctx;\r\n\r\nstatic inline void md5_init(md5_ctx* ctx);\r\nstatic inline void md5_update(md5_ctx* ctx, const void* data, size_t size);\r\nstatic inline void md5_finish(md5_ctx* ctx, uint8_t digest[MD5_DIGEST_SIZE]);\r\n\r\n//\r\n// implementation\r\n//\r\n\r\n#include <string.h> // memcpy, memset\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic push\r\n#   pragma clang diagnostic ignored \"-Wcast-align\"\r\n#   pragma clang diagnostic ignored \"-Wunsafe-buffer-usage\"\r\n#   pragma clang diagnostic ignored \"-Wlanguage-extension-token\"\r\n#   pragma clang diagnostic ignored \"-Wdeclaration-after-statement\"\r\n#endif\r\n\r\n#if defined(__clang__)\r\n#   define MD5_ROL32(x,n) __builtin_rotateleft32(x, n)\r\n#elif defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define MD5_ROL32(x,n) _rotl(x, n)\r\n#else\r\n#   define MD5_ROL32(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )\r\n#endif\r\n\r\n#if defined(_MSC_VER)\r\n#   define MD5_GET32LE(ptr) *((const __unaligned uint32_t*)(ptr))\r\n#   define MD5_SET32LE(ptr,x) *((__unaligned uint32_t*)(ptr)) = (x)\r\n#   define MD5_SET64LE(ptr,x) *((__unaligned uint64_t*)(ptr)) = (x)\r\n#else\r\n#   define MD5_GET32LE(ptr) \\\r\n    (                       \\\r\n        ((ptr)[0] <<  0) |  \\\r\n        ((ptr)[1] <<  8) |  \\\r\n        ((ptr)[2] << 16) |  \\\r\n        ((ptr)[3] << 24)    \\\r\n    )\r\n#   define MD5_SET32LE(ptr, x) do           \\\r\n    {                                       \\\r\n        (ptr)[0] = (uint8_t)((x) >>  0);    \\\r\n        (ptr)[1] = (uint8_t)((x) >>  8);    \\\r\n        (ptr)[2] = (uint8_t)((x) >> 16);    \\\r\n        (ptr)[3] = (uint8_t)((x) >> 24);    \\\r\n    }                                       \\\r\n    while (0)\r\n#   define MD5_SET64LE(ptr, x) do           \\\r\n    {                                       \\\r\n        (ptr)[0] = (uint8_t)((x) >>  0);    \\\r\n        (ptr)[1] = (uint8_t)((x) >>  8);    \\\r\n        (ptr)[2] = (uint8_t)((x) >> 16);    \\\r\n        (ptr)[3] = (uint8_t)((x) >> 24);    \\\r\n        (ptr)[4] = (uint8_t)((x) >> 32);    \\\r\n        (ptr)[5] = (uint8_t)((x) >> 40);    \\\r\n        (ptr)[6] = (uint8_t)((x) >> 48);    \\\r\n        (ptr)[7] = (uint8_t)((x) >> 56);    \\\r\n    }                                       \\\r\n    while (0)\r\n#endif\r\n\r\n// MD5_COMPILER_BARRIER forces clang to do better codegen without spilling registers to stack too much\r\n#if defined(__clang__) || defined(__GNUC__)\r\n#   define MD5_COMPILER_BARRIER() __asm__ __volatile__(\"\" : : : \"memory\")\r\n#else\r\n#   define MD5_COMPILER_BARRIER()\r\n#endif\r\n\r\n\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n#if defined(__clang__) || defined(__GNUC__)\r\n#   include <cpuid.h>\r\n#   define MD5_TARGET(str)          __attribute__((target(str)))\r\n#   define MD5_CPUID_EX(x, y, info) __cpuid_count(x, y, info[0], info[1], info[2], info[3])\r\n#   define MD5_ANDN_U32(x,y)        (~(x) & (y))\r\n#else\r\n#   include <intrin.h>\r\n#   define MD5_TARGET(str)\r\n#   define MD5_CPUID_EX(x, y, info) __cpuidex(info, x, y)\r\n#   define MD5_ANDN_U32(x,y)        _andn_u32(x,y)\r\n#endif\r\n\r\n#if defined(__clang__)\r\n#   define MD5_RORX_U32(x,n) __builtin_rotateright32(x, n)\r\n#elif defined(_MSC_VER)\r\n#   define MD5_RORX_U32(x,n) _rorx_u32(x,n)\r\n#else\r\n#   define MD5_RORX_U32(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) )\r\n#endif\r\n\r\n#define MD5_CPUID_INIT  (1 << 0)\r\n#define MD5_CPUID_BMI2  (1 << 1)\r\n\r\nstatic inline int md5_cpuid(void)\r\n{\r\n    static int cpuid;\r\n\r\n    int result = cpuid;\r\n    if (result == 0)\r\n    {\r\n        int info[4];\r\n\r\n        MD5_CPUID_EX(7, 0, info);\r\n        int has_bmi = info[1] & (1 << 3);\r\n        int has_bmi2 = info[1] & (1 << 8);\r\n\r\n        result |= MD5_CPUID_INIT;\r\n        if (has_bmi && has_bmi2)\r\n        {\r\n            result |= MD5_CPUID_BMI2;\r\n        }\r\n\r\n        cpuid = result;\r\n    }\r\n\r\n#if defined(MD5_CPUID_MASK)\r\n    result &= MD5_CPUID_MASK;\r\n#endif\r\n\r\n    return result;\r\n}\r\n\r\nMD5_TARGET(\"bmi,bmi2,tune=znver1\")\r\nstatic void md5_process_bmi2(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n    // \"tune=znver1\" allows clang to use LEA with [reg+reg+imm] operand which helps performance on modern CPU's\r\n    // -1 in I will get folded together with constant k\r\n\r\n    #define F(x,y,z) (x & y) + MD5_ANDN_U32(x, z)\r\n    #define G(x,y,z) (x & z) + MD5_ANDN_U32(z, y)\r\n    #define H(x,y,z) (x ^ y ^ z)\r\n    #define I(x,y,z) 0 - 1 - (y ^ MD5_ANDN_U32(x, z))\r\n\r\n    #define X(i) MD5_GET32LE(block + i*sizeof(uint32_t))\r\n\r\n    #define ROUND(F, a, b, c, d, x, k, r) do {  \\\r\n        a += (k) + F(b, c, d) + (x);            \\\r\n        a = MD5_RORX_U32(a, 32-r) + b;          \\\r\n    } while (0)\r\n\r\n    #define QROUND_F(x0, x1, x2, x3, k0, k1, k2, k3) do {    \\\r\n        ROUND(F, a, b, c, d, X(x0), k0,  7);                 \\\r\n        ROUND(F, d, a, b, c, X(x1), k1, 12);                 \\\r\n        ROUND(F, c, d, a, b, X(x2), k2, 17);                 \\\r\n        ROUND(F, b, c, d, a, X(x3), k3, 22);                 \\\r\n    } while (0)\r\n\r\n    #define QROUND_G(x0, x1, x2, x3, k0, k1, k2, k3) do {   \\\r\n        ROUND(G, a, b, c, d, X(x0), k0,  5);                \\\r\n        ROUND(G, d, a, b, c, X(x1), k1,  9);                \\\r\n        ROUND(G, c, d, a, b, X(x2), k2, 14);                \\\r\n        ROUND(G, b, c, d, a, X(x3), k3, 20);                \\\r\n    } while (0)\r\n\r\n    #define QROUND_H(x0, x1, x2, x3, k0, k1, k2, k3) do {   \\\r\n        ROUND(H, a, b, c, d, X(x0), k0,  4);                \\\r\n        ROUND(H, d, a, b, c, X(x1), k1, 11);                \\\r\n        ROUND(H, c, d, a, b, X(x2), k2, 16);                \\\r\n        ROUND(H, b, c, d, a, X(x3), k3, 23);                \\\r\n    } while (0)\r\n\r\n    #define QROUND_I(x0, x1, x2, x3, k0, k1, k2, k3) do {   \\\r\n        ROUND(I, a, b, c, d, X(x0), k0,  6);                \\\r\n        ROUND(I, d, a, b, c, X(x1), k1, 10);                \\\r\n        ROUND(I, c, d, a, b, X(x2), k2, 15);                \\\r\n        ROUND(I, b, c, d, a, X(x3), k3, 21);                \\\r\n    } while (0)\r\n\r\n    uint32_t a = state[0];\r\n    uint32_t b = state[1];\r\n    uint32_t c = state[2];\r\n    uint32_t d = state[3];\r\n\r\n    do\r\n    {\r\n        uint32_t last_a = a;\r\n        uint32_t last_b = b;\r\n        uint32_t last_c = c;\r\n        uint32_t last_d = d;\r\n\r\n        QROUND_F( 0,  1,  2,  3, 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee);\r\n        QROUND_F( 4,  5,  6,  7, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501);\r\n        QROUND_F( 8,  9, 10, 11, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be);\r\n        QROUND_F(12, 13, 14, 15, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        QROUND_G( 1,  6, 11,  0, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa);\r\n        QROUND_G( 5, 10, 15,  4, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8);\r\n        QROUND_G( 9, 14,  3,  8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed);\r\n        QROUND_G(13,  2,  7, 12, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        QROUND_H( 5,  8, 11, 14, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c);\r\n        QROUND_H( 1,  4,  7, 10, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70);\r\n        QROUND_H(13,  0,  3,  6, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05);\r\n        QROUND_H( 9, 12, 15,  2, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        QROUND_I( 0,  7, 14,  5, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039);\r\n        QROUND_I(12,  3, 10,  1, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1);\r\n        QROUND_I( 8, 15,  6, 13, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1);\r\n        QROUND_I( 4, 11,  2,  9, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        a += last_a;\r\n        b += last_b;\r\n        c += last_c;\r\n        d += last_d;\r\n\r\n        block += MD5_BLOCK_SIZE;\r\n    }\r\n    while (--count);\r\n\r\n    state[0] = a;\r\n    state[1] = b;\r\n    state[2] = c;\r\n    state[3] = d;\r\n\r\n    #undef QROUND_F\r\n    #undef QROUND_G\r\n    #undef QROUND_H\r\n    #undef QROUND_I\r\n    #undef ROUND\r\n    #undef X\r\n    #undef F\r\n    #undef G\r\n    #undef H\r\n    #undef I\r\n}\r\n\r\n#endif // defined(__x86_64__) || defined(_M_AMD64)\r\n\r\nstatic void md5_process(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n    int cpuid = md5_cpuid();\r\n    if (cpuid & MD5_CPUID_BMI2)\r\n    {\r\n        md5_process_bmi2(state, block, count);\r\n        return;\r\n    }\r\n#endif\r\n\r\n    // F function uses 3 operations instead of 4 when \"bit select\" instruction is not available\r\n    // (x & y) | (~x & z) == (z ^ (x & (y ^ z))\r\n\r\n    // G function uses + instead of | for better ILP\r\n\r\n    // #define F(x,y,z) ((x & y) | (~x & z))\r\n    #define F(x,y,z) (z ^ (x & (y ^ z)))\r\n    #define G(x,y,z) (x & z) + (y & ~z)\r\n    #define H(x,y,z) (x ^ y ^ z)\r\n    #define I(x,y,z) (y ^ (x | ~z))\r\n\r\n    #define X(i) MD5_GET32LE(block + i*sizeof(uint32_t))\r\n\r\n    #define ROUND(F, a, b, c, d, x, k, r) do {  \\\r\n        a += F(b, c, d) + (x) + (k);            \\\r\n        a = MD5_ROL32(a, r) + b;                \\\r\n    } while (0)\r\n\r\n    #define QROUND_F(x0, x1, x2, x3, k0, k1, k2, k3) do {    \\\r\n        ROUND(F, a, b, c, d, X(x0), k0,  7);                 \\\r\n        ROUND(F, d, a, b, c, X(x1), k1, 12);                 \\\r\n        ROUND(F, c, d, a, b, X(x2), k2, 17);                 \\\r\n        ROUND(F, b, c, d, a, X(x3), k3, 22);                 \\\r\n    } while (0)\r\n\r\n    #define QROUND_G(x0, x1, x2, x3, k0, k1, k2, k3) do {   \\\r\n        ROUND(G, a, b, c, d, X(x0), k0,  5);                \\\r\n        ROUND(G, d, a, b, c, X(x1), k1,  9);                \\\r\n        ROUND(G, c, d, a, b, X(x2), k2, 14);                \\\r\n        ROUND(G, b, c, d, a, X(x3), k3, 20);                \\\r\n    } while (0)\r\n\r\n    #define QROUND_H(x0, x1, x2, x3, k0, k1, k2, k3) do {   \\\r\n        ROUND(H, a, b, c, d, X(x0), k0,  4);                \\\r\n        ROUND(H, d, a, b, c, X(x1), k1, 11);                \\\r\n        ROUND(H, c, d, a, b, X(x2), k2, 16);                \\\r\n        ROUND(H, b, c, d, a, X(x3), k3, 23);                \\\r\n    } while (0)\r\n\r\n    #define QROUND_I(x0, x1, x2, x3, k0, k1, k2, k3) do {   \\\r\n        ROUND(I, a, b, c, d, X(x0), k0,  6);                \\\r\n        ROUND(I, d, a, b, c, X(x1), k1, 10);                \\\r\n        ROUND(I, c, d, a, b, X(x2), k2, 15);                \\\r\n        ROUND(I, b, c, d, a, X(x3), k3, 21);                \\\r\n    } while (0)\r\n\r\n    uint32_t a = state[0];\r\n    uint32_t b = state[1];\r\n    uint32_t c = state[2];\r\n    uint32_t d = state[3];\r\n\r\n    do\r\n    {\r\n        uint32_t last_a = a;\r\n        uint32_t last_b = b;\r\n        uint32_t last_c = c;\r\n        uint32_t last_d = d;\r\n\r\n        QROUND_F( 0,  1,  2,  3, 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee);\r\n        QROUND_F( 4,  5,  6,  7, 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501);\r\n        QROUND_F( 8,  9, 10, 11, 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be);\r\n        QROUND_F(12, 13, 14, 15, 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        QROUND_G( 1,  6, 11,  0, 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa);\r\n        QROUND_G( 5, 10, 15,  4, 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8);\r\n        QROUND_G( 9, 14,  3,  8, 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed);\r\n        QROUND_G(13,  2,  7, 12, 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        QROUND_H( 5,  8, 11, 14, 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c);\r\n        QROUND_H( 1,  4,  7, 10, 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70);\r\n        QROUND_H(13,  0,  3,  6, 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05);\r\n        QROUND_H( 9, 12, 15,  2, 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        QROUND_I( 0,  7, 14,  5, 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039);\r\n        QROUND_I(12,  3, 10,  1, 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1);\r\n        QROUND_I( 8, 15,  6, 13, 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1);\r\n        QROUND_I( 4, 11,  2,  9, 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391);\r\n        MD5_COMPILER_BARRIER();\r\n\r\n        a += last_a;\r\n        b += last_b;\r\n        c += last_c;\r\n        d += last_d;\r\n\r\n        block += MD5_BLOCK_SIZE;\r\n    }\r\n    while (--count);\r\n\r\n    state[0] = a;\r\n    state[1] = b;\r\n    state[2] = c;\r\n    state[3] = d;\r\n\r\n    #undef QROUND_F\r\n    #undef QROUND_G\r\n    #undef QROUND_H\r\n    #undef QROUND_I\r\n    #undef ROUND\r\n    #undef X\r\n    #undef F\r\n    #undef G\r\n    #undef H\r\n    #undef I\r\n}\r\n\r\nvoid md5_init(md5_ctx* ctx)\r\n{\r\n    ctx->count = 0;\r\n    ctx->state[0] = 0x67452301;\r\n    ctx->state[1] = 0xefcdab89;\r\n    ctx->state[2] = 0x98badcfe;\r\n    ctx->state[3] = 0x10325476;\r\n}\r\n\r\nvoid md5_update(md5_ctx* ctx, const void* data, size_t size)\r\n{\r\n    const uint8_t* buffer = (const uint8_t*)data;\r\n\r\n    size_t pending = ctx->count % MD5_BLOCK_SIZE;\r\n    ctx->count += size;\r\n\r\n    size_t available = MD5_BLOCK_SIZE - pending;\r\n    if (pending && size >= available)\r\n    {\r\n        memcpy(ctx->buffer + pending, buffer, available);\r\n        md5_process(ctx->state, ctx->buffer, 1);\r\n        buffer += available;\r\n        size -= available;\r\n        pending = 0;\r\n    }\r\n\r\n    size_t count = size / MD5_BLOCK_SIZE;\r\n    if (count)\r\n    {\r\n        md5_process(ctx->state, buffer, count);\r\n        buffer += count * MD5_BLOCK_SIZE;\r\n        size -= count * MD5_BLOCK_SIZE;\r\n    }\r\n\r\n    memcpy(ctx->buffer + pending, buffer, size);\r\n}\r\n\r\nvoid md5_finish(md5_ctx* ctx, uint8_t digest[MD5_DIGEST_SIZE])\r\n{\r\n    uint64_t count = ctx->count;\r\n    uint64_t bitcount = count * 8;\r\n\r\n    size_t pending = count % MD5_BLOCK_SIZE;\r\n    size_t blocks = pending < MD5_BLOCK_SIZE - sizeof(bitcount) ? 1 : 2;\r\n\r\n    ctx->buffer[pending++] = 0x80;\r\n\r\n    uint8_t padding[2 * MD5_BLOCK_SIZE];\r\n    memcpy(padding, ctx->buffer, MD5_BLOCK_SIZE);\r\n    memset(padding + pending, 0, MD5_BLOCK_SIZE);\r\n    MD5_SET64LE(padding + blocks * MD5_BLOCK_SIZE - sizeof(bitcount), bitcount);\r\n\r\n    md5_process(ctx->state, padding, blocks);\r\n\r\n    for (size_t i=0; i<4; i++)\r\n    {\r\n        MD5_SET32LE(digest + i*sizeof(uint32_t), ctx->state[i]);\r\n    }\r\n}\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic pop\r\n#endif\r\n"
  },
  {
    "path": "src/third_party/martins_hash/sha1.h",
    "content": "#pragma once\r\n\r\n// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n\r\n//\r\n// interface\r\n//\r\n\r\n#define SHA1_DIGEST_SIZE    20\r\n#define SHA1_BLOCK_SIZE     64\r\n\r\ntypedef struct {\r\n    uint8_t buffer[SHA1_BLOCK_SIZE];\r\n    uint64_t count;\r\n    uint32_t state[5];\r\n} sha1_ctx;\r\n\r\nstatic inline void sha1_init(sha1_ctx* ctx);\r\nstatic inline void sha1_update(sha1_ctx* ctx, const void* data, size_t size);\r\nstatic inline void sha1_finish(sha1_ctx* ctx, uint8_t digest[SHA1_DIGEST_SIZE]);\r\n\r\n//\r\n// implementation\r\n//\r\n\r\n#include <string.h> // memcpy, memset\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic push\r\n#   pragma clang diagnostic ignored \"-Wcast-align\"\r\n#   pragma clang diagnostic ignored \"-Wunsafe-buffer-usage\"\r\n#   pragma clang diagnostic ignored \"-Wlanguage-extension-token\"\r\n#   pragma clang diagnostic ignored \"-Wdeclaration-after-statement\"\r\n#elif defined(_MSC_VER)\r\n#   pragma warning (push)\r\n#   pragma warning (disable : 4127)\r\n#endif\r\n\r\n#if defined(__clang__)\r\n#   define SHA1_ROL32(x,n) __builtin_rotateleft32(x, n)\r\n#elif defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define SHA1_ROL32(x,n) _rotl(x, n)\r\n#else\r\n#   define SHA1_ROL32(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) )\r\n#endif\r\n\r\n#if defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define SHA1_GET32BE(ptr) _byteswap_ulong( *((const __unaligned uint32_t*)(ptr)) )\r\n#   define SHA1_SET32BE(ptr,x) *((__unaligned uint32_t*)(ptr)) = _byteswap_ulong(x)\r\n#   define SHA1_SET64BE(ptr,x) *((__unaligned uint64_t*)(ptr)) = _byteswap_uint64(x)\r\n#else\r\n#   define SHA1_GET32BE(ptr) \\\r\n    (                       \\\r\n        ((ptr)[0] << 24) |  \\\r\n        ((ptr)[1] << 16) |  \\\r\n        ((ptr)[2] <<  8) |  \\\r\n        ((ptr)[3] <<  0)    \\\r\n    )\r\n#   define SHA1_SET32BE(ptr, x) do          \\\r\n    {                                       \\\r\n        (ptr)[0] = (uint8_t)((x) >> 24);    \\\r\n        (ptr)[1] = (uint8_t)((x) >> 16);    \\\r\n        (ptr)[2] = (uint8_t)((x) >>  8);    \\\r\n        (ptr)[3] = (uint8_t)((x) >>  0);    \\\r\n    }                                       \\\r\n    while (0)\r\n#   define SHA1_SET64BE(ptr, x) do          \\\r\n    {                                       \\\r\n        (ptr)[0] = (uint8_t)((x) >> 56);    \\\r\n        (ptr)[1] = (uint8_t)((x) >> 48);    \\\r\n        (ptr)[2] = (uint8_t)((x) >> 40);    \\\r\n        (ptr)[3] = (uint8_t)((x) >> 32);    \\\r\n        (ptr)[4] = (uint8_t)((x) >> 24);    \\\r\n        (ptr)[5] = (uint8_t)((x) >> 16);    \\\r\n        (ptr)[6] = (uint8_t)((x) >>  8);    \\\r\n        (ptr)[7] = (uint8_t)((x) >>  0);    \\\r\n    }                                       \\\r\n    while (0)\r\n#endif\r\n\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n#include <tmmintrin.h> // SSSE3\r\n#include <immintrin.h> // SHANI\r\n\r\n#if defined(__clang__) || defined(__GNUC__)\r\n#   include <cpuid.h>\r\n#   define SHA1_TARGET(str)          __attribute__((target(str)))\r\n#   define SHA1_CPUID(x, info)       __cpuid(x, info[0], info[1], info[2], info[3])\r\n#   define SHA1_CPUID_EX(x, y, info) __cpuid_count(x, y, info[0], info[1], info[2], info[3])\r\n#else\r\n#   include <intrin.h>\r\n#   define SHA1_TARGET(str)\r\n#   define SHA1_CPUID(x, info)       __cpuid(info, x)\r\n#   define SHA1_CPUID_EX(x, y, info) __cpuidex(info, x, y)\r\n#endif\r\n\r\n#define SHA1_CPUID_INIT  (1 << 0)\r\n#define SHA1_CPUID_SHANI (1 << 1)\r\n\r\nstatic inline int sha1_cpuid(void)\r\n{\r\n    static int cpuid;\r\n\r\n    int result = cpuid;\r\n    if (result == 0)\r\n    {\r\n        int info[4];\r\n\r\n        SHA1_CPUID(1, info);\r\n        int has_ssse3 = info[3] & (1 << 9);\r\n\r\n        SHA1_CPUID_EX(7, 0, info);\r\n        int has_shani = info[1] & (1 << 29);\r\n\r\n        result |= SHA1_CPUID_INIT;\r\n        if (has_ssse3 && has_shani)\r\n        {\r\n            result |= SHA1_CPUID_SHANI;\r\n        }\r\n\r\n        cpuid = result;\r\n    }\r\n\r\n#if defined(SHA1_CPUID_MASK)\r\n    result &= SHA1_CPUID_MASK;\r\n#endif\r\n\r\n    return result;\r\n}\r\n\r\nSHA1_TARGET(\"ssse3,sha\")\r\nstatic void sha1_process_shani(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n    // in SHA1 each round has two parts:\r\n    // 1) calculate message schedule dwords in w[i]\r\n    // 2) do round functions to update a/b/c/d/e state values using w[i]\r\n\r\n    // w[i] in first 16 rounds is just loaded from block bytes, as 32-bit big-endian load\r\n\r\n    // for next rounds it is done as:\r\n    // w[i] = ROL(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16])\r\n    // where ROL(x) = 32-bit rotate left by 1\r\n\r\n    // this means it is possible to keep just the last 16 of w's in circular buffer\r\n    // and every new w calculated will need to update 1 to 3 previous w's\r\n\r\n    // unrolling round calculations by 4 we get:\r\n    // w[i+0] = ROL(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16])\r\n    // w[i+1] = ROL(w[i-2] ^ w[i-7] ^ w[i-13] ^ w[i-15])\r\n    // w[i+2] = ROL(w[i-1] ^ w[i-6] ^ w[i-12] ^ w[i-14])\r\n    // w[i+3] = ROL(w[i+0] ^ w[i-5] ^ w[i-11] ^ w[i-13])\r\n\r\n    // now if you store 4 w[..] values in 128-bit SSE register, then\r\n    // W(i) = ROL( r0 ^ r1 ^ r2 ^ r3 )\r\n    // with caveat that r0 lane 3 depends on W(i) lane 0\r\n\r\n    //         [3]      [2]      [1]      [0]      // lanes\r\n    // r0 = [ special, w[i-1],  w[i-2],  w[i-3]  ]\r\n    // r1 = [ w[i-5],  w[i-6],  w[i-7],  w[i-8]  ]\r\n    // r2 = [ w[i-11], w[i-12], w[i-13], w[i-14] ]\r\n    // r3 = [ w[i-13], w[i-14], w[i-15], w[i-16] ]\r\n\r\n    // in each 4-round i'th step it is possible to incrementally update new W(..) value when\r\n    // keeping W(i) values in 4 xmm element circular buffer\r\n\r\n    // rounds i>0: W(i-1) = r2 ^ r3          = _mm_sha1msg1_epu32(W(i-1), W(i))\r\n    // rounds i>1: W(i-2) = W(i-2) ^ r1      = _mm_xor_si128     (W(i-2), W(i))\r\n    // rounds i>2: W(i-3) = ROL(W(i-3) ^ r0) = _mm_sha1msg2_epu32(W(i-3), W(i))\r\n    // then the new W(i) can be used in round function calculations\r\n    // _mm_sha1msg2_epu32 correctly handles r0 lane 3 dependency on W(i) lane 0\r\n\r\n    // to perform round functions on two SIMD registers with state as:\r\n    // abcd = [a,b,c,d]\r\n    //   e0 = [e,0,0,0]\r\n    // use the following code to get next abcd/e0 state 4 rounds at a time:\r\n\r\n    //       tmp = _mm_sha1nexte_epu32(e0, W(i))      // rotates e0 and adds message dwords\r\n    // abcd_next = _mm_sha1rnds4_epu32(abcd, tmp, Fn) // with Fn = 0..3 round function selection\r\n    //   e0_next = abcd\r\n\r\n    // sha1nexte is not needed on first round, just regular add32(e0, W(i)) should be used\r\n    // after last round need to do extra rotation, which sha1nexte takes care when adding to last_e0\r\n\r\n    #define W(i) w[(i)%4]\r\n\r\n    // 4 wide round calculations\r\n    #define QROUND(i) do {                                                          \\\r\n        /* first 4 rounds load input block */                                       \\\r\n        if (i < 4) W(i) = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[i]), bswap);     \\\r\n        /* update message schedule */                                               \\\r\n        if (i > 0 && i < 17) W(i-1) = _mm_sha1msg1_epu32(W(i-1), W(i));             \\\r\n        if (i > 1 && i < 18) W(i-2) = _mm_xor_si128     (W(i-2), W(i));             \\\r\n        if (i > 2 && i < 19) W(i-3) = _mm_sha1msg2_epu32(W(i-3), W(i));             \\\r\n        /* calculate E plus message schedule */                                     \\\r\n        if (i == 0) tmp = _mm_add_epi32      (e0, W(i));                            \\\r\n        if (i != 0) tmp = _mm_sha1nexte_epu32(e0, W(i));                            \\\r\n        /* 4 round functions */                                                     \\\r\n        e0 = abcd;                                                                  \\\r\n        abcd = _mm_sha1rnds4_epu32(abcd, tmp, i/5);                                 \\\r\n    } while(0)\r\n\r\n    const __m128i* buffer = (const __m128i*)block;\r\n\r\n    // for performing two operations in one:\r\n    // 1) dwords need to be loaded as big-endian\r\n    // 2) order of dwords need to be reversed for sha1 instructions: [0,1,2,3] -> [3,2,1,0]\r\n    const __m128i bswap = _mm_setr_epi8(15,14,13,12, 11,10,9,8, 7,6,5,4, 3,2,1,0);\r\n\r\n    // load initial state\r\n    __m128i abcd = _mm_loadu_si128((const __m128i*)state); // [d,c,b,a]\r\n    __m128i e0 = _mm_loadu_si32(&state[4]);                // [0,0,0,e]\r\n\r\n    // flip dword order, to what sha1 instructions use\r\n    abcd = _mm_shuffle_epi32(abcd, _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d] where a is in the top lane\r\n    e0 = _mm_slli_si128(e0, 12);                          // [e,0,0,0] where e is in top lane\r\n\r\n    do\r\n    {\r\n        // remember current state\r\n        __m128i last_abcd = abcd;\r\n        __m128i last_e0 = e0;\r\n\r\n        __m128i tmp, w[4];\r\n\r\n        QROUND(0);\r\n        QROUND(1);\r\n        QROUND(2);\r\n        QROUND(3);\r\n        QROUND(4);\r\n\r\n        QROUND(5);\r\n        QROUND(6);\r\n        QROUND(7);\r\n        QROUND(8);\r\n        QROUND(9);\r\n\r\n        QROUND(10);\r\n        QROUND(11);\r\n        QROUND(12);\r\n        QROUND(13);\r\n        QROUND(14);\r\n\r\n        QROUND(15);\r\n        QROUND(16);\r\n        QROUND(17);\r\n        QROUND(18);\r\n        QROUND(19);\r\n\r\n        // update next state\r\n        abcd = _mm_add_epi32(abcd, last_abcd);\r\n        e0 = _mm_sha1nexte_epu32(e0, last_e0);\r\n\r\n        buffer += 4;\r\n    }\r\n    while (--count);\r\n\r\n    // restore dword order\r\n    abcd = _mm_shuffle_epi32(abcd, _MM_SHUFFLE(0,1,2,3));\r\n    e0   = _mm_shuffle_epi32(e0,   _MM_SHUFFLE(0,1,2,3));\r\n\r\n    // save the new state\r\n    _mm_storeu_si128((__m128i*)state, abcd);\r\n    _mm_storeu_si32(&state[4], e0);\r\n\r\n    #undef QROUND\r\n    #undef W\r\n}\r\n\r\n#endif // defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n\r\n#if defined(__aarch64__) || defined(_M_ARM64)\r\n\r\n#if defined(__clang__)\r\n#   define SHA1_TARGET __attribute__((target(\"sha2\")))\r\n#elif defined(__GNUC__)\r\n#   define SHA1_TARGET __attribute__((target(\"+sha2\")))\r\n#elif defined(_MSC_VER)\r\n#   define SHA1_TARGET\r\n#endif\r\n\r\n#include <arm_neon.h>\r\n\r\n#if defined(_WIN32)\r\n#   include <windows.h>\r\n#elif defined(__linux__)\r\n#   include <sys/auxv.h>\r\n#   include <asm/hwcap.h>\r\n#elif defined(__APPLE__)\r\n#   include <sys/sysctl.h>\r\n#endif\r\n\r\n#define SHA1_CPUID_INIT  (1 << 0)\r\n#define SHA1_CPUID_ARM64 (1 << 1)\r\n\r\nstatic inline int sha1_cpuid(void)\r\n{\r\n#if defined(__ARM_FEATURE_CRYPTO) || defined(__ARM_FEATURE_SHA2)\r\n    int result = SHA1_CPUID_ARM64;\r\n#else\r\n    static int cpuid;\r\n\r\n    int result = cpuid;\r\n    if (result == 0)\r\n    {\r\n#if defined(_WIN32)\r\n        int has_arm64 = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);\r\n#elif defined(__linux__)\r\n        unsigned long hwcap = getauxval(AT_HWCAP);\r\n        int has_arm64 = hwcap & HWCAP_SHA1;\r\n#elif defined(__APPLE__)\r\n        int value = 0;\r\n        size_t valuelen = sizeof(value);\r\n        int has_arm64 = sysctlbyname(\"hw.optional.arm.FEAT_SHA1\", &value, &valuelen, NULL, 0) == 0 && value != 0;\r\n#else\r\n#error unknown platform\r\n#endif\r\n        result |= SHA1_CPUID_INIT;\r\n        if (has_arm64)\r\n        {\r\n            result |= SHA1_CPUID_ARM64;\r\n        }\r\n\r\n        cpuid = result;\r\n    }\r\n#endif\r\n\r\n#if defined(SHA1_CPUID_MASK)\r\n    result &= SHA1_CPUID_MASK;\r\n#endif\r\n\r\n    return result;\r\n}\r\n\r\nSHA1_TARGET\r\nstatic void sha1_process_arm64(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n    // code here is similar to x64 shani implementation\r\n\r\n    // message array is 16 element circular buffer\r\n    // each iteration updates 4 rounds at the same time\r\n\r\n    #define W(i) w[(i)%4]\r\n\r\n    #define QROUND(i,F,k) do {                                  \\\r\n        /* update message schedule */                           \\\r\n        if (i >= 4) W(i) = vsha1su0q_u32(W(i), W(i-3), W(i-2)); \\\r\n        if (i >= 4) W(i) = vsha1su1q_u32(W(i), W(i-1));         \\\r\n        /* add round constant */                                \\\r\n        uint32x4_t tmp = vaddq_u32(W(i), k);                    \\\r\n        /* 4 round functions */                                 \\\r\n        uint32_t x = e0;                                        \\\r\n        e0 = vsha1h_u32(vgetq_lane_u32(abcd, 0));               \\\r\n        abcd = F(abcd, x, tmp);                                 \\\r\n    } while (0)\r\n\r\n    const uint32x4_t k0 = vdupq_n_u32(0x5a827999);\r\n    const uint32x4_t k1 = vdupq_n_u32(0x6ed9eba1);\r\n    const uint32x4_t k2 = vdupq_n_u32(0x8f1bbcdc);\r\n    const uint32x4_t k3 = vdupq_n_u32(0xca62c1d6);\r\n\r\n    // load state - a,b,c,d,e\r\n    uint32x4_t abcd = vld1q_u32(state);\r\n    uint32_t   e0   = state[4];\r\n\r\n    do\r\n    {\r\n        // remember current state\r\n        uint32x4_t last_abcd = abcd;\r\n        uint32_t   last_e0   = e0;\r\n\r\n        // load 64-byte block and advance pointer to next block\r\n        uint8x16x4_t msg = vld1q_u8_x4(block);\r\n        block += SHA1_BLOCK_SIZE;\r\n\r\n        uint32x4_t w[4];\r\n\r\n        // for first 16 w's reverse the byte order in each 32-bit lane\r\n        W(0) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[0]));\r\n        W(1) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[1]));\r\n        W(2) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[2]));\r\n        W(3) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[3]));\r\n\r\n        QROUND( 0, vsha1cq_u32, k0);\r\n        QROUND( 1, vsha1cq_u32, k0);\r\n        QROUND( 2, vsha1cq_u32, k0);\r\n        QROUND( 3, vsha1cq_u32, k0);\r\n        QROUND( 4, vsha1cq_u32, k0);\r\n\r\n        QROUND( 5, vsha1pq_u32, k1);\r\n        QROUND( 6, vsha1pq_u32, k1);\r\n        QROUND( 7, vsha1pq_u32, k1);\r\n        QROUND( 8, vsha1pq_u32, k1);\r\n        QROUND( 9, vsha1pq_u32, k1);\r\n\r\n        QROUND(10, vsha1mq_u32, k2);\r\n        QROUND(11, vsha1mq_u32, k2);\r\n        QROUND(12, vsha1mq_u32, k2);\r\n        QROUND(13, vsha1mq_u32, k2);\r\n        QROUND(14, vsha1mq_u32, k2);\r\n\r\n        QROUND(15, vsha1pq_u32, k3);\r\n        QROUND(16, vsha1pq_u32, k3);\r\n        QROUND(17, vsha1pq_u32, k3);\r\n        QROUND(18, vsha1pq_u32, k3);\r\n        QROUND(19, vsha1pq_u32, k3);\r\n\r\n        // update next state\r\n        abcd = vaddq_u32(abcd, last_abcd);\r\n        e0  += last_e0;\r\n    }\r\n    while (--count);\r\n\r\n    // save state\r\n    vst1q_u32(state, abcd);\r\n    state[4] = e0;\r\n\r\n    #undef QROUND\r\n    #undef W\r\n}\r\n\r\n#endif // defined(__aarch64__) || defined(_M_ARM64)\r\n\r\nstatic void sha1_process(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n    int cpuid = sha1_cpuid();\r\n    if (cpuid & SHA1_CPUID_SHANI)\r\n    {\r\n        sha1_process_shani(state, block, count);\r\n        return;\r\n    }\r\n#endif\r\n\r\n#if defined(__aarch64__) || defined(_M_ARM64)\r\n    int cpuid = sha1_cpuid();\r\n    if (cpuid & SHA1_CPUID_ARM64)\r\n    {\r\n        sha1_process_arm64(state, block, count);\r\n        return;\r\n    }    \r\n#endif\r\n\r\n    #define F1(x,y,z) (0x5a827999 + ((x & (y ^ z)) ^ z))\r\n    #define F2(x,y,z) (0x6ed9eba1 + (x ^ y ^ z))\r\n    #define F3(x,y,z) (0x8f1bbcdc + ((x & y) | (z & (x | y))))\r\n    #define F4(x,y,z) (0xca62c1d6 + (x ^ y ^ z))\r\n\r\n    #define W(i) w[(i)%16]\r\n\r\n    #define ROUND(i,a,b,c,d,e,F) do                                                     \\\r\n    {                                                                                   \\\r\n        uint32_t w0;                                                                    \\\r\n        if (i <  16) W(i) = w0 = SHA1_GET32BE(block + i*sizeof(uint32_t));              \\\r\n        if (i >= 16) W(i) = w0 = SHA1_ROL32(W(i-3) ^ W(i-8) ^ W(i-14) ^ W(i-16), 1);    \\\r\n                                                                                        \\\r\n        e += SHA1_ROL32(a,5) + F(b,c,d) + w0;                                           \\\r\n        b = SHA1_ROL32(b,30);                                                           \\\r\n    } while (0)\r\n\r\n    uint32_t a = state[0];\r\n    uint32_t b = state[1];\r\n    uint32_t c = state[2];\r\n    uint32_t d = state[3];\r\n    uint32_t e = state[4];\r\n\r\n    do\r\n    {\r\n        uint32_t last_a = a;\r\n        uint32_t last_b = b;\r\n        uint32_t last_c = c;\r\n        uint32_t last_d = d;\r\n        uint32_t last_e = e;\r\n\r\n        uint32_t w[16];\r\n\r\n        ROUND( 0, a, b, c, d, e, F1);\r\n        ROUND( 1, e, a, b, c, d, F1);\r\n        ROUND( 2, d, e, a, b, c, F1);\r\n        ROUND( 3, c, d, e, a, b, F1);\r\n        ROUND( 4, b, c, d, e, a, F1);\r\n        ROUND( 5, a, b, c, d, e, F1);\r\n        ROUND( 6, e, a, b, c, d, F1);\r\n        ROUND( 7, d, e, a, b, c, F1);\r\n        ROUND( 8, c, d, e, a, b, F1);\r\n        ROUND( 9, b, c, d, e, a, F1);\r\n        ROUND(10, a, b, c, d, e, F1);\r\n        ROUND(11, e, a, b, c, d, F1);\r\n        ROUND(12, d, e, a, b, c, F1);\r\n        ROUND(13, c, d, e, a, b, F1);\r\n        ROUND(14, b, c, d, e, a, F1);\r\n        ROUND(15, a, b, c, d, e, F1);\r\n        ROUND(16, e, a, b, c, d, F1);\r\n        ROUND(17, d, e, a, b, c, F1);\r\n        ROUND(18, c, d, e, a, b, F1);\r\n        ROUND(19, b, c, d, e, a, F1);\r\n\r\n        ROUND(20, a, b, c, d, e, F2);\r\n        ROUND(21, e, a, b, c, d, F2);\r\n        ROUND(22, d, e, a, b, c, F2);\r\n        ROUND(23, c, d, e, a, b, F2);\r\n        ROUND(24, b, c, d, e, a, F2);\r\n        ROUND(25, a, b, c, d, e, F2);\r\n        ROUND(26, e, a, b, c, d, F2);\r\n        ROUND(27, d, e, a, b, c, F2);\r\n        ROUND(28, c, d, e, a, b, F2);\r\n        ROUND(29, b, c, d, e, a, F2);\r\n        ROUND(30, a, b, c, d, e, F2);\r\n        ROUND(31, e, a, b, c, d, F2);\r\n        ROUND(32, d, e, a, b, c, F2);\r\n        ROUND(33, c, d, e, a, b, F2);\r\n        ROUND(34, b, c, d, e, a, F2);\r\n        ROUND(35, a, b, c, d, e, F2);\r\n        ROUND(36, e, a, b, c, d, F2);\r\n        ROUND(37, d, e, a, b, c, F2);\r\n        ROUND(38, c, d, e, a, b, F2);\r\n        ROUND(39, b, c, d, e, a, F2);\r\n\r\n        ROUND(40, a, b, c, d, e, F3);\r\n        ROUND(41, e, a, b, c, d, F3);\r\n        ROUND(42, d, e, a, b, c, F3);\r\n        ROUND(43, c, d, e, a, b, F3);\r\n        ROUND(44, b, c, d, e, a, F3);\r\n        ROUND(45, a, b, c, d, e, F3);\r\n        ROUND(46, e, a, b, c, d, F3);\r\n        ROUND(47, d, e, a, b, c, F3);\r\n        ROUND(48, c, d, e, a, b, F3);\r\n        ROUND(49, b, c, d, e, a, F3);\r\n        ROUND(50, a, b, c, d, e, F3);\r\n        ROUND(51, e, a, b, c, d, F3);\r\n        ROUND(52, d, e, a, b, c, F3);\r\n        ROUND(53, c, d, e, a, b, F3);\r\n        ROUND(54, b, c, d, e, a, F3);\r\n        ROUND(55, a, b, c, d, e, F3);\r\n        ROUND(56, e, a, b, c, d, F3);\r\n        ROUND(57, d, e, a, b, c, F3);\r\n        ROUND(58, c, d, e, a, b, F3);\r\n        ROUND(59, b, c, d, e, a, F3);\r\n\r\n        ROUND(60, a, b, c, d, e, F4);\r\n        ROUND(61, e, a, b, c, d, F4);\r\n        ROUND(62, d, e, a, b, c, F4);\r\n        ROUND(63, c, d, e, a, b, F4);\r\n        ROUND(64, b, c, d, e, a, F4);\r\n        ROUND(65, a, b, c, d, e, F4);\r\n        ROUND(66, e, a, b, c, d, F4);\r\n        ROUND(67, d, e, a, b, c, F4);\r\n        ROUND(68, c, d, e, a, b, F4);\r\n        ROUND(69, b, c, d, e, a, F4);\r\n        ROUND(70, a, b, c, d, e, F4);\r\n        ROUND(71, e, a, b, c, d, F4);\r\n        ROUND(72, d, e, a, b, c, F4);\r\n        ROUND(73, c, d, e, a, b, F4);\r\n        ROUND(74, b, c, d, e, a, F4);\r\n        ROUND(75, a, b, c, d, e, F4);\r\n        ROUND(76, e, a, b, c, d, F4);\r\n        ROUND(77, d, e, a, b, c, F4);\r\n        ROUND(78, c, d, e, a, b, F4);\r\n        ROUND(79, b, c, d, e, a, F4);\r\n\r\n        a += last_a;\r\n        b += last_b;\r\n        c += last_c;\r\n        d += last_d;\r\n        e += last_e;\r\n\r\n        block += SHA1_BLOCK_SIZE;\r\n    }\r\n    while (--count);\r\n\r\n    state[0] = a;\r\n    state[1] = b;\r\n    state[2] = c;\r\n    state[3] = d;\r\n    state[4] = e;\r\n\r\n    #undef ROUND\r\n    #undef W\r\n    #undef F1\r\n    #undef F2\r\n    #undef F3\r\n    #undef F4\r\n}\r\n\r\nvoid sha1_init(sha1_ctx* ctx)\r\n{\r\n    ctx->count = 0;\r\n    ctx->state[0] = 0x67452301;\r\n    ctx->state[1] = 0xefcdab89;\r\n    ctx->state[2] = 0x98badcfe;\r\n    ctx->state[3] = 0x10325476;\r\n    ctx->state[4] = 0xc3d2e1f0;\r\n}\r\n\r\nvoid sha1_update(sha1_ctx* ctx, const void* data, size_t size)\r\n{\r\n    const uint8_t* buffer = (const uint8_t*)data;\r\n\r\n    size_t pending = ctx->count % SHA1_BLOCK_SIZE;\r\n    ctx->count += size;\r\n\r\n    size_t available = SHA1_BLOCK_SIZE - pending;\r\n    if (pending && size >= available)\r\n    {\r\n        memcpy(ctx->buffer + pending, buffer, available);\r\n        sha1_process(ctx->state, ctx->buffer, 1);\r\n        buffer += available;\r\n        size -= available;\r\n        pending = 0;\r\n    }\r\n\r\n    size_t count = size / SHA1_BLOCK_SIZE;\r\n    if (count)\r\n    {\r\n        sha1_process(ctx->state, buffer, count);\r\n        buffer += count * SHA1_BLOCK_SIZE;\r\n        size -= count * SHA1_BLOCK_SIZE;\r\n    }\r\n\r\n    memcpy(ctx->buffer + pending, buffer, size);\r\n}\r\n\r\nvoid sha1_finish(sha1_ctx* ctx, uint8_t digest[SHA1_DIGEST_SIZE])\r\n{\r\n    uint64_t count = ctx->count;\r\n    uint64_t bitcount = count * 8;\r\n\r\n    size_t pending = count % SHA1_BLOCK_SIZE;\r\n    size_t blocks = pending < SHA1_BLOCK_SIZE - sizeof(bitcount) ? 1 : 2;\r\n\r\n    ctx->buffer[pending++] = 0x80;\r\n\r\n    uint8_t padding[2 * SHA1_BLOCK_SIZE];\r\n    memcpy(padding, ctx->buffer, SHA1_BLOCK_SIZE);\r\n    memset(padding + pending, 0, SHA1_BLOCK_SIZE);\r\n    SHA1_SET64BE(padding + blocks * SHA1_BLOCK_SIZE - sizeof(bitcount), bitcount);\r\n\r\n    sha1_process(ctx->state, padding, blocks);\r\n\r\n    for (size_t i=0; i<5; i++)\r\n    {\r\n        SHA1_SET32BE(digest + i*sizeof(uint32_t), ctx->state[i]);\r\n    }\r\n}\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic pop\r\n#elif defined(_MSC_VER)\r\n#   pragma warning (pop)\r\n#endif\r\n"
  },
  {
    "path": "src/third_party/martins_hash/sha256.h",
    "content": "#pragma once\r\n\r\n// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf\r\n// https://www.rfc-editor.org/rfc/rfc6234\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n\r\n//\r\n// interface\r\n//\r\n\r\n#define SHA224_DIGEST_SIZE  28\r\n#define SHA256_DIGEST_SIZE  32\r\n#define SHA256_BLOCK_SIZE   64\r\n\r\ntypedef struct {\r\n    uint8_t buffer[SHA256_BLOCK_SIZE];\r\n    uint64_t count;\r\n    uint32_t state[8];\r\n} sha256_ctx;\r\n\r\ntypedef sha256_ctx sha224_ctx;\r\n\r\nstatic inline void sha256_init(sha256_ctx* ctx);\r\nstatic inline void sha256_update(sha256_ctx* ctx, const void* data, size_t size);\r\nstatic inline void sha256_finish(sha256_ctx* ctx, uint8_t digest[SHA256_DIGEST_SIZE]);\r\n\r\nstatic inline void sha224_init(sha224_ctx* ctx);\r\nstatic inline void sha224_update(sha224_ctx* ctx, const void* data, size_t size);\r\nstatic inline void sha224_finish(sha224_ctx* ctx, uint8_t digest[SHA224_DIGEST_SIZE]);\r\n\r\n//\r\n// implementation\r\n//\r\n\r\n#include <string.h> // memcpy, memset\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic push\r\n#   pragma clang diagnostic ignored \"-Wcast-align\"\r\n#   pragma clang diagnostic ignored \"-Wunsafe-buffer-usage\"\r\n#   pragma clang diagnostic ignored \"-Wlanguage-extension-token\"\r\n#   pragma clang diagnostic ignored \"-Wdeclaration-after-statement\"\r\n#elif defined(_MSC_VER)\r\n#   pragma warning (push)\r\n#   pragma warning (disable : 4127)\r\n#endif\r\n\r\n#if defined(__clang__)\r\n#   define SHA256_ROR32(x,n) __builtin_rotateright32(x, n)\r\n#elif defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define SHA256_ROR32(x,n) _rotr(x, n)\r\n#else\r\n#   define SHA256_ROR32(x,n) ( ((x) >> (n)) | ((x) << (32-(n))) )\r\n#endif\r\n\r\n#if defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define SHA256_GET32BE(ptr) _byteswap_ulong( *((const __unaligned uint32_t*)(ptr)) )\r\n#   define SHA256_SET32BE(ptr,x) *((__unaligned uint32_t*)(ptr)) = _byteswap_ulong(x)\r\n#   define SHA256_SET64BE(ptr,x) *((__unaligned uint64_t*)(ptr)) = _byteswap_uint64(x)\r\n#else\r\n#   define SHA256_GET32BE(ptr)  \\\r\n    (                           \\\r\n        ((ptr)[0] << 24) |      \\\r\n        ((ptr)[1] << 16) |      \\\r\n        ((ptr)[2] <<  8) |      \\\r\n        ((ptr)[3] <<  0)        \\\r\n    )\r\n#   define SHA256_SET32BE(ptr, x) do        \\\r\n    {                                       \\\r\n        (ptr)[0] = (uint8_t)((x) >> 24);    \\\r\n        (ptr)[1] = (uint8_t)((x) >> 16);    \\\r\n        (ptr)[2] = (uint8_t)((x) >>  8);    \\\r\n        (ptr)[3] = (uint8_t)((x) >>  0);    \\\r\n    }                                       \\\r\n    while (0)\r\n#   define SHA256_SET64BE(ptr, x) do        \\\r\n    {                                       \\\r\n        (ptr)[0] = (uint8_t)((x) >> 56);    \\\r\n        (ptr)[1] = (uint8_t)((x) >> 48);    \\\r\n        (ptr)[2] = (uint8_t)((x) >> 40);    \\\r\n        (ptr)[3] = (uint8_t)((x) >> 32);    \\\r\n        (ptr)[4] = (uint8_t)((x) >> 24);    \\\r\n        (ptr)[5] = (uint8_t)((x) >> 16);    \\\r\n        (ptr)[6] = (uint8_t)((x) >>  8);    \\\r\n        (ptr)[7] = (uint8_t)((x) >>  0);    \\\r\n    }                                       \\\r\n    while (0)\r\n#endif\r\n\r\nstatic const uint32_t SHA256_K[64] =\r\n{\r\n    0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,\r\n    0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,\r\n    0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\r\n    0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,\r\n    0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,\r\n    0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\r\n    0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,\r\n    0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,\r\n    0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\r\n    0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,\r\n    0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,\r\n    0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\r\n    0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,\r\n    0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,\r\n    0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\r\n    0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,\r\n};\r\n\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n#include <tmmintrin.h> // SSSE3\r\n#include <immintrin.h> // SHANI\r\n\r\n#if defined(__clang__) || defined(__GNUC__)\r\n#   include <cpuid.h>\r\n#   define SHA256_TARGET(str)          __attribute__((target(str)))\r\n#   define SHA256_CPUID(x, info)       __cpuid(x, info[0], info[1], info[2], info[3])\r\n#   define SHA256_CPUID_EX(x, y, info) __cpuid_count(x, y, info[0], info[1], info[2], info[3])\r\n#else\r\n#   include <intrin.h>\r\n#   define SHA256_TARGET(str)\r\n#   define SHA256_CPUID(x, info)       __cpuid(info, x)\r\n#   define SHA256_CPUID_EX(x, y, info) __cpuidex(info, x, y)\r\n#endif\r\n\r\n#define SHA256_CPUID_INIT  (1 << 0)\r\n#define SHA256_CPUID_SHANI (1 << 1)\r\n\r\nstatic inline int sha256_cpuid(void)\r\n{\r\n    static int cpuid;\r\n\r\n    int result = cpuid;\r\n    if (result == 0)\r\n    {\r\n        int info[4];\r\n\r\n        SHA256_CPUID(1, info);\r\n        int has_ssse3 = info[3] & (1 << 9);\r\n\r\n        SHA256_CPUID_EX(7, 0, info);\r\n        int has_shani = info[1] & (1 << 29);\r\n\r\n        result |= SHA256_CPUID_INIT;\r\n        if (has_ssse3 && has_shani)\r\n        {\r\n            result |= SHA256_CPUID_SHANI;\r\n        }\r\n\r\n        cpuid = result;\r\n    }\r\n\r\n#if defined(SHA256_CPUID_MASK)\r\n    result &= SHA256_CPUID_MASK;\r\n#endif\r\n\r\n    return result;\r\n}\r\n\r\nSHA256_TARGET(\"ssse3,sha\")\r\nstatic void sha256_process_shani(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n    // similar way how sha1 works in with shani\r\n\r\n    // first 16 rounds loads message schedule dwords as 32-bit big endian values\r\n\r\n    // for next rounds message schedule is prepared as:\r\n    // w[i] = SSig1(w[i-2]) + w[i-7] + SSig0(w[i-15]) + w[i-16]\r\n\r\n    // unrolled by 4:\r\n    // w[i+0] = SSig1(w[i-2]) + w[i-7] + SSig0(w[i-15]) + w[i-16]\r\n    // w[i+1] = SSig1(w[i-1]) + w[i-6] + SSig0(w[i-14]) + w[i-15]\r\n    // w[i+2] = SSig1(w[i+0]) + w[i-5] + SSig0(w[i-13]) + w[i-14]\r\n    // w[i+3] = SSig1(w[i+1]) + w[i-4] + SSig0(w[i-12]) + w[i-13]\r\n\r\n    // there is tricky dependency for lanes 2 and 3 on result of lanes 0 and 1, but sha256msg2 op takes care of that\r\n\r\n    // by storing W[i] word in 128-bit simd register, the message schedule becomes:\r\n    // W(i) = SSig1(r0) + r1 + SSig0(r2) + r3\r\n    // where + is 32-bit lane addition\r\n\r\n    //         [3]      [2]      [1]      [0]      // lanes\r\n    // r0 = [ special, special, w[i-1],  w[i-2]  ]\r\n    // r1 = [ w[i-4],  w[i-5],  w[i-6],  w[i-7]  ]\r\n    // r2 = [ w[i-12], w[i-13], w[i-14], w[i-15] ]\r\n    // r3 = [ w[i-13], w[i-14], w[i-15], w[i-16] ]\r\n\r\n    // rN's can be calculated from previous W(..) values:\r\n    // r0 from W(i)\r\n    // r1 from _mm_alignr_epi8(W(i), W(i-1), 4)\r\n    // r2 from W(i-1) and W(i)\r\n    // r3 from W(i-1)\r\n\r\n    // rounds i>2: W(i-3) = _mm_sha256msg2_epu32(_mm_add_epi32( W(i-3), _mm_alignr_epi8(W(i), W(i-1), 4) ), W(i))\r\n    // rounds i>0: W(i-1) = _mm_sha256msg1_epu32(W(i-1), W(i))\r\n\r\n    // round functions are done with _mm_sha256rnds2_epu32 which performs it for 2 rounds\r\n    // thus repeat it two times, as input use W(i) + K(i) - message schedule added with sha256 constants\r\n\r\n    #define W(i) w[(i)%4]\r\n\r\n    // 4 wide round calculations\r\n    #define QROUND(i) do {                                                                                                  \\\r\n        /* first 4 rounds load input block */                                                                               \\\r\n        if (i < 4) W(i) = _mm_shuffle_epi8(_mm_loadu_si128(&buffer[i]), bswap);                                             \\\r\n        /* update message schedule */                                                                                       \\\r\n        if (i > 2 && i < 15) W(i-3) = _mm_sha256msg2_epu32(_mm_add_epi32(W(i-3), _mm_alignr_epi8(W(i), W(i-1), 4)), W(i));  \\\r\n        if (i > 0 && i < 13) W(i-1) = _mm_sha256msg1_epu32(W(i-1), W(i));                                                   \\\r\n        /* add round constants */                                                                                           \\\r\n        __m128i tmp = _mm_add_epi32(W(i), _mm_loadu_si128((const __m128i*)&SHA256_K[4*i]));                                 \\\r\n        /* 4 round functions */                                                                                             \\\r\n        state1 = _mm_sha256rnds2_epu32(state1, state0, tmp);                                                                \\\r\n        state0 = _mm_sha256rnds2_epu32(state0, state1, _mm_shuffle_epi32(tmp, _MM_SHUFFLE(0,0,3,2)));                       \\\r\n    } while(0)\r\n\r\n    const __m128i* buffer = (const __m128i*)block;\r\n\r\n    // to byteswap when doing big-ending load for message dwords\r\n    const __m128i bswap = _mm_setr_epi8(3,2,1,0, 7,6,5,4, 11,10,9,8, 15,14,13,12);\r\n       \r\n    // load initial state \r\n    __m128i abcd = _mm_shuffle_epi32(_mm_loadu_si128((const __m128i*)&state[0]), _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d]\r\n    __m128i efgh = _mm_shuffle_epi32(_mm_loadu_si128((const __m128i*)&state[4]), _MM_SHUFFLE(0,1,2,3)); // [e,f,g,h]\r\n\r\n    // dword order for sha256rnds2 instruction\r\n    __m128i state0 = _mm_unpackhi_epi64(efgh, abcd); // [a,b,e,f]\r\n    __m128i state1 = _mm_unpacklo_epi64(efgh, abcd); // [c,d,g,h]\r\n\r\n    do\r\n    {\r\n        // remember current state\r\n        __m128i last0 = state0;\r\n        __m128i last1 = state1;\r\n\r\n        __m128i w[4];\r\n\r\n        QROUND( 0);\r\n        QROUND( 1);\r\n        QROUND( 2);\r\n        QROUND( 3);\r\n        QROUND( 4);\r\n        QROUND( 5);\r\n        QROUND( 6);\r\n        QROUND( 7);\r\n        QROUND( 8);\r\n        QROUND( 9);\r\n        QROUND(10);\r\n        QROUND(11);\r\n        QROUND(12);\r\n        QROUND(13);\r\n        QROUND(14);\r\n        QROUND(15);\r\n\r\n        // update next state\r\n        state0 = _mm_add_epi32(state0, last0);\r\n        state1 = _mm_add_epi32(state1, last1);\r\n\r\n        buffer += 4;\r\n    }\r\n    while (--count);\r\n\r\n    // restore dword order\r\n    abcd = _mm_unpackhi_epi64(state1, state0);\r\n    efgh = _mm_unpacklo_epi64(state1, state0);\r\n\r\n    // save the new state\r\n    _mm_storeu_si128((__m128i*)&state[0], _mm_shuffle_epi32(abcd, _MM_SHUFFLE(0,1,2,3)));\r\n    _mm_storeu_si128((__m128i*)&state[4], _mm_shuffle_epi32(efgh, _MM_SHUFFLE(0,1,2,3)));\r\n\r\n    #undef QROUND\r\n    #undef W\r\n}\r\n\r\n#endif // defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n#if defined(__aarch64__) || defined(_M_ARM64)\r\n\r\n#if defined(__clang__)\r\n#   define SHA256_TARGET __attribute__((target(\"sha2\")))\r\n#elif defined(__GNUC__)\r\n#   define SHA256_TARGET __attribute__((target(\"+sha2\")))\r\n#elif defined(_MSC_VER)\r\n#   define SHA256_TARGET\r\n#endif\r\n\r\n#include <arm_neon.h>\r\n\r\n#if defined(_WIN32)\r\n#   include <windows.h>\r\n#elif defined(__linux__)\r\n#   include <sys/auxv.h>\r\n#   include <asm/hwcap.h>\r\n#elif defined(__APPLE__)\r\n#   include <sys/sysctl.h>\r\n#endif\r\n\r\n#define SHA256_CPUID_INIT  (1 << 0)\r\n#define SHA256_CPUID_ARM64 (1 << 1)\r\n\r\nstatic inline int sha256_cpuid(void)\r\n{\r\n#if defined(__ARM_FEATURE_CRYPTO) || defined(__ARM_FEATURE_SHA2)\r\n    int result = SHA256_CPUID_ARM64;\r\n#else\r\n    static int cpuid;\r\n\r\n    int result = cpuid;\r\n    if (result == 0)\r\n    {\r\n#if defined(_WIN32)\r\n        int has_arm64 = IsProcessorFeaturePresent(PF_ARM_V8_CRYPTO_INSTRUCTIONS_AVAILABLE);\r\n#elif defined(__linux__)\r\n        unsigned long hwcap = getauxval(AT_HWCAP);\r\n        int has_arm64 = hwcap & HWCAP_SHA2;\r\n#elif defined(__APPLE__)\r\n        int value = 0;\r\n        size_t valuelen = sizeof(value);\r\n        int has_arm64 = sysctlbyname(\"hw.optional.arm.FEAT_SHA256\", &value, &valuelen, NULL, 0) == 0 && value != 0;\r\n#else\r\n#error unknown platform\r\n#endif\r\n        result |= SHA256_CPUID_INIT;\r\n        if (has_arm64)\r\n        {\r\n            result |= SHA256_CPUID_ARM64;\r\n        }\r\n\r\n        cpuid = result;\r\n    }\r\n#endif\r\n\r\n#if defined(SHA256_CPUID_MASK)\r\n    result &= SHA256_CPUID_MASK;\r\n#endif\r\n\r\n    return result;\r\n}\r\n\r\nSHA256_TARGET\r\nstatic void sha256_process_arm64(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n    // code here is similar to x64 shani implementation\r\n\r\n    #define W(i) w[(i)%4]\r\n\r\n    #define QROUND(i) do {                                                          \\\r\n        /* load 16 round constants */                                               \\\r\n        if ((i % 4) == 0) rk = vld1q_u32_x4(&SHA256_K[4*i]);                        \\\r\n        /* first 4 rounds reverse byte order in each 32-bit lane of input block */  \\\r\n        if (i <  4) W(i) = vreinterpretq_u32_u8(vrev32q_u8(msg.val[i]));            \\\r\n        /* update message schedule */                                               \\\r\n        if (i >= 4) W(i) = vsha256su0q_u32(W(i), W(i-3));                           \\\r\n        if (i >= 4) W(i) = vsha256su1q_u32(W(i), W(i-2), W(i-1));                   \\\r\n        /* add round constants */                                                   \\\r\n        uint32x4_t tmp = vaddq_u32(W(i), rk.val[i%4]);                              \\\r\n        /* 4 round functions */                                                     \\\r\n        uint32x4_t x = vstate.val[0];                                               \\\r\n        vstate.val[0] = vsha256hq_u32(vstate.val[0], vstate.val[1], tmp);           \\\r\n        vstate.val[1] = vsha256h2q_u32(vstate.val[1], x, tmp);                      \\\r\n    } while (0)\r\n\r\n    // load initial state\r\n    uint32x4x2_t vstate = vld1q_u32_x2(state);\r\n\r\n    do\r\n    {\r\n        // remember current state\r\n        uint32x4x2_t vlast = vstate;\r\n\r\n        // load 64-byte block\r\n        uint8x16x4_t msg = vld1q_u8_x4(block);\r\n\r\n        uint32x4x4_t rk;\r\n        uint32x4_t w[4];\r\n\r\n        QROUND( 0);\r\n        QROUND( 1);\r\n        QROUND( 2);\r\n        QROUND( 3);\r\n        QROUND( 4);\r\n        QROUND( 5);\r\n        QROUND( 6);\r\n        QROUND( 7);\r\n        QROUND( 8);\r\n        QROUND( 9);\r\n        QROUND(10);\r\n        QROUND(11);\r\n        QROUND(12);\r\n        QROUND(13);\r\n        QROUND(14);\r\n        QROUND(15);\r\n\r\n        // update next state\r\n        vstate.val[0] = vaddq_u32(vstate.val[0], vlast.val[0]);\r\n        vstate.val[1] = vaddq_u32(vstate.val[1], vlast.val[1]);\r\n\r\n        block += SHA256_BLOCK_SIZE;\r\n    }\r\n    while (--count);\r\n\r\n    // save the new state\r\n    vst1q_u32_x2(state, vstate);\r\n\r\n    #undef QROUND\r\n    #undef W\r\n}\r\n\r\n#endif // defined(__aarch64__) || defined(_M_ARM64)\r\n\r\nstatic void sha256_process(uint32_t* state, const uint8_t* block, size_t count)\r\n{\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n    int cpuid = sha256_cpuid();\r\n    if (cpuid & SHA256_CPUID_SHANI)\r\n    {\r\n        sha256_process_shani(state, block, count);\r\n        return;\r\n    }\r\n#endif\r\n\r\n#if defined(__aarch64__) || defined(_M_ARM64)\r\n    int cpuid = sha256_cpuid();\r\n    if (cpuid & SHA256_CPUID_ARM64)\r\n    {\r\n        sha256_process_arm64(state, block, count);\r\n        return;\r\n    }\r\n#endif\r\n\r\n    #define Ch(x,y,z)  ((x & (y ^ z)) ^ z)\r\n    #define Maj(x,y,z) ((x & y) | (z & (x | y)))\r\n\r\n    #define BSig0(x) (SHA256_ROR32(x,  2) ^ SHA256_ROR32(x, 13) ^ SHA256_ROR32(x, 22))\r\n    #define BSig1(x) (SHA256_ROR32(x,  6) ^ SHA256_ROR32(x, 11) ^ SHA256_ROR32(x, 25))\r\n    #define SSig0(x) (SHA256_ROR32(x,  7) ^ SHA256_ROR32(x, 18) ^ (x >> 3))\r\n    #define SSig1(x) (SHA256_ROR32(x, 17) ^ SHA256_ROR32(x, 19) ^ (x >> 10))\r\n\r\n    #define W(i) w[(i+16)%16]\r\n\r\n    #define ROUND(i,a,b,c,d,e,f,g,h) do                                             \\\r\n    {                                                                               \\\r\n        uint32_t w0;                                                                \\\r\n        if (i <  16) W(i) = w0 = SHA256_GET32BE(block + i*sizeof(uint32_t));        \\\r\n        if (i >= 16) W(i) = w0 = SSig1(W(i-2)) + W(i-7) + SSig0(W(i-15)) + W(i-16); \\\r\n                                                                                    \\\r\n        uint32_t t1 = h + BSig1(e) + Ch(e,f,g) + SHA256_K[i] + w0;                  \\\r\n        uint32_t t2 = BSig0(a) + Maj(a,b,c);                                        \\\r\n        d += t1;                                                                    \\\r\n        h = t1 + t2;                                                                \\\r\n    } while (0)\r\n\r\n    do\r\n    {\r\n        uint32_t a = state[0];\r\n        uint32_t b = state[1];\r\n        uint32_t c = state[2];\r\n        uint32_t d = state[3];\r\n        uint32_t e = state[4];\r\n        uint32_t f = state[5];\r\n        uint32_t g = state[6];\r\n        uint32_t h = state[7];\r\n\r\n        uint32_t w[16];\r\n\r\n        ROUND( 0, a, b, c, d, e, f, g, h);\r\n        ROUND( 1, h, a, b, c, d, e, f, g);\r\n        ROUND( 2, g, h, a, b, c, d, e, f);\r\n        ROUND( 3, f, g, h, a, b, c, d, e);\r\n        ROUND( 4, e, f, g, h, a, b, c, d);\r\n        ROUND( 5, d, e, f, g, h, a, b, c);\r\n        ROUND( 6, c, d, e, f, g, h, a, b);\r\n        ROUND( 7, b, c, d, e, f, g, h, a);\r\n        ROUND( 8, a, b, c, d, e, f, g, h);\r\n        ROUND( 9, h, a, b, c, d, e, f, g);\r\n        ROUND(10, g, h, a, b, c, d, e, f);\r\n        ROUND(11, f, g, h, a, b, c, d, e);\r\n        ROUND(12, e, f, g, h, a, b, c, d);\r\n        ROUND(13, d, e, f, g, h, a, b, c);\r\n        ROUND(14, c, d, e, f, g, h, a, b);\r\n        ROUND(15, b, c, d, e, f, g, h, a);\r\n        ROUND(16, a, b, c, d, e, f, g, h);\r\n        ROUND(17, h, a, b, c, d, e, f, g);\r\n        ROUND(18, g, h, a, b, c, d, e, f);\r\n        ROUND(19, f, g, h, a, b, c, d, e);\r\n        ROUND(20, e, f, g, h, a, b, c, d);\r\n        ROUND(21, d, e, f, g, h, a, b, c);\r\n        ROUND(22, c, d, e, f, g, h, a, b);\r\n        ROUND(23, b, c, d, e, f, g, h, a);\r\n        ROUND(24, a, b, c, d, e, f, g, h);\r\n        ROUND(25, h, a, b, c, d, e, f, g);\r\n        ROUND(26, g, h, a, b, c, d, e, f);\r\n        ROUND(27, f, g, h, a, b, c, d, e);\r\n        ROUND(28, e, f, g, h, a, b, c, d);\r\n        ROUND(29, d, e, f, g, h, a, b, c);\r\n        ROUND(30, c, d, e, f, g, h, a, b);\r\n        ROUND(31, b, c, d, e, f, g, h, a);\r\n        ROUND(32, a, b, c, d, e, f, g, h);\r\n        ROUND(33, h, a, b, c, d, e, f, g);\r\n        ROUND(34, g, h, a, b, c, d, e, f);\r\n        ROUND(35, f, g, h, a, b, c, d, e);\r\n        ROUND(36, e, f, g, h, a, b, c, d);\r\n        ROUND(37, d, e, f, g, h, a, b, c);\r\n        ROUND(38, c, d, e, f, g, h, a, b);\r\n        ROUND(39, b, c, d, e, f, g, h, a);\r\n        ROUND(40, a, b, c, d, e, f, g, h);\r\n        ROUND(41, h, a, b, c, d, e, f, g);\r\n        ROUND(42, g, h, a, b, c, d, e, f);\r\n        ROUND(43, f, g, h, a, b, c, d, e);\r\n        ROUND(44, e, f, g, h, a, b, c, d);\r\n        ROUND(45, d, e, f, g, h, a, b, c);\r\n        ROUND(46, c, d, e, f, g, h, a, b);\r\n        ROUND(47, b, c, d, e, f, g, h, a);\r\n        ROUND(48, a, b, c, d, e, f, g, h);\r\n        ROUND(49, h, a, b, c, d, e, f, g);\r\n        ROUND(50, g, h, a, b, c, d, e, f);\r\n        ROUND(51, f, g, h, a, b, c, d, e);\r\n        ROUND(52, e, f, g, h, a, b, c, d);\r\n        ROUND(53, d, e, f, g, h, a, b, c);\r\n        ROUND(54, c, d, e, f, g, h, a, b);\r\n        ROUND(55, b, c, d, e, f, g, h, a);\r\n        ROUND(56, a, b, c, d, e, f, g, h);\r\n        ROUND(57, h, a, b, c, d, e, f, g);\r\n        ROUND(58, g, h, a, b, c, d, e, f);\r\n        ROUND(59, f, g, h, a, b, c, d, e);\r\n        ROUND(60, e, f, g, h, a, b, c, d);\r\n        ROUND(61, d, e, f, g, h, a, b, c);\r\n        ROUND(62, c, d, e, f, g, h, a, b);\r\n        ROUND(63, b, c, d, e, f, g, h, a);\r\n\r\n        state[0] += a;\r\n        state[1] += b;\r\n        state[2] += c;\r\n        state[3] += d;\r\n        state[4] += e;\r\n        state[5] += f;\r\n        state[6] += g;\r\n        state[7] += h;\r\n\r\n        block += SHA256_BLOCK_SIZE;\r\n    }\r\n    while (--count);\r\n\r\n    #undef ROUND\r\n    #undef W\r\n    #undef Ch\r\n    #undef Maj\r\n    #undef BSig0\r\n    #undef BSig1\r\n    #undef SSig0\r\n    #undef SSig1\r\n}\r\n\r\nvoid sha256_init(sha256_ctx* ctx)\r\n{\r\n    ctx->count = 0;\r\n    ctx->state[0] = 0x6a09e667;\r\n    ctx->state[1] = 0xbb67ae85;\r\n    ctx->state[2] = 0x3c6ef372;\r\n    ctx->state[3] = 0xa54ff53a;\r\n    ctx->state[4] = 0x510e527f;\r\n    ctx->state[5] = 0x9b05688c;\r\n    ctx->state[6] = 0x1f83d9ab;\r\n    ctx->state[7] = 0x5be0cd19;\r\n}\r\n\r\nvoid sha256_update(sha256_ctx* ctx, const void* data, size_t size)\r\n{\r\n    const uint8_t* buffer = (const uint8_t*)data;\r\n\r\n    size_t pending = ctx->count % SHA256_BLOCK_SIZE;\r\n    ctx->count += size;\r\n\r\n    size_t available = SHA256_BLOCK_SIZE - pending;\r\n    if (pending && size >= available)\r\n    {\r\n        memcpy(ctx->buffer + pending, buffer, available);\r\n        sha256_process(ctx->state, ctx->buffer, 1);\r\n        buffer += available;\r\n        size -= available;\r\n        pending = 0;\r\n    }\r\n\r\n    size_t count = size / SHA256_BLOCK_SIZE;\r\n    if (count)\r\n    {\r\n        sha256_process(ctx->state, buffer, count);\r\n        buffer += count * SHA256_BLOCK_SIZE;\r\n        size -= count * SHA256_BLOCK_SIZE;\r\n    }\r\n\r\n    memcpy(ctx->buffer + pending, buffer, size);\r\n}\r\n\r\nvoid sha256_finish(sha256_ctx* ctx, uint8_t digest[SHA256_DIGEST_SIZE])\r\n{\r\n    uint64_t count = ctx->count;\r\n    uint64_t bitcount = count * 8;\r\n\r\n    size_t pending = count % SHA256_BLOCK_SIZE;\r\n    size_t blocks = pending < SHA256_BLOCK_SIZE - sizeof(bitcount) ? 1 : 2;\r\n\r\n    ctx->buffer[pending++] = 0x80;\r\n\r\n    uint8_t padding[2 * SHA256_BLOCK_SIZE];\r\n    memcpy(padding, ctx->buffer, SHA256_BLOCK_SIZE);\r\n    memset(padding + pending, 0, SHA256_BLOCK_SIZE);\r\n    SHA256_SET64BE(padding + blocks * SHA256_BLOCK_SIZE - sizeof(bitcount), bitcount);\r\n\r\n    sha256_process(ctx->state, padding, blocks);\r\n\r\n    for (size_t i=0; i<8; i++)\r\n    {\r\n        SHA256_SET32BE(digest + i*sizeof(uint32_t), ctx->state[i]);\r\n    }\r\n}\r\n\r\nvoid sha224_init(sha224_ctx* ctx)\r\n{\r\n    ctx->count = 0;\r\n    ctx->state[0] = 0xc1059ed8;\r\n    ctx->state[1] = 0x367cd507;\r\n    ctx->state[2] = 0x3070dd17;\r\n    ctx->state[3] = 0xf70e5939;\r\n    ctx->state[4] = 0xffc00b31;\r\n    ctx->state[5] = 0x68581511;\r\n    ctx->state[6] = 0x64f98fa7;\r\n    ctx->state[7] = 0xbefa4fa4;\r\n}\r\n\r\nvoid sha224_update(sha224_ctx* ctx, const void* data, size_t size)\r\n{\r\n    sha256_update(ctx, data, size);\r\n}\r\n\r\nvoid sha224_finish(sha224_ctx* ctx, uint8_t digest[SHA224_DIGEST_SIZE])\r\n{\r\n    uint8_t temp[SHA256_DIGEST_SIZE];\r\n    sha256_finish(ctx, temp);\r\n\r\n    memcpy(digest, temp, SHA224_DIGEST_SIZE);\r\n}\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic pop\r\n#elif defined(_MSC_VER)\r\n#   pragma warning (pop)\r\n#endif\r\n"
  },
  {
    "path": "src/third_party/martins_hash/sha512.h",
    "content": "#pragma once\r\n\r\n// https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf\r\n// https://www.rfc-editor.org/rfc/rfc6234\r\n\r\n#include <stddef.h>\r\n#include <stdint.h>\r\n\r\n//\r\n// interface\r\n//\r\n\r\n#define SHA384_DIGEST_SIZE  48\r\n#define SHA512_DIGEST_SIZE  64\r\n#define SHA512_BLOCK_SIZE   128\r\n\r\ntypedef struct {\r\n  uint8_t buffer[SHA512_BLOCK_SIZE];\r\n  uint64_t count[2];\r\n  uint64_t state[8];\r\n} sha512_ctx;\r\n\r\ntypedef sha512_ctx sha384_ctx;\r\n\r\nstatic inline void sha512_init(sha512_ctx* ctx);\r\nstatic inline void sha512_update(sha512_ctx* ctx, const void* data, size_t size);\r\nstatic inline void sha512_finish(sha512_ctx* ctx, uint8_t digest[SHA512_DIGEST_SIZE]);\r\n\r\nstatic inline void sha384_init(sha384_ctx* ctx);\r\nstatic inline void sha384_update(sha384_ctx* ctx, const void* data, size_t size);\r\nstatic inline void sha384_finish(sha384_ctx* ctx, uint8_t digest[SHA384_DIGEST_SIZE]);\r\n\r\n//\r\n// implementation\r\n//\r\n\r\n#include <string.h> // memcpy, memset\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic push\r\n#   pragma clang diagnostic ignored \"-Wcast-align\"\r\n#   pragma clang diagnostic ignored \"-Wunsafe-buffer-usage\"\r\n#   pragma clang diagnostic ignored \"-Wlanguage-extension-token\"\r\n#   pragma clang diagnostic ignored \"-Wdeclaration-after-statement\"\r\n#elif defined(_MSC_VER)\r\n#   pragma warning (push)\r\n#   pragma warning (disable : 4127)\r\n#endif\r\n\r\n#if defined(__clang__)\r\n#   define SHA512_ROR64(x,n) __builtin_rotateright64(x, n)\r\n#elif defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define SHA512_ROR64(x,n) _rotr64(x, n)\r\n#else\r\n#   define SHA512_ROR64(x,n) ( ((x) >> (n)) | ((x) << (64-(n))) )\r\n#endif\r\n\r\n#if defined(_MSC_VER)\r\n#   include <stdlib.h>\r\n#   define SHA512_GET64BE(ptr) _byteswap_uint64( *((const __unaligned uint64_t*)(ptr)) )\r\n#   define SHA512_SET64BE(ptr,x) *((__unaligned uint64_t*)(ptr)) = _byteswap_uint64(x)\r\n#else\r\n#   define SHA512_GET64BE(ptr)              \\\r\n(                                       \\\r\n((uint64_t)((ptr)[0]) << 56) |      \\\r\n((uint64_t)((ptr)[1]) << 48) |      \\\r\n((uint64_t)((ptr)[2]) << 40) |      \\\r\n((uint64_t)((ptr)[3]) << 32) |      \\\r\n((uint64_t)((ptr)[4]) << 24) |      \\\r\n((uint64_t)((ptr)[5]) << 16) |      \\\r\n((uint64_t)((ptr)[6]) <<  8) |      \\\r\n((uint64_t)((ptr)[7]) <<  0)        \\\r\n)\r\n#   define SHA512_SET64BE(ptr, x) do        \\\r\n{                                       \\\r\n(ptr)[0] = (uint8_t)((x) >> 56);    \\\r\n(ptr)[1] = (uint8_t)((x) >> 48);    \\\r\n(ptr)[2] = (uint8_t)((x) >> 40);    \\\r\n(ptr)[3] = (uint8_t)((x) >> 32);    \\\r\n(ptr)[4] = (uint8_t)((x) >> 24);    \\\r\n(ptr)[5] = (uint8_t)((x) >> 16);    \\\r\n(ptr)[6] = (uint8_t)((x) >>  8);    \\\r\n(ptr)[7] = (uint8_t)((x) >>  0);    \\\r\n}                                       \\\r\nwhile (0)\r\n#endif\r\n\r\nstatic const uint64_t SHA512_K[80] =\r\n{\r\n  0x428a2f98d728ae22, 0x7137449123ef65cd, 0xb5c0fbcfec4d3b2f, 0xe9b5dba58189dbbc,\r\n  0x3956c25bf348b538, 0x59f111f1b605d019, 0x923f82a4af194f9b, 0xab1c5ed5da6d8118,\r\n  0xd807aa98a3030242, 0x12835b0145706fbe, 0x243185be4ee4b28c, 0x550c7dc3d5ffb4e2,\r\n  0x72be5d74f27b896f, 0x80deb1fe3b1696b1, 0x9bdc06a725c71235, 0xc19bf174cf692694,\r\n  0xe49b69c19ef14ad2, 0xefbe4786384f25e3, 0x0fc19dc68b8cd5b5, 0x240ca1cc77ac9c65,\r\n  0x2de92c6f592b0275, 0x4a7484aa6ea6e483, 0x5cb0a9dcbd41fbd4, 0x76f988da831153b5,\r\n  0x983e5152ee66dfab, 0xa831c66d2db43210, 0xb00327c898fb213f, 0xbf597fc7beef0ee4,\r\n  0xc6e00bf33da88fc2, 0xd5a79147930aa725, 0x06ca6351e003826f, 0x142929670a0e6e70,\r\n  0x27b70a8546d22ffc, 0x2e1b21385c26c926, 0x4d2c6dfc5ac42aed, 0x53380d139d95b3df,\r\n  0x650a73548baf63de, 0x766a0abb3c77b2a8, 0x81c2c92e47edaee6, 0x92722c851482353b,\r\n  0xa2bfe8a14cf10364, 0xa81a664bbc423001, 0xc24b8b70d0f89791, 0xc76c51a30654be30,\r\n  0xd192e819d6ef5218, 0xd69906245565a910, 0xf40e35855771202a, 0x106aa07032bbd1b8,\r\n  0x19a4c116b8d2d0c8, 0x1e376c085141ab53, 0x2748774cdf8eeb99, 0x34b0bcb5e19b48a8,\r\n  0x391c0cb3c5c95a63, 0x4ed8aa4ae3418acb, 0x5b9cca4f7763e373, 0x682e6ff3d6b2b8a3,\r\n  0x748f82ee5defb2fc, 0x78a5636f43172f60, 0x84c87814a1f0ab72, 0x8cc702081a6439ec,\r\n  0x90befffa23631e28, 0xa4506cebde82bde9, 0xbef9a3f7b2c67915, 0xc67178f2e372532b,\r\n  0xca273eceea26619c, 0xd186b8c721c0c207, 0xeada7dd6cde0eb1e, 0xf57d4f7fee6ed178,\r\n  0x06f067aa72176fba, 0x0a637dc5a2c898a6, 0x113f9804bef90dae, 0x1b710b35131c471b,\r\n  0x28db77f523047d84, 0x32caab7b40c72493, 0x3c9ebe0a15c9bebc, 0x431d67c49c100d4c,\r\n  0x4cc5d4becb3e42b6, 0x597f299cfc657e2a, 0x5fcb6fab3ad6faec, 0x6c44198c4a475817,\r\n};\r\n\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n#include <immintrin.h> // AVX2 + SHA512\r\n\r\n#if defined(__clang__) || defined(__GNUC__)\r\n#   include <cpuid.h>\r\n#   define SHA512_TARGET(str)          __attribute__((target(str)))\r\n#   define SHA512_CPUID(x, info)       __cpuid(x, info[0], info[1], info[2], info[3])\r\n#   define SHA512_CPUID_EX(x, y, info) __cpuid_count(x, y, info[0], info[1], info[2], info[3])\r\n#   define SHA512_XGETBV(x)            __builtin_ia32_xgetbv(x)\r\n#else\r\n#   include <intrin.h>\r\n#   define SHA512_TARGET(str)\r\n#   define SHA512_CPUID(x, info)       __cpuid(info, x)\r\n#   define SHA512_CPUID_EX(x, y, info) __cpuidex(info, x, y)\r\n#   define SHA512_XGETBV(x)            _xgetbv(x)\r\n#endif\r\n\r\n#define SHA512_CPUID_INIT    (1 << 0)\r\n#define SHA512_CPUID_VSHA512 (1 << 1)\r\n\r\nSHA512_TARGET(\"xsave\")\r\nstatic inline int sha512_cpuid(void)\r\n{\r\n  static int cpuid;\r\n  \r\n  int result = cpuid;\r\n  if (result == 0)\r\n  {\r\n    int info[4];\r\n    \r\n    SHA512_CPUID(1, info);\r\n    int has_xsave = info[2] & (1 << 26);\r\n    \r\n    int has_ymm = 0;\r\n    if (has_xsave)\r\n    {\r\n      uint64_t xcr0 = SHA512_XGETBV(0);\r\n      has_ymm = xcr0 & (1 << 2);\r\n    }\r\n    \r\n    SHA512_CPUID_EX(7, 0, info);\r\n    int has_avx2 = info[1] & (1 << 5);\r\n    \r\n    SHA512_CPUID_EX(7, 1, info);\r\n    int has_sha512 = info[0] & (1 << 0);\r\n    \r\n    result |= SHA512_CPUID_INIT;\r\n    if (has_ymm && has_avx2 && has_sha512)\r\n    {\r\n      result |= SHA512_CPUID_VSHA512;\r\n    }\r\n    \r\n    cpuid = result;\r\n  }\r\n  \r\n#if defined(SHA512_CPUID_MASK)\r\n  result &= SHA512_CPUID_MASK;\r\n#endif\r\n  \r\n  return result;\r\n}\r\n\r\nSHA512_TARGET(\"avx2,sha512\")\r\nstatic void sha512_process_vsha512(uint64_t* state, const uint8_t* block, size_t count)\r\n{\r\n  // pretty much same way how sha256 works, only with avx2 registers and 64-bit additions\r\n  // state is kept as two 256-bit ymm registers (8 qwords)\r\n  \r\n  // message qwords are loaded as 64-bit big-endian values\r\n  \r\n#define W(i) w[(i)%4]\r\n  \r\n  // 4 wide round calculations\r\n#define QROUND(i) do {                                                                                                                                                          \\\r\n/* first 4 rounds load input block */                                                                                                                                       \\\r\nif (i < 4) W(i) = _mm256_shuffle_epi8(_mm256_loadu_si256(&buffer[i]), bswap);                                                                                               \\\r\n/* update message schedule */                                                                                                                                               \\\r\nif (i > 2 && i < 19) W(i-3) = _mm256_sha512msg2_epi64(_mm256_add_epi64(W(i-3), _mm256_permute4x64_epi64(_mm256_blend_epi32(W(i-1), W(i), 3), _MM_SHUFFLE(0,3,2,1))), W(i)); \\\r\nif (i > 0 && i < 17) W(i-1) = _mm256_sha512msg1_epi64(W(i-1), _mm256_castsi256_si128(W(i)));                                                                                \\\r\n/* add round constants */                                                                                                                                                   \\\r\n__m256i tmp = _mm256_add_epi64(W(i), _mm256_loadu_si256((const __m256i*)&SHA512_K[4*i]));                                                                                   \\\r\n/* round functions */                                                                                                                                                       \\\r\nstate1 = _mm256_sha512rnds2_epi64(state1, state0, _mm256_castsi256_si128(tmp));                                                                                             \\\r\nstate0 = _mm256_sha512rnds2_epi64(state0, state1, _mm256_extracti128_si256(tmp, 1));                                                                                        \\\r\n} while(0)\r\n  \r\n  const __m256i* buffer = (const __m256i*)block;\r\n  \r\n  // to byteswap when doing big-ending load for message qwords\r\n  const __m256i bswap = _mm256_broadcastsi128_si256(_mm_setr_epi8(7,6,5,4,3,2,1,0, 15,14,13,12,11,10,9,8));\r\n  \r\n  // load initial state \r\n  __m256i abcd = _mm256_permute4x64_epi64(_mm256_loadu_si256((const __m256i*)&state[0]), _MM_SHUFFLE(0,1,2,3)); // [a,b,c,d]\r\n  __m256i efgh = _mm256_permute4x64_epi64(_mm256_loadu_si256((const __m256i*)&state[4]), _MM_SHUFFLE(0,1,2,3)); // [e,f,g,h]\r\n  \r\n  // qword order for vsha512rnds2 instruction\r\n  __m256i state0 = _mm256_permute2x128_si256(efgh, abcd, (3 << 4) | 1); // [a,b,e,f]\r\n  __m256i state1 = _mm256_permute2x128_si256(efgh, abcd, (2 << 4) | 0); // [c,d,g,h]\r\n  \r\n  do\r\n  {\r\n    // remember current state\r\n    __m256i last0 = state0;\r\n    __m256i last1 = state1;\r\n    \r\n    __m256i w[4];\r\n    \r\n    QROUND(0);\r\n    QROUND(1);\r\n    QROUND(2);\r\n    QROUND(3);\r\n    QROUND(4);\r\n    QROUND(5);\r\n    QROUND(6);\r\n    QROUND(7);\r\n    QROUND(8);\r\n    QROUND(9);\r\n    QROUND(10);\r\n    QROUND(11);\r\n    QROUND(12);\r\n    QROUND(13);\r\n    QROUND(14);\r\n    QROUND(15);\r\n    QROUND(16);\r\n    QROUND(17);\r\n    QROUND(18);\r\n    QROUND(19);\r\n    \r\n    // update next state\r\n    state0 = _mm256_add_epi64(state0, last0);\r\n    state1 = _mm256_add_epi64(state1, last1);\r\n    \r\n    buffer += 4;\r\n  }\r\n  while (--count);\r\n  \r\n  // restore qword order\r\n  abcd = _mm256_permute2x128_si256(state1, state0, (3 << 4) | 1);\r\n  efgh = _mm256_permute2x128_si256(state1, state0, (2 << 4) | 0);\r\n  \r\n  // save the new state\r\n  _mm256_storeu_si256((__m256i*)&state[0], _mm256_permute4x64_epi64(abcd, _MM_SHUFFLE(0,1,2,3)));\r\n  _mm256_storeu_si256((__m256i*)&state[4], _mm256_permute4x64_epi64(efgh, _MM_SHUFFLE(0,1,2,3)));\r\n  \r\n#undef QROUND\r\n#undef W\r\n}\r\n\r\n#endif // defined(__x86_64__) || defined(_M_AMD64)\r\n\r\n#if defined(__aarch64__) || defined(_M_ARM64)\r\n\r\n#if defined(__clang__)\r\n#   define SHA512_TARGET __attribute__((target(\"sha3\")))\r\n#elif defined(__GNUC__)\r\n#   define SHA512_TARGET __attribute__((target(\"+sha3\")))\r\n#elif defined(_MSC_VER)\r\n#   define SHA512_TARGET\r\n#endif\r\n\r\n#include <arm_neon.h>\r\n\r\n#if defined(_WIN32)\r\n#   include <windows.h>\r\n#   pragma comment (lib, \"advapi32\")\r\n#elif defined(__linux__)\r\n#   include <sys/auxv.h>\r\n#   include <asm/hwcap.h>\r\n#elif defined(__APPLE__)\r\n#   include <sys/sysctl.h>\r\n#endif\r\n\r\n#define SHA512_CPUID_INIT  (1 << 0)\r\n#define SHA512_CPUID_ARM64 (1 << 1)\r\n\r\n#if defined(_WIN32)\r\n\r\n#endif\r\n\r\nstatic inline int sha512_cpuid(void)\r\n{\r\n#if defined(__ARM_FEATURE_SHA512)\r\n  int result = SHA512_CPUID_ARM64;\r\n#else\r\n  static int cpuid;\r\n  \r\n  int result = cpuid;\r\n  if (result == 0)\r\n  {\r\n#if defined(_WIN32)\r\n    // no sha512 bit in IsProcessorFeaturePresent function :(\r\n    uint64_t bits;\r\n    DWORD bitsize = sizeof(bits);\r\n    RegGetValueA(HKEY_LOCAL_MACHINE, \"HARDWARE\\\\DESCRIPTION\\\\System\\\\CentralProcessor\\\\0\", \"CP 4030\", RRF_RT_QWORD | RRF_ZEROONFAILURE, NULL, &bits, &bitsize);\r\n    // bits from ID_AA64ISAR0_EL1\r\n    int has_arm64 = ((bits >> 12) & 0xf) == 0x2;\r\n#elif defined(__linux__)\r\n    unsigned long hwcap = getauxval(AT_HWCAP);\r\n    int has_arm64 = hwcap & HWCAP_SHA512;\r\n#elif defined(__APPLE__)\r\n    int value = 0;\r\n    size_t valuelen = sizeof(value);\r\n    int has_arm64 = sysctlbyname(\"hw.optional.arm.FEAT_SHA512\", &value, &valuelen, NULL, 0) == 0 && value != 0;\r\n#else\r\n#error unknown platform\r\n#endif\r\n    result |= SHA512_CPUID_INIT;\r\n    if (has_arm64)\r\n    {\r\n      result |= SHA512_CPUID_ARM64;\r\n    }\r\n    \r\n    cpuid = result;\r\n  }\r\n#endif\r\n  \r\n#if defined(SHA512_CPUID_MASK)\r\n  result &= SHA512_CPUID_MASK;\r\n#endif\r\n  \r\n  return result;\r\n}\r\n\r\nSHA512_TARGET\r\nstatic void sha512_process_arm64(uint64_t* state, const uint8_t* block, size_t count)\r\n{\r\n#define W(i) w[(i)%8]\r\n#define S(i) vstate.val[3-(i)%4]\r\n  \r\n#define DROUND(i) do {                                                                                          \\\r\n/* load 8 round constants */                                                                                \\\r\nif ((i % 4) == 0) rk = vld1q_u64_x4(&SHA512_K[2*i]);                                                        \\\r\n/* first 8 rounds reverse byte order in each 64-bit lane of input block */                                  \\\r\nif (i <  8) W(i) = vreinterpretq_u64_u8(vrev64q_u8(msg[(i/4)%2].val[i%4]));                                 \\\r\n/* update message schedule for next rounds */                                                               \\\r\nif (i >= 8) W(i) = vsha512su1q_u64(vsha512su0q_u64(W(i), W(i-7)), W(i-1), vextq_u64(W(i-4), W(i-3), 1));    \\\r\n/* add round constants */                                                                                   \\\r\nuint64x2_t tmp = vaddq_u64(W(i), rk.val[i%4]);                                                              \\\r\n/* 2 round functions */                                                                                     \\\r\nuint64x2_t x0 = vaddq_u64(vextq_u64(tmp, tmp, 1), S(i+0));                                                  \\\r\nuint64x2_t x1 = vsha512hq_u64(x0, vextq_u64(S(i+1), S(i+0), 1), vextq_u64(S(i+2), S(i+1), 1));              \\\r\nS(i+0) = vsha512h2q_u64(x1, S(i+2), S(i+3));                                                                \\\r\nS(i+2) = vaddq_u64(S(i+2), x1);                                                                             \\\r\n} while (0)\r\n  \r\n  // load initial state\r\n  uint64x2x4_t vstate = vld1q_u64_x4(state);\r\n  \r\n  do\r\n  {\r\n    // remember current state\r\n    uint64x2x4_t vlast = vstate;\r\n    \r\n    // load 128-byte block\r\n    uint8x16x4_t msg[2] =\r\n    {\r\n      vld1q_u8_x4(block + 0 * 16),\r\n      vld1q_u8_x4(block + 4 * 16),\r\n    };\r\n    \r\n    uint64x2x4_t rk;\r\n    uint64x2_t w[8];\r\n    \r\n    DROUND( 0);\r\n    DROUND( 1);\r\n    DROUND( 2);\r\n    DROUND( 3);\r\n    \r\n    DROUND( 4);\r\n    DROUND( 5);\r\n    DROUND( 6);\r\n    DROUND( 7);\r\n    \r\n    DROUND( 8);\r\n    DROUND( 9);\r\n    DROUND(10);\r\n    DROUND(11);\r\n    \r\n    DROUND(12);\r\n    DROUND(13);\r\n    DROUND(14);\r\n    DROUND(15);\r\n    \r\n    DROUND(16);\r\n    DROUND(17);\r\n    DROUND(18);\r\n    DROUND(19);\r\n    \r\n    DROUND(20);\r\n    DROUND(21);\r\n    DROUND(22);\r\n    DROUND(23);\r\n    \r\n    DROUND(24);\r\n    DROUND(25);\r\n    DROUND(26);\r\n    DROUND(27);\r\n    \r\n    DROUND(28);\r\n    DROUND(29);\r\n    DROUND(30);\r\n    DROUND(31);\r\n    \r\n    DROUND(32);\r\n    DROUND(33);\r\n    DROUND(34);\r\n    DROUND(35);\r\n    \r\n    DROUND(36);\r\n    DROUND(37);\r\n    DROUND(38);\r\n    DROUND(39);\r\n    \r\n    // update next state\r\n    vstate.val[0] = vaddq_u64(vstate.val[0], vlast.val[0]);\r\n    vstate.val[1] = vaddq_u64(vstate.val[1], vlast.val[1]);\r\n    vstate.val[2] = vaddq_u64(vstate.val[2], vlast.val[2]);\r\n    vstate.val[3] = vaddq_u64(vstate.val[3], vlast.val[3]);\r\n    \r\n    block += SHA512_BLOCK_SIZE;\r\n  }\r\n  while (--count);\r\n  \r\n  // save the new state\r\n  vst1q_u64_x4(state, vstate);\r\n  \r\n#undef DROUND\r\n#undef S\r\n#undef W\r\n}\r\n\r\n#endif // defined(__aarch64__) || defined(_M_ARM64)\r\n\r\nstatic void sha512_process(uint64_t* state, const uint8_t* block, size_t count)\r\n{\r\n#if defined(__x86_64__) || defined(_M_AMD64)\r\n  int cpuid = sha512_cpuid();\r\n  if (cpuid & SHA512_CPUID_VSHA512)\r\n  {\r\n    sha512_process_vsha512(state, block, count);\r\n    return;\r\n  }\r\n#endif\r\n  \r\n#if defined(__aarch64__) || defined(_M_ARM64)\r\n  int cpuid = sha512_cpuid();\r\n  if (cpuid & SHA512_CPUID_ARM64)\r\n  {\r\n    sha512_process_arm64(state, block, count);\r\n    return;\r\n  }\r\n#endif\r\n  \r\n#define Ch(x,y,z)  ((x & (y ^ z)) ^ z)\r\n#define Maj(x,y,z) ((x & y) | (z & (x | y)))\r\n  \r\n#define BSig0(x) (SHA512_ROR64(x, 28) ^ SHA512_ROR64(x, 34) ^ SHA512_ROR64(x, 39))\r\n#define BSig1(x) (SHA512_ROR64(x, 14) ^ SHA512_ROR64(x, 18) ^ SHA512_ROR64(x, 41))\r\n#define SSig0(x) (SHA512_ROR64(x,  1) ^ SHA512_ROR64(x,  8) ^ (x >> 7))\r\n#define SSig1(x) (SHA512_ROR64(x, 19) ^ SHA512_ROR64(x, 61) ^ (x >> 6))\r\n  \r\n#define W(i) w[(i+16)%16]\r\n  \r\n#define ROUND(i,a,b,c,d,e,f,g,h) do                                             \\\r\n{                                                                               \\\r\nuint64_t w0;                                                                \\\r\nif (i <  16) W(i) = w0 = SHA512_GET64BE(block + i*sizeof(uint64_t));        \\\r\nif (i >= 16) W(i) = w0 = SSig1(W(i-2)) + W(i-7) + SSig0(W(i-15)) + W(i-16); \\\r\n  \\\r\nuint64_t t1 = h + BSig1(e) + Ch(e,f,g) + SHA512_K[i] + w0;                  \\\r\nuint64_t t2 = BSig0(a) + Maj(a,b,c);                                        \\\r\nd += t1;                                                                    \\\r\nh = t1 + t2;                                                                \\\r\n} while (0)\r\n  \r\n  do\r\n  {\r\n    uint64_t a = state[0];\r\n    uint64_t b = state[1];\r\n    uint64_t c = state[2];\r\n    uint64_t d = state[3];\r\n    uint64_t e = state[4];\r\n    uint64_t f = state[5];\r\n    uint64_t g = state[6];\r\n    uint64_t h = state[7];\r\n    \r\n    uint64_t w[16];\r\n    \r\n    ROUND( 0, a, b, c, d, e, f, g, h);\r\n    ROUND( 1, h, a, b, c, d, e, f, g);\r\n    ROUND( 2, g, h, a, b, c, d, e, f);\r\n    ROUND( 3, f, g, h, a, b, c, d, e);\r\n    ROUND( 4, e, f, g, h, a, b, c, d);\r\n    ROUND( 5, d, e, f, g, h, a, b, c);\r\n    ROUND( 6, c, d, e, f, g, h, a, b);\r\n    ROUND( 7, b, c, d, e, f, g, h, a);\r\n    ROUND( 8, a, b, c, d, e, f, g, h);\r\n    ROUND( 9, h, a, b, c, d, e, f, g);\r\n    ROUND(10, g, h, a, b, c, d, e, f);\r\n    ROUND(11, f, g, h, a, b, c, d, e);\r\n    ROUND(12, e, f, g, h, a, b, c, d);\r\n    ROUND(13, d, e, f, g, h, a, b, c);\r\n    ROUND(14, c, d, e, f, g, h, a, b);\r\n    ROUND(15, b, c, d, e, f, g, h, a);\r\n    ROUND(16, a, b, c, d, e, f, g, h);\r\n    ROUND(17, h, a, b, c, d, e, f, g);\r\n    ROUND(18, g, h, a, b, c, d, e, f);\r\n    ROUND(19, f, g, h, a, b, c, d, e);\r\n    ROUND(20, e, f, g, h, a, b, c, d);\r\n    ROUND(21, d, e, f, g, h, a, b, c);\r\n    ROUND(22, c, d, e, f, g, h, a, b);\r\n    ROUND(23, b, c, d, e, f, g, h, a);\r\n    ROUND(24, a, b, c, d, e, f, g, h);\r\n    ROUND(25, h, a, b, c, d, e, f, g);\r\n    ROUND(26, g, h, a, b, c, d, e, f);\r\n    ROUND(27, f, g, h, a, b, c, d, e);\r\n    ROUND(28, e, f, g, h, a, b, c, d);\r\n    ROUND(29, d, e, f, g, h, a, b, c);\r\n    ROUND(30, c, d, e, f, g, h, a, b);\r\n    ROUND(31, b, c, d, e, f, g, h, a);\r\n    ROUND(32, a, b, c, d, e, f, g, h);\r\n    ROUND(33, h, a, b, c, d, e, f, g);\r\n    ROUND(34, g, h, a, b, c, d, e, f);\r\n    ROUND(35, f, g, h, a, b, c, d, e);\r\n    ROUND(36, e, f, g, h, a, b, c, d);\r\n    ROUND(37, d, e, f, g, h, a, b, c);\r\n    ROUND(38, c, d, e, f, g, h, a, b);\r\n    ROUND(39, b, c, d, e, f, g, h, a);\r\n    ROUND(40, a, b, c, d, e, f, g, h);\r\n    ROUND(41, h, a, b, c, d, e, f, g);\r\n    ROUND(42, g, h, a, b, c, d, e, f);\r\n    ROUND(43, f, g, h, a, b, c, d, e);\r\n    ROUND(44, e, f, g, h, a, b, c, d);\r\n    ROUND(45, d, e, f, g, h, a, b, c);\r\n    ROUND(46, c, d, e, f, g, h, a, b);\r\n    ROUND(47, b, c, d, e, f, g, h, a);\r\n    ROUND(48, a, b, c, d, e, f, g, h);\r\n    ROUND(49, h, a, b, c, d, e, f, g);\r\n    ROUND(50, g, h, a, b, c, d, e, f);\r\n    ROUND(51, f, g, h, a, b, c, d, e);\r\n    ROUND(52, e, f, g, h, a, b, c, d);\r\n    ROUND(53, d, e, f, g, h, a, b, c);\r\n    ROUND(54, c, d, e, f, g, h, a, b);\r\n    ROUND(55, b, c, d, e, f, g, h, a);\r\n    ROUND(56, a, b, c, d, e, f, g, h);\r\n    ROUND(57, h, a, b, c, d, e, f, g);\r\n    ROUND(58, g, h, a, b, c, d, e, f);\r\n    ROUND(59, f, g, h, a, b, c, d, e);\r\n    ROUND(60, e, f, g, h, a, b, c, d);\r\n    ROUND(61, d, e, f, g, h, a, b, c);\r\n    ROUND(62, c, d, e, f, g, h, a, b);\r\n    ROUND(63, b, c, d, e, f, g, h, a);\r\n    ROUND(64, a, b, c, d, e, f, g, h);\r\n    ROUND(65, h, a, b, c, d, e, f, g);\r\n    ROUND(66, g, h, a, b, c, d, e, f);\r\n    ROUND(67, f, g, h, a, b, c, d, e);\r\n    ROUND(68, e, f, g, h, a, b, c, d);\r\n    ROUND(69, d, e, f, g, h, a, b, c);\r\n    ROUND(70, c, d, e, f, g, h, a, b);\r\n    ROUND(71, b, c, d, e, f, g, h, a);\r\n    ROUND(72, a, b, c, d, e, f, g, h);\r\n    ROUND(73, h, a, b, c, d, e, f, g);\r\n    ROUND(74, g, h, a, b, c, d, e, f);\r\n    ROUND(75, f, g, h, a, b, c, d, e);\r\n    ROUND(76, e, f, g, h, a, b, c, d);\r\n    ROUND(77, d, e, f, g, h, a, b, c);\r\n    ROUND(78, c, d, e, f, g, h, a, b);\r\n    ROUND(79, b, c, d, e, f, g, h, a);\r\n    \r\n    state[0] += a;\r\n    state[1] += b;\r\n    state[2] += c;\r\n    state[3] += d;\r\n    state[4] += e;\r\n    state[5] += f;\r\n    state[6] += g;\r\n    state[7] += h;\r\n    \r\n    block += SHA512_BLOCK_SIZE;\r\n  }\r\n  while (--count);\r\n  \r\n#undef ROUND\r\n#undef W\r\n#undef Ch\r\n#undef Maj\r\n#undef BSig0\r\n#undef BSig1\r\n#undef SSig0\r\n#undef SSig1\r\n}\r\n\r\nvoid sha512_init(sha512_ctx* ctx)\r\n{\r\n  ctx->count[0] = 0;\r\n  ctx->count[1] = 0;\r\n  ctx->state[0] = 0x6a09e667f3bcc908;\r\n  ctx->state[1] = 0xbb67ae8584caa73b;\r\n  ctx->state[2] = 0x3c6ef372fe94f82b;\r\n  ctx->state[3] = 0xa54ff53a5f1d36f1;\r\n  ctx->state[4] = 0x510e527fade682d1;\r\n  ctx->state[5] = 0x9b05688c2b3e6c1f;\r\n  ctx->state[6] = 0x1f83d9abfb41bd6b;\r\n  ctx->state[7] = 0x5be0cd19137e2179;\r\n}\r\n\r\nvoid sha512_update(sha512_ctx* ctx, const void* data, size_t size)\r\n{\r\n  const uint8_t* buffer = (const uint8_t*)data;\r\n  \r\n  size_t pending = ctx->count[0] % SHA512_BLOCK_SIZE;\r\n  ctx->count[0] += size;\r\n  ctx->count[1] += size > ctx->count[0];\r\n  \r\n  size_t available = SHA512_BLOCK_SIZE - pending;\r\n  if (pending && size >= available)\r\n  {\r\n    memcpy(ctx->buffer + pending, buffer, available);\r\n    sha512_process(ctx->state, ctx->buffer, 1);\r\n    buffer += available;\r\n    size -= available;\r\n    pending = 0;\r\n  }\r\n  \r\n  size_t count = size / SHA512_BLOCK_SIZE;\r\n  if (count)\r\n  {\r\n    sha512_process(ctx->state, buffer, count);\r\n    buffer += count * SHA512_BLOCK_SIZE;\r\n    size -= count * SHA512_BLOCK_SIZE;\r\n  }\r\n  \r\n  memcpy(ctx->buffer + pending, buffer, size);\r\n}\r\n\r\nvoid sha512_finish(sha512_ctx* ctx, uint8_t digest[SHA512_DIGEST_SIZE])\r\n{\r\n  uint64_t count0 = ctx->count[0];\r\n  uint64_t count1 = ctx->count[1];\r\n  uint64_t bitcount[2] = { (count0 << 3), (count1 << 3) | (count0 >> 61) };\r\n  \r\n  size_t pending = count0 % SHA512_BLOCK_SIZE;\r\n  size_t blocks = pending < SHA512_BLOCK_SIZE - sizeof(bitcount) ? 1 : 2;\r\n  \r\n  ctx->buffer[pending++] = 0x80;\r\n  \r\n  uint8_t padding[2 * SHA512_BLOCK_SIZE];\r\n  memcpy(padding, ctx->buffer, SHA512_BLOCK_SIZE);\r\n  memset(padding + pending, 0, SHA512_BLOCK_SIZE);\r\n  SHA512_SET64BE(padding + blocks * SHA512_BLOCK_SIZE - 2*sizeof(uint64_t), bitcount[1]);\r\n  SHA512_SET64BE(padding + blocks * SHA512_BLOCK_SIZE - 1*sizeof(uint64_t), bitcount[0]);\r\n  \r\n  sha512_process(ctx->state, padding, blocks);\r\n  \r\n  for (size_t i=0; i<8; i++)\r\n  {\r\n    SHA512_SET64BE(digest + i*sizeof(uint64_t), ctx->state[i]);\r\n  }\r\n}\r\n\r\nvoid sha384_init(sha384_ctx* ctx)\r\n{\r\n  ctx->count[0] = 0;\r\n  ctx->count[1] = 0;\r\n  ctx->state[0] = 0xcbbb9d5dc1059ed8;\r\n  ctx->state[1] = 0x629a292a367cd507;\r\n  ctx->state[2] = 0x9159015a3070dd17;\r\n  ctx->state[3] = 0x152fecd8f70e5939;\r\n  ctx->state[4] = 0x67332667ffc00b31;\r\n  ctx->state[5] = 0x8eb44a8768581511;\r\n  ctx->state[6] = 0xdb0c2e0d64f98fa7;\r\n  ctx->state[7] = 0x47b5481dbefa4fa4;\r\n}\r\n\r\nvoid sha384_update(sha512_ctx* ctx, const void* data, size_t size)\r\n{\r\n  sha512_update(ctx, data, size);\r\n}\r\n\r\nvoid sha384_finish(sha384_ctx* ctx, uint8_t digest[SHA384_DIGEST_SIZE])\r\n{\r\n  uint8_t temp[SHA512_DIGEST_SIZE];\r\n  sha512_finish(ctx, temp);\r\n  \r\n  memcpy(digest, temp, SHA384_DIGEST_SIZE);\r\n}\r\n\r\n#if defined(__clang__)\r\n#   pragma clang diagnostic pop\r\n#elif defined(_MSC_VER)\r\n#   pragma warning (pop)\r\n#endif\r\n"
  },
  {
    "path": "src/third_party/rad_lzb_simple/rad_lzb_simple.c",
    "content": "#include <string.h>\r\n\r\n//-------------------------------------------------\r\n// UINTr = int the size of a register\r\n\r\n#ifdef __RAD64REGS__\r\n\r\n#define RAD_UINTr RAD_U64\r\n#define RAD_SINTr RAD_S64\r\n\r\n#define readR read64\r\n#define writeR write64\r\n\r\n#define rrClzBytesR rrClzBytes64\r\n#define rrCtzBytesR rrCtzBytes64\r\n\r\n#else\r\n\r\n#define RAD_UINTr RAD_U32\r\n#define RAD_SINTr RAD_S32\r\n\r\n#define readR read32\r\n#define writeR write32\r\n\r\n#define rrClzBytesR rrClzBytes32\r\n#define rrCtzBytesR rrCtzBytes32\r\n\r\n#endif\r\n\r\ntypedef RAD_SINTr SINTr;\r\ntypedef RAD_UINTr UINTr;\r\n\r\n#define OOINLINE\tRADFORCEINLINE\r\n\r\n#define if_unlikely(exp)\tif ( RAD_UNLIKELY( exp ) )\r\n#define if_likely(  exp)\tif ( RAD_LIKELY( exp ) )\r\n\r\n// Raw byte IO\r\n\r\n#if defined(__RADARM__) && !defined(__RAD64__) && defined(__GNUC__)\r\n\r\n// older GCCs don't turn the memcpy variant into loads/stores, but\r\n// they do support this:\r\ntypedef union\r\n{\r\n\tU16 u16;\r\n\tU32 u32; \r\n\tU64 u64; \r\n} __attribute__((packed)) unaligned_type;\r\n\r\nstatic inline U16 read16(const void *ptr) \t\t{ return ((const unaligned_type *)ptr)->u16; }\r\nstatic inline void write16(void *ptr, U16 x) \t{ ((unaligned_type *)ptr)->u16 = x; }\r\n\r\nstatic inline U32 read32(const void *ptr) \t\t{ return ((const unaligned_type *)ptr)->u32; }\r\nstatic inline void write32(void *ptr, U32 x) \t{ ((unaligned_type *)ptr)->u32 = x; }\r\n\r\nstatic inline U64 read64(const void *ptr) \t\t{ return ((const unaligned_type *)ptr)->u64; }\r\nstatic inline void write64(void *ptr, U64 x) \t{ ((unaligned_type *)ptr)->u64 = x; }\r\n\r\n#else\r\n\r\n// most C compilers we target are smart enough to turn this into single loads/stores\r\nstatic inline U16 read16(const void *ptr) \t\t{ U16 x; memcpy(&x, ptr, sizeof(x)); return x; }\r\nstatic inline void write16(void *ptr, U16 x) \t{ memcpy(ptr, &x, sizeof(x)); }\r\n\r\nstatic inline U32 read32(const void *ptr) \t\t{ U32 x; memcpy(&x, ptr, sizeof(x)); return x; }\r\nstatic inline void write32(void *ptr, U32 x) \t{ memcpy(ptr, &x, sizeof(x)); }\r\n\r\nstatic inline U64 read64(const void *ptr) \t\t{ U64 x; memcpy(&x, ptr, sizeof(x)); return x; }\r\nstatic inline void write64(void *ptr, U64 x) \t{ memcpy(ptr, &x, sizeof(x)); }\r\n\r\n#endif\r\n\r\n#define RR_PUT16_LE_UNALIGNED(ptr,val)                 RR_PUT16_LE(ptr,val)\r\n#define RR_PUT16_LE_UNALIGNED_OFFSET(ptr,val,offset)   RR_PUT16_LE_OFFSET(ptr,val,offset)\r\n\r\n//===========================================================================\r\n\r\nstatic RADINLINE SINTa rrPtrDiffV(void * end, void *start) { return (SINTa)( ((char *)(end)) - ((char *)(start)) ); }\r\n\r\n// helper function to show I really am intending to put a pointer difference in an int :\r\nstatic RADINLINE SINTa rrPtrDiff(SINTa val) { return val; }\r\nstatic RADINLINE S32 rrPtrDiff32(SINTa val) { S32 ret = (S32) val; RR_ASSERT( (SINTa)ret == val ); return ret; }\r\nstatic RADINLINE SINTr rrPtrDiffR(SINTa val) { SINTr ret = (SINTr) val; RR_ASSERT( (SINTa)ret == val ); return ret; }\r\n\r\n//=================================================================\r\n\r\n#define LZB_LRL_BITS\t4\r\n#define LZB_LRL_ESCAPE\t15\r\n\r\n#define LZB_ML_BITS\t\t4\r\n#define LZB_MLCONTROL_ESCAPE\t15\r\n\r\n#define LZB_SLIDING_WINDOW_POW2\t16\r\n#define LZB_SLIDING_WINDOW_SIZE\t(1<<LZB_SLIDING_WINDOW_POW2)\r\n\r\n#define LZB_MAX_OFFSET\t\t0xFFFF\r\n\r\n#define LZB_MML\t\t4\t\t// should be 3 if I had LO\r\n\r\n#define LZB_MATCHLEN_ESCAPE\t\t(LZB_MLCONTROL_ESCAPE+4)\r\n\r\n\r\n#define LZB_END_WITH_LITERALS\t\t\t1\t// @@ ??\r\n//#define LZB_END_WITH_LITERALS\t\t\t0\t// @@ ??\r\n#define LZB_END_OF_BLOCK_NO_MATCH_ZONE\t8\r\n\r\n/**\r\n\r\nNOTE ABOUT LZB_END_OF_BLOCK_NO_MATCH_ZONE\r\n\r\nThe limitation in LZB does not actually come from the 8-at-a-time match copier\r\n\r\nit comes from the unconditional 8-byte LRL copy\r\n\r\nthat means the last 8 bytes of every block *must* be literals\r\n\r\n(note that's *block* not quantum)\r\n\r\nThe constraint due to matches is actually weaker\r\n(match len rounded up to next multiple of 8 must not go past block end)\r\n\r\n**/\r\n\r\n// decode speed on lzt99 :\r\n// LZ4 :      1715.10235\r\n\r\n#define LZB_FORCELASTLRL9\t1\r\n\r\n//=======================================\r\n\r\n#define lz_copywordstep(d,s)\t\t\tdo { writeR(d, readR(s)); (s) += sizeof(UINTr); (d) += sizeof(UINTr); } while(0)\r\n#define lz_copywordsteptoend(d,s,e)\t\tdo { lz_copywordstep(d,s); } while ((d)<(e))\r\n\r\n// lz_copysteptoend_overrunok\r\n// NOTE : unlike memcpy, adjusts dest pointer to end !\r\n#define lz_copysteptoend_overrunok(d,s,l)\tdo { U8 * e=(d)+(l); lz_copywordsteptoend(d,s,e); d=e; } while(0)\r\n\r\n//=======================================\r\n\r\n#define LZB_PutExcessBW(cp,val)\tdo { \\\r\nif ( val < 192 ) *cp++ = (U8) val; \\\r\nelse { val -= 192; *cp++ = 192 + (U8) ( val&0x3F); val >>= 6; \\\r\nif ( val < 128 ) *cp++ = (U8) val; \\\r\nelse { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \\\r\nif ( val < 128 ) *cp++ = (U8) val; \\\r\nelse { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; \\\r\nif ( val < 128 ) *cp++ = (U8) val; \\\r\nelse { val -= 128; *cp++ = 128 + (U8) ( val&0x7F); val >>= 7; *cp++ = (U8) val; } } } } \\\r\n} while(0)\r\n\r\n// max bytes consumed: 5\r\n#define LZB_AddExcessBW(cp,val)\tdo { U32 b = *cp++; \\\r\nif ( b < 192 ) val += b; \\\r\nelse { val += 192; val += (b-192); b = *cp++; \\\r\nval += (b<<6); if ( b >= 128 ) { b = *cp++; \\\r\nval += (b<<13); if ( b >= 128 ) { b = *cp++; \\\r\nval += (b<<20); if ( b >= 128 ) { b = *cp++; \\\r\nval += (b<<27); } } } } \\\r\n} while(0)\r\n\r\n#define LZB_PutExcessLRL(cp,val) LZB_PutExcessBW(cp,val)\r\n#define LZB_PutExcessML(cp,val)  LZB_PutExcessBW(cp,val)\r\n\r\n#define LZB_AddExcessLRL(cp,val) LZB_AddExcessBW(cp,val)\r\n#define LZB_AddExcessML(cp,val)  LZB_AddExcessBW(cp,val)\r\n\r\n//=============================================================================\r\n// match copies :\r\n\r\n// used for LRL :\r\nstatic OOINLINE void copy_no_overlap_long(U8 * to, const U8 * from, SINTr length)\r\n{\r\n\tfor(int i=0;i<length;i+=8)\r\n\t\twrite64(to+i, read64(from+i));\r\n}\r\n\r\nstatic OOINLINE void copy_no_overlap_nooverrun(U8 * to, const U8 * from, SINTr length)\r\n{\r\n\t// used for final LRL of every block\r\n\t//  must not overrun\r\n\tmemmove(to,from,(size_t)length);\r\n}\r\n\r\nRR_COMPILER_ASSERT( LZB_MLCONTROL_ESCAPE == 15 );\r\nRR_COMPILER_ASSERT( LZB_MATCHLEN_ESCAPE == 19 );\r\n\r\nstatic OOINLINE void copy_match_short_overlap(U8 * to, const U8 * from, SINTr ml)\r\n{\r\n\tRR_ASSERT( ml >= LZB_MML && ml < LZB_MATCHLEN_ESCAPE );\r\n  \r\n\t// overlap\r\n\t// @@ err not awesome\r\n\tto[0] = from[0];\r\n\tto[1] = from[1];\r\n\tto[2] = from[2];\r\n\tto[3] = from[3];\r\n\tto[4] = from[4];\r\n\tto[5] = from[5];\r\n\tto[6] = from[6];\r\n\tto[7] = from[7];\r\n\tif ( ml > 8 )\r\n\t{\r\n\t\tto += 8; from += 8; ml -= 8;\r\n\t\t// max of 10 more\r\n\t\twhile(ml--)\r\n\t\t{\r\n\t\t\t*to++ = *from++;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nstatic OOINLINE void copy_match_memset(U8 * to, int c, SINTr ml)\r\n{\r\n\tRR_ASSERT( ml >= 4 );\r\n\tU32 four = c * 0x01010101;\r\n\tU8 * end = to + ml;\r\n\twrite32(to, four); to += 4;\r\n\twhile(to<end)\r\n\t{\r\n\t\twrite32(to, four); to += 4;\r\n\t}\r\n}\r\n\r\n//=============================================================================\r\n\r\nstatic SINTa rr_lzb_simple_decode_notexpanded(const void * comp, void * raw, SINTa rawLen)\r\n{\r\n\tU8 * rp = (U8 *)raw;\r\n\tU8 * rpEnd = rp+rawLen;\r\n  \r\n\tconst U8 *\tcp = (const U8 *)comp;\r\n\t\r\n\tfor(;;)\r\n\t{\r\n\t\tRR_ASSERT( rp < rpEnd );\r\n    \r\n\t\t// max bytes consumed (fast paths):\r\n\t\t// - 1 control\r\n\t\t// - lits:\r\n\t\t//   * 15 lits OR\r\n\t\t//   * 5 excess lrl + long lit run\r\n\t\t// - match:\r\n\t\t//   * 2 match offset (short match) OR\r\n\t\t//   * 1 excess code + 5 excess ML (overlap match) OR\r\n\t\t//   * 1 excess code + 5 excess ML (long match)\r\n\t\t//\r\n\t\t// need near-end checks mainly on long lit runs.\r\n    \r\n\t\tUINTr control = *cp++;\r\n    \r\n\t\tUINTr lrl = control & 0xF;\r\n\t\tUINTr ml_control = (control>>4);\r\n    \r\n\t\t// copy 4 literals speculatively :\r\n\t\twrite32( rp , read32(cp) );\r\n    \r\n\t\t//RR_ASSERT( lrl >= 8 || ml_control >= 8 );\r\n    \r\n\t\tif ( lrl > 4 )\r\n\t\t{\r\n\t\t\t// if lrl was <= 8 we did it, else need this :\r\n\t\t\tif_unlikely ( lrl > 8 )\r\n\t\t\t{\r\n\t\t\t\tif_unlikely ( lrl >= LZB_LRL_ESCAPE )\r\n\t\t\t\t{\r\n\t\t\t\t\tLZB_AddExcessLRL( cp, lrl );\r\n          \r\n\t\t\t\t\t// hide the EOF check here ?\r\n\t\t\t\t\t// has to be after the GetExcess\r\n\t\t\t\t\tif_unlikely ( rp+lrl >= rpEnd )\r\n\t\t\t\t\t{\t\r\n\t\t\t\t\t\tRR_ASSERT( rp+lrl == rpEnd );\r\n            \r\n\t\t\t\t\t\tcopy_no_overlap_nooverrun(rp,cp,lrl);\r\n            \r\n\t\t\t\t\t\trp += lrl;\r\n\t\t\t\t\t\tcp += lrl;\r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// total undo of the previous copy\t\r\n\t\t\t\t\t\tcopy_no_overlap_long(rp,cp,lrl);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse // > 8 but not 0xF\r\n\t\t\t\t{\r\n\t\t\t\t\t// hide the EOF check here ?\r\n\t\t\t\t\tif_unlikely ( rp+lrl >= rpEnd )\r\n\t\t\t\t\t{\t\r\n\t\t\t\t\t\tif ( lrl == 9 )\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t// may be a false 9\r\n\t\t\t\t\t\t\tlrl = rrPtrDiff32( rpEnd - rp );\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tRR_ASSERT( rp+lrl == rpEnd );\r\n            \r\n\t\t\t\t\t\tcopy_no_overlap_nooverrun(rp,cp,lrl);\r\n            \r\n\t\t\t\t\t\trp += lrl;\r\n\t\t\t\t\t\tcp += lrl;\r\n\t\t\t\t\t\tbreak;\t\t\t\t\t\t\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\twrite32( rp+4 , read32(cp+4) );\r\n\t\t\t\t\t\t// put 8 more :\r\n\t\t\t\t\t\twrite64( (rp+8) , read64((cp+8)) );\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\twrite32( rp+4 , read32(cp+4) );\r\n\t\t\t}\r\n\t\t}\r\n    \r\n\t\trp += lrl;\r\n\t\tcp += lrl;\r\n    \r\n\t\tRR_ASSERT( rp+LZB_MML <= rpEnd );\r\n    \r\n\t\tUINTr ml = ml_control + LZB_MML;\r\n    \r\n\t\t// speculatively grab offset but don't advance cp yet\r\n\t\tUINTr off = RR_GET16_LE_UNALIGNED(cp);\r\n    \r\n\t\tif ( ml_control <= 8 )\r\n\t\t{\r\n\t\t\tcp += 2; // consume offset\r\n\t\t\tconst U8 * match = rp - off;\r\n      \r\n\t\t\tRR_ASSERT( ml <= 12 );\r\n      \r\n\t\t\twrite64( rp , read64(match) );\r\n\t\t\twrite32( rp+8 , read32(match+8) );\r\n      \r\n\t\t\trp += ml;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n      \r\n\t\t\tif_likely( ml_control < LZB_MLCONTROL_ESCAPE ) // short match\r\n\t\t\t{\r\n\t\t\t\tcp += 2; // consume offset\r\n\t\t\t\tconst U8 * match = rp - off;\r\n        \r\n\t\t\t\tRR_ASSERT( off >= 8 || ml <= off );\r\n        \r\n\t\t\t\twrite64( rp , read64(match) );\r\n\t\t\t\twrite64( rp+8 , read64(match+8) );\r\n        \r\n\t\t\t\tif ( ml > 16 )\r\n\t\t\t\t{\r\n\t\t\t\t\twrite16( rp+16, read16(match+16) );\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t// get 1-byte excess code\r\n\t\t\t\tUINTr excesslow = off&127;\r\n\t\t\t\tcp++; // consume 1\r\n        \r\n\t\t\t\t//if ( excess1 >= 128 )\r\n\t\t\t\tif ( off & 128 )\r\n\t\t\t\t{\t\t\t\t\r\n\t\t\t\t\tml_control = excesslow >> 3;\r\n\t\t\t\t\tml = ml_control + LZB_MML;\r\n\t\t\t\t\tif ( ml_control == 0xF )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// get more ml\r\n\t\t\t\t\t\tLZB_AddExcessML( cp, ml );\r\n\t\t\t\t\t}\t\r\n          \r\n\t\t\t\t\tUINTr myoff = off & 7;\r\n          \r\n\t\t\t\t\t// low offset, can't do 8-byte grabs\r\n\t\t\t\t\tif ( myoff == 1 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tint c = rp[-1];\r\n\t\t\t\t\t\tcopy_match_memset(rp,c,ml);\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// shit but whatever, very rare\r\n\t\t\t\t\t\tfor(UINTr i=0;i<ml;i++)\r\n\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\trp[i] = rp[i-myoff];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\telse\r\n\t\t\t\t{\r\n\t\t\t\t\tUINTr myoff = RR_GET16_LE_UNALIGNED(cp); cp += 2;\r\n\t\t\t\t\tconst U8 * match = rp - myoff;\r\n          \r\n\t\t\t\t\tml += excesslow;\r\n          \r\n\t\t\t\t\tif ( excesslow == 127 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\t// get more ml\r\n\t\t\t\t\t\tLZB_AddExcessML( cp, ml );\r\n\t\t\t\t\t}\r\n          \r\n\t\t\t\t\t// 8-byte copier :\r\n\t\t\t\t\tcopy_no_overlap_long(rp,match,ml);\r\n\t\t\t\t}\r\n\t\t\t}\r\n      \r\n\t\t\trp += ml;\r\n\t\t}\r\n\t}\r\n  \r\n\tRR_ASSERT( rp == rpEnd );\r\n  \r\n\tSINTa used = rrPtrDiff( cp - (const U8 *)comp );\r\n\t\r\n\tRR_ASSERT( used < rawLen );\r\n\t\r\n\treturn used;\r\n}\r\n\r\nSINTa rr_lzb_simple_decode(const void * comp, SINTa compLen, void * raw, SINTa rawLen)\r\n{\r\n\tRR_ASSERT_ALWAYS( compLen <= rawLen );\r\n\tif ( compLen == rawLen )\r\n\t{\r\n\t\tmemcpy(raw,comp,rawLen);\r\n\t\treturn compLen;\r\n\t}\r\n\treturn rr_lzb_simple_decode_notexpanded(comp,raw,rawLen);\r\n}\r\n\r\n//=====================================================\r\n\r\n\r\nstatic RADINLINE U32 hmf_hash4_32(U32 ptr32)\r\n{\r\n  U32 h = ( ptr32 * 2654435761u );\r\n  h ^= (h>>13);\r\n  return h;\r\n}\r\n\r\n#define HashMatchFinder_Hash32\thmf_hash4_32\r\n\r\n//=================================================================================\r\n\r\n#define LZB_Hash4\thmf_hash4_32\r\n\r\nstatic RADINLINE U32 LZB_SecondHash4(U32 be4)\r\n{\r\n\tconst U32 m = 0x5bd1e995;\r\n  \r\n\tU32 h = be4 * m;\r\n\th += (h>>11);\r\n\t\r\n\treturn h;\r\n}\r\n\r\n//=============================================    \r\n\r\nstatic int RADFORCEINLINE GetNumBytesZeroNeverAllR(UINTr x)\r\n{\r\n\tRR_ASSERT( x != 0 );\r\n  \r\n#if defined(__RADBIGENDIAN__)\r\n\t// big endian, so earlier bytes are at the top\r\n\tint nb = (int)rrClzBytesR(x);\r\n#elif defined(__RADLITTLEENDIAN__)\r\n\t// little endian, so earlier bytes are at the bottom\r\n\tint nb = (int)rrCtzBytesR(x);\r\n#else\r\n#error wtf no endian set\r\n#endif\r\n  \r\n\tRR_ASSERT( nb >= 0 && nb < (int)sizeof(UINTr) );\r\n\treturn nb;\r\n}\r\n\r\n//===============================\r\n\r\nstatic RADFORCEINLINE U8 * LZB_Output(U8 * cp, S32 lrl, const U8 * literals,  S32 matchlen ,  S32 mo )\r\n{\r\n\tRR_ASSERT( lrl >= 0 );\r\n\tRR_ASSERT( matchlen >= LZB_MML );\r\n\tRR_ASSERT( mo > 0 && mo <= LZB_MAX_OFFSET );\r\n\t\r\n\t//rrprintf(\"[%3d][%3d][%7d]\\n\",lrl,ml,mo);\r\n  \r\n\tS32 sendml = matchlen - LZB_MML;\r\n\t\r\n\tU32 ml_in_control  = RR_MIN(sendml,LZB_MLCONTROL_ESCAPE);\r\n\t\r\n\tif ( mo >= 8 ) // no overlap\t\r\n\t{\r\n\t\tif ( lrl < LZB_LRL_ESCAPE )\r\n\t\t{\r\n\t\t\tU32 control = lrl | (ml_in_control<<4);\r\n      \r\n\t\t\t*cp++ = (U8) control;\r\n\t\t\t\r\n\t\t\twrite64(cp, read64(literals));\r\n\t\t\tif ( lrl > 8 )\r\n\t\t\t{\r\n\t\t\t\twrite64(cp+8, read64(literals+8));\r\n\t\t\t}\r\n\t\t\tcp += lrl;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tU32 control = LZB_LRL_ESCAPE | (ml_in_control<<4);\r\n      \r\n\t\t\t*cp++ = (U8) control;\r\n\t\t\t\r\n\t\t\tU32 lrl_excess = lrl - LZB_LRL_ESCAPE;\r\n\t\t\tLZB_PutExcessLRL(cp,lrl_excess);\r\n      \r\n\t\t\t// @@ ? is this okay for overrun ?\r\n\t\t\tlz_copysteptoend_overrunok(cp,literals,lrl);\r\n\t\t}\r\n\t\t\r\n\t\tif ( ml_in_control < LZB_MLCONTROL_ESCAPE )\r\n\t\t{\r\n\t\t\tRR_ASSERT( (U16)(mo) == mo );\r\n\t\t\tRR_PUT16_LE_UNALIGNED(cp,(U16)(mo));\r\n\t\t\tcp += 2;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tU32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE;\r\n\t\t\t\r\n\t\t\t// put special first byte, then offset, then remainder\r\n\t\t\tif ( ml_excess < 127 )\r\n\t\t\t{\r\n\t\t\t\t*cp++ = (U8)ml_excess;\r\n        \r\n\t\t\t\tRR_ASSERT( (U16)(mo) == mo );\r\n\t\t\t\tRR_PUT16_LE_UNALIGNED(cp,(U16)(mo));\r\n\t\t\t\tcp += 2;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\t*cp++ = (U8)127;\r\n        \r\n\t\t\t\tRR_ASSERT( (U16)(mo) == mo );\r\n\t\t\t\tRR_PUT16_LE_UNALIGNED(cp,(U16)(mo));\r\n\t\t\t\tcp += 2;\r\n        \r\n\t\t\t\tml_excess -= 127;\r\n\t\t\t\tLZB_PutExcessML(cp,ml_excess);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\telse\r\n\t{\r\n\t\tU32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE);\r\n    \r\n    // overlap case\r\n\t\tU32 control = (lrl_in_control) | (LZB_MLCONTROL_ESCAPE<<4);\r\n\t\t\r\n\t\t*cp++ = (U8) control;\r\n\t\t\r\n\t\tif ( lrl_in_control == LZB_LRL_ESCAPE )\r\n\t\t{\r\n\t\t\tU32 lrl_excess = lrl - LZB_LRL_ESCAPE;\r\n\t\t\tLZB_PutExcessLRL(cp,lrl_excess);\r\n\t\t}\r\n\t\t\r\n\t\tlz_copysteptoend_overrunok(cp,literals,lrl);\r\n\t\t//cp += lrl;\r\n\t\t\r\n\t\t// special excess1 :\r\n\t\tUINTr excess1 = 128 + (ml_in_control<<3) + mo;\r\n\t\tRR_ASSERT( excess1 < 256 );\r\n\t\t\r\n\t\t*cp++ = (U8)excess1;\r\n\t\t\r\n\t\tif ( ml_in_control == LZB_MLCONTROL_ESCAPE )\r\n\t\t{\r\n\t\t\tU32 ml_excess = sendml - LZB_MLCONTROL_ESCAPE;\r\n\t\t\tLZB_PutExcessML(cp,ml_excess);\r\n\t\t}\t\t\r\n\t}\r\n\t\r\n\treturn cp;\r\n}\r\n\r\n#if LZB_FORCELASTLRL9\r\n\r\nstatic RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals )\r\n{\r\n\tRR_ASSERT( lrl >= 0 );\r\n\t\r\n\t//U32 ml = 0;\r\n\t//U32 mo = 0;\r\n  \r\n\tU32 lrl_in_control = RR_MIN(lrl,LZB_LRL_ESCAPE);\r\n\t\r\n#if LZB_END_WITH_LITERALS\r\n\t// lrl_in_control must be at least 9\r\n\tlrl_in_control = RR_MAX(lrl_in_control,9);\r\n#endif\r\n\t\r\n\tU32 control = lrl_in_control;\r\n  \r\n\t*cp++ = (U8) control;\r\n\t\r\n\tif ( lrl_in_control == LZB_LRL_ESCAPE )\r\n\t{\r\n\t\tU32 lrl_excess = lrl - LZB_LRL_ESCAPE;\r\n\t\tLZB_PutExcessLRL(cp,lrl_excess);\r\n\t}\r\n\t\r\n\tmemmove(cp,literals,lrl);\r\n\tcp += lrl;\r\n\t\r\n\treturn cp;\r\n}\r\n\r\n#else\r\n\r\nstatic RADINLINE U8 * LZB_OutputLast(U8 * cp, S32 lrl, const U8 * literals )\r\n{\r\n\tcp = LZB_Output(cp,lrl,literals,LZB_MML,1);\r\n\t\r\n\t// remove the offset we put :\r\n\tcp -= 2;\r\n\t\r\n\treturn cp;\r\n}\r\n\r\n#endif\r\n\r\n//===============================================================\r\n\r\nstatic void rr_lzb_simple_context_init(rr_lzb_simple_context * ctx) //, const void * base)\r\n{\r\n\tRR_ASSERT( ctx->m_tableSizeBits >= 12 && ctx->m_tableSizeBits <= 24 );\r\n\tmemset(ctx->m_hashTable,0,sizeof(U16)*((SINTa)1<<ctx->m_tableSizeBits));\r\n}\r\n\r\n//===============================================================\r\n\r\n/*     \r\n#define FAST_HASH_DEPTH_SHIFT   (1) // more depth = more & more compression,\r\n#define DO_FAST_2ND_HASH    //  rate= 30.69 mb/s , 15451369 <- turning this off is the best way to get more speed and less compression\r\n/*/\r\n#define FAST_HASH_DEPTH_SHIFT   (0)\r\n#define DO_FAST_2ND_HASH\r\n/**/\r\n\r\n//     lzt99,  24700820,  15475520,  16677179\r\n//encode only      : 0.880 seconds, 1.62 b/hc, rate= 28.08 mb/s\r\n\r\n//#define FAST_HASH_DEPTH_SHIFT   (1) // more depth = more & more compression, but slower\r\n\r\n#define DO_FAST_UPDATE_MATCH_HASHES 1 // helps compression a lot , like 0.30\r\n//#define DO_FAST_UPDATE_MATCH_HASHES 2 // helps compression a lot , like 0.30\r\n#define DO_FAST_LAZY_MATCH  // also helps a lot , like 0.15\r\n#define DO_FAST_HASH_DWORD\t\t1\r\n\r\n#define FAST_MULTISTEP_LITERALS_SHIFT\t(5)\r\n\r\n\r\n//-----------------------\r\n// derived :\r\n\r\n/*\r\n#define FAST_HASH_BITS          (FAST_HASH_TOTAL_BITS-FAST_HASH_DEPTH_SHIFT)\r\n#define FAST_HASH_SIZE          (1<<FAST_HASH_BITS)\r\n#define FAST_HASH_MASK          (FAST_HASH_SIZE-1)\r\n*/\r\n\r\n#undef FAST_HASH_DEPTH\r\n#define FAST_HASH_DEPTH         (1<<FAST_HASH_DEPTH_SHIFT)\r\n\r\n/*\r\n#if FAST_HASH_DEPTH == 1\r\n#error nope\r\n#endif\r\n*/\r\n\r\n#undef FAST_HASH_CYCLE_MASK\r\n#define FAST_HASH_CYCLE_MASK    (FAST_HASH_DEPTH-1)\r\n\r\n#undef FAST_HASH_INDEX\r\n#if FAST_HASH_DEPTH > 1\r\n#define FAST_HASH_INDEX(h,d)    ( ((h)<<FAST_HASH_DEPTH_SHIFT) + (d) )\r\n#else\r\n#define FAST_HASH_INDEX(h,d)    (h)\r\n#endif\r\n\r\n#undef FAST_HASH_FUNC\r\n#define FAST_HASH_FUNC(ptr,dword)\t( LZB_Hash4(dword) & hash_table_mask )\r\n\r\n\r\n\r\nstatic SINTa rr_lzb_simple_encode_fast_sub(rr_lzb_simple_context * fh,\r\n                                           const void * raw, SINTa rawLen, void * comp)\r\n{\r\n\t//SIMPLEPROFILE_SCOPE_N(lzbfast_sub,rawLen);\r\n\t//THREADPROFILEFUNC();\r\n\t\r\n\tU8 * cp = (U8 *)comp;\r\n\tU8 * compExpandedPtr = cp + rawLen - 8;\r\n  \r\n\tconst U8 * rp = (const U8 *)raw;\r\n\tconst U8 * rpEnd = rp+rawLen;\r\n  \r\n\tconst U8 * rpMatchEnd = rpEnd - LZB_END_OF_BLOCK_NO_MATCH_ZONE;\r\n\t\r\n\tconst U8 * rpEndSafe = rpMatchEnd - LZB_MML;\r\n\t\r\n\tif ( rpEndSafe <= (U8 *)raw )\r\n\t{\r\n\t\t// can't compress\r\n\t\treturn rawLen+1;\r\n\t}\r\n\t\r\n\tconst U8 * literals_start = rp;\r\n  \r\n#if FAST_HASH_DEPTH > 1\r\n\tint hashCycle = 0;\r\n#endif\r\n  \r\n\tU16 * hashTable16 = fh->m_hashTable;\r\n\t\r\n\tint hashTableSizeBits = fh->m_tableSizeBits;\r\n\tU32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits - FAST_HASH_DEPTH_SHIFT)) - 1);\r\n\t\r\n\tconst U8 * zeroPosPtr = (const U8 *)raw;\r\n  \r\n\t// first byte is always a literal\r\n\trp++;\r\n\t\r\n\tfor(;;)\r\n\t{\t\r\n\t\tS32 matchOff;\r\n    \r\n\t\tUINTr failedMatches = (1<<FAST_MULTISTEP_LITERALS_SHIFT) + 3;\r\n\t\t\r\n\t\tU32 rp32 = read32(rp);\r\n\t\tU32 hash = FAST_HASH_FUNC(rp, rp32 );\r\n\t\tSINTa curpos;\r\n\t\tconst U8 * hashrp;\r\n    \r\n#ifdef DO_FAST_2ND_HASH\r\n\t\tU32 hash2;\r\n#endif\r\n    \r\n\t\t// literals :\r\n\t\tfor(;;)\t\t\r\n\t\t{    \t\t\t\t\r\n\t\t\tcurpos = rrPtrDiff(rp - zeroPosPtr);\t\r\n\t\t\tRR_ASSERT( curpos >= 0 );\r\n\t\t\t\r\n#ifdef DO_FAST_2ND_HASH\r\n\t\t\thash2 = ( LZB_SecondHash4(rp32) ) & hash_table_mask;\r\n#endif\r\n      \r\n#if FAST_HASH_DEPTH > 1\r\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\r\n#endif\r\n\t\t\t{\r\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(hash,d) ];\r\n\t\t\t\t\r\n\t\t\t\tmatchOff = (U16)(curpos - hashpos16);\r\n\t\t\t\tRR_ASSERT( matchOff >= 0 );\r\n\t\t\t\t\r\n\t\t\t\thashrp = rp - matchOff;\r\n        \r\n\t\t\t\t//if ( matchOff <= LZB_MAX_OFFSET )\r\n\t\t\t\tRR_ASSERT( matchOff <= LZB_MAX_OFFSET );\r\n\t\t\t\t{\t\t\t\t\t\t\t\r\n\t\t\t\t\tconst U32 hashrp32 = read32(hashrp);\r\n          \r\n\t\t\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tgoto found_match;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n      \r\n#ifdef DO_FAST_2ND_HASH\r\n      \r\n#if FAST_HASH_DEPTH > 1\r\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\r\n#endif\r\n\t\t\t{\r\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(hash2,d) ];\r\n\t\t\t\t\r\n\t\t\t\tmatchOff = (U16)(curpos - hashpos16);\r\n\t\t\t\tRR_ASSERT( matchOff >= 0 );\r\n\t\t\t\t\r\n\t\t\t\thashrp = rp - matchOff;\r\n        \r\n\t\t\t\tRR_ASSERT( matchOff <= LZB_MAX_OFFSET );\r\n\t\t\t\t{\t\t\t\t\t\t\t\r\n\t\t\t\t\tconst U32 hashrp32 = read32(hashrp);\r\n          \r\n\t\t\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tgoto found_match;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} \r\n\t\t\t\r\n#endif\r\n      \r\n\t\t\t//---------------------------\r\n\t\t\t// update hash :\r\n      \r\n\t\t\thashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos;\r\n      \r\n#ifdef DO_FAST_2ND_HASH\r\n\t\t\t// do NOT step hashCycle !\r\n\t\t\t//hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\r\n\t\t\thashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos;\r\n#endif\r\n\t\t\t\r\n#if FAST_HASH_DEPTH > 1\r\n\t\t\thashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\r\n#endif\r\n      \r\n\t\t\tUINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT);\r\n\t\t\tRR_ASSERT( stepLiterals >= 1 );\r\n      \r\n\t\t\t++failedMatches;\r\n      \r\n\t\t\trp += stepLiterals;\r\n      \r\n\t\t\tif ( rp >= rpEndSafe )\r\n\t\t\t\tgoto done;\r\n      \r\n\t\t\trp32 = read32(rp);\r\n\t\t\thash = FAST_HASH_FUNC(rp, rp32 );\r\n      \r\n\t\t}\r\n\t\t\r\n\t\t//-------------------------------\r\n\t\tfound_match:\r\n    \r\n\t\t// found something\r\n    \r\n    //-------------------------\r\n    // update hash now so lazy can see it :\r\n    \r\n#if 1 // pretty important to compression\r\n\t\thashTable16[ FAST_HASH_INDEX(hash,hashCycle) ] = (U16) curpos;\r\n    \r\n#ifdef DO_FAST_2ND_HASH\r\n\t\t// do NOT step hashCycle !\r\n\t\t//hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\r\n\t\thashTable16[ FAST_HASH_INDEX(hash2,hashCycle) ] = (U16) curpos;\r\n#endif\r\n\t\t\r\n#if FAST_HASH_DEPTH > 1\r\n\t\thashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\r\n#endif\r\n#endif\r\n\t\t\r\n\t\t//-----------------------------------\r\n\t\t\r\n\t\tconst U8 * match_start = rp;\r\n\t\trp += 4;\r\n    \r\n\t\twhile( rp < rpEndSafe )\r\n\t\t{\r\n\t\t\tUINTr big1 = readR(rp);\r\n\t\t\tUINTr big2 = readR(rp-matchOff);\r\n\t    \r\n\t\t\tif ( big1 == big2 )\r\n\t\t\t{\r\n\t\t\t\trp += RAD_PTRBYTES;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\trp += GetNumBytesZeroNeverAllR(big1^big2);  \r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\trp = RR_MIN(rp,rpMatchEnd);\r\n    \r\n\t\t//-------------------------------\r\n    // rp is now at the *end* of the match\r\n    \r\n\t\t//-------------------------------\r\n\t\t\r\n\t\t// check lazy match too\r\n#ifdef DO_FAST_LAZY_MATCH\r\n\t\tif (rp< rpEndSafe)\r\n\t\t{\r\n\t\t\tconst U8 * lazyrp = match_start + 1;\r\n\t\t\t//SINTa lazypos = rrPtrDiff(lazyrp - zeroPosPtr);\r\n\t\t\tSINTa lazypos = curpos + 1;\r\n\t\t\tRR_ASSERT( lazypos == rrPtrDiff(lazyrp - zeroPosPtr) );\r\n      \r\n\t\t\tU32 lazyrp32 = read32(lazyrp);\r\n      \r\n\t\t\tconst U8 * lazyhashrp;\t\r\n\t\t\tSINTa lazymatchOff;\t\t\t\t\t\r\n\t\t\t\r\n\t\t\tU32 lazyHash = FAST_HASH_FUNC(lazyrp, lazyrp32 );\r\n\t\t\t\r\n#ifdef DO_FAST_2ND_HASH\r\n\t\t\tU32 lazyhash2 = LZB_SecondHash4(lazyrp32) & hash_table_mask;\r\n#endif\r\n\t\t\t\r\n#if FAST_HASH_DEPTH > 1\r\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\r\n#endif\r\n\t\t\t{\t\t\t\r\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(lazyHash,d) ];\r\n\t\t\t\t\r\n\t\t\t\tlazymatchOff = (U16)(lazypos - hashpos16);\r\n\t\t\t\tRR_ASSERT( lazymatchOff >= 0 );\r\n\t\t\t\t\r\n\t\t\t\tRR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET );\r\n\t\t\t\t{\r\n\t\t\t\t\tlazyhashrp = lazyrp - lazymatchOff;\r\n          \r\n\t\t\t\t\tconst U32 hashrp32 = read32(lazyhashrp);\r\n          \r\n\t\t\t\t\tif ( lazyrp32 == hashrp32 && lazymatchOff != 0 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tgoto lazy_found_match;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n      \r\n#ifdef DO_FAST_2ND_HASH\r\n#if FAST_HASH_DEPTH > 1\r\n\t\t\tfor(int d=0;d<FAST_HASH_DEPTH;d++)\r\n#endif\r\n\t\t\t{\r\n\t\t\t\tU16 hashpos16 = hashTable16[ FAST_HASH_INDEX(lazyhash2,d) ];\r\n\t\t\t\t\r\n\t\t\t\tlazymatchOff = (U16)(lazypos - hashpos16);\r\n\t\t\t\tRR_ASSERT( lazymatchOff >= 0 );\r\n\t\t\t\t\r\n\t\t\t\tRR_ASSERT( lazymatchOff <= LZB_MAX_OFFSET );\r\n\t\t\t\t{\r\n\t\t\t\t\tlazyhashrp = lazyrp - lazymatchOff;\r\n          \r\n\t\t\t\t\tconst U32 hashrp32 = read32(lazyhashrp);\r\n          \r\n\t\t\t\t\tif ( lazyrp32 == hashrp32 && lazymatchOff != 0 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tgoto lazy_found_match;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}  \r\n#endif\r\n\t\t\t\r\n\t\t\tif ( 0 )\r\n\t\t\t{\r\n\t\t\t\tlazy_found_match:\r\n        \r\n\t\t\t\tlazyrp += 4;\r\n        \r\n\t\t\t\twhile( lazyrp < rpEndSafe )\r\n\t\t\t\t{\r\n\t\t\t\t\tUINTr big1 = readR(lazyrp);\r\n\t\t\t\t\tUINTr big2 = readR(lazyrp-lazymatchOff);\r\n\t\t\t    \r\n\t\t\t\t\tif ( big1 == big2 )\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlazyrp += RAD_PTRBYTES;\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse\r\n\t\t\t\t\t{\r\n\t\t\t\t\t\tlazyrp += GetNumBytesZeroNeverAllR(big1^big2);  \r\n\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tlazyrp = RR_MIN(lazyrp,rpMatchEnd);\r\n\t\t\t\t\r\n\t\t\t\t//S32 lazymatchLen = rrPtrDiff32( lazyrp - (match_start+1) );\r\n\t\t\t\t//RR_ASSERT( lazymatchLen >= 4 );\r\n        \r\n\t\t\t\tif ( lazyrp >= rp+3 )\r\n\t\t\t\t{\r\n\t\t\t\t\t// yes take the lazy match\r\n\t\t\t\t\t\r\n\t\t\t\t\t// put a literal :\r\n\t\t\t\t\tmatch_start++;\r\n          \r\n\t\t\t\t\t// I had a bug where lazypos was set wrong for the hash fill\r\n\t\t\t\t\t// it set it to the *end* of the normal match\r\n\t\t\t\t\t// and for some reason that helped compression WTF WTF\t\t\t\t\t\t              \r\n\t\t\t\t\t//SINTa lazypos = rrPtrDiff(rp - zeroPosPtr); // 233647528\r\n\t\t\t\t\t// with correct lazypos : 233651228\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t// really this shouldn't be necessary at all\r\n\t\t\t\t\t// because I do an update of hash at all positions in the match including first!\r\n#if 1\t // with update disabled - 233690274\t\t\t    \r\n          \r\n\t\t\t\t\thashTable16[ FAST_HASH_INDEX(lazyHash,hashCycle) ] = (U16) lazypos;\r\n          \r\n#ifdef DO_FAST_2ND_HASH\r\n\t\t\t\t\t// do NOT step hashCycle !\r\n\t\t\t\t\thashTable16[ FAST_HASH_INDEX(lazyhash2,hashCycle) ] = (U16) lazypos;\r\n#endif\r\n\t\t\t\t\t\r\n#if FAST_HASH_DEPTH > 1\r\n\t\t\t\t\thashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\r\n#endif\r\n\t\t\t\t\t\r\n#endif\r\n\t\t\t\t\t\r\n\t\t\t\t\t// and then drop out and do the lazy match :\r\n\t\t\t\t\t//matchLen = lazymatchLen;\r\n\t\t\t\t\tmatchOff = (S32)lazymatchOff;\r\n\t\t\t\t\trp = lazyrp;\r\n\t\t\t\t\thashrp = lazyhashrp;\r\n\t\t\t\t}\t\r\n\t\t\t}\r\n\t\t}\r\n#endif\t\t\t  \r\n\t\t\r\n\t\t//---------------------------------------------------\r\n    \r\n\t\t// back up start of match that we missed due to stepLiterals !\r\n\t\t// make sure we don't read off the start of the array\r\n\t\t\r\n\t\t// this costs a little speed and gains a little compression\r\n\t\t// 15662162 at 121.58 mb/s\r\n\t\t// 15776473 at 127.92 mb/s\r\n#if 1\r\n\t\t/*\r\n\t\tlzbf : 24,700,820 ->15,963,503 =  5.170 bpb =  1.547 to 1\r\n\t\tencode           : 0.171 seconds, 83.60 b/kc, rate= 144.54 M/s\r\n\t\tdecode           : 0.014 seconds, 1002.64 b/kc, rate= 1733.57 M/s\r\n\t\t*/\r\n\t\t{\r\n\t\t\t// 144 M/s\r\n\t\t\t// back up start of match that we missed\r\n\t\t\t// make sure we don't read off the start of the array\r\n\t\t\t\r\n\t\t\tconst U8 * rpm1 = match_start-1;\r\n\t\t\tif ( rpm1 >= literals_start && hashrp > zeroPosPtr && rpm1[0] == hashrp[-1] )\r\n\t\t\t{\r\n\t\t\t\trpm1--; hashrp-= 2;\r\n\t\t\t\t\r\n\t\t\t\twhile ( rpm1 >= literals_start && hashrp >= zeroPosPtr && rpm1[0] == *hashrp )\r\n\t\t\t\t{\r\n\t\t\t\t\trpm1--;\r\n\t\t\t\t\thashrp--;\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\tmatch_start = rpm1+1;\r\n\t\t\t\t//rp = RR_MAX(rp,literals_start);\r\n\t\t\t\tRR_ASSERT( match_start >= literals_start );\r\n\t\t\t}\r\n\t\t}\r\n#endif\r\n\t\t\r\n\t\tS32 matchLen = rrPtrDiff32( rp - match_start );\r\n\t\tRR_ASSERT( matchLen >= 4 );\r\n    \r\n\t\t//===============================================\r\n\t\t// chose a match\r\n\t\t//\toutput LRL (if any) and match\r\n\t\t\r\n\t\tS32 cur_lrl = rrPtrDiff32(match_start - literals_start);\r\n    \r\n\t\t// catch expansion while writing :\r\n\t\tif_unlikely ( cp+cur_lrl >= compExpandedPtr )\r\n\t\t{\r\n\t\t\treturn rawLen+1;\r\n\t\t}\r\n    \r\n\t\tcp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff);\r\n    \r\n\t\t// skip the match :\r\n\t\tliterals_start = rp;\t\t\r\n\t\t\r\n\t\tif ( rp >= rpEndSafe )\r\n\t\t\tbreak;\r\n\t\t\r\n\t\t// step & update hashes :\r\n\t\t//  (I already did cur pos)\r\n#ifdef DO_FAST_UPDATE_MATCH_HASHES\r\n\t\t// don't bother if it takes us to the end :      \r\n\t\t//\t(this check is not for speed it's to avoid the access violation)          \r\n\t\tconst U8 * ptr = match_start+1;\r\n\t\tU16 pos16 = (U16) rrPtrDiff( ptr - zeroPosPtr );\r\n\t\tfor(;ptr<rp;ptr++)\r\n\t\t{\r\n\t\t\tU32 hash_result = FAST_HASH_FUNC( ptr, read32(ptr) );\r\n\t\t\thashTable16[ FAST_HASH_INDEX(hash_result,hashCycle) ] = pos16; pos16++;\r\n\t\t\t//hashCycle = (hashCycle+1)&FAST_HASH_CYCLE_MASK;\r\n\t\t\t// helps a bit to NOT step cycle here\r\n\t\t\t//  the hash entries that come inside a match are of much lower quality\r\n\t\t}\r\n#endif\r\n\t}\r\n  \r\n\tdone:;\r\n\t\r\n\tint cur_lrl = rrPtrDiff32(rpEnd - literals_start);\r\n#if LZB_END_WITH_LITERALS\r\n\tRR_ASSERT_ALWAYS(cur_lrl > 0 );\r\n#endif\r\n  \r\n\tif ( cur_lrl > 0 )\r\n\t{\r\n\t\t// catch expansion while writing :\r\n\t\tif ( cp+cur_lrl >= compExpandedPtr )\r\n\t\t{\r\n\t\t\treturn rawLen+1;\r\n\t\t}\r\n\t\t\r\n\t\tcp = LZB_OutputLast(cp,cur_lrl,literals_start);\r\n\t}\r\n  \r\n\tSINTa compLen = rrPtrDiff( cp - (U8 *)comp );\r\n  \r\n\treturn compLen;\r\n}\r\n\r\nSINTa rr_lzb_simple_encode_fast(rr_lzb_simple_context * fh,\r\n                                const void * raw, SINTa rawLen, void * comp)\r\n{\r\n\trr_lzb_simple_context_init(fh); //,raw);\r\n  \r\n\tSINTa comp_len = rr_lzb_simple_encode_fast_sub(fh,raw,rawLen,comp);\r\n\tif ( comp_len >= rawLen )\r\n\t{\r\n\t\tmemcpy(comp,raw,rawLen);\r\n\t\treturn rawLen;\r\n\t}\r\n\treturn comp_len;\r\n}\r\n\r\n#undef FAST_HASH_DEPTH_SHIFT\r\n\r\n#undef DO_FAST_UPDATE_MATCH_HASHES\r\n#undef DO_FAST_LAZY_MATCH\r\n#undef DO_FAST_2ND_HASH  \r\n\r\n//=====================================================\r\n\r\n#define FAST_HASH_DEPTH_SHIFT\t(0)\r\n\r\n#undef FAST_MULTISTEP_LITERALS_SHIFT\r\n#define FAST_MULTISTEP_LITERALS_SHIFT\t(4)\r\n\r\n\r\n\r\n//-----------------------\r\n// derived :\r\n\r\nRR_COMPILER_ASSERT( FAST_HASH_DEPTH_SHIFT == 0 );\r\n\r\n#undef FAST_HASH_FUNC\r\n//#define FAST_HASH_FUNC(ptr,dword)\t( LZB_Hash4(dword) & hash_table_mask )\r\n#define FAST_HASH_FUNC(ptr,dword)\t( (((dword)*2654435761U)>>16) & hash_table_mask )\r\n\r\n\r\n// @@@@ ????\r\n#define LZBVF_DO_BACKUP\t0\r\n//#define LZBVF_DO_BACKUP\t1\r\n\r\n\r\nstatic SINTa rr_lzb_simple_encode_veryfast_sub(rr_lzb_simple_context * fh,\r\n                                               const void * raw, SINTa rawLen, void * comp)\r\n{\r\n\t//SIMPLEPROFILE_SCOPE_N(lzbfast_sub,rawLen);\r\n\t//THREADPROFILEFUNC();\r\n\t\r\n\tU8 * cp = (U8 *)comp;\r\n\tU8 * compExpandedPtr = cp + rawLen - 8;\r\n  \r\n\tconst U8 * rp = (const U8 *)raw;\r\n\tconst U8 * rpEnd = rp+rawLen;\r\n  \r\n\t// we can match up to rpEnd\r\n\t//\tbut matches can't start past rpEndSafe\r\n\tconst U8 * rpMatchEnd = rpEnd - LZB_END_OF_BLOCK_NO_MATCH_ZONE;\r\n\t\r\n\tconst U8 * rpEndSafe = rpMatchEnd - LZB_MML;\r\n\t\r\n\tif ( rpEndSafe <= (U8 *)raw )\r\n\t{\r\n\t\t// can't compress\r\n\t\treturn rawLen+1;\r\n\t}\r\n\t\r\n\tconst U8 * literals_start = rp;\r\n  \r\n\tU16 * hashTable16 = fh->m_hashTable;\r\n\tint hashTableSizeBits = fh->m_tableSizeBits;\r\n\tU32 hash_table_mask = (U32)((1UL<<(hashTableSizeBits)) - 1);\r\n  \r\n\tconst U8 * zeroPosPtr = (const U8 *)raw;\r\n  \r\n\t// first byte is always a literal\r\n\trp++;\r\n\t\r\n\tfor(;;)\r\n\t{   \t\t\r\n\t\tU32 rp32 = read32(rp);\r\n\t\tU32 hash = FAST_HASH_FUNC(rp, rp32 );\r\n\t\tconst U8 * hashrp;\r\n\t\tS32 matchOff;\r\n\t\tUINTr failedMatches;\r\n    \r\n\t\t// loop while no match found :\r\n\t\t\r\n\t\t// first loop with step = 1\r\n\t\t// @@\r\n\t\t//int step1count = (1<<FAST_MULTISTEP_LITERALS_SHIFT); // full count\r\n\t\tint step1count = (1<<(FAST_MULTISTEP_LITERALS_SHIFT-1)); // half count\r\n\t\twhile(step1count--)\r\n\t\t{\t\t\t    \t\t\t\t\t\r\n\t\t\tSINTa curpos = rrPtrDiff(rp - zeroPosPtr);\t\r\n\t\t\tRR_ASSERT( curpos >= 0 );\r\n\t\t\t\r\n\t\t\tU16 hashpos16 = hashTable16[hash];\r\n\t\t\thashTable16[ hash ] = (U16) curpos;\r\n\t\t\t\r\n\t\t\tmatchOff = (U16)(curpos - hashpos16);\r\n\t\t\tRR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET );\r\n\t\t\thashrp = rp - matchOff;\r\n      \r\n\t\t\tconst U32 hashrp32 = read32(hashrp);\r\n\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\r\n\t\t\t{\r\n\t\t\t\tgoto found_match;\r\n\t\t\t}\r\n      \r\n\t\t\tif ( ++rp >= rpEndSafe )\r\n\t\t\t\tgoto done;\r\n      \r\n\t\t\trp32 = read32(rp);\r\n\t\t\thash = FAST_HASH_FUNC(rp, rp32 );\r\n\t\t}\r\n\t\t\r\n\t\t// step starts at 2 :\r\n\t\tfailedMatches = (2<<FAST_MULTISTEP_LITERALS_SHIFT);\r\n    \r\n\t\tfor(;;)\t\t\r\n\t\t{\t\t\t    \t\t\r\n\t\t\tSINTa curpos = rrPtrDiff(rp - zeroPosPtr);\t\r\n\t\t\tRR_ASSERT( curpos >= 0 );\r\n\t\t\t\r\n\t\t\tU16 hashpos16 = hashTable16[hash];\r\n\t\t\thashTable16[ hash ] = (U16) curpos;\r\n      \r\n\t\t\tmatchOff = (U16)(curpos - hashpos16);\r\n\t\t\tRR_ASSERT( matchOff >= 0 && matchOff <= LZB_MAX_OFFSET );\r\n\t\t\thashrp = rp - matchOff;\r\n      \r\n\t\t\tconst U32 hashrp32 = read32(hashrp);\r\n      \r\n\t\t\tif ( rp32 == hashrp32 && matchOff != 0 )\r\n\t\t\t{\r\n\t\t\t\tgoto found_match;\r\n\t\t\t}\r\n      \r\n\t\t\tUINTr stepLiterals = (failedMatches>>FAST_MULTISTEP_LITERALS_SHIFT);\r\n\t\t\tRR_ASSERT( stepLiterals >= 1 );\r\n      \r\n\t\t\t++failedMatches;\r\n      \r\n\t\t\trp += stepLiterals;\r\n      \r\n\t\t\tif ( rp >= rpEndSafe )\r\n\t\t\t\tgoto done;\r\n      \r\n\t\t\trp32 = read32(rp);\r\n\t\t\thash = FAST_HASH_FUNC(rp, rp32 );\r\n\t\t}\r\n\t\t\r\n\t\t//-------------------------------\r\n\t\tfound_match:;\r\n    \r\n\t\t// found something\r\n    \r\n#if LZBVF_DO_BACKUP\r\n\t\t\r\n\t\t// alternative backup using counter :\r\n\t\tS32 cur_lrl = rrPtrDiff32(rp - literals_start);\r\n\t\tint neg_max_backup = - RR_MIN(cur_lrl , rrPtrDiff32(hashrp - zeroPosPtr) );\r\n\t\tint neg_backup = -1;\r\n\t\tif( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] )\r\n\t\t{\r\n\t\t\tneg_backup--;\r\n\t\t\twhile( neg_backup >= neg_max_backup && rp[neg_backup] == hashrp[neg_backup] )\r\n\t\t\t{\r\n\t\t\t\tneg_backup--;\r\n\t\t\t}\r\n\t\t\tneg_backup++;\r\n\t\t\trp += neg_backup;\r\n\t\t\tcur_lrl += neg_backup;\r\n\t\t\tRR_ASSERT( cur_lrl >= 0 );\r\n\t\t\tRR_ASSERT( cur_lrl == rrPtrDiff32(rp - literals_start) );\r\n\t\t}\r\n\t\t\r\n#else\r\n\t\t\r\n\t\tS32 cur_lrl = rrPtrDiff32(rp - literals_start);\r\n\t\t\r\n#endif\r\n    \r\n\t\t// catch expansion while writing :\r\n\t\tif_unlikely ( cp+cur_lrl >= compExpandedPtr )\r\n\t\t{\r\n\t\t\treturn rawLen+1;\r\n\t\t}\r\n\t\t\r\n\t\tRR_ASSERT( matchOff >= 1 );\r\n    \r\n\t\t//---------------------------------------\r\n\t\t// find rest of match len\r\n\t\t// save pointer to start of match\r\n\t\t// walk rp ahead to end of match\r\n\t\tconst U8 * match_start = rp;\r\n\t\trp += 4;\r\n    \r\n\t\twhile( rp < rpEndSafe )\r\n\t\t{\r\n\t\t\tUINTr big1 = readR(rp);\r\n\t\t\tUINTr big2 = readR(rp-matchOff);\r\n\t    \r\n\t\t\tif ( big1 == big2 )\r\n\t\t\t{\r\n\t\t\t\trp += RAD_PTRBYTES;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t{\r\n\t\t\t\trp += GetNumBytesZeroNeverAllR(big1^big2);  \r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\t\trp = RR_MIN(rp,rpMatchEnd);\r\n\t\tS32 matchLen = rrPtrDiff32( rp - match_start );\r\n\t\t\r\n\t\t//===============================================\r\n\t\t// chose a match\r\n\t\t//\toutput LRL (if any) and match\r\n\t\t\r\n\t\tcp = LZB_Output(cp,cur_lrl,literals_start,matchLen,matchOff);\r\n    \r\n\t\t// skip the match :\r\n\t\tliterals_start = rp;\r\n\t\t\r\n\t\tif ( rp >= rpEndSafe )\r\n\t\t\tgoto done;\t\r\n\t}\r\n\t\r\n\tdone:;\r\n\t\r\n\tint cur_lrl = rrPtrDiff32(rpEnd - literals_start);\r\n#if LZB_END_WITH_LITERALS\r\n\tRR_ASSERT_ALWAYS(cur_lrl > 0 );\r\n#endif\r\n  \r\n\tif ( cur_lrl > 0 )\r\n\t{\r\n\t\t// catch expansion while writing :\r\n\t\tif ( cp+cur_lrl >= compExpandedPtr )\r\n\t\t{\r\n\t\t\treturn rawLen+1;\r\n\t\t}\r\n\t\t\r\n\t\tcp = LZB_OutputLast(cp,cur_lrl,literals_start);\r\n\t}\r\n  \r\n\tSINTa compLen = rrPtrDiff( cp - (U8 *)comp );\r\n  \r\n\treturn compLen;\r\n}\r\n\r\nSINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * fh,\r\n                                    const void * raw, SINTa rawLen, void * comp)\r\n{\r\n\trr_lzb_simple_context_init(fh); //,raw);\r\n\t\r\n\tSINTa comp_len = rr_lzb_simple_encode_veryfast_sub(fh,raw,rawLen,comp);\r\n\tif ( comp_len >= rawLen )\r\n\t{\r\n\t\tmemcpy(comp,raw,rawLen);\r\n\t\treturn rawLen;\r\n\t}\r\n\treturn comp_len;\r\n}\r\n\r\n#undef FAST_HASH_DEPTH_SHIFT\r\n\r\n#undef DO_FAST_UPDATE_MATCH_HASHES\r\n#undef DO_FAST_LAZY_MATCH\r\n#undef DO_FAST_2ND_HASH  \r\n\r\n//=====================================================\r\n// vim:noet:sw=4:ts=4\r\n"
  },
  {
    "path": "src/third_party/rad_lzb_simple/rad_lzb_simple.h",
    "content": "#ifndef _RAD_LZB_SIMPLE_H_\r\n#define _RAD_LZB_SIMPLE_H_\r\n\r\n/*======================================================\r\n\r\nTo encode :\r\n\r\n\tSet up an rr_lzb_simple_context\r\n\t\r\n\tfill out m_tableSizeBits (14-16 is typical)\r\n\t\r\n\tallocate m_hashTable\r\n\r\n\trr_lzb_simple_context c;\r\n\tc.m_tableSizeBits = 14;\r\n\tc.m_hashTable = OODLE_MALLOC_ARRAY(U16,RR_ONE_SA<<c.m_tableSizeBits);\r\n\t\r\n\tthen call _encode\r\n\r\nNOTE :\r\n\tcompressed & raw size are not included in the encoded bytes.  You must send\r\n\tthem separately.\r\n\t\r\nNOTE :\r\n\tlzb will never expand.  comp_len is <= raw_len strictly.\r\n\tif comp_len = raw_len it indicates that the compressed bytes are just a memcpy\r\n\tof the raw bytes.  In that case you do not need to decode.\r\n\t\r\nTo decode :\r\n\r\n\tif comp_len is == raw_len, then the compressed bytes are just a copy of the \r\n\traw bytes and you could use them directly without calling decode.\r\n\t\r\n\tif you call rr_lzb_simple_decode in that case, then the compressed buffer will\r\n\tbe memcpy'd to the raw buffer\r\n\r\n===============================================================*/\r\n\r\n//~ TODO(rjf): temporary glue for building this without the shared rad code:\r\n\r\n#define __RAD64REGS__\r\n\r\n#include <stdint.h>\r\ntypedef uint8_t  U8;\r\ntypedef uint16_t U16;\r\ntypedef uint32_t U32;\r\ntypedef uint64_t U64;\r\ntypedef int8_t   S8;\r\ntypedef int16_t  S16;\r\ntypedef int32_t  S32;\r\ntypedef int64_t  S64;\r\n\r\ntypedef S64 SINTa;\r\ntypedef U64 RAD_U64;\r\ntypedef S64 RAD_S64;\r\ntypedef U32 RAD_U32;\r\ntypedef S32 RAD_S32;\r\n\r\n#define RADINLINE __inline\r\n\r\n#if defined(_MSC_VER)\r\n# define RADFORCEINLINE __forceinline\r\n#elif defined(__clang__) || defined(__GNUC__)\r\n# define RADFORCEINLINE __attribute__((always_inline))\r\n#else\r\n# error need force inline for this compiler\r\n#endif\r\n\r\n#if _MSC_VER\r\n# define RADLZB_TRAP() __debugbreak()\r\n#elif __clang__ || __GNUC__\r\n# define RADLZB_TRAP() __builtin_trap()\r\n#else\r\n# error Unknown trap intrinsic for this compiler.\r\n#endif\r\n\r\n#define RR_STRING_JOIN(arg1, arg2)              RR_STRING_JOIN_DELAY(arg1, arg2)\r\n#define RR_STRING_JOIN_DELAY(arg1, arg2)        RR_STRING_JOIN_IMMEDIATE(arg1, arg2)\r\n#define RR_STRING_JOIN_IMMEDIATE(arg1, arg2)    arg1 ## arg2\r\n\r\n#ifdef _MSC_VER\r\n#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__COUNTER__)\r\n#else\r\n#define RR_NUMBERNAME(name) RR_STRING_JOIN(name,__LINE__)\r\n#endif\r\n\r\n#define RR_COMPILER_ASSERT(exp)   typedef char RR_NUMBERNAME(_dummy_array) [ (exp) ? 1 : -1 ]\r\n\r\n#if defined(__clang__)\r\n# define Expect(expr, val) __builtin_expect((expr), (val))\r\n#else\r\n# define Expect(expr, val) (expr)\r\n#endif\r\n\r\n#define RAD_LIKELY(expr)            Expect(expr,1)\r\n#define RAD_UNLIKELY(expr)          Expect(expr,0)\r\n\r\n#define __RADLITTLEENDIAN__ 1\r\n#define RAD_PTRBYTES 8\r\n#define RR_MIN(a,b)    ( (a) < (b) ? (a) : (b) )\r\n#define RR_MAX(a,b)    ( (a) > (b) ? (a) : (b) )\r\n#define RR_ASSERT_ALWAYS(c) do{if(!(c)) {RADLZB_TRAP();}}while(0)\r\n#define RR_ASSERT(c) RR_ASSERT_ALWAYS(c)\r\n\r\n#define RR_PUT16_LE(ptr,val)       *((U16 *)(ptr)) = (U16)(val)\r\n#define RR_GET16_LE_UNALIGNED(ptr) *((const U16 *)(ptr))\r\n\r\nstatic RADINLINE U32\r\nrrCtzBytes32(U32 val)\r\n{\r\n  // Don't get fancy here. Assumes val != 0.\r\n  if (val & 0x000000ffu) return 0;\r\n  if (val & 0x0000ff00u) return 1;\r\n  if (val & 0x00ff0000u) return 2;\r\n  return 3;\r\n}\r\n\r\nstatic RADINLINE U32\r\nrrCtzBytes64(U64 val)\r\n{\r\n  U32 lo = (U32) val;\r\n  return lo ? rrCtzBytes32(lo) : 4 + rrCtzBytes32((U32) (val >> 32));\r\n}\r\n\r\n//~\r\n\r\n//---------------------\r\n\r\ntypedef struct rr_lzb_simple_context rr_lzb_simple_context;\r\nstruct rr_lzb_simple_context\r\n{\r\n\tU16\t*\tm_hashTable;\t// must be allocated to sizeof(U16)*(1<<m_tableSizeBits)\r\n\tS32\t\tm_tableSizeBits;\r\n};\r\n\r\nSINTa rr_lzb_simple_encode_fast(rr_lzb_simple_context * ctx,\r\n                                const void * raw, SINTa rawLen, void * comp);\r\n\r\nSINTa rr_lzb_simple_encode_veryfast(rr_lzb_simple_context * ctx,\r\n                                    const void * raw, SINTa rawLen, void * comp);\r\n\r\n//---------------------\r\n\r\n// rr_lzb_simple_decode returns the number of compressed bytes consumed ( == compLen)\r\nSINTa rr_lzb_simple_decode(const void * comp, SINTa compLen, void * raw, SINTa rawLen);\r\n\r\n//---------------------\r\n\r\n#endif // _RAD_LZB_SIMPLE_H_\r\n"
  },
  {
    "path": "src/third_party/radsort/radsort.h",
    "content": "// New radsort.\n\n#if !defined(RADSORT_H)\n#define RADSORT_H\n\n// To Use:\n//   Create a less_than function and then call radsort.\n//\n//   So, for an array of unsigned ints:\n//\n//     RSFORCEINLINE int int_is_before( void * elementa, void * elementb )\n//     {\n//       return *(unsigned int*)elementa < *(unsigned int*)elementb;\n//     }\n//\n//     radsort( buffer, count, int_is_before, unsigned int ); // type of each element is the last parameter\n//\n//     If you comparison function is very complicated, then you might try\n//       dropping the RSFORCEINLINE.\n\n#include <stddef.h> // for size_t\n\n#ifdef _MSC_VER\n#define RSFORCEINLINE __forceinline __declspec(safebuffers)\n#define CompilerReset(ptr) __assume(ptr)\n#else\n#define RSFORCEINLINE __attribute__((always_inline))\n#define CompilerReset(ptr)\n#endif\n\n#if defined(_x86_64) || defined( __x86_64__ ) || defined( _M_X64 ) || defined(__x86_64) || defined(_M_AMD64) || defined(__SSE__) || defined(__SSE2__) || defined(USE_SSE) \n#include <xmmintrin.h>\n#define RS_PREFETCH( addr ) _mm_prefetch( (addr), 0 )\n#endif\n\n// nonsense to make adding pointers a more convenient\n#define rsadd_ptr( ptr, ind ) (((char*)(ptr))+(ptrdiff_t)(ind))\n#define rssub_ptr( ptr, ind ) (((char*)(ptr))-(ptrdiff_t)(ind))\n#define rsadd_ptr_elements( ptr, ind ) rsadd_ptr( ptr, (ptrdiff_t)(ind)*(ptrdiff_t)element_size )\n#define rsdiff_ptr_elements( ptra, ptrb ) ( (size_t)(((char*)(ptra))-((char*)(ptrb))) / (size_t)element_size )\n\n// this is the maximum size of struct that we treat as a \"simple\" struct\ntypedef struct RS_MAX_SIMPLE_BUF { char b[32]; } RS_MAX_SIMPLE_BUF;  // todo, 64-bit\n\n\n// ==============================================================================================================\n//  swap and move utility functions\ntypedef struct bytes64 { char b[64]; } bytes64;  // copying with this turns into m512 moves (when arch is set)\ntypedef struct bytes32 { char b[32]; } bytes32;  // copying with this turns into m256 moves (when arch is set)\ntypedef struct bytes16 { char b[16]; } bytes16;  // copying with this turns into m128 moves\ntypedef struct bytes8  { char b[8];  } bytes8;\n\nstatic RSFORCEINLINE void radsortswapper( void * a, void * b, size_t size )\n{\n#define RSSWAPMEM(type) ( size >= sizeof(type) ) { type v = *(type const*)a; *(type*)a = *(type const*)b; *(type*)b = v; a=rsadd_ptr(a,sizeof(type)); b=rsadd_ptr(b,sizeof(type)); size -= sizeof(type); }\n  \n  while RSSWAPMEM(bytes64);\n  if RSSWAPMEM(bytes32);\n  if RSSWAPMEM(bytes16);\n  if RSSWAPMEM(bytes8);\n  if RSSWAPMEM(int);\n  if RSSWAPMEM(short);\n  if RSSWAPMEM(char);\n  \n#undef RSSWAPMEM\n}\n\n// since size is always constant, this big function compiles down to 4 to 12 instructions (for normal structs 4-6)\nstatic RSFORCEINLINE void radsortmover( void * a, void * b, size_t size )  \n{\n#define RSMOVEMEM(type) ( size >= sizeof(type) ) { *(type*)a = *(type const*)b; a=rsadd_ptr(a,sizeof(type)); b=rsadd_ptr(b,sizeof(type)); size -= sizeof(type); }\n  \n  while RSMOVEMEM(bytes64);\n  if RSMOVEMEM(bytes32);\n  if RSMOVEMEM(bytes16);\n  if RSMOVEMEM(bytes8);\n  if RSMOVEMEM(int);\n  if RSMOVEMEM(short);\n  if RSMOVEMEM(char);\n  \n#undef RSMOVEMEM\n}\n\n// these macros generate tiny move/swap routines that don't go through the generic function above  (mostly for debug build performance)\n#define RS_SIMPLE_SIZES _X(1) _X(2) _X(4) _X(8) _X(12) _X(16)\n#define rsmoverfunc( num )   static RSFORCEINLINE void radsortmover##num  ( void * dest, void * src, size_t element_size ) { typedef struct rs { char x[num]; } rs; *(rs*)dest = *(rs*)src; }\n#define rsswapperfunc( num ) static RSFORCEINLINE void radsortswapper##num( void * a,    void * b,   size_t element_size ) { typedef struct rs { char x[num]; } rs; rs temp; temp = *(rs*)a; *(rs*)a = *(rs*)b; *(rs*)b = temp; }\n\n#define _X rsmoverfunc\nRS_SIMPLE_SIZES\n#undef _X\n#define _X rsswapperfunc\nRS_SIMPLE_SIZES\n#undef _X\n\n#undef RS_SIMPLE_SIZES\n#undef rsmoverfunc\n#undef rsswapperfunc\n\n\n// ==============================================================================================================\n\ntypedef int is_before_func( void * elementa, void * elementb );\ntypedef void swap_func( void * elementa, void * elementb, size_t element_size );\ntypedef void move_func( void * dest, void * src, size_t size );\ntypedef void rs_small_sort_func( void * left, size_t n, size_t element_size, is_before_func * is_before, move_func * mover, void * tmp );\n\n#define radsortswapsize( size ) ( ( size == 1 ) ? radsortswapper1 : ( ( size == 2 ) ? radsortswapper2 : ( ( size == 4 ) ? radsortswapper4 : ( ( size == 8 ) ? radsortswapper8 : ( ( size == 12 ) ? radsortswapper12 : ( ( size == 16 ) ? radsortswapper16 : radsortswapper ) ) ) ) ) )\n#define radsortmovesize( size ) ( ( size == 1 ) ? radsortmover1   : ( ( size == 2 ) ? radsortmover2   : ( ( size == 4 ) ? radsortmover4   : ( ( size == 8 ) ? radsortmover8   : ( ( size == 12 ) ? radsortmover12   : ( ( size == 16 ) ? radsortmover16   : radsortmover   ) ) ) ) ) )\n\n// todo - maybe no bubble at all?\n#define RS_SMALL_FLIP_TO_INSERTION_GT_SIZE sizeof( size_t )\ntypedef struct RS_MAX_BUBBLE_BUF { char b[RS_SMALL_FLIP_TO_INSERTION_GT_SIZE]; } RS_MAX_BUBBLE_BUF; \n\n#define radsort( start, len, is_before_func ) \\\ndo { \\\nchar __rs_tmp[ sizeof( (start)[0] ) ]; \\\nradsortinternal( start, len, sizeof( (start)[0] ), \\\nis_before_func, \\\nradsortswapsize( sizeof( (start)[0] ) ), \\\nradsortmovesize( sizeof( (start)[0] ) ), \\\n( sizeof( (start)[0] ) > RS_SMALL_FLIP_TO_INSERTION_GT_SIZE ) ? radinsertionsort : radbubble2sort, \\\n( sizeof( (start)[0] ) > RS_SMALL_FLIP_TO_INSERTION_GT_SIZE ) ? RSS_FLIP_TO_SMALL_SORT_INSERTION : RSS_FLIP_TO_SMALL_SORT_BUBBLE2, \\\n&__rs_tmp \\\n); \\\n} while (0)\n#define radheapsort( start, len, is_before_func )  do { radheapsortinteral( start, len, sizeof( ((start)[0]) ), is_before_func, radsortswapsize( sizeof( ((start)[0]) ) ) ); } while (0)\n\n\n//===================================================================================================\n// small heap sort - this sort is around 200 bytes compiled - can use directly when size is important\n\nRSFORCEINLINE void radheapsortinteral( void * start, size_t len, size_t element_size, is_before_func * is_before, swap_func * swapper )\n{\n  void * left;\n  void * right;\n  size_t length;\n  \n  left = start;\n  right = rsadd_ptr_elements( start, len - 1 );\n  length = len;\n  \n  if ( length > 1 )\n  {\n    // unusual small in-place heap sort\n    void * i; void * ind; void * v; void * n;\n    size_t s, k;\n    \n    s = length >> 1;\n    i = rsadd_ptr_elements( left, s );\n    \n    for(;;)\n    {\n      --s;\n      i = rsadd_ptr_elements( i, -1 );\n      ind = i;\n      k = ( s << 1 ) + 1;\n      \n      for(;;)\n      {\n        v = rsadd_ptr_elements( left, k );\n        n = rsadd_ptr_elements( v, 1 );\n        \n        if ( ( ( n <= right ) ) && ( is_before( v, n ) ) )\n        {\n          ++k;\n          v = n;\n        }\n        \n        if ( is_before( ind, v ) )   \n        {\n          swapper( ind, v, element_size );\n          ind = v;\n          k = ( k << 1 ) + 1;\n          \n          if ( k < length )\n            continue;\n        }\n        \n        // if s is non-zero, we are still building the heap!\n        if ( s ) \n          break;\n        \n        swapper( left, right, element_size );\n        right = rsadd_ptr_elements( right, -1 );\n        ind = left;\n        k = 1;\n        --length;\n        \n        if ( length <= 1 )\n          return;\n      }\n    }\n  } \n}\n\n//===================================================================================================\n//  median routines\n\n#define rsswapsmaller( X, Y ) { RS_MAX_SIMPLE_BUF tmp; int cond; cond = is_before( &Y, &X); mover( &tmp, &X, element_size ); if ( cond ) mover( &X, &Y, element_size ); if ( cond ) mover( &Y, &tmp, element_size ); } \n\nstatic RSFORCEINLINE void radsortgetmedian5( void * output, void * left, void * right, size_t length, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover )\n{\n  RS_MAX_SIMPLE_BUF mb0,mb1,mb2,mb3,mb4; \n  \n  mover( &mb0, left, element_size ); \n  mover( &mb1, rsadd_ptr_elements( left, length >> 2 ), element_size ); \n  mover( &mb2, rsadd_ptr_elements( left, length >> 1 ), element_size ); \n  mover( &mb3, rsadd_ptr_elements( left, length - (length >> 2) ), element_size ); \n  mover( &mb4, right, element_size ); \n  \n  // Basically, for simple compares, and for simple in-register types, this funcion \n  //   must turn info 7 compares and then 5-7 movs, and 12 cmovs.  Any \n  //   compiler *should* do this - if this doesn't happen, then the compiler is \n  //   hosing you. You can put int 3s at the start and end of this function to check.\n  \n  rsswapsmaller( mb0, mb1 ); \n  rsswapsmaller( mb2, mb3 ); \n  rsswapsmaller( mb0, mb2 ); \n  rsswapsmaller( mb1, mb3 ); \n  rsswapsmaller( mb1, mb4 ); \n  rsswapsmaller( mb1, mb2 ); \n  \n  mover( output, &mb2, element_size ); \n  if ( is_before( &mb4, &mb2 ) ) mover( output, &mb4, element_size );\n}\n\n\nstatic RSFORCEINLINE void radsortgetmedian9( void * output, void * left, void * right, size_t length, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover )\n{\n  RS_MAX_SIMPLE_BUF mb0,mb1,mb2,mb3,mb4,mb5,mb6,mb7,mb8; // todo, temp mem!\n  \n#ifdef RS_PREFETCH\n  RS_PREFETCH( left ); \n  RS_PREFETCH( right ); \n  RS_PREFETCH( rsadd_ptr_elements( left, length >> 3 ) ); \n  RS_PREFETCH( rsadd_ptr_elements( left, length >> 2 ) ); \n  RS_PREFETCH( rsadd_ptr_elements( left, (length >> 1) - (length >> 3) ) ); \n  RS_PREFETCH( rsadd_ptr_elements( left, length >> 1 ) ); \n  RS_PREFETCH( rsadd_ptr_elements( left, (length >> 1) + (0 >> 3) ) ); \n  RS_PREFETCH( rsadd_ptr_elements( left, length - (length >> 2) ) ); \n  RS_PREFETCH( rsadd_ptr_elements( left, length - (length >> 3) ) ); \n#endif\n  \n  mover( &mb0, left, element_size ); \n  mover( &mb1, rsadd_ptr_elements( left, length >> 3 ), element_size ); \n  mover( &mb2, rsadd_ptr_elements( left, length >> 2 ), element_size ); \n  mover( &mb3, rsadd_ptr_elements( left, (length >> 1) - (length >> 3) ), element_size ); \n  mover( &mb4, rsadd_ptr_elements( left, length >> 1 ), element_size ); \n  mover( &mb5, rsadd_ptr_elements( left, (length >> 1) + (length >> 3) ), element_size ); \n  mover( &mb6, rsadd_ptr_elements( left, length - (length >> 2) ), element_size ); \n  mover( &mb7, rsadd_ptr_elements( left, length - (length >> 3) ), element_size ); \n  mover( &mb8, right, element_size ); \n  \n  // Basically, for simple compares, and for simple in-register types, this funcion \n  //   should turn info 19 compares and then 15-19 movs, and 36 cmovs. However,  \n  //   most compilers can only so-so job at this, and you'll end up with 3-4 jumps.\n  //   We just need cmov intrinsics.\n  \n  rsswapsmaller( mb0, mb7 ); \n  rsswapsmaller( mb1, mb2 ); \n  rsswapsmaller( mb3, mb5 ); \n  rsswapsmaller( mb4, mb8 ); \n  rsswapsmaller( mb0, mb2 ); \n  rsswapsmaller( mb1, mb5 ); \n  rsswapsmaller( mb3, mb8 ); \n  rsswapsmaller( mb4, mb7 ); \n  rsswapsmaller( mb0, mb3 ); \n  rsswapsmaller( mb1, mb4 ); \n  rsswapsmaller( mb2, mb8 ); \n  rsswapsmaller( mb5, mb7 ); \n  rsswapsmaller( mb3, mb4 ); \n  rsswapsmaller( mb5, mb6 ); \n  rsswapsmaller( mb2, mb5 ); \n  rsswapsmaller( mb4, mb6 ); \n  rsswapsmaller( mb2, mb3 ); \n  rsswapsmaller( mb4, mb5 ); \n  \n  mover( output, &mb3, element_size ); \n  if ( is_before( &mb4, &mb3 ) ) mover( output, &mb4, element_size );\n}\n\n#define RSS_USE_MEDIAN_9   1024\n\nstatic RSFORCEINLINE void radsortgetmedian( void * output, void * left, void * right, size_t length, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover )\n{\n  // get the median into copy\n  if ( length >= RSS_USE_MEDIAN_9 )\n    radsortgetmedian9( output, left, right, length, element_size, is_before, swapper, mover );\n  else\n    radsortgetmedian5( output, left, right, length, element_size, is_before, swapper, mover );\n}\n\n\n\n//===================================================================================================\n//  bubble 2 routines - for partitions <= 16 count\n\n// from Gerben Stavenga - bubble sort moving two values through at once\n//   for ints, this compiles down to 38 instructions\n#define RSS_FLIP_TO_SMALL_SORT_BUBBLE2  16\nstatic RSFORCEINLINE void radbubble2sort( void * left, size_t n, size_t element_size, is_before_func * is_before, move_func * mover, void * tmp ) \n{\n  void * i;  // todo - test with bigger blocks\n  void * s = rsadd_ptr_elements( left, 2 );\n  RS_MAX_BUBBLE_BUF x, y, z;\n  \n#define rsbubbleswap( X, Y ) { int cond; cond = is_before( &Y, &X); mover( tmp, &X, element_size ); if ( cond ) mover( &X, &Y, element_size ); if ( cond ) mover( &Y, tmp, element_size ); } \n  \n  for ( i = rsadd_ptr_elements( left, (int)n - 1 ) ; i > left ; i = rsadd_ptr_elements( i, -2 ) )\n  {\n    void * j, * jm2;\n    \n    // load x & y\n    mover( &x, left, element_size );\n    mover( &y, rsadd_ptr_elements( left, 1 ), element_size );\n    \n    // swap x & y, so that x is smaller than y    \n    rsbubbleswap( x, y );\n    \n    // for ints, this loop needs to be 4 cmps, 6 cmovs, and 5 movs\n    //  anything else will kill performance\n    \n    jm2 = left;\n    for ( j = s ; j <= i ; j = rsadd_ptr_elements( j, 1 ) )\n    {\n      // make z smaller than x and y, and the dump it to the left\n      mover( &z, j, element_size );\n      rsbubbleswap( z, x );\n      rsbubbleswap( z, y );\n      rsbubbleswap( x, y );\n      mover( jm2, &z, element_size );\n      jm2 = rsadd_ptr_elements( jm2, 1 );\n    }\n    \n    mover( rsadd_ptr_elements( i, -1 ), &x, element_size );\n    mover( i, &y, element_size );\n  }\n}\n\n#define RSS_FLIP_TO_SMALL_SORT_INSERTION  28\nstatic RSFORCEINLINE void radinsertionsort(void * start, size_t len, size_t element_size, is_before_func * is_before, move_func * mover, void * tmp ) \n{\n  void * cur;\n  void * prev;\n  \n  cur = rsadd_ptr_elements( start, 1 );\n  --len;\n  prev = start;\n  do\n  {\n    void * comp = cur;\n    if ( is_before( comp, prev ) )\n    {\n      mover( tmp, comp, element_size );\n      do\n      {\n        mover( comp, prev, element_size );\n        comp = rsadd_ptr_elements( comp, -1 );\n        if ( comp == start )\n          break;\n        prev = rsadd_ptr_elements( prev, -1 );\n      } while ( is_before( tmp, prev ) );\n      mover( comp, tmp, element_size );\n    }\n    prev = cur;\n    cur = rsadd_ptr_elements( cur, 1 );\n  } while( --len );\n}\n\n/*\ntodo\nstatic void * rs_start;\nstatic is_before_func * rs_ib;\nstatic size_t rs_es;\n\nstatic RSFORCEINLINE int rss_byte_is_before_func( void * elementa, void * elementb )\n{\n  unsigned char a = *(unsigned char*)elementa;\n  unsigned char b = *(unsigned char*)elementb;\n  size_t element_size = rs_es;\n  return rs_ib( rsadd_ptr_elements( rs_start, a ), rsadd_ptr_elements( rs_start, b ) );\n}\n\n\n// do bubble sort of offsets, and THEN do all the swaps - faster on biy structures\nstatic RSFORCEINLINE void radsortbubble2offsets( void * left, size_t n, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover ) \n{\n  static unsigned char init[16] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };\n  unsigned char offsets[16];\n  unsigned char swap[16];\n\n  radsortmover16( offsets, init, 16 );\n  radsortmover16( swap, init, 16 );\n  rs_start = left;\nrs_ib = is_before;\nrs_es = element_size;\n\n  // sort the byte offsets\n  radsortbubble2( offsets, n, 1, rss_byte_is_before_func, radsortmover1 );\n\n  // now reorder the data\n  {\n    unsigned char i;\n    void * ip = left;\n\n    for( i = 0 ; i < (unsigned char)n ; i++ )\n    {\n      unsigned char j = swap[ offsets[ i ] ];\n      if ( i != j )\n      {\n        swapper( ip, rsadd_ptr_elements( left, j ), element_size );\n        swap[ j ] = swap[ i ];\n      }\n      ip = rsadd_ptr_elements( ip, 1 );\n    }\n  }\n}\n*/\n//===================================================================================================\n\n#undef rsswapsmaller\n\n#define RSS_MAX_RECURSE        128 \n\nRSFORCEINLINE void radsortinternal( void * start, size_t len, size_t element_size, is_before_func * is_before, swap_func * swapper, move_func * mover, rs_small_sort_func * small_sort, size_t small_sort_thres, void * tmp )\n{\n  void * left;\n  size_t length;\n  \n  if ( len <= 1 )\n    return;\n  \n#if _DEBUG\n  if ( element_size > sizeof( RS_MAX_SIMPLE_BUF ) )\n    __debugbreak();\n#endif\n  \n  // stack for no recursion\n  typedef struct stks\n  {\n    void * left;\n    size_t len;\n  } stks;\n  \n  stks stk[ RSS_MAX_RECURSE ];\n  stks * stk_ptr = stk + RSS_MAX_RECURSE;\n  \n  // we use the stk_ptr to tell when to flip to heap.\n  //   when we hit the end of the stack, we heap it, so\n  //    back the start of the stack to log1.5 of len\n  length = len;\n  do {\n    --stk_ptr;\n    if ( stk_ptr == stk ) { stk_ptr = stk+1; break; }\n    length = ( length >> 1 ) + ( length >> 2 );\n  } while ( length );\n  stk_ptr[ -1 ].len = 0;\n  \n  left = start;\n  length = len;\n  \n  do\n  {\n    for(;;)\n    {\n      // if tiny, hand with insertion\n      if ( length <= small_sort_thres )\n      {\n        CompilerReset(left); // we reset the compiler before each major sort\n        small_sort( left, length, element_size, is_before, mover, tmp );\n        break;\n      }\n      else\n      {\n        // if we have hit end of our recursion stack, flip to using a heap (this prevents N^2 behavior)\n        if ( stk_ptr >= stk + RSS_MAX_RECURSE )\n        {\n          CompilerReset(left); // we reset the compiler before each major sort\n          //printf(\"heap: %d\\n\",(int)length);\n          radheapsortinteral( left, length, element_size, is_before, swapper );\n          break;\n        }\n        else\n        {\n          // partition\n          void * rightequalpiv;\n          size_t leftlen;\n          void * scan, * piv, * rend, * right;\n          \n          CompilerReset(left); // we reset the compiler before each major sort\n          \n          right = rsadd_ptr_elements( left, length - 1 );\n          \n          // check for and correct inverted blocks \n          scan = left;\n          rend = right;\n          while ( is_before( rend, scan ) )\n          {\n            swapper( rend, scan, element_size );\n            scan = rsadd_ptr_elements( scan, 1 );\n            rend = rsadd_ptr_elements( rend, -1 );\n            if ( scan >= rend ) break;\n          }\n          \n          // scan to see if the block is in order (or all the same)\n          scan = left;\n          do\n          {\n            void * next = rsadd_ptr( scan, element_size );\n            if ( is_before( next, scan ) )\n              goto doqsort;\n            scan = next;\n          } while ( scan < right );\n          // if we get out of the loop cleanly, this block is already sorted, so just fall out and do next block\n          break;\n          \n          doqsort:\n          \n          // get the median into copy\n          radsortgetmedian( tmp, left, right, length, element_size, is_before, swapper, mover );\n          \n          // if scan != left, then we have a few in order, so we can skip them all if the final is under the copy\n          if ( !is_before( scan, tmp ) )\n            scan = left;\n          // this loop should be 3 instructions\n          // skip values below the pivot at the start of the segment \n          while( is_before( scan, tmp ) ) // the pivot will stop this loop\n            scan = rsadd_ptr( scan, element_size );\n          \n          // skip values above and equal to the pivot at the end of the segment\n          rend = right;\n          if ( left == start )\n          {\n            // we have to use this loop to check that we don't read off the front of \n            //   the array this loop should be 5 instructions\n            while( rend > scan )   \n            {\n              if ( !is_before( tmp, rend ) )\n                break;\n              rend = rsadd_ptr_elements( rend, -1 );\n            }\n          }\n          else\n          {\n            // if we're not at the very start of the entire buffer, then we\n            //  can use this loop, which is only 3 instructions\n            while( is_before( tmp, rend ) ) // the pivot will stop this loop\n              rend = rsadd_ptr_elements( rend, -1 );\n          }\n          \n          // finally, do actual partitioning nanosort style - 65-70% of the \n          //   total time will be in this loop, for ints, this should be\n          //   4 movs, 2 cmps, 1 cmov, 2 add, 1 jmp - 10 instructions\n          // compilers getting this wrong is a 50-100% slowdown! You can\n          //   check the output by putting int 3s around this loop.\n          CompilerReset(scan);\n          piv = scan;\n          while( scan <= rend )\n          {\n            int adv = is_before( scan, tmp );\n            swapper( piv, scan, element_size );\n            if ( adv ) piv = rsadd_ptr( piv, element_size ); // needs to be a cmov\n            scan = rsadd_ptr( scan, element_size );\n          }\n          \n          // now move the right side to skip over all of the equal values...\n          // this loop should be 5 instructions\n          rightequalpiv = piv;\n          while ( rightequalpiv < right )\n          {\n            if ( is_before( tmp, rightequalpiv ) )\n              break;\n            rightequalpiv = rsadd_ptr_elements( rightequalpiv, 1 );\n          }\n          \n          // ok, now get the size of each half and prepare to descend\n          leftlen = rsdiff_ptr_elements( piv, left );\n          length -= rsdiff_ptr_elements( rightequalpiv, left ); \n          \n          // put the smaller segment on the stack\n          if ( length < leftlen )\n          {\n            // put small right on stack\n            stk_ptr->left = rightequalpiv;\n            stk_ptr->len = length;\n            stk_ptr += ( length > 1 );\n            length = leftlen;\n          } \n          else\n          {\n            // put small left on stack\n            stk_ptr->left = left;\n            stk_ptr->len = leftlen;\n            stk_ptr += ( leftlen > 1 );\n            left = rightequalpiv;\n            if ( length <= 1 ) break;\n          }\n        }\n      }\n    }\n    --stk_ptr;\n    left = stk_ptr->left;\n    length = stk_ptr->len;\n  } while ( length );\n}\n\n#undef rsadd_ptr\n#undef rsadd_ptr_elements\n#undef rsdiff_ptr_elements\n\n#endif // RADSORT_H\n"
  },
  {
    "path": "src/third_party/sinfl/sinfl.h",
    "content": "// NOTE: \n//  - updated library to handle 64-bit inputs\n//  - fixed a bug where on decomp would exit on blocks with zero length\n\n/*\n# Small Deflate\n`sdefl` is a small bare bone lossless compression library in ANSI C (ISO C90)\nwhich implements the Deflate (RFC 1951) compressed data format specification standard.\nIt is mainly tuned to get as much speed and compression ratio from as little code\nas needed to keep the implementation as concise as possible.\n\n## Features\n- Portable single header and source file duo written in ANSI C (ISO C90)\n- Dual license with either MIT or public domain\n- Small implementation\n    - Deflate: 525 LoC\n    - Inflate: 500 LoC\n- Webassembly:\n    - Deflate ~3.7 KB (~2.2KB compressed)\n    - Inflate ~3.6 KB (~2.2KB compressed)\n\n## Usage:\nThis file behaves differently depending on what symbols you define\nbefore including it.\n\nHeader-File mode:\nIf you do not define `SINFL_IMPLEMENTATION` before including this file, it\nwill operate in header only mode. In this mode it declares all used structs\nand the API of the library without including the implementation of the library.\n\nImplementation mode:\nIf you define `SINFL_IMPLEMENTATION` before including this file, it will\ncompile the implementation. Make sure that you only include\nthis file implementation in *one* C or C++ file to prevent collisions.\n\n### Benchmark\n\n| Compressor name         | Compression| Decompress.| Compr. size | Ratio |\n| ------------------------| -----------| -----------| ----------- | ----- |\n| miniz 1.0 -1            |   122 MB/s |   208 MB/s |    48510028 | 48.51 |\n| miniz 1.0 -6            |    27 MB/s |   260 MB/s |    36513697 | 36.51 |\n| miniz 1.0 -9            |    23 MB/s |   261 MB/s |    36460101 | 36.46 |\n| zlib 1.2.11 -1          |    72 MB/s |   307 MB/s |    42298774 | 42.30 |\n| zlib 1.2.11 -6          |    24 MB/s |   313 MB/s |    36548921 | 36.55 |\n| zlib 1.2.11 -9          |    20 MB/s |   314 MB/s |    36475792 | 36.48 |\n| sdefl 1.0 -0            |   127 MB/s |   355 MB/s |    40004116 | 39.88 |\n| sdefl 1.0 -1            |   111 MB/s |   413 MB/s |    38940674 | 38.82 |\n| sdefl 1.0 -5            |    45 MB/s |   436 MB/s |    36577183 | 36.46 |\n| sdefl 1.0 -7            |    38 MB/s |   432 MB/s |    36523781 | 36.41 |\n| libdeflate 1.3 -1       |   147 MB/s |   667 MB/s |    39597378 | 39.60 |\n| libdeflate 1.3 -6       |    69 MB/s |   689 MB/s |    36648318 | 36.65 |\n| libdeflate 1.3 -9       |    13 MB/s |   672 MB/s |    35197141 | 35.20 |\n| libdeflate 1.3 -12      |  8.13 MB/s |   670 MB/s |    35100568 | 35.10 |\n\n### Compression\nResults on the [Silesia compression corpus](http://sun.aei.polsl.pl/~sdeor/index.php?page=silesia):\n\n| File    |   Original | `sdefl 0`    | `sdefl 5`  | `sdefl 7`   |\n| --------| -----------| -------------| ---------- | ------------|\n| dickens | 10.192.446 | 4,260,187    |  3,845,261 |   3,833,657 |\n| mozilla | 51.220.480 | 20,774,706   | 19,607,009 |  19,565,867 |\n| mr      |  9.970.564 | 3,860,531    |  3,673,460 |   3,665,627 |\n| nci     | 33.553.445 | 4,030,283    |  3,094,526 |   3,006,075 |\n| ooffice |  6.152.192 | 3,320,063    |  3,186,373 |   3,183,815 |\n| osdb    | 10.085.684 | 3,919,646    |  3,649,510 |   3,649,477 |\n| reymont |  6.627.202 | 2,263,378    |  1,857,588 |   1,827,237 |\n| samba   | 21.606.400 | 6,121,797    |  5,462,670 |   5,450,762 |\n| sao     |  7.251.944 | 5,612,421    |  5,485,380 |   5,481,765 |\n| webster | 41.458.703 | 13,972,648   | 12,059,432 |  11,991,421 |\n| xml     |  5.345.280 | 886,620      |    674,009 |     662,141 |\n| x-ray   |  8.474.240 | 6,304,655    |  6,244,779 |   6,244,779 |\n\n## License\n```\n------------------------------------------------------------------------------\nThis software is available under 2 licenses -- choose whichever you prefer.\n------------------------------------------------------------------------------\nALTERNATIVE A - MIT License\nCopyright (c) 2020-2023 Micha Mettke\nPermission is hereby granted, free of charge, to any person obtaining a copy of\nthis software and associated documentation files (the \"Software\"), to deal in\nthe Software without restriction, including without limitation the rights to\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\nof the Software, and to permit persons to whom the Software is furnished to do\nso, subject to the following conditions:\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n------------------------------------------------------------------------------\nALTERNATIVE B - Public Domain (www.unlicense.org)\nThis is free and unencumbered software released into the public domain.\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\nsoftware, either in source code form or as a compiled binary, for any purpose,\ncommercial or non-commercial, and by any means.\nIn jurisdictions that recognize copyright laws, the author or authors of this\nsoftware dedicate any and all copyright interest in the software to the public\ndomain. We make this dedication for the benefit of the public at large and to\nthe detriment of our heirs and successors. We intend this dedication to be an\novert act of relinquishment in perpetuity of all present and future rights to\nthis software under copyright law.\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n------------------------------------------------------------------------------\n```\n*/\n#ifndef SINFL_H_INCLUDED\n#define SINFL_H_INCLUDED\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define SINFL_PRE_TBL_SIZE 128\n#define SINFL_LIT_TBL_SIZE 1334\n#define SINFL_OFF_TBL_SIZE 402\n\nstruct sinfl {\n  const unsigned char *bitptr;\n  const unsigned char *bitend;\n  unsigned long long bitbuf;\n  int bitcnt;\n\n  unsigned lits[SINFL_LIT_TBL_SIZE];\n  unsigned dsts[SINFL_OFF_TBL_SIZE];\n};\nextern size_t sinflate(void *out, size_t cap, const void *in, size_t size);\nextern size_t zsinflate(void *out, size_t cap, const void *in, size_t size);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* SINFL_H_INCLUDED */\n\n#ifdef SINFL_IMPLEMENTATION\n\n#include <string.h> /* memcpy, memset */\n#include <assert.h> /* assert */\n\n#if defined(__GNUC__) || defined(__clang__)\n#define sinfl_likely(x)       __builtin_expect((x),1)\n#define sinfl_unlikely(x)     __builtin_expect((x),0)\n#else\n#define sinfl_likely(x)       (x)\n#define sinfl_unlikely(x)     (x)\n#endif\n\n#ifndef SINFL_NO_SIMD\n#if defined(__arm__) || defined(__aarch64__) || defined(_M_ARM64)\n  #include <arm_neon.h>\n  #define sinfl_char16           uint8x16_t\n  #define sinfl_char16_ld(p)     vld1q_u8((const unsigned char*)(p))\n  #define sinfl_char16_str(d, v) vst1q_u8((unsigned char*)(d), v)\n  #define sinfl_char16_char(c)   vdupq_n_u8(c)\n#elif defined(__x86_64__) || defined(_WIN32) || defined(_WIN64)\n  #include <emmintrin.h>\n  #define sinfl_char16 __m128i\n  #define sinfl_char16_ld(p) _mm_loadu_si128((const __m128i *)(void*)(p))\n  #define sinfl_char16_str(d,v)  _mm_storeu_si128((__m128i*)(void*)(d), v)\n  #define sinfl_char16_char(c) _mm_set1_epi8(c)\n#else\n  #define SINFL_NO_SIMD\n#endif\n#endif\n\nstatic int\nsinfl_bsr(unsigned n) {\n#ifdef _MSC_VER\n  unsigned long r = 0;\n  _BitScanReverse(&r, n);\n  return (int)r;\n#elif defined(__GNUC__) || defined(__clang__)\n  return 31 - __builtin_clz(n);\n#endif\n}\nstatic unsigned long long\nsinfl_read64(const void *p) {\n  unsigned long long n;\n  memcpy(&n, p, 8);\n  return n;\n}\nstatic void\nsinfl_copy64(unsigned char **dst, unsigned char **src) {\n  unsigned long long n;\n  memcpy(&n, *src, 8);\n  memcpy(*dst, &n, 8);\n  *dst += 8, *src += 8;\n}\nstatic unsigned char*\nsinfl_write64(unsigned char *dst, unsigned long long w) {\n  memcpy(dst, &w, 8);\n  return dst + 8;\n}\n#ifndef SINFL_NO_SIMD\nstatic unsigned char*\nsinfl_write128(unsigned char *dst, sinfl_char16 w) {\n  sinfl_char16_str(dst, w);\n  return dst + 8;\n}\nstatic void\nsinfl_copy128(unsigned char **dst, unsigned char **src) {\n  sinfl_char16 n = sinfl_char16_ld(*src);\n  sinfl_char16_str(*dst, n);\n  *dst += 16, *src += 16;\n}\n#endif\nstatic void\nsinfl_refill(struct sinfl *s) {\n  if (s->bitend - s->bitptr >= 8) {\n    // @raysan5: original code, only those 3 lines\n    s->bitbuf |= sinfl_read64(s->bitptr) << s->bitcnt;\n    s->bitptr += (63 - s->bitcnt) >> 3;\n    s->bitcnt |= 56; /* bitcount in range [56,63] */\n  } else {\n    // @raysan5: added this case when bits remaining < 8\n    int bitswant = 63 - s->bitcnt;\n    int byteswant = bitswant >> 3;\n    int bytesuse = s->bitend - s->bitptr <= byteswant ? (int)(s->bitend - s->bitptr) : byteswant;\n    unsigned long long n = 0;\n    memcpy(&n, s->bitptr, bytesuse);\n    s->bitbuf |= n << s->bitcnt;\n    s->bitptr += bytesuse;\n    s->bitcnt += bytesuse << 3;\n  }\n}\nstatic int\nsinfl_peek(struct sinfl *s, int cnt) {\n  assert(cnt >= 0 && cnt <= 56);\n  assert(cnt <= s->bitcnt);\n  return s->bitbuf & ((1ull << cnt) - 1);\n}\nstatic void\nsinfl_eat(struct sinfl *s, int cnt) {\n  assert(cnt <= s->bitcnt);\n  s->bitbuf >>= cnt;\n  s->bitcnt -= cnt;\n}\nstatic int\nsinfl__get(struct sinfl *s, int cnt) {\n  int res = sinfl_peek(s, cnt);\n  sinfl_eat(s, cnt);\n  return res;\n}\nstatic int\nsinfl_get(struct sinfl *s, int cnt) {\n  sinfl_refill(s);\n  return sinfl__get(s, cnt);\n}\nstruct sinfl_gen {\n  int len;\n  int cnt;\n  int word;\n  short* sorted;\n};\nstatic int\nsinfl_build_tbl(struct sinfl_gen *gen, unsigned *tbl, int tbl_bits,\n                const int *cnt) {\n  int tbl_end = 0;\n  while (!(gen->cnt = cnt[gen->len])) {\n    ++gen->len;\n  }\n  tbl_end = 1 << gen->len;\n  while (gen->len <= tbl_bits) {\n    do {unsigned bit = 0;\n      tbl[gen->word] = (*gen->sorted++ << 16) | gen->len;\n      if (gen->word == tbl_end - 1) {\n        for (; gen->len < tbl_bits; gen->len++) {\n          memcpy(&tbl[tbl_end], tbl, (size_t)tbl_end * sizeof(tbl[0]));\n          tbl_end <<= 1;\n        }\n        return 1;\n      }\n      bit = 1 << sinfl_bsr((unsigned)(gen->word ^ (tbl_end - 1)));\n      gen->word &= bit - 1;\n      gen->word |= bit;\n    } while (--gen->cnt);\n    do {\n      if (++gen->len <= tbl_bits) {\n        memcpy(&tbl[tbl_end], tbl, (size_t)tbl_end * sizeof(tbl[0]));\n        tbl_end <<= 1;\n      }\n    } while (!(gen->cnt = cnt[gen->len]));\n  }\n  return 0;\n}\nstatic void\nsinfl_build_subtbl(struct sinfl_gen *gen, unsigned *tbl, int tbl_bits,\n                   const int *cnt) {\n  int sub_bits = 0;\n  int sub_start = 0;\n  int sub_prefix = -1;\n  int tbl_end = 1 << tbl_bits;\n  while (1) {\n    unsigned entry;\n    int bit, stride, i;\n    /* start new sub-table */\n    if ((gen->word & ((1 << tbl_bits)-1)) != sub_prefix) {\n      int used = 0;\n      sub_prefix = gen->word & ((1 << tbl_bits)-1);\n      sub_start = tbl_end;\n      sub_bits = gen->len - tbl_bits;\n      used = gen->cnt;\n      while (used < (1 << sub_bits)) {\n        sub_bits++;\n        used = (used << 1) + cnt[tbl_bits + sub_bits];\n      }\n      tbl_end = sub_start + (1 << sub_bits);\n      tbl[sub_prefix] = (sub_start << 16) | 0x10 | (sub_bits & 0xf);\n    }\n    /* fill sub-table */\n    entry = (*gen->sorted << 16) | ((gen->len - tbl_bits) & 0xf);\n    gen->sorted++;\n    i = sub_start + (gen->word >> tbl_bits);\n    stride = 1 << (gen->len - tbl_bits);\n    do {\n      tbl[i] = entry;\n      i += stride;\n    } while (i < tbl_end);\n    if (gen->word == (1 << gen->len)-1) {\n      return;\n    }\n    bit = 1 << sinfl_bsr(gen->word ^ ((1 << gen->len) - 1));\n    gen->word &= bit - 1;\n    gen->word |= bit;\n    gen->cnt--;\n    while (!gen->cnt) {\n      gen->cnt = cnt[++gen->len];\n    }\n  }\n}\nstatic void\nsinfl_build(unsigned *tbl, unsigned char *lens, int tbl_bits, int maxlen,\n            int symcnt) {\n  int i, used = 0;\n  short sort[288];\n  int cnt[16] = {0}, off[16]= {0};\n  struct sinfl_gen gen = {0};\n  gen.sorted = sort;\n  gen.len = 1;\n\n  for (i = 0; i < symcnt; ++i)\n    cnt[lens[i]]++;\n  off[1] = cnt[0];\n  for (i = 1; i < maxlen; ++i) {\n    off[i + 1] = off[i] + cnt[i];\n    used = (used << 1) + cnt[i];\n  }\n  used = (used << 1) + cnt[i];\n  for (i = 0; i < symcnt; ++i)\n    gen.sorted[off[lens[i]]++] = (short)i;\n  gen.sorted += off[0];\n\n  if (used < (1 << maxlen)){\n    for (i = 0; i < 1 << tbl_bits; ++i)\n      tbl[i] = (0 << 16u) | 1;\n    return;\n  }\n  if (!sinfl_build_tbl(&gen, tbl, tbl_bits, cnt)){\n    sinfl_build_subtbl(&gen, tbl, tbl_bits, cnt);\n  }\n}\nstatic int\nsinfl_decode(struct sinfl *s, const unsigned *tbl, int bit_len) {\n  int idx = sinfl_peek(s, bit_len);\n  unsigned key = tbl[idx];\n  if (key & 0x10) {\n    /* sub-table lookup */\n    int len = key & 0x0f;\n    sinfl_eat(s, bit_len);\n    idx = sinfl_peek(s, len);\n    key = tbl[((key >> 16) & 0xffff) + (unsigned)idx];\n  }\n  sinfl_eat(s, key & 0x0f);\n  return (key >> 16) & 0x0fff;\n}\nstatic size_t\nsinfl_decompress(unsigned char *out, size_t cap, const unsigned char *in, size_t size) {\n  static const unsigned char order[] = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};\n  static const short dbase[30+2] = {1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,\n      257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577};\n  static const unsigned char dbits[30+2] = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,\n      10,10,11,11,12,12,13,13,0,0};\n  static const short lbase[29+2] = {3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,\n      43,51,59,67,83,99,115,131,163,195,227,258,0,0};\n  static const unsigned char lbits[29+2] = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,\n      4,4,4,5,5,5,5,0,0,0};\n\n  const unsigned char *oe = out + cap;\n  const unsigned char *e = in + size, *o = out;\n  enum sinfl_states {hdr,stored,fixed,dyn,blk};\n  enum sinfl_states state = hdr;\n  struct sinfl s = {0};\n  int last = 0;\n\n  s.bitptr = in;\n  s.bitend = e;\n  while (1) {\n    switch (state) {\n    case hdr: {\n      /* block header */\n      int type = 0;\n      sinfl_refill(&s);\n      last = sinfl__get(&s,1);\n      type = sinfl__get(&s,2);\n\n      switch (type) {default: return (size_t)(out-o);\n      case 0x00: state = stored; break;\n      case 0x01: state = fixed; break;\n      case 0x02: state = dyn; break;}\n    } break;\n    case stored: {\n      /* uncompressed block */\n      unsigned len, nlen;\n      sinfl__get(&s,s.bitcnt & 7);\n      len = (unsigned short)sinfl__get(&s,16);\n      nlen = (unsigned short)sinfl__get(&s,16);\n      s.bitptr -= s.bitcnt / 8;\n      s.bitbuf = s.bitcnt = 0;\n\n      if ((unsigned short)len != (unsigned short)~nlen)\n        return (size_t)(out-o);\n      if (len > (e - s.bitptr))\n        return (size_t)(out-o);\n\n      memcpy(out, s.bitptr, (size_t)len);\n      s.bitptr += len, out += len;\n      if (last) return (size_t)(out-o);\n      state = hdr;\n    } break;\n    case fixed: {\n      /* fixed huffman codes */\n      int n; unsigned char lens[288+32];\n      for (n = 0; n <= 143; n++) lens[n] = 8;\n      for (n = 144; n <= 255; n++) lens[n] = 9;\n      for (n = 256; n <= 279; n++) lens[n] = 7;\n      for (n = 280; n <= 287; n++) lens[n] = 8;\n      for (n = 0; n < 32; n++) lens[288+n] = 5;\n\n      /* build lit/dist tables */\n      sinfl_build(s.lits, lens, 10, 15, 288);\n      sinfl_build(s.dsts, lens + 288, 8, 15, 32);\n      state = blk;\n    } break;\n    case dyn: {\n      /* dynamic huffman codes */\n      int n, i;\n      unsigned hlens[SINFL_PRE_TBL_SIZE];\n      unsigned char nlens[19] = {0}, lens[288+32];\n\n      sinfl_refill(&s);\n      {int nlit = 257 + sinfl__get(&s,5);\n      int ndist = 1 + sinfl__get(&s,5);\n      int nlen = 4 + sinfl__get(&s,4);\n      for (n = 0; n < nlen; n++)\n        nlens[order[n]] = (unsigned char)sinfl_get(&s,3);\n      sinfl_build(hlens, nlens, 7, 7, 19);\n\n      /* decode code lengths */\n      for (n = 0; n < nlit + ndist;) {\n        int sym = 0;\n        sinfl_refill(&s);\n        sym = sinfl_decode(&s, hlens, 7);\n        switch (sym) {default: lens[n++] = (unsigned char)sym; break;\n        case 16: for (i=3+sinfl_get(&s,2);i;i--,n++) lens[n]=lens[n-1]; break;\n        case 17: for (i=3+sinfl_get(&s,3);i;i--,n++) lens[n]=0; break;\n        case 18: for (i=11+sinfl_get(&s,7);i;i--,n++) lens[n]=0; break;}\n      }\n      /* build lit/dist tables */\n      sinfl_build(s.lits, lens, 10, 15, nlit);\n      sinfl_build(s.dsts, lens + nlit, 8, 15, ndist);\n      state = blk;}\n    } break;\n    case blk: {\n      /* decompress block */\n      while (1) {\n        int sym;\n        sinfl_refill(&s);\n        sym = sinfl_decode(&s, s.lits, 10);\n        if (sym < 256) {\n          /* literal */\n          if (sinfl_unlikely(out >= oe)) {\n            return (size_t)(out-o);\n          }\n          *out++ = (unsigned char)sym;\n          sym = sinfl_decode(&s, s.lits, 10);\n          if (sym < 256) {\n            *out++ = (unsigned char)sym;\n            continue;\n          }\n        }\n        if (sinfl_unlikely(sym == 256)) {\n          /* end of block */\n          if (last) return (size_t)(out-o);\n          state = hdr;\n          break;\n        }\n        /* match */\n        if (sym >= 286) {\n          /* length codes 286 and 287 must not appear in compressed data */\n          return (size_t)(out-o);\n        }\n        sym -= 257;\n        {int len = sinfl__get(&s, lbits[sym]) + lbase[sym];\n        int dsym = sinfl_decode(&s, s.dsts, 8);\n        int offs = sinfl__get(&s, dbits[dsym]) + dbase[dsym];\n        unsigned char *dst = out, *src = out - offs;\n        if (sinfl_unlikely(offs > (size_t)(out-o))) {\n          return (size_t)(out-o);\n        }\n        out = out + len;\n\n#ifndef SINFL_NO_SIMD\n        if (sinfl_likely(oe - out >= 16 * 3)) {\n          if (offs >= 16) {\n            /* simd copy match */\n            sinfl_copy128(&dst, &src);\n            sinfl_copy128(&dst, &src);\n            do sinfl_copy128(&dst, &src);\n            while (dst < out);\n          } else if (offs >= 8) {\n            /* word copy match */\n            sinfl_copy64(&dst, &src);\n            sinfl_copy64(&dst, &src);\n            do sinfl_copy64(&dst, &src);\n            while (dst < out);\n          } else if (offs == 1) {\n            /* rle match copying */\n            sinfl_char16 w = sinfl_char16_char(src[0]);\n            dst = sinfl_write128(dst, w);\n            dst = sinfl_write128(dst, w);\n            do dst = sinfl_write128(dst, w);\n            while (dst < out);\n          } else {\n            /* byte copy match */\n            *dst++ = *src++;\n            *dst++ = *src++;\n            do *dst++ = *src++;\n            while (dst < out);\n          }\n        }\n#else\n        if (sinfl_likely(oe - out >= 3 * 8 - 3)) {\n          if (offs >= 8) {\n            /* word copy match */\n            sinfl_copy64(&dst, &src);\n            sinfl_copy64(&dst, &src);\n            do sinfl_copy64(&dst, &src);\n            while (dst < out);\n          } else if (offs == 1) {\n            /* rle match copying */\n            unsigned int c = src[0];\n            unsigned int hw = (c << 24u) | (c << 16u) | (c << 8u) | (unsigned)c;\n            unsigned long long w = (unsigned long long)hw << 32llu | hw;\n            dst = sinfl_write64(dst, w);\n            dst = sinfl_write64(dst, w);\n            do dst = sinfl_write64(dst, w);\n            while (dst < out);\n          } else {\n            /* byte copy match */\n            *dst++ = *src++;\n            *dst++ = *src++;\n            do *dst++ = *src++;\n            while (dst < out);\n          }\n        }\n#endif\n        else {\n          *dst++ = *src++;\n          *dst++ = *src++;\n          do *dst++ = *src++;\n          while (dst < out);\n        }}\n      }\n    } break;}\n  }\n  return (size_t)(out-o);\n}\nextern size_t\nsinflate(void *out, size_t cap, const void *in, size_t size) {\n  return sinfl_decompress((unsigned char*)out, cap, (const unsigned char*)in, size);\n}\nstatic unsigned\nsinfl_adler32(unsigned adler32, const unsigned char *in, size_t in_len) {\n  const unsigned ADLER_MOD = 65521;\n  unsigned s1 = adler32 & 0xffff;\n  unsigned s2 = adler32 >> 16;\n  size_t blk_len, i;\n\n  blk_len = in_len % 5552;\n  while (in_len) {\n    for (i=0; i + 7 < blk_len; i += 8) {\n      s1 += in[0]; s2 += s1;\n      s1 += in[1]; s2 += s1;\n      s1 += in[2]; s2 += s1;\n      s1 += in[3]; s2 += s1;\n      s1 += in[4]; s2 += s1;\n      s1 += in[5]; s2 += s1;\n      s1 += in[6]; s2 += s1;\n      s1 += in[7]; s2 += s1;\n      in += 8;\n    }\n    for (; i < blk_len; ++i)\n      s1 += *in++, s2 += s1;\n    s1 %= ADLER_MOD; s2 %= ADLER_MOD;\n    in_len -= blk_len;\n    blk_len = 5552;\n  } return (unsigned)(s2 << 16) + (unsigned)s1;\n}\nextern size_t\nzsinflate(void *out, size_t cap, const void *mem, size_t size) {\n  const unsigned char *in = (const unsigned char*)mem;\n  if (size >= 6) {\n    const unsigned char *eob = in + size - 4;\n    size_t n = sinfl_decompress((unsigned char*)out, cap, in + 2u, size);\n    unsigned a = sinfl_adler32(1u, (unsigned char*)out, n);\n    unsigned h = eob[0] << 24 | eob[1] << 16 | eob[2] << 8 | eob[3] << 0;\n    return a == h ? n : -1;\n  } else {\n    return -1;\n  }\n}\n#endif\n\n"
  },
  {
    "path": "src/third_party/stb/stb_image.h",
    "content": "/* stb_image - v2.29 - public domain image loader - http://nothings.org/stb\r\n                                  no warranty implied; use at your own risk\r\n\r\n   Do this:\r\n      #define STB_IMAGE_IMPLEMENTATION\r\n   before you include this file in *one* C or C++ file to create the implementation.\r\n\r\n   // i.e. it should look like this:\r\n   #include ...\r\n   #include ...\r\n   #include ...\r\n   #define STB_IMAGE_IMPLEMENTATION\r\n   #include \"stb_image.h\"\r\n\r\n   You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.\r\n   And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free\r\n\r\n\r\n   QUICK NOTES:\r\n      Primarily of interest to game developers and other people who can\r\n          avoid problematic images and only need the trivial interface\r\n\r\n      JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)\r\n      PNG 1/2/4/8/16-bit-per-channel\r\n\r\n      TGA (not sure what subset, if a subset)\r\n      BMP non-1bpp, non-RLE\r\n      PSD (composited view only, no extra channels, 8/16 bit-per-channel)\r\n\r\n      GIF (*comp always reports as 4-channel)\r\n      HDR (radiance rgbE format)\r\n      PIC (Softimage PIC)\r\n      PNM (PPM and PGM binary only)\r\n\r\n      Animated GIF still needs a proper API, but here's one way to do it:\r\n          http://gist.github.com/urraka/685d9a6340b26b830d49\r\n\r\n      - decode from memory or through FILE (define STBI_NO_STDIO to remove code)\r\n      - decode from arbitrary I/O callbacks\r\n      - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)\r\n\r\n   Full documentation under \"DOCUMENTATION\" below.\r\n\r\n\r\nLICENSE\r\n\r\n  See end of file for license information.\r\n\r\nRECENT REVISION HISTORY:\r\n\r\n      2.29  (2023-05-xx) optimizations\r\n      2.28  (2023-01-29) many error fixes, security errors, just tons of stuff\r\n      2.27  (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes\r\n      2.26  (2020-07-13) many minor fixes\r\n      2.25  (2020-02-02) fix warnings\r\n      2.24  (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically\r\n      2.23  (2019-08-11) fix clang static analysis warning\r\n      2.22  (2019-03-04) gif fixes, fix warnings\r\n      2.21  (2019-02-25) fix typo in comment\r\n      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs\r\n      2.19  (2018-02-11) fix warning\r\n      2.18  (2018-01-30) fix warnings\r\n      2.17  (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings\r\n      2.16  (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes\r\n      2.15  (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC\r\n      2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs\r\n      2.13  (2016-12-04) experimental 16-bit API, only for PNG so far; fixes\r\n      2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes\r\n      2.11  (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64\r\n                         RGB-format JPEG; remove white matting in PSD;\r\n                         allocate large structures on the stack;\r\n                         correct channel count for PNG & BMP\r\n      2.10  (2016-01-22) avoid warning introduced in 2.09\r\n      2.09  (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED\r\n\r\n   See end of file for full revision history.\r\n\r\n\r\n ============================    Contributors    =========================\r\n\r\n Image formats                          Extensions, features\r\n    Sean Barrett (jpeg, png, bmp)          Jetro Lauha (stbi_info)\r\n    Nicolas Schulz (hdr, psd)              Martin \"SpartanJ\" Golini (stbi_info)\r\n    Jonathan Dummer (tga)                  James \"moose2000\" Brown (iPhone PNG)\r\n    Jean-Marc Lienher (gif)                Ben \"Disch\" Wenger (io callbacks)\r\n    Tom Seddon (pic)                       Omar Cornut (1/2/4-bit PNG)\r\n    Thatcher Ulrich (psd)                  Nicolas Guillemot (vertical flip)\r\n    Ken Miller (pgm, ppm)                  Richard Mitton (16-bit PSD)\r\n    github:urraka (animated gif)           Junggon Kim (PNM comments)\r\n    Christopher Forseth (animated gif)     Daniel Gibson (16-bit TGA)\r\n                                           socks-the-fox (16-bit PNG)\r\n                                           Jeremy Sawicki (handle all ImageNet JPGs)\r\n Optimizations & bugfixes                  Mikhail Morozov (1-bit BMP)\r\n    Fabian \"ryg\" Giesen                    Anael Seghezzi (is-16-bit query)\r\n    Arseny Kapoulkine                      Simon Breuss (16-bit PNM)\r\n    John-Mark Allen\r\n    Carmelo J Fdez-Aguera\r\n\r\n Bug & warning fixes\r\n    Marc LeBlanc            David Woo          Guillaume George     Martins Mozeiko\r\n    Christpher Lloyd        Jerry Jansson      Joseph Thomson       Blazej Dariusz Roszkowski\r\n    Phil Jordan                                Dave Moore           Roy Eltham\r\n    Hayaki Saito            Nathan Reed        Won Chun\r\n    Luke Graham             Johan Duparc       Nick Verigakis       the Horde3D community\r\n    Thomas Ruf              Ronny Chevalier                         github:rlyeh\r\n    Janez Zemva             John Bartholomew   Michal Cichon        github:romigrou\r\n    Jonathan Blow           Ken Hamada         Tero Hanninen        github:svdijk\r\n    Eugene Golushkov        Laurent Gomila     Cort Stratton        github:snagar\r\n    Aruelien Pocheville     Sergio Gonzalez    Thibault Reuille     github:Zelex\r\n    Cass Everitt            Ryamond Barbiero                        github:grim210\r\n    Paul Du Bois            Engin Manap        Aldo Culquicondor    github:sammyhw\r\n    Philipp Wiesemann       Dale Weiler        Oriol Ferrer Mesia   github:phprus\r\n    Josh Tobin              Neil Bickford      Matthew Gregan       github:poppolopoppo\r\n    Julian Raschke          Gregory Mullen     Christian Floisand   github:darealshinji\r\n    Baldur Karlsson         Kevin Schmidt      JR Smith             github:Michaelangel007\r\n                            Brad Weinberger    Matvey Cherevko      github:mosra\r\n    Luca Sas                Alexander Veselov  Zack Middleton       [reserved]\r\n    Ryan C. Gordon          [reserved]                              [reserved]\r\n                     DO NOT ADD YOUR NAME HERE\r\n\r\n                     Jacko Dirks\r\n\r\n  To add your name to the credits, pick a random blank space in the middle and fill it.\r\n  80% of merge conflicts on stb PRs are due to people adding their name at the end\r\n  of the credits.\r\n*/\r\n\r\n#ifndef STBI_INCLUDE_STB_IMAGE_H\r\n#define STBI_INCLUDE_STB_IMAGE_H\r\n\r\n// DOCUMENTATION\r\n//\r\n// Limitations:\r\n//    - no 12-bit-per-channel JPEG\r\n//    - no JPEGs with arithmetic coding\r\n//    - GIF always returns *comp=4\r\n//\r\n// Basic usage (see HDR discussion below for HDR usage):\r\n//    int x,y,n;\r\n//    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);\r\n//    // ... process data if not NULL ...\r\n//    // ... x = width, y = height, n = # 8-bit components per pixel ...\r\n//    // ... replace '0' with '1'..'4' to force that many components per pixel\r\n//    // ... but 'n' will always be the number that it would have been if you said 0\r\n//    stbi_image_free(data);\r\n//\r\n// Standard parameters:\r\n//    int *x                 -- outputs image width in pixels\r\n//    int *y                 -- outputs image height in pixels\r\n//    int *channels_in_file  -- outputs # of image components in image file\r\n//    int desired_channels   -- if non-zero, # of image components requested in result\r\n//\r\n// The return value from an image loader is an 'unsigned char *' which points\r\n// to the pixel data, or NULL on an allocation failure or if the image is\r\n// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,\r\n// with each pixel consisting of N interleaved 8-bit components; the first\r\n// pixel pointed to is top-left-most in the image. There is no padding between\r\n// image scanlines or between pixels, regardless of format. The number of\r\n// components N is 'desired_channels' if desired_channels is non-zero, or\r\n// *channels_in_file otherwise. If desired_channels is non-zero,\r\n// *channels_in_file has the number of components that _would_ have been\r\n// output otherwise. E.g. if you set desired_channels to 4, you will always\r\n// get RGBA output, but you can check *channels_in_file to see if it's trivially\r\n// opaque because e.g. there were only 3 channels in the source image.\r\n//\r\n// An output image with N components has the following components interleaved\r\n// in this order in each pixel:\r\n//\r\n//     N=#comp     components\r\n//       1           grey\r\n//       2           grey, alpha\r\n//       3           red, green, blue\r\n//       4           red, green, blue, alpha\r\n//\r\n// If image loading fails for any reason, the return value will be NULL,\r\n// and *x, *y, *channels_in_file will be unchanged. The function\r\n// stbi_failure_reason() can be queried for an extremely brief, end-user\r\n// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS\r\n// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly\r\n// more user-friendly ones.\r\n//\r\n// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.\r\n//\r\n// To query the width, height and component count of an image without having to\r\n// decode the full file, you can use the stbi_info family of functions:\r\n//\r\n//   int x,y,n,ok;\r\n//   ok = stbi_info(filename, &x, &y, &n);\r\n//   // returns ok=1 and sets x, y, n if image is a supported format,\r\n//   // 0 otherwise.\r\n//\r\n// Note that stb_image pervasively uses ints in its public API for sizes,\r\n// including sizes of memory buffers. This is now part of the API and thus\r\n// hard to change without causing breakage. As a result, the various image\r\n// loaders all have certain limits on image size; these differ somewhat\r\n// by format but generally boil down to either just under 2GB or just under\r\n// 1GB. When the decoded image would be larger than this, stb_image decoding\r\n// will fail.\r\n//\r\n// Additionally, stb_image will reject image files that have any of their\r\n// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,\r\n// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,\r\n// the only way to have an image with such dimensions load correctly\r\n// is for it to have a rather extreme aspect ratio. Either way, the\r\n// assumption here is that such larger images are likely to be malformed\r\n// or malicious. If you do need to load an image with individual dimensions\r\n// larger than that, and it still fits in the overall size limit, you can\r\n// #define STBI_MAX_DIMENSIONS on your own to be something larger.\r\n//\r\n// ===========================================================================\r\n//\r\n// UNICODE:\r\n//\r\n//   If compiling for Windows and you wish to use Unicode filenames, compile\r\n//   with\r\n//       #define STBI_WINDOWS_UTF8\r\n//   and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert\r\n//   Windows wchar_t filenames to utf8.\r\n//\r\n// ===========================================================================\r\n//\r\n// Philosophy\r\n//\r\n// stb libraries are designed with the following priorities:\r\n//\r\n//    1. easy to use\r\n//    2. easy to maintain\r\n//    3. good performance\r\n//\r\n// Sometimes I let \"good performance\" creep up in priority over \"easy to maintain\",\r\n// and for best performance I may provide less-easy-to-use APIs that give higher\r\n// performance, in addition to the easy-to-use ones. Nevertheless, it's important\r\n// to keep in mind that from the standpoint of you, a client of this library,\r\n// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.\r\n//\r\n// Some secondary priorities arise directly from the first two, some of which\r\n// provide more explicit reasons why performance can't be emphasized.\r\n//\r\n//    - Portable (\"ease of use\")\r\n//    - Small source code footprint (\"easy to maintain\")\r\n//    - No dependencies (\"ease of use\")\r\n//\r\n// ===========================================================================\r\n//\r\n// I/O callbacks\r\n//\r\n// I/O callbacks allow you to read from arbitrary sources, like packaged\r\n// files or some other source. Data read from callbacks are processed\r\n// through a small internal buffer (currently 128 bytes) to try to reduce\r\n// overhead.\r\n//\r\n// The three functions you must define are \"read\" (reads some bytes of data),\r\n// \"skip\" (skips some bytes of data), \"eof\" (reports if the stream is at the end).\r\n//\r\n// ===========================================================================\r\n//\r\n// SIMD support\r\n//\r\n// The JPEG decoder will try to automatically use SIMD kernels on x86 when\r\n// supported by the compiler. For ARM Neon support, you must explicitly\r\n// request it.\r\n//\r\n// (The old do-it-yourself SIMD API is no longer supported in the current\r\n// code.)\r\n//\r\n// On x86, SSE2 will automatically be used when available based on a run-time\r\n// test; if not, the generic C versions are used as a fall-back. On ARM targets,\r\n// the typical path is to have separate builds for NEON and non-NEON devices\r\n// (at least this is true for iOS and Android). Therefore, the NEON support is\r\n// toggled by a build flag: define STBI_NEON to get NEON loops.\r\n//\r\n// If for some reason you do not want to use any of SIMD code, or if\r\n// you have issues compiling it, you can disable it entirely by\r\n// defining STBI_NO_SIMD.\r\n//\r\n// ===========================================================================\r\n//\r\n// HDR image support   (disable by defining STBI_NO_HDR)\r\n//\r\n// stb_image supports loading HDR images in general, and currently the Radiance\r\n// .HDR file format specifically. You can still load any file through the existing\r\n// interface; if you attempt to load an HDR file, it will be automatically remapped\r\n// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;\r\n// both of these constants can be reconfigured through this interface:\r\n//\r\n//     stbi_hdr_to_ldr_gamma(2.2f);\r\n//     stbi_hdr_to_ldr_scale(1.0f);\r\n//\r\n// (note, do not use _inverse_ constants; stbi_image will invert them\r\n// appropriately).\r\n//\r\n// Additionally, there is a new, parallel interface for loading files as\r\n// (linear) floats to preserve the full dynamic range:\r\n//\r\n//    float *data = stbi_loadf(filename, &x, &y, &n, 0);\r\n//\r\n// If you load LDR images through this interface, those images will\r\n// be promoted to floating point values, run through the inverse of\r\n// constants corresponding to the above:\r\n//\r\n//     stbi_ldr_to_hdr_scale(1.0f);\r\n//     stbi_ldr_to_hdr_gamma(2.2f);\r\n//\r\n// Finally, given a filename (or an open file or memory block--see header\r\n// file for details) containing image data, you can query for the \"most\r\n// appropriate\" interface to use (that is, whether the image is HDR or\r\n// not), using:\r\n//\r\n//     stbi_is_hdr(char *filename);\r\n//\r\n// ===========================================================================\r\n//\r\n// iPhone PNG support:\r\n//\r\n// We optionally support converting iPhone-formatted PNGs (which store\r\n// premultiplied BGRA) back to RGB, even though they're internally encoded\r\n// differently. To enable this conversion, call\r\n// stbi_convert_iphone_png_to_rgb(1).\r\n//\r\n// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per\r\n// pixel to remove any premultiplied alpha *only* if the image file explicitly\r\n// says there's premultiplied data (currently only happens in iPhone images,\r\n// and only if iPhone convert-to-rgb processing is on).\r\n//\r\n// ===========================================================================\r\n//\r\n// ADDITIONAL CONFIGURATION\r\n//\r\n//  - You can suppress implementation of any of the decoders to reduce\r\n//    your code footprint by #defining one or more of the following\r\n//    symbols before creating the implementation.\r\n//\r\n//        STBI_NO_JPEG\r\n//        STBI_NO_PNG\r\n//        STBI_NO_BMP\r\n//        STBI_NO_PSD\r\n//        STBI_NO_TGA\r\n//        STBI_NO_GIF\r\n//        STBI_NO_HDR\r\n//        STBI_NO_PIC\r\n//        STBI_NO_PNM   (.ppm and .pgm)\r\n//\r\n//  - You can request *only* certain decoders and suppress all other ones\r\n//    (this will be more forward-compatible, as addition of new decoders\r\n//    doesn't require you to disable them explicitly):\r\n//\r\n//        STBI_ONLY_JPEG\r\n//        STBI_ONLY_PNG\r\n//        STBI_ONLY_BMP\r\n//        STBI_ONLY_PSD\r\n//        STBI_ONLY_TGA\r\n//        STBI_ONLY_GIF\r\n//        STBI_ONLY_HDR\r\n//        STBI_ONLY_PIC\r\n//        STBI_ONLY_PNM   (.ppm and .pgm)\r\n//\r\n//   - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still\r\n//     want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB\r\n//\r\n//  - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater\r\n//    than that size (in either width or height) without further processing.\r\n//    This is to let programs in the wild set an upper bound to prevent\r\n//    denial-of-service attacks on untrusted data, as one could generate a\r\n//    valid image of gigantic dimensions and force stb_image to allocate a\r\n//    huge block of memory and spend disproportionate time decoding it. By\r\n//    default this is set to (1 << 24), which is 16777216, but that's still\r\n//    very big.\r\n\r\n#ifndef STBI_NO_STDIO\r\n#include <stdio.h>\r\n#endif // STBI_NO_STDIO\r\n\r\n#define STBI_VERSION 1\r\n\r\nenum\r\n{\r\n  STBI_default = 0, // only used for desired_channels\r\n  \r\n  STBI_grey       = 1,\r\n  STBI_grey_alpha = 2,\r\n  STBI_rgb        = 3,\r\n  STBI_rgb_alpha  = 4\r\n};\r\n\r\n#include <stdlib.h>\r\ntypedef unsigned char stbi_uc;\r\ntypedef unsigned short stbi_us;\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n#ifndef STBIDEF\r\n#ifdef STB_IMAGE_STATIC\r\n#define STBIDEF static\r\n#else\r\n#define STBIDEF extern\r\n#endif\r\n#endif\r\n  \r\n  //////////////////////////////////////////////////////////////////////////////\r\n  //\r\n  // PRIMARY API - works on images of any type\r\n  //\r\n  \r\n  //\r\n  // load image by filename, open file, or memory buffer\r\n  //\r\n  \r\n  typedef struct\r\n  {\r\n    int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read\r\n    void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative\r\n    int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data\r\n  } stbi_io_callbacks;\r\n  \r\n  ////////////////////////////////////\r\n  //\r\n  // 8-bits-per-channel interface\r\n  //\r\n  \r\n  STBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *channels_in_file, int desired_channels);\r\n  STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk  , void *user, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  \r\n#ifndef STBI_NO_STDIO\r\n  STBIDEF stbi_uc *stbi_load            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  STBIDEF stbi_uc *stbi_load_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  // for stbi_load_from_file, file pointer is left pointing immediately after image\r\n#endif\r\n  \r\n#ifndef STBI_NO_GIF\r\n  STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);\r\n#endif\r\n  \r\n#ifdef STBI_WINDOWS_UTF8\r\n  STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);\r\n#endif\r\n  \r\n  ////////////////////////////////////\r\n  //\r\n  // 16-bits-per-channel interface\r\n  //\r\n  \r\n  STBIDEF stbi_us *stbi_load_16_from_memory   (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  \r\n#ifndef STBI_NO_STDIO\r\n  STBIDEF stbi_us *stbi_load_16          (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\r\n#endif\r\n  \r\n  ////////////////////////////////////\r\n  //\r\n  // float-per-channel interface\r\n  //\r\n#ifndef STBI_NO_LINEAR\r\n  STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y,  int *channels_in_file, int desired_channels);\r\n  \r\n#ifndef STBI_NO_STDIO\r\n  STBIDEF float *stbi_loadf            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);\r\n  STBIDEF float *stbi_loadf_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);\r\n#endif\r\n#endif\r\n  \r\n#ifndef STBI_NO_HDR\r\n  STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);\r\n  STBIDEF void   stbi_hdr_to_ldr_scale(float scale);\r\n#endif // STBI_NO_HDR\r\n  \r\n#ifndef STBI_NO_LINEAR\r\n  STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);\r\n  STBIDEF void   stbi_ldr_to_hdr_scale(float scale);\r\n#endif // STBI_NO_LINEAR\r\n  \r\n  // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR\r\n  STBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);\r\n  STBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);\r\n#ifndef STBI_NO_STDIO\r\n  STBIDEF int      stbi_is_hdr          (char const *filename);\r\n  STBIDEF int      stbi_is_hdr_from_file(FILE *f);\r\n#endif // STBI_NO_STDIO\r\n  \r\n  \r\n  // get a VERY brief reason for failure\r\n  // on most compilers (and ALL modern mainstream compilers) this is threadsafe\r\n  STBIDEF const char *stbi_failure_reason  (void);\r\n  \r\n  // free the loaded image -- this is just free()\r\n  STBIDEF void     stbi_image_free      (void *retval_from_stbi_load);\r\n  \r\n  // get image dimensions & components without fully decoding\r\n  STBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);\r\n  STBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);\r\n  STBIDEF int      stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);\r\n  STBIDEF int      stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);\r\n  \r\n#ifndef STBI_NO_STDIO\r\n  STBIDEF int      stbi_info               (char const *filename,     int *x, int *y, int *comp);\r\n  STBIDEF int      stbi_info_from_file     (FILE *f,                  int *x, int *y, int *comp);\r\n  STBIDEF int      stbi_is_16_bit          (char const *filename);\r\n  STBIDEF int      stbi_is_16_bit_from_file(FILE *f);\r\n#endif\r\n  \r\n  \r\n  \r\n  // for image formats that explicitly notate that they have premultiplied alpha,\r\n  // we just return the colors as stored in the file. set this flag to force\r\n  // unpremultiplication. results are undefined if the unpremultiply overflow.\r\n  STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);\r\n  \r\n  // indicate whether we should process iphone images back to canonical format,\r\n  // or just pass them through \"as-is\"\r\n  STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);\r\n  \r\n  // flip the image vertically, so the first pixel in the output array is the bottom left\r\n  STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);\r\n  \r\n  // as above, but only applies to images loaded on the thread that calls the function\r\n  // this function is only available if your compiler supports thread-local variables;\r\n  // calling it will fail to link if your compiler doesn't\r\n  STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply);\r\n  STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert);\r\n  STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);\r\n  \r\n  // ZLIB client - used by PNG, available for other purposes\r\n  \r\n  STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);\r\n  STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);\r\n  STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);\r\n  STBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\r\n  \r\n  STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);\r\n  STBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);\r\n  \r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n//\r\n//\r\n////   end header file   /////////////////////////////////////////////////////\r\n#endif // STBI_INCLUDE_STB_IMAGE_H\r\n\r\n#ifdef STB_IMAGE_IMPLEMENTATION\r\n\r\n#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \\\r\n|| defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \\\r\n|| defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \\\r\n|| defined(STBI_ONLY_ZLIB)\r\n#ifndef STBI_ONLY_JPEG\r\n#define STBI_NO_JPEG\r\n#endif\r\n#ifndef STBI_ONLY_PNG\r\n#define STBI_NO_PNG\r\n#endif\r\n#ifndef STBI_ONLY_BMP\r\n#define STBI_NO_BMP\r\n#endif\r\n#ifndef STBI_ONLY_PSD\r\n#define STBI_NO_PSD\r\n#endif\r\n#ifndef STBI_ONLY_TGA\r\n#define STBI_NO_TGA\r\n#endif\r\n#ifndef STBI_ONLY_GIF\r\n#define STBI_NO_GIF\r\n#endif\r\n#ifndef STBI_ONLY_HDR\r\n#define STBI_NO_HDR\r\n#endif\r\n#ifndef STBI_ONLY_PIC\r\n#define STBI_NO_PIC\r\n#endif\r\n#ifndef STBI_ONLY_PNM\r\n#define STBI_NO_PNM\r\n#endif\r\n#endif\r\n\r\n#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)\r\n#define STBI_NO_ZLIB\r\n#endif\r\n\r\n\r\n#include <stdarg.h>\r\n#include <stddef.h> // ptrdiff_t on osx\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <limits.h>\r\n\r\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)\r\n#include <math.h>  // ldexp, pow\r\n#endif\r\n\r\n#ifndef STBI_NO_STDIO\r\n#include <stdio.h>\r\n#endif\r\n\r\n#ifndef STBI_ASSERT\r\n#include <assert.h>\r\n#define STBI_ASSERT(x) assert(x)\r\n#endif\r\n\r\n#ifdef __cplusplus\r\n#define STBI_EXTERN extern \"C\"\r\n#else\r\n#define STBI_EXTERN extern\r\n#endif\r\n\r\n\r\n#ifndef _MSC_VER\r\n#ifdef __cplusplus\r\n#define stbi_inline inline\r\n#else\r\n#define stbi_inline\r\n#endif\r\n#else\r\n#define stbi_inline __forceinline\r\n#endif\r\n\r\n#ifndef STBI_NO_THREAD_LOCALS\r\n#if defined(__cplusplus) &&  __cplusplus >= 201103L\r\n#define STBI_THREAD_LOCAL       thread_local\r\n#elif defined(__GNUC__) && __GNUC__ < 5\r\n#define STBI_THREAD_LOCAL       __thread\r\n#elif defined(_MSC_VER)\r\n#define STBI_THREAD_LOCAL       __declspec(thread)\r\n#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)\r\n#define STBI_THREAD_LOCAL       _Thread_local\r\n#endif\r\n\r\n#ifndef STBI_THREAD_LOCAL\r\n#if defined(__GNUC__)\r\n#define STBI_THREAD_LOCAL       __thread\r\n#endif\r\n#endif\r\n#endif\r\n\r\n#if defined(_MSC_VER) || defined(__SYMBIAN32__)\r\ntypedef unsigned short stbi__uint16;\r\ntypedef   signed short stbi__int16;\r\ntypedef unsigned int   stbi__uint32;\r\ntypedef   signed int   stbi__int32;\r\n#else\r\n#include <stdint.h>\r\ntypedef uint16_t stbi__uint16;\r\ntypedef int16_t  stbi__int16;\r\ntypedef uint32_t stbi__uint32;\r\ntypedef int32_t  stbi__int32;\r\n#endif\r\n\r\n// should produce compiler error if size is wrong\r\ntypedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];\r\n\r\n#ifdef _MSC_VER\r\n#define STBI_NOTUSED(v)  (void)(v)\r\n#else\r\n#define STBI_NOTUSED(v)  (void)sizeof(v)\r\n#endif\r\n\r\n#ifdef _MSC_VER\r\n#define STBI_HAS_LROTL\r\n#endif\r\n\r\n#ifdef STBI_HAS_LROTL\r\n#define stbi_lrot(x,y)  _lrotl(x,y)\r\n#else\r\n#define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (-(y) & 31)))\r\n#endif\r\n\r\n#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))\r\n// ok\r\n#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)\r\n// ok\r\n#else\r\n#error \"Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED).\"\r\n#endif\r\n\r\n#ifndef STBI_MALLOC\r\n#define STBI_MALLOC(sz)           malloc(sz)\r\n#define STBI_REALLOC(p,newsz)     realloc(p,newsz)\r\n#define STBI_FREE(p)              free(p)\r\n#endif\r\n\r\n#ifndef STBI_REALLOC_SIZED\r\n#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)\r\n#endif\r\n\r\n// x86/x64 detection\r\n#if defined(__x86_64__) || defined(_M_X64)\r\n#define STBI__X64_TARGET\r\n#elif defined(__i386) || defined(_M_IX86)\r\n#define STBI__X86_TARGET\r\n#endif\r\n\r\n#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)\r\n// gcc doesn't support sse2 intrinsics unless you compile with -msse2,\r\n// which in turn means it gets to use SSE2 everywhere. This is unfortunate,\r\n// but previous attempts to provide the SSE2 functions with runtime\r\n// detection caused numerous issues. The way architecture extensions are\r\n// exposed in GCC/Clang is, sadly, not really suited for one-file libs.\r\n// New behavior: if compiled with -msse2, we use SSE2 without any\r\n// detection; if not, we don't use it at all.\r\n#define STBI_NO_SIMD\r\n#endif\r\n\r\n#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)\r\n// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET\r\n//\r\n// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the\r\n// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.\r\n// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not\r\n// simultaneously enabling \"-mstackrealign\".\r\n//\r\n// See https://github.com/nothings/stb/issues/81 for more information.\r\n//\r\n// So default to no SSE2 on 32-bit MinGW. If you've read this far and added\r\n// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.\r\n#define STBI_NO_SIMD\r\n#endif\r\n\r\n#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))\r\n#define STBI_SSE2\r\n#include <emmintrin.h>\r\n\r\n#if !defined(__clang__) && defined(_MSC_VER)\r\n\r\n#if _MSC_VER >= 1400  // not VC6\r\n#include <intrin.h> // __cpuid\r\nstatic int stbi__cpuid3(void)\r\n{\r\n  int info[4];\r\n  __cpuid(info,1);\r\n  return info[3];\r\n}\r\n#else\r\nstatic int stbi__cpuid3(void)\r\n{\r\n  int res;\r\n  __asm {\r\n    mov  eax,1\r\n      cpuid\r\n      mov  res,edx\r\n  }\r\n  return res;\r\n}\r\n#endif\r\n\r\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\r\n\r\n#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)\r\nstatic int stbi__sse2_available(void)\r\n{\r\n  int info3 = stbi__cpuid3();\r\n  return ((info3 >> 26) & 1) != 0;\r\n}\r\n#endif\r\n\r\n#else // assume GCC-style if not VC++\r\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\r\n\r\n#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)\r\nstatic int stbi__sse2_available(void)\r\n{\r\n  // If we're even attempting to compile this on GCC/Clang, that means\r\n  // -msse2 is on, which means the compiler is allowed to use SSE2\r\n  // instructions at will, and so are we.\r\n  return 1;\r\n}\r\n#endif\r\n\r\n#endif\r\n#endif\r\n\r\n// ARM NEON\r\n#if defined(STBI_NO_SIMD) && defined(STBI_NEON)\r\n#undef STBI_NEON\r\n#endif\r\n\r\n#ifdef STBI_NEON\r\n#include <arm_neon.h>\r\n#ifdef _MSC_VER\r\n#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name\r\n#else\r\n#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))\r\n#endif\r\n#endif\r\n\r\n#ifndef STBI_SIMD_ALIGN\r\n#define STBI_SIMD_ALIGN(type, name) type name\r\n#endif\r\n\r\n#ifndef STBI_MAX_DIMENSIONS\r\n#define STBI_MAX_DIMENSIONS (1 << 24)\r\n#endif\r\n\r\n///////////////////////////////////////////////\r\n//\r\n//  stbi__context struct and start_xxx functions\r\n\r\n// stbi__context structure is our basic context used by all images, so it\r\n// contains all the IO context, plus some basic image information\r\ntypedef struct\r\n{\r\n  stbi__uint32 img_x, img_y;\r\n  int img_n, img_out_n;\r\n  \r\n  stbi_io_callbacks io;\r\n  void *io_user_data;\r\n  \r\n  int read_from_callbacks;\r\n  int buflen;\r\n  stbi_uc buffer_start[128];\r\n  int callback_already_read;\r\n  \r\n  stbi_uc *img_buffer, *img_buffer_end;\r\n  stbi_uc *img_buffer_original, *img_buffer_original_end;\r\n} stbi__context;\r\n\r\n\r\nstatic void stbi__refill_buffer(stbi__context *s);\r\n\r\n// initialize a memory-decode context\r\nstatic void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)\r\n{\r\n  s->io.read = NULL;\r\n  s->read_from_callbacks = 0;\r\n  s->callback_already_read = 0;\r\n  s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;\r\n  s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;\r\n}\r\n\r\n// initialize a callback-based context\r\nstatic void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)\r\n{\r\n  s->io = *c;\r\n  s->io_user_data = user;\r\n  s->buflen = sizeof(s->buffer_start);\r\n  s->read_from_callbacks = 1;\r\n  s->callback_already_read = 0;\r\n  s->img_buffer = s->img_buffer_original = s->buffer_start;\r\n  stbi__refill_buffer(s);\r\n  s->img_buffer_original_end = s->img_buffer_end;\r\n}\r\n\r\n#ifndef STBI_NO_STDIO\r\n\r\nstatic int stbi__stdio_read(void *user, char *data, int size)\r\n{\r\n  return (int) fread(data,1,size,(FILE*) user);\r\n}\r\n\r\nstatic void stbi__stdio_skip(void *user, int n)\r\n{\r\n  int ch;\r\n  fseek((FILE*) user, n, SEEK_CUR);\r\n  ch = fgetc((FILE*) user);  /* have to read a byte to reset feof()'s flag */\r\n  if (ch != EOF) {\r\n    ungetc(ch, (FILE *) user);  /* push byte back onto stream if valid. */\r\n  }\r\n}\r\n\r\nstatic int stbi__stdio_eof(void *user)\r\n{\r\n  return feof((FILE*) user) || ferror((FILE *) user);\r\n}\r\n\r\nstatic stbi_io_callbacks stbi__stdio_callbacks =\r\n{\r\n  stbi__stdio_read,\r\n  stbi__stdio_skip,\r\n  stbi__stdio_eof,\r\n};\r\n\r\nstatic void stbi__start_file(stbi__context *s, FILE *f)\r\n{\r\n  stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);\r\n}\r\n\r\n//static void stop_file(stbi__context *s) { }\r\n\r\n#endif // !STBI_NO_STDIO\r\n\r\nstatic void stbi__rewind(stbi__context *s)\r\n{\r\n  // conceptually rewind SHOULD rewind to the beginning of the stream,\r\n  // but we just rewind to the beginning of the initial buffer, because\r\n  // we only use it after doing 'test', which only ever looks at at most 92 bytes\r\n  s->img_buffer = s->img_buffer_original;\r\n  s->img_buffer_end = s->img_buffer_original_end;\r\n}\r\n\r\nenum\r\n{\r\n  STBI_ORDER_RGB,\r\n  STBI_ORDER_BGR\r\n};\r\n\r\ntypedef struct\r\n{\r\n  int bits_per_channel;\r\n  int num_channels;\r\n  int channel_order;\r\n} stbi__result_info;\r\n\r\n#ifndef STBI_NO_JPEG\r\nstatic int      stbi__jpeg_test(stbi__context *s);\r\nstatic void    *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_PNG\r\nstatic int      stbi__png_test(stbi__context *s);\r\nstatic void    *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);\r\nstatic int      stbi__png_is16(stbi__context *s);\r\n#endif\r\n\r\n#ifndef STBI_NO_BMP\r\nstatic int      stbi__bmp_test(stbi__context *s);\r\nstatic void    *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_TGA\r\nstatic int      stbi__tga_test(stbi__context *s);\r\nstatic void    *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_PSD\r\nstatic int      stbi__psd_test(stbi__context *s);\r\nstatic void    *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);\r\nstatic int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);\r\nstatic int      stbi__psd_is16(stbi__context *s);\r\n#endif\r\n\r\n#ifndef STBI_NO_HDR\r\nstatic int      stbi__hdr_test(stbi__context *s);\r\nstatic float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_PIC\r\nstatic int      stbi__pic_test(stbi__context *s);\r\nstatic void    *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_GIF\r\nstatic int      stbi__gif_test(stbi__context *s);\r\nstatic void    *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic void    *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);\r\nstatic int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_PNM\r\nstatic int      stbi__pnm_test(stbi__context *s);\r\nstatic void    *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);\r\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);\r\nstatic int      stbi__pnm_is16(stbi__context *s);\r\n#endif\r\n\r\nstatic\r\n#ifdef STBI_THREAD_LOCAL\r\nSTBI_THREAD_LOCAL\r\n#endif\r\nconst char *stbi__g_failure_reason;\r\n\r\nSTBIDEF const char *stbi_failure_reason(void)\r\n{\r\n  return stbi__g_failure_reason;\r\n}\r\n\r\n#ifndef STBI_NO_FAILURE_STRINGS\r\nstatic int stbi__err(const char *str)\r\n{\r\n  stbi__g_failure_reason = str;\r\n  return 0;\r\n}\r\n#endif\r\n\r\nstatic void *stbi__malloc(size_t size)\r\n{\r\n  return STBI_MALLOC(size);\r\n}\r\n\r\n// stb_image uses ints pervasively, including for offset calculations.\r\n// therefore the largest decoded image size we can support with the\r\n// current code, even on 64-bit targets, is INT_MAX. this is not a\r\n// significant limitation for the intended use case.\r\n//\r\n// we do, however, need to make sure our size calculations don't\r\n// overflow. hence a few helper functions for size calculations that\r\n// multiply integers together, making sure that they're non-negative\r\n// and no overflow occurs.\r\n\r\n// return 1 if the sum is valid, 0 on overflow.\r\n// negative terms are considered invalid.\r\nstatic int stbi__addsizes_valid(int a, int b)\r\n{\r\n  if (b < 0) return 0;\r\n  // now 0 <= b <= INT_MAX, hence also\r\n  // 0 <= INT_MAX - b <= INTMAX.\r\n  // And \"a + b <= INT_MAX\" (which might overflow) is the\r\n  // same as a <= INT_MAX - b (no overflow)\r\n  return a <= INT_MAX - b;\r\n}\r\n\r\n// returns 1 if the product is valid, 0 on overflow.\r\n// negative factors are considered invalid.\r\nstatic int stbi__mul2sizes_valid(int a, int b)\r\n{\r\n  if (a < 0 || b < 0) return 0;\r\n  if (b == 0) return 1; // mul-by-0 is always safe\r\n  // portable way to check for no overflows in a*b\r\n  return a <= INT_MAX/b;\r\n}\r\n\r\n#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)\r\n// returns 1 if \"a*b + add\" has no negative terms/factors and doesn't overflow\r\nstatic int stbi__mad2sizes_valid(int a, int b, int add)\r\n{\r\n  return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);\r\n}\r\n#endif\r\n\r\n// returns 1 if \"a*b*c + add\" has no negative terms/factors and doesn't overflow\r\nstatic int stbi__mad3sizes_valid(int a, int b, int c, int add)\r\n{\r\n  return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&\r\n    stbi__addsizes_valid(a*b*c, add);\r\n}\r\n\r\n// returns 1 if \"a*b*c*d + add\" has no negative terms/factors and doesn't overflow\r\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)\r\nstatic int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)\r\n{\r\n  return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&\r\n    stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);\r\n}\r\n#endif\r\n\r\n#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)\r\n// mallocs with size overflow checking\r\nstatic void *stbi__malloc_mad2(int a, int b, int add)\r\n{\r\n  if (!stbi__mad2sizes_valid(a, b, add)) return NULL;\r\n  return stbi__malloc(a*b + add);\r\n}\r\n#endif\r\n\r\nstatic void *stbi__malloc_mad3(int a, int b, int c, int add)\r\n{\r\n  if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;\r\n  return stbi__malloc(a*b*c + add);\r\n}\r\n\r\n#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)\r\nstatic void *stbi__malloc_mad4(int a, int b, int c, int d, int add)\r\n{\r\n  if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;\r\n  return stbi__malloc(a*b*c*d + add);\r\n}\r\n#endif\r\n\r\n// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow.\r\nstatic int stbi__addints_valid(int a, int b)\r\n{\r\n  if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow\r\n  if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0.\r\n  return a <= INT_MAX - b;\r\n}\r\n\r\n// returns 1 if the product of two ints fits in a signed short, 0 on overflow.\r\nstatic int stbi__mul2shorts_valid(int a, int b)\r\n{\r\n  if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow\r\n  if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid\r\n  if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN\r\n  return a >= SHRT_MIN / b;\r\n}\r\n\r\n// stbi__err - error\r\n// stbi__errpf - error returning pointer to float\r\n// stbi__errpuc - error returning pointer to unsigned char\r\n\r\n#ifdef STBI_NO_FAILURE_STRINGS\r\n#define stbi__err(x,y)  0\r\n#elif defined(STBI_FAILURE_USERMSG)\r\n#define stbi__err(x,y)  stbi__err(y)\r\n#else\r\n#define stbi__err(x,y)  stbi__err(x)\r\n#endif\r\n\r\n#define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))\r\n#define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))\r\n\r\nSTBIDEF void stbi_image_free(void *retval_from_stbi_load)\r\n{\r\n  STBI_FREE(retval_from_stbi_load);\r\n}\r\n\r\n#ifndef STBI_NO_LINEAR\r\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);\r\n#endif\r\n\r\n#ifndef STBI_NO_HDR\r\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);\r\n#endif\r\n\r\nstatic int stbi__vertically_flip_on_load_global = 0;\r\n\r\nSTBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)\r\n{\r\n  stbi__vertically_flip_on_load_global = flag_true_if_should_flip;\r\n}\r\n\r\n#ifndef STBI_THREAD_LOCAL\r\n#define stbi__vertically_flip_on_load  stbi__vertically_flip_on_load_global\r\n#else\r\nstatic STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;\r\n\r\nSTBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)\r\n{\r\n  stbi__vertically_flip_on_load_local = flag_true_if_should_flip;\r\n  stbi__vertically_flip_on_load_set = 1;\r\n}\r\n\r\n#define stbi__vertically_flip_on_load  (stbi__vertically_flip_on_load_set       \\\r\n? stbi__vertically_flip_on_load_local  \\\r\n: stbi__vertically_flip_on_load_global)\r\n#endif // STBI_THREAD_LOCAL\r\n\r\nstatic void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)\r\n{\r\n  memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields\r\n  ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed\r\n  ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order\r\n  ri->num_channels = 0;\r\n  \r\n  // test the formats with a very explicit header first (at least a FOURCC\r\n  // or distinctive magic number first)\r\n#ifndef STBI_NO_PNG\r\n  if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n#ifndef STBI_NO_BMP\r\n  if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n#ifndef STBI_NO_GIF\r\n  if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n#ifndef STBI_NO_PSD\r\n  if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);\r\n#else\r\n  STBI_NOTUSED(bpc);\r\n#endif\r\n#ifndef STBI_NO_PIC\r\n  if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n  \r\n  // then the formats that can end up attempting to load with just 1 or 2\r\n  // bytes matching expectations; these are prone to false positives, so\r\n  // try them later\r\n#ifndef STBI_NO_JPEG\r\n  if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n#ifndef STBI_NO_PNM\r\n  if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n  \r\n#ifndef STBI_NO_HDR\r\n  if (stbi__hdr_test(s)) {\r\n    float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);\r\n    return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);\r\n  }\r\n#endif\r\n  \r\n#ifndef STBI_NO_TGA\r\n  // test tga last because it's a crappy test!\r\n  if (stbi__tga_test(s))\r\n    return stbi__tga_load(s,x,y,comp,req_comp, ri);\r\n#endif\r\n  \r\n  return stbi__errpuc(\"unknown image type\", \"Image not of any known type, or corrupt\");\r\n}\r\n\r\nstatic stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)\r\n{\r\n  int i;\r\n  int img_len = w * h * channels;\r\n  stbi_uc *reduced;\r\n  \r\n  reduced = (stbi_uc *) stbi__malloc(img_len);\r\n  if (reduced == NULL) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  \r\n  for (i = 0; i < img_len; ++i)\r\n    reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling\r\n  \r\n  STBI_FREE(orig);\r\n  return reduced;\r\n}\r\n\r\nstatic stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)\r\n{\r\n  int i;\r\n  int img_len = w * h * channels;\r\n  stbi__uint16 *enlarged;\r\n  \r\n  enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);\r\n  if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  \r\n  for (i = 0; i < img_len; ++i)\r\n    enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff\r\n  \r\n  STBI_FREE(orig);\r\n  return enlarged;\r\n}\r\n\r\nstatic void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)\r\n{\r\n  int row;\r\n  size_t bytes_per_row = (size_t)w * bytes_per_pixel;\r\n  stbi_uc temp[2048];\r\n  stbi_uc *bytes = (stbi_uc *)image;\r\n  \r\n  for (row = 0; row < (h>>1); row++) {\r\n    stbi_uc *row0 = bytes + row*bytes_per_row;\r\n    stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;\r\n    // swap row0 with row1\r\n    size_t bytes_left = bytes_per_row;\r\n    while (bytes_left) {\r\n      size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);\r\n      memcpy(temp, row0, bytes_copy);\r\n      memcpy(row0, row1, bytes_copy);\r\n      memcpy(row1, temp, bytes_copy);\r\n      row0 += bytes_copy;\r\n      row1 += bytes_copy;\r\n      bytes_left -= bytes_copy;\r\n    }\r\n  }\r\n}\r\n\r\n#ifndef STBI_NO_GIF\r\nstatic void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)\r\n{\r\n  int slice;\r\n  int slice_size = w * h * bytes_per_pixel;\r\n  \r\n  stbi_uc *bytes = (stbi_uc *)image;\r\n  for (slice = 0; slice < z; ++slice) {\r\n    stbi__vertical_flip(bytes, w, h, bytes_per_pixel);\r\n    bytes += slice_size;\r\n  }\r\n}\r\n#endif\r\n\r\nstatic unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__result_info ri;\r\n  void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);\r\n  \r\n  if (result == NULL)\r\n    return NULL;\r\n  \r\n  // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.\r\n  STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);\r\n  \r\n  if (ri.bits_per_channel != 8) {\r\n    result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);\r\n    ri.bits_per_channel = 8;\r\n  }\r\n  \r\n  // @TODO: move stbi__convert_format to here\r\n  \r\n  if (stbi__vertically_flip_on_load) {\r\n    int channels = req_comp ? req_comp : *comp;\r\n    stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));\r\n  }\r\n  \r\n  return (unsigned char *) result;\r\n}\r\n\r\nstatic stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__result_info ri;\r\n  void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);\r\n  \r\n  if (result == NULL)\r\n    return NULL;\r\n  \r\n  // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.\r\n  STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);\r\n  \r\n  if (ri.bits_per_channel != 16) {\r\n    result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);\r\n    ri.bits_per_channel = 16;\r\n  }\r\n  \r\n  // @TODO: move stbi__convert_format16 to here\r\n  // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision\r\n  \r\n  if (stbi__vertically_flip_on_load) {\r\n    int channels = req_comp ? req_comp : *comp;\r\n    stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));\r\n  }\r\n  \r\n  return (stbi__uint16 *) result;\r\n}\r\n\r\n#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)\r\nstatic void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  if (stbi__vertically_flip_on_load && result != NULL) {\r\n    int channels = req_comp ? req_comp : *comp;\r\n    stbi__vertical_flip(result, *x, *y, channels * sizeof(float));\r\n  }\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_STDIO\r\n\r\n#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)\r\nSTBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);\r\nSTBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);\r\n#endif\r\n\r\n#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)\r\nSTBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)\r\n{\r\n\treturn WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);\r\n}\r\n#endif\r\n\r\nstatic FILE *stbi__fopen(char const *filename, char const *mode)\r\n{\r\n  FILE *f;\r\n#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)\r\n  wchar_t wMode[64];\r\n  wchar_t wFilename[1024];\r\n\tif (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))\r\n    return 0;\r\n  \r\n\tif (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))\r\n    return 0;\r\n  \r\n#if defined(_MSC_VER) && _MSC_VER >= 1400\r\n\tif (0 != _wfopen_s(&f, wFilename, wMode))\r\n\t\tf = 0;\r\n#else\r\n  f = _wfopen(wFilename, wMode);\r\n#endif\r\n  \r\n#elif defined(_MSC_VER) && _MSC_VER >= 1400\r\n  if (0 != fopen_s(&f, filename, mode))\r\n    f=0;\r\n#else\r\n  f = fopen(filename, mode);\r\n#endif\r\n  return f;\r\n}\r\n\r\n\r\nSTBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  FILE *f = stbi__fopen(filename, \"rb\");\r\n  unsigned char *result;\r\n  if (!f) return stbi__errpuc(\"can't fopen\", \"Unable to open file\");\r\n  result = stbi_load_from_file(f,x,y,comp,req_comp);\r\n  fclose(f);\r\n  return result;\r\n}\r\n\r\nSTBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  unsigned char *result;\r\n  stbi__context s;\r\n  stbi__start_file(&s,f);\r\n  result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);\r\n  if (result) {\r\n    // need to 'unget' all the characters in the IO buffer\r\n    fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);\r\n  }\r\n  return result;\r\n}\r\n\r\nSTBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__uint16 *result;\r\n  stbi__context s;\r\n  stbi__start_file(&s,f);\r\n  result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);\r\n  if (result) {\r\n    // need to 'unget' all the characters in the IO buffer\r\n    fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);\r\n  }\r\n  return result;\r\n}\r\n\r\nSTBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  FILE *f = stbi__fopen(filename, \"rb\");\r\n  stbi__uint16 *result;\r\n  if (!f) return (stbi_us *) stbi__errpuc(\"can't fopen\", \"Unable to open file\");\r\n  result = stbi_load_from_file_16(f,x,y,comp,req_comp);\r\n  fclose(f);\r\n  return result;\r\n}\r\n\r\n\r\n#endif //!STBI_NO_STDIO\r\n\r\nSTBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)\r\n{\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);\r\n}\r\n\r\nSTBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)\r\n{\r\n  stbi__context s;\r\n  stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);\r\n  return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);\r\n}\r\n\r\nSTBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);\r\n}\r\n\r\nSTBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\r\n  return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);\r\n}\r\n\r\n#ifndef STBI_NO_GIF\r\nSTBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)\r\n{\r\n  unsigned char *result;\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  \r\n  result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);\r\n  if (stbi__vertically_flip_on_load) {\r\n    stbi__vertical_flip_slices( result, *x, *y, *z, *comp );\r\n  }\r\n  \r\n  return result;\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_LINEAR\r\nstatic float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  unsigned char *data;\r\n#ifndef STBI_NO_HDR\r\n  if (stbi__hdr_test(s)) {\r\n    stbi__result_info ri;\r\n    float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);\r\n    if (hdr_data)\r\n      stbi__float_postprocess(hdr_data,x,y,comp,req_comp);\r\n    return hdr_data;\r\n  }\r\n#endif\r\n  data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);\r\n  if (data)\r\n    return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);\r\n  return stbi__errpf(\"unknown image type\", \"Image not of any known type, or corrupt\");\r\n}\r\n\r\nSTBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  return stbi__loadf_main(&s,x,y,comp,req_comp);\r\n}\r\n\r\nSTBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\r\n  return stbi__loadf_main(&s,x,y,comp,req_comp);\r\n}\r\n\r\n#ifndef STBI_NO_STDIO\r\nSTBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  float *result;\r\n  FILE *f = stbi__fopen(filename, \"rb\");\r\n  if (!f) return stbi__errpf(\"can't fopen\", \"Unable to open file\");\r\n  result = stbi_loadf_from_file(f,x,y,comp,req_comp);\r\n  fclose(f);\r\n  return result;\r\n}\r\n\r\nSTBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_file(&s,f);\r\n  return stbi__loadf_main(&s,x,y,comp,req_comp);\r\n}\r\n#endif // !STBI_NO_STDIO\r\n\r\n#endif // !STBI_NO_LINEAR\r\n\r\n// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is\r\n// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always\r\n// reports false!\r\n\r\nSTBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)\r\n{\r\n#ifndef STBI_NO_HDR\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  return stbi__hdr_test(&s);\r\n#else\r\n  STBI_NOTUSED(buffer);\r\n  STBI_NOTUSED(len);\r\n  return 0;\r\n#endif\r\n}\r\n\r\n#ifndef STBI_NO_STDIO\r\nSTBIDEF int      stbi_is_hdr          (char const *filename)\r\n{\r\n  FILE *f = stbi__fopen(filename, \"rb\");\r\n  int result=0;\r\n  if (f) {\r\n    result = stbi_is_hdr_from_file(f);\r\n    fclose(f);\r\n  }\r\n  return result;\r\n}\r\n\r\nSTBIDEF int stbi_is_hdr_from_file(FILE *f)\r\n{\r\n#ifndef STBI_NO_HDR\r\n  long pos = ftell(f);\r\n  int res;\r\n  stbi__context s;\r\n  stbi__start_file(&s,f);\r\n  res = stbi__hdr_test(&s);\r\n  fseek(f, pos, SEEK_SET);\r\n  return res;\r\n#else\r\n  STBI_NOTUSED(f);\r\n  return 0;\r\n#endif\r\n}\r\n#endif // !STBI_NO_STDIO\r\n\r\nSTBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)\r\n{\r\n#ifndef STBI_NO_HDR\r\n  stbi__context s;\r\n  stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);\r\n  return stbi__hdr_test(&s);\r\n#else\r\n  STBI_NOTUSED(clbk);\r\n  STBI_NOTUSED(user);\r\n  return 0;\r\n#endif\r\n}\r\n\r\n#ifndef STBI_NO_LINEAR\r\nstatic float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;\r\n\r\nSTBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }\r\nSTBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }\r\n#endif\r\n\r\nstatic float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;\r\n\r\nSTBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }\r\nSTBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }\r\n\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n//\r\n// Common code used by all image loaders\r\n//\r\n\r\nenum\r\n{\r\n  STBI__SCAN_load=0,\r\n  STBI__SCAN_type,\r\n  STBI__SCAN_header\r\n};\r\n\r\nstatic void stbi__refill_buffer(stbi__context *s)\r\n{\r\n  int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);\r\n  s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);\r\n  if (n == 0) {\r\n    // at end of file, treat same as if from memory, but need to handle case\r\n    // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file\r\n    s->read_from_callbacks = 0;\r\n    s->img_buffer = s->buffer_start;\r\n    s->img_buffer_end = s->buffer_start+1;\r\n    *s->img_buffer = 0;\r\n  } else {\r\n    s->img_buffer = s->buffer_start;\r\n    s->img_buffer_end = s->buffer_start + n;\r\n  }\r\n}\r\n\r\nstbi_inline static stbi_uc stbi__get8(stbi__context *s)\r\n{\r\n  if (s->img_buffer < s->img_buffer_end)\r\n    return *s->img_buffer++;\r\n  if (s->read_from_callbacks) {\r\n    stbi__refill_buffer(s);\r\n    return *s->img_buffer++;\r\n  }\r\n  return 0;\r\n}\r\n\r\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)\r\n// nothing\r\n#else\r\nstbi_inline static int stbi__at_eof(stbi__context *s)\r\n{\r\n  if (s->io.read) {\r\n    if (!(s->io.eof)(s->io_user_data)) return 0;\r\n    // if feof() is true, check if buffer = end\r\n    // special case: we've only got the special 0 character at the end\r\n    if (s->read_from_callbacks == 0) return 1;\r\n  }\r\n  \r\n  return s->img_buffer >= s->img_buffer_end;\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)\r\n// nothing\r\n#else\r\nstatic void stbi__skip(stbi__context *s, int n)\r\n{\r\n  if (n == 0) return;  // already there!\r\n  if (n < 0) {\r\n    s->img_buffer = s->img_buffer_end;\r\n    return;\r\n  }\r\n  if (s->io.read) {\r\n    int blen = (int) (s->img_buffer_end - s->img_buffer);\r\n    if (blen < n) {\r\n      s->img_buffer = s->img_buffer_end;\r\n      (s->io.skip)(s->io_user_data, n - blen);\r\n      return;\r\n    }\r\n  }\r\n  s->img_buffer += n;\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)\r\n// nothing\r\n#else\r\nstatic int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)\r\n{\r\n  if (s->io.read) {\r\n    int blen = (int) (s->img_buffer_end - s->img_buffer);\r\n    if (blen < n) {\r\n      int res, count;\r\n      \r\n      memcpy(buffer, s->img_buffer, blen);\r\n      \r\n      count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);\r\n      res = (count == (n-blen));\r\n      s->img_buffer = s->img_buffer_end;\r\n      return res;\r\n    }\r\n  }\r\n  \r\n  if (s->img_buffer+n <= s->img_buffer_end) {\r\n    memcpy(buffer, s->img_buffer, n);\r\n    s->img_buffer += n;\r\n    return 1;\r\n  } else\r\n    return 0;\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)\r\n// nothing\r\n#else\r\nstatic int stbi__get16be(stbi__context *s)\r\n{\r\n  int z = stbi__get8(s);\r\n  return (z << 8) + stbi__get8(s);\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)\r\n// nothing\r\n#else\r\nstatic stbi__uint32 stbi__get32be(stbi__context *s)\r\n{\r\n  stbi__uint32 z = stbi__get16be(s);\r\n  return (z << 16) + stbi__get16be(s);\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)\r\n// nothing\r\n#else\r\nstatic int stbi__get16le(stbi__context *s)\r\n{\r\n  int z = stbi__get8(s);\r\n  return z + (stbi__get8(s) << 8);\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_BMP\r\nstatic stbi__uint32 stbi__get32le(stbi__context *s)\r\n{\r\n  stbi__uint32 z = stbi__get16le(s);\r\n  z += (stbi__uint32)stbi__get16le(s) << 16;\r\n  return z;\r\n}\r\n#endif\r\n\r\n#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings\r\n\r\n#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)\r\n// nothing\r\n#else\r\n//////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  generic converter from built-in img_n to req_comp\r\n//    individual types do this automatically as much as possible (e.g. jpeg\r\n//    does all cases internally since it needs to colorspace convert anyway,\r\n//    and it never has alpha, so very few cases ). png can automatically\r\n//    interleave an alpha=255 channel, but falls back to this for other cases\r\n//\r\n//  assume data buffer is malloced, so malloc a new one and free that one\r\n//  only failure mode is malloc failing\r\n\r\nstatic stbi_uc stbi__compute_y(int r, int g, int b)\r\n{\r\n  return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)\r\n// nothing\r\n#else\r\nstatic unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)\r\n{\r\n  int i,j;\r\n  unsigned char *good;\r\n  \r\n  if (req_comp == img_n) return data;\r\n  STBI_ASSERT(req_comp >= 1 && req_comp <= 4);\r\n  \r\n  good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);\r\n  if (good == NULL) {\r\n    STBI_FREE(data);\r\n    return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  }\r\n  \r\n  for (j=0; j < (int) y; ++j) {\r\n    unsigned char *src  = data + j * x * img_n   ;\r\n    unsigned char *dest = good + j * x * req_comp;\r\n    \r\n#define STBI__COMBO(a,b)  ((a)*8+(b))\r\n#define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\r\n    // convert source image with img_n components to one with req_comp components;\r\n    // avoid switch per pixel, so use switch per scanline and massive macros\r\n    switch (STBI__COMBO(img_n, req_comp)) {\r\n      STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255;                                     } break;\r\n      STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;\r\n      STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255;                     } break;\r\n      STBI__CASE(2,1) { dest[0]=src[0];                                                  } break;\r\n      STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;\r\n      STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } break;\r\n      STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255;        } break;\r\n      STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;\r\n      STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255;    } break;\r\n      STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;\r\n      STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;\r\n      STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                    } break;\r\n      default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc(\"unsupported\", \"Unsupported format conversion\");\r\n    }\r\n#undef STBI__CASE\r\n  }\r\n  \r\n  STBI_FREE(data);\r\n  return good;\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)\r\n// nothing\r\n#else\r\nstatic stbi__uint16 stbi__compute_y_16(int r, int g, int b)\r\n{\r\n  return (stbi__uint16) (((r*77) + (g*150) +  (29*b)) >> 8);\r\n}\r\n#endif\r\n\r\n#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)\r\n// nothing\r\n#else\r\nstatic stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)\r\n{\r\n  int i,j;\r\n  stbi__uint16 *good;\r\n  \r\n  if (req_comp == img_n) return data;\r\n  STBI_ASSERT(req_comp >= 1 && req_comp <= 4);\r\n  \r\n  good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);\r\n  if (good == NULL) {\r\n    STBI_FREE(data);\r\n    return (stbi__uint16 *) stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  }\r\n  \r\n  for (j=0; j < (int) y; ++j) {\r\n    stbi__uint16 *src  = data + j * x * img_n   ;\r\n    stbi__uint16 *dest = good + j * x * req_comp;\r\n    \r\n#define STBI__COMBO(a,b)  ((a)*8+(b))\r\n#define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)\r\n    // convert source image with img_n components to one with req_comp components;\r\n    // avoid switch per pixel, so use switch per scanline and massive macros\r\n    switch (STBI__COMBO(img_n, req_comp)) {\r\n      STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff;                                     } break;\r\n      STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;\r\n      STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff;                     } break;\r\n      STBI__CASE(2,1) { dest[0]=src[0];                                                     } break;\r\n      STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;\r\n      STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                     } break;\r\n      STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff;        } break;\r\n      STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;\r\n      STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;\r\n      STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;\r\n      STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;\r\n      STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                       } break;\r\n      default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc(\"unsupported\", \"Unsupported format conversion\");\r\n    }\r\n#undef STBI__CASE\r\n  }\r\n  \r\n  STBI_FREE(data);\r\n  return good;\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_LINEAR\r\nstatic float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)\r\n{\r\n  int i,k,n;\r\n  float *output;\r\n  if (!data) return NULL;\r\n  output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);\r\n  if (output == NULL) { STBI_FREE(data); return stbi__errpf(\"outofmem\", \"Out of memory\"); }\r\n  // compute number of non-alpha components\r\n  if (comp & 1) n = comp; else n = comp-1;\r\n  for (i=0; i < x*y; ++i) {\r\n    for (k=0; k < n; ++k) {\r\n      output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);\r\n    }\r\n  }\r\n  if (n < comp) {\r\n    for (i=0; i < x*y; ++i) {\r\n      output[i*comp + n] = data[i*comp + n]/255.0f;\r\n    }\r\n  }\r\n  STBI_FREE(data);\r\n  return output;\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_HDR\r\n#define stbi__float2int(x)   ((int) (x))\r\nstatic stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)\r\n{\r\n  int i,k,n;\r\n  stbi_uc *output;\r\n  if (!data) return NULL;\r\n  output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);\r\n  if (output == NULL) { STBI_FREE(data); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\r\n  // compute number of non-alpha components\r\n  if (comp & 1) n = comp; else n = comp-1;\r\n  for (i=0; i < x*y; ++i) {\r\n    for (k=0; k < n; ++k) {\r\n      float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;\r\n      if (z < 0) z = 0;\r\n      if (z > 255) z = 255;\r\n      output[i*comp + k] = (stbi_uc) stbi__float2int(z);\r\n    }\r\n    if (k < comp) {\r\n      float z = data[i*comp+k] * 255 + 0.5f;\r\n      if (z < 0) z = 0;\r\n      if (z > 255) z = 255;\r\n      output[i*comp + k] = (stbi_uc) stbi__float2int(z);\r\n    }\r\n  }\r\n  STBI_FREE(data);\r\n  return output;\r\n}\r\n#endif\r\n\r\n//////////////////////////////////////////////////////////////////////////////\r\n//\r\n//  \"baseline\" JPEG/JFIF decoder\r\n//\r\n//    simple implementation\r\n//      - doesn't support delayed output of y-dimension\r\n//      - simple interface (only one output format: 8-bit interleaved RGB)\r\n//      - doesn't try to recover corrupt jpegs\r\n//      - doesn't allow partial loading, loading multiple at once\r\n//      - still fast on x86 (copying globals into locals doesn't help x86)\r\n//      - allocates lots of intermediate memory (full size of all components)\r\n//        - non-interleaved case requires this anyway\r\n//        - allows good upsampling (see next)\r\n//    high-quality\r\n//      - upsampled channels are bilinearly interpolated, even across blocks\r\n//      - quality integer IDCT derived from IJG's 'slow'\r\n//    performance\r\n//      - fast huffman; reasonable integer IDCT\r\n//      - some SIMD kernels for common paths on targets with SSE2/NEON\r\n//      - uses a lot of intermediate memory, could cache poorly\r\n\r\n#ifndef STBI_NO_JPEG\r\n\r\n// huffman decoding acceleration\r\n#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache\r\n\r\ntypedef struct\r\n{\r\n  stbi_uc  fast[1 << FAST_BITS];\r\n  // weirdly, repacking this into AoS is a 10% speed loss, instead of a win\r\n  stbi__uint16 code[256];\r\n  stbi_uc  values[256];\r\n  stbi_uc  size[257];\r\n  unsigned int maxcode[18];\r\n  int    delta[17];   // old 'firstsymbol' - old 'firstcode'\r\n} stbi__huffman;\r\n\r\ntypedef struct\r\n{\r\n  stbi__context *s;\r\n  stbi__huffman huff_dc[4];\r\n  stbi__huffman huff_ac[4];\r\n  stbi__uint16 dequant[4][64];\r\n  stbi__int16 fast_ac[4][1 << FAST_BITS];\r\n  \r\n  // sizes for components, interleaved MCUs\r\n  int img_h_max, img_v_max;\r\n  int img_mcu_x, img_mcu_y;\r\n  int img_mcu_w, img_mcu_h;\r\n  \r\n  // definition of jpeg image component\r\n  struct\r\n  {\r\n    int id;\r\n    int h,v;\r\n    int tq;\r\n    int hd,ha;\r\n    int dc_pred;\r\n    \r\n    int x,y,w2,h2;\r\n    stbi_uc *data;\r\n    void *raw_data, *raw_coeff;\r\n    stbi_uc *linebuf;\r\n    short   *coeff;   // progressive only\r\n    int      coeff_w, coeff_h; // number of 8x8 coefficient blocks\r\n  } img_comp[4];\r\n  \r\n  stbi__uint32   code_buffer; // jpeg entropy-coded buffer\r\n  int            code_bits;   // number of valid bits\r\n  unsigned char  marker;      // marker seen while filling entropy buffer\r\n  int            nomore;      // flag if we saw a marker so must stop\r\n  \r\n  int            progressive;\r\n  int            spec_start;\r\n  int            spec_end;\r\n  int            succ_high;\r\n  int            succ_low;\r\n  int            eob_run;\r\n  int            jfif;\r\n  int            app14_color_transform; // Adobe APP14 tag\r\n  int            rgb;\r\n  \r\n  int scan_n, order[4];\r\n  int restart_interval, todo;\r\n  \r\n  // kernels\r\n  void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);\r\n  void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);\r\n  stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);\r\n} stbi__jpeg;\r\n\r\nstatic int stbi__build_huffman(stbi__huffman *h, int *count)\r\n{\r\n  int i,j,k=0;\r\n  unsigned int code;\r\n  // build size list for each symbol (from JPEG spec)\r\n  for (i=0; i < 16; ++i) {\r\n    for (j=0; j < count[i]; ++j) {\r\n      h->size[k++] = (stbi_uc) (i+1);\r\n      if(k >= 257) return stbi__err(\"bad size list\",\"Corrupt JPEG\");\r\n    }\r\n  }\r\n  h->size[k] = 0;\r\n  \r\n  // compute actual symbols (from jpeg spec)\r\n  code = 0;\r\n  k = 0;\r\n  for(j=1; j <= 16; ++j) {\r\n    // compute delta to add to code to compute symbol id\r\n    h->delta[j] = k - code;\r\n    if (h->size[k] == j) {\r\n      while (h->size[k] == j)\r\n        h->code[k++] = (stbi__uint16) (code++);\r\n      if (code-1 >= (1u << j)) return stbi__err(\"bad code lengths\",\"Corrupt JPEG\");\r\n    }\r\n    // compute largest code + 1 for this size, preshifted as needed later\r\n    h->maxcode[j] = code << (16-j);\r\n    code <<= 1;\r\n  }\r\n  h->maxcode[j] = 0xffffffff;\r\n  \r\n  // build non-spec acceleration table; 255 is flag for not-accelerated\r\n  memset(h->fast, 255, 1 << FAST_BITS);\r\n  for (i=0; i < k; ++i) {\r\n    int s = h->size[i];\r\n    if (s <= FAST_BITS) {\r\n      int c = h->code[i] << (FAST_BITS-s);\r\n      int m = 1 << (FAST_BITS-s);\r\n      for (j=0; j < m; ++j) {\r\n        h->fast[c+j] = (stbi_uc) i;\r\n      }\r\n    }\r\n  }\r\n  return 1;\r\n}\r\n\r\n// build a table that decodes both magnitude and value of small ACs in\r\n// one go.\r\nstatic void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)\r\n{\r\n  int i;\r\n  for (i=0; i < (1 << FAST_BITS); ++i) {\r\n    stbi_uc fast = h->fast[i];\r\n    fast_ac[i] = 0;\r\n    if (fast < 255) {\r\n      int rs = h->values[fast];\r\n      int run = (rs >> 4) & 15;\r\n      int magbits = rs & 15;\r\n      int len = h->size[fast];\r\n      \r\n      if (magbits && len + magbits <= FAST_BITS) {\r\n        // magnitude code followed by receive_extend code\r\n        int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);\r\n        int m = 1 << (magbits - 1);\r\n        if (k < m) k += (~0U << magbits) + 1;\r\n        // if the result is small enough, we can fit it in fast_ac table\r\n        if (k >= -128 && k <= 127)\r\n          fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nstatic void stbi__grow_buffer_unsafe(stbi__jpeg *j)\r\n{\r\n  do {\r\n    unsigned int b = j->nomore ? 0 : stbi__get8(j->s);\r\n    if (b == 0xff) {\r\n      int c = stbi__get8(j->s);\r\n      while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes\r\n      if (c != 0) {\r\n        j->marker = (unsigned char) c;\r\n        j->nomore = 1;\r\n        return;\r\n      }\r\n    }\r\n    j->code_buffer |= b << (24 - j->code_bits);\r\n    j->code_bits += 8;\r\n  } while (j->code_bits <= 24);\r\n}\r\n\r\n// (1 << n) - 1\r\nstatic const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};\r\n\r\n// decode a jpeg huffman value from the bitstream\r\nstbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)\r\n{\r\n  unsigned int temp;\r\n  int c,k;\r\n  \r\n  if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\r\n  \r\n  // look at the top FAST_BITS and determine what symbol ID it is,\r\n  // if the code is <= FAST_BITS\r\n  c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\r\n  k = h->fast[c];\r\n  if (k < 255) {\r\n    int s = h->size[k];\r\n    if (s > j->code_bits)\r\n      return -1;\r\n    j->code_buffer <<= s;\r\n    j->code_bits -= s;\r\n    return h->values[k];\r\n  }\r\n  \r\n  // naive test is to shift the code_buffer down so k bits are\r\n  // valid, then test against maxcode. To speed this up, we've\r\n  // preshifted maxcode left so that it has (16-k) 0s at the\r\n  // end; in other words, regardless of the number of bits, it\r\n  // wants to be compared against something shifted to have 16;\r\n  // that way we don't need to shift inside the loop.\r\n  temp = j->code_buffer >> 16;\r\n  for (k=FAST_BITS+1 ; ; ++k)\r\n    if (temp < h->maxcode[k])\r\n    break;\r\n  if (k == 17) {\r\n    // error! code not found\r\n    j->code_bits -= 16;\r\n    return -1;\r\n  }\r\n  \r\n  if (k > j->code_bits)\r\n    return -1;\r\n  \r\n  // convert the huffman code to the symbol id\r\n  c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];\r\n  if(c < 0 || c >= 256) // symbol id out of bounds!\r\n    return -1;\r\n  STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);\r\n  \r\n  // convert the id to a symbol\r\n  j->code_bits -= k;\r\n  j->code_buffer <<= k;\r\n  return h->values[c];\r\n}\r\n\r\n// bias[n] = (-1<<n) + 1\r\nstatic const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};\r\n\r\n// combined JPEG 'receive' and JPEG 'extend', since baseline\r\n// always extends everything it receives.\r\nstbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)\r\n{\r\n  unsigned int k;\r\n  int sgn;\r\n  if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\r\n  if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing\r\n  \r\n  sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative)\r\n  k = stbi_lrot(j->code_buffer, n);\r\n  j->code_buffer = k & ~stbi__bmask[n];\r\n  k &= stbi__bmask[n];\r\n  j->code_bits -= n;\r\n  return k + (stbi__jbias[n] & (sgn - 1));\r\n}\r\n\r\n// get some unsigned bits\r\nstbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)\r\n{\r\n  unsigned int k;\r\n  if (j->code_bits < n) stbi__grow_buffer_unsafe(j);\r\n  if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing\r\n  k = stbi_lrot(j->code_buffer, n);\r\n  j->code_buffer = k & ~stbi__bmask[n];\r\n  k &= stbi__bmask[n];\r\n  j->code_bits -= n;\r\n  return k;\r\n}\r\n\r\nstbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)\r\n{\r\n  unsigned int k;\r\n  if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);\r\n  if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing\r\n  k = j->code_buffer;\r\n  j->code_buffer <<= 1;\r\n  --j->code_bits;\r\n  return k & 0x80000000;\r\n}\r\n\r\n// given a value that's at position X in the zigzag stream,\r\n// where does it appear in the 8x8 matrix coded as row-major?\r\nstatic const stbi_uc stbi__jpeg_dezigzag[64+15] =\r\n{\r\n  0,  1,  8, 16,  9,  2,  3, 10,\r\n  17, 24, 32, 25, 18, 11,  4,  5,\r\n  12, 19, 26, 33, 40, 48, 41, 34,\r\n  27, 20, 13,  6,  7, 14, 21, 28,\r\n  35, 42, 49, 56, 57, 50, 43, 36,\r\n  29, 22, 15, 23, 30, 37, 44, 51,\r\n  58, 59, 52, 45, 38, 31, 39, 46,\r\n  53, 60, 61, 54, 47, 55, 62, 63,\r\n  // let corrupt input sample past end\r\n  63, 63, 63, 63, 63, 63, 63, 63,\r\n  63, 63, 63, 63, 63, 63, 63\r\n};\r\n\r\n// decode one 64-entry block--\r\nstatic int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)\r\n{\r\n  int diff,dc,k;\r\n  int t;\r\n  \r\n  if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\r\n  t = stbi__jpeg_huff_decode(j, hdc);\r\n  if (t < 0 || t > 15) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\r\n  \r\n  // 0 all the ac values now so we can do it 32-bits at a time\r\n  memset(data,0,64*sizeof(data[0]));\r\n  \r\n  diff = t ? stbi__extend_receive(j, t) : 0;\r\n  if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err(\"bad delta\",\"Corrupt JPEG\");\r\n  dc = j->img_comp[b].dc_pred + diff;\r\n  j->img_comp[b].dc_pred = dc;\r\n  if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\r\n  data[0] = (short) (dc * dequant[0]);\r\n  \r\n  // decode AC components, see JPEG spec\r\n  k = 1;\r\n  do {\r\n    unsigned int zig;\r\n    int c,r,s;\r\n    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\r\n    c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\r\n    r = fac[c];\r\n    if (r) { // fast-AC path\r\n      k += (r >> 4) & 15; // run\r\n      s = r & 15; // combined length\r\n      if (s > j->code_bits) return stbi__err(\"bad huffman code\", \"Combined length longer than code bits available\");\r\n      j->code_buffer <<= s;\r\n      j->code_bits -= s;\r\n      // decode into unzigzag'd location\r\n      zig = stbi__jpeg_dezigzag[k++];\r\n      data[zig] = (short) ((r >> 8) * dequant[zig]);\r\n    } else {\r\n      int rs = stbi__jpeg_huff_decode(j, hac);\r\n      if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\r\n      s = rs & 15;\r\n      r = rs >> 4;\r\n      if (s == 0) {\r\n        if (rs != 0xf0) break; // end block\r\n        k += 16;\r\n      } else {\r\n        k += r;\r\n        // decode into unzigzag'd location\r\n        zig = stbi__jpeg_dezigzag[k++];\r\n        data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);\r\n      }\r\n    }\r\n  } while (k < 64);\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)\r\n{\r\n  int diff,dc;\r\n  int t;\r\n  if (j->spec_end != 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\r\n  \r\n  if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\r\n  \r\n  if (j->succ_high == 0) {\r\n    // first scan for DC coefficient, must be first\r\n    memset(data,0,64*sizeof(data[0])); // 0 all the ac values now\r\n    t = stbi__jpeg_huff_decode(j, hdc);\r\n    if (t < 0 || t > 15) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\r\n    diff = t ? stbi__extend_receive(j, t) : 0;\r\n    \r\n    if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err(\"bad delta\", \"Corrupt JPEG\");\r\n    dc = j->img_comp[b].dc_pred + diff;\r\n    j->img_comp[b].dc_pred = dc;\r\n    if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\r\n    data[0] = (short) (dc * (1 << j->succ_low));\r\n  } else {\r\n    // refinement scan for DC coefficient\r\n    if (stbi__jpeg_get_bit(j))\r\n      data[0] += (short) (1 << j->succ_low);\r\n  }\r\n  return 1;\r\n}\r\n\r\n// @OPTIMIZE: store non-zigzagged during the decode passes,\r\n// and only de-zigzag when dequantizing\r\nstatic int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)\r\n{\r\n  int k;\r\n  if (j->spec_start == 0) return stbi__err(\"can't merge dc and ac\", \"Corrupt JPEG\");\r\n  \r\n  if (j->succ_high == 0) {\r\n    int shift = j->succ_low;\r\n    \r\n    if (j->eob_run) {\r\n      --j->eob_run;\r\n      return 1;\r\n    }\r\n    \r\n    k = j->spec_start;\r\n    do {\r\n      unsigned int zig;\r\n      int c,r,s;\r\n      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);\r\n      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);\r\n      r = fac[c];\r\n      if (r) { // fast-AC path\r\n        k += (r >> 4) & 15; // run\r\n        s = r & 15; // combined length\r\n        if (s > j->code_bits) return stbi__err(\"bad huffman code\", \"Combined length longer than code bits available\");\r\n        j->code_buffer <<= s;\r\n        j->code_bits -= s;\r\n        zig = stbi__jpeg_dezigzag[k++];\r\n        data[zig] = (short) ((r >> 8) * (1 << shift));\r\n      } else {\r\n        int rs = stbi__jpeg_huff_decode(j, hac);\r\n        if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\r\n        s = rs & 15;\r\n        r = rs >> 4;\r\n        if (s == 0) {\r\n          if (r < 15) {\r\n            j->eob_run = (1 << r);\r\n            if (r)\r\n              j->eob_run += stbi__jpeg_get_bits(j, r);\r\n            --j->eob_run;\r\n            break;\r\n          }\r\n          k += 16;\r\n        } else {\r\n          k += r;\r\n          zig = stbi__jpeg_dezigzag[k++];\r\n          data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));\r\n        }\r\n      }\r\n    } while (k <= j->spec_end);\r\n  } else {\r\n    // refinement scan for these AC coefficients\r\n    \r\n    short bit = (short) (1 << j->succ_low);\r\n    \r\n    if (j->eob_run) {\r\n      --j->eob_run;\r\n      for (k = j->spec_start; k <= j->spec_end; ++k) {\r\n        short *p = &data[stbi__jpeg_dezigzag[k]];\r\n        if (*p != 0)\r\n          if (stbi__jpeg_get_bit(j))\r\n          if ((*p & bit)==0) {\r\n          if (*p > 0)\r\n            *p += bit;\r\n          else\r\n            *p -= bit;\r\n        }\r\n      }\r\n    } else {\r\n      k = j->spec_start;\r\n      do {\r\n        int r,s;\r\n        int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh\r\n        if (rs < 0) return stbi__err(\"bad huffman code\",\"Corrupt JPEG\");\r\n        s = rs & 15;\r\n        r = rs >> 4;\r\n        if (s == 0) {\r\n          if (r < 15) {\r\n            j->eob_run = (1 << r) - 1;\r\n            if (r)\r\n              j->eob_run += stbi__jpeg_get_bits(j, r);\r\n            r = 64; // force end of block\r\n          } else {\r\n            // r=15 s=0 should write 16 0s, so we just do\r\n            // a run of 15 0s and then write s (which is 0),\r\n            // so we don't have to do anything special here\r\n          }\r\n        } else {\r\n          if (s != 1) return stbi__err(\"bad huffman code\", \"Corrupt JPEG\");\r\n          // sign bit\r\n          if (stbi__jpeg_get_bit(j))\r\n            s = bit;\r\n          else\r\n            s = -bit;\r\n        }\r\n        \r\n        // advance by r\r\n        while (k <= j->spec_end) {\r\n          short *p = &data[stbi__jpeg_dezigzag[k++]];\r\n          if (*p != 0) {\r\n            if (stbi__jpeg_get_bit(j))\r\n              if ((*p & bit)==0) {\r\n              if (*p > 0)\r\n                *p += bit;\r\n              else\r\n                *p -= bit;\r\n            }\r\n          } else {\r\n            if (r == 0) {\r\n              *p = (short) s;\r\n              break;\r\n            }\r\n            --r;\r\n          }\r\n        }\r\n      } while (k <= j->spec_end);\r\n    }\r\n  }\r\n  return 1;\r\n}\r\n\r\n// take a -128..127 value and stbi__clamp it and convert to 0..255\r\nstbi_inline static stbi_uc stbi__clamp(int x)\r\n{\r\n  // trick to use a single test to catch both cases\r\n  if ((unsigned int) x > 255) {\r\n    if (x < 0) return 0;\r\n    if (x > 255) return 255;\r\n  }\r\n  return (stbi_uc) x;\r\n}\r\n\r\n#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))\r\n#define stbi__fsh(x)  ((x) * 4096)\r\n\r\n// derived from jidctint -- DCT_ISLOW\r\n#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \\\r\nint t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \\\r\np2 = s2;                                    \\\r\np3 = s6;                                    \\\r\np1 = (p2+p3) * stbi__f2f(0.5411961f);       \\\r\nt2 = p1 + p3*stbi__f2f(-1.847759065f);      \\\r\nt3 = p1 + p2*stbi__f2f( 0.765366865f);      \\\r\np2 = s0;                                    \\\r\np3 = s4;                                    \\\r\nt0 = stbi__fsh(p2+p3);                      \\\r\nt1 = stbi__fsh(p2-p3);                      \\\r\nx0 = t0+t3;                                 \\\r\nx3 = t0-t3;                                 \\\r\nx1 = t1+t2;                                 \\\r\nx2 = t1-t2;                                 \\\r\nt0 = s7;                                    \\\r\nt1 = s5;                                    \\\r\nt2 = s3;                                    \\\r\nt3 = s1;                                    \\\r\np3 = t0+t2;                                 \\\r\np4 = t1+t3;                                 \\\r\np1 = t0+t3;                                 \\\r\np2 = t1+t2;                                 \\\r\np5 = (p3+p4)*stbi__f2f( 1.175875602f);      \\\r\nt0 = t0*stbi__f2f( 0.298631336f);           \\\r\nt1 = t1*stbi__f2f( 2.053119869f);           \\\r\nt2 = t2*stbi__f2f( 3.072711026f);           \\\r\nt3 = t3*stbi__f2f( 1.501321110f);           \\\r\np1 = p5 + p1*stbi__f2f(-0.899976223f);      \\\r\np2 = p5 + p2*stbi__f2f(-2.562915447f);      \\\r\np3 = p3*stbi__f2f(-1.961570560f);           \\\r\np4 = p4*stbi__f2f(-0.390180644f);           \\\r\nt3 += p1+p4;                                \\\r\nt2 += p2+p3;                                \\\r\nt1 += p2+p4;                                \\\r\nt0 += p1+p3;\r\n\r\nstatic void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])\r\n{\r\n  int i,val[64],*v=val;\r\n  stbi_uc *o;\r\n  short *d = data;\r\n  \r\n  // columns\r\n  for (i=0; i < 8; ++i,++d, ++v) {\r\n    // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing\r\n    if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0\r\n        && d[40]==0 && d[48]==0 && d[56]==0) {\r\n      //    no shortcut                 0     seconds\r\n      //    (1|2|3|4|5|6|7)==0          0     seconds\r\n      //    all separate               -0.047 seconds\r\n      //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds\r\n      int dcterm = d[0]*4;\r\n      v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;\r\n    } else {\r\n      STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])\r\n        // constants scaled things up by 1<<12; let's bring them back\r\n        // down, but keep 2 extra bits of precision\r\n        x0 += 512; x1 += 512; x2 += 512; x3 += 512;\r\n      v[ 0] = (x0+t3) >> 10;\r\n      v[56] = (x0-t3) >> 10;\r\n      v[ 8] = (x1+t2) >> 10;\r\n      v[48] = (x1-t2) >> 10;\r\n      v[16] = (x2+t1) >> 10;\r\n      v[40] = (x2-t1) >> 10;\r\n      v[24] = (x3+t0) >> 10;\r\n      v[32] = (x3-t0) >> 10;\r\n    }\r\n  }\r\n  \r\n  for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {\r\n    // no fast case since the first 1D IDCT spread components out\r\n    STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])\r\n      // constants scaled things up by 1<<12, plus we had 1<<2 from first\r\n      // loop, plus horizontal and vertical each scale by sqrt(8) so together\r\n      // we've got an extra 1<<3, so 1<<17 total we need to remove.\r\n      // so we want to round that, which means adding 0.5 * 1<<17,\r\n      // aka 65536. Also, we'll end up with -128 to 127 that we want\r\n      // to encode as 0..255 by adding 128, so we'll add that before the shift\r\n      x0 += 65536 + (128<<17);\r\n    x1 += 65536 + (128<<17);\r\n    x2 += 65536 + (128<<17);\r\n    x3 += 65536 + (128<<17);\r\n    // tried computing the shifts into temps, or'ing the temps to see\r\n    // if any were out of range, but that was slower\r\n    o[0] = stbi__clamp((x0+t3) >> 17);\r\n    o[7] = stbi__clamp((x0-t3) >> 17);\r\n    o[1] = stbi__clamp((x1+t2) >> 17);\r\n    o[6] = stbi__clamp((x1-t2) >> 17);\r\n    o[2] = stbi__clamp((x2+t1) >> 17);\r\n    o[5] = stbi__clamp((x2-t1) >> 17);\r\n    o[3] = stbi__clamp((x3+t0) >> 17);\r\n    o[4] = stbi__clamp((x3-t0) >> 17);\r\n  }\r\n}\r\n\r\n#ifdef STBI_SSE2\r\n// sse2 integer IDCT. not the fastest possible implementation but it\r\n// produces bit-identical results to the generic C version so it's\r\n// fully \"transparent\".\r\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\r\n{\r\n  // This is constructed to match our regular (generic) integer IDCT exactly.\r\n  __m128i row0, row1, row2, row3, row4, row5, row6, row7;\r\n  __m128i tmp;\r\n  \r\n  // dot product constant: even elems=x, odd elems=y\r\n#define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))\r\n  \r\n  // out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)\r\n  // out(1) = c1[even]*x + c1[odd]*y\r\n#define dct_rot(out0,out1, x,y,c0,c1) \\\r\n__m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \\\r\n__m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \\\r\n__m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \\\r\n__m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \\\r\n__m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \\\r\n__m128i out1##_h = _mm_madd_epi16(c0##hi, c1)\r\n  \r\n  // out = in << 12  (in 16-bit, out 32-bit)\r\n#define dct_widen(out, in) \\\r\n__m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \\\r\n__m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)\r\n  \r\n  // wide add\r\n#define dct_wadd(out, a, b) \\\r\n__m128i out##_l = _mm_add_epi32(a##_l, b##_l); \\\r\n__m128i out##_h = _mm_add_epi32(a##_h, b##_h)\r\n  \r\n  // wide sub\r\n#define dct_wsub(out, a, b) \\\r\n__m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \\\r\n__m128i out##_h = _mm_sub_epi32(a##_h, b##_h)\r\n  \r\n  // butterfly a/b, add bias, then shift by \"s\" and pack\r\n#define dct_bfly32o(out0, out1, a,b,bias,s) \\\r\n{ \\\r\n__m128i abiased_l = _mm_add_epi32(a##_l, bias); \\\r\n__m128i abiased_h = _mm_add_epi32(a##_h, bias); \\\r\ndct_wadd(sum, abiased, b); \\\r\ndct_wsub(dif, abiased, b); \\\r\nout0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \\\r\nout1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \\\r\n}\r\n  \r\n  // 8-bit interleave step (for transposes)\r\n#define dct_interleave8(a, b) \\\r\ntmp = a; \\\r\na = _mm_unpacklo_epi8(a, b); \\\r\nb = _mm_unpackhi_epi8(tmp, b)\r\n  \r\n  // 16-bit interleave step (for transposes)\r\n#define dct_interleave16(a, b) \\\r\ntmp = a; \\\r\na = _mm_unpacklo_epi16(a, b); \\\r\nb = _mm_unpackhi_epi16(tmp, b)\r\n  \r\n#define dct_pass(bias,shift) \\\r\n{ \\\r\n/* even part */ \\\r\ndct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \\\r\n__m128i sum04 = _mm_add_epi16(row0, row4); \\\r\n__m128i dif04 = _mm_sub_epi16(row0, row4); \\\r\ndct_widen(t0e, sum04); \\\r\ndct_widen(t1e, dif04); \\\r\ndct_wadd(x0, t0e, t3e); \\\r\ndct_wsub(x3, t0e, t3e); \\\r\ndct_wadd(x1, t1e, t2e); \\\r\ndct_wsub(x2, t1e, t2e); \\\r\n/* odd part */ \\\r\ndct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \\\r\ndct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \\\r\n__m128i sum17 = _mm_add_epi16(row1, row7); \\\r\n__m128i sum35 = _mm_add_epi16(row3, row5); \\\r\ndct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \\\r\ndct_wadd(x4, y0o, y4o); \\\r\ndct_wadd(x5, y1o, y5o); \\\r\ndct_wadd(x6, y2o, y5o); \\\r\ndct_wadd(x7, y3o, y4o); \\\r\ndct_bfly32o(row0,row7, x0,x7,bias,shift); \\\r\ndct_bfly32o(row1,row6, x1,x6,bias,shift); \\\r\ndct_bfly32o(row2,row5, x2,x5,bias,shift); \\\r\ndct_bfly32o(row3,row4, x3,x4,bias,shift); \\\r\n}\r\n  \r\n  __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));\r\n  __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));\r\n  __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));\r\n  __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));\r\n  __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));\r\n  __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));\r\n  __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));\r\n  __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));\r\n  \r\n  // rounding biases in column/row passes, see stbi__idct_block for explanation.\r\n  __m128i bias_0 = _mm_set1_epi32(512);\r\n  __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));\r\n  \r\n  // load\r\n  row0 = _mm_load_si128((const __m128i *) (data + 0*8));\r\n  row1 = _mm_load_si128((const __m128i *) (data + 1*8));\r\n  row2 = _mm_load_si128((const __m128i *) (data + 2*8));\r\n  row3 = _mm_load_si128((const __m128i *) (data + 3*8));\r\n  row4 = _mm_load_si128((const __m128i *) (data + 4*8));\r\n  row5 = _mm_load_si128((const __m128i *) (data + 5*8));\r\n  row6 = _mm_load_si128((const __m128i *) (data + 6*8));\r\n  row7 = _mm_load_si128((const __m128i *) (data + 7*8));\r\n  \r\n  // column pass\r\n  dct_pass(bias_0, 10);\r\n  \r\n  {\r\n    // 16bit 8x8 transpose pass 1\r\n    dct_interleave16(row0, row4);\r\n    dct_interleave16(row1, row5);\r\n    dct_interleave16(row2, row6);\r\n    dct_interleave16(row3, row7);\r\n    \r\n    // transpose pass 2\r\n    dct_interleave16(row0, row2);\r\n    dct_interleave16(row1, row3);\r\n    dct_interleave16(row4, row6);\r\n    dct_interleave16(row5, row7);\r\n    \r\n    // transpose pass 3\r\n    dct_interleave16(row0, row1);\r\n    dct_interleave16(row2, row3);\r\n    dct_interleave16(row4, row5);\r\n    dct_interleave16(row6, row7);\r\n  }\r\n  \r\n  // row pass\r\n  dct_pass(bias_1, 17);\r\n  \r\n  {\r\n    // pack\r\n    __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7\r\n    __m128i p1 = _mm_packus_epi16(row2, row3);\r\n    __m128i p2 = _mm_packus_epi16(row4, row5);\r\n    __m128i p3 = _mm_packus_epi16(row6, row7);\r\n    \r\n    // 8bit 8x8 transpose pass 1\r\n    dct_interleave8(p0, p2); // a0e0a1e1...\r\n    dct_interleave8(p1, p3); // c0g0c1g1...\r\n    \r\n    // transpose pass 2\r\n    dct_interleave8(p0, p1); // a0c0e0g0...\r\n    dct_interleave8(p2, p3); // b0d0f0h0...\r\n    \r\n    // transpose pass 3\r\n    dct_interleave8(p0, p2); // a0b0c0d0...\r\n    dct_interleave8(p1, p3); // a4b4c4d4...\r\n    \r\n    // store\r\n    _mm_storel_epi64((__m128i *) out, p0); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, p2); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, p1); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, p3); out += out_stride;\r\n    _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));\r\n  }\r\n  \r\n#undef dct_const\r\n#undef dct_rot\r\n#undef dct_widen\r\n#undef dct_wadd\r\n#undef dct_wsub\r\n#undef dct_bfly32o\r\n#undef dct_interleave8\r\n#undef dct_interleave16\r\n#undef dct_pass\r\n}\r\n\r\n#endif // STBI_SSE2\r\n\r\n#ifdef STBI_NEON\r\n\r\n// NEON integer IDCT. should produce bit-identical\r\n// results to the generic C version.\r\nstatic void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])\r\n{\r\n  int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;\r\n  \r\n  int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));\r\n  int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));\r\n  int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));\r\n  int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));\r\n  int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));\r\n  int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));\r\n  int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));\r\n  int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));\r\n  int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));\r\n  int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));\r\n  int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));\r\n  int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));\r\n  \r\n#define dct_long_mul(out, inq, coeff) \\\r\nint32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \\\r\nint32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)\r\n  \r\n#define dct_long_mac(out, acc, inq, coeff) \\\r\nint32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \\\r\nint32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)\r\n  \r\n#define dct_widen(out, inq) \\\r\nint32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \\\r\nint32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)\r\n  \r\n  // wide add\r\n#define dct_wadd(out, a, b) \\\r\nint32x4_t out##_l = vaddq_s32(a##_l, b##_l); \\\r\nint32x4_t out##_h = vaddq_s32(a##_h, b##_h)\r\n  \r\n  // wide sub\r\n#define dct_wsub(out, a, b) \\\r\nint32x4_t out##_l = vsubq_s32(a##_l, b##_l); \\\r\nint32x4_t out##_h = vsubq_s32(a##_h, b##_h)\r\n  \r\n  // butterfly a/b, then shift using \"shiftop\" by \"s\" and pack\r\n#define dct_bfly32o(out0,out1, a,b,shiftop,s) \\\r\n{ \\\r\ndct_wadd(sum, a, b); \\\r\ndct_wsub(dif, a, b); \\\r\nout0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \\\r\nout1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \\\r\n}\r\n  \r\n#define dct_pass(shiftop, shift) \\\r\n{ \\\r\n/* even part */ \\\r\nint16x8_t sum26 = vaddq_s16(row2, row6); \\\r\ndct_long_mul(p1e, sum26, rot0_0); \\\r\ndct_long_mac(t2e, p1e, row6, rot0_1); \\\r\ndct_long_mac(t3e, p1e, row2, rot0_2); \\\r\nint16x8_t sum04 = vaddq_s16(row0, row4); \\\r\nint16x8_t dif04 = vsubq_s16(row0, row4); \\\r\ndct_widen(t0e, sum04); \\\r\ndct_widen(t1e, dif04); \\\r\ndct_wadd(x0, t0e, t3e); \\\r\ndct_wsub(x3, t0e, t3e); \\\r\ndct_wadd(x1, t1e, t2e); \\\r\ndct_wsub(x2, t1e, t2e); \\\r\n/* odd part */ \\\r\nint16x8_t sum15 = vaddq_s16(row1, row5); \\\r\nint16x8_t sum17 = vaddq_s16(row1, row7); \\\r\nint16x8_t sum35 = vaddq_s16(row3, row5); \\\r\nint16x8_t sum37 = vaddq_s16(row3, row7); \\\r\nint16x8_t sumodd = vaddq_s16(sum17, sum35); \\\r\ndct_long_mul(p5o, sumodd, rot1_0); \\\r\ndct_long_mac(p1o, p5o, sum17, rot1_1); \\\r\ndct_long_mac(p2o, p5o, sum35, rot1_2); \\\r\ndct_long_mul(p3o, sum37, rot2_0); \\\r\ndct_long_mul(p4o, sum15, rot2_1); \\\r\ndct_wadd(sump13o, p1o, p3o); \\\r\ndct_wadd(sump24o, p2o, p4o); \\\r\ndct_wadd(sump23o, p2o, p3o); \\\r\ndct_wadd(sump14o, p1o, p4o); \\\r\ndct_long_mac(x4, sump13o, row7, rot3_0); \\\r\ndct_long_mac(x5, sump24o, row5, rot3_1); \\\r\ndct_long_mac(x6, sump23o, row3, rot3_2); \\\r\ndct_long_mac(x7, sump14o, row1, rot3_3); \\\r\ndct_bfly32o(row0,row7, x0,x7,shiftop,shift); \\\r\ndct_bfly32o(row1,row6, x1,x6,shiftop,shift); \\\r\ndct_bfly32o(row2,row5, x2,x5,shiftop,shift); \\\r\ndct_bfly32o(row3,row4, x3,x4,shiftop,shift); \\\r\n}\r\n  \r\n  // load\r\n  row0 = vld1q_s16(data + 0*8);\r\n  row1 = vld1q_s16(data + 1*8);\r\n  row2 = vld1q_s16(data + 2*8);\r\n  row3 = vld1q_s16(data + 3*8);\r\n  row4 = vld1q_s16(data + 4*8);\r\n  row5 = vld1q_s16(data + 5*8);\r\n  row6 = vld1q_s16(data + 6*8);\r\n  row7 = vld1q_s16(data + 7*8);\r\n  \r\n  // add DC bias\r\n  row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));\r\n  \r\n  // column pass\r\n  dct_pass(vrshrn_n_s32, 10);\r\n  \r\n  // 16bit 8x8 transpose\r\n  {\r\n    // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.\r\n    // whether compilers actually get this is another story, sadly.\r\n#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }\r\n#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }\r\n#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }\r\n    \r\n    // pass 1\r\n    dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6\r\n    dct_trn16(row2, row3);\r\n    dct_trn16(row4, row5);\r\n    dct_trn16(row6, row7);\r\n    \r\n    // pass 2\r\n    dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4\r\n    dct_trn32(row1, row3);\r\n    dct_trn32(row4, row6);\r\n    dct_trn32(row5, row7);\r\n    \r\n    // pass 3\r\n    dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0\r\n    dct_trn64(row1, row5);\r\n    dct_trn64(row2, row6);\r\n    dct_trn64(row3, row7);\r\n    \r\n#undef dct_trn16\r\n#undef dct_trn32\r\n#undef dct_trn64\r\n  }\r\n  \r\n  // row pass\r\n  // vrshrn_n_s32 only supports shifts up to 16, we need\r\n  // 17. so do a non-rounding shift of 16 first then follow\r\n  // up with a rounding shift by 1.\r\n  dct_pass(vshrn_n_s32, 16);\r\n  \r\n  {\r\n    // pack and round\r\n    uint8x8_t p0 = vqrshrun_n_s16(row0, 1);\r\n    uint8x8_t p1 = vqrshrun_n_s16(row1, 1);\r\n    uint8x8_t p2 = vqrshrun_n_s16(row2, 1);\r\n    uint8x8_t p3 = vqrshrun_n_s16(row3, 1);\r\n    uint8x8_t p4 = vqrshrun_n_s16(row4, 1);\r\n    uint8x8_t p5 = vqrshrun_n_s16(row5, 1);\r\n    uint8x8_t p6 = vqrshrun_n_s16(row6, 1);\r\n    uint8x8_t p7 = vqrshrun_n_s16(row7, 1);\r\n    \r\n    // again, these can translate into one instruction, but often don't.\r\n#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }\r\n#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }\r\n#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }\r\n    \r\n    // sadly can't use interleaved stores here since we only write\r\n    // 8 bytes to each scan line!\r\n    \r\n    // 8x8 8-bit transpose pass 1\r\n    dct_trn8_8(p0, p1);\r\n    dct_trn8_8(p2, p3);\r\n    dct_trn8_8(p4, p5);\r\n    dct_trn8_8(p6, p7);\r\n    \r\n    // pass 2\r\n    dct_trn8_16(p0, p2);\r\n    dct_trn8_16(p1, p3);\r\n    dct_trn8_16(p4, p6);\r\n    dct_trn8_16(p5, p7);\r\n    \r\n    // pass 3\r\n    dct_trn8_32(p0, p4);\r\n    dct_trn8_32(p1, p5);\r\n    dct_trn8_32(p2, p6);\r\n    dct_trn8_32(p3, p7);\r\n    \r\n    // store\r\n    vst1_u8(out, p0); out += out_stride;\r\n    vst1_u8(out, p1); out += out_stride;\r\n    vst1_u8(out, p2); out += out_stride;\r\n    vst1_u8(out, p3); out += out_stride;\r\n    vst1_u8(out, p4); out += out_stride;\r\n    vst1_u8(out, p5); out += out_stride;\r\n    vst1_u8(out, p6); out += out_stride;\r\n    vst1_u8(out, p7);\r\n    \r\n#undef dct_trn8_8\r\n#undef dct_trn8_16\r\n#undef dct_trn8_32\r\n  }\r\n  \r\n#undef dct_long_mul\r\n#undef dct_long_mac\r\n#undef dct_widen\r\n#undef dct_wadd\r\n#undef dct_wsub\r\n#undef dct_bfly32o\r\n#undef dct_pass\r\n}\r\n\r\n#endif // STBI_NEON\r\n\r\n#define STBI__MARKER_none  0xff\r\n// if there's a pending marker from the entropy stream, return that\r\n// otherwise, fetch from the stream and get a marker. if there's no\r\n// marker, return 0xff, which is never a valid marker value\r\nstatic stbi_uc stbi__get_marker(stbi__jpeg *j)\r\n{\r\n  stbi_uc x;\r\n  if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }\r\n  x = stbi__get8(j->s);\r\n  if (x != 0xff) return STBI__MARKER_none;\r\n  while (x == 0xff)\r\n    x = stbi__get8(j->s); // consume repeated 0xff fill bytes\r\n  return x;\r\n}\r\n\r\n// in each scan, we'll have scan_n components, and the order\r\n// of the components is specified by order[]\r\n#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)\r\n\r\n// after a restart interval, stbi__jpeg_reset the entropy decoder and\r\n// the dc prediction\r\nstatic void stbi__jpeg_reset(stbi__jpeg *j)\r\n{\r\n  j->code_bits = 0;\r\n  j->code_buffer = 0;\r\n  j->nomore = 0;\r\n  j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;\r\n  j->marker = STBI__MARKER_none;\r\n  j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;\r\n  j->eob_run = 0;\r\n  // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,\r\n  // since we don't even allow 1<<30 pixels\r\n}\r\n\r\nstatic int stbi__parse_entropy_coded_data(stbi__jpeg *z)\r\n{\r\n  stbi__jpeg_reset(z);\r\n  if (!z->progressive) {\r\n    if (z->scan_n == 1) {\r\n      int i,j;\r\n      STBI_SIMD_ALIGN(short, data[64]);\r\n      int n = z->order[0];\r\n      // non-interleaved data, we just need to process one block at a time,\r\n      // in trivial scanline order\r\n      // number of blocks to do just depends on how many actual \"pixels\" this\r\n      // component has, independent of interleaved MCU blocking and such\r\n      int w = (z->img_comp[n].x+7) >> 3;\r\n      int h = (z->img_comp[n].y+7) >> 3;\r\n      for (j=0; j < h; ++j) {\r\n        for (i=0; i < w; ++i) {\r\n          int ha = z->img_comp[n].ha;\r\n          if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\r\n          z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\r\n          // every data block is an MCU, so countdown the restart interval\r\n          if (--z->todo <= 0) {\r\n            if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\r\n            // if it's NOT a restart, then just bail, so we get corrupt data\r\n            // rather than no data\r\n            if (!STBI__RESTART(z->marker)) return 1;\r\n            stbi__jpeg_reset(z);\r\n          }\r\n        }\r\n      }\r\n      return 1;\r\n    } else { // interleaved\r\n      int i,j,k,x,y;\r\n      STBI_SIMD_ALIGN(short, data[64]);\r\n      for (j=0; j < z->img_mcu_y; ++j) {\r\n        for (i=0; i < z->img_mcu_x; ++i) {\r\n          // scan an interleaved mcu... process scan_n components in order\r\n          for (k=0; k < z->scan_n; ++k) {\r\n            int n = z->order[k];\r\n            // scan out an mcu's worth of this component; that's just determined\r\n            // by the basic H and V specified for the component\r\n            for (y=0; y < z->img_comp[n].v; ++y) {\r\n              for (x=0; x < z->img_comp[n].h; ++x) {\r\n                int x2 = (i*z->img_comp[n].h + x)*8;\r\n                int y2 = (j*z->img_comp[n].v + y)*8;\r\n                int ha = z->img_comp[n].ha;\r\n                if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;\r\n                z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);\r\n              }\r\n            }\r\n          }\r\n          // after all interleaved components, that's an interleaved MCU,\r\n          // so now count down the restart interval\r\n          if (--z->todo <= 0) {\r\n            if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\r\n            if (!STBI__RESTART(z->marker)) return 1;\r\n            stbi__jpeg_reset(z);\r\n          }\r\n        }\r\n      }\r\n      return 1;\r\n    }\r\n  } else {\r\n    if (z->scan_n == 1) {\r\n      int i,j;\r\n      int n = z->order[0];\r\n      // non-interleaved data, we just need to process one block at a time,\r\n      // in trivial scanline order\r\n      // number of blocks to do just depends on how many actual \"pixels\" this\r\n      // component has, independent of interleaved MCU blocking and such\r\n      int w = (z->img_comp[n].x+7) >> 3;\r\n      int h = (z->img_comp[n].y+7) >> 3;\r\n      for (j=0; j < h; ++j) {\r\n        for (i=0; i < w; ++i) {\r\n          short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\r\n          if (z->spec_start == 0) {\r\n            if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\r\n              return 0;\r\n          } else {\r\n            int ha = z->img_comp[n].ha;\r\n            if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))\r\n              return 0;\r\n          }\r\n          // every data block is an MCU, so countdown the restart interval\r\n          if (--z->todo <= 0) {\r\n            if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\r\n            if (!STBI__RESTART(z->marker)) return 1;\r\n            stbi__jpeg_reset(z);\r\n          }\r\n        }\r\n      }\r\n      return 1;\r\n    } else { // interleaved\r\n      int i,j,k,x,y;\r\n      for (j=0; j < z->img_mcu_y; ++j) {\r\n        for (i=0; i < z->img_mcu_x; ++i) {\r\n          // scan an interleaved mcu... process scan_n components in order\r\n          for (k=0; k < z->scan_n; ++k) {\r\n            int n = z->order[k];\r\n            // scan out an mcu's worth of this component; that's just determined\r\n            // by the basic H and V specified for the component\r\n            for (y=0; y < z->img_comp[n].v; ++y) {\r\n              for (x=0; x < z->img_comp[n].h; ++x) {\r\n                int x2 = (i*z->img_comp[n].h + x);\r\n                int y2 = (j*z->img_comp[n].v + y);\r\n                short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);\r\n                if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))\r\n                  return 0;\r\n              }\r\n            }\r\n          }\r\n          // after all interleaved components, that's an interleaved MCU,\r\n          // so now count down the restart interval\r\n          if (--z->todo <= 0) {\r\n            if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);\r\n            if (!STBI__RESTART(z->marker)) return 1;\r\n            stbi__jpeg_reset(z);\r\n          }\r\n        }\r\n      }\r\n      return 1;\r\n    }\r\n  }\r\n}\r\n\r\nstatic void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)\r\n{\r\n  int i;\r\n  for (i=0; i < 64; ++i)\r\n    data[i] *= dequant[i];\r\n}\r\n\r\nstatic void stbi__jpeg_finish(stbi__jpeg *z)\r\n{\r\n  if (z->progressive) {\r\n    // dequantize and idct the data\r\n    int i,j,n;\r\n    for (n=0; n < z->s->img_n; ++n) {\r\n      int w = (z->img_comp[n].x+7) >> 3;\r\n      int h = (z->img_comp[n].y+7) >> 3;\r\n      for (j=0; j < h; ++j) {\r\n        for (i=0; i < w; ++i) {\r\n          short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);\r\n          stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);\r\n          z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);\r\n        }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nstatic int stbi__process_marker(stbi__jpeg *z, int m)\r\n{\r\n  int L;\r\n  switch (m) {\r\n    case STBI__MARKER_none: // no marker found\r\n    return stbi__err(\"expected marker\",\"Corrupt JPEG\");\r\n    \r\n    case 0xDD: // DRI - specify restart interval\r\n    if (stbi__get16be(z->s) != 4) return stbi__err(\"bad DRI len\",\"Corrupt JPEG\");\r\n    z->restart_interval = stbi__get16be(z->s);\r\n    return 1;\r\n    \r\n    case 0xDB: // DQT - define quantization table\r\n    L = stbi__get16be(z->s)-2;\r\n    while (L > 0) {\r\n      int q = stbi__get8(z->s);\r\n      int p = q >> 4, sixteen = (p != 0);\r\n      int t = q & 15,i;\r\n      if (p != 0 && p != 1) return stbi__err(\"bad DQT type\",\"Corrupt JPEG\");\r\n      if (t > 3) return stbi__err(\"bad DQT table\",\"Corrupt JPEG\");\r\n      \r\n      for (i=0; i < 64; ++i)\r\n        z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));\r\n      L -= (sixteen ? 129 : 65);\r\n    }\r\n    return L==0;\r\n    \r\n    case 0xC4: // DHT - define huffman table\r\n    L = stbi__get16be(z->s)-2;\r\n    while (L > 0) {\r\n      stbi_uc *v;\r\n      int sizes[16],i,n=0;\r\n      int q = stbi__get8(z->s);\r\n      int tc = q >> 4;\r\n      int th = q & 15;\r\n      if (tc > 1 || th > 3) return stbi__err(\"bad DHT header\",\"Corrupt JPEG\");\r\n      for (i=0; i < 16; ++i) {\r\n        sizes[i] = stbi__get8(z->s);\r\n        n += sizes[i];\r\n      }\r\n      if(n > 256) return stbi__err(\"bad DHT header\",\"Corrupt JPEG\"); // Loop over i < n would write past end of values!\r\n      L -= 17;\r\n      if (tc == 0) {\r\n        if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;\r\n        v = z->huff_dc[th].values;\r\n      } else {\r\n        if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;\r\n        v = z->huff_ac[th].values;\r\n      }\r\n      for (i=0; i < n; ++i)\r\n        v[i] = stbi__get8(z->s);\r\n      if (tc != 0)\r\n        stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);\r\n      L -= n;\r\n    }\r\n    return L==0;\r\n  }\r\n  \r\n  // check for comment block or APP blocks\r\n  if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {\r\n    L = stbi__get16be(z->s);\r\n    if (L < 2) {\r\n      if (m == 0xFE)\r\n        return stbi__err(\"bad COM len\",\"Corrupt JPEG\");\r\n      else\r\n        return stbi__err(\"bad APP len\",\"Corrupt JPEG\");\r\n    }\r\n    L -= 2;\r\n    \r\n    if (m == 0xE0 && L >= 5) { // JFIF APP0 segment\r\n      static const unsigned char tag[5] = {'J','F','I','F','\\0'};\r\n      int ok = 1;\r\n      int i;\r\n      for (i=0; i < 5; ++i)\r\n        if (stbi__get8(z->s) != tag[i])\r\n        ok = 0;\r\n      L -= 5;\r\n      if (ok)\r\n        z->jfif = 1;\r\n    } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment\r\n      static const unsigned char tag[6] = {'A','d','o','b','e','\\0'};\r\n      int ok = 1;\r\n      int i;\r\n      for (i=0; i < 6; ++i)\r\n        if (stbi__get8(z->s) != tag[i])\r\n        ok = 0;\r\n      L -= 6;\r\n      if (ok) {\r\n        stbi__get8(z->s); // version\r\n        stbi__get16be(z->s); // flags0\r\n        stbi__get16be(z->s); // flags1\r\n        z->app14_color_transform = stbi__get8(z->s); // color transform\r\n        L -= 6;\r\n      }\r\n    }\r\n    \r\n    stbi__skip(z->s, L);\r\n    return 1;\r\n  }\r\n  \r\n  return stbi__err(\"unknown marker\",\"Corrupt JPEG\");\r\n}\r\n\r\n// after we see SOS\r\nstatic int stbi__process_scan_header(stbi__jpeg *z)\r\n{\r\n  int i;\r\n  int Ls = stbi__get16be(z->s);\r\n  z->scan_n = stbi__get8(z->s);\r\n  if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err(\"bad SOS component count\",\"Corrupt JPEG\");\r\n  if (Ls != 6+2*z->scan_n) return stbi__err(\"bad SOS len\",\"Corrupt JPEG\");\r\n  for (i=0; i < z->scan_n; ++i) {\r\n    int id = stbi__get8(z->s), which;\r\n    int q = stbi__get8(z->s);\r\n    for (which = 0; which < z->s->img_n; ++which)\r\n      if (z->img_comp[which].id == id)\r\n      break;\r\n    if (which == z->s->img_n) return 0; // no match\r\n    z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err(\"bad DC huff\",\"Corrupt JPEG\");\r\n    z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err(\"bad AC huff\",\"Corrupt JPEG\");\r\n    z->order[i] = which;\r\n  }\r\n  \r\n  {\r\n    int aa;\r\n    z->spec_start = stbi__get8(z->s);\r\n    z->spec_end   = stbi__get8(z->s); // should be 63, but might be 0\r\n    aa = stbi__get8(z->s);\r\n    z->succ_high = (aa >> 4);\r\n    z->succ_low  = (aa & 15);\r\n    if (z->progressive) {\r\n      if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)\r\n        return stbi__err(\"bad SOS\", \"Corrupt JPEG\");\r\n    } else {\r\n      if (z->spec_start != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\r\n      if (z->succ_high != 0 || z->succ_low != 0) return stbi__err(\"bad SOS\",\"Corrupt JPEG\");\r\n      z->spec_end = 63;\r\n    }\r\n  }\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)\r\n{\r\n  int i;\r\n  for (i=0; i < ncomp; ++i) {\r\n    if (z->img_comp[i].raw_data) {\r\n      STBI_FREE(z->img_comp[i].raw_data);\r\n      z->img_comp[i].raw_data = NULL;\r\n      z->img_comp[i].data = NULL;\r\n    }\r\n    if (z->img_comp[i].raw_coeff) {\r\n      STBI_FREE(z->img_comp[i].raw_coeff);\r\n      z->img_comp[i].raw_coeff = 0;\r\n      z->img_comp[i].coeff = 0;\r\n    }\r\n    if (z->img_comp[i].linebuf) {\r\n      STBI_FREE(z->img_comp[i].linebuf);\r\n      z->img_comp[i].linebuf = NULL;\r\n    }\r\n  }\r\n  return why;\r\n}\r\n\r\nstatic int stbi__process_frame_header(stbi__jpeg *z, int scan)\r\n{\r\n  stbi__context *s = z->s;\r\n  int Lf,p,i,q, h_max=1,v_max=1,c;\r\n  Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\"); // JPEG\r\n  p  = stbi__get8(s);            if (p != 8) return stbi__err(\"only 8-bit\",\"JPEG format not supported: 8-bit only\"); // JPEG baseline\r\n  s->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err(\"no header height\", \"JPEG format not supported: delayed height\"); // Legal, but we don't handle it--but neither does IJG\r\n  s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err(\"0 width\",\"Corrupt JPEG\"); // JPEG requires\r\n  if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\r\n  if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\r\n  c = stbi__get8(s);\r\n  if (c != 3 && c != 1 && c != 4) return stbi__err(\"bad component count\",\"Corrupt JPEG\");\r\n  s->img_n = c;\r\n  for (i=0; i < c; ++i) {\r\n    z->img_comp[i].data = NULL;\r\n    z->img_comp[i].linebuf = NULL;\r\n  }\r\n  \r\n  if (Lf != 8+3*s->img_n) return stbi__err(\"bad SOF len\",\"Corrupt JPEG\");\r\n  \r\n  z->rgb = 0;\r\n  for (i=0; i < s->img_n; ++i) {\r\n    static const unsigned char rgb[3] = { 'R', 'G', 'B' };\r\n    z->img_comp[i].id = stbi__get8(s);\r\n    if (s->img_n == 3 && z->img_comp[i].id == rgb[i])\r\n      ++z->rgb;\r\n    q = stbi__get8(s);\r\n    z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err(\"bad H\",\"Corrupt JPEG\");\r\n    z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err(\"bad V\",\"Corrupt JPEG\");\r\n    z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err(\"bad TQ\",\"Corrupt JPEG\");\r\n  }\r\n  \r\n  if (scan != STBI__SCAN_load) return 1;\r\n  \r\n  if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err(\"too large\", \"Image too large to decode\");\r\n  \r\n  for (i=0; i < s->img_n; ++i) {\r\n    if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;\r\n    if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;\r\n  }\r\n  \r\n  // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios\r\n  // and I've never seen a non-corrupted JPEG file actually use them\r\n  for (i=0; i < s->img_n; ++i) {\r\n    if (h_max % z->img_comp[i].h != 0) return stbi__err(\"bad H\",\"Corrupt JPEG\");\r\n    if (v_max % z->img_comp[i].v != 0) return stbi__err(\"bad V\",\"Corrupt JPEG\");\r\n  }\r\n  \r\n  // compute interleaved mcu info\r\n  z->img_h_max = h_max;\r\n  z->img_v_max = v_max;\r\n  z->img_mcu_w = h_max * 8;\r\n  z->img_mcu_h = v_max * 8;\r\n  // these sizes can't be more than 17 bits\r\n  z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;\r\n  z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;\r\n  \r\n  for (i=0; i < s->img_n; ++i) {\r\n    // number of effective pixels (e.g. for non-interleaved MCU)\r\n    z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;\r\n    z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;\r\n    // to simplify generation, we'll allocate enough memory to decode\r\n    // the bogus oversized data from using interleaved MCUs and their\r\n    // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't\r\n    // discard the extra data until colorspace conversion\r\n    //\r\n    // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)\r\n    // so these muls can't overflow with 32-bit ints (which we require)\r\n    z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;\r\n    z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;\r\n    z->img_comp[i].coeff = 0;\r\n    z->img_comp[i].raw_coeff = 0;\r\n    z->img_comp[i].linebuf = NULL;\r\n    z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);\r\n    if (z->img_comp[i].raw_data == NULL)\r\n      return stbi__free_jpeg_components(z, i+1, stbi__err(\"outofmem\", \"Out of memory\"));\r\n    // align blocks for idct using mmx/sse\r\n    z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);\r\n    if (z->progressive) {\r\n      // w2, h2 are multiples of 8 (see above)\r\n      z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;\r\n      z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;\r\n      z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);\r\n      if (z->img_comp[i].raw_coeff == NULL)\r\n        return stbi__free_jpeg_components(z, i+1, stbi__err(\"outofmem\", \"Out of memory\"));\r\n      z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);\r\n    }\r\n  }\r\n  \r\n  return 1;\r\n}\r\n\r\n// use comparisons since in some cases we handle more than one case (e.g. SOF)\r\n#define stbi__DNL(x)         ((x) == 0xdc)\r\n#define stbi__SOI(x)         ((x) == 0xd8)\r\n#define stbi__EOI(x)         ((x) == 0xd9)\r\n#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)\r\n#define stbi__SOS(x)         ((x) == 0xda)\r\n\r\n#define stbi__SOF_progressive(x)   ((x) == 0xc2)\r\n\r\nstatic int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)\r\n{\r\n  int m;\r\n  z->jfif = 0;\r\n  z->app14_color_transform = -1; // valid values are 0,1,2\r\n  z->marker = STBI__MARKER_none; // initialize cached marker to empty\r\n  m = stbi__get_marker(z);\r\n  if (!stbi__SOI(m)) return stbi__err(\"no SOI\",\"Corrupt JPEG\");\r\n  if (scan == STBI__SCAN_type) return 1;\r\n  m = stbi__get_marker(z);\r\n  while (!stbi__SOF(m)) {\r\n    if (!stbi__process_marker(z,m)) return 0;\r\n    m = stbi__get_marker(z);\r\n    while (m == STBI__MARKER_none) {\r\n      // some files have extra padding after their blocks, so ok, we'll scan\r\n      if (stbi__at_eof(z->s)) return stbi__err(\"no SOF\", \"Corrupt JPEG\");\r\n      m = stbi__get_marker(z);\r\n    }\r\n  }\r\n  z->progressive = stbi__SOF_progressive(m);\r\n  if (!stbi__process_frame_header(z, scan)) return 0;\r\n  return 1;\r\n}\r\n\r\nstatic stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)\r\n{\r\n  // some JPEGs have junk at end, skip over it but if we find what looks\r\n  // like a valid marker, resume there\r\n  while (!stbi__at_eof(j->s)) {\r\n    stbi_uc x = stbi__get8(j->s);\r\n    while (x == 0xff) { // might be a marker\r\n      if (stbi__at_eof(j->s)) return STBI__MARKER_none;\r\n      x = stbi__get8(j->s);\r\n      if (x != 0x00 && x != 0xff) {\r\n        // not a stuffed zero or lead-in to another marker, looks\r\n        // like an actual marker, return it\r\n        return x;\r\n      }\r\n      // stuffed zero has x=0 now which ends the loop, meaning we go\r\n      // back to regular scan loop.\r\n      // repeated 0xff keeps trying to read the next byte of the marker.\r\n    }\r\n  }\r\n  return STBI__MARKER_none;\r\n}\r\n\r\n// decode image to YCbCr format\r\nstatic int stbi__decode_jpeg_image(stbi__jpeg *j)\r\n{\r\n  int m;\r\n  for (m = 0; m < 4; m++) {\r\n    j->img_comp[m].raw_data = NULL;\r\n    j->img_comp[m].raw_coeff = NULL;\r\n  }\r\n  j->restart_interval = 0;\r\n  if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;\r\n  m = stbi__get_marker(j);\r\n  while (!stbi__EOI(m)) {\r\n    if (stbi__SOS(m)) {\r\n      if (!stbi__process_scan_header(j)) return 0;\r\n      if (!stbi__parse_entropy_coded_data(j)) return 0;\r\n      if (j->marker == STBI__MARKER_none ) {\r\n        j->marker = stbi__skip_jpeg_junk_at_end(j);\r\n        // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0\r\n      }\r\n      m = stbi__get_marker(j);\r\n      if (STBI__RESTART(m))\r\n        m = stbi__get_marker(j);\r\n    } else if (stbi__DNL(m)) {\r\n      int Ld = stbi__get16be(j->s);\r\n      stbi__uint32 NL = stbi__get16be(j->s);\r\n      if (Ld != 4) return stbi__err(\"bad DNL len\", \"Corrupt JPEG\");\r\n      if (NL != j->s->img_y) return stbi__err(\"bad DNL height\", \"Corrupt JPEG\");\r\n      m = stbi__get_marker(j);\r\n    } else {\r\n      if (!stbi__process_marker(j, m)) return 1;\r\n      m = stbi__get_marker(j);\r\n    }\r\n  }\r\n  if (j->progressive)\r\n    stbi__jpeg_finish(j);\r\n  return 1;\r\n}\r\n\r\n// static jfif-centered resampling (across block boundaries)\r\n\r\ntypedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,\r\n                                      int w, int hs);\r\n\r\n#define stbi__div4(x) ((stbi_uc) ((x) >> 2))\r\n\r\nstatic stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\r\n{\r\n  STBI_NOTUSED(out);\r\n  STBI_NOTUSED(in_far);\r\n  STBI_NOTUSED(w);\r\n  STBI_NOTUSED(hs);\r\n  return in_near;\r\n}\r\n\r\nstatic stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\r\n{\r\n  // need to generate two samples vertically for every one in input\r\n  int i;\r\n  STBI_NOTUSED(hs);\r\n  for (i=0; i < w; ++i)\r\n    out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);\r\n  return out;\r\n}\r\n\r\nstatic stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\r\n{\r\n  // need to generate two samples horizontally for every one in input\r\n  int i;\r\n  stbi_uc *input = in_near;\r\n  \r\n  if (w == 1) {\r\n    // if only one sample, can't do any interpolation\r\n    out[0] = out[1] = input[0];\r\n    return out;\r\n  }\r\n  \r\n  out[0] = input[0];\r\n  out[1] = stbi__div4(input[0]*3 + input[1] + 2);\r\n  for (i=1; i < w-1; ++i) {\r\n    int n = 3*input[i]+2;\r\n    out[i*2+0] = stbi__div4(n+input[i-1]);\r\n    out[i*2+1] = stbi__div4(n+input[i+1]);\r\n  }\r\n  out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);\r\n  out[i*2+1] = input[w-1];\r\n  \r\n  STBI_NOTUSED(in_far);\r\n  STBI_NOTUSED(hs);\r\n  \r\n  return out;\r\n}\r\n\r\n#define stbi__div16(x) ((stbi_uc) ((x) >> 4))\r\n\r\nstatic stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\r\n{\r\n  // need to generate 2x2 samples for every one in input\r\n  int i,t0,t1;\r\n  if (w == 1) {\r\n    out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\r\n    return out;\r\n  }\r\n  \r\n  t1 = 3*in_near[0] + in_far[0];\r\n  out[0] = stbi__div4(t1+2);\r\n  for (i=1; i < w; ++i) {\r\n    t0 = t1;\r\n    t1 = 3*in_near[i]+in_far[i];\r\n    out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\r\n    out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\r\n  }\r\n  out[w*2-1] = stbi__div4(t1+2);\r\n  \r\n  STBI_NOTUSED(hs);\r\n  \r\n  return out;\r\n}\r\n\r\n#if defined(STBI_SSE2) || defined(STBI_NEON)\r\nstatic stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\r\n{\r\n  // need to generate 2x2 samples for every one in input\r\n  int i=0,t0,t1;\r\n  \r\n  if (w == 1) {\r\n    out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);\r\n    return out;\r\n  }\r\n  \r\n  t1 = 3*in_near[0] + in_far[0];\r\n  // process groups of 8 pixels for as long as we can.\r\n  // note we can't handle the last pixel in a row in this loop\r\n  // because we need to handle the filter boundary conditions.\r\n  for (; i < ((w-1) & ~7); i += 8) {\r\n#if defined(STBI_SSE2)\r\n    // load and perform the vertical filtering pass\r\n    // this uses 3*x + y = 4*x + (y - x)\r\n    __m128i zero  = _mm_setzero_si128();\r\n    __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));\r\n    __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));\r\n    __m128i farw  = _mm_unpacklo_epi8(farb, zero);\r\n    __m128i nearw = _mm_unpacklo_epi8(nearb, zero);\r\n    __m128i diff  = _mm_sub_epi16(farw, nearw);\r\n    __m128i nears = _mm_slli_epi16(nearw, 2);\r\n    __m128i curr  = _mm_add_epi16(nears, diff); // current row\r\n    \r\n    // horizontal filter works the same based on shifted vers of current\r\n    // row. \"prev\" is current row shifted right by 1 pixel; we need to\r\n    // insert the previous pixel value (from t1).\r\n    // \"next\" is current row shifted left by 1 pixel, with first pixel\r\n    // of next block of 8 pixels added in.\r\n    __m128i prv0 = _mm_slli_si128(curr, 2);\r\n    __m128i nxt0 = _mm_srli_si128(curr, 2);\r\n    __m128i prev = _mm_insert_epi16(prv0, t1, 0);\r\n    __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);\r\n    \r\n    // horizontal filter, polyphase implementation since it's convenient:\r\n    // even pixels = 3*cur + prev = cur*4 + (prev - cur)\r\n    // odd  pixels = 3*cur + next = cur*4 + (next - cur)\r\n    // note the shared term.\r\n    __m128i bias  = _mm_set1_epi16(8);\r\n    __m128i curs = _mm_slli_epi16(curr, 2);\r\n    __m128i prvd = _mm_sub_epi16(prev, curr);\r\n    __m128i nxtd = _mm_sub_epi16(next, curr);\r\n    __m128i curb = _mm_add_epi16(curs, bias);\r\n    __m128i even = _mm_add_epi16(prvd, curb);\r\n    __m128i odd  = _mm_add_epi16(nxtd, curb);\r\n    \r\n    // interleave even and odd pixels, then undo scaling.\r\n    __m128i int0 = _mm_unpacklo_epi16(even, odd);\r\n    __m128i int1 = _mm_unpackhi_epi16(even, odd);\r\n    __m128i de0  = _mm_srli_epi16(int0, 4);\r\n    __m128i de1  = _mm_srli_epi16(int1, 4);\r\n    \r\n    // pack and write output\r\n    __m128i outv = _mm_packus_epi16(de0, de1);\r\n    _mm_storeu_si128((__m128i *) (out + i*2), outv);\r\n#elif defined(STBI_NEON)\r\n    // load and perform the vertical filtering pass\r\n    // this uses 3*x + y = 4*x + (y - x)\r\n    uint8x8_t farb  = vld1_u8(in_far + i);\r\n    uint8x8_t nearb = vld1_u8(in_near + i);\r\n    int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));\r\n    int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));\r\n    int16x8_t curr  = vaddq_s16(nears, diff); // current row\r\n    \r\n    // horizontal filter works the same based on shifted vers of current\r\n    // row. \"prev\" is current row shifted right by 1 pixel; we need to\r\n    // insert the previous pixel value (from t1).\r\n    // \"next\" is current row shifted left by 1 pixel, with first pixel\r\n    // of next block of 8 pixels added in.\r\n    int16x8_t prv0 = vextq_s16(curr, curr, 7);\r\n    int16x8_t nxt0 = vextq_s16(curr, curr, 1);\r\n    int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);\r\n    int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);\r\n    \r\n    // horizontal filter, polyphase implementation since it's convenient:\r\n    // even pixels = 3*cur + prev = cur*4 + (prev - cur)\r\n    // odd  pixels = 3*cur + next = cur*4 + (next - cur)\r\n    // note the shared term.\r\n    int16x8_t curs = vshlq_n_s16(curr, 2);\r\n    int16x8_t prvd = vsubq_s16(prev, curr);\r\n    int16x8_t nxtd = vsubq_s16(next, curr);\r\n    int16x8_t even = vaddq_s16(curs, prvd);\r\n    int16x8_t odd  = vaddq_s16(curs, nxtd);\r\n    \r\n    // undo scaling and round, then store with even/odd phases interleaved\r\n    uint8x8x2_t o;\r\n    o.val[0] = vqrshrun_n_s16(even, 4);\r\n    o.val[1] = vqrshrun_n_s16(odd,  4);\r\n    vst2_u8(out + i*2, o);\r\n#endif\r\n    \r\n    // \"previous\" value for next iter\r\n    t1 = 3*in_near[i+7] + in_far[i+7];\r\n  }\r\n  \r\n  t0 = t1;\r\n  t1 = 3*in_near[i] + in_far[i];\r\n  out[i*2] = stbi__div16(3*t1 + t0 + 8);\r\n  \r\n  for (++i; i < w; ++i) {\r\n    t0 = t1;\r\n    t1 = 3*in_near[i]+in_far[i];\r\n    out[i*2-1] = stbi__div16(3*t0 + t1 + 8);\r\n    out[i*2  ] = stbi__div16(3*t1 + t0 + 8);\r\n  }\r\n  out[w*2-1] = stbi__div4(t1+2);\r\n  \r\n  STBI_NOTUSED(hs);\r\n  \r\n  return out;\r\n}\r\n#endif\r\n\r\nstatic stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)\r\n{\r\n  // resample with nearest-neighbor\r\n  int i,j;\r\n  STBI_NOTUSED(in_far);\r\n  for (i=0; i < w; ++i)\r\n    for (j=0; j < hs; ++j)\r\n    out[i*hs+j] = in_near[i];\r\n  return out;\r\n}\r\n\r\n// this is a reduced-precision calculation of YCbCr-to-RGB introduced\r\n// to make sure the code produces the same results in both SIMD and scalar\r\n#define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)\r\nstatic void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)\r\n{\r\n  int i;\r\n  for (i=0; i < count; ++i) {\r\n    int y_fixed = (y[i] << 20) + (1<<19); // rounding\r\n    int r,g,b;\r\n    int cr = pcr[i] - 128;\r\n    int cb = pcb[i] - 128;\r\n    r = y_fixed +  cr* stbi__float2fixed(1.40200f);\r\n    g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);\r\n    b = y_fixed                                     +   cb* stbi__float2fixed(1.77200f);\r\n    r >>= 20;\r\n    g >>= 20;\r\n    b >>= 20;\r\n    if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\r\n    if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\r\n    if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\r\n    out[0] = (stbi_uc)r;\r\n    out[1] = (stbi_uc)g;\r\n    out[2] = (stbi_uc)b;\r\n    out[3] = 255;\r\n    out += step;\r\n  }\r\n}\r\n\r\n#if defined(STBI_SSE2) || defined(STBI_NEON)\r\nstatic void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)\r\n{\r\n  int i = 0;\r\n  \r\n#ifdef STBI_SSE2\r\n  // step == 3 is pretty ugly on the final interleave, and i'm not convinced\r\n  // it's useful in practice (you wouldn't use it for textures, for example).\r\n  // so just accelerate step == 4 case.\r\n  if (step == 4) {\r\n    // this is a fairly straightforward implementation and not super-optimized.\r\n    __m128i signflip  = _mm_set1_epi8(-0x80);\r\n    __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));\r\n    __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));\r\n    __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));\r\n    __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));\r\n    __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);\r\n    __m128i xw = _mm_set1_epi16(255); // alpha channel\r\n    \r\n    for (; i+7 < count; i += 8) {\r\n      // load\r\n      __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));\r\n      __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));\r\n      __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));\r\n      __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128\r\n      __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128\r\n      \r\n      // unpack to short (and left-shift cr, cb by 8)\r\n      __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);\r\n      __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);\r\n      __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);\r\n      \r\n      // color transform\r\n      __m128i yws = _mm_srli_epi16(yw, 4);\r\n      __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);\r\n      __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);\r\n      __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);\r\n      __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);\r\n      __m128i rws = _mm_add_epi16(cr0, yws);\r\n      __m128i gwt = _mm_add_epi16(cb0, yws);\r\n      __m128i bws = _mm_add_epi16(yws, cb1);\r\n      __m128i gws = _mm_add_epi16(gwt, cr1);\r\n      \r\n      // descale\r\n      __m128i rw = _mm_srai_epi16(rws, 4);\r\n      __m128i bw = _mm_srai_epi16(bws, 4);\r\n      __m128i gw = _mm_srai_epi16(gws, 4);\r\n      \r\n      // back to byte, set up for transpose\r\n      __m128i brb = _mm_packus_epi16(rw, bw);\r\n      __m128i gxb = _mm_packus_epi16(gw, xw);\r\n      \r\n      // transpose to interleave channels\r\n      __m128i t0 = _mm_unpacklo_epi8(brb, gxb);\r\n      __m128i t1 = _mm_unpackhi_epi8(brb, gxb);\r\n      __m128i o0 = _mm_unpacklo_epi16(t0, t1);\r\n      __m128i o1 = _mm_unpackhi_epi16(t0, t1);\r\n      \r\n      // store\r\n      _mm_storeu_si128((__m128i *) (out + 0), o0);\r\n      _mm_storeu_si128((__m128i *) (out + 16), o1);\r\n      out += 32;\r\n    }\r\n  }\r\n#endif\r\n  \r\n#ifdef STBI_NEON\r\n  // in this version, step=3 support would be easy to add. but is there demand?\r\n  if (step == 4) {\r\n    // this is a fairly straightforward implementation and not super-optimized.\r\n    uint8x8_t signflip = vdup_n_u8(0x80);\r\n    int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));\r\n    int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));\r\n    int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));\r\n    int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));\r\n    \r\n    for (; i+7 < count; i += 8) {\r\n      // load\r\n      uint8x8_t y_bytes  = vld1_u8(y + i);\r\n      uint8x8_t cr_bytes = vld1_u8(pcr + i);\r\n      uint8x8_t cb_bytes = vld1_u8(pcb + i);\r\n      int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));\r\n      int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));\r\n      \r\n      // expand to s16\r\n      int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));\r\n      int16x8_t crw = vshll_n_s8(cr_biased, 7);\r\n      int16x8_t cbw = vshll_n_s8(cb_biased, 7);\r\n      \r\n      // color transform\r\n      int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);\r\n      int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);\r\n      int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);\r\n      int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);\r\n      int16x8_t rws = vaddq_s16(yws, cr0);\r\n      int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);\r\n      int16x8_t bws = vaddq_s16(yws, cb1);\r\n      \r\n      // undo scaling, round, convert to byte\r\n      uint8x8x4_t o;\r\n      o.val[0] = vqrshrun_n_s16(rws, 4);\r\n      o.val[1] = vqrshrun_n_s16(gws, 4);\r\n      o.val[2] = vqrshrun_n_s16(bws, 4);\r\n      o.val[3] = vdup_n_u8(255);\r\n      \r\n      // store, interleaving r/g/b/a\r\n      vst4_u8(out, o);\r\n      out += 8*4;\r\n    }\r\n  }\r\n#endif\r\n  \r\n  for (; i < count; ++i) {\r\n    int y_fixed = (y[i] << 20) + (1<<19); // rounding\r\n    int r,g,b;\r\n    int cr = pcr[i] - 128;\r\n    int cb = pcb[i] - 128;\r\n    r = y_fixed + cr* stbi__float2fixed(1.40200f);\r\n    g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);\r\n    b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);\r\n    r >>= 20;\r\n    g >>= 20;\r\n    b >>= 20;\r\n    if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }\r\n    if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }\r\n    if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }\r\n    out[0] = (stbi_uc)r;\r\n    out[1] = (stbi_uc)g;\r\n    out[2] = (stbi_uc)b;\r\n    out[3] = 255;\r\n    out += step;\r\n  }\r\n}\r\n#endif\r\n\r\n// set up the kernels\r\nstatic void stbi__setup_jpeg(stbi__jpeg *j)\r\n{\r\n  j->idct_block_kernel = stbi__idct_block;\r\n  j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;\r\n  j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;\r\n  \r\n#ifdef STBI_SSE2\r\n  if (stbi__sse2_available()) {\r\n    j->idct_block_kernel = stbi__idct_simd;\r\n    j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\r\n    j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\r\n  }\r\n#endif\r\n  \r\n#ifdef STBI_NEON\r\n  j->idct_block_kernel = stbi__idct_simd;\r\n  j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;\r\n  j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;\r\n#endif\r\n}\r\n\r\n// clean up the temporary component buffers\r\nstatic void stbi__cleanup_jpeg(stbi__jpeg *j)\r\n{\r\n  stbi__free_jpeg_components(j, j->s->img_n, 0);\r\n}\r\n\r\ntypedef struct\r\n{\r\n  resample_row_func resample;\r\n  stbi_uc *line0,*line1;\r\n  int hs,vs;   // expansion factor in each axis\r\n  int w_lores; // horizontal pixels pre-expansion\r\n  int ystep;   // how far through vertical expansion we are\r\n  int ypos;    // which pre-expansion row we're on\r\n} stbi__resample;\r\n\r\n// fast 0..255 * 0..255 => 0..255 rounded multiplication\r\nstatic stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)\r\n{\r\n  unsigned int t = x*y + 128;\r\n  return (stbi_uc) ((t + (t >>8)) >> 8);\r\n}\r\n\r\nstatic stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)\r\n{\r\n  int n, decode_n, is_rgb;\r\n  z->s->img_n = 0; // make stbi__cleanup_jpeg safe\r\n  \r\n  // validate req_comp\r\n  if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\r\n  \r\n  // load a jpeg image from whichever source, but leave in YCbCr format\r\n  if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }\r\n  \r\n  // determine actual number of components to generate\r\n  n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;\r\n  \r\n  is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));\r\n  \r\n  if (z->s->img_n == 3 && n < 3 && !is_rgb)\r\n    decode_n = 1;\r\n  else\r\n    decode_n = z->s->img_n;\r\n  \r\n  // nothing to do if no components requested; check this now to avoid\r\n  // accessing uninitialized coutput[0] later\r\n  if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }\r\n  \r\n  // resample and color-convert\r\n  {\r\n    int k;\r\n    unsigned int i,j;\r\n    stbi_uc *output;\r\n    stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };\r\n    \r\n    stbi__resample res_comp[4];\r\n    \r\n    for (k=0; k < decode_n; ++k) {\r\n      stbi__resample *r = &res_comp[k];\r\n      \r\n      // allocate line buffer big enough for upsampling off the edges\r\n      // with upsample factor of 4\r\n      z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);\r\n      if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\r\n      \r\n      r->hs      = z->img_h_max / z->img_comp[k].h;\r\n      r->vs      = z->img_v_max / z->img_comp[k].v;\r\n      r->ystep   = r->vs >> 1;\r\n      r->w_lores = (z->s->img_x + r->hs-1) / r->hs;\r\n      r->ypos    = 0;\r\n      r->line0   = r->line1 = z->img_comp[k].data;\r\n      \r\n      if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;\r\n      else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;\r\n      else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;\r\n      else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;\r\n      else                               r->resample = stbi__resample_row_generic;\r\n    }\r\n    \r\n    // can't error after this so, this is safe\r\n    output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);\r\n    if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc(\"outofmem\", \"Out of memory\"); }\r\n    \r\n    // now go ahead and resample\r\n    for (j=0; j < z->s->img_y; ++j) {\r\n      stbi_uc *out = output + n * z->s->img_x * j;\r\n      for (k=0; k < decode_n; ++k) {\r\n        stbi__resample *r = &res_comp[k];\r\n        int y_bot = r->ystep >= (r->vs >> 1);\r\n        coutput[k] = r->resample(z->img_comp[k].linebuf,\r\n                                 y_bot ? r->line1 : r->line0,\r\n                                 y_bot ? r->line0 : r->line1,\r\n                                 r->w_lores, r->hs);\r\n        if (++r->ystep >= r->vs) {\r\n          r->ystep = 0;\r\n          r->line0 = r->line1;\r\n          if (++r->ypos < z->img_comp[k].y)\r\n            r->line1 += z->img_comp[k].w2;\r\n        }\r\n      }\r\n      if (n >= 3) {\r\n        stbi_uc *y = coutput[0];\r\n        if (z->s->img_n == 3) {\r\n          if (is_rgb) {\r\n            for (i=0; i < z->s->img_x; ++i) {\r\n              out[0] = y[i];\r\n              out[1] = coutput[1][i];\r\n              out[2] = coutput[2][i];\r\n              out[3] = 255;\r\n              out += n;\r\n            }\r\n          } else {\r\n            z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\r\n          }\r\n        } else if (z->s->img_n == 4) {\r\n          if (z->app14_color_transform == 0) { // CMYK\r\n            for (i=0; i < z->s->img_x; ++i) {\r\n              stbi_uc m = coutput[3][i];\r\n              out[0] = stbi__blinn_8x8(coutput[0][i], m);\r\n              out[1] = stbi__blinn_8x8(coutput[1][i], m);\r\n              out[2] = stbi__blinn_8x8(coutput[2][i], m);\r\n              out[3] = 255;\r\n              out += n;\r\n            }\r\n          } else if (z->app14_color_transform == 2) { // YCCK\r\n            z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\r\n            for (i=0; i < z->s->img_x; ++i) {\r\n              stbi_uc m = coutput[3][i];\r\n              out[0] = stbi__blinn_8x8(255 - out[0], m);\r\n              out[1] = stbi__blinn_8x8(255 - out[1], m);\r\n              out[2] = stbi__blinn_8x8(255 - out[2], m);\r\n              out += n;\r\n            }\r\n          } else { // YCbCr + alpha?  Ignore the fourth channel for now\r\n            z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);\r\n          }\r\n        } else\r\n          for (i=0; i < z->s->img_x; ++i) {\r\n          out[0] = out[1] = out[2] = y[i];\r\n          out[3] = 255; // not used if n==3\r\n          out += n;\r\n        }\r\n      } else {\r\n        if (is_rgb) {\r\n          if (n == 1)\r\n            for (i=0; i < z->s->img_x; ++i)\r\n            *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);\r\n          else {\r\n            for (i=0; i < z->s->img_x; ++i, out += 2) {\r\n              out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);\r\n              out[1] = 255;\r\n            }\r\n          }\r\n        } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {\r\n          for (i=0; i < z->s->img_x; ++i) {\r\n            stbi_uc m = coutput[3][i];\r\n            stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);\r\n            stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);\r\n            stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);\r\n            out[0] = stbi__compute_y(r, g, b);\r\n            out[1] = 255;\r\n            out += n;\r\n          }\r\n        } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {\r\n          for (i=0; i < z->s->img_x; ++i) {\r\n            out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);\r\n            out[1] = 255;\r\n            out += n;\r\n          }\r\n        } else {\r\n          stbi_uc *y = coutput[0];\r\n          if (n == 1)\r\n            for (i=0; i < z->s->img_x; ++i) out[i] = y[i];\r\n          else\r\n            for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }\r\n        }\r\n      }\r\n    }\r\n    stbi__cleanup_jpeg(z);\r\n    *out_x = z->s->img_x;\r\n    *out_y = z->s->img_y;\r\n    if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output\r\n    return output;\r\n  }\r\n}\r\n\r\nstatic void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  unsigned char* result;\r\n  stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));\r\n  if (!j) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  memset(j, 0, sizeof(stbi__jpeg));\r\n  STBI_NOTUSED(ri);\r\n  j->s = s;\r\n  stbi__setup_jpeg(j);\r\n  result = load_jpeg_image(j, x,y,comp,req_comp);\r\n  STBI_FREE(j);\r\n  return result;\r\n}\r\n\r\nstatic int stbi__jpeg_test(stbi__context *s)\r\n{\r\n  int r;\r\n  stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));\r\n  if (!j) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  memset(j, 0, sizeof(stbi__jpeg));\r\n  j->s = s;\r\n  stbi__setup_jpeg(j);\r\n  r = stbi__decode_jpeg_header(j, STBI__SCAN_type);\r\n  stbi__rewind(s);\r\n  STBI_FREE(j);\r\n  return r;\r\n}\r\n\r\nstatic int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)\r\n{\r\n  if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {\r\n    stbi__rewind( j->s );\r\n    return 0;\r\n  }\r\n  if (x) *x = j->s->img_x;\r\n  if (y) *y = j->s->img_y;\r\n  if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  int result;\r\n  stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));\r\n  if (!j) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  memset(j, 0, sizeof(stbi__jpeg));\r\n  j->s = s;\r\n  result = stbi__jpeg_info_raw(j, x, y, comp);\r\n  STBI_FREE(j);\r\n  return result;\r\n}\r\n#endif\r\n\r\n// public domain zlib decode    v0.2  Sean Barrett 2006-11-18\r\n//    simple implementation\r\n//      - all input must be provided in an upfront buffer\r\n//      - all output is written to a single output buffer (can malloc/realloc)\r\n//    performance\r\n//      - fast huffman\r\n\r\n#ifndef STBI_NO_ZLIB\r\n\r\n// fast-way is faster to check than jpeg huffman, but slow way is slower\r\n#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables\r\n#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)\r\n#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet\r\n\r\n// zlib-style huffman encoding\r\n// (jpegs packs from left, zlib from right, so can't share code)\r\ntypedef struct\r\n{\r\n  stbi__uint16 fast[1 << STBI__ZFAST_BITS];\r\n  stbi__uint16 firstcode[16];\r\n  int maxcode[17];\r\n  stbi__uint16 firstsymbol[16];\r\n  stbi_uc  size[STBI__ZNSYMS];\r\n  stbi__uint16 value[STBI__ZNSYMS];\r\n} stbi__zhuffman;\r\n\r\nstbi_inline static int stbi__bitreverse16(int n)\r\n{\r\n  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);\r\n  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);\r\n  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);\r\n  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);\r\n  return n;\r\n}\r\n\r\nstbi_inline static int stbi__bit_reverse(int v, int bits)\r\n{\r\n  STBI_ASSERT(bits <= 16);\r\n  // to bit reverse n bits, reverse 16 and shift\r\n  // e.g. 11 bits, bit reverse and shift away 5\r\n  return stbi__bitreverse16(v) >> (16-bits);\r\n}\r\n\r\nstatic int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)\r\n{\r\n  int i,k=0;\r\n  int code, next_code[16], sizes[17];\r\n  \r\n  // DEFLATE spec for generating codes\r\n  memset(sizes, 0, sizeof(sizes));\r\n  memset(z->fast, 0, sizeof(z->fast));\r\n  for (i=0; i < num; ++i)\r\n    ++sizes[sizelist[i]];\r\n  sizes[0] = 0;\r\n  for (i=1; i < 16; ++i)\r\n    if (sizes[i] > (1 << i))\r\n    return stbi__err(\"bad sizes\", \"Corrupt PNG\");\r\n  code = 0;\r\n  for (i=1; i < 16; ++i) {\r\n    next_code[i] = code;\r\n    z->firstcode[i] = (stbi__uint16) code;\r\n    z->firstsymbol[i] = (stbi__uint16) k;\r\n    code = (code + sizes[i]);\r\n    if (sizes[i])\r\n      if (code-1 >= (1 << i)) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\r\n    z->maxcode[i] = code << (16-i); // preshift for inner loop\r\n    code <<= 1;\r\n    k += sizes[i];\r\n  }\r\n  z->maxcode[16] = 0x10000; // sentinel\r\n  for (i=0; i < num; ++i) {\r\n    int s = sizelist[i];\r\n    if (s) {\r\n      int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];\r\n      stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);\r\n      z->size [c] = (stbi_uc     ) s;\r\n      z->value[c] = (stbi__uint16) i;\r\n      if (s <= STBI__ZFAST_BITS) {\r\n        int j = stbi__bit_reverse(next_code[s],s);\r\n        while (j < (1 << STBI__ZFAST_BITS)) {\r\n          z->fast[j] = fastv;\r\n          j += (1 << s);\r\n        }\r\n      }\r\n      ++next_code[s];\r\n    }\r\n  }\r\n  return 1;\r\n}\r\n\r\n// zlib-from-memory implementation for PNG reading\r\n//    because PNG allows splitting the zlib stream arbitrarily,\r\n//    and it's annoying structurally to have PNG call ZLIB call PNG,\r\n//    we require PNG read all the IDATs and combine them into a single\r\n//    memory buffer\r\n\r\ntypedef struct\r\n{\r\n  stbi_uc *zbuffer, *zbuffer_end;\r\n  int num_bits;\r\n  int hit_zeof_once;\r\n  stbi__uint32 code_buffer;\r\n  \r\n  char *zout;\r\n  char *zout_start;\r\n  char *zout_end;\r\n  int   z_expandable;\r\n  \r\n  stbi__zhuffman z_length, z_distance;\r\n} stbi__zbuf;\r\n\r\nstbi_inline static int stbi__zeof(stbi__zbuf *z)\r\n{\r\n  return (z->zbuffer >= z->zbuffer_end);\r\n}\r\n\r\nstbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)\r\n{\r\n  return stbi__zeof(z) ? 0 : *z->zbuffer++;\r\n}\r\n\r\nstatic void stbi__fill_bits(stbi__zbuf *z)\r\n{\r\n  do {\r\n    if (z->code_buffer >= (1U << z->num_bits)) {\r\n      z->zbuffer = z->zbuffer_end;  /* treat this as EOF so we fail. */\r\n      return;\r\n    }\r\n    z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;\r\n    z->num_bits += 8;\r\n  } while (z->num_bits <= 24);\r\n}\r\n\r\nstbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)\r\n{\r\n  unsigned int k;\r\n  if (z->num_bits < n) stbi__fill_bits(z);\r\n  k = z->code_buffer & ((1 << n) - 1);\r\n  z->code_buffer >>= n;\r\n  z->num_bits -= n;\r\n  return k;\r\n}\r\n\r\nstatic int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)\r\n{\r\n  int b,s,k;\r\n  // not resolved by fast table, so compute it the slow way\r\n  // use jpeg approach, which requires MSbits at top\r\n  k = stbi__bit_reverse(a->code_buffer, 16);\r\n  for (s=STBI__ZFAST_BITS+1; ; ++s)\r\n    if (k < z->maxcode[s])\r\n    break;\r\n  if (s >= 16) return -1; // invalid code!\r\n  // code size is s, so:\r\n  b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];\r\n  if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere!\r\n  if (z->size[b] != s) return -1;  // was originally an assert, but report failure instead.\r\n  a->code_buffer >>= s;\r\n  a->num_bits -= s;\r\n  return z->value[b];\r\n}\r\n\r\nstbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)\r\n{\r\n  int b,s;\r\n  if (a->num_bits < 16) {\r\n    if (stbi__zeof(a)) {\r\n      if (!a->hit_zeof_once) {\r\n        // This is the first time we hit eof, insert 16 extra padding btis\r\n        // to allow us to keep going; if we actually consume any of them\r\n        // though, that is invalid data. This is caught later.\r\n        a->hit_zeof_once = 1;\r\n        a->num_bits += 16; // add 16 implicit zero bits\r\n      } else {\r\n        // We already inserted our extra 16 padding bits and are again\r\n        // out, this stream is actually prematurely terminated.\r\n        return -1;\r\n      }\r\n    } else {\r\n      stbi__fill_bits(a);\r\n    }\r\n  }\r\n  b = z->fast[a->code_buffer & STBI__ZFAST_MASK];\r\n  if (b) {\r\n    s = b >> 9;\r\n    a->code_buffer >>= s;\r\n    a->num_bits -= s;\r\n    return b & 511;\r\n  }\r\n  return stbi__zhuffman_decode_slowpath(a, z);\r\n}\r\n\r\nstatic int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes\r\n{\r\n  char *q;\r\n  unsigned int cur, limit, old_limit;\r\n  z->zout = zout;\r\n  if (!z->z_expandable) return stbi__err(\"output buffer limit\",\"Corrupt PNG\");\r\n  cur   = (unsigned int) (z->zout - z->zout_start);\r\n  limit = old_limit = (unsigned) (z->zout_end - z->zout_start);\r\n  if (UINT_MAX - cur < (unsigned) n) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  while (cur + n > limit) {\r\n    if(limit > UINT_MAX / 2) return stbi__err(\"outofmem\", \"Out of memory\");\r\n    limit *= 2;\r\n  }\r\n  q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);\r\n  STBI_NOTUSED(old_limit);\r\n  if (q == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  z->zout_start = q;\r\n  z->zout       = q + cur;\r\n  z->zout_end   = q + limit;\r\n  return 1;\r\n}\r\n\r\nstatic const int stbi__zlength_base[31] = {\r\n  3,4,5,6,7,8,9,10,11,13,\r\n  15,17,19,23,27,31,35,43,51,59,\r\n  67,83,99,115,131,163,195,227,258,0,0 };\r\n\r\nstatic const int stbi__zlength_extra[31]=\r\n{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };\r\n\r\nstatic const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,\r\n  257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};\r\n\r\nstatic const int stbi__zdist_extra[32] =\r\n{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\r\n\r\nstatic int stbi__parse_huffman_block(stbi__zbuf *a)\r\n{\r\n  char *zout = a->zout;\r\n  for(;;) {\r\n    int z = stbi__zhuffman_decode(a, &a->z_length);\r\n    if (z < 256) {\r\n      if (z < 0) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // error in huffman codes\r\n      if (zout >= a->zout_end) {\r\n        if (!stbi__zexpand(a, zout, 1)) return 0;\r\n        zout = a->zout;\r\n      }\r\n      *zout++ = (char) z;\r\n    } else {\r\n      stbi_uc *p;\r\n      int len,dist;\r\n      if (z == 256) {\r\n        a->zout = zout;\r\n        if (a->hit_zeof_once && a->num_bits < 16) {\r\n          // The first time we hit zeof, we inserted 16 extra zero bits into our bit\r\n          // buffer so the decoder can just do its speculative decoding. But if we\r\n          // actually consumed any of those bits (which is the case when num_bits < 16),\r\n          // the stream actually read past the end so it is malformed.\r\n          return stbi__err(\"unexpected end\",\"Corrupt PNG\");\r\n        }\r\n        return 1;\r\n      }\r\n      if (z >= 286) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data\r\n      z -= 257;\r\n      len = stbi__zlength_base[z];\r\n      if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);\r\n      z = stbi__zhuffman_decode(a, &a->z_distance);\r\n      if (z < 0 || z >= 30) return stbi__err(\"bad huffman code\",\"Corrupt PNG\"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data\r\n      dist = stbi__zdist_base[z];\r\n      if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);\r\n      if (zout - a->zout_start < dist) return stbi__err(\"bad dist\",\"Corrupt PNG\");\r\n      if (len > a->zout_end - zout) {\r\n        if (!stbi__zexpand(a, zout, len)) return 0;\r\n        zout = a->zout;\r\n      }\r\n      p = (stbi_uc *) (zout - dist);\r\n      if (dist == 1) { // run of one byte; common in images.\r\n        stbi_uc v = *p;\r\n        if (len) { do *zout++ = v; while (--len); }\r\n      } else {\r\n        if (len) { do *zout++ = *p++; while (--len); }\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\nstatic int stbi__compute_huffman_codes(stbi__zbuf *a)\r\n{\r\n  static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };\r\n  stbi__zhuffman z_codelength;\r\n  stbi_uc lencodes[286+32+137];//padding for maximum single op\r\n  stbi_uc codelength_sizes[19];\r\n  int i,n;\r\n  \r\n  int hlit  = stbi__zreceive(a,5) + 257;\r\n  int hdist = stbi__zreceive(a,5) + 1;\r\n  int hclen = stbi__zreceive(a,4) + 4;\r\n  int ntot  = hlit + hdist;\r\n  \r\n  memset(codelength_sizes, 0, sizeof(codelength_sizes));\r\n  for (i=0; i < hclen; ++i) {\r\n    int s = stbi__zreceive(a,3);\r\n    codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;\r\n  }\r\n  if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;\r\n  \r\n  n = 0;\r\n  while (n < ntot) {\r\n    int c = stbi__zhuffman_decode(a, &z_codelength);\r\n    if (c < 0 || c >= 19) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\r\n    if (c < 16)\r\n      lencodes[n++] = (stbi_uc) c;\r\n    else {\r\n      stbi_uc fill = 0;\r\n      if (c == 16) {\r\n        c = stbi__zreceive(a,2)+3;\r\n        if (n == 0) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\r\n        fill = lencodes[n-1];\r\n      } else if (c == 17) {\r\n        c = stbi__zreceive(a,3)+3;\r\n      } else if (c == 18) {\r\n        c = stbi__zreceive(a,7)+11;\r\n      } else {\r\n        return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\r\n      }\r\n      if (ntot - n < c) return stbi__err(\"bad codelengths\", \"Corrupt PNG\");\r\n      memset(lencodes+n, fill, c);\r\n      n += c;\r\n    }\r\n  }\r\n  if (n != ntot) return stbi__err(\"bad codelengths\",\"Corrupt PNG\");\r\n  if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;\r\n  if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__parse_uncompressed_block(stbi__zbuf *a)\r\n{\r\n  stbi_uc header[4];\r\n  int len,nlen,k;\r\n  if (a->num_bits & 7)\r\n    stbi__zreceive(a, a->num_bits & 7); // discard\r\n  // drain the bit-packed data into header\r\n  k = 0;\r\n  while (a->num_bits > 0) {\r\n    header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check\r\n    a->code_buffer >>= 8;\r\n    a->num_bits -= 8;\r\n  }\r\n  if (a->num_bits < 0) return stbi__err(\"zlib corrupt\",\"Corrupt PNG\");\r\n  // now fill header the normal way\r\n  while (k < 4)\r\n    header[k++] = stbi__zget8(a);\r\n  len  = header[1] * 256 + header[0];\r\n  nlen = header[3] * 256 + header[2];\r\n  if (nlen != (len ^ 0xffff)) return stbi__err(\"zlib corrupt\",\"Corrupt PNG\");\r\n  if (a->zbuffer + len > a->zbuffer_end) return stbi__err(\"read past buffer\",\"Corrupt PNG\");\r\n  if (a->zout + len > a->zout_end)\r\n    if (!stbi__zexpand(a, a->zout, len)) return 0;\r\n  memcpy(a->zout, a->zbuffer, len);\r\n  a->zbuffer += len;\r\n  a->zout += len;\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__parse_zlib_header(stbi__zbuf *a)\r\n{\r\n  int cmf   = stbi__zget8(a);\r\n  int cm    = cmf & 15;\r\n  /* int cinfo = cmf >> 4; */\r\n  int flg   = stbi__zget8(a);\r\n  if (stbi__zeof(a)) return stbi__err(\"bad zlib header\",\"Corrupt PNG\"); // zlib spec\r\n  if ((cmf*256+flg) % 31 != 0) return stbi__err(\"bad zlib header\",\"Corrupt PNG\"); // zlib spec\r\n  if (flg & 32) return stbi__err(\"no preset dict\",\"Corrupt PNG\"); // preset dictionary not allowed in png\r\n  if (cm != 8) return stbi__err(\"bad compression\",\"Corrupt PNG\"); // DEFLATE required for png\r\n  // window = 1 << (8 + cinfo)... but who cares, we fully buffer output\r\n  return 1;\r\n}\r\n\r\nstatic const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =\r\n{\r\n  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\r\n  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\r\n  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\r\n  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,\r\n  8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\r\n  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\r\n  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\r\n  9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,\r\n  7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8\r\n};\r\nstatic const stbi_uc stbi__zdefault_distance[32] =\r\n{\r\n  5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5\r\n};\r\n/*\r\nInit algorithm:\r\n{\r\n   int i;   // use <= to match clearly with spec\r\n   for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;\r\n   for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;\r\n   for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;\r\n   for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;\r\n\r\n   for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;\r\n}\r\n*/\r\n\r\nstatic int stbi__parse_zlib(stbi__zbuf *a, int parse_header)\r\n{\r\n  int final, type;\r\n  if (parse_header)\r\n    if (!stbi__parse_zlib_header(a)) return 0;\r\n  a->num_bits = 0;\r\n  a->code_buffer = 0;\r\n  a->hit_zeof_once = 0;\r\n  do {\r\n    final = stbi__zreceive(a,1);\r\n    type = stbi__zreceive(a,2);\r\n    if (type == 0) {\r\n      if (!stbi__parse_uncompressed_block(a)) return 0;\r\n    } else if (type == 3) {\r\n      return 0;\r\n    } else {\r\n      if (type == 1) {\r\n        // use fixed code lengths\r\n        if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , STBI__ZNSYMS)) return 0;\r\n        if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;\r\n      } else {\r\n        if (!stbi__compute_huffman_codes(a)) return 0;\r\n      }\r\n      if (!stbi__parse_huffman_block(a)) return 0;\r\n    }\r\n  } while (!final);\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)\r\n{\r\n  a->zout_start = obuf;\r\n  a->zout       = obuf;\r\n  a->zout_end   = obuf + olen;\r\n  a->z_expandable = exp;\r\n  \r\n  return stbi__parse_zlib(a, parse_header);\r\n}\r\n\r\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)\r\n{\r\n  stbi__zbuf a;\r\n  char *p = (char *) stbi__malloc(initial_size);\r\n  if (p == NULL) return NULL;\r\n  a.zbuffer = (stbi_uc *) buffer;\r\n  a.zbuffer_end = (stbi_uc *) buffer + len;\r\n  if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {\r\n    if (outlen) *outlen = (int) (a.zout - a.zout_start);\r\n    return a.zout_start;\r\n  } else {\r\n    STBI_FREE(a.zout_start);\r\n    return NULL;\r\n  }\r\n}\r\n\r\nSTBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)\r\n{\r\n  return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);\r\n}\r\n\r\nSTBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)\r\n{\r\n  stbi__zbuf a;\r\n  char *p = (char *) stbi__malloc(initial_size);\r\n  if (p == NULL) return NULL;\r\n  a.zbuffer = (stbi_uc *) buffer;\r\n  a.zbuffer_end = (stbi_uc *) buffer + len;\r\n  if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {\r\n    if (outlen) *outlen = (int) (a.zout - a.zout_start);\r\n    return a.zout_start;\r\n  } else {\r\n    STBI_FREE(a.zout_start);\r\n    return NULL;\r\n  }\r\n}\r\n\r\nSTBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)\r\n{\r\n  stbi__zbuf a;\r\n  a.zbuffer = (stbi_uc *) ibuffer;\r\n  a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\r\n  if (stbi__do_zlib(&a, obuffer, olen, 0, 1))\r\n    return (int) (a.zout - a.zout_start);\r\n  else\r\n    return -1;\r\n}\r\n\r\nSTBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)\r\n{\r\n  stbi__zbuf a;\r\n  char *p = (char *) stbi__malloc(16384);\r\n  if (p == NULL) return NULL;\r\n  a.zbuffer = (stbi_uc *) buffer;\r\n  a.zbuffer_end = (stbi_uc *) buffer+len;\r\n  if (stbi__do_zlib(&a, p, 16384, 1, 0)) {\r\n    if (outlen) *outlen = (int) (a.zout - a.zout_start);\r\n    return a.zout_start;\r\n  } else {\r\n    STBI_FREE(a.zout_start);\r\n    return NULL;\r\n  }\r\n}\r\n\r\nSTBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)\r\n{\r\n  stbi__zbuf a;\r\n  a.zbuffer = (stbi_uc *) ibuffer;\r\n  a.zbuffer_end = (stbi_uc *) ibuffer + ilen;\r\n  if (stbi__do_zlib(&a, obuffer, olen, 0, 0))\r\n    return (int) (a.zout - a.zout_start);\r\n  else\r\n    return -1;\r\n}\r\n#endif\r\n\r\n// public domain \"baseline\" PNG decoder   v0.10  Sean Barrett 2006-11-18\r\n//    simple implementation\r\n//      - only 8-bit samples\r\n//      - no CRC checking\r\n//      - allocates lots of intermediate memory\r\n//        - avoids problem of streaming data between subsystems\r\n//        - avoids explicit window management\r\n//    performance\r\n//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding\r\n\r\n#ifndef STBI_NO_PNG\r\ntypedef struct\r\n{\r\n  stbi__uint32 length;\r\n  stbi__uint32 type;\r\n} stbi__pngchunk;\r\n\r\nstatic stbi__pngchunk stbi__get_chunk_header(stbi__context *s)\r\n{\r\n  stbi__pngchunk c;\r\n  c.length = stbi__get32be(s);\r\n  c.type   = stbi__get32be(s);\r\n  return c;\r\n}\r\n\r\nstatic int stbi__check_png_header(stbi__context *s)\r\n{\r\n  static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };\r\n  int i;\r\n  for (i=0; i < 8; ++i)\r\n    if (stbi__get8(s) != png_sig[i]) return stbi__err(\"bad png sig\",\"Not a PNG\");\r\n  return 1;\r\n}\r\n\r\ntypedef struct\r\n{\r\n  stbi__context *s;\r\n  stbi_uc *idata, *expanded, *out;\r\n  int depth;\r\n} stbi__png;\r\n\r\n\r\nenum {\r\n  STBI__F_none=0,\r\n  STBI__F_sub=1,\r\n  STBI__F_up=2,\r\n  STBI__F_avg=3,\r\n  STBI__F_paeth=4,\r\n  // synthetic filter used for first scanline to avoid needing a dummy row of 0s\r\n  STBI__F_avg_first\r\n};\r\n\r\nstatic stbi_uc first_row_filter[5] =\r\n{\r\n  STBI__F_none,\r\n  STBI__F_sub,\r\n  STBI__F_none,\r\n  STBI__F_avg_first,\r\n  STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub\r\n};\r\n\r\nstatic int stbi__paeth(int a, int b, int c)\r\n{\r\n  // This formulation looks very different from the reference in the PNG spec, but is\r\n  // actually equivalent and has favorable data dependencies and admits straightforward\r\n  // generation of branch-free code, which helps performance significantly.\r\n  int thresh = c*3 - (a + b);\r\n  int lo = a < b ? a : b;\r\n  int hi = a < b ? b : a;\r\n  int t0 = (hi <= thresh) ? lo : c;\r\n  int t1 = (thresh <= lo) ? hi : t0;\r\n  return t1;\r\n}\r\n\r\nstatic const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };\r\n\r\n// adds an extra all-255 alpha channel\r\n// dest == src is legal\r\n// img_n must be 1 or 3\r\nstatic void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n)\r\n{\r\n  int i;\r\n  // must process data backwards since we allow dest==src\r\n  if (img_n == 1) {\r\n    for (i=x-1; i >= 0; --i) {\r\n      dest[i*2+1] = 255;\r\n      dest[i*2+0] = src[i];\r\n    }\r\n  } else {\r\n    STBI_ASSERT(img_n == 3);\r\n    for (i=x-1; i >= 0; --i) {\r\n      dest[i*4+3] = 255;\r\n      dest[i*4+2] = src[i*3+2];\r\n      dest[i*4+1] = src[i*3+1];\r\n      dest[i*4+0] = src[i*3+0];\r\n    }\r\n  }\r\n}\r\n\r\n// create the png data from post-deflated data\r\nstatic int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)\r\n{\r\n  int bytes = (depth == 16 ? 2 : 1);\r\n  stbi__context *s = a->s;\r\n  stbi__uint32 i,j,stride = x*out_n*bytes;\r\n  stbi__uint32 img_len, img_width_bytes;\r\n  stbi_uc *filter_buf;\r\n  int all_ok = 1;\r\n  int k;\r\n  int img_n = s->img_n; // copy it into a local for later\r\n  \r\n  int output_bytes = out_n*bytes;\r\n  int filter_bytes = img_n*bytes;\r\n  int width = x;\r\n  \r\n  STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);\r\n  a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into\r\n  if (!a->out) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  \r\n  // note: error exits here don't need to clean up a->out individually,\r\n  // stbi__do_png always does on error.\r\n  if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err(\"too large\", \"Corrupt PNG\");\r\n  img_width_bytes = (((img_n * x * depth) + 7) >> 3);\r\n  if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err(\"too large\", \"Corrupt PNG\");\r\n  img_len = (img_width_bytes + 1) * y;\r\n  \r\n  // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,\r\n  // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),\r\n  // so just check for raw_len < img_len always.\r\n  if (raw_len < img_len) return stbi__err(\"not enough pixels\",\"Corrupt PNG\");\r\n  \r\n  // Allocate two scan lines worth of filter workspace buffer.\r\n  filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0);\r\n  if (!filter_buf) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  \r\n  // Filtering for low-bit-depth images\r\n  if (depth < 8) {\r\n    filter_bytes = 1;\r\n    width = img_width_bytes;\r\n  }\r\n  \r\n  for (j=0; j < y; ++j) {\r\n    // cur/prior filter buffers alternate\r\n    stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes;\r\n    stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes;\r\n    stbi_uc *dest = a->out + stride*j;\r\n    int nk = width * filter_bytes;\r\n    int filter = *raw++;\r\n    \r\n    // check filter type\r\n    if (filter > 4) {\r\n      all_ok = stbi__err(\"invalid filter\",\"Corrupt PNG\");\r\n      break;\r\n    }\r\n    \r\n    // if first row, use special filter that doesn't sample previous row\r\n    if (j == 0) filter = first_row_filter[filter];\r\n    \r\n    // perform actual filtering\r\n    switch (filter) {\r\n      case STBI__F_none:\r\n      memcpy(cur, raw, nk);\r\n      break;\r\n      case STBI__F_sub:\r\n      memcpy(cur, raw, filter_bytes);\r\n      for (k = filter_bytes; k < nk; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);\r\n      break;\r\n      case STBI__F_up:\r\n      for (k = 0; k < nk; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + prior[k]);\r\n      break;\r\n      case STBI__F_avg:\r\n      for (k = 0; k < filter_bytes; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));\r\n      for (k = filter_bytes; k < nk; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));\r\n      break;\r\n      case STBI__F_paeth:\r\n      for (k = 0; k < filter_bytes; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0)\r\n      for (k = filter_bytes; k < nk; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes]));\r\n      break;\r\n      case STBI__F_avg_first:\r\n      memcpy(cur, raw, filter_bytes);\r\n      for (k = filter_bytes; k < nk; ++k)\r\n        cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));\r\n      break;\r\n    }\r\n    \r\n    raw += nk;\r\n    \r\n    // expand decoded bits in cur to dest, also adding an extra alpha channel if desired\r\n    if (depth < 8) {\r\n      stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range\r\n      stbi_uc *in = cur;\r\n      stbi_uc *out = dest;\r\n      stbi_uc inb = 0;\r\n      stbi__uint32 nsmp = x*img_n;\r\n      \r\n      // expand bits to bytes first\r\n      if (depth == 4) {\r\n        for (i=0; i < nsmp; ++i) {\r\n          if ((i & 1) == 0) inb = *in++;\r\n          *out++ = scale * (inb >> 4);\r\n          inb <<= 4;\r\n        }\r\n      } else if (depth == 2) {\r\n        for (i=0; i < nsmp; ++i) {\r\n          if ((i & 3) == 0) inb = *in++;\r\n          *out++ = scale * (inb >> 6);\r\n          inb <<= 2;\r\n        }\r\n      } else {\r\n        STBI_ASSERT(depth == 1);\r\n        for (i=0; i < nsmp; ++i) {\r\n          if ((i & 7) == 0) inb = *in++;\r\n          *out++ = scale * (inb >> 7);\r\n          inb <<= 1;\r\n        }\r\n      }\r\n      \r\n      // insert alpha=255 values if desired\r\n      if (img_n != out_n)\r\n        stbi__create_png_alpha_expand8(dest, dest, x, img_n);\r\n    } else if (depth == 8) {\r\n      if (img_n == out_n)\r\n        memcpy(dest, cur, x*img_n);\r\n      else\r\n        stbi__create_png_alpha_expand8(dest, cur, x, img_n);\r\n    } else if (depth == 16) {\r\n      // convert the image data from big-endian to platform-native\r\n      stbi__uint16 *dest16 = (stbi__uint16*)dest;\r\n      stbi__uint32 nsmp = x*img_n;\r\n      \r\n      if (img_n == out_n) {\r\n        for (i = 0; i < nsmp; ++i, ++dest16, cur += 2)\r\n          *dest16 = (cur[0] << 8) | cur[1];\r\n      } else {\r\n        STBI_ASSERT(img_n+1 == out_n);\r\n        if (img_n == 1) {\r\n          for (i = 0; i < x; ++i, dest16 += 2, cur += 2) {\r\n            dest16[0] = (cur[0] << 8) | cur[1];\r\n            dest16[1] = 0xffff;\r\n          }\r\n        } else {\r\n          STBI_ASSERT(img_n == 3);\r\n          for (i = 0; i < x; ++i, dest16 += 4, cur += 6) {\r\n            dest16[0] = (cur[0] << 8) | cur[1];\r\n            dest16[1] = (cur[2] << 8) | cur[3];\r\n            dest16[2] = (cur[4] << 8) | cur[5];\r\n            dest16[3] = 0xffff;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  STBI_FREE(filter_buf);\r\n  if (!all_ok) return 0;\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)\r\n{\r\n  int bytes = (depth == 16 ? 2 : 1);\r\n  int out_bytes = out_n * bytes;\r\n  stbi_uc *final;\r\n  int p;\r\n  if (!interlaced)\r\n    return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);\r\n  \r\n  // de-interlacing\r\n  final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);\r\n  if (!final) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  for (p=0; p < 7; ++p) {\r\n    int xorig[] = { 0,4,0,2,0,1,0 };\r\n    int yorig[] = { 0,0,4,0,2,0,1 };\r\n    int xspc[]  = { 8,8,4,4,2,2,1 };\r\n    int yspc[]  = { 8,8,8,4,4,2,2 };\r\n    int i,j,x,y;\r\n    // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1\r\n    x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];\r\n    y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];\r\n    if (x && y) {\r\n      stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;\r\n      if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {\r\n        STBI_FREE(final);\r\n        return 0;\r\n      }\r\n      for (j=0; j < y; ++j) {\r\n        for (i=0; i < x; ++i) {\r\n          int out_y = j*yspc[p]+yorig[p];\r\n          int out_x = i*xspc[p]+xorig[p];\r\n          memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,\r\n                 a->out + (j*x+i)*out_bytes, out_bytes);\r\n        }\r\n      }\r\n      STBI_FREE(a->out);\r\n      image_data += img_len;\r\n      image_data_len -= img_len;\r\n    }\r\n  }\r\n  a->out = final;\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)\r\n{\r\n  stbi__context *s = z->s;\r\n  stbi__uint32 i, pixel_count = s->img_x * s->img_y;\r\n  stbi_uc *p = z->out;\r\n  \r\n  // compute color-based transparency, assuming we've\r\n  // already got 255 as the alpha value in the output\r\n  STBI_ASSERT(out_n == 2 || out_n == 4);\r\n  \r\n  if (out_n == 2) {\r\n    for (i=0; i < pixel_count; ++i) {\r\n      p[1] = (p[0] == tc[0] ? 0 : 255);\r\n      p += 2;\r\n    }\r\n  } else {\r\n    for (i=0; i < pixel_count; ++i) {\r\n      if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\r\n        p[3] = 0;\r\n      p += 4;\r\n    }\r\n  }\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)\r\n{\r\n  stbi__context *s = z->s;\r\n  stbi__uint32 i, pixel_count = s->img_x * s->img_y;\r\n  stbi__uint16 *p = (stbi__uint16*) z->out;\r\n  \r\n  // compute color-based transparency, assuming we've\r\n  // already got 65535 as the alpha value in the output\r\n  STBI_ASSERT(out_n == 2 || out_n == 4);\r\n  \r\n  if (out_n == 2) {\r\n    for (i = 0; i < pixel_count; ++i) {\r\n      p[1] = (p[0] == tc[0] ? 0 : 65535);\r\n      p += 2;\r\n    }\r\n  } else {\r\n    for (i = 0; i < pixel_count; ++i) {\r\n      if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])\r\n        p[3] = 0;\r\n      p += 4;\r\n    }\r\n  }\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)\r\n{\r\n  stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;\r\n  stbi_uc *p, *temp_out, *orig = a->out;\r\n  \r\n  p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);\r\n  if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  \r\n  // between here and free(out) below, exitting would leak\r\n  temp_out = p;\r\n  \r\n  if (pal_img_n == 3) {\r\n    for (i=0; i < pixel_count; ++i) {\r\n      int n = orig[i]*4;\r\n      p[0] = palette[n  ];\r\n      p[1] = palette[n+1];\r\n      p[2] = palette[n+2];\r\n      p += 3;\r\n    }\r\n  } else {\r\n    for (i=0; i < pixel_count; ++i) {\r\n      int n = orig[i]*4;\r\n      p[0] = palette[n  ];\r\n      p[1] = palette[n+1];\r\n      p[2] = palette[n+2];\r\n      p[3] = palette[n+3];\r\n      p += 4;\r\n    }\r\n  }\r\n  STBI_FREE(a->out);\r\n  a->out = temp_out;\r\n  \r\n  STBI_NOTUSED(len);\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic int stbi__unpremultiply_on_load_global = 0;\r\nstatic int stbi__de_iphone_flag_global = 0;\r\n\r\nSTBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)\r\n{\r\n  stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;\r\n}\r\n\r\nSTBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)\r\n{\r\n  stbi__de_iphone_flag_global = flag_true_if_should_convert;\r\n}\r\n\r\n#ifndef STBI_THREAD_LOCAL\r\n#define stbi__unpremultiply_on_load  stbi__unpremultiply_on_load_global\r\n#define stbi__de_iphone_flag  stbi__de_iphone_flag_global\r\n#else\r\nstatic STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;\r\nstatic STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;\r\n\r\nSTBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)\r\n{\r\n  stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;\r\n  stbi__unpremultiply_on_load_set = 1;\r\n}\r\n\r\nSTBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)\r\n{\r\n  stbi__de_iphone_flag_local = flag_true_if_should_convert;\r\n  stbi__de_iphone_flag_set = 1;\r\n}\r\n\r\n#define stbi__unpremultiply_on_load  (stbi__unpremultiply_on_load_set           \\\r\n? stbi__unpremultiply_on_load_local      \\\r\n: stbi__unpremultiply_on_load_global)\r\n#define stbi__de_iphone_flag  (stbi__de_iphone_flag_set                         \\\r\n? stbi__de_iphone_flag_local                    \\\r\n: stbi__de_iphone_flag_global)\r\n#endif // STBI_THREAD_LOCAL\r\n\r\nstatic void stbi__de_iphone(stbi__png *z)\r\n{\r\n  stbi__context *s = z->s;\r\n  stbi__uint32 i, pixel_count = s->img_x * s->img_y;\r\n  stbi_uc *p = z->out;\r\n  \r\n  if (s->img_out_n == 3) {  // convert bgr to rgb\r\n    for (i=0; i < pixel_count; ++i) {\r\n      stbi_uc t = p[0];\r\n      p[0] = p[2];\r\n      p[2] = t;\r\n      p += 3;\r\n    }\r\n  } else {\r\n    STBI_ASSERT(s->img_out_n == 4);\r\n    if (stbi__unpremultiply_on_load) {\r\n      // convert bgr to rgb and unpremultiply\r\n      for (i=0; i < pixel_count; ++i) {\r\n        stbi_uc a = p[3];\r\n        stbi_uc t = p[0];\r\n        if (a) {\r\n          stbi_uc half = a / 2;\r\n          p[0] = (p[2] * 255 + half) / a;\r\n          p[1] = (p[1] * 255 + half) / a;\r\n          p[2] = ( t   * 255 + half) / a;\r\n        } else {\r\n          p[0] = p[2];\r\n          p[2] = t;\r\n        }\r\n        p += 4;\r\n      }\r\n    } else {\r\n      // convert bgr to rgb\r\n      for (i=0; i < pixel_count; ++i) {\r\n        stbi_uc t = p[0];\r\n        p[0] = p[2];\r\n        p[2] = t;\r\n        p += 4;\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n#define STBI__PNG_TYPE(a,b,c,d)  (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))\r\n\r\nstatic int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)\r\n{\r\n  stbi_uc palette[1024], pal_img_n=0;\r\n  stbi_uc has_trans=0, tc[3]={0};\r\n  stbi__uint16 tc16[3];\r\n  stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;\r\n  int first=1,k,interlace=0, color=0, is_iphone=0;\r\n  stbi__context *s = z->s;\r\n  \r\n  z->expanded = NULL;\r\n  z->idata = NULL;\r\n  z->out = NULL;\r\n  \r\n  if (!stbi__check_png_header(s)) return 0;\r\n  \r\n  if (scan == STBI__SCAN_type) return 1;\r\n  \r\n  for (;;) {\r\n    stbi__pngchunk c = stbi__get_chunk_header(s);\r\n    switch (c.type) {\r\n      case STBI__PNG_TYPE('C','g','B','I'):\r\n      is_iphone = 1;\r\n      stbi__skip(s, c.length);\r\n      break;\r\n      case STBI__PNG_TYPE('I','H','D','R'): {\r\n        int comp,filter;\r\n        if (!first) return stbi__err(\"multiple IHDR\",\"Corrupt PNG\");\r\n        first = 0;\r\n        if (c.length != 13) return stbi__err(\"bad IHDR len\",\"Corrupt PNG\");\r\n        s->img_x = stbi__get32be(s);\r\n        s->img_y = stbi__get32be(s);\r\n        if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\r\n        if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\r\n        z->depth = stbi__get8(s);  if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)  return stbi__err(\"1/2/4/8/16-bit only\",\"PNG not supported: 1/2/4/8/16-bit only\");\r\n        color = stbi__get8(s);  if (color > 6)         return stbi__err(\"bad ctype\",\"Corrupt PNG\");\r\n        if (color == 3 && z->depth == 16)                  return stbi__err(\"bad ctype\",\"Corrupt PNG\");\r\n        if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err(\"bad ctype\",\"Corrupt PNG\");\r\n        comp  = stbi__get8(s);  if (comp) return stbi__err(\"bad comp method\",\"Corrupt PNG\");\r\n        filter= stbi__get8(s);  if (filter) return stbi__err(\"bad filter method\",\"Corrupt PNG\");\r\n        interlace = stbi__get8(s); if (interlace>1) return stbi__err(\"bad interlace method\",\"Corrupt PNG\");\r\n        if (!s->img_x || !s->img_y) return stbi__err(\"0-pixel image\",\"Corrupt PNG\");\r\n        if (!pal_img_n) {\r\n          s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);\r\n          if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err(\"too large\", \"Image too large to decode\");\r\n        } else {\r\n          // if paletted, then pal_n is our final components, and\r\n          // img_n is # components to decompress/filter.\r\n          s->img_n = 1;\r\n          if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err(\"too large\",\"Corrupt PNG\");\r\n        }\r\n        // even with SCAN_header, have to scan to see if we have a tRNS\r\n        break;\r\n      }\r\n      \r\n      case STBI__PNG_TYPE('P','L','T','E'):  {\r\n        if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\r\n        if (c.length > 256*3) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\r\n        pal_len = c.length / 3;\r\n        if (pal_len * 3 != c.length) return stbi__err(\"invalid PLTE\",\"Corrupt PNG\");\r\n        for (i=0; i < pal_len; ++i) {\r\n          palette[i*4+0] = stbi__get8(s);\r\n          palette[i*4+1] = stbi__get8(s);\r\n          palette[i*4+2] = stbi__get8(s);\r\n          palette[i*4+3] = 255;\r\n        }\r\n        break;\r\n      }\r\n      \r\n      case STBI__PNG_TYPE('t','R','N','S'): {\r\n        if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\r\n        if (z->idata) return stbi__err(\"tRNS after IDAT\",\"Corrupt PNG\");\r\n        if (pal_img_n) {\r\n          if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }\r\n          if (pal_len == 0) return stbi__err(\"tRNS before PLTE\",\"Corrupt PNG\");\r\n          if (c.length > pal_len) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\r\n          pal_img_n = 4;\r\n          for (i=0; i < c.length; ++i)\r\n            palette[i*4+3] = stbi__get8(s);\r\n        } else {\r\n          if (!(s->img_n & 1)) return stbi__err(\"tRNS with alpha\",\"Corrupt PNG\");\r\n          if (c.length != (stbi__uint32) s->img_n*2) return stbi__err(\"bad tRNS len\",\"Corrupt PNG\");\r\n          has_trans = 1;\r\n          // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now.\r\n          if (scan == STBI__SCAN_header) { ++s->img_n; return 1; }\r\n          if (z->depth == 16) {\r\n            for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is\r\n          } else {\r\n            for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger\r\n          }\r\n        }\r\n        break;\r\n      }\r\n      \r\n      case STBI__PNG_TYPE('I','D','A','T'): {\r\n        if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\r\n        if (pal_img_n && !pal_len) return stbi__err(\"no PLTE\",\"Corrupt PNG\");\r\n        if (scan == STBI__SCAN_header) {\r\n          // header scan definitely stops at first IDAT\r\n          if (pal_img_n)\r\n            s->img_n = pal_img_n;\r\n          return 1;\r\n        }\r\n        if (c.length > (1u << 30)) return stbi__err(\"IDAT size limit\", \"IDAT section larger than 2^30 bytes\");\r\n        if ((int)(ioff + c.length) < (int)ioff) return 0;\r\n        if (ioff + c.length > idata_limit) {\r\n          stbi__uint32 idata_limit_old = idata_limit;\r\n          stbi_uc *p;\r\n          if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;\r\n          while (ioff + c.length > idata_limit)\r\n            idata_limit *= 2;\r\n          STBI_NOTUSED(idata_limit_old);\r\n          p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err(\"outofmem\", \"Out of memory\");\r\n          z->idata = p;\r\n        }\r\n        if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err(\"outofdata\",\"Corrupt PNG\");\r\n        ioff += c.length;\r\n        break;\r\n      }\r\n      \r\n      case STBI__PNG_TYPE('I','E','N','D'): {\r\n        stbi__uint32 raw_len, bpl;\r\n        if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\r\n        if (scan != STBI__SCAN_load) return 1;\r\n        if (z->idata == NULL) return stbi__err(\"no IDAT\",\"Corrupt PNG\");\r\n        // initial guess for decoded data size to avoid unnecessary reallocs\r\n        bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component\r\n        raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;\r\n        z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);\r\n        if (z->expanded == NULL) return 0; // zlib should set error\r\n        STBI_FREE(z->idata); z->idata = NULL;\r\n        if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)\r\n          s->img_out_n = s->img_n+1;\r\n        else\r\n          s->img_out_n = s->img_n;\r\n        if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;\r\n        if (has_trans) {\r\n          if (z->depth == 16) {\r\n            if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;\r\n          } else {\r\n            if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;\r\n          }\r\n        }\r\n        if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)\r\n          stbi__de_iphone(z);\r\n        if (pal_img_n) {\r\n          // pal_img_n == 3 or 4\r\n          s->img_n = pal_img_n; // record the actual colors we had\r\n          s->img_out_n = pal_img_n;\r\n          if (req_comp >= 3) s->img_out_n = req_comp;\r\n          if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))\r\n            return 0;\r\n        } else if (has_trans) {\r\n          // non-paletted image with tRNS -> source image has (constant) alpha\r\n          ++s->img_n;\r\n        }\r\n        STBI_FREE(z->expanded); z->expanded = NULL;\r\n        // end of PNG chunk, read and skip CRC\r\n        stbi__get32be(s);\r\n        return 1;\r\n      }\r\n      \r\n      default:\r\n      // if critical, fail\r\n      if (first) return stbi__err(\"first not IHDR\", \"Corrupt PNG\");\r\n      if ((c.type & (1 << 29)) == 0) {\r\n#ifndef STBI_NO_FAILURE_STRINGS\r\n        // not threadsafe\r\n        static char invalid_chunk[] = \"XXXX PNG chunk not known\";\r\n        invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);\r\n        invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);\r\n        invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);\r\n        invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);\r\n#endif\r\n        return stbi__err(invalid_chunk, \"PNG not supported: unknown PNG chunk type\");\r\n      }\r\n      stbi__skip(s, c.length);\r\n      break;\r\n    }\r\n    // end of PNG chunk, read and skip CRC\r\n    stbi__get32be(s);\r\n  }\r\n}\r\n\r\nstatic void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)\r\n{\r\n  void *result=NULL;\r\n  if (req_comp < 0 || req_comp > 4) return stbi__errpuc(\"bad req_comp\", \"Internal error\");\r\n  if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {\r\n    if (p->depth <= 8)\r\n      ri->bits_per_channel = 8;\r\n    else if (p->depth == 16)\r\n      ri->bits_per_channel = 16;\r\n    else\r\n      return stbi__errpuc(\"bad bits_per_channel\", \"PNG not supported: unsupported color depth\");\r\n    result = p->out;\r\n    p->out = NULL;\r\n    if (req_comp && req_comp != p->s->img_out_n) {\r\n      if (ri->bits_per_channel == 8)\r\n        result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\r\n      else\r\n        result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);\r\n      p->s->img_out_n = req_comp;\r\n      if (result == NULL) return result;\r\n    }\r\n    *x = p->s->img_x;\r\n    *y = p->s->img_y;\r\n    if (n) *n = p->s->img_n;\r\n  }\r\n  STBI_FREE(p->out);      p->out      = NULL;\r\n  STBI_FREE(p->expanded); p->expanded = NULL;\r\n  STBI_FREE(p->idata);    p->idata    = NULL;\r\n  \r\n  return result;\r\n}\r\n\r\nstatic void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  stbi__png p;\r\n  p.s = s;\r\n  return stbi__do_png(&p, x,y,comp,req_comp, ri);\r\n}\r\n\r\nstatic int stbi__png_test(stbi__context *s)\r\n{\r\n  int r;\r\n  r = stbi__check_png_header(s);\r\n  stbi__rewind(s);\r\n  return r;\r\n}\r\n\r\nstatic int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)\r\n{\r\n  if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {\r\n    stbi__rewind( p->s );\r\n    return 0;\r\n  }\r\n  if (x) *x = p->s->img_x;\r\n  if (y) *y = p->s->img_y;\r\n  if (comp) *comp = p->s->img_n;\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  stbi__png p;\r\n  p.s = s;\r\n  return stbi__png_info_raw(&p, x, y, comp);\r\n}\r\n\r\nstatic int stbi__png_is16(stbi__context *s)\r\n{\r\n  stbi__png p;\r\n  p.s = s;\r\n  if (!stbi__png_info_raw(&p, NULL, NULL, NULL))\r\n    return 0;\r\n  if (p.depth != 16) {\r\n    stbi__rewind(p.s);\r\n    return 0;\r\n  }\r\n  return 1;\r\n}\r\n#endif\r\n\r\n// Microsoft/Windows BMP image\r\n\r\n#ifndef STBI_NO_BMP\r\nstatic int stbi__bmp_test_raw(stbi__context *s)\r\n{\r\n  int r;\r\n  int sz;\r\n  if (stbi__get8(s) != 'B') return 0;\r\n  if (stbi__get8(s) != 'M') return 0;\r\n  stbi__get32le(s); // discard filesize\r\n  stbi__get16le(s); // discard reserved\r\n  stbi__get16le(s); // discard reserved\r\n  stbi__get32le(s); // discard data offset\r\n  sz = stbi__get32le(s);\r\n  r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);\r\n  return r;\r\n}\r\n\r\nstatic int stbi__bmp_test(stbi__context *s)\r\n{\r\n  int r = stbi__bmp_test_raw(s);\r\n  stbi__rewind(s);\r\n  return r;\r\n}\r\n\r\n\r\n// returns 0..31 for the highest set bit\r\nstatic int stbi__high_bit(unsigned int z)\r\n{\r\n  int n=0;\r\n  if (z == 0) return -1;\r\n  if (z >= 0x10000) { n += 16; z >>= 16; }\r\n  if (z >= 0x00100) { n +=  8; z >>=  8; }\r\n  if (z >= 0x00010) { n +=  4; z >>=  4; }\r\n  if (z >= 0x00004) { n +=  2; z >>=  2; }\r\n  if (z >= 0x00002) { n +=  1;/* >>=  1;*/ }\r\n  return n;\r\n}\r\n\r\nstatic int stbi__bitcount(unsigned int a)\r\n{\r\n  a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2\r\n  a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4\r\n  a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits\r\n  a = (a + (a >> 8)); // max 16 per 8 bits\r\n  a = (a + (a >> 16)); // max 32 per 8 bits\r\n  return a & 0xff;\r\n}\r\n\r\n// extract an arbitrarily-aligned N-bit value (N=bits)\r\n// from v, and then make it 8-bits long and fractionally\r\n// extend it to full full range.\r\nstatic int stbi__shiftsigned(unsigned int v, int shift, int bits)\r\n{\r\n  static unsigned int mul_table[9] = {\r\n    0,\r\n    0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,\r\n    0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,\r\n  };\r\n  static unsigned int shift_table[9] = {\r\n    0, 0,0,1,0,2,4,6,0,\r\n  };\r\n  if (shift < 0)\r\n    v <<= -shift;\r\n  else\r\n    v >>= shift;\r\n  STBI_ASSERT(v < 256);\r\n  v >>= (8-bits);\r\n  STBI_ASSERT(bits >= 0 && bits <= 8);\r\n  return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];\r\n}\r\n\r\ntypedef struct\r\n{\r\n  int bpp, offset, hsz;\r\n  unsigned int mr,mg,mb,ma, all_a;\r\n  int extra_read;\r\n} stbi__bmp_data;\r\n\r\nstatic int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)\r\n{\r\n  // BI_BITFIELDS specifies masks explicitly, don't override\r\n  if (compress == 3)\r\n    return 1;\r\n  \r\n  if (compress == 0) {\r\n    if (info->bpp == 16) {\r\n      info->mr = 31u << 10;\r\n      info->mg = 31u <<  5;\r\n      info->mb = 31u <<  0;\r\n    } else if (info->bpp == 32) {\r\n      info->mr = 0xffu << 16;\r\n      info->mg = 0xffu <<  8;\r\n      info->mb = 0xffu <<  0;\r\n      info->ma = 0xffu << 24;\r\n      info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0\r\n    } else {\r\n      // otherwise, use defaults, which is all-0\r\n      info->mr = info->mg = info->mb = info->ma = 0;\r\n    }\r\n    return 1;\r\n  }\r\n  return 0; // error\r\n}\r\n\r\nstatic void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)\r\n{\r\n  int hsz;\r\n  if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc(\"not BMP\", \"Corrupt BMP\");\r\n  stbi__get32le(s); // discard filesize\r\n  stbi__get16le(s); // discard reserved\r\n  stbi__get16le(s); // discard reserved\r\n  info->offset = stbi__get32le(s);\r\n  info->hsz = hsz = stbi__get32le(s);\r\n  info->mr = info->mg = info->mb = info->ma = 0;\r\n  info->extra_read = 14;\r\n  \r\n  if (info->offset < 0) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\r\n  \r\n  if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc(\"unknown BMP\", \"BMP type not supported: unknown\");\r\n  if (hsz == 12) {\r\n    s->img_x = stbi__get16le(s);\r\n    s->img_y = stbi__get16le(s);\r\n  } else {\r\n    s->img_x = stbi__get32le(s);\r\n    s->img_y = stbi__get32le(s);\r\n  }\r\n  if (stbi__get16le(s) != 1) return stbi__errpuc(\"bad BMP\", \"bad BMP\");\r\n  info->bpp = stbi__get16le(s);\r\n  if (hsz != 12) {\r\n    int compress = stbi__get32le(s);\r\n    if (compress == 1 || compress == 2) return stbi__errpuc(\"BMP RLE\", \"BMP type not supported: RLE\");\r\n    if (compress >= 4) return stbi__errpuc(\"BMP JPEG/PNG\", \"BMP type not supported: unsupported compression\"); // this includes PNG/JPEG modes\r\n    if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc(\"bad BMP\", \"bad BMP\"); // bitfields requires 16 or 32 bits/pixel\r\n    stbi__get32le(s); // discard sizeof\r\n    stbi__get32le(s); // discard hres\r\n    stbi__get32le(s); // discard vres\r\n    stbi__get32le(s); // discard colorsused\r\n    stbi__get32le(s); // discard max important\r\n    if (hsz == 40 || hsz == 56) {\r\n      if (hsz == 56) {\r\n        stbi__get32le(s);\r\n        stbi__get32le(s);\r\n        stbi__get32le(s);\r\n        stbi__get32le(s);\r\n      }\r\n      if (info->bpp == 16 || info->bpp == 32) {\r\n        if (compress == 0) {\r\n          stbi__bmp_set_mask_defaults(info, compress);\r\n        } else if (compress == 3) {\r\n          info->mr = stbi__get32le(s);\r\n          info->mg = stbi__get32le(s);\r\n          info->mb = stbi__get32le(s);\r\n          info->extra_read += 12;\r\n          // not documented, but generated by photoshop and handled by mspaint\r\n          if (info->mr == info->mg && info->mg == info->mb) {\r\n            // ?!?!?\r\n            return stbi__errpuc(\"bad BMP\", \"bad BMP\");\r\n          }\r\n        } else\r\n          return stbi__errpuc(\"bad BMP\", \"bad BMP\");\r\n      }\r\n    } else {\r\n      // V4/V5 header\r\n      int i;\r\n      if (hsz != 108 && hsz != 124)\r\n        return stbi__errpuc(\"bad BMP\", \"bad BMP\");\r\n      info->mr = stbi__get32le(s);\r\n      info->mg = stbi__get32le(s);\r\n      info->mb = stbi__get32le(s);\r\n      info->ma = stbi__get32le(s);\r\n      if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs\r\n        stbi__bmp_set_mask_defaults(info, compress);\r\n      stbi__get32le(s); // discard color space\r\n      for (i=0; i < 12; ++i)\r\n        stbi__get32le(s); // discard color space parameters\r\n      if (hsz == 124) {\r\n        stbi__get32le(s); // discard rendering intent\r\n        stbi__get32le(s); // discard offset of profile data\r\n        stbi__get32le(s); // discard size of profile data\r\n        stbi__get32le(s); // discard reserved\r\n      }\r\n    }\r\n  }\r\n  return (void *) 1;\r\n}\r\n\r\n\r\nstatic void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  stbi_uc *out;\r\n  unsigned int mr=0,mg=0,mb=0,ma=0, all_a;\r\n  stbi_uc pal[256][4];\r\n  int psize=0,i,j,width;\r\n  int flip_vertically, pad, target;\r\n  stbi__bmp_data info;\r\n  STBI_NOTUSED(ri);\r\n  \r\n  info.all_a = 255;\r\n  if (stbi__bmp_parse_header(s, &info) == NULL)\r\n    return NULL; // error code already set\r\n  \r\n  flip_vertically = ((int) s->img_y) > 0;\r\n  s->img_y = abs((int) s->img_y);\r\n  \r\n  if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  mr = info.mr;\r\n  mg = info.mg;\r\n  mb = info.mb;\r\n  ma = info.ma;\r\n  all_a = info.all_a;\r\n  \r\n  if (info.hsz == 12) {\r\n    if (info.bpp < 24)\r\n      psize = (info.offset - info.extra_read - 24) / 3;\r\n  } else {\r\n    if (info.bpp < 16)\r\n      psize = (info.offset - info.extra_read - info.hsz) >> 2;\r\n  }\r\n  if (psize == 0) {\r\n    // accept some number of extra bytes after the header, but if the offset points either to before\r\n    // the header ends or implies a large amount of extra data, reject the file as malformed\r\n    int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);\r\n    int header_limit = 1024; // max we actually read is below 256 bytes currently.\r\n    int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.\r\n    if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {\r\n      return stbi__errpuc(\"bad header\", \"Corrupt BMP\");\r\n    }\r\n    // we established that bytes_read_so_far is positive and sensible.\r\n    // the first half of this test rejects offsets that are either too small positives, or\r\n    // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn\r\n    // ensures the number computed in the second half of the test can't overflow.\r\n    if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {\r\n      return stbi__errpuc(\"bad offset\", \"Corrupt BMP\");\r\n    } else {\r\n      stbi__skip(s, info.offset - bytes_read_so_far);\r\n    }\r\n  }\r\n  \r\n  if (info.bpp == 24 && ma == 0xff000000)\r\n    s->img_n = 3;\r\n  else\r\n    s->img_n = ma ? 4 : 3;\r\n  if (req_comp && req_comp >= 3) // we can directly decode 3 or 4\r\n    target = req_comp;\r\n  else\r\n    target = s->img_n; // if they want monochrome, we'll post-convert\r\n  \r\n  // sanity-check size\r\n  if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))\r\n    return stbi__errpuc(\"too large\", \"Corrupt BMP\");\r\n  \r\n  out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);\r\n  if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  if (info.bpp < 16) {\r\n    int z=0;\r\n    if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc(\"invalid\", \"Corrupt BMP\"); }\r\n    for (i=0; i < psize; ++i) {\r\n      pal[i][2] = stbi__get8(s);\r\n      pal[i][1] = stbi__get8(s);\r\n      pal[i][0] = stbi__get8(s);\r\n      if (info.hsz != 12) stbi__get8(s);\r\n      pal[i][3] = 255;\r\n    }\r\n    stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));\r\n    if (info.bpp == 1) width = (s->img_x + 7) >> 3;\r\n    else if (info.bpp == 4) width = (s->img_x + 1) >> 1;\r\n    else if (info.bpp == 8) width = s->img_x;\r\n    else { STBI_FREE(out); return stbi__errpuc(\"bad bpp\", \"Corrupt BMP\"); }\r\n    pad = (-width)&3;\r\n    if (info.bpp == 1) {\r\n      for (j=0; j < (int) s->img_y; ++j) {\r\n        int bit_offset = 7, v = stbi__get8(s);\r\n        for (i=0; i < (int) s->img_x; ++i) {\r\n          int color = (v>>bit_offset)&0x1;\r\n          out[z++] = pal[color][0];\r\n          out[z++] = pal[color][1];\r\n          out[z++] = pal[color][2];\r\n          if (target == 4) out[z++] = 255;\r\n          if (i+1 == (int) s->img_x) break;\r\n          if((--bit_offset) < 0) {\r\n            bit_offset = 7;\r\n            v = stbi__get8(s);\r\n          }\r\n        }\r\n        stbi__skip(s, pad);\r\n      }\r\n    } else {\r\n      for (j=0; j < (int) s->img_y; ++j) {\r\n        for (i=0; i < (int) s->img_x; i += 2) {\r\n          int v=stbi__get8(s),v2=0;\r\n          if (info.bpp == 4) {\r\n            v2 = v & 15;\r\n            v >>= 4;\r\n          }\r\n          out[z++] = pal[v][0];\r\n          out[z++] = pal[v][1];\r\n          out[z++] = pal[v][2];\r\n          if (target == 4) out[z++] = 255;\r\n          if (i+1 == (int) s->img_x) break;\r\n          v = (info.bpp == 8) ? stbi__get8(s) : v2;\r\n          out[z++] = pal[v][0];\r\n          out[z++] = pal[v][1];\r\n          out[z++] = pal[v][2];\r\n          if (target == 4) out[z++] = 255;\r\n        }\r\n        stbi__skip(s, pad);\r\n      }\r\n    }\r\n  } else {\r\n    int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;\r\n    int z = 0;\r\n    int easy=0;\r\n    stbi__skip(s, info.offset - info.extra_read - info.hsz);\r\n    if (info.bpp == 24) width = 3 * s->img_x;\r\n    else if (info.bpp == 16) width = 2*s->img_x;\r\n    else /* bpp = 32 and pad = 0 */ width=0;\r\n    pad = (-width) & 3;\r\n    if (info.bpp == 24) {\r\n      easy = 1;\r\n    } else if (info.bpp == 32) {\r\n      if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)\r\n        easy = 2;\r\n    }\r\n    if (!easy) {\r\n      if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\r\n      // right shift amt to put high bit in position #7\r\n      rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);\r\n      gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);\r\n      bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);\r\n      ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);\r\n      if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc(\"bad masks\", \"Corrupt BMP\"); }\r\n    }\r\n    for (j=0; j < (int) s->img_y; ++j) {\r\n      if (easy) {\r\n        for (i=0; i < (int) s->img_x; ++i) {\r\n          unsigned char a;\r\n          out[z+2] = stbi__get8(s);\r\n          out[z+1] = stbi__get8(s);\r\n          out[z+0] = stbi__get8(s);\r\n          z += 3;\r\n          a = (easy == 2 ? stbi__get8(s) : 255);\r\n          all_a |= a;\r\n          if (target == 4) out[z++] = a;\r\n        }\r\n      } else {\r\n        int bpp = info.bpp;\r\n        for (i=0; i < (int) s->img_x; ++i) {\r\n          stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));\r\n          unsigned int a;\r\n          out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));\r\n          out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));\r\n          out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));\r\n          a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);\r\n          all_a |= a;\r\n          if (target == 4) out[z++] = STBI__BYTECAST(a);\r\n        }\r\n      }\r\n      stbi__skip(s, pad);\r\n    }\r\n  }\r\n  \r\n  // if alpha channel is all 0s, replace with all 255s\r\n  if (target == 4 && all_a == 0)\r\n    for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)\r\n    out[i] = 255;\r\n  \r\n  if (flip_vertically) {\r\n    stbi_uc t;\r\n    for (j=0; j < (int) s->img_y>>1; ++j) {\r\n      stbi_uc *p1 = out +      j     *s->img_x*target;\r\n      stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;\r\n      for (i=0; i < (int) s->img_x*target; ++i) {\r\n        t = p1[i]; p1[i] = p2[i]; p2[i] = t;\r\n      }\r\n    }\r\n  }\r\n  \r\n  if (req_comp && req_comp != target) {\r\n    out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);\r\n    if (out == NULL) return out; // stbi__convert_format frees input on failure\r\n  }\r\n  \r\n  *x = s->img_x;\r\n  *y = s->img_y;\r\n  if (comp) *comp = s->img_n;\r\n  return out;\r\n}\r\n#endif\r\n\r\n// Targa Truevision - TGA\r\n// by Jonathan Dummer\r\n#ifndef STBI_NO_TGA\r\n// returns STBI_rgb or whatever, 0 on error\r\nstatic int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)\r\n{\r\n  // only RGB or RGBA (incl. 16bit) or grey allowed\r\n  if (is_rgb16) *is_rgb16 = 0;\r\n  switch(bits_per_pixel) {\r\n    case 8:  return STBI_grey;\r\n    case 16: if(is_grey) return STBI_grey_alpha;\r\n    // fallthrough\r\n    case 15: if(is_rgb16) *is_rgb16 = 1;\r\n    return STBI_rgb;\r\n    case 24: // fallthrough\r\n    case 32: return bits_per_pixel/8;\r\n    default: return 0;\r\n  }\r\n}\r\n\r\nstatic int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;\r\n  int sz, tga_colormap_type;\r\n  stbi__get8(s);                   // discard Offset\r\n  tga_colormap_type = stbi__get8(s); // colormap type\r\n  if( tga_colormap_type > 1 ) {\r\n    stbi__rewind(s);\r\n    return 0;      // only RGB or indexed allowed\r\n  }\r\n  tga_image_type = stbi__get8(s); // image type\r\n  if ( tga_colormap_type == 1 ) { // colormapped (paletted) image\r\n    if (tga_image_type != 1 && tga_image_type != 9) {\r\n      stbi__rewind(s);\r\n      return 0;\r\n    }\r\n    stbi__skip(s,4);       // skip index of first colormap entry and number of entries\r\n    sz = stbi__get8(s);    //   check bits per palette color entry\r\n    if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {\r\n      stbi__rewind(s);\r\n      return 0;\r\n    }\r\n    stbi__skip(s,4);       // skip image x and y origin\r\n    tga_colormap_bpp = sz;\r\n  } else { // \"normal\" image w/o colormap - only RGB or grey allowed, +/- RLE\r\n    if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {\r\n      stbi__rewind(s);\r\n      return 0; // only RGB or grey allowed, +/- RLE\r\n    }\r\n    stbi__skip(s,9); // skip colormap specification and image x/y origin\r\n    tga_colormap_bpp = 0;\r\n  }\r\n  tga_w = stbi__get16le(s);\r\n  if( tga_w < 1 ) {\r\n    stbi__rewind(s);\r\n    return 0;   // test width\r\n  }\r\n  tga_h = stbi__get16le(s);\r\n  if( tga_h < 1 ) {\r\n    stbi__rewind(s);\r\n    return 0;   // test height\r\n  }\r\n  tga_bits_per_pixel = stbi__get8(s); // bits per pixel\r\n  stbi__get8(s); // ignore alpha bits\r\n  if (tga_colormap_bpp != 0) {\r\n    if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {\r\n      // when using a colormap, tga_bits_per_pixel is the size of the indexes\r\n      // I don't think anything but 8 or 16bit indexes makes sense\r\n      stbi__rewind(s);\r\n      return 0;\r\n    }\r\n    tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);\r\n  } else {\r\n    tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);\r\n  }\r\n  if(!tga_comp) {\r\n    stbi__rewind(s);\r\n    return 0;\r\n  }\r\n  if (x) *x = tga_w;\r\n  if (y) *y = tga_h;\r\n  if (comp) *comp = tga_comp;\r\n  return 1;                   // seems to have passed everything\r\n}\r\n\r\nstatic int stbi__tga_test(stbi__context *s)\r\n{\r\n  int res = 0;\r\n  int sz, tga_color_type;\r\n  stbi__get8(s);      //   discard Offset\r\n  tga_color_type = stbi__get8(s);   //   color type\r\n  if ( tga_color_type > 1 ) goto errorEnd;   //   only RGB or indexed allowed\r\n  sz = stbi__get8(s);   //   image type\r\n  if ( tga_color_type == 1 ) { // colormapped (paletted) image\r\n    if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9\r\n    stbi__skip(s,4);       // skip index of first colormap entry and number of entries\r\n    sz = stbi__get8(s);    //   check bits per palette color entry\r\n    if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;\r\n    stbi__skip(s,4);       // skip image x and y origin\r\n  } else { // \"normal\" image w/o colormap\r\n    if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE\r\n    stbi__skip(s,9); // skip colormap specification and image x/y origin\r\n  }\r\n  if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test width\r\n  if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test height\r\n  sz = stbi__get8(s);   //   bits per pixel\r\n  if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index\r\n  if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;\r\n  \r\n  res = 1; // if we got this far, everything's good and we can return 1 instead of 0\r\n  \r\n  errorEnd:\r\n  stbi__rewind(s);\r\n  return res;\r\n}\r\n\r\n// read 16bit value and convert to 24bit RGB\r\nstatic void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)\r\n{\r\n  stbi__uint16 px = (stbi__uint16)stbi__get16le(s);\r\n  stbi__uint16 fiveBitMask = 31;\r\n  // we have 3 channels with 5bits each\r\n  int r = (px >> 10) & fiveBitMask;\r\n  int g = (px >> 5) & fiveBitMask;\r\n  int b = px & fiveBitMask;\r\n  // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later\r\n  out[0] = (stbi_uc)((r * 255)/31);\r\n  out[1] = (stbi_uc)((g * 255)/31);\r\n  out[2] = (stbi_uc)((b * 255)/31);\r\n  \r\n  // some people claim that the most significant bit might be used for alpha\r\n  // (possibly if an alpha-bit is set in the \"image descriptor byte\")\r\n  // but that only made 16bit test images completely translucent..\r\n  // so let's treat all 15 and 16bit TGAs as RGB with no alpha.\r\n}\r\n\r\nstatic void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  //   read in the TGA header stuff\r\n  int tga_offset = stbi__get8(s);\r\n  int tga_indexed = stbi__get8(s);\r\n  int tga_image_type = stbi__get8(s);\r\n  int tga_is_RLE = 0;\r\n  int tga_palette_start = stbi__get16le(s);\r\n  int tga_palette_len = stbi__get16le(s);\r\n  int tga_palette_bits = stbi__get8(s);\r\n  int tga_x_origin = stbi__get16le(s);\r\n  int tga_y_origin = stbi__get16le(s);\r\n  int tga_width = stbi__get16le(s);\r\n  int tga_height = stbi__get16le(s);\r\n  int tga_bits_per_pixel = stbi__get8(s);\r\n  int tga_comp, tga_rgb16=0;\r\n  int tga_inverted = stbi__get8(s);\r\n  // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)\r\n  //   image data\r\n  unsigned char *tga_data;\r\n  unsigned char *tga_palette = NULL;\r\n  int i, j;\r\n  unsigned char raw_data[4] = {0};\r\n  int RLE_count = 0;\r\n  int RLE_repeating = 0;\r\n  int read_next_pixel = 1;\r\n  STBI_NOTUSED(ri);\r\n  STBI_NOTUSED(tga_x_origin); // @TODO\r\n  STBI_NOTUSED(tga_y_origin); // @TODO\r\n  \r\n  if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  //   do a tiny bit of precessing\r\n  if ( tga_image_type >= 8 )\r\n  {\r\n    tga_image_type -= 8;\r\n    tga_is_RLE = 1;\r\n  }\r\n  tga_inverted = 1 - ((tga_inverted >> 5) & 1);\r\n  \r\n  //   If I'm paletted, then I'll use the number of bits from the palette\r\n  if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);\r\n  else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);\r\n  \r\n  if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency\r\n    return stbi__errpuc(\"bad format\", \"Can't find out TGA pixelformat\");\r\n  \r\n  //   tga info\r\n  *x = tga_width;\r\n  *y = tga_height;\r\n  if (comp) *comp = tga_comp;\r\n  \r\n  if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))\r\n    return stbi__errpuc(\"too large\", \"Corrupt TGA\");\r\n  \r\n  tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);\r\n  if (!tga_data) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  \r\n  // skip to the data's starting position (offset usually = 0)\r\n  stbi__skip(s, tga_offset );\r\n  \r\n  if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {\r\n    for (i=0; i < tga_height; ++i) {\r\n      int row = tga_inverted ? tga_height -i - 1 : i;\r\n      stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;\r\n      stbi__getn(s, tga_row, tga_width * tga_comp);\r\n    }\r\n  } else  {\r\n    //   do I need to load a palette?\r\n    if ( tga_indexed)\r\n    {\r\n      if (tga_palette_len == 0) {  /* you have to have at least one entry! */\r\n        STBI_FREE(tga_data);\r\n        return stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\r\n      }\r\n      \r\n      //   any data to skip? (offset usually = 0)\r\n      stbi__skip(s, tga_palette_start );\r\n      //   load the palette\r\n      tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);\r\n      if (!tga_palette) {\r\n        STBI_FREE(tga_data);\r\n        return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n      }\r\n      if (tga_rgb16) {\r\n        stbi_uc *pal_entry = tga_palette;\r\n        STBI_ASSERT(tga_comp == STBI_rgb);\r\n        for (i=0; i < tga_palette_len; ++i) {\r\n          stbi__tga_read_rgb16(s, pal_entry);\r\n          pal_entry += tga_comp;\r\n        }\r\n      } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {\r\n        STBI_FREE(tga_data);\r\n        STBI_FREE(tga_palette);\r\n        return stbi__errpuc(\"bad palette\", \"Corrupt TGA\");\r\n      }\r\n    }\r\n    //   load the data\r\n    for (i=0; i < tga_width * tga_height; ++i)\r\n    {\r\n      //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?\r\n      if ( tga_is_RLE )\r\n      {\r\n        if ( RLE_count == 0 )\r\n        {\r\n          //   yep, get the next byte as a RLE command\r\n          int RLE_cmd = stbi__get8(s);\r\n          RLE_count = 1 + (RLE_cmd & 127);\r\n          RLE_repeating = RLE_cmd >> 7;\r\n          read_next_pixel = 1;\r\n        } else if ( !RLE_repeating )\r\n        {\r\n          read_next_pixel = 1;\r\n        }\r\n      } else\r\n      {\r\n        read_next_pixel = 1;\r\n      }\r\n      //   OK, if I need to read a pixel, do it now\r\n      if ( read_next_pixel )\r\n      {\r\n        //   load however much data we did have\r\n        if ( tga_indexed )\r\n        {\r\n          // read in index, then perform the lookup\r\n          int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);\r\n          if ( pal_idx >= tga_palette_len ) {\r\n            // invalid index\r\n            pal_idx = 0;\r\n          }\r\n          pal_idx *= tga_comp;\r\n          for (j = 0; j < tga_comp; ++j) {\r\n            raw_data[j] = tga_palette[pal_idx+j];\r\n          }\r\n        } else if(tga_rgb16) {\r\n          STBI_ASSERT(tga_comp == STBI_rgb);\r\n          stbi__tga_read_rgb16(s, raw_data);\r\n        } else {\r\n          //   read in the data raw\r\n          for (j = 0; j < tga_comp; ++j) {\r\n            raw_data[j] = stbi__get8(s);\r\n          }\r\n        }\r\n        //   clear the reading flag for the next pixel\r\n        read_next_pixel = 0;\r\n      } // end of reading a pixel\r\n      \r\n      // copy data\r\n      for (j = 0; j < tga_comp; ++j)\r\n        tga_data[i*tga_comp+j] = raw_data[j];\r\n      \r\n      //   in case we're in RLE mode, keep counting down\r\n      --RLE_count;\r\n    }\r\n    //   do I need to invert the image?\r\n    if ( tga_inverted )\r\n    {\r\n      for (j = 0; j*2 < tga_height; ++j)\r\n      {\r\n        int index1 = j * tga_width * tga_comp;\r\n        int index2 = (tga_height - 1 - j) * tga_width * tga_comp;\r\n        for (i = tga_width * tga_comp; i > 0; --i)\r\n        {\r\n          unsigned char temp = tga_data[index1];\r\n          tga_data[index1] = tga_data[index2];\r\n          tga_data[index2] = temp;\r\n          ++index1;\r\n          ++index2;\r\n        }\r\n      }\r\n    }\r\n    //   clear my palette, if I had one\r\n    if ( tga_palette != NULL )\r\n    {\r\n      STBI_FREE( tga_palette );\r\n    }\r\n  }\r\n  \r\n  // swap RGB - if the source data was RGB16, it already is in the right order\r\n  if (tga_comp >= 3 && !tga_rgb16)\r\n  {\r\n    unsigned char* tga_pixel = tga_data;\r\n    for (i=0; i < tga_width * tga_height; ++i)\r\n    {\r\n      unsigned char temp = tga_pixel[0];\r\n      tga_pixel[0] = tga_pixel[2];\r\n      tga_pixel[2] = temp;\r\n      tga_pixel += tga_comp;\r\n    }\r\n  }\r\n  \r\n  // convert to target component count\r\n  if (req_comp && req_comp != tga_comp)\r\n    tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);\r\n  \r\n  //   the things I do to get rid of an error message, and yet keep\r\n  //   Microsoft's C compilers happy... [8^(\r\n  tga_palette_start = tga_palette_len = tga_palette_bits =\r\n    tga_x_origin = tga_y_origin = 0;\r\n  STBI_NOTUSED(tga_palette_start);\r\n  //   OK, done\r\n  return tga_data;\r\n}\r\n#endif\r\n\r\n// *************************************************************************************************\r\n// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB\r\n\r\n#ifndef STBI_NO_PSD\r\nstatic int stbi__psd_test(stbi__context *s)\r\n{\r\n  int r = (stbi__get32be(s) == 0x38425053);\r\n  stbi__rewind(s);\r\n  return r;\r\n}\r\n\r\nstatic int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)\r\n{\r\n  int count, nleft, len;\r\n  \r\n  count = 0;\r\n  while ((nleft = pixelCount - count) > 0) {\r\n    len = stbi__get8(s);\r\n    if (len == 128) {\r\n      // No-op.\r\n    } else if (len < 128) {\r\n      // Copy next len+1 bytes literally.\r\n      len++;\r\n      if (len > nleft) return 0; // corrupt data\r\n      count += len;\r\n      while (len) {\r\n        *p = stbi__get8(s);\r\n        p += 4;\r\n        len--;\r\n      }\r\n    } else if (len > 128) {\r\n      stbi_uc   val;\r\n      // Next -len+1 bytes in the dest are replicated from next source byte.\r\n      // (Interpret len as a negative 8-bit int.)\r\n      len = 257 - len;\r\n      if (len > nleft) return 0; // corrupt data\r\n      val = stbi__get8(s);\r\n      count += len;\r\n      while (len) {\r\n        *p = val;\r\n        p += 4;\r\n        len--;\r\n      }\r\n    }\r\n  }\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)\r\n{\r\n  int pixelCount;\r\n  int channelCount, compression;\r\n  int channel, i;\r\n  int bitdepth;\r\n  int w,h;\r\n  stbi_uc *out;\r\n  STBI_NOTUSED(ri);\r\n  \r\n  // Check identifier\r\n  if (stbi__get32be(s) != 0x38425053)   // \"8BPS\"\r\n    return stbi__errpuc(\"not PSD\", \"Corrupt PSD image\");\r\n  \r\n  // Check file type version.\r\n  if (stbi__get16be(s) != 1)\r\n    return stbi__errpuc(\"wrong version\", \"Unsupported version of PSD image\");\r\n  \r\n  // Skip 6 reserved bytes.\r\n  stbi__skip(s, 6 );\r\n  \r\n  // Read the number of channels (R, G, B, A, etc).\r\n  channelCount = stbi__get16be(s);\r\n  if (channelCount < 0 || channelCount > 16)\r\n    return stbi__errpuc(\"wrong channel count\", \"Unsupported number of channels in PSD image\");\r\n  \r\n  // Read the rows and columns of the image.\r\n  h = stbi__get32be(s);\r\n  w = stbi__get32be(s);\r\n  \r\n  if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  // Make sure the depth is 8 bits.\r\n  bitdepth = stbi__get16be(s);\r\n  if (bitdepth != 8 && bitdepth != 16)\r\n    return stbi__errpuc(\"unsupported bit depth\", \"PSD bit depth is not 8 or 16 bit\");\r\n  \r\n  // Make sure the color mode is RGB.\r\n  // Valid options are:\r\n  //   0: Bitmap\r\n  //   1: Grayscale\r\n  //   2: Indexed color\r\n  //   3: RGB color\r\n  //   4: CMYK color\r\n  //   7: Multichannel\r\n  //   8: Duotone\r\n  //   9: Lab color\r\n  if (stbi__get16be(s) != 3)\r\n    return stbi__errpuc(\"wrong color format\", \"PSD is not in RGB color format\");\r\n  \r\n  // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)\r\n  stbi__skip(s,stbi__get32be(s) );\r\n  \r\n  // Skip the image resources.  (resolution, pen tool paths, etc)\r\n  stbi__skip(s, stbi__get32be(s) );\r\n  \r\n  // Skip the reserved data.\r\n  stbi__skip(s, stbi__get32be(s) );\r\n  \r\n  // Find out if the data is compressed.\r\n  // Known values:\r\n  //   0: no compression\r\n  //   1: RLE compressed\r\n  compression = stbi__get16be(s);\r\n  if (compression > 1)\r\n    return stbi__errpuc(\"bad compression\", \"PSD has an unknown compression format\");\r\n  \r\n  // Check size\r\n  if (!stbi__mad3sizes_valid(4, w, h, 0))\r\n    return stbi__errpuc(\"too large\", \"Corrupt PSD\");\r\n  \r\n  // Create the destination image.\r\n  \r\n  if (!compression && bitdepth == 16 && bpc == 16) {\r\n    out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);\r\n    ri->bits_per_channel = 16;\r\n  } else\r\n    out = (stbi_uc *) stbi__malloc(4 * w*h);\r\n  \r\n  if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  pixelCount = w*h;\r\n  \r\n  // Initialize the data to zero.\r\n  //memset( out, 0, pixelCount * 4 );\r\n  \r\n  // Finally, the image data.\r\n  if (compression) {\r\n    // RLE as used by .PSD and .TIFF\r\n    // Loop until you get the number of unpacked bytes you are expecting:\r\n    //     Read the next source byte into n.\r\n    //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.\r\n    //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.\r\n    //     Else if n is 128, noop.\r\n    // Endloop\r\n    \r\n    // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,\r\n    // which we're going to just skip.\r\n    stbi__skip(s, h * channelCount * 2 );\r\n    \r\n    // Read the RLE data by channel.\r\n    for (channel = 0; channel < 4; channel++) {\r\n      stbi_uc *p;\r\n      \r\n      p = out+channel;\r\n      if (channel >= channelCount) {\r\n        // Fill this channel with default data.\r\n        for (i = 0; i < pixelCount; i++, p += 4)\r\n          *p = (channel == 3 ? 255 : 0);\r\n      } else {\r\n        // Read the RLE data.\r\n        if (!stbi__psd_decode_rle(s, p, pixelCount)) {\r\n          STBI_FREE(out);\r\n          return stbi__errpuc(\"corrupt\", \"bad RLE data\");\r\n        }\r\n      }\r\n    }\r\n    \r\n  } else {\r\n    // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)\r\n    // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.\r\n    \r\n    // Read the data by channel.\r\n    for (channel = 0; channel < 4; channel++) {\r\n      if (channel >= channelCount) {\r\n        // Fill this channel with default data.\r\n        if (bitdepth == 16 && bpc == 16) {\r\n          stbi__uint16 *q = ((stbi__uint16 *) out) + channel;\r\n          stbi__uint16 val = channel == 3 ? 65535 : 0;\r\n          for (i = 0; i < pixelCount; i++, q += 4)\r\n            *q = val;\r\n        } else {\r\n          stbi_uc *p = out+channel;\r\n          stbi_uc val = channel == 3 ? 255 : 0;\r\n          for (i = 0; i < pixelCount; i++, p += 4)\r\n            *p = val;\r\n        }\r\n      } else {\r\n        if (ri->bits_per_channel == 16) {    // output bpc\r\n          stbi__uint16 *q = ((stbi__uint16 *) out) + channel;\r\n          for (i = 0; i < pixelCount; i++, q += 4)\r\n            *q = (stbi__uint16) stbi__get16be(s);\r\n        } else {\r\n          stbi_uc *p = out+channel;\r\n          if (bitdepth == 16) {  // input bpc\r\n            for (i = 0; i < pixelCount; i++, p += 4)\r\n              *p = (stbi_uc) (stbi__get16be(s) >> 8);\r\n          } else {\r\n            for (i = 0; i < pixelCount; i++, p += 4)\r\n              *p = stbi__get8(s);\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  // remove weird white matte from PSD\r\n  if (channelCount >= 4) {\r\n    if (ri->bits_per_channel == 16) {\r\n      for (i=0; i < w*h; ++i) {\r\n        stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;\r\n        if (pixel[3] != 0 && pixel[3] != 65535) {\r\n          float a = pixel[3] / 65535.0f;\r\n          float ra = 1.0f / a;\r\n          float inv_a = 65535.0f * (1 - ra);\r\n          pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);\r\n          pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);\r\n          pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);\r\n        }\r\n      }\r\n    } else {\r\n      for (i=0; i < w*h; ++i) {\r\n        unsigned char *pixel = out + 4*i;\r\n        if (pixel[3] != 0 && pixel[3] != 255) {\r\n          float a = pixel[3] / 255.0f;\r\n          float ra = 1.0f / a;\r\n          float inv_a = 255.0f * (1 - ra);\r\n          pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);\r\n          pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);\r\n          pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  // convert to desired output format\r\n  if (req_comp && req_comp != 4) {\r\n    if (ri->bits_per_channel == 16)\r\n      out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);\r\n    else\r\n      out = stbi__convert_format(out, 4, req_comp, w, h);\r\n    if (out == NULL) return out; // stbi__convert_format frees input on failure\r\n  }\r\n  \r\n  if (comp) *comp = 4;\r\n  *y = h;\r\n  *x = w;\r\n  \r\n  return out;\r\n}\r\n#endif\r\n\r\n// *************************************************************************************************\r\n// Softimage PIC loader\r\n// by Tom Seddon\r\n//\r\n// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format\r\n// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/\r\n\r\n#ifndef STBI_NO_PIC\r\nstatic int stbi__pic_is4(stbi__context *s,const char *str)\r\n{\r\n  int i;\r\n  for (i=0; i<4; ++i)\r\n    if (stbi__get8(s) != (stbi_uc)str[i])\r\n    return 0;\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic int stbi__pic_test_core(stbi__context *s)\r\n{\r\n  int i;\r\n  \r\n  if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\"))\r\n    return 0;\r\n  \r\n  for(i=0;i<84;++i)\r\n    stbi__get8(s);\r\n  \r\n  if (!stbi__pic_is4(s,\"PICT\"))\r\n    return 0;\r\n  \r\n  return 1;\r\n}\r\n\r\ntypedef struct\r\n{\r\n  stbi_uc size,type,channel;\r\n} stbi__pic_packet;\r\n\r\nstatic stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)\r\n{\r\n  int mask=0x80, i;\r\n  \r\n  for (i=0; i<4; ++i, mask>>=1) {\r\n    if (channel & mask) {\r\n      if (stbi__at_eof(s)) return stbi__errpuc(\"bad file\",\"PIC file too short\");\r\n      dest[i]=stbi__get8(s);\r\n    }\r\n  }\r\n  \r\n  return dest;\r\n}\r\n\r\nstatic void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)\r\n{\r\n  int mask=0x80,i;\r\n  \r\n  for (i=0;i<4; ++i, mask>>=1)\r\n    if (channel&mask)\r\n    dest[i]=src[i];\r\n}\r\n\r\nstatic stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)\r\n{\r\n  int act_comp=0,num_packets=0,y,chained;\r\n  stbi__pic_packet packets[10];\r\n  \r\n  // this will (should...) cater for even some bizarre stuff like having data\r\n  // for the same channel in multiple packets.\r\n  do {\r\n    stbi__pic_packet *packet;\r\n    \r\n    if (num_packets==sizeof(packets)/sizeof(packets[0]))\r\n      return stbi__errpuc(\"bad format\",\"too many packets\");\r\n    \r\n    packet = &packets[num_packets++];\r\n    \r\n    chained = stbi__get8(s);\r\n    packet->size    = stbi__get8(s);\r\n    packet->type    = stbi__get8(s);\r\n    packet->channel = stbi__get8(s);\r\n    \r\n    act_comp |= packet->channel;\r\n    \r\n    if (stbi__at_eof(s))          return stbi__errpuc(\"bad file\",\"file too short (reading packets)\");\r\n    if (packet->size != 8)  return stbi__errpuc(\"bad format\",\"packet isn't 8bpp\");\r\n  } while (chained);\r\n  \r\n  *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?\r\n  \r\n  for(y=0; y<height; ++y) {\r\n    int packet_idx;\r\n    \r\n    for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {\r\n      stbi__pic_packet *packet = &packets[packet_idx];\r\n      stbi_uc *dest = result+y*width*4;\r\n      \r\n      switch (packet->type) {\r\n        default:\r\n        return stbi__errpuc(\"bad format\",\"packet has bad compression type\");\r\n        \r\n        case 0: {//uncompressed\r\n          int x;\r\n          \r\n          for(x=0;x<width;++x, dest+=4)\r\n            if (!stbi__readval(s,packet->channel,dest))\r\n            return 0;\r\n          break;\r\n        }\r\n        \r\n        case 1://Pure RLE\r\n        {\r\n          int left=width, i;\r\n          \r\n          while (left>0) {\r\n            stbi_uc count,value[4];\r\n            \r\n            count=stbi__get8(s);\r\n            if (stbi__at_eof(s))   return stbi__errpuc(\"bad file\",\"file too short (pure read count)\");\r\n            \r\n            if (count > left)\r\n              count = (stbi_uc) left;\r\n            \r\n            if (!stbi__readval(s,packet->channel,value))  return 0;\r\n            \r\n            for(i=0; i<count; ++i,dest+=4)\r\n              stbi__copyval(packet->channel,dest,value);\r\n            left -= count;\r\n          }\r\n        }\r\n        break;\r\n        \r\n        case 2: {//Mixed RLE\r\n          int left=width;\r\n          while (left>0) {\r\n            int count = stbi__get8(s), i;\r\n            if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (mixed read count)\");\r\n            \r\n            if (count >= 128) { // Repeated\r\n              stbi_uc value[4];\r\n              \r\n              if (count==128)\r\n                count = stbi__get16be(s);\r\n              else\r\n                count -= 127;\r\n              if (count > left)\r\n                return stbi__errpuc(\"bad file\",\"scanline overrun\");\r\n              \r\n              if (!stbi__readval(s,packet->channel,value))\r\n                return 0;\r\n              \r\n              for(i=0;i<count;++i, dest += 4)\r\n                stbi__copyval(packet->channel,dest,value);\r\n            } else { // Raw\r\n              ++count;\r\n              if (count>left) return stbi__errpuc(\"bad file\",\"scanline overrun\");\r\n              \r\n              for(i=0;i<count;++i, dest+=4)\r\n                if (!stbi__readval(s,packet->channel,dest))\r\n                return 0;\r\n            }\r\n            left-=count;\r\n          }\r\n          break;\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\nstatic void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)\r\n{\r\n  stbi_uc *result;\r\n  int i, x,y, internal_comp;\r\n  STBI_NOTUSED(ri);\r\n  \r\n  if (!comp) comp = &internal_comp;\r\n  \r\n  for (i=0; i<92; ++i)\r\n    stbi__get8(s);\r\n  \r\n  x = stbi__get16be(s);\r\n  y = stbi__get16be(s);\r\n  \r\n  if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  if (stbi__at_eof(s))  return stbi__errpuc(\"bad file\",\"file too short (pic header)\");\r\n  if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc(\"too large\", \"PIC image too large to decode\");\r\n  \r\n  stbi__get32be(s); //skip `ratio'\r\n  stbi__get16be(s); //skip `fields'\r\n  stbi__get16be(s); //skip `pad'\r\n  \r\n  // intermediate buffer is RGBA\r\n  result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);\r\n  if (!result) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  memset(result, 0xff, x*y*4);\r\n  \r\n  if (!stbi__pic_load_core(s,x,y,comp, result)) {\r\n    STBI_FREE(result);\r\n    result=0;\r\n  }\r\n  *px = x;\r\n  *py = y;\r\n  if (req_comp == 0) req_comp = *comp;\r\n  result=stbi__convert_format(result,4,req_comp,x,y);\r\n  \r\n  return result;\r\n}\r\n\r\nstatic int stbi__pic_test(stbi__context *s)\r\n{\r\n  int r = stbi__pic_test_core(s);\r\n  stbi__rewind(s);\r\n  return r;\r\n}\r\n#endif\r\n\r\n// *************************************************************************************************\r\n// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb\r\n\r\n#ifndef STBI_NO_GIF\r\ntypedef struct\r\n{\r\n  stbi__int16 prefix;\r\n  stbi_uc first;\r\n  stbi_uc suffix;\r\n} stbi__gif_lzw;\r\n\r\ntypedef struct\r\n{\r\n  int w,h;\r\n  stbi_uc *out;                 // output buffer (always 4 components)\r\n  stbi_uc *background;          // The current \"background\" as far as a gif is concerned\r\n  stbi_uc *history;\r\n  int flags, bgindex, ratio, transparent, eflags;\r\n  stbi_uc  pal[256][4];\r\n  stbi_uc lpal[256][4];\r\n  stbi__gif_lzw codes[8192];\r\n  stbi_uc *color_table;\r\n  int parse, step;\r\n  int lflags;\r\n  int start_x, start_y;\r\n  int max_x, max_y;\r\n  int cur_x, cur_y;\r\n  int line_size;\r\n  int delay;\r\n} stbi__gif;\r\n\r\nstatic int stbi__gif_test_raw(stbi__context *s)\r\n{\r\n  int sz;\r\n  if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;\r\n  sz = stbi__get8(s);\r\n  if (sz != '9' && sz != '7') return 0;\r\n  if (stbi__get8(s) != 'a') return 0;\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__gif_test(stbi__context *s)\r\n{\r\n  int r = stbi__gif_test_raw(s);\r\n  stbi__rewind(s);\r\n  return r;\r\n}\r\n\r\nstatic void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)\r\n{\r\n  int i;\r\n  for (i=0; i < num_entries; ++i) {\r\n    pal[i][2] = stbi__get8(s);\r\n    pal[i][1] = stbi__get8(s);\r\n    pal[i][0] = stbi__get8(s);\r\n    pal[i][3] = transp == i ? 0 : 255;\r\n  }\r\n}\r\n\r\nstatic int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)\r\n{\r\n  stbi_uc version;\r\n  if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')\r\n    return stbi__err(\"not GIF\", \"Corrupt GIF\");\r\n  \r\n  version = stbi__get8(s);\r\n  if (version != '7' && version != '9')    return stbi__err(\"not GIF\", \"Corrupt GIF\");\r\n  if (stbi__get8(s) != 'a')                return stbi__err(\"not GIF\", \"Corrupt GIF\");\r\n  \r\n  stbi__g_failure_reason = \"\";\r\n  g->w = stbi__get16le(s);\r\n  g->h = stbi__get16le(s);\r\n  g->flags = stbi__get8(s);\r\n  g->bgindex = stbi__get8(s);\r\n  g->ratio = stbi__get8(s);\r\n  g->transparent = -1;\r\n  \r\n  if (g->w > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\r\n  if (g->h > STBI_MAX_DIMENSIONS) return stbi__err(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments\r\n  \r\n  if (is_info) return 1;\r\n  \r\n  if (g->flags & 0x80)\r\n    stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);\r\n  \r\n  return 1;\r\n}\r\n\r\nstatic int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));\r\n  if (!g) return stbi__err(\"outofmem\", \"Out of memory\");\r\n  if (!stbi__gif_header(s, g, comp, 1)) {\r\n    STBI_FREE(g);\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  if (x) *x = g->w;\r\n  if (y) *y = g->h;\r\n  STBI_FREE(g);\r\n  return 1;\r\n}\r\n\r\nstatic void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)\r\n{\r\n  stbi_uc *p, *c;\r\n  int idx;\r\n  \r\n  // recurse to decode the prefixes, since the linked-list is backwards,\r\n  // and working backwards through an interleaved image would be nasty\r\n  if (g->codes[code].prefix >= 0)\r\n    stbi__out_gif_code(g, g->codes[code].prefix);\r\n  \r\n  if (g->cur_y >= g->max_y) return;\r\n  \r\n  idx = g->cur_x + g->cur_y;\r\n  p = &g->out[idx];\r\n  g->history[idx / 4] = 1;\r\n  \r\n  c = &g->color_table[g->codes[code].suffix * 4];\r\n  if (c[3] > 128) { // don't render transparent pixels;\r\n    p[0] = c[2];\r\n    p[1] = c[1];\r\n    p[2] = c[0];\r\n    p[3] = c[3];\r\n  }\r\n  g->cur_x += 4;\r\n  \r\n  if (g->cur_x >= g->max_x) {\r\n    g->cur_x = g->start_x;\r\n    g->cur_y += g->step;\r\n    \r\n    while (g->cur_y >= g->max_y && g->parse > 0) {\r\n      g->step = (1 << g->parse) * g->line_size;\r\n      g->cur_y = g->start_y + (g->step >> 1);\r\n      --g->parse;\r\n    }\r\n  }\r\n}\r\n\r\nstatic stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)\r\n{\r\n  stbi_uc lzw_cs;\r\n  stbi__int32 len, init_code;\r\n  stbi__uint32 first;\r\n  stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;\r\n  stbi__gif_lzw *p;\r\n  \r\n  lzw_cs = stbi__get8(s);\r\n  if (lzw_cs > 12) return NULL;\r\n  clear = 1 << lzw_cs;\r\n  first = 1;\r\n  codesize = lzw_cs + 1;\r\n  codemask = (1 << codesize) - 1;\r\n  bits = 0;\r\n  valid_bits = 0;\r\n  for (init_code = 0; init_code < clear; init_code++) {\r\n    g->codes[init_code].prefix = -1;\r\n    g->codes[init_code].first = (stbi_uc) init_code;\r\n    g->codes[init_code].suffix = (stbi_uc) init_code;\r\n  }\r\n  \r\n  // support no starting clear code\r\n  avail = clear+2;\r\n  oldcode = -1;\r\n  \r\n  len = 0;\r\n  for(;;) {\r\n    if (valid_bits < codesize) {\r\n      if (len == 0) {\r\n        len = stbi__get8(s); // start new block\r\n        if (len == 0)\r\n          return g->out;\r\n      }\r\n      --len;\r\n      bits |= (stbi__int32) stbi__get8(s) << valid_bits;\r\n      valid_bits += 8;\r\n    } else {\r\n      stbi__int32 code = bits & codemask;\r\n      bits >>= codesize;\r\n      valid_bits -= codesize;\r\n      // @OPTIMIZE: is there some way we can accelerate the non-clear path?\r\n      if (code == clear) {  // clear code\r\n        codesize = lzw_cs + 1;\r\n        codemask = (1 << codesize) - 1;\r\n        avail = clear + 2;\r\n        oldcode = -1;\r\n        first = 0;\r\n      } else if (code == clear + 1) { // end of stream code\r\n        stbi__skip(s, len);\r\n        while ((len = stbi__get8(s)) > 0)\r\n          stbi__skip(s,len);\r\n        return g->out;\r\n      } else if (code <= avail) {\r\n        if (first) {\r\n          return stbi__errpuc(\"no clear code\", \"Corrupt GIF\");\r\n        }\r\n        \r\n        if (oldcode >= 0) {\r\n          p = &g->codes[avail++];\r\n          if (avail > 8192) {\r\n            return stbi__errpuc(\"too many codes\", \"Corrupt GIF\");\r\n          }\r\n          \r\n          p->prefix = (stbi__int16) oldcode;\r\n          p->first = g->codes[oldcode].first;\r\n          p->suffix = (code == avail) ? p->first : g->codes[code].first;\r\n        } else if (code == avail)\r\n          return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\r\n        \r\n        stbi__out_gif_code(g, (stbi__uint16) code);\r\n        \r\n        if ((avail & codemask) == 0 && avail <= 0x0FFF) {\r\n          codesize++;\r\n          codemask = (1 << codesize) - 1;\r\n        }\r\n        \r\n        oldcode = code;\r\n      } else {\r\n        return stbi__errpuc(\"illegal code in raster\", \"Corrupt GIF\");\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n// this function is designed to support animated gifs, although stb_image doesn't support it\r\n// two back is the image from two frames ago, used for a very specific disposal format\r\nstatic stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)\r\n{\r\n  int dispose;\r\n  int first_frame;\r\n  int pi;\r\n  int pcount;\r\n  STBI_NOTUSED(req_comp);\r\n  \r\n  // on first frame, any non-written pixels get the background colour (non-transparent)\r\n  first_frame = 0;\r\n  if (g->out == 0) {\r\n    if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header\r\n    if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))\r\n      return stbi__errpuc(\"too large\", \"GIF image is too large\");\r\n    pcount = g->w * g->h;\r\n    g->out = (stbi_uc *) stbi__malloc(4 * pcount);\r\n    g->background = (stbi_uc *) stbi__malloc(4 * pcount);\r\n    g->history = (stbi_uc *) stbi__malloc(pcount);\r\n    if (!g->out || !g->background || !g->history)\r\n      return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n    \r\n    // image is treated as \"transparent\" at the start - ie, nothing overwrites the current background;\r\n    // background colour is only used for pixels that are not rendered first frame, after that \"background\"\r\n    // color refers to the color that was there the previous frame.\r\n    memset(g->out, 0x00, 4 * pcount);\r\n    memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)\r\n    memset(g->history, 0x00, pcount);        // pixels that were affected previous frame\r\n    first_frame = 1;\r\n  } else {\r\n    // second frame - how do we dispose of the previous one?\r\n    dispose = (g->eflags & 0x1C) >> 2;\r\n    pcount = g->w * g->h;\r\n    \r\n    if ((dispose == 3) && (two_back == 0)) {\r\n      dispose = 2; // if I don't have an image to revert back to, default to the old background\r\n    }\r\n    \r\n    if (dispose == 3) { // use previous graphic\r\n      for (pi = 0; pi < pcount; ++pi) {\r\n        if (g->history[pi]) {\r\n          memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );\r\n        }\r\n      }\r\n    } else if (dispose == 2) {\r\n      // restore what was changed last frame to background before that frame;\r\n      for (pi = 0; pi < pcount; ++pi) {\r\n        if (g->history[pi]) {\r\n          memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );\r\n        }\r\n      }\r\n    } else {\r\n      // This is a non-disposal case eithe way, so just\r\n      // leave the pixels as is, and they will become the new background\r\n      // 1: do not dispose\r\n      // 0:  not specified.\r\n    }\r\n    \r\n    // background is what out is after the undoing of the previou frame;\r\n    memcpy( g->background, g->out, 4 * g->w * g->h );\r\n  }\r\n  \r\n  // clear my history;\r\n  memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame\r\n  \r\n  for (;;) {\r\n    int tag = stbi__get8(s);\r\n    switch (tag) {\r\n      case 0x2C: /* Image Descriptor */\r\n      {\r\n        stbi__int32 x, y, w, h;\r\n        stbi_uc *o;\r\n        \r\n        x = stbi__get16le(s);\r\n        y = stbi__get16le(s);\r\n        w = stbi__get16le(s);\r\n        h = stbi__get16le(s);\r\n        if (((x + w) > (g->w)) || ((y + h) > (g->h)))\r\n          return stbi__errpuc(\"bad Image Descriptor\", \"Corrupt GIF\");\r\n        \r\n        g->line_size = g->w * 4;\r\n        g->start_x = x * 4;\r\n        g->start_y = y * g->line_size;\r\n        g->max_x   = g->start_x + w * 4;\r\n        g->max_y   = g->start_y + h * g->line_size;\r\n        g->cur_x   = g->start_x;\r\n        g->cur_y   = g->start_y;\r\n        \r\n        // if the width of the specified rectangle is 0, that means\r\n        // we may not see *any* pixels or the image is malformed;\r\n        // to make sure this is caught, move the current y down to\r\n        // max_y (which is what out_gif_code checks).\r\n        if (w == 0)\r\n          g->cur_y = g->max_y;\r\n        \r\n        g->lflags = stbi__get8(s);\r\n        \r\n        if (g->lflags & 0x40) {\r\n          g->step = 8 * g->line_size; // first interlaced spacing\r\n          g->parse = 3;\r\n        } else {\r\n          g->step = g->line_size;\r\n          g->parse = 0;\r\n        }\r\n        \r\n        if (g->lflags & 0x80) {\r\n          stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);\r\n          g->color_table = (stbi_uc *) g->lpal;\r\n        } else if (g->flags & 0x80) {\r\n          g->color_table = (stbi_uc *) g->pal;\r\n        } else\r\n          return stbi__errpuc(\"missing color table\", \"Corrupt GIF\");\r\n        \r\n        o = stbi__process_gif_raster(s, g);\r\n        if (!o) return NULL;\r\n        \r\n        // if this was the first frame,\r\n        pcount = g->w * g->h;\r\n        if (first_frame && (g->bgindex > 0)) {\r\n          // if first frame, any pixel not drawn to gets the background color\r\n          for (pi = 0; pi < pcount; ++pi) {\r\n            if (g->history[pi] == 0) {\r\n              g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;\r\n              memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );\r\n            }\r\n          }\r\n        }\r\n        \r\n        return o;\r\n      }\r\n      \r\n      case 0x21: // Comment Extension.\r\n      {\r\n        int len;\r\n        int ext = stbi__get8(s);\r\n        if (ext == 0xF9) { // Graphic Control Extension.\r\n          len = stbi__get8(s);\r\n          if (len == 4) {\r\n            g->eflags = stbi__get8(s);\r\n            g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.\r\n            \r\n            // unset old transparent\r\n            if (g->transparent >= 0) {\r\n              g->pal[g->transparent][3] = 255;\r\n            }\r\n            if (g->eflags & 0x01) {\r\n              g->transparent = stbi__get8(s);\r\n              if (g->transparent >= 0) {\r\n                g->pal[g->transparent][3] = 0;\r\n              }\r\n            } else {\r\n              // don't need transparent\r\n              stbi__skip(s, 1);\r\n              g->transparent = -1;\r\n            }\r\n          } else {\r\n            stbi__skip(s, len);\r\n            break;\r\n          }\r\n        }\r\n        while ((len = stbi__get8(s)) != 0) {\r\n          stbi__skip(s, len);\r\n        }\r\n        break;\r\n      }\r\n      \r\n      case 0x3B: // gif stream termination code\r\n      return (stbi_uc *) s; // using '1' causes warning on some compilers\r\n      \r\n      default:\r\n      return stbi__errpuc(\"unknown code\", \"Corrupt GIF\");\r\n    }\r\n  }\r\n}\r\n\r\nstatic void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays)\r\n{\r\n  STBI_FREE(g->out);\r\n  STBI_FREE(g->history);\r\n  STBI_FREE(g->background);\r\n  \r\n  if (out) STBI_FREE(out);\r\n  if (delays && *delays) STBI_FREE(*delays);\r\n  return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n}\r\n\r\nstatic void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)\r\n{\r\n  if (stbi__gif_test(s)) {\r\n    int layers = 0;\r\n    stbi_uc *u = 0;\r\n    stbi_uc *out = 0;\r\n    stbi_uc *two_back = 0;\r\n    stbi__gif g;\r\n    int stride;\r\n    int out_size = 0;\r\n    int delays_size = 0;\r\n    \r\n    STBI_NOTUSED(out_size);\r\n    STBI_NOTUSED(delays_size);\r\n    \r\n    memset(&g, 0, sizeof(g));\r\n    if (delays) {\r\n      *delays = 0;\r\n    }\r\n    \r\n    do {\r\n      u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);\r\n      if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker\r\n      \r\n      if (u) {\r\n        *x = g.w;\r\n        *y = g.h;\r\n        ++layers;\r\n        stride = g.w * g.h * 4;\r\n        \r\n        if (out) {\r\n          void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );\r\n          if (!tmp)\r\n            return stbi__load_gif_main_outofmem(&g, out, delays);\r\n          else {\r\n            out = (stbi_uc*) tmp;\r\n            out_size = layers * stride;\r\n          }\r\n          \r\n          if (delays) {\r\n            int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );\r\n            if (!new_delays)\r\n              return stbi__load_gif_main_outofmem(&g, out, delays);\r\n            *delays = new_delays;\r\n            delays_size = layers * sizeof(int);\r\n          }\r\n        } else {\r\n          out = (stbi_uc*)stbi__malloc( layers * stride );\r\n          if (!out)\r\n            return stbi__load_gif_main_outofmem(&g, out, delays);\r\n          out_size = layers * stride;\r\n          if (delays) {\r\n            *delays = (int*) stbi__malloc( layers * sizeof(int) );\r\n            if (!*delays)\r\n              return stbi__load_gif_main_outofmem(&g, out, delays);\r\n            delays_size = layers * sizeof(int);\r\n          }\r\n        }\r\n        memcpy( out + ((layers - 1) * stride), u, stride );\r\n        if (layers >= 2) {\r\n          two_back = out - 2 * stride;\r\n        }\r\n        \r\n        if (delays) {\r\n          (*delays)[layers - 1U] = g.delay;\r\n        }\r\n      }\r\n    } while (u != 0);\r\n    \r\n    // free temp buffer;\r\n    STBI_FREE(g.out);\r\n    STBI_FREE(g.history);\r\n    STBI_FREE(g.background);\r\n    \r\n    // do the final conversion after loading everything;\r\n    if (req_comp && req_comp != 4)\r\n      out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);\r\n    \r\n    *z = layers;\r\n    return out;\r\n  } else {\r\n    return stbi__errpuc(\"not GIF\", \"Image was not as a gif type.\");\r\n  }\r\n}\r\n\r\nstatic void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  stbi_uc *u = 0;\r\n  stbi__gif g;\r\n  memset(&g, 0, sizeof(g));\r\n  STBI_NOTUSED(ri);\r\n  \r\n  u = stbi__gif_load_next(s, &g, comp, req_comp, 0);\r\n  if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker\r\n  if (u) {\r\n    *x = g.w;\r\n    *y = g.h;\r\n    \r\n    // moved conversion to after successful load so that the same\r\n    // can be done for multiple frames.\r\n    if (req_comp && req_comp != 4)\r\n      u = stbi__convert_format(u, 4, req_comp, g.w, g.h);\r\n  } else if (g.out) {\r\n    // if there was an error and we allocated an image buffer, free it!\r\n    STBI_FREE(g.out);\r\n  }\r\n  \r\n  // free buffers needed for multiple frame loading;\r\n  STBI_FREE(g.history);\r\n  STBI_FREE(g.background);\r\n  \r\n  return u;\r\n}\r\n\r\nstatic int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  return stbi__gif_info_raw(s,x,y,comp);\r\n}\r\n#endif\r\n\r\n// *************************************************************************************************\r\n// Radiance RGBE HDR loader\r\n// originally by Nicolas Schulz\r\n#ifndef STBI_NO_HDR\r\nstatic int stbi__hdr_test_core(stbi__context *s, const char *signature)\r\n{\r\n  int i;\r\n  for (i=0; signature[i]; ++i)\r\n    if (stbi__get8(s) != signature[i])\r\n    return 0;\r\n  stbi__rewind(s);\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__hdr_test(stbi__context* s)\r\n{\r\n  int r = stbi__hdr_test_core(s, \"#?RADIANCE\\n\");\r\n  stbi__rewind(s);\r\n  if(!r) {\r\n    r = stbi__hdr_test_core(s, \"#?RGBE\\n\");\r\n    stbi__rewind(s);\r\n  }\r\n  return r;\r\n}\r\n\r\n#define STBI__HDR_BUFLEN  1024\r\nstatic char *stbi__hdr_gettoken(stbi__context *z, char *buffer)\r\n{\r\n  int len=0;\r\n  char c = '\\0';\r\n  \r\n  c = (char) stbi__get8(z);\r\n  \r\n  while (!stbi__at_eof(z) && c != '\\n') {\r\n    buffer[len++] = c;\r\n    if (len == STBI__HDR_BUFLEN-1) {\r\n      // flush to end of line\r\n      while (!stbi__at_eof(z) && stbi__get8(z) != '\\n')\r\n        ;\r\n      break;\r\n    }\r\n    c = (char) stbi__get8(z);\r\n  }\r\n  \r\n  buffer[len] = 0;\r\n  return buffer;\r\n}\r\n\r\nstatic void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)\r\n{\r\n  if ( input[3] != 0 ) {\r\n    float f1;\r\n    // Exponent\r\n    f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));\r\n    if (req_comp <= 2)\r\n      output[0] = (input[0] + input[1] + input[2]) * f1 / 3;\r\n    else {\r\n      output[0] = input[0] * f1;\r\n      output[1] = input[1] * f1;\r\n      output[2] = input[2] * f1;\r\n    }\r\n    if (req_comp == 2) output[1] = 1;\r\n    if (req_comp == 4) output[3] = 1;\r\n  } else {\r\n    switch (req_comp) {\r\n      case 4: output[3] = 1; /* fallthrough */\r\n      case 3: output[0] = output[1] = output[2] = 0;\r\n      break;\r\n      case 2: output[1] = 1; /* fallthrough */\r\n      case 1: output[0] = 0;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\nstatic float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  char buffer[STBI__HDR_BUFLEN];\r\n  char *token;\r\n  int valid = 0;\r\n  int width, height;\r\n  stbi_uc *scanline;\r\n  float *hdr_data;\r\n  int len;\r\n  unsigned char count, value;\r\n  int i, j, k, c1,c2, z;\r\n  const char *headerToken;\r\n  STBI_NOTUSED(ri);\r\n  \r\n  // Check identifier\r\n  headerToken = stbi__hdr_gettoken(s,buffer);\r\n  if (strcmp(headerToken, \"#?RADIANCE\") != 0 && strcmp(headerToken, \"#?RGBE\") != 0)\r\n    return stbi__errpf(\"not HDR\", \"Corrupt HDR image\");\r\n  \r\n  // Parse header\r\n  for(;;) {\r\n    token = stbi__hdr_gettoken(s,buffer);\r\n    if (token[0] == 0) break;\r\n    if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\r\n  }\r\n  \r\n  if (!valid)    return stbi__errpf(\"unsupported format\", \"Unsupported HDR format\");\r\n  \r\n  // Parse width and height\r\n  // can't use sscanf() if we're not using stdio!\r\n  token = stbi__hdr_gettoken(s,buffer);\r\n  if (strncmp(token, \"-Y \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\r\n  token += 3;\r\n  height = (int) strtol(token, &token, 10);\r\n  while (*token == ' ') ++token;\r\n  if (strncmp(token, \"+X \", 3))  return stbi__errpf(\"unsupported data layout\", \"Unsupported HDR format\");\r\n  token += 3;\r\n  width = (int) strtol(token, NULL, 10);\r\n  \r\n  if (height > STBI_MAX_DIMENSIONS) return stbi__errpf(\"too large\",\"Very large image (corrupt?)\");\r\n  if (width > STBI_MAX_DIMENSIONS) return stbi__errpf(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  *x = width;\r\n  *y = height;\r\n  \r\n  if (comp) *comp = 3;\r\n  if (req_comp == 0) req_comp = 3;\r\n  \r\n  if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))\r\n    return stbi__errpf(\"too large\", \"HDR image is too large\");\r\n  \r\n  // Read data\r\n  hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);\r\n  if (!hdr_data)\r\n    return stbi__errpf(\"outofmem\", \"Out of memory\");\r\n  \r\n  // Load image data\r\n  // image data is stored as some number of sca\r\n  if ( width < 8 || width >= 32768) {\r\n    // Read flat data\r\n    for (j=0; j < height; ++j) {\r\n      for (i=0; i < width; ++i) {\r\n        stbi_uc rgbe[4];\r\n        main_decode_loop:\r\n        stbi__getn(s, rgbe, 4);\r\n        stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);\r\n      }\r\n    }\r\n  } else {\r\n    // Read RLE-encoded data\r\n    scanline = NULL;\r\n    \r\n    for (j = 0; j < height; ++j) {\r\n      c1 = stbi__get8(s);\r\n      c2 = stbi__get8(s);\r\n      len = stbi__get8(s);\r\n      if (c1 != 2 || c2 != 2 || (len & 0x80)) {\r\n        // not run-length encoded, so we have to actually use THIS data as a decoded\r\n        // pixel (note this can't be a valid pixel--one of RGB must be >= 128)\r\n        stbi_uc rgbe[4];\r\n        rgbe[0] = (stbi_uc) c1;\r\n        rgbe[1] = (stbi_uc) c2;\r\n        rgbe[2] = (stbi_uc) len;\r\n        rgbe[3] = (stbi_uc) stbi__get8(s);\r\n        stbi__hdr_convert(hdr_data, rgbe, req_comp);\r\n        i = 1;\r\n        j = 0;\r\n        STBI_FREE(scanline);\r\n        goto main_decode_loop; // yes, this makes no sense\r\n      }\r\n      len <<= 8;\r\n      len |= stbi__get8(s);\r\n      if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"invalid decoded scanline length\", \"corrupt HDR\"); }\r\n      if (scanline == NULL) {\r\n        scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);\r\n        if (!scanline) {\r\n          STBI_FREE(hdr_data);\r\n          return stbi__errpf(\"outofmem\", \"Out of memory\");\r\n        }\r\n      }\r\n      \r\n      for (k = 0; k < 4; ++k) {\r\n        int nleft;\r\n        i = 0;\r\n        while ((nleft = width - i) > 0) {\r\n          count = stbi__get8(s);\r\n          if (count > 128) {\r\n            // Run\r\n            value = stbi__get8(s);\r\n            count -= 128;\r\n            if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"corrupt\", \"bad RLE data in HDR\"); }\r\n            for (z = 0; z < count; ++z)\r\n              scanline[i++ * 4 + k] = value;\r\n          } else {\r\n            // Dump\r\n            if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf(\"corrupt\", \"bad RLE data in HDR\"); }\r\n            for (z = 0; z < count; ++z)\r\n              scanline[i++ * 4 + k] = stbi__get8(s);\r\n          }\r\n        }\r\n      }\r\n      for (i=0; i < width; ++i)\r\n        stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);\r\n    }\r\n    if (scanline)\r\n      STBI_FREE(scanline);\r\n  }\r\n  \r\n  return hdr_data;\r\n}\r\n\r\nstatic int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  char buffer[STBI__HDR_BUFLEN];\r\n  char *token;\r\n  int valid = 0;\r\n  int dummy;\r\n  \r\n  if (!x) x = &dummy;\r\n  if (!y) y = &dummy;\r\n  if (!comp) comp = &dummy;\r\n  \r\n  if (stbi__hdr_test(s) == 0) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  \r\n  for(;;) {\r\n    token = stbi__hdr_gettoken(s,buffer);\r\n    if (token[0] == 0) break;\r\n    if (strcmp(token, \"FORMAT=32-bit_rle_rgbe\") == 0) valid = 1;\r\n  }\r\n  \r\n  if (!valid) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  token = stbi__hdr_gettoken(s,buffer);\r\n  if (strncmp(token, \"-Y \", 3)) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  token += 3;\r\n  *y = (int) strtol(token, &token, 10);\r\n  while (*token == ' ') ++token;\r\n  if (strncmp(token, \"+X \", 3)) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  token += 3;\r\n  *x = (int) strtol(token, NULL, 10);\r\n  *comp = 3;\r\n  return 1;\r\n}\r\n#endif // STBI_NO_HDR\r\n\r\n#ifndef STBI_NO_BMP\r\nstatic int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  void *p;\r\n  stbi__bmp_data info;\r\n  \r\n  info.all_a = 255;\r\n  p = stbi__bmp_parse_header(s, &info);\r\n  if (p == NULL) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  if (x) *x = s->img_x;\r\n  if (y) *y = s->img_y;\r\n  if (comp) {\r\n    if (info.bpp == 24 && info.ma == 0xff000000)\r\n      *comp = 3;\r\n    else\r\n      *comp = info.ma ? 4 : 3;\r\n  }\r\n  return 1;\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_PSD\r\nstatic int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  int channelCount, dummy, depth;\r\n  if (!x) x = &dummy;\r\n  if (!y) y = &dummy;\r\n  if (!comp) comp = &dummy;\r\n  if (stbi__get32be(s) != 0x38425053) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  if (stbi__get16be(s) != 1) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  stbi__skip(s, 6);\r\n  channelCount = stbi__get16be(s);\r\n  if (channelCount < 0 || channelCount > 16) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  *y = stbi__get32be(s);\r\n  *x = stbi__get32be(s);\r\n  depth = stbi__get16be(s);\r\n  if (depth != 8 && depth != 16) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  if (stbi__get16be(s) != 3) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  *comp = 4;\r\n  return 1;\r\n}\r\n\r\nstatic int stbi__psd_is16(stbi__context *s)\r\n{\r\n  int channelCount, depth;\r\n  if (stbi__get32be(s) != 0x38425053) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  if (stbi__get16be(s) != 1) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  stbi__skip(s, 6);\r\n  channelCount = stbi__get16be(s);\r\n  if (channelCount < 0 || channelCount > 16) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  STBI_NOTUSED(stbi__get32be(s));\r\n  STBI_NOTUSED(stbi__get32be(s));\r\n  depth = stbi__get16be(s);\r\n  if (depth != 16) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  return 1;\r\n}\r\n#endif\r\n\r\n#ifndef STBI_NO_PIC\r\nstatic int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  int act_comp=0,num_packets=0,chained,dummy;\r\n  stbi__pic_packet packets[10];\r\n  \r\n  if (!x) x = &dummy;\r\n  if (!y) y = &dummy;\r\n  if (!comp) comp = &dummy;\r\n  \r\n  if (!stbi__pic_is4(s,\"\\x53\\x80\\xF6\\x34\")) {\r\n    stbi__rewind(s);\r\n    return 0;\r\n  }\r\n  \r\n  stbi__skip(s, 88);\r\n  \r\n  *x = stbi__get16be(s);\r\n  *y = stbi__get16be(s);\r\n  if (stbi__at_eof(s)) {\r\n    stbi__rewind( s);\r\n    return 0;\r\n  }\r\n  if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  \r\n  stbi__skip(s, 8);\r\n  \r\n  do {\r\n    stbi__pic_packet *packet;\r\n    \r\n    if (num_packets==sizeof(packets)/sizeof(packets[0]))\r\n      return 0;\r\n    \r\n    packet = &packets[num_packets++];\r\n    chained = stbi__get8(s);\r\n    packet->size    = stbi__get8(s);\r\n    packet->type    = stbi__get8(s);\r\n    packet->channel = stbi__get8(s);\r\n    act_comp |= packet->channel;\r\n    \r\n    if (stbi__at_eof(s)) {\r\n      stbi__rewind( s );\r\n      return 0;\r\n    }\r\n    if (packet->size != 8) {\r\n      stbi__rewind( s );\r\n      return 0;\r\n    }\r\n  } while (chained);\r\n  \r\n  *comp = (act_comp & 0x10 ? 4 : 3);\r\n  \r\n  return 1;\r\n}\r\n#endif\r\n\r\n// *************************************************************************************************\r\n// Portable Gray Map and Portable Pixel Map loader\r\n// by Ken Miller\r\n//\r\n// PGM: http://netpbm.sourceforge.net/doc/pgm.html\r\n// PPM: http://netpbm.sourceforge.net/doc/ppm.html\r\n//\r\n// Known limitations:\r\n//    Does not support comments in the header section\r\n//    Does not support ASCII image data (formats P2 and P3)\r\n\r\n#ifndef STBI_NO_PNM\r\n\r\nstatic int      stbi__pnm_test(stbi__context *s)\r\n{\r\n  char p, t;\r\n  p = (char) stbi__get8(s);\r\n  t = (char) stbi__get8(s);\r\n  if (p != 'P' || (t != '5' && t != '6')) {\r\n    stbi__rewind( s );\r\n    return 0;\r\n  }\r\n  return 1;\r\n}\r\n\r\nstatic void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)\r\n{\r\n  stbi_uc *out;\r\n  STBI_NOTUSED(ri);\r\n  \r\n  ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);\r\n  if (ri->bits_per_channel == 0)\r\n    return 0;\r\n  \r\n  if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc(\"too large\",\"Very large image (corrupt?)\");\r\n  \r\n  *x = s->img_x;\r\n  *y = s->img_y;\r\n  if (comp) *comp = s->img_n;\r\n  \r\n  if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))\r\n    return stbi__errpuc(\"too large\", \"PNM too large\");\r\n  \r\n  out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);\r\n  if (!out) return stbi__errpuc(\"outofmem\", \"Out of memory\");\r\n  if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {\r\n    STBI_FREE(out);\r\n    return stbi__errpuc(\"bad PNM\", \"PNM file truncated\");\r\n  }\r\n  \r\n  if (req_comp && req_comp != s->img_n) {\r\n    if (ri->bits_per_channel == 16) {\r\n      out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);\r\n    } else {\r\n      out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);\r\n    }\r\n    if (out == NULL) return out; // stbi__convert_format frees input on failure\r\n  }\r\n  return out;\r\n}\r\n\r\nstatic int      stbi__pnm_isspace(char c)\r\n{\r\n  return c == ' ' || c == '\\t' || c == '\\n' || c == '\\v' || c == '\\f' || c == '\\r';\r\n}\r\n\r\nstatic void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)\r\n{\r\n  for (;;) {\r\n    while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))\r\n      *c = (char) stbi__get8(s);\r\n    \r\n    if (stbi__at_eof(s) || *c != '#')\r\n      break;\r\n    \r\n    while (!stbi__at_eof(s) && *c != '\\n' && *c != '\\r' )\r\n      *c = (char) stbi__get8(s);\r\n  }\r\n}\r\n\r\nstatic int      stbi__pnm_isdigit(char c)\r\n{\r\n  return c >= '0' && c <= '9';\r\n}\r\n\r\nstatic int      stbi__pnm_getinteger(stbi__context *s, char *c)\r\n{\r\n  int value = 0;\r\n  \r\n  while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {\r\n    value = value*10 + (*c - '0');\r\n    *c = (char) stbi__get8(s);\r\n    if((value > 214748364) || (value == 214748364 && *c > '7'))\r\n      return stbi__err(\"integer parse overflow\", \"Parsing an integer in the PPM header overflowed a 32-bit int\");\r\n  }\r\n  \r\n  return value;\r\n}\r\n\r\nstatic int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n  int maxv, dummy;\r\n  char c, p, t;\r\n  \r\n  if (!x) x = &dummy;\r\n  if (!y) y = &dummy;\r\n  if (!comp) comp = &dummy;\r\n  \r\n  stbi__rewind(s);\r\n  \r\n  // Get identifier\r\n  p = (char) stbi__get8(s);\r\n  t = (char) stbi__get8(s);\r\n  if (p != 'P' || (t != '5' && t != '6')) {\r\n    stbi__rewind(s);\r\n    return 0;\r\n  }\r\n  \r\n  *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm\r\n  \r\n  c = (char) stbi__get8(s);\r\n  stbi__pnm_skip_whitespace(s, &c);\r\n  \r\n  *x = stbi__pnm_getinteger(s, &c); // read width\r\n  if(*x == 0)\r\n    return stbi__err(\"invalid width\", \"PPM image header had zero or overflowing width\");\r\n  stbi__pnm_skip_whitespace(s, &c);\r\n  \r\n  *y = stbi__pnm_getinteger(s, &c); // read height\r\n  if (*y == 0)\r\n    return stbi__err(\"invalid width\", \"PPM image header had zero or overflowing width\");\r\n  stbi__pnm_skip_whitespace(s, &c);\r\n  \r\n  maxv = stbi__pnm_getinteger(s, &c);  // read max value\r\n  if (maxv > 65535)\r\n    return stbi__err(\"max value > 65535\", \"PPM image supports only 8-bit and 16-bit images\");\r\n  else if (maxv > 255)\r\n    return 16;\r\n  else\r\n    return 8;\r\n}\r\n\r\nstatic int stbi__pnm_is16(stbi__context *s)\r\n{\r\n  if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)\r\n    return 1;\r\n  return 0;\r\n}\r\n#endif\r\n\r\nstatic int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)\r\n{\r\n#ifndef STBI_NO_JPEG\r\n  if (stbi__jpeg_info(s, x, y, comp)) return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_PNG\r\n  if (stbi__png_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_GIF\r\n  if (stbi__gif_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_BMP\r\n  if (stbi__bmp_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_PSD\r\n  if (stbi__psd_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_PIC\r\n  if (stbi__pic_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_PNM\r\n  if (stbi__pnm_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_HDR\r\n  if (stbi__hdr_info(s, x, y, comp))  return 1;\r\n#endif\r\n  \r\n  // test tga last because it's a crappy test!\r\n#ifndef STBI_NO_TGA\r\n  if (stbi__tga_info(s, x, y, comp))\r\n    return 1;\r\n#endif\r\n  return stbi__err(\"unknown image type\", \"Image not of any known type, or corrupt\");\r\n}\r\n\r\nstatic int stbi__is_16_main(stbi__context *s)\r\n{\r\n#ifndef STBI_NO_PNG\r\n  if (stbi__png_is16(s))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_PSD\r\n  if (stbi__psd_is16(s))  return 1;\r\n#endif\r\n  \r\n#ifndef STBI_NO_PNM\r\n  if (stbi__pnm_is16(s))  return 1;\r\n#endif\r\n  return 0;\r\n}\r\n\r\n#ifndef STBI_NO_STDIO\r\nSTBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)\r\n{\r\n  FILE *f = stbi__fopen(filename, \"rb\");\r\n  int result;\r\n  if (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\r\n  result = stbi_info_from_file(f, x, y, comp);\r\n  fclose(f);\r\n  return result;\r\n}\r\n\r\nSTBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)\r\n{\r\n  int r;\r\n  stbi__context s;\r\n  long pos = ftell(f);\r\n  stbi__start_file(&s, f);\r\n  r = stbi__info_main(&s,x,y,comp);\r\n  fseek(f,pos,SEEK_SET);\r\n  return r;\r\n}\r\n\r\nSTBIDEF int stbi_is_16_bit(char const *filename)\r\n{\r\n  FILE *f = stbi__fopen(filename, \"rb\");\r\n  int result;\r\n  if (!f) return stbi__err(\"can't fopen\", \"Unable to open file\");\r\n  result = stbi_is_16_bit_from_file(f);\r\n  fclose(f);\r\n  return result;\r\n}\r\n\r\nSTBIDEF int stbi_is_16_bit_from_file(FILE *f)\r\n{\r\n  int r;\r\n  stbi__context s;\r\n  long pos = ftell(f);\r\n  stbi__start_file(&s, f);\r\n  r = stbi__is_16_main(&s);\r\n  fseek(f,pos,SEEK_SET);\r\n  return r;\r\n}\r\n#endif // !STBI_NO_STDIO\r\n\r\nSTBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  return stbi__info_main(&s,x,y,comp);\r\n}\r\n\r\nSTBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)\r\n{\r\n  stbi__context s;\r\n  stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);\r\n  return stbi__info_main(&s,x,y,comp);\r\n}\r\n\r\nSTBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)\r\n{\r\n  stbi__context s;\r\n  stbi__start_mem(&s,buffer,len);\r\n  return stbi__is_16_main(&s);\r\n}\r\n\r\nSTBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)\r\n{\r\n  stbi__context s;\r\n  stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);\r\n  return stbi__is_16_main(&s);\r\n}\r\n\r\n#endif // STB_IMAGE_IMPLEMENTATION\r\n\r\n/*\r\n   revision history:\r\n      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs\r\n      2.19  (2018-02-11) fix warning\r\n      2.18  (2018-01-30) fix warnings\r\n      2.17  (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug\r\n                         1-bit BMP\r\n                         *_is_16_bit api\r\n                         avoid warnings\r\n      2.16  (2017-07-23) all functions have 16-bit variants;\r\n                         STBI_NO_STDIO works again;\r\n                         compilation fixes;\r\n                         fix rounding in unpremultiply;\r\n                         optimize vertical flip;\r\n                         disable raw_len validation;\r\n                         documentation fixes\r\n      2.15  (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;\r\n                         warning fixes; disable run-time SSE detection on gcc;\r\n                         uniform handling of optional \"return\" values;\r\n                         thread-safe initialization of zlib tables\r\n      2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs\r\n      2.13  (2016-11-29) add 16-bit API, only supported for PNG right now\r\n      2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes\r\n      2.11  (2016-04-02) allocate large structures on the stack\r\n                         remove white matting for transparent PSD\r\n                         fix reported channel count for PNG & BMP\r\n                         re-enable SSE2 in non-gcc 64-bit\r\n                         support RGB-formatted JPEG\r\n                         read 16-bit PNGs (only as 8-bit)\r\n      2.10  (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED\r\n      2.09  (2016-01-16) allow comments in PNM files\r\n                         16-bit-per-pixel TGA (not bit-per-component)\r\n                         info() for TGA could break due to .hdr handling\r\n                         info() for BMP to shares code instead of sloppy parse\r\n                         can use STBI_REALLOC_SIZED if allocator doesn't support realloc\r\n                         code cleanup\r\n      2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA\r\n      2.07  (2015-09-13) fix compiler warnings\r\n                         partial animated GIF support\r\n                         limited 16-bpc PSD support\r\n                         #ifdef unused functions\r\n                         bug with < 92 byte PIC,PNM,HDR,TGA\r\n      2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value\r\n      2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning\r\n      2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit\r\n      2.03  (2015-04-12) extra corruption checking (mmozeiko)\r\n                         stbi_set_flip_vertically_on_load (nguillemot)\r\n                         fix NEON support; fix mingw support\r\n      2.02  (2015-01-19) fix incorrect assert, fix warning\r\n      2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2\r\n      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG\r\n      2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)\r\n                         progressive JPEG (stb)\r\n                         PGM/PPM support (Ken Miller)\r\n                         STBI_MALLOC,STBI_REALLOC,STBI_FREE\r\n                         GIF bugfix -- seemingly never worked\r\n                         STBI_NO_*, STBI_ONLY_*\r\n      1.48  (2014-12-14) fix incorrectly-named assert()\r\n      1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)\r\n                         optimize PNG (ryg)\r\n                         fix bug in interlaced PNG with user-specified channel count (stb)\r\n      1.46  (2014-08-26)\r\n              fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG\r\n      1.45  (2014-08-16)\r\n              fix MSVC-ARM internal compiler error by wrapping malloc\r\n      1.44  (2014-08-07)\r\n              various warning fixes from Ronny Chevalier\r\n      1.43  (2014-07-15)\r\n              fix MSVC-only compiler problem in code changed in 1.42\r\n      1.42  (2014-07-09)\r\n              don't define _CRT_SECURE_NO_WARNINGS (affects user code)\r\n              fixes to stbi__cleanup_jpeg path\r\n              added STBI_ASSERT to avoid requiring assert.h\r\n      1.41  (2014-06-25)\r\n              fix search&replace from 1.36 that messed up comments/error messages\r\n      1.40  (2014-06-22)\r\n              fix gcc struct-initialization warning\r\n      1.39  (2014-06-15)\r\n              fix to TGA optimization when req_comp != number of components in TGA;\r\n              fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)\r\n              add support for BMP version 5 (more ignored fields)\r\n      1.38  (2014-06-06)\r\n              suppress MSVC warnings on integer casts truncating values\r\n              fix accidental rename of 'skip' field of I/O\r\n      1.37  (2014-06-04)\r\n              remove duplicate typedef\r\n      1.36  (2014-06-03)\r\n              convert to header file single-file library\r\n              if de-iphone isn't set, load iphone images color-swapped instead of returning NULL\r\n      1.35  (2014-05-27)\r\n              various warnings\r\n              fix broken STBI_SIMD path\r\n              fix bug where stbi_load_from_file no longer left file pointer in correct place\r\n              fix broken non-easy path for 32-bit BMP (possibly never used)\r\n              TGA optimization by Arseny Kapoulkine\r\n      1.34  (unknown)\r\n              use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case\r\n      1.33  (2011-07-14)\r\n              make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements\r\n      1.32  (2011-07-13)\r\n              support for \"info\" function for all supported filetypes (SpartanJ)\r\n      1.31  (2011-06-20)\r\n              a few more leak fixes, bug in PNG handling (SpartanJ)\r\n      1.30  (2011-06-11)\r\n              added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)\r\n              removed deprecated format-specific test/load functions\r\n              removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway\r\n              error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)\r\n              fix inefficiency in decoding 32-bit BMP (David Woo)\r\n      1.29  (2010-08-16)\r\n              various warning fixes from Aurelien Pocheville\r\n      1.28  (2010-08-01)\r\n              fix bug in GIF palette transparency (SpartanJ)\r\n      1.27  (2010-08-01)\r\n              cast-to-stbi_uc to fix warnings\r\n      1.26  (2010-07-24)\r\n              fix bug in file buffering for PNG reported by SpartanJ\r\n      1.25  (2010-07-17)\r\n              refix trans_data warning (Won Chun)\r\n      1.24  (2010-07-12)\r\n              perf improvements reading from files on platforms with lock-heavy fgetc()\r\n              minor perf improvements for jpeg\r\n              deprecated type-specific functions so we'll get feedback if they're needed\r\n              attempt to fix trans_data warning (Won Chun)\r\n      1.23    fixed bug in iPhone support\r\n      1.22  (2010-07-10)\r\n              removed image *writing* support\r\n              stbi_info support from Jetro Lauha\r\n              GIF support from Jean-Marc Lienher\r\n              iPhone PNG-extensions from James Brown\r\n              warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)\r\n      1.21    fix use of 'stbi_uc' in header (reported by jon blow)\r\n      1.20    added support for Softimage PIC, by Tom Seddon\r\n      1.19    bug in interlaced PNG corruption check (found by ryg)\r\n      1.18  (2008-08-02)\r\n              fix a threading bug (local mutable static)\r\n      1.17    support interlaced PNG\r\n      1.16    major bugfix - stbi__convert_format converted one too many pixels\r\n      1.15    initialize some fields for thread safety\r\n      1.14    fix threadsafe conversion bug\r\n              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)\r\n      1.13    threadsafe\r\n      1.12    const qualifiers in the API\r\n      1.11    Support installable IDCT, colorspace conversion routines\r\n      1.10    Fixes for 64-bit (don't use \"unsigned long\")\r\n              optimized upsampling by Fabian \"ryg\" Giesen\r\n      1.09    Fix format-conversion for PSD code (bad global variables!)\r\n      1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz\r\n      1.07    attempt to fix C++ warning/errors again\r\n      1.06    attempt to fix C++ warning/errors again\r\n      1.05    fix TGA loading to return correct *comp and use good luminance calc\r\n      1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free\r\n      1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR\r\n      1.02    support for (subset of) HDR files, float interface for preferred access to them\r\n      1.01    fix bug: possible bug in handling right-side up bmps... not sure\r\n              fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all\r\n      1.00    interface to zlib that skips zlib header\r\n      0.99    correct handling of alpha in palette\r\n      0.98    TGA loader by lonesock; dynamically add loaders (untested)\r\n      0.97    jpeg errors on too large a file; also catch another malloc failure\r\n      0.96    fix detection of invalid v value - particleman@mollyrocket forum\r\n      0.95    during header scan, seek to markers in case of padding\r\n      0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same\r\n      0.93    handle jpegtran output; verbose errors\r\n      0.92    read 4,8,16,24,32-bit BMP files of several formats\r\n      0.91    output 24-bit Windows 3.0 BMP files\r\n      0.90    fix a few more warnings; bump version number to approach 1.0\r\n      0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd\r\n      0.60    fix compiling as c++\r\n      0.59    fix warnings: merge Dave Moore's -Wall fixes\r\n      0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian\r\n      0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available\r\n      0.56    fix bug: zlib uncompressed mode len vs. nlen\r\n      0.55    fix bug: restart_interval not initialized to 0\r\n      0.54    allow NULL for 'int *comp'\r\n      0.53    fix bug in png 3->4; speedup png decoding\r\n      0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments\r\n      0.51    obey req_comp requests, 1-component jpegs return as 1-component,\r\n              on 'test' only check type, not whether we support this variant\r\n      0.50  (2006-11-19)\r\n              first released version\r\n*/\r\n\r\n\r\n/*\r\n------------------------------------------------------------------------------\r\nThis software is available under 2 licenses -- choose whichever you prefer.\r\n------------------------------------------------------------------------------\r\nALTERNATIVE A - MIT License\r\nCopyright (c) 2017 Sean Barrett\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\nof the Software, and to permit persons to whom the Software is furnished to do\r\nso, subject to the following conditions:\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n------------------------------------------------------------------------------\r\nALTERNATIVE B - Public Domain (www.unlicense.org)\r\nThis is free and unencumbered software released into the public domain.\r\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\r\nsoftware, either in source code form or as a compiled binary, for any purpose,\r\ncommercial or non-commercial, and by any means.\r\nIn jurisdictions that recognize copyright laws, the author or authors of this\r\nsoftware dedicate any and all copyright interest in the software to the public\r\ndomain. We make this dedication for the benefit of the public at large and to\r\nthe detriment of our heirs and successors. We intend this dedication to be an\r\novert act of relinquishment in perpetuity of all present and future rights to\r\nthis software under copyright law.\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n------------------------------------------------------------------------------\r\n*/\r\n"
  },
  {
    "path": "src/third_party/stb/stb_sprintf.h",
    "content": "// ----------------------------------------------------------------------------\r\n//\r\n// NOTE(rjf): This has been modified to support extra format specifiers\r\n// for the debugger project - this is *not* an unmodified copy of the original\r\n// stb_sprintf v1.10 code.\r\n//\r\n// ----------------------------------------------------------------------------\r\n\r\n// stb_sprintf - v1.10 - public domain snprintf() implementation\r\n// originally by Jeff Roberts / RAD Game Tools, 2015/10/20\r\n// http://github.com/nothings/stb\r\n//\r\n// allowed types:  sc uidBboXx p AaGgEef n\r\n// lengths      :  hh h ll j z t I64 I32 I\r\n//\r\n// Contributors:\r\n//    Fabian \"ryg\" Giesen (reformatting)\r\n//    github:aganm (attribute format)\r\n//\r\n// Contributors (bugfixes):\r\n//    github:d26435\r\n//    github:trex78\r\n//    github:account-login\r\n//    Jari Komppa (SI suffixes)\r\n//    Rohit Nirmal\r\n//    Marcin Wojdyr\r\n//    Leonard Ritter\r\n//    Stefano Zanotti\r\n//    Adam Allison\r\n//    Arvid Gerstmann\r\n//    Markus Kolb\r\n//\r\n// LICENSE:\r\n//\r\n//   See end of file for license information.\r\n\r\n#ifndef STB_SPRINTF_H_INCLUDE\r\n#define STB_SPRINTF_H_INCLUDE\r\n\r\n/*\r\nSingle file sprintf replacement.\r\n\r\nOriginally written by Jeff Roberts at RAD Game Tools - 2015/10/20.\r\nHereby placed in public domain.\r\n\r\nThis is a full sprintf replacement that supports everything that\r\nthe C runtime sprintfs support, including float/double, 64-bit integers,\r\nhex floats, field parameters (%*.*d stuff), length reads backs, etc.\r\n\r\nWhy would you need this if sprintf already exists?  Well, first off,\r\nit's *much* faster (see below). It's also much smaller than the CRT\r\nversions code-space-wise. We've also added some simple improvements\r\nthat are super handy (commas in thousands, callbacks at buffer full,\r\nfor example). Finally, the format strings for MSVC and GCC differ\r\nfor 64-bit integers (among other small things), so this lets you use\r\nthe same format strings in cross platform code.\r\n\r\nIt uses the standard single file trick of being both the header file\r\nand the source itself. If you just include it normally, you just get\r\nthe header file function definitions. To get the code, you include\r\nit from a C or C++ file and define STB_SPRINTF_IMPLEMENTATION first.\r\n\r\nIt only uses va_args macros from the C runtime to do it's work. It\r\ndoes cast doubles to S64s and shifts and divides U64s, which does\r\ndrag in CRT code on most platforms.\r\n\r\nIt compiles to roughly 8K with float support, and 4K without.\r\nAs a comparison, when using MSVC static libs, calling sprintf drags\r\nin 16K.\r\n\r\nAPI:\r\n====\r\nint stbsp_sprintf( char * buf, char const * fmt, ... )\r\nint stbsp_snprintf( char * buf, int count, char const * fmt, ... )\r\n  Convert an arg list into a buffer.  stbsp_snprintf always returns\r\n  a zero-terminated string (unlike regular snprintf).\r\n\r\nint stbsp_vsprintf( char * buf, char const * fmt, va_list va )\r\nint stbsp_vsnprintf( char * buf, int count, char const * fmt, va_list va )\r\n  Convert a va_list arg list into a buffer.  stbsp_vsnprintf always returns\r\n  a zero-terminated string (unlike regular snprintf).\r\n\r\nint stbsp_vsprintfcb( STBSP_SPRINTFCB * callback, void * user, char * buf, char const * fmt, va_list va )\r\n    typedef char * STBSP_SPRINTFCB( char const * buf, void * user, int len );\r\n  Convert into a buffer, calling back every STB_SPRINTF_MIN chars.\r\n  Your callback can then copy the chars out, print them or whatever.\r\n  This function is actually the workhorse for everything else.\r\n  The buffer you pass in must hold at least STB_SPRINTF_MIN characters.\r\n    // you return the next buffer to use or 0 to stop converting\r\n\r\nvoid stbsp_set_separators( char comma, char period )\r\n  Set the comma and period characters to use.\r\n\r\nFLOATS/DOUBLES:\r\n===============\r\nThis code uses a internal float->ascii conversion method that uses\r\ndoubles with error correction (double-doubles, for ~105 bits of\r\nprecision).  This conversion is round-trip perfect - that is, an atof\r\nof the values output here will give you the bit-exact double back.\r\n\r\nOne difference is that our insignificant digits will be different than\r\nwith MSVC or GCC (but they don't match each other either).  We also\r\ndon't attempt to find the minimum length matching float (pre-MSVC15\r\ndoesn't either).\r\n\r\nIf you don't need float or doubles at all, define STB_SPRINTF_NOFLOAT\r\nand you'll save 4K of code space.\r\n\r\n64-BIT INTS:\r\n============\r\nThis library also supports 64-bit integers and you can use MSVC style or\r\nGCC style indicators (%I64d or %lld).  It supports the C99 specifiers\r\nfor size_t and ptr_diff_t (%jd %zd) as well.\r\n\r\nEXTRAS:\r\n=======\r\nLike some GCCs, for integers and floats, you can use a ' (single quote)\r\nspecifier and commas will be inserted on the thousands: \"%'d\" on 12345\r\nwould print 12,345.\r\n\r\nFor integers and floats, you can use a \"$\" specifier and the number\r\nwill be converted to float and then divided to get kilo, mega, giga or\r\ntera and then printed, so \"%$d\" 1000 is \"1.0 k\", \"%$.2d\" 2536000 is\r\n\"2.53 M\", etc. For byte values, use two $:s, like \"%$$d\" to turn\r\n2536000 to \"2.42 Mi\". If you prefer JEDEC suffixes to SI ones, use three\r\n$:s: \"%$$$d\" -> \"2.42 M\". To remove the space between the number and the\r\nsuffix, add \"_\" specifier: \"%_$d\" -> \"2.53M\".\r\n\r\nIn addition to octal and hexadecimal conversions, you can print\r\nintegers in binary: \"%b\" for 256 would print 100.\r\n\r\nPERFORMANCE vs MSVC 2008 32-/64-bit (GCC is even slower than MSVC):\r\n===================================================================\r\n\"%d\" across all 32-bit ints (4.8x/4.0x faster than 32-/64-bit MSVC)\r\n\"%24d\" across all 32-bit ints (4.5x/4.2x faster)\r\n\"%x\" across all 32-bit ints (4.5x/3.8x faster)\r\n\"%08x\" across all 32-bit ints (4.3x/3.8x faster)\r\n\"%f\" across e-10 to e+10 floats (7.3x/6.0x faster)\r\n\"%e\" across e-10 to e+10 floats (8.1x/6.0x faster)\r\n\"%g\" across e-10 to e+10 floats (10.0x/7.1x faster)\r\n\"%f\" for values near e-300 (7.9x/6.5x faster)\r\n\"%f\" for values near e+300 (10.0x/9.1x faster)\r\n\"%e\" for values near e-300 (10.1x/7.0x faster)\r\n\"%e\" for values near e+300 (9.2x/6.0x faster)\r\n\"%.320f\" for values near e-300 (12.6x/11.2x faster)\r\n\"%a\" for random values (8.6x/4.3x faster)\r\n\"%I64d\" for 64-bits with 32-bit values (4.8x/3.4x faster)\r\n\"%I64d\" for 64-bits > 32-bit values (4.9x/5.5x faster)\r\n\"%s%s%s\" for 64 char strings (7.1x/7.3x faster)\r\n\"...512 char string...\" ( 35.0x/32.5x faster!)\r\n*/\r\n\r\n#if defined(__clang__)\r\n#  if defined(__has_feature) && defined(__has_attribute)\r\n#    if __has_feature(address_sanitizer)\r\n#      if __has_attribute(__no_sanitize__)\r\n#        define STBSP__ASAN __attribute__((__no_sanitize__(\"address\")))\r\n#      elif __has_attribute(__no_sanitize_address__)\r\n#        define STBSP__ASAN __attribute__((__no_sanitize_address__))\r\n#      elif __has_attribute(__no_address_safety_analysis__)\r\n#        define STBSP__ASAN __attribute__((__no_address_safety_analysis__))\r\n#      endif\r\n#    endif\r\n#  endif\r\n#elif defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8))\r\n#  if defined(__SANITIZE_ADDRESS__) && __SANITIZE_ADDRESS__\r\n#    define STBSP__ASAN __attribute__((__no_sanitize_address__))\r\n#  endif\r\n#elif defined(_MSC_VER)\r\n# if defined(__SANITIZE_ADDRESS__)\r\n#   define STBSP__ASAN __declspec(no_sanitize_address)\r\n# endif\r\n#endif\r\n\r\n#ifndef STBSP__ASAN\r\n#define STBSP__ASAN\r\n#endif\r\n\r\n#ifdef STB_SPRINTF_STATIC\r\n#define STBSP__PUBLICDEC static STBSP__ASAN\r\n#define STBSP__PUBLICDEF static STBSP__ASAN\r\n#else\r\n#ifdef __cplusplus\r\n#define STBSP__PUBLICDEC extern \"C\" STBSP__ASAN\r\n#define STBSP__PUBLICDEF extern \"C\" STBSP__ASAN\r\n#else\r\n#define STBSP__PUBLICDEC extern STBSP__ASAN\r\n#define STBSP__PUBLICDEF STBSP__ASAN\r\n#endif\r\n#endif\r\n\r\n#if defined(__has_attribute)\r\n#if __has_attribute(format)\r\n#define STBSP__ATTRIBUTE_FORMAT(fmt,va) __attribute__((format(printf,fmt,va)))\r\n#endif\r\n#endif\r\n\r\n#ifndef STBSP__ATTRIBUTE_FORMAT\r\n#define STBSP__ATTRIBUTE_FORMAT(fmt,va)\r\n#endif\r\n\r\n#ifdef _MSC_VER\r\n#define STBSP__NOTUSED(v)  (void)(v)\r\n#else\r\n#define STBSP__NOTUSED(v)  (void)sizeof(v)\r\n#endif\r\n\r\n#include <stdarg.h> // for va_arg(), va_list()\r\n#include <stddef.h> // size_t, ptrdiff_t\r\n\r\n#ifndef STB_SPRINTF_MIN\r\n#define STB_SPRINTF_MIN 512 // how many characters per callback\r\n#endif\r\ntypedef char *STBSP_SPRINTFCB(const char *buf, void *user, int len);\r\n\r\n#ifndef STB_SPRINTF_DECORATE\r\n#define STB_SPRINTF_DECORATE(name) stbsp_##name // define this before including if you want to change the names\r\n#endif\r\n\r\nSTBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va);\r\nSTBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsnprintf)(char *buf, int count, char const *fmt, va_list va);\r\nSTBSP__PUBLICDEC int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(2,3);\r\nSTBSP__PUBLICDEC int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...) STBSP__ATTRIBUTE_FORMAT(3,4);\r\n\r\nSTBSP__PUBLICDEC int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va);\r\nSTBSP__PUBLICDEC void STB_SPRINTF_DECORATE(set_separators)(char comma, char period);\r\n\r\n#endif // STB_SPRINTF_H_INCLUDE\r\n\r\n#ifdef STB_SPRINTF_IMPLEMENTATION\r\n\r\n#define stbsp__uint32 unsigned int\r\n#define stbsp__int32 signed int\r\n\r\n#ifdef _MSC_VER\r\n#define stbsp__uint64 unsigned __int64\r\n#define stbsp__int64 signed __int64\r\n#else\r\n#define stbsp__uint64 unsigned long long\r\n#define stbsp__int64 signed long long\r\n#endif\r\n#define stbsp__uint16 unsigned short\r\n\r\n#ifndef stbsp__uintptr\r\n#if defined(__ppc64__) || defined(__powerpc64__) || defined(__aarch64__) || defined(_M_X64) || defined(__x86_64__) || defined(__x86_64) || defined(__s390x__)\r\n#define stbsp__uintptr stbsp__uint64\r\n#else\r\n#define stbsp__uintptr stbsp__uint32\r\n#endif\r\n#endif\r\n\r\n#ifndef STB_SPRINTF_MSVC_MODE // used for MSVC2013 and earlier (MSVC2015 matches GCC)\r\n#if defined(_MSC_VER) && (_MSC_VER < 1900)\r\n#define STB_SPRINTF_MSVC_MODE\r\n#endif\r\n#endif\r\n\r\n#ifdef STB_SPRINTF_NOUNALIGNED // define this before inclusion to force stbsp_sprintf to always use aligned accesses\r\n#define STBSP__UNALIGNED(code)\r\n#else\r\n#define STBSP__UNALIGNED(code) code\r\n#endif\r\n\r\n#ifndef STB_SPRINTF_NOFLOAT\r\n// internal float utility functions\r\nstatic stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits);\r\nstatic stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value);\r\n#define STBSP__SPECIAL 0x7000\r\n#endif\r\n\r\nstatic char stbsp__period = '.';\r\nstatic char stbsp__comma = ',';\r\nstatic struct\r\n{\r\n  short temp; // force next field to be 2-byte aligned\r\n  char pair[201];\r\n} stbsp__digitpair =\r\n{\r\n  0,\r\n  \"00010203040506070809101112131415161718192021222324\"\r\n    \"25262728293031323334353637383940414243444546474849\"\r\n    \"50515253545556575859606162636465666768697071727374\"\r\n    \"75767778798081828384858687888990919293949596979899\"\r\n};\r\n\r\nSTBSP__PUBLICDEF void STB_SPRINTF_DECORATE(set_separators)(char pcomma, char pperiod)\r\n{\r\n  stbsp__period = pperiod;\r\n  stbsp__comma = pcomma;\r\n}\r\n\r\n#define STBSP__LEFTJUST 1\r\n#define STBSP__LEADINGPLUS 2\r\n#define STBSP__LEADINGSPACE 4\r\n#define STBSP__LEADING_0X 8\r\n#define STBSP__LEADINGZERO 16\r\n#define STBSP__INTMAX 32\r\n#define STBSP__TRIPLET_COMMA 64\r\n#define STBSP__NEGATIVE 128\r\n#define STBSP__METRIC_SUFFIX 256\r\n#define STBSP__HALFWIDTH 512\r\n#define STBSP__METRIC_NOSPACE 1024\r\n#define STBSP__METRIC_1024 2048\r\n#define STBSP__METRIC_JEDEC 4096\r\n\r\nstatic void stbsp__lead_sign(stbsp__uint32 fl, char *sign)\r\n{\r\n  sign[0] = 0;\r\n  if (fl & STBSP__NEGATIVE) {\r\n    sign[0] = 1;\r\n    sign[1] = '-';\r\n  } else if (fl & STBSP__LEADINGSPACE) {\r\n    sign[0] = 1;\r\n    sign[1] = ' ';\r\n  } else if (fl & STBSP__LEADINGPLUS) {\r\n    sign[0] = 1;\r\n    sign[1] = '+';\r\n  }\r\n}\r\n\r\nstatic STBSP__ASAN stbsp__uint32 stbsp__strlen_limited(char const *s, stbsp__uint32 limit)\r\n{\r\n  char const * sn = s;\r\n  \r\n  // get up to 4-byte alignment\r\n  for (;;) {\r\n    if (((stbsp__uintptr)sn & 3) == 0)\r\n      break;\r\n    \r\n    if (!limit || *sn == 0)\r\n      return (stbsp__uint32)(sn - s);\r\n    \r\n    ++sn;\r\n    --limit;\r\n  }\r\n  \r\n  // scan over 4 bytes at a time to find terminating 0\r\n  // this will intentionally scan up to 3 bytes past the end of buffers,\r\n  // but becase it works 4B aligned, it will never cross page boundaries\r\n  // (hence the STBSP__ASAN markup; the over-read here is intentional\r\n  // and harmless)\r\n  while (limit >= 4) {\r\n    stbsp__uint32 v = *(stbsp__uint32 *)sn;\r\n    // bit hack to find if there's a 0 byte in there\r\n    if ((v - 0x01010101) & (~v) & 0x80808080UL)\r\n      break;\r\n    \r\n    sn += 4;\r\n    limit -= 4;\r\n  }\r\n  \r\n  // handle the last few characters to find actual size\r\n  while (limit && *sn) {\r\n    ++sn;\r\n    --limit;\r\n  }\r\n  \r\n  return (stbsp__uint32)(sn - s);\r\n}\r\n\r\nSTBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintfcb)(STBSP_SPRINTFCB *callback, void *user, char *buf, char const *fmt, va_list va)\r\n{\r\n  static char hex[] = \"0123456789abcdefxp\";\r\n  static char hexu[] = \"0123456789ABCDEFXP\";\r\n  char *bf;\r\n  char const *f;\r\n  int tlen = 0;\r\n  \r\n  bf = buf;\r\n  f = fmt;\r\n  for (;;) {\r\n    stbsp__int32 fw, pr, tz;\r\n    stbsp__uint32 fl;\r\n    \r\n    // macros for the callback buffer stuff\r\n#define stbsp__chk_cb_bufL(bytes)                        \\\r\n{                                                     \\\r\nint len = (int)(bf - buf);                         \\\r\nif ((len + (bytes)) >= STB_SPRINTF_MIN) {          \\\r\ntlen += len;                                    \\\r\nif (0 == (bf = buf = callback(buf, user, len))) \\\r\ngoto done;                                   \\\r\n}                                                  \\\r\n}\r\n#define stbsp__chk_cb_buf(bytes)    \\\r\n{                                \\\r\nif (callback) {               \\\r\nstbsp__chk_cb_bufL(bytes); \\\r\n}                             \\\r\n}\r\n#define stbsp__flush_cb()                      \\\r\n{                                           \\\r\nstbsp__chk_cb_bufL(STB_SPRINTF_MIN - 1); \\\r\n} // flush if there is even one byte in the buffer\r\n#define stbsp__cb_buf_clamp(cl, v)                \\\r\ncl = v;                                        \\\r\nif (callback) {                                \\\r\nint lg = STB_SPRINTF_MIN - (int)(bf - buf); \\\r\nif (cl > lg)                                \\\r\ncl = lg;                                 \\\r\n}\r\n    \r\n    // fast copy everything up to the next % (or end of string)\r\n    for (;;) {\r\n      while (((stbsp__uintptr)f) & 3) {\r\n        schk1:\r\n        if (f[0] == '%')\r\n          goto scandd;\r\n        schk2:\r\n        if (f[0] == 0)\r\n          goto endfmt;\r\n        stbsp__chk_cb_buf(1);\r\n        *bf++ = f[0];\r\n        ++f;\r\n      }\r\n      for (;;) {\r\n        // Check if the next 4 bytes contain %(0x25) or end of string.\r\n        // Using the 'hasless' trick:\r\n        // https://graphics.stanford.edu/~seander/bithacks.html#HasLessInWord\r\n        stbsp__uint32 v, c;\r\n        v = *(stbsp__uint32 *)f;\r\n        c = (~v) & 0x80808080;\r\n        if (((v ^ 0x25252525) - 0x01010101) & c)\r\n          goto schk1;\r\n        if ((v - 0x01010101) & c)\r\n          goto schk2;\r\n        if (callback)\r\n          if ((STB_SPRINTF_MIN - (int)(bf - buf)) < 4)\r\n          goto schk1;\r\n#ifdef STB_SPRINTF_NOUNALIGNED\r\n        if(((stbsp__uintptr)bf) & 3) {\r\n          bf[0] = f[0];\r\n          bf[1] = f[1];\r\n          bf[2] = f[2];\r\n          bf[3] = f[3];\r\n        } else\r\n#endif\r\n        {\r\n          *(stbsp__uint32 *)bf = v;\r\n        }\r\n        bf += 4;\r\n        f += 4;\r\n      }\r\n    }\r\n    scandd:\r\n    \r\n    ++f;\r\n    \r\n    // ok, we have a percent, read the modifiers first\r\n    fw = 0;\r\n    pr = -1;\r\n    fl = 0;\r\n    tz = 0;\r\n    \r\n    // flags\r\n    for (;;) {\r\n      switch (f[0]) {\r\n        // if we have left justify\r\n        case '-':\r\n        fl |= STBSP__LEFTJUST;\r\n        ++f;\r\n        continue;\r\n        // if we have leading plus\r\n        case '+':\r\n        fl |= STBSP__LEADINGPLUS;\r\n        ++f;\r\n        continue;\r\n        // if we have leading space\r\n        case ' ':\r\n        fl |= STBSP__LEADINGSPACE;\r\n        ++f;\r\n        continue;\r\n        // if we have leading 0x\r\n        case '#':\r\n        fl |= STBSP__LEADING_0X;\r\n        ++f;\r\n        continue;\r\n        // if we have thousand commas\r\n        case '\\'':\r\n        fl |= STBSP__TRIPLET_COMMA;\r\n        ++f;\r\n        continue;\r\n        // if we have kilo marker (none->kilo->kibi->jedec)\r\n        case '$':\r\n        if (fl & STBSP__METRIC_SUFFIX) {\r\n          if (fl & STBSP__METRIC_1024) {\r\n            fl |= STBSP__METRIC_JEDEC;\r\n          } else {\r\n            fl |= STBSP__METRIC_1024;\r\n          }\r\n        } else {\r\n          fl |= STBSP__METRIC_SUFFIX;\r\n        }\r\n        ++f;\r\n        continue;\r\n        // if we don't want space between metric suffix and number\r\n        case '_':\r\n        fl |= STBSP__METRIC_NOSPACE;\r\n        ++f;\r\n        continue;\r\n        // if we have leading zero\r\n        case '0':\r\n        fl |= STBSP__LEADINGZERO;\r\n        ++f;\r\n        goto flags_done;\r\n        default: goto flags_done;\r\n      }\r\n    }\r\n    flags_done:\r\n    \r\n    // get the field width\r\n    if (f[0] == '*') {\r\n      fw = va_arg(va, stbsp__uint32);\r\n      ++f;\r\n    } else {\r\n      while ((f[0] >= '0') && (f[0] <= '9')) {\r\n        fw = fw * 10 + f[0] - '0';\r\n        f++;\r\n      }\r\n    }\r\n    // get the precision\r\n    if (f[0] == '.') {\r\n      ++f;\r\n      if (f[0] == '*') {\r\n        pr = va_arg(va, stbsp__uint32);\r\n        ++f;\r\n      } else {\r\n        pr = 0;\r\n        while ((f[0] >= '0') && (f[0] <= '9')) {\r\n          pr = pr * 10 + f[0] - '0';\r\n          f++;\r\n        }\r\n      }\r\n    }\r\n    \r\n    // handle integer size overrides\r\n    switch (f[0]) {\r\n      // are we halfwidth?\r\n      case 'h':\r\n      fl |= STBSP__HALFWIDTH;\r\n      ++f;\r\n      if (f[0] == 'h')\r\n        ++f;  // QUARTERWIDTH\r\n      break;\r\n      // are we 64-bit (unix style)\r\n      case 'l':\r\n      fl |= ((sizeof(long) == 8) ? STBSP__INTMAX : 0);\r\n      ++f;\r\n      if (f[0] == 'l') {\r\n        fl |= STBSP__INTMAX;\r\n        ++f;\r\n      }\r\n      break;\r\n      // are we 64-bit on intmax? (c99)\r\n      case 'j':\r\n      fl |= (sizeof(size_t) == 8) ? STBSP__INTMAX : 0;\r\n      ++f;\r\n      break;\r\n      // are we 64-bit on size_t or ptrdiff_t? (c99)\r\n      case 'z':\r\n      fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0;\r\n      ++f;\r\n      break;\r\n      case 't':\r\n      fl |= (sizeof(ptrdiff_t) == 8) ? STBSP__INTMAX : 0;\r\n      ++f;\r\n      break;\r\n      // are we 64-bit (msft style)\r\n      case 'I':\r\n      if ((f[1] == '6') && (f[2] == '4')) {\r\n        fl |= STBSP__INTMAX;\r\n        f += 3;\r\n      } else if ((f[1] == '3') && (f[2] == '2')) {\r\n        f += 3;\r\n      } else {\r\n        fl |= ((sizeof(void *) == 8) ? STBSP__INTMAX : 0);\r\n        ++f;\r\n      }\r\n      break;\r\n      default: break;\r\n    }\r\n    \r\n    // handle each replacement\r\n    switch (f[0]) {\r\n#define STBSP__NUMSZ 512 // big enough for e308 (with commas) or e-307\r\n      char num[STBSP__NUMSZ];\r\n      char lead[8];\r\n      char tail[8];\r\n      char *s;\r\n      char const *h;\r\n      stbsp__uint32 l, n, cs;\r\n      stbsp__uint64 n64;\r\n#ifndef STB_SPRINTF_NOFLOAT\r\n      double fv;\r\n#endif\r\n      stbsp__int32 dp;\r\n      char const *sn;\r\n      \r\n      case 's':\r\n      // get the string\r\n      s = va_arg(va, char *);\r\n      if (s == 0)\r\n        s = (char *)\"null\";\r\n      // get the length, limited to desired precision\r\n      // always limit to ~0u chars since our counts are 32b\r\n      l = stbsp__strlen_limited(s, (pr >= 0) ? pr : ~0u);\r\n      lead[0] = 0;\r\n      tail[0] = 0;\r\n      pr = 0;\r\n      dp = 0;\r\n      cs = 0;\r\n      // copy the string in\r\n      goto scopy;\r\n      \r\n      //-\r\n      //-\r\n      //-\r\n      // NOTE(rjf): DEBUGGER PROJECT ADDITION vvv\r\n      //\r\n      // The following additions are for using the debugger project's base layer\r\n      // types in format strings.\r\n      //\r\n      case 'S':\r\n      {\r\n        String8 string = va_arg(va, String8);\r\n        s = (char *)string.str;\r\n        l = (U32)string.size;\r\n        lead[0] = 0;\r\n        tail[0] = 0;\r\n        pr = 0;\r\n        dp = 0;\r\n        cs = 0;\r\n      }goto scopy;\r\n\r\n      case 'm':\r\n      case 'M':\r\n      {\r\n        static const U64 one_kib = 1ull * 1024;\r\n        static const U64 one_mib = 1ull * 1024 * 1024;\r\n        static const U64 one_gib = 1ull * 1024 * 1024 * 1024;\r\n        static const U64 one_tib = 1ull * 1024 * 1024 * 1024 * 1024;\r\n\r\n        U64 size;\r\n        if(f[0] == 'M')\r\n        {\r\n          size = va_arg(va, U64);\r\n        }\r\n        else\r\n        {\r\n          size = va_arg(va, U32);\r\n        }\r\n\r\n        U64 lo = 0;\r\n        U64 hi = 0;\r\n        char *units = \"\";\r\n\r\n        if(size < one_kib)\r\n        {\r\n          hi = size;\r\n          units = \"Bytes\";\r\n        }\r\n        else if(size < one_mib)\r\n        {\r\n          hi = size / one_kib;\r\n          lo = ((size * 100) / one_kib) % 100;\r\n          units = \"KiB\";\r\n        }\r\n        else if(size < one_gib)\r\n        {\r\n          hi = size / one_mib;\r\n          lo = ((size * 100) / one_mib) % 100;\r\n          units = \"MiB\";\r\n        }\r\n        else if(size < one_tib)\r\n        {\r\n          hi = size / one_gib;\r\n          lo = ((size * 100) / one_gib) % 100;\r\n          units = \"GiB\";\r\n        }\r\n        else \r\n        {\r\n          Assert(size <= max_U64/100ull);\r\n          hi = size / one_tib;\r\n          lo = ((size * 100) / one_tib) % 100;\r\n          units = \"TiB\";\r\n        }\r\n\r\n        // format high part\r\n        if(hi > 0)\r\n        {\r\n          s = num;\r\n          for(U64 n = hi; n > 0; n /= 10ull)\r\n          {\r\n            *s = (char)(n % 10ull) + '0';\r\n            ++s;\r\n          }\r\n          for(S64 i = (S64)(s-num)-1; i >= 0; --i)\r\n          {\r\n            *bf = num[i];\r\n            ++bf;\r\n          }\r\n        }\r\n        else\r\n        {\r\n          *bf = '0';\r\n          ++bf;\r\n        }\r\n\r\n        // format low part\r\n        if(lo > 0)\r\n        {\r\n          *bf = '.';\r\n          ++bf;\r\n\r\n          s = num;\r\n          for(U64 n = lo; n > 0; n /= 10ull)\r\n          {\r\n            *s = (char)(n % 10ull) + '0';\r\n            ++s;\r\n          }\r\n\r\n          U64 lead_zero_count = 3 - (U64)(s-num);\r\n          for(U64 i = 1; i < lead_zero_count; ++i)\r\n          {\r\n            *bf = '0';\r\n            ++bf;\r\n          }\r\n\r\n          for(S64 i = (S64)(s-num)-1; i >= 0; --i)\r\n          {\r\n            *bf = num[i];\r\n            ++bf;\r\n          }\r\n        }\r\n\r\n        *bf = ' ';\r\n        ++bf;\r\n\r\n        // copy units\r\n        for(U64 i = 0; units[i] != 0; ++i)\r\n        {\r\n          *bf = units[i];\r\n          ++bf;\r\n        }\r\n      }break;\r\n\r\n      case 'r':\r\n      {\r\n        Rng1U64 range = va_arg(va, Rng1U64);\r\n        *bf = '['; ++bf;\r\n\r\n        U8 buffer[ARENA_HEADER_SIZE + 128];\r\n        Arena *arena = arena_alloc_(&(ArenaParams){ .flags = ArenaFlag_NoChain, .reserve_size = sizeof(buffer), .commit_size = sizeof(buffer), .optional_backing_buffer = buffer });\r\n\r\n        String8 min = str8_from_u64(arena, range.min, 16, 0, 0);\r\n        MemoryCopy(bf, min.str, min.size);\r\n        bf += min.size;\r\n\r\n        *bf = ','; ++bf;\r\n        *bf = ' '; ++bf;\r\n\r\n        arena_clear(arena);\r\n        String8 max = str8_from_u64(arena, range.max, 16, 0, 0);\r\n        MemoryCopy(bf, max.str, max.size);\r\n        bf += max.size;\r\n\r\n        *bf = ')'; ++bf;\r\n      }break;\r\n\r\n      //\r\n      // NOTE(rjf): DEBUGGER PROJECT ADDITION ^^^\r\n      //-\r\n      //-\r\n      //-\r\n      \r\n      case 'c': // char\r\n      // get the character\r\n      s = num + STBSP__NUMSZ - 1;\r\n      *s = (char)va_arg(va, int);\r\n      l = 1;\r\n      lead[0] = 0;\r\n      tail[0] = 0;\r\n      pr = 0;\r\n      dp = 0;\r\n      cs = 0;\r\n      goto scopy;\r\n      \r\n      case 'n': // weird write-bytes specifier\r\n      {\r\n        int *d = va_arg(va, int *);\r\n        *d = tlen + (int)(bf - buf);\r\n      } break;\r\n      \r\n#ifdef STB_SPRINTF_NOFLOAT\r\n      case 'A':              // float\r\n      case 'a':              // hex float\r\n      case 'G':              // float\r\n      case 'g':              // float\r\n      case 'E':              // float\r\n      case 'e':              // float\r\n      case 'f':              // float\r\n      va_arg(va, double); // eat it\r\n      s = (char *)\"No float\";\r\n      l = 8;\r\n      lead[0] = 0;\r\n      tail[0] = 0;\r\n      pr = 0;\r\n      cs = 0;\r\n      STBSP__NOTUSED(dp);\r\n      goto scopy;\r\n#else\r\n      case 'A': // hex float\r\n      case 'a': // hex float\r\n      h = (f[0] == 'A') ? hexu : hex;\r\n      fv = va_arg(va, double);\r\n      if (pr == -1)\r\n        pr = 6; // default is 6\r\n      // read the double into a string\r\n      if (stbsp__real_to_parts((stbsp__int64 *)&n64, &dp, fv))\r\n        fl |= STBSP__NEGATIVE;\r\n      \r\n      s = num + 64;\r\n      \r\n      stbsp__lead_sign(fl, lead);\r\n      \r\n      if (dp == -1023)\r\n        dp = (n64) ? -1022 : 0;\r\n      else\r\n        n64 |= (((stbsp__uint64)1) << 52);\r\n      n64 <<= (64 - 56);\r\n      if (pr < 15)\r\n        n64 += ((((stbsp__uint64)8) << 56) >> (pr * 4));\r\n      // add leading chars\r\n      \r\n#ifdef STB_SPRINTF_MSVC_MODE\r\n      *s++ = '0';\r\n      *s++ = 'x';\r\n#else\r\n      lead[1 + lead[0]] = '0';\r\n      lead[2 + lead[0]] = 'x';\r\n      lead[0] += 2;\r\n#endif\r\n      *s++ = h[(n64 >> 60) & 15];\r\n      n64 <<= 4;\r\n      if (pr)\r\n        *s++ = stbsp__period;\r\n      sn = s;\r\n      \r\n      // print the bits\r\n      n = pr;\r\n      if (n > 13)\r\n        n = 13;\r\n      if (pr > (stbsp__int32)n)\r\n        tz = pr - n;\r\n      pr = 0;\r\n      while (n--) {\r\n        *s++ = h[(n64 >> 60) & 15];\r\n        n64 <<= 4;\r\n      }\r\n      \r\n      // print the expo\r\n      tail[1] = h[17];\r\n      if (dp < 0) {\r\n        tail[2] = '-';\r\n        dp = -dp;\r\n      } else\r\n        tail[2] = '+';\r\n      n = (dp >= 1000) ? 6 : ((dp >= 100) ? 5 : ((dp >= 10) ? 4 : 3));\r\n      tail[0] = (char)n;\r\n      for (;;) {\r\n        tail[n] = '0' + dp % 10;\r\n        if (n <= 3)\r\n          break;\r\n        --n;\r\n        dp /= 10;\r\n      }\r\n      \r\n      dp = (int)(s - sn);\r\n      l = (int)(s - (num + 64));\r\n      s = num + 64;\r\n      cs = 1 + (3 << 24);\r\n      goto scopy;\r\n      \r\n      case 'G': // float\r\n      case 'g': // float\r\n      h = (f[0] == 'G') ? hexu : hex;\r\n      fv = va_arg(va, double);\r\n      if (pr == -1)\r\n        pr = 6;\r\n      else if (pr == 0)\r\n        pr = 1; // default is 6\r\n      // read the double into a string\r\n      if (stbsp__real_to_str(&sn, &l, num, &dp, fv, (pr - 1) | 0x80000000))\r\n        fl |= STBSP__NEGATIVE;\r\n      \r\n      // clamp the precision and delete extra zeros after clamp\r\n      n = pr;\r\n      if (l > (stbsp__uint32)pr)\r\n        l = pr;\r\n      while ((l > 1) && (pr) && (sn[l - 1] == '0')) {\r\n        --pr;\r\n        --l;\r\n      }\r\n      \r\n      // should we use %e\r\n      if ((dp <= -4) || (dp > (stbsp__int32)n)) {\r\n        if (pr > (stbsp__int32)l)\r\n          pr = l - 1;\r\n        else if (pr)\r\n          --pr; // when using %e, there is one digit before the decimal\r\n        goto doexpfromg;\r\n      }\r\n      // this is the insane action to get the pr to match %g semantics for %f\r\n      if (dp > 0) {\r\n        pr = (dp < (stbsp__int32)l) ? l - dp : 0;\r\n      } else {\r\n        pr = -dp + ((pr > (stbsp__int32)l) ? (stbsp__int32) l : pr);\r\n      }\r\n      goto dofloatfromg;\r\n      \r\n      case 'E': // float\r\n      case 'e': // float\r\n      h = (f[0] == 'E') ? hexu : hex;\r\n      fv = va_arg(va, double);\r\n      if (pr == -1)\r\n        pr = 6; // default is 6\r\n      // read the double into a string\r\n      if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr | 0x80000000))\r\n        fl |= STBSP__NEGATIVE;\r\n      doexpfromg:\r\n      tail[0] = 0;\r\n      stbsp__lead_sign(fl, lead);\r\n      if (dp == STBSP__SPECIAL) {\r\n        s = (char *)sn;\r\n        cs = 0;\r\n        pr = 0;\r\n        goto scopy;\r\n      }\r\n      s = num + 64;\r\n      // handle leading chars\r\n      *s++ = sn[0];\r\n      \r\n      if (pr)\r\n        *s++ = stbsp__period;\r\n      \r\n      // handle after decimal\r\n      if ((l - 1) > (stbsp__uint32)pr)\r\n        l = pr + 1;\r\n      for (n = 1; n < l; n++)\r\n        *s++ = sn[n];\r\n      // trailing zeros\r\n      tz = pr - (l - 1);\r\n      pr = 0;\r\n      // dump expo\r\n      tail[1] = h[0xe];\r\n      dp -= 1;\r\n      if (dp < 0) {\r\n        tail[2] = '-';\r\n        dp = -dp;\r\n      } else\r\n        tail[2] = '+';\r\n#ifdef STB_SPRINTF_MSVC_MODE\r\n      n = 5;\r\n#else\r\n      n = (dp >= 100) ? 5 : 4;\r\n#endif\r\n      tail[0] = (char)n;\r\n      for (;;) {\r\n        tail[n] = '0' + dp % 10;\r\n        if (n <= 3)\r\n          break;\r\n        --n;\r\n        dp /= 10;\r\n      }\r\n      cs = 1 + (3 << 24); // how many tens\r\n      goto flt_lead;\r\n      \r\n      case 'f': // float\r\n      fv = va_arg(va, double);\r\n      doafloat:\r\n      // do kilos\r\n      if (fl & STBSP__METRIC_SUFFIX) {\r\n        double divisor;\r\n        divisor = 1000.0f;\r\n        if (fl & STBSP__METRIC_1024)\r\n          divisor = 1024.0;\r\n        while (fl < 0x4000000) {\r\n          if ((fv < divisor) && (fv > -divisor))\r\n            break;\r\n          fv /= divisor;\r\n          fl += 0x1000000;\r\n        }\r\n      }\r\n      if (pr == -1)\r\n        pr = 6; // default is 6\r\n      // read the double into a string\r\n      if (stbsp__real_to_str(&sn, &l, num, &dp, fv, pr))\r\n        fl |= STBSP__NEGATIVE;\r\n      dofloatfromg:\r\n      tail[0] = 0;\r\n      stbsp__lead_sign(fl, lead);\r\n      if (dp == STBSP__SPECIAL) {\r\n        s = (char *)sn;\r\n        cs = 0;\r\n        pr = 0;\r\n        goto scopy;\r\n      }\r\n      s = num + 64;\r\n      \r\n      // handle the three decimal varieties\r\n      if (dp <= 0) {\r\n        stbsp__int32 i;\r\n        // handle 0.000*000xxxx\r\n        *s++ = '0';\r\n        if (pr)\r\n          *s++ = stbsp__period;\r\n        n = -dp;\r\n        if ((stbsp__int32)n > pr)\r\n          n = pr;\r\n        i = n;\r\n        while (i) {\r\n          if ((((stbsp__uintptr)s) & 3) == 0)\r\n            break;\r\n          *s++ = '0';\r\n          --i;\r\n        }\r\n        while (i >= 4) {\r\n          *(stbsp__uint32 *)s = 0x30303030;\r\n          s += 4;\r\n          i -= 4;\r\n        }\r\n        while (i) {\r\n          *s++ = '0';\r\n          --i;\r\n        }\r\n        if ((stbsp__int32)(l + n) > pr)\r\n          l = pr - n;\r\n        i = l;\r\n        while (i) {\r\n          *s++ = *sn++;\r\n          --i;\r\n        }\r\n        tz = pr - (n + l);\r\n        cs = 1 + (3 << 24); // how many tens did we write (for commas below)\r\n      } else {\r\n        cs = (fl & STBSP__TRIPLET_COMMA) ? ((600 - (stbsp__uint32)dp) % 3) : 0;\r\n        if ((stbsp__uint32)dp >= l) {\r\n          // handle xxxx000*000.0\r\n          n = 0;\r\n          for (;;) {\r\n            if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) {\r\n              cs = 0;\r\n              *s++ = stbsp__comma;\r\n            } else {\r\n              *s++ = sn[n];\r\n              ++n;\r\n              if (n >= l)\r\n                break;\r\n            }\r\n          }\r\n          if (n < (stbsp__uint32)dp) {\r\n            n = dp - n;\r\n            if ((fl & STBSP__TRIPLET_COMMA) == 0) {\r\n              while (n) {\r\n                if ((((stbsp__uintptr)s) & 3) == 0)\r\n                  break;\r\n                *s++ = '0';\r\n                --n;\r\n              }\r\n              while (n >= 4) {\r\n                *(stbsp__uint32 *)s = 0x30303030;\r\n                s += 4;\r\n                n -= 4;\r\n              }\r\n            }\r\n            while (n) {\r\n              if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) {\r\n                cs = 0;\r\n                *s++ = stbsp__comma;\r\n              } else {\r\n                *s++ = '0';\r\n                --n;\r\n              }\r\n            }\r\n          }\r\n          cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens\r\n          if (pr) {\r\n            *s++ = stbsp__period;\r\n            tz = pr;\r\n          }\r\n        } else {\r\n          // handle xxxxx.xxxx000*000\r\n          n = 0;\r\n          for (;;) {\r\n            if ((fl & STBSP__TRIPLET_COMMA) && (++cs == 4)) {\r\n              cs = 0;\r\n              *s++ = stbsp__comma;\r\n            } else {\r\n              *s++ = sn[n];\r\n              ++n;\r\n              if (n >= (stbsp__uint32)dp)\r\n                break;\r\n            }\r\n          }\r\n          cs = (int)(s - (num + 64)) + (3 << 24); // cs is how many tens\r\n          if (pr)\r\n            *s++ = stbsp__period;\r\n          if ((l - dp) > (stbsp__uint32)pr)\r\n            l = pr + dp;\r\n          while (n < l) {\r\n            *s++ = sn[n];\r\n            ++n;\r\n          }\r\n          tz = pr - (l - dp);\r\n        }\r\n      }\r\n      pr = 0;\r\n      \r\n      // handle k,m,g,t\r\n      if (fl & STBSP__METRIC_SUFFIX) {\r\n        char idx;\r\n        idx = 1;\r\n        if (fl & STBSP__METRIC_NOSPACE)\r\n          idx = 0;\r\n        tail[0] = idx;\r\n        tail[1] = ' ';\r\n        {\r\n          if (fl >> 24) { // SI kilo is 'k', JEDEC and SI kibits are 'K'.\r\n            if (fl & STBSP__METRIC_1024)\r\n              tail[idx + 1] = \"_KMGT\"[fl >> 24];\r\n            else\r\n              tail[idx + 1] = \"_kMGT\"[fl >> 24];\r\n            idx++;\r\n            // If printing kibits and not in jedec, add the 'i'.\r\n            if (fl & STBSP__METRIC_1024 && !(fl & STBSP__METRIC_JEDEC)) {\r\n              tail[idx + 1] = 'i';\r\n              idx++;\r\n            }\r\n            tail[0] = idx;\r\n          }\r\n        }\r\n      };\r\n      \r\n      flt_lead:\r\n      // get the length that we copied\r\n      l = (stbsp__uint32)(s - (num + 64));\r\n      s = num + 64;\r\n      goto scopy;\r\n#endif\r\n      \r\n      case 'B': // upper binary\r\n      case 'b': // lower binary\r\n      h = (f[0] == 'B') ? hexu : hex;\r\n      lead[0] = 0;\r\n      if (fl & STBSP__LEADING_0X) {\r\n        lead[0] = 2;\r\n        lead[1] = '0';\r\n        lead[2] = h[0xb];\r\n      }\r\n      l = (8 << 4) | (1 << 8);\r\n      goto radixnum;\r\n      \r\n      case 'o': // octal\r\n      h = hexu;\r\n      lead[0] = 0;\r\n      if (fl & STBSP__LEADING_0X) {\r\n        lead[0] = 1;\r\n        lead[1] = '0';\r\n      }\r\n      l = (3 << 4) | (3 << 8);\r\n      goto radixnum;\r\n      \r\n      case 'p': // pointer\r\n      fl |= (sizeof(void *) == 8) ? STBSP__INTMAX : 0;\r\n      pr = sizeof(void *) * 2;\r\n      fl &= ~STBSP__LEADINGZERO; // 'p' only prints the pointer with zeros\r\n      // fall through - to X\r\n      \r\n      case 'X': // upper hex\r\n      case 'x': // lower hex\r\n      h = (f[0] == 'X') ? hexu : hex;\r\n      l = (4 << 4) | (4 << 8);\r\n      lead[0] = 0;\r\n      if (fl & STBSP__LEADING_0X) {\r\n        lead[0] = 2;\r\n        lead[1] = '0';\r\n        lead[2] = h[16];\r\n      }\r\n      radixnum:\r\n      // get the number\r\n      if (fl & STBSP__INTMAX)\r\n        n64 = va_arg(va, stbsp__uint64);\r\n      else\r\n        n64 = va_arg(va, stbsp__uint32);\r\n      \r\n      s = num + STBSP__NUMSZ;\r\n      dp = 0;\r\n      // clear tail, and clear leading if value is zero\r\n      tail[0] = 0;\r\n      if (n64 == 0) {\r\n        lead[0] = 0;\r\n        if (pr == 0) {\r\n          l = 0;\r\n          cs = 0;\r\n          goto scopy;\r\n        }\r\n      }\r\n      // convert to string\r\n      for (;;) {\r\n        *--s = h[n64 & ((1 << (l >> 8)) - 1)];\r\n        n64 >>= (l >> 8);\r\n        if (!((n64) || ((stbsp__int32)((num + STBSP__NUMSZ) - s) < pr)))\r\n          break;\r\n        if (fl & STBSP__TRIPLET_COMMA) {\r\n          ++l;\r\n          if ((l & 15) == ((l >> 4) & 15)) {\r\n            l &= ~15;\r\n            *--s = stbsp__comma;\r\n          }\r\n        }\r\n      };\r\n      // get the tens and the comma pos\r\n      cs = (stbsp__uint32)((num + STBSP__NUMSZ) - s) + ((((l >> 4) & 15)) << 24);\r\n      // get the length that we copied\r\n      l = (stbsp__uint32)((num + STBSP__NUMSZ) - s);\r\n      // copy it\r\n      goto scopy;\r\n      \r\n      case 'u': // unsigned\r\n      case 'i':\r\n      case 'd': // integer\r\n      // get the integer and abs it\r\n      if (fl & STBSP__INTMAX) {\r\n        stbsp__int64 i64 = va_arg(va, stbsp__int64);\r\n        n64 = (stbsp__uint64)i64;\r\n        if ((f[0] != 'u') && (i64 < 0)) {\r\n          n64 = (stbsp__uint64)-i64;\r\n          fl |= STBSP__NEGATIVE;\r\n        }\r\n      } else {\r\n        stbsp__int32 i = va_arg(va, stbsp__int32);\r\n        n64 = (stbsp__uint32)i;\r\n        if ((f[0] != 'u') && (i < 0)) {\r\n          n64 = (stbsp__uint32)-i;\r\n          fl |= STBSP__NEGATIVE;\r\n        }\r\n      }\r\n      \r\n#ifndef STB_SPRINTF_NOFLOAT\r\n      if (fl & STBSP__METRIC_SUFFIX) {\r\n        if (n64 < 1024)\r\n          pr = 0;\r\n        else if (pr == -1)\r\n          pr = 1;\r\n        fv = (double)(stbsp__int64)n64;\r\n        goto doafloat;\r\n      }\r\n#endif\r\n      \r\n      // convert to string\r\n      s = num + STBSP__NUMSZ;\r\n      l = 0;\r\n      \r\n      for (;;) {\r\n        // do in 32-bit chunks (avoid lots of 64-bit divides even with constant denominators)\r\n        char *o = s - 8;\r\n        if (n64 >= 100000000) {\r\n          n = (stbsp__uint32)(n64 % 100000000);\r\n          n64 /= 100000000;\r\n        } else {\r\n          n = (stbsp__uint32)n64;\r\n          n64 = 0;\r\n        }\r\n        if ((fl & STBSP__TRIPLET_COMMA) == 0) {\r\n          do {\r\n            s -= 2;\r\n            *(stbsp__uint16 *)s = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2];\r\n            n /= 100;\r\n          } while (n);\r\n        }\r\n        while (n) {\r\n          if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) {\r\n            l = 0;\r\n            *--s = stbsp__comma;\r\n            --o;\r\n          } else {\r\n            *--s = (char)(n % 10) + '0';\r\n            n /= 10;\r\n          }\r\n        }\r\n        if (n64 == 0) {\r\n          if ((s[0] == '0') && (s != (num + STBSP__NUMSZ)))\r\n            ++s;\r\n          break;\r\n        }\r\n        while (s != o)\r\n          if ((fl & STBSP__TRIPLET_COMMA) && (l++ == 3)) {\r\n          l = 0;\r\n          *--s = stbsp__comma;\r\n          --o;\r\n        } else {\r\n          *--s = '0';\r\n        }\r\n      }\r\n      \r\n      tail[0] = 0;\r\n      stbsp__lead_sign(fl, lead);\r\n      \r\n      // get the length that we copied\r\n      l = (stbsp__uint32)((num + STBSP__NUMSZ) - s);\r\n      if (l == 0) {\r\n        *--s = '0';\r\n        l = 1;\r\n      }\r\n      cs = l + (3 << 24);\r\n      if (pr < 0)\r\n        pr = 0;\r\n      \r\n      scopy:\r\n      // get fw=leading/trailing space, pr=leading zeros\r\n      if (pr < (stbsp__int32)l)\r\n        pr = l;\r\n      n = pr + lead[0] + tail[0] + tz;\r\n      if (fw < (stbsp__int32)n)\r\n        fw = n;\r\n      fw -= n;\r\n      pr -= l;\r\n      \r\n      // handle right justify and leading zeros\r\n      if ((fl & STBSP__LEFTJUST) == 0) {\r\n        if (fl & STBSP__LEADINGZERO) // if leading zeros, everything is in pr\r\n        {\r\n          pr = (fw > pr) ? fw : pr;\r\n          fw = 0;\r\n        } else {\r\n          fl &= ~STBSP__TRIPLET_COMMA; // if no leading zeros, then no commas\r\n        }\r\n      }\r\n      \r\n      // copy the spaces and/or zeros\r\n      if (fw + pr) {\r\n        stbsp__int32 i;\r\n        stbsp__uint32 c;\r\n        \r\n        // copy leading spaces (or when doing %8.4d stuff)\r\n        if ((fl & STBSP__LEFTJUST) == 0)\r\n          while (fw > 0) {\r\n          stbsp__cb_buf_clamp(i, fw);\r\n          fw -= i;\r\n          while (i) {\r\n            if ((((stbsp__uintptr)bf) & 3) == 0)\r\n              break;\r\n            *bf++ = ' ';\r\n            --i;\r\n          }\r\n          while (i >= 4) {\r\n            *(stbsp__uint32 *)bf = 0x20202020;\r\n            bf += 4;\r\n            i -= 4;\r\n          }\r\n          while (i) {\r\n            *bf++ = ' ';\r\n            --i;\r\n          }\r\n          stbsp__chk_cb_buf(1);\r\n        }\r\n        \r\n        // copy leader\r\n        sn = lead + 1;\r\n        while (lead[0]) {\r\n          stbsp__cb_buf_clamp(i, lead[0]);\r\n          lead[0] -= (char)i;\r\n          while (i) {\r\n            *bf++ = *sn++;\r\n            --i;\r\n          }\r\n          stbsp__chk_cb_buf(1);\r\n        }\r\n        \r\n        // copy leading zeros\r\n        c = cs >> 24;\r\n        cs &= 0xffffff;\r\n        cs = (fl & STBSP__TRIPLET_COMMA) ? ((stbsp__uint32)(c - ((pr + cs) % (c + 1)))) : 0;\r\n        while (pr > 0) {\r\n          stbsp__cb_buf_clamp(i, pr);\r\n          pr -= i;\r\n          if ((fl & STBSP__TRIPLET_COMMA) == 0) {\r\n            while (i) {\r\n              if ((((stbsp__uintptr)bf) & 3) == 0)\r\n                break;\r\n              *bf++ = '0';\r\n              --i;\r\n            }\r\n            while (i >= 4) {\r\n              *(stbsp__uint32 *)bf = 0x30303030;\r\n              bf += 4;\r\n              i -= 4;\r\n            }\r\n          }\r\n          while (i) {\r\n            if ((fl & STBSP__TRIPLET_COMMA) && (cs++ == c)) {\r\n              cs = 0;\r\n              *bf++ = stbsp__comma;\r\n            } else\r\n              *bf++ = '0';\r\n            --i;\r\n          }\r\n          stbsp__chk_cb_buf(1);\r\n        }\r\n      }\r\n      \r\n      // copy leader if there is still one\r\n      sn = lead + 1;\r\n      while (lead[0]) {\r\n        stbsp__int32 i;\r\n        stbsp__cb_buf_clamp(i, lead[0]);\r\n        lead[0] -= (char)i;\r\n        while (i) {\r\n          *bf++ = *sn++;\r\n          --i;\r\n        }\r\n        stbsp__chk_cb_buf(1);\r\n      }\r\n      \r\n      // copy the string\r\n      n = l;\r\n      while (n) {\r\n        stbsp__int32 i;\r\n        stbsp__cb_buf_clamp(i, n);\r\n        n -= i;\r\n        STBSP__UNALIGNED(while (i >= 4) {\r\n                           *(stbsp__uint32 volatile *)bf = *(stbsp__uint32 volatile *)s;\r\n                           bf += 4;\r\n                           s += 4;\r\n                           i -= 4;\r\n                         })\r\n          while (i) {\r\n          *bf++ = *s++;\r\n          --i;\r\n        }\r\n        stbsp__chk_cb_buf(1);\r\n      }\r\n      \r\n      // copy trailing zeros\r\n      while (tz) {\r\n        stbsp__int32 i;\r\n        stbsp__cb_buf_clamp(i, tz);\r\n        tz -= i;\r\n        while (i) {\r\n          if ((((stbsp__uintptr)bf) & 3) == 0)\r\n            break;\r\n          *bf++ = '0';\r\n          --i;\r\n        }\r\n        while (i >= 4) {\r\n          *(stbsp__uint32 *)bf = 0x30303030;\r\n          bf += 4;\r\n          i -= 4;\r\n        }\r\n        while (i) {\r\n          *bf++ = '0';\r\n          --i;\r\n        }\r\n        stbsp__chk_cb_buf(1);\r\n      }\r\n      \r\n      // copy tail if there is one\r\n      sn = tail + 1;\r\n      while (tail[0]) {\r\n        stbsp__int32 i;\r\n        stbsp__cb_buf_clamp(i, tail[0]);\r\n        tail[0] -= (char)i;\r\n        while (i) {\r\n          *bf++ = *sn++;\r\n          --i;\r\n        }\r\n        stbsp__chk_cb_buf(1);\r\n      }\r\n      \r\n      // handle the left justify\r\n      if (fl & STBSP__LEFTJUST)\r\n        if (fw > 0) {\r\n        while (fw) {\r\n          stbsp__int32 i;\r\n          stbsp__cb_buf_clamp(i, fw);\r\n          fw -= i;\r\n          while (i) {\r\n            if ((((stbsp__uintptr)bf) & 3) == 0)\r\n              break;\r\n            *bf++ = ' ';\r\n            --i;\r\n          }\r\n          while (i >= 4) {\r\n            *(stbsp__uint32 *)bf = 0x20202020;\r\n            bf += 4;\r\n            i -= 4;\r\n          }\r\n          while (i--)\r\n            *bf++ = ' ';\r\n          stbsp__chk_cb_buf(1);\r\n        }\r\n      }\r\n      break;\r\n      \r\n      default: // unknown, just copy code\r\n      s = num + STBSP__NUMSZ - 1;\r\n      *s = f[0];\r\n      l = 1;\r\n      fw = fl = 0;\r\n      lead[0] = 0;\r\n      tail[0] = 0;\r\n      pr = 0;\r\n      dp = 0;\r\n      cs = 0;\r\n      goto scopy;\r\n    }\r\n    ++f;\r\n  }\r\n  endfmt:\r\n  \r\n  if (!callback)\r\n    *bf = 0;\r\n  else\r\n    stbsp__flush_cb();\r\n  \r\n  done:\r\n  return tlen + (int)(bf - buf);\r\n}\r\n\r\n// cleanup\r\n#undef STBSP__LEFTJUST\r\n#undef STBSP__LEADINGPLUS\r\n#undef STBSP__LEADINGSPACE\r\n#undef STBSP__LEADING_0X\r\n#undef STBSP__LEADINGZERO\r\n#undef STBSP__INTMAX\r\n#undef STBSP__TRIPLET_COMMA\r\n#undef STBSP__NEGATIVE\r\n#undef STBSP__METRIC_SUFFIX\r\n#undef STBSP__NUMSZ\r\n#undef stbsp__chk_cb_bufL\r\n#undef stbsp__chk_cb_buf\r\n#undef stbsp__flush_cb\r\n#undef stbsp__cb_buf_clamp\r\n\r\n// ============================================================================\r\n//   wrapper functions\r\n\r\nSTBSP__PUBLICDEF int STB_SPRINTF_DECORATE(sprintf)(char *buf, char const *fmt, ...)\r\n{\r\n  int result;\r\n  va_list va;\r\n  va_start(va, fmt);\r\n  result = STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va);\r\n  va_end(va);\r\n  return result;\r\n}\r\n\r\ntypedef struct stbsp__context {\r\n  char *buf;\r\n  int count;\r\n  int length;\r\n  char tmp[STB_SPRINTF_MIN];\r\n} stbsp__context;\r\n\r\nstatic char *stbsp__clamp_callback(const char *buf, void *user, int len)\r\n{\r\n  stbsp__context *c = (stbsp__context *)user;\r\n  c->length += len;\r\n  \r\n  if (len > c->count)\r\n    len = c->count;\r\n  \r\n  if (len) {\r\n    if (buf != c->buf) {\r\n      const char *s, *se;\r\n      char *d;\r\n      d = c->buf;\r\n      s = buf;\r\n      se = buf + len;\r\n      do {\r\n        *d++ = *s++;\r\n      } while (s < se);\r\n    }\r\n    c->buf += len;\r\n    c->count -= len;\r\n  }\r\n  \r\n  if (c->count <= 0)\r\n    return c->tmp;\r\n  return (c->count >= STB_SPRINTF_MIN) ? c->buf : c->tmp; // go direct into buffer if you can\r\n}\r\n\r\nstatic char * stbsp__count_clamp_callback( const char * buf, void * user, int len )\r\n{\r\n  stbsp__context * c = (stbsp__context*)user;\r\n  (void) sizeof(buf);\r\n  \r\n  c->length += len;\r\n  return c->tmp; // go direct into buffer if you can\r\n}\r\n\r\nSTBSP__PUBLICDEF int STB_SPRINTF_DECORATE( vsnprintf )( char * buf, int count, char const * fmt, va_list va )\r\n{\r\n  stbsp__context c;\r\n  \r\n  if ( (count == 0) && !buf )\r\n  {\r\n    c.length = 0;\r\n    \r\n    STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__count_clamp_callback, &c, c.tmp, fmt, va );\r\n  }\r\n  else\r\n  {\r\n    int l;\r\n    \r\n    c.buf = buf;\r\n    c.count = count;\r\n    c.length = 0;\r\n    \r\n    STB_SPRINTF_DECORATE( vsprintfcb )( stbsp__clamp_callback, &c, stbsp__clamp_callback(0,&c,0), fmt, va );\r\n    \r\n    // zero-terminate\r\n    l = (int)( c.buf - buf );\r\n    if ( l >= count ) // should never be greater, only equal (or less) than count\r\n      l = count - 1;\r\n    buf[l] = 0;\r\n  }\r\n  \r\n  return c.length;\r\n}\r\n\r\nSTBSP__PUBLICDEF int STB_SPRINTF_DECORATE(snprintf)(char *buf, int count, char const *fmt, ...)\r\n{\r\n  int result;\r\n  va_list va;\r\n  va_start(va, fmt);\r\n  \r\n  result = STB_SPRINTF_DECORATE(vsnprintf)(buf, count, fmt, va);\r\n  va_end(va);\r\n  \r\n  return result;\r\n}\r\n\r\nSTBSP__PUBLICDEF int STB_SPRINTF_DECORATE(vsprintf)(char *buf, char const *fmt, va_list va)\r\n{\r\n  return STB_SPRINTF_DECORATE(vsprintfcb)(0, 0, buf, fmt, va);\r\n}\r\n\r\n// =======================================================================\r\n//   low level float utility functions\r\n\r\n#ifndef STB_SPRINTF_NOFLOAT\r\n\r\n// copies d to bits w/ strict aliasing (this compiles to nothing on /Ox)\r\n#define STBSP__COPYFP(dest, src)                   \\\r\n{                                               \\\r\nint cn;                                      \\\r\nfor (cn = 0; cn < 8; cn++)                   \\\r\n((char *)&dest)[cn] = ((char *)&src)[cn]; \\\r\n}\r\n\r\n// get float info\r\nstatic stbsp__int32 stbsp__real_to_parts(stbsp__int64 *bits, stbsp__int32 *expo, double value)\r\n{\r\n  double d;\r\n  stbsp__int64 b = 0;\r\n  \r\n  // load value and round at the frac_digits\r\n  d = value;\r\n  \r\n  STBSP__COPYFP(b, d);\r\n  \r\n  *bits = b & ((((stbsp__uint64)1) << 52) - 1);\r\n  *expo = (stbsp__int32)(((b >> 52) & 2047) - 1023);\r\n  \r\n  return (stbsp__int32)((stbsp__uint64) b >> 63);\r\n}\r\n\r\nstatic double const stbsp__bot[23] = {\r\n  1e+000, 1e+001, 1e+002, 1e+003, 1e+004, 1e+005, 1e+006, 1e+007, 1e+008, 1e+009, 1e+010, 1e+011,\r\n  1e+012, 1e+013, 1e+014, 1e+015, 1e+016, 1e+017, 1e+018, 1e+019, 1e+020, 1e+021, 1e+022\r\n};\r\nstatic double const stbsp__negbot[22] = {\r\n  1e-001, 1e-002, 1e-003, 1e-004, 1e-005, 1e-006, 1e-007, 1e-008, 1e-009, 1e-010, 1e-011,\r\n  1e-012, 1e-013, 1e-014, 1e-015, 1e-016, 1e-017, 1e-018, 1e-019, 1e-020, 1e-021, 1e-022\r\n};\r\nstatic double const stbsp__negboterr[22] = {\r\n  -5.551115123125783e-018,  -2.0816681711721684e-019, -2.0816681711721686e-020, -4.7921736023859299e-021, -8.1803053914031305e-022, 4.5251888174113741e-023,\r\n  4.5251888174113739e-024,  -2.0922560830128471e-025, -6.2281591457779853e-026, -3.6432197315497743e-027, 6.0503030718060191e-028,  2.0113352370744385e-029,\r\n  -3.0373745563400371e-030, 1.1806906454401013e-032,  -7.7705399876661076e-032, 2.0902213275965398e-033,  -7.1542424054621921e-034, -7.1542424054621926e-035,\r\n  2.4754073164739869e-036,  5.4846728545790429e-037,  9.2462547772103625e-038,  -4.8596774326570872e-039\r\n};\r\nstatic double const stbsp__top[13] = {\r\n  1e+023, 1e+046, 1e+069, 1e+092, 1e+115, 1e+138, 1e+161, 1e+184, 1e+207, 1e+230, 1e+253, 1e+276, 1e+299\r\n};\r\nstatic double const stbsp__negtop[13] = {\r\n  1e-023, 1e-046, 1e-069, 1e-092, 1e-115, 1e-138, 1e-161, 1e-184, 1e-207, 1e-230, 1e-253, 1e-276, 1e-299\r\n};\r\nstatic double const stbsp__toperr[13] = {\r\n  8388608,\r\n  6.8601809640529717e+028,\r\n  -7.253143638152921e+052,\r\n  -4.3377296974619174e+075,\r\n  -1.5559416129466825e+098,\r\n  -3.2841562489204913e+121,\r\n  -3.7745893248228135e+144,\r\n  -1.7356668416969134e+167,\r\n  -3.8893577551088374e+190,\r\n  -9.9566444326005119e+213,\r\n  6.3641293062232429e+236,\r\n  -5.2069140800249813e+259,\r\n  -5.2504760255204387e+282\r\n};\r\nstatic double const stbsp__negtoperr[13] = {\r\n  3.9565301985100693e-040,  -2.299904345391321e-063,  3.6506201437945798e-086,  1.1875228833981544e-109,\r\n  -5.0644902316928607e-132, -6.7156837247865426e-155, -2.812077463003139e-178,  -5.7778912386589953e-201,\r\n  7.4997100559334532e-224,  -4.6439668915134491e-247, -6.3691100762962136e-270, -9.436808465446358e-293,\r\n  8.0970921678014997e-317\r\n};\r\n\r\n#if defined(_MSC_VER) && (_MSC_VER <= 1200)\r\nstatic stbsp__uint64 const stbsp__powten[20] = {\r\n  1,\r\n  10,\r\n  100,\r\n  1000,\r\n  10000,\r\n  100000,\r\n  1000000,\r\n  10000000,\r\n  100000000,\r\n  1000000000,\r\n  10000000000,\r\n  100000000000,\r\n  1000000000000,\r\n  10000000000000,\r\n  100000000000000,\r\n  1000000000000000,\r\n  10000000000000000,\r\n  100000000000000000,\r\n  1000000000000000000,\r\n  10000000000000000000U\r\n};\r\n#define stbsp__tento19th ((stbsp__uint64)1000000000000000000)\r\n#else\r\nstatic stbsp__uint64 const stbsp__powten[20] = {\r\n  1,\r\n  10,\r\n  100,\r\n  1000,\r\n  10000,\r\n  100000,\r\n  1000000,\r\n  10000000,\r\n  100000000,\r\n  1000000000,\r\n  10000000000ULL,\r\n  100000000000ULL,\r\n  1000000000000ULL,\r\n  10000000000000ULL,\r\n  100000000000000ULL,\r\n  1000000000000000ULL,\r\n  10000000000000000ULL,\r\n  100000000000000000ULL,\r\n  1000000000000000000ULL,\r\n  10000000000000000000ULL\r\n};\r\n#define stbsp__tento19th (1000000000000000000ULL)\r\n#endif\r\n\r\n#define stbsp__ddmulthi(oh, ol, xh, yh)                            \\\r\n{                                                               \\\r\ndouble ahi = 0, alo, bhi = 0, blo;                           \\\r\nstbsp__int64 bt;                                             \\\r\noh = xh * yh;                                                \\\r\nSTBSP__COPYFP(bt, xh);                                       \\\r\nbt &= ((~(stbsp__uint64)0) << 27);                           \\\r\nSTBSP__COPYFP(ahi, bt);                                      \\\r\nalo = xh - ahi;                                              \\\r\nSTBSP__COPYFP(bt, yh);                                       \\\r\nbt &= ((~(stbsp__uint64)0) << 27);                           \\\r\nSTBSP__COPYFP(bhi, bt);                                      \\\r\nblo = yh - bhi;                                              \\\r\nol = ((ahi * bhi - oh) + ahi * blo + alo * bhi) + alo * blo; \\\r\n}\r\n\r\n#define stbsp__ddtoS64(ob, xh, xl)          \\\r\n{                                        \\\r\ndouble ahi = 0, alo, vh, t;           \\\r\nob = (stbsp__int64)xh;                \\\r\nvh = (double)ob;                      \\\r\nahi = (xh - vh);                      \\\r\nt = (ahi - xh);                       \\\r\nalo = (xh - (ahi - t)) - (vh + t);    \\\r\nob += (stbsp__int64)(ahi + alo + xl); \\\r\n}\r\n\r\n#define stbsp__ddrenorm(oh, ol) \\\r\n{                            \\\r\ndouble s;                 \\\r\ns = oh + ol;              \\\r\nol = ol - (s - oh);       \\\r\noh = s;                   \\\r\n}\r\n\r\n#define stbsp__ddmultlo(oh, ol, xh, xl, yh, yl) ol = ol + (xh * yl + xl * yh);\r\n\r\n#define stbsp__ddmultlos(oh, ol, xh, yl) ol = ol + (xh * yl);\r\n\r\nstatic void stbsp__raise_to_power10(double *ohi, double *olo, double d, stbsp__int32 power) // power can be -323 to +350\r\n{\r\n  double ph, pl;\r\n  if ((power >= 0) && (power <= 22)) {\r\n    stbsp__ddmulthi(ph, pl, d, stbsp__bot[power]);\r\n  } else {\r\n    stbsp__int32 e, et, eb;\r\n    double p2h, p2l;\r\n    \r\n    e = power;\r\n    if (power < 0)\r\n      e = -e;\r\n    et = (e * 0x2c9) >> 14; /* %23 */\r\n    if (et > 13)\r\n      et = 13;\r\n    eb = e - (et * 23);\r\n    \r\n    ph = d;\r\n    pl = 0.0;\r\n    if (power < 0) {\r\n      if (eb) {\r\n        --eb;\r\n        stbsp__ddmulthi(ph, pl, d, stbsp__negbot[eb]);\r\n        stbsp__ddmultlos(ph, pl, d, stbsp__negboterr[eb]);\r\n      }\r\n      if (et) {\r\n        stbsp__ddrenorm(ph, pl);\r\n        --et;\r\n        stbsp__ddmulthi(p2h, p2l, ph, stbsp__negtop[et]);\r\n        stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__negtop[et], stbsp__negtoperr[et]);\r\n        ph = p2h;\r\n        pl = p2l;\r\n      }\r\n    } else {\r\n      if (eb) {\r\n        e = eb;\r\n        if (eb > 22)\r\n          eb = 22;\r\n        e -= eb;\r\n        stbsp__ddmulthi(ph, pl, d, stbsp__bot[eb]);\r\n        if (e) {\r\n          stbsp__ddrenorm(ph, pl);\r\n          stbsp__ddmulthi(p2h, p2l, ph, stbsp__bot[e]);\r\n          stbsp__ddmultlos(p2h, p2l, stbsp__bot[e], pl);\r\n          ph = p2h;\r\n          pl = p2l;\r\n        }\r\n      }\r\n      if (et) {\r\n        stbsp__ddrenorm(ph, pl);\r\n        --et;\r\n        stbsp__ddmulthi(p2h, p2l, ph, stbsp__top[et]);\r\n        stbsp__ddmultlo(p2h, p2l, ph, pl, stbsp__top[et], stbsp__toperr[et]);\r\n        ph = p2h;\r\n        pl = p2l;\r\n      }\r\n    }\r\n  }\r\n  stbsp__ddrenorm(ph, pl);\r\n  *ohi = ph;\r\n  *olo = pl;\r\n}\r\n\r\n// given a float value, returns the significant bits in bits, and the position of the\r\n//   decimal point in decimal_pos.  +/-INF and NAN are specified by special values\r\n//   returned in the decimal_pos parameter.\r\n// frac_digits is absolute normally, but if you want from first significant digits (got %g and %e), or in 0x80000000\r\nstatic stbsp__int32 stbsp__real_to_str(char const **start, stbsp__uint32 *len, char *out, stbsp__int32 *decimal_pos, double value, stbsp__uint32 frac_digits)\r\n{\r\n  double d;\r\n  stbsp__int64 bits = 0;\r\n  stbsp__int32 expo, e, ng, tens;\r\n  \r\n  d = value;\r\n  STBSP__COPYFP(bits, d);\r\n  expo = (stbsp__int32)((bits >> 52) & 2047);\r\n  ng = (stbsp__int32)((stbsp__uint64) bits >> 63);\r\n  if (ng)\r\n    d = -d;\r\n  \r\n  if (expo == 2047) // is nan or inf?\r\n  {\r\n    *start = (bits & ((((stbsp__uint64)1) << 52) - 1)) ? \"NaN\" : \"Inf\";\r\n    *decimal_pos = STBSP__SPECIAL;\r\n    *len = 3;\r\n    return ng;\r\n  }\r\n  \r\n  if (expo == 0) // is zero or denormal\r\n  {\r\n    if (((stbsp__uint64) bits << 1) == 0) // do zero\r\n    {\r\n      *decimal_pos = 1;\r\n      *start = out;\r\n      out[0] = '0';\r\n      *len = 1;\r\n      return ng;\r\n    }\r\n    // find the right expo for denormals\r\n    {\r\n      stbsp__int64 v = ((stbsp__uint64)1) << 51;\r\n      while ((bits & v) == 0) {\r\n        --expo;\r\n        v >>= 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  // find the decimal exponent as well as the decimal bits of the value\r\n  {\r\n    double ph, pl;\r\n    \r\n    // log10 estimate - very specifically tweaked to hit or undershoot by no more than 1 of log10 of all expos 1..2046\r\n    tens = expo - 1023;\r\n    tens = (tens < 0) ? ((tens * 617) / 2048) : (((tens * 1233) / 4096) + 1);\r\n    \r\n    // move the significant bits into position and stick them into an int\r\n    stbsp__raise_to_power10(&ph, &pl, d, 18 - tens);\r\n    \r\n    // get full as much precision from double-double as possible\r\n    stbsp__ddtoS64(bits, ph, pl);\r\n    \r\n    // check if we undershot\r\n    if (((stbsp__uint64)bits) >= stbsp__tento19th)\r\n      ++tens;\r\n  }\r\n  \r\n  // now do the rounding in integer land\r\n  frac_digits = (frac_digits & 0x80000000) ? ((frac_digits & 0x7ffffff) + 1) : (tens + frac_digits);\r\n  if ((frac_digits < 24)) {\r\n    stbsp__uint32 dg = 1;\r\n    if ((stbsp__uint64)bits >= stbsp__powten[9])\r\n      dg = 10;\r\n    while ((stbsp__uint64)bits >= stbsp__powten[dg]) {\r\n      ++dg;\r\n      if (dg == 20)\r\n        goto noround;\r\n    }\r\n    if (frac_digits < dg) {\r\n      stbsp__uint64 r;\r\n      // add 0.5 at the right position and round\r\n      e = dg - frac_digits;\r\n      if ((stbsp__uint32)e >= 24)\r\n        goto noround;\r\n      r = stbsp__powten[e];\r\n      bits = bits + (r / 2);\r\n      if ((stbsp__uint64)bits >= stbsp__powten[dg])\r\n        ++tens;\r\n      bits /= r;\r\n    }\r\n    noround:;\r\n  }\r\n  \r\n  // kill long trailing runs of zeros\r\n  if (bits) {\r\n    stbsp__uint32 n;\r\n    for (;;) {\r\n      if (bits <= 0xffffffff)\r\n        break;\r\n      if (bits % 1000)\r\n        goto donez;\r\n      bits /= 1000;\r\n    }\r\n    n = (stbsp__uint32)bits;\r\n    while ((n % 1000) == 0)\r\n      n /= 1000;\r\n    bits = n;\r\n    donez:;\r\n  }\r\n  \r\n  // convert to string\r\n  out += 64;\r\n  e = 0;\r\n  for (;;) {\r\n    stbsp__uint32 n;\r\n    char *o = out - 8;\r\n    // do the conversion in chunks of U32s (avoid most 64-bit divides, worth it, constant denomiators be damned)\r\n    if (bits >= 100000000) {\r\n      n = (stbsp__uint32)(bits % 100000000);\r\n      bits /= 100000000;\r\n    } else {\r\n      n = (stbsp__uint32)bits;\r\n      bits = 0;\r\n    }\r\n    while (n) {\r\n      out -= 2;\r\n      *(stbsp__uint16 *)out = *(stbsp__uint16 *)&stbsp__digitpair.pair[(n % 100) * 2];\r\n      n /= 100;\r\n      e += 2;\r\n    }\r\n    if (bits == 0) {\r\n      if ((e) && (out[0] == '0')) {\r\n        ++out;\r\n        --e;\r\n      }\r\n      break;\r\n    }\r\n    while (out != o) {\r\n      *--out = '0';\r\n      ++e;\r\n    }\r\n  }\r\n  \r\n  *decimal_pos = tens;\r\n  *start = out;\r\n  *len = e;\r\n  return ng;\r\n}\r\n\r\n#undef stbsp__ddmulthi\r\n#undef stbsp__ddrenorm\r\n#undef stbsp__ddmultlo\r\n#undef stbsp__ddmultlos\r\n#undef STBSP__SPECIAL\r\n#undef STBSP__COPYFP\r\n\r\n#endif // STB_SPRINTF_NOFLOAT\r\n\r\n// clean up\r\n#undef stbsp__uint16\r\n#undef stbsp__uint32\r\n#undef stbsp__int32\r\n#undef stbsp__uint64\r\n#undef stbsp__int64\r\n#undef STBSP__UNALIGNED\r\n\r\n#endif // STB_SPRINTF_IMPLEMENTATION\r\n\r\n/*\r\n------------------------------------------------------------------------------\r\nThis software is available under 2 licenses -- choose whichever you prefer.\r\n------------------------------------------------------------------------------\r\nALTERNATIVE A - MIT License\r\nCopyright (c) 2017 Sean Barrett\r\nPermission is hereby granted, free of charge, to any person obtaining a copy of\r\nthis software and associated documentation files (the \"Software\"), to deal in\r\nthe Software without restriction, including without limitation the rights to\r\nuse, copy, modify, merge, publish, distribute, sublicense, and/or sell copies\r\nof the Software, and to permit persons to whom the Software is furnished to do\r\nso, subject to the following conditions:\r\nThe above copyright notice and this permission notice shall be included in all\r\ncopies or substantial portions of the Software.\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\nSOFTWARE.\r\n------------------------------------------------------------------------------\r\nALTERNATIVE B - Public Domain (www.unlicense.org)\r\nThis is free and unencumbered software released into the public domain.\r\nAnyone is free to copy, modify, publish, use, compile, sell, or distribute this\r\nsoftware, either in source code form or as a compiled binary, for any purpose,\r\ncommercial or non-commercial, and by any means.\r\nIn jurisdictions that recognize copyright laws, the author or authors of this\r\nsoftware dedicate any and all copyright interest in the software to the public\r\ndomain. We make this dedication for the benefit of the public at large and to\r\nthe detriment of our heirs and successors. We intend this dedication to be an\r\novert act of relinquishment in perpetuity of all present and future rights to\r\nthis software under copyright law.\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r\nACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\r\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r\n------------------------------------------------------------------------------\r\n*/\r\n"
  },
  {
    "path": "src/third_party/xxHash/LICENSE",
    "content": "xxHash Library\nCopyright (c) 2012-2021 Yann Collet\nAll rights reserved.\n\nBSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n* Redistributions of source code must retain the above copyright notice, this\n  list of conditions and the following disclaimer.\n\n* Redistributions in binary form must reproduce the above copyright notice, this\n  list of conditions and the following disclaimer in the documentation and/or\n  other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\nWARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR\nANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\nLOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON\nANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/third_party/xxHash/README.md",
    "content": "\nxxHash - Extremely fast hash algorithm\n======================================\n\nxxHash is an Extremely fast Hash algorithm, processing at RAM speed limits.\nCode is highly portable, and produces hashes identical across all platforms (little / big endian).\nThe library includes the following algorithms :\n- XXH32 : generates 32-bit hashes, using 32-bit arithmetic\n- XXH64 : generates 64-bit hashes, using 64-bit arithmetic\n- XXH3 (since `v0.8.0`): generates 64 or 128-bit hashes, using vectorized arithmetic.\n  The 128-bit variant is called XXH128.\n\nAll variants successfully complete the [SMHasher](https://code.google.com/p/smhasher/wiki/SMHasher) test suite\nwhich evaluates the quality of hash functions (collision, dispersion and randomness).\nAdditional tests, which evaluate more thoroughly speed and collision properties of 64-bit hashes, [are also provided](https://github.com/Cyan4973/xxHash/tree/dev/tests).\n\n|Branch      |Status   |\n|------------|---------|\n|release     | [![Build Status](https://github.com/Cyan4973/xxHash/actions/workflows/ci.yml/badge.svg?branch=release)](https://github.com/Cyan4973/xxHash/actions?query=branch%3Arelease+) |\n|dev         | [![Build Status](https://github.com/Cyan4973/xxHash/actions/workflows/ci.yml/badge.svg?branch=dev)](https://github.com/Cyan4973/xxHash/actions?query=branch%3Adev+) |\n\n\nBenchmarks\n-------------------------\n\nThe benchmarked reference system uses an Intel i7-9700K cpu, and runs Ubuntu x64 20.04.\nThe [open source benchmark program] is compiled with `clang` v10.0 using `-O3` flag.\n\n| Hash Name     | Width | Bandwidth (GB/s) | Small Data Velocity | Quality | Comment |\n| ---------     | ----- | ---------------- | ----- | --- | --- |\n| __XXH3__ (SSE2) |  64 | 31.5 GB/s        | 133.1 | 10\n| __XXH128__ (SSE2) | 128 | 29.6 GB/s      | 118.1 | 10\n| _RAM sequential read_ | N/A | 28.0 GB/s  |   N/A | N/A | _for reference_\n| City64        |    64 | 22.0 GB/s        |  76.6 | 10\n| T1ha2         |    64 | 22.0 GB/s        |  99.0 |  9 | Slightly worse [collisions]\n| City128       |   128 | 21.7 GB/s        |  57.7 | 10\n| __XXH64__     |    64 | 19.4 GB/s        |  71.0 | 10\n| SpookyHash    |    64 | 19.3 GB/s        |  53.2 | 10\n| Mum           |    64 | 18.0 GB/s        |  67.0 |  9 | Slightly worse [collisions]\n| __XXH32__     |    32 |  9.7 GB/s        |  71.9 | 10\n| City32        |    32 |  9.1 GB/s        |  66.0 | 10\n| Murmur3       |    32 |  3.9 GB/s        |  56.1 | 10\n| SipHash       |    64 |  3.0 GB/s        |  43.2 | 10\n| FNV64         |    64 |  1.2 GB/s        |  62.7 |  5 | Poor avalanche properties\n| Blake2        |   256 |  1.1 GB/s        |   5.1 | 10 | Cryptographic\n| SHA1          |   160 |  0.8 GB/s        |   5.6 | 10 | Cryptographic but broken\n| MD5           |   128 |  0.6 GB/s        |   7.8 | 10 | Cryptographic but broken\n\n[open source benchmark program]: https://github.com/Cyan4973/xxHash/tree/release/tests/bench\n[collisions]: https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison#collision-study\n\nnote 1: Small data velocity is a _rough_ evaluation of algorithm's efficiency on small data. For more detailed analysis, please refer to next paragraph.\n\nnote 2: some algorithms feature _faster than RAM_ speed. In which case, they can only reach their full speed potential when input is already in CPU cache (L3 or better). Otherwise, they max out on RAM speed limit.\n\n### Small data\n\nPerformance on large data is only one part of the picture.\nHashing is also very useful in constructions like hash tables and bloom filters.\nIn these use cases, it's frequent to hash a lot of small data (starting at a few bytes).\nAlgorithm's performance can be very different for such scenarios, since parts of the algorithm,\nsuch as initialization or finalization, become fixed cost.\nThe impact of branch mis-prediction also becomes much more present.\n\nXXH3 has been designed for excellent performance on both long and small inputs,\nwhich can be observed in the following graph:\n\n![XXH3, latency, random size](https://user-images.githubusercontent.com/750081/61976089-aedeab00-af9f-11e9-9239-e5375d6c080f.png)\n\nFor a more detailed analysis, please visit the wiki :\nhttps://github.com/Cyan4973/xxHash/wiki/Performance-comparison#benchmarks-concentrating-on-small-data-\n\nQuality\n-------------------------\n\nSpeed is not the only property that matters.\nProduced hash values must respect excellent dispersion and randomness properties,\nso that any sub-section of it can be used to maximally spread out a table or index,\nas well as reduce the amount of collisions to the minimal theoretical level, following the [birthday paradox].\n\n`xxHash` has been tested with Austin Appleby's excellent SMHasher test suite,\nand passes all tests, ensuring reasonable quality levels.\nIt also passes extended tests from [newer forks of SMHasher], featuring additional scenarios and conditions.\n\nFinally, xxHash provides its own [massive collision tester](https://github.com/Cyan4973/xxHash/tree/dev/tests/collisions),\nable to generate and compare billions of hashes to test the limits of 64-bit hash algorithms.\nOn this front too, xxHash features good results, in line with the [birthday paradox].\nA more detailed analysis is documented [in the wiki](https://github.com/Cyan4973/xxHash/wiki/Collision-ratio-comparison).\n\n[birthday paradox]: https://en.wikipedia.org/wiki/Birthday_problem\n[newer forks of SMHasher]: https://github.com/rurban/smhasher\n\n\n### Build modifiers\n\nThe following macros can be set at compilation time to modify libxxhash's behavior. They are generally disabled by default.\n\n- `XXH_INLINE_ALL`: Make all functions `inline`, with implementations being directly included within `xxhash.h`.\n                    Inlining functions is beneficial for speed on small keys.\n                    It's _extremely effective_ when key length is expressed as _a compile time constant_,\n                    with performance improvements observed in the +200% range .\n                    See [this article](https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html) for details.\n- `XXH_PRIVATE_API`: same outcome as `XXH_INLINE_ALL`. Still available for legacy support.\n                     The name underlines that `XXH_*` symbol names will not be exported.\n- `XXH_NAMESPACE`: Prefixes all symbols with the value of `XXH_NAMESPACE`.\n                   This macro can only use compilable character set.\n                   Useful to evade symbol naming collisions,\n                   in case of multiple inclusions of xxHash's source code.\n                   Client applications still use the regular function names,\n                   as symbols are automatically translated through `xxhash.h`.\n- `XXH_FORCE_ALIGN_CHECK`: Use a faster direct read path when input is aligned.\n                           This option can result in dramatic performance improvement when input to hash is aligned on 32 or 64-bit boundaries,\n                           when running on architectures unable to load memory from unaligned addresses, or suffering a performance penalty from it.\n                           It is (slightly) detrimental on platform with good unaligned memory access performance (same instruction for both aligned and unaligned accesses).\n                           This option is automatically disabled on `x86`, `x64` and `aarch64`, and enabled on all other platforms.\n- `XXH_FORCE_MEMORY_ACCESS`: The default method `0` uses a portable `memcpy()` notation.\n                             Method `1` uses a gcc-specific `packed` attribute, which can provide better performance for some targets.\n                             Method `2` forces unaligned reads, which is not standard compliant, but might sometimes be the only way to extract better read performance.\n                             Method `3` uses a byteshift operation, which is best for old compilers which don't inline `memcpy()` or big-endian systems without a byteswap instruction.\n- `XXH_VECTOR` : manually select a vector instruction set (default: auto-selected at compilation time). Available instruction sets are `XXH_SCALAR`, `XXH_SSE2`, `XXH_AVX2`, `XXH_AVX512`, `XXH_NEON` and `XXH_VSX`. Compiler may require additional flags to ensure proper support (for example, `gcc` on linux will require `-mavx2` for `AVX2`, and `-mavx512f` for `AVX512`).\n- `XXH_NO_PREFETCH` : disable prefetching. Some platforms or situations may perform better without prefetching. XXH3 only.\n- `XXH_PREFETCH_DIST` : select prefetching distance. For close-to-metal adaptation to specific hardware platforms. XXH3 only.\n- `XXH_NO_STREAM`: Disables the streaming API, limiting it to single shot variants only.\n- `XXH_SIZE_OPT`: `0`: default, optimize for speed\n                  `1`: default for `-Os` and `-Oz`: disables some speed hacks for size optimization\n                  `2`: makes code as small as possible, performance may cry\n- `XXH_NO_INLINE_HINTS`: By default, xxHash uses `__attribute__((always_inline))` and `__forceinline` to improve performance at the cost of code size.\n                         Defining this macro to 1 will mark all internal functions as `static`, allowing the compiler to decide whether to inline a function or not.\n                         This is very useful when optimizing for smallest binary size,\n                         and is automatically defined when compiling with `-O0`, `-Os`, `-Oz`, or `-fno-inline` on GCC and Clang.\n                         This may also increase performance depending on compiler and architecture.\n- `XXH32_ENDJMP`: Switch multi-branch finalization stage of XXH32 by a single jump.\n                  This is generally undesirable for performance, especially when hashing inputs of random sizes.\n                  But depending on exact architecture and compiler, a jump might provide slightly better performance on small inputs. Disabled by default.\n- `XXH_NO_STDLIB`: Disable invocation of `<stdlib.h>` functions, notably `malloc()` and `free()`.\n                   `libxxhash`'s `XXH*_createState()` will always fail and return `NULL`.\n                   But one-shot hashing (like `XXH32()`) or streaming using statically allocated states\n                   still work as expected.\n                   This build flag is useful for embedded environments without dynamic allocation.\n- `XXH_STATIC_LINKING_ONLY`: gives access to internal state declaration, required for static allocation.\n                             Incompatible with dynamic linking, due to risks of ABI changes.\n- `XXH_NO_XXH3` : removes symbols related to `XXH3` (both 64 & 128 bits) from generated binary.\n                  Useful to reduce binary size, notably for applications which do not employ `XXH3`.\n- `XXH_NO_LONG_LONG`: removes compilation of algorithms relying on 64-bit types (`XXH3` and `XXH64`). Only `XXH32` will be compiled.\n                      Useful for targets (architectures and compilers) without 64-bit support.\n- `XXH_IMPORT`: MSVC specific: should only be defined for dynamic linking, as it prevents linkage errors.\n- `XXH_CPU_LITTLE_ENDIAN`: By default, endianness is determined by a runtime test resolved at compile time.\n                           If, for some reason, the compiler cannot simplify the runtime test, it can cost performance.\n                           It's possible to skip auto-detection and simply state that the architecture is little-endian by setting this macro to 1.\n                           Setting it to 0 states big-endian.\n- `XXH_DEBUGLEVEL` : When set to any value >= 1, enables `assert()` statements.\n                     This (slightly) slows down execution, but may help finding bugs during debugging sessions.\n\nWhen compiling the Command Line Interface `xxhsum` using `make`, the following environment variables can also be set :\n- `DISPATCH=1` : use `xxh_x86dispatch.c`, to automatically select between `scalar`, `sse2`, `avx2` or `avx512` instruction set at runtime, depending on local host. This option is only valid for `x86`/`x64` systems.\n- `XXH_1ST_SPEED_TARGET` : select an initial speed target, expressed in MB/s, for the first speed test in benchmark mode. Benchmark will adjust the target at subsequent iterations, but the first test is made \"blindly\" by targeting this speed. Currently conservatively set to 10 MB/s, to support very slow (emulated) platforms.\n- `NODE_JS=1` : When compiling `xxhsum` for Node.js with Emscripten, this links the `NODERAWFS` library for unrestricted filesystem access and patches `isatty` to make the command line utility correctly detect the terminal. This does make the binary specific to Node.js.\n\n### Building xxHash - Using vcpkg\n\nYou can download and install xxHash using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager:\n\n    git clone https://github.com/Microsoft/vcpkg.git\n    cd vcpkg\n    ./bootstrap-vcpkg.sh\n    ./vcpkg integrate install\n    ./vcpkg install xxhash\n\nThe xxHash port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository.\n\n### Example\n\nThe simplest example calls xxhash 64-bit variant as a one-shot function\ngenerating a hash value from a single buffer, and invoked from a C/C++ program:\n\n```C\n#include \"xxhash.h\"\n\n    (...)\n    XXH64_hash_t hash = XXH64(buffer, size, seed);\n}\n```\n\nStreaming variant is more involved, but makes it possible to provide data incrementally:\n\n```C\n#include \"stdlib.h\"   /* abort() */\n#include \"xxhash.h\"\n\n\nXXH64_hash_t calcul_hash_streaming(FileHandler fh)\n{\n    /* create a hash state */\n    XXH64_state_t* const state = XXH64_createState();\n    if (state==NULL) abort();\n\n    size_t const bufferSize = SOME_SIZE;\n    void* const buffer = malloc(bufferSize);\n    if (buffer==NULL) abort();\n\n    /* Initialize state with selected seed */\n    XXH64_hash_t const seed = 0;   /* or any other value */\n    if (XXH64_reset(state, seed) == XXH_ERROR) abort();\n\n    /* Feed the state with input data, any size, any number of times */\n    (...)\n    while ( /* some data left */ ) {\n        size_t const length = get_more_data(buffer, bufferSize, fh);\n        if (XXH64_update(state, buffer, length) == XXH_ERROR) abort();\n        (...)\n    }\n    (...)\n\n    /* Produce the final hash value */\n    XXH64_hash_t const hash = XXH64_digest(state);\n\n    /* State could be re-used; but in this example, it is simply freed  */\n    free(buffer);\n    XXH64_freeState(state);\n\n    return hash;\n}\n```\n\n\n### License\n\nThe library files `xxhash.c` and `xxhash.h` are BSD licensed.\nThe utility `xxhsum` is GPL licensed.\n\n\n### Other programming languages\n\nBeyond the C reference version,\nxxHash is also available from many different programming languages,\nthanks to great contributors.\nThey are [listed here](http://www.xxhash.com/#other-languages).\n\n\n### Packaging status\n\nMany distributions bundle a package manager\nwhich allows easy xxhash installation as both a `libxxhash` library\nand `xxhsum` command line interface.\n\n[![Packaging status](https://repology.org/badge/vertical-allrepos/xxhash.svg)](https://repology.org/project/xxhash/versions)\n\n\n### Special Thanks\n\n- Takayuki Matsuoka, aka @t-mat, for creating `xxhsum -c` and great support during early xxh releases\n- Mathias Westerdahl, aka @JCash, for introducing the first version of `XXH64`\n- Devin Hussey, aka @easyaspi314, for incredible low-level optimizations on `XXH3` and `XXH128`\n"
  },
  {
    "path": "src/third_party/xxHash/SECURITY.md",
    "content": "# Security Policy\n\n## Supported Versions\n\nSecurity updates are applied only to the latest release.\n\n## Reporting a Vulnerability\n\nIf you have discovered a security vulnerability in this project, please report it privately. **Do not disclose it as a public issue.** This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released.\n\nPlease disclose it at [security advisory](https://github.com/Cyan4973/xxHash/security/advisories/new).\n\nThis project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure.\n"
  },
  {
    "path": "src/third_party/xxHash/doc/README.md",
    "content": "xxHash Specification\n=======================\n\nThis directory contains material defining the xxHash algorithm.\nIt's described in [this specification document](xxhash_spec.md).\n\nThe algorithm is also be illustrated by a [simple educational library](https://github.com/easyaspi314/xxhash-clean),\nwritten by @easyaspi314 and designed for readability\n(as opposed to the reference library which is designed for speed).\n"
  },
  {
    "path": "src/third_party/xxHash/doc/xxhash.cry",
    "content": "module xxhash where\n\n/**\n * The 32-bit variant of xxHash. The first argument is the sequence\n * of L bytes to hash. The second argument is a seed value.\n */\nXXH32 : {L} (fin L) => [L][8] -> [32] -> [32]\nXXH32 input seed = XXH32_avalanche acc1\n  where (stripes16 # stripes4 # stripes1) = input\n        accR = foldl XXH32_rounds (XXH32_init seed) (split stripes16 : [L/16][16][8])\n        accL = `(L % 2^^32) + if (`L:Integer) < 16\n                              then seed + PRIME32_5\n                              else XXH32_converge accR\n        acc4 = foldl XXH32_digest4 accL (split stripes4 : [(L%16)/4][4][8])\n        acc1 = foldl XXH32_digest1 acc4 (stripes1 : [L%4][8])\n\n/**\n * The 64-bit variant of xxHash. The first argument is the sequence\n * of L bytes to hash. The second argument is a seed value.\n */\nXXH64 : {L} (fin L) => [L][8] -> [64] -> [64]\nXXH64 input seed = XXH64_avalanche acc1\n  where (stripes32 # stripes8 # stripes4 # stripes1) = input\n        accR = foldl XXH64_rounds (XXH64_init seed) (split stripes32 : [L/32][32][8])\n        accL = `(L % 2^^64) + if (`L:Integer) < 32\n                              then seed + PRIME64_5\n                              else XXH64_converge accR\n        acc8 = foldl XXH64_digest8 accL (split stripes8 : [(L%32)/8][8][8])\n        acc4 = foldl XXH64_digest4 acc8 (split stripes4 : [(L%8)/4][4][8])\n        acc1 = foldl XXH64_digest1 acc4 (stripes1 : [L%4][8])\n\nprivate\n\n  //Utility functions\n\n  /**\n   * Combines a sequence of bytes into a word using the little-endian\n   * convention.\n   */\n  toLE bytes = join (reverse bytes)\n\n  //32-bit xxHash helper functions\n\n  //32-bit prime number constants\n  PRIME32_1 = 0x9E3779B1 : [32]\n  PRIME32_2 = 0x85EBCA77 : [32]\n  PRIME32_3 = 0xC2B2AE3D : [32]\n  PRIME32_4 = 0x27D4EB2F : [32]\n  PRIME32_5 = 0x165667B1 : [32]\n\n  /**\n   * The property shows that the hexadecimal representation of the\n   * PRIME32 constants is the same as the binary representation.\n   */\n  property PRIME32s_as_bits_correct =\n    (PRIME32_1 == 0b10011110001101110111100110110001) /\\\n    (PRIME32_2 == 0b10000101111010111100101001110111) /\\\n    (PRIME32_3 == 0b11000010101100101010111000111101) /\\\n    (PRIME32_4 == 0b00100111110101001110101100101111) /\\\n    (PRIME32_5 == 0b00010110010101100110011110110001)\n\n  /**\n   * This function initializes the four internal accumulators of XXH32.\n   */\n  XXH32_init : [32] -> [4][32]\n  XXH32_init seed = [acc1, acc2, acc3, acc4]\n    where acc1 = seed + PRIME32_1 + PRIME32_2\n          acc2 = seed + PRIME32_2\n          acc3 = seed + 0\n          acc4 = seed - PRIME32_1\n\n  /**\n   * This processes a single lane of the main round function of XXH32.\n   */\n  XXH32_round : [32] -> [32] -> [32]\n  XXH32_round accN laneN = ((accN + laneN * PRIME32_2) <<< 13) * PRIME32_1\n\n  /**\n   * This is the main round function of XXH32 and processes a stripe,\n   * i.e. 4 lanes with 4 bytes each.\n   */\n  XXH32_rounds : [4][32] -> [16][8] -> [4][32]\n  XXH32_rounds accs stripe =\n    [ XXH32_round accN (toLE laneN) | accN <- accs | laneN <- split stripe ]\n\n  /**\n   * This function combines the four lane accumulators into a single\n   * 32-bit value.\n   */\n  XXH32_converge : [4][32] -> [32]\n  XXH32_converge [acc1, acc2, acc3, acc4] =\n    (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18)\n\n  /**\n   * This function digests a four byte lane\n   */\n  XXH32_digest4 : [32] -> [4][8] -> [32]\n  XXH32_digest4 acc lane = ((acc + toLE lane * PRIME32_3) <<< 17) * PRIME32_4\n\n  /**\n   * This function digests a single byte lane\n   */\n  XXH32_digest1 : [32] -> [8] -> [32]\n  XXH32_digest1 acc lane = ((acc + (0 # lane) * PRIME32_5) <<< 11) * PRIME32_1\n\n  /**\n   * This function ensures that all input bits have a chance to impact\n   * any bit in the output digest, resulting in an unbiased\n   * distribution.\n   */\n  XXH32_avalanche : [32] -> [32]\n  XXH32_avalanche acc0 = acc5\n    where acc1 = acc0 ^ (acc0 >> 15)\n          acc2 = acc1 * PRIME32_2\n          acc3 = acc2 ^ (acc2 >> 13)\n          acc4 = acc3 * PRIME32_3\n          acc5 = acc4 ^ (acc4 >> 16)\n\n  //64-bit xxHash helper functions\n\n  //64-bit prime number constants\n  PRIME64_1 = 0x9E3779B185EBCA87 : [64]\n  PRIME64_2 = 0xC2B2AE3D27D4EB4F : [64]\n  PRIME64_3 = 0x165667B19E3779F9 : [64]\n  PRIME64_4 = 0x85EBCA77C2B2AE63 : [64]\n  PRIME64_5 = 0x27D4EB2F165667C5 : [64]\n\n  /**\n   * The property shows that the hexadecimal representation of the\n   * PRIME64 constants is the same as the binary representation.\n   */\n  property PRIME64s_as_bits_correct =\n    (PRIME64_1 == 0b1001111000110111011110011011000110000101111010111100101010000111) /\\\n    (PRIME64_2 == 0b1100001010110010101011100011110100100111110101001110101101001111) /\\\n    (PRIME64_3 == 0b0001011001010110011001111011000110011110001101110111100111111001) /\\\n    (PRIME64_4 == 0b1000010111101011110010100111011111000010101100101010111001100011) /\\\n    (PRIME64_5 == 0b0010011111010100111010110010111100010110010101100110011111000101)\n\n  /**\n   * This function initializes the four internal accumulators of XXH64.\n   */\n  XXH64_init : [64] -> [4][64]\n  XXH64_init seed = [acc1, acc2, acc3, acc4]\n    where acc1 = seed + PRIME64_1 + PRIME64_2\n          acc2 = seed + PRIME64_2\n          acc3 = seed + 0\n          acc4 = seed - PRIME64_1\n\n  /**\n   * This processes a single lane of the main round function of XXH64.\n   */\n  XXH64_round : [64] -> [64] -> [64]\n  XXH64_round accN laneN = ((accN + laneN * PRIME64_2) <<< 31) * PRIME64_1\n\n  /**\n   * This is the main round function of XXH64 and processes a stripe,\n   * i.e. 4 lanes with 8 bytes each.\n   */\n  XXH64_rounds : [4][64] -> [32][8] -> [4][64]\n  XXH64_rounds accs stripe =\n    [ XXH64_round accN (toLE laneN) | accN <- accs | laneN <- split stripe ]\n\n  /**\n   * This is a helper function, used to merge the four lane accumulators.\n   */\n  mergeAccumulator : [64] -> [64] -> [64]\n  mergeAccumulator acc accN = (acc ^ XXH64_round 0 accN) * PRIME64_1 + PRIME64_4\n\n  /**\n   * This function combines the four lane accumulators into a single\n   * 64-bit value.\n   */\n  XXH64_converge : [4][64] -> [64]\n  XXH64_converge [acc1, acc2, acc3, acc4] =\n    foldl mergeAccumulator ((acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18)) [acc1, acc2, acc3, acc4]\n\n  /**\n   * This function digests an eight byte lane\n   */\n  XXH64_digest8 : [64] -> [8][8] -> [64]\n  XXH64_digest8 acc lane = ((acc ^ XXH64_round 0 (toLE lane)) <<< 27) * PRIME64_1 + PRIME64_4\n\n  /**\n   * This function digests a four byte lane\n   */\n  XXH64_digest4 : [64] -> [4][8] -> [64]\n  XXH64_digest4 acc lane = ((acc ^ (0 # toLE lane) * PRIME64_1) <<< 23) * PRIME64_2 + PRIME64_3\n\n  /**\n   * This function digests a single byte lane\n   */\n  XXH64_digest1 : [64] -> [8] -> [64]\n  XXH64_digest1 acc lane = ((acc ^ (0 # lane) * PRIME64_5) <<< 11) * PRIME64_1\n\n  /**\n   * This function ensures that all input bits have a chance to impact\n   * any bit in the output digest, resulting in an unbiased\n   * distribution.\n   */\n  XXH64_avalanche : [64] -> [64]\n  XXH64_avalanche acc0 = acc5\n    where acc1 = acc0 ^ (acc0 >> 33)\n          acc2 = acc1 * PRIME64_2\n          acc3 = acc2 ^ (acc2 >> 29)\n          acc4 = acc3 * PRIME64_3\n          acc5 = acc4 ^ (acc4 >> 32)\n"
  },
  {
    "path": "src/third_party/xxHash/doc/xxhash_spec.md",
    "content": "xxHash fast digest algorithm\n======================\n\n### Notices\n\nCopyright (c) Yann Collet\n\nPermission is granted to copy and distribute this document\nfor any purpose and without charge,\nincluding translations into other languages\nand incorporation into compilations,\nprovided that the copyright notice and this notice are preserved,\nand that any substantive changes or deletions from the original\nare clearly marked.\nDistribution of this document is unlimited.\n\n### Version\n\n0.2.0 (29/06/23)\n\n\nTable of Contents\n---------------------\n- [Introduction](#introduction)\n- [XXH32 algorithm description](#xxh32-algorithm-description)\n- [XXH64 algorithm description](#xxh64-algorithm-description)\n- [XXH3 algorithm description](#xxh3-algorithm-overview)\n   - [Small inputs](#xxh3-algorithm-description-for-small-inputs)\n   - [Medium inputs](#xxh3-algorithm-description-for-medium-inputs)\n   - [Large inputs](#xxh3-algorithm-description-for-large-inputs)\n- [Performance considerations](#performance-considerations)\n- [Reference Implementation](#reference-implementation)\n\n\nIntroduction\n----------------\n\nThis document describes the xxHash digest algorithm for both 32-bit and 64-bit variants, named `XXH32` and `XXH64`. The algorithm takes an input a message of arbitrary length and an optional seed value, then produces an output of 32 or 64-bit as \"fingerprint\" or \"digest\".\n\nxxHash is primarily designed for speed. It is labeled non-cryptographic, and is not meant to avoid intentional collisions (same digest for 2 different messages), or to prevent producing a message with a predefined digest.\n\nXXH32 is designed to be fast on 32-bit machines.\nXXH64 is designed to be fast on 64-bit machines.\nBoth variants produce different output.\nHowever, a given variant shall produce exactly the same output, irrespective of the cpu / os used. In particular, the result remains identical whatever the endianness and width of the cpu is.\n\n### Operation notations\n\nAll operations are performed modulo {32,64} bits. Arithmetic overflows are expected.\n`XXH32` uses 32-bit modular operations.\n`XXH64` and `XXH3` use 64-bit modular operations.\nWhen an operation ingests input or secret as multi-bytes values, it reads it using little-endian convention.\n\n- `+`: denotes modular addition\n- `-`: denotes modular subtraction\n- `*`: denotes modular multiplication\n    - **Exception:** In `XXH3`, if it is in the form `(u128)x * (u128)y`, it denotes 64-bit by 64-bit normal multiplication into a full 128-bit result.\n- `X <<< s`: denotes the value obtained by circularly shifting (rotating) `X` left by `s` bit positions.\n- `X >> s`: denotes the value obtained by shifting `X` right by s bit positions. Upper `s` bits become `0`.\n- `X << s`: denotes the value obtained by shifting `X` left by s bit positions. Lower `s` bits become `0`.\n- `X xor Y`: denotes the bit-wise XOR of `X` and `Y` (same width).\n- `X | Y`: denotes the bit-wise OR of `X` and `Y` (same width).\n- `~X`: denotes the bit-wise negation of `X`.\n\n\nXXH32 Algorithm Description\n-------------------------------------\n\n### Overview\n\nWe begin by supposing that we have a message of any length `L` as input, and that we wish to find its digest. Here `L` is an arbitrary nonnegative integer; `L` may be zero. The following steps are performed to compute the digest of the message.\n\nThe algorithm collect and transform input in _stripes_ of 16 bytes. The transforms are stored inside 4 \"accumulators\", each one storing an unsigned 32-bit value. Each accumulator can be processed independently in parallel, speeding up processing for cpu with multiple execution units.\n\nThe algorithm uses 32-bits addition, multiplication, rotate, shift and xor operations. Many operations require some 32-bits prime number constants, all defined below:\n\n```c\n  static const u32 PRIME32_1 = 0x9E3779B1U;  // 0b10011110001101110111100110110001\n  static const u32 PRIME32_2 = 0x85EBCA77U;  // 0b10000101111010111100101001110111\n  static const u32 PRIME32_3 = 0xC2B2AE3DU;  // 0b11000010101100101010111000111101\n  static const u32 PRIME32_4 = 0x27D4EB2FU;  // 0b00100111110101001110101100101111\n  static const u32 PRIME32_5 = 0x165667B1U;  // 0b00010110010101100110011110110001\n```\n\nThese constants are prime numbers, and feature a good mix of bits 1 and 0, neither too regular, nor too dissymmetric. These properties help dispersion capabilities.\n\n### Step 1. Initialize internal accumulators\n\nEach accumulator gets an initial value based on optional `seed` input. Since the `seed` is optional, it can be `0`.\n\n```c\n  u32 acc1 = seed + PRIME32_1 + PRIME32_2;\n  u32 acc2 = seed + PRIME32_2;\n  u32 acc3 = seed + 0;\n  u32 acc4 = seed - PRIME32_1;\n```\n\n#### Special case: input is less than 16 bytes\n\nWhen the input is too small (< 16 bytes), the algorithm will not process any stripes. Consequently, it will not make use of parallel accumulators.\n\nIn this case, a simplified initialization is performed, using a single accumulator:\n\n```c\n  u32 acc  = seed + PRIME32_5;\n```\n\nThe algorithm then proceeds directly to step 4.\n\n### Step 2. Process stripes\n\nA stripe is a contiguous segment of 16 bytes.\nIt is evenly divided into 4 _lanes_, of 4 bytes each.\nThe first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on.\n\nEach lane read its associated 32-bit value using __little-endian__ convention.\n\nFor each {lane, accumulator}, the update process is called a _round_, and applies the following formula:\n\n```c\n  accN = accN + (laneN * PRIME32_2);\n  accN = accN <<< 13;\n  accN = accN * PRIME32_1;\n```\n\nThis shuffles the bits so that any bit from input _lane_ impacts several bits in output _accumulator_. All operations are performed modulo 2^32.\n\nInput is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume the whole input, except for the last remaining bytes which cannot form a stripe (< 16 bytes).\nWhen that happens, move to step 3.\n\n### Step 3. Accumulator convergence\n\nAll 4 lane accumulators from the previous steps are merged to produce a single remaining accumulator of the same width (32-bit). The associated formula is as follows:\n\n```c\n  acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18);\n```\n\n### Step 4. Add input length\n\nThe input total length is presumed known at this stage. This step is just about adding the length to accumulator, so that it participates to final mixing.\n\n```c\n  acc = acc + (u32)inputLength;\n```\n\nNote that, if input length is so large that it requires more than 32-bits, only the lower 32-bits are added to the accumulator.\n\n### Step 5. Consume remaining input\n\nThere may be up to 15 bytes remaining to consume from the input.\nThe final stage will digest them according to following pseudo-code:\n\n```c\n  while (remainingLength >= 4) {\n      lane = read_32bit_little_endian(input_ptr);\n      acc = acc + lane * PRIME32_3;\n      acc = (acc <<< 17) * PRIME32_4;\n      input_ptr += 4; remainingLength -= 4;\n  }\n\n  while (remainingLength >= 1) {\n      lane = read_byte(input_ptr);\n      acc = acc + lane * PRIME32_5;\n      acc = (acc <<< 11) * PRIME32_1;\n      input_ptr += 1; remainingLength -= 1;\n  }\n```\n\nThis process ensures that all input bytes are present in the final mix.\n\n### Step 6. Final mix (avalanche)\n\nThe final mix ensures that all input bits have a chance to impact any bit in the output digest, resulting in an unbiased distribution. This is also called avalanche effect.\n\n```c\n  acc = acc xor (acc >> 15);\n  acc = acc * PRIME32_2;\n  acc = acc xor (acc >> 13);\n  acc = acc * PRIME32_3;\n  acc = acc xor (acc >> 16);\n```\n\n### Step 7. Output\n\nThe `XXH32()` function produces an unsigned 32-bit value as output.\n\nFor systems which require to store and/or display the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence follows __big-endian__ convention (most significant byte first).\n\n\nXXH64 Algorithm Description\n-------------------------------------\n\n### Overview\n\n`XXH64`'s algorithm structure is very similar to `XXH32` one. The major difference is that `XXH64` uses 64-bit arithmetic, speeding up memory transfer for 64-bit compliant systems, but also relying on cpu capability to efficiently perform 64-bit operations.\n\nThe algorithm collects and transforms input in _stripes_ of 32 bytes. The transforms are stored inside 4 \"accumulators\", each one storing an unsigned 64-bit value. Each accumulator can be processed independently in parallel, speeding up processing for cpu with multiple execution units.\n\nThe algorithm uses 64-bit addition, multiplication, rotate, shift and xor operations. Many operations require some 64-bit prime number constants, all defined below:\n\n```c\n  static const u64 PRIME64_1 = 0x9E3779B185EBCA87ULL;  // 0b1001111000110111011110011011000110000101111010111100101010000111\n  static const u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL;  // 0b1100001010110010101011100011110100100111110101001110101101001111\n  static const u64 PRIME64_3 = 0x165667B19E3779F9ULL;  // 0b0001011001010110011001111011000110011110001101110111100111111001\n  static const u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL;  // 0b1000010111101011110010100111011111000010101100101010111001100011\n  static const u64 PRIME64_5 = 0x27D4EB2F165667C5ULL;  // 0b0010011111010100111010110010111100010110010101100110011111000101\n```\n\nThese constants are prime numbers, and feature a good mix of bits 1 and 0, neither too regular, nor too dissymmetric. These properties help dispersion capabilities.\n\n### Step 1. Initialize internal accumulators\n\nEach accumulator gets an initial value based on optional `seed` input. Since the `seed` is optional, it can be `0`.\n\n```c\n  u64 acc1 = seed + PRIME64_1 + PRIME64_2;\n  u64 acc2 = seed + PRIME64_2;\n  u64 acc3 = seed + 0;\n  u64 acc4 = seed - PRIME64_1;\n```\n\n#### Special case: input is less than 32 bytes\n\nWhen the input is too small (< 32 bytes), the algorithm will not process any stripes. Consequently, it will not make use of parallel accumulators.\n\nIn this case, a simplified initialization is performed, using a single accumulator:\n\n```c\n  u64 acc  = seed + PRIME64_5;\n```\n\nThe algorithm then proceeds directly to step 4.\n\n### Step 2. Process stripes\n\nA stripe is a contiguous segment of 32 bytes.\nIt is evenly divided into 4 _lanes_, of 8 bytes each.\nThe first lane is used to update accumulator 1, the second lane is used to update accumulator 2, and so on.\n\nEach lane read its associated 64-bit value using __little-endian__ convention.\n\nFor each {lane, accumulator}, the update process is called a _round_, and applies the following formula:\n\n```c\nround(accN,laneN):\n  accN = accN + (laneN * PRIME64_2);\n  accN = accN <<< 31;\n  return accN * PRIME64_1;\n```\n\nThis shuffles the bits so that any bit from input _lane_ impacts several bits in output _accumulator_. All operations are performed modulo 2^64.\n\nInput is consumed one full stripe at a time. Step 2 is looped as many times as necessary to consume the whole input, except for the last remaining bytes which cannot form a stripe (< 32 bytes).\nWhen that happens, move to step 3.\n\n### Step 3. Accumulator convergence\n\nAll 4 lane accumulators from previous steps are merged to produce a single remaining accumulator of same width (64-bit). The associated formula is as follows.\n\nNote that accumulator convergence is more complex than 32-bit variant, and requires to define another function called _mergeAccumulator()_:\n\n```c\nmergeAccumulator(acc,accN):\n  acc  = acc xor round(0, accN);\n  acc  = acc * PRIME64_1;\n  return acc + PRIME64_4;\n```\n\nwhich is then used in the convergence formula:\n\n```c\n  acc = (acc1 <<< 1) + (acc2 <<< 7) + (acc3 <<< 12) + (acc4 <<< 18);\n  acc = mergeAccumulator(acc, acc1);\n  acc = mergeAccumulator(acc, acc2);\n  acc = mergeAccumulator(acc, acc3);\n  acc = mergeAccumulator(acc, acc4);\n```\n\n### Step 4. Add input length\n\nThe input total length is presumed known at this stage. This step is just about adding the length to accumulator, so that it participates to final mixing.\n\n```c\n  acc = acc + inputLength;\n```\n\n### Step 5. Consume remaining input\n\nThere may be up to 31 bytes remaining to consume from the input.\nThe final stage will digest them according to following pseudo-code:\n\n```c\n  while (remainingLength >= 8) {\n      lane = read_64bit_little_endian(input_ptr);\n      acc = acc xor round(0, lane);\n      acc = (acc <<< 27) * PRIME64_1;\n      acc = acc + PRIME64_4;\n      input_ptr += 8; remainingLength -= 8;\n  }\n\n  if (remainingLength >= 4) {\n      lane = read_32bit_little_endian(input_ptr);\n      acc = acc xor (lane * PRIME64_1);\n      acc = (acc <<< 23) * PRIME64_2;\n      acc = acc + PRIME64_3;\n      input_ptr += 4; remainingLength -= 4;\n  }\n\n  while (remainingLength >= 1) {\n      lane = read_byte(input_ptr);\n      acc = acc xor (lane * PRIME64_5);\n      acc = (acc <<< 11) * PRIME64_1;\n      input_ptr += 1; remainingLength -= 1;\n  }\n```\n\nThis process ensures that all input bytes are present in the final mix.\n\n### Step 6. Final mix (avalanche)\n\nThe final mix ensures that all input bits have a chance to impact any bit in the output digest, resulting in an unbiased distribution. This is also called avalanche effect.\n\n```c\n  acc = acc xor (acc >> 33);\n  acc = acc * PRIME64_2;\n  acc = acc xor (acc >> 29);\n  acc = acc * PRIME64_3;\n  acc = acc xor (acc >> 32);\n```\n\n### Step 7. Output\n\nThe `XXH64()` function produces an unsigned 64-bit value as output.\n\nFor systems which require to store and/or display the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence follows __big-endian__ convention (most significant byte first).\n\nXXH3 Algorithm Overview\n-------------------------------------\n\nXXH3 comes in two different versions: XXH3-64 and XXH3-128 (or XXH128), producing 64 and 128 bits of output, respectively.\n\nXXH3 uses different algorithms for small (0-16 bytes), medium (17-240 bytes), and large (241+ bytes) inputs. The algorithms for small and medium inputs are optimized for performance. The three algorithms are described in the following sections.\n\nMany operations require some 64-bit prime number constants, which are mostly the same constants used in XXH32 and XXH64, all defined below:\n\n```c\n  static const u64 PRIME32_1 = 0x9E3779B1U;  // 0b10011110001101110111100110110001\n  static const u64 PRIME32_2 = 0x85EBCA77U;  // 0b10000101111010111100101001110111\n  static const u64 PRIME32_3 = 0xC2B2AE3DU;  // 0b11000010101100101010111000111101\n  static const u64 PRIME64_1 = 0x9E3779B185EBCA87ULL;  // 0b1001111000110111011110011011000110000101111010111100101010000111\n  static const u64 PRIME64_2 = 0xC2B2AE3D27D4EB4FULL;  // 0b1100001010110010101011100011110100100111110101001110101101001111\n  static const u64 PRIME64_3 = 0x165667B19E3779F9ULL;  // 0b0001011001010110011001111011000110011110001101110111100111111001\n  static const u64 PRIME64_4 = 0x85EBCA77C2B2AE63ULL;  // 0b1000010111101011110010100111011111000010101100101010111001100011\n  static const u64 PRIME64_5 = 0x27D4EB2F165667C5ULL;  // 0b0010011111010100111010110010111100010110010101100110011111000101\n  static const u64 PRIME_MX1 = 0x165667919E3779F9ULL;  // 0b0001011001010110011001111001000110011110001101110111100111111001\n  static const u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL;  // 0b1001111110110010000111000110010100011110100110001101111100100101\n```\n\nThe `XXH3_64bits()` function produces an unsigned 64-bit value.\nThe `XXH3_128bits()` function produces a `XXH128_hash_t` struct containing `low64` and `high64` - the lower and higher 64-bit half values of the result, respectively.\n\nFor systems requiring storing and/or displaying the result in binary or hexadecimal format, the canonical format is defined to reproduce the same value as the natural decimal format, hence following **big-endian** convention (most significant byte first).\n\n### Seed and Secret\n\nXXH3 provides seeded hashing by introducing two configurable constants used in the hashing process: the seed and the secret. The seed is an unsigned 64-bit value, and the secret is an array of bytes that is at least 136 bytes in size. The default seed is 0, and the default secret is the following 192-byte value:\n\n```c\nstatic const u8 defaultSecret[192] = {\n  0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c,\n  0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f,\n  0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21,\n  0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c,\n  0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3,\n  0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8,\n  0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d,\n  0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64,\n  0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb,\n  0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e,\n  0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce,\n  0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e,\n};\n```\n\nThe seed and the secret can be optionally specified using the `*_withSecret` and `*_withSeed` versions of the hash function.\n\nThe seed and the secret cannot be specified simultaneously (`*_withSecretAndSeed` is actually `*_withSeed` for short and medium inputs <= 240 bytes, and `*_withSecret` for large inputs). When one is specified, the other one uses the default value.\nThere is one exception though: when input is large (> 240 bytes) and a seed is given, a secret is derived from the seed value and the default secret using the following procedure:\n\n```c\nderiveSecret(u64 seed):\n  u64 derivedSecret[24] = defaultSecret[0:192];\n  for (i = 0; i < 12; i++) {\n    derivedSecret[i*2] += seed;\n    derivedSecret[i*2+1] -= seed;\n  }\n  return derivedSecret; // convert to u8[192] (little-endian)\n```\n\nThe derivation treats the secrets as 24 64-bit values. In XXH3 algorithms, the secret is always read similarly by treating a contiguous segment of the array as one or more 32-bit or 64-bit values. **The secret values are always read using little-endian convention**.\n\n### Final Mixing Step (avalanche)\n\nTo make sure that all input bits have a chance to impact any bit in the output digest (avalanche effect), the final step of the XXH3 algorithm is usually one of the two fixed operations that mix the bits in a 64-bit value. These operations are denoted `avalanche()` and `avalanche_XXH64()` in the following XXH3 description.\n\n```c\navalanche(u64 x):\n  x = x xor (x >> 37);\n  x = x * PRIME_MX1;\n  x = x xor (x >> 32);\n  return x;\n\navalanche_XXH64(u64 x):\n  x = x xor (x >> 33);\n  x = x * PRIME64_2;\n  x = x xor (x >> 29);\n  x = x * PRIME64_3;\n  x = x xor (x >> 32);\n  return x;\n```\n\nXXH3 Algorithm Description (for small inputs)\n-------------------------------------\n\nThe algorithm for small inputs (0-16 bytes of input) is further divided into 4 cases: empty, 1-3 bytes, 4-8 bytes, and 9-16 bytes of input.\n\nThe algorithm uses byte-swap operations. The byte-swap operation reverses the byte order in a 32-bit or 64-bit value. It is denoted `bswap32` and `bswap64` for its 32-bit and 64-bit versions, respectively.\n\n### Empty input\n\nThe hash of empty input is calculated from the seed and a segment of the secret:\n\n```c\nXXH3_64_empty():\n  u64 secretWords[2] = secret[56:72];\n  return avalanche_XXH64(seed xor secretWords[0] xor secretWords[1]);\n\nXXH3_128_empty():\n  u64 secretWords[4] = secret[64:96];\n  return {avalanche_XXH64(seed xor secretWords[0] xor secretWords[1]), // lower half\n          avalanche_XXH64(seed xor secretWords[2] xor secretWords[3])}; // higher half\n```\n\n### 1-3 bytes of input\n\nThe algorithm starts from a single 32-bit value combining the input bytes and its length:\n\n```c\nu32 combined = (u32)input[inputLength-1] | ((u32)inputLength << 8) |\n               ((u32)input[0] << 16) | ((u32)input[inputLength>>1] << 24);\n// LSB          8       16           24                    MSB\n//  | last byte | length | first byte | middle-or-last byte |\n```\n\nThen the final output is calculated from the value and the first 8 bytes (XXH3-64) or 16 bytes (XXH3-128) of the secret to produce the final result. The secret here is read as 32-bit values instead of the usual 64-bit values.\n\n```c\nXXH3_64_1to3():\n  u32 secretWords[2] = secret[0:8];\n  u64 value = ((u64)(secretWords[0] xor secretWords[1]) + seed) xor (u64)combined;\n  return avalanche_XXH64(value);\n\nXXH3_128_1to3():\n  u32 secretWords[4] = secret[0:16];\n  u64 low = ((u64)(secretWords[0] xor secretWords[1]) + seed) xor (u64)combined;\n  u64 high = ((u64)(secretWords[2] xor secretWords[3]) - seed) xor (u64)(bswap32(combined) <<< 13);\n  // note that the bswap32(combined) <<< 13 above is 32-bit rotate\n  return {avalanche_XXH64(low), // lower half\n          avalanche_XXH64(high)}; // higher half\n```\n\nNote that the XXH3-64 result is the lower half of XXH3-128 result.\n\n### 4-8 bytes of input\n\nThe algorithm starts from reading the first and last 4 bytes of the input as little-endian 32-bit values, and a modified seed:\n\n```c\nu32 inputFirst = input[0:4];\nu32 inputLast = input[inputLength-4:inputLength];\nu64 modifiedSeed = seed xor ((u64)bswap32((u32)lowerHalf(seed)) << 32);\n```\n\nAgain, these values are combined with a segment of the secret to produce the final value.\n\n```c\nXXH3_64_4to8():\n  u64 secretWords[2] = secret[8:24];\n  u64 combined = (u64)inputLast | ((u64)inputFirst << 32);\n  u64 value = ((secretWords[0] xor secretWords[1]) - modifiedSeed) xor combined;\n  value = value xor (value <<< 49) xor (value <<< 24);\n  value = value * PRIME_MX2;\n  value = value xor ((value >> 35) + inputLength);\n  value = value * PRIME_MX2;\n  value = value xor (value >> 28);\n  return value;\n\nXXH3_128_4to8():\n  u64 secretWords[2] = secret[16:32];\n  u64 combined = (u64)inputFirst | ((u64)inputLast << 32);\n  u64 value = ((secretWords[0] xor secretWords[1]) + modifiedSeed) xor combined;\n  u128 mulResult = (u128)value * (u128)(PRIME64_1 + (inputLength << 2));\n  u64 high = higherHalf(mulResult); // mulResult >> 64\n  u64 low = lowerHalf(mulResult); // mulResult & 0xFFFFFFFFFFFFFFFF\n  high = high + (low << 1);\n  low = low xor (high >> 3);\n  low = low xor (low >> 35);\n  low = low * PRIME_MX2;\n  low = low xor (low >> 28);\n  high = avalanche(high);\n  return {low, high};\n```\n\n### 9-16 bytes of input\n\nThe algorithm starts from reading the first and last 8 bytes of the input as little-endian 64-bit values:\n\n```c\nu64 inputFirst = input[0:8];\nu64 inputLast = input[inputLength-8:inputLength];\n```\n\nOnce again, these values are combined with a segment of the secret to produce the final value.\n\n```c\nXXH3_64_9to16():\n  u64 secretWords[4] = secret[24:56];\n  u64 low = ((secretWords[0] xor secretWords[1]) + seed) xor inputFirst;\n  u64 high = ((secretWords[2] xor secretWords[3]) - seed) xor inputLast;\n  u128 mulResult = (u128)low * (u128)high;\n  u64 value = inputLength + bswap64(low) + high + (u64)(lowerHalf(mulResult) xor higherHalf(mulResult));\n  return avalanche(value);\n\nXXH3_128_9to16():\n  u64 secretWords[4] = secret[32:64];\n  u64 val1 = ((secretWords[0] xor secretWords[1]) - seed) xor inputFirst xor inputLast;\n  u64 val2 = ((secretWords[2] xor secretWords[3]) + seed) xor inputLast;\n  u128 mulResult = (u128)val1 * (u128)PRIME64_1;\n  u64 low = lowerHalf(mulResult) + ((u64)(inputLength - 1) << 54);\n  u64 high = higherHalf(mulResult) + ((u64)higherHalf(val2) << 32) + (u64)lowerHalf(val2) * PRIME32_2;\n  // the above line can also be simplified to higherHalf(mulResult) + val2 + (u64)lowerHalf(val2) * (PRIME32_2 - 1);\n  low = low xor bswap64(high);\n  // the following three lines are in fact a 128x64 -> 128 multiplication ({low,high} = (u128){low,high} * PRIME64_2)\n  u128 mulResult2 = (u128)low * (u128)PRIME64_2;\n  low = lowerHalf(mulResult2);\n  high = higherHalf(mulResult2) + high * PRIME64_2;\n  return {avalanche(low), // lower half\n          avalanche(high)}; // higher half\n```\n\n\nXXH3 Algorithm Description (for medium inputs)\n-------------------------------------\n\nThis algorithm is used for medium inputs (17-240 bytes of input). Its internal hash state is stored inside 1 (XXH3-64) or 2 (XXH3-128) \"accumulators\", each storing an unsigned 64-bit value.\n\n### Step 1. Initialize internal accumulators\n\nThe accumulator(s) are initialized based on the input length.\n\n```c\n// For XXH3-64\nu64 acc = inputLength * PRIME64_1;\n\n// For XXH3-128\nu64 acc[2] = {inputLength * PRIME64_1, 0};\n```\n\n### Step 2. Process the input\n\nThis step is further divided into two cases: one for 17-128 bytes of input, and one for 129-240 bytes of input.\n\n#### Mixing operation\n\nThis step uses a mixing operation that mixes a 16-byte segment of data, a 16-byte segment of secret and the seed into a 64-bit value as a building block. This operation treat the segment of data and secret as little-endian 64-bit values.\n\n```c\nmixStep(u8 data[16], size secretOffset, u64 seed):\n  u64 dataWords[2] = data[0:16];\n  u64 secretWords[2] = secret[secretOffset:secretOffset+16];\n  u128 mulResult = (u128)(dataWords[0] xor (secretWords[0] + seed)) *\n                   (u128)(dataWords[1] xor (secretWords[1] - seed));\n  return lowerHalf(mulResult) xor higherHalf(mulResult);\n```\n\nThe mixing operation is always invoked in groups of two in XXH3-128, where two 16-byte segments of data are mixed with a 32-byte segment of secret, and the accumulators are updated accordingly.\n\n```c\nmixTwoChunks(u8 data1[16], u8 data2[16], size secretOffset, u64 seed):\n  u64 dataWords1[2] = data1[0:16]; // again, little-endian conversion\n  u64 dataWords2[2] = data2[0:16];\n  acc[0] = acc[0] + mixStep(data1, secretOffset, seed);\n  acc[1] = acc[1] + mixStep(data2, secretOffset + 16, seed);\n  acc[0] = acc[0] xor (dataWords2[0] + dataWords2[1]);\n  acc[1] = acc[1] xor (dataWords1[0] + dataWords1[1]);\n```\n\nThe input is split into several 16-byte chunks and mixed, and the result is added to the accumulator(s).\n\n#### 17-128 bytes of input\n\nThe input is read as *N* 16-byte chunks starting from the beginning and *N* chunks starting from the end, where *N* is the smallest number that these 2*N* chunks cover the whole input. These chunks are paired up and mixed, and the results are accumulated to the accumulator(s).\n\n```c\n// the loop variable `i` should be signed to avoid underflow in implementation\nprocessInput_XXH3_64_17to128():\n  u64 numRounds = ((inputLength - 1) >> 5) + 1;\n  for (i = numRounds - 1; i >= 0; i--) {\n    size offsetStart = i*16;\n    size offsetEnd = inputLength - i*16 - 16;\n    acc += mixStep(input[offsetStart:offsetStart+16], i*32, seed);\n    acc += mixStep(input[offsetEnd:offsetEnd+16], i*32+16, seed);\n  }\n\nprocessInput_XXH3_128_17to128():\n  u64 numRounds = ((inputLength - 1) >> 5) + 1;\n  for (i = numRounds - 1; i >= 0; i--) {\n    size offsetStart = i*16;\n    size offsetEnd = inputLength - i*16 - 16;\n    mixTwoChunks(input[offsetStart:offsetStart+16], input[offsetEnd:offsetEnd+16], i*32, seed);\n  }\n```\n\n#### 129-240 bytes of input\n\nThe input is split into 16-byte (XXH3-64) or 32-byte (XXH3-128) chunks. The first 128 bytes are first mixed chunk by chunk, followed by an intermediate avalanche operation. Then the remaining full chunks are processed, and finally the last 16/32 bytes are treated as a chunk to process.\n\n```c\nprocessInput_XXH3_64_129to240():\n  u64 numChunks = inputLength >> 4;\n  for (i = 0; i < 8; i++) {\n    acc += mixStep(input[i*16:i*16+16], i*16, seed);\n  }\n  acc = avalanche(acc);\n  for (i = 8; i < numChunks; i++) {\n    acc += mixStep(input[i*16:i*16+16], (i-8)*16 + 3, seed);\n  }\n  acc += mixStep(input[inputLength-16:inputLength], 119, seed);\n\nprocessInput_XXH3_128_129to240():\n  u64 numChunks = inputLength >> 5;\n  for (i = 0; i < 4; i++) {\n    mixTwoChunks(input[i*32:i*32+16], input[i*32+16:i*32+32], i*32, seed);\n  }\n  acc[0] = avalanche(acc[0]);\n  acc[1] = avalanche(acc[1]);\n  for (i = 4; i < numChunks; i++) {\n    mixTwoChunks(input[i*32:i*32+16], input[i*32+16:i*32+32], (i-4)*32 + 3, seed);\n  }\n  // note that the half-chunk order and the seed is different here\n  mixTwoChunks(input[inputLength-16:inputLength], input[inputLength-32:inputLength-16], 103, (u64)0 - seed);\n```\n\n### Step 3. Finalization\n\nThe final result is extracted from the accumulator(s).\n\n```c\nXXH3_64_17to240():\n  return avalanche(acc);\n\nXXH3_128_17to240():\n  u64 low = acc[0] + acc[1];\n  u64 high = (acc[0] * PRIME64_1) + (acc[1] * PRIME64_4) + (((u64)inputLength - seed) * PRIME64_2);\n  return {avalanche(low), // lower half\n          (u64)0 - avalanche(high)}; // higher half\n```\n\nXXH3 Algorithm Description (for large inputs)\n-------------------------------------\n\nThis algorithm is used for inputs larger than 240 bytes. The internal hash state is stored inside 8 \"accumulators\", each one storing an unsigned 64-bit value.\n\n### Step 1. Initialize internal accumulators\n\nThe accumulators are initialized to fixed constants:\n\n```c\nu64 acc[8] = {\n  PRIME32_3, PRIME64_1, PRIME64_2, PRIME64_3,\n  PRIME64_4, PRIME32_2, PRIME64_5, PRIME32_1};\n```\n\n### Step 2. Process blocks\n\nThe input is consumed and processed one full block at a time. The size of the block depends on the length of the secret. Specifically, a block consists of several 64-byte stripes. The number of stripes per block is `floor((secretLength-64)/8)` . For the default 192-byte secret, there are 16 stripes in a block, and thus the block size is 1024 bytes.\n\n```c\nsecretLength = lengthInBytes(secret);    // default 192; at least 136\nstripesPerBlock = (secretLength-64) / 8; // default 16; at least 9\nblockSize = 64 * stripesPerBlock;        // default 1024; at least 576\n```\n\nThe process of processing a full block is called a *round*. It consists of the following two sub-steps:\n\n#### Step 2-1. Process stripes in the block\n\nA stripe is evenly divided into 8 lanes, of 8 bytes each. In an accumulation step, one stripe and a 64-byte contiguous segment of the secret are used to update the accumulators. Each lane reads its associated 64-bit value using little-endian convention.\n\nThe accumulation step applies the following procedure:\n\n```c\naccumulate(u64 stripe[8], size secretOffset):\n  u64 secretWords[8] = secret[secretOffset:secretOffset+64];\n  for (i = 0; i < 8; i++) {\n    u64 value = stripe[i] xor secretWords[i];\n    acc[i xor 1] = acc[i xor 1] + stripe[i];\n    acc[i] = acc[i] + (u64)lowerHalf(value) * (u64)higherHalf(value);\n                      // (value and 0xFFFFFFFF) * (value >> 32)\n  }\n```\n\nThe accumulation step is repeated for all stripes in a block, using different segments of the secret, starting from the first 64 bytes for the first stripe, and offset by 8 bytes for each following round:\n\n```c\nround_accumulate(u8 block[blockSize]):\n  for (n = 0; n < stripesPerBlock; n++) {\n    u64 stripe[8] = block[n*64:n*64+64]; // 64 bytes = 8 u64s\n    accumulate(stripe, n*8);\n  }\n```\n\n#### Step 2-2. Scramble accumulators\n\nAfter the accumulation steps are finished for all stripes in the block, the accumulators are scrambled using the last 64 bytes of the secret.\n\n```c\nround_scramble():\n  u64 secretWords[8] = secret[secretLength-64:secretLength];\n  for (i = 0; i < 8; i++) {\n    acc[i] = acc[i] xor (acc[i] >> 47);\n    acc[i] = acc[i] xor secretWords[i];\n    acc[i] = acc[i] * PRIME32_1;\n  }\n```\n\nA round is thus a `round_accumulate` followed by a `round_scramble`:\n\n```c\nround(u8 block[blockSize]):\n  round_accumulate(block);\n  round_scramble();\n```\n\nStep 2 is looped to consume the input until there are less than or equal to `blockSize` bytes of input left. Note that we leave the last block to the next step even if it is a full block.\n\n### Step 3. Process the last block and the last 64 bytes\n\nAccumulation steps are run for the stripes in the last block, except for the last stripe (whether it is full or not). After that, run a final accumulation step by treating the last 64 bytes as a stripe. Note that the last 64 bytes might overlap with the second-to-last block.\n\n```c\n// len is the size of the last block (1 <= len <= blockSize)\nlastRound(u8 block[], size len, u64 lastStripe[8]):\n  size nFullStripes = (len-1)/64;\n  for (n = 0; n < nFullStripes; n++) {\n    u64 stripe[8] = block[n*64:n*64+64];\n    accumulate(stripe, n * 8);\n  }\n  accumulate(lastStripe, secretLength - 71);\n```\n\n### Step 4. Finalization\n\nIn the finalization step, a merging procedure is used to extract a single 64-bit value from the accumulators, using an initial seed value and a 64-byte segment of the secret.\n\n```c\nfinalMerge(u64 initValue, size secretOffset):\n  u64 secretWords[8] = secret[secretOffset:secretOffset+64];\n  u64 result = initValue;\n  for (i = 0; i < 4; i++) {\n    // 64-bit by 64-bit multiplication to 128-bit full result\n    u128 mulResult = (u128)(acc[i*2] xor secretWords[i*2]) *\n                     (u128)(acc[i*2+1] xor secretWords[i*2+1]);\n    result = result + (lowerHalf(mulResult) xor higherHalf(mulResult));\n                      // (mulResult and 0xFFFFFFFFFFFFFFFF) xor (mulResult >> 64)\n  }\n  return avalanche(result);\n```\n\nXXH3-128 runs the merging procedure twice for the two halves of the result, using different secret segments and different initial values derived from the total input length.\nThe XXH3-64 result is just the lower half of the XXH3-128 result.\n\n```c\nXXH3_64_large():\n  return finalMerge((u64)inputLength * PRIME64_1, 11);\n\nXXH3_128_large():\n  return {finalMerge((u64)inputLength * PRIME64_1, 11), // lower half\n          finalMerge(~((u64)inputLength * PRIME64_2), secretLength - 75)}; // higher half\n```\n\n\nPerformance considerations\n----------------------------------\n\nThe xxHash algorithms are simple and compact to implement. They provide a system independent \"fingerprint\" or digest of a message of arbitrary length.\n\nThe algorithm allows input to be streamed and processed in multiple steps. In such case, an internal buffer is needed to ensure data is presented to the algorithm in full stripes.\n\nOn 64-bit systems, the 64-bit variant `XXH64` is generally faster to compute, so it is a recommended variant, even when only 32-bit are needed.\n\nOn 32-bit systems though, positions are reversed: `XXH64` performance is reduced, due to its usage of 64-bit arithmetic. `XXH32` becomes a faster variant.\n\nFinally, when vector operations are possible, `XXH3` is likely the faster variant.\n\n\nReference Implementation\n----------------------------------------\n\nA reference library written in C is available at https://www.xxhash.com.\nThe web page also links to multiple other implementations written in many different languages.\nIt links to the [github project page](https://github.com/Cyan4973/xxHash) where an [issue board](https://github.com/Cyan4973/xxHash/issues) can be used for further public discussions on the topic.\n\n\nVersion changes\n--------------------\nv0.2.0: added XXH3 specification, by Adrien Wu\nv0.1.1: added a note on rationale for selection of constants\nv0.1.0: initial release\n"
  },
  {
    "path": "src/third_party/xxHash/xxh3.h",
    "content": "/*\n * xxHash - Extremely Fast Hash algorithm\n * Development source file for `xxh3`\n * Copyright (C) 2019-2021 Yann Collet\n *\n * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above\n *      copyright notice, this list of conditions and the following disclaimer\n *      in the documentation and/or other materials provided with the\n *      distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * You can contact the author at:\n *   - xxHash homepage: https://www.xxhash.com\n *   - xxHash source repository: https://github.com/Cyan4973/xxHash\n */\n\n/*\n * Note: This file used to host the source code of XXH3_* variants.\n * during the development period.\n * The source code is now properly integrated within xxhash.h.\n *\n * xxh3.h is no longer useful,\n * but it is still provided for compatibility with source code\n * which used to include it directly.\n *\n * Programs are now highly discouraged to include xxh3.h.\n * Include `xxhash.h` instead, which is the officially supported interface.\n *\n * In the future, xxh3.h will start to generate warnings, then errors,\n * then it will be removed from source package and from include directory.\n */\n\n/* Simulate the same impact as including the old xxh3.h source file */\n\n#define XXH_INLINE_ALL\n#include \"xxhash.h\"\n"
  },
  {
    "path": "src/third_party/xxHash/xxh_x86dispatch.c",
    "content": "/*\n * xxHash - Extremely Fast Hash algorithm\n * Copyright (C) 2020-2021 Yann Collet\n *\n * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above\n *      copyright notice, this list of conditions and the following disclaimer\n *      in the documentation and/or other materials provided with the\n *      distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * You can contact the author at:\n *   - xxHash homepage: https://www.xxhash.com\n *   - xxHash source repository: https://github.com/Cyan4973/xxHash\n */\n\n\n/*!\n * @file xxh_x86dispatch.c\n *\n * Automatic dispatcher code for the @ref XXH3_family on x86-based targets.\n *\n * Optional add-on.\n *\n * **Compile this file with the default flags for your target.** Do not compile\n * with flags like `-mavx*`, `-march=native`, or `/arch:AVX*`, there will be\n * an error. See @ref XXH_X86DISPATCH_ALLOW_AVX for details.\n *\n * @defgroup dispatch x86 Dispatcher\n * @{\n */\n\n#if defined (__cplusplus)\nextern \"C\" {\n#endif\n\n#if !(defined(__x86_64__) || defined(__i386__) || defined(_M_IX86) || defined(_M_X64))\n#  error \"Dispatching is currently only supported on x86 and x86_64.\"\n#endif\n\n/*! @cond Doxygen ignores this part */\n#ifndef XXH_HAS_INCLUDE\n#  ifdef __has_include\n#    define XXH_HAS_INCLUDE(x) __has_include(x)\n#  else\n#    define XXH_HAS_INCLUDE(x) 0\n#  endif\n#endif\n/*! @endcond */\n\n/*!\n * @def XXH_X86DISPATCH_ALLOW_AVX\n * @brief Disables the AVX sanity check.\n *\n * xxh_x86dispatch.c is intended to be compiled for the minimum target, and\n * it selectively enables SSE2, AVX2, and AVX512 when it is needed.\n *\n * Compiling with options like `-mavx*`, `-march=native`, or `/arch:AVX*`\n * _globally_ will always enable this feature, and therefore makes it\n * undefined behavior to execute on any CPU without said feature.\n *\n * Even if the source code isn't directly using AVX intrinsics in a function,\n * the compiler can still generate AVX code from autovectorization and by\n * \"upgrading\" SSE2 intrinsics to use the VEX prefixes (a.k.a. AVX128).\n *\n * Define XXH_X86DISPATCH_ALLOW_AVX to ignore this check,\n * thus accepting that the produced binary will not work correctly\n * on any CPU with less features than the ones stated at compilation time.\n */\n#ifdef XXH_DOXYGEN\n#  define XXH_X86DISPATCH_ALLOW_AVX\n#endif\n\n#if defined(__AVX__) && !defined(XXH_X86DISPATCH_ALLOW_AVX)\n#  error \"Error: if xxh_x86dispatch.c is compiled with AVX enabled, the resulting binary will crash on sse2-only cpus !! \" \\\n         \"If you nonetheless want to do that, please enable the XXH_X86DISPATCH_ALLOW_AVX build variable\"\n#endif\n\n/*!\n * @def XXH_DISPATCH_SCALAR\n * @brief Enables/dispatching the scalar code path.\n *\n * If this is defined to 0, SSE2 support is assumed. This reduces code size\n * when the scalar path is not needed.\n *\n * This is automatically defined to 0 when...\n *   - SSE2 support is enabled in the compiler\n *   - Targeting x86_64\n *   - Targeting Android x86\n *   - Targeting macOS\n */\n#ifndef XXH_DISPATCH_SCALAR\n#  if defined(__SSE2__) || (defined(_M_IX86_FP) && _M_IX86_FP >= 2) /* SSE2 on by default */ \\\n     || defined(__x86_64__) || defined(_M_X64) /* x86_64 */ \\\n     || defined(__ANDROID__) || defined(__APPLE__) /* Android or macOS */\n#     define XXH_DISPATCH_SCALAR 0 /* disable */\n#  else\n#     define XXH_DISPATCH_SCALAR 1\n#  endif\n#endif\n/*!\n * @def XXH_DISPATCH_AVX2\n * @brief Enables/disables dispatching for AVX2.\n *\n * This is automatically detected if it is not defined.\n *  - GCC 4.7 and later are known to support AVX2, but >4.9 is required for\n *    to get the AVX2 intrinsics and typedefs without -mavx -mavx2.\n *  - Visual Studio 2013 Update 2 and later are known to support AVX2.\n *  - The GCC/Clang internal header `<avx2intrin.h>` is detected. While this is\n *    not allowed to be included directly, it still appears in the builtin\n *    include path and is detectable with `__has_include`.\n *\n * @see XXH_AVX2\n */\n#ifndef XXH_DISPATCH_AVX2\n#  if (defined(__GNUC__) && (__GNUC__ > 4)) /* GCC 5.0+ */ \\\n   || (defined(_MSC_VER) && _MSC_VER >= 1900) /* VS 2015+ */ \\\n   || (defined(_MSC_FULL_VER) && _MSC_FULL_VER >= 180030501) /* VS 2013 Update 2 */ \\\n   || XXH_HAS_INCLUDE(<avx2intrin.h>) /* GCC/Clang internal header */\n#    define XXH_DISPATCH_AVX2 1   /* enable dispatch towards AVX2 */\n#  else\n#    define XXH_DISPATCH_AVX2 0\n#  endif\n#endif /* XXH_DISPATCH_AVX2 */\n\n/*!\n * @def XXH_DISPATCH_AVX512\n * @brief Enables/disables dispatching for AVX512.\n *\n * Automatically detected if one of the following conditions is met:\n *  - GCC 4.9 and later are known to support AVX512.\n *  - Visual Studio 2017  and later are known to support AVX2.\n *  - The GCC/Clang internal header `<avx512fintrin.h>` is detected. While this\n *    is not allowed to be included directly, it still appears in the builtin\n *    include path and is detectable with `__has_include`.\n *\n * @see XXH_AVX512\n */\n#ifndef XXH_DISPATCH_AVX512\n#  if (defined(__GNUC__) \\\n       && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 9))) /* GCC 4.9+ */ \\\n   || (defined(_MSC_VER) && _MSC_VER >= 1910) /* VS 2017+ */ \\\n   || XXH_HAS_INCLUDE(<avx512fintrin.h>) /* GCC/Clang internal header */\n#    define XXH_DISPATCH_AVX512 1   /* enable dispatch towards AVX512 */\n#  else\n#    define XXH_DISPATCH_AVX512 0\n#  endif\n#endif /* XXH_DISPATCH_AVX512 */\n\n/*!\n * @def XXH_TARGET_SSE2\n * @brief Allows a function to be compiled with SSE2 intrinsics.\n *\n * Uses `__attribute__((__target__(\"sse2\")))` on GCC to allow SSE2 to be used\n * even with `-mno-sse2`.\n *\n * @def XXH_TARGET_AVX2\n * @brief Like @ref XXH_TARGET_SSE2, but for AVX2.\n *\n * @def XXH_TARGET_AVX512\n * @brief Like @ref XXH_TARGET_SSE2, but for AVX512.\n *\n */\n#if defined(__GNUC__)\n#  include <emmintrin.h> /* SSE2 */\n#  if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512\n#    include <immintrin.h> /* AVX2, AVX512F */\n#  endif\n#  define XXH_TARGET_SSE2 __attribute__((__target__(\"sse2\")))\n#  define XXH_TARGET_AVX2 __attribute__((__target__(\"avx2\")))\n#  define XXH_TARGET_AVX512 __attribute__((__target__(\"avx512f\")))\n#elif defined(__clang__) && defined(_MSC_VER) /* clang-cl.exe */\n#  include <emmintrin.h> /* SSE2 */\n#  if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512\n#    include <immintrin.h> /* AVX2, AVX512F */\n#    include <smmintrin.h>\n#    include <avxintrin.h>\n#    include <avx2intrin.h>\n#    include <avx512fintrin.h>\n#  endif\n#  define XXH_TARGET_SSE2 __attribute__((__target__(\"sse2\")))\n#  define XXH_TARGET_AVX2 __attribute__((__target__(\"avx2\")))\n#  define XXH_TARGET_AVX512 __attribute__((__target__(\"avx512f\")))\n#elif defined(_MSC_VER)\n#  include <intrin.h>\n#  define XXH_TARGET_SSE2\n#  define XXH_TARGET_AVX2\n#  define XXH_TARGET_AVX512\n#else\n#  error \"Dispatching is currently not supported for your compiler.\"\n#endif\n\n/*! @cond Doxygen ignores this part */\n#ifdef XXH_DISPATCH_DEBUG\n/* debug logging */\n#  include <stdio.h>\n#  define XXH_debugPrint(str) { fprintf(stderr, \"DEBUG: xxHash dispatch: %s \\n\", str); fflush(NULL); }\n#else\n#  define XXH_debugPrint(str) ((void)0)\n#  undef NDEBUG /* avoid redefinition */\n#  define NDEBUG\n#endif\n/*! @endcond */\n#include <assert.h>\n\n#ifndef XXH_DOXYGEN\n#define XXH_INLINE_ALL\n#define XXH_X86DISPATCH\n#include \"xxhash.h\"\n#endif\n\n/*! @cond Doxygen ignores this part */\n#ifndef XXH_HAS_ATTRIBUTE\n#  ifdef __has_attribute\n#    define XXH_HAS_ATTRIBUTE(...) __has_attribute(__VA_ARGS__)\n#  else\n#    define XXH_HAS_ATTRIBUTE(...) 0\n#  endif\n#endif\n/*! @endcond */\n\n/*! @cond Doxygen ignores this part */\n#if XXH_HAS_ATTRIBUTE(constructor)\n#  define XXH_CONSTRUCTOR __attribute__((constructor))\n#  define XXH_DISPATCH_MAYBE_NULL 0\n#else\n#  define XXH_CONSTRUCTOR\n#  define XXH_DISPATCH_MAYBE_NULL 1\n#endif\n/*! @endcond */\n\n\n/*! @cond Doxygen ignores this part */\n/*\n * Support both AT&T and Intel dialects\n *\n * GCC doesn't convert AT&T syntax to Intel syntax, and will error out if\n * compiled with -masm=intel. Instead, it supports dialect switching with\n * curly braces: { AT&T syntax | Intel syntax }\n *\n * Clang's integrated assembler automatically converts AT&T syntax to Intel if\n * needed, making the dialect switching useless (it isn't even supported).\n *\n * Note: Comments are written in the inline assembly itself.\n */\n#ifdef __clang__\n#  define XXH_I_ATT(intel, att) att \"\\n\\t\"\n#else\n#  define XXH_I_ATT(intel, att) \"{\" att \"|\" intel \"}\\n\\t\"\n#endif\n/*! @endcond */\n\n/*!\n * @private\n * @brief Runs CPUID.\n *\n * @param eax , ecx The parameters to pass to CPUID, %eax and %ecx respectively.\n * @param abcd The array to store the result in, `{ eax, ebx, ecx, edx }`\n */\nstatic void XXH_cpuid(xxh_u32 eax, xxh_u32 ecx, xxh_u32* abcd)\n{\n#if defined(_MSC_VER)\n    __cpuidex((int*)abcd, eax, ecx);\n#else\n    xxh_u32 ebx, edx;\n# if defined(__i386__) && defined(__PIC__)\n    __asm__(\n        \"# Call CPUID\\n\\t\"\n        \"#\\n\\t\"\n        \"# On 32-bit x86 with PIC enabled, we are not allowed to overwrite\\n\\t\"\n        \"# EBX, so we use EDI instead.\\n\\t\"\n        XXH_I_ATT(\"mov     edi, ebx\",   \"movl    %%ebx, %%edi\")\n        XXH_I_ATT(\"cpuid\",              \"cpuid\"               )\n        XXH_I_ATT(\"xchg    edi, ebx\",   \"xchgl   %%ebx, %%edi\")\n        : \"=D\" (ebx),\n# else\n    __asm__(\n        \"# Call CPUID\\n\\t\"\n        XXH_I_ATT(\"cpuid\",              \"cpuid\")\n        : \"=b\" (ebx),\n# endif\n              \"+a\" (eax), \"+c\" (ecx), \"=d\" (edx));\n    abcd[0] = eax;\n    abcd[1] = ebx;\n    abcd[2] = ecx;\n    abcd[3] = edx;\n#endif\n}\n\n/*\n * Modified version of Intel's guide\n * https://software.intel.com/en-us/articles/how-to-detect-new-instruction-support-in-the-4th-generation-intel-core-processor-family\n */\n\n#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512\n/*!\n * @private\n * @brief Runs `XGETBV`.\n *\n * While the CPU may support AVX2, the operating system might not properly save\n * the full YMM/ZMM registers.\n *\n * xgetbv is used for detecting this: Any compliant operating system will define\n * a set of flags in the xcr0 register indicating how it saves the AVX registers.\n *\n * You can manually disable this flag on Windows by running, as admin:\n *\n *   bcdedit.exe /set xsavedisable 1\n *\n * and rebooting. Run the same command with 0 to re-enable it.\n */\nstatic xxh_u64 XXH_xgetbv(void)\n{\n#if defined(_MSC_VER)\n    return _xgetbv(0);  /* min VS2010 SP1 compiler is required */\n#else\n    xxh_u32 xcr0_lo, xcr0_hi;\n    __asm__(\n        \"# Call XGETBV\\n\\t\"\n        \"#\\n\\t\"\n        \"# Older assemblers (e.g. macOS's ancient GAS version) don't support\\n\\t\"\n        \"# the XGETBV opcode, so we encode it by hand instead.\\n\\t\"\n        \"# See <https://github.com/asmjit/asmjit/issues/78> for details.\\n\\t\"\n        \".byte   0x0f, 0x01, 0xd0\\n\\t\"\n       : \"=a\" (xcr0_lo), \"=d\" (xcr0_hi) : \"c\" (0));\n    return xcr0_lo | ((xxh_u64)xcr0_hi << 32);\n#endif\n}\n#endif\n\n/*! @cond Doxygen ignores this part */\n#define XXH_SSE2_CPUID_MASK (1 << 26)\n#define XXH_OSXSAVE_CPUID_MASK ((1 << 26) | (1 << 27))\n#define XXH_AVX2_CPUID_MASK (1 << 5)\n#define XXH_AVX2_XGETBV_MASK ((1 << 2) | (1 << 1))\n#define XXH_AVX512F_CPUID_MASK (1 << 16)\n#define XXH_AVX512F_XGETBV_MASK ((7 << 5) | (1 << 2) | (1 << 1))\n/*! @endcond */\n\n/*!\n * @private\n * @brief Returns the best XXH3 implementation.\n *\n * Runs various CPUID/XGETBV tests to try and determine the best implementation.\n *\n * @return The best @ref XXH_VECTOR implementation.\n * @see XXH_VECTOR_TYPES\n */\nstatic int XXH_featureTest(void)\n{\n    xxh_u32 abcd[4];\n    xxh_u32 max_leaves;\n    int best = XXH_SCALAR;\n#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512\n    xxh_u64 xgetbv_val;\n#endif\n#if defined(__GNUC__) && defined(__i386__)\n    xxh_u32 cpuid_supported;\n    __asm__(\n        \"# For the sake of ruthless backwards compatibility, check if CPUID\\n\\t\"\n        \"# is supported in the EFLAGS on i386.\\n\\t\"\n        \"# This is not necessary on x86_64 - CPUID is mandatory.\\n\\t\"\n        \"#   The ID flag (bit 21) in the EFLAGS register indicates support\\n\\t\"\n        \"#   for the CPUID instruction. If a software procedure can set and\\n\\t\"\n        \"#   clear this flag, the processor executing the procedure supports\\n\\t\"\n        \"#   the CPUID instruction.\\n\\t\"\n        \"#   <https://c9x.me/x86/html/file_module_x86_id_45.html>\\n\\t\"\n        \"#\\n\\t\"\n        \"# Routine is from <https://wiki.osdev.org/CPUID>.\\n\\t\"\n\n        \"# Save EFLAGS\\n\\t\"\n        XXH_I_ATT(\"pushfd\",                           \"pushfl\"                    )\n        \"# Store EFLAGS\\n\\t\"\n        XXH_I_ATT(\"pushfd\",                           \"pushfl\"                    )\n        \"# Invert the ID bit in stored EFLAGS\\n\\t\"\n        XXH_I_ATT(\"xor     dword ptr[esp], 0x200000\", \"xorl    $0x200000, (%%esp)\")\n        \"# Load stored EFLAGS (with ID bit inverted)\\n\\t\"\n        XXH_I_ATT(\"popfd\",                            \"popfl\"                     )\n        \"# Store EFLAGS again (ID bit may or not be inverted)\\n\\t\"\n        XXH_I_ATT(\"pushfd\",                           \"pushfl\"                    )\n        \"# eax = modified EFLAGS (ID bit may or may not be inverted)\\n\\t\"\n        XXH_I_ATT(\"pop     eax\",                      \"popl    %%eax\"             )\n        \"# eax = whichever bits were changed\\n\\t\"\n        XXH_I_ATT(\"xor     eax, dword ptr[esp]\",      \"xorl    (%%esp), %%eax\"    )\n        \"# Restore original EFLAGS\\n\\t\"\n        XXH_I_ATT(\"popfd\",                            \"popfl\"                     )\n        \"# eax = zero if ID bit can't be changed, else non-zero\\n\\t\"\n        XXH_I_ATT(\"and     eax, 0x200000\",            \"andl    $0x200000, %%eax\"  )\n        : \"=a\" (cpuid_supported) :: \"cc\");\n\n    if (XXH_unlikely(!cpuid_supported)) {\n        XXH_debugPrint(\"CPUID support is not detected!\");\n        return best;\n    }\n\n#endif\n    /* Check how many CPUID pages we have */\n    XXH_cpuid(0, 0, abcd);\n    max_leaves = abcd[0];\n\n    /* Shouldn't happen on hardware, but happens on some QEMU configs. */\n    if (XXH_unlikely(max_leaves == 0)) {\n        XXH_debugPrint(\"Max CPUID leaves == 0!\");\n        return best;\n    }\n\n    /* Check for SSE2, OSXSAVE and xgetbv */\n    XXH_cpuid(1, 0, abcd);\n\n    /*\n     * Test for SSE2. The check is redundant on x86_64, but it doesn't hurt.\n     */\n    if (XXH_unlikely((abcd[3] & XXH_SSE2_CPUID_MASK) != XXH_SSE2_CPUID_MASK))\n        return best;\n\n    XXH_debugPrint(\"SSE2 support detected.\");\n\n    best = XXH_SSE2;\n#if XXH_DISPATCH_AVX2 || XXH_DISPATCH_AVX512\n    /* Make sure we have enough leaves */\n    if (XXH_unlikely(max_leaves < 7))\n        return best;\n\n    /* Test for OSXSAVE and XGETBV */\n    if ((abcd[2] & XXH_OSXSAVE_CPUID_MASK) != XXH_OSXSAVE_CPUID_MASK)\n        return best;\n\n    /* CPUID check for AVX features */\n    XXH_cpuid(7, 0, abcd);\n\n    xgetbv_val = XXH_xgetbv();\n#if XXH_DISPATCH_AVX2\n    /* Validate that AVX2 is supported by the CPU */\n    if ((abcd[1] & XXH_AVX2_CPUID_MASK) != XXH_AVX2_CPUID_MASK)\n        return best;\n\n    /* Validate that the OS supports YMM registers */\n    if ((xgetbv_val & XXH_AVX2_XGETBV_MASK) != XXH_AVX2_XGETBV_MASK) {\n        XXH_debugPrint(\"AVX2 supported by the CPU, but not the OS.\");\n        return best;\n    }\n\n    /* AVX2 supported */\n    XXH_debugPrint(\"AVX2 support detected.\");\n    best = XXH_AVX2;\n#endif\n#if XXH_DISPATCH_AVX512\n    /* Check if AVX512F is supported by the CPU */\n    if ((abcd[1] & XXH_AVX512F_CPUID_MASK) != XXH_AVX512F_CPUID_MASK) {\n        XXH_debugPrint(\"AVX512F not supported by CPU\");\n        return best;\n    }\n\n    /* Validate that the OS supports ZMM registers */\n    if ((xgetbv_val & XXH_AVX512F_XGETBV_MASK) != XXH_AVX512F_XGETBV_MASK) {\n        XXH_debugPrint(\"AVX512F supported by the CPU, but not the OS.\");\n        return best;\n    }\n\n    /* AVX512F supported */\n    XXH_debugPrint(\"AVX512F support detected.\");\n    best = XXH_AVX512;\n#endif\n#endif\n    return best;\n}\n\n\n/* ===   Vector implementations   === */\n\n/*! @cond PRIVATE */\n/*!\n * @private\n * @brief Defines the various dispatch functions.\n *\n * TODO: Consolidate?\n *\n * @param suffix The suffix for the functions, e.g. sse2 or scalar\n * @param target XXH_TARGET_* or empty.\n */\n\n#define XXH_DEFINE_DISPATCH_FUNCS(suffix, target)                             \\\n                                                                              \\\n/* ===   XXH3, default variants   === */                                      \\\n                                                                              \\\nXXH_NO_INLINE target XXH64_hash_t                                             \\\nXXHL64_default_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input,          \\\n                        size_t len)                                           \\\n{                                                                             \\\n    return XXH3_hashLong_64b_internal(                                        \\\n               input, len, XXH3_kSecret, sizeof(XXH3_kSecret),                \\\n               XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix            \\\n    );                                                                        \\\n}                                                                             \\\n                                                                              \\\n/* ===   XXH3, Seeded variants   === */                                       \\\n                                                                              \\\nXXH_NO_INLINE target XXH64_hash_t                                             \\\nXXHL64_seed_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, size_t len, \\\n                     XXH64_hash_t seed)                                       \\\n{                                                                             \\\n    return XXH3_hashLong_64b_withSeed_internal(                               \\\n                    input, len, seed, XXH3_accumulate_##suffix,               \\\n                    XXH3_scrambleAcc_##suffix, XXH3_initCustomSecret_##suffix \\\n    );                                                                        \\\n}                                                                             \\\n                                                                              \\\n/* ===   XXH3, Secret variants   === */                                       \\\n                                                                              \\\nXXH_NO_INLINE target XXH64_hash_t                                             \\\nXXHL64_secret_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input,           \\\n                       size_t len, XXH_NOESCAPE const void* secret,           \\\n                       size_t secretLen)                                      \\\n{                                                                             \\\n    return XXH3_hashLong_64b_internal(                                        \\\n                    input, len, secret, secretLen,                            \\\n                    XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix       \\\n    );                                                                        \\\n}                                                                             \\\n                                                                              \\\n/* ===   XXH3 update variants   === */                                        \\\n                                                                              \\\nXXH_NO_INLINE target XXH_errorcode                                            \\\nXXH3_update_##suffix(XXH_NOESCAPE XXH3_state_t* state,                        \\\n                     XXH_NOESCAPE const void* input, size_t len)              \\\n{                                                                             \\\n    return XXH3_update(state, (const xxh_u8*)input, len,                      \\\n                    XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix);     \\\n}                                                                             \\\n                                                                              \\\n/* ===   XXH128 default variants   === */                                     \\\n                                                                              \\\nXXH_NO_INLINE target XXH128_hash_t                                            \\\nXXHL128_default_##suffix(XXH_NOESCAPE  const void* XXH_RESTRICT input,        \\\n                         size_t len)                                          \\\n{                                                                             \\\n    return XXH3_hashLong_128b_internal(                                       \\\n                    input, len, XXH3_kSecret, sizeof(XXH3_kSecret),           \\\n                    XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix       \\\n    );                                                                        \\\n}                                                                             \\\n                                                                              \\\n/* ===   XXH128 Secret variants   === */                                      \\\n                                                                              \\\nXXH_NO_INLINE target XXH128_hash_t                                            \\\nXXHL128_secret_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input,          \\\n                        size_t len,                                           \\\n                        XXH_NOESCAPE const void* XXH_RESTRICT secret,         \\\n                        size_t secretLen)                                     \\\n{                                                                             \\\n    return XXH3_hashLong_128b_internal(                                       \\\n                    input, len, (const xxh_u8*)secret, secretLen,             \\\n                    XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix);     \\\n}                                                                             \\\n                                                                              \\\n/* ===   XXH128 Seeded variants   === */                                      \\\n                                                                              \\\nXXH_NO_INLINE target XXH128_hash_t                                            \\\nXXHL128_seed_##suffix(XXH_NOESCAPE const void* XXH_RESTRICT input, size_t len,\\\n                      XXH64_hash_t seed)                                      \\\n{                                                                             \\\n    return XXH3_hashLong_128b_withSeed_internal(input, len, seed,             \\\n                    XXH3_accumulate_##suffix, XXH3_scrambleAcc_##suffix,      \\\n                    XXH3_initCustomSecret_##suffix);                          \\\n}\n\n/*! @endcond */\n/* End XXH_DEFINE_DISPATCH_FUNCS */\n\n/*! @cond Doxygen ignores this part */\n#if XXH_DISPATCH_SCALAR\nXXH_DEFINE_DISPATCH_FUNCS(scalar, /* nothing */)\n#endif\nXXH_DEFINE_DISPATCH_FUNCS(sse2, XXH_TARGET_SSE2)\n#if XXH_DISPATCH_AVX2\nXXH_DEFINE_DISPATCH_FUNCS(avx2, XXH_TARGET_AVX2)\n#endif\n#if XXH_DISPATCH_AVX512\nXXH_DEFINE_DISPATCH_FUNCS(avx512, XXH_TARGET_AVX512)\n#endif\n#undef XXH_DEFINE_DISPATCH_FUNCS\n/*! @endcond */\n\n/* ====    Dispatchers    ==== */\n\n/*! @cond Doxygen ignores this part */\ntypedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_default)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t);\n\ntypedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t);\n\ntypedef XXH64_hash_t (*XXH3_dispatchx86_hashLong64_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH_NOESCAPE const void* XXH_RESTRICT, size_t);\n\ntypedef XXH_errorcode (*XXH3_dispatchx86_update)(XXH_NOESCAPE XXH3_state_t*, XXH_NOESCAPE const void*, size_t);\n\ntypedef struct {\n    XXH3_dispatchx86_hashLong64_default    hashLong64_default;\n    XXH3_dispatchx86_hashLong64_withSeed   hashLong64_seed;\n    XXH3_dispatchx86_hashLong64_withSecret hashLong64_secret;\n    XXH3_dispatchx86_update                update;\n} XXH_dispatchFunctions_s;\n\n#define XXH_NB_DISPATCHES 4\n/*! @endcond */\n\n/*!\n * @private\n * @brief Table of dispatchers for @ref XXH3_64bits().\n *\n * @pre The indices must match @ref XXH_VECTOR_TYPE.\n */\nstatic const XXH_dispatchFunctions_s XXH_kDispatch[XXH_NB_DISPATCHES] = {\n#if XXH_DISPATCH_SCALAR\n    /* Scalar */ { XXHL64_default_scalar, XXHL64_seed_scalar, XXHL64_secret_scalar, XXH3_update_scalar },\n#else\n    /* Scalar */ { NULL, NULL, NULL, NULL },\n#endif\n    /* SSE2   */ { XXHL64_default_sse2,   XXHL64_seed_sse2,   XXHL64_secret_sse2,   XXH3_update_sse2 },\n#if XXH_DISPATCH_AVX2\n    /* AVX2   */ { XXHL64_default_avx2,   XXHL64_seed_avx2,   XXHL64_secret_avx2,   XXH3_update_avx2 },\n#else\n    /* AVX2   */ { NULL, NULL, NULL, NULL },\n#endif\n#if XXH_DISPATCH_AVX512\n    /* AVX512 */ { XXHL64_default_avx512, XXHL64_seed_avx512, XXHL64_secret_avx512, XXH3_update_avx512 }\n#else\n    /* AVX512 */ { NULL, NULL, NULL, NULL }\n#endif\n};\n/*!\n * @private\n * @brief The selected dispatch table for @ref XXH3_64bits().\n */\nstatic XXH_dispatchFunctions_s XXH_g_dispatch = { NULL, NULL, NULL, NULL };\n\n\n/*! @cond Doxygen ignores this part */\ntypedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_default)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t);\n\ntypedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSeed)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, XXH64_hash_t);\n\ntypedef XXH128_hash_t (*XXH3_dispatchx86_hashLong128_withSecret)(XXH_NOESCAPE const void* XXH_RESTRICT, size_t, const void* XXH_RESTRICT, size_t);\n\ntypedef struct {\n    XXH3_dispatchx86_hashLong128_default    hashLong128_default;\n    XXH3_dispatchx86_hashLong128_withSeed   hashLong128_seed;\n    XXH3_dispatchx86_hashLong128_withSecret hashLong128_secret;\n    XXH3_dispatchx86_update                 update;\n} XXH_dispatch128Functions_s;\n/*! @endcond */\n\n\n/*!\n * @private\n * @brief Table of dispatchers for @ref XXH3_128bits().\n *\n * @pre The indices must match @ref XXH_VECTOR_TYPE.\n */\nstatic const XXH_dispatch128Functions_s XXH_kDispatch128[XXH_NB_DISPATCHES] = {\n#if XXH_DISPATCH_SCALAR\n    /* Scalar */ { XXHL128_default_scalar, XXHL128_seed_scalar, XXHL128_secret_scalar, XXH3_update_scalar },\n#else\n    /* Scalar */ { NULL, NULL, NULL, NULL },\n#endif\n    /* SSE2   */ { XXHL128_default_sse2,   XXHL128_seed_sse2,   XXHL128_secret_sse2,   XXH3_update_sse2 },\n#if XXH_DISPATCH_AVX2\n    /* AVX2   */ { XXHL128_default_avx2,   XXHL128_seed_avx2,   XXHL128_secret_avx2,   XXH3_update_avx2 },\n#else\n    /* AVX2   */ { NULL, NULL, NULL, NULL },\n#endif\n#if XXH_DISPATCH_AVX512\n    /* AVX512 */ { XXHL128_default_avx512, XXHL128_seed_avx512, XXHL128_secret_avx512, XXH3_update_avx512 }\n#else\n    /* AVX512 */ { NULL, NULL, NULL, NULL }\n#endif\n};\n\n/*!\n * @private\n * @brief The selected dispatch table for @ref XXH3_64bits().\n */\nstatic XXH_dispatch128Functions_s XXH_g_dispatch128 = { NULL, NULL, NULL, NULL };\n\n/*!\n * @private\n * @brief Runs a CPUID check and sets the correct dispatch tables.\n */\nstatic XXH_CONSTRUCTOR void XXH_setDispatch(void)\n{\n    int vecID = XXH_featureTest();\n    XXH_STATIC_ASSERT(XXH_AVX512 == XXH_NB_DISPATCHES-1);\n    assert(XXH_SCALAR <= vecID && vecID <= XXH_AVX512);\n#if !XXH_DISPATCH_SCALAR\n    assert(vecID != XXH_SCALAR);\n#endif\n#if !XXH_DISPATCH_AVX512\n    assert(vecID != XXH_AVX512);\n#endif\n#if !XXH_DISPATCH_AVX2\n    assert(vecID != XXH_AVX2);\n#endif\n    XXH_g_dispatch = XXH_kDispatch[vecID];\n    XXH_g_dispatch128 = XXH_kDispatch128[vecID];\n}\n\n\n/* ====    XXH3 public functions    ==== */\n/*! @cond Doxygen ignores this part */\n\nstatic XXH64_hash_t\nXXH3_hashLong_64b_defaultSecret_selection(const void* input, size_t len,\n                                          XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen)\n{\n    (void)seed64; (void)secret; (void)secretLen;\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_default == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch.hashLong64_default(input, len);\n}\n\nXXH64_hash_t XXH3_64bits_dispatch(XXH_NOESCAPE const void* input, size_t len)\n{\n    return XXH3_64bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_defaultSecret_selection);\n}\n\nstatic XXH64_hash_t\nXXH3_hashLong_64b_withSeed_selection(const void* input, size_t len,\n                                     XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen)\n{\n    (void)secret; (void)secretLen;\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_seed == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch.hashLong64_seed(input, len, seed64);\n}\n\nXXH64_hash_t XXH3_64bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)\n{\n    return XXH3_64bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed_selection);\n}\n\nstatic XXH64_hash_t\nXXH3_hashLong_64b_withSecret_selection(const void* input, size_t len,\n                                       XXH64_hash_t seed64, const xxh_u8* secret, size_t secretLen)\n{\n    (void)seed64;\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.hashLong64_secret == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch.hashLong64_secret(input, len, secret, secretLen);\n}\n\nXXH64_hash_t XXH3_64bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen)\n{\n    return XXH3_64bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_64b_withSecret_selection);\n}\n\nXXH_errorcode\nXXH3_64bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len)\n{\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch.update == NULL)\n        XXH_setDispatch();\n\n    return XXH_g_dispatch.update(state, (const xxh_u8*)input, len);\n}\n\n/*! @endcond */\n\n\n/* ====    XXH128 public functions    ==== */\n/*! @cond Doxygen ignores this part */\n\nstatic XXH128_hash_t\nXXH3_hashLong_128b_defaultSecret_selection(const void* input, size_t len,\n                                           XXH64_hash_t seed64, const void* secret, size_t secretLen)\n{\n    (void)seed64; (void)secret; (void)secretLen;\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_default == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch128.hashLong128_default(input, len);\n}\n\nXXH128_hash_t XXH3_128bits_dispatch(XXH_NOESCAPE const void* input, size_t len)\n{\n    return XXH3_128bits_internal(input, len, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_defaultSecret_selection);\n}\n\nstatic XXH128_hash_t\nXXH3_hashLong_128b_withSeed_selection(const void* input, size_t len,\n                                      XXH64_hash_t seed64, const void* secret, size_t secretLen)\n{\n    (void)secret; (void)secretLen;\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_seed == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch128.hashLong128_seed(input, len, seed64);\n}\n\nXXH128_hash_t XXH3_128bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)\n{\n    return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_128b_withSeed_selection);\n}\n\nstatic XXH128_hash_t\nXXH3_hashLong_128b_withSecret_selection(const void* input, size_t len,\n                                        XXH64_hash_t seed64, const void* secret, size_t secretLen)\n{\n    (void)seed64;\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.hashLong128_secret == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch128.hashLong128_secret(input, len, secret, secretLen);\n}\n\nXXH128_hash_t XXH3_128bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen)\n{\n    return XXH3_128bits_internal(input, len, 0, secret, secretLen, XXH3_hashLong_128b_withSecret_selection);\n}\n\nXXH_errorcode\nXXH3_128bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len)\n{\n    if (XXH_DISPATCH_MAYBE_NULL && XXH_g_dispatch128.update == NULL)\n        XXH_setDispatch();\n    return XXH_g_dispatch128.update(state, (const xxh_u8*)input, len);\n}\n\n/*! @endcond */\n\n#if defined (__cplusplus)\n}\n#endif\n/*! @} */\n"
  },
  {
    "path": "src/third_party/xxHash/xxh_x86dispatch.h",
    "content": "/*\n * xxHash - XXH3 Dispatcher for x86-based targets\n * Copyright (C) 2020-2021 Yann Collet\n *\n * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above\n *      copyright notice, this list of conditions and the following disclaimer\n *      in the documentation and/or other materials provided with the\n *      distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * You can contact the author at:\n *   - xxHash homepage: https://www.xxhash.com\n *   - xxHash source repository: https://github.com/Cyan4973/xxHash\n */\n\n#ifndef XXH_X86DISPATCH_H_13563687684\n#define XXH_X86DISPATCH_H_13563687684\n\n#include \"xxhash.h\"  /* XXH64_hash_t, XXH3_state_t */\n\n#if defined (__cplusplus)\nextern \"C\" {\n#endif\n\nXXH_PUBLIC_API XXH64_hash_t  XXH3_64bits_dispatch(XXH_NOESCAPE const void* input, size_t len);\nXXH_PUBLIC_API XXH64_hash_t  XXH3_64bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed);\nXXH_PUBLIC_API XXH64_hash_t  XXH3_64bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen);\nXXH_PUBLIC_API XXH_errorcode XXH3_64bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len);\n\nXXH_PUBLIC_API XXH128_hash_t XXH3_128bits_dispatch(XXH_NOESCAPE const void* input, size_t len);\nXXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSeed_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed);\nXXH_PUBLIC_API XXH128_hash_t XXH3_128bits_withSecret_dispatch(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretLen);\nXXH_PUBLIC_API XXH_errorcode XXH3_128bits_update_dispatch(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len);\n\n#if defined (__cplusplus)\n}\n#endif\n\n\n/* automatic replacement of XXH3 functions.\n * can be disabled by setting XXH_DISPATCH_DISABLE_REPLACE */\n#ifndef XXH_DISPATCH_DISABLE_REPLACE\n\n# undef  XXH3_64bits\n# define XXH3_64bits XXH3_64bits_dispatch\n# undef  XXH3_64bits_withSeed\n# define XXH3_64bits_withSeed XXH3_64bits_withSeed_dispatch\n# undef  XXH3_64bits_withSecret\n# define XXH3_64bits_withSecret XXH3_64bits_withSecret_dispatch\n# undef  XXH3_64bits_update\n# define XXH3_64bits_update XXH3_64bits_update_dispatch\n\n# undef  XXH128\n# define XXH128 XXH3_128bits_withSeed_dispatch\n# undef  XXH3_128bits\n# define XXH3_128bits XXH3_128bits_dispatch\n# undef  XXH3_128bits_withSeed\n# define XXH3_128bits_withSeed XXH3_128bits_withSeed_dispatch\n# undef  XXH3_128bits_withSecret\n# define XXH3_128bits_withSecret XXH3_128bits_withSecret_dispatch\n# undef  XXH3_128bits_update\n# define XXH3_128bits_update XXH3_128bits_update_dispatch\n\n#endif /* XXH_DISPATCH_DISABLE_REPLACE */\n\n#endif /* XXH_X86DISPATCH_H_13563687684 */\n"
  },
  {
    "path": "src/third_party/xxHash/xxhash.c",
    "content": "/*\n * xxHash - Extremely Fast Hash algorithm\n * Copyright (C) 2012-2021 Yann Collet\n *\n * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above\n *      copyright notice, this list of conditions and the following disclaimer\n *      in the documentation and/or other materials provided with the\n *      distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * You can contact the author at:\n *   - xxHash homepage: https://www.xxhash.com\n *   - xxHash source repository: https://github.com/Cyan4973/xxHash\n */\n\n\n/*\n * xxhash.c instantiates functions defined in xxhash.h\n */\n\n#define XXH_STATIC_LINKING_ONLY   /* access advanced declarations */\n#define XXH_IMPLEMENTATION   /* access definitions */\n\n#include \"xxhash.h\"\n"
  },
  {
    "path": "src/third_party/xxHash/xxhash.h",
    "content": "/*\n * xxHash - Extremely Fast Hash algorithm\n * Header File\n * Copyright (C) 2012-2023 Yann Collet\n *\n * BSD 2-Clause License (https://www.opensource.org/licenses/bsd-license.php)\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are\n * met:\n *\n *    * Redistributions of source code must retain the above copyright\n *      notice, this list of conditions and the following disclaimer.\n *    * Redistributions in binary form must reproduce the above\n *      copyright notice, this list of conditions and the following disclaimer\n *      in the documentation and/or other materials provided with the\n *      distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n * \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * You can contact the author at:\n *   - xxHash homepage: https://www.xxhash.com\n *   - xxHash source repository: https://github.com/Cyan4973/xxHash\n */\n\n/*!\n * @mainpage xxHash\n *\n * xxHash is an extremely fast non-cryptographic hash algorithm, working at RAM speed\n * limits.\n *\n * It is proposed in four flavors, in three families:\n * 1. @ref XXH32_family\n *   - Classic 32-bit hash function. Simple, compact, and runs on almost all\n *     32-bit and 64-bit systems.\n * 2. @ref XXH64_family\n *   - Classic 64-bit adaptation of XXH32. Just as simple, and runs well on most\n *     64-bit systems (but _not_ 32-bit systems).\n * 3. @ref XXH3_family\n *   - Modern 64-bit and 128-bit hash function family which features improved\n *     strength and performance across the board, especially on smaller data.\n *     It benefits greatly from SIMD and 64-bit without requiring it.\n *\n * Benchmarks\n * ---\n * The reference system uses an Intel i7-9700K CPU, and runs Ubuntu x64 20.04.\n * The open source benchmark program is compiled with clang v10.0 using -O3 flag.\n *\n * | Hash Name            | ISA ext | Width | Large Data Speed | Small Data Velocity |\n * | -------------------- | ------- | ----: | ---------------: | ------------------: |\n * | XXH3_64bits()        | @b AVX2 |    64 |        59.4 GB/s |               133.1 |\n * | MeowHash             | AES-NI  |   128 |        58.2 GB/s |                52.5 |\n * | XXH3_128bits()       | @b AVX2 |   128 |        57.9 GB/s |               118.1 |\n * | CLHash               | PCLMUL  |    64 |        37.1 GB/s |                58.1 |\n * | XXH3_64bits()        | @b SSE2 |    64 |        31.5 GB/s |               133.1 |\n * | XXH3_128bits()       | @b SSE2 |   128 |        29.6 GB/s |               118.1 |\n * | RAM sequential read  |         |   N/A |        28.0 GB/s |                 N/A |\n * | ahash                | AES-NI  |    64 |        22.5 GB/s |               107.2 |\n * | City64               |         |    64 |        22.0 GB/s |                76.6 |\n * | T1ha2                |         |    64 |        22.0 GB/s |                99.0 |\n * | City128              |         |   128 |        21.7 GB/s |                57.7 |\n * | FarmHash             | AES-NI  |    64 |        21.3 GB/s |                71.9 |\n * | XXH64()              |         |    64 |        19.4 GB/s |                71.0 |\n * | SpookyHash           |         |    64 |        19.3 GB/s |                53.2 |\n * | Mum                  |         |    64 |        18.0 GB/s |                67.0 |\n * | CRC32C               | SSE4.2  |    32 |        13.0 GB/s |                57.9 |\n * | XXH32()              |         |    32 |         9.7 GB/s |                71.9 |\n * | City32               |         |    32 |         9.1 GB/s |                66.0 |\n * | Blake3*              | @b AVX2 |   256 |         4.4 GB/s |                 8.1 |\n * | Murmur3              |         |    32 |         3.9 GB/s |                56.1 |\n * | SipHash*             |         |    64 |         3.0 GB/s |                43.2 |\n * | Blake3*              | @b SSE2 |   256 |         2.4 GB/s |                 8.1 |\n * | HighwayHash          |         |    64 |         1.4 GB/s |                 6.0 |\n * | FNV64                |         |    64 |         1.2 GB/s |                62.7 |\n * | Blake2*              |         |   256 |         1.1 GB/s |                 5.1 |\n * | SHA1*                |         |   160 |         0.8 GB/s |                 5.6 |\n * | MD5*                 |         |   128 |         0.6 GB/s |                 7.8 |\n * @note\n *   - Hashes which require a specific ISA extension are noted. SSE2 is also noted,\n *     even though it is mandatory on x64.\n *   - Hashes with an asterisk are cryptographic. Note that MD5 is non-cryptographic\n *     by modern standards.\n *   - Small data velocity is a rough average of algorithm's efficiency for small\n *     data. For more accurate information, see the wiki.\n *   - More benchmarks and strength tests are found on the wiki:\n *         https://github.com/Cyan4973/xxHash/wiki\n *\n * Usage\n * ------\n * All xxHash variants use a similar API. Changing the algorithm is a trivial\n * substitution.\n *\n * @pre\n *    For functions which take an input and length parameter, the following\n *    requirements are assumed:\n *    - The range from [`input`, `input + length`) is valid, readable memory.\n *      - The only exception is if the `length` is `0`, `input` may be `NULL`.\n *    - For C++, the objects must have the *TriviallyCopyable* property, as the\n *      functions access bytes directly as if it was an array of `unsigned char`.\n *\n * @anchor single_shot_example\n * **Single Shot**\n *\n * These functions are stateless functions which hash a contiguous block of memory,\n * immediately returning the result. They are the easiest and usually the fastest\n * option.\n *\n * XXH32(), XXH64(), XXH3_64bits(), XXH3_128bits()\n *\n * @code{.c}\n *   #include <string.h>\n *   #include \"xxhash.h\"\n *\n *   // Example for a function which hashes a null terminated string with XXH32().\n *   XXH32_hash_t hash_string(const char* string, XXH32_hash_t seed)\n *   {\n *       // NULL pointers are only valid if the length is zero\n *       size_t length = (string == NULL) ? 0 : strlen(string);\n *       return XXH32(string, length, seed);\n *   }\n * @endcode\n *\n * @anchor streaming_example\n * **Streaming**\n *\n * These groups of functions allow incremental hashing of unknown size, even\n * more than what would fit in a size_t.\n *\n * XXH32_reset(), XXH64_reset(), XXH3_64bits_reset(), XXH3_128bits_reset()\n *\n * @code{.c}\n *   #include <stdio.h>\n *   #include <assert.h>\n *   #include \"xxhash.h\"\n *   // Example for a function which hashes a FILE incrementally with XXH3_64bits().\n *   XXH64_hash_t hashFile(FILE* f)\n *   {\n *       // Allocate a state struct. Do not just use malloc() or new.\n *       XXH3_state_t* state = XXH3_createState();\n *       assert(state != NULL && \"Out of memory!\");\n *       // Reset the state to start a new hashing session.\n *       XXH3_64bits_reset(state);\n *       char buffer[4096];\n *       size_t count;\n *       // Read the file in chunks\n *       while ((count = fread(buffer, 1, sizeof(buffer), f)) != 0) {\n *           // Run update() as many times as necessary to process the data\n *           XXH3_64bits_update(state, buffer, count);\n *       }\n *       // Retrieve the finalized hash. This will not change the state.\n *       XXH64_hash_t result = XXH3_64bits_digest(state);\n *       // Free the state. Do not use free().\n *       XXH3_freeState(state);\n *       return result;\n *   }\n * @endcode\n *\n * @file xxhash.h\n * xxHash prototypes and implementation\n */\n\n#if defined (__cplusplus)\nextern \"C\" {\n#endif\n\n/* ****************************\n *  INLINE mode\n ******************************/\n/*!\n * @defgroup public Public API\n * Contains details on the public xxHash functions.\n * @{\n */\n#ifdef XXH_DOXYGEN\n/*!\n * @brief Gives access to internal state declaration, required for static allocation.\n *\n * Incompatible with dynamic linking, due to risks of ABI changes.\n *\n * Usage:\n * @code{.c}\n *     #define XXH_STATIC_LINKING_ONLY\n *     #include \"xxhash.h\"\n * @endcode\n */\n#  define XXH_STATIC_LINKING_ONLY\n/* Do not undef XXH_STATIC_LINKING_ONLY for Doxygen */\n\n/*!\n * @brief Gives access to internal definitions.\n *\n * Usage:\n * @code{.c}\n *     #define XXH_STATIC_LINKING_ONLY\n *     #define XXH_IMPLEMENTATION\n *     #include \"xxhash.h\"\n * @endcode\n */\n#  define XXH_IMPLEMENTATION\n/* Do not undef XXH_IMPLEMENTATION for Doxygen */\n\n/*!\n * @brief Exposes the implementation and marks all functions as `inline`.\n *\n * Use these build macros to inline xxhash into the target unit.\n * Inlining improves performance on small inputs, especially when the length is\n * expressed as a compile-time constant:\n *\n *  https://fastcompression.blogspot.com/2018/03/xxhash-for-small-keys-impressive-power.html\n *\n * It also keeps xxHash symbols private to the unit, so they are not exported.\n *\n * Usage:\n * @code{.c}\n *     #define XXH_INLINE_ALL\n *     #include \"xxhash.h\"\n * @endcode\n * Do not compile and link xxhash.o as a separate object, as it is not useful.\n */\n#  define XXH_INLINE_ALL\n#  undef XXH_INLINE_ALL\n/*!\n * @brief Exposes the implementation without marking functions as inline.\n */\n#  define XXH_PRIVATE_API\n#  undef XXH_PRIVATE_API\n/*!\n * @brief Emulate a namespace by transparently prefixing all symbols.\n *\n * If you want to include _and expose_ xxHash functions from within your own\n * library, but also want to avoid symbol collisions with other libraries which\n * may also include xxHash, you can use @ref XXH_NAMESPACE to automatically prefix\n * any public symbol from xxhash library with the value of @ref XXH_NAMESPACE\n * (therefore, avoid empty or numeric values).\n *\n * Note that no change is required within the calling program as long as it\n * includes `xxhash.h`: Regular symbol names will be automatically translated\n * by this header.\n */\n#  define XXH_NAMESPACE /* YOUR NAME HERE */\n#  undef XXH_NAMESPACE\n#endif\n\n#if (defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)) \\\n    && !defined(XXH_INLINE_ALL_31684351384)\n   /* this section should be traversed only once */\n#  define XXH_INLINE_ALL_31684351384\n   /* give access to the advanced API, required to compile implementations */\n#  undef XXH_STATIC_LINKING_ONLY   /* avoid macro redef */\n#  define XXH_STATIC_LINKING_ONLY\n   /* make all functions private */\n#  undef XXH_PUBLIC_API\n#  if defined(__GNUC__)\n#    define XXH_PUBLIC_API static __inline __attribute__((unused))\n#  elif defined (__cplusplus) || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */)\n#    define XXH_PUBLIC_API static inline\n#  elif defined(_MSC_VER)\n#    define XXH_PUBLIC_API static __inline\n#  else\n     /* note: this version may generate warnings for unused static functions */\n#    define XXH_PUBLIC_API static\n#  endif\n\n   /*\n    * This part deals with the special case where a unit wants to inline xxHash,\n    * but \"xxhash.h\" has previously been included without XXH_INLINE_ALL,\n    * such as part of some previously included *.h header file.\n    * Without further action, the new include would just be ignored,\n    * and functions would effectively _not_ be inlined (silent failure).\n    * The following macros solve this situation by prefixing all inlined names,\n    * avoiding naming collision with previous inclusions.\n    */\n   /* Before that, we unconditionally #undef all symbols,\n    * in case they were already defined with XXH_NAMESPACE.\n    * They will then be redefined for XXH_INLINE_ALL\n    */\n#  undef XXH_versionNumber\n    /* XXH32 */\n#  undef XXH32\n#  undef XXH32_createState\n#  undef XXH32_freeState\n#  undef XXH32_reset\n#  undef XXH32_update\n#  undef XXH32_digest\n#  undef XXH32_copyState\n#  undef XXH32_canonicalFromHash\n#  undef XXH32_hashFromCanonical\n    /* XXH64 */\n#  undef XXH64\n#  undef XXH64_createState\n#  undef XXH64_freeState\n#  undef XXH64_reset\n#  undef XXH64_update\n#  undef XXH64_digest\n#  undef XXH64_copyState\n#  undef XXH64_canonicalFromHash\n#  undef XXH64_hashFromCanonical\n    /* XXH3_64bits */\n#  undef XXH3_64bits\n#  undef XXH3_64bits_withSecret\n#  undef XXH3_64bits_withSeed\n#  undef XXH3_64bits_withSecretandSeed\n#  undef XXH3_createState\n#  undef XXH3_freeState\n#  undef XXH3_copyState\n#  undef XXH3_64bits_reset\n#  undef XXH3_64bits_reset_withSeed\n#  undef XXH3_64bits_reset_withSecret\n#  undef XXH3_64bits_update\n#  undef XXH3_64bits_digest\n#  undef XXH3_generateSecret\n    /* XXH3_128bits */\n#  undef XXH128\n#  undef XXH3_128bits\n#  undef XXH3_128bits_withSeed\n#  undef XXH3_128bits_withSecret\n#  undef XXH3_128bits_reset\n#  undef XXH3_128bits_reset_withSeed\n#  undef XXH3_128bits_reset_withSecret\n#  undef XXH3_128bits_reset_withSecretandSeed\n#  undef XXH3_128bits_update\n#  undef XXH3_128bits_digest\n#  undef XXH128_isEqual\n#  undef XXH128_cmp\n#  undef XXH128_canonicalFromHash\n#  undef XXH128_hashFromCanonical\n    /* Finally, free the namespace itself */\n#  undef XXH_NAMESPACE\n\n    /* employ the namespace for XXH_INLINE_ALL */\n#  define XXH_NAMESPACE XXH_INLINE_\n   /*\n    * Some identifiers (enums, type names) are not symbols,\n    * but they must nonetheless be renamed to avoid redeclaration.\n    * Alternative solution: do not redeclare them.\n    * However, this requires some #ifdefs, and has a more dispersed impact.\n    * Meanwhile, renaming can be achieved in a single place.\n    */\n#  define XXH_IPREF(Id)   XXH_NAMESPACE ## Id\n#  define XXH_OK XXH_IPREF(XXH_OK)\n#  define XXH_ERROR XXH_IPREF(XXH_ERROR)\n#  define XXH_errorcode XXH_IPREF(XXH_errorcode)\n#  define XXH32_canonical_t  XXH_IPREF(XXH32_canonical_t)\n#  define XXH64_canonical_t  XXH_IPREF(XXH64_canonical_t)\n#  define XXH128_canonical_t XXH_IPREF(XXH128_canonical_t)\n#  define XXH32_state_s XXH_IPREF(XXH32_state_s)\n#  define XXH32_state_t XXH_IPREF(XXH32_state_t)\n#  define XXH64_state_s XXH_IPREF(XXH64_state_s)\n#  define XXH64_state_t XXH_IPREF(XXH64_state_t)\n#  define XXH3_state_s  XXH_IPREF(XXH3_state_s)\n#  define XXH3_state_t  XXH_IPREF(XXH3_state_t)\n#  define XXH128_hash_t XXH_IPREF(XXH128_hash_t)\n   /* Ensure the header is parsed again, even if it was previously included */\n#  undef XXHASH_H_5627135585666179\n#  undef XXHASH_H_STATIC_13879238742\n#endif /* XXH_INLINE_ALL || XXH_PRIVATE_API */\n\n/* ****************************************************************\n *  Stable API\n *****************************************************************/\n#ifndef XXHASH_H_5627135585666179\n#define XXHASH_H_5627135585666179 1\n\n/*! @brief Marks a global symbol. */\n#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API)\n#  if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT))\n#    ifdef XXH_EXPORT\n#      define XXH_PUBLIC_API __declspec(dllexport)\n#    elif XXH_IMPORT\n#      define XXH_PUBLIC_API __declspec(dllimport)\n#    endif\n#  else\n#    define XXH_PUBLIC_API   /* do nothing */\n#  endif\n#endif\n\n#ifdef XXH_NAMESPACE\n#  define XXH_CAT(A,B) A##B\n#  define XXH_NAME2(A,B) XXH_CAT(A,B)\n#  define XXH_versionNumber XXH_NAME2(XXH_NAMESPACE, XXH_versionNumber)\n/* XXH32 */\n#  define XXH32 XXH_NAME2(XXH_NAMESPACE, XXH32)\n#  define XXH32_createState XXH_NAME2(XXH_NAMESPACE, XXH32_createState)\n#  define XXH32_freeState XXH_NAME2(XXH_NAMESPACE, XXH32_freeState)\n#  define XXH32_reset XXH_NAME2(XXH_NAMESPACE, XXH32_reset)\n#  define XXH32_update XXH_NAME2(XXH_NAMESPACE, XXH32_update)\n#  define XXH32_digest XXH_NAME2(XXH_NAMESPACE, XXH32_digest)\n#  define XXH32_copyState XXH_NAME2(XXH_NAMESPACE, XXH32_copyState)\n#  define XXH32_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH32_canonicalFromHash)\n#  define XXH32_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH32_hashFromCanonical)\n/* XXH64 */\n#  define XXH64 XXH_NAME2(XXH_NAMESPACE, XXH64)\n#  define XXH64_createState XXH_NAME2(XXH_NAMESPACE, XXH64_createState)\n#  define XXH64_freeState XXH_NAME2(XXH_NAMESPACE, XXH64_freeState)\n#  define XXH64_reset XXH_NAME2(XXH_NAMESPACE, XXH64_reset)\n#  define XXH64_update XXH_NAME2(XXH_NAMESPACE, XXH64_update)\n#  define XXH64_digest XXH_NAME2(XXH_NAMESPACE, XXH64_digest)\n#  define XXH64_copyState XXH_NAME2(XXH_NAMESPACE, XXH64_copyState)\n#  define XXH64_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH64_canonicalFromHash)\n#  define XXH64_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH64_hashFromCanonical)\n/* XXH3_64bits */\n#  define XXH3_64bits XXH_NAME2(XXH_NAMESPACE, XXH3_64bits)\n#  define XXH3_64bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecret)\n#  define XXH3_64bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSeed)\n#  define XXH3_64bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_withSecretandSeed)\n#  define XXH3_createState XXH_NAME2(XXH_NAMESPACE, XXH3_createState)\n#  define XXH3_freeState XXH_NAME2(XXH_NAMESPACE, XXH3_freeState)\n#  define XXH3_copyState XXH_NAME2(XXH_NAMESPACE, XXH3_copyState)\n#  define XXH3_64bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset)\n#  define XXH3_64bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSeed)\n#  define XXH3_64bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecret)\n#  define XXH3_64bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_reset_withSecretandSeed)\n#  define XXH3_64bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_update)\n#  define XXH3_64bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_64bits_digest)\n#  define XXH3_generateSecret XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret)\n#  define XXH3_generateSecret_fromSeed XXH_NAME2(XXH_NAMESPACE, XXH3_generateSecret_fromSeed)\n/* XXH3_128bits */\n#  define XXH128 XXH_NAME2(XXH_NAMESPACE, XXH128)\n#  define XXH3_128bits XXH_NAME2(XXH_NAMESPACE, XXH3_128bits)\n#  define XXH3_128bits_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSeed)\n#  define XXH3_128bits_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecret)\n#  define XXH3_128bits_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_withSecretandSeed)\n#  define XXH3_128bits_reset XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset)\n#  define XXH3_128bits_reset_withSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSeed)\n#  define XXH3_128bits_reset_withSecret XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecret)\n#  define XXH3_128bits_reset_withSecretandSeed XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_reset_withSecretandSeed)\n#  define XXH3_128bits_update XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_update)\n#  define XXH3_128bits_digest XXH_NAME2(XXH_NAMESPACE, XXH3_128bits_digest)\n#  define XXH128_isEqual XXH_NAME2(XXH_NAMESPACE, XXH128_isEqual)\n#  define XXH128_cmp     XXH_NAME2(XXH_NAMESPACE, XXH128_cmp)\n#  define XXH128_canonicalFromHash XXH_NAME2(XXH_NAMESPACE, XXH128_canonicalFromHash)\n#  define XXH128_hashFromCanonical XXH_NAME2(XXH_NAMESPACE, XXH128_hashFromCanonical)\n#endif\n\n\n/* *************************************\n*  Compiler specifics\n***************************************/\n\n/* specific declaration modes for Windows */\n#if !defined(XXH_INLINE_ALL) && !defined(XXH_PRIVATE_API)\n#  if defined(WIN32) && defined(_MSC_VER) && (defined(XXH_IMPORT) || defined(XXH_EXPORT))\n#    ifdef XXH_EXPORT\n#      define XXH_PUBLIC_API __declspec(dllexport)\n#    elif XXH_IMPORT\n#      define XXH_PUBLIC_API __declspec(dllimport)\n#    endif\n#  else\n#    define XXH_PUBLIC_API   /* do nothing */\n#  endif\n#endif\n\n#if defined (__GNUC__)\n# define XXH_CONSTF  __attribute__((const))\n# define XXH_PUREF   __attribute__((pure))\n# define XXH_MALLOCF __attribute__((malloc))\n#else\n# define XXH_CONSTF  /* disable */\n# define XXH_PUREF\n# define XXH_MALLOCF\n#endif\n\n/* *************************************\n*  Version\n***************************************/\n#define XXH_VERSION_MAJOR    0\n#define XXH_VERSION_MINOR    8\n#define XXH_VERSION_RELEASE  2\n/*! @brief Version number, encoded as two digits each */\n#define XXH_VERSION_NUMBER  (XXH_VERSION_MAJOR *100*100 + XXH_VERSION_MINOR *100 + XXH_VERSION_RELEASE)\n\n/*!\n * @brief Obtains the xxHash version.\n *\n * This is mostly useful when xxHash is compiled as a shared library,\n * since the returned value comes from the library, as opposed to header file.\n *\n * @return @ref XXH_VERSION_NUMBER of the invoked library.\n */\nXXH_PUBLIC_API XXH_CONSTF unsigned XXH_versionNumber (void);\n\n\n/* ****************************\n*  Common basic types\n******************************/\n#include <stddef.h>   /* size_t */\n/*!\n * @brief Exit code for the streaming API.\n */\ntypedef enum {\n    XXH_OK = 0, /*!< OK */\n    XXH_ERROR   /*!< Error */\n} XXH_errorcode;\n\n\n/*-**********************************************************************\n*  32-bit hash\n************************************************************************/\n#if defined(XXH_DOXYGEN) /* Don't show <stdint.h> include */\n/*!\n * @brief An unsigned 32-bit integer.\n *\n * Not necessarily defined to `uint32_t` but functionally equivalent.\n */\ntypedef uint32_t XXH32_hash_t;\n\n#elif !defined (__VMS) \\\n  && (defined (__cplusplus) \\\n  || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )\n#   include <stdint.h>\n    typedef uint32_t XXH32_hash_t;\n\n#else\n#   include <limits.h>\n#   if UINT_MAX == 0xFFFFFFFFUL\n      typedef unsigned int XXH32_hash_t;\n#   elif ULONG_MAX == 0xFFFFFFFFUL\n      typedef unsigned long XXH32_hash_t;\n#   else\n#     error \"unsupported platform: need a 32-bit type\"\n#   endif\n#endif\n\n/*!\n * @}\n *\n * @defgroup XXH32_family XXH32 family\n * @ingroup public\n * Contains functions used in the classic 32-bit xxHash algorithm.\n *\n * @note\n *   XXH32 is useful for older platforms, with no or poor 64-bit performance.\n *   Note that the @ref XXH3_family provides competitive speed for both 32-bit\n *   and 64-bit systems, and offers true 64/128 bit hash results.\n *\n * @see @ref XXH64_family, @ref XXH3_family : Other xxHash families\n * @see @ref XXH32_impl for implementation details\n * @{\n */\n\n/*!\n * @brief Calculates the 32-bit hash of @p input using xxHash32.\n *\n * Speed on Core 2 Duo @ 3 GHz (single thread, SMHasher benchmark): 5.4 GB/s\n *\n * See @ref single_shot_example \"Single Shot Example\" for an example.\n *\n * @param input The block of data to be hashed, at least @p length bytes in size.\n * @param length The length of @p input, in bytes.\n * @param seed The 32-bit seed to alter the hash's output predictably.\n *\n * @pre\n *   The memory between @p input and @p input + @p length must be valid,\n *   readable, contiguous memory. However, if @p length is `0`, @p input may be\n *   `NULL`. In C++, this also must be *TriviallyCopyable*.\n *\n * @return The calculated 32-bit hash value.\n *\n * @see\n *    XXH64(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128():\n *    Direct equivalents for the other variants of xxHash.\n * @see\n *    XXH32_createState(), XXH32_update(), XXH32_digest(): Streaming version.\n */\nXXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32 (const void* input, size_t length, XXH32_hash_t seed);\n\n#ifndef XXH_NO_STREAM\n/*!\n * Streaming functions generate the xxHash value from an incremental input.\n * This method is slower than single-call functions, due to state management.\n * For small inputs, prefer `XXH32()` and `XXH64()`, which are better optimized.\n *\n * An XXH state must first be allocated using `XXH*_createState()`.\n *\n * Start a new hash by initializing the state with a seed using `XXH*_reset()`.\n *\n * Then, feed the hash state by calling `XXH*_update()` as many times as necessary.\n *\n * The function returns an error code, with 0 meaning OK, and any other value\n * meaning there is an error.\n *\n * Finally, a hash value can be produced anytime, by using `XXH*_digest()`.\n * This function returns the nn-bits hash as an int or long long.\n *\n * It's still possible to continue inserting input into the hash state after a\n * digest, and generate new hash values later on by invoking `XXH*_digest()`.\n *\n * When done, release the state using `XXH*_freeState()`.\n *\n * @see streaming_example at the top of @ref xxhash.h for an example.\n */\n\n/*!\n * @typedef struct XXH32_state_s XXH32_state_t\n * @brief The opaque state struct for the XXH32 streaming API.\n *\n * @see XXH32_state_s for details.\n */\ntypedef struct XXH32_state_s XXH32_state_t;\n\n/*!\n * @brief Allocates an @ref XXH32_state_t.\n *\n * Must be freed with XXH32_freeState().\n * @return An allocated XXH32_state_t on success, `NULL` on failure.\n */\nXXH_PUBLIC_API XXH_MALLOCF XXH32_state_t* XXH32_createState(void);\n/*!\n * @brief Frees an @ref XXH32_state_t.\n *\n * Must be allocated with XXH32_createState().\n * @param statePtr A pointer to an @ref XXH32_state_t allocated with @ref XXH32_createState().\n * @return XXH_OK.\n */\nXXH_PUBLIC_API XXH_errorcode  XXH32_freeState(XXH32_state_t* statePtr);\n/*!\n * @brief Copies one @ref XXH32_state_t to another.\n *\n * @param dst_state The state to copy to.\n * @param src_state The state to copy from.\n * @pre\n *   @p dst_state and @p src_state must not be `NULL` and must not overlap.\n */\nXXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dst_state, const XXH32_state_t* src_state);\n\n/*!\n * @brief Resets an @ref XXH32_state_t to begin a new hash.\n *\n * This function resets and seeds a state. Call it before @ref XXH32_update().\n *\n * @param statePtr The state struct to reset.\n * @param seed The 32-bit seed to alter the hash result predictably.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n */\nXXH_PUBLIC_API XXH_errorcode XXH32_reset  (XXH32_state_t* statePtr, XXH32_hash_t seed);\n\n/*!\n * @brief Consumes a block of @p input to an @ref XXH32_state_t.\n *\n * Call this to incrementally consume blocks of data.\n *\n * @param statePtr The state struct to update.\n * @param input The block of data to be hashed, at least @p length bytes in size.\n * @param length The length of @p input, in bytes.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n * @pre\n *   The memory between @p input and @p input + @p length must be valid,\n *   readable, contiguous memory. However, if @p length is `0`, @p input may be\n *   `NULL`. In C++, this also must be *TriviallyCopyable*.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n */\nXXH_PUBLIC_API XXH_errorcode XXH32_update (XXH32_state_t* statePtr, const void* input, size_t length);\n\n/*!\n * @brief Returns the calculated hash value from an @ref XXH32_state_t.\n *\n * @note\n *   Calling XXH32_digest() will not affect @p statePtr, so you can update,\n *   digest, and update again.\n *\n * @param statePtr The state struct to calculate the hash from.\n *\n * @pre\n *  @p statePtr must not be `NULL`.\n *\n * @return The calculated xxHash32 value from that state.\n */\nXXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_digest (const XXH32_state_t* statePtr);\n#endif /* !XXH_NO_STREAM */\n\n/*******   Canonical representation   *******/\n\n/*\n * The default return values from XXH functions are unsigned 32 and 64 bit\n * integers.\n * This the simplest and fastest format for further post-processing.\n *\n * However, this leaves open the question of what is the order on the byte level,\n * since little and big endian conventions will store the same number differently.\n *\n * The canonical representation settles this issue by mandating big-endian\n * convention, the same convention as human-readable numbers (large digits first).\n *\n * When writing hash values to storage, sending them over a network, or printing\n * them, it's highly recommended to use the canonical representation to ensure\n * portability across a wider range of systems, present and future.\n *\n * The following functions allow transformation of hash values to and from\n * canonical format.\n */\n\n/*!\n * @brief Canonical (big endian) representation of @ref XXH32_hash_t.\n */\ntypedef struct {\n    unsigned char digest[4]; /*!< Hash bytes, big endian */\n} XXH32_canonical_t;\n\n/*!\n * @brief Converts an @ref XXH32_hash_t to a big endian @ref XXH32_canonical_t.\n *\n * @param dst The @ref XXH32_canonical_t pointer to be stored to.\n * @param hash The @ref XXH32_hash_t to be converted.\n *\n * @pre\n *   @p dst must not be `NULL`.\n */\nXXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash);\n\n/*!\n * @brief Converts an @ref XXH32_canonical_t to a native @ref XXH32_hash_t.\n *\n * @param src The @ref XXH32_canonical_t to convert.\n *\n * @pre\n *   @p src must not be `NULL`.\n *\n * @return The converted hash.\n */\nXXH_PUBLIC_API XXH_PUREF XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src);\n\n\n/*! @cond Doxygen ignores this part */\n#ifdef __has_attribute\n# define XXH_HAS_ATTRIBUTE(x) __has_attribute(x)\n#else\n# define XXH_HAS_ATTRIBUTE(x) 0\n#endif\n/*! @endcond */\n\n/*! @cond Doxygen ignores this part */\n/*\n * C23 __STDC_VERSION__ number hasn't been specified yet. For now\n * leave as `201711L` (C17 + 1).\n * TODO: Update to correct value when its been specified.\n */\n#define XXH_C23_VN 201711L\n/*! @endcond */\n\n/*! @cond Doxygen ignores this part */\n/* C-language Attributes are added in C23. */\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN) && defined(__has_c_attribute)\n# define XXH_HAS_C_ATTRIBUTE(x) __has_c_attribute(x)\n#else\n# define XXH_HAS_C_ATTRIBUTE(x) 0\n#endif\n/*! @endcond */\n\n/*! @cond Doxygen ignores this part */\n#if defined(__cplusplus) && defined(__has_cpp_attribute)\n# define XXH_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)\n#else\n# define XXH_HAS_CPP_ATTRIBUTE(x) 0\n#endif\n/*! @endcond */\n\n/*! @cond Doxygen ignores this part */\n/*\n * Define XXH_FALLTHROUGH macro for annotating switch case with the 'fallthrough' attribute\n * introduced in CPP17 and C23.\n * CPP17 : https://en.cppreference.com/w/cpp/language/attributes/fallthrough\n * C23   : https://en.cppreference.com/w/c/language/attributes/fallthrough\n */\n#if XXH_HAS_C_ATTRIBUTE(fallthrough) || XXH_HAS_CPP_ATTRIBUTE(fallthrough)\n# define XXH_FALLTHROUGH [[fallthrough]]\n#elif XXH_HAS_ATTRIBUTE(__fallthrough__)\n# define XXH_FALLTHROUGH __attribute__ ((__fallthrough__))\n#else\n# define XXH_FALLTHROUGH /* fallthrough */\n#endif\n/*! @endcond */\n\n/*! @cond Doxygen ignores this part */\n/*\n * Define XXH_NOESCAPE for annotated pointers in public API.\n * https://clang.llvm.org/docs/AttributeReference.html#noescape\n * As of writing this, only supported by clang.\n */\n#if XXH_HAS_ATTRIBUTE(noescape)\n# define XXH_NOESCAPE __attribute__((noescape))\n#else\n# define XXH_NOESCAPE\n#endif\n/*! @endcond */\n\n\n/*!\n * @}\n * @ingroup public\n * @{\n */\n\n#ifndef XXH_NO_LONG_LONG\n/*-**********************************************************************\n*  64-bit hash\n************************************************************************/\n#if defined(XXH_DOXYGEN) /* don't include <stdint.h> */\n/*!\n * @brief An unsigned 64-bit integer.\n *\n * Not necessarily defined to `uint64_t` but functionally equivalent.\n */\ntypedef uint64_t XXH64_hash_t;\n#elif !defined (__VMS) \\\n  && (defined (__cplusplus) \\\n  || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )\n#  include <stdint.h>\n   typedef uint64_t XXH64_hash_t;\n#else\n#  include <limits.h>\n#  if defined(__LP64__) && ULONG_MAX == 0xFFFFFFFFFFFFFFFFULL\n     /* LP64 ABI says uint64_t is unsigned long */\n     typedef unsigned long XXH64_hash_t;\n#  else\n     /* the following type must have a width of 64-bit */\n     typedef unsigned long long XXH64_hash_t;\n#  endif\n#endif\n\n/*!\n * @}\n *\n * @defgroup XXH64_family XXH64 family\n * @ingroup public\n * @{\n * Contains functions used in the classic 64-bit xxHash algorithm.\n *\n * @note\n *   XXH3 provides competitive speed for both 32-bit and 64-bit systems,\n *   and offers true 64/128 bit hash results.\n *   It provides better speed for systems with vector processing capabilities.\n */\n\n/*!\n * @brief Calculates the 64-bit hash of @p input using xxHash64.\n *\n * This function usually runs faster on 64-bit systems, but slower on 32-bit\n * systems (see benchmark).\n *\n * @param input The block of data to be hashed, at least @p length bytes in size.\n * @param length The length of @p input, in bytes.\n * @param seed The 64-bit seed to alter the hash's output predictably.\n *\n * @pre\n *   The memory between @p input and @p input + @p length must be valid,\n *   readable, contiguous memory. However, if @p length is `0`, @p input may be\n *   `NULL`. In C++, this also must be *TriviallyCopyable*.\n *\n * @return The calculated 64-bit hash.\n *\n * @see\n *    XXH32(), XXH3_64bits_withSeed(), XXH3_128bits_withSeed(), XXH128():\n *    Direct equivalents for the other variants of xxHash.\n * @see\n *    XXH64_createState(), XXH64_update(), XXH64_digest(): Streaming version.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed);\n\n/*******   Streaming   *******/\n#ifndef XXH_NO_STREAM\n/*!\n * @brief The opaque state struct for the XXH64 streaming API.\n *\n * @see XXH64_state_s for details.\n */\ntypedef struct XXH64_state_s XXH64_state_t;   /* incomplete type */\n\n/*!\n * @brief Allocates an @ref XXH64_state_t.\n *\n * Must be freed with XXH64_freeState().\n * @return An allocated XXH64_state_t on success, `NULL` on failure.\n */\nXXH_PUBLIC_API XXH_MALLOCF XXH64_state_t* XXH64_createState(void);\n\n/*!\n * @brief Frees an @ref XXH64_state_t.\n *\n * Must be allocated with XXH64_createState().\n * @param statePtr A pointer to an @ref XXH64_state_t allocated with @ref XXH64_createState().\n * @return XXH_OK.\n */\nXXH_PUBLIC_API XXH_errorcode  XXH64_freeState(XXH64_state_t* statePtr);\n\n/*!\n * @brief Copies one @ref XXH64_state_t to another.\n *\n * @param dst_state The state to copy to.\n * @param src_state The state to copy from.\n * @pre\n *   @p dst_state and @p src_state must not be `NULL` and must not overlap.\n */\nXXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dst_state, const XXH64_state_t* src_state);\n\n/*!\n * @brief Resets an @ref XXH64_state_t to begin a new hash.\n *\n * This function resets and seeds a state. Call it before @ref XXH64_update().\n *\n * @param statePtr The state struct to reset.\n * @param seed The 64-bit seed to alter the hash result predictably.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n */\nXXH_PUBLIC_API XXH_errorcode XXH64_reset  (XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed);\n\n/*!\n * @brief Consumes a block of @p input to an @ref XXH64_state_t.\n *\n * Call this to incrementally consume blocks of data.\n *\n * @param statePtr The state struct to update.\n * @param input The block of data to be hashed, at least @p length bytes in size.\n * @param length The length of @p input, in bytes.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n * @pre\n *   The memory between @p input and @p input + @p length must be valid,\n *   readable, contiguous memory. However, if @p length is `0`, @p input may be\n *   `NULL`. In C++, this also must be *TriviallyCopyable*.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n */\nXXH_PUBLIC_API XXH_errorcode XXH64_update (XXH_NOESCAPE XXH64_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);\n\n/*!\n * @brief Returns the calculated hash value from an @ref XXH64_state_t.\n *\n * @note\n *   Calling XXH64_digest() will not affect @p statePtr, so you can update,\n *   digest, and update again.\n *\n * @param statePtr The state struct to calculate the hash from.\n *\n * @pre\n *  @p statePtr must not be `NULL`.\n *\n * @return The calculated xxHash64 value from that state.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_digest (XXH_NOESCAPE const XXH64_state_t* statePtr);\n#endif /* !XXH_NO_STREAM */\n/*******   Canonical representation   *******/\n\n/*!\n * @brief Canonical (big endian) representation of @ref XXH64_hash_t.\n */\ntypedef struct { unsigned char digest[sizeof(XXH64_hash_t)]; } XXH64_canonical_t;\n\n/*!\n * @brief Converts an @ref XXH64_hash_t to a big endian @ref XXH64_canonical_t.\n *\n * @param dst The @ref XXH64_canonical_t pointer to be stored to.\n * @param hash The @ref XXH64_hash_t to be converted.\n *\n * @pre\n *   @p dst must not be `NULL`.\n */\nXXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash);\n\n/*!\n * @brief Converts an @ref XXH64_canonical_t to a native @ref XXH64_hash_t.\n *\n * @param src The @ref XXH64_canonical_t to convert.\n *\n * @pre\n *   @p src must not be `NULL`.\n *\n * @return The converted hash.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src);\n\n#ifndef XXH_NO_XXH3\n\n/*!\n * @}\n * ************************************************************************\n * @defgroup XXH3_family XXH3 family\n * @ingroup public\n * @{\n *\n * XXH3 is a more recent hash algorithm featuring:\n *  - Improved speed for both small and large inputs\n *  - True 64-bit and 128-bit outputs\n *  - SIMD acceleration\n *  - Improved 32-bit viability\n *\n * Speed analysis methodology is explained here:\n *\n *    https://fastcompression.blogspot.com/2019/03/presenting-xxh3.html\n *\n * Compared to XXH64, expect XXH3 to run approximately\n * ~2x faster on large inputs and >3x faster on small ones,\n * exact differences vary depending on platform.\n *\n * XXH3's speed benefits greatly from SIMD and 64-bit arithmetic,\n * but does not require it.\n * Most 32-bit and 64-bit targets that can run XXH32 smoothly can run XXH3\n * at competitive speeds, even without vector support. Further details are\n * explained in the implementation.\n *\n * XXH3 has a fast scalar implementation, but it also includes accelerated SIMD\n * implementations for many common platforms:\n *   - AVX512\n *   - AVX2\n *   - SSE2\n *   - ARM NEON\n *   - WebAssembly SIMD128\n *   - POWER8 VSX\n *   - s390x ZVector\n * This can be controlled via the @ref XXH_VECTOR macro, but it automatically\n * selects the best version according to predefined macros. For the x86 family, an\n * automatic runtime dispatcher is included separately in @ref xxh_x86dispatch.c.\n *\n * XXH3 implementation is portable:\n * it has a generic C90 formulation that can be compiled on any platform,\n * all implementations generate exactly the same hash value on all platforms.\n * Starting from v0.8.0, it's also labelled \"stable\", meaning that\n * any future version will also generate the same hash value.\n *\n * XXH3 offers 2 variants, _64bits and _128bits.\n *\n * When only 64 bits are needed, prefer invoking the _64bits variant, as it\n * reduces the amount of mixing, resulting in faster speed on small inputs.\n * It's also generally simpler to manipulate a scalar return type than a struct.\n *\n * The API supports one-shot hashing, streaming mode, and custom secrets.\n */\n/*-**********************************************************************\n*  XXH3 64-bit variant\n************************************************************************/\n\n/*!\n * @brief 64-bit unseeded variant of XXH3.\n *\n * This is equivalent to @ref XXH3_64bits_withSeed() with a seed of 0, however\n * it may have slightly better performance due to constant propagation of the\n * defaults.\n *\n * @see\n *    XXH32(), XXH64(), XXH3_128bits(): equivalent for the other xxHash algorithms\n * @see\n *    XXH3_64bits_withSeed(), XXH3_64bits_withSecret(): other seeding variants\n * @see\n *    XXH3_64bits_reset(), XXH3_64bits_update(), XXH3_64bits_digest(): Streaming version.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length);\n\n/*!\n * @brief 64-bit seeded variant of XXH3\n *\n * This variant generates a custom secret on the fly based on default secret\n * altered using the `seed` value.\n *\n * While this operation is decently fast, note that it's not completely free.\n *\n * @note\n *    seed == 0 produces the same results as @ref XXH3_64bits().\n *\n * @param input The data to hash\n * @param length The length\n * @param seed The 64-bit seed to alter the state.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed);\n\n/*!\n * The bare minimum size for a custom secret.\n *\n * @see\n *  XXH3_64bits_withSecret(), XXH3_64bits_reset_withSecret(),\n *  XXH3_128bits_withSecret(), XXH3_128bits_reset_withSecret().\n */\n#define XXH3_SECRET_SIZE_MIN 136\n\n/*!\n * @brief 64-bit variant of XXH3 with a custom \"secret\".\n *\n * It's possible to provide any blob of bytes as a \"secret\" to generate the hash.\n * This makes it more difficult for an external actor to prepare an intentional collision.\n * The main condition is that secretSize *must* be large enough (>= XXH3_SECRET_SIZE_MIN).\n * However, the quality of the secret impacts the dispersion of the hash algorithm.\n * Therefore, the secret _must_ look like a bunch of random bytes.\n * Avoid \"trivial\" or structured data such as repeated sequences or a text document.\n * Whenever in doubt about the \"randomness\" of the blob of bytes,\n * consider employing \"XXH3_generateSecret()\" instead (see below).\n * It will generate a proper high entropy secret derived from the blob of bytes.\n * Another advantage of using XXH3_generateSecret() is that\n * it guarantees that all bits within the initial blob of bytes\n * will impact every bit of the output.\n * This is not necessarily the case when using the blob of bytes directly\n * because, when hashing _small_ inputs, only a portion of the secret is employed.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t XXH3_64bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize);\n\n\n/*******   Streaming   *******/\n#ifndef XXH_NO_STREAM\n/*\n * Streaming requires state maintenance.\n * This operation costs memory and CPU.\n * As a consequence, streaming is slower than one-shot hashing.\n * For better performance, prefer one-shot functions whenever applicable.\n */\n\n/*!\n * @brief The state struct for the XXH3 streaming API.\n *\n * @see XXH3_state_s for details.\n */\ntypedef struct XXH3_state_s XXH3_state_t;\nXXH_PUBLIC_API XXH_MALLOCF XXH3_state_t* XXH3_createState(void);\nXXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr);\n\n/*!\n * @brief Copies one @ref XXH3_state_t to another.\n *\n * @param dst_state The state to copy to.\n * @param src_state The state to copy from.\n * @pre\n *   @p dst_state and @p src_state must not be `NULL` and must not overlap.\n */\nXXH_PUBLIC_API void XXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state);\n\n/*!\n * @brief Resets an @ref XXH3_state_t to begin a new hash.\n *\n * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_64bits_update().\n * Digest will be equivalent to `XXH3_64bits()`.\n *\n * @param statePtr The state struct to reset.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n *\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr);\n\n/*!\n * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash.\n *\n * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_64bits_update().\n * Digest will be equivalent to `XXH3_64bits_withSeed()`.\n *\n * @param statePtr The state struct to reset.\n * @param seed     The 64-bit seed to alter the state.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n *\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed);\n\n/*!\n * XXH3_64bits_reset_withSecret():\n * `secret` is referenced, it _must outlive_ the hash streaming session.\n * Similar to one-shot API, `secretSize` must be >= `XXH3_SECRET_SIZE_MIN`,\n * and the quality of produced hash values depends on secret's entropy\n * (secret's content should look like a bunch of random bytes).\n * When in doubt about the randomness of a candidate `secret`,\n * consider employing `XXH3_generateSecret()` instead (see below).\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize);\n\n/*!\n * @brief Consumes a block of @p input to an @ref XXH3_state_t.\n *\n * Call this to incrementally consume blocks of data.\n *\n * @param statePtr The state struct to update.\n * @param input The block of data to be hashed, at least @p length bytes in size.\n * @param length The length of @p input, in bytes.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n * @pre\n *   The memory between @p input and @p input + @p length must be valid,\n *   readable, contiguous memory. However, if @p length is `0`, @p input may be\n *   `NULL`. In C++, this also must be *TriviallyCopyable*.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_64bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);\n\n/*!\n * @brief Returns the calculated XXH3 64-bit hash value from an @ref XXH3_state_t.\n *\n * @note\n *   Calling XXH3_64bits_digest() will not affect @p statePtr, so you can update,\n *   digest, and update again.\n *\n * @param statePtr The state struct to calculate the hash from.\n *\n * @pre\n *  @p statePtr must not be `NULL`.\n *\n * @return The calculated XXH3 64-bit hash value from that state.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t  XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr);\n#endif /* !XXH_NO_STREAM */\n\n/* note : canonical representation of XXH3 is the same as XXH64\n * since they both produce XXH64_hash_t values */\n\n\n/*-**********************************************************************\n*  XXH3 128-bit variant\n************************************************************************/\n\n/*!\n * @brief The return value from 128-bit hashes.\n *\n * Stored in little endian order, although the fields themselves are in native\n * endianness.\n */\ntypedef struct {\n    XXH64_hash_t low64;   /*!< `value & 0xFFFFFFFFFFFFFFFF` */\n    XXH64_hash_t high64;  /*!< `value >> 64` */\n} XXH128_hash_t;\n\n/*!\n * @brief Unseeded 128-bit variant of XXH3\n *\n * The 128-bit variant of XXH3 has more strength, but it has a bit of overhead\n * for shorter inputs.\n *\n * This is equivalent to @ref XXH3_128bits_withSeed() with a seed of 0, however\n * it may have slightly better performance due to constant propagation of the\n * defaults.\n *\n * @see\n *    XXH32(), XXH64(), XXH3_64bits(): equivalent for the other xxHash algorithms\n * @see\n *    XXH3_128bits_withSeed(), XXH3_128bits_withSecret(): other seeding variants\n * @see\n *    XXH3_128bits_reset(), XXH3_128bits_update(), XXH3_128bits_digest(): Streaming version.\n */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* data, size_t len);\n/*! @brief Seeded 128-bit variant of XXH3. @see XXH3_64bits_withSeed(). */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSeed(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed);\n/*! @brief Custom secret 128-bit variant of XXH3. @see XXH3_64bits_withSecret(). */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_withSecret(XXH_NOESCAPE const void* data, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize);\n\n/*******   Streaming   *******/\n#ifndef XXH_NO_STREAM\n/*\n * Streaming requires state maintenance.\n * This operation costs memory and CPU.\n * As a consequence, streaming is slower than one-shot hashing.\n * For better performance, prefer one-shot functions whenever applicable.\n *\n * XXH3_128bits uses the same XXH3_state_t as XXH3_64bits().\n * Use already declared XXH3_createState() and XXH3_freeState().\n *\n * All reset and streaming functions have same meaning as their 64-bit counterpart.\n */\n\n/*!\n * @brief Resets an @ref XXH3_state_t to begin a new hash.\n *\n * This function resets `statePtr` and generate a secret with default parameters. Call it before @ref XXH3_128bits_update().\n * Digest will be equivalent to `XXH3_128bits()`.\n *\n * @param statePtr The state struct to reset.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n *\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr);\n\n/*!\n * @brief Resets an @ref XXH3_state_t with 64-bit seed to begin a new hash.\n *\n * This function resets `statePtr` and generate a secret from `seed`. Call it before @ref XXH3_128bits_update().\n * Digest will be equivalent to `XXH3_128bits_withSeed()`.\n *\n * @param statePtr The state struct to reset.\n * @param seed     The 64-bit seed to alter the state.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n *\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed);\n/*! @brief Custom secret 128-bit variant of XXH3. @see XXH_64bits_reset_withSecret(). */\nXXH_PUBLIC_API XXH_errorcode XXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize);\n\n/*!\n * @brief Consumes a block of @p input to an @ref XXH3_state_t.\n *\n * Call this to incrementally consume blocks of data.\n *\n * @param statePtr The state struct to update.\n * @param input The block of data to be hashed, at least @p length bytes in size.\n * @param length The length of @p input, in bytes.\n *\n * @pre\n *   @p statePtr must not be `NULL`.\n * @pre\n *   The memory between @p input and @p input + @p length must be valid,\n *   readable, contiguous memory. However, if @p length is `0`, @p input may be\n *   `NULL`. In C++, this also must be *TriviallyCopyable*.\n *\n * @return @ref XXH_OK on success, @ref XXH_ERROR on failure.\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_128bits_update (XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* input, size_t length);\n\n/*!\n * @brief Returns the calculated XXH3 128-bit hash value from an @ref XXH3_state_t.\n *\n * @note\n *   Calling XXH3_128bits_digest() will not affect @p statePtr, so you can update,\n *   digest, and update again.\n *\n * @param statePtr The state struct to calculate the hash from.\n *\n * @pre\n *  @p statePtr must not be `NULL`.\n *\n * @return The calculated XXH3 128-bit hash value from that state.\n */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* statePtr);\n#endif /* !XXH_NO_STREAM */\n\n/* Following helper functions make it possible to compare XXH128_hast_t values.\n * Since XXH128_hash_t is a structure, this capability is not offered by the language.\n * Note: For better performance, these functions can be inlined using XXH_INLINE_ALL */\n\n/*!\n * XXH128_isEqual():\n * Return: 1 if `h1` and `h2` are equal, 0 if they are not.\n */\nXXH_PUBLIC_API XXH_PUREF int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2);\n\n/*!\n * @brief Compares two @ref XXH128_hash_t\n * This comparator is compatible with stdlib's `qsort()`/`bsearch()`.\n *\n * @return: >0 if *h128_1  > *h128_2\n *          =0 if *h128_1 == *h128_2\n *          <0 if *h128_1  < *h128_2\n */\nXXH_PUBLIC_API XXH_PUREF int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2);\n\n\n/*******   Canonical representation   *******/\ntypedef struct { unsigned char digest[sizeof(XXH128_hash_t)]; } XXH128_canonical_t;\n\n\n/*!\n * @brief Converts an @ref XXH128_hash_t to a big endian @ref XXH128_canonical_t.\n *\n * @param dst The @ref XXH128_canonical_t pointer to be stored to.\n * @param hash The @ref XXH128_hash_t to be converted.\n *\n * @pre\n *   @p dst must not be `NULL`.\n */\nXXH_PUBLIC_API void XXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash);\n\n/*!\n * @brief Converts an @ref XXH128_canonical_t to a native @ref XXH128_hash_t.\n *\n * @param src The @ref XXH128_canonical_t to convert.\n *\n * @pre\n *   @p src must not be `NULL`.\n *\n * @return The converted hash.\n */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src);\n\n\n#endif  /* !XXH_NO_XXH3 */\n#endif  /* XXH_NO_LONG_LONG */\n\n/*!\n * @}\n */\n#endif /* XXHASH_H_5627135585666179 */\n\n\n\n#if defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742)\n#define XXHASH_H_STATIC_13879238742\n/* ****************************************************************************\n * This section contains declarations which are not guaranteed to remain stable.\n * They may change in future versions, becoming incompatible with a different\n * version of the library.\n * These declarations should only be used with static linking.\n * Never use them in association with dynamic linking!\n ***************************************************************************** */\n\n/*\n * These definitions are only present to allow static allocation\n * of XXH states, on stack or in a struct, for example.\n * Never **ever** access their members directly.\n */\n\n/*!\n * @internal\n * @brief Structure for XXH32 streaming API.\n *\n * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY,\n * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is\n * an opaque type. This allows fields to safely be changed.\n *\n * Typedef'd to @ref XXH32_state_t.\n * Do not access the members of this struct directly.\n * @see XXH64_state_s, XXH3_state_s\n */\nstruct XXH32_state_s {\n   XXH32_hash_t total_len_32; /*!< Total length hashed, modulo 2^32 */\n   XXH32_hash_t large_len;    /*!< Whether the hash is >= 16 (handles @ref total_len_32 overflow) */\n   XXH32_hash_t v[4];         /*!< Accumulator lanes */\n   XXH32_hash_t mem32[4];     /*!< Internal buffer for partial reads. Treated as unsigned char[16]. */\n   XXH32_hash_t memsize;      /*!< Amount of data in @ref mem32 */\n   XXH32_hash_t reserved;     /*!< Reserved field. Do not read nor write to it. */\n};   /* typedef'd to XXH32_state_t */\n\n\n#ifndef XXH_NO_LONG_LONG  /* defined when there is no 64-bit support */\n\n/*!\n * @internal\n * @brief Structure for XXH64 streaming API.\n *\n * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY,\n * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined. Otherwise it is\n * an opaque type. This allows fields to safely be changed.\n *\n * Typedef'd to @ref XXH64_state_t.\n * Do not access the members of this struct directly.\n * @see XXH32_state_s, XXH3_state_s\n */\nstruct XXH64_state_s {\n   XXH64_hash_t total_len;    /*!< Total length hashed. This is always 64-bit. */\n   XXH64_hash_t v[4];         /*!< Accumulator lanes */\n   XXH64_hash_t mem64[4];     /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */\n   XXH32_hash_t memsize;      /*!< Amount of data in @ref mem64 */\n   XXH32_hash_t reserved32;   /*!< Reserved field, needed for padding anyways*/\n   XXH64_hash_t reserved64;   /*!< Reserved field. Do not read or write to it. */\n};   /* typedef'd to XXH64_state_t */\n\n#ifndef XXH_NO_XXH3\n\n#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) /* >= C11 */\n#  include <stdalign.h>\n#  define XXH_ALIGN(n)      alignas(n)\n#elif defined(__cplusplus) && (__cplusplus >= 201103L) /* >= C++11 */\n/* In C++ alignas() is a keyword */\n#  define XXH_ALIGN(n)      alignas(n)\n#elif defined(__GNUC__)\n#  define XXH_ALIGN(n)      __attribute__ ((aligned(n)))\n#elif defined(_MSC_VER)\n#  define XXH_ALIGN(n)      __declspec(align(n))\n#else\n#  define XXH_ALIGN(n)   /* disabled */\n#endif\n\n/* Old GCC versions only accept the attribute after the type in structures. */\n#if !(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L))   /* C11+ */ \\\n    && ! (defined(__cplusplus) && (__cplusplus >= 201103L)) /* >= C++11 */ \\\n    && defined(__GNUC__)\n#   define XXH_ALIGN_MEMBER(align, type) type XXH_ALIGN(align)\n#else\n#   define XXH_ALIGN_MEMBER(align, type) XXH_ALIGN(align) type\n#endif\n\n/*!\n * @brief The size of the internal XXH3 buffer.\n *\n * This is the optimal update size for incremental hashing.\n *\n * @see XXH3_64b_update(), XXH3_128b_update().\n */\n#define XXH3_INTERNALBUFFER_SIZE 256\n\n/*!\n * @internal\n * @brief Default size of the secret buffer (and @ref XXH3_kSecret).\n *\n * This is the size used in @ref XXH3_kSecret and the seeded functions.\n *\n * Not to be confused with @ref XXH3_SECRET_SIZE_MIN.\n */\n#define XXH3_SECRET_DEFAULT_SIZE 192\n\n/*!\n * @internal\n * @brief Structure for XXH3 streaming API.\n *\n * @note This is only defined when @ref XXH_STATIC_LINKING_ONLY,\n * @ref XXH_INLINE_ALL, or @ref XXH_IMPLEMENTATION is defined.\n * Otherwise it is an opaque type.\n * Never use this definition in combination with dynamic library.\n * This allows fields to safely be changed in the future.\n *\n * @note ** This structure has a strict alignment requirement of 64 bytes!! **\n * Do not allocate this with `malloc()` or `new`,\n * it will not be sufficiently aligned.\n * Use @ref XXH3_createState() and @ref XXH3_freeState(), or stack allocation.\n *\n * Typedef'd to @ref XXH3_state_t.\n * Do never access the members of this struct directly.\n *\n * @see XXH3_INITSTATE() for stack initialization.\n * @see XXH3_createState(), XXH3_freeState().\n * @see XXH32_state_s, XXH64_state_s\n */\nstruct XXH3_state_s {\n   XXH_ALIGN_MEMBER(64, XXH64_hash_t acc[8]);\n       /*!< The 8 accumulators. See @ref XXH32_state_s::v and @ref XXH64_state_s::v */\n   XXH_ALIGN_MEMBER(64, unsigned char customSecret[XXH3_SECRET_DEFAULT_SIZE]);\n       /*!< Used to store a custom secret generated from a seed. */\n   XXH_ALIGN_MEMBER(64, unsigned char buffer[XXH3_INTERNALBUFFER_SIZE]);\n       /*!< The internal buffer. @see XXH32_state_s::mem32 */\n   XXH32_hash_t bufferedSize;\n       /*!< The amount of memory in @ref buffer, @see XXH32_state_s::memsize */\n   XXH32_hash_t useSeed;\n       /*!< Reserved field. Needed for padding on 64-bit. */\n   size_t nbStripesSoFar;\n       /*!< Number or stripes processed. */\n   XXH64_hash_t totalLen;\n       /*!< Total length hashed. 64-bit even on 32-bit targets. */\n   size_t nbStripesPerBlock;\n       /*!< Number of stripes per block. */\n   size_t secretLimit;\n       /*!< Size of @ref customSecret or @ref extSecret */\n   XXH64_hash_t seed;\n       /*!< Seed for _withSeed variants. Must be zero otherwise, @see XXH3_INITSTATE() */\n   XXH64_hash_t reserved64;\n       /*!< Reserved field. */\n   const unsigned char* extSecret;\n       /*!< Reference to an external secret for the _withSecret variants, NULL\n        *   for other variants. */\n   /* note: there may be some padding at the end due to alignment on 64 bytes */\n}; /* typedef'd to XXH3_state_t */\n\n#undef XXH_ALIGN_MEMBER\n\n/*!\n * @brief Initializes a stack-allocated `XXH3_state_s`.\n *\n * When the @ref XXH3_state_t structure is merely emplaced on stack,\n * it should be initialized with XXH3_INITSTATE() or a memset()\n * in case its first reset uses XXH3_NNbits_reset_withSeed().\n * This init can be omitted if the first reset uses default or _withSecret mode.\n * This operation isn't necessary when the state is created with XXH3_createState().\n * Note that this doesn't prepare the state for a streaming operation,\n * it's still necessary to use XXH3_NNbits_reset*() afterwards.\n */\n#define XXH3_INITSTATE(XXH3_state_ptr)                       \\\n    do {                                                     \\\n        XXH3_state_t* tmp_xxh3_state_ptr = (XXH3_state_ptr); \\\n        tmp_xxh3_state_ptr->seed = 0;                        \\\n        tmp_xxh3_state_ptr->extSecret = NULL;                \\\n    } while(0)\n\n\n/*!\n * simple alias to pre-selected XXH3_128bits variant\n */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t XXH128(XXH_NOESCAPE const void* data, size_t len, XXH64_hash_t seed);\n\n\n/* ===   Experimental API   === */\n/* Symbols defined below must be considered tied to a specific library version. */\n\n/*!\n * XXH3_generateSecret():\n *\n * Derive a high-entropy secret from any user-defined content, named customSeed.\n * The generated secret can be used in combination with `*_withSecret()` functions.\n * The `_withSecret()` variants are useful to provide a higher level of protection\n * than 64-bit seed, as it becomes much more difficult for an external actor to\n * guess how to impact the calculation logic.\n *\n * The function accepts as input a custom seed of any length and any content,\n * and derives from it a high-entropy secret of length @p secretSize into an\n * already allocated buffer @p secretBuffer.\n *\n * The generated secret can then be used with any `*_withSecret()` variant.\n * The functions @ref XXH3_128bits_withSecret(), @ref XXH3_64bits_withSecret(),\n * @ref XXH3_128bits_reset_withSecret() and @ref XXH3_64bits_reset_withSecret()\n * are part of this list. They all accept a `secret` parameter\n * which must be large enough for implementation reasons (>= @ref XXH3_SECRET_SIZE_MIN)\n * _and_ feature very high entropy (consist of random-looking bytes).\n * These conditions can be a high bar to meet, so @ref XXH3_generateSecret() can\n * be employed to ensure proper quality.\n *\n * @p customSeed can be anything. It can have any size, even small ones,\n * and its content can be anything, even \"poor entropy\" sources such as a bunch\n * of zeroes. The resulting `secret` will nonetheless provide all required qualities.\n *\n * @pre\n *   - @p secretSize must be >= @ref XXH3_SECRET_SIZE_MIN\n *   - When @p customSeedSize > 0, supplying NULL as customSeed is undefined behavior.\n *\n * Example code:\n * @code{.c}\n *    #include <stdio.h>\n *    #include <stdlib.h>\n *    #include <string.h>\n *    #define XXH_STATIC_LINKING_ONLY // expose unstable API\n *    #include \"xxhash.h\"\n *    // Hashes argv[2] using the entropy from argv[1].\n *    int main(int argc, char* argv[])\n *    {\n *        char secret[XXH3_SECRET_SIZE_MIN];\n *        if (argv != 3) { return 1; }\n *        XXH3_generateSecret(secret, sizeof(secret), argv[1], strlen(argv[1]));\n *        XXH64_hash_t h = XXH3_64bits_withSecret(\n *             argv[2], strlen(argv[2]),\n *             secret, sizeof(secret)\n *        );\n *        printf(\"%016llx\\n\", (unsigned long long) h);\n *    }\n * @endcode\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize);\n\n/*!\n * @brief Generate the same secret as the _withSeed() variants.\n *\n * The generated secret can be used in combination with\n *`*_withSecret()` and `_withSecretandSeed()` variants.\n *\n * Example C++ `std::string` hash class:\n * @code{.cpp}\n *    #include <string>\n *    #define XXH_STATIC_LINKING_ONLY // expose unstable API\n *    #include \"xxhash.h\"\n *    // Slow, seeds each time\n *    class HashSlow {\n *        XXH64_hash_t seed;\n *    public:\n *        HashSlow(XXH64_hash_t s) : seed{s} {}\n *        size_t operator()(const std::string& x) const {\n *            return size_t{XXH3_64bits_withSeed(x.c_str(), x.length(), seed)};\n *        }\n *    };\n *    // Fast, caches the seeded secret for future uses.\n *    class HashFast {\n *        unsigned char secret[XXH3_SECRET_SIZE_MIN];\n *    public:\n *        HashFast(XXH64_hash_t s) {\n *            XXH3_generateSecret_fromSeed(secret, seed);\n *        }\n *        size_t operator()(const std::string& x) const {\n *            return size_t{\n *                XXH3_64bits_withSecret(x.c_str(), x.length(), secret, sizeof(secret))\n *            };\n *        }\n *    };\n * @endcode\n * @param secretBuffer A writable buffer of @ref XXH3_SECRET_SIZE_MIN bytes\n * @param seed The seed to seed the state.\n */\nXXH_PUBLIC_API void XXH3_generateSecret_fromSeed(XXH_NOESCAPE void* secretBuffer, XXH64_hash_t seed);\n\n/*!\n * These variants generate hash values using either\n * @p seed for \"short\" keys (< XXH3_MIDSIZE_MAX = 240 bytes)\n * or @p secret for \"large\" keys (>= XXH3_MIDSIZE_MAX).\n *\n * This generally benefits speed, compared to `_withSeed()` or `_withSecret()`.\n * `_withSeed()` has to generate the secret on the fly for \"large\" keys.\n * It's fast, but can be perceptible for \"not so large\" keys (< 1 KB).\n * `_withSecret()` has to generate the masks on the fly for \"small\" keys,\n * which requires more instructions than _withSeed() variants.\n * Therefore, _withSecretandSeed variant combines the best of both worlds.\n *\n * When @p secret has been generated by XXH3_generateSecret_fromSeed(),\n * this variant produces *exactly* the same results as `_withSeed()` variant,\n * hence offering only a pure speed benefit on \"large\" input,\n * by skipping the need to regenerate the secret for every large input.\n *\n * Another usage scenario is to hash the secret to a 64-bit hash value,\n * for example with XXH3_64bits(), which then becomes the seed,\n * and then employ both the seed and the secret in _withSecretandSeed().\n * On top of speed, an added benefit is that each bit in the secret\n * has a 50% chance to swap each bit in the output, via its impact to the seed.\n *\n * This is not guaranteed when using the secret directly in \"small data\" scenarios,\n * because only portions of the secret are employed for small data.\n */\nXXH_PUBLIC_API XXH_PUREF XXH64_hash_t\nXXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* data, size_t len,\n                              XXH_NOESCAPE const void* secret, size_t secretSize,\n                              XXH64_hash_t seed);\n/*! @copydoc XXH3_64bits_withSecretandSeed() */\nXXH_PUBLIC_API XXH_PUREF XXH128_hash_t\nXXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length,\n                               XXH_NOESCAPE const void* secret, size_t secretSize,\n                               XXH64_hash_t seed64);\n#ifndef XXH_NO_STREAM\n/*! @copydoc XXH3_64bits_withSecretandSeed() */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr,\n                                    XXH_NOESCAPE const void* secret, size_t secretSize,\n                                    XXH64_hash_t seed64);\n/*! @copydoc XXH3_64bits_withSecretandSeed() */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr,\n                                     XXH_NOESCAPE const void* secret, size_t secretSize,\n                                     XXH64_hash_t seed64);\n#endif /* !XXH_NO_STREAM */\n\n#endif  /* !XXH_NO_XXH3 */\n#endif  /* XXH_NO_LONG_LONG */\n#if defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API)\n#  define XXH_IMPLEMENTATION\n#endif\n\n#endif  /* defined(XXH_STATIC_LINKING_ONLY) && !defined(XXHASH_H_STATIC_13879238742) */\n\n\n/* ======================================================================== */\n/* ======================================================================== */\n/* ======================================================================== */\n\n\n/*-**********************************************************************\n * xxHash implementation\n *-**********************************************************************\n * xxHash's implementation used to be hosted inside xxhash.c.\n *\n * However, inlining requires implementation to be visible to the compiler,\n * hence be included alongside the header.\n * Previously, implementation was hosted inside xxhash.c,\n * which was then #included when inlining was activated.\n * This construction created issues with a few build and install systems,\n * as it required xxhash.c to be stored in /include directory.\n *\n * xxHash implementation is now directly integrated within xxhash.h.\n * As a consequence, xxhash.c is no longer needed in /include.\n *\n * xxhash.c is still available and is still useful.\n * In a \"normal\" setup, when xxhash is not inlined,\n * xxhash.h only exposes the prototypes and public symbols,\n * while xxhash.c can be built into an object file xxhash.o\n * which can then be linked into the final binary.\n ************************************************************************/\n\n#if ( defined(XXH_INLINE_ALL) || defined(XXH_PRIVATE_API) \\\n   || defined(XXH_IMPLEMENTATION) ) && !defined(XXH_IMPLEM_13a8737387)\n#  define XXH_IMPLEM_13a8737387\n\n/* *************************************\n*  Tuning parameters\n***************************************/\n\n/*!\n * @defgroup tuning Tuning parameters\n * @{\n *\n * Various macros to control xxHash's behavior.\n */\n#ifdef XXH_DOXYGEN\n/*!\n * @brief Define this to disable 64-bit code.\n *\n * Useful if only using the @ref XXH32_family and you have a strict C90 compiler.\n */\n#  define XXH_NO_LONG_LONG\n#  undef XXH_NO_LONG_LONG /* don't actually */\n/*!\n * @brief Controls how unaligned memory is accessed.\n *\n * By default, access to unaligned memory is controlled by `memcpy()`, which is\n * safe and portable.\n *\n * Unfortunately, on some target/compiler combinations, the generated assembly\n * is sub-optimal.\n *\n * The below switch allow selection of a different access method\n * in the search for improved performance.\n *\n * @par Possible options:\n *\n *  - `XXH_FORCE_MEMORY_ACCESS=0` (default): `memcpy`\n *   @par\n *     Use `memcpy()`. Safe and portable. Note that most modern compilers will\n *     eliminate the function call and treat it as an unaligned access.\n *\n *  - `XXH_FORCE_MEMORY_ACCESS=1`: `__attribute__((aligned(1)))`\n *   @par\n *     Depends on compiler extensions and is therefore not portable.\n *     This method is safe _if_ your compiler supports it,\n *     and *generally* as fast or faster than `memcpy`.\n *\n *  - `XXH_FORCE_MEMORY_ACCESS=2`: Direct cast\n *  @par\n *     Casts directly and dereferences. This method doesn't depend on the\n *     compiler, but it violates the C standard as it directly dereferences an\n *     unaligned pointer. It can generate buggy code on targets which do not\n *     support unaligned memory accesses, but in some circumstances, it's the\n *     only known way to get the most performance.\n *\n *  - `XXH_FORCE_MEMORY_ACCESS=3`: Byteshift\n *  @par\n *     Also portable. This can generate the best code on old compilers which don't\n *     inline small `memcpy()` calls, and it might also be faster on big-endian\n *     systems which lack a native byteswap instruction. However, some compilers\n *     will emit literal byteshifts even if the target supports unaligned access.\n *\n *\n * @warning\n *   Methods 1 and 2 rely on implementation-defined behavior. Use these with\n *   care, as what works on one compiler/platform/optimization level may cause\n *   another to read garbage data or even crash.\n *\n * See https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html for details.\n *\n * Prefer these methods in priority order (0 > 3 > 1 > 2)\n */\n#  define XXH_FORCE_MEMORY_ACCESS 0\n\n/*!\n * @def XXH_SIZE_OPT\n * @brief Controls how much xxHash optimizes for size.\n *\n * xxHash, when compiled, tends to result in a rather large binary size. This\n * is mostly due to heavy usage to forced inlining and constant folding of the\n * @ref XXH3_family to increase performance.\n *\n * However, some developers prefer size over speed. This option can\n * significantly reduce the size of the generated code. When using the `-Os`\n * or `-Oz` options on GCC or Clang, this is defined to 1 by default,\n * otherwise it is defined to 0.\n *\n * Most of these size optimizations can be controlled manually.\n *\n * This is a number from 0-2.\n *  - `XXH_SIZE_OPT` == 0: Default. xxHash makes no size optimizations. Speed\n *    comes first.\n *  - `XXH_SIZE_OPT` == 1: Default for `-Os` and `-Oz`. xxHash is more\n *    conservative and disables hacks that increase code size. It implies the\n *    options @ref XXH_NO_INLINE_HINTS == 1, @ref XXH_FORCE_ALIGN_CHECK == 0,\n *    and @ref XXH3_NEON_LANES == 8 if they are not already defined.\n *  - `XXH_SIZE_OPT` == 2: xxHash tries to make itself as small as possible.\n *    Performance may cry. For example, the single shot functions just use the\n *    streaming API.\n */\n#  define XXH_SIZE_OPT 0\n\n/*!\n * @def XXH_FORCE_ALIGN_CHECK\n * @brief If defined to non-zero, adds a special path for aligned inputs (XXH32()\n * and XXH64() only).\n *\n * This is an important performance trick for architectures without decent\n * unaligned memory access performance.\n *\n * It checks for input alignment, and when conditions are met, uses a \"fast\n * path\" employing direct 32-bit/64-bit reads, resulting in _dramatically\n * faster_ read speed.\n *\n * The check costs one initial branch per hash, which is generally negligible,\n * but not zero.\n *\n * Moreover, it's not useful to generate an additional code path if memory\n * access uses the same instruction for both aligned and unaligned\n * addresses (e.g. x86 and aarch64).\n *\n * In these cases, the alignment check can be removed by setting this macro to 0.\n * Then the code will always use unaligned memory access.\n * Align check is automatically disabled on x86, x64, ARM64, and some ARM chips\n * which are platforms known to offer good unaligned memory accesses performance.\n *\n * It is also disabled by default when @ref XXH_SIZE_OPT >= 1.\n *\n * This option does not affect XXH3 (only XXH32 and XXH64).\n */\n#  define XXH_FORCE_ALIGN_CHECK 0\n\n/*!\n * @def XXH_NO_INLINE_HINTS\n * @brief When non-zero, sets all functions to `static`.\n *\n * By default, xxHash tries to force the compiler to inline almost all internal\n * functions.\n *\n * This can usually improve performance due to reduced jumping and improved\n * constant folding, but significantly increases the size of the binary which\n * might not be favorable.\n *\n * Additionally, sometimes the forced inlining can be detrimental to performance,\n * depending on the architecture.\n *\n * XXH_NO_INLINE_HINTS marks all internal functions as static, giving the\n * compiler full control on whether to inline or not.\n *\n * When not optimizing (-O0), using `-fno-inline` with GCC or Clang, or if\n * @ref XXH_SIZE_OPT >= 1, this will automatically be defined.\n */\n#  define XXH_NO_INLINE_HINTS 0\n\n/*!\n * @def XXH3_INLINE_SECRET\n * @brief Determines whether to inline the XXH3 withSecret code.\n *\n * When the secret size is known, the compiler can improve the performance\n * of XXH3_64bits_withSecret() and XXH3_128bits_withSecret().\n *\n * However, if the secret size is not known, it doesn't have any benefit. This\n * happens when xxHash is compiled into a global symbol. Therefore, if\n * @ref XXH_INLINE_ALL is *not* defined, this will be defined to 0.\n *\n * Additionally, this defaults to 0 on GCC 12+, which has an issue with function pointers\n * that are *sometimes* force inline on -Og, and it is impossible to automatically\n * detect this optimization level.\n */\n#  define XXH3_INLINE_SECRET 0\n\n/*!\n * @def XXH32_ENDJMP\n * @brief Whether to use a jump for `XXH32_finalize`.\n *\n * For performance, `XXH32_finalize` uses multiple branches in the finalizer.\n * This is generally preferable for performance,\n * but depending on exact architecture, a jmp may be preferable.\n *\n * This setting is only possibly making a difference for very small inputs.\n */\n#  define XXH32_ENDJMP 0\n\n/*!\n * @internal\n * @brief Redefines old internal names.\n *\n * For compatibility with code that uses xxHash's internals before the names\n * were changed to improve namespacing. There is no other reason to use this.\n */\n#  define XXH_OLD_NAMES\n#  undef XXH_OLD_NAMES /* don't actually use, it is ugly. */\n\n/*!\n * @def XXH_NO_STREAM\n * @brief Disables the streaming API.\n *\n * When xxHash is not inlined and the streaming functions are not used, disabling\n * the streaming functions can improve code size significantly, especially with\n * the @ref XXH3_family which tends to make constant folded copies of itself.\n */\n#  define XXH_NO_STREAM\n#  undef XXH_NO_STREAM /* don't actually */\n#endif /* XXH_DOXYGEN */\n/*!\n * @}\n */\n\n#ifndef XXH_FORCE_MEMORY_ACCESS   /* can be defined externally, on command line for example */\n   /* prefer __packed__ structures (method 1) for GCC\n    * < ARMv7 with unaligned access (e.g. Raspbian armhf) still uses byte shifting, so we use memcpy\n    * which for some reason does unaligned loads. */\n#  if defined(__GNUC__) && !(defined(__ARM_ARCH) && __ARM_ARCH < 7 && defined(__ARM_FEATURE_UNALIGNED))\n#    define XXH_FORCE_MEMORY_ACCESS 1\n#  endif\n#endif\n\n#ifndef XXH_SIZE_OPT\n   /* default to 1 for -Os or -Oz */\n#  if (defined(__GNUC__) || defined(__clang__)) && defined(__OPTIMIZE_SIZE__)\n#    define XXH_SIZE_OPT 1\n#  else\n#    define XXH_SIZE_OPT 0\n#  endif\n#endif\n\n#ifndef XXH_FORCE_ALIGN_CHECK  /* can be defined externally */\n   /* don't check on sizeopt, x86, aarch64, or arm when unaligned access is available */\n#  if XXH_SIZE_OPT >= 1 || \\\n      defined(__i386)  || defined(__x86_64__) || defined(__aarch64__) || defined(__ARM_FEATURE_UNALIGNED) \\\n   || defined(_M_IX86) || defined(_M_X64)     || defined(_M_ARM64)    || defined(_M_ARM) /* visual */\n#    define XXH_FORCE_ALIGN_CHECK 0\n#  else\n#    define XXH_FORCE_ALIGN_CHECK 1\n#  endif\n#endif\n\n#ifndef XXH_NO_INLINE_HINTS\n#  if XXH_SIZE_OPT >= 1 || defined(__NO_INLINE__)  /* -O0, -fno-inline */\n#    define XXH_NO_INLINE_HINTS 1\n#  else\n#    define XXH_NO_INLINE_HINTS 0\n#  endif\n#endif\n\n#ifndef XXH3_INLINE_SECRET\n#  if (defined(__GNUC__) && !defined(__clang__) && __GNUC__ >= 12) \\\n     || !defined(XXH_INLINE_ALL)\n#    define XXH3_INLINE_SECRET 0\n#  else\n#    define XXH3_INLINE_SECRET 1\n#  endif\n#endif\n\n#ifndef XXH32_ENDJMP\n/* generally preferable for performance */\n#  define XXH32_ENDJMP 0\n#endif\n\n/*!\n * @defgroup impl Implementation\n * @{\n */\n\n\n/* *************************************\n*  Includes & Memory related functions\n***************************************/\n#if defined(XXH_NO_STREAM)\n/* nothing */\n#elif defined(XXH_NO_STDLIB)\n\n/* When requesting to disable any mention of stdlib,\n * the library loses the ability to invoked malloc / free.\n * In practice, it means that functions like `XXH*_createState()`\n * will always fail, and return NULL.\n * This flag is useful in situations where\n * xxhash.h is integrated into some kernel, embedded or limited environment\n * without access to dynamic allocation.\n */\n\nstatic XXH_CONSTF void* XXH_malloc(size_t s) { (void)s; return NULL; }\nstatic void XXH_free(void* p) { (void)p; }\n\n#else\n\n/*\n * Modify the local functions below should you wish to use\n * different memory routines for malloc() and free()\n */\n#include <stdlib.h>\n\n/*!\n * @internal\n * @brief Modify this function to use a different routine than malloc().\n */\nstatic XXH_MALLOCF void* XXH_malloc(size_t s) { return malloc(s); }\n\n/*!\n * @internal\n * @brief Modify this function to use a different routine than free().\n */\nstatic void XXH_free(void* p) { free(p); }\n\n#endif  /* XXH_NO_STDLIB */\n\n#include <string.h>\n\n/*!\n * @internal\n * @brief Modify this function to use a different routine than memcpy().\n */\nstatic void* XXH_memcpy(void* dest, const void* src, size_t size)\n{\n    return memcpy(dest,src,size);\n}\n\n#include <limits.h>   /* ULLONG_MAX */\n\n\n/* *************************************\n*  Compiler Specific Options\n***************************************/\n#ifdef _MSC_VER /* Visual Studio warning fix */\n#  pragma warning(disable : 4127) /* disable: C4127: conditional expression is constant */\n#endif\n\n#if XXH_NO_INLINE_HINTS  /* disable inlining hints */\n#  if defined(__GNUC__) || defined(__clang__)\n#    define XXH_FORCE_INLINE static __attribute__((unused))\n#  else\n#    define XXH_FORCE_INLINE static\n#  endif\n#  define XXH_NO_INLINE static\n/* enable inlining hints */\n#elif defined(__GNUC__) || defined(__clang__)\n#  define XXH_FORCE_INLINE static __inline__ __attribute__((always_inline, unused))\n#  define XXH_NO_INLINE static __attribute__((noinline))\n#elif defined(_MSC_VER)  /* Visual Studio */\n#  define XXH_FORCE_INLINE static __forceinline\n#  define XXH_NO_INLINE static __declspec(noinline)\n#elif defined (__cplusplus) \\\n  || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L))   /* C99 */\n#  define XXH_FORCE_INLINE static inline\n#  define XXH_NO_INLINE static\n#else\n#  define XXH_FORCE_INLINE static\n#  define XXH_NO_INLINE static\n#endif\n\n#if XXH3_INLINE_SECRET\n#  define XXH3_WITH_SECRET_INLINE XXH_FORCE_INLINE\n#else\n#  define XXH3_WITH_SECRET_INLINE XXH_NO_INLINE\n#endif\n\n\n/* *************************************\n*  Debug\n***************************************/\n/*!\n * @ingroup tuning\n * @def XXH_DEBUGLEVEL\n * @brief Sets the debugging level.\n *\n * XXH_DEBUGLEVEL is expected to be defined externally, typically via the\n * compiler's command line options. The value must be a number.\n */\n#ifndef XXH_DEBUGLEVEL\n#  ifdef DEBUGLEVEL /* backwards compat */\n#    define XXH_DEBUGLEVEL DEBUGLEVEL\n#  else\n#    define XXH_DEBUGLEVEL 0\n#  endif\n#endif\n\n#if (XXH_DEBUGLEVEL>=1)\n#  include <assert.h>   /* note: can still be disabled with NDEBUG */\n#  define XXH_ASSERT(c)   assert(c)\n#else\n#  if defined(__INTEL_COMPILER)\n#    define XXH_ASSERT(c)   XXH_ASSUME((unsigned char) (c))\n#  else\n#    define XXH_ASSERT(c)   XXH_ASSUME(c)\n#  endif\n#endif\n\n/* note: use after variable declarations */\n#ifndef XXH_STATIC_ASSERT\n#  if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L)    /* C11 */\n#    define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { _Static_assert((c),m); } while(0)\n#  elif defined(__cplusplus) && (__cplusplus >= 201103L)            /* C++11 */\n#    define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { static_assert((c),m); } while(0)\n#  else\n#    define XXH_STATIC_ASSERT_WITH_MESSAGE(c,m) do { struct xxh_sa { char x[(c) ? 1 : -1]; }; } while(0)\n#  endif\n#  define XXH_STATIC_ASSERT(c) XXH_STATIC_ASSERT_WITH_MESSAGE((c),#c)\n#endif\n\n/*!\n * @internal\n * @def XXH_COMPILER_GUARD(var)\n * @brief Used to prevent unwanted optimizations for @p var.\n *\n * It uses an empty GCC inline assembly statement with a register constraint\n * which forces @p var into a general purpose register (eg eax, ebx, ecx\n * on x86) and marks it as modified.\n *\n * This is used in a few places to avoid unwanted autovectorization (e.g.\n * XXH32_round()). All vectorization we want is explicit via intrinsics,\n * and _usually_ isn't wanted elsewhere.\n *\n * We also use it to prevent unwanted constant folding for AArch64 in\n * XXH3_initCustomSecret_scalar().\n */\n#if defined(__GNUC__) || defined(__clang__)\n#  define XXH_COMPILER_GUARD(var) __asm__(\"\" : \"+r\" (var))\n#else\n#  define XXH_COMPILER_GUARD(var) ((void)0)\n#endif\n\n/* Specifically for NEON vectors which use the \"w\" constraint, on\n * Clang. */\n#if defined(__clang__) && defined(__ARM_ARCH) && !defined(__wasm__)\n#  define XXH_COMPILER_GUARD_CLANG_NEON(var) __asm__(\"\" : \"+w\" (var))\n#else\n#  define XXH_COMPILER_GUARD_CLANG_NEON(var) ((void)0)\n#endif\n\n/* *************************************\n*  Basic Types\n***************************************/\n#if !defined (__VMS) \\\n && (defined (__cplusplus) \\\n || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )\n# include <stdint.h>\n  typedef uint8_t xxh_u8;\n#else\n  typedef unsigned char xxh_u8;\n#endif\ntypedef XXH32_hash_t xxh_u32;\n\n#ifdef XXH_OLD_NAMES\n#  warning \"XXH_OLD_NAMES is planned to be removed starting v0.9. If the program depends on it, consider moving away from it by employing newer type names directly\"\n#  define BYTE xxh_u8\n#  define U8   xxh_u8\n#  define U32  xxh_u32\n#endif\n\n/* ***   Memory access   *** */\n\n/*!\n * @internal\n * @fn xxh_u32 XXH_read32(const void* ptr)\n * @brief Reads an unaligned 32-bit integer from @p ptr in native endianness.\n *\n * Affected by @ref XXH_FORCE_MEMORY_ACCESS.\n *\n * @param ptr The pointer to read from.\n * @return The 32-bit native endian integer from the bytes at @p ptr.\n */\n\n/*!\n * @internal\n * @fn xxh_u32 XXH_readLE32(const void* ptr)\n * @brief Reads an unaligned 32-bit little endian integer from @p ptr.\n *\n * Affected by @ref XXH_FORCE_MEMORY_ACCESS.\n *\n * @param ptr The pointer to read from.\n * @return The 32-bit little endian integer from the bytes at @p ptr.\n */\n\n/*!\n * @internal\n * @fn xxh_u32 XXH_readBE32(const void* ptr)\n * @brief Reads an unaligned 32-bit big endian integer from @p ptr.\n *\n * Affected by @ref XXH_FORCE_MEMORY_ACCESS.\n *\n * @param ptr The pointer to read from.\n * @return The 32-bit big endian integer from the bytes at @p ptr.\n */\n\n/*!\n * @internal\n * @fn xxh_u32 XXH_readLE32_align(const void* ptr, XXH_alignment align)\n * @brief Like @ref XXH_readLE32(), but has an option for aligned reads.\n *\n * Affected by @ref XXH_FORCE_MEMORY_ACCESS.\n * Note that when @ref XXH_FORCE_ALIGN_CHECK == 0, the @p align parameter is\n * always @ref XXH_alignment::XXH_unaligned.\n *\n * @param ptr The pointer to read from.\n * @param align Whether @p ptr is aligned.\n * @pre\n *   If @p align == @ref XXH_alignment::XXH_aligned, @p ptr must be 4 byte\n *   aligned.\n * @return The 32-bit little endian integer from the bytes at @p ptr.\n */\n\n#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))\n/*\n * Manual byteshift. Best for old compilers which don't inline memcpy.\n * We actually directly use XXH_readLE32 and XXH_readBE32.\n */\n#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))\n\n/*\n * Force direct memory access. Only works on CPU which support unaligned memory\n * access in hardware.\n */\nstatic xxh_u32 XXH_read32(const void* memPtr) { return *(const xxh_u32*) memPtr; }\n\n#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))\n\n/*\n * __attribute__((aligned(1))) is supported by gcc and clang. Originally the\n * documentation claimed that it only increased the alignment, but actually it\n * can decrease it on gcc, clang, and icc:\n * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502,\n * https://gcc.godbolt.org/z/xYez1j67Y.\n */\n#ifdef XXH_OLD_NAMES\ntypedef union { xxh_u32 u32; } __attribute__((packed)) unalign;\n#endif\nstatic xxh_u32 XXH_read32(const void* ptr)\n{\n    typedef __attribute__((aligned(1))) xxh_u32 xxh_unalign32;\n    return *((const xxh_unalign32*)ptr);\n}\n\n#else\n\n/*\n * Portable and safe solution. Generally efficient.\n * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html\n */\nstatic xxh_u32 XXH_read32(const void* memPtr)\n{\n    xxh_u32 val;\n    XXH_memcpy(&val, memPtr, sizeof(val));\n    return val;\n}\n\n#endif   /* XXH_FORCE_DIRECT_MEMORY_ACCESS */\n\n\n/* ***   Endianness   *** */\n\n/*!\n * @ingroup tuning\n * @def XXH_CPU_LITTLE_ENDIAN\n * @brief Whether the target is little endian.\n *\n * Defined to 1 if the target is little endian, or 0 if it is big endian.\n * It can be defined externally, for example on the compiler command line.\n *\n * If it is not defined,\n * a runtime check (which is usually constant folded) is used instead.\n *\n * @note\n *   This is not necessarily defined to an integer constant.\n *\n * @see XXH_isLittleEndian() for the runtime check.\n */\n#ifndef XXH_CPU_LITTLE_ENDIAN\n/*\n * Try to detect endianness automatically, to avoid the nonstandard behavior\n * in `XXH_isLittleEndian()`\n */\n#  if defined(_WIN32) /* Windows is always little endian */ \\\n     || defined(__LITTLE_ENDIAN__) \\\n     || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)\n#    define XXH_CPU_LITTLE_ENDIAN 1\n#  elif defined(__BIG_ENDIAN__) \\\n     || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)\n#    define XXH_CPU_LITTLE_ENDIAN 0\n#  else\n/*!\n * @internal\n * @brief Runtime check for @ref XXH_CPU_LITTLE_ENDIAN.\n *\n * Most compilers will constant fold this.\n */\nstatic int XXH_isLittleEndian(void)\n{\n    /*\n     * Portable and well-defined behavior.\n     * Don't use static: it is detrimental to performance.\n     */\n    const union { xxh_u32 u; xxh_u8 c[4]; } one = { 1 };\n    return one.c[0];\n}\n#   define XXH_CPU_LITTLE_ENDIAN   XXH_isLittleEndian()\n#  endif\n#endif\n\n\n\n\n/* ****************************************\n*  Compiler-specific Functions and Macros\n******************************************/\n#define XXH_GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)\n\n#ifdef __has_builtin\n#  define XXH_HAS_BUILTIN(x) __has_builtin(x)\n#else\n#  define XXH_HAS_BUILTIN(x) 0\n#endif\n\n\n\n/*\n * C23 and future versions have standard \"unreachable()\".\n * Once it has been implemented reliably we can add it as an\n * additional case:\n *\n * ```\n * #if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= XXH_C23_VN)\n * #  include <stddef.h>\n * #  ifdef unreachable\n * #    define XXH_UNREACHABLE() unreachable()\n * #  endif\n * #endif\n * ```\n *\n * Note C++23 also has std::unreachable() which can be detected\n * as follows:\n * ```\n * #if defined(__cpp_lib_unreachable) && (__cpp_lib_unreachable >= 202202L)\n * #  include <utility>\n * #  define XXH_UNREACHABLE() std::unreachable()\n * #endif\n * ```\n * NB: `__cpp_lib_unreachable` is defined in the `<version>` header.\n * We don't use that as including `<utility>` in `extern \"C\"` blocks\n * doesn't work on GCC12\n */\n\n#if XXH_HAS_BUILTIN(__builtin_unreachable)\n#  define XXH_UNREACHABLE() __builtin_unreachable()\n\n#elif defined(_MSC_VER)\n#  define XXH_UNREACHABLE() __assume(0)\n\n#else\n#  define XXH_UNREACHABLE()\n#endif\n\n#if XXH_HAS_BUILTIN(__builtin_assume)\n#  define XXH_ASSUME(c) __builtin_assume(c)\n#else\n#  define XXH_ASSUME(c) if (!(c)) { XXH_UNREACHABLE(); }\n#endif\n\n/*!\n * @internal\n * @def XXH_rotl32(x,r)\n * @brief 32-bit rotate left.\n *\n * @param x The 32-bit integer to be rotated.\n * @param r The number of bits to rotate.\n * @pre\n *   @p r > 0 && @p r < 32\n * @note\n *   @p x and @p r may be evaluated multiple times.\n * @return The rotated result.\n */\n#if !defined(NO_CLANG_BUILTIN) && XXH_HAS_BUILTIN(__builtin_rotateleft32) \\\n                               && XXH_HAS_BUILTIN(__builtin_rotateleft64)\n#  define XXH_rotl32 __builtin_rotateleft32\n#  define XXH_rotl64 __builtin_rotateleft64\n/* Note: although _rotl exists for minGW (GCC under windows), performance seems poor */\n#elif defined(_MSC_VER)\n#  define XXH_rotl32(x,r) _rotl(x,r)\n#  define XXH_rotl64(x,r) _rotl64(x,r)\n#else\n#  define XXH_rotl32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))\n#  define XXH_rotl64(x,r) (((x) << (r)) | ((x) >> (64 - (r))))\n#endif\n\n/*!\n * @internal\n * @fn xxh_u32 XXH_swap32(xxh_u32 x)\n * @brief A 32-bit byteswap.\n *\n * @param x The 32-bit integer to byteswap.\n * @return @p x, byteswapped.\n */\n#if defined(_MSC_VER)     /* Visual Studio */\n#  define XXH_swap32 _byteswap_ulong\n#elif XXH_GCC_VERSION >= 403\n#  define XXH_swap32 __builtin_bswap32\n#else\nstatic xxh_u32 XXH_swap32 (xxh_u32 x)\n{\n    return  ((x << 24) & 0xff000000 ) |\n            ((x <<  8) & 0x00ff0000 ) |\n            ((x >>  8) & 0x0000ff00 ) |\n            ((x >> 24) & 0x000000ff );\n}\n#endif\n\n\n/* ***************************\n*  Memory reads\n*****************************/\n\n/*!\n * @internal\n * @brief Enum to indicate whether a pointer is aligned.\n */\ntypedef enum {\n    XXH_aligned,  /*!< Aligned */\n    XXH_unaligned /*!< Possibly unaligned */\n} XXH_alignment;\n\n/*\n * XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load.\n *\n * This is ideal for older compilers which don't inline memcpy.\n */\n#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))\n\nXXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* memPtr)\n{\n    const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;\n    return bytePtr[0]\n         | ((xxh_u32)bytePtr[1] << 8)\n         | ((xxh_u32)bytePtr[2] << 16)\n         | ((xxh_u32)bytePtr[3] << 24);\n}\n\nXXH_FORCE_INLINE xxh_u32 XXH_readBE32(const void* memPtr)\n{\n    const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;\n    return bytePtr[3]\n         | ((xxh_u32)bytePtr[2] << 8)\n         | ((xxh_u32)bytePtr[1] << 16)\n         | ((xxh_u32)bytePtr[0] << 24);\n}\n\n#else\nXXH_FORCE_INLINE xxh_u32 XXH_readLE32(const void* ptr)\n{\n    return XXH_CPU_LITTLE_ENDIAN ? XXH_read32(ptr) : XXH_swap32(XXH_read32(ptr));\n}\n\nstatic xxh_u32 XXH_readBE32(const void* ptr)\n{\n    return XXH_CPU_LITTLE_ENDIAN ? XXH_swap32(XXH_read32(ptr)) : XXH_read32(ptr);\n}\n#endif\n\nXXH_FORCE_INLINE xxh_u32\nXXH_readLE32_align(const void* ptr, XXH_alignment align)\n{\n    if (align==XXH_unaligned) {\n        return XXH_readLE32(ptr);\n    } else {\n        return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u32*)ptr : XXH_swap32(*(const xxh_u32*)ptr);\n    }\n}\n\n\n/* *************************************\n*  Misc\n***************************************/\n/*! @ingroup public */\nXXH_PUBLIC_API unsigned XXH_versionNumber (void) { return XXH_VERSION_NUMBER; }\n\n\n/* *******************************************************************\n*  32-bit hash functions\n*********************************************************************/\n/*!\n * @}\n * @defgroup XXH32_impl XXH32 implementation\n * @ingroup impl\n *\n * Details on the XXH32 implementation.\n * @{\n */\n /* #define instead of static const, to be used as initializers */\n#define XXH_PRIME32_1  0x9E3779B1U  /*!< 0b10011110001101110111100110110001 */\n#define XXH_PRIME32_2  0x85EBCA77U  /*!< 0b10000101111010111100101001110111 */\n#define XXH_PRIME32_3  0xC2B2AE3DU  /*!< 0b11000010101100101010111000111101 */\n#define XXH_PRIME32_4  0x27D4EB2FU  /*!< 0b00100111110101001110101100101111 */\n#define XXH_PRIME32_5  0x165667B1U  /*!< 0b00010110010101100110011110110001 */\n\n#ifdef XXH_OLD_NAMES\n#  define PRIME32_1 XXH_PRIME32_1\n#  define PRIME32_2 XXH_PRIME32_2\n#  define PRIME32_3 XXH_PRIME32_3\n#  define PRIME32_4 XXH_PRIME32_4\n#  define PRIME32_5 XXH_PRIME32_5\n#endif\n\n/*!\n * @internal\n * @brief Normal stripe processing routine.\n *\n * This shuffles the bits so that any bit from @p input impacts several bits in\n * @p acc.\n *\n * @param acc The accumulator lane.\n * @param input The stripe of input to mix.\n * @return The mixed accumulator lane.\n */\nstatic xxh_u32 XXH32_round(xxh_u32 acc, xxh_u32 input)\n{\n    acc += input * XXH_PRIME32_2;\n    acc  = XXH_rotl32(acc, 13);\n    acc *= XXH_PRIME32_1;\n#if (defined(__SSE4_1__) || defined(__aarch64__) || defined(__wasm_simd128__)) && !defined(XXH_ENABLE_AUTOVECTORIZE)\n    /*\n     * UGLY HACK:\n     * A compiler fence is the only thing that prevents GCC and Clang from\n     * autovectorizing the XXH32 loop (pragmas and attributes don't work for some\n     * reason) without globally disabling SSE4.1.\n     *\n     * The reason we want to avoid vectorization is because despite working on\n     * 4 integers at a time, there are multiple factors slowing XXH32 down on\n     * SSE4:\n     * - There's a ridiculous amount of lag from pmulld (10 cycles of latency on\n     *   newer chips!) making it slightly slower to multiply four integers at\n     *   once compared to four integers independently. Even when pmulld was\n     *   fastest, Sandy/Ivy Bridge, it is still not worth it to go into SSE\n     *   just to multiply unless doing a long operation.\n     *\n     * - Four instructions are required to rotate,\n     *      movqda tmp,  v // not required with VEX encoding\n     *      pslld  tmp, 13 // tmp <<= 13\n     *      psrld  v,   19 // x >>= 19\n     *      por    v,  tmp // x |= tmp\n     *   compared to one for scalar:\n     *      roll   v, 13    // reliably fast across the board\n     *      shldl  v, v, 13 // Sandy Bridge and later prefer this for some reason\n     *\n     * - Instruction level parallelism is actually more beneficial here because\n     *   the SIMD actually serializes this operation: While v1 is rotating, v2\n     *   can load data, while v3 can multiply. SSE forces them to operate\n     *   together.\n     *\n     * This is also enabled on AArch64, as Clang is *very aggressive* in vectorizing\n     * the loop. NEON is only faster on the A53, and with the newer cores, it is less\n     * than half the speed.\n     *\n     * Additionally, this is used on WASM SIMD128 because it JITs to the same\n     * SIMD instructions and has the same issue.\n     */\n    XXH_COMPILER_GUARD(acc);\n#endif\n    return acc;\n}\n\n/*!\n * @internal\n * @brief Mixes all bits to finalize the hash.\n *\n * The final mix ensures that all input bits have a chance to impact any bit in\n * the output digest, resulting in an unbiased distribution.\n *\n * @param hash The hash to avalanche.\n * @return The avalanched hash.\n */\nstatic xxh_u32 XXH32_avalanche(xxh_u32 hash)\n{\n    hash ^= hash >> 15;\n    hash *= XXH_PRIME32_2;\n    hash ^= hash >> 13;\n    hash *= XXH_PRIME32_3;\n    hash ^= hash >> 16;\n    return hash;\n}\n\n#define XXH_get32bits(p) XXH_readLE32_align(p, align)\n\n/*!\n * @internal\n * @brief Processes the last 0-15 bytes of @p ptr.\n *\n * There may be up to 15 bytes remaining to consume from the input.\n * This final stage will digest them to ensure that all input bytes are present\n * in the final mix.\n *\n * @param hash The hash to finalize.\n * @param ptr The pointer to the remaining input.\n * @param len The remaining length, modulo 16.\n * @param align Whether @p ptr is aligned.\n * @return The finalized hash.\n * @see XXH64_finalize().\n */\nstatic XXH_PUREF xxh_u32\nXXH32_finalize(xxh_u32 hash, const xxh_u8* ptr, size_t len, XXH_alignment align)\n{\n#define XXH_PROCESS1 do {                             \\\n    hash += (*ptr++) * XXH_PRIME32_5;                 \\\n    hash = XXH_rotl32(hash, 11) * XXH_PRIME32_1;      \\\n} while (0)\n\n#define XXH_PROCESS4 do {                             \\\n    hash += XXH_get32bits(ptr) * XXH_PRIME32_3;       \\\n    ptr += 4;                                         \\\n    hash  = XXH_rotl32(hash, 17) * XXH_PRIME32_4;     \\\n} while (0)\n\n    if (ptr==NULL) XXH_ASSERT(len == 0);\n\n    /* Compact rerolled version; generally faster */\n    if (!XXH32_ENDJMP) {\n        len &= 15;\n        while (len >= 4) {\n            XXH_PROCESS4;\n            len -= 4;\n        }\n        while (len > 0) {\n            XXH_PROCESS1;\n            --len;\n        }\n        return XXH32_avalanche(hash);\n    } else {\n         switch(len&15) /* or switch(bEnd - p) */ {\n           case 12:      XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 8:       XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 4:       XXH_PROCESS4;\n                         return XXH32_avalanche(hash);\n\n           case 13:      XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 9:       XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 5:       XXH_PROCESS4;\n                         XXH_PROCESS1;\n                         return XXH32_avalanche(hash);\n\n           case 14:      XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 10:      XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 6:       XXH_PROCESS4;\n                         XXH_PROCESS1;\n                         XXH_PROCESS1;\n                         return XXH32_avalanche(hash);\n\n           case 15:      XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 11:      XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 7:       XXH_PROCESS4;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 3:       XXH_PROCESS1;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 2:       XXH_PROCESS1;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 1:       XXH_PROCESS1;\n                         XXH_FALLTHROUGH;  /* fallthrough */\n           case 0:       return XXH32_avalanche(hash);\n        }\n        XXH_ASSERT(0);\n        return hash;   /* reaching this point is deemed impossible */\n    }\n}\n\n#ifdef XXH_OLD_NAMES\n#  define PROCESS1 XXH_PROCESS1\n#  define PROCESS4 XXH_PROCESS4\n#else\n#  undef XXH_PROCESS1\n#  undef XXH_PROCESS4\n#endif\n\n/*!\n * @internal\n * @brief The implementation for @ref XXH32().\n *\n * @param input , len , seed Directly passed from @ref XXH32().\n * @param align Whether @p input is aligned.\n * @return The calculated hash.\n */\nXXH_FORCE_INLINE XXH_PUREF xxh_u32\nXXH32_endian_align(const xxh_u8* input, size_t len, xxh_u32 seed, XXH_alignment align)\n{\n    xxh_u32 h32;\n\n    if (input==NULL) XXH_ASSERT(len == 0);\n\n    if (len>=16) {\n        const xxh_u8* const bEnd = input + len;\n        const xxh_u8* const limit = bEnd - 15;\n        xxh_u32 v1 = seed + XXH_PRIME32_1 + XXH_PRIME32_2;\n        xxh_u32 v2 = seed + XXH_PRIME32_2;\n        xxh_u32 v3 = seed + 0;\n        xxh_u32 v4 = seed - XXH_PRIME32_1;\n\n        do {\n            v1 = XXH32_round(v1, XXH_get32bits(input)); input += 4;\n            v2 = XXH32_round(v2, XXH_get32bits(input)); input += 4;\n            v3 = XXH32_round(v3, XXH_get32bits(input)); input += 4;\n            v4 = XXH32_round(v4, XXH_get32bits(input)); input += 4;\n        } while (input < limit);\n\n        h32 = XXH_rotl32(v1, 1)  + XXH_rotl32(v2, 7)\n            + XXH_rotl32(v3, 12) + XXH_rotl32(v4, 18);\n    } else {\n        h32  = seed + XXH_PRIME32_5;\n    }\n\n    h32 += (xxh_u32)len;\n\n    return XXH32_finalize(h32, input, len&15, align);\n}\n\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH32_hash_t XXH32 (const void* input, size_t len, XXH32_hash_t seed)\n{\n#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2\n    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */\n    XXH32_state_t state;\n    XXH32_reset(&state, seed);\n    XXH32_update(&state, (const xxh_u8*)input, len);\n    return XXH32_digest(&state);\n#else\n    if (XXH_FORCE_ALIGN_CHECK) {\n        if ((((size_t)input) & 3) == 0) {   /* Input is 4-bytes aligned, leverage the speed benefit */\n            return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_aligned);\n    }   }\n\n    return XXH32_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned);\n#endif\n}\n\n\n\n/*******   Hash streaming   *******/\n#ifndef XXH_NO_STREAM\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH32_state_t* XXH32_createState(void)\n{\n    return (XXH32_state_t*)XXH_malloc(sizeof(XXH32_state_t));\n}\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH_errorcode XXH32_freeState(XXH32_state_t* statePtr)\n{\n    XXH_free(statePtr);\n    return XXH_OK;\n}\n\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API void XXH32_copyState(XXH32_state_t* dstState, const XXH32_state_t* srcState)\n{\n    XXH_memcpy(dstState, srcState, sizeof(*dstState));\n}\n\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH_errorcode XXH32_reset(XXH32_state_t* statePtr, XXH32_hash_t seed)\n{\n    XXH_ASSERT(statePtr != NULL);\n    memset(statePtr, 0, sizeof(*statePtr));\n    statePtr->v[0] = seed + XXH_PRIME32_1 + XXH_PRIME32_2;\n    statePtr->v[1] = seed + XXH_PRIME32_2;\n    statePtr->v[2] = seed + 0;\n    statePtr->v[3] = seed - XXH_PRIME32_1;\n    return XXH_OK;\n}\n\n\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH32_update(XXH32_state_t* state, const void* input, size_t len)\n{\n    if (input==NULL) {\n        XXH_ASSERT(len == 0);\n        return XXH_OK;\n    }\n\n    {   const xxh_u8* p = (const xxh_u8*)input;\n        const xxh_u8* const bEnd = p + len;\n\n        state->total_len_32 += (XXH32_hash_t)len;\n        state->large_len |= (XXH32_hash_t)((len>=16) | (state->total_len_32>=16));\n\n        if (state->memsize + len < 16)  {   /* fill in tmp buffer */\n            XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, len);\n            state->memsize += (XXH32_hash_t)len;\n            return XXH_OK;\n        }\n\n        if (state->memsize) {   /* some data left from previous update */\n            XXH_memcpy((xxh_u8*)(state->mem32) + state->memsize, input, 16-state->memsize);\n            {   const xxh_u32* p32 = state->mem32;\n                state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p32)); p32++;\n                state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p32)); p32++;\n                state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p32)); p32++;\n                state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p32));\n            }\n            p += 16-state->memsize;\n            state->memsize = 0;\n        }\n\n        if (p <= bEnd-16) {\n            const xxh_u8* const limit = bEnd - 16;\n\n            do {\n                state->v[0] = XXH32_round(state->v[0], XXH_readLE32(p)); p+=4;\n                state->v[1] = XXH32_round(state->v[1], XXH_readLE32(p)); p+=4;\n                state->v[2] = XXH32_round(state->v[2], XXH_readLE32(p)); p+=4;\n                state->v[3] = XXH32_round(state->v[3], XXH_readLE32(p)); p+=4;\n            } while (p<=limit);\n\n        }\n\n        if (p < bEnd) {\n            XXH_memcpy(state->mem32, p, (size_t)(bEnd-p));\n            state->memsize = (unsigned)(bEnd-p);\n        }\n    }\n\n    return XXH_OK;\n}\n\n\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH32_hash_t XXH32_digest(const XXH32_state_t* state)\n{\n    xxh_u32 h32;\n\n    if (state->large_len) {\n        h32 = XXH_rotl32(state->v[0], 1)\n            + XXH_rotl32(state->v[1], 7)\n            + XXH_rotl32(state->v[2], 12)\n            + XXH_rotl32(state->v[3], 18);\n    } else {\n        h32 = state->v[2] /* == seed */ + XXH_PRIME32_5;\n    }\n\n    h32 += state->total_len_32;\n\n    return XXH32_finalize(h32, (const xxh_u8*)state->mem32, state->memsize, XXH_aligned);\n}\n#endif /* !XXH_NO_STREAM */\n\n/*******   Canonical representation   *******/\n\n/*!\n * @ingroup XXH32_family\n * The default return values from XXH functions are unsigned 32 and 64 bit\n * integers.\n *\n * The canonical representation uses big endian convention, the same convention\n * as human-readable numbers (large digits first).\n *\n * This way, hash values can be written into a file or buffer, remaining\n * comparable across different systems.\n *\n * The following functions allow transformation of hash values to and from their\n * canonical format.\n */\nXXH_PUBLIC_API void XXH32_canonicalFromHash(XXH32_canonical_t* dst, XXH32_hash_t hash)\n{\n    XXH_STATIC_ASSERT(sizeof(XXH32_canonical_t) == sizeof(XXH32_hash_t));\n    if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap32(hash);\n    XXH_memcpy(dst, &hash, sizeof(*dst));\n}\n/*! @ingroup XXH32_family */\nXXH_PUBLIC_API XXH32_hash_t XXH32_hashFromCanonical(const XXH32_canonical_t* src)\n{\n    return XXH_readBE32(src);\n}\n\n\n#ifndef XXH_NO_LONG_LONG\n\n/* *******************************************************************\n*  64-bit hash functions\n*********************************************************************/\n/*!\n * @}\n * @ingroup impl\n * @{\n */\n/*******   Memory access   *******/\n\ntypedef XXH64_hash_t xxh_u64;\n\n#ifdef XXH_OLD_NAMES\n#  define U64 xxh_u64\n#endif\n\n#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))\n/*\n * Manual byteshift. Best for old compilers which don't inline memcpy.\n * We actually directly use XXH_readLE64 and XXH_readBE64.\n */\n#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==2))\n\n/* Force direct memory access. Only works on CPU which support unaligned memory access in hardware */\nstatic xxh_u64 XXH_read64(const void* memPtr)\n{\n    return *(const xxh_u64*) memPtr;\n}\n\n#elif (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==1))\n\n/*\n * __attribute__((aligned(1))) is supported by gcc and clang. Originally the\n * documentation claimed that it only increased the alignment, but actually it\n * can decrease it on gcc, clang, and icc:\n * https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69502,\n * https://gcc.godbolt.org/z/xYez1j67Y.\n */\n#ifdef XXH_OLD_NAMES\ntypedef union { xxh_u32 u32; xxh_u64 u64; } __attribute__((packed)) unalign64;\n#endif\nstatic xxh_u64 XXH_read64(const void* ptr)\n{\n    typedef __attribute__((aligned(1))) xxh_u64 xxh_unalign64;\n    return *((const xxh_unalign64*)ptr);\n}\n\n#else\n\n/*\n * Portable and safe solution. Generally efficient.\n * see: https://fastcompression.blogspot.com/2015/08/accessing-unaligned-memory.html\n */\nstatic xxh_u64 XXH_read64(const void* memPtr)\n{\n    xxh_u64 val;\n    XXH_memcpy(&val, memPtr, sizeof(val));\n    return val;\n}\n\n#endif   /* XXH_FORCE_DIRECT_MEMORY_ACCESS */\n\n#if defined(_MSC_VER)     /* Visual Studio */\n#  define XXH_swap64 _byteswap_uint64\n#elif XXH_GCC_VERSION >= 403\n#  define XXH_swap64 __builtin_bswap64\n#else\nstatic xxh_u64 XXH_swap64(xxh_u64 x)\n{\n    return  ((x << 56) & 0xff00000000000000ULL) |\n            ((x << 40) & 0x00ff000000000000ULL) |\n            ((x << 24) & 0x0000ff0000000000ULL) |\n            ((x << 8)  & 0x000000ff00000000ULL) |\n            ((x >> 8)  & 0x00000000ff000000ULL) |\n            ((x >> 24) & 0x0000000000ff0000ULL) |\n            ((x >> 40) & 0x000000000000ff00ULL) |\n            ((x >> 56) & 0x00000000000000ffULL);\n}\n#endif\n\n\n/* XXH_FORCE_MEMORY_ACCESS==3 is an endian-independent byteshift load. */\n#if (defined(XXH_FORCE_MEMORY_ACCESS) && (XXH_FORCE_MEMORY_ACCESS==3))\n\nXXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* memPtr)\n{\n    const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;\n    return bytePtr[0]\n         | ((xxh_u64)bytePtr[1] << 8)\n         | ((xxh_u64)bytePtr[2] << 16)\n         | ((xxh_u64)bytePtr[3] << 24)\n         | ((xxh_u64)bytePtr[4] << 32)\n         | ((xxh_u64)bytePtr[5] << 40)\n         | ((xxh_u64)bytePtr[6] << 48)\n         | ((xxh_u64)bytePtr[7] << 56);\n}\n\nXXH_FORCE_INLINE xxh_u64 XXH_readBE64(const void* memPtr)\n{\n    const xxh_u8* bytePtr = (const xxh_u8 *)memPtr;\n    return bytePtr[7]\n         | ((xxh_u64)bytePtr[6] << 8)\n         | ((xxh_u64)bytePtr[5] << 16)\n         | ((xxh_u64)bytePtr[4] << 24)\n         | ((xxh_u64)bytePtr[3] << 32)\n         | ((xxh_u64)bytePtr[2] << 40)\n         | ((xxh_u64)bytePtr[1] << 48)\n         | ((xxh_u64)bytePtr[0] << 56);\n}\n\n#else\nXXH_FORCE_INLINE xxh_u64 XXH_readLE64(const void* ptr)\n{\n    return XXH_CPU_LITTLE_ENDIAN ? XXH_read64(ptr) : XXH_swap64(XXH_read64(ptr));\n}\n\nstatic xxh_u64 XXH_readBE64(const void* ptr)\n{\n    return XXH_CPU_LITTLE_ENDIAN ? XXH_swap64(XXH_read64(ptr)) : XXH_read64(ptr);\n}\n#endif\n\nXXH_FORCE_INLINE xxh_u64\nXXH_readLE64_align(const void* ptr, XXH_alignment align)\n{\n    if (align==XXH_unaligned)\n        return XXH_readLE64(ptr);\n    else\n        return XXH_CPU_LITTLE_ENDIAN ? *(const xxh_u64*)ptr : XXH_swap64(*(const xxh_u64*)ptr);\n}\n\n\n/*******   xxh64   *******/\n/*!\n * @}\n * @defgroup XXH64_impl XXH64 implementation\n * @ingroup impl\n *\n * Details on the XXH64 implementation.\n * @{\n */\n/* #define rather that static const, to be used as initializers */\n#define XXH_PRIME64_1  0x9E3779B185EBCA87ULL  /*!< 0b1001111000110111011110011011000110000101111010111100101010000111 */\n#define XXH_PRIME64_2  0xC2B2AE3D27D4EB4FULL  /*!< 0b1100001010110010101011100011110100100111110101001110101101001111 */\n#define XXH_PRIME64_3  0x165667B19E3779F9ULL  /*!< 0b0001011001010110011001111011000110011110001101110111100111111001 */\n#define XXH_PRIME64_4  0x85EBCA77C2B2AE63ULL  /*!< 0b1000010111101011110010100111011111000010101100101010111001100011 */\n#define XXH_PRIME64_5  0x27D4EB2F165667C5ULL  /*!< 0b0010011111010100111010110010111100010110010101100110011111000101 */\n\n#ifdef XXH_OLD_NAMES\n#  define PRIME64_1 XXH_PRIME64_1\n#  define PRIME64_2 XXH_PRIME64_2\n#  define PRIME64_3 XXH_PRIME64_3\n#  define PRIME64_4 XXH_PRIME64_4\n#  define PRIME64_5 XXH_PRIME64_5\n#endif\n\n/*! @copydoc XXH32_round */\nstatic xxh_u64 XXH64_round(xxh_u64 acc, xxh_u64 input)\n{\n    acc += input * XXH_PRIME64_2;\n    acc  = XXH_rotl64(acc, 31);\n    acc *= XXH_PRIME64_1;\n    return acc;\n}\n\nstatic xxh_u64 XXH64_mergeRound(xxh_u64 acc, xxh_u64 val)\n{\n    val  = XXH64_round(0, val);\n    acc ^= val;\n    acc  = acc * XXH_PRIME64_1 + XXH_PRIME64_4;\n    return acc;\n}\n\n/*! @copydoc XXH32_avalanche */\nstatic xxh_u64 XXH64_avalanche(xxh_u64 hash)\n{\n    hash ^= hash >> 33;\n    hash *= XXH_PRIME64_2;\n    hash ^= hash >> 29;\n    hash *= XXH_PRIME64_3;\n    hash ^= hash >> 32;\n    return hash;\n}\n\n\n#define XXH_get64bits(p) XXH_readLE64_align(p, align)\n\n/*!\n * @internal\n * @brief Processes the last 0-31 bytes of @p ptr.\n *\n * There may be up to 31 bytes remaining to consume from the input.\n * This final stage will digest them to ensure that all input bytes are present\n * in the final mix.\n *\n * @param hash The hash to finalize.\n * @param ptr The pointer to the remaining input.\n * @param len The remaining length, modulo 32.\n * @param align Whether @p ptr is aligned.\n * @return The finalized hash\n * @see XXH32_finalize().\n */\nstatic XXH_PUREF xxh_u64\nXXH64_finalize(xxh_u64 hash, const xxh_u8* ptr, size_t len, XXH_alignment align)\n{\n    if (ptr==NULL) XXH_ASSERT(len == 0);\n    len &= 31;\n    while (len >= 8) {\n        xxh_u64 const k1 = XXH64_round(0, XXH_get64bits(ptr));\n        ptr += 8;\n        hash ^= k1;\n        hash  = XXH_rotl64(hash,27) * XXH_PRIME64_1 + XXH_PRIME64_4;\n        len -= 8;\n    }\n    if (len >= 4) {\n        hash ^= (xxh_u64)(XXH_get32bits(ptr)) * XXH_PRIME64_1;\n        ptr += 4;\n        hash = XXH_rotl64(hash, 23) * XXH_PRIME64_2 + XXH_PRIME64_3;\n        len -= 4;\n    }\n    while (len > 0) {\n        hash ^= (*ptr++) * XXH_PRIME64_5;\n        hash = XXH_rotl64(hash, 11) * XXH_PRIME64_1;\n        --len;\n    }\n    return  XXH64_avalanche(hash);\n}\n\n#ifdef XXH_OLD_NAMES\n#  define PROCESS1_64 XXH_PROCESS1_64\n#  define PROCESS4_64 XXH_PROCESS4_64\n#  define PROCESS8_64 XXH_PROCESS8_64\n#else\n#  undef XXH_PROCESS1_64\n#  undef XXH_PROCESS4_64\n#  undef XXH_PROCESS8_64\n#endif\n\n/*!\n * @internal\n * @brief The implementation for @ref XXH64().\n *\n * @param input , len , seed Directly passed from @ref XXH64().\n * @param align Whether @p input is aligned.\n * @return The calculated hash.\n */\nXXH_FORCE_INLINE XXH_PUREF xxh_u64\nXXH64_endian_align(const xxh_u8* input, size_t len, xxh_u64 seed, XXH_alignment align)\n{\n    xxh_u64 h64;\n    if (input==NULL) XXH_ASSERT(len == 0);\n\n    if (len>=32) {\n        const xxh_u8* const bEnd = input + len;\n        const xxh_u8* const limit = bEnd - 31;\n        xxh_u64 v1 = seed + XXH_PRIME64_1 + XXH_PRIME64_2;\n        xxh_u64 v2 = seed + XXH_PRIME64_2;\n        xxh_u64 v3 = seed + 0;\n        xxh_u64 v4 = seed - XXH_PRIME64_1;\n\n        do {\n            v1 = XXH64_round(v1, XXH_get64bits(input)); input+=8;\n            v2 = XXH64_round(v2, XXH_get64bits(input)); input+=8;\n            v3 = XXH64_round(v3, XXH_get64bits(input)); input+=8;\n            v4 = XXH64_round(v4, XXH_get64bits(input)); input+=8;\n        } while (input<limit);\n\n        h64 = XXH_rotl64(v1, 1) + XXH_rotl64(v2, 7) + XXH_rotl64(v3, 12) + XXH_rotl64(v4, 18);\n        h64 = XXH64_mergeRound(h64, v1);\n        h64 = XXH64_mergeRound(h64, v2);\n        h64 = XXH64_mergeRound(h64, v3);\n        h64 = XXH64_mergeRound(h64, v4);\n\n    } else {\n        h64  = seed + XXH_PRIME64_5;\n    }\n\n    h64 += (xxh_u64) len;\n\n    return XXH64_finalize(h64, input, len, align);\n}\n\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API XXH64_hash_t XXH64 (XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)\n{\n#if !defined(XXH_NO_STREAM) && XXH_SIZE_OPT >= 2\n    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */\n    XXH64_state_t state;\n    XXH64_reset(&state, seed);\n    XXH64_update(&state, (const xxh_u8*)input, len);\n    return XXH64_digest(&state);\n#else\n    if (XXH_FORCE_ALIGN_CHECK) {\n        if ((((size_t)input) & 7)==0) {  /* Input is aligned, let's leverage the speed advantage */\n            return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_aligned);\n    }   }\n\n    return XXH64_endian_align((const xxh_u8*)input, len, seed, XXH_unaligned);\n\n#endif\n}\n\n/*******   Hash Streaming   *******/\n#ifndef XXH_NO_STREAM\n/*! @ingroup XXH64_family*/\nXXH_PUBLIC_API XXH64_state_t* XXH64_createState(void)\n{\n    return (XXH64_state_t*)XXH_malloc(sizeof(XXH64_state_t));\n}\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API XXH_errorcode XXH64_freeState(XXH64_state_t* statePtr)\n{\n    XXH_free(statePtr);\n    return XXH_OK;\n}\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API void XXH64_copyState(XXH_NOESCAPE XXH64_state_t* dstState, const XXH64_state_t* srcState)\n{\n    XXH_memcpy(dstState, srcState, sizeof(*dstState));\n}\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API XXH_errorcode XXH64_reset(XXH_NOESCAPE XXH64_state_t* statePtr, XXH64_hash_t seed)\n{\n    XXH_ASSERT(statePtr != NULL);\n    memset(statePtr, 0, sizeof(*statePtr));\n    statePtr->v[0] = seed + XXH_PRIME64_1 + XXH_PRIME64_2;\n    statePtr->v[1] = seed + XXH_PRIME64_2;\n    statePtr->v[2] = seed + 0;\n    statePtr->v[3] = seed - XXH_PRIME64_1;\n    return XXH_OK;\n}\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH64_update (XXH_NOESCAPE XXH64_state_t* state, XXH_NOESCAPE const void* input, size_t len)\n{\n    if (input==NULL) {\n        XXH_ASSERT(len == 0);\n        return XXH_OK;\n    }\n\n    {   const xxh_u8* p = (const xxh_u8*)input;\n        const xxh_u8* const bEnd = p + len;\n\n        state->total_len += len;\n\n        if (state->memsize + len < 32) {  /* fill in tmp buffer */\n            XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, len);\n            state->memsize += (xxh_u32)len;\n            return XXH_OK;\n        }\n\n        if (state->memsize) {   /* tmp buffer is full */\n            XXH_memcpy(((xxh_u8*)state->mem64) + state->memsize, input, 32-state->memsize);\n            state->v[0] = XXH64_round(state->v[0], XXH_readLE64(state->mem64+0));\n            state->v[1] = XXH64_round(state->v[1], XXH_readLE64(state->mem64+1));\n            state->v[2] = XXH64_round(state->v[2], XXH_readLE64(state->mem64+2));\n            state->v[3] = XXH64_round(state->v[3], XXH_readLE64(state->mem64+3));\n            p += 32 - state->memsize;\n            state->memsize = 0;\n        }\n\n        if (p+32 <= bEnd) {\n            const xxh_u8* const limit = bEnd - 32;\n\n            do {\n                state->v[0] = XXH64_round(state->v[0], XXH_readLE64(p)); p+=8;\n                state->v[1] = XXH64_round(state->v[1], XXH_readLE64(p)); p+=8;\n                state->v[2] = XXH64_round(state->v[2], XXH_readLE64(p)); p+=8;\n                state->v[3] = XXH64_round(state->v[3], XXH_readLE64(p)); p+=8;\n            } while (p<=limit);\n\n        }\n\n        if (p < bEnd) {\n            XXH_memcpy(state->mem64, p, (size_t)(bEnd-p));\n            state->memsize = (unsigned)(bEnd-p);\n        }\n    }\n\n    return XXH_OK;\n}\n\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API XXH64_hash_t XXH64_digest(XXH_NOESCAPE const XXH64_state_t* state)\n{\n    xxh_u64 h64;\n\n    if (state->total_len >= 32) {\n        h64 = XXH_rotl64(state->v[0], 1) + XXH_rotl64(state->v[1], 7) + XXH_rotl64(state->v[2], 12) + XXH_rotl64(state->v[3], 18);\n        h64 = XXH64_mergeRound(h64, state->v[0]);\n        h64 = XXH64_mergeRound(h64, state->v[1]);\n        h64 = XXH64_mergeRound(h64, state->v[2]);\n        h64 = XXH64_mergeRound(h64, state->v[3]);\n    } else {\n        h64  = state->v[2] /*seed*/ + XXH_PRIME64_5;\n    }\n\n    h64 += (xxh_u64) state->total_len;\n\n    return XXH64_finalize(h64, (const xxh_u8*)state->mem64, (size_t)state->total_len, XXH_aligned);\n}\n#endif /* !XXH_NO_STREAM */\n\n/******* Canonical representation   *******/\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API void XXH64_canonicalFromHash(XXH_NOESCAPE XXH64_canonical_t* dst, XXH64_hash_t hash)\n{\n    XXH_STATIC_ASSERT(sizeof(XXH64_canonical_t) == sizeof(XXH64_hash_t));\n    if (XXH_CPU_LITTLE_ENDIAN) hash = XXH_swap64(hash);\n    XXH_memcpy(dst, &hash, sizeof(*dst));\n}\n\n/*! @ingroup XXH64_family */\nXXH_PUBLIC_API XXH64_hash_t XXH64_hashFromCanonical(XXH_NOESCAPE const XXH64_canonical_t* src)\n{\n    return XXH_readBE64(src);\n}\n\n#ifndef XXH_NO_XXH3\n\n/* *********************************************************************\n*  XXH3\n*  New generation hash designed for speed on small keys and vectorization\n************************************************************************ */\n/*!\n * @}\n * @defgroup XXH3_impl XXH3 implementation\n * @ingroup impl\n * @{\n */\n\n/* ===   Compiler specifics   === */\n\n#if ((defined(sun) || defined(__sun)) && __cplusplus) /* Solaris includes __STDC_VERSION__ with C++. Tested with GCC 5.5 */\n#  define XXH_RESTRICT   /* disable */\n#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L   /* >= C99 */\n#  define XXH_RESTRICT   restrict\n#elif (defined (__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))) \\\n   || (defined (__clang__)) \\\n   || (defined (_MSC_VER) && (_MSC_VER >= 1400)) \\\n   || (defined (__INTEL_COMPILER) && (__INTEL_COMPILER >= 1300))\n/*\n * There are a LOT more compilers that recognize __restrict but this\n * covers the major ones.\n */\n#  define XXH_RESTRICT   __restrict\n#else\n#  define XXH_RESTRICT   /* disable */\n#endif\n\n#if (defined(__GNUC__) && (__GNUC__ >= 3))  \\\n  || (defined(__INTEL_COMPILER) && (__INTEL_COMPILER >= 800)) \\\n  || defined(__clang__)\n#    define XXH_likely(x) __builtin_expect(x, 1)\n#    define XXH_unlikely(x) __builtin_expect(x, 0)\n#else\n#    define XXH_likely(x) (x)\n#    define XXH_unlikely(x) (x)\n#endif\n\n#ifndef XXH_HAS_INCLUDE\n#  ifdef __has_include\n#    define XXH_HAS_INCLUDE(x) __has_include(x)\n#  else\n#    define XXH_HAS_INCLUDE(x) 0\n#  endif\n#endif\n\n#if defined(__GNUC__) || defined(__clang__)\n#  if defined(__ARM_FEATURE_SVE)\n#    include <arm_sve.h>\n#  endif\n#  if defined(__ARM_NEON__) || defined(__ARM_NEON) \\\n   || (defined(_M_ARM) && _M_ARM >= 7) \\\n   || defined(_M_ARM64) || defined(_M_ARM64EC) \\\n   || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE(<arm_neon.h>)) /* WASM SIMD128 via SIMDe */\n#    define inline __inline__  /* circumvent a clang bug */\n#    include <arm_neon.h>\n#    undef inline\n#  elif defined(__AVX2__)\n#    include <immintrin.h>\n#  elif defined(__SSE2__)\n#    include <emmintrin.h>\n#  endif\n#endif\n\n#if defined(_MSC_VER)\n#  include <intrin.h>\n#endif\n\n/*\n * One goal of XXH3 is to make it fast on both 32-bit and 64-bit, while\n * remaining a true 64-bit/128-bit hash function.\n *\n * This is done by prioritizing a subset of 64-bit operations that can be\n * emulated without too many steps on the average 32-bit machine.\n *\n * For example, these two lines seem similar, and run equally fast on 64-bit:\n *\n *   xxh_u64 x;\n *   x ^= (x >> 47); // good\n *   x ^= (x >> 13); // bad\n *\n * However, to a 32-bit machine, there is a major difference.\n *\n * x ^= (x >> 47) looks like this:\n *\n *   x.lo ^= (x.hi >> (47 - 32));\n *\n * while x ^= (x >> 13) looks like this:\n *\n *   // note: funnel shifts are not usually cheap.\n *   x.lo ^= (x.lo >> 13) | (x.hi << (32 - 13));\n *   x.hi ^= (x.hi >> 13);\n *\n * The first one is significantly faster than the second, simply because the\n * shift is larger than 32. This means:\n *  - All the bits we need are in the upper 32 bits, so we can ignore the lower\n *    32 bits in the shift.\n *  - The shift result will always fit in the lower 32 bits, and therefore,\n *    we can ignore the upper 32 bits in the xor.\n *\n * Thanks to this optimization, XXH3 only requires these features to be efficient:\n *\n *  - Usable unaligned access\n *  - A 32-bit or 64-bit ALU\n *      - If 32-bit, a decent ADC instruction\n *  - A 32 or 64-bit multiply with a 64-bit result\n *  - For the 128-bit variant, a decent byteswap helps short inputs.\n *\n * The first two are already required by XXH32, and almost all 32-bit and 64-bit\n * platforms which can run XXH32 can run XXH3 efficiently.\n *\n * Thumb-1, the classic 16-bit only subset of ARM's instruction set, is one\n * notable exception.\n *\n * First of all, Thumb-1 lacks support for the UMULL instruction which\n * performs the important long multiply. This means numerous __aeabi_lmul\n * calls.\n *\n * Second of all, the 8 functional registers are just not enough.\n * Setup for __aeabi_lmul, byteshift loads, pointers, and all arithmetic need\n * Lo registers, and this shuffling results in thousands more MOVs than A32.\n *\n * A32 and T32 don't have this limitation. They can access all 14 registers,\n * do a 32->64 multiply with UMULL, and the flexible operand allowing free\n * shifts is helpful, too.\n *\n * Therefore, we do a quick sanity check.\n *\n * If compiling Thumb-1 for a target which supports ARM instructions, we will\n * emit a warning, as it is not a \"sane\" platform to compile for.\n *\n * Usually, if this happens, it is because of an accident and you probably need\n * to specify -march, as you likely meant to compile for a newer architecture.\n *\n * Credit: large sections of the vectorial and asm source code paths\n *         have been contributed by @easyaspi314\n */\n#if defined(__thumb__) && !defined(__thumb2__) && defined(__ARM_ARCH_ISA_ARM)\n#   warning \"XXH3 is highly inefficient without ARM or Thumb-2.\"\n#endif\n\n/* ==========================================\n * Vectorization detection\n * ========================================== */\n\n#ifdef XXH_DOXYGEN\n/*!\n * @ingroup tuning\n * @brief Overrides the vectorization implementation chosen for XXH3.\n *\n * Can be defined to 0 to disable SIMD or any of the values mentioned in\n * @ref XXH_VECTOR_TYPE.\n *\n * If this is not defined, it uses predefined macros to determine the best\n * implementation.\n */\n#  define XXH_VECTOR XXH_SCALAR\n/*!\n * @ingroup tuning\n * @brief Possible values for @ref XXH_VECTOR.\n *\n * Note that these are actually implemented as macros.\n *\n * If this is not defined, it is detected automatically.\n * internal macro XXH_X86DISPATCH overrides this.\n */\nenum XXH_VECTOR_TYPE /* fake enum */ {\n    XXH_SCALAR = 0,  /*!< Portable scalar version */\n    XXH_SSE2   = 1,  /*!<\n                      * SSE2 for Pentium 4, Opteron, all x86_64.\n                      *\n                      * @note SSE2 is also guaranteed on Windows 10, macOS, and\n                      * Android x86.\n                      */\n    XXH_AVX2   = 2,  /*!< AVX2 for Haswell and Bulldozer */\n    XXH_AVX512 = 3,  /*!< AVX512 for Skylake and Icelake */\n    XXH_NEON   = 4,  /*!<\n                       * NEON for most ARMv7-A, all AArch64, and WASM SIMD128\n                       * via the SIMDeverywhere polyfill provided with the\n                       * Emscripten SDK.\n                       */\n    XXH_VSX    = 5,  /*!< VSX and ZVector for POWER8/z13 (64-bit) */\n    XXH_SVE    = 6,  /*!< SVE for some ARMv8-A and ARMv9-A */\n};\n/*!\n * @ingroup tuning\n * @brief Selects the minimum alignment for XXH3's accumulators.\n *\n * When using SIMD, this should match the alignment required for said vector\n * type, so, for example, 32 for AVX2.\n *\n * Default: Auto detected.\n */\n#  define XXH_ACC_ALIGN 8\n#endif\n\n/* Actual definition */\n#ifndef XXH_DOXYGEN\n#  define XXH_SCALAR 0\n#  define XXH_SSE2   1\n#  define XXH_AVX2   2\n#  define XXH_AVX512 3\n#  define XXH_NEON   4\n#  define XXH_VSX    5\n#  define XXH_SVE    6\n#endif\n\n#ifndef XXH_VECTOR    /* can be defined on command line */\n#  if defined(__ARM_FEATURE_SVE)\n#    define XXH_VECTOR XXH_SVE\n#  elif ( \\\n        defined(__ARM_NEON__) || defined(__ARM_NEON) /* gcc */ \\\n     || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) /* msvc */ \\\n     || (defined(__wasm_simd128__) && XXH_HAS_INCLUDE(<arm_neon.h>)) /* wasm simd128 via SIMDe */ \\\n   ) && ( \\\n        defined(_WIN32) || defined(__LITTLE_ENDIAN__) /* little endian only */ \\\n    || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \\\n   )\n#    define XXH_VECTOR XXH_NEON\n#  elif defined(__AVX512F__)\n#    define XXH_VECTOR XXH_AVX512\n#  elif defined(__AVX2__)\n#    define XXH_VECTOR XXH_AVX2\n#  elif defined(__SSE2__) || defined(_M_AMD64) || defined(_M_X64) || (defined(_M_IX86_FP) && (_M_IX86_FP == 2))\n#    define XXH_VECTOR XXH_SSE2\n#  elif (defined(__PPC64__) && defined(__POWER8_VECTOR__)) \\\n     || (defined(__s390x__) && defined(__VEC__)) \\\n     && defined(__GNUC__) /* TODO: IBM XL */\n#    define XXH_VECTOR XXH_VSX\n#  else\n#    define XXH_VECTOR XXH_SCALAR\n#  endif\n#endif\n\n/* __ARM_FEATURE_SVE is only supported by GCC & Clang. */\n#if (XXH_VECTOR == XXH_SVE) && !defined(__ARM_FEATURE_SVE)\n#  ifdef _MSC_VER\n#    pragma warning(once : 4606)\n#  else\n#    warning \"__ARM_FEATURE_SVE isn't supported. Use SCALAR instead.\"\n#  endif\n#  undef XXH_VECTOR\n#  define XXH_VECTOR XXH_SCALAR\n#endif\n\n/*\n * Controls the alignment of the accumulator,\n * for compatibility with aligned vector loads, which are usually faster.\n */\n#ifndef XXH_ACC_ALIGN\n#  if defined(XXH_X86DISPATCH)\n#     define XXH_ACC_ALIGN 64  /* for compatibility with avx512 */\n#  elif XXH_VECTOR == XXH_SCALAR  /* scalar */\n#     define XXH_ACC_ALIGN 8\n#  elif XXH_VECTOR == XXH_SSE2  /* sse2 */\n#     define XXH_ACC_ALIGN 16\n#  elif XXH_VECTOR == XXH_AVX2  /* avx2 */\n#     define XXH_ACC_ALIGN 32\n#  elif XXH_VECTOR == XXH_NEON  /* neon */\n#     define XXH_ACC_ALIGN 16\n#  elif XXH_VECTOR == XXH_VSX   /* vsx */\n#     define XXH_ACC_ALIGN 16\n#  elif XXH_VECTOR == XXH_AVX512  /* avx512 */\n#     define XXH_ACC_ALIGN 64\n#  elif XXH_VECTOR == XXH_SVE   /* sve */\n#     define XXH_ACC_ALIGN 64\n#  endif\n#endif\n\n#if defined(XXH_X86DISPATCH) || XXH_VECTOR == XXH_SSE2 \\\n    || XXH_VECTOR == XXH_AVX2 || XXH_VECTOR == XXH_AVX512\n#  define XXH_SEC_ALIGN XXH_ACC_ALIGN\n#elif XXH_VECTOR == XXH_SVE\n#  define XXH_SEC_ALIGN XXH_ACC_ALIGN\n#else\n#  define XXH_SEC_ALIGN 8\n#endif\n\n#if defined(__GNUC__) || defined(__clang__)\n#  define XXH_ALIASING __attribute__((may_alias))\n#else\n#  define XXH_ALIASING /* nothing */\n#endif\n\n/*\n * UGLY HACK:\n * GCC usually generates the best code with -O3 for xxHash.\n *\n * However, when targeting AVX2, it is overzealous in its unrolling resulting\n * in code roughly 3/4 the speed of Clang.\n *\n * There are other issues, such as GCC splitting _mm256_loadu_si256 into\n * _mm_loadu_si128 + _mm256_inserti128_si256. This is an optimization which\n * only applies to Sandy and Ivy Bridge... which don't even support AVX2.\n *\n * That is why when compiling the AVX2 version, it is recommended to use either\n *   -O2 -mavx2 -march=haswell\n * or\n *   -O2 -mavx2 -mno-avx256-split-unaligned-load\n * for decent performance, or to use Clang instead.\n *\n * Fortunately, we can control the first one with a pragma that forces GCC into\n * -O2, but the other one we can't control without \"failed to inline always\n * inline function due to target mismatch\" warnings.\n */\n#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \\\n  && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \\\n  && defined(__OPTIMIZE__) && XXH_SIZE_OPT <= 0 /* respect -O0 and -Os */\n#  pragma GCC push_options\n#  pragma GCC optimize(\"-O2\")\n#endif\n\n#if XXH_VECTOR == XXH_NEON\n\n/*\n * UGLY HACK: While AArch64 GCC on Linux does not seem to care, on macOS, GCC -O3\n * optimizes out the entire hashLong loop because of the aliasing violation.\n *\n * However, GCC is also inefficient at load-store optimization with vld1q/vst1q,\n * so the only option is to mark it as aliasing.\n */\ntypedef uint64x2_t xxh_aliasing_uint64x2_t XXH_ALIASING;\n\n/*!\n * @internal\n * @brief `vld1q_u64` but faster and alignment-safe.\n *\n * On AArch64, unaligned access is always safe, but on ARMv7-a, it is only\n * *conditionally* safe (`vld1` has an alignment bit like `movdq[ua]` in x86).\n *\n * GCC for AArch64 sees `vld1q_u8` as an intrinsic instead of a load, so it\n * prohibits load-store optimizations. Therefore, a direct dereference is used.\n *\n * Otherwise, `vld1q_u8` is used with `vreinterpretq_u8_u64` to do a safe\n * unaligned load.\n */\n#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__)\nXXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr) /* silence -Wcast-align */\n{\n    return *(xxh_aliasing_uint64x2_t const *)ptr;\n}\n#else\nXXH_FORCE_INLINE uint64x2_t XXH_vld1q_u64(void const* ptr)\n{\n    return vreinterpretq_u64_u8(vld1q_u8((uint8_t const*)ptr));\n}\n#endif\n\n/*!\n * @internal\n * @brief `vmlal_u32` on low and high halves of a vector.\n *\n * This is a workaround for AArch64 GCC < 11 which implemented arm_neon.h with\n * inline assembly and were therefore incapable of merging the `vget_{low, high}_u32`\n * with `vmlal_u32`.\n */\n#if defined(__aarch64__) && defined(__GNUC__) && !defined(__clang__) && __GNUC__ < 11\nXXH_FORCE_INLINE uint64x2_t\nXXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)\n{\n    /* Inline assembly is the only way */\n    __asm__(\"umlal   %0.2d, %1.2s, %2.2s\" : \"+w\" (acc) : \"w\" (lhs), \"w\" (rhs));\n    return acc;\n}\nXXH_FORCE_INLINE uint64x2_t\nXXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)\n{\n    /* This intrinsic works as expected */\n    return vmlal_high_u32(acc, lhs, rhs);\n}\n#else\n/* Portable intrinsic versions */\nXXH_FORCE_INLINE uint64x2_t\nXXH_vmlal_low_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)\n{\n    return vmlal_u32(acc, vget_low_u32(lhs), vget_low_u32(rhs));\n}\n/*! @copydoc XXH_vmlal_low_u32\n * Assume the compiler converts this to vmlal_high_u32 on aarch64 */\nXXH_FORCE_INLINE uint64x2_t\nXXH_vmlal_high_u32(uint64x2_t acc, uint32x4_t lhs, uint32x4_t rhs)\n{\n    return vmlal_u32(acc, vget_high_u32(lhs), vget_high_u32(rhs));\n}\n#endif\n\n/*!\n * @ingroup tuning\n * @brief Controls the NEON to scalar ratio for XXH3\n *\n * This can be set to 2, 4, 6, or 8.\n *\n * ARM Cortex CPUs are _very_ sensitive to how their pipelines are used.\n *\n * For example, the Cortex-A73 can dispatch 3 micro-ops per cycle, but only 2 of those\n * can be NEON. If you are only using NEON instructions, you are only using 2/3 of the CPU\n * bandwidth.\n *\n * This is even more noticeable on the more advanced cores like the Cortex-A76 which\n * can dispatch 8 micro-ops per cycle, but still only 2 NEON micro-ops at once.\n *\n * Therefore, to make the most out of the pipeline, it is beneficial to run 6 NEON lanes\n * and 2 scalar lanes, which is chosen by default.\n *\n * This does not apply to Apple processors or 32-bit processors, which run better with\n * full NEON. These will default to 8. Additionally, size-optimized builds run 8 lanes.\n *\n * This change benefits CPUs with large micro-op buffers without negatively affecting\n * most other CPUs:\n *\n *  | Chipset               | Dispatch type       | NEON only | 6:2 hybrid | Diff. |\n *  |:----------------------|:--------------------|----------:|-----------:|------:|\n *  | Snapdragon 730 (A76)  | 2 NEON/8 micro-ops  |  8.8 GB/s |  10.1 GB/s |  ~16% |\n *  | Snapdragon 835 (A73)  | 2 NEON/3 micro-ops  |  5.1 GB/s |   5.3 GB/s |   ~5% |\n *  | Marvell PXA1928 (A53) | In-order dual-issue |  1.9 GB/s |   1.9 GB/s |    0% |\n *  | Apple M1              | 4 NEON/8 micro-ops  | 37.3 GB/s |  36.1 GB/s |  ~-3% |\n *\n * It also seems to fix some bad codegen on GCC, making it almost as fast as clang.\n *\n * When using WASM SIMD128, if this is 2 or 6, SIMDe will scalarize 2 of the lanes meaning\n * it effectively becomes worse 4.\n *\n * @see XXH3_accumulate_512_neon()\n */\n# ifndef XXH3_NEON_LANES\n#  if (defined(__aarch64__) || defined(__arm64__) || defined(_M_ARM64) || defined(_M_ARM64EC)) \\\n   && !defined(__APPLE__) && XXH_SIZE_OPT <= 0\n#   define XXH3_NEON_LANES 6\n#  else\n#   define XXH3_NEON_LANES XXH_ACC_NB\n#  endif\n# endif\n#endif  /* XXH_VECTOR == XXH_NEON */\n\n/*\n * VSX and Z Vector helpers.\n *\n * This is very messy, and any pull requests to clean this up are welcome.\n *\n * There are a lot of problems with supporting VSX and s390x, due to\n * inconsistent intrinsics, spotty coverage, and multiple endiannesses.\n */\n#if XXH_VECTOR == XXH_VSX\n/* Annoyingly, these headers _may_ define three macros: `bool`, `vector`,\n * and `pixel`. This is a problem for obvious reasons.\n *\n * These keywords are unnecessary; the spec literally says they are\n * equivalent to `__bool`, `__vector`, and `__pixel` and may be undef'd\n * after including the header.\n *\n * We use pragma push_macro/pop_macro to keep the namespace clean. */\n#  pragma push_macro(\"bool\")\n#  pragma push_macro(\"vector\")\n#  pragma push_macro(\"pixel\")\n/* silence potential macro redefined warnings */\n#  undef bool\n#  undef vector\n#  undef pixel\n\n#  if defined(__s390x__)\n#    include <s390intrin.h>\n#  else\n#    include <altivec.h>\n#  endif\n\n/* Restore the original macro values, if applicable. */\n#  pragma pop_macro(\"pixel\")\n#  pragma pop_macro(\"vector\")\n#  pragma pop_macro(\"bool\")\n\ntypedef __vector unsigned long long xxh_u64x2;\ntypedef __vector unsigned char xxh_u8x16;\ntypedef __vector unsigned xxh_u32x4;\n\n/*\n * UGLY HACK: Similar to aarch64 macOS GCC, s390x GCC has the same aliasing issue.\n */\ntypedef xxh_u64x2 xxh_aliasing_u64x2 XXH_ALIASING;\n\n# ifndef XXH_VSX_BE\n#  if defined(__BIG_ENDIAN__) \\\n  || (defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)\n#    define XXH_VSX_BE 1\n#  elif defined(__VEC_ELEMENT_REG_ORDER__) && __VEC_ELEMENT_REG_ORDER__ == __ORDER_BIG_ENDIAN__\n#    warning \"-maltivec=be is not recommended. Please use native endianness.\"\n#    define XXH_VSX_BE 1\n#  else\n#    define XXH_VSX_BE 0\n#  endif\n# endif /* !defined(XXH_VSX_BE) */\n\n# if XXH_VSX_BE\n#  if defined(__POWER9_VECTOR__) || (defined(__clang__) && defined(__s390x__))\n#    define XXH_vec_revb vec_revb\n#  else\n/*!\n * A polyfill for POWER9's vec_revb().\n */\nXXH_FORCE_INLINE xxh_u64x2 XXH_vec_revb(xxh_u64x2 val)\n{\n    xxh_u8x16 const vByteSwap = { 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00,\n                                  0x0F, 0x0E, 0x0D, 0x0C, 0x0B, 0x0A, 0x09, 0x08 };\n    return vec_perm(val, val, vByteSwap);\n}\n#  endif\n# endif /* XXH_VSX_BE */\n\n/*!\n * Performs an unaligned vector load and byte swaps it on big endian.\n */\nXXH_FORCE_INLINE xxh_u64x2 XXH_vec_loadu(const void *ptr)\n{\n    xxh_u64x2 ret;\n    XXH_memcpy(&ret, ptr, sizeof(xxh_u64x2));\n# if XXH_VSX_BE\n    ret = XXH_vec_revb(ret);\n# endif\n    return ret;\n}\n\n/*\n * vec_mulo and vec_mule are very problematic intrinsics on PowerPC\n *\n * These intrinsics weren't added until GCC 8, despite existing for a while,\n * and they are endian dependent. Also, their meaning swap depending on version.\n * */\n# if defined(__s390x__)\n /* s390x is always big endian, no issue on this platform */\n#  define XXH_vec_mulo vec_mulo\n#  define XXH_vec_mule vec_mule\n# elif defined(__clang__) && XXH_HAS_BUILTIN(__builtin_altivec_vmuleuw) && !defined(__ibmxl__)\n/* Clang has a better way to control this, we can just use the builtin which doesn't swap. */\n /* The IBM XL Compiler (which defined __clang__) only implements the vec_* operations */\n#  define XXH_vec_mulo __builtin_altivec_vmulouw\n#  define XXH_vec_mule __builtin_altivec_vmuleuw\n# else\n/* gcc needs inline assembly */\n/* Adapted from https://github.com/google/highwayhash/blob/master/highwayhash/hh_vsx.h. */\nXXH_FORCE_INLINE xxh_u64x2 XXH_vec_mulo(xxh_u32x4 a, xxh_u32x4 b)\n{\n    xxh_u64x2 result;\n    __asm__(\"vmulouw %0, %1, %2\" : \"=v\" (result) : \"v\" (a), \"v\" (b));\n    return result;\n}\nXXH_FORCE_INLINE xxh_u64x2 XXH_vec_mule(xxh_u32x4 a, xxh_u32x4 b)\n{\n    xxh_u64x2 result;\n    __asm__(\"vmuleuw %0, %1, %2\" : \"=v\" (result) : \"v\" (a), \"v\" (b));\n    return result;\n}\n# endif /* XXH_vec_mulo, XXH_vec_mule */\n#endif /* XXH_VECTOR == XXH_VSX */\n\n#if XXH_VECTOR == XXH_SVE\n#define ACCRND(acc, offset) \\\ndo { \\\n    svuint64_t input_vec = svld1_u64(mask, xinput + offset);         \\\n    svuint64_t secret_vec = svld1_u64(mask, xsecret + offset);       \\\n    svuint64_t mixed = sveor_u64_x(mask, secret_vec, input_vec);     \\\n    svuint64_t swapped = svtbl_u64(input_vec, kSwap);                \\\n    svuint64_t mixed_lo = svextw_u64_x(mask, mixed);                 \\\n    svuint64_t mixed_hi = svlsr_n_u64_x(mask, mixed, 32);            \\\n    svuint64_t mul = svmad_u64_x(mask, mixed_lo, mixed_hi, swapped); \\\n    acc = svadd_u64_x(mask, acc, mul);                               \\\n} while (0)\n#endif /* XXH_VECTOR == XXH_SVE */\n\n/* prefetch\n * can be disabled, by declaring XXH_NO_PREFETCH build macro */\n#if defined(XXH_NO_PREFETCH)\n#  define XXH_PREFETCH(ptr)  (void)(ptr)  /* disabled */\n#else\n#  if XXH_SIZE_OPT >= 1\n#    define XXH_PREFETCH(ptr) (void)(ptr)\n#  elif defined(_MSC_VER) && (defined(_M_X64) || defined(_M_IX86))  /* _mm_prefetch() not defined outside of x86/x64 */\n#    include <mmintrin.h>   /* https://msdn.microsoft.com/fr-fr/library/84szxsww(v=vs.90).aspx */\n#    define XXH_PREFETCH(ptr)  _mm_prefetch((const char*)(ptr), _MM_HINT_T0)\n#  elif defined(__GNUC__) && ( (__GNUC__ >= 4) || ( (__GNUC__ == 3) && (__GNUC_MINOR__ >= 1) ) )\n#    define XXH_PREFETCH(ptr)  __builtin_prefetch((ptr), 0 /* rw==read */, 3 /* locality */)\n#  else\n#    define XXH_PREFETCH(ptr) (void)(ptr)  /* disabled */\n#  endif\n#endif  /* XXH_NO_PREFETCH */\n\n\n/* ==========================================\n * XXH3 default settings\n * ========================================== */\n\n#define XXH_SECRET_DEFAULT_SIZE 192   /* minimum XXH3_SECRET_SIZE_MIN */\n\n#if (XXH_SECRET_DEFAULT_SIZE < XXH3_SECRET_SIZE_MIN)\n#  error \"default keyset is not large enough\"\n#endif\n\n/*! Pseudorandom secret taken directly from FARSH. */\nXXH_ALIGN(64) static const xxh_u8 XXH3_kSecret[XXH_SECRET_DEFAULT_SIZE] = {\n    0xb8, 0xfe, 0x6c, 0x39, 0x23, 0xa4, 0x4b, 0xbe, 0x7c, 0x01, 0x81, 0x2c, 0xf7, 0x21, 0xad, 0x1c,\n    0xde, 0xd4, 0x6d, 0xe9, 0x83, 0x90, 0x97, 0xdb, 0x72, 0x40, 0xa4, 0xa4, 0xb7, 0xb3, 0x67, 0x1f,\n    0xcb, 0x79, 0xe6, 0x4e, 0xcc, 0xc0, 0xe5, 0x78, 0x82, 0x5a, 0xd0, 0x7d, 0xcc, 0xff, 0x72, 0x21,\n    0xb8, 0x08, 0x46, 0x74, 0xf7, 0x43, 0x24, 0x8e, 0xe0, 0x35, 0x90, 0xe6, 0x81, 0x3a, 0x26, 0x4c,\n    0x3c, 0x28, 0x52, 0xbb, 0x91, 0xc3, 0x00, 0xcb, 0x88, 0xd0, 0x65, 0x8b, 0x1b, 0x53, 0x2e, 0xa3,\n    0x71, 0x64, 0x48, 0x97, 0xa2, 0x0d, 0xf9, 0x4e, 0x38, 0x19, 0xef, 0x46, 0xa9, 0xde, 0xac, 0xd8,\n    0xa8, 0xfa, 0x76, 0x3f, 0xe3, 0x9c, 0x34, 0x3f, 0xf9, 0xdc, 0xbb, 0xc7, 0xc7, 0x0b, 0x4f, 0x1d,\n    0x8a, 0x51, 0xe0, 0x4b, 0xcd, 0xb4, 0x59, 0x31, 0xc8, 0x9f, 0x7e, 0xc9, 0xd9, 0x78, 0x73, 0x64,\n    0xea, 0xc5, 0xac, 0x83, 0x34, 0xd3, 0xeb, 0xc3, 0xc5, 0x81, 0xa0, 0xff, 0xfa, 0x13, 0x63, 0xeb,\n    0x17, 0x0d, 0xdd, 0x51, 0xb7, 0xf0, 0xda, 0x49, 0xd3, 0x16, 0x55, 0x26, 0x29, 0xd4, 0x68, 0x9e,\n    0x2b, 0x16, 0xbe, 0x58, 0x7d, 0x47, 0xa1, 0xfc, 0x8f, 0xf8, 0xb8, 0xd1, 0x7a, 0xd0, 0x31, 0xce,\n    0x45, 0xcb, 0x3a, 0x8f, 0x95, 0x16, 0x04, 0x28, 0xaf, 0xd7, 0xfb, 0xca, 0xbb, 0x4b, 0x40, 0x7e,\n};\n\nstatic const xxh_u64 PRIME_MX1 = 0x165667919E3779F9ULL;  /*!< 0b0001011001010110011001111001000110011110001101110111100111111001 */\nstatic const xxh_u64 PRIME_MX2 = 0x9FB21C651E98DF25ULL;  /*!< 0b1001111110110010000111000110010100011110100110001101111100100101 */\n\n#ifdef XXH_OLD_NAMES\n#  define kSecret XXH3_kSecret\n#endif\n\n#ifdef XXH_DOXYGEN\n/*!\n * @brief Calculates a 32-bit to 64-bit long multiply.\n *\n * Implemented as a macro.\n *\n * Wraps `__emulu` on MSVC x86 because it tends to call `__allmul` when it doesn't\n * need to (but it shouldn't need to anyways, it is about 7 instructions to do\n * a 64x64 multiply...). Since we know that this will _always_ emit `MULL`, we\n * use that instead of the normal method.\n *\n * If you are compiling for platforms like Thumb-1 and don't have a better option,\n * you may also want to write your own long multiply routine here.\n *\n * @param x, y Numbers to be multiplied\n * @return 64-bit product of the low 32 bits of @p x and @p y.\n */\nXXH_FORCE_INLINE xxh_u64\nXXH_mult32to64(xxh_u64 x, xxh_u64 y)\n{\n   return (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF);\n}\n#elif defined(_MSC_VER) && defined(_M_IX86)\n#    define XXH_mult32to64(x, y) __emulu((unsigned)(x), (unsigned)(y))\n#else\n/*\n * Downcast + upcast is usually better than masking on older compilers like\n * GCC 4.2 (especially 32-bit ones), all without affecting newer compilers.\n *\n * The other method, (x & 0xFFFFFFFF) * (y & 0xFFFFFFFF), will AND both operands\n * and perform a full 64x64 multiply -- entirely redundant on 32-bit.\n */\n#    define XXH_mult32to64(x, y) ((xxh_u64)(xxh_u32)(x) * (xxh_u64)(xxh_u32)(y))\n#endif\n\n/*!\n * @brief Calculates a 64->128-bit long multiply.\n *\n * Uses `__uint128_t` and `_umul128` if available, otherwise uses a scalar\n * version.\n *\n * @param lhs , rhs The 64-bit integers to be multiplied\n * @return The 128-bit result represented in an @ref XXH128_hash_t.\n */\nstatic XXH128_hash_t\nXXH_mult64to128(xxh_u64 lhs, xxh_u64 rhs)\n{\n    /*\n     * GCC/Clang __uint128_t method.\n     *\n     * On most 64-bit targets, GCC and Clang define a __uint128_t type.\n     * This is usually the best way as it usually uses a native long 64-bit\n     * multiply, such as MULQ on x86_64 or MUL + UMULH on aarch64.\n     *\n     * Usually.\n     *\n     * Despite being a 32-bit platform, Clang (and emscripten) define this type\n     * despite not having the arithmetic for it. This results in a laggy\n     * compiler builtin call which calculates a full 128-bit multiply.\n     * In that case it is best to use the portable one.\n     * https://github.com/Cyan4973/xxHash/issues/211#issuecomment-515575677\n     */\n#if (defined(__GNUC__) || defined(__clang__)) && !defined(__wasm__) \\\n    && defined(__SIZEOF_INT128__) \\\n    || (defined(_INTEGRAL_MAX_BITS) && _INTEGRAL_MAX_BITS >= 128)\n\n    __uint128_t const product = (__uint128_t)lhs * (__uint128_t)rhs;\n    XXH128_hash_t r128;\n    r128.low64  = (xxh_u64)(product);\n    r128.high64 = (xxh_u64)(product >> 64);\n    return r128;\n\n    /*\n     * MSVC for x64's _umul128 method.\n     *\n     * xxh_u64 _umul128(xxh_u64 Multiplier, xxh_u64 Multiplicand, xxh_u64 *HighProduct);\n     *\n     * This compiles to single operand MUL on x64.\n     */\n#elif (defined(_M_X64) || defined(_M_IA64)) && !defined(_M_ARM64EC)\n\n#ifndef _MSC_VER\n#   pragma intrinsic(_umul128)\n#endif\n    xxh_u64 product_high;\n    xxh_u64 const product_low = _umul128(lhs, rhs, &product_high);\n    XXH128_hash_t r128;\n    r128.low64  = product_low;\n    r128.high64 = product_high;\n    return r128;\n\n    /*\n     * MSVC for ARM64's __umulh method.\n     *\n     * This compiles to the same MUL + UMULH as GCC/Clang's __uint128_t method.\n     */\n#elif defined(_M_ARM64) || defined(_M_ARM64EC)\n\n#ifndef _MSC_VER\n#   pragma intrinsic(__umulh)\n#endif\n    XXH128_hash_t r128;\n    r128.low64  = lhs * rhs;\n    r128.high64 = __umulh(lhs, rhs);\n    return r128;\n\n#else\n    /*\n     * Portable scalar method. Optimized for 32-bit and 64-bit ALUs.\n     *\n     * This is a fast and simple grade school multiply, which is shown below\n     * with base 10 arithmetic instead of base 0x100000000.\n     *\n     *           9 3 // D2 lhs = 93\n     *         x 7 5 // D2 rhs = 75\n     *     ----------\n     *           1 5 // D2 lo_lo = (93 % 10) * (75 % 10) = 15\n     *         4 5 | // D2 hi_lo = (93 / 10) * (75 % 10) = 45\n     *         2 1 | // D2 lo_hi = (93 % 10) * (75 / 10) = 21\n     *     + 6 3 | | // D2 hi_hi = (93 / 10) * (75 / 10) = 63\n     *     ---------\n     *         2 7 | // D2 cross = (15 / 10) + (45 % 10) + 21 = 27\n     *     + 6 7 | | // D2 upper = (27 / 10) + (45 / 10) + 63 = 67\n     *     ---------\n     *       6 9 7 5 // D4 res = (27 * 10) + (15 % 10) + (67 * 100) = 6975\n     *\n     * The reasons for adding the products like this are:\n     *  1. It avoids manual carry tracking. Just like how\n     *     (9 * 9) + 9 + 9 = 99, the same applies with this for UINT64_MAX.\n     *     This avoids a lot of complexity.\n     *\n     *  2. It hints for, and on Clang, compiles to, the powerful UMAAL\n     *     instruction available in ARM's Digital Signal Processing extension\n     *     in 32-bit ARMv6 and later, which is shown below:\n     *\n     *         void UMAAL(xxh_u32 *RdLo, xxh_u32 *RdHi, xxh_u32 Rn, xxh_u32 Rm)\n     *         {\n     *             xxh_u64 product = (xxh_u64)*RdLo * (xxh_u64)*RdHi + Rn + Rm;\n     *             *RdLo = (xxh_u32)(product & 0xFFFFFFFF);\n     *             *RdHi = (xxh_u32)(product >> 32);\n     *         }\n     *\n     *     This instruction was designed for efficient long multiplication, and\n     *     allows this to be calculated in only 4 instructions at speeds\n     *     comparable to some 64-bit ALUs.\n     *\n     *  3. It isn't terrible on other platforms. Usually this will be a couple\n     *     of 32-bit ADD/ADCs.\n     */\n\n    /* First calculate all of the cross products. */\n    xxh_u64 const lo_lo = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs & 0xFFFFFFFF);\n    xxh_u64 const hi_lo = XXH_mult32to64(lhs >> 32,        rhs & 0xFFFFFFFF);\n    xxh_u64 const lo_hi = XXH_mult32to64(lhs & 0xFFFFFFFF, rhs >> 32);\n    xxh_u64 const hi_hi = XXH_mult32to64(lhs >> 32,        rhs >> 32);\n\n    /* Now add the products together. These will never overflow. */\n    xxh_u64 const cross = (lo_lo >> 32) + (hi_lo & 0xFFFFFFFF) + lo_hi;\n    xxh_u64 const upper = (hi_lo >> 32) + (cross >> 32)        + hi_hi;\n    xxh_u64 const lower = (cross << 32) | (lo_lo & 0xFFFFFFFF);\n\n    XXH128_hash_t r128;\n    r128.low64  = lower;\n    r128.high64 = upper;\n    return r128;\n#endif\n}\n\n/*!\n * @brief Calculates a 64-bit to 128-bit multiply, then XOR folds it.\n *\n * The reason for the separate function is to prevent passing too many structs\n * around by value. This will hopefully inline the multiply, but we don't force it.\n *\n * @param lhs , rhs The 64-bit integers to multiply\n * @return The low 64 bits of the product XOR'd by the high 64 bits.\n * @see XXH_mult64to128()\n */\nstatic xxh_u64\nXXH3_mul128_fold64(xxh_u64 lhs, xxh_u64 rhs)\n{\n    XXH128_hash_t product = XXH_mult64to128(lhs, rhs);\n    return product.low64 ^ product.high64;\n}\n\n/*! Seems to produce slightly better code on GCC for some reason. */\nXXH_FORCE_INLINE XXH_CONSTF xxh_u64 XXH_xorshift64(xxh_u64 v64, int shift)\n{\n    XXH_ASSERT(0 <= shift && shift < 64);\n    return v64 ^ (v64 >> shift);\n}\n\n/*\n * This is a fast avalanche stage,\n * suitable when input bits are already partially mixed\n */\nstatic XXH64_hash_t XXH3_avalanche(xxh_u64 h64)\n{\n    h64 = XXH_xorshift64(h64, 37);\n    h64 *= PRIME_MX1;\n    h64 = XXH_xorshift64(h64, 32);\n    return h64;\n}\n\n/*\n * This is a stronger avalanche,\n * inspired by Pelle Evensen's rrmxmx\n * preferable when input has not been previously mixed\n */\nstatic XXH64_hash_t XXH3_rrmxmx(xxh_u64 h64, xxh_u64 len)\n{\n    /* this mix is inspired by Pelle Evensen's rrmxmx */\n    h64 ^= XXH_rotl64(h64, 49) ^ XXH_rotl64(h64, 24);\n    h64 *= PRIME_MX2;\n    h64 ^= (h64 >> 35) + len ;\n    h64 *= PRIME_MX2;\n    return XXH_xorshift64(h64, 28);\n}\n\n\n/* ==========================================\n * Short keys\n * ==========================================\n * One of the shortcomings of XXH32 and XXH64 was that their performance was\n * sub-optimal on short lengths. It used an iterative algorithm which strongly\n * favored lengths that were a multiple of 4 or 8.\n *\n * Instead of iterating over individual inputs, we use a set of single shot\n * functions which piece together a range of lengths and operate in constant time.\n *\n * Additionally, the number of multiplies has been significantly reduced. This\n * reduces latency, especially when emulating 64-bit multiplies on 32-bit.\n *\n * Depending on the platform, this may or may not be faster than XXH32, but it\n * is almost guaranteed to be faster than XXH64.\n */\n\n/*\n * At very short lengths, there isn't enough input to fully hide secrets, or use\n * the entire secret.\n *\n * There is also only a limited amount of mixing we can do before significantly\n * impacting performance.\n *\n * Therefore, we use different sections of the secret and always mix two secret\n * samples with an XOR. This should have no effect on performance on the\n * seedless or withSeed variants because everything _should_ be constant folded\n * by modern compilers.\n *\n * The XOR mixing hides individual parts of the secret and increases entropy.\n *\n * This adds an extra layer of strength for custom secrets.\n */\nXXH_FORCE_INLINE XXH_PUREF XXH64_hash_t\nXXH3_len_1to3_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(input != NULL);\n    XXH_ASSERT(1 <= len && len <= 3);\n    XXH_ASSERT(secret != NULL);\n    /*\n     * len = 1: combined = { input[0], 0x01, input[0], input[0] }\n     * len = 2: combined = { input[1], 0x02, input[0], input[1] }\n     * len = 3: combined = { input[2], 0x03, input[0], input[1] }\n     */\n    {   xxh_u8  const c1 = input[0];\n        xxh_u8  const c2 = input[len >> 1];\n        xxh_u8  const c3 = input[len - 1];\n        xxh_u32 const combined = ((xxh_u32)c1 << 16) | ((xxh_u32)c2  << 24)\n                               | ((xxh_u32)c3 <<  0) | ((xxh_u32)len << 8);\n        xxh_u64 const bitflip = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed;\n        xxh_u64 const keyed = (xxh_u64)combined ^ bitflip;\n        return XXH64_avalanche(keyed);\n    }\n}\n\nXXH_FORCE_INLINE XXH_PUREF XXH64_hash_t\nXXH3_len_4to8_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(input != NULL);\n    XXH_ASSERT(secret != NULL);\n    XXH_ASSERT(4 <= len && len <= 8);\n    seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32;\n    {   xxh_u32 const input1 = XXH_readLE32(input);\n        xxh_u32 const input2 = XXH_readLE32(input + len - 4);\n        xxh_u64 const bitflip = (XXH_readLE64(secret+8) ^ XXH_readLE64(secret+16)) - seed;\n        xxh_u64 const input64 = input2 + (((xxh_u64)input1) << 32);\n        xxh_u64 const keyed = input64 ^ bitflip;\n        return XXH3_rrmxmx(keyed, len);\n    }\n}\n\nXXH_FORCE_INLINE XXH_PUREF XXH64_hash_t\nXXH3_len_9to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(input != NULL);\n    XXH_ASSERT(secret != NULL);\n    XXH_ASSERT(9 <= len && len <= 16);\n    {   xxh_u64 const bitflip1 = (XXH_readLE64(secret+24) ^ XXH_readLE64(secret+32)) + seed;\n        xxh_u64 const bitflip2 = (XXH_readLE64(secret+40) ^ XXH_readLE64(secret+48)) - seed;\n        xxh_u64 const input_lo = XXH_readLE64(input)           ^ bitflip1;\n        xxh_u64 const input_hi = XXH_readLE64(input + len - 8) ^ bitflip2;\n        xxh_u64 const acc = len\n                          + XXH_swap64(input_lo) + input_hi\n                          + XXH3_mul128_fold64(input_lo, input_hi);\n        return XXH3_avalanche(acc);\n    }\n}\n\nXXH_FORCE_INLINE XXH_PUREF XXH64_hash_t\nXXH3_len_0to16_64b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(len <= 16);\n    {   if (XXH_likely(len >  8)) return XXH3_len_9to16_64b(input, len, secret, seed);\n        if (XXH_likely(len >= 4)) return XXH3_len_4to8_64b(input, len, secret, seed);\n        if (len) return XXH3_len_1to3_64b(input, len, secret, seed);\n        return XXH64_avalanche(seed ^ (XXH_readLE64(secret+56) ^ XXH_readLE64(secret+64)));\n    }\n}\n\n/*\n * DISCLAIMER: There are known *seed-dependent* multicollisions here due to\n * multiplication by zero, affecting hashes of lengths 17 to 240.\n *\n * However, they are very unlikely.\n *\n * Keep this in mind when using the unseeded XXH3_64bits() variant: As with all\n * unseeded non-cryptographic hashes, it does not attempt to defend itself\n * against specially crafted inputs, only random inputs.\n *\n * Compared to classic UMAC where a 1 in 2^31 chance of 4 consecutive bytes\n * cancelling out the secret is taken an arbitrary number of times (addressed\n * in XXH3_accumulate_512), this collision is very unlikely with random inputs\n * and/or proper seeding:\n *\n * This only has a 1 in 2^63 chance of 8 consecutive bytes cancelling out, in a\n * function that is only called up to 16 times per hash with up to 240 bytes of\n * input.\n *\n * This is not too bad for a non-cryptographic hash function, especially with\n * only 64 bit outputs.\n *\n * The 128-bit variant (which trades some speed for strength) is NOT affected\n * by this, although it is always a good idea to use a proper seed if you care\n * about strength.\n */\nXXH_FORCE_INLINE xxh_u64 XXH3_mix16B(const xxh_u8* XXH_RESTRICT input,\n                                     const xxh_u8* XXH_RESTRICT secret, xxh_u64 seed64)\n{\n#if defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \\\n  && defined(__i386__) && defined(__SSE2__)  /* x86 + SSE2 */ \\\n  && !defined(XXH_ENABLE_AUTOVECTORIZE)      /* Define to disable like XXH32 hack */\n    /*\n     * UGLY HACK:\n     * GCC for x86 tends to autovectorize the 128-bit multiply, resulting in\n     * slower code.\n     *\n     * By forcing seed64 into a register, we disrupt the cost model and\n     * cause it to scalarize. See `XXH32_round()`\n     *\n     * FIXME: Clang's output is still _much_ faster -- On an AMD Ryzen 3600,\n     * XXH3_64bits @ len=240 runs at 4.6 GB/s with Clang 9, but 3.3 GB/s on\n     * GCC 9.2, despite both emitting scalar code.\n     *\n     * GCC generates much better scalar code than Clang for the rest of XXH3,\n     * which is why finding a more optimal codepath is an interest.\n     */\n    XXH_COMPILER_GUARD(seed64);\n#endif\n    {   xxh_u64 const input_lo = XXH_readLE64(input);\n        xxh_u64 const input_hi = XXH_readLE64(input+8);\n        return XXH3_mul128_fold64(\n            input_lo ^ (XXH_readLE64(secret)   + seed64),\n            input_hi ^ (XXH_readLE64(secret+8) - seed64)\n        );\n    }\n}\n\n/* For mid range keys, XXH3 uses a Mum-hash variant. */\nXXH_FORCE_INLINE XXH_PUREF XXH64_hash_t\nXXH3_len_17to128_64b(const xxh_u8* XXH_RESTRICT input, size_t len,\n                     const xxh_u8* XXH_RESTRICT secret, size_t secretSize,\n                     XXH64_hash_t seed)\n{\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;\n    XXH_ASSERT(16 < len && len <= 128);\n\n    {   xxh_u64 acc = len * XXH_PRIME64_1;\n#if XXH_SIZE_OPT >= 1\n        /* Smaller and cleaner, but slightly slower. */\n        unsigned int i = (unsigned int)(len - 1) / 32;\n        do {\n            acc += XXH3_mix16B(input+16 * i, secret+32*i, seed);\n            acc += XXH3_mix16B(input+len-16*(i+1), secret+32*i+16, seed);\n        } while (i-- != 0);\n#else\n        if (len > 32) {\n            if (len > 64) {\n                if (len > 96) {\n                    acc += XXH3_mix16B(input+48, secret+96, seed);\n                    acc += XXH3_mix16B(input+len-64, secret+112, seed);\n                }\n                acc += XXH3_mix16B(input+32, secret+64, seed);\n                acc += XXH3_mix16B(input+len-48, secret+80, seed);\n            }\n            acc += XXH3_mix16B(input+16, secret+32, seed);\n            acc += XXH3_mix16B(input+len-32, secret+48, seed);\n        }\n        acc += XXH3_mix16B(input+0, secret+0, seed);\n        acc += XXH3_mix16B(input+len-16, secret+16, seed);\n#endif\n        return XXH3_avalanche(acc);\n    }\n}\n\n#define XXH3_MIDSIZE_MAX 240\n\nXXH_NO_INLINE XXH_PUREF XXH64_hash_t\nXXH3_len_129to240_64b(const xxh_u8* XXH_RESTRICT input, size_t len,\n                      const xxh_u8* XXH_RESTRICT secret, size_t secretSize,\n                      XXH64_hash_t seed)\n{\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;\n    XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);\n\n    #define XXH3_MIDSIZE_STARTOFFSET 3\n    #define XXH3_MIDSIZE_LASTOFFSET  17\n\n    {   xxh_u64 acc = len * XXH_PRIME64_1;\n        xxh_u64 acc_end;\n        unsigned int const nbRounds = (unsigned int)len / 16;\n        unsigned int i;\n        XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);\n        for (i=0; i<8; i++) {\n            acc += XXH3_mix16B(input+(16*i), secret+(16*i), seed);\n        }\n        /* last bytes */\n        acc_end = XXH3_mix16B(input + len - 16, secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET, seed);\n        XXH_ASSERT(nbRounds >= 8);\n        acc = XXH3_avalanche(acc);\n#if defined(__clang__)                                /* Clang */ \\\n    && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */ \\\n    && !defined(XXH_ENABLE_AUTOVECTORIZE)             /* Define to disable */\n        /*\n         * UGLY HACK:\n         * Clang for ARMv7-A tries to vectorize this loop, similar to GCC x86.\n         * In everywhere else, it uses scalar code.\n         *\n         * For 64->128-bit multiplies, even if the NEON was 100% optimal, it\n         * would still be slower than UMAAL (see XXH_mult64to128).\n         *\n         * Unfortunately, Clang doesn't handle the long multiplies properly and\n         * converts them to the nonexistent \"vmulq_u64\" intrinsic, which is then\n         * scalarized into an ugly mess of VMOV.32 instructions.\n         *\n         * This mess is difficult to avoid without turning autovectorization\n         * off completely, but they are usually relatively minor and/or not\n         * worth it to fix.\n         *\n         * This loop is the easiest to fix, as unlike XXH32, this pragma\n         * _actually works_ because it is a loop vectorization instead of an\n         * SLP vectorization.\n         */\n        #pragma clang loop vectorize(disable)\n#endif\n        for (i=8 ; i < nbRounds; i++) {\n            /*\n             * Prevents clang for unrolling the acc loop and interleaving with this one.\n             */\n            XXH_COMPILER_GUARD(acc);\n            acc_end += XXH3_mix16B(input+(16*i), secret+(16*(i-8)) + XXH3_MIDSIZE_STARTOFFSET, seed);\n        }\n        return XXH3_avalanche(acc + acc_end);\n    }\n}\n\n\n/* =======     Long Keys     ======= */\n\n#define XXH_STRIPE_LEN 64\n#define XXH_SECRET_CONSUME_RATE 8   /* nb of secret bytes consumed at each accumulation */\n#define XXH_ACC_NB (XXH_STRIPE_LEN / sizeof(xxh_u64))\n\n#ifdef XXH_OLD_NAMES\n#  define STRIPE_LEN XXH_STRIPE_LEN\n#  define ACC_NB XXH_ACC_NB\n#endif\n\n#ifndef XXH_PREFETCH_DIST\n#  ifdef __clang__\n#    define XXH_PREFETCH_DIST 320\n#  else\n#    if (XXH_VECTOR == XXH_AVX512)\n#      define XXH_PREFETCH_DIST 512\n#    else\n#      define XXH_PREFETCH_DIST 384\n#    endif\n#  endif  /* __clang__ */\n#endif  /* XXH_PREFETCH_DIST */\n\n/*\n * These macros are to generate an XXH3_accumulate() function.\n * The two arguments select the name suffix and target attribute.\n *\n * The name of this symbol is XXH3_accumulate_<name>() and it calls\n * XXH3_accumulate_512_<name>().\n *\n * It may be useful to hand implement this function if the compiler fails to\n * optimize the inline function.\n */\n#define XXH3_ACCUMULATE_TEMPLATE(name)                      \\\nvoid                                                        \\\nXXH3_accumulate_##name(xxh_u64* XXH_RESTRICT acc,           \\\n                       const xxh_u8* XXH_RESTRICT input,    \\\n                       const xxh_u8* XXH_RESTRICT secret,   \\\n                       size_t nbStripes)                    \\\n{                                                           \\\n    size_t n;                                               \\\n    for (n = 0; n < nbStripes; n++ ) {                      \\\n        const xxh_u8* const in = input + n*XXH_STRIPE_LEN;  \\\n        XXH_PREFETCH(in + XXH_PREFETCH_DIST);               \\\n        XXH3_accumulate_512_##name(                         \\\n                 acc,                                       \\\n                 in,                                        \\\n                 secret + n*XXH_SECRET_CONSUME_RATE);       \\\n    }                                                       \\\n}\n\n\nXXH_FORCE_INLINE void XXH_writeLE64(void* dst, xxh_u64 v64)\n{\n    if (!XXH_CPU_LITTLE_ENDIAN) v64 = XXH_swap64(v64);\n    XXH_memcpy(dst, &v64, sizeof(v64));\n}\n\n/* Several intrinsic functions below are supposed to accept __int64 as argument,\n * as documented in https://software.intel.com/sites/landingpage/IntrinsicsGuide/ .\n * However, several environments do not define __int64 type,\n * requiring a workaround.\n */\n#if !defined (__VMS) \\\n  && (defined (__cplusplus) \\\n  || (defined (__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) /* C99 */) )\n    typedef int64_t xxh_i64;\n#else\n    /* the following type must have a width of 64-bit */\n    typedef long long xxh_i64;\n#endif\n\n\n/*\n * XXH3_accumulate_512 is the tightest loop for long inputs, and it is the most optimized.\n *\n * It is a hardened version of UMAC, based off of FARSH's implementation.\n *\n * This was chosen because it adapts quite well to 32-bit, 64-bit, and SIMD\n * implementations, and it is ridiculously fast.\n *\n * We harden it by mixing the original input to the accumulators as well as the product.\n *\n * This means that in the (relatively likely) case of a multiply by zero, the\n * original input is preserved.\n *\n * On 128-bit inputs, we swap 64-bit pairs when we add the input to improve\n * cross-pollination, as otherwise the upper and lower halves would be\n * essentially independent.\n *\n * This doesn't matter on 64-bit hashes since they all get merged together in\n * the end, so we skip the extra step.\n *\n * Both XXH3_64bits and XXH3_128bits use this subroutine.\n */\n\n#if (XXH_VECTOR == XXH_AVX512) \\\n     || (defined(XXH_DISPATCH_AVX512) && XXH_DISPATCH_AVX512 != 0)\n\n#ifndef XXH_TARGET_AVX512\n# define XXH_TARGET_AVX512  /* disable attribute target */\n#endif\n\nXXH_FORCE_INLINE XXH_TARGET_AVX512 void\nXXH3_accumulate_512_avx512(void* XXH_RESTRICT acc,\n                     const void* XXH_RESTRICT input,\n                     const void* XXH_RESTRICT secret)\n{\n    __m512i* const xacc = (__m512i *) acc;\n    XXH_ASSERT((((size_t)acc) & 63) == 0);\n    XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i));\n\n    {\n        /* data_vec    = input[0]; */\n        __m512i const data_vec    = _mm512_loadu_si512   (input);\n        /* key_vec     = secret[0]; */\n        __m512i const key_vec     = _mm512_loadu_si512   (secret);\n        /* data_key    = data_vec ^ key_vec; */\n        __m512i const data_key    = _mm512_xor_si512     (data_vec, key_vec);\n        /* data_key_lo = data_key >> 32; */\n        __m512i const data_key_lo = _mm512_srli_epi64 (data_key, 32);\n        /* product     = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */\n        __m512i const product     = _mm512_mul_epu32     (data_key, data_key_lo);\n        /* xacc[0] += swap(data_vec); */\n        __m512i const data_swap = _mm512_shuffle_epi32(data_vec, (_MM_PERM_ENUM)_MM_SHUFFLE(1, 0, 3, 2));\n        __m512i const sum       = _mm512_add_epi64(*xacc, data_swap);\n        /* xacc[0] += product; */\n        *xacc = _mm512_add_epi64(product, sum);\n    }\n}\nXXH_FORCE_INLINE XXH_TARGET_AVX512 XXH3_ACCUMULATE_TEMPLATE(avx512)\n\n/*\n * XXH3_scrambleAcc: Scrambles the accumulators to improve mixing.\n *\n * Multiplication isn't perfect, as explained by Google in HighwayHash:\n *\n *  // Multiplication mixes/scrambles bytes 0-7 of the 64-bit result to\n *  // varying degrees. In descending order of goodness, bytes\n *  // 3 4 2 5 1 6 0 7 have quality 228 224 164 160 100 96 36 32.\n *  // As expected, the upper and lower bytes are much worse.\n *\n * Source: https://github.com/google/highwayhash/blob/0aaf66b/highwayhash/hh_avx2.h#L291\n *\n * Since our algorithm uses a pseudorandom secret to add some variance into the\n * mix, we don't need to (or want to) mix as often or as much as HighwayHash does.\n *\n * This isn't as tight as XXH3_accumulate, but still written in SIMD to avoid\n * extraction.\n *\n * Both XXH3_64bits and XXH3_128bits use this subroutine.\n */\n\nXXH_FORCE_INLINE XXH_TARGET_AVX512 void\nXXH3_scrambleAcc_avx512(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 63) == 0);\n    XXH_STATIC_ASSERT(XXH_STRIPE_LEN == sizeof(__m512i));\n    {   __m512i* const xacc = (__m512i*) acc;\n        const __m512i prime32 = _mm512_set1_epi32((int)XXH_PRIME32_1);\n\n        /* xacc[0] ^= (xacc[0] >> 47) */\n        __m512i const acc_vec     = *xacc;\n        __m512i const shifted     = _mm512_srli_epi64    (acc_vec, 47);\n        /* xacc[0] ^= secret; */\n        __m512i const key_vec     = _mm512_loadu_si512   (secret);\n        __m512i const data_key    = _mm512_ternarylogic_epi32(key_vec, acc_vec, shifted, 0x96 /* key_vec ^ acc_vec ^ shifted */);\n\n        /* xacc[0] *= XXH_PRIME32_1; */\n        __m512i const data_key_hi = _mm512_srli_epi64 (data_key, 32);\n        __m512i const prod_lo     = _mm512_mul_epu32     (data_key, prime32);\n        __m512i const prod_hi     = _mm512_mul_epu32     (data_key_hi, prime32);\n        *xacc = _mm512_add_epi64(prod_lo, _mm512_slli_epi64(prod_hi, 32));\n    }\n}\n\nXXH_FORCE_INLINE XXH_TARGET_AVX512 void\nXXH3_initCustomSecret_avx512(void* XXH_RESTRICT customSecret, xxh_u64 seed64)\n{\n    XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 63) == 0);\n    XXH_STATIC_ASSERT(XXH_SEC_ALIGN == 64);\n    XXH_ASSERT(((size_t)customSecret & 63) == 0);\n    (void)(&XXH_writeLE64);\n    {   int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m512i);\n        __m512i const seed_pos = _mm512_set1_epi64((xxh_i64)seed64);\n        __m512i const seed     = _mm512_mask_sub_epi64(seed_pos, 0xAA, _mm512_set1_epi8(0), seed_pos);\n\n        const __m512i* const src  = (const __m512i*) ((const void*) XXH3_kSecret);\n              __m512i* const dest = (      __m512i*) customSecret;\n        int i;\n        XXH_ASSERT(((size_t)src & 63) == 0); /* control alignment */\n        XXH_ASSERT(((size_t)dest & 63) == 0);\n        for (i=0; i < nbRounds; ++i) {\n            dest[i] = _mm512_add_epi64(_mm512_load_si512(src + i), seed);\n    }   }\n}\n\n#endif\n\n#if (XXH_VECTOR == XXH_AVX2) \\\n    || (defined(XXH_DISPATCH_AVX2) && XXH_DISPATCH_AVX2 != 0)\n\n#ifndef XXH_TARGET_AVX2\n# define XXH_TARGET_AVX2  /* disable attribute target */\n#endif\n\nXXH_FORCE_INLINE XXH_TARGET_AVX2 void\nXXH3_accumulate_512_avx2( void* XXH_RESTRICT acc,\n                    const void* XXH_RESTRICT input,\n                    const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 31) == 0);\n    {   __m256i* const xacc    =       (__m256i *) acc;\n        /* Unaligned. This is mainly for pointer arithmetic, and because\n         * _mm256_loadu_si256 requires  a const __m256i * pointer for some reason. */\n        const         __m256i* const xinput  = (const __m256i *) input;\n        /* Unaligned. This is mainly for pointer arithmetic, and because\n         * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */\n        const         __m256i* const xsecret = (const __m256i *) secret;\n\n        size_t i;\n        for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) {\n            /* data_vec    = xinput[i]; */\n            __m256i const data_vec    = _mm256_loadu_si256    (xinput+i);\n            /* key_vec     = xsecret[i]; */\n            __m256i const key_vec     = _mm256_loadu_si256   (xsecret+i);\n            /* data_key    = data_vec ^ key_vec; */\n            __m256i const data_key    = _mm256_xor_si256     (data_vec, key_vec);\n            /* data_key_lo = data_key >> 32; */\n            __m256i const data_key_lo = _mm256_srli_epi64 (data_key, 32);\n            /* product     = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */\n            __m256i const product     = _mm256_mul_epu32     (data_key, data_key_lo);\n            /* xacc[i] += swap(data_vec); */\n            __m256i const data_swap = _mm256_shuffle_epi32(data_vec, _MM_SHUFFLE(1, 0, 3, 2));\n            __m256i const sum       = _mm256_add_epi64(xacc[i], data_swap);\n            /* xacc[i] += product; */\n            xacc[i] = _mm256_add_epi64(product, sum);\n    }   }\n}\nXXH_FORCE_INLINE XXH_TARGET_AVX2 XXH3_ACCUMULATE_TEMPLATE(avx2)\n\nXXH_FORCE_INLINE XXH_TARGET_AVX2 void\nXXH3_scrambleAcc_avx2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 31) == 0);\n    {   __m256i* const xacc = (__m256i*) acc;\n        /* Unaligned. This is mainly for pointer arithmetic, and because\n         * _mm256_loadu_si256 requires a const __m256i * pointer for some reason. */\n        const         __m256i* const xsecret = (const __m256i *) secret;\n        const __m256i prime32 = _mm256_set1_epi32((int)XXH_PRIME32_1);\n\n        size_t i;\n        for (i=0; i < XXH_STRIPE_LEN/sizeof(__m256i); i++) {\n            /* xacc[i] ^= (xacc[i] >> 47) */\n            __m256i const acc_vec     = xacc[i];\n            __m256i const shifted     = _mm256_srli_epi64    (acc_vec, 47);\n            __m256i const data_vec    = _mm256_xor_si256     (acc_vec, shifted);\n            /* xacc[i] ^= xsecret; */\n            __m256i const key_vec     = _mm256_loadu_si256   (xsecret+i);\n            __m256i const data_key    = _mm256_xor_si256     (data_vec, key_vec);\n\n            /* xacc[i] *= XXH_PRIME32_1; */\n            __m256i const data_key_hi = _mm256_srli_epi64 (data_key, 32);\n            __m256i const prod_lo     = _mm256_mul_epu32     (data_key, prime32);\n            __m256i const prod_hi     = _mm256_mul_epu32     (data_key_hi, prime32);\n            xacc[i] = _mm256_add_epi64(prod_lo, _mm256_slli_epi64(prod_hi, 32));\n        }\n    }\n}\n\nXXH_FORCE_INLINE XXH_TARGET_AVX2 void XXH3_initCustomSecret_avx2(void* XXH_RESTRICT customSecret, xxh_u64 seed64)\n{\n    XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 31) == 0);\n    XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE / sizeof(__m256i)) == 6);\n    XXH_STATIC_ASSERT(XXH_SEC_ALIGN <= 64);\n    (void)(&XXH_writeLE64);\n    XXH_PREFETCH(customSecret);\n    {   __m256i const seed = _mm256_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64, (xxh_i64)(0U - seed64), (xxh_i64)seed64);\n\n        const __m256i* const src  = (const __m256i*) ((const void*) XXH3_kSecret);\n              __m256i*       dest = (      __m256i*) customSecret;\n\n#       if defined(__GNUC__) || defined(__clang__)\n        /*\n         * On GCC & Clang, marking 'dest' as modified will cause the compiler:\n         *   - do not extract the secret from sse registers in the internal loop\n         *   - use less common registers, and avoid pushing these reg into stack\n         */\n        XXH_COMPILER_GUARD(dest);\n#       endif\n        XXH_ASSERT(((size_t)src & 31) == 0); /* control alignment */\n        XXH_ASSERT(((size_t)dest & 31) == 0);\n\n        /* GCC -O2 need unroll loop manually */\n        dest[0] = _mm256_add_epi64(_mm256_load_si256(src+0), seed);\n        dest[1] = _mm256_add_epi64(_mm256_load_si256(src+1), seed);\n        dest[2] = _mm256_add_epi64(_mm256_load_si256(src+2), seed);\n        dest[3] = _mm256_add_epi64(_mm256_load_si256(src+3), seed);\n        dest[4] = _mm256_add_epi64(_mm256_load_si256(src+4), seed);\n        dest[5] = _mm256_add_epi64(_mm256_load_si256(src+5), seed);\n    }\n}\n\n#endif\n\n/* x86dispatch always generates SSE2 */\n#if (XXH_VECTOR == XXH_SSE2) || defined(XXH_X86DISPATCH)\n\n#ifndef XXH_TARGET_SSE2\n# define XXH_TARGET_SSE2  /* disable attribute target */\n#endif\n\nXXH_FORCE_INLINE XXH_TARGET_SSE2 void\nXXH3_accumulate_512_sse2( void* XXH_RESTRICT acc,\n                    const void* XXH_RESTRICT input,\n                    const void* XXH_RESTRICT secret)\n{\n    /* SSE2 is just a half-scale version of the AVX2 version. */\n    XXH_ASSERT((((size_t)acc) & 15) == 0);\n    {   __m128i* const xacc    =       (__m128i *) acc;\n        /* Unaligned. This is mainly for pointer arithmetic, and because\n         * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */\n        const         __m128i* const xinput  = (const __m128i *) input;\n        /* Unaligned. This is mainly for pointer arithmetic, and because\n         * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */\n        const         __m128i* const xsecret = (const __m128i *) secret;\n\n        size_t i;\n        for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) {\n            /* data_vec    = xinput[i]; */\n            __m128i const data_vec    = _mm_loadu_si128   (xinput+i);\n            /* key_vec     = xsecret[i]; */\n            __m128i const key_vec     = _mm_loadu_si128   (xsecret+i);\n            /* data_key    = data_vec ^ key_vec; */\n            __m128i const data_key    = _mm_xor_si128     (data_vec, key_vec);\n            /* data_key_lo = data_key >> 32; */\n            __m128i const data_key_lo = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));\n            /* product     = (data_key & 0xffffffff) * (data_key_lo & 0xffffffff); */\n            __m128i const product     = _mm_mul_epu32     (data_key, data_key_lo);\n            /* xacc[i] += swap(data_vec); */\n            __m128i const data_swap = _mm_shuffle_epi32(data_vec, _MM_SHUFFLE(1,0,3,2));\n            __m128i const sum       = _mm_add_epi64(xacc[i], data_swap);\n            /* xacc[i] += product; */\n            xacc[i] = _mm_add_epi64(product, sum);\n    }   }\n}\nXXH_FORCE_INLINE XXH_TARGET_SSE2 XXH3_ACCUMULATE_TEMPLATE(sse2)\n\nXXH_FORCE_INLINE XXH_TARGET_SSE2 void\nXXH3_scrambleAcc_sse2(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 15) == 0);\n    {   __m128i* const xacc = (__m128i*) acc;\n        /* Unaligned. This is mainly for pointer arithmetic, and because\n         * _mm_loadu_si128 requires a const __m128i * pointer for some reason. */\n        const         __m128i* const xsecret = (const __m128i *) secret;\n        const __m128i prime32 = _mm_set1_epi32((int)XXH_PRIME32_1);\n\n        size_t i;\n        for (i=0; i < XXH_STRIPE_LEN/sizeof(__m128i); i++) {\n            /* xacc[i] ^= (xacc[i] >> 47) */\n            __m128i const acc_vec     = xacc[i];\n            __m128i const shifted     = _mm_srli_epi64    (acc_vec, 47);\n            __m128i const data_vec    = _mm_xor_si128     (acc_vec, shifted);\n            /* xacc[i] ^= xsecret[i]; */\n            __m128i const key_vec     = _mm_loadu_si128   (xsecret+i);\n            __m128i const data_key    = _mm_xor_si128     (data_vec, key_vec);\n\n            /* xacc[i] *= XXH_PRIME32_1; */\n            __m128i const data_key_hi = _mm_shuffle_epi32 (data_key, _MM_SHUFFLE(0, 3, 0, 1));\n            __m128i const prod_lo     = _mm_mul_epu32     (data_key, prime32);\n            __m128i const prod_hi     = _mm_mul_epu32     (data_key_hi, prime32);\n            xacc[i] = _mm_add_epi64(prod_lo, _mm_slli_epi64(prod_hi, 32));\n        }\n    }\n}\n\nXXH_FORCE_INLINE XXH_TARGET_SSE2 void XXH3_initCustomSecret_sse2(void* XXH_RESTRICT customSecret, xxh_u64 seed64)\n{\n    XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0);\n    (void)(&XXH_writeLE64);\n    {   int const nbRounds = XXH_SECRET_DEFAULT_SIZE / sizeof(__m128i);\n\n#       if defined(_MSC_VER) && defined(_M_IX86) && _MSC_VER < 1900\n        /* MSVC 32bit mode does not support _mm_set_epi64x before 2015 */\n        XXH_ALIGN(16) const xxh_i64 seed64x2[2] = { (xxh_i64)seed64, (xxh_i64)(0U - seed64) };\n        __m128i const seed = _mm_load_si128((__m128i const*)seed64x2);\n#       else\n        __m128i const seed = _mm_set_epi64x((xxh_i64)(0U - seed64), (xxh_i64)seed64);\n#       endif\n        int i;\n\n        const void* const src16 = XXH3_kSecret;\n        __m128i* dst16 = (__m128i*) customSecret;\n#       if defined(__GNUC__) || defined(__clang__)\n        /*\n         * On GCC & Clang, marking 'dest' as modified will cause the compiler:\n         *   - do not extract the secret from sse registers in the internal loop\n         *   - use less common registers, and avoid pushing these reg into stack\n         */\n        XXH_COMPILER_GUARD(dst16);\n#       endif\n        XXH_ASSERT(((size_t)src16 & 15) == 0); /* control alignment */\n        XXH_ASSERT(((size_t)dst16 & 15) == 0);\n\n        for (i=0; i < nbRounds; ++i) {\n            dst16[i] = _mm_add_epi64(_mm_load_si128((const __m128i *)src16+i), seed);\n    }   }\n}\n\n#endif\n\n#if (XXH_VECTOR == XXH_NEON)\n\n/* forward declarations for the scalar routines */\nXXH_FORCE_INLINE void\nXXH3_scalarRound(void* XXH_RESTRICT acc, void const* XXH_RESTRICT input,\n                 void const* XXH_RESTRICT secret, size_t lane);\n\nXXH_FORCE_INLINE void\nXXH3_scalarScrambleRound(void* XXH_RESTRICT acc,\n                         void const* XXH_RESTRICT secret, size_t lane);\n\n/*!\n * @internal\n * @brief The bulk processing loop for NEON and WASM SIMD128.\n *\n * The NEON code path is actually partially scalar when running on AArch64. This\n * is to optimize the pipelining and can have up to 15% speedup depending on the\n * CPU, and it also mitigates some GCC codegen issues.\n *\n * @see XXH3_NEON_LANES for configuring this and details about this optimization.\n *\n * NEON's 32-bit to 64-bit long multiply takes a half vector of 32-bit\n * integers instead of the other platforms which mask full 64-bit vectors,\n * so the setup is more complicated than just shifting right.\n *\n * Additionally, there is an optimization for 4 lanes at once noted below.\n *\n * Since, as stated, the most optimal amount of lanes for Cortexes is 6,\n * there needs to be *three* versions of the accumulate operation used\n * for the remaining 2 lanes.\n *\n * WASM's SIMD128 uses SIMDe's arm_neon.h polyfill because the intrinsics overlap\n * nearly perfectly.\n */\n\nXXH_FORCE_INLINE void\nXXH3_accumulate_512_neon( void* XXH_RESTRICT acc,\n                    const void* XXH_RESTRICT input,\n                    const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 15) == 0);\n    XXH_STATIC_ASSERT(XXH3_NEON_LANES > 0 && XXH3_NEON_LANES <= XXH_ACC_NB && XXH3_NEON_LANES % 2 == 0);\n    {   /* GCC for darwin arm64 does not like aliasing here */\n        xxh_aliasing_uint64x2_t* const xacc = (xxh_aliasing_uint64x2_t*) acc;\n        /* We don't use a uint32x4_t pointer because it causes bus errors on ARMv7. */\n        uint8_t const* xinput = (const uint8_t *) input;\n        uint8_t const* xsecret  = (const uint8_t *) secret;\n\n        size_t i;\n#ifdef __wasm_simd128__\n        /*\n         * On WASM SIMD128, Clang emits direct address loads when XXH3_kSecret\n         * is constant propagated, which results in it converting it to this\n         * inside the loop:\n         *\n         *    a = v128.load(XXH3_kSecret +  0 + $secret_offset, offset = 0)\n         *    b = v128.load(XXH3_kSecret + 16 + $secret_offset, offset = 0)\n         *    ...\n         *\n         * This requires a full 32-bit address immediate (and therefore a 6 byte\n         * instruction) as well as an add for each offset.\n         *\n         * Putting an asm guard prevents it from folding (at the cost of losing\n         * the alignment hint), and uses the free offset in `v128.load` instead\n         * of adding secret_offset each time which overall reduces code size by\n         * about a kilobyte and improves performance.\n         */\n        XXH_COMPILER_GUARD(xsecret);\n#endif\n        /* Scalar lanes use the normal scalarRound routine */\n        for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) {\n            XXH3_scalarRound(acc, input, secret, i);\n        }\n        i = 0;\n        /* 4 NEON lanes at a time. */\n        for (; i+1 < XXH3_NEON_LANES / 2; i+=2) {\n            /* data_vec = xinput[i]; */\n            uint64x2_t data_vec_1 = XXH_vld1q_u64(xinput  + (i * 16));\n            uint64x2_t data_vec_2 = XXH_vld1q_u64(xinput  + ((i+1) * 16));\n            /* key_vec  = xsecret[i];  */\n            uint64x2_t key_vec_1  = XXH_vld1q_u64(xsecret + (i * 16));\n            uint64x2_t key_vec_2  = XXH_vld1q_u64(xsecret + ((i+1) * 16));\n            /* data_swap = swap(data_vec) */\n            uint64x2_t data_swap_1 = vextq_u64(data_vec_1, data_vec_1, 1);\n            uint64x2_t data_swap_2 = vextq_u64(data_vec_2, data_vec_2, 1);\n            /* data_key = data_vec ^ key_vec; */\n            uint64x2_t data_key_1 = veorq_u64(data_vec_1, key_vec_1);\n            uint64x2_t data_key_2 = veorq_u64(data_vec_2, key_vec_2);\n\n            /*\n             * If we reinterpret the 64x2 vectors as 32x4 vectors, we can use a\n             * de-interleave operation for 4 lanes in 1 step with `vuzpq_u32` to\n             * get one vector with the low 32 bits of each lane, and one vector\n             * with the high 32 bits of each lane.\n             *\n             * The intrinsic returns a double vector because the original ARMv7-a\n             * instruction modified both arguments in place. AArch64 and SIMD128 emit\n             * two instructions from this intrinsic.\n             *\n             *  [ dk11L | dk11H | dk12L | dk12H ] -> [ dk11L | dk12L | dk21L | dk22L ]\n             *  [ dk21L | dk21H | dk22L | dk22H ] -> [ dk11H | dk12H | dk21H | dk22H ]\n             */\n            uint32x4x2_t unzipped = vuzpq_u32(\n                vreinterpretq_u32_u64(data_key_1),\n                vreinterpretq_u32_u64(data_key_2)\n            );\n            /* data_key_lo = data_key & 0xFFFFFFFF */\n            uint32x4_t data_key_lo = unzipped.val[0];\n            /* data_key_hi = data_key >> 32 */\n            uint32x4_t data_key_hi = unzipped.val[1];\n            /*\n             * Then, we can split the vectors horizontally and multiply which, as for most\n             * widening intrinsics, have a variant that works on both high half vectors\n             * for free on AArch64. A similar instruction is available on SIMD128.\n             *\n             * sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi\n             */\n            uint64x2_t sum_1 = XXH_vmlal_low_u32(data_swap_1, data_key_lo, data_key_hi);\n            uint64x2_t sum_2 = XXH_vmlal_high_u32(data_swap_2, data_key_lo, data_key_hi);\n            /*\n             * Clang reorders\n             *    a += b * c;     // umlal   swap.2d, dkl.2s, dkh.2s\n             *    c += a;         // add     acc.2d, acc.2d, swap.2d\n             * to\n             *    c += a;         // add     acc.2d, acc.2d, swap.2d\n             *    c += b * c;     // umlal   acc.2d, dkl.2s, dkh.2s\n             *\n             * While it would make sense in theory since the addition is faster,\n             * for reasons likely related to umlal being limited to certain NEON\n             * pipelines, this is worse. A compiler guard fixes this.\n             */\n            XXH_COMPILER_GUARD_CLANG_NEON(sum_1);\n            XXH_COMPILER_GUARD_CLANG_NEON(sum_2);\n            /* xacc[i] = acc_vec + sum; */\n            xacc[i]   = vaddq_u64(xacc[i], sum_1);\n            xacc[i+1] = vaddq_u64(xacc[i+1], sum_2);\n        }\n        /* Operate on the remaining NEON lanes 2 at a time. */\n        for (; i < XXH3_NEON_LANES / 2; i++) {\n            /* data_vec = xinput[i]; */\n            uint64x2_t data_vec = XXH_vld1q_u64(xinput  + (i * 16));\n            /* key_vec  = xsecret[i];  */\n            uint64x2_t key_vec  = XXH_vld1q_u64(xsecret + (i * 16));\n            /* acc_vec_2 = swap(data_vec) */\n            uint64x2_t data_swap = vextq_u64(data_vec, data_vec, 1);\n            /* data_key = data_vec ^ key_vec; */\n            uint64x2_t data_key = veorq_u64(data_vec, key_vec);\n            /* For two lanes, just use VMOVN and VSHRN. */\n            /* data_key_lo = data_key & 0xFFFFFFFF; */\n            uint32x2_t data_key_lo = vmovn_u64(data_key);\n            /* data_key_hi = data_key >> 32; */\n            uint32x2_t data_key_hi = vshrn_n_u64(data_key, 32);\n            /* sum = data_swap + (u64x2) data_key_lo * (u64x2) data_key_hi; */\n            uint64x2_t sum = vmlal_u32(data_swap, data_key_lo, data_key_hi);\n            /* Same Clang workaround as before */\n            XXH_COMPILER_GUARD_CLANG_NEON(sum);\n            /* xacc[i] = acc_vec + sum; */\n            xacc[i] = vaddq_u64 (xacc[i], sum);\n        }\n    }\n}\nXXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(neon)\n\nXXH_FORCE_INLINE void\nXXH3_scrambleAcc_neon(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 15) == 0);\n\n    {   xxh_aliasing_uint64x2_t* xacc       = (xxh_aliasing_uint64x2_t*) acc;\n        uint8_t const* xsecret = (uint8_t const*) secret;\n\n        size_t i;\n        /* WASM uses operator overloads and doesn't need these. */\n#ifndef __wasm_simd128__\n        /* { prime32_1, prime32_1 } */\n        uint32x2_t const kPrimeLo = vdup_n_u32(XXH_PRIME32_1);\n        /* { 0, prime32_1, 0, prime32_1 } */\n        uint32x4_t const kPrimeHi = vreinterpretq_u32_u64(vdupq_n_u64((xxh_u64)XXH_PRIME32_1 << 32));\n#endif\n\n        /* AArch64 uses both scalar and neon at the same time */\n        for (i = XXH3_NEON_LANES; i < XXH_ACC_NB; i++) {\n            XXH3_scalarScrambleRound(acc, secret, i);\n        }\n        for (i=0; i < XXH3_NEON_LANES / 2; i++) {\n            /* xacc[i] ^= (xacc[i] >> 47); */\n            uint64x2_t acc_vec  = xacc[i];\n            uint64x2_t shifted  = vshrq_n_u64(acc_vec, 47);\n            uint64x2_t data_vec = veorq_u64(acc_vec, shifted);\n\n            /* xacc[i] ^= xsecret[i]; */\n            uint64x2_t key_vec  = XXH_vld1q_u64(xsecret + (i * 16));\n            uint64x2_t data_key = veorq_u64(data_vec, key_vec);\n            /* xacc[i] *= XXH_PRIME32_1 */\n#ifdef __wasm_simd128__\n            /* SIMD128 has multiply by u64x2, use it instead of expanding and scalarizing */\n            xacc[i] = data_key * XXH_PRIME32_1;\n#else\n            /*\n             * Expanded version with portable NEON intrinsics\n             *\n             *    lo(x) * lo(y) + (hi(x) * lo(y) << 32)\n             *\n             * prod_hi = hi(data_key) * lo(prime) << 32\n             *\n             * Since we only need 32 bits of this multiply a trick can be used, reinterpreting the vector\n             * as a uint32x4_t and multiplying by { 0, prime, 0, prime } to cancel out the unwanted bits\n             * and avoid the shift.\n             */\n            uint32x4_t prod_hi = vmulq_u32 (vreinterpretq_u32_u64(data_key), kPrimeHi);\n            /* Extract low bits for vmlal_u32  */\n            uint32x2_t data_key_lo = vmovn_u64(data_key);\n            /* xacc[i] = prod_hi + lo(data_key) * XXH_PRIME32_1; */\n            xacc[i] = vmlal_u32(vreinterpretq_u64_u32(prod_hi), data_key_lo, kPrimeLo);\n#endif\n        }\n    }\n}\n#endif\n\n#if (XXH_VECTOR == XXH_VSX)\n\nXXH_FORCE_INLINE void\nXXH3_accumulate_512_vsx(  void* XXH_RESTRICT acc,\n                    const void* XXH_RESTRICT input,\n                    const void* XXH_RESTRICT secret)\n{\n    /* presumed aligned */\n    xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc;\n    xxh_u8 const* const xinput   = (xxh_u8 const*) input;   /* no alignment restriction */\n    xxh_u8 const* const xsecret  = (xxh_u8 const*) secret;    /* no alignment restriction */\n    xxh_u64x2 const v32 = { 32, 32 };\n    size_t i;\n    for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) {\n        /* data_vec = xinput[i]; */\n        xxh_u64x2 const data_vec = XXH_vec_loadu(xinput + 16*i);\n        /* key_vec = xsecret[i]; */\n        xxh_u64x2 const key_vec  = XXH_vec_loadu(xsecret + 16*i);\n        xxh_u64x2 const data_key = data_vec ^ key_vec;\n        /* shuffled = (data_key << 32) | (data_key >> 32); */\n        xxh_u32x4 const shuffled = (xxh_u32x4)vec_rl(data_key, v32);\n        /* product = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)shuffled & 0xFFFFFFFF); */\n        xxh_u64x2 const product  = XXH_vec_mulo((xxh_u32x4)data_key, shuffled);\n        /* acc_vec = xacc[i]; */\n        xxh_u64x2 acc_vec        = xacc[i];\n        acc_vec += product;\n\n        /* swap high and low halves */\n#ifdef __s390x__\n        acc_vec += vec_permi(data_vec, data_vec, 2);\n#else\n        acc_vec += vec_xxpermdi(data_vec, data_vec, 2);\n#endif\n        xacc[i] = acc_vec;\n    }\n}\nXXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(vsx)\n\nXXH_FORCE_INLINE void\nXXH3_scrambleAcc_vsx(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)\n{\n    XXH_ASSERT((((size_t)acc) & 15) == 0);\n\n    {   xxh_aliasing_u64x2* const xacc = (xxh_aliasing_u64x2*) acc;\n        const xxh_u8* const xsecret = (const xxh_u8*) secret;\n        /* constants */\n        xxh_u64x2 const v32  = { 32, 32 };\n        xxh_u64x2 const v47 = { 47, 47 };\n        xxh_u32x4 const prime = { XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1, XXH_PRIME32_1 };\n        size_t i;\n        for (i = 0; i < XXH_STRIPE_LEN / sizeof(xxh_u64x2); i++) {\n            /* xacc[i] ^= (xacc[i] >> 47); */\n            xxh_u64x2 const acc_vec  = xacc[i];\n            xxh_u64x2 const data_vec = acc_vec ^ (acc_vec >> v47);\n\n            /* xacc[i] ^= xsecret[i]; */\n            xxh_u64x2 const key_vec  = XXH_vec_loadu(xsecret + 16*i);\n            xxh_u64x2 const data_key = data_vec ^ key_vec;\n\n            /* xacc[i] *= XXH_PRIME32_1 */\n            /* prod_lo = ((xxh_u64x2)data_key & 0xFFFFFFFF) * ((xxh_u64x2)prime & 0xFFFFFFFF);  */\n            xxh_u64x2 const prod_even  = XXH_vec_mule((xxh_u32x4)data_key, prime);\n            /* prod_hi = ((xxh_u64x2)data_key >> 32) * ((xxh_u64x2)prime >> 32);  */\n            xxh_u64x2 const prod_odd  = XXH_vec_mulo((xxh_u32x4)data_key, prime);\n            xacc[i] = prod_odd + (prod_even << v32);\n    }   }\n}\n\n#endif\n\n#if (XXH_VECTOR == XXH_SVE)\n\nXXH_FORCE_INLINE void\nXXH3_accumulate_512_sve( void* XXH_RESTRICT acc,\n                   const void* XXH_RESTRICT input,\n                   const void* XXH_RESTRICT secret)\n{\n    uint64_t *xacc = (uint64_t *)acc;\n    const uint64_t *xinput = (const uint64_t *)(const void *)input;\n    const uint64_t *xsecret = (const uint64_t *)(const void *)secret;\n    svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1);\n    uint64_t element_count = svcntd();\n    if (element_count >= 8) {\n        svbool_t mask = svptrue_pat_b64(SV_VL8);\n        svuint64_t vacc = svld1_u64(mask, xacc);\n        ACCRND(vacc, 0);\n        svst1_u64(mask, xacc, vacc);\n    } else if (element_count == 2) {   /* sve128 */\n        svbool_t mask = svptrue_pat_b64(SV_VL2);\n        svuint64_t acc0 = svld1_u64(mask, xacc + 0);\n        svuint64_t acc1 = svld1_u64(mask, xacc + 2);\n        svuint64_t acc2 = svld1_u64(mask, xacc + 4);\n        svuint64_t acc3 = svld1_u64(mask, xacc + 6);\n        ACCRND(acc0, 0);\n        ACCRND(acc1, 2);\n        ACCRND(acc2, 4);\n        ACCRND(acc3, 6);\n        svst1_u64(mask, xacc + 0, acc0);\n        svst1_u64(mask, xacc + 2, acc1);\n        svst1_u64(mask, xacc + 4, acc2);\n        svst1_u64(mask, xacc + 6, acc3);\n    } else {\n        svbool_t mask = svptrue_pat_b64(SV_VL4);\n        svuint64_t acc0 = svld1_u64(mask, xacc + 0);\n        svuint64_t acc1 = svld1_u64(mask, xacc + 4);\n        ACCRND(acc0, 0);\n        ACCRND(acc1, 4);\n        svst1_u64(mask, xacc + 0, acc0);\n        svst1_u64(mask, xacc + 4, acc1);\n    }\n}\n\nXXH_FORCE_INLINE void\nXXH3_accumulate_sve(xxh_u64* XXH_RESTRICT acc,\n               const xxh_u8* XXH_RESTRICT input,\n               const xxh_u8* XXH_RESTRICT secret,\n               size_t nbStripes)\n{\n    if (nbStripes != 0) {\n        uint64_t *xacc = (uint64_t *)acc;\n        const uint64_t *xinput = (const uint64_t *)(const void *)input;\n        const uint64_t *xsecret = (const uint64_t *)(const void *)secret;\n        svuint64_t kSwap = sveor_n_u64_z(svptrue_b64(), svindex_u64(0, 1), 1);\n        uint64_t element_count = svcntd();\n        if (element_count >= 8) {\n            svbool_t mask = svptrue_pat_b64(SV_VL8);\n            svuint64_t vacc = svld1_u64(mask, xacc + 0);\n            do {\n                /* svprfd(svbool_t, void *, enum svfprop); */\n                svprfd(mask, xinput + 128, SV_PLDL1STRM);\n                ACCRND(vacc, 0);\n                xinput += 8;\n                xsecret += 1;\n                nbStripes--;\n           } while (nbStripes != 0);\n\n           svst1_u64(mask, xacc + 0, vacc);\n        } else if (element_count == 2) { /* sve128 */\n            svbool_t mask = svptrue_pat_b64(SV_VL2);\n            svuint64_t acc0 = svld1_u64(mask, xacc + 0);\n            svuint64_t acc1 = svld1_u64(mask, xacc + 2);\n            svuint64_t acc2 = svld1_u64(mask, xacc + 4);\n            svuint64_t acc3 = svld1_u64(mask, xacc + 6);\n            do {\n                svprfd(mask, xinput + 128, SV_PLDL1STRM);\n                ACCRND(acc0, 0);\n                ACCRND(acc1, 2);\n                ACCRND(acc2, 4);\n                ACCRND(acc3, 6);\n                xinput += 8;\n                xsecret += 1;\n                nbStripes--;\n           } while (nbStripes != 0);\n\n           svst1_u64(mask, xacc + 0, acc0);\n           svst1_u64(mask, xacc + 2, acc1);\n           svst1_u64(mask, xacc + 4, acc2);\n           svst1_u64(mask, xacc + 6, acc3);\n        } else {\n            svbool_t mask = svptrue_pat_b64(SV_VL4);\n            svuint64_t acc0 = svld1_u64(mask, xacc + 0);\n            svuint64_t acc1 = svld1_u64(mask, xacc + 4);\n            do {\n                svprfd(mask, xinput + 128, SV_PLDL1STRM);\n                ACCRND(acc0, 0);\n                ACCRND(acc1, 4);\n                xinput += 8;\n                xsecret += 1;\n                nbStripes--;\n           } while (nbStripes != 0);\n\n           svst1_u64(mask, xacc + 0, acc0);\n           svst1_u64(mask, xacc + 4, acc1);\n       }\n    }\n}\n\n#endif\n\n/* scalar variants - universal */\n\n#if defined(__aarch64__) && (defined(__GNUC__) || defined(__clang__))\n/*\n * In XXH3_scalarRound(), GCC and Clang have a similar codegen issue, where they\n * emit an excess mask and a full 64-bit multiply-add (MADD X-form).\n *\n * While this might not seem like much, as AArch64 is a 64-bit architecture, only\n * big Cortex designs have a full 64-bit multiplier.\n *\n * On the little cores, the smaller 32-bit multiplier is used, and full 64-bit\n * multiplies expand to 2-3 multiplies in microcode. This has a major penalty\n * of up to 4 latency cycles and 2 stall cycles in the multiply pipeline.\n *\n * Thankfully, AArch64 still provides the 32-bit long multiply-add (UMADDL) which does\n * not have this penalty and does the mask automatically.\n */\nXXH_FORCE_INLINE xxh_u64\nXXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc)\n{\n    xxh_u64 ret;\n    /* note: %x = 64-bit register, %w = 32-bit register */\n    __asm__(\"umaddl %x0, %w1, %w2, %x3\" : \"=r\" (ret) : \"r\" (lhs), \"r\" (rhs), \"r\" (acc));\n    return ret;\n}\n#else\nXXH_FORCE_INLINE xxh_u64\nXXH_mult32to64_add64(xxh_u64 lhs, xxh_u64 rhs, xxh_u64 acc)\n{\n    return XXH_mult32to64((xxh_u32)lhs, (xxh_u32)rhs) + acc;\n}\n#endif\n\n/*!\n * @internal\n * @brief Scalar round for @ref XXH3_accumulate_512_scalar().\n *\n * This is extracted to its own function because the NEON path uses a combination\n * of NEON and scalar.\n */\nXXH_FORCE_INLINE void\nXXH3_scalarRound(void* XXH_RESTRICT acc,\n                 void const* XXH_RESTRICT input,\n                 void const* XXH_RESTRICT secret,\n                 size_t lane)\n{\n    xxh_u64* xacc = (xxh_u64*) acc;\n    xxh_u8 const* xinput  = (xxh_u8 const*) input;\n    xxh_u8 const* xsecret = (xxh_u8 const*) secret;\n    XXH_ASSERT(lane < XXH_ACC_NB);\n    XXH_ASSERT(((size_t)acc & (XXH_ACC_ALIGN-1)) == 0);\n    {\n        xxh_u64 const data_val = XXH_readLE64(xinput + lane * 8);\n        xxh_u64 const data_key = data_val ^ XXH_readLE64(xsecret + lane * 8);\n        xacc[lane ^ 1] += data_val; /* swap adjacent lanes */\n        xacc[lane] = XXH_mult32to64_add64(data_key /* & 0xFFFFFFFF */, data_key >> 32, xacc[lane]);\n    }\n}\n\n/*!\n * @internal\n * @brief Processes a 64 byte block of data using the scalar path.\n */\nXXH_FORCE_INLINE void\nXXH3_accumulate_512_scalar(void* XXH_RESTRICT acc,\n                     const void* XXH_RESTRICT input,\n                     const void* XXH_RESTRICT secret)\n{\n    size_t i;\n    /* ARM GCC refuses to unroll this loop, resulting in a 24% slowdown on ARMv6. */\n#if defined(__GNUC__) && !defined(__clang__) \\\n  && (defined(__arm__) || defined(__thumb2__)) \\\n  && defined(__ARM_FEATURE_UNALIGNED) /* no unaligned access just wastes bytes */ \\\n  && XXH_SIZE_OPT <= 0\n#  pragma GCC unroll 8\n#endif\n    for (i=0; i < XXH_ACC_NB; i++) {\n        XXH3_scalarRound(acc, input, secret, i);\n    }\n}\nXXH_FORCE_INLINE XXH3_ACCUMULATE_TEMPLATE(scalar)\n\n/*!\n * @internal\n * @brief Scalar scramble step for @ref XXH3_scrambleAcc_scalar().\n *\n * This is extracted to its own function because the NEON path uses a combination\n * of NEON and scalar.\n */\nXXH_FORCE_INLINE void\nXXH3_scalarScrambleRound(void* XXH_RESTRICT acc,\n                         void const* XXH_RESTRICT secret,\n                         size_t lane)\n{\n    xxh_u64* const xacc = (xxh_u64*) acc;   /* presumed aligned */\n    const xxh_u8* const xsecret = (const xxh_u8*) secret;   /* no alignment restriction */\n    XXH_ASSERT((((size_t)acc) & (XXH_ACC_ALIGN-1)) == 0);\n    XXH_ASSERT(lane < XXH_ACC_NB);\n    {\n        xxh_u64 const key64 = XXH_readLE64(xsecret + lane * 8);\n        xxh_u64 acc64 = xacc[lane];\n        acc64 = XXH_xorshift64(acc64, 47);\n        acc64 ^= key64;\n        acc64 *= XXH_PRIME32_1;\n        xacc[lane] = acc64;\n    }\n}\n\n/*!\n * @internal\n * @brief Scrambles the accumulators after a large chunk has been read\n */\nXXH_FORCE_INLINE void\nXXH3_scrambleAcc_scalar(void* XXH_RESTRICT acc, const void* XXH_RESTRICT secret)\n{\n    size_t i;\n    for (i=0; i < XXH_ACC_NB; i++) {\n        XXH3_scalarScrambleRound(acc, secret, i);\n    }\n}\n\nXXH_FORCE_INLINE void\nXXH3_initCustomSecret_scalar(void* XXH_RESTRICT customSecret, xxh_u64 seed64)\n{\n    /*\n     * We need a separate pointer for the hack below,\n     * which requires a non-const pointer.\n     * Any decent compiler will optimize this out otherwise.\n     */\n    const xxh_u8* kSecretPtr = XXH3_kSecret;\n    XXH_STATIC_ASSERT((XXH_SECRET_DEFAULT_SIZE & 15) == 0);\n\n#if defined(__GNUC__) && defined(__aarch64__)\n    /*\n     * UGLY HACK:\n     * GCC and Clang generate a bunch of MOV/MOVK pairs for aarch64, and they are\n     * placed sequentially, in order, at the top of the unrolled loop.\n     *\n     * While MOVK is great for generating constants (2 cycles for a 64-bit\n     * constant compared to 4 cycles for LDR), it fights for bandwidth with\n     * the arithmetic instructions.\n     *\n     *   I   L   S\n     * MOVK\n     * MOVK\n     * MOVK\n     * MOVK\n     * ADD\n     * SUB      STR\n     *          STR\n     * By forcing loads from memory (as the asm line causes the compiler to assume\n     * that XXH3_kSecretPtr has been changed), the pipelines are used more\n     * efficiently:\n     *   I   L   S\n     *      LDR\n     *  ADD LDR\n     *  SUB     STR\n     *          STR\n     *\n     * See XXH3_NEON_LANES for details on the pipsline.\n     *\n     * XXH3_64bits_withSeed, len == 256, Snapdragon 835\n     *   without hack: 2654.4 MB/s\n     *   with hack:    3202.9 MB/s\n     */\n    XXH_COMPILER_GUARD(kSecretPtr);\n#endif\n    {   int const nbRounds = XXH_SECRET_DEFAULT_SIZE / 16;\n        int i;\n        for (i=0; i < nbRounds; i++) {\n            /*\n             * The asm hack causes the compiler to assume that kSecretPtr aliases with\n             * customSecret, and on aarch64, this prevented LDP from merging two\n             * loads together for free. Putting the loads together before the stores\n             * properly generates LDP.\n             */\n            xxh_u64 lo = XXH_readLE64(kSecretPtr + 16*i)     + seed64;\n            xxh_u64 hi = XXH_readLE64(kSecretPtr + 16*i + 8) - seed64;\n            XXH_writeLE64((xxh_u8*)customSecret + 16*i,     lo);\n            XXH_writeLE64((xxh_u8*)customSecret + 16*i + 8, hi);\n    }   }\n}\n\n\ntypedef void (*XXH3_f_accumulate)(xxh_u64* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, const xxh_u8* XXH_RESTRICT, size_t);\ntypedef void (*XXH3_f_scrambleAcc)(void* XXH_RESTRICT, const void*);\ntypedef void (*XXH3_f_initCustomSecret)(void* XXH_RESTRICT, xxh_u64);\n\n\n#if (XXH_VECTOR == XXH_AVX512)\n\n#define XXH3_accumulate_512 XXH3_accumulate_512_avx512\n#define XXH3_accumulate     XXH3_accumulate_avx512\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_avx512\n#define XXH3_initCustomSecret XXH3_initCustomSecret_avx512\n\n#elif (XXH_VECTOR == XXH_AVX2)\n\n#define XXH3_accumulate_512 XXH3_accumulate_512_avx2\n#define XXH3_accumulate     XXH3_accumulate_avx2\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_avx2\n#define XXH3_initCustomSecret XXH3_initCustomSecret_avx2\n\n#elif (XXH_VECTOR == XXH_SSE2)\n\n#define XXH3_accumulate_512 XXH3_accumulate_512_sse2\n#define XXH3_accumulate     XXH3_accumulate_sse2\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_sse2\n#define XXH3_initCustomSecret XXH3_initCustomSecret_sse2\n\n#elif (XXH_VECTOR == XXH_NEON)\n\n#define XXH3_accumulate_512 XXH3_accumulate_512_neon\n#define XXH3_accumulate     XXH3_accumulate_neon\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_neon\n#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar\n\n#elif (XXH_VECTOR == XXH_VSX)\n\n#define XXH3_accumulate_512 XXH3_accumulate_512_vsx\n#define XXH3_accumulate     XXH3_accumulate_vsx\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_vsx\n#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar\n\n#elif (XXH_VECTOR == XXH_SVE)\n#define XXH3_accumulate_512 XXH3_accumulate_512_sve\n#define XXH3_accumulate     XXH3_accumulate_sve\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_scalar\n#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar\n\n#else /* scalar */\n\n#define XXH3_accumulate_512 XXH3_accumulate_512_scalar\n#define XXH3_accumulate     XXH3_accumulate_scalar\n#define XXH3_scrambleAcc    XXH3_scrambleAcc_scalar\n#define XXH3_initCustomSecret XXH3_initCustomSecret_scalar\n\n#endif\n\n#if XXH_SIZE_OPT >= 1 /* don't do SIMD for initialization */\n#  undef XXH3_initCustomSecret\n#  define XXH3_initCustomSecret XXH3_initCustomSecret_scalar\n#endif\n\nXXH_FORCE_INLINE void\nXXH3_hashLong_internal_loop(xxh_u64* XXH_RESTRICT acc,\n                      const xxh_u8* XXH_RESTRICT input, size_t len,\n                      const xxh_u8* XXH_RESTRICT secret, size_t secretSize,\n                            XXH3_f_accumulate f_acc,\n                            XXH3_f_scrambleAcc f_scramble)\n{\n    size_t const nbStripesPerBlock = (secretSize - XXH_STRIPE_LEN) / XXH_SECRET_CONSUME_RATE;\n    size_t const block_len = XXH_STRIPE_LEN * nbStripesPerBlock;\n    size_t const nb_blocks = (len - 1) / block_len;\n\n    size_t n;\n\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);\n\n    for (n = 0; n < nb_blocks; n++) {\n        f_acc(acc, input + n*block_len, secret, nbStripesPerBlock);\n        f_scramble(acc, secret + secretSize - XXH_STRIPE_LEN);\n    }\n\n    /* last partial block */\n    XXH_ASSERT(len > XXH_STRIPE_LEN);\n    {   size_t const nbStripes = ((len - 1) - (block_len * nb_blocks)) / XXH_STRIPE_LEN;\n        XXH_ASSERT(nbStripes <= (secretSize / XXH_SECRET_CONSUME_RATE));\n        f_acc(acc, input + nb_blocks*block_len, secret, nbStripes);\n\n        /* last stripe */\n        {   const xxh_u8* const p = input + len - XXH_STRIPE_LEN;\n#define XXH_SECRET_LASTACC_START 7  /* not aligned on 8, last secret is different from acc & scrambler */\n            XXH3_accumulate_512(acc, p, secret + secretSize - XXH_STRIPE_LEN - XXH_SECRET_LASTACC_START);\n    }   }\n}\n\nXXH_FORCE_INLINE xxh_u64\nXXH3_mix2Accs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret)\n{\n    return XXH3_mul128_fold64(\n               acc[0] ^ XXH_readLE64(secret),\n               acc[1] ^ XXH_readLE64(secret+8) );\n}\n\nstatic XXH64_hash_t\nXXH3_mergeAccs(const xxh_u64* XXH_RESTRICT acc, const xxh_u8* XXH_RESTRICT secret, xxh_u64 start)\n{\n    xxh_u64 result64 = start;\n    size_t i = 0;\n\n    for (i = 0; i < 4; i++) {\n        result64 += XXH3_mix2Accs(acc+2*i, secret + 16*i);\n#if defined(__clang__)                                /* Clang */ \\\n    && (defined(__arm__) || defined(__thumb__))       /* ARMv7 */ \\\n    && (defined(__ARM_NEON) || defined(__ARM_NEON__)) /* NEON */  \\\n    && !defined(XXH_ENABLE_AUTOVECTORIZE)             /* Define to disable */\n        /*\n         * UGLY HACK:\n         * Prevent autovectorization on Clang ARMv7-a. Exact same problem as\n         * the one in XXH3_len_129to240_64b. Speeds up shorter keys > 240b.\n         * XXH3_64bits, len == 256, Snapdragon 835:\n         *   without hack: 2063.7 MB/s\n         *   with hack:    2560.7 MB/s\n         */\n        XXH_COMPILER_GUARD(result64);\n#endif\n    }\n\n    return XXH3_avalanche(result64);\n}\n\n#define XXH3_INIT_ACC { XXH_PRIME32_3, XXH_PRIME64_1, XXH_PRIME64_2, XXH_PRIME64_3, \\\n                        XXH_PRIME64_4, XXH_PRIME32_2, XXH_PRIME64_5, XXH_PRIME32_1 }\n\nXXH_FORCE_INLINE XXH64_hash_t\nXXH3_hashLong_64b_internal(const void* XXH_RESTRICT input, size_t len,\n                           const void* XXH_RESTRICT secret, size_t secretSize,\n                           XXH3_f_accumulate f_acc,\n                           XXH3_f_scrambleAcc f_scramble)\n{\n    XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC;\n\n    XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, (const xxh_u8*)secret, secretSize, f_acc, f_scramble);\n\n    /* converge into final hash */\n    XXH_STATIC_ASSERT(sizeof(acc) == 64);\n    /* do not align on 8, so that the secret is different from the accumulator */\n#define XXH_SECRET_MERGEACCS_START 11\n    XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START);\n    return XXH3_mergeAccs(acc, (const xxh_u8*)secret + XXH_SECRET_MERGEACCS_START, (xxh_u64)len * XXH_PRIME64_1);\n}\n\n/*\n * It's important for performance to transmit secret's size (when it's static)\n * so that the compiler can properly optimize the vectorized loop.\n * This makes a big performance difference for \"medium\" keys (<1 KB) when using AVX instruction set.\n * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE\n * breaks -Og, this is XXH_NO_INLINE.\n */\nXXH3_WITH_SECRET_INLINE XXH64_hash_t\nXXH3_hashLong_64b_withSecret(const void* XXH_RESTRICT input, size_t len,\n                             XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)\n{\n    (void)seed64;\n    return XXH3_hashLong_64b_internal(input, len, secret, secretLen, XXH3_accumulate, XXH3_scrambleAcc);\n}\n\n/*\n * It's preferable for performance that XXH3_hashLong is not inlined,\n * as it results in a smaller function for small data, easier to the instruction cache.\n * Note that inside this no_inline function, we do inline the internal loop,\n * and provide a statically defined secret size to allow optimization of vector loop.\n */\nXXH_NO_INLINE XXH_PUREF XXH64_hash_t\nXXH3_hashLong_64b_default(const void* XXH_RESTRICT input, size_t len,\n                          XXH64_hash_t seed64, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)\n{\n    (void)seed64; (void)secret; (void)secretLen;\n    return XXH3_hashLong_64b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_accumulate, XXH3_scrambleAcc);\n}\n\n/*\n * XXH3_hashLong_64b_withSeed():\n * Generate a custom key based on alteration of default XXH3_kSecret with the seed,\n * and then use this key for long mode hashing.\n *\n * This operation is decently fast but nonetheless costs a little bit of time.\n * Try to avoid it whenever possible (typically when seed==0).\n *\n * It's important for performance that XXH3_hashLong is not inlined. Not sure\n * why (uop cache maybe?), but the difference is large and easily measurable.\n */\nXXH_FORCE_INLINE XXH64_hash_t\nXXH3_hashLong_64b_withSeed_internal(const void* input, size_t len,\n                                    XXH64_hash_t seed,\n                                    XXH3_f_accumulate f_acc,\n                                    XXH3_f_scrambleAcc f_scramble,\n                                    XXH3_f_initCustomSecret f_initSec)\n{\n#if XXH_SIZE_OPT <= 0\n    if (seed == 0)\n        return XXH3_hashLong_64b_internal(input, len,\n                                          XXH3_kSecret, sizeof(XXH3_kSecret),\n                                          f_acc, f_scramble);\n#endif\n    {   XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];\n        f_initSec(secret, seed);\n        return XXH3_hashLong_64b_internal(input, len, secret, sizeof(secret),\n                                          f_acc, f_scramble);\n    }\n}\n\n/*\n * It's important for performance that XXH3_hashLong is not inlined.\n */\nXXH_NO_INLINE XXH64_hash_t\nXXH3_hashLong_64b_withSeed(const void* XXH_RESTRICT input, size_t len,\n                           XXH64_hash_t seed, const xxh_u8* XXH_RESTRICT secret, size_t secretLen)\n{\n    (void)secret; (void)secretLen;\n    return XXH3_hashLong_64b_withSeed_internal(input, len, seed,\n                XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret);\n}\n\n\ntypedef XXH64_hash_t (*XXH3_hashLong64_f)(const void* XXH_RESTRICT, size_t,\n                                          XXH64_hash_t, const xxh_u8* XXH_RESTRICT, size_t);\n\nXXH_FORCE_INLINE XXH64_hash_t\nXXH3_64bits_internal(const void* XXH_RESTRICT input, size_t len,\n                     XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen,\n                     XXH3_hashLong64_f f_hashLong)\n{\n    XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN);\n    /*\n     * If an action is to be taken if `secretLen` condition is not respected,\n     * it should be done here.\n     * For now, it's a contract pre-condition.\n     * Adding a check and a branch here would cost performance at every hash.\n     * Also, note that function signature doesn't offer room to return an error.\n     */\n    if (len <= 16)\n        return XXH3_len_0to16_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64);\n    if (len <= 128)\n        return XXH3_len_17to128_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);\n    if (len <= XXH3_MIDSIZE_MAX)\n        return XXH3_len_129to240_64b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);\n    return f_hashLong(input, len, seed64, (const xxh_u8*)secret, secretLen);\n}\n\n\n/* ===   Public entry point   === */\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH64_hash_t XXH3_64bits(XXH_NOESCAPE const void* input, size_t length)\n{\n    return XXH3_64bits_internal(input, length, 0, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_default);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH64_hash_t\nXXH3_64bits_withSecret(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize)\n{\n    return XXH3_64bits_internal(input, length, 0, secret, secretSize, XXH3_hashLong_64b_withSecret);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH64_hash_t\nXXH3_64bits_withSeed(XXH_NOESCAPE const void* input, size_t length, XXH64_hash_t seed)\n{\n    return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), XXH3_hashLong_64b_withSeed);\n}\n\nXXH_PUBLIC_API XXH64_hash_t\nXXH3_64bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t length, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed)\n{\n    if (length <= XXH3_MIDSIZE_MAX)\n        return XXH3_64bits_internal(input, length, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL);\n    return XXH3_hashLong_64b_withSecret(input, length, seed, (const xxh_u8*)secret, secretSize);\n}\n\n\n/* ===   XXH3 streaming   === */\n#ifndef XXH_NO_STREAM\n/*\n * Malloc's a pointer that is always aligned to align.\n *\n * This must be freed with `XXH_alignedFree()`.\n *\n * malloc typically guarantees 16 byte alignment on 64-bit systems and 8 byte\n * alignment on 32-bit. This isn't enough for the 32 byte aligned loads in AVX2\n * or on 32-bit, the 16 byte aligned loads in SSE2 and NEON.\n *\n * This underalignment previously caused a rather obvious crash which went\n * completely unnoticed due to XXH3_createState() not actually being tested.\n * Credit to RedSpah for noticing this bug.\n *\n * The alignment is done manually: Functions like posix_memalign or _mm_malloc\n * are avoided: To maintain portability, we would have to write a fallback\n * like this anyways, and besides, testing for the existence of library\n * functions without relying on external build tools is impossible.\n *\n * The method is simple: Overallocate, manually align, and store the offset\n * to the original behind the returned pointer.\n *\n * Align must be a power of 2 and 8 <= align <= 128.\n */\nstatic XXH_MALLOCF void* XXH_alignedMalloc(size_t s, size_t align)\n{\n    XXH_ASSERT(align <= 128 && align >= 8); /* range check */\n    XXH_ASSERT((align & (align-1)) == 0);   /* power of 2 */\n    XXH_ASSERT(s != 0 && s < (s + align));  /* empty/overflow */\n    {   /* Overallocate to make room for manual realignment and an offset byte */\n        xxh_u8* base = (xxh_u8*)XXH_malloc(s + align);\n        if (base != NULL) {\n            /*\n             * Get the offset needed to align this pointer.\n             *\n             * Even if the returned pointer is aligned, there will always be\n             * at least one byte to store the offset to the original pointer.\n             */\n            size_t offset = align - ((size_t)base & (align - 1)); /* base % align */\n            /* Add the offset for the now-aligned pointer */\n            xxh_u8* ptr = base + offset;\n\n            XXH_ASSERT((size_t)ptr % align == 0);\n\n            /* Store the offset immediately before the returned pointer. */\n            ptr[-1] = (xxh_u8)offset;\n            return ptr;\n        }\n        return NULL;\n    }\n}\n/*\n * Frees an aligned pointer allocated by XXH_alignedMalloc(). Don't pass\n * normal malloc'd pointers, XXH_alignedMalloc has a specific data layout.\n */\nstatic void XXH_alignedFree(void* p)\n{\n    if (p != NULL) {\n        xxh_u8* ptr = (xxh_u8*)p;\n        /* Get the offset byte we added in XXH_malloc. */\n        xxh_u8 offset = ptr[-1];\n        /* Free the original malloc'd pointer */\n        xxh_u8* base = ptr - offset;\n        XXH_free(base);\n    }\n}\n/*! @ingroup XXH3_family */\n/*!\n * @brief Allocate an @ref XXH3_state_t.\n *\n * Must be freed with XXH3_freeState().\n * @return An allocated XXH3_state_t on success, `NULL` on failure.\n */\nXXH_PUBLIC_API XXH3_state_t* XXH3_createState(void)\n{\n    XXH3_state_t* const state = (XXH3_state_t*)XXH_alignedMalloc(sizeof(XXH3_state_t), 64);\n    if (state==NULL) return NULL;\n    XXH3_INITSTATE(state);\n    return state;\n}\n\n/*! @ingroup XXH3_family */\n/*!\n * @brief Frees an @ref XXH3_state_t.\n *\n * Must be allocated with XXH3_createState().\n * @param statePtr A pointer to an @ref XXH3_state_t allocated with @ref XXH3_createState().\n * @return XXH_OK.\n */\nXXH_PUBLIC_API XXH_errorcode XXH3_freeState(XXH3_state_t* statePtr)\n{\n    XXH_alignedFree(statePtr);\n    return XXH_OK;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API void\nXXH3_copyState(XXH_NOESCAPE XXH3_state_t* dst_state, XXH_NOESCAPE const XXH3_state_t* src_state)\n{\n    XXH_memcpy(dst_state, src_state, sizeof(*dst_state));\n}\n\nstatic void\nXXH3_reset_internal(XXH3_state_t* statePtr,\n                    XXH64_hash_t seed,\n                    const void* secret, size_t secretSize)\n{\n    size_t const initStart = offsetof(XXH3_state_t, bufferedSize);\n    size_t const initLength = offsetof(XXH3_state_t, nbStripesPerBlock) - initStart;\n    XXH_ASSERT(offsetof(XXH3_state_t, nbStripesPerBlock) > initStart);\n    XXH_ASSERT(statePtr != NULL);\n    /* set members from bufferedSize to nbStripesPerBlock (excluded) to 0 */\n    memset((char*)statePtr + initStart, 0, initLength);\n    statePtr->acc[0] = XXH_PRIME32_3;\n    statePtr->acc[1] = XXH_PRIME64_1;\n    statePtr->acc[2] = XXH_PRIME64_2;\n    statePtr->acc[3] = XXH_PRIME64_3;\n    statePtr->acc[4] = XXH_PRIME64_4;\n    statePtr->acc[5] = XXH_PRIME32_2;\n    statePtr->acc[6] = XXH_PRIME64_5;\n    statePtr->acc[7] = XXH_PRIME32_1;\n    statePtr->seed = seed;\n    statePtr->useSeed = (seed != 0);\n    statePtr->extSecret = (const unsigned char*)secret;\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);\n    statePtr->secretLimit = secretSize - XXH_STRIPE_LEN;\n    statePtr->nbStripesPerBlock = statePtr->secretLimit / XXH_SECRET_CONSUME_RATE;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_64bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr)\n{\n    if (statePtr == NULL) return XXH_ERROR;\n    XXH3_reset_internal(statePtr, 0, XXH3_kSecret, XXH_SECRET_DEFAULT_SIZE);\n    return XXH_OK;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_64bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize)\n{\n    if (statePtr == NULL) return XXH_ERROR;\n    XXH3_reset_internal(statePtr, 0, secret, secretSize);\n    if (secret == NULL) return XXH_ERROR;\n    if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR;\n    return XXH_OK;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_64bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed)\n{\n    if (statePtr == NULL) return XXH_ERROR;\n    if (seed==0) return XXH3_64bits_reset(statePtr);\n    if ((seed != statePtr->seed) || (statePtr->extSecret != NULL))\n        XXH3_initCustomSecret(statePtr->customSecret, seed);\n    XXH3_reset_internal(statePtr, seed, NULL, XXH_SECRET_DEFAULT_SIZE);\n    return XXH_OK;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_64bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed64)\n{\n    if (statePtr == NULL) return XXH_ERROR;\n    if (secret == NULL) return XXH_ERROR;\n    if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR;\n    XXH3_reset_internal(statePtr, seed64, secret, secretSize);\n    statePtr->useSeed = 1; /* always, even if seed64==0 */\n    return XXH_OK;\n}\n\n/*!\n * @internal\n * @brief Processes a large input for XXH3_update() and XXH3_digest_long().\n *\n * Unlike XXH3_hashLong_internal_loop(), this can process data that overlaps a block.\n *\n * @param acc                Pointer to the 8 accumulator lanes\n * @param nbStripesSoFarPtr  In/out pointer to the number of leftover stripes in the block*\n * @param nbStripesPerBlock  Number of stripes in a block\n * @param input              Input pointer\n * @param nbStripes          Number of stripes to process\n * @param secret             Secret pointer\n * @param secretLimit        Offset of the last block in @p secret\n * @param f_acc              Pointer to an XXH3_accumulate implementation\n * @param f_scramble         Pointer to an XXH3_scrambleAcc implementation\n * @return                   Pointer past the end of @p input after processing\n */\nXXH_FORCE_INLINE const xxh_u8 *\nXXH3_consumeStripes(xxh_u64* XXH_RESTRICT acc,\n                    size_t* XXH_RESTRICT nbStripesSoFarPtr, size_t nbStripesPerBlock,\n                    const xxh_u8* XXH_RESTRICT input, size_t nbStripes,\n                    const xxh_u8* XXH_RESTRICT secret, size_t secretLimit,\n                    XXH3_f_accumulate f_acc,\n                    XXH3_f_scrambleAcc f_scramble)\n{\n    const xxh_u8* initialSecret = secret + *nbStripesSoFarPtr * XXH_SECRET_CONSUME_RATE;\n    /* Process full blocks */\n    if (nbStripes >= (nbStripesPerBlock - *nbStripesSoFarPtr)) {\n        /* Process the initial partial block... */\n        size_t nbStripesThisIter = nbStripesPerBlock - *nbStripesSoFarPtr;\n\n        do {\n            /* Accumulate and scramble */\n            f_acc(acc, input, initialSecret, nbStripesThisIter);\n            f_scramble(acc, secret + secretLimit);\n            input += nbStripesThisIter * XXH_STRIPE_LEN;\n            nbStripes -= nbStripesThisIter;\n            /* Then continue the loop with the full block size */\n            nbStripesThisIter = nbStripesPerBlock;\n            initialSecret = secret;\n        } while (nbStripes >= nbStripesPerBlock);\n        *nbStripesSoFarPtr = 0;\n    }\n    /* Process a partial block */\n    if (nbStripes > 0) {\n        f_acc(acc, input, initialSecret, nbStripes);\n        input += nbStripes * XXH_STRIPE_LEN;\n        *nbStripesSoFarPtr += nbStripes;\n    }\n    /* Return end pointer */\n    return input;\n}\n\n#ifndef XXH3_STREAM_USE_STACK\n# if XXH_SIZE_OPT <= 0 && !defined(__clang__) /* clang doesn't need additional stack space */\n#   define XXH3_STREAM_USE_STACK 1\n# endif\n#endif\n/*\n * Both XXH3_64bits_update and XXH3_128bits_update use this routine.\n */\nXXH_FORCE_INLINE XXH_errorcode\nXXH3_update(XXH3_state_t* XXH_RESTRICT const state,\n            const xxh_u8* XXH_RESTRICT input, size_t len,\n            XXH3_f_accumulate f_acc,\n            XXH3_f_scrambleAcc f_scramble)\n{\n    if (input==NULL) {\n        XXH_ASSERT(len == 0);\n        return XXH_OK;\n    }\n\n    XXH_ASSERT(state != NULL);\n    {   const xxh_u8* const bEnd = input + len;\n        const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;\n#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1\n        /* For some reason, gcc and MSVC seem to suffer greatly\n         * when operating accumulators directly into state.\n         * Operating into stack space seems to enable proper optimization.\n         * clang, on the other hand, doesn't seem to need this trick */\n        XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[8];\n        XXH_memcpy(acc, state->acc, sizeof(acc));\n#else\n        xxh_u64* XXH_RESTRICT const acc = state->acc;\n#endif\n        state->totalLen += len;\n        XXH_ASSERT(state->bufferedSize <= XXH3_INTERNALBUFFER_SIZE);\n\n        /* small input : just fill in tmp buffer */\n        if (len <= XXH3_INTERNALBUFFER_SIZE - state->bufferedSize) {\n            XXH_memcpy(state->buffer + state->bufferedSize, input, len);\n            state->bufferedSize += (XXH32_hash_t)len;\n            return XXH_OK;\n        }\n\n        /* total input is now > XXH3_INTERNALBUFFER_SIZE */\n        #define XXH3_INTERNALBUFFER_STRIPES (XXH3_INTERNALBUFFER_SIZE / XXH_STRIPE_LEN)\n        XXH_STATIC_ASSERT(XXH3_INTERNALBUFFER_SIZE % XXH_STRIPE_LEN == 0);   /* clean multiple */\n\n        /*\n         * Internal buffer is partially filled (always, except at beginning)\n         * Complete it, then consume it.\n         */\n        if (state->bufferedSize) {\n            size_t const loadSize = XXH3_INTERNALBUFFER_SIZE - state->bufferedSize;\n            XXH_memcpy(state->buffer + state->bufferedSize, input, loadSize);\n            input += loadSize;\n            XXH3_consumeStripes(acc,\n                               &state->nbStripesSoFar, state->nbStripesPerBlock,\n                                state->buffer, XXH3_INTERNALBUFFER_STRIPES,\n                                secret, state->secretLimit,\n                                f_acc, f_scramble);\n            state->bufferedSize = 0;\n        }\n        XXH_ASSERT(input < bEnd);\n        if (bEnd - input > XXH3_INTERNALBUFFER_SIZE) {\n            size_t nbStripes = (size_t)(bEnd - 1 - input) / XXH_STRIPE_LEN;\n            input = XXH3_consumeStripes(acc,\n                                       &state->nbStripesSoFar, state->nbStripesPerBlock,\n                                       input, nbStripes,\n                                       secret, state->secretLimit,\n                                       f_acc, f_scramble);\n            XXH_memcpy(state->buffer + sizeof(state->buffer) - XXH_STRIPE_LEN, input - XXH_STRIPE_LEN, XXH_STRIPE_LEN);\n\n        }\n        /* Some remaining input (always) : buffer it */\n        XXH_ASSERT(input < bEnd);\n        XXH_ASSERT(bEnd - input <= XXH3_INTERNALBUFFER_SIZE);\n        XXH_ASSERT(state->bufferedSize == 0);\n        XXH_memcpy(state->buffer, input, (size_t)(bEnd-input));\n        state->bufferedSize = (XXH32_hash_t)(bEnd-input);\n#if defined(XXH3_STREAM_USE_STACK) && XXH3_STREAM_USE_STACK >= 1\n        /* save stack accumulators into state */\n        XXH_memcpy(state->acc, acc, sizeof(acc));\n#endif\n    }\n\n    return XXH_OK;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_64bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len)\n{\n    return XXH3_update(state, (const xxh_u8*)input, len,\n                       XXH3_accumulate, XXH3_scrambleAcc);\n}\n\n\nXXH_FORCE_INLINE void\nXXH3_digest_long (XXH64_hash_t* acc,\n                  const XXH3_state_t* state,\n                  const unsigned char* secret)\n{\n    xxh_u8 lastStripe[XXH_STRIPE_LEN];\n    const xxh_u8* lastStripePtr;\n\n    /*\n     * Digest on a local copy. This way, the state remains unaltered, and it can\n     * continue ingesting more input afterwards.\n     */\n    XXH_memcpy(acc, state->acc, sizeof(state->acc));\n    if (state->bufferedSize >= XXH_STRIPE_LEN) {\n        /* Consume remaining stripes then point to remaining data in buffer */\n        size_t const nbStripes = (state->bufferedSize - 1) / XXH_STRIPE_LEN;\n        size_t nbStripesSoFar = state->nbStripesSoFar;\n        XXH3_consumeStripes(acc,\n                           &nbStripesSoFar, state->nbStripesPerBlock,\n                            state->buffer, nbStripes,\n                            secret, state->secretLimit,\n                            XXH3_accumulate, XXH3_scrambleAcc);\n        lastStripePtr = state->buffer + state->bufferedSize - XXH_STRIPE_LEN;\n    } else {  /* bufferedSize < XXH_STRIPE_LEN */\n        /* Copy to temp buffer */\n        size_t const catchupSize = XXH_STRIPE_LEN - state->bufferedSize;\n        XXH_ASSERT(state->bufferedSize > 0);  /* there is always some input buffered */\n        XXH_memcpy(lastStripe, state->buffer + sizeof(state->buffer) - catchupSize, catchupSize);\n        XXH_memcpy(lastStripe + catchupSize, state->buffer, state->bufferedSize);\n        lastStripePtr = lastStripe;\n    }\n    /* Last stripe */\n    XXH3_accumulate_512(acc,\n                        lastStripePtr,\n                        secret + state->secretLimit - XXH_SECRET_LASTACC_START);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH64_hash_t XXH3_64bits_digest (XXH_NOESCAPE const XXH3_state_t* state)\n{\n    const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;\n    if (state->totalLen > XXH3_MIDSIZE_MAX) {\n        XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB];\n        XXH3_digest_long(acc, state, secret);\n        return XXH3_mergeAccs(acc,\n                              secret + XXH_SECRET_MERGEACCS_START,\n                              (xxh_u64)state->totalLen * XXH_PRIME64_1);\n    }\n    /* totalLen <= XXH3_MIDSIZE_MAX: digesting a short input */\n    if (state->useSeed)\n        return XXH3_64bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed);\n    return XXH3_64bits_withSecret(state->buffer, (size_t)(state->totalLen),\n                                  secret, state->secretLimit + XXH_STRIPE_LEN);\n}\n#endif /* !XXH_NO_STREAM */\n\n\n/* ==========================================\n * XXH3 128 bits (a.k.a XXH128)\n * ==========================================\n * XXH3's 128-bit variant has better mixing and strength than the 64-bit variant,\n * even without counting the significantly larger output size.\n *\n * For example, extra steps are taken to avoid the seed-dependent collisions\n * in 17-240 byte inputs (See XXH3_mix16B and XXH128_mix32B).\n *\n * This strength naturally comes at the cost of some speed, especially on short\n * lengths. Note that longer hashes are about as fast as the 64-bit version\n * due to it using only a slight modification of the 64-bit loop.\n *\n * XXH128 is also more oriented towards 64-bit machines. It is still extremely\n * fast for a _128-bit_ hash on 32-bit (it usually clears XXH64).\n */\n\nXXH_FORCE_INLINE XXH_PUREF XXH128_hash_t\nXXH3_len_1to3_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    /* A doubled version of 1to3_64b with different constants. */\n    XXH_ASSERT(input != NULL);\n    XXH_ASSERT(1 <= len && len <= 3);\n    XXH_ASSERT(secret != NULL);\n    /*\n     * len = 1: combinedl = { input[0], 0x01, input[0], input[0] }\n     * len = 2: combinedl = { input[1], 0x02, input[0], input[1] }\n     * len = 3: combinedl = { input[2], 0x03, input[0], input[1] }\n     */\n    {   xxh_u8 const c1 = input[0];\n        xxh_u8 const c2 = input[len >> 1];\n        xxh_u8 const c3 = input[len - 1];\n        xxh_u32 const combinedl = ((xxh_u32)c1 <<16) | ((xxh_u32)c2 << 24)\n                                | ((xxh_u32)c3 << 0) | ((xxh_u32)len << 8);\n        xxh_u32 const combinedh = XXH_rotl32(XXH_swap32(combinedl), 13);\n        xxh_u64 const bitflipl = (XXH_readLE32(secret) ^ XXH_readLE32(secret+4)) + seed;\n        xxh_u64 const bitfliph = (XXH_readLE32(secret+8) ^ XXH_readLE32(secret+12)) - seed;\n        xxh_u64 const keyed_lo = (xxh_u64)combinedl ^ bitflipl;\n        xxh_u64 const keyed_hi = (xxh_u64)combinedh ^ bitfliph;\n        XXH128_hash_t h128;\n        h128.low64  = XXH64_avalanche(keyed_lo);\n        h128.high64 = XXH64_avalanche(keyed_hi);\n        return h128;\n    }\n}\n\nXXH_FORCE_INLINE XXH_PUREF XXH128_hash_t\nXXH3_len_4to8_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(input != NULL);\n    XXH_ASSERT(secret != NULL);\n    XXH_ASSERT(4 <= len && len <= 8);\n    seed ^= (xxh_u64)XXH_swap32((xxh_u32)seed) << 32;\n    {   xxh_u32 const input_lo = XXH_readLE32(input);\n        xxh_u32 const input_hi = XXH_readLE32(input + len - 4);\n        xxh_u64 const input_64 = input_lo + ((xxh_u64)input_hi << 32);\n        xxh_u64 const bitflip = (XXH_readLE64(secret+16) ^ XXH_readLE64(secret+24)) + seed;\n        xxh_u64 const keyed = input_64 ^ bitflip;\n\n        /* Shift len to the left to ensure it is even, this avoids even multiplies. */\n        XXH128_hash_t m128 = XXH_mult64to128(keyed, XXH_PRIME64_1 + (len << 2));\n\n        m128.high64 += (m128.low64 << 1);\n        m128.low64  ^= (m128.high64 >> 3);\n\n        m128.low64   = XXH_xorshift64(m128.low64, 35);\n        m128.low64  *= PRIME_MX2;\n        m128.low64   = XXH_xorshift64(m128.low64, 28);\n        m128.high64  = XXH3_avalanche(m128.high64);\n        return m128;\n    }\n}\n\nXXH_FORCE_INLINE XXH_PUREF XXH128_hash_t\nXXH3_len_9to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(input != NULL);\n    XXH_ASSERT(secret != NULL);\n    XXH_ASSERT(9 <= len && len <= 16);\n    {   xxh_u64 const bitflipl = (XXH_readLE64(secret+32) ^ XXH_readLE64(secret+40)) - seed;\n        xxh_u64 const bitfliph = (XXH_readLE64(secret+48) ^ XXH_readLE64(secret+56)) + seed;\n        xxh_u64 const input_lo = XXH_readLE64(input);\n        xxh_u64       input_hi = XXH_readLE64(input + len - 8);\n        XXH128_hash_t m128 = XXH_mult64to128(input_lo ^ input_hi ^ bitflipl, XXH_PRIME64_1);\n        /*\n         * Put len in the middle of m128 to ensure that the length gets mixed to\n         * both the low and high bits in the 128x64 multiply below.\n         */\n        m128.low64 += (xxh_u64)(len - 1) << 54;\n        input_hi   ^= bitfliph;\n        /*\n         * Add the high 32 bits of input_hi to the high 32 bits of m128, then\n         * add the long product of the low 32 bits of input_hi and XXH_PRIME32_2 to\n         * the high 64 bits of m128.\n         *\n         * The best approach to this operation is different on 32-bit and 64-bit.\n         */\n        if (sizeof(void *) < sizeof(xxh_u64)) { /* 32-bit */\n            /*\n             * 32-bit optimized version, which is more readable.\n             *\n             * On 32-bit, it removes an ADC and delays a dependency between the two\n             * halves of m128.high64, but it generates an extra mask on 64-bit.\n             */\n            m128.high64 += (input_hi & 0xFFFFFFFF00000000ULL) + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2);\n        } else {\n            /*\n             * 64-bit optimized (albeit more confusing) version.\n             *\n             * Uses some properties of addition and multiplication to remove the mask:\n             *\n             * Let:\n             *    a = input_hi.lo = (input_hi & 0x00000000FFFFFFFF)\n             *    b = input_hi.hi = (input_hi & 0xFFFFFFFF00000000)\n             *    c = XXH_PRIME32_2\n             *\n             *    a + (b * c)\n             * Inverse Property: x + y - x == y\n             *    a + (b * (1 + c - 1))\n             * Distributive Property: x * (y + z) == (x * y) + (x * z)\n             *    a + (b * 1) + (b * (c - 1))\n             * Identity Property: x * 1 == x\n             *    a + b + (b * (c - 1))\n             *\n             * Substitute a, b, and c:\n             *    input_hi.hi + input_hi.lo + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1))\n             *\n             * Since input_hi.hi + input_hi.lo == input_hi, we get this:\n             *    input_hi + ((xxh_u64)input_hi.lo * (XXH_PRIME32_2 - 1))\n             */\n            m128.high64 += input_hi + XXH_mult32to64((xxh_u32)input_hi, XXH_PRIME32_2 - 1);\n        }\n        /* m128 ^= XXH_swap64(m128 >> 64); */\n        m128.low64  ^= XXH_swap64(m128.high64);\n\n        {   /* 128x64 multiply: h128 = m128 * XXH_PRIME64_2; */\n            XXH128_hash_t h128 = XXH_mult64to128(m128.low64, XXH_PRIME64_2);\n            h128.high64 += m128.high64 * XXH_PRIME64_2;\n\n            h128.low64   = XXH3_avalanche(h128.low64);\n            h128.high64  = XXH3_avalanche(h128.high64);\n            return h128;\n    }   }\n}\n\n/*\n * Assumption: `secret` size is >= XXH3_SECRET_SIZE_MIN\n */\nXXH_FORCE_INLINE XXH_PUREF XXH128_hash_t\nXXH3_len_0to16_128b(const xxh_u8* input, size_t len, const xxh_u8* secret, XXH64_hash_t seed)\n{\n    XXH_ASSERT(len <= 16);\n    {   if (len > 8) return XXH3_len_9to16_128b(input, len, secret, seed);\n        if (len >= 4) return XXH3_len_4to8_128b(input, len, secret, seed);\n        if (len) return XXH3_len_1to3_128b(input, len, secret, seed);\n        {   XXH128_hash_t h128;\n            xxh_u64 const bitflipl = XXH_readLE64(secret+64) ^ XXH_readLE64(secret+72);\n            xxh_u64 const bitfliph = XXH_readLE64(secret+80) ^ XXH_readLE64(secret+88);\n            h128.low64 = XXH64_avalanche(seed ^ bitflipl);\n            h128.high64 = XXH64_avalanche( seed ^ bitfliph);\n            return h128;\n    }   }\n}\n\n/*\n * A bit slower than XXH3_mix16B, but handles multiply by zero better.\n */\nXXH_FORCE_INLINE XXH128_hash_t\nXXH128_mix32B(XXH128_hash_t acc, const xxh_u8* input_1, const xxh_u8* input_2,\n              const xxh_u8* secret, XXH64_hash_t seed)\n{\n    acc.low64  += XXH3_mix16B (input_1, secret+0, seed);\n    acc.low64  ^= XXH_readLE64(input_2) + XXH_readLE64(input_2 + 8);\n    acc.high64 += XXH3_mix16B (input_2, secret+16, seed);\n    acc.high64 ^= XXH_readLE64(input_1) + XXH_readLE64(input_1 + 8);\n    return acc;\n}\n\n\nXXH_FORCE_INLINE XXH_PUREF XXH128_hash_t\nXXH3_len_17to128_128b(const xxh_u8* XXH_RESTRICT input, size_t len,\n                      const xxh_u8* XXH_RESTRICT secret, size_t secretSize,\n                      XXH64_hash_t seed)\n{\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;\n    XXH_ASSERT(16 < len && len <= 128);\n\n    {   XXH128_hash_t acc;\n        acc.low64 = len * XXH_PRIME64_1;\n        acc.high64 = 0;\n\n#if XXH_SIZE_OPT >= 1\n        {\n            /* Smaller, but slightly slower. */\n            unsigned int i = (unsigned int)(len - 1) / 32;\n            do {\n                acc = XXH128_mix32B(acc, input+16*i, input+len-16*(i+1), secret+32*i, seed);\n            } while (i-- != 0);\n        }\n#else\n        if (len > 32) {\n            if (len > 64) {\n                if (len > 96) {\n                    acc = XXH128_mix32B(acc, input+48, input+len-64, secret+96, seed);\n                }\n                acc = XXH128_mix32B(acc, input+32, input+len-48, secret+64, seed);\n            }\n            acc = XXH128_mix32B(acc, input+16, input+len-32, secret+32, seed);\n        }\n        acc = XXH128_mix32B(acc, input, input+len-16, secret, seed);\n#endif\n        {   XXH128_hash_t h128;\n            h128.low64  = acc.low64 + acc.high64;\n            h128.high64 = (acc.low64    * XXH_PRIME64_1)\n                        + (acc.high64   * XXH_PRIME64_4)\n                        + ((len - seed) * XXH_PRIME64_2);\n            h128.low64  = XXH3_avalanche(h128.low64);\n            h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64);\n            return h128;\n        }\n    }\n}\n\nXXH_NO_INLINE XXH_PUREF XXH128_hash_t\nXXH3_len_129to240_128b(const xxh_u8* XXH_RESTRICT input, size_t len,\n                       const xxh_u8* XXH_RESTRICT secret, size_t secretSize,\n                       XXH64_hash_t seed)\n{\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN); (void)secretSize;\n    XXH_ASSERT(128 < len && len <= XXH3_MIDSIZE_MAX);\n\n    {   XXH128_hash_t acc;\n        unsigned i;\n        acc.low64 = len * XXH_PRIME64_1;\n        acc.high64 = 0;\n        /*\n         *  We set as `i` as offset + 32. We do this so that unchanged\n         * `len` can be used as upper bound. This reaches a sweet spot\n         * where both x86 and aarch64 get simple agen and good codegen\n         * for the loop.\n         */\n        for (i = 32; i < 160; i += 32) {\n            acc = XXH128_mix32B(acc,\n                                input  + i - 32,\n                                input  + i - 16,\n                                secret + i - 32,\n                                seed);\n        }\n        acc.low64 = XXH3_avalanche(acc.low64);\n        acc.high64 = XXH3_avalanche(acc.high64);\n        /*\n         * NB: `i <= len` will duplicate the last 32-bytes if\n         * len % 32 was zero. This is an unfortunate necessity to keep\n         * the hash result stable.\n         */\n        for (i=160; i <= len; i += 32) {\n            acc = XXH128_mix32B(acc,\n                                input + i - 32,\n                                input + i - 16,\n                                secret + XXH3_MIDSIZE_STARTOFFSET + i - 160,\n                                seed);\n        }\n        /* last bytes */\n        acc = XXH128_mix32B(acc,\n                            input + len - 16,\n                            input + len - 32,\n                            secret + XXH3_SECRET_SIZE_MIN - XXH3_MIDSIZE_LASTOFFSET - 16,\n                            (XXH64_hash_t)0 - seed);\n\n        {   XXH128_hash_t h128;\n            h128.low64  = acc.low64 + acc.high64;\n            h128.high64 = (acc.low64    * XXH_PRIME64_1)\n                        + (acc.high64   * XXH_PRIME64_4)\n                        + ((len - seed) * XXH_PRIME64_2);\n            h128.low64  = XXH3_avalanche(h128.low64);\n            h128.high64 = (XXH64_hash_t)0 - XXH3_avalanche(h128.high64);\n            return h128;\n        }\n    }\n}\n\nXXH_FORCE_INLINE XXH128_hash_t\nXXH3_hashLong_128b_internal(const void* XXH_RESTRICT input, size_t len,\n                            const xxh_u8* XXH_RESTRICT secret, size_t secretSize,\n                            XXH3_f_accumulate f_acc,\n                            XXH3_f_scrambleAcc f_scramble)\n{\n    XXH_ALIGN(XXH_ACC_ALIGN) xxh_u64 acc[XXH_ACC_NB] = XXH3_INIT_ACC;\n\n    XXH3_hashLong_internal_loop(acc, (const xxh_u8*)input, len, secret, secretSize, f_acc, f_scramble);\n\n    /* converge into final hash */\n    XXH_STATIC_ASSERT(sizeof(acc) == 64);\n    XXH_ASSERT(secretSize >= sizeof(acc) + XXH_SECRET_MERGEACCS_START);\n    {   XXH128_hash_t h128;\n        h128.low64  = XXH3_mergeAccs(acc,\n                                     secret + XXH_SECRET_MERGEACCS_START,\n                                     (xxh_u64)len * XXH_PRIME64_1);\n        h128.high64 = XXH3_mergeAccs(acc,\n                                     secret + secretSize\n                                            - sizeof(acc) - XXH_SECRET_MERGEACCS_START,\n                                     ~((xxh_u64)len * XXH_PRIME64_2));\n        return h128;\n    }\n}\n\n/*\n * It's important for performance that XXH3_hashLong() is not inlined.\n */\nXXH_NO_INLINE XXH_PUREF XXH128_hash_t\nXXH3_hashLong_128b_default(const void* XXH_RESTRICT input, size_t len,\n                           XXH64_hash_t seed64,\n                           const void* XXH_RESTRICT secret, size_t secretLen)\n{\n    (void)seed64; (void)secret; (void)secretLen;\n    return XXH3_hashLong_128b_internal(input, len, XXH3_kSecret, sizeof(XXH3_kSecret),\n                                       XXH3_accumulate, XXH3_scrambleAcc);\n}\n\n/*\n * It's important for performance to pass @p secretLen (when it's static)\n * to the compiler, so that it can properly optimize the vectorized loop.\n *\n * When the secret size is unknown, or on GCC 12 where the mix of NO_INLINE and FORCE_INLINE\n * breaks -Og, this is XXH_NO_INLINE.\n */\nXXH3_WITH_SECRET_INLINE XXH128_hash_t\nXXH3_hashLong_128b_withSecret(const void* XXH_RESTRICT input, size_t len,\n                              XXH64_hash_t seed64,\n                              const void* XXH_RESTRICT secret, size_t secretLen)\n{\n    (void)seed64;\n    return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, secretLen,\n                                       XXH3_accumulate, XXH3_scrambleAcc);\n}\n\nXXH_FORCE_INLINE XXH128_hash_t\nXXH3_hashLong_128b_withSeed_internal(const void* XXH_RESTRICT input, size_t len,\n                                XXH64_hash_t seed64,\n                                XXH3_f_accumulate f_acc,\n                                XXH3_f_scrambleAcc f_scramble,\n                                XXH3_f_initCustomSecret f_initSec)\n{\n    if (seed64 == 0)\n        return XXH3_hashLong_128b_internal(input, len,\n                                           XXH3_kSecret, sizeof(XXH3_kSecret),\n                                           f_acc, f_scramble);\n    {   XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];\n        f_initSec(secret, seed64);\n        return XXH3_hashLong_128b_internal(input, len, (const xxh_u8*)secret, sizeof(secret),\n                                           f_acc, f_scramble);\n    }\n}\n\n/*\n * It's important for performance that XXH3_hashLong is not inlined.\n */\nXXH_NO_INLINE XXH128_hash_t\nXXH3_hashLong_128b_withSeed(const void* input, size_t len,\n                            XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen)\n{\n    (void)secret; (void)secretLen;\n    return XXH3_hashLong_128b_withSeed_internal(input, len, seed64,\n                XXH3_accumulate, XXH3_scrambleAcc, XXH3_initCustomSecret);\n}\n\ntypedef XXH128_hash_t (*XXH3_hashLong128_f)(const void* XXH_RESTRICT, size_t,\n                                            XXH64_hash_t, const void* XXH_RESTRICT, size_t);\n\nXXH_FORCE_INLINE XXH128_hash_t\nXXH3_128bits_internal(const void* input, size_t len,\n                      XXH64_hash_t seed64, const void* XXH_RESTRICT secret, size_t secretLen,\n                      XXH3_hashLong128_f f_hl128)\n{\n    XXH_ASSERT(secretLen >= XXH3_SECRET_SIZE_MIN);\n    /*\n     * If an action is to be taken if `secret` conditions are not respected,\n     * it should be done here.\n     * For now, it's a contract pre-condition.\n     * Adding a check and a branch here would cost performance at every hash.\n     */\n    if (len <= 16)\n        return XXH3_len_0to16_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, seed64);\n    if (len <= 128)\n        return XXH3_len_17to128_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);\n    if (len <= XXH3_MIDSIZE_MAX)\n        return XXH3_len_129to240_128b((const xxh_u8*)input, len, (const xxh_u8*)secret, secretLen, seed64);\n    return f_hl128(input, len, seed64, secret, secretLen);\n}\n\n\n/* ===   Public XXH128 API   === */\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t XXH3_128bits(XXH_NOESCAPE const void* input, size_t len)\n{\n    return XXH3_128bits_internal(input, len, 0,\n                                 XXH3_kSecret, sizeof(XXH3_kSecret),\n                                 XXH3_hashLong_128b_default);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t\nXXH3_128bits_withSecret(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize)\n{\n    return XXH3_128bits_internal(input, len, 0,\n                                 (const xxh_u8*)secret, secretSize,\n                                 XXH3_hashLong_128b_withSecret);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t\nXXH3_128bits_withSeed(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)\n{\n    return XXH3_128bits_internal(input, len, seed,\n                                 XXH3_kSecret, sizeof(XXH3_kSecret),\n                                 XXH3_hashLong_128b_withSeed);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t\nXXH3_128bits_withSecretandSeed(XXH_NOESCAPE const void* input, size_t len, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed)\n{\n    if (len <= XXH3_MIDSIZE_MAX)\n        return XXH3_128bits_internal(input, len, seed, XXH3_kSecret, sizeof(XXH3_kSecret), NULL);\n    return XXH3_hashLong_128b_withSecret(input, len, seed, secret, secretSize);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t\nXXH128(XXH_NOESCAPE const void* input, size_t len, XXH64_hash_t seed)\n{\n    return XXH3_128bits_withSeed(input, len, seed);\n}\n\n\n/* ===   XXH3 128-bit streaming   === */\n#ifndef XXH_NO_STREAM\n/*\n * All initialization and update functions are identical to 64-bit streaming variant.\n * The only difference is the finalization routine.\n */\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_128bits_reset(XXH_NOESCAPE XXH3_state_t* statePtr)\n{\n    return XXH3_64bits_reset(statePtr);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_128bits_reset_withSecret(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize)\n{\n    return XXH3_64bits_reset_withSecret(statePtr, secret, secretSize);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_128bits_reset_withSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH64_hash_t seed)\n{\n    return XXH3_64bits_reset_withSeed(statePtr, seed);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_128bits_reset_withSecretandSeed(XXH_NOESCAPE XXH3_state_t* statePtr, XXH_NOESCAPE const void* secret, size_t secretSize, XXH64_hash_t seed)\n{\n    return XXH3_64bits_reset_withSecretandSeed(statePtr, secret, secretSize, seed);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_128bits_update(XXH_NOESCAPE XXH3_state_t* state, XXH_NOESCAPE const void* input, size_t len)\n{\n    return XXH3_64bits_update(state, input, len);\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t XXH3_128bits_digest (XXH_NOESCAPE const XXH3_state_t* state)\n{\n    const unsigned char* const secret = (state->extSecret == NULL) ? state->customSecret : state->extSecret;\n    if (state->totalLen > XXH3_MIDSIZE_MAX) {\n        XXH_ALIGN(XXH_ACC_ALIGN) XXH64_hash_t acc[XXH_ACC_NB];\n        XXH3_digest_long(acc, state, secret);\n        XXH_ASSERT(state->secretLimit + XXH_STRIPE_LEN >= sizeof(acc) + XXH_SECRET_MERGEACCS_START);\n        {   XXH128_hash_t h128;\n            h128.low64  = XXH3_mergeAccs(acc,\n                                         secret + XXH_SECRET_MERGEACCS_START,\n                                         (xxh_u64)state->totalLen * XXH_PRIME64_1);\n            h128.high64 = XXH3_mergeAccs(acc,\n                                         secret + state->secretLimit + XXH_STRIPE_LEN\n                                                - sizeof(acc) - XXH_SECRET_MERGEACCS_START,\n                                         ~((xxh_u64)state->totalLen * XXH_PRIME64_2));\n            return h128;\n        }\n    }\n    /* len <= XXH3_MIDSIZE_MAX : short code */\n    if (state->seed)\n        return XXH3_128bits_withSeed(state->buffer, (size_t)state->totalLen, state->seed);\n    return XXH3_128bits_withSecret(state->buffer, (size_t)(state->totalLen),\n                                   secret, state->secretLimit + XXH_STRIPE_LEN);\n}\n#endif /* !XXH_NO_STREAM */\n/* 128-bit utility functions */\n\n#include <string.h>   /* memcmp, memcpy */\n\n/* return : 1 is equal, 0 if different */\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API int XXH128_isEqual(XXH128_hash_t h1, XXH128_hash_t h2)\n{\n    /* note : XXH128_hash_t is compact, it has no padding byte */\n    return !(memcmp(&h1, &h2, sizeof(h1)));\n}\n\n/* This prototype is compatible with stdlib's qsort().\n * @return : >0 if *h128_1  > *h128_2\n *           <0 if *h128_1  < *h128_2\n *           =0 if *h128_1 == *h128_2  */\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API int XXH128_cmp(XXH_NOESCAPE const void* h128_1, XXH_NOESCAPE const void* h128_2)\n{\n    XXH128_hash_t const h1 = *(const XXH128_hash_t*)h128_1;\n    XXH128_hash_t const h2 = *(const XXH128_hash_t*)h128_2;\n    int const hcmp = (h1.high64 > h2.high64) - (h2.high64 > h1.high64);\n    /* note : bets that, in most cases, hash values are different */\n    if (hcmp) return hcmp;\n    return (h1.low64 > h2.low64) - (h2.low64 > h1.low64);\n}\n\n\n/*======   Canonical representation   ======*/\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API void\nXXH128_canonicalFromHash(XXH_NOESCAPE XXH128_canonical_t* dst, XXH128_hash_t hash)\n{\n    XXH_STATIC_ASSERT(sizeof(XXH128_canonical_t) == sizeof(XXH128_hash_t));\n    if (XXH_CPU_LITTLE_ENDIAN) {\n        hash.high64 = XXH_swap64(hash.high64);\n        hash.low64  = XXH_swap64(hash.low64);\n    }\n    XXH_memcpy(dst, &hash.high64, sizeof(hash.high64));\n    XXH_memcpy((char*)dst + sizeof(hash.high64), &hash.low64, sizeof(hash.low64));\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH128_hash_t\nXXH128_hashFromCanonical(XXH_NOESCAPE const XXH128_canonical_t* src)\n{\n    XXH128_hash_t h;\n    h.high64 = XXH_readBE64(src);\n    h.low64  = XXH_readBE64(src->digest + 8);\n    return h;\n}\n\n\n\n/* ==========================================\n * Secret generators\n * ==========================================\n */\n#define XXH_MIN(x, y) (((x) > (y)) ? (y) : (x))\n\nXXH_FORCE_INLINE void XXH3_combine16(void* dst, XXH128_hash_t h128)\n{\n    XXH_writeLE64( dst, XXH_readLE64(dst) ^ h128.low64 );\n    XXH_writeLE64( (char*)dst+8, XXH_readLE64((char*)dst+8) ^ h128.high64 );\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API XXH_errorcode\nXXH3_generateSecret(XXH_NOESCAPE void* secretBuffer, size_t secretSize, XXH_NOESCAPE const void* customSeed, size_t customSeedSize)\n{\n#if (XXH_DEBUGLEVEL >= 1)\n    XXH_ASSERT(secretBuffer != NULL);\n    XXH_ASSERT(secretSize >= XXH3_SECRET_SIZE_MIN);\n#else\n    /* production mode, assert() are disabled */\n    if (secretBuffer == NULL) return XXH_ERROR;\n    if (secretSize < XXH3_SECRET_SIZE_MIN) return XXH_ERROR;\n#endif\n\n    if (customSeedSize == 0) {\n        customSeed = XXH3_kSecret;\n        customSeedSize = XXH_SECRET_DEFAULT_SIZE;\n    }\n#if (XXH_DEBUGLEVEL >= 1)\n    XXH_ASSERT(customSeed != NULL);\n#else\n    if (customSeed == NULL) return XXH_ERROR;\n#endif\n\n    /* Fill secretBuffer with a copy of customSeed - repeat as needed */\n    {   size_t pos = 0;\n        while (pos < secretSize) {\n            size_t const toCopy = XXH_MIN((secretSize - pos), customSeedSize);\n            memcpy((char*)secretBuffer + pos, customSeed, toCopy);\n            pos += toCopy;\n    }   }\n\n    {   size_t const nbSeg16 = secretSize / 16;\n        size_t n;\n        XXH128_canonical_t scrambler;\n        XXH128_canonicalFromHash(&scrambler, XXH128(customSeed, customSeedSize, 0));\n        for (n=0; n<nbSeg16; n++) {\n            XXH128_hash_t const h128 = XXH128(&scrambler, sizeof(scrambler), n);\n            XXH3_combine16((char*)secretBuffer + n*16, h128);\n        }\n        /* last segment */\n        XXH3_combine16((char*)secretBuffer + secretSize - 16, XXH128_hashFromCanonical(&scrambler));\n    }\n    return XXH_OK;\n}\n\n/*! @ingroup XXH3_family */\nXXH_PUBLIC_API void\nXXH3_generateSecret_fromSeed(XXH_NOESCAPE void* secretBuffer, XXH64_hash_t seed)\n{\n    XXH_ALIGN(XXH_SEC_ALIGN) xxh_u8 secret[XXH_SECRET_DEFAULT_SIZE];\n    XXH3_initCustomSecret(secret, seed);\n    XXH_ASSERT(secretBuffer != NULL);\n    memcpy(secretBuffer, secret, XXH_SECRET_DEFAULT_SIZE);\n}\n\n\n\n/* Pop our optimization override from above */\n#if XXH_VECTOR == XXH_AVX2 /* AVX2 */ \\\n  && defined(__GNUC__) && !defined(__clang__) /* GCC, not Clang */ \\\n  && defined(__OPTIMIZE__) && XXH_SIZE_OPT <= 0 /* respect -O0 and -Os */\n#  pragma GCC pop_options\n#endif\n\n#endif  /* XXH_NO_LONG_LONG */\n\n#endif  /* XXH_NO_XXH3 */\n\n/*!\n * @}\n */\n#endif  /* XXH_IMPLEMENTATION */\n\n\n#if defined (__cplusplus)\n} /* extern \"C\" */\n#endif\n"
  },
  {
    "path": "src/third_party/zydis/zydis.h",
    "content": "// DO NOT EDIT. This file is auto-generated by `amalgamate.py`.\r\n\r\n\r\n//\r\n// Header: Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Master include file. Includes everything else.\r\n */\r\n\r\n#ifndef ZYDIS_H\r\n#define ZYDIS_H\r\n\r\n\r\n//\r\n// Header: Zycore/Defines.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zycore-C)\r\n\r\n  Original Author : Florian Bernd, Joel Hoener\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * General helper and platform detection macros.\r\n */\r\n\r\n#ifndef ZYCORE_DEFINES_H\r\n#define ZYCORE_DEFINES_H\r\n\r\n/* ============================================================================================== */\r\n/* Meta macros                                                                                    */\r\n/* ============================================================================================== */\r\n\r\n/**\r\n * Concatenates two values using the stringify operator (`##`).\r\n *\r\n * @param   x   The first value.\r\n * @param   y   The second value.\r\n *\r\n * @return  The combined string of the given values.\r\n */\r\n#define ZYAN_MACRO_CONCAT(x, y) x ## y\r\n\r\n/**\r\n * Concatenates two values using the stringify operator (`##`) and expands the value to\r\n *          be used in another macro.\r\n *\r\n * @param   x   The first value.\r\n * @param   y   The second value.\r\n *\r\n * @return  The combined string of the given values.\r\n */\r\n#define ZYAN_MACRO_CONCAT_EXPAND(x, y) ZYAN_MACRO_CONCAT(x, y)\r\n\r\n/* ============================================================================================== */\r\n/* Compiler detection                                                                             */\r\n/* ============================================================================================== */\r\n\r\n#if defined(__clang__)\r\n#   define ZYAN_CLANG\r\n#   define ZYAN_GNUC\r\n#elif defined(__ICC) || defined(__INTEL_COMPILER)\r\n#   define ZYAN_ICC\r\n#elif defined(__GNUC__) || defined(__GNUG__)\r\n#   define ZYAN_GCC\r\n#   define ZYAN_GNUC\r\n#elif defined(_MSC_VER)\r\n#   define ZYAN_MSVC\r\n#elif defined(__BORLANDC__)\r\n#   define ZYAN_BORLAND\r\n#else\r\n#   define ZYAN_UNKNOWN_COMPILER\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Platform detection                                                                             */\r\n/* ============================================================================================== */\r\n\r\n#if defined(_WIN32)\r\n#   define ZYAN_WINDOWS\r\n#elif defined(__EMSCRIPTEN__)\r\n#   define ZYAN_EMSCRIPTEN\r\n#elif defined(__wasi__) || defined(__WASI__)\r\n// via: https://reviews.llvm.org/D57155\r\n#   define ZYAN_WASI\r\n#elif defined(__APPLE__)\r\n#   define ZYAN_APPLE\r\n#   define ZYAN_POSIX\r\n#elif defined(__linux)\r\n#   define ZYAN_LINUX\r\n#   define ZYAN_POSIX\r\n#elif defined(__FreeBSD__)\r\n#   define ZYAN_FREEBSD\r\n#   define ZYAN_POSIX\r\n#elif defined(__NetBSD__)\r\n#   define ZYAN_NETBSD\r\n#   define ZYAN_POSIX\r\n#elif defined(sun) || defined(__sun)\r\n#   define ZYAN_SOLARIS\r\n#   define ZYAN_POSIX\r\n#elif defined(__unix) || defined(__unix__)\r\n#   define ZYAN_UNIX\r\n#   define ZYAN_POSIX\r\n#elif defined(__posix)\r\n#   define ZYAN_POSIX\r\n#else\r\n#   define ZYAN_UNKNOWN_PLATFORM\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Kernel mode detection                                                                          */\r\n/* ============================================================================================== */\r\n\r\n#if (defined(ZYAN_WINDOWS) && defined(_KERNEL_MODE)) || \\\r\n(defined(ZYAN_APPLE) && defined(KERNEL)) || \\\r\n(defined(ZYAN_LINUX) && defined(__KERNEL__)) || \\\r\n(defined(__FreeBSD_kernel__))\r\n#   define ZYAN_KERNEL\r\n#else\r\n#   define ZYAN_USER\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Architecture detection                                                                         */\r\n/* ============================================================================================== */\r\n\r\n#if defined(_M_AMD64) || defined(__x86_64__)\r\n#   define ZYAN_X64\r\n#elif defined(_M_IX86) || defined(__i386__)\r\n#   define ZYAN_X86\r\n#elif defined(_M_ARM64) || defined(__aarch64__)\r\n#   define ZYAN_AARCH64\r\n#elif defined(_M_ARM) || defined(_M_ARMT) || defined(__arm__) || defined(__thumb__)\r\n#   define ZYAN_ARM\r\n#elif defined(__EMSCRIPTEN__) || defined(__wasm__) || defined(__WASM__)\r\n#   define ZYAN_WASM\r\n#elif defined(__loongarch__)\r\n#   define ZYAN_LOONGARCH\r\n#elif defined(__powerpc64__)\r\n#   define ZYAN_PPC64\r\n#elif defined(__powerpc__)\r\n#   define ZYAN_PPC\r\n#elif defined(__riscv) && __riscv_xlen == 64\r\n#   define ZYAN_RISCV64\r\n#else\r\n#   error \"Unsupported architecture detected\"\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Debug/Release detection                                                                        */\r\n/* ============================================================================================== */\r\n\r\n#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND)\r\n#   ifdef _DEBUG\r\n#       define ZYAN_DEBUG\r\n#   else\r\n#       define ZYAN_RELEASE\r\n#   endif\r\n#elif defined(ZYAN_GNUC) || defined(ZYAN_ICC)\r\n#   ifdef NDEBUG\r\n#       define ZYAN_RELEASE\r\n#   else\r\n#       define ZYAN_DEBUG\r\n#   endif\r\n#else\r\n#   define ZYAN_RELEASE\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Deprecation hint                                                                               */\r\n/* ============================================================================================== */\r\n\r\n#if defined(ZYAN_GCC) || defined(ZYAN_CLANG)\r\n#   define ZYAN_DEPRECATED __attribute__((__deprecated__))\r\n#elif defined(ZYAN_MSVC)\r\n#   define ZYAN_DEPRECATED __declspec(deprecated)\r\n#else\r\n#   define ZYAN_DEPRECATED\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Generic DLL import/export helpers                                                              */\r\n/* ============================================================================================== */\r\n\r\n#if defined(ZYAN_MSVC)\r\n#   define ZYAN_DLLEXPORT __declspec(dllexport)\r\n#   define ZYAN_DLLIMPORT __declspec(dllimport)\r\n#else\r\n#   define ZYAN_DLLEXPORT\r\n#   define ZYAN_DLLIMPORT\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Zycore dll{export,import}                                                                      */\r\n/* ============================================================================================== */\r\n\r\n// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To\r\n// simplify builds without CMake, we define these things manually instead of relying on CMake\r\n// to generate the header.\r\n//\r\n// For static builds, our CMakeList will define `ZYCORE_STATIC_BUILD`. For shared library builds,\r\n// our CMake will define `ZYCORE_SHOULD_EXPORT` depending on whether the target is being imported or\r\n// exported. If CMake isn't used, users can manually define these to fit their use-case.\r\n\r\n// Backward compatibility: CMake would previously generate these variables names. However, because\r\n// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For\r\n// backward compatibility for users that don't use CMake and previously manually defined these, we\r\n// translate the old defines here and print a warning.\r\n#if defined(ZYCORE_STATIC_DEFINE)\r\n#   pragma message(\"ZYCORE_STATIC_DEFINE was renamed to ZYCORE_STATIC_BUILD.\")\r\n#   define ZYCORE_STATIC_BUILD\r\n#endif\r\n#if defined(Zycore_EXPORTS)\r\n#   pragma message(\"Zycore_EXPORTS was renamed to ZYCORE_SHOULD_EXPORT.\")\r\n#   define ZYCORE_SHOULD_EXPORT\r\n#endif\r\n\r\n/**\r\n * Symbol is exported in shared library builds.\r\n */\r\n#if defined(ZYCORE_STATIC_BUILD)\r\n#   define ZYCORE_EXPORT\r\n#else\r\n#   if defined(ZYCORE_SHOULD_EXPORT)\r\n#       define ZYCORE_EXPORT ZYAN_DLLEXPORT\r\n#   else\r\n#       define ZYCORE_EXPORT ZYAN_DLLIMPORT\r\n#   endif\r\n#endif\r\n\r\n/**\r\n * Symbol is not exported and for internal use only.\r\n */\r\n#define ZYCORE_NO_EXPORT\r\n\r\n/* ============================================================================================== */\r\n/* Misc compatibility macros                                                                      */\r\n/* ============================================================================================== */\r\n\r\n#if defined(ZYAN_CLANG)\r\n#   define ZYAN_NO_SANITIZE(what) __attribute__((no_sanitize(what)))\r\n#else\r\n#   define ZYAN_NO_SANITIZE(what)\r\n#endif\r\n\r\n#if defined(ZYAN_MSVC) || defined(ZYAN_BORLAND)\r\n#   define ZYAN_INLINE __inline\r\n#else\r\n#   define ZYAN_INLINE static inline\r\n#endif\r\n\r\n#if defined(ZYAN_MSVC)\r\n#   define ZYAN_NOINLINE __declspec(noinline)\r\n#elif defined(ZYAN_GCC) || defined(ZYAN_CLANG)\r\n#   define ZYAN_NOINLINE __attribute__((noinline))\r\n#else\r\n#   define ZYAN_NOINLINE\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Debugging and optimization macros                                                              */\r\n/* ============================================================================================== */\r\n\r\n/**\r\n * Runtime debug assertion.\r\n */\r\n#if defined(ZYAN_NO_LIBC)\r\n#   define ZYAN_ASSERT(condition) (void)(condition)\r\n#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL)\r\n#   include <wdm.h>\r\n#   define ZYAN_ASSERT(condition) NT_ASSERT(condition)\r\n#else\r\n#   include <assert.h>\r\n#   define ZYAN_ASSERT(condition) assert(condition)\r\n#endif\r\n\r\n/**\r\n * Compiler-time assertion.\r\n */\r\n#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__cplusplus)\r\n#   define ZYAN_STATIC_ASSERT(x) _Static_assert(x, #x)\r\n#elif (defined(__cplusplus) && __cplusplus >= 201103L) || \\\r\n(defined(__cplusplus) && defined (_MSC_VER) && (_MSC_VER >= 1600)) || \\\r\n(defined (_MSC_VER) && (_MSC_VER >= 1800))\r\n#   define ZYAN_STATIC_ASSERT(x) static_assert(x, #x)\r\n#else\r\n#   define ZYAN_STATIC_ASSERT(x) \\\r\ntypedef int ZYAN_MACRO_CONCAT_EXPAND(ZYAN_SASSERT_, __COUNTER__) [(x) ? 1 : -1]\r\n#endif\r\n\r\n/**\r\n * Marks the current code path as unreachable.\r\n */\r\n#if defined(ZYAN_RELEASE)\r\n#   if defined(ZYAN_CLANG) // GCC eagerly evals && RHS, we have to use nested ifs.\r\n#       if __has_builtin(__builtin_unreachable)\r\n#           define ZYAN_UNREACHABLE __builtin_unreachable()\r\n#       else\r\n#           define ZYAN_UNREACHABLE for(;;)\r\n#       endif\r\n#   elif defined(ZYAN_GCC) && ((__GNUC__ == 4 && __GNUC_MINOR__ > 4) || __GNUC__ > 4)\r\n#       define ZYAN_UNREACHABLE __builtin_unreachable()\r\n#   elif defined(ZYAN_ICC)\r\n#       ifdef ZYAN_WINDOWS\r\n#           include <stdlib.h> // \"missing return statement\" workaround\r\n#           define ZYAN_UNREACHABLE __assume(0); (void)abort()\r\n#       else\r\n#           define ZYAN_UNREACHABLE __builtin_unreachable()\r\n#       endif\r\n#   elif defined(ZYAN_MSVC)\r\n#       define ZYAN_UNREACHABLE __assume(0)\r\n#   else\r\n#       define ZYAN_UNREACHABLE for(;;)\r\n#   endif\r\n#elif defined(ZYAN_NO_LIBC)\r\n#   define ZYAN_UNREACHABLE for(;;)\r\n#elif defined(ZYAN_WINDOWS) && defined(ZYAN_KERNEL)\r\n#   define ZYAN_UNREACHABLE { __fastfail(0); for(;;){} }\r\n#else\r\n#   include <stdlib.h>\r\n#   define ZYAN_UNREACHABLE { assert(0); abort(); }\r\n#endif\r\n\r\n/* ============================================================================================== */\r\n/* Utils                                                                                          */\r\n/* ============================================================================================== */\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* General purpose                                                                                */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/**\r\n * Marks the specified parameter as unused.\r\n *\r\n * @param   x   The name of the unused parameter.\r\n */\r\n#define ZYAN_UNUSED(x) (void)(x)\r\n\r\n/**\r\n * Intentional fallthrough.\r\n */\r\n#if defined(ZYAN_GCC) && __GNUC__ >= 7\r\n#   define ZYAN_FALLTHROUGH ; __attribute__((__fallthrough__))\r\n#else\r\n#   define ZYAN_FALLTHROUGH\r\n#endif\r\n\r\n/**\r\n * Declares a bitfield.\r\n *\r\n * @param   x   The size (in bits) of the bitfield.\r\n */\r\n#define ZYAN_BITFIELD(x) : x\r\n\r\n/**\r\n * Marks functions that require libc (cannot be used with `ZYAN_NO_LIBC`).\r\n */\r\n#define ZYAN_REQUIRES_LIBC\r\n\r\n/**\r\n * Decorator for `printf`-style functions.\r\n *\r\n * @param   format_index    The 1-based index of the format string parameter.\r\n * @param   first_to_check  The 1-based index of the format arguments parameter.\r\n */\r\n#if defined(__RESHARPER__)\r\n#   define ZYAN_PRINTF_ATTR(format_index, first_to_check) \\\r\n[[gnu::format(printf, format_index, first_to_check)]]\r\n#elif defined(ZYAN_GCC)\r\n#   define ZYAN_PRINTF_ATTR(format_index, first_to_check) \\\r\n__attribute__((format(printf, format_index, first_to_check)))\r\n#else\r\n#   define ZYAN_PRINTF_ATTR(format_index, first_to_check)\r\n#endif\r\n\r\n/**\r\n * Decorator for `wprintf`-style functions.\r\n *\r\n * @param   format_index    The 1-based index of the format string parameter.\r\n * @param   first_to_check  The 1-based index of the format arguments parameter.\r\n */\r\n#if defined(__RESHARPER__)\r\n#   define ZYAN_WPRINTF_ATTR(format_index, first_to_check) \\\r\n[[rscpp::format(wprintf, format_index, first_to_check)]]\r\n#else\r\n#   define ZYAN_WPRINTF_ATTR(format_index, first_to_check)\r\n#endif\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* Arrays                                                                                         */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/**\r\n * Returns the length (number of elements) of an array.\r\n *\r\n * @param   a   The name of the array.\r\n *\r\n * @return  The number of elements of the given array.\r\n */\r\n#define ZYAN_ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0]))\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* Arithmetic                                                                                     */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/**\r\n * Returns the smaller value of `a` or `b`.\r\n *\r\n * @param   a   The first value.\r\n * @param   b   The second value.\r\n *\r\n * @return  The smaller value of `a` or `b`.\r\n */\r\n#define ZYAN_MIN(a, b) (((a) < (b)) ? (a) : (b))\r\n\r\n/**\r\n * Returns the bigger value of `a` or `b`.\r\n *\r\n * @param   a   The first value.\r\n * @param   b   The second value.\r\n *\r\n * @return  The bigger value of `a` or `b`.\r\n */\r\n#define ZYAN_MAX(a, b) (((a) > (b)) ? (a) : (b))\r\n\r\n/**\r\n * Returns the absolute value of `a`.\r\n *\r\n * @param   a   The value.\r\n *\r\n * @return  The absolute value of `a`.\r\n */\r\n#define ZYAN_ABS(a) (((a) < 0) ? -(a) : (a))\r\n\r\n/**\r\n * Checks, if the given value is a power of 2.\r\n *\r\n * @param   x   The value.\r\n *\r\n * @return  `ZYAN_TRUE`, if the given value is a power of 2 or `ZYAN_FALSE`, if not.\r\n *\r\n * Note that this macro always returns `ZYAN_TRUE` for `x == 0`.\r\n */\r\n#define ZYAN_IS_POWER_OF_2(x) (((x) & ((x) - 1)) == 0)\r\n\r\n/**\r\n * Checks, if the given value is properly aligned.\r\n *\r\n * Note that this macro only works for powers of 2.\r\n */\r\n#define ZYAN_IS_ALIGNED_TO(x, align) (((x) & ((align) - 1)) == 0)\r\n\r\n/**\r\n * Aligns the value to the nearest given alignment boundary (by rounding it up).\r\n *\r\n * @param   x       The value.\r\n * @param   align   The desired alignment.\r\n *\r\n * @return  The aligned value.\r\n *\r\n * Note that this macro only works for powers of 2.\r\n */\r\n#define ZYAN_ALIGN_UP(x, align) (((x) + (align) - 1) & ~((align) - 1))\r\n\r\n/**\r\n * Aligns the value to the nearest given alignment boundary (by rounding it down).\r\n *\r\n * @param   x       The value.\r\n * @param   align   The desired alignment.\r\n *\r\n * @return  The aligned value.\r\n *\r\n * Note that this macro only works for powers of 2.\r\n */\r\n#define ZYAN_ALIGN_DOWN(x, align) (((x) - 1) & ~((align) - 1))\r\n\r\n/**\r\n * Divide the 64bit integer value by the given divisor.\r\n *\r\n * @param   n       Variable containing the dividend that will be updated with the result of the\r\n *                  division.\r\n * @param   divisor The divisor.\r\n */\r\n#if defined(ZYAN_LINUX) && defined(ZYAN_KERNEL)\r\n#   include <asm/div64.h> /* do_div */\r\n#   define ZYAN_DIV64(n, divisor) do_div(n, divisor)\r\n#else\r\n#   define ZYAN_DIV64(n, divisor) (n /= divisor)\r\n#endif\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* Bit operations                                                                                 */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/*\r\n * Checks, if the bit at index `b` is required to present the ordinal value `n`.\r\n *\r\n * @param   n   The ordinal value.\r\n * @param   b   The bit index.\r\n *\r\n * @return  `ZYAN_TRUE`, if the bit at index `b` is required to present the ordinal value `n` or\r\n *          `ZYAN_FALSE`, if not.\r\n *\r\n * Note that this macro always returns `ZYAN_FALSE` for `n == 0`.\r\n */\r\n#define ZYAN_NEEDS_BIT(n, b) (((unsigned long)(n) >> (b)) > 0)\r\n\r\n/*\r\n * Returns the number of bits required to represent the ordinal value `n`.\r\n *\r\n * @param   n   The ordinal value.\r\n *\r\n * @return  The number of bits required to represent the ordinal value `n`.\r\n *\r\n * Note that this macro returns `0` for `n == 0`.\r\n */\r\n#define ZYAN_BITS_TO_REPRESENT(n) \\\r\n( \\\r\nZYAN_NEEDS_BIT(n,  0) + ZYAN_NEEDS_BIT(n,  1) + \\\r\nZYAN_NEEDS_BIT(n,  2) + ZYAN_NEEDS_BIT(n,  3) + \\\r\nZYAN_NEEDS_BIT(n,  4) + ZYAN_NEEDS_BIT(n,  5) + \\\r\nZYAN_NEEDS_BIT(n,  6) + ZYAN_NEEDS_BIT(n,  7) + \\\r\nZYAN_NEEDS_BIT(n,  8) + ZYAN_NEEDS_BIT(n,  9) + \\\r\nZYAN_NEEDS_BIT(n, 10) + ZYAN_NEEDS_BIT(n, 11) + \\\r\nZYAN_NEEDS_BIT(n, 12) + ZYAN_NEEDS_BIT(n, 13) + \\\r\nZYAN_NEEDS_BIT(n, 14) + ZYAN_NEEDS_BIT(n, 15) + \\\r\nZYAN_NEEDS_BIT(n, 16) + ZYAN_NEEDS_BIT(n, 17) + \\\r\nZYAN_NEEDS_BIT(n, 18) + ZYAN_NEEDS_BIT(n, 19) + \\\r\nZYAN_NEEDS_BIT(n, 20) + ZYAN_NEEDS_BIT(n, 21) + \\\r\nZYAN_NEEDS_BIT(n, 22) + ZYAN_NEEDS_BIT(n, 23) + \\\r\nZYAN_NEEDS_BIT(n, 24) + ZYAN_NEEDS_BIT(n, 25) + \\\r\nZYAN_NEEDS_BIT(n, 26) + ZYAN_NEEDS_BIT(n, 27) + \\\r\nZYAN_NEEDS_BIT(n, 28) + ZYAN_NEEDS_BIT(n, 29) + \\\r\nZYAN_NEEDS_BIT(n, 30) + ZYAN_NEEDS_BIT(n, 31)   \\\r\n)\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/* ============================================================================================== */\r\n\r\n#endif /* ZYCORE_DEFINES_H */\r\n\r\n//\r\n// Header: Zycore/Types.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zyan-C)\r\n\r\n  Original Author : Florian Bernd, Joel Hoener\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Includes and defines some default data types.\r\n */\r\n\r\n#ifndef ZYCORE_TYPES_H\r\n#define ZYCORE_TYPES_H\r\n\r\n\r\n/* ============================================================================================== */\r\n/* Integer types                                                                                  */\r\n/* ============================================================================================== */\r\n\r\n#if defined(ZYAN_NO_LIBC) || \\\r\n(defined(ZYAN_MSVC) && defined(ZYAN_KERNEL)) // The WDK LibC lacks stdint.h.\r\n// No LibC mode, use compiler built-in types / macros.\r\n#   if defined(ZYAN_MSVC) || defined(ZYAN_ICC)\r\ntypedef unsigned __int8                 ZyanU8;\r\ntypedef unsigned __int16                ZyanU16;\r\ntypedef unsigned __int32                ZyanU32;\r\ntypedef unsigned __int64                ZyanU64;\r\ntypedef   signed __int8                 ZyanI8;\r\ntypedef   signed __int16                ZyanI16;\r\ntypedef   signed __int32                ZyanI32;\r\ntypedef   signed __int64                ZyanI64;\r\n#       if _WIN64\r\ntypedef ZyanU64                      ZyanUSize;\r\ntypedef ZyanI64                      ZyanISize;\r\ntypedef ZyanU64                      ZyanUPointer;\r\ntypedef ZyanI64                      ZyanIPointer;\r\n#       else\r\ntypedef ZyanU32                      ZyanUSize;\r\ntypedef ZyanI32                      ZyanISize;\r\ntypedef ZyanU32                      ZyanUPointer;\r\ntypedef ZyanI32                      ZyanIPointer;\r\n#       endif\r\n#   elif defined(ZYAN_GNUC)\r\n#       ifdef __UINT8_TYPE__\r\ntypedef __UINT8_TYPE__              ZyanU8;\r\n#       else\r\ntypedef unsigned char               ZyanU8;\r\n#       endif\r\n#       ifdef __UINT16_TYPE__\r\ntypedef __UINT16_TYPE__             ZyanU16;\r\n#       else\r\ntypedef unsigned short int          ZyanU16;\r\n#       endif\r\n#       ifdef __UINT32_TYPE__\r\ntypedef __UINT32_TYPE__             ZyanU32;\r\n#       else\r\ntypedef unsigned int                ZyanU32;\r\n#       endif\r\n#       ifdef __UINT64_TYPE__\r\ntypedef __UINT64_TYPE__             ZyanU64;\r\n#       else\r\n#           if defined(__x86_64__) && !defined(__ILP32__)\r\ntypedef unsigned long int       ZyanU64;\r\n#           else\r\ntypedef unsigned long long int  ZyanU64;\r\n#           endif\r\n#       endif\r\n#       ifdef __INT8_TYPE__\r\ntypedef __INT8_TYPE__               ZyanI8;\r\n#       else\r\ntypedef signed char                 ZyanI8;\r\n#       endif\r\n#       ifdef __INT16_TYPE__\r\ntypedef __INT16_TYPE__              ZyanI16;\r\n#       else\r\ntypedef signed short int            ZyanI16;\r\n#       endif\r\n#       ifdef __INT32_TYPE__\r\ntypedef __INT32_TYPE__              ZyanI32;\r\n#       else\r\ntypedef signed int                  ZyanI32;\r\n#       endif\r\n#       ifdef __INT64_TYPE__\r\ntypedef __INT64_TYPE__              ZyanI64;\r\n#       else\r\n#           if defined(__x86_64__) && !defined( __ILP32__)\r\ntypedef signed long int         ZyanI64;\r\n#           else\r\ntypedef signed long long int    ZyanI64;\r\n#           endif\r\n#       endif\r\n#       ifdef __SIZE_TYPE__\r\ntypedef __SIZE_TYPE__               ZyanUSize;\r\n#       else\r\ntypedef long unsigned int           ZyanUSize;\r\n#       endif\r\n#       ifdef __PTRDIFF_TYPE__\r\ntypedef __PTRDIFF_TYPE__            ZyanISize;\r\n#       else\r\ntypedef long int                    ZyanISize;\r\n#       endif\r\n#       ifdef __UINTPTR_TYPE__\r\ntypedef __UINTPTR_TYPE__            ZyanUPointer;\r\n#       else\r\n#           if defined(__x86_64__) && !defined( __ILP32__)\r\ntypedef unsigned long int       ZyanUPointer;\r\n#           else\r\ntypedef unsigned int            ZyanUPointer;\r\n#           endif\r\n#       endif\r\n#       ifdef __INTPTR_TYPE__\r\ntypedef __INTPTR_TYPE__             ZyanIPointer;\r\n#       else\r\n#           if defined(__x86_64__) && !defined( __ILP32__)\r\ntypedef long int                ZyanIPointer;\r\n#           else\r\ntypedef int                     ZyanIPointer;\r\n#           endif\r\n#       endif\r\n#   else\r\n#       error \"Unsupported compiler for no-libc mode.\"\r\n#   endif\r\n\r\n#   if defined(ZYAN_MSVC)\r\n#       define ZYAN_INT8_MIN            (-127i8 - 1)\r\n#       define ZYAN_INT16_MIN           (-32767i16 - 1)\r\n#       define ZYAN_INT32_MIN           (-2147483647i32 - 1)\r\n#       define ZYAN_INT64_MIN           (-9223372036854775807i64 - 1)\r\n#       define ZYAN_INT8_MAX            127i8\r\n#       define ZYAN_INT16_MAX           32767i16\r\n#       define ZYAN_INT32_MAX           2147483647i32\r\n#       define ZYAN_INT64_MAX           9223372036854775807i64\r\n#       define ZYAN_UINT8_MAX           0xffui8\r\n#       define ZYAN_UINT16_MAX          0xffffui16\r\n#       define ZYAN_UINT32_MAX          0xffffffffui32\r\n#       define ZYAN_UINT64_MAX          0xffffffffffffffffui64\r\n#   else\r\n#       ifdef __INT8_MAX__\r\n#           define ZYAN_INT8_MAX        __INT8_MAX__\r\n#       else\r\n#           define ZYAN_INT8_MAX        (127)\r\n#       endif\r\n#       define ZYAN_INT8_MIN            (-ZYAN_INT8_MAX - 1)\r\n#       ifdef __INT16_MAX__\r\n#           define ZYAN_INT16_MAX       __INT16_MAX__\r\n#       else\r\n#           define ZYAN_INT16_MAX       (32767)\r\n#       endif\r\n#       define ZYAN_INT16_MIN           (-ZYAN_INT16_MAX - 1)\r\n#       ifdef __INT32_MAX__\r\n#           define ZYAN_INT32_MAX       __INT32_MAX__\r\n#       else\r\n#           define ZYAN_INT32_MAX       (2147483647)\r\n#       endif\r\n#       define ZYAN_INT32_MIN           (-ZYAN_INT32_MAX - 1)\r\n#       ifdef __INT64_MAX__\r\n#           define ZYAN_INT64_MAX       __INT64_MAX__\r\n#       else\r\n#           if defined(__x86_64__) && !defined( __ILP32__)\r\n#               define ZYAN_INT64_MAX   (9223372036854775807L)\r\n#           else\r\n#               define ZYAN_INT64_MAX   (9223372036854775807LL)\r\n#           endif\r\n#       endif\r\n#       define ZYAN_INT64_MIN           (-ZYAN_INT64_MAX - 1)\r\n#       ifdef __UINT8_MAX__\r\n#           define ZYAN_UINT8_MAX       __UINT8_MAX__\r\n#       else\r\n#           define ZYAN_UINT8_MAX       (255)\r\n#       endif\r\n#       ifdef __UINT16_MAX__\r\n#           define ZYAN_UINT16_MAX      __UINT16_MAX__\r\n#       else\r\n#           define ZYAN_UINT16_MAX      (65535)\r\n#       endif\r\n#       ifdef __UINT32_MAX__\r\n#           define ZYAN_UINT32_MAX      __UINT32_MAX__\r\n#       else\r\n#           define ZYAN_UINT32_MAX      (4294967295U)\r\n#       endif\r\n#       ifdef __UINT64_MAX__\r\n#           define ZYAN_UINT64_MAX      __UINT64_MAX__\r\n#       else\r\n#           if defined(__x86_64__) && !defined( __ILP32__)\r\n#               define ZYAN_UINT64_MAX  (18446744073709551615UL)\r\n#           else\r\n#               define ZYAN_UINT64_MAX  (18446744073709551615ULL)\r\n#           endif\r\n#       endif\r\n#   endif\r\n#else\r\n// If is LibC present, we use stdint types.\r\n#   include <stdint.h>\r\n#   include <stddef.h>\r\ntypedef uint8_t   ZyanU8;\r\ntypedef uint16_t  ZyanU16;\r\ntypedef uint32_t  ZyanU32;\r\ntypedef uint64_t  ZyanU64;\r\ntypedef int8_t    ZyanI8;\r\ntypedef int16_t   ZyanI16;\r\ntypedef int32_t   ZyanI32;\r\ntypedef int64_t   ZyanI64;\r\ntypedef size_t    ZyanUSize;\r\ntypedef ptrdiff_t ZyanISize;\r\ntypedef uintptr_t ZyanUPointer;\r\ntypedef intptr_t  ZyanIPointer;\r\n\r\n#   define ZYAN_INT8_MIN         INT8_MIN\r\n#   define ZYAN_INT16_MIN        INT16_MIN\r\n#   define ZYAN_INT32_MIN        INT32_MIN\r\n#   define ZYAN_INT64_MIN        INT64_MIN\r\n#   define ZYAN_INT8_MAX         INT8_MAX\r\n#   define ZYAN_INT16_MAX        INT16_MAX\r\n#   define ZYAN_INT32_MAX        INT32_MAX\r\n#   define ZYAN_INT64_MAX        INT64_MAX\r\n#   define ZYAN_UINT8_MAX        UINT8_MAX\r\n#   define ZYAN_UINT16_MAX       UINT16_MAX\r\n#   define ZYAN_UINT32_MAX       UINT32_MAX\r\n#   define ZYAN_UINT64_MAX       UINT64_MAX\r\n#endif\r\n\r\n// Verify size assumptions.\r\nZYAN_STATIC_ASSERT(sizeof(ZyanU8      ) == 1            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanU16     ) == 2            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanU32     ) == 4            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanU64     ) == 8            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanI8      ) == 1            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanI16     ) == 2            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanI32     ) == 4            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanI64     ) == 8            );\r\nZYAN_STATIC_ASSERT(sizeof(ZyanUSize   ) == sizeof(void*)); // TODO: This one is incorrect!\r\nZYAN_STATIC_ASSERT(sizeof(ZyanISize   ) == sizeof(void*)); // TODO: This one is incorrect!\r\nZYAN_STATIC_ASSERT(sizeof(ZyanUPointer) == sizeof(void*));\r\nZYAN_STATIC_ASSERT(sizeof(ZyanIPointer) == sizeof(void*));\r\n\r\n// Verify signedness assumptions (relies on size checks above).\r\nZYAN_STATIC_ASSERT((ZyanI8 )-1 >> 1 < (ZyanI8 )((ZyanU8 )-1 >> 1));\r\nZYAN_STATIC_ASSERT((ZyanI16)-1 >> 1 < (ZyanI16)((ZyanU16)-1 >> 1));\r\nZYAN_STATIC_ASSERT((ZyanI32)-1 >> 1 < (ZyanI32)((ZyanU32)-1 >> 1));\r\nZYAN_STATIC_ASSERT((ZyanI64)-1 >> 1 < (ZyanI64)((ZyanU64)-1 >> 1));\r\n\r\n/* ============================================================================================== */\r\n/* Pointer                                                                                        */\r\n/* ============================================================================================== */\r\n\r\n/**\r\n * Defines the `ZyanVoidPointer` data-type.\r\n */\r\ntypedef void* ZyanVoidPointer;\r\n\r\n/**\r\n * Defines the `ZyanConstVoidPointer` data-type.\r\n */\r\ntypedef const void* ZyanConstVoidPointer;\r\n\r\n#define ZYAN_NULL ((void*)0)\r\n\r\n/* ============================================================================================== */\r\n/* Logic types                                                                                    */\r\n/* ============================================================================================== */\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* Boolean                                                                                        */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n#define ZYAN_FALSE 0u\r\n#define ZYAN_TRUE  1u\r\n\r\n/**\r\n * Defines the `ZyanBool` data-type.\r\n *\r\n * Represents a default boolean data-type where `0` is interpreted as `false` and all other values\r\n * as `true`.\r\n */\r\ntypedef ZyanU8 ZyanBool;\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* Ternary                                                                                        */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/**\r\n * Defines the `ZyanTernary` data-type.\r\n *\r\n * The `ZyanTernary` is a balanced ternary type that uses three truth values indicating `true`,\r\n * `false` and an indeterminate third value.\r\n */\r\ntypedef ZyanI8 ZyanTernary;\r\n\r\n#define ZYAN_TERNARY_FALSE    (-1)\r\n#define ZYAN_TERNARY_UNKNOWN  0x00\r\n#define ZYAN_TERNARY_TRUE     0x01\r\n\r\n/* ============================================================================================== */\r\n/* String types                                                                                   */\r\n/* ============================================================================================== */\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n/* C-style strings                                                                                */\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/**\r\n * Defines the `ZyanCharPointer` data-type.\r\n *\r\n * This type is most often used to represent null-terminated strings aka. C-style strings.\r\n */\r\ntypedef char* ZyanCharPointer;\r\n\r\n/**\r\n * Defines the `ZyanConstCharPointer` data-type.\r\n *\r\n * This type is most often used to represent null-terminated strings aka. C-style strings.\r\n */\r\ntypedef const char* ZyanConstCharPointer;\r\n\r\n/* ---------------------------------------------------------------------------------------------- */\r\n\r\n/* ============================================================================================== */\r\n\r\n#endif /* ZYCORE_TYPES_H */\r\n\r\n#if !defined(ZYDIS_DISABLE_DECODER)\r\n\r\n//\r\n// Header: Zydis/Decoder.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Functions for decoding instructions.\r\n */\r\n\r\n#ifndef ZYDIS_DECODER_H\r\n#define ZYDIS_DECODER_H\r\n\r\n\r\n//\r\n// Header: Zydis/DecoderTypes.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Defines the basic `ZydisDecodedInstruction` and `ZydisDecodedOperand` structs.\r\n */\r\n\r\n#ifndef ZYDIS_INSTRUCTIONINFO_H\r\n#define ZYDIS_INSTRUCTIONINFO_H\r\n\r\n\r\n//\r\n// Header: Zydis/MetaInfo.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/DecoderTypes.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * @brief\r\n */\r\n\r\n#ifndef ZYDIS_METAINFO_H\r\n#define ZYDIS_METAINFO_H\r\n\r\n\r\n//\r\n// Header: Zydis/Defines.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/DecoderTypes.h\r\n//   - Zydis/MetaInfo.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Joel Hoener\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Import/export defines for MSVC builds.\r\n */\r\n\r\n#ifndef ZYDIS_DEFINES_H\r\n#define ZYDIS_DEFINES_H\r\n\r\n\r\n// This is a cut-down version of what CMake's `GenerateExportHeader` would usually generate. To\r\n// simplify builds without CMake, we define these things manually instead of relying on CMake\r\n// to generate the header.\r\n//\r\n// For static builds, our CMakeList will define `ZYDIS_STATIC_BUILD`. For shared library builds,\r\n// our CMake will define `ZYDIS_SHOULD_EXPORT` depending on whether the target is being imported or\r\n// exported. If CMake isn't used, users can manually define these to fit their use-case.\r\n\r\n// Backward compatibility: CMake would previously generate these variables names. However, because\r\n// they have pretty cryptic names, we renamed them when we got rid of `GenerateExportHeader`. For\r\n// backward compatibility for users that don't use CMake and previously manually defined these, we\r\n// translate the old defines here and print a warning.\r\n#if defined(ZYDIS_STATIC_DEFINE)\r\n#   pragma message(\"ZYDIS_STATIC_DEFINE was renamed to ZYDIS_STATIC_BUILD.\")\r\n#   define ZYDIS_STATIC_BUILD\r\n#endif\r\n#if defined(Zydis_EXPORTS)\r\n#   pragma message(\"Zydis_EXPORTS was renamed to ZYDIS_SHOULD_EXPORT.\")\r\n#   define ZYDIS_SHOULD_EXPORT\r\n#endif\r\n\r\n/**\r\n * Symbol is exported in shared library builds.\r\n */\r\n// NOTE(rjf): @rjf\r\n#define ZYDIS_EXPORT static\r\n#if 0\r\n#if defined(ZYDIS_STATIC_BUILD)\r\n#   define ZYDIS_EXPORT\r\n#else\r\n#   if defined(ZYDIS_SHOULD_EXPORT)\r\n#       define ZYDIS_EXPORT ZYAN_DLLEXPORT\r\n#   else\r\n#       define ZYDIS_EXPORT ZYAN_DLLIMPORT\r\n#   endif\r\n#endif\r\n#endif\r\n\r\n/**\r\n * Symbol is not exported and for internal use only.\r\n */\r\n#define ZYDIS_NO_EXPORT\r\n\r\n#endif // ZYDIS_DEFINES_H\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  \r\n  //\r\n  // Header: Zydis/Generated/EnumInstructionCategory.h\r\n  //\r\n  // Include stack:\r\n  //   - Zydis/Zydis.h\r\n  //   - Zydis/Decoder.h\r\n  //   - Zydis/DecoderTypes.h\r\n  //   - Zydis/MetaInfo.h\r\n  //\r\n  \r\n  /**\r\n   * Defines the `ZydisInstructionCategory` enum.\r\n   */\r\n  typedef enum ZydisInstructionCategory_\r\n  {\r\n    ZYDIS_CATEGORY_INVALID,\r\n    ZYDIS_CATEGORY_ADOX_ADCX,\r\n    ZYDIS_CATEGORY_AES,\r\n    ZYDIS_CATEGORY_AMD3DNOW,\r\n    ZYDIS_CATEGORY_AMX_TILE,\r\n    ZYDIS_CATEGORY_AVX,\r\n    ZYDIS_CATEGORY_AVX2,\r\n    ZYDIS_CATEGORY_AVX2GATHER,\r\n    ZYDIS_CATEGORY_AVX512,\r\n    ZYDIS_CATEGORY_AVX512_4FMAPS,\r\n    ZYDIS_CATEGORY_AVX512_4VNNIW,\r\n    ZYDIS_CATEGORY_AVX512_BITALG,\r\n    ZYDIS_CATEGORY_AVX512_VBMI,\r\n    ZYDIS_CATEGORY_AVX512_VP2INTERSECT,\r\n    ZYDIS_CATEGORY_AVX_IFMA,\r\n    ZYDIS_CATEGORY_BINARY,\r\n    ZYDIS_CATEGORY_BITBYTE,\r\n    ZYDIS_CATEGORY_BLEND,\r\n    ZYDIS_CATEGORY_BMI1,\r\n    ZYDIS_CATEGORY_BMI2,\r\n    ZYDIS_CATEGORY_BROADCAST,\r\n    ZYDIS_CATEGORY_CALL,\r\n    ZYDIS_CATEGORY_CET,\r\n    ZYDIS_CATEGORY_CLDEMOTE,\r\n    ZYDIS_CATEGORY_CLFLUSHOPT,\r\n    ZYDIS_CATEGORY_CLWB,\r\n    ZYDIS_CATEGORY_CLZERO,\r\n    ZYDIS_CATEGORY_CMOV,\r\n    ZYDIS_CATEGORY_COMPRESS,\r\n    ZYDIS_CATEGORY_COND_BR,\r\n    ZYDIS_CATEGORY_CONFLICT,\r\n    ZYDIS_CATEGORY_CONVERT,\r\n    ZYDIS_CATEGORY_DATAXFER,\r\n    ZYDIS_CATEGORY_DECIMAL,\r\n    ZYDIS_CATEGORY_ENQCMD,\r\n    ZYDIS_CATEGORY_EXPAND,\r\n    ZYDIS_CATEGORY_FCMOV,\r\n    ZYDIS_CATEGORY_FLAGOP,\r\n    ZYDIS_CATEGORY_FMA4,\r\n    ZYDIS_CATEGORY_FP16,\r\n    ZYDIS_CATEGORY_GATHER,\r\n    ZYDIS_CATEGORY_GFNI,\r\n    ZYDIS_CATEGORY_HRESET,\r\n    ZYDIS_CATEGORY_IFMA,\r\n    ZYDIS_CATEGORY_INTERRUPT,\r\n    ZYDIS_CATEGORY_IO,\r\n    ZYDIS_CATEGORY_IOSTRINGOP,\r\n    ZYDIS_CATEGORY_KEYLOCKER,\r\n    ZYDIS_CATEGORY_KEYLOCKER_WIDE,\r\n    ZYDIS_CATEGORY_KMASK,\r\n    ZYDIS_CATEGORY_KNC,\r\n    ZYDIS_CATEGORY_KNCMASK,\r\n    ZYDIS_CATEGORY_KNCSCALAR,\r\n    ZYDIS_CATEGORY_LEGACY,\r\n    ZYDIS_CATEGORY_LOGICAL,\r\n    ZYDIS_CATEGORY_LOGICAL_FP,\r\n    ZYDIS_CATEGORY_LZCNT,\r\n    ZYDIS_CATEGORY_MISC,\r\n    ZYDIS_CATEGORY_MMX,\r\n    ZYDIS_CATEGORY_MOVDIR,\r\n    ZYDIS_CATEGORY_MPX,\r\n    ZYDIS_CATEGORY_MSRLIST,\r\n    ZYDIS_CATEGORY_NOP,\r\n    ZYDIS_CATEGORY_PADLOCK,\r\n    ZYDIS_CATEGORY_PBNDKB,\r\n    ZYDIS_CATEGORY_PCLMULQDQ,\r\n    ZYDIS_CATEGORY_PCOMMIT,\r\n    ZYDIS_CATEGORY_PCONFIG,\r\n    ZYDIS_CATEGORY_PKU,\r\n    ZYDIS_CATEGORY_POP,\r\n    ZYDIS_CATEGORY_PREFETCH,\r\n    ZYDIS_CATEGORY_PREFETCHWT1,\r\n    ZYDIS_CATEGORY_PT,\r\n    ZYDIS_CATEGORY_PUSH,\r\n    ZYDIS_CATEGORY_RDPID,\r\n    ZYDIS_CATEGORY_RDPRU,\r\n    ZYDIS_CATEGORY_RDRAND,\r\n    ZYDIS_CATEGORY_RDSEED,\r\n    ZYDIS_CATEGORY_RDWRFSGS,\r\n    ZYDIS_CATEGORY_RET,\r\n    ZYDIS_CATEGORY_ROTATE,\r\n    ZYDIS_CATEGORY_SCATTER,\r\n    ZYDIS_CATEGORY_SEGOP,\r\n    ZYDIS_CATEGORY_SEMAPHORE,\r\n    ZYDIS_CATEGORY_SERIALIZE,\r\n    ZYDIS_CATEGORY_SETCC,\r\n    ZYDIS_CATEGORY_SGX,\r\n    ZYDIS_CATEGORY_SHA,\r\n    ZYDIS_CATEGORY_SHA512,\r\n    ZYDIS_CATEGORY_SHIFT,\r\n    ZYDIS_CATEGORY_SMAP,\r\n    ZYDIS_CATEGORY_SSE,\r\n    ZYDIS_CATEGORY_STRINGOP,\r\n    ZYDIS_CATEGORY_STTNI,\r\n    ZYDIS_CATEGORY_SYSCALL,\r\n    ZYDIS_CATEGORY_SYSRET,\r\n    ZYDIS_CATEGORY_SYSTEM,\r\n    ZYDIS_CATEGORY_TBM,\r\n    ZYDIS_CATEGORY_TSX_LDTRK,\r\n    ZYDIS_CATEGORY_UFMA,\r\n    ZYDIS_CATEGORY_UINTR,\r\n    ZYDIS_CATEGORY_UNCOND_BR,\r\n    ZYDIS_CATEGORY_VAES,\r\n    ZYDIS_CATEGORY_VBMI2,\r\n    ZYDIS_CATEGORY_VEX,\r\n    ZYDIS_CATEGORY_VFMA,\r\n    ZYDIS_CATEGORY_VPCLMULQDQ,\r\n    ZYDIS_CATEGORY_VTX,\r\n    ZYDIS_CATEGORY_WAITPKG,\r\n    ZYDIS_CATEGORY_WIDENOP,\r\n    ZYDIS_CATEGORY_WRMSRNS,\r\n    ZYDIS_CATEGORY_X87_ALU,\r\n    ZYDIS_CATEGORY_XOP,\r\n    ZYDIS_CATEGORY_XSAVE,\r\n    ZYDIS_CATEGORY_XSAVEOPT,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_CATEGORY_MAX_VALUE = ZYDIS_CATEGORY_XSAVEOPT,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_CATEGORY_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CATEGORY_MAX_VALUE)\r\n  } ZydisInstructionCategory;\r\n  \r\n  //\r\n  // Header: Zydis/Generated/EnumISASet.h\r\n  //\r\n  // Include stack:\r\n  //   - Zydis/Zydis.h\r\n  //   - Zydis/Decoder.h\r\n  //   - Zydis/DecoderTypes.h\r\n  //   - Zydis/MetaInfo.h\r\n  //\r\n  \r\n  /**\r\n   * Defines the `ZydisISASet` enum.\r\n   */\r\n  typedef enum ZydisISASet_\r\n  {\r\n    ZYDIS_ISA_SET_INVALID,\r\n    ZYDIS_ISA_SET_ADOX_ADCX,\r\n    ZYDIS_ISA_SET_AES,\r\n    ZYDIS_ISA_SET_AMD,\r\n    ZYDIS_ISA_SET_AMD3DNOW,\r\n    ZYDIS_ISA_SET_AMD_INVLPGB,\r\n    ZYDIS_ISA_SET_AMX_BF16,\r\n    ZYDIS_ISA_SET_AMX_FP16,\r\n    ZYDIS_ISA_SET_AMX_INT8,\r\n    ZYDIS_ISA_SET_AMX_TILE,\r\n    ZYDIS_ISA_SET_AVX,\r\n    ZYDIS_ISA_SET_AVX2,\r\n    ZYDIS_ISA_SET_AVX2GATHER,\r\n    ZYDIS_ISA_SET_AVX512BW_128,\r\n    ZYDIS_ISA_SET_AVX512BW_128N,\r\n    ZYDIS_ISA_SET_AVX512BW_256,\r\n    ZYDIS_ISA_SET_AVX512BW_512,\r\n    ZYDIS_ISA_SET_AVX512BW_KOP,\r\n    ZYDIS_ISA_SET_AVX512CD_128,\r\n    ZYDIS_ISA_SET_AVX512CD_256,\r\n    ZYDIS_ISA_SET_AVX512CD_512,\r\n    ZYDIS_ISA_SET_AVX512DQ_128,\r\n    ZYDIS_ISA_SET_AVX512DQ_128N,\r\n    ZYDIS_ISA_SET_AVX512DQ_256,\r\n    ZYDIS_ISA_SET_AVX512DQ_512,\r\n    ZYDIS_ISA_SET_AVX512DQ_KOP,\r\n    ZYDIS_ISA_SET_AVX512DQ_SCALAR,\r\n    ZYDIS_ISA_SET_AVX512ER_512,\r\n    ZYDIS_ISA_SET_AVX512ER_SCALAR,\r\n    ZYDIS_ISA_SET_AVX512F_128,\r\n    ZYDIS_ISA_SET_AVX512F_128N,\r\n    ZYDIS_ISA_SET_AVX512F_256,\r\n    ZYDIS_ISA_SET_AVX512F_512,\r\n    ZYDIS_ISA_SET_AVX512F_KOP,\r\n    ZYDIS_ISA_SET_AVX512F_SCALAR,\r\n    ZYDIS_ISA_SET_AVX512PF_512,\r\n    ZYDIS_ISA_SET_AVX512_4FMAPS_512,\r\n    ZYDIS_ISA_SET_AVX512_4FMAPS_SCALAR,\r\n    ZYDIS_ISA_SET_AVX512_4VNNIW_512,\r\n    ZYDIS_ISA_SET_AVX512_BF16_128,\r\n    ZYDIS_ISA_SET_AVX512_BF16_256,\r\n    ZYDIS_ISA_SET_AVX512_BF16_512,\r\n    ZYDIS_ISA_SET_AVX512_BITALG_128,\r\n    ZYDIS_ISA_SET_AVX512_BITALG_256,\r\n    ZYDIS_ISA_SET_AVX512_BITALG_512,\r\n    ZYDIS_ISA_SET_AVX512_FP16_128,\r\n    ZYDIS_ISA_SET_AVX512_FP16_128N,\r\n    ZYDIS_ISA_SET_AVX512_FP16_256,\r\n    ZYDIS_ISA_SET_AVX512_FP16_512,\r\n    ZYDIS_ISA_SET_AVX512_FP16_SCALAR,\r\n    ZYDIS_ISA_SET_AVX512_GFNI_128,\r\n    ZYDIS_ISA_SET_AVX512_GFNI_256,\r\n    ZYDIS_ISA_SET_AVX512_GFNI_512,\r\n    ZYDIS_ISA_SET_AVX512_IFMA_128,\r\n    ZYDIS_ISA_SET_AVX512_IFMA_256,\r\n    ZYDIS_ISA_SET_AVX512_IFMA_512,\r\n    ZYDIS_ISA_SET_AVX512_VAES_128,\r\n    ZYDIS_ISA_SET_AVX512_VAES_256,\r\n    ZYDIS_ISA_SET_AVX512_VAES_512,\r\n    ZYDIS_ISA_SET_AVX512_VBMI2_128,\r\n    ZYDIS_ISA_SET_AVX512_VBMI2_256,\r\n    ZYDIS_ISA_SET_AVX512_VBMI2_512,\r\n    ZYDIS_ISA_SET_AVX512_VBMI_128,\r\n    ZYDIS_ISA_SET_AVX512_VBMI_256,\r\n    ZYDIS_ISA_SET_AVX512_VBMI_512,\r\n    ZYDIS_ISA_SET_AVX512_VNNI_128,\r\n    ZYDIS_ISA_SET_AVX512_VNNI_256,\r\n    ZYDIS_ISA_SET_AVX512_VNNI_512,\r\n    ZYDIS_ISA_SET_AVX512_VP2INTERSECT_128,\r\n    ZYDIS_ISA_SET_AVX512_VP2INTERSECT_256,\r\n    ZYDIS_ISA_SET_AVX512_VP2INTERSECT_512,\r\n    ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_128,\r\n    ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_256,\r\n    ZYDIS_ISA_SET_AVX512_VPCLMULQDQ_512,\r\n    ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_128,\r\n    ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_256,\r\n    ZYDIS_ISA_SET_AVX512_VPOPCNTDQ_512,\r\n    ZYDIS_ISA_SET_AVXAES,\r\n    ZYDIS_ISA_SET_AVX_GFNI,\r\n    ZYDIS_ISA_SET_AVX_IFMA,\r\n    ZYDIS_ISA_SET_AVX_NE_CONVERT,\r\n    ZYDIS_ISA_SET_AVX_VNNI,\r\n    ZYDIS_ISA_SET_AVX_VNNI_INT16,\r\n    ZYDIS_ISA_SET_AVX_VNNI_INT8,\r\n    ZYDIS_ISA_SET_BMI1,\r\n    ZYDIS_ISA_SET_BMI2,\r\n    ZYDIS_ISA_SET_CET,\r\n    ZYDIS_ISA_SET_CLDEMOTE,\r\n    ZYDIS_ISA_SET_CLFLUSHOPT,\r\n    ZYDIS_ISA_SET_CLFSH,\r\n    ZYDIS_ISA_SET_CLWB,\r\n    ZYDIS_ISA_SET_CLZERO,\r\n    ZYDIS_ISA_SET_CMOV,\r\n    ZYDIS_ISA_SET_CMPXCHG16B,\r\n    ZYDIS_ISA_SET_ENQCMD,\r\n    ZYDIS_ISA_SET_F16C,\r\n    ZYDIS_ISA_SET_FAT_NOP,\r\n    ZYDIS_ISA_SET_FCMOV,\r\n    ZYDIS_ISA_SET_FCOMI,\r\n    ZYDIS_ISA_SET_FMA,\r\n    ZYDIS_ISA_SET_FMA4,\r\n    ZYDIS_ISA_SET_FXSAVE,\r\n    ZYDIS_ISA_SET_FXSAVE64,\r\n    ZYDIS_ISA_SET_GFNI,\r\n    ZYDIS_ISA_SET_HRESET,\r\n    ZYDIS_ISA_SET_I186,\r\n    ZYDIS_ISA_SET_I286PROTECTED,\r\n    ZYDIS_ISA_SET_I286REAL,\r\n    ZYDIS_ISA_SET_I386,\r\n    ZYDIS_ISA_SET_I486,\r\n    ZYDIS_ISA_SET_I486REAL,\r\n    ZYDIS_ISA_SET_I86,\r\n    ZYDIS_ISA_SET_ICACHE_PREFETCH,\r\n    ZYDIS_ISA_SET_INVPCID,\r\n    ZYDIS_ISA_SET_KEYLOCKER,\r\n    ZYDIS_ISA_SET_KEYLOCKER_WIDE,\r\n    ZYDIS_ISA_SET_KNCE,\r\n    ZYDIS_ISA_SET_KNCJKBR,\r\n    ZYDIS_ISA_SET_KNCSTREAM,\r\n    ZYDIS_ISA_SET_KNCV,\r\n    ZYDIS_ISA_SET_KNC_MISC,\r\n    ZYDIS_ISA_SET_KNC_PF_HINT,\r\n    ZYDIS_ISA_SET_LAHF,\r\n    ZYDIS_ISA_SET_LONGMODE,\r\n    ZYDIS_ISA_SET_LWP,\r\n    ZYDIS_ISA_SET_LZCNT,\r\n    ZYDIS_ISA_SET_MCOMMIT,\r\n    ZYDIS_ISA_SET_MONITOR,\r\n    ZYDIS_ISA_SET_MONITORX,\r\n    ZYDIS_ISA_SET_MOVBE,\r\n    ZYDIS_ISA_SET_MOVDIR,\r\n    ZYDIS_ISA_SET_MPX,\r\n    ZYDIS_ISA_SET_MSRLIST,\r\n    ZYDIS_ISA_SET_PADLOCK_ACE,\r\n    ZYDIS_ISA_SET_PADLOCK_PHE,\r\n    ZYDIS_ISA_SET_PADLOCK_PMM,\r\n    ZYDIS_ISA_SET_PADLOCK_RNG,\r\n    ZYDIS_ISA_SET_PAUSE,\r\n    ZYDIS_ISA_SET_PBNDKB,\r\n    ZYDIS_ISA_SET_PCLMULQDQ,\r\n    ZYDIS_ISA_SET_PCOMMIT,\r\n    ZYDIS_ISA_SET_PCONFIG,\r\n    ZYDIS_ISA_SET_PENTIUMMMX,\r\n    ZYDIS_ISA_SET_PENTIUMREAL,\r\n    ZYDIS_ISA_SET_PKU,\r\n    ZYDIS_ISA_SET_POPCNT,\r\n    ZYDIS_ISA_SET_PPRO,\r\n    ZYDIS_ISA_SET_PREFETCHWT1,\r\n    ZYDIS_ISA_SET_PREFETCH_NOP,\r\n    ZYDIS_ISA_SET_PT,\r\n    ZYDIS_ISA_SET_RAO_INT,\r\n    ZYDIS_ISA_SET_RDPID,\r\n    ZYDIS_ISA_SET_RDPMC,\r\n    ZYDIS_ISA_SET_RDPRU,\r\n    ZYDIS_ISA_SET_RDRAND,\r\n    ZYDIS_ISA_SET_RDSEED,\r\n    ZYDIS_ISA_SET_RDTSCP,\r\n    ZYDIS_ISA_SET_RDWRFSGS,\r\n    ZYDIS_ISA_SET_RTM,\r\n    ZYDIS_ISA_SET_SERIALIZE,\r\n    ZYDIS_ISA_SET_SGX,\r\n    ZYDIS_ISA_SET_SGX_ENCLV,\r\n    ZYDIS_ISA_SET_SHA,\r\n    ZYDIS_ISA_SET_SHA512,\r\n    ZYDIS_ISA_SET_SM3,\r\n    ZYDIS_ISA_SET_SM4,\r\n    ZYDIS_ISA_SET_SMAP,\r\n    ZYDIS_ISA_SET_SMX,\r\n    ZYDIS_ISA_SET_SNP,\r\n    ZYDIS_ISA_SET_SSE,\r\n    ZYDIS_ISA_SET_SSE2,\r\n    ZYDIS_ISA_SET_SSE2MMX,\r\n    ZYDIS_ISA_SET_SSE3,\r\n    ZYDIS_ISA_SET_SSE3X87,\r\n    ZYDIS_ISA_SET_SSE4,\r\n    ZYDIS_ISA_SET_SSE42,\r\n    ZYDIS_ISA_SET_SSE4A,\r\n    ZYDIS_ISA_SET_SSEMXCSR,\r\n    ZYDIS_ISA_SET_SSE_PREFETCH,\r\n    ZYDIS_ISA_SET_SSSE3,\r\n    ZYDIS_ISA_SET_SSSE3MMX,\r\n    ZYDIS_ISA_SET_SVM,\r\n    ZYDIS_ISA_SET_TBM,\r\n    ZYDIS_ISA_SET_TDX,\r\n    ZYDIS_ISA_SET_TSX_LDTRK,\r\n    ZYDIS_ISA_SET_UINTR,\r\n    ZYDIS_ISA_SET_VAES,\r\n    ZYDIS_ISA_SET_VMFUNC,\r\n    ZYDIS_ISA_SET_VPCLMULQDQ,\r\n    ZYDIS_ISA_SET_VTX,\r\n    ZYDIS_ISA_SET_WAITPKG,\r\n    ZYDIS_ISA_SET_WRMSRNS,\r\n    ZYDIS_ISA_SET_X87,\r\n    ZYDIS_ISA_SET_XOP,\r\n    ZYDIS_ISA_SET_XSAVE,\r\n    ZYDIS_ISA_SET_XSAVEC,\r\n    ZYDIS_ISA_SET_XSAVEOPT,\r\n    ZYDIS_ISA_SET_XSAVES,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_ISA_SET_MAX_VALUE = ZYDIS_ISA_SET_XSAVES,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_ISA_SET_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_SET_MAX_VALUE)\r\n  } ZydisISASet;\r\n  \r\n  //\r\n  // Header: Zydis/Generated/EnumISAExt.h\r\n  //\r\n  // Include stack:\r\n  //   - Zydis/Zydis.h\r\n  //   - Zydis/Decoder.h\r\n  //   - Zydis/DecoderTypes.h\r\n  //   - Zydis/MetaInfo.h\r\n  //\r\n  \r\n  /**\r\n   * Defines the `ZydisISAExt` enum.\r\n   */\r\n  typedef enum ZydisISAExt_\r\n  {\r\n    ZYDIS_ISA_EXT_INVALID,\r\n    ZYDIS_ISA_EXT_ADOX_ADCX,\r\n    ZYDIS_ISA_EXT_AES,\r\n    ZYDIS_ISA_EXT_AMD3DNOW,\r\n    ZYDIS_ISA_EXT_AMD3DNOW_PREFETCH,\r\n    ZYDIS_ISA_EXT_AMD_INVLPGB,\r\n    ZYDIS_ISA_EXT_AMX_BF16,\r\n    ZYDIS_ISA_EXT_AMX_FP16,\r\n    ZYDIS_ISA_EXT_AMX_INT8,\r\n    ZYDIS_ISA_EXT_AMX_TILE,\r\n    ZYDIS_ISA_EXT_AVX,\r\n    ZYDIS_ISA_EXT_AVX2,\r\n    ZYDIS_ISA_EXT_AVX2GATHER,\r\n    ZYDIS_ISA_EXT_AVX512EVEX,\r\n    ZYDIS_ISA_EXT_AVX512VEX,\r\n    ZYDIS_ISA_EXT_AVXAES,\r\n    ZYDIS_ISA_EXT_AVX_IFMA,\r\n    ZYDIS_ISA_EXT_AVX_NE_CONVERT,\r\n    ZYDIS_ISA_EXT_AVX_VNNI,\r\n    ZYDIS_ISA_EXT_AVX_VNNI_INT16,\r\n    ZYDIS_ISA_EXT_AVX_VNNI_INT8,\r\n    ZYDIS_ISA_EXT_BASE,\r\n    ZYDIS_ISA_EXT_BMI1,\r\n    ZYDIS_ISA_EXT_BMI2,\r\n    ZYDIS_ISA_EXT_CET,\r\n    ZYDIS_ISA_EXT_CLDEMOTE,\r\n    ZYDIS_ISA_EXT_CLFLUSHOPT,\r\n    ZYDIS_ISA_EXT_CLFSH,\r\n    ZYDIS_ISA_EXT_CLWB,\r\n    ZYDIS_ISA_EXT_CLZERO,\r\n    ZYDIS_ISA_EXT_ENQCMD,\r\n    ZYDIS_ISA_EXT_F16C,\r\n    ZYDIS_ISA_EXT_FMA,\r\n    ZYDIS_ISA_EXT_FMA4,\r\n    ZYDIS_ISA_EXT_GFNI,\r\n    ZYDIS_ISA_EXT_HRESET,\r\n    ZYDIS_ISA_EXT_ICACHE_PREFETCH,\r\n    ZYDIS_ISA_EXT_INVPCID,\r\n    ZYDIS_ISA_EXT_KEYLOCKER,\r\n    ZYDIS_ISA_EXT_KEYLOCKER_WIDE,\r\n    ZYDIS_ISA_EXT_KNC,\r\n    ZYDIS_ISA_EXT_KNCE,\r\n    ZYDIS_ISA_EXT_KNCV,\r\n    ZYDIS_ISA_EXT_LONGMODE,\r\n    ZYDIS_ISA_EXT_LZCNT,\r\n    ZYDIS_ISA_EXT_MCOMMIT,\r\n    ZYDIS_ISA_EXT_MMX,\r\n    ZYDIS_ISA_EXT_MONITOR,\r\n    ZYDIS_ISA_EXT_MONITORX,\r\n    ZYDIS_ISA_EXT_MOVBE,\r\n    ZYDIS_ISA_EXT_MOVDIR,\r\n    ZYDIS_ISA_EXT_MPX,\r\n    ZYDIS_ISA_EXT_MSRLIST,\r\n    ZYDIS_ISA_EXT_PADLOCK,\r\n    ZYDIS_ISA_EXT_PAUSE,\r\n    ZYDIS_ISA_EXT_PBNDKB,\r\n    ZYDIS_ISA_EXT_PCLMULQDQ,\r\n    ZYDIS_ISA_EXT_PCOMMIT,\r\n    ZYDIS_ISA_EXT_PCONFIG,\r\n    ZYDIS_ISA_EXT_PKU,\r\n    ZYDIS_ISA_EXT_PREFETCHWT1,\r\n    ZYDIS_ISA_EXT_PT,\r\n    ZYDIS_ISA_EXT_RAO_INT,\r\n    ZYDIS_ISA_EXT_RDPID,\r\n    ZYDIS_ISA_EXT_RDPRU,\r\n    ZYDIS_ISA_EXT_RDRAND,\r\n    ZYDIS_ISA_EXT_RDSEED,\r\n    ZYDIS_ISA_EXT_RDTSCP,\r\n    ZYDIS_ISA_EXT_RDWRFSGS,\r\n    ZYDIS_ISA_EXT_RTM,\r\n    ZYDIS_ISA_EXT_SERIALIZE,\r\n    ZYDIS_ISA_EXT_SGX,\r\n    ZYDIS_ISA_EXT_SGX_ENCLV,\r\n    ZYDIS_ISA_EXT_SHA,\r\n    ZYDIS_ISA_EXT_SHA512,\r\n    ZYDIS_ISA_EXT_SM3,\r\n    ZYDIS_ISA_EXT_SM4,\r\n    ZYDIS_ISA_EXT_SMAP,\r\n    ZYDIS_ISA_EXT_SMX,\r\n    ZYDIS_ISA_EXT_SNP,\r\n    ZYDIS_ISA_EXT_SSE,\r\n    ZYDIS_ISA_EXT_SSE2,\r\n    ZYDIS_ISA_EXT_SSE3,\r\n    ZYDIS_ISA_EXT_SSE4,\r\n    ZYDIS_ISA_EXT_SSE4A,\r\n    ZYDIS_ISA_EXT_SSSE3,\r\n    ZYDIS_ISA_EXT_SVM,\r\n    ZYDIS_ISA_EXT_TBM,\r\n    ZYDIS_ISA_EXT_TDX,\r\n    ZYDIS_ISA_EXT_TSX_LDTRK,\r\n    ZYDIS_ISA_EXT_UINTR,\r\n    ZYDIS_ISA_EXT_VAES,\r\n    ZYDIS_ISA_EXT_VMFUNC,\r\n    ZYDIS_ISA_EXT_VPCLMULQDQ,\r\n    ZYDIS_ISA_EXT_VTX,\r\n    ZYDIS_ISA_EXT_WAITPKG,\r\n    ZYDIS_ISA_EXT_WRMSRNS,\r\n    ZYDIS_ISA_EXT_X87,\r\n    ZYDIS_ISA_EXT_XOP,\r\n    ZYDIS_ISA_EXT_XSAVE,\r\n    ZYDIS_ISA_EXT_XSAVEC,\r\n    ZYDIS_ISA_EXT_XSAVEOPT,\r\n    ZYDIS_ISA_EXT_XSAVES,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_ISA_EXT_MAX_VALUE = ZYDIS_ISA_EXT_XSAVES,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_ISA_EXT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ISA_EXT_MAX_VALUE)\r\n  } ZydisISAExt;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n  * Returns the specified instruction category string.\r\n  *\r\n  * @param   category    The instruction category.\r\n  *\r\n  * @return  The instruction category string or `ZYAN_NULL`, if an invalid category was passed.\r\n  */\r\n  ZYDIS_EXPORT const char* ZydisCategoryGetString(ZydisInstructionCategory category);\r\n  \r\n  /**\r\n   * Returns the specified isa-set string.\r\n   *\r\n   * @param   isa_set The isa-set.\r\n   *\r\n   * @return  The isa-set string or `ZYAN_NULL`, if an invalid isa-set was passed.\r\n   */\r\n  ZYDIS_EXPORT const char* ZydisISASetGetString(ZydisISASet isa_set);\r\n  \r\n  /**\r\n   * Returns the specified isa-extension string.\r\n   *\r\n   * @param   isa_ext The isa-extension.\r\n   *\r\n   * @return  The isa-extension string or `ZYAN_NULL`, if an invalid isa-extension was passed.\r\n   */\r\n  ZYDIS_EXPORT const char* ZydisISAExtGetString(ZydisISAExt isa_ext);\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_METAINFO_H */\r\n\r\n//\r\n// Header: Zydis/Mnemonic.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/DecoderTypes.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Mnemonic constant definitions and helper functions.\r\n */\r\n\r\n#ifndef ZYDIS_MNEMONIC_H\r\n#define ZYDIS_MNEMONIC_H\r\n\r\n\r\n//\r\n// Header: Zydis/ShortString.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/DecoderTypes.h\r\n//   - Zydis/Mnemonic.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Defines the immutable and storage-efficient `ZydisShortString` struct, which\r\n * is used to store strings in the generated tables.\r\n */\r\n\r\n#ifndef ZYDIS_SHORTSTRING_H\r\n#define ZYDIS_SHORTSTRING_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n#if !defined(ZYAN_APPLE)\r\n#   pragma pack(push, 1)\r\n#endif\r\n  \r\n  /**\r\n   * Defines the `ZydisShortString` struct.\r\n   *\r\n   * This compact struct is mainly used for internal string-tables to save up some bytes.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZydisShortString_\r\n  {\r\n    /**\r\n     * The buffer that contains the actual (null-terminated) string.\r\n    */\r\n    const char* data;\r\n    /**\r\n     * The length (number of characters) of the string (without 0-termination).\r\n    */\r\n    ZyanU8 size;\r\n  } ZydisShortString;\r\n  \r\n#if !defined(ZYAN_APPLE)\r\n#   pragma pack(pop)\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Declares a `ZydisShortString` from a static C-style string.\r\n   *\r\n   * @param   string  The C-string constant.\r\n   */\r\n#define ZYDIS_MAKE_SHORTSTRING(string) \\\r\n{ string, sizeof(string) - 1 }\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_SHORTSTRING_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  \r\n  //\r\n  // Header: Zydis/Generated/EnumMnemonic.h\r\n  //\r\n  // Include stack:\r\n  //   - Zydis/Zydis.h\r\n  //   - Zydis/Decoder.h\r\n  //   - Zydis/DecoderTypes.h\r\n  //   - Zydis/Mnemonic.h\r\n  //\r\n  \r\n  /**\r\n   * Defines the `ZydisMnemonic` enum.\r\n   */\r\n  typedef enum ZydisMnemonic_\r\n  {\r\n    ZYDIS_MNEMONIC_INVALID,\r\n    ZYDIS_MNEMONIC_AAA,\r\n    ZYDIS_MNEMONIC_AAD,\r\n    ZYDIS_MNEMONIC_AADD,\r\n    ZYDIS_MNEMONIC_AAM,\r\n    ZYDIS_MNEMONIC_AAND,\r\n    ZYDIS_MNEMONIC_AAS,\r\n    ZYDIS_MNEMONIC_ADC,\r\n    ZYDIS_MNEMONIC_ADCX,\r\n    ZYDIS_MNEMONIC_ADD,\r\n    ZYDIS_MNEMONIC_ADDPD,\r\n    ZYDIS_MNEMONIC_ADDPS,\r\n    ZYDIS_MNEMONIC_ADDSD,\r\n    ZYDIS_MNEMONIC_ADDSS,\r\n    ZYDIS_MNEMONIC_ADDSUBPD,\r\n    ZYDIS_MNEMONIC_ADDSUBPS,\r\n    ZYDIS_MNEMONIC_ADOX,\r\n    ZYDIS_MNEMONIC_AESDEC,\r\n    ZYDIS_MNEMONIC_AESDEC128KL,\r\n    ZYDIS_MNEMONIC_AESDEC256KL,\r\n    ZYDIS_MNEMONIC_AESDECLAST,\r\n    ZYDIS_MNEMONIC_AESDECWIDE128KL,\r\n    ZYDIS_MNEMONIC_AESDECWIDE256KL,\r\n    ZYDIS_MNEMONIC_AESENC,\r\n    ZYDIS_MNEMONIC_AESENC128KL,\r\n    ZYDIS_MNEMONIC_AESENC256KL,\r\n    ZYDIS_MNEMONIC_AESENCLAST,\r\n    ZYDIS_MNEMONIC_AESENCWIDE128KL,\r\n    ZYDIS_MNEMONIC_AESENCWIDE256KL,\r\n    ZYDIS_MNEMONIC_AESIMC,\r\n    ZYDIS_MNEMONIC_AESKEYGENASSIST,\r\n    ZYDIS_MNEMONIC_AND,\r\n    ZYDIS_MNEMONIC_ANDN,\r\n    ZYDIS_MNEMONIC_ANDNPD,\r\n    ZYDIS_MNEMONIC_ANDNPS,\r\n    ZYDIS_MNEMONIC_ANDPD,\r\n    ZYDIS_MNEMONIC_ANDPS,\r\n    ZYDIS_MNEMONIC_AOR,\r\n    ZYDIS_MNEMONIC_ARPL,\r\n    ZYDIS_MNEMONIC_AXOR,\r\n    ZYDIS_MNEMONIC_BEXTR,\r\n    ZYDIS_MNEMONIC_BLCFILL,\r\n    ZYDIS_MNEMONIC_BLCI,\r\n    ZYDIS_MNEMONIC_BLCIC,\r\n    ZYDIS_MNEMONIC_BLCMSK,\r\n    ZYDIS_MNEMONIC_BLCS,\r\n    ZYDIS_MNEMONIC_BLENDPD,\r\n    ZYDIS_MNEMONIC_BLENDPS,\r\n    ZYDIS_MNEMONIC_BLENDVPD,\r\n    ZYDIS_MNEMONIC_BLENDVPS,\r\n    ZYDIS_MNEMONIC_BLSFILL,\r\n    ZYDIS_MNEMONIC_BLSI,\r\n    ZYDIS_MNEMONIC_BLSIC,\r\n    ZYDIS_MNEMONIC_BLSMSK,\r\n    ZYDIS_MNEMONIC_BLSR,\r\n    ZYDIS_MNEMONIC_BNDCL,\r\n    ZYDIS_MNEMONIC_BNDCN,\r\n    ZYDIS_MNEMONIC_BNDCU,\r\n    ZYDIS_MNEMONIC_BNDLDX,\r\n    ZYDIS_MNEMONIC_BNDMK,\r\n    ZYDIS_MNEMONIC_BNDMOV,\r\n    ZYDIS_MNEMONIC_BNDSTX,\r\n    ZYDIS_MNEMONIC_BOUND,\r\n    ZYDIS_MNEMONIC_BSF,\r\n    ZYDIS_MNEMONIC_BSR,\r\n    ZYDIS_MNEMONIC_BSWAP,\r\n    ZYDIS_MNEMONIC_BT,\r\n    ZYDIS_MNEMONIC_BTC,\r\n    ZYDIS_MNEMONIC_BTR,\r\n    ZYDIS_MNEMONIC_BTS,\r\n    ZYDIS_MNEMONIC_BZHI,\r\n    ZYDIS_MNEMONIC_CALL,\r\n    ZYDIS_MNEMONIC_CBW,\r\n    ZYDIS_MNEMONIC_CDQ,\r\n    ZYDIS_MNEMONIC_CDQE,\r\n    ZYDIS_MNEMONIC_CLAC,\r\n    ZYDIS_MNEMONIC_CLC,\r\n    ZYDIS_MNEMONIC_CLD,\r\n    ZYDIS_MNEMONIC_CLDEMOTE,\r\n    ZYDIS_MNEMONIC_CLEVICT0,\r\n    ZYDIS_MNEMONIC_CLEVICT1,\r\n    ZYDIS_MNEMONIC_CLFLUSH,\r\n    ZYDIS_MNEMONIC_CLFLUSHOPT,\r\n    ZYDIS_MNEMONIC_CLGI,\r\n    ZYDIS_MNEMONIC_CLI,\r\n    ZYDIS_MNEMONIC_CLRSSBSY,\r\n    ZYDIS_MNEMONIC_CLTS,\r\n    ZYDIS_MNEMONIC_CLUI,\r\n    ZYDIS_MNEMONIC_CLWB,\r\n    ZYDIS_MNEMONIC_CLZERO,\r\n    ZYDIS_MNEMONIC_CMC,\r\n    ZYDIS_MNEMONIC_CMOVB,\r\n    ZYDIS_MNEMONIC_CMOVBE,\r\n    ZYDIS_MNEMONIC_CMOVL,\r\n    ZYDIS_MNEMONIC_CMOVLE,\r\n    ZYDIS_MNEMONIC_CMOVNB,\r\n    ZYDIS_MNEMONIC_CMOVNBE,\r\n    ZYDIS_MNEMONIC_CMOVNL,\r\n    ZYDIS_MNEMONIC_CMOVNLE,\r\n    ZYDIS_MNEMONIC_CMOVNO,\r\n    ZYDIS_MNEMONIC_CMOVNP,\r\n    ZYDIS_MNEMONIC_CMOVNS,\r\n    ZYDIS_MNEMONIC_CMOVNZ,\r\n    ZYDIS_MNEMONIC_CMOVO,\r\n    ZYDIS_MNEMONIC_CMOVP,\r\n    ZYDIS_MNEMONIC_CMOVS,\r\n    ZYDIS_MNEMONIC_CMOVZ,\r\n    ZYDIS_MNEMONIC_CMP,\r\n    ZYDIS_MNEMONIC_CMPPD,\r\n    ZYDIS_MNEMONIC_CMPPS,\r\n    ZYDIS_MNEMONIC_CMPSB,\r\n    ZYDIS_MNEMONIC_CMPSD,\r\n    ZYDIS_MNEMONIC_CMPSQ,\r\n    ZYDIS_MNEMONIC_CMPSS,\r\n    ZYDIS_MNEMONIC_CMPSW,\r\n    ZYDIS_MNEMONIC_CMPXCHG,\r\n    ZYDIS_MNEMONIC_CMPXCHG16B,\r\n    ZYDIS_MNEMONIC_CMPXCHG8B,\r\n    ZYDIS_MNEMONIC_COMISD,\r\n    ZYDIS_MNEMONIC_COMISS,\r\n    ZYDIS_MNEMONIC_CPUID,\r\n    ZYDIS_MNEMONIC_CQO,\r\n    ZYDIS_MNEMONIC_CRC32,\r\n    ZYDIS_MNEMONIC_CVTDQ2PD,\r\n    ZYDIS_MNEMONIC_CVTDQ2PS,\r\n    ZYDIS_MNEMONIC_CVTPD2DQ,\r\n    ZYDIS_MNEMONIC_CVTPD2PI,\r\n    ZYDIS_MNEMONIC_CVTPD2PS,\r\n    ZYDIS_MNEMONIC_CVTPI2PD,\r\n    ZYDIS_MNEMONIC_CVTPI2PS,\r\n    ZYDIS_MNEMONIC_CVTPS2DQ,\r\n    ZYDIS_MNEMONIC_CVTPS2PD,\r\n    ZYDIS_MNEMONIC_CVTPS2PI,\r\n    ZYDIS_MNEMONIC_CVTSD2SI,\r\n    ZYDIS_MNEMONIC_CVTSD2SS,\r\n    ZYDIS_MNEMONIC_CVTSI2SD,\r\n    ZYDIS_MNEMONIC_CVTSI2SS,\r\n    ZYDIS_MNEMONIC_CVTSS2SD,\r\n    ZYDIS_MNEMONIC_CVTSS2SI,\r\n    ZYDIS_MNEMONIC_CVTTPD2DQ,\r\n    ZYDIS_MNEMONIC_CVTTPD2PI,\r\n    ZYDIS_MNEMONIC_CVTTPS2DQ,\r\n    ZYDIS_MNEMONIC_CVTTPS2PI,\r\n    ZYDIS_MNEMONIC_CVTTSD2SI,\r\n    ZYDIS_MNEMONIC_CVTTSS2SI,\r\n    ZYDIS_MNEMONIC_CWD,\r\n    ZYDIS_MNEMONIC_CWDE,\r\n    ZYDIS_MNEMONIC_DAA,\r\n    ZYDIS_MNEMONIC_DAS,\r\n    ZYDIS_MNEMONIC_DEC,\r\n    ZYDIS_MNEMONIC_DELAY,\r\n    ZYDIS_MNEMONIC_DIV,\r\n    ZYDIS_MNEMONIC_DIVPD,\r\n    ZYDIS_MNEMONIC_DIVPS,\r\n    ZYDIS_MNEMONIC_DIVSD,\r\n    ZYDIS_MNEMONIC_DIVSS,\r\n    ZYDIS_MNEMONIC_DPPD,\r\n    ZYDIS_MNEMONIC_DPPS,\r\n    ZYDIS_MNEMONIC_EMMS,\r\n    ZYDIS_MNEMONIC_ENCLS,\r\n    ZYDIS_MNEMONIC_ENCLU,\r\n    ZYDIS_MNEMONIC_ENCLV,\r\n    ZYDIS_MNEMONIC_ENCODEKEY128,\r\n    ZYDIS_MNEMONIC_ENCODEKEY256,\r\n    ZYDIS_MNEMONIC_ENDBR32,\r\n    ZYDIS_MNEMONIC_ENDBR64,\r\n    ZYDIS_MNEMONIC_ENQCMD,\r\n    ZYDIS_MNEMONIC_ENQCMDS,\r\n    ZYDIS_MNEMONIC_ENTER,\r\n    ZYDIS_MNEMONIC_EXTRACTPS,\r\n    ZYDIS_MNEMONIC_EXTRQ,\r\n    ZYDIS_MNEMONIC_F2XM1,\r\n    ZYDIS_MNEMONIC_FABS,\r\n    ZYDIS_MNEMONIC_FADD,\r\n    ZYDIS_MNEMONIC_FADDP,\r\n    ZYDIS_MNEMONIC_FBLD,\r\n    ZYDIS_MNEMONIC_FBSTP,\r\n    ZYDIS_MNEMONIC_FCHS,\r\n    ZYDIS_MNEMONIC_FCMOVB,\r\n    ZYDIS_MNEMONIC_FCMOVBE,\r\n    ZYDIS_MNEMONIC_FCMOVE,\r\n    ZYDIS_MNEMONIC_FCMOVNB,\r\n    ZYDIS_MNEMONIC_FCMOVNBE,\r\n    ZYDIS_MNEMONIC_FCMOVNE,\r\n    ZYDIS_MNEMONIC_FCMOVNU,\r\n    ZYDIS_MNEMONIC_FCMOVU,\r\n    ZYDIS_MNEMONIC_FCOM,\r\n    ZYDIS_MNEMONIC_FCOMI,\r\n    ZYDIS_MNEMONIC_FCOMIP,\r\n    ZYDIS_MNEMONIC_FCOMP,\r\n    ZYDIS_MNEMONIC_FCOMPP,\r\n    ZYDIS_MNEMONIC_FCOS,\r\n    ZYDIS_MNEMONIC_FDECSTP,\r\n    ZYDIS_MNEMONIC_FDISI8087_NOP,\r\n    ZYDIS_MNEMONIC_FDIV,\r\n    ZYDIS_MNEMONIC_FDIVP,\r\n    ZYDIS_MNEMONIC_FDIVR,\r\n    ZYDIS_MNEMONIC_FDIVRP,\r\n    ZYDIS_MNEMONIC_FEMMS,\r\n    ZYDIS_MNEMONIC_FENI8087_NOP,\r\n    ZYDIS_MNEMONIC_FFREE,\r\n    ZYDIS_MNEMONIC_FFREEP,\r\n    ZYDIS_MNEMONIC_FIADD,\r\n    ZYDIS_MNEMONIC_FICOM,\r\n    ZYDIS_MNEMONIC_FICOMP,\r\n    ZYDIS_MNEMONIC_FIDIV,\r\n    ZYDIS_MNEMONIC_FIDIVR,\r\n    ZYDIS_MNEMONIC_FILD,\r\n    ZYDIS_MNEMONIC_FIMUL,\r\n    ZYDIS_MNEMONIC_FINCSTP,\r\n    ZYDIS_MNEMONIC_FIST,\r\n    ZYDIS_MNEMONIC_FISTP,\r\n    ZYDIS_MNEMONIC_FISTTP,\r\n    ZYDIS_MNEMONIC_FISUB,\r\n    ZYDIS_MNEMONIC_FISUBR,\r\n    ZYDIS_MNEMONIC_FLD,\r\n    ZYDIS_MNEMONIC_FLD1,\r\n    ZYDIS_MNEMONIC_FLDCW,\r\n    ZYDIS_MNEMONIC_FLDENV,\r\n    ZYDIS_MNEMONIC_FLDL2E,\r\n    ZYDIS_MNEMONIC_FLDL2T,\r\n    ZYDIS_MNEMONIC_FLDLG2,\r\n    ZYDIS_MNEMONIC_FLDLN2,\r\n    ZYDIS_MNEMONIC_FLDPI,\r\n    ZYDIS_MNEMONIC_FLDZ,\r\n    ZYDIS_MNEMONIC_FMUL,\r\n    ZYDIS_MNEMONIC_FMULP,\r\n    ZYDIS_MNEMONIC_FNCLEX,\r\n    ZYDIS_MNEMONIC_FNINIT,\r\n    ZYDIS_MNEMONIC_FNOP,\r\n    ZYDIS_MNEMONIC_FNSAVE,\r\n    ZYDIS_MNEMONIC_FNSTCW,\r\n    ZYDIS_MNEMONIC_FNSTENV,\r\n    ZYDIS_MNEMONIC_FNSTSW,\r\n    ZYDIS_MNEMONIC_FPATAN,\r\n    ZYDIS_MNEMONIC_FPREM,\r\n    ZYDIS_MNEMONIC_FPREM1,\r\n    ZYDIS_MNEMONIC_FPTAN,\r\n    ZYDIS_MNEMONIC_FRNDINT,\r\n    ZYDIS_MNEMONIC_FRSTOR,\r\n    ZYDIS_MNEMONIC_FSCALE,\r\n    ZYDIS_MNEMONIC_FSETPM287_NOP,\r\n    ZYDIS_MNEMONIC_FSIN,\r\n    ZYDIS_MNEMONIC_FSINCOS,\r\n    ZYDIS_MNEMONIC_FSQRT,\r\n    ZYDIS_MNEMONIC_FST,\r\n    ZYDIS_MNEMONIC_FSTP,\r\n    ZYDIS_MNEMONIC_FSTPNCE,\r\n    ZYDIS_MNEMONIC_FSUB,\r\n    ZYDIS_MNEMONIC_FSUBP,\r\n    ZYDIS_MNEMONIC_FSUBR,\r\n    ZYDIS_MNEMONIC_FSUBRP,\r\n    ZYDIS_MNEMONIC_FTST,\r\n    ZYDIS_MNEMONIC_FUCOM,\r\n    ZYDIS_MNEMONIC_FUCOMI,\r\n    ZYDIS_MNEMONIC_FUCOMIP,\r\n    ZYDIS_MNEMONIC_FUCOMP,\r\n    ZYDIS_MNEMONIC_FUCOMPP,\r\n    ZYDIS_MNEMONIC_FWAIT,\r\n    ZYDIS_MNEMONIC_FXAM,\r\n    ZYDIS_MNEMONIC_FXCH,\r\n    ZYDIS_MNEMONIC_FXRSTOR,\r\n    ZYDIS_MNEMONIC_FXRSTOR64,\r\n    ZYDIS_MNEMONIC_FXSAVE,\r\n    ZYDIS_MNEMONIC_FXSAVE64,\r\n    ZYDIS_MNEMONIC_FXTRACT,\r\n    ZYDIS_MNEMONIC_FYL2X,\r\n    ZYDIS_MNEMONIC_FYL2XP1,\r\n    ZYDIS_MNEMONIC_GETSEC,\r\n    ZYDIS_MNEMONIC_GF2P8AFFINEINVQB,\r\n    ZYDIS_MNEMONIC_GF2P8AFFINEQB,\r\n    ZYDIS_MNEMONIC_GF2P8MULB,\r\n    ZYDIS_MNEMONIC_HADDPD,\r\n    ZYDIS_MNEMONIC_HADDPS,\r\n    ZYDIS_MNEMONIC_HLT,\r\n    ZYDIS_MNEMONIC_HRESET,\r\n    ZYDIS_MNEMONIC_HSUBPD,\r\n    ZYDIS_MNEMONIC_HSUBPS,\r\n    ZYDIS_MNEMONIC_IDIV,\r\n    ZYDIS_MNEMONIC_IMUL,\r\n    ZYDIS_MNEMONIC_IN,\r\n    ZYDIS_MNEMONIC_INC,\r\n    ZYDIS_MNEMONIC_INCSSPD,\r\n    ZYDIS_MNEMONIC_INCSSPQ,\r\n    ZYDIS_MNEMONIC_INSB,\r\n    ZYDIS_MNEMONIC_INSD,\r\n    ZYDIS_MNEMONIC_INSERTPS,\r\n    ZYDIS_MNEMONIC_INSERTQ,\r\n    ZYDIS_MNEMONIC_INSW,\r\n    ZYDIS_MNEMONIC_INT,\r\n    ZYDIS_MNEMONIC_INT1,\r\n    ZYDIS_MNEMONIC_INT3,\r\n    ZYDIS_MNEMONIC_INTO,\r\n    ZYDIS_MNEMONIC_INVD,\r\n    ZYDIS_MNEMONIC_INVEPT,\r\n    ZYDIS_MNEMONIC_INVLPG,\r\n    ZYDIS_MNEMONIC_INVLPGA,\r\n    ZYDIS_MNEMONIC_INVLPGB,\r\n    ZYDIS_MNEMONIC_INVPCID,\r\n    ZYDIS_MNEMONIC_INVVPID,\r\n    ZYDIS_MNEMONIC_IRET,\r\n    ZYDIS_MNEMONIC_IRETD,\r\n    ZYDIS_MNEMONIC_IRETQ,\r\n    ZYDIS_MNEMONIC_JB,\r\n    ZYDIS_MNEMONIC_JBE,\r\n    ZYDIS_MNEMONIC_JCXZ,\r\n    ZYDIS_MNEMONIC_JECXZ,\r\n    ZYDIS_MNEMONIC_JKNZD,\r\n    ZYDIS_MNEMONIC_JKZD,\r\n    ZYDIS_MNEMONIC_JL,\r\n    ZYDIS_MNEMONIC_JLE,\r\n    ZYDIS_MNEMONIC_JMP,\r\n    ZYDIS_MNEMONIC_JNB,\r\n    ZYDIS_MNEMONIC_JNBE,\r\n    ZYDIS_MNEMONIC_JNL,\r\n    ZYDIS_MNEMONIC_JNLE,\r\n    ZYDIS_MNEMONIC_JNO,\r\n    ZYDIS_MNEMONIC_JNP,\r\n    ZYDIS_MNEMONIC_JNS,\r\n    ZYDIS_MNEMONIC_JNZ,\r\n    ZYDIS_MNEMONIC_JO,\r\n    ZYDIS_MNEMONIC_JP,\r\n    ZYDIS_MNEMONIC_JRCXZ,\r\n    ZYDIS_MNEMONIC_JS,\r\n    ZYDIS_MNEMONIC_JZ,\r\n    ZYDIS_MNEMONIC_KADDB,\r\n    ZYDIS_MNEMONIC_KADDD,\r\n    ZYDIS_MNEMONIC_KADDQ,\r\n    ZYDIS_MNEMONIC_KADDW,\r\n    ZYDIS_MNEMONIC_KAND,\r\n    ZYDIS_MNEMONIC_KANDB,\r\n    ZYDIS_MNEMONIC_KANDD,\r\n    ZYDIS_MNEMONIC_KANDN,\r\n    ZYDIS_MNEMONIC_KANDNB,\r\n    ZYDIS_MNEMONIC_KANDND,\r\n    ZYDIS_MNEMONIC_KANDNQ,\r\n    ZYDIS_MNEMONIC_KANDNR,\r\n    ZYDIS_MNEMONIC_KANDNW,\r\n    ZYDIS_MNEMONIC_KANDQ,\r\n    ZYDIS_MNEMONIC_KANDW,\r\n    ZYDIS_MNEMONIC_KCONCATH,\r\n    ZYDIS_MNEMONIC_KCONCATL,\r\n    ZYDIS_MNEMONIC_KEXTRACT,\r\n    ZYDIS_MNEMONIC_KMERGE2L1H,\r\n    ZYDIS_MNEMONIC_KMERGE2L1L,\r\n    ZYDIS_MNEMONIC_KMOV,\r\n    ZYDIS_MNEMONIC_KMOVB,\r\n    ZYDIS_MNEMONIC_KMOVD,\r\n    ZYDIS_MNEMONIC_KMOVQ,\r\n    ZYDIS_MNEMONIC_KMOVW,\r\n    ZYDIS_MNEMONIC_KNOT,\r\n    ZYDIS_MNEMONIC_KNOTB,\r\n    ZYDIS_MNEMONIC_KNOTD,\r\n    ZYDIS_MNEMONIC_KNOTQ,\r\n    ZYDIS_MNEMONIC_KNOTW,\r\n    ZYDIS_MNEMONIC_KOR,\r\n    ZYDIS_MNEMONIC_KORB,\r\n    ZYDIS_MNEMONIC_KORD,\r\n    ZYDIS_MNEMONIC_KORQ,\r\n    ZYDIS_MNEMONIC_KORTEST,\r\n    ZYDIS_MNEMONIC_KORTESTB,\r\n    ZYDIS_MNEMONIC_KORTESTD,\r\n    ZYDIS_MNEMONIC_KORTESTQ,\r\n    ZYDIS_MNEMONIC_KORTESTW,\r\n    ZYDIS_MNEMONIC_KORW,\r\n    ZYDIS_MNEMONIC_KSHIFTLB,\r\n    ZYDIS_MNEMONIC_KSHIFTLD,\r\n    ZYDIS_MNEMONIC_KSHIFTLQ,\r\n    ZYDIS_MNEMONIC_KSHIFTLW,\r\n    ZYDIS_MNEMONIC_KSHIFTRB,\r\n    ZYDIS_MNEMONIC_KSHIFTRD,\r\n    ZYDIS_MNEMONIC_KSHIFTRQ,\r\n    ZYDIS_MNEMONIC_KSHIFTRW,\r\n    ZYDIS_MNEMONIC_KTESTB,\r\n    ZYDIS_MNEMONIC_KTESTD,\r\n    ZYDIS_MNEMONIC_KTESTQ,\r\n    ZYDIS_MNEMONIC_KTESTW,\r\n    ZYDIS_MNEMONIC_KUNPCKBW,\r\n    ZYDIS_MNEMONIC_KUNPCKDQ,\r\n    ZYDIS_MNEMONIC_KUNPCKWD,\r\n    ZYDIS_MNEMONIC_KXNOR,\r\n    ZYDIS_MNEMONIC_KXNORB,\r\n    ZYDIS_MNEMONIC_KXNORD,\r\n    ZYDIS_MNEMONIC_KXNORQ,\r\n    ZYDIS_MNEMONIC_KXNORW,\r\n    ZYDIS_MNEMONIC_KXOR,\r\n    ZYDIS_MNEMONIC_KXORB,\r\n    ZYDIS_MNEMONIC_KXORD,\r\n    ZYDIS_MNEMONIC_KXORQ,\r\n    ZYDIS_MNEMONIC_KXORW,\r\n    ZYDIS_MNEMONIC_LAHF,\r\n    ZYDIS_MNEMONIC_LAR,\r\n    ZYDIS_MNEMONIC_LDDQU,\r\n    ZYDIS_MNEMONIC_LDMXCSR,\r\n    ZYDIS_MNEMONIC_LDS,\r\n    ZYDIS_MNEMONIC_LDTILECFG,\r\n    ZYDIS_MNEMONIC_LEA,\r\n    ZYDIS_MNEMONIC_LEAVE,\r\n    ZYDIS_MNEMONIC_LES,\r\n    ZYDIS_MNEMONIC_LFENCE,\r\n    ZYDIS_MNEMONIC_LFS,\r\n    ZYDIS_MNEMONIC_LGDT,\r\n    ZYDIS_MNEMONIC_LGS,\r\n    ZYDIS_MNEMONIC_LIDT,\r\n    ZYDIS_MNEMONIC_LLDT,\r\n    ZYDIS_MNEMONIC_LLWPCB,\r\n    ZYDIS_MNEMONIC_LMSW,\r\n    ZYDIS_MNEMONIC_LOADIWKEY,\r\n    ZYDIS_MNEMONIC_LODSB,\r\n    ZYDIS_MNEMONIC_LODSD,\r\n    ZYDIS_MNEMONIC_LODSQ,\r\n    ZYDIS_MNEMONIC_LODSW,\r\n    ZYDIS_MNEMONIC_LOOP,\r\n    ZYDIS_MNEMONIC_LOOPE,\r\n    ZYDIS_MNEMONIC_LOOPNE,\r\n    ZYDIS_MNEMONIC_LSL,\r\n    ZYDIS_MNEMONIC_LSS,\r\n    ZYDIS_MNEMONIC_LTR,\r\n    ZYDIS_MNEMONIC_LWPINS,\r\n    ZYDIS_MNEMONIC_LWPVAL,\r\n    ZYDIS_MNEMONIC_LZCNT,\r\n    ZYDIS_MNEMONIC_MASKMOVDQU,\r\n    ZYDIS_MNEMONIC_MASKMOVQ,\r\n    ZYDIS_MNEMONIC_MAXPD,\r\n    ZYDIS_MNEMONIC_MAXPS,\r\n    ZYDIS_MNEMONIC_MAXSD,\r\n    ZYDIS_MNEMONIC_MAXSS,\r\n    ZYDIS_MNEMONIC_MCOMMIT,\r\n    ZYDIS_MNEMONIC_MFENCE,\r\n    ZYDIS_MNEMONIC_MINPD,\r\n    ZYDIS_MNEMONIC_MINPS,\r\n    ZYDIS_MNEMONIC_MINSD,\r\n    ZYDIS_MNEMONIC_MINSS,\r\n    ZYDIS_MNEMONIC_MONITOR,\r\n    ZYDIS_MNEMONIC_MONITORX,\r\n    ZYDIS_MNEMONIC_MONTMUL,\r\n    ZYDIS_MNEMONIC_MOV,\r\n    ZYDIS_MNEMONIC_MOVAPD,\r\n    ZYDIS_MNEMONIC_MOVAPS,\r\n    ZYDIS_MNEMONIC_MOVBE,\r\n    ZYDIS_MNEMONIC_MOVD,\r\n    ZYDIS_MNEMONIC_MOVDDUP,\r\n    ZYDIS_MNEMONIC_MOVDIR64B,\r\n    ZYDIS_MNEMONIC_MOVDIRI,\r\n    ZYDIS_MNEMONIC_MOVDQ2Q,\r\n    ZYDIS_MNEMONIC_MOVDQA,\r\n    ZYDIS_MNEMONIC_MOVDQU,\r\n    ZYDIS_MNEMONIC_MOVHLPS,\r\n    ZYDIS_MNEMONIC_MOVHPD,\r\n    ZYDIS_MNEMONIC_MOVHPS,\r\n    ZYDIS_MNEMONIC_MOVLHPS,\r\n    ZYDIS_MNEMONIC_MOVLPD,\r\n    ZYDIS_MNEMONIC_MOVLPS,\r\n    ZYDIS_MNEMONIC_MOVMSKPD,\r\n    ZYDIS_MNEMONIC_MOVMSKPS,\r\n    ZYDIS_MNEMONIC_MOVNTDQ,\r\n    ZYDIS_MNEMONIC_MOVNTDQA,\r\n    ZYDIS_MNEMONIC_MOVNTI,\r\n    ZYDIS_MNEMONIC_MOVNTPD,\r\n    ZYDIS_MNEMONIC_MOVNTPS,\r\n    ZYDIS_MNEMONIC_MOVNTQ,\r\n    ZYDIS_MNEMONIC_MOVNTSD,\r\n    ZYDIS_MNEMONIC_MOVNTSS,\r\n    ZYDIS_MNEMONIC_MOVQ,\r\n    ZYDIS_MNEMONIC_MOVQ2DQ,\r\n    ZYDIS_MNEMONIC_MOVSB,\r\n    ZYDIS_MNEMONIC_MOVSD,\r\n    ZYDIS_MNEMONIC_MOVSHDUP,\r\n    ZYDIS_MNEMONIC_MOVSLDUP,\r\n    ZYDIS_MNEMONIC_MOVSQ,\r\n    ZYDIS_MNEMONIC_MOVSS,\r\n    ZYDIS_MNEMONIC_MOVSW,\r\n    ZYDIS_MNEMONIC_MOVSX,\r\n    ZYDIS_MNEMONIC_MOVSXD,\r\n    ZYDIS_MNEMONIC_MOVUPD,\r\n    ZYDIS_MNEMONIC_MOVUPS,\r\n    ZYDIS_MNEMONIC_MOVZX,\r\n    ZYDIS_MNEMONIC_MPSADBW,\r\n    ZYDIS_MNEMONIC_MUL,\r\n    ZYDIS_MNEMONIC_MULPD,\r\n    ZYDIS_MNEMONIC_MULPS,\r\n    ZYDIS_MNEMONIC_MULSD,\r\n    ZYDIS_MNEMONIC_MULSS,\r\n    ZYDIS_MNEMONIC_MULX,\r\n    ZYDIS_MNEMONIC_MWAIT,\r\n    ZYDIS_MNEMONIC_MWAITX,\r\n    ZYDIS_MNEMONIC_NEG,\r\n    ZYDIS_MNEMONIC_NOP,\r\n    ZYDIS_MNEMONIC_NOT,\r\n    ZYDIS_MNEMONIC_OR,\r\n    ZYDIS_MNEMONIC_ORPD,\r\n    ZYDIS_MNEMONIC_ORPS,\r\n    ZYDIS_MNEMONIC_OUT,\r\n    ZYDIS_MNEMONIC_OUTSB,\r\n    ZYDIS_MNEMONIC_OUTSD,\r\n    ZYDIS_MNEMONIC_OUTSW,\r\n    ZYDIS_MNEMONIC_PABSB,\r\n    ZYDIS_MNEMONIC_PABSD,\r\n    ZYDIS_MNEMONIC_PABSW,\r\n    ZYDIS_MNEMONIC_PACKSSDW,\r\n    ZYDIS_MNEMONIC_PACKSSWB,\r\n    ZYDIS_MNEMONIC_PACKUSDW,\r\n    ZYDIS_MNEMONIC_PACKUSWB,\r\n    ZYDIS_MNEMONIC_PADDB,\r\n    ZYDIS_MNEMONIC_PADDD,\r\n    ZYDIS_MNEMONIC_PADDQ,\r\n    ZYDIS_MNEMONIC_PADDSB,\r\n    ZYDIS_MNEMONIC_PADDSW,\r\n    ZYDIS_MNEMONIC_PADDUSB,\r\n    ZYDIS_MNEMONIC_PADDUSW,\r\n    ZYDIS_MNEMONIC_PADDW,\r\n    ZYDIS_MNEMONIC_PALIGNR,\r\n    ZYDIS_MNEMONIC_PAND,\r\n    ZYDIS_MNEMONIC_PANDN,\r\n    ZYDIS_MNEMONIC_PAUSE,\r\n    ZYDIS_MNEMONIC_PAVGB,\r\n    ZYDIS_MNEMONIC_PAVGUSB,\r\n    ZYDIS_MNEMONIC_PAVGW,\r\n    ZYDIS_MNEMONIC_PBLENDVB,\r\n    ZYDIS_MNEMONIC_PBLENDW,\r\n    ZYDIS_MNEMONIC_PBNDKB,\r\n    ZYDIS_MNEMONIC_PCLMULQDQ,\r\n    ZYDIS_MNEMONIC_PCMPEQB,\r\n    ZYDIS_MNEMONIC_PCMPEQD,\r\n    ZYDIS_MNEMONIC_PCMPEQQ,\r\n    ZYDIS_MNEMONIC_PCMPEQW,\r\n    ZYDIS_MNEMONIC_PCMPESTRI,\r\n    ZYDIS_MNEMONIC_PCMPESTRM,\r\n    ZYDIS_MNEMONIC_PCMPGTB,\r\n    ZYDIS_MNEMONIC_PCMPGTD,\r\n    ZYDIS_MNEMONIC_PCMPGTQ,\r\n    ZYDIS_MNEMONIC_PCMPGTW,\r\n    ZYDIS_MNEMONIC_PCMPISTRI,\r\n    ZYDIS_MNEMONIC_PCMPISTRM,\r\n    ZYDIS_MNEMONIC_PCOMMIT,\r\n    ZYDIS_MNEMONIC_PCONFIG,\r\n    ZYDIS_MNEMONIC_PDEP,\r\n    ZYDIS_MNEMONIC_PEXT,\r\n    ZYDIS_MNEMONIC_PEXTRB,\r\n    ZYDIS_MNEMONIC_PEXTRD,\r\n    ZYDIS_MNEMONIC_PEXTRQ,\r\n    ZYDIS_MNEMONIC_PEXTRW,\r\n    ZYDIS_MNEMONIC_PF2ID,\r\n    ZYDIS_MNEMONIC_PF2IW,\r\n    ZYDIS_MNEMONIC_PFACC,\r\n    ZYDIS_MNEMONIC_PFADD,\r\n    ZYDIS_MNEMONIC_PFCMPEQ,\r\n    ZYDIS_MNEMONIC_PFCMPGE,\r\n    ZYDIS_MNEMONIC_PFCMPGT,\r\n    ZYDIS_MNEMONIC_PFCPIT1,\r\n    ZYDIS_MNEMONIC_PFMAX,\r\n    ZYDIS_MNEMONIC_PFMIN,\r\n    ZYDIS_MNEMONIC_PFMUL,\r\n    ZYDIS_MNEMONIC_PFNACC,\r\n    ZYDIS_MNEMONIC_PFPNACC,\r\n    ZYDIS_MNEMONIC_PFRCP,\r\n    ZYDIS_MNEMONIC_PFRCPIT2,\r\n    ZYDIS_MNEMONIC_PFRSQIT1,\r\n    ZYDIS_MNEMONIC_PFSQRT,\r\n    ZYDIS_MNEMONIC_PFSUB,\r\n    ZYDIS_MNEMONIC_PFSUBR,\r\n    ZYDIS_MNEMONIC_PHADDD,\r\n    ZYDIS_MNEMONIC_PHADDSW,\r\n    ZYDIS_MNEMONIC_PHADDW,\r\n    ZYDIS_MNEMONIC_PHMINPOSUW,\r\n    ZYDIS_MNEMONIC_PHSUBD,\r\n    ZYDIS_MNEMONIC_PHSUBSW,\r\n    ZYDIS_MNEMONIC_PHSUBW,\r\n    ZYDIS_MNEMONIC_PI2FD,\r\n    ZYDIS_MNEMONIC_PI2FW,\r\n    ZYDIS_MNEMONIC_PINSRB,\r\n    ZYDIS_MNEMONIC_PINSRD,\r\n    ZYDIS_MNEMONIC_PINSRQ,\r\n    ZYDIS_MNEMONIC_PINSRW,\r\n    ZYDIS_MNEMONIC_PMADDUBSW,\r\n    ZYDIS_MNEMONIC_PMADDWD,\r\n    ZYDIS_MNEMONIC_PMAXSB,\r\n    ZYDIS_MNEMONIC_PMAXSD,\r\n    ZYDIS_MNEMONIC_PMAXSW,\r\n    ZYDIS_MNEMONIC_PMAXUB,\r\n    ZYDIS_MNEMONIC_PMAXUD,\r\n    ZYDIS_MNEMONIC_PMAXUW,\r\n    ZYDIS_MNEMONIC_PMINSB,\r\n    ZYDIS_MNEMONIC_PMINSD,\r\n    ZYDIS_MNEMONIC_PMINSW,\r\n    ZYDIS_MNEMONIC_PMINUB,\r\n    ZYDIS_MNEMONIC_PMINUD,\r\n    ZYDIS_MNEMONIC_PMINUW,\r\n    ZYDIS_MNEMONIC_PMOVMSKB,\r\n    ZYDIS_MNEMONIC_PMOVSXBD,\r\n    ZYDIS_MNEMONIC_PMOVSXBQ,\r\n    ZYDIS_MNEMONIC_PMOVSXBW,\r\n    ZYDIS_MNEMONIC_PMOVSXDQ,\r\n    ZYDIS_MNEMONIC_PMOVSXWD,\r\n    ZYDIS_MNEMONIC_PMOVSXWQ,\r\n    ZYDIS_MNEMONIC_PMOVZXBD,\r\n    ZYDIS_MNEMONIC_PMOVZXBQ,\r\n    ZYDIS_MNEMONIC_PMOVZXBW,\r\n    ZYDIS_MNEMONIC_PMOVZXDQ,\r\n    ZYDIS_MNEMONIC_PMOVZXWD,\r\n    ZYDIS_MNEMONIC_PMOVZXWQ,\r\n    ZYDIS_MNEMONIC_PMULDQ,\r\n    ZYDIS_MNEMONIC_PMULHRSW,\r\n    ZYDIS_MNEMONIC_PMULHRW,\r\n    ZYDIS_MNEMONIC_PMULHUW,\r\n    ZYDIS_MNEMONIC_PMULHW,\r\n    ZYDIS_MNEMONIC_PMULLD,\r\n    ZYDIS_MNEMONIC_PMULLW,\r\n    ZYDIS_MNEMONIC_PMULUDQ,\r\n    ZYDIS_MNEMONIC_POP,\r\n    ZYDIS_MNEMONIC_POPA,\r\n    ZYDIS_MNEMONIC_POPAD,\r\n    ZYDIS_MNEMONIC_POPCNT,\r\n    ZYDIS_MNEMONIC_POPF,\r\n    ZYDIS_MNEMONIC_POPFD,\r\n    ZYDIS_MNEMONIC_POPFQ,\r\n    ZYDIS_MNEMONIC_POR,\r\n    ZYDIS_MNEMONIC_PREFETCH,\r\n    ZYDIS_MNEMONIC_PREFETCHIT0,\r\n    ZYDIS_MNEMONIC_PREFETCHIT1,\r\n    ZYDIS_MNEMONIC_PREFETCHNTA,\r\n    ZYDIS_MNEMONIC_PREFETCHT0,\r\n    ZYDIS_MNEMONIC_PREFETCHT1,\r\n    ZYDIS_MNEMONIC_PREFETCHT2,\r\n    ZYDIS_MNEMONIC_PREFETCHW,\r\n    ZYDIS_MNEMONIC_PREFETCHWT1,\r\n    ZYDIS_MNEMONIC_PSADBW,\r\n    ZYDIS_MNEMONIC_PSHUFB,\r\n    ZYDIS_MNEMONIC_PSHUFD,\r\n    ZYDIS_MNEMONIC_PSHUFHW,\r\n    ZYDIS_MNEMONIC_PSHUFLW,\r\n    ZYDIS_MNEMONIC_PSHUFW,\r\n    ZYDIS_MNEMONIC_PSIGNB,\r\n    ZYDIS_MNEMONIC_PSIGND,\r\n    ZYDIS_MNEMONIC_PSIGNW,\r\n    ZYDIS_MNEMONIC_PSLLD,\r\n    ZYDIS_MNEMONIC_PSLLDQ,\r\n    ZYDIS_MNEMONIC_PSLLQ,\r\n    ZYDIS_MNEMONIC_PSLLW,\r\n    ZYDIS_MNEMONIC_PSMASH,\r\n    ZYDIS_MNEMONIC_PSRAD,\r\n    ZYDIS_MNEMONIC_PSRAW,\r\n    ZYDIS_MNEMONIC_PSRLD,\r\n    ZYDIS_MNEMONIC_PSRLDQ,\r\n    ZYDIS_MNEMONIC_PSRLQ,\r\n    ZYDIS_MNEMONIC_PSRLW,\r\n    ZYDIS_MNEMONIC_PSUBB,\r\n    ZYDIS_MNEMONIC_PSUBD,\r\n    ZYDIS_MNEMONIC_PSUBQ,\r\n    ZYDIS_MNEMONIC_PSUBSB,\r\n    ZYDIS_MNEMONIC_PSUBSW,\r\n    ZYDIS_MNEMONIC_PSUBUSB,\r\n    ZYDIS_MNEMONIC_PSUBUSW,\r\n    ZYDIS_MNEMONIC_PSUBW,\r\n    ZYDIS_MNEMONIC_PSWAPD,\r\n    ZYDIS_MNEMONIC_PTEST,\r\n    ZYDIS_MNEMONIC_PTWRITE,\r\n    ZYDIS_MNEMONIC_PUNPCKHBW,\r\n    ZYDIS_MNEMONIC_PUNPCKHDQ,\r\n    ZYDIS_MNEMONIC_PUNPCKHQDQ,\r\n    ZYDIS_MNEMONIC_PUNPCKHWD,\r\n    ZYDIS_MNEMONIC_PUNPCKLBW,\r\n    ZYDIS_MNEMONIC_PUNPCKLDQ,\r\n    ZYDIS_MNEMONIC_PUNPCKLQDQ,\r\n    ZYDIS_MNEMONIC_PUNPCKLWD,\r\n    ZYDIS_MNEMONIC_PUSH,\r\n    ZYDIS_MNEMONIC_PUSHA,\r\n    ZYDIS_MNEMONIC_PUSHAD,\r\n    ZYDIS_MNEMONIC_PUSHF,\r\n    ZYDIS_MNEMONIC_PUSHFD,\r\n    ZYDIS_MNEMONIC_PUSHFQ,\r\n    ZYDIS_MNEMONIC_PVALIDATE,\r\n    ZYDIS_MNEMONIC_PXOR,\r\n    ZYDIS_MNEMONIC_RCL,\r\n    ZYDIS_MNEMONIC_RCPPS,\r\n    ZYDIS_MNEMONIC_RCPSS,\r\n    ZYDIS_MNEMONIC_RCR,\r\n    ZYDIS_MNEMONIC_RDFSBASE,\r\n    ZYDIS_MNEMONIC_RDGSBASE,\r\n    ZYDIS_MNEMONIC_RDMSR,\r\n    ZYDIS_MNEMONIC_RDMSRLIST,\r\n    ZYDIS_MNEMONIC_RDPID,\r\n    ZYDIS_MNEMONIC_RDPKRU,\r\n    ZYDIS_MNEMONIC_RDPMC,\r\n    ZYDIS_MNEMONIC_RDPRU,\r\n    ZYDIS_MNEMONIC_RDRAND,\r\n    ZYDIS_MNEMONIC_RDSEED,\r\n    ZYDIS_MNEMONIC_RDSSPD,\r\n    ZYDIS_MNEMONIC_RDSSPQ,\r\n    ZYDIS_MNEMONIC_RDTSC,\r\n    ZYDIS_MNEMONIC_RDTSCP,\r\n    ZYDIS_MNEMONIC_RET,\r\n    ZYDIS_MNEMONIC_RMPADJUST,\r\n    ZYDIS_MNEMONIC_RMPUPDATE,\r\n    ZYDIS_MNEMONIC_ROL,\r\n    ZYDIS_MNEMONIC_ROR,\r\n    ZYDIS_MNEMONIC_RORX,\r\n    ZYDIS_MNEMONIC_ROUNDPD,\r\n    ZYDIS_MNEMONIC_ROUNDPS,\r\n    ZYDIS_MNEMONIC_ROUNDSD,\r\n    ZYDIS_MNEMONIC_ROUNDSS,\r\n    ZYDIS_MNEMONIC_RSM,\r\n    ZYDIS_MNEMONIC_RSQRTPS,\r\n    ZYDIS_MNEMONIC_RSQRTSS,\r\n    ZYDIS_MNEMONIC_RSTORSSP,\r\n    ZYDIS_MNEMONIC_SAHF,\r\n    ZYDIS_MNEMONIC_SALC,\r\n    ZYDIS_MNEMONIC_SAR,\r\n    ZYDIS_MNEMONIC_SARX,\r\n    ZYDIS_MNEMONIC_SAVEPREVSSP,\r\n    ZYDIS_MNEMONIC_SBB,\r\n    ZYDIS_MNEMONIC_SCASB,\r\n    ZYDIS_MNEMONIC_SCASD,\r\n    ZYDIS_MNEMONIC_SCASQ,\r\n    ZYDIS_MNEMONIC_SCASW,\r\n    ZYDIS_MNEMONIC_SEAMCALL,\r\n    ZYDIS_MNEMONIC_SEAMOPS,\r\n    ZYDIS_MNEMONIC_SEAMRET,\r\n    ZYDIS_MNEMONIC_SENDUIPI,\r\n    ZYDIS_MNEMONIC_SERIALIZE,\r\n    ZYDIS_MNEMONIC_SETB,\r\n    ZYDIS_MNEMONIC_SETBE,\r\n    ZYDIS_MNEMONIC_SETL,\r\n    ZYDIS_MNEMONIC_SETLE,\r\n    ZYDIS_MNEMONIC_SETNB,\r\n    ZYDIS_MNEMONIC_SETNBE,\r\n    ZYDIS_MNEMONIC_SETNL,\r\n    ZYDIS_MNEMONIC_SETNLE,\r\n    ZYDIS_MNEMONIC_SETNO,\r\n    ZYDIS_MNEMONIC_SETNP,\r\n    ZYDIS_MNEMONIC_SETNS,\r\n    ZYDIS_MNEMONIC_SETNZ,\r\n    ZYDIS_MNEMONIC_SETO,\r\n    ZYDIS_MNEMONIC_SETP,\r\n    ZYDIS_MNEMONIC_SETS,\r\n    ZYDIS_MNEMONIC_SETSSBSY,\r\n    ZYDIS_MNEMONIC_SETZ,\r\n    ZYDIS_MNEMONIC_SFENCE,\r\n    ZYDIS_MNEMONIC_SGDT,\r\n    ZYDIS_MNEMONIC_SHA1MSG1,\r\n    ZYDIS_MNEMONIC_SHA1MSG2,\r\n    ZYDIS_MNEMONIC_SHA1NEXTE,\r\n    ZYDIS_MNEMONIC_SHA1RNDS4,\r\n    ZYDIS_MNEMONIC_SHA256MSG1,\r\n    ZYDIS_MNEMONIC_SHA256MSG2,\r\n    ZYDIS_MNEMONIC_SHA256RNDS2,\r\n    ZYDIS_MNEMONIC_SHL,\r\n    ZYDIS_MNEMONIC_SHLD,\r\n    ZYDIS_MNEMONIC_SHLX,\r\n    ZYDIS_MNEMONIC_SHR,\r\n    ZYDIS_MNEMONIC_SHRD,\r\n    ZYDIS_MNEMONIC_SHRX,\r\n    ZYDIS_MNEMONIC_SHUFPD,\r\n    ZYDIS_MNEMONIC_SHUFPS,\r\n    ZYDIS_MNEMONIC_SIDT,\r\n    ZYDIS_MNEMONIC_SKINIT,\r\n    ZYDIS_MNEMONIC_SLDT,\r\n    ZYDIS_MNEMONIC_SLWPCB,\r\n    ZYDIS_MNEMONIC_SMSW,\r\n    ZYDIS_MNEMONIC_SPFLT,\r\n    ZYDIS_MNEMONIC_SQRTPD,\r\n    ZYDIS_MNEMONIC_SQRTPS,\r\n    ZYDIS_MNEMONIC_SQRTSD,\r\n    ZYDIS_MNEMONIC_SQRTSS,\r\n    ZYDIS_MNEMONIC_STAC,\r\n    ZYDIS_MNEMONIC_STC,\r\n    ZYDIS_MNEMONIC_STD,\r\n    ZYDIS_MNEMONIC_STGI,\r\n    ZYDIS_MNEMONIC_STI,\r\n    ZYDIS_MNEMONIC_STMXCSR,\r\n    ZYDIS_MNEMONIC_STOSB,\r\n    ZYDIS_MNEMONIC_STOSD,\r\n    ZYDIS_MNEMONIC_STOSQ,\r\n    ZYDIS_MNEMONIC_STOSW,\r\n    ZYDIS_MNEMONIC_STR,\r\n    ZYDIS_MNEMONIC_STTILECFG,\r\n    ZYDIS_MNEMONIC_STUI,\r\n    ZYDIS_MNEMONIC_SUB,\r\n    ZYDIS_MNEMONIC_SUBPD,\r\n    ZYDIS_MNEMONIC_SUBPS,\r\n    ZYDIS_MNEMONIC_SUBSD,\r\n    ZYDIS_MNEMONIC_SUBSS,\r\n    ZYDIS_MNEMONIC_SWAPGS,\r\n    ZYDIS_MNEMONIC_SYSCALL,\r\n    ZYDIS_MNEMONIC_SYSENTER,\r\n    ZYDIS_MNEMONIC_SYSEXIT,\r\n    ZYDIS_MNEMONIC_SYSRET,\r\n    ZYDIS_MNEMONIC_T1MSKC,\r\n    ZYDIS_MNEMONIC_TDCALL,\r\n    ZYDIS_MNEMONIC_TDPBF16PS,\r\n    ZYDIS_MNEMONIC_TDPBSSD,\r\n    ZYDIS_MNEMONIC_TDPBSUD,\r\n    ZYDIS_MNEMONIC_TDPBUSD,\r\n    ZYDIS_MNEMONIC_TDPBUUD,\r\n    ZYDIS_MNEMONIC_TDPFP16PS,\r\n    ZYDIS_MNEMONIC_TEST,\r\n    ZYDIS_MNEMONIC_TESTUI,\r\n    ZYDIS_MNEMONIC_TILELOADD,\r\n    ZYDIS_MNEMONIC_TILELOADDT1,\r\n    ZYDIS_MNEMONIC_TILERELEASE,\r\n    ZYDIS_MNEMONIC_TILESTORED,\r\n    ZYDIS_MNEMONIC_TILEZERO,\r\n    ZYDIS_MNEMONIC_TLBSYNC,\r\n    ZYDIS_MNEMONIC_TPAUSE,\r\n    ZYDIS_MNEMONIC_TZCNT,\r\n    ZYDIS_MNEMONIC_TZCNTI,\r\n    ZYDIS_MNEMONIC_TZMSK,\r\n    ZYDIS_MNEMONIC_UCOMISD,\r\n    ZYDIS_MNEMONIC_UCOMISS,\r\n    ZYDIS_MNEMONIC_UD0,\r\n    ZYDIS_MNEMONIC_UD1,\r\n    ZYDIS_MNEMONIC_UD2,\r\n    ZYDIS_MNEMONIC_UIRET,\r\n    ZYDIS_MNEMONIC_UMONITOR,\r\n    ZYDIS_MNEMONIC_UMWAIT,\r\n    ZYDIS_MNEMONIC_UNPCKHPD,\r\n    ZYDIS_MNEMONIC_UNPCKHPS,\r\n    ZYDIS_MNEMONIC_UNPCKLPD,\r\n    ZYDIS_MNEMONIC_UNPCKLPS,\r\n    ZYDIS_MNEMONIC_V4FMADDPS,\r\n    ZYDIS_MNEMONIC_V4FMADDSS,\r\n    ZYDIS_MNEMONIC_V4FNMADDPS,\r\n    ZYDIS_MNEMONIC_V4FNMADDSS,\r\n    ZYDIS_MNEMONIC_VADDNPD,\r\n    ZYDIS_MNEMONIC_VADDNPS,\r\n    ZYDIS_MNEMONIC_VADDPD,\r\n    ZYDIS_MNEMONIC_VADDPH,\r\n    ZYDIS_MNEMONIC_VADDPS,\r\n    ZYDIS_MNEMONIC_VADDSD,\r\n    ZYDIS_MNEMONIC_VADDSETSPS,\r\n    ZYDIS_MNEMONIC_VADDSH,\r\n    ZYDIS_MNEMONIC_VADDSS,\r\n    ZYDIS_MNEMONIC_VADDSUBPD,\r\n    ZYDIS_MNEMONIC_VADDSUBPS,\r\n    ZYDIS_MNEMONIC_VAESDEC,\r\n    ZYDIS_MNEMONIC_VAESDECLAST,\r\n    ZYDIS_MNEMONIC_VAESENC,\r\n    ZYDIS_MNEMONIC_VAESENCLAST,\r\n    ZYDIS_MNEMONIC_VAESIMC,\r\n    ZYDIS_MNEMONIC_VAESKEYGENASSIST,\r\n    ZYDIS_MNEMONIC_VALIGND,\r\n    ZYDIS_MNEMONIC_VALIGNQ,\r\n    ZYDIS_MNEMONIC_VANDNPD,\r\n    ZYDIS_MNEMONIC_VANDNPS,\r\n    ZYDIS_MNEMONIC_VANDPD,\r\n    ZYDIS_MNEMONIC_VANDPS,\r\n    ZYDIS_MNEMONIC_VBCSTNEBF162PS,\r\n    ZYDIS_MNEMONIC_VBCSTNESH2PS,\r\n    ZYDIS_MNEMONIC_VBLENDMPD,\r\n    ZYDIS_MNEMONIC_VBLENDMPS,\r\n    ZYDIS_MNEMONIC_VBLENDPD,\r\n    ZYDIS_MNEMONIC_VBLENDPS,\r\n    ZYDIS_MNEMONIC_VBLENDVPD,\r\n    ZYDIS_MNEMONIC_VBLENDVPS,\r\n    ZYDIS_MNEMONIC_VBROADCASTF128,\r\n    ZYDIS_MNEMONIC_VBROADCASTF32X2,\r\n    ZYDIS_MNEMONIC_VBROADCASTF32X4,\r\n    ZYDIS_MNEMONIC_VBROADCASTF32X8,\r\n    ZYDIS_MNEMONIC_VBROADCASTF64X2,\r\n    ZYDIS_MNEMONIC_VBROADCASTF64X4,\r\n    ZYDIS_MNEMONIC_VBROADCASTI128,\r\n    ZYDIS_MNEMONIC_VBROADCASTI32X2,\r\n    ZYDIS_MNEMONIC_VBROADCASTI32X4,\r\n    ZYDIS_MNEMONIC_VBROADCASTI32X8,\r\n    ZYDIS_MNEMONIC_VBROADCASTI64X2,\r\n    ZYDIS_MNEMONIC_VBROADCASTI64X4,\r\n    ZYDIS_MNEMONIC_VBROADCASTSD,\r\n    ZYDIS_MNEMONIC_VBROADCASTSS,\r\n    ZYDIS_MNEMONIC_VCMPPD,\r\n    ZYDIS_MNEMONIC_VCMPPH,\r\n    ZYDIS_MNEMONIC_VCMPPS,\r\n    ZYDIS_MNEMONIC_VCMPSD,\r\n    ZYDIS_MNEMONIC_VCMPSH,\r\n    ZYDIS_MNEMONIC_VCMPSS,\r\n    ZYDIS_MNEMONIC_VCOMISD,\r\n    ZYDIS_MNEMONIC_VCOMISH,\r\n    ZYDIS_MNEMONIC_VCOMISS,\r\n    ZYDIS_MNEMONIC_VCOMPRESSPD,\r\n    ZYDIS_MNEMONIC_VCOMPRESSPS,\r\n    ZYDIS_MNEMONIC_VCVTDQ2PD,\r\n    ZYDIS_MNEMONIC_VCVTDQ2PH,\r\n    ZYDIS_MNEMONIC_VCVTDQ2PS,\r\n    ZYDIS_MNEMONIC_VCVTFXPNTDQ2PS,\r\n    ZYDIS_MNEMONIC_VCVTFXPNTPD2DQ,\r\n    ZYDIS_MNEMONIC_VCVTFXPNTPD2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTFXPNTPS2DQ,\r\n    ZYDIS_MNEMONIC_VCVTFXPNTPS2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTFXPNTUDQ2PS,\r\n    ZYDIS_MNEMONIC_VCVTNE2PS2BF16,\r\n    ZYDIS_MNEMONIC_VCVTNEEBF162PS,\r\n    ZYDIS_MNEMONIC_VCVTNEEPH2PS,\r\n    ZYDIS_MNEMONIC_VCVTNEOBF162PS,\r\n    ZYDIS_MNEMONIC_VCVTNEOPH2PS,\r\n    ZYDIS_MNEMONIC_VCVTNEPS2BF16,\r\n    ZYDIS_MNEMONIC_VCVTPD2DQ,\r\n    ZYDIS_MNEMONIC_VCVTPD2PH,\r\n    ZYDIS_MNEMONIC_VCVTPD2PS,\r\n    ZYDIS_MNEMONIC_VCVTPD2QQ,\r\n    ZYDIS_MNEMONIC_VCVTPD2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTPD2UQQ,\r\n    ZYDIS_MNEMONIC_VCVTPH2DQ,\r\n    ZYDIS_MNEMONIC_VCVTPH2PD,\r\n    ZYDIS_MNEMONIC_VCVTPH2PS,\r\n    ZYDIS_MNEMONIC_VCVTPH2PSX,\r\n    ZYDIS_MNEMONIC_VCVTPH2QQ,\r\n    ZYDIS_MNEMONIC_VCVTPH2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTPH2UQQ,\r\n    ZYDIS_MNEMONIC_VCVTPH2UW,\r\n    ZYDIS_MNEMONIC_VCVTPH2W,\r\n    ZYDIS_MNEMONIC_VCVTPS2DQ,\r\n    ZYDIS_MNEMONIC_VCVTPS2PD,\r\n    ZYDIS_MNEMONIC_VCVTPS2PH,\r\n    ZYDIS_MNEMONIC_VCVTPS2PHX,\r\n    ZYDIS_MNEMONIC_VCVTPS2QQ,\r\n    ZYDIS_MNEMONIC_VCVTPS2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTPS2UQQ,\r\n    ZYDIS_MNEMONIC_VCVTQQ2PD,\r\n    ZYDIS_MNEMONIC_VCVTQQ2PH,\r\n    ZYDIS_MNEMONIC_VCVTQQ2PS,\r\n    ZYDIS_MNEMONIC_VCVTSD2SH,\r\n    ZYDIS_MNEMONIC_VCVTSD2SI,\r\n    ZYDIS_MNEMONIC_VCVTSD2SS,\r\n    ZYDIS_MNEMONIC_VCVTSD2USI,\r\n    ZYDIS_MNEMONIC_VCVTSH2SD,\r\n    ZYDIS_MNEMONIC_VCVTSH2SI,\r\n    ZYDIS_MNEMONIC_VCVTSH2SS,\r\n    ZYDIS_MNEMONIC_VCVTSH2USI,\r\n    ZYDIS_MNEMONIC_VCVTSI2SD,\r\n    ZYDIS_MNEMONIC_VCVTSI2SH,\r\n    ZYDIS_MNEMONIC_VCVTSI2SS,\r\n    ZYDIS_MNEMONIC_VCVTSS2SD,\r\n    ZYDIS_MNEMONIC_VCVTSS2SH,\r\n    ZYDIS_MNEMONIC_VCVTSS2SI,\r\n    ZYDIS_MNEMONIC_VCVTSS2USI,\r\n    ZYDIS_MNEMONIC_VCVTTPD2DQ,\r\n    ZYDIS_MNEMONIC_VCVTTPD2QQ,\r\n    ZYDIS_MNEMONIC_VCVTTPD2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTTPD2UQQ,\r\n    ZYDIS_MNEMONIC_VCVTTPH2DQ,\r\n    ZYDIS_MNEMONIC_VCVTTPH2QQ,\r\n    ZYDIS_MNEMONIC_VCVTTPH2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTTPH2UQQ,\r\n    ZYDIS_MNEMONIC_VCVTTPH2UW,\r\n    ZYDIS_MNEMONIC_VCVTTPH2W,\r\n    ZYDIS_MNEMONIC_VCVTTPS2DQ,\r\n    ZYDIS_MNEMONIC_VCVTTPS2QQ,\r\n    ZYDIS_MNEMONIC_VCVTTPS2UDQ,\r\n    ZYDIS_MNEMONIC_VCVTTPS2UQQ,\r\n    ZYDIS_MNEMONIC_VCVTTSD2SI,\r\n    ZYDIS_MNEMONIC_VCVTTSD2USI,\r\n    ZYDIS_MNEMONIC_VCVTTSH2SI,\r\n    ZYDIS_MNEMONIC_VCVTTSH2USI,\r\n    ZYDIS_MNEMONIC_VCVTTSS2SI,\r\n    ZYDIS_MNEMONIC_VCVTTSS2USI,\r\n    ZYDIS_MNEMONIC_VCVTUDQ2PD,\r\n    ZYDIS_MNEMONIC_VCVTUDQ2PH,\r\n    ZYDIS_MNEMONIC_VCVTUDQ2PS,\r\n    ZYDIS_MNEMONIC_VCVTUQQ2PD,\r\n    ZYDIS_MNEMONIC_VCVTUQQ2PH,\r\n    ZYDIS_MNEMONIC_VCVTUQQ2PS,\r\n    ZYDIS_MNEMONIC_VCVTUSI2SD,\r\n    ZYDIS_MNEMONIC_VCVTUSI2SH,\r\n    ZYDIS_MNEMONIC_VCVTUSI2SS,\r\n    ZYDIS_MNEMONIC_VCVTUW2PH,\r\n    ZYDIS_MNEMONIC_VCVTW2PH,\r\n    ZYDIS_MNEMONIC_VDBPSADBW,\r\n    ZYDIS_MNEMONIC_VDIVPD,\r\n    ZYDIS_MNEMONIC_VDIVPH,\r\n    ZYDIS_MNEMONIC_VDIVPS,\r\n    ZYDIS_MNEMONIC_VDIVSD,\r\n    ZYDIS_MNEMONIC_VDIVSH,\r\n    ZYDIS_MNEMONIC_VDIVSS,\r\n    ZYDIS_MNEMONIC_VDPBF16PS,\r\n    ZYDIS_MNEMONIC_VDPPD,\r\n    ZYDIS_MNEMONIC_VDPPS,\r\n    ZYDIS_MNEMONIC_VERR,\r\n    ZYDIS_MNEMONIC_VERW,\r\n    ZYDIS_MNEMONIC_VEXP223PS,\r\n    ZYDIS_MNEMONIC_VEXP2PD,\r\n    ZYDIS_MNEMONIC_VEXP2PS,\r\n    ZYDIS_MNEMONIC_VEXPANDPD,\r\n    ZYDIS_MNEMONIC_VEXPANDPS,\r\n    ZYDIS_MNEMONIC_VEXTRACTF128,\r\n    ZYDIS_MNEMONIC_VEXTRACTF32X4,\r\n    ZYDIS_MNEMONIC_VEXTRACTF32X8,\r\n    ZYDIS_MNEMONIC_VEXTRACTF64X2,\r\n    ZYDIS_MNEMONIC_VEXTRACTF64X4,\r\n    ZYDIS_MNEMONIC_VEXTRACTI128,\r\n    ZYDIS_MNEMONIC_VEXTRACTI32X4,\r\n    ZYDIS_MNEMONIC_VEXTRACTI32X8,\r\n    ZYDIS_MNEMONIC_VEXTRACTI64X2,\r\n    ZYDIS_MNEMONIC_VEXTRACTI64X4,\r\n    ZYDIS_MNEMONIC_VEXTRACTPS,\r\n    ZYDIS_MNEMONIC_VFCMADDCPH,\r\n    ZYDIS_MNEMONIC_VFCMADDCSH,\r\n    ZYDIS_MNEMONIC_VFCMULCPH,\r\n    ZYDIS_MNEMONIC_VFCMULCSH,\r\n    ZYDIS_MNEMONIC_VFIXUPIMMPD,\r\n    ZYDIS_MNEMONIC_VFIXUPIMMPS,\r\n    ZYDIS_MNEMONIC_VFIXUPIMMSD,\r\n    ZYDIS_MNEMONIC_VFIXUPIMMSS,\r\n    ZYDIS_MNEMONIC_VFIXUPNANPD,\r\n    ZYDIS_MNEMONIC_VFIXUPNANPS,\r\n    ZYDIS_MNEMONIC_VFMADD132PD,\r\n    ZYDIS_MNEMONIC_VFMADD132PH,\r\n    ZYDIS_MNEMONIC_VFMADD132PS,\r\n    ZYDIS_MNEMONIC_VFMADD132SD,\r\n    ZYDIS_MNEMONIC_VFMADD132SH,\r\n    ZYDIS_MNEMONIC_VFMADD132SS,\r\n    ZYDIS_MNEMONIC_VFMADD213PD,\r\n    ZYDIS_MNEMONIC_VFMADD213PH,\r\n    ZYDIS_MNEMONIC_VFMADD213PS,\r\n    ZYDIS_MNEMONIC_VFMADD213SD,\r\n    ZYDIS_MNEMONIC_VFMADD213SH,\r\n    ZYDIS_MNEMONIC_VFMADD213SS,\r\n    ZYDIS_MNEMONIC_VFMADD231PD,\r\n    ZYDIS_MNEMONIC_VFMADD231PH,\r\n    ZYDIS_MNEMONIC_VFMADD231PS,\r\n    ZYDIS_MNEMONIC_VFMADD231SD,\r\n    ZYDIS_MNEMONIC_VFMADD231SH,\r\n    ZYDIS_MNEMONIC_VFMADD231SS,\r\n    ZYDIS_MNEMONIC_VFMADD233PS,\r\n    ZYDIS_MNEMONIC_VFMADDCPH,\r\n    ZYDIS_MNEMONIC_VFMADDCSH,\r\n    ZYDIS_MNEMONIC_VFMADDPD,\r\n    ZYDIS_MNEMONIC_VFMADDPS,\r\n    ZYDIS_MNEMONIC_VFMADDSD,\r\n    ZYDIS_MNEMONIC_VFMADDSS,\r\n    ZYDIS_MNEMONIC_VFMADDSUB132PD,\r\n    ZYDIS_MNEMONIC_VFMADDSUB132PH,\r\n    ZYDIS_MNEMONIC_VFMADDSUB132PS,\r\n    ZYDIS_MNEMONIC_VFMADDSUB213PD,\r\n    ZYDIS_MNEMONIC_VFMADDSUB213PH,\r\n    ZYDIS_MNEMONIC_VFMADDSUB213PS,\r\n    ZYDIS_MNEMONIC_VFMADDSUB231PD,\r\n    ZYDIS_MNEMONIC_VFMADDSUB231PH,\r\n    ZYDIS_MNEMONIC_VFMADDSUB231PS,\r\n    ZYDIS_MNEMONIC_VFMADDSUBPD,\r\n    ZYDIS_MNEMONIC_VFMADDSUBPS,\r\n    ZYDIS_MNEMONIC_VFMSUB132PD,\r\n    ZYDIS_MNEMONIC_VFMSUB132PH,\r\n    ZYDIS_MNEMONIC_VFMSUB132PS,\r\n    ZYDIS_MNEMONIC_VFMSUB132SD,\r\n    ZYDIS_MNEMONIC_VFMSUB132SH,\r\n    ZYDIS_MNEMONIC_VFMSUB132SS,\r\n    ZYDIS_MNEMONIC_VFMSUB213PD,\r\n    ZYDIS_MNEMONIC_VFMSUB213PH,\r\n    ZYDIS_MNEMONIC_VFMSUB213PS,\r\n    ZYDIS_MNEMONIC_VFMSUB213SD,\r\n    ZYDIS_MNEMONIC_VFMSUB213SH,\r\n    ZYDIS_MNEMONIC_VFMSUB213SS,\r\n    ZYDIS_MNEMONIC_VFMSUB231PD,\r\n    ZYDIS_MNEMONIC_VFMSUB231PH,\r\n    ZYDIS_MNEMONIC_VFMSUB231PS,\r\n    ZYDIS_MNEMONIC_VFMSUB231SD,\r\n    ZYDIS_MNEMONIC_VFMSUB231SH,\r\n    ZYDIS_MNEMONIC_VFMSUB231SS,\r\n    ZYDIS_MNEMONIC_VFMSUBADD132PD,\r\n    ZYDIS_MNEMONIC_VFMSUBADD132PH,\r\n    ZYDIS_MNEMONIC_VFMSUBADD132PS,\r\n    ZYDIS_MNEMONIC_VFMSUBADD213PD,\r\n    ZYDIS_MNEMONIC_VFMSUBADD213PH,\r\n    ZYDIS_MNEMONIC_VFMSUBADD213PS,\r\n    ZYDIS_MNEMONIC_VFMSUBADD231PD,\r\n    ZYDIS_MNEMONIC_VFMSUBADD231PH,\r\n    ZYDIS_MNEMONIC_VFMSUBADD231PS,\r\n    ZYDIS_MNEMONIC_VFMSUBADDPD,\r\n    ZYDIS_MNEMONIC_VFMSUBADDPS,\r\n    ZYDIS_MNEMONIC_VFMSUBPD,\r\n    ZYDIS_MNEMONIC_VFMSUBPS,\r\n    ZYDIS_MNEMONIC_VFMSUBSD,\r\n    ZYDIS_MNEMONIC_VFMSUBSS,\r\n    ZYDIS_MNEMONIC_VFMULCPH,\r\n    ZYDIS_MNEMONIC_VFMULCSH,\r\n    ZYDIS_MNEMONIC_VFNMADD132PD,\r\n    ZYDIS_MNEMONIC_VFNMADD132PH,\r\n    ZYDIS_MNEMONIC_VFNMADD132PS,\r\n    ZYDIS_MNEMONIC_VFNMADD132SD,\r\n    ZYDIS_MNEMONIC_VFNMADD132SH,\r\n    ZYDIS_MNEMONIC_VFNMADD132SS,\r\n    ZYDIS_MNEMONIC_VFNMADD213PD,\r\n    ZYDIS_MNEMONIC_VFNMADD213PH,\r\n    ZYDIS_MNEMONIC_VFNMADD213PS,\r\n    ZYDIS_MNEMONIC_VFNMADD213SD,\r\n    ZYDIS_MNEMONIC_VFNMADD213SH,\r\n    ZYDIS_MNEMONIC_VFNMADD213SS,\r\n    ZYDIS_MNEMONIC_VFNMADD231PD,\r\n    ZYDIS_MNEMONIC_VFNMADD231PH,\r\n    ZYDIS_MNEMONIC_VFNMADD231PS,\r\n    ZYDIS_MNEMONIC_VFNMADD231SD,\r\n    ZYDIS_MNEMONIC_VFNMADD231SH,\r\n    ZYDIS_MNEMONIC_VFNMADD231SS,\r\n    ZYDIS_MNEMONIC_VFNMADDPD,\r\n    ZYDIS_MNEMONIC_VFNMADDPS,\r\n    ZYDIS_MNEMONIC_VFNMADDSD,\r\n    ZYDIS_MNEMONIC_VFNMADDSS,\r\n    ZYDIS_MNEMONIC_VFNMSUB132PD,\r\n    ZYDIS_MNEMONIC_VFNMSUB132PH,\r\n    ZYDIS_MNEMONIC_VFNMSUB132PS,\r\n    ZYDIS_MNEMONIC_VFNMSUB132SD,\r\n    ZYDIS_MNEMONIC_VFNMSUB132SH,\r\n    ZYDIS_MNEMONIC_VFNMSUB132SS,\r\n    ZYDIS_MNEMONIC_VFNMSUB213PD,\r\n    ZYDIS_MNEMONIC_VFNMSUB213PH,\r\n    ZYDIS_MNEMONIC_VFNMSUB213PS,\r\n    ZYDIS_MNEMONIC_VFNMSUB213SD,\r\n    ZYDIS_MNEMONIC_VFNMSUB213SH,\r\n    ZYDIS_MNEMONIC_VFNMSUB213SS,\r\n    ZYDIS_MNEMONIC_VFNMSUB231PD,\r\n    ZYDIS_MNEMONIC_VFNMSUB231PH,\r\n    ZYDIS_MNEMONIC_VFNMSUB231PS,\r\n    ZYDIS_MNEMONIC_VFNMSUB231SD,\r\n    ZYDIS_MNEMONIC_VFNMSUB231SH,\r\n    ZYDIS_MNEMONIC_VFNMSUB231SS,\r\n    ZYDIS_MNEMONIC_VFNMSUBPD,\r\n    ZYDIS_MNEMONIC_VFNMSUBPS,\r\n    ZYDIS_MNEMONIC_VFNMSUBSD,\r\n    ZYDIS_MNEMONIC_VFNMSUBSS,\r\n    ZYDIS_MNEMONIC_VFPCLASSPD,\r\n    ZYDIS_MNEMONIC_VFPCLASSPH,\r\n    ZYDIS_MNEMONIC_VFPCLASSPS,\r\n    ZYDIS_MNEMONIC_VFPCLASSSD,\r\n    ZYDIS_MNEMONIC_VFPCLASSSH,\r\n    ZYDIS_MNEMONIC_VFPCLASSSS,\r\n    ZYDIS_MNEMONIC_VFRCZPD,\r\n    ZYDIS_MNEMONIC_VFRCZPS,\r\n    ZYDIS_MNEMONIC_VFRCZSD,\r\n    ZYDIS_MNEMONIC_VFRCZSS,\r\n    ZYDIS_MNEMONIC_VGATHERDPD,\r\n    ZYDIS_MNEMONIC_VGATHERDPS,\r\n    ZYDIS_MNEMONIC_VGATHERPF0DPD,\r\n    ZYDIS_MNEMONIC_VGATHERPF0DPS,\r\n    ZYDIS_MNEMONIC_VGATHERPF0HINTDPD,\r\n    ZYDIS_MNEMONIC_VGATHERPF0HINTDPS,\r\n    ZYDIS_MNEMONIC_VGATHERPF0QPD,\r\n    ZYDIS_MNEMONIC_VGATHERPF0QPS,\r\n    ZYDIS_MNEMONIC_VGATHERPF1DPD,\r\n    ZYDIS_MNEMONIC_VGATHERPF1DPS,\r\n    ZYDIS_MNEMONIC_VGATHERPF1QPD,\r\n    ZYDIS_MNEMONIC_VGATHERPF1QPS,\r\n    ZYDIS_MNEMONIC_VGATHERQPD,\r\n    ZYDIS_MNEMONIC_VGATHERQPS,\r\n    ZYDIS_MNEMONIC_VGETEXPPD,\r\n    ZYDIS_MNEMONIC_VGETEXPPH,\r\n    ZYDIS_MNEMONIC_VGETEXPPS,\r\n    ZYDIS_MNEMONIC_VGETEXPSD,\r\n    ZYDIS_MNEMONIC_VGETEXPSH,\r\n    ZYDIS_MNEMONIC_VGETEXPSS,\r\n    ZYDIS_MNEMONIC_VGETMANTPD,\r\n    ZYDIS_MNEMONIC_VGETMANTPH,\r\n    ZYDIS_MNEMONIC_VGETMANTPS,\r\n    ZYDIS_MNEMONIC_VGETMANTSD,\r\n    ZYDIS_MNEMONIC_VGETMANTSH,\r\n    ZYDIS_MNEMONIC_VGETMANTSS,\r\n    ZYDIS_MNEMONIC_VGF2P8AFFINEINVQB,\r\n    ZYDIS_MNEMONIC_VGF2P8AFFINEQB,\r\n    ZYDIS_MNEMONIC_VGF2P8MULB,\r\n    ZYDIS_MNEMONIC_VGMAXABSPS,\r\n    ZYDIS_MNEMONIC_VGMAXPD,\r\n    ZYDIS_MNEMONIC_VGMAXPS,\r\n    ZYDIS_MNEMONIC_VGMINPD,\r\n    ZYDIS_MNEMONIC_VGMINPS,\r\n    ZYDIS_MNEMONIC_VHADDPD,\r\n    ZYDIS_MNEMONIC_VHADDPS,\r\n    ZYDIS_MNEMONIC_VHSUBPD,\r\n    ZYDIS_MNEMONIC_VHSUBPS,\r\n    ZYDIS_MNEMONIC_VINSERTF128,\r\n    ZYDIS_MNEMONIC_VINSERTF32X4,\r\n    ZYDIS_MNEMONIC_VINSERTF32X8,\r\n    ZYDIS_MNEMONIC_VINSERTF64X2,\r\n    ZYDIS_MNEMONIC_VINSERTF64X4,\r\n    ZYDIS_MNEMONIC_VINSERTI128,\r\n    ZYDIS_MNEMONIC_VINSERTI32X4,\r\n    ZYDIS_MNEMONIC_VINSERTI32X8,\r\n    ZYDIS_MNEMONIC_VINSERTI64X2,\r\n    ZYDIS_MNEMONIC_VINSERTI64X4,\r\n    ZYDIS_MNEMONIC_VINSERTPS,\r\n    ZYDIS_MNEMONIC_VLDDQU,\r\n    ZYDIS_MNEMONIC_VLDMXCSR,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKHD,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKHPD,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKHPS,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKHQ,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKLD,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKLPD,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKLPS,\r\n    ZYDIS_MNEMONIC_VLOADUNPACKLQ,\r\n    ZYDIS_MNEMONIC_VLOG2PS,\r\n    ZYDIS_MNEMONIC_VMASKMOVDQU,\r\n    ZYDIS_MNEMONIC_VMASKMOVPD,\r\n    ZYDIS_MNEMONIC_VMASKMOVPS,\r\n    ZYDIS_MNEMONIC_VMAXPD,\r\n    ZYDIS_MNEMONIC_VMAXPH,\r\n    ZYDIS_MNEMONIC_VMAXPS,\r\n    ZYDIS_MNEMONIC_VMAXSD,\r\n    ZYDIS_MNEMONIC_VMAXSH,\r\n    ZYDIS_MNEMONIC_VMAXSS,\r\n    ZYDIS_MNEMONIC_VMCALL,\r\n    ZYDIS_MNEMONIC_VMCLEAR,\r\n    ZYDIS_MNEMONIC_VMFUNC,\r\n    ZYDIS_MNEMONIC_VMINPD,\r\n    ZYDIS_MNEMONIC_VMINPH,\r\n    ZYDIS_MNEMONIC_VMINPS,\r\n    ZYDIS_MNEMONIC_VMINSD,\r\n    ZYDIS_MNEMONIC_VMINSH,\r\n    ZYDIS_MNEMONIC_VMINSS,\r\n    ZYDIS_MNEMONIC_VMLAUNCH,\r\n    ZYDIS_MNEMONIC_VMLOAD,\r\n    ZYDIS_MNEMONIC_VMMCALL,\r\n    ZYDIS_MNEMONIC_VMOVAPD,\r\n    ZYDIS_MNEMONIC_VMOVAPS,\r\n    ZYDIS_MNEMONIC_VMOVD,\r\n    ZYDIS_MNEMONIC_VMOVDDUP,\r\n    ZYDIS_MNEMONIC_VMOVDQA,\r\n    ZYDIS_MNEMONIC_VMOVDQA32,\r\n    ZYDIS_MNEMONIC_VMOVDQA64,\r\n    ZYDIS_MNEMONIC_VMOVDQU,\r\n    ZYDIS_MNEMONIC_VMOVDQU16,\r\n    ZYDIS_MNEMONIC_VMOVDQU32,\r\n    ZYDIS_MNEMONIC_VMOVDQU64,\r\n    ZYDIS_MNEMONIC_VMOVDQU8,\r\n    ZYDIS_MNEMONIC_VMOVHLPS,\r\n    ZYDIS_MNEMONIC_VMOVHPD,\r\n    ZYDIS_MNEMONIC_VMOVHPS,\r\n    ZYDIS_MNEMONIC_VMOVLHPS,\r\n    ZYDIS_MNEMONIC_VMOVLPD,\r\n    ZYDIS_MNEMONIC_VMOVLPS,\r\n    ZYDIS_MNEMONIC_VMOVMSKPD,\r\n    ZYDIS_MNEMONIC_VMOVMSKPS,\r\n    ZYDIS_MNEMONIC_VMOVNRAPD,\r\n    ZYDIS_MNEMONIC_VMOVNRAPS,\r\n    ZYDIS_MNEMONIC_VMOVNRNGOAPD,\r\n    ZYDIS_MNEMONIC_VMOVNRNGOAPS,\r\n    ZYDIS_MNEMONIC_VMOVNTDQ,\r\n    ZYDIS_MNEMONIC_VMOVNTDQA,\r\n    ZYDIS_MNEMONIC_VMOVNTPD,\r\n    ZYDIS_MNEMONIC_VMOVNTPS,\r\n    ZYDIS_MNEMONIC_VMOVQ,\r\n    ZYDIS_MNEMONIC_VMOVSD,\r\n    ZYDIS_MNEMONIC_VMOVSH,\r\n    ZYDIS_MNEMONIC_VMOVSHDUP,\r\n    ZYDIS_MNEMONIC_VMOVSLDUP,\r\n    ZYDIS_MNEMONIC_VMOVSS,\r\n    ZYDIS_MNEMONIC_VMOVUPD,\r\n    ZYDIS_MNEMONIC_VMOVUPS,\r\n    ZYDIS_MNEMONIC_VMOVW,\r\n    ZYDIS_MNEMONIC_VMPSADBW,\r\n    ZYDIS_MNEMONIC_VMPTRLD,\r\n    ZYDIS_MNEMONIC_VMPTRST,\r\n    ZYDIS_MNEMONIC_VMREAD,\r\n    ZYDIS_MNEMONIC_VMRESUME,\r\n    ZYDIS_MNEMONIC_VMRUN,\r\n    ZYDIS_MNEMONIC_VMSAVE,\r\n    ZYDIS_MNEMONIC_VMULPD,\r\n    ZYDIS_MNEMONIC_VMULPH,\r\n    ZYDIS_MNEMONIC_VMULPS,\r\n    ZYDIS_MNEMONIC_VMULSD,\r\n    ZYDIS_MNEMONIC_VMULSH,\r\n    ZYDIS_MNEMONIC_VMULSS,\r\n    ZYDIS_MNEMONIC_VMWRITE,\r\n    ZYDIS_MNEMONIC_VMXOFF,\r\n    ZYDIS_MNEMONIC_VMXON,\r\n    ZYDIS_MNEMONIC_VORPD,\r\n    ZYDIS_MNEMONIC_VORPS,\r\n    ZYDIS_MNEMONIC_VP2INTERSECTD,\r\n    ZYDIS_MNEMONIC_VP2INTERSECTQ,\r\n    ZYDIS_MNEMONIC_VP4DPWSSD,\r\n    ZYDIS_MNEMONIC_VP4DPWSSDS,\r\n    ZYDIS_MNEMONIC_VPABSB,\r\n    ZYDIS_MNEMONIC_VPABSD,\r\n    ZYDIS_MNEMONIC_VPABSQ,\r\n    ZYDIS_MNEMONIC_VPABSW,\r\n    ZYDIS_MNEMONIC_VPACKSSDW,\r\n    ZYDIS_MNEMONIC_VPACKSSWB,\r\n    ZYDIS_MNEMONIC_VPACKSTOREHD,\r\n    ZYDIS_MNEMONIC_VPACKSTOREHPD,\r\n    ZYDIS_MNEMONIC_VPACKSTOREHPS,\r\n    ZYDIS_MNEMONIC_VPACKSTOREHQ,\r\n    ZYDIS_MNEMONIC_VPACKSTORELD,\r\n    ZYDIS_MNEMONIC_VPACKSTORELPD,\r\n    ZYDIS_MNEMONIC_VPACKSTORELPS,\r\n    ZYDIS_MNEMONIC_VPACKSTORELQ,\r\n    ZYDIS_MNEMONIC_VPACKUSDW,\r\n    ZYDIS_MNEMONIC_VPACKUSWB,\r\n    ZYDIS_MNEMONIC_VPADCD,\r\n    ZYDIS_MNEMONIC_VPADDB,\r\n    ZYDIS_MNEMONIC_VPADDD,\r\n    ZYDIS_MNEMONIC_VPADDQ,\r\n    ZYDIS_MNEMONIC_VPADDSB,\r\n    ZYDIS_MNEMONIC_VPADDSETCD,\r\n    ZYDIS_MNEMONIC_VPADDSETSD,\r\n    ZYDIS_MNEMONIC_VPADDSW,\r\n    ZYDIS_MNEMONIC_VPADDUSB,\r\n    ZYDIS_MNEMONIC_VPADDUSW,\r\n    ZYDIS_MNEMONIC_VPADDW,\r\n    ZYDIS_MNEMONIC_VPALIGNR,\r\n    ZYDIS_MNEMONIC_VPAND,\r\n    ZYDIS_MNEMONIC_VPANDD,\r\n    ZYDIS_MNEMONIC_VPANDN,\r\n    ZYDIS_MNEMONIC_VPANDND,\r\n    ZYDIS_MNEMONIC_VPANDNQ,\r\n    ZYDIS_MNEMONIC_VPANDQ,\r\n    ZYDIS_MNEMONIC_VPAVGB,\r\n    ZYDIS_MNEMONIC_VPAVGW,\r\n    ZYDIS_MNEMONIC_VPBLENDD,\r\n    ZYDIS_MNEMONIC_VPBLENDMB,\r\n    ZYDIS_MNEMONIC_VPBLENDMD,\r\n    ZYDIS_MNEMONIC_VPBLENDMQ,\r\n    ZYDIS_MNEMONIC_VPBLENDMW,\r\n    ZYDIS_MNEMONIC_VPBLENDVB,\r\n    ZYDIS_MNEMONIC_VPBLENDW,\r\n    ZYDIS_MNEMONIC_VPBROADCASTB,\r\n    ZYDIS_MNEMONIC_VPBROADCASTD,\r\n    ZYDIS_MNEMONIC_VPBROADCASTMB2Q,\r\n    ZYDIS_MNEMONIC_VPBROADCASTMW2D,\r\n    ZYDIS_MNEMONIC_VPBROADCASTQ,\r\n    ZYDIS_MNEMONIC_VPBROADCASTW,\r\n    ZYDIS_MNEMONIC_VPCLMULQDQ,\r\n    ZYDIS_MNEMONIC_VPCMOV,\r\n    ZYDIS_MNEMONIC_VPCMPB,\r\n    ZYDIS_MNEMONIC_VPCMPD,\r\n    ZYDIS_MNEMONIC_VPCMPEQB,\r\n    ZYDIS_MNEMONIC_VPCMPEQD,\r\n    ZYDIS_MNEMONIC_VPCMPEQQ,\r\n    ZYDIS_MNEMONIC_VPCMPEQW,\r\n    ZYDIS_MNEMONIC_VPCMPESTRI,\r\n    ZYDIS_MNEMONIC_VPCMPESTRM,\r\n    ZYDIS_MNEMONIC_VPCMPGTB,\r\n    ZYDIS_MNEMONIC_VPCMPGTD,\r\n    ZYDIS_MNEMONIC_VPCMPGTQ,\r\n    ZYDIS_MNEMONIC_VPCMPGTW,\r\n    ZYDIS_MNEMONIC_VPCMPISTRI,\r\n    ZYDIS_MNEMONIC_VPCMPISTRM,\r\n    ZYDIS_MNEMONIC_VPCMPLTD,\r\n    ZYDIS_MNEMONIC_VPCMPQ,\r\n    ZYDIS_MNEMONIC_VPCMPUB,\r\n    ZYDIS_MNEMONIC_VPCMPUD,\r\n    ZYDIS_MNEMONIC_VPCMPUQ,\r\n    ZYDIS_MNEMONIC_VPCMPUW,\r\n    ZYDIS_MNEMONIC_VPCMPW,\r\n    ZYDIS_MNEMONIC_VPCOMB,\r\n    ZYDIS_MNEMONIC_VPCOMD,\r\n    ZYDIS_MNEMONIC_VPCOMPRESSB,\r\n    ZYDIS_MNEMONIC_VPCOMPRESSD,\r\n    ZYDIS_MNEMONIC_VPCOMPRESSQ,\r\n    ZYDIS_MNEMONIC_VPCOMPRESSW,\r\n    ZYDIS_MNEMONIC_VPCOMQ,\r\n    ZYDIS_MNEMONIC_VPCOMUB,\r\n    ZYDIS_MNEMONIC_VPCOMUD,\r\n    ZYDIS_MNEMONIC_VPCOMUQ,\r\n    ZYDIS_MNEMONIC_VPCOMUW,\r\n    ZYDIS_MNEMONIC_VPCOMW,\r\n    ZYDIS_MNEMONIC_VPCONFLICTD,\r\n    ZYDIS_MNEMONIC_VPCONFLICTQ,\r\n    ZYDIS_MNEMONIC_VPDPBSSD,\r\n    ZYDIS_MNEMONIC_VPDPBSSDS,\r\n    ZYDIS_MNEMONIC_VPDPBSUD,\r\n    ZYDIS_MNEMONIC_VPDPBSUDS,\r\n    ZYDIS_MNEMONIC_VPDPBUSD,\r\n    ZYDIS_MNEMONIC_VPDPBUSDS,\r\n    ZYDIS_MNEMONIC_VPDPBUUD,\r\n    ZYDIS_MNEMONIC_VPDPBUUDS,\r\n    ZYDIS_MNEMONIC_VPDPWSSD,\r\n    ZYDIS_MNEMONIC_VPDPWSSDS,\r\n    ZYDIS_MNEMONIC_VPDPWSUD,\r\n    ZYDIS_MNEMONIC_VPDPWSUDS,\r\n    ZYDIS_MNEMONIC_VPDPWUSD,\r\n    ZYDIS_MNEMONIC_VPDPWUSDS,\r\n    ZYDIS_MNEMONIC_VPDPWUUD,\r\n    ZYDIS_MNEMONIC_VPDPWUUDS,\r\n    ZYDIS_MNEMONIC_VPERM2F128,\r\n    ZYDIS_MNEMONIC_VPERM2I128,\r\n    ZYDIS_MNEMONIC_VPERMB,\r\n    ZYDIS_MNEMONIC_VPERMD,\r\n    ZYDIS_MNEMONIC_VPERMF32X4,\r\n    ZYDIS_MNEMONIC_VPERMI2B,\r\n    ZYDIS_MNEMONIC_VPERMI2D,\r\n    ZYDIS_MNEMONIC_VPERMI2PD,\r\n    ZYDIS_MNEMONIC_VPERMI2PS,\r\n    ZYDIS_MNEMONIC_VPERMI2Q,\r\n    ZYDIS_MNEMONIC_VPERMI2W,\r\n    ZYDIS_MNEMONIC_VPERMIL2PD,\r\n    ZYDIS_MNEMONIC_VPERMIL2PS,\r\n    ZYDIS_MNEMONIC_VPERMILPD,\r\n    ZYDIS_MNEMONIC_VPERMILPS,\r\n    ZYDIS_MNEMONIC_VPERMPD,\r\n    ZYDIS_MNEMONIC_VPERMPS,\r\n    ZYDIS_MNEMONIC_VPERMQ,\r\n    ZYDIS_MNEMONIC_VPERMT2B,\r\n    ZYDIS_MNEMONIC_VPERMT2D,\r\n    ZYDIS_MNEMONIC_VPERMT2PD,\r\n    ZYDIS_MNEMONIC_VPERMT2PS,\r\n    ZYDIS_MNEMONIC_VPERMT2Q,\r\n    ZYDIS_MNEMONIC_VPERMT2W,\r\n    ZYDIS_MNEMONIC_VPERMW,\r\n    ZYDIS_MNEMONIC_VPEXPANDB,\r\n    ZYDIS_MNEMONIC_VPEXPANDD,\r\n    ZYDIS_MNEMONIC_VPEXPANDQ,\r\n    ZYDIS_MNEMONIC_VPEXPANDW,\r\n    ZYDIS_MNEMONIC_VPEXTRB,\r\n    ZYDIS_MNEMONIC_VPEXTRD,\r\n    ZYDIS_MNEMONIC_VPEXTRQ,\r\n    ZYDIS_MNEMONIC_VPEXTRW,\r\n    ZYDIS_MNEMONIC_VPGATHERDD,\r\n    ZYDIS_MNEMONIC_VPGATHERDQ,\r\n    ZYDIS_MNEMONIC_VPGATHERQD,\r\n    ZYDIS_MNEMONIC_VPGATHERQQ,\r\n    ZYDIS_MNEMONIC_VPHADDBD,\r\n    ZYDIS_MNEMONIC_VPHADDBQ,\r\n    ZYDIS_MNEMONIC_VPHADDBW,\r\n    ZYDIS_MNEMONIC_VPHADDD,\r\n    ZYDIS_MNEMONIC_VPHADDDQ,\r\n    ZYDIS_MNEMONIC_VPHADDSW,\r\n    ZYDIS_MNEMONIC_VPHADDUBD,\r\n    ZYDIS_MNEMONIC_VPHADDUBQ,\r\n    ZYDIS_MNEMONIC_VPHADDUBW,\r\n    ZYDIS_MNEMONIC_VPHADDUDQ,\r\n    ZYDIS_MNEMONIC_VPHADDUWD,\r\n    ZYDIS_MNEMONIC_VPHADDUWQ,\r\n    ZYDIS_MNEMONIC_VPHADDW,\r\n    ZYDIS_MNEMONIC_VPHADDWD,\r\n    ZYDIS_MNEMONIC_VPHADDWQ,\r\n    ZYDIS_MNEMONIC_VPHMINPOSUW,\r\n    ZYDIS_MNEMONIC_VPHSUBBW,\r\n    ZYDIS_MNEMONIC_VPHSUBD,\r\n    ZYDIS_MNEMONIC_VPHSUBDQ,\r\n    ZYDIS_MNEMONIC_VPHSUBSW,\r\n    ZYDIS_MNEMONIC_VPHSUBW,\r\n    ZYDIS_MNEMONIC_VPHSUBWD,\r\n    ZYDIS_MNEMONIC_VPINSRB,\r\n    ZYDIS_MNEMONIC_VPINSRD,\r\n    ZYDIS_MNEMONIC_VPINSRQ,\r\n    ZYDIS_MNEMONIC_VPINSRW,\r\n    ZYDIS_MNEMONIC_VPLZCNTD,\r\n    ZYDIS_MNEMONIC_VPLZCNTQ,\r\n    ZYDIS_MNEMONIC_VPMACSDD,\r\n    ZYDIS_MNEMONIC_VPMACSDQH,\r\n    ZYDIS_MNEMONIC_VPMACSDQL,\r\n    ZYDIS_MNEMONIC_VPMACSSDD,\r\n    ZYDIS_MNEMONIC_VPMACSSDQH,\r\n    ZYDIS_MNEMONIC_VPMACSSDQL,\r\n    ZYDIS_MNEMONIC_VPMACSSWD,\r\n    ZYDIS_MNEMONIC_VPMACSSWW,\r\n    ZYDIS_MNEMONIC_VPMACSWD,\r\n    ZYDIS_MNEMONIC_VPMACSWW,\r\n    ZYDIS_MNEMONIC_VPMADCSSWD,\r\n    ZYDIS_MNEMONIC_VPMADCSWD,\r\n    ZYDIS_MNEMONIC_VPMADD231D,\r\n    ZYDIS_MNEMONIC_VPMADD233D,\r\n    ZYDIS_MNEMONIC_VPMADD52HUQ,\r\n    ZYDIS_MNEMONIC_VPMADD52LUQ,\r\n    ZYDIS_MNEMONIC_VPMADDUBSW,\r\n    ZYDIS_MNEMONIC_VPMADDWD,\r\n    ZYDIS_MNEMONIC_VPMASKMOVD,\r\n    ZYDIS_MNEMONIC_VPMASKMOVQ,\r\n    ZYDIS_MNEMONIC_VPMAXSB,\r\n    ZYDIS_MNEMONIC_VPMAXSD,\r\n    ZYDIS_MNEMONIC_VPMAXSQ,\r\n    ZYDIS_MNEMONIC_VPMAXSW,\r\n    ZYDIS_MNEMONIC_VPMAXUB,\r\n    ZYDIS_MNEMONIC_VPMAXUD,\r\n    ZYDIS_MNEMONIC_VPMAXUQ,\r\n    ZYDIS_MNEMONIC_VPMAXUW,\r\n    ZYDIS_MNEMONIC_VPMINSB,\r\n    ZYDIS_MNEMONIC_VPMINSD,\r\n    ZYDIS_MNEMONIC_VPMINSQ,\r\n    ZYDIS_MNEMONIC_VPMINSW,\r\n    ZYDIS_MNEMONIC_VPMINUB,\r\n    ZYDIS_MNEMONIC_VPMINUD,\r\n    ZYDIS_MNEMONIC_VPMINUQ,\r\n    ZYDIS_MNEMONIC_VPMINUW,\r\n    ZYDIS_MNEMONIC_VPMOVB2M,\r\n    ZYDIS_MNEMONIC_VPMOVD2M,\r\n    ZYDIS_MNEMONIC_VPMOVDB,\r\n    ZYDIS_MNEMONIC_VPMOVDW,\r\n    ZYDIS_MNEMONIC_VPMOVM2B,\r\n    ZYDIS_MNEMONIC_VPMOVM2D,\r\n    ZYDIS_MNEMONIC_VPMOVM2Q,\r\n    ZYDIS_MNEMONIC_VPMOVM2W,\r\n    ZYDIS_MNEMONIC_VPMOVMSKB,\r\n    ZYDIS_MNEMONIC_VPMOVQ2M,\r\n    ZYDIS_MNEMONIC_VPMOVQB,\r\n    ZYDIS_MNEMONIC_VPMOVQD,\r\n    ZYDIS_MNEMONIC_VPMOVQW,\r\n    ZYDIS_MNEMONIC_VPMOVSDB,\r\n    ZYDIS_MNEMONIC_VPMOVSDW,\r\n    ZYDIS_MNEMONIC_VPMOVSQB,\r\n    ZYDIS_MNEMONIC_VPMOVSQD,\r\n    ZYDIS_MNEMONIC_VPMOVSQW,\r\n    ZYDIS_MNEMONIC_VPMOVSWB,\r\n    ZYDIS_MNEMONIC_VPMOVSXBD,\r\n    ZYDIS_MNEMONIC_VPMOVSXBQ,\r\n    ZYDIS_MNEMONIC_VPMOVSXBW,\r\n    ZYDIS_MNEMONIC_VPMOVSXDQ,\r\n    ZYDIS_MNEMONIC_VPMOVSXWD,\r\n    ZYDIS_MNEMONIC_VPMOVSXWQ,\r\n    ZYDIS_MNEMONIC_VPMOVUSDB,\r\n    ZYDIS_MNEMONIC_VPMOVUSDW,\r\n    ZYDIS_MNEMONIC_VPMOVUSQB,\r\n    ZYDIS_MNEMONIC_VPMOVUSQD,\r\n    ZYDIS_MNEMONIC_VPMOVUSQW,\r\n    ZYDIS_MNEMONIC_VPMOVUSWB,\r\n    ZYDIS_MNEMONIC_VPMOVW2M,\r\n    ZYDIS_MNEMONIC_VPMOVWB,\r\n    ZYDIS_MNEMONIC_VPMOVZXBD,\r\n    ZYDIS_MNEMONIC_VPMOVZXBQ,\r\n    ZYDIS_MNEMONIC_VPMOVZXBW,\r\n    ZYDIS_MNEMONIC_VPMOVZXDQ,\r\n    ZYDIS_MNEMONIC_VPMOVZXWD,\r\n    ZYDIS_MNEMONIC_VPMOVZXWQ,\r\n    ZYDIS_MNEMONIC_VPMULDQ,\r\n    ZYDIS_MNEMONIC_VPMULHD,\r\n    ZYDIS_MNEMONIC_VPMULHRSW,\r\n    ZYDIS_MNEMONIC_VPMULHUD,\r\n    ZYDIS_MNEMONIC_VPMULHUW,\r\n    ZYDIS_MNEMONIC_VPMULHW,\r\n    ZYDIS_MNEMONIC_VPMULLD,\r\n    ZYDIS_MNEMONIC_VPMULLQ,\r\n    ZYDIS_MNEMONIC_VPMULLW,\r\n    ZYDIS_MNEMONIC_VPMULTISHIFTQB,\r\n    ZYDIS_MNEMONIC_VPMULUDQ,\r\n    ZYDIS_MNEMONIC_VPOPCNTB,\r\n    ZYDIS_MNEMONIC_VPOPCNTD,\r\n    ZYDIS_MNEMONIC_VPOPCNTQ,\r\n    ZYDIS_MNEMONIC_VPOPCNTW,\r\n    ZYDIS_MNEMONIC_VPOR,\r\n    ZYDIS_MNEMONIC_VPORD,\r\n    ZYDIS_MNEMONIC_VPORQ,\r\n    ZYDIS_MNEMONIC_VPPERM,\r\n    ZYDIS_MNEMONIC_VPREFETCH0,\r\n    ZYDIS_MNEMONIC_VPREFETCH1,\r\n    ZYDIS_MNEMONIC_VPREFETCH2,\r\n    ZYDIS_MNEMONIC_VPREFETCHE0,\r\n    ZYDIS_MNEMONIC_VPREFETCHE1,\r\n    ZYDIS_MNEMONIC_VPREFETCHE2,\r\n    ZYDIS_MNEMONIC_VPREFETCHENTA,\r\n    ZYDIS_MNEMONIC_VPREFETCHNTA,\r\n    ZYDIS_MNEMONIC_VPROLD,\r\n    ZYDIS_MNEMONIC_VPROLQ,\r\n    ZYDIS_MNEMONIC_VPROLVD,\r\n    ZYDIS_MNEMONIC_VPROLVQ,\r\n    ZYDIS_MNEMONIC_VPRORD,\r\n    ZYDIS_MNEMONIC_VPRORQ,\r\n    ZYDIS_MNEMONIC_VPRORVD,\r\n    ZYDIS_MNEMONIC_VPRORVQ,\r\n    ZYDIS_MNEMONIC_VPROTB,\r\n    ZYDIS_MNEMONIC_VPROTD,\r\n    ZYDIS_MNEMONIC_VPROTQ,\r\n    ZYDIS_MNEMONIC_VPROTW,\r\n    ZYDIS_MNEMONIC_VPSADBW,\r\n    ZYDIS_MNEMONIC_VPSBBD,\r\n    ZYDIS_MNEMONIC_VPSBBRD,\r\n    ZYDIS_MNEMONIC_VPSCATTERDD,\r\n    ZYDIS_MNEMONIC_VPSCATTERDQ,\r\n    ZYDIS_MNEMONIC_VPSCATTERQD,\r\n    ZYDIS_MNEMONIC_VPSCATTERQQ,\r\n    ZYDIS_MNEMONIC_VPSHAB,\r\n    ZYDIS_MNEMONIC_VPSHAD,\r\n    ZYDIS_MNEMONIC_VPSHAQ,\r\n    ZYDIS_MNEMONIC_VPSHAW,\r\n    ZYDIS_MNEMONIC_VPSHLB,\r\n    ZYDIS_MNEMONIC_VPSHLD,\r\n    ZYDIS_MNEMONIC_VPSHLDD,\r\n    ZYDIS_MNEMONIC_VPSHLDQ,\r\n    ZYDIS_MNEMONIC_VPSHLDVD,\r\n    ZYDIS_MNEMONIC_VPSHLDVQ,\r\n    ZYDIS_MNEMONIC_VPSHLDVW,\r\n    ZYDIS_MNEMONIC_VPSHLDW,\r\n    ZYDIS_MNEMONIC_VPSHLQ,\r\n    ZYDIS_MNEMONIC_VPSHLW,\r\n    ZYDIS_MNEMONIC_VPSHRDD,\r\n    ZYDIS_MNEMONIC_VPSHRDQ,\r\n    ZYDIS_MNEMONIC_VPSHRDVD,\r\n    ZYDIS_MNEMONIC_VPSHRDVQ,\r\n    ZYDIS_MNEMONIC_VPSHRDVW,\r\n    ZYDIS_MNEMONIC_VPSHRDW,\r\n    ZYDIS_MNEMONIC_VPSHUFB,\r\n    ZYDIS_MNEMONIC_VPSHUFBITQMB,\r\n    ZYDIS_MNEMONIC_VPSHUFD,\r\n    ZYDIS_MNEMONIC_VPSHUFHW,\r\n    ZYDIS_MNEMONIC_VPSHUFLW,\r\n    ZYDIS_MNEMONIC_VPSIGNB,\r\n    ZYDIS_MNEMONIC_VPSIGND,\r\n    ZYDIS_MNEMONIC_VPSIGNW,\r\n    ZYDIS_MNEMONIC_VPSLLD,\r\n    ZYDIS_MNEMONIC_VPSLLDQ,\r\n    ZYDIS_MNEMONIC_VPSLLQ,\r\n    ZYDIS_MNEMONIC_VPSLLVD,\r\n    ZYDIS_MNEMONIC_VPSLLVQ,\r\n    ZYDIS_MNEMONIC_VPSLLVW,\r\n    ZYDIS_MNEMONIC_VPSLLW,\r\n    ZYDIS_MNEMONIC_VPSRAD,\r\n    ZYDIS_MNEMONIC_VPSRAQ,\r\n    ZYDIS_MNEMONIC_VPSRAVD,\r\n    ZYDIS_MNEMONIC_VPSRAVQ,\r\n    ZYDIS_MNEMONIC_VPSRAVW,\r\n    ZYDIS_MNEMONIC_VPSRAW,\r\n    ZYDIS_MNEMONIC_VPSRLD,\r\n    ZYDIS_MNEMONIC_VPSRLDQ,\r\n    ZYDIS_MNEMONIC_VPSRLQ,\r\n    ZYDIS_MNEMONIC_VPSRLVD,\r\n    ZYDIS_MNEMONIC_VPSRLVQ,\r\n    ZYDIS_MNEMONIC_VPSRLVW,\r\n    ZYDIS_MNEMONIC_VPSRLW,\r\n    ZYDIS_MNEMONIC_VPSUBB,\r\n    ZYDIS_MNEMONIC_VPSUBD,\r\n    ZYDIS_MNEMONIC_VPSUBQ,\r\n    ZYDIS_MNEMONIC_VPSUBRD,\r\n    ZYDIS_MNEMONIC_VPSUBRSETBD,\r\n    ZYDIS_MNEMONIC_VPSUBSB,\r\n    ZYDIS_MNEMONIC_VPSUBSETBD,\r\n    ZYDIS_MNEMONIC_VPSUBSW,\r\n    ZYDIS_MNEMONIC_VPSUBUSB,\r\n    ZYDIS_MNEMONIC_VPSUBUSW,\r\n    ZYDIS_MNEMONIC_VPSUBW,\r\n    ZYDIS_MNEMONIC_VPTERNLOGD,\r\n    ZYDIS_MNEMONIC_VPTERNLOGQ,\r\n    ZYDIS_MNEMONIC_VPTEST,\r\n    ZYDIS_MNEMONIC_VPTESTMB,\r\n    ZYDIS_MNEMONIC_VPTESTMD,\r\n    ZYDIS_MNEMONIC_VPTESTMQ,\r\n    ZYDIS_MNEMONIC_VPTESTMW,\r\n    ZYDIS_MNEMONIC_VPTESTNMB,\r\n    ZYDIS_MNEMONIC_VPTESTNMD,\r\n    ZYDIS_MNEMONIC_VPTESTNMQ,\r\n    ZYDIS_MNEMONIC_VPTESTNMW,\r\n    ZYDIS_MNEMONIC_VPUNPCKHBW,\r\n    ZYDIS_MNEMONIC_VPUNPCKHDQ,\r\n    ZYDIS_MNEMONIC_VPUNPCKHQDQ,\r\n    ZYDIS_MNEMONIC_VPUNPCKHWD,\r\n    ZYDIS_MNEMONIC_VPUNPCKLBW,\r\n    ZYDIS_MNEMONIC_VPUNPCKLDQ,\r\n    ZYDIS_MNEMONIC_VPUNPCKLQDQ,\r\n    ZYDIS_MNEMONIC_VPUNPCKLWD,\r\n    ZYDIS_MNEMONIC_VPXOR,\r\n    ZYDIS_MNEMONIC_VPXORD,\r\n    ZYDIS_MNEMONIC_VPXORQ,\r\n    ZYDIS_MNEMONIC_VRANGEPD,\r\n    ZYDIS_MNEMONIC_VRANGEPS,\r\n    ZYDIS_MNEMONIC_VRANGESD,\r\n    ZYDIS_MNEMONIC_VRANGESS,\r\n    ZYDIS_MNEMONIC_VRCP14PD,\r\n    ZYDIS_MNEMONIC_VRCP14PS,\r\n    ZYDIS_MNEMONIC_VRCP14SD,\r\n    ZYDIS_MNEMONIC_VRCP14SS,\r\n    ZYDIS_MNEMONIC_VRCP23PS,\r\n    ZYDIS_MNEMONIC_VRCP28PD,\r\n    ZYDIS_MNEMONIC_VRCP28PS,\r\n    ZYDIS_MNEMONIC_VRCP28SD,\r\n    ZYDIS_MNEMONIC_VRCP28SS,\r\n    ZYDIS_MNEMONIC_VRCPPH,\r\n    ZYDIS_MNEMONIC_VRCPPS,\r\n    ZYDIS_MNEMONIC_VRCPSH,\r\n    ZYDIS_MNEMONIC_VRCPSS,\r\n    ZYDIS_MNEMONIC_VREDUCEPD,\r\n    ZYDIS_MNEMONIC_VREDUCEPH,\r\n    ZYDIS_MNEMONIC_VREDUCEPS,\r\n    ZYDIS_MNEMONIC_VREDUCESD,\r\n    ZYDIS_MNEMONIC_VREDUCESH,\r\n    ZYDIS_MNEMONIC_VREDUCESS,\r\n    ZYDIS_MNEMONIC_VRNDFXPNTPD,\r\n    ZYDIS_MNEMONIC_VRNDFXPNTPS,\r\n    ZYDIS_MNEMONIC_VRNDSCALEPD,\r\n    ZYDIS_MNEMONIC_VRNDSCALEPH,\r\n    ZYDIS_MNEMONIC_VRNDSCALEPS,\r\n    ZYDIS_MNEMONIC_VRNDSCALESD,\r\n    ZYDIS_MNEMONIC_VRNDSCALESH,\r\n    ZYDIS_MNEMONIC_VRNDSCALESS,\r\n    ZYDIS_MNEMONIC_VROUNDPD,\r\n    ZYDIS_MNEMONIC_VROUNDPS,\r\n    ZYDIS_MNEMONIC_VROUNDSD,\r\n    ZYDIS_MNEMONIC_VROUNDSS,\r\n    ZYDIS_MNEMONIC_VRSQRT14PD,\r\n    ZYDIS_MNEMONIC_VRSQRT14PS,\r\n    ZYDIS_MNEMONIC_VRSQRT14SD,\r\n    ZYDIS_MNEMONIC_VRSQRT14SS,\r\n    ZYDIS_MNEMONIC_VRSQRT23PS,\r\n    ZYDIS_MNEMONIC_VRSQRT28PD,\r\n    ZYDIS_MNEMONIC_VRSQRT28PS,\r\n    ZYDIS_MNEMONIC_VRSQRT28SD,\r\n    ZYDIS_MNEMONIC_VRSQRT28SS,\r\n    ZYDIS_MNEMONIC_VRSQRTPH,\r\n    ZYDIS_MNEMONIC_VRSQRTPS,\r\n    ZYDIS_MNEMONIC_VRSQRTSH,\r\n    ZYDIS_MNEMONIC_VRSQRTSS,\r\n    ZYDIS_MNEMONIC_VSCALEFPD,\r\n    ZYDIS_MNEMONIC_VSCALEFPH,\r\n    ZYDIS_MNEMONIC_VSCALEFPS,\r\n    ZYDIS_MNEMONIC_VSCALEFSD,\r\n    ZYDIS_MNEMONIC_VSCALEFSH,\r\n    ZYDIS_MNEMONIC_VSCALEFSS,\r\n    ZYDIS_MNEMONIC_VSCALEPS,\r\n    ZYDIS_MNEMONIC_VSCATTERDPD,\r\n    ZYDIS_MNEMONIC_VSCATTERDPS,\r\n    ZYDIS_MNEMONIC_VSCATTERPF0DPD,\r\n    ZYDIS_MNEMONIC_VSCATTERPF0DPS,\r\n    ZYDIS_MNEMONIC_VSCATTERPF0HINTDPD,\r\n    ZYDIS_MNEMONIC_VSCATTERPF0HINTDPS,\r\n    ZYDIS_MNEMONIC_VSCATTERPF0QPD,\r\n    ZYDIS_MNEMONIC_VSCATTERPF0QPS,\r\n    ZYDIS_MNEMONIC_VSCATTERPF1DPD,\r\n    ZYDIS_MNEMONIC_VSCATTERPF1DPS,\r\n    ZYDIS_MNEMONIC_VSCATTERPF1QPD,\r\n    ZYDIS_MNEMONIC_VSCATTERPF1QPS,\r\n    ZYDIS_MNEMONIC_VSCATTERQPD,\r\n    ZYDIS_MNEMONIC_VSCATTERQPS,\r\n    ZYDIS_MNEMONIC_VSHA512MSG1,\r\n    ZYDIS_MNEMONIC_VSHA512MSG2,\r\n    ZYDIS_MNEMONIC_VSHA512RNDS2,\r\n    ZYDIS_MNEMONIC_VSHUFF32X4,\r\n    ZYDIS_MNEMONIC_VSHUFF64X2,\r\n    ZYDIS_MNEMONIC_VSHUFI32X4,\r\n    ZYDIS_MNEMONIC_VSHUFI64X2,\r\n    ZYDIS_MNEMONIC_VSHUFPD,\r\n    ZYDIS_MNEMONIC_VSHUFPS,\r\n    ZYDIS_MNEMONIC_VSM3MSG1,\r\n    ZYDIS_MNEMONIC_VSM3MSG2,\r\n    ZYDIS_MNEMONIC_VSM3RNDS2,\r\n    ZYDIS_MNEMONIC_VSM4KEY4,\r\n    ZYDIS_MNEMONIC_VSM4RNDS4,\r\n    ZYDIS_MNEMONIC_VSQRTPD,\r\n    ZYDIS_MNEMONIC_VSQRTPH,\r\n    ZYDIS_MNEMONIC_VSQRTPS,\r\n    ZYDIS_MNEMONIC_VSQRTSD,\r\n    ZYDIS_MNEMONIC_VSQRTSH,\r\n    ZYDIS_MNEMONIC_VSQRTSS,\r\n    ZYDIS_MNEMONIC_VSTMXCSR,\r\n    ZYDIS_MNEMONIC_VSUBPD,\r\n    ZYDIS_MNEMONIC_VSUBPH,\r\n    ZYDIS_MNEMONIC_VSUBPS,\r\n    ZYDIS_MNEMONIC_VSUBRPD,\r\n    ZYDIS_MNEMONIC_VSUBRPS,\r\n    ZYDIS_MNEMONIC_VSUBSD,\r\n    ZYDIS_MNEMONIC_VSUBSH,\r\n    ZYDIS_MNEMONIC_VSUBSS,\r\n    ZYDIS_MNEMONIC_VTESTPD,\r\n    ZYDIS_MNEMONIC_VTESTPS,\r\n    ZYDIS_MNEMONIC_VUCOMISD,\r\n    ZYDIS_MNEMONIC_VUCOMISH,\r\n    ZYDIS_MNEMONIC_VUCOMISS,\r\n    ZYDIS_MNEMONIC_VUNPCKHPD,\r\n    ZYDIS_MNEMONIC_VUNPCKHPS,\r\n    ZYDIS_MNEMONIC_VUNPCKLPD,\r\n    ZYDIS_MNEMONIC_VUNPCKLPS,\r\n    ZYDIS_MNEMONIC_VXORPD,\r\n    ZYDIS_MNEMONIC_VXORPS,\r\n    ZYDIS_MNEMONIC_VZEROALL,\r\n    ZYDIS_MNEMONIC_VZEROUPPER,\r\n    ZYDIS_MNEMONIC_WBINVD,\r\n    ZYDIS_MNEMONIC_WRFSBASE,\r\n    ZYDIS_MNEMONIC_WRGSBASE,\r\n    ZYDIS_MNEMONIC_WRMSR,\r\n    ZYDIS_MNEMONIC_WRMSRLIST,\r\n    ZYDIS_MNEMONIC_WRMSRNS,\r\n    ZYDIS_MNEMONIC_WRPKRU,\r\n    ZYDIS_MNEMONIC_WRSSD,\r\n    ZYDIS_MNEMONIC_WRSSQ,\r\n    ZYDIS_MNEMONIC_WRUSSD,\r\n    ZYDIS_MNEMONIC_WRUSSQ,\r\n    ZYDIS_MNEMONIC_XABORT,\r\n    ZYDIS_MNEMONIC_XADD,\r\n    ZYDIS_MNEMONIC_XBEGIN,\r\n    ZYDIS_MNEMONIC_XCHG,\r\n    ZYDIS_MNEMONIC_XCRYPT_CBC,\r\n    ZYDIS_MNEMONIC_XCRYPT_CFB,\r\n    ZYDIS_MNEMONIC_XCRYPT_CTR,\r\n    ZYDIS_MNEMONIC_XCRYPT_ECB,\r\n    ZYDIS_MNEMONIC_XCRYPT_OFB,\r\n    ZYDIS_MNEMONIC_XEND,\r\n    ZYDIS_MNEMONIC_XGETBV,\r\n    ZYDIS_MNEMONIC_XLAT,\r\n    ZYDIS_MNEMONIC_XOR,\r\n    ZYDIS_MNEMONIC_XORPD,\r\n    ZYDIS_MNEMONIC_XORPS,\r\n    ZYDIS_MNEMONIC_XRESLDTRK,\r\n    ZYDIS_MNEMONIC_XRSTOR,\r\n    ZYDIS_MNEMONIC_XRSTOR64,\r\n    ZYDIS_MNEMONIC_XRSTORS,\r\n    ZYDIS_MNEMONIC_XRSTORS64,\r\n    ZYDIS_MNEMONIC_XSAVE,\r\n    ZYDIS_MNEMONIC_XSAVE64,\r\n    ZYDIS_MNEMONIC_XSAVEC,\r\n    ZYDIS_MNEMONIC_XSAVEC64,\r\n    ZYDIS_MNEMONIC_XSAVEOPT,\r\n    ZYDIS_MNEMONIC_XSAVEOPT64,\r\n    ZYDIS_MNEMONIC_XSAVES,\r\n    ZYDIS_MNEMONIC_XSAVES64,\r\n    ZYDIS_MNEMONIC_XSETBV,\r\n    ZYDIS_MNEMONIC_XSHA1,\r\n    ZYDIS_MNEMONIC_XSHA256,\r\n    ZYDIS_MNEMONIC_XSTORE,\r\n    ZYDIS_MNEMONIC_XSUSLDTRK,\r\n    ZYDIS_MNEMONIC_XTEST,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_MNEMONIC_MAX_VALUE = ZYDIS_MNEMONIC_XTEST,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_MNEMONIC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MNEMONIC_MAX_VALUE)\r\n  } ZydisMnemonic;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @addtogroup mnemonic Mnemonic\r\n   * Functions for retrieving mnemonic names.\r\n   * @{\r\n   */\r\n  \r\n  /**\r\n   * Returns the specified instruction mnemonic string.\r\n   *\r\n   * @param   mnemonic    The mnemonic.\r\n   *\r\n   * @return  The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed.\r\n   */\r\n  ZYDIS_EXPORT const char* ZydisMnemonicGetString(ZydisMnemonic mnemonic);\r\n  \r\n  /**\r\n   * Returns the specified instruction mnemonic as `ZydisShortString`.\r\n   *\r\n   * @param   mnemonic    The mnemonic.\r\n   *\r\n   * @return  The instruction mnemonic string or `ZYAN_NULL`, if an invalid mnemonic was passed.\r\n   *\r\n   * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.\r\n   */\r\n  ZYDIS_EXPORT const ZydisShortString* ZydisMnemonicGetStringWrapped(ZydisMnemonic mnemonic);\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_MNEMONIC_H */\r\n\r\n//\r\n// Header: Zydis/Register.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/DecoderTypes.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Utility functions and constants for registers.\r\n */\r\n\r\n#ifndef ZYDIS_REGISTER_H\r\n#define ZYDIS_REGISTER_H\r\n\r\n\r\n//\r\n// Header: Zydis/SharedTypes.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/DecoderTypes.h\r\n//   - Zydis/Register.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Defines decoder/encoder-shared macros and types.\r\n */\r\n\r\n#ifndef ZYDIS_SHAREDTYPES_H\r\n#define ZYDIS_SHAREDTYPES_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Constants                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#define ZYDIS_MAX_INSTRUCTION_LENGTH    15\r\n#define ZYDIS_MAX_OPERAND_COUNT         10 // TODO: Auto generate\r\n#define ZYDIS_MAX_OPERAND_COUNT_VISIBLE  5 // TODO: Auto generate\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Machine mode                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisMachineMode` enum.\r\n   */\r\n  typedef enum ZydisMachineMode_\r\n  {\r\n    /**\r\n     * 64 bit mode.\r\n     */\r\n    ZYDIS_MACHINE_MODE_LONG_64,\r\n    /**\r\n     * 32 bit protected mode.\r\n     */\r\n    ZYDIS_MACHINE_MODE_LONG_COMPAT_32,\r\n    /**\r\n     * 16 bit protected mode.\r\n     */\r\n    ZYDIS_MACHINE_MODE_LONG_COMPAT_16,\r\n    /**\r\n     * 32 bit protected mode.\r\n     */\r\n    ZYDIS_MACHINE_MODE_LEGACY_32,\r\n    /**\r\n     * 16 bit protected mode.\r\n     */\r\n    ZYDIS_MACHINE_MODE_LEGACY_16,\r\n    /**\r\n     * 16 bit real mode.\r\n     */\r\n    ZYDIS_MACHINE_MODE_REAL_16,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_MACHINE_MODE_MAX_VALUE = ZYDIS_MACHINE_MODE_REAL_16,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_MACHINE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MACHINE_MODE_MAX_VALUE)\r\n  } ZydisMachineMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Stack width                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisStackWidth` enum.\r\n   */\r\n  typedef enum ZydisStackWidth_\r\n  {\r\n    ZYDIS_STACK_WIDTH_16,\r\n    ZYDIS_STACK_WIDTH_32,\r\n    ZYDIS_STACK_WIDTH_64,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_STACK_WIDTH_MAX_VALUE = ZYDIS_STACK_WIDTH_64,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_STACK_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_STACK_WIDTH_MAX_VALUE)\r\n  } ZydisStackWidth;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Element type                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisElementType` enum.\r\n   */\r\n  typedef enum ZydisElementType_\r\n  {\r\n    ZYDIS_ELEMENT_TYPE_INVALID,\r\n    /**\r\n     * A struct type.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_STRUCT,\r\n    /**\r\n     * Unsigned integer value.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_UINT,\r\n    /**\r\n     * Signed integer value.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_INT,\r\n    /**\r\n     * 16-bit floating point value (`half`).\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_FLOAT16,\r\n    /**\r\n     * 32-bit floating point value (`single`).\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_FLOAT32,\r\n    /**\r\n     * 64-bit floating point value (`double`).\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_FLOAT64,\r\n    /**\r\n     * 80-bit floating point value (`extended`).\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_FLOAT80,\r\n    /**\r\n     * 16-bit brain floating point value.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_BFLOAT16,\r\n    /**\r\n     * Binary coded decimal value.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_LONGBCD,\r\n    /**\r\n     * A condition code (e.g. used by `CMPPD`, `VCMPPD`, ...).\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_CC,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_MAX_VALUE = ZYDIS_ELEMENT_TYPE_CC,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_ELEMENT_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ELEMENT_TYPE_MAX_VALUE)\r\n  } ZydisElementType;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Element size                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisElementSize` datatype.\r\n   */\r\n  typedef ZyanU16 ZydisElementSize;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Operand type                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisOperandType` enum.\r\n   */\r\n  typedef enum ZydisOperandType_\r\n  {\r\n    /**\r\n     * The operand is not used.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_UNUSED,\r\n    /**\r\n     * The operand is a register operand.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_REGISTER,\r\n    /**\r\n     * The operand is a memory operand.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_MEMORY,\r\n    /**\r\n     * The operand is a pointer operand with a segment:offset lvalue.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_POINTER,\r\n    /**\r\n     * The operand is an immediate operand.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_IMMEDIATE,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_MAX_VALUE = ZYDIS_OPERAND_TYPE_IMMEDIATE,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_OPERAND_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_TYPE_MAX_VALUE)\r\n  } ZydisOperandType;\r\n  \r\n  // If asserts are failing here remember to update encoder table generator before fixing asserts\r\n  ZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(\r\n                                            ZYDIS_OPERAND_TYPE_MAX_VALUE - ZYDIS_OPERAND_TYPE_REGISTER) == 2);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Operand encoding                                                                               */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisOperandEncoding` enum.\r\n   */\r\n  typedef enum ZydisOperandEncoding_\r\n  {\r\n    ZYDIS_OPERAND_ENCODING_NONE,\r\n    ZYDIS_OPERAND_ENCODING_MODRM_REG,\r\n    ZYDIS_OPERAND_ENCODING_MODRM_RM,\r\n    ZYDIS_OPERAND_ENCODING_OPCODE,\r\n    ZYDIS_OPERAND_ENCODING_NDSNDD,\r\n    ZYDIS_OPERAND_ENCODING_IS4,\r\n    ZYDIS_OPERAND_ENCODING_MASK,\r\n    ZYDIS_OPERAND_ENCODING_DISP8,\r\n    ZYDIS_OPERAND_ENCODING_DISP16,\r\n    ZYDIS_OPERAND_ENCODING_DISP32,\r\n    ZYDIS_OPERAND_ENCODING_DISP64,\r\n    ZYDIS_OPERAND_ENCODING_DISP16_32_64,\r\n    ZYDIS_OPERAND_ENCODING_DISP32_32_64,\r\n    ZYDIS_OPERAND_ENCODING_DISP16_32_32,\r\n    ZYDIS_OPERAND_ENCODING_UIMM8,\r\n    ZYDIS_OPERAND_ENCODING_UIMM16,\r\n    ZYDIS_OPERAND_ENCODING_UIMM32,\r\n    ZYDIS_OPERAND_ENCODING_UIMM64,\r\n    ZYDIS_OPERAND_ENCODING_UIMM16_32_64,\r\n    ZYDIS_OPERAND_ENCODING_UIMM32_32_64,\r\n    ZYDIS_OPERAND_ENCODING_UIMM16_32_32,\r\n    ZYDIS_OPERAND_ENCODING_SIMM8,\r\n    ZYDIS_OPERAND_ENCODING_SIMM16,\r\n    ZYDIS_OPERAND_ENCODING_SIMM32,\r\n    ZYDIS_OPERAND_ENCODING_SIMM64,\r\n    ZYDIS_OPERAND_ENCODING_SIMM16_32_64,\r\n    ZYDIS_OPERAND_ENCODING_SIMM32_32_64,\r\n    ZYDIS_OPERAND_ENCODING_SIMM16_32_32,\r\n    ZYDIS_OPERAND_ENCODING_JIMM8,\r\n    ZYDIS_OPERAND_ENCODING_JIMM16,\r\n    ZYDIS_OPERAND_ENCODING_JIMM32,\r\n    ZYDIS_OPERAND_ENCODING_JIMM64,\r\n    ZYDIS_OPERAND_ENCODING_JIMM16_32_64,\r\n    ZYDIS_OPERAND_ENCODING_JIMM32_32_64,\r\n    ZYDIS_OPERAND_ENCODING_JIMM16_32_32,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_OPERAND_ENCODING_MAX_VALUE = ZYDIS_OPERAND_ENCODING_JIMM16_32_32,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_OPERAND_ENCODING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ENCODING_MAX_VALUE)\r\n  } ZydisOperandEncoding;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Operand visibility                                                                             */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisOperandVisibility` enum.\r\n   */\r\n  typedef enum ZydisOperandVisibility_\r\n  {\r\n    ZYDIS_OPERAND_VISIBILITY_INVALID,\r\n    /**\r\n     * The operand is explicitly encoded in the instruction.\r\n     */\r\n    ZYDIS_OPERAND_VISIBILITY_EXPLICIT,\r\n    /**\r\n     * The operand is part of the opcode, but listed as an operand.\r\n     */\r\n    ZYDIS_OPERAND_VISIBILITY_IMPLICIT,\r\n    /**\r\n     * The operand is part of the opcode, and not typically listed as an operand.\r\n     */\r\n    ZYDIS_OPERAND_VISIBILITY_HIDDEN,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_OPERAND_VISIBILITY_MAX_VALUE = ZYDIS_OPERAND_VISIBILITY_HIDDEN,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_OPERAND_VISIBILITY_REQUIRED_BITS =\r\n      ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_VISIBILITY_MAX_VALUE)\r\n  } ZydisOperandVisibility;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Operand action                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisOperandAction` enum.\r\n   */\r\n  typedef enum ZydisOperandAction_\r\n  {\r\n    /* ------------------------------------------------------------------------------------------ */\r\n    /* Elemental actions                                                                          */\r\n    /* ------------------------------------------------------------------------------------------ */\r\n    \r\n    /**\r\n     * The operand is read by the instruction.\r\n     */\r\n    ZYDIS_OPERAND_ACTION_READ       = 0x01,\r\n    /**\r\n     * The operand is written by the instruction (must write).\r\n     */\r\n    ZYDIS_OPERAND_ACTION_WRITE      = 0x02,\r\n    /**\r\n     * The operand is conditionally read by the instruction.\r\n     */\r\n    ZYDIS_OPERAND_ACTION_CONDREAD   = 0x04,\r\n    /**\r\n     * The operand is conditionally written by the instruction (may write).\r\n     */\r\n    ZYDIS_OPERAND_ACTION_CONDWRITE  = 0x08,\r\n    \r\n    /* ------------------------------------------------------------------------------------------ */\r\n    /* Combined actions                                                                           */\r\n    /* ------------------------------------------------------------------------------------------ */\r\n    \r\n    /**\r\n     * The operand is read (must read) and written by the instruction (must write).\r\n     */\r\n    ZYDIS_OPERAND_ACTION_READWRITE = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_WRITE,\r\n    /**\r\n     * The operand is conditionally read (may read) and conditionally written by\r\n     * the instruction (may write).\r\n     */\r\n    ZYDIS_OPERAND_ACTION_CONDREAD_CONDWRITE =\r\n      ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_CONDWRITE,\r\n    /**\r\n     * The operand is read (must read) and conditionally written by the\r\n     * instruction (may write).\r\n     */\r\n    ZYDIS_OPERAND_ACTION_READ_CONDWRITE =\r\n      ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDWRITE,\r\n    /**\r\n     * The operand is written (must write) and conditionally read by the\r\n     * instruction (may read).\r\n     */\r\n    ZYDIS_OPERAND_ACTION_CONDREAD_WRITE =\r\n      ZYDIS_OPERAND_ACTION_CONDREAD | ZYDIS_OPERAND_ACTION_WRITE,\r\n    \r\n    /**\r\n     * Mask combining all reading access flags.\r\n     */\r\n    ZYDIS_OPERAND_ACTION_MASK_READ  = ZYDIS_OPERAND_ACTION_READ | ZYDIS_OPERAND_ACTION_CONDREAD,\r\n    /**\r\n     * Mask combining all writing access flags.\r\n     */\r\n    ZYDIS_OPERAND_ACTION_MASK_WRITE = ZYDIS_OPERAND_ACTION_WRITE | ZYDIS_OPERAND_ACTION_CONDWRITE,\r\n    \r\n    /* ------------------------------------------------------------------------------------------ */\r\n    \r\n    /**\r\n     * The minimum number of bits required to represent all values of this bitset.\r\n     */\r\n    ZYDIS_OPERAND_ACTION_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_ACTION_CONDWRITE)\r\n  } ZydisOperandAction;\r\n  \r\n  /**\r\n   * Defines the `ZydisOperandActions` data-type.\r\n   */\r\n  typedef ZyanU8 ZydisOperandActions;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Instruction encoding                                                                           */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisInstructionEncoding` enum.\r\n   */\r\n  typedef enum ZydisInstructionEncoding_\r\n  {\r\n    /**\r\n     * The instruction uses the legacy encoding.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_LEGACY,\r\n    /**\r\n     * The instruction uses the AMD 3DNow-encoding.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_3DNOW,\r\n    /**\r\n     * The instruction uses the AMD XOP-encoding.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_XOP,\r\n    /**\r\n     * The instruction uses the VEX-encoding.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_VEX,\r\n    /**\r\n     * The instruction uses the EVEX-encoding.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_EVEX,\r\n    /**\r\n     * The instruction uses the MVEX-encoding.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_MVEX,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE = ZYDIS_INSTRUCTION_ENCODING_MVEX,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_INSTRUCTION_ENCODING_REQUIRED_BITS =\r\n      ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTRUCTION_ENCODING_MAX_VALUE)\r\n  } ZydisInstructionEncoding;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Opcode map                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisOpcodeMap` enum.\r\n   */\r\n  typedef enum ZydisOpcodeMap_\r\n  {\r\n    ZYDIS_OPCODE_MAP_DEFAULT,\r\n    ZYDIS_OPCODE_MAP_0F,\r\n    ZYDIS_OPCODE_MAP_0F38,\r\n    ZYDIS_OPCODE_MAP_0F3A,\r\n    ZYDIS_OPCODE_MAP_MAP4, // not used\r\n    ZYDIS_OPCODE_MAP_MAP5,\r\n    ZYDIS_OPCODE_MAP_MAP6,\r\n    ZYDIS_OPCODE_MAP_MAP7, // not used\r\n    ZYDIS_OPCODE_MAP_0F0F,\r\n    ZYDIS_OPCODE_MAP_XOP8,\r\n    ZYDIS_OPCODE_MAP_XOP9,\r\n    ZYDIS_OPCODE_MAP_XOPA,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_OPCODE_MAP_MAX_VALUE = ZYDIS_OPCODE_MAP_XOPA,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_OPCODE_MAP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_OPCODE_MAP_MAX_VALUE)\r\n  } ZydisOpcodeMap;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Instruction attributes                                                                         */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * @defgroup instruction_attributes Instruction attributes\r\n   *\r\n   * Constants describing various properties of an instruction. Used in the\r\n   * @ref ZydisDecodedInstruction.attributes and @ref ZydisEncoderRequest.prefixes fields.\r\n   *\r\n   * @{\r\n   */\r\n  \r\n  /**\r\n   * Defines the `ZydisInstructionAttributes` data-type.\r\n   */\r\n  typedef ZyanU64 ZydisInstructionAttributes;\r\n  \r\n  /**\r\n   * The instruction has the `ModRM` byte.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_MODRM                  (1ULL <<  0)\r\n  /**\r\n   * The instruction has the `SIB` byte.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SIB                    (1ULL <<  1)\r\n  /**\r\n   * The instruction has the `REX` prefix.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_REX                    (1ULL <<  2)\r\n  /**\r\n   * The instruction has the `XOP` prefix.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_XOP                    (1ULL <<  3)\r\n  /**\r\n   * The instruction has the `VEX` prefix.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_VEX                    (1ULL <<  4)\r\n  /**\r\n   * The instruction has the `EVEX` prefix.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_EVEX                   (1ULL <<  5)\r\n  /**\r\n   * The instruction has the `MVEX` prefix.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_MVEX                   (1ULL <<  6)\r\n  /**\r\n   * The instruction has one or more operands with position-relative offsets.\r\n   */\r\n#define ZYDIS_ATTRIB_IS_RELATIVE                (1ULL <<  7)\r\n  /**\r\n   * The instruction is privileged.\r\n   *\r\n   * Privileged instructions are any instructions that require a current ring level below 3.\r\n   */\r\n#define ZYDIS_ATTRIB_IS_PRIVILEGED              (1ULL <<  8)\r\n  /**\r\n   * The instruction accesses one or more CPU-flags.\r\n   */\r\n#define ZYDIS_ATTRIB_CPUFLAG_ACCESS             (1ULL <<  9)\r\n  /**\r\n   * The instruction may conditionally read the general CPU state.\r\n   */\r\n#define ZYDIS_ATTRIB_CPU_STATE_CR               (1ULL << 10)\r\n  /**\r\n   * The instruction may conditionally write the general CPU state.\r\n   */\r\n#define ZYDIS_ATTRIB_CPU_STATE_CW               (1ULL << 11)\r\n  /**\r\n   * The instruction may conditionally read the FPU state (X87, MMX).\r\n   */\r\n#define ZYDIS_ATTRIB_FPU_STATE_CR               (1ULL << 12)\r\n  /**\r\n   * The instruction may conditionally write the FPU state (X87, MMX).\r\n   */\r\n#define ZYDIS_ATTRIB_FPU_STATE_CW               (1ULL << 13)\r\n  /**\r\n   * The instruction may conditionally read the XMM state (AVX, AVX2, AVX-512).\r\n   */\r\n#define ZYDIS_ATTRIB_XMM_STATE_CR               (1ULL << 14)\r\n  /**\r\n   * The instruction may conditionally write the XMM state (AVX, AVX2, AVX-512).\r\n   */\r\n#define ZYDIS_ATTRIB_XMM_STATE_CW               (1ULL << 15)\r\n  /**\r\n   * The instruction accepts the `LOCK` prefix (`0xF0`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_LOCK               (1ULL << 16)\r\n  /**\r\n   * The instruction accepts the `REP` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_REP                (1ULL << 17)\r\n  /**\r\n   * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_REPE               (1ULL << 18)\r\n  /**\r\n   * The instruction accepts the `REPE`/`REPZ` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_REPZ               ZYDIS_ATTRIB_ACCEPTS_REPE\r\n  /**\r\n   * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_REPNE              (1ULL << 19)\r\n  /**\r\n   * The instruction accepts the `REPNE`/`REPNZ` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_REPNZ              ZYDIS_ATTRIB_ACCEPTS_REPNE\r\n  /**\r\n   * The instruction accepts the `BND` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_BND                (1ULL << 20)\r\n  /**\r\n   * The instruction accepts the `XACQUIRE` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_XACQUIRE           (1ULL << 21)\r\n  /**\r\n   * The instruction accepts the `XRELEASE` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_XRELEASE           (1ULL << 22)\r\n  /**\r\n   * The instruction accepts the `XACQUIRE`/`XRELEASE` prefixes (`0xF2`, `0xF3`)\r\n   * without the `LOCK` prefix (`0x0F`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_HLE_WITHOUT_LOCK   (1ULL << 23)\r\n  /**\r\n   * The instruction accepts branch hints (0x2E, 0x3E).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_BRANCH_HINTS       (1ULL << 24)\r\n  /**\r\n   * The instruction accepts the `CET` `no-track` prefix (`0x3E`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_NOTRACK            (1ULL << 25)\r\n  /**\r\n   * The instruction accepts segment prefixes (`0x2E`, `0x36`, `0x3E`, `0x26`,\r\n   * `0x64`, `0x65`).\r\n   */\r\n#define ZYDIS_ATTRIB_ACCEPTS_SEGMENT            (1ULL << 26)\r\n  /**\r\n   * The instruction has the `LOCK` prefix (`0xF0`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_LOCK                   (1ULL << 27)\r\n  /**\r\n   * The instruction has the `REP` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_REP                    (1ULL << 28)\r\n  /**\r\n   * The instruction has the `REPE`/`REPZ` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_REPE                   (1ULL << 29)\r\n  /**\r\n   * The instruction has the `REPE`/`REPZ` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_REPZ                   ZYDIS_ATTRIB_HAS_REPE\r\n  /**\r\n   * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_REPNE                  (1ULL << 30)\r\n  /**\r\n   * The instruction has the `REPNE`/`REPNZ` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_REPNZ                  ZYDIS_ATTRIB_HAS_REPNE\r\n  /**\r\n   * The instruction has the `BND` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_BND                    (1ULL << 31)\r\n  /**\r\n   * The instruction has the `XACQUIRE` prefix (`0xF2`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_XACQUIRE               (1ULL << 32)\r\n  /**\r\n   * The instruction has the `XRELEASE` prefix (`0xF3`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_XRELEASE               (1ULL << 33)\r\n  /**\r\n   * The instruction has the branch-not-taken hint (`0x2E`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN       (1ULL << 34)\r\n  /**\r\n   * The instruction has the branch-taken hint (`0x3E`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_BRANCH_TAKEN           (1ULL << 35)\r\n  /**\r\n   * The instruction has the `CET` `no-track` prefix (`0x3E`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_NOTRACK                (1ULL << 36)\r\n  /**\r\n   * The instruction has the `CS` segment modifier (`0x2E`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT_CS             (1ULL << 37)\r\n  /**\r\n   * The instruction has the `SS` segment modifier (`0x36`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT_SS             (1ULL << 38)\r\n  /**\r\n   * The instruction has the `DS` segment modifier (`0x3E`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT_DS             (1ULL << 39)\r\n  /**\r\n   * The instruction has the `ES` segment modifier (`0x26`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT_ES             (1ULL << 40)\r\n  /**\r\n   * The instruction has the `FS` segment modifier (`0x64`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT_FS             (1ULL << 41)\r\n  /**\r\n   * The instruction has the `GS` segment modifier (`0x65`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT_GS             (1ULL << 42)\r\n  /**\r\n   * The instruction has a segment modifier.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_SEGMENT                (ZYDIS_ATTRIB_HAS_SEGMENT_CS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_SS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_DS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_ES | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_FS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_GS)\r\n  /**\r\n   * The instruction has the operand-size override prefix (`0x66`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_OPERANDSIZE            (1ULL << 43) // TODO: rename\r\n  /**\r\n   * The instruction has the address-size override prefix (`0x67`).\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_ADDRESSSIZE            (1ULL << 44) // TODO: rename\r\n  /**\r\n   * The instruction has the `EVEX.b` bit set.\r\n   *\r\n   * This attribute is mainly used by the encoder.\r\n   */\r\n#define ZYDIS_ATTRIB_HAS_EVEX_B                 (1ULL << 45) // TODO: rename\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_SHAREDTYPES_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Registers                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  \r\n  //\r\n  // Header: Zydis/Generated/EnumRegister.h\r\n  //\r\n  // Include stack:\r\n  //   - Zydis/Zydis.h\r\n  //   - Zydis/Decoder.h\r\n  //   - Zydis/DecoderTypes.h\r\n  //   - Zydis/Register.h\r\n  //\r\n  \r\n  /**\r\n   * Defines the `ZydisRegister` enum.\r\n   */\r\n  typedef enum ZydisRegister_\r\n  {\r\n    ZYDIS_REGISTER_NONE,\r\n    \r\n    // General purpose registers  8-bit\r\n    ZYDIS_REGISTER_AL,\r\n    ZYDIS_REGISTER_CL,\r\n    ZYDIS_REGISTER_DL,\r\n    ZYDIS_REGISTER_BL,\r\n    ZYDIS_REGISTER_AH,\r\n    ZYDIS_REGISTER_CH,\r\n    ZYDIS_REGISTER_DH,\r\n    ZYDIS_REGISTER_BH,\r\n    ZYDIS_REGISTER_SPL,\r\n    ZYDIS_REGISTER_BPL,\r\n    ZYDIS_REGISTER_SIL,\r\n    ZYDIS_REGISTER_DIL,\r\n    ZYDIS_REGISTER_R8B,\r\n    ZYDIS_REGISTER_R9B,\r\n    ZYDIS_REGISTER_R10B,\r\n    ZYDIS_REGISTER_R11B,\r\n    ZYDIS_REGISTER_R12B,\r\n    ZYDIS_REGISTER_R13B,\r\n    ZYDIS_REGISTER_R14B,\r\n    ZYDIS_REGISTER_R15B,\r\n    \r\n    // General purpose registers 16-bit\r\n    ZYDIS_REGISTER_AX,\r\n    ZYDIS_REGISTER_CX,\r\n    ZYDIS_REGISTER_DX,\r\n    ZYDIS_REGISTER_BX,\r\n    ZYDIS_REGISTER_SP,\r\n    ZYDIS_REGISTER_BP,\r\n    ZYDIS_REGISTER_SI,\r\n    ZYDIS_REGISTER_DI,\r\n    ZYDIS_REGISTER_R8W,\r\n    ZYDIS_REGISTER_R9W,\r\n    ZYDIS_REGISTER_R10W,\r\n    ZYDIS_REGISTER_R11W,\r\n    ZYDIS_REGISTER_R12W,\r\n    ZYDIS_REGISTER_R13W,\r\n    ZYDIS_REGISTER_R14W,\r\n    ZYDIS_REGISTER_R15W,\r\n    \r\n    // General purpose registers 32-bit\r\n    ZYDIS_REGISTER_EAX,\r\n    ZYDIS_REGISTER_ECX,\r\n    ZYDIS_REGISTER_EDX,\r\n    ZYDIS_REGISTER_EBX,\r\n    ZYDIS_REGISTER_ESP,\r\n    ZYDIS_REGISTER_EBP,\r\n    ZYDIS_REGISTER_ESI,\r\n    ZYDIS_REGISTER_EDI,\r\n    ZYDIS_REGISTER_R8D,\r\n    ZYDIS_REGISTER_R9D,\r\n    ZYDIS_REGISTER_R10D,\r\n    ZYDIS_REGISTER_R11D,\r\n    ZYDIS_REGISTER_R12D,\r\n    ZYDIS_REGISTER_R13D,\r\n    ZYDIS_REGISTER_R14D,\r\n    ZYDIS_REGISTER_R15D,\r\n    \r\n    // General purpose registers 64-bit\r\n    ZYDIS_REGISTER_RAX,\r\n    ZYDIS_REGISTER_RCX,\r\n    ZYDIS_REGISTER_RDX,\r\n    ZYDIS_REGISTER_RBX,\r\n    ZYDIS_REGISTER_RSP,\r\n    ZYDIS_REGISTER_RBP,\r\n    ZYDIS_REGISTER_RSI,\r\n    ZYDIS_REGISTER_RDI,\r\n    ZYDIS_REGISTER_R8,\r\n    ZYDIS_REGISTER_R9,\r\n    ZYDIS_REGISTER_R10,\r\n    ZYDIS_REGISTER_R11,\r\n    ZYDIS_REGISTER_R12,\r\n    ZYDIS_REGISTER_R13,\r\n    ZYDIS_REGISTER_R14,\r\n    ZYDIS_REGISTER_R15,\r\n    \r\n    // Floating point legacy registers\r\n    ZYDIS_REGISTER_ST0,\r\n    ZYDIS_REGISTER_ST1,\r\n    ZYDIS_REGISTER_ST2,\r\n    ZYDIS_REGISTER_ST3,\r\n    ZYDIS_REGISTER_ST4,\r\n    ZYDIS_REGISTER_ST5,\r\n    ZYDIS_REGISTER_ST6,\r\n    ZYDIS_REGISTER_ST7,\r\n    ZYDIS_REGISTER_X87CONTROL,\r\n    ZYDIS_REGISTER_X87STATUS,\r\n    ZYDIS_REGISTER_X87TAG,\r\n    \r\n    // Floating point multimedia registers\r\n    ZYDIS_REGISTER_MM0,\r\n    ZYDIS_REGISTER_MM1,\r\n    ZYDIS_REGISTER_MM2,\r\n    ZYDIS_REGISTER_MM3,\r\n    ZYDIS_REGISTER_MM4,\r\n    ZYDIS_REGISTER_MM5,\r\n    ZYDIS_REGISTER_MM6,\r\n    ZYDIS_REGISTER_MM7,\r\n    \r\n    // Floating point vector registers 128-bit\r\n    ZYDIS_REGISTER_XMM0,\r\n    ZYDIS_REGISTER_XMM1,\r\n    ZYDIS_REGISTER_XMM2,\r\n    ZYDIS_REGISTER_XMM3,\r\n    ZYDIS_REGISTER_XMM4,\r\n    ZYDIS_REGISTER_XMM5,\r\n    ZYDIS_REGISTER_XMM6,\r\n    ZYDIS_REGISTER_XMM7,\r\n    ZYDIS_REGISTER_XMM8,\r\n    ZYDIS_REGISTER_XMM9,\r\n    ZYDIS_REGISTER_XMM10,\r\n    ZYDIS_REGISTER_XMM11,\r\n    ZYDIS_REGISTER_XMM12,\r\n    ZYDIS_REGISTER_XMM13,\r\n    ZYDIS_REGISTER_XMM14,\r\n    ZYDIS_REGISTER_XMM15,\r\n    ZYDIS_REGISTER_XMM16,\r\n    ZYDIS_REGISTER_XMM17,\r\n    ZYDIS_REGISTER_XMM18,\r\n    ZYDIS_REGISTER_XMM19,\r\n    ZYDIS_REGISTER_XMM20,\r\n    ZYDIS_REGISTER_XMM21,\r\n    ZYDIS_REGISTER_XMM22,\r\n    ZYDIS_REGISTER_XMM23,\r\n    ZYDIS_REGISTER_XMM24,\r\n    ZYDIS_REGISTER_XMM25,\r\n    ZYDIS_REGISTER_XMM26,\r\n    ZYDIS_REGISTER_XMM27,\r\n    ZYDIS_REGISTER_XMM28,\r\n    ZYDIS_REGISTER_XMM29,\r\n    ZYDIS_REGISTER_XMM30,\r\n    ZYDIS_REGISTER_XMM31,\r\n    \r\n    // Floating point vector registers 256-bit\r\n    ZYDIS_REGISTER_YMM0,\r\n    ZYDIS_REGISTER_YMM1,\r\n    ZYDIS_REGISTER_YMM2,\r\n    ZYDIS_REGISTER_YMM3,\r\n    ZYDIS_REGISTER_YMM4,\r\n    ZYDIS_REGISTER_YMM5,\r\n    ZYDIS_REGISTER_YMM6,\r\n    ZYDIS_REGISTER_YMM7,\r\n    ZYDIS_REGISTER_YMM8,\r\n    ZYDIS_REGISTER_YMM9,\r\n    ZYDIS_REGISTER_YMM10,\r\n    ZYDIS_REGISTER_YMM11,\r\n    ZYDIS_REGISTER_YMM12,\r\n    ZYDIS_REGISTER_YMM13,\r\n    ZYDIS_REGISTER_YMM14,\r\n    ZYDIS_REGISTER_YMM15,\r\n    ZYDIS_REGISTER_YMM16,\r\n    ZYDIS_REGISTER_YMM17,\r\n    ZYDIS_REGISTER_YMM18,\r\n    ZYDIS_REGISTER_YMM19,\r\n    ZYDIS_REGISTER_YMM20,\r\n    ZYDIS_REGISTER_YMM21,\r\n    ZYDIS_REGISTER_YMM22,\r\n    ZYDIS_REGISTER_YMM23,\r\n    ZYDIS_REGISTER_YMM24,\r\n    ZYDIS_REGISTER_YMM25,\r\n    ZYDIS_REGISTER_YMM26,\r\n    ZYDIS_REGISTER_YMM27,\r\n    ZYDIS_REGISTER_YMM28,\r\n    ZYDIS_REGISTER_YMM29,\r\n    ZYDIS_REGISTER_YMM30,\r\n    ZYDIS_REGISTER_YMM31,\r\n    \r\n    // Floating point vector registers 512-bit\r\n    ZYDIS_REGISTER_ZMM0,\r\n    ZYDIS_REGISTER_ZMM1,\r\n    ZYDIS_REGISTER_ZMM2,\r\n    ZYDIS_REGISTER_ZMM3,\r\n    ZYDIS_REGISTER_ZMM4,\r\n    ZYDIS_REGISTER_ZMM5,\r\n    ZYDIS_REGISTER_ZMM6,\r\n    ZYDIS_REGISTER_ZMM7,\r\n    ZYDIS_REGISTER_ZMM8,\r\n    ZYDIS_REGISTER_ZMM9,\r\n    ZYDIS_REGISTER_ZMM10,\r\n    ZYDIS_REGISTER_ZMM11,\r\n    ZYDIS_REGISTER_ZMM12,\r\n    ZYDIS_REGISTER_ZMM13,\r\n    ZYDIS_REGISTER_ZMM14,\r\n    ZYDIS_REGISTER_ZMM15,\r\n    ZYDIS_REGISTER_ZMM16,\r\n    ZYDIS_REGISTER_ZMM17,\r\n    ZYDIS_REGISTER_ZMM18,\r\n    ZYDIS_REGISTER_ZMM19,\r\n    ZYDIS_REGISTER_ZMM20,\r\n    ZYDIS_REGISTER_ZMM21,\r\n    ZYDIS_REGISTER_ZMM22,\r\n    ZYDIS_REGISTER_ZMM23,\r\n    ZYDIS_REGISTER_ZMM24,\r\n    ZYDIS_REGISTER_ZMM25,\r\n    ZYDIS_REGISTER_ZMM26,\r\n    ZYDIS_REGISTER_ZMM27,\r\n    ZYDIS_REGISTER_ZMM28,\r\n    ZYDIS_REGISTER_ZMM29,\r\n    ZYDIS_REGISTER_ZMM30,\r\n    ZYDIS_REGISTER_ZMM31,\r\n    \r\n    // Matrix registers\r\n    ZYDIS_REGISTER_TMM0,\r\n    ZYDIS_REGISTER_TMM1,\r\n    ZYDIS_REGISTER_TMM2,\r\n    ZYDIS_REGISTER_TMM3,\r\n    ZYDIS_REGISTER_TMM4,\r\n    ZYDIS_REGISTER_TMM5,\r\n    ZYDIS_REGISTER_TMM6,\r\n    ZYDIS_REGISTER_TMM7,\r\n    \r\n    // Flags registers\r\n    ZYDIS_REGISTER_FLAGS,\r\n    ZYDIS_REGISTER_EFLAGS,\r\n    ZYDIS_REGISTER_RFLAGS,\r\n    \r\n    // Instruction-pointer registers\r\n    ZYDIS_REGISTER_IP,\r\n    ZYDIS_REGISTER_EIP,\r\n    ZYDIS_REGISTER_RIP,\r\n    \r\n    // Segment registers\r\n    ZYDIS_REGISTER_ES,\r\n    ZYDIS_REGISTER_CS,\r\n    ZYDIS_REGISTER_SS,\r\n    ZYDIS_REGISTER_DS,\r\n    ZYDIS_REGISTER_FS,\r\n    ZYDIS_REGISTER_GS,\r\n    \r\n    // Table registers\r\n    ZYDIS_REGISTER_GDTR,\r\n    ZYDIS_REGISTER_LDTR,\r\n    ZYDIS_REGISTER_IDTR,\r\n    ZYDIS_REGISTER_TR,\r\n    \r\n    // Test registers\r\n    ZYDIS_REGISTER_TR0,\r\n    ZYDIS_REGISTER_TR1,\r\n    ZYDIS_REGISTER_TR2,\r\n    ZYDIS_REGISTER_TR3,\r\n    ZYDIS_REGISTER_TR4,\r\n    ZYDIS_REGISTER_TR5,\r\n    ZYDIS_REGISTER_TR6,\r\n    ZYDIS_REGISTER_TR7,\r\n    \r\n    // Control registers\r\n    ZYDIS_REGISTER_CR0,\r\n    ZYDIS_REGISTER_CR1,\r\n    ZYDIS_REGISTER_CR2,\r\n    ZYDIS_REGISTER_CR3,\r\n    ZYDIS_REGISTER_CR4,\r\n    ZYDIS_REGISTER_CR5,\r\n    ZYDIS_REGISTER_CR6,\r\n    ZYDIS_REGISTER_CR7,\r\n    ZYDIS_REGISTER_CR8,\r\n    ZYDIS_REGISTER_CR9,\r\n    ZYDIS_REGISTER_CR10,\r\n    ZYDIS_REGISTER_CR11,\r\n    ZYDIS_REGISTER_CR12,\r\n    ZYDIS_REGISTER_CR13,\r\n    ZYDIS_REGISTER_CR14,\r\n    ZYDIS_REGISTER_CR15,\r\n    \r\n    // Debug registers\r\n    ZYDIS_REGISTER_DR0,\r\n    ZYDIS_REGISTER_DR1,\r\n    ZYDIS_REGISTER_DR2,\r\n    ZYDIS_REGISTER_DR3,\r\n    ZYDIS_REGISTER_DR4,\r\n    ZYDIS_REGISTER_DR5,\r\n    ZYDIS_REGISTER_DR6,\r\n    ZYDIS_REGISTER_DR7,\r\n    ZYDIS_REGISTER_DR8,\r\n    ZYDIS_REGISTER_DR9,\r\n    ZYDIS_REGISTER_DR10,\r\n    ZYDIS_REGISTER_DR11,\r\n    ZYDIS_REGISTER_DR12,\r\n    ZYDIS_REGISTER_DR13,\r\n    ZYDIS_REGISTER_DR14,\r\n    ZYDIS_REGISTER_DR15,\r\n    \r\n    // Mask registers\r\n    ZYDIS_REGISTER_K0,\r\n    ZYDIS_REGISTER_K1,\r\n    ZYDIS_REGISTER_K2,\r\n    ZYDIS_REGISTER_K3,\r\n    ZYDIS_REGISTER_K4,\r\n    ZYDIS_REGISTER_K5,\r\n    ZYDIS_REGISTER_K6,\r\n    ZYDIS_REGISTER_K7,\r\n    \r\n    // Bound registers\r\n    ZYDIS_REGISTER_BND0,\r\n    ZYDIS_REGISTER_BND1,\r\n    ZYDIS_REGISTER_BND2,\r\n    ZYDIS_REGISTER_BND3,\r\n    ZYDIS_REGISTER_BNDCFG,\r\n    ZYDIS_REGISTER_BNDSTATUS,\r\n    \r\n    // Uncategorized\r\n    ZYDIS_REGISTER_MXCSR,\r\n    ZYDIS_REGISTER_PKRU,\r\n    ZYDIS_REGISTER_XCR0,\r\n    ZYDIS_REGISTER_UIF,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_REGISTER_MAX_VALUE = ZYDIS_REGISTER_UIF,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_REGISTER_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGISTER_MAX_VALUE)\r\n  } ZydisRegister;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Register kinds                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisRegisterKind` enum.\r\n   *\r\n   * Please note that this enum does not contain a matching entry for all values of the\r\n   * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them\r\n   * for decoding/encoding purposes.\r\n   *\r\n   * These are mainly the registers that can be identified by an id within their corresponding\r\n   * register-class.\r\n   */\r\n  typedef enum ZydisRegisterKind_\r\n  {\r\n    ZYDIS_REGKIND_INVALID,\r\n    ZYDIS_REGKIND_GPR,\r\n    ZYDIS_REGKIND_X87,\r\n    ZYDIS_REGKIND_MMX,\r\n    ZYDIS_REGKIND_VR,\r\n    ZYDIS_REGKIND_TMM,\r\n    ZYDIS_REGKIND_SEGMENT,\r\n    ZYDIS_REGKIND_TEST,\r\n    ZYDIS_REGKIND_CONTROL,\r\n    ZYDIS_REGKIND_DEBUG,\r\n    ZYDIS_REGKIND_MASK,\r\n    ZYDIS_REGKIND_BOUND,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_REGKIND_MAX_VALUE = ZYDIS_REGKIND_BOUND,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_REGKIND_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGKIND_MAX_VALUE)\r\n  } ZydisRegisterKind;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Register classes                                                                               */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisRegisterClass` enum.\r\n   *\r\n   * Please note that this enum does not contain a matching entry for all values of the\r\n   * `ZydisRegister` enum, but only for those registers where it makes sense to logically group them\r\n   * for decoding/encoding purposes.\r\n   *\r\n   * These are mainly the registers that can be identified by an id within their corresponding\r\n   * register-class. The `IP` and `FLAGS` values are exceptions to this rule.\r\n   */\r\n  typedef enum ZydisRegisterClass_\r\n  {\r\n    ZYDIS_REGCLASS_INVALID,\r\n    /**\r\n     * 8-bit general-purpose registers.\r\n     */\r\n    ZYDIS_REGCLASS_GPR8,\r\n    /**\r\n     * 16-bit general-purpose registers.\r\n     */\r\n    ZYDIS_REGCLASS_GPR16,\r\n    /**\r\n     * 32-bit general-purpose registers.\r\n     */\r\n    ZYDIS_REGCLASS_GPR32,\r\n    /**\r\n     * 64-bit general-purpose registers.\r\n     */\r\n    ZYDIS_REGCLASS_GPR64,\r\n    /**\r\n     * Floating point legacy registers.\r\n     */\r\n    ZYDIS_REGCLASS_X87,\r\n    /**\r\n     * Floating point multimedia registers.\r\n     */\r\n    ZYDIS_REGCLASS_MMX,\r\n    /**\r\n     * 128-bit vector registers.\r\n     */\r\n    ZYDIS_REGCLASS_XMM,\r\n    /**\r\n     * 256-bit vector registers.\r\n     */\r\n    ZYDIS_REGCLASS_YMM,\r\n    /**\r\n     * 512-bit vector registers.\r\n     */\r\n    ZYDIS_REGCLASS_ZMM,\r\n    /**\r\n     * Matrix registers.\r\n     */\r\n    ZYDIS_REGCLASS_TMM,\r\n    /*\r\n     * Flags registers.\r\n     */\r\n    ZYDIS_REGCLASS_FLAGS,\r\n    /**\r\n     * Instruction-pointer registers.\r\n     */\r\n    ZYDIS_REGCLASS_IP,\r\n    /**\r\n     * Segment registers.\r\n     */\r\n    ZYDIS_REGCLASS_SEGMENT,\r\n    /**\r\n     * Table registers.\r\n    */\r\n    ZYDIS_REGCLASS_TABLE,\r\n    /**\r\n     * Test registers.\r\n     */\r\n    ZYDIS_REGCLASS_TEST,\r\n    /**\r\n     * Control registers.\r\n     */\r\n    ZYDIS_REGCLASS_CONTROL,\r\n    /**\r\n     * Debug registers.\r\n     */\r\n    ZYDIS_REGCLASS_DEBUG,\r\n    /**\r\n     * Mask registers.\r\n     */\r\n    ZYDIS_REGCLASS_MASK,\r\n    /**\r\n     * Bound registers.\r\n     */\r\n    ZYDIS_REGCLASS_BOUND,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_REGCLASS_MAX_VALUE = ZYDIS_REGCLASS_BOUND,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_REGCLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_REGCLASS_MAX_VALUE)\r\n  } ZydisRegisterClass;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Register width                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisRegisterWidth` data-type.\r\n   */\r\n  typedef ZyanU16 ZydisRegisterWidth;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Register context                                                                               */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisRegisterContext` struct.\r\n   */\r\n  typedef struct ZydisRegisterContext_\r\n  {\r\n    /**\r\n     * The values stored in the register context.\r\n     */\r\n    ZyanU64 values[ZYDIS_REGISTER_MAX_VALUE + 1];\r\n  } ZydisRegisterContext;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @addtogroup register Register\r\n   * Functions allowing retrieval of information about registers.\r\n   * @{\r\n   */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Register                                                                                       */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the register specified by the `register_class` and `id` tuple.\r\n   *\r\n   * @param   register_class  The register class.\r\n   * @param   id              The register id.\r\n   *\r\n   * @return  The register specified by the `register_class` and `id` tuple or `ZYDIS_REGISTER_NONE`,\r\n   *          if an invalid parameter was passed.\r\n   */\r\n  ZYDIS_EXPORT ZydisRegister ZydisRegisterEncode(ZydisRegisterClass register_class, ZyanU8 id);\r\n  \r\n  /**\r\n   * Returns the id of the specified register.\r\n   *\r\n   * @param   reg The register.\r\n   *\r\n   * @return  The id of the specified register, or -1 if an invalid parameter was passed.\r\n   */\r\n  ZYDIS_EXPORT ZyanI8 ZydisRegisterGetId(ZydisRegister reg);\r\n  \r\n  /**\r\n   * Returns the register-class of the specified register.\r\n   *\r\n   * @param   reg The register.\r\n   *\r\n   * @return  The register-class of the specified register.\r\n   */\r\n  ZYDIS_EXPORT ZydisRegisterClass ZydisRegisterGetClass(ZydisRegister reg);\r\n  \r\n  /**\r\n   * Returns the width of the specified register.\r\n   *\r\n   * @param   mode    The active machine mode.\r\n   * @param   reg     The register.\r\n   *\r\n   * @return  The width of the specified register, or `ZYDIS_REGISTER_NONE` if the register is\r\n   *          invalid for the active machine-mode.\r\n   */\r\n  ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterGetWidth(ZydisMachineMode mode, ZydisRegister reg);\r\n  \r\n  /**\r\n   * Returns the largest enclosing register of the given register.\r\n   *\r\n   * @param   mode    The active machine mode.\r\n   * @param   reg     The register.\r\n   *\r\n   * @return  The largest enclosing register of the given register, or `ZYDIS_REGISTER_NONE` if the\r\n   *          register is invalid for the active machine-mode.\r\n   */\r\n  ZYDIS_EXPORT ZydisRegister ZydisRegisterGetLargestEnclosing(ZydisMachineMode mode,\r\n                                                              ZydisRegister reg);\r\n  \r\n  /**\r\n   * Returns the specified register string.\r\n   *\r\n   * @param   reg The register.\r\n   *\r\n   * @return  The register string or `ZYAN_NULL`, if an invalid register was passed.\r\n   */\r\n  ZYDIS_EXPORT const char* ZydisRegisterGetString(ZydisRegister reg);\r\n  \r\n  /**\r\n   * Returns the specified register string as `ZydisShortString`.\r\n   *\r\n   * @param   reg The register.\r\n   *\r\n   * @return  The register string or `ZYAN_NULL`, if an invalid register was passed.\r\n   *\r\n   * The `buffer` of the returned struct is guaranteed to be zero-terminated in this special case.\r\n   */\r\n  ZYDIS_EXPORT const ZydisShortString* ZydisRegisterGetStringWrapped(ZydisRegister reg);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Register class                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the width of the specified register-class.\r\n   *\r\n   * @param   mode            The active machine mode.\r\n   * @param   register_class  The register class.\r\n   *\r\n   * @return  The width of the specified register.\r\n   */\r\n  ZYDIS_EXPORT ZydisRegisterWidth ZydisRegisterClassGetWidth(ZydisMachineMode mode,\r\n                                                             ZydisRegisterClass register_class);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_REGISTER_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Decoded operand                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Operand attributes                                                                             */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisOperandAttributes` data-type.\r\n   */\r\n  typedef ZyanU8 ZydisOperandAttributes;\r\n  \r\n  /**\r\n   * The operand is a `MULTISOURCE4` register operand.\r\n   *\r\n   * This is a special register operand-type used by `4FMAPS` instructions where the given register\r\n   * points to the first register of a register range (4 registers in total).\r\n   *\r\n   * Example: ZMM3 -> [ZMM3..ZMM6]\r\n   */\r\n#define ZYDIS_OATTRIB_IS_MULTISOURCE4   0x01 // (1 <<  0)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Memory type                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisMemoryOperandType` enum.\r\n   */\r\n  typedef enum ZydisMemoryOperandType_\r\n  {\r\n    ZYDIS_MEMOP_TYPE_INVALID,\r\n    /**\r\n     * Normal memory operand.\r\n     */\r\n    ZYDIS_MEMOP_TYPE_MEM,\r\n    /**\r\n     * The memory operand is only used for address-generation. No real memory-access is\r\n     * caused.\r\n     */\r\n    ZYDIS_MEMOP_TYPE_AGEN,\r\n    /**\r\n     * A memory operand using `SIB` addressing form, where the index register is not used\r\n     * in address calculation and scale is ignored. No real memory-access is caused.\r\n     */\r\n    ZYDIS_MEMOP_TYPE_MIB,\r\n    /**\r\n     * A vector `SIB` memory addressing operand (`VSIB`).\r\n     */\r\n    ZYDIS_MEMOP_TYPE_VSIB,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_MEMOP_TYPE_MAX_VALUE = ZYDIS_MEMOP_TYPE_VSIB,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_MEMOP_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MEMOP_TYPE_MAX_VALUE)\r\n  } ZydisMemoryOperandType;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decoded operand                                                                                */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Extended info for register-operands.\r\n   */\r\n  typedef struct ZydisDecodedOperandReg_\r\n  {\r\n    /**\r\n     * The register value.\r\n     */\r\n    ZydisRegister value;\r\n  } ZydisDecodedOperandReg;\r\n  \r\n  /**\r\n   * Extended info for memory-operands.\r\n   */\r\n  typedef struct ZydisDecodedOperandMem_\r\n  {\r\n    /**\r\n     * The type of the memory operand.\r\n     */\r\n    ZydisMemoryOperandType type;\r\n    /**\r\n     * The segment register.\r\n     */\r\n    ZydisRegister segment;\r\n    /**\r\n     * The base register.\r\n     */\r\n    ZydisRegister base;\r\n    /**\r\n     * The index register.\r\n     */\r\n    ZydisRegister index;\r\n    /**\r\n     * The scale factor.\r\n     */\r\n    ZyanU8 scale;\r\n    /**\r\n     * Extended info for memory-operands with displacement.\r\n     */\r\n    struct ZydisDecodedOperandMemDisp_\r\n    {\r\n      /**\r\n       * Signals, if the displacement value is used.\r\n       */\r\n      ZyanBool has_displacement;\r\n      /**\r\n       * The displacement value\r\n       */\r\n      ZyanI64 value;\r\n    } disp;\r\n  } ZydisDecodedOperandMem;\r\n  \r\n  /**\r\n   * Extended info for pointer-operands.\r\n   */\r\n  typedef struct ZydisDecodedOperandPtr_\r\n  {\r\n    ZyanU16 segment;\r\n    ZyanU32 offset;\r\n  } ZydisDecodedOperandPtr;\r\n  \r\n  /**\r\n   * Extended info for immediate-operands.\r\n   */\r\n  typedef struct ZydisDecodedOperandImm_\r\n  {\r\n    /**\r\n     * Signals, if the immediate value is signed.\r\n     */\r\n    ZyanBool is_signed;\r\n    /**\r\n     * Signals, if the immediate value contains a relative offset. You can use\r\n     * `ZydisCalcAbsoluteAddress` to determine the absolute address value.\r\n     */\r\n    ZyanBool is_relative;\r\n    /**\r\n     * The immediate value.\r\n     */\r\n    union ZydisDecodedOperandImmValue_\r\n    {\r\n      ZyanU64 u;\r\n      ZyanI64 s;\r\n    } value;\r\n  } ZydisDecodedOperandImm;\r\n  \r\n  /**\r\n   * Defines the `ZydisDecodedOperand` struct.\r\n   */\r\n  typedef struct ZydisDecodedOperand_\r\n  {\r\n    /**\r\n     * The operand-id.\r\n     */\r\n    ZyanU8 id;\r\n    /**\r\n     * The visibility of the operand.\r\n     */\r\n    ZydisOperandVisibility visibility;\r\n    /**\r\n     * The operand-actions.\r\n     */\r\n    ZydisOperandActions actions;\r\n    /**\r\n     * The operand-encoding.\r\n     */\r\n    ZydisOperandEncoding encoding;\r\n    /**\r\n     * The logical size of the operand (in bits).\r\n     */\r\n    ZyanU16 size;\r\n    /**\r\n     * The element-type.\r\n     */\r\n    ZydisElementType element_type;\r\n    /**\r\n     * The size of a single element.\r\n     */\r\n    ZydisElementSize element_size;\r\n    /**\r\n     * The number of elements.\r\n     */\r\n    ZyanU16 element_count;\r\n    /*\r\n     * Additional operand attributes.\r\n     */\r\n    ZydisOperandAttributes attributes;\r\n    /**\r\n     * The type of the operand.\r\n     */\r\n    ZydisOperandType type;\r\n    /*\r\n     * Operand type specific information.\r\n     *\r\n     * The enabled union variant is determined by the `type` field.\r\n     */\r\n    union\r\n    {\r\n      ZydisDecodedOperandReg reg;\r\n      ZydisDecodedOperandMem mem;\r\n      ZydisDecodedOperandPtr ptr;\r\n      ZydisDecodedOperandImm imm;\r\n    };\r\n  } ZydisDecodedOperand;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Decoded instruction                                                                            */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* CPU/FPU flags                                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisAccessedFlagsMask` data-type.\r\n   */\r\n  typedef ZyanU32 ZydisAccessedFlagsMask;\r\n  \r\n  /**\r\n   * @defgroup decoder_cpu_flags CPU flags\r\n   * @ingroup decoder\r\n   *\r\n   * Constants used for testing CPU flags accessed by an instruction.\r\n   *\r\n   * @{\r\n   */\r\n  \r\n  /**\r\n   * Carry flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_CF    (1ul <<  0)\r\n  /**\r\n   * Parity flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_PF    (1ul <<  2)\r\n  /**\r\n   * Adjust flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_AF    (1ul <<  4)\r\n  /**\r\n   * Zero flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_ZF    (1ul <<  6)\r\n  /**\r\n   * Sign flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_SF    (1ul <<  7)\r\n  /**\r\n   * Trap flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_TF    (1ul <<  8)\r\n  /**\r\n   * Interrupt enable flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_IF    (1ul <<  9)\r\n  /**\r\n   * Direction flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_DF    (1ul << 10)\r\n  /**\r\n   * Overflow flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_OF    (1ul << 11)\r\n  /**\r\n   * I/O privilege level flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_IOPL  (1ul << 12)\r\n  /**\r\n   * Nested task flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_NT    (1ul << 14)\r\n  /**\r\n   * Resume flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_RF    (1ul << 16)\r\n  /**\r\n   * Virtual 8086 mode flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_VM    (1ul << 17)\r\n  /**\r\n   * Alignment check.\r\n   */\r\n#define ZYDIS_CPUFLAG_AC    (1ul << 18)\r\n  /**\r\n   * Virtual interrupt flag.\r\n   */\r\n#define ZYDIS_CPUFLAG_VIF   (1ul << 19)\r\n  /**\r\n   * Virtual interrupt pending.\r\n   */\r\n#define ZYDIS_CPUFLAG_VIP   (1ul << 20)\r\n  /**\r\n   * Able to use CPUID instruction.\r\n   */\r\n#define ZYDIS_CPUFLAG_ID    (1ul << 21)\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /**\r\n   * @defgroup decoder_fpu_flags FPU flags\r\n   * @ingroup decoder\r\n   *\r\n   * Constants used for testing FPU flags accessed by an instruction.\r\n   *\r\n   * @{\r\n   */\r\n  \r\n  /**\r\n   * FPU condition-code flag 0.\r\n   */\r\n#define ZYDIS_FPUFLAG_C0    (1ul <<  0)\r\n  /**\r\n   * FPU condition-code flag 1.\r\n   */\r\n#define ZYDIS_FPUFLAG_C1    (1ul <<  1)\r\n  /**\r\n   * FPU condition-code flag 2.\r\n   */\r\n#define ZYDIS_FPUFLAG_C2    (1ul <<  2)\r\n  /**\r\n   * FPU condition-code flag 3.\r\n   */\r\n#define ZYDIS_FPUFLAG_C3    (1ul <<  3)\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /*\r\n   * Information about CPU/FPU flags accessed by the instruction.\r\n   */\r\n  typedef struct ZydisAccessedFlags_\r\n  {\r\n    /*\r\n     * As mask containing the flags `TESTED` by the instruction.\r\n     */\r\n    ZydisAccessedFlagsMask tested;\r\n    /*\r\n     * As mask containing the flags `MODIFIED` by the instruction.\r\n     */\r\n    ZydisAccessedFlagsMask modified;\r\n    /*\r\n     * As mask containing the flags `SET_0` by the instruction.\r\n     */\r\n    ZydisAccessedFlagsMask set_0;\r\n    /*\r\n     * As mask containing the flags `SET_1` by the instruction.\r\n     */\r\n    ZydisAccessedFlagsMask set_1;\r\n    /*\r\n     * As mask containing the flags `UNDEFINED` by the instruction.\r\n     */\r\n    ZydisAccessedFlagsMask undefined;\r\n  } ZydisAccessedFlags;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Branch types                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisBranchType` enum.\r\n   */\r\n  typedef enum ZydisBranchType_\r\n  {\r\n    /**\r\n     * The instruction is not a branch instruction.\r\n     */\r\n    ZYDIS_BRANCH_TYPE_NONE,\r\n    /**\r\n     * The instruction is a short (8-bit) branch instruction.\r\n     */\r\n    ZYDIS_BRANCH_TYPE_SHORT,\r\n    /**\r\n     * The instruction is a near (16-bit or 32-bit) branch instruction.\r\n     */\r\n    ZYDIS_BRANCH_TYPE_NEAR,\r\n    /**\r\n     * The instruction is a far (inter-segment) branch instruction.\r\n     */\r\n    ZYDIS_BRANCH_TYPE_FAR,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_BRANCH_TYPE_MAX_VALUE = ZYDIS_BRANCH_TYPE_FAR,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_BRANCH_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_TYPE_MAX_VALUE)\r\n  } ZydisBranchType;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* SSE/AVX exception-class                                                                        */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisExceptionClass` enum.\r\n   */\r\n  typedef enum ZydisExceptionClass_\r\n  {\r\n    ZYDIS_EXCEPTION_CLASS_NONE,\r\n    // TODO: FP Exceptions\r\n    ZYDIS_EXCEPTION_CLASS_SSE1,\r\n    ZYDIS_EXCEPTION_CLASS_SSE2,\r\n    ZYDIS_EXCEPTION_CLASS_SSE3,\r\n    ZYDIS_EXCEPTION_CLASS_SSE4,\r\n    ZYDIS_EXCEPTION_CLASS_SSE5,\r\n    ZYDIS_EXCEPTION_CLASS_SSE7,\r\n    ZYDIS_EXCEPTION_CLASS_AVX1,\r\n    ZYDIS_EXCEPTION_CLASS_AVX2,\r\n    ZYDIS_EXCEPTION_CLASS_AVX3,\r\n    ZYDIS_EXCEPTION_CLASS_AVX4,\r\n    ZYDIS_EXCEPTION_CLASS_AVX5,\r\n    ZYDIS_EXCEPTION_CLASS_AVX6,\r\n    ZYDIS_EXCEPTION_CLASS_AVX7,\r\n    ZYDIS_EXCEPTION_CLASS_AVX8,\r\n    ZYDIS_EXCEPTION_CLASS_AVX11,\r\n    ZYDIS_EXCEPTION_CLASS_AVX12,\r\n    ZYDIS_EXCEPTION_CLASS_E1,\r\n    ZYDIS_EXCEPTION_CLASS_E1NF,\r\n    ZYDIS_EXCEPTION_CLASS_E2,\r\n    ZYDIS_EXCEPTION_CLASS_E2NF,\r\n    ZYDIS_EXCEPTION_CLASS_E3,\r\n    ZYDIS_EXCEPTION_CLASS_E3NF,\r\n    ZYDIS_EXCEPTION_CLASS_E4,\r\n    ZYDIS_EXCEPTION_CLASS_E4NF,\r\n    ZYDIS_EXCEPTION_CLASS_E5,\r\n    ZYDIS_EXCEPTION_CLASS_E5NF,\r\n    ZYDIS_EXCEPTION_CLASS_E6,\r\n    ZYDIS_EXCEPTION_CLASS_E6NF,\r\n    ZYDIS_EXCEPTION_CLASS_E7NM,\r\n    ZYDIS_EXCEPTION_CLASS_E7NM128,\r\n    ZYDIS_EXCEPTION_CLASS_E9NF,\r\n    ZYDIS_EXCEPTION_CLASS_E10,\r\n    ZYDIS_EXCEPTION_CLASS_E10NF,\r\n    ZYDIS_EXCEPTION_CLASS_E11,\r\n    ZYDIS_EXCEPTION_CLASS_E11NF,\r\n    ZYDIS_EXCEPTION_CLASS_E12,\r\n    ZYDIS_EXCEPTION_CLASS_E12NP,\r\n    ZYDIS_EXCEPTION_CLASS_K20,\r\n    ZYDIS_EXCEPTION_CLASS_K21,\r\n    ZYDIS_EXCEPTION_CLASS_AMXE1,\r\n    ZYDIS_EXCEPTION_CLASS_AMXE2,\r\n    ZYDIS_EXCEPTION_CLASS_AMXE3,\r\n    ZYDIS_EXCEPTION_CLASS_AMXE4,\r\n    ZYDIS_EXCEPTION_CLASS_AMXE5,\r\n    ZYDIS_EXCEPTION_CLASS_AMXE6,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_EXCEPTION_CLASS_MAX_VALUE = ZYDIS_EXCEPTION_CLASS_AMXE6,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_EXCEPTION_CLASS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_EXCEPTION_CLASS_MAX_VALUE)\r\n  } ZydisExceptionClass;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* AVX mask mode                                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisMaskMode` enum.\r\n   */\r\n  typedef enum ZydisMaskMode_\r\n  {\r\n    ZYDIS_MASK_MODE_INVALID,\r\n    /**\r\n     * Masking is disabled for the current instruction (`K0` register is used).\r\n     */\r\n    ZYDIS_MASK_MODE_DISABLED,\r\n    /**\r\n     * The embedded mask register is used as a merge-mask.\r\n     */\r\n    ZYDIS_MASK_MODE_MERGING,\r\n    /**\r\n     * The embedded mask register is used as a zero-mask.\r\n     */\r\n    ZYDIS_MASK_MODE_ZEROING,\r\n    /**\r\n     * The embedded mask register is used as a control-mask (element selector).\r\n     */\r\n    ZYDIS_MASK_MODE_CONTROL,\r\n    /**\r\n     * The embedded mask register is used as a zeroing control-mask (element selector).\r\n     */\r\n    ZYDIS_MASK_MODE_CONTROL_ZEROING,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_MASK_MODE_MAX_VALUE = ZYDIS_MASK_MODE_CONTROL_ZEROING,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_MASK_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_MASK_MODE_MAX_VALUE)\r\n  } ZydisMaskMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* AVX broadcast-mode                                                                             */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisBroadcastMode` enum.\r\n   */\r\n  typedef enum ZydisBroadcastMode_\r\n  {\r\n    ZYDIS_BROADCAST_MODE_INVALID,\r\n    ZYDIS_BROADCAST_MODE_1_TO_2,\r\n    ZYDIS_BROADCAST_MODE_1_TO_4,\r\n    ZYDIS_BROADCAST_MODE_1_TO_8,\r\n    ZYDIS_BROADCAST_MODE_1_TO_16,\r\n    ZYDIS_BROADCAST_MODE_1_TO_32,\r\n    ZYDIS_BROADCAST_MODE_1_TO_64,\r\n    ZYDIS_BROADCAST_MODE_2_TO_4,\r\n    ZYDIS_BROADCAST_MODE_2_TO_8,\r\n    ZYDIS_BROADCAST_MODE_2_TO_16,\r\n    ZYDIS_BROADCAST_MODE_4_TO_8,\r\n    ZYDIS_BROADCAST_MODE_4_TO_16,\r\n    ZYDIS_BROADCAST_MODE_8_TO_16,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_BROADCAST_MODE_MAX_VALUE = ZYDIS_BROADCAST_MODE_8_TO_16,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_BROADCAST_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BROADCAST_MODE_MAX_VALUE)\r\n  } ZydisBroadcastMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* AVX rounding-mode                                                                              */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisRoundingMode` enum.\r\n   */\r\n  typedef enum ZydisRoundingMode_\r\n  {\r\n    ZYDIS_ROUNDING_MODE_INVALID,\r\n    /**\r\n     * Round to nearest.\r\n     */\r\n    ZYDIS_ROUNDING_MODE_RN,\r\n    /**\r\n     * Round down.\r\n     */\r\n    ZYDIS_ROUNDING_MODE_RD,\r\n    /**\r\n     * Round up.\r\n     */\r\n    ZYDIS_ROUNDING_MODE_RU,\r\n    /**\r\n     * Round towards zero.\r\n     */\r\n    ZYDIS_ROUNDING_MODE_RZ,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_ROUNDING_MODE_MAX_VALUE = ZYDIS_ROUNDING_MODE_RZ,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_ROUNDING_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_ROUNDING_MODE_MAX_VALUE)\r\n  } ZydisRoundingMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* KNC swizzle-mode                                                                               */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisSwizzleMode` enum.\r\n   */\r\n  typedef enum ZydisSwizzleMode_\r\n  {\r\n    ZYDIS_SWIZZLE_MODE_INVALID,\r\n    ZYDIS_SWIZZLE_MODE_DCBA,\r\n    ZYDIS_SWIZZLE_MODE_CDAB,\r\n    ZYDIS_SWIZZLE_MODE_BADC,\r\n    ZYDIS_SWIZZLE_MODE_DACB,\r\n    ZYDIS_SWIZZLE_MODE_AAAA,\r\n    ZYDIS_SWIZZLE_MODE_BBBB,\r\n    ZYDIS_SWIZZLE_MODE_CCCC,\r\n    ZYDIS_SWIZZLE_MODE_DDDD,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_SWIZZLE_MODE_MAX_VALUE = ZYDIS_SWIZZLE_MODE_DDDD,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_SWIZZLE_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SWIZZLE_MODE_MAX_VALUE)\r\n  } ZydisSwizzleMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* KNC conversion-mode                                                                            */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisConversionMode` enum.\r\n   */\r\n  typedef enum ZydisConversionMode_\r\n  {\r\n    ZYDIS_CONVERSION_MODE_INVALID,\r\n    ZYDIS_CONVERSION_MODE_FLOAT16,\r\n    ZYDIS_CONVERSION_MODE_SINT8,\r\n    ZYDIS_CONVERSION_MODE_UINT8,\r\n    ZYDIS_CONVERSION_MODE_SINT16,\r\n    ZYDIS_CONVERSION_MODE_UINT16,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_CONVERSION_MODE_MAX_VALUE = ZYDIS_CONVERSION_MODE_UINT16,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_CONVERSION_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_CONVERSION_MODE_MAX_VALUE)\r\n  } ZydisConversionMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Legacy prefix type                                                                             */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisPrefixType` enum.\r\n   */\r\n  typedef enum ZydisPrefixType_\r\n  {\r\n    /**\r\n     * The prefix is ignored by the instruction.\r\n     *\r\n     * This applies to all prefixes that are not accepted by the instruction in general or the\r\n     * ones that are overwritten by a prefix of the same group closer to the instruction opcode.\r\n     */\r\n    ZYDIS_PREFIX_TYPE_IGNORED,\r\n    /**\r\n     * The prefix is effectively used by the instruction.\r\n     */\r\n    ZYDIS_PREFIX_TYPE_EFFECTIVE,\r\n    /**\r\n     * The prefix is used as a mandatory prefix.\r\n     *\r\n     * A mandatory prefix is interpreted as an opcode extension and has no further effect on the\r\n     * instruction.\r\n     */\r\n    ZYDIS_PREFIX_TYPE_MANDATORY,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_PREFIX_TYPE_MAX_VALUE = ZYDIS_PREFIX_TYPE_MANDATORY,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_PREFIX_TYPE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PREFIX_TYPE_MAX_VALUE)\r\n  } ZydisPrefixType;\r\n  \r\n  // TODO: Check effective for 66/67 prefixes (currently defaults to EFFECTIVE)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decoded instruction                                                                            */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Detailed info about the `REX` prefix.\r\n   */\r\n  typedef struct ZydisDecodedInstructionRawRex_\r\n  {\r\n    /**\r\n     * 64-bit operand-size promotion.\r\n     */\r\n    ZyanU8 W;\r\n    /**\r\n     * Extension of the `ModRM.reg` field.\r\n     */\r\n    ZyanU8 R;\r\n    /**\r\n     * Extension of the `SIB.index` field.\r\n     */\r\n    ZyanU8 X;\r\n    /**\r\n     * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field.\r\n     */\r\n    ZyanU8 B;\r\n    /**\r\n     * The offset of the effective `REX` byte, relative to the beginning of the\r\n     * instruction, in bytes.\r\n     *\r\n     * This offset always points to the \"effective\" `REX` prefix (the one closest to the\r\n     * instruction opcode), if multiple `REX` prefixes are present.\r\n     *\r\n     * Note that the `REX` byte can be the first byte of the instruction, which would lead\r\n     * to an offset of `0`. Please refer to the instruction attributes to check for the\r\n     * presence of the `REX` prefix.\r\n     */\r\n    ZyanU8 offset;\r\n  } ZydisDecodedInstructionRawRex;\r\n  \r\n  /**\r\n   * Detailed info about the `XOP` prefix.\r\n   */\r\n  typedef struct ZydisDecodedInstructionRawXop_\r\n  {\r\n    /**\r\n     * Extension of the `ModRM.reg` field (inverted).\r\n     */\r\n    ZyanU8 R;\r\n    /**\r\n     * Extension of the `SIB.index` field (inverted).\r\n     */\r\n    ZyanU8 X;\r\n    /**\r\n     * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).\r\n     */\r\n    ZyanU8 B;\r\n    /**\r\n     * Opcode-map specifier.\r\n     */\r\n    ZyanU8 m_mmmm;\r\n    /**\r\n     * 64-bit operand-size promotion or opcode-extension.\r\n     */\r\n    ZyanU8 W;\r\n    /**\r\n     * `NDS`/`NDD` (non-destructive-source/destination) register\r\n     * specifier (inverted).\r\n     */\r\n    ZyanU8 vvvv;\r\n    /**\r\n     * Vector-length specifier.\r\n     */\r\n    ZyanU8 L;\r\n    /**\r\n     * Compressed legacy prefix.\r\n     */\r\n    ZyanU8 pp;\r\n    /**\r\n     * The offset of the first xop byte, relative to the beginning of\r\n     * the instruction, in bytes.\r\n     */\r\n    ZyanU8 offset;\r\n  } ZydisDecodedInstructionRawXop;\r\n  \r\n  /**\r\n   * Detailed info about the `VEX` prefix.\r\n   */\r\n  typedef struct ZydisDecodedInstructionRawVex_\r\n  {\r\n    /**\r\n     * Extension of the `ModRM.reg` field (inverted).\r\n     */\r\n    ZyanU8 R;\r\n    /**\r\n     * Extension of the `SIB.index` field (inverted).\r\n     */\r\n    ZyanU8 X;\r\n    /**\r\n     * Extension of the `ModRM.rm`, `SIB.base`, or `opcode.reg` field (inverted).\r\n     */\r\n    ZyanU8 B;\r\n    /**\r\n     * Opcode-map specifier.\r\n     */\r\n    ZyanU8 m_mmmm;\r\n    /**\r\n     * 64-bit operand-size promotion or opcode-extension.\r\n     */\r\n    ZyanU8 W;\r\n    /**\r\n     * `NDS`/`NDD` (non-destructive-source/destination) register specifier\r\n     *  (inverted).\r\n     */\r\n    ZyanU8 vvvv;\r\n    /**\r\n     * Vector-length specifier.\r\n     */\r\n    ZyanU8 L;\r\n    /**\r\n     * Compressed legacy prefix.\r\n     */\r\n    ZyanU8 pp;\r\n    /**\r\n     * The offset of the first `VEX` byte, relative to the beginning of the instruction, in\r\n     * bytes.\r\n     */\r\n    ZyanU8 offset;\r\n    /**\r\n     * The size of the `VEX` prefix, in bytes.\r\n     */\r\n    ZyanU8 size;\r\n  } ZydisDecodedInstructionRawVex;\r\n  \r\n  /**\r\n   * Detailed info about the `EVEX` prefix.\r\n   */\r\n  typedef struct ZydisDecodedInstructionRawEvex\r\n  {\r\n    /**\r\n     * Extension of the `ModRM.reg` field (inverted).\r\n     */\r\n    ZyanU8 R;\r\n    /**\r\n     * Extension of the `SIB.index/vidx` field (inverted).\r\n     */\r\n    ZyanU8 X;\r\n    /**\r\n     * Extension of the `ModRM.rm` or `SIB.base` field (inverted).\r\n     */\r\n    ZyanU8 B;\r\n    /**\r\n     * High-16 register specifier modifier (inverted).\r\n     */\r\n    ZyanU8 R2;\r\n    /**\r\n     * Opcode-map specifier.\r\n     */\r\n    ZyanU8 mmm;\r\n    /**\r\n     * 64-bit operand-size promotion or opcode-extension.\r\n     */\r\n    ZyanU8 W;\r\n    /**\r\n     * `NDS`/`NDD` (non-destructive-source/destination) register specifier\r\n     * (inverted).\r\n     */\r\n    ZyanU8 vvvv;\r\n    /**\r\n     * Compressed legacy prefix.\r\n     */\r\n    ZyanU8 pp;\r\n    /**\r\n     * Zeroing/Merging.\r\n     */\r\n    ZyanU8 z;\r\n    /**\r\n     * Vector-length specifier or rounding-control (most significant bit).\r\n     */\r\n    ZyanU8 L2;\r\n    /**\r\n     * Vector-length specifier or rounding-control (least significant bit).\r\n     */\r\n    ZyanU8 L;\r\n    /**\r\n     * Broadcast/RC/SAE context.\r\n     */\r\n    ZyanU8 b;\r\n    /**\r\n     * High-16 `NDS`/`VIDX` register specifier.\r\n     */\r\n    ZyanU8 V2;\r\n    /**\r\n     * Embedded opmask register specifier.\r\n     */\r\n    ZyanU8 aaa;\r\n    /**\r\n     * The offset of the first evex byte, relative to the beginning of the\r\n     * instruction, in bytes.\r\n     */\r\n    ZyanU8 offset;\r\n  } ZydisDecodedInstructionRawEvex;\r\n  \r\n  /**\r\n   * Detailed info about the `MVEX` prefix.\r\n   */\r\n  typedef struct ZydisDecodedInstructionRawMvex_\r\n  {\r\n    /**\r\n     * Extension of the `ModRM.reg` field (inverted).\r\n     */\r\n    ZyanU8 R;\r\n    /**\r\n     * Extension of the `SIB.index/vidx` field (inverted).\r\n     */\r\n    ZyanU8 X;\r\n    /**\r\n     * Extension of the `ModRM.rm` or `SIB.base` field (inverted).\r\n     */\r\n    ZyanU8 B;\r\n    /**\r\n     * High-16 register specifier modifier (inverted).\r\n     */\r\n    ZyanU8 R2;\r\n    /**\r\n     * Opcode-map specifier.\r\n     */\r\n    ZyanU8 mmmm;\r\n    /**\r\n     * 64-bit operand-size promotion or opcode-extension.\r\n     */\r\n    ZyanU8 W;\r\n    /**\r\n     * `NDS`/`NDD` (non-destructive-source/destination) register specifier\r\n     *  (inverted).\r\n     */\r\n    ZyanU8 vvvv;\r\n    /**\r\n     * Compressed legacy prefix.\r\n     */\r\n    ZyanU8 pp;\r\n    /**\r\n     * Non-temporal/eviction hint.\r\n     */\r\n    ZyanU8 E;\r\n    /**\r\n     * Swizzle/broadcast/up-convert/down-convert/static-rounding controls.\r\n     */\r\n    ZyanU8 SSS;\r\n    /**\r\n     * High-16 `NDS`/`VIDX` register specifier.\r\n     */\r\n    ZyanU8 V2;\r\n    /**\r\n     * Embedded opmask register specifier.\r\n     */\r\n    ZyanU8 kkk;\r\n    /**\r\n     * The offset of the first mvex byte, relative to the beginning of the\r\n     * instruction, in bytes.\r\n     */\r\n    ZyanU8 offset;\r\n  } ZydisDecodedInstructionRawMvex;\r\n  \r\n  /**\r\n   * Extended info for `AVX` instructions.\r\n   */\r\n  typedef struct ZydisDecodedInstructionAvx_\r\n  {\r\n    /**\r\n     * The `AVX` vector-length.\r\n     */\r\n    ZyanU16 vector_length;\r\n    /**\r\n     * Info about the embedded writemask-register (`AVX-512` and `KNC` only).\r\n     */\r\n    struct ZydisDecodedInstructionAvxMask_\r\n    {\r\n      /**\r\n       * The masking mode.\r\n       */\r\n      ZydisMaskMode mode;\r\n      /**\r\n       * The mask register.\r\n       */\r\n      ZydisRegister reg;\r\n    } mask;\r\n    /**\r\n     * Contains info about the `AVX` broadcast.\r\n     */\r\n    struct ZydisDecodedInstructionAvxBroadcast_\r\n    {\r\n      /**\r\n       * Signals, if the broadcast is a static broadcast.\r\n       *\r\n       * This is the case for instructions with inbuilt broadcast functionality, which is\r\n       * always active and not controlled by the `EVEX/MVEX.RC` bits.\r\n       */\r\n      ZyanBool is_static;\r\n      /**\r\n       * The `AVX` broadcast-mode.\r\n       */\r\n      ZydisBroadcastMode mode;\r\n    } broadcast;\r\n    /**\r\n     * Contains info about the `AVX` rounding.\r\n     */\r\n    struct ZydisDecodedInstructionAvxRounding_\r\n    {\r\n      /**\r\n       * The `AVX` rounding-mode.\r\n       */\r\n      ZydisRoundingMode mode;\r\n    } rounding;\r\n    /**\r\n     * Contains info about the `AVX` register-swizzle (`KNC` only).\r\n     */\r\n    struct ZydisDecodedInstructionAvxSwizzle_\r\n    {\r\n      /**\r\n       * The `AVX` register-swizzle mode.\r\n       */\r\n      ZydisSwizzleMode mode;\r\n    } swizzle;\r\n    /**\r\n     * Contains info about the `AVX` data-conversion (`KNC` only).\r\n     */\r\n    struct ZydisDecodedInstructionAvxConversion_\r\n    {\r\n      /**\r\n       * The `AVX` data-conversion mode.\r\n       */\r\n      ZydisConversionMode mode;\r\n    } conversion;\r\n    /**\r\n     * Signals, if the `SAE` (suppress-all-exceptions) functionality is\r\n     * enabled for the instruction.\r\n     */\r\n    ZyanBool has_sae;\r\n    /**\r\n     * Signals, if the instruction has a memory-eviction-hint (`KNC` only).\r\n     */\r\n    ZyanBool has_eviction_hint;\r\n    // TODO: publish EVEX tuple-type and MVEX functionality\r\n  } ZydisDecodedInstructionAvx;\r\n  \r\n  /**\r\n   * Instruction meta info.\r\n   */\r\n  typedef struct ZydisDecodedInstructionMeta_\r\n  {\r\n    /**\r\n     * The instruction category.\r\n     */\r\n    ZydisInstructionCategory category;\r\n    /**\r\n     * The ISA-set.\r\n     */\r\n    ZydisISASet isa_set;\r\n    /**\r\n     * The ISA-set extension.\r\n     */\r\n    ZydisISAExt isa_ext;\r\n    /**\r\n     * The branch type.\r\n     */\r\n    ZydisBranchType branch_type;\r\n    /**\r\n     * The exception class.\r\n     */\r\n    ZydisExceptionClass exception_class;\r\n  } ZydisDecodedInstructionMeta;\r\n  \r\n  /**\r\n   * Detailed info about different instruction-parts like `ModRM`, `SIB` or\r\n   * encoding-prefixes.\r\n   */\r\n  typedef struct ZydisDecodedInstructionRaw_\r\n  {\r\n    /**\r\n     * The number of legacy prefixes.\r\n     */\r\n    ZyanU8 prefix_count;\r\n    /**\r\n     * Detailed info about the legacy prefixes (including `REX`).\r\n     */\r\n    struct ZydisDecodedInstructionRawPrefixes_\r\n    {\r\n      /**\r\n       * The prefix type.\r\n       */\r\n      ZydisPrefixType type;\r\n      /**\r\n       * The prefix byte.\r\n       */\r\n      ZyanU8 value;\r\n    } prefixes[ZYDIS_MAX_INSTRUCTION_LENGTH];\r\n    \r\n    /*\r\n     * Copy of the `encoding` field.\r\n     *\r\n     * This is here to allow the Rust bindings to treat the following union as an `enum`,\r\n     * sparing us a lot of unsafe code. Prefer using the regular `encoding` field in C/C++ code.\r\n     */\r\n    ZydisInstructionEncoding encoding2;\r\n    /*\r\n     * Union for things from various mutually exclusive encodings.\r\n     */\r\n    union\r\n    {\r\n      ZydisDecodedInstructionRawRex rex;\r\n      ZydisDecodedInstructionRawXop xop;\r\n      ZydisDecodedInstructionRawVex vex;\r\n      ZydisDecodedInstructionRawEvex evex;\r\n      ZydisDecodedInstructionRawMvex mvex;\r\n    };\r\n    \r\n    /**\r\n     * Detailed info about the `ModRM` byte.\r\n     */\r\n    struct ZydisDecodedInstructionModRm_\r\n    {\r\n      /**\r\n       * The addressing mode.\r\n       */\r\n      ZyanU8 mod;\r\n      /**\r\n       * Register specifier or opcode-extension.\r\n       */\r\n      ZyanU8 reg;\r\n      /**\r\n       * Register specifier or opcode-extension.\r\n       */\r\n      ZyanU8 rm;\r\n      /**\r\n       * The offset of the `ModRM` byte, relative to the beginning of the\r\n       * instruction, in bytes.\r\n       */\r\n      ZyanU8 offset;\r\n    } modrm;\r\n    /**\r\n     * Detailed info about the `SIB` byte.\r\n     */\r\n    struct ZydisDecodedInstructionRawSib_\r\n    {\r\n      /**\r\n       * The scale factor.\r\n       */\r\n      ZyanU8 scale;\r\n      /**\r\n       * The index-register specifier.\r\n       */\r\n      ZyanU8 index;\r\n      /**\r\n       * The base-register specifier.\r\n       */\r\n      ZyanU8 base;\r\n      /**\r\n       * The offset of the `SIB` byte, relative to the beginning of the\r\n       * instruction, in bytes.\r\n       */\r\n      ZyanU8 offset;\r\n    } sib;\r\n    /**\r\n     * Detailed info about displacement-bytes.\r\n     */\r\n    struct ZydisDecodedInstructionRawDisp_\r\n    {\r\n      /**\r\n       * The displacement value\r\n       */\r\n      ZyanI64 value;\r\n      /**\r\n       * The physical displacement size, in bits.\r\n       */\r\n      ZyanU8 size;\r\n      // TODO: publish cd8 scale\r\n      /**\r\n       * The offset of the displacement data, relative to the beginning of the\r\n       * instruction, in bytes.\r\n       */\r\n      ZyanU8 offset;\r\n    } disp;\r\n    /**\r\n     * Detailed info about immediate-bytes.\r\n     */\r\n    struct ZydisDecodedInstructionRawImm_\r\n    {\r\n      /**\r\n       * Signals, if the immediate value is signed.\r\n       */\r\n      ZyanBool is_signed;\r\n      /**\r\n       * Signals, if the immediate value contains a relative offset. You can use\r\n       * `ZydisCalcAbsoluteAddress` to determine the absolute address value.\r\n       */\r\n      ZyanBool is_relative;\r\n      /**\r\n       * The immediate value.\r\n       */\r\n      union ZydisDecodedInstructionRawImmValue_\r\n      {\r\n        ZyanU64 u;\r\n        ZyanI64 s;\r\n      } value;\r\n      /**\r\n       * The physical immediate size, in bits.\r\n       */\r\n      ZyanU8 size;\r\n      /**\r\n       * The offset of the immediate data, relative to the beginning of the\r\n       * instruction, in bytes.\r\n       */\r\n      ZyanU8 offset;\r\n    } imm[2];\r\n  } ZydisDecodedInstructionRaw;\r\n  \r\n  /**\r\n   * Information about a decoded instruction.\r\n   */\r\n  typedef struct ZydisDecodedInstruction_\r\n  {\r\n    /**\r\n     * The machine mode used to decode this instruction.\r\n     */\r\n    ZydisMachineMode machine_mode;\r\n    /**\r\n     * The instruction-mnemonic.\r\n     */\r\n    ZydisMnemonic mnemonic;\r\n    /**\r\n     * The length of the decoded instruction.\r\n     */\r\n    ZyanU8 length;\r\n    /**\r\n     * The instruction-encoding (`LEGACY`, `3DNOW`, `VEX`, `EVEX`, `XOP`).\r\n     */\r\n    ZydisInstructionEncoding encoding;\r\n    /**\r\n     * The opcode-map.\r\n     */\r\n    ZydisOpcodeMap opcode_map;\r\n    /**\r\n     * The instruction-opcode.\r\n     */\r\n    ZyanU8 opcode;\r\n    /**\r\n     * The stack width.\r\n     */\r\n    ZyanU8 stack_width;\r\n    /**\r\n     * The effective operand width.\r\n     */\r\n    ZyanU8 operand_width;\r\n    /**\r\n     * The effective address width.\r\n     */\r\n    ZyanU8 address_width;\r\n    /**\r\n     * The number of instruction-operands.\r\n     *\r\n     * Explicit and implicit operands are guaranteed to be in the front and ordered as they are\r\n     * printed by the formatter in `Intel` mode. No assumptions can be made about the order of\r\n     * hidden operands, except that they always located behind the explicit and implicit operands.\r\n     */\r\n    ZyanU8 operand_count;\r\n    /**\r\n     * The number of explicit (visible) instruction-operands.\r\n     *\r\n     * Explicit and implicit operands are guaranteed to be in the front and ordered as they are\r\n     * printed by the formatter in `Intel` mode.\r\n     */\r\n    ZyanU8 operand_count_visible;\r\n    /**\r\n     * See @ref instruction_attributes.\r\n     */\r\n    ZydisInstructionAttributes attributes;\r\n    /**\r\n     * Information about CPU flags accessed by the instruction.\r\n     *\r\n     * The bits in the masks correspond to the actual bits in the `FLAGS/EFLAGS/RFLAGS`\r\n     * register. See @ref decoder_cpu_flags.\r\n     */\r\n    const ZydisAccessedFlags* cpu_flags;\r\n    /**\r\n     * Information about FPU flags accessed by the instruction.\r\n     *\r\n     * See @ref decoder_fpu_flags.\r\n     */\r\n    const ZydisAccessedFlags* fpu_flags;\r\n    /**\r\n     * Extended info for `AVX` instructions.\r\n     */\r\n    ZydisDecodedInstructionAvx avx;\r\n    /**\r\n     * Meta info.\r\n     */\r\n    ZydisDecodedInstructionMeta meta;\r\n    /**\r\n     * Detailed info about different instruction-parts like `ModRM`, `SIB` or\r\n     * encoding-prefixes.\r\n     */\r\n    ZydisDecodedInstructionRaw raw;\r\n  } ZydisDecodedInstruction;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decoder context                                                                                */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * The decoder context is used to preserve some internal state between subsequent decode\r\n   * operations for THE SAME instruction.\r\n   *\r\n   * The context is initialized by @c ZydisDecoderDecodeInstruction and required by e.g.\r\n   * @c ZydisDecoderDecodeOperands.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   *\r\n   * This struct is neither ABI nor API stable!\r\n   */\r\n  typedef struct ZydisDecoderContext_\r\n  {\r\n    /**\r\n     * A pointer to the internal instruction definition.\r\n     */\r\n    const void* definition;\r\n    /**\r\n     * Contains the effective operand-size index.\r\n     *\r\n     * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit\r\n     */\r\n    ZyanU8 eosz_index;\r\n    /**\r\n     * Contains the effective address-size index.\r\n     *\r\n     * 0 = 16 bit, 1 = 32 bit, 2 = 64 bit\r\n     */\r\n    ZyanU8 easz_index;\r\n    /**\r\n     * Contains some cached REX/XOP/VEX/EVEX/MVEX values to provide uniform access.\r\n     */\r\n    struct\r\n    {\r\n      ZyanU8 W;\r\n      ZyanU8 R;\r\n      ZyanU8 X;\r\n      ZyanU8 B;\r\n      ZyanU8 L;\r\n      ZyanU8 LL;\r\n      ZyanU8 R2;\r\n      ZyanU8 V2;\r\n      ZyanU8 vvvv;\r\n      ZyanU8 mask;\r\n    } vector_unified;\r\n    /**\r\n     * Information about encoded operand registers.\r\n     */\r\n    struct\r\n    {\r\n      /**\r\n       * Signals if the `modrm.mod == 3` or `reg` form is forced for the instruction.\r\n       */\r\n      ZyanBool is_mod_reg;\r\n      /**\r\n       * The final register id for the `reg` encoded register.\r\n       */\r\n      ZyanU8 id_reg;\r\n      /**\r\n       * The final register id for the `rm` encoded register.\r\n       *\r\n       * This value is only set, if a register is encoded in `modrm.rm`.\r\n       */\r\n      ZyanU8 id_rm;\r\n      /**\r\n       * The final register id for the `ndsndd` (`.vvvv`) encoded register.\r\n       */\r\n      ZyanU8 id_ndsndd;\r\n      /**\r\n       * The final register id for the base register.\r\n       *\r\n       * This value is only set, if a memory operand is encoded in `modrm.rm`.\r\n       */\r\n      ZyanU8 id_base;\r\n      /**\r\n       * The final register id for the index register.\r\n       *\r\n       * This value is only set, if a memory operand is encoded in `modrm.rm` and the `SIB` byte\r\n       * is present.\r\n       */\r\n      ZyanU8 id_index;\r\n    } reg_info;\r\n    /**\r\n     * Internal EVEX-specific information.\r\n     */\r\n    struct\r\n    {\r\n      /**\r\n       * The EVEX tuple-type.\r\n       */\r\n      ZyanU8 tuple_type;\r\n      /**\r\n       * The EVEX element-size.\r\n       */\r\n      ZyanU8 element_size;\r\n    } evex;\r\n    /**\r\n     * Internal MVEX-specific information.\r\n     */\r\n    struct\r\n    {\r\n      /**\r\n       * The MVEX functionality.\r\n       */\r\n      ZyanU8 functionality;\r\n    } mvex;\r\n    /**\r\n     * The scale factor for EVEX/MVEX compressed 8-bit displacement values.\r\n     */\r\n    ZyanU8 cd8_scale; // TODO: Could make sense to expose this in the ZydisDecodedInstruction\r\n  } ZydisDecoderContext;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_INSTRUCTIONINFO_H */\r\n\r\n//\r\n// Header: Zydis/Status.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Status code definitions and check macros.\r\n */\r\n\r\n#ifndef ZYDIS_STATUS_H\r\n#define ZYDIS_STATUS_H\r\n\r\n\r\n//\r\n// Header: Zycore/Status.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Decoder.h\r\n//   - Zydis/Status.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zyan-C)\r\n\r\n  Original Author : Florian Bernd, Joel Hoener\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Status code definitions and check macros.\r\n */\r\n\r\n#ifndef ZYCORE_STATUS_H\r\n#define ZYCORE_STATUS_H\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines the `ZyanStatus` data type.\r\n   */\r\n  typedef ZyanU32 ZyanStatus;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Definition                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines a zyan status code.\r\n   *\r\n   * @param   error   `1`, if the status code signals an error or `0`, if not.\r\n   * @param   module  The module id.\r\n   * @param   code    The actual code.\r\n   *\r\n   * @return  The zyan status code.\r\n   */\r\n#define ZYAN_MAKE_STATUS(error, module, code) \\\r\n(ZyanStatus)((((error) & 0x01u) << 31u) | (((module) & 0x7FFu) << 20u) | ((code) & 0xFFFFFu))\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Checks                                                                                         */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Checks if a zyan operation was successful.\r\n   *\r\n   * @param   status  The zyan status-code to check.\r\n   *\r\n   * @return  `ZYAN_TRUE`, if the operation succeeded or `ZYAN_FALSE`, if not.\r\n   */\r\n#define ZYAN_SUCCESS(status) \\\r\n(!((status) & 0x80000000u))\r\n  \r\n  /**\r\n   * Checks if a zyan operation failed.\r\n   *\r\n   * @param   status  The zyan status-code to check.\r\n   *\r\n   * @return  `ZYAN_TRUE`, if the operation failed or `ZYAN_FALSE`, if not.\r\n   */\r\n#define ZYAN_FAILED(status) \\\r\n((status) & 0x80000000u)\r\n  \r\n  /**\r\n   * Checks if a zyan operation was successful and returns with the status-code, if not.\r\n   *\r\n   * @param   status  The zyan status-code to check.\r\n   */\r\n#define ZYAN_CHECK(status) \\\r\ndo \\\r\n{ \\\r\nconst ZyanStatus status_047620348 = (status); \\\r\nif (!ZYAN_SUCCESS(status_047620348)) \\\r\n{ \\\r\nreturn status_047620348; \\\r\n} \\\r\n} while (0)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Information                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n  * Returns the module id of a zyan status-code.\r\n  *\r\n  * @param   status  The zyan status-code.\r\n  *\r\n  * @return  The module id of the zyan status-code.\r\n  */\r\n#define ZYAN_STATUS_MODULE(status) \\\r\n(((status) >> 20) & 0x7FFu)\r\n  \r\n  /**\r\n  * Returns the code of a zyan status-code.\r\n  *\r\n  * @param   status  The zyan status-code.\r\n  *\r\n  * @return  The code of the zyan status-code.\r\n  */\r\n#define ZYAN_STATUS_CODE(status) \\\r\n((status) & 0xFFFFFu)\r\n  \r\n  /* ============================================================================================== */\r\n  /* Status codes                                                                                   */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Module IDs                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * The zycore generic module id.\r\n   */\r\n#define ZYAN_MODULE_ZYCORE      0x001u\r\n  \r\n  /**\r\n   * The zycore arg-parse submodule id.\r\n   */\r\n#define ZYAN_MODULE_ARGPARSE    0x003u\r\n  \r\n  /**\r\n   * The base module id for user-defined status codes.\r\n   */\r\n#define ZYAN_MODULE_USER        0x3FFu\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Status codes (general purpose)                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * The operation completed successfully.\r\n   */\r\n#define ZYAN_STATUS_SUCCESS \\\r\nZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x00u)\r\n  \r\n  /**\r\n   * The operation failed with an generic error.\r\n   */\r\n#define ZYAN_STATUS_FAILED \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x01u)\r\n  \r\n  /**\r\n   * The operation completed successfully and returned `ZYAN_TRUE`.\r\n   */\r\n#define ZYAN_STATUS_TRUE \\\r\nZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x02u)\r\n  \r\n  /**\r\n   * The operation completed successfully and returned `ZYAN_FALSE`.\r\n   */\r\n#define ZYAN_STATUS_FALSE \\\r\nZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYCORE, 0x03u)\r\n  \r\n  /**\r\n   * An invalid argument was passed to a function.\r\n   */\r\n#define ZYAN_STATUS_INVALID_ARGUMENT \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x04u)\r\n  \r\n  /**\r\n   * An attempt was made to perform an invalid operation.\r\n   */\r\n#define ZYAN_STATUS_INVALID_OPERATION \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x05u)\r\n  \r\n  /**\r\n   * Insufficient privileges to perform the requested operation.\r\n   */\r\n#define ZYAN_STATUS_ACCESS_DENIED \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x06u)\r\n  \r\n  /**\r\n   * The requested entity was not found.\r\n   */\r\n#define ZYAN_STATUS_NOT_FOUND \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x07u)\r\n  \r\n  /**\r\n   * An index passed to a function was out of bounds.\r\n   */\r\n#define ZYAN_STATUS_OUT_OF_RANGE \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x08u)\r\n  \r\n  /**\r\n   * A buffer passed to a function was too small to complete the requested operation.\r\n   */\r\n#define ZYAN_STATUS_INSUFFICIENT_BUFFER_SIZE \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x09u)\r\n  \r\n  /**\r\n   * Insufficient memory to perform the operation.\r\n   */\r\n#define ZYAN_STATUS_NOT_ENOUGH_MEMORY \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Au)\r\n  \r\n  /**\r\n   * An unknown error occurred during a system function call.\r\n   */\r\n#define ZYAN_STATUS_BAD_SYSTEMCALL \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Bu)\r\n  \r\n  /**\r\n   * The process ran out of resources while performing an operation.\r\n   */\r\n#define ZYAN_STATUS_OUT_OF_RESOURCES \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Cu)\r\n  \r\n  /**\r\n   * A dependency library was not found or does have an unexpected version number or\r\n   * feature-set.\r\n   */\r\n#define ZYAN_STATUS_MISSING_DEPENDENCY \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYCORE, 0x0Du)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Status codes (arg parse)                                                                       */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Argument was not expected.\r\n   */\r\n#define ZYAN_STATUS_ARG_NOT_UNDERSTOOD \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x00u)\r\n  \r\n  /**\r\n   * Too few arguments were provided.\r\n   */\r\n#define ZYAN_STATUS_TOO_FEW_ARGS \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x01u)\r\n  \r\n  /**\r\n   * Too many arguments were provided.\r\n   */\r\n#define ZYAN_STATUS_TOO_MANY_ARGS \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x02u)\r\n  \r\n  /**\r\n   * An argument that expected a value misses its value.\r\n   */\r\n#define ZYAN_STATUS_ARG_MISSES_VALUE \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x03u)\r\n  \r\n  /**\r\n  * A required argument is missing.\r\n  */\r\n#define ZYAN_STATUS_REQUIRED_ARG_MISSING \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ARGPARSE, 0x04u)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYCORE_STATUS_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Status codes                                                                                   */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Module IDs                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * The zydis module id.\r\n   */\r\n#define ZYAN_MODULE_ZYDIS   0x002u\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Status codes                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decoder                                                                                        */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * An attempt was made to read data from an input data-source that has no more\r\n   * data available.\r\n   */\r\n#define ZYDIS_STATUS_NO_MORE_DATA \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x00u)\r\n  \r\n  /**\r\n   * An general error occured while decoding the current instruction. The\r\n   * instruction might be undefined.\r\n   */\r\n#define ZYDIS_STATUS_DECODING_ERROR \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x01u)\r\n  \r\n  /**\r\n   * The instruction exceeded the maximum length of 15 bytes.\r\n   */\r\n#define ZYDIS_STATUS_INSTRUCTION_TOO_LONG \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x02u)\r\n  \r\n  /**\r\n   * The instruction encoded an invalid register.\r\n   */\r\n#define ZYDIS_STATUS_BAD_REGISTER \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x03u)\r\n  \r\n  /**\r\n   * A lock-prefix (F0) was found while decoding an instruction that does not\r\n   * support locking.\r\n   */\r\n#define ZYDIS_STATUS_ILLEGAL_LOCK \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x04u)\r\n  \r\n  /**\r\n   * A legacy-prefix (F2, F3, 66) was found while decoding a XOP/VEX/EVEX/MVEX\r\n   * instruction.\r\n   */\r\n#define ZYDIS_STATUS_ILLEGAL_LEGACY_PFX \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x05u)\r\n  \r\n  /**\r\n   * A rex-prefix was found while decoding a XOP/VEX/EVEX/MVEX instruction.\r\n   */\r\n#define ZYDIS_STATUS_ILLEGAL_REX \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x06u)\r\n  \r\n  /**\r\n   * An invalid opcode-map value was found while decoding a XOP/VEX/EVEX/MVEX-prefix.\r\n   */\r\n#define ZYDIS_STATUS_INVALID_MAP \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x07u)\r\n  \r\n  /**\r\n   * An error occured while decoding the EVEX-prefix.\r\n   */\r\n#define ZYDIS_STATUS_MALFORMED_EVEX \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x08u)\r\n  \r\n  /**\r\n   * An error occured while decoding the MVEX-prefix.\r\n   */\r\n#define ZYDIS_STATUS_MALFORMED_MVEX \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x09u)\r\n  \r\n  /**\r\n   * An invalid write-mask was specified for an EVEX/MVEX instruction.\r\n   */\r\n#define ZYDIS_STATUS_INVALID_MASK \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Au)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Formatter                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returning this status code in some specified formatter callbacks will cause\r\n   * the formatter to omit the corresponding token.\r\n   *\r\n   * Valid callbacks:\r\n   * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`\r\n   * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`\r\n   */\r\n#define ZYDIS_STATUS_SKIP_TOKEN \\\r\nZYAN_MAKE_STATUS(0u, ZYAN_MODULE_ZYDIS, 0x0Bu)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Encoder                                                                                        */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#define ZYDIS_STATUS_IMPOSSIBLE_INSTRUCTION \\\r\nZYAN_MAKE_STATUS(1u, ZYAN_MODULE_ZYDIS, 0x0Cu)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_STATUS_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decoder mode                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisDecoderMode` enum.\r\n   */\r\n  typedef enum ZydisDecoderMode_\r\n  {\r\n    /**\r\n     * Enables minimal instruction decoding without semantic analysis.\r\n     *\r\n     * This mode provides access to the mnemonic, the instruction-length, the effective\r\n     * operand-size, the effective address-width, some attributes (e.g. `ZYDIS_ATTRIB_IS_RELATIVE`)\r\n     * and all of the information in the `raw` field of the `ZydisDecodedInstruction` struct.\r\n     *\r\n     * Operands, most attributes and other specific information (like `AVX` info) are not\r\n     * accessible in this mode.\r\n     *\r\n     * This mode is NOT enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_MINIMAL,\r\n    /**\r\n     * Enables the `AMD`-branch mode.\r\n     *\r\n     * Intel ignores the operand-size override-prefix (`0x66`) for all branches with 32-bit\r\n     * immediates and forces the operand-size of the instruction to 64-bit in 64-bit mode.\r\n     * In `AMD`-branch mode `0x66` is not ignored and changes the operand-size and the size of the\r\n     * immediate to 16-bit.\r\n     *\r\n     * This mode is NOT enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_AMD_BRANCHES,\r\n    /**\r\n     * Enables `KNC` compatibility-mode.\r\n     *\r\n     * `KNC` and `KNL+` chips are sharing opcodes and encodings for some mask-related instructions.\r\n     * Enable this mode to use the old `KNC` specifications (different mnemonics, operands, ..).\r\n     *\r\n     * This mode is NOT enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_KNC,\r\n    /**\r\n     * Enables the `MPX` mode.\r\n     *\r\n     * The `MPX` isa-extension reuses (overrides) some of the widenop instruction opcodes.\r\n     *\r\n     * This mode is enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_MPX,\r\n    /**\r\n     * Enables the `CET` mode.\r\n     *\r\n     * The `CET` isa-extension reuses (overrides) some of the widenop instruction opcodes.\r\n     *\r\n     * This mode is enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_CET,\r\n    /**\r\n     * Enables the `LZCNT` mode.\r\n     *\r\n     * The `LZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes.\r\n     *\r\n     * This mode is enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_LZCNT,\r\n    /**\r\n     * Enables the `TZCNT` mode.\r\n     *\r\n     * The `TZCNT` isa-extension reuses (overrides) some of the widenop instruction opcodes.\r\n     *\r\n     * This mode is enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_TZCNT,\r\n    /**\r\n     * Enables the `WBNOINVD` mode.\r\n     *\r\n     * The `WBINVD` instruction is interpreted as `WBNOINVD` on ICL chips, if a `F3` prefix is\r\n     * used.\r\n     *\r\n     * This mode is disabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_WBNOINVD,\r\n    /**\r\n    * Enables the `CLDEMOTE` mode.\r\n    *\r\n    * The `CLDEMOTE` isa-extension reuses (overrides) some of the widenop instruction opcodes.\r\n    *\r\n    * This mode is enabled by default.\r\n    */\r\n    ZYDIS_DECODER_MODE_CLDEMOTE,\r\n    /**\r\n     * Enables the `IPREFETCH` mode.\r\n     *\r\n     * The `IPREFETCH` isa-extension reuses (overrides) some of the widenop instruction opcodes.\r\n     *\r\n     * This mode is enabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_IPREFETCH,\r\n    /**\r\n     * Enables the `UD0` compatibility mode.\r\n     *\r\n     * Some processors decode the `UD0` instruction without a ModR/M byte. Enable this decoder mode\r\n     * to mimic this behavior.\r\n     *\r\n     * This mode is disabled by default.\r\n     */\r\n    ZYDIS_DECODER_MODE_UD0_COMPAT,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_DECODER_MODE_MAX_VALUE = ZYDIS_DECODER_MODE_UD0_COMPAT,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_DECODER_MODE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECODER_MODE_MAX_VALUE)\r\n  } ZydisDecoderMode;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decoder struct                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisDecoder` struct.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZydisDecoder_\r\n  {\r\n    /**\r\n     * The machine mode.\r\n     */\r\n    ZydisMachineMode machine_mode;\r\n    /**\r\n     * The stack width.\r\n     */\r\n    ZydisStackWidth stack_width;\r\n    /**\r\n     * The decoder mode bitmap.\r\n     */\r\n    ZyanU32 decoder_mode;\r\n  } ZydisDecoder;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @addtogroup decoder Decoder\r\n   * Functions allowing decoding of instruction bytes to a machine interpretable struct.\r\n   * @{\r\n   */\r\n  \r\n  /**\r\n   * Initializes the given `ZydisDecoder` instance.\r\n   *\r\n   * @param   decoder         A pointer to the `ZydisDecoder` instance.\r\n   * @param   machine_mode    The machine mode.\r\n   * @param   stack_width     The stack width.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDecoderInit(ZydisDecoder* decoder, ZydisMachineMode machine_mode,\r\n                                           ZydisStackWidth stack_width);\r\n  \r\n  /**\r\n   * Enables or disables the specified decoder-mode.\r\n   *\r\n   * @param   decoder A pointer to the `ZydisDecoder` instance.\r\n   * @param   mode    The decoder mode.\r\n   * @param   enabled `ZYAN_TRUE` to enable, or `ZYAN_FALSE` to disable the specified decoder-mode.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDecoderEnableMode(ZydisDecoder* decoder, ZydisDecoderMode mode,\r\n                                                 ZyanBool enabled);\r\n  \r\n  /**\r\n   * Decodes the instruction in the given input `buffer` and returns all details (e.g. operands).\r\n   *\r\n   * @param   decoder         A pointer to the `ZydisDecoder` instance.\r\n   * @param   buffer          A pointer to the input buffer.\r\n   * @param   length          The length of the input buffer. Note that this can be bigger than the\r\n   *                          actual size of the instruction -- you don't have to know the size up\r\n   *                          front. This length is merely used to prevent Zydis from doing\r\n   *                          out-of-bounds reads on your buffer.\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct receiving the details\r\n   *                          about the decoded instruction.\r\n   * @param   operands        A pointer to an array with `ZYDIS_MAX_OPERAND_COUNT` entries that\r\n   *                          receives the decoded operands. The number of operands decoded is\r\n   *                          determined by the `instruction.operand_count` field. Excess entries are\r\n   *                          zeroed.\r\n   *\r\n   * This is a convenience function that combines the following functions into one call:\r\n   *\r\n   *   - `ZydisDecoderDecodeInstruction`\r\n   *   - `ZydisDecoderDecodeOperands`\r\n   *\r\n   * Please refer to `ZydisDecoderDecodeInstruction` if operand decoding is not required or should\r\n   * be done separately (`ZydisDecoderDecodeOperands`).\r\n   *\r\n   * This function is not available in MINIMAL_MODE.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeFull(const ZydisDecoder* decoder,\r\n                                                 const void* buffer, ZyanUSize length, ZydisDecodedInstruction* instruction,\r\n                                                 ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT]);\r\n  \r\n  /**\r\n   * Decodes the instruction in the given input `buffer`.\r\n   *\r\n   * @param   decoder     A pointer to the `ZydisDecoder` instance.\r\n   * @param   context     A pointer to a decoder context struct which is required for further\r\n   *                      decoding (e.g. operand decoding using `ZydisDecoderDecodeOperands`) or\r\n   *                      `ZYAN_NULL` if not needed.\r\n   * @param   buffer      A pointer to the input buffer.\r\n   * @param   length      The length of the input buffer. Note that this can be bigger than the\r\n   *                      actual size of the instruction -- you don't have to know the size up\r\n   *                      front. This length is merely used to prevent Zydis from doing\r\n   *                      out-of-bounds reads on your buffer.\r\n   * @param   instruction A pointer to the `ZydisDecodedInstruction` struct, that receives the\r\n   *                      details about the decoded instruction.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeInstruction(const ZydisDecoder* decoder,\r\n                                                        ZydisDecoderContext* context, const void* buffer, ZyanUSize length,\r\n                                                        ZydisDecodedInstruction* instruction);\r\n  \r\n  /**\r\n   * Decodes the instruction operands.\r\n   *\r\n   * @param   decoder         A pointer to the `ZydisDecoder` instance.\r\n   * @param   context         A pointer to the `ZydisDecoderContext` struct.\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operands        The array that receives the decoded operands.\r\n   *                          Refer to `ZYDIS_MAX_OPERAND_COUNT` or `ZYDIS_MAX_OPERAND_COUNT_VISIBLE`\r\n   *                          when allocating space for the array to ensure that the buffer size is\r\n   *                          sufficient to always fit all instruction operands.\r\n   *                          Refer to `instruction.operand_count` or\r\n   *                          `instruction.operand_count_visible' when allocating space for the array\r\n   *                          to ensure that the buffer size is sufficient to fit all operands of\r\n   *                          the given instruction.\r\n   * @param   operand_count   The length of the `operands` array.\r\n   *                          This argument as well limits the maximum amount of operands to decode.\r\n   *                          If this value is `0`, no operands will be decoded and `ZYAN_NULL` will\r\n   *                          be accepted for the `operands` argument.\r\n   *\r\n   * This function fails, if `operand_count` is larger than the total number of operands for the\r\n   * given instruction (`instruction.operand_count`).\r\n   *\r\n   * This function is not available in MINIMAL_MODE.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDecoderDecodeOperands(const ZydisDecoder* decoder,\r\n                                                     const ZydisDecoderContext* context, const ZydisDecodedInstruction* instruction,\r\n                                                     ZydisDecodedOperand* operands, ZyanU8 operand_count);\r\n  \r\n  /** @} */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_DECODER_H */\r\n#endif\r\n\r\n#if !defined(ZYDIS_DISABLE_ENCODER)\r\n\r\n//\r\n// Header: Zydis/Encoder.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Mappa\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Functions for encoding instructions.\r\n */\r\n\r\n#ifndef ZYDIS_ENCODER_H\r\n#define ZYDIS_ENCODER_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Constants                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Maximum number of encodable (explicit and implicit) operands\r\n   */\r\n#define ZYDIS_ENCODER_MAX_OPERANDS 5\r\n  \r\n  // If asserts are failing here remember to update encoder table generator before fixing asserts\r\n  ZYAN_STATIC_ASSERT(ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODER_MAX_OPERANDS) == 3);\r\n  \r\n  /**\r\n   * Combination of all user-encodable prefixes\r\n   */\r\n#define ZYDIS_ENCODABLE_PREFIXES   (ZYDIS_ATTRIB_HAS_LOCK | \\\r\nZYDIS_ATTRIB_HAS_REP | \\\r\nZYDIS_ATTRIB_HAS_REPE | \\\r\nZYDIS_ATTRIB_HAS_REPNE | \\\r\nZYDIS_ATTRIB_HAS_BND | \\\r\nZYDIS_ATTRIB_HAS_XACQUIRE | \\\r\nZYDIS_ATTRIB_HAS_XRELEASE | \\\r\nZYDIS_ATTRIB_HAS_BRANCH_NOT_TAKEN | \\\r\nZYDIS_ATTRIB_HAS_BRANCH_TAKEN | \\\r\nZYDIS_ATTRIB_HAS_NOTRACK | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_CS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_SS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_DS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_ES | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_FS | \\\r\nZYDIS_ATTRIB_HAS_SEGMENT_GS)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines possible physical instruction encodings as bit flags, so multiple acceptable encodings\r\n   * can be specified simultaneously.\r\n   */\r\n  typedef enum ZydisEncodableEncoding_\r\n  {\r\n    ZYDIS_ENCODABLE_ENCODING_DEFAULT                = 0x00000000,\r\n    ZYDIS_ENCODABLE_ENCODING_LEGACY                 = 0x00000001,\r\n    ZYDIS_ENCODABLE_ENCODING_3DNOW                  = 0x00000002,\r\n    ZYDIS_ENCODABLE_ENCODING_XOP                    = 0x00000004,\r\n    ZYDIS_ENCODABLE_ENCODING_VEX                    = 0x00000008,\r\n    ZYDIS_ENCODABLE_ENCODING_EVEX                   = 0x00000010,\r\n    ZYDIS_ENCODABLE_ENCODING_MVEX                   = 0x00000020,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_ENCODABLE_ENCODING_MAX_VALUE              = (ZYDIS_ENCODABLE_ENCODING_MVEX |\r\n                                                       (ZYDIS_ENCODABLE_ENCODING_MVEX - 1)),\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_ENCODABLE_ENCODING_REQUIRED_BITS          =\r\n      ZYAN_BITS_TO_REPRESENT(ZYDIS_ENCODABLE_ENCODING_MAX_VALUE)\r\n  } ZydisEncodableEncoding;\r\n  \r\n  /**\r\n   * Defines encodable physical/effective sizes of relative immediate operands. See\r\n   * `ZydisEncoderRequest.branch_width` for more details.\r\n   */\r\n  typedef enum ZydisBranchWidth_\r\n  {\r\n    ZYDIS_BRANCH_WIDTH_NONE,\r\n    ZYDIS_BRANCH_WIDTH_8,\r\n    ZYDIS_BRANCH_WIDTH_16,\r\n    ZYDIS_BRANCH_WIDTH_32,\r\n    ZYDIS_BRANCH_WIDTH_64,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_BRANCH_WIDTH_MAX_VALUE = ZYDIS_BRANCH_WIDTH_64,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_BRANCH_WIDTH_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_BRANCH_WIDTH_MAX_VALUE)\r\n  } ZydisBranchWidth;\r\n  \r\n  /**\r\n   * Defines possible values for address size hints. See `ZydisEncoderRequest` for more information\r\n   * about address size hints.\r\n   */\r\n  typedef enum ZydisAddressSizeHint_\r\n  {\r\n    ZYDIS_ADDRESS_SIZE_HINT_NONE,\r\n    ZYDIS_ADDRESS_SIZE_HINT_16,\r\n    ZYDIS_ADDRESS_SIZE_HINT_32,\r\n    ZYDIS_ADDRESS_SIZE_HINT_64,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE = ZYDIS_ADDRESS_SIZE_HINT_64,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_ADDRESS_SIZE_HINT_REQUIRED_BITS =\r\n      ZYAN_BITS_TO_REPRESENT(ZYDIS_ADDRESS_SIZE_HINT_MAX_VALUE)\r\n  } ZydisAddressSizeHint;\r\n  \r\n  /**\r\n   * Defines possible values for operand size hints. See `ZydisEncoderRequest` for more information\r\n   * about operand size hints.\r\n   */\r\n  typedef enum ZydisOperandSizeHint_\r\n  {\r\n    ZYDIS_OPERAND_SIZE_HINT_NONE,\r\n    ZYDIS_OPERAND_SIZE_HINT_8,\r\n    ZYDIS_OPERAND_SIZE_HINT_16,\r\n    ZYDIS_OPERAND_SIZE_HINT_32,\r\n    ZYDIS_OPERAND_SIZE_HINT_64,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE = ZYDIS_OPERAND_SIZE_HINT_64,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_OPERAND_SIZE_HINT_REQUIRED_BITS =\r\n      ZYAN_BITS_TO_REPRESENT(ZYDIS_OPERAND_SIZE_HINT_MAX_VALUE)\r\n  } ZydisOperandSizeHint;\r\n  \r\n  /**\r\n   * Describes explicit or implicit instruction operand.\r\n   */\r\n  typedef struct ZydisEncoderOperand_\r\n  {\r\n    /**\r\n     * The type of the operand.\r\n     */\r\n    ZydisOperandType type;\r\n    /**\r\n     * Extended info for register-operands.\r\n     */\r\n    struct ZydisEncoderOperandReg_\r\n    {\r\n      /**\r\n       * The register value.\r\n       */\r\n      ZydisRegister value;\r\n      /**\r\n       * Is this 4th operand (`VEX`/`XOP`). Despite its name, `is4` encoding can sometimes be\r\n       * applied to 3rd operand instead of 4th. This field is used to resolve such ambiguities.\r\n       * For all other operands it should be set to `ZYAN_FALSE`.\r\n       */\r\n      ZyanBool is4;\r\n    } reg;\r\n    /**\r\n     * Extended info for memory-operands.\r\n     */\r\n    struct ZydisEncoderOperandMem_\r\n    {\r\n      /**\r\n       * The base register.\r\n       */\r\n      ZydisRegister base;\r\n      /**\r\n       * The index register.\r\n       */\r\n      ZydisRegister index;\r\n      /**\r\n       * The scale factor.\r\n       */\r\n      ZyanU8 scale;\r\n      /**\r\n       * The displacement value. This value is always treated as 64-bit signed integer, so it's\r\n       * important to take this into account when specifying absolute addresses. For example\r\n       * to specify a 16-bit address 0x8000 in 16-bit mode it should be sign extended to\r\n       * `0xFFFFFFFFFFFF8000`. See `address_size_hint` for more information about absolute\r\n       * addresses.\r\n       */\r\n      ZyanI64 displacement;\r\n      /**\r\n       * Size of this operand in bytes.\r\n       */\r\n      ZyanU16 size;\r\n    } mem;\r\n    /**\r\n     * Extended info for pointer-operands.\r\n     */\r\n    struct ZydisEncoderOperandPtr_\r\n    {\r\n      /**\r\n       * The segment value.\r\n       */\r\n      ZyanU16 segment;\r\n      /**\r\n       * The offset value.\r\n       */\r\n      ZyanU32 offset;\r\n    } ptr;\r\n    /**\r\n     * Extended info for immediate-operands.\r\n     */\r\n    union ZydisEncoderOperandImm_\r\n    {\r\n      /**\r\n       * The unsigned immediate value.\r\n       */\r\n      ZyanU64 u;\r\n      /**\r\n       * The signed immediate value.\r\n       */\r\n      ZyanI64 s;\r\n    } imm;\r\n  } ZydisEncoderOperand;\r\n  \r\n  /**\r\n   * Main structure consumed by the encoder. It represents full semantics of an instruction.\r\n   */\r\n  typedef struct ZydisEncoderRequest_\r\n  {\r\n    /**\r\n     * The machine mode used to encode this instruction.\r\n     */\r\n    ZydisMachineMode machine_mode;\r\n    /**\r\n     * This optional field can be used to restrict allowed physical encodings for desired\r\n     * instruction. Some mnemonics can be supported by more than one encoding, so this field can\r\n     * resolve ambiguities e.g. you can disable `AVX-512` extensions by prohibiting usage of `EVEX`\r\n     * prefix and allow only `VEX` variants.\r\n     */\r\n    ZydisEncodableEncoding allowed_encodings;\r\n    /**\r\n     * The instruction-mnemonic.\r\n     */\r\n    ZydisMnemonic mnemonic;\r\n    /**\r\n     * A combination of requested encodable prefixes (`ZYDIS_ATTRIB_HAS_*` flags) for desired\r\n     * instruction. See `ZYDIS_ENCODABLE_PREFIXES` for list of available prefixes.\r\n     */\r\n    ZydisInstructionAttributes prefixes;\r\n    /**\r\n     * Branch type (required for branching instructions only). Use `ZYDIS_BRANCH_TYPE_NONE` to let\r\n     * encoder pick size-optimal branch type automatically (`short` and `near` are prioritized over\r\n     * `far`).\r\n     */\r\n    ZydisBranchType branch_type;\r\n    /**\r\n     * Specifies physical size for relative immediate operands. Use `ZYDIS_BRANCH_WIDTH_NONE` to\r\n     * let encoder pick size-optimal branch width automatically. For segment:offset `far` branches\r\n     * this field applies to physical size of the offset part. For branching instructions without\r\n     * relative operands this field affects effective operand size attribute.\r\n     */\r\n    ZydisBranchWidth branch_width;\r\n    /**\r\n     * Optional address size hint used to resolve ambiguities for some instructions. Generally\r\n     * encoder deduces address size from `ZydisEncoderOperand` structures that represent\r\n     * explicit and implicit operands. This hint resolves conflicts when instruction's hidden\r\n     * operands scale with address size attribute.\r\n     *\r\n     * This hint is also used for instructions with absolute memory addresses (memory operands with\r\n     * displacement and no registers). Since displacement field is a 64-bit signed integer it's not\r\n     * possible to determine actual size of the address value in all situations. This hint\r\n     * specifies size of the address value provided inside encoder request rather than desired\r\n     * address size attribute of encoded instruction. Use `ZYDIS_ADDRESS_SIZE_HINT_NONE` to assume\r\n     * address size default for specified machine mode.\r\n     */\r\n    ZydisAddressSizeHint address_size_hint;\r\n    /**\r\n     * Optional operand size hint used to resolve ambiguities for some instructions. Generally\r\n     * encoder deduces operand size from `ZydisEncoderOperand` structures that represent\r\n     * explicit and implicit operands. This hint resolves conflicts when instruction's hidden\r\n     * operands scale with operand size attribute.\r\n     */\r\n    ZydisOperandSizeHint operand_size_hint;\r\n    /**\r\n     * The number of instruction-operands.\r\n     */\r\n    ZyanU8 operand_count;\r\n    /**\r\n     * Detailed info for all explicit and implicit instruction operands.\r\n     */\r\n    ZydisEncoderOperand operands[ZYDIS_ENCODER_MAX_OPERANDS];\r\n    /**\r\n     * Extended info for `EVEX` instructions.\r\n     */\r\n    struct ZydisEncoderRequestEvexFeatures_\r\n    {\r\n      /**\r\n       * The broadcast-mode. Specify `ZYDIS_BROADCAST_MODE_INVALID` for instructions with\r\n       * static broadcast functionality.\r\n       */\r\n      ZydisBroadcastMode broadcast;\r\n      /**\r\n       * The rounding-mode.\r\n       */\r\n      ZydisRoundingMode rounding;\r\n      /**\r\n       * Signals, if the `SAE` (suppress-all-exceptions) functionality should be enabled for\r\n       * the instruction.\r\n       */\r\n      ZyanBool sae;\r\n      /**\r\n       * Signals, if the zeroing-mask functionality should be enabled for the instruction.\r\n       * Specify `ZYAN_TRUE` for instructions with forced zeroing mask.\r\n       */\r\n      ZyanBool zeroing_mask;\r\n    } evex;\r\n    /**\r\n     * Extended info for `MVEX` instructions.\r\n     */\r\n    struct ZydisEncoderRequestMvexFeatures_\r\n    {\r\n      /**\r\n       * The broadcast-mode.\r\n       */\r\n      ZydisBroadcastMode broadcast;\r\n      /**\r\n       * The data-conversion mode.\r\n       */\r\n      ZydisConversionMode conversion;\r\n      /**\r\n       * The rounding-mode.\r\n       */\r\n      ZydisRoundingMode rounding;\r\n      /**\r\n       * The `AVX` register-swizzle mode.\r\n       */\r\n      ZydisSwizzleMode swizzle;\r\n      /**\r\n       * Signals, if the `SAE` (suppress-all-exceptions) functionality is enabled for\r\n       * the instruction.\r\n       */\r\n      ZyanBool sae;\r\n      /**\r\n       * Signals, if the instruction has a memory-eviction-hint (`KNC` only).\r\n       */\r\n      ZyanBool eviction_hint;\r\n    } mvex;\r\n  } ZydisEncoderRequest;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @addtogroup encoder Encoder\r\n   * Functions allowing encoding of instruction bytes from a machine interpretable struct.\r\n   * @{\r\n   */\r\n  \r\n  /**\r\n   * Encodes instruction with semantics specified in encoder request structure.\r\n   *\r\n   * @param   request     A pointer to the `ZydisEncoderRequest` struct.\r\n   * @param   buffer      A pointer to the output buffer receiving encoded instruction.\r\n   * @param   length      A pointer to the variable containing length of the output buffer. Upon\r\n   *                      successful return this variable receives length of the encoded instruction.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstruction(const ZydisEncoderRequest *request,\r\n                                                        void *buffer, ZyanUSize *length);\r\n  \r\n  /**\r\n   * Encodes instruction with semantics specified in encoder request structure. This function expects\r\n   * absolute addresses inside encoder request instead of `EIP`/`RIP`-relative values. Function\r\n   * predicts final instruction length prior to encoding and writes back calculated relative operands\r\n   * to provided encoder request.\r\n   *\r\n   * @param   request         A pointer to the `ZydisEncoderRequest` struct.\r\n   * @param   buffer          A pointer to the output buffer receiving encoded instruction.\r\n   * @param   length          A pointer to the variable containing length of the output buffer. Upon\r\n   *                          successful return this variable receives length of the encoded\r\n   *                          instruction.\r\n   * @param   runtime_address The runtime address of the instruction.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisEncoderEncodeInstructionAbsolute(ZydisEncoderRequest *request,\r\n                                                                void *buffer, ZyanUSize *length, ZyanU64 runtime_address);\r\n  \r\n  /**\r\n   * Converts decoded instruction to encoder request that can be passed to\r\n   * `ZydisEncoderEncodeInstruction`.\r\n   *\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operands        A pointer to the decoded operands.\r\n   * @param   operand_count   The operand count.\r\n   * @param   request         A pointer to the `ZydisEncoderRequest` struct, that receives\r\n   *                          information necessary for encoder to re-encode the instruction.\r\n   *\r\n   * This function performs simple structure conversion and does minimal sanity checks on the\r\n   * input. There's no guarantee that produced request will be accepted by\r\n   * `ZydisEncoderEncodeInstruction` if malformed `ZydisDecodedInstruction` or malformed\r\n   * `ZydisDecodedOperands` is passed to this function.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisEncoderDecodedInstructionToEncoderRequest(\r\n                                                                         const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,\r\n                                                                         ZyanU8 operand_count, ZydisEncoderRequest* request);\r\n  \r\n  /**\r\n   * Fills provided buffer with `NOP` instructions using longest possible multi-byte instructions.\r\n   *\r\n   * @param   buffer  A pointer to the output buffer receiving encoded instructions.\r\n   * @param   length  Size of the output buffer.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisEncoderNopFill(void *buffer, ZyanUSize length);\r\n  \r\n  /** @} */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_ENCODER_H */\r\n#endif\r\n\r\n#if !defined(ZYDIS_DISABLE_FORMATTER)\r\n\r\n//\r\n// Header: Zydis/Formatter.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Functions for formatting instructions to human-readable text.\r\n */\r\n\r\n#ifndef ZYDIS_FORMATTER_H\r\n#define ZYDIS_FORMATTER_H\r\n\r\n\r\n//\r\n// Header: Zycore/String.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Formatter.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zycore-C)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Implements a string type.\r\n */\r\n\r\n#ifndef ZYCORE_STRING_H\r\n#define ZYCORE_STRING_H\r\n\r\n\r\n//\r\n// Header: Zycore/Allocator.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Formatter.h\r\n//   - Zycore/String.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zycore-C)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * @brief\r\n */\r\n\r\n#ifndef ZYCORE_ALLOCATOR_H\r\n#define ZYCORE_ALLOCATOR_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  struct ZyanAllocator_;\r\n  \r\n  /**\r\n   * Defines the `ZyanAllocatorAllocate` function prototype.\r\n   *\r\n   * @param   allocator       A pointer to the `ZyanAllocator` instance.\r\n   * @param   p               Receives a pointer to the first memory block sufficient to hold an\r\n   *                          array of `n` elements with a size of `element_size`.\r\n   * @param   element_size    The size of a single element.\r\n   * @param   n               The number of elements to allocate storage for.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This prototype is used for the `allocate()` and `reallocate()` functions.\r\n   *\r\n   * The result of the `reallocate()` function is undefined, if `p` does not point to a memory block\r\n   * previously obtained by `(re-)allocate()`.\r\n   */\r\n  typedef ZyanStatus (*ZyanAllocatorAllocate)(struct ZyanAllocator_* allocator, void** p,\r\n                                              ZyanUSize element_size, ZyanUSize n);\r\n  \r\n  /**\r\n   * Defines the `ZyanAllocatorDeallocate` function prototype.\r\n   *\r\n   * @param   allocator       A pointer to the `ZyanAllocator` instance.\r\n   * @param   p               The pointer obtained from `(re-)allocate()`.\r\n   * @param   element_size    The size of a single element.\r\n   * @param   n               The number of elements earlier passed to `(re-)allocate()`.\r\n   *\r\n    * @return  A zyan status code.\r\n   */\r\n  typedef ZyanStatus (*ZyanAllocatorDeallocate)(struct ZyanAllocator_* allocator, void* p,\r\n                                                ZyanUSize element_size, ZyanUSize n);\r\n  \r\n  /**\r\n   * Defines the `ZyanAllocator` struct.\r\n   *\r\n   * This is the base class for all custom allocator implementations.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZyanAllocator_\r\n  {\r\n    /**\r\n     * The allocate function.\r\n     */\r\n    ZyanAllocatorAllocate allocate;\r\n    /**\r\n     * The reallocate function.\r\n     */\r\n    ZyanAllocatorAllocate reallocate;\r\n    /**\r\n     * The deallocate function.\r\n     */\r\n    ZyanAllocatorDeallocate deallocate;\r\n  } ZyanAllocator;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Initializes the given `ZyanAllocator` instance.\r\n   *\r\n   * @param   allocator   A pointer to the `ZyanAllocator` instance.\r\n   * @param   allocate    The allocate function.\r\n   * @param   reallocate  The reallocate function.\r\n   * @param   deallocate  The deallocate function.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanAllocatorInit(ZyanAllocator* allocator, ZyanAllocatorAllocate allocate,\r\n                                             ZyanAllocatorAllocate reallocate, ZyanAllocatorDeallocate deallocate);\r\n  \r\n#ifndef ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Returns the default `ZyanAllocator` instance.\r\n   *\r\n   * @return  A pointer to the default `ZyanAllocator` instance.\r\n   *\r\n   * The default allocator uses the default memory manager to allocate memory on the heap.\r\n   *\r\n   * You should in no case modify the returned allocator instance to avoid unexpected behavior.\r\n   */\r\n  ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanAllocator* ZyanAllocatorDefault(void);\r\n  \r\n#endif // ZYAN_NO_LIBC\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYCORE_ALLOCATOR_H */\r\n\r\n//\r\n// Header: Zycore/Vector.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Formatter.h\r\n//   - Zycore/String.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zycore-C)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Implements the vector container class.\r\n */\r\n\r\n#ifndef ZYCORE_VECTOR_H\r\n#define ZYCORE_VECTOR_H\r\n\r\n\r\n//\r\n// Header: Zycore/Comparison.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Formatter.h\r\n//   - Zycore/String.h\r\n//   - Zycore/Vector.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zycore-C)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Defines prototypes of general-purpose comparison functions.\r\n */\r\n\r\n#ifndef ZYCORE_COMPARISON_H\r\n#define ZYCORE_COMPARISON_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines the `ZyanEqualityComparison` function prototype.\r\n   *\r\n   * @param   left    A pointer to the first element.\r\n   * @param   right   A pointer to the second element.\r\n   *\r\n   * @return  This function should return `ZYAN_TRUE` if the `left` element equals the `right` one\r\n   *          or `ZYAN_FALSE`, if not.\r\n   */\r\n  typedef ZyanBool (*ZyanEqualityComparison)(const void* left, const void* right);\r\n  \r\n  /**\r\n   * Defines the `ZyanComparison` function prototype.\r\n   *\r\n   * @param   left    A pointer to the first element.\r\n   * @param   right   A pointer to the second element.\r\n   *\r\n   * @return  This function should return values in the following range:\r\n   *          `left == right -> result == 0`\r\n   *          `left <  right -> result  < 0`\r\n   *          `left >  right -> result  > 0`\r\n   */\r\n  typedef ZyanI32 (*ZyanComparison)(const void* left, const void* right);\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Equality comparison functions                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Declares a generic equality comparison function for an integral data-type.\r\n   *\r\n   * @param   name    The name of the function.\r\n   * @param   type    The name of the integral data-type.\r\n   */\r\n#define ZYAN_DECLARE_EQUALITY_COMPARISON(name, type) \\\r\nZyanBool name(const type* left, const type* right) \\\r\n{ \\\r\nZYAN_ASSERT(left); \\\r\nZYAN_ASSERT(right); \\\r\n  \\\r\nreturn (*left == *right) ? ZYAN_TRUE : ZYAN_FALSE; \\\r\n}\r\n  \r\n  /**\r\n   * Declares a generic equality comparison function that compares a single integral\r\n   *          data-type field of a struct.\r\n   *\r\n   * @param   name        The name of the function.\r\n   * @param   type        The name of the integral data-type.\r\n   * @param   field_name  The name of the struct field.\r\n   */\r\n#define ZYAN_DECLARE_EQUALITY_COMPARISON_FOR_FIELD(name, type, field_name) \\\r\nZyanBool name(const type* left, const type* right) \\\r\n{ \\\r\nZYAN_ASSERT(left); \\\r\nZYAN_ASSERT(right); \\\r\n  \\\r\nreturn (left->field_name == right->field_name) ? ZYAN_TRUE : ZYAN_FALSE; \\\r\n}\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Comparison functions                                                                           */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Declares a generic comparison function for an integral data-type.\r\n   *\r\n   * @param   name    The name of the function.\r\n   * @param   type    The name of the integral data-type.\r\n   */\r\n#define ZYAN_DECLARE_COMPARISON(name, type) \\\r\nZyanI32 name(const type* left, const type* right) \\\r\n{ \\\r\nZYAN_ASSERT(left); \\\r\nZYAN_ASSERT(right); \\\r\n  \\\r\nif (*left < *right) \\\r\n{ \\\r\nreturn -1; \\\r\n} \\\r\nif (*left > *right) \\\r\n{ \\\r\nreturn  1; \\\r\n} \\\r\nreturn 0; \\\r\n}\r\n  \r\n  /**\r\n   * Declares a generic comparison function that compares a single integral data-type field\r\n   *          of a struct.\r\n   *\r\n   * @param   name        The name of the function.\r\n   * @param   type        The name of the integral data-type.\r\n   * @param   field_name  The name of the struct field.\r\n   */\r\n#define ZYAN_DECLARE_COMPARISON_FOR_FIELD(name, type, field_name) \\\r\nZyanI32 name(const type* left, const type* right) \\\r\n{ \\\r\nZYAN_ASSERT(left); \\\r\nZYAN_ASSERT(right); \\\r\n  \\\r\nif (left->field_name < right->field_name) \\\r\n{ \\\r\nreturn -1; \\\r\n} \\\r\nif (left->field_name > right->field_name) \\\r\n{ \\\r\nreturn  1; \\\r\n} \\\r\nreturn 0; \\\r\n}\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Default equality comparison functions                                                          */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines a default equality comparison function for pointer values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\r\n   *          not.\r\n   */\r\n  ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsPointer, void* const)\r\n    \r\n  /**\r\n   * Defines a default equality comparison function for `ZyanBool` values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\r\n   *          not.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsBool, ZyanBool)\r\n    \r\n  /**\r\n   * Defines a default equality comparison function for 8-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\r\n   *          not.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric8, ZyanU8)\r\n    \r\n  /**\r\n   * Defines a default equality comparison function for 16-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\r\n   *          not.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric16, ZyanU16)\r\n    \r\n  /**\r\n   * Defines a default equality comparison function for 32-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\r\n   *          not.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric32, ZyanU32)\r\n    \r\n  /**\r\n   * Defines a default equality comparison function for 64-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `ZYAN_TRUE` if the `left` value equals the `right` one or `ZYAN_FALSE`, if\r\n   *          not.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_EQUALITY_COMPARISON(ZyanEqualsNumeric64, ZyanU64)\r\n    \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Default comparison functions                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines a default comparison function for pointer values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\r\n   *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanComparePointer, void* const)\r\n    \r\n  /**\r\n   * Defines a default comparison function for `ZyanBool` values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\r\n   *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareBool, ZyanBool)\r\n    \r\n  /**\r\n   * Defines a default comparison function for 8-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\r\n   *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric8, ZyanU8)\r\n    \r\n  /**\r\n   * Defines a default comparison function for 16-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\r\n   *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric16, ZyanU16)\r\n    \r\n  /**\r\n   * Defines a default comparison function for 32-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\r\n   *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric32, ZyanU32)\r\n    \r\n  /**\r\n   * Defines a default comparison function for 64-bit numeric values.\r\n   *\r\n   * @param   left    A pointer to the first value.\r\n   * @param   right   A pointer to the second value.\r\n   *\r\n   * @return  Returns `0` if the `left` value equals the `right` one, `-1` if the `left` value is\r\n   *          less than the `right` one, or `1` if the `left` value is greater than the `right` one.\r\n   */\r\n    ZYAN_INLINE ZYAN_DECLARE_COMPARISON(ZyanCompareNumeric64, ZyanU64)\r\n    \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYCORE_COMPARISON_H */\r\n\r\n//\r\n// Header: Zycore/Object.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Formatter.h\r\n//   - Zycore/String.h\r\n//   - Zycore/Vector.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Core Library (Zycore-C)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Defines some generic object-related datatypes.\r\n */\r\n\r\n#ifndef ZYCORE_OBJECT_H\r\n#define ZYCORE_OBJECT_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines the `ZyanMemberProcedure` function prototype.\r\n   *\r\n   * @param   object  A pointer to the object.\r\n   */\r\n  typedef void (*ZyanMemberProcedure)(void* object);\r\n  \r\n  /**\r\n   * Defines the `ZyanConstMemberProcedure` function prototype.\r\n   *\r\n   * @param   object  A pointer to the object.\r\n   */\r\n  typedef void (*ZyanConstMemberProcedure)(const void* object);\r\n  \r\n  /**\r\n   * Defines the `ZyanMemberFunction` function prototype.\r\n   *\r\n   * @param   object  A pointer to the object.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  typedef ZyanStatus (*ZyanMemberFunction)(void* object);\r\n  \r\n  /**\r\n   * Defines the `ZyanConstMemberFunction` function prototype.\r\n   *\r\n   * @param   object  A pointer to the object.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  typedef ZyanStatus (*ZyanConstMemberFunction)(const void* object);\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYCORE_OBJECT_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Constants                                                                                      */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * The initial minimum capacity (number of elements) for all dynamically allocated vector\r\n   * instances.\r\n   */\r\n#define ZYAN_VECTOR_MIN_CAPACITY                1\r\n  \r\n  /**\r\n   * The default growth factor for all vector instances.\r\n   */\r\n#define ZYAN_VECTOR_DEFAULT_GROWTH_FACTOR       2\r\n  \r\n  /**\r\n   * The default shrink threshold for all vector instances.\r\n   */\r\n#define ZYAN_VECTOR_DEFAULT_SHRINK_THRESHOLD    4\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines the `ZyanVector` struct.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZyanVector_\r\n  {\r\n    /**\r\n     * The memory allocator.\r\n     */\r\n    ZyanAllocator* allocator;\r\n    /**\r\n     * The growth factor.\r\n     */\r\n    ZyanU8 growth_factor;\r\n    /**\r\n     * The shrink threshold.\r\n     */\r\n    ZyanU8 shrink_threshold;\r\n    /**\r\n     * The current number of elements in the vector.\r\n     */\r\n    ZyanUSize size;\r\n    /**\r\n     * The maximum capacity (number of elements).\r\n     */\r\n    ZyanUSize capacity;\r\n    /**\r\n     * The size of a single element in bytes.\r\n     */\r\n    ZyanUSize element_size;\r\n    /**\r\n     * The element destructor callback.\r\n     */\r\n    ZyanMemberProcedure destructor;\r\n    /**\r\n     * The data pointer.\r\n     */\r\n    void* data;\r\n  } ZyanVector;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* General                                                                                        */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines an uninitialized `ZyanVector` instance.\r\n   */\r\n#define ZYAN_VECTOR_INITIALIZER \\\r\n{ \\\r\n/* allocator        */ ZYAN_NULL, \\\r\n/* growth_factor    */ 0, \\\r\n/* shrink_threshold */ 0, \\\r\n/* size             */ 0, \\\r\n/* capacity         */ 0, \\\r\n/* element_size     */ 0, \\\r\n/* destructor       */ ZYAN_NULL, \\\r\n/* data             */ ZYAN_NULL \\\r\n}\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Helper macros                                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the value of the element at the given `index`.\r\n   *\r\n   * @param   type    The desired value type.\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The element index.\r\n   *\r\n   * @result  The value of the desired element in the vector.\r\n   *\r\n   * Note that this function is unsafe and might dereference a null-pointer.\r\n   */\r\n#ifdef __cplusplus\r\n#define ZYAN_VECTOR_GET(type, vector, index) \\\r\n(*reinterpret_cast<const type*>(ZyanVectorGet(vector, index)))\r\n#else\r\n#define ZYAN_VECTOR_GET(type, vector, index) \\\r\n(*(const type*)ZyanVectorGet(vector, index))\r\n#endif\r\n  \r\n  /**\r\n   * Loops through all elements of the vector.\r\n   *\r\n   * @param   type        The desired value type.\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   item_name   The name of the iterator item.\r\n   * @param   body        The body to execute for each item in the vector.\r\n   */\r\n#define ZYAN_VECTOR_FOREACH(type, vector, item_name, body) \\\r\n{ \\\r\nconst ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \\\r\nfor (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \\\r\nZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \\\r\nZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \\\r\n++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \\\r\n{ \\\r\nconst type item_name = ZYAN_VECTOR_GET(type, vector, \\\r\nZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \\\r\nbody \\\r\n} \\\r\n}\r\n  \r\n  /**\r\n   * Loops through all elements of the vector.\r\n   *\r\n   * @param   type        The desired value type.\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   item_name   The name of the iterator item.\r\n   * @param   body        The body to execute for each item in the vector.\r\n   */\r\n#define ZYAN_VECTOR_FOREACH_MUTABLE(type, vector, item_name, body) \\\r\n{ \\\r\nconst ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name) = (vector)->size; \\\r\nfor (ZyanUSize ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) = 0; \\\r\nZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name) < \\\r\nZYAN_MACRO_CONCAT_EXPAND(size_d50d3303, item_name); \\\r\n++ZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)) \\\r\n{ \\\r\ntype* const item_name = ZyanVectorGetMutable(vector, \\\r\nZYAN_MACRO_CONCAT_EXPAND(i_bfd62679, item_name)); \\\r\nbody \\\r\n} \\\r\n}\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Constructor and destructor                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#ifndef ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes the given `ZyanVector` instance.\r\n   *\r\n   * @param   vector          A pointer to the `ZyanVector` instance.\r\n   * @param   element_size    The size of a single element in bytes.\r\n   * @param   capacity        The initial capacity (number of elements).\r\n   * @param   destructor      A destructor callback that is invoked every time an item is deleted, or\r\n   *                          `ZYAN_NULL` if not needed.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The memory for the vector elements is dynamically allocated by the default allocator using the\r\n   * default growth factor and the default shrink threshold.\r\n   *\r\n   * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorInit(ZyanVector* vector,\r\n                                                             ZyanUSize element_size, ZyanUSize capacity, ZyanMemberProcedure destructor);\r\n  \r\n#endif // ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes the given `ZyanVector` instance and sets a custom `allocator` and memory\r\n   * allocation/deallocation parameters.\r\n   *\r\n   * @param   vector              A pointer to the `ZyanVector` instance.\r\n   * @param   element_size        The size of a single element in bytes.\r\n   * @param   capacity            The initial capacity (number of elements).\r\n   * @param   destructor          A destructor callback that is invoked every time an item is deleted,\r\n   *                              or `ZYAN_NULL` if not needed.\r\n   * @param   allocator           A pointer to a `ZyanAllocator` instance.\r\n   * @param   growth_factor       The growth factor.\r\n   * @param   shrink_threshold    The shrink threshold.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\r\n   * dynamic shrinking.\r\n   *\r\n   * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorInitEx(ZyanVector* vector, ZyanUSize element_size,\r\n                                            ZyanUSize capacity, ZyanMemberProcedure destructor, ZyanAllocator* allocator,\r\n                                            ZyanU8 growth_factor, ZyanU8 shrink_threshold);\r\n  \r\n  /**\r\n   * Initializes the given `ZyanVector` instance and configures it to use a custom user\r\n   * defined buffer with a fixed size.\r\n   *\r\n   * @param   vector          A pointer to the `ZyanVector` instance.\r\n   * @param   element_size    The size of a single element in bytes.\r\n   * @param   buffer          A pointer to the buffer that is used as storage for the elements.\r\n   * @param   capacity        The maximum capacity (number of elements) of the buffer.\r\n   * @param   destructor      A destructor callback that is invoked every time an item is deleted, or\r\n   *                          `ZYAN_NULL` if not needed.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Finalization is not required for instances created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorInitCustomBuffer(ZyanVector* vector, ZyanUSize element_size,\r\n                                                      void* buffer, ZyanUSize capacity, ZyanMemberProcedure destructor);\r\n  \r\n  /**\r\n   * Destroys the given `ZyanVector` instance.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance..\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorDestroy(ZyanVector* vector);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Duplication                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#ifndef ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes a new `ZyanVector` instance by duplicating an existing vector.\r\n   *\r\n   * @param   destination A pointer to the (uninitialized) destination `ZyanVector` instance.\r\n   * @param   source      A pointer to the source vector.\r\n   * @param   capacity    The initial capacity (number of elements).\r\n   *\r\n   *                      This value is automatically adjusted to the size of the source vector, if\r\n   *                      a smaller value was passed.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The memory for the vector is dynamically allocated by the default allocator using the default\r\n   * growth factor and the default shrink threshold.\r\n   *\r\n   * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanVectorDuplicate(ZyanVector* destination,\r\n                                                                  const ZyanVector* source, ZyanUSize capacity);\r\n  \r\n#endif // ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes a new `ZyanVector` instance by duplicating an existing vector and sets a\r\n   * custom `allocator` and memory allocation/deallocation parameters.\r\n   *\r\n   * @param   destination         A pointer to the (uninitialized) destination `ZyanVector` instance.\r\n   * @param   source              A pointer to the source vector.\r\n   * @param   capacity            The initial capacity (number of elements).\r\n  \r\n   *                              This value is automatically adjusted to the size of the source\r\n   *                              vector, if a smaller value was passed.\r\n   * @param   allocator           A pointer to a `ZyanAllocator` instance.\r\n   * @param   growth_factor       The growth factor.\r\n   * @param   shrink_threshold    The shrink threshold.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\r\n   * dynamic shrinking.\r\n   *\r\n   * Finalization with `ZyanVectorDestroy` is required for all instances created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateEx(ZyanVector* destination, const ZyanVector* source,\r\n                                                 ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);\r\n  \r\n  /**\r\n   * Initializes a new `ZyanVector` instance by duplicating an existing vector and\r\n   * configures it to use a custom user defined buffer with a fixed size.\r\n   *\r\n   * @param   destination A pointer to the (uninitialized) destination `ZyanVector` instance.\r\n   * @param   source      A pointer to the source vector.\r\n   * @param   buffer      A pointer to the buffer that is used as storage for the elements.\r\n   * @param   capacity    The maximum capacity (number of elements) of the buffer.\r\n  \r\n   *                      This function will fail, if the capacity of the buffer is less than the\r\n   *                      size of the source vector.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Finalization is not required for instances created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorDuplicateCustomBuffer(ZyanVector* destination,\r\n                                                           const ZyanVector* source, void* buffer, ZyanUSize capacity);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Element access                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns a constant pointer to the element at the given `index`.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   index       The element index.\r\n   *\r\n   * @return  A constant pointer to the desired element in the vector or `ZYAN_NULL`, if an error\r\n   *          occurred.\r\n   *\r\n   * Note that the returned pointer might get invalid when the vector is resized by either a manual\r\n   * call to the memory-management functions or implicitly by inserting or removing elements.\r\n   *\r\n   * Take a look at `ZyanVectorGetPointer` instead, if you need a function that returns a zyan status\r\n   * code.\r\n   */\r\n  ZYCORE_EXPORT const void* ZyanVectorGet(const ZyanVector* vector, ZyanUSize index);\r\n  \r\n  /**\r\n   * Returns a mutable pointer to the element at the given `index`.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   index       The element index.\r\n   *\r\n   * @return  A mutable pointer to the desired element in the vector or `ZYAN_NULL`, if an error\r\n   *          occurred.\r\n   *\r\n   * Note that the returned pointer might get invalid when the vector is resized by either a manual\r\n   * call to the memory-management functions or implicitly by inserting or removing elements.\r\n   *\r\n   * Take a look at `ZyanVectorGetPointerMutable` instead, if you need a function that returns a\r\n   * zyan status code.\r\n   */\r\n  ZYCORE_EXPORT void* ZyanVectorGetMutable(const ZyanVector* vector, ZyanUSize index);\r\n  \r\n  /**\r\n   * Returns a constant pointer to the element at the given `index`.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The element index.\r\n   * @param   value   Receives a constant pointer to the desired element in the vector.\r\n   *\r\n   * Note that the returned pointer might get invalid when the vector is resized by either a manual\r\n   * call to the memory-management functions or implicitly by inserting or removing elements.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointer(const ZyanVector* vector, ZyanUSize index,\r\n                                                const void** value);\r\n  \r\n  /**\r\n   * Returns a mutable pointer to the element at the given `index`.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The element index.\r\n   * @param   value Receives a mutable pointer to the desired element in the vector.\r\n   *\r\n   * Note that the returned pointer might get invalid when the vector is resized by either a manual\r\n   * call to the memory-management functions or implicitly by inserting or removing elements.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorGetPointerMutable(const ZyanVector* vector, ZyanUSize index,\r\n                                                       void** value);\r\n  \r\n  /**\r\n   * Assigns a new value to the element at the given `index`.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The value index.\r\n   * @param   value   The value to assign.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorSet(ZyanVector* vector, ZyanUSize index,\r\n                                         const void* value);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Insertion                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Adds a new `element` to the end of the vector.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   element A pointer to the element to add.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorPushBack(ZyanVector* vector, const void* element);\r\n  \r\n  /**\r\n   * Inserts an `element` at the given `index` of the vector.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The insert index.\r\n   * @param   element A pointer to the element to insert.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorInsert(ZyanVector* vector, ZyanUSize index,\r\n                                            const void* element);\r\n  \r\n  /**\r\n   * Inserts multiple `elements` at the given `index` of the vector.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   index       The insert index.\r\n   * @param   elements    A pointer to the first element.\r\n   * @param   count       The number of elements to insert.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorInsertRange(ZyanVector* vector, ZyanUSize index,\r\n                                                 const void* elements, ZyanUSize count);\r\n  \r\n  /**\r\n   * Constructs an `element` in-place at the end of the vector.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   element     Receives a pointer to the new element.\r\n   * @param   constructor The constructor callback or `ZYAN_NULL`. The new element will be in\r\n   *                      undefined state, if no constructor was passed.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorEmplace(ZyanVector* vector, void** element,\r\n                                             ZyanMemberFunction constructor);\r\n  \r\n  /**\r\n   * Constructs an `element` in-place and inserts it at the given `index` of the vector.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   index       The insert index.\r\n   * @param   element     Receives a pointer to the new element.\r\n   * @param   constructor The constructor callback or `ZYAN_NULL`. The new element will be in\r\n   *                      undefined state, if no constructor was passed.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorEmplaceEx(ZyanVector* vector, ZyanUSize index,\r\n                                               void** element, ZyanMemberFunction constructor);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Utils                                                                                          */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Swaps the element at `index_first` with the element at `index_second`.\r\n   *\r\n   * @param   vector          A pointer to the `ZyanVector` instance.\r\n   * @param   index_first     The index of the first element.\r\n   * @param   index_second    The index of the second element.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function requires the vector to have spare capacity for one temporary element. Call\r\n   * `ZyanVectorReserve` before this function to increase capacity, if needed.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorSwapElements(ZyanVector* vector, ZyanUSize index_first,\r\n                                                  ZyanUSize index_second);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Deletion                                                                                       */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Deletes the element at the given `index` of the vector.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The element index.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorDelete(ZyanVector* vector, ZyanUSize index);\r\n  \r\n  /**\r\n   * Deletes multiple elements from the given vector, starting at `index`.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   index   The index of the first element to delete.\r\n   * @param   count   The number of elements to delete.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorDeleteRange(ZyanVector* vector, ZyanUSize index,\r\n                                                 ZyanUSize count);\r\n  \r\n  /**\r\n   * Removes the last element of the vector.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorPopBack(ZyanVector* vector);\r\n  \r\n  /**\r\n   * Erases all elements of the given vector.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorClear(ZyanVector* vector);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Searching                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Sequentially searches for the first occurrence of `element` in the given vector.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   element     A pointer to the element to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the found element.\r\n   * @param   comparison  The comparison function to use.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\r\n   *          zyan status code if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the element was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorFind(const ZyanVector* vector, const void* element,\r\n                                          ZyanISize* found_index, ZyanEqualityComparison comparison);\r\n  \r\n  /**\r\n   * Sequentially searches for the first occurrence of `element` in the given vector.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   element     A pointer to the element to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the found element.\r\n   * @param   comparison  The comparison function to use.\r\n   * @param   index       The start index.\r\n   * @param   count       The maximum number of elements to iterate, beginning from the start `index`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\r\n   *          zyan status code if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the element was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorFindEx(const ZyanVector* vector, const void* element,\r\n                                            ZyanISize* found_index, ZyanEqualityComparison comparison, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /**\r\n   * Searches for the first occurrence of `element` in the given vector using a binary-\r\n   * search algorithm.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   element     A pointer to the element to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the found element.\r\n   * @param   comparison  The comparison function to use.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\r\n   *          zyan status code if an error occurred.\r\n   *\r\n   * If found, `found_index` contains the zero-based index of `element`. If not found, `found_index`\r\n   * contains the index of the first entry larger than `element`.\r\n   *\r\n   * This function requires all elements in the vector to be strictly ordered (sorted).\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearch(const ZyanVector* vector, const void* element,\r\n                                                  ZyanUSize* found_index, ZyanComparison comparison);\r\n  \r\n  /**\r\n   * Searches for the first occurrence of `element` in the given vector using a binary-\r\n   * search algorithm.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   element     A pointer to the element to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the found element.\r\n   * @param   comparison  The comparison function to use.\r\n   * @param   index       The start index.\r\n   * @param   count       The maximum number of elements to iterate, beginning from the start `index`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE` if the element was found, `ZYAN_STATUS_FALSE` if not or a generic\r\n   *          zyan status code if an error occurred.\r\n   *\r\n   * If found, `found_index` contains the zero-based index of `element`. If not found, `found_index`\r\n   * contains the index of the first entry larger than `element`.\r\n   *\r\n   * This function requires all elements in the vector to be strictly ordered (sorted).\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorBinarySearchEx(const ZyanVector* vector, const void* element,\r\n                                                    ZyanUSize* found_index, ZyanComparison comparison, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Memory management                                                                              */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Resizes the given `ZyanVector` instance.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   size    The new size of the vector.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorResize(ZyanVector* vector, ZyanUSize size);\r\n  \r\n  /**\r\n   * Resizes the given `ZyanVector` instance.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   size        The new size of the vector.\r\n   * @param   initializer A pointer to a value to be used as initializer for new items.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorResizeEx(ZyanVector* vector, ZyanUSize size,\r\n                                              const void* initializer);\r\n  \r\n  /**\r\n   * Changes the capacity of the given `ZyanVector` instance.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   capacity    The new minimum capacity of the vector.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorReserve(ZyanVector* vector, ZyanUSize capacity);\r\n  \r\n  /**\r\n   * Shrinks the capacity of the given vector to match it's size.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorShrinkToFit(ZyanVector* vector);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Information                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the current capacity of the vector.\r\n   *\r\n   * @param   vector      A pointer to the `ZyanVector` instance.\r\n   * @param   capacity    Receives the size of the vector.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorGetCapacity(const ZyanVector* vector, ZyanUSize* capacity);\r\n  \r\n  /**\r\n   * Returns the current size of the vector.\r\n   *\r\n   * @param   vector  A pointer to the `ZyanVector` instance.\r\n   * @param   size    Receives the size of the vector.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanVectorGetSize(const ZyanVector* vector, ZyanUSize* size);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYCORE_VECTOR_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Constants                                                                                      */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * The initial minimum capacity (number of characters) for all dynamically allocated\r\n   * string instances - not including the terminating '\\0'-character.\r\n   */\r\n#define ZYAN_STRING_MIN_CAPACITY                32\r\n  \r\n  /**\r\n   * The default growth factor for all string instances.\r\n   */\r\n#define ZYAN_STRING_DEFAULT_GROWTH_FACTOR       2\r\n  \r\n  /**\r\n   * The default shrink threshold for all string instances.\r\n   */\r\n#define ZYAN_STRING_DEFAULT_SHRINK_THRESHOLD    4\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* String flags                                                                                   */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZyanStringFlags` data-type.\r\n   */\r\n  typedef ZyanU8 ZyanStringFlags;\r\n  \r\n  /**\r\n   * The string uses a custom user-defined buffer with a fixed capacity.\r\n   */\r\n#define ZYAN_STRING_HAS_FIXED_CAPACITY  0x01 // (1 << 0)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* String                                                                                         */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZyanString` struct.\r\n   *\r\n   * The `ZyanString` type is implemented as a size-prefixed string - which allows for a lot of\r\n   * performance optimizations.\r\n   * Nevertheless null-termination is guaranteed at all times to provide maximum compatibility with\r\n   * default C-style strings (use `ZyanStringGetData` to access the C-style string).\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZyanString_\r\n  {\r\n    /**\r\n     * String flags.\r\n     */\r\n    ZyanStringFlags flags;\r\n    /**\r\n     * The vector that contains the actual string.\r\n     */\r\n    ZyanVector vector;\r\n  } ZyanString;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* View                                                                                           */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZyanStringView` struct.\r\n   *\r\n   * The `ZyanStringView` type provides a view inside a string (`ZyanString` instances, null-\r\n   * terminated C-style strings, or even not-null-terminated custom strings). A view is immutable\r\n   * by design and can't be directly converted to a C-style string.\r\n   *\r\n   * Views might become invalid (e.g. pointing to invalid memory), if the underlying string gets\r\n   * destroyed or resized.\r\n   *\r\n   * The `ZYAN_STRING_TO_VIEW` macro can be used to cast a `ZyanString` to a `ZyanStringView` pointer\r\n   * without any runtime overhead.\r\n   * Casting a view to a normal string is not supported and will lead to unexpected behavior (use\r\n   * `ZyanStringDuplicate` to create a deep-copy instead).\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZyanStringView_\r\n  {\r\n    /**\r\n     * The string data.\r\n     *\r\n     * The view internally re-uses the normal string struct to allow casts without any runtime\r\n     * overhead.\r\n     */\r\n    ZyanString string;\r\n  } ZyanStringView;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* General                                                                                        */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines an uninitialized `ZyanString` instance.\r\n   */\r\n#define ZYAN_STRING_INITIALIZER \\\r\n{ \\\r\n/* flags  */ 0, \\\r\n/* vector */ ZYAN_VECTOR_INITIALIZER \\\r\n}\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Helper macros                                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Casts a `ZyanString` pointer to a constant `ZyanStringView` pointer.\r\n   */\r\n#define ZYAN_STRING_TO_VIEW(string) (const ZyanStringView*)(string)\r\n  \r\n  /**\r\n   * Defines a `ZyanStringView` struct that provides a view into a static C-style string.\r\n   *\r\n   * @param   string  The C-style string.\r\n   */\r\n#define ZYAN_DEFINE_STRING_VIEW(string) \\\r\n{ \\\r\n/* string */ \\\r\n{ \\\r\n/* flags  */ 0, \\\r\n/* vector */ \\\r\n{ \\\r\n/* allocator        */ ZYAN_NULL, \\\r\n/* growth_factor    */ 1, \\\r\n/* shrink_threshold */ 0, \\\r\n/* size             */ sizeof(string), \\\r\n/* capacity         */ sizeof(string), \\\r\n/* element_size     */ sizeof(char), \\\r\n/* destructor       */ ZYAN_NULL, \\\r\n/* data             */ (char*)(string) \\\r\n} \\\r\n} \\\r\n}\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Constructor and destructor                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#ifndef ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes the given `ZyanString` instance.\r\n   *\r\n   * @param   string          A pointer to the `ZyanString` instance.\r\n   * @param   capacity        The initial capacity (number of characters).\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The memory for the string is dynamically allocated by the default allocator using the default\r\n   * growth factor and the default shrink threshold.\r\n   *\r\n   * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\r\n   * space for the terminating '\\0'.\r\n   *\r\n   * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringInit(ZyanString* string, ZyanUSize capacity);\r\n  \r\n#endif // ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes the given `ZyanString` instance and sets a custom `allocator` and memory\r\n   * allocation/deallocation parameters.\r\n   *\r\n   * @param   string              A pointer to the `ZyanString` instance.\r\n   * @param   capacity            The initial capacity (number of characters).\r\n   * @param   allocator           A pointer to a `ZyanAllocator` instance.\r\n   * @param   growth_factor       The growth factor.\r\n   * @param   shrink_threshold    The shrink threshold.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\r\n   * dynamic shrinking.\r\n   *\r\n   * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\r\n   * space for the terminating '\\0'.\r\n   *\r\n   * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringInitEx(ZyanString* string, ZyanUSize capacity,\r\n                                            ZyanAllocator* allocator, ZyanU8 growth_factor, ZyanU8 shrink_threshold);\r\n  \r\n  /**\r\n   * Initializes the given `ZyanString` instance and configures it to use a custom user\r\n   * defined buffer with a fixed size.\r\n   *\r\n   * @param   string          A pointer to the `ZyanString` instance.\r\n   * @param   buffer          A pointer to the buffer that is used as storage for the string.\r\n   * @param   capacity        The maximum capacity (number of characters) of the buffer, including\r\n   *                          the terminating '\\0'.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Finalization is not required for strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringInitCustomBuffer(ZyanString* string, char* buffer,\r\n                                                      ZyanUSize capacity);\r\n  \r\n  /**\r\n   * Destroys the given `ZyanString` instance.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringDestroy(ZyanString* string);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Duplication                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#ifndef ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes a new `ZyanString` instance by duplicating an existing string.\r\n   *\r\n   * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\r\n   * @param   source      A pointer to the source string.\r\n   * @param   capacity    The initial capacity (number of characters).\r\n   *\r\n   *                      This value is automatically adjusted to the size of the source string, if\r\n   *                      a smaller value was passed.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The behavior of this function is undefined, if `source` is a view into the `destination`\r\n   * string or `destination` points to an already initialized `ZyanString` instance.\r\n   *\r\n   * The memory for the string is dynamically allocated by the default allocator using the default\r\n   * growth factor and the default shrink threshold.\r\n   *\r\n   * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\r\n   * space for the terminating '\\0'.\r\n   *\r\n   * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringDuplicate(ZyanString* destination,\r\n                                                                  const ZyanStringView* source, ZyanUSize capacity);\r\n  \r\n#endif // ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes a new `ZyanString` instance by duplicating an existing string and sets a\r\n   * custom `allocator` and memory allocation/deallocation parameters.\r\n   *\r\n   * @param   destination         A pointer to the (uninitialized) destination `ZyanString` instance.\r\n   * @param   source              A pointer to the source string.\r\n   * @param   capacity            The initial capacity (number of characters).\r\n  \r\n   *                              This value is automatically adjusted to the size of the source\r\n   *                              string, if a smaller value was passed.\r\n   * @param   allocator           A pointer to a `ZyanAllocator` instance.\r\n   * @param   growth_factor       The growth factor.\r\n   * @param   shrink_threshold    The shrink threshold.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The behavior of this function is undefined, if `source` is a view into the `destination`\r\n   * string or `destination` points to an already initialized `ZyanString` instance.\r\n   *\r\n   * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\r\n   * dynamic shrinking.\r\n   *\r\n   * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\r\n   * space for the terminating '\\0'.\r\n   *\r\n   * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringDuplicateEx(ZyanString* destination,\r\n                                                 const ZyanStringView* source, ZyanUSize capacity, ZyanAllocator* allocator,\r\n                                                 ZyanU8 growth_factor, ZyanU8 shrink_threshold);\r\n  \r\n  /**\r\n   * Initializes a new `ZyanString` instance by duplicating an existing string and\r\n   * configures it to use a custom user defined buffer with a fixed size.\r\n   *\r\n   * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\r\n   * @param   source      A pointer to the source string.\r\n   * @param   buffer      A pointer to the buffer that is used as storage for the string.\r\n   * @param   capacity    The maximum capacity (number of characters) of the buffer, including the\r\n   *                      terminating '\\0'.\r\n  \r\n   *                      This function will fail, if the capacity of the buffer is less or equal to\r\n   *                      the size of the source string.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The behavior of this function is undefined, if `source` is a view into the `destination`\r\n   * string or `destination` points to an already initialized `ZyanString` instance.\r\n   *\r\n   * Finalization is not required for strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringDuplicateCustomBuffer(ZyanString* destination,\r\n                                                           const ZyanStringView* source, char* buffer, ZyanUSize capacity);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Concatenation                                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#ifndef ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes a new `ZyanString` instance by concatenating two existing strings.\r\n   *\r\n   * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\r\n   *\r\n   *                      This function will fail, if the destination `ZyanString` instance equals\r\n   *                      one of the source strings.\r\n   * @param   s1          A pointer to the first source string.\r\n   * @param   s2          A pointer to the second source string.\r\n   * @param   capacity    The initial capacity (number of characters).\r\n  \r\n   *                      This value is automatically adjusted to the combined size of the source\r\n   *                      strings, if a smaller value was passed.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`\r\n   * string or `destination` points to an already initialized `ZyanString` instance.\r\n   *\r\n   * The memory for the string is dynamically allocated by the default allocator using the default\r\n   * growth factor and the default shrink threshold.\r\n   *\r\n   * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\r\n   * space for the terminating '\\0'.\r\n   *\r\n   * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZYAN_REQUIRES_LIBC ZyanStatus ZyanStringConcat(ZyanString* destination,\r\n                                                               const ZyanStringView* s1, const ZyanStringView* s2, ZyanUSize capacity);\r\n  \r\n#endif // ZYAN_NO_LIBC\r\n  \r\n  /**\r\n   * Initializes a new `ZyanString` instance by concatenating two existing strings and sets\r\n   * a custom `allocator` and memory allocation/deallocation parameters.\r\n   *\r\n   * @param   destination         A pointer to the (uninitialized) destination `ZyanString` instance.\r\n   *\r\n   *                              This function will fail, if the destination `ZyanString` instance\r\n   *                              equals one of the source strings.\r\n   * @param   s1                  A pointer to the first source string.\r\n   * @param   s2                  A pointer to the second source string.\r\n   * @param   capacity            The initial capacity (number of characters).\r\n   *\r\n   *                              This value is automatically adjusted to the combined size of the\r\n   *                              source strings, if a smaller value was passed.\r\n   * @param   allocator           A pointer to a `ZyanAllocator` instance.\r\n   * @param   growth_factor       The growth factor.\r\n   * @param   shrink_threshold    The shrink threshold.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`\r\n   * string or `destination` points to an already initialized `ZyanString` instance.\r\n   *\r\n   * A growth factor of `1` disables overallocation and a shrink threshold of `0` disables\r\n   * dynamic shrinking.\r\n   *\r\n   * The allocated buffer will be at least one character larger than the given `capacity`, to reserve\r\n   * space for the terminating '\\0'.\r\n   *\r\n   * Finalization with `ZyanStringDestroy` is required for all strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringConcatEx(ZyanString* destination, const ZyanStringView* s1,\r\n                                              const ZyanStringView* s2, ZyanUSize capacity, ZyanAllocator* allocator, ZyanU8 growth_factor,\r\n                                              ZyanU8 shrink_threshold);\r\n  \r\n  /**\r\n   * Initializes a new `ZyanString` instance by concatenating two existing strings and\r\n   * configures it to use a custom user defined buffer with a fixed size.\r\n   *\r\n   * @param   destination A pointer to the (uninitialized) destination `ZyanString` instance.\r\n   *\r\n   *                      This function will fail, if the destination `ZyanString` instance equals\r\n   *                      one of the source strings.\r\n   * @param   s1          A pointer to the first source string.\r\n   * @param   s2          A pointer to the second source string.\r\n   * @param   buffer      A pointer to the buffer that is used as storage for the string.\r\n   * @param   capacity    The maximum capacity (number of characters) of the buffer.\r\n   *\r\n   *                      This function will fail, if the capacity of the buffer is less or equal to\r\n   *                      the combined size of the source strings.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The behavior of this function is undefined, if `s1` or `s2` are views into the `destination`\r\n   * string or `destination` points to an already initialized `ZyanString` instance.\r\n   *\r\n   * Finalization is not required for strings created by this function.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringConcatCustomBuffer(ZyanString* destination,\r\n                                                        const ZyanStringView* s1, const ZyanStringView* s2, char* buffer, ZyanUSize capacity);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Views                                                                                          */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns a view inside an existing view/string.\r\n   *\r\n   * @param   view    A pointer to the `ZyanStringView` instance.\r\n   * @param   source  A pointer to the source string.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the\r\n   * `source` string.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideView(ZyanStringView* view,\r\n                                                    const ZyanStringView* source);\r\n  \r\n  /**\r\n   * Returns a view inside an existing view/string starting from the given `index`.\r\n   *\r\n   * @param   view    A pointer to the `ZyanStringView` instance.\r\n   * @param   source  A pointer to the source string.\r\n   * @param   index   The start index.\r\n   * @param   count   The number of characters.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * The `ZYAN_STRING_TO_VEW` macro can be used to pass any `ZyanString` instance as value for the\r\n   * `source` string.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideViewEx(ZyanStringView* view,\r\n                                                      const ZyanStringView* source, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /**\r\n   * Returns a view inside a null-terminated C-style string.\r\n   *\r\n   * @param   view    A pointer to the `ZyanStringView` instance.\r\n   * @param   string  The C-style string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBuffer(ZyanStringView* view, const char* string);\r\n  \r\n  /**\r\n   * Returns a view inside a character buffer with custom length.\r\n   *\r\n   * @param   view    A pointer to the `ZyanStringView` instance.\r\n   * @param   buffer  A pointer to the buffer containing the string characters.\r\n   * @param   length  The length of the string (number of characters).\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringViewInsideBufferEx(ZyanStringView* view, const char* buffer,\r\n                                                        ZyanUSize length);\r\n  \r\n  /**\r\n   * Returns the size (number of characters) of the view.\r\n   *\r\n   * @param   view    A pointer to the `ZyanStringView` instance.\r\n   * @param   size    Receives the size (number of characters) of the view.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringViewGetSize(const ZyanStringView* view, ZyanUSize* size);\r\n  \r\n  /**\r\n   * Returns the C-style string of the given `ZyanString` instance.\r\n   *\r\n   * @warning The string is not guaranteed to be null terminated!\r\n   *\r\n   * @param   view    A pointer to the `ZyanStringView` instance.\r\n   * @param   buffer  Receives a pointer to the C-style string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringViewGetData(const ZyanStringView* view, const char** buffer);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Character access                                                                               */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the character at the given `index`.\r\n   *\r\n   * @param   string  A pointer to the `ZyanStringView` instance.\r\n   * @param   index   The character index.\r\n   * @param   value   Receives the desired character of the string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringGetChar(const ZyanStringView* string, ZyanUSize index,\r\n                                             char* value);\r\n  \r\n  /**\r\n   * Returns a pointer to the character at the given `index`.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   index   The character index.\r\n   * @param   value   Receives a pointer to the desired character in the string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringGetCharMutable(ZyanString* string, ZyanUSize index,\r\n                                                    char** value);\r\n  \r\n  /**\r\n   * Assigns a new value to the character at the given `index`.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   index   The character index.\r\n   * @param   value   The character to assign.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringSetChar(ZyanString* string, ZyanUSize index, char value);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Insertion                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Inserts the content of the source string in the destination string at the given `index`.\r\n   *\r\n   * @param   destination The destination string.\r\n   * @param   index       The insert index.\r\n   * @param   source      The source string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringInsert(ZyanString* destination, ZyanUSize index,\r\n                                            const ZyanStringView* source);\r\n  \r\n  /**\r\n   * Inserts `count` characters of the source string in the destination string at the given\r\n   * `index`.\r\n   *\r\n   * @param   destination         The destination string.\r\n   * @param   destination_index   The insert index.\r\n   * @param   source              The source string.\r\n   * @param   source_index        The index of the first character to be inserted from the source\r\n   *                              string.\r\n   * @param   count               The number of chars to insert from the source string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringInsertEx(ZyanString* destination, ZyanUSize destination_index,\r\n                                              const ZyanStringView* source, ZyanUSize source_index, ZyanUSize count);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Appending                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Appends the content of the source string to the end of the destination string.\r\n   *\r\n   * @param   destination The destination string.\r\n   * @param   source      The source string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringAppend(ZyanString* destination, const ZyanStringView* source);\r\n  \r\n  /**\r\n   * Appends `count` characters of the source string to the end of the destination string.\r\n   *\r\n   * @param   destination     The destination string.\r\n   * @param   source          The source string.\r\n   * @param   source_index    The index of the first character to be appended from the source string.\r\n   * @param   count           The number of chars to append from the source string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringAppendEx(ZyanString* destination, const ZyanStringView* source,\r\n                                              ZyanUSize source_index, ZyanUSize count);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Deletion                                                                                       */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Deletes characters from the given string, starting at `index`.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   index   The index of the first character to delete.\r\n   * @param   count   The number of characters to delete.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringDelete(ZyanString* string, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /**\r\n   * Deletes all remaining characters from the given string, starting at `index`.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   index   The index of the first character to delete.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringTruncate(ZyanString* string, ZyanUSize index);\r\n  \r\n  /**\r\n   * Erases the given string.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringClear(ZyanString* string);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Searching                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Searches for the first occurrence of `needle` in the given `haystack` starting from the\r\n   * left.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occured.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringLPos(const ZyanStringView* haystack,\r\n                                          const ZyanStringView* needle, ZyanISize* found_index);\r\n  \r\n  /**\r\n   * Searches for the first occurrence of `needle` in the given `haystack` starting from the\r\n   * left.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   * @param   index       The start index.\r\n   * @param   count       The maximum number of characters to iterate, beginning from the start\r\n   *                      `index`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occured.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringLPosEx(const ZyanStringView* haystack,\r\n                                            const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /**\r\n   * Performs a case-insensitive search for the first occurrence of `needle` in the given\r\n   * `haystack` starting from the left.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occured.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringLPosI(const ZyanStringView* haystack,\r\n                                           const ZyanStringView* needle, ZyanISize* found_index);\r\n  \r\n  /**\r\n   * Performs a case-insensitive search for the first occurrence of `needle` in the given\r\n   * `haystack` starting from the left.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   * @param   index       The start index.\r\n   * @param   count       The maximum number of characters to iterate, beginning from the start\r\n   *                      `index`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringLPosIEx(const ZyanStringView* haystack,\r\n                                             const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /**\r\n   * Searches for the first occurrence of `needle` in the given `haystack` starting from the\r\n   * right.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringRPos(const ZyanStringView* haystack,\r\n                                          const ZyanStringView* needle, ZyanISize* found_index);\r\n  \r\n  /**\r\n   * Searches for the first occurrence of `needle` in the given `haystack` starting from the\r\n   *          right.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   * @param   index       The start index.\r\n   * @param   count       The maximum number of characters to iterate, beginning from the start\r\n   *                      `index`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringRPosEx(const ZyanStringView* haystack,\r\n                                            const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /**\r\n   * Performs a case-insensitive search for the first occurrence of `needle` in the given\r\n   * `haystack` starting from the right.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringRPosI(const ZyanStringView* haystack,\r\n                                           const ZyanStringView* needle, ZyanISize* found_index);\r\n  \r\n  /**\r\n   * Performs a case-insensitive search for the first occurrence of `needle` in the given\r\n   * `haystack` starting from the right.\r\n   *\r\n   * @param   haystack    The string to search in.\r\n   * @param   needle      The sub-string to search for.\r\n   * @param   found_index A pointer to a variable that receives the index of the first occurrence of\r\n   *                      `needle`.\r\n   * @param   index       The start index.\r\n   * @param   count       The maximum number of characters to iterate, beginning from the start\r\n   *                      `index`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the needle was found, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   *\r\n   * The `found_index` is set to `-1`, if the needle was not found.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringRPosIEx(const ZyanStringView* haystack,\r\n                                             const ZyanStringView* needle, ZyanISize* found_index, ZyanUSize index, ZyanUSize count);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Comparing                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Compares two strings.\r\n   *\r\n   * @param   s1      The first string\r\n   * @param   s2      The second string.\r\n   * @param   result  Receives the comparison result.\r\n   *\r\n   *                  Values:\r\n   *                  - `result  < 0` -> The first character that does not match has a lower value\r\n   *                    in `s1` than in `s2`.\r\n   *                  - `result == 0` -> The contents of both strings are equal.\r\n   *                  - `result  > 0` -> The first character that does not match has a greater value\r\n   *                    in `s1` than in `s2`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringCompare(const ZyanStringView* s1, const ZyanStringView* s2,\r\n                                             ZyanI32* result);\r\n  \r\n  /**\r\n   * Performs a case-insensitive comparison of two strings.\r\n   *\r\n   * @param   s1      The first string\r\n   * @param   s2      The second string.\r\n   * @param   result  Receives the comparison result.\r\n   *\r\n   *                  Values:\r\n   *                  - `result  < 0` -> The first character that does not match has a lower value\r\n   *                    in `s1` than in `s2`.\r\n   *                  - `result == 0` -> The contents of both strings are equal.\r\n   *                  - `result  > 0` -> The first character that does not match has a greater value\r\n   *                    in `s1` than in `s2`.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE`, if the strings are equal, `ZYAN_STATUS_FALSE`, if not, or another\r\n   *          zyan status code, if an error occurred.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringCompareI(const ZyanStringView* s1, const ZyanStringView* s2,\r\n                                              ZyanI32* result);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Case conversion                                                                                */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Converts the given string to lowercase letters.\r\n   *\r\n   * @param   string      A pointer to the `ZyanString` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringToLowerCase(ZyanString* string);\r\n  \r\n  /**\r\n   * Converts `count` characters of the given string to lowercase letters.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   index   The start index.\r\n   * @param   count   The number of characters to convert, beginning from the start `index`.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringToLowerCaseEx(ZyanString* string, ZyanUSize index,\r\n                                                   ZyanUSize count);\r\n  \r\n  /**\r\n   * Converts the given string to uppercase letters.\r\n   *\r\n   * @param   string      A pointer to the `ZyanString` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringToUpperCase(ZyanString* string);\r\n  \r\n  /**\r\n   * Converts `count` characters of the given string to uppercase letters.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   index   The start index.\r\n   * @param   count   The number of characters to convert, beginning from the start `index`.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringToUpperCaseEx(ZyanString* string, ZyanUSize index,\r\n                                                   ZyanUSize count);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Memory management                                                                              */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Resizes the given `ZyanString` instance.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   size    The new size of the string.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringResize(ZyanString* string, ZyanUSize size);\r\n  \r\n  /**\r\n   * Changes the capacity of the given `ZyanString` instance.\r\n   *\r\n   * @param   string      A pointer to the `ZyanString` instance.\r\n   * @param   capacity    The new minimum capacity of the string.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringReserve(ZyanString* string, ZyanUSize capacity);\r\n  \r\n  /**\r\n   * Shrinks the capacity of the given string to match it's size.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function will fail, if the `ZYAN_STRING_IS_IMMUTABLE` flag is set for the specified\r\n   * `ZyanString` instance.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringShrinkToFit(ZyanString* string);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Information                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the current capacity of the string.\r\n   *\r\n   * @param   string      A pointer to the `ZyanString` instance.\r\n   * @param   capacity    Receives the size of the string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringGetCapacity(const ZyanString* string, ZyanUSize* capacity);\r\n  \r\n  /**\r\n   * Returns the current size (number of characters) of the string (excluding the\r\n   * terminating zero character).\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   size    Receives the size (number of characters) of the string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringGetSize(const ZyanString* string, ZyanUSize* size);\r\n  \r\n  /**\r\n   * Returns the C-style string of the given `ZyanString` instance.\r\n   *\r\n   * @param   string  A pointer to the `ZyanString` instance.\r\n   * @param   value   Receives a pointer to the C-style string.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYCORE_EXPORT ZyanStatus ZyanStringGetData(const ZyanString* string, const char** value);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif // ZYCORE_STRING_H\r\n\r\n//\r\n// Header: Zydis/FormatterBuffer.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//   - Zydis/Formatter.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Implements the `ZydisFormatterToken` type and provides functions to use it.\r\n */\r\n\r\n#ifndef ZYDIS_FORMATTER_TOKEN_H\r\n#define ZYDIS_FORMATTER_TOKEN_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Constants                                                                                      */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Token types                                                                                    */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisTokenType` data-type.\r\n   */\r\n  typedef ZyanU8 ZydisTokenType;\r\n  \r\n#define ZYDIS_TOKEN_INVALID             0x00\r\n  /**\r\n   * A whitespace character.\r\n   */\r\n#define ZYDIS_TOKEN_WHITESPACE          0x01\r\n  /**\r\n   * A delimiter character (like `','`, `':'`, `'+'`, `'-'`, `'*'`).\r\n   */\r\n#define ZYDIS_TOKEN_DELIMITER           0x02\r\n  /**\r\n   * An opening parenthesis character (like `'('`, `'['`, `'{'`).\r\n   */\r\n#define ZYDIS_TOKEN_PARENTHESIS_OPEN    0x03\r\n  /**\r\n   * A closing parenthesis character (like `')'`, `']'`, `'}'`).\r\n   */\r\n#define ZYDIS_TOKEN_PARENTHESIS_CLOSE   0x04\r\n  /**\r\n   * A prefix literal (like `\"LOCK\"`, `\"REP\"`).\r\n   */\r\n#define ZYDIS_TOKEN_PREFIX              0x05\r\n  /**\r\n   * A mnemonic literal (like `\"MOV\"`, `\"VCMPPSD\"`, `\"LCALL\"`).\r\n   */\r\n#define ZYDIS_TOKEN_MNEMONIC            0x06\r\n  /**\r\n   * A register literal (like `\"RAX\"`, `\"DS\"`, `\"%ECX\"`).\r\n   */\r\n#define ZYDIS_TOKEN_REGISTER            0x07\r\n  /**\r\n   * An absolute address literal (like `0x00400000`).\r\n   */\r\n#define ZYDIS_TOKEN_ADDRESS_ABS         0x08\r\n  /**\r\n   * A relative address literal (like `-0x100`).\r\n   */\r\n#define ZYDIS_TOKEN_ADDRESS_REL         0x09\r\n  /**\r\n   * A displacement literal (like `0xFFFFFFFF`, `-0x100`, `+0x1234`).\r\n   */\r\n#define ZYDIS_TOKEN_DISPLACEMENT        0x0A\r\n  /**\r\n   * An immediate literal (like `0xC0`, `-0x1234`, `$0x0000`).\r\n   */\r\n#define ZYDIS_TOKEN_IMMEDIATE           0x0B\r\n  /**\r\n   * A typecast literal (like `DWORD PTR`).\r\n   */\r\n#define ZYDIS_TOKEN_TYPECAST            0x0C\r\n  /**\r\n   * A decorator literal (like `\"Z\"`, `\"1TO4\"`).\r\n   */\r\n#define ZYDIS_TOKEN_DECORATOR           0x0D\r\n  /**\r\n   * A symbol literal.\r\n   */\r\n#define ZYDIS_TOKEN_SYMBOL              0x0E\r\n  \r\n  /**\r\n   * The base for user-defined token types.\r\n   */\r\n#define ZYDIS_TOKEN_USER                0x80\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Token                                                                                          */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#pragma pack(push, 1)\r\n  \r\n  /**\r\n   * Defines the `ZydisFormatterToken` struct.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   */\r\n  typedef struct ZydisFormatterToken_\r\n  {\r\n    /**\r\n     * The token type.\r\n     */\r\n    ZydisTokenType type;\r\n    /**\r\n     * An offset to the next token, or `0`.\r\n     */\r\n    ZyanU8 next;\r\n  } ZydisFormatterToken;\r\n  \r\n#pragma pack(pop)\r\n  \r\n  /**\r\n   * Defines the `ZydisFormatterTokenConst` data-type.\r\n   */\r\n  typedef const ZydisFormatterToken ZydisFormatterTokenConst;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Buffer                                                                                         */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisFormatterBuffer` struct.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may\r\n   * lead to unexpected behavior.\r\n   */\r\n  typedef struct ZydisFormatterBuffer_\r\n  {\r\n    /**\r\n     * `ZYAN_TRUE`, if the buffer contains a token stream or `ZYAN_FALSE, if it\r\n     *  contains a simple string.\r\n     */\r\n    ZyanBool is_token_list;\r\n    /**\r\n     * The remaining capacity of the buffer.\r\n     */\r\n    ZyanUSize capacity;\r\n    /**\r\n     * The `ZyanString` instance that refers to the literal value of the most\r\n     * recently added token.\r\n     */\r\n    ZyanString string;\r\n  } ZydisFormatterBuffer;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Token                                                                                          */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the `type` and the string `value` of the given `token`.\r\n   *\r\n   * @param   token   A pointer to the `ZydisFormatterToken` struct.\r\n   * @param   type    Receives the token type.\r\n   * @param   value   Receives a pointer to the string value of the token.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenGetValue(const ZydisFormatterToken* token,\r\n                                                      ZydisTokenType* type, ZyanConstCharPointer* value);\r\n  \r\n  /**\r\n   * Obtains the next `token` linked to the passed one.\r\n   *\r\n   * @param   token   Receives a pointer to the next `ZydisFormatterToken` struct\r\n   *                  linked to the passed one.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenNext(ZydisFormatterTokenConst** token);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Buffer                                                                                         */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Returns the current (most recently added) token.\r\n   *\r\n   * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   token   Receives a pointer to the current token.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least\r\n   * one token.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetToken(const ZydisFormatterBuffer* buffer,\r\n                                                       ZydisFormatterTokenConst** token);\r\n  \r\n  /**\r\n   * Returns the `ZyanString` instance associated with the given buffer.\r\n   *\r\n   * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   string  Receives a pointer to the `ZyanString` instance associated with the given\r\n   *                  buffer.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function returns `ZYAN_STATUS_INVALID_OPERATION`, if the buffer does not contain at least\r\n   * one token.\r\n   *\r\n   * The returned string always refers to the literal value of the current (most recently added)\r\n   * token and will remain valid until the buffer is destroyed.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferGetString(ZydisFormatterBuffer* buffer,\r\n                                                        ZyanString** string);\r\n  \r\n  /**\r\n   * Appends a new token to the `buffer`.\r\n   *\r\n   * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   type    The type of the new token.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will\r\n   * automatically be updated by calling this function.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferAppend(ZydisFormatterBuffer* buffer,\r\n                                                     ZydisTokenType type);\r\n  \r\n  /**\r\n   * Returns a snapshot of the buffer-state.\r\n   *\r\n   * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   state   Receives a snapshot of the buffer-state.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Note that the buffer-state is saved inside the buffer itself and thus becomes invalid as soon\r\n   * as the buffer gets overwritten or destroyed.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRemember(const ZydisFormatterBuffer* buffer,\r\n                                                       ZyanUPointer* state);\r\n  \r\n  /**\r\n   * Restores a previously saved buffer-state.\r\n   *\r\n   * @param   buffer  A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   state   The buffer-state to restore.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * All tokens added after obtaining the given `state` snapshot will be removed. This function\r\n   * does NOT restore any string content.\r\n   *\r\n   * Note that the `ZyanString` instance returned by `ZydisFormatterBufferGetString` will\r\n   * automatically be updated by calling this function.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterBufferRestore(ZydisFormatterBuffer* buffer,\r\n                                                      ZyanUPointer state);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_FORMATTER_TOKEN_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Constants                                                                                      */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Use this constant as value for `runtime_address` in `ZydisFormatterFormatInstruction(Ex)`\r\n   * or `ZydisFormatterFormatOperand(Ex)` to print relative values for all addresses.\r\n   */\r\n#define ZYDIS_RUNTIME_ADDRESS_NONE (ZyanU64)(-1)\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Formatter style                                                                                */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum selecting the syntax to format the disassembly in.\r\n   */\r\n  typedef enum ZydisFormatterStyle_\r\n  {\r\n    /**\r\n     * Generates `AT&T`-style disassembly.\r\n     */\r\n    ZYDIS_FORMATTER_STYLE_ATT,\r\n    /**\r\n     * Generates `Intel`-style disassembly.\r\n     */\r\n    ZYDIS_FORMATTER_STYLE_INTEL,\r\n    /**\r\n     * Generates `MASM`-style disassembly that is directly accepted as input for\r\n     * the `MASM` assembler.\r\n     *\r\n     * The runtime-address is ignored in this mode.\r\n     */\r\n    ZYDIS_FORMATTER_STYLE_INTEL_MASM,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_FORMATTER_STYLE_MAX_VALUE = ZYDIS_FORMATTER_STYLE_INTEL_MASM,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_FORMATTER_STYLE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_STYLE_MAX_VALUE)\r\n  } ZydisFormatterStyle;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Properties                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum selecting a property of the formatter.\r\n   */\r\n  typedef enum ZydisFormatterProperty_\r\n  {\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* General                                                                                  */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the printing of effective operand-size suffixes (`AT&T`) or operand-sizes\r\n     * of memory operands (`INTEL`).\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print the size, or `ZYAN_FALSE`\r\n     * to only print it if needed.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_FORCE_SIZE,\r\n    /**\r\n     * Controls the printing of segment prefixes.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print the segment register of\r\n     * memory-operands or `ZYAN_FALSE` to omit implicit `DS`/`SS` segments.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_FORCE_SEGMENT,\r\n    /**\r\n     * Controls the printing of the scale-factor component for memory operands.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print the scale-factor component\r\n     * of memory operands or `ZYAN_FALSE` to omit the scale factor for values of `1`.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE,\r\n    /**\r\n     * Controls the printing of branch addresses.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print relative branch addresses\r\n     * or `ZYAN_FALSE` to use absolute addresses, if a runtime-address different to\r\n     * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES,\r\n    /**\r\n     * Controls the printing of `EIP`/`RIP`-relative addresses.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to force the formatter to always print relative addresses for\r\n     * `EIP`/`RIP`-relative operands or `ZYAN_FALSE` to use absolute addresses, if a runtime-\r\n     * address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was passed.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL,\r\n    /**\r\n     * Controls the printing of branch-instructions sizes.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to print the size (`short`, `near`) of branch\r\n     * instructions or `ZYAN_FALSE` to hide it.\r\n     *\r\n     * Note that the `far`/`l` modifier is always printed.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE,\r\n    \r\n    /**\r\n     * Controls the printing of instruction prefixes.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to print all instruction-prefixes (even ignored or duplicate\r\n     * ones) or `ZYAN_FALSE` to only print prefixes that are effectively used by the instruction.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Numeric values                                                                           */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the base of address values.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_ADDR_BASE,\r\n    /**\r\n     * Controls the signedness of relative addresses. Absolute addresses are\r\n     * always unsigned.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS,\r\n    /**\r\n     * Controls the padding of absolute address values.\r\n     *\r\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to pad all\r\n     * addresses to the current address width (hexadecimal only), or any other integer value for\r\n     * custom padding.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE,\r\n    /**\r\n     * Controls the padding of relative address values.\r\n     *\r\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to pad all\r\n     * addresses to the current address width (hexadecimal only), or any other integer value for\r\n     * custom padding.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the base of displacement values.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_DISP_BASE,\r\n    /**\r\n     * Controls the signedness of displacement values.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS,\r\n    /**\r\n     * Controls the padding of displacement values.\r\n     *\r\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, or any other integer value for custom\r\n     * padding.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_DISP_PADDING,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the base of immediate values.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_IMM_BASE,\r\n    /**\r\n     * Controls the signedness of immediate values.\r\n     *\r\n     * Pass `ZYDIS_SIGNEDNESS_AUTO` to automatically choose the most suitable mode based on the\r\n     * operands `ZydisDecodedOperand.imm.is_signed` attribute.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS,\r\n    /**\r\n     * Controls the padding of immediate values.\r\n     *\r\n     * Pass `ZYDIS_PADDING_DISABLED` to disable padding, `ZYDIS_PADDING_AUTO` to padd all\r\n     * immediates to the operand-width (hexadecimal only), or any other integer value for custom\r\n     * padding.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_IMM_PADDING,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Text formatting                                                                          */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the letter-case for prefixes.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES,\r\n    /**\r\n     * Controls the letter-case for the mnemonic.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC,\r\n    /**\r\n     * Controls the letter-case for registers.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS,\r\n    /**\r\n     * Controls the letter-case for typecasts.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS,\r\n    /**\r\n     * Controls the letter-case for decorators.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to format in uppercase or `ZYAN_FALSE` to format in lowercase.\r\n     *\r\n     * WARNING: this is currently not implemented (ignored).\r\n     */\r\n    ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Number formatting                                                                        */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the prefix for decimal values.\r\n     *\r\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\r\n     * to set a custom prefix, or `ZYAN_NULL` to disable it.\r\n     *\r\n     * The string is deep-copied into an internal buffer.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_DEC_PREFIX,\r\n    /**\r\n     * Controls the suffix for decimal values.\r\n     *\r\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\r\n     * to set a custom suffix, or `ZYAN_NULL` to disable it.\r\n     *\r\n     * The string is deep-copied into an internal buffer.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_DEC_SUFFIX,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Controls the letter-case of hexadecimal values.\r\n     *\r\n     * Pass `ZYAN_TRUE` as value to format in uppercase and `ZYAN_FALSE` to format in lowercase.\r\n     *\r\n     * The default value is `ZYAN_TRUE`.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_HEX_UPPERCASE,\r\n    /**\r\n     * Controls whether to prepend hexadecimal values with a leading zero if the first character\r\n     * is non-numeric.\r\n     *\r\n     * Pass `ZYAN_TRUE` to prepend a leading zero if the first character is non-numeric or\r\n     * `ZYAN_FALSE` to disable this functionality.\r\n     *\r\n     * The default value is `ZYAN_FALSE`.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER,\r\n    /**\r\n     * Controls the prefix for hexadecimal values.\r\n     *\r\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\r\n     * to set a custom prefix, or `ZYAN_NULL` to disable it.\r\n     *\r\n     * The string is deep-copied into an internal buffer.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_HEX_PREFIX,\r\n    /**\r\n     * Controls the suffix for hexadecimal values.\r\n     *\r\n     * Pass a pointer to a null-terminated C-style string with a maximum length of 10 characters\r\n     * to set a custom suffix, or `ZYAN_NULL` to disable it.\r\n     *\r\n     * The string is deep-copied into an internal buffer.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_HEX_SUFFIX,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_MAX_VALUE = ZYDIS_FORMATTER_PROP_HEX_SUFFIX,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_FORMATTER_PROP_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_PROP_MAX_VALUE)\r\n  } ZydisFormatterProperty;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum defining different mantissae to be used during formatting.\r\n   */\r\n  typedef enum ZydisNumericBase_\r\n  {\r\n    /**\r\n     * Decimal system.\r\n     */\r\n    ZYDIS_NUMERIC_BASE_DEC,\r\n    /**\r\n     * Hexadecimal system.\r\n     */\r\n    ZYDIS_NUMERIC_BASE_HEX,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_NUMERIC_BASE_MAX_VALUE = ZYDIS_NUMERIC_BASE_HEX,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_NUMERIC_BASE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_NUMERIC_BASE_MAX_VALUE)\r\n  } ZydisNumericBase;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum defining the signeness of integers to be used during formatting.\r\n   */\r\n  typedef enum ZydisSignedness_\r\n  {\r\n    /**\r\n     * Automatically choose the most suitable mode based on the operands\r\n     * ZydisDecodedOperand.imm.is_signed` attribute.\r\n     */\r\n    ZYDIS_SIGNEDNESS_AUTO,\r\n    /**\r\n     * Force signed values.\r\n     */\r\n    ZYDIS_SIGNEDNESS_SIGNED,\r\n    /**\r\n     * Force unsigned values.\r\n     */\r\n    ZYDIS_SIGNEDNESS_UNSIGNED,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_SIGNEDNESS_MAX_VALUE = ZYDIS_SIGNEDNESS_UNSIGNED,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_SIGNEDNESS_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_SIGNEDNESS_MAX_VALUE)\r\n  } ZydisSignedness;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum definining magic values that receive special treatment when used as padding properties\r\n   * of the formatter.\r\n   */\r\n  typedef enum ZydisPadding_\r\n  {\r\n    /**\r\n     * Disables padding.\r\n     */\r\n    ZYDIS_PADDING_DISABLED = 0,\r\n    /**\r\n     * Padds the value to the current stack-width for addresses, or to the\r\n     * operand-width for immediate values (hexadecimal only).\r\n     */\r\n    ZYDIS_PADDING_AUTO     = (-1),\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_PADDING_MAX_VALUE = ZYDIS_PADDING_AUTO,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_PADDING_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_PADDING_MAX_VALUE)\r\n  } ZydisPadding;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Function types                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum selecting a formatter function to be replaced with hooks.\r\n   *\r\n   * Do NOT change the order of the values this enum or the function fields inside the\r\n   * `ZydisFormatter` struct.\r\n   */\r\n  typedef enum ZydisFormatterFunction_\r\n  {\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Instruction                                                                              */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function is invoked before the formatter formats an instruction.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION,\r\n    /**\r\n     * This function is invoked after the formatter formatted an instruction.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function refers to the main formatting function.\r\n     *\r\n     * Replacing this function allows for complete custom formatting, but indirectly disables all\r\n     * other hooks except for `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` and\r\n     * `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Operands                                                                                 */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function is invoked before the formatter formats an operand.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRE_OPERAND,\r\n    /**\r\n     * This function is invoked after the formatter formatted an operand.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_POST_OPERAND,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function is invoked to format a register operand.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG,\r\n    /**\r\n     * This function is invoked to format a memory operand.\r\n     *\r\n     * Replacing this function might indirectly disable some specific calls to the\r\n     * `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`, `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`,\r\n     * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` and `ZYDIS_FORMATTER_FUNC_PRINT_DISP` functions.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM,\r\n    /**\r\n     * This function is invoked to format a pointer operand.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR,\r\n    /**\r\n     * This function is invoked to format an immediate operand.\r\n     *\r\n     * Replacing this function might indirectly disable some specific calls to the\r\n     * `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` and\r\n     * `ZYDIS_FORMATTER_FUNC_PRINT_IMM` functions.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Elemental tokens                                                                         */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function is invoked to print the instruction mnemonic.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function is invoked to print a register.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_REGISTER,\r\n    /**\r\n     * This function is invoked to print absolute addresses.\r\n     *\r\n     * Conditionally invoked, if a runtime-address different to `ZYDIS_RUNTIME_ADDRESS_NONE` was\r\n     * passed:\r\n     * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)\r\n     * - `MEM` operands with `EIP`/`RIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`)\r\n     *\r\n     * Always invoked for:\r\n     * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`)\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS,\r\n    /**\r\n     * This function is invoked to print relative addresses.\r\n     *\r\n     * Conditionally invoked, if `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as runtime-address:\r\n     * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL,\r\n    /**\r\n     * This function is invoked to print a memory displacement value.\r\n     *\r\n     * If the memory displacement contains an address and a runtime-address different to\r\n     * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called\r\n     * instead.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_DISP,\r\n    /**\r\n     * This function is invoked to print an immediate value.\r\n     *\r\n     * If the immediate contains an address and a runtime-address different to\r\n     * `ZYDIS_RUNTIME_ADDRESS_NONE` was passed, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` is called\r\n     * instead.\r\n     *\r\n     * If the immediate contains an address and `ZYDIS_RUNTIME_ADDRESS_NONE` was passed as\r\n     * runtime-address, `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` is called instead.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_IMM,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    /* Optional tokens                                                                          */\r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * This function is invoked to print the size of a memory operand (`INTEL` only).\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST,\r\n    /**\r\n     * This function is invoked to print the segment-register of a memory operand.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT,\r\n    /**\r\n     * This function is invoked to print the instruction prefixes.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES,\r\n    /**\r\n     * This function is invoked after formatting an operand to print a `EVEX`/`MVEX`\r\n     * decorator.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR,\r\n    \r\n    /* ---------------------------------------------------------------------------------------- */\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_MAX_VALUE = ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_FORMATTER_FUNC_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FORMATTER_FUNC_MAX_VALUE)\r\n  } ZydisFormatterFunction;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Decorator types                                                                                */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Enum of all decorator types.\r\n   */\r\n  typedef enum ZydisDecorator_\r\n  {\r\n    ZYDIS_DECORATOR_INVALID,\r\n    /**\r\n     * The embedded-mask decorator.\r\n     */\r\n    ZYDIS_DECORATOR_MASK,\r\n    /**\r\n     * The broadcast decorator.\r\n     */\r\n    ZYDIS_DECORATOR_BC,\r\n    /**\r\n     * The rounding-control decorator.\r\n     */\r\n    ZYDIS_DECORATOR_RC,\r\n    /**\r\n     * The suppress-all-exceptions decorator.\r\n     */\r\n    ZYDIS_DECORATOR_SAE,\r\n    /**\r\n     * The register-swizzle decorator.\r\n     */\r\n    ZYDIS_DECORATOR_SWIZZLE,\r\n    /**\r\n     * The conversion decorator.\r\n     */\r\n    ZYDIS_DECORATOR_CONVERSION,\r\n    /**\r\n     * The eviction-hint decorator.\r\n     */\r\n    ZYDIS_DECORATOR_EH,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_DECORATOR_MAX_VALUE = ZYDIS_DECORATOR_EH,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_DECORATOR_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_DECORATOR_MAX_VALUE)\r\n  } ZydisDecorator;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Formatter context                                                                              */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  typedef struct ZydisFormatter_ ZydisFormatter;\r\n  \r\n  /**\r\n   * Context structure that that is passed to all formatter.\r\n   */\r\n  typedef struct ZydisFormatterContext_\r\n  {\r\n    /**\r\n     * A pointer to the `ZydisDecodedInstruction` struct.\r\n     */\r\n    const ZydisDecodedInstruction* instruction;\r\n    /**\r\n     * A pointer to the first `ZydisDecodedOperand` struct of the instruction.\r\n     */\r\n    const ZydisDecodedOperand* operands;\r\n    /**\r\n     * A pointer to the `ZydisDecodedOperand` struct.\r\n     */\r\n    const ZydisDecodedOperand* operand;\r\n    /**\r\n     * The runtime address of the instruction.\r\n     */\r\n    ZyanU64 runtime_address;\r\n    /**\r\n     * A pointer to user-defined data.\r\n     *\r\n     * This is the value that was previously passed as the `user_data` argument to\r\n     * @ref ZydisFormatterFormatInstruction or @ref ZydisFormatterTokenizeOperand.\r\n     */\r\n    void* user_data;\r\n  } ZydisFormatterContext;\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Function prototypes                                                                            */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Defines the `ZydisFormatterFunc` function prototype.\r\n   *\r\n   * @param   formatter   A pointer to the `ZydisFormatter` instance.\r\n   * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   context     A pointer to the `ZydisFormatterContext` struct.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the formatting\r\n   * process to fail (see exceptions below).\r\n   *\r\n   * Returning `ZYDIS_STATUS_SKIP_TOKEN` is valid for functions of the following types and will\r\n   * instruct the formatter to omit the whole operand:\r\n   * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`\r\n   * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`\r\n   *\r\n   * This function prototype is used by functions of the following types:\r\n   * - `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION`\r\n   * - `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRE_OPERAND`\r\n   * - `ZYDIS_FORMATTER_FUNC_POST_OPERAND`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR`\r\n   * - `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_DISP`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_IMM`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST`\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT`\r\n   */\r\n  typedef ZyanStatus (*ZydisFormatterFunc)(const ZydisFormatter* formatter,\r\n                                           ZydisFormatterBuffer* buffer, ZydisFormatterContext* context);\r\n  \r\n  /**\r\n  * Defines the `ZydisFormatterRegisterFunc` function prototype.\r\n  *\r\n  * @param   formatter   A pointer to the `ZydisFormatter` instance.\r\n  * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.\r\n  * @param   context     A pointer to the `ZydisFormatterContext` struct.\r\n  * @param   reg         The register.\r\n  *\r\n  * @return  Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the\r\n  *          formatting process to fail.\r\n  *\r\n  * This function prototype is used by functions of the following types:\r\n  * - `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER`.\r\n  */\r\n  typedef ZyanStatus (*ZydisFormatterRegisterFunc)(const ZydisFormatter* formatter,\r\n                                                   ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisRegister reg);\r\n  \r\n  /**\r\n   * Defines the `ZydisFormatterDecoratorFunc` function prototype.\r\n   *\r\n   * @param   formatter   A pointer to the `ZydisFormatter` instance.\r\n   * @param   buffer      A pointer to the `ZydisFormatterBuffer` struct.\r\n   * @param   context     A pointer to the `ZydisFormatterContext` struct.\r\n   * @param   decorator   The decorator type.\r\n   *\r\n   * @return  Returning a status code other than `ZYAN_STATUS_SUCCESS` will immediately cause the\r\n   *          formatting process to fail.\r\n   *\r\n   * This function type is used for:\r\n   * - `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR`\r\n   */\r\n  typedef ZyanStatus (*ZydisFormatterDecoratorFunc)(const ZydisFormatter* formatter,\r\n                                                    ZydisFormatterBuffer* buffer, ZydisFormatterContext* context, ZydisDecorator decorator);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Formatter struct                                                                               */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Context structure keeping track of internal state of the formatter.\r\n   *\r\n   * All fields in this struct should be considered as \"private\". Any changes may lead to unexpected\r\n   * behavior.\r\n   *\r\n   * Do NOT change the order of the function fields or the values of the `ZydisFormatterFunction`\r\n   * enum.\r\n   */\r\n  struct ZydisFormatter_\r\n  {\r\n    /**\r\n     * The formatter style.\r\n     */\r\n    ZydisFormatterStyle style;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_FORCE_SIZE` property.\r\n     */\r\n    ZyanBool force_memory_size;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_FORCE_SEGMENT` property.\r\n     */\r\n    ZyanBool force_memory_segment;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_FORCE_SCALE_ONE` property.\r\n     */\r\n    ZyanBool force_memory_scale;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_BRANCHES` property.\r\n     */\r\n    ZyanBool force_relative_branches;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_FORCE_RELATIVE_RIPREL` property.\r\n     */\r\n    ZyanBool force_relative_riprel;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_PRINT_BRANCH_SIZE` property.\r\n     */\r\n    ZyanBool print_branch_size;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_DETAILED_PREFIXES` property.\r\n     */\r\n    ZyanBool detailed_prefixes;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_ADDR_BASE` property.\r\n     */\r\n    ZydisNumericBase addr_base;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_ADDR_SIGNEDNESS` property.\r\n     */\r\n    ZydisSignedness addr_signedness;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_ADDR_PADDING_ABSOLUTE` property.\r\n     */\r\n    ZydisPadding addr_padding_absolute;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_ADDR_PADDING_RELATIVE` property.\r\n     */\r\n    ZydisPadding addr_padding_relative;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_DISP_BASE` property.\r\n     */\r\n    ZydisNumericBase disp_base;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_DISP_SIGNEDNESS` property.\r\n     */\r\n    ZydisSignedness disp_signedness;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_DISP_PADDING` property.\r\n     */\r\n    ZydisPadding disp_padding;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_IMM_BASE` property.\r\n     */\r\n    ZydisNumericBase imm_base;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_IMM_SIGNEDNESS` property.\r\n     */\r\n    ZydisSignedness imm_signedness;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_IMM_PADDING` property.\r\n     */\r\n    ZydisPadding imm_padding;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_PREFIXES` property.\r\n     */\r\n    ZyanI32 case_prefixes;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_MNEMONIC` property.\r\n     */\r\n    ZyanI32 case_mnemonic;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_REGISTERS` property.\r\n     */\r\n    ZyanI32 case_registers;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_TYPECASTS` property.\r\n     */\r\n    ZyanI32 case_typecasts;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_UPPERCASE_DECORATORS` property.\r\n     */\r\n    ZyanI32 case_decorators;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_HEX_UPPERCASE` property.\r\n     */\r\n    ZyanBool hex_uppercase;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_PROP_HEX_FORCE_LEADING_NUMBER` property.\r\n     */\r\n    ZyanBool hex_force_leading_number;\r\n    /**\r\n     * The number formats for all numeric bases.\r\n     *\r\n     * Index 0 = prefix\r\n     * Index 1 = suffix\r\n     */\r\n    struct\r\n    {\r\n      /**\r\n       * A pointer to the `ZyanStringView` to use as prefix/suffix.\r\n       */\r\n      const ZyanStringView* string;\r\n      /**\r\n       * The `ZyanStringView` to use as prefix/suffix\r\n       */\r\n      ZyanStringView string_data;\r\n      /**\r\n       * The actual string data.\r\n       */\r\n      char buffer[11];\r\n    } number_format[ZYDIS_NUMERIC_BASE_MAX_VALUE + 1][2];\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRE_INSTRUCTION` function.\r\n     */\r\n    ZydisFormatterFunc func_pre_instruction;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_POST_INSTRUCTION` function.\r\n     */\r\n    ZydisFormatterFunc func_post_instruction;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_INSTRUCTION` function.\r\n     */\r\n    ZydisFormatterFunc func_format_instruction;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRE_OPERAND` function.\r\n     */\r\n    ZydisFormatterFunc func_pre_operand;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_POST_OPERAND` function.\r\n     */\r\n    ZydisFormatterFunc func_post_operand;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_REG` function.\r\n     */\r\n    ZydisFormatterFunc func_format_operand_reg;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_MEM` function.\r\n     */\r\n    ZydisFormatterFunc func_format_operand_mem;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_PTR` function.\r\n     */\r\n    ZydisFormatterFunc func_format_operand_ptr;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_FORMAT_OPERAND_IMM` function.\r\n     */\r\n    ZydisFormatterFunc func_format_operand_imm;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_MNEMONIC function.\r\n     */\r\n    ZydisFormatterFunc func_print_mnemonic;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_REGISTER` function.\r\n     */\r\n    ZydisFormatterRegisterFunc func_print_register;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_ABS` function.\r\n     */\r\n    ZydisFormatterFunc func_print_address_abs;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_ADDRESS_REL` function.\r\n     */\r\n    ZydisFormatterFunc func_print_address_rel;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_DISP` function.\r\n     */\r\n    ZydisFormatterFunc func_print_disp;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_IMM` function.\r\n     */\r\n    ZydisFormatterFunc func_print_imm;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_TYPECAST` function.\r\n     */\r\n    ZydisFormatterFunc func_print_typecast;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_SEGMENT` function.\r\n     */\r\n    ZydisFormatterFunc func_print_segment;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_PREFIXES` function.\r\n     */\r\n    ZydisFormatterFunc func_print_prefixes;\r\n    /**\r\n     * The `ZYDIS_FORMATTER_FUNC_PRINT_DECORATOR` function.\r\n     */\r\n    ZydisFormatterDecoratorFunc func_print_decorator;\r\n  };\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @addtogroup formatter Formatter\r\n   * Functions allowing formatting of previously decoded instructions to human readable text.\r\n   * @{\r\n   */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Initialization                                                                                 */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Initializes the given `ZydisFormatter` instance.\r\n   *\r\n   * @param   formatter   A pointer to the `ZydisFormatter` instance.\r\n   * @param   style       The base formatter style (either `AT&T` or `Intel` style).\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterInit(ZydisFormatter* formatter, ZydisFormatterStyle style);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Setter                                                                                         */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Changes the value of the specified formatter `property`.\r\n   *\r\n   * @param   formatter   A pointer to the `ZydisFormatter` instance.\r\n   * @param   property    The id of the formatter-property.\r\n   * @param   value       The new value.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a property can't be changed for the\r\n   * current formatter-style.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterSetProperty(ZydisFormatter* formatter,\r\n                                                    ZydisFormatterProperty property, ZyanUPointer value);\r\n  \r\n  /**\r\n   * Replaces a formatter function with a custom callback and/or retrieves the currently\r\n   * used function.\r\n   *\r\n   * @param   formatter   A pointer to the `ZydisFormatter` instance.\r\n   * @param   type        The formatter function-type.\r\n   * @param   callback    A pointer to a variable that contains the pointer of the callback function\r\n   *                      and receives the pointer of the currently used function.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Call this function with `callback` pointing to a `ZYAN_NULL` value to retrieve the currently\r\n   * used function without replacing it.\r\n   *\r\n   * This function returns `ZYAN_STATUS_INVALID_OPERATION` if a function can't be replaced for the\r\n   * current formatter-style.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterSetHook(ZydisFormatter* formatter,\r\n                                                ZydisFormatterFunction type, const void** callback);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Formatting                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Formats the given instruction and writes it into the output buffer.\r\n   *\r\n   * @param   formatter       A pointer to the `ZydisFormatter` instance.\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operands        A pointer to the decoded operands array.\r\n   * @param   operand_count   The length of the `operands` array. Must be equal to or greater than\r\n   *                          the value of `instruction->operand_count_visible`.\r\n   * @param   buffer          A pointer to the output buffer.\r\n   * @param   length          The length of the output buffer (in characters).\r\n   * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\r\n   *                          to print relative addresses.\r\n   * @param   user_data       A pointer to user-defined data which can be used in custom formatter\r\n   *                          callbacks. Can be `ZYAN_NULL`.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatInstruction(const ZydisFormatter* formatter,\r\n                                                          const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,\r\n                                                          ZyanU8 operand_count, char* buffer, ZyanUSize length, ZyanU64 runtime_address,\r\n                                                          void* user_data);\r\n  \r\n  /**\r\n   * Formats the given operand and writes it into the output buffer.\r\n   *\r\n   * @param   formatter       A pointer to the `ZydisFormatter` instance.\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operand         A pointer to the `ZydisDecodedOperand` struct of the operand to format.\r\n   * @param   buffer          A pointer to the output buffer.\r\n   * @param   length          The length of the output buffer (in characters).\r\n   * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\r\n   *                          to print relative addresses.\r\n   * @param   user_data       A pointer to user-defined data which can be used in custom formatter\r\n   *                          callbacks. Can be `ZYAN_NULL`.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Use `ZydisFormatterFormatInstruction` or `ZydisFormatterFormatInstructionEx` to format a\r\n   * complete instruction.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterFormatOperand(const ZydisFormatter* formatter,\r\n                                                      const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,\r\n                                                      char* buffer, ZyanUSize length, ZyanU64 runtime_address, void* user_data);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Tokenizing                                                                                     */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Tokenizes the given instruction and writes it into the output buffer.\r\n   *\r\n   * @param   formatter       A pointer to the `ZydisFormatter` instance.\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operands        A pointer to the decoded operands array.\r\n   * @param   operand_count   The length of the `operands` array. Must be equal to or greater than\r\n   *                          the value of `instruction->operand_count_visible`.\r\n   * @param   buffer          A pointer to the output buffer.\r\n   * @param   length          The length of the output buffer (in bytes).\r\n   * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\r\n   *                          to print relative addresses.\r\n   * @param   token           Receives a pointer to the first token in the output buffer.\r\n   * @param   user_data       A pointer to user-defined data which can be used in custom formatter\r\n   *                          callbacks. Can be `ZYAN_NULL`.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeInstruction(const ZydisFormatter* formatter,\r\n                                                            const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operands,\r\n                                                            ZyanU8 operand_count, void* buffer, ZyanUSize length, ZyanU64 runtime_address,\r\n                                                            ZydisFormatterTokenConst** token, void* user_data);\r\n  \r\n  /**\r\n   * Tokenizes the given operand and writes it into the output buffer.\r\n   *\r\n   * @param   formatter       A pointer to the `ZydisFormatter` instance.\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operand         A pointer to the `ZydisDecodedOperand` struct of the operand to format.\r\n   * @param   buffer          A pointer to the output buffer.\r\n   * @param   length          The length of the output buffer (in bytes).\r\n   * @param   runtime_address The runtime address of the instruction or `ZYDIS_RUNTIME_ADDRESS_NONE`\r\n   *                          to print relative addresses.\r\n   * @param   token           Receives a pointer to the first token in the output buffer.\r\n   * @param   user_data       A pointer to user-defined data which can be used in custom formatter\r\n   *                          callbacks. Can be `ZYAN_NULL`.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * Use `ZydisFormatterTokenizeInstruction` to tokenize a complete instruction.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisFormatterTokenizeOperand(const ZydisFormatter* formatter,\r\n                                                        const ZydisDecodedInstruction* instruction, const ZydisDecodedOperand* operand,\r\n                                                        void* buffer, ZyanUSize length, ZyanU64 runtime_address, ZydisFormatterTokenConst** token,\r\n                                                        void* user_data);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_FORMATTER_H */\r\n#endif\r\n\r\n#if !defined(ZYDIS_DISABLE_SEGMENT)\r\n\r\n//\r\n// Header: Zydis/Segment.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Functions and types providing encoding information about individual instruction bytes.\r\n */\r\n\r\n#ifndef ZYDIS_SEGMENT_H\r\n#define ZYDIS_SEGMENT_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /**\r\n  * @addtogroup segment Segment\r\n  * Functions and types providing encoding information about individual instruction bytes.\r\n  * @{\r\n  */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Constants                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n#define ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT 9\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines the `ZydisInstructionSegment` struct.\r\n   */\r\n  typedef enum ZydisInstructionSegment_\r\n  {\r\n    ZYDIS_INSTR_SEGMENT_NONE,\r\n    /**\r\n     * The legacy prefixes (including ignored `REX` prefixes).\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_PREFIXES,\r\n    /**\r\n     * The effective `REX` prefix byte.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_REX,\r\n    /**\r\n     * The `XOP` prefix bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_XOP,\r\n    /**\r\n     * The `VEX` prefix bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_VEX,\r\n    /**\r\n     * The `EVEX` prefix bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_EVEX,\r\n    /**\r\n     * The `MVEX` prefix bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_MVEX,\r\n    /**\r\n     * The opcode bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_OPCODE,\r\n    /**\r\n     * The `ModRM` byte.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_MODRM,\r\n    /**\r\n     * The `SIB` byte.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_SIB,\r\n    /**\r\n     * The displacement bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_DISPLACEMENT,\r\n    /**\r\n     * The immediate bytes.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_IMMEDIATE,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_MAX_VALUE = ZYDIS_INSTR_SEGMENT_IMMEDIATE,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_INSTR_SEGMENT_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_INSTR_SEGMENT_MAX_VALUE)\r\n  } ZydisInstructionSegment;\r\n  \r\n  /**\r\n   * Defines the `ZydisInstructionSegments` struct.\r\n   */\r\n  typedef struct ZydisInstructionSegments_\r\n  {\r\n    /**\r\n     * The number of logical instruction segments.\r\n     */\r\n    ZyanU8 count;\r\n    struct\r\n    {\r\n      /**\r\n       * The type of the segment.\r\n       */\r\n      ZydisInstructionSegment type;\r\n      /**\r\n       * The offset of the segment relative to the start of the instruction (in bytes).\r\n       */\r\n      ZyanU8 offset;\r\n      /**\r\n       * The size of the segment, in bytes.\r\n       */\r\n      ZyanU8 size;\r\n    } segments[ZYDIS_MAX_INSTRUCTION_SEGMENT_COUNT];\r\n  } ZydisInstructionSegments;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Returns offsets and sizes of all logical instruction segments (e.g. `OPCODE`,\r\n   * `MODRM`, ...).\r\n   *\r\n   * @param   instruction A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   segments    Receives the instruction segments information.\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisGetInstructionSegments(const ZydisDecodedInstruction* instruction,\r\n                                                      ZydisInstructionSegments* segments);\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_SEGMENT_H */\r\n#endif\r\n\r\n#if !defined(ZYDIS_DISABLE_DECODER) && !defined(ZYDIS_DISABLE_FORMATTER)\r\n\r\n//\r\n// Header: Zydis/Disassembler.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Joel Hoener\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * All-in-one convenience function providing the simplest possible way to use Zydis.\r\n */\r\n\r\n#ifndef ZYDIS_DISASSEMBLER_H\r\n#define ZYDIS_DISASSEMBLER_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Types                                                                                          */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * All commonly used information about a decoded instruction that Zydis can provide.\r\n   *\r\n   * This structure is filled in by calling `ZydisDisassembleIntel` or `ZydisDisassembleATT`.\r\n   */\r\n  typedef struct ZydisDisassembledInstruction_\r\n  {\r\n    /**\r\n     * The runtime address that was passed when disassembling the instruction.\r\n     */\r\n    ZyanU64 runtime_address;\r\n    /**\r\n     * General information about the decoded instruction in machine-readable format.\r\n     */\r\n    ZydisDecodedInstruction info;\r\n    /**\r\n     * The operands of the decoded instruction in a machine-readable format.\r\n     *\r\n     * The amount of actual operands can be determined by inspecting the corresponding fields\r\n     * in the `info` member of this struct. Inspect `operand_count_visible` if you care about\r\n     * visible operands (those that are printed by the formatter) or `operand_count` if you're\r\n     * also interested in implicit operands (for example the registers implicitly accessed by\r\n     * `pushad`). Unused entries are zeroed.\r\n     */\r\n    ZydisDecodedOperand operands[ZYDIS_MAX_OPERAND_COUNT];\r\n    /**\r\n     * The textual, human-readable representation of the instruction.\r\n     *\r\n     * Guaranteed to be zero-terminated.\r\n     */\r\n    char text[96];\r\n  } ZydisDisassembledInstruction;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Disassemble an instruction and format it to human-readable text in a single step (Intel syntax).\r\n   *\r\n   * @param machine_mode      The machine mode to assume when disassembling. When in doubt, pass\r\n   *                          `ZYDIS_MACHINE_MODE_LONG_64` for what is typically referred to as\r\n   *                          \"64-bit mode\" or `ZYDIS_MACHINE_MODE_LEGACY_32` for \"32-bit mode\".\r\n   * @param runtime_address   The program counter (`eip` / `rip`) to assume when formatting the\r\n   *                          instruction. Many instructions behave differently depending on the\r\n   *                          address they are located at.\r\n   * @param buffer            A pointer to the raw instruction bytes that you wish to decode.\r\n   * @param length            The length of the input buffer. Note that this can be bigger than the\r\n   *                          actual size of the instruction -- you don't have to know the size up\r\n   *                          front. This length is merely used to prevent Zydis from doing\r\n   *                          out-of-bounds reads on your buffer.\r\n   * @param instruction       A pointer to receive the decoded instruction information. Can be\r\n   *                          uninitialized and reused on later calls.\r\n   *\r\n   * This is a convenience function intended as a quick path for getting started with using Zydis.\r\n   * It internally calls a range of other more advanced functions to obtain all commonly needed\r\n   * information about the instruction. It is likely that you won't need most of this information in\r\n   * practice, so it is advisable to instead call these more advanced functions directly if you're\r\n   * concerned about performance.\r\n   *\r\n   * This function essentially combines the following more advanced functions into a single call:\r\n   *\r\n   *   - `ZydisDecoderInit`\r\n   *   - `ZydisDecoderDecodeInstruction`\r\n   *   - `ZydisDecoderDecodeOperands`\r\n   *   - `ZydisFormatterInit`\r\n   *   - `ZydisFormatterFormatInstruction`\r\n   *\r\n   * @return  A zyan status code.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDisassembleIntel(ZydisMachineMode machine_mode,\r\n                                                ZyanU64 runtime_address, const void* buffer, ZyanUSize length,\r\n                                                ZydisDisassembledInstruction *instruction);\r\n  \r\n  /**\r\n   * Disassemble an instruction and format it to human-readable text in a single step (AT&T syntax).\r\n   *\r\n   * @copydetails ZydisDisassembleIntel\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisDisassembleATT(ZydisMachineMode machine_mode,\r\n                                              ZyanU64 runtime_address, const void* buffer, ZyanUSize length,\r\n                                              ZydisDisassembledInstruction *instruction);\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_DISASSEMBLER_H */\r\n#endif\r\n\r\n\r\n//\r\n// Header: Zydis/Utils.h\r\n//\r\n// Include stack:\r\n//   - Zydis/Zydis.h\r\n//\r\n\r\n/***************************************************************************************************\r\n\r\n  Zyan Disassembler Library (Zydis)\r\n\r\n  Original Author : Florian Bernd\r\n\r\n * Permission is hereby granted, free of charge, to any person obtaining a copy\r\n * of this software and associated documentation files (the \"Software\"), to deal\r\n * in the Software without restriction, including without limitation the rights\r\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n * copies of the Software, and to permit persons to whom the Software is\r\n * furnished to do so, subject to the following conditions:\r\n *\r\n * The above copyright notice and this permission notice shall be included in all\r\n * copies or substantial portions of the Software.\r\n *\r\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r\n * SOFTWARE.\r\n\r\n***************************************************************************************************/\r\n\r\n/**\r\n * @file\r\n * Other utility functions.\r\n */\r\n\r\n#ifndef ZYDIS_UTILS_H\r\n#define ZYDIS_UTILS_H\r\n\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @addtogroup utils Utils\r\n   * Miscellaneous utility functions. Address translation and other helpers.\r\n   * @{\r\n   */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Address calculation                                                                            */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  // TODO: Provide a function that works in minimal-mode and does not require a operand parameter\r\n  \r\n  /**\r\n   * Calculates the absolute address value for the given instruction operand.\r\n   *\r\n   * @param   instruction     A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operand         A pointer to the `ZydisDecodedOperand` struct.\r\n   * @param   runtime_address The runtime address of the instruction.\r\n   * @param   result_address  A pointer to the memory that receives the absolute address.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * You should use this function in the following cases:\r\n   * - `IMM` operands with relative address (e.g. `JMP`, `CALL`, ...)\r\n   * - `MEM` operands with `RIP`/`EIP`-relative address (e.g. `MOV RAX, [RIP+0x12345678]`)\r\n   * - `MEM` operands with absolute address (e.g. `MOV RAX, [0x12345678]`)\r\n   *   - The displacement needs to get truncated and zero extended\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddress(const ZydisDecodedInstruction* instruction,\r\n                                                   const ZydisDecodedOperand* operand, ZyanU64 runtime_address, ZyanU64* result_address);\r\n  \r\n  /**\r\n   * Calculates the absolute address value for the given instruction operand.\r\n   *\r\n   * @param   instruction         A pointer to the `ZydisDecodedInstruction` struct.\r\n   * @param   operand             A pointer to the `ZydisDecodedOperand` struct.\r\n   * @param   runtime_address     The runtime address of the instruction.\r\n   * @param   register_context    A pointer to the `ZydisRegisterContext` struct.\r\n   * @param   result_address      A pointer to the memory that receives the absolute target-address.\r\n   *\r\n   * @return  A zyan status code.\r\n   *\r\n   * This function behaves like `ZydisCalcAbsoluteAddress` but takes an additional register-context\r\n   * argument to allow calculation of addresses depending on runtime register values.\r\n   *\r\n   * Note that `IP/EIP/RIP` from the register-context will be ignored in favor of the passed\r\n   * runtime-address.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisCalcAbsoluteAddressEx(const ZydisDecodedInstruction* instruction,\r\n                                                     const ZydisDecodedOperand* operand, ZyanU64 runtime_address,\r\n                                                     const ZydisRegisterContext* register_context, ZyanU64* result_address);\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_UTILS_H */\r\n\r\n#ifdef __cplusplus\r\nextern \"C\" {\r\n#endif\r\n  \r\n  /**\r\n   * @addtogroup version Version\r\n   *\r\n   * Functions for checking the library version and build options.\r\n   *\r\n   * @{\r\n   */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Macros                                                                                         */\r\n  /* ============================================================================================== */\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Constants                                                                                      */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * A macro that defines the zydis version.\r\n   */\r\n#define ZYDIS_VERSION (ZyanU64)0x0004000100000000\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  /* Helper macros                                                                                  */\r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /**\r\n   * Extracts the major-part of the zydis version.\r\n   *\r\n   * @param   version The zydis version value\r\n   */\r\n#define ZYDIS_VERSION_MAJOR(version) (ZyanU16)(((version) & 0xFFFF000000000000) >> 48)\r\n  \r\n  /**\r\n   * Extracts the minor-part of the zydis version.\r\n   *\r\n   * @param   version The zydis version value\r\n   */\r\n#define ZYDIS_VERSION_MINOR(version) (ZyanU16)(((version) & 0x0000FFFF00000000) >> 32)\r\n  \r\n  /**\r\n   * Extracts the patch-part of the zydis version.\r\n   *\r\n   * @param   version The zydis version value\r\n   */\r\n#define ZYDIS_VERSION_PATCH(version) (ZyanU16)(((version) & 0x00000000FFFF0000) >> 16)\r\n  \r\n  /**\r\n   * Extracts the build-part of the zydis version.\r\n   *\r\n   * @param   version The zydis version value\r\n   */\r\n#define ZYDIS_VERSION_BUILD(version) (ZyanU16)((version) & 0x000000000000FFFF)\r\n  \r\n  /* ---------------------------------------------------------------------------------------------- */\r\n  \r\n  /* ============================================================================================== */\r\n  /* Enums and types                                                                                */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Defines the `ZydisFeature` enum.\r\n   */\r\n  typedef enum ZydisFeature_\r\n  {\r\n    ZYDIS_FEATURE_DECODER,\r\n    ZYDIS_FEATURE_ENCODER,\r\n    ZYDIS_FEATURE_FORMATTER,\r\n    ZYDIS_FEATURE_AVX512,\r\n    ZYDIS_FEATURE_KNC,\r\n    ZYDIS_FEATURE_SEGMENT,\r\n    \r\n    /**\r\n     * Maximum value of this enum.\r\n     */\r\n    ZYDIS_FEATURE_MAX_VALUE = ZYDIS_FEATURE_SEGMENT,\r\n    /**\r\n     * The minimum number of bits required to represent all values of this enum.\r\n     */\r\n    ZYDIS_FEATURE_REQUIRED_BITS = ZYAN_BITS_TO_REPRESENT(ZYDIS_FEATURE_MAX_VALUE)\r\n  } ZydisFeature;\r\n  \r\n  /* ============================================================================================== */\r\n  /* Exported functions                                                                             */\r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * Returns the zydis version.\r\n   *\r\n   * @return  The zydis version.\r\n   *\r\n   * Use the macros provided in this file to extract the major, minor, patch and build part from the\r\n   * returned version value.\r\n   */\r\n  ZYDIS_EXPORT ZyanU64 ZydisGetVersion(void);\r\n  \r\n  /**\r\n   * Checks, if the specified feature is enabled in the current zydis library instance.\r\n   *\r\n   * @param   feature The feature.\r\n   *\r\n   * @return  `ZYAN_STATUS_TRUE` if the feature is enabled, `ZYAN_STATUS_FALSE` if not. Another\r\n   *          zyan status code, if an error occured.\r\n   */\r\n  ZYDIS_EXPORT ZyanStatus ZydisIsFeatureEnabled(ZydisFeature feature);\r\n  \r\n  /* ============================================================================================== */\r\n  \r\n  /**\r\n   * @}\r\n   */\r\n  \r\n#ifdef __cplusplus\r\n}\r\n#endif\r\n\r\n#endif /* ZYDIS_H */"
  },
  {
    "path": "src/torture/torture.c",
    "content": "// Copyright (c) Epic Games Tools\n// Licensed under the MIT license (https://opensource.org/license/mit/)\n\n////////////////////////////////\n// Build Options\n\n#define BUILD_CONSOLE_INTERFACE 1\n#define BUILD_TITLE \"TORTURE\"\n\n////////////////////////////////\n\n#include \"third_party/xxHash/xxhash.c\"\n#include \"third_party/xxHash/xxhash.h\"\n#include \"third_party/radsort/radsort.h\"\n\n////////////////////////////////\n\n#include \"base/base_inc.h\"\n#include \"os/os_inc.h\"\n#include \"coff/coff.h\"\n#include \"coff/coff_parse.h\"\n#include \"coff/coff_obj_writer.h\"\n#include \"coff/coff_lib_writer.h\"\n#include \"pe/pe.h\"\n#include \"pe/pe_section_flags.h\"\n#include \"linker/base_ext/base_core.h\"\n#include \"linker/base_ext/base_arena.h\"\n#include \"linker/base_ext/base_arrays.h\"\n#include \"linker/hash_table.h\"\n\n#include \"base/base_inc.c\"\n#include \"os/os_inc.c\"\n#include \"coff/coff.c\"\n#include \"coff/coff_parse.c\"\n#include \"coff/coff_obj_writer.c\"\n#include \"coff/coff_lib_writer.c\"\n#include \"pe/pe.c\"\n#include \"linker/hash_table.c\"\n#include \"linker/base_ext/base_core.c\"\n#include \"linker/base_ext/base_arena.c\"\n#include \"linker/base_ext/base_arrays.c\"\n\n#include \"linker/lnk_cmd_line.h\"\n#include \"linker/lnk_cmd_line.c\"\n#include \"linker/lnk_error.h\"\n\n////////////////////////////////\n\ntypedef enum\n{\n  T_Result_Fail,\n  T_Result_Crash,\n  T_Result_Pass,\n} T_Result;\n\ntypedef T_Result (*T_Run)(void);\n\ninternal char *\nt_string_from_result(T_Result v)\n{\n  switch (v) {\n  case T_Result_Fail:  return \"FAIL\";\n  case T_Result_Crash: return \"CRASH\";\n  case T_Result_Pass:  return \"PASS\";\n  }\n  return 0;\n}\n\nglobal String8 g_stdout_file_name = str8_lit_comp(\"torture.out\");\nglobal U64     g_linker_time_out;\nglobal String8 g_linker;\nglobal String8 g_wdir;\nglobal String8 g_out = str8_lit_comp(\"torture\");\nglobal B32     g_verbose;\nglobal B32     g_redirect_stdout = 1;\n\n#define T_LINKER_TIME_OUT_EXIT_CODE 999999\n\ntypedef enum\n{\n  T_Linker_Null,\n  T_Linker_RAD,\n  T_Linker_MSVC,\n  T_Linker_LLVM\n} T_Linker;\n\ninternal T_Linker\nt_ident_linker(void)\n{\n  String8 name = g_linker;\n  name = str8_skip_last_slash(name);\n  name = str8_chop_last_dot(name);\n  if (str8_match(name, str8_lit(\"radlink\"), StringMatchFlag_CaseInsensitive)) {\n    return T_Linker_RAD;\n  }\n  if (str8_match(name, str8_lit(\"link\"), StringMatchFlag_CaseInsensitive)) {\n    return T_Linker_MSVC;\n  }\n  if (str8_match(name, str8_lit(\"lld-link\"), StringMatchFlag_CaseInsensitive)) {\n    return T_Linker_LLVM;\n  }\n  return T_Linker_Null;\n}\n\ninternal int\nt_invoke_linker_with_time_out(U64 time_out, String8 cmdline)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  OS_Handle output_redirect = {0};\n  if (g_redirect_stdout) {\n    output_redirect = os_file_open(OS_AccessFlag_Append|OS_AccessFlag_ShareRead|OS_AccessFlag_ShareWrite|OS_AccessFlag_Inherited, g_stdout_file_name);\n  }\n\n  //\n  // Build Launch Options\n  //\n  OS_ProcessLaunchParams launch_opts = {0};\n  launch_opts.path                   = g_wdir;\n  launch_opts.inherit_env            = 1;\n  launch_opts.stdout_file            = output_redirect;\n  launch_opts.stderr_file            = output_redirect;\n  str8_list_push(scratch.arena, &launch_opts.cmd_line, g_linker);\n  str8_list_push(scratch.arena, &launch_opts.cmd_line, str8_lit(\"/nologo\"));\n  {\n    String8List parsed_cmdline = lnk_arg_list_parse_windows_rules(scratch.arena, cmdline);\n    str8_list_concat_in_place(&launch_opts.cmd_line, &parsed_cmdline);\n  }\n\n  //\n  // Invoke Linker\n  //\n  int exit_code = -1;\n  {\n    if (g_verbose) {\n      String8 full_cmd_line = str8_list_join(scratch.arena, &launch_opts.cmd_line, &(StringJoin){ .sep = str8_lit(\" \") });\n      fprintf(stdout, \"Command Line: %.*s\\n\", str8_varg(full_cmd_line));\n      fprintf(stdout, \"Working Dir:  %.*s\\n\", str8_varg(g_wdir));\n    }\n\n    OS_Handle linker_handle = os_process_launch(&launch_opts);\n    if (os_handle_match(linker_handle, os_handle_zero())) {\n      fprintf(stderr, \"unable to start process: %.*s\\n\", str8_varg(g_linker));\n    } else {\n      U64 exit_code_u64 = 0;\n      B32 was_joined = os_process_join(linker_handle, time_out, &exit_code_u64);\n      exit_code = (int)exit_code_u64;\n      if (!was_joined) {\n        os_process_kill(linker_handle);\n        exit_code = T_LINKER_TIME_OUT_EXIT_CODE;\n      }\n      os_process_detach(linker_handle);\n    }\n  }\n\n  if (g_redirect_stdout) {\n    os_file_close(output_redirect);\n  }\n\n  scratch_end(scratch);\n  return exit_code;\n}\n\ninternal int\nt_invoke_linker(String8 cmdline)\n{\n  return t_invoke_linker_with_time_out(max_U64, cmdline);\n}\n\ninternal int\nt_invoke_linkerf(char *fmt, ...)\n{\n  Temp scratch = scratch_begin(0,0);\n  va_list args;\n  va_start(args, fmt);\n  String8 cmdline = push_str8fv(scratch.arena, fmt, args);\n  int exit_code = t_invoke_linker(cmdline);\n  va_end(args);\n  scratch_end(scratch);\n  return exit_code;\n}\n\ninternal int\nt_invoke_linker_with_time_outf(U64 time_out, char *fmt, ...)\n{\n  Temp scratch = scratch_begin(0,0);\n  va_list args;\n  va_start(args, fmt);\n  String8 cmdline = push_str8fv(scratch.arena, fmt, args);\n  int exit_code = t_invoke_linker_with_time_out(time_out, cmdline);\n  va_end(args);\n  scratch_end(scratch);\n  return exit_code;\n}\n\ninternal String8\nt_make_file_path(Arena *arena, String8 name)\n{\n  return push_str8f(arena, \"%S\\\\%S\", g_wdir, name);\n}\n\ninternal B32\nt_write_file_list(String8 name, String8List data)\n{\n  Temp scratch = scratch_begin(0,0);\n  String8 path = t_make_file_path(scratch.arena, name);\n  B32 is_written = os_write_data_list_to_file_path(path, data);\n  scratch_end(scratch);\n  return is_written;\n}\n\ninternal B32\nt_write_file(String8 name, String8 data)\n{\n  String8Node temp_node = {0};\n  temp_node.string = data;\n\n  String8List temp_list = {0};\n  str8_list_push_node(&temp_list, &temp_node);\n\n  return t_write_file_list(name, temp_list);\n}\n\ninternal String8\nt_read_file(Arena *arena, String8 name)\n{\n  Temp scratch = scratch_begin(&arena,1);\n  String8 path = t_make_file_path(scratch.arena, name);\n  String8 data = os_data_from_file_path(arena, path);\n  scratch_end(scratch);\n  return data;\n}\n\ntypedef struct\n{\n  T_Run run;\n  T_Result result;\n} T_RunCtx;\n\ninternal void\nt_run_caller(void *raw_ctx)\n{\n  T_RunCtx *ctx = raw_ctx;\n  ctx->result = ctx->run();\n}\n\ninternal void\nt_run_fail_handler(void *raw_ctx)\n{\n  T_RunCtx *ctx = raw_ctx;\n  ctx->result = T_Result_Crash;\n}\n\ninternal T_Result\nt_run(T_Run run)\n{\n  T_RunCtx ctx = {0};\n  ctx.run      = run;\n  os_safe_call(t_run_caller, t_run_fail_handler, &ctx);\n  return ctx.result;\n}\n\ninternal COFF_SectionHeader *\nt_coff_section_header_from_name(String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name)\n{\n  for (U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) {\n    COFF_SectionHeader *section_header = &section_table[sect_idx];\n    String8             section_name   = coff_name_from_section_header(string_table, section_header);\n    if (str8_match(section_name, name, 0)) {\n      return section_header;\n    }\n  }\n  return 0;\n}\n\ninternal COFF_SectionHeaderArray\nt_coff_section_header_array_from_name(Arena *arena, String8 string_table, COFF_SectionHeader *section_table, U64 section_count, String8 name)\n{\n  U64 match_count = 0;\n  for (U64 sect_idx = 0; sect_idx < section_count; sect_idx += 1) {\n    COFF_SectionHeader *section_header = &section_table[sect_idx];\n    String8             section_name   = coff_name_from_section_header(string_table, section_header);\n    if (str8_match(section_name, name, 0)) {\n      match_count += 1;\n    }\n  }\n\n  COFF_SectionHeader *matches = push_array(arena, COFF_SectionHeader, match_count);\n  for (U64 sect_idx = 0, match_idx = 0; sect_idx < section_count; sect_idx += 1) {\n    COFF_SectionHeader *section_header = &section_table[sect_idx];\n    String8             section_name   = coff_name_from_section_header(string_table, section_header);\n    if (str8_match(section_name, name, 0)) {\n      matches[match_idx++] = *section_header;\n    }\n  }\n\n  COFF_SectionHeaderArray result = {0};\n  result.count = match_count;\n  result.v     = matches;\n\n  return result;\n}\n\n////////////////////////////////////////////////////////////////\n\ntypedef enum\n{\n  T_MsvcLinkExitCode_UnresolvedExternals                  = 1120,\n  T_MsvcLinkExitCode_CorruptOrInvalidSymbolTable          = 1235,\n  T_MsvcLinkExitCode_SectionsFoundWithDifferentAttributes = 4078,\n} T_MsvcLinkExitCode;\n\ninternal COFF_ObjSection *\nt_push_text_section(COFF_ObjWriter *obj_writer, String8 data)\n{\n  return coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_Align1Bytes, data);\n}\n\ninternal COFF_ObjSection *\nt_push_data_section(COFF_ObjWriter *obj_writer, String8 data)\n{\n  return coff_obj_writer_push_section(obj_writer, str8_lit(\".data\"), PE_DATA_SECTION_FLAGS, data);\n}\n\ninternal COFF_ObjSection *\nt_push_rdata_section(COFF_ObjWriter *obj_writer, String8 data)\n{\n  return coff_obj_writer_push_section(obj_writer, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS, data);\n}\n\ninternal void\nt_write_entry_obj(void)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n  U8 text[] = { 0xc3 };\n  COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n  coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n  String8 obj = coff_obj_writer_serialize(obj_writer->arena, obj_writer);\n  if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n    AssertAlways(!\"unable to write entry obj\");\n  }\n  coff_obj_writer_release(&obj_writer);\n}\n\n////////////////////////////////\n\ninternal T_Result\nt_machine_compat_check(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Unknown);\n    t_push_data_section(obj_writer, str8_lit(\"unknown\"));\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"unknown.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    t_push_data_section(obj_writer, str8_lit(\"x64\"));\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"x64.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_Arm64);\n    t_push_data_section(obj_writer, str8_lit(\"arm64\"));\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"arm64.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code;\n  \n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe entry.obj unknown.obj x64.obj arm64.obj\");\n  if (linker_exit_code == 0) {\n    goto exit;\n  }\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe /machine:amd64 arm64.obj entry.obj\");\n  if (linker_exit_code == 0) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_out_of_bounds_section_number(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *foo = coff_obj_writer_push_section(obj_writer, str8_lit(\".foo\"), PE_DATA_SECTION_FLAGS, str8_lit(\"foo\"));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"foo\"), 0, foo);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    {\n      COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj);\n      String8 string_table = str8_substr(obj, header.string_table_range);\n      String8 symbol_table = str8_substr(obj, header.symbol_table_range);\n      COFF_ParsedSymbol symbol = coff_parse_symbol(header, string_table, symbol_table, 0);\n      COFF_Symbol16 *symbol16 = symbol.raw_symbol;\n      symbol16->section_number = 123;\n    }\n    if (!t_write_file(str8_lit(\"bad.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"foo\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n  if (t_ident_linker() == T_Linker_RAD && linker_exit_code != LNK_Error_IllData) { goto exit; }\n\n  result = T_Result_Pass;\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_merge(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".test\"), PE_DATA_SECTION_FLAGS, str8_lit(\"hello, world\"));\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"test.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  t_write_entry_obj();\n\n  int linker_exit_code;\n\n  // circular merge\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.test=.test entry.obj test.obj\");\n  if (linker_exit_code == 0) {\n    goto exit;\n  }\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_CircularMerge) {\n      goto exit;\n    }\n  }\n\n  // circular merge with extra link\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.test=.data /merge:.data=.test entry.obj test.obj\");\n  if (linker_exit_code == 0) {\n    goto exit;\n  }\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_CircularMerge) {\n      goto exit;\n    }\n  }\n\n  // merge with non-defined section\n  {\n    linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.test=.qwe entry.obj test.obj\");\n    if (linker_exit_code != 0) {\n      goto exit;\n    }\n\n    // make sure linker created .qwe and merged .test into it\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".qwe\"));\n    if (sect == 0) {\n      goto exit;\n    }\n    if (sect->flags != PE_DATA_SECTION_FLAGS) {\n      goto exit;\n    }\n    String8 qwe = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(qwe, str8_lit(\"hello, world\"),0)) {\n      goto exit;\n    }\n  }\n\n  // illegal merge with .reloc\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.test=.reloc entry.obj test.obj\");\n  if (linker_exit_code == 0) {\n    goto exit;\n  }\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_IllegalSectionMerge) {\n     goto exit;\n    }\n  }\n\n  // illegal merge with .rsrc\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.test=.rsrc entry.obj test.obj\");\n  if (linker_exit_code == 0) {\n    goto exit;\n  }\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_IllegalSectionMerge) {\n      goto exit;\n    }\n  }\n\n  // merge non-defined section with defined section\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.qwe=.test entry.obj test.obj\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  // merge .test -> .qwe -> .data\n  {\n    linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /merge:.test=.qwe /merge:.qwe=.data entry.obj test.obj\");\n    if (linker_exit_code != 0) {\n      goto exit;\n    }\n\n    // make sure linker merged .test into .data\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".data\"));\n    if (sect == 0) {\n      goto exit;\n    }\n    if (sect->flags != PE_DATA_SECTION_FLAGS) {\n      goto exit;\n    }\n    String8 data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"hello, world\"),0)) {\n      goto exit;\n    }\n  }\n  \n  result = T_Result_Pass;\n\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_simple_link_test(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  U8 text_payload[] = { 0xC3 };\n\n  String8 main_obj;\n  {\n    COFF_ObjWriter  *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect  = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text_payload));\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".data\"), PE_DATA_SECTION_FLAGS, str8_lit(\"qwe\"));\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".zero\"), PE_BSS_SECTION_FLAGS, str8(0, 5));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 main_obj_name = str8_lit(\"main.obj\");\n  if (!t_write_file(main_obj_name, main_obj)) {\n    goto exit;\n  }\n\n  int file_align = 512;\n  int virt_align = 4096;\n  String8 out_name = str8_lit(\"a.exe\");\n  int linker_exit_code = t_invoke_linkerf(\"/entry:my_entry /subsystem:console /fixed /filealign:%d /align:%d /out:%S %S\", file_align, virt_align, out_name, main_obj_name);\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, out_name);\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  if (pe.is_pe32) {\n    goto exit;\n  }\n  if (pe.section_count != 3) {\n    goto exit;\n  }\n  if (pe.arch != Arch_x64) {\n    goto exit;\n  }\n  if (pe.subsystem != PE_WindowsSubsystem_WINDOWS_CUI) {\n    goto exit;\n  }\n  if (pe.virt_section_align != virt_align) {\n    goto exit;\n  }\n  if (pe.file_section_align != file_align) {\n    goto exit;\n  }\n  if (pe.symbol_count != 0) {\n    goto exit;\n  }\n  if (pe.data_dir_count != PE_DataDirectoryIndex_COUNT) {\n    goto exit;\n  }\n\n  // check section alignment\n  for (U64 sect_idx = 0; sect_idx < pe.section_count; sect_idx += 1) {\n    COFF_SectionHeader *sect_header = &section_table[sect_idx];\n    if (AlignPadPow2(sect_header->fsize, file_align) != 0) {\n      goto exit;\n    }\n    if (AlignPadPow2(sect_header->voff, virt_align) != 0) {\n      goto exit;\n    }\n  }\n\n  COFF_SectionHeader *text_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n  if (!text_section) {\n    goto exit;\n  }\n  if (text_section->foff != file_align) { \n    goto exit;\n  }\n  if (pe.entry_point != text_section->voff) {\n    goto exit;\n  }\n\n  COFF_SectionHeader *data_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n  if (data_section == 0) {\n    goto exit;\n  }\n\n  COFF_SectionHeader *zero_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".zero\"));\n  if (zero_section == 0) {\n    goto exit;\n  }\n\n  String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + text_section->vsize));\n  if (!str8_match(text_data, str8_array_fixed(text_payload), 0)) {\n    goto exit;\n  }\n\n  PE_OptionalHeader32Plus *opt = str8_deserial_get_raw_ptr(exe, pe.optional_header_off, sizeof(*opt));\n  if (opt->sizeof_code != text_section->fsize) {\n    goto exit;\n  }\n  if (opt->sizeof_inited_data != text_section->fsize + data_section->fsize) {\n    goto exit;\n  }\n  if (opt->sizeof_uninited_data != 0x200) {\n    goto exit;\n  }\n  if (opt->code_base != 0x1000) {\n    goto exit;\n  }\n  if (opt->image_base != 0x140000000) {\n    goto exit;\n  }\n  if (opt->major_os_ver != 6) {\n    goto exit;\n  }\n  if (opt->minor_os_ver != 0) {\n    goto exit;\n  }\n  if (opt->major_img_ver != 0) {\n    goto exit;\n  }\n  if (opt->minor_img_ver != 0) {\n    goto exit;\n  }\n  if (opt->major_subsystem_ver != 6) {\n    goto exit;\n  }\n  if (opt->minor_subsystem_ver != 0) {\n    goto exit;\n  }\n  if (opt->win32_version_value != 0) {\n    goto exit;\n  }\n  if (opt->sizeof_image != 0x4000) {\n    goto exit;\n  }\n  if (opt->sizeof_headers != 0x200) {\n    goto exit;\n  }\n  if (opt->dll_characteristics != 0x8120) {\n    goto exit;\n  }\n  if (opt->loader_flags != 0) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_link_undef(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 undef_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"undef\"));\n    undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"undef\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"undef.obj\"), undef_obj)) { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // try linking unresolved symbol and see if linker picks up on that\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj\");\n  if (linker_exit_code != LNK_Error_UnresolvedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_link_unref_undef(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 undef_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"undef\"));\n    undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = { 0xc3 };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"undef.obj\"), undef_obj)) { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // try linking unreferenced unresolved symbol, this must link\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj undef.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  result = T_Result_Pass;\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_lib_vs_weak_lib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code;\n\n  // linker must pick weak symbol from a.obj\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x111;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  // linker must pick weak symbol from entry.obj\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_lib_vs_weak_nolib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // linker must pick weak symbol from entry.obj\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_lib_vs_weak_alias(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchAlias, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // linker must pick weak symbol from entry.obj\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_lib_vs_weak_antidep(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // linker must pick weak symbol from a.obj\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_alias_vs_weak_alias(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *qwe = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"qwe\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"sym\"), COFF_WeakExt_SearchAlias, qwe);\n    a = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 b;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *ewq = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"ewq\"), 0x222, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"sym\"), COFF_WeakExt_SearchAlias, ewq);\n    b = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"sym\"));\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a)) { goto exit; }\n  if (!t_write_file(str8_lit(\"b.obj\"), b)) { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj\");\n  if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_alias_vs_weak_lib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchAlias, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // linker must pick weak symbol from entry.obj\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_alias_vs_weak_nolib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchAlias, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // linker must pick weak symbol from entry.obj\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_alias_vs_weak_antidep(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchAlias, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  // linker must pick weak symbol from entry.obj\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_nolib_vs_weak_nolib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_nolib_vs_weak_lib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_nolib_vs_weak_alias(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchAlias, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_nolib_vs_weak_antidep(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_antidep_vs_weak_antidep(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code;\n\n  // linker must pick weak symbol from a.obj\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x111;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  // linker must pick weak symbol from entry.obj\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_antidep_vs_weak_nolib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_NoLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_antidep_vs_weak_lib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x222;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_antidep_vs_weak_alias(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"q\"), 0x111, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchAlias, q);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *e = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"e\"), 0x222, COFF_SymStorageClass_External);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_AntiDependency, e);\n    coff_obj_writer_section_push_reloc_addr32(obj_writer, sect, 3, sym);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n    if (text_sect == 0) { goto exit; }\n    String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n    String8 imm       = str8_substr(text_data, rng_1u64(3, 7));\n    U32 expected = 0x111;\n    if (!str8_match(imm, str8_struct(&expected), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_vs_common(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 weak_obj;\n  {\n    COFF_ObjWriter  *obj_writer  = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect        = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS, str8_lit(\"a\"));\n    COFF_ObjSymbol  *sect_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"_a\"), 0, sect);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"w\"), COFF_WeakExt_SearchLibrary, sect_symbol);\n    weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n    \n  String8 common_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_common(obj_writer, str8_lit(\"w\"), 2);\n    common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"w\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"weak.obj\"), weak_obj))     { goto exit; }\n  if (!t_write_file(str8_lit(\"common.obj\"), common_obj)) { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj))   { goto exit; }\n\n  int linker_exit_code;\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe common.obj weak.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe weak.obj common.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *bss = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".bss\"));\n  if (!bss)            { goto exit; }\n  if (bss->fsize != 0) { goto exit; }\n  if (bss->vsize != 2) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_abs_vs_weak(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  U32 abs_value   = 0x123;\n  U8  text_code[] = { 0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3 };\n\n  String8 abs_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"foo\"), abs_value, COFF_SymStorageClass_External);\n    abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 text_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    COFF_ObjSection *mydata = coff_obj_writer_push_section(obj_writer, str8_lit(\".mydata\"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_Align1Bytes, str8_lit(\"mydata\"));\n    COFF_ObjSymbol  *tag    = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"mydata\"), 0, mydata);\n    COFF_ObjSymbol  *foo    = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"foo\"), COFF_WeakExt_NoLibrary, tag);\n\n    COFF_ObjSection *text = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), COFF_SectionFlag_CntCode|COFF_SectionFlag_MemExecute|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_code));\n    coff_obj_writer_section_push_reloc(obj_writer, text, 2, foo, COFF_Reloc_X64_Addr64);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text);\n\n    text_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"abs.obj\"),  abs_obj))  { goto exit; }\n  if (!t_write_file(str8_lit(\"text.obj\"), text_obj)) { goto exit; }\n\n  int abs_vs_weak_exit_code = t_invoke_linker(str8_lit(\"/subsystem:console /entry:my_entry /out:a.exe abs.obj text.obj\"));\n  if (abs_vs_weak_exit_code != 0) { goto exit; }\n\n  int weak_vs_abs_exit_code = t_invoke_linker(str8_lit(\"/subsystem:console /entry:my_entry /out:a.exe text.obj abs.obj\"));\n  if (weak_vs_abs_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *text_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n  if (text_section == 0) { goto exit; }\n\n  String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + text_section->fsize));\n  String8 inst      = str8_prefix(text_data, 2);\n  if (!str8_match(inst, str8_array(text_code, 2), 0)) { goto exit; }\n\n  String8 imm          = str8_prefix(str8_skip(text_data, 2), 8);\n  U64     expected_imm = abs_value;\n  if (!str8_match(imm, str8_struct(&expected_imm), 0)) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_abs_vs_regular(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  String8 shared_symbol_name = str8_lit(\"foo\");\n\n  U8 regular_payload[] = { 0xC0, 0xFF, 0xEE };\n  String8 regular_obj_name = str8_lit(\"regular.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(regular_payload));\n    coff_obj_writer_push_symbol_extern(obj_writer, shared_symbol_name, 0, data_sect);\n    String8 regular_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(regular_obj_name, regular_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 abs_obj_name = str8_lit(\"abs.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External);\n    String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(abs_obj_name, abs_obj)) {\n      goto exit;\n    }\n  }\n\n  U8 entry_text[] = { \n    0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, $imm\n    0xC3 // ret\n  };\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    COFF_ObjSymbol *shared_symbol = coff_obj_writer_push_symbol_undef(obj_writer, shared_symbol_name);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, shared_symbol, COFF_Reloc_X64_Addr32Nb);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  // TODO: validate that linker issues multiply defined symbol error\n  int abs_vs_regular_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe abs.obj regular.obj entry.obj\");\n  if (abs_vs_regular_exit_code == 0) {\n    // linker should complain about multiply defined symbol\n    goto exit;\n  }\n\n  int regular_vs_abs_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe regular.obj abs.obj entry.obj\");\n  if (regular_vs_abs_exit_code == 0) {\n    // linker should complain even in case regular is before abs\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n  \n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_abs_vs_common(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 shared_symbol_name = str8_lit(\"foo\");\n\n  String8 common_obj_name = str8_lit(\"common.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_common(obj_writer, shared_symbol_name, 321);\n    String8 common_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(common_obj_name, common_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 abs_obj_name = str8_lit(\"abs.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, shared_symbol_name, 0x1234, COFF_SymStorageClass_External);\n    String8 abs_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(abs_obj_name, abs_obj)) {\n      goto exit;\n    }\n  }\n\n  U8 entry_text[] = { 0xC3 };\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe abs.obj common.obj entry.obj\");\n  if (linker_exit_code == 0) {\n    // TODO: validate that linker issues multiply defined symbol error\n    int common_vs_abs = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe common.obj abs.obj entry.obj\");\n    if (t_ident_linker() == T_Linker_RAD) {\n      if (common_vs_abs == LNK_Error_MultiplyDefinedSymbol) {\n        result = T_Result_Pass;\n      }\n    } else {\n      if (common_vs_abs != 0) {\n        result = T_Result_Pass;\n      }\n    }\n  }\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_abs_vs_abs(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"foo\"), 'a', COFF_SymStorageClass_External);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 b_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"foo\"), 'b', COFF_SymStorageClass_External);\n    b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj)) { goto exit; }\n  if (!t_write_file(str8_lit(\"b.obj\"), b_obj)) { goto exit; }\n  t_write_entry_obj();\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj\");\n  if (linker_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_undef_weak_lib(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 weak;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSymbol *b = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"b\"), 0xc3000000, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"a\"), COFF_WeakExt_SearchLibrary, b);\n    weak = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSymbol *sym = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"a\"));\n    U8 text[4] = {0};\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, sym);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    entry = coff_obj_writer_serialize(scratch.arena, obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"weak.obj\"), weak))   { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry)) { goto exit; }\n\n  // undefined symbol must always replace weak symbol with search library\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /out:a.exe /entry:entry entry.obj weak.obj\");\n  if (linker_exit_code != LNK_Error_UnresolvedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_undef_weak_search_alias(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 weak_obj;\n  {\n    U8 weak_payload[] = { 0xDE, 0xAD, 0xBE, 0xEF };\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *weak_sect = t_push_data_section(obj_writer, str8_array_fixed(weak_payload));\n    COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"ptr\"));\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"foo\"), COFF_WeakExt_SearchAlias, tag);\n    weak_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 ptr_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *tag = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"entry\"));\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"ptr\"), COFF_WeakExt_SearchAlias, tag);\n    ptr_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 undef_obj;\n  {\n    U8 undef_obj_payload[] = { 0x00, 0x00, 0x00, 0x00 };\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *undef_sect = t_push_data_section(obj_writer, str8_array_fixed(undef_obj_payload));\n    COFF_ObjSymbol *undef_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"foo\"));\n    coff_obj_writer_section_push_reloc(obj_writer, undef_sect, 0, undef_symbol, COFF_Reloc_X64_Addr32Nb);\n    undef_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    U8 entry_payload[] = {0xC3};\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"weak.obj\"), weak_obj))   { goto exit; }\n  if (!t_write_file(str8_lit(\"ptr.obj\"), ptr_obj))     { goto exit; }\n  if (!t_write_file(str8_lit(\"undef.obj\"), undef_obj)) { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe weak.obj entry.obj ptr.obj undef.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_cycle(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  String8 ab_obj_name = str8_lit(\"ab.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *b = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"B\"));\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"A\"), COFF_WeakExt_SearchAlias, b);\n    String8 ab_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(ab_obj_name, ab_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 ba_obj_name = str8_lit(\"ba.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *a = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"A\"));\n    coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"B\"), COFF_WeakExt_SearchAlias, a);\n    String8 ba_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(ba_obj_name, ba_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  U8 entry_payload[] = { 0xC3 };\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_payload));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  U64 time_out = os_now_microseconds() + 3 * 1000 * 1000; // give a generous 3 seconds\n  int linker_exit_code = t_invoke_linker_with_time_outf(time_out, \"/subsystem:console /entry:my_entry %S %S %S\", entry_obj_name, ab_obj_name, ba_obj_name);\n  if (linker_exit_code != T_LINKER_TIME_OUT_EXIT_CODE) {\n    if (t_ident_linker() == T_Linker_MSVC) {\n      if (linker_exit_code == T_MsvcLinkExitCode_UnresolvedExternals) {\n        result = T_Result_Pass;\n      }\n    } else {\n      result = T_Result_Pass;\n    }\n  }\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_weak_tag(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  U32     weak_tag_expected_value = 0x12345678;\n  String8 weak_tag_obj_name       = str8_lit(\"weak_tag.obj\");\n  {\n    COFF_ObjWriter *obj_writer  = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *tag_symbol  = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"abs\"), weak_tag_expected_value, COFF_SymStorageClass_Static);\n    COFF_ObjSymbol *weak_first  = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"strong_first\"), COFF_WeakExt_SearchAlias, tag_symbol);\n    COFF_ObjSymbol *weak_second = coff_obj_writer_push_symbol_weak(obj_writer, str8_lit(\"strong_second\"), COFF_WeakExt_SearchAlias, weak_first);\n\n    U8 sect_data[4] = {0};\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(sect_data));\n    coff_obj_writer_section_push_reloc(obj_writer, sect, 0, weak_second, COFF_Reloc_X64_Addr32);\n\n    String8 weak_tag_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(weak_tag_obj_name, weak_tag_obj)) { goto exit; }\n  }\n\n  String8 entry_name     = str8_lit(\"my_entry\");\n  U8      entry_text[]   = { 0xC3 };\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter  *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect  = t_push_text_section(obj_writer, str8_array_fixed(entry_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe %S %S\", weak_tag_obj_name, entry_obj_name);\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *data_section  = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n  String8             data          = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize));\n  if (!data_section)                                               { goto exit; }\n  if (data_section->vsize != 4)                                    { goto exit; }\n  if (!str8_match(data, str8_struct(&weak_tag_expected_value), 0)) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal String8\nt_make_sec_defn_obj(Arena *arena, String8 payload)\n{\n  COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n  COFF_ObjSection *mysect_section = coff_obj_writer_push_section(obj_writer, str8_lit(\".mysect\"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes, payload);\n  coff_obj_writer_push_symbol_secdef(obj_writer, mysect_section, COFF_ComdatSelect_Null);\n  String8 obj = coff_obj_writer_serialize(arena, obj_writer);\n  coff_obj_writer_release(&obj_writer);\n  return obj;\n}\n\ninternal T_Result\nt_undef_section(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 main_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    U8 data[] = { 0, 0, 0, 0 };\n    COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data));\n    COFF_ObjSymbol  *foo          = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(\".mysect\"), COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead);\n    coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr32Nb);\n\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_section = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_section);\n\n    main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  U8 payload[] = { 1, 2, 3 };\n  String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload));\n\n  t_write_file(str8_lit(\"main.obj\"), main_obj);\n  t_write_file(str8_lit(\"sec_defn.obj\"), sec_defn_obj);\n\n  int linker_exit_code = t_invoke_linker(str8_lit(\"/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj\"));\n  if (linker_exit_code == 0) {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n    COFF_SectionHeader *data_section   = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n    COFF_SectionHeader *mysect_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".mysect\"));\n    if (data_section && mysect_section) {\n      if (data_section->vsize == 4 && mysect_section->vsize == 3) {\n        String8 addr32nb = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize));\n        String8 expected_voff = str8_struct(&mysect_section->voff);\n        if (str8_match(addr32nb, expected_voff, 0)) {\n          result = T_Result_Pass;\n        }\n      }\n    }\n  }\n\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_sect_symbol(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  String8 sect_payload = str8_lit(\"hello, world\");\n  String8 sect_obj_name = str8_lit(\"sect.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".mysect$1\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, sect_payload);\n    coff_obj_writer_push_directive(obj_writer, str8_lit(\"/merge:.mysect=.data\"));\n    String8 sect_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(sect_obj_name, sect_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 main_obj_name = str8_lit(\"main.obj\");\n  {\n    U8 data[8] = {0};\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_array_fixed(data));\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(\".mysect$2222\"), PE_DATA_SECTION_FLAGS);\n    coff_obj_writer_section_push_reloc_addr(obj_writer, sect, 0, symbol);\n\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n\n    String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n\n    if (!t_write_file(main_obj_name, main_obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe main.obj sect.obj\");\n\n  if (linker_exit_code != 0) { \n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *sect          = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n\n  if (!sect) {\n    goto exit;\n  }\n\n  String8 sect_data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n\n  String8 addr_data = str8_substr(sect_data, rng_1u64(0, sizeof(U64)));\n  if (addr_data.size != sizeof(U64)) {\n    goto exit;\n  }\n  U64 addr = *(U64 *)addr_data.str;\n  if (addr - (pe.image_base + sect->voff) != 8) {\n    goto exit;\n  }\n\n  String8 payload_got = str8_substr(sect_data, rng_1u64(8, sect_data.size));\n  if (!str8_match(payload_got, sect_payload, 0)) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_undef_reloc_section(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 main_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_section = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    COFF_ObjSymbol *my_entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_section);\n\n    U8 data[8] = { 0 };\n    COFF_ObjSection *data_section = t_push_data_section(obj_writer, str8_array_fixed(data));\n    COFF_ObjSymbol  *foo          = coff_obj_writer_push_symbol_undef_sect(obj_writer, str8_lit(\".reloc\"), PE_RELOC_SECTION_FLAGS);\n    coff_obj_writer_section_push_reloc(obj_writer, data_section, 0, foo, COFF_Reloc_X64_Addr64);\n\n    main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  U8 payload[] = { 1, 2, 3 };\n  String8 sec_defn_obj = t_make_sec_defn_obj(scratch.arena, str8_array_fixed(payload));\n\n  t_write_file(str8_lit(\"main.obj\"), main_obj);\n  t_write_file(str8_lit(\"sec_defn.obj\"), sec_defn_obj);\n\n  int linker_exit_code = t_invoke_linker(str8_lit(\"/subsystem:console /entry:my_entry /out:a.exe main.obj sec_defn.obj\"));\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_SectRefsDiscardedMemory) {\n      goto exit;\n    }\n  } else if (linker_exit_code == 0) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_find_merged_pdata(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  U8 foobar_payload[] = {\n    0x40, 0x57, 0x48, 0x81, 0xEC, 0x00, 0x02, 0x00, 0x00, 0x48, 0x8B, 0x05, 0x00, 0x00, 0x00, 0x00,\n    0x48, 0x33, 0xC4, 0x48, 0x89, 0x84, 0x24, 0xF0, 0x01, 0x00, 0x00, 0x48, 0x8D, 0x04, 0x24, 0x48,\n    0x8B, 0xF8, 0x33, 0xC0, 0xB9, 0xEC, 0x01, 0x00, 0x00, 0xF3, 0xAA, 0xB8, 0x04, 0x00, 0x00, 0x00,\n    0x48, 0x6B, 0xC0, 0x02, 0x8B, 0x04, 0x04, 0x48, 0x8B, 0x8C, 0x24, 0xF0, 0x01, 0x00, 0x00, 0x48,\n    0x33, 0xCC, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x81, 0xC4, 0x00, 0x02, 0x00, 0x00, 0x5F, 0xC3,\n    0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC, 0xCC,\n    0x48, 0x83, 0xEC, 0x28, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0xC3      \n  };\n  U8 xdata_payload[] = {\n    0x19, 0x1B, 0x03, 0x00, 0x09, 0x01, 0x40, 0x00, 0x02, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0xF0, 0x01, 0x00, 0x00, 0x01, 0x04, 0x01, 0x00, 0x04, 0x42, 0x00, 0x00\n  };\n  PE_IntelPdata intel_pdata = {0};\n  U8 text_payload[]  = { 0xC3 };\n\n  String8 main_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *xdata  = coff_obj_writer_push_section(obj_writer, str8_lit(\".xdata\"),  COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_array_fixed(xdata_payload));\n    COFF_ObjSection *pdata  = coff_obj_writer_push_section(obj_writer, str8_lit(\".pdata\"),  COFF_SectionFlag_MemRead|COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_Align4Bytes, str8_struct(&intel_pdata));\n    COFF_ObjSection *foobar = coff_obj_writer_push_section(obj_writer, str8_lit(\".foobar\"), COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(foobar_payload));\n    COFF_ObjSection *text   = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"),   COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute|COFF_SectionFlag_CntCode|COFF_SectionFlag_Align1Bytes, str8_array_fixed(text_payload));\n\n    COFF_ObjSymbol *foobar_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"foobar\"), 0, foobar);\n\n    coff_obj_writer_push_symbol_secdef(obj_writer, xdata, COFF_ComdatSelect_Null);\n    COFF_ObjSymbol *unwind_foobar = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"$unwind$foobar\"), 0, xdata);\n\n    coff_obj_writer_push_symbol_secdef(obj_writer, pdata, COFF_ComdatSelect_Null);\n    coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"$pdata$foobar\"), 0, pdata);\n\n    coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_unwind_info),   unwind_foobar, COFF_Reloc_X64_Addr32Nb);\n    coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_first),         foobar_symbol, COFF_Reloc_X64_Addr32Nb);\n    coff_obj_writer_section_push_reloc(obj_writer, pdata, OffsetOf(PE_IntelPdata, voff_one_past_last), foobar_symbol, COFF_Reloc_X64_Addr32Nb);\n\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text);\n    main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  t_write_file(str8_lit(\"main.obj\"), main_obj);\n\n  int linker_exit_code = t_invoke_linker(str8_lit(\"/subsystem:console /entry:my_entry /out:a.exe main.obj /merge:.pdata=.rdata\"));\n  if (linker_exit_code == 0) {\n    String8    exe = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo pe  = pe_bin_info_from_data(scratch.arena, exe);\n    if (dim_1u64(pe.data_dir_franges[PE_DataDirectoryIndex_EXCEPTIONS]) == 0xC) {\n      result = T_Result_Pass;\n    }\n  }\n\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_section_sort(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  \n  T_Result result = T_Result_Fail;\n\n  String8 data_obj_name = str8_lit(\"data.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    COFF_SectionFlags data_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemRead|COFF_SectionFlag_Align1Bytes;\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".data$z\"), data_flags, str8_lit(\"five\"));\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".data$a\"), data_flags, str8_lit(\"three\"));\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".data$bbbbb\"), data_flags, str8_lit(\"four\"));\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".data$\"), data_flags, str8_lit(\"two\"));\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".data\"), data_flags, str8_lit(\"one\"));\n\n    String8 data_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(data_obj_name, data_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  U8 entry_text[] = { 0xC3 };\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe data.obj entry.obj\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *data_section = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n  if (!data_section) {\n    goto exit;\n  }\n\n  String8 data = str8_substr(exe, rng_1u64(data_section->foff, data_section->foff + data_section->vsize));\n  String8 expected_data = str8_lit(\"onetwothreefourfive\");\n  if (!str8_match(data, expected_data, 0)) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_flag_conf(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  COFF_SectionFlags my_sect0_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemExecute;\n  COFF_SectionFlags my_sect1_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead|COFF_SectionFlag_MemWrite;\n  String8 conf_obj_name = str8_lit(\"conf.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *a_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".mysect\"), my_sect0_flags, str8_lit(\"one\"));\n    COFF_ObjSection *b_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".mysect\"), my_sect1_flags, str8_lit(\"two\"));\n    String8 conf_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(conf_obj_name, conf_obj)) {\n      goto exit;\n    }\n  }\n\n  U8 entry_text[] = { 0xC3 };\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe conf.obj entry.obj\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeaderArray my_sects = t_coff_section_header_array_from_name(scratch.arena, string_table, section_table, pe.section_count, str8_lit(\".mysect\"));\n\n  if (my_sects.count != 2) {\n    goto exit;\n  }\n\n  COFF_SectionHeader *my_sect0 = &my_sects.v[0];\n  COFF_SectionHeader *my_sect1 = &my_sects.v[1];\n  if (my_sect0->flags != my_sect0_flags) {\n    goto exit;\n  }\n  if (my_sect1->flags != my_sect1_flags) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_invalid_bss(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  COFF_SectionFlags bss_flags = COFF_SectionFlag_CntInitializedData|COFF_SectionFlag_MemRead;\n  String8 bss_obj_name = str8_lit(\"bss.obj\");\n  String8 bss_data = str8_lit(\"Hello, World\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".bss\"), bss_flags, bss_data);\n    String8 bss_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(bss_obj_name, bss_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe bss.obj entry.obj\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *bss_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".bss\"));\n  if (bss_sect == 0) {\n    goto exit;\n  }\n  if (bss_sect->vsize != 0xC) {\n    goto exit;\n  }\n  if (bss_sect->flags != bss_flags) {\n    goto exit;\n  }\n  String8 data = str8_substr(exe, rng_1u64(bss_sect->foff, bss_sect->foff + bss_sect->vsize));\n  if (!str8_match(data, bss_data, 0)) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_common_block(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  String8 a_obj_name = str8_lit(\"a.obj\");\n  U8 a_data[6] = {0};\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit(\"A\"), 3);\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(a_data));\n    data_sect->flags |= COFF_SectionFlag_Align1Bytes;\n    coff_obj_writer_push_section(obj_writer, str8_lit(\".bss\"), PE_BSS_SECTION_FLAGS, str8(0, 1)); // shift common block's initial position\n    coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr32);\n    String8 a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(a_obj_name, a_obj)) { goto exit; }\n  }\n\n  String8 b_obj_name = str8_lit(\"b.obj\");\n  U8 b_data[9] = { 0 };\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(b_data));\n    data_sect->flags |= COFF_SectionFlag_Align1Bytes;\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_common(obj_writer, str8_lit(\"B\"), 6);\n    coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, symbol, COFF_Reloc_X64_Addr64);\n    String8 b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(b_obj_name, b_obj)) { goto exit; }\n  }\n\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe /fixed /largeaddressaware:no /merge:.bss=.comm a.obj b.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  COFF_SectionHeader *comm_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".comm\"));\n  COFF_SectionHeader *data_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n  if (comm_sect == 0) { goto exit; }\n  if (data_sect == 0) { goto exit; }\n\n  // blocks must be sorted in descending order to reduce alignment padding\n  if (comm_sect->vsize != 0x13) { goto exit; }\n\n  // ensure linker correctly patched addresses for symbols pointing into common block\n  String8             data      = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->fsize));\n  U32                *a_addr    = (U32 *)data.str;\n  U64                *b_addr    = (U64 *)(data.str + sizeof(a_data));\n  if (*a_addr != (pe.image_base + comm_sect->voff + 0x10)) { goto exit; }\n  if (*b_addr != (pe.image_base + comm_sect->voff + 0x8)) { goto exit; }\n  \n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_base_relocs(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  // main.obj\n  String8 entry_name = str8_lit(\"my_entry\");\n  U64 mov_func_name64 = 2;\n  U64 mov_func_name32 = 16;\n  U8 main_text[] = {\n    0x48, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  // mov rax, func_name\n    0xff, 0xd0,                                                  // call rax\n    0x48, 0x31, 0xc0,                                            // xor rax, rax\n    0xb8, 0x00, 0x00, 0x00, 0x00,                                // mov eax, func_name\n    0xff, 0xd0,                                                  // call rax\n    0xc3                                                         // ret\n  };\n\n  // func.obj\n  String8 func_name   = str8_lit(\"foo\");\n  U8      func_text[] = { 0xc3 };\n\n  String8 main_obj_name = str8_lit(\"main.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect  = t_push_text_section(obj_writer, str8_array_fixed(main_text));\n    COFF_ObjSymbol  *func_undef = coff_obj_writer_push_symbol_undef(obj_writer, func_name);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name64, func_undef, COFF_Reloc_X64_Addr64);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, mov_func_name32, func_undef, COFF_Reloc_X64_Addr32);\n\n    // linker must not produce base relocations for absolute symbol\n    U8 data[4] = {0};\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(data));\n    COFF_ObjSymbol *abs_symbol = coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"abs\"), 0x12345678, COFF_SymStorageClass_Static);\n    coff_obj_writer_section_push_reloc(obj_writer, data_sect, 0, abs_symbol, COFF_Reloc_X64_Addr32);\n\n    coff_obj_writer_push_symbol_extern(obj_writer, entry_name, 0, text_sect);\n    String8 main_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(main_obj_name, main_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 func_obj_name = str8_lit(\"func.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(func_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, func_name, 0, text_sect);\n    String8 func_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(func_obj_name, func_obj)) {\n      goto exit;\n    }\n  }\n\n  String8 out_name = str8_lit(\"a.exe\");\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe main.obj func.obj\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  // it is illegal to merge .reloc with other sections\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.reloc=.rdata main.obj func.obj\");\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_IllegalSectionMerge) {\n      goto exit;\n    }\n  } else {\n    if (linker_exit_code == 0) {\n      goto exit;\n    }\n  }\n\n  // the other way around is illegal too\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /dynamicbase /largeaddressaware:no /out:a.exe /merge:.rdata=.reloc main.obj func.obj\");\n  if (t_ident_linker() == T_Linker_RAD) {\n    if (linker_exit_code != LNK_Error_IllegalSectionMerge) {\n      goto exit;\n    }\n  } else {\n    if (linker_exit_code == 0) {\n      goto exit;\n    }\n  }\n\n  result = T_Result_Pass;\n  \nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_simple_lib_test(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 test_payload = str8_lit(\"The quick brown fox jumps over the lazy dog\");\n  String8 test_obj = {0};\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_Unknown);\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8(test_payload.str, test_payload.size+1));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"test\"), 0, data_sect);\n    test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 test_lib_name = str8_lit(\"test.lib\");\n  {\n    COFF_LibWriter *lib_writer = coff_lib_writer_alloc();\n    coff_lib_writer_push_obj(lib_writer, str8_lit(\"test.obj\"), test_obj);\n    String8 test_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1);\n    coff_lib_writer_release(&lib_writer);\n    if (!t_write_file(test_lib_name, test_lib)) {\n      goto exit;\n    }\n  }\n\n  U8 entry_text[] = {\n    0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,\n    0xC3\n  };\n  String8 entry_obj_name = str8_lit(\"entry.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(entry_text));\n    COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"test\"));\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, test_symbol, COFF_Reloc_X64_Addr32Nb);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 7, text_sect);\n    String8 entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(entry_obj_name, entry_obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe entry.obj test.lib\");\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *text_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n  COFF_SectionHeader *data_sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n\n  String8 text_data = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->fsize));\n  String8 data_data = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->fsize));\n\n  // was test payload linked?\n  String8 data_string = str8_cstring_capped(data_data.str, data_data.str + data_data.size);\n  if (!str8_match(data_string, test_payload, 0)) {\n    goto exit;\n  }\n\n  // do we have enough bytes to read text?\n  if (text_data.size < sizeof(entry_text)) {\n    goto exit;\n  }\n\n  // linker must pull-in test.obj and patch relocation for \"test\" symbol\n  U32 *data_addr32nb = (U32 *)(text_data.str+3);\n  if (*data_addr32nb != data_sect->voff) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_import_export(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  {\n    String8 export_obj_name    = str8_lit(\"export.obj\");\n    String8 export_obj_payload = str8_lit(\"test\");\n    U8      export_text[]      = { 0xC3 };\n\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, export_obj_payload);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"foo\"), 0, data_sect);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"ord\"), 0, data_sect);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"ord2\"), 0, data_sect);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"ord3\"), 0, data_sect);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"ord4\"), 0, data_sect);\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:foo=foo\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:bar=foo\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:ord,@5\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:ord2,@6,DATA\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:ord3,@7,NONAME,PRIVATE\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:ord4,@8,NONAME,DATA\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:baz=baz.qwe\"));\n    //coff_obj_writer_push_directive(obj_writer, str8_lit(\"/export:baf=baz.#1\"));\n    String8 export_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(export_obj_name, export_obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    String8 import_obj_name = str8_lit(\"import.obj\");\n    U8 import_payload[1024] = {0};\n\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *data_sect = t_push_data_section(obj_writer, str8_array_fixed(import_payload));\n\n    char *import_symbols[] = {\n      \"__imp_foo\",\n      \"__imp_bar\",\n      \"__imp_baz\",\n      \"__imp_baf\",\n      \"__imp_ord\",\n      //\"__imp_ord2\",\n      //\"__imp_ord4\",\n      \"bar\",\n      //\"baf\",\n      //\"baz\",\n      \"foo\",\n      \"ord\",\n    };\n\n    for (U64 i = 0; i < ArrayCount(import_symbols); ++i) {\n      COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_cstring(import_symbols[i]));\n      coff_obj_writer_section_push_reloc_voff(obj_writer, data_sect, i * 4, symbol);\n    }\n\n    String8 import_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(import_obj_name, import_obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *s1 = coff_obj_writer_push_section(obj_writer, str8_lit(\".s1\"), PE_DATA_SECTION_FLAGS, str8_lit(\"s1\"));\n    COFF_ObjSection *s2 = coff_obj_writer_push_section(obj_writer, str8_lit(\".s2\"), PE_DATA_SECTION_FLAGS, str8_lit(\"s2\"));\n    COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed((U8[]){ 0xC3 }));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"_DllMainCRTStartup\"), 0, text_sect);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"s1\"), 0, s1);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"s2\"), 0, s2);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"baz.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  t_write_entry_obj();\n\n  //\n  // link export.dll\n  //\n  int lib_link_exit_code = t_invoke_linkerf(\"/dll /out:export.dll libcmt.lib export.obj\");\n  if (lib_link_exit_code != 0) {\n    goto exit;\n  }\n\n  //\n  // link baz.dll\n  //\n  int baz_link_exit_code = t_invoke_linkerf(\"/dll /out:baz.dll /export:s1,@1,NONAME /export:qwe=s2 baz.obj\");\n  if (baz_link_exit_code != 0) {\n    goto exit;\n  }\n\n  //\n  // check export.dll export table\n  //\n  if (0) {\n    String8              dll           = t_read_file(scratch.arena, str8_lit(\"export.dll\"));\n    PE_BinInfo           pe            = pe_bin_info_from_data(scratch.arena, dll);\n    COFF_SectionHeader  *section_table = (COFF_SectionHeader *)str8_substr(dll, pe.section_table_range).str;\n    String8              string_table  = str8_substr(dll, pe.string_table_range);\n    PE_ParsedExportTable export_table  = pe_exports_from_data(scratch.arena, pe.section_count, section_table, dll, pe.data_dir_franges[PE_DataDirectoryIndex_EXPORT], pe.data_dir_vranges[PE_DataDirectoryIndex_EXPORT]);\n\n    if (export_table.export_count != 6) {\n      goto exit;\n    }\n\n    {\n      String8 expected_symbols[] = {\n        str8_lit_comp(\"foo\"),\n        str8_lit_comp(\"bar\"),\n        //str8_lit_comp(\"baz\"),\n        //str8_lit_comp(\"baf\"),\n        str8_lit_comp(\"ord\"),\n        str8_lit_comp(\"ord2\")\n      };\n      U64 match_count = 0;\n      for (U64 i = 0; i < export_table.export_count; i += 1) {\n        for (U64 k = 0; k < ArrayCount(expected_symbols); k += 1) {\n          if (str8_match(export_table.exports[i].name, expected_symbols[k], 0)) {\n            match_count += 1;\n          }\n        }\n      }\n      if (match_count != ArrayCount(expected_symbols)) {\n        goto exit;\n      }\n    }\n\n    if (0) {\n      String8 expected_forwarders[] = {\n        str8_lit_comp(\"baz.qwe\"),\n        str8_lit_comp(\"baz.#1\"),\n      };\n      U64 match_count = 0;\n      for (U64 i = 0; i < export_table.export_count; i += 1) {\n        for (U64 k = 0; k < ArrayCount(expected_forwarders); k += 1) {\n          if (str8_match(export_table.exports[i].forwarder, expected_forwarders[k], 0)) {\n            match_count += 1;\n          }\n        }\n      }\n      if (match_count != ArrayCount(expected_forwarders)) {\n        goto exit;\n      }\n    }\n  }\n\n  #if OS_WINDOWS\n  BOOL is_dir_set = SetDllDirectoryA((LPCSTR)g_wdir.str);\n  AssertAlways(is_dir_set);\n\n  HANDLE export_dll = LoadLibrary(\"export.dll\");\n  DWORD last_error = GetLastError();\n  if (export_dll == 0) {\n    goto exit;\n  }\n\n  char *export_dll_procs[] = { \"foo\", \"bar\", \"baz\", \"baf\" };\n  for (U64 i = 0; i < ArrayCount(export_dll_procs); ++i) {\n    void *proc = GetProcAddress(export_dll, export_dll_procs[i]);\n    if (proc == 0) {\n      goto exit;\n    }\n  }\n\n  U16 export_dll_ordinals[] = { 5 };\n  for (U64 i = 0; i < ArrayCount(export_dll_ordinals); ++i) {\n    void *proc = GetProcAddress(export_dll, MAKEINTRESOURCE(export_dll_ordinals[i]));\n    if (proc == 0) {\n      goto exit;\n    }\n  }\n  #endif\n\n  int import_link_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /delayload:export.dll /export:entry kernel32.Lib delayimp.lib libcmt.lib export.lib import.obj entry.obj\");\n  if (import_link_exit_code != 0) {\n    goto exit;\n  }\n\n  // TODO: check import table\n\n  result = T_Result_Pass;\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_image_base(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  String8 obj_name = str8_lit(\"image_base.obj\");\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = { \n      0x48, 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, // lea rcx, [__ImageBase]\n      0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // mov rax, __ImageBase\n      0xB8, 0x00, 0x00, 0x00, 0x00, // mov eax, __ImageBase\n      0xC3 // ret\n    };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    COFF_ObjSymbol *image_base_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"__ImageBase\"));\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 3, image_base_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 9, image_base_symbol, COFF_Reloc_X64_Addr64);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 18, image_base_symbol, COFF_Reloc_X64_Addr32Nb);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect); \n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(obj_name, obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /base:0x2000000140000000 /out:a.exe image_base.obj\");\n\n  if (linker_exit_code != 0) {\n    goto exit;\n  }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *text_section  = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n\n  if (!text_section) {\n    goto exit;\n  }\n\n  U8 expected_text[] = {\n    0x48, 0x8D, 0x0D, 0xF9, 0xEF, 0xFF, 0xFF,\n    0x48, 0xB8, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x20,\n    0xB8, 0x00, 0x00, 0x00, 0x00,\n    0xC3\n  };\n  String8 text_data = str8_substr(exe, rng_1u64(text_section->foff, text_section->foff + sizeof(expected_text)));\n  if (!str8_match(text_data, str8_array_fixed(expected_text), 0)) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_any(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".test$mn\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"1\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any);\n    COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    test->type.u.msb = COFF_SymDType_Func;\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"1.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".test$mn\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"2\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Any);\n    COFF_ObjSymbol *test = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"2.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  {\n    int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:1.exe 1.obj 2.obj entry.obj\");\n    if (linker_exit_code != 0) {\n        goto exit;\n    }\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"1.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".test\"));\n    String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"1\"), 0)) {\n      goto exit;\n    }\n  }\n\n  {\n    int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:2.exe 2.obj 1.obj entry.obj\");\n    if (linker_exit_code != 0) {\n        goto exit;\n    }\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"2.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".test\"));\n    String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"2\"), 0)) {\n      goto exit;\n    }\n  }\n\n  result = T_Result_Pass;\n\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_no_duplicates(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 test_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".test\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"a\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, test_sect, COFF_ComdatSelect_NoDuplicates);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"a\"), 0, test_sect);\n    test_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"a\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"a.obj\"),     test_obj))  { goto exit; }\n  if (!t_write_file(str8_lit(\"b.obj\"),     test_obj))  { goto exit; }\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n\n  int duplicates_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj\");\n  if (duplicates_exit_code == 0) { goto exit; }\n  if (t_ident_linker() == T_Linker_RAD && duplicates_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; }\n\n  int good_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:b.exe a.obj entry.obj\");\n  if (good_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"b.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".test\"));\n  if (!sect) { goto exit; }\n  String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n  if (!str8_match(data, str8_lit(\"a\"), 0)) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_same_size(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"a\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".b\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"b\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".c\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"cc\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_SameSize);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"c.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int same_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj\");\n  if (same_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".a\"));\n    if (sect == 0) { goto exit; }\n    String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"a\"), 0)) { goto exit; }\n  }\n\n  int not_same_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:b.exe a.obj b.obj c.obj entry.obj\");\n  if (not_same_exit_code == 0) { goto exit; }\n  if (t_ident_linker() == T_Linker_RAD && not_same_exit_code != LNK_Error_MultiplyDefinedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_exact_match(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"a\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".a2\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"a\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a2.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".b\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"b\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_ExactMatch);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int not_exact_match = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj\");\n  if (not_exact_match == 0) { goto exit; }\n\n  int exact_match = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:b.exe entry.obj a2.obj a.obj\");\n  if (exact_match != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"b.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".a2\"));\n    if (sect == 0) { goto exit; }\n    String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"a\"), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_largest(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"a\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".b\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"bb\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".c\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"c\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"c.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int largest_exit_code = t_invoke_linkerf(\"/subsystem:console /out:a.exe /entry:entry entry.obj a.obj b.obj\");\n  if (largest_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *discard_sect  = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".a\"));\n    if (discard_sect != 0) { goto exit; }\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".b\"));\n    if (sect == 0) { goto exit; }\n    String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"bb\"), 0)) { goto exit; }\n  }\n\n  int same_size_exit_code = t_invoke_linkerf(\"/subsystem:console /out:b.exe /entry:entry entry.obj c.obj a.obj\");\n  if (same_size_exit_code != 0) { goto exit; }\n\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"b.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".c\"));\n    if (sect == 0) { goto exit; }\n    String8             data          = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n    if (!str8_match(data, str8_lit(\"c\"), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n scratch_end(scratch);\n return result;\n}\n\ninternal T_Result\nt_comdat_associative(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(\"a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"a\"));\n    COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(\"aa\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"aa\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, a);\n    coff_obj_writer_push_symbol_associative(obj_writer, aa, a);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSection *bb = coff_obj_writer_push_section(obj_writer, str8_lit(\"bb\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"bb\"));\n    COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit(\"b\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"b\"));\n    COFF_ObjSection *bbb = coff_obj_writer_push_section(obj_writer, str8_lit(\"bbb\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"bbb\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, bb, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_associative(obj_writer, b, bb);\n    coff_obj_writer_push_symbol_associative(obj_writer, bbb, bb);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, bb);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *a = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\"a\"));\n  COFF_SectionHeader *aa = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\"aa\"));\n  COFF_SectionHeader *b = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\"b\"));\n  COFF_SectionHeader *bb = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\"bb\"));\n  COFF_SectionHeader *bbb = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\"bbb\"));\n  if (a != 0) { goto exit; }\n  if (aa != 0) { goto exit; }\n  if (b == 0) { goto exit; }\n  if (bb == 0) { goto exit; }\n  if (bbb == 0) { goto exit; }\n  String8 b_data = str8_substr(exe, rng_1u64(b->foff, b->foff + b->vsize));\n  String8 bb_data = str8_substr(exe, rng_1u64(bb->foff, bb->foff + bb->vsize));\n  String8 bbb_data = str8_substr(exe, rng_1u64(bbb->foff, bbb->foff + bbb->vsize));\n  if (!str8_match(b_data, str8_lit(\"b\"), 0)) { goto exit; }\n  if (!str8_match(bb_data, str8_lit(\"bb\"), 0)) { goto exit; }\n  if (!str8_match(bbb_data, str8_lit(\"bbb\"), 0)) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_associative_loop(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *aaaa = coff_obj_writer_push_section(obj_writer, str8_lit(\".aaaa\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"aaaa\"));\n    COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(\".aa\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"aa\"));\n    COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"a\"));\n    COFF_ObjSection *aaa = coff_obj_writer_push_section(obj_writer, str8_lit(\".aaa\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT|COFF_SectionFlag_Align1Bytes, str8_lit(\"aaa\"));\n    coff_obj_writer_push_symbol_associative(obj_writer, aaa, aa);\n    coff_obj_writer_push_symbol_associative(obj_writer, aaaa, aaa);\n    coff_obj_writer_push_symbol_associative(obj_writer, a, aa);\n    coff_obj_writer_push_symbol_associative(obj_writer, aa, a);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"loop.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe loop.obj entry.obj\");\n  if (exit_code == 0) { goto exit; }\n  if (t_ident_linker() == T_Linker_RAD && exit_code != LNK_Error_AssociativeLoop) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_associative_non_comdat(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS, str8_lit(\"a\"));\n    COFF_ObjSection *b = coff_obj_writer_push_section(obj_writer, str8_lit(\".b\"), PE_DATA_SECTION_FLAGS, str8_lit(\"b\"));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, a);\n    coff_obj_writer_push_symbol_associative(obj_writer, b, a);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"test.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj test.obj\");\n  if (exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *a             = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".a\"));\n  COFF_SectionHeader *b             = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".b\"));\n  if (a == 0) { goto exit; }\n  if (b == 0) { goto exit; }\n  String8             a_data        = str8_substr(exe, rng_1u64(a->foff, a->foff + a->vsize));\n  String8             b_data        = str8_substr(exe, rng_1u64(b->foff, b->foff + b->vsize));\n  if (!str8_match(a_data, str8_lit(\"a\"), 0)) { goto exit; }\n  if (!str8_match(b_data, str8_lit(\"b\"), 0)) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_associative_out_of_bounds(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSection *a = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"a\"));\n    COFF_ObjSection *aa = coff_obj_writer_push_section(obj_writer, str8_lit(\".aa\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_lit(\"aa\"));\n    coff_obj_writer_push_symbol_secdef(obj_writer, a, COFF_ComdatSelect_Any);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, a);\n    coff_obj_writer_push_symbol_associative(obj_writer, aa, a);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    {\n      COFF_FileHeaderInfo header = coff_file_header_info_from_data(obj);\n      String8 string_table = str8_substr(obj, header.string_table_range);\n      String8 symbol_table = str8_substr(obj, header.symbol_table_range);\n      COFF_ParsedSymbol symbol = coff_parse_symbol(header, string_table, symbol_table, 3);\n      AssertAlways(str8_match(symbol.name, str8_lit(\".aa\"), 0));\n      AssertAlways(symbol.aux_symbol_count == 1);\n      COFF_Symbol16 *symbol16 = symbol.raw_symbol;\n      COFF_SymbolSecDef *secdef = (COFF_SymbolSecDef *)(symbol16 + 1);\n      secdef->number_lo = 321;\n    }\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"bad.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj bad.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n  if (t_ident_linker() == T_Linker_RAD && linker_exit_code != LNK_Error_IllData) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_comdat_with_offset(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 a[] = \"1Hello, World!\";\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 1, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 a[] = \"Hello, World!\";\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 1, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj b.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_reloc_against_removed_comdat(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 a[] = \"1Hello, World!\";\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 1, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 a[] = \"H\";\n    COFF_ObjSection *comdat_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS|COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(a));\n    coff_obj_writer_push_symbol_secdef(obj_writer, comdat_sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 1, comdat_sect);\n    COFF_ObjSymbol *static_symbol = coff_obj_writer_push_symbol_static(obj_writer, str8_lit(\"STATIC\"), 2, comdat_sect);\n\n    U8 rdata[4] = {0};\n    COFF_ObjSection *regular_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".rdata\"), PE_RDATA_SECTION_FLAGS, str8_array_fixed(rdata));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, regular_sect, 0, static_symbol);\n\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 3, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe a.obj c.obj entry.obj\");\n  if (linker_exit_code != LNK_Error_RelocationAgainstRemovedSection) { goto exit; }\n\nexit:;\n  result = T_Result_Pass;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_sect_align(void)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    COFF_ObjSection *sect_align_shift = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS, str8_lit(\"q\"));\n    COFF_ObjSection *sect_align_none = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS, str8_lit(\"abc\"));\n    COFF_ObjSection *sect_align_1 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1Bytes, str8_lit(\"wr\"));\n    COFF_ObjSection *sect_align_2 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2Bytes, str8_lit(\"e\"));\n    COFF_ObjSection *sect_align_4 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4Bytes, str8_lit(\"ttttt\"));\n    COFF_ObjSection *sect_align_8 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8Bytes, str8_lit(\"g\"));\n    COFF_ObjSection *sect_align_16 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align16Bytes, str8_lit(\"o\"));\n    COFF_ObjSection *sect_align_32 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align32Bytes, str8_lit(\"p\"));\n    COFF_ObjSection *sect_align_64 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align64Bytes, str8_lit(\"f\"));\n    COFF_ObjSection *sect_align_128 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align128Bytes, str8_lit(\"x\"));\n    COFF_ObjSection *sect_align_256 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align256Bytes, str8_lit(\"c\"));\n    COFF_ObjSection *sect_align_512 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align512Bytes, str8_lit(\"v\"));\n    COFF_ObjSection *sect_align_1024 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align1024Bytes, str8_lit(\"b\"));\n    COFF_ObjSection *sect_align_2048 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align2048Bytes, str8_lit(\"n\"));\n    COFF_ObjSection *sect_align_4096 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align4096Bytes, str8_lit(\"m\"));\n    COFF_ObjSection *sect_align_8192 = coff_obj_writer_push_section(obj_writer, str8_lit(\".a\"), PE_DATA_SECTION_FLAGS|COFF_SectionFlag_Align8192Bytes, str8_lit(\"z\"));\n\n    U8 text[] = { 0xC3 };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"my_entry\"), 0, text_sect);\n\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"test.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:my_entry /out:a.exe /align:8192 test.obj\");\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  COFF_SectionHeader *sect = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".a\"));\n  if (!sect) {\n    goto exit;\n  }\n  String8 sect_data = str8_substr(exe, rng_1u64(sect->foff, sect->foff + sect->vsize));\n\n  String8 shift = str8_substr(sect_data, rng_1u64(0, 1));\n  if (!str8_match(shift, str8_lit(\"q\"), 0)) {\n    goto exit;\n  }\n  String8 a_none = str8_substr(sect_data, rng_1u64(16, 16 + 3));\n  if (!str8_match(a_none, str8_lit(\"abc\"), 0)) {\n    goto exit;\n  }\n  String8 a_1 = str8_substr(sect_data, rng_1u64(19, 21));\n  if (!str8_match(a_1, str8_lit(\"wr\"), 0)) {\n    goto exit;\n  }\n  String8 a_2 = str8_substr(sect_data, rng_1u64(22, 23));\n  if (!str8_match(a_2, str8_lit(\"e\"), 0)) {\n    goto exit;\n  }\n  String8 a_4 = str8_substr(sect_data, rng_1u64(24, 29));\n  if (!str8_match(a_4, str8_lit(\"ttttt\"), 0)) {\n    goto exit;\n  }\n  String8 a_8 = str8_substr(sect_data, rng_1u64(32, 33));\n  if (!str8_match(a_8, str8_lit(\"g\"), 0)) {\n    goto exit;\n  }\n  String8 a_16 = str8_substr(sect_data, rng_1u64(48, 49));\n  if (!str8_match(a_16, str8_lit(\"o\"), 0)) {\n    goto exit;\n  }\n  String8 a_32 = str8_substr(sect_data, rng_1u64(64, 65));\n  if (!str8_match(a_32, str8_lit(\"p\"), 0)) {\n    goto exit;\n  }\n  String8 a_64 = str8_substr(sect_data, rng_1u64(128, 129));\n  if (!str8_match(a_64, str8_lit(\"f\"), 0)) {\n    goto exit;\n  }\n  String8 a_128 = str8_substr(sect_data, rng_1u64(256, 257));\n  if (!str8_match(a_128, str8_lit(\"x\"), 0)) {\n    goto exit;\n  }\n  String8 a_256 = str8_substr(sect_data, rng_1u64(512, 513));\n  if (!str8_match(a_256, str8_lit(\"c\"), 0)) {\n    goto exit;\n  }\n  String8 a_512 = str8_substr(sect_data, rng_1u64(1024, 1025));\n  if (!str8_match(a_512, str8_lit(\"v\"), 0)) {\n    goto exit;\n  }\n  String8 a_1024 = str8_substr(sect_data, rng_1u64(2048, 2049));\n  if (!str8_match(a_1024, str8_lit(\"b\"), 0)) {\n    goto exit;\n  }\n  String8 a_2048 = str8_substr(sect_data, rng_1u64(4096, 4097));\n  if (!str8_match(a_2048, str8_lit(\"n\"), 0)) {\n    goto exit;\n  }\n  String8 a_4096 = str8_substr(sect_data, rng_1u64(8192, 8193));\n  if (!str8_match(a_4096, str8_lit(\"m\"), 0)) {\n    goto exit;\n  }\n  String8 a_8192 = str8_substr(sect_data, rng_1u64(16384, 16385));\n  if (!str8_match(a_8192, str8_lit(\"z\"), 0)) {\n    goto exit;\n  }\n\n  result = T_Result_Pass;\n\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_alt_name(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit(\"test\"));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"test\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"test.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit(\"foo\"));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"foo\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"foo.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"foo\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code;\n\n  // basic alternate name test\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test test.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  // linker should not chase alt name links\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:b.exe /alternatename:foo=bar /alternatename:bar=test test.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // alt name conflict\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:c.exe /alternatename:foo=test /alternatename:foo=qwe test.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // syntax error\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:d.exe /alternatename:foo foo.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n  \n  // syntax error\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:e.exe /alternatename:foo-oof foo.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // syntax error\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /alternatename:foo=test=bar foo.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // syntax error\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /alternatename:foo= foo.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // syntax error\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /alternatename:= foo.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // syntax error\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /alternatename: foo.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  // TODO: check that RAD Linker prints these warnings\n\n  // warn about alt name to self alt name?\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:f.exe /alternatename:foo=foo foo.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  // warn about alt name to unknown symbol?\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:g.exe /alternatename:qwe=ewq foo.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_include(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit(\"foo\"));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"foo\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"include.obj\"), obj)) { goto exit; }\n\n    COFF_LibWriter *lib_writer = coff_lib_writer_alloc();\n    coff_lib_writer_push_obj(lib_writer, str8_lit(\"include.obj\"), obj);\n    String8 lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1);\n    coff_lib_writer_release(&lib_writer);\n    if (!t_write_file(str8_lit(\"include.lib\"), lib)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code;\n\n  // simple include test\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /include:foo entry.obj include.lib\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  // validate that linker pulled-in include.obj\n  {\n    String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *foo_sect      = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n    if (foo_sect == 0) { goto exit; }\n    String8             foo_data      = str8_substr(exe, rng_1u64(foo_sect->foff, foo_sect->foff + foo_sect->vsize));\n    if (!str8_match(foo_data, str8_lit(\"foo\"), 0)) { goto exit; }\n  }\n\n  // test unresolved include\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /include:ewq entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n  if (t_ident_linker() == T_Linker_RAD && linker_exit_code != LNK_Error_UnresolvedSymbol) { goto exit; }\n\n  result = T_Result_Pass;\n  exit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_communal_var_vs_regular(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_common(obj_writer, str8_lit(\"TEST\"), 1);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"communal.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit(\"test\"));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"defn.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  // linker should replace communal TEST with .data TEST\n  int linker_exit_code;\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe communal.obj defn.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:b.exe defn.obj communal.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  char *exes[] = { \"a.exe\", \"b.exe\" };\n  for (U64 i = 0; i < ArrayCount(exes); i += 1) {\n    String8             exe           = t_read_file(scratch.arena, str8_cstring(exes[i]));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *data_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n    if (!data_sect) { goto exit; }\n    String8             data          = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->vsize));\n    if (!str8_match(data, str8_lit(\"test\"), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_communal_var_vs_regular_comdat(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_common(obj_writer, str8_lit(\"TEST\"), 1);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"communal.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *sect = t_push_data_section(obj_writer, str8_lit(\"test\"));\n    sect->flags |= COFF_SectionFlag_LnkCOMDAT;\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"large.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    COFF_ObjSymbol *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) {\n      goto exit;\n    }\n  }\n\n  // linker should replace communal TEST with .data TEST\n  int linker_exit_code;\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe communal.obj large.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:b.exe large.obj communal.obj entry.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  char *exes[] = { \"a.exe\", \"b.exe\" };\n  for (U64 i = 0; i < ArrayCount(exes); i += 1) {\n    String8             exe           = t_read_file(scratch.arena, str8_cstring(exes[i]));\n    PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n    COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n    String8             string_table  = str8_substr(exe, pe.string_table_range);\n    COFF_SectionHeader *data_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".data\"));\n    if (!data_sect) { goto exit; }\n    String8             data          = str8_substr(exe, rng_1u64(data_sect->foff, data_sect->foff + data_sect->vsize));\n    if (!str8_match(data, str8_lit(\"test\"), 0)) { goto exit; }\n  }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_import_kernel32(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 data[] = \"test\";\n    U8 text[] = {\n      0x48, 0x83, 0xec, 0x68,                               // sub  rsp,68h                        ; alloc space on stack\n      0xc7, 0x44, 0x24, 0x48, 0x18, 0x00, 0x00, 0x00,       // mov  dword ptr [rsp+48h],18h        ; SECURITY_ATTRIBUTES.nLength\n      0x48, 0xc7, 0x44, 0x24, 0x50, 0x00, 0x00, 0x00, 0x00, // mov  qword ptr [rsp+50h],0          ; SECURITY_ATTRIBUTES.lpSecurityDescriptor\n      0xc7, 0x44, 0x24, 0x58, 0x00, 0x00, 0x00, 0x00,       // mov  dword ptr [rsp+58h],0          ; SECURITY_ATTRIBUTES.bInheritHandle\n      0x48, 0xc7, 0x44, 0x24, 0x30, 0x00, 0x00, 0x00, 0x00, // mov  qword ptr [rsp+30h],0          ; hTemplateFile\n      0xc7, 0x44, 0x24, 0x28, 0x80, 0x00, 0x00, 0x00,       // mov  dword ptr [rsp+28h],80h        ; dwFlagsAndAttributes\n      0xc7, 0x44, 0x24, 0x20, 0x02, 0x00, 0x00, 0x00,       // mov  dword ptr [rsp+20h],2          ; dwCreationDisposition\n      0x4c, 0x8d, 0x4c, 0x24, 0x48,                         // lea  r9,[rsp+48h]                   ; lpSecurityAttributes\n      0x45, 0x33, 0xc0,                                     // xor  r8d,r8d                        ; dwShareMode\n      0xba, 0x00, 0x00, 0x00, 0x40,                         // mov  edx,40000000h                  ; dwDesiredAccess\n      0x48, 0x8d, 0x0d, 0x00, 0x00, 0x00, 0x00,             // lea  rcx,[test]                     ; lpFileName\n      0xff, 0x15, 0x00, 0x00, 0x00, 0x00,                   // call qword ptr [__imp_CreateFileA]  ; call CreateFileA\n      0x48, 0x89, 0xc1,                                     // mov  rcx,rax                        ; hObject\n      0xff, 0x15, 0x00, 0x00, 0x00, 0x00,                   // call qword ptr [__imp_CloseHandle]  ; call CloseHandle\n      0x33, 0xc0,                                           // xor  eax,eax                        ; clear result\n      0x48, 0x83, 0xc4, 0x68,                               // add  rsp,68h                        ; dealloc stack\n      0xc3                                                  // ret                                 ; return\n    };\n    COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".data\"), PE_DATA_SECTION_FLAGS, str8_array_fixed(data));\n    COFF_ObjSection *text_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    COFF_ObjSymbol *data_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"test\"), 0, data_sect);\n    COFF_ObjSymbol *entry_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n    COFF_ObjSymbol *create_file_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"__imp_CreateFileA\"));\n    COFF_ObjSymbol *close_handle_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"__imp_CloseHandle\"));\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 70, data_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 76, create_file_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 85, close_handle_symbol, COFF_Reloc_X64_Rel32);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"import.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /fixed import.obj kernel32.lib\");\n  if (linker_exit_code != 0) { goto exit; }\n\n#if OS_WINDOWS\n  {\n    String8 test_file_path = push_str8f(scratch.arena, \"%S/test\", g_wdir);\n    os_delete_file_at_path(test_file_path);\n\n    OS_ProcessLaunchParams launch_opts = {0};\n    launch_opts.inherit_env = 0;\n    launch_opts.path = g_wdir;\n    str8_list_pushf(scratch.arena, &launch_opts.cmd_line, \"%S/a.exe\", g_wdir);\n    OS_Handle handle = os_process_launch(&launch_opts);\n    AssertAlways(!os_handle_match(handle, os_handle_zero()));\n    U64 exit_code = max_U64;\n    os_process_join(handle, max_U64, &exit_code);\n    os_process_detach(handle);\n    if (exit_code != 0) { goto exit; }\n\n    if (!os_file_path_exists(test_file_path)) { goto exit; }\n  }\n#endif\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_delay_import(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 return_0[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0\n      0xc3 // ret\n    };\n    U8 return_1[] = {\n      0x48, 0xC7, 0xC0, 0x01, 0x00, 0x00, 0x00, // mov rax, 1\n      0xc3 // ret\n    };\n    U8 return_2[] = {\n      0x48, 0xC7, 0xC0, 0x02, 0x00, 0x00, 0x00, // mov rax, 2\n      0xc3 // ret\n    };\n    COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0));\n    COFF_ObjSection *return_1_sect = t_push_text_section(obj_writer, str8_array_fixed(return_1));\n    COFF_ObjSection *return_2_sect = t_push_text_section(obj_writer, str8_array_fixed(return_2));\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"return_1\"), 0, return_1_sect);\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"return_2\"), 0, return_2_sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"a.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 return_0[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00, // mov rax, 0\n      0xc3 // ret\n    };\n    U8 return_123[] = {\n      0x48, 0xC7, 0xC0, 0x7B, 0x00, 0x00, 0x00, // mov rax, 123\n      0xc3 // ret\n    };\n    U8 return_321[] = {\n      0x48, 0xC7, 0xC0, 0x41, 0x01, 0x00, 0x00, // mov rax, 321 \n      0xc3 // ret\n    };\n    COFF_ObjSection *return_0_sect = t_push_text_section(obj_writer, str8_array_fixed(return_0));\n    COFF_ObjSection *return_123_sect = t_push_text_section(obj_writer, str8_array_fixed(return_123));\n    COFF_ObjSection *return_321_sect = t_push_text_section(obj_writer, str8_array_fixed(return_321));\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"return_123\"), 0, return_123_sect);\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"return_321\"), 0, return_321_sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"b.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    U8 text[] = {\n      0x56,                         // push  rsi\n      0x57,                         // push  rdi\n      0x48, 0x83, 0xEC, 0x28,       // sub   rsp,28h\n      0xE8, 0x00, 0x00, 0x00, 0x00, // call  return_1\n      0x89, 0xC6,                   // mov   esi,eax\n      0xE8, 0x00, 0x00, 0x00, 0x00, // call  return_2\n      0x89, 0xC7,                   // mov   edi,eax\n      0x01, 0xF7,                   // add   edi,esi\n      0xE8, 0x00, 0x00, 0x00, 0x00, // call  return_123\n      0x89, 0xC6,                   // mov   esi,eax\n      0xE8, 0x00, 0x00, 0x00, 0x00, // call  return_321\n      0x01, 0xF0,                   // add   eax,esi\n      0x01, 0xF8,                   // add   eax,edi\n      0x48, 0x83, 0xC4, 0x28,       // add   rsp,28h\n      0x5F,                         // pop   rdi\n      0x5E,                         // pop   rsi\n      0xC3,                         // ret\n    };\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0,COFF_MachineType_X64);\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n    COFF_ObjSymbol *return_1_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"return_1\"));\n    COFF_ObjSymbol *return_2_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"return_2\"));\n    COFF_ObjSymbol *return_123_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"return_123\"));\n    COFF_ObjSymbol *return_321_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"return_321\"));\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 7, return_1_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 14, return_2_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 23, return_123_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 30, return_321_symbol, COFF_Reloc_X64_Rel32);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"main.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code;\n\n  linker_exit_code = t_invoke_linkerf(\"/dll /implib:a.lib /export:return_1 /export:return_2 a.obj libcmt.lib\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  linker_exit_code = t_invoke_linkerf(\"/dll /implib:b.lib /export:return_123 /export:return_321 b.obj libcmt.lib\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe /fixed /debug:full main.obj a.lib b.lib kernel32.lib delayimp.lib libcmt.lib /delayload:a.dll /delayload:b.dll\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n\n  PE_ParsedDelayImportTable delay_import_table = pe_delay_imports_from_data(scratch.arena, pe.is_pe32, pe.section_count, section_table, exe, pe.data_dir_franges[PE_DataDirectoryIndex_DELAY_IMPORT]);\n\n  PE_ParsedDelayDLLImport *a_import = &delay_import_table.v[0];\n  if (a_import->attributes != 1)                         { goto exit; }\n  if (!str8_match(a_import->name, str8_lit(\"a.dll\"), 0)) { goto exit; }\n  if (a_import->module_handle_voff == 0)                 { goto exit; }\n  if (a_import->name_table_voff == 0)                    { goto exit; }\n  if (a_import->bound_table_voff != 0)                   { goto exit; }\n  if (a_import->unload_table_voff != 0)                  { goto exit; }\n  if (a_import->time_stamp != 0)                         { goto exit; }\n  if (a_import->bound_table_count != 0)                  { goto exit; }\n  if (a_import->unload_table_count != 0)                 { goto exit; }\n  if (a_import->import_count != 2)                       { goto exit; }\n\n  PE_ParsedImport *return_1 = &a_import->imports[0];\n  if (return_1->type != PE_ParsedImport_Name)                        { goto exit; }\n  if (!str8_match(return_1->u.name.string, str8_lit(\"return_1\"), 0)) { goto exit; }\n  if (return_1->u.name.hint != 0)                                    { goto exit; }\n\n  PE_ParsedImport *return_2 = &a_import->imports[1];\n  if (return_2->type != PE_ParsedImport_Name)                        { goto exit; }\n  if (!str8_match(return_2->u.name.string, str8_lit(\"return_2\"), 0)) { goto exit; }\n  if (return_2->u.name.hint != 1)                                    { goto exit; }\n\n  PE_ParsedDelayDLLImport *b_import = &delay_import_table.v[1];\n  if (b_import->attributes != 1)                         { goto exit; }\n  if (!str8_match(b_import->name, str8_lit(\"b.dll\"), 0)) { goto exit; }\n  if (b_import->module_handle_voff == 0)                 { goto exit; }\n  if (b_import->name_table_voff == 0)                    { goto exit; }\n  if (b_import->bound_table_voff != 0)                   { goto exit; }\n  if (b_import->unload_table_voff != 0)                  { goto exit; }\n  if (b_import->time_stamp != 0)                         { goto exit; }\n  if (b_import->bound_table_count != 0)                  { goto exit; }\n  if (b_import->unload_table_count != 0)                 { goto exit; }\n  if (b_import->import_count != 2)                       { goto exit; }\n\n  PE_ParsedImport *return_123 = &b_import->imports[0];\n  if (return_123->type != PE_ParsedImport_Name)                          { goto exit; }\n  if (!str8_match(return_123->u.name.string, str8_lit(\"return_123\"), 0)) { goto exit; }\n  if (return_123->u.name.hint != 0)                                      { goto exit; }\n\n  PE_ParsedImport *return_321 = &b_import->imports[1];\n  if (return_321->type != PE_ParsedImport_Name)                          { goto exit; }\n  if (!str8_match(return_321->u.name.string, str8_lit(\"return_321\"), 0)) { goto exit; }\n  if (return_321->u.name.hint != 1)                                      { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_delay_import_user32(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *data_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".str\"), PE_DATA_SECTION_FLAGS, str8_zero());\n    U64 msg_off = data_sect->data.total_size;\n    str8_list_pushf(obj_writer->arena, &data_sect->data, \"test\\0\");\n    U64 caption_off = data_sect->data.total_size;\n    str8_list_pushf(obj_writer->arena, &data_sect->data, \"foo\\0\");\n    COFF_ObjSymbol *msg_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"msg\"), msg_off, data_sect);\n    COFF_ObjSymbol *caption_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"caption\"), caption_off, data_sect);\n\n    U8 text[] = {\n      0x48, 0x83, 0xEC, 0x28,                   // sub  rsp,28h\n      0x45, 0x33, 0xC9,                         // xor  r9d,r9d\n      0x4C, 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00, // lea  r8,[msg]\n      0x48, 0x8D, 0x15, 0x00, 0x00, 0x00, 0x00, // lea  rdx,[caption]\n      0x33, 0xC9,                               // xor  ecx,ecx\n      0xFF, 0x15, 0x00, 0x00, 0x00, 0x00,       // call qword ptr [__imp_MessageBoxA]\n      0x33, 0xC0,                               // xor  eax,eax\n      0x48, 0x83, 0xC4, 0x28,                   // add  rsp,28h\n      0xC3,                                     // ret\n    };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    COFF_ObjSymbol *text_symbol = coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n    COFF_ObjSymbol *message_box_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"__imp_MessageBoxA\"));\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 10, msg_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 17, caption_symbol, COFF_Reloc_X64_Rel32);\n    coff_obj_writer_section_push_reloc(obj_writer, text_sect, 25, message_box_symbol, COFF_Reloc_X64_Rel32);\n\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"delay_import.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /out:a.exe /entry:entry /fixed /delayload:user32.dll kernel32.lib user32.lib libcmt.lib delayimp.lib delay_import.obj /debug:full\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n scratch_end(scratch);\n return result;\n}\n\ninternal T_Result\nt_empty_section(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    COFF_ObjSection *test = coff_obj_writer_push_section(obj_writer, str8_lit(\".test\"), PE_TEXT_SECTION_FLAGS, str8(0,0));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, test);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"empty_section.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe empty_section.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_removed_section(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 test_text[] = { 0xc3 };\n    COFF_ObjSection *test_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".test\"), PE_TEXT_SECTION_FLAGS | COFF_SectionFlag_LnkRemove, str8_array_fixed(test_text));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"TEST\"), 0, test_sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"test.obj\"), obj)) { goto exit; }\n  }\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *text_sect = t_push_text_section(obj_writer, str8_array_fixed(text));\n    COFF_ObjSymbol *test_symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"TEST\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, text_sect, 3, test_symbol); // relocation against removed section\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, text_sect);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"entry.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe test.obj entry.obj\");\n  if (linker_exit_code == 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_function_pad_min(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 ret[] = { 0xc3 };\n    COFF_ObjSection *text_sect_0 = t_push_text_section(obj_writer, str8_array_fixed(ret));\n    COFF_ObjSection *text_sect_1 = t_push_text_section(obj_writer, str8_array_fixed(ret));\n    COFF_ObjSection *text_sect_2 = t_push_text_section(obj_writer, str8_array_fixed(ret));\n    text_sect_0->flags |= COFF_SectionFlag_Align4Bytes;\n    text_sect_1->flags |= COFF_SectionFlag_Align2Bytes;\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"A\"), 0, text_sect_0);\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"B\"), 0, text_sect_1);\n    coff_obj_writer_push_symbol_extern_func(obj_writer, str8_lit(\"C\"), 0, text_sect_2);\n    String8 obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n    if (!t_write_file(str8_lit(\"funcs.obj\"), obj)) { goto exit; }\n  }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:A /functionpadmin:1 /out:a.exe funcs.obj\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *text_sect     = t_coff_section_header_from_name(string_table, section_table, pe.section_count, str8_lit(\".text\"));\n  if (text_sect == 0) { goto exit; }\n  String8             text_data     = str8_substr(exe, rng_1u64(text_sect->foff, text_sect->foff + text_sect->vsize));\n\n  U8 expected_text[] = {\n    0xcc, 0xcc, 0xcc, 0xcc, 0xc3, \n    0xcc, 0xcc, 0xcc, 0xc3, \n    0xcc, 0xc3, \n  };\n  if (!str8_match(text_data, str8_array_fixed(expected_text), 0)) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_first_member_header(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"8\"), 0x8, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"1\"), 0x1, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"9\"), 0x9, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"7\"), 0x7, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"4\"), 0x4, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"5\"), 0x5, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"2\"), 0x2, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"3\"), 0x3, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"6\"), 0x6, COFF_SymStorageClass_External);\n    obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 lib;\n  {\n    COFF_LibWriter *lib_writer = coff_lib_writer_alloc();\n    coff_lib_writer_push_obj(lib_writer, str8_lit(\"obj.obj\"), obj);\n    lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 0);\n    coff_lib_writer_release(&lib_writer);\n  }\n\n  t_write_file(str8_lit(\"test.lib\"), lib);\n  t_write_entry_obj();\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9\");\n  if (linker_exit_code != 0) goto exit;\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_second_member_header(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"8\"), 0x8, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"1\"), 0x1, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"9\"), 0x9, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"7\"), 0x7, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"4\"), 0x4, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"5\"), 0x5, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"2\"), 0x2, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"3\"), 0x3, COFF_SymStorageClass_External);\n    coff_obj_writer_push_symbol_abs(obj_writer, str8_lit(\"6\"), 0x6, COFF_SymStorageClass_External);\n    obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 lib;\n  {\n    COFF_LibWriter *lib_writer = coff_lib_writer_alloc();\n    coff_lib_writer_push_obj(lib_writer, str8_lit(\"obj.obj\"), obj);\n    lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1);\n    coff_lib_writer_release(&lib_writer);\n  }\n\n  t_write_file(str8_lit(\"test.lib\"), lib);\n  t_write_entry_obj();\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe test.lib entry.obj /include:1 /include:2 /include:3 /include:4 /include:5 /include:6 /include:7 /include:8 /include:9\");\n  if (linker_exit_code != 0) goto exit;\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\ninternal T_Result\nt_opt_ref_dangling_section(void)\n{\n  Temp scratch = scratch_begin(0,0);\n  T_Result result = T_Result_Fail;\n\n  String8 entry_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n    U8 text[] = {\n      0x48, 0xC7, 0xC0, 0x00, 0x00, 0x00, 0x00,  // mov rax, $imm\n      0xC3 // ret\n    };\n    COFF_ObjSection *sect   = coff_obj_writer_push_section(obj_writer, str8_lit(\".text\"), PE_TEXT_SECTION_FLAGS, str8_array_fixed(text));\n    COFF_ObjSymbol  *symbol = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"f\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, symbol);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"entry\"), 0, sect);\n    entry_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 a_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    U8 data[] = \"A0000\";\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".data\"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data));\n\n    COFF_ObjSymbol *q = coff_obj_writer_push_symbol_undef(obj_writer, str8_lit(\"q\"));\n    coff_obj_writer_section_push_reloc_voff(obj_writer, sect, 0, q);\n\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"f\"), 0, sect);\n    a_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 b_obj;\n  {\n    COFF_ObjWriter *obj_writer = coff_obj_writer_alloc(0, COFF_MachineType_X64);\n\n    U8 q[] = { 1,2,3,4};\n    COFF_ObjSection *q_sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".q\"), PE_DATA_SECTION_FLAGS, str8_array_fixed(q));\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"q\"), 0, q_sect);\n\n    U8 data[] = \"BBBBBBBBBBBBBBB\";\n    COFF_ObjSection *sect = coff_obj_writer_push_section(obj_writer, str8_lit(\".data\"), PE_DATA_SECTION_FLAGS | COFF_SectionFlag_LnkCOMDAT, str8_array_fixed(data));\n    coff_obj_writer_push_symbol_secdef(obj_writer, sect, COFF_ComdatSelect_Largest);\n    coff_obj_writer_push_symbol_extern(obj_writer, str8_lit(\"f\"), 0, sect);\n\n    b_obj = coff_obj_writer_serialize(scratch.arena, obj_writer);\n    coff_obj_writer_release(&obj_writer);\n  }\n\n  String8 b_lib;\n  {\n    COFF_LibWriter *lib_writer = coff_lib_writer_alloc();\n    coff_lib_writer_push_obj(lib_writer, str8_lit(\"b.obj\"), b_obj);\n    b_lib = coff_lib_writer_serialize(scratch.arena, lib_writer, 0, 0, 1);\n    coff_lib_writer_release(&lib_writer);\n  }\n\n  if (!t_write_file(str8_lit(\"entry.obj\"), entry_obj)) { goto exit; }\n  if (!t_write_file(str8_lit(\"a.obj\"), a_obj))         { goto exit; }\n  if (!t_write_file(str8_lit(\"b.lib\"), b_lib))         { goto exit; }\n\n  int linker_exit_code = t_invoke_linkerf(\"/subsystem:console /entry:entry /out:a.exe entry.obj a.obj b.lib\");\n  if (linker_exit_code != 0) { goto exit; }\n\n  String8             exe           = t_read_file(scratch.arena, str8_lit(\"a.exe\"));\n  PE_BinInfo          pe            = pe_bin_info_from_data(scratch.arena, exe);\n  COFF_SectionHeader *section_table = (COFF_SectionHeader *)str8_substr(exe, pe.section_table_range).str;\n  String8             string_table  = str8_substr(exe, pe.string_table_range);\n  COFF_SectionHeader *sect          = t_coff_section_header_from_name(exe, section_table, pe.section_count, str8_lit(\".q\"));\n  if (sect != 0) { goto exit; }\n\n  result = T_Result_Pass;\nexit:;\n  scratch_end(scratch);\n  return result;\n}\n\n////////////////////////////////////////////////////////////////\n\ninternal void\nentry_point(CmdLine *cmdline)\n{\n  Temp scratch = scratch_begin(0,0);\n\n  //\n  // Test Targets\n  //\n  static struct {\n    char *label; T_Result (*r)(void);\n  } target_array[] = {\n    { \"simple_link_test\",                  t_simple_link_test                  },\n    { \"machine_compat_check\",              t_machine_compat_check              },\n    { \"out_of_bounds_section_number\",      t_out_of_bounds_section_number      },\n    { \"merge\",                             t_merge                             },\n    { \"undef_section\",                     t_undef_section                     },\n    { \"undef_reloc_section\",               t_undef_reloc_section               },\n    { \"link_undef\",                        t_link_undef                        },\n    { \"link_unref_undef\",                  t_link_unref_undef                  },\n    { \"weak_lib_vs_weak_lib\",              t_weak_lib_vs_weak_lib              },\n    { \"weak_lib_vs_weak_nolib\",            t_weak_lib_vs_weak_nolib            },\n    { \"weak_lib_vs_weak_alias\",            t_weak_lib_vs_weak_alias            },\n    { \"weak_lib_vs_weak_antidep\",          t_weak_lib_vs_weak_antidep          },\n    { \"weak_alias_vs_weak_alias\",          t_weak_alias_vs_weak_alias          },\n    { \"weak_alias_vs_weak_lib\",            t_weak_alias_vs_weak_lib            },\n    { \"weak_alias_vs_weak_nolib\",          t_weak_alias_vs_weak_nolib          },\n    { \"weak_alias_vs_weak_antidep\",        t_weak_alias_vs_weak_antidep        },\n    { \"weak_nolib_vs_weak_nolib\",          t_weak_nolib_vs_weak_nolib          },\n    { \"weak_nolib_vs_weak_lib\",            t_weak_nolib_vs_weak_lib            },\n    { \"weak_nolib_vs_weak_alias\",          t_weak_nolib_vs_weak_alias          },\n    { \"weak_nolib_vs_weak_antidep\",        t_weak_nolib_vs_weak_antidep        },\n    { \"weak_antidep_vs_weak_antidep\",      t_weak_antidep_vs_weak_antidep      },\n    { \"weak_antidep_vs_weak_nolib\",        t_weak_antidep_vs_weak_nolib        },\n    { \"weak_antidep_vs_weak_lib\",          t_weak_antidep_vs_weak_lib          },\n    { \"weak_antidep_vs_weak_alias\",        t_weak_antidep_vs_weak_alias        },\n    { \"weak_vs_common\",                    t_weak_vs_common                    },\n    { \"abs_vs_weak\",                       t_abs_vs_weak                       },\n    { \"abs_vs_regular\",                    t_abs_vs_regular                    },\n    { \"abs_vs_common\",                     t_abs_vs_common                     },\n    { \"abs_vs_abs\",                        t_abs_vs_abs                        },\n    { \"undef_weak_lib\",                    t_undef_weak_lib                    },\n    { \"undef_weak_search_alias\",           t_undef_weak_search_alias           },\n    { \"sect_symbol\",                       t_sect_symbol                       },\n    { \"weak_cycle\",                        t_weak_cycle                        },\n    { \"weak_tag\",                          t_weak_tag                          },\n    { \"find_merged_pdata\",                 t_find_merged_pdata                 },\n    { \"section_sort\",                      t_section_sort                      },\n    { \"flag_conf\",                         t_flag_conf                         },\n    { \"invalid_bss\",                       t_invalid_bss                       },\n    { \"common_block\",                      t_common_block                      },\n    { \"base_relocs\",                       t_base_relocs                       },\n    { \"simple_lib_test\",                   t_simple_lib_test                   },\n    { \"sect_align\",                        t_sect_align                        },\n    { \"image_base\",                        t_image_base                        },\n    { \"comdat_any\",                        t_comdat_any                        },\n    { \"comdat_no_duplicates\",              t_comdat_no_duplicates              },\n    { \"comdat_same_size\",                  t_comdat_same_size                  },\n    { \"comdat_exact_match\",                t_comdat_exact_match                },\n    { \"comdat_largest\",                    t_comdat_largest                    },\n    { \"comdat_associative\",                t_comdat_associative                },\n    { \"comdat_associative_loop\",           t_comdat_associative_loop           },\n    { \"comdat_associative_non_comdat\",     t_comdat_associative_non_comdat     },\n    { \"comdat_associative_out_of_bounds\",  t_comdat_associative_out_of_bounds  },\n    { \"comdat_with_offset\",                t_comdat_with_offset                },\n    { \"reloc_against_removed_comdat\",      t_reloc_against_removed_comdat      },\n    { \"alt_name\",                          t_alt_name                          },\n    { \"include\",                           t_include                           },\n    { \"communal_var_vs_regular_comdat\",    t_communal_var_vs_regular_comdat    },\n    { \"communal_var_vs_regular\",           t_communal_var_vs_regular           },\n    { \"import_kernel32\",                   t_import_kernel32                   },\n    { \"delay_import_user32\",               t_delay_import_user32               },\n    { \"delay_import\",                      t_delay_import                      },\n    { \"empty_section\",                     t_empty_section                     },\n    { \"removed_section\",                   t_removed_section                   },\n    { \"function_pad_min\",                  t_function_pad_min                  },\n    { \"first_member_header\",               t_first_member_header               },\n    { \"second_member_header\",              t_second_member_header              },\n  };\n\n  //\n  // Handle -help\n  //\n  {\n    B32 print_help = cmd_line_has_flag(cmdline, str8_lit(\"help\")) ||\n                     cmd_line_has_flag(cmdline, str8_lit(\"h\"));\n     if (print_help) {\n      fprintf(stderr, \"--- Help -----------------------------------------------------------------------\\n\");\n      fprintf(stderr, \" %s\\n\\n\", BUILD_TITLE_STRING_LITERAL);\n      fprintf(stderr, \" Usage: torture [Options] [Files]\\n\\n\");\n      fprintf(stderr, \" Options:\\n\");\n      fprintf(stderr, \"   -linker:{path}        Path to PE/COFF linker\\n\");\n      fprintf(stderr, \"   -target:{name[,name]} Selects targets to test\\n\");\n      fprintf(stderr, \"   -list                 Print available test targets and exit\\n\");\n      fprintf(stderr, \"   -out:{path}           Directory path for test outputs (default \\\"%.*s\\\")\\n\", str8_varg(g_out));\n      fprintf(stderr, \"   -verbose              Enable verbose mode\\n\");\n      fprintf(stderr, \"   -print_stdout         Print to console stdout and stderr of a run\\n\");\n      fprintf(stderr, \"   -help                 Print help menu and exit\\n\");\n      os_abort(0);\n    }\n  }\n\n  //\n  // Handle -list\n  //\n  {\n    if (cmd_line_has_flag(cmdline, str8_lit(\"list\"))) {\n      fprintf(stdout, \"--- Targets --------------------------------------------------------------------\\n\");\n      for (U64 i = 0; i < ArrayCount(target_array); i += 1) {\n        fprintf(stdout, \"  %s\\n\", target_array[i].label);\n      }\n      os_abort(0);\n    }\n  }\n\n\n  //\n  // Handle -linker\n  //\n  {\n    CmdLineOpt *linker_opt = cmd_line_opt_from_string(cmdline, str8_lit(\"linker\"));\n    if (linker_opt == 0) {\n      linker_opt = cmd_line_opt_from_string(cmdline, str8_lit(\"l\"));\n    }\n    if (linker_opt) {\n      if (linker_opt->value_strings.node_count == 1) {\n        g_linker = linker_opt->value_string;\n      } else {\n        fprintf(stderr, \"ERROR: -linker has invalid number of arguments\\n\");\n        os_abort(1);\n      }\n    } else {\n      // assume default linker\n      g_linker = str8_lit(\"radlink\");\n    }\n  }\n\n  //\n  // Handle optional -target\n  //\n  String8List target = cmdline->inputs;\n  {\n    CmdLineOpt *target_opt = cmd_line_opt_from_string(cmdline, str8_lit(\"target\"));\n    if (target_opt == 0) {\n      target_opt = cmd_line_opt_from_string(cmdline, str8_lit(\"t\"));\n    }\n    if (target_opt) {\n      if (target_opt->value_strings.node_count > 0) {\n        str8_list_concat_in_place(&target, &target_opt->value_strings);\n      } else {\n        fprintf(stderr, \"ERROR: -target has invalid number of arguments\\n\");\n      }\n    }\n  }\n\n  //\n  // Handle -out\n  //\n  {\n    CmdLineOpt *out_opt = cmd_line_opt_from_string(cmdline, str8_lit(\"out\"));\n    if (out_opt) {\n      if (out_opt->value_strings.node_count == 1) {\n        g_out = out_opt->value_string;\n      } else {\n        fprintf(stderr, \"ERROR: -out invalid number of arguments\");\n      }\n    }\n  }\n\n  //\n  // Handle -verbose\n  //\n  {\n    g_verbose = cmd_line_has_flag(cmdline, str8_lit(\"verbose\"));\n  }\n\n  //\n  // Handle -print_stdout\n  //\n  {\n    g_redirect_stdout = !cmd_line_has_flag(cmdline, str8_lit(\"print_stdout\"));\n  }\n\n  //\n  // Make Output Directory\n  //\n  os_make_directory(g_out);\n  if (!os_folder_path_exists(g_out)) {\n    fprintf(stderr, \"ERROR: unable to create output directory \\\"%.*s\\\"\\n\", str8_varg(g_out));\n    os_abort(1);\n  }\n\n  //\n  // Clean up output from previous run\n  //\n  os_delete_file_at_path(g_stdout_file_name);\n\n  //\n  // Run Test Targets\n  //\n  {\n    U64 max_label_size = 0;\n    for (U64 i = 0; i < ArrayCount(target_array); i += 1) { max_label_size = Max(max_label_size, cstring8_length((U8*)target_array[i].label)); }\n\n    U64 dots_min = 10;\n    U64 dots_size = max_label_size+dots_min;\n    U8 *dots      = push_array(scratch.arena, U8, dots_size);\n    MemorySet(dots, '.', dots_size);\n\n    U64  target_indices_count;\n    U64 *target_indices;\n    if (target.node_count == 0) {\n      target_indices_count = ArrayCount(target_array);\n      target_indices       = push_array(scratch.arena, U64, ArrayCount(target_array));\n      for (U64 i = 0; i < target_indices_count; i += 1) { target_indices[i] = i; }\n    } else {\n      target_indices_count = 0;\n      target_indices       = push_array(scratch.arena, U64, target.node_count);\n\n      for (String8Node *target_n = target.first; target_n != 0; target_n = target_n->next) {\n        B32 is_target_unknown = 1;\n        for (U64 i = 0; i < ArrayCount(target_array); i += 1) {\n          if (str8_match(str8_cstring(target_array[i].label), target_n->string, 0)) {\n            target_indices[target_indices_count++] = i;\n            is_target_unknown = 0;\n            break;\n          }\n        }\n        if (is_target_unknown) {\n          fprintf(stderr, \"ERROR: unknown target \\\"%.*s\\\"\\n\", str8_varg(target_n->string));\n        }\n      }\n    }\n\n    U64 pass_count  = 0;\n    U64 fail_count  = 0;\n    U64 crash_count = 0;\n    for (U64 i = 0; i < target_indices_count; i += 1) {\n      U64 target_idx = target_indices[i];\n\n      g_wdir = push_str8f(scratch.arena, \"%S\\\\%s\", g_out, target_array[target_idx].label);\n      g_wdir = os_full_path_from_path(scratch.arena, g_wdir);\n      os_make_directory(g_wdir);\n      if (!os_folder_path_exists(g_out)) {\n        fprintf(stderr, \"ERROR: unable to create output directory for test run %.*s\\n\", str8_varg(g_wdir));\n        continue;\n      }\n\n      T_Result result = t_run(target_array[target_idx].r);\n\n      U64 dots_count = (max_label_size - cstring8_length((U8*)target_array[target_idx].label)) + dots_min;\n      String8 msg = push_str8f(scratch.arena, \"%s%.*s%s\", target_array[target_idx].label, dots_count, dots, t_string_from_result(result));\n\n      // run progress\n      fprintf(stdout, \"[%2llu/%2llu] \", i+1, target_indices_count);\n\n      if (result == T_Result_Pass) {\n        fprintf(stdout, \"\\x1b[32m\" \"%.*s\" \"\\x1b[0m\" \"\\n\", str8_varg(msg));\n        pass_count += 1;\n      } else if (result == T_Result_Fail) {\n        fprintf(stdout, \"\\x1b[31m\" \"%.*s\" \"\\x1b[0m\" \"\\n\", str8_varg(msg));\n        fail_count += 1;\n      } else if (result == T_Result_Crash) {\n        fprintf(stdout, \"\\x1b[33m\" \"%.*s\" \"\\x1b[0m\" \"\\n\", str8_varg(msg));\n        crash_count += 1;\n      }\n    }\n\n    fprintf(stdout, \"--- Report ---------------------------------------------------------------------\\n\");\n    fprintf(stdout, \"  Passed:  %llu\\n\", pass_count);\n    fprintf(stdout, \"  Failed:  %llu\\n\", fail_count);\n    fprintf(stdout, \"  Crashed: %llu\\n\", crash_count);\n\n    if (fail_count + crash_count != 0) {\n      fflush(stdout);\n      os_abort(fail_count + crash_count);\n    }\n  }\n\n  scratch_end(scratch);\n}\n\n"
  },
  {
    "path": "src/ui/generated/ui.meta.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#if 0\r\n#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent())\r\n#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis())\r\n#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x())\r\n#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y())\r\n#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width())\r\n#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())\r\n#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())\r\n#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())\r\n#define UI_MinWidth(v) DeferLoop(ui_push_min_width(v), ui_pop_min_width())\r\n#define UI_MinHeight(v) DeferLoop(ui_push_min_height(v), ui_pop_min_height())\r\n#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags())\r\n#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())\r\n#define UI_OmitFlags(v) DeferLoop(ui_push_omit_flags(v), ui_pop_omit_flags())\r\n#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot())\r\n#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active())\r\n#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint())\r\n#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key())\r\n#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency())\r\n#define UI_Tag(v) DeferLoop(ui_push_tag(v), ui_pop_tag())\r\n#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color())\r\n#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color())\r\n#define UI_BorderColor(v) DeferLoop(ui_push_border_color(v), ui_pop_border_color())\r\n#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish())\r\n#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor())\r\n#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font())\r\n#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size())\r\n#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags())\r\n#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size())\r\n#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00())\r\n#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01())\r\n#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10())\r\n#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11())\r\n#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size())\r\n#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding())\r\n#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment())\r\n#endif\r\ninternal UI_Box * ui_top_parent(void) { UI_StackTopImpl(ui_state, Parent, parent) }\r\ninternal Axis2 ui_top_child_layout_axis(void) { UI_StackTopImpl(ui_state, ChildLayoutAxis, child_layout_axis) }\r\ninternal F32 ui_top_fixed_x(void) { UI_StackTopImpl(ui_state, FixedX, fixed_x) }\r\ninternal F32 ui_top_fixed_y(void) { UI_StackTopImpl(ui_state, FixedY, fixed_y) }\r\ninternal F32 ui_top_fixed_width(void) { UI_StackTopImpl(ui_state, FixedWidth, fixed_width) }\r\ninternal F32 ui_top_fixed_height(void) { UI_StackTopImpl(ui_state, FixedHeight, fixed_height) }\r\ninternal UI_Size ui_top_pref_width(void) { UI_StackTopImpl(ui_state, PrefWidth, pref_width) }\r\ninternal UI_Size ui_top_pref_height(void) { UI_StackTopImpl(ui_state, PrefHeight, pref_height) }\r\ninternal F32 ui_top_min_width(void) { UI_StackTopImpl(ui_state, MinWidth, min_width) }\r\ninternal F32 ui_top_min_height(void) { UI_StackTopImpl(ui_state, MinHeight, min_height) }\r\ninternal UI_PermissionFlags ui_top_permission_flags(void) { UI_StackTopImpl(ui_state, PermissionFlags, permission_flags) }\r\ninternal UI_BoxFlags ui_top_flags(void) { UI_StackTopImpl(ui_state, Flags, flags) }\r\ninternal UI_BoxFlags ui_top_omit_flags(void) { UI_StackTopImpl(ui_state, OmitFlags, omit_flags) }\r\ninternal UI_FocusKind ui_top_focus_hot(void) { UI_StackTopImpl(ui_state, FocusHot, focus_hot) }\r\ninternal UI_FocusKind ui_top_focus_active(void) { UI_StackTopImpl(ui_state, FocusActive, focus_active) }\r\ninternal U32 ui_top_fastpath_codepoint(void) { UI_StackTopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) }\r\ninternal UI_Key ui_top_group_key(void) { UI_StackTopImpl(ui_state, GroupKey, group_key) }\r\ninternal F32 ui_top_transparency(void) { UI_StackTopImpl(ui_state, Transparency, transparency) }\r\ninternal Vec4F32 ui_top_background_color(void) { UI_StackTopImpl(ui_state, BackgroundColor, background_color) }\r\ninternal Vec4F32 ui_top_text_color(void) { UI_StackTopImpl(ui_state, TextColor, text_color) }\r\ninternal Vec4F32 ui_top_border_color(void) { UI_StackTopImpl(ui_state, BorderColor, border_color) }\r\ninternal F32 ui_top_squish(void) { UI_StackTopImpl(ui_state, Squish, squish) }\r\ninternal OS_Cursor ui_top_hover_cursor(void) { UI_StackTopImpl(ui_state, HoverCursor, hover_cursor) }\r\ninternal FNT_Tag ui_top_font(void) { UI_StackTopImpl(ui_state, Font, font) }\r\ninternal F32 ui_top_font_size(void) { UI_StackTopImpl(ui_state, FontSize, font_size) }\r\ninternal FNT_RasterFlags ui_top_text_raster_flags(void) { UI_StackTopImpl(ui_state, TextRasterFlags, text_raster_flags) }\r\ninternal F32 ui_top_tab_size(void) { UI_StackTopImpl(ui_state, TabSize, tab_size) }\r\ninternal F32 ui_top_corner_radius_00(void) { UI_StackTopImpl(ui_state, CornerRadius00, corner_radius_00) }\r\ninternal F32 ui_top_corner_radius_01(void) { UI_StackTopImpl(ui_state, CornerRadius01, corner_radius_01) }\r\ninternal F32 ui_top_corner_radius_10(void) { UI_StackTopImpl(ui_state, CornerRadius10, corner_radius_10) }\r\ninternal F32 ui_top_corner_radius_11(void) { UI_StackTopImpl(ui_state, CornerRadius11, corner_radius_11) }\r\ninternal F32 ui_top_blur_size(void) { UI_StackTopImpl(ui_state, BlurSize, blur_size) }\r\ninternal F32 ui_top_text_padding(void) { UI_StackTopImpl(ui_state, TextPadding, text_padding) }\r\ninternal UI_TextAlign ui_top_text_alignment(void) { UI_StackTopImpl(ui_state, TextAlignment, text_alignment) }\r\ninternal UI_Box * ui_bottom_parent(void) { UI_StackBottomImpl(ui_state, Parent, parent) }\r\ninternal Axis2 ui_bottom_child_layout_axis(void) { UI_StackBottomImpl(ui_state, ChildLayoutAxis, child_layout_axis) }\r\ninternal F32 ui_bottom_fixed_x(void) { UI_StackBottomImpl(ui_state, FixedX, fixed_x) }\r\ninternal F32 ui_bottom_fixed_y(void) { UI_StackBottomImpl(ui_state, FixedY, fixed_y) }\r\ninternal F32 ui_bottom_fixed_width(void) { UI_StackBottomImpl(ui_state, FixedWidth, fixed_width) }\r\ninternal F32 ui_bottom_fixed_height(void) { UI_StackBottomImpl(ui_state, FixedHeight, fixed_height) }\r\ninternal UI_Size ui_bottom_pref_width(void) { UI_StackBottomImpl(ui_state, PrefWidth, pref_width) }\r\ninternal UI_Size ui_bottom_pref_height(void) { UI_StackBottomImpl(ui_state, PrefHeight, pref_height) }\r\ninternal F32 ui_bottom_min_width(void) { UI_StackBottomImpl(ui_state, MinWidth, min_width) }\r\ninternal F32 ui_bottom_min_height(void) { UI_StackBottomImpl(ui_state, MinHeight, min_height) }\r\ninternal UI_PermissionFlags ui_bottom_permission_flags(void) { UI_StackBottomImpl(ui_state, PermissionFlags, permission_flags) }\r\ninternal UI_BoxFlags ui_bottom_flags(void) { UI_StackBottomImpl(ui_state, Flags, flags) }\r\ninternal UI_BoxFlags ui_bottom_omit_flags(void) { UI_StackBottomImpl(ui_state, OmitFlags, omit_flags) }\r\ninternal UI_FocusKind ui_bottom_focus_hot(void) { UI_StackBottomImpl(ui_state, FocusHot, focus_hot) }\r\ninternal UI_FocusKind ui_bottom_focus_active(void) { UI_StackBottomImpl(ui_state, FocusActive, focus_active) }\r\ninternal U32 ui_bottom_fastpath_codepoint(void) { UI_StackBottomImpl(ui_state, FastpathCodepoint, fastpath_codepoint) }\r\ninternal UI_Key ui_bottom_group_key(void) { UI_StackBottomImpl(ui_state, GroupKey, group_key) }\r\ninternal F32 ui_bottom_transparency(void) { UI_StackBottomImpl(ui_state, Transparency, transparency) }\r\ninternal Vec4F32 ui_bottom_background_color(void) { UI_StackBottomImpl(ui_state, BackgroundColor, background_color) }\r\ninternal Vec4F32 ui_bottom_text_color(void) { UI_StackBottomImpl(ui_state, TextColor, text_color) }\r\ninternal Vec4F32 ui_bottom_border_color(void) { UI_StackBottomImpl(ui_state, BorderColor, border_color) }\r\ninternal F32 ui_bottom_squish(void) { UI_StackBottomImpl(ui_state, Squish, squish) }\r\ninternal OS_Cursor ui_bottom_hover_cursor(void) { UI_StackBottomImpl(ui_state, HoverCursor, hover_cursor) }\r\ninternal FNT_Tag ui_bottom_font(void) { UI_StackBottomImpl(ui_state, Font, font) }\r\ninternal F32 ui_bottom_font_size(void) { UI_StackBottomImpl(ui_state, FontSize, font_size) }\r\ninternal FNT_RasterFlags ui_bottom_text_raster_flags(void) { UI_StackBottomImpl(ui_state, TextRasterFlags, text_raster_flags) }\r\ninternal F32 ui_bottom_tab_size(void) { UI_StackBottomImpl(ui_state, TabSize, tab_size) }\r\ninternal F32 ui_bottom_corner_radius_00(void) { UI_StackBottomImpl(ui_state, CornerRadius00, corner_radius_00) }\r\ninternal F32 ui_bottom_corner_radius_01(void) { UI_StackBottomImpl(ui_state, CornerRadius01, corner_radius_01) }\r\ninternal F32 ui_bottom_corner_radius_10(void) { UI_StackBottomImpl(ui_state, CornerRadius10, corner_radius_10) }\r\ninternal F32 ui_bottom_corner_radius_11(void) { UI_StackBottomImpl(ui_state, CornerRadius11, corner_radius_11) }\r\ninternal F32 ui_bottom_blur_size(void) { UI_StackBottomImpl(ui_state, BlurSize, blur_size) }\r\ninternal F32 ui_bottom_text_padding(void) { UI_StackBottomImpl(ui_state, TextPadding, text_padding) }\r\ninternal UI_TextAlign ui_bottom_text_alignment(void) { UI_StackBottomImpl(ui_state, TextAlignment, text_alignment) }\r\ninternal UI_Box * ui_push_parent(UI_Box * v) { UI_StackPushImpl(ui_state, Parent, parent, UI_Box *, v) }\r\ninternal Axis2 ui_push_child_layout_axis(Axis2 v) { UI_StackPushImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) }\r\ninternal F32 ui_push_fixed_x(F32 v) { UI_StackPushImpl(ui_state, FixedX, fixed_x, F32, v) }\r\ninternal F32 ui_push_fixed_y(F32 v) { UI_StackPushImpl(ui_state, FixedY, fixed_y, F32, v) }\r\ninternal F32 ui_push_fixed_width(F32 v) { UI_StackPushImpl(ui_state, FixedWidth, fixed_width, F32, v) }\r\ninternal F32 ui_push_fixed_height(F32 v) { UI_StackPushImpl(ui_state, FixedHeight, fixed_height, F32, v) }\r\ninternal UI_Size ui_push_pref_width(UI_Size v) { UI_StackPushImpl(ui_state, PrefWidth, pref_width, UI_Size, v) }\r\ninternal UI_Size ui_push_pref_height(UI_Size v) { UI_StackPushImpl(ui_state, PrefHeight, pref_height, UI_Size, v) }\r\ninternal F32 ui_push_min_width(F32 v) { UI_StackPushImpl(ui_state, MinWidth, min_width, F32, v) }\r\ninternal F32 ui_push_min_height(F32 v) { UI_StackPushImpl(ui_state, MinHeight, min_height, F32, v) }\r\ninternal UI_PermissionFlags ui_push_permission_flags(UI_PermissionFlags v) { UI_StackPushImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) }\r\ninternal UI_BoxFlags ui_push_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, Flags, flags, UI_BoxFlags, v) }\r\ninternal UI_BoxFlags ui_push_omit_flags(UI_BoxFlags v) { UI_StackPushImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) }\r\ninternal UI_FocusKind ui_push_focus_hot(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) }\r\ninternal UI_FocusKind ui_push_focus_active(UI_FocusKind v) { UI_StackPushImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) }\r\ninternal U32 ui_push_fastpath_codepoint(U32 v) { UI_StackPushImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) }\r\ninternal UI_Key ui_push_group_key(UI_Key v) { UI_StackPushImpl(ui_state, GroupKey, group_key, UI_Key, v) }\r\ninternal F32 ui_push_transparency(F32 v) { UI_StackPushImpl(ui_state, Transparency, transparency, F32, v) }\r\ninternal Vec4F32 ui_push_background_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) }\r\ninternal Vec4F32 ui_push_text_color(Vec4F32 v) { UI_StackPushImpl(ui_state, TextColor, text_color, Vec4F32, v) }\r\ninternal Vec4F32 ui_push_border_color(Vec4F32 v) { UI_StackPushImpl(ui_state, BorderColor, border_color, Vec4F32, v) }\r\ninternal F32 ui_push_squish(F32 v) { UI_StackPushImpl(ui_state, Squish, squish, F32, v) }\r\ninternal OS_Cursor ui_push_hover_cursor(OS_Cursor v) { UI_StackPushImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) }\r\ninternal FNT_Tag ui_push_font(FNT_Tag v) { UI_StackPushImpl(ui_state, Font, font, FNT_Tag, v) }\r\ninternal F32 ui_push_font_size(F32 v) { UI_StackPushImpl(ui_state, FontSize, font_size, F32, v) }\r\ninternal FNT_RasterFlags ui_push_text_raster_flags(FNT_RasterFlags v) { UI_StackPushImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) }\r\ninternal F32 ui_push_tab_size(F32 v) { UI_StackPushImpl(ui_state, TabSize, tab_size, F32, v) }\r\ninternal F32 ui_push_corner_radius_00(F32 v) { UI_StackPushImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) }\r\ninternal F32 ui_push_corner_radius_01(F32 v) { UI_StackPushImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) }\r\ninternal F32 ui_push_corner_radius_10(F32 v) { UI_StackPushImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) }\r\ninternal F32 ui_push_corner_radius_11(F32 v) { UI_StackPushImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) }\r\ninternal F32 ui_push_blur_size(F32 v) { UI_StackPushImpl(ui_state, BlurSize, blur_size, F32, v) }\r\ninternal F32 ui_push_text_padding(F32 v) { UI_StackPushImpl(ui_state, TextPadding, text_padding, F32, v) }\r\ninternal UI_TextAlign ui_push_text_alignment(UI_TextAlign v) { UI_StackPushImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) }\r\ninternal UI_Box * ui_pop_parent(void) { UI_StackPopImpl(ui_state, Parent, parent) }\r\ninternal Axis2 ui_pop_child_layout_axis(void) { UI_StackPopImpl(ui_state, ChildLayoutAxis, child_layout_axis) }\r\ninternal F32 ui_pop_fixed_x(void) { UI_StackPopImpl(ui_state, FixedX, fixed_x) }\r\ninternal F32 ui_pop_fixed_y(void) { UI_StackPopImpl(ui_state, FixedY, fixed_y) }\r\ninternal F32 ui_pop_fixed_width(void) { UI_StackPopImpl(ui_state, FixedWidth, fixed_width) }\r\ninternal F32 ui_pop_fixed_height(void) { UI_StackPopImpl(ui_state, FixedHeight, fixed_height) }\r\ninternal UI_Size ui_pop_pref_width(void) { UI_StackPopImpl(ui_state, PrefWidth, pref_width) }\r\ninternal UI_Size ui_pop_pref_height(void) { UI_StackPopImpl(ui_state, PrefHeight, pref_height) }\r\ninternal F32 ui_pop_min_width(void) { UI_StackPopImpl(ui_state, MinWidth, min_width) }\r\ninternal F32 ui_pop_min_height(void) { UI_StackPopImpl(ui_state, MinHeight, min_height) }\r\ninternal UI_PermissionFlags ui_pop_permission_flags(void) { UI_StackPopImpl(ui_state, PermissionFlags, permission_flags) }\r\ninternal UI_BoxFlags ui_pop_flags(void) { UI_StackPopImpl(ui_state, Flags, flags) }\r\ninternal UI_BoxFlags ui_pop_omit_flags(void) { UI_StackPopImpl(ui_state, OmitFlags, omit_flags) }\r\ninternal UI_FocusKind ui_pop_focus_hot(void) { UI_StackPopImpl(ui_state, FocusHot, focus_hot) }\r\ninternal UI_FocusKind ui_pop_focus_active(void) { UI_StackPopImpl(ui_state, FocusActive, focus_active) }\r\ninternal U32 ui_pop_fastpath_codepoint(void) { UI_StackPopImpl(ui_state, FastpathCodepoint, fastpath_codepoint) }\r\ninternal UI_Key ui_pop_group_key(void) { UI_StackPopImpl(ui_state, GroupKey, group_key) }\r\ninternal F32 ui_pop_transparency(void) { UI_StackPopImpl(ui_state, Transparency, transparency) }\r\ninternal Vec4F32 ui_pop_background_color(void) { UI_StackPopImpl(ui_state, BackgroundColor, background_color) }\r\ninternal Vec4F32 ui_pop_text_color(void) { UI_StackPopImpl(ui_state, TextColor, text_color) }\r\ninternal Vec4F32 ui_pop_border_color(void) { UI_StackPopImpl(ui_state, BorderColor, border_color) }\r\ninternal F32 ui_pop_squish(void) { UI_StackPopImpl(ui_state, Squish, squish) }\r\ninternal OS_Cursor ui_pop_hover_cursor(void) { UI_StackPopImpl(ui_state, HoverCursor, hover_cursor) }\r\ninternal FNT_Tag ui_pop_font(void) { UI_StackPopImpl(ui_state, Font, font) }\r\ninternal F32 ui_pop_font_size(void) { UI_StackPopImpl(ui_state, FontSize, font_size) }\r\ninternal FNT_RasterFlags ui_pop_text_raster_flags(void) { UI_StackPopImpl(ui_state, TextRasterFlags, text_raster_flags) }\r\ninternal F32 ui_pop_tab_size(void) { UI_StackPopImpl(ui_state, TabSize, tab_size) }\r\ninternal F32 ui_pop_corner_radius_00(void) { UI_StackPopImpl(ui_state, CornerRadius00, corner_radius_00) }\r\ninternal F32 ui_pop_corner_radius_01(void) { UI_StackPopImpl(ui_state, CornerRadius01, corner_radius_01) }\r\ninternal F32 ui_pop_corner_radius_10(void) { UI_StackPopImpl(ui_state, CornerRadius10, corner_radius_10) }\r\ninternal F32 ui_pop_corner_radius_11(void) { UI_StackPopImpl(ui_state, CornerRadius11, corner_radius_11) }\r\ninternal F32 ui_pop_blur_size(void) { UI_StackPopImpl(ui_state, BlurSize, blur_size) }\r\ninternal F32 ui_pop_text_padding(void) { UI_StackPopImpl(ui_state, TextPadding, text_padding) }\r\ninternal UI_TextAlign ui_pop_text_alignment(void) { UI_StackPopImpl(ui_state, TextAlignment, text_alignment) }\r\ninternal UI_Box * ui_set_next_parent(UI_Box * v) { UI_StackSetNextImpl(ui_state, Parent, parent, UI_Box *, v) }\r\ninternal Axis2 ui_set_next_child_layout_axis(Axis2 v) { UI_StackSetNextImpl(ui_state, ChildLayoutAxis, child_layout_axis, Axis2, v) }\r\ninternal F32 ui_set_next_fixed_x(F32 v) { UI_StackSetNextImpl(ui_state, FixedX, fixed_x, F32, v) }\r\ninternal F32 ui_set_next_fixed_y(F32 v) { UI_StackSetNextImpl(ui_state, FixedY, fixed_y, F32, v) }\r\ninternal F32 ui_set_next_fixed_width(F32 v) { UI_StackSetNextImpl(ui_state, FixedWidth, fixed_width, F32, v) }\r\ninternal F32 ui_set_next_fixed_height(F32 v) { UI_StackSetNextImpl(ui_state, FixedHeight, fixed_height, F32, v) }\r\ninternal UI_Size ui_set_next_pref_width(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefWidth, pref_width, UI_Size, v) }\r\ninternal UI_Size ui_set_next_pref_height(UI_Size v) { UI_StackSetNextImpl(ui_state, PrefHeight, pref_height, UI_Size, v) }\r\ninternal F32 ui_set_next_min_width(F32 v) { UI_StackSetNextImpl(ui_state, MinWidth, min_width, F32, v) }\r\ninternal F32 ui_set_next_min_height(F32 v) { UI_StackSetNextImpl(ui_state, MinHeight, min_height, F32, v) }\r\ninternal UI_PermissionFlags ui_set_next_permission_flags(UI_PermissionFlags v) { UI_StackSetNextImpl(ui_state, PermissionFlags, permission_flags, UI_PermissionFlags, v) }\r\ninternal UI_BoxFlags ui_set_next_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, Flags, flags, UI_BoxFlags, v) }\r\ninternal UI_BoxFlags ui_set_next_omit_flags(UI_BoxFlags v) { UI_StackSetNextImpl(ui_state, OmitFlags, omit_flags, UI_BoxFlags, v) }\r\ninternal UI_FocusKind ui_set_next_focus_hot(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusHot, focus_hot, UI_FocusKind, v) }\r\ninternal UI_FocusKind ui_set_next_focus_active(UI_FocusKind v) { UI_StackSetNextImpl(ui_state, FocusActive, focus_active, UI_FocusKind, v) }\r\ninternal U32 ui_set_next_fastpath_codepoint(U32 v) { UI_StackSetNextImpl(ui_state, FastpathCodepoint, fastpath_codepoint, U32, v) }\r\ninternal UI_Key ui_set_next_group_key(UI_Key v) { UI_StackSetNextImpl(ui_state, GroupKey, group_key, UI_Key, v) }\r\ninternal F32 ui_set_next_transparency(F32 v) { UI_StackSetNextImpl(ui_state, Transparency, transparency, F32, v) }\r\ninternal Vec4F32 ui_set_next_background_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BackgroundColor, background_color, Vec4F32, v) }\r\ninternal Vec4F32 ui_set_next_text_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, TextColor, text_color, Vec4F32, v) }\r\ninternal Vec4F32 ui_set_next_border_color(Vec4F32 v) { UI_StackSetNextImpl(ui_state, BorderColor, border_color, Vec4F32, v) }\r\ninternal F32 ui_set_next_squish(F32 v) { UI_StackSetNextImpl(ui_state, Squish, squish, F32, v) }\r\ninternal OS_Cursor ui_set_next_hover_cursor(OS_Cursor v) { UI_StackSetNextImpl(ui_state, HoverCursor, hover_cursor, OS_Cursor, v) }\r\ninternal FNT_Tag ui_set_next_font(FNT_Tag v) { UI_StackSetNextImpl(ui_state, Font, font, FNT_Tag, v) }\r\ninternal F32 ui_set_next_font_size(F32 v) { UI_StackSetNextImpl(ui_state, FontSize, font_size, F32, v) }\r\ninternal FNT_RasterFlags ui_set_next_text_raster_flags(FNT_RasterFlags v) { UI_StackSetNextImpl(ui_state, TextRasterFlags, text_raster_flags, FNT_RasterFlags, v) }\r\ninternal F32 ui_set_next_tab_size(F32 v) { UI_StackSetNextImpl(ui_state, TabSize, tab_size, F32, v) }\r\ninternal F32 ui_set_next_corner_radius_00(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius00, corner_radius_00, F32, v) }\r\ninternal F32 ui_set_next_corner_radius_01(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius01, corner_radius_01, F32, v) }\r\ninternal F32 ui_set_next_corner_radius_10(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius10, corner_radius_10, F32, v) }\r\ninternal F32 ui_set_next_corner_radius_11(F32 v) { UI_StackSetNextImpl(ui_state, CornerRadius11, corner_radius_11, F32, v) }\r\ninternal F32 ui_set_next_blur_size(F32 v) { UI_StackSetNextImpl(ui_state, BlurSize, blur_size, F32, v) }\r\ninternal F32 ui_set_next_text_padding(F32 v) { UI_StackSetNextImpl(ui_state, TextPadding, text_padding, F32, v) }\r\ninternal UI_TextAlign ui_set_next_text_alignment(UI_TextAlign v) { UI_StackSetNextImpl(ui_state, TextAlignment, text_alignment, UI_TextAlign, v) }\r\n"
  },
  {
    "path": "src/ui/generated/ui.meta.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- GENERATED CODE\r\n\r\n#ifndef UI_META_H\r\n#define UI_META_H\r\n\r\ntypedef struct UI_ParentNode UI_ParentNode; struct UI_ParentNode{UI_ParentNode *next; UI_Box * v;};\r\ntypedef struct UI_ChildLayoutAxisNode UI_ChildLayoutAxisNode; struct UI_ChildLayoutAxisNode{UI_ChildLayoutAxisNode *next; Axis2 v;};\r\ntypedef struct UI_FixedXNode UI_FixedXNode; struct UI_FixedXNode{UI_FixedXNode *next; F32 v;};\r\ntypedef struct UI_FixedYNode UI_FixedYNode; struct UI_FixedYNode{UI_FixedYNode *next; F32 v;};\r\ntypedef struct UI_FixedWidthNode UI_FixedWidthNode; struct UI_FixedWidthNode{UI_FixedWidthNode *next; F32 v;};\r\ntypedef struct UI_FixedHeightNode UI_FixedHeightNode; struct UI_FixedHeightNode{UI_FixedHeightNode *next; F32 v;};\r\ntypedef struct UI_PrefWidthNode UI_PrefWidthNode; struct UI_PrefWidthNode{UI_PrefWidthNode *next; UI_Size v;};\r\ntypedef struct UI_PrefHeightNode UI_PrefHeightNode; struct UI_PrefHeightNode{UI_PrefHeightNode *next; UI_Size v;};\r\ntypedef struct UI_MinWidthNode UI_MinWidthNode; struct UI_MinWidthNode{UI_MinWidthNode *next; F32 v;};\r\ntypedef struct UI_MinHeightNode UI_MinHeightNode; struct UI_MinHeightNode{UI_MinHeightNode *next; F32 v;};\r\ntypedef struct UI_PermissionFlagsNode UI_PermissionFlagsNode; struct UI_PermissionFlagsNode{UI_PermissionFlagsNode *next; UI_PermissionFlags v;};\r\ntypedef struct UI_FlagsNode UI_FlagsNode; struct UI_FlagsNode{UI_FlagsNode *next; UI_BoxFlags v;};\r\ntypedef struct UI_OmitFlagsNode UI_OmitFlagsNode; struct UI_OmitFlagsNode{UI_OmitFlagsNode *next; UI_BoxFlags v;};\r\ntypedef struct UI_FocusHotNode UI_FocusHotNode; struct UI_FocusHotNode{UI_FocusHotNode *next; UI_FocusKind v;};\r\ntypedef struct UI_FocusActiveNode UI_FocusActiveNode; struct UI_FocusActiveNode{UI_FocusActiveNode *next; UI_FocusKind v;};\r\ntypedef struct UI_FastpathCodepointNode UI_FastpathCodepointNode; struct UI_FastpathCodepointNode{UI_FastpathCodepointNode *next; U32 v;};\r\ntypedef struct UI_GroupKeyNode UI_GroupKeyNode; struct UI_GroupKeyNode{UI_GroupKeyNode *next; UI_Key v;};\r\ntypedef struct UI_TransparencyNode UI_TransparencyNode; struct UI_TransparencyNode{UI_TransparencyNode *next; F32 v;};\r\ntypedef struct UI_TagNode UI_TagNode; struct UI_TagNode{UI_TagNode *next; String8 v;};\r\ntypedef struct UI_BackgroundColorNode UI_BackgroundColorNode; struct UI_BackgroundColorNode{UI_BackgroundColorNode *next; Vec4F32 v;};\r\ntypedef struct UI_TextColorNode UI_TextColorNode; struct UI_TextColorNode{UI_TextColorNode *next; Vec4F32 v;};\r\ntypedef struct UI_BorderColorNode UI_BorderColorNode; struct UI_BorderColorNode{UI_BorderColorNode *next; Vec4F32 v;};\r\ntypedef struct UI_SquishNode UI_SquishNode; struct UI_SquishNode{UI_SquishNode *next; F32 v;};\r\ntypedef struct UI_HoverCursorNode UI_HoverCursorNode; struct UI_HoverCursorNode{UI_HoverCursorNode *next; OS_Cursor v;};\r\ntypedef struct UI_FontNode UI_FontNode; struct UI_FontNode{UI_FontNode *next; FNT_Tag v;};\r\ntypedef struct UI_FontSizeNode UI_FontSizeNode; struct UI_FontSizeNode{UI_FontSizeNode *next; F32 v;};\r\ntypedef struct UI_TextRasterFlagsNode UI_TextRasterFlagsNode; struct UI_TextRasterFlagsNode{UI_TextRasterFlagsNode *next; FNT_RasterFlags v;};\r\ntypedef struct UI_TabSizeNode UI_TabSizeNode; struct UI_TabSizeNode{UI_TabSizeNode *next; F32 v;};\r\ntypedef struct UI_CornerRadius00Node UI_CornerRadius00Node; struct UI_CornerRadius00Node{UI_CornerRadius00Node *next; F32 v;};\r\ntypedef struct UI_CornerRadius01Node UI_CornerRadius01Node; struct UI_CornerRadius01Node{UI_CornerRadius01Node *next; F32 v;};\r\ntypedef struct UI_CornerRadius10Node UI_CornerRadius10Node; struct UI_CornerRadius10Node{UI_CornerRadius10Node *next; F32 v;};\r\ntypedef struct UI_CornerRadius11Node UI_CornerRadius11Node; struct UI_CornerRadius11Node{UI_CornerRadius11Node *next; F32 v;};\r\ntypedef struct UI_BlurSizeNode UI_BlurSizeNode; struct UI_BlurSizeNode{UI_BlurSizeNode *next; F32 v;};\r\ntypedef struct UI_TextPaddingNode UI_TextPaddingNode; struct UI_TextPaddingNode{UI_TextPaddingNode *next; F32 v;};\r\ntypedef struct UI_TextAlignmentNode UI_TextAlignmentNode; struct UI_TextAlignmentNode{UI_TextAlignmentNode *next; UI_TextAlign v;};\r\n#define UI_DeclStackNils \\\r\nstruct\\\r\n{\\\r\nUI_ParentNode parent_nil_stack_top;\\\r\nUI_ChildLayoutAxisNode child_layout_axis_nil_stack_top;\\\r\nUI_FixedXNode fixed_x_nil_stack_top;\\\r\nUI_FixedYNode fixed_y_nil_stack_top;\\\r\nUI_FixedWidthNode fixed_width_nil_stack_top;\\\r\nUI_FixedHeightNode fixed_height_nil_stack_top;\\\r\nUI_PrefWidthNode pref_width_nil_stack_top;\\\r\nUI_PrefHeightNode pref_height_nil_stack_top;\\\r\nUI_MinWidthNode min_width_nil_stack_top;\\\r\nUI_MinHeightNode min_height_nil_stack_top;\\\r\nUI_PermissionFlagsNode permission_flags_nil_stack_top;\\\r\nUI_FlagsNode flags_nil_stack_top;\\\r\nUI_OmitFlagsNode omit_flags_nil_stack_top;\\\r\nUI_FocusHotNode focus_hot_nil_stack_top;\\\r\nUI_FocusActiveNode focus_active_nil_stack_top;\\\r\nUI_FastpathCodepointNode fastpath_codepoint_nil_stack_top;\\\r\nUI_GroupKeyNode group_key_nil_stack_top;\\\r\nUI_TransparencyNode transparency_nil_stack_top;\\\r\nUI_TagNode tag_nil_stack_top;\\\r\nUI_BackgroundColorNode background_color_nil_stack_top;\\\r\nUI_TextColorNode text_color_nil_stack_top;\\\r\nUI_BorderColorNode border_color_nil_stack_top;\\\r\nUI_SquishNode squish_nil_stack_top;\\\r\nUI_HoverCursorNode hover_cursor_nil_stack_top;\\\r\nUI_FontNode font_nil_stack_top;\\\r\nUI_FontSizeNode font_size_nil_stack_top;\\\r\nUI_TextRasterFlagsNode text_raster_flags_nil_stack_top;\\\r\nUI_TabSizeNode tab_size_nil_stack_top;\\\r\nUI_CornerRadius00Node corner_radius_00_nil_stack_top;\\\r\nUI_CornerRadius01Node corner_radius_01_nil_stack_top;\\\r\nUI_CornerRadius10Node corner_radius_10_nil_stack_top;\\\r\nUI_CornerRadius11Node corner_radius_11_nil_stack_top;\\\r\nUI_BlurSizeNode blur_size_nil_stack_top;\\\r\nUI_TextPaddingNode text_padding_nil_stack_top;\\\r\nUI_TextAlignmentNode text_alignment_nil_stack_top;\\\r\n}\r\n#define UI_InitStackNils(state) \\\r\nstate->parent_nil_stack_top.v = &ui_nil_box;\\\r\nstate->child_layout_axis_nil_stack_top.v = Axis2_X;\\\r\nstate->fixed_x_nil_stack_top.v = 0;\\\r\nstate->fixed_y_nil_stack_top.v = 0;\\\r\nstate->fixed_width_nil_stack_top.v = 0;\\\r\nstate->fixed_height_nil_stack_top.v = 0;\\\r\nstate->pref_width_nil_stack_top.v = ui_px(250.f, 1.f);\\\r\nstate->pref_height_nil_stack_top.v = ui_px(30.f, 1.f);\\\r\nstate->min_width_nil_stack_top.v = 0;\\\r\nstate->min_height_nil_stack_top.v = 0;\\\r\nstate->permission_flags_nil_stack_top.v = UI_PermissionFlag_All;\\\r\nstate->flags_nil_stack_top.v = 0;\\\r\nstate->omit_flags_nil_stack_top.v = 0;\\\r\nstate->focus_hot_nil_stack_top.v = UI_FocusKind_Null;\\\r\nstate->focus_active_nil_stack_top.v = UI_FocusKind_Null;\\\r\nstate->fastpath_codepoint_nil_stack_top.v = 0;\\\r\nstate->group_key_nil_stack_top.v = ui_key_zero();\\\r\nstate->transparency_nil_stack_top.v = 0;\\\r\nstate->tag_nil_stack_top.v = str8_lit(\"\");\\\r\nstate->background_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\\\r\nstate->text_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\\\r\nstate->border_color_nil_stack_top.v = v4f32(0, 0, 0, 0);\\\r\nstate->squish_nil_stack_top.v = 0;\\\r\nstate->hover_cursor_nil_stack_top.v = OS_Cursor_Pointer;\\\r\nstate->font_nil_stack_top.v = fnt_tag_zero();\\\r\nstate->font_size_nil_stack_top.v = 24.f;\\\r\nstate->text_raster_flags_nil_stack_top.v = FNT_RasterFlag_Hinted;\\\r\nstate->tab_size_nil_stack_top.v = 24.f*4.f;\\\r\nstate->corner_radius_00_nil_stack_top.v = 0;\\\r\nstate->corner_radius_01_nil_stack_top.v = 0;\\\r\nstate->corner_radius_10_nil_stack_top.v = 0;\\\r\nstate->corner_radius_11_nil_stack_top.v = 0;\\\r\nstate->blur_size_nil_stack_top.v = 0;\\\r\nstate->text_padding_nil_stack_top.v = 0;\\\r\nstate->text_alignment_nil_stack_top.v = UI_TextAlign_Left;\\\r\n\r\n#define UI_DeclStacks \\\r\nstruct\\\r\n{\\\r\nstruct { UI_ParentNode *top; UI_Box * bottom_val; UI_ParentNode *free; U64 gen; B32 auto_pop; } parent_stack;\\\r\nstruct { UI_ChildLayoutAxisNode *top; Axis2 bottom_val; UI_ChildLayoutAxisNode *free; U64 gen; B32 auto_pop; } child_layout_axis_stack;\\\r\nstruct { UI_FixedXNode *top; F32 bottom_val; UI_FixedXNode *free; U64 gen; B32 auto_pop; } fixed_x_stack;\\\r\nstruct { UI_FixedYNode *top; F32 bottom_val; UI_FixedYNode *free; U64 gen; B32 auto_pop; } fixed_y_stack;\\\r\nstruct { UI_FixedWidthNode *top; F32 bottom_val; UI_FixedWidthNode *free; U64 gen; B32 auto_pop; } fixed_width_stack;\\\r\nstruct { UI_FixedHeightNode *top; F32 bottom_val; UI_FixedHeightNode *free; U64 gen; B32 auto_pop; } fixed_height_stack;\\\r\nstruct { UI_PrefWidthNode *top; UI_Size bottom_val; UI_PrefWidthNode *free; U64 gen; B32 auto_pop; } pref_width_stack;\\\r\nstruct { UI_PrefHeightNode *top; UI_Size bottom_val; UI_PrefHeightNode *free; U64 gen; B32 auto_pop; } pref_height_stack;\\\r\nstruct { UI_MinWidthNode *top; F32 bottom_val; UI_MinWidthNode *free; U64 gen; B32 auto_pop; } min_width_stack;\\\r\nstruct { UI_MinHeightNode *top; F32 bottom_val; UI_MinHeightNode *free; U64 gen; B32 auto_pop; } min_height_stack;\\\r\nstruct { UI_PermissionFlagsNode *top; UI_PermissionFlags bottom_val; UI_PermissionFlagsNode *free; U64 gen; B32 auto_pop; } permission_flags_stack;\\\r\nstruct { UI_FlagsNode *top; UI_BoxFlags bottom_val; UI_FlagsNode *free; U64 gen; B32 auto_pop; } flags_stack;\\\r\nstruct { UI_OmitFlagsNode *top; UI_BoxFlags bottom_val; UI_OmitFlagsNode *free; U64 gen; B32 auto_pop; } omit_flags_stack;\\\r\nstruct { UI_FocusHotNode *top; UI_FocusKind bottom_val; UI_FocusHotNode *free; U64 gen; B32 auto_pop; } focus_hot_stack;\\\r\nstruct { UI_FocusActiveNode *top; UI_FocusKind bottom_val; UI_FocusActiveNode *free; U64 gen; B32 auto_pop; } focus_active_stack;\\\r\nstruct { UI_FastpathCodepointNode *top; U32 bottom_val; UI_FastpathCodepointNode *free; U64 gen; B32 auto_pop; } fastpath_codepoint_stack;\\\r\nstruct { UI_GroupKeyNode *top; UI_Key bottom_val; UI_GroupKeyNode *free; U64 gen; B32 auto_pop; } group_key_stack;\\\r\nstruct { UI_TransparencyNode *top; F32 bottom_val; UI_TransparencyNode *free; U64 gen; B32 auto_pop; } transparency_stack;\\\r\nstruct { UI_TagNode *top; String8 bottom_val; UI_TagNode *free; U64 gen; B32 auto_pop; } tag_stack;\\\r\nstruct { UI_BackgroundColorNode *top; Vec4F32 bottom_val; UI_BackgroundColorNode *free; U64 gen; B32 auto_pop; } background_color_stack;\\\r\nstruct { UI_TextColorNode *top; Vec4F32 bottom_val; UI_TextColorNode *free; U64 gen; B32 auto_pop; } text_color_stack;\\\r\nstruct { UI_BorderColorNode *top; Vec4F32 bottom_val; UI_BorderColorNode *free; U64 gen; B32 auto_pop; } border_color_stack;\\\r\nstruct { UI_SquishNode *top; F32 bottom_val; UI_SquishNode *free; U64 gen; B32 auto_pop; } squish_stack;\\\r\nstruct { UI_HoverCursorNode *top; OS_Cursor bottom_val; UI_HoverCursorNode *free; U64 gen; B32 auto_pop; } hover_cursor_stack;\\\r\nstruct { UI_FontNode *top; FNT_Tag bottom_val; UI_FontNode *free; U64 gen; B32 auto_pop; } font_stack;\\\r\nstruct { UI_FontSizeNode *top; F32 bottom_val; UI_FontSizeNode *free; U64 gen; B32 auto_pop; } font_size_stack;\\\r\nstruct { UI_TextRasterFlagsNode *top; FNT_RasterFlags bottom_val; UI_TextRasterFlagsNode *free; U64 gen; B32 auto_pop; } text_raster_flags_stack;\\\r\nstruct { UI_TabSizeNode *top; F32 bottom_val; UI_TabSizeNode *free; U64 gen; B32 auto_pop; } tab_size_stack;\\\r\nstruct { UI_CornerRadius00Node *top; F32 bottom_val; UI_CornerRadius00Node *free; U64 gen; B32 auto_pop; } corner_radius_00_stack;\\\r\nstruct { UI_CornerRadius01Node *top; F32 bottom_val; UI_CornerRadius01Node *free; U64 gen; B32 auto_pop; } corner_radius_01_stack;\\\r\nstruct { UI_CornerRadius10Node *top; F32 bottom_val; UI_CornerRadius10Node *free; U64 gen; B32 auto_pop; } corner_radius_10_stack;\\\r\nstruct { UI_CornerRadius11Node *top; F32 bottom_val; UI_CornerRadius11Node *free; U64 gen; B32 auto_pop; } corner_radius_11_stack;\\\r\nstruct { UI_BlurSizeNode *top; F32 bottom_val; UI_BlurSizeNode *free; U64 gen; B32 auto_pop; } blur_size_stack;\\\r\nstruct { UI_TextPaddingNode *top; F32 bottom_val; UI_TextPaddingNode *free; U64 gen; B32 auto_pop; } text_padding_stack;\\\r\nstruct { UI_TextAlignmentNode *top; UI_TextAlign bottom_val; UI_TextAlignmentNode *free; U64 gen; B32 auto_pop; } text_alignment_stack;\\\r\n}\r\n#define UI_InitStacks(state) \\\r\nstate->parent_stack.top = &state->parent_nil_stack_top; state->parent_stack.bottom_val = &ui_nil_box; state->parent_stack.free = 0; state->parent_stack.auto_pop = 0;\\\r\nstate->child_layout_axis_stack.top = &state->child_layout_axis_nil_stack_top; state->child_layout_axis_stack.bottom_val = Axis2_X; state->child_layout_axis_stack.free = 0; state->child_layout_axis_stack.auto_pop = 0;\\\r\nstate->fixed_x_stack.top = &state->fixed_x_nil_stack_top; state->fixed_x_stack.bottom_val = 0; state->fixed_x_stack.free = 0; state->fixed_x_stack.auto_pop = 0;\\\r\nstate->fixed_y_stack.top = &state->fixed_y_nil_stack_top; state->fixed_y_stack.bottom_val = 0; state->fixed_y_stack.free = 0; state->fixed_y_stack.auto_pop = 0;\\\r\nstate->fixed_width_stack.top = &state->fixed_width_nil_stack_top; state->fixed_width_stack.bottom_val = 0; state->fixed_width_stack.free = 0; state->fixed_width_stack.auto_pop = 0;\\\r\nstate->fixed_height_stack.top = &state->fixed_height_nil_stack_top; state->fixed_height_stack.bottom_val = 0; state->fixed_height_stack.free = 0; state->fixed_height_stack.auto_pop = 0;\\\r\nstate->pref_width_stack.top = &state->pref_width_nil_stack_top; state->pref_width_stack.bottom_val = ui_px(250.f, 1.f); state->pref_width_stack.free = 0; state->pref_width_stack.auto_pop = 0;\\\r\nstate->pref_height_stack.top = &state->pref_height_nil_stack_top; state->pref_height_stack.bottom_val = ui_px(30.f, 1.f); state->pref_height_stack.free = 0; state->pref_height_stack.auto_pop = 0;\\\r\nstate->min_width_stack.top = &state->min_width_nil_stack_top; state->min_width_stack.bottom_val = 0; state->min_width_stack.free = 0; state->min_width_stack.auto_pop = 0;\\\r\nstate->min_height_stack.top = &state->min_height_nil_stack_top; state->min_height_stack.bottom_val = 0; state->min_height_stack.free = 0; state->min_height_stack.auto_pop = 0;\\\r\nstate->permission_flags_stack.top = &state->permission_flags_nil_stack_top; state->permission_flags_stack.bottom_val = UI_PermissionFlag_All; state->permission_flags_stack.free = 0; state->permission_flags_stack.auto_pop = 0;\\\r\nstate->flags_stack.top = &state->flags_nil_stack_top; state->flags_stack.bottom_val = 0; state->flags_stack.free = 0; state->flags_stack.auto_pop = 0;\\\r\nstate->omit_flags_stack.top = &state->omit_flags_nil_stack_top; state->omit_flags_stack.bottom_val = 0; state->omit_flags_stack.free = 0; state->omit_flags_stack.auto_pop = 0;\\\r\nstate->focus_hot_stack.top = &state->focus_hot_nil_stack_top; state->focus_hot_stack.bottom_val = UI_FocusKind_Null; state->focus_hot_stack.free = 0; state->focus_hot_stack.auto_pop = 0;\\\r\nstate->focus_active_stack.top = &state->focus_active_nil_stack_top; state->focus_active_stack.bottom_val = UI_FocusKind_Null; state->focus_active_stack.free = 0; state->focus_active_stack.auto_pop = 0;\\\r\nstate->fastpath_codepoint_stack.top = &state->fastpath_codepoint_nil_stack_top; state->fastpath_codepoint_stack.bottom_val = 0; state->fastpath_codepoint_stack.free = 0; state->fastpath_codepoint_stack.auto_pop = 0;\\\r\nstate->group_key_stack.top = &state->group_key_nil_stack_top; state->group_key_stack.bottom_val = ui_key_zero(); state->group_key_stack.free = 0; state->group_key_stack.auto_pop = 0;\\\r\nstate->transparency_stack.top = &state->transparency_nil_stack_top; state->transparency_stack.bottom_val = 0; state->transparency_stack.free = 0; state->transparency_stack.auto_pop = 0;\\\r\nstate->tag_stack.top = &state->tag_nil_stack_top; state->tag_stack.bottom_val = str8_lit(\"\"); state->tag_stack.free = 0; state->tag_stack.auto_pop = 0;\\\r\nstate->background_color_stack.top = &state->background_color_nil_stack_top; state->background_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->background_color_stack.free = 0; state->background_color_stack.auto_pop = 0;\\\r\nstate->text_color_stack.top = &state->text_color_nil_stack_top; state->text_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->text_color_stack.free = 0; state->text_color_stack.auto_pop = 0;\\\r\nstate->border_color_stack.top = &state->border_color_nil_stack_top; state->border_color_stack.bottom_val = v4f32(0, 0, 0, 0); state->border_color_stack.free = 0; state->border_color_stack.auto_pop = 0;\\\r\nstate->squish_stack.top = &state->squish_nil_stack_top; state->squish_stack.bottom_val = 0; state->squish_stack.free = 0; state->squish_stack.auto_pop = 0;\\\r\nstate->hover_cursor_stack.top = &state->hover_cursor_nil_stack_top; state->hover_cursor_stack.bottom_val = OS_Cursor_Pointer; state->hover_cursor_stack.free = 0; state->hover_cursor_stack.auto_pop = 0;\\\r\nstate->font_stack.top = &state->font_nil_stack_top; state->font_stack.bottom_val = fnt_tag_zero(); state->font_stack.free = 0; state->font_stack.auto_pop = 0;\\\r\nstate->font_size_stack.top = &state->font_size_nil_stack_top; state->font_size_stack.bottom_val = 24.f; state->font_size_stack.free = 0; state->font_size_stack.auto_pop = 0;\\\r\nstate->text_raster_flags_stack.top = &state->text_raster_flags_nil_stack_top; state->text_raster_flags_stack.bottom_val = FNT_RasterFlag_Hinted; state->text_raster_flags_stack.free = 0; state->text_raster_flags_stack.auto_pop = 0;\\\r\nstate->tab_size_stack.top = &state->tab_size_nil_stack_top; state->tab_size_stack.bottom_val = 24.f*4.f; state->tab_size_stack.free = 0; state->tab_size_stack.auto_pop = 0;\\\r\nstate->corner_radius_00_stack.top = &state->corner_radius_00_nil_stack_top; state->corner_radius_00_stack.bottom_val = 0; state->corner_radius_00_stack.free = 0; state->corner_radius_00_stack.auto_pop = 0;\\\r\nstate->corner_radius_01_stack.top = &state->corner_radius_01_nil_stack_top; state->corner_radius_01_stack.bottom_val = 0; state->corner_radius_01_stack.free = 0; state->corner_radius_01_stack.auto_pop = 0;\\\r\nstate->corner_radius_10_stack.top = &state->corner_radius_10_nil_stack_top; state->corner_radius_10_stack.bottom_val = 0; state->corner_radius_10_stack.free = 0; state->corner_radius_10_stack.auto_pop = 0;\\\r\nstate->corner_radius_11_stack.top = &state->corner_radius_11_nil_stack_top; state->corner_radius_11_stack.bottom_val = 0; state->corner_radius_11_stack.free = 0; state->corner_radius_11_stack.auto_pop = 0;\\\r\nstate->blur_size_stack.top = &state->blur_size_nil_stack_top; state->blur_size_stack.bottom_val = 0; state->blur_size_stack.free = 0; state->blur_size_stack.auto_pop = 0;\\\r\nstate->text_padding_stack.top = &state->text_padding_nil_stack_top; state->text_padding_stack.bottom_val = 0; state->text_padding_stack.free = 0; state->text_padding_stack.auto_pop = 0;\\\r\nstate->text_alignment_stack.top = &state->text_alignment_nil_stack_top; state->text_alignment_stack.bottom_val = UI_TextAlign_Left; state->text_alignment_stack.free = 0; state->text_alignment_stack.auto_pop = 0;\\\r\n\r\n#define UI_AutoPopStacks(state) \\\r\nif(state->parent_stack.auto_pop) { ui_pop_parent(); state->parent_stack.auto_pop = 0; }\\\r\nif(state->child_layout_axis_stack.auto_pop) { ui_pop_child_layout_axis(); state->child_layout_axis_stack.auto_pop = 0; }\\\r\nif(state->fixed_x_stack.auto_pop) { ui_pop_fixed_x(); state->fixed_x_stack.auto_pop = 0; }\\\r\nif(state->fixed_y_stack.auto_pop) { ui_pop_fixed_y(); state->fixed_y_stack.auto_pop = 0; }\\\r\nif(state->fixed_width_stack.auto_pop) { ui_pop_fixed_width(); state->fixed_width_stack.auto_pop = 0; }\\\r\nif(state->fixed_height_stack.auto_pop) { ui_pop_fixed_height(); state->fixed_height_stack.auto_pop = 0; }\\\r\nif(state->pref_width_stack.auto_pop) { ui_pop_pref_width(); state->pref_width_stack.auto_pop = 0; }\\\r\nif(state->pref_height_stack.auto_pop) { ui_pop_pref_height(); state->pref_height_stack.auto_pop = 0; }\\\r\nif(state->min_width_stack.auto_pop) { ui_pop_min_width(); state->min_width_stack.auto_pop = 0; }\\\r\nif(state->min_height_stack.auto_pop) { ui_pop_min_height(); state->min_height_stack.auto_pop = 0; }\\\r\nif(state->permission_flags_stack.auto_pop) { ui_pop_permission_flags(); state->permission_flags_stack.auto_pop = 0; }\\\r\nif(state->flags_stack.auto_pop) { ui_pop_flags(); state->flags_stack.auto_pop = 0; }\\\r\nif(state->omit_flags_stack.auto_pop) { ui_pop_omit_flags(); state->omit_flags_stack.auto_pop = 0; }\\\r\nif(state->focus_hot_stack.auto_pop) { ui_pop_focus_hot(); state->focus_hot_stack.auto_pop = 0; }\\\r\nif(state->focus_active_stack.auto_pop) { ui_pop_focus_active(); state->focus_active_stack.auto_pop = 0; }\\\r\nif(state->fastpath_codepoint_stack.auto_pop) { ui_pop_fastpath_codepoint(); state->fastpath_codepoint_stack.auto_pop = 0; }\\\r\nif(state->group_key_stack.auto_pop) { ui_pop_group_key(); state->group_key_stack.auto_pop = 0; }\\\r\nif(state->transparency_stack.auto_pop) { ui_pop_transparency(); state->transparency_stack.auto_pop = 0; }\\\r\nif(state->tag_stack.auto_pop) { ui_pop_tag(); state->tag_stack.auto_pop = 0; }\\\r\nif(state->background_color_stack.auto_pop) { ui_pop_background_color(); state->background_color_stack.auto_pop = 0; }\\\r\nif(state->text_color_stack.auto_pop) { ui_pop_text_color(); state->text_color_stack.auto_pop = 0; }\\\r\nif(state->border_color_stack.auto_pop) { ui_pop_border_color(); state->border_color_stack.auto_pop = 0; }\\\r\nif(state->squish_stack.auto_pop) { ui_pop_squish(); state->squish_stack.auto_pop = 0; }\\\r\nif(state->hover_cursor_stack.auto_pop) { ui_pop_hover_cursor(); state->hover_cursor_stack.auto_pop = 0; }\\\r\nif(state->font_stack.auto_pop) { ui_pop_font(); state->font_stack.auto_pop = 0; }\\\r\nif(state->font_size_stack.auto_pop) { ui_pop_font_size(); state->font_size_stack.auto_pop = 0; }\\\r\nif(state->text_raster_flags_stack.auto_pop) { ui_pop_text_raster_flags(); state->text_raster_flags_stack.auto_pop = 0; }\\\r\nif(state->tab_size_stack.auto_pop) { ui_pop_tab_size(); state->tab_size_stack.auto_pop = 0; }\\\r\nif(state->corner_radius_00_stack.auto_pop) { ui_pop_corner_radius_00(); state->corner_radius_00_stack.auto_pop = 0; }\\\r\nif(state->corner_radius_01_stack.auto_pop) { ui_pop_corner_radius_01(); state->corner_radius_01_stack.auto_pop = 0; }\\\r\nif(state->corner_radius_10_stack.auto_pop) { ui_pop_corner_radius_10(); state->corner_radius_10_stack.auto_pop = 0; }\\\r\nif(state->corner_radius_11_stack.auto_pop) { ui_pop_corner_radius_11(); state->corner_radius_11_stack.auto_pop = 0; }\\\r\nif(state->blur_size_stack.auto_pop) { ui_pop_blur_size(); state->blur_size_stack.auto_pop = 0; }\\\r\nif(state->text_padding_stack.auto_pop) { ui_pop_text_padding(); state->text_padding_stack.auto_pop = 0; }\\\r\nif(state->text_alignment_stack.auto_pop) { ui_pop_text_alignment(); state->text_alignment_stack.auto_pop = 0; }\\\r\n\r\ninternal UI_Box *                   ui_top_parent(void);\r\ninternal Axis2                      ui_top_child_layout_axis(void);\r\ninternal F32                        ui_top_fixed_x(void);\r\ninternal F32                        ui_top_fixed_y(void);\r\ninternal F32                        ui_top_fixed_width(void);\r\ninternal F32                        ui_top_fixed_height(void);\r\ninternal UI_Size                    ui_top_pref_width(void);\r\ninternal UI_Size                    ui_top_pref_height(void);\r\ninternal F32                        ui_top_min_width(void);\r\ninternal F32                        ui_top_min_height(void);\r\ninternal UI_PermissionFlags         ui_top_permission_flags(void);\r\ninternal UI_BoxFlags                ui_top_flags(void);\r\ninternal UI_BoxFlags                ui_top_omit_flags(void);\r\ninternal UI_FocusKind               ui_top_focus_hot(void);\r\ninternal UI_FocusKind               ui_top_focus_active(void);\r\ninternal U32                        ui_top_fastpath_codepoint(void);\r\ninternal UI_Key                     ui_top_group_key(void);\r\ninternal F32                        ui_top_transparency(void);\r\ninternal String8                    ui_top_tag(void);\r\ninternal Vec4F32                    ui_top_background_color(void);\r\ninternal Vec4F32                    ui_top_text_color(void);\r\ninternal Vec4F32                    ui_top_border_color(void);\r\ninternal F32                        ui_top_squish(void);\r\ninternal OS_Cursor                  ui_top_hover_cursor(void);\r\ninternal FNT_Tag                    ui_top_font(void);\r\ninternal F32                        ui_top_font_size(void);\r\ninternal FNT_RasterFlags            ui_top_text_raster_flags(void);\r\ninternal F32                        ui_top_tab_size(void);\r\ninternal F32                        ui_top_corner_radius_00(void);\r\ninternal F32                        ui_top_corner_radius_01(void);\r\ninternal F32                        ui_top_corner_radius_10(void);\r\ninternal F32                        ui_top_corner_radius_11(void);\r\ninternal F32                        ui_top_blur_size(void);\r\ninternal F32                        ui_top_text_padding(void);\r\ninternal UI_TextAlign               ui_top_text_alignment(void);\r\ninternal UI_Box *                   ui_bottom_parent(void);\r\ninternal Axis2                      ui_bottom_child_layout_axis(void);\r\ninternal F32                        ui_bottom_fixed_x(void);\r\ninternal F32                        ui_bottom_fixed_y(void);\r\ninternal F32                        ui_bottom_fixed_width(void);\r\ninternal F32                        ui_bottom_fixed_height(void);\r\ninternal UI_Size                    ui_bottom_pref_width(void);\r\ninternal UI_Size                    ui_bottom_pref_height(void);\r\ninternal F32                        ui_bottom_min_width(void);\r\ninternal F32                        ui_bottom_min_height(void);\r\ninternal UI_PermissionFlags         ui_bottom_permission_flags(void);\r\ninternal UI_BoxFlags                ui_bottom_flags(void);\r\ninternal UI_BoxFlags                ui_bottom_omit_flags(void);\r\ninternal UI_FocusKind               ui_bottom_focus_hot(void);\r\ninternal UI_FocusKind               ui_bottom_focus_active(void);\r\ninternal U32                        ui_bottom_fastpath_codepoint(void);\r\ninternal UI_Key                     ui_bottom_group_key(void);\r\ninternal F32                        ui_bottom_transparency(void);\r\ninternal String8                    ui_bottom_tag(void);\r\ninternal Vec4F32                    ui_bottom_background_color(void);\r\ninternal Vec4F32                    ui_bottom_text_color(void);\r\ninternal Vec4F32                    ui_bottom_border_color(void);\r\ninternal F32                        ui_bottom_squish(void);\r\ninternal OS_Cursor                  ui_bottom_hover_cursor(void);\r\ninternal FNT_Tag                    ui_bottom_font(void);\r\ninternal F32                        ui_bottom_font_size(void);\r\ninternal FNT_RasterFlags            ui_bottom_text_raster_flags(void);\r\ninternal F32                        ui_bottom_tab_size(void);\r\ninternal F32                        ui_bottom_corner_radius_00(void);\r\ninternal F32                        ui_bottom_corner_radius_01(void);\r\ninternal F32                        ui_bottom_corner_radius_10(void);\r\ninternal F32                        ui_bottom_corner_radius_11(void);\r\ninternal F32                        ui_bottom_blur_size(void);\r\ninternal F32                        ui_bottom_text_padding(void);\r\ninternal UI_TextAlign               ui_bottom_text_alignment(void);\r\ninternal UI_Box *                   ui_push_parent(UI_Box * v);\r\ninternal Axis2                      ui_push_child_layout_axis(Axis2 v);\r\ninternal F32                        ui_push_fixed_x(F32 v);\r\ninternal F32                        ui_push_fixed_y(F32 v);\r\ninternal F32                        ui_push_fixed_width(F32 v);\r\ninternal F32                        ui_push_fixed_height(F32 v);\r\ninternal UI_Size                    ui_push_pref_width(UI_Size v);\r\ninternal UI_Size                    ui_push_pref_height(UI_Size v);\r\ninternal F32                        ui_push_min_width(F32 v);\r\ninternal F32                        ui_push_min_height(F32 v);\r\ninternal UI_PermissionFlags         ui_push_permission_flags(UI_PermissionFlags v);\r\ninternal UI_BoxFlags                ui_push_flags(UI_BoxFlags v);\r\ninternal UI_BoxFlags                ui_push_omit_flags(UI_BoxFlags v);\r\ninternal UI_FocusKind               ui_push_focus_hot(UI_FocusKind v);\r\ninternal UI_FocusKind               ui_push_focus_active(UI_FocusKind v);\r\ninternal U32                        ui_push_fastpath_codepoint(U32 v);\r\ninternal UI_Key                     ui_push_group_key(UI_Key v);\r\ninternal F32                        ui_push_transparency(F32 v);\r\ninternal String8                    ui_push_tag(String8 v);\r\ninternal Vec4F32                    ui_push_background_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_push_text_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_push_border_color(Vec4F32 v);\r\ninternal F32                        ui_push_squish(F32 v);\r\ninternal OS_Cursor                  ui_push_hover_cursor(OS_Cursor v);\r\ninternal FNT_Tag                    ui_push_font(FNT_Tag v);\r\ninternal F32                        ui_push_font_size(F32 v);\r\ninternal FNT_RasterFlags            ui_push_text_raster_flags(FNT_RasterFlags v);\r\ninternal F32                        ui_push_tab_size(F32 v);\r\ninternal F32                        ui_push_corner_radius_00(F32 v);\r\ninternal F32                        ui_push_corner_radius_01(F32 v);\r\ninternal F32                        ui_push_corner_radius_10(F32 v);\r\ninternal F32                        ui_push_corner_radius_11(F32 v);\r\ninternal F32                        ui_push_blur_size(F32 v);\r\ninternal F32                        ui_push_text_padding(F32 v);\r\ninternal UI_TextAlign               ui_push_text_alignment(UI_TextAlign v);\r\ninternal UI_Box *                   ui_pop_parent(void);\r\ninternal Axis2                      ui_pop_child_layout_axis(void);\r\ninternal F32                        ui_pop_fixed_x(void);\r\ninternal F32                        ui_pop_fixed_y(void);\r\ninternal F32                        ui_pop_fixed_width(void);\r\ninternal F32                        ui_pop_fixed_height(void);\r\ninternal UI_Size                    ui_pop_pref_width(void);\r\ninternal UI_Size                    ui_pop_pref_height(void);\r\ninternal F32                        ui_pop_min_width(void);\r\ninternal F32                        ui_pop_min_height(void);\r\ninternal UI_PermissionFlags         ui_pop_permission_flags(void);\r\ninternal UI_BoxFlags                ui_pop_flags(void);\r\ninternal UI_BoxFlags                ui_pop_omit_flags(void);\r\ninternal UI_FocusKind               ui_pop_focus_hot(void);\r\ninternal UI_FocusKind               ui_pop_focus_active(void);\r\ninternal U32                        ui_pop_fastpath_codepoint(void);\r\ninternal UI_Key                     ui_pop_group_key(void);\r\ninternal F32                        ui_pop_transparency(void);\r\ninternal String8                    ui_pop_tag(void);\r\ninternal Vec4F32                    ui_pop_background_color(void);\r\ninternal Vec4F32                    ui_pop_text_color(void);\r\ninternal Vec4F32                    ui_pop_border_color(void);\r\ninternal F32                        ui_pop_squish(void);\r\ninternal OS_Cursor                  ui_pop_hover_cursor(void);\r\ninternal FNT_Tag                    ui_pop_font(void);\r\ninternal F32                        ui_pop_font_size(void);\r\ninternal FNT_RasterFlags            ui_pop_text_raster_flags(void);\r\ninternal F32                        ui_pop_tab_size(void);\r\ninternal F32                        ui_pop_corner_radius_00(void);\r\ninternal F32                        ui_pop_corner_radius_01(void);\r\ninternal F32                        ui_pop_corner_radius_10(void);\r\ninternal F32                        ui_pop_corner_radius_11(void);\r\ninternal F32                        ui_pop_blur_size(void);\r\ninternal F32                        ui_pop_text_padding(void);\r\ninternal UI_TextAlign               ui_pop_text_alignment(void);\r\ninternal UI_Box *                   ui_set_next_parent(UI_Box * v);\r\ninternal Axis2                      ui_set_next_child_layout_axis(Axis2 v);\r\ninternal F32                        ui_set_next_fixed_x(F32 v);\r\ninternal F32                        ui_set_next_fixed_y(F32 v);\r\ninternal F32                        ui_set_next_fixed_width(F32 v);\r\ninternal F32                        ui_set_next_fixed_height(F32 v);\r\ninternal UI_Size                    ui_set_next_pref_width(UI_Size v);\r\ninternal UI_Size                    ui_set_next_pref_height(UI_Size v);\r\ninternal F32                        ui_set_next_min_width(F32 v);\r\ninternal F32                        ui_set_next_min_height(F32 v);\r\ninternal UI_PermissionFlags         ui_set_next_permission_flags(UI_PermissionFlags v);\r\ninternal UI_BoxFlags                ui_set_next_flags(UI_BoxFlags v);\r\ninternal UI_BoxFlags                ui_set_next_omit_flags(UI_BoxFlags v);\r\ninternal UI_FocusKind               ui_set_next_focus_hot(UI_FocusKind v);\r\ninternal UI_FocusKind               ui_set_next_focus_active(UI_FocusKind v);\r\ninternal U32                        ui_set_next_fastpath_codepoint(U32 v);\r\ninternal UI_Key                     ui_set_next_group_key(UI_Key v);\r\ninternal F32                        ui_set_next_transparency(F32 v);\r\ninternal String8                    ui_set_next_tag(String8 v);\r\ninternal Vec4F32                    ui_set_next_background_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_set_next_text_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_set_next_border_color(Vec4F32 v);\r\ninternal F32                        ui_set_next_squish(F32 v);\r\ninternal OS_Cursor                  ui_set_next_hover_cursor(OS_Cursor v);\r\ninternal FNT_Tag                    ui_set_next_font(FNT_Tag v);\r\ninternal F32                        ui_set_next_font_size(F32 v);\r\ninternal FNT_RasterFlags            ui_set_next_text_raster_flags(FNT_RasterFlags v);\r\ninternal F32                        ui_set_next_tab_size(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_00(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_01(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_10(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_11(F32 v);\r\ninternal F32                        ui_set_next_blur_size(F32 v);\r\ninternal F32                        ui_set_next_text_padding(F32 v);\r\ninternal UI_TextAlign               ui_set_next_text_alignment(UI_TextAlign v);\r\n#endif // UI_META_H\r\n"
  },
  {
    "path": "src/ui/ui.mdesk",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n//- rjf: stack table\r\n\r\n@table(name, name_lower, type, default, manual_impl)\r\nUI_StackTable:\r\n{\r\n  //- rjf: parents\r\n  { Parent                             parent                       `UI_Box *`             `&ui_nil_box`                      }\r\n  \r\n  //- rjf: layout params\r\n  { ChildLayoutAxis                    child_layout_axis             Axis2                 `Axis2_X`                          }\r\n  \r\n  //- rjf: size/position\r\n  { FixedX                             fixed_x                       F32                   0                                  }\r\n  { FixedY                             fixed_y                       F32                   0                                  }\r\n  { FixedWidth                         fixed_width                   F32                   0                                  }\r\n  { FixedHeight                        fixed_height                  F32                   0                                  }\r\n  { PrefWidth                          pref_width                    UI_Size               `ui_px(250.f, 1.f)`                }\r\n  { PrefHeight                         pref_height                   UI_Size               `ui_px(30.f, 1.f)`                 }\r\n  { MinWidth                           min_width                     F32                   0                                  }\r\n  { MinHeight                          min_height                    F32                   0                                  }\r\n  \r\n  //- rjf: flags\r\n  { PermissionFlags                    permission_flags              UI_PermissionFlags    UI_PermissionFlag_All              }\r\n  { Flags                              flags                         UI_BoxFlags           0                                  }\r\n  { OmitFlags                          omit_flags                    UI_BoxFlags           0                                  }\r\n  \r\n  //- rjf: interaction\r\n  { FocusHot                           focus_hot                     UI_FocusKind          UI_FocusKind_Null                  }\r\n  { FocusActive                        focus_active                  UI_FocusKind          UI_FocusKind_Null                  }\r\n  { FastpathCodepoint                  fastpath_codepoint            U32                   0                                  }\r\n  { GroupKey                           group_key                     UI_Key                `ui_key_zero()`                    }\r\n  \r\n  //- rjf: colors\r\n  { Transparency                       transparency                  F32                   0                                  }\r\n  { Tag                                tag                           String8              `str8_lit(\"\")`                    1 }\r\n  { BackgroundColor                    background_color              Vec4F32              `v4f32(0, 0, 0, 0)`                 }\r\n  { TextColor                          text_color                    Vec4F32              `v4f32(0, 0, 0, 0)`                 }\r\n  { BorderColor                        border_color                  Vec4F32              `v4f32(0, 0, 0, 0)`                 }\r\n  \r\n  //- rjf: squish\r\n  { Squish                             squish                        F32                   0                                  }\r\n  \r\n  //- rjf: hover cursor\r\n  { HoverCursor                        hover_cursor                  OS_Cursor             OS_Cursor_Pointer                  }\r\n  \r\n  //- rjf: font\r\n  { Font                               font                          FNT_Tag               `fnt_tag_zero()`                   }\r\n  { FontSize                           font_size                     F32                   24.f                               }\r\n  { TextRasterFlags                    text_raster_flags             FNT_RasterFlags       FNT_RasterFlag_Hinted              }\r\n  { TabSize                            tab_size                      F32                   `24.f*4.f`                         }\r\n  \r\n  //- rjf: corner radii\r\n  { CornerRadius00                     corner_radius_00              F32                   0                                  }\r\n  { CornerRadius01                     corner_radius_01              F32                   0                                  }\r\n  { CornerRadius10                     corner_radius_10              F32                   0                                  }\r\n  { CornerRadius11                     corner_radius_11              F32                   0                                  }\r\n  \r\n  //- rjf: blur size\r\n  { BlurSize                           blur_size                     F32                   0                                  }\r\n  \r\n  //- rjf: text parameters\r\n  { TextPadding                        text_padding                  F32                   0                                  }\r\n  { TextAlignment                      text_alignment                UI_TextAlign          UI_TextAlign_Left                  }\r\n}\r\n\r\n//- rjf: declaring stack node types\r\n\r\n@gen\r\n{\r\n  @expand(UI_StackTable a) `typedef struct UI_$(a.name)Node UI_$(a.name)Node; struct UI_$(a.name)Node{UI_$(a.name)Node *next; $(a.type) v;};`\r\n}\r\n\r\n//- rjf: declaring all default stack tops\r\n\r\n@gen\r\n{\r\n  `#define UI_DeclStackNils \\\\`;\r\n  `struct\\\\`;\r\n  `{\\\\`;\r\n    @expand(UI_StackTable a) `UI_$(a.name)Node $(a.name_lower)_nil_stack_top;\\\\`;\r\n    `}`;\r\n}\r\n\r\n//- rjf: initializing all default stack tops\r\n\r\n@gen\r\n{\r\n  `#define UI_InitStackNils(state) \\\\`;\r\n  @expand(UI_StackTable a) `state->$(a.name_lower)_nil_stack_top.v = $(a.default);\\\\`;\r\n  ``;\r\n}\r\n\r\n//- rjf: declaring all stack nodes & free lists\r\n\r\n@gen\r\n{\r\n  `#define UI_DeclStacks \\\\`;\r\n  `struct\\\\`;\r\n  `{\\\\`;\r\n    @expand(UI_StackTable a) `struct { UI_$(a.name)Node *top; $(a.type) bottom_val; UI_$(a.name)Node *free; U64 gen; B32 auto_pop; } $(a.name_lower)_stack;\\\\`;\r\n    `}`;\r\n}\r\n\r\n//- rjf: initing all stack nodes\r\n\r\n@gen\r\n{\r\n  `#define UI_InitStacks(state) \\\\`;\r\n  @expand(UI_StackTable a) `state->$(a.name_lower)_stack.top = &state->$(a.name_lower)_nil_stack_top; state->$(a.name_lower)_stack.bottom_val = $(a.default); state->$(a.name_lower)_stack.free = 0; state->$(a.name_lower)_stack.auto_pop = 0;\\\\`;\r\n  ``;\r\n}\r\n\r\n//- rjf: auto-popping all stacks\r\n\r\n@gen\r\n{\r\n  `#define UI_AutoPopStacks(state) \\\\`\r\n  @expand(UI_StackTable a)\r\n    `if(state->$(a.name_lower)_stack.auto_pop) { ui_pop_$(a.name_lower)(); state->$(a.name_lower)_stack.auto_pop = 0; }\\\\`;\r\n  ``;\r\n}\r\n\r\n//- rjf: decls for the stack function operation headers\r\n\r\n@gen\r\n{\r\n  @expand(UI_StackTable a)\r\n    `internal $(a.type) $(=>35) ui_top_$(a.name_lower)(void);`\r\n    @expand(UI_StackTable a)\r\n    `internal $(a.type) $(=>35) ui_bottom_$(a.name_lower)(void);`\r\n    @expand(UI_StackTable a)\r\n    `internal $(a.type) $(=>35) ui_push_$(a.name_lower)($(a.type) v);`\r\n    @expand(UI_StackTable a)\r\n    `internal $(a.type) $(=>35) ui_pop_$(a.name_lower)(void);`\r\n    @expand(UI_StackTable a)\r\n    `internal $(a.type) $(=>35) ui_set_next_$(a.name_lower)($(a.type) v);`\r\n}\r\n\r\n//- rjf: defer-loop helpers\r\n\r\n@gen @c_file\r\n{\r\n  `#if 0`;\r\n  @expand(UI_StackTable a)\r\n    `#define UI_$(a.name)(v) DeferLoop(ui_push_$(a.name_lower)(v), ui_pop_$(a.name_lower)())`\r\n  `#endif`;\r\n}\r\n\r\n//- rjf: decls for the stack operation implementations\r\n\r\n@gen @c_file\r\n{\r\n  @expand(UI_StackTable a)\r\n    `$(a.manual_impl == \"\" -> \"internal \" .. a.type .. \" ui_top_\" .. a.name_lower .. \"(void) { UI_StackTopImpl(ui_state, \" .. a.name .. \", \" .. a.name_lower .. \") }\")`;\r\n  @expand(UI_StackTable a)\r\n    `$(a.manual_impl == \"\" -> \"internal \" .. a.type .. \" ui_bottom_\" .. a.name_lower .. \"(void) { UI_StackBottomImpl(ui_state, \" .. a.name .. \", \" .. a.name_lower .. \") }\")`;\r\n  @expand(UI_StackTable a)\r\n    `$(a.manual_impl == \"\" -> \"internal \" .. a.type .. \" ui_push_\" .. a.name_lower .. \"(\" .. a.type .. \" v) { UI_StackPushImpl(ui_state, \" .. a.name .. \", \" .. a.name_lower .. \", \" .. a.type .. \", v) }\")`;\r\n  @expand(UI_StackTable a)\r\n    `$(a.manual_impl == \"\" -> \"internal \" .. a.type .. \" ui_pop_\" .. a.name_lower .. \"(void) { UI_StackPopImpl(ui_state, \" .. a.name .. \", \" .. a.name_lower .. \") }\")`;\r\n  @expand(UI_StackTable a)\r\n    `$(a.manual_impl == \"\" -> \"internal \" .. a.type .. \" ui_set_next_\" .. a.name_lower .. \"(\" .. a.type .. \" v) { UI_StackSetNextImpl(ui_state, \" .. a.name .. \", \" .. a.name_lower .. \", \" .. a.type .. \", v) }\")`;\r\n}\r\n"
  },
  {
    "path": "src/ui/ui_basic_widgets.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Widgets\r\n\r\ninternal void\r\nui_divider(UI_Size size)\r\n{\r\n  UI_Box *parent = ui_top_parent();\r\n  ui_set_next_pref_size(parent->child_layout_axis, size);\r\n  ui_set_next_child_layout_axis(parent->child_layout_axis);\r\n  UI_Box *box = ui_build_box_from_key(0, ui_key_zero());\r\n  UI_Parent(box) UI_Padding(ui_pct(0.5f, 0.5f))\r\n    UI_PrefSize(parent->child_layout_axis, ui_em(0.1f, 1.f))\r\n    UI_BackgroundColor(ui_color_from_name(str8_lit(\"border\")))\r\n  {\r\n    ui_set_next_child_layout_axis(axis2_flip(parent->child_layout_axis));\r\n    UI_Box *spacing_parent = ui_build_box_from_key(0, ui_key_zero());\r\n    UI_Parent(spacing_parent) UI_Padding(ui_em(1.f, 1.f)) UI_PrefSize(axis2_flip(parent->child_layout_axis), ui_pct(1, 0))\r\n    {\r\n      ui_build_box_from_key(UI_BoxFlag_DrawBackground, ui_key_zero());\r\n    }\r\n  }\r\n}\r\n\r\ninternal UI_Signal\r\nui_label(String8 string)\r\n{\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_DrawText, str8_zero());\r\n  ui_box_equip_display_string(box, string);\r\n  UI_Signal interact = ui_signal_from_box(box);\r\n  return interact;\r\n}\r\n\r\ninternal UI_Signal\r\nui_labelf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal result = ui_label(string);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal void\r\nui_label_multiline(F32 max, String8 string)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  ui_set_next_child_layout_axis(Axis2_Y);\r\n  ui_set_next_pref_height(ui_children_sum(1));\r\n  UI_Box *box = ui_build_box_from_key(0, ui_key_zero());\r\n  String8List lines = fnt_wrapped_string_lines_from_font_size_string_max(scratch.arena, ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), string, max);\r\n  for(String8Node *n = lines.first; n != 0; n = n->next)\r\n  {\r\n    ui_label(n->string);\r\n  }\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nui_label_multilinef(F32 max, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  ui_label_multiline(max, string);\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal UI_Signal\r\nui_button(String8 string)\r\n{\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|\r\n                                         UI_BoxFlag_DrawBackground|\r\n                                         UI_BoxFlag_DrawBorder|\r\n                                         UI_BoxFlag_DrawText|\r\n                                         UI_BoxFlag_DrawHotEffects|\r\n                                         UI_BoxFlag_DrawActiveEffects,\r\n                                         string);\r\n  UI_Signal interact = ui_signal_from_box(box);\r\n  return interact;\r\n}\r\n\r\ninternal UI_Signal\r\nui_buttonf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal result = ui_button(string);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal UI_Signal\r\nui_hover_label(String8 string)\r\n{\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string);\r\n  UI_Signal interact = ui_signal_from_box(box);\r\n  if(ui_hovering(interact))\r\n  {\r\n    box->flags |= UI_BoxFlag_DrawBorder;\r\n  }\r\n  return interact;\r\n}\r\n\r\ninternal UI_Signal\r\nui_hover_labelf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = ui_hover_label(string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\ntypedef struct UI_LineEditDrawData UI_LineEditDrawData;\r\nstruct UI_LineEditDrawData\r\n{\r\n  String8 edited_string;\r\n  TxtPt cursor;\r\n  TxtPt mark;\r\n  B32 trail;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(ui_line_edit_draw)\r\n{\r\n  UI_LineEditDrawData *draw_data = (UI_LineEditDrawData *)user_data;\r\n  FNT_Tag font = box->font;\r\n  F32 font_size = box->font_size;\r\n  F32 tab_size = box->tab_size;\r\n  Vec4F32 cursor_color = ui_color_from_tags_key_name(box->tags_key, str8_lit(\"cursor\"));\r\n  cursor_color.w *= box->parent->parent->focus_active_t;\r\n  Vec4F32 select_color = ui_color_from_tags_key_name(box->tags_key, str8_lit(\"selection\"));\r\n  select_color.w *= (box->parent->parent->focus_active_t*0.2f + 0.8f);\r\n  Vec4F32 trail_color = cursor_color;\r\n  trail_color.w *= 0.25f;\r\n  Vec2F32 text_position = ui_box_text_position(box);\r\n  String8 edited_string = draw_data->edited_string;\r\n  TxtPt cursor = draw_data->cursor;\r\n  TxtPt mark = draw_data->mark;\r\n  F32 cursor_pixel_off = fnt_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, cursor.column-1)).x;\r\n  F32 cursor_pixel_off__animated = ui_anim(ui_key_from_stringf(box->key, \"cursor_off_px\"), cursor_pixel_off);\r\n  F32 mark_pixel_off   = fnt_dim_from_tag_size_string(font, font_size, 0, tab_size, str8_prefix(edited_string, mark.column-1)).x;\r\n  F32 cursor_thickness = ClampBot(1.f, floor_f32(font_size/10.f));\r\n  Rng2F32 cursor_rect =\r\n  {\r\n    text_position.x + cursor_pixel_off,\r\n    box->parent->parent->rect.y0+ui_top_font_size()*0.5f,\r\n    text_position.x + cursor_pixel_off + cursor_thickness,\r\n    box->parent->parent->rect.y1-ui_top_font_size()*0.5f,\r\n  };\r\n  Rng1F32 trail_off_span = r1f32(cursor_pixel_off, cursor_pixel_off__animated);\r\n  Rng2F32 trail_rect =\r\n  {\r\n    text_position.x + trail_off_span.min,\r\n    cursor_rect.y0,\r\n    text_position.x + trail_off_span.max,\r\n    cursor_rect.y1,\r\n  };\r\n  Rng2F32 mark_rect =\r\n  {\r\n    text_position.x + mark_pixel_off - cursor_thickness,\r\n    box->parent->parent->rect.y0+ui_top_font_size()*0.5f,\r\n    text_position.x + mark_pixel_off + cursor_thickness,\r\n    box->parent->parent->rect.y1-ui_top_font_size()*0.5f,\r\n  };\r\n  Rng2F32 select_rect = union_2f32(cursor_rect, mark_rect);\r\n  dr_rect(select_rect, select_color, font_size/2.f, 0, 1.f);\r\n  dr_rect(cursor_rect, cursor_color, 0.f, 0, 0.f);\r\n  if(draw_data->trail)\r\n  {\r\n    R_Rect2DInst *trail_inst = dr_rect(trail_rect, trail_color, ui_top_font_size()*0.2f, 0, 1.f);\r\n    if(cursor_pixel_off > cursor_pixel_off__animated)\r\n    {\r\n      trail_inst->colors[Corner_00].w *= 0.1f;\r\n      trail_inst->colors[Corner_01].w *= 0.1f;\r\n    }\r\n    else\r\n    {\r\n      trail_inst->colors[Corner_10].w *= 0.1f;\r\n      trail_inst->colors[Corner_11].w *= 0.1f;\r\n    }\r\n  }\r\n}\r\n\r\ninternal UI_Signal\r\nui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string)\r\n{\r\n  //- rjf: make key\r\n  UI_Key key = ui_key_from_string(ui_active_seed_key(), string);\r\n  \r\n  //- rjf: calculate focus\r\n  B32 is_auto_focus_hot = ui_is_key_auto_focus_hot(key);\r\n  B32 is_auto_focus_active = ui_is_key_auto_focus_active(key);\r\n  ui_push_focus_hot(is_auto_focus_hot ? UI_FocusKind_On : UI_FocusKind_Null);\r\n  ui_push_focus_active(is_auto_focus_active ? UI_FocusKind_On : UI_FocusKind_Null);\r\n  B32 is_focus_hot    = ui_is_focus_hot();\r\n  B32 is_focus_active = ui_is_focus_active();\r\n  B32 is_focus_hot_disabled = (!is_focus_hot && ui_top_focus_hot() == UI_FocusKind_On);\r\n  B32 is_focus_active_disabled = (!is_focus_active && ui_top_focus_active() == UI_FocusKind_On);\r\n  \r\n  //- rjf: build top-level box\r\n  ui_set_next_hover_cursor(is_focus_active ? OS_Cursor_IBar : OS_Cursor_Pointer);\r\n  UI_Box *box = ui_build_box_from_key(UI_BoxFlag_DrawBackground|\r\n                                      UI_BoxFlag_DrawBorder|\r\n                                      UI_BoxFlag_MouseClickable|\r\n                                      UI_BoxFlag_ClickToFocus|\r\n                                      ((is_auto_focus_hot || is_auto_focus_active)*UI_BoxFlag_KeyboardClickable)|\r\n                                      UI_BoxFlag_DrawHotEffects|\r\n                                      (is_focus_active || is_focus_active_disabled)*(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowX|UI_BoxFlag_ViewClamp),\r\n                                      key);\r\n  \r\n  //- rjf: take navigation actions for editing\r\n  B32 changes_made = 0;\r\n  if(is_focus_active)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n    {\r\n      String8 edit_string = str8(edit_buffer, edit_string_size_out[0]);\r\n      \r\n      // rjf: do not consume anything that doesn't fit a single-line's operations\r\n      if((evt->kind != UI_EventKind_Edit && evt->kind != UI_EventKind_Navigate && evt->kind != UI_EventKind_Text) || evt->delta_2s32.y != 0)\r\n      {\r\n        continue;\r\n      }\r\n      \r\n      // rjf: map this action to an op\r\n      UI_TxtOp op = ui_single_line_txt_op_from_event(scratch.arena, evt, edit_string, *cursor, *mark);\r\n      \r\n      // rjf: perform replace range\r\n      if(!txt_pt_match(op.range.min, op.range.max) || op.replace.size != 0)\r\n      {\r\n        String8 new_string = ui_push_string_replace_range(scratch.arena, edit_string, r1s64(op.range.min.column, op.range.max.column), op.replace);\r\n        new_string.size = Min(edit_buffer_size, new_string.size);\r\n        MemoryCopy(edit_buffer, new_string.str, new_string.size);\r\n        edit_string_size_out[0] = new_string.size;\r\n      }\r\n      \r\n      // rjf: perform copy\r\n      if(op.flags & UI_TxtOpFlag_Copy)\r\n      {\r\n        os_set_clipboard_text(op.copy);\r\n      }\r\n      \r\n      // rjf: commit op's changed cursor & mark to caller-provided state\r\n      *cursor = op.cursor;\r\n      *mark = op.mark;\r\n      \r\n      // rjf: consume event\r\n      {\r\n        ui_eat_event(evt);\r\n        changes_made = 1;\r\n      }\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //- rjf: build contents\r\n  TxtPt mouse_pt = {0};\r\n  F32 cursor_off = 0;\r\n  UI_Parent(box)\r\n  {\r\n    String8 edit_string = str8(edit_buffer, edit_string_size_out[0]);\r\n    if(!is_focus_active && !is_focus_active_disabled)\r\n    {\r\n      String8 display_string = ui_display_part_from_key_string(string);\r\n      if(pre_edit_value.size != 0)\r\n      {\r\n        display_string = pre_edit_value;\r\n      }\r\n      ui_label(display_string);\r\n    }\r\n    else\r\n    {\r\n      F32 total_text_width = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), edit_string).x;\r\n      ui_set_next_pref_width(ui_px(total_text_width+ui_top_font_size()*5, 1.f));\r\n      UI_Box *editstr_box = ui_build_box_from_stringf(UI_BoxFlag_DrawText|UI_BoxFlag_DisableTextTrunc, \"###editstr\");\r\n      UI_LineEditDrawData *draw_data = push_array(ui_build_arena(), UI_LineEditDrawData, 1);\r\n      draw_data->edited_string = push_str8_copy(ui_build_arena(), edit_string);\r\n      draw_data->cursor = *cursor;\r\n      draw_data->mark = *mark;\r\n      draw_data->trail = 1;\r\n      ui_box_equip_display_string(editstr_box, edit_string);\r\n      ui_box_equip_custom_draw(editstr_box, ui_line_edit_draw, draw_data);\r\n      mouse_pt = txt_pt(1, 1+ui_box_char_pos_from_xy(editstr_box, ui_mouse()));\r\n      cursor_off = fnt_dim_from_tag_size_string(ui_top_font(), ui_top_font_size(), 0, ui_top_tab_size(), str8_prefix(edit_string, cursor->column-1)).x;\r\n    }\r\n  }\r\n  \r\n  //- rjf: interact\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  if(!is_focus_active && sig.f&(UI_SignalFlag_DoubleClicked|UI_SignalFlag_KeyboardPressed))\r\n  {\r\n    String8 edit_string = pre_edit_value;\r\n    edit_string.size = Min(edit_buffer_size, pre_edit_value.size);\r\n    MemoryCopy(edit_buffer, edit_string.str, edit_string.size);\r\n    edit_string_size_out[0] = edit_string.size;\r\n    ui_set_auto_focus_active_key(key);\r\n    ui_kill_action();\r\n    *cursor = txt_pt(1, edit_string.size+1);\r\n    *mark = txt_pt(1, 1);\r\n  }\r\n  if(is_focus_active && sig.f&UI_SignalFlag_KeyboardPressed)\r\n  {\r\n    ui_set_auto_focus_active_key(ui_key_zero());\r\n    sig.f |= UI_SignalFlag_Commit;\r\n  }\r\n  if(is_focus_active && ui_dragging(sig))\r\n  {\r\n    if(ui_pressed(sig))\r\n    {\r\n      *mark = mouse_pt;\r\n    }\r\n    *cursor = mouse_pt;\r\n  }\r\n  \r\n  //- rjf: focus cursor\r\n  {\r\n    Rng1F32 cursor_range_px  = r1f32(cursor_off-ui_top_font_size()*2.f, cursor_off+ui_top_font_size()*2.f);\r\n    Rng1F32 visible_range_px = r1f32(box->view_off_target.x, box->view_off_target.x + dim_2f32(box->rect).x);\r\n    cursor_range_px.min = ClampBot(0, cursor_range_px.min);\r\n    cursor_range_px.max = ClampBot(0, cursor_range_px.max);\r\n    F32 min_delta = cursor_range_px.min-visible_range_px.min;\r\n    F32 max_delta = cursor_range_px.max-visible_range_px.max;\r\n    min_delta = Min(min_delta, 0);\r\n    max_delta = Max(max_delta, 0);\r\n    box->view_off_target.x += min_delta;\r\n    box->view_off_target.x += max_delta;\r\n  }\r\n  \r\n  //- rjf: pop focus\r\n  ui_pop_focus_hot();\r\n  ui_pop_focus_active();\r\n  \r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_line_editf(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal result = ui_line_edit(cursor, mark, edit_buffer, edit_buffer_size, edit_string_size_out, pre_edit_value, string);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Images\r\n\r\ntypedef struct UI_ImageDrawData UI_ImageDrawData;\r\nstruct UI_ImageDrawData\r\n{\r\n  R_Handle texture;\r\n  R_Tex2DSampleKind sample_kind;\r\n  Rng2F32 region;\r\n  Vec4F32 tint;\r\n  F32 blur;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(ui_image_draw)\r\n{\r\n  UI_ImageDrawData *draw_data = (UI_ImageDrawData *)user_data;\r\n  if(r_handle_match(draw_data->texture, r_handle_zero()))\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(box->rect, v4f32(0, 0, 0, 0), 0, 0, 1.f);\r\n    MemoryCopyArray(inst->corner_radii, box->corner_radii);\r\n  }\r\n  else DR_Tex2DSampleKindScope(draw_data->sample_kind)\r\n  {\r\n    R_Rect2DInst *inst = dr_img(box->rect, draw_data->region, draw_data->texture, draw_data->tint, 0, 0, 0);\r\n    MemoryCopyArray(inst->corner_radii, box->corner_radii);\r\n  }\r\n  if(draw_data->blur > 0.01f)\r\n  {\r\n    Rng2F32 clip = box->rect;\r\n    for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent)\r\n    {\r\n      if(b->flags & UI_BoxFlag_Clip)\r\n      {\r\n        clip = intersect_2f32(b->rect, clip);\r\n      }\r\n    }\r\n    R_PassParams_Blur *blur = dr_blur(intersect_2f32(clip, box->rect), draw_data->blur, 0);\r\n    MemoryCopyArray(blur->corner_radii, box->corner_radii);\r\n  }\r\n}\r\n\r\ninternal UI_Signal\r\nui_image(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, String8 string)\r\n{\r\n  UI_Box *box = ui_build_box_from_string(0, string);\r\n  UI_ImageDrawData *draw_data = push_array(ui_build_arena(), UI_ImageDrawData, 1);\r\n  draw_data->texture = texture;\r\n  draw_data->sample_kind = sample_kind;\r\n  draw_data->region = region;\r\n  draw_data->tint = tint;\r\n  draw_data->blur = blur;\r\n  ui_box_equip_custom_draw(box, ui_image_draw, draw_data);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal result = ui_image(texture, sample_kind, region, tint, blur, string);\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Special Buttons\r\n\r\ninternal UI_Signal\r\nui_expander(B32 is_expanded, String8 string)\r\n{\r\n  ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n  ui_set_next_text_alignment(UI_TextAlign_Center);\r\n  ui_set_next_font(ui_icon_font());\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawText, string);\r\n  ui_box_equip_display_string(box, is_expanded ? str8_lit(\"v\") : str8_lit(\">\"));\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_expanderf(B32 is_expanded, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = ui_expander(is_expanded, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_sort_header(B32 sorting, B32 ascending, String8 string)\r\n{\r\n  ui_set_next_child_layout_axis(Axis2_X);\r\n  ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawActiveEffects, string);\r\n  ui_push_parent(box);\r\n  \r\n  // rjf: make icon\r\n  if(sorting)\r\n  {\r\n    ui_set_next_pref_width(ui_em(1.8f, 1.f));\r\n    ui_set_next_text_alignment(UI_TextAlign_Center);\r\n    ui_set_next_font(ui_icon_font());\r\n    UI_Box *icon = ui_build_box_from_string(UI_BoxFlag_DrawText, str8_lit(\"\"));\r\n    ui_box_equip_display_string(icon, ascending ? str8_lit(\"^\") : str8_lit(\"v\"));\r\n  }\r\n  \r\n  // rjf: make text\r\n  {\r\n    ui_label(string);\r\n  }\r\n  \r\n  ui_pop_parent();\r\n  UI_Signal interact = ui_signal_from_box(box);\r\n  return interact;\r\n}\r\n\r\ninternal UI_Signal\r\nui_sort_headerf(B32 sorting, B32 ascending, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = ui_sort_header(sorting, ascending, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Color Pickers\r\n\r\n//- rjf: tooltips\r\n\r\ninternal void\r\nui_do_color_tooltip_hsv(Vec3F32 hsv)\r\n{\r\n  Vec3F32 rgb = rgb_from_hsv(hsv);\r\n  UI_Tooltip UI_Padding(ui_em(2.f, 1.f))\r\n  {\r\n    UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) UI_Row UI_Padding(ui_pct(1, 0))\r\n    {\r\n      UI_BackgroundColor(linear_from_srgba(v4f32(rgb.x, rgb.y, rgb.z, 1.f)))\r\n        UI_CornerRadius(4.f)\r\n        UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f))\r\n        ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit(\"\"));\r\n    }\r\n    ui_spacer(ui_em(0.3f, 1.f));\r\n    UI_PrefWidth(ui_em(22.f, 1.f)) UI_TextAlignment(UI_TextAlign_Center)\r\n    {\r\n      ui_labelf(\"Hex: #%02x%02x%02x\", (U8)(rgb.x*255.f), (U8)(rgb.y*255.f), (U8)(rgb.z*255.f));\r\n    }\r\n    ui_spacer(ui_em(0.3f, 1.f));\r\n    UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_children_sum(1)) UI_Row\r\n    {\r\n      UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f))\r\n      {\r\n        ui_labelf(\"Red: %.2f\", rgb.x);\r\n        ui_labelf(\"Green: %.2f\", rgb.y);\r\n        ui_labelf(\"Blue: %.2f\", rgb.z);\r\n      }\r\n      UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f))\r\n      {\r\n        ui_labelf(\"Hue: %.2f\", hsv.x);\r\n        ui_labelf(\"Sat: %.2f\", hsv.y);\r\n        ui_labelf(\"Val: %.2f\", hsv.z);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nui_do_color_tooltip_hsva(Vec4F32 hsva)\r\n{\r\n  Vec3F32 hsv = v3f32(hsva.x, hsva.y, hsva.z);\r\n  Vec3F32 rgb = rgb_from_hsv(hsv);\r\n  Vec4F32 rgba = v4f32(rgb.x, rgb.y, rgb.z, hsva.w);\r\n  UI_Tooltip UI_Padding(ui_em(2.f, 1.f))\r\n  {\r\n    UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f)) UI_Row UI_Padding(ui_pct(1, 0))\r\n    {\r\n      UI_BackgroundColor(linear_from_srgba(rgba))\r\n        UI_CornerRadius(4.f)\r\n        UI_PrefWidth(ui_em(6.f, 1.f)) UI_PrefHeight(ui_em(6.f, 1.f))\r\n        ui_build_box_from_string(UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, str8_lit(\"\"));\r\n    }\r\n    ui_spacer(ui_em(0.3f, 1.f));\r\n    UI_PrefWidth(ui_em(22.f, 1.f)) UI_TextAlignment(UI_TextAlign_Center)\r\n    {\r\n      ui_labelf(\"Hex: #%02x%02x%02x%02x\", (U8)(rgba.x*255.f), (U8)(rgba.y*255.f), (U8)(rgba.z*255.f), (U8)(rgba.w*255.f));\r\n    }\r\n    ui_spacer(ui_em(0.3f, 1.f));\r\n    UI_PrefWidth(ui_em(22.f, 1.f)) UI_PrefHeight(ui_children_sum(1)) UI_Row\r\n    {\r\n      UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f))\r\n      {\r\n        ui_labelf(\"Red: %.2f\", rgba.x);\r\n        ui_labelf(\"Green: %.2f\", rgba.y);\r\n        ui_labelf(\"Blue: %.2f\", rgba.z);\r\n        ui_labelf(\"Alpha: %.2f\", rgba.w);\r\n      }\r\n      UI_WidthFill UI_Column UI_PrefHeight(ui_em(1.8f, 1.f))\r\n      {\r\n        ui_labelf(\"Hue: %.2f\", hsva.x);\r\n        ui_labelf(\"Sat: %.2f\", hsva.y);\r\n        ui_labelf(\"Val: %.2f\", hsva.z);\r\n        ui_labelf(\"Alpha: %.2f\", hsva.w);\r\n      }\r\n    }\r\n  }\r\n}\r\n\r\n//- rjf: saturation/value picker\r\n\r\ntypedef struct UI_SatValDrawData UI_SatValDrawData;\r\nstruct UI_SatValDrawData\r\n{\r\n  F32 hue;\r\n  F32 sat;\r\n  F32 val;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(ui_sat_val_picker_draw)\r\n{\r\n  UI_SatValDrawData *data = (UI_SatValDrawData *)user_data;\r\n  \r\n  // rjf: hue => rgb\r\n  Vec3F32 hue_rgb = rgb_from_hsv(v3f32(data->hue, 1, 1));\r\n  Vec3F32 hue_rgb_linear = linear_from_srgb(hue_rgb);\r\n  \r\n  // rjf: rgb background\r\n  {\r\n    dr_rect(pad_2f32(box->rect, -1.f), v4f32(hue_rgb_linear.x, hue_rgb_linear.y, hue_rgb_linear.z, 1), 4.f, 0, 1.f);\r\n  }\r\n  \r\n  // rjf: white gradient overlay\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, -1.f), v4f32(hue_rgb_linear.x, hue_rgb_linear.y, hue_rgb_linear.z, 0), 4.f, 0, 1.f);\r\n    inst->colors[Corner_00] = inst->colors[Corner_01] = v4f32(1, 1, 1, 1);\r\n  }\r\n  \r\n  // rjf: black gradient overlay pt. 1\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, -1.f), v4f32(0, 0, 0, 0), 4.f, 0, 1.f);\r\n    inst->colors[Corner_01] = v4f32(0, 0, 0, 1.f);\r\n    inst->colors[Corner_11] = v4f32(0, 0, 0, 1.f);\r\n  }\r\n  \r\n  // rjf: black gradient overlay pt. 2\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, -1.f), v4f32(0, 0, 0, 0), 4.f, 0, 1.f);\r\n    inst->colors[Corner_01] = v4f32(0, 0, 0, 1);\r\n    inst->colors[Corner_11] = v4f32(0, 0, 0, 1);\r\n  }\r\n  \r\n  // rjf: black gradient overlay pt. 3\r\n  {\r\n    R_Rect2DInst *inst = dr_rect(pad_2f32(box->rect, -1.f), v4f32(0, 0, 0, 0), 4.f, 0, 1.f);\r\n    inst->colors[Corner_01] = v4f32(0, 0, 0, 0.2f);\r\n    inst->colors[Corner_11] = v4f32(0, 0, 0, 0.2f);\r\n  }\r\n  \r\n  // rjf: indicator\r\n  {\r\n    Vec2F32 box_rect_dim = dim_2f32(box->rect);\r\n    Vec2F32 center = v2f32(box->rect.x0 + data->sat*box_rect_dim.x, box->rect.y0 + (1-data->val)*box_rect_dim.y);\r\n    F32 half_size = box->font_size * (0.5f + box->active_t*0.2f);\r\n    Rng2F32 rect = r2f32p(center.x - half_size,\r\n                          center.y - half_size,\r\n                          center.x + half_size,\r\n                          center.y + half_size);\r\n    dr_rect(rect, v4f32(1, 1, 1, 1), half_size/2.f, 2.f, 1.f);\r\n  }\r\n}\r\n\r\ninternal UI_Signal\r\nui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string)\r\n{\r\n  // rjf: build & interact\r\n  ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string);\r\n  UI_SatValDrawData *user = push_array(ui_build_arena(), UI_SatValDrawData, 1);\r\n  ui_box_equip_custom_draw(box, ui_sat_val_picker_draw, user);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  \r\n  // rjf: click+draw behavior\r\n  if(ui_dragging(sig))\r\n  {\r\n    Vec2F32 dim = dim_2f32(box->rect);\r\n    *out_sat = (ui_mouse().x - box->rect.x0) / dim.x;\r\n    *out_val = 1 - (ui_mouse().y - box->rect.y0) / dim.y;\r\n    *out_sat = Clamp(0, *out_sat, 1);\r\n    *out_val = Clamp(0, *out_val, 1);\r\n    ui_do_color_tooltip_hsv(v3f32(hue, *out_sat, *out_val));\r\n    if(ui_pressed(sig))\r\n    {\r\n      Vec2F32 data = v2f32(*out_sat, *out_val);\r\n      ui_store_drag_struct(&data);\r\n    }\r\n    if(ui_slot_press(UI_EventActionSlot_Cancel))\r\n    {\r\n      Vec2F32 data = *ui_get_drag_struct(Vec2F32);\r\n      *out_sat = data.x;\r\n      *out_val = data.y;\r\n      ui_kill_action();\r\n    }\r\n  }\r\n  \r\n  // rjf: fill draw data\r\n  {\r\n    user->hue = hue;\r\n    user->sat = *out_sat;\r\n    user->val = *out_val;\r\n  }\r\n  \r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_sat_val_pickerf(F32 hue, F32 *out_sat, F32 *out_val, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = ui_sat_val_picker(hue, out_sat, out_val, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\n//- rjf: hue picker\r\n\r\ntypedef struct UI_HueDrawData UI_HueDrawData;\r\nstruct UI_HueDrawData\r\n{\r\n  F32 hue;\r\n  F32 sat;\r\n  F32 val;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(ui_hue_picker_draw)\r\n{\r\n  UI_HueDrawData *data = (UI_HueDrawData *)user_data;\r\n  Vec2F32 dim = dim_2f32(box->rect);\r\n  F32 segment_dim = floor_f32(dim.y/6.f);\r\n  Rng2F32 hue_cycle_rect = box->rect;\r\n  Vec2F32 hue_cycle_center = center_2f32(hue_cycle_rect);\r\n  hue_cycle_rect.x0 += (hue_cycle_center.x - hue_cycle_rect.x0) * 0.3f;\r\n  hue_cycle_rect.x1 += (hue_cycle_center.x - hue_cycle_rect.x1) * 0.3f;\r\n  Rng2F32 rect = r2f32p(hue_cycle_rect.x0,\r\n                        hue_cycle_rect.y0,\r\n                        hue_cycle_rect.x1,\r\n                        hue_cycle_rect.y0 + segment_dim);\r\n  for(int seg = 0; seg < 6; seg += 1)\r\n  {\r\n    F32 hue0 = (F32)(seg)/6;\r\n    F32 hue1 = (F32)(seg+1)/6;\r\n    Vec3F32 rgb0 = rgb_from_hsv(v3f32(hue0, 1, 1));\r\n    Vec3F32 rgb1 = rgb_from_hsv(v3f32(hue1, 1, 1));\r\n    Vec4F32 rgba0_linear = linear_from_srgba(v4f32(rgb0.x, rgb0.y, rgb0.z, 1));\r\n    Vec4F32 rgba1_linear = linear_from_srgba(v4f32(rgb1.x, rgb1.y, rgb1.z, 1));\r\n    R_Rect2DInst *inst = dr_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 0.f);\r\n    inst->colors[Corner_00] = rgba0_linear;\r\n    inst->colors[Corner_01] = rgba1_linear;\r\n    inst->colors[Corner_10] = rgba0_linear;\r\n    inst->colors[Corner_11] = rgba1_linear;\r\n    rect.y0 += segment_dim;\r\n    rect.y1 += segment_dim;\r\n  }\r\n  \r\n  // rjf: indicator\r\n  {\r\n    Vec2F32 box_rect_dim = dim_2f32(box->rect);\r\n    Vec2F32 center = v2f32((box->rect.x0+box->rect.x1)/2, box->rect.y0 + (data->hue)*box_rect_dim.y);\r\n    F32 half_size = box_rect_dim.x * (0.52f + 0.02f * box->active_t);\r\n    Rng2F32 rect = r2f32p(center.x - half_size,\r\n                          center.y - box->font_size * (0.5f + 0.1f * box->active_t),\r\n                          center.x + half_size,\r\n                          center.y + box->font_size * (0.5f + 0.1f * box->active_t));\r\n    dr_rect(rect, v4f32(1, 1, 1, 1), 1.f, 2.f, 1.f);\r\n  }\r\n}\r\n\r\ninternal UI_Signal\r\nui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string)\r\n{\r\n  // rjf: build & interact\r\n  ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string);\r\n  UI_HueDrawData *user = push_array(ui_build_arena(), UI_HueDrawData, 1);\r\n  ui_box_equip_custom_draw(box, ui_hue_picker_draw, user);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  \r\n  // rjf: click+draw behavior\r\n  if(ui_dragging(sig))\r\n  {\r\n    Vec2F32 dim = dim_2f32(box->rect);\r\n    *out_hue = (ui_mouse().y - box->rect.y0) / dim.y;\r\n    *out_hue = Clamp(0, *out_hue, 1);\r\n    ui_do_color_tooltip_hsv(v3f32(*out_hue, sat, val));\r\n    if(ui_pressed(sig))\r\n    {\r\n      ui_store_drag_struct(out_hue);\r\n    }\r\n    if(ui_slot_press(UI_EventActionSlot_Cancel))\r\n    {\r\n      *out_hue = *ui_get_drag_struct(F32);\r\n      ui_kill_action();\r\n    }\r\n  }\r\n  \r\n  // rjf: fill draw data\r\n  {\r\n    user->hue = *out_hue;\r\n    user->sat = sat;\r\n    user->val = val;\r\n  }\r\n  \r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_hue_pickerf(F32 *out_hue, F32 sat, F32 val, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = ui_hue_picker(out_hue, sat, val, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\n//- rjf: alpha picker\r\n\r\ntypedef struct UI_AlphaDrawData UI_AlphaDrawData;\r\nstruct UI_AlphaDrawData\r\n{\r\n  F32 alpha;\r\n};\r\n\r\ninternal UI_BOX_CUSTOM_DRAW(ui_alpha_picker_draw)\r\n{\r\n  UI_AlphaDrawData *data = (UI_AlphaDrawData *)user_data;\r\n  Vec2F32 dim = dim_2f32(box->rect);\r\n  \r\n  // rjf: build gradient\r\n  {\r\n    Rng2F32 rect = box->rect;\r\n    Vec2F32 center = center_2f32(rect);\r\n    rect.x0 += (center.x - rect.x0) * 0.3f;\r\n    rect.x1 += (center.x - rect.x1) * 0.3f;\r\n    R_Rect2DInst *inst = dr_rect(rect, v4f32(0, 0, 0, 0), 0, 0, 0);\r\n    inst->colors[Corner_00] = inst->colors[Corner_10] = v4f32(1, 1, 1, 1);\r\n  }\r\n  \r\n  // rjf: indicator\r\n  {\r\n    Vec2F32 box_rect_dim = dim_2f32(box->rect);\r\n    Vec2F32 center = v2f32((box->rect.x0+box->rect.x1)/2, box->rect.y0 + (1-data->alpha)*box_rect_dim.y);\r\n    F32 half_size = box_rect_dim.x * (0.52f + 0.02f * box->active_t);\r\n    Rng2F32 rect = r2f32p(center.x - half_size,\r\n                          center.y - box->font_size * (0.5f + 0.1f * box->active_t),\r\n                          center.x + half_size,\r\n                          center.y + box->font_size * (0.5f + 0.1f * box->active_t));\r\n    dr_rect(rect, v4f32(1, 1, 1, 1), 1.f, 2.f, 1.f);\r\n  }\r\n}\r\n\r\ninternal UI_Signal\r\nui_alpha_picker(F32 *out_alpha, String8 string)\r\n{\r\n  // rjf: build & interact\r\n  ui_set_next_hover_cursor(OS_Cursor_HandPoint);\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable, string);\r\n  UI_AlphaDrawData *user = push_array(ui_build_arena(), UI_AlphaDrawData, 1);\r\n  ui_box_equip_custom_draw(box, ui_alpha_picker_draw, user);\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  \r\n  // rjf: click+draw behavior\r\n  if(ui_dragging(sig))\r\n  {\r\n    Vec2F32 dim = dim_2f32(box->rect);\r\n    F32 drag_pct = (ui_mouse().y - box->rect.y0) / dim.y; \r\n    drag_pct = Clamp(0, drag_pct, 1);\r\n    *out_alpha = 1-drag_pct;\r\n    if(ui_pressed(sig))\r\n    {\r\n      ui_store_drag_struct(out_alpha);\r\n    }\r\n    if(ui_slot_press(UI_EventActionSlot_Cancel))\r\n    {\r\n      *out_alpha = *ui_get_drag_struct(F32);\r\n      ui_kill_action();\r\n    }\r\n  }\r\n  \r\n  // rjf: fill draw data\r\n  {\r\n    user->alpha = *out_alpha;\r\n  }\r\n  \r\n  return sig;\r\n}\r\n\r\ninternal UI_Signal\r\nui_alpha_pickerf(F32 *out_alpha, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Signal sig = ui_alpha_picker(out_alpha, string);\r\n  scratch_end(scratch);\r\n  return sig;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Simple Layout Widgets\r\n\r\ninternal UI_Box *ui_row_begin(void)    { return ui_named_row_begin(str8_lit(\"\")); }\r\ninternal UI_Signal ui_row_end(void)    { return ui_named_row_end(); }\r\ninternal UI_Box *ui_column_begin(void) { return ui_named_column_begin(str8_lit(\"\")); }\r\ninternal UI_Signal ui_column_end(void) { return ui_named_column_end(); }\r\n\r\ninternal UI_Box *\r\nui_named_row_begin(String8 string)\r\n{\r\n  ui_set_next_child_layout_axis(Axis2_X);\r\n  UI_Box *box = ui_build_box_from_string(0, string);\r\n  ui_push_parent(box);\r\n  return box;\r\n}\r\n\r\ninternal UI_Signal\r\nui_named_row_end(void)\r\n{\r\n  UI_Box *box = ui_pop_parent();\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\ninternal UI_Box *\r\nui_named_column_begin(String8 string)\r\n{\r\n  ui_set_next_child_layout_axis(Axis2_Y);\r\n  UI_Box *box = ui_build_box_from_string(0, string);\r\n  ui_push_parent(box);\r\n  return box;\r\n}\r\n\r\ninternal UI_Signal\r\nui_named_column_end(void)\r\n{\r\n  UI_Box *box = ui_pop_parent();\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Floating Panes\r\n\r\ninternal UI_Box *\r\nui_pane_begin(Rng2F32 rect, String8 string)\r\n{\r\n  ui_push_rect(rect);\r\n  ui_set_next_child_layout_axis(Axis2_Y);\r\n  UI_Box *box = ui_build_box_from_string(UI_BoxFlag_Clickable|UI_BoxFlag_Clip|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground, string);\r\n  ui_pop_rect();\r\n  ui_push_parent(box);\r\n  ui_push_pref_width(ui_pct(1, 0));\r\n  return box;\r\n}\r\n\r\ninternal UI_Box *\r\nui_pane_beginf(Rng2F32 rect, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Box *box = ui_pane_begin(rect, string);\r\n  scratch_end(scratch);\r\n  return box;\r\n}\r\n\r\ninternal UI_Signal\r\nui_pane_end(void)\r\n{\r\n  ui_pop_pref_width();\r\n  UI_Box *box = ui_pop_parent();\r\n  UI_Signal sig = ui_signal_from_box(box);\r\n  return sig;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Tables\r\n\r\nthread_static U64 ui_ts_col_pct_count = 0;\r\nthread_static F32 *ui_ts_col_pcts_stable = 0;\r\nthread_static U64 ui_ts_vector_idx = 0;\r\nthread_static U64 ui_ts_cell_idx = 0;\r\n\r\ninternal void\r\nui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string)\r\n{\r\n  //- rjf: store off persistent, user-provided column info\r\n  ui_ts_col_pct_count = column_pct_count;\r\n  \r\n  //- rjf: build main table parent\r\n  ui_set_next_pref_height(ui_children_sum(1));\r\n  ui_set_next_child_layout_axis(Axis2_Y);\r\n  UI_Box *table = ui_build_box_from_string(0, string);\r\n  ui_push_parent(table);\r\n  \r\n  //- rjf: build column boundaries\r\n  F32 x_off = (ui_ts_col_pct_count > 0 ? *column_pcts[0] : 0) * dim_2f32(table->rect).x;\r\n  for(U64 column_idx = 1; column_idx < ui_ts_col_pct_count; column_idx += 1)\r\n  {\r\n    // rjf: build base rectangle\r\n    Rng2F32 rect = {0};\r\n    {\r\n      rect.x0 = x_off-3.f;\r\n      rect.y0 = 0;\r\n      rect.x1 = x_off+3.f;\r\n      rect.y1 = dim_2f32(table->rect).y;\r\n      x_off += *column_pcts[column_idx] * dim_2f32(table->rect).x;\r\n    }\r\n    \r\n    // rjf: make column boundary widget\r\n    UI_Rect(rect)\r\n    {\r\n      ui_set_next_hover_cursor(OS_Cursor_LeftRight);\r\n      UI_Box *box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"###%S_boundary_%I64u\", table->string, column_idx);\r\n      \r\n      F32 *left_pct_ptr  = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx-1] : 0;\r\n      F32 *right_pct_ptr = column_idx < ui_ts_col_pct_count ? column_pcts[column_idx] : 0;\r\n      \r\n      // rjf: boundary dragging\r\n      UI_Signal interact = ui_signal_from_box(box);\r\n      if(ui_dragging(interact))\r\n      {\r\n        if(ui_pressed(interact))\r\n        {\r\n          Vec2F32 v = v2f32(*left_pct_ptr, *right_pct_ptr);\r\n          ui_store_drag_struct(&v);\r\n        }\r\n        \r\n        // rjf: calculate how much space we're dividing amongst the columns that\r\n        // the user can resize\r\n        F32 adjustable_table_dim = 0;\r\n        if(table->child_layout_axis == Axis2_Y)\r\n        {\r\n          adjustable_table_dim = dim_2f32(table->rect).x;\r\n        }\r\n        else\r\n        {\r\n          U64 child_idx = 0;\r\n          for(UI_Box *v = table->first; !ui_box_is_nil(v); v = v->next, child_idx += 1)\r\n          {\r\n            U64 column_idx = (child_idx+1);\r\n            if(column_idx < ui_ts_col_pct_count)\r\n            {\r\n              adjustable_table_dim += dim_2f32(v->rect).x;\r\n            }\r\n            else\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: calculate diff\r\n        F32 min_size = 30.f;\r\n        F32 left_pct__before     = ui_get_drag_struct(Vec2F32)->x;\r\n        F32 left_pixels__before  = left_pct__before * adjustable_table_dim;\r\n        F32 left_pixels__after   = left_pixels__before + ui_drag_delta().x;\r\n        \r\n        // rjf: clamp left side\r\n        if(left_pixels__after < min_size)\r\n        {\r\n          left_pixels__after = min_size;\r\n        }\r\n        \r\n        // rjf: calculate right side\r\n        F32 left_pct__after      = left_pixels__after / adjustable_table_dim;\r\n        F32 pct_delta            = left_pct__after - left_pct__before;\r\n        F32 right_pct__before    = ui_get_drag_struct(Vec2F32)->y;\r\n        F32 right_pct__after     = right_pct__before - pct_delta;\r\n        F32 right_pixels__after  = right_pct__after * adjustable_table_dim;\r\n        \r\n        // rjf: clamp right side & back-solve\r\n        if(right_pixels__after < min_size)\r\n        {\r\n          right_pixels__after = min_size;\r\n          right_pct__after = right_pixels__after/adjustable_table_dim;\r\n          pct_delta = -(right_pct__after-right_pct__before);\r\n          left_pct__after = left_pct__before+pct_delta;\r\n        }\r\n        \r\n        // rjf: commit new percentages\r\n        *left_pct_ptr = left_pct__after;\r\n        *right_pct_ptr = right_pct__after;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: form stable pcts\r\n  ui_ts_col_pcts_stable = push_array(ui_build_arena(), F32, ui_ts_col_pct_count);\r\n  for(U64 idx = 0; idx < column_pct_count; idx += 1)\r\n  {\r\n    ui_ts_col_pcts_stable[idx] = *column_pcts[idx];\r\n  }\r\n  \r\n  ui_ts_vector_idx = 0;\r\n}\r\n\r\ninternal void\r\nui_table_beginf(U64 column_pct_count, F32 **column_pcts, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  ui_table_begin(column_pct_count, column_pcts, string);\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal void\r\nui_table_end(void)\r\n{\r\n  ui_pop_parent();\r\n}\r\n\r\ninternal UI_Box *\r\nui_named_table_vector_begin(String8 string)\r\n{\r\n  ui_set_next_pref_width(ui_pct(1, 0));\r\n  ui_set_next_child_layout_axis(Axis2_X);\r\n  UI_Box *vector = ui_build_box_from_string(UI_BoxFlag_DrawSideBottom, string);\r\n  ui_ts_vector_idx += 1;\r\n  ui_ts_cell_idx = 0;\r\n  ui_push_parent(vector);\r\n  return vector;\r\n}\r\n\r\ninternal UI_Box *\r\nui_named_table_vector_beginf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Box *vector = ui_named_table_vector_begin(string);\r\n  scratch_end(scratch);\r\n  return vector;\r\n}\r\n\r\ninternal UI_Box *\r\nui_table_vector_begin(void)\r\n{\r\n  UI_Box *table = ui_top_parent();\r\n  UI_Box *vector = ui_named_table_vector_beginf(\"###tbl_vec_%p_%I64u\", table, ui_ts_vector_idx);\r\n  return vector;\r\n}\r\n\r\ninternal UI_Signal\r\nui_table_vector_end(void)\r\n{\r\n  UI_Box *box = ui_pop_parent();\r\n  return ui_signal_from_box(box);\r\n}\r\n\r\ninternal UI_Box *\r\nui_table_cell_begin(void)\r\n{\r\n  U64 column_idx = ui_ts_cell_idx;\r\n  F32 width_pct = column_idx < ui_ts_col_pct_count ? ui_ts_col_pcts_stable[column_idx] : 1.f;\r\n  return ui_table_cell_sized_begin(ui_pct(width_pct, 0));\r\n}\r\n\r\ninternal UI_Signal\r\nui_table_cell_end(void)\r\n{\r\n  UI_Box *cell = ui_pop_parent();\r\n  return ui_signal_from_box(cell);\r\n}\r\n\r\ninternal UI_Box *\r\nui_table_cell_sized_begin(UI_Size size)\r\n{\r\n  UI_Box *vector = ui_top_parent();\r\n  U64 column_idx = ui_ts_cell_idx;\r\n  ui_ts_cell_idx += 1;\r\n  ui_set_next_pref_width(size);\r\n  ui_set_next_child_layout_axis(Axis2_X);\r\n  UI_Box *cell = ui_build_box_from_stringf((column_idx > 0 ? UI_BoxFlag_DrawSideLeft : 0), \"###tbl_cell_%p_%I64u\", vector, ui_ts_cell_idx);\r\n  ui_push_parent(cell);\r\n  return cell;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Scroll Regions\r\n\r\ninternal void\r\nui_scroll_list_row_block_chunk_list_push(Arena *arena, UI_ScrollListRowBlockChunkList *list, U64 cap, UI_ScrollListRowBlock *block)\r\n{\r\n  UI_ScrollListRowBlockChunkNode *n = list->last;\r\n  if(n == 0 || n->count >= n->cap)\r\n  {\r\n    n = push_array(arena, UI_ScrollListRowBlockChunkNode, 1);\r\n    n->cap = cap;\r\n    n->v = push_array_no_zero(arena, UI_ScrollListRowBlock, n->cap);\r\n    SLLQueuePush(list->first, list->last, n);\r\n    list->chunk_count += 1;\r\n  }\r\n  MemoryCopyStruct(&n->v[n->count], block);\r\n  n->count += 1;\r\n  list->total_count += 1;\r\n}\r\n\r\ninternal UI_ScrollListRowBlockArray\r\nui_scroll_list_row_block_array_from_chunk_list(Arena *arena, UI_ScrollListRowBlockChunkList *list)\r\n{\r\n  UI_ScrollListRowBlockArray array = {0};\r\n  array.count = list->total_count;\r\n  array.v = push_array_no_zero(arena, UI_ScrollListRowBlock, array.count);\r\n  U64 idx = 0;\r\n  for(UI_ScrollListRowBlockChunkNode *n = list->first; n != 0; n = n->next)\r\n  {\r\n    MemoryCopy(array.v+idx, n->v, sizeof(n->v[0])*n->count);\r\n    idx += n->count;\r\n  }\r\n  return array;\r\n}\r\n\r\ninternal U64\r\nui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U64 item)\r\n{\r\n  U64 result = 0;\r\n  {\r\n    U64 row_idx = 0;\r\n    U64 item_idx = 0;\r\n    for(U64 block_idx = 0; block_idx < blocks->count; block_idx += 1)\r\n    {\r\n      UI_ScrollListRowBlock *block = &blocks->v[block_idx];\r\n      U64 next_row_idx = row_idx + block->row_count;\r\n      U64 next_item_idx= item_idx+ block->item_count;\r\n      if(item_idx <= item && item < next_item_idx)\r\n      {\r\n        U64 item_off_rows = (item-item_idx) * (block->row_count/block->item_count);\r\n        result = row_idx + item_off_rows;\r\n        break;\r\n      }\r\n      row_idx = next_row_idx;\r\n      item_idx = next_item_idx;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row)\r\n{\r\n  U64 result = 0;\r\n  {\r\n    U64 row_idx = 0;\r\n    U64 item_idx = 0;\r\n    for(U64 block_idx = 0; block_idx < blocks->count; block_idx += 1)\r\n    {\r\n      UI_ScrollListRowBlock *block = &blocks->v[block_idx];\r\n      U64 next_row_idx = row_idx + block->row_count;\r\n      U64 next_item_idx= item_idx+ block->item_count;\r\n      if(row_idx <= row && row < next_row_idx)\r\n      {\r\n        result = item_idx;\r\n        break;\r\n      }\r\n      row_idx = next_row_idx;\r\n      item_idx = next_item_idx;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal UI_ScrollPt\r\nui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices)\r\n{\r\n  ui_push_tag(str8_lit(\"scroll_bar\"));\r\n  ui_push_font_size(ui_bottom_font_size()*0.65f);\r\n  \r\n  //- rjf: unpack\r\n  S64 idx_range_dim = Max(dim_1s64(idx_range), 1);\r\n  \r\n  //- rjf: produce extra flags for cases in which scrolling is disabled\r\n  UI_BoxFlags disabled_flags = 0;\r\n  if(idx_range.min == idx_range.max)\r\n  {\r\n    disabled_flags |= UI_BoxFlag_Disabled;\r\n  }\r\n  \r\n  //- rjf: build main container\r\n  ui_set_next_pref_size(axis2_flip(axis), off_axis_size);\r\n  ui_set_next_child_layout_axis(axis);\r\n  UI_Box *container_box = ui_build_box_from_key(UI_BoxFlag_DrawBorder, ui_key_zero());\r\n  \r\n  //- rjf: build scroll-min button\r\n  UI_Signal min_scroll_sig = {0};\r\n  UI_Parent(container_box)\r\n    UI_PrefSize(axis, off_axis_size)\r\n    UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags)\r\n    UI_TextAlignment(UI_TextAlign_Center)\r\n    UI_Font(ui_icon_font())\r\n  {\r\n    String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_LeftArrow : UI_IconKind_UpArrow);\r\n    min_scroll_sig = ui_buttonf(\"%S##_min_scroll_%i\", arrow_string, axis);\r\n  }\r\n  \r\n  //- rjf: main scroller area\r\n  UI_Signal space_before_sig = {0};\r\n  UI_Signal space_after_sig = {0};\r\n  UI_Signal scroller_sig = {0};\r\n  UI_Box *scroll_area_box = &ui_nil_box;\r\n  UI_Box *scroller_box = &ui_nil_box;\r\n  UI_Parent(container_box)\r\n  {\r\n    ui_set_next_pref_size(axis, ui_pct(1, 0));\r\n    ui_set_next_child_layout_axis(axis);\r\n    scroll_area_box = ui_build_box_from_stringf(0, \"##_scroll_area_%i\", axis);\r\n    UI_Parent(scroll_area_box)\r\n    {\r\n      // rjf: space before\r\n      if(idx_range.max != idx_range.min)\r\n      {\r\n        ui_set_next_pref_size(axis, ui_pct((F32)((F64)(pt.idx-idx_range.min)/(F64)idx_range_dim), 0));\r\n        UI_Box *space_before_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"##scroll_area_before\");\r\n        space_before_sig = ui_signal_from_box(space_before_box);\r\n      }\r\n      \r\n      // rjf: scroller\r\n      UI_Flags(disabled_flags) UI_PrefSize(axis, ui_pct(Clamp(0.05f, (F32)((F64)Max(view_num_indices, 1)/(F64)idx_range_dim), 1.f), 0.f))\r\n      {\r\n        scroller_sig = ui_buttonf(\"##_scroller_%i\", axis);\r\n        scroller_box = scroller_sig.box;\r\n      }\r\n      \r\n      // rjf: space after\r\n      if(idx_range.max != idx_range.min)\r\n      {\r\n        ui_set_next_pref_size(axis, ui_pct(1.f - (F32)((F64)(pt.idx-idx_range.min)/(F64)idx_range_dim), 0));\r\n        UI_Box *space_after_box = ui_build_box_from_stringf(UI_BoxFlag_Clickable, \"##scroll_area_after\");\r\n        space_after_sig = ui_signal_from_box(space_after_box);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: build scroll-max button\r\n  UI_Signal max_scroll_sig = {0};\r\n  UI_Parent(container_box)\r\n    UI_PrefSize(axis, off_axis_size)\r\n    UI_Flags(UI_BoxFlag_DrawBorder|disabled_flags)\r\n    UI_TextAlignment(UI_TextAlign_Center)\r\n    UI_Font(ui_icon_font())\r\n  {\r\n    String8 arrow_string = ui_icon_string_from_kind(axis == Axis2_X ? UI_IconKind_RightArrow : UI_IconKind_DownArrow);\r\n    max_scroll_sig = ui_buttonf(\"%S##_max_scroll_%i\", arrow_string, axis);\r\n  }\r\n  \r\n  //- rjf: pt * signals -> new pt\r\n  UI_ScrollPt new_pt = pt;\r\n  {\r\n    typedef struct UI_ScrollBarDragData UI_ScrollBarDragData;\r\n    struct UI_ScrollBarDragData\r\n    {\r\n      UI_ScrollPt start_pt;\r\n      F32 scroll_space_px;\r\n    };\r\n    if(ui_dragging(scroller_sig))\r\n    {\r\n      if(ui_pressed(scroller_sig))\r\n      {\r\n        UI_ScrollBarDragData drag_data = {pt, (floor_f32(dim_2f32(scroll_area_box->rect).v[axis])-floor_f32(dim_2f32(scroller_box->rect).v[axis]))};\r\n        ui_store_drag_struct(&drag_data);\r\n      }\r\n      UI_ScrollBarDragData *drag_data = ui_get_drag_struct(UI_ScrollBarDragData);\r\n      UI_ScrollPt original_pt = drag_data->start_pt;\r\n      F32 drag_delta = ui_drag_delta().v[axis];\r\n      F32 drag_pct = drag_delta / drag_data->scroll_space_px;\r\n      S64 new_idx = original_pt.idx + drag_pct*idx_range_dim;\r\n      new_idx = Clamp(idx_range.min, new_idx, idx_range.max);\r\n      ui_scroll_pt_target_idx(&new_pt, new_idx);\r\n      new_pt.off = 0;\r\n    }\r\n    if(ui_dragging(min_scroll_sig) || ui_dragging(space_before_sig))\r\n    {\r\n      S64 new_idx = new_pt.idx-1;\r\n      new_idx = Clamp(idx_range.min, new_idx, idx_range.max);\r\n      ui_scroll_pt_target_idx(&new_pt, new_idx);\r\n    }\r\n    if(ui_dragging(max_scroll_sig) || ui_dragging(space_after_sig))\r\n    {\r\n      S64 new_idx = new_pt.idx+1;\r\n      new_idx = Clamp(idx_range.min, new_idx, idx_range.max);\r\n      ui_scroll_pt_target_idx(&new_pt, new_idx);\r\n    }\r\n  }\r\n  \r\n  ui_pop_font_size();\r\n  ui_pop_tag();\r\n  return new_pt;\r\n}\r\n\r\nthread_static UI_ScrollPt *ui_scroll_list_scroll_pt_ptr = 0;\r\nthread_static F32 ui_scroll_list_scroll_bar_dim_px = 0;\r\nthread_static Vec2F32 ui_scroll_list_dim_px = {0};\r\nthread_static Rng1S64 ui_scroll_list_scroll_idx_rng = {0};\r\n\r\ninternal void\r\nui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out)\r\n{\r\n  //- rjf: unpack arguments\r\n  Rng1S64 scroll_row_idx_range = r1s64(params->item_range.min, ClampBot(params->item_range.min, params->item_range.max-1));\r\n  S64 num_possible_visible_rows = (S64)(params->dim_px.y/params->row_height_px);\r\n  \r\n  //- rjf: do keyboard navigation\r\n  B32 moved = 0;\r\n  if(params->flags & UI_ScrollListFlag_Nav && cursor_out != 0 && ui_is_focus_active())\r\n  {\r\n    Vec2S64 cursor = *cursor_out;\r\n    Vec2S64 mark = mark_out ? *mark_out : cursor;\r\n    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n    {\r\n      if((evt->delta_2s32.x == 0 && evt->delta_2s32.y == 0) ||\r\n         evt->flags & UI_EventFlag_Delete)\r\n      {\r\n        continue;\r\n      }\r\n      ui_eat_event(evt);\r\n      moved = 1;\r\n      switch(evt->delta_unit)\r\n      {\r\n        default:{moved = 0;}break;\r\n        case UI_EventDeltaUnit_Char:\r\n        {\r\n          for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1))\r\n          {\r\n            cursor.v[axis] += evt->delta_2s32.v[axis];\r\n            if(cursor.v[axis] < params->cursor_range.min.v[axis])\r\n            {\r\n              cursor.v[axis] = params->cursor_range.max.v[axis];\r\n            }\r\n            if(cursor.v[axis] > params->cursor_range.max.v[axis])\r\n            {\r\n              cursor.v[axis] = params->cursor_range.min.v[axis];\r\n            }\r\n            cursor.v[axis] = clamp_1s64(r1s64(params->cursor_range.min.v[axis], params->cursor_range.max.v[axis]), cursor.v[axis]);\r\n          }\r\n        }break;\r\n        case UI_EventDeltaUnit_Word:\r\n        case UI_EventDeltaUnit_Line:\r\n        case UI_EventDeltaUnit_Page:\r\n        {\r\n          cursor.x  = (evt->delta_2s32.x>0 ? params->cursor_range.max.x : evt->delta_2s32.x<0 ? params->cursor_range.min.x + !!params->cursor_min_is_empty_selection[Axis2_X] : cursor.x);\r\n          cursor.y += ((evt->delta_2s32.y>0 ? +(num_possible_visible_rows-3) : evt->delta_2s32.y<0 ? -(num_possible_visible_rows-3) : 0));\r\n          cursor.y = clamp_1s64(r1s64(params->cursor_range.min.y + !!params->cursor_min_is_empty_selection[Axis2_Y], params->cursor_range.max.y), cursor.y);\r\n        }break;\r\n        case UI_EventDeltaUnit_Whole:\r\n        {\r\n          for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis+1))\r\n          {\r\n            cursor.v[axis] = (evt->delta_2s32.v[axis]>0 ? params->cursor_range.max.v[axis] : evt->delta_2s32.v[axis]<0 ? params->cursor_range.min.v[axis] + !!params->cursor_min_is_empty_selection[axis] : cursor.v[axis]);\r\n          }\r\n        }break;\r\n      }\r\n      if(!(evt->flags & UI_EventFlag_KeepMark))\r\n      {\r\n        mark = cursor;\r\n      }\r\n    }\r\n    if(moved)\r\n    {\r\n      *cursor_out = cursor;\r\n      if(mark_out)\r\n      {\r\n        *mark_out = mark;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: moved -> snap\r\n  if(params->flags & UI_ScrollListFlag_Snap && moved)\r\n  {\r\n    S64 cursor_item_idx = cursor_out->y-1;\r\n    if(params->item_range.min <= cursor_item_idx && cursor_item_idx <= params->item_range.max)\r\n    {\r\n      //- rjf: compute visible row range\r\n      Rng1S64 visible_row_range = r1s64(scroll_pt->idx + 0 - !!(scroll_pt->off < 0),\r\n                                        scroll_pt->idx + 0 + num_possible_visible_rows + 1);\r\n      \r\n      //- rjf: compute cursor row range from cursor item\r\n      Rng1S64 cursor_visibility_row_range = {0};\r\n      if(params->row_blocks.count == 0)\r\n      {\r\n        cursor_visibility_row_range = r1s64(cursor_item_idx-1, cursor_item_idx+3);\r\n      }\r\n      else\r\n      {\r\n        cursor_visibility_row_range.min = (S64)ui_scroll_list_row_from_item(&params->row_blocks, (U64)cursor_item_idx);\r\n        cursor_visibility_row_range.max = cursor_visibility_row_range.min + 4;\r\n      }\r\n      \r\n      //- rjf: compute deltas & apply\r\n      S64 min_delta = Min(0, cursor_visibility_row_range.min-visible_row_range.min);\r\n      S64 max_delta = Max(0, cursor_visibility_row_range.max-visible_row_range.max);\r\n      S64 new_idx = scroll_pt->idx+min_delta+max_delta;\r\n      new_idx = clamp_1s64(scroll_row_idx_range, new_idx);\r\n      ui_scroll_pt_target_idx(scroll_pt, new_idx);\r\n    }\r\n  }\r\n  \r\n  //- rjf: output signal\r\n  if(signal_out != 0)\r\n  {\r\n    signal_out->cursor_moved = moved;\r\n  }\r\n  \r\n  //- rjf: determine ranges & limits\r\n  Rng1S64 visible_row_range = r1s64(scroll_pt->idx + (S64)(scroll_pt->off) + 0 - !!(scroll_pt->off < 0),\r\n                                    scroll_pt->idx + (S64)(scroll_pt->off) + 0 + num_possible_visible_rows + 1);\r\n  visible_row_range.min = clamp_1s64(params->item_range, visible_row_range.min);\r\n  visible_row_range.max = clamp_1s64(params->item_range, visible_row_range.max);\r\n  *visible_row_range_out = visible_row_range;\r\n  \r\n  //- rjf: store thread-locals\r\n  ui_scroll_list_scroll_bar_dim_px = ui_bottom_font_size()*1.5f;\r\n  ui_scroll_list_scroll_pt_ptr = scroll_pt;\r\n  ui_scroll_list_dim_px = params->dim_px;\r\n  ui_scroll_list_scroll_idx_rng = scroll_row_idx_range;\r\n  \r\n  //- rjf: build top-level container\r\n  UI_Box *container_box = &ui_nil_box;\r\n  UI_FixedWidth(params->dim_px.x) UI_FixedHeight(params->dim_px.y) UI_ChildLayoutAxis(Axis2_X)\r\n  {\r\n    container_box = ui_build_box_from_key(0, ui_key_zero());\r\n  }\r\n  \r\n  //- rjf: build scrollable container\r\n  UI_Box *scrollable_container_box = &ui_nil_box;\r\n  UI_Parent(container_box) UI_ChildLayoutAxis(Axis2_Y) UI_FixedWidth(params->dim_px.x-ui_scroll_list_scroll_bar_dim_px) UI_FixedHeight(params->dim_px.y)\r\n  {\r\n    scrollable_container_box = ui_build_box_from_stringf(UI_BoxFlag_Clip|UI_BoxFlag_AllowOverflowY|UI_BoxFlag_Scroll, \"###sp\");\r\n    scrollable_container_box->view_off.y = scrollable_container_box->view_off_target.y = params->row_height_px*mod_f32(scroll_pt->off, 1.f) + params->row_height_px*(scroll_pt->off < 0) - params->row_height_px*(scroll_pt->off == -1.f && scroll_pt->idx == 1);\r\n  }\r\n  \r\n  //- rjf: build vertical scroll bar\r\n  UI_Parent(container_box) UI_Focus(UI_FocusKind_Null)\r\n  {\r\n    ui_set_next_fixed_width(ui_scroll_list_scroll_bar_dim_px);\r\n    ui_set_next_fixed_height(ui_scroll_list_dim_px.y);\r\n    *ui_scroll_list_scroll_pt_ptr = ui_scroll_bar(Axis2_Y,\r\n                                                  ui_px(ui_scroll_list_scroll_bar_dim_px, 1.f),\r\n                                                  *ui_scroll_list_scroll_pt_ptr,\r\n                                                  scroll_row_idx_range,\r\n                                                  num_possible_visible_rows);\r\n  }\r\n  \r\n  //- rjf: begin scrollable region\r\n  ui_push_parent(container_box);\r\n  ui_push_parent(scrollable_container_box);\r\n  ui_push_pref_height(ui_px(params->row_height_px, 1.f));\r\n}\r\n\r\ninternal void\r\nui_scroll_list_end(void)\r\n{\r\n  ui_pop_pref_height();\r\n  UI_Box *scrollable_container_box = ui_pop_parent();\r\n  UI_Box *container_box = ui_pop_parent();\r\n  \r\n  //- rjf: scroll\r\n  {\r\n    UI_Signal sig = ui_signal_from_box(scrollable_container_box);\r\n    if(sig.scroll.y != 0)\r\n    {\r\n      S64 new_idx = ui_scroll_list_scroll_pt_ptr->idx + sig.scroll.y;\r\n      new_idx = clamp_1s64(ui_scroll_list_scroll_idx_rng, new_idx);\r\n      ui_scroll_pt_target_idx(ui_scroll_list_scroll_pt_ptr, new_idx);\r\n    }\r\n    ui_scroll_pt_clamp_idx(ui_scroll_list_scroll_pt_ptr, ui_scroll_list_scroll_idx_rng);\r\n  }\r\n}\r\n"
  },
  {
    "path": "src/ui/ui_basic_widgets.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef UI_BASIC_WIDGETS_H\r\n#define UI_BASIC_WIDGETS_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Scroll List Types\r\n\r\ntypedef U32 UI_ScrollListFlags;\r\nenum\r\n{\r\n  UI_ScrollListFlag_Nav  = (1<<0),\r\n  UI_ScrollListFlag_Snap = (1<<1),\r\n  UI_ScrollListFlag_All  = 0xffffffff,\r\n};\r\n\r\ntypedef struct UI_ScrollListRowBlock UI_ScrollListRowBlock;\r\nstruct UI_ScrollListRowBlock\r\n{\r\n  U64 row_count;\r\n  U64 item_count;\r\n};\r\n\r\ntypedef struct UI_ScrollListRowBlockChunkNode UI_ScrollListRowBlockChunkNode;\r\nstruct UI_ScrollListRowBlockChunkNode\r\n{\r\n  UI_ScrollListRowBlockChunkNode *next;\r\n  UI_ScrollListRowBlock *v;\r\n  U64 count;\r\n  U64 cap;\r\n};\r\n\r\ntypedef struct UI_ScrollListRowBlockChunkList UI_ScrollListRowBlockChunkList;\r\nstruct UI_ScrollListRowBlockChunkList\r\n{\r\n  UI_ScrollListRowBlockChunkNode *first;\r\n  UI_ScrollListRowBlockChunkNode *last;\r\n  U64 chunk_count;\r\n  U64 total_count;\r\n};\r\n\r\ntypedef struct UI_ScrollListRowBlockArray UI_ScrollListRowBlockArray;\r\nstruct UI_ScrollListRowBlockArray\r\n{\r\n  UI_ScrollListRowBlock *v;\r\n  U64 count;\r\n};\r\n\r\ntypedef struct UI_ScrollListParams UI_ScrollListParams;\r\nstruct UI_ScrollListParams\r\n{\r\n  UI_ScrollListFlags flags;\r\n  Vec2F32 dim_px;\r\n  F32 row_height_px;\r\n  UI_ScrollListRowBlockArray row_blocks;\r\n  Rng2S64 cursor_range;\r\n  Rng1S64 item_range;\r\n  B32 cursor_min_is_empty_selection[Axis2_COUNT];\r\n};\r\n\r\ntypedef struct UI_ScrollListSignal UI_ScrollListSignal;\r\nstruct UI_ScrollListSignal\r\n{\r\n  B32 cursor_moved;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Widgets\r\n\r\ninternal void ui_divider(UI_Size size);\r\ninternal UI_Signal ui_label(String8 string);\r\ninternal UI_Signal ui_labelf(char *fmt, ...);\r\ninternal void ui_label_multiline(F32 max, String8 string);\r\ninternal void ui_label_multilinef(F32 max, char *fmt, ...);\r\ninternal UI_Signal ui_button(String8 string);\r\ninternal UI_Signal ui_buttonf(char *fmt, ...);\r\ninternal UI_Signal ui_hover_label(String8 string);\r\ninternal UI_Signal ui_hover_labelf(char *fmt, ...);\r\ninternal UI_Signal ui_line_edit(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, String8 string);\r\ninternal UI_Signal ui_line_editf(TxtPt *cursor, TxtPt *mark, U8 *edit_buffer, U64 edit_buffer_size, U64 *edit_string_size_out, String8 pre_edit_value, char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: Images\r\n\r\ninternal UI_Signal ui_image(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, String8 string);\r\ninternal UI_Signal ui_imagef(R_Handle texture, R_Tex2DSampleKind sample_kind, Rng2F32 region, Vec4F32 tint, F32 blur, char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: Special Buttons\r\n\r\ninternal UI_Signal ui_expander(B32 is_expanded, String8 string);\r\ninternal UI_Signal ui_expanderf(B32 is_expanded, char *fmt, ...);\r\ninternal UI_Signal ui_sort_header(B32 sorting, B32 ascending, String8 string);\r\ninternal UI_Signal ui_sort_headerf(B32 sorting, B32 ascending, char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: Color Pickers\r\n\r\n//- rjf: tooltips\r\ninternal void ui_do_color_tooltip_hsv(Vec3F32 hsv);\r\ninternal void ui_do_color_tooltip_hsva(Vec4F32 hsva);\r\n\r\n//- rjf: saturation/value picker\r\ninternal UI_Signal ui_sat_val_picker(F32 hue, F32 *out_sat, F32 *out_val, String8 string);\r\ninternal UI_Signal ui_sat_val_pickerf(F32 hue, F32 *out_sat, F32 *out_val, char *fmt, ...);\r\n\r\n//- rjf: hue picker\r\ninternal UI_Signal ui_hue_picker(F32 *out_hue, F32 sat, F32 val, String8 string);\r\ninternal UI_Signal ui_hue_pickerf(F32 *out_hue, F32 sat, F32 val, char *fmt, ...);\r\n\r\n//- rjf: alpha picker\r\ninternal UI_Signal ui_alpha_picker(F32 *out_alpha, String8 string);\r\ninternal UI_Signal ui_alpha_pickerf(F32 *out_alpha, char *fmt, ...);\r\n\r\n////////////////////////////////\r\n//~ rjf: Simple Layout Widgets\r\n\r\ninternal UI_Box *ui_row_begin(void);\r\ninternal UI_Signal ui_row_end(void);\r\ninternal UI_Box *ui_column_begin(void);\r\ninternal UI_Signal ui_column_end(void);\r\ninternal UI_Box *ui_named_row_begin(String8 string);\r\ninternal UI_Signal ui_named_row_end(void);\r\ninternal UI_Box *ui_named_column_begin(String8 string);\r\ninternal UI_Signal ui_named_column_end(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Floating Panes\r\n\r\ninternal UI_Box *ui_pane_begin(Rng2F32 rect, String8 string);\r\ninternal UI_Box *ui_pane_beginf(Rng2F32 rect, char *fmt, ...);\r\ninternal UI_Signal ui_pane_end(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Tables\r\n\r\ninternal void ui_table_begin(U64 column_pct_count, F32 **column_pcts, String8 string);\r\ninternal void ui_table_beginf(U64 column_pct_count, F32 **column_pcts, char *fmt, ...);\r\ninternal void ui_table_end(void);\r\ninternal UI_Box *  ui_named_table_vector_begin(String8 string);\r\ninternal UI_Box *  ui_named_table_vector_beginf(char *fmt, ...);\r\ninternal UI_Box *  ui_table_vector_begin(void);\r\ninternal UI_Signal ui_table_vector_end(void);\r\ninternal UI_Box *  ui_table_cell_begin(void);\r\ninternal UI_Signal ui_table_cell_end(void);\r\ninternal UI_Box *  ui_table_cell_sized_begin(UI_Size size);\r\n\r\n////////////////////////////////\r\n//~ rjf: Scroll Regions\r\n\r\ninternal void ui_scroll_list_row_block_chunk_list_push(Arena *arena, UI_ScrollListRowBlockChunkList *list, U64 cap, UI_ScrollListRowBlock *block);\r\ninternal UI_ScrollListRowBlockArray ui_scroll_list_row_block_array_from_chunk_list(Arena *arena, UI_ScrollListRowBlockChunkList *list);\r\ninternal U64 ui_scroll_list_row_from_item(UI_ScrollListRowBlockArray *blocks, U64 item);\r\ninternal U64 ui_scroll_list_item_from_row(UI_ScrollListRowBlockArray *blocks, U64 row);\r\n\r\ninternal UI_ScrollPt ui_scroll_bar(Axis2 axis, UI_Size off_axis_size, UI_ScrollPt pt, Rng1S64 idx_range, S64 view_num_indices);\r\ninternal void ui_scroll_list_begin(UI_ScrollListParams *params, UI_ScrollPt *scroll_pt_out, Vec2S64 *cursor_out, Vec2S64 *mark_out, Rng1S64 *visible_row_range_out, UI_ScrollListSignal *signal_out);\r\ninternal void ui_scroll_list_end(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Macro Loop Wrappers\r\n\r\n#define UI_Row DeferLoop(ui_row_begin(), ui_row_end())\r\n#define UI_Column DeferLoop(ui_column_begin(), ui_column_end())\r\n#define UI_NamedRow(s) DeferLoop(ui_named_row_begin(s), ui_named_row_end())\r\n#define UI_NamedColumn(s) DeferLoop(ui_named_column_begin(s), ui_named_column_end())\r\n#define UI_Pane(r, s) DeferLoop(ui_pane_begin(r, s), ui_pane_end())\r\n#define UI_PaneF(r, ...) DeferLoop(ui_pane_beginf(r, __VA_ARGS__), ui_pane_end())\r\n#define UI_Padding(size) DeferLoop(ui_spacer(size), ui_spacer(size))\r\n#define UI_Center UI_Padding(ui_pct(1, 0))\r\n\r\n#define UI_Table(col_pct_count, col_pcts, s) DeferLoop(ui_table_begin(col_pct_count, col_pcts, s), ui_table_end())\r\n#define UI_TableF(col_pct_count, col_pcts, ...) DeferLoop(ui_table_beginf(col_pct_count, col_pcts, __VA_ARGS__), ui_table_end())\r\n#define UI_NamedTableVector(s) DeferLoop(ui_named_table_vector_begin(s), ui_table_vector_end())\r\n#define UI_NamedTableVectorF(...) DeferLoop(ui_named_table_vector_beginf(__VA_ARGS__), ui_table_vector_end())\r\n#define UI_TableVector DeferLoop(ui_table_vector_begin(), ui_table_vector_end())\r\n#define UI_TableCell DeferLoop(ui_table_cell_begin(), ui_table_cell_end())\r\n#define UI_TableCellSized(size) DeferLoop(ui_table_cell_sized_begin(size), ui_table_cell_end())\r\n\r\n#define UI_ScrollList(params, scroll_pt_out, cursor_out, mark_out, visible_row_range_out, signal_out) DeferLoop(ui_scroll_list_begin((params), (scroll_pt_out), (cursor_out), (mark_out), (visible_row_range_out), (signal_out)), ui_scroll_list_end())\r\n\r\n#endif // UI_BASIC_WIDGETS_H\r\n"
  },
  {
    "path": "src/ui/ui_core.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n////////////////////////////////\r\n//~ rjf: Globals\r\n\r\nthread_static UI_State *ui_state = 0;\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\ninternal String8\r\nui_hash_part_from_key_string(String8 string)\r\n{\r\n  String8 result = string;\r\n  \r\n  // rjf: look for ### patterns, which can replace the entirety of the part of\r\n  // the string that is hashed.\r\n  U64 hash_replace_signifier_pos = str8_find_needle(string, 0, str8_lit(\"###\"), 0);\r\n  if(hash_replace_signifier_pos < string.size)\r\n  {\r\n    result = str8_skip(string, hash_replace_signifier_pos);\r\n  }\r\n  \r\n  return result;\r\n}\r\n\r\ninternal String8\r\nui_display_part_from_key_string(String8 string)\r\n{\r\n  U64 hash_pos = str8_find_needle(string, 0, str8_lit(\"##\"), 0);\r\n  string.size = hash_pos;\r\n  return string;\r\n}\r\n\r\ninternal UI_Key\r\nui_key_zero(void)\r\n{\r\n  UI_Key result = {0};\r\n  return result;\r\n}\r\n\r\ninternal UI_Key\r\nui_key_make(U64 v)\r\n{\r\n  UI_Key result = {v};\r\n  return result;\r\n}\r\n\r\ninternal UI_Key\r\nui_key_from_string(UI_Key seed_key, String8 string)\r\n{\r\n  UI_Key result = {0};\r\n  if(string.size != 0)\r\n  {\r\n    String8 hash_part = ui_hash_part_from_key_string(string);\r\n    result.u64[0] = u64_hash_from_seed_str8(seed_key.u64[0], hash_part);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal UI_Key\r\nui_key_from_stringf(UI_Key seed_key, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Key key = ui_key_from_string(seed_key, string);\r\n  scratch_end(scratch);\r\n  return key;\r\n}\r\n\r\ninternal B32\r\nui_key_match(UI_Key a, UI_Key b)\r\n{\r\n  return a.u64[0] == b.u64[0];\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Type Functions\r\n\r\ninternal UI_EventNode *\r\nui_event_list_push(Arena *arena, UI_EventList *list, UI_Event *v)\r\n{\r\n  UI_EventNode *n = push_array(arena, UI_EventNode, 1);\r\n  MemoryCopyStruct(&n->v, v);\r\n  n->v.string = push_str8_copy(arena, n->v.string);\r\n  DLLPushBack(list->first, list->last, n);\r\n  list->count += 1;\r\n  return n;\r\n}\r\n\r\ninternal void\r\nui_eat_event_node(UI_EventList *list, UI_EventNode *node)\r\n{\r\n  DLLRemove(list->first, list->last, node);\r\n  list->count -= 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Operation Functions\r\n\r\ninternal B32\r\nui_char_is_scan_boundary(U8 c)\r\n{\r\n  return (char_is_alpha(c) || char_is_digit(c, 10) || c == '_');\r\n}\r\n\r\ninternal S64\r\nui_scanned_column_from_column(String8 string, S64 start_column, Side side)\r\n{\r\n  S64 new_column = start_column;\r\n  S64 delta = (!!side)*2 - 1;\r\n  B32 found_text = 0;\r\n  B32 found_non_space = 0;\r\n  S64 start_off = delta < 0 ? delta : 0;\r\n  for(S64 col = start_column+start_off; 1 <= col && col <= string.size+1; col += delta)\r\n  {\r\n    U8 byte = (col <= string.size) ? string.str[col-1] : 0;\r\n    B32 is_non_space = !char_is_space(byte);\r\n    B32 is_name = ui_char_is_scan_boundary(byte);\r\n    if(((side == Side_Min) && (col == 1)) || \r\n       ((side == Side_Max) && (col == string.size+1)) ||\r\n       (found_non_space && !is_non_space) || \r\n       (found_text && !is_name))\r\n    {\r\n      new_column = col + (!side && col != 1);  \r\n      break;\r\n    }\r\n    else if (!found_text && is_name)\r\n    {\r\n      found_text = 1;\r\n    }\r\n    else if (!found_non_space && is_non_space)\r\n    {\r\n      found_non_space = 1;\r\n    }\r\n  }\r\n  return new_column;\r\n}\r\n\r\ninternal UI_TxtOp\r\nui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, TxtPt cursor, TxtPt mark)\r\n{\r\n  TxtPt next_cursor = cursor;\r\n  TxtPt next_mark = mark;\r\n  TxtRng range = {0};\r\n  String8 replace = {0};\r\n  String8 copy = {0};\r\n  UI_TxtOpFlags flags = 0;\r\n  Vec2S32 delta = event->delta_2s32;\r\n  Vec2S32 original_delta = delta;\r\n  \r\n  //- rjf: resolve high-level delta into byte delta, based on unit\r\n  switch(event->delta_unit)\r\n  {\r\n    default:{}break;\r\n    case UI_EventDeltaUnit_Char:\r\n    {\r\n      // TODO(rjf): this should account for multi-byte characters in UTF-8... for now, just assume ASCII and\r\n      // no-op\r\n    }break;\r\n    case UI_EventDeltaUnit_Word:\r\n    {\r\n      delta.x = (S32)ui_scanned_column_from_column(string, cursor.column, delta.x > 0 ? Side_Max : Side_Min) - cursor.column;\r\n    }break;\r\n    case UI_EventDeltaUnit_Line:\r\n    case UI_EventDeltaUnit_Whole:\r\n    case UI_EventDeltaUnit_Page:\r\n    {\r\n      S64 first_nonwhitespace_column = 1;\r\n      for(U64 idx = 0; idx < string.size; idx += 1)\r\n      {\r\n        if(!char_is_space(string.str[idx]))\r\n        {\r\n          first_nonwhitespace_column = (S64)idx + 1;\r\n          break;\r\n        }\r\n      }\r\n      S64 home_dest_column = (cursor.column == first_nonwhitespace_column) ? 1 : first_nonwhitespace_column;\r\n      delta.x = (delta.x > 0) ? ((S64)string.size+1 - cursor.column) : (home_dest_column - cursor.column);\r\n    }break;\r\n  }\r\n  \r\n  //- rjf: zero delta\r\n  if(!txt_pt_match(cursor, mark) && event->flags & UI_EventFlag_ZeroDeltaOnSelect)\r\n  {\r\n    delta = v2s32(0, 0);\r\n  }\r\n  \r\n  //- rjf: form next cursor\r\n  if(txt_pt_match(cursor, mark) || !(event->flags & UI_EventFlag_ZeroDeltaOnSelect))\r\n  {\r\n    next_cursor.column += delta.x;\r\n  }\r\n  \r\n  //- rjf: cap at line\r\n  if(event->flags & UI_EventFlag_CapAtLine)\r\n  {\r\n    next_cursor.column = Clamp(1, next_cursor.column, (S64)(string.size+1));\r\n  }\r\n  \r\n  //- rjf: in some cases, we want to pick a selection side based on the delta\r\n  if(!txt_pt_match(cursor, mark) && event->flags & UI_EventFlag_PickSelectSide)\r\n  {\r\n    if(original_delta.x < 0 || original_delta.y < 0)\r\n    {\r\n      next_cursor = next_mark = txt_pt_min(cursor, mark);\r\n    }\r\n    else if(original_delta.x > 0 || original_delta.y > 0)\r\n    {\r\n      next_cursor = next_mark = txt_pt_max(cursor, mark);\r\n    }\r\n  }\r\n  \r\n  //- rjf: copying\r\n  if(event->flags & UI_EventFlag_Copy)\r\n  {\r\n    if(cursor.line == mark.line)\r\n    {\r\n      copy = str8_substr(string, r1u64(cursor.column-1, mark.column-1));\r\n      flags |= UI_TxtOpFlag_Copy;\r\n    }\r\n    else\r\n    {\r\n      flags |= UI_TxtOpFlag_Invalid;\r\n    }\r\n  }\r\n  \r\n  //- rjf: pasting\r\n  if(event->flags & UI_EventFlag_Paste)\r\n  {\r\n    range = txt_rng(cursor, mark);\r\n    replace = os_get_clipboard_text(arena);\r\n    next_cursor = next_mark = txt_pt(cursor.line, cursor.column+replace.size);\r\n  }\r\n  \r\n  //- rjf: deletion\r\n  if(event->flags & UI_EventFlag_Delete)\r\n  {\r\n    TxtPt new_pos = txt_pt_min(next_cursor, next_mark);\r\n    range = txt_rng(next_cursor, next_mark);\r\n    replace = str8_lit(\"\");\r\n    next_cursor = next_mark = new_pos;\r\n  }\r\n  \r\n  //- rjf: stick mark to cursor, when we don't want to keep it in the same spot\r\n  if(!(event->flags & UI_EventFlag_KeepMark))\r\n  {\r\n    next_mark = next_cursor;\r\n  }\r\n  \r\n  //- rjf: insertion\r\n  if(event->string.size != 0)\r\n  {\r\n    range = txt_rng(cursor, mark);\r\n    replace = push_str8_copy(arena, event->string);\r\n    next_cursor = next_mark = txt_pt(range.min.line, range.min.column + event->string.size);\r\n  }\r\n  \r\n  //- rjf: determine if this event should be taken, based on bounds of cursor\r\n  {\r\n    if(next_cursor.column > string.size+1 || 1 > next_cursor.column || event->delta_2s32.y != 0)\r\n    {\r\n      flags |= UI_TxtOpFlag_Invalid;\r\n    }\r\n    next_cursor.column = Clamp(1, next_cursor.column, string.size+replace.size+1);\r\n    next_mark.column = Clamp(1, next_mark.column, string.size+replace.size+1);\r\n  }\r\n  \r\n  //- rjf: build+fill\r\n  UI_TxtOp op = {0};\r\n  {\r\n    op.flags   = flags;\r\n    op.replace = replace;\r\n    op.copy    = copy;\r\n    op.range   = range;\r\n    op.cursor  = next_cursor;\r\n    op.mark    = next_mark;\r\n  }\r\n  return op;\r\n}\r\n\r\ninternal String8\r\nui_push_string_replace_range(Arena *arena, String8 string, Rng1S64 col_range, String8 replace)\r\n{\r\n  //- rjf: convert to offset range\r\n  Rng1U64 range =\r\n  {\r\n    (U64)(col_range.min-1),\r\n    (U64)(col_range.max-1),\r\n  };\r\n  \r\n  //- rjf: clamp range\r\n  if(range.min > string.size)\r\n  {\r\n    range.min = 0;\r\n  }\r\n  if(range.max > string.size)\r\n  {\r\n    range.max = string.size;\r\n  }\r\n  \r\n  //- rjf: calculate new size\r\n  U64 old_size = string.size;\r\n  U64 new_size = old_size - (range.max - range.min) + replace.size;\r\n  \r\n  //- rjf: push+fill new string storage\r\n  U8 *push_base = push_array(arena, U8, new_size);\r\n  {\r\n    MemoryCopy(push_base+0, string.str, range.min);\r\n    MemoryCopy(push_base+range.min+replace.size, string.str+range.max, string.size-range.max);\r\n    if(replace.str != 0)\r\n    {\r\n      MemoryCopy(push_base+range.min, replace.str, replace.size);\r\n    }\r\n  }\r\n  \r\n  String8 result = str8(push_base, new_size);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Sizes\r\n\r\ninternal UI_Size\r\nui_size(UI_SizeKind kind, F32 value, F32 strictness)\r\n{\r\n  UI_Size size = {kind, value, strictness};\r\n  return size;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Scroll Point Type Functions\r\n\r\ninternal UI_ScrollPt\r\nui_scroll_pt(S64 idx, F32 off)\r\n{\r\n  UI_ScrollPt pt = {idx, off};\r\n  return pt;\r\n}\r\n\r\ninternal void\r\nui_scroll_pt_target_idx(UI_ScrollPt *v, S64 idx)\r\n{\r\n  v->off = mod_f32(v->off, 1.f) + (F32)(v->idx+(S64)v->off - idx);\r\n  v->idx = idx;\r\n}\r\n\r\ninternal void\r\nui_scroll_pt_clamp_idx(UI_ScrollPt *v, Rng1S64 range)\r\n{\r\n  if(v->idx < range.min || range.max < v->idx)\r\n  {\r\n    S64 clamped = range.min;\r\n    ui_scroll_pt_target_idx(v, clamped);\r\n  }\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Boxes\r\n\r\ninternal B32\r\nui_box_is_nil(UI_Box *box)\r\n{\r\n  return box == 0 || box == &ui_nil_box;\r\n}\r\n\r\ninternal UI_BoxRec\r\nui_box_rec_df(UI_Box *box, UI_Box *root, U64 sib_member_off, U64 child_member_off)\r\n{\r\n  UI_BoxRec result = {0};\r\n  result.next = &ui_nil_box;\r\n  if(!ui_box_is_nil(*MemberFromOffset(UI_Box **, box, child_member_off)))\r\n  {\r\n    result.next = *MemberFromOffset(UI_Box **, box, child_member_off);\r\n    result.push_count = 1;\r\n  }\r\n  else for(UI_Box *p = box; !ui_box_is_nil(p) && p != root; p = p->parent)\r\n  {\r\n    if(!ui_box_is_nil(*MemberFromOffset(UI_Box **, p, sib_member_off)))\r\n    {\r\n      result.next = *MemberFromOffset(UI_Box **, p, sib_member_off);\r\n      break;\r\n    }\r\n    result.pop_count += 1;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nui_box_list_push(Arena *arena, UI_BoxList *list, UI_Box *box)\r\n{\r\n  UI_BoxNode *n = push_array(arena, UI_BoxNode, 1);\r\n  n->box = box;\r\n  SLLQueuePush(list->first, list->last, n);\r\n  list->count += 1;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: State Building / Selecting\r\n\r\ninternal UI_State *\r\nui_state_alloc(void)\r\n{\r\n  Arena *arena = arena_alloc();\r\n  UI_State *ui = push_array(arena, UI_State, 1);\r\n  ui->arena = arena;\r\n  ui->external_key = ui_key_from_string(ui_key_zero(), str8_lit(\"###external_interaction_key###\"));\r\n  ui->build_arenas[0] = arena_alloc();\r\n  ui->build_arenas[1] = arena_alloc();\r\n  ui->drag_state_arena = arena_alloc();\r\n  ui->string_hover_arena = arena_alloc();\r\n  ui->box_table_size = 4096;\r\n  ui->box_table = push_array(arena, UI_BoxHashSlot, ui->box_table_size);\r\n  ui->anim_slots_count = 4096;\r\n  ui->anim_slots = push_array(arena, UI_AnimSlot, ui->anim_slots_count);\r\n  ui->theme_pattern_cache_slots_count = 1024;\r\n  ui->theme_pattern_cache_slots = push_array(arena, UI_ThemePatternCacheSlot, ui->theme_pattern_cache_slots_count);\r\n  UI_InitStackNils(ui);\r\n  return ui;\r\n}\r\n\r\ninternal void\r\nui_state_release(UI_State *state)\r\n{\r\n  arena_release(state->string_hover_arena);\r\n  arena_release(state->drag_state_arena);\r\n  for(int i = 0; i < ArrayCount(state->build_arenas); i += 1)\r\n  {\r\n    arena_release(state->build_arenas[i]);\r\n  }\r\n  arena_release(state->arena);\r\n}\r\n\r\ninternal UI_Box *\r\nui_root_from_state(UI_State *state)\r\n{\r\n  return state->root;\r\n}\r\n\r\ninternal B32\r\nui_animating_from_state(UI_State *state)\r\n{\r\n  return state->is_animating;\r\n}\r\n\r\ninternal void\r\nui_select_state(UI_State *state)\r\n{\r\n  ui_state = state;\r\n}\r\n\r\ninternal UI_State *\r\nui_get_selected_state(void)\r\n{\r\n  return ui_state;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Implicit State Accessors/Mutators\r\n\r\n//- rjf: per-frame info\r\n\r\ninternal Arena *\r\nui_build_arena(void)\r\n{\r\n  Arena *result = ui_state->build_arenas[ui_state->build_index%ArrayCount(ui_state->build_arenas)];\r\n  return result;\r\n}\r\n\r\ninternal OS_Handle\r\nui_window(void)\r\n{\r\n  return ui_state->window;\r\n}\r\n\r\ninternal Vec2F32\r\nui_mouse(void)\r\n{\r\n  return ui_state->mouse;\r\n}\r\n\r\ninternal FNT_Tag\r\nui_icon_font(void)\r\n{\r\n  return ui_state->icon_info.icon_font;\r\n}\r\n\r\ninternal String8\r\nui_icon_string_from_kind(UI_IconKind icon_kind)\r\n{\r\n  return ui_state->icon_info.icon_kind_text_map[icon_kind];\r\n}\r\n\r\ninternal F32\r\nui_dt(void)\r\n{\r\n  return ui_state->animation_dt;\r\n}\r\n\r\n//- rjf: event pumping\r\n\r\ninternal B32\r\nui_next_event(UI_Event **ev)\r\n{\r\n  UI_EventList *events = ui_state->events;\r\n  UI_EventNode *start_node = events->first;\r\n  if(ev[0] != 0)\r\n  {\r\n    start_node = CastFromMember(UI_EventNode, v, ev[0]);\r\n    start_node = start_node->next;\r\n    ev[0] = 0;\r\n  }\r\n  if(start_node != 0)\r\n  {\r\n    UI_PermissionFlags perms = ui_top_permission_flags();\r\n    for(UI_EventNode *n = start_node; n != 0; n = n->next)\r\n    {\r\n      B32 good = 1;\r\n      if(!(perms & UI_PermissionFlag_ClicksLeft) &&\r\n         (n->v.kind == UI_EventKind_Press ||\r\n          n->v.kind == UI_EventKind_Release) &&\r\n         (n->v.key == OS_Key_LeftMouseButton))\r\n      {\r\n        good = 0;\r\n      }\r\n      if(!(perms & UI_PermissionFlag_ClicksMiddle) &&\r\n         (n->v.kind == UI_EventKind_Press ||\r\n          n->v.kind == UI_EventKind_Release) &&\r\n         (n->v.key == OS_Key_MiddleMouseButton))\r\n      {\r\n        good = 0;\r\n      }\r\n      if(!(perms & UI_PermissionFlag_ClicksRight) &&\r\n         (n->v.kind == UI_EventKind_Press ||\r\n          n->v.kind == UI_EventKind_Release) &&\r\n         (n->v.key == OS_Key_RightMouseButton))\r\n      {\r\n        good = 0;\r\n      }\r\n      if(!(perms & UI_PermissionFlag_ScrollX) && (n->v.kind == UI_EventKind_Scroll) && (n->v.delta_2f32.x != 0 || n->v.modifiers == OS_Modifier_Shift))\r\n      {\r\n        good = 0;\r\n      }\r\n      if(!(perms & UI_PermissionFlag_ScrollY) && (n->v.kind == UI_EventKind_Scroll) && n->v.delta_2f32.y != 0 && n->v.modifiers == 0)\r\n      {\r\n        good = 0;\r\n      }\r\n      if((n->v.kind == UI_EventKind_Press ||\r\n          n->v.kind == UI_EventKind_Release ||\r\n          n->v.kind == UI_EventKind_Navigate ||\r\n          n->v.kind == UI_EventKind_Edit) &&\r\n         (n->v.key != OS_Key_LeftMouseButton &&\r\n          n->v.key != OS_Key_MiddleMouseButton &&\r\n          n->v.key != OS_Key_RightMouseButton))\r\n      {\r\n        if((perms & UI_PermissionFlag_Keyboard) == UI_PermissionFlag_KeyboardSecondary)\r\n        {\r\n          good = !!(n->v.flags & UI_EventFlag_Secondary);\r\n        }\r\n        else if(!(perms & UI_PermissionFlag_Keyboard))\r\n        {\r\n          good = 0;\r\n        }\r\n      }\r\n      else if(!(perms & UI_PermissionFlag_Text) && (n->v.kind == UI_EventKind_Text))\r\n      {\r\n        good = 0;\r\n      }\r\n      if(good)\r\n      {\r\n        ev[0] = &n->v;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  B32 result = !!ev[0];\r\n  return result;\r\n}\r\n\r\ninternal void\r\nui_eat_event(UI_Event *ev)\r\n{\r\n  if(ev != 0)\r\n  {\r\n    UI_EventNode *n = CastFromMember(UI_EventNode, v, ev);\r\n    ui_eat_event_node(ui_state->events, n);\r\n  }\r\n}\r\n\r\n//- rjf: event consumption helpers\r\n\r\ninternal B32\r\nui_key_press(OS_Modifiers mods, OS_Key key)\r\n{\r\n  B32 result = 0;\r\n  for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n  {\r\n    if(evt->kind == UI_EventKind_Press && evt->key == key && evt->modifiers == mods)\r\n    {\r\n      result = 1;\r\n      ui_eat_event(evt);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nui_key_release(OS_Modifiers mods, OS_Key key)\r\n{\r\n  B32 result = 0;\r\n  for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n  {\r\n    if(evt->kind == UI_EventKind_Release && evt->key == key && evt->modifiers == mods)\r\n    {\r\n      result = 1;\r\n      ui_eat_event(evt);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nui_text(U32 character)\r\n{\r\n  B32 result = 0;\r\n  Temp scratch = scratch_begin(0, 0);\r\n  String8 character_text = str8_from_32(scratch.arena, str32(&character, 1));\r\n  for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n  {\r\n    if(evt->kind == UI_EventKind_Text && str8_match(character_text, evt->string, 0))\r\n    {\r\n      result = 1;\r\n      ui_eat_event(evt);\r\n      break;\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nui_slot_press(UI_EventActionSlot slot)\r\n{\r\n  B32 result = 0;\r\n  for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n  {\r\n    if(evt->kind == UI_EventKind_Press && evt->slot == slot)\r\n    {\r\n      result = 1;\r\n      ui_eat_event(evt);\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: autocomplete info\r\n\r\ninternal void\r\nui_set_autocomplete_string(String8 string)\r\n{\r\n  ui_state->autocomplete_string = push_str8_copy(ui_build_arena(), string);\r\n}\r\n\r\ninternal String8\r\nui_autocomplete_string(void)\r\n{\r\n  return ui_state->autocomplete_string;\r\n}\r\n\r\ninternal String8\r\nui_autocomplete(void)\r\n{\r\n  String8 result = ui_state->autocomplete_string;\r\n  MemoryZeroStruct(&ui_state->autocomplete_string);\r\n  return result;\r\n}\r\n\r\n//- rjf: drag data\r\n\r\ninternal Vec2F32\r\nui_drag_start_mouse(void)\r\n{\r\n  return ui_state->drag_start_mouse;\r\n}\r\n\r\ninternal Vec2F32\r\nui_drag_delta(void)\r\n{\r\n  return sub_2f32(ui_mouse(), ui_state->drag_start_mouse);\r\n}\r\n\r\ninternal void\r\nui_store_drag_data(String8 string)\r\n{\r\n  arena_clear(ui_state->drag_state_arena);\r\n  ui_state->drag_state_data = push_str8_copy(ui_state->drag_state_arena, string);\r\n}\r\n\r\ninternal String8\r\nui_get_drag_data(U64 min_required_size)\r\n{\r\n  if(ui_state->drag_state_data.size < min_required_size)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 str = {push_array(scratch.arena, U8, min_required_size), min_required_size};\r\n    ui_store_drag_data(str);\r\n    scratch_end(scratch);\r\n  }\r\n  return ui_state->drag_state_data;\r\n}\r\n\r\n//- rjf: hovered string info\r\n\r\ninternal B32\r\nui_string_hover_active(void)\r\n{\r\n  return (ui_state->build_index > 0 && ui_state->string_hover_build_index >= ui_state->build_index-1 &&\r\n          os_now_microseconds() >= ui_state->string_hover_begin_us + 500000);\r\n}\r\n\r\ninternal U64\r\nui_string_hover_begin_time_us(void)\r\n{\r\n  return ui_state->string_hover_begin_us;\r\n}\r\n\r\ninternal DR_FStrList\r\nui_string_hover_fstrs(Arena *arena)\r\n{\r\n  DR_FStrList result = dr_fstrs_copy(arena, &ui_state->string_hover_fstrs);\r\n  return result;\r\n}\r\n\r\n//- rjf: interaction keys\r\n\r\ninternal UI_Key\r\nui_hot_key(void)\r\n{\r\n  return ui_state->hot_box_key;\r\n}\r\n\r\ninternal UI_Key\r\nui_active_key(UI_MouseButtonKind button_kind)\r\n{\r\n  return ui_state->active_box_key[button_kind];\r\n}\r\n\r\ninternal UI_Key\r\nui_drop_hot_key(void)\r\n{\r\n  return ui_state->drop_hot_box_key;\r\n}\r\n\r\n//- rjf: controls over interaction\r\n\r\ninternal void\r\nui_kill_action(void)\r\n{\r\n  for EachEnumVal(UI_MouseButtonKind, k)\r\n  {\r\n    ui_state->active_box_key[k] = ui_key_zero();\r\n  }\r\n}\r\n\r\n//- rjf: box cache lookup\r\n\r\ninternal UI_Box *\r\nui_box_from_key(UI_Key key)\r\n{\r\n  ProfBeginFunction();\r\n  UI_Box *result = &ui_nil_box;\r\n  if(!ui_key_match(key, ui_key_zero()))\r\n  {\r\n    U64 slot = key.u64[0] % ui_state->box_table_size;\r\n    for(UI_Box *b = ui_state->box_table[slot].hash_first; !ui_box_is_nil(b); b = b->hash_next)\r\n    {\r\n      if(ui_key_match(b->key, key))\r\n      {\r\n        result = b;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  ProfEnd();\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Building API\r\n\r\ninternal void\r\nui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt)\r\n{\r\n  //- rjf: reset per-build ui state\r\n  {\r\n    UI_InitStacks(ui_state);\r\n    ui_state->root = &ui_nil_box;\r\n    ui_state->ctx_menu_touched_this_frame = 0;\r\n    ui_state->is_animating = 0;\r\n    ui_state->clipboard_copy_key = ui_key_zero();\r\n    ui_state->last_build_box_count = ui_state->build_box_count;\r\n    ui_state->build_box_count = 0;\r\n    ui_state->tooltip_open = 0;\r\n    ui_state->ctx_menu_changed = 0;\r\n    ui_state->default_animation_rate = 1 - pow_f32(2, (-60.f * ui_state->animation_dt));\r\n    ui_state->tooltip_can_overflow_window = 0;\r\n    ui_state->tooltip_anchor_key = ui_key_zero();\r\n    ui_state->tags_key_stack_top = ui_state->tags_key_stack_free = 0;\r\n    ui_state->tags_cache_slots_count = 512;\r\n    ui_state->tags_cache_slots = push_array(ui_build_arena(), UI_TagsCacheSlot, ui_state->tags_cache_slots_count);\r\n    ui_state->autocomplete_string = str8_zero();\r\n  }\r\n  \r\n  //- rjf: prune unused animation nodes\r\n  ProfScope(\"ui prune unused animation nodes\")\r\n  {\r\n    for(UI_AnimNode *n = ui_state->lru_anim_node, *next = &ui_nil_anim_node; n != &ui_nil_anim_node && n != 0; n = next)\r\n    {\r\n      next = n->lru_next;\r\n      if(n->last_touched_build_index+2 < ui_state->build_index)\r\n      {\r\n        U64 slot_idx = n->key.u64[0]%ui_state->anim_slots_count;\r\n        UI_AnimSlot *slot = &ui_state->anim_slots[slot_idx];\r\n        DLLRemove_NPZ(&ui_nil_anim_node, slot->first, slot->last, n, slot_next, slot_prev);;\r\n        DLLRemove_NPZ(&ui_nil_anim_node, ui_state->lru_anim_node, ui_state->mru_anim_node, n, lru_next, lru_prev);\r\n        SLLStackPush_N(ui_state->free_anim_node, n, slot_next);\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: prune unused theme pattern cache nodes\r\n  ProfScope(\"ui prune unused theme pattern cache\")\r\n  {\r\n    for(UI_ThemePatternCacheNode *n = ui_state->lru_theme_pattern_cache_node, *next = 0; n != 0; n = next)\r\n    {\r\n      next = n->lru_next;\r\n      if(n->last_build_index_accessed+2 < ui_state->build_index)\r\n      {\r\n        U64 slot_idx = n->key.u64[0]%ui_state->theme_pattern_cache_slots_count;\r\n        UI_ThemePatternCacheSlot *slot = &ui_state->theme_pattern_cache_slots[slot_idx];\r\n        DLLRemove_NP(slot->first, slot->last, n, slot_next, slot_prev);\r\n        DLLRemove_NP(ui_state->lru_theme_pattern_cache_node, ui_state->mru_theme_pattern_cache_node, n, lru_next, lru_prev);\r\n        SLLStackPush_N(ui_state->theme_pattern_cache_node_free, n, slot_next);\r\n      }\r\n      else\r\n      {\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: detect mouse-moves\r\n  for(UI_EventNode *n = events->first; n != 0; n = n->next)\r\n  {\r\n    if(n->v.kind == UI_EventKind_MouseMove)\r\n    {\r\n      ui_state->last_time_mousemoved_us = os_now_microseconds();\r\n    }\r\n  }\r\n  \r\n  //- rjf: detect external press & holds\r\n  for EachEnumVal(UI_MouseButtonKind, k)\r\n  {\r\n    if(ui_key_match(ui_state->active_box_key[k], ui_key_zero()) && os_key_is_down(OS_Key_LeftMouseButton+k))\r\n    {\r\n      ui_state->active_box_key[k] = ui_state->external_key;\r\n    }\r\n    else if(ui_key_match(ui_state->active_box_key[k], ui_state->external_key) && !os_key_is_down(OS_Key_LeftMouseButton+k))\r\n    {\r\n      ui_state->active_box_key[k] = ui_key_zero();\r\n    }\r\n  }\r\n  \r\n  //- rjf: fill build phase parameters\r\n  {\r\n    ui_state->theme = theme;\r\n    ui_state->events = events;\r\n    ui_state->window = window;\r\n    ui_state->mouse = (os_window_is_focused(window) || ui_state->last_time_mousemoved_us+500000 >= os_now_microseconds()) ? os_mouse_from_window(window) : v2f32(-100, -100);\r\n    ui_state->animation_dt = animation_dt;\r\n    MemoryZeroStruct(&ui_state->icon_info);\r\n    ui_state->icon_info.icon_font = icon_info->icon_font;\r\n    for(UI_IconKind icon_kind = UI_IconKind_Null;\r\n        icon_kind < UI_IconKind_COUNT;\r\n        icon_kind = (UI_IconKind)(icon_kind + 1))\r\n    {\r\n      ui_state->icon_info.icon_kind_text_map[icon_kind] = push_str8_copy(ui_build_arena(), icon_info->icon_kind_text_map[icon_kind]);\r\n    }\r\n    MemoryCopyStruct(&ui_state->animation_info, animation_info);\r\n  }\r\n  \r\n  //- rjf: do default navigation\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    if(!ui_key_match(ui_state->default_nav_root_key, ui_key_zero()))\r\n    {\r\n      UI_Box *nav_root = ui_box_from_key(ui_state->default_nav_root_key);\r\n      if(!ui_box_is_nil(nav_root))\r\n      {\r\n        //- rjf: no child has the active focus -> do navigation at this layer\r\n        if(ui_key_match(ui_key_zero(), nav_root->default_nav_focus_active_key))\r\n        {\r\n          for(;;)\r\n          {\r\n            B32 moved = 0;\r\n            UI_Box *focus_box = ui_box_from_key(nav_root->default_nav_focus_next_hot_key);\r\n            UI_BoxList next_focus_box_candidates = {0};\r\n            \r\n            // rjf: gather & consume events & nav actions\r\n            B32 nav_next = 0;\r\n            B32 nav_prev = 0;\r\n            Axis2 axis_lock = Axis2_Invalid;\r\n            if(ui_key_press(0, OS_Key_Tab))\r\n            {\r\n              nav_next = 1;\r\n            }\r\n            if(ui_key_press(OS_Modifier_Shift, OS_Key_Tab))\r\n            {\r\n              nav_prev = 1;\r\n            }\r\n            for(UI_EventNode *node = events->first, *next = 0; node != 0; node = next)\r\n            {\r\n              next = node->next;\r\n              B32 taken = 0;\r\n              if(node->v.delta_2s32.x == 0 && node->v.delta_2s32.y == 0)\r\n              {\r\n                continue;\r\n              }\r\n              if(((node->v.delta_2s32.x > 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavX) || node->v.delta_2s32.x == 0) &&\r\n                 ((node->v.delta_2s32.y > 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavY) || node->v.delta_2s32.y == 0))\r\n              {\r\n                taken = 1;\r\n                nav_next = 1;\r\n              }\r\n              if(((node->v.delta_2s32.x < 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavX) || node->v.delta_2s32.x == 0) &&\r\n                 ((node->v.delta_2s32.y < 0 && nav_root->flags & UI_BoxFlag_DefaultFocusNavY) || node->v.delta_2s32.y == 0))\r\n              {\r\n                taken = 1;\r\n                nav_prev = 1;\r\n              }\r\n              if(node->v.flags & UI_EventFlag_ExplicitDirectional)\r\n              {\r\n                axis_lock = node->v.delta_2s32.x != 0 ? Axis2_X : Axis2_Y;\r\n              }\r\n              if(taken)\r\n              {\r\n                ui_eat_event_node(events, node);\r\n              }\r\n            }\r\n            \r\n            // rjf: [+] directional movement\r\n            if(nav_next)\r\n            {\r\n              UI_Box *search_start = ui_box_is_nil(focus_box) ? nav_root : focus_box;\r\n              U64 moved_in_axis[Axis2_COUNT] = {0};\r\n              moved = 1;\r\n              for(UI_Box *box = search_start;;)\r\n              {\r\n                if(box != search_start && !(box->flags & UI_BoxFlag_FocusNavSkip) && (box->flags & UI_BoxFlag_Clickable || ui_box_is_nil(box)) && (axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 0))\r\n                {\r\n                  ui_box_list_push(scratch.arena, &next_focus_box_candidates, box);\r\n                  if(axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 1)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n                UI_Box *last_box = box;\r\n                if(!ui_box_is_nil(box->first))\r\n                {\r\n                  moved_in_axis[box->child_layout_axis] += 1;\r\n                  box = box->first;\r\n                }\r\n                else for(UI_Box *p = box; !ui_box_is_nil(p) && p != nav_root; p = p->parent)\r\n                {\r\n                  if(!ui_box_is_nil(p->next))\r\n                  {\r\n                    moved_in_axis[p->parent->child_layout_axis] += 1;\r\n                    box = p->next;\r\n                    break;\r\n                  }\r\n                }\r\n                if(last_box == box)\r\n                {\r\n                  ui_box_list_push(scratch.arena, &next_focus_box_candidates, &ui_nil_box);\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: [-] directional movement\r\n            if(nav_prev)\r\n            {\r\n              UI_Box *search_start = ui_box_is_nil(focus_box) ? nav_root : focus_box;\r\n              U64 moved_in_axis[Axis2_COUNT] = {0};\r\n              moved = 1;\r\n              for(UI_Box *box = search_start;;)\r\n              {\r\n                if(box != search_start && !(box->flags & UI_BoxFlag_FocusNavSkip) && (box->flags & UI_BoxFlag_Clickable || ui_box_is_nil(box)) && (axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 0))\r\n                {\r\n                  ui_box_list_push(scratch.arena, &next_focus_box_candidates, box);\r\n                  if(axis_lock == Axis2_Invalid || moved_in_axis[axis_lock] > 1)\r\n                  {\r\n                    break;\r\n                  }\r\n                }\r\n                UI_Box *last_box = box;\r\n                UI_Box *root_descendant = &ui_nil_box;\r\n                if(box == nav_root && box == search_start)\r\n                {\r\n                  for(UI_Box *d = box->last; !ui_box_is_nil(d); d = d->last)\r\n                  {\r\n                    moved_in_axis[d->parent->child_layout_axis] += 1;\r\n                    root_descendant = d;\r\n                  }\r\n                }\r\n                UI_Box *prev_descendant = &ui_nil_box;\r\n                for(UI_Box *d = box->prev; !ui_box_is_nil(d); d = d->last)\r\n                {\r\n                  moved_in_axis[d->parent->child_layout_axis] += 1;\r\n                  prev_descendant = d;\r\n                }\r\n                if(!ui_box_is_nil(root_descendant))\r\n                {\r\n                  box = root_descendant;\r\n                }\r\n                else if(!ui_box_is_nil(prev_descendant))\r\n                {\r\n                  box = prev_descendant;\r\n                }\r\n                else if(box->parent != nav_root)\r\n                {\r\n                  moved_in_axis[box->parent->child_layout_axis] += 1;\r\n                  box = box->parent;\r\n                }\r\n                if(box == last_box)\r\n                {\r\n                  ui_box_list_push(scratch.arena, &next_focus_box_candidates, &ui_nil_box);\r\n                  break;\r\n                }\r\n              }\r\n            }\r\n            \r\n            // rjf: scan candidates and grab next focus box\r\n            UI_Box *next_focus_box = focus_box;\r\n            F32 best_distance_from_start = 1000000;\r\n            for(UI_BoxNode *n = next_focus_box_candidates.first; n != 0; n = n->next)\r\n            {\r\n              UI_Box *box = n->box;\r\n              F32 distance_from_start = 0;\r\n              if(axis_lock != Axis2_Invalid)\r\n              {\r\n                distance_from_start = abs_f32(center_2f32(box->rect).v[axis2_flip(axis_lock)] - center_2f32(focus_box->rect).v[axis2_flip(axis_lock)]);\r\n              }\r\n              if(distance_from_start < best_distance_from_start && box != focus_box)\r\n              {\r\n                next_focus_box = box;\r\n                best_distance_from_start = distance_from_start;\r\n              }\r\n            }\r\n            \r\n            // rjf: commit next focus box\r\n            nav_root->default_nav_focus_next_hot_key = next_focus_box->key;\r\n            \r\n            // rjf: no movement -> break\r\n            if(moved == 0)\r\n            {\r\n              break;\r\n            }\r\n          }\r\n        }\r\n        \r\n        //- rjf: some child has the active focus -> accept escape keys to pop from the active key stack\r\n        if(!ui_key_match(ui_key_zero(), nav_root->default_nav_focus_active_key))\r\n        {\r\n          for(;ui_slot_press(UI_EventActionSlot_Cancel);)\r\n          {\r\n            UI_Box *prev_focus_root = nav_root;\r\n            for(UI_Box *focus_root = ui_box_from_key(nav_root->default_nav_focus_active_key);\r\n                !ui_box_is_nil(focus_root);)\r\n            {\r\n              UI_Box *next_focus_root = ui_box_from_key(focus_root->default_nav_focus_active_key);\r\n              if(ui_box_is_nil(next_focus_root))\r\n              {\r\n                prev_focus_root->default_nav_focus_next_active_key = ui_key_zero();\r\n                break;\r\n              }\r\n              else\r\n              {\r\n                prev_focus_root = focus_root;\r\n                focus_root = next_focus_root;\r\n              }\r\n            }\r\n          }\r\n        }\r\n      }\r\n    }\r\n    ui_state->default_nav_root_key = ui_key_zero();\r\n    scratch_end(scratch);\r\n  }\r\n  \r\n  //- rjf: next-default-nav-focus keys -> current-default-nav-focus-keys\r\n  for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1)\r\n  {\r\n    for(UI_Box *box = ui_state->box_table[slot_idx].hash_first;\r\n        !ui_box_is_nil(box);\r\n        box = box->hash_next)\r\n    {\r\n      box->default_nav_focus_hot_key = box->default_nav_focus_next_hot_key;\r\n      box->default_nav_focus_active_key = box->default_nav_focus_next_active_key;\r\n    }\r\n  }\r\n  \r\n  //- rjf: build top-level root\r\n  {\r\n    Rng2F32 window_rect = os_client_rect_from_window(window);\r\n    Vec2F32 window_rect_size = dim_2f32(window_rect);\r\n    ui_set_next_fixed_width(window_rect_size.x);\r\n    ui_set_next_fixed_height(window_rect_size.y);\r\n    ui_set_next_child_layout_axis(Axis2_X);\r\n    UI_Box *root = ui_build_box_from_stringf(0, \"###%I64x\", window.u64[0]);\r\n    ui_push_parent(root);\r\n    ui_state->root = root;\r\n  }\r\n  \r\n  //- rjf: setup parent box for tooltip\r\n  UI_FixedX(ui_state->mouse.x+15.f) UI_FixedY(ui_state->mouse.y+15.f) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f))\r\n  {\r\n    ui_set_next_child_layout_axis(Axis2_Y);\r\n    ui_state->tooltip_root = ui_build_box_from_stringf(0, \"###tooltip_%I64x\", window.u64[0]);\r\n  }\r\n  \r\n  //- rjf: setup parent box for context menu\r\n  ui_state->ctx_menu_open = ui_state->next_ctx_menu_open;\r\n  ui_state->ctx_menu_anchor_key = ui_state->next_ctx_menu_anchor_key;\r\n  {\r\n    UI_Box *anchor_box = ui_box_from_key(ui_state->ctx_menu_anchor_key);\r\n    if(!ui_box_is_nil(anchor_box))\r\n    {\r\n      ui_state->ctx_menu_anchor_box_last_pos = anchor_box->rect.p0;\r\n    }\r\n    Vec2F32 anchor = add_2f32(ui_state->ctx_menu_anchor_box_last_pos, ui_state->ctx_menu_anchor_off);\r\n    UI_FixedX(anchor.x) UI_FixedY(anchor.y) UI_PrefWidth(ui_children_sum(1.f)) UI_PrefHeight(ui_children_sum(1.f))\r\n      UI_Focus(UI_FocusKind_On)\r\n      UI_Squish(0.1f-ui_state->ctx_menu_open_t*0.1f)\r\n      UI_Transparency(1-ui_state->ctx_menu_open_t)\r\n    {\r\n      ui_set_next_child_layout_axis(Axis2_Y);\r\n      ui_state->ctx_menu_root = ui_build_box_from_stringf(UI_BoxFlag_Clickable|\r\n                                                          UI_BoxFlag_SquishAnchored|\r\n                                                          UI_BoxFlag_DrawDropShadow|\r\n                                                          (ui_state->ctx_menu_open*UI_BoxFlag_DefaultFocusNavY),\r\n                                                          \"###ctx_menu_%I64x\", window.u64[0]);\r\n    }\r\n  }\r\n  \r\n  //- rjf: reset hot if we don't have an active widget\r\n  {\r\n    B32 has_active = 0;\r\n    for EachEnumVal(UI_MouseButtonKind, k)\r\n    {\r\n      if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero()))\r\n      {\r\n        has_active = 1;\r\n      }\r\n    }\r\n    if(!has_active)\r\n    {\r\n      ui_state->hot_box_key = ui_key_zero();\r\n    }\r\n  }\r\n  \r\n  //- rjf: reset drop-hot key\r\n  {\r\n    ui_state->drop_hot_box_key = ui_key_zero();\r\n  }\r\n  \r\n  //- rjf: reset active if our active box is disabled\r\n  for EachEnumVal(UI_MouseButtonKind, k)\r\n  {\r\n    if(!ui_key_match(ui_state->active_box_key[k], ui_key_zero()))\r\n    {\r\n      UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]);\r\n      if(!ui_box_is_nil(box) && box->flags & UI_BoxFlag_Disabled)\r\n      {\r\n        ui_state->active_box_key[k] = ui_key_zero();\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: reset active keys if they have been pruned\r\n  for EachEnumVal(UI_MouseButtonKind, k)\r\n  {\r\n    UI_Box *box = ui_box_from_key(ui_state->active_box_key[k]);\r\n    if(ui_box_is_nil(box))\r\n    {\r\n      ui_state->active_box_key[k] = ui_key_zero();\r\n    }\r\n  }\r\n  \r\n  //- rjf: escape -> close context menu\r\n  if(ui_any_ctx_menu_is_open() && ui_slot_press(UI_EventActionSlot_Cancel))\r\n  {\r\n    ui_ctx_menu_close();\r\n  }\r\n}\r\n\r\ninternal void\r\nui_end_build(void)\r\n{\r\n  ProfBeginFunction();\r\n  \r\n  //- rjf: prune untouched or transient boxes in the cache\r\n  ProfScope(\"ui prune unused boxes\")\r\n  {\r\n    for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1)\r\n    {\r\n      for(UI_Box *box = ui_state->box_table[slot_idx].hash_first, *next = 0;\r\n          !ui_box_is_nil(box);\r\n          box = next)\r\n      {\r\n        next = box->hash_next;\r\n        if(box->last_touched_build_index < ui_state->build_index ||\r\n           ui_key_match(box->key, ui_key_zero()))\r\n        {\r\n          DLLRemove_NPZ(&ui_nil_box, ui_state->box_table[slot_idx].hash_first, ui_state->box_table[slot_idx].hash_last, box, hash_next, hash_prev);\r\n          SLLStackPush(ui_state->first_free_box, box);\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: layout box tree\r\n  ProfScope(\"ui box tree layout\")\r\n  {\r\n    for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1))\r\n    {\r\n      ui_layout_root(ui_state->root, axis);\r\n    }\r\n  }\r\n  \r\n  //- rjf: close ctx menu if untouched\r\n  if(!ui_state->ctx_menu_touched_this_frame)\r\n  {\r\n    ui_ctx_menu_close();\r\n  }\r\n  \r\n  //- rjf: stick ctx menu to anchor\r\n  if(ui_state->ctx_menu_touched_this_frame && !ui_state->ctx_menu_changed)\r\n  {\r\n    UI_Box *anchor_box = ui_box_from_key(ui_state->ctx_menu_anchor_key);\r\n    if(!ui_box_is_nil(anchor_box))\r\n    {\r\n      Rng2F32 root_rect = ui_state->ctx_menu_root->rect;\r\n      Vec2F32 pos =\r\n      {\r\n        anchor_box->rect.x0 + ui_state->ctx_menu_anchor_off.x,\r\n        anchor_box->rect.y0 + ui_state->ctx_menu_anchor_off.y,\r\n      };\r\n      Vec2F32 shift = sub_2f32(pos, root_rect.p0);\r\n      Rng2F32 new_root_rect = shift_2f32(root_rect, shift);\r\n      ui_state->ctx_menu_root->fixed_position = new_root_rect.p0;\r\n      ui_state->ctx_menu_root->fixed_size = dim_2f32(new_root_rect);\r\n      ui_state->ctx_menu_root->rect = new_root_rect;\r\n    }\r\n  }\r\n  \r\n  //- rjf: anchor tooltips\r\n  if(!ui_key_match(ui_state->tooltip_anchor_key, ui_key_zero()))\r\n  {\r\n    UI_Box *anchor_box = ui_box_from_key(ui_state->tooltip_anchor_key);\r\n    if(!ui_box_is_nil(anchor_box))\r\n    {\r\n      Vec2F32 dim = dim_2f32(ui_state->tooltip_root->rect);\r\n      ui_state->tooltip_root->fixed_position.x = ui_state->tooltip_root->rect.x0 = anchor_box->rect.x0;\r\n      ui_state->tooltip_root->fixed_position.y = ui_state->tooltip_root->rect.y0 = anchor_box->rect.y1 + anchor_box->font_size*0.5f;\r\n      ui_state->tooltip_root->rect.x1 = ui_state->tooltip_root->rect.x0 + dim.x;\r\n      ui_state->tooltip_root->rect.y1 = ui_state->tooltip_root->rect.y0 + dim.y;\r\n    }\r\n    else\r\n    {\r\n      ui_state->tooltip_root->rect.x0 = 10000;\r\n      ui_state->tooltip_root->rect.y0 = 10000;\r\n    }\r\n  }\r\n  \r\n  //- rjf: ensure special floating roots are within screen bounds\r\n  UI_Box *floating_roots[] = {ui_state->tooltip_root, ui_state->ctx_menu_root};\r\n  B32 force_contain[] =\r\n  {\r\n    !ui_state->tooltip_can_overflow_window,\r\n    1,\r\n  };\r\n  for(U64 idx = 0; idx < ArrayCount(floating_roots); idx += 1)\r\n  {\r\n    UI_Box *root = floating_roots[idx];\r\n    if(!ui_box_is_nil(root))\r\n    {\r\n      Rng2F32 window_rect = os_client_rect_from_window(ui_window());\r\n      Vec2F32 window_dim = dim_2f32(window_rect);\r\n      Rng2F32 root_rect = root->rect;\r\n      Vec2F32 shift_down =\r\n      {\r\n        -ClampBot(0, root_rect.x1 - window_rect.x1) * (force_contain[idx]),\r\n        -ClampBot(0, root_rect.y1 - window_rect.y1) * (force_contain[idx]),\r\n      };\r\n      Rng2F32 new_root_rect = shift_2f32(root_rect, shift_down);\r\n      Vec2F32 shift_up =\r\n      {\r\n        ClampBot(0, window_rect.x0 - new_root_rect.x0) * (force_contain[idx]),\r\n        ClampBot(0, window_rect.y0 - new_root_rect.y0) * (force_contain[idx]),\r\n      };\r\n      new_root_rect = shift_2f32(new_root_rect, shift_up);\r\n      root->fixed_position = new_root_rect.p0;\r\n      root->fixed_size = dim_2f32(new_root_rect);\r\n      root->rect = new_root_rect;\r\n      for(Axis2 axis = (Axis2)0; axis < Axis2_COUNT; axis = (Axis2)(axis + 1))\r\n      {\r\n        ui_calc_sizes_standalone__in_place(root, axis);\r\n        ui_calc_sizes_upwards_dependent__in_place(root, axis);\r\n        ui_calc_sizes_downwards_dependent__in_place(root, axis);\r\n        ui_layout_enforce_constraints__in_place(root, axis);\r\n        ui_layout_position__in_place(root, axis);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: enforce child-rounding\r\n  {\r\n    for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1)\r\n    {\r\n      for(UI_Box *box = ui_state->box_table[slot_idx].hash_first;\r\n          !ui_box_is_nil(box);\r\n          box = box->hash_next)\r\n      {\r\n        if(box->flags & UI_BoxFlag_RoundChildrenByParent)\r\n        {\r\n          for(UI_Box *b = box; !ui_box_is_nil(b); b = ui_box_rec_df_pre(b, box).next)\r\n          {\r\n            if(floor_f32(b->rect.x0) <= floor_f32(box->rect.x0) &&\r\n               floor_f32(b->rect.y0) <= floor_f32(box->rect.y0))\r\n            {\r\n              b->corner_radii[Corner_00] = box->corner_radii[Corner_00];\r\n            }\r\n            if(floor_f32(b->rect.x1) >= floor_f32(box->rect.x1) &&\r\n               floor_f32(b->rect.y0) <= floor_f32(box->rect.y0))\r\n            {\r\n              b->corner_radii[Corner_10] = box->corner_radii[Corner_10];\r\n            }\r\n            if(floor_f32(b->rect.x0) <= floor_f32(box->rect.x0) &&\r\n               floor_f32(b->rect.y1) >= floor_f32(box->rect.y1))\r\n            {\r\n              b->corner_radii[Corner_01] = box->corner_radii[Corner_01];\r\n            }\r\n            if(floor_f32(b->rect.x1) >= floor_f32(box->rect.x1) &&\r\n               floor_f32(b->rect.y1) >= floor_f32(box->rect.y1))\r\n            {\r\n              b->corner_radii[Corner_11] = box->corner_radii[Corner_11];\r\n            }\r\n          }\r\n          box->first->corner_radii[Corner_00] = box->corner_radii[Corner_00];\r\n          box->first->corner_radii[Corner_10] = box->corner_radii[Corner_10];\r\n          box->last->corner_radii[Corner_01] = box->corner_radii[Corner_01];\r\n          box->last->corner_radii[Corner_11] = box->corner_radii[Corner_11];\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: animate\r\n  ProfScope(\"animate\")\r\n  {\r\n    for(U64 slot_idx = 0; slot_idx < ui_state->anim_slots_count; slot_idx += 1)\r\n    {\r\n      for(UI_AnimNode *n = ui_state->anim_slots[slot_idx].first;\r\n          n != &ui_nil_anim_node && n != 0;\r\n          n = n->slot_next)\r\n      {\r\n        n->current += (n->params.target - n->current) * n->params.rate;\r\n        ui_state->is_animating = (ui_state->is_animating || abs_f32(n->params.target - n->current) > n->params.epsilon);\r\n      }\r\n    }\r\n    F32 fast_rate = ui_state->default_animation_rate;\r\n    F32 slow_rate = 1 - pow_f32(2, (-30.f * ui_state->animation_dt));\r\n    for(U64 slot_idx = 0; slot_idx < ui_state->theme_pattern_cache_slots_count; slot_idx += 1)\r\n    {\r\n      for(UI_ThemePatternCacheNode *n = ui_state->theme_pattern_cache_slots[slot_idx].first;\r\n          n != 0;\r\n          n = n->slot_next)\r\n      {\r\n        for EachIndex(idx, 4)\r\n        {\r\n          n->current_rgba.v[idx] += (n->target_rgba.v[idx] - n->current_rgba.v[idx]) * slow_rate;\r\n          ui_state->is_animating = (ui_state->is_animating || abs_f32(n->target_rgba.v[idx] - n->current_rgba.v[idx]) > 0.001f);\r\n        }\r\n      }\r\n    }\r\n    ui_state->ctx_menu_open_t += ((F32)!!ui_state->ctx_menu_open - ui_state->ctx_menu_open_t) * ui_state->animation_info.menu_animation_rate;\r\n    ui_state->is_animating = (ui_state->is_animating || abs_f32((F32)!!ui_state->ctx_menu_open - ui_state->ctx_menu_open_t) > 0.01f);\r\n    if(ui_state->ctx_menu_open_t >= 0.99f && ui_state->ctx_menu_open)\r\n    {\r\n      ui_state->ctx_menu_open_t = 1.f;\r\n    }\r\n    ui_state->tooltip_open_t += ((F32)!!ui_state->tooltip_open - ui_state->tooltip_open_t) * ui_state->animation_info.tooltip_animation_rate;\r\n    ui_state->is_animating = (ui_state->is_animating || abs_f32((F32)!!ui_state->tooltip_open - ui_state->tooltip_open_t) > 0.01f);\r\n    if(ui_state->tooltip_open_t >= 0.99f && ui_state->tooltip_open)\r\n    {\r\n      ui_state->tooltip_open_t = 1.f;\r\n    }\r\n    for(U64 slot_idx = 0; slot_idx < ui_state->box_table_size; slot_idx += 1)\r\n    {\r\n      for(UI_Box *box = ui_state->box_table[slot_idx].hash_first;\r\n          !ui_box_is_nil(box);\r\n          box = box->hash_next)\r\n      {\r\n        // rjf: grab states informing animation\r\n        B32 is_hot            = (ui_key_match(box->key, ui_state->hot_box_key) ||\r\n                                 ui_key_match(box->key, ui_state->drop_hot_box_key));\r\n        B32 is_active         = ui_key_match(box->key, ui_state->active_box_key[UI_MouseButtonKind_Left]);\r\n        B32 is_disabled       = !!(box->flags & UI_BoxFlag_Disabled) && (box->first_disabled_build_index+2 < ui_state->build_index ||\r\n                                                                         box->first_touched_build_index == box->first_disabled_build_index);\r\n        B32 is_focus_hot      = !!(box->flags & UI_BoxFlag_FocusHot) && !(box->flags & UI_BoxFlag_FocusHotDisabled);\r\n        B32 is_focus_active   = !!(box->flags & UI_BoxFlag_FocusActive) && !(box->flags & UI_BoxFlag_FocusActiveDisabled);\r\n        B32 is_focus_active_disabled = !!(box->flags & UI_BoxFlag_FocusActiveDisabled);\r\n        \r\n        // rjf: determine rates\r\n        F32 hot_rate      = ui_state->animation_info.hot_animation_rate;\r\n        F32 active_rate   = ui_state->animation_info.active_animation_rate;\r\n        F32 disabled_rate = slow_rate;\r\n        F32 focus_rate    = ui_state->animation_info.focus_animation_rate;\r\n        \r\n        // rjf: determine animating status\r\n        B32 box_is_animating = 0;\r\n        box_is_animating = (box_is_animating || abs_f32((F32)is_hot          - box->hot_t) > 0.01f);\r\n        box_is_animating = (box_is_animating || abs_f32((F32)is_active       - box->active_t) > 0.01f);\r\n        box_is_animating = (box_is_animating || abs_f32((F32)is_disabled     - box->disabled_t) > 0.01f);\r\n        box_is_animating = (box_is_animating || abs_f32((F32)is_focus_hot    - box->focus_hot_t) > 0.01f);\r\n        box_is_animating = (box_is_animating || abs_f32((F32)is_focus_active - box->focus_active_t) > 0.01f);\r\n        box_is_animating = (box_is_animating || abs_f32((F32)is_focus_active_disabled - box->focus_active_disabled_t) > 0.01f);\r\n        box_is_animating = (box_is_animating || abs_f32(box->view_off_target.x - box->view_off.x) > 0.5f);\r\n        box_is_animating = (box_is_animating || abs_f32(box->view_off_target.y - box->view_off.y) > 0.5f);\r\n        if(box->flags & UI_BoxFlag_AnimatePosX)\r\n        {\r\n          box_is_animating = (box_is_animating || abs_f32(box->fixed_position_animated.x - box->fixed_position.x) > 0.5f);\r\n        }\r\n        if(box->flags & UI_BoxFlag_AnimatePosY)\r\n        {\r\n          box_is_animating = (box_is_animating || abs_f32(box->fixed_position_animated.y - box->fixed_position.y) > 0.5f);\r\n        }\r\n        ui_state->is_animating = (ui_state->is_animating || box_is_animating);\r\n#if 0 // NOTE(rjf): enable to debug animation-causing-frames (or not)\r\n        if(box_is_animating)\r\n        {\r\n          box->overlay_color = v4f32(1, 0, 0, 0.1f);\r\n          box->flags |= UI_BoxFlag_DrawOverlay;\r\n        }\r\n#endif\r\n        \r\n        // rjf: animate interaction transition states\r\n        box->hot_t                   += hot_rate      * ((F32)is_hot - box->hot_t);\r\n        box->active_t                = is_active ? 1.f : box->active_t + (active_rate   * ((F32)is_active - box->active_t));\r\n        box->disabled_t              += disabled_rate * ((F32)is_disabled - box->disabled_t);\r\n        box->focus_hot_t             += focus_rate    * ((F32)is_focus_hot - box->focus_hot_t);\r\n        box->focus_active_t          += focus_rate    * ((F32)is_focus_active - box->focus_active_t);\r\n        box->focus_active_disabled_t += focus_rate    * ((F32)is_focus_active_disabled - box->focus_active_disabled_t);\r\n        \r\n        // rjf: animate positions\r\n        {\r\n          box->fixed_position_animated.x += fast_rate * (box->fixed_position.x - box->fixed_position_animated.x);\r\n          box->fixed_position_animated.y += fast_rate * (box->fixed_position.y - box->fixed_position_animated.y);\r\n          if(abs_f32(box->fixed_position.x - box->fixed_position_animated.x) < 1)\r\n          {\r\n            box->fixed_position_animated.x = box->fixed_position.x;\r\n          }\r\n          if(abs_f32(box->fixed_position.y - box->fixed_position_animated.y) < 1)\r\n          {\r\n            box->fixed_position_animated.y = box->fixed_position.y;\r\n          }\r\n        }\r\n        \r\n        // rjf: clamp view\r\n        if(box->flags & UI_BoxFlag_ViewClamp)\r\n        {\r\n          Vec2F32 max_view_off_target =\r\n          {\r\n            ClampBot(0, box->view_bounds.x - box->fixed_size.x),\r\n            ClampBot(0, box->view_bounds.y - box->fixed_size.y),\r\n          };\r\n          if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); }\r\n          if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); }\r\n        }\r\n        \r\n        // rjf: animate view offset\r\n        {\r\n          box->view_off.x += ui_state->animation_info.scroll_animation_rate * (box->view_off_target.x - box->view_off.x);\r\n          box->view_off.y += ui_state->animation_info.scroll_animation_rate * (box->view_off_target.y - box->view_off.y);\r\n          if(abs_f32(box->view_off.x - box->view_off_target.x) < 2)\r\n          {\r\n            box->view_off.x = box->view_off_target.x;\r\n          }\r\n          if(abs_f32(box->view_off.y - box->view_off_target.y) < 2)\r\n          {\r\n            box->view_off.y = box->view_off_target.y;\r\n          }\r\n        }\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: use group keys for box animation data if possible\r\n  for(UI_Box *b = ui_state->root; !ui_box_is_nil(b); b = ui_box_rec_df_pre(b, ui_state->root).next)\r\n  {\r\n    if(ui_key_match(b->key, ui_key_zero()) && !ui_key_match(b->group_key, ui_key_zero()))\r\n    {\r\n      UI_Box *group_box = ui_box_from_key(b->group_key);\r\n      b->hot_t = group_box->hot_t;\r\n    }\r\n  }\r\n  \r\n  //- rjf: fall-through interact with context menu\r\n  if(ui_state->ctx_menu_open)\r\n  {\r\n    ui_signal_from_box(ui_state->ctx_menu_root);\r\n  }\r\n  \r\n  //- rjf: close ctx menu if unconsumed clicks\r\n  {\r\n    for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n    {\r\n      if(evt->kind == UI_EventKind_Press &&\r\n         (evt->key == OS_Key_LeftMouseButton || evt->key == OS_Key_RightMouseButton))\r\n      {\r\n        ui_ctx_menu_close();\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: hover cursor\r\n  if(!ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_state->external_key))\r\n  {\r\n    UI_Box *hot = ui_box_from_key(ui_state->hot_box_key);\r\n    UI_Box *active = ui_box_from_key(ui_state->active_box_key[UI_MouseButtonKind_Left]);\r\n    UI_Box *box = ui_box_is_nil(active) ? hot : active;\r\n    OS_Cursor cursor = box->hover_cursor;\r\n    if(box->flags & UI_BoxFlag_Disabled && box->flags & UI_BoxFlag_Clickable)\r\n    {\r\n      cursor = OS_Cursor_Disabled;\r\n    }\r\n    if(os_window_is_focused(ui_state->window) || !ui_box_is_nil(active))\r\n    {\r\n      os_set_cursor(cursor);\r\n    }\r\n  }\r\n  \r\n  //- rjf: clipboard commits\r\n  {\r\n    UI_Box *box = ui_box_from_key(ui_state->clipboard_copy_key);\r\n    if(!ui_box_is_nil(box))\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      String8List strs = {0};\r\n      UI_BoxRec rec = {0};\r\n      for(UI_Box *b = box; !ui_box_is_nil(b); rec = ui_box_rec_df_pre(b, box), b = rec.next)\r\n      {\r\n        if(b->flags & UI_BoxFlag_DrawText && b->flags & UI_BoxFlag_HasDisplayString && !fnt_tag_match(b->font, ui_icon_font()))\r\n        {\r\n          String8 display_string = ui_box_display_string(b);\r\n          str8_list_push(scratch.arena, &strs, display_string);\r\n        }\r\n      }\r\n      if(strs.node_count != 0)\r\n      {\r\n        StringJoin join = {0};\r\n        join.sep = str8_lit(\" \");\r\n        String8 string = str8_list_join(scratch.arena, &strs, &join);\r\n        os_set_clipboard_text(string);\r\n      }\r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n  \r\n  //- rjf: hovering possibly-truncated drawn text -> store text\r\n  {\r\n    B32 inactive = 1;\r\n    for EachEnumVal(UI_MouseButtonKind, k)\r\n    {\r\n      if(!ui_key_match(ui_key_zero(), ui_state->active_box_key[k]))\r\n      {\r\n        inactive = 0;\r\n        break;\r\n      }\r\n    }\r\n    if(inactive)\r\n    {\r\n      B32 found = 0;\r\n      for(UI_Box *box = ui_state->root, *next = 0; !ui_box_is_nil(box); box = next)\r\n      {\r\n        UI_BoxRec rec = ui_box_rec_df_pre(box, ui_state->root);\r\n        next = rec.next;\r\n        S32 pop_idx = 0;\r\n        for(UI_Box *b = box; !ui_box_is_nil(b) && pop_idx <= rec.pop_count; b = b->parent, pop_idx += 1)\r\n        {\r\n          if(b->flags & UI_BoxFlag_DrawText && !(b->flags & UI_BoxFlag_DisableTextTrunc))\r\n          {\r\n            Rng2F32 rect = b->rect;\r\n            for(UI_Box *p = b->parent; !ui_box_is_nil(p); p = p->parent)\r\n            {\r\n              if(p->flags & UI_BoxFlag_Clip)\r\n              {\r\n                rect = intersect_2f32(rect, p->rect);\r\n              }\r\n            }\r\n            String8 box_display_string = ui_box_display_string(b);\r\n            Vec2F32 text_pos = ui_box_text_position(b);\r\n            Vec2F32 drawn_text_dim = {0};\r\n            {\r\n              Temp scratch = scratch_begin(0, 0);\r\n              DR_FRunList fruns = dr_fruns_from_fstrs(scratch.arena, b->tab_size, &b->display_fstrs);\r\n              drawn_text_dim = fruns.dim;\r\n              scratch_end(scratch);\r\n            }\r\n            B32 text_is_truncated = (drawn_text_dim.x + text_pos.x > rect.x1);\r\n            B32 mouse_is_hovering = contains_2f32(r2f32p(text_pos.x,\r\n                                                         rect.y0,\r\n                                                         Min(text_pos.x+drawn_text_dim.x, rect.x1),\r\n                                                         rect.y1),\r\n                                                  ui_state->mouse);\r\n            if(text_is_truncated && mouse_is_hovering && !(b->flags & UI_BoxFlag_DisableTruncatedHover))\r\n            {\r\n              if(!str8_match(box_display_string, ui_state->string_hover_string, 0) || box->font_size != ui_state->string_hover_size)\r\n              {\r\n                arena_clear(ui_state->string_hover_arena);\r\n                ui_state->string_hover_string = push_str8_copy(ui_state->string_hover_arena, box_display_string);\r\n                ui_state->string_hover_size = box->font_size;\r\n                ui_state->string_hover_fstrs = dr_fstrs_copy(ui_state->string_hover_arena, &b->display_fstrs);\r\n                ui_state->string_hover_begin_us = os_now_microseconds();\r\n              }\r\n              ui_state->string_hover_build_index = ui_state->build_index;\r\n              found = 1;\r\n              goto break_all_hover_string;\r\n            }\r\n          }\r\n          if(b != box && ui_key_match(b->key, ui_hot_key()))\r\n          {\r\n            goto break_all_hover_string;\r\n          }\r\n          if(b != box && contains_2f32(b->rect, ui_state->mouse) && b->flags & UI_BoxFlag_DrawText)\r\n          {\r\n            goto break_all_hover_string;\r\n          }\r\n        }\r\n      }\r\n      break_all_hover_string:;\r\n      if(!found)\r\n      {\r\n        arena_clear(ui_state->string_hover_arena);\r\n        ui_state->string_hover_build_index = 0;\r\n        MemoryZeroStruct(&ui_state->string_hover_string);\r\n      }\r\n      if(found && !ui_string_hover_active())\r\n      {\r\n        ui_state->is_animating = 1;\r\n      }\r\n    }\r\n  }\r\n  \r\n  ui_state->build_index += 1;\r\n  arena_clear(ui_build_arena());\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nui_calc_sizes_standalone__in_place(UI_Box *root, Axis2 axis)\r\n{\r\n  ProfBeginFunction();\r\n  for(UI_Box *b = root; !ui_box_is_nil(b); b = ui_box_rec_df_pre(b, root).next)\r\n  {\r\n    switch(b->pref_size[axis].kind)\r\n    {\r\n      default:{}break;\r\n      case UI_SizeKind_Pixels:\r\n      {\r\n        b->fixed_size.v[axis] = b->pref_size[axis].value;\r\n      }break;\r\n      case UI_SizeKind_TextContent:\r\n      {\r\n        F32 padding = b->pref_size[axis].value;\r\n        F32 text_size = b->display_fruns.dim.x;\r\n        b->fixed_size.v[axis] = padding + text_size + b->text_padding*2;\r\n      }break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nui_calc_sizes_upwards_dependent__in_place(UI_Box *root, Axis2 axis)\r\n{\r\n  ProfBeginFunction();\r\n  for(UI_Box *b = root; !ui_box_is_nil(b); b = ui_box_rec_df_pre(b, root).next)\r\n  {\r\n    switch(b->pref_size[axis].kind)\r\n    {\r\n      default:{}break;\r\n      case UI_SizeKind_ParentPct:\r\n      {\r\n        // rjf: find parent that has a fixed size\r\n        UI_Box *fixed_parent = &ui_nil_box;\r\n        for(UI_Box *p = b->parent; !ui_box_is_nil(p); p = p->parent)\r\n        {\r\n          if(p->flags & (UI_BoxFlag_FixedWidth<<axis) ||\r\n             p->pref_size[axis].kind == UI_SizeKind_Pixels ||\r\n             p->pref_size[axis].kind == UI_SizeKind_TextContent ||\r\n             p->pref_size[axis].kind == UI_SizeKind_ParentPct)\r\n          {\r\n            fixed_parent = p;\r\n            break;\r\n          }\r\n        }\r\n        \r\n        // rjf: figure out box's size on this axis\r\n        F32 size = fixed_parent->fixed_size.v[axis] * b->pref_size[axis].value;\r\n        \r\n        // rjf: mutate box to have this size\r\n        b->fixed_size.v[axis] = size;\r\n      }break;\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nui_calc_sizes_downwards_dependent__in_place(UI_Box *root, Axis2 axis)\r\n{\r\n  ProfBeginFunction();\r\n  UI_BoxRec rec = {0};\r\n  for(UI_Box *box = root; !ui_box_is_nil(box); box = rec.next)\r\n  {\r\n    rec = ui_box_rec_df_pre(box, root);\r\n    S32 pop_idx = 0;\r\n    for(UI_Box *b = box;\r\n        !ui_box_is_nil(b) && pop_idx <= rec.pop_count;\r\n        b = b->parent, pop_idx += 1)\r\n    {\r\n      if(b->pref_size[axis].kind == UI_SizeKind_ChildrenSum)\r\n      {\r\n        F32 sum = 0;\r\n        for(UI_Box *child = b->first; !ui_box_is_nil(child); child = child->next)\r\n        {\r\n          if(!(child->flags & (UI_BoxFlag_FloatingX<<axis)))\r\n          {\r\n            if(axis == b->child_layout_axis)\r\n            {\r\n              sum += child->fixed_size.v[axis];\r\n            }\r\n            else\r\n            {\r\n              sum = Max(sum, child->fixed_size.v[axis]);\r\n            }\r\n          }\r\n        }\r\n        b->fixed_size.v[axis] = sum;\r\n      }\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nui_layout_enforce_constraints__in_place(UI_Box *root, Axis2 axis)\r\n{\r\n  ProfBeginFunction();\r\n  Temp scratch = scratch_begin(0, 0);\r\n  for(UI_Box *box = root; !ui_box_is_nil(box); box = ui_box_rec_df_pre(box, root).next)\r\n  {\r\n    //- rjf: fixup children sizes (if we're solving along the *non-layout* axis)\r\n    if(axis != box->child_layout_axis && !(box->flags & (UI_BoxFlag_AllowOverflowX << axis)))\r\n    {\r\n      F32 allowed_size = box->fixed_size.v[axis];\r\n      for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next)\r\n      {\r\n        if(!(child->flags & (UI_BoxFlag_FloatingX<<axis)))\r\n        {\r\n          F32 child_size = child->fixed_size.v[axis];\r\n          F32 violation = child_size - allowed_size;\r\n          F32 max_fixup = child_size;\r\n          F32 fixup = Clamp(0, violation, max_fixup);\r\n          if(fixup > 0)\r\n          {\r\n            child->fixed_size.v[axis] -= fixup;\r\n          }\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: fixup children sizes (in the direction of the layout axis)\r\n    if(axis == box->child_layout_axis && !(box->flags & (UI_BoxFlag_AllowOverflowX << axis)))\r\n    {\r\n      // rjf: figure out total allowed size & total size\r\n      F32 total_allowed_size = box->fixed_size.v[axis];\r\n      F32 total_size = 0;\r\n      F32 total_weighted_size = 0;\r\n      for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next)\r\n      {\r\n        if(!(child->flags & (UI_BoxFlag_FloatingX<<axis)))\r\n        {\r\n          total_size += child->fixed_size.v[axis];\r\n          total_weighted_size += child->fixed_size.v[axis] * (1-child->pref_size[axis].strictness);\r\n        }\r\n      }\r\n      \r\n      // rjf: if we have a violation, we need to subtract some amount from all children\r\n      F32 violation = total_size - total_allowed_size;\r\n      if(violation > 0 && total_weighted_size > 0)\r\n      {\r\n        Temp temp = temp_begin(scratch.arena);\r\n        \r\n        // rjf: figure out how much we can take in totality\r\n        F32 child_fixup_sum = 0;\r\n        F32 *child_fixups = push_array(temp.arena, F32, box->child_count);\r\n        {\r\n          U64 child_idx = 0;\r\n          for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next, child_idx += 1)\r\n          {\r\n            if(!(child->flags & (UI_BoxFlag_FloatingX<<axis)))\r\n            {\r\n              F32 fixup_size_this_child = child->fixed_size.v[axis] * (1-child->pref_size[axis].strictness);\r\n              fixup_size_this_child = ClampBot(0, fixup_size_this_child);\r\n              child_fixups[child_idx] = fixup_size_this_child;\r\n              child_fixup_sum += fixup_size_this_child;\r\n            }\r\n          }\r\n        }\r\n        \r\n        // rjf: fixup child sizes\r\n        {\r\n          U64 child_idx = 0;\r\n          for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next, child_idx += 1)\r\n          {\r\n            if(!(child->flags & (UI_BoxFlag_FloatingX<<axis)))\r\n            {\r\n              F32 fixup_pct = (violation / total_weighted_size);\r\n              fixup_pct = Clamp(0, fixup_pct, 1);\r\n              child->fixed_size.v[axis] -= child_fixups[child_idx] * fixup_pct;\r\n            }\r\n          }\r\n        }\r\n        \r\n        temp_end(temp);\r\n      }\r\n    }\r\n    \r\n    //- rjf: fixup upwards-relative sizes\r\n    if(box->flags & (UI_BoxFlag_AllowOverflowX << axis))\r\n    {\r\n      for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next)\r\n      {\r\n        if(child->pref_size[axis].kind == UI_SizeKind_ParentPct)\r\n        {\r\n          child->fixed_size.v[axis] = box->fixed_size.v[axis] * child->pref_size[axis].value;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: enforce clamps\r\n    for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next)\r\n    {\r\n      child->fixed_size.v[axis] = Max(child->fixed_size.v[axis], child->min_size.v[axis]);\r\n    }\r\n  }\r\n  scratch_end(scratch);\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nui_layout_position__in_place(UI_Box *root, Axis2 axis)\r\n{\r\n  ProfBeginFunction();\r\n  for(UI_Box *box = root; !ui_box_is_nil(box); box = ui_box_rec_df_pre(box, root).next)\r\n  {\r\n    F32 layout_position = 0;\r\n    \r\n    //- rjf: lay out children\r\n    F32 bounds = 0;\r\n    for(UI_Box *child = box->first; !ui_box_is_nil(child); child = child->next)\r\n    {\r\n      // rjf: grab original position\r\n      F32 original_position = Min(child->rect.p0.v[axis], child->rect.p1.v[axis]);\r\n      \r\n      // rjf: calculate fixed position & size\r\n      if(!(child->flags & (UI_BoxFlag_FloatingX<<axis)))\r\n      {\r\n        child->fixed_position.v[axis] = layout_position;\r\n        if(box->child_layout_axis == axis)\r\n        {\r\n          layout_position += child->fixed_size.v[axis];\r\n          bounds += child->fixed_size.v[axis];\r\n        }\r\n        else\r\n        {\r\n          bounds = Max(bounds, child->fixed_size.v[axis]);\r\n        }\r\n      }\r\n      \r\n      // rjf: determine final rect for child, given fixed_position & size\r\n      if(child->flags & (UI_BoxFlag_AnimatePosX<<axis))\r\n      {\r\n        if(child->first_touched_build_index == child->last_touched_build_index)\r\n        {\r\n          child->fixed_position_animated = child->fixed_position;\r\n        }\r\n        child->rect.p0.v[axis] = box->rect.p0.v[axis] + child->fixed_position_animated.v[axis] - !(child->flags&(UI_BoxFlag_SkipViewOffX<<axis))*floor_f32(box->view_off.v[axis]);\r\n      }\r\n      else\r\n      {\r\n        child->rect.p0.v[axis] = box->rect.p0.v[axis] + child->fixed_position.v[axis] - !(child->flags&(UI_BoxFlag_SkipViewOffX<<axis))*floor_f32(box->view_off.v[axis]);\r\n      }\r\n      child->rect.p1.v[axis] = child->rect.p0.v[axis] + child->fixed_size.v[axis];\r\n      child->rect.p0.x = floor_f32(child->rect.p0.x);\r\n      child->rect.p0.y = floor_f32(child->rect.p0.y);\r\n      child->rect.p1.x = floor_f32(child->rect.p1.x);\r\n      child->rect.p1.y = floor_f32(child->rect.p1.y);\r\n      \r\n      // rjf: grab new position\r\n      F32 new_position = Min(child->rect.p0.v[axis], child->rect.p1.v[axis]);\r\n      \r\n      // rjf: store position delta\r\n      child->position_delta.v[axis] = new_position - original_position;\r\n    }\r\n    \r\n    //- rjf: store view bounds\r\n    {\r\n      box->view_bounds.v[axis] = bounds;\r\n    }\r\n  }\r\n  ProfEnd();\r\n}\r\n\r\ninternal void\r\nui_layout_root(UI_Box *root, Axis2 axis)\r\n{\r\n  ProfBegin(\"ui layout pass (%s)\", axis == Axis2_X ? \"x\" : \"y\");\r\n  ui_calc_sizes_standalone__in_place(root, axis);\r\n  ui_calc_sizes_upwards_dependent__in_place(root, axis);\r\n  ui_calc_sizes_downwards_dependent__in_place(root, axis);\r\n  ui_layout_enforce_constraints__in_place(root, axis);\r\n  ui_layout_position__in_place(root, axis);\r\n  ProfEnd();\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Box Building API\r\n\r\n//- rjf: spacers\r\n\r\ninternal UI_Signal\r\nui_spacer(UI_Size size)\r\n{\r\n  UI_Box *parent = ui_top_parent();\r\n  ui_set_next_pref_size(parent->child_layout_axis, size);\r\n  UI_Box *box = ui_build_box_from_key(0, ui_key_zero());\r\n  UI_Signal interact = ui_signal_from_box(box);\r\n  return interact;\r\n}\r\n\r\n//- rjf: tooltips\r\n\r\ninternal void\r\nui_tooltip_begin_base(void)\r\n{\r\n  ui_state->tooltip_open = 1;\r\n  ui_push_parent(ui_root_from_state(ui_state));\r\n  ui_push_parent(ui_state->tooltip_root);\r\n  ui_push_flags(0);\r\n  ui_push_text_raster_flags(ui_bottom_text_raster_flags());\r\n  ui_push_font_size(ui_bottom_font_size());\r\n  ui_push_tag(str8_lit(\".\"));\r\n  ui_push_tag(str8_lit(\"floating\"));\r\n}\r\n\r\ninternal void\r\nui_tooltip_end_base(void)\r\n{\r\n  ui_pop_tag();\r\n  ui_pop_tag();\r\n  ui_pop_font_size();\r\n  ui_pop_text_raster_flags();\r\n  ui_pop_flags();\r\n  ui_pop_parent();\r\n  ui_pop_parent();\r\n}\r\n\r\ninternal void\r\nui_tooltip_begin(void)\r\n{\r\n  ui_tooltip_begin_base();\r\n  ui_set_next_squish(0.1f-ui_state->tooltip_open_t*0.1f);\r\n  ui_set_next_transparency(1-ui_state->tooltip_open_t);\r\n  UI_Flags(UI_BoxFlag_Floating|UI_BoxFlag_DrawBorder|UI_BoxFlag_DrawBackground|UI_BoxFlag_DrawBackgroundBlur|UI_BoxFlag_DrawDropShadow|UI_BoxFlag_SquishAnchored)\r\n    UI_PrefWidth(ui_children_sum(1))\r\n    UI_PrefHeight(ui_children_sum(1))\r\n    UI_CornerRadius(ui_top_font_size()*0.25f)\r\n    ui_column_begin();\r\n  UI_PrefWidth(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f));\r\n  UI_PrefWidth(ui_children_sum(1))\r\n    UI_PrefHeight(ui_children_sum(1))\r\n    ui_row_begin();\r\n  UI_PrefHeight(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f));\r\n  UI_PrefWidth(ui_children_sum(1))\r\n    UI_PrefHeight(ui_children_sum(1))\r\n    ui_column_begin();\r\n  ui_push_pref_width(ui_text_dim(10.f, 1.f));\r\n  ui_push_pref_height(ui_em(2.f, 1.f));\r\n  ui_push_text_alignment(UI_TextAlign_Center);\r\n}\r\n\r\ninternal void\r\nui_tooltip_end(void)\r\n{\r\n  ui_pop_text_alignment();\r\n  ui_pop_pref_width();\r\n  ui_pop_pref_height();\r\n  ui_column_end();\r\n  UI_PrefHeight(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f));\r\n  ui_row_end();\r\n  UI_PrefWidth(ui_px(0, 1)) ui_spacer(ui_em(1.f, 1.f));\r\n  ui_column_end();\r\n  ui_tooltip_end_base();\r\n}\r\n\r\n//- rjf: context menus\r\n\r\ninternal void\r\nui_ctx_menu_open(UI_Key key, UI_Key anchor_box_key, Vec2F32 anchor_off)\r\n{\r\n  anchor_off.x = (F32)(int)anchor_off.x;\r\n  anchor_off.y = (F32)(int)anchor_off.y;\r\n  ui_state->next_ctx_menu_open = 1;\r\n  ui_state->ctx_menu_changed = 1;\r\n  ui_state->ctx_menu_open_t = 0;\r\n  ui_state->ctx_menu_key = key;\r\n  ui_state->next_ctx_menu_anchor_key = anchor_box_key;\r\n  ui_state->ctx_menu_anchor_off = anchor_off;\r\n  ui_state->ctx_menu_touched_this_frame = 1;\r\n  ui_state->ctx_menu_anchor_box_last_pos = v2f32(0, 0);\r\n  ui_state->ctx_menu_root->default_nav_focus_active_key = ui_key_zero();\r\n  ui_state->ctx_menu_root->default_nav_focus_next_active_key = ui_key_zero();\r\n}\r\n\r\ninternal void\r\nui_ctx_menu_close(void)\r\n{\r\n  ui_state->next_ctx_menu_open = 0;\r\n}\r\n\r\ninternal B32\r\nui_begin_ctx_menu(UI_Key key)\r\n{\r\n  ui_push_parent(ui_root_from_state(ui_state));\r\n  ui_push_parent(ui_state->ctx_menu_root);\r\n  ui_push_pref_width(ui_bottom_pref_width());\r\n  ui_push_pref_height(ui_bottom_pref_height());\r\n  ui_push_focus_hot(UI_FocusKind_Root);\r\n  ui_push_focus_active(UI_FocusKind_Root);\r\n  ui_push_tag(str8_lit(\".\"));\r\n  B32 is_open = ui_key_match(key, ui_state->ctx_menu_key) && ui_state->ctx_menu_open;\r\n  if(is_open != 0) UI_TagF(\"floating\")\r\n  {\r\n    ui_state->ctx_menu_touched_this_frame = 1;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_RoundChildrenByParent;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBackgroundBlur;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBackground;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_DisableFocusOverlay;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_DrawBorder;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_Clip;\r\n    ui_state->ctx_menu_root->flags |= UI_BoxFlag_Clickable;\r\n    ui_state->ctx_menu_root->corner_radii[Corner_00] = ui_state->ctx_menu_root->corner_radii[Corner_01] = ui_state->ctx_menu_root->corner_radii[Corner_10] = ui_state->ctx_menu_root->corner_radii[Corner_11] = ui_top_font_size()*0.25f;\r\n    ui_state->ctx_menu_root->tags_key = ui_top_tags_key();\r\n    ui_state->ctx_menu_root->blur_size = ui_top_blur_size();\r\n    ui_state->ctx_menu_root->text_color = ui_color_from_name(str8_lit(\"text\"));\r\n    ui_state->ctx_menu_root->background_color = ui_color_from_name(str8_lit(\"background\"));\r\n    ui_spacer(ui_em(1.f, 1.f));\r\n  }\r\n  ui_state->is_in_open_ctx_menu = is_open;\r\n  return is_open;\r\n}\r\n\r\ninternal void\r\nui_end_ctx_menu(void)\r\n{\r\n  if(ui_state->is_in_open_ctx_menu)\r\n  {\r\n    ui_state->is_in_open_ctx_menu = 0;\r\n    ui_spacer(ui_em(1.f, 1.f));\r\n  }\r\n  ui_pop_tag();\r\n  ui_pop_focus_active();\r\n  ui_pop_focus_hot();\r\n  ui_pop_pref_width();\r\n  ui_pop_pref_height();\r\n  ui_pop_parent();\r\n  ui_pop_parent();\r\n}\r\n\r\ninternal B32\r\nui_ctx_menu_is_open(UI_Key key)\r\n{\r\n  return (ui_state->ctx_menu_open && ui_key_match(key, ui_state->ctx_menu_key));\r\n}\r\n\r\ninternal B32\r\nui_any_ctx_menu_is_open(void)\r\n{\r\n  return ui_state->ctx_menu_open;\r\n}\r\n\r\n//- rjf: focus tree coloring\r\n\r\ninternal B32\r\nui_is_focus_hot(void)\r\n{\r\n  B32 result = (ui_state->focus_hot_stack.top->v == UI_FocusKind_On);\r\n  if(result)\r\n  {\r\n    for(UI_FocusHotNode *n = ui_state->focus_hot_stack.top; n != 0; n = n->next)\r\n    {\r\n      if(n->v == UI_FocusKind_Root)\r\n      {\r\n        break;\r\n      }\r\n      if(n->v == UI_FocusKind_Off)\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nui_is_focus_active(void)\r\n{\r\n  B32 result = (ui_state->focus_active_stack.top->v == UI_FocusKind_On);\r\n  if(result)\r\n  {\r\n    for(UI_FocusActiveNode *n = ui_state->focus_active_stack.top; n != 0; n = n->next)\r\n    {\r\n      if(n->v == UI_FocusKind_Root)\r\n      {\r\n        break;\r\n      }\r\n      if(n->v == UI_FocusKind_Off)\r\n      {\r\n        result = 0;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n//- rjf: implicit auto-managed tree-based focus state\r\n\r\ninternal B32\r\nui_is_key_auto_focus_active(UI_Key key)\r\n{\r\n  B32 result = 0;\r\n  if(!ui_key_match(ui_key_zero(), key))\r\n  {\r\n    for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent)\r\n    {\r\n      if(p->flags & UI_BoxFlag_FocusActive && ui_key_match(key, p->default_nav_focus_active_key))\r\n      {\r\n        result = 1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal B32\r\nui_is_key_auto_focus_hot(UI_Key key)\r\n{\r\n  B32 result = 0;\r\n  if(!ui_key_match(ui_key_zero(), key))\r\n  {\r\n    for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent)\r\n    {\r\n      if(p->flags & UI_BoxFlag_FocusHot &&\r\n         ((!(p->flags & UI_BoxFlag_FocusHotDisabled) &&\r\n           ui_key_match(key, p->default_nav_focus_hot_key)) ||\r\n          ui_key_match(key, p->default_nav_focus_active_key)))\r\n      {\r\n        result = 1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal void\r\nui_set_auto_focus_active_key(UI_Key key)\r\n{\r\n  for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent)\r\n  {\r\n    if(p->flags & UI_BoxFlag_DefaultFocusNav)\r\n    {\r\n      p->default_nav_focus_next_active_key = key;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nui_set_auto_focus_hot_key(UI_Key key)\r\n{\r\n  for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent)\r\n  {\r\n    if(p->flags & UI_BoxFlag_DefaultFocusNav)\r\n    {\r\n      p->default_nav_focus_next_hot_key = key;\r\n      break;\r\n    }\r\n  }\r\n}\r\n\r\n//- rjf: current style tags key\r\n\r\ninternal UI_Key\r\nui_top_tags_key(void)\r\n{\r\n  UI_Key key = ui_key_zero();\r\n  if(ui_state->tags_key_stack_top != 0)\r\n  {\r\n    key = ui_state->tags_key_stack_top->key;\r\n  }\r\n  return key;\r\n}\r\n\r\n//- rjf: theme color lookups\r\n\r\ninternal Vec4F32\r\nui_color_from_name(String8 name)\r\n{\r\n  Vec4F32 result = ui_color_from_tags_key_name(ui_top_tags_key(), name);\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nui_color_from_tags_key_extras(UI_Key key, String8Array extras)\r\n{\r\n  Vec4F32 result = {0};\r\n  if(ui_state->theme_pattern_cache_slots_count && extras.count > 0)\r\n  {\r\n    //- rjf: compute final key, mixing (tags_key, extras)\r\n    UI_Key final_key = key;\r\n    for EachIndex(idx, extras.count)\r\n    {\r\n      final_key = ui_key_from_string(final_key, extras.v[idx]);\r\n    }\r\n    \r\n    //- rjf: map to existing node\r\n    U64 slot_idx = final_key.u64[0]%ui_state->theme_pattern_cache_slots_count;\r\n    UI_ThemePatternCacheSlot *slot = &ui_state->theme_pattern_cache_slots[slot_idx];\r\n    UI_ThemePatternCacheNode *node = 0;\r\n    for(UI_ThemePatternCacheNode *n = slot->first;\r\n        n != 0;\r\n        n = n->slot_next)\r\n    {\r\n      if(ui_key_match(n->key, final_key))\r\n      {\r\n        node = n;\r\n      }\r\n    }\r\n    \r\n    //- rjf: no node, or this node is stale? create and/or update\r\n    if(node == 0 || node->last_build_index_accessed < ui_state->build_index)\r\n    {\r\n      // rjf: map tags_key (without name) -> full list of tags\r\n      String8Array tags = {0};\r\n      {\r\n        U64 tags_cache_slot_idx = key.u64[0]%ui_state->tags_cache_slots_count;\r\n        UI_TagsCacheSlot *tags_cache_slot = &ui_state->tags_cache_slots[tags_cache_slot_idx];\r\n        for(UI_TagsCacheNode *n = tags_cache_slot->first; n != 0; n = n->next)\r\n        {\r\n          if(ui_key_match(n->key, key))\r\n          {\r\n            tags = n->tags;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      \r\n      // rjf: map tags to theme pattern\r\n      UI_Theme *theme = ui_state->theme;\r\n      UI_ThemePattern *pattern = 0;\r\n      U64 best_match_count = 0;\r\n      for(U64 idx = 0; idx < theme->patterns_count; idx += 1)\r\n      {\r\n        UI_ThemePattern *p = &theme->patterns[idx];\r\n        U64 match_count = 0;\r\n        B32 name_matches = 0;\r\n        B32 all_p_tags_in_key = 1;\r\n        for EachIndex(p_tags_idx, p->tags.count)\r\n        {\r\n          B32 p_tag_in_key = 0;\r\n          for EachIndex(key_tags_idx, tags.count + extras.count)\r\n          {\r\n            String8 key_string = key_tags_idx < tags.count ? tags.v[key_tags_idx] : extras.v[key_tags_idx - tags.count];\r\n            if(str8_match(p->tags.v[p_tags_idx], key_string, 0))\r\n            {\r\n              if(key_tags_idx == tags.count + extras.count - 1)\r\n              {\r\n                name_matches = 1;\r\n              }\r\n              p_tag_in_key = 1;\r\n              match_count += 1;\r\n              break;\r\n            }\r\n          }\r\n          if(!p_tag_in_key)\r\n          {\r\n            all_p_tags_in_key = 0;\r\n            break;\r\n          }\r\n        }\r\n        if(name_matches && all_p_tags_in_key && match_count > best_match_count)\r\n        {\r\n          pattern = p;\r\n          best_match_count = match_count;\r\n        }\r\n        if(match_count == tags.count + extras.count)\r\n        {\r\n          break;\r\n        }\r\n      }\r\n      \r\n      // rjf: store in (key, name) -> (pattern) cache\r\n      B32 node_is_new = 0;\r\n      if(node == 0)\r\n      {\r\n        node_is_new = 1;\r\n        node = ui_state->theme_pattern_cache_node_free;\r\n        if(node != 0)\r\n        {\r\n          SLLStackPop_N(ui_state->theme_pattern_cache_node_free, slot_next);\r\n        }\r\n        else\r\n        {\r\n          node = push_array(ui_state->arena, UI_ThemePatternCacheNode, 1);\r\n        }\r\n        DLLPushBack_NP(slot->first, slot->last, node, slot_next, slot_prev);\r\n        DLLPushBack_NP(ui_state->lru_theme_pattern_cache_node, ui_state->mru_theme_pattern_cache_node, node, lru_next, lru_prev);\r\n        node->key = final_key;\r\n      }\r\n      \r\n      // rjf: update node's target color\r\n      if(pattern != 0)\r\n      {\r\n        node->target_rgba = pattern->linear;\r\n        if(node_is_new)\r\n        {\r\n          node->current_rgba = node->target_rgba;\r\n        }\r\n      }\r\n    }\r\n    \r\n    //- rjf: mark this node as most-recently-used\r\n    if(node != 0 && node->last_build_index_accessed < ui_state->build_index)\r\n    {\r\n      node->last_build_index_accessed = ui_state->build_index;\r\n      DLLRemove_NP(ui_state->lru_theme_pattern_cache_node, ui_state->mru_theme_pattern_cache_node, node, lru_next, lru_prev);\r\n      DLLPushBack_NP(ui_state->lru_theme_pattern_cache_node, ui_state->mru_theme_pattern_cache_node, node, lru_next, lru_prev);\r\n    }\r\n    \r\n    //- rjf: grab resultant color\r\n    if(node != 0)\r\n    {\r\n      result = node->current_rgba;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Vec4F32\r\nui_color_from_tags_key_name(UI_Key key, String8 name)\r\n{\r\n  String8Array extras = {&name, 1};\r\n  Vec4F32 result = ui_color_from_tags_key_extras(key, extras);\r\n  return result;\r\n}\r\n\r\n//- rjf: box node construction\r\n\r\ninternal UI_Box *\r\nui_build_box_from_key(UI_BoxFlags flags, UI_Key key)\r\n{\r\n  ui_state->build_box_count += 1;\r\n  \r\n  //- rjf: grab active parent\r\n  UI_Box *parent = ui_top_parent();\r\n  \r\n  //- rjf: try to get box\r\n  UI_BoxFlags last_flags = 0;\r\n  UI_Box *box = ui_box_from_key(key);\r\n  B32 box_first_frame = ui_box_is_nil(box);\r\n  last_flags = box->flags;\r\n  \r\n  //- rjf: zero key on duplicate\r\n  if(!box_first_frame && box->last_touched_build_index == ui_state->build_index)\r\n  {\r\n    box = &ui_nil_box;\r\n    key = ui_key_zero();\r\n    box_first_frame = 1;\r\n  }\r\n  \r\n  //- rjf: gather info from box\r\n  B32 box_is_transient = ui_key_match(key, ui_key_zero());\r\n  \r\n  //- rjf: allocate box if it doesn't yet exist\r\n  if(box_first_frame)\r\n  {\r\n    box = !box_is_transient ? ui_state->first_free_box : 0;\r\n    ui_state->is_animating = ui_state->is_animating || !box_is_transient;\r\n    if(!ui_box_is_nil(box))\r\n    {\r\n      SLLStackPop(ui_state->first_free_box);\r\n    }\r\n    else\r\n    {\r\n      box = push_array_no_zero(box_is_transient ? ui_build_arena() : ui_state->arena, UI_Box, 1);\r\n    }\r\n    MemoryZeroStruct(box);\r\n  }\r\n  \r\n  //- rjf: zero out per-frame state\r\n  {\r\n    box->first = box->last = box->next = box->prev = box->parent = &ui_nil_box;\r\n    box->child_count = 0;\r\n    box->flags = 0;\r\n    box->hover_cursor = OS_Cursor_Pointer;\r\n    MemoryZeroArray(box->pref_size);\r\n    MemoryZeroStruct(&box->draw_bucket);\r\n  }\r\n  \r\n  //- rjf: hook into persistent state table\r\n  if(box_first_frame && !box_is_transient)\r\n  {\r\n    U64 slot = key.u64[0] % ui_state->box_table_size;\r\n    DLLInsert_NPZ(&ui_nil_box, ui_state->box_table[slot].hash_first, ui_state->box_table[slot].hash_last, ui_state->box_table[slot].hash_last, box, hash_next, hash_prev);\r\n  }\r\n  \r\n  //- rjf: hook into per-frame tree structure\r\n  if(!ui_box_is_nil(parent))\r\n  {\r\n    DLLPushBack_NPZ(&ui_nil_box, parent->first, parent->last, box, next, prev);\r\n    parent->child_count += 1;\r\n    box->parent = parent;\r\n  }\r\n  \r\n  //- rjf: fill box\r\n  {\r\n    box->key = key;\r\n    box->flags = (flags | ui_state->flags_stack.top->v) & ~ui_state->omit_flags_stack.top->v;\r\n    box->fastpath_codepoint = ui_state->fastpath_codepoint_stack.top->v;\r\n    box->group_key = ui_state->group_key_stack.top->v;\r\n    \r\n    if(ui_is_focus_active() && (box->flags & UI_BoxFlag_DefaultFocusNav) && ui_key_match(ui_state->default_nav_root_key, ui_key_zero()))\r\n    {\r\n      ui_state->default_nav_root_key = box->key;\r\n    }\r\n    \r\n    if(box_first_frame)\r\n    {\r\n      box->first_touched_build_index = ui_state->build_index;\r\n      box->disabled_t = (F32)!!(box->flags & UI_BoxFlag_Disabled);\r\n    }\r\n    box->last_touched_build_index = ui_state->build_index;\r\n    \r\n    if(box->flags & UI_BoxFlag_Disabled && (!(last_flags & UI_BoxFlag_Disabled) || box_first_frame))\r\n    {\r\n      box->first_disabled_build_index = ui_state->build_index;\r\n    }\r\n    \r\n    if(ui_state->fixed_x_stack.top != &ui_state->fixed_x_nil_stack_top)\r\n    {\r\n      box->flags |= UI_BoxFlag_FloatingX;\r\n      box->fixed_position.x = ui_state->fixed_x_stack.top->v;\r\n    }\r\n    if(ui_state->fixed_y_stack.top != &ui_state->fixed_y_nil_stack_top)\r\n    {\r\n      box->flags |= UI_BoxFlag_FloatingY;\r\n      box->fixed_position.y = ui_state->fixed_y_stack.top->v;\r\n    }\r\n    if(ui_state->fixed_width_stack.top != &ui_state->fixed_width_nil_stack_top)\r\n    {\r\n      box->flags |= UI_BoxFlag_FixedWidth;\r\n      box->fixed_size.x = ui_state->fixed_width_stack.top->v;\r\n    }\r\n    else\r\n    {\r\n      box->pref_size[Axis2_X] = ui_state->pref_width_stack.top->v;\r\n    }\r\n    if(ui_state->fixed_height_stack.top != &ui_state->fixed_height_nil_stack_top)\r\n    {\r\n      box->flags |= UI_BoxFlag_FixedHeight;\r\n      box->fixed_size.y = ui_state->fixed_height_stack.top->v;\r\n    }\r\n    else\r\n    {\r\n      box->pref_size[Axis2_Y] = ui_state->pref_height_stack.top->v;\r\n    }\r\n    box->min_size.v[Axis2_X] = ui_state->min_width_stack.top->v;\r\n    box->min_size.v[Axis2_Y] = ui_state->min_height_stack.top->v;\r\n    \r\n    B32 is_auto_focus_active = ui_is_key_auto_focus_active(key);\r\n    B32 is_auto_focus_hot    = ui_is_key_auto_focus_hot(key);\r\n    if(is_auto_focus_active)\r\n    {\r\n      ui_set_next_focus_active(UI_FocusKind_On);\r\n    }\r\n    if(is_auto_focus_hot)\r\n    {\r\n      ui_set_next_focus_hot(UI_FocusKind_On);\r\n    }\r\n    box->flags |= UI_BoxFlag_FocusHot    * (ui_state->focus_hot_stack.top->v == UI_FocusKind_On);\r\n    box->flags |= UI_BoxFlag_FocusActive * (ui_state->focus_active_stack.top->v == UI_FocusKind_On);\r\n    if(box->flags & UI_BoxFlag_FocusHot && !ui_is_focus_hot())\r\n    {\r\n      box->flags |= UI_BoxFlag_FocusHotDisabled;\r\n    }\r\n    if(box->flags & UI_BoxFlag_FocusActive && !ui_is_focus_active())\r\n    {\r\n      box->flags |= UI_BoxFlag_FocusActiveDisabled;\r\n    }\r\n    \r\n    box->text_align = ui_state->text_alignment_stack.top->v;\r\n    box->child_layout_axis = ui_state->child_layout_axis_stack.top->v;\r\n    box->font = ui_state->font_stack.top->v;\r\n    box->font_size = ui_state->font_size_stack.top->v;\r\n    box->tab_size = ui_state->tab_size_stack.top->v;\r\n    box->text_raster_flags = ui_state->text_raster_flags_stack.top->v;\r\n    box->corner_radii[Corner_00] = ui_state->corner_radius_00_stack.top->v;\r\n    box->corner_radii[Corner_01] = ui_state->corner_radius_01_stack.top->v;\r\n    box->corner_radii[Corner_10] = ui_state->corner_radius_10_stack.top->v;\r\n    box->corner_radii[Corner_11] = ui_state->corner_radius_11_stack.top->v;\r\n    box->blur_size = ui_state->blur_size_stack.top->v;\r\n    box->transparency = ui_state->transparency_stack.top->v;\r\n    box->squish = ui_state->squish_stack.top->v;\r\n    box->text_padding = ui_state->text_padding_stack.top->v;\r\n    box->hover_cursor = ui_state->hover_cursor_stack.top->v;\r\n    box->custom_draw = 0;\r\n    box->tags_key = ui_key_zero();\r\n    if(ui_state->tags_key_stack_top != 0)\r\n    {\r\n      box->tags_key = ui_state->tags_key_stack_top->key;\r\n    }\r\n    if(box->flags & UI_BoxFlag_DrawBackground)\r\n    {\r\n      if(ui_state->background_color_stack.top != &ui_state->background_color_nil_stack_top)\r\n      {\r\n        box->background_color = ui_state->background_color_stack.top->v;\r\n      }\r\n      else\r\n      {\r\n        box->background_color = ui_color_from_name(str8_lit(\"background\"));\r\n      }\r\n    }\r\n    if(box->flags & UI_BoxFlag_DrawText)\r\n    {\r\n      if(ui_state->text_color_stack.top != &ui_state->text_color_nil_stack_top)\r\n      {\r\n        box->text_color = ui_state->text_color_stack.top->v;\r\n      }\r\n      else\r\n      {\r\n        box->text_color = ui_color_from_name(str8_lit(\"text\"));\r\n      }\r\n    }\r\n    if(box->flags & (UI_BoxFlag_DrawBorder|\r\n                     UI_BoxFlag_DrawSideRight|\r\n                     UI_BoxFlag_DrawSideLeft|\r\n                     UI_BoxFlag_DrawSideTop|\r\n                     UI_BoxFlag_DrawSideBottom))\r\n    {\r\n      if(ui_state->border_color_stack.top != &ui_state->border_color_nil_stack_top)\r\n      {\r\n        box->border_color = ui_state->border_color_stack.top->v;\r\n      }\r\n      else\r\n      {\r\n        box->border_color = ui_color_from_name(str8_lit(\"border\"));\r\n      }\r\n    }\r\n  }\r\n  \r\n  //- rjf: auto-pop all stacks\r\n  {\r\n    UI_AutoPopStacks(ui_state);\r\n  }\r\n  \r\n  //- rjf: return\r\n  return box;\r\n}\r\n\r\ninternal UI_Key\r\nui_active_seed_key(void)\r\n{\r\n  UI_Box *keyed_ancestor = &ui_nil_box;\r\n  {\r\n    for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent)\r\n    {\r\n      if(!ui_key_match(ui_key_zero(), p->key))\r\n      {\r\n        keyed_ancestor = p;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  return keyed_ancestor->key;\r\n}\r\n\r\ninternal UI_Box *\r\nui_build_box_from_string(UI_BoxFlags flags, String8 string)\r\n{\r\n  //- rjf: grab active parent\r\n  UI_Box *parent = ui_top_parent();\r\n  \r\n  //- rjf: figure out key\r\n  UI_Key key = ui_key_from_string(ui_active_seed_key(), string);\r\n  \r\n  //- rjf: build box from key, equip passed string\r\n  UI_Box *box = ui_build_box_from_key(flags, key);\r\n  if(flags & UI_BoxFlag_DrawText)\r\n  {\r\n    ui_box_equip_display_string(box, string);\r\n  }\r\n  \r\n  //- rjf: return\r\n  return box;\r\n}\r\n\r\ninternal UI_Box *\r\nui_build_box_from_stringf(UI_BoxFlags flags, char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  va_end(args);\r\n  UI_Box *box = ui_build_box_from_string(flags, string);\r\n  scratch_end(scratch);\r\n  return box;\r\n}\r\n\r\n//- rjf: box node equipment\r\n\r\ninternal void\r\nui_box_equip_display_string(UI_Box *box, String8 string)\r\n{\r\n  box->string = push_str8_copy(ui_build_arena(), string);\r\n  box->flags |= UI_BoxFlag_HasDisplayString;\r\n  Vec4F32 text_color = box->text_color;\r\n  if(box->flags & UI_BoxFlag_DrawText && (box->fastpath_codepoint == 0 || !(box->flags & UI_BoxFlag_DrawTextFastpathCodepoint)))\r\n  {\r\n    String8 display_string = ui_box_display_string(box);\r\n    DR_FStrNode fstr_n = {0, {display_string, {box->font, box->text_raster_flags, text_color, box->font_size, 0, 0}}};\r\n    DR_FStrList fstrs = {&fstr_n, &fstr_n, 1};\r\n    box->display_fstrs = dr_fstrs_copy(ui_build_arena(), &fstrs);\r\n    box->display_fruns = dr_fruns_from_fstrs(ui_build_arena(), box->tab_size, &box->display_fstrs);\r\n  }\r\n  else if(box->flags & UI_BoxFlag_DrawText && box->flags & UI_BoxFlag_DrawTextFastpathCodepoint && box->fastpath_codepoint != 0)\r\n  {\r\n    Temp scratch = scratch_begin(0, 0);\r\n    String8 display_string = ui_box_display_string(box);\r\n    String32 fpcp32 = str32(&box->fastpath_codepoint, 1);\r\n    String8 fpcp = str8_from_32(scratch.arena, fpcp32);\r\n    U64 fpcp_pos = str8_find_needle(display_string, 0, fpcp, StringMatchFlag_CaseInsensitive);\r\n    if(fpcp_pos < display_string.size)\r\n    {\r\n      DR_FStrNode pst_fstr_n = {0,                   {str8_skip(display_string, fpcp_pos+fpcp.size), {box->font, box->text_raster_flags, text_color, box->font_size, 0, 0}}};\r\n      DR_FStrNode cdp_fstr_n = {&pst_fstr_n, {str8_substr(display_string, r1u64(fpcp_pos, fpcp_pos+fpcp.size)), {box->font, box->text_raster_flags, text_color, box->font_size, 3.f, 0}}};\r\n      DR_FStrNode pre_fstr_n = {&cdp_fstr_n, {str8_prefix(display_string, fpcp_pos), {box->font, box->text_raster_flags, text_color, box->font_size, 0, 0}}};\r\n      DR_FStrList fstrs = {&pre_fstr_n, &pst_fstr_n, 3};\r\n      box->display_fstrs = dr_fstrs_copy(ui_build_arena(), &fstrs);\r\n      box->display_fruns = dr_fruns_from_fstrs(ui_build_arena(), box->tab_size, &box->display_fstrs);\r\n    }\r\n    else\r\n    {\r\n      DR_FStrNode fstr_n = {0, {display_string, {box->font, box->text_raster_flags, text_color, box->font_size, 0, 0}}};\r\n      DR_FStrList fstrs = {&fstr_n, &fstr_n, 1};\r\n      box->display_fstrs = dr_fstrs_copy(ui_build_arena(), &fstrs);\r\n      box->display_fruns = dr_fruns_from_fstrs(ui_build_arena(), box->tab_size, &box->display_fstrs);\r\n    }\r\n    scratch_end(scratch);\r\n  }\r\n}\r\n\r\ninternal void\r\nui_box_equip_display_fstrs(UI_Box *box, DR_FStrList *strings)\r\n{\r\n  box->flags |= UI_BoxFlag_HasDisplayString;\r\n  box->string = dr_string_from_fstrs(ui_build_arena(), strings);\r\n  box->display_fstrs = dr_fstrs_copy(ui_build_arena(), strings);\r\n  box->display_fruns = dr_fruns_from_fstrs(ui_build_arena(), box->tab_size, &box->display_fstrs);\r\n}\r\n\r\ninternal inline void\r\nui_box_equip_fuzzy_match_ranges(UI_Box *box, FuzzyMatchRangeList *matches)\r\n{\r\n  box->flags |= UI_BoxFlag_HasFuzzyMatchRanges;\r\n  box->fuzzy_match_ranges = fuzzy_match_range_list_copy(ui_build_arena(), matches);\r\n}\r\n\r\ninternal void\r\nui_box_equip_draw_bucket(UI_Box *box, DR_Bucket *bucket)\r\n{\r\n  box->flags |= UI_BoxFlag_DrawBucket;\r\n  if(box->draw_bucket != 0)\r\n  {\r\n    DR_BucketScope(box->draw_bucket) dr_sub_bucket(bucket);\r\n  }\r\n  else\r\n  {\r\n    box->draw_bucket = bucket;\r\n  }\r\n}\r\n\r\ninternal void\r\nui_box_equip_custom_draw(UI_Box *box, UI_BoxCustomDrawFunctionType *custom_draw, void *user_data)\r\n{\r\n  box->custom_draw = custom_draw;\r\n  box->custom_draw_user_data = user_data;\r\n}\r\n\r\n//- rjf: box accessors / queries\r\n\r\ninternal String8\r\nui_box_display_string(UI_Box *box)\r\n{\r\n  String8 result = box->string;\r\n  if(!(box->flags & UI_BoxFlag_DisableIDString))\r\n  {\r\n    result = ui_display_part_from_key_string(result);\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal Vec2F32\r\nui_box_text_position(UI_Box *box)\r\n{\r\n  Vec2F32 result = {0};\r\n  FNT_Tag font = box->font;\r\n  F32 font_size = box->font_size;\r\n  FNT_Metrics font_metrics = fnt_metrics_from_tag_size(font, font_size);\r\n  result.y = floor_f32((box->rect.p0.y + box->rect.p1.y)/2.f + font_metrics.ascent/2.f - font_metrics.descent/2.f);\r\n  switch(box->text_align)\r\n  {\r\n    default:\r\n    case UI_TextAlign_Left:\r\n    {\r\n      result.x = box->rect.p0.x + box->text_padding;\r\n    }break;\r\n    case UI_TextAlign_Center:\r\n    {\r\n      Vec2F32 text_dim = box->display_fruns.dim;\r\n      result.x = round_f32((box->rect.p0.x + box->rect.p1.x)/2 - text_dim.x/2);\r\n      result.x = ClampBot(result.x, box->rect.x0);\r\n    }break;\r\n    case UI_TextAlign_Right:\r\n    {\r\n      Vec2F32 text_dim = box->display_fruns.dim;\r\n      result.x = round_f32((box->rect.p1.x) - text_dim.x - box->text_padding);\r\n      result.x = ClampBot(result.x, box->rect.x0);\r\n    }break;\r\n  }\r\n  result.x = floor_f32(result.x);\r\n  return result;\r\n}\r\n\r\ninternal U64\r\nui_box_char_pos_from_xy(UI_Box *box, Vec2F32 xy)\r\n{\r\n  FNT_Tag font = box->font;\r\n  F32 font_size = box->font_size;\r\n  String8 line = ui_box_display_string(box);\r\n  U64 result = fnt_char_pos_from_tag_size_string_p(font, font_size, 0, box->tab_size, line, xy.x - ui_box_text_position(box).x);\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Box Interaction\r\n\r\ninternal UI_Signal\r\nui_signal_from_box(UI_Box *box)\r\n{\r\n  B32 is_focus_hot = box->flags & UI_BoxFlag_FocusHot && !(box->flags & UI_BoxFlag_FocusHotDisabled);\r\n  UI_Signal sig = {box};\r\n  sig.event_flags |= os_get_modifiers();\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate possibly-clipped box rectangle\r\n  //\r\n  Rng2F32 rect = box->rect;\r\n  for(UI_Box *b = box->parent; !ui_box_is_nil(b); b = b->parent)\r\n  {\r\n    if(b->flags & UI_BoxFlag_Clip)\r\n    {\r\n      rect = intersect_2f32(rect, b->rect);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: determine if we're under the context menu or not\r\n  //\r\n  B32 ctx_menu_is_ancestor = 0;\r\n  {\r\n    for(UI_Box *parent = box; !ui_box_is_nil(parent); parent = parent->parent)\r\n    {\r\n      if(parent == ui_state->ctx_menu_root)\r\n      {\r\n        ctx_menu_is_ancestor = 1;\r\n        break;\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: calculate blacklist rectangles\r\n  //\r\n  Rng2F32 blacklist_rect = {0};\r\n  if(!ctx_menu_is_ancestor && ui_state->ctx_menu_open)\r\n  {\r\n    blacklist_rect = ui_state->ctx_menu_root->rect;\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: process events related to this box\r\n  //\r\n  B32 view_scrolled = 0;\r\n  for(UI_Event *evt = 0; ui_next_event(&evt);)\r\n  {\r\n    B32 taken = 0;\r\n    \r\n    //- rjf: unpack event\r\n    Vec2F32 evt_mouse = evt->pos;\r\n    B32 evt_mouse_in_bounds = !contains_2f32(blacklist_rect, evt_mouse) && contains_2f32(rect, evt_mouse);\r\n    UI_MouseButtonKind evt_mouse_button_kind = (evt->key == OS_Key_LeftMouseButton   ? UI_MouseButtonKind_Left :\r\n                                                evt->key == OS_Key_MiddleMouseButton ? UI_MouseButtonKind_Middle :\r\n                                                evt->key == OS_Key_RightMouseButton  ? UI_MouseButtonKind_Right :\r\n                                                UI_MouseButtonKind_Left);\r\n    B32 evt_key_is_mouse = (evt->key == OS_Key_LeftMouseButton ||\r\n                            evt->key == OS_Key_MiddleMouseButton ||\r\n                            evt->key == OS_Key_RightMouseButton);\r\n    sig.event_flags |= evt->modifiers;\r\n    \r\n    //- rjf: mouse presses in box -> set hot/active; mark signal accordingly\r\n    if(box->flags & UI_BoxFlag_MouseClickable &&\r\n       evt->kind == UI_EventKind_Press &&\r\n       evt_mouse_in_bounds &&\r\n       evt_key_is_mouse)\r\n    {\r\n      ui_state->hot_box_key = box->key;\r\n      ui_state->active_box_key[evt_mouse_button_kind] = box->key;\r\n      sig.f |= (UI_SignalFlag_LeftPressed<<evt_mouse_button_kind);\r\n      ui_state->drag_start_mouse = evt->pos;\r\n      if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) &&\r\n         evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_get_gfx_info()->double_click_time)\r\n      {\r\n        sig.f |= (UI_SignalFlag_LeftDoubleClicked<<evt_mouse_button_kind);\r\n      }\r\n      if(ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][0]) &&\r\n         ui_key_match(box->key, ui_state->press_key_history[evt_mouse_button_kind][1]) &&\r\n         evt->timestamp_us-ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] <= 1000000*os_get_gfx_info()->double_click_time &&\r\n         ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] - ui_state->press_timestamp_history_us[evt_mouse_button_kind][1] <= 1000000*os_get_gfx_info()->double_click_time)\r\n      {\r\n        sig.f |= (UI_SignalFlag_LeftTripleClicked<<evt_mouse_button_kind);\r\n      }\r\n      MemoryCopy(&ui_state->press_timestamp_history_us[evt_mouse_button_kind][1], &ui_state->press_timestamp_history_us[evt_mouse_button_kind][0],\r\n                 sizeof(ui_state->press_timestamp_history_us[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_timestamp_history_us[evt_mouse_button_kind])-1);\r\n      MemoryCopy(&ui_state->press_key_history[evt_mouse_button_kind][1], &ui_state->press_key_history[evt_mouse_button_kind][0],\r\n                 sizeof(ui_state->press_key_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_key_history[evt_mouse_button_kind])-1);\r\n      MemoryCopy(&ui_state->press_pos_history[evt_mouse_button_kind][1], &ui_state->press_pos_history[evt_mouse_button_kind][0],\r\n                 sizeof(ui_state->press_pos_history[evt_mouse_button_kind][0]) * ArrayCount(ui_state->press_pos_history[evt_mouse_button_kind])-1);\r\n      ui_state->press_timestamp_history_us[evt_mouse_button_kind][0] = evt->timestamp_us;\r\n      ui_state->press_key_history[evt_mouse_button_kind][0] = box->key;\r\n      ui_state->press_pos_history[evt_mouse_button_kind][0] = evt_mouse;\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: mouse releases in active box -> unset active; mark signal accordingly\r\n    if(box->flags & UI_BoxFlag_MouseClickable &&\r\n       evt->kind == UI_EventKind_Release &&\r\n       ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) &&\r\n       evt_mouse_in_bounds &&\r\n       evt_key_is_mouse)\r\n    {\r\n      ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero();\r\n      sig.f |= (UI_SignalFlag_LeftReleased<<evt_mouse_button_kind);\r\n      sig.f |= (UI_SignalFlag_LeftClicked<<evt_mouse_button_kind);\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: mouse releases outside active box -> unset hot/active\r\n    if(box->flags & UI_BoxFlag_MouseClickable &&\r\n       evt->kind == UI_EventKind_Release &&\r\n       ui_key_match(ui_state->active_box_key[evt_mouse_button_kind], box->key) &&\r\n       !evt_mouse_in_bounds &&\r\n       evt_key_is_mouse)\r\n    {\r\n      ui_state->hot_box_key = ui_key_zero();\r\n      ui_state->active_box_key[evt_mouse_button_kind] = ui_key_zero();\r\n      sig.f |= (UI_SignalFlag_LeftReleased<<evt_mouse_button_kind);\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: focus is hot & keyboard click -> mark signal\r\n    if(box->flags & UI_BoxFlag_KeyboardClickable &&\r\n       is_focus_hot &&\r\n       evt->kind == UI_EventKind_Press &&\r\n       evt->slot == UI_EventActionSlot_Accept)\r\n    {\r\n      sig.f |= UI_SignalFlag_KeyboardPressed;\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: focus is hot & copy event -> remember to copy this box tree's text content\r\n    if(is_focus_hot &&\r\n       evt->flags & UI_EventFlag_Copy &&\r\n       !(evt->flags & UI_EventFlag_Delete) &&\r\n       !ui_key_match(ui_key_zero(), box->key))\r\n    {\r\n      ui_state->clipboard_copy_key = box->key;\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: ancestor is focused & fastpath codepoint pressed -> press\r\n    if(box->flags & UI_BoxFlag_Clickable && box->fastpath_codepoint != 0 && evt->string.size != 0)\r\n    {\r\n      B32 ancestor_is_focused = 0;\r\n      for(UI_Box *parent = box->parent; !ui_box_is_nil(parent); parent = parent->parent)\r\n      {\r\n        if(parent->flags & UI_BoxFlag_FocusActive)\r\n        {\r\n          ancestor_is_focused = 1;\r\n          if(parent->flags & UI_BoxFlag_FocusActiveDisabled ||\r\n             !ui_key_match(parent->default_nav_focus_active_key, ui_key_zero()))\r\n          {\r\n            ancestor_is_focused = 0;\r\n            break;\r\n          }\r\n        }\r\n      }\r\n      if(ancestor_is_focused)\r\n      {\r\n        Temp scratch = scratch_begin(0, 0);\r\n        String32 insertion32 = str32_from_8(scratch.arena, evt->string);\r\n        if(insertion32.size == 1 && insertion32.str[0] == box->fastpath_codepoint)\r\n        {\r\n          taken = 1;\r\n          sig.f |= UI_SignalFlag_Clicked|UI_SignalFlag_Pressed;\r\n        }\r\n        scratch_end(scratch);\r\n      }\r\n    }\r\n    \r\n    //- rjf: scrolling\r\n    if(box->flags & UI_BoxFlag_Scroll &&\r\n       evt->kind == UI_EventKind_Scroll &&\r\n       (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) &&\r\n       evt_mouse_in_bounds)\r\n    {\r\n      Vec2F32 delta = evt->delta_2f32;\r\n      if(evt->modifiers & OS_Modifier_Shift)\r\n      {\r\n        Swap(F32, delta.x, delta.y);\r\n      }\r\n      Vec2S16 delta16 = v2s16((S16)(delta.x/30.f), (S16)(delta.y/30.f));\r\n      if(delta.x > 0 && delta16.x == 0) { delta16.x = +1; }\r\n      if(delta.x < 0 && delta16.x == 0) { delta16.x = -1; }\r\n      if(delta.y > 0 && delta16.y == 0) { delta16.y = +1; }\r\n      if(delta.y < 0 && delta16.y == 0) { delta16.y = -1; }\r\n      sig.scroll.x += delta16.x;\r\n      sig.scroll.y += delta16.y;\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: view scrolling\r\n    if(box->flags & UI_BoxFlag_ViewScroll && box->first_touched_build_index != box->last_touched_build_index &&\r\n       evt->kind == UI_EventKind_Scroll &&\r\n       (evt->modifiers == 0 || evt->modifiers == OS_Modifier_Shift) &&\r\n       evt_mouse_in_bounds)\r\n    {\r\n      Vec2F32 delta = evt->delta_2f32;\r\n      if(evt->modifiers & OS_Modifier_Shift)\r\n      {\r\n        Swap(F32, delta.x, delta.y);\r\n      }\r\n      if(!(box->flags & UI_BoxFlag_ViewScrollX))\r\n      {\r\n        if(delta.y == 0)\r\n        {\r\n          delta.y = delta.x;\r\n        }\r\n        delta.x = 0;\r\n      }\r\n      if(!(box->flags & UI_BoxFlag_ViewScrollY))\r\n      {\r\n        if(delta.x == 0)\r\n        {\r\n          delta.x = delta.y;\r\n        }\r\n        delta.y = 0;\r\n      }\r\n      box->view_off_target.x += delta.x;\r\n      box->view_off_target.y += delta.y;\r\n      view_scrolled = 1;\r\n      taken = 1;\r\n    }\r\n    \r\n    //- rjf: taken -> eat event\r\n    if(taken)\r\n    {\r\n      ui_eat_event(evt);\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: clamp view scrolling\r\n  //\r\n  if(view_scrolled && box->flags & UI_BoxFlag_ViewClamp)\r\n  {\r\n    Vec2F32 max_view_off_target =\r\n    {\r\n      ClampBot(0, box->view_bounds.x - box->fixed_size.x),\r\n      ClampBot(0, box->view_bounds.y - box->fixed_size.y),\r\n    };\r\n    if(box->flags & UI_BoxFlag_ViewClampX) { box->view_off_target.x = Clamp(0, box->view_off_target.x, max_view_off_target.x); }\r\n    if(box->flags & UI_BoxFlag_ViewClampY) { box->view_off_target.y = Clamp(0, box->view_off_target.y, max_view_off_target.y); }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: active -> dragging\r\n  //\r\n  if(box->flags & UI_BoxFlag_MouseClickable)\r\n  {\r\n    for EachEnumVal(UI_MouseButtonKind, k)\r\n    {\r\n      if(ui_key_match(ui_state->active_box_key[k], box->key) ||\r\n         sig.f & (UI_SignalFlag_LeftPressed<<k))\r\n      {\r\n        sig.f |= (UI_SignalFlag_LeftDragging<<k);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: dragging started via double-click -> double-dragging\r\n  //\r\n  if(box->flags & UI_BoxFlag_MouseClickable)\r\n  {\r\n    for EachEnumVal(UI_MouseButtonKind, k)\r\n    {\r\n      if(sig.f & (UI_SignalFlag_LeftDragging<<k) &&\r\n         ui_key_match(ui_state->press_key_history[k][0], box->key) &&\r\n         ui_key_match(ui_state->press_key_history[k][1], box->key) &&\r\n         ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_get_gfx_info()->double_click_time &&\r\n         length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f)\r\n      {\r\n        sig.f |= (UI_SignalFlag_LeftDoubleDragging<<k);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: dragging started via triple-click -> triple-dragging\r\n  //\r\n  if(box->flags & UI_BoxFlag_MouseClickable)\r\n  {\r\n    for EachEnumVal(UI_MouseButtonKind, k)\r\n    {\r\n      if(sig.f & (UI_SignalFlag_LeftDragging<<k) &&\r\n         ui_key_match(ui_state->press_key_history[k][0], box->key) &&\r\n         ui_key_match(ui_state->press_key_history[k][1], box->key) &&\r\n         ui_key_match(ui_state->press_key_history[k][2], box->key) &&\r\n         ui_state->press_timestamp_history_us[k][0] - ui_state->press_timestamp_history_us[k][1] <= 1000000*os_get_gfx_info()->double_click_time &&\r\n         ui_state->press_timestamp_history_us[k][1] - ui_state->press_timestamp_history_us[k][2] <= 1000000*os_get_gfx_info()->double_click_time &&\r\n         length_2f32(sub_2f32(ui_state->press_pos_history[k][0], ui_state->press_pos_history[k][1])) < 10.f &&\r\n         length_2f32(sub_2f32(ui_state->press_pos_history[k][1], ui_state->press_pos_history[k][2])) < 10.f)\r\n      {\r\n        sig.f |= (UI_SignalFlag_LeftTripleDragging<<k);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse is over this box's rect -> always mark mouse-over\r\n  //\r\n  {\r\n    if(contains_2f32(rect, ui_state->mouse) &&\r\n       !contains_2f32(blacklist_rect, ui_state->mouse))\r\n    {\r\n      sig.f |= UI_SignalFlag_MouseOver;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse is over this box's rect, no other hot key? -> set hot key, mark hovering\r\n  //\r\n  {\r\n    if(box->flags & UI_BoxFlag_MouseClickable &&\r\n       contains_2f32(rect, ui_state->mouse) &&\r\n       !contains_2f32(blacklist_rect, ui_state->mouse) &&\r\n       (ui_key_match(ui_state->hot_box_key, ui_key_zero()) || ui_key_match(ui_state->hot_box_key, box->key)) &&\r\n       (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Left], box->key)) &&\r\n       (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Middle], box->key)) &&\r\n       (ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], ui_key_zero()) || ui_key_match(ui_state->active_box_key[UI_MouseButtonKind_Right], box->key)))\r\n    {\r\n      ui_state->hot_box_key = box->key;\r\n      sig.f |= UI_SignalFlag_Hovering;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse is over this box's rect, currently-active-key has the same group key? -> set hot/active key\r\n  //\r\n  if(box->flags & UI_BoxFlag_MouseClickable &&\r\n     contains_2f32(rect, ui_state->mouse) &&\r\n     !contains_2f32(blacklist_rect, ui_state->mouse) &&\r\n     !ui_key_match(ui_key_zero(), box->group_key))\r\n  {\r\n    for EachEnumVal(UI_MouseButtonKind, k)\r\n    {\r\n      UI_Box *active_box = ui_box_from_key(ui_state->active_box_key[k]);\r\n      if(ui_key_match(box->group_key, active_box->group_key))\r\n      {\r\n        ui_state->hot_box_key = box->key;\r\n        ui_state->active_box_key[k] = box->key;\r\n        sig.f |= UI_SignalFlag_Hovering|(UI_SignalFlag_Dragging<<k);\r\n      }\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse is over this box's rect, drop site, no other drop hot key? -> set drop hot key\r\n  //\r\n  {\r\n    if(box->flags & UI_BoxFlag_DropSite &&\r\n       contains_2f32(rect, ui_state->mouse) &&\r\n       !contains_2f32(blacklist_rect, ui_state->mouse) &&\r\n       (ui_key_match(ui_state->drop_hot_box_key, ui_key_zero()) || ui_key_match(ui_state->drop_hot_box_key, box->key)))\r\n    {\r\n      ui_state->drop_hot_box_key = box->key;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: mouse is not over this box's rect, but this is the drop hot key? -> zero drop hot key\r\n  //\r\n  {\r\n    if(box->flags & UI_BoxFlag_DropSite &&\r\n       (!contains_2f32(rect, ui_state->mouse) ||\r\n        contains_2f32(blacklist_rect, ui_state->mouse)) &&\r\n       ui_key_match(ui_state->drop_hot_box_key, box->key))\r\n    {\r\n      ui_state->drop_hot_box_key = ui_key_zero();\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: clicking on something outside the context menu kills the context menu\r\n  //\r\n  if(!ctx_menu_is_ancestor && sig.f & (UI_SignalFlag_LeftPressed|UI_SignalFlag_RightPressed|UI_SignalFlag_MiddlePressed))\r\n  {\r\n    ui_ctx_menu_close();\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: get default nav ancestor\r\n  //\r\n  UI_Box *default_nav_parent = &ui_nil_box;\r\n  for(UI_Box *p = ui_top_parent(); !ui_box_is_nil(p); p = p->parent)\r\n  {\r\n    if(p->flags & UI_BoxFlag_DefaultFocusNav)\r\n    {\r\n      default_nav_parent = p;\r\n      break;\r\n    }\r\n  }\r\n  \r\n  //////////////////////////////\r\n  //- rjf: clicking in default nav -> set navigation state to this box\r\n  //\r\n  if(box->flags & UI_BoxFlag_ClickToFocus && sig.f&UI_SignalFlag_Pressed && !ui_box_is_nil(default_nav_parent))\r\n  {\r\n    default_nav_parent->default_nav_focus_next_hot_key = box->key;\r\n    if(!ui_key_match(default_nav_parent->default_nav_focus_active_key, box->key))\r\n    {\r\n      default_nav_parent->default_nav_focus_next_active_key = ui_key_zero();\r\n    }\r\n  }\r\n  \r\n  return sig;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Animation Cache Interaction API\r\n\r\ninternal F32\r\nui_anim_(UI_Key key, UI_AnimParams *params)\r\n{\r\n  // rjf: get animation cache node\r\n  UI_AnimNode *node = &ui_nil_anim_node;\r\n  if(ui_state != 0)\r\n  {\r\n    U64 slot_idx = key.u64[0]%ui_state->anim_slots_count;\r\n    UI_AnimSlot *slot = &ui_state->anim_slots[slot_idx];\r\n    for(UI_AnimNode *n = slot->first; n != &ui_nil_anim_node && n != 0; n = n->slot_next)\r\n    {\r\n      if(ui_key_match(n->key, key))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == &ui_nil_anim_node)\r\n    {\r\n      node = ui_state->free_anim_node;\r\n      if(node != 0)\r\n      {\r\n        SLLStackPop_N(ui_state->free_anim_node, slot_next);\r\n      }\r\n      else\r\n      {\r\n        node = push_array(ui_state->arena, UI_AnimNode, 1);\r\n      }\r\n      node->first_touched_build_index = ui_state->build_index;\r\n      node->key = key;\r\n      MemoryCopyStruct(&node->params, params);\r\n      node->current = params->initial;\r\n      DLLPushBack_NPZ(&ui_nil_anim_node, slot->first, slot->last, node, slot_next, slot_prev);\r\n    }\r\n    else\r\n    {\r\n      DLLRemove_NPZ(&ui_nil_anim_node, ui_state->lru_anim_node, ui_state->mru_anim_node, node, lru_next, lru_prev);\r\n    }\r\n  }\r\n  \r\n  // rjf: touch node & update parameters - grab current\r\n  if(node != &ui_nil_anim_node)\r\n  {\r\n    node->last_touched_build_index = ui_state->build_index;\r\n    DLLPushBack_NPZ(&ui_nil_anim_node, ui_state->lru_anim_node, ui_state->mru_anim_node, node, lru_next, lru_prev);\r\n    if(params->reset)\r\n    {\r\n      node->current = params->initial;\r\n    }\r\n    MemoryCopyStruct(&node->params, params);\r\n    if(node->params.epsilon == 0)\r\n    {\r\n      node->params.epsilon = 0.005f;\r\n    }\r\n    if(node->params.rate == 1 || abs_f32(node->current - node->params.target) < abs_f32(node->params.epsilon))\r\n    {\r\n      node->current = node->params.target;\r\n    }\r\n  }\r\n  return node->current;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Stacks\r\n\r\n#define UI_StackTopImpl(state, name_upper, name_lower) \\\r\nreturn state->name_lower##_stack.top->v;\r\n\r\n#define UI_StackBottomImpl(state, name_upper, name_lower) \\\r\nreturn state->name_lower##_stack.bottom_val;\r\n\r\n#define UI_StackPushImpl(state, name_upper, name_lower, type, new_value) \\\r\nUI_##name_upper##Node *node = state->name_lower##_stack.free;\\\r\nif(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\\\r\nelse {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\\\r\ntype old_value = state->name_lower##_stack.top->v;\\\r\nnode->v = new_value;\\\r\nSLLStackPush(state->name_lower##_stack.top, node);\\\r\nif(node->next == &state->name_lower##_nil_stack_top)\\\r\n{\\\r\nstate->name_lower##_stack.bottom_val = (node->v);\\\r\n}\\\r\nstate->name_lower##_stack.auto_pop = 0;\\\r\nstate->name_lower##_stack.gen += 1;\\\r\nreturn old_value;\r\n\r\n#define UI_StackPopImpl(state, name_upper, name_lower) \\\r\nUI_##name_upper##Node *popped = state->name_lower##_stack.top;\\\r\nif(popped != &state->name_lower##_nil_stack_top)\\\r\n{\\\r\nSLLStackPop(state->name_lower##_stack.top);\\\r\nSLLStackPush(state->name_lower##_stack.free, popped);\\\r\nstate->name_lower##_stack.auto_pop = 0;\\\r\nstate->name_lower##_stack.gen += 1;\\\r\n}\\\r\nreturn popped->v;\\\r\n\r\n#define UI_StackSetNextImpl(state, name_upper, name_lower, type, new_value) \\\r\nUI_##name_upper##Node *node = state->name_lower##_stack.free;\\\r\nif(node != 0) {SLLStackPop(state->name_lower##_stack.free);}\\\r\nelse {node = push_array(ui_build_arena(), UI_##name_upper##Node, 1);}\\\r\ntype old_value = state->name_lower##_stack.top->v;\\\r\nnode->v = new_value;\\\r\nSLLStackPush(state->name_lower##_stack.top, node);\\\r\nstate->name_lower##_stack.auto_pop = 1;\\\r\nstate->name_lower##_stack.gen += 1;\\\r\nreturn old_value;\r\n\r\ninternal void\r\nui__push_tags_key_from_appended_string(String8 string)\r\n{\r\n  B32 is_new_root = str8_match(str8_lit(\".\"), string, 0);\r\n  \r\n  // rjf: generate new key, by combining hash of this new string with the top\r\n  // of the tags key stack\r\n  UI_Key seed_key = {0};\r\n  if(!is_new_root && ui_state->tags_key_stack_top != 0)\r\n  {\r\n    seed_key = ui_state->tags_key_stack_top->key;\r\n  }\r\n  UI_Key key = seed_key;\r\n  if(!is_new_root && string.size > 0)\r\n  {\r\n    key = ui_key_from_string(seed_key, string);\r\n  }\r\n  \r\n  // rjf: push this new key onto the stack\r\n  {\r\n    UI_TagsKeyStackNode *node = ui_state->tags_key_stack_free;\r\n    if(node != 0)\r\n    {\r\n      SLLStackPop(ui_state->tags_key_stack_free);\r\n    }\r\n    else\r\n    {\r\n      node = push_array(ui_build_arena(), UI_TagsKeyStackNode, 1);\r\n    }\r\n    SLLStackPush(ui_state->tags_key_stack_top, node);\r\n    node->key = key;\r\n  }\r\n  \r\n  // rjf: store in tags cache\r\n  if(!is_new_root)\r\n  {\r\n    U64 slot_idx = key.u64[0] % ui_state->tags_cache_slots_count;\r\n    UI_TagsCacheSlot *slot = &ui_state->tags_cache_slots[slot_idx];\r\n    UI_TagsCacheNode *node = 0;\r\n    for(UI_TagsCacheNode *n = slot->first; n != 0; n = n->next)\r\n    {\r\n      if(ui_key_match(n->key, key))\r\n      {\r\n        node = n;\r\n        break;\r\n      }\r\n    }\r\n    if(node == 0)\r\n    {\r\n      Temp scratch = scratch_begin(0, 0);\r\n      String8List tags = {0};\r\n      if(string.size != 0)\r\n      {\r\n        str8_list_push(scratch.arena, &tags, push_str8_copy(ui_build_arena(), string));\r\n      }\r\n      for(UI_TagNode *n = ui_state->tag_stack.top; n != 0; n = n->next)\r\n      {\r\n        if(n->v.size == 1 && n->v.str[0] == '.')\r\n        {\r\n          break;\r\n        }\r\n        if(n->v.size != 0)\r\n        {\r\n          str8_list_push(scratch.arena, &tags, push_str8_copy(ui_build_arena(), n->v));\r\n        }\r\n      }\r\n      node = push_array(ui_build_arena(), UI_TagsCacheNode, 1);\r\n      SLLQueuePush(slot->first, slot->last, node);\r\n      node->key = key;\r\n      node->tags = str8_array_from_list(ui_build_arena(), &tags);\r\n      scratch_end(scratch);\r\n    }\r\n  }\r\n}\r\n\r\ninternal void\r\nui__pop_tags_key(void)\r\n{\r\n  if(ui_state->tags_key_stack_top != 0)\r\n  {\r\n    UI_TagsKeyStackNode *popped = ui_state->tags_key_stack_top;\r\n    SLLStackPop(ui_state->tags_key_stack_top);\r\n    SLLStackPush(ui_state->tags_key_stack_free, popped);\r\n  }\r\n}\r\n\r\n//- rjf: manual implementations\r\n\r\ninternal String8\r\nui_top_tag(void)\r\n{\r\n  UI_StackTopImpl(ui_state, Tag, tag)\r\n}\r\n\r\ninternal String8\r\nui_bottom_tag(void)\r\n{\r\n  UI_StackBottomImpl(ui_state, Tag, tag)\r\n}\r\n\r\ninternal String8\r\nui_push_tag(String8 v)\r\n{\r\n  ui__push_tags_key_from_appended_string(v);\r\n  UI_StackPushImpl(ui_state, Tag, tag, String8, push_str8_copy(ui_build_arena(), v))\r\n}\r\n\r\ninternal String8\r\nui_pop_tag(void)\r\n{\r\n  ui__pop_tags_key();\r\n  UI_StackPopImpl(ui_state, Tag, tag)\r\n}\r\n\r\ninternal String8\r\nui_set_next_tag(String8 v)\r\n{\r\n  ui__push_tags_key_from_appended_string(v);\r\n  UI_StackSetNextImpl(ui_state, Tag, tag, String8, push_str8_copy(ui_build_arena(), v))\r\n}\r\n\r\n//- rjf: helpers\r\n\r\ninternal Rng2F32\r\nui_push_rect(Rng2F32 rect)\r\n{\r\n  Rng2F32 replaced = {0};\r\n  Vec2F32 size = dim_2f32(rect);\r\n  replaced.x0 = ui_push_fixed_x(rect.x0);\r\n  replaced.y0 = ui_push_fixed_y(rect.y0);\r\n  replaced.x1 = replaced.x0 + ui_push_fixed_width(size.x);\r\n  replaced.y1 = replaced.y0 + ui_push_fixed_height(size.y);\r\n  return replaced;\r\n}\r\n\r\ninternal Rng2F32\r\nui_pop_rect(void)\r\n{\r\n  Rng2F32 popped = {0};\r\n  popped.x0 = ui_pop_fixed_x();\r\n  popped.y0 = ui_pop_fixed_y();\r\n  popped.x1 = popped.x0 + ui_pop_fixed_width();\r\n  popped.y1 = popped.y0 + ui_pop_fixed_height();\r\n  return popped;\r\n}\r\n\r\ninternal void\r\nui_set_next_rect(Rng2F32 rect)\r\n{\r\n  Vec2F32 size = dim_2f32(rect);\r\n  ui_set_next_fixed_x(rect.x0);\r\n  ui_set_next_fixed_y(rect.y0);\r\n  ui_set_next_fixed_width(size.x);\r\n  ui_set_next_fixed_height(size.y);\r\n}\r\n\r\ninternal UI_Size\r\nui_push_pref_size(Axis2 axis, UI_Size v)\r\n{\r\n  UI_Size result = zero_struct;\r\n  switch(axis)\r\n  {\r\n    default: break;\r\n    case Axis2_X: {result = ui_push_pref_width(v);}break;\r\n    case Axis2_Y: {result = ui_push_pref_height(v);}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal UI_Size\r\nui_pop_pref_size(Axis2 axis)\r\n{\r\n  UI_Size result = zero_struct;\r\n  switch(axis)\r\n  {\r\n    default: break;\r\n    case Axis2_X: {result = ui_pop_pref_width();}break;\r\n    case Axis2_Y: {result = ui_pop_pref_height();}break;\r\n  }\r\n  return result;\r\n}\r\n\r\ninternal UI_Size\r\nui_set_next_pref_size(Axis2 axis, UI_Size v)\r\n{\r\n  return (axis == Axis2_X ? ui_set_next_pref_width : ui_set_next_pref_height)(v);\r\n}\r\n\r\ninternal void\r\nui_push_corner_radius(F32 v)\r\n{\r\n  ui_push_corner_radius_00(v);\r\n  ui_push_corner_radius_01(v);\r\n  ui_push_corner_radius_10(v);\r\n  ui_push_corner_radius_11(v);\r\n}\r\n\r\ninternal void\r\nui_pop_corner_radius(void)\r\n{\r\n  ui_pop_corner_radius_00();\r\n  ui_pop_corner_radius_01();\r\n  ui_pop_corner_radius_10();\r\n  ui_pop_corner_radius_11();\r\n}\r\n\r\ninternal void\r\nui_push_tagf(char *fmt, ...)\r\n{\r\n  Temp scratch = scratch_begin(0, 0);\r\n  va_list args;\r\n  va_start(args, fmt);\r\n  String8 string = push_str8fv(scratch.arena, fmt, args);\r\n  ui_push_tag(string);\r\n  va_end(args);\r\n  scratch_end(scratch);\r\n}\r\n\r\ninternal F32\r\nui_top_px_height(void)\r\n{\r\n  F32 result = ui_top_font_size();\r\n  for(UI_PrefHeightNode *n = ui_state->pref_height_stack.top; n != 0; n = n->next)\r\n  {\r\n    if(n->v.kind == UI_SizeKind_Pixels)\r\n    {\r\n      result = n->v.value;\r\n      break;\r\n    }\r\n  }\r\n  return result;\r\n}\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/ui.meta.c\"\r\n"
  },
  {
    "path": "src/ui/ui_core.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef UI_H\r\n#define UI_H\r\n\r\n////////////////////////////////\r\n//~ rjf: Icon Info\r\n\r\ntypedef enum UI_IconKind\r\n{\r\n  UI_IconKind_Null,\r\n  UI_IconKind_RightArrow,\r\n  UI_IconKind_DownArrow,\r\n  UI_IconKind_LeftArrow,\r\n  UI_IconKind_UpArrow,\r\n  UI_IconKind_RightCaret,\r\n  UI_IconKind_DownCaret,\r\n  UI_IconKind_LeftCaret,\r\n  UI_IconKind_UpCaret,\r\n  UI_IconKind_CheckHollow,\r\n  UI_IconKind_CheckFilled,\r\n  UI_IconKind_COUNT\r\n}\r\nUI_IconKind;\r\n\r\ntypedef struct UI_IconInfo UI_IconInfo;\r\nstruct UI_IconInfo\r\n{\r\n  FNT_Tag icon_font;\r\n  String8 icon_kind_text_map[UI_IconKind_COUNT];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Mouse Button Kinds\r\n\r\ntypedef enum UI_MouseButtonKind\r\n{\r\n  UI_MouseButtonKind_Left,\r\n  UI_MouseButtonKind_Middle,\r\n  UI_MouseButtonKind_Right,\r\n  UI_MouseButtonKind_COUNT\r\n}\r\nUI_MouseButtonKind;\r\n\r\n////////////////////////////////\r\n//~ rjf: Codepath Permissions\r\n\r\ntypedef U32 UI_PermissionFlags;\r\nenum\r\n{\r\n  UI_PermissionFlag_ClicksLeft        = (1<<0),\r\n  UI_PermissionFlag_ClicksMiddle      = (1<<1),\r\n  UI_PermissionFlag_ClicksRight       = (1<<2),\r\n  UI_PermissionFlag_ScrollX           = (1<<3),\r\n  UI_PermissionFlag_ScrollY           = (1<<4),\r\n  UI_PermissionFlag_KeyboardPrimary   = (1<<5),\r\n  UI_PermissionFlag_KeyboardSecondary = (1<<6),\r\n  UI_PermissionFlag_Text              = (1<<7),\r\n  \r\n  //- rjf bundles\r\n  UI_PermissionFlag_Keyboard = (UI_PermissionFlag_KeyboardPrimary|UI_PermissionFlag_KeyboardSecondary),\r\n  UI_PermissionFlag_Clicks = (UI_PermissionFlag_ClicksLeft|UI_PermissionFlag_ClicksMiddle|UI_PermissionFlag_ClicksRight),\r\n  UI_PermissionFlag_All = 0xffffffff,\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Focus Types\r\n\r\ntypedef enum UI_FocusKind\r\n{\r\n  UI_FocusKind_Null,\r\n  UI_FocusKind_Off,\r\n  UI_FocusKind_On,\r\n  UI_FocusKind_Root,\r\n  UI_FocusKind_COUNT\r\n}\r\nUI_FocusKind;\r\n\r\n////////////////////////////////\r\n//~ rjf: Events\r\n\r\n// TODO(rjf): clean all this up\r\n\r\ntypedef enum UI_EventKind\r\n{\r\n  UI_EventKind_Null,\r\n  UI_EventKind_Press,\r\n  UI_EventKind_Release,\r\n  UI_EventKind_Text,\r\n  UI_EventKind_Navigate,\r\n  UI_EventKind_Edit,\r\n  UI_EventKind_MouseMove,\r\n  UI_EventKind_Scroll,\r\n  UI_EventKind_FileDrop,\r\n  UI_EventKind_COUNT\r\n}\r\nUI_EventKind;\r\n\r\ntypedef enum UI_EventActionSlot\r\n{\r\n  UI_EventActionSlot_Null,\r\n  UI_EventActionSlot_Accept,\r\n  UI_EventActionSlot_Cancel,\r\n  UI_EventActionSlot_Edit,\r\n  UI_EventActionSlot_COUNT\r\n}\r\nUI_EventActionSlot;\r\n\r\ntypedef U32 UI_EventFlags;\r\nenum\r\n{\r\n  UI_EventFlag_KeepMark            = (1<<0),\r\n  UI_EventFlag_Delete              = (1<<1),\r\n  UI_EventFlag_Copy                = (1<<2),\r\n  UI_EventFlag_Paste               = (1<<3),\r\n  UI_EventFlag_ZeroDeltaOnSelect   = (1<<4),\r\n  UI_EventFlag_PickSelectSide      = (1<<5),\r\n  UI_EventFlag_CapAtLine           = (1<<6),\r\n  UI_EventFlag_ExplicitDirectional = (1<<7),\r\n  UI_EventFlag_Reorder             = (1<<8),\r\n  UI_EventFlag_Secondary           = (1<<9),\r\n};\r\n\r\ntypedef enum UI_EventDeltaUnit\r\n{\r\n  UI_EventDeltaUnit_Null,\r\n  UI_EventDeltaUnit_Char,\r\n  UI_EventDeltaUnit_Word,\r\n  UI_EventDeltaUnit_Line,\r\n  UI_EventDeltaUnit_Page,\r\n  UI_EventDeltaUnit_Whole,\r\n  UI_EventDeltaUnit_COUNT\r\n}\r\nUI_EventDeltaUnit;\r\n\r\ntypedef struct UI_Event UI_Event;\r\nstruct UI_Event\r\n{\r\n  UI_EventKind kind;\r\n  UI_EventActionSlot slot;\r\n  UI_EventFlags flags;\r\n  UI_EventDeltaUnit delta_unit;\r\n  OS_Key key;\r\n  OS_Modifiers modifiers;\r\n  String8 string;\r\n  String8List paths;\r\n  Vec2F32 pos;\r\n  Vec2F32 delta_2f32;\r\n  Vec2S32 delta_2s32;\r\n  U64 timestamp_us;\r\n};\r\n\r\ntypedef struct UI_EventNode UI_EventNode;\r\nstruct UI_EventNode\r\n{\r\n  UI_EventNode *next;\r\n  UI_EventNode *prev;\r\n  UI_Event v;\r\n};\r\n\r\ntypedef struct UI_EventList UI_EventList;\r\nstruct UI_EventList\r\n{\r\n  UI_EventNode *first;\r\n  UI_EventNode *last;\r\n  U64 count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Textual Operations\r\n\r\ntypedef U32 UI_TxtOpFlags;\r\nenum\r\n{\r\n  UI_TxtOpFlag_Invalid = (1<<0),\r\n  UI_TxtOpFlag_Copy    = (1<<1),\r\n};\r\n\r\ntypedef struct UI_TxtOp UI_TxtOp;\r\nstruct UI_TxtOp\r\n{\r\n  UI_TxtOpFlags flags;\r\n  String8 replace;\r\n  String8 copy;\r\n  TxtRng range;\r\n  TxtPt cursor;\r\n  TxtPt mark;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Keys\r\n\r\ntypedef struct UI_Key UI_Key;\r\nstruct UI_Key\r\n{\r\n  U64 u64[1];\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Sizes\r\n\r\ntypedef enum UI_SizeKind\r\n{\r\n  UI_SizeKind_Null,\r\n  UI_SizeKind_Pixels,      // size is computed via a preferred pixel value\r\n  UI_SizeKind_TextContent, // size is computed via the dimensions of box's rendered string\r\n  UI_SizeKind_ParentPct,   // size is computed via a well-determined parent or grandparent size\r\n  UI_SizeKind_ChildrenSum, // size is computed via summing well-determined sizes of children\r\n}\r\nUI_SizeKind;\r\n\r\ntypedef struct UI_Size UI_Size;\r\nstruct UI_Size\r\n{\r\n  UI_SizeKind kind;\r\n  F32 value;\r\n  F32 strictness;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Themes\r\n\r\ntypedef struct UI_ThemePattern UI_ThemePattern;\r\nstruct UI_ThemePattern\r\n{\r\n  String8Array tags;\r\n  Vec4F32 linear;\r\n};\r\n\r\ntypedef struct UI_Theme UI_Theme;\r\nstruct UI_Theme\r\n{\r\n  UI_ThemePattern *patterns;\r\n  U64 patterns_count;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Animation Info\r\n\r\ntypedef struct UI_AnimationInfo UI_AnimationInfo;\r\nstruct UI_AnimationInfo\r\n{\r\n  F32 hot_animation_rate;\r\n  F32 active_animation_rate;\r\n  F32 focus_animation_rate;\r\n  F32 tooltip_animation_rate;\r\n  F32 menu_animation_rate;\r\n  F32 scroll_animation_rate;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Scroll Positions\r\n\r\ntypedef struct UI_ScrollPt UI_ScrollPt;\r\nstruct UI_ScrollPt\r\n{\r\n  S64 idx;\r\n  F32 off;\r\n};\r\n\r\ntypedef union UI_ScrollPt2 UI_ScrollPt2;\r\nunion UI_ScrollPt2\r\n{\r\n  UI_ScrollPt v[2];\r\n  struct\r\n  {\r\n    UI_ScrollPt x;\r\n    UI_ScrollPt y;\r\n  };\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Box Types\r\n\r\ntypedef enum UI_TextAlign\r\n{\r\n  UI_TextAlign_Left,\r\n  UI_TextAlign_Center,\r\n  UI_TextAlign_Right,\r\n  UI_TextAlign_COUNT\r\n}\r\nUI_TextAlign;\r\n\r\nstruct UI_Box;\r\n#define UI_BOX_CUSTOM_DRAW(name) void name(struct UI_Box *box, void *user_data)\r\ntypedef UI_BOX_CUSTOM_DRAW(UI_BoxCustomDrawFunctionType);\r\n\r\ntypedef U64 UI_BoxFlags;\r\n//{\r\n//- rjf: interaction\r\n# define UI_BoxFlag_MouseClickable            (UI_BoxFlags)(1ull<<0)\r\n# define UI_BoxFlag_KeyboardClickable         (UI_BoxFlags)(1ull<<1)\r\n# define UI_BoxFlag_DropSite                  (UI_BoxFlags)(1ull<<2)\r\n# define UI_BoxFlag_ClickToFocus              (UI_BoxFlags)(1ull<<3)\r\n# define UI_BoxFlag_Scroll                    (UI_BoxFlags)(1ull<<4)\r\n# define UI_BoxFlag_ViewScrollX               (UI_BoxFlags)(1ull<<5)\r\n# define UI_BoxFlag_ViewScrollY               (UI_BoxFlags)(1ull<<6)\r\n# define UI_BoxFlag_ViewClampX                (UI_BoxFlags)(1ull<<7)\r\n# define UI_BoxFlag_ViewClampY                (UI_BoxFlags)(1ull<<8)\r\n# define UI_BoxFlag_FocusHot                  (UI_BoxFlags)(1ull<<9)\r\n# define UI_BoxFlag_FocusActive               (UI_BoxFlags)(1ull<<10)\r\n# define UI_BoxFlag_FocusHotDisabled          (UI_BoxFlags)(1ull<<11)\r\n# define UI_BoxFlag_FocusActiveDisabled       (UI_BoxFlags)(1ull<<12)\r\n# define UI_BoxFlag_DefaultFocusNavX          (UI_BoxFlags)(1ull<<13)\r\n# define UI_BoxFlag_DefaultFocusNavY          (UI_BoxFlags)(1ull<<14)\r\n# define UI_BoxFlag_DefaultFocusEdit          (UI_BoxFlags)(1ull<<15)\r\n# define UI_BoxFlag_FocusNavSkip              (UI_BoxFlags)(1ull<<16)\r\n# define UI_BoxFlag_DisableTruncatedHover     (UI_BoxFlags)(1ull<<17)\r\n# define UI_BoxFlag_Disabled                  (UI_BoxFlags)(1ull<<18)\r\n\r\n//- rjf: layout\r\n# define UI_BoxFlag_FloatingX                 (UI_BoxFlags)(1ull<<19)\r\n# define UI_BoxFlag_FloatingY                 (UI_BoxFlags)(1ull<<20)\r\n# define UI_BoxFlag_FixedWidth                (UI_BoxFlags)(1ull<<21)\r\n# define UI_BoxFlag_FixedHeight               (UI_BoxFlags)(1ull<<22)\r\n# define UI_BoxFlag_AllowOverflowX            (UI_BoxFlags)(1ull<<23)\r\n# define UI_BoxFlag_AllowOverflowY            (UI_BoxFlags)(1ull<<24)\r\n# define UI_BoxFlag_SkipViewOffX              (UI_BoxFlags)(1ull<<25)\r\n# define UI_BoxFlag_SkipViewOffY              (UI_BoxFlags)(1ull<<26)\r\n\r\n//- rjf: appearance / animation\r\n# define UI_BoxFlag_DrawDropShadow            (UI_BoxFlags)(1ull<<27)\r\n# define UI_BoxFlag_DrawBackgroundBlur        (UI_BoxFlags)(1ull<<28)\r\n# define UI_BoxFlag_DrawBackground            (UI_BoxFlags)(1ull<<29)\r\n# define UI_BoxFlag_DrawBorder                (UI_BoxFlags)(1ull<<30)\r\n# define UI_BoxFlag_DrawSideTop               (UI_BoxFlags)(1ull<<31)\r\n# define UI_BoxFlag_DrawSideBottom            (UI_BoxFlags)(1ull<<32)\r\n# define UI_BoxFlag_DrawSideLeft              (UI_BoxFlags)(1ull<<33)\r\n# define UI_BoxFlag_DrawSideRight             (UI_BoxFlags)(1ull<<34)\r\n# define UI_BoxFlag_DrawText                  (UI_BoxFlags)(1ull<<35)\r\n# define UI_BoxFlag_DrawTextFastpathCodepoint (UI_BoxFlags)(1ull<<36)\r\n# define UI_BoxFlag_DrawTextWeak              (UI_BoxFlags)(1ull<<37)\r\n# define UI_BoxFlag_DrawHotEffects            (UI_BoxFlags)(1ull<<38)\r\n# define UI_BoxFlag_DrawActiveEffects         (UI_BoxFlags)(1ull<<39)\r\n# define UI_BoxFlag_DrawOverlay               (UI_BoxFlags)(1ull<<40)\r\n# define UI_BoxFlag_DrawBucket                (UI_BoxFlags)(1ull<<41)\r\n# define UI_BoxFlag_Clip                      (UI_BoxFlags)(1ull<<42)\r\n# define UI_BoxFlag_AnimatePosX               (UI_BoxFlags)(1ull<<43)\r\n# define UI_BoxFlag_AnimatePosY               (UI_BoxFlags)(1ull<<44)\r\n# define UI_BoxFlag_DisableTextTrunc          (UI_BoxFlags)(1ull<<45)\r\n# define UI_BoxFlag_DisableIDString           (UI_BoxFlags)(1ull<<46)\r\n# define UI_BoxFlag_DisableFocusBorder        (UI_BoxFlags)(1ull<<47)\r\n# define UI_BoxFlag_DisableFocusOverlay       (UI_BoxFlags)(1ull<<48)\r\n# define UI_BoxFlag_HasDisplayString          (UI_BoxFlags)(1ull<<49)\r\n# define UI_BoxFlag_HasFuzzyMatchRanges       (UI_BoxFlags)(1ull<<50)\r\n# define UI_BoxFlag_RoundChildrenByParent     (UI_BoxFlags)(1ull<<51)\r\n# define UI_BoxFlag_SquishAnchored            (UI_BoxFlags)(1ull<<52)\r\n\r\n//- rjf: debug\r\n# define UI_BoxFlag_Debug                     (UI_BoxFlags)(1ull<<53)\r\n\r\n//- rjf: bundles\r\n# define UI_BoxFlag_Clickable           (UI_BoxFlag_MouseClickable|UI_BoxFlag_KeyboardClickable)\r\n# define UI_BoxFlag_DefaultFocusNav     (UI_BoxFlag_DefaultFocusNavX|UI_BoxFlag_DefaultFocusNavY|UI_BoxFlag_DefaultFocusEdit)\r\n# define UI_BoxFlag_Floating            (UI_BoxFlag_FloatingX|UI_BoxFlag_FloatingY)\r\n# define UI_BoxFlag_FixedSize           (UI_BoxFlag_FixedWidth|UI_BoxFlag_FixedHeight)\r\n# define UI_BoxFlag_AllowOverflow       (UI_BoxFlag_AllowOverflowX|UI_BoxFlag_AllowOverflowY)\r\n# define UI_BoxFlag_AnimatePos          (UI_BoxFlag_AnimatePosX|UI_BoxFlag_AnimatePosY)\r\n# define UI_BoxFlag_ViewScroll          (UI_BoxFlag_ViewScrollX|UI_BoxFlag_ViewScrollY)\r\n# define UI_BoxFlag_ViewClamp           (UI_BoxFlag_ViewClampX|UI_BoxFlag_ViewClampY)\r\n# define UI_BoxFlag_DisableFocusEffects (UI_BoxFlag_DisableFocusBorder|UI_BoxFlag_DisableFocusOverlay)\r\n//}\r\n\r\ntypedef struct UI_Box UI_Box;\r\nstruct UI_Box\r\n{\r\n  //- rjf: persistent links\r\n  UI_Box *hash_next;\r\n  UI_Box *hash_prev;\r\n  \r\n  //- rjf: per-build links/data\r\n  UI_Box *first;\r\n  UI_Box *last;\r\n  UI_Box *next;\r\n  UI_Box *prev;\r\n  UI_Box *parent;\r\n  U64 child_count;\r\n  \r\n  //- rjf: per-build equipment\r\n  UI_Key key;\r\n  UI_BoxFlags flags;\r\n  UI_Key tags_key;\r\n  String8 string;\r\n  UI_TextAlign text_align;\r\n  Vec2F32 fixed_position;\r\n  Vec2F32 fixed_size;\r\n  Vec2F32 min_size;\r\n  UI_Size pref_size[Axis2_COUNT];\r\n  Axis2 child_layout_axis;\r\n  OS_Cursor hover_cursor;\r\n  U32 fastpath_codepoint;\r\n  UI_Key group_key;\r\n  DR_Bucket *draw_bucket;\r\n  UI_BoxCustomDrawFunctionType *custom_draw;\r\n  void *custom_draw_user_data;\r\n  Vec4F32 background_color;\r\n  Vec4F32 text_color;\r\n  Vec4F32 border_color;\r\n  FNT_Tag font;\r\n  F32 font_size;\r\n  F32 tab_size;\r\n  FNT_RasterFlags text_raster_flags;\r\n  F32 corner_radii[Corner_COUNT];\r\n  F32 blur_size;\r\n  F32 transparency;\r\n  F32 squish;\r\n  F32 text_padding;\r\n  \r\n  //- rjf: per-build artifacts\r\n  DR_FStrList display_fstrs;\r\n  DR_FRunList display_fruns;\r\n  Rng2F32 rect;\r\n  Vec2F32 fixed_position_animated;\r\n  Vec2F32 position_delta;\r\n  FuzzyMatchRangeList fuzzy_match_ranges;\r\n  \r\n  //- rjf: persistent data\r\n  U64 first_touched_build_index;\r\n  U64 last_touched_build_index;\r\n  U64 first_disabled_build_index;\r\n  F32 hot_t;\r\n  F32 active_t;\r\n  F32 disabled_t;\r\n  F32 focus_hot_t;\r\n  F32 focus_active_t;\r\n  F32 focus_active_disabled_t;\r\n  Vec2F32 view_off;\r\n  Vec2F32 view_off_target;\r\n  Vec2F32 view_bounds;\r\n  UI_Key default_nav_focus_hot_key;\r\n  UI_Key default_nav_focus_active_key;\r\n  UI_Key default_nav_focus_next_hot_key;\r\n  UI_Key default_nav_focus_next_active_key;\r\n};\r\n\r\ntypedef struct UI_BoxRec UI_BoxRec;\r\nstruct UI_BoxRec\r\n{\r\n  UI_Box *next;\r\n  S32 push_count;\r\n  S32 pop_count;\r\n};\r\n\r\ntypedef struct UI_BoxNode UI_BoxNode;\r\nstruct UI_BoxNode\r\n{\r\n  UI_BoxNode *next;\r\n  UI_Box *box;\r\n};\r\n\r\ntypedef struct UI_BoxList UI_BoxList;\r\nstruct UI_BoxList\r\n{\r\n  UI_BoxNode *first;\r\n  UI_BoxNode *last;\r\n  U64 count;\r\n};\r\n\r\ntypedef U32 UI_SignalFlags;\r\nenum\r\n{\r\n  // rjf: mouse press -> box was pressed while hovering\r\n  UI_SignalFlag_LeftPressed         = (1<<0),\r\n  UI_SignalFlag_MiddlePressed       = (1<<1),\r\n  UI_SignalFlag_RightPressed        = (1<<2),\r\n  \r\n  // rjf: dragging -> box was previously pressed, user is still holding button\r\n  UI_SignalFlag_LeftDragging        = (1<<3),\r\n  UI_SignalFlag_MiddleDragging      = (1<<4),\r\n  UI_SignalFlag_RightDragging       = (1<<5),\r\n  \r\n  // rjf: double-dragging -> box was previously double-clicked, user is still holding button\r\n  UI_SignalFlag_LeftDoubleDragging  = (1<<6),\r\n  UI_SignalFlag_MiddleDoubleDragging= (1<<7),\r\n  UI_SignalFlag_RightDoubleDragging = (1<<8),\r\n  \r\n  // rjf: triple-dragging -> box was previously triple-clicked, user is still holding button\r\n  UI_SignalFlag_LeftTripleDragging  = (1<<9),\r\n  UI_SignalFlag_MiddleTripleDragging= (1<<10),\r\n  UI_SignalFlag_RightTripleDragging = (1<<11),\r\n  \r\n  // rjf: released -> box was previously pressed & user released, in or out of bounds\r\n  UI_SignalFlag_LeftReleased        = (1<<12),\r\n  UI_SignalFlag_MiddleReleased      = (1<<13),\r\n  UI_SignalFlag_RightReleased       = (1<<14),\r\n  \r\n  // rjf: clicked -> box was previously pressed & user released, in bounds\r\n  UI_SignalFlag_LeftClicked         = (1<<15),\r\n  UI_SignalFlag_MiddleClicked       = (1<<16),\r\n  UI_SignalFlag_RightClicked        = (1<<17),\r\n  \r\n  // rjf: double clicked -> box was previously clicked, pressed again\r\n  UI_SignalFlag_LeftDoubleClicked   = (1<<18),\r\n  UI_SignalFlag_MiddleDoubleClicked = (1<<19),\r\n  UI_SignalFlag_RightDoubleClicked  = (1<<20),\r\n  \r\n  // rjf: triple clicked -> box was previously clicked twice, pressed again\r\n  UI_SignalFlag_LeftTripleClicked   = (1<<21),\r\n  UI_SignalFlag_MiddleTripleClicked = (1<<22),\r\n  UI_SignalFlag_RightTripleClicked  = (1<<23),\r\n  \r\n  // rjf: keyboard pressed -> box had focus, user activated via their keyboard\r\n  UI_SignalFlag_KeyboardPressed     = (1<<24),\r\n  \r\n  // rjf: passive mouse info\r\n  UI_SignalFlag_Hovering            = (1<<25), // hovering specifically this box\r\n  UI_SignalFlag_MouseOver           = (1<<26), // mouse is over, but may be occluded\r\n  \r\n  // rjf: committing state changes via user interaction\r\n  UI_SignalFlag_Commit              = (1<<27),\r\n  \r\n  // rjf: high-level combos\r\n  UI_SignalFlag_Pressed = UI_SignalFlag_LeftPressed|UI_SignalFlag_KeyboardPressed,\r\n  UI_SignalFlag_Released = UI_SignalFlag_LeftReleased,\r\n  UI_SignalFlag_Clicked = UI_SignalFlag_LeftClicked|UI_SignalFlag_KeyboardPressed,\r\n  UI_SignalFlag_DoubleClicked = UI_SignalFlag_LeftDoubleClicked,\r\n  UI_SignalFlag_TripleClicked = UI_SignalFlag_LeftTripleClicked,\r\n  UI_SignalFlag_Dragging = UI_SignalFlag_LeftDragging,\r\n};\r\n\r\ntypedef struct UI_Signal UI_Signal;\r\nstruct UI_Signal\r\n{\r\n  UI_Box *box;\r\n  OS_Modifiers event_flags;\r\n  Vec2S16 scroll;\r\n  UI_SignalFlags f;\r\n};\r\n\r\n#define ui_pressed(s)        !!((s).f&UI_SignalFlag_Pressed)\r\n#define ui_clicked(s)        !!((s).f&UI_SignalFlag_Clicked)\r\n#define ui_released(s)       !!((s).f&UI_SignalFlag_Released)\r\n#define ui_double_clicked(s) !!((s).f&UI_SignalFlag_DoubleClicked)\r\n#define ui_triple_clicked(s) !!((s).f&UI_SignalFlag_TripleClicked)\r\n#define ui_middle_clicked(s) !!((s).f&UI_SignalFlag_MiddleClicked)\r\n#define ui_right_clicked(s)  !!((s).f&UI_SignalFlag_RightClicked)\r\n#define ui_dragging(s)       !!((s).f&UI_SignalFlag_Dragging)\r\n#define ui_hovering(s)       !!((s).f&UI_SignalFlag_Hovering)\r\n#define ui_mouse_over(s)     !!((s).f&UI_SignalFlag_MouseOver)\r\n#define ui_committed(s)      !!((s).f&UI_SignalFlag_Commit)\r\n\r\ntypedef struct UI_Nav UI_Nav;\r\nstruct UI_Nav\r\n{\r\n  B32 moved;\r\n  Vec2S64 new_p;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Animation State Types\r\n\r\ntypedef struct UI_AnimParams UI_AnimParams;\r\nstruct UI_AnimParams\r\n{\r\n  F32 initial;\r\n  F32 target;\r\n  F32 rate;\r\n  F32 epsilon;\r\n  B32 reset;\r\n};\r\n\r\ntypedef struct UI_AnimNode UI_AnimNode;\r\nstruct UI_AnimNode\r\n{\r\n  UI_AnimNode *slot_next;\r\n  UI_AnimNode *slot_prev;\r\n  UI_AnimNode *lru_next;\r\n  UI_AnimNode *lru_prev;\r\n  U64 first_touched_build_index;\r\n  U64 last_touched_build_index;\r\n  UI_Key key;\r\n  UI_AnimParams params;\r\n  F32 current;\r\n};\r\n\r\ntypedef struct UI_AnimSlot UI_AnimSlot;\r\nstruct UI_AnimSlot\r\n{\r\n  UI_AnimNode *first;\r\n  UI_AnimNode *last;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Generated Code\r\n\r\n#include \"generated/ui.meta.h\"\r\n\r\n////////////////////////////////\r\n//~ rjf: State Types\r\n\r\n//- rjf: cache for mapping 64-bit key -> array of tags\r\n\r\ntypedef struct UI_TagsCacheNode UI_TagsCacheNode;\r\nstruct UI_TagsCacheNode\r\n{\r\n  UI_TagsCacheNode *next;\r\n  UI_Key key;\r\n  String8Array tags;\r\n};\r\n\r\ntypedef struct UI_TagsCacheSlot UI_TagsCacheSlot;\r\nstruct UI_TagsCacheSlot\r\n{\r\n  UI_TagsCacheNode *first;\r\n  UI_TagsCacheNode *last;\r\n};\r\n\r\ntypedef struct UI_TagsKeyStackNode UI_TagsKeyStackNode;\r\nstruct UI_TagsKeyStackNode\r\n{\r\n  UI_TagsKeyStackNode *next;\r\n  UI_Key key;\r\n};\r\n\r\n//- rjf: cache for mapping 64-bit key -> theme pattern\r\n\r\ntypedef struct UI_ThemePatternCacheNode UI_ThemePatternCacheNode;\r\nstruct UI_ThemePatternCacheNode\r\n{\r\n  UI_ThemePatternCacheNode *slot_next;\r\n  UI_ThemePatternCacheNode *slot_prev;\r\n  UI_ThemePatternCacheNode *lru_next;\r\n  UI_ThemePatternCacheNode *lru_prev;\r\n  U64 last_build_index_accessed;\r\n  UI_Key key;\r\n  Vec4F32 target_rgba;\r\n  Vec4F32 current_rgba;\r\n};\r\n\r\ntypedef struct UI_ThemePatternCacheSlot UI_ThemePatternCacheSlot;\r\nstruct UI_ThemePatternCacheSlot\r\n{\r\n  UI_ThemePatternCacheNode *first;\r\n  UI_ThemePatternCacheNode *last;\r\n};\r\n\r\n//- rjf: cache for mapping 64-bit key -> box\r\n\r\ntypedef struct UI_BoxHashSlot UI_BoxHashSlot;\r\nstruct UI_BoxHashSlot\r\n{\r\n  UI_Box *hash_first;\r\n  UI_Box *hash_last;\r\n};\r\n\r\n//- rjf: main state bundle\r\n\r\ntypedef struct UI_State UI_State;\r\nstruct UI_State\r\n{\r\n  //- rjf: main arena\r\n  Arena *arena;\r\n  \r\n  //- rjf: fixed keys\r\n  UI_Key external_key;\r\n  \r\n  //- rjf: build arenas\r\n  Arena *build_arenas[2];\r\n  U64 build_index;\r\n  \r\n  //- rjf: box cache\r\n  UI_Box *first_free_box;\r\n  U64 box_table_size;\r\n  UI_BoxHashSlot *box_table;\r\n  \r\n  //- rjf: anim cache\r\n  UI_AnimNode *free_anim_node;\r\n  UI_AnimNode *lru_anim_node;\r\n  UI_AnimNode *mru_anim_node;\r\n  U64 anim_slots_count;\r\n  UI_AnimSlot *anim_slots;\r\n  \r\n  //- rjf: build state machine state\r\n  B32 is_in_open_ctx_menu;\r\n  String8 autocomplete_string;\r\n  B32 tooltip_can_overflow_window;\r\n  UI_Key tooltip_anchor_key;\r\n  String8Array current_gen_tags;\r\n  U64 current_gen_tags_gen;\r\n  UI_TagsKeyStackNode *tags_key_stack_top;\r\n  UI_TagsKeyStackNode *tags_key_stack_free;\r\n  U64 tags_cache_slots_count;\r\n  UI_TagsCacheSlot *tags_cache_slots;\r\n  \r\n  //- rjf: theme pattern cache\r\n  U64 theme_pattern_cache_slots_count;\r\n  UI_ThemePatternCacheSlot *theme_pattern_cache_slots;\r\n  UI_ThemePatternCacheNode *theme_pattern_cache_node_free;\r\n  UI_ThemePatternCacheNode *lru_theme_pattern_cache_node;\r\n  UI_ThemePatternCacheNode *mru_theme_pattern_cache_node;\r\n  \r\n  //- rjf: build phase output\r\n  UI_Box *root;\r\n  UI_Box *tooltip_root;\r\n  UI_Box *ctx_menu_root;\r\n  UI_Key default_nav_root_key;\r\n  U64 build_box_count;\r\n  U64 last_build_box_count;\r\n  B32 ctx_menu_touched_this_frame;\r\n  B32 is_animating;\r\n  \r\n  //- rjf: build parameters\r\n  UI_IconInfo icon_info;\r\n  UI_Theme *theme;\r\n  UI_AnimationInfo animation_info;\r\n  OS_Handle window;\r\n  UI_EventList *events;\r\n  Vec2F32 mouse;\r\n  F32 animation_dt;\r\n  F32 default_animation_rate;\r\n  \r\n  //- rjf: user interaction state\r\n  UI_Key hot_box_key;\r\n  UI_Key active_box_key[UI_MouseButtonKind_COUNT];\r\n  UI_Key drop_hot_box_key;\r\n  UI_Key clipboard_copy_key;\r\n  U64 press_timestamp_history_us[UI_MouseButtonKind_COUNT][3];\r\n  UI_Key press_key_history[UI_MouseButtonKind_COUNT][3];\r\n  Vec2F32 press_pos_history[UI_MouseButtonKind_COUNT][3];\r\n  Vec2F32 drag_start_mouse;\r\n  Arena *drag_state_arena;\r\n  String8 drag_state_data;\r\n  Arena *string_hover_arena;\r\n  String8 string_hover_string;\r\n  F32 string_hover_size;\r\n  DR_FStrList string_hover_fstrs;\r\n  U64 string_hover_begin_us;\r\n  U64 string_hover_build_index;\r\n  U64 last_time_mousemoved_us;\r\n  \r\n  //- rjf: tooltip state\r\n  F32 tooltip_open_t;\r\n  B32 tooltip_open;\r\n  \r\n  //- rjf: context menu state\r\n  UI_Key ctx_menu_anchor_key;\r\n  UI_Key next_ctx_menu_anchor_key;\r\n  Vec2F32 ctx_menu_anchor_box_last_pos;\r\n  Vec2F32 ctx_menu_anchor_off;\r\n  B32 ctx_menu_open;\r\n  B32 next_ctx_menu_open;\r\n  F32 ctx_menu_open_t;\r\n  UI_Key ctx_menu_key;\r\n  B32 ctx_menu_changed;\r\n  \r\n  //- rjf: build phase stacks\r\n  UI_DeclStackNils;\r\n  UI_DeclStacks;\r\n};\r\n\r\n////////////////////////////////\r\n//~ rjf: Basic Type Functions\r\n\r\ninternal String8 ui_hash_part_from_key_string(String8 string);\r\ninternal String8 ui_display_part_from_key_string(String8 string);\r\ninternal UI_Key  ui_key_zero(void);\r\ninternal UI_Key  ui_key_make(U64 v);\r\ninternal UI_Key  ui_key_from_string(UI_Key seed_key, String8 string);\r\ninternal UI_Key  ui_key_from_stringf(UI_Key seed_key, char *fmt, ...);\r\ninternal B32     ui_key_match(UI_Key a, UI_Key b);\r\n\r\n////////////////////////////////\r\n//~ rjf: Event Type Functions\r\n\r\ninternal UI_EventNode *ui_event_list_push(Arena *arena, UI_EventList *list, UI_Event *v);\r\ninternal void ui_eat_event_node(UI_EventList *list, UI_EventNode *node);\r\n\r\n////////////////////////////////\r\n//~ rjf: Text Operation Functions\r\n\r\ninternal B32 ui_char_is_scan_boundary(U8 c);\r\ninternal S64 ui_scanned_column_from_column(String8 string, S64 start_column, Side side);\r\ninternal UI_TxtOp ui_single_line_txt_op_from_event(Arena *arena, UI_Event *event, String8 string, TxtPt cursor, TxtPt mark);\r\ninternal String8 ui_push_string_replace_range(Arena *arena, String8 string, Rng1S64 range, String8 replace);\r\n\r\n////////////////////////////////\r\n//~ rjf: Size Type Functions\r\n\r\ninternal UI_Size ui_size(UI_SizeKind kind, F32 value, F32 strictness);\r\n#define ui_px(value, strictness)         ui_size(UI_SizeKind_Pixels, value, strictness)\r\n#define ui_em(value, strictness)         ui_size(UI_SizeKind_Pixels, (value) * ui_top_font_size(), strictness)\r\n#define ui_text_dim(padding, strictness) ui_size(UI_SizeKind_TextContent, padding, strictness)\r\n#define ui_pct(value, strictness)        ui_size(UI_SizeKind_ParentPct, value, strictness)\r\n#define ui_children_sum(strictness)      ui_size(UI_SizeKind_ChildrenSum, 0.f, strictness)\r\n\r\n////////////////////////////////\r\n//~ rjf: Scroll Point Type Functions\r\n\r\ninternal UI_ScrollPt ui_scroll_pt(S64 idx, F32 off);\r\ninternal void ui_scroll_pt_target_idx(UI_ScrollPt *v, S64 idx);\r\ninternal void ui_scroll_pt_clamp_idx(UI_ScrollPt *v, Rng1S64 range);\r\n\r\n////////////////////////////////\r\n//~ rjf: Box Type Functions\r\n\r\nread_only global UI_Box ui_nil_box =\r\n{\r\n  &ui_nil_box,\r\n  &ui_nil_box,\r\n  &ui_nil_box,\r\n  &ui_nil_box,\r\n  &ui_nil_box,\r\n  &ui_nil_box,\r\n  &ui_nil_box,\r\n};\r\ninternal B32 ui_box_is_nil(UI_Box *box);\r\ninternal UI_BoxRec ui_box_rec_df(UI_Box *box, UI_Box *root, U64 sib_member_off, U64 child_member_off);\r\n#define ui_box_rec_df_pre(box, root) ui_box_rec_df(box, root, OffsetOf(UI_Box, next), OffsetOf(UI_Box, first))\r\n#define ui_box_rec_df_post(box, root) ui_box_rec_df(box, root, OffsetOf(UI_Box, prev), OffsetOf(UI_Box, last))\r\ninternal void ui_box_list_push(Arena *arena, UI_BoxList *list, UI_Box *box);\r\n\r\n////////////////////////////////\r\n//~ rjf: State Allocating / Selection\r\n\r\ninternal UI_State *ui_state_alloc(void);\r\ninternal void      ui_state_release(UI_State *state);\r\ninternal UI_Box *  ui_root_from_state(UI_State *state);\r\ninternal B32       ui_animating_from_state(UI_State *state);\r\ninternal void      ui_select_state(UI_State *state);\r\ninternal UI_State *ui_get_selected_state(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Implicit State Accessors/Mutators\r\n\r\n//- rjf: per-frame info\r\ninternal Arena *           ui_build_arena(void);\r\ninternal OS_Handle         ui_window(void);\r\ninternal Vec2F32           ui_mouse(void);\r\ninternal FNT_Tag           ui_icon_font(void);\r\ninternal String8           ui_icon_string_from_kind(UI_IconKind icon_kind);\r\ninternal F32               ui_dt(void);\r\n\r\n//- rjf: event pumping\r\ninternal B32 ui_next_event(UI_Event **ev);\r\ninternal void ui_eat_event(UI_Event *ev);\r\n\r\n//- rjf: event consumption helpers\r\ninternal B32 ui_key_press(OS_Modifiers mods, OS_Key key);\r\ninternal B32 ui_key_release(OS_Modifiers mods, OS_Key key);\r\ninternal B32 ui_text(U32 character);\r\ninternal B32 ui_slot_press(UI_EventActionSlot slot);\r\n\r\n//- rjf: autocomplete info\r\ninternal void ui_set_autocomplete_string(String8 string);\r\ninternal String8 ui_autocomplete_string(void);\r\ninternal String8 ui_autocomplete(void);\r\n\r\n//- rjf: drag data\r\ninternal Vec2F32           ui_drag_start_mouse(void);\r\ninternal Vec2F32           ui_drag_delta(void);\r\ninternal void              ui_store_drag_data(String8 string);\r\ninternal String8           ui_get_drag_data(U64 min_required_size);\r\n#define ui_store_drag_struct(ptr) ui_store_drag_data(str8_struct(ptr))\r\n#define ui_get_drag_struct(type) ((type *)ui_get_drag_data(sizeof(type)).str)\r\n\r\n//- rjf: hovered string info\r\ninternal B32                ui_string_hover_active(void);\r\ninternal DR_FStrList ui_string_hover_fstrs(Arena *arena);\r\n\r\n//- rjf: interaction keys\r\ninternal UI_Key            ui_hot_key(void);\r\ninternal UI_Key            ui_active_key(UI_MouseButtonKind button_kind);\r\ninternal UI_Key            ui_drop_hot_key(void);\r\n\r\n//- rjf: controls over interaction\r\ninternal void              ui_kill_action(void);\r\n\r\n//- rjf: box cache lookup\r\ninternal UI_Box *          ui_box_from_key(UI_Key key);\r\n\r\n////////////////////////////////\r\n//~ rjf: Top-Level Building API\r\n\r\ninternal void ui_begin_build(OS_Handle window, UI_EventList *events, UI_IconInfo *icon_info, UI_Theme *theme, UI_AnimationInfo *animation_info, F32 real_dt, F32 animation_dt);\r\ninternal void ui_end_build(void);\r\ninternal void ui_calc_sizes_standalone__in_place(UI_Box *root, Axis2 axis);\r\ninternal void ui_calc_sizes_upwards_dependent__in_place(UI_Box *root, Axis2 axis);\r\ninternal void ui_calc_sizes_downwards_dependent__in_place(UI_Box *root, Axis2 axis);\r\ninternal void ui_layout_enforce_constraints__in_place(UI_Box *root, Axis2 axis);\r\ninternal void ui_layout_position__in_place(UI_Box *root, Axis2 axis);\r\ninternal void ui_layout_root(UI_Box *root, Axis2 axis);\r\n\r\n////////////////////////////////\r\n//~ rjf: Box Tree Building API\r\n\r\n//- rjf: spacers\r\ninternal UI_Signal         ui_spacer(UI_Size size);\r\n\r\n//- rjf: tooltips\r\ninternal void              ui_tooltip_begin_base(void);\r\ninternal void              ui_tooltip_end_base(void);\r\ninternal void              ui_tooltip_begin(void);\r\ninternal void              ui_tooltip_end(void);\r\n\r\n//- rjf: context menus\r\ninternal void              ui_ctx_menu_open(UI_Key key, UI_Key anchor_box_key, Vec2F32 anchor_off);\r\ninternal void              ui_ctx_menu_close(void);\r\ninternal B32               ui_begin_ctx_menu(UI_Key key);\r\ninternal void              ui_end_ctx_menu(void);\r\ninternal B32               ui_ctx_menu_is_open(UI_Key key);\r\ninternal B32               ui_any_ctx_menu_is_open(void);\r\n\r\n//- rjf: focus tree coloring\r\ninternal B32               ui_is_focus_hot(void);\r\ninternal B32               ui_is_focus_active(void);\r\n\r\n//- rjf: implicit auto-managed tree-based focus state\r\ninternal B32               ui_is_key_auto_focus_active(UI_Key key);\r\ninternal B32               ui_is_key_auto_focus_hot(UI_Key key);\r\ninternal void              ui_set_auto_focus_active_key(UI_Key key);\r\ninternal void              ui_set_auto_focus_hot_key(UI_Key key);\r\n\r\n//- rjf: current style tags key\r\ninternal UI_Key            ui_top_tags_key(void);\r\n\r\n//- rjf: theme color lookups\r\ninternal Vec4F32           ui_color_from_name(String8 name);\r\ninternal Vec4F32           ui_color_from_tags_key_extras(UI_Key key, String8Array extras);\r\ninternal Vec4F32           ui_color_from_tags_key_name(UI_Key key, String8 name);\r\n\r\n//- rjf: box node construction\r\ninternal UI_Box *          ui_build_box_from_key(UI_BoxFlags flags, UI_Key key);\r\ninternal UI_Key            ui_active_seed_key(void);\r\ninternal UI_Box *          ui_build_box_from_string(UI_BoxFlags flags, String8 string);\r\ninternal UI_Box *          ui_build_box_from_stringf(UI_BoxFlags flags, char *fmt, ...);\r\n\r\n//- rjf: box node equipment\r\ninternal inline void       ui_box_equip_display_string(UI_Box *box, String8 string);\r\ninternal inline void       ui_box_equip_display_fstrs(UI_Box *box, DR_FStrList *strings);\r\ninternal inline void       ui_box_equip_fuzzy_match_ranges(UI_Box *box, FuzzyMatchRangeList *matches);\r\ninternal inline void       ui_box_equip_draw_bucket(UI_Box *box, DR_Bucket *bucket);\r\ninternal inline void       ui_box_equip_custom_draw(UI_Box *box, UI_BoxCustomDrawFunctionType *custom_draw, void *user_data);\r\n\r\n//- rjf: box accessors / queries\r\ninternal String8           ui_box_display_string(UI_Box *box);\r\ninternal Vec2F32           ui_box_text_position(UI_Box *box);\r\ninternal U64               ui_box_char_pos_from_xy(UI_Box *box, Vec2F32 xy);\r\n\r\n////////////////////////////////\r\n//~ rjf: User Interaction\r\n\r\ninternal UI_Signal ui_signal_from_box(UI_Box *box);\r\n\r\n////////////////////////////////\r\n//~ rjf: Animation Cache Interaction API\r\n\r\nread_only global UI_AnimNode ui_nil_anim_node =\r\n{\r\n  &ui_nil_anim_node,\r\n  &ui_nil_anim_node,\r\n};\r\n\r\ninternal F32 ui_anim_(UI_Key key, UI_AnimParams *params);\r\n#define ui_anim(key, target_val, ...) ui_anim_((key), &(UI_AnimParams){.target = (target_val), .rate = (ui_state->default_animation_rate), __VA_ARGS__})\r\n\r\n////////////////////////////////\r\n//~ rjf: Stacks\r\n\r\ninternal void ui__push_tags_key_from_appended_string(String8 string);\r\ninternal void ui__pop_tags_key(void);\r\n\r\n//- rjf: base\r\ninternal UI_Box *                   ui_top_parent(void);\r\ninternal Axis2                      ui_top_child_layout_axis(void);\r\ninternal F32                        ui_top_fixed_x(void);\r\ninternal F32                        ui_top_fixed_y(void);\r\ninternal F32                        ui_top_fixed_width(void);\r\ninternal F32                        ui_top_fixed_height(void);\r\ninternal UI_Size                    ui_top_pref_width(void);\r\ninternal UI_Size                    ui_top_pref_height(void);\r\ninternal F32                        ui_top_min_width(void);\r\ninternal F32                        ui_top_min_height(void);\r\ninternal UI_PermissionFlags         ui_top_permission_flags(void);\r\ninternal UI_BoxFlags                ui_top_flags(void);\r\ninternal UI_BoxFlags                ui_top_omit_flags(void);\r\ninternal UI_FocusKind               ui_top_focus_hot(void);\r\ninternal UI_FocusKind               ui_top_focus_active(void);\r\ninternal U32                        ui_top_fastpath_codepoint(void);\r\ninternal UI_Key                     ui_top_group_key(void);\r\ninternal F32                        ui_top_transparency(void);\r\ninternal String8                    ui_top_tag(void);\r\ninternal Vec4F32                    ui_top_background_color(void);\r\ninternal Vec4F32                    ui_top_text_color(void);\r\ninternal Vec4F32                    ui_top_border_color(void);\r\ninternal F32                        ui_top_squish(void);\r\ninternal OS_Cursor                  ui_top_hover_cursor(void);\r\ninternal FNT_Tag                    ui_top_font(void);\r\ninternal F32                        ui_top_font_size(void);\r\ninternal FNT_RasterFlags            ui_top_text_raster_flags(void);\r\ninternal F32                        ui_top_tab_size(void);\r\ninternal F32                        ui_top_corner_radius_00(void);\r\ninternal F32                        ui_top_corner_radius_01(void);\r\ninternal F32                        ui_top_corner_radius_10(void);\r\ninternal F32                        ui_top_corner_radius_11(void);\r\ninternal F32                        ui_top_blur_size(void);\r\ninternal F32                        ui_top_text_padding(void);\r\ninternal UI_TextAlign               ui_top_text_alignment(void);\r\ninternal UI_Box *                   ui_bottom_parent(void);\r\ninternal Axis2                      ui_bottom_child_layout_axis(void);\r\ninternal F32                        ui_bottom_fixed_x(void);\r\ninternal F32                        ui_bottom_fixed_y(void);\r\ninternal F32                        ui_bottom_fixed_width(void);\r\ninternal F32                        ui_bottom_fixed_height(void);\r\ninternal UI_Size                    ui_bottom_pref_width(void);\r\ninternal UI_Size                    ui_bottom_pref_height(void);\r\ninternal F32                        ui_bottom_min_width(void);\r\ninternal F32                        ui_bottom_min_height(void);\r\ninternal UI_PermissionFlags         ui_bottom_permission_flags(void);\r\ninternal UI_BoxFlags                ui_bottom_flags(void);\r\ninternal UI_BoxFlags                ui_bottom_omit_flags(void);\r\ninternal UI_FocusKind               ui_bottom_focus_hot(void);\r\ninternal UI_FocusKind               ui_bottom_focus_active(void);\r\ninternal U32                        ui_bottom_fastpath_codepoint(void);\r\ninternal UI_Key                     ui_bottom_group_key(void);\r\ninternal F32                        ui_bottom_transparency(void);\r\ninternal String8                    ui_bottom_tag(void);\r\ninternal Vec4F32                    ui_bottom_background_color(void);\r\ninternal Vec4F32                    ui_bottom_text_color(void);\r\ninternal Vec4F32                    ui_bottom_border_color(void);\r\ninternal F32                        ui_bottom_squish(void);\r\ninternal OS_Cursor                  ui_bottom_hover_cursor(void);\r\ninternal FNT_Tag                    ui_bottom_font(void);\r\ninternal F32                        ui_bottom_font_size(void);\r\ninternal FNT_RasterFlags            ui_bottom_text_raster_flags(void);\r\ninternal F32                        ui_bottom_tab_size(void);\r\ninternal F32                        ui_bottom_corner_radius_00(void);\r\ninternal F32                        ui_bottom_corner_radius_01(void);\r\ninternal F32                        ui_bottom_corner_radius_10(void);\r\ninternal F32                        ui_bottom_corner_radius_11(void);\r\ninternal F32                        ui_bottom_blur_size(void);\r\ninternal F32                        ui_bottom_text_padding(void);\r\ninternal UI_TextAlign               ui_bottom_text_alignment(void);\r\ninternal UI_Box *                   ui_push_parent(UI_Box * v);\r\ninternal Axis2                      ui_push_child_layout_axis(Axis2 v);\r\ninternal F32                        ui_push_fixed_x(F32 v);\r\ninternal F32                        ui_push_fixed_y(F32 v);\r\ninternal F32                        ui_push_fixed_width(F32 v);\r\ninternal F32                        ui_push_fixed_height(F32 v);\r\ninternal UI_Size                    ui_push_pref_width(UI_Size v);\r\ninternal UI_Size                    ui_push_pref_height(UI_Size v);\r\ninternal F32                        ui_push_min_width(F32 v);\r\ninternal F32                        ui_push_min_height(F32 v);\r\ninternal UI_PermissionFlags         ui_push_permission_flags(UI_PermissionFlags v);\r\ninternal UI_BoxFlags                ui_push_flags(UI_BoxFlags v);\r\ninternal UI_BoxFlags                ui_push_omit_flags(UI_BoxFlags v);\r\ninternal UI_FocusKind               ui_push_focus_hot(UI_FocusKind v);\r\ninternal UI_FocusKind               ui_push_focus_active(UI_FocusKind v);\r\ninternal U32                        ui_push_fastpath_codepoint(U32 v);\r\ninternal UI_Key                     ui_push_group_key(UI_Key v);\r\ninternal F32                        ui_push_transparency(F32 v);\r\ninternal String8                    ui_push_tag(String8 v);\r\ninternal Vec4F32                    ui_push_background_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_push_text_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_push_border_color(Vec4F32 v);\r\ninternal F32                        ui_push_squish(F32 v);\r\ninternal OS_Cursor                  ui_push_hover_cursor(OS_Cursor v);\r\ninternal FNT_Tag                    ui_push_font(FNT_Tag v);\r\ninternal F32                        ui_push_font_size(F32 v);\r\ninternal FNT_RasterFlags            ui_push_text_raster_flags(FNT_RasterFlags v);\r\ninternal F32                        ui_push_tab_size(F32 v);\r\ninternal F32                        ui_push_corner_radius_00(F32 v);\r\ninternal F32                        ui_push_corner_radius_01(F32 v);\r\ninternal F32                        ui_push_corner_radius_10(F32 v);\r\ninternal F32                        ui_push_corner_radius_11(F32 v);\r\ninternal F32                        ui_push_blur_size(F32 v);\r\ninternal F32                        ui_push_text_padding(F32 v);\r\ninternal UI_TextAlign               ui_push_text_alignment(UI_TextAlign v);\r\ninternal UI_Box *                   ui_pop_parent(void);\r\ninternal Axis2                      ui_pop_child_layout_axis(void);\r\ninternal F32                        ui_pop_fixed_x(void);\r\ninternal F32                        ui_pop_fixed_y(void);\r\ninternal F32                        ui_pop_fixed_width(void);\r\ninternal F32                        ui_pop_fixed_height(void);\r\ninternal UI_Size                    ui_pop_pref_width(void);\r\ninternal UI_Size                    ui_pop_pref_height(void);\r\ninternal F32                        ui_pop_min_width(void);\r\ninternal F32                        ui_pop_min_height(void);\r\ninternal UI_PermissionFlags         ui_pop_permission_flags(void);\r\ninternal UI_BoxFlags                ui_pop_flags(void);\r\ninternal UI_BoxFlags                ui_pop_omit_flags(void);\r\ninternal UI_FocusKind               ui_pop_focus_hot(void);\r\ninternal UI_FocusKind               ui_pop_focus_active(void);\r\ninternal U32                        ui_pop_fastpath_codepoint(void);\r\ninternal UI_Key                     ui_pop_group_key(void);\r\ninternal F32                        ui_pop_transparency(void);\r\ninternal String8                    ui_pop_tag(void);\r\ninternal Vec4F32                    ui_pop_background_color(void);\r\ninternal Vec4F32                    ui_pop_text_color(void);\r\ninternal Vec4F32                    ui_pop_border_color(void);\r\ninternal F32                        ui_pop_squish(void);\r\ninternal OS_Cursor                  ui_pop_hover_cursor(void);\r\ninternal FNT_Tag                    ui_pop_font(void);\r\ninternal F32                        ui_pop_font_size(void);\r\ninternal FNT_RasterFlags            ui_pop_text_raster_flags(void);\r\ninternal F32                        ui_pop_tab_size(void);\r\ninternal F32                        ui_pop_corner_radius_00(void);\r\ninternal F32                        ui_pop_corner_radius_01(void);\r\ninternal F32                        ui_pop_corner_radius_10(void);\r\ninternal F32                        ui_pop_corner_radius_11(void);\r\ninternal F32                        ui_pop_blur_size(void);\r\ninternal F32                        ui_pop_text_padding(void);\r\ninternal UI_TextAlign               ui_pop_text_alignment(void);\r\ninternal UI_Box *                   ui_set_next_parent(UI_Box * v);\r\ninternal Axis2                      ui_set_next_child_layout_axis(Axis2 v);\r\ninternal F32                        ui_set_next_fixed_x(F32 v);\r\ninternal F32                        ui_set_next_fixed_y(F32 v);\r\ninternal F32                        ui_set_next_fixed_width(F32 v);\r\ninternal F32                        ui_set_next_fixed_height(F32 v);\r\ninternal UI_Size                    ui_set_next_pref_width(UI_Size v);\r\ninternal UI_Size                    ui_set_next_pref_height(UI_Size v);\r\ninternal F32                        ui_set_next_min_width(F32 v);\r\ninternal F32                        ui_set_next_min_height(F32 v);\r\ninternal UI_PermissionFlags         ui_set_next_permission_flags(UI_PermissionFlags v);\r\ninternal UI_BoxFlags                ui_set_next_flags(UI_BoxFlags v);\r\ninternal UI_BoxFlags                ui_set_next_omit_flags(UI_BoxFlags v);\r\ninternal UI_FocusKind               ui_set_next_focus_hot(UI_FocusKind v);\r\ninternal UI_FocusKind               ui_set_next_focus_active(UI_FocusKind v);\r\ninternal U32                        ui_set_next_fastpath_codepoint(U32 v);\r\ninternal UI_Key                     ui_set_next_group_key(UI_Key v);\r\ninternal F32                        ui_set_next_transparency(F32 v);\r\ninternal String8                    ui_set_next_tag(String8 v);\r\ninternal Vec4F32                    ui_set_next_background_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_set_next_text_color(Vec4F32 v);\r\ninternal Vec4F32                    ui_set_next_border_color(Vec4F32 v);\r\ninternal F32                        ui_set_next_squish(F32 v);\r\ninternal OS_Cursor                  ui_set_next_hover_cursor(OS_Cursor v);\r\ninternal FNT_Tag                    ui_set_next_font(FNT_Tag v);\r\ninternal F32                        ui_set_next_font_size(F32 v);\r\ninternal FNT_RasterFlags            ui_set_next_text_raster_flags(FNT_RasterFlags v);\r\ninternal F32                        ui_set_next_tab_size(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_00(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_01(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_10(F32 v);\r\ninternal F32                        ui_set_next_corner_radius_11(F32 v);\r\ninternal F32                        ui_set_next_blur_size(F32 v);\r\ninternal F32                        ui_set_next_text_padding(F32 v);\r\ninternal UI_TextAlign               ui_set_next_text_alignment(UI_TextAlign v);\r\n\r\n//- rjf: helpers\r\ninternal Rng2F32  ui_push_rect(Rng2F32 rect);\r\ninternal Rng2F32  ui_pop_rect(void);\r\ninternal void     ui_set_next_rect(Rng2F32 rect);\r\ninternal UI_Size  ui_push_pref_size(Axis2 axis, UI_Size v);\r\ninternal UI_Size  ui_pop_pref_size(Axis2 axis);\r\ninternal UI_Size  ui_set_next_pref_size(Axis2 axis, UI_Size v);\r\ninternal void     ui_push_corner_radius(F32 v);\r\ninternal void     ui_pop_corner_radius(void);\r\ninternal void     ui_push_tagf(char *fmt, ...);\r\ninternal F32      ui_top_px_height(void);\r\n\r\n////////////////////////////////\r\n//~ rjf: Macro Loop Wrappers\r\n\r\n//- rjf: stacks (base)\r\n#define UI_Parent(v) DeferLoop(ui_push_parent(v), ui_pop_parent())\r\n#define UI_ChildLayoutAxis(v) DeferLoop(ui_push_child_layout_axis(v), ui_pop_child_layout_axis())\r\n#define UI_FixedX(v) DeferLoop(ui_push_fixed_x(v), ui_pop_fixed_x())\r\n#define UI_FixedY(v) DeferLoop(ui_push_fixed_y(v), ui_pop_fixed_y())\r\n#define UI_FixedWidth(v) DeferLoop(ui_push_fixed_width(v), ui_pop_fixed_width())\r\n#define UI_FixedHeight(v) DeferLoop(ui_push_fixed_height(v), ui_pop_fixed_height())\r\n#define UI_PrefWidth(v) DeferLoop(ui_push_pref_width(v), ui_pop_pref_width())\r\n#define UI_PrefHeight(v) DeferLoop(ui_push_pref_height(v), ui_pop_pref_height())\r\n#define UI_MinWidth(v) DeferLoop(ui_push_min_width(v), ui_pop_min_width())\r\n#define UI_MinHeight(v) DeferLoop(ui_push_min_height(v), ui_pop_min_height())\r\n#define UI_PermissionFlags(v) DeferLoop(ui_push_permission_flags(v), ui_pop_permission_flags())\r\n#define UI_Flags(v) DeferLoop(ui_push_flags(v), ui_pop_flags())\r\n#define UI_OmitFlags(v) DeferLoop(ui_push_omit_flags(v), ui_pop_omit_flags())\r\n#define UI_FocusHot(v) DeferLoop(ui_push_focus_hot(v), ui_pop_focus_hot())\r\n#define UI_FocusActive(v) DeferLoop(ui_push_focus_active(v), ui_pop_focus_active())\r\n#define UI_FastpathCodepoint(v) DeferLoop(ui_push_fastpath_codepoint(v), ui_pop_fastpath_codepoint())\r\n#define UI_GroupKey(v) DeferLoop(ui_push_group_key(v), ui_pop_group_key())\r\n#define UI_Transparency(v) DeferLoop(ui_push_transparency(v), ui_pop_transparency())\r\n#define UI_Tag(v) DeferLoop(ui_push_tag(v), ui_pop_tag())\r\n#define UI_BackgroundColor(v) DeferLoop(ui_push_background_color(v), ui_pop_background_color())\r\n#define UI_TextColor(v) DeferLoop(ui_push_text_color(v), ui_pop_text_color())\r\n#define UI_Squish(v) DeferLoop(ui_push_squish(v), ui_pop_squish())\r\n#define UI_HoverCursor(v) DeferLoop(ui_push_hover_cursor(v), ui_pop_hover_cursor())\r\n#define UI_Font(v) DeferLoop(ui_push_font(v), ui_pop_font())\r\n#define UI_FontSize(v) DeferLoop(ui_push_font_size(v), ui_pop_font_size())\r\n#define UI_TextRasterFlags(v) DeferLoop(ui_push_text_raster_flags(v), ui_pop_text_raster_flags())\r\n#define UI_TabSize(v) DeferLoop(ui_push_tab_size(v), ui_pop_tab_size())\r\n#define UI_CornerRadius00(v) DeferLoop(ui_push_corner_radius_00(v), ui_pop_corner_radius_00())\r\n#define UI_CornerRadius01(v) DeferLoop(ui_push_corner_radius_01(v), ui_pop_corner_radius_01())\r\n#define UI_CornerRadius10(v) DeferLoop(ui_push_corner_radius_10(v), ui_pop_corner_radius_10())\r\n#define UI_CornerRadius11(v) DeferLoop(ui_push_corner_radius_11(v), ui_pop_corner_radius_11())\r\n#define UI_BlurSize(v) DeferLoop(ui_push_blur_size(v), ui_pop_blur_size())\r\n#define UI_TextPadding(v) DeferLoop(ui_push_text_padding(v), ui_pop_text_padding())\r\n#define UI_TextAlignment(v) DeferLoop(ui_push_text_alignment(v), ui_pop_text_alignment())\r\n\r\n//- rjf: stacks (compositions)\r\n#define UI_FixedPos(v)       DeferLoop((ui_push_fixed_x((v).x), ui_push_fixed_y((v).y)), (ui_pop_fixed_x(), ui_pop_fixed_y()))\r\n#define UI_FixedSize(v)      DeferLoop((ui_push_fixed_width((v).x), ui_push_fixed_height((v).y)), (ui_pop_fixed_width(), ui_pop_fixed_height()))\r\n#define UI_WidthFill         UI_PrefWidth(ui_pct(1.f, 0.f))\r\n#define UI_HeightFill        UI_PrefHeight(ui_pct(1.f, 0.f))\r\n#define UI_Rect(r)           DeferLoop(ui_push_rect(r), ui_pop_rect())\r\n#define UI_PrefSize(axis, v) DeferLoop(ui_push_pref_size((axis), (v)), ui_pop_pref_size(axis))\r\n#define UI_CornerRadius(v)   DeferLoop(ui_push_corner_radius(v), ui_pop_corner_radius())\r\n#define UI_Focus(kind)       DeferLoop((ui_push_focus_hot(kind), ui_push_focus_active(kind)), (ui_pop_focus_hot(), ui_pop_focus_active()))\r\n#define UI_FlagsAdd(v)       DeferLoop(ui_push_flags(ui_top_flags()|(v)), ui_pop_flags())\r\n#define UI_TagF(...)         DeferLoop(ui_push_tagf(__VA_ARGS__), ui_pop_tag())\r\n\r\n//- rjf: tooltip\r\n#define UI_TooltipBase DeferLoop(ui_tooltip_begin_base(), ui_tooltip_end_base())\r\n#define UI_Tooltip DeferLoop(ui_tooltip_begin(), ui_tooltip_end())\r\n\r\n//- rjf: context menu\r\n#define UI_CtxMenu(key) DeferLoopChecked(ui_begin_ctx_menu(key), ui_end_ctx_menu())\r\n\r\n//- rjf: debug\r\n#define UI_Debug UI_FlagsAdd(UI_BoxFlag_Debug)\r\n\r\n#endif // UI_H\r\n"
  },
  {
    "path": "src/ui/ui_inc.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#undef LAYER_COLOR\r\n#define LAYER_COLOR 0xb5438dff\r\n\r\n#include \"ui_core.c\"\r\n#include \"ui_basic_widgets.c\"\r\n"
  },
  {
    "path": "src/ui/ui_inc.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef UI_INC_H\r\n#define UI_INC_H\r\n\r\n#include \"ui_core.h\"\r\n#include \"ui_basic_widgets.h\"\r\n\r\n#endif // UI_INC_H\r\n"
  },
  {
    "path": "src/x64/x64.c",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\ninternal void\r\nx64_cpuid(U32 leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx)\r\n{\r\n  U32 info[4] = {0};\r\n#if COMPILER_MSVC\r\n  __cpuid(info, leaf);\r\n  if (eax) { *eax = info[0]; }\r\n  if (ebx) { *ebx = info[1]; }\r\n  if (ecx) { *ecx = info[2]; }\r\n  if (edx) { *edx = info[3]; }\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n  if (!eax) { eax = &info[0]; }\r\n  if (!ebx) { ebx = &info[1]; }\r\n  if (!ecx) { ecx = &info[2]; }\r\n  if (!edx) { edx = &info[3]; }\r\n  __get_cpuid(leaf, eax, ebx, ecx, edx);\r\n#else\r\n# error \"cpuid is not defined for this compiler\"\r\n#endif\r\n}\r\n\r\ninternal void\r\nx64_cpuid_ex(U32 leaf, U32 sub_leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx)\r\n{\r\n  U32 info[4];\r\n#if COMPILER_MSVC\r\n  __cpuidex(info, leaf, sub_leaf);\r\n  if (eax) { *eax = info[0]; }\r\n  if (ebx) { *ebx = info[1]; }\r\n  if (ecx) { *ecx = info[2]; }\r\n  if (edx) { *edx = info[3]; }\r\n#elif COMPILER_CLANG || COMPILER_GCC\r\n  if (!eax) { eax = &info[0]; }\r\n  if (!ebx) { ebx = &info[1]; }\r\n  if (!ecx) { ecx = &info[2]; }\r\n  if (!edx) { edx = &info[3]; }\r\n  __get_cpuid_count(leaf, sub_leaf, eax, ebx, ecx, edx);\r\n#else\r\n# error \"cpuid_count is not defined for this compiler\"\r\n#endif\r\n}\r\n\r\ninternal B32\r\nx64_is_xsave_supported(void)\r\n{\r\n  U32 ecx = 0;\r\n  x64_cpuid(1, 0, 0, &ecx, 0);\r\n  return !!(ecx & (1 << 26));\r\n}\r\n\r\ninternal U32\r\nx64_get_xsave_size(void)\r\n{\r\n  U32 xsave_size = 0;\r\n  x64_cpuid_ex(0xd, 0, 0, &xsave_size, 0, 0);\r\n  return xsave_size;\r\n}\r\n\r\ninternal U16\r\nx64_xsave_tag_word_from_real_tag_word(U16 ftw)\r\n{\r\n  U16 compact = 0;\r\n  for EachIndex(fpr, 8) {\r\n    U32 tag = (ftw >> (fpr * 2)) & 3;\r\n    if (tag != 3) {\r\n      compact |= (1 << fpr);\r\n    }\r\n  }\r\n  return compact;\r\n}\r\n\r\ninternal U32\r\nx64_xsave_offset_from_feature_flag(U64 xcr0, X64_XStateComponentIdx comp_idx)\r\n{\r\n  U32 offset = 0;\r\n  if (xcr0 & (1 << comp_idx)) {\r\n    if(comp_idx == X64_XStateComponentIdx_FP) {\r\n      offset = 0;\r\n    } else if(comp_idx == X64_XStateComponentIdx_SSE) {\r\n      offset = 160;\r\n    } else {\r\n      x64_cpuid_ex(0xd, comp_idx, 0, &offset, 0, 0);\r\n    }\r\n  }\r\n  return offset;\r\n}\r\n\r\ninternal X64_XSaveLayout\r\nx64_get_xsave_layout(U64 xcr0)\r\n{\r\n  X64_XSaveLayout xsave_layout = {0};\r\n  xsave_layout.x87_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_FP);\r\n  xsave_layout.sse_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_SSE);\r\n  xsave_layout.avx_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_AVX);\r\n  xsave_layout.bndregs_offset   = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_BNDREGS);\r\n  xsave_layout.bndcfg_offset    = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_BNDCSR);\r\n  xsave_layout.opmask_offset    = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_OPMASK);\r\n  xsave_layout.zmm_h_offset     = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_ZMM_H);\r\n  xsave_layout.zmm_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_ZMM);\r\n  xsave_layout.pt_offset        = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_PT);\r\n  xsave_layout.pkru_offset      = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_PKRU);\r\n  xsave_layout.pasid_offset     = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_PASID);\r\n  xsave_layout.cet_u_offset     = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_CETU);\r\n  xsave_layout.cet_s_offset     = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_CETS);\r\n  xsave_layout.hdc_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_HDC);\r\n  xsave_layout.uintr_offset     = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_UINTR);\r\n  xsave_layout.lbr_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_LBR);\r\n  xsave_layout.hwp_offset       = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_HWP);\r\n  xsave_layout.tile_cfg_offset  = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_TILECFG);\r\n  xsave_layout.tile_data_offset = x64_xsave_offset_from_feature_flag(xcr0, X64_XStateComponentIdx_TILEDATA);\r\n  return xsave_layout;\r\n}\r\n\r\ninternal void\r\nx64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointType bp_type, X64_DebugBreakType break_type)\r\n{\r\n  // set breakpoint address\r\n  switch (trap_idx) {\r\n  case 0: { drs[0] = addr; } break;\r\n  case 1: { drs[1] = addr; } break;\r\n  case 2: { drs[2] = addr; } break;\r\n  case 3: { drs[3] = addr; } break;\r\n  default: { InvalidPath; } break;\r\n  }\r\n\r\n  // enable breakpoint\r\n  drs[7] &= ~(3 << (trap_idx * 2));\r\n  switch (bp_type)\r\n  {\r\n  case X64_BreakpointType_Null: break;\r\n  case X64_BreakpointType_Local:  { drs[7] |= 1 << (trap_idx * 2); } break;\r\n  case X64_BreakpointType_Global: { drs[7] |= 2 << (trap_idx * 2); } break;\r\n  default: { InvalidPath; } break;\r\n  }\r\n\r\n  // set break access type\r\n  switch (break_type) {\r\n  case X64_DebugBreakType_Exec:\r\n    Assert(size == 0);\r\n  case X64_DebugBreakType_Null: {\r\n    drs[7] &= ~((1u << 16) << (trap_idx * 4));\r\n    drs[7] &= ~((1u << 17) << (trap_idx * 4));\r\n  } break;\r\n  case X64_DebugBreakType_Write: {\r\n    drs[7] |=   (1u << 16) << (trap_idx * 4);\r\n    drs[7] &= ~((1u << 17) << (trap_idx * 4));\r\n  } break;\r\n  case X64_DebugBreakType_ReadWriteIO: {\r\n    drs[7] &= ~((1u << 16) << (trap_idx * 4));\r\n    drs[7] |=   (1u << 17) << (trap_idx * 4);\r\n  } break;\r\n  case X64_DebugBreakType_ReadWriteNoFetch: {\r\n    drs[7] |= (1u << 16) << (trap_idx * 4);\r\n    drs[7] |= (1u << 17) << (trap_idx * 4);\r\n  } break;\r\n  default: { InvalidPath; } break;\r\n  }\r\n\r\n  // set breakpoint size\r\n  switch (size) {\r\n  case 0:\r\n  case 1: {\r\n    drs[7] &= ~((1u << 18) << (trap_idx * 4));\r\n    drs[7] &= ~((1u << 19) << (trap_idx * 4));\r\n  } break;\r\n  case 2: {\r\n    drs[7] |=   (1 << 18) << (trap_idx * 4);\r\n    drs[7] &= ~((1 << 19) << (trap_idx * 4));\r\n  } break;\r\n  case 4: {\r\n    drs[7] |= (1 << 18) << (trap_idx * 4);\r\n    drs[7] |= (1 << 19) << (trap_idx * 4);\r\n  } break;\r\n  case 8: {\r\n    drs[7] &= ~((1 << 18) << (trap_idx * 4));\r\n    drs[7] |=   (1 << 19) << (trap_idx * 4);\r\n  } break;\r\n  default: { InvalidPath; }\r\n  }\r\n}\r\n\r\n"
  },
  {
    "path": "src/x64/x64.h",
    "content": "// Copyright (c) Epic Games Tools\r\n// Licensed under the MIT license (https://opensource.org/license/mit/)\r\n\r\n#ifndef X64_H\r\n#define X64_H\r\n\r\n////////////////////////////////\r\n//~ RFlags\r\n\r\ntypedef U64 X64_RFlags;\r\nenum\r\n{\r\n  X64_RFlag_Carry       = (1 << 0),\r\n  X64_RFlag_Parity      = (1 << 2),\r\n  X64_RFlag_AuxCarry    = (1 << 4),\r\n  X64_RFlag_Zero        = (1 << 6),\r\n  X64_RFlag_Sign        = (1 << 7),\r\n  X64_RFlag_Trap        = (1 << 8),\r\n  X64_RFlag_Interrupt   = (1 << 9),\r\n  X64_RFlag_Direction   = (1 << 10),\r\n  X64_RFlag_Overflow    = (1 << 11),\r\n  X64_RFlag_IoPrivilege = (3 << 12),\r\n  X64_RFlag_NT          = (1 << 14),\r\n  X64_RFlag_MD          = (1 << 15),\r\n  X64_RFlag_RF          = (1 << 16),\r\n  X64_RFlag_VM          = (1 << 17),\r\n  X64_RFlag_AC          = (1 << 18),\r\n  X64_RFlag_VIF         = (1 << 19),\r\n  X64_RFlag_VIP         = (1 << 20),\r\n  X64_RFlag_AES         = (1 << 30),\r\n  X64_RFlag_AI          = (1 << 31),\r\n};\r\n\r\n////////////////////////////////\r\n//~ fxsave/xsave\r\n\r\ntypedef struct AlignType(16) X64_FXSave\r\n{\r\n  U16 fcw;\r\n  U16 fsw;\r\n  U16 ftw;\r\n  U16 fop;\r\n  union {\r\n    struct {\r\n      U64 fip;\r\n      U64 fdp;\r\n    } b64;\r\n    struct {\r\n      U32 fip;\r\n      U16 fcs, _pad0;\r\n      U32 fdp;\r\n      U16 fds, _pad1;\r\n    } b32;\r\n  };\r\n  U32  mxcsr;\r\n  U32  mxcsr_mask;\r\n  U128 st_space[8];\r\n  U128 xmm_space[16];\r\n  U8   padding[96];\r\n} X64_FXSave;\r\nStaticAssert(sizeof(X64_FXSave) == 512, g_x64_xsave_legacy_size_check);\r\n\r\ntypedef struct X64_XSaveHeader\r\n{\r\n  U64 xstate_bv;\r\n  U64 xcomp_bv;\r\n  U8  reserved[48];\r\n} X64_XSaveHeader;\r\nStaticAssert(sizeof(X64_XSaveHeader) == 64, g_x64_xsave_header_size_check);\r\n\r\ntypedef struct AlignType(64) X64_XSave\r\n{\r\n  X64_FXSave      fxsave;\r\n  X64_XSaveHeader header;\r\n  // U8 ext_area[0];\r\n} X64_XSave;\r\nStaticAssert(sizeof(X64_XSave) == 576, g_x64_xsave_size_check);\r\n\r\ntypedef U32 X64_XStateComponentIdx;\r\nenum\r\n{\r\n  X64_XStateComponentIdx_FP       = 0,\r\n  X64_XStateComponentIdx_SSE      = 1,\r\n  X64_XStateComponentIdx_AVX      = 2,\r\n  X64_XStateComponentIdx_BNDREGS  = 3,\r\n  X64_XStateComponentIdx_BNDCSR   = 4,\r\n  X64_XStateComponentIdx_OPMASK   = 5,\r\n  X64_XStateComponentIdx_ZMM_H    = 6,\r\n  X64_XStateComponentIdx_ZMM      = 7,\r\n  X64_XStateComponentIdx_PT       = 8,\r\n  X64_XStateComponentIdx_PKRU     = 9,\r\n  X64_XStateComponentIdx_PASID    = 10,\r\n  X64_XStateComponentIdx_CETU     = 11,\r\n  X64_XStateComponentIdx_CETS     = 12,\r\n  X64_XStateComponentIdx_HDC      = 13,\r\n  X64_XStateComponentIdx_UINTR    = 14,\r\n  X64_XStateComponentIdx_LBR      = 15,\r\n  X64_XStateComponentIdx_HWP      = 16,\r\n  X64_XStateComponentIdx_TILECFG  = 17,\r\n  X64_XStateComponentIdx_TILEDATA = 18,\r\n};\r\n\r\nenum\r\n{\r\n  X64_XStateComponentFlag_FP       = (1 << X64_XStateComponentIdx_FP),\r\n  X64_XStateComponentFlag_SSE      = (1 << X64_XStateComponentIdx_SSE),\r\n  X64_XStateComponentFlag_AVX      = (1 << X64_XStateComponentIdx_AVX),\r\n  X64_XStateComponentFlag_BNDREGS  = (1 << X64_XStateComponentIdx_BNDREGS),\r\n  X64_XStateComponentFlag_BNDCSR   = (1 << X64_XStateComponentIdx_BNDCSR),\r\n  X64_XStateComponentFlag_OPMASK   = (1 << X64_XStateComponentIdx_OPMASK),\r\n  X64_XStateComponentFlag_ZMM_H    = (1 << X64_XStateComponentIdx_ZMM_H),\r\n  X64_XStateComponentFlag_ZMM      = (1 << X64_XStateComponentIdx_ZMM),\r\n  X64_XStateComponentFlag_PT       = (1 << X64_XStateComponentIdx_PT),\r\n  X64_XStateComponentFlag_PKRU     = (1 << X64_XStateComponentIdx_PKRU),\r\n  X64_XStateComponentFlag_PASID    = (1 << X64_XStateComponentIdx_PASID),\r\n  X64_XStateComponentFlag_CETU     = (1 << X64_XStateComponentIdx_CETU),\r\n  X64_XStateComponentFlag_CETS     = (1 << X64_XStateComponentIdx_CETS),\r\n  X64_XStateComponentFlag_HDC      = (1 << X64_XStateComponentIdx_HDC),\r\n  X64_XStateComponentFlag_UINTR    = (1 << X64_XStateComponentIdx_UINTR),\r\n  X64_XStateComponentFlag_LBR      = (1 << X64_XStateComponentIdx_LBR),\r\n  X64_XStateComponentFlag_HWP      = (1 << X64_XStateComponentIdx_HWP),\r\n  X64_XStateComponentFlag_TILECFG  = (1 << X64_XStateComponentIdx_TILECFG),\r\n  X64_XStateComponentFlag_TILEDATA = (1 << X64_XStateComponentIdx_TILEDATA),\r\n};\r\n\r\ntypedef struct\r\n{\r\n  U64 x87_offset;\r\n  U64 sse_offset;\r\n  U64 avx_offset;\r\n  U64 bndregs_offset;\r\n  U64 bndcfg_offset;\r\n  U64 opmask_offset;\r\n  U64 zmm_h_offset;\r\n  U64 zmm_offset;\r\n  U64 pt_offset;\r\n  U64 pkru_offset;\r\n  U64 pasid_offset;\r\n  U64 cet_u_offset;\r\n  U64 cet_s_offset;\r\n  U64 hdc_offset;\r\n  U64 uintr_offset;\r\n  U64 lbr_offset;\r\n  U64 hwp_offset;\r\n  U64 tile_cfg_offset;\r\n  U64 tile_data_offset;\r\n} X64_XSaveLayout;\r\n\r\n////////////////////////////////\r\n//~ Debug Status Register\r\n\r\ntypedef enum\r\n{\r\n  X64_DebugStatusFlag_B0                  = (1 << 0),\r\n  X64_DebugStatusFlag_B1                  = (1 << 1),\r\n  X64_DebugStatusFlag_B2                  = (1 << 2),\r\n  X64_DebugStatusFlag_B3                  = (1 << 3),\r\n  X64_DebugStatusFlag_BusLock             = (1 << 11),\r\n  X64_DebugStatusFlag_DebugRegisterAccess = (1 << 13),\r\n  X64_DebugStatusFlag_SingleStep          = (1 << 14),\r\n  X64_DebugStatusFlag_TaskSwitch          = (1 << 15),\r\n  X64_DebugStatusFlag_RTM                 = (1 << 16),\r\n} X64_DebugStatusFlags;\r\n\r\n////////////////////////////////\r\n//~ Debug Control Register\r\n\r\ntypedef enum X64_BreakpointType {\r\n  X64_BreakpointType_Null,\r\n  X64_BreakpointType_Local,\r\n  X64_BreakpointType_Global,\r\n} X64_BreakpointType;\r\n\r\ntypedef enum X64_DebugBreakType\r\n{\r\n  X64_DebugBreakType_Null,\r\n  X64_DebugBreakType_Exec,\r\n  X64_DebugBreakType_Write,\r\n  X64_DebugBreakType_ReadWriteIO,\r\n  X64_DebugBreakType_ReadWriteNoFetch,\r\n} X64_DebugBreakType;\r\n\r\ntypedef enum X64_DebugControlFlags\r\n{\r\n  X64_DebugControlFlag_L0 = (1 << 0),\r\n  X64_DebugControlFlag_L1 = (1 << 2),\r\n  X64_DebugControlFlag_L2 = (1 << 4),\r\n  X64_DebugControlFlag_L3 = (1 << 6),\r\n\r\n  X64_DebugControlFlag_G0 = (1 << 1),\r\n  X64_DebugControlFlag_G1 = (1 << 3),\r\n  X64_DebugControlFlag_G3 = (1 << 5),\r\n  X64_DebugControlFlag_G4 = (1 << 7),\r\n\r\n  X64_DebugControlFlag_LE = (1 << 8),\r\n  X64_DebugControlFlag_GE = (1 << 9),\r\n\r\n  X64_DebugControlFlag_RTM = (1 << 11),\r\n\r\n  X64_DebugControlFlag_GD = (1 << 13),\r\n\r\n  X64_DebugControlFlag_RW0 = (3 << 16),\r\n  X64_DebugControlFlag_RW1 = (3 << 20),\r\n  X64_DebugControlFlag_RW2 = (3 << 24),\r\n  X64_DebugControlFlag_FW3 = (3 << 26),\r\n\r\n  X64_DebugControlFlag_LEN0 = (3 << 18),\r\n  X64_DebugControlFlag_LEN1 = (3 << 22),\r\n  X64_DebugControlFlag_LEN2 = (3 << 26),\r\n  X64_DebugControlFlag_LEN3 = (3 << 30),\r\n} X64_DebugControlFlags;\r\n\r\n////////////////////////////////\r\n//~ cpuid\r\n\r\ninternal void x64_cpuid(U32 leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);\r\ninternal void x64_cpuid_ex(U32 leaf, U32 sub_leaf, U32 *eax, U32 *ebx, U32 *ecx, U32 *edx);\r\n\r\n////////////////////////////////\r\n//~ fxsave/xsave\r\n\r\ninternal B32 x64_is_xsave_supported(void);\r\ninternal U32 x64_get_xsave_size(void);\r\ninternal U16 x64_xsave_tag_word_from_real_tag_word(U16 ftw);\r\ninternal U32 x64_xsave_offset_from_feature_flag(U64 xcr0, X64_XStateComponentIdx comp_idx);\r\ninternal X64_XSaveLayout x64_get_xsave_layout(U64 xcr0);\r\n\r\n////////////////////////////////\r\n//~ Debug Control Register\r\n\r\ninternal void x64_set_debug_break(U64 *drs, U64 trap_idx, U64 addr, U64 size, X64_BreakpointType bp_type, X64_DebugBreakType break_type);\r\n\r\n#endif // BASE_X64_H\r\n\r\n"
  }
]